From 6ebbc856d16823d7a27fd22c00e1fb1801be64a4 Mon Sep 17 00:00:00 2001 From: RISCi_ATOM Date: Thu, 28 Dec 2023 13:16:39 -0500 Subject: [PATCH] librecmc: Refresh libreCMC 6.x branch libreCMC v6.0 is now based upon upstream's 23.05 branch, with an epoch @ : 6264d12ed8e4beef6e3707837cb95f0e0d9e4e92 --- .gitignore | 16 +- Makefile | 6 +- README.md | 27 + config/Config-build.in | 36 +- config/Config-devel.in | 24 +- config/Config-images.in | 27 +- config/Config-kernel.in | 152 +- docs/Basic_Wireless_Settings.md | 96 + docs/Ben_Nanonote.md | 263 + docs/Bridge_Mode.md | 101 + docs/FAQ.md | 84 + docs/Flavors.md | 24 + docs/GL-AR300M.md | 46 + docs/How To Submit A Change To This Wiki.md | 61 + docs/How_To_Build_libreCMC.md | 83 + docs/Image_Support.md | 15 + docs/LICENSE.md | 430 + docs/List_of_Tested_Hardware.md | 22 + docs/OpenVPN_Layer_2_Server.md | 103 + docs/Port_Forwards.md | 84 + docs/README.md | 27 + docs/Router_Reset_Instructions.md | 53 + docs/Serial.md | 104 + docs/Soft_Brick_Recovery_With_IPv6.md | 32 + docs/Supported_Hardware.md | 49 + docs/System_Log.md | 67 + docs/TL_MR3020.md | 42 + docs/TL_WR1043ND.md | 120 + docs/TL_WR741ND.md | 37 + docs/TL_WR841ND.md | 61 + docs/TL_WR842ND.md | 41 + docs/TPE_NWIFIROUTER2.md | 48 + docs/TPE_R1100.md | 47 + docs/TPE_R1200.md | 59 + docs/WNDR3800.md | 39 + docs/WZR_HP_G300NH.md | 13 + docs/Welcome.md | 71 + docs/ccs.md | 42 + docs/embedded.md | 15 + .../librecmc-changing-admin-password.png | Bin 0 -> 46809 bytes docs/images/librecmc-changing-essid.png | Bin 0 -> 45366 bytes .../librecmc-changing-wifi-password.png | Bin 0 -> 47976 bytes docs/images/librecmc-default-interfaces.png | Bin 0 -> 64149 bytes docs/images/librecmc-default-login.png | Bin 0 -> 32206 bytes .../librecmc-dhcp-server-ignore-lan.png | Bin 0 -> 56874 bytes docs/images/librecmc-eth0-added-to-lan.png | Bin 0 -> 61140 bytes .../librecmc-luci-selecting-system-log.png | Bin 0 -> 36879 bytes docs/images/librecmc-luci-system-log.png | Bin 0 -> 120550 bytes ...ibrecmc-port-forwards-after-save-apply.png | Bin 0 -> 44303 bytes ...ecmc-port-forwards-entering-parameters.png | Bin 0 -> 39110 bytes .../librecmc-selecting-firewall-menu.png | Bin 0 -> 51259 bytes .../librecmc-selecting-port-forwards-tab.png | Bin 0 -> 40346 bytes docs/images/librecmc-switch-lan-to-dhcp.png | Bin 0 -> 47512 bytes docs/images/serial.png | Bin 0 -> 4355057 bytes {package/luci/docs => docs/luci-docs}/CBI.md | 0 .../docs => docs/luci-docs}/JsonRpcHowTo.md | 0 {package/luci/docs => docs/luci-docs}/LAR.md | 0 {package/luci/docs => docs/luci-docs}/LMO.md | 0 .../luci/docs => docs/luci-docs}/LuCI-0.10.md | 0 .../luci/docs => docs/luci-docs}/Modules.md | 0 .../docs => docs/luci-docs}/ModulesHowTo.md | 0 .../luci/docs => docs/luci-docs}/README.md | 0 .../luci/docs => docs/luci-docs}/Templates.md | 0 .../docs => docs/luci-docs}/ThemesHowTo.md | 0 .../docs => docs/luci-docs}/api/index.html | 0 .../docs => docs/luci-docs}/api/luadoc.css | 0 .../api/modules/luci.dispatcher.html | 0 .../api/modules/luci.http.conditionals.html | 0 .../api/modules/luci.http.date.html | 0 .../luci-docs}/api/modules/luci.http.html | 0 .../api/modules/luci.http.mime.html | 0 .../luci-docs}/api/modules/luci.i18n.html | 0 .../luci-docs}/api/modules/luci.ip.cidr.html | 0 .../luci-docs}/api/modules/luci.ip.html | 0 .../luci-docs}/api/modules/luci.json.html | 0 .../luci-docs}/api/modules/luci.jsonc.html | 0 .../api/modules/luci.jsonc.parser.html | 0 .../api/modules/luci.model.ipkg.html | 0 .../api/modules/luci.model.uci.html | 0 .../luci-docs}/api/modules/luci.rpcc.html | 0 .../api/modules/luci.rpcc.ruci.html | 0 .../luci-docs}/api/modules/luci.sys.html | 0 .../luci-docs}/api/modules/luci.sys.init.html | 0 .../api/modules/luci.sys.iptparser.html | 0 .../luci-docs}/api/modules/luci.sys.net.html | 0 .../api/modules/luci.sys.process.html | 0 .../luci-docs}/api/modules/luci.sys.user.html | 0 .../luci-docs}/api/modules/luci.sys.wifi.html | 0 .../luci-docs}/api/modules/luci.util.html | 0 .../luci-docs}/api/modules/luci.xml.html | 0 .../api/modules/nixio.CHANGELOG.html | 0 .../api/modules/nixio.CryptoHash.html | 0 .../luci-docs}/api/modules/nixio.File.html | 0 .../luci-docs}/api/modules/nixio.README.html | 0 .../luci-docs}/api/modules/nixio.Socket.html | 0 .../api/modules/nixio.TLSContext.html | 0 .../api/modules/nixio.TLSSocket.html | 0 .../api/modules/nixio.UnifiedIO.html | 0 .../luci-docs}/api/modules/nixio.bin.html | 0 .../luci-docs}/api/modules/nixio.bit.html | 0 .../luci-docs}/api/modules/nixio.crypto.html | 0 .../luci-docs}/api/modules/nixio.fs.html | 0 .../luci-docs}/api/modules/nixio.html | 0 {package/luci/docs => docs/luci-docs}/i18n.md | 0 docs/luci-docs/jsapi/README.md | 5 + docs/old/Save_WiFi.md | 24 + docs/testing.md | 12 + docs/unbrick_with_uboot_mod.md | 26 + feeds.conf.default | 2 +- include/autotools.mk | 20 +- include/bpf.mk | 4 +- include/depends.mk | 2 +- include/download.mk | 6 +- include/host-build.mk | 15 +- include/image-commands.mk | 53 +- include/image.mk | 125 +- include/kernel-5.10 | 3 - include/kernel-5.15 | 2 + include/kernel-build.mk | 1 - include/kernel-defaults.mk | 23 +- include/kernel-version.mk | 9 + include/kernel.mk | 19 +- include/netfilter.mk | 14 +- include/nls.mk | 31 +- include/openssl-module.mk | 79 + include/package-defaults.mk | 3 +- include/package-dumpinfo.mk | 2 + include/package.mk | 34 +- include/prereq-build.mk | 69 +- include/prereq.mk | 33 +- include/scan.mk | 6 +- include/site/riscv64 | 30 + include/target.mk | 9 + include/toolchain-build.mk | 2 +- include/toplevel.mk | 16 +- include/trusted-firmware-a.mk | 8 +- include/u-boot.mk | 3 + include/unpack.mk | 4 +- package/Makefile | 8 + package/base-files/Makefile | 15 +- package/base-files/files/bin/config_generate | 9 + package/base-files/files/bin/ipcalc.sh | 49 +- package/base-files/files/etc/init.d/led | 6 +- .../base-files/files/etc/init.d/sysfixtime | 22 +- package/base-files/files/etc/os-release | 1 - .../files/etc/sysctl.d/10-default.conf | 1 + .../base-files/files/lib/functions/network.sh | 14 + .../base-files/files/lib/functions/system.sh | 58 +- .../files/lib/functions/uci-defaults.sh | 27 +- .../files/lib/preinit/10_indicate_preinit | 41 + .../files/lib/preinit/30_failsafe_wait | 60 +- .../files/lib/preinit/99_10_failsafe_login | 15 +- .../base-files/files/lib/upgrade/common.sh | 33 +- package/base-files/files/lib/upgrade/emmc.sh | 2 +- package/base-files/files/lib/upgrade/nand.sh | 500 +- package/base-files/files/lib/upgrade/stage2 | 6 +- package/base-files/files/sbin/wifi | 27 +- package/base-files/image-config.in | 9 +- .../arm-trusted-firmware-rockchip/Makefile | 51 +- .../boot/arm-trusted-firmware-sunxi/Makefile | 52 +- package/boot/grub2/Makefile | 49 +- package/boot/grub2/files/grub-early-gpt.cfg | 2 + package/boot/kexec-tools/Makefile | 45 +- ...magic-4-bytes-of-appended-DTB-in-zIm.patch | 52 - package/boot/uboot-envtools/Makefile | 6 +- package/boot/uboot-envtools/files/apm821xx | 27 - package/boot/uboot-envtools/files/ath79 | 58 +- package/boot/uboot-envtools/files/cns3xxx | 26 - .../boot/uboot-envtools/files/imx_cortexa9 | 64 - package/boot/uboot-envtools/files/ipq40xx | 72 - package/boot/uboot-envtools/files/ipq806x | 61 - package/boot/uboot-envtools/files/kirkwood | 38 - package/boot/uboot-envtools/files/lantiq | 37 - package/boot/uboot-envtools/files/layerscape | 24 - .../uboot-envtools/files/mediatek_filogic | 96 + .../boot/uboot-envtools/files/mediatek_mt7622 | 8 +- .../boot/uboot-envtools/files/mediatek_mt7629 | 24 + package/boot/uboot-envtools/files/mpc85xx | 27 - package/boot/uboot-envtools/files/mvebu | 9 +- package/boot/uboot-envtools/files/mxs | 27 - package/boot/uboot-envtools/files/oxnas | 27 - package/boot/uboot-envtools/files/pistachio | 26 - package/boot/uboot-envtools/files/qoriq | 19 - package/boot/uboot-envtools/files/ramips | 61 +- package/boot/uboot-envtools/files/realtek | 51 - package/boot/uboot-rockchip/Makefile | 75 +- ...rock64pro-disable-CONFIG_USE_PREBOOT.patch | 4 +- .../patches/102-add-tpe-r1400.patch | 527 - ...d-support-for-FriendlyARM-NanoPi-R2C.patch | 199 + ...28-Add-support-for-Orange-Pi-R1-Plus.patch | 564 + ...Add-support-for-Orange-Pi-R1-Plus-LT.patch | 242 + ...d-support-for-ThinkPenguin-TPE-R1400.patch | 138 + .../of-platdata/nanopi-r2c-rk3328/dt-decl.h | 23 + .../of-platdata/nanopi-r2c-rk3328/dt-plat.c | 155 + .../nanopi-r2c-rk3328/dt-structs-gen.h | 51 + .../orangepi-r1-plus-lts-rk3328/dt-decl.h | 24 + .../orangepi-r1-plus-lts-rk3328/dt-plat.c | 170 + .../dt-structs-gen.h | 55 + .../orangepi-r1-plus-rk3328/dt-decl.h | 24 + .../orangepi-r1-plus-rk3328/dt-plat.c | 170 + .../orangepi-r1-plus-rk3328/dt-structs-gen.h | 55 + .../src/of-platdata/roc-cc-rk3328/dt-decl.h | 24 + .../src/of-platdata/roc-cc-rk3328/dt-plat.c | 189 + .../roc-cc-rk3328/dt-structs-gen.h | 55 + package/boot/uboot-sunxi/Makefile | 32 +- .../003-add-theobroma-a31-pangolin.patch | 2 +- .../patches/062-A20-improve-gmac-upload.patch | 2 +- ...1-sun6i-sync-PLL1-multdiv-with-Boot1.patch | 2 +- .../093-sun6i-fix-PLL-LDO-voltselect.patch | 2 +- .../101-sun6i-support-console-on-UART2.patch | 2 +- ...-environment-for-dtc-binary-location.patch | 2 +- .../patches/210-sunxi-deactivate-binman.patch | 4 +- .../230-disable-axp209-on-a13-olinuxino.diff | 2 +- .../250-sun8i-h3-add-support-for-zeropi.patch | 148 + .../250-sun8i-h3-zeropi-add-device-tree.patch | 81 - .../251-sun8i-h3-zeropi-add-defconfig.patch | 24 - ...2-sunxi-h3-add-support-for-nanopi-r1.patch | 5 +- ...nxi-h5-add-support-for-nanopi-r1s-h5.patch | 12 +- ...-arm-sunxi-increase-SYS_MALLOC_F_LEN.patch | 29 + package/boot/uboot-sunxi/uEnv-default.txt | 8 +- package/devel/binutils/Makefile | 17 +- .../patches/001-replace-attribute_const.patch | 88 + package/devel/gdb/Makefile | 6 +- .../001-Add-support-for-readline-8.2.patch | 31 + .../devel/gdb/patches/110-shared_libgcc.patch | 12 +- .../devel/gdb/patches/130-gdb-ctrl-c.patch | 2 +- package/devel/gperf/Makefile | 36 + package/devel/kselftests-bpf/Makefile | 63 + package/devel/perf/Makefile | 6 +- package/devel/strace/Makefile | 4 +- package/devel/trace-cmd/Makefile | 29 +- .../devel/trace-cmd/patches/100-musl.patch | 104 - .../patches/110-mac80211_tracepoint.patch | 24 - package/devel/valgrind/Makefile | 8 +- .../010-mips-Fix-new-syscall-numbers.patch | 30 +- .../patches/100-fix_configure_check.patch | 2 +- .../patches/130-fix_arm_arch_detection.patch | 2 +- .../patches/130-mips_fix_soft_float.patch | 4 +- .../firmware/linux-libre-firmware/Makefile | 0 package/firmware/linux-libre-firmware/qca.mk | 0 package/firmware/wireless-regdb/Makefile | 4 +- package/kernel/bpf-headers/Makefile | 7 +- .../patches/100-support_hz_300.patch | 20 + package/kernel/button-hotplug/Makefile | 17 +- package/kernel/button-hotplug/src/Kconfig | 2 - package/kernel/button-hotplug/src/Makefile | 2 +- package/kernel/cryptodev-linux/Makefile | 2 +- package/kernel/gpio-button-hotplug/Makefile | 8 +- .../src/gpio-button-hotplug.c | 7 + package/kernel/ksmbd/Makefile | 73 - .../ksmbd/patches/01-keep_kmod_metadata.patch | 11 - .../kernel/linux/files/hotplug-sched-teql.sh | 2 +- package/kernel/linux/modules/block.mk | 23 +- package/kernel/linux/modules/can.mk | 2 +- package/kernel/linux/modules/crypto.mk | 70 +- package/kernel/linux/modules/fs.mk | 154 +- package/kernel/linux/modules/hwmon.mk | 48 + package/kernel/linux/modules/i2c.mk | 4 +- package/kernel/linux/modules/iio.mk | 131 +- package/kernel/linux/modules/input.mk | 40 +- package/kernel/linux/modules/leds.mk | 35 + package/kernel/linux/modules/lib.mk | 36 +- package/kernel/linux/modules/netdevices.mk | 238 +- package/kernel/linux/modules/netfilter.mk | 54 +- package/kernel/linux/modules/netsupport.mk | 130 +- package/kernel/linux/modules/nls.mk | 6 +- package/kernel/linux/modules/other.mk | 243 +- package/kernel/linux/modules/sound.mk | 3 +- package/kernel/linux/modules/spi.mk | 4 +- package/kernel/linux/modules/usb.mk | 65 +- package/kernel/linux/modules/video.mk | 20 +- package/kernel/linux/modules/virt.mk | 67 + package/kernel/mac80211/Makefile | 86 +- package/kernel/mac80211/ath.mk | 9 +- .../files/lib/netifd/wireless/mac80211.sh | 746 +- .../mac80211/files/lib/wifi/mac80211.sh | 175 +- .../patches/ath/402-ath_regd_optional.patch | 2 +- .../patches/ath/404-regd_no_assoc_hints.patch | 4 +- .../patches/ath/405-ath_regd_us.patch | 4 +- .../ath10k/080-ath10k_thermal_config.patch | 47 + ...21-ath10k_init_devices_synchronously.patch | 33 + .../930-ath10k_add_tpt_led_trigger.patch | 37 + ...rolling-support-for-various-chipsets.patch | 609 + ...75-ath10k-use-tpt-trigger-by-default.patch | 53 + ...-power-reduction-for-US-regulatory-d.patch | 101 + ...h10k-Try-to-get-mac-address-from-dts.patch | 37 + ...k-always-use-mac80211-loss-detection.patch | 28 + .../ath10k/990-ath10k-small-buffers.patch | 64 + ...-tx-queues-immediately-upon-firmware.patch | 78 + ...-ath11k-Don-t-exit-on-wakeup-failure.patch | 45 + ...-Fix-spelling-mistake-chnange-change.patch | 25 + ...-ath11k-suppress-add-interface-error.patch | 52 + ...support-to-configure-channel-dwell-t.patch | 102 + ...firmware-crash-on-vdev-delete-race-c.patch | 116 + ...monitor-vdev-creation-with-firmware-.patch | 40 + ...qmi_msg_handler-data-structure-initi.patch | 33 + ...hronize-ath11k_mac_he_gi_to_nl80211_.patch | 42 + ...-ath11k-Make-QMI-message-rules-const.patch | 341 + ...ger-sta-disconnect-on-hardware-resta.patch | 119 + ...race-condition-with-struct-htt_ppdu_.patch | 103 + ...-ath11k-update-hw-params-for-IPQ5018.patch | 125 + ...update-ce-configurations-for-IPQ5018.patch | 246 + ...-remap-ce-register-space-for-IPQ5018.patch | 351 + ...11k-update-hal-srng-regs-for-IPQ5018.patch | 130 + ...ath11k-initialize-hw_ops-for-IPQ5018.patch | 90 + ...new-hw-ops-for-IPQ5018-to-get-rx-des.patch | 84 + ...fi-ath11k-add-ipq5018-device-support.patch | 31 + ...scan-request-param-frame-size-warnin.patch | 161 + ...support-to-configure-FTM-responder-r.patch | 169 + ...-channel-177-into-5-GHz-channel-list.patch | 41 + ...ix-ce-memory-mapping-for-ahb-devices.patch | 114 + ...ext-passive-scan-flag-to-adjust-pass.patch | 73 + ...return-value-check-in-ath11k_ahb_pro.patch | 27 + ...platform_get_irq-to-get-the-interrup.patch | 50 + ...SAC-bug-on-peer-addition-with-sta-ba.patch | 53 + ...low-system-suspend-to-survive-ath11k.patch | 43 + ...fy-accessor-macros-to-match-index-si.patch | 61 + ...-MU-MIMO-params-from-hostapd-to-hard.patch | 300 + ...-HE-MCS-mapper-to-a-separate-functio.patch | 67 + ...rate-rx-and-tx-mcs-maps-for-supporte.patch | 64 + ...tx-ack-signal-support-for-management.patch | 150 + ...proper-regulatory-reference-for-band.patch | 216 + ...support-to-parse-new-WMI-event-for-6.patch | 844 ++ ...debug-prints-in-regulatory-WMI-event.patch | 567 + ...ace-fake-flex-array-with-flexible-ar.patch | 246 + ...deinitialization-of-firmware-resourc.patch | 79 + ...BUFFER_DONE-read-on-monitor-ring-rx-.patch | 130 + ...wifi-ath11k-Optimize-6-GHz-scan-time.patch | 101 + ...igure-the-FTM-responder-role-using-f.patch | 117 + ...rssi-station-dump-not-updated-in-QCN.patch | 158 + ...invalid-management-rx-frame-length-i.patch | 115 + ...-writing-to-unintended-memory-region.patch | 43 + ...-11d-scan-start-before-WMI_START_SCA.patch | 61 + ...1k-Remove-redundant-pci_clear_master.patch | 58 + ...ble-Spectral-scan-upon-removing-inte.patch | 36 + ...ath11k-enable-SAR-support-on-WCN6750.patch | 29 + ...pci-Add-more-MODULE_FIRMWARE-entries.patch | 36 + ...t-a-warning-when-crypto_alloc_shash-.patch | 34 + ...re-frags-from-uninitialized-peer-in-.patch | 104 + ...-undefined-behavior-with-__fls-in-dp.patch | 29 + ...double-free-of-peer-rx_tid-during-re.patch | 144 + ...wifi-ath11k-Prevent-REO-cmd-failures.patch | 43 + ...peer-mac-information-in-failure-case.patch | 74 + ...tx-status-reporting-in-encap-offload.patch | 119 + ...-incorrect-update-of-radiotap-fields.patch | 49 + ...SKB-corruption-in-REO-destination-ri.patch | 70 + ...emove-disabling-of-80-80-and-160-MHz.patch | 49 + ...registration-of-6Ghz-only-phy-withou.patch | 61 + ...ound-false-positive-stringop-overrea.patch | 84 + ...k-driver-settings-for-MBSSID-and-EMA.patch | 133 + ...ID-configuration-during-vdev-create-.patch | 215 + ...ame-MBSSID-fields-in-wmi_vdev_up_cmd.patch | 52 + ...ID-parameter-configuration-in-AP-mod.patch | 138 + ...efactor-vif-parameter-configurations.patch | 86 + ...76-wifi-ath11k-MBSSID-beacon-support.patch | 190 + .../0077-wifi-ath11k-EMA-beacon-support.patch | 156 + ...cate-the-func-ath11k_mac_bitrate_mas.patch | 75 + ...-HT-fixed-rate-in-WMI-peer-fixed-par.patch | 141 + ...support-default-regdb-while-searchin.patch | 127 + ...ve-unused-function-ath11k_tm_event_w.patch | 128 + ...ifi-ath11k-factory-test-mode-support.patch | 850 ++ ...w-ath11k-to-boot-without-caldata-in-.patch | 47 + ...11k-Add-HTT-stats-for-PHY-reset-case.patch | 261 + ...i-ath11k-use-unique-QRTR-instance-ID.patch | 162 + ...k-control-thermal-support-via-symbol.patch | 66 + ...ci-fix-compilation-in-5.16-and-older.patch | 29 + ...ble-coldboot-calibration-for-IPQ8074.patch | 24 + ...upport-setting-FW-memory-mode-via-DT.patch | 74 + ...tersection-support-for-regulatory-ru.patch | 317 + .../201-ath5k-WAR-for-AR71xx-PCI-bug.patch | 2 +- .../ath5k/411-ath5k_allow_adhoc_and_ap.patch | 6 +- ...-ieee80211-freq-limit-property-to-li.patch | 28 - .../ath9k/401-ath9k_blink_default.patch | 2 +- .../ath9k/410-ath9k_allow_adhoc_and_ap.patch | 2 +- ...abled-MFP-capability-unconditionally.patch | 4 +- .../ath9k/500-ath9k_eeprom_debugfs.patch | 7 +- .../patches/ath9k/501-ath9k_ahb_init.patch | 2 +- .../ath9k/512-ath9k_channelbw_debugfs.patch | 4 +- .../patches/ath9k/530-ath9k_extra_leds.patch | 6 +- .../ath9k/542-ath9k_debugfs_diag.patch | 6 +- .../ath9k/543-ath9k_entropy_from_adc.patch | 10 +- .../ath9k/545-ath9k_ani_ws_detect.patch | 4 +- .../ath9k/551-ath9k_ubnt_uap_plus_hsr.patch | 2 +- .../patches/ath9k/552-ath9k-ahb_of.patch | 6 +- .../ath9k/553-ath9k_of_gpio_mask.patch | 4 +- ...calibration-data-via-nvmem-subsystem.patch | 154 - ...-fetch-pci-init-values-through-nvmem.patch | 181 - .../patches/build/015-ipw200-mtu.patch | 34 - .../patches/build/060-no_local_ssb_bcma.patch | 31 +- .../build/070-remove-broken-wext-select.patch | 10 + .../patches/build/080-resv_start_op.patch | 24 + .../mac80211/patches/build/090-bcma-otp.patch | 13 + .../100-backports-drop-QRTR-and-MHI.patch | 76 + .../build/110-backport_napi_build_skb.patch | 11 + ...01-wifi-mt7601u-update-firmware-path.patch | 55 + ...define-RF5592-in-init_eeprom-routine.patch | 52 - ...02-rt2x00-add-throughput-LED-trigger.patch | 76 - ...dd-support-for-external-PA-on-MT7620.patch | 125 - ...ove-up-and-reuse-busy-wait-functions.patch | 178 - ...-RF-self-TXDC-calibration-for-MT7620.patch | 106 - ...-rt2x00-add-r-calibration-for-MT7620.patch | 203 - ...00-add-RXDCOC-calibration-for-MT7620.patch | 117 - ...2x00-add-RXIQ-calibration-for-MT7620.patch | 434 - ...0-add-TX-LOFT-calibration-for-MT7620.patch | 982 -- ...x00-move-helper-functions-up-in-file.patch | 94 - ...HT20-HT40-bandwidth-switch-on-MT7620.patch | 56 - .../602-rt2x00-introduce-rt2x00eeprom.patch | 4 +- ...c-loadable-via-OF-on-rt288x-305x-SoC.patch | 2 +- ...duce-accessors-for-CHIP_VER-register.patch | 12 +- ...-rework-MT7620-PA-LNA-RF-calibration.patch | 413 + .../110-mac80211_keep_keys_on_stop_ap.patch | 15 +- .../120-cfg80211_allow_perm_addr_change.patch | 9 + .../subsys/150-disable_addr_notifier.patch | 67 - .../mac80211/patches/subsys/210-ap_scan.patch | 24 +- ...domize-BA-session-dialog-token-alloc.patch | 2 +- ...minstrel_ht-fix-MINSTREL_FRAC-macro.patch} | 0 ...l_ht-reduce-fluctuations-in-rate-pro.patch | 30 + ...-the-fwd_skb-dev-for-mesh-forwarding.patch | 62 - ...l_ht-rework-rate-downgrade-code-and-.patch | 151 + ...crease-quantum-for-airtime-scheduler.patch | 53 + ...d-internal-handler-for-wake_tx_queue.patch | 183 + ...dd-wake_tx_queue-callback-to-drivers.patch | 396 + ...c80211-Drop-support-for-TX-push-path.patch | 683 + ...ltek-remove-duplicated-wake_tx_queue.patch | 32 + ...rse-boottime-for-airtime-fairness-co.patch | 60 - ...211_hwsim-make-6-GHz-channels-usable.patch | 74 - ...d-support-for-.ndo_fill_forward_path.patch | 178 - ...l_ht-reduce-fluctuations-in-rate-pro.patch | 30 - ...port-for-restricting-netdev-features.patch | 506 + ...l_ht-rework-rate-downgrade-code-and-.patch | 151 - ...x-and-simplify-unencrypted-drop-chec.patch | 87 + ...211-split-beacon-retrieval-functions.patch | 262 - ...ve-A-MSDU-check-in-ieee80211_data_to.patch | 25 + ...11-MBSSID-and-EMA-support-in-AP-mode.patch | 493 - ...ctor-out-bridge-tunnel-RFC1042-heade.patch | 76 + ...nt-APIs-for-dedicated-radar-detectio.patch | 378 - ...move-mesh-forwarding-congestion-chec.patch | 54 + ...ffchan_cac_event-to-a-dedicated-work.patch | 183 - ...x-receiving-A-MSDU-frames-on-mesh-in.patch | 753 ++ ...sible-NULL-pointer-dereference-in-cf.patch | 99 - ...d-a-workaround-for-receiving-non-sta.patch | 145 + ...e-offchan_cac_abort_wk-in-cfg80211_r.patch | 136 - ...ontinuous-radar-monitoring-on-offcha.patch | 220 - ...x-race-in-mesh-sequence-number-assig.patch | 37 + ...introduce-set_radar_offchan-callback.patch | 67 - ...wifi-mac80211-mesh-fast-xmit-support.patch | 850 ++ ...offchannel_chain-structs-to-backgrou.patch | 532 - ...e-mesh-header-cache-to-speed-up-mesh.patch | 132 + .../321-mac80211-fix-mesh-forwarding.patch | 32 + ...x-mesh-path-discovery-based-on-unica.patch | 52 + ...MBSSID-support-in-interface-handling.patch | 144 - ...d-VHT-MU-MIMO-related-flags-in-ieee8.patch | 68 + ...11-MBSSID-beacon-handling-in-AP-mode.patch | 326 - ...d-HE-MU-MIMO-related-flags-in-ieee80.patch | 68 + .../325-mac80211-MBSSID-channel-switch.patch | 52 - ...troduce-ieee80211_refresh_tx_agg_ses.patch | 60 + ...bssid_indicator-in-ieee80211_assign_.patch | 25 - ...fi-mac80211-add-mesh-fast-rx-support.patch | 77 + ...d-support-for-letting-drivers-regist.patch | 149 + ...wake-queues-on-a-vif-that-is-being-s.patch | 38 - ...x-receiving-mesh-packets-in-forwardi.patch | 50 + ...airtime-fairness-back-to-deficit-rou.patch | 1249 -- ...orrectly-mark-FTM-frames-non-buffera.patch | 134 + ...a-airtime-deficit-field-s32-instead-.patch | 52 - ...mac80211-flush-queues-on-STA-removal.patch | 36 + ...r-aql_tx_pending-when-checking-airti.patch | 48 - ...i-mvm-support-flush-on-AP-interfaces.patch | 34 + ...cently-active-tx-queues-in-schedulin.patch | 118 - ...3-wifi-mac80211-add-flush_sta-method.patch | 91 + ...er-PHY-AQL-limit-to-improve-fairness.patch | 131 - ...ifi-mvm-support-new-flush_sta-method.patch | 53 + ...ugfs-file-to-display-per-phy-AQL-pen.patch | 58 - ...d-LDPC-related-flags-in-ieee80211_bs.patch | 62 + ...cumulate-airtime-deficit-for-active-.patch | 36 - ...0211-generate-EMA-beacons-in-AP-mode.patch | 372 + ...crease-quantum-for-airtime-scheduler.patch | 53 - ...-multicast-packets-from-AQL-pending-.patch | 30 - ...race-period-for-DFS-available-after-.patch | 149 + ...-not-abuse-fq.lock-in-ieee80211_do_s.patch | 46 - ...dlock-Don-t-start-TX-while-holding-f.patch | 40 - ...vif-queues-are-operational-after-sta.patch | 47 - ...x-decap-offload-for-stations-on-AP_V.patch | 37 - ...x-ieee80211_data_to_8023_exthdr-hand.patch | 99 - ...-not-drop-packets-smaller-than-the-L.patch | 25 - ...x-mesh-airtime-link-metric-estimatin.patch | 36 - .../patches/subsys/400-allow-ibss-mixed.patch | 40 + .../500-mac80211_configure_antenna_gain.patch | 40 +- package/kernel/nat46/Makefile | 8 +- package/libs/argp-standalone/Makefile | 2 + package/libs/c-ares/Makefile | 63 + package/libs/elfutils/Makefile | 21 +- .../patches/003-libintl-compatibility.patch | 4 +- .../elfutils/patches/100-musl-compat.patch | 4 +- .../libs/elfutils/patches/101-no-fts.patch | 6 +- package/libs/expat/Makefile | 9 +- package/libs/gettext-full/Makefile | 97 +- .../gettext-full/patches/001-autotools.patch | 2 +- .../patches/001-no_examples_and_tests.patch | 22 - .../libs/gettext-full/patches/010-m4.patch | 382 - .../100-libxml-no-force-included.patch | 31 + .../patches/150-disable_libxml_iconv.patch | 22 - .../200-libunistring-missing-link.patch | 21 + package/libs/glib2/Makefile | 22 +- package/libs/glib2/patches/006-c99.patch | 2 +- package/libs/glib2/patches/010-libintl.patch | 144 - package/libs/glib2/patches/010-pcre.patch | 10 + package/libs/glib2/patches/020-locale.patch | 24 + package/libs/gmp/Makefile | 3 +- package/libs/jansson/Makefile | 19 +- package/libs/libaudit/Makefile | 4 +- package/libs/libbpf/Makefile | 76 + package/libs/libbpf/patches/001-cflags.patch | 10 + package/libs/libbsd/Makefile | 12 +- .../libs/libbsd/patches/001-fix-libpath.patch | 13 + package/libs/libcap/Makefile | 7 +- .../900-use-more-compatible-shebang.patch | 8 + package/libs/libedit/Makefile | 56 + package/libs/libevent2/Makefile | 6 +- package/libs/libffi/Makefile | 2 +- package/libs/libgcrypt/Makefile | 71 + package/libs/libgpg-error/Makefile | 108 + .../patches/001-cross-compile-fix.patch | 24 + .../patches/010-add-arc-support.patch | 64 + package/libs/libiconv-full/Makefile | 11 +- package/libs/libiconv/COPYING | 504 - package/libs/libiconv/COPYRIGHT | 20 - package/libs/libiconv/Makefile | 79 - package/libs/libiconv/src/LICENSE | 6 - package/libs/libiconv/src/iconv.c | 449 - package/libs/libiconv/src/include/charmaps.h | 80 - .../src/include/charmaps/iso-8859-10.h | 24 - .../src/include/charmaps/iso-8859-13.h | 24 - .../src/include/charmaps/iso-8859-14.h | 25 - .../src/include/charmaps/iso-8859-16.h | 24 - .../src/include/charmaps/iso-8859-2.h | 24 - .../src/include/charmaps/iso-8859-3.h | 24 - .../src/include/charmaps/iso-8859-4.h | 24 - .../src/include/charmaps/iso-8859-5.h | 24 - .../src/include/charmaps/iso-8859-6.h | 24 - .../src/include/charmaps/iso-8859-7.h | 24 - .../src/include/charmaps/iso-8859-8.h | 24 - .../src/include/charmaps/iso-8859-9.h | 24 - .../libiconv/src/include/charmaps/koi8-r.h | 24 - .../src/include/charmaps/windows-1250.h | 24 - .../src/include/charmaps/windows-1251.h | 24 - .../src/include/charmaps/windows-1252.h | 25 - .../src/include/charmaps/windows-1253.h | 24 - .../src/include/charmaps/windows-1254.h | 24 - .../src/include/charmaps/windows-1255.h | 24 - .../src/include/charmaps/windows-1256.h | 24 - .../src/include/charmaps/windows-1257.h | 24 - .../src/include/charmaps/windows-1258.h | 24 - .../src/include/charmaps/windows-874.h | 24 - package/libs/libiconv/src/include/iconv.h | 36 - package/libs/libiconv/src/m4/iconv.m4 | 214 - package/libs/libidn2/Makefile | 98 + package/libs/libjson-c/Makefile | 10 +- .../patches/001-dont-build-docs.patch | 8 +- .../libs/libjson-c/patches/010-clang.patch | 11 - .../patches/010-fix-build-with-clang-15.patch | 184 + package/libs/libmbim/Makefile | 13 +- package/libs/libmd/Makefile | 47 + package/libs/libmnl/Makefile | 1 + package/libs/libnetfilter-conntrack/Makefile | 1 + package/libs/libnfnetlink/Makefile | 1 + package/libs/libnftnl/Makefile | 12 +- package/libs/libnl-tiny/Makefile | 10 +- package/libs/libnl/Makefile | 34 +- ...ivate-field-in-libnl-pkg-config-file.patch | 25 - package/libs/libpam/Makefile | 6 +- package/libs/libpcap/Makefile | 9 +- .../libs/libpcap/patches/100-no-openssl.patch | 2 +- .../libpcap/patches/102-skip-manpages.patch | 2 +- .../patches/201-space_optimization.patch | 26 - ...dd-support-for-B.A.T.M.A.N.-Advanced.patch | 642 + package/libs/libqmi/Makefile | 13 +- package/libs/libqrtr-glib/Makefile | 12 +- package/libs/libselinux/Makefile | 161 + package/libs/libsemanage/Makefile | 73 + package/libs/libsepol/Makefile | 7 +- package/libs/libssh2/Makefile | 74 + package/libs/libtool/Makefile | 6 +- package/libs/libtraceevent/Makefile | 74 + package/libs/libtracefs/Makefile | 49 + package/libs/libubox/Makefile | 6 +- package/libs/libunistring/Makefile | 64 + package/libs/libunwind/Makefile | 6 +- ...ce-exec_prefix-lib64-libdir-on-ppc64.patch | 29 - package/libs/libusb/Makefile | 35 +- ...n-the-Changelog-and-clean-up-a-stray.patch | 29 - ...parsing-of-descriptors-for-multi-con.patch | 61 - package/libs/libxml2/Makefile | 167 +- package/libs/libxml2/patches/010-iconv.patch | 12 + package/libs/libxslt/Makefile | 71 +- .../patches/010-fix-xml2-config-check.patch | 11 - package/libs/lzo/Makefile | 58 + package/libs/mbedtls/Config.in | 193 + package/libs/mbedtls/Makefile | 115 +- .../mbedtls/patches/100-fix-compile.patch | 22 - .../100-x509-crt-verify-SAN-iPAddress.patch | 197 + ...l.h-workaround-for-gcc-11.2.0-issues.patch | 30 - .../mbedtls/patches/101-remove-test.patch | 15 + package/libs/mbedtls/patches/200-config.patch | 228 - package/libs/ncurses/Makefile | 7 +- .../100-ncurses-5.6-20080112-urxvt.patch | 2 +- .../101-ncurses-5.6-20080628-kbs.patch | 26 +- .../patches/102-ncurses-5.9-gcc-5.patch | 2 +- .../patches/103-ncurses-ar-determinism.patch | 4 +- .../libs/ncurses/patches/900-terminfo.patch | 2 +- package/libs/nettle/Makefile | 9 +- .../libs/nettle/patches/100-portability.patch | 8 +- package/libs/nghttp2/Makefile | 43 + package/libs/nghttp3/Makefile | 38 + package/libs/ngtcp2/Makefile | 40 + package/libs/openssl/Config.in | 84 +- package/libs/openssl/Makefile | 87 +- package/libs/openssl/engine.mk | 46 - package/libs/openssl/files/afalg.cnf | 2 +- package/libs/openssl/files/devcrypto.cnf | 13 +- package/libs/openssl/files/legacy.cnf | 3 + package/libs/openssl/files/openssl.init | 79 +- package/libs/openssl/files/padlock.cnf | 2 +- ...m-ppc-xlate.pl-add-linux64v2-flavour.patch | 55 - .../patches/100-Configure-afalg-support.patch | 2 +- .../openssl/patches/110-openwrt_targets.patch | 8 +- .../120-strip-cflags-from-binary.patch | 8 +- .../patches/130-dont-build-fuzz-docs.patch | 20 + .../patches/130-dont-build-tests-fuzz.patch | 29 - .../patches/140-allow-prefer-chacha20.patch | 60 +- .../150-openssl.cnf-add-engines-conf.patch | 32 +- ...esource-use-verifying-policy-constra.patch | 214 - ...AG_INVALID_POLICY-is-checked-even-in.patch | 48 - ...o-save-ioctl-if-EVP_MD_.FLAG_ONESHOT.patch | 58 - ..._devcrypto-add-configuration-options.patch | 566 - ...ypto-add-command-to-dump-driver-info.patch | 273 - ...o-make-the-dev-crypto-engine-dynamic.patch | 2718 ---- ...default-to-not-use-digests-in-engine.patch | 4 +- ...to-ignore-error-when-closing-session.patch | 4 +- package/libs/pcre/Config.in | 11 - package/libs/pcre/Makefile | 129 - package/libs/pcre2/Config.in | 30 + package/libs/pcre2/Makefile | 109 + package/libs/popt/Makefile | 14 +- ...re.ac-remove-require-gettext-version.patch | 26 + package/libs/readline/Makefile | 4 +- package/libs/sqlite3/Config-cli.in | 24 + package/libs/sqlite3/Config-lib.in | 54 + package/libs/sqlite3/Makefile | 142 + package/libs/sysfsutils/Makefile | 3 +- package/libs/sysfsutils/files/sysfsutils | 3 +- package/libs/ustream-ssl/Makefile | 10 +- package/libs/wolfssl/Config.in | 66 +- package/libs/wolfssl/Makefile | 95 +- .../patches/100-disable-hardening-check.patch | 6 +- package/libs/zlib/Makefile | 8 +- .../001-neon-implementation-of-adler32.patch | 253 - ...m-specific-optimisations-for-inflate.patch | 6 - ...m-specific-optimisations-for-inflate.patch | 31 +- ...rcefiles-in-patch-002-to-buildsystem.patch | 4 +- .../zlib/patches/006-fix-CVE-2022-37434.patch | 32 - ...x-compressor-crash-on-certain-inputs.patch | 343 - ...ll-dereference-in-fix-CVE-2022-37434.patch | 29 - package/luci/.github/issue_template | 40 - package/luci/.github/workflows/build.yml | 71 - package/luci/.github/workflows/ci_helpers.sh | 26 - package/luci/.github/workflows/formal.yml | 63 - package/luci/.github/workflows/jsdoc.yml | 33 - package/luci/.gitignore | 16 - .../luci-app-adblock-fast/Makefile | 17 + .../resources/adblock-fast/status.js | 509 + .../resources/view/adblock-fast/overview.js | 528 + .../view/status/include/70_adblock-fast.js | 108 + .../po/ar/adblock-fast.po | 717 + .../po/bg/adblock-fast.po | 716 + .../po/bn_BD/adblock-fast.po | 716 + .../po/ca/adblock-fast.po | 716 + .../po/cs/adblock-fast.po | 716 + .../po/da/adblock-fast.po | 742 ++ .../po/de/adblock-fast.po | 755 ++ .../po/el/adblock-fast.po | 716 + .../po/en/adblock-fast.po | 716 + .../po/es/adblock-fast.po | 758 ++ .../po/fi/adblock-fast.po | 716 + .../po/fr/adblock-fast.po | 739 + .../po/he/adblock-fast.po | 717 + .../po/hi/adblock-fast.po | 710 + .../po/hu/adblock-fast.po | 737 + .../po/it/adblock-fast.po | 743 ++ .../po/ja/adblock-fast.po | 719 + .../po/ko/adblock-fast.po | 716 + .../po/lt/adblock-fast.po | 720 + .../po/mr/adblock-fast.po | 716 + .../po/ms/adblock-fast.po | 716 + .../po/nb_NO/adblock-fast.po | 717 + .../po/pl/adblock-fast.po | 754 ++ .../po/pt/adblock-fast.po | 737 + .../po/pt_BR/adblock-fast.po | 739 + .../po/ro/adblock-fast.po | 739 + .../po/ru/adblock-fast.po | 746 ++ .../po/sk/adblock-fast.po | 716 + .../po/sv/adblock-fast.po | 718 + .../po/templates/adblock-fast.pot | 707 + .../po/tr/adblock-fast.po | 741 ++ .../po/uk/adblock-fast.po | 718 + .../po/vi/adblock-fast.po | 728 + .../po/zh_Hans/adblock-fast.po | 728 + .../po/zh_Hant/adblock-fast.po | 719 + .../etc/uci-defaults/40_luci-adblock-fast | 4 + .../root/usr/libexec/rpcd/luci.adblock-fast | 319 + .../luci/menu.d/luci-app-adblock-fast.json | 17 + .../rpcd/acl.d/luci-app-adblock-fast.json | 35 + .../applications/luci-app-adblock/Makefile | 14 + .../resources/view/adblock/blacklist.js | 37 + .../resources/view/adblock/dnsreport.js | 364 + .../resources/view/adblock/logread.js | 41 + .../resources/view/adblock/overview.js | 603 + .../resources/view/adblock/whitelist.js | 37 + .../luci-app-adblock/po/ar/adblock.po | 837 ++ .../luci-app-adblock/po/bg/adblock.po | 790 ++ .../luci-app-adblock/po/bn_BD/adblock.po | 790 ++ .../luci-app-adblock/po/ca/adblock.po | 792 ++ .../luci-app-adblock/po/cs/adblock.po | 815 ++ .../luci-app-adblock/po/da/adblock.po | 859 ++ .../luci-app-adblock/po/de/adblock.po | 856 ++ .../luci-app-adblock/po/el/adblock.po | 792 ++ .../luci-app-adblock/po/en/adblock.po | 790 ++ .../luci-app-adblock/po/es/adblock.po | 870 ++ .../luci-app-adblock/po/fi/adblock.po | 809 ++ .../luci-app-adblock/po/fr/adblock.po | 875 ++ .../luci-app-adblock/po/he/adblock.po | 791 ++ .../luci-app-adblock/po/hi/adblock.po | 784 ++ .../luci-app-adblock/po/hu/adblock.po | 811 ++ .../luci-app-adblock/po/it/adblock.po | 866 ++ .../luci-app-adblock/po/ja/adblock.po | 834 ++ .../luci-app-adblock/po/ko/adblock.po | 794 ++ .../luci-app-adblock/po/lt/adblock.po | 794 ++ .../luci-app-adblock/po/mr/adblock.po | 790 ++ .../luci-app-adblock/po/ms/adblock.po | 790 ++ .../luci-app-adblock/po/nb_NO/adblock.po | 810 ++ .../luci-app-adblock/po/nl/adblock.po | 858 ++ .../luci-app-adblock/po/pl/adblock.po | 862 ++ .../luci-app-adblock/po/pt/adblock.po | 867 ++ .../luci-app-adblock/po/pt_BR/adblock.po | 876 ++ .../luci-app-adblock/po/ro/adblock.po | 864 ++ .../luci-app-adblock/po/ru/adblock.po | 859 ++ .../luci-app-adblock/po/si/adblock.po | 790 ++ .../luci-app-adblock/po/sk/adblock.po | 795 ++ .../luci-app-adblock/po/sv/adblock.po | 827 ++ .../luci-app-adblock/po/templates/adblock.pot | 781 ++ .../luci-app-adblock/po/tr/adblock.po | 865 ++ .../luci-app-adblock/po/uk/adblock.po | 854 ++ .../luci-app-adblock/po/vi/adblock.po | 857 ++ .../luci-app-adblock/po/zh_Hans/adblock.po | 820 ++ .../luci-app-adblock/po/zh_Hant/adblock.po | 829 ++ .../share/luci/menu.d/luci-app-adblock.json | 58 + .../share/rpcd/acl.d/luci-app-adblock.json | 34 + .../luci/applications/luci-app-aria2/Makefile | 18 + .../resources/view/aria2/config.js | 630 + .../luci-static/resources/view/aria2/files.js | 55 + .../luci-static/resources/view/aria2/log.js | 72 + .../luci-app-aria2/po/ar/aria2.po | 784 ++ .../luci-app-aria2/po/bg/aria2.po | 783 ++ .../luci-app-aria2/po/bn_BD/aria2.po | 783 ++ .../luci-app-aria2/po/ca/aria2.po | 786 ++ .../luci-app-aria2/po/cs/aria2.po | 795 ++ .../luci-app-aria2/po/da/aria2.po | 783 ++ .../luci-app-aria2/po/de/aria2.po | 900 ++ .../luci-app-aria2/po/el/aria2.po | 786 ++ .../luci-app-aria2/po/en/aria2.po | 783 ++ .../luci-app-aria2/po/es/aria2.po | 894 ++ .../luci-app-aria2/po/fi/aria2.po | 783 ++ .../luci-app-aria2/po/fr/aria2.po | 899 ++ .../luci-app-aria2/po/he/aria2.po | 784 ++ .../luci-app-aria2/po/hi/aria2.po | 777 ++ .../luci-app-aria2/po/hu/aria2.po | 903 ++ .../luci-app-aria2/po/it/aria2.po | 896 ++ .../luci-app-aria2/po/ja/aria2.po | 789 ++ .../luci-app-aria2/po/ko/aria2.po | 783 ++ .../luci-app-aria2/po/lt/aria2.po | 790 ++ .../luci-app-aria2/po/mr/aria2.po | 783 ++ .../luci-app-aria2/po/ms/aria2.po | 783 ++ .../luci-app-aria2/po/nb_NO/aria2.po | 783 ++ .../luci-app-aria2/po/nl/aria2.po | 897 ++ .../luci-app-aria2/po/pl/aria2.po | 881 ++ .../luci-app-aria2/po/pt/aria2.po | 898 ++ .../luci-app-aria2/po/pt_BR/aria2.po | 902 ++ .../luci-app-aria2/po/ro/aria2.po | 901 ++ .../luci-app-aria2/po/ru/aria2.po | 894 ++ .../luci-app-aria2/po/sk/aria2.po | 793 ++ .../luci-app-aria2/po/sv/aria2.po | 791 ++ .../luci-app-aria2/po/templates/aria2.pot | 774 ++ .../luci-app-aria2/po/tr/aria2.po | 886 ++ .../luci-app-aria2/po/uk/aria2.po | 787 ++ .../luci-app-aria2/po/vi/aria2.po | 873 ++ .../luci-app-aria2/po/zh_Hans/aria2.po | 830 ++ .../luci-app-aria2/po/zh_Hant/aria2.po | 839 ++ .../root/usr/libexec/aria2-call | 25 + .../usr/share/luci/menu.d/luci-app-aria2.json | 40 + .../usr/share/rpcd/acl.d/luci-app-aria2.json | 20 + .../applications/luci-app-commands/Makefile | 3 +- .../luci-static/resources/view/commands.js | 34 + .../luasrc/controller/commands.lua | 268 - .../luasrc/model/cbi/commands.lua | 27 - .../luasrc/view/commands.htm | 187 - .../luasrc/view/commands_public.htm | 50 - .../luci-app-commands/po/ar/commands.po | 74 +- .../luci-app-commands/po/bg/commands.po | 74 +- .../luci-app-commands/po/bn_BD/commands.po | 72 +- .../luci-app-commands/po/ca/commands.po | 82 +- .../luci-app-commands/po/cs/commands.po | 84 +- .../luci-app-commands/po/da/commands.po | 74 +- .../luci-app-commands/po/de/commands.po | 80 +- .../luci-app-commands/po/el/commands.po | 72 +- .../luci-app-commands/po/en/commands.po | 74 +- .../luci-app-commands/po/es/commands.po | 80 +- .../luci-app-commands/po/fi/commands.po | 80 +- .../luci-app-commands/po/fr/commands.po | 78 +- .../luci-app-commands/po/he/commands.po | 72 +- .../luci-app-commands/po/hi/commands.po | 70 +- .../luci-app-commands/po/hu/commands.po | 85 +- .../luci-app-commands/po/it/commands.po | 84 +- .../luci-app-commands/po/ja/commands.po | 74 +- .../luci-app-commands/po/ko/commands.po | 126 +- .../luci-app-commands/po/lt/commands.po | 153 + .../luci-app-commands/po/mr/commands.po | 74 +- .../luci-app-commands/po/ms/commands.po | 72 +- .../luci-app-commands/po/nb_NO/commands.po | 93 +- .../luci-app-commands/po/pl/commands.po | 96 +- .../luci-app-commands/po/pt/commands.po | 74 +- .../luci-app-commands/po/pt_BR/commands.po | 82 +- .../luci-app-commands/po/ro/commands.po | 74 +- .../luci-app-commands/po/ru/commands.po | 111 +- .../luci-app-commands/po/sk/commands.po | 80 +- .../luci-app-commands/po/sv/commands.po | 74 +- .../po/templates/commands.pot | 70 +- .../luci-app-commands/po/tr/commands.po | 74 +- .../luci-app-commands/po/uk/commands.po | 80 +- .../luci-app-commands/po/vi/commands.po | 135 +- .../luci-app-commands/po/zh_Hans/commands.po | 74 +- .../luci-app-commands/po/zh_Hant/commands.po | 74 +- .../share/luci/menu.d/luci-app-commands.json | 56 + .../ucode/controller/commands.uc | 256 + .../ucode/template/commands.ut | 179 + .../ucode/template/commands_public.ut | 48 + .../applications/luci-app-firewall/Makefile | 2 +- .../luci-static/resources/tools/firewall.js | 16 +- .../resources/view/firewall/forwards.js | 74 +- .../resources/view/firewall/ipsets.js | 218 + .../resources/view/firewall/rules.js | 46 +- .../resources/view/firewall/snats.js | 105 +- .../resources/view/firewall/zones.js | 44 +- .../luci-app-firewall/po/ar/firewall.po | 819 +- .../luci-app-firewall/po/bg/firewall.po | 794 +- .../luci-app-firewall/po/bn_BD/firewall.po | 794 +- .../luci-app-firewall/po/ca/firewall.po | 800 +- .../luci-app-firewall/po/cs/firewall.po | 821 +- .../luci-app-firewall/po/da/firewall.po | 845 +- .../luci-app-firewall/po/de/firewall.po | 868 +- .../luci-app-firewall/po/el/firewall.po | 794 +- .../luci-app-firewall/po/en/firewall.po | 802 +- .../luci-app-firewall/po/es/firewall.po | 867 +- .../luci-app-firewall/po/fa/firewall.po | 1170 +- .../luci-app-firewall/po/fi/firewall.po | 815 +- .../luci-app-firewall/po/fr/firewall.po | 917 +- .../luci-app-firewall/po/he/firewall.po | 818 +- .../luci-app-firewall/po/hi/firewall.po | 794 +- .../luci-app-firewall/po/hu/firewall.po | 804 +- .../luci-app-firewall/po/id/firewall.po | 806 +- .../luci-app-firewall/po/it/firewall.po | 1123 +- .../luci-app-firewall/po/ja/firewall.po | 811 +- .../luci-app-firewall/po/ko/firewall.po | 794 +- .../luci-app-firewall/po/lt/firewall.po | 1505 +++ .../luci-app-firewall/po/mr/firewall.po | 794 +- .../luci-app-firewall/po/ms/firewall.po | 794 +- .../luci-app-firewall/po/nb_NO/firewall.po | 798 +- .../luci-app-firewall/po/nl/firewall.po | 1293 +- .../luci-app-firewall/po/pl/firewall.po | 993 +- .../luci-app-firewall/po/pt/firewall.po | 851 +- .../luci-app-firewall/po/pt_BR/firewall.po | 858 +- .../luci-app-firewall/po/ro/firewall.po | 846 +- .../luci-app-firewall/po/ru/firewall.po | 861 +- .../luci-app-firewall/po/si/firewall.po | 794 +- .../luci-app-firewall/po/sk/firewall.po | 813 +- .../luci-app-firewall/po/sv/firewall.po | 807 +- .../po/templates/firewall.pot | 792 +- .../luci-app-firewall/po/tr/firewall.po | 856 +- .../luci-app-firewall/po/uk/firewall.po | 811 +- .../luci-app-firewall/po/ur/firewall.po | 1413 ++ .../luci-app-firewall/po/vi/firewall.po | 1264 +- .../luci-app-firewall/po/zh_Hans/firewall.po | 845 +- .../luci-app-firewall/po/zh_Hant/firewall.po | 814 +- .../share/luci/menu.d/luci-app-firewall.json | 8 + .../applications/luci-app-openvpn/Makefile | 2 +- .../luasrc/model/cbi/openvpn-advanced.lua | 6 +- .../luasrc/view/openvpn/pageswitch.htm | 2 +- .../luci-app-openvpn/po/ar/openvpn.po | 27 +- .../luci-app-openvpn/po/bg/openvpn.po | 35 +- .../luci-app-openvpn/po/bn_BD/openvpn.po | 27 +- .../luci-app-openvpn/po/ca/openvpn.po | 35 +- .../luci-app-openvpn/po/cs/openvpn.po | 50 +- .../luci-app-openvpn/po/da/openvpn.po | 34 +- .../luci-app-openvpn/po/de/openvpn.po | 39 +- .../luci-app-openvpn/po/el/openvpn.po | 27 +- .../luci-app-openvpn/po/en/openvpn.po | 27 +- .../luci-app-openvpn/po/es/openvpn.po | 35 +- .../luci-app-openvpn/po/fa/openvpn.po | 213 +- .../luci-app-openvpn/po/fi/openvpn.po | 27 +- .../luci-app-openvpn/po/fr/openvpn.po | 37 +- .../luci-app-openvpn/po/he/openvpn.po | 27 +- .../luci-app-openvpn/po/hi/openvpn.po | 27 +- .../luci-app-openvpn/po/hu/openvpn.po | 27 +- .../luci-app-openvpn/po/it/openvpn.po | 165 +- .../luci-app-openvpn/po/ja/openvpn.po | 27 +- .../luci-app-openvpn/po/ko/openvpn.po | 27 +- .../luci-app-openvpn/po/lt/openvpn.po | 826 ++ .../luci-app-openvpn/po/mr/openvpn.po | 27 +- .../luci-app-openvpn/po/ms/openvpn.po | 27 +- .../luci-app-openvpn/po/nb_NO/openvpn.po | 77 +- .../luci-app-openvpn/po/nl/openvpn.po | 847 ++ .../luci-app-openvpn/po/pl/openvpn.po | 35 +- .../luci-app-openvpn/po/pt/openvpn.po | 29 +- .../luci-app-openvpn/po/pt_BR/openvpn.po | 29 +- .../luci-app-openvpn/po/ro/openvpn.po | 37 +- .../luci-app-openvpn/po/ru/openvpn.po | 302 +- .../luci-app-openvpn/po/sk/openvpn.po | 35 +- .../luci-app-openvpn/po/sv/openvpn.po | 33 +- .../luci-app-openvpn/po/templates/openvpn.pot | 25 +- .../luci-app-openvpn/po/tr/openvpn.po | 36 +- .../luci-app-openvpn/po/uk/openvpn.po | 275 +- .../luci-app-openvpn/po/vi/openvpn.po | 142 +- .../luci-app-openvpn/po/zh_Hans/openvpn.po | 37 +- .../luci-app-openvpn/po/zh_Hant/openvpn.po | 44 +- .../luci/applications/luci-app-opkg/Makefile | 2 +- .../htdocs/luci-static/resources/view/opkg.js | 254 +- .../applications/luci-app-opkg/po/ar/opkg.po | 253 +- .../applications/luci-app-opkg/po/bg/opkg.po | 259 +- .../luci-app-opkg/po/bn_BD/opkg.po | 253 +- .../applications/luci-app-opkg/po/ca/opkg.po | 253 +- .../applications/luci-app-opkg/po/cs/opkg.po | 279 +- .../applications/luci-app-opkg/po/da/opkg.po | 261 +- .../applications/luci-app-opkg/po/de/opkg.po | 271 +- .../applications/luci-app-opkg/po/el/opkg.po | 253 +- .../applications/luci-app-opkg/po/en/opkg.po | 253 +- .../applications/luci-app-opkg/po/es/opkg.po | 262 +- .../applications/luci-app-opkg/po/fa/opkg.po | 393 + .../applications/luci-app-opkg/po/fi/opkg.po | 263 +- .../applications/luci-app-opkg/po/fr/opkg.po | 269 +- .../applications/luci-app-opkg/po/he/opkg.po | 259 +- .../applications/luci-app-opkg/po/hi/opkg.po | 253 +- .../applications/luci-app-opkg/po/hu/opkg.po | 259 +- .../applications/luci-app-opkg/po/it/opkg.po | 297 +- .../applications/luci-app-opkg/po/ja/opkg.po | 259 +- .../applications/luci-app-opkg/po/ko/opkg.po | 271 +- .../applications/luci-app-opkg/po/lt/opkg.po | 406 + .../applications/luci-app-opkg/po/mr/opkg.po | 253 +- .../applications/luci-app-opkg/po/ms/opkg.po | 253 +- .../luci-app-opkg/po/nb_NO/opkg.po | 257 +- .../applications/luci-app-opkg/po/pl/opkg.po | 265 +- .../applications/luci-app-opkg/po/pt/opkg.po | 262 +- .../luci-app-opkg/po/pt_BR/opkg.po | 262 +- .../applications/luci-app-opkg/po/ro/opkg.po | 269 +- .../applications/luci-app-opkg/po/ru/opkg.po | 261 +- .../applications/luci-app-opkg/po/sk/opkg.po | 276 +- .../applications/luci-app-opkg/po/sv/opkg.po | 259 +- .../luci-app-opkg/po/templates/opkg.pot | 251 +- .../applications/luci-app-opkg/po/tr/opkg.po | 261 +- .../applications/luci-app-opkg/po/uk/opkg.po | 268 +- .../applications/luci-app-opkg/po/ur/opkg.po | 394 + .../applications/luci-app-opkg/po/vi/opkg.po | 392 +- .../luci-app-opkg/po/zh_Hans/opkg.po | 267 +- .../luci-app-opkg/po/zh_Hant/opkg.po | 259 +- .../applications/luci-app-p910nd/Makefile | 2 +- .../luci-app-p910nd/po/ar/p910nd.po | 2 +- .../luci-app-p910nd/po/bg/p910nd.po | 10 +- .../luci-app-p910nd/po/bn_BD/p910nd.po | 2 +- .../luci-app-p910nd/po/ca/p910nd.po | 2 +- .../luci-app-p910nd/po/cs/p910nd.po | 12 +- .../luci-app-p910nd/po/da/p910nd.po | 2 +- .../luci-app-p910nd/po/de/p910nd.po | 2 +- .../luci-app-p910nd/po/el/p910nd.po | 2 +- .../luci-app-p910nd/po/en/p910nd.po | 2 +- .../luci-app-p910nd/po/es/p910nd.po | 2 +- .../luci-app-p910nd/po/fi/p910nd.po | 2 +- .../luci-app-p910nd/po/fr/p910nd.po | 10 +- .../luci-app-p910nd/po/he/p910nd.po | 2 +- .../luci-app-p910nd/po/hu/p910nd.po | 2 +- .../luci-app-p910nd/po/it/p910nd.po | 2 +- .../luci-app-p910nd/po/ja/p910nd.po | 2 +- .../luci-app-p910nd/po/ko/p910nd.po | 10 +- .../luci-app-p910nd/po/lt/p910nd.po | 62 + .../luci-app-p910nd/po/mr/p910nd.po | 2 +- .../luci-app-p910nd/po/nb_NO/p910nd.po | 10 +- .../luci-app-p910nd/po/nl/p910nd.po | 64 + .../luci-app-p910nd/po/pl/p910nd.po | 2 +- .../luci-app-p910nd/po/pt/p910nd.po | 2 +- .../luci-app-p910nd/po/pt_BR/p910nd.po | 2 +- .../luci-app-p910nd/po/ro/p910nd.po | 2 +- .../luci-app-p910nd/po/ru/p910nd.po | 2 +- .../luci-app-p910nd/po/sk/p910nd.po | 2 +- .../luci-app-p910nd/po/sv/p910nd.po | 2 +- .../luci-app-p910nd/po/tr/p910nd.po | 2 +- .../luci-app-p910nd/po/uk/p910nd.po | 2 +- .../luci-app-p910nd/po/vi/p910nd.po | 30 +- .../luci-app-p910nd/po/zh_Hans/p910nd.po | 2 +- .../luci-app-p910nd/po/zh_Hant/p910nd.po | 10 +- .../luci/applications/luci-app-tor/Makefile | 14 + .../luci-static/resources/view/tor/tor-hs.js | 108 + .../applications/luci-app-tor/po/ru/tor.po | 94 + .../luci-app-tor/po/templates/tor.pot | 84 + .../usr/share/luci/menu.d/luci-app-tor.json | 23 + .../usr/share/rpcd/acl.d/luci-app-tor.json | 22 + .../applications/luci-app-uhttpd/Makefile | 4 +- .../luasrc/model/cbi/uhttpd/uhttpd.lua | 2 +- .../luci-app-uhttpd/po/ar/uhttpd.po | 2 +- .../luci-app-uhttpd/po/bg/uhttpd.po | 2 +- .../luci-app-uhttpd/po/bn_BD/uhttpd.po | 2 +- .../luci-app-uhttpd/po/ca/uhttpd.po | 2 +- .../luci-app-uhttpd/po/cs/uhttpd.po | 2 +- .../luci-app-uhttpd/po/da/uhttpd.po | 6 +- .../luci-app-uhttpd/po/de/uhttpd.po | 8 +- .../luci-app-uhttpd/po/el/uhttpd.po | 2 +- .../luci-app-uhttpd/po/es/uhttpd.po | 10 +- .../luci-app-uhttpd/po/fi/uhttpd.po | 10 +- .../luci-app-uhttpd/po/fr/uhttpd.po | 11 +- .../luci-app-uhttpd/po/he/uhttpd.po | 10 +- .../luci-app-uhttpd/po/hu/uhttpd.po | 9 +- .../luci-app-uhttpd/po/id/uhttpd.po | 12 +- .../luci-app-uhttpd/po/it/uhttpd.po | 12 +- .../luci-app-uhttpd/po/ja/uhttpd.po | 2 +- .../luci-app-uhttpd/po/ko/uhttpd.po | 2 +- .../luci-app-uhttpd/po/lt/uhttpd.po | 271 + .../luci-app-uhttpd/po/mr/uhttpd.po | 2 +- .../luci-app-uhttpd/po/ms/uhttpd.po | 2 +- .../luci-app-uhttpd/po/nb_NO/uhttpd.po | 8 +- .../luci-app-uhttpd/po/pl/uhttpd.po | 42 +- .../luci-app-uhttpd/po/pt/uhttpd.po | 8 +- .../luci-app-uhttpd/po/pt_BR/uhttpd.po | 8 +- .../luci-app-uhttpd/po/ro/uhttpd.po | 6 +- .../luci-app-uhttpd/po/ru/uhttpd.po | 16 +- .../luci-app-uhttpd/po/sk/uhttpd.po | 2 +- .../luci-app-uhttpd/po/sv/uhttpd.po | 8 +- .../luci-app-uhttpd/po/tr/uhttpd.po | 8 +- .../luci-app-uhttpd/po/uk/uhttpd.po | 2 +- .../luci-app-uhttpd/po/vi/uhttpd.po | 125 +- .../luci-app-uhttpd/po/zh_Hans/uhttpd.po | 8 +- .../luci-app-uhttpd/po/zh_Hant/uhttpd.po | 8 +- .../applications/luci-app-wireguard/Makefile | 15 - .../resources/view/wireguard/status.js | 228 - .../luci-app-wireguard/po/ar/wireguard.po | 93 - .../luci-app-wireguard/po/bg/wireguard.po | 92 - .../luci-app-wireguard/po/bn_BD/wireguard.po | 92 - .../luci-app-wireguard/po/ca/wireguard.po | 92 - .../luci-app-wireguard/po/cs/wireguard.po | 92 - .../luci-app-wireguard/po/da/wireguard.po | 92 - .../luci-app-wireguard/po/de/wireguard.po | 92 - .../luci-app-wireguard/po/el/wireguard.po | 92 - .../luci-app-wireguard/po/en/wireguard.po | 92 - .../luci-app-wireguard/po/es/wireguard.po | 95 - .../luci-app-wireguard/po/fi/wireguard.po | 92 - .../luci-app-wireguard/po/fr/wireguard.po | 92 - .../luci-app-wireguard/po/he/wireguard.po | 93 - .../luci-app-wireguard/po/hi/wireguard.po | 86 - .../luci-app-wireguard/po/hu/wireguard.po | 92 - .../luci-app-wireguard/po/id/wireguard.po | 92 - .../luci-app-wireguard/po/it/wireguard.po | 92 - .../luci-app-wireguard/po/ja/wireguard.po | 96 - .../luci-app-wireguard/po/ko/wireguard.po | 93 - .../luci-app-wireguard/po/mr/wireguard.po | 92 - .../luci-app-wireguard/po/ms/wireguard.po | 92 - .../luci-app-wireguard/po/nb_NO/wireguard.po | 92 - .../luci-app-wireguard/po/pl/wireguard.po | 93 - .../luci-app-wireguard/po/pt/wireguard.po | 92 - .../luci-app-wireguard/po/pt_BR/wireguard.po | 95 - .../luci-app-wireguard/po/ro/wireguard.po | 93 - .../luci-app-wireguard/po/ru/wireguard.po | 98 - .../luci-app-wireguard/po/sk/wireguard.po | 92 - .../luci-app-wireguard/po/sv/wireguard.po | 92 - .../po/templates/wireguard.pot | 83 - .../luci-app-wireguard/po/tr/wireguard.po | 92 - .../luci-app-wireguard/po/uk/wireguard.po | 93 - .../luci-app-wireguard/po/vi/wireguard.po | 92 - .../po/zh_Hans/wireguard.po | 98 - .../po/zh_Hant/wireguard.po | 98 - .../share/luci/menu.d/luci-app-wireguard.json | 14 - .../share/rpcd/acl.d/luci-app-wireguard.json | 12 - package/luci/build/i18n-scan.pl | 64 +- package/luci/build/mkbasepot.sh | 2 +- package/luci/build/zoneinfo2ucode.pl | 93 + package/luci/collections/luci-light/Makefile | 17 +- .../collections/luci-ssl-openssl/Makefile | 4 +- package/luci/collections/luci-ssl/Makefile | 4 +- package/luci/collections/luci/Makefile | 9 +- .../luci/contrib/package/lucihttp/Makefile | 6 +- .../contrib/package/ucode-mod-html/Makefile | 31 + .../contrib/package/ucode-mod-html/src/html.c | 2794 ++++ .../contrib/package/ucode-mod-lua/Makefile | 31 + .../contrib/package/ucode-mod-lua/src/lua.c | 1098 ++ package/luci/docs/jsapi/README.md | 5 - package/luci/libs/luci-lib-base/Makefile | 2 +- .../luci/libs/luci-lib-base/luasrc/http.lua | 465 +- .../luci/libs/luci-lib-base/luasrc/util.lua | 27 +- .../luci/libs/luci-lib-httpclient/Makefile | 2 +- .../libs/luci-lib-httpprotoutils/Makefile | 2 +- .../luasrc/http/mime.lua | 3 + package/luci/libs/luci-lib-ip/Makefile | 2 +- package/luci/libs/luci-lib-ip/src/ip.c | 20 +- package/luci/libs/luci-lib-ipkg/Makefile | 2 +- package/luci/libs/luci-lib-iptparser/Makefile | 2 +- package/luci/libs/luci-lib-json/Makefile | 2 +- package/luci/libs/luci-lib-jsonc/Makefile | 2 +- package/luci/libs/luci-lib-jsonc/src/jsonc.c | 8 +- package/luci/libs/luci-lib-nixio/Makefile | 42 +- package/luci/libs/luci-lib-px5g/Makefile | 6 +- package/luci/libs/luci-lib-rpcc/Makefile | 2 +- package/luci/libs/rpcd-mod-luci/Makefile | 3 +- package/luci/libs/rpcd-mod-luci/src/luci.c | 211 +- package/luci/luci.mk | 86 +- package/luci/modules/luci-base/Makefile | 34 +- .../modules/luci-base/htdocs/cgi-bin/luci | 46 +- .../htdocs/luci-static/resources/form.js | 15 +- .../htdocs/luci-static/resources/luci.js | 2 +- .../htdocs/luci-static/resources/network.js | 7 +- .../htdocs/luci-static/resources/ui.js | 144 +- .../luci-static/resources/validation.js | 9 + .../luasrc/controller/admin/index.lua | 199 - .../luci-base/luasrc/controller/admin/uci.lua | 70 - .../modules/luci-base/luasrc/dispatcher.lua | 1564 --- .../luci-base/luasrc/dispatcher.luadoc | 220 - .../luci/modules/luci-base/luasrc/sgi/cgi.lua | 73 - .../modules/luci-base/luasrc/sgi/uhttpd.lua | 99 - .../luci-base/luasrc/sys/zoneinfo/tzdata.lua | 452 - .../luasrc/sys/zoneinfo/tzoffset.lua | 45 - .../modules/luci-base/luasrc/template.lua | 100 - .../luci-base/luasrc/view/csrftoken.htm | 24 - .../luci-base/luasrc/view/error404.htm | 12 - .../luci-base/luasrc/view/error500.htm | 11 - .../modules/luci-base/luasrc/view/footer.htm | 27 - .../modules/luci-base/luasrc/view/header.htm | 38 - .../modules/luci-base/luasrc/view/sysauth.htm | 75 - .../modules/luci-base/luasrc/view/view.htm | 12 - package/luci/modules/luci-base/po/ar/base.po | 4121 ++++-- package/luci/modules/luci-base/po/bg/base.po | 4067 ++++-- .../luci/modules/luci-base/po/bn_BD/base.po | 4067 ++++-- package/luci/modules/luci-base/po/ca/base.po | 4361 +++--- package/luci/modules/luci-base/po/cs/base.po | 4244 +++--- package/luci/modules/luci-base/po/da/base.po | 4226 ++++-- package/luci/modules/luci-base/po/de/base.po | 4578 ++++--- package/luci/modules/luci-base/po/el/base.po | 4090 ++++-- package/luci/modules/luci-base/po/en/base.po | 4071 ++++-- package/luci/modules/luci-base/po/es/base.po | 4363 ++++-- package/luci/modules/luci-base/po/fi/base.po | 4134 ++++-- package/luci/modules/luci-base/po/fr/base.po | 4318 +++--- package/luci/modules/luci-base/po/he/base.po | 4121 ++++-- package/luci/modules/luci-base/po/hi/base.po | 4070 ++++-- package/luci/modules/luci-base/po/hu/base.po | 4166 ++++-- package/luci/modules/luci-base/po/it/base.po | 6898 ++++++---- package/luci/modules/luci-base/po/ja/base.po | 4108 ++++-- package/luci/modules/luci-base/po/ko/base.po | 4087 ++++-- package/luci/modules/luci-base/po/lt/base.po | 11086 ++++++++++++++++ package/luci/modules/luci-base/po/mr/base.po | 4063 ++++-- package/luci/modules/luci-base/po/ms/base.po | 4066 ++++-- .../luci/modules/luci-base/po/nb_NO/base.po | 4119 ++++-- package/luci/modules/luci-base/po/nl/base.po | 7752 +++++++---- package/luci/modules/luci-base/po/pl/base.po | 4498 ++++--- package/luci/modules/luci-base/po/pt/base.po | 4519 ++++--- .../luci/modules/luci-base/po/pt_BR/base.po | 4352 +++--- package/luci/modules/luci-base/po/ro/base.po | 4231 ++++-- package/luci/modules/luci-base/po/ru/base.po | 4286 ++++-- package/luci/modules/luci-base/po/sk/base.po | 4714 ++++--- package/luci/modules/luci-base/po/sv/base.po | 4101 ++++-- .../modules/luci-base/po/templates/base.pot | 4060 ++++-- package/luci/modules/luci-base/po/tr/base.po | 4245 ++++-- package/luci/modules/luci-base/po/uk/base.po | 4240 +++--- package/luci/modules/luci-base/po/ur/base.po | 10964 +++++++++++++++ package/luci/modules/luci-base/po/vi/base.po | 6392 +++++---- .../luci/modules/luci-base/po/zh_Hans/base.po | 4189 ++++-- .../luci/modules/luci-base/po/zh_Hant/base.po | 4192 ++++-- .../luci-base/root/usr/libexec/rpcd/luci | 683 - .../root/usr/share/luci/menu.d/luci-base.json | 18 +- .../luci-base/root/usr/share/rpcd/ucode/luci | 587 + .../modules/luci-base/root/www/index.html | 2 + package/luci/modules/luci-base/src/Makefile | 30 +- .../luci/modules/luci-base/src/contrib/lemon | Bin 0 -> 94832 bytes package/luci/modules/luci-base/src/lib/lmo.c | 636 + package/luci/modules/luci-base/src/lib/lmo.h | 108 + package/luci/modules/luci-base/src/lib/luci.c | 383 + .../luci-base/src/lib/plural_formula.c | 1059 ++ .../luci-base/src/lib/plural_formula.h | 20 + .../luci-base/src/{ => lib}/plural_formula.y | 0 package/luci/modules/luci-base/src/po2lmo.c | 9 +- .../luci-base/ucode/controller/admin/index.uc | 160 + .../luci-base/ucode/controller/admin/uci.uc | 150 + .../modules/luci-base/ucode/dispatcher.uc | 1010 ++ package/luci/modules/luci-base/ucode/http.uc | 574 + .../luci/modules/luci-base/ucode/runtime.uc | 185 + package/luci/modules/luci-base/ucode/sys.uc | 157 + .../luci-base/ucode/template/csrftoken.ut | 24 + .../luci-base/ucode/template/error404.ut | 14 + .../luci-base/ucode/template/error500.ut | 67 + .../luci-base/ucode/template/footer.ut | 42 + .../luci-base/ucode/template/header.ut | 32 + .../luci-base/ucode/template/sysauth.ut | 74 + .../modules/luci-base/ucode/template/view.ut | 12 + .../luci/modules/luci-base/ucode/uhttpd.uc | 12 + .../luci/modules/luci-base/ucode/zoneinfo.uc | 449 + package/luci/modules/luci-compat/Makefile | 4 +- .../luci-compat/luasrc/view/cbi/footer.htm | 2 +- .../luci/modules/luci-lua-runtime/Makefile | 28 + .../luasrc/cacheloader.lua | 0 .../luasrc/ccache.lua | 0 .../luasrc/config.lua | 0 .../luci-lua-runtime/luasrc/dispatcher.lua | 484 + .../luasrc/i18n.lua | 0 .../luasrc/i18n.luadoc | 0 .../luasrc/model/uci.lua | 0 .../luasrc/model/uci.luadoc | 0 .../luasrc/store.lua | 0 .../luasrc/sys.lua | 0 .../luasrc/sys.luadoc | 0 .../luasrc/sys/zoneinfo.lua | 0 .../luasrc/sys/zoneinfo/tzdata.lua | 455 + .../luasrc/sys/zoneinfo/tzoffset.lua | 46 + .../luci-lua-runtime/luasrc/template.lua | 184 + .../luci-lua-runtime/luasrc/ucodebridge.lua | 54 + .../luasrc/version.lua | 0 .../luasrc/view/admin_status/luaindex.htm | 18 + .../luasrc/view/empty_node_placeholder.htm | 0 .../luasrc/view/indexer.htm | 0 .../luasrc/xml.lua | 0 .../luasrc/xml.luadoc | 0 .../modules/luci-lua-runtime/src/Makefile | 26 + .../luci-lua-runtime/src/contrib/lemon.c | 5040 +++++++ .../luci-lua-runtime/src/contrib/lempar.c | 851 ++ .../src/mkversion.sh | 0 .../luci-lua-runtime/src/plural_formula.y | 43 + .../src/template_lmo.c | 0 .../src/template_lmo.h | 0 .../src/template_lualib.c | 0 .../src/template_lualib.h | 0 .../src/template_parser.c | 0 .../src/template_parser.h | 0 .../src/template_utils.c | 0 .../src/template_utils.h | 0 .../luci/modules/luci-mod-admin-full/Makefile | 2 +- .../luci/modules/luci-mod-admin-mini/Makefile | 2 +- .../luasrc/model/cbi/mini/network.lua | 2 +- .../luasrc/view/mini/index.htm | 2 +- .../luci/modules/luci-mod-dashboard/Makefile | 2 +- .../resources/view/dashboard/css/custom.css | 6 +- .../view/dashboard/include/10_router.js | 6 +- .../view/dashboard/include/30_wifi.js | 4 +- .../luci-mod-dashboard/po/ar/dashboard.po | 49 +- .../luci-mod-dashboard/po/bg/dashboard.po | 51 +- .../luci-mod-dashboard/po/bn_BD/dashboard.po | 51 +- .../luci-mod-dashboard/po/ca/dashboard.po | 61 +- .../luci-mod-dashboard/po/cs/dashboard.po | 89 +- .../luci-mod-dashboard/po/da/dashboard.po | 57 +- .../luci-mod-dashboard/po/de/dashboard.po | 59 +- .../luci-mod-dashboard/po/el/dashboard.po | 51 +- .../luci-mod-dashboard/po/en/dashboard.po | 51 +- .../luci-mod-dashboard/po/es/dashboard.po | 62 +- .../luci-mod-dashboard/po/fi/dashboard.po | 57 +- .../luci-mod-dashboard/po/fr/dashboard.po | 59 +- .../luci-mod-dashboard/po/he/dashboard.po | 49 +- .../luci-mod-dashboard/po/hi/dashboard.po | 49 +- .../luci-mod-dashboard/po/hu/dashboard.po | 52 +- .../luci-mod-dashboard/po/id/dashboard.po | 217 + .../luci-mod-dashboard/po/it/dashboard.po | 79 +- .../luci-mod-dashboard/po/ja/dashboard.po | 51 +- .../luci-mod-dashboard/po/ko/dashboard.po | 59 +- .../luci-mod-dashboard/po/lt/dashboard.po | 221 + .../luci-mod-dashboard/po/mr/dashboard.po | 49 +- .../luci-mod-dashboard/po/ms/dashboard.po | 49 +- .../luci-mod-dashboard/po/nb_NO/dashboard.po | 51 +- .../luci-mod-dashboard/po/nl/dashboard.po | 130 +- .../luci-mod-dashboard/po/pl/dashboard.po | 61 +- .../luci-mod-dashboard/po/pt/dashboard.po | 51 +- .../luci-mod-dashboard/po/pt_BR/dashboard.po | 57 +- .../luci-mod-dashboard/po/ro/dashboard.po | 57 +- .../luci-mod-dashboard/po/ru/dashboard.po | 63 +- .../luci-mod-dashboard/po/sk/dashboard.po | 143 +- .../luci-mod-dashboard/po/sv/dashboard.po | 51 +- .../po/templates/dashboard.pot | 49 +- .../luci-mod-dashboard/po/tr/dashboard.po | 51 +- .../luci-mod-dashboard/po/uk/dashboard.po | 59 +- .../luci-mod-dashboard/po/vi/dashboard.po | 152 +- .../po/zh_Hans/dashboard.po | 59 +- .../po/zh_Hant/dashboard.po | 61 +- package/luci/modules/luci-mod-dsl/Makefile | 16 + .../resources/view/status/dsl/graph.js | 400 + .../resources/view/status/dsl/spectrum.js | 63 + .../resources/view/status/dsl/stats.js | 188 + .../luci/modules/luci-mod-dsl/po/da/dsl.po | 287 + .../luci/modules/luci-mod-dsl/po/de/dsl.po | 288 + .../luci/modules/luci-mod-dsl/po/es/dsl.po | 301 + .../luci/modules/luci-mod-dsl/po/it/dsl.po | 288 + .../luci/modules/luci-mod-dsl/po/lt/dsl.po | 289 + .../luci/modules/luci-mod-dsl/po/nb_NO/dsl.po | 294 + .../luci/modules/luci-mod-dsl/po/pl/dsl.po | 288 + .../luci/modules/luci-mod-dsl/po/pt/dsl.po | 288 + .../luci/modules/luci-mod-dsl/po/pt_BR/dsl.po | 288 + .../luci/modules/luci-mod-dsl/po/ro/dsl.po | 289 + .../luci/modules/luci-mod-dsl/po/ru/dsl.po | 288 + .../luci/modules/luci-mod-dsl/po/sv/dsl.po | 288 + .../modules/luci-mod-dsl/po/templates/dsl.pot | 276 + .../luci/modules/luci-mod-dsl/po/tr/dsl.po | 287 + .../luci/modules/luci-mod-dsl/po/uk/dsl.po | 286 + .../modules/luci-mod-dsl/po/zh_Hant/dsl.po | 286 + .../usr/share/luci/menu.d/luci-mod-dsl.json | 30 + .../usr/share/rpcd/acl.d/luci-mod-dsl.json | 10 + .../luci/modules/luci-mod-network/Makefile | 4 +- .../luci-static/resources/tools/network.js | 158 +- .../resources/view/network/dhcp.js | 296 +- .../resources/view/network/diagnostics.js | 32 +- .../resources/view/network/interfaces.js | 120 +- .../resources/view/network/routes.js | 2 + .../resources/view/network/wireless.js | 206 +- .../etc/uci-defaults/50_luci-mod-admin-full | 2 +- .../share/rpcd/acl.d/luci-mod-network.json | 4 +- package/luci/modules/luci-mod-rpc/Makefile | 2 +- package/luci/modules/luci-mod-status/Makefile | 5 +- .../resources/view/status/channel_analysis.js | 87 +- .../view/status/include/10_system.js | 13 +- .../resources/view/status/include/29_ports.js | 386 + .../resources/view/status/include/40_dhcp.js | 4 +- .../resources/view/status/include/50_dsl.js | 37 +- .../resources/view/status/iptables.js | 2 +- .../resources/view/status/nftables.js | 14 +- .../resources/view/status/routes.js | 6 +- .../luasrc/view/admin_status/index.htm | 78 - .../rpcd/acl.d/luci-mod-status-index.json | 12 +- .../ucode/template/admin_status/index.ut | 69 + package/luci/modules/luci-mod-system/Makefile | 2 +- .../resources/view/system/dropbear.js | 2 +- .../resources/view/system/flash.js | 6 +- .../view/system/led-trigger/heartbeat.js | 11 +- .../resources/view/system/sshkeys.js | 10 +- .../resources/view/system/system.js | 4 +- .../resources/view/system/uhttpd.js | 3 - .../model/cbi/admin_system/backupfiles.lua | 87 - package/luci/protocols/luci-proto-3g/Makefile | 2 +- .../protocols/luci-proto-bonding/Makefile | 17 - .../luci-static/resources/protocol/bonding.js | 426 - .../luci/protocols/luci-proto-gre/Makefile | 21 - .../luci-static/resources/protocol/gre.js | 106 - .../luci-static/resources/protocol/gretap.js | 111 - .../luci-static/resources/protocol/grev6.js | 108 - .../resources/protocol/grev6tap.js | 113 - .../luci/protocols/luci-proto-hnet/Makefile | 2 +- .../luci/protocols/luci-proto-ipip/Makefile | 2 +- .../luci/protocols/luci-proto-ipv6/Makefile | 2 +- .../luci-proto-modemmanager/Makefile | 14 - .../resources/protocol/modemmanager.js | 139 - .../rpcd/acl.d/luci-proto-modemmanager.json | 12 - .../luci/protocols/luci-proto-ncm/Makefile | 2 +- .../luci-static/resources/protocol/ncm.js | 25 +- .../luci/protocols/luci-proto-ppp/Makefile | 2 +- .../protocols/luci-proto-pppossh/Makefile | 17 - .../luci-static/resources/protocol/pppossh.js | 128 - .../luci/protocols/luci-proto-qmi/Makefile | 2 +- .../luci/protocols/luci-proto-relay/Makefile | 2 +- .../luci/protocols/luci-proto-sstp/Makefile | 15 - .../luci-static/resources/protocol/sstp.js | 70 - .../luci/protocols/luci-proto-vxlan/Makefile | 16 - .../luci-static/resources/protocol/vxlan.js | 80 - .../luci-static/resources/protocol/vxlan6.js | 75 - .../protocols/luci-proto-wireguard/Makefile | 6 +- .../resources/protocol/wireguard.js | 15 +- .../resources/view/wireguard/status.js | 175 + .../root/usr/libexec/rpcd/luci.wireguard | 162 - .../luci/menu.d/luci-proto-wireguard.json | 14 + .../usr/share/rpcd/acl.d/luci-wireguard.json | 5 + .../root/usr/share/rpcd/ucode/luci.wireguard | 107 + .../luci/protocols/luci-proto-xfrm/Makefile | 14 - .../luci-static/resources/protocol/xfrm.js | 51 - .../luci/themes/luci-theme-bootstrap/Makefile | 12 +- .../htdocs/luci-static/bootstrap-dark | 1 - .../htdocs/luci-static/bootstrap-light | 1 - .../htdocs/luci-static/bootstrap/cascade.css | 77 +- .../htdocs/luci-static/bootstrap/favicon.png | Bin 733 -> 592 bytes .../htdocs/luci-static/bootstrap/mobile.css | 97 +- .../luasrc/view/themes/bootstrap-dark | 1 - .../luasrc/view/themes/bootstrap-light | 1 - .../luasrc/view/themes/bootstrap/footer.htm | 21 - .../luasrc/view/themes/bootstrap/header.htm | 95 - .../luasrc/view/themes/bootstrap/sysauth.htm | 53 - .../ucode/template/themes/bootstrap/footer.ut | 20 + .../ucode/template/themes/bootstrap/header.ut | 83 + .../template/themes/bootstrap/sysauth.ut | 48 + .../themes/luci-theme-librecmc-2020/Makefile | 22 + .../GalanoGrotesqueW00-Regular.woff2 | Bin .../luci-static/openwrt2020/cascade.css | 1938 +++ .../htdocs/luci-static/openwrt2020/logo.png | Bin .../htdocs/luci-static/openwrt2020/logo.svg | 0 .../luci-static/openwrt2020/spinner.svg | 0 .../luci-static/resources/menu-openwrt2020.js | 0 .../uci-defaults/30_luci-theme-openwrt-2020 | 12 + .../template/themes/openwrt2020/footer.ut | 16 + .../template/themes/openwrt2020/header.ut | 72 + .../luci/themes/luci-theme-librecmc/Makefile | 22 + .../luci-static/openwrt.org/cascade.css | 0 .../htdocs/luci-static/openwrt.org/tabbg.png | Bin 0 -> 80 bytes .../luci-static/resources/menu-openwrt.js | 0 .../luasrc/view/themes/openwrt.org/footer.htm | 19 + .../luasrc/view/themes/openwrt.org/header.htm | 0 .../etc/uci-defaults/30_luci-theme-openwrt | 12 + .../luci/themes/luci-theme-material/Makefile | 10 +- .../luasrc/view/themes/material/footer.htm | 32 - .../luasrc/view/themes/material/header.htm | 101 - .../ucode/template/themes/material/footer.ut | 32 + .../ucode/template/themes/material/header.ut | 102 + .../themes/luci-theme-openwrt-2020/Makefile | 14 - .../luci-static/openwrt2020/cascade.css | 1944 --- .../luasrc/view/themes/openwrt2020/footer.htm | 17 - .../luasrc/view/themes/openwrt2020/header.htm | 79 - .../uci-defaults/30_luci-theme-openwrt-2020 | 12 - .../luci/themes/luci-theme-openwrt/Makefile | 14 - .../htdocs/luci-static/openwrt.org/tabbg.png | Bin 152 -> 0 bytes .../luasrc/view/themes/openwrt.org/footer.htm | 19 - .../etc/uci-defaults/30_luci-theme-openwrt | 12 - package/network/config/adblock-fast/Makefile | 80 + .../config/adblock-fast/files/README.md | 3 + .../files/adblock-fast.config.update | 15 + .../files/etc/config/adblock-fast | 120 + .../files/etc/init.d/adblock-fast | 2125 +++ .../files/etc/uci-defaults/90-adblock-fast | 128 + package/network/config/adblock-fast/test.sh | 3 + package/network/config/adblock/Makefile | 65 + .../network/config/adblock/files/README.md | 314 + .../config/adblock/files/adblock.blacklist | 0 .../config/adblock/files/adblock.categories | 79 + .../network/config/adblock/files/adblock.conf | 14 + .../network/config/adblock/files/adblock.init | 269 + .../network/config/adblock/files/adblock.mail | 77 + .../network/config/adblock/files/adblock.sh | 1488 +++ .../config/adblock/files/adblock.sources | 352 + .../config/adblock/files/adblock.whitelist | 0 package/network/config/firewall/Makefile | 4 +- .../config/firewall/files/firewall.config | 2 +- package/network/config/firewall4/Makefile | 8 +- package/network/config/netifd/Makefile | 15 +- .../etc/hotplug.d/net/20-smp-packet-steering | 67 - .../netifd/files/etc/init.d/packet_steering | 18 + .../network/config/netifd/files/sbin/ifdown | 1 - package/network/config/netifd/files/sbin/ifup | 33 - .../usr/libexec/network/packet-steering.sh | 70 + ...ace-ip-fix-IPv4-route-target-masking.patch | 32 + package/network/config/qos-scripts/Makefile | 2 +- .../qos-scripts/files/usr/bin/qos-start | 2 +- .../config/qos-scripts/files/usr/bin/qos-stat | 2 +- .../qos-scripts/files/usr/lib/qos/generate.sh | 13 +- .../qos-scripts/files/usr/lib/qos/tcrules.awk | 1 - package/network/config/qosify/Makefile | 76 + .../config/qosify/files/qosify-defaults.conf | 17 + .../network/config/qosify/files/qosify-status | 70 + .../network/config/qosify/files/qosify.conf | 48 + .../config/qosify/files/qosify.hotplug | 2 + .../network/config/qosify/files/qosify.init | 171 + package/network/config/swconfig/Makefile | 5 +- package/network/config/swconfig/src/uci.c | 59 +- package/network/ipv6/odhcp6c/Makefile | 8 +- package/network/ipv6/odhcp6c/files/dhcpv6.sh | 11 +- package/network/ipv6/thc-ipv6/Makefile | 6 +- .../patches/000-cflags_override.patch | 12 - .../ipv6/thc-ipv6/patches/100-no-ssl.patch | 7 +- .../patches/101-remove-march-native.patch | 11 + .../{utils => services}/bonding/Makefile | 0 .../bonding/files/lib/netifd/proto/bonding.sh | 0 package/network/services/bridger/Makefile | 62 + .../services/bridger/files/bridger.conf | 3 + .../services/bridger/files/bridger.init | 44 + package/network/services/dnsmasq/Makefile | 25 +- .../dnsmasq/files/50-dnsmasq-migrate-ipset.sh | 32 + .../network/services/dnsmasq/files/dhcp.conf | 4 + .../services/dnsmasq/files/dnsmasq.init | 70 +- ...rite-after-free-error-in-DHCPv6-code.patch | 179 - ...00-remove-old-runtime-kernel-support.patch | 8 +- .../dnsmasq/patches/200-ubus_dns.patch | 6 +- package/network/services/dropbear/Makefile | 7 +- .../services/dropbear/files/dropbear.failsafe | 5 +- .../services/dropbear/files/dropbear.init | 2 + package/network/services/hostapd/Config.in | 39 +- package/network/services/hostapd/Makefile | 248 +- package/network/services/hostapd/README.md | 419 + .../network/services/hostapd/files/common.uc | 373 + .../hostapd/files/hostapd-basic.config | 3 +- .../hostapd/files/hostapd-full.config | 7 +- .../hostapd/files/hostapd-mini.config | 1 + .../network/services/hostapd/files/hostapd.sh | 184 +- .../network/services/hostapd/files/hostapd.uc | 812 ++ .../services/hostapd/files/radius.clients | 1 + .../services/hostapd/files/radius.config | 9 + .../services/hostapd/files/radius.init | 42 + .../services/hostapd/files/radius.users | 14 + .../network/services/hostapd/files/wdev.uc | 185 + .../hostapd/files/wpa_supplicant-basic.config | 5 +- .../hostapd/files/wpa_supplicant-full.config | 5 +- .../hostapd/files/wpa_supplicant-mini.config | 3 +- .../hostapd/files/wpa_supplicant-p2p.config | 5 +- .../services/hostapd/files/wpa_supplicant.uc | 348 + .../network/services/hostapd/files/wpad.init | 2 + .../services/hostapd/files/wpad_acl.json | 6 + .../001-wolfssl-init-RNG-with-ECC-key.patch | 6 +- ...hannels-to-be-selected-if-dfs-is-ena.patch | 93 +- ...erministic-channel-on-channel-switch.patch | 10 +- ...ix-sta-add-after-previous-connection.patch | 4 +- ...use-of-uninitialized-stack-variables.patch | 2 +- ...ewrite-neigh-code-to-not-depend-on-l.patch | 14 +- ...ssing-authentication-frames-in-block.patch | 4 +- .../hostapd/patches/050-build_fix.patch | 4 +- .../hostapd/patches/100-daemonize_fix.patch | 97 - ...edtls-TLS-crypto-option-initial-port.patch | 8051 +++++++++++ .../patches/120-mbedtls-fips186_2_prf.patch | 114 + ...otate-with-TEST_FAIL-for-hwsim-tests.patch | 421 + .../135-mbedtls-fix-owe-association.patch | 91 + ...efile-make-run-tests-with-CONFIG_TLS.patch | 1358 ++ ...hecks-encountered-during-tests-hwsim.patch | 45 + ...-dpp_pkex-EC-point-mul-w-value-prime.patch | 26 + ...tapd-update-cfs0-and-cfs1-for-160MHz.patch | 141 + ...ix-setting-QoS-map-on-secondary-BSSs.patch | 20 + ...pdate-drv-ifindex-on-removing-the-fi.patch | 18 + ...0211_put_freq_params-call-outside-of.patch | 34 + ...hannel_list_update_timeout-in-hostap.patch | 28 + .../hostapd/patches/200-multicall.patch | 60 +- .../services/hostapd/patches/300-noscan.patch | 10 +- .../hostapd/patches/301-mesh-noscan.patch | 65 +- .../patches/310-rescan_immediately.patch | 2 +- .../patches/330-nl80211_fix_set_freq.patch | 6 +- .../patches/340-reload_freq_change.patch | 75 - .../341-mesh-ctrl-iface-channel-switch.patch | 2 +- .../patches/350-nl80211_del_beacon_bss.patch | 43 +- .../patches/360-ctrl_iface_reload.patch | 106 - .../hostapd/patches/370-ap_sta_support.patch | 393 - .../patches/380-disable_ctrl_iface_mib.patch | 86 +- .../381-hostapd_cli_UNKNOWN-COMMAND.patch | 2 +- .../patches/390-wpa_ie_cap_workaround.patch | 4 +- .../400-wps_single_auth_enc_type.patch | 2 +- .../patches/410-limit_debug_messages.patch | 22 +- .../patches/420-indicate-features.patch | 35 +- .../patches/430-hostapd_cli_ifdef.patch | 12 +- .../hostapd/patches/432-missing-typedef.patch | 10 - .../hostapd/patches/450-scan_wait.patch | 73 - ...dd-new-config-params-to-be-used-with.patch | 10 +- ...-use-new-parameters-during-ibss-join.patch | 59 - .../patches/463-add-mcast_rate-to-11s.patch | 8 +- .../patches/464-fix-mesh-obss-check.patch | 22 +- ...tapd-config-support-random-BSS-color.patch | 24 + .../patches/470-survey_data_fallback.patch | 15 +- .../patches/500-lto-jobserver-support.patch | 6 +- .../patches/590-rrm-wnm-statistics.patch | 18 +- .../hostapd/patches/600-ubus_support.patch | 351 +- .../hostapd/patches/601-ucode_support.patch | 553 + .../hostapd/patches/700-wifi-reload.patch | 220 - .../patches/701-reload_config_inline.patch | 33 + .../hostapd/patches/710-vlan_no_bridge.patch | 4 +- .../patches/711-wds_bridge_force.patch | 8 +- .../patches/720-iface_max_num_sta.patch | 21 +- .../hostapd/patches/730-ft_iface.patch | 8 +- .../hostapd/patches/740-snoop_iface.patch | 101 +- ...750-qos_map_set_without_interworking.patch | 67 +- .../751-qos_map_ignore_when_unsupported.patch | 2 +- .../hostapd/patches/760-dynamic_own_ip.patch | 109 + .../hostapd/patches/761-shared_das_port.patch | 298 + .../hostapd/patches/770-radius_server.patch | 154 + ..._AP-functions-dependant-on-CONFIG_AP.patch | 33 + .../patches/991-Fix-OpenWrt-13156.patch | 63 + ...-extra-ies-only-if-allowed-by-driver.patch | 62 + .../services/hostapd/src/hostapd/radius.c | 715 + .../services/hostapd/src/src/ap/ubus.c | 371 +- .../services/hostapd/src/src/ap/ubus.h | 9 + .../services/hostapd/src/src/ap/ucode.c | 812 ++ .../services/hostapd/src/src/ap/ucode.h | 54 + .../hostapd/src/src/utils/build_features.h | 12 +- .../services/hostapd/src/src/utils/ucode.c | 335 + .../services/hostapd/src/src/utils/ucode.h | 29 + .../hostapd/src/wpa_supplicant/ubus.c | 162 +- .../hostapd/src/wpa_supplicant/ubus.h | 11 - .../hostapd/src/wpa_supplicant/ucode.c | 298 + .../hostapd/src/wpa_supplicant/ucode.h | 49 + package/network/services/ipset-dns/Makefile | 2 +- package/network/services/lldpd/Makefile | 13 +- .../modemmanager/Config.in | 0 .../network/services/modemmanager/Makefile | 140 + .../network/services/modemmanager/README.md | 44 + .../modemmanager/files/10-report-down | 35 + .../modemmanager/files/25-modemmanager-net | 31 + .../modemmanager/files/25-modemmanager-tty | 16 + .../modemmanager/files/25-modemmanager-usb | 0 .../modemmanager/files/25-modemmanager-wwan | 15 + .../modemmanager/files/modemmanager.common | 350 + .../modemmanager/files/modemmanager.init | 0 .../modemmanager/files/modemmanager.proto | 650 + .../files/usr/sbin/ModemManager-wrapper | 0 .../net-snmp/Config.in.wut | 0 package/network/services/net-snmp/Makefile | 292 + .../net-snmp/files/snmpd.conf | 0 .../services/net-snmp/files/snmpd.init | 359 + .../net-snmp/files/snmptrapd.init | 0 .../net-snmp/patches/000-cross-compile.patch | 0 ...OST-MIB-hr_filesys-fix-compile-error.patch | 0 .../patches/100-debian-statistics.patch | 0 .../patches/110-debian-makefiles.patch | 0 .../patches/120-debian-searchdirs.patch | 0 .../patches/130-debian-extramibs.patch | 0 .../net-snmp/patches/160-no_ldconfig.patch | 0 .../net-snmp/patches/170-ldflags.patch | 0 .../patches/200-add-pcre2-support.patch | 407 + .../net-snmp/patches/201-Run-autoreconf.patch | 185 + .../patches/202-Improve-pcre2-support.patch | 152 + ...ss-interface.c-plug-a-leak-with-pcre.patch | 30 + .../net-snmp/patches/750-ieee802dot11.patch | 0 .../net-snmp/patches/900-musl-compat.patch | 0 package/network/services/odhcpd/Makefile | 8 +- .../services/openvpn/Config-mbedtls.in | 54 + .../services/openvpn/Config-openssl.in | 58 + .../services/openvpn/Config-wolfssl.in | 63 + package/network/services/openvpn/Makefile | 149 + .../files/etc/hotplug.d/openvpn/01-user | 22 + .../services/openvpn/files/etc/openvpn.user | 11 + .../openvpn/files/lib/functions/openvpn.sh | 16 + .../services/openvpn/files/openvpn.config | 506 + .../services/openvpn/files/openvpn.init | 258 + .../services/openvpn/files/openvpn.options | 206 + .../services/openvpn/files/openvpn.upgrade | 1 + .../openvpn/files/usr/libexec/openvpn-hotplug | 10 + .../001-reproducible-remove_DATE.patch | 10 + .../patches/002-add-wolfssl-support.patch | 190 + ...bedtls-disable-runtime-version-check.patch | 11 + .../210-build_always_use_internal_lz4.patch | 74 + .../openvpn/patches/220-disable_des.patch | 74 + package/network/services/openvpn/test.sh | 10 + package/network/services/ppp/Makefile | 6 +- package/network/services/ppp/files/ppp.sh | 18 +- .../{utils => services}/pppossh/Makefile | 0 .../{utils => services}/pppossh/README.md | 0 .../pppossh/files/pppossh.sh | 0 package/network/services/relayd/Makefile | 6 +- package/network/services/sstp-client/Makefile | 2 +- package/network/services/tor-hs/Makefile | 64 + package/network/services/tor-hs/README.md | 104 + .../services/tor-hs/files/nextcloud-update.sh | 44 + .../network/services/tor-hs/files/tor-hs.conf | 22 + .../network/services/tor-hs/files/tor-hs.init | 116 + .../network/services/tor-hs/files/tor_rpcd.sh | 69 + package/network/services/tor/Makefile | 185 + package/network/services/tor/files/tor.conf | 5 + package/network/services/tor/files/tor.init | 52 + .../services/tor/patches/001-torrc.patch | 25 + package/network/services/torsocks/Makefile | 62 + package/network/services/uhttpd/Makefile | 27 +- .../network/services/uhttpd/files/uhttpd.init | 1 + package/network/services/umdns/Makefile | 10 +- package/network/services/unetd/Makefile | 113 + .../services/unetd/files/unet-dht.init | 24 + .../network/services/unetd/files/unetd.init | 17 + package/network/services/unetd/files/unetd.sh | 99 + package/network/services/ustp/Makefile | 5 +- package/network/utils/aria2/Config.in | 83 + package/network/utils/aria2/Makefile | 101 + package/network/utils/aria2/files/aria2.conf | 31 + package/network/utils/aria2/files/aria2.init | 357 + package/network/utils/arptables/Makefile | 17 +- package/network/utils/bpftool/Makefile | 99 + .../utils/bpftool/patches/001-cflags.patch | 10 + .../utils/bpftool/patches/002-includes.patch | 26 + package/network/utils/bpftools/Makefile | 149 - .../utils/bpftools/patches/001-cflags.patch | 10 - .../utils/bpftools/patches/002-includes.patch | 26 - package/network/utils/comgt/Makefile | 4 +- package/network/utils/comgt/files/3g.sh | 2 + package/network/utils/comgt/files/ncm.json | 24 + package/network/utils/comgt/files/ncm.sh | 23 +- package/network/utils/curl/Config.in | 174 + package/network/utils/curl/Makefile | 186 + .../curl/patches/200-no_docs_tests.patch | 20 + package/network/utils/ebtables/Makefile | 1 + package/network/utils/ethtool/Makefile | 5 +- package/network/utils/iproute2/Makefile | 12 +- .../iproute2/patches/100-configure.patch | 2 +- .../iproute2/patches/110-darwin_fixes.patch | 8 +- .../patches/115-add-config-xtlibdir.patch | 2 +- .../130-no_netem_tipc_dcb_man_vdpa.patch | 11 +- .../patches/140-allow_pfifo_fast.patch | 2 +- .../patches/140-keep_libmnl_optional.patch | 2 +- .../patches/145-keep_libelf_optional.patch | 2 +- .../patches/150-keep_libcap_optional.patch | 2 +- .../patches/155-keep_tirpc_optional.patch | 11 + .../utils/iproute2/patches/170-ip_tiny.patch | 30 +- .../patches/175-reduce-dynamic-syms.patch | 8 +- .../patches/180-drop_FAILED_POLICY.patch | 6 +- .../patches/190-fix-nls-rpath-link.patch | 4 +- .../patches/195-build_variant_ip_tc.patch | 6 +- .../patches/200-drop_libbsd_dependency.patch | 2 +- .../patches/300-selinux-configurable.patch | 2 +- package/network/utils/ipset/Makefile | 9 +- .../0001-lib-ipset-fix-printf-warning.patch | 11 - ...2-Fix-IPv6-sets-nftables-translation.patch | 82 - package/network/utils/iptables/Makefile | 14 +- ...l-init_extensions6-for-static-builds.patch | 68 - ...002-xtables-Call-init_extensions_a_b.patch | 107 - ...0-treewide-use-uint-instead-of-u_int.patch | 144 + ...uild-for-missing-ETH_ALEN-definition.patch | 60 + ...Fix-build-for-Werror-format-security.patch | 23 + ...d-fix-error-during-out-of-tree-build.patch | 28 + ...nexport-init_extensions-declarations.patch | 82 + ...-string-Review-parse_string-function.patch | 40 + .../patches/101-remove-check-already.patch | 4 +- .../102-iptables-disable-modprobe.patch | 13 +- .../patches/200-configurable_builtin.patch | 2 +- .../iptables/patches/600-shared-libext.patch | 2 +- .../700-disable-legacy-revisions.patch | 14 +- package/network/utils/iw/Makefile | 14 +- .../utils/iw/patches/001-nl80211_h_sync.patch | 318 +- .../utils/iw/patches/200-reduce_size.patch | 44 +- package/network/utils/iwinfo/Makefile | 10 +- .../network/utils/layerscape/restool/Makefile | 4 +- package/network/utils/ltq-dsl-base/Makefile | 2 +- package/network/utils/modemmanager/Makefile | 132 - package/network/utils/modemmanager/README.md | 40 - .../modemmanager/files/25-modemmanager-net | 31 - .../modemmanager/files/25-modemmanager-tty | 16 - .../modemmanager/files/25-modemmanager-wwan | 15 - .../modemmanager/files/modemmanager.common | 342 - .../modemmanager/files/modemmanager.proto | 550 - .../001-plugins-Fix-port-enums-includes.patch | 88 - ...-meson-Fix-daemon-enums-dependencies.patch | 96 - package/network/utils/net-snmp/Makefile | 291 - .../network/utils/net-snmp/files/snmpd.init | 359 - package/network/utils/nftables/Makefile | 20 +- ...-t-use-non-POSIX-formats-in-strptime.patch | 44 - ...001-examples-compile-with-make-check.patch | 29 - package/network/utils/rssileds/Makefile | 2 +- package/network/utils/tcpdump/Makefile | 16 +- .../patches/001-remove_pcap_debug.patch | 6 +- .../tcpdump/patches/100-tcpdump_mini.patch | 704 +- .../tcpdump/patches/101-CVE-2020-8037.patch | 47 - .../tcpdump/patches/102-CVE-2018-16301.patch | 101 - package/network/utils/umbim/Makefile | 7 +- .../umbim/files/lib/netifd/proto/mbim.sh | 165 +- package/network/utils/uqmi/Makefile | 15 +- .../utils/uqmi/files/lib/netifd/proto/qmi.sh | 23 +- .../network/utils/wireguard-tools/Makefile | 8 +- package/network/utils/wpan-tools/Makefile | 15 +- ...h-fix-compatibility-with-libnl-3.3.0.patch | 44 - package/network/utils/wwan/Makefile | 2 +- .../network/utils/wwan/files/data/0e8d-00a5 | 5 + package/network/utils/xdp-tools/Makefile | 139 + .../010-configure-respect-LDFLAGS.patch | 29 + package/system/ca-certificates/Makefile | 14 +- ...fix-python3-cryptography-woes-in-cer.patch | 8 +- package/system/fstools/Makefile | 13 +- package/system/gpio-cdev/nu801/Makefile | 39 + .../system/gpio-cdev/nu801/files/nu801.init | 14 + package/system/iucode-tool/Makefile | 1 + ...missing-limits.h-for-USE_CPUID_DEVIC.patch | 29 + package/system/librecmc-keyring/Makefile | 0 package/system/mtd/Makefile | 4 +- package/system/openwrt-keyring/Makefile | 6 +- package/system/opkg/Makefile | 5 +- package/system/procd/Makefile | 32 +- package/system/procd/files/hotplug.json | 1 + package/system/refpolicy/Makefile | 80 + package/system/refpolicy/files/selinux-config | 7 + .../refpolicy/patches/100-no-docs.patch | 12 + package/system/rpcd/Makefile | 12 +- package/system/selinux-policy/Makefile | 54 + .../selinux-policy/files/selinux-config | 2 + package/system/ubox/Makefile | 19 +- package/system/ubox/files/modules.conf | 3 + package/system/ubus/Makefile | 10 +- package/system/uci/Makefile | 8 +- package/system/urngd/Makefile | 6 +- package/system/usign/Makefile | 5 +- package/system/zram-swap/Makefile | 2 +- package/utils/acl/Makefile | 85 + .../patches/100-no-gettext_configure.patch | 19 + .../acl/patches/101-no-gettext_autogen.patch | 7 + .../acl/patches/102-no-gettext_Makefile.patch | 11 + ...rtable-version-of-dirent-and-readdir.patch | 33 + package/utils/adb/Makefile | 1 + package/utils/attr/Makefile | 2 +- package/utils/bcm4908img/Makefile | 54 - package/utils/bcm4908img/src/Makefile | 7 - package/utils/bcm4908img/src/bcm4908img.c | 1022 -- package/utils/bsdiff/Makefile | 9 +- package/utils/bsdiff/patches/001-musl.patch | 24 +- .../bsdiff/patches/020-CVE-2014-9862.patch | 37 + .../bsdiff/patches/033-CVE-2020-14315.patch | 383 + package/utils/busybox/Config-defaults.in | 43 +- package/utils/busybox/Makefile | 26 +- .../utils/busybox/config/coreutils/Config.in | 7 +- package/utils/busybox/config/libbb/Config.in | 62 +- .../utils/busybox/config/miscutils/Config.in | 12 + .../busybox/config/networking/udhcp/Config.in | 7 +- package/utils/busybox/config/shell/Config.in | 5 + ...VE-2022-30065-awk-fix-use-after-free.patch | 42 - package/utils/checkpolicy/Makefile | 52 + package/utils/coreutils/Makefile | 153 + .../patches/001-no_docs_man_tests.patch | 93 + package/utils/ct-bugcheck/Makefile | 52 + package/utils/ct-bugcheck/src/bugcheck.initd | 16 + package/utils/ct-bugcheck/src/bugcheck.sh | 115 + package/utils/ct-bugcheck/src/bugchecker.sh | 29 + package/utils/dbus/Makefile | 2 +- package/utils/dtc/Makefile | 7 +- ...t-for-printing-raw-bytes-with-fdtget.patch | 137 - package/utils/e2fsprogs/Makefile | 16 +- ...-sanity-check-to-extent-manipulation.patch | 50 - package/utils/f2fs-tools/Makefile | 65 +- ...esize_f2fs-fix_wrong_ovp_calculation.patch | 46 - package/utils/fbtest/Makefile | 39 + package/utils/fbtest/src/Makefile | 14 + package/utils/fbtest/src/fbtest.c | 446 + package/utils/fritz-tools/Makefile | 60 + package/utils/fritz-tools/README.md | 50 + package/utils/fritz-tools/src/CMakeLists.txt | 16 + .../utils/fritz-tools/src/fritz_cal_extract.c | 261 + .../fritz-tools/src/fritz_tffs_nand_read.c | 587 + .../utils/fritz-tools/src/fritz_tffs_read.c | 379 + package/utils/gawk/Makefile | 46 + package/utils/grep/Makefile | 55 + package/utils/grep/patches/ppc-musl.patch | 15 + package/utils/jboot-tools/Makefile | 28 + package/utils/jboot-tools/README.md | 46 + package/utils/jboot-tools/src/CMakeLists.txt | 11 + .../utils/jboot-tools/src/jboot_config_read.c | 427 + package/utils/kmod/Makefile | 6 +- package/utils/lua/Makefile | 11 +- .../010-lua-5.1.3-lnum-full-260308.patch | 16 +- .../010-lua-5.1.3-lnum-full-260308.patch | 16 +- package/utils/lua5.3/Makefile | 7 +- package/utils/mdadm/Makefile | 16 +- .../mdadm/patches/100-cross_compile.patch | 2 +- ...h-Undefine-dprintf-before-redefining.patch | 38 - ...missing-include-file-sys-sysmacros.h.patch | 29 - .../utils/mdadm/patches/200-reduce_size.patch | 20 +- package/utils/mtd-utils/Makefile | 9 +- .../mtd-utils/patches/130-lzma_jffs2.patch | 2 +- package/utils/nvram/files/nvram-bcm53xx.init | 1 + package/utils/otrx/Makefile | 46 - package/utils/pciutils/Makefile | 6 +- .../utils/pciutils/patches/101-no-strip.patch | 6 +- ...07-avoid-addng-multiple-version-tags.patch | 42 - package/utils/policycoreutils/Makefile | 146 + package/utils/px5g-mbedtls/Makefile | 4 +- package/utils/px5g-mbedtls/px5g-mbedtls.c | 47 +- package/utils/px5g-wolfssl/Makefile | 4 +- package/utils/px5g-wolfssl/px5g-wolfssl.c | 87 +- package/utils/secilc/Makefile | 4 +- package/utils/sed/Makefile | 53 + package/utils/ucode-mod-bpf/Makefile | 40 + package/utils/ucode-mod-bpf/src/bpf.c | 814 ++ package/utils/ucode/Makefile | 235 +- package/utils/uencrypt/Makefile | 84 +- package/utils/uencrypt/src/CMakeLists.txt | 26 +- package/utils/uencrypt/src/uencrypt-mbedtls.c | 186 + package/utils/uencrypt/src/uencrypt-openssl.c | 116 + package/utils/uencrypt/src/uencrypt.c | 100 +- package/utils/uencrypt/src/uencrypt.h | 49 + package/utils/ugps/Makefile | 2 +- package/utils/util-linux/Makefile | 162 +- ...001-test_enosys-add-support-for-mips.patch | 36 + .../util-linux/patches/100-use_urandom.patch | 14 - .../util-linux/patches/200-meson-no-po.patch | 10 + package/utils/xz/Makefile | 7 +- package/utils/yafut/Makefile | 36 + package/utils/zstd/Makefile | 98 + rules.mk | 28 +- scripts/cfe-partition-tag.py | 248 +- scripts/cfe-wfi-tag.py | 231 +- scripts/dl_cleanup.py | 86 +- scripts/dl_github_archive.py | 2 +- scripts/download.pl | 92 +- scripts/dump-target-info.pl | 80 +- scripts/ext-tools.sh | 26 +- scripts/gen_image_generic.sh | 4 +- scripts/getver.sh | 2 +- scripts/ipkg-build | 6 +- scripts/json_add_image_info.py | 12 +- scripts/linksys-image.sh | 7 +- scripts/metadata.pm | 42 +- scripts/mkits-zyxel-fit-filogic.sh | 40 + scripts/mkits.sh | 42 +- scripts/netgear-encrypted-factory.py | 15 +- scripts/package-metadata.pl | 188 +- scripts/qemustart | 25 +- scripts/sercomm-kernel-header.py | 121 + scripts/sercomm-payload.py | 20 +- scripts/sercomm-pid.py | 108 + scripts/size_compare.sh | 24 +- target/Config.in | 5 + target/imagebuilder/files/Makefile | 38 +- target/linux/ath79/Makefile | 4 +- target/linux/ath79/config-5.10 | 205 - target/linux/ath79/config-5.15 | 202 + target/linux/ath79/dts/ar7100.dtsi | 19 +- .../dts/ar7100_mikrotik_routerboard-4xx.dtsi | 3 - .../ath79/dts/ar7161_adtran_bsap1880.dtsi | 5 +- .../linux/ath79/dts/ar7161_aruba_ap-105.dts | 9 - .../linux/ath79/dts/ar7161_aruba_ap-175.dts | 244 + .../dts/ar7161_buffalo_wzr-hp-ag300h.dtsi | 25 - .../ath79/dts/ar7161_dlink_dir-825-b1.dts | 244 - .../linux/ath79/dts/ar7161_jjplus_ja76pf2.dts | 18 +- target/linux/ath79/dts/ar7161_meraki_mr16.dts | 13 - .../ath79/dts/ar7161_netgear_wndap360.dts | 63 +- .../linux/ath79/dts/ar7161_netgear_wndr.dtsi | 23 - .../linux/ath79/dts/ar7161_ruckus_gd11.dtsi | 243 + .../linux/ath79/dts/ar7161_ruckus_zf7341.dts | 8 + .../linux/ath79/dts/ar7161_ruckus_zf734x.dtsi | 119 + .../linux/ath79/dts/ar7161_ruckus_zf7351.dts | 115 + .../linux/ath79/dts/ar7161_ruckus_zf7363.dts | 39 + .../ath79/dts/ar7161_siemens_ws-ap3610.dts | 7 - .../ath79/dts/ar7161_trendnet_tew-673gru.dts | 13 +- .../ath79/dts/ar7161_ubnt_routerstation.dtsi | 21 - target/linux/ath79/dts/ar7240.dtsi | 5 + .../ath79/dts/ar7240_openmesh_om2p-v1.dts | 35 +- .../linux/ath79/dts/ar7240_ruckus_zf7025.dts | 196 + target/linux/ath79/dts/ar7241.dtsi | 5 + .../ath79/dts/ar7241_netgear_wnr2200.dtsi | 7 - .../ath79/dts/ar7241_tplink_tl-mr3x20.dtsi | 7 - .../ath79/dts/ar7241_tplink_tl-wr842n-v1.dts | 7 - .../ath79/dts/ar7241_ubnt_unifi-ap-lr.dts | 8 + .../dts/ar7241_ubnt_unifi-ap-outdoor-plus.dts | 36 +- .../linux/ath79/dts/ar7241_ubnt_unifi-ap.dts | 8 + .../linux/ath79/dts/ar7241_ubnt_unifi-ap.dtsi | 104 + target/linux/ath79/dts/ar7241_ubnt_unifi.dts | 100 - target/linux/ath79/dts/ar7241_ubnt_unifi.dtsi | 11 - target/linux/ath79/dts/ar7242.dtsi | 5 + .../ath79/dts/ar7242_buffalo_wzr-bhr.dtsi | 19 - .../dts/ar7242_buffalo_wzr-hp-g302h-a1a0.dts | 48 +- target/linux/ath79/dts/ar7242_meraki_mr12.dts | 11 - .../ath79/dts/ar7242_tplink_tl-wr2543-v1.dts | 34 +- .../ath79/dts/ar7242_ubnt_edgeswitch-8xp.dts | 3 - target/linux/ath79/dts/ar7242_ubnt_sw.dtsi | 7 - target/linux/ath79/dts/ar724x.dtsi | 9 +- target/linux/ath79/dts/ar9132.dtsi | 17 +- .../dts/ar9132_buffalo_wzr-hp-g300nh.dtsi | 20 - .../ath79/dts/ar9132_tplink_tl-wa901nd-v2.dts | 10 - .../dts/ar9132_tplink_tl-wr1043nd-v1.dts | 17 - .../ath79/dts/ar9132_tplink_tl-wr941-v2.dts | 1 - target/linux/ath79/dts/ar9330.dtsi | 15 + target/linux/ath79/dts/ar9331.dtsi | 5 - target/linux/ath79/dts/ar9331_arduino_yun.dts | 16 +- .../linux/ath79/dts/ar9331_hiwifi_hc6361.dts | 156 + .../ath79/dts/ar9331_tplink_tl-mr3020-v1.dts | 7 - .../ath79/dts/ar9331_tplink_tl-mr3040-v2.dts | 7 - .../ath79/dts/ar9341_tplink_tl-mr3420-v2.dts | 7 - .../ath79/dts/ar9341_tplink_tl-wr842n-v2.dts | 7 - .../ath79/dts/ar9341_tplink_tl-wr941nd-v5.dts | 103 + .../ath79/dts/ar9342_ubnt_aircube-ac.dts | 39 +- .../ath79/dts/ar9342_ubnt_bullet-m-xw.dts | 1 - .../ath79/dts/ar9342_ubnt_nanobeam-m5-xw.dts | 2 - .../dts/ar9342_ubnt_nanostation-loco-m-xw.dts | 2 - .../dts/ar9342_ubnt_nanostation-m-xw.dts | 1 - .../ath79/dts/ar9342_ubnt_powerbeam-m2-xw.dts | 2 - .../ath79/dts/ar9342_ubnt_powerbeam-m5-xw.dts | 2 - .../linux/ath79/dts/ar9342_ubnt_wa_1port.dtsi | 2 - .../linux/ath79/dts/ar9342_ubnt_wa_2port.dtsi | 2 - .../ath79/dts/ar9342_zyxel_nwa1100-nh.dts | 46 + .../ath79/dts/ar9342_zyxel_nwa1121-ni.dts | 31 + .../ath79/dts/ar9342_zyxel_nwa1123-ni.dts | 35 + .../linux/ath79/dts/ar9342_zyxel_nwa11xx.dtsi | 166 + .../dts/ar9344_araknis_an-300-ap-i-n.dts | 23 +- .../linux/ath79/dts/ar9344_atheros_db120.dts | 54 +- .../ath79/dts/ar9344_compex_wpj344-16m.dts | 2 - .../ath79/dts/ar9344_dlink_dir-825-c1.dts | 2 +- .../linux/ath79/dts/ar9344_dlink_dir-8x5.dtsi | 51 +- .../ath79/dts/ar9344_engenius_eap600.dts | 18 +- .../ath79/dts/ar9344_engenius_ecb600.dts | 18 +- .../ath79/dts/ar9344_engenius_exx600.dtsi | 85 - .../ath79/dts/ar9344_fortinet_ap-dual.dtsi | 67 + .../ath79/dts/ar9344_fortinet_fap-221-b.dts | 75 + .../ar9344_mikrotik_routerboard-16m-nor.dtsi | 11 +- ...ar9344_mikrotik_routerboard-951x-2hnd.dtsi | 82 + .../ar9344_mikrotik_routerboard-sxt-5n.dtsi | 185 - .../dts/ar9344_mikrotik_routerboard.dtsi | 78 + .../linux/ath79/dts/ar9344_netgear_pgzng1.dts | 333 + .../linux/ath79/dts/ar9344_netgear_wndr.dtsi | 20 +- .../ath79/dts/ar9344_netgear_wndr_usb.dtsi | 7 - .../linux/ath79/dts/ar9344_ocedo_raccoon.dts | 67 +- .../ath79/dts/ar9344_openmesh_mr600.dtsi | 40 +- .../ath79/dts/ar9344_openmesh_om5p-an.dts | 40 +- target/linux/ath79/dts/ar9344_pcs_cap324.dts | 2 - target/linux/ath79/dts/ar9344_pcs_cr5000.dts | 9 - .../ath79/dts/ar9344_qxwlan_e750g-v8-16m.dts | 2 - .../ath79/dts/ar9344_qxwlan_e750g-v8-8m.dts | 2 - .../linux/ath79/dts/ar9344_ruckus_zf7372.dts | 4 + .../linux/ath79/dts/ar9344_senao_ap-dual.dtsi | 75 + .../ath79/dts/ar9344_teltonika_rut9xx.dtsi | 29 +- .../ath79/dts/ar9344_tplink_cpe605-v1.dts | 33 + .../ath79/dts/ar9344_tplink_tl-wdr3500-v1.dts | 24 - .../ath79/dts/ar9344_tplink_tl-wdr4300.dtsi | 41 +- .../ath79/dts/ar9344_tplink_tl-wdrxxxx.dtsi | 29 +- .../ath79/dts/ar9344_tplink_tl-wr841hp-v2.dts | 16 +- .../ath79/dts/ar9344_ubnt_unifi-ap-pro.dts | 34 +- .../ath79/dts/ar9344_watchguard_ap100.dts | 97 + .../ath79/dts/ar9344_watchguard_ap200.dts | 94 + .../linux/ath79/dts/ar9344_wd_mynet-n600.dts | 16 +- .../linux/ath79/dts/ar9344_wd_mynet-n750.dts | 21 - .../ar9344_wd_mynet-wifi-rangeextender.dts | 2 - .../ath79/dts/ar9344_winchannel_wb2000.dts | 66 +- .../ath79/dts/ar9344_zbtlink_zbt-wd323.dts | 8 + target/linux/ath79/dts/ar934x.dtsi | 5 + .../ath79/dts/ar934x_fortinet_loader.dtsi | 72 + .../linux/ath79/dts/qca9531_alcatel_hh40v.dts | 172 + .../ath79/dts/qca9531_alfa-network_r36a.dtsi | 8 - .../ath79/dts/qca9531_comfast_cf-e314n-v2.dts | 12 +- .../linux/ath79/dts/qca9531_comfast_cf-e5.dts | 7 - .../ath79/dts/qca9531_dlink_dch-g020-a1.dts | 164 + .../ath79/dts/qca9531_glinet_gl-ar300m.dtsi | 2 - .../ath79/dts/qca9531_glinet_gl-xe300.dts | 168 - .../ath79/dts/qca9531_letv_lba-047-ch.dts | 71 +- .../ath79/dts/qca9531_teltonika_rut300.dts | 157 + .../qca9531_thinkpenguin_tpe-r1200-nand.dts | 16 + .../qca9531_thinkpenguin_tpe-r1200-nor.dts | 11 + .../dts/qca9531_thinkpenguin_tpe-r1200.dts | 11 + .../ath79/dts/qca9531_tplink_tl-mr3420-v3.dts | 9 +- .../ath79/dts/qca9531_tplink_tl-mr6400-v1.dts | 7 - .../ath79/dts/qca9533_dlink_dap-1330-a1.dts | 8 + .../ath79/dts/qca9533_dlink_dap-1365-a1.dts | 8 + .../ath79/dts/qca9533_dlink_dap-2230-a1.dts | 6 - .../ath79/dts/qca9533_dlink_dap-3320-a1.dts | 6 - target/linux/ath79/dts/qca9533_kuwfi_c910.dts | 194 + .../dts/qca9533_mikrotik_routerboard-16m.dtsi | 3 +- .../ath79/dts/qca9533_tplink_tl-wr842n-v3.dts | 9 +- target/linux/ath79/dts/qca953x.dtsi | 7 + .../ath79/dts/qca953x_dlink_dap-2xxx.dtsi | 17 +- .../linux/ath79/dts/qca9557_8dev_rambutan.dts | 6 - .../linux/ath79/dts/qca9557_meraki_mr18.dts | 203 + .../linux/ath79/dts/qca9558_aruba_ap-115.dts | 239 + .../ath79/dts/qca9558_dlink_dir-629-a1.dts | 170 + .../ath79/dts/qca9558_engenius_esr900.dts | 85 + .../qca9558_librerouter_librerouter-v1.dts | 4 - .../dts/qca9558_mikrotik_routerboard-92x.dtsi | 3 +- .../ath79/dts/qca9558_netgear_ex7300.dtsi | 228 - .../linux/ath79/dts/qca9558_ocedo_ursus.dts | 13 +- .../linux/ath79/dts/qca9558_openmesh_a60.dtsi | 2 - .../linux/ath79/dts/qca9558_openmesh_mr.dtsi | 2 - target/linux/ath79/dts/qca9558_sophos_ap.dtsi | 7 - .../ath79/dts/qca9558_tplink_archer-c.dtsi | 14 - .../ath79/dts/qca9558_tplink_archer-c7-v2.dts | 3 +- .../ath79/dts/qca9558_tplink_archer-d7.dtsi | 14 - .../dts/qca9558_tplink_tl-wdr4900-v2.dts | 54 +- .../ath79/dts/qca9558_tplink_tl-wr1043nd.dtsi | 7 - .../ath79/dts/qca9558_ubnt_nanobeam-ac-xc.dts | 3 +- .../dts/qca9558_ubnt_powerbeam-5ac-500.dts | 1 - .../dts/qca9558_ubnt_rocket-5ac-lite.dts | 1 - target/linux/ath79/dts/qca955x.dtsi | 11 + .../ath79/dts/qca955x_dlink_dap-2xxx.dtsi | 17 +- .../linux/ath79/dts/qca955x_senao_loader.dtsi | 11 +- .../ath79/dts/qca955x_senao_router-dual.dtsi | 122 + .../ath79/dts/qca955x_zyxel_nbg6x16.dtsi | 11 - .../linux/ath79/dts/qca9563_compex_wpj563.dts | 10 +- .../ath79/dts/qca9563_dlink_dir-842-c.dtsi | 2 - .../ath79/dts/qca9563_dlink_dir-8x9-a1.dtsi | 152 + .../dts/qca9563_elecom_wrc-300ghbk2-i.dts | 25 +- .../linux/ath79/dts/qca9563_netgear_wndr.dtsi | 59 +- .../ath79/dts/qca9563_netgear_wndr4500-v3.dts | 7 - .../ath79/dts/qca9563_qxwlan_e1700ac.dtsi | 9 - .../ath79/dts/qca9563_rosinson_wr818.dts | 15 - .../dts/qca9563_tplink_archer-x6-v2.dtsi | 2 - .../dts/qca9563_tplink_archer-x7-v5.dtsi | 9 - .../dts/qca9563_tplink_eap2x5-1port.dtsi | 22 +- .../ath79/dts/qca9563_tplink_tl-wpa8630.dtsi | 2 - .../ath79/dts/qca9563_tplink_tl-wr1043n.dtsi | 1 - .../dts/qca9563_tplink_tl-wr1043nd-v4.dts | 7 - .../ath79/dts/qca9563_ubnt_unifiac-lite.dtsi | 1 - .../ath79/dts/qca9563_ubnt_unifiac-pro.dtsi | 1 - .../linux/ath79/dts/qca9563_ubnt_unifiac.dtsi | 9 +- .../ath79/dts/qca9563_yuncore_xd4200.dtsi | 2 - target/linux/ath79/dts/qca9563_zte_mf28x.dtsi | 136 + target/linux/ath79/dts/qca956x.dtsi | 11 + .../ath79/files/drivers/gpio/gpio-latch.c | 2 +- .../files/drivers/mtd/nand/raw/ar934x_nand.c | 6 +- .../files/drivers/mtd/nand/raw/rb91x_nand.c | 2 +- .../net/ethernet/atheros/ag71xx/Kconfig | 2 - .../net/ethernet/atheros/ag71xx/ag71xx.h | 2 +- .../net/ethernet/atheros/ag71xx/ag71xx_main.c | 12 +- .../net/ethernet/atheros/ag71xx/ag71xx_mdio.c | 4 - .../generic/base-files/etc/board.d/01_leds | 57 +- .../generic/base-files/etc/board.d/02_network | 90 +- .../base-files/etc/board.d/03_gpio_switches | 3 + .../etc/hotplug.d/firmware/10-ath9k-eeprom | 79 +- .../etc/hotplug.d/ieee80211/10_fix_wifi_mac | 19 + .../etc/uci-defaults/09_fix-checksum | 4 + .../base-files/lib/preinit/02_sysinfo_fixup | 42 + .../base-files/lib/preinit/10_fix_eth_mac.sh | 15 +- .../lib/upgrade/failsafe_datachk.sh | 28 +- .../base-files/lib/upgrade/platform.sh | 19 +- target/linux/ath79/generic/config-default | 8 +- target/linux/ath79/generic/target.mk | 2 +- target/linux/ath79/image/Makefile | 8 +- target/linux/ath79/image/common-netgear.mk | 2 +- target/linux/ath79/image/common-senao.mk | 9 +- target/linux/ath79/image/common-ubnt.mk | 2 +- target/linux/ath79/image/generic-tp-link.mk | 61 +- target/linux/ath79/image/generic.mk | 420 +- .../ath79/image/lzma-loader/src/ar71xx_regs.h | 17 + .../linux/ath79/image/lzma-loader/src/board.c | 133 + target/linux/ath79/image/nand.mk | 111 +- target/linux/ath79/image/tiny-netgear.mk | 59 + target/linux/ath79/image/tiny-tp-link.mk | 498 + target/linux/ath79/image/tiny-ubnt.mk | 72 + target/linux/ath79/image/tiny.mk | 81 + .../ath79/nand/base-files/etc/board.d/01_leds | 9 + .../nand/base-files/etc/board.d/02_network | 23 +- .../base-files/etc/board.d/05_compat-version | 15 + .../etc/hotplug.d/firmware/10-ath9k-eeprom | 49 +- .../nand/base-files/etc/init.d/boot-leds | 17 + .../nand/base-files/lib/upgrade/platform.sh | 4 +- target/linux/ath79/nand/config-default | 1 + target/linux/ath79/nand/target.mk | 2 +- ...ds-add-reset-controller-based-driver.patch | 186 - .../0004-phy-add-ath79-usb-phys.patch | 333 - .../0018-MIPS-pci-ar71xx-convert-to-OF.patch | 202 - .../0020-MIPS-pci-ar724x-convert-to-OF.patch | 205 - .../0032-MIPS-ath79-sanitize-symbols.patch | 93 - .../0033-spi-ath79-drop-pdata-support.patch | 70 - .../0034-MIPS-ath79-ath9k-exports.patch | 27 - ...-MIPS-ath79-remove-irq-code-from-pci.patch | 139 - .../patches-5.10/0037-missing-registers.patch | 21 - ...S-ath79-export-UART1-reference-clock.patch | 52 - .../004-register_gpio_driver_earlier.patch | 18 - .../0040-ath79-sgmii-config.patch | 9 - ...or-use-4-bit-locking-for-MX25L12805D.patch | 33 - ...ci-ar724x-add-QCA9550-reset-sequence.patch | 130 - ...or-support-mtd-name-from-device-tree.patch | 54 - .../404-mtd-cybertan-trx-parser.patch | 27 - .../408-mtd-redboot_partition_scan.patch | 44 - ...th79-Implement-the-spi_mem-interface.patch | 68 - ...ath79-set-number-of-chipselect-lines.patch | 26 - .../420-net-use-downstream-ag71xx.patch | 28 - ...425-at803x-allow-sgmii-aneg-override.patch | 16 - .../430-drivers-link-spi-before-mtd.patch | 12 - .../440-mtd-ar934x-nand-driver.patch | 25 - ...ath79-swizzle-pci-address-for-ar71xx.patch | 98 - .../900-mdio_bitbang_ignore_ta_value.patch | 32 - ...-prevent-rescheduling-during-command.patch | 61 - .../910-unaligned_access_hacks.patch | 869 -- .../patches-5.10/920-mikrotik-rb4xx.patch | 76 - .../patches-5.10/939-mikrotik-rb91x.patch | 68 - ...ds-add-reset-controller-based-driver.patch | 186 + .../0004-phy-add-ath79-usb-phys.patch | 333 + ...005-usb-add-more-OF-quirk-properties.patch | 0 ...9-intc-add-irq-cascade-driver-for-QC.patch | 0 ...ip-irq-ath79-cpu-drop-OF-init-helper.patch | 0 ...ngs-PCI-qcom-ar7100-adds-binding-doc.patch | 0 .../0018-MIPS-pci-ar71xx-convert-to-OF.patch | 206 + ...ngs-PCI-qcom-ar7240-adds-binding-doc.patch | 0 .../0020-MIPS-pci-ar724x-convert-to-OF.patch | 213 + .../0032-MIPS-ath79-sanitize-symbols.patch | 93 + .../0034-MIPS-ath79-ath9k-exports.patch | 36 + ...-MIPS-ath79-remove-irq-code-from-pci.patch | 149 + .../patches-5.15/0037-missing-registers.patch | 20 + ...9-add-missing-QCA955x-GMAC-registers.patch | 0 ...S-ath79-export-UART1-reference-clock.patch | 67 + .../004-register_gpio_driver_earlier.patch | 26 + .../0040-ath79-sgmii-config.patch | 30 + ...ci-ar724x-add-QCA9550-reset-sequence.patch | 130 + ...or-support-mtd-name-from-device-tree.patch | 54 + ...-ar934x-fix-transfer-and-word-delays.patch | 0 ...3-v5.17-spi-ar934x-fix-transfer-size.patch | 0 .../404-mtd-cybertan-trx-parser.patch | 45 + ...th79-Implement-the-spi_mem-interface.patch | 68 + .../420-net-use-downstream-ag71xx.patch | 42 + .../430-drivers-link-spi-before-mtd.patch | 20 + .../440-mtd-ar934x-nand-driver.patch | 34 + ...ath79-swizzle-pci-address-for-ar71xx.patch | 109 + .../900-mdio_bitbang_ignore_ta_value.patch | 44 + ...-prevent-rescheduling-during-command.patch | 61 + .../910-unaligned_access_hacks.patch | 899 ++ .../patches-5.15/920-mikrotik-rb4xx.patch | 121 + .../930-ar8216-make-reg-access-atomic.patch | 0 .../patches-5.15/939-mikrotik-rb91x.patch | 97 + ...th79-add-support-for-booting-QCN550x.patch | 0 .../ath79/tiny/base-files/etc/board.d/01_leds | 130 + .../tiny/base-files/etc/board.d/02_network | 157 + .../base-files/etc/board.d/05_compat-version | 20 + .../etc/hotplug.d/firmware/10-ath9k-eeprom | 57 + .../etc/uci-defaults/04_led_migration | 16 + .../lib/upgrade/failsafe_datachk.sh | 64 + .../tiny/base-files/lib/upgrade/platform.sh | 35 + target/linux/ath79/tiny/config-default | 12 + target/linux/ath79/tiny/target.mk | 8 + ...dcode-path-to-awk-in-scripts-ld-vers.patch | 30 - .../011-kbuild-export-SUBARCH.patch | 21 - ...station-poweroff-add-missing-put_dev.patch | 27 - ...0-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch | 61 - ...a-neon-optimize-for-non-block-size-m.patch | 272 - ...a-neon-add-missing-counter-increment.patch | 38 - ...ut-frequently-used-members-above-cac.patch | 42 - ...to-define-reg_update_bits-for-no-bus.patch | 52 - ...CPU_MIPS64-for-remaining-MIPS64-CPUs.patch | 36 - ...boot-put-appended-dtb-into-a-section.patch | 36 - ...ow_offload-handle-netdevice-events-f.patch | 106 - ...convert-fixed-partitions-to-the-json.patch | 324 - ...move-partition-binding-to-its-own-fi.patch | 115 - ...d-add-binding-for-BCM4908-partitions.patch | 92 - ...art-support-BCM4908-fixed-partitions.patch | 654 - ...rt-limit-parsing-of-deprecated-DT-sy.patch | 69 - ...rt-make-symbol-bcm4908_partitions_qu.patch | 34 - ...em-cells-compatible-to-parse-mtd-as-.patch | 38 - ...ings-nvmem-drop-nodename-restriction.patch | 25 - ...Document-use-of-nvmem-cells-compatib.patch | 117 - ...add-binding-for-Linksys-Northstar-pa.patch | 98 - ...rt-support-Linksys-Northstar-partiti.patch | 156 - ...0002-Disable-buffered-writes-for-AMD.patch | 54 - ...ings-mtd-brcm-trx-Add-brcm-trx-magic.patch | 32 - ...Allow-to-specify-brcm-trx-magic-in-D.patch | 50 - ...Allow-to-use-TRX-parser-on-Mediatek-.patch | 25 - ...platform_populate-for-MTD-partitions.patch | 72 - ...ce-of-support-for-dynamic-partitions.patch | 106 - ...g-MTD-device-associated-with-a-speci.patch | 72 - ...e-check-partition-before-dereference.patch | 30 - ...sing-of_node_get-in-dynamic-partitio.patch | 101 - ...y-a-bit-code-find-partition-matching.patch | 65 - ...find-OF-node-for-every-MTD-partition.patch | 84 - ...T_DEV-for-partitions-marked-as-rootf.patch | 47 - ...TP-Link-SafeLoader-partitions-table-.patch | 229 - ...13-ubifs-default-to-zstd-compression.patch | 25 - ...pi-poll-functionality-to-__napi_poll.patch | 88 - ...threaded-able-napi-poll-loop-support.patch | 261 - ...tribute-to-control-napi-threaded-mod.patch | 177 - ...ween-napi-kthread-mode-and-busy-poll.patch | 93 - ...up-on-napi_disable-for-threaded-napi.patch | 53 - ...table-add-hash-offset-field-to-tuple.patch | 52 - ...ble-separate-replace-destroy-and-sta.patch | 98 - ...ack-Remove-unused-variable-declarati.patch | 22 - ...ble-consolidate-skb_try_make_writabl.patch | 291 - ...ble-move-skb_try_make_writable-befor.patch | 35 - ...ble-move-FLOW_OFFLOAD_DIR_MAX-away-f.patch | 82 - ...wtable-fast-NAT-functions-never-fail.patch | 394 - ...ble-call-dst_check-to-fall-back-to-c.patch | 46 - ...ble-refresh-timeout-after-dst-and-wr.patch | 49 - ...es-update-table-flags-from-the-commi.patch | 103 - ...arding-path-from-virtual-netdevice-a.patch | 170 - ...lve-forwarding-path-for-vlan-devices.patch | 80 - ...ve-forwarding-path-for-bridge-device.patch | 62 - ...ve-forwarding-path-for-VLAN-tag-acti.patch | 207 - ...forwarding-path-for-bridge-pppoe-dev.patch | 113 - ...-forwarding-path-for-dsa-slave-ports.patch | 63 - ...filter-flowtable-add-xmit-path-types.patch | 147 - ...ble-use-dev_fill_forward_path-to-obt.patch | 191 - ...ble-use-dev_fill_forward_path-to-obt.patch | 374 - ...netfilter-flowtable-add-vlan-support.patch | 410 - ...ble-add-bridge-vlan-filtering-suppor.patch | 30 - ...etfilter-flowtable-add-pppoe-support.patch | 145 - ...-netfilter-flowtable-add-dsa-support.patch | 32 - ...ter-flowtable-bridge-and-vlan-suppor.patch | 107 - ...ble-add-offload-support-for-xmit-pat.patch | 310 - ...ow_offload-use-direct-xmit-if-hardwa.patch | 114 - ...ble-bridge-vlan-hardware-offload-and.patch | 123 - ...w_offload-add-FLOW_ACTION_PPPOE_PUSH.patch | 30 - ...ble-support-for-FLOW_ACTION_PPPOE_PU.patch | 35 - ...sa-slave-add-support-for-TC_SETUP_FT.patch | 53 - ...k_eth_soc-fix-parsing-packets-in-GDM.patch | 68 - ..._eth_soc-add-support-for-initializin.patch | 1312 -- ..._eth_soc-add-flow-offloading-support.patch | 568 - ...e-update-documentation-with-enhancem.patch | 236 - ...rnet-mediatek-ppe-fix-busy-wait-loop.patch | 72 - ...iatek-fix-a-typo-bug-in-flow-offload.patch | 29 - ..._eth_soc-unmap-RX-data-before-callin.patch | 38 - ...et-mtk_eth_soc-fix-build_skb-cleanup.patch | 38 - ...net-mtk_eth_soc-use-napi_consume_skb.patch | 77 - ..._eth_soc-reduce-MDIO-bus-access-late.patch | 30 - ..._eth_soc-remove-unnecessary-TX-queue.patch | 54 - ..._eth_soc-use-larger-burst-size-for-Q.patch | 37 - ...-mtk_eth_soc-increase-DMA-ring-sizes.patch | 26 - ..._eth_soc-implement-dynamic-interrupt.patch | 313 - ..._eth_soc-cache-HW-pointer-of-last-fr.patch | 73 - ..._eth_soc-only-read-the-full-RX-descr.patch | 49 - ..._eth_soc-reduce-unnecessary-interrup.patch | 39 - ...et-mtk_eth_soc-rework-NAPI-callbacks.patch | 110 - ..._eth_soc-set-PPE-flow-hash-as-skb-ha.patch | 47 - ..._eth_soc-use-iopoll.h-macro-for-DMA-.patch | 71 - ...t-ethernet-mtk_eth_soc-missing-mutex.patch | 63 - ...t-mtk_eth_soc-handle-VLAN-pop-action.patch | 22 - ...ble-dst_check-from-garbage-collector.patch | 159 - ...ack-Introduce-tcp-offload-timeout-co.patch | 94 - ...ack-Introduce-udp-offload-timeout-co.patch | 92 - ...ble-Set-offload-timeouts-according-t.patch | 134 - ...ble-Add-FLOW_OFFLOAD_XMIT_UNSPEC-xmi.patch | 41 - ...owtable-avoid-possible-false-sharing.patch | 27 - ...wtable-move-dst_check-to-packet-path.patch | 99 - ...thernet-mediatek-support-setting-MTU.patch | 138 - ...ack-sanitize-table-size-default-sett.patch | 100 - ...table-remove-nf_ct_l4proto_find-call.patch | 47 - ...ack-remove-offload_pickup-sysctl-aga.patch | 184 - ...lter-flowtable-fix-TCP-flow-teardown.patch | 166 - ...x-select-correct-page-on-config-init.patch | 108 - ...ix-probe-error-if-copper-page-is-sel.patch | 73 - ...10-v5.12-net-phy-Add-100-base-x-mode.patch | 56 - ...-sfp-add-support-for-100-base-x-SFPs.patch | 40 - ...phy-marvell-refactor-HWMON-OOP-style.patch | 549 - ...-marvell-add-SFP-support-for-88E1510.patch | 161 - ...cally-bring-up-DSA-master-when-openi.patch | 85 - ...y-switchdev-of-disappearance-of-old-.patch | 126 - ...r-when-a-non-legacy-FDB-operation-fa.patch | 52 - ...e-switchdev_notifier_fdb_info-in-dsa.patch | 226 - ...tchdev-event-implementation-under-th.patch | 85 - ...ly-in-dsa_slave_switchdev_event-if-w.patch | 42 - ...or-SWITCHDEV_-FDB-DEL-_ADD_TO_DEVICE.patch | 264 - ...setup-core-clock-even-in-TRGMII-mode.patch | 84 - ...-mt7530-MT7530-optional-GPIO-support.patch | 181 - ...-mt7530-Add-support-for-EEE-features.patch | 120 - ...the-dst-buffer-to-of_get_mac_address.patch | 1935 --- ..._addr_nvmem-for-non-platform-devices.patch | 77 - ...andle-deferred-probe-error-due-to-ma.patch | 42 - ...platform-handle-mac-address-deferral.patch | 36 - ...k-change-simple-print-to-dev-variant.patch | 35 - ...use-iopoll-macro-for-qca8k_busy_wait.patch | 61 - ...prove-qca8k-read-write-rmw-bus-acces.patch | 86 - ...a-qca8k-handle-qca8k_set_page-errors.patch | 101 - ...ndle-error-with-qca8k_read-operation.patch | 207 - ...ndle-error-with-qca8k_write-operatio.patch | 263 - ...andle-error-with-qca8k_rmw-operation.patch | 226 - ...8k-handle-error-from-qca8k_busy_wait.patch | 66 - ...qca8k-add-support-for-qca8327-switch.patch | 96 - ...sa-qca8k-Document-new-compatible-qca.patch | 26 - ...add-priority-tweak-to-qca8337-switch.patch | 130 - ...a-qca8k-limit-port5-delay-to-qca8337.patch | 31 - ...d-GLOBAL_FC-settings-needed-for-qca8.patch | 48 - ...dsa-qca8k-add-support-for-switch-rev.patch | 114 - ...d-ethernet-ports-fallback-to-setup_m.patch | 28 - ...-qca8k-make-rgmii-delay-configurable.patch | 188 - ...clear-MASTER_EN-after-phy-read-write.patch | 50 - ...a-qca8k-protect-MASTER-busy_wait-wit.patch | 128 - ...qca8k-enlarge-mdio-delay-and-timeout.patch | 39 - ...d-support-for-internal-phy-and-inter.patch | 267 - ...ngs-dsa-qca8k-Document-internal-mdio.patch | 93 - ...prove-internal-mdio-read-write-bus-a.patch | 95 - ...ss-switch_revision-info-to-phy-dev_f.patch | 48 - ...ort-for-qca8k-switch-internal-PHY-in.patch | 229 - ...issing-unlock-on-error-in-qca8k-vlan.patch | 64 - ...eck-return-value-of-read-functions-c.patch | 348 - ...d-missing-check-return-value-in-qca8.patch | 47 - ...x-an-endian-bug-in-qca8k-get-ethtool.patch | 47 - ...eck-the-correct-variable-in-qca8k-se.patch | 31 - ...ernel-panic-with-legacy-mdio-mapping.patch | 80 - ...-Add-debug-prints-in-b53_vlan_enable.patch | 65 - ...sa-b53-spi-allow-device-tree-probing.patch | 41 - ...3-net-dsa-b53-relax-is63xx-condition.patch | 31 - ...tag_brcm-add-support-for-legacy-tags.patch | 180 - ...0005-net-dsa-b53-support-legacy-tags.patch | 53 - ...dsa-b53-mmap-Add-device-tree-support.patch | 92 - ...-spi-add-missing-MODULE_DEVICE_TABLE.patch | 27 - ...Do-not-force-CPU-to-be-always-tagged.patch | 86 - ...3-remove-redundant-null-check-on-dev.patch | 30 - ...Create-default-VLAN-entry-explicitly.patch | 71 - ...dd-support-for-qca-8327-internal-phy.patch | 48 - ...3-Include-all-ports-in-enabled_ports.patch | 131 - ...-BCM5301x-workaround-for-a-wrong-CPU.patch | 42 - ...prove-flow-control-setup-on-BCM5301x.patch | 32 - ...t-dsa-b53-Drop-unused-cpu_port-field.patch | 205 - ...t-skb-offload_fwd_mark-when-not-offl.patch | 138 - ...x-add-support-for-qca-8327-A-variant.patch | 65 - ...dd-resume-suspend-function-to-qca83x.patch | 45 - ...ix-spacing-and-improve-name-for-83xx.patch | 95 - ...hy-at803x-fix-resume-for-QCA8327-phy.patch | 131 - ...x-add-DAC-amplitude-fix-for-8327-phy.patch | 91 - ...nable-prefer-master-for-83xx-interna.patch | 27 - ...hy-at803x-better-describe-debug-regs.patch | 127 - ...et-dsa-qca8k-add-support-for-QCA8328.patch | 78 - ...vert-to-GENMASK_FIELD_PREP_FIELD_GET.patch | 508 - ...move-regmap-init-in-probe-and-set-it.patch | 46 - ...ca8k-add-additional-MIB-counter-and-.patch | 120 - ...ca8k-add-support-for-port-fast-aging.patch | 53 - ...sa-qca8k-add-set_ageing_time-support.patch | 78 - ...sa-qca8k-add-support-for-mdb_add-del.patch | 142 - ...1-net-dsa-mt7530-support-setting-MTU.patch | 112 - ...-dsa-mt7530-enable-MTU-normalization.patch | 36 - ...a-mt7530-support-setting-ageing-time.patch | 99 - ...et-dsa-mt7530-support-MDB-operations.patch | 171 - ...MediaTek-Gigabit-Ethernet-PHY-driver.patch | 159 - ...net-dsa-mt7530-add-interrupt-support.patch | 425 - ...N-filtering-syncing-out-of-dsa_switc.patch | 83 - ...cross-chip-syncing-of-VLAN-filtering.patch | 58 - ..._nvram-rename-finding-function-and-i.patch | 80 - ..._nvram-add-helper-checking-for-NVRAM.patch | 90 - ...7xx_nvram-extract-code-copying-NVRAM.patch | 80 - ..._nvram-look-for-NVRAM-with-for-inste.patch | 37 - ..._nvram-inline-code-checking-NVRAM-si.patch | 70 - ...-handling-U-Boot-environment-variabl.patch | 278 - ...-find-Device-Tree-nodes-for-NVMEM-ce.patch | 29 - ...em-u-boot-env-fix-crc32-casting-type.patch | 30 - ...support-passing-DT-node-in-cell-info.patch | 41 - ...-fix-crc32_data_offset-on-redundant-.patch | 56 - ...env-align-endianness-of-crc32-values.patch | 47 - ...boot-env-add-Broadcom-format-support.patch | 65 - ...rious-flag-to-disable-overcurrent-ch.patch | 88 - ...-platform-add-spurious_oc-DT-support.patch | 31 - ...-declare-its-reliance-on-msi-domains.patch | 34 - ...declar-their-reliance-on-msi-domains.patch | 44 - ...ertise-lack-of-built-in-msi-handling.patch | 59 - ...ialize-enable-GPIO-direction-to-outp.patch | 28 - ...-add-support-for-BCM63138-controller.patch | 371 - ...help-info-about-BCM63138-module-name.patch | 25 - ...mul-Add-description-for-class_revisi.patch | 44 - ...mul-Add-definitions-for-missing-capa.patch | 73 - ...-support-for-DEVCAP2-DEVCTL2-LNKCAP2.patch | 61 - ...ment-actions-in-driver-remove-method.patch | 34 - ...able-bus-mastering-when-unbinding-dr.patch | 41 - ...k-all-interrupts-when-unbinding-driv.patch | 48 - ...ark-Fix-memory-leak-in-driver-unbind.patch | 33 - ...k-Assert-PERST-when-unbinding-driver.patch | 33 - ...able-link-training-when-unbinding-dr.patch | 34 - ...able-common-PHY-when-unbinding-drive.patch | 30 - ...mvebu-a3700-comphy-Rename-HS-SGMMI-t.patch | 67 - ...mvebu-a3700-comphy-Remove-unsupporte.patch | 40 - ...PS-ath79-drop-_machine_restart-again.patch | 49 - ...ether-export-usbnet_cdc_zte_rx_fixup.patch | 58 - ...e-the-bogus-MAC-fixup-for-ZTE-device.patch | 118 - ...-scope-of-bogus-MAC-address-detectio.patch | 63 - ...ild-use-Wdeclaration-after-statement.patch | 73 + ...05-v5.17-02-Kbuild-move-to-std-gnu11.patch | 60 + ...-use-std-gnu11-for-KBUILD_USERCFLAGS.patch | 43 + ...-x86-arm64-add-arch_has_hw_pte_young.patch | 425 + ...dd-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch | 153 + ...-03-mm-vmscan.c-refactor-shrink_node.patch | 275 + ...inux-mm_inline.h-fold-__update_lru_s.patch | 82 + ...-v6.1-05-mm-multi-gen-LRU-groundwork.patch | 807 ++ ...multi-gen-LRU-minimal-implementation.patch | 1447 ++ ...lti-gen-LRU-exploit-locality-in-rmap.patch | 491 + ...lti-gen-LRU-support-page-table-walks.patch | 1687 +++ ...lti-gen-LRU-optimize-multiple-memcgs.patch | 315 + ...v6.1-10-mm-multi-gen-LRU-kill-switch.patch | 498 + ...m-multi-gen-LRU-thrashing-prevention.patch | 226 + ...2-mm-multi-gen-LRU-debugfs-interface.patch | 579 + ...don-t-sync-disk-for-each-aging-cycle.patch | 32 + ...-retry-pages-written-back-while-isol.patch | 124 + ...-move-lru_gen_add_mm-out-of-IRQ-off-.patch | 49 + ..._young-for-architectures-not-having-.patch | 96 + ...roduce-arch_has_hw_nonleaf_pmd_young.patch | 113 + ...RU-fix-crash-during-cgroup-migration.patch | 56 + .../020-v6.3-19-mm-add-vma_has_recency.patch | 196 + ...6.3-20-mm-support-POSIX_FADV_NOREUSE.patch | 125 + ...-rename-lru_gen_struct-to-lru_gen_pa.patch | 348 + ...-rename-lrugen-lists-to-lrugen-pages.patch | 162 + ...U-remove-eviction-fairness-safeguard.patch | 188 + ...-LRU-remove-aging-fairness-safeguard.patch | 287 + ...lti-gen-LRU-shuffle-should_run_aging.patch | 161 + ...-gen-LRU-per-node-lru_gen_page-lists.patch | 868 ++ ...i-gen-LRU-clarify-scan_control-flags.patch | 196 + ...-simplify-arch_has_hw_pte_young-chec.patch | 34 + ...m-multi-gen-LRU-avoid-futile-retries.patch | 88 + ...-uasm-Enable-muhu-opcode-for-MIPS-R6.patch | 0 ...rkaround-for-Loongson-2F-nop-CPU-err.patch | 0 ...ips-bpf-Add-eBPF-JIT-for-32-bit-MIPS.patch | 0 ...bpf-Add-new-eBPF-JIT-for-64-bit-MIPS.patch | 0 ...f-Add-JIT-workarounds-for-CPU-errata.patch | 0 ...0-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch | 61 + ...f-Remove-old-BPF-JIT-implementations.patch | 0 ...d-helpers-to-directly-use-the-capget.patch | 123 + ...move-libcap-usage-from-test_verifier.patch | 188 + ...-Remove-libcap-usage-from-test_progs.patch | 122 + ...k-gate-Add-devm_clk_hw_register_gate.patch | 105 + ...to-define-reg_update_bits-for-no-bus.patch | 52 + ...63xx-use-more-precise-Kconfig-symbol.patch | 37 + ...resolve_btfids-Build-with-host-flags.patch | 49 + ...te-to-upstream-version-v1.6.1-19-g0a.patch | 997 ++ ...or-setting-affinity-if-no-IRQ-parent.patch | 48 + ...-Support-reserved-memory-description.patch | 166 + ...-bcm63xx_wdt-fix-fallthrough-warning.patch | 33 + ...kernel-proc-add-CPU-option-reporting.patch | 162 + ...mp_processor_id-in-preemptible-in-sh.patch | 62 + ...spinand-Add-support-for-XTX-XT26G0xA.patch | 186 + ...mvebu-a3700-comphy-Remove-port-from-.patch | 219 + ...mvebu-a3700-comphy-Add-native-kernel.patch | 1552 +++ ...l-armada-37xx-Add-xtal-clock-to-comp.patch | 32 + ...mvebu-Make-SATA-PHY-optional-for-Arm.patch | 64 + ...xhci-mvebu-make-USB-3.0-PHY-optional.patch | 166 + ...ark-Fix-initialization-with-old-Marv.patch | 39 + ...mvebu-a3700-comphy-Remove-broken-res.patch | 194 + ...configurable-downshift-for-addresses.patch | 90 + ...efined-reg_base-to-be-added-to-every.patch | 95 + ..._base-and-reg_downshift-for-single-r.patch | 57 + ...platform_populate-for-MTD-partitions.patch | 72 + ...s-add-support-for-Sercomm-partitions.patch | 302 + ...ce-of-support-for-dynamic-partitions.patch | 106 + ...g-MTD-device-associated-with-a-speci.patch | 72 + ...e-check-partition-before-dereference.patch | 30 + ...sing-of_node_get-in-dynamic-partitio.patch | 101 + ...y-a-bit-code-find-partition-matching.patch | 65 + ...find-OF-node-for-every-MTD-partition.patch | 84 + ...-Don-t-print-error-message-on-EPROBE.patch | 32 + ...T_DEV-for-partitions-marked-as-rootf.patch | 47 + ...-allow-to-use-on-MediaTek-MIPS-SoCs.patch} | 0 ...device-add-support-for-GD5FxGQ4xExxG.patch | 58 + ...device-add-support-for-GD5F1GQ5RExxG.patch | 33 + ...device-add-support-for-GD5F-2-4-GQ5x.patch | 84 + ...device-add-support-for-GD5FxGM7xExxG.patch | 91 + ...TP-Link-SafeLoader-partitions-table-.patch | 229 + ...9-mtd-spi-nor-support-eon-en25qh256a.patch | 49 + ...m-number-of-bitflips-for-each-read-r.patch | 73 + ...itialize-stats-in-struct-mtd_oob_ops.patch | 325 + ...ror-accounting-for-each-read-request.patch | 172 + ...-v6.1-0004-mtdchar-add-MEMREAD-ioctl.patch | 321 + ...onix-use-scratch-buffer-for-DMA-oper.patch | 35 + ...-mtd_otp_nvmem_add-to-handle-EPROBE_.patch | 47 + ...v5.18-page_pool-Add-allocation-stats.patch | 165 + ...01-v5.18-page_pool-Add-recycle-stats.patch | 140 + ...d-function-to-batch-and-return-stats.patch | 77 + ...cycle-stats-to-page_pool_put_page_bu.patch | 55 + ...et-page_pool-introduce-ethtool-stats.patch | 147 + ...ce-flags-field-in-xdp_buff-xdp_frame.patch | 99 + ...gs-support-to-xdp_return_-buff-frame.patch | 137 + ...ize-metadata-to-skb_shared_info-for-.patch | 31 + ...-total-xdp_frame-len-running-ndo_xdp.patch | 65 + ...-veth-Allow-jumbo-frames-in-xdp-mode.patch | 40 + ...611-v6.3-net-add-helper-eth_addr_add.patch | 41 + ...uce-tagger-owned-storage-for-private.patch | 279 + ...ocols-connect-to-individual-switches.patch | 274 + ..._eth_soc-add-support-for-coherent-DM.patch | 327 + ...ek-mt7622-add-support-for-coherent-D.patch | 30 + ..._eth_soc-add-support-for-Wireless-Et.patch | 1679 +++ ..._eth_soc-implement-flow-offloading-t.patch | 269 + ...ek-mt7622-introduce-nodes-for-Wirele.patch | 62 + ..._eth_soc-add-ipv6-flow-offload-suppo.patch | 79 + ...eth_soc-support-TC_SETUP_BLOCK-for-.patch} | 0 ..._eth_soc-allocate-struct-mtk_ppe-sep.patch | 159 + ..._eth_soc-rework-hardware-flow-table-.patch | 424 + ...eth_soc-remove-bridge-flow-offload-.patch} | 0 ..._eth_soc-support-creating-mac-addres.patch | 553 + ..._eth_soc-wed-fix-sparse-endian-warni.patch | 56 + ..._eth_soc-fix-return-value-check-in-m.patch | 25 + ..._eth_soc-use-standard-property-for-c.patch | 35 + ..._eth_soc-use-after-free-in-__mtk_ppe.patch | 33 + ..._eth_soc-add-check-for-allocation-fa.patch | 22 + ...silence-the-GCC-12-array-bounds-warn.patch | 26 + ..._eth_soc-rely-on-GFP_KERNEL-for-dma_.patch | 52 + ..._eth_soc-move-tx-dma-desc-configurat.patch | 206 + ..._eth_soc-add-txd_size-to-mtk_soc_dat.patch | 167 + ..._eth_soc-rely-on-txd_size-in-mtk_tx_.patch | 78 + ..._eth_soc-rely-on-txd_size-in-mtk_des.patch | 109 + ..._eth_soc-rely-on-txd_size-in-txd_to_.patch | 39 + ..._eth_soc-add-rxd_size-to-mtk_soc_dat.patch | 102 + ..._eth_soc-rely-on-txd_size-field-in-m.patch | 46 + ..._eth_soc-rely-on-rxd_size-field-in-m.patch | 68 + ..._eth_soc-introduce-device-register-m.patch | 814 ++ ..._eth_soc-introduce-MTK_NETSYS_V2-sup.patch | 917 ++ ..._eth_soc-convert-ring-dma-pointer-to.patch | 135 + ..._eth_soc-convert-scratch_ring-pointe.patch | 33 + ..._eth_soc-introduce-support-for-mt798.patch | 138 + ..._eth_soc-fix-error-code-in-mtk_flow_.patch | 25 + ..._eth_soc-enable-rx-cksum-offload-for.patch | 47 + ...19-34-eth-mtk_ppe-fix-up-after-merge.patch | 28 + ...-users-of-bitmap_foo-to-linkmode_foo.patch | 948 ++ ...ylink-add-MAC-phy_interface_t-bitmap.patch | 24 + ...supported_interfaces-for-phylink-val.patch | 98 + ...populate-supported_interfaces-member.patch | 63 + ...net-dsa-consolidate-phylink-creation.patch | 149 + ...phylink_get_interfaces-with-phylink_.patch | 51 + ...d-support-for-phylink-mac_select_pcs.patch | 59 + ...y-add-phy_interface_t-bitmap-support.patch | 61 + ...mac_select_pcs-method-to-phylink_mac.patch | 197 + ...-add-generic-validate-implementation.patch | 341 + ...-net-phylink-add-pcs_validate-method.patch | 106 + ...k-add-legacy_pre_march2020-indicator.patch | 43 + ...-DSA-phylink-as-legacy_pre_march2020.patch | 36 + ...net-phylink-use-legacy_pre_march2020.patch | 115 + ...-fix-DSA-mac_select_pcs-introduction.patch | 88 + ...populate-supported_interfaces-member.patch | 48 + ...e-interface-checks-in-mvneta_validat.patch | 35 + ...op-use-of-phylink_helper_basex_speed.patch | 55 + ...-mvneta-use-phylink_generic_validate.patch | 72 + ...ark-as-a-legacy_pre_march2020-driver.patch | 29 + ...populate-supported_interfaces-member.patch | 43 + ...remove-interface-checks-in-mtk_valid.patch | 75 + ...drop-use-of-phylink_helper_basex_spe.patch | 42 + ...eth_soc-use-phylink_generic_validate.patch | 84 + ...mark-as-a-legacy_pre_march2020-drive.patch | 29 + ...remove-a-copy-of-the-NAPI_POLL_WEIGH.patch | 40 + ...9-mtk_eth_soc-remove-unused-mac-mode.patch | 35 + ...tk_eth_soc-remove-unused-sgmii-flags.patch | 40 + ...add-mask-and-update-PCS-speed-defini.patch | 40 + ...eth_soc-correct-802.3z-speed-setting.patch | 60 + ...th_soc-correct-802.3z-duplex-setting.patch | 101 + ...stop-passing-phylink-state-to-sgmii-.patch | 60 + ...mtk_eth_soc-provide-mtk_sgmii_config.patch | 89 + ...add-fixme-comment-for-state-speed-us.patch | 38 + ...c-move-MAC_MCR-setting-to-mac_finish.patch | 79 + ...move-restoration-of-SYSCFG0-to-mac_f.patch | 57 + ...convert-code-structure-to-suit-split.patch | 254 + ...soc-partially-convert-to-phylink_pcs.patch | 262 + ...terate-using-dsa_switch_for_each_use.patch | 106 + ...opulate-supported_interfaces-and-mac.patch | 166 + ...t-dsa-mt7530-remove-interface-checks.patch | 172 + ...rop-use-of-phylink_helper_basex_spee.patch | 34 + ...nly-indicate-linkmodes-that-can-be-s.patch | 86 + ...-switch-to-use-phylink_get_linkmodes.patch | 131 + ...530-partially-convert-to-phylink_pcs.patch | 385 + ...ove-autoneg-handling-to-PCS-validati.patch | 80 + ...19-net-dsa-mt7530-mark-as-non-legacy.patch | 34 + ...mt753x-fix-pcs-conversion-regression.patch | 116 + ...t7530-rework-mt7530_hw_vlan_-add-del.patch | 87 + ...et-cpu-port-via-dp-cpu_dp-instead-of.patch | 117 + ..._eth_soc-rely-on-page_pool-for-singl.patch | 330 + ...et-mtk_eth_soc-add-basic-XDP-support.patch | 291 + ..._eth_soc-introduce-xdp-ethtool-count.patch | 110 + ...net-mtk_eth_soc-add-xmit-XDP-support.patch | 340 + ..._eth_soc-add-support-for-page_pool_g.patch | 95 + ..._eth_soc-introduce-mtk_xdp_frame_map.patch | 113 + ..._eth_soc-introduce-xdp-multi-frag-su.patch | 218 + ...cs-add-driver-for-MediaTek-SGMII-PCS.patch | 394 + ...16-net-mvneta-Delete-unused-variable.patch | 62 + ...otential-double-frees-in-mvneta_txq_.patch | 37 + ..._eth_soc-fix-hw-hash-reporting-for-M.patch | 74 + ..._eth_soc-fix-off-by-one-check-of-ARR.patch | 31 + ..._ppe-fix-possible-NULL-pointer-deref.patch | 27 + ...-ppe-fix-traffic-offload-with-bridge.patch | 64 + ..._eth_soc-remove-mtk_foe_entry_timest.patch | 33 + ..._eth_soc-enable-XDP-support-just-for.patch | 35 + ..._eth_soc-move-gdma_to_ppe-and-ppe_ba.patch | 127 + ..._eth_soc-move-ppe-table-hash-offset-.patch | 199 + ..._eth_soc-add-the-capability-to-run-m.patch | 318 + ..._eth_soc-move-wdma_base-definitions-.patch | 80 + ..._eth_soc-add-foe_entry_size-to-mtk_e.patch | 251 + ..._eth_soc-fix-typo-in-__mtk_foe_entry.patch | 27 + ..._eth_soc-check-max-allowed-value-in-.patch | 28 + ..._eth_wed-add-mtk_wed_configure_irq-a.patch | 189 + ..._eth_wed-add-wed-support-for-mt7986-.patch | 942 ++ ...rnet-mtk_eth_wed-add-axi-bus-support.patch | 237 + ..._eth_soc-introduce-flow-offloading-s.patch | 882 ++ ..._eth_soc-enable-flow-offloading-supp.patch | 26 + ..._eth_soc-fix-wrong-use-of-new-helper.patch | 46 + ..._eth_soc-fix-usage-of-foe_entry_size.patch | 49 + ..._eth_soc-fix-mask-of-RX_DMA_GET_SPOR.patch | 32 + ..._eth_soc-fix-state-in-__mtk_foe_entr.patch | 37 + ..._eth_soc-fix-possible-memory-leak-in.patch | 73 + ..._eth_wed-add-missing-put_device-in-m.patch | 47 + ...-mtk_eth_wed-add-missing-of_node_put.patch | 43 + ..._eth_soc-fix-resource-leak-in-error-.patch | 35 + ..._eth_soc-fix-memory-leak-in-error-pa.patch | 107 + ...et-mtk_wed-introduce-wed-mcu-support.patch | 591 + ...net-mtk_wed-introduce-wed-wo-support.patch | 737 + ..._wed-rename-tx_wdma-array-in-rx_wdma.patch | 79 + ...mtk_wed-add-configure-wed-wo-support.patch | 1521 +++ ...ethernet-mtk_wed-add-rx-mib-counters.patch | 149 + ..._eth_soc-do-not-overwrite-mtu-config.patch | 98 + ..._eth_soc-remove-cpu_relax-in-mtk_pen.patch | 36 + ..._eth_soc-fix-RSTCTRL_PPE-0-1-definit.patch | 63 + ..._wed-add-wcid-overwritten-support-fo.patch | 80 + ..._wed-return-status-value-in-mtk_wdma.patch | 85 + ..._wed-move-MTK_WDMA_RESET_IDX_TX-conf.patch | 52 + ...ethernet-mtk_wed-update-mtk_wed_stop.patch | 98 + ...mtk_wed-add-mtk_wed_rx_reset-routine.patch | 309 + ..._wed-add-reset-to-tx_ring_setup-call.patch | 103 + ..._wed-fix-sleep-while-atomic-in-mtk_w.patch | 103 + ..._wed-get-rid-of-queue-lock-for-rx-qu.patch | 52 + ..._wed-get-rid-of-queue-lock-for-tx-qu.patch | 75 + ..._eth_soc-introduce-mtk_hw_reset-util.patch | 70 + ..._eth_soc-introduce-mtk_hw_warm_reset.patch | 107 + ..._eth_soc-align-reset-procedure-to-ve.patch | 262 + ..._eth_soc-add-dma-checks-to-mtk_hw_re.patch | 249 + ..._wed-add-reset-reset_complete-callba.patch | 124 + ..._wed-add-reset-to-rx_ring_setup-call.patch | 106 + ..._eth_soc-account-for-vlan-in-rx-head.patch | 22 + ..._eth_soc-increase-tx-ring-side-for-Q.patch | 143 + ..._eth_soc-avoid-port_mg-assignment-on.patch | 52 + ..._eth_soc-implement-multi-queue-suppo.patch | 654 + ...t-dsa-tag_mtk-assign-per-port-queues.patch | 20 + ...iatek-ppe-assign-per-port-queues-for.patch | 93 + ...ort-for-DSA-rx-offloading-via-metada.patch | 72 + ..._eth_soc-fix-VLAN-rx-hardware-accele.patch | 192 + ..._eth_soc-drop-packets-to-WDMA-if-the.patch | 37 + ..._eth_soc-disable-hardware-DSA-untagg.patch | 42 + ..._eth_soc-enable-special-tag-when-any.patch | 54 + ..._eth_soc-fix-DSA-TX-tag-hwaccel-for-.patch | 129 + ..._wed-No-need-to-clear-memory-after-a.patch | 26 + ..._wed-fix-some-possible-NULL-pointer-.patch | 61 + ..._wed-fix-possible-deadlock-if-mtk_we.patch | 58 + ..._eth_soc-fix-tx-throughput-regressio.patch | 31 + ..._eth_soc-Avoid-truncating-allocation.patch | 60 + ...-mtk_eth_soc-add-definitions-for-PCS.patch | 55 + ...eliminate-unnecessary-error-handling.patch | 74 + ...soc-add-pcs_get_state-implementation.patch | 46 + ...convert-mtk_sgmii-to-use-regmap_upda.patch | 130 + ...add-out-of-band-forcing-of-speed-and.patch | 52 + ...07-net-mtk_eth_soc-move-PHY-power-up.patch | 48 + ...h_soc-move-interface-speed-selection.patch | 48 + ...th_soc-add-advertisement-programming.patch | 52 + ...move-and-correct-link-timer-programm.patch | 63 + ...add-support-for-in-band-802.3z-negot.patch | 132 + ...ii-ensure-the-SGMII-PHY-is-powered-d.patch | 119 + ...iatek-sgmii-fix-duplex-configuration.patch | 52 + ...enable-PCS-polling-to-allow-SFP-work.patch | 33 + ...ethernet-mtk_eth_soc-reset-PCS-state.patch | 48 + ..._eth_soc-only-write-values-if-needed.patch | 103 + ...t-mtk_eth_soc-add-support-for-MT7981.patch | 200 + ..._eth_soc-set-MDIO-bus-clock-frequenc.patch | 76 + ..._eth_soc-switch-to-external-PCS-driv.patch | 512 + ..._eth_soc-add-missing-ppe-cache-flush.patch | 21 + ...k_eth_soc-use-WO-firmware-for-MT7981.patch | 46 + ..._eth_soc-fix-NULL-pointer-dereferenc.patch | 28 + ..._eth_soc-ppe-add-support-for-flow-ac.patch | 428 + ...iatek-fix-ppe-flow-accounting-for-v1.patch | 51 + ..._eth_soc-drop-generic-vlan-rx-offloa.patch | 201 + ..._eth_soc-always-mtk_get_ib1_pkt_type.patch | 31 + ...-0001-net-bgmac-improve-handling-PHY.patch | 0 ...t-bgmac-support-MDIO-described-in-DT.patch | 0 ...dd-support-for-qca-8327-internal-phy.patch | 48 + ...3-Include-all-ports-in-enabled_ports.patch | 131 + ...-BCM5301x-workaround-for-a-wrong-CPU.patch | 42 + ...prove-flow-control-setup-on-BCM5301x.patch | 32 + ...t-dsa-b53-Drop-unused-cpu_port-field.patch | 205 + ...x-add-support-for-qca-8327-A-variant.patch | 65 + ...dd-resume-suspend-function-to-qca83x.patch | 45 + ...ix-spacing-and-improve-name-for-83xx.patch | 95 + ...hy-at803x-fix-resume-for-QCA8327-phy.patch | 131 + ...x-add-DAC-amplitude-fix-for-8327-phy.patch | 91 + ...nable-prefer-master-for-83xx-interna.patch | 27 + ...hy-at803x-better-describe-debug-regs.patch | 127 + ...-dsa-qca8k-add-mac-power-sel-support.patch | 0 ...dsa-qca8k-Add-SGMII-clock-phase-prop.patch | 0 ...k-add-support-for-sgmii-falling-edge.patch | 0 ...dsa-qca8k-Document-support-for-CPU-p.patch | 0 ...dsa-qca8k-add-support-for-cpu-port-6.patch | 0 ...work-rgmii-delay-logic-and-scan-for-.patch | 0 ...dsa-qca8k-Document-qca-sgmii-enable-.patch | 0 ...-qca8k-add-explicit-SGMII-PLL-enable.patch | 0 ...dsa-qca8k-Document-qca-led-open-drai.patch | 0 ...qca8k-add-support-for-pws-config-reg.patch | 0 ...dsa-qca8k-document-support-for-qca83.patch | 0 ...et-dsa-qca8k-add-support-for-QCA8328.patch | 78 + ...8k-set-internal-delay-also-for-sgmii.patch | 0 ...move-port-config-to-dedicated-struct.patch | 0 ...ipq8064-mdio-fix-warning-with-new-qc.patch | 0 ...net-dsa-qca8k-convert-to-YAML-schema.patch | 0 ...elay-applied-to-wrong-cpu-in-parse-p.patch | 0 ...for-loop-in-setup-and-add-cpu-port-c.patch | 0 ...sure-pad0-mac06-exchange-is-disabled.patch | 0 ..._ppe-add-MTK_FOE_ENTRY_V-1-2-_SIZE-m.patch | 78 + ..._eth_soc-remove-incorrect-PLL-config.patch | 141 + ..._eth_soc-remove-mac_pcs_get_state-an.patch | 81 + ..._eth_soc-add-version-in-mtk_soc_data.patch | 550 + ...t-mtk_eth_soc-increase-MAX_DEVS-to-3.patch | 29 + ..._eth_soc-rely-on-MTK_MAX_DEVS-and-re.patch | 186 + ..._eth_soc-add-NETSYS_V3-version-suppo.patch | 307 + ..._eth_soc-convert-caps-in-mtk_soc_dat.patch | 193 + ..._eth_soc-convert-clock-bitmap-to-u64.patch | 132 + ..._eth_soc-add-basic-support-for-MT798.patch | 477 + ..._eth_soc-enable-page_pool-support-fo.patch | 27 + ..._eth_soc-enable-nft-hw-flowtable_off.patch | 135 + ..._eth_soc-support-per-flow-accounting.patch | 78 + ..._eth_soc-fix-NULL-pointer-on-hw-rese.patch | 52 + ..._eth_soc-fix-register-definitions-fo.patch | 44 + ...tk_eth_soc-add-reset-bits-for-MT7988.patch | 188 + ..._eth_soc-add-support-for-in-SoC-SRAM.patch | 254 + ..._eth_soc-support-36-bit-DMA-addressi.patch | 166 + ...ernal-delay-applied-to-the-wrong-PAD.patch | 0 ...16-net-dsa-qca8k-fix-MTU-calculation.patch | 0 ...edundant-check-in-parse_port_config.patch} | 0 ...vert-to-GENMASK_FIELD_PREP_FIELD_GET.patch | 507 + ...ove-extra-mutex_init-in-qca8k_setup.patch} | 0 ...move-regmap-init-in-probe-and-set-it.patch | 46 + ...-initial-conversion-to-regmap-heper.patch} | 0 ...ca8k-add-additional-MIB-counter-and-.patch | 120 + ...ca8k-add-support-for-port-fast-aging.patch | 53 + ...sa-qca8k-add-set_ageing_time-support.patch | 78 + ...sa-qca8k-add-support-for-mdb_add-del.patch | 142 + ...sa-qca8k-add-support-for-mirror-mode.patch | 155 + ...t-next-net-dsa-qca8k-add-LAG-support.patch | 288 + ...dsa-qca8k-fix-warning-in-LAG-feature.patch | 40 + ...PHY-initialization-with-MTU-setup-in.patch | 52 + ...nl_lock-sections-in-dsa_slave_create.patch | 34 + ...op-updating-master-MTU-from-master.c.patch | 91 + ...l_mutex-when-calling-dsa_master_-set.patch | 78 + ...t-up-shared-ports-then-non-shared-po.patch | 118 + ...xt-net-dsa-setup-master-before-ports.patch | 115 + ...switch-operations-for-tracking-the-m.patch | 254 + ...aster-state-events-in-dsa_tree_-setu.patch | 89 + ...t-dsa-tag_qca-convert-to-FIELD-macro.patch | 86 + ...qca-move-define-to-include-linux-dsa.patch | 71 + ...ag_qca-enable-promisc_on_master-flag.patch | 27 + ...add-define-for-handling-mgmt-Etherne.patch | 110 + ...a-add-define-for-handling-MIB-packet.patch | 45 + ...add-support-for-handling-mgmt-and-MI.patch | 116 + ...8k-add-tracking-state-of-master-port.patch | 67 + ...d-support-for-mgmt-read-write-in-Eth.patch | 363 + ...d-support-for-mib-autocast-in-Ethern.patch | 226 + ...d-support-for-phy-read-write-with-mg.patch | 287 + ...qca8k-move-page-cache-to-driver-priv.patch | 208 + ...qca8k-cache-lo-and-hi-for-mdio-write.patch | 164 + ...d-support-for-larger-read-write-size.patch | 206 + ...troduce-qca8k_bulk_read-write-functi.patch | 104 + ...eck-correct-variable-in-qca8k_phy_et.patch | 28 + ...dsa-qca8k-fix-noderef.cocci-warnings.patch | 34 + ...8k-drop-MTU-tracking-from-qca8k_priv.patch | 79 + ...-qca8k-drop-port_sts-from-qca8k_priv.patch | 116 + ...8k-rework-and-simplify-mdiobus-logic.patch | 173 + ...-drop-dsa_switch_ops-from-qca8k_priv.patch | 39 + ...a8k-correctly-handle-mdio-read-error.patch | 33 + ...ify-bus-id-naming-with-legacy-and-OF.patch | 44 + ...net-dsa-qca8k-move-driver-to-qca-dir.patch | 7389 ++++++++++ ...-cache-match-data-to-speed-up-access.patch | 157 + ...k-make-mib-autocast-feature-optional.patch | 77 + ...qca8k-move-mib-struct-to-common-code.patch | 6532 +++++++++ ...ve-qca8k-read-write-rmw-and-reg-tabl.patch | 135 + ...ve-qca8k-bulk-read-write-helper-to-c.patch | 145 + ...ove-mib-init-function-to-common-code.patch | 137 + ...ve-port-set-status-eee-ethtool-stats.patch | 281 + ...move-bridge-functions-to-common-code.patch | 237 + ...ve-set-age-MTU-port-enable-disable-f.patch | 227 + ...ve-port-FDB-MDB-function-to-common-c.patch | 704 + ...ve-port-mirror-functions-to-common-c.patch | 232 + ...ve-port-VLAN-functions-to-common-cod.patch | 448 + ...ve-port-LAG-functions-to-common-code.patch | 384 + ...ve-read_switch_id-function-to-common.patch | 102 + ...x-NULL-pointer-dereference-for-of_de.patch | 29 + ...N-filtering-syncing-out-of-dsa_switc.patch | 77 + ...cross-chip-syncing-of-VLAN-filtering.patch | 52 + ...-rtl8366rb-Support-bridge-offloading.patch | 141 + ...-dsa-rtl8366-Drop-custom-VLAN-set-up.patch | 118 + ...b-Rewrite-weird-VLAN-filering-enable.patch | 270 + ...-Drop-and-depromote-pointless-prints.patch | 51 + ...tl8366rb-Use-core-filtering-tracking.patch | 61 + ...rtl8366rb-Support-disabling-learning.patch | 115 + ...net-dsa-rtl8366rb-Support-fast-aging.patch | 57 + ...-rtl8366rb-Support-setting-STP-state.patch | 107 + ...icro-stmmac-move-queue-reset-to-dedi.patch | 142 + ...icro-stmmac-first-disable-all-queues.patch | 37 + ...icro-stmmac-move-dma-conf-to-dedicat.patch | 1289 ++ ...icro-stmmac-generate-stmmac-dma-conf.patch | 1161 ++ ...icro-stmmac-permit-MTU-change-with-i.patch | 73 + ...x-inband-mgmt-for-big-endian-systems.patch | 156 + ...x-ethtool-autocast-mib-for-big-endia.patch | 81 + ...x-wrong-length-value-for-mgmt-eth-pa.patch | 102 + ...sa-tag_qca-fix-wrong-MGMT_DATA2-size.patch | 34 + ...qca8k-cache-lo-and-hi-for-mdio-write.patch | 172 + ...ntroduce-single-mii-read-write-lo-hi.patch | 150 + ...prove-mdio-master-read-write-by-usin.patch | 73 + ...-01-net-phy-at803x-add-fiber-support.patch | 193 + ...y-at803x-support-downstream-SFP-cage.patch | 95 + ...LL-pointer-dereference-on-AR9331-PHY.patch | 56 + ...ix-error-return-code-in-at803x_probe.patch | 31 + ...eric-Introduce-Sierra-EM919X-support.patch | 80 + ...ost-always-print-detected-modem-name.patch | 37 + ...-add-support-for-in-band-link-status.patch | 130 + ...e-implement-soft-state-polling-setup.patch | 98 + ...t-sfp-move-quirk-handling-into-sfp.c.patch | 291 + ...move-Alcatel-Lucent-3FE46541AA-fixup.patch | 69 + ....1-net-sfp-move-Huawei-MA5671A-fixup.patch | 48 + ...t-sfp-add-support-for-HALNy-GPON-SFP.patch | 79 + ...t-dsa-mt7530-use-external-PCS-driver.patch | 514 + ...k-enabling-2500Base-x-for-HG-MXPD-48.patch | 37 + ....0-net-mii-add-mii_bmcr_encode_fixed.patch | 55 + ...ake-some-noise-if-register-read-fail.patch | 32 + ...a-mt7530-refactor-SGMII-PCS-creation.patch | 111 + ...mt7530-use-unlocked-regmap-accessors.patch | 74 + ...se-regmap-to-access-switch-register-.patch | 224 + ...ove-SGMII-PCS-creation-to-mt7530_pro.patch | 54 + ...t-dsa-mt7530-introduce-mutex-helpers.patch | 273 + ...ove-p5_intf_modes-function-to-mt7530.patch | 75 + ...ntroduce-mt7530_probe_common-helper-.patch | 155 + ...ntroduce-mt7530_remove_common-helper.patch | 55 + ...t7530-introduce-separate-MDIO-driver.patch | 692 + ...kip-locking-if-MDIO-bus-isn-t-presen.patch | 47 + ...ntroduce-driver-for-MT7988-built-in-.patch | 421 + ...-dsa-mt7530-fix-support-for-MT7531BE.patch | 118 + ...or-Motorcomm-yt8521-gigabit-ethernet.patch | 1724 +++ ...fix-yt8521-duplicated-argument-to-or.patch | 49 + ...net-phy-add-Motorcomm-YT8531S-phy-id.patch | 140 + ...fix-the-spelling-problem-of-Sentinel.patch | 26 + ...nge-the-phy-id-of-yt8521-and-yt8531s.patch | 29 + ...-for-Motorcomm-yt8521-yt8531-gigabit.patch | 107 + ...support-for-Motorcomm-yt8521-gigabit.patch | 343 + ...upport-for-Motorcomm-yt8531s-gigabit.patch | 100 + ...or-Motorcomm-yt8531-gigabit-ethernet.patch | 302 + ...motorcomm-uninitialized-variables-in.patch | 34 + ...ble-PCS-polling-over-major-configura.patch | 81 + ...NULL-pl-pcs-dereference-during-phyli.patch | 38 + ...k-add-pcs_enable-pcs_disable-methods.patch | 172 + ...2-mac-add-support-for-more-10G-modes.patch | 34 + ...t-pcs-lynxi-implement-pcs_disable-op.patch | 44 + ...ive-renaming-when-an-interface-is-up.patch | 136 + ...net-usb-ax88179_178a-add-TSO-feature.patch | 68 + ...uirk-for-Fiberstone-GPON-ONU-34-20BI.patch | 34 + ...-add-Broadcom-s-BCM63138-controller.patch} | 0 ...-add-support-for-BCM63138-controller.patch | 356 + ...leds-bcm63138-unify-full-stops-in-d.patch} | 0 ...help-info-about-BCM63138-module-name.patch | 28 + ...ds-leds-bcm63138-get-rid-of-LED_OFF.patch} | 0 ...-rework-nvmem-cell-instance-creation.patch | 456 + ...-nvmem-cell-post-processing-callback.patch | 82 + ...cotp-add-support-for-post-processing.patch | 92 + ...support-minimum-one-byte-access-stri.patch | 47 + ...-Remove-unused-devm_nvmem_unregister.patch | 72 + ...em-core-Use-devm_add_action_or_reset.patch | 58 + ...-input-parameter-for-NULL-in-nvmem_u.patch | 30 + ...4-nvmem-qfprom-fix-kerneldoc-warning.patch | 29 + ...sunxi_sid-Add-support-for-D1-variant.patch | 38 + ...fuse-replace-unnecessary-devm_kstrdu.patch | 28 + ...-for-Layerscape-SFP-Security-Fuse-Pr.patch | 139 + ...rease-fuse-blow-timeout-to-prevent-w.patch | 32 + ...d-driver-for-OCOTP-in-Sunplus-SP7021.patch | 291 + ...-parse-NVRAM-content-into-NVMEM-cell.patch | 146 + ...mark-ACPI-device-ID-table-as-maybe-u.patch | 32 + ...em-sunplus-ocotp-staticize-sp_otp_v0.patch | 30 + ...cotp-drop-useless-probe-confirmation.patch | 27 + ...support-passing-DT-node-in-cell-info.patch | 41 + ...-find-Device-Tree-nodes-for-NVMEM-ce.patch | 38 + ...19-0006-nvmem-Add-Apple-eFuse-driver.patch | 130 + ...ng-pm_runtime_resume_and_get-instead.patch | 31 + .../805-v5.19-0008-nvmem-sfp-Use-regmap.patch | 109 + ...m-sfp-Add-support-for-TA-2.1-devices.patch | 38 + ...001-nvmem-microchip-otpc-add-support.patch | 389 + ...Simplify-with-devm_platform_get_and_.patch | 32 + ...-handling-U-Boot-environment-variabl.patch | 286 + ...-Use-kzalloc-for-allocating-only-one.patch | 29 + ...nvmem-prefix-all-symbols-with-NVMEM_.patch | 281 + ...m-sort-config-symbols-alphabetically.patch | 535 + ...-find-Device-Tree-nodes-for-NVMEM-ce.patch | 31 + ...1-0008-nvmem-lan9662-otp-add-support.patch | 274 + ...em-u-boot-env-fix-crc32-casting-type.patch | 32 + ...em-lan9662-otp-Fix-compatible-string.patch | 34 + ...-fix-crc32_data_offset-on-redundant-.patch | 59 + ...p-Change-return-type-of-lan9662_otp_.patch | 35 + ...e-STM32MP15_BSEC_NUM_LOWER-in-config.patch | 82 + ...-warning-when-upper-OTPs-are-updated.patch | 34 + ...nvmem-stm32-add-nvmem-type-attribute.patch | 26 + ...m-stm32-fix-spelling-typo-in-comment.patch | 27 + ...x-spelling-mistake-controlls-control.patch | 27 + ...boot-env-add-Broadcom-format-support.patch | 67 + ...mem-brcm_nvram-Add-check-for-kzalloc.patch | 30 + ...nxi_sid-Always-use-32-bit-MMIO-reads.patch | 55 + ...mem-core-fix-device-node-refcounting.patch | 48 + ...mem-core-remove-spurious-white-space.patch | 26 + ...e-add-an-index-parameter-to-the-cell.patch | 180 + ...struct-nvmem_cell_info-to-nvmem-prov.patch | 78 + ...the-removal-of-the-cells-in-nvmem_ad.patch | 65 + ...05-nvmem-core-add-nvmem_add_one_cell.patch | 122 + ...vmem_add_one_cell-in-nvmem_add_cells.patch | 93 + ...32-add-OP-TEE-support-for-STM32MP13x.patch | 562 + ...ect-bsec-pta-presence-for-STM32MP15x.patch | 85 + ...eprm-fix-kernel-doc-bad-line-warning.patch | 32 + ...mi-sdam-register-at-device-init-time.patch | 43 + ...011-nvmem-stm32-fix-OPTEE-dependency.patch | 46 + ..._wwan-add-ZTE-MF286D-modem-19d2-1485.patch | 59 + ...001-nvmem-xilinx-zynqmp-make-modular.patch | 35 + ...2-nvmem-core-introduce-NVMEM-layouts.patch | 387 + ...ndle-the-absence-of-expected-layouts.patch | 61 + ...-core-request-layout-modules-loading.patch | 52 + ...em-core-add-per-cell-post-processing.patch | 86 + ...ow-to-modify-a-cell-before-adding-it.patch | 59 + ...replace-global-post-processing-with-.patch | 81 + ...m-cell-drop-global-cell_post_process.patch | 68 + ...de-own-priv-pointer-in-post-process-.patch | 76 + ...ayouts-sl28vpd-Add-new-layout-driver.patch | 215 + ...youts-onie-tlv-Add-new-layout-driver.patch | 306 + ...m-mark-OF-related-data-as-maybe-unus.patch | 32 + ...Support-postprocessing-for-GPU-speed.patch | 120 + ...p-Use-devm_platform_ioremap_resource.patch | 39 + ...tp-Use-devm_platform_ioremap_resourc.patch | 39 + ...p-Use-devm_platform_get_and_ioremap_.patch | 32 + ...rt-specifying-both-cell-raw-data-pos.patch | 115 + ...nv-post-process-ethaddr-env-variable.patch | 81 + ...cro-to-register-nvmem-layout-drivers.patch | 42 + ...28vpd-Use-module_nvmem_layout_driver.patch | 39 + ...ie-tlv-Use-module_nvmem_layout_drive.patch | 39 + ...uts-onie-tlv-Drop-wrong-module-alias.patch | 24 + ...28vpd-set-varaiable-sl28vpd_layout-s.patch | 31 + ...-bcm47xx-support-init-from-IO-memory.patch | 100 + ...set-varaiable-imx_ocotp_layout-stora.patch | 31 + ...Reverse-MAC-addresses-on-all-i.MX-de.patch | 71 + ...vram-add-.read_post_process-for-MACs.patch | 81 + ...tp-Add-clks-and-reg_read-to-rockchip.patch | 166 + ...tp-Generalize-rockchip_otp_wait_stat.patch | 62 + ...tp-Use-devm_reset_control_array_get_.patch | 31 + ...hip-otp-Improve-probe-error-handling.patch | 71 + ...-rockchip-otp-Add-support-for-RK3588.patch | 129 + ...-Switch-xilinx.com-emails-to-amd.com.patch | 26 + ...-0010-nvmem-imx-support-i.MX93-OCOTP.patch | 230 + ...e-add-support-for-fixed-cells-layout.patch | 96 + ...it_default_state_get-to-the-global-h.patch | 39 + ...a8k-move-qca8k_port_to_phy-to-header.patch | 67 + ...net-dsa-qca8k-add-LEDs-basic-support.patch | 435 + ...dsa-qca8k-add-LEDs-blink_set-support.patch | 74 + ...bs-for-when-CLASS_LED-NEW_LEDS-are-d.patch | 59 + ...5-net-phy-Add-a-binding-for-PHY-LEDs.patch | 191 + ...ce-Call-into-the-PHY-driver-to-set-L.patch | 97 + ...ell-Add-software-control-of-the-LEDs.patch | 112 + ...ce-Call-into-the-PHY-driver-to-set-L.patch | 73 + ...-phy-marvell-Implement-led_blink_set.patch | 104 + ...Fix-inconsistent-indenting-in-led_bl.patch | 38 + ...dev-Drop-NETDEV_LED_MODE_LINKUP-from.patch | 87 + ...dev-Rename-add-namespace-to-netdev-t.patch | 149 + ...-netdev-Convert-device-attr-to-macro.patch | 82 + ...etdev-Use-mutex-instead-of-spinlocks.patch | 106 + ...01-leds-add-APIs-for-LEDs-hw-control.patch | 74 + ...get-attached-device-for-LED-hw-contr.patch | 37 + ...ds-leds-class-Document-new-Hardware-.patch | 113 + ...dev-refactor-code-setting-device-nam.patch | 69 + ...dev-introduce-check-for-possible-hw-.patch | 54 + ...dev-add-basic-check-for-hw-control-s.patch | 42 + ...dev-reject-interval-store-for-hw_con.patch | 28 + ...etdev-add-support-for-LED-hw-control.patch | 107 + ...er-netdev-validate-configured-netdev.patch | 58 + ...dev-init-mode-if-hw-control-already-.patch | 53 + ...dev-expose-netdev-trigger-modes-in-l.patch | 54 + ...t-dsa-qca8k-implement-hw_control-ops.patch | 200 + ...dsa-qca8k-add-op-to-get-ports-netdev.patch | 70 + ...Convert-to-devm_platform_ioremap_res.patch | 36 + ...-Use-devm_platform_get_and_ioremap_r.patch | 30 + ...p-Convert-to-devm_platform_ioremap_r.patch | 34 + ...fuse-Convert-to-devm_platform_iorema.patch | 36 + ...fuse-Use-devm_platform_get_and_iorem.patch | 31 + ...m-Use-devm_platform_get_and_ioremap_.patch | 30 + ....6-0007-nvmem-qfprom-do-some-cleanup.patch | 59 + ...se-devm_platform_get_and_ioremap_res.patch | 29 + ...nvmem-add-new-NXP-QorIQ-eFuse-driver.patch | 133 + ...-nvmem-Kconfig-Fix-typo-drive-driver.patch | 37 + ...m-Add-Qualcomm-secure-QFPROM-support.patch | 152 + ...-Replace-zero-length-array-with-DECL.patch | 30 + ...e-all-cells-before-adding-the-nvmem-.patch | 40 + ...n-NULL-when-no-nvmem-layout-is-found.patch | 35 + ...-Do-not-open-code-existing-functions.patch | 29 + ...tify-when-a-new-layout-is-registered.patch | 44 + ...mem-qfprom-Mark-core-clk-as-optional.patch | 37 + ...it-config-option-to-read-old-syntax-.patch | 330 + ...0003-nvmem-Use-device_get_match_data.patch | 77 + ...4-Revert-nvmem-add-new-config-option.patch | 77 + ...Support-public-address-configuration.patch | 51 + ...Fix-application-of-sizeof-to-pointer.patch | 29 + ...Add-a-new-PID-VID-13d3-3567-for-MT79.patch | 70 + ...Add-a-new-PID-VID-0489-e0c8-for-MT79.patch | 68 + ...Add-a-new-VID-PID-0e8d-0608-for-MT79.patch | 66 + ...ll-of_parse_phandle-variants-static-.patch | 359 + ...-of_parse_phandle_with_optional_args.patch | 58 + ...ke-.-cells-optional-for-simple-props.patch | 34 + ...operty-add-nvmem-cell-cells-property.patch | 30 + ...vice-Ignore-modalias-of-reused-nodes.patch | 37 + ...-ignore-error-code-in-of_device_ueve.patch | 29 + ...002-of-Update-of_device_get_modalias.patch | 103 + ...v6.4-0003-of-Rename-of_modalias_node.patch | 173 + ...0004-of-Move-of_modalias-to-module.c.patch | 160 + ...uest-module-helper-logic-to-module.c.patch | 131 + ...PS-ath79-drop-_machine_restart-again.patch | 49 + ...18-hwmon-lm70-Add-ti-tmp125-support.patch} | 0 ...ether-export-usbnet_cdc_zte_rx_fixup.patch | 58 + ...e-the-bogus-MAC-fixup-for-ZTE-device.patch | 118 + ...-scope-of-bogus-MAC-address-detectio.patch | 63 + ...-spinand-winbond-fix-flash-detection.patch | 40 + ...6.2-mtd-spinand-winbond-add-W25N02KV.patch | 106 + ...d-spinand-winbond-Fix-ecc_get_status.patch | 49 + target/linux/generic/config-5.10 | 7181 ---------- target/linux/generic/config-5.15 | 7599 +++++++++++ target/linux/generic/config-filter | 2 + .../generic/files/block/partitions/fit.c | 28 +- .../files/drivers/bcma/fallback-sprom.c | 533 + .../files/drivers/leds/leds-ubnt-ledbar.c | 255 - .../files/drivers/mtd/mtdsplit/Kconfig | 6 +- .../files/drivers/mtd/mtdsplit/Makefile | 1 + .../drivers/mtd/mtdsplit/mtdsplit_bcm_wfi.c | 16 +- .../files/drivers/mtd/mtdsplit/mtdsplit_fit.c | 11 +- .../drivers/mtd/mtdsplit/mtdsplit_h3c_vfs.c | 170 + .../generic/files/drivers/mtd/nand/mtk_bmt.h | 10 +- .../files/drivers/mtd/nand/mtk_bmt_v2.c | 55 +- .../generic/files/drivers/net/phy/ar8216.c | 14 +- .../generic/files/drivers/net/phy/ar8327.c | 2 +- .../files/drivers/net/phy/b53/b53_common.c | 24 +- .../files/drivers/net/phy/b53/b53_mdio.c | 6 +- .../files/drivers/net/phy/b53/b53_mmap.c | 4 +- .../files/drivers/net/phy/b53/b53_priv.h | 8 +- .../files/drivers/net/phy/b53/b53_spi.c | 4 +- .../files/drivers/net/phy/b53/b53_srab.c | 4 +- .../generic/files/drivers/net/phy/psb6970.c | 17 +- .../files/drivers/platform/mikrotik/Kconfig | 1 - .../files/drivers/ssb/fallback-sprom.c | 744 ++ .../generic/hack-5.10/204-module_strip.patch | 212 - .../generic/hack-5.10/205-kconfig-exit.patch | 11 - .../hack-5.10/212-tools_portability.patch | 110 - .../hack-5.10/214-spidev_h_portability.patch | 24 - .../hack-5.10/220-arm-gc_sections.patch | 123 - .../hack-5.10/221-module_exports.patch | 102 - .../hack-5.10/230-openwrt_lzma_options.patch | 34 - .../hack-5.10/249-udp-tunnel-selection.patch | 11 - .../hack-5.10/250-netfilter_depends.patch | 27 - .../linux/generic/hack-5.10/251-kconfig.patch | 199 - .../generic/hack-5.10/252-SATA_PMP.patch | 23 - .../generic/hack-5.10/253-ksmbd-config.patch | 22 - .../hack-5.10/259-regmap_dynamic.patch | 135 - .../260-crypto_test_dependencies.patch | 52 - .../hack-5.10/261-lib-arc4-unhide.patch | 15 - .../generic/hack-5.10/280-rfkill-stubs.patch | 84 - ...cache-use-more-efficient-cache-blast.patch | 64 - .../301-mips_image_cmdline_hack.patch | 38 - .../321-powerpc_crtsavres_prereq.patch | 38 - ...don-t-reply-on-mtdblock-device-minor.patch | 85 - ...rans-call-add-disks-after-mtd-device.patch | 98 - .../410-block-fit-partition-parser.patch | 224 - ...upport-OpenWrt-s-MTD_ROOTFS_ROOT_DEV.patch | 24 - ...-root-on-targets-with-CONFIG_FIT_PAR.patch | 31 - .../hack-5.10/430-mtk-bmt-support.patch | 23 - .../generic/hack-5.10/531-debloat_lzma.patch | 1040 -- .../hack-5.10/600-bridge_offload.patch | 817 -- ...-netfilter-add-xt_FLOWOFFLOAD-target.patch | 874 -- .../hack-5.10/651-wireless_mesh_header.patch | 24 - ...t-size-the-hashtable-more-adequately.patch | 25 - .../700-swconfig_switch_drivers.patch | 129 - .../710-net-dsa-mv88e6xxx-default-VID-1.patch | 18 - ...-dsa-mv88e6xxx-disable-ATU-violation.patch | 12 - .../hack-5.10/720-net-phy-add-aqr-phys.patch | 142 - .../721-net-add-packet-mangeling.patch | 167 - ...hy-aquantia-enable-AQR112-and-AQR412.patch | 154 - ...aquantia-fix-system-side-protocol-mi.patch | 34 - ...y-aquantia-Add-AQR113-driver-support.patch | 43 - ...ntia-add-PHY_IDs-for-AQR112-variants.patch | 63 - ...-r8152-add-LED-configuration-from-OF.patch | 74 - .../hack-5.10/773-bgmac-add-srab-switch.patch | 98 - .../780-usb-net-MeigLink_modem_support.patch | 33 - .../800-GPIO-add-named-gpio-exports.patch | 162 - .../hack-5.10/800-ubnt-ledbar-driver.patch | 29 - .../hack-5.10/901-debloat_sock_diag.patch | 162 - .../generic/hack-5.10/902-debloat_proc.patch | 408 - .../hack-5.10/904-debloat_dma_buf.patch | 92 - .../hack-5.10/920-device_tree_cmdline.patch | 12 - .../generic/hack-5.15/204-module_strip.patch | 212 + ...-abort-configuration-on-unset-symbol.patch | 41 + .../210-darwin_scripts_include.patch | 0 .../211-darwin-uuid-typedef-clash.patch | 0 .../hack-5.15/212-tools_portability.patch | 110 + .../hack-5.15/214-spidev_h_portability.patch | 24 + .../hack-5.15/220-arm-gc_sections.patch | 123 + .../hack-5.15/221-module_exports.patch | 126 + .../hack-5.15/230-openwrt_lzma_options.patch | 34 + .../hack-5.15/250-netfilter_depends.patch | 27 + .../linux/generic/hack-5.15/251-kconfig.patch | 210 + .../generic/hack-5.15/253-ksmbd-config.patch | 32 + .../hack-5.15/259-regmap_dynamic.patch | 144 + .../260-crypto_test_dependencies.patch | 52 + .../hack-5.15/261-lib-arc4-unhide.patch | 24 + .../generic/hack-5.15/280-rfkill-stubs.patch | 84 + ...cache-use-more-efficient-cache-blast.patch | 64 + .../321-powerpc_crtsavres_prereq.patch | 38 + ...rans-call-add-disks-after-mtd-device.patch | 98 + .../410-block-fit-partition-parser.patch | 214 + ...upport-OpenWrt-s-MTD_ROOTFS_ROOT_DEV.patch | 24 + ...rs-add-nvmem-support-to-cmdlinepart.patch} | 0 .../hack-5.15/430-mtk-bmt-support.patch | 33 + ...of_net-add-mac-address-ascii-support.patch | 116 + ...lter-connmark-introduce-set-dscpmark.patch | 0 ...-netfilter-add-xt_FLOWOFFLOAD-target.patch | 861 ++ .../hack-5.15/651-wireless_mesh_header.patch | 24 + .../660-fq_codel_defaults.patch | 0 ...t-size-the-hashtable-more-adequately.patch | 25 + .../700-swconfig_switch_drivers.patch | 131 + ...-dsa-mv88e6xxx-disable-ATU-violation.patch | 21 + .../hack-5.15/720-net-phy-add-aqr-phys.patch | 142 + .../721-net-add-packet-mangeling.patch | 178 + ...hy-aquantia-enable-AQR112-and-AQR412.patch | 154 + ...aquantia-fix-system-side-protocol-mi.patch | 34 + ...y-aquantia-Add-AQR113-driver-support.patch | 43 + ...ntia-add-PHY_IDs-for-AQR112-variants.patch | 63 + ...-eth-dpaa2-eth-do-not-hold-rtnl_lock.patch | 74 + ...mtk-lynxi-workaround-2500BaseX-no-an.patch | 53 + ...-r8152-add-LED-configuration-from-OF.patch | 74 + ...et-add-RTL8152-binding-documentation.patch | 0 .../765-mxl-gpy-control-LED-reg-from-DT.patch | 101 + ...k-ge-add-LED-configuration-interface.patch | 72 + .../hack-5.15/773-bgmac-add-srab-switch.patch | 98 + .../780-usb-net-MeigLink_modem_support.patch | 69 + .../781-usb-net-rndis-support-asr.patch | 56 + .../790-SFP-GE-T-ignore-TX_FAULT.patch | 65 + .../795-backport-phylink_pcs-helpers.patch | 167 + .../800-GPIO-add-named-gpio-exports.patch | 162 + .../810-bcma-ssb-fallback-sprom.patch | 187 + .../hack-5.15/901-debloat_sock_diag.patch | 172 + .../generic/hack-5.15/902-debloat_proc.patch | 408 + .../hack-5.15/904-debloat_dma_buf.patch | 92 + .../910-kobject_uevent.patch | 0 .../911-kobject_add_broadcast_uevent.patch | 0 .../hack-5.15/920-device_tree_cmdline.patch | 21 + ...vert-driver-core-Set-fw_devlink-on-b.patch | 30 + ...terrupt-provider-address-cells-check.patch | 28 - ...include-asm-rwonce.h-for-kernel-code.patch | 29 - ...s-negative-stack-offsets-on-stack-tr.patch | 57 - ...e_mem_map-with-ARCH_PFN_OFFSET-calcu.patch | 82 - ...0-add-linux-spidev-compatible-si3210.patch | 18 - ...ame2-and-add-RENAME_WHITEOUT-support.patch | 78 - ...41-jffs2-add-RENAME_EXCHANGE-support.patch | 73 - ...ge_allow_receiption_on_disabled_port.patch | 45 - .../203-kallsyms_uncompressed.patch | 119 - .../205-backtrace_module_info.patch | 41 - .../270-platform-mikrotik-build-bits.patch | 31 - .../300-mips_expose_boot_raw.patch | 40 - .../pending-5.10/305-mips_module_reloc.patch | 371 - .../307-mips_highmem_offset.patch | 19 - .../pending-5.10/308-mips32r2_tune.patch | 22 - ...CPU-option-reporting-to-proc-cpuinfo.patch | 140 - ...t-command-line-parameters-from-users.patch | 281 - ...ernel-XZ-compression-option-on-PPC_8.patch | 25 - .../400-mtd-mtdsplit-support.patch | 315 - ...support-for-minor-aligned-partitions.patch | 245 - ...ers-ofpart-fix-parsing-subpartitions.patch | 76 - ...t-add-of_match_table-with-DT-binding.patch | 22 - .../pending-5.10/420-mtd-redboot_space.patch | 41 - ...mtd-add-routerbootpart-parser-config.patch | 38 - ...mtd-cfi_cmdset_0002-no-erase_suspend.patch | 25 - ...et_0002-add-buffer-write-cmd-timeout.patch | 17 - ...ort-limiting-4K-sectors-support-base.patch | 71 - .../476-mtd-spi-nor-add-eon-en25q128.patch | 18 - .../479-mtd-spi-nor-add-xtx-xt25f128b.patch | 79 - .../483-mtd-spi-nor-add-gd25q512.patch | 12 - ...spinand-add-support-for-xtx-xt26g0xa.patch | 178 - .../484-mtd-spi-nor-add-esmt-f25l16pa.patch | 11 - .../485-mtd-spi-nor-add-xmc-xm25qh128c.patch | 11 - ...mtd-device-named-ubi-or-data-on-boot.patch | 97 - ...to-create-ubiblock-device-for-rootfs.patch | 69 - ...ting-ubi0-rootfs-in-init-do_mounts.c.patch | 53 - ...ROOT_DEV-to-ubiblock-rootfs-if-unset.patch | 34 - .../494-mtd-ubi-add-EOF-marker-support.patch | 60 - ...-mtd-core-add-get_mtd_device_by_node.patch | 75 - ...cat-add-dt-driver-for-concat-devices.patch | 216 - ...i-nor-locking-support-for-MX25L6405D.patch | 34 - .../500-fs_cdrom_dependencies.patch | 40 - .../530-jffs2_make_lzma_available.patch | 5180 -------- .../600-netfilter_conntrack_flush.patch | 88 - ...-netfilter_optional_tcp_window_check.patch | 73 - .../pending-5.10/630-packet_socket_type.patch | 138 - .../pending-5.10/655-increase_skb_pad.patch | 20 - ...Add-support-for-MAP-E-FMRs-mesh-mode.patch | 511 - ...ng-with-source-address-failed-policy.patch | 263 - ...nes-for-_POLICY_FAILED-until-all-cod.patch | 50 - ...T-skip-GRO-for-foreign-MAC-addresses.patch | 149 - ...et-add-mac-address-increment-support.patch | 89 - ...83-of_net-add-mac-address-to-of-tree.patch | 38 - ..._eth_soc-avoid-creating-duplicate-of.patch | 26 - ..._eth_soc-add-support-for-coherent-DM.patch | 327 - ...ek-mt7622-add-support-for-coherent-D.patch | 30 - ..._eth_soc-add-support-for-Wireless-Et.patch | 1679 --- ..._eth_soc-implement-flow-offloading-t.patch | 269 - ...ek-mt7622-introduce-nodes-for-Wirele.patch | 62 - ..._eth_soc-add-ipv6-flow-offload-suppo.patch | 79 - ..._eth_soc-allocate-struct-mtk_ppe-sep.patch | 159 - ..._eth_soc-rework-hardware-flow-table-.patch | 424 - ..._eth_soc-support-creating-mac-addres.patch | 553 - ...detach-callback-to-struct-phy_driver.patch | 38 - ...ble-fix-excessive-hw-offload-attempt.patch | 27 - ...ow_offload-skip-dst-neigh-lookup-for.patch | 64 - ..._fill_forward_path-with-pppoe-bridge.patch | 66 - ...ow_offload-fix-offload-with-pppoe-vl.patch | 24 - ...a-tag_mtk-add-padding-for-tx-packets.patch | 29 - ...d-knob-for-filtering-rx-tx-BPDU-pack.patch | 177 - ...net-phy-at803x-fix-feature-detection.patch | 66 - ...760-net-dsa-mv88e6xxx-fix-vlan-setup.patch | 27 - ...hdev-Refactor-br_switchdev_fdb_notif.patch | 77 - ...hdev-Include-local-flag-in-FDB-notif.patch | 42 - ...hdev-Send-FDB-notifications-for-host.patch | 96 - ...local-addresses-in-assisted-CPU-port.patch | 36 - ...bridge-addresses-in-assisted-CPU-por.patch | 30 - ...tic-FDB-entries-on-foreign-interface.patch | 56 - ...equest-assisted-learning-on-CPU-port.patch | 27 - ...-missing-linux-if_ether.h-for-ETH_AL.patch | 61 - ...ice-struct-copy-its-DMA-params-to-th.patch | 64 - ...pio-cascade-add-generic-GPIO-cascade.patch | 222 - .../810-pci_disable_common_quirks.patch | 62 - .../811-pci_disable_usb_common_quirks.patch | 115 - .../pending-5.10/834-ledtrig-libata.patch | 149 - ...40-hwrng-bcm2835-set-quality-to-1000.patch | 26 - ..._wwan-add-ZTE-MF286D-modem-19d2-1485.patch | 59 - ...lace-custom-PCIE_CORE_INT_-macros-wi.patch | 40 - ...rite-IRQ-code-to-chained-IRQ-handler.patch | 125 - ...ck-return-value-of-generic_handle_do.patch | 31 - ...e-MSI-irq_chip-structures-static-dri.patch | 93 - ...e-msi_domain_info-structure-a-static.patch | 64 - ...-dev_fwnode-instead-of-of_node_to_fw.patch | 40 - ...actor-unmasking-summary-MSI-interrup.patch | 44 - ...d-support-for-masking-MSI-interrupts.patch | 117 - ...PCI-aardvark-Fix-setting-MSI-address.patch | 91 - ...12-PCI-aardvark-Enable-MSI-X-support.patch | 38 - ...-support-for-ERR-interrupt-on-emulat.patch | 100 - ...imize-writing-PCI_EXP_RTCTL_PMEIE-an.patch | 52 - ...dvark-Add-support-for-PME-interrupts.patch | 47 - ...-support-for-PME-requester-on-emulat.patch | 173 - ...-separate-INTA-interrupt-for-emulate.patch | 161 - ...ove-irq_mask_ack-callback-for-INTx-i.patch | 29 - ...aardvark-Don-t-mask-irq-when-mapping.patch | 27 - ...p-__maybe_unused-from-advk_pcie_disa.patch | 28 - ...ate-comment-about-link-going-down-af.patch | 35 - ...e-main-irq_chip-structure-a-static-d.patch | 102 - ...mvebu-a3700-comphy-Remove-port-from-.patch | 217 - ...mvebu-a3700-comphy-Add-native-kernel.patch | 1564 --- ...l-armada-37xx-Add-xtal-clock-to-comp.patch | 31 - ...mvebu-Make-SATA-PHY-optional-for-Arm.patch | 61 - ...xhci-mvebu-make-USB-3.0-PHY-optional.patch | 163 - ...ark-Fix-initialization-with-old-Marv.patch | 36 - .../pending-5.10/920-mangle_bootargs.patch | 71 - ...include-asm-rwonce.h-for-kernel-code.patch | 29 + ...s-negative-stack-offsets-on-stack-tr.patch | 57 + .../103-kbuild-export-SUBARCH.patch | 21 + ...ilicon-Labs-EM3581-device-compatible.patch | 32 + ...ilicon-Labs-SI3210-device-compatible.patch | 32 + ..._wdt-Add-support-for-specifying-WDI-.patch | 75 + ...e_mem_map-with-ARCH_PFN_OFFSET-calcu.patch | 82 + ...ame2-and-add-RENAME_WHITEOUT-support.patch | 81 + ...41-jffs2-add-RENAME_EXCHANGE-support.patch | 73 + .../142-jffs2-add-splice-ops.patch | 0 ...ge_allow_receiption_on_disabled_port.patch | 45 + ...-rs5c372-support_alarms_up_to_1_week.patch | 0 ...he_alarm_to_be_used_as_wakeup_source.patch | 0 .../203-kallsyms_uncompressed.patch | 119 + .../205-backtrace_module_info.patch | 41 + ...e-filenames-from-deps_initramfs-list.patch | 0 ...able_wilink_platform_without_drivers.patch | 0 .../270-platform-mikrotik-build-bits.patch | 31 + .../300-mips_expose_boot_raw.patch | 40 + ...rriers-between-dcache-icache-flushes.patch | 71 + .../302-mips_no_branch_likely.patch | 0 .../pending-5.15/305-mips_module_reloc.patch | 370 + .../pending-5.15/308-mips32r2_tune.patch | 22 + .../310-arm_module_unresolved_weak_sym.patch | 0 ...t-command-line-parameters-from-users.patch | 282 + .../332-arc-add-OWRTDTB-section.patch | 0 ...able-unaligned-access-in-kernel-mode.patch | 0 ...ernel-XZ-compression-option-on-PPC_8.patch | 25 + ...ip-bcm-6345-l1-request-memory-region.patch | 113 + .../400-mtd-mtdsplit-support.patch | 328 + ...er-NVMEM-devices-for-partitions-with.patch | 48 + ...support-for-minor-aligned-partitions.patch | 245 + .../pending-5.15/420-mtd-redboot_space.patch | 41 + ...30-mtd-add-myloader-partition-parser.patch | 0 ...check-for-bad-blocks-when-calculatin.patch | 0 ...bcm47xxpart-detect-T_Meter-partition.patch | 0 ...mtd-add-routerbootpart-parser-config.patch | 38 + ...mtd-cfi_cmdset_0002-no-erase_suspend.patch | 25 + ...et_0002-add-buffer-write-cmd-timeout.patch | 17 + ...25p80-mx-disable-software-protection.patch | 0 .../476-mtd-spi-nor-add-eon-en25q128.patch | 18 + .../477-mtd-spi-nor-add-eon-en25qx128a.patch | 21 + .../479-mtd-spi-nor-add-xtx-xt25f128b.patch | 79 + ...-add-support-for-Gigadevice-GD25D05.patch} | 0 .../482-mtd-spi-nor-add-gd25q512.patch | 21 + .../484-mtd-spi-nor-add-esmt-f25l16pa.patch | 23 + .../485-mtd-spi-nor-add-xmc-xm25qh128c.patch | 24 + ...nand-add-support-for-ESMT-F50x1G41LB.patch | 143 + ...nd-Add-support-for-Etron-EM73D044VCx.patch | 168 + .../488-mtd-spi-nor-add-xmc-xm25qh64c.patch | 22 + ...mtd-device-named-ubi-or-data-on-boot.patch | 97 + ...to-create-ubiblock-device-for-rootfs.patch | 69 + ...ting-ubi0-rootfs-in-init-do_mounts.c.patch | 53 + ...ROOT_DEV-to-ubiblock-rootfs-if-unset.patch | 34 + .../494-mtd-ubi-add-EOF-marker-support.patch | 60 + ...-add-bindings-for-mtd-concat-devices.patch | 0 ...cat-add-dt-driver-for-concat-devices.patch | 216 + ...i-nor-locking-support-for-MX25L6405D.patch | 34 + ...i-nor-disable-16-bit-sr-for-macronix.patch | 0 .../500-fs_cdrom_dependencies.patch | 52 + .../530-jffs2_make_lzma_available.patch | 4581 +++++++ .../532-jffs2_eofdetect.patch | 0 .../600-netfilter_conntrack_flush.patch | 88 + ...etfilter_match_bypass_default_checks.patch | 0 ...netfilter_match_bypass_default_table.patch | 0 ...netfilter_match_reduce_memory_access.patch | 0 ...del-do-not-defer-queue-length-update.patch | 0 .../pending-5.15/630-packet_socket_type.patch | 138 + .../pending-5.15/655-increase_skb_pad.patch | 20 + ...Add-support-for-MAP-E-FMRs-mesh-mode.patch | 511 + ...ng-with-source-address-failed-policy.patch | 263 + ...nes-for-_POLICY_FAILED-until-all-cod.patch | 50 + ...T-skip-GRO-for-foreign-MAC-addresses.patch | 149 + ...et-add-mac-address-increment-support.patch | 90 + ...83-of_net-add-mac-address-to-of-tree.patch | 55 + ...t-do-mac-address-increment-only-once.patch | 31 + ...ow_offload-handle-netdevice-events-f.patch | 106 + ...les-ignore-EOPNOTSUPP-on-flowtable-d.patch | 29 + ...net-mtk_eth_soc-enable-threaded-NAPI.patch | 41 + ...detach-callback-to-struct-phy_driver.patch | 38 + ...transmit-path-dma-unmapping-on-error.patch | 111 + ...rk-mapped-and-tso-buffers-separately.patch | 42 + ...uf-type-to-determine-whether-to-dma-.patch | 59 + ...tso_build_hdr-into-mvneta_tso_put_hd.patch | 65 + ...cate-TSO-header-DMA-memory-in-chunks.patch | 179 + ...a-tag_mtk-add-padding-for-tx-packets.patch | 28 + ...d-knob-for-filtering-rx-tx-BPDU-pack.patch | 174 + ...rtl8221-allow-to-configure-SERDES-mo.patch | 106 + ...support-switching-between-SGMII-and-.patch | 61 + ...e-all-MACs-are-powered-down-before-r.patch | 37 + ...-use-genphy_soft_reset-for-2.5G-PHYs.patch | 65 + ...sable-SGMII-in-band-AN-for-2-5G-PHYs.patch | 43 + ...make-sure-paged-read-is-protected-by.patch | 35 + ...use-inline-functions-for-10GbE-adver.patch | 60 + ...check-validity-of-10GbE-link-partner.patch | 28 + ...-phy-realtek-introduce-rtl822x_probe.patch | 84 + ...tek-detect-early-version-of-RTL8221B.patch | 63 + ..._eth_soc-compile-out-netsys-v2-code-.patch | 44 + ..._eth_soc-work-around-issue-with-send.patch | 94 + ...rnet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch | 21 + ..._eth_soc-fix-remaining-throughput-re.patch | 42 + ..._eth_soc-ppe-fix-L2-offloading-with-.patch | 33 + ..._eth_soc-add-code-for-offloading-flo.patch | 266 + ...iatek-mtk_ppe-prefer-newly-added-l2-.patch | 37 + ..._eth_soc-improve-keeping-track-of-of.patch | 331 + ...iatek-fix-ppe-flow-accounting-for-L2.patch | 342 + ..._eth_soc-add-paths-and-SerDes-modes-.patch | 1604 +++ ...pool-and-page-referenced-frags-in-GR.patch | 35 + ...ional-threading-for-backlog-processi.patch | 232 + ...equest-assisted-learning-on-CPU-port.patch | 27 + ...a-b53-add-support-for-BCM63xx-RGMIIs.patch | 174 + ...-net-dsa-b53-mmap-add-more-63xx-SoCs.patch | 108 + ...dsa-b53-mmap-allow-passing-a-chip-ID.patch | 195 + ...b53-add-BCM63268-RGMII-configuration.patch | 123 + ...sa-b53-mdio-add-support-for-BCM53134.patch | 189 + ...-missing-linux-if_ether.h-for-ETH_AL.patch | 61 + ...-bus-mhi-core-add-SBL-state-callback.patch | 48 + ...gister-OF-node-for-internal-MDIO-bus.patch | 43 + ...ice-struct-copy-its-DMA-params-to-th.patch | 73 + ...pio-cascade-add-generic-GPIO-cascade.patch | 222 + ...env-align-endianness-of-crc32-values.patch | 47 + ...support-for-fixed-cells-NVMEM-layout.patch | 40 + ...-support-mac-base-fixed-layout-cells.patch | 124 + .../810-pci_disable_common_quirks.patch | 62 + .../811-pci_disable_usb_common_quirks.patch | 115 + ...problem-with-platfom-data-in-w1-gpio.patch | 0 .../pending-5.15/834-ledtrig-libata.patch | 149 + ...40-hwrng-bcm2835-set-quality-to-1000.patch | 26 + ...e-main-irq_chip-structure-a-static-d.patch | 102 + ...add-BCM63268-timer-clock-definitions.patch | 114 + ...add-BCM63268-timer-reset-definitions.patch | 107 + ...CM63268-timer-clock-and-reset-driver.patch | 345 + ...rack-busclk-state-to-avoid-bus-error.patch | 61 + .../pending-5.15/920-mangle_bootargs.patch | 71 + target/linux/mvebu/Makefile | 2 +- target/linux/mvebu/config-5.10 | 426 - target/linux/mvebu/config-5.15 | 435 + .../base-files/etc/board.d/02_network | 4 + .../base-files/lib/upgrade/fortinet.sh | 54 + .../base-files/lib/upgrade/linksys.sh | 9 +- .../base-files/lib/upgrade/platform.sh | 10 + target/linux/mvebu/cortexa9/config-5.10 | 4 - target/linux/mvebu/cortexa9/config-5.15 | 3 + .../boot/dts/armada-370-buffalo-ls220de.dts | 380 + .../boot/dts/armada-385-fortinet-fg-50e.dts | 507 + .../boot/dts/marvell/armada-3720-eDPU.dts | 19 + .../marvell/armada-3720-espressobin-ultra.dts | 1 - .../dts/marvell/armada-3720-gl-mv1000.dts | 21 +- .../boot/dts/marvell/armada-3720-uDPU.dts | 46 + .../boot/dts/marvell/armada-3720-uDPU.dtsi | 165 + .../boot/dts/marvell/armada-7040-mochabin.dts | 2 +- .../boot/dts/marvell/cn9131-puzzle-m901.dts | 27 +- .../boot/dts/marvell/cn9132-puzzle-m902.dts | 32 +- .../boot/dts/marvell/puzzle-thermal.dtsi | 41 + target/linux/mvebu/image/Makefile | 14 +- target/linux/mvebu/image/cortexa9.mk | 211 +- ...s-mcbin-singleshot-add-heartbeat-LED.patch | 65 - ...is-omnia-enable-HW-buffer-management.patch | 74 - ...rris-omnia-add-comphy-handle-to-eth2.patch | 37 - ...rris-omnia-describe-switch-interrupt.patch | 61 - ...11-ARM-dts-turris-omnia-add-SFP-node.patch | 90 - ...turris-omnia-add-LED-controller-node.patch | 160 - ...te-ethernet-phy-node-and-handle-name.patch | 52 - ...omnia-fix-hardware-buffer-management.patch | 33 - ...mnia-configure-LED-0-pin-function-to.patch | 38 - ...ris-omnia-enable-LED-controller-node.patch | 48 - ...a-support-HW-controlled-mode-via-pri.patch | 118 - ...a-initialize-multi-intensity-to-full.patch | 33 - ...a-change-max-brightness-from-255-to-.patch | 31 - ...Mangle-bootloader-s-kernel-arguments.patch | 208 - .../patches-5.10/302-add_powertables.patch | 770 -- ...3-linksys_hardcode_nand_ecc_settings.patch | 17 - ...witch-PHY-operation-mode-to-2500base.patch | 34 - .../700-mvneta-tx-queue-workaround.patch | 38 - ...14-net-ethernet-marvell-mvnetaMQPrio.patch | 109 - ...ethernet-marvell-mvnetaMQPrioOffload.patch | 66 - ...xt-ethernet-marvell-mvnetaMQPrioFlag.patch | 30 - ...t-ethernet-marvell-mvnetaMQPrioQueue.patch | 97 - ...hernet-marvell-mvnetaMQPrioTCOffload.patch | 182 - ...-pci-mvebu-time-out-reset-on-link-up.patch | 60 - ...IEI-vendor-prefix-and-IEI-WT61P803-P.patch | 218 - ...a-driver-for-IEI-WT61P803-PUZZLE-MCU.patch | 1034 -- ...d-the-IEI-WT61P803-PUZZLE-HWMON-driv.patch | 469 - ...d-the-IEI-WT61P803-PUZZLE-LED-driver.patch | 207 - ...mon-Add-iei-wt61p803-puzzle-hwmon-dr.patch | 74 - ...an-entry-for-the-IEI-WT61P803-PUZZLE.patch | 41 - ...mnia-configure-LED-0-pin-function-to.patch | 38 + .../100-aardvark-workaround-PCIe.patch | 81 + ...ris-omnia-enable-LED-controller-node.patch | 48 + ...a-support-HW-controlled-mode-via-pri.patch | 118 + ...a-initialize-multi-intensity-to-full.patch | 33 + ...a-change-max-brightness-from-255-to-.patch | 31 + ...set-linkstation-poweroff-add-ls220de.patch | 15 + ...Mangle-bootloader-s-kernel-arguments.patch | 279 + ...-mvebu-armada-38x-enable-libata-leds.patch | 0 .../patches-5.15/302-add_powertables.patch | 770 ++ .../304-revert_i2c_delay.patch | 0 .../305-armada-385-rd-mtd-partitions.patch | 0 .../306-ARM-mvebu-385-ap-Add-partitions.patch | 0 ...-armada-xp-linksys-mamba-broken-idle.patch | 0 .../308-armada-xp-linksys-mamba-wan.patch | 0 .../309-linksys-status-led.patch | 0 .../310-linksys-use-eth0-as-cpu-port.patch | 0 .../311-adjust-compatible-for-linksys.patch | 0 ...da388-clearfog-emmc-on-clearfog-base.patch | 0 .../313-helios4-dts-status-led-alias.patch | 0 ...vell-enable-heartbeat-LED-by-default.patch | 22 + ...rmada-xp-linksys-mamba-resize-kernel.patch | 0 ...316-armada-370-dts-fix-crypto-engine.patch | 0 .../400-find_active_root.patch | 0 .../700-mvneta-tx-queue-workaround.patch | 38 + ...ethernet-marvell-mvnetaMQPrioOffload.patch | 66 + ...xt-ethernet-marvell-mvnetaMQPrioFlag.patch | 30 + ...t-ethernet-marvell-mvnetaMQPrioQueue.patch | 97 + ...hernet-marvell-mvnetaMQPrioTCOffload.patch | 182 + ...mvebu-a3700-comphy-Reset-COMPHY-regi.patch | 50 + ...dicate-failure-to-enter-deeper-sleep.patch | 0 ...-pci-mvebu-time-out-reset-on-link-up.patch | 60 + ...IEI-vendor-prefix-and-IEI-WT61P803-P.patch | 218 + ...a-driver-for-IEI-WT61P803-PUZZLE-MCU.patch | 1034 ++ ...d-the-IEI-WT61P803-PUZZLE-HWMON-driv.patch | 501 + ...d-the-IEI-WT61P803-PUZZLE-LED-driver.patch | 207 + ...I-Add-iei-wt61p803-puzzle-driver-sys.patch | 0 ...mon-Add-iei-wt61p803-puzzle-hwmon-dr.patch | 74 + ...an-entry-for-the-IEI-WT61P803-PUZZLE.patch | 41 + ...rs-leds-wt61p803-puzzle-improvements.patch | 0 ...ivers-leds-wt61p803-puzzle-mcu-retry.patch | 63 + target/linux/rockchip/Makefile | 2 +- .../armv8/base-files/etc/board.d/01_leds | 10 +- .../armv8/base-files/etc/board.d/02_network | 23 +- .../etc/hotplug.d/net/40-net-smp-affinity | 5 +- target/linux/rockchip/armv8/config-5.10 | 656 - target/linux/rockchip/armv8/config-5.15 | 644 + target/linux/rockchip/image/Makefile | 4 +- target/linux/rockchip/image/armv8.mk | 64 +- target/linux/rockchip/image/mmc.bootscript | 13 +- .../rockchip/image/nanopi-r2s.bootscript | 8 - .../rockchip/image/nanopi-r4s.bootscript | 8 - .../linux/rockchip/image/tpe-r1400.bootscript | 8 - ...Add-support-for-FriendlyARM-NanoPi-R.patch | 177 - ...-rockchip-use-system-LED-for-OpenWrt.patch | 31 - ...usb3-controller-node-for-RK3328-SoCs.patch | 70 - ...ckchip-enable-LAN-port-on-NanoPi-R2S.patch | 60 - ...dd-OF-node-for-USB-eth-on-NanoPi-R2S.patch | 28 - ...-host-by-default-on-rk3399-rock-pi-4.patch | 32 - .../105-nanopi-r4s-sd-signalling.patch | 26 - .../patches-5.10/107-add-tpe-r1400.patch | 426 - ...kchip-add-EEPROM-node-for-NanoPi-R4S.patch | 0 ...-rockchip-Add-FriendlyARM-NanoPi-R2C.patch | 70 + ...ockchip-rk3328-Add-Orange-Pi-R1-Plus.patch | 407 + ...hip-Add-Xunlong-OrangePi-R1-Plus-LTS.patch | 71 + ...-rockchip-Add-ThinkPenguin-TPE-R1400.patch | 29 + ...-rockchip-use-system-LED-for-OpenWrt.patch | 65 + ...dd-OF-node-for-USB-eth-on-NanoPi-R2S.patch | 24 + .../105-nanopi-r4s-sd-signalling.patch | 36 + .../106-r4s-openwrt-leds.patch | 0 ...ip-Update-LED-properties-for-Orange-.patch | 56 + ...ip-add-LED-configuration-to-Orange-P.patch | 24 + target/linux/sunxi/Makefile | 2 +- .../sunxi/base-files/etc/board.d/01_leds | 4 +- .../sunxi/base-files/etc/board.d/02_network | 25 + .../firmware/brcm/brcmfmac43430a0-sdio.txt | 1 - target/linux/sunxi/config-5.10 | 512 - target/linux/sunxi/config-5.15 | 517 + target/linux/sunxi/cortexa53/config-5.10 | 95 - target/linux/sunxi/cortexa53/config-5.15 | 89 + target/linux/sunxi/cortexa7/config-5.10 | 26 - target/linux/sunxi/cortexa7/config-5.15 | 24 + target/linux/sunxi/cortexa8/config-5.10 | 12 - target/linux/sunxi/cortexa8/config-5.15 | 12 + target/linux/sunxi/image/cortexa7.mk | 14 +- target/linux/sunxi/image/cortexa8.mk | 19 +- target/linux/sunxi/modules.mk | 11 +- .../062-add-sun8i-h3-zeropi-support.patch | 79 - ...0-sunxi-h3-add-support-for-nanopi-r1.patch | 186 - ...nxi-h5-add-support-for-nanopi-r1s-h5.patch | 230 - ...OF-node-for-USB-eth-on-NanoPi-R1S-H5.patch | 30 - ...lwinner-nanopi-r1s-h5-add-status-LED.patch | 35 - ...OF-node-for-USB-eth-on-NanoPi-R1S-H5.patch | 30 + ...angepi_pc2_usb_otg_to_host_key_power.patch | 0 ...a64-sopine-Add-Sopine-flash-partitio.patch | 0 ...ner-a64-olinuxino-add-status-LED-ali.patch | 0 ...lwinner-nanopi-r1s-h5-add-status-LED.patch | 35 + ...m64-dts-orangepi-one-plus-enable-PWM.patch | 0 ...m64-dts-enable-wifi-on-pine64-boards.patch | 0 target/linux/sunxi/profiles/00-default.mk | 2 +- target/linux/uml/Makefile | 4 +- target/linux/uml/README.md | 2 +- target/linux/uml/config-5.10 | 135 - target/linux/uml/config-5.15 | 141 + .../uml/patches-5.10/101-mconsole-exec.patch | 213 - .../patches-5.10/102-pseudo-random-mac.patch | 147 - .../uml/patches-5.15/101-mconsole-exec.patch | 213 + .../patches-5.15/102-pseudo-random-mac.patch | 151 + ...efault-virtual-physical-memory-to-64.patch | 40 + target/linux/x86/64/config-5.10 | 493 - target/linux/x86/64/config-5.15 | 545 + target/linux/x86/Makefile | 7 +- .../linux/x86/base-files/etc/board.d/01_leds | 11 +- .../x86/base-files/etc/board.d/02_network | 32 +- .../lib/preinit/81_upgrade_bootloader | 18 - .../x86/base-files/lib/upgrade/platform.sh | 3 +- target/linux/x86/config-5.10 | 433 - target/linux/x86/config-5.15 | 440 + target/linux/x86/generic/config-5.10 | 450 - target/linux/x86/generic/config-5.15 | 467 + target/linux/x86/geode/config-5.10 | 139 - target/linux/x86/geode/config-5.15 | 148 + target/linux/x86/legacy/config-5.10 | 220 - target/linux/x86/legacy/config-5.15 | 230 + target/linux/x86/modules.mk | 115 +- ...12-pcengines-apu2-detect-apuv4-board.patch | 50 - ..._ich-Enable-GPIO-driver-for-DH89xxCC.patch | 28 - ...x86-add-meraki-mx100-platform-driver.patch | 291 - .../patches-5.10/300-pcengines_apu1_led.patch | 41 - .../100-fix_cs5535_clockevt.patch | 0 .../103-pcengines_apu6_platform.patch | 280 + ..._atom-Add-Lex-3I380NX-industrial-PC-.patch | 0 ...-hwrng-geode-fix-accessing-registers.patch | 47 + target/sdk/Makefile | 10 +- target/sdk/files/Config.in | 29 +- target/sdk/files/Makefile | 4 +- target/sdk/files/{README.SDK => README.md} | 0 target/toolchain/files/wrapper.sh | 7 +- toolchain/Config.in | 12 +- toolchain/Makefile | 14 +- toolchain/binutils/Config.in | 10 +- toolchain/binutils/Config.version | 10 +- toolchain/binutils/Makefile | 50 +- .../patches/2.39/005-ld-fix-NEWS-typos.patch | 27 + ...rf-properly-skip-zero-size-functions.patch | 90 + ...-error-in-relocate-at-powerpc.cc-107.patch | 270 + ...11-PR29466-APP-NO_APP-with-.linefile.patch | 167 + ...rch-ld-Fix-relocation-error-of-pcrel.patch | 128 + ...-Re-PR29466-APP-NO_APP-with-linefile.patch | 27 + ...rel-got-relocs-against-local-symbols.patch | 38 + ...rel-got-relocs-against-local-symbols.patch | 94 + ...t-alignment-for-each-PT_LOAD-segment.patch | 89 + ...gold-internal-error-in-get_output_vi.patch | 29 + ...mbering-convention-for-pseudo-regist.patch | 301 + .../2.39/300-001_ld_makefile_patch.patch | 22 + .../400-mips_no_dynamic_linking_sym.patch | 18 + ...e-default-emulation-for-mips64-linux.patch | 38 + ...gexp-to-allow-makeinfo-to-build-docu.patch | 70 + ...er-snafu-in-some-configuration-files.patch | 444 + ...e.def-add-install-strip-dependency-o.patch | 60 + ...docs-man-pages-are-not-in-the-releas.patch | 703 + ...libgprofng.so.-are-installed-to-a-wr.patch | 212 + ...tension-JAL-available-again-for-32-b.patch | 115 + ...nversion-from-long-unsigned-int-to-u.patch | 209 + ...S-and-ZSTD_LIBS-to-ld-bootstrap-boot.patch | 50 + .../patches/2.40/036-Regen-config-files.patch | 714 + ...-dependencies-on-gmp-and-mpfr-when-g.patch | 51 + ...ol-name-comparison-in-.startof.-.siz.patch | 46 + .../2.40/300-001_ld_makefile_patch.patch | 22 + .../400-mips_no_dynamic_linking_sym.patch | 18 + ...e-default-emulation-for-mips64-linux.patch | 38 + toolchain/fortify-headers/Makefile | 4 +- .../patches/001-__ppoll_time64.patch | 11 + ...002-strings.h-add-__extension__-mark.patch | 29 + toolchain/gcc/Config.in | 19 +- toolchain/gcc/Config.version | 14 +- toolchain/gcc/common.mk | 63 +- toolchain/gcc/final/Makefile | 3 +- toolchain/gcc/initial/Makefile | 10 +- .../002-case_insensitive.patch | 0 .../gcc/patches-11.x/010-documentation.patch | 35 + ...-define-TARGET_LIBC_GNUSTACK-on-musl.patch | 46 + .../110-Fix-MIPS-PR-84790.patch | 0 .../230-musl_libssp.patch | 0 .../300-mips_Os_cpu_rtx_cost_model.patch | 0 ...rry-pick-9cf13067cb5088626ba7-from-u.patch | 39 + .../700-RISCV-Inline-subword-atomic-ops.patch | 2021 +++ ...linux-Don-t-add-latomic-with-pthread.patch | 36 + .../810-arm-softfloat-libgcc.patch | 0 .../820-libgcc_pic.patch | 0 .../840-armv4_pass_fix-v4bx_to_ld.patch | 0 .../850-use_shared_libgcc.patch | 0 .../851-libgcc_no_compat.patch | 0 .../870-ppc_no_crtsavres.patch | 0 .../881-no_tm_section.patch | 0 .../900-bad-mips16-crt.patch | 0 .../gcc/patches-11.x/910-mbsd_multi.patch | 146 + .../920-specs_nonfatal_getenv.patch | 22 + ...ibffi-fix-MIPS-softfloat-build-issue.patch | 0 ...mpilation-when-making-cross-compiler.patch | 0 .../970-macos_arm64-building-fix.patch | 0 .../002-case_insensitive.patch | 0 .../gcc/patches-12.x/010-documentation.patch | 35 + .../patches-12.x/110-Fix-MIPS-PR-84790.patch | 20 + .../gcc/patches-12.x/230-musl_libssp.patch | 13 + .../300-mips_Os_cpu_rtx_cost_model.patch | 21 + .../700-RISCV-Inline-subword-atomic-ops.patch | 2021 +++ ...linux-Don-t-add-latomic-with-pthread.patch | 36 + .../810-arm-softfloat-libgcc.patch | 0 .../gcc/patches-12.x/820-libgcc_pic.patch | 44 + .../840-armv4_pass_fix-v4bx_to_ld.patch | 0 .../patches-12.x/850-use_shared_libgcc.patch | 54 + .../851-libgcc_no_compat.patch | 0 .../patches-12.x/870-ppc_no_crtsavres.patch | 11 + .../881-no_tm_section.patch | 0 .../900-bad-mips16-crt.patch | 0 .../gcc/patches-12.x/910-mbsd_multi.patch | 146 + .../920-specs_nonfatal_getenv.patch | 22 + ...mpilation-when-making-cross-compiler.patch | 0 .../970-macos_arm64-building-fix.patch | 45 + ...imization-109585-alias-analysis-typo.patch | 69 + .../patches-13.x/002-case_insensitive.patch | 24 + .../gcc/patches-13.x/010-documentation.patch | 35 + .../patches-13.x/110-Fix-MIPS-PR-84790.patch | 20 + .../gcc/patches-13.x/230-musl_libssp.patch | 13 + .../300-mips_Os_cpu_rtx_cost_model.patch | 21 + .../700-RISCV-Inline-subword-atomic-ops.patch | 2021 +++ ...linux-Don-t-add-latomic-with-pthread.patch | 36 + .../810-arm-softfloat-libgcc.patch | 0 .../gcc/patches-13.x/820-libgcc_pic.patch | 44 + .../840-armv4_pass_fix-v4bx_to_ld.patch | 28 + .../patches-13.x/850-use_shared_libgcc.patch | 54 + .../851-libgcc_no_compat.patch | 0 .../patches-13.x/870-ppc_no_crtsavres.patch | 11 + .../gcc/patches-13.x/881-no_tm_section.patch | 11 + .../900-bad-mips16-crt.patch | 0 .../gcc/patches-13.x/910-mbsd_multi.patch | 146 + .../920-specs_nonfatal_getenv.patch | 22 + ...mpilation-when-making-cross-compiler.patch | 67 + .../970-macos_arm64-building-fix.patch | 45 + .../patches/10.3.0/010-documentation.patch | 35 - .../gcc/patches/10.3.0/230-musl_libssp.patch | 13 - .../gcc/patches/10.3.0/820-libgcc_pic.patch | 44 - .../gcc/patches/10.3.0/910-mbsd_multi.patch | 146 - .../10.3.0/920-specs_nonfatal_getenv.patch | 22 - .../10.3.0/930-fix-mips-noexecstack.patch | 111 - ...ld_using_range-range_of_address-PR10.patch | 114 - .../patches/11.2.0/010-documentation.patch | 35 - ...-define-TARGET_LIBC_GNUSTACK-on-musl.patch | 46 - .../11.2.0/110-Fix-MIPS-PR-84790.patch | 20 - .../300-mips_Os_cpu_rtx_cost_model.patch | 21 - .../11.2.0/850-use_shared_libgcc.patch | 54 - .../patches/11.2.0/870-ppc_no_crtsavres.patch | 11 - .../gcc/patches/11.2.0/910-mbsd_multi.patch | 146 - .../11.2.0/920-specs_nonfatal_getenv.patch | 22 - ...ibffi-fix-MIPS-softfloat-build-issue.patch | 168 - .../patches/8.4.0/002-case_insensitive.patch | 24 - .../gcc/patches/8.4.0/010-documentation.patch | 35 - .../patches/8.4.0/110-Fix-MIPS-PR-84790.patch | 20 - .../gcc/patches/8.4.0/230-musl_libssp.patch | 13 - .../300-mips_Os_cpu_rtx_cost_model.patch | 21 - .../8.4.0/800-arm_v5te_no_ldrd_strd.patch | 11 - .../gcc/patches/8.4.0/820-libgcc_pic.patch | 44 - .../8.4.0/840-armv4_pass_fix-v4bx_to_ld.patch | 28 - .../patches/8.4.0/850-use_shared_libgcc.patch | 54 - .../patches/8.4.0/870-ppc_no_crtsavres.patch | 11 - .../gcc/patches/8.4.0/881-no_tm_section.patch | 11 - .../gcc/patches/8.4.0/910-mbsd_multi.patch | 146 - .../8.4.0/920-specs_nonfatal_getenv.patch | 22 - .../8.4.0/930-fix-mips-noexecstack.patch | 111 - ...ibffi-fix-MIPS-softfloat-build-issue.patch | 168 - ...mpilation-when-making-cross-compiler.patch | 67 - toolchain/gdb/Makefile | 13 +- .../120-fix-compile-flag-mismatch.patch | 2 +- toolchain/glibc/Makefile | 2 +- toolchain/glibc/common.mk | 14 +- ...use-of-DES-encryption-functions-in-n.patch | 4 +- .../patches/200-add-dl-search-paths.patch | 2 +- toolchain/kernel-headers/Makefile | 1 + toolchain/musl/Makefile | 2 +- toolchain/musl/common.mk | 5 +- ...00-nftw-support-common-gnu-extension.patch | 12 +- .../musl/patches/800-mips_pie_debug.patch | 61 - toolchain/nasm/Makefile | 6 +- tools/7z/Makefile | 37 + tools/7z/patches/7-zip-flags.patch | 27 + tools/7z/patches/7-zip-musl.patch | 59 + tools/Makefile | 114 +- tools/autoconf-archive/Makefile | 20 +- tools/autoconf/Makefile | 22 +- tools/autoconf/patches/000-relocatable.patch | 158 +- tools/autoconf/patches/001-no_emacs_lib.patch | 22 - .../patches/002-musl_host_fixup.patch | 24 - tools/automake/Makefile | 32 +- tools/automake/files/aclocal | 2 +- tools/automake/patches/000-relocatable.patch | 86 +- ...clocal-skip-not-existing-directories.patch | 2 +- .../patches/101-do-not-require-files.patch | 29 + .../200-other-V-values-for-verbosity.patch | 59 + tools/bash/Makefile | 8 +- tools/bc/Makefile | 16 +- tools/bc/patches/001-no_doc.patch | 24 +- tools/bc/patches/002-fix-libmath.patch | 32 + tools/bison/Makefile | 11 +- tools/bzip2/Makefile | 52 + tools/bzip2/patches/020-no-utime.patch | 27 + .../021-merge-and-improve-makefiles.patch | 401 + tools/ccache/Makefile | 20 +- tools/ccache/files/ccache_cc | 2 - tools/ccache/files/ccache_cxx | 2 - tools/ccache/patches/100-honour-copts.patch | 16 +- tools/cmake/Makefile | 11 +- tools/cmake/patches/110-liblzma.patch | 17 + .../120-curl-fix-libressl-linking.patch | 2 +- .../130-bootstrap_parallel_make_flag.patch | 2 +- tools/cmake/patches/140-zlib.patch | 20 + tools/cmake/patches/150-zstd-libarchive.patch | 18 + tools/coreutils/Makefile | 45 +- tools/coreutils/patches/000-bootstrap.patch | 45 + tools/cpio/Makefile | 8 +- .../patches/001-duplicate-program-name.patch | 18 - tools/cpio/patches/010-clang.patch | 11 - tools/dosfstools/Makefile | 8 +- .../patches/100-source-date-epoch.patch | 150 + .../101-config-switch-to-AC_CHECK_LIB.patch | 28 + tools/dwarves/Makefile | 35 + tools/e2fsprogs/Makefile | 6 +- .../001-exit_0_on_corrected_errors.patch | 2 +- tools/e2fsprogs/patches/003-no-crond.patch | 8 +- ...-sanity-check-to-extent-manipulation.patch | 50 - tools/elfutils/Makefile | 37 + tools/expat/Makefile | 26 +- tools/fakeroot/Makefile | 8 +- .../patches/400-alpine-libc.musl-fix.patch | 2 +- tools/fakeroot/patches/600-macOS.patch | 4 +- tools/findutils/Makefile | 6 + tools/firmware-utils/Makefile | 6 +- tools/flex/Makefile | 12 +- .../flex/patches/100-disable-tests-docs.patch | 13 - tools/flock/Makefile | 4 + tools/genext2fs/Makefile | 13 +- tools/genext2fs/patches/100-c99_scanf.patch | 21 - tools/genext2fs/patches/200-autoconf.patch | 13 - .../patches/300-blocksize-creator.patch | 558 - .../genext2fs/patches/400-byteswap_fix.patch | 44 - tools/gengetopt/Makefile | 6 +- .../gengetopt/patches/100-no-tests-docs.patch | 33 - tools/gmp/Makefile | 5 + tools/gnulib/Makefile | 27 + tools/gnulib/patches/000-bootstrap.patch | 54 + tools/include/elf.h | 1750 ++- tools/isl/Makefile | 8 +- tools/libdeflate/Makefile | 38 + tools/liblzo/Makefile | 43 + .../001-add-cmake-ENABLE-configurables.patch | 68 + tools/libressl/Makefile | 22 +- tools/libtool/Makefile | 37 +- tools/libtool/patches/000-relocatable.patch | 157 +- tools/libtool/patches/100-libdir-fixes.patch | 96 +- ...10-dont-use-target-dir-for-relinking.patch | 50 +- .../120-strip-unsafe-dirs-for-relinking.patch | 35 +- tools/libtool/patches/130-trailingslash.patch | 37 + ...140-don-t-quote-SHELL-in-Makefile.am.patch | 72 + tools/libtool/patches/150-trailingslash.patch | 49 - .../libtool/patches/160-passthrough-ssp.patch | 12 - .../patches/200-openwrt-branding.patch | 144 +- tools/llvm-bpf/Makefile | 7 +- tools/lz4/Makefile | 38 + ...01-add-make-ENABLE_DOCS-configurable.patch | 60 + ...makefile-install-links-from-same-dir.patch | 71 + tools/lzma/Makefile | 1 + tools/lzop/Makefile | 33 + ...1-add-cmake-ENABLE_DOCS-configurable.patch | 24 + tools/m4/Makefile | 5 +- tools/meson/Makefile | 4 +- tools/missing-macros/src/README | 13 - tools/missing-macros/src/bin/makeinfo | 2 +- tools/missing-macros/src/m4/inttypes_h.m4 | 26 - tools/missing-macros/src/m4/lib-ld.m4 | 110 - tools/missing-macros/src/m4/lib-link.m4 | 774 -- tools/missing-macros/src/m4/lib-prefix.m4 | 224 - tools/missing-macros/src/m4/progtest.m4 | 92 - tools/missing-macros/src/m4/stdint_h.m4 | 26 - tools/missing-macros/src/m4/wint_t.m4 | 28 - tools/mkimage/Makefile | 16 +- .../030-allow-to-use-different-magic.patch | 37 +- .../patches/090-macos-arm64-builing-fix.patch | 21 - ...0-increase-tmpfile-name-length-limit.patch | 4 +- tools/mpc/Makefile | 12 +- tools/mpfr/Makefile | 8 +- tools/mpfr/patches/001-only_src.patch | 4 +- tools/mtd-utils/Makefile | 7 +- tools/mtd-utils/patches/110-portability.patch | 12 +- tools/mtd-utils/patches/130-lzma_jffs2.patch | 13 +- .../320-mkfs.jffs2-SOURCE_DATE_EPOCH.patch | 6 +- tools/mtools/Makefile | 4 +- tools/ninja/Makefile | 4 +- .../patches/100-make_jobserver_support.patch | 1769 ++- tools/patch/Makefile | 4 + tools/patchelf/Makefile | 13 +- tools/pkgconf/Makefile | 8 +- tools/sed/Makefile | 6 +- ...-of-symlinks-pointing-to-path-with-1.patch | 47 + tools/sparse/Makefile | 4 + tools/squashfs/Makefile | 41 - tools/squashfs3-lzma/Makefile | 46 + .../patches/100-lzma.patch | 0 .../patches/110-no_nonstatic_inline.patch | 0 .../120-add-fixed-timestamp-support.patch | 0 .../patches/130-include_sysmacros.patch | 0 .../patches/140-gcc-10-fix.patch | 0 .../patches/150-fix-unitialized-memory.patch | 11 + tools/squashfs4/Makefile | 44 + ...rt-multiple-lzma-configuration-optio.patch | 187 + ...new-OpenWrt-extended-options-non-def.patch | 898 ++ tools/squashfskit4/Makefile | 41 - .../patches/0001-fix-version.sh.patch | 21 - ...002-fix-build-failure-against-gcc-10.patch | 41 - .../patches/0010-portability.patch | 37 - .../patches/0020-big-endian.patch | 14 - tools/tar/Makefile | 4 + tools/xz/Makefile | 8 +- tools/zip/Makefile | 6 +- tools/zlib/Makefile | 34 +- ...x-compressor-crash-on-certain-inputs.patch | 343 - tools/zstd/Makefile | 8 +- 3899 files changed, 520121 insertions(+), 196894 deletions(-) create mode 100644 README.md create mode 100644 docs/Basic_Wireless_Settings.md create mode 100644 docs/Ben_Nanonote.md create mode 100644 docs/Bridge_Mode.md create mode 100644 docs/FAQ.md create mode 100644 docs/Flavors.md create mode 100644 docs/GL-AR300M.md create mode 100644 docs/How To Submit A Change To This Wiki.md create mode 100644 docs/How_To_Build_libreCMC.md create mode 100644 docs/Image_Support.md create mode 100644 docs/LICENSE.md create mode 100644 docs/List_of_Tested_Hardware.md create mode 100644 docs/OpenVPN_Layer_2_Server.md create mode 100644 docs/Port_Forwards.md create mode 100644 docs/README.md create mode 100644 docs/Router_Reset_Instructions.md create mode 100644 docs/Serial.md create mode 100644 docs/Soft_Brick_Recovery_With_IPv6.md create mode 100644 docs/Supported_Hardware.md create mode 100644 docs/System_Log.md create mode 100644 docs/TL_MR3020.md create mode 100644 docs/TL_WR1043ND.md create mode 100644 docs/TL_WR741ND.md create mode 100644 docs/TL_WR841ND.md create mode 100644 docs/TL_WR842ND.md create mode 100644 docs/TPE_NWIFIROUTER2.md create mode 100644 docs/TPE_R1100.md create mode 100644 docs/TPE_R1200.md create mode 100644 docs/WNDR3800.md create mode 100644 docs/WZR_HP_G300NH.md create mode 100644 docs/Welcome.md create mode 100644 docs/ccs.md create mode 100644 docs/embedded.md create mode 100644 docs/images/librecmc-changing-admin-password.png create mode 100644 docs/images/librecmc-changing-essid.png create mode 100644 docs/images/librecmc-changing-wifi-password.png create mode 100644 docs/images/librecmc-default-interfaces.png create mode 100644 docs/images/librecmc-default-login.png create mode 100644 docs/images/librecmc-dhcp-server-ignore-lan.png create mode 100644 docs/images/librecmc-eth0-added-to-lan.png create mode 100644 docs/images/librecmc-luci-selecting-system-log.png create mode 100644 docs/images/librecmc-luci-system-log.png create mode 100644 docs/images/librecmc-port-forwards-after-save-apply.png create mode 100644 docs/images/librecmc-port-forwards-entering-parameters.png create mode 100644 docs/images/librecmc-selecting-firewall-menu.png create mode 100644 docs/images/librecmc-selecting-port-forwards-tab.png create mode 100644 docs/images/librecmc-switch-lan-to-dhcp.png create mode 100644 docs/images/serial.png rename {package/luci/docs => docs/luci-docs}/CBI.md (100%) rename {package/luci/docs => docs/luci-docs}/JsonRpcHowTo.md (100%) rename {package/luci/docs => docs/luci-docs}/LAR.md (100%) rename {package/luci/docs => docs/luci-docs}/LMO.md (100%) rename {package/luci/docs => docs/luci-docs}/LuCI-0.10.md (100%) rename {package/luci/docs => docs/luci-docs}/Modules.md (100%) rename {package/luci/docs => docs/luci-docs}/ModulesHowTo.md (100%) rename {package/luci/docs => docs/luci-docs}/README.md (100%) rename {package/luci/docs => docs/luci-docs}/Templates.md (100%) rename {package/luci/docs => docs/luci-docs}/ThemesHowTo.md (100%) rename {package/luci/docs => docs/luci-docs}/api/index.html (100%) rename {package/luci/docs => docs/luci-docs}/api/luadoc.css (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.dispatcher.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.http.conditionals.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.http.date.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.http.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.http.mime.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.i18n.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.ip.cidr.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.ip.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.json.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.jsonc.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.jsonc.parser.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.model.ipkg.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.model.uci.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.rpcc.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.rpcc.ruci.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.sys.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.sys.init.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.sys.iptparser.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.sys.net.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.sys.process.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.sys.user.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.sys.wifi.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.util.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/luci.xml.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.CHANGELOG.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.CryptoHash.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.File.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.README.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.Socket.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.TLSContext.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.TLSSocket.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.UnifiedIO.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.bin.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.bit.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.crypto.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.fs.html (100%) rename {package/luci/docs => docs/luci-docs}/api/modules/nixio.html (100%) rename {package/luci/docs => docs/luci-docs}/i18n.md (100%) create mode 100644 docs/luci-docs/jsapi/README.md create mode 100644 docs/old/Save_WiFi.md create mode 100644 docs/testing.md create mode 100644 docs/unbrick_with_uboot_mod.md delete mode 100644 include/kernel-5.10 create mode 100644 include/kernel-5.15 create mode 100644 include/openssl-module.mk create mode 100644 include/site/riscv64 delete mode 120000 package/base-files/files/etc/os-release mode change 100755 => 100644 package/boot/arm-trusted-firmware-rockchip/Makefile create mode 100644 package/boot/grub2/files/grub-early-gpt.cfg delete mode 100644 package/boot/kexec-tools/patches/001-arm-do-not-copy-magic-4-bytes-of-appended-DTB-in-zIm.patch delete mode 100644 package/boot/uboot-envtools/files/apm821xx delete mode 100644 package/boot/uboot-envtools/files/cns3xxx delete mode 100644 package/boot/uboot-envtools/files/imx_cortexa9 delete mode 100644 package/boot/uboot-envtools/files/ipq40xx delete mode 100644 package/boot/uboot-envtools/files/ipq806x delete mode 100644 package/boot/uboot-envtools/files/kirkwood delete mode 100644 package/boot/uboot-envtools/files/lantiq delete mode 100644 package/boot/uboot-envtools/files/layerscape create mode 100644 package/boot/uboot-envtools/files/mediatek_filogic create mode 100644 package/boot/uboot-envtools/files/mediatek_mt7629 delete mode 100644 package/boot/uboot-envtools/files/mpc85xx delete mode 100644 package/boot/uboot-envtools/files/mxs delete mode 100644 package/boot/uboot-envtools/files/oxnas delete mode 100644 package/boot/uboot-envtools/files/pistachio delete mode 100644 package/boot/uboot-envtools/files/qoriq delete mode 100644 package/boot/uboot-envtools/files/realtek delete mode 100644 package/boot/uboot-rockchip/patches/102-add-tpe-r1400.patch create mode 100644 package/boot/uboot-rockchip/patches/102-rockchip-rk3328-Add-support-for-FriendlyARM-NanoPi-R2C.patch create mode 100644 package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orange-Pi-R1-Plus.patch create mode 100644 package/boot/uboot-rockchip/patches/104-rockchip-rk3328-Add-support-for-Orange-Pi-R1-Plus-LT.patch create mode 100644 package/boot/uboot-rockchip/patches/105-rockchip-rk3328-Add-support-for-ThinkPenguin-TPE-R1400.patch create mode 100644 package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-decl.h create mode 100644 package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-plat.c create mode 100644 package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-structs-gen.h create mode 100644 package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-decl.h create mode 100644 package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-plat.c create mode 100644 package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-structs-gen.h create mode 100644 package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-decl.h create mode 100644 package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c create mode 100644 package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h create mode 100644 package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-decl.h create mode 100644 package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-plat.c create mode 100644 package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-structs-gen.h create mode 100644 package/boot/uboot-sunxi/patches/250-sun8i-h3-add-support-for-zeropi.patch delete mode 100644 package/boot/uboot-sunxi/patches/250-sun8i-h3-zeropi-add-device-tree.patch delete mode 100644 package/boot/uboot-sunxi/patches/251-sun8i-h3-zeropi-add-defconfig.patch create mode 100644 package/boot/uboot-sunxi/patches/270-arm-sunxi-increase-SYS_MALLOC_F_LEN.patch create mode 100644 package/devel/binutils/patches/001-replace-attribute_const.patch create mode 100644 package/devel/gdb/patches/001-Add-support-for-readline-8.2.patch create mode 100644 package/devel/gperf/Makefile create mode 100644 package/devel/kselftests-bpf/Makefile delete mode 100644 package/devel/trace-cmd/patches/100-musl.patch delete mode 100644 package/devel/trace-cmd/patches/110-mac80211_tracepoint.patch mode change 100755 => 100644 package/firmware/linux-libre-firmware/Makefile mode change 100755 => 100644 package/firmware/linux-libre-firmware/qca.mk create mode 100644 package/kernel/bpf-headers/patches/100-support_hz_300.patch delete mode 100644 package/kernel/button-hotplug/src/Kconfig delete mode 100644 package/kernel/ksmbd/Makefile delete mode 100644 package/kernel/ksmbd/patches/01-keep_kmod_metadata.patch create mode 100644 package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch create mode 100644 package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch create mode 100644 package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch create mode 100644 package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch create mode 100644 package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch create mode 100644 package/kernel/mac80211/patches/ath10k/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch create mode 100644 package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch create mode 100644 package/kernel/mac80211/patches/ath10k/988-ath10k-always-use-mac80211-loss-detection.patch create mode 100644 package/kernel/mac80211/patches/ath10k/990-ath10k-small-buffers.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0001-wifi-ath11k-stop-tx-queues-immediately-upon-firmware.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0002-wifi-ath11k-Don-t-exit-on-wakeup-failure.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0005-wifi-ath11k-Fix-spelling-mistake-chnange-change.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0007-wifi-ath11k-suppress-add-interface-error.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0008-wifi-ath11k-add-support-to-configure-channel-dwell-t.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0010-wifi-ath11k-Fix-firmware-crash-on-vdev-delete-race-c.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0011-wifi-ath11k-fix-monitor-vdev-creation-with-firmware-.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0012-wifi-ath11k-Fix-qmi_msg_handler-data-structure-initi.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0013-wifi-ath11k-synchronize-ath11k_mac_he_gi_to_nl80211_.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0016-wifi-ath11k-Make-QMI-message-rules-const.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0017-wifi-ath11k-Trigger-sta-disconnect-on-hardware-resta.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0018-wifi-ath11k-Fix-race-condition-with-struct-htt_ppdu_.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-update-hw-params-for-IPQ5018.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-update-ce-configurations-for-IPQ5018.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-remap-ce-register-space-for-IPQ5018.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0022-wifi-ath11k-update-hal-srng-regs-for-IPQ5018.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0023-wifi-ath11k-initialize-hw_ops-for-IPQ5018.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0024-wifi-ath11k-add-new-hw-ops-for-IPQ5018-to-get-rx-des.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-add-ipq5018-device-support.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0026-wifi-ath11k-Fix-scan-request-param-frame-size-warnin.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0029-wifi-ath11k-Add-support-to-configure-FTM-responder-r.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0030-wifi-ath11k-add-channel-177-into-5-GHz-channel-list.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0031-wifi-ath11k-fix-ce-memory-mapping-for-ahb-devices.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0033-wifi-ath11k-Set-ext-passive-scan-flag-to-adjust-pass.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0034-wifi-ath11k-fix-return-value-check-in-ath11k_ahb_pro.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0037-wifi-ath11k-allow-system-suspend-to-survive-ath11k.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0038-wifi-ath11k-modify-accessor-macros-to-match-index-si.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0039-wifi-ath11k-push-MU-MIMO-params-from-hostapd-to-hard.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0040-wifi-ath11k-move-HE-MCS-mapper-to-a-separate-functio.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0041-wifi-ath11k-generate-rx-and-tx-mcs-maps-for-supporte.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0042-wifi-ath11k-Add-tx-ack-signal-support-for-management.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0043-wifi-ath11k-use-proper-regulatory-reference-for-band.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0044-wifi-ath11k-add-support-to-parse-new-WMI-event-for-6.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0045-wifi-ath11k-add-debug-prints-in-regulatory-WMI-event.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0046-wifi-ath11k-Replace-fake-flex-array-with-flexible-ar.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0047-wifi-ath11k-fix-deinitialization-of-firmware-resourc.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0048-wifi-ath11k-fix-BUFFER_DONE-read-on-monitor-ring-rx-.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0049-wifi-ath11k-Optimize-6-GHz-scan-time.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0050-wifi-ath11k-Configure-the-FTM-responder-role-using-f.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0051-wifi-ath11k-fix-rssi-station-dump-not-updated-in-QCN.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0052-wifi-ath11k-Fix-invalid-management-rx-frame-length-i.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0053-wifi-ath11k-fix-writing-to-unintended-memory-region.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0054-wifi-ath11k-Send-11d-scan-start-before-WMI_START_SCA.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0055-wifi-ath11k-Remove-redundant-pci_clear_master.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0056-wifi-ath11k-Disable-Spectral-scan-upon-removing-inte.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0057-wifi-ath11k-enable-SAR-support-on-WCN6750.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0058-wifi-ath11k-pci-Add-more-MODULE_FIRMWARE-entries.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0059-wifi-ath11k-print-a-warning-when-crypto_alloc_shash-.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0060-wifi-ath11k-Ignore-frags-from-uninitialized-peer-in-.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0061-wifi-ath11k-fix-undefined-behavior-with-__fls-in-dp.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0062-wifi-ath11k-fix-double-free-of-peer-rx_tid-during-re.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0063-wifi-ath11k-Prevent-REO-cmd-failures.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0064-wifi-ath11k-add-peer-mac-information-in-failure-case.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0065-wifi-ath11k-fix-tx-status-reporting-in-encap-offload.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0066-wifi-ath11k-Fix-incorrect-update-of-radiotap-fields.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0067-wifi-ath11k-Fix-SKB-corruption-in-REO-destination-ri.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0068-wifi-ath11k-Remove-disabling-of-80-80-and-160-MHz.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0069-wifi-ath11k-fix-registration-of-6Ghz-only-phy-withou.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0070-wifi-ath-work-around-false-positive-stringop-overrea.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0071-wifi-ath11k-driver-settings-for-MBSSID-and-EMA.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0072-wifi-ath11k-MBSSID-configuration-during-vdev-create-.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0073-wifi-ath11k-rename-MBSSID-fields-in-wmi_vdev_up_cmd.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0074-wifi-ath11k-MBSSID-parameter-configuration-in-AP-mod.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0075-wifi-ath11k-refactor-vif-parameter-configurations.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0076-wifi-ath11k-MBSSID-beacon-support.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0077-wifi-ath11k-EMA-beacon-support.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0078-wifi-ath11k-Relocate-the-func-ath11k_mac_bitrate_mas.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0079-wifi-ath11k-Send-HT-fixed-rate-in-WMI-peer-fixed-par.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0081-wifi-ath11k-remove-unused-function-ath11k_tm_event_w.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0082-wifi-ath11k-factory-test-mode-support.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0083-wifi-ath11k-Allow-ath11k-to-boot-without-caldata-in-.patch create mode 100644 package/kernel/mac80211/patches/ath11k/0084-wifi-ath11k-Add-HTT-stats-for-PHY-reset-case.patch create mode 100644 package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch create mode 100644 package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch create mode 100644 package/kernel/mac80211/patches/ath11k/901-wifi-ath11k-pci-fix-compilation-in-5.16-and-older.patch create mode 100644 package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch create mode 100644 package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch create mode 100644 package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch delete mode 100644 package/kernel/mac80211/patches/ath9k/040-ath9k-support-DT-ieee80211-freq-limit-property-to-li.patch delete mode 100644 package/kernel/mac80211/patches/ath9k/600-v5.16-ath9k-fetch-calibration-data-via-nvmem-subsystem.patch delete mode 100644 package/kernel/mac80211/patches/ath9k/601-v5.16-ath9k-owl-loader-fetch-pci-init-values-through-nvmem.patch delete mode 100644 package/kernel/mac80211/patches/build/015-ipw200-mtu.patch create mode 100644 package/kernel/mac80211/patches/build/070-remove-broken-wext-select.patch create mode 100644 package/kernel/mac80211/patches/build/080-resv_start_op.patch create mode 100644 package/kernel/mac80211/patches/build/090-bcma-otp.patch create mode 100644 package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch create mode 100644 package/kernel/mac80211/patches/build/110-backport_napi_build_skb.patch create mode 100644 package/kernel/mac80211/patches/mt7601u/001-wifi-mt7601u-update-firmware-path.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/001-rt2x00-define-RF5592-in-init_eeprom-routine.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/002-rt2x00-add-throughput-LED-trigger.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/003-rt2x00-add-support-for-external-PA-on-MT7620.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/004-rt2x00-move-up-and-reuse-busy-wait-functions.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/005-rt2x00-add-RF-self-TXDC-calibration-for-MT7620.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/006-rt2x00-add-r-calibration-for-MT7620.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/007-rt2x00-add-RXDCOC-calibration-for-MT7620.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/008-rt2x00-add-RXIQ-calibration-for-MT7620.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/010-rt2x00-add-TX-LOFT-calibration-for-MT7620.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/011-rt2x00-move-helper-functions-up-in-file.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/012-rt2x00-fix-HT20-HT40-bandwidth-switch-on-MT7620.patch create mode 100644 package/kernel/mac80211/patches/rt2x00/998-wifi-rt2x00-rework-MT7620-PA-LNA-RF-calibration.patch delete mode 100644 package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch rename package/kernel/mac80211/patches/subsys/{309-mac80211-minstrel_ht-fix-MINSTREL_FRAC-macro.patch => 302-mac80211-minstrel_ht-fix-MINSTREL_FRAC-macro.patch} (100%) create mode 100644 package/kernel/mac80211/patches/subsys/303-mac80211-minstrel_ht-reduce-fluctuations-in-rate-pro.patch delete mode 100644 package/kernel/mac80211/patches/subsys/303-mac80211-set-up-the-fwd_skb-dev-for-mesh-forwarding.patch create mode 100644 package/kernel/mac80211/patches/subsys/304-mac80211-minstrel_ht-rework-rate-downgrade-code-and-.patch create mode 100644 package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch create mode 100644 package/kernel/mac80211/patches/subsys/306-01-v6.2-wifi-mac80211-add-internal-handler-for-wake_tx_queue.patch create mode 100644 package/kernel/mac80211/patches/subsys/306-02-v6.2-wifi-mac80211-add-wake_tx_queue-callback-to-drivers.patch create mode 100644 package/kernel/mac80211/patches/subsys/306-03-v6.2-wifi-mac80211-Drop-support-for-TX-push-path.patch create mode 100644 package/kernel/mac80211/patches/subsys/306-04-v6.2-wifi-realtek-remove-duplicated-wake_tx_queue.patch delete mode 100644 package/kernel/mac80211/patches/subsys/306-mac80211-use-coarse-boottime-for-airtime-fairness-co.patch delete mode 100644 package/kernel/mac80211/patches/subsys/307-mac80211_hwsim-make-6-GHz-channels-usable.patch delete mode 100644 package/kernel/mac80211/patches/subsys/308-mac80211-add-support-for-.ndo_fill_forward_path.patch delete mode 100644 package/kernel/mac80211/patches/subsys/310-mac80211-minstrel_ht-reduce-fluctuations-in-rate-pro.patch create mode 100644 package/kernel/mac80211/patches/subsys/310-v6.2-mac80211-add-support-for-restricting-netdev-features.patch delete mode 100644 package/kernel/mac80211/patches/subsys/311-mac80211-minstrel_ht-rework-rate-downgrade-code-and-.patch create mode 100644 package/kernel/mac80211/patches/subsys/311-v6.2-wifi-mac80211-fix-and-simplify-unencrypted-drop-chec.patch delete mode 100644 package/kernel/mac80211/patches/subsys/312-mac80211-split-beacon-retrieval-functions.patch create mode 100644 package/kernel/mac80211/patches/subsys/312-v6.3-wifi-cfg80211-move-A-MSDU-check-in-ieee80211_data_to.patch delete mode 100644 package/kernel/mac80211/patches/subsys/313-nl80211-MBSSID-and-EMA-support-in-AP-mode.patch create mode 100644 package/kernel/mac80211/patches/subsys/313-v6.3-wifi-cfg80211-factor-out-bridge-tunnel-RFC1042-heade.patch delete mode 100644 package/kernel/mac80211/patches/subsys/314-cfg80211-implement-APIs-for-dedicated-radar-detectio.patch create mode 100644 package/kernel/mac80211/patches/subsys/314-v6.3-wifi-mac80211-remove-mesh-forwarding-congestion-chec.patch delete mode 100644 package/kernel/mac80211/patches/subsys/315-cfg80211-move-offchan_cac_event-to-a-dedicated-work.patch create mode 100644 package/kernel/mac80211/patches/subsys/315-v6.3-wifi-mac80211-fix-receiving-A-MSDU-frames-on-mesh-in.patch delete mode 100644 package/kernel/mac80211/patches/subsys/316-cfg80211-fix-possible-NULL-pointer-dereference-in-cf.patch create mode 100644 package/kernel/mac80211/patches/subsys/316-v6.3-wifi-mac80211-add-a-workaround-for-receiving-non-sta.patch delete mode 100644 package/kernel/mac80211/patches/subsys/317-cfg80211-schedule-offchan_cac_abort_wk-in-cfg80211_r.patch delete mode 100644 package/kernel/mac80211/patches/subsys/318-cfg80211-allow-continuous-radar-monitoring-on-offcha.patch create mode 100644 package/kernel/mac80211/patches/subsys/318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch delete mode 100644 package/kernel/mac80211/patches/subsys/319-mac80211-introduce-set_radar_offchan-callback.patch create mode 100644 package/kernel/mac80211/patches/subsys/319-wifi-mac80211-mesh-fast-xmit-support.patch delete mode 100644 package/kernel/mac80211/patches/subsys/320-cfg80211-rename-offchannel_chain-structs-to-backgrou.patch create mode 100644 package/kernel/mac80211/patches/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch create mode 100644 package/kernel/mac80211/patches/subsys/321-mac80211-fix-mesh-forwarding.patch create mode 100644 package/kernel/mac80211/patches/subsys/322-wifi-mac80211-fix-mesh-path-discovery-based-on-unica.patch delete mode 100644 package/kernel/mac80211/patches/subsys/323-mac80211-MBSSID-support-in-interface-handling.patch create mode 100644 package/kernel/mac80211/patches/subsys/323-v6.3-wifi-mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee8.patch delete mode 100644 package/kernel/mac80211/patches/subsys/324-mac80211-MBSSID-beacon-handling-in-AP-mode.patch create mode 100644 package/kernel/mac80211/patches/subsys/324-v6.3-wifi-mac80211-Add-HE-MU-MIMO-related-flags-in-ieee80.patch delete mode 100644 package/kernel/mac80211/patches/subsys/325-mac80211-MBSSID-channel-switch.patch create mode 100644 package/kernel/mac80211/patches/subsys/325-wifi-mac80211-introduce-ieee80211_refresh_tx_agg_ses.patch delete mode 100644 package/kernel/mac80211/patches/subsys/326-mac80211-update-bssid_indicator-in-ieee80211_assign_.patch create mode 100644 package/kernel/mac80211/patches/subsys/326-wifi-mac80211-add-mesh-fast-rx-support.patch create mode 100644 package/kernel/mac80211/patches/subsys/327-wifi-mac80211-add-support-for-letting-drivers-regist.patch delete mode 100644 package/kernel/mac80211/patches/subsys/328-mac80211-do-not-wake-queues-on-a-vif-that-is-being-s.patch create mode 100644 package/kernel/mac80211/patches/subsys/329-wifi-mac80211-fix-receiving-mesh-packets-in-forwardi.patch delete mode 100644 package/kernel/mac80211/patches/subsys/330-mac80211-switch-airtime-fairness-back-to-deficit-rou.patch create mode 100644 package/kernel/mac80211/patches/subsys/330-wifi-ieee80211-correctly-mark-FTM-frames-non-buffera.patch delete mode 100644 package/kernel/mac80211/patches/subsys/331-mac80211-make-sta-airtime-deficit-field-s32-instead-.patch create mode 100644 package/kernel/mac80211/patches/subsys/331-wifi-mac80211-flush-queues-on-STA-removal.patch delete mode 100644 package/kernel/mac80211/patches/subsys/332-mac80211-consider-aql_tx_pending-when-checking-airti.patch create mode 100644 package/kernel/mac80211/patches/subsys/332-wifi-iwlwifi-mvm-support-flush-on-AP-interfaces.patch delete mode 100644 package/kernel/mac80211/patches/subsys/333-mac80211-keep-recently-active-tx-queues-in-schedulin.patch create mode 100644 package/kernel/mac80211/patches/subsys/333-wifi-mac80211-add-flush_sta-method.patch delete mode 100644 package/kernel/mac80211/patches/subsys/334-mac80211-add-a-per-PHY-AQL-limit-to-improve-fairness.patch create mode 100644 package/kernel/mac80211/patches/subsys/334-wifi-iwlwifi-mvm-support-new-flush_sta-method.patch delete mode 100644 package/kernel/mac80211/patches/subsys/335-mac80211-add-debugfs-file-to-display-per-phy-AQL-pen.patch create mode 100644 package/kernel/mac80211/patches/subsys/335-wifi-mac80211-add-LDPC-related-flags-in-ieee80211_bs.patch delete mode 100644 package/kernel/mac80211/patches/subsys/336-mac80211-only-accumulate-airtime-deficit-for-active-.patch create mode 100644 package/kernel/mac80211/patches/subsys/336-v6.4-wifi-mac80211-generate-EMA-beacons-in-AP-mode.patch delete mode 100644 package/kernel/mac80211/patches/subsys/337-mac80211-increase-quantum-for-airtime-scheduler.patch delete mode 100644 package/kernel/mac80211/patches/subsys/339-mac80211-exclude-multicast-packets-from-AQL-pending-.patch create mode 100644 package/kernel/mac80211/patches/subsys/340-cfg80211-allow-grace-period-for-DFS-available-after-.patch delete mode 100644 package/kernel/mac80211/patches/subsys/340-wifi-mac80211-do-not-abuse-fq.lock-in-ieee80211_do_s.patch delete mode 100644 package/kernel/mac80211/patches/subsys/341-mac80211-Fix-deadlock-Don-t-start-TX-while-holding-f.patch delete mode 100644 package/kernel/mac80211/patches/subsys/342-mac80211-Ensure-vif-queues-are-operational-after-sta.patch delete mode 100644 package/kernel/mac80211/patches/subsys/343-wifi-mac80211-fix-decap-offload-for-stations-on-AP_V.patch delete mode 100644 package/kernel/mac80211/patches/subsys/344-wifi-cfg80211-fix-ieee80211_data_to_8023_exthdr-hand.patch delete mode 100644 package/kernel/mac80211/patches/subsys/345-wifi-mac80211-do-not-drop-packets-smaller-than-the-L.patch delete mode 100644 package/kernel/mac80211/patches/subsys/346-v6.0-wifi-mac80211-fix-mesh-airtime-link-metric-estimatin.patch create mode 100644 package/kernel/mac80211/patches/subsys/400-allow-ibss-mixed.patch create mode 100644 package/libs/c-ares/Makefile delete mode 100644 package/libs/gettext-full/patches/001-no_examples_and_tests.patch delete mode 100644 package/libs/gettext-full/patches/010-m4.patch create mode 100644 package/libs/gettext-full/patches/100-libxml-no-force-included.patch delete mode 100644 package/libs/gettext-full/patches/150-disable_libxml_iconv.patch create mode 100644 package/libs/gettext-full/patches/200-libunistring-missing-link.patch delete mode 100644 package/libs/glib2/patches/010-libintl.patch create mode 100644 package/libs/glib2/patches/010-pcre.patch create mode 100644 package/libs/glib2/patches/020-locale.patch create mode 100644 package/libs/libbpf/Makefile create mode 100644 package/libs/libbpf/patches/001-cflags.patch create mode 100644 package/libs/libbsd/patches/001-fix-libpath.patch create mode 100644 package/libs/libcap/patches/900-use-more-compatible-shebang.patch create mode 100644 package/libs/libedit/Makefile create mode 100644 package/libs/libgcrypt/Makefile create mode 100644 package/libs/libgpg-error/Makefile create mode 100644 package/libs/libgpg-error/patches/001-cross-compile-fix.patch create mode 100644 package/libs/libgpg-error/patches/010-add-arc-support.patch delete mode 100644 package/libs/libiconv/COPYING delete mode 100644 package/libs/libiconv/COPYRIGHT delete mode 100644 package/libs/libiconv/Makefile delete mode 100644 package/libs/libiconv/src/LICENSE delete mode 100644 package/libs/libiconv/src/iconv.c delete mode 100644 package/libs/libiconv/src/include/charmaps.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-10.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-13.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-14.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-16.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-2.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-3.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-4.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-5.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-6.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-7.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-8.h delete mode 100644 package/libs/libiconv/src/include/charmaps/iso-8859-9.h delete mode 100644 package/libs/libiconv/src/include/charmaps/koi8-r.h delete mode 100644 package/libs/libiconv/src/include/charmaps/windows-1250.h delete mode 100644 package/libs/libiconv/src/include/charmaps/windows-1251.h delete mode 100644 package/libs/libiconv/src/include/charmaps/windows-1252.h delete mode 100644 package/libs/libiconv/src/include/charmaps/windows-1253.h delete mode 100644 package/libs/libiconv/src/include/charmaps/windows-1254.h delete mode 100644 package/libs/libiconv/src/include/charmaps/windows-1255.h delete mode 100644 package/libs/libiconv/src/include/charmaps/windows-1256.h delete mode 100644 package/libs/libiconv/src/include/charmaps/windows-1257.h delete mode 100644 package/libs/libiconv/src/include/charmaps/windows-1258.h delete mode 100644 package/libs/libiconv/src/include/charmaps/windows-874.h delete mode 100644 package/libs/libiconv/src/include/iconv.h delete mode 100644 package/libs/libiconv/src/m4/iconv.m4 create mode 100644 package/libs/libidn2/Makefile delete mode 100644 package/libs/libjson-c/patches/010-clang.patch create mode 100644 package/libs/libjson-c/patches/010-fix-build-with-clang-15.patch create mode 100644 package/libs/libmd/Makefile delete mode 100644 package/libs/libnl/patches/100-build-add-Libs.private-field-in-libnl-pkg-config-file.patch delete mode 100644 package/libs/libpcap/patches/201-space_optimization.patch create mode 100644 package/libs/libpcap/patches/300-Add-support-for-B.A.T.M.A.N.-Advanced.patch create mode 100644 package/libs/libselinux/Makefile create mode 100644 package/libs/libsemanage/Makefile create mode 100644 package/libs/libssh2/Makefile create mode 100644 package/libs/libtraceevent/Makefile create mode 100644 package/libs/libtracefs/Makefile create mode 100644 package/libs/libunistring/Makefile delete mode 100644 package/libs/libunwind/patches/001-Don-t-force-exec_prefix-lib64-libdir-on-ppc64.patch delete mode 100644 package/libs/libusb/patches/001-Correct-a-typo-in-the-Changelog-and-clean-up-a-stray.patch delete mode 100644 package/libs/libusb/patches/002-linux_usbfs-Fix-parsing-of-descriptors-for-multi-con.patch create mode 100644 package/libs/libxml2/patches/010-iconv.patch delete mode 100644 package/libs/libxslt/patches/010-fix-xml2-config-check.patch create mode 100644 package/libs/lzo/Makefile create mode 100644 package/libs/mbedtls/Config.in delete mode 100644 package/libs/mbedtls/patches/100-fix-compile.patch create mode 100644 package/libs/mbedtls/patches/100-x509-crt-verify-SAN-iPAddress.patch delete mode 100644 package/libs/mbedtls/patches/101-bn_mul.h-workaround-for-gcc-11.2.0-issues.patch create mode 100644 package/libs/mbedtls/patches/101-remove-test.patch delete mode 100644 package/libs/mbedtls/patches/200-config.patch create mode 100644 package/libs/nghttp2/Makefile create mode 100644 package/libs/nghttp3/Makefile create mode 100644 package/libs/ngtcp2/Makefile delete mode 100644 package/libs/openssl/engine.mk create mode 100644 package/libs/openssl/files/legacy.cnf delete mode 100644 package/libs/openssl/patches/001-crypto-perlasm-ppc-xlate.pl-add-linux64v2-flavour.patch create mode 100644 package/libs/openssl/patches/130-dont-build-fuzz-docs.patch delete mode 100644 package/libs/openssl/patches/130-dont-build-tests-fuzz.patch delete mode 100644 package/libs/openssl/patches/200-x509-excessive-resource-use-verifying-policy-constra.patch delete mode 100644 package/libs/openssl/patches/210-Ensure-that-EXFLAG_INVALID_POLICY-is-checked-even-in.patch delete mode 100644 package/libs/openssl/patches/400-eng_devcrypto-save-ioctl-if-EVP_MD_.FLAG_ONESHOT.patch delete mode 100644 package/libs/openssl/patches/410-eng_devcrypto-add-configuration-options.patch delete mode 100644 package/libs/openssl/patches/420-eng_devcrypto-add-command-to-dump-driver-info.patch delete mode 100644 package/libs/openssl/patches/430-e_devcrypto-make-the-dev-crypto-engine-dynamic.patch delete mode 100644 package/libs/pcre/Config.in delete mode 100644 package/libs/pcre/Makefile create mode 100644 package/libs/pcre2/Config.in create mode 100644 package/libs/pcre2/Makefile create mode 100644 package/libs/popt/patches/100-configure.ac-remove-require-gettext-version.patch create mode 100644 package/libs/sqlite3/Config-cli.in create mode 100644 package/libs/sqlite3/Config-lib.in create mode 100644 package/libs/sqlite3/Makefile delete mode 100644 package/libs/zlib/patches/001-neon-implementation-of-adler32.patch delete mode 100644 package/libs/zlib/patches/006-fix-CVE-2022-37434.patch delete mode 100644 package/libs/zlib/patches/006-fix-compressor-crash-on-certain-inputs.patch delete mode 100644 package/libs/zlib/patches/007-fix-null-dereference-in-fix-CVE-2022-37434.patch delete mode 100644 package/luci/.github/issue_template delete mode 100644 package/luci/.github/workflows/build.yml delete mode 100644 package/luci/.github/workflows/ci_helpers.sh delete mode 100644 package/luci/.github/workflows/formal.yml delete mode 100644 package/luci/.github/workflows/jsdoc.yml delete mode 100644 package/luci/.gitignore create mode 100644 package/luci/applications/luci-app-adblock-fast/Makefile create mode 100644 package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js create mode 100644 package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js create mode 100644 package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js create mode 100644 package/luci/applications/luci-app-adblock-fast/po/ar/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/bg/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/bn_BD/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/ca/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/cs/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/da/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/de/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/el/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/en/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/es/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/fi/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/fr/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/he/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/hi/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/hu/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/it/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/ja/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/ko/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/lt/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/mr/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/ms/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/nb_NO/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/pl/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/pt/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/pt_BR/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/ro/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/ru/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/sk/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/sv/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/templates/adblock-fast.pot create mode 100644 package/luci/applications/luci-app-adblock-fast/po/tr/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/uk/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/vi/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/zh_Hans/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/po/zh_Hant/adblock-fast.po create mode 100644 package/luci/applications/luci-app-adblock-fast/root/etc/uci-defaults/40_luci-adblock-fast create mode 100755 package/luci/applications/luci-app-adblock-fast/root/usr/libexec/rpcd/luci.adblock-fast create mode 100644 package/luci/applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json create mode 100644 package/luci/applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json create mode 100644 package/luci/applications/luci-app-adblock/Makefile create mode 100644 package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js create mode 100644 package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js create mode 100644 package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js create mode 100644 package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js create mode 100644 package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js create mode 100644 package/luci/applications/luci-app-adblock/po/ar/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/bg/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/bn_BD/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/ca/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/cs/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/da/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/de/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/el/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/en/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/es/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/fi/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/fr/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/he/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/hi/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/hu/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/it/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/ja/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/ko/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/lt/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/mr/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/ms/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/nb_NO/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/nl/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/pl/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/pt/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/pt_BR/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/ro/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/ru/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/si/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/sk/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/sv/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/templates/adblock.pot create mode 100644 package/luci/applications/luci-app-adblock/po/tr/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/uk/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/vi/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/zh_Hans/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/po/zh_Hant/adblock.po create mode 100644 package/luci/applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json create mode 100644 package/luci/applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json create mode 100644 package/luci/applications/luci-app-aria2/Makefile create mode 100644 package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js create mode 100644 package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js create mode 100644 package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js create mode 100644 package/luci/applications/luci-app-aria2/po/ar/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/bg/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/bn_BD/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/ca/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/cs/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/da/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/de/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/el/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/en/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/es/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/fi/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/fr/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/he/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/hi/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/hu/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/it/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/ja/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/ko/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/lt/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/mr/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/ms/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/nb_NO/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/nl/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/pl/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/pt/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/pt_BR/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/ro/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/ru/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/sk/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/sv/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/templates/aria2.pot create mode 100644 package/luci/applications/luci-app-aria2/po/tr/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/uk/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/vi/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/zh_Hans/aria2.po create mode 100644 package/luci/applications/luci-app-aria2/po/zh_Hant/aria2.po create mode 100755 package/luci/applications/luci-app-aria2/root/usr/libexec/aria2-call create mode 100644 package/luci/applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json create mode 100644 package/luci/applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json create mode 100644 package/luci/applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js delete mode 100644 package/luci/applications/luci-app-commands/luasrc/controller/commands.lua delete mode 100644 package/luci/applications/luci-app-commands/luasrc/model/cbi/commands.lua delete mode 100644 package/luci/applications/luci-app-commands/luasrc/view/commands.htm delete mode 100644 package/luci/applications/luci-app-commands/luasrc/view/commands_public.htm create mode 100644 package/luci/applications/luci-app-commands/po/lt/commands.po create mode 100644 package/luci/applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json create mode 100644 package/luci/applications/luci-app-commands/ucode/controller/commands.uc create mode 100644 package/luci/applications/luci-app-commands/ucode/template/commands.ut create mode 100644 package/luci/applications/luci-app-commands/ucode/template/commands_public.ut create mode 100644 package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js create mode 100644 package/luci/applications/luci-app-firewall/po/lt/firewall.po create mode 100644 package/luci/applications/luci-app-firewall/po/ur/firewall.po create mode 100644 package/luci/applications/luci-app-openvpn/po/lt/openvpn.po create mode 100644 package/luci/applications/luci-app-openvpn/po/nl/openvpn.po create mode 100644 package/luci/applications/luci-app-opkg/po/fa/opkg.po create mode 100644 package/luci/applications/luci-app-opkg/po/lt/opkg.po create mode 100644 package/luci/applications/luci-app-opkg/po/ur/opkg.po create mode 100644 package/luci/applications/luci-app-p910nd/po/lt/p910nd.po create mode 100644 package/luci/applications/luci-app-p910nd/po/nl/p910nd.po create mode 100644 package/luci/applications/luci-app-tor/Makefile create mode 100644 package/luci/applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js create mode 100644 package/luci/applications/luci-app-tor/po/ru/tor.po create mode 100644 package/luci/applications/luci-app-tor/po/templates/tor.pot create mode 100644 package/luci/applications/luci-app-tor/root/usr/share/luci/menu.d/luci-app-tor.json create mode 100644 package/luci/applications/luci-app-tor/root/usr/share/rpcd/acl.d/luci-app-tor.json create mode 100644 package/luci/applications/luci-app-uhttpd/po/lt/uhttpd.po delete mode 100644 package/luci/applications/luci-app-wireguard/Makefile delete mode 100644 package/luci/applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js delete mode 100644 package/luci/applications/luci-app-wireguard/po/ar/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/bg/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/bn_BD/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/ca/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/cs/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/da/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/de/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/el/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/en/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/es/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/fi/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/fr/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/he/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/hi/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/hu/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/id/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/it/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/ja/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/ko/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/mr/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/ms/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/nb_NO/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/pl/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/pt/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/pt_BR/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/ro/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/ru/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/sk/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/sv/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/templates/wireguard.pot delete mode 100644 package/luci/applications/luci-app-wireguard/po/tr/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/uk/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/vi/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/zh_Hans/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/po/zh_Hant/wireguard.po delete mode 100644 package/luci/applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json delete mode 100644 package/luci/applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json create mode 100755 package/luci/build/zoneinfo2ucode.pl create mode 100644 package/luci/contrib/package/ucode-mod-html/Makefile create mode 100644 package/luci/contrib/package/ucode-mod-html/src/html.c create mode 100644 package/luci/contrib/package/ucode-mod-lua/Makefile create mode 100644 package/luci/contrib/package/ucode-mod-lua/src/lua.c delete mode 100644 package/luci/docs/jsapi/README.md delete mode 100644 package/luci/modules/luci-base/luasrc/controller/admin/index.lua delete mode 100644 package/luci/modules/luci-base/luasrc/controller/admin/uci.lua delete mode 100644 package/luci/modules/luci-base/luasrc/dispatcher.lua delete mode 100644 package/luci/modules/luci-base/luasrc/dispatcher.luadoc delete mode 100644 package/luci/modules/luci-base/luasrc/sgi/cgi.lua delete mode 100644 package/luci/modules/luci-base/luasrc/sgi/uhttpd.lua delete mode 100644 package/luci/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua delete mode 100644 package/luci/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua delete mode 100644 package/luci/modules/luci-base/luasrc/template.lua delete mode 100644 package/luci/modules/luci-base/luasrc/view/csrftoken.htm delete mode 100644 package/luci/modules/luci-base/luasrc/view/error404.htm delete mode 100644 package/luci/modules/luci-base/luasrc/view/error500.htm delete mode 100644 package/luci/modules/luci-base/luasrc/view/footer.htm delete mode 100644 package/luci/modules/luci-base/luasrc/view/header.htm delete mode 100644 package/luci/modules/luci-base/luasrc/view/sysauth.htm delete mode 100644 package/luci/modules/luci-base/luasrc/view/view.htm create mode 100644 package/luci/modules/luci-base/po/lt/base.po create mode 100644 package/luci/modules/luci-base/po/ur/base.po delete mode 100755 package/luci/modules/luci-base/root/usr/libexec/rpcd/luci create mode 100644 package/luci/modules/luci-base/root/usr/share/rpcd/ucode/luci create mode 100755 package/luci/modules/luci-base/src/contrib/lemon create mode 100644 package/luci/modules/luci-base/src/lib/lmo.c create mode 100644 package/luci/modules/luci-base/src/lib/lmo.h create mode 100644 package/luci/modules/luci-base/src/lib/luci.c create mode 100644 package/luci/modules/luci-base/src/lib/plural_formula.c create mode 100644 package/luci/modules/luci-base/src/lib/plural_formula.h rename package/luci/modules/luci-base/src/{ => lib}/plural_formula.y (100%) create mode 100644 package/luci/modules/luci-base/ucode/controller/admin/index.uc create mode 100644 package/luci/modules/luci-base/ucode/controller/admin/uci.uc create mode 100644 package/luci/modules/luci-base/ucode/dispatcher.uc create mode 100644 package/luci/modules/luci-base/ucode/http.uc create mode 100644 package/luci/modules/luci-base/ucode/runtime.uc create mode 100644 package/luci/modules/luci-base/ucode/sys.uc create mode 100644 package/luci/modules/luci-base/ucode/template/csrftoken.ut create mode 100644 package/luci/modules/luci-base/ucode/template/error404.ut create mode 100644 package/luci/modules/luci-base/ucode/template/error500.ut create mode 100644 package/luci/modules/luci-base/ucode/template/footer.ut create mode 100644 package/luci/modules/luci-base/ucode/template/header.ut create mode 100644 package/luci/modules/luci-base/ucode/template/sysauth.ut create mode 100644 package/luci/modules/luci-base/ucode/template/view.ut create mode 100644 package/luci/modules/luci-base/ucode/uhttpd.uc create mode 100644 package/luci/modules/luci-base/ucode/zoneinfo.uc create mode 100644 package/luci/modules/luci-lua-runtime/Makefile rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/cacheloader.lua (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/ccache.lua (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/config.lua (100%) create mode 100644 package/luci/modules/luci-lua-runtime/luasrc/dispatcher.lua rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/i18n.lua (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/i18n.luadoc (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/model/uci.lua (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/model/uci.luadoc (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/store.lua (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/sys.lua (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/sys.luadoc (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/sys/zoneinfo.lua (100%) create mode 100644 package/luci/modules/luci-lua-runtime/luasrc/sys/zoneinfo/tzdata.lua create mode 100644 package/luci/modules/luci-lua-runtime/luasrc/sys/zoneinfo/tzoffset.lua create mode 100644 package/luci/modules/luci-lua-runtime/luasrc/template.lua create mode 100644 package/luci/modules/luci-lua-runtime/luasrc/ucodebridge.lua rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/version.lua (100%) create mode 100644 package/luci/modules/luci-lua-runtime/luasrc/view/admin_status/luaindex.htm rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/view/empty_node_placeholder.htm (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/view/indexer.htm (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/xml.lua (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/luasrc/xml.luadoc (100%) create mode 100644 package/luci/modules/luci-lua-runtime/src/Makefile create mode 100644 package/luci/modules/luci-lua-runtime/src/contrib/lemon.c create mode 100644 package/luci/modules/luci-lua-runtime/src/contrib/lempar.c rename package/luci/modules/{luci-base => luci-lua-runtime}/src/mkversion.sh (100%) create mode 100644 package/luci/modules/luci-lua-runtime/src/plural_formula.y rename package/luci/modules/{luci-base => luci-lua-runtime}/src/template_lmo.c (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/src/template_lmo.h (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/src/template_lualib.c (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/src/template_lualib.h (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/src/template_parser.c (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/src/template_parser.h (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/src/template_utils.c (100%) rename package/luci/modules/{luci-base => luci-lua-runtime}/src/template_utils.h (100%) create mode 100644 package/luci/modules/luci-mod-dashboard/po/id/dashboard.po create mode 100644 package/luci/modules/luci-mod-dashboard/po/lt/dashboard.po create mode 100644 package/luci/modules/luci-mod-dsl/Makefile create mode 100644 package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js create mode 100644 package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js create mode 100644 package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js create mode 100644 package/luci/modules/luci-mod-dsl/po/da/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/de/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/es/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/it/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/lt/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/nb_NO/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/pl/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/pt/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/pt_BR/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/ro/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/ru/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/sv/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/templates/dsl.pot create mode 100644 package/luci/modules/luci-mod-dsl/po/tr/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/uk/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/po/zh_Hant/dsl.po create mode 100644 package/luci/modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json create mode 100644 package/luci/modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json create mode 100644 package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js delete mode 100644 package/luci/modules/luci-mod-status/luasrc/view/admin_status/index.htm create mode 100644 package/luci/modules/luci-mod-status/ucode/template/admin_status/index.ut delete mode 100644 package/luci/modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua delete mode 100644 package/luci/protocols/luci-proto-bonding/Makefile delete mode 100644 package/luci/protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js delete mode 100644 package/luci/protocols/luci-proto-gre/Makefile delete mode 100644 package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js delete mode 100644 package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js delete mode 100644 package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js delete mode 100644 package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js delete mode 100644 package/luci/protocols/luci-proto-modemmanager/Makefile delete mode 100644 package/luci/protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js delete mode 100644 package/luci/protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json delete mode 100644 package/luci/protocols/luci-proto-pppossh/Makefile delete mode 100644 package/luci/protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js delete mode 100644 package/luci/protocols/luci-proto-sstp/Makefile delete mode 100644 package/luci/protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js delete mode 100644 package/luci/protocols/luci-proto-vxlan/Makefile delete mode 100644 package/luci/protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js delete mode 100644 package/luci/protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js create mode 100644 package/luci/protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js delete mode 100755 package/luci/protocols/luci-proto-wireguard/root/usr/libexec/rpcd/luci.wireguard create mode 100644 package/luci/protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json create mode 100644 package/luci/protocols/luci-proto-wireguard/root/usr/share/rpcd/ucode/luci.wireguard delete mode 100644 package/luci/protocols/luci-proto-xfrm/Makefile delete mode 100644 package/luci/protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js delete mode 120000 package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark delete mode 120000 package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap-light delete mode 120000 package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap-dark delete mode 120000 package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap-light delete mode 100644 package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/footer.htm delete mode 100644 package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm delete mode 100644 package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm create mode 100644 package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut create mode 100644 package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut create mode 100644 package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut create mode 100644 package/luci/themes/luci-theme-librecmc-2020/Makefile rename package/luci/themes/{luci-theme-openwrt-2020 => luci-theme-librecmc-2020}/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 (100%) create mode 100644 package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/cascade.css rename package/luci/themes/{luci-theme-openwrt-2020 => luci-theme-librecmc-2020}/htdocs/luci-static/openwrt2020/logo.png (100%) rename package/luci/themes/{luci-theme-openwrt-2020 => luci-theme-librecmc-2020}/htdocs/luci-static/openwrt2020/logo.svg (100%) rename package/luci/themes/{luci-theme-openwrt-2020 => luci-theme-librecmc-2020}/htdocs/luci-static/openwrt2020/spinner.svg (100%) rename package/luci/themes/{luci-theme-openwrt-2020 => luci-theme-librecmc-2020}/htdocs/luci-static/resources/menu-openwrt2020.js (100%) create mode 100755 package/luci/themes/luci-theme-librecmc-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 create mode 100644 package/luci/themes/luci-theme-librecmc-2020/ucode/template/themes/openwrt2020/footer.ut create mode 100644 package/luci/themes/luci-theme-librecmc-2020/ucode/template/themes/openwrt2020/header.ut create mode 100644 package/luci/themes/luci-theme-librecmc/Makefile rename package/luci/themes/{luci-theme-openwrt => luci-theme-librecmc}/htdocs/luci-static/openwrt.org/cascade.css (100%) create mode 100644 package/luci/themes/luci-theme-librecmc/htdocs/luci-static/openwrt.org/tabbg.png rename package/luci/themes/{luci-theme-openwrt => luci-theme-librecmc}/htdocs/luci-static/resources/menu-openwrt.js (100%) create mode 100644 package/luci/themes/luci-theme-librecmc/luasrc/view/themes/openwrt.org/footer.htm rename package/luci/themes/{luci-theme-openwrt => luci-theme-librecmc}/luasrc/view/themes/openwrt.org/header.htm (100%) create mode 100755 package/luci/themes/luci-theme-librecmc/root/etc/uci-defaults/30_luci-theme-openwrt delete mode 100644 package/luci/themes/luci-theme-material/luasrc/view/themes/material/footer.htm delete mode 100644 package/luci/themes/luci-theme-material/luasrc/view/themes/material/header.htm create mode 100644 package/luci/themes/luci-theme-material/ucode/template/themes/material/footer.ut create mode 100644 package/luci/themes/luci-theme-material/ucode/template/themes/material/header.ut delete mode 100644 package/luci/themes/luci-theme-openwrt-2020/Makefile delete mode 100644 package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css delete mode 100644 package/luci/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm delete mode 100644 package/luci/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm delete mode 100755 package/luci/themes/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 delete mode 100644 package/luci/themes/luci-theme-openwrt/Makefile delete mode 100644 package/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/tabbg.png delete mode 100644 package/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm delete mode 100755 package/luci/themes/luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt create mode 100644 package/network/config/adblock-fast/Makefile create mode 100644 package/network/config/adblock-fast/files/README.md create mode 100644 package/network/config/adblock-fast/files/adblock-fast.config.update create mode 100644 package/network/config/adblock-fast/files/etc/config/adblock-fast create mode 100755 package/network/config/adblock-fast/files/etc/init.d/adblock-fast create mode 100644 package/network/config/adblock-fast/files/etc/uci-defaults/90-adblock-fast create mode 100644 package/network/config/adblock-fast/test.sh create mode 100644 package/network/config/adblock/Makefile create mode 100644 package/network/config/adblock/files/README.md create mode 100644 package/network/config/adblock/files/adblock.blacklist create mode 100644 package/network/config/adblock/files/adblock.categories create mode 100644 package/network/config/adblock/files/adblock.conf create mode 100755 package/network/config/adblock/files/adblock.init create mode 100755 package/network/config/adblock/files/adblock.mail create mode 100755 package/network/config/adblock/files/adblock.sh create mode 100644 package/network/config/adblock/files/adblock.sources create mode 100644 package/network/config/adblock/files/adblock.whitelist delete mode 100644 package/network/config/netifd/files/etc/hotplug.d/net/20-smp-packet-steering create mode 100755 package/network/config/netifd/files/etc/init.d/packet_steering delete mode 120000 package/network/config/netifd/files/sbin/ifdown create mode 100755 package/network/config/netifd/files/usr/libexec/network/packet-steering.sh create mode 100644 package/network/config/netifd/patches/0001-interface-ip-fix-IPv4-route-target-masking.patch create mode 100644 package/network/config/qosify/Makefile create mode 100644 package/network/config/qosify/files/qosify-defaults.conf create mode 100644 package/network/config/qosify/files/qosify-status create mode 100644 package/network/config/qosify/files/qosify.conf create mode 100644 package/network/config/qosify/files/qosify.hotplug create mode 100644 package/network/config/qosify/files/qosify.init delete mode 100644 package/network/ipv6/thc-ipv6/patches/000-cflags_override.patch create mode 100644 package/network/ipv6/thc-ipv6/patches/101-remove-march-native.patch rename package/network/{utils => services}/bonding/Makefile (100%) rename package/network/{utils => services}/bonding/files/lib/netifd/proto/bonding.sh (100%) create mode 100644 package/network/services/bridger/Makefile create mode 100644 package/network/services/bridger/files/bridger.conf create mode 100644 package/network/services/bridger/files/bridger.init create mode 100755 package/network/services/dnsmasq/files/50-dnsmasq-migrate-ipset.sh delete mode 100644 package/network/services/dnsmasq/patches/001-CVE-2022-0934-Fix-write-after-free-error-in-DHCPv6-code.patch create mode 100644 package/network/services/hostapd/README.md create mode 100644 package/network/services/hostapd/files/common.uc create mode 100644 package/network/services/hostapd/files/hostapd.uc create mode 100644 package/network/services/hostapd/files/radius.clients create mode 100644 package/network/services/hostapd/files/radius.config create mode 100644 package/network/services/hostapd/files/radius.init create mode 100644 package/network/services/hostapd/files/radius.users create mode 100644 package/network/services/hostapd/files/wdev.uc create mode 100644 package/network/services/hostapd/files/wpa_supplicant.uc delete mode 100644 package/network/services/hostapd/patches/100-daemonize_fix.patch create mode 100644 package/network/services/hostapd/patches/110-mbedtls-TLS-crypto-option-initial-port.patch create mode 100644 package/network/services/hostapd/patches/120-mbedtls-fips186_2_prf.patch create mode 100644 package/network/services/hostapd/patches/130-mbedtls-annotate-with-TEST_FAIL-for-hwsim-tests.patch create mode 100644 package/network/services/hostapd/patches/135-mbedtls-fix-owe-association.patch create mode 100644 package/network/services/hostapd/patches/140-tests-Makefile-make-run-tests-with-CONFIG_TLS.patch create mode 100644 package/network/services/hostapd/patches/150-add-NULL-checks-encountered-during-tests-hwsim.patch create mode 100644 package/network/services/hostapd/patches/160-dpp_pkex-EC-point-mul-w-value-prime.patch create mode 100644 package/network/services/hostapd/patches/170-hostapd-update-cfs0-and-cfs1-for-160MHz.patch create mode 100644 package/network/services/hostapd/patches/180-driver_nl80211-fix-setting-QoS-map-on-secondary-BSSs.patch create mode 100644 package/network/services/hostapd/patches/181-driver_nl80211-update-drv-ifindex-on-removing-the-fi.patch create mode 100644 package/network/services/hostapd/patches/182-nl80211-move-nl80211_put_freq_params-call-outside-of.patch create mode 100644 package/network/services/hostapd/patches/183-hostapd-cancel-channel_list_update_timeout-in-hostap.patch delete mode 100644 package/network/services/hostapd/patches/340-reload_freq_change.patch delete mode 100644 package/network/services/hostapd/patches/360-ctrl_iface_reload.patch delete mode 100644 package/network/services/hostapd/patches/370-ap_sta_support.patch delete mode 100644 package/network/services/hostapd/patches/432-missing-typedef.patch delete mode 100644 package/network/services/hostapd/patches/450-scan_wait.patch delete mode 100644 package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch create mode 100644 package/network/services/hostapd/patches/465-hostapd-config-support-random-BSS-color.patch create mode 100644 package/network/services/hostapd/patches/601-ucode_support.patch delete mode 100644 package/network/services/hostapd/patches/700-wifi-reload.patch create mode 100644 package/network/services/hostapd/patches/701-reload_config_inline.patch create mode 100644 package/network/services/hostapd/patches/760-dynamic_own_ip.patch create mode 100644 package/network/services/hostapd/patches/761-shared_das_port.patch create mode 100644 package/network/services/hostapd/patches/770-radius_server.patch create mode 100644 package/network/services/hostapd/patches/990-ctrl-make-WNM_AP-functions-dependant-on-CONFIG_AP.patch create mode 100644 package/network/services/hostapd/patches/991-Fix-OpenWrt-13156.patch create mode 100644 package/network/services/hostapd/patches/992-nl80211-add-extra-ies-only-if-allowed-by-driver.patch create mode 100644 package/network/services/hostapd/src/hostapd/radius.c create mode 100644 package/network/services/hostapd/src/src/ap/ucode.c create mode 100644 package/network/services/hostapd/src/src/ap/ucode.h create mode 100644 package/network/services/hostapd/src/src/utils/ucode.c create mode 100644 package/network/services/hostapd/src/src/utils/ucode.h create mode 100644 package/network/services/hostapd/src/wpa_supplicant/ucode.c create mode 100644 package/network/services/hostapd/src/wpa_supplicant/ucode.h rename package/network/{utils => services}/modemmanager/Config.in (100%) create mode 100644 package/network/services/modemmanager/Makefile create mode 100644 package/network/services/modemmanager/README.md create mode 100755 package/network/services/modemmanager/files/10-report-down create mode 100644 package/network/services/modemmanager/files/25-modemmanager-net create mode 100644 package/network/services/modemmanager/files/25-modemmanager-tty rename package/network/{utils => services}/modemmanager/files/25-modemmanager-usb (100%) create mode 100644 package/network/services/modemmanager/files/25-modemmanager-wwan create mode 100644 package/network/services/modemmanager/files/modemmanager.common rename package/network/{utils => services}/modemmanager/files/modemmanager.init (100%) create mode 100755 package/network/services/modemmanager/files/modemmanager.proto rename package/network/{utils => services}/modemmanager/files/usr/sbin/ModemManager-wrapper (100%) rename package/network/{utils => services}/net-snmp/Config.in.wut (100%) create mode 100644 package/network/services/net-snmp/Makefile rename package/network/{utils => services}/net-snmp/files/snmpd.conf (100%) create mode 100644 package/network/services/net-snmp/files/snmpd.init rename package/network/{utils => services}/net-snmp/files/snmptrapd.init (100%) rename package/network/{utils => services}/net-snmp/patches/000-cross-compile.patch (100%) rename package/network/{utils => services}/net-snmp/patches/010-HOST-MIB-hr_filesys-fix-compile-error.patch (100%) rename package/network/{utils => services}/net-snmp/patches/100-debian-statistics.patch (100%) rename package/network/{utils => services}/net-snmp/patches/110-debian-makefiles.patch (100%) rename package/network/{utils => services}/net-snmp/patches/120-debian-searchdirs.patch (100%) rename package/network/{utils => services}/net-snmp/patches/130-debian-extramibs.patch (100%) rename package/network/{utils => services}/net-snmp/patches/160-no_ldconfig.patch (100%) rename package/network/{utils => services}/net-snmp/patches/170-ldflags.patch (100%) create mode 100644 package/network/services/net-snmp/patches/200-add-pcre2-support.patch create mode 100644 package/network/services/net-snmp/patches/201-Run-autoreconf.patch create mode 100644 package/network/services/net-snmp/patches/202-Improve-pcre2-support.patch create mode 100644 package/network/services/net-snmp/patches/203-if-mib-data_access-interface.c-plug-a-leak-with-pcre.patch rename package/network/{utils => services}/net-snmp/patches/750-ieee802dot11.patch (100%) rename package/network/{utils => services}/net-snmp/patches/900-musl-compat.patch (100%) create mode 100644 package/network/services/openvpn/Config-mbedtls.in create mode 100644 package/network/services/openvpn/Config-openssl.in create mode 100644 package/network/services/openvpn/Config-wolfssl.in create mode 100644 package/network/services/openvpn/Makefile create mode 100644 package/network/services/openvpn/files/etc/hotplug.d/openvpn/01-user create mode 100644 package/network/services/openvpn/files/etc/openvpn.user create mode 100644 package/network/services/openvpn/files/lib/functions/openvpn.sh create mode 100644 package/network/services/openvpn/files/openvpn.config create mode 100644 package/network/services/openvpn/files/openvpn.init create mode 100644 package/network/services/openvpn/files/openvpn.options create mode 100644 package/network/services/openvpn/files/openvpn.upgrade create mode 100644 package/network/services/openvpn/files/usr/libexec/openvpn-hotplug create mode 100644 package/network/services/openvpn/patches/001-reproducible-remove_DATE.patch create mode 100644 package/network/services/openvpn/patches/002-add-wolfssl-support.patch create mode 100644 package/network/services/openvpn/patches/100-mbedtls-disable-runtime-version-check.patch create mode 100644 package/network/services/openvpn/patches/210-build_always_use_internal_lz4.patch create mode 100644 package/network/services/openvpn/patches/220-disable_des.patch create mode 100755 package/network/services/openvpn/test.sh rename package/network/{utils => services}/pppossh/Makefile (100%) rename package/network/{utils => services}/pppossh/README.md (100%) rename package/network/{utils => services}/pppossh/files/pppossh.sh (100%) create mode 100644 package/network/services/tor-hs/Makefile create mode 100644 package/network/services/tor-hs/README.md create mode 100755 package/network/services/tor-hs/files/nextcloud-update.sh create mode 100644 package/network/services/tor-hs/files/tor-hs.conf create mode 100755 package/network/services/tor-hs/files/tor-hs.init create mode 100755 package/network/services/tor-hs/files/tor_rpcd.sh create mode 100644 package/network/services/tor/Makefile create mode 100644 package/network/services/tor/files/tor.conf create mode 100644 package/network/services/tor/files/tor.init create mode 100644 package/network/services/tor/patches/001-torrc.patch create mode 100644 package/network/services/torsocks/Makefile create mode 100644 package/network/services/unetd/Makefile create mode 100644 package/network/services/unetd/files/unet-dht.init create mode 100644 package/network/services/unetd/files/unetd.init create mode 100644 package/network/services/unetd/files/unetd.sh create mode 100644 package/network/utils/aria2/Config.in create mode 100644 package/network/utils/aria2/Makefile create mode 100644 package/network/utils/aria2/files/aria2.conf create mode 100755 package/network/utils/aria2/files/aria2.init create mode 100644 package/network/utils/bpftool/Makefile create mode 100644 package/network/utils/bpftool/patches/001-cflags.patch create mode 100644 package/network/utils/bpftool/patches/002-includes.patch delete mode 100644 package/network/utils/bpftools/Makefile delete mode 100644 package/network/utils/bpftools/patches/001-cflags.patch delete mode 100644 package/network/utils/bpftools/patches/002-includes.patch create mode 100644 package/network/utils/curl/Config.in create mode 100644 package/network/utils/curl/Makefile create mode 100644 package/network/utils/curl/patches/200-no_docs_tests.patch create mode 100644 package/network/utils/iproute2/patches/155-keep_tirpc_optional.patch delete mode 100644 package/network/utils/ipset/patches/0001-lib-ipset-fix-printf-warning.patch delete mode 100644 package/network/utils/ipset/patches/0002-Fix-IPv6-sets-nftables-translation.patch delete mode 100644 package/network/utils/iptables/patches/001-xtables-Call-init_extensions6-for-static-builds.patch delete mode 100644 package/network/utils/iptables/patches/002-xtables-Call-init_extensions_a_b.patch create mode 100644 package/network/utils/iptables/patches/020-treewide-use-uint-instead-of-u_int.patch create mode 100644 package/network/utils/iptables/patches/030-revert-fix-build-for-missing-ETH_ALEN-definition.patch create mode 100644 package/network/utils/iptables/patches/040-xshared-Fix-build-for-Werror-format-security.patch create mode 100644 package/network/utils/iptables/patches/050-build-fix-error-during-out-of-tree-build.patch create mode 100644 package/network/utils/iptables/patches/060-libxtables-unexport-init_extensions-declarations.patch create mode 100644 package/network/utils/iptables/patches/070-extensions-string-Review-parse_string-function.patch delete mode 100644 package/network/utils/modemmanager/Makefile delete mode 100644 package/network/utils/modemmanager/README.md delete mode 100644 package/network/utils/modemmanager/files/25-modemmanager-net delete mode 100644 package/network/utils/modemmanager/files/25-modemmanager-tty delete mode 100644 package/network/utils/modemmanager/files/25-modemmanager-wwan delete mode 100644 package/network/utils/modemmanager/files/modemmanager.common delete mode 100755 package/network/utils/modemmanager/files/modemmanager.proto delete mode 100644 package/network/utils/modemmanager/patches/001-plugins-Fix-port-enums-includes.patch delete mode 100644 package/network/utils/modemmanager/patches/002-build-meson-Fix-daemon-enums-dependencies.patch delete mode 100644 package/network/utils/net-snmp/Makefile delete mode 100644 package/network/utils/net-snmp/files/snmpd.init delete mode 100644 package/network/utils/nftables/patches/0001-meta-don-t-use-non-POSIX-formats-in-strptime.patch delete mode 100644 package/network/utils/nftables/patches/001-examples-compile-with-make-check.patch delete mode 100644 package/network/utils/tcpdump/patches/101-CVE-2020-8037.patch delete mode 100644 package/network/utils/tcpdump/patches/102-CVE-2018-16301.patch delete mode 100644 package/network/utils/wpan-tools/patches/001-src-nl_extras.h-fix-compatibility-with-libnl-3.3.0.patch create mode 100644 package/network/utils/wwan/files/data/0e8d-00a5 create mode 100644 package/network/utils/xdp-tools/Makefile create mode 100644 package/network/utils/xdp-tools/patches/010-configure-respect-LDFLAGS.patch create mode 100644 package/system/gpio-cdev/nu801/Makefile create mode 100755 package/system/gpio-cdev/nu801/files/nu801.init create mode 100644 package/system/iucode-tool/patches/001-iucode_tool-add-missing-limits.h-for-USE_CPUID_DEVIC.patch mode change 100755 => 100644 package/system/librecmc-keyring/Makefile create mode 100644 package/system/refpolicy/Makefile create mode 100644 package/system/refpolicy/files/selinux-config create mode 100644 package/system/refpolicy/patches/100-no-docs.patch create mode 100644 package/system/selinux-policy/Makefile create mode 100644 package/system/selinux-policy/files/selinux-config create mode 100644 package/system/ubox/files/modules.conf create mode 100644 package/utils/acl/Makefile create mode 100644 package/utils/acl/patches/100-no-gettext_configure.patch create mode 100644 package/utils/acl/patches/101-no-gettext_autogen.patch create mode 100644 package/utils/acl/patches/102-no-gettext_Makefile.patch create mode 100644 package/utils/acl/patches/103-chacl-Use-portable-version-of-dirent-and-readdir.patch delete mode 100644 package/utils/bcm4908img/Makefile delete mode 100644 package/utils/bcm4908img/src/Makefile delete mode 100644 package/utils/bcm4908img/src/bcm4908img.c create mode 100644 package/utils/bsdiff/patches/020-CVE-2014-9862.patch create mode 100644 package/utils/bsdiff/patches/033-CVE-2020-14315.patch delete mode 100644 package/utils/busybox/patches/001-CVE-2022-30065-awk-fix-use-after-free.patch create mode 100644 package/utils/checkpolicy/Makefile create mode 100644 package/utils/coreutils/Makefile create mode 100644 package/utils/coreutils/patches/001-no_docs_man_tests.patch create mode 100644 package/utils/ct-bugcheck/Makefile create mode 100644 package/utils/ct-bugcheck/src/bugcheck.initd create mode 100755 package/utils/ct-bugcheck/src/bugcheck.sh create mode 100755 package/utils/ct-bugcheck/src/bugchecker.sh delete mode 100644 package/utils/dtc/patches/0001-Support-r-format-for-printing-raw-bytes-with-fdtget.patch delete mode 100644 package/utils/e2fsprogs/patches/004-CVE-2022-1304-libext2fs-add-sanity-check-to-extent-manipulation.patch delete mode 100644 package/utils/f2fs-tools/patches/200-resize_f2fs-fix_wrong_ovp_calculation.patch create mode 100644 package/utils/fbtest/Makefile create mode 100644 package/utils/fbtest/src/Makefile create mode 100644 package/utils/fbtest/src/fbtest.c create mode 100644 package/utils/fritz-tools/Makefile create mode 100644 package/utils/fritz-tools/README.md create mode 100644 package/utils/fritz-tools/src/CMakeLists.txt create mode 100644 package/utils/fritz-tools/src/fritz_cal_extract.c create mode 100644 package/utils/fritz-tools/src/fritz_tffs_nand_read.c create mode 100644 package/utils/fritz-tools/src/fritz_tffs_read.c create mode 100644 package/utils/gawk/Makefile create mode 100644 package/utils/grep/Makefile create mode 100644 package/utils/grep/patches/ppc-musl.patch create mode 100644 package/utils/jboot-tools/Makefile create mode 100644 package/utils/jboot-tools/README.md create mode 100644 package/utils/jboot-tools/src/CMakeLists.txt create mode 100644 package/utils/jboot-tools/src/jboot_config_read.c delete mode 100644 package/utils/mdadm/patches/101-mdadm.h-Undefine-dprintf-before-redefining.patch delete mode 100644 package/utils/mdadm/patches/102-Add-missing-include-file-sys-sysmacros.h.patch delete mode 100644 package/utils/otrx/Makefile delete mode 100644 package/utils/pciutils/patches/107-avoid-addng-multiple-version-tags.patch create mode 100644 package/utils/policycoreutils/Makefile create mode 100644 package/utils/sed/Makefile create mode 100644 package/utils/ucode-mod-bpf/Makefile create mode 100644 package/utils/ucode-mod-bpf/src/bpf.c create mode 100644 package/utils/uencrypt/src/uencrypt-mbedtls.c create mode 100644 package/utils/uencrypt/src/uencrypt-openssl.c create mode 100644 package/utils/uencrypt/src/uencrypt.h create mode 100644 package/utils/util-linux/patches/0001-test_enosys-add-support-for-mips.patch delete mode 100644 package/utils/util-linux/patches/100-use_urandom.patch create mode 100644 package/utils/util-linux/patches/200-meson-no-po.patch create mode 100644 package/utils/yafut/Makefile create mode 100644 package/utils/zstd/Makefile create mode 100755 scripts/mkits-zyxel-fit-filogic.sh create mode 100755 scripts/sercomm-kernel-header.py create mode 100755 scripts/sercomm-pid.py delete mode 100644 target/linux/ath79/config-5.10 create mode 100644 target/linux/ath79/config-5.15 create mode 100644 target/linux/ath79/dts/ar7161_aruba_ap-175.dts delete mode 100644 target/linux/ath79/dts/ar7161_dlink_dir-825-b1.dts create mode 100644 target/linux/ath79/dts/ar7161_ruckus_gd11.dtsi create mode 100644 target/linux/ath79/dts/ar7161_ruckus_zf7341.dts create mode 100644 target/linux/ath79/dts/ar7161_ruckus_zf734x.dtsi create mode 100644 target/linux/ath79/dts/ar7161_ruckus_zf7351.dts create mode 100644 target/linux/ath79/dts/ar7161_ruckus_zf7363.dts create mode 100644 target/linux/ath79/dts/ar7240_ruckus_zf7025.dts create mode 100644 target/linux/ath79/dts/ar7241_ubnt_unifi-ap-lr.dts create mode 100644 target/linux/ath79/dts/ar7241_ubnt_unifi-ap.dts create mode 100644 target/linux/ath79/dts/ar7241_ubnt_unifi-ap.dtsi delete mode 100644 target/linux/ath79/dts/ar7241_ubnt_unifi.dts create mode 100644 target/linux/ath79/dts/ar9331_hiwifi_hc6361.dts create mode 100644 target/linux/ath79/dts/ar9341_tplink_tl-wr941nd-v5.dts create mode 100644 target/linux/ath79/dts/ar9342_zyxel_nwa1100-nh.dts create mode 100644 target/linux/ath79/dts/ar9342_zyxel_nwa1121-ni.dts create mode 100644 target/linux/ath79/dts/ar9342_zyxel_nwa1123-ni.dts create mode 100644 target/linux/ath79/dts/ar9342_zyxel_nwa11xx.dtsi delete mode 100644 target/linux/ath79/dts/ar9344_engenius_exx600.dtsi create mode 100644 target/linux/ath79/dts/ar9344_fortinet_ap-dual.dtsi create mode 100644 target/linux/ath79/dts/ar9344_fortinet_fap-221-b.dts create mode 100644 target/linux/ath79/dts/ar9344_mikrotik_routerboard-951x-2hnd.dtsi delete mode 100644 target/linux/ath79/dts/ar9344_mikrotik_routerboard-sxt-5n.dtsi create mode 100644 target/linux/ath79/dts/ar9344_mikrotik_routerboard.dtsi create mode 100644 target/linux/ath79/dts/ar9344_netgear_pgzng1.dts create mode 100644 target/linux/ath79/dts/ar9344_senao_ap-dual.dtsi create mode 100644 target/linux/ath79/dts/ar9344_tplink_cpe605-v1.dts create mode 100644 target/linux/ath79/dts/ar9344_watchguard_ap100.dts create mode 100644 target/linux/ath79/dts/ar9344_watchguard_ap200.dts create mode 100644 target/linux/ath79/dts/ar934x_fortinet_loader.dtsi create mode 100644 target/linux/ath79/dts/qca9531_alcatel_hh40v.dts create mode 100644 target/linux/ath79/dts/qca9531_dlink_dch-g020-a1.dts delete mode 100644 target/linux/ath79/dts/qca9531_glinet_gl-xe300.dts create mode 100644 target/linux/ath79/dts/qca9531_teltonika_rut300.dts create mode 100644 target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200-nand.dts create mode 100644 target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200-nor.dts create mode 100644 target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200.dts create mode 100644 target/linux/ath79/dts/qca9533_dlink_dap-1330-a1.dts create mode 100644 target/linux/ath79/dts/qca9533_dlink_dap-1365-a1.dts create mode 100644 target/linux/ath79/dts/qca9533_kuwfi_c910.dts create mode 100644 target/linux/ath79/dts/qca9557_meraki_mr18.dts create mode 100644 target/linux/ath79/dts/qca9558_aruba_ap-115.dts create mode 100644 target/linux/ath79/dts/qca9558_dlink_dir-629-a1.dts create mode 100644 target/linux/ath79/dts/qca9558_engenius_esr900.dts delete mode 100644 target/linux/ath79/dts/qca9558_netgear_ex7300.dtsi create mode 100644 target/linux/ath79/dts/qca955x_senao_router-dual.dtsi create mode 100644 target/linux/ath79/dts/qca9563_dlink_dir-8x9-a1.dtsi create mode 100644 target/linux/ath79/dts/qca9563_zte_mf28x.dtsi create mode 100644 target/linux/ath79/generic/base-files/lib/preinit/02_sysinfo_fixup create mode 100644 target/linux/ath79/image/tiny-netgear.mk create mode 100644 target/linux/ath79/image/tiny-tp-link.mk create mode 100644 target/linux/ath79/image/tiny-ubnt.mk create mode 100644 target/linux/ath79/image/tiny.mk create mode 100644 target/linux/ath79/nand/base-files/etc/board.d/05_compat-version create mode 100644 target/linux/ath79/nand/base-files/etc/init.d/boot-leds delete mode 100644 target/linux/ath79/patches-5.10/0003-leds-add-reset-controller-based-driver.patch delete mode 100644 target/linux/ath79/patches-5.10/0004-phy-add-ath79-usb-phys.patch delete mode 100644 target/linux/ath79/patches-5.10/0018-MIPS-pci-ar71xx-convert-to-OF.patch delete mode 100644 target/linux/ath79/patches-5.10/0020-MIPS-pci-ar724x-convert-to-OF.patch delete mode 100644 target/linux/ath79/patches-5.10/0032-MIPS-ath79-sanitize-symbols.patch delete mode 100644 target/linux/ath79/patches-5.10/0033-spi-ath79-drop-pdata-support.patch delete mode 100644 target/linux/ath79/patches-5.10/0034-MIPS-ath79-ath9k-exports.patch delete mode 100644 target/linux/ath79/patches-5.10/0036-MIPS-ath79-remove-irq-code-from-pci.patch delete mode 100644 target/linux/ath79/patches-5.10/0037-missing-registers.patch delete mode 100644 target/linux/ath79/patches-5.10/0039-MIPS-ath79-export-UART1-reference-clock.patch delete mode 100644 target/linux/ath79/patches-5.10/004-register_gpio_driver_earlier.patch delete mode 100644 target/linux/ath79/patches-5.10/0040-ath79-sgmii-config.patch delete mode 100644 target/linux/ath79/patches-5.10/0052-mtd-spi-nor-use-4-bit-locking-for-MX25L12805D.patch delete mode 100644 target/linux/ath79/patches-5.10/0062-MIPS-pci-ar724x-add-QCA9550-reset-sequence.patch delete mode 100644 target/linux/ath79/patches-5.10/401-mtd-nor-support-mtd-name-from-device-tree.patch delete mode 100644 target/linux/ath79/patches-5.10/404-mtd-cybertan-trx-parser.patch delete mode 100644 target/linux/ath79/patches-5.10/408-mtd-redboot_partition_scan.patch delete mode 100644 target/linux/ath79/patches-5.10/410-spi-ath79-Implement-the-spi_mem-interface.patch delete mode 100644 target/linux/ath79/patches-5.10/412-spi-ath79-set-number-of-chipselect-lines.patch delete mode 100644 target/linux/ath79/patches-5.10/420-net-use-downstream-ag71xx.patch delete mode 100644 target/linux/ath79/patches-5.10/425-at803x-allow-sgmii-aneg-override.patch delete mode 100644 target/linux/ath79/patches-5.10/430-drivers-link-spi-before-mtd.patch delete mode 100644 target/linux/ath79/patches-5.10/440-mtd-ar934x-nand-driver.patch delete mode 100644 target/linux/ath79/patches-5.10/470-MIPS-ath79-swizzle-pci-address-for-ar71xx.patch delete mode 100644 target/linux/ath79/patches-5.10/900-mdio_bitbang_ignore_ta_value.patch delete mode 100644 target/linux/ath79/patches-5.10/901-phy-mdio-bitbang-prevent-rescheduling-during-command.patch delete mode 100644 target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch delete mode 100644 target/linux/ath79/patches-5.10/920-mikrotik-rb4xx.patch delete mode 100644 target/linux/ath79/patches-5.10/939-mikrotik-rb91x.patch create mode 100644 target/linux/ath79/patches-5.15/0003-leds-add-reset-controller-based-driver.patch create mode 100644 target/linux/ath79/patches-5.15/0004-phy-add-ath79-usb-phys.patch rename target/linux/ath79/{patches-5.10 => patches-5.15}/0005-usb-add-more-OF-quirk-properties.patch (100%) rename target/linux/ath79/{patches-5.10 => patches-5.15}/0007-irqchip-irq-ath79-intc-add-irq-cascade-driver-for-QC.patch (100%) rename target/linux/ath79/{patches-5.10 => patches-5.15}/0008-irqchip-irq-ath79-cpu-drop-OF-init-helper.patch (100%) rename target/linux/ath79/{patches-5.10 => patches-5.15}/0017-dt-bindings-PCI-qcom-ar7100-adds-binding-doc.patch (100%) create mode 100644 target/linux/ath79/patches-5.15/0018-MIPS-pci-ar71xx-convert-to-OF.patch rename target/linux/ath79/{patches-5.10 => patches-5.15}/0019-dt-bindings-PCI-qcom-ar7240-adds-binding-doc.patch (100%) create mode 100644 target/linux/ath79/patches-5.15/0020-MIPS-pci-ar724x-convert-to-OF.patch create mode 100644 target/linux/ath79/patches-5.15/0032-MIPS-ath79-sanitize-symbols.patch create mode 100644 target/linux/ath79/patches-5.15/0034-MIPS-ath79-ath9k-exports.patch create mode 100644 target/linux/ath79/patches-5.15/0036-MIPS-ath79-remove-irq-code-from-pci.patch create mode 100644 target/linux/ath79/patches-5.15/0037-missing-registers.patch rename target/linux/ath79/{patches-5.10 => patches-5.15}/0038-MIPS-ath79-add-missing-QCA955x-GMAC-registers.patch (100%) create mode 100644 target/linux/ath79/patches-5.15/0039-MIPS-ath79-export-UART1-reference-clock.patch create mode 100644 target/linux/ath79/patches-5.15/004-register_gpio_driver_earlier.patch create mode 100644 target/linux/ath79/patches-5.15/0040-ath79-sgmii-config.patch create mode 100644 target/linux/ath79/patches-5.15/0062-MIPS-pci-ar724x-add-QCA9550-reset-sequence.patch create mode 100644 target/linux/ath79/patches-5.15/401-mtd-nor-support-mtd-name-from-device-tree.patch rename target/linux/ath79/{patches-5.10 => patches-5.15}/402-v5.17-spi-ar934x-fix-transfer-and-word-delays.patch (100%) rename target/linux/ath79/{patches-5.10 => patches-5.15}/403-v5.17-spi-ar934x-fix-transfer-size.patch (100%) create mode 100644 target/linux/ath79/patches-5.15/404-mtd-cybertan-trx-parser.patch create mode 100644 target/linux/ath79/patches-5.15/410-spi-ath79-Implement-the-spi_mem-interface.patch create mode 100644 target/linux/ath79/patches-5.15/420-net-use-downstream-ag71xx.patch create mode 100644 target/linux/ath79/patches-5.15/430-drivers-link-spi-before-mtd.patch create mode 100644 target/linux/ath79/patches-5.15/440-mtd-ar934x-nand-driver.patch create mode 100644 target/linux/ath79/patches-5.15/470-MIPS-ath79-swizzle-pci-address-for-ar71xx.patch create mode 100644 target/linux/ath79/patches-5.15/900-mdio_bitbang_ignore_ta_value.patch create mode 100644 target/linux/ath79/patches-5.15/901-phy-mdio-bitbang-prevent-rescheduling-during-command.patch create mode 100644 target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch create mode 100644 target/linux/ath79/patches-5.15/920-mikrotik-rb4xx.patch rename target/linux/ath79/{patches-5.10 => patches-5.15}/930-ar8216-make-reg-access-atomic.patch (100%) create mode 100644 target/linux/ath79/patches-5.15/939-mikrotik-rb91x.patch rename target/linux/ath79/{patches-5.10 => patches-5.15}/940-ath79-add-support-for-booting-QCN550x.patch (100%) create mode 100644 target/linux/ath79/tiny/base-files/etc/board.d/01_leds create mode 100644 target/linux/ath79/tiny/base-files/etc/board.d/02_network create mode 100644 target/linux/ath79/tiny/base-files/etc/board.d/05_compat-version create mode 100644 target/linux/ath79/tiny/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom create mode 100644 target/linux/ath79/tiny/base-files/etc/uci-defaults/04_led_migration create mode 100644 target/linux/ath79/tiny/base-files/lib/upgrade/failsafe_datachk.sh create mode 100644 target/linux/ath79/tiny/base-files/lib/upgrade/platform.sh create mode 100644 target/linux/ath79/tiny/config-default create mode 100644 target/linux/ath79/tiny/target.mk delete mode 100644 target/linux/generic/backport-5.10/010-Kbuild-don-t-hardcode-path-to-awk-in-scripts-ld-vers.patch delete mode 100644 target/linux/generic/backport-5.10/011-kbuild-export-SUBARCH.patch delete mode 100644 target/linux/generic/backport-5.10/026-power-reset-linkstation-poweroff-add-missing-put_dev.patch delete mode 100644 target/linux/generic/backport-5.10/050-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch delete mode 100644 target/linux/generic/backport-5.10/071-crypto-arm-chacha-neon-optimize-for-non-block-size-m.patch delete mode 100644 target/linux/generic/backport-5.10/072-crypto-arm-chacha-neon-add-missing-counter-increment.patch delete mode 100644 target/linux/generic/backport-5.10/080-wireguard-peer-put-frequently-used-members-above-cac.patch delete mode 100644 target/linux/generic/backport-5.10/081-net-next-regmap-allow-to-define-reg_update_bits-for-no-bus.patch delete mode 100644 target/linux/generic/backport-5.10/103-v5.13-MIPS-select-CPU_MIPS64-for-remaining-MIPS64-CPUs.patch delete mode 100644 target/linux/generic/backport-5.10/311-v5.11-MIPS-zboot-put-appended-dtb-into-a-section.patch delete mode 100644 target/linux/generic/backport-5.10/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch delete mode 100644 target/linux/generic/backport-5.10/401-v5.11-dt-bindings-mtd-convert-fixed-partitions-to-the-json.patch delete mode 100644 target/linux/generic/backport-5.10/402-v5.12-0001-dt-bindings-mtd-move-partition-binding-to-its-own-fi.patch delete mode 100644 target/linux/generic/backport-5.10/402-v5.12-0002-dt-bindings-mtd-add-binding-for-BCM4908-partitions.patch delete mode 100644 target/linux/generic/backport-5.10/403-v5.13-mtd-parsers-ofpart-support-BCM4908-fixed-partitions.patch delete mode 100644 target/linux/generic/backport-5.10/404-v5.13-mtd-parsers-ofpart-limit-parsing-of-deprecated-DT-sy.patch delete mode 100644 target/linux/generic/backport-5.10/405-v5.13-mtd-parsers-ofpart-make-symbol-bcm4908_partitions_qu.patch delete mode 100644 target/linux/generic/backport-5.10/406-v5.13-0001-mtd-core-add-nvmem-cells-compatible-to-parse-mtd-as-.patch delete mode 100644 target/linux/generic/backport-5.10/406-v5.13-0002-dt-bindings-nvmem-drop-nodename-restriction.patch delete mode 100644 target/linux/generic/backport-5.10/406-v5.13-0003-dt-bindings-mtd-Document-use-of-nvmem-cells-compatib.patch delete mode 100644 target/linux/generic/backport-5.10/407-v5.13-0001-dt-bindings-mtd-add-binding-for-Linksys-Northstar-pa.patch delete mode 100644 target/linux/generic/backport-5.10/407-v5.13-0002-mtd-parsers-ofpart-support-Linksys-Northstar-partiti.patch delete mode 100644 target/linux/generic/backport-5.10/408-v5.13-mtd-cfi_cmdset_0002-Disable-buffered-writes-for-AMD.patch delete mode 100644 target/linux/generic/backport-5.10/409-v5.14-0001-dt-bindings-mtd-brcm-trx-Add-brcm-trx-magic.patch delete mode 100644 target/linux/generic/backport-5.10/409-v5.14-0002-mtd-parsers-trx-Allow-to-specify-brcm-trx-magic-in-D.patch delete mode 100644 target/linux/generic/backport-5.10/409-v5.14-0003-mtd-parsers-trx-Allow-to-use-TRX-parser-on-Mediatek-.patch delete mode 100644 target/linux/generic/backport-5.10/412-v5.19-mtd-call-of_platform_populate-for-MTD-partitions.patch delete mode 100644 target/linux/generic/backport-5.10/413-v6.0-mtd-next-mtd-core-introduce-of-support-for-dynamic-partitions.patch delete mode 100644 target/linux/generic/backport-5.10/414-v6.1-mtd-allow-getting-MTD-device-associated-with-a-speci.patch delete mode 100644 target/linux/generic/backport-5.10/415-v6.0-mtd-core-check-partition-before-dereference.patch delete mode 100644 target/linux/generic/backport-5.10/416-v6.1-mtd-core-add-missing-of_node_get-in-dynamic-partitio.patch delete mode 100644 target/linux/generic/backport-5.10/417-v6.2-0001-mtd-core-simplify-a-bit-code-find-partition-matching.patch delete mode 100644 target/linux/generic/backport-5.10/417-v6.2-0002-mtd-core-try-to-find-OF-node-for-every-MTD-partition.patch delete mode 100644 target/linux/generic/backport-5.10/418-v6.2-mtd-core-set-ROOT_DEV-for-partitions-marked-as-rootf.patch delete mode 100644 target/linux/generic/backport-5.10/421-v6.2-mtd-parsers-add-TP-Link-SafeLoader-partitions-table-.patch delete mode 100644 target/linux/generic/backport-5.10/500-v5.13-ubifs-default-to-zstd-compression.patch delete mode 100644 target/linux/generic/backport-5.10/600-v5.12-net-extract-napi-poll-functionality-to-__napi_poll.patch delete mode 100644 target/linux/generic/backport-5.10/601-v5.12-net-implement-threaded-able-napi-poll-loop-support.patch delete mode 100644 target/linux/generic/backport-5.10/602-v5.12-net-add-sysfs-attribute-to-control-napi-threaded-mod.patch delete mode 100644 target/linux/generic/backport-5.10/603-v5.12-net-fix-race-between-napi-kthread-mode-and-busy-poll.patch delete mode 100644 target/linux/generic/backport-5.10/604-v5.12-net-fix-hangup-on-napi_disable-for-threaded-napi.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-00-netfilter-flowtable-add-hash-offset-field-to-tuple.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-01-netfilter-flowtable-separate-replace-destroy-and-sta.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-03-netfilter-conntrack-Remove-unused-variable-declarati.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-04-netfilter-flowtable-consolidate-skb_try_make_writabl.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-05-netfilter-flowtable-move-skb_try_make_writable-befor.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-06-netfilter-flowtable-move-FLOW_OFFLOAD_DIR_MAX-away-f.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-07-netfilter-flowtable-fast-NAT-functions-never-fail.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-08-netfilter-flowtable-call-dst_check-to-fall-back-to-c.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-09-netfilter-flowtable-refresh-timeout-after-dst-and-wr.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-10-netfilter-nftables-update-table-flags-from-the-commi.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-11-net-resolve-forwarding-path-from-virtual-netdevice-a.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-12-net-8021q-resolve-forwarding-path-for-vlan-devices.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-13-net-bridge-resolve-forwarding-path-for-bridge-device.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-14-net-bridge-resolve-forwarding-path-for-VLAN-tag-acti.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-15-net-ppp-resolve-forwarding-path-for-bridge-pppoe-dev.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-16-net-dsa-resolve-forwarding-path-for-dsa-slave-ports.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-17-netfilter-flowtable-add-xmit-path-types.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-18-netfilter-flowtable-use-dev_fill_forward_path-to-obt.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-19-netfilter-flowtable-use-dev_fill_forward_path-to-obt.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-20-netfilter-flowtable-add-vlan-support.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-21-netfilter-flowtable-add-bridge-vlan-filtering-suppor.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-22-netfilter-flowtable-add-pppoe-support.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-23-netfilter-flowtable-add-dsa-support.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-24-selftests-netfilter-flowtable-bridge-and-vlan-suppor.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-25-netfilter-flowtable-add-offload-support-for-xmit-pat.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-26-netfilter-nft_flow_offload-use-direct-xmit-if-hardwa.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-27-netfilter-flowtable-bridge-vlan-hardware-offload-and.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-28-net-flow_offload-add-FLOW_ACTION_PPPOE_PUSH.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-29-netfilter-flowtable-support-for-FLOW_ACTION_PPPOE_PU.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-30-dsa-slave-add-support-for-TC_SETUP_FT.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-31-net-ethernet-mtk_eth_soc-fix-parsing-packets-in-GDM.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-32-net-ethernet-mtk_eth_soc-add-support-for-initializin.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-33-net-ethernet-mtk_eth_soc-add-flow-offloading-support.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-34-docs-nf_flowtable-update-documentation-with-enhancem.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-35-net-ethernet-mediatek-ppe-fix-busy-wait-loop.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-36-net-ethernet-mediatek-fix-a-typo-bug-in-flow-offload.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-38-net-ethernet-mtk_eth_soc-unmap-RX-data-before-callin.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-39-net-ethernet-mtk_eth_soc-fix-build_skb-cleanup.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-40-net-ethernet-mtk_eth_soc-use-napi_consume_skb.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-41-net-ethernet-mtk_eth_soc-reduce-MDIO-bus-access-late.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-42-net-ethernet-mtk_eth_soc-remove-unnecessary-TX-queue.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-43-net-ethernet-mtk_eth_soc-use-larger-burst-size-for-Q.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-44-net-ethernet-mtk_eth_soc-increase-DMA-ring-sizes.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-45-net-ethernet-mtk_eth_soc-implement-dynamic-interrupt.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-47-net-ethernet-mtk_eth_soc-only-read-the-full-RX-descr.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-48-net-ethernet-mtk_eth_soc-reduce-unnecessary-interrup.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-49-net-ethernet-mtk_eth_soc-rework-NAPI-callbacks.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-50-net-ethernet-mtk_eth_soc-set-PPE-flow-hash-as-skb-ha.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-51-net-ethernet-mtk_eth_soc-use-iopoll.h-macro-for-DMA-.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-52-net-ethernet-mtk_eth_soc-missing-mutex.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-53-net-ethernet-mtk_eth_soc-handle-VLAN-pop-action.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-54-netfilter-flowtable-dst_check-from-garbage-collector.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-55-netfilter-conntrack-Introduce-tcp-offload-timeout-co.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-56-netfilter-conntrack-Introduce-udp-offload-timeout-co.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-57-netfilter-flowtable-Set-offload-timeouts-according-t.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.13-58-netfilter-flowtable-Add-FLOW_OFFLOAD_XMIT_UNSPEC-xmi.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.15-58-netfilter-flowtable-avoid-possible-false-sharing.patch delete mode 100644 target/linux/generic/backport-5.10/610-v5.18-netfilter-flowtable-move-dst_check-to-packet-path.patch delete mode 100644 target/linux/generic/backport-5.10/611-v5.12-net-ethernet-mediatek-support-setting-MTU.patch delete mode 100644 target/linux/generic/backport-5.10/612-v5.15-netfilter-conntrack-sanitize-table-size-default-sett.patch delete mode 100644 target/linux/generic/backport-5.10/613-v5.15-01-netfilter-flowtable-remove-nf_ct_l4proto_find-call.patch delete mode 100644 target/linux/generic/backport-5.10/613-v5.15-02-netfilter-conntrack-remove-offload_pickup-sysctl-aga.patch delete mode 100644 target/linux/generic/backport-5.10/614-v5.18-netfilter-flowtable-fix-TCP-flow-teardown.patch delete mode 100644 target/linux/generic/backport-5.10/705-net-phy-at803x-select-correct-page-on-config-init.patch delete mode 100644 target/linux/generic/backport-5.10/706-net-phy-at803x-fix-probe-error-if-copper-page-is-sel.patch delete mode 100644 target/linux/generic/backport-5.10/710-v5.12-net-phy-Add-100-base-x-mode.patch delete mode 100644 target/linux/generic/backport-5.10/711-v5.12-sfp-add-support-for-100-base-x-SFPs.patch delete mode 100644 target/linux/generic/backport-5.10/712-v5.13-net-phy-marvell-refactor-HWMON-OOP-style.patch delete mode 100644 target/linux/generic/backport-5.10/713-v5.15-net-phy-marvell-add-SFP-support-for-88E1510.patch delete mode 100644 target/linux/generic/backport-5.10/719-v5.12-net-dsa-automatically-bring-up-DSA-master-when-openi.patch delete mode 100644 target/linux/generic/backport-5.10/720-v5.12-net-bridge-notify-switchdev-of-disappearance-of-old-.patch delete mode 100644 target/linux/generic/backport-5.10/721-v5.12-net-dsa-be-louder-when-a-non-legacy-FDB-operation-fa.patch delete mode 100644 target/linux/generic/backport-5.10/722-v5.12-net-dsa-don-t-use-switchdev_notifier_fdb_info-in-dsa.patch delete mode 100644 target/linux/generic/backport-5.10/723-v5.12-net-dsa-move-switchdev-event-implementation-under-th.patch delete mode 100644 target/linux/generic/backport-5.10/724-v5.12-net-dsa-exit-early-in-dsa_slave_switchdev_event-if-w.patch delete mode 100644 target/linux/generic/backport-5.10/725-v5.12-net-dsa-listen-for-SWITCHDEV_-FDB-DEL-_ADD_TO_DEVICE.patch delete mode 100644 target/linux/generic/backport-5.10/730-net-dsa-mt7530-setup-core-clock-even-in-TRGMII-mode.patch delete mode 100644 target/linux/generic/backport-5.10/731-v5.12-net-dsa-mt7530-MT7530-optional-GPIO-support.patch delete mode 100644 target/linux/generic/backport-5.10/731-v5.13-net-dsa-mt7530-Add-support-for-EEE-features.patch delete mode 100644 target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch delete mode 100644 target/linux/generic/backport-5.10/732-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch delete mode 100644 target/linux/generic/backport-5.10/733-v5.15-0001-net-bgmac-bcma-handle-deferred-probe-error-due-to-ma.patch delete mode 100644 target/linux/generic/backport-5.10/733-v5.15-0002-net-bgmac-platform-handle-mac-address-deferral.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-01-net-dsa-qca8k-change-simple-print-to-dev-variant.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-02-net-dsa-qca8k-use-iopoll-macro-for-qca8k_busy_wait.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-03-net-dsa-qca8k-improve-qca8k-read-write-rmw-bus-acces.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-04-net-dsa-qca8k-handle-qca8k_set_page-errors.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-05-net-dsa-qca8k-handle-error-with-qca8k_read-operation.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-06-net-dsa-qca8k-handle-error-with-qca8k_write-operatio.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-07-net-dsa-qca8k-handle-error-with-qca8k_rmw-operation.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-08-net-dsa-qca8k-handle-error-from-qca8k_busy_wait.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-09-net-dsa-qca8k-add-support-for-qca8327-switch.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-10-devicetree-net-dsa-qca8k-Document-new-compatible-qca.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-11-net-dsa-qca8k-add-priority-tweak-to-qca8337-switch.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-12-net-dsa-qca8k-limit-port5-delay-to-qca8337.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-13-net-dsa-qca8k-add-GLOBAL_FC-settings-needed-for-qca8.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-14-net-dsa-qca8k-add-support-for-switch-rev.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-15-net-dsa-qca8k-add-ethernet-ports-fallback-to-setup_m.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-16-net-dsa-qca8k-make-rgmii-delay-configurable.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-17-net-dsa-qca8k-clear-MASTER_EN-after-phy-read-write.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-18-net-dsa-qca8k-dsa-qca8k-protect-MASTER-busy_wait-wit.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-19-net-dsa-qca8k-enlarge-mdio-delay-and-timeout.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-20-net-dsa-qca8k-add-support-for-internal-phy-and-inter.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-21-devicetree-bindings-dsa-qca8k-Document-internal-mdio.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-22-net-dsa-qca8k-improve-internal-mdio-read-write-bus-a.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-23-net-dsa-qca8k-pass-switch_revision-info-to-phy-dev_f.patch delete mode 100644 target/linux/generic/backport-5.10/735-v5.14-25-net-phy-add-support-for-qca8k-switch-internal-PHY-in.patch delete mode 100644 target/linux/generic/backport-5.10/736-v5.14-net-dsa-qca8k-fix-missing-unlock-on-error-in-qca8k-vlan.patch delete mode 100644 target/linux/generic/backport-5.10/737-v5.14-01-net-dsa-qca8k-check-return-value-of-read-functions-c.patch delete mode 100644 target/linux/generic/backport-5.10/737-v5.14-02-net-dsa-qca8k-add-missing-check-return-value-in-qca8.patch delete mode 100644 target/linux/generic/backport-5.10/738-v5.14-01-net-dsa-qca8k-fix-an-endian-bug-in-qca8k-get-ethtool.patch delete mode 100644 target/linux/generic/backport-5.10/738-v5.14-02-net-dsa-qca8k-check-the-correct-variable-in-qca8k-se.patch delete mode 100644 target/linux/generic/backport-5.10/739-v5.15-net-dsa-qca8k-fix-kernel-panic-with-legacy-mdio-mapping.patch delete mode 100644 target/linux/generic/backport-5.10/740-v5.13-0001-net-dsa-b53-Add-debug-prints-in-b53_vlan_enable.patch delete mode 100644 target/linux/generic/backport-5.10/740-v5.13-0002-net-dsa-b53-spi-allow-device-tree-probing.patch delete mode 100644 target/linux/generic/backport-5.10/740-v5.13-0003-net-dsa-b53-relax-is63xx-condition.patch delete mode 100644 target/linux/generic/backport-5.10/740-v5.13-0004-net-dsa-tag_brcm-add-support-for-legacy-tags.patch delete mode 100644 target/linux/generic/backport-5.10/740-v5.13-0005-net-dsa-b53-support-legacy-tags.patch delete mode 100644 target/linux/generic/backport-5.10/740-v5.13-0006-net-dsa-b53-mmap-Add-device-tree-support.patch delete mode 100644 target/linux/generic/backport-5.10/740-v5.13-0007-net-dsa-b53-spi-add-missing-MODULE_DEVICE_TABLE.patch delete mode 100644 target/linux/generic/backport-5.10/741-v5.14-0001-net-dsa-b53-Do-not-force-CPU-to-be-always-tagged.patch delete mode 100644 target/linux/generic/backport-5.10/741-v5.14-0002-net-dsa-b53-remove-redundant-null-check-on-dev.patch delete mode 100644 target/linux/generic/backport-5.10/741-v5.14-0003-net-dsa-b53-Create-default-VLAN-entry-explicitly.patch delete mode 100644 target/linux/generic/backport-5.10/742-v5.16-net-phy-at803x-add-support-for-qca-8327-internal-phy.patch delete mode 100644 target/linux/generic/backport-5.10/743-v5.16-0001-net-dsa-b53-Include-all-ports-in-enabled_ports.patch delete mode 100644 target/linux/generic/backport-5.10/743-v5.16-0002-net-dsa-b53-Drop-BCM5301x-workaround-for-a-wrong-CPU.patch delete mode 100644 target/linux/generic/backport-5.10/743-v5.16-0003-net-dsa-b53-Improve-flow-control-setup-on-BCM5301x.patch delete mode 100644 target/linux/generic/backport-5.10/743-v5.16-0004-net-dsa-b53-Drop-unused-cpu_port-field.patch delete mode 100644 target/linux/generic/backport-5.10/744-v5.15-net-dsa-don-t-set-skb-offload_fwd_mark-when-not-offl.patch delete mode 100644 target/linux/generic/backport-5.10/745-v5.16-01-net-phy-at803x-add-support-for-qca-8327-A-variant.patch delete mode 100644 target/linux/generic/backport-5.10/745-v5.16-02-net-phy-at803x-add-resume-suspend-function-to-qca83x.patch delete mode 100644 target/linux/generic/backport-5.10/745-v5.16-03-net-phy-at803x-fix-spacing-and-improve-name-for-83xx.patch delete mode 100644 target/linux/generic/backport-5.10/746-v5.16-01-net-phy-at803x-fix-resume-for-QCA8327-phy.patch delete mode 100644 target/linux/generic/backport-5.10/746-v5.16-02-net-phy-at803x-add-DAC-amplitude-fix-for-8327-phy.patch delete mode 100644 target/linux/generic/backport-5.10/746-v5.16-03-net-phy-at803x-enable-prefer-master-for-83xx-interna.patch delete mode 100644 target/linux/generic/backport-5.10/746-v5.16-04-net-phy-at803x-better-describe-debug-regs.patch delete mode 100644 target/linux/generic/backport-5.10/747-v5.16-12-net-dsa-qca8k-add-support-for-QCA8328.patch delete mode 100644 target/linux/generic/backport-5.10/754-net-next-net-dsa-qca8k-convert-to-GENMASK_FIELD_PREP_FIELD_GET.patch delete mode 100644 target/linux/generic/backport-5.10/756-net-next-net-dsa-qca8k-move-regmap-init-in-probe-and-set-it.patch delete mode 100644 target/linux/generic/backport-5.10/758-net-next-net-dsa-qca8k-add-additional-MIB-counter-and-.patch delete mode 100644 target/linux/generic/backport-5.10/759-net-next-net-dsa-qca8k-add-support-for-port-fast-aging.patch delete mode 100644 target/linux/generic/backport-5.10/760-net-next-net-dsa-qca8k-add-set_ageing_time-support.patch delete mode 100644 target/linux/generic/backport-5.10/761-net-next-net-dsa-qca8k-add-support-for-mdb_add-del.patch delete mode 100644 target/linux/generic/backport-5.10/762-v5.11-net-dsa-mt7530-support-setting-MTU.patch delete mode 100644 target/linux/generic/backport-5.10/763-v5.11-net-dsa-mt7530-enable-MTU-normalization.patch delete mode 100644 target/linux/generic/backport-5.10/764-v5.11-net-dsa-mt7530-support-setting-ageing-time.patch delete mode 100644 target/linux/generic/backport-5.10/770-v5.15-net-dsa-mt7530-support-MDB-operations.patch delete mode 100644 target/linux/generic/backport-5.10/771-v5.14-net-phy-add-MediaTek-Gigabit-Ethernet-PHY-driver.patch delete mode 100644 target/linux/generic/backport-5.10/772-v5.14-net-dsa-mt7530-add-interrupt-support.patch delete mode 100644 target/linux/generic/backport-5.10/773-v5.18-1-net-dsa-Move-VLAN-filtering-syncing-out-of-dsa_switc.patch delete mode 100644 target/linux/generic/backport-5.10/773-v5.18-2-net-dsa-Avoid-cross-chip-syncing-of-VLAN-filtering.patch delete mode 100644 target/linux/generic/backport-5.10/800-v5.13-0001-firmware-bcm47xx_nvram-rename-finding-function-and-i.patch delete mode 100644 target/linux/generic/backport-5.10/800-v5.13-0002-firmware-bcm47xx_nvram-add-helper-checking-for-NVRAM.patch delete mode 100644 target/linux/generic/backport-5.10/800-v5.13-0003-firmware-bcm47xx_nvram-extract-code-copying-NVRAM.patch delete mode 100644 target/linux/generic/backport-5.10/800-v5.13-0004-firmware-bcm47xx_nvram-look-for-NVRAM-with-for-inste.patch delete mode 100644 target/linux/generic/backport-5.10/800-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch delete mode 100644 target/linux/generic/backport-5.10/801-v6.1-0001-nvmem-add-driver-handling-U-Boot-environment-variabl.patch delete mode 100644 target/linux/generic/backport-5.10/801-v6.1-0002-nvmem-u-boot-env-find-Device-Tree-nodes-for-NVMEM-ce.patch delete mode 100644 target/linux/generic/backport-5.10/801-v6.1-0003-nvmem-u-boot-env-fix-crc32-casting-type.patch delete mode 100644 target/linux/generic/backport-5.10/802-v5.19-nvmem-core-support-passing-DT-node-in-cell-info.patch delete mode 100644 target/linux/generic/backport-5.10/803-v6.2-0001-nvmem-u-boot-env-fix-crc32_data_offset-on-redundant-.patch delete mode 100644 target/linux/generic/backport-5.10/803-v6.2-0002-nvmem-u-boot-env-align-endianness-of-crc32-values.patch delete mode 100644 target/linux/generic/backport-5.10/803-v6.2-0003-nvmem-u-boot-env-add-Broadcom-format-support.patch delete mode 100644 target/linux/generic/backport-5.10/810-v5.13-usb-ehci-add-spurious-flag-to-disable-overcurrent-ch.patch delete mode 100644 target/linux/generic/backport-5.10/811-v5.13-usb-host-ehci-platform-add-spurious_oc-DT-support.patch delete mode 100644 target/linux/generic/backport-5.10/820-v5.13-make-pci_host_common_probe-declare-its-reliance-on-msi-domains.patch delete mode 100644 target/linux/generic/backport-5.10/821-v5.13-let-pci-host-bridges-declar-their-reliance-on-msi-domains.patch delete mode 100644 target/linux/generic/backport-5.10/822-v5.13-advertise-lack-of-built-in-msi-handling.patch delete mode 100644 target/linux/generic/backport-5.10/830-v5.14-leds-lp55xx-Initialize-enable-GPIO-direction-to-outp.patch delete mode 100644 target/linux/generic/backport-5.10/845-v6.0-0002-leds-bcm63138-add-support-for-BCM63138-controller.patch delete mode 100644 target/linux/generic/backport-5.10/846-v6.0-0002-leds-add-help-info-about-BCM63138-module-name.patch delete mode 100644 target/linux/generic/backport-5.10/850-v5.17-0001-PCI-pci-bridge-emul-Add-description-for-class_revisi.patch delete mode 100644 target/linux/generic/backport-5.10/850-v5.17-0002-PCI-pci-bridge-emul-Add-definitions-for-missing-capa.patch delete mode 100644 target/linux/generic/backport-5.10/850-v5.17-0003-PCI-aardvark-Add-support-for-DEVCAP2-DEVCTL2-LNKCAP2.patch delete mode 100644 target/linux/generic/backport-5.10/850-v5.17-0005-PCI-aardvark-Comment-actions-in-driver-remove-method.patch delete mode 100644 target/linux/generic/backport-5.10/850-v5.17-0006-PCI-aardvark-Disable-bus-mastering-when-unbinding-dr.patch delete mode 100644 target/linux/generic/backport-5.10/850-v5.17-0007-PCI-aardvark-Mask-all-interrupts-when-unbinding-driv.patch delete mode 100644 target/linux/generic/backport-5.10/850-v5.17-0008-PCI-aardvark-Fix-memory-leak-in-driver-unbind.patch delete mode 100644 target/linux/generic/backport-5.10/850-v5.17-0009-PCI-aardvark-Assert-PERST-when-unbinding-driver.patch delete mode 100644 target/linux/generic/backport-5.10/850-v5.17-0010-PCI-aardvark-Disable-link-training-when-unbinding-dr.patch delete mode 100644 target/linux/generic/backport-5.10/850-v5.17-0011-PCI-aardvark-Disable-common-PHY-when-unbinding-drive.patch delete mode 100644 target/linux/generic/backport-5.10/851-v5.15-0001-phy-marvell-phy-mvebu-a3700-comphy-Rename-HS-SGMMI-t.patch delete mode 100644 target/linux/generic/backport-5.10/851-v5.15-0002-phy-marvell-phy-mvebu-a3700-comphy-Remove-unsupporte.patch delete mode 100644 target/linux/generic/backport-5.10/860-v5.17-MIPS-ath79-drop-_machine_restart-again.patch delete mode 100644 target/linux/generic/backport-5.10/880-v5.19-cdc_ether-export-usbnet_cdc_zte_rx_fixup.patch delete mode 100644 target/linux/generic/backport-5.10/881-v5.19-rndis_host-enable-the-bogus-MAC-fixup-for-ZTE-device.patch delete mode 100644 target/linux/generic/backport-5.10/882-v5.19-rndis_host-limit-scope-of-bogus-MAC-address-detectio.patch create mode 100644 target/linux/generic/backport-5.15/005-v5.17-01-Kbuild-use-Wdeclaration-after-statement.patch create mode 100644 target/linux/generic/backport-5.15/005-v5.17-02-Kbuild-move-to-std-gnu11.patch create mode 100644 target/linux/generic/backport-5.15/005-v5.17-03-Kbuild-use-std-gnu11-for-KBUILD_USERCFLAGS.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-01-mm-x86-arm64-add-arch_has_hw_pte_young.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-02-mm-x86-add-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-03-mm-vmscan.c-refactor-shrink_node.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-04-Revert-include-linux-mm_inline.h-fold-__update_lru_s.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-05-mm-multi-gen-LRU-groundwork.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-06-mm-multi-gen-LRU-minimal-implementation.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-07-mm-multi-gen-LRU-exploit-locality-in-rmap.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-08-mm-multi-gen-LRU-support-page-table-walks.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-09-mm-multi-gen-LRU-optimize-multiple-memcgs.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-10-mm-multi-gen-LRU-kill-switch.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-11-mm-multi-gen-LRU-thrashing-prevention.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-12-mm-multi-gen-LRU-debugfs-interface.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-13-mm-mglru-don-t-sync-disk-for-each-aging-cycle.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-14-mm-multi-gen-LRU-retry-pages-written-back-while-isol.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-15-mm-multi-gen-LRU-move-lru_gen_add_mm-out-of-IRQ-off-.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-17-mm-add-dummy-pmd_young-for-architectures-not-having-.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.1-18-mm-introduce-arch_has_hw_nonleaf_pmd_young.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.2-16-mm-multi-gen-LRU-fix-crash-during-cgroup-migration.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.3-19-mm-add-vma_has_recency.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.3-20-mm-support-POSIX_FADV_NOREUSE.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.3-21-mm-multi-gen-LRU-rename-lru_gen_struct-to-lru_gen_pa.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.3-22-mm-multi-gen-LRU-rename-lrugen-lists-to-lrugen-pages.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.3-23-mm-multi-gen-LRU-remove-eviction-fairness-safeguard.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.3-24-mm-multi-gen-LRU-remove-aging-fairness-safeguard.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.3-25-mm-multi-gen-LRU-shuffle-should_run_aging.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.3-26-mm-multi-gen-LRU-per-node-lru_gen_page-lists.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.3-27-mm-multi-gen-LRU-clarify-scan_control-flags.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.3-28-mm-multi-gen-LRU-simplify-arch_has_hw_pte_young-chec.patch create mode 100644 target/linux/generic/backport-5.15/020-v6.3-29-mm-multi-gen-LRU-avoid-futile-retries.patch rename target/linux/generic/{backport-5.10 => backport-5.15}/050-v5.16-00-MIPS-uasm-Enable-muhu-opcode-for-MIPS-R6.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/050-v5.16-01-mips-uasm-Add-workaround-for-Loongson-2F-nop-CPU-err.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/050-v5.16-02-mips-bpf-Add-eBPF-JIT-for-32-bit-MIPS.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/050-v5.16-03-mips-bpf-Add-new-eBPF-JIT-for-64-bit-MIPS.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/050-v5.16-04-mips-bpf-Add-JIT-workarounds-for-CPU-errata.patch (100%) create mode 100644 target/linux/generic/backport-5.15/050-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch rename target/linux/generic/{backport-5.10 => backport-5.15}/050-v5.16-06-mips-bpf-Remove-old-BPF-JIT-implementations.patch (100%) create mode 100644 target/linux/generic/backport-5.15/060-v5.18-01-bpf-selftests-Add-helpers-to-directly-use-the-capget.patch create mode 100644 target/linux/generic/backport-5.15/060-v5.18-02-bpf-selftests-Remove-libcap-usage-from-test_verifier.patch create mode 100644 target/linux/generic/backport-5.15/060-v5.18-03-bpf-selftests-Remove-libcap-usage-from-test_progs.patch create mode 100644 target/linux/generic/backport-5.15/080-v5.17-clk-gate-Add-devm_clk_hw_register_gate.patch create mode 100644 target/linux/generic/backport-5.15/081-v5.17-regmap-allow-to-define-reg_update_bits-for-no-bus.patch create mode 100644 target/linux/generic/backport-5.15/100-v5.18-tty-serial-bcm63xx-use-more-precise-Kconfig-symbol.patch create mode 100644 target/linux/generic/backport-5.15/200-v5.18-tools-resolve_btfids-Build-with-host-flags.patch create mode 100644 target/linux/generic/backport-5.15/201-v5.16-scripts-dtc-Update-to-upstream-version-v1.6.1-19-g0a.patch create mode 100644 target/linux/generic/backport-5.15/300-v5.18-pinctrl-qcom-Return--EINVAL-for-setting-affinity-if-no-IRQ-parent.patch create mode 100644 target/linux/generic/backport-5.15/301-v5.16-soc-qcom-smem-Support-reserved-memory-description.patch create mode 100644 target/linux/generic/backport-5.15/302-v5.16-watchdog-bcm63xx_wdt-fix-fallthrough-warning.patch create mode 100644 target/linux/generic/backport-5.15/330-v5.16-01-MIPS-kernel-proc-add-CPU-option-reporting.patch create mode 100644 target/linux/generic/backport-5.15/330-v5.16-02-MIPS-Fix-using-smp_processor_id-in-preemptible-in-sh.patch create mode 100644 target/linux/generic/backport-5.15/331-v5.19-mtd-spinand-Add-support-for-XTX-XT26G0xA.patch create mode 100644 target/linux/generic/backport-5.15/344-v5.18-01-phy-marvell-phy-mvebu-a3700-comphy-Remove-port-from-.patch create mode 100644 target/linux/generic/backport-5.15/344-v5.18-02-phy-marvell-phy-mvebu-a3700-comphy-Add-native-kernel.patch create mode 100644 target/linux/generic/backport-5.15/345-v5.17-arm64-dts-marvell-armada-37xx-Add-xtal-clock-to-comp.patch create mode 100644 target/linux/generic/backport-5.15/346-v5.18-01-Revert-ata-ahci-mvebu-Make-SATA-PHY-optional-for-Arm.patch create mode 100644 target/linux/generic/backport-5.15/346-v5.18-02-Revert-usb-host-xhci-mvebu-make-USB-3.0-PHY-optional.patch create mode 100644 target/linux/generic/backport-5.15/346-v5.18-03-Revert-PCI-aardvark-Fix-initialization-with-old-Marv.patch create mode 100644 target/linux/generic/backport-5.15/347-v6.0-phy-marvell-phy-mvebu-a3700-comphy-Remove-broken-res.patch create mode 100644 target/linux/generic/backport-5.15/350-v5.18-regmap-add-configurable-downshift-for-addresses.patch create mode 100644 target/linux/generic/backport-5.15/351-v5.18-regmap-allow-a-defined-reg_base-to-be-added-to-every.patch create mode 100644 target/linux/generic/backport-5.15/352-v6.3-regmap-apply-reg_base-and-reg_downshift-for-single-r.patch create mode 100644 target/linux/generic/backport-5.15/400-v5.19-mtd-call-of_platform_populate-for-MTD-partitions.patch create mode 100644 target/linux/generic/backport-5.15/401-v6.0-mtd-parsers-add-support-for-Sercomm-partitions.patch create mode 100644 target/linux/generic/backport-5.15/402-v6.0-mtd-next-mtd-core-introduce-of-support-for-dynamic-partitions.patch create mode 100644 target/linux/generic/backport-5.15/403-v6.1-mtd-allow-getting-MTD-device-associated-with-a-speci.patch create mode 100644 target/linux/generic/backport-5.15/404-v6.0-mtd-core-check-partition-before-dereference.patch create mode 100644 target/linux/generic/backport-5.15/405-v6.1-mtd-core-add-missing-of_node_get-in-dynamic-partitio.patch create mode 100644 target/linux/generic/backport-5.15/406-v6.2-0001-mtd-core-simplify-a-bit-code-find-partition-matching.patch create mode 100644 target/linux/generic/backport-5.15/406-v6.2-0002-mtd-core-try-to-find-OF-node-for-every-MTD-partition.patch create mode 100644 target/linux/generic/backport-5.15/407-v5.17-mtd-parsers-qcom-Don-t-print-error-message-on-EPROBE.patch create mode 100644 target/linux/generic/backport-5.15/408-v6.2-mtd-core-set-ROOT_DEV-for-partitions-marked-as-rootf.patch rename target/linux/generic/{backport-5.10/410-mtd-next-mtd-parsers-trx-allow-to-use-on-MediaTek-MIPS-SoCs.patch => backport-5.15/410-v5.18-mtd-parsers-trx-allow-to-use-on-MediaTek-MIPS-SoCs.patch} (100%) create mode 100644 target/linux/generic/backport-5.15/420-v5.19-02-mtd-spinand-gigadevice-add-support-for-GD5FxGQ4xExxG.patch create mode 100644 target/linux/generic/backport-5.15/420-v5.19-03-mtd-spinand-gigadevice-add-support-for-GD5F1GQ5RExxG.patch create mode 100644 target/linux/generic/backport-5.15/420-v5.19-04-mtd-spinand-gigadevice-add-support-for-GD5F-2-4-GQ5x.patch create mode 100644 target/linux/generic/backport-5.15/420-v5.19-05-mtd-spinand-gigadevice-add-support-for-GD5FxGM7xExxG.patch create mode 100644 target/linux/generic/backport-5.15/421-v6.2-mtd-parsers-add-TP-Link-SafeLoader-partitions-table-.patch create mode 100644 target/linux/generic/backport-5.15/422-v5.19-mtd-spi-nor-support-eon-en25qh256a.patch create mode 100644 target/linux/generic/backport-5.15/423-v6.1-0001-mtd-track-maximum-number-of-bitflips-for-each-read-r.patch create mode 100644 target/linux/generic/backport-5.15/423-v6.1-0002-mtd-always-initialize-stats-in-struct-mtd_oob_ops.patch create mode 100644 target/linux/generic/backport-5.15/423-v6.1-0003-mtd-add-ECC-error-accounting-for-each-read-request.patch create mode 100644 target/linux/generic/backport-5.15/423-v6.1-0004-mtdchar-add-MEMREAD-ioctl.patch create mode 100644 target/linux/generic/backport-5.15/423-v6.3-mtd-spinand-macronix-use-scratch-buffer-for-DMA-oper.patch create mode 100644 target/linux/generic/backport-5.15/424-v6.4-0004-mtd-core-prepare-mtd_otp_nvmem_add-to-handle-EPROBE_.patch create mode 100644 target/linux/generic/backport-5.15/600-v5.18-page_pool-Add-allocation-stats.patch create mode 100644 target/linux/generic/backport-5.15/601-v5.18-page_pool-Add-recycle-stats.patch create mode 100644 target/linux/generic/backport-5.15/602-v5.18-page_pool-Add-function-to-batch-and-return-stats.patch create mode 100644 target/linux/generic/backport-5.15/603-v5.19-page_pool-Add-recycle-stats-to-page_pool_put_page_bu.patch create mode 100644 target/linux/generic/backport-5.15/604-v5.19-net-page_pool-introduce-ethtool-stats.patch create mode 100644 target/linux/generic/backport-5.15/605-v5.18-xdp-introduce-flags-field-in-xdp_buff-xdp_frame.patch create mode 100644 target/linux/generic/backport-5.15/606-v5.18-xdp-add-frags-support-to-xdp_return_-buff-frame.patch create mode 100644 target/linux/generic/backport-5.15/607-v5.18-net-skbuff-add-size-metadata-to-skb_shared_info-for-.patch create mode 100644 target/linux/generic/backport-5.15/608-v5.18-net-veth-Account-total-xdp_frame-len-running-ndo_xdp.patch create mode 100644 target/linux/generic/backport-5.15/609-v5.18-veth-Allow-jumbo-frames-in-xdp-mode.patch create mode 100644 target/linux/generic/backport-5.15/611-v6.3-net-add-helper-eth_addr_add.patch create mode 100644 target/linux/generic/backport-5.15/700-v5.17-net-dsa-introduce-tagger-owned-storage-for-private.patch create mode 100644 target/linux/generic/backport-5.15/701-v5.17-dsa-make-tagging-protocols-connect-to-individual-switches.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-00-net-ethernet-mtk_eth_soc-add-support-for-coherent-DM.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-02-net-ethernet-mtk_eth_soc-add-support-for-Wireless-Et.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-03-net-ethernet-mtk_eth_soc-implement-flow-offloading-t.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-05-net-ethernet-mtk_eth_soc-add-ipv6-flow-offload-suppo.patch rename target/linux/generic/{pending-5.10/701-06-net-ethernet-mtk_eth_soc-support-TC_SETUP_BLOCK-for-.patch => backport-5.15/702-v5.19-06-net-ethernet-mtk_eth_soc-support-TC_SETUP_BLOCK-for-.patch} (100%) create mode 100644 target/linux/generic/backport-5.15/702-v5.19-07-net-ethernet-mtk_eth_soc-allocate-struct-mtk_ppe-sep.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-08-net-ethernet-mtk_eth_soc-rework-hardware-flow-table-.patch rename target/linux/generic/{pending-5.10/701-09-net-ethernet-mtk_eth_soc-remove-bridge-flow-offload-.patch => backport-5.15/702-v5.19-09-net-ethernet-mtk_eth_soc-remove-bridge-flow-offload-.patch} (100%) create mode 100644 target/linux/generic/backport-5.15/702-v5.19-10-net-ethernet-mtk_eth_soc-support-creating-mac-addres.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-11-net-ethernet-mtk_eth_soc-wed-fix-sparse-endian-warni.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-12-net-ethernet-mtk_eth_soc-fix-return-value-check-in-m.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-13-net-ethernet-mtk_eth_soc-use-standard-property-for-c.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-14-net-ethernet-mtk_eth_soc-use-after-free-in-__mtk_ppe.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-15-net-ethernet-mtk_eth_soc-add-check-for-allocation-fa.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-16-eth-mtk_eth_soc-silence-the-GCC-12-array-bounds-warn.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-17-net-ethernet-mtk_eth_soc-rely-on-GFP_KERNEL-for-dma_.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-18-net-ethernet-mtk_eth_soc-move-tx-dma-desc-configurat.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-19-net-ethernet-mtk_eth_soc-add-txd_size-to-mtk_soc_dat.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-20-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-mtk_tx_.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-21-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-mtk_des.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-22-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-txd_to_.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-23-net-ethernet-mtk_eth_soc-add-rxd_size-to-mtk_soc_dat.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-24-net-ethernet-mtk_eth_soc-rely-on-txd_size-field-in-m.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-25-net-ethernet-mtk_eth_soc-rely-on-rxd_size-field-in-m.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-26-net-ethernet-mtk_eth_soc-introduce-device-register-m.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-27-net-ethernet-mtk_eth_soc-introduce-MTK_NETSYS_V2-sup.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-28-net-ethernet-mtk_eth_soc-convert-ring-dma-pointer-to.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-29-net-ethernet-mtk_eth_soc-convert-scratch_ring-pointe.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-30-net-ethernet-mtk_eth_soc-introduce-support-for-mt798.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-31-net-ethernet-mtk_eth_soc-fix-error-code-in-mtk_flow_.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-33-net-ethernet-mtk_eth_soc-enable-rx-cksum-offload-for.patch create mode 100644 target/linux/generic/backport-5.15/702-v5.19-34-eth-mtk_ppe-fix-up-after-merge.patch create mode 100644 target/linux/generic/backport-5.15/703-00-v5.16-net-convert-users-of-bitmap_foo-to-linkmode_foo.patch create mode 100644 target/linux/generic/backport-5.15/703-01-v5.16-net-phylink-add-MAC-phy_interface_t-bitmap.patch create mode 100644 target/linux/generic/backport-5.15/703-02-v5.16-net-phylink-use-supported_interfaces-for-phylink-val.patch create mode 100644 target/linux/generic/backport-5.15/703-03-v5.16-net-dsa-populate-supported_interfaces-member.patch create mode 100644 target/linux/generic/backport-5.15/703-04-v5.17-net-dsa-consolidate-phylink-creation.patch create mode 100644 target/linux/generic/backport-5.15/703-05-v5.17-net-dsa-replace-phylink_get_interfaces-with-phylink_.patch create mode 100644 target/linux/generic/backport-5.15/703-06-v5.18-net-dsa-add-support-for-phylink-mac_select_pcs.patch create mode 100644 target/linux/generic/backport-5.15/703-07-v5.16-net-phy-add-phy_interface_t-bitmap-support.patch create mode 100644 target/linux/generic/backport-5.15/703-08-v5.17-net-phylink-add-mac_select_pcs-method-to-phylink_mac.patch create mode 100644 target/linux/generic/backport-5.15/703-09-v5.17-net-phylink-add-generic-validate-implementation.patch create mode 100644 target/linux/generic/backport-5.15/703-11-v5.17-net-phylink-add-pcs_validate-method.patch create mode 100644 target/linux/generic/backport-5.15/703-12-v5.17-net-phylink-add-legacy_pre_march2020-indicator.patch create mode 100644 target/linux/generic/backport-5.15/703-13-v5.17-net-dsa-mark-DSA-phylink-as-legacy_pre_march2020.patch create mode 100644 target/linux/generic/backport-5.15/703-14-v5.17-net-phylink-use-legacy_pre_march2020.patch create mode 100644 target/linux/generic/backport-5.15/703-15-v5.18-net-phy-phylink-fix-DSA-mac_select_pcs-introduction.patch create mode 100644 target/linux/generic/backport-5.15/703-16-v5.16-net-mvneta-populate-supported_interfaces-member.patch create mode 100644 target/linux/generic/backport-5.15/703-17-v5.16-net-mvneta-remove-interface-checks-in-mvneta_validat.patch create mode 100644 target/linux/generic/backport-5.15/703-18-v5.16-net-mvneta-drop-use-of-phylink_helper_basex_speed.patch create mode 100644 target/linux/generic/backport-5.15/703-19-v5.17-net-mvneta-use-phylink_generic_validate.patch create mode 100644 target/linux/generic/backport-5.15/703-20-v5.17-net-mvneta-mark-as-a-legacy_pre_march2020-driver.patch create mode 100644 target/linux/generic/backport-5.15/704-01-v5.17-net-mtk_eth_soc-populate-supported_interfaces-member.patch create mode 100644 target/linux/generic/backport-5.15/704-02-v5.17-net-mtk_eth_soc-remove-interface-checks-in-mtk_valid.patch create mode 100644 target/linux/generic/backport-5.15/704-03-v5.17-net-mtk_eth_soc-drop-use-of-phylink_helper_basex_spe.patch create mode 100644 target/linux/generic/backport-5.15/704-04-v5.17-net-mtk_eth_soc-use-phylink_generic_validate.patch create mode 100644 target/linux/generic/backport-5.15/704-05-v5.17-net-mtk_eth_soc-mark-as-a-legacy_pre_march2020-drive.patch create mode 100644 target/linux/generic/backport-5.15/704-06-v5.19-eth-mtk_eth_soc-remove-a-copy-of-the-NAPI_POLL_WEIGH.patch create mode 100644 target/linux/generic/backport-5.15/704-07-v5.19-mtk_eth_soc-remove-unused-mac-mode.patch create mode 100644 target/linux/generic/backport-5.15/704-08-v5.19-net-mtk_eth_soc-remove-unused-sgmii-flags.patch create mode 100644 target/linux/generic/backport-5.15/704-09-v5.19-net-mtk_eth_soc-add-mask-and-update-PCS-speed-defini.patch create mode 100644 target/linux/generic/backport-5.15/704-10-v5.19-net-mtk_eth_soc-correct-802.3z-speed-setting.patch create mode 100644 target/linux/generic/backport-5.15/704-11-v5.19-net-mtk_eth_soc-correct-802.3z-duplex-setting.patch create mode 100644 target/linux/generic/backport-5.15/704-12-v5.19-net-mtk_eth_soc-stop-passing-phylink-state-to-sgmii-.patch create mode 100644 target/linux/generic/backport-5.15/704-13-v5.19-net-mtk_eth_soc-provide-mtk_sgmii_config.patch create mode 100644 target/linux/generic/backport-5.15/704-14-v5.19-net-mtk_eth_soc-add-fixme-comment-for-state-speed-us.patch create mode 100644 target/linux/generic/backport-5.15/704-15-v5.19-net-mtk_eth_soc-move-MAC_MCR-setting-to-mac_finish.patch create mode 100644 target/linux/generic/backport-5.15/704-16-v5.19-net-mtk_eth_soc-move-restoration-of-SYSCFG0-to-mac_f.patch create mode 100644 target/linux/generic/backport-5.15/704-17-v5.19-net-mtk_eth_soc-convert-code-structure-to-suit-split.patch create mode 100644 target/linux/generic/backport-5.15/704-18-v5.19-net-mtk_eth_soc-partially-convert-to-phylink_pcs.patch create mode 100644 target/linux/generic/backport-5.15/705-01-v5.17-net-dsa-mt7530-iterate-using-dsa_switch_for_each_use.patch create mode 100644 target/linux/generic/backport-5.15/705-02-v5.19-net-dsa-mt7530-populate-supported_interfaces-and-mac.patch create mode 100644 target/linux/generic/backport-5.15/705-03-v5.19-net-dsa-mt7530-remove-interface-checks.patch create mode 100644 target/linux/generic/backport-5.15/705-04-v5.19-net-dsa-mt7530-drop-use-of-phylink_helper_basex_spee.patch create mode 100644 target/linux/generic/backport-5.15/705-05-v5.19-net-dsa-mt7530-only-indicate-linkmodes-that-can-be-s.patch create mode 100644 target/linux/generic/backport-5.15/705-06-v5.19-net-dsa-mt7530-switch-to-use-phylink_get_linkmodes.patch create mode 100644 target/linux/generic/backport-5.15/705-07-v5.19-net-dsa-mt7530-partially-convert-to-phylink_pcs.patch create mode 100644 target/linux/generic/backport-5.15/705-08-v5.19-net-dsa-mt7530-move-autoneg-handling-to-PCS-validati.patch create mode 100644 target/linux/generic/backport-5.15/705-09-v5.19-net-dsa-mt7530-mark-as-non-legacy.patch create mode 100644 target/linux/generic/backport-5.15/705-10-v5.19-net-dsa-mt753x-fix-pcs-conversion-regression.patch create mode 100644 target/linux/generic/backport-5.15/705-11-v6.0-net-dsa-mt7530-rework-mt7530_hw_vlan_-add-del.patch create mode 100644 target/linux/generic/backport-5.15/705-13-v6.0-net-dsa-mt7530-get-cpu-port-via-dp-cpu_dp-instead-of.patch create mode 100644 target/linux/generic/backport-5.15/706-00-v6.0-net-ethernet-mtk_eth_soc-rely-on-page_pool-for-singl.patch create mode 100644 target/linux/generic/backport-5.15/706-01-v6.0-net-ethernet-mtk_eth_soc-add-basic-XDP-support.patch create mode 100644 target/linux/generic/backport-5.15/706-02-v6.0-net-ethernet-mtk_eth_soc-introduce-xdp-ethtool-count.patch create mode 100644 target/linux/generic/backport-5.15/706-03-v6.0-net-ethernet-mtk_eth_soc-add-xmit-XDP-support.patch create mode 100644 target/linux/generic/backport-5.15/706-04-v6.0-net-ethernet-mtk_eth_soc-add-support-for-page_pool_g.patch create mode 100644 target/linux/generic/backport-5.15/706-05-v6.0-net-ethernet-mtk_eth_soc-introduce-mtk_xdp_frame_map.patch create mode 100644 target/linux/generic/backport-5.15/706-06-v6.0-net-ethernet-mtk_eth_soc-introduce-xdp-multi-frag-su.patch create mode 100644 target/linux/generic/backport-5.15/707-v6.3-net-pcs-add-driver-for-MediaTek-SGMII-PCS.patch create mode 100644 target/linux/generic/backport-5.15/708-01-v5.16-net-mvneta-Delete-unused-variable.patch create mode 100644 target/linux/generic/backport-5.15/708-02-v6.3-net-mvneta-fix-potential-double-frees-in-mvneta_txq_.patch create mode 100644 target/linux/generic/backport-5.15/710-v6.0-net-ethernet-mtk_eth_soc-fix-hw-hash-reporting-for-M.patch create mode 100644 target/linux/generic/backport-5.15/711-v6.0-01-net-ethernet-mtk_eth_soc-fix-off-by-one-check-of-ARR.patch create mode 100644 target/linux/generic/backport-5.15/711-v6.0-02-net-ethernet-mtk_ppe-fix-possible-NULL-pointer-deref.patch create mode 100644 target/linux/generic/backport-5.15/711-v6.0-03-net-ethernet-mtk-ppe-fix-traffic-offload-with-bridge.patch create mode 100644 target/linux/generic/backport-5.15/711-v6.0-04-net-ethernet-mtk_eth_soc-remove-mtk_foe_entry_timest.patch create mode 100644 target/linux/generic/backport-5.15/712-v6.0-net-ethernet-mtk_eth_soc-enable-XDP-support-just-for.patch create mode 100644 target/linux/generic/backport-5.15/713-v6.0-net-ethernet-mtk_eth_soc-move-gdma_to_ppe-and-ppe_ba.patch create mode 100644 target/linux/generic/backport-5.15/714-v6.0-net-ethernet-mtk_eth_soc-move-ppe-table-hash-offset-.patch create mode 100644 target/linux/generic/backport-5.15/715-v6.0-net-ethernet-mtk_eth_soc-add-the-capability-to-run-m.patch create mode 100644 target/linux/generic/backport-5.15/716-v6.0-net-ethernet-mtk_eth_soc-move-wdma_base-definitions-.patch create mode 100644 target/linux/generic/backport-5.15/717-v6.0-net-ethernet-mtk_eth_soc-add-foe_entry_size-to-mtk_e.patch create mode 100644 target/linux/generic/backport-5.15/718-v6.0-net-ethernet-mtk_eth_soc-fix-typo-in-__mtk_foe_entry.patch create mode 100644 target/linux/generic/backport-5.15/719-v6.0-net-ethernet-mtk_eth_soc-check-max-allowed-value-in-.patch create mode 100644 target/linux/generic/backport-5.15/720-v6.0-net-ethernet-mtk_eth_wed-add-mtk_wed_configure_irq-a.patch create mode 100644 target/linux/generic/backport-5.15/721-v6.0-net-ethernet-mtk_eth_wed-add-wed-support-for-mt7986-.patch create mode 100644 target/linux/generic/backport-5.15/722-v6.0-net-ethernet-mtk_eth_wed-add-axi-bus-support.patch create mode 100644 target/linux/generic/backport-5.15/723-v6.0-net-ethernet-mtk_eth_soc-introduce-flow-offloading-s.patch create mode 100644 target/linux/generic/backport-5.15/724-v6.0-net-ethernet-mtk_eth_soc-enable-flow-offloading-supp.patch create mode 100644 target/linux/generic/backport-5.15/724-v6.0-net-ethernet-mtk_eth_soc-fix-wrong-use-of-new-helper.patch create mode 100644 target/linux/generic/backport-5.15/725-v6.0-net-ethernet-mtk_eth_soc-fix-usage-of-foe_entry_size.patch create mode 100644 target/linux/generic/backport-5.15/726-v6.0-net-ethernet-mtk_eth_soc-fix-mask-of-RX_DMA_GET_SPOR.patch create mode 100644 target/linux/generic/backport-5.15/727-v6.1-net-ethernet-mtk_eth_soc-fix-state-in-__mtk_foe_entr.patch create mode 100644 target/linux/generic/backport-5.15/728-v6.1-01-net-ethernet-mtk_eth_soc-fix-possible-memory-leak-in.patch create mode 100644 target/linux/generic/backport-5.15/728-v6.1-02-net-ethernet-mtk_eth_wed-add-missing-put_device-in-m.patch create mode 100644 target/linux/generic/backport-5.15/728-v6.1-03-net-ethernet-mtk_eth_wed-add-missing-of_node_put.patch create mode 100644 target/linux/generic/backport-5.15/728-v6.1-04-net-ethernet-mtk_eth_soc-fix-resource-leak-in-error-.patch create mode 100644 target/linux/generic/backport-5.15/728-v6.1-05-net-ethernet-mtk_eth_soc-fix-memory-leak-in-error-pa.patch create mode 100644 target/linux/generic/backport-5.15/729-01-v6.1-net-ethernet-mtk_wed-introduce-wed-mcu-support.patch create mode 100644 target/linux/generic/backport-5.15/729-02-v6.1-net-ethernet-mtk_wed-introduce-wed-wo-support.patch create mode 100644 target/linux/generic/backport-5.15/729-03-v6.1-net-ethernet-mtk_wed-rename-tx_wdma-array-in-rx_wdma.patch create mode 100644 target/linux/generic/backport-5.15/729-04-v6.1-net-ethernet-mtk_wed-add-configure-wed-wo-support.patch create mode 100644 target/linux/generic/backport-5.15/729-05-v6.1-net-ethernet-mtk_wed-add-rx-mib-counters.patch create mode 100644 target/linux/generic/backport-5.15/729-06-v6.1-net-ethernet-mtk_eth_soc-do-not-overwrite-mtu-config.patch create mode 100644 target/linux/generic/backport-5.15/729-07-v6.1-net-ethernet-mtk_eth_soc-remove-cpu_relax-in-mtk_pen.patch create mode 100644 target/linux/generic/backport-5.15/729-08-v6.2-net-ethernet-mtk_eth_soc-fix-RSTCTRL_PPE-0-1-definit.patch create mode 100644 target/linux/generic/backport-5.15/729-09-v6.2-net-ethernet-mtk_wed-add-wcid-overwritten-support-fo.patch create mode 100644 target/linux/generic/backport-5.15/729-10-v6.2-net-ethernet-mtk_wed-return-status-value-in-mtk_wdma.patch create mode 100644 target/linux/generic/backport-5.15/729-11-v6.2-net-ethernet-mtk_wed-move-MTK_WDMA_RESET_IDX_TX-conf.patch create mode 100644 target/linux/generic/backport-5.15/729-12-v6.2-net-ethernet-mtk_wed-update-mtk_wed_stop.patch create mode 100644 target/linux/generic/backport-5.15/729-13-v6.2-net-ethernet-mtk_wed-add-mtk_wed_rx_reset-routine.patch create mode 100644 target/linux/generic/backport-5.15/729-14-v6.2-net-ethernet-mtk_wed-add-reset-to-tx_ring_setup-call.patch create mode 100644 target/linux/generic/backport-5.15/729-15-v6.2-net-ethernet-mtk_wed-fix-sleep-while-atomic-in-mtk_w.patch create mode 100644 target/linux/generic/backport-5.15/729-16-v6.3-net-ethernet-mtk_wed-get-rid-of-queue-lock-for-rx-qu.patch create mode 100644 target/linux/generic/backport-5.15/729-17-v6.3-net-ethernet-mtk_wed-get-rid-of-queue-lock-for-tx-qu.patch create mode 100644 target/linux/generic/backport-5.15/729-18-v6.3-net-ethernet-mtk_eth_soc-introduce-mtk_hw_reset-util.patch create mode 100644 target/linux/generic/backport-5.15/729-19-v6.3-net-ethernet-mtk_eth_soc-introduce-mtk_hw_warm_reset.patch create mode 100644 target/linux/generic/backport-5.15/729-20-v6.3-net-ethernet-mtk_eth_soc-align-reset-procedure-to-ve.patch create mode 100644 target/linux/generic/backport-5.15/729-21-v6.3-net-ethernet-mtk_eth_soc-add-dma-checks-to-mtk_hw_re.patch create mode 100644 target/linux/generic/backport-5.15/729-22-v6.3-net-ethernet-mtk_wed-add-reset-reset_complete-callba.patch create mode 100644 target/linux/generic/backport-5.15/729-23-v6.3-net-ethernet-mtk_wed-add-reset-to-rx_ring_setup-call.patch create mode 100644 target/linux/generic/backport-5.15/730-01-v6.3-net-ethernet-mtk_eth_soc-account-for-vlan-in-rx-head.patch create mode 100644 target/linux/generic/backport-5.15/730-02-v6.3-net-ethernet-mtk_eth_soc-increase-tx-ring-side-for-Q.patch create mode 100644 target/linux/generic/backport-5.15/730-03-v6.3-net-ethernet-mtk_eth_soc-avoid-port_mg-assignment-on.patch create mode 100644 target/linux/generic/backport-5.15/730-04-v6.3-net-ethernet-mtk_eth_soc-implement-multi-queue-suppo.patch create mode 100644 target/linux/generic/backport-5.15/730-05-v6.3-net-dsa-tag_mtk-assign-per-port-queues.patch create mode 100644 target/linux/generic/backport-5.15/730-06-v6.3-net-ethernet-mediatek-ppe-assign-per-port-queues-for.patch create mode 100644 target/linux/generic/backport-5.15/730-08-v6.3-net-dsa-add-support-for-DSA-rx-offloading-via-metada.patch create mode 100644 target/linux/generic/backport-5.15/730-09-v6.3-net-ethernet-mtk_eth_soc-fix-VLAN-rx-hardware-accele.patch create mode 100644 target/linux/generic/backport-5.15/730-10-v6.3-net-ethernet-mtk_eth_soc-drop-packets-to-WDMA-if-the.patch create mode 100644 target/linux/generic/backport-5.15/730-12-v6.3-net-ethernet-mtk_eth_soc-disable-hardware-DSA-untagg.patch create mode 100644 target/linux/generic/backport-5.15/730-13-v6.3-net-ethernet-mtk_eth_soc-enable-special-tag-when-any.patch create mode 100644 target/linux/generic/backport-5.15/730-14-v6.3-net-ethernet-mtk_eth_soc-fix-DSA-TX-tag-hwaccel-for-.patch create mode 100644 target/linux/generic/backport-5.15/730-15-v6.3-net-ethernet-mtk_wed-No-need-to-clear-memory-after-a.patch create mode 100644 target/linux/generic/backport-5.15/730-16-v6.3-net-ethernet-mtk_wed-fix-some-possible-NULL-pointer-.patch create mode 100644 target/linux/generic/backport-5.15/730-17-v6.3-net-ethernet-mtk_wed-fix-possible-deadlock-if-mtk_we.patch create mode 100644 target/linux/generic/backport-5.15/730-18-v6.3-net-ethernet-mtk_eth_soc-fix-tx-throughput-regressio.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-01-net-ethernet-mtk_eth_soc-Avoid-truncating-allocation.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-02-net-mtk_eth_soc-add-definitions-for-PCS.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-03-net-mtk_eth_soc-eliminate-unnecessary-error-handling.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-04-net-mtk_eth_soc-add-pcs_get_state-implementation.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-05-net-mtk_eth_soc-convert-mtk_sgmii-to-use-regmap_upda.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-06-net-mtk_eth_soc-add-out-of-band-forcing-of-speed-and.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-07-net-mtk_eth_soc-move-PHY-power-up.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-08-net-mtk_eth_soc-move-interface-speed-selection.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-09-net-mtk_eth_soc-add-advertisement-programming.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-10-net-mtk_eth_soc-move-and-correct-link-timer-programm.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-11-net-mtk_eth_soc-add-support-for-in-band-802.3z-negot.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-12-net-mediatek-sgmii-ensure-the-SGMII-PHY-is-powered-d.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-13-net-mediatek-sgmii-fix-duplex-configuration.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.2-14-mtk_sgmii-enable-PCS-polling-to-allow-SFP-work.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.3-15-net-ethernet-mtk_eth_soc-reset-PCS-state.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.3-16-net-ethernet-mtk_eth_soc-only-write-values-if-needed.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.3-18-net-ethernet-mtk_eth_soc-add-support-for-MT7981.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.3-19-net-ethernet-mtk_eth_soc-set-MDIO-bus-clock-frequenc.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.3-20-net-ethernet-mtk_eth_soc-switch-to-external-PCS-driv.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.3-21-net-ethernet-mtk_eth_soc-add-missing-ppe-cache-flush.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.4-22-net-mtk_eth_soc-use-WO-firmware-for-MT7981.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.4-23-net-ethernet-mtk_eth_soc-fix-NULL-pointer-dereferenc.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.4-24-net-ethernet-mtk_eth_soc-ppe-add-support-for-flow-ac.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.4-25-net-ethernet-mediatek-fix-ppe-flow-accounting-for-v1.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.4-26-net-ethernet-mtk_eth_soc-drop-generic-vlan-rx-offloa.patch create mode 100644 target/linux/generic/backport-5.15/733-v6.5-27-net-ethernet-mtk_eth_soc-always-mtk_get_ib1_pkt_type.patch rename target/linux/generic/{backport-5.10 => backport-5.15}/734-v5.16-0001-net-bgmac-improve-handling-PHY.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/734-v5.16-0002-net-bgmac-support-MDIO-described-in-DT.patch (100%) create mode 100644 target/linux/generic/backport-5.15/742-v5.16-net-phy-at803x-add-support-for-qca-8327-internal-phy.patch create mode 100644 target/linux/generic/backport-5.15/743-v5.16-0001-net-dsa-b53-Include-all-ports-in-enabled_ports.patch create mode 100644 target/linux/generic/backport-5.15/743-v5.16-0002-net-dsa-b53-Drop-BCM5301x-workaround-for-a-wrong-CPU.patch create mode 100644 target/linux/generic/backport-5.15/743-v5.16-0003-net-dsa-b53-Improve-flow-control-setup-on-BCM5301x.patch create mode 100644 target/linux/generic/backport-5.15/743-v5.16-0004-net-dsa-b53-Drop-unused-cpu_port-field.patch create mode 100644 target/linux/generic/backport-5.15/745-v5.16-01-net-phy-at803x-add-support-for-qca-8327-A-variant.patch create mode 100644 target/linux/generic/backport-5.15/745-v5.16-02-net-phy-at803x-add-resume-suspend-function-to-qca83x.patch create mode 100644 target/linux/generic/backport-5.15/745-v5.16-03-net-phy-at803x-fix-spacing-and-improve-name-for-83xx.patch create mode 100644 target/linux/generic/backport-5.15/746-v5.16-01-net-phy-at803x-fix-resume-for-QCA8327-phy.patch create mode 100644 target/linux/generic/backport-5.15/746-v5.16-02-net-phy-at803x-add-DAC-amplitude-fix-for-8327-phy.patch create mode 100644 target/linux/generic/backport-5.15/746-v5.16-03-net-phy-at803x-enable-prefer-master-for-83xx-interna.patch create mode 100644 target/linux/generic/backport-5.15/746-v5.16-04-net-phy-at803x-better-describe-debug-regs.patch rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-01-dsa-qca8k-add-mac-power-sel-support.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-02-dt-bindings-net-dsa-qca8k-Add-SGMII-clock-phase-prop.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-03-net-dsa-qca8k-add-support-for-sgmii-falling-edge.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-04-dt-bindings-net-dsa-qca8k-Document-support-for-CPU-p.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-05-net-dsa-qca8k-add-support-for-cpu-port-6.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-06-net-dsa-qca8k-rework-rgmii-delay-logic-and-scan-for-.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-07-dt-bindings-net-dsa-qca8k-Document-qca-sgmii-enable-.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-08-net-dsa-qca8k-add-explicit-SGMII-PLL-enable.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-09-dt-bindings-net-dsa-qca8k-Document-qca-led-open-drai.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-10-net-dsa-qca8k-add-support-for-pws-config-reg.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-11-dt-bindings-net-dsa-qca8k-document-support-for-qca83.patch (100%) create mode 100644 target/linux/generic/backport-5.15/747-v5.16-12-net-dsa-qca8k-add-support-for-QCA8328.patch rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-13-net-dsa-qca8k-set-internal-delay-also-for-sgmii.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-14-net-dsa-qca8k-move-port-config-to-dedicated-struct.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-15-dt-bindings-net-ipq8064-mdio-fix-warning-with-new-qc.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/747-v5.16-16-dt-bindings-net-dsa-qca8k-convert-to-YAML-schema.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/748-v5.16-net-dsa-qca8k-fix-delay-applied-to-wrong-cpu-in-parse-p.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/749-v5.16-net-dsa-qca8k-tidy-for-loop-in-setup-and-add-cpu-port-c.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/750-v5.16-net-dsa-qca8k-make-sure-pad0-mac06-exchange-is-disabled.patch (100%) create mode 100644 target/linux/generic/backport-5.15/750-v6.5-01-net-ethernet-mtk_ppe-add-MTK_FOE_ENTRY_V-1-2-_SIZE-m.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-02-net-ethernet-mtk_eth_soc-remove-incorrect-PLL-config.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-03-net-ethernet-mtk_eth_soc-remove-mac_pcs_get_state-an.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-05-net-ethernet-mtk_eth_soc-add-version-in-mtk_soc_data.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-06-net-ethernet-mtk_eth_soc-increase-MAX_DEVS-to-3.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-07-net-ethernet-mtk_eth_soc-rely-on-MTK_MAX_DEVS-and-re.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-08-net-ethernet-mtk_eth_soc-add-NETSYS_V3-version-suppo.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-09-net-ethernet-mtk_eth_soc-convert-caps-in-mtk_soc_dat.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-10-net-ethernet-mtk_eth_soc-convert-clock-bitmap-to-u64.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-11-net-ethernet-mtk_eth_soc-add-basic-support-for-MT798.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-12-net-ethernet-mtk_eth_soc-enable-page_pool-support-fo.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-13-net-ethernet-mtk_eth_soc-enable-nft-hw-flowtable_off.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-14-net-ethernet-mtk_eth_soc-support-per-flow-accounting.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-15-net-ethernet-mtk_eth_soc-fix-NULL-pointer-on-hw-rese.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-16-net-ethernet-mtk_eth_soc-fix-register-definitions-fo.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-17-net-ethernet-mtk_eth_soc-add-reset-bits-for-MT7988.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-18-net-ethernet-mtk_eth_soc-add-support-for-in-SoC-SRAM.patch create mode 100644 target/linux/generic/backport-5.15/750-v6.5-19-net-ethernet-mtk_eth_soc-support-36-bit-DMA-addressi.patch rename target/linux/generic/{backport-5.10 => backport-5.15}/751-v5.16-net-dsa-qca8k-fix-internal-delay-applied-to-the-wrong-PAD.patch (100%) rename target/linux/generic/{backport-5.10 => backport-5.15}/752-v5.16-net-dsa-qca8k-fix-MTU-calculation.patch (100%) rename target/linux/generic/{backport-5.10/753-net-next-net-dsa-qca8k-remove-redundant-check-in-parse_port_config.patch => backport-5.15/753-v5.17-net-next-net-dsa-qca8k-remove-redundant-check-in-parse_port_config.patch} (100%) create mode 100644 target/linux/generic/backport-5.15/754-v5.17-net-next-net-dsa-qca8k-convert-to-GENMASK_FIELD_PREP_FIELD_GET.patch rename target/linux/generic/{backport-5.10/755-net-next-net-dsa-qca8k-remove-extra-mutex_init-in-qca8k_setup.patch => backport-5.15/755-v5.17-net-next-net-dsa-qca8k-remove-extra-mutex_init-in-qca8k_setup.patch} (100%) create mode 100644 target/linux/generic/backport-5.15/756-v5.17-net-next-net-dsa-qca8k-move-regmap-init-in-probe-and-set-it.patch rename target/linux/generic/{backport-5.10/757-net-next-net-dsa-qca8k-initial-conversion-to-regmap-heper.patch => backport-5.15/757-v5.17-net-next-net-dsa-qca8k-initial-conversion-to-regmap-heper.patch} (100%) create mode 100644 target/linux/generic/backport-5.15/758-v5.17-net-next-net-dsa-qca8k-add-additional-MIB-counter-and-.patch create mode 100644 target/linux/generic/backport-5.15/759-v5.17-net-next-net-dsa-qca8k-add-support-for-port-fast-aging.patch create mode 100644 target/linux/generic/backport-5.15/760-v5.17-net-next-net-dsa-qca8k-add-set_ageing_time-support.patch create mode 100644 target/linux/generic/backport-5.15/761-v5.17-net-next-net-dsa-qca8k-add-support-for-mdb_add-del.patch create mode 100644 target/linux/generic/backport-5.15/762-v5.17-net-next-net-dsa-qca8k-add-support-for-mirror-mode.patch create mode 100644 target/linux/generic/backport-5.15/763-v5.17-net-next-net-dsa-qca8k-add-LAG-support.patch create mode 100644 target/linux/generic/backport-5.15/764-v5.17-net-next-net-dsa-qca8k-fix-warning-in-LAG-feature.patch create mode 100644 target/linux/generic/backport-5.15/765-v5.17-01-net-next-net-dsa-reorder-PHY-initialization-with-MTU-setup-in.patch create mode 100644 target/linux/generic/backport-5.15/765-v5.17-02-net-next-net-dsa-merge-rtnl_lock-sections-in-dsa_slave_create.patch create mode 100644 target/linux/generic/backport-5.15/765-v5.17-03-net-next-net-dsa-stop-updating-master-MTU-from-master.c.patch create mode 100644 target/linux/generic/backport-5.15/765-v5.17-04-net-next-net-dsa-hold-rtnl_mutex-when-calling-dsa_master_-set.patch create mode 100644 target/linux/generic/backport-5.15/765-v5.17-05-net-next-net-dsa-first-set-up-shared-ports-then-non-shared-po.patch create mode 100644 target/linux/generic/backport-5.15/765-v5.17-06-net-next-net-dsa-setup-master-before-ports.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-01-net-dsa-provide-switch-operations-for-tracking-the-m.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-02-net-dsa-replay-master-state-events-in-dsa_tree_-setu.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-03-net-dsa-tag_qca-convert-to-FIELD-macro.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-04-net-dsa-tag_qca-move-define-to-include-linux-dsa.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-05-net-dsa-tag_qca-enable-promisc_on_master-flag.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-06-net-dsa-tag_qca-add-define-for-handling-mgmt-Etherne.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-07-net-dsa-tag_qca-add-define-for-handling-MIB-packet.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-08-net-dsa-tag_qca-add-support-for-handling-mgmt-and-MI.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-09-net-dsa-qca8k-add-tracking-state-of-master-port.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-10-net-dsa-qca8k-add-support-for-mgmt-read-write-in-Eth.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-11-net-dsa-qca8k-add-support-for-mib-autocast-in-Ethern.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-12-net-dsa-qca8k-add-support-for-phy-read-write-with-mg.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-13-net-dsa-qca8k-move-page-cache-to-driver-priv.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-14-net-dsa-qca8k-cache-lo-and-hi-for-mdio-write.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-15-net-dsa-qca8k-add-support-for-larger-read-write-size.patch create mode 100644 target/linux/generic/backport-5.15/766-v5.18-16-net-dsa-qca8k-introduce-qca8k_bulk_read-write-functi.patch create mode 100644 target/linux/generic/backport-5.15/767-v5.18-net-dsa-qca8k-check-correct-variable-in-qca8k_phy_et.patch create mode 100644 target/linux/generic/backport-5.15/768-v5.18-net-dsa-qca8k-fix-noderef.cocci-warnings.patch create mode 100644 target/linux/generic/backport-5.15/769-v5.19-01-net-dsa-qca8k-drop-MTU-tracking-from-qca8k_priv.patch create mode 100644 target/linux/generic/backport-5.15/769-v5.19-02-net-dsa-qca8k-drop-port_sts-from-qca8k_priv.patch create mode 100644 target/linux/generic/backport-5.15/769-v5.19-03-net-dsa-qca8k-rework-and-simplify-mdiobus-logic.patch create mode 100644 target/linux/generic/backport-5.15/769-v5.19-04-net-dsa-qca8k-drop-dsa_switch_ops-from-qca8k_priv.patch create mode 100644 target/linux/generic/backport-5.15/769-v5.19-05-net-dsa-qca8k-correctly-handle-mdio-read-error.patch create mode 100644 target/linux/generic/backport-5.15/769-v5.19-06-net-dsa-qca8k-unify-bus-id-naming-with-legacy-and-OF.patch create mode 100644 target/linux/generic/backport-5.15/770-v6.0-net-dsa-qca8k-move-driver-to-qca-dir.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-01-net-dsa-qca8k-cache-match-data-to-speed-up-access.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-02-net-dsa-qca8k-make-mib-autocast-feature-optional.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-03-net-dsa-qca8k-move-mib-struct-to-common-code.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-04-net-dsa-qca8k-move-qca8k-read-write-rmw-and-reg-tabl.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-05-net-dsa-qca8k-move-qca8k-bulk-read-write-helper-to-c.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-06-net-dsa-qca8k-move-mib-init-function-to-common-code.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-07-net-dsa-qca8k-move-port-set-status-eee-ethtool-stats.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-08-net-dsa-qca8k-move-bridge-functions-to-common-code.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-09-net-dsa-qca8k-move-set-age-MTU-port-enable-disable-f.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-10-net-dsa-qca8k-move-port-FDB-MDB-function-to-common-c.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-11-net-dsa-qca8k-move-port-mirror-functions-to-common-c.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-12-net-dsa-qca8k-move-port-VLAN-functions-to-common-cod.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-13-net-dsa-qca8k-move-port-LAG-functions-to-common-code.patch create mode 100644 target/linux/generic/backport-5.15/771-v6.0-14-net-dsa-qca8k-move-read_switch_id-function-to-common.patch create mode 100644 target/linux/generic/backport-5.15/772-v6.0-net-dsa-qca8k-fix-NULL-pointer-dereference-for-of_de.patch create mode 100644 target/linux/generic/backport-5.15/773-v5.18-1-net-dsa-Move-VLAN-filtering-syncing-out-of-dsa_switc.patch create mode 100644 target/linux/generic/backport-5.15/773-v5.18-2-net-dsa-Avoid-cross-chip-syncing-of-VLAN-filtering.patch create mode 100644 target/linux/generic/backport-5.15/774-v5.16-01-net-dsa-rtl8366rb-Support-bridge-offloading.patch create mode 100644 target/linux/generic/backport-5.15/774-v5.16-02-net-dsa-rtl8366-Drop-custom-VLAN-set-up.patch create mode 100644 target/linux/generic/backport-5.15/774-v5.16-03-net-dsa-rtl8366rb-Rewrite-weird-VLAN-filering-enable.patch create mode 100644 target/linux/generic/backport-5.15/774-v5.16-06-net-dsa-rtl8366-Drop-and-depromote-pointless-prints.patch create mode 100644 target/linux/generic/backport-5.15/774-v5.16-07-net-dsa-rtl8366rb-Use-core-filtering-tracking.patch create mode 100644 target/linux/generic/backport-5.15/774-v5.16-08-net-dsa-rtl8366rb-Support-disabling-learning.patch create mode 100644 target/linux/generic/backport-5.15/774-v5.16-09-net-dsa-rtl8366rb-Support-fast-aging.patch create mode 100644 target/linux/generic/backport-5.15/774-v5.16-10-net-dsa-rtl8366rb-Support-setting-STP-state.patch create mode 100644 target/linux/generic/backport-5.15/775-v6.0-01-net-ethernet-stmicro-stmmac-move-queue-reset-to-dedi.patch create mode 100644 target/linux/generic/backport-5.15/775-v6.0-02-net-ethernet-stmicro-stmmac-first-disable-all-queues.patch create mode 100644 target/linux/generic/backport-5.15/775-v6.0-03-net-ethernet-stmicro-stmmac-move-dma-conf-to-dedicat.patch create mode 100644 target/linux/generic/backport-5.15/775-v6.0-04-net-ethernet-stmicro-stmmac-generate-stmmac-dma-conf.patch create mode 100644 target/linux/generic/backport-5.15/775-v6.0-05-net-ethernet-stmicro-stmmac-permit-MTU-change-with-i.patch create mode 100644 target/linux/generic/backport-5.15/776-v6.1-01-net-dsa-qca8k-fix-inband-mgmt-for-big-endian-systems.patch create mode 100644 target/linux/generic/backport-5.15/776-v6.1-02-net-dsa-qca8k-fix-ethtool-autocast-mib-for-big-endia.patch create mode 100644 target/linux/generic/backport-5.15/777-v6.2-01-net-dsa-qca8k-fix-wrong-length-value-for-mgmt-eth-pa.patch create mode 100644 target/linux/generic/backport-5.15/777-v6.2-02-net-dsa-tag_qca-fix-wrong-MGMT_DATA2-size.patch create mode 100644 target/linux/generic/backport-5.15/777-v6.2-03-Revert-net-dsa-qca8k-cache-lo-and-hi-for-mdio-write.patch create mode 100644 target/linux/generic/backport-5.15/777-v6.2-04-net-dsa-qca8k-introduce-single-mii-read-write-lo-hi.patch create mode 100644 target/linux/generic/backport-5.15/777-v6.2-05-net-dsa-qca8k-improve-mdio-master-read-write-by-usin.patch create mode 100644 target/linux/generic/backport-5.15/778-v5.18-01-net-phy-at803x-add-fiber-support.patch create mode 100644 target/linux/generic/backport-5.15/778-v5.18-02-net-phy-at803x-support-downstream-SFP-cage.patch create mode 100644 target/linux/generic/backport-5.15/778-v5.18-03-net-phy-at803x-fix-NULL-pointer-dereference-on-AR9331-PHY.patch create mode 100644 target/linux/generic/backport-5.15/778-v5.18-04-net-phy-at803x-fix-error-return-code-in-at803x_probe.patch create mode 100644 target/linux/generic/backport-5.15/780-v5.16-bus-mhi-pci_generic-Introduce-Sierra-EM919X-support.patch create mode 100644 target/linux/generic/backport-5.15/781-v6.1-bus-mhi-host-always-print-detected-modem-name.patch create mode 100644 target/linux/generic/backport-5.15/782-v6.1-net-dsa-mt7530-add-support-for-in-band-link-status.patch create mode 100644 target/linux/generic/backport-5.15/783-v6.1-net-sfp-re-implement-soft-state-polling-setup.patch create mode 100644 target/linux/generic/backport-5.15/784-v6.1-net-sfp-move-quirk-handling-into-sfp.c.patch create mode 100644 target/linux/generic/backport-5.15/785-v6.1-net-sfp-move-Alcatel-Lucent-3FE46541AA-fixup.patch create mode 100644 target/linux/generic/backport-5.15/786-v6.1-net-sfp-move-Huawei-MA5671A-fixup.patch create mode 100644 target/linux/generic/backport-5.15/787-v6.1-net-sfp-add-support-for-HALNy-GPON-SFP.patch create mode 100644 target/linux/generic/backport-5.15/788-v6.3-net-dsa-mt7530-use-external-PCS-driver.patch create mode 100644 target/linux/generic/backport-5.15/789-v6.3-net-sfp-add-quirk-enabling-2500Base-x-for-HG-MXPD-48.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.0-net-mii-add-mii_bmcr_encode_fixed.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0001-net-dsa-mt7530-make-some-noise-if-register-read-fail.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0002-net-dsa-mt7530-refactor-SGMII-PCS-creation.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0003-net-dsa-mt7530-use-unlocked-regmap-accessors.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0004-net-dsa-mt7530-use-regmap-to-access-switch-register-.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0005-net-dsa-mt7530-move-SGMII-PCS-creation-to-mt7530_pro.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0006-net-dsa-mt7530-introduce-mutex-helpers.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0007-net-dsa-mt7530-move-p5_intf_modes-function-to-mt7530.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0008-net-dsa-mt7530-introduce-mt7530_probe_common-helper-.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0009-net-dsa-mt7530-introduce-mt7530_remove_common-helper.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0011-net-dsa-mt7530-introduce-separate-MDIO-driver.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0012-net-dsa-mt7530-skip-locking-if-MDIO-bus-isn-t-presen.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0013-net-dsa-mt7530-introduce-driver-for-MT7988-built-in-.patch create mode 100644 target/linux/generic/backport-5.15/790-v6.4-0014-net-dsa-mt7530-fix-support-for-MT7531BE.patch create mode 100644 target/linux/generic/backport-5.15/791-v6.2-01-net-phy-Add-driver-for-Motorcomm-yt8521-gigabit-ethernet.patch create mode 100644 target/linux/generic/backport-5.15/791-v6.2-02-net-phy-fix-yt8521-duplicated-argument-to-or.patch create mode 100644 target/linux/generic/backport-5.15/791-v6.2-03-net-phy-add-Motorcomm-YT8531S-phy-id.patch create mode 100644 target/linux/generic/backport-5.15/791-v6.3-04-net-phy-fix-the-spelling-problem-of-Sentinel.patch create mode 100644 target/linux/generic/backport-5.15/791-v6.3-05-net-phy-motorcomm-change-the-phy-id-of-yt8521-and-yt8531s.patch create mode 100644 target/linux/generic/backport-5.15/791-v6.3-06-net-phy-Add-BIT-macro-for-Motorcomm-yt8521-yt8531-gigabit.patch create mode 100644 target/linux/generic/backport-5.15/791-v6.3-07-net-phy-Add-dts-support-for-Motorcomm-yt8521-gigabit.patch create mode 100644 target/linux/generic/backport-5.15/791-v6.3-08-net-phy-Add-dts-support-for-Motorcomm-yt8531s-gigabit.patch create mode 100644 target/linux/generic/backport-5.15/791-v6.3-09-net-phy-Add-driver-for-Motorcomm-yt8531-gigabit-ethernet.patch create mode 100644 target/linux/generic/backport-5.15/791-v6.3-10-net-phy-motorcomm-uninitialized-variables-in.patch create mode 100644 target/linux/generic/backport-5.15/792-01-v6.0-net-phylink-disable-PCS-polling-over-major-configura.patch create mode 100644 target/linux/generic/backport-5.15/792-02-v6.0-net-phylink-fix-NULL-pl-pcs-dereference-during-phyli.patch create mode 100644 target/linux/generic/backport-5.15/792-03-v6.6-net-phylink-add-pcs_enable-pcs_disable-methods.patch create mode 100644 target/linux/generic/backport-5.15/792-v5.16-net-dpaa2-mac-add-support-for-more-10G-modes.patch create mode 100644 target/linux/generic/backport-5.15/793-v6.6-net-pcs-lynxi-implement-pcs_disable-op.patch create mode 100644 target/linux/generic/backport-5.15/794-v6.2-net-core-Allow-live-renaming-when-an-interface-is-up.patch create mode 100644 target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch create mode 100644 target/linux/generic/backport-5.15/798-net-next-net-sfp-add-quirk-for-Fiberstone-GPON-ONU-34-20BI.patch rename target/linux/generic/{backport-5.10/845-v6.0-0001-dt-bindings-leds-add-Broadcom-s-BCM63138-controller.patch => backport-5.15/800-v6.0-0001-dt-bindings-leds-add-Broadcom-s-BCM63138-controller.patch} (100%) create mode 100644 target/linux/generic/backport-5.15/800-v6.0-0002-leds-bcm63138-add-support-for-BCM63138-controller.patch rename target/linux/generic/{backport-5.10/846-v6.0-0001-dt-bindings-leds-leds-bcm63138-unify-full-stops-in-d.patch => backport-5.15/801-v6.0-0001-dt-bindings-leds-leds-bcm63138-unify-full-stops-in-d.patch} (100%) create mode 100644 target/linux/generic/backport-5.15/801-v6.0-0002-leds-add-help-info-about-BCM63138-module-name.patch rename target/linux/generic/{backport-5.10/846-v6.0-0003-leds-leds-bcm63138-get-rid-of-LED_OFF.patch => backport-5.15/801-v6.0-0003-leds-leds-bcm63138-get-rid-of-LED_OFF.patch} (100%) create mode 100644 target/linux/generic/backport-5.15/802-v5.16-0001-nvmem-core-rework-nvmem-cell-instance-creation.patch create mode 100644 target/linux/generic/backport-5.15/802-v5.16-0002-nvmem-core-add-nvmem-cell-post-processing-callback.patch create mode 100644 target/linux/generic/backport-5.15/802-v5.16-0003-nvmem-imx-ocotp-add-support-for-post-processing.patch create mode 100644 target/linux/generic/backport-5.15/803-v5.17-0002-nvmem-mtk-efuse-support-minimum-one-byte-access-stri.patch create mode 100644 target/linux/generic/backport-5.15/804-v5.18-0001-nvmem-core-Remove-unused-devm_nvmem_unregister.patch create mode 100644 target/linux/generic/backport-5.15/804-v5.18-0002-nvmem-core-Use-devm_add_action_or_reset.patch create mode 100644 target/linux/generic/backport-5.15/804-v5.18-0003-nvmem-core-Check-input-parameter-for-NULL-in-nvmem_u.patch create mode 100644 target/linux/generic/backport-5.15/804-v5.18-0004-nvmem-qfprom-fix-kerneldoc-warning.patch create mode 100644 target/linux/generic/backport-5.15/804-v5.18-0005-nvmem-sunxi_sid-Add-support-for-D1-variant.patch create mode 100644 target/linux/generic/backport-5.15/804-v5.18-0006-nvmem-meson-mx-efuse-replace-unnecessary-devm_kstrdu.patch create mode 100644 target/linux/generic/backport-5.15/804-v5.18-0007-nvmem-add-driver-for-Layerscape-SFP-Security-Fuse-Pr.patch create mode 100644 target/linux/generic/backport-5.15/804-v5.18-0008-nvmem-qfprom-Increase-fuse-blow-timeout-to-prevent-w.patch create mode 100644 target/linux/generic/backport-5.15/804-v5.18-0009-nvmem-Add-driver-for-OCOTP-in-Sunplus-SP7021.patch create mode 100644 target/linux/generic/backport-5.15/804-v5.18-0010-nvmem-brcm_nvram-parse-NVRAM-content-into-NVMEM-cell.patch create mode 100644 target/linux/generic/backport-5.15/805-v5.19-0001-nvmem-bcm-ocotp-mark-ACPI-device-ID-table-as-maybe-u.patch create mode 100644 target/linux/generic/backport-5.15/805-v5.19-0002-nvmem-sunplus-ocotp-staticize-sp_otp_v0.patch create mode 100644 target/linux/generic/backport-5.15/805-v5.19-0003-nvmem-sunplus-ocotp-drop-useless-probe-confirmation.patch create mode 100644 target/linux/generic/backport-5.15/805-v5.19-0004-nvmem-core-support-passing-DT-node-in-cell-info.patch create mode 100644 target/linux/generic/backport-5.15/805-v5.19-0005-nvmem-brcm_nvram-find-Device-Tree-nodes-for-NVMEM-ce.patch create mode 100644 target/linux/generic/backport-5.15/805-v5.19-0006-nvmem-Add-Apple-eFuse-driver.patch create mode 100644 target/linux/generic/backport-5.15/805-v5.19-0007-nvmem-qfprom-using-pm_runtime_resume_and_get-instead.patch create mode 100644 target/linux/generic/backport-5.15/805-v5.19-0008-nvmem-sfp-Use-regmap.patch create mode 100644 target/linux/generic/backport-5.15/805-v5.19-0009-nvmem-sfp-Add-support-for-TA-2.1-devices.patch create mode 100644 target/linux/generic/backport-5.15/806-v6.0-0001-nvmem-microchip-otpc-add-support.patch create mode 100644 target/linux/generic/backport-5.15/806-v6.0-0002-nvmem-mtk-efuse-Simplify-with-devm_platform_get_and_.patch create mode 100644 target/linux/generic/backport-5.15/807-v6.1-0002-nvmem-add-driver-handling-U-Boot-environment-variabl.patch create mode 100644 target/linux/generic/backport-5.15/807-v6.1-0004-nvmem-brcm_nvram-Use-kzalloc-for-allocating-only-one.patch create mode 100644 target/linux/generic/backport-5.15/807-v6.1-0005-nvmem-prefix-all-symbols-with-NVMEM_.patch create mode 100644 target/linux/generic/backport-5.15/807-v6.1-0006-nvmem-sort-config-symbols-alphabetically.patch create mode 100644 target/linux/generic/backport-5.15/807-v6.1-0007-nvmem-u-boot-env-find-Device-Tree-nodes-for-NVMEM-ce.patch create mode 100644 target/linux/generic/backport-5.15/807-v6.1-0008-nvmem-lan9662-otp-add-support.patch create mode 100644 target/linux/generic/backport-5.15/807-v6.1-0009-nvmem-u-boot-env-fix-crc32-casting-type.patch create mode 100644 target/linux/generic/backport-5.15/807-v6.1-0010-nvmem-lan9662-otp-Fix-compatible-string.patch create mode 100644 target/linux/generic/backport-5.15/807-v6.1-0011-nvmem-u-boot-env-fix-crc32_data_offset-on-redundant-.patch create mode 100644 target/linux/generic/backport-5.15/807-v6.1-0013-nvmem-lan9662-otp-Change-return-type-of-lan9662_otp_.patch create mode 100644 target/linux/generic/backport-5.15/808-v6.2-0001-nvmem-stm32-move-STM32MP15_BSEC_NUM_LOWER-in-config.patch create mode 100644 target/linux/generic/backport-5.15/808-v6.2-0002-nvmem-stm32-add-warning-when-upper-OTPs-are-updated.patch create mode 100644 target/linux/generic/backport-5.15/808-v6.2-0003-nvmem-stm32-add-nvmem-type-attribute.patch create mode 100644 target/linux/generic/backport-5.15/808-v6.2-0004-nvmem-stm32-fix-spelling-typo-in-comment.patch create mode 100644 target/linux/generic/backport-5.15/808-v6.2-0005-nvmem-Kconfig-Fix-spelling-mistake-controlls-control.patch create mode 100644 target/linux/generic/backport-5.15/808-v6.2-0006-nvmem-u-boot-env-add-Broadcom-format-support.patch create mode 100644 target/linux/generic/backport-5.15/808-v6.2-0007-nvmem-brcm_nvram-Add-check-for-kzalloc.patch create mode 100644 target/linux/generic/backport-5.15/808-v6.2-0008-nvmem-sunxi_sid-Always-use-32-bit-MMIO-reads.patch create mode 100644 target/linux/generic/backport-5.15/808-v6.2-0013-nvmem-core-fix-device-node-refcounting.patch create mode 100644 target/linux/generic/backport-5.15/809-v6.3-0001-nvmem-core-remove-spurious-white-space.patch create mode 100644 target/linux/generic/backport-5.15/809-v6.3-0002-nvmem-core-add-an-index-parameter-to-the-cell.patch create mode 100644 target/linux/generic/backport-5.15/809-v6.3-0003-nvmem-core-move-struct-nvmem_cell_info-to-nvmem-prov.patch create mode 100644 target/linux/generic/backport-5.15/809-v6.3-0004-nvmem-core-drop-the-removal-of-the-cells-in-nvmem_ad.patch create mode 100644 target/linux/generic/backport-5.15/809-v6.3-0005-nvmem-core-add-nvmem_add_one_cell.patch create mode 100644 target/linux/generic/backport-5.15/809-v6.3-0006-nvmem-core-use-nvmem_add_one_cell-in-nvmem_add_cells.patch create mode 100644 target/linux/generic/backport-5.15/809-v6.3-0007-nvmem-stm32-add-OP-TEE-support-for-STM32MP13x.patch create mode 100644 target/linux/generic/backport-5.15/809-v6.3-0008-nvmem-stm32-detect-bsec-pta-presence-for-STM32MP15x.patch create mode 100644 target/linux/generic/backport-5.15/809-v6.3-0009-nvmem-rave-sp-eeprm-fix-kernel-doc-bad-line-warning.patch create mode 100644 target/linux/generic/backport-5.15/809-v6.3-0010-nvmem-qcom-spmi-sdam-register-at-device-init-time.patch create mode 100644 target/linux/generic/backport-5.15/809-v6.3-0011-nvmem-stm32-fix-OPTEE-dependency.patch create mode 100644 target/linux/generic/backport-5.15/810-v5.17-net-qmi_wwan-add-ZTE-MF286D-modem-19d2-1485.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0001-nvmem-xilinx-zynqmp-make-modular.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0002-nvmem-core-introduce-NVMEM-layouts.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0003-nvmem-core-handle-the-absence-of-expected-layouts.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0004-nvmem-core-request-layout-modules-loading.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0005-nvmem-core-add-per-cell-post-processing.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0006-nvmem-core-allow-to-modify-a-cell-before-adding-it.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0007-nvmem-imx-ocotp-replace-global-post-processing-with-.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0008-nvmem-cell-drop-global-cell_post_process.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0009-nvmem-core-provide-own-priv-pointer-in-post-process-.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0010-nvmem-layouts-sl28vpd-Add-new-layout-driver.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0011-nvmem-layouts-onie-tlv-Add-new-layout-driver.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0012-nvmem-stm32-romem-mark-OF-related-data-as-maybe-unus.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0013-nvmem-mtk-efuse-Support-postprocessing-for-GPU-speed.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0014-nvmem-bcm-ocotp-Use-devm_platform_ioremap_resource.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0015-nvmem-nintendo-otp-Use-devm_platform_ioremap_resourc.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0016-nvmem-vf610-ocotp-Use-devm_platform_get_and_ioremap_.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0017-nvmem-core-support-specifying-both-cell-raw-data-pos.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0018-nvmem-u-boot-env-post-process-ethaddr-env-variable.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0019-nvmem-Add-macro-to-register-nvmem-layout-drivers.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0020-nvmem-layouts-sl28vpd-Use-module_nvmem_layout_driver.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0021-nvmem-layouts-onie-tlv-Use-module_nvmem_layout_drive.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0022-nvmem-layouts-onie-tlv-Drop-wrong-module-alias.patch create mode 100644 target/linux/generic/backport-5.15/811-v6.4-0023-nvmem-layouts-sl28vpd-set-varaiable-sl28vpd_layout-s.patch create mode 100644 target/linux/generic/backport-5.15/812-v6.2-firmware-nvram-bcm47xx-support-init-from-IO-memory.patch create mode 100644 target/linux/generic/backport-5.15/813-v6.5-0001-nvmem-imx-ocotp-set-varaiable-imx_ocotp_layout-stora.patch create mode 100644 target/linux/generic/backport-5.15/813-v6.5-0002-nvmem-imx-ocotp-Reverse-MAC-addresses-on-all-i.MX-de.patch create mode 100644 target/linux/generic/backport-5.15/813-v6.5-0003-nvmem-brcm_nvram-add-.read_post_process-for-MACs.patch create mode 100644 target/linux/generic/backport-5.15/813-v6.5-0004-nvmem-rockchip-otp-Add-clks-and-reg_read-to-rockchip.patch create mode 100644 target/linux/generic/backport-5.15/813-v6.5-0005-nvmem-rockchip-otp-Generalize-rockchip_otp_wait_stat.patch create mode 100644 target/linux/generic/backport-5.15/813-v6.5-0006-nvmem-rockchip-otp-Use-devm_reset_control_array_get_.patch create mode 100644 target/linux/generic/backport-5.15/813-v6.5-0007-nvmem-rockchip-otp-Improve-probe-error-handling.patch create mode 100644 target/linux/generic/backport-5.15/813-v6.5-0008-nvmem-rockchip-otp-Add-support-for-RK3588.patch create mode 100644 target/linux/generic/backport-5.15/813-v6.5-0009-nvmem-zynqmp-Switch-xilinx.com-emails-to-amd.com.patch create mode 100644 target/linux/generic/backport-5.15/813-v6.5-0010-nvmem-imx-support-i.MX93-OCOTP.patch create mode 100644 target/linux/generic/backport-5.15/813-v6.5-0011-nvmem-core-add-support-for-fixed-cells-layout.patch create mode 100644 target/linux/generic/backport-5.15/814-v6.3-leds-Move-led_init_default_state_get-to-the-global-h.patch create mode 100644 target/linux/generic/backport-5.15/815-v6.4-01-net-dsa-qca8k-move-qca8k_port_to_phy-to-header.patch create mode 100644 target/linux/generic/backport-5.15/815-v6.4-02-net-dsa-qca8k-add-LEDs-basic-support.patch create mode 100644 target/linux/generic/backport-5.15/815-v6.4-03-net-dsa-qca8k-add-LEDs-blink_set-support.patch create mode 100644 target/linux/generic/backport-5.15/815-v6.4-04-leds-Provide-stubs-for-when-CLASS_LED-NEW_LEDS-are-d.patch create mode 100644 target/linux/generic/backport-5.15/815-v6.4-05-net-phy-Add-a-binding-for-PHY-LEDs.patch create mode 100644 target/linux/generic/backport-5.15/815-v6.4-06-net-phy-phy_device-Call-into-the-PHY-driver-to-set-L.patch create mode 100644 target/linux/generic/backport-5.15/815-v6.4-07-net-phy-marvell-Add-software-control-of-the-LEDs.patch create mode 100644 target/linux/generic/backport-5.15/815-v6.4-08-net-phy-phy_device-Call-into-the-PHY-driver-to-set-L.patch create mode 100644 target/linux/generic/backport-5.15/815-v6.4-09-net-phy-marvell-Implement-led_blink_set.patch create mode 100644 target/linux/generic/backport-5.15/816-v6.4-net-phy-marvell-Fix-inconsistent-indenting-in-led_bl.patch create mode 100644 target/linux/generic/backport-5.15/817-v6.5-02-leds-trigger-netdev-Drop-NETDEV_LED_MODE_LINKUP-from.patch create mode 100644 target/linux/generic/backport-5.15/817-v6.5-03-leds-trigger-netdev-Rename-add-namespace-to-netdev-t.patch create mode 100644 target/linux/generic/backport-5.15/817-v6.5-04-leds-trigger-netdev-Convert-device-attr-to-macro.patch create mode 100644 target/linux/generic/backport-5.15/817-v6.5-05-leds-trigger-netdev-Use-mutex-instead-of-spinlocks.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-01-leds-add-APIs-for-LEDs-hw-control.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-02-leds-add-API-to-get-attached-device-for-LED-hw-contr.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-03-Documentation-leds-leds-class-Document-new-Hardware-.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-04-leds-trigger-netdev-refactor-code-setting-device-nam.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-05-leds-trigger-netdev-introduce-check-for-possible-hw-.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-06-leds-trigger-netdev-add-basic-check-for-hw-control-s.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-07-leds-trigger-netdev-reject-interval-store-for-hw_con.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-08-leds-trigger-netdev-add-support-for-LED-hw-control.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-09-leds-trigger-netdev-validate-configured-netdev.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-10-leds-trigger-netdev-init-mode-if-hw-control-already-.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-11-leds-trigger-netdev-expose-netdev-trigger-modes-in-l.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-12-net-dsa-qca8k-implement-hw_control-ops.patch create mode 100644 target/linux/generic/backport-5.15/818-v6.5-13-net-dsa-qca8k-add-op-to-get-ports-netdev.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0001-nvmem-sunxi_sid-Convert-to-devm_platform_ioremap_res.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0002-nvmem-brcm_nvram-Use-devm_platform_get_and_ioremap_r.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0003-nvmem-lpc18xx_otp-Convert-to-devm_platform_ioremap_r.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0004-nvmem-meson-mx-efuse-Convert-to-devm_platform_iorema.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0005-nvmem-rockchip-efuse-Use-devm_platform_get_and_iorem.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0006-nvmem-stm32-romem-Use-devm_platform_get_and_ioremap_.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0007-nvmem-qfprom-do-some-cleanup.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0008-nvmem-uniphier-Use-devm_platform_get_and_ioremap_res.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0009-nvmem-add-new-NXP-QorIQ-eFuse-driver.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0011-nvmem-Kconfig-Fix-typo-drive-driver.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0012-nvmem-sec-qfprom-Add-Qualcomm-secure-QFPROM-support.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0013-nvmem-u-boot-env-Replace-zero-length-array-with-DECL.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0014-nvmem-core-Create-all-cells-before-adding-the-nvmem-.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0015-nvmem-core-Return-NULL-when-no-nvmem-layout-is-found.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0016-nvmem-core-Do-not-open-code-existing-functions.patch create mode 100644 target/linux/generic/backport-5.15/819-v6.6-0017-nvmem-core-Notify-when-a-new-layout-is-registered.patch create mode 100644 target/linux/generic/backport-5.15/820-v6.7-0001-nvmem-qfprom-Mark-core-clk-as-optional.patch create mode 100644 target/linux/generic/backport-5.15/820-v6.7-0002-nvmem-add-explicit-config-option-to-read-old-syntax-.patch create mode 100644 target/linux/generic/backport-5.15/820-v6.7-0003-nvmem-Use-device_get_match_data.patch create mode 100644 target/linux/generic/backport-5.15/820-v6.7-0004-Revert-nvmem-add-new-config-option.patch create mode 100644 target/linux/generic/backport-5.15/821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch create mode 100644 target/linux/generic/backport-5.15/822-v5.17-Bluetooth-btusb-Fix-application-of-sizeof-to-pointer.patch create mode 100644 target/linux/generic/backport-5.15/823-v5.18-Bluetooth-btusb-Add-a-new-PID-VID-13d3-3567-for-MT79.patch create mode 100644 target/linux/generic/backport-5.15/824-v5.19-Bluetooth-btusb-Add-a-new-PID-VID-0489-e0c8-for-MT79.patch create mode 100644 target/linux/generic/backport-5.15/825-v6.1-Bluetooth-btusb-Add-a-new-VID-PID-0e8d-0608-for-MT79.patch create mode 100644 target/linux/generic/backport-5.15/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch create mode 100644 target/linux/generic/backport-5.15/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch create mode 100644 target/linux/generic/backport-5.15/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch create mode 100644 target/linux/generic/backport-5.15/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch create mode 100644 target/linux/generic/backport-5.15/827-v6.3-0004-of-device-Ignore-modalias-of-reused-nodes.patch create mode 100644 target/linux/generic/backport-5.15/827-v6.3-0005-of-device-Do-not-ignore-error-code-in-of_device_ueve.patch create mode 100644 target/linux/generic/backport-5.15/828-v6.4-0002-of-Update-of_device_get_modalias.patch create mode 100644 target/linux/generic/backport-5.15/828-v6.4-0003-of-Rename-of_modalias_node.patch create mode 100644 target/linux/generic/backport-5.15/828-v6.4-0004-of-Move-of_modalias-to-module.c.patch create mode 100644 target/linux/generic/backport-5.15/828-v6.4-0005-of-Move-the-request-module-helper-logic-to-module.c.patch create mode 100644 target/linux/generic/backport-5.15/860-v5.17-MIPS-ath79-drop-_machine_restart-again.patch rename target/linux/generic/{backport-5.10/870-hwmon-next-hwmon-lm70-Add-ti-tmp125-support.patch => backport-5.15/870-v5.18-hwmon-lm70-Add-ti-tmp125-support.patch} (100%) create mode 100644 target/linux/generic/backport-5.15/880-v5.19-cdc_ether-export-usbnet_cdc_zte_rx_fixup.patch create mode 100644 target/linux/generic/backport-5.15/881-v5.19-rndis_host-enable-the-bogus-MAC-fixup-for-ZTE-device.patch create mode 100644 target/linux/generic/backport-5.15/882-v5.19-rndis_host-limit-scope-of-bogus-MAC-address-detectio.patch create mode 100644 target/linux/generic/backport-5.15/890-v6.2-mtd-spinand-winbond-fix-flash-detection.patch create mode 100644 target/linux/generic/backport-5.15/891-v6.2-mtd-spinand-winbond-add-W25N02KV.patch create mode 100644 target/linux/generic/backport-5.15/892-v6.5-mtd-spinand-winbond-Fix-ecc_get_status.patch delete mode 100644 target/linux/generic/config-5.10 create mode 100644 target/linux/generic/config-5.15 create mode 100644 target/linux/generic/files/drivers/bcma/fallback-sprom.c delete mode 100644 target/linux/generic/files/drivers/leds/leds-ubnt-ledbar.c create mode 100644 target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_h3c_vfs.c create mode 100644 target/linux/generic/files/drivers/ssb/fallback-sprom.c delete mode 100644 target/linux/generic/hack-5.10/204-module_strip.patch delete mode 100644 target/linux/generic/hack-5.10/205-kconfig-exit.patch delete mode 100644 target/linux/generic/hack-5.10/212-tools_portability.patch delete mode 100644 target/linux/generic/hack-5.10/214-spidev_h_portability.patch delete mode 100644 target/linux/generic/hack-5.10/220-arm-gc_sections.patch delete mode 100644 target/linux/generic/hack-5.10/221-module_exports.patch delete mode 100644 target/linux/generic/hack-5.10/230-openwrt_lzma_options.patch delete mode 100644 target/linux/generic/hack-5.10/249-udp-tunnel-selection.patch delete mode 100644 target/linux/generic/hack-5.10/250-netfilter_depends.patch delete mode 100644 target/linux/generic/hack-5.10/251-kconfig.patch delete mode 100644 target/linux/generic/hack-5.10/252-SATA_PMP.patch delete mode 100644 target/linux/generic/hack-5.10/253-ksmbd-config.patch delete mode 100644 target/linux/generic/hack-5.10/259-regmap_dynamic.patch delete mode 100644 target/linux/generic/hack-5.10/260-crypto_test_dependencies.patch delete mode 100644 target/linux/generic/hack-5.10/261-lib-arc4-unhide.patch delete mode 100644 target/linux/generic/hack-5.10/280-rfkill-stubs.patch delete mode 100644 target/linux/generic/hack-5.10/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch delete mode 100644 target/linux/generic/hack-5.10/301-mips_image_cmdline_hack.patch delete mode 100644 target/linux/generic/hack-5.10/321-powerpc_crtsavres_prereq.patch delete mode 100644 target/linux/generic/hack-5.10/401-mtd-super-don-t-reply-on-mtdblock-device-minor.patch delete mode 100644 target/linux/generic/hack-5.10/402-mtd-blktrans-call-add-disks-after-mtd-device.patch delete mode 100644 target/linux/generic/hack-5.10/410-block-fit-partition-parser.patch delete mode 100644 target/linux/generic/hack-5.10/420-mtd-support-OpenWrt-s-MTD_ROOTFS_ROOT_DEV.patch delete mode 100644 target/linux/generic/hack-5.10/421-mtd-fix-squashfs-root-on-targets-with-CONFIG_FIT_PAR.patch delete mode 100644 target/linux/generic/hack-5.10/430-mtk-bmt-support.patch delete mode 100644 target/linux/generic/hack-5.10/531-debloat_lzma.patch delete mode 100644 target/linux/generic/hack-5.10/600-bridge_offload.patch delete mode 100644 target/linux/generic/hack-5.10/650-netfilter-add-xt_FLOWOFFLOAD-target.patch delete mode 100644 target/linux/generic/hack-5.10/651-wireless_mesh_header.patch delete mode 100644 target/linux/generic/hack-5.10/661-kernel-ct-size-the-hashtable-more-adequately.patch delete mode 100644 target/linux/generic/hack-5.10/700-swconfig_switch_drivers.patch delete mode 100644 target/linux/generic/hack-5.10/710-net-dsa-mv88e6xxx-default-VID-1.patch delete mode 100644 target/linux/generic/hack-5.10/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch delete mode 100644 target/linux/generic/hack-5.10/720-net-phy-add-aqr-phys.patch delete mode 100644 target/linux/generic/hack-5.10/721-net-add-packet-mangeling.patch delete mode 100644 target/linux/generic/hack-5.10/722-net-phy-aquantia-enable-AQR112-and-AQR412.patch delete mode 100644 target/linux/generic/hack-5.10/723-net-phy-aquantia-fix-system-side-protocol-mi.patch delete mode 100644 target/linux/generic/hack-5.10/724-net-phy-aquantia-Add-AQR113-driver-support.patch delete mode 100644 target/linux/generic/hack-5.10/725-net-phy-aquantia-add-PHY_IDs-for-AQR112-variants.patch delete mode 100644 target/linux/generic/hack-5.10/760-net-usb-r8152-add-LED-configuration-from-OF.patch delete mode 100644 target/linux/generic/hack-5.10/773-bgmac-add-srab-switch.patch delete mode 100644 target/linux/generic/hack-5.10/780-usb-net-MeigLink_modem_support.patch delete mode 100644 target/linux/generic/hack-5.10/800-GPIO-add-named-gpio-exports.patch delete mode 100644 target/linux/generic/hack-5.10/800-ubnt-ledbar-driver.patch delete mode 100644 target/linux/generic/hack-5.10/901-debloat_sock_diag.patch delete mode 100644 target/linux/generic/hack-5.10/902-debloat_proc.patch delete mode 100644 target/linux/generic/hack-5.10/904-debloat_dma_buf.patch delete mode 100644 target/linux/generic/hack-5.10/920-device_tree_cmdline.patch create mode 100644 target/linux/generic/hack-5.15/204-module_strip.patch create mode 100644 target/linux/generic/hack-5.15/205-kconfig-abort-configuration-on-unset-symbol.patch rename target/linux/generic/{hack-5.10 => hack-5.15}/210-darwin_scripts_include.patch (100%) rename target/linux/generic/{hack-5.10 => hack-5.15}/211-darwin-uuid-typedef-clash.patch (100%) create mode 100644 target/linux/generic/hack-5.15/212-tools_portability.patch create mode 100644 target/linux/generic/hack-5.15/214-spidev_h_portability.patch create mode 100644 target/linux/generic/hack-5.15/220-arm-gc_sections.patch create mode 100644 target/linux/generic/hack-5.15/221-module_exports.patch create mode 100644 target/linux/generic/hack-5.15/230-openwrt_lzma_options.patch create mode 100644 target/linux/generic/hack-5.15/250-netfilter_depends.patch create mode 100644 target/linux/generic/hack-5.15/251-kconfig.patch create mode 100644 target/linux/generic/hack-5.15/253-ksmbd-config.patch create mode 100644 target/linux/generic/hack-5.15/259-regmap_dynamic.patch create mode 100644 target/linux/generic/hack-5.15/260-crypto_test_dependencies.patch create mode 100644 target/linux/generic/hack-5.15/261-lib-arc4-unhide.patch create mode 100644 target/linux/generic/hack-5.15/280-rfkill-stubs.patch create mode 100644 target/linux/generic/hack-5.15/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch create mode 100644 target/linux/generic/hack-5.15/321-powerpc_crtsavres_prereq.patch create mode 100644 target/linux/generic/hack-5.15/402-mtd-blktrans-call-add-disks-after-mtd-device.patch create mode 100644 target/linux/generic/hack-5.15/410-block-fit-partition-parser.patch create mode 100644 target/linux/generic/hack-5.15/420-mtd-support-OpenWrt-s-MTD_ROOTFS_ROOT_DEV.patch rename target/linux/generic/{hack-5.10/422-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch => hack-5.15/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch} (100%) create mode 100644 target/linux/generic/hack-5.15/430-mtk-bmt-support.patch create mode 100644 target/linux/generic/hack-5.15/601-of_net-add-mac-address-ascii-support.patch rename target/linux/generic/{hack-5.10 => hack-5.15}/645-netfilter-connmark-introduce-set-dscpmark.patch (100%) create mode 100644 target/linux/generic/hack-5.15/650-netfilter-add-xt_FLOWOFFLOAD-target.patch create mode 100644 target/linux/generic/hack-5.15/651-wireless_mesh_header.patch rename target/linux/generic/{hack-5.10 => hack-5.15}/660-fq_codel_defaults.patch (100%) create mode 100644 target/linux/generic/hack-5.15/661-kernel-ct-size-the-hashtable-more-adequately.patch create mode 100644 target/linux/generic/hack-5.15/700-swconfig_switch_drivers.patch create mode 100644 target/linux/generic/hack-5.15/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch create mode 100644 target/linux/generic/hack-5.15/720-net-phy-add-aqr-phys.patch create mode 100644 target/linux/generic/hack-5.15/721-net-add-packet-mangeling.patch create mode 100644 target/linux/generic/hack-5.15/722-net-phy-aquantia-enable-AQR112-and-AQR412.patch create mode 100644 target/linux/generic/hack-5.15/723-net-phy-aquantia-fix-system-side-protocol-mi.patch create mode 100644 target/linux/generic/hack-5.15/724-net-phy-aquantia-Add-AQR113-driver-support.patch create mode 100644 target/linux/generic/hack-5.15/725-net-phy-aquantia-add-PHY_IDs-for-AQR112-variants.patch create mode 100644 target/linux/generic/hack-5.15/726-net-eth-dpaa2-eth-do-not-hold-rtnl_lock.patch create mode 100644 target/linux/generic/hack-5.15/750-net-pcs-mtk-lynxi-workaround-2500BaseX-no-an.patch create mode 100644 target/linux/generic/hack-5.15/760-net-usb-r8152-add-LED-configuration-from-OF.patch rename target/linux/generic/{hack-5.10 => hack-5.15}/761-dt-bindings-net-add-RTL8152-binding-documentation.patch (100%) create mode 100644 target/linux/generic/hack-5.15/765-mxl-gpy-control-LED-reg-from-DT.patch create mode 100644 target/linux/generic/hack-5.15/766-net-phy-mediatek-ge-add-LED-configuration-interface.patch create mode 100644 target/linux/generic/hack-5.15/773-bgmac-add-srab-switch.patch create mode 100644 target/linux/generic/hack-5.15/780-usb-net-MeigLink_modem_support.patch create mode 100644 target/linux/generic/hack-5.15/781-usb-net-rndis-support-asr.patch create mode 100644 target/linux/generic/hack-5.15/790-SFP-GE-T-ignore-TX_FAULT.patch create mode 100644 target/linux/generic/hack-5.15/795-backport-phylink_pcs-helpers.patch create mode 100644 target/linux/generic/hack-5.15/800-GPIO-add-named-gpio-exports.patch create mode 100644 target/linux/generic/hack-5.15/810-bcma-ssb-fallback-sprom.patch create mode 100644 target/linux/generic/hack-5.15/901-debloat_sock_diag.patch create mode 100644 target/linux/generic/hack-5.15/902-debloat_proc.patch create mode 100644 target/linux/generic/hack-5.15/904-debloat_dma_buf.patch rename target/linux/generic/{hack-5.10 => hack-5.15}/910-kobject_uevent.patch (100%) rename target/linux/generic/{hack-5.10 => hack-5.15}/911-kobject_add_broadcast_uevent.patch (100%) create mode 100644 target/linux/generic/hack-5.15/920-device_tree_cmdline.patch create mode 100644 target/linux/generic/hack-5.15/930-Revert-Revert-Revert-driver-core-Set-fw_devlink-on-b.patch delete mode 100644 target/linux/generic/pending-5.10/050-dtc-checks-Drop-interrupt-provider-address-cells-check.patch delete mode 100644 target/linux/generic/pending-5.10/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch delete mode 100644 target/linux/generic/pending-5.10/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch delete mode 100644 target/linux/generic/pending-5.10/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch delete mode 100644 target/linux/generic/pending-5.10/130-add-linux-spidev-compatible-si3210.patch delete mode 100644 target/linux/generic/pending-5.10/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch delete mode 100644 target/linux/generic/pending-5.10/141-jffs2-add-RENAME_EXCHANGE-support.patch delete mode 100644 target/linux/generic/pending-5.10/150-bridge_allow_receiption_on_disabled_port.patch delete mode 100644 target/linux/generic/pending-5.10/203-kallsyms_uncompressed.patch delete mode 100644 target/linux/generic/pending-5.10/205-backtrace_module_info.patch delete mode 100644 target/linux/generic/pending-5.10/270-platform-mikrotik-build-bits.patch delete mode 100644 target/linux/generic/pending-5.10/300-mips_expose_boot_raw.patch delete mode 100644 target/linux/generic/pending-5.10/305-mips_module_reloc.patch delete mode 100644 target/linux/generic/pending-5.10/307-mips_highmem_offset.patch delete mode 100644 target/linux/generic/pending-5.10/308-mips32r2_tune.patch delete mode 100644 target/linux/generic/pending-5.10/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch delete mode 100644 target/linux/generic/pending-5.10/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch delete mode 100644 target/linux/generic/pending-5.10/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch delete mode 100644 target/linux/generic/pending-5.10/400-mtd-mtdsplit-support.patch delete mode 100644 target/linux/generic/pending-5.10/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch delete mode 100644 target/linux/generic/pending-5.10/410-mtd-parsers-ofpart-fix-parsing-subpartitions.patch delete mode 100644 target/linux/generic/pending-5.10/419-mtd-redboot-add-of_match_table-with-DT-binding.patch delete mode 100644 target/linux/generic/pending-5.10/420-mtd-redboot_space.patch delete mode 100644 target/linux/generic/pending-5.10/435-mtd-add-routerbootpart-parser-config.patch delete mode 100644 target/linux/generic/pending-5.10/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch delete mode 100644 target/linux/generic/pending-5.10/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch delete mode 100644 target/linux/generic/pending-5.10/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch delete mode 100644 target/linux/generic/pending-5.10/476-mtd-spi-nor-add-eon-en25q128.patch delete mode 100644 target/linux/generic/pending-5.10/479-mtd-spi-nor-add-xtx-xt25f128b.patch delete mode 100644 target/linux/generic/pending-5.10/483-mtd-spi-nor-add-gd25q512.patch delete mode 100644 target/linux/generic/pending-5.10/483-mtd-spinand-add-support-for-xtx-xt26g0xa.patch delete mode 100644 target/linux/generic/pending-5.10/484-mtd-spi-nor-add-esmt-f25l16pa.patch delete mode 100644 target/linux/generic/pending-5.10/485-mtd-spi-nor-add-xmc-xm25qh128c.patch delete mode 100644 target/linux/generic/pending-5.10/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch delete mode 100644 target/linux/generic/pending-5.10/491-ubi-auto-create-ubiblock-device-for-rootfs.patch delete mode 100644 target/linux/generic/pending-5.10/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch delete mode 100644 target/linux/generic/pending-5.10/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch delete mode 100644 target/linux/generic/pending-5.10/494-mtd-ubi-add-EOF-marker-support.patch delete mode 100644 target/linux/generic/pending-5.10/495-mtd-core-add-get_mtd_device_by_node.patch delete mode 100644 target/linux/generic/pending-5.10/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch delete mode 100644 target/linux/generic/pending-5.10/498-mtd-spi-nor-locking-support-for-MX25L6405D.patch delete mode 100644 target/linux/generic/pending-5.10/500-fs_cdrom_dependencies.patch delete mode 100644 target/linux/generic/pending-5.10/530-jffs2_make_lzma_available.patch delete mode 100644 target/linux/generic/pending-5.10/600-netfilter_conntrack_flush.patch delete mode 100644 target/linux/generic/pending-5.10/613-netfilter_optional_tcp_window_check.patch delete mode 100644 target/linux/generic/pending-5.10/630-packet_socket_type.patch delete mode 100644 target/linux/generic/pending-5.10/655-increase_skb_pad.patch delete mode 100644 target/linux/generic/pending-5.10/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch delete mode 100644 target/linux/generic/pending-5.10/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch delete mode 100644 target/linux/generic/pending-5.10/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch delete mode 100644 target/linux/generic/pending-5.10/680-NET-skip-GRO-for-foreign-MAC-addresses.patch delete mode 100644 target/linux/generic/pending-5.10/682-of_net-add-mac-address-increment-support.patch delete mode 100644 target/linux/generic/pending-5.10/683-of_net-add-mac-address-to-of-tree.patch delete mode 100644 target/linux/generic/pending-5.10/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch delete mode 100644 target/linux/generic/pending-5.10/701-00-net-ethernet-mtk_eth_soc-add-support-for-coherent-DM.patch delete mode 100644 target/linux/generic/pending-5.10/701-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch delete mode 100644 target/linux/generic/pending-5.10/701-02-net-ethernet-mtk_eth_soc-add-support-for-Wireless-Et.patch delete mode 100644 target/linux/generic/pending-5.10/701-03-net-ethernet-mtk_eth_soc-implement-flow-offloading-t.patch delete mode 100644 target/linux/generic/pending-5.10/701-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch delete mode 100644 target/linux/generic/pending-5.10/701-05-net-ethernet-mtk_eth_soc-add-ipv6-flow-offload-suppo.patch delete mode 100644 target/linux/generic/pending-5.10/701-07-net-ethernet-mtk_eth_soc-allocate-struct-mtk_ppe-sep.patch delete mode 100644 target/linux/generic/pending-5.10/701-08-net-ethernet-mtk_eth_soc-rework-hardware-flow-table-.patch delete mode 100644 target/linux/generic/pending-5.10/701-10-net-ethernet-mtk_eth_soc-support-creating-mac-addres.patch delete mode 100644 target/linux/generic/pending-5.10/703-phy-add-detach-callback-to-struct-phy_driver.patch delete mode 100644 target/linux/generic/pending-5.10/704-00-netfilter-flowtable-fix-excessive-hw-offload-attempt.patch delete mode 100644 target/linux/generic/pending-5.10/704-01-netfilter-nft_flow_offload-skip-dst-neigh-lookup-for.patch delete mode 100644 target/linux/generic/pending-5.10/704-02-net-fix-dev_fill_forward_path-with-pppoe-bridge.patch delete mode 100644 target/linux/generic/pending-5.10/704-03-netfilter-nft_flow_offload-fix-offload-with-pppoe-vl.patch delete mode 100644 target/linux/generic/pending-5.10/705-net-dsa-tag_mtk-add-padding-for-tx-packets.patch delete mode 100644 target/linux/generic/pending-5.10/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch delete mode 100644 target/linux/generic/pending-5.10/730-net-phy-at803x-fix-feature-detection.patch delete mode 100644 target/linux/generic/pending-5.10/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch delete mode 100644 target/linux/generic/pending-5.10/762-net-bridge-switchdev-Refactor-br_switchdev_fdb_notif.patch delete mode 100644 target/linux/generic/pending-5.10/763-net-bridge-switchdev-Include-local-flag-in-FDB-notif.patch delete mode 100644 target/linux/generic/pending-5.10/764-net-bridge-switchdev-Send-FDB-notifications-for-host.patch delete mode 100644 target/linux/generic/pending-5.10/765-net-dsa-Include-local-addresses-in-assisted-CPU-port.patch delete mode 100644 target/linux/generic/pending-5.10/766-net-dsa-Include-bridge-addresses-in-assisted-CPU-por.patch delete mode 100644 target/linux/generic/pending-5.10/767-net-dsa-Sync-static-FDB-entries-on-foreign-interface.patch delete mode 100644 target/linux/generic/pending-5.10/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch delete mode 100644 target/linux/generic/pending-5.10/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch delete mode 100644 target/linux/generic/pending-5.10/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch delete mode 100644 target/linux/generic/pending-5.10/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch delete mode 100644 target/linux/generic/pending-5.10/810-pci_disable_common_quirks.patch delete mode 100644 target/linux/generic/pending-5.10/811-pci_disable_usb_common_quirks.patch delete mode 100644 target/linux/generic/pending-5.10/834-ledtrig-libata.patch delete mode 100644 target/linux/generic/pending-5.10/840-hwrng-bcm2835-set-quality-to-1000.patch delete mode 100644 target/linux/generic/pending-5.10/842-net-qmi_wwan-add-ZTE-MF286D-modem-19d2-1485.patch delete mode 100644 target/linux/generic/pending-5.10/850-0001-PCI-aardvark-Replace-custom-PCIE_CORE_INT_-macros-wi.patch delete mode 100644 target/linux/generic/pending-5.10/850-0004-PCI-aardvark-Rewrite-IRQ-code-to-chained-IRQ-handler.patch delete mode 100644 target/linux/generic/pending-5.10/850-0005-PCI-aardvark-Check-return-value-of-generic_handle_do.patch delete mode 100644 target/linux/generic/pending-5.10/850-0006-PCI-aardvark-Make-MSI-irq_chip-structures-static-dri.patch delete mode 100644 target/linux/generic/pending-5.10/850-0007-PCI-aardvark-Make-msi_domain_info-structure-a-static.patch delete mode 100644 target/linux/generic/pending-5.10/850-0008-PCI-aardvark-Use-dev_fwnode-instead-of-of_node_to_fw.patch delete mode 100644 target/linux/generic/pending-5.10/850-0009-PCI-aardvark-Refactor-unmasking-summary-MSI-interrup.patch delete mode 100644 target/linux/generic/pending-5.10/850-0010-PCI-aardvark-Add-support-for-masking-MSI-interrupts.patch delete mode 100644 target/linux/generic/pending-5.10/850-0011-PCI-aardvark-Fix-setting-MSI-address.patch delete mode 100644 target/linux/generic/pending-5.10/850-0012-PCI-aardvark-Enable-MSI-X-support.patch delete mode 100644 target/linux/generic/pending-5.10/850-0013-PCI-aardvark-Add-support-for-ERR-interrupt-on-emulat.patch delete mode 100644 target/linux/generic/pending-5.10/850-0015-PCI-aardvark-Optimize-writing-PCI_EXP_RTCTL_PMEIE-an.patch delete mode 100644 target/linux/generic/pending-5.10/850-0016-PCI-aardvark-Add-support-for-PME-interrupts.patch delete mode 100644 target/linux/generic/pending-5.10/850-0017-PCI-aardvark-Fix-support-for-PME-requester-on-emulat.patch delete mode 100644 target/linux/generic/pending-5.10/850-0018-PCI-aardvark-Use-separate-INTA-interrupt-for-emulate.patch delete mode 100644 target/linux/generic/pending-5.10/850-0019-PCI-aardvark-Remove-irq_mask_ack-callback-for-INTx-i.patch delete mode 100644 target/linux/generic/pending-5.10/850-0020-PCI-aardvark-Don-t-mask-irq-when-mapping.patch delete mode 100644 target/linux/generic/pending-5.10/850-0021-PCI-aardvark-Drop-__maybe_unused-from-advk_pcie_disa.patch delete mode 100644 target/linux/generic/pending-5.10/850-0022-PCI-aardvark-Update-comment-about-link-going-down-af.patch delete mode 100644 target/linux/generic/pending-5.10/850-0023-PCI-aardvark-Make-main-irq_chip-structure-a-static-d.patch delete mode 100644 target/linux/generic/pending-5.10/851-0001-phy-marvell-phy-mvebu-a3700-comphy-Remove-port-from-.patch delete mode 100644 target/linux/generic/pending-5.10/851-0002-phy-marvell-phy-mvebu-a3700-comphy-Add-native-kernel.patch delete mode 100644 target/linux/generic/pending-5.10/851-0003-arm64-dts-marvell-armada-37xx-Add-xtal-clock-to-comp.patch delete mode 100644 target/linux/generic/pending-5.10/851-0004-Revert-ata-ahci-mvebu-Make-SATA-PHY-optional-for-Arm.patch delete mode 100644 target/linux/generic/pending-5.10/851-0005-Revert-usb-host-xhci-mvebu-make-USB-3.0-PHY-optional.patch delete mode 100644 target/linux/generic/pending-5.10/851-0006-Revert-PCI-aardvark-Fix-initialization-with-old-Marv.patch delete mode 100644 target/linux/generic/pending-5.10/920-mangle_bootargs.patch create mode 100644 target/linux/generic/pending-5.15/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch create mode 100644 target/linux/generic/pending-5.15/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch create mode 100644 target/linux/generic/pending-5.15/103-kbuild-export-SUBARCH.patch create mode 100644 target/linux/generic/pending-5.15/110-v6.3-0001-spidev-Add-Silicon-Labs-EM3581-device-compatible.patch create mode 100644 target/linux/generic/pending-5.15/110-v6.3-0002-spidev-Add-Silicon-Labs-SI3210-device-compatible.patch create mode 100644 target/linux/generic/pending-5.15/111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch create mode 100644 target/linux/generic/pending-5.15/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch create mode 100644 target/linux/generic/pending-5.15/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch create mode 100644 target/linux/generic/pending-5.15/141-jffs2-add-RENAME_EXCHANGE-support.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/142-jffs2-add-splice-ops.patch (100%) create mode 100644 target/linux/generic/pending-5.15/150-bridge_allow_receiption_on_disabled_port.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/190-rtc-rs5c372-support_alarms_up_to_1_week.patch (100%) rename target/linux/generic/{pending-5.10 => pending-5.15}/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch (100%) create mode 100644 target/linux/generic/pending-5.15/203-kallsyms_uncompressed.patch create mode 100644 target/linux/generic/pending-5.15/205-backtrace_module_info.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/240-remove-unsane-filenames-from-deps_initramfs-list.patch (100%) rename target/linux/generic/{pending-5.10 => pending-5.15}/261-enable_wilink_platform_without_drivers.patch (100%) create mode 100644 target/linux/generic/pending-5.15/270-platform-mikrotik-build-bits.patch create mode 100644 target/linux/generic/pending-5.15/300-mips_expose_boot_raw.patch create mode 100644 target/linux/generic/pending-5.15/301-MIPS-Add-barriers-between-dcache-icache-flushes.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/302-mips_no_branch_likely.patch (100%) create mode 100644 target/linux/generic/pending-5.15/305-mips_module_reloc.patch create mode 100644 target/linux/generic/pending-5.15/308-mips32r2_tune.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/310-arm_module_unresolved_weak_sym.patch (100%) create mode 100644 target/linux/generic/pending-5.15/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/332-arc-add-OWRTDTB-section.patch (100%) rename target/linux/generic/{pending-5.10 => pending-5.15}/333-arc-enable-unaligned-access-in-kernel-mode.patch (100%) create mode 100644 target/linux/generic/pending-5.15/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch create mode 100644 target/linux/generic/pending-5.15/351-irqchip-bcm-6345-l1-request-memory-region.patch create mode 100644 target/linux/generic/pending-5.15/400-mtd-mtdsplit-support.patch create mode 100644 target/linux/generic/pending-5.15/401-mtd-don-t-register-NVMEM-devices-for-partitions-with.patch create mode 100644 target/linux/generic/pending-5.15/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch create mode 100644 target/linux/generic/pending-5.15/420-mtd-redboot_space.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/430-mtd-add-myloader-partition-parser.patch (100%) rename target/linux/generic/{pending-5.10 => pending-5.15}/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch (100%) rename target/linux/generic/{pending-5.10 => pending-5.15}/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch (100%) create mode 100644 target/linux/generic/pending-5.15/435-mtd-add-routerbootpart-parser-config.patch create mode 100644 target/linux/generic/pending-5.15/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch create mode 100644 target/linux/generic/pending-5.15/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/465-m25p80-mx-disable-software-protection.patch (100%) create mode 100644 target/linux/generic/pending-5.15/476-mtd-spi-nor-add-eon-en25q128.patch create mode 100644 target/linux/generic/pending-5.15/477-mtd-spi-nor-add-eon-en25qx128a.patch create mode 100644 target/linux/generic/pending-5.15/479-mtd-spi-nor-add-xtx-xt25f128b.patch rename target/linux/generic/{pending-5.10/482-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch => pending-5.15/481-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch} (100%) create mode 100644 target/linux/generic/pending-5.15/482-mtd-spi-nor-add-gd25q512.patch create mode 100644 target/linux/generic/pending-5.15/484-mtd-spi-nor-add-esmt-f25l16pa.patch create mode 100644 target/linux/generic/pending-5.15/485-mtd-spi-nor-add-xmc-xm25qh128c.patch create mode 100644 target/linux/generic/pending-5.15/486-01-mtd-spinand-add-support-for-ESMT-F50x1G41LB.patch create mode 100644 target/linux/generic/pending-5.15/487-mtd-spinand-Add-support-for-Etron-EM73D044VCx.patch create mode 100644 target/linux/generic/pending-5.15/488-mtd-spi-nor-add-xmc-xm25qh64c.patch create mode 100644 target/linux/generic/pending-5.15/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch create mode 100644 target/linux/generic/pending-5.15/491-ubi-auto-create-ubiblock-device-for-rootfs.patch create mode 100644 target/linux/generic/pending-5.15/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch create mode 100644 target/linux/generic/pending-5.15/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch create mode 100644 target/linux/generic/pending-5.15/494-mtd-ubi-add-EOF-marker-support.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch (100%) create mode 100644 target/linux/generic/pending-5.15/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch create mode 100644 target/linux/generic/pending-5.15/498-mtd-spi-nor-locking-support-for-MX25L6405D.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/499-mtd-spi-nor-disable-16-bit-sr-for-macronix.patch (100%) create mode 100644 target/linux/generic/pending-5.15/500-fs_cdrom_dependencies.patch create mode 100644 target/linux/generic/pending-5.15/530-jffs2_make_lzma_available.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/532-jffs2_eofdetect.patch (100%) create mode 100644 target/linux/generic/pending-5.15/600-netfilter_conntrack_flush.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/610-netfilter_match_bypass_default_checks.patch (100%) rename target/linux/generic/{pending-5.10 => pending-5.15}/611-netfilter_match_bypass_default_table.patch (100%) rename target/linux/generic/{pending-5.10 => pending-5.15}/612-netfilter_match_reduce_memory_access.patch (100%) rename target/linux/generic/{pending-5.10 => pending-5.15}/620-net_sched-codel-do-not-defer-queue-length-update.patch (100%) create mode 100644 target/linux/generic/pending-5.15/630-packet_socket_type.patch create mode 100644 target/linux/generic/pending-5.15/655-increase_skb_pad.patch create mode 100644 target/linux/generic/pending-5.15/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch create mode 100644 target/linux/generic/pending-5.15/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch create mode 100644 target/linux/generic/pending-5.15/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch create mode 100644 target/linux/generic/pending-5.15/680-NET-skip-GRO-for-foreign-MAC-addresses.patch create mode 100644 target/linux/generic/pending-5.15/682-of_net-add-mac-address-increment-support.patch create mode 100644 target/linux/generic/pending-5.15/683-of_net-add-mac-address-to-of-tree.patch create mode 100644 target/linux/generic/pending-5.15/684-of_net-do-mac-address-increment-only-once.patch create mode 100644 target/linux/generic/pending-5.15/700-netfilter-nft_flow_offload-handle-netdevice-events-f.patch create mode 100644 target/linux/generic/pending-5.15/701-netfilter-nf_tables-ignore-EOPNOTSUPP-on-flowtable-d.patch create mode 100644 target/linux/generic/pending-5.15/702-net-ethernet-mtk_eth_soc-enable-threaded-NAPI.patch create mode 100644 target/linux/generic/pending-5.15/703-phy-add-detach-callback-to-struct-phy_driver.patch create mode 100644 target/linux/generic/pending-5.15/704-01-v6.4-net-mvneta-fix-transmit-path-dma-unmapping-on-error.patch create mode 100644 target/linux/generic/pending-5.15/704-02-v6.4-net-mvneta-mark-mapped-and-tso-buffers-separately.patch create mode 100644 target/linux/generic/pending-5.15/704-03-v6.4-net-mvneta-use-buf-type-to-determine-whether-to-dma-.patch create mode 100644 target/linux/generic/pending-5.15/704-04-v6.4-net-mvneta-move-tso_build_hdr-into-mvneta_tso_put_hd.patch create mode 100644 target/linux/generic/pending-5.15/704-05-v6.4-net-mvneta-allocate-TSO-header-DMA-memory-in-chunks.patch create mode 100644 target/linux/generic/pending-5.15/705-net-dsa-tag_mtk-add-padding-for-tx-packets.patch create mode 100644 target/linux/generic/pending-5.15/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch create mode 100644 target/linux/generic/pending-5.15/721-net-phy-realtek-rtl8221-allow-to-configure-SERDES-mo.patch create mode 100644 target/linux/generic/pending-5.15/722-net-phy-realtek-support-switching-between-SGMII-and-.patch create mode 100644 target/linux/generic/pending-5.15/723-net-mt7531-ensure-all-MACs-are-powered-down-before-r.patch create mode 100644 target/linux/generic/pending-5.15/724-net-phy-realtek-use-genphy_soft_reset-for-2.5G-PHYs.patch create mode 100644 target/linux/generic/pending-5.15/725-net-phy-realtek-disable-SGMII-in-band-AN-for-2-5G-PHYs.patch create mode 100644 target/linux/generic/pending-5.15/726-net-phy-realtek-make-sure-paged-read-is-protected-by.patch create mode 100644 target/linux/generic/pending-5.15/727-net-phy-realtek-use-inline-functions-for-10GbE-adver.patch create mode 100644 target/linux/generic/pending-5.15/728-net-phy-realtek-check-validity-of-10GbE-link-partner.patch create mode 100644 target/linux/generic/pending-5.15/729-net-phy-realtek-introduce-rtl822x_probe.patch create mode 100644 target/linux/generic/pending-5.15/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch create mode 100644 target/linux/generic/pending-5.15/732-00-net-ethernet-mtk_eth_soc-compile-out-netsys-v2-code-.patch create mode 100644 target/linux/generic/pending-5.15/732-01-net-ethernet-mtk_eth_soc-work-around-issue-with-send.patch create mode 100644 target/linux/generic/pending-5.15/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch create mode 100644 target/linux/generic/pending-5.15/732-03-net-ethernet-mtk_eth_soc-fix-remaining-throughput-re.patch create mode 100644 target/linux/generic/pending-5.15/734-net-ethernet-mtk_eth_soc-ppe-fix-L2-offloading-with-.patch create mode 100644 target/linux/generic/pending-5.15/736-01-net-ethernet-mtk_eth_soc-add-code-for-offloading-flo.patch create mode 100644 target/linux/generic/pending-5.15/736-02-net-ethernet-mediatek-mtk_ppe-prefer-newly-added-l2-.patch create mode 100644 target/linux/generic/pending-5.15/736-03-net-ethernet-mtk_eth_soc-improve-keeping-track-of-of.patch create mode 100644 target/linux/generic/pending-5.15/736-04-net-ethernet-mediatek-fix-ppe-flow-accounting-for-L2.patch create mode 100644 target/linux/generic/pending-5.15/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch create mode 100644 target/linux/generic/pending-5.15/750-skb-Do-mix-page-pool-and-page-referenced-frags-in-GR.patch create mode 100644 target/linux/generic/pending-5.15/760-net-core-add-optional-threading-for-backlog-processi.patch create mode 100644 target/linux/generic/pending-5.15/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch create mode 100644 target/linux/generic/pending-5.15/772-net-dsa-b53-add-support-for-BCM63xx-RGMIIs.patch create mode 100644 target/linux/generic/pending-5.15/773-net-dsa-b53-mmap-add-more-63xx-SoCs.patch create mode 100644 target/linux/generic/pending-5.15/774-net-dsa-b53-mmap-allow-passing-a-chip-ID.patch create mode 100644 target/linux/generic/pending-5.15/775-net-dsa-b53-add-BCM63268-RGMII-configuration.patch create mode 100644 target/linux/generic/pending-5.15/777-net-dsa-b53-mdio-add-support-for-BCM53134.patch create mode 100644 target/linux/generic/pending-5.15/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch create mode 100644 target/linux/generic/pending-5.15/790-bus-mhi-core-add-SBL-state-callback.patch create mode 100644 target/linux/generic/pending-5.15/795-mt7530-register-OF-node-for-internal-MDIO-bus.patch create mode 100644 target/linux/generic/pending-5.15/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch create mode 100644 target/linux/generic/pending-5.15/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch create mode 100644 target/linux/generic/pending-5.15/802-nvmem-u-boot-env-align-endianness-of-crc32-values.patch create mode 100644 target/linux/generic/pending-5.15/803-nvmem-core-fix-support-for-fixed-cells-NVMEM-layout.patch create mode 100644 target/linux/generic/pending-5.15/804-nvmem-core-support-mac-base-fixed-layout-cells.patch create mode 100644 target/linux/generic/pending-5.15/810-pci_disable_common_quirks.patch create mode 100644 target/linux/generic/pending-5.15/811-pci_disable_usb_common_quirks.patch rename target/linux/generic/{pending-5.10 => pending-5.15}/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch (100%) create mode 100644 target/linux/generic/pending-5.15/834-ledtrig-libata.patch create mode 100644 target/linux/generic/pending-5.15/840-hwrng-bcm2835-set-quality-to-1000.patch create mode 100644 target/linux/generic/pending-5.15/850-0023-PCI-aardvark-Make-main-irq_chip-structure-a-static-d.patch create mode 100644 target/linux/generic/pending-5.15/850-dt-bindings-clk-add-BCM63268-timer-clock-definitions.patch create mode 100644 target/linux/generic/pending-5.15/851-dt-bindings-reset-add-BCM63268-timer-reset-definitions.patch create mode 100644 target/linux/generic/pending-5.15/852-clk-bcm-Add-BCM63268-timer-clock-and-reset-driver.patch create mode 100644 target/linux/generic/pending-5.15/860-serial-8250_mtk-track-busclk-state-to-avoid-bus-error.patch create mode 100644 target/linux/generic/pending-5.15/920-mangle_bootargs.patch delete mode 100644 target/linux/mvebu/config-5.10 create mode 100644 target/linux/mvebu/config-5.15 create mode 100644 target/linux/mvebu/cortexa9/base-files/lib/upgrade/fortinet.sh delete mode 100644 target/linux/mvebu/cortexa9/config-5.10 create mode 100644 target/linux/mvebu/cortexa9/config-5.15 create mode 100644 target/linux/mvebu/files/arch/arm/boot/dts/armada-370-buffalo-ls220de.dts create mode 100644 target/linux/mvebu/files/arch/arm/boot/dts/armada-385-fortinet-fg-50e.dts create mode 100644 target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-eDPU.dts create mode 100644 target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts create mode 100644 target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi create mode 100644 target/linux/mvebu/files/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi delete mode 100644 target/linux/mvebu/patches-5.10/001-v5.11-arm64-dts-mcbin-singleshot-add-heartbeat-LED.patch delete mode 100644 target/linux/mvebu/patches-5.10/002-v5.11-ARM-dts-turris-omnia-enable-HW-buffer-management.patch delete mode 100644 target/linux/mvebu/patches-5.10/003-v5.11-ARM-dts-turris-omnia-add-comphy-handle-to-eth2.patch delete mode 100644 target/linux/mvebu/patches-5.10/004-v5.11-ARM-dts-turris-omnia-describe-switch-interrupt.patch delete mode 100644 target/linux/mvebu/patches-5.10/005-v5.11-ARM-dts-turris-omnia-add-SFP-node.patch delete mode 100644 target/linux/mvebu/patches-5.10/006-v5.11-ARM-dts-turris-omnia-add-LED-controller-node.patch delete mode 100644 target/linux/mvebu/patches-5.10/007-v5.11-ARM-dts-turris-omnia-update-ethernet-phy-node-and-handle-name.patch delete mode 100644 target/linux/mvebu/patches-5.10/008-v5.12-ARM-dts-turris-omnia-fix-hardware-buffer-management.patch delete mode 100644 target/linux/mvebu/patches-5.10/100-mvebu-dt-ARM-dts-turris-omnia-configure-LED-0-pin-function-to.patch delete mode 100644 target/linux/mvebu/patches-5.10/101-mvebu-dt-ARM-dts-turris-omnia-enable-LED-controller-node.patch delete mode 100644 target/linux/mvebu/patches-5.10/102-leds-turris-omnia-support-HW-controlled-mode-via-pri.patch delete mode 100644 target/linux/mvebu/patches-5.10/103-leds-turris-omnia-initialize-multi-intensity-to-full.patch delete mode 100644 target/linux/mvebu/patches-5.10/104-leds-turris-omnia-change-max-brightness-from-255-to-.patch delete mode 100644 target/linux/mvebu/patches-5.10/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch delete mode 100644 target/linux/mvebu/patches-5.10/302-add_powertables.patch delete mode 100644 target/linux/mvebu/patches-5.10/303-linksys_hardcode_nand_ecc_settings.patch delete mode 100644 target/linux/mvebu/patches-5.10/314-arm64-dts-uDPU-switch-PHY-operation-mode-to-2500base.patch delete mode 100644 target/linux/mvebu/patches-5.10/700-mvneta-tx-queue-workaround.patch delete mode 100644 target/linux/mvebu/patches-5.10/701-v5.14-net-ethernet-marvell-mvnetaMQPrio.patch delete mode 100644 target/linux/mvebu/patches-5.10/702-net-next-ethernet-marvell-mvnetaMQPrioOffload.patch delete mode 100644 target/linux/mvebu/patches-5.10/703-net-next-ethernet-marvell-mvnetaMQPrioFlag.patch delete mode 100644 target/linux/mvebu/patches-5.10/704-net-next-ethernet-marvell-mvnetaMQPrioQueue.patch delete mode 100644 target/linux/mvebu/patches-5.10/705-net-next-ethernet-marvell-mvnetaMQPrioTCOffload.patch delete mode 100644 target/linux/mvebu/patches-5.10/801-pci-mvebu-time-out-reset-on-link-up.patch delete mode 100644 target/linux/mvebu/patches-5.10/901-dt-bindings-Add-IEI-vendor-prefix-and-IEI-WT61P803-P.patch delete mode 100644 target/linux/mvebu/patches-5.10/902-drivers-mfd-Add-a-driver-for-IEI-WT61P803-PUZZLE-MCU.patch delete mode 100644 target/linux/mvebu/patches-5.10/903-drivers-hwmon-Add-the-IEI-WT61P803-PUZZLE-HWMON-driv.patch delete mode 100644 target/linux/mvebu/patches-5.10/904-drivers-leds-Add-the-IEI-WT61P803-PUZZLE-LED-driver.patch delete mode 100644 target/linux/mvebu/patches-5.10/906-Documentation-hwmon-Add-iei-wt61p803-puzzle-hwmon-dr.patch delete mode 100644 target/linux/mvebu/patches-5.10/907-MAINTAINERS-Add-an-entry-for-the-IEI-WT61P803-PUZZLE.patch create mode 100644 target/linux/mvebu/patches-5.15/100-ARM-dts-turris-omnia-configure-LED-0-pin-function-to.patch create mode 100644 target/linux/mvebu/patches-5.15/100-aardvark-workaround-PCIe.patch create mode 100644 target/linux/mvebu/patches-5.15/101-ARM-dts-turris-omnia-enable-LED-controller-node.patch create mode 100644 target/linux/mvebu/patches-5.15/102-leds-turris-omnia-support-HW-controlled-mode-via-pri.patch create mode 100644 target/linux/mvebu/patches-5.15/103-leds-turris-omnia-initialize-multi-intensity-to-full.patch create mode 100644 target/linux/mvebu/patches-5.15/104-leds-turris-omnia-change-max-brightness-from-255-to-.patch create mode 100644 target/linux/mvebu/patches-5.15/105-power-reset-linkstation-poweroff-add-ls220de.patch create mode 100644 target/linux/mvebu/patches-5.15/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch rename target/linux/mvebu/{patches-5.10 => patches-5.15}/301-mvebu-armada-38x-enable-libata-leds.patch (100%) create mode 100644 target/linux/mvebu/patches-5.15/302-add_powertables.patch rename target/linux/mvebu/{patches-5.10 => patches-5.15}/304-revert_i2c_delay.patch (100%) rename target/linux/mvebu/{patches-5.10 => patches-5.15}/305-armada-385-rd-mtd-partitions.patch (100%) rename target/linux/mvebu/{patches-5.10 => patches-5.15}/306-ARM-mvebu-385-ap-Add-partitions.patch (100%) rename target/linux/mvebu/{patches-5.10 => patches-5.15}/307-armada-xp-linksys-mamba-broken-idle.patch (100%) rename target/linux/mvebu/{patches-5.10 => patches-5.15}/308-armada-xp-linksys-mamba-wan.patch (100%) rename target/linux/mvebu/{patches-5.10 => patches-5.15}/309-linksys-status-led.patch (100%) rename target/linux/mvebu/{patches-5.10 => patches-5.15}/310-linksys-use-eth0-as-cpu-port.patch (100%) rename target/linux/mvebu/{patches-5.10 => patches-5.15}/311-adjust-compatible-for-linksys.patch (100%) rename target/linux/mvebu/{patches-5.10 => patches-5.15}/312-ARM-dts-armada388-clearfog-emmc-on-clearfog-base.patch (100%) rename target/linux/mvebu/{patches-5.10 => patches-5.15}/313-helios4-dts-status-led-alias.patch (100%) create mode 100644 target/linux/mvebu/patches-5.15/314-arm64-dts-marvell-enable-heartbeat-LED-by-default.patch rename target/linux/mvebu/{patches-5.10 => patches-5.15}/315-armada-xp-linksys-mamba-resize-kernel.patch (100%) rename target/linux/mvebu/{patches-5.10 => patches-5.15}/316-armada-370-dts-fix-crypto-engine.patch (100%) rename target/linux/mvebu/{patches-5.10 => patches-5.15}/400-find_active_root.patch (100%) create mode 100644 target/linux/mvebu/patches-5.15/700-mvneta-tx-queue-workaround.patch create mode 100644 target/linux/mvebu/patches-5.15/702-net-next-ethernet-marvell-mvnetaMQPrioOffload.patch create mode 100644 target/linux/mvebu/patches-5.15/703-net-next-ethernet-marvell-mvnetaMQPrioFlag.patch create mode 100644 target/linux/mvebu/patches-5.15/704-net-next-ethernet-marvell-mvnetaMQPrioQueue.patch create mode 100644 target/linux/mvebu/patches-5.15/705-net-next-ethernet-marvell-mvnetaMQPrioTCOffload.patch create mode 100644 target/linux/mvebu/patches-5.15/710-v6.2-phy-marvell-phy-mvebu-a3700-comphy-Reset-COMPHY-regi.patch rename target/linux/mvebu/{patches-5.10 => patches-5.15}/800-cpuidle-mvebu-indicate-failure-to-enter-deeper-sleep.patch (100%) create mode 100644 target/linux/mvebu/patches-5.15/801-pci-mvebu-time-out-reset-on-link-up.patch create mode 100644 target/linux/mvebu/patches-5.15/901-dt-bindings-Add-IEI-vendor-prefix-and-IEI-WT61P803-P.patch create mode 100644 target/linux/mvebu/patches-5.15/902-drivers-mfd-Add-a-driver-for-IEI-WT61P803-PUZZLE-MCU.patch create mode 100644 target/linux/mvebu/patches-5.15/903-drivers-hwmon-Add-the-IEI-WT61P803-PUZZLE-HWMON-driv.patch create mode 100644 target/linux/mvebu/patches-5.15/904-drivers-leds-Add-the-IEI-WT61P803-PUZZLE-LED-driver.patch rename target/linux/mvebu/{patches-5.10 => patches-5.15}/905-Documentation-ABI-Add-iei-wt61p803-puzzle-driver-sys.patch (100%) create mode 100644 target/linux/mvebu/patches-5.15/906-Documentation-hwmon-Add-iei-wt61p803-puzzle-hwmon-dr.patch create mode 100644 target/linux/mvebu/patches-5.15/907-MAINTAINERS-Add-an-entry-for-the-IEI-WT61P803-PUZZLE.patch rename target/linux/mvebu/{patches-5.10 => patches-5.15}/910-drivers-leds-wt61p803-puzzle-improvements.patch (100%) create mode 100644 target/linux/mvebu/patches-5.15/911-drivers-leds-wt61p803-puzzle-mcu-retry.patch delete mode 100644 target/linux/rockchip/armv8/config-5.10 create mode 100644 target/linux/rockchip/armv8/config-5.15 delete mode 100644 target/linux/rockchip/image/nanopi-r2s.bootscript delete mode 100644 target/linux/rockchip/image/nanopi-r4s.bootscript delete mode 100644 target/linux/rockchip/image/tpe-r1400.bootscript delete mode 100644 target/linux/rockchip/patches-5.10/004-v5.13-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch delete mode 100644 target/linux/rockchip/patches-5.10/100-rockchip-use-system-LED-for-OpenWrt.patch delete mode 100644 target/linux/rockchip/patches-5.10/101-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch delete mode 100644 target/linux/rockchip/patches-5.10/102-rockchip-enable-LAN-port-on-NanoPi-R2S.patch delete mode 100644 target/linux/rockchip/patches-5.10/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch delete mode 100644 target/linux/rockchip/patches-5.10/104-rockchip-use-USB-host-by-default-on-rk3399-rock-pi-4.patch delete mode 100644 target/linux/rockchip/patches-5.10/105-nanopi-r4s-sd-signalling.patch delete mode 100644 target/linux/rockchip/patches-5.10/107-add-tpe-r1400.patch rename target/linux/rockchip/{patches-5.10 => patches-5.15}/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch (100%) create mode 100644 target/linux/rockchip/patches-5.15/006-v6.4-arm64-dts-rockchip-Add-FriendlyARM-NanoPi-R2C.patch create mode 100644 target/linux/rockchip/patches-5.15/007-v6.3-arm64-dts-rockchip-rk3328-Add-Orange-Pi-R1-Plus.patch create mode 100644 target/linux/rockchip/patches-5.15/008-v6.4-arm64-dts-rockchip-Add-Xunlong-OrangePi-R1-Plus-LTS.patch create mode 100644 target/linux/rockchip/patches-5.15/009-v6.4-arm64-dts-rockchip-Add-ThinkPenguin-TPE-R1400.patch create mode 100644 target/linux/rockchip/patches-5.15/100-rockchip-use-system-LED-for-OpenWrt.patch create mode 100644 target/linux/rockchip/patches-5.15/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch create mode 100644 target/linux/rockchip/patches-5.15/105-nanopi-r4s-sd-signalling.patch rename target/linux/rockchip/{patches-5.10 => patches-5.15}/106-r4s-openwrt-leds.patch (100%) create mode 100644 target/linux/rockchip/patches-5.15/107-arm64-dts-rockchip-Update-LED-properties-for-Orange-.patch create mode 100644 target/linux/rockchip/patches-5.15/108-arm64-dts-rockchip-add-LED-configuration-to-Orange-P.patch delete mode 120000 target/linux/sunxi/base-files/lib/firmware/brcm/brcmfmac43430a0-sdio.txt delete mode 100644 target/linux/sunxi/config-5.10 create mode 100644 target/linux/sunxi/config-5.15 delete mode 100644 target/linux/sunxi/cortexa53/config-5.10 create mode 100644 target/linux/sunxi/cortexa53/config-5.15 delete mode 100644 target/linux/sunxi/cortexa7/config-5.10 create mode 100644 target/linux/sunxi/cortexa7/config-5.15 delete mode 100644 target/linux/sunxi/cortexa8/config-5.10 create mode 100644 target/linux/sunxi/cortexa8/config-5.15 delete mode 100644 target/linux/sunxi/patches-5.10/062-add-sun8i-h3-zeropi-support.patch delete mode 100644 target/linux/sunxi/patches-5.10/100-sunxi-h3-add-support-for-nanopi-r1.patch delete mode 100644 target/linux/sunxi/patches-5.10/101-sunxi-h5-add-support-for-nanopi-r1s-h5.patch delete mode 100644 target/linux/sunxi/patches-5.10/102-sunxi-add-OF-node-for-USB-eth-on-NanoPi-R1S-H5.patch delete mode 100644 target/linux/sunxi/patches-5.10/431-arm64-dts-allwinner-nanopi-r1s-h5-add-status-LED.patch create mode 100644 target/linux/sunxi/patches-5.15/102-sunxi-add-OF-node-for-USB-eth-on-NanoPi-R1S-H5.patch rename target/linux/sunxi/{patches-5.10 => patches-5.15}/301-orangepi_pc2_usb_otg_to_host_key_power.patch (100%) rename target/linux/sunxi/{patches-5.10 => patches-5.15}/400-arm64-allwinner-a64-sopine-Add-Sopine-flash-partitio.patch (100%) rename target/linux/sunxi/{patches-5.10 => patches-5.15}/430-arm64-dts-allwinner-a64-olinuxino-add-status-LED-ali.patch (100%) create mode 100644 target/linux/sunxi/patches-5.15/431-arm64-dts-allwinner-nanopi-r1s-h5-add-status-LED.patch rename target/linux/sunxi/{patches-5.10 => patches-5.15}/442-arm64-dts-orangepi-one-plus-enable-PWM.patch (100%) rename target/linux/sunxi/{patches-5.10 => patches-5.15}/450-arm64-dts-enable-wifi-on-pine64-boards.patch (100%) delete mode 100644 target/linux/uml/config-5.10 create mode 100644 target/linux/uml/config-5.15 delete mode 100644 target/linux/uml/patches-5.10/101-mconsole-exec.patch delete mode 100644 target/linux/uml/patches-5.10/102-pseudo-random-mac.patch create mode 100644 target/linux/uml/patches-5.15/101-mconsole-exec.patch create mode 100644 target/linux/uml/patches-5.15/102-pseudo-random-mac.patch create mode 100644 target/linux/uml/patches-5.15/104-um-increase-default-virtual-physical-memory-to-64.patch delete mode 100644 target/linux/x86/64/config-5.10 create mode 100644 target/linux/x86/64/config-5.15 delete mode 100644 target/linux/x86/base-files/lib/preinit/81_upgrade_bootloader delete mode 100644 target/linux/x86/config-5.10 create mode 100644 target/linux/x86/config-5.15 delete mode 100644 target/linux/x86/generic/config-5.10 create mode 100644 target/linux/x86/generic/config-5.15 delete mode 100644 target/linux/x86/geode/config-5.10 create mode 100644 target/linux/x86/geode/config-5.15 delete mode 100644 target/linux/x86/legacy/config-5.10 create mode 100644 target/linux/x86/legacy/config-5.15 delete mode 100644 target/linux/x86/patches-5.10/012-pcengines-apu2-detect-apuv4-board.patch delete mode 100644 target/linux/x86/patches-5.10/101-v5.15-mfd-lpc_ich-Enable-GPIO-driver-for-DH89xxCC.patch delete mode 100644 target/linux/x86/patches-5.10/102-v5.15-platform-x86-add-meraki-mx100-platform-driver.patch delete mode 100644 target/linux/x86/patches-5.10/300-pcengines_apu1_led.patch rename target/linux/x86/{patches-5.10 => patches-5.15}/100-fix_cs5535_clockevt.patch (100%) create mode 100644 target/linux/x86/patches-5.15/103-pcengines_apu6_platform.patch rename target/linux/x86/{patches-5.10 => patches-5.15}/113-v5.21-platform-x86-pmc_atom-Add-Lex-3I380NX-industrial-PC-.patch (100%) create mode 100644 target/linux/x86/patches-5.15/120-hwrng-geode-fix-accessing-registers.patch rename target/sdk/files/{README.SDK => README.md} (100%) create mode 100644 toolchain/binutils/patches/2.39/005-ld-fix-NEWS-typos.patch create mode 100644 toolchain/binutils/patches/2.39/008-gas-Dwarf-properly-skip-zero-size-functions.patch create mode 100644 toolchain/binutils/patches/2.39/009-PR29462-internal-error-in-relocate-at-powerpc.cc-107.patch create mode 100644 toolchain/binutils/patches/2.39/011-PR29466-APP-NO_APP-with-.linefile.patch create mode 100644 toolchain/binutils/patches/2.39/039-LoongArch-ld-Fix-relocation-error-of-pcrel.patch create mode 100644 toolchain/binutils/patches/2.39/043-Re-PR29466-APP-NO_APP-with-linefile.patch create mode 100644 toolchain/binutils/patches/2.39/050-PowerPC64-pcrel-got-relocs-against-local-symbols.patch create mode 100644 toolchain/binutils/patches/2.39/055-Re-PowerPC64-pcrel-got-relocs-against-local-symbols.patch create mode 100644 toolchain/binutils/patches/2.39/058-elf-Reset-alignment-for-each-PT_LOAD-segment.patch create mode 100644 toolchain/binutils/patches/2.39/063-PR29542-PowerPC-gold-internal-error-in-get_output_vi.patch create mode 100644 toolchain/binutils/patches/2.39/116-arm-Use-DWARF-numbering-convention-for-pseudo-regist.patch create mode 100644 toolchain/binutils/patches/2.39/300-001_ld_makefile_patch.patch create mode 100644 toolchain/binutils/patches/2.39/400-mips_no_dynamic_linking_sym.patch create mode 100644 toolchain/binutils/patches/2.39/500-Change-default-emulation-for-mips64-linux.patch create mode 100644 toolchain/binutils/patches/2.40/005-libctf-update-regexp-to-allow-makeinfo-to-build-docu.patch create mode 100644 toolchain/binutils/patches/2.40/007-Fix-version-number-snafu-in-some-configuration-files.patch create mode 100644 toolchain/binutils/patches/2.40/010-toplevel-Makefile.def-add-install-strip-dependency-o.patch create mode 100644 toolchain/binutils/patches/2.40/018-gprofng-PR29521-docs-man-pages-are-not-in-the-releas.patch create mode 100644 toolchain/binutils/patches/2.40/020-gprofng-PR30043-libgprofng.so.-are-installed-to-a-wr.patch create mode 100644 toolchain/binutils/patches/2.40/026-RISC-V-make-C-extension-JAL-available-again-for-32-b.patch create mode 100644 toolchain/binutils/patches/2.40/034-bpf-fix-error-conversion-from-long-unsigned-int-to-u.patch create mode 100644 toolchain/binutils/patches/2.40/035-Pass-JANSSON_LIBS-and-ZSTD_LIBS-to-ld-bootstrap-boot.patch create mode 100644 toolchain/binutils/patches/2.40/036-Regen-config-files.patch create mode 100644 toolchain/binutils/patches/2.40/040-configure-remove-dependencies-on-gmp-and-mpfr-when-g.patch create mode 100644 toolchain/binutils/patches/2.40/046-gas-correct-symbol-name-comparison-in-.startof.-.siz.patch create mode 100644 toolchain/binutils/patches/2.40/300-001_ld_makefile_patch.patch create mode 100644 toolchain/binutils/patches/2.40/400-mips_no_dynamic_linking_sym.patch create mode 100644 toolchain/binutils/patches/2.40/500-Change-default-emulation-for-mips64-linux.patch create mode 100644 toolchain/fortify-headers/patches/001-__ppoll_time64.patch create mode 100644 toolchain/fortify-headers/patches/002-strings.h-add-__extension__-mark.patch rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/002-case_insensitive.patch (100%) create mode 100644 toolchain/gcc/patches-11.x/010-documentation.patch create mode 100644 toolchain/gcc/patches-11.x/011-v12-configure-define-TARGET_LIBC_GNUSTACK-on-musl.patch rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/110-Fix-MIPS-PR-84790.patch (100%) rename toolchain/gcc/{patches/11.2.0 => patches-11.x}/230-musl_libssp.patch (100%) rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/300-mips_Os_cpu_rtx_cost_model.patch (100%) create mode 100644 toolchain/gcc/patches-11.x/400-libsanitizer-cherry-pick-9cf13067cb5088626ba7-from-u.patch create mode 100644 toolchain/gcc/patches-11.x/700-RISCV-Inline-subword-atomic-ops.patch create mode 100644 toolchain/gcc/patches-11.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/810-arm-softfloat-libgcc.patch (100%) rename toolchain/gcc/{patches/11.2.0 => patches-11.x}/820-libgcc_pic.patch (100%) rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/840-armv4_pass_fix-v4bx_to_ld.patch (100%) rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/850-use_shared_libgcc.patch (100%) rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/851-libgcc_no_compat.patch (100%) rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/870-ppc_no_crtsavres.patch (100%) rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/881-no_tm_section.patch (100%) rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/900-bad-mips16-crt.patch (100%) create mode 100644 toolchain/gcc/patches-11.x/910-mbsd_multi.patch create mode 100644 toolchain/gcc/patches-11.x/920-specs_nonfatal_getenv.patch rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/931-libffi-fix-MIPS-softfloat-build-issue.patch (100%) rename toolchain/gcc/{patches/10.3.0 => patches-11.x}/960-gotools-fix-compilation-when-making-cross-compiler.patch (100%) rename toolchain/gcc/{patches/11.2.0 => patches-11.x}/970-macos_arm64-building-fix.patch (100%) rename toolchain/gcc/{patches/11.2.0 => patches-12.x}/002-case_insensitive.patch (100%) create mode 100644 toolchain/gcc/patches-12.x/010-documentation.patch create mode 100644 toolchain/gcc/patches-12.x/110-Fix-MIPS-PR-84790.patch create mode 100644 toolchain/gcc/patches-12.x/230-musl_libssp.patch create mode 100644 toolchain/gcc/patches-12.x/300-mips_Os_cpu_rtx_cost_model.patch create mode 100644 toolchain/gcc/patches-12.x/700-RISCV-Inline-subword-atomic-ops.patch create mode 100644 toolchain/gcc/patches-12.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch rename toolchain/gcc/{patches/11.2.0 => patches-12.x}/810-arm-softfloat-libgcc.patch (100%) create mode 100644 toolchain/gcc/patches-12.x/820-libgcc_pic.patch rename toolchain/gcc/{patches/11.2.0 => patches-12.x}/840-armv4_pass_fix-v4bx_to_ld.patch (100%) create mode 100644 toolchain/gcc/patches-12.x/850-use_shared_libgcc.patch rename toolchain/gcc/{patches/11.2.0 => patches-12.x}/851-libgcc_no_compat.patch (100%) create mode 100644 toolchain/gcc/patches-12.x/870-ppc_no_crtsavres.patch rename toolchain/gcc/{patches/11.2.0 => patches-12.x}/881-no_tm_section.patch (100%) rename toolchain/gcc/{patches/11.2.0 => patches-12.x}/900-bad-mips16-crt.patch (100%) create mode 100644 toolchain/gcc/patches-12.x/910-mbsd_multi.patch create mode 100644 toolchain/gcc/patches-12.x/920-specs_nonfatal_getenv.patch rename toolchain/gcc/{patches/11.2.0 => patches-12.x}/960-gotools-fix-compilation-when-making-cross-compiler.patch (100%) create mode 100644 toolchain/gcc/patches-12.x/970-macos_arm64-building-fix.patch create mode 100644 toolchain/gcc/patches-13.x/001-rtl-optimization-109585-alias-analysis-typo.patch create mode 100644 toolchain/gcc/patches-13.x/002-case_insensitive.patch create mode 100644 toolchain/gcc/patches-13.x/010-documentation.patch create mode 100644 toolchain/gcc/patches-13.x/110-Fix-MIPS-PR-84790.patch create mode 100644 toolchain/gcc/patches-13.x/230-musl_libssp.patch create mode 100644 toolchain/gcc/patches-13.x/300-mips_Os_cpu_rtx_cost_model.patch create mode 100644 toolchain/gcc/patches-13.x/700-RISCV-Inline-subword-atomic-ops.patch create mode 100644 toolchain/gcc/patches-13.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch rename toolchain/gcc/{patches/8.4.0 => patches-13.x}/810-arm-softfloat-libgcc.patch (100%) create mode 100644 toolchain/gcc/patches-13.x/820-libgcc_pic.patch create mode 100644 toolchain/gcc/patches-13.x/840-armv4_pass_fix-v4bx_to_ld.patch create mode 100644 toolchain/gcc/patches-13.x/850-use_shared_libgcc.patch rename toolchain/gcc/{patches/8.4.0 => patches-13.x}/851-libgcc_no_compat.patch (100%) create mode 100644 toolchain/gcc/patches-13.x/870-ppc_no_crtsavres.patch create mode 100644 toolchain/gcc/patches-13.x/881-no_tm_section.patch rename toolchain/gcc/{patches/8.4.0 => patches-13.x}/900-bad-mips16-crt.patch (100%) create mode 100644 toolchain/gcc/patches-13.x/910-mbsd_multi.patch create mode 100644 toolchain/gcc/patches-13.x/920-specs_nonfatal_getenv.patch create mode 100644 toolchain/gcc/patches-13.x/960-gotools-fix-compilation-when-making-cross-compiler.patch create mode 100644 toolchain/gcc/patches-13.x/970-macos_arm64-building-fix.patch delete mode 100644 toolchain/gcc/patches/10.3.0/010-documentation.patch delete mode 100644 toolchain/gcc/patches/10.3.0/230-musl_libssp.patch delete mode 100644 toolchain/gcc/patches/10.3.0/820-libgcc_pic.patch delete mode 100644 toolchain/gcc/patches/10.3.0/910-mbsd_multi.patch delete mode 100644 toolchain/gcc/patches/10.3.0/920-specs_nonfatal_getenv.patch delete mode 100644 toolchain/gcc/patches/10.3.0/930-fix-mips-noexecstack.patch delete mode 100644 toolchain/gcc/patches/11.2.0/001-v11.3.0-ranger-Fix-up-fold_using_range-range_of_address-PR10.patch delete mode 100644 toolchain/gcc/patches/11.2.0/010-documentation.patch delete mode 100644 toolchain/gcc/patches/11.2.0/011-v12-configure-define-TARGET_LIBC_GNUSTACK-on-musl.patch delete mode 100644 toolchain/gcc/patches/11.2.0/110-Fix-MIPS-PR-84790.patch delete mode 100644 toolchain/gcc/patches/11.2.0/300-mips_Os_cpu_rtx_cost_model.patch delete mode 100644 toolchain/gcc/patches/11.2.0/850-use_shared_libgcc.patch delete mode 100644 toolchain/gcc/patches/11.2.0/870-ppc_no_crtsavres.patch delete mode 100644 toolchain/gcc/patches/11.2.0/910-mbsd_multi.patch delete mode 100644 toolchain/gcc/patches/11.2.0/920-specs_nonfatal_getenv.patch delete mode 100644 toolchain/gcc/patches/11.2.0/931-libffi-fix-MIPS-softfloat-build-issue.patch delete mode 100644 toolchain/gcc/patches/8.4.0/002-case_insensitive.patch delete mode 100644 toolchain/gcc/patches/8.4.0/010-documentation.patch delete mode 100644 toolchain/gcc/patches/8.4.0/110-Fix-MIPS-PR-84790.patch delete mode 100644 toolchain/gcc/patches/8.4.0/230-musl_libssp.patch delete mode 100644 toolchain/gcc/patches/8.4.0/300-mips_Os_cpu_rtx_cost_model.patch delete mode 100644 toolchain/gcc/patches/8.4.0/800-arm_v5te_no_ldrd_strd.patch delete mode 100644 toolchain/gcc/patches/8.4.0/820-libgcc_pic.patch delete mode 100644 toolchain/gcc/patches/8.4.0/840-armv4_pass_fix-v4bx_to_ld.patch delete mode 100644 toolchain/gcc/patches/8.4.0/850-use_shared_libgcc.patch delete mode 100644 toolchain/gcc/patches/8.4.0/870-ppc_no_crtsavres.patch delete mode 100644 toolchain/gcc/patches/8.4.0/881-no_tm_section.patch delete mode 100644 toolchain/gcc/patches/8.4.0/910-mbsd_multi.patch delete mode 100644 toolchain/gcc/patches/8.4.0/920-specs_nonfatal_getenv.patch delete mode 100644 toolchain/gcc/patches/8.4.0/930-fix-mips-noexecstack.patch delete mode 100644 toolchain/gcc/patches/8.4.0/931-libffi-fix-MIPS-softfloat-build-issue.patch delete mode 100644 toolchain/gcc/patches/8.4.0/960-gotools-fix-compilation-when-making-cross-compiler.patch delete mode 100644 toolchain/musl/patches/800-mips_pie_debug.patch create mode 100644 tools/7z/Makefile create mode 100644 tools/7z/patches/7-zip-flags.patch create mode 100644 tools/7z/patches/7-zip-musl.patch delete mode 100644 tools/autoconf/patches/001-no_emacs_lib.patch delete mode 100644 tools/autoconf/patches/002-musl_host_fixup.patch create mode 100644 tools/automake/patches/101-do-not-require-files.patch create mode 100644 tools/automake/patches/200-other-V-values-for-verbosity.patch create mode 100644 tools/bc/patches/002-fix-libmath.patch create mode 100644 tools/bzip2/Makefile create mode 100644 tools/bzip2/patches/020-no-utime.patch create mode 100644 tools/bzip2/patches/021-merge-and-improve-makefiles.patch delete mode 100755 tools/ccache/files/ccache_cc delete mode 100755 tools/ccache/files/ccache_cxx create mode 100644 tools/cmake/patches/110-liblzma.patch create mode 100644 tools/cmake/patches/140-zlib.patch create mode 100644 tools/cmake/patches/150-zstd-libarchive.patch create mode 100644 tools/coreutils/patches/000-bootstrap.patch delete mode 100644 tools/cpio/patches/001-duplicate-program-name.patch delete mode 100644 tools/cpio/patches/010-clang.patch create mode 100644 tools/dosfstools/patches/100-source-date-epoch.patch create mode 100644 tools/dosfstools/patches/101-config-switch-to-AC_CHECK_LIB.patch create mode 100644 tools/dwarves/Makefile delete mode 100644 tools/e2fsprogs/patches/004-CVE-2022-1304-libext2fs-add-sanity-check-to-extent-manipulation.patch create mode 100644 tools/elfutils/Makefile delete mode 100644 tools/flex/patches/100-disable-tests-docs.patch delete mode 100644 tools/genext2fs/patches/100-c99_scanf.patch delete mode 100644 tools/genext2fs/patches/200-autoconf.patch delete mode 100644 tools/genext2fs/patches/300-blocksize-creator.patch delete mode 100644 tools/genext2fs/patches/400-byteswap_fix.patch delete mode 100644 tools/gengetopt/patches/100-no-tests-docs.patch create mode 100644 tools/gnulib/Makefile create mode 100644 tools/gnulib/patches/000-bootstrap.patch create mode 100644 tools/libdeflate/Makefile create mode 100644 tools/liblzo/Makefile create mode 100644 tools/liblzo/patches/001-add-cmake-ENABLE-configurables.patch create mode 100644 tools/libtool/patches/130-trailingslash.patch create mode 100644 tools/libtool/patches/140-don-t-quote-SHELL-in-Makefile.am.patch delete mode 100644 tools/libtool/patches/150-trailingslash.patch delete mode 100644 tools/libtool/patches/160-passthrough-ssp.patch create mode 100644 tools/lz4/Makefile create mode 100644 tools/lz4/patches/001-add-make-ENABLE_DOCS-configurable.patch create mode 100644 tools/lz4/patches/002-makefile-install-links-from-same-dir.patch create mode 100644 tools/lzop/Makefile create mode 100644 tools/lzop/patches/001-add-cmake-ENABLE_DOCS-configurable.patch delete mode 100644 tools/missing-macros/src/m4/inttypes_h.m4 delete mode 100644 tools/missing-macros/src/m4/lib-ld.m4 delete mode 100644 tools/missing-macros/src/m4/lib-link.m4 delete mode 100644 tools/missing-macros/src/m4/lib-prefix.m4 delete mode 100644 tools/missing-macros/src/m4/progtest.m4 delete mode 100644 tools/missing-macros/src/m4/stdint_h.m4 delete mode 100644 tools/missing-macros/src/m4/wint_t.m4 delete mode 100644 tools/mkimage/patches/090-macos-arm64-builing-fix.patch create mode 100644 tools/sed/patches/001-sed-fix-handling-of-symlinks-pointing-to-path-with-1.patch delete mode 100644 tools/squashfs/Makefile create mode 100644 tools/squashfs3-lzma/Makefile rename tools/{squashfs => squashfs3-lzma}/patches/100-lzma.patch (100%) rename tools/{squashfs => squashfs3-lzma}/patches/110-no_nonstatic_inline.patch (100%) rename tools/{squashfs => squashfs3-lzma}/patches/120-add-fixed-timestamp-support.patch (100%) rename tools/{squashfs => squashfs3-lzma}/patches/130-include_sysmacros.patch (100%) rename tools/{squashfs => squashfs3-lzma}/patches/140-gcc-10-fix.patch (100%) create mode 100644 tools/squashfs3-lzma/patches/150-fix-unitialized-memory.patch create mode 100644 tools/squashfs4/Makefile create mode 100644 tools/squashfs4/patches/001-xz_wrapper-support-multiple-lzma-configuration-optio.patch create mode 100644 tools/squashfs4/patches/002-xz_wrapper-make-new-OpenWrt-extended-options-non-def.patch delete mode 100644 tools/squashfskit4/Makefile delete mode 100644 tools/squashfskit4/patches/0001-fix-version.sh.patch delete mode 100644 tools/squashfskit4/patches/0002-fix-build-failure-against-gcc-10.patch delete mode 100644 tools/squashfskit4/patches/0010-portability.patch delete mode 100644 tools/squashfskit4/patches/0020-big-endian.patch delete mode 100644 tools/zlib/patches/006-fix-compressor-crash-on-certain-inputs.patch diff --git a/.gitignore b/.gitignore index fb2b8e2715..2bcd02724e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ /dl /.config /.config.old +/.toolchain_build_ver /bin /build_dir /staging_dir @@ -13,10 +14,12 @@ /feeds /feeds.conf /files +/target/linux/feeds /overlay /package/feeds /package/openwrt-packages /*.patch +/llvm-bpf* key-build* *.orig *.rej @@ -26,13 +29,10 @@ key-build* .emacs.desktop* TAGS*~ git-src -*.o -*.so -*.swp -*.po~ +.project +.cproject +.ccache +.vscode* /package/luci/modules/luci-base/src/po2lmo -/package/luci/modules/luci-base/src/jsmin -/scripts/config/conf /scripts/config/mconf -/scripts/config/mconf-cfg -/scripts/config/mconf_check +/scripts/config/conf diff --git a/Makefile b/Makefile index 9d980ec95a..63c8ec90c9 100644 --- a/Makefile +++ b/Makefile @@ -14,8 +14,10 @@ $(if $(findstring $(space),$(TOPDIR)),$(error ERROR: The path to the libreCMC di world: -DISTRO_PKG_CONFIG:=$(shell $(TOPDIR)/scripts/command_all.sh pkg-config | grep '/usr' | head -n 1) -export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH) +DISTRO_PKG_CONFIG:=$(shell $(TOPDIR)/scripts/command_all.sh pkg-config | grep -e '/usr' -e '/nix/store' -m 1) + +export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH)) +export PATH:=$(if $(STAGING_DIR),$(abspath $(STAGING_DIR)/../host/bin),$(TOPDIR)/staging_dir/host/bin):$(PATH) ifneq ($(LIBRECMC_BUILD),1) _SINGLE=export MAKEFLAGS=$(space); diff --git a/README.md b/README.md new file mode 100644 index 0000000000..41cbbe3256 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# libreCMC : The _libre_ Embedded GNU/Linux Distro. + +The libreCMC project provides replacement software for consumer-grade +routers in the form of a small GNU/Linux distro. The software and tools +that the project distributes allow users to take back control of +their devices from hardware manufactures. Because libreCMC is [Free +Software](http://www.gnu.org/philosophy/free-sw.en.html), users are +able to unlock the ability to control and breath new life into +devices the project supports. + +## Useful links: + +* [libreCMC FAQ](docs/FAQ.md) : WIP + +* [Getting Started with libreCMC]() : WIP + +* [Supported Hardware](docs/Supported_Hardware.md): Devices officially supported by libreCMC. + +* [Router reset instructions](docs/Router_Reset_Instructions.md) : Generic libreCMC router reset instructions. + +* [Report a bug or issue](https://gogs.librecmc.org/libreCMC/libreCMC/issues) : Is + something broken? Did you find a non-free component or do you want + to make libreCMC better? Submit an issue. + +* [Get libreCMC source code](https://gogs.librecmc.org/libreCMC/libreCMC) : Checkout the latest libreCMC sources. + +* [Build Documentation](docs/How_To_Build_libreCMC.md) : Learn how to build libreCMC for your device. diff --git a/config/Config-build.in b/config/Config-build.in index 7db4aa1f05..25b0376320 100644 --- a/config/Config-build.in +++ b/config/Config-build.in @@ -5,7 +5,6 @@ config EXPERIMENTAL bool "Enable experimental features by default" - default n help Set this option to build with latest bleeding edge features which may or may not work as expected. @@ -27,6 +26,14 @@ menu "Global build settings" directory containing machine readable list of built profiles and resulting images. + config JSON_CYCLONEDX_SBOM + bool "Create CycloneDX SBOM JSON" + default BUILDBOT + help + Create a JSON files *.bom.cdx.json in the build + directory containing Software Bill Of Materials in CycloneDX + format. + config ALL_NONSHARED bool "Select all target specific packages by default" select ALL_KMODS @@ -42,7 +49,6 @@ menu "Global build settings" config BUILDBOT bool "Set build defaults for automatic builds (e.g. via buildbot)" - default n help This option changes several defaults to be more suitable for automatic builds. This includes the following changes: @@ -75,10 +81,8 @@ menu "Global build settings" config DISPLAY_SUPPORT bool "Show packages that require graphics support (local or remote)" - default n config BUILD_PATENTED - default n bool "Compile with support for patented functionality" help When this option is disabled, software which provides patented functionality @@ -86,7 +90,6 @@ menu "Global build settings" functionality, this optional support will get disabled for this package. config BUILD_NLS - default n bool "Compile with full language support" help When this option is enabled, packages are built with the full versions of @@ -100,7 +103,6 @@ menu "Global build settings" config CLEAN_IPKG bool prompt "Remove ipkg/opkg status data files in final images" - default n help This removes all ipkg/opkg status data files from the target directory before building the root filesystem. @@ -108,14 +110,12 @@ menu "Global build settings" config IPK_FILES_CHECKSUMS bool prompt "Record files checksums in package metadata" - default n help This makes file checksums part of package metadata. It increases size but provides you with pkg_check command to check for flash corruptions. config INCLUDE_CONFIG bool "Include build configuration in firmware" if DEVEL - default n help If enabled, buildinfo files will be stored in /etc/build.* of firmware. @@ -149,16 +149,26 @@ menu "Global build settings" config DEBUG bool prompt "Compile packages with debugging info" - default n help Adds -g3 to the CFLAGS. - config IPV6 + config USE_GC_SECTIONS bool - prompt "Enable IPv6 support in packages" - default y + prompt "Dead code and data elimination for all packages (EXPERIMENTAL)" help - Enables IPv6 support in kernel (builtin) and packages. + Places functions and data items into its own sections to use the linker's + garbage collection capabilites. + Packages can choose to opt-out via setting PKG_BUILD_FLAGS:=no-gc-sections + + config USE_LTO + bool + prompt "Use the link-time optimizer for all packages (EXPERIMENTAL)" + help + Adds LTO flags to the CFLAGS and LDFLAGS. + Packages can choose to opt-out via setting PKG_BUILD_FLAGS:=no-lto + + config IPV6 + def_bool y comment "Stripping options" diff --git a/config/Config-devel.in b/config/Config-devel.in index 738048a708..1e24032105 100644 --- a/config/Config-devel.in +++ b/config/Config-devel.in @@ -4,11 +4,9 @@ menuconfig DEVEL bool "Advanced configuration options (for developers)" - default n config BROKEN bool "Show broken platforms / packages / devices" if DEVEL - default n config BINARY_FOLDER string "Binary folder" if DEVEL @@ -17,6 +15,20 @@ menuconfig DEVEL Store built firmware images and filesystem images in this directory. If not set, uses './bin/$(BOARD)' + config DOWNLOAD_TOOL_CUSTOM + string "Use custom download tool" if DEVEL + default "" + help + Use and force custom download tool instead of relying on autoselection + between curl if available and wget as a fallback. + + download.pl supports 3 tools officially aria2c, curl and wget. + If one of the tool is used in this config, download.pl will use the + default args to make use of them. + + If the provided string is different than aria2c, curl or wget, the command + is used as is and the download url will be appended at the end of such command. + config DOWNLOAD_FOLDER string "Download folder" if DEVEL default "" @@ -39,12 +51,17 @@ menuconfig DEVEL config AUTOREMOVE bool "Automatic removal of build directories" if DEVEL - default n help Automatically delete build directories after make target completed. This allows you to symlink build_dir into a scratch location, e.g. a ramdisk, which does not have enough space to keep a complete build_dir. + config BUILD_ALL_HOST_TOOLS + bool "Compile all host tools" if DEVEL + help + Compile all host host tools even if not needed. This is needed to prepare a + universal precompiled host tools archive to use in another buildroot. + config BUILD_SUFFIX string "Build suffix to append to the target BUILD_DIR variable" if DEVEL default "" @@ -63,7 +80,6 @@ menuconfig DEVEL config CCACHE bool "Use ccache" if DEVEL - default n help Compiler cache; see https://ccache.samba.org/ diff --git a/config/Config-images.in b/config/Config-images.in index 8d2e8f7a6f..5ef9702a14 100644 --- a/config/Config-images.in +++ b/config/Config-images.in @@ -17,6 +17,7 @@ menu "Target Images" default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_lantiq default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_mpc85xx default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_ramips + default TARGET_INITRAMFS_COMPRESSION_ZSTD if TARGET_ipq807x default TARGET_INITRAMFS_COMPRESSION_XZ if USES_SEPARATE_INITRAMFS default TARGET_INITRAMFS_COMPRESSION_NONE depends on TARGET_ROOTFS_INITRAMFS @@ -36,18 +37,15 @@ menu "Target Images" bool "lzma" config TARGET_INITRAMFS_COMPRESSION_LZO - depends on !TARGET_ROOTFS_INITRAMFS_SEPARATE bool "lzo" config TARGET_INITRAMFS_COMPRESSION_LZ4 - depends on !TARGET_ROOTFS_INITRAMFS_SEPARATE bool "lz4" config TARGET_INITRAMFS_COMPRESSION_XZ bool "xz" config TARGET_INITRAMFS_COMPRESSION_ZSTD - depends on !LINUX_5_4 && !LINUX_4_19 bool "zstd" endchoice @@ -61,7 +59,6 @@ menu "Target Images" config TARGET_INITRAMFS_FORCE bool "Force" depends on TARGET_ROOTFS_INITRAMFS - default n help Ignore the initramfs passed by the bootloader. @@ -130,7 +127,6 @@ menu "Target Images" config TARGET_EXT4_JOURNAL bool "Create a journaling filesystem" depends on TARGET_ROOTFS_EXT4FS - default n help Create an ext4 filesystem with a journal. @@ -151,7 +147,7 @@ menu "Target Images" bool "squashfs" default y if USES_SQUASHFS help - Build a squashfs-lzma root filesystem. + Build a squashfs root filesystem. config TARGET_SQUASHFS_BLOCK_SIZE int "Block size (in KiB)" @@ -159,6 +155,9 @@ menu "Target Images" default 64 if LOW_MEMORY_FOOTPRINT default 1024 if (SMALL_FLASH && !LOW_MEMORY_FOOTPRINT) default 256 + help + Select squashfs block size, must be one of: + 4, 8, 16, 32, 64, 128, 256, 512, 1024 menuconfig TARGET_ROOTFS_UBIFS bool "ubifs" @@ -205,11 +204,12 @@ menu "Target Images" config GRUB_EFI_IMAGES bool "Build GRUB EFI images (Linux x86 or x86_64 host only)" - depends on TARGET_x86 + depends on TARGET_x86 || TARGET_armsr depends on TARGET_ROOTFS_EXT4FS || TARGET_ROOTFS_JFFS2 || TARGET_ROOTFS_SQUASHFS - select PACKAGE_grub2 - select PACKAGE_grub2-efi - select PACKAGE_grub2-bios-setup + select PACKAGE_grub2 if TARGET_x86 + select PACKAGE_grub2-efi if TARGET_x86 + select PACKAGE_grub2-bios-setup if TARGET_x86 + select PACKAGE_grub2-efi-arm if TARGET_armsr select PACKAGE_kmod-fs-vfat default y @@ -232,7 +232,6 @@ menu "Target Images" config GRUB_FLOWCONTROL bool "Use RTE/CTS on serial console" depends on GRUB_SERIAL != "" - default n config GRUB_BOOTOPTS string "Extra kernel boot options" @@ -268,7 +267,7 @@ menu "Target Images" config VMDK_IMAGES bool "Build VMware image files (VMDK)" - depends on TARGET_x86 + depends on TARGET_x86 || TARGET_armsr depends on GRUB_IMAGES || GRUB_EFI_IMAGES select PACKAGE_kmod-e1000 @@ -280,7 +279,7 @@ menu "Target Images" config TARGET_IMAGES_GZIP bool "GZip images" - depends on TARGET_ROOTFS_EXT4FS || TARGET_x86 || TARGET_armvirt || TARGET_malta + depends on TARGET_ROOTFS_EXT4FS || TARGET_x86 || TARGET_armsr || TARGET_malta default y comment "Image Options" @@ -293,6 +292,7 @@ menu "Target Images" depends on USES_BOOT_PART default 8 if TARGET_apm821xx_sata default 64 if TARGET_bcm27xx + default 128 if TARGET_armsr default 16 config TARGET_ROOTFS_PARTSIZE @@ -312,7 +312,6 @@ menu "Target Images" config TARGET_ROOTFS_PERSIST_VAR bool "Make /var persistent" - default n help Do not symlink /var to /tmp, so that its content will persist across reboots. When enabled, /var/run will still be linked diff --git a/config/Config-kernel.in b/config/Config-kernel.in index f44b3d0a29..c4345f9fb5 100644 --- a/config/Config-kernel.in +++ b/config/Config-kernel.in @@ -47,12 +47,11 @@ config KERNEL_MIPS_FP_SUPPORT config KERNEL_ARM_PMU bool - default n + default y if TARGET_armsr_armv8 depends on (arm || aarch64) config KERNEL_X86_VSYSCALL_EMULATION bool "Enable vsyscall emulation" - default n depends on x86_64 help This enables emulation of the legacy vsyscall page. Disabling @@ -70,17 +69,20 @@ config KERNEL_X86_VSYSCALL_EMULATION config KERNEL_PERF_EVENTS bool "Compile the kernel with performance events and counters" - default n select KERNEL_ARM_PMU if (arm || aarch64) config KERNEL_PROFILING bool "Compile the kernel with profiling enabled" - default n select KERNEL_PERF_EVENTS help Enable the extended profiling support mechanisms used by profilers such as OProfile. +config KERNEL_RPI_AXIPERF + bool "Compile the kernel with RaspberryPi AXI Performance monitors" + default y + depends on KERNEL_PERF_EVENTS && TARGET_bcm27xx + config KERNEL_UBSAN bool "Compile the kernel with undefined behaviour sanity checker" help @@ -250,7 +252,6 @@ config KERNEL_KCOV_INSTRUMENT_ALL config KERNEL_TASKSTATS bool "Compile the kernel with task resource/io statistics and accounting" - default n help Enable the collection and publishing of task/io statistics and accounting. Enable this option to enable i/o monitoring in system @@ -278,37 +279,30 @@ config KERNEL_KALLSYMS config KERNEL_FTRACE bool "Compile the kernel with tracing support" depends on !TARGET_uml - default n config KERNEL_FTRACE_SYSCALLS bool "Trace system calls" depends on KERNEL_FTRACE - default n config KERNEL_ENABLE_DEFAULT_TRACERS bool "Trace process context switches and events" depends on KERNEL_FTRACE - default n config KERNEL_FUNCTION_TRACER bool "Function tracer" depends on KERNEL_FTRACE - default n config KERNEL_FUNCTION_GRAPH_TRACER bool "Function graph tracer" depends on KERNEL_FUNCTION_TRACER - default n config KERNEL_DYNAMIC_FTRACE bool "Enable/disable function tracing dynamically" depends on KERNEL_FUNCTION_TRACER - default n config KERNEL_FUNCTION_PROFILER bool "Function profiler" depends on KERNEL_FUNCTION_TRACER - default n config KERNEL_IRQSOFF_TRACER bool "Interrupts-off Latency Tracer" @@ -359,7 +353,6 @@ config KERNEL_HIST_TRIGGERS config KERNEL_DEBUG_KERNEL bool - default n config KERNEL_DEBUG_INFO bool "Compile the kernel with debug information" @@ -368,6 +361,48 @@ config KERNEL_DEBUG_INFO help This will compile your kernel and modules with debug information. +config KERNEL_DEBUG_INFO_BTF + + bool "Enable additional BTF type information" + depends on !HOST_OS_MACOS + depends on KERNEL_DEBUG_INFO && !KERNEL_DEBUG_INFO_REDUCED + select DWARVES + help + Generate BPF Type Format (BTF) information from DWARF debug info. + Turning this on expects presence of pahole tool, which will convert + DWARF type info into equivalent deduplicated BTF type info. + + Required to run BPF CO-RE applications. + +config KERNEL_DEBUG_INFO_REDUCED + bool "Reduce debugging information" + default y + depends on KERNEL_DEBUG_INFO + help + If you say Y here gcc is instructed to generate less debugging + information for structure types. This means that tools that + need full debugging information (like kgdb or systemtap) won't + be happy. But if you merely need debugging information to + resolve line numbers there is no loss. Advantage is that + build directory object sizes shrink dramatically over a full + DEBUG_INFO build and compile times are reduced too. + Only works with newer gcc versions. + +config KERNEL_FRAME_WARN + int + range 0 8192 + default 1280 if KERNEL_KASAN && !ARCH_64BIT + default 1024 if !ARCH_64BIT + default 2048 if ARCH_64BIT + help + Tell the compiler to warn at build time for stack frames larger than this. + Setting this too low will cause a lot of warnings. + Setting it to 0 disables the warning. + +# KERNEL_DEBUG_LL symbols must have the default value set as otherwise +# KConfig wont evaluate them unless KERNEL_EARLY_PRINTK is selected +# which means that buildroot wont override the DEBUG_LL symbols in target +# kernel configurations and lead to devices that dont have working console config KERNEL_DEBUG_LL_UART_NONE bool default n @@ -381,10 +416,16 @@ config KERNEL_DEBUG_LL help ARM low level debugging. +config KERNEL_DEBUG_VIRTUAL + bool "Compile the kernel with VM translations debugging" + select KERNEL_DEBUG_KERNEL + help + Enable checks sanity checks to catch invalid uses of + virt_to_phys()/phys_to_virt() against the non-linear address space. + config KERNEL_DYNAMIC_DEBUG bool "Compile the kernel with dynamic printk" select KERNEL_DEBUG_FS - default n help Compiles debug level messages into the kernel, which would not otherwise be available at runtime. These messages can then be @@ -396,7 +437,6 @@ config KERNEL_DYNAMIC_DEBUG config KERNEL_EARLY_PRINTK bool "Compile the kernel with early printk" default y if TARGET_bcm53xx - default n depends on arm select KERNEL_DEBUG_KERNEL select KERNEL_DEBUG_LL if arm @@ -407,7 +447,6 @@ config KERNEL_EARLY_PRINTK config KERNEL_KPROBES bool "Compile the kernel with kprobes support" - default n select KERNEL_FTRACE select KERNEL_PERF_EVENTS help @@ -422,6 +461,15 @@ config KERNEL_KPROBE_EVENTS bool default y if KERNEL_KPROBES +config KERNEL_BPF_EVENTS + bool "Compile the kernel with BPF event support" + select KERNEL_KPROBES + help + Allows to attach BPF programs to kprobe, uprobe and tracepoint events. + This is required to use BPF maps of type BPF_MAP_TYPE_PERF_EVENT_ARRAY + for sending data from BPF programs to user-space for post-processing + or logging. + config KERNEL_BPF_KPROBE_OVERRIDE bool depends on KERNEL_KPROBES @@ -433,7 +481,8 @@ config KERNEL_AIO config KERNEL_IO_URING bool "Compile the kernel with io_uring support" - default y if !SMALL_FLASH + depends on !SMALL_FLASH + default y if (x86_64 || aarch64) config KERNEL_FHANDLE bool "Compile the kernel with support for fhandle syscalls" @@ -445,7 +494,6 @@ config KERNEL_FANOTIFY config KERNEL_BLK_DEV_BSG bool "Compile the kernel with SCSI generic v4 support for any block device" - default n config KERNEL_TRANSPARENT_HUGEPAGE bool @@ -469,7 +517,6 @@ config KERNEL_HUGETLB_PAGE bool "Compile the kernel with HugeTLB support" select KERNEL_TRANSPARENT_HUGEPAGE select KERNEL_HUGETLBFS - default n config KERNEL_MAGIC_SYSRQ bool "Compile the kernel with SysRq support" @@ -494,7 +541,6 @@ config KERNEL_ELF_CORE config KERNEL_PROVE_LOCKING bool "Enable kernel lock checking" select KERNEL_DEBUG_KERNEL - default n config KERNEL_SOFTLOCKUP_DETECTOR bool "Compile the kernel with detect Soft Lockups" @@ -508,6 +554,18 @@ config KERNEL_SOFTLOCKUP_DETECTOR chance to run. The current stack trace is displayed upon detection and the system will stay locked up. +config KERNEL_HARDLOCKUP_DETECTOR + bool "Compile the kernel with detect Hard Lockups" + depends on KERNEL_DEBUG_KERNEL + help + Say Y here to enable the kernel to act as a watchdog to detect + hard lockups. + + Hardlockups are bugs that cause the CPU to loop in kernel mode + for more than 10 seconds, without letting other interrupts have a + chance to run. The current stack trace is displayed upon detection + and the system will stay locked up. + config KERNEL_DETECT_HUNG_TASK bool "Compile the kernel with detect Hung Tasks" depends on KERNEL_DEBUG_KERNEL @@ -596,11 +654,9 @@ config USE_RFKILL config USE_SPARSE bool "Enable sparse check during kernel build" - default n config KERNEL_DEVTMPFS bool "Compile the kernel with device tmpfs enabled" - default n help devtmpfs is a simple, kernel-managed /dev filesystem. The kernel creates devices nodes for all registered devices to simplify boot, but leaves more @@ -610,7 +666,6 @@ if KERNEL_DEVTMPFS config KERNEL_DEVTMPFS_MOUNT bool "Automatically mount devtmpfs after root filesystem is mounted" - default n endif @@ -621,17 +676,14 @@ config KERNEL_KEYS config KERNEL_PERSISTENT_KEYRINGS bool "Enable kernel persistent keyrings" depends on KERNEL_KEYS - default n config KERNEL_KEYS_REQUEST_CACHE bool "Enable temporary caching of the last request_key() result" depends on KERNEL_KEYS - default n config KERNEL_BIG_KEYS bool "Enable large payload keys on kernel keyrings" depends on KERNEL_KEYS - default n # # CGROUP support symbols @@ -645,7 +697,6 @@ if KERNEL_CGROUPS config KERNEL_CGROUP_DEBUG bool "Example debug cgroup subsystem" - default n help This option enables a simple cgroup subsystem that exports useful debugging information about the cgroups @@ -656,7 +707,6 @@ if KERNEL_CGROUPS config KERNEL_CGROUP_FREEZER bool "legacy Freezer cgroup subsystem" - default n select KERNEL_FREEZER help Provides a way to freeze and unfreeze all tasks in a @@ -666,7 +716,6 @@ if KERNEL_CGROUPS config KERNEL_CGROUP_DEVICE bool "legacy Device controller for cgroups" - default n help Provides a cgroup implementing whitelists for devices which a process in the cgroup can mknod or open. @@ -674,7 +723,6 @@ if KERNEL_CGROUPS config KERNEL_CGROUP_HUGETLB bool "HugeTLB controller" - default n select KERNEL_HUGETLB_PAGE config KERNEL_CGROUP_PIDS @@ -703,7 +751,6 @@ if KERNEL_CGROUPS config KERNEL_PROC_PID_CPUSET bool "Include legacy /proc//cpuset file" - default n depends on KERNEL_CPUSETS config KERNEL_CGROUP_CPUACCT @@ -728,7 +775,7 @@ if KERNEL_CGROUPS bool "Memory Resource Controller for Control Groups" default y select KERNEL_FREEZER - depends on KERNEL_RESOURCE_COUNTERS || !LINUX_3_18 + depends on KERNEL_RESOURCE_COUNTERS help Provides a memory resource controller that manages both anonymous memory and page cache. (See Documentation/cgroups/memory.txt) @@ -769,7 +816,6 @@ if KERNEL_CGROUPS config KERNEL_MEMCG_SWAP_ENABLED bool "Memory Resource Controller Swap Extension enabled by default" - default n depends on KERNEL_MEMCG_SWAP help Memory Resource Controller Swap Extension comes with its price in @@ -798,7 +844,6 @@ if KERNEL_CGROUPS config KERNEL_CGROUP_PERF bool "Enable perf_event per-cpu per-container group (cgroup) monitoring" select KERNEL_PERF_EVENTS - default n help This option extends the per-cpu mode to restrict monitoring to threads which belong to the cgroup specified and run on the @@ -875,7 +920,6 @@ if KERNEL_CGROUPS config KERNEL_DEBUG_BLK_CGROUP bool "Enable Block IO controller debugging" - default n depends on KERNEL_BLK_CGROUP help Enable some debugging help. Currently it exports additional stat @@ -883,15 +927,12 @@ if KERNEL_CGROUPS config KERNEL_NET_CLS_CGROUP bool "legacy Control Group Classifier" - default n config KERNEL_CGROUP_NET_CLASSID bool "legacy Network classid cgroup" - default n config KERNEL_CGROUP_NET_PRIO bool "legacy Network priority cgroup" - default n endif @@ -1057,6 +1098,34 @@ config KERNEL_NET_L3_MASTER_DEV This module provides glue between core networking code and device drivers to support L3 master devices like VRF. +config KERNEL_XDP_SOCKETS + bool "XDP sockets support" + help + XDP sockets allows a channel between XDP programs and + userspace applications. + +config KERNEL_WIRELESS_EXT + def_bool n + +config KERNEL_WEXT_CORE + def_bool KERNEL_WIRELESS_EXT + +config KERNEL_WEXT_PRIV + def_bool KERNEL_WIRELESS_EXT + +config KERNEL_WEXT_PROC + def_bool KERNEL_WIRELESS_EXT + +config KERNEL_WEXT_SPY + def_bool KERNEL_WIRELESS_EXT + +config KERNEL_PAGE_POOL + def_bool n + +config KERNEL_PAGE_POOL_STATS + bool "Page pool stats support" + depends on KERNEL_PAGE_POOL + # # NFS related symbols # @@ -1094,7 +1163,6 @@ endif menu "Filesystem ACL and attr support options" config USE_FS_ACL_ATTR bool "Use filesystem ACL and attr support by default" - default n help Make using ACLs (e.g. POSIX ACL, NFSv4 ACL) the default for kernel and packages, except tmpfs, flash filesystems, @@ -1119,17 +1187,14 @@ menu "Filesystem ACL and attr support options" config KERNEL_F2FS_FS_POSIX_ACL bool "Enable POSIX ACL for F2FS Filesystems" select KERNEL_FS_POSIX_ACL - default n config KERNEL_JFFS2_FS_POSIX_ACL bool "Enable POSIX ACL for JFFS2 Filesystems" select KERNEL_FS_POSIX_ACL - default n config KERNEL_TMPFS_POSIX_ACL bool "Enable POSIX ACL for TMPFS Filesystems" select KERNEL_FS_POSIX_ACL - default n config KERNEL_CIFS_ACL bool "Enable CIFS ACLs" @@ -1152,15 +1217,12 @@ menu "Filesystem ACL and attr support options" config KERNEL_NFS_V3_ACL_SUPPORT bool "Enable ACLs for NFSv3" - default n config KERNEL_NFSD_V2_ACL_SUPPORT bool "Enable ACLs for NFSDv2" - default n config KERNEL_NFSD_V3_ACL_SUPPORT bool "Enable ACLs for NFSDv3" - default n config KERNEL_REISER_FS_POSIX_ACL bool "Enable POSIX ACLs for ReiserFS" diff --git a/docs/Basic_Wireless_Settings.md b/docs/Basic_Wireless_Settings.md new file mode 100644 index 0000000000..0aa5943090 --- /dev/null +++ b/docs/Basic_Wireless_Settings.md @@ -0,0 +1,96 @@ +# Basic Wireless Settings + +This document is only intended to cover the most basic details of +Wi-Fi settings on LibreCMC, for people who do not know much about +computer networking. Geeks are encouraged to simply log in +to `192.168.10.1` and experiment with the settings. + +## Log in to the LuCi configuration interface + +First, you need a physical connection to the LibreCMC Wi-Fi +router. The simplest way is to connect an Ethernet cable between the +Ethernet port on your computer, and the LAN port on your router. An +Ethernet cable is like a fat telephone cable; usually you get one +included with your router. Tablets and smart phones usually don't have +an Ethernet port, so you might need to borrow a laptop. + +* In the address bar of your Web browser, enter the address + `192.168.10.1` and press `Enter` or `Return`. You should see a page + appear called `Authorization Required`. + +* If you see instead a page complaining that the connection is not + secure, you will need to add a security exception. On Mozilla + Firefox, you press the `Advanced` button and then the `Add + Exception` button, and then the `Confirm Security Exception` + button. + +* Enter the adminstrative Username and Password for your router. The + default is `root` for the Username and a blank password. + +![alt text](images/librecmc-default-login.png "Default login page for + LibreCMC") + +If a blank password does not work, and you cannot figure out what it +is supposed to be, you may need to +[reset the router](Router_Reset_Instructions.md). + +If you are unable to view the `Authorization Required` page, it may be +that you do not have your Ethernet cable connected to the correct +ports, or your computer is not set to allow use of the Ethernet +cable. Find a tech savvy relative to help you out. + +## Change the name of your Wi-Fi network + +* Select the `Network` >> `Wireless` menu. + +* Select the `Edit` button to the right side of "libreCMC". + +* Scroll down to the `ESSID` text field under the `Interface + Configuration` section. and enter the name you would like for your + Wi-Fi network. This is the name people will see when they are + looking to connect to your Wi-Fi network. + +![alt text](images/librecmc-changing-essid.png "Changing ESSID on LibreCMC") + +* If that is all you wanted to do, press the `Save & Apply` button at + the bottom of the page, or go on to the next section. + +## Change your Wi-Fi password + +* If you haven't already, Select the `Network` >> `Wireless` menu, and + select the `Edit` button to the right side of "libreCMC". + +* Select the `Wireless Security` tab under the `Interface + Configuration` section. + +* In the `Encryption` drop down menu select `WPA2-PSK`. (If you have + some really old devices on your network, it may be necessary to + select `WPA-PSK` instead, to get them to connect, but don't do this + unless you really need to.) + +* In the `Key` text field, put in the password you want people to use + to connect to your Wi-Fi network. If you press the green arrows + button, it will make it easier to type in the password. + +![alt text](images/librecmc-changing-wifi-password.png "Changing Wi-Fi + password on LibreCMC") + +* Press the `Save & Apply` button at the bottom of the page. + +## Change your Administrator password + +* There is a password used for logging into the LuCi configuration + interface. You typically want this to be different than the Wi-Fi password you share with other people. + +* Select the `System` >> `Administration` menu. + +* Under `Router Password` section, type a new password into the + `Password` text field. Pressing the green arrows button makes it + easier to type in your password. + +* Type the exact same password into the `Confirmation` text field. + +![alt text](images/librecmc-changing-admin-password.png "Changing + admin password on LibreCMC") + +* Press the `Save & Apply` button at the bottom of the page. diff --git a/docs/Ben_Nanonote.md b/docs/Ben_Nanonote.md new file mode 100644 index 0000000000..ec880e84dd --- /dev/null +++ b/docs/Ben_Nanonote.md @@ -0,0 +1,263 @@ + +## Overview + +* [JZ4720](https://web.archive.org/web/20110904201104/http://en.ingenic.cn/product.aspx?ID=60) 336 MHz MIPS compatible processor from [Ingenic Semiconductor Co.](http://www.ingenic.cn) + +* 3.0" 320x240 pixels [[LCD|colour TFT LCD]] (40x15 character in a text console) + +* 32MB [[SDRAM]] + +* 2GB [[NAND|NAND Flash]] Memory + +* 1 [[SD|microSDHC]] slot (SDIO capable) + +* 59 keys Keyboard + +* Stereo headphones connector, mono speaker and microphone [[Audio_IN_OUT|audio interfaces]]. + +* [USB](http://wiki.qi-hardware.com/wiki/USB_host) 2.0 High-Speed Device, [Mini B](http://en.wikipedia.org/wiki/USB#Connector_types) connector + +* 3.7V 850mAh Li-ion Battery ( [[Compatible_batteries|Compatible batteries]]) and 5V 500mA [[Power_Supply_Circuit|DC input through USB port]] + +* Measured battery life time, idle, screen off: 12h59 + +* Overall dimension (lid closed): 99 * 75 * 17.5mm. (display: 7.5mm, keyboard: 10mm) + +* Weight: 126g (includes battery) + +## Status + +* Flashing bootloader, kernel, and rootfs via USB works. +* Serial console via GND/RXD/TXD pads under the battery works. +* LCD works +** After a few minutes of inactivity on the console, it will go blank. Pressing any key brings it back. +* Keyboard works +* Audio/ALSA works. +* ... + +## Pinouts + +PCB 08.50 (ben) + +'''Micro-SD pins on testpads:''' + + Pin TP note + ------------------ + #1 TP14 data2 + #2 TP15 cd/data3 / _CS + #3 TP17 cmd / mosi + #4 sdVCC switched by Q4 (fet?) controlled via line from cpu (on TP11) + #5 TP16 clock + #6 GND + #7 TP12 data0 / miso + #8 TP13 data1 + +'''Serial pins:''' + +See [[Ben_source_code#serial_console]]. + +== System information == + + $ '''cat /proc/cpuinfo''' + system type : JZ4740 + processor : 0 + cpu model : Ingenic JZRISC V4.15 + BogoMIPS : 335.05 + wait instruction : yes + microsecond timers : no + tlb_entries : 32 + extra interrupt vector : yes + hardware watchpoint : yes, count: 1, address/irw mask: [0x0fff] + ASEs implemented : + shadow register sets : 1 + core : 0 + VCED exceptions : not available + VCEI exceptions : not available + + $ '''cat /proc/mtd''' + dev: size erasesize name + mtd0: 00400000 00080000 "NAND BOOT partition" + mtd1: 00400000 00080000 "NAND KERNEL partition" + mtd2: 20000000 00080000 "NAND ROOTFS partition" + mtd3: 5f800000 00080000 "NAND DATA partition" + + $ '''uname -a''' + Linux BenNanoNote 2.6.32.27 #1 PREEMPT Sat Mar 5 03:54:50 MSK 2011 mips GNU/Linux + + $ '''cat /proc/iomem''' + 00000000-01ffffff : System RAM + 00010000-0031162b : Kernel code + 0031162c-0040877f : Kernel data + 10003000-10003037 : jz4740-rtc + 10003000-10003037 : jz4740-rtc + 10020000-10020037 : jz4740-i2s + 10020000-10020037 : jz4740-i2s + 10020080-10020087 : jz4740-codec + 10020080-10020087 : jz4740-codec + 10021000-10030fff : jz4740-mmc.0 + 10021000-10030fff : jz4740-mmc + 10070000-10070030 : jz4740-adc + 10070000-10070030 : jz4740-adc + 13010000-1301ffff : jz4740-nand.0 + 13010000-1301ffff : jz4740-nand + 13030000-1303ffff : jz-ohci.0 + 13040000-1304ffff : jz-udc + 13040000-1304ffff : jz-udc + 13050000-1305ffff : jz4740-fb + 13050000-1305ffff : jz4740-fb + + $ '''cat /proc/interrupts''' + CPU0 + 2: 33611 MIPS JZ4740 cascade interrupt + 17: 20 INTC serial + 20: 56 INTC jz4740-adc + 22: 47 INTC MMC/SD + 23: 0 INTC jz4740-rtc + 28: 0 INTC DMA + 31: 32374 INTC jz4740-timerirq + 32: 527 INTC jz-udc + 147: 0 GPIO Bank C jz4740-battery + 152: 0 GPIO Bank D MMC/SD detect changed + 170: 0 GPIO Bank D matrix-keypad + 171: 94 GPIO Bank D matrix-keypad + 172: 77 GPIO Bank D matrix-keypad + 173: 17 GPIO Bank D matrix-keypad + 174: 151 GPIO Bank D matrix-keypad + 175: 13 GPIO Bank D matrix-keypad + 176: 235 GPIO Bank D matrix-keypad + 178: 0 GPIO Bank D matrix-keypad + 180: 0 GPIO Bank D gpio-charger.0 + 181: 0 GPIO Bank D Power + ERR: 0 + +== GPIO pins == + +The Jz4720 has only a limited number of pins as outputs to the board. Furthermore, several functions take up gpio pins which are therefore not usable for other functions. Those devices are the sdram and nand controller, lcd controller and mmc+sd controller. Below is a table showing how they are used. Please complete this table. The missing entries are not connected to a pad in the Jz4720. + +'''Port A:''' +* 01 sdram data 0 +* 03 sdram data 1 +* 05 sdram data 2 +* 07 sdram data 3 +* 08 sdram data 4 +* 09 sdram data 5 +* 10 sdram data 6 +* 11 sdram data 7 +* 12 sdram data 8 +* 13 sdram data 9 +* 15 sdram data 10 +* 17 sdram data 11 +* 22 sdram data 12 +* 26 sdram data 13 +* 28 sdram data 14 +* 30 sdram data 15 + +'''Port B:''' +* 00 sdram address 0 +* 01 sdram address 1 +* 02 sdram address 2 +* 03 sdram address 3 +* 04 sdram address 4 +* 05 sdram address 5 +* 06 sdram address 6 +* 07 sdram address 7 +* 08 sdram address 8 +* 09 sdram address 9 +* 10 sdram address 10 +* 11 sdram address 11 +* 12 sdram address 12 +* 13 sdram address 13 +* 14 sdram address 14 +* 15 nand command latch +* 16 nand address latch +* 17 not connected (was marked "SHDN_HOST???", but schematic disagrees) +* 18 TP23 (free) +* 19 sdram dcs +* 20 sdram ras +* 21 sdram cas +* 22 sdram write enable +* 23 sdram cke +* 24 sdram cko +* 25 sdram cs1 +* 26 sdram cs2 +* 27 not connected (was marked "USB ID", but schematic disagrees) +* 28 not connected +* 29 Audio output enable (anti-pop control) +* 30 TP25 (free) +* 31 sdram write enable 0 + +'''Port C:''' +* 00 lcd data 0 +* 01 lcd data 1 +* 02 lcd data 2 +* 03 lcd data 3 +* 04 lcd data 4 +* 05 lcd data 5 +* 06 lcd data 6 +* 07 lcd data 7 +* 08 TP 35 (free) +* 09 TP 36 (free) +* 10 keyboard out 1, TP59 +* 11 keyboard out 2, TP60 +* 12 keyboard out 3, TP61 +* 13 keyboard out 4, TP62 +* 14 keyboard out 5, TP63 +* 15 keyboard out 6, TP64 +* 16 keyboard out 7, TP65 +* 17 keyboard out 8, TP66 +* 18 lcd pixel clock +* 19 lcd hsync +* 20 lcd vsync +* 21 lcd SPI chipselect +* 22 lcd SPI data +* 23 lcd SPI clock +* 24 sdram write enable 1 +* 27 Charge detect (analog input to read battery voltage). +* 28 nand read enable +* 29 nand write enable +* 30 nand flash ready/busy +* 31 not connected to a pad; PCSEL31 selects jtag (PCSEL31==0) or uart0 (PCSEL31==1) on pad 147(TxD)+148(RxD) (TP5+TP4). + +'''Port D:''' +* 00 SD Card detect +* 02 SD Card power enable +* 04 Speaker AMP enable (no audio unless this output is pulled low). +* 06 Low power indicator (if 0, battery power is low). +* 08 SD Card command +* 09 SD Card clock +* 10 SD Card data 1 +* 11 SD Card data 2 +* 12 SD Card data 3 +* 13 SD Card data 4 +* 15 TP 38 (free) +* 18 Keyboard in 1, TP67 +* 19 Keyboard in 2, TP68 +* 20 Keyboard in 3, TP69 +* 21 Keyboard in 4, TP70 +* 22 Keyboard in 5, TP71 +* 23 Keyboard in 6, TP72 +* 24 Keyboard in 7, TP73 +* 25 uart0 transmit, TP75 +* 26 Keyboard in 8 (uart0 receive), TP74 +* 27 Buzzer, controlled with pwm4. Piezo-electric buzzer; not related to soundcard output. +* 28 USB detect (0 if usb power is present). +* 29 power button (0 if pressed). + +=== Sorted by function === +* buzzer: D27 +* audio: B29, D4 +* power button: D29 +* keyboard: C10, C11, C12, C13, C14, C15, C16, C17, D18, D19, D20, D21, D22, D23, D24, D26(also uart receive) +* uart: C31, D25, D26(also keyboard), uart is also available on jtag pads TP4+TP5 (without gpio overload). +* sd/mmc: D0, D2, D8, D9, D10, D11, D12, D13 +* usb: D28 +* battery: C27, D6 +* sdram: A1, A3, A5, A7, A8, A9, A10, A11, A12, A13, A15, A17, A22, A26, A28, A30, B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B19, B10, B21, B22, B23, B24, B25, B26, B31, C24 +* nand: B15, B16, C28, C29, C30 +* lcd: C0, C1, C2, C3, C4, C5, C6, C7, C18, C19, C20, C21, C22, C23 +* only test points: B18, B30, C8, C9, D15 +* unconnected pads: B17, B27, B28 + +[[Category:Ben NanoNote]] + +This content is dual licensed under CC-BY-SA and GFDL and was obtained from [http://en.qi-hardware.com/wiki/Hardware-Ben](http://en.qi-hardware.com/wiki/Hardware-Ben) diff --git a/docs/Bridge_Mode.md b/docs/Bridge_Mode.md new file mode 100644 index 0000000000..341cdc567d --- /dev/null +++ b/docs/Bridge_Mode.md @@ -0,0 +1,101 @@ +# Bridge Mode + +A common feature of COTS Wi-Fi routers is to be able to set the router +to bridge mode, where the devices stops acting like an IP router +(layer 3) and starts acting like an ethernet switch (layer +2). LibreCMC does not actually have a bridge mode, but the same effect +is achievable with two easy steps. + +1. Add the WAN ethernet port to the LAN bridge interface +2. Set the DHCP server to ignore the LAN interface + +## Adjust the LAN bridge interface + +Go to the Network >> Interfaces page and press the EDIT button next to +the LAN Network. Select the Physical Settings tab. + +![alt text](images/librecmc-default-interfaces.png "LibreCMC default + interfaces view") + +Place a checkmark in the box for the "eth0" interface for wan and +wan6. (I suppose the interface name might vary amongst different +routers.) + +![alt text](images/librecmc-eth0-added-to-lan.png "Adjustments to + LibreCMC interface physical settings") + +You can also check the box for Enable STP if desired. There doesn't +seem to be any downside from this, though I suppose it would use a +little more CPU cycles and memory. STP is a protocol intended to +prevent infinite communication loops from forming in a network of +layer 2 switches. + +## Adjust DHCP server settings + +On the same page, scroll down a little to the DHCP Server section. In +the General Setup tab, check the "Ignore interface" box. + +![alt text](images/librecmc-dhcp-server-ignore-lan.png "Setting + LibreCMC DHCP server to ignore LAN interface") + +Save and apply your changes. + +## Communicating with LibreCMC in "bridge mode" + +Now that the DHCP server is turned off, the next time you connect to +the libreCMC device, you will not be able to communicate with it. You +must set your connecting device manually to be on the same +subnet. Since the default libreCMC LAN IP address is 192.168.10.1/24, +it should work to set your connecting device to IP address +192.168.10.2/24.On Gnu/Linux systems, the command is usually `ip addr +add 192.168.10.2/24 dev eth0` or `dev wlan0` if connecting wirelessly. + +Alternatively, you may set the libreCMC device to receive an IP +address from another DHCP server on your network: go to back to the +Network >> Interfaces page, press the EDIT button again next to the +LAN Network, select the General Setup tab, and switch the Protocol +from "Static address" to "DHCP client". (It seems that in LibreCMC, +bridging the LAN interface to the WAN port disables the operation of +the DHCP client on the WAN interface.) Of course, if you do this, be +sure that your DHCP server has reserved a memorable IP address for the +LibreCMC device's MAC address, so you don't have trouble finding it. + +![alt text](images/librecmc-switch-lan-to-dhcp.png) + +## Advanced + +These adjustments are not required, but they lead to a configuration +which will be more consistent and have cleaner logs. + +### Disabling odhcpd (DHCP daemon) + +In bridge mode, you aren't going to want to serve DHCP out any +interface. So you might as well just shut down the whole DHCP +server. Log in via SSH, and run the commands: + +``` +/etc/init.d/odhcpd stop +/etc/init.d/odhcpd disable +``` + +### Delete the WAN(6) interfaces + +From `Network` >> `Interfaces`, you can delete the WAN and WAN6 +interfaces. See also the "Add a LAN6 interface" section below. + +### Delete the WAN Firewall Zone + +From `Network` >> `Firewall` you can delete the WAN zone. If you do +need a WAN firewall, then you should not be running in bridge mode in +the first place. + +### Add a LAN6 Interface + +If you have IPv6 access, you will want an interface which receives an +IPv6 address. From `Network` >> `Interfaces` create a new interface +called `LAN6` with `Protocol` set to `DHCPv6 client`. + +You will likely also want to disable `odhcpd` (see above). Otherwise +your logs can get filled up with unnecessary IPv6 related messages, as +libreCMC tries to act like an IPv6 router. `odhcpd` normally handles +DHCPv6 as well as IPv6 Router Advertisements. diff --git a/docs/FAQ.md b/docs/FAQ.md new file mode 100644 index 0000000000..7eb94836f9 --- /dev/null +++ b/docs/FAQ.md @@ -0,0 +1,84 @@ +# The libreCMC FAQ + +## What is libreCMC? + +The libreCMC project provides replacement software for consumer-grade +routers in the form of a small GNU/Linux distro. The software and tools +that the project distributes allow users to take back control of +their devices from hardware manufactures. Because libreCMC is [Free +Software](http://www.gnu.org/philosophy/free-sw.en.html), users are +able to unlock the ability to control and breath new life into +devices the project supports. + +## Why should I care? + +In the light of recent events, it is more important now more than ever to fight +for the freedom to control the software that runs on a given device. Users +should have the freedom to control their devices, not the OEMs who originally +made the device. Since libreCMC is free software, users have total control over +what the software on their device is doing. This is important because it means +that the community can add new features, review what the software is doing and +make improvements that benefit the community as a whole. + +## What devices does libreCMC work with? + +The libreCMC project supports mostly consumer-grade routers and a few other +embedded devices. This list can be found on the Supported Hardware page. While +this list is not extensive, the libreCMC project has very strict requirements +for supporting devices. Some examples include: + +* libreCMC has to be installable from stock firmware. In most cases, devices +have a complicated process or use of additional tools to replace the firmware / +software. The project will still consider some level of support if it does not +meet this requirement and meets all of the other requirements. + +* The hardware can't require non-free software or binary blobs to work. Non-free +Software / Blobs are pieces of software where we (the community) do not have +the source code under a proper Free Software [1] license. Non-free Software and +blobs make supporting a device for any length of time a chore and usually +support evaporates when device vendors stop releasing new blobs / components. +If a device requires non-free software or blobs, the libreCMC project won't +support devices that can't meet this requirement. + +* The device needs to have enough flash (storage) to work with. Sadly, +the issue of bloat in modern times is seen as a non-issue for many +software developers. While there are a lot of hardware that the +project would like to support, there are some devices that just simply +don't have enough flash. One of the long-term goals of the project is +to eventually support devices with limited flash. Right now, the +minimum requirement for libreCMC supported devices is 4M of flash, +depending on the features that are desired. + +## Features + +The libreCMC project's main focus is on consumer-grade routers and a +few other embedded devices. While libreCMC is based upon OpenWrt, the +project does not support all of the same features and tries to strike +a balance between functionality and bloat. The project *does not* +support the following: + +* UPnP support: UPnP is a security nightmare and the project won't support it. + +* Services / Applications that belong on their own machine or can't +run on 90% of targets : While it might be cool to run a particular +service or application on your router, it is usually is a bad +idea. Many of the devices that we support are not capable of running +such things because of a lack of processing power, flash or RAM. + +## How often are releases made? + +libreCMC releases incremental every 3 - 6 months, depending on if +there is a critical security or design flaw. The project tries to +maintain major or LTS (long Term Support) releases for about 2 years. + +## How can I get started with libreCMC? + +[Getting Started]() Page : WIP? + +## How can I contribute to libreCMC? + +Pull requests can be made or issues can be filed against the project's +[git](https://gogs.librecmc.org/libreCMC/libreCMC) repository. + +Information about monetary contributions can be found on the project's +[contact](https://librecmc.org/contact.html) page. diff --git a/docs/Flavors.md b/docs/Flavors.md new file mode 100644 index 0000000000..65f26e1b9e --- /dev/null +++ b/docs/Flavors.md @@ -0,0 +1,24 @@ +# Three Flavors of libreCMC : What are they for? + +The libreCMC project ships different flavored images to achieve a desired result and +for the continued support of hardware with limited resources. These different flavors +include: + +## Main + +Provides an easier to use out of the box experience; includes +the luci web interface, full package management support and basic IPv6 stack. +These images only run on routers with 8M of flash or more. + +## Core + +A bare-bones image with package management, basic IPv6 stack and no web interface. +These images run on routers with <8M of flash, but package management is limited on 4M targets. + +## Legacy + +While similar to Main images, these images are targeted at routers with 4M of flash; +provide the luci web-ui (no ssl support), basic IPv6 stack and no package management. + +As always, libreCMC can be built from [source](https://gogs.librecmc.org/libreCMC/libreCMC/src/v1.4/docs/How_To_Build_libreCMC.md) or you can submit an [issue](https://gogs.librecmc.org/libreCMC/libreCMC/issues) to request +a missing feature. diff --git a/docs/GL-AR300M.md b/docs/GL-AR300M.md new file mode 100644 index 0000000000..2b85e9dab7 --- /dev/null +++ b/docs/GL-AR300M.md @@ -0,0 +1,46 @@ +# GL.iNet AR300M + +## Hardware Specs + +* SoC : Qualcomm Atheros QCA9531 +* Flash ROM : 16 MB Nor + 128 MB Nand +* RAM : 128 MB + +## Flashing from factory + +### Using GL.iNet's U-boot-mod and web UI + +1) Set computer IP address to 192.168.1.2 + +2) Connect the enternet from the computer to "lan" port on the router + +3) Press and hold the reset button, and power on the router by plugging in the power + +4) Wait until the LED flashes once and red LED flashes 5 times before releasing the reset button. + +5) Open IP address in the browser 192.168.1.1 + +6) Select the .img for NAND and .bin for NOR + + +## Tested + +* v1.4.2 librecmc-ar71xx-nand-gl-ar300m-ubi-factory.img + +## Reset Instructions + +???? + +## Notes: + +* This router is currently not officially supported by Librecmc + +* This router is dual flash and stock uboot attempts to boot nand flash first. + +* NOR flash uses .bin image and NAND flash uses .img image. + +* Use librecmc-ar71xx-nand-gl-ar300m-squashfs-sysupgrade.tar to update NAND installations + +* Default router ip is 192.168.10.1 + +* On KDE, Disable change ipv4 method from automatic to manual to set the computer ip to 192.168.1.2. diff --git a/docs/How To Submit A Change To This Wiki.md b/docs/How To Submit A Change To This Wiki.md new file mode 100644 index 0000000000..3ae15ea870 --- /dev/null +++ b/docs/How To Submit A Change To This Wiki.md @@ -0,0 +1,61 @@ +How To Submit A Change To This Wiki +=================================== +This wiki is written in Markdown and all wiki documenation is located in /docs. + + +Clone this repo and: +-------------------- + + git clone https://gogs.librecmc.org/libreCMC/libreCMC.git + + +Make desired documenation changes in /docs + + +then + + git push + +or + + git request-pull -p + +### git push ( In Gogs ) + +Clone the upstream repo in Gogs, then clone to your computer: + + git clone https://yourUserName@yourURL + +Add upstream repo to be able to rebase to upstream point commit: + + git remote add upstream https://gogs.librecmc.org/libreCMC/libreCMC.git + (git checkout -b optionalBranchName) + git push (--all) + +Create Push Request in Gogs: + +* Press the little green PR button in your own repo +* Or go to + +### git request-pull -p ( Anywhere ) + +Clone the upstream repo to your computer. + + git add changedFile.md + git commit ( -m Short info what changed ) + git log ( copy commit id ) + git request-pull -p (start) URL (end) + git request-pull -p (commit in upstream repo) URL master + +Example for piping output to haste: + + git request-pull -p b3b8926484feb37c33e5150facf315ef12b4612e https://gogs.librecmc.org/jonasbits2/libreCMC.git master | haste + +* Send to hastebin.com or any site you like +* Paste link in IRC channel + +#### Links + +* +* + diff --git a/docs/How_To_Build_libreCMC.md b/docs/How_To_Build_libreCMC.md new file mode 100644 index 0000000000..2f1eea3122 --- /dev/null +++ b/docs/How_To_Build_libreCMC.md @@ -0,0 +1,83 @@ +# libreCMC build HOWTO + +This generic documentation is to help aid those who want to build libreCMC firmware images from source code. While this +documentation is not an exhaustive source of information, it should help those who would like to build their own firmware images +or would like to develop firmware based upon libreCMC. + +While libreCMC does allow for building for other targets, not all of them have been tested to work with libreCMC and are not officially supported if they are not mentioned on the libreCMC wiki. + +libreCMC is licensed under the GPLv2 and contains code from other free software projects. Some code may be licensed under other free software licenses and will be noted. All software is to be distributed under the terms of the GPLv2 or their respective free software licenses. + +## What do I need to get started? + +* GNU/Linux distro (Trisquel, *buntu, Fedora or others) +* GNU GCC / GCC-C++ +* build-essential (Debian-based distro) or base-devel (Parabola) +* flex +* gawk +* wget +* unzip +* ncurses-dev (ncurses5-devel, etc..) +* libghc-zlib-dev +* libssl-dev +* patch +* perl5 +* subversion +* git-core +* 8 - 10 GB of disk space +* 4 GB of RAM (8 GB or more is recommended) + +## Building libreCMC + +1) Get the latest libreCMC source code: + +`git clone https://gogs.librecmc.org/libreCMC/libreCMC.git` + +or download a [release](https://gogs.librecmc.org/libreCMC/libreCMC/releases) + +If you want to build packages found in libreCMC's package feed, update and install the make files +by running the following from `$SRC_ROOT`: + +`./scripts/feeds update && ./scripts/feeds install -a` + +This will pull the makefiles for the package feed and make them available for selection +when configuring your build of libreCMC. + +2) Configure libreCMC for your device. + + `make menuconfig` + + When configuring libreCMC for your device, it is imperative that the right target and profile are selected. Currently, we only _officially_ support `ath79` targets or devices listed +on the [supported hardware](Supported_Hardware.md) list. If you want other packages, please keep in mind that these devices don't have very much in terms of flash ROM and your selection +of packages may not work properly. Generally, a good default configuration includes: + + + * luci : Collections -> luci + luci -> protocols -> luci-proto-relayd + * Networking : wpa-cli + wpa-supplicant + iw + * Utilities : Editors -> Nano + +3) When done configuring, run: + + `make` + + If the build fails, type: + + `make V=s` + + The build process can be accelerated by running multiple concurrent job processes using the -j-option: + + `make -j ` + + To avoid build errors with -j option, it is advised to pre-fetch all source code for all dependencies before : + + `make download` + + if there are missing dependencies in your build environment, please install them and then run `make`. + +4) If the build exits without any errors, you should have a new image in: + + `$SRC_ROOT/bin/$BUILD_TARGET/librecmc-$BUILD_TARGET-generic-$TARGET_PROFILE-$VERSION-$FS_TYPE-factory.bin` + + Where `$BUILD_TARGET = target (ex. ar71xx)`, `$TARGET_PROFILE = device`, `$VERSION = device version (some don't any)` + +5) Flash the newly built image (if you are confident). libreCMC project is not responsible for bricked devices. diff --git a/docs/Image_Support.md b/docs/Image_Support.md new file mode 100644 index 0000000000..9e76551018 --- /dev/null +++ b/docs/Image_Support.md @@ -0,0 +1,15 @@ +# libreCMC image support + +libreCMC is distributed in 3 different flavors: main, core and legacy. +Each image type is for a specific use case or to extend support for a +specific class of devices. + + +| image type | Web-ui support |Package Management | Min. Flash Size | Target Examples | Use Case | +|-----------:|-------------:|------------------:|-----------:|--------------------:|---------:| +| Main | Yes | Yes | 8M | | Easy to use | +| Core | No | Yes | 4M | | Minimal, more control | +| Legacy | No | No | 4M | TL-WR741ND, TL-WR841ND,TPE-NWIFIROUTER* | Easy to use for legacy targets... | + + +# NOT READY YET! diff --git a/docs/LICENSE.md b/docs/LICENSE.md new file mode 100644 index 0000000000..3b3f0b4608 --- /dev/null +++ b/docs/LICENSE.md @@ -0,0 +1,430 @@ +``` +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + +``` \ No newline at end of file diff --git a/docs/List_of_Tested_Hardware.md b/docs/List_of_Tested_Hardware.md new file mode 100644 index 0000000000..a12c4d165a --- /dev/null +++ b/docs/List_of_Tested_Hardware.md @@ -0,0 +1,22 @@ +# List of Tested Devices + +| Device Name | Contributor | Bootloader Flashed? | +|-------------------------------------|:-------------:|------:| +| Netgear WNDR3700 v1 | orly_owl | ??? | +| TP-Link TL-WA901ND v3 | jonasbits | ??? | +| TP-Link TL-WR710N v2.0 | jonasbits | ??? | +| TP-Link TL-WR741ND v1.8 | yang | ???| +| TP-Link TL-WR841ND v5.2 | orly_owl | ??? | +| TP-Link TL-WR841ND v8.2 | RISCi_ATOM, yang| Yes, u-boot_mod| +| TP-Link TL-WR842ND v2.0 | zeus | No | +| TP-Link TL-WR1043ND v1.8| orly_owl | ??? | +| TP-Link TL-WR1043ND v2.1| RISCi_ATOM | ??? | +| D-Link DGL-5500 vA1 rm' wifi card| RISCi_ATOM | ??? | +| Western Digital MyNet N750 | orly_owl | ??? | + +Please note that not all of the devices on the above list are officially supported by the libreCMC +project. In order for a device to be officially supported, it needs to meet the following rules: + +* libreCMC must be flashable from stock firmware (without the usage of non-free software). +* The bootloader must be free software and flashable with a serial cable + Ethernet cable or from within libreCMC. +* Components including( wifi, switch, video, etc..) must not require blobs to work. diff --git a/docs/OpenVPN_Layer_2_Server.md b/docs/OpenVPN_Layer_2_Server.md new file mode 100644 index 0000000000..35af86fac0 --- /dev/null +++ b/docs/OpenVPN_Layer_2_Server.md @@ -0,0 +1,103 @@ +# OpenVPN Layer 2 Server + +## Introduction + +Librecmc can operate as an OpenVPN server. OpenVPN technology connects +two networks via an encrypted tunnel. With proper server, network, and +client configuration, OpenVPN allows a client outside of your LAN to +see the LAN as though it were physically connected to the LAN. + +OpenVPN can run in layer 2 or layer 3 mode. In layer 3 mode, the +remote client sees your LAN as though it is on the other side of an IP +router. In layer 2 mode, the remote client sees your LAN as though +they are both on the same Data Link segment (e.g., the same Ethernet +link). Layer 3 mode is easier to set up, but layer 2 mode is sometimes +desired to give clients a more direct exposure to services on the LAN. + +## Warnings + +This information is provided for educational purposes only and is not +meant to be a guide to best network security practices. Readers are +advised to study all relevant OpenVPN and network security +documentation. + +## Required LibreCMC packages + +* openvpn-openssl +* openvpn-easy-rsa +* luci-app-openvpn + +## Interface Setup + +In LuCi, select `Network` >> `Interfaces` and then `Add New Interface`. + +- Set `Name of the new interface` to `myvpn` or anything else you would like. +- Set `Protocol of the new interface` to unmanaged. +- Set `Cover the following interface` to `Custom Interface: vpn0`. +- In my current working system, the `firewall-zone` for the interface + is set to `lan`, but I don't think that really matters in this case. + +In my working configuration, I added tap0 into the LAN bridge +interface, and deleted the WAN interface. However, my vpn server is a +separate unit on my network, intended to operate in "bridge mode", +where if you server is your gateway router, a different configuration +might be necessary. + +## Certificate and Key Setup Instructions + +``` +cd /etc/easy-rsa +source vars +clean-all +build-ca +build-dh +build-key-server myvpn +openvpn --genkey --secret /etc/easy-rsa/keys/ta.key +mkdir -m 700 /etc/openvpn/keys +mv ca.crt myvpn.crt myvpn.key dh2018.pem /etc/openvpn/keys +``` + +N.B.: Using easy-rsa is a straightforward approach, but it may be +possible to produce more secure certificates using openssl directly. + +## Server configuration + +For the `server bridge` option: The first two parameters are the ip +and netmask of the gateway on the bridged subnet. The next two +parameters indicate the pool-start-IP and pool-end-IP, which is the +part of your IP address pool that you have reserved just for VPN +clients. You must to make sure that the DHCP server for your LAN is +not leasing out those IP addresses to local (non-vpn) clients. + +/etc/config/openvpn +``` +config openvpn 'myvpn' + option enabled '1' + option dev 'tap0' + option port '1194' + option proto 'udp' + option keepalive '10 120' + option persist_key '1' + option persist_tun '1' + option user 'nobody' + option group 'nogroup' + option ca '/etc/openvpn/keys/ca.crt' + option cert '/etc/openvpn/keys/myvpn.crt' + option key '/etc/openvpn/keys/myvpn.key' + option dh '/etc/openvpn/keys/dh2048.pem' + option tls_server '1' + option tls_auth '/etc/openvpn/keys/ta.key 0' + option server_bridge '10.0.0.1 255.255.255.0 10.0.0.201 10.0.0.220' + option client_to_client '1' + list push 'persist-key' + list push 'persist-tun' + list push 'redirect-gateway def1' + list push 'route 10.0.0.0 255.255.255.0' + list push 'dhcp-option DNS 10.0.0.1' + option mute '15' + option verb '3' +``` + +## Client setup information + +TODO diff --git a/docs/Port_Forwards.md b/docs/Port_Forwards.md new file mode 100644 index 0000000000..aa365ea82f --- /dev/null +++ b/docs/Port_Forwards.md @@ -0,0 +1,84 @@ +# Port Forwarding + +## What is port forwarding? + +Technically, port forwarding is the use of Network Address Translation +(NAT) to map an IP address and port number to another IP address and +port number. Typically you need this function to be able to expose a +service running our your local network (LAN) to the Internet (WAN) +which otherwise would be impossible because your LAN uses private, +non-routable IP addresses; for example, if you are trying to run a +gaming server or a Web page server from your home network. + +## Security Warnings + +Be aware that the use of port forwarding may create additional +security holes into your local network. The local system(s) and +service(s) you are exposing to the Internet must be free from security +vulnerabilities, or this may allow a remote attacker to infiltrate +your network. + +## LuCi Interface + +* Log into the LuCi Web interface, which by default is at address https://192.168.10.1 + +* Select the `Network` >> `Firewall` menu. + +![alt text](images/librecmc-selecting-firewall-menu.png "Selecting the + Firewall menu entry") + +* Select the `Port Forwards` tab. + +![alt text](images/librecmc-selecting-port-forwards-tab.png "Selecting the + Port Forwards tab") + +* Under the `New Port forward` section, enter in the `Name` field a + brief description of the port forward, e.g., "HTTP server" for an + unencrypted Web page server. + +* Select a protocol from the `Protocol` field. Most services you can + run will be using the TCP protocol, but you can select `TCP+UDP` if + you aren't sure. + +* Usually, you will leave the `External zone` set to `wan`. + +* Enter a port number in the `External port` field. Typically this + will be the usual port number expected for a particular + service. E.g., HTTP servers use port 80. You are free to use + non-standard ports, but your remote clients may need to use special + techniques to connect to the correct port. + +* Usually, you will leave the `Internal zone` set to `lan`. + +* Select an IP address in the `Internal IP address` drop down menu. If + your server is using DHCP, you should see its hostname appear in the + list. If your server is has it's private IP address set statically, + select the `Custom` option at the bottom of the list, and enter in + the correct IP address in the text field that appears. Note that if + your server is using DHCP, you should be sure LibreCMC has a static + lease created for it (TODO: link to Static Leases documentation). + +* Enter a port number in the `Internal port` field. Typically this + will be the same as the external port, unless you have set your + server to work through a non-standard port, or you selected a + non-standard external port earlier. + +![alt text](images/librecmc-port-forwards-entering-parameters.png + "Entering parameters for port forwarding") + +* Press the `Add` button to the right. + +* Press the `Save & Apply` button at the bottom of the page. + +![alt text](images/librecmc-port-forwards-after-save-apply.png + "Port Forwards view after Save & Apply") + +## Port Numbers + +The official IANA port number list is available at + +[https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml] + +## Port Range + +(TODO: option for configuring a range of ports simultaneously) diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..78f8f4b98a --- /dev/null +++ b/docs/README.md @@ -0,0 +1,27 @@ +# libreCMC : The _libre_ Embedded GNU/Linux Distro. + +The libreCMC project provides replacement software for consumer-grade +routers in the form of a small GNU/Linux distro. The software and tools +that the project distributes allow users to take back control of +their devices from hardware manufactures. Because libreCMC is [Free +Software](http://www.gnu.org/philosophy/free-sw.en.html), users are +able to unlock the ability to control and breath new life into +devices the project supports. + +## Useful links: + +* [libreCMC FAQ](FAQ.md) : WIP + +* [Getting Started with libreCMC]() : WIP + +* [Supported Hardware](Supported_Hardware.md): Devices officially supported by libreCMC. + +* [Router reset instructions](Router_Reset_Instructions.md) : Generic libreCMC router reset instructions. + +* [Report a bug or issue](https://gogs.librecmc.org/libreCMC/libreCMC/issues) : Is + something broken? Did you find a non-free component or do you want + to make libreCMC better? Submit an issue. + +* [Get libreCMC source code](https://gogs.librecmc.org/libreCMC/libreCMC) : Checkout the latest libreCMC sources. + +* [Build Documentation](How_To_Build_libreCMC.md) : Learn how to build libreCMC for your device. diff --git a/docs/Router_Reset_Instructions.md b/docs/Router_Reset_Instructions.md new file mode 100644 index 0000000000..c57adf03a4 --- /dev/null +++ b/docs/Router_Reset_Instructions.md @@ -0,0 +1,53 @@ +# libreCMC Router Reset + +## Hard reset + +### Manual way (if you can’t access the web interface) + +1. Power off the router. + +2. Power on the router. + +3. As soon as the SYS light (the gear) flashes, hold down the reset button until the +SYS LED flashes faster. + +4. Stop Network-Manager or other network configuration services. + +5. Plug in an ethernet cable from your machine to one of the LAN ports. + +6. Set your computer’s IP address to 192.168.10.2 + +7. `telnet 192.168.10.1` (192.168.1.1 on pre v1.3.1 devices). + With v1.3.4+ devices, telnet is disabled. use ssh: + `ssh root@192.168.10.1` + +8. At the shell prompt, type: +`firstboot` + +9. After you have confirmed that you want to reset everything your need to reboot the router: +`reboot` <- It can manually be turned off too. + +### Resetting via web interface + +1. Login into the router via : 192.168.10.1 (or 192.168.1.1, depending on your configuration). + +2. Navigate to: System -> Backup / Flash Firmware + +3. Click : "Preform Reset" + +Note: After resetting the router, it will be in a default state (wireless will be disabled, no password +is set, ip-forwarding is disabled and telnet is enabled and the default IP should be 192.168.10.1) +It is recommended that you re-load the default configuration: + +# Restoring old configurations + +1. Make sure you have your network-manager turned on + +2. Log into the router via : 192.168.10.1 + +3. Navigate to : System -> Backup / Flash Firmware + +4. By "Restore Backup" , click the browse button and select the libreCMC configuration backup (*.tar.gz). + + + diff --git a/docs/Serial.md b/docs/Serial.md new file mode 100644 index 0000000000..3690376086 --- /dev/null +++ b/docs/Serial.md @@ -0,0 +1,104 @@ +# Using a serial interface with U-boot and libreCMC + +A serial interface (console) provides a means of debugging or +unlocking features hidden from the user. Most computing devices +have a serial interface whether it is broken out by the manufacture or not. + +In the case of devices that run libreCMC, a serial console is used +to configure U-boot and debug libreCMC if the network interface can't +be brought up. These instructions outline the basics of using +a serial console with a USB to serial cable. + + + +## The basics + +There are a few different standards for serial interfaces, but here we are +providing just the basics. There are 3 different connections that we care +about : Transmit (TX), Receive (RX) and Ground (GND). Depending on the +serial cable, the color coding could be different. The common coloration +is RX is Green, TX is white and GND is black*. + +These three wires will be connected to a pin header on the board or might need +to be soldered to pads. Many device manufactures are kind enough to provide a +header and indicate where the serial interface is. Look for silkscreen labeling +with : GND, TX, RX. Sometimes additional work is needed to break out a stable +serial interface. + +* Many serial cables ship with the color corresponding to the connection on the board, +so TX and RX are effectively reversed. + +Some routers use the following standard: +``` + __________________ + | | | + | . . . | . | <- Inside of the router (you may need to do some soldering) + |____________|_____| + + | | \ \ + * GND RX TX +``` + +In this case, transmit is in the marked off box. + + + +``` + _________________ + | | + | . . . . | + * |_________________| + + | | \ \ + GND RX TX Vcc + +``` + +Some might use a dot to indicate GND, etc... + +TPE-R1100 example: + +![alt text](images/serial.png "TPE-R1100 Serial") + +Warning: NEVER connect the red wire to the device / router! You will most likely fry it because +many routers use 3.3V for Vcc instead of the 5V provided by USB. + +## Getting a console + +In order to communicate with the device, we need a terminal application to interact with +the serial port provided by the USB to serial cable. In this case, we are going to use GNU Screen. +Make sure that the GNU Screen package is installed and make sure that your user is part of the +`dialout` group. + +Before we can use the terminal application, we need to know the baud rate at which the serial +console will be provided. With most devices running libreCMC and u-boot, this most likely will +be 115200 + +## Putting it all together + + +1) Plug in / wire up the serial cable to the board. + +2) Plug the USB part of the serial cable into an available USB port. + +3) run `screen /dev/ttyUSB0 115200` or (if you are NOT part of the `dialout` group) `sudo screen /dev/ttyUSB0 115200` +Please note that the serial device might have a different name (ttyUSB(n), ttyS0, etc...). + +4) Power on the device you are connecting to. + +5) You should see ledgible ASCII text scroll by. + +If the device gets all the way through the boot process, the libreCMC banner will appear with +a shell prompt: + +``` + ____ _____ ____ + _ _ _ | __|| || __| + | (_) |__ _ _ ___ | | | | | || | + | | | '_ \ '_/ -_)| |__ | | | || |__ + |_|_|_.__/_| \___||____||_|_|_||____| + ----------------------------------------- + +root@libreCMC:~# + +``` diff --git a/docs/Soft_Brick_Recovery_With_IPv6.md b/docs/Soft_Brick_Recovery_With_IPv6.md new file mode 100644 index 0000000000..60bf665534 --- /dev/null +++ b/docs/Soft_Brick_Recovery_With_IPv6.md @@ -0,0 +1,32 @@ +# Soft Brick Recovery With IPv6 + +## Use Case + +If you recklessly experiment with your libreCMC networking settings, it is likely you will eventually cause a "soft brick". Typically, this means you have messed up your IPv4 network configuration in such as way that you cannot connect to the LuCi control panel, nor connect to the busybox shell via SSH. One option is to figure out how to reload the firmware and start over from scratch. Something that might be easier, though, is to instead use IPv6 to connect to the router. This is usually possible for two reasons: (1) libreCMC has IPv6 enabled by default; (2) IPv6 has link-level autoconfiguration. + +## Determine the router's link local IPv6 Address and interface name. + +Connect a Gnu/Linux computer to the LAN port of the libreCMC router. Then run the `ip neigh` command. You are looking for a `REACHABLE lladdr` address that starts with `fe80`. For example: + +``` +christopher@evenstar:~$ ip neigh +fe80::280:aeff:fece:5a21 dev eth0 lladdr 00:80:ae:ce:5a:21 router REACHABLE +``` + +Here, `fe80::280:aeff:fece:5a21` is the IPv6 address, and `eth0` is the name of the interface. + +## Log in to the router + +Unforunately, a link local IPv6 address usually cannot be used to directly connect to the LuCi control panel. This is because Web browsers are usually programmed not to process such addresses. However, you can use SSH to connect to the busybox shell, with a command like so: + +``` +ssh root@fe80::280:aeff:fece:5a21%eth0 +``` + +Replace `fe80::280:aeff:fece:5a21` with the IPv6 address of your router, and `eth0` with the correct interface name. + +## What next? + +Once you are logged into the busybox shell, you can use the `ip addr` command to see what is the actual state of your IPv4 network configuration. If you understand IPv4, it may be sufficient to use `ip addr add` to add an IPv4 address, which you can then use to connect to the LuCi control panel. If the IPv4 configuration is okay, you may be having a problem with the dnsmasq dhcp server, or the LuCi Web service itself may be down, for some reason. Use the `logread` command to look for errors or warnings. + +If you are still not sure what to do, you can ask for help on the libreCMC IRC channel or libreCMC email list. diff --git a/docs/Supported_Hardware.md b/docs/Supported_Hardware.md new file mode 100644 index 0000000000..c50e96348a --- /dev/null +++ b/docs/Supported_Hardware.md @@ -0,0 +1,49 @@ +# libreCMC supported Hardware + +Officially supported devices generally fall into three categories : can easily +be flashed from the stock firmware's web-ui, requires a tFTP flash or opening up +the router. When choosing a router to use with libreCMC, please keep in mind the +method which is required for the initial install of libreCMC. + +### Buffalo +* [WZR-HP-G300NH](/WZR_HP_G300NH.md) +* WHR-HP-G300NH + +### Netgear + +* [WNDR3800](/WNDR3800.md) + +### TP-link + +* [TL-MR3020 v1](/TL_MR3020.md) +* [TL-WR741ND](/TL_WR741ND.md) +* [TL-WR841ND](/TL_WR841ND.md) +* [TL-WR842ND](/TL_WR842ND.md) +* [TL-WR1043ND](/TL_WR1043ND.md) + +### ThinkPenguin +* [TPE-NWIFIROUTER2](/TPE_NWIFIROUTER2.md) +* [TPE-R1100](/TPE_R1100.md) +* [TPE-R1200](/TPE_R1200.md) + +### Qi-Hardware + +* [Ben Nanonote](/Ben_Nanonote.md) + +## Tested Hardware + +[List of tested hardware](/List_of_Tested_Hardware.md) + +# libreCMC unofficially supported Hardware + +### D-Link + +* DGL-5500 a1 : Ships with non-free wifi card, but can be replaced with a free one. Has a mini-pci-e card slot. + +#####Please note that other targets may work; we are **NOT** responsible for **ANY** _bricked_ devices. + +## Notes: + +[2] requires a tFTP server for flashing. + +[3] requires opening up the router / external hardware for initial install (serial cable, SPI flasher or both). diff --git a/docs/System_Log.md b/docs/System_Log.md new file mode 100644 index 0000000000..66c686af18 --- /dev/null +++ b/docs/System_Log.md @@ -0,0 +1,67 @@ +# System Log + +## Viewing the system log from LuCi + +Select the `Status >> System Log` menu entry. + +![alt text](images/librecmc-luci-selecting-system-log.png "Selecting + the System Log page in LuCi") + +![alt text](images/librecmc-luci-system-log.png "The System Log page + in LuCi") + +The `System Log` page in LuCi does not have an interface for filtering +output. Therefore, you will likely want to use the shell interface. + +## Viewing the system log from the shell + +Once logged in via SSH, use the `logread` command + +```bash +Usage: logread [options] +Options: + -s Path to ubus socket + -l Got only the last 'count' messages + -e Filter messages with a regexp + -r Stream message to a server + -F Log file + -S Log size + -p PID file + -h Add hostname to the message + -P Prefix custom text to streamed messages + -f Follow log messages + -u Use UDP as the protocol + -t Add an extra timestamp + -0 Use \0 instead of \n as trailer when using TCP +``` + +For example: + +```bash +root@libreCMC:~$ logread | grep 'kern\.warn' +Mon Jan 15 20:22:01 2018 kern.warn kernel: [ 0.000000] No valid device tree found, continuing without +Mon Jan 15 20:22:01 2018 kern.warn kernel: [ 0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes. +Mon Jan 15 20:22:01 2018 kern.warn kernel: [ 0.000000] Primary data cache 32kB, 4-way, VIPT, cache aliases, linesize 32 bytes +Mon Jan 15 20:22:01 2018 kern.warn kernel: [ 0.669305] Crashlog allocated RAM at address 0x3f00000 +Mon Jan 15 20:22:01 2018 kern.warn kernel: [ 0.752178] m25p80 spi0.0: found mx25l12805d, expected m25p80 +``` + +One should be able to use `logread -e` instead of `grep`, but it seems +that not all the same regular expressions work for both: + +```bash +root@libreCMC:~$ logread -e 'kern\.warn' # and other similar variations +(no output) +``` + +The system log is contained in a limited size, circular buffer in +memory. So, if you have some process writing messages periodically, +this will eventually erase messages that were only written once. + +## Configuring the system log + +TODO + +## Monitoring the system log + +TODO diff --git a/docs/TL_MR3020.md b/docs/TL_MR3020.md new file mode 100644 index 0000000000..27a0188cfb --- /dev/null +++ b/docs/TL_MR3020.md @@ -0,0 +1,42 @@ +# TP-Link : TL-MR3020 + +The TL-MR3020 is a versatile device with the following specs: + +* SoC : Atheros AR7240 +* RAM: 32 MB +* Flash: 4MB +* NIC: 100BASE-X + +Please see the libreCMC [build documentation](/wiki/How-To-Build-libreCMC) for build instructions. + +## Flashing from factory (virgin) + +### Using Web GUI (Recommended) + +1) Set TL-MR3020 Mode Switch to either 3G/4G or WISP + +2) Connect to the TL-MR3020 router via Ethernet cable + +3) Open IP address 192.168.0.254 + +4) log in to the router's web GUI (default login/password: admin / admin) + +5) overwrite the factory firmware by installing the openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin firmware image like a regular firmware update. + +Wait for the progress bar to finish twice (the device will reset itself in the process), and proceed with basic configuration as with any fresh libreCMC install. + +### Flashing from libreCMC Web GUI + +1) Connect device to ethernet port on your computer and set the ip address of your machine to 192.168.1.10 + +2) Open 192.168.1.1 in a browser. + +3) Go to: System -> Backup/Flash Firmware + +4) Click the "browse" button under the _Flash New Firmware image_ section. + +5) Upload a firmware image with : librecmc-_target_-generic-_profile_-squashfs-factory.bin + +6) wait for the web interface to appear again (unless you chose to flash an image without it). + +# Needs more editing ;) \ No newline at end of file diff --git a/docs/TL_WR1043ND.md b/docs/TL_WR1043ND.md new file mode 100644 index 0000000000..fe5b296039 --- /dev/null +++ b/docs/TL_WR1043ND.md @@ -0,0 +1,120 @@ +# TL-WR1043ND + +## Hardware Specs: + +v1.x + +* SoC : Atheros AR9103 +* SoC CPU Speed: 400 MHz +* Flash ROM : 8 MiB +* RAM : 32 MB +* USB : 1 +* Special: GbE Switch + +v2.x + +* SoC : Qualcomm Atheros QCA9558 +* SoC CPU Speed: 720 MHz +* Flash ROM : 8 MiB +* RAM : 64 MB +* USB : 1 +* Special: GbE Switch + +v3.x + +Similar to v2.x + +v4.x + +* SoC : Qualcomm Atheros QCA9563 +* SoC CPU Speed: 750 MHz +* Flash ROM : 16 MB +* RAM : 64 MB +* USB : 1 +* Special: GbE Switch +* May need to be TFTP flashed, depending on stock firmware version. + +v5.x (TL-WR1043N v5) + +* SoC : Qualcomm Atheros QCA9563 +* SoC CPU Speed: 775 MHz +* Flash ROM : 16 MB +* RAM : 64 MB +* No USB +* Needs to be TFTP flashed + +## Supported Versions: + +* v1.x +* v2.x +* v3.x +* v4.x +* v5.x + +# Reset instructions + +??? + +# libreCMC v1.5.x notes + +With the release of libreCMC v1.5.0, this target uses `ath79` images. + +# Firmware Images + +See our [flavors](https://librecmc.org/flavors.html) page for a description of each type of libreCMC image. + +## Main Images + +[TL-WR1043ND v1 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v1-squashfs-factory.bin) + +[TL-WR1043ND v1 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v1-squashfs-sysupgrade.bin) + +[TL-WR1043ND v2 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v2-squashfs-factory.bin) + +[TL-WR1043ND v2 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v2-squashfs-sysupgrade.bin) + +[TL-WR1043ND v3 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v3-squashfs-factory.bin) + +[TL-WR1043ND v3 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v3-squashfs-sysupgrade.bin) + +[TL-WR1043ND v4 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v4-squashfs-factory.bin) + +[TL-WR1043ND v4 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v4-squashfs-sysupgrade.bin) + +[TL-WR1043N v5 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043n-v5-squashfs-factory.bin) + +[TL-WR1043N v5 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043n-v5-squashfs-sysupgrade.bin) + +## Core Images + +[TL-WR1043ND v1 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v1-squashfs-factory.bin) + +[TL-WR1043ND v1 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v1-squashfs-sysupgrade.bin) + +[TL-WR1043ND v2 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v2-squashfs-factory.bin) + +[TL-WR1043ND v2 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v2-squashfs-sysupgrade.bin) + +[TL-WR1043ND v3 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v3-squashfs-factory.bin) + +[TL-WR1043ND v3 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v3-squashfs-sysupgrade.bin) + +[TL-WR1043ND v4 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v4-squashfs-factory.bin) + +[TL-WR1043ND v4 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043nd-v4-squashfs-sysupgrade.bin) + +[TL-WR1043N v5 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043n-v5-squashfs-factory.bin) + +[TL-WR1043N v5 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-tplink_tl-wr1043n-v5-squashfs-sysupgrade.bin) + +## Image File Signatures + +[Main sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/sha256sums) + +[Main sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/sha256sums.asc) + + +[Core sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/sha256sums) + +[Core sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/sha256sums.asc) + diff --git a/docs/TL_WR741ND.md b/docs/TL_WR741ND.md new file mode 100644 index 0000000000..1ed5675947 --- /dev/null +++ b/docs/TL_WR741ND.md @@ -0,0 +1,37 @@ +# TP-Link TL-WR741ND + +## Specs + +* SoC : Atheros AR7240 @ 350 MHz +* RAM: 32 MB +* Flash : 4 MB + +## Versions Supported + +* v1 - v2, v4.20 - 4.27 + +## Versions **NOT** supported + +* v2.1 - v3.1 + v4.0 + +# Firmware Images + +See our [flavors](https://librecmc.org/flavors.html) page for a description of each type of libreCMC image. + +## Tiny + +[TL-WR741ND v4.20+ Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr741nd-v4-squashfs-factory.bin) + +[TL-WR741ND v4.20+ Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr741nd-v4-squashfs-sysupgrade.bin) + +#[TL-WR741ND v5 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr741nd-v5-squashfs-factory.bin) + +#[TL-WR741ND v5 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr741nd-v5-squashfs-sysupgrade.bin) + + +## Image File Signatures + +[Tiny sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/sha256sums) + +[Tiny sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/sha256sums.asc) + diff --git a/docs/TL_WR841ND.md b/docs/TL_WR841ND.md new file mode 100644 index 0000000000..63ccacdfac --- /dev/null +++ b/docs/TL_WR841ND.md @@ -0,0 +1,61 @@ +# TP-WR841ND + +## Specs + +* SoC : Atheros AR9341 +* RAM: 32 MB +* Flash: 4 MB + +## Versions Supported + +* v5.x +* v8.x +* v9.x +* v10.x <-- may need to be tftp flashed +* v11.x <-- +* v12.x <-- + + +DO NOT BUY v13!!! V13 contains a mediatek +chipset, which requires a non-free firmware +blob. + +## Reset instructions + +??? + +# Firmware Images + +See our [flavors](https://librecmc.org/flavors.html) page for a description of each type of libreCMC image. + +## Tiny + +[TL-WR841n[d] v8 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v8-squashfs-factory.bin) + +[TL-WR841n[d] v8 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v8-squashfs-sysupgrade.bin) + + +[TL-WR841n[d] v9 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v9-squashfs-factory.bin) + +[TL-WR841n[d] v9 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v9-squashfs-sysupgrade.bin) + + +[TL-WR841n[d] v10 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v10-squashfs-factory.bin) + +[TL-WR841n[d] v10 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v10-squashfs-sysupgrade.bin) + + +[TL-WR841n[d] v11 Factory EU](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v11-squashfs-factory-eu.bin) + +[TL-WR841n[d] v11 Factory US](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v11-squashfs-factory-us.bin) + +[TL-WR841n[d] v11 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v11-squashfs-factory.bin) + +[TL-WR841n[d] v11 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v11-squashfs-sysupgrade.bin) + +## Image File Signatures + +[Tiny sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/sha256sums) + +[Tiny sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/sha256sums.asc) + diff --git a/docs/TL_WR842ND.md b/docs/TL_WR842ND.md new file mode 100644 index 0000000000..c831e83023 --- /dev/null +++ b/docs/TL_WR842ND.md @@ -0,0 +1,41 @@ +# TL-WR842ND + +## Specs + +* SoC : AR7241 (v1) AR9341 (v2) +* RAM: 32 MB +* Flash: 8 MB + +## Versions Supported + +* v1 +* v2 + +## Flashing TL-WR842ND using tftp recovery mode + +* Press and hold WPS/Reset button, and power on router +* Wait until Lock LED lights up before releasing WPS/Reset button +* Router has IP address: 192.168.0.86 +* Router is standing by for a tftp server to appear with `wr842nv2_tp_recovery.bin` file using IP address: 192.168.0.66 + +### Example commands using [Parabola GNU/Linux](https://www.parabola.nu/) + +Configure PC IP address to `192.168.0.66` + + ip addr add 192.168.0.66/24 dev enp3s0 + +Copy downloaded image into tftp server directory also renaming it to `wr842nv2_tp_recovery.bin` + + cp librecmc-ar71xx-generic-tl-wr842n-v2-squashfs-factory.bin /srv/tftp/wr842nv2_tp_recovery.bin + +Start tftpd + +`systemctl start tftpd.socket` + +`systemctl start tftpd.service` + +* After a short time all LEDs will flash once then router will reboot normally + +## Reset instructions + +??? \ No newline at end of file diff --git a/docs/TPE_NWIFIROUTER2.md b/docs/TPE_NWIFIROUTER2.md new file mode 100644 index 0000000000..20738ebe74 --- /dev/null +++ b/docs/TPE_NWIFIROUTER2.md @@ -0,0 +1,48 @@ +# ThinkPenguin [TPE-NWIFIROUTER2](https://www.thinkpenguin.com/gnu-linux/free-software-wireless-n-broadband-router-gnu-linux-tpe-nwifirouter2) + +## Specs + +* SoC : Atheros AR9341 +* RAM: 32 MB +* Flash: 4 MB + +## Versions Supported + +* v2 + +## Notes: + +* This router is a re-branded and re-flashed Rosewill RNX-N300RT. The Rosewill RNX-N300RT uses the same board found in the +TL-WR841N[D] v8.x. The stock RNX-N300RT ships with DRM and CAN NOT be flashed without non-free software (unless you have +a chip clip and SPI flasher). Some versions (v1) requires the flash chip to be removed before an SPI programmer can be used. +ThinkPenguin's offering ships with libreCMC, does not ship with DRM and can be fully re-programmed. + +* The names of the firmware images for this device are `librecmc-ar71xx-generic-tl-wr841-v8-squashfs-*` + +# Firmware Images + +See our [flavors](https://librecmc.org/flavors.html) page for a description of each type of libreCMC image. + +## Legacy + +[TL-WR841n[d] v8 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v8-squashfs-factory.bin) + +[TL-WR841n[d] v8 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v8-squashfs-sysupgrade.bin) + +## Core + +[TL-WR841n[d] v8 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/tiny/librecmc-ath79-tiny-tplink_tl-wr841-v8-squashfs-factory.bin) + +[TL-WR841n[d] v8 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/tiny/librecmc-ar71xx-tiny-tplink_tl-wr841-v8-squashfs-sysupgrade.bin) + + +## Image File Signatures + +[Tiny sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/sha256sums) + +[Tiny sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/tiny/sha256sums.asc) + + +[Core sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/tiny/sha256sums) + +[Core sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/tiny/sha256sums.asc) diff --git a/docs/TPE_R1100.md b/docs/TPE_R1100.md new file mode 100644 index 0000000000..01ccf92a72 --- /dev/null +++ b/docs/TPE_R1100.md @@ -0,0 +1,47 @@ +# Think Penguin [TPE-R1100 mini WiFi Router](https://www.thinkpenguin.com/gnu-linux/free-software-wireless-n-mini-vpn-router-tpe-r1100) + +## Specs + +* SoC: Atheros AR9331 +* RAM: 64M +* Flash: 16M +* NIC: 2 10/100 Ethernet Ports +* USB: 1 +* WiFi: Atheros 802.11b/g/n 2.4Ghz +* GPIO: 3 General Purpose and one switch. +* Power: 5v USB + +The TPE-R1100 is a general purpose mini WiFi router +that can be used for a wide range of applications. +Some common uses include: + +* Route all traffic over a VPN when on the go. +* WiFi to ethernet bridge. +* A small web server. +* IRC bouncer. +* Meshnet node (CJDNS, Batman...). + + +# Firmware Images + +See our [flavors](https://librecmc.org/flavors.html) page for a description of each type of libreCMC image. + +## Main + +[TPE-R1100](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-thinkpenguin_tpe-r1100-squashfs-sysupgrade.bin) + +## Core + +[TPE-R1100](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-thinkpenguin_tpe-r1100-squashfs-sysupgrade.bin) + +## Image File Signatures + +[Main sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/sha256sums) + +[Main sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/sha256sums.asc) + + +[Core sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/sha256sums) + +[Core sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/sha256sums.asc) + diff --git a/docs/TPE_R1200.md b/docs/TPE_R1200.md new file mode 100644 index 0000000000..b618967f8c --- /dev/null +++ b/docs/TPE_R1200.md @@ -0,0 +1,59 @@ +# Think Penguin [TPE-R1200 mini WiFi Router v2](https://www.thinkpenguin.com/gnu-linux/free-software-wireless-n-mini-vpn-routerv2-tpe-r1200) + +## Specs + +* SoC: Atheros AR9331 +* RAM: 64M +* Flash: 16M NOR + 128M SPI NAND +* NIC: 2 10/100 Ethernet Ports +* USB: 1 +* WiFi: Atheros 802.11b/g/n 2.4Ghz +* GPIO: 3 General Purpose and one switch. +* Power: 5v USB + +The TPE-R1200 is a general purpose mini WiFi router +that can be used for a wide range of applications. +Some common uses include: + +* Route all traffic over a VPN when on the go. +* WiFi to ethernet bridge. +* A small web server. +* IRC bouncer. +* Meshnet node (CJDNS, Batman...). + +# Notes + +With the release of v1.5.0, NAND flash support is not available yet. Before upgrading the router, +the u-boot environment variable `bootcount` needs to be set higher than 3. This can be achieved +by ssh'ing into the router and running : + + +`fw_setenv bootcount 4` + + +After rebooting the router,the router can be upgraded using a `nor` image. When upgrading, it is important that any settings +are not saved and that the "Keep Settings" box is unchecked in luci or that the `-n` flag is specified when using `sysupgrade`. + +# Firmware Images + +See our [flavors](https://librecmc.org/flavors.html) page for a description of each type of libreCMC image. + +## Main + +[TPE-R1200 NOR](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-thinkpenguin_tpe-r1200-nor-squashfs-sysupgrade.bin) + +## Core + +[TPE-R1200 NOR](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-thinkpenguin_tpe-r1200-nor-squashfs-sysupgrade.bin) + +## Image File Signatures + +[Main sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/sha256sums) + +[Main sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/sha256sums.asc) + + +[Core sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/sha256sums) + +[Core sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/sha256sums.asc) + diff --git a/docs/WNDR3800.md b/docs/WNDR3800.md new file mode 100644 index 0000000000..74b7f10479 --- /dev/null +++ b/docs/WNDR3800.md @@ -0,0 +1,39 @@ +# Netgear WNDR3800 + +## Specs + +* SoC : Atheros AR7161 rev 2 +* RAM: 128 MB +* Flash: 16 MB + +## Versions Supported + +* v1.x + +# Firmware Images + +See our [flavors](https://librecmc.org/flavors.html) page for a description of each type of libreCMC image. + +## Main + +[WNDR3800 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-netgear_wndr3800-squashfs-factory.img) + +[WNDR3800 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/librecmc-ath79-generic-netgear_wndr3800-squashfs-sysupgrade.bin) + +## Core + +[WNDR3800 Factory](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-netgear_wndr3800-squashfs-factory.img) + +[WNDR3800 Sysupgrade](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/librecmc-ath79-generic-netgear_wndr3800-squashfs-sysupgrade.bin) + +## Image File Signatures + +[Main sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/sha256sums) + +[Main sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/main/targets/ath79/generic/sha256sums.asc) + + +[Core sha256sums](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/sha256sums) + +[Core sha256sums.asc](https://librecmc.org/librecmc/downloads/snapshots/current/core/targets/ath79/generic/sha256sums.asc) + diff --git a/docs/WZR_HP_G300NH.md b/docs/WZR_HP_G300NH.md new file mode 100644 index 0000000000..ab3aa8e340 --- /dev/null +++ b/docs/WZR_HP_G300NH.md @@ -0,0 +1,13 @@ +# Buffalo WZR-HP-G300NH +This device is scheduled to be supported in the upcoming version 1.3.1 of libreCMC. + +## Specs + +* SoC : Atheros AR9132 +* RAM: 64 MB +* Flash: 32 MB + +## Versions Supported + +More info soon. + diff --git a/docs/Welcome.md b/docs/Welcome.md new file mode 100644 index 0000000000..30fb4a0bf9 --- /dev/null +++ b/docs/Welcome.md @@ -0,0 +1,71 @@ +# libreCMC : The libre Embedded GNU/Linux Distro + +The libreCMC project is a set of fully [free](https://www.gnu.org/philosophy/free-sw.en.html) [embedded](/wiki/embedded) Operating Systems +that give users the freedom to control their computing. Our primary project is an embedded GNU/Linux-libre +distro that is based upon the upstream OpenWRT/LEDE project. The main difference between OpenWRT/LEDE and libreCMC +are the fact that the project removes all [non-free](https://www.gnu.org/philosophy/categories.en.html#non-freeSoftware) packages, drivers and firmware blobs where the sources are not available under a free software license. + +## Why would I use libreCMC? + +Full control over your computing! In many cases, a variety of embedded devices require components where the sources +are not available to the community under a Free Software license. These non-free parts mean that the community can't +fix bugs, security flaws or even use a newer kernel because drivers don't work with newer versions of the kernel. By using these non-free parts,the user is at the mercy of the OEM or manufacture to maintain support for newer drivers that work with newer versions of the Linux™ kernel. + +# Quick Start Build Guide + +1) Checkout libreCMC + +`git clone https://gogs.librecmc.org/libreCMC/libreCMC.git` + +2) Enter the libreCMC directory (from now on referred by `$SRC_ROOT`) + +`cd $SRC_ROOT` + +3) Configure the build for the [supported device](/wiki/Supported-Hardware) and +the packages that you may want to have. Some targets may have a very limited amount +of flash (primary storage) and may not have the room for certain configurations of +packages. + +Also, in order to build libreCMC, make sure that you have all needed [dependencies](/wiki/How-To-Build-libreCMC#what-do-i-need-to-get-started). +After having installed all the necessary dependencies run: + +`make menuconfig` + +This will bring up the ncurses menuconfig interface for configuring libreCMC. + +A good default configuration for many people would be to include: + +* Luci -> luci, luci-ssl +* Base System -> ca-bundle, sqm-scripts[-extra] + +4) Actually start the build: + +`make` : To speed things up, you can add a few more threads to the build by using `make -j4` + +5) Wait.... + +Depending on the machine you have access to and the configuration you selected, it will take sometime to build libreCMC. + +a) What if something goes wrong with the build? Run: + +`make V=s` : This will allow for the build to be debugged. Sometimes a source package mirror is down or a dependency is missing. This +will allow us to figure out what is going wrong. + + +b) The build finished, but there is no image for my device! If you select more packages than can fit in flash, then some packages will +need to be removed from the configuration. After removing some packages, start the build again. Be careful when removing packages from +the configuration. Some packages are very important for basic functionality or are needed for other packages in the base system. + +If you have a device that has <8M of flash, then try removing `Base System -> opkg*, ca-bundle`. + + +6) If everything went OK, there should be a new image in `$SRC_ROOT/bin/targets/$TARGET/generic/` + + +# Where do I go from here? + +Well, it depends on many factors. libreCMC can be used for many different use cases. If you need help with libreCMC, help can be found on IRC using: + +server :`FreeNode` + +channel : `#libreCMC` \ No newline at end of file diff --git a/docs/ccs.md b/docs/ccs.md new file mode 100644 index 0000000000..7dcf9bd1b1 --- /dev/null +++ b/docs/ccs.md @@ -0,0 +1,42 @@ +# CCS (Complete Corresponding Source) Requirements + +As a Free Software project, libreCMC works to go above and beyond its license +obligations to be a good neighbor and to promote the ideals of Free +Software. The project was founded on the idea that everyone should have the +*freedom* to control the hardware they own, which means being able to fully +control what it does and what runs on it. To ensure that everyone who uses +libreCMC continues to have this freedom, a mechanism was added to the build +system [1] to generate a CCS disk which OEMs and others would be able to +distribute with devices shipping libreCMC. This was done to ease compliance and +to push the idea that sources should be provided with a device at the time of +sale. Shipping a CCS disk ensures that second hand sales of the device can be +compliant if the disk is handed off with the device. + + +## `make ccsdisk` + +A new target was created to build a CCS disk based upon the option of using an +external repository or to use a local checkout. As it stands, this includes +everything except for u-boot sources for a given target. In the near future, the +libreCMC project will start including versions of u-boot for all officially +supported targets and, going forward, make this a requirement for official +hardware in libreCMC. + + +## How to use + +There are two ways to use CCS disk : enable "Build the libreCMC CCS Disk" during +image configuration or run `make ccsdisk` after all desired firmware images have +been built. Since u-boot for a given target most likely is missing, it's +important that the sources for u-boot be packaged and included on the disk. To +do this, make sure they are included in `target/ccsdisk/files` with proper +documentation. To make things a little bit easier, enabling the toolchain option +during image configuration and using the toolchain to build u-boot will make +things go much easier if it can be done. + + + +[1] libreCMC is a fork of OpenWrt, which both use a fork of +[Buildroot](https://buildroot.org). Buildroot is a build system which helps to +make it easier to create firmware images for "embedded" devices. + diff --git a/docs/embedded.md b/docs/embedded.md new file mode 100644 index 0000000000..191dd17367 --- /dev/null +++ b/docs/embedded.md @@ -0,0 +1,15 @@ +# Embedded Systems +Embedded can mean different things to many people. The Wikipedia [definition](https://en.wikipedia.org/wiki/Embedded_system) is: + +> An embedded system is a computer system with a dedicated function within a larger mechanical or electrical system, often with real-time computing constraints. +> ... +> Examples of properties of typically embedded computers when compared with general-purpose counterparts are low power consumption, small size, rugged operating ranges, and low per-unit cost. + +The libreCMC project's definition is: + +> +A device or system with very few resources and is designed to be run for long stretches of time without user intervention. + +One of the main goals of the libreCMC project is to keep things really small in terms of operating footprint (storage and RAM used). Many of the devices that the project supports have as little as 4M of flash and 16M of RAM. In this scope, many SBCs (Single Board Computers) are well outside this range with some having more resources than an average desktop 10+ years ago. + +# Page needs more editing! diff --git a/docs/images/librecmc-changing-admin-password.png b/docs/images/librecmc-changing-admin-password.png new file mode 100644 index 0000000000000000000000000000000000000000..6e6fd9fc00514d051394bdfed3243040fbfc09de GIT binary patch literal 46809 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

czdDyY^gJ&suB)5I5JjYon{yO=;jHSUjFp?Q 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ࠫh0b&J{^Mx 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 literal 0 HcmV?d00001 diff --git a/docs/images/librecmc-changing-wifi-password.png b/docs/images/librecmc-changing-wifi-password.png new file mode 100644 index 0000000000000000000000000000000000000000..e94de8d066d9ff6d31702eff06b245f71c393953 GIT binary patch literal 47976 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

-9z}W8aMvU3np2A>?`# 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 X)a*Vt)94oM&2Ms2N|HtIjC}tGEjhib literal 0 HcmV?d00001 diff --git a/docs/images/librecmc-default-interfaces.png b/docs/images/librecmc-default-interfaces.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf0d579a31f56138b6c088b0adc1fe8faf382fa GIT binary patch literal 64149 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 OAZZB&7*b5%?|%RXQB%tR literal 0 HcmV?d00001 diff --git a/docs/images/librecmc-default-login.png b/docs/images/librecmc-default-login.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9f54cee2e0173ca91020684e2dfe2e56051c0a GIT binary patch literal 32206 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 literal 0 HcmV?d00001 diff --git a/docs/images/librecmc-dhcp-server-ignore-lan.png b/docs/images/librecmc-dhcp-server-ignore-lan.png new file mode 100644 index 0000000000000000000000000000000000000000..34e3981ba231764993d038922f3382ae4863b20e GIT binary patch literal 56874 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

hMb6k)jKCZ=5lkT!PDweDxwxnXg+~ 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 IC~y3K0LcjGSO5S3 literal 0 HcmV?d00001 diff --git a/docs/images/librecmc-eth0-added-to-lan.png b/docs/images/librecmc-eth0-added-to-lan.png new file mode 100644 index 0000000000000000000000000000000000000000..7c289ce8635a6099dd6ed5933ffe7ff41f1edcf0 GIT binary patch literal 61140 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

kGd~em8keg!5WU)%4 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 literal 0 HcmV?d00001 diff --git a/docs/images/librecmc-luci-selecting-system-log.png b/docs/images/librecmc-luci-selecting-system-log.png new file mode 100644 index 0000000000000000000000000000000000000000..b165160086d2e258f4bf9520320daca2ef5cadb7 GIT binary patch literal 36879 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

  • $)%0D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

    ZQC|-?@FCvVp{?CT|DS_ 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 mNk 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⪚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

    AX%ca`JC; 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

    LD`Ipg`GE5z5GXRp^h6KwamCgu5g5$Ss?|Y9 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

    B%V6JkC9G)Pa9s4+%8C%?nP@Xe zK63$DXEA!mlF}$r0mQhF6F(nxhQKj#gp0P?Pq@`xFpBgLm&n(Jb$#2o=xyv41IkpmfULc0wF#6)AX9`|mvLMn{Na@VW0h zoTB^|v{omvqbOiwN}BEN9K~+Qb6|^%d{lIH7(T~o7>5r6I*Ojl+7S8iyGaA(J&{^+ z?&{bb%?F+qSe?m8=e%(mvQY$#Z6;Ju#L+OdjI-)E4*dN2j(y*8Syqmh^9a#lWk+(( zJ3@4bEvk5OLi=&Fmo|hlkRty9FTLrkvW;tN1@&lXaENIGd?$BZv3Ncr`$$7TMNh zi{7uL6twQJ_=Mnr-XAJro?U5Bw@J?QS=;w`3o1TZ6`TxJ7|HC|-medr*y>}G~$jrFR zgI~fUP;Bd_nT(`Z8wDUUBRt&K`W8LkJsZ8XUI&X1pj8JS!1uOOVUHaQc^_ER0XSE% zx2z-wdY0M{`(*bCX>!Xo*TWUdE#nSh%f;I>&oW_4R zlq2I_Z$M(9s=>?;!$5YhpjM(suqa4eY8uIvg^JNM`US*A9O42*d}$+r`W`@o3rb|6 zHN#aB0`~i*Jv7K{OkCw$c#EQy{kqgcMND=NmipB;N@Ndra2m-Yt`Z>-csLwph)_z= z*Y}RH?&(}*1_iY}#9&!b1jRW7eNJ+g#%pg7OG6@r03V!+;hQDK2(^^Y1D=P$wh5KE zxna+1^Pzo?khRf9^0W4tl4~jg2f>k3UN{j2B!m4pc9gPd<46QccAtM3+IcsKzI2ey z!d;m6-AO&{V4R}C;2bsexUO%e>0s;U8E-u|EI<2MTYJm1V!!J-0(Yiz^?Pc14{nU< zn9slREXjAL10M8s*~W5u-v`Iu6UC|&j^RT;Kl(tzzLG0SrrQ758$wv&T*BM;f8hD$ z3(ik3`1`Nl@c#a;G)ju4jx1zPL;T2kD#nDc!^bXQOFki&g5%=@`{fL0qQ3%DY2vcz zz@lUz?;8#r`1b9F>&FM~Z*Tbdr=RerpZ*EXdwe}^xR;9TfhvN8#zc}_5JJQf7bJfE zqYJ3M;?H|t3#51j? z$7yFnO(@v+`#{&|>nKHX=K}aDZr;j6zJOROwtNh|1RYj{F$QsN?(1i?`1HopP=3C^ zM1Y6;k5TpHuIC|yqro@zFMIvgY8PvY=t}yT-bc9A#48&^mF?Ghep~ilw7rfz#T`j~ zWF64`zRV;r^N$$$QVI?E0F8;Xf)NoRX;ij}y_RcN^N608eQb`Y?ZzXi9|}r2P$2bK z>5+ma223bAp1CE57lufIY-mX(NiJNb6%_GeI~Ft zV`usq3B+^Wby!zz4bDA9TNlmoP;ws-38j5PXYA(?9gelaL?-EDn);t>hMI}kM`R7E zt%w{rie=_Ly&dXVihvcPIW|WW?ny=N1tR!?3ZkMKexBBp@N_ottj%|48V@0>H7AH`?3_ix2~eJ{c9M)!K};f*obeh<~epU4{5 zM5t8@T;aNd>sl4Tn)e|@j8RBEM!h+BDnnc4a-cm#0L>KZTC4WNMI@SQL5!Y6A1?po&@%sSR|hdXhYveNHsy%^EN2%^|G_bCVD#>K?4I$uidB(PF`2PK?=10$i1yN{= zBGWd0N~^<0SPiJo5^m&mk{P!932|t1#(TU_QkR!?Nwf-e&R9kBoGB;IuY6Y`F1lPU zzz4^&)P`HWst`=x+q$lJW>xC#dhG+UsrfytE_2TCj0*HSwuQCGRUm+tpF{_>Z<;OXgwuXAOWYgaLE+lIgY{qH!P z7F|=i_#^RJ$EfVmlpZB6MlE3WT}5uKjjq|Jrzc!47ow4r9o{X7OX}`goB3WVRvw@z z<`5kNNKK8P2PMJKN-=aC8*0spVy-Btj)oBD^BK-T*FoE8ro%|m;{G@`9^xlBmub+& zL)3jg__^L5!~{8Kyu7^N<>dv(QSj~CH~jlw{(`^$^{+Ue&v<@**6aNA^n^eE`OiwR zan5N(lVF0se*K41Yu?}A^;vv+deXhu-pdxh{QdiPJU>6<`S}^w>vg~s6IqAi5Wjr+ z5zaY0Jw0)~;<2U$`%&=q>sLI#{(vt}XEXQx|JgZi*f(Iu1%u zj3J;#7!g7p)?BSk;-f30=PmbW)KWibUi$8cRL3%B;_gP2m^0M}BI?`s9XVrgbkDTH zIgeKeRoy+{w1yEwz|cJ4`zK*lid7B)zNN9@%7?NPB1)?d*BV@>F3X|>$$9u{_a53K zqu#Tn@|t6481zh~kr>3zPHFtvh)Ef++ejYUP`6?Mdo3;T$GUgq`yPlY0S|*Qdp~Ln zP;h-1!|SYk=d)8<2z1s}>0Eoj!jI8qNm#=ube8FYCAo_@pw-207&p2OJc+Y|<9_)R5eBkZv9q-q7oX$^Vj3@w?E|e8tjmggz2l$%_$Pe% z@kjiBfB!4~_WqTKRL-mOO&VECh}0JV5ZNzQaz;FzQ8=a#jO%ud@zSkRP4<1Kp_v0h zN{9_;N5+;9#0s39!zo1spJ+X9mDXra%{K3h0Ruox3)Y21oK4JLh2osnn9wQ@$5iC) zKXs;BVZ}VGnCUFDQ_uEtN@1F(cY~O4rU3N8WEh4&*3ECv7nXc8*9W?m9|xlJ8u+;$ zgfF5>at{CXzkWw#Bd;x@t5TGH|SqcAzM4x9-v)I^|P6#v5nTVJy}Z^QK1lD!VhljT3+4!uhge18>5(6bdu-f)wCi#8IvopmAICMw4r6b6hpoyTNdG5tiEO4n~ z9e*5kAWaTY?@OXIuu|Y;z-HnVY#ld#&pmqNvmR^;Oq_4D&-lr4P3Ms?)Y9U7ZpKhx z&$QL|e!dm6t!Wwh*R>MSWEMQzUbY=_b;4w?apYbTGK@s#?)whMu@9pmb`*C@-7WXz zOnMO-?QE{Fv<~mXgAj6ESN$1#W*^RsQxu1#C5j+`NM_|hbXGZ00OsE7M1h9d3i4J* zLad?6(7K0V-4Vfph$r+l!R9^rJNJT5DGsjt)pz>a<#NH9`^Ecx8}?+0H&MeZlWKCS zLqAz4GeX;t_!bd$yGG|)R~r$wOwTmDAR#mT+VZyF}pKhdO*e_F*6_JwY)N zl|1%A^tJrhH~EZ|GQ<W)TR4Zzj$!qpLYqbsJbK94&*H3GWh6i!LEU2;9n`XCB z_c*E(Y2Bq#&kgqw;7FL!9u2wnyPMbN`CQORG#E^0bL@~6`pv{kA*osNj;*_d4l8vm z#rL#fjcoO?CX)Bn*f?#^2-(b`gt+9K(@4a!ZGdY^_^i@jGr!jl^pW=Y{KS%G!T}YfbNC6;{S^ zjhWBU^ZDEMXr$jd2z1PK6#|z%mvsX>luSJItHp$4`c}hdoy0^|7;GU1Dz-_zZ zd^*tvQ7iub_rK%q?G69;|NH;IEeZAQ%H$UQLZU-V5xG@7zr2t_iV=>ZrH+B}d=FwuqQL+jNM0jzuO^ce~C{ME&9EshTBIIj>(>=vBIDwtxYmqk^ zgr6@uh?ol#>rB**5FS1xqzD%86g>#VnBbhpx-O`wTD*tAu}N`-Lnk1Wa!@8@B`5k` zGC~;zA8?MdQw!2^f{(NTT`m{hG?rz7dwK$DMGSP}&YH~Y1g%*I55r5A1A>2uiI4`! z{Z8oOAAkIUQ(6#wNAZfV#(NARL=nTp7?@BrVzI4DT$>(#RCxm;D58wukGFRs{dmd| zc3|-%U*lW5@%O{AJ7she=}+3j<2dm2e8%Pcj9Lrs_YYjJSN!tJFYw;u zr$79F=a&mN7=d+J@zYN~;_KIM6i2|ZQ%61U?fo0>_YeH~>#w+6E_iu)9tw9U`sLpA zjmR9O6uiH`C%j$Xv7Ao0?sr^2J`m38Vhs);HoPBvcuV+0%ta9V5FGks6($T$Vl{K*HLk3evW%oXv{fekeTxTT@_ zLVL|pH2y>~$tl}BAUKcadPJv)@+{#_qI1>|aMYwiMQ4bFvd$iSCWruv7Xfb_^3LTs z)WdJ+_sq~7c8%i4mWbL4Q22o6fDlMjWL@WWotHJ(qHTpz*jmHauU~OGEi9Bh>F>PV zZbRm;jkoFbSsH{}a)vqbhFta`mTf-Zih~-T5J2YUet#wy5AO_mHWzj1(fb7u>7MOF zpNbITAgJvzQ;QCd?)Ur9%prOz?fvD*D1syQQ3(&->DJVo;aJp7O;Y2kYaYS($gPUr zup9BpGDK|rx})=FZk%W%JlCGU@<~I)#vI96;W!Q~sSe`Hq2bmV#lRRRS2fg`S}Q^f zL%lUS_iPg=36VkuSf0*tL>A-R`8w7MeK^=1dU8*Z5O(2b`q61=$u#mAWH=}T!htYg z9e*NDa%1Dj4p-!CW*fDZmgBugnP^ANR}>T?Rmt@XULAhoW)m^TUMlXl9s8bf`?%xn z?S`By&gUmG1?;0+cA(?5iWnk7O8D*D8;OefJRi{r-_6cZ8BibuIIdS?jJU*r+$zy- zec)VpM`D||54`6cxDaOi^74ZJ`STx<_XFGaD=x23_`}N=T(>*62-N7|0tN$nii!2JA5$GzM+HT1jvv!je8Jq;}PR zM_2QEe}zC@e(&i!a$0Z?f)tCt*YBcG&V4llC(oiO8~xlkW-qXqQ-!v^QQ~umgVBc| zJfVweN*C_vI>z)K5^2T0f4ivPsU4)q=b$0?X3~mi|ByYF_Ug}@&yw_2YvDRzY>LZT zU(?L zT(84>?>@!&&yDt>;ZHetd~Ir{Kjn;;%cp{&BJ|AKhmoZaRWp=+odhiH8xT!2giw>4 z5!TG#t^B!Ko02jFX(DHs&xRv*5GUtX#%&NW8CrVuxUy0oM7r|b)>=`N5_mjBZ;PmA z7D-5~7YThGwhbBuD&k+Ni5&_Y(NbhEFCwqlNu5JvVrw{RK{hlwD^77P@bGTOwr?nT zj@FR1uP`A+z7V-rh;G?xL*aM_I#-MXmLV##JR1I}UYGb#67@yrH7-DVcpp%5?1e(WO}(=u!{Na$PYq0F^_uh;Q4VBQ2+oS07*naR129ziP%gvS&VeA$$j8l zj~gv{qi3%<+O`3NxKNBoJq8*VJ=64e?;}M3M?P12s6&5UlSWpHQ8>Cd41XI6VkEIe z?|t)rVa_bRadds?QOKVSzoQ5v_}`OfgR>(Fp*Z_Rpzg$&;2Nr{4+PLz42r-{uBq8A znRYhkms)Y~b=vn`X8<3=p%guH7c6E&n)1XiK3NH$T~D(p@{a0s$K+%c zgAnRZW5}KBre23Y=f@DqoCPw|iAYBFKcEdX5Fy!mj>#nQ)KtecP<)Q74<>s{m{nq4 z1I-Y_m^yNloz_#wq&YWISqhjsf+IQ*-281BOKJJs;7|N4aU(*@^0{S&rdf5q)~8!@#(4ynNN^D_=U{AM^_Fd_o_1GsG)4U-X2 z9Ubfhw?-nGnOe}@At5^4K6cIE5|yY@4P1nCge2D+j`4h`)Bp*Lziy>sO$)`ml&l-; z$H&JYma&mK_xl~|iHhKok3nH-@%eM3(-y0;0jg+6V~Hqk>f_@Br9?CAyeqa(lvWn+ zHs`F`T(D(Xa5|la7%Hpkp50G&I8-NG)0iVEYRih|Y3Q#T^rTAGKWpCa{eH)GzYore zhKkJZfpBN+`YOjz99=G#0kt*9<;b6()wS}TC3|#sUkouk97ko*={p}{rO2-N!0mp+ zU4CbYgZpUTNvQM2gTpUhz9`{o9-vq^!<@q?uP1~8$y_bDH(@QVw-t(pa?NSpWXt4k zteFl0YfL0i@MDyYJZG&nxa5bXeQSMzw+FBo`oj7A{EU~U3(o5aWzVR!AcmyH2OS)e z=GNQDu_1=bCyjlZ@rD^eoj&BtvU6rPq4b-&+H8o5rlZNv3?h4&s$PfzMh zv5uh-f)2F>^Cn`h5Lm$SAtEV40iH0P^B^vOThkRU1^pQjR|N3A53#Byt z_S>(0(0FXx)L)hb&(9Zx;PCC+9dK2DzwFoLI8e&=khN+Xw6f0(xuC5VFp~Lvzu&PP z1ukc5jAqI!?$nW@VCGH4S)OF-*7&k@zYN~A;ySr-@d8SXy^aEo~eBIJH-s$ZXcc4W*VhAXWVYLPVhn( z)x5sGY9{x$Z{Kii`=>-3*BZx3Pz2TM>nqOZC+xic3u)%{^%eJh!%+%a^y<=*$fteZ z@&5fgg7>&25;WA3jVQw-xqy}lRT~(K4ezjUP1Z~f=|BJTKPzSJdcD#*&e4;F_na*s zgLB9>s{3{1hGvb3aT!DjJ?GXT_=tjr>-C1e{QKYV{{D`amnS?uUr5*+mr2E59~{Yf zI!LFKI9~G5Yb6I{S;OWgJ;f)E1iUKZv^5P)J9zidsFvSlYXe$S;{)Emqqoh$rAdTL z)#0@qVyuh94i)DJ0w?aIS`^#v7V+}H~arSh;Yj4loDJ$xxB=CfOJi)}W~gthqq_}QSm z6V{57dc^TF;Qvh{QK&GVV#^&pv*&Zs`_Q_x?SR%c9BLVx)zTP0GKRHu7Q4;}VY!~R z5ny9XdsBd$HnmO7kI|`UNuSiT>iOJu5G&uM++QCbA4UO&!E)+$*#0VcKb~MI_*eY(kU%S@O ze1MAqD@S)GA4miX`sahs#?@7{=M{U&xW0YE`SdfEWx>nK3;yMw|0llv_7#8m-~St@ z_ZPJDg2e~8=;2a?a}9gh5j{~ZeQn6x&?ho24KF2LH*Xsb?-A3|2^7*`tUUCGXJ;hR!{W z@$BCe$KHDwwbL~uKB{4GNn09(73kaba&ByP`b8&W%CkqYBy#pC!}>J;oc%0vZ;Pn~ zG6boWOi|8tF^vdo{@Vf@9(0IUN7O^P4zW;!E7Qb2h-g$|Qw9WgAnLU38}b5N%||OZF@T5P5Q5n+DQmVE5v~dC@(%>}PkU zjRBB#OFpBVt*m3bl!D6UBI(c0j%m67gu-X(B@)kMdxs>>?qn8;^R%_1y`Q_Nqz>!< z19eb@PTfkc*GU}tGy1-iqQf(dub19Lpz)FjxS-D~3DF{)Mj^_u(DrHS)LXDb82!%7 z&ujdW#DEy_)zBvZnLaUHZygZS{(7@8M(S329|wQ0co;C)VVL%ykL$@hT*b4M)4JB)FCv7+-^w~W`&oI6d z)Je4Jhd*a&?DKiS8Y)#BHO1M@WX4vV6IB$QoDE#S;~jN|9_eW#hyC+8#im3F2eWb4YJV$ZQaFhmpD2OaXqf$E7QMFgZY z#!Nbgy%6PZ6l-B1-D}M;MfS;HFfC~$$Cx_EKHGELqKJlK>;pqs|;L#&@F)WC@8* z)1HYBkfO)9Y|5L zc+;2~?Dx>ub~nU#%>+_={Y#+Ol9n|jG{RKEYN2Oe10V%s}GNnrt~^RBh#BP zyUkQo+aLHnql>NOX3_ObCi#rKA~mpz2TlCED)9t#9Ys&SMNO*A(ioWEs>5PIu)*nscepa_TEF3cWp8a4bRRbs272lq*e^yz3JiD zNX5_k4K{|`&V(#6$)*=ra<{7^*-hzc5;a-JdqK#7wif)%R3-JInuDB>-NGQEvGc13 zLDzJ@(ml~0o~wc4h4!FHn9WI+oOl%Kapzi9_&fK9a*iU%_ITt9zCgtqm&5aI0oGS3RPwy}uA%(4{3mmj_$x}Kl* zho4`8AASIiow55(=@k_F)KIw@M>(sR)V|JRT@p^GgqCTbQ&}Ay8qk7MY<_7KnWIOR zlep^r(2S76>!@SXAEBTf4y9DodSJU{dXI4-^%%zs1UEM1!2^kqA_9^+Y$aYmFym+* ztvZwnYOOj_gI(VvAi}k^!DGHB>8q zC*tDmt|Jc@99)QS!E2ElSs`8~tXlMfi=_c<<2*YV0M=IEv-undD9-Cc=vdUTrV~5@ zI|4}6t_3&W@J~-q>Oj?n1OYWS?A)MmtolQ32+kv>sQ>QaP~f#d-uF!%v0!E4cKg8B zuV3+Tzaene_sh!*PRokt=Vv@!o)LURzP{mpzvKCthOnD7-CRJ)oqQ5v84e*<{A7z= z`RC~SVo%@Ui8hDp6*c#$0#S_m<`EF!+tI}~X5qQt@3`G=ijmjDITJ~0%Zl)VIdE#> z<~+{l6-!KdJzAsp`~3V&!<--mE;XDhy2DEv)!8o-1m)#ob{;q~>Eikg_H=UGN~)sjxU$?%Y{(oh|>BKd%2 zNgPu_Q8=wR{T}IcqB-nlpbEJsz=tu5SR6P~2#5gUbUKlsXxq@5LrPu;)e>hU`1i&t z_L|9^C=?`G8^YjR^hWGeTgHA=_&hq+#W{!C^t&M<4t=ikLgJdRBqdRaut16>A%i?U zJz)`XAFq3IFqH#|Jq%FMaEy@zE&x8Dv^s3g%Mz75L(c^Xi&`O6XeqRQqh_Sw5!|AC zh&^~ov(|fu*Vk8$0jxuWQ_nNq_1;|42}@c~OCvfG-~ZA8*2YkC!!XKw*)O@c7;RR8YOq zYQrg=^!4c(1Mc@7dm-}TvXC=gC|akL<1odeS1GSPn1d8K(P&?H(GLf#<+N(7od}Su za5!*HuFVrTv_g(1Me$dAICVfkP3@@4>KW7{x^V{*DiEW0&*ajZ@1e++>Ub&!KYr!?BzjdI?^3I zJNclPV2RHH95=k{(1Z(aY{=BxTGi=jIze{7xK#V}ifbWBHYwobkrCC_Cu4j0Em?2Q) zdjc9o>RfMz+1IiWgZ9ivuiZ52)P5d0V+qDxgqwDlAlJg)OGFq8+Dt>B?>SeZ+{U<| z)*ZERU{TE*Bc&bBu=b z4r_`Wg+Npn1gg>Ue&E+%e}#)d8<~ltlDA_=yCAV@E+s4vFithybJ$c6Xq<0ADG)-Ia=%sCJOP1RcyXH7iqsOGJqf5rzwagt+{@ z+_=sG8ax{IRd9u)`?;Cn{SxkVk&z)`9Ze-LZd7t{Bs)?1pZSZm>pVJ zp{x*jR9Mp*a8#gqAkcj_P98*H^GQ5i(^-l6|0ouiCy)IHY6W~%0|%J!>lvlj3Q(D3 zQC%G{+pf)x;}NSKqwGgiDjm|fMnhR9IGJ1t^FEod<&x5D+*T2NLv0Rl(Zu_S zaMcg72RR>V5(%M4>_XhDeBN=jBJkcki!4PLWA~iI4(!I~Wf=lnN*A3S4>On=o9NE> zd&3Uzbhym)&ywZO9fKfO>1-nWFrx2aNb7qq|x1K#SOF*mZVc<15xEL)|gB|;w~Ahv=a5w=?Kh{WHi^Y}p+ zx2t2kR-y!{Ii)rIT@6l+CH5??y@lg|ixJKDeihv#iwX>!bBGI_%W^F!wO~7T93`W* zv(|;y*)PI>5#?5Pns2$n6{?NB_ed@c0`D>AwO{Ysabtr6ok_RtAPQo1EFh^v^ulpS zAD??0KB#!wUSrSC_fZPYmh3Z$k9Gepwd(|1r~87*=*1N{S;Kj~bG7LZGdB>$g$+TT zjTz2)9FFRTnkl-sm5Q*AV&DE==>7)kgW+o)gh?&ahyR|4s$3%q4JQPTnlm!jYBNou z6J=LJ z#W09L-6SG=5LOz}mwaaucjFupf@-6!N3MgVtV$g+3;u-EsC6K(9fd`!xfbp+a7-A6lT%`RKBVK5& z(YneawBy(j;2+|9M06(c<5K6yo;Zk*st`!&9Dvr(h6kTzs81egcH^YK!nGbMXiJPr zyO__Yb83XG(*~hCC!ts&(+pLZi6rwmcz#yq2&Y-dV~vxZDU3n@s-SZQ5kSDbm(eV& z<~iNl1Dubj^0|b{YQ$^fdx!a)1hk-YUKpZuXF-w>YMK#oSdozZjtEfdhx$s+Z&k#y z^0ORG=_Yd041<_OG;>6coG*k@qoO;wPiRRbsyz1$6fHN-0V>pCjakXgy<2u!8A1iq7^z?%Vy5He&<@2Chapqd-AIa-i?1@`^G$HzNDib!ijY?O7lEDOAA@b?=$ z2phjF3#uO}9U|}$74ybTN)c07QidLIOiTu4P==v#X9tzCS&49GH<(L_ELhithE5?; zQ^Hj&Y1N;T*Omi|;6n334zc8u7RGWwoEMX5F{s9ED$Y%ci(-U&t$2TbS8SnX%!^Xm zHKxgc3zje(Ms-p5Ngv!4B1%f5GhGEEL9=M3p()wER>68_(v97G=fa2{W>Md#2TYq3 z&k_?Q1B?-;T5!Eybyz2jWI1?m+r~MU9{_-#|L`LfsSA;aUS3|b;YSL09{zgwyBoN5 z7MD`A89XmK>Ofl3gUeXS1St-S*s<*cep#CE-@kuH&Ka+-uR5F*oIVYu#|5^#Jn8km zJijP?2>_ChIw(j>z~w>_ShxFi*eo6#Jn)>2=@{$W8wojQYzH51II5$d7x1Ktrb2VO zA1u;anJ`e5HXu=7(rA!wUW^g0xj_h^O(qsI+2T=%H{x8SXN}&^b|dk@<#Kr_x~Rw= z56B?~gc$Mu{*LSQs+p-)QW28~mp?Vt>qqa!M zIpcopdf1UhhW8$sU-x#q@p@L2P$Tr98OJ_mogYKyy%sSbk_%j&+z3Lop-q#n;||a9 zO|@2~iV1GFXPTxF#cilEeY1y>$*$Ler>CbO%0nCjd!}Zrd>5LTY{aY9dEQ-#ofM$; z!Fomo5A+V+Yg|`|-|u(C>y_2Yix$JOp6@xs2k=mzoCI(cId=rGxaz)r`-Y=r{P6mM zvtO02bR4oqG!-L?Li)koZi-gHzsfpZ%=Nd;WT6UqAMyPB4DTbh?FRqhw5cskJUh6v z16pa6fBEu7_prv!CA&w?Zk%OVa6X?YQg1!=#?Y`=6n);W*DDgQZ^uzMiVsLEo_cY5%v zrLKxG;{Nf0ZQJnr`ikf07gTQEI~L+f6Ja>?ssNx8J{oW1gS&p+GOuJy05|~5r^a71xq`}Nyuv*wdf!q zH;R~a74X%=g*XVVsZmXl3XZYkIcF?96p+Trc4T#X=iJ3v_Q0D`LR_K>_y#AnVCm5& zqF&=?IhccV)wl#ftIrr_X|zgRZJnaF>7t^;;PhU#4fgK5@Ix&(UqkDZk!PL6ym_GP z$@>(sjK<=6+Gp%uAk>Wz0^;g*J?yp7!7+vXu)iA3A6#D7lKbR(_u9A{1wK0`=pYMY(`bISX2+o1 z{|{N;eD+l#lBtX7ym$;}%>Fxp7#7r45JN+2)VIh-#r1l_`}>uDZ>51^0b)$Zg$J-9 z;+{{T2Vm z|M(w>>!R0jT~};%$MyCBoFc$`n|$W`{m%O;-HSCBw4H`9-dC(CVNE3FyN3gJcAae> zSJWdTFcDGAH3bdzb|djlj4%ZqLW=P4$jBtLsr37fDkJBL(17ZJ;>Z=7)&*-^;5qi8 z`9{sB+ELOq)4rHn0cz2>9eQp%!kfrh6whcIej?fg0ADbO2s-MUDH|b>Xv6e&EYVny z&_k54IloxS9raYGf8@eAoV21(E9m$v&t9Hg`+S)nHUb6_22hN`Ag0lnxBn)!#(9}w zbrQ@l=o&>rJ(E5^kgdi6!$?RDOvbfw3quU2to>}dh~5Z(Ws%L9dTTLu(vAqe2FGz3 zXalxilTuVs4~gIxCM@$k;@!|(#b=*waz=l4K8GQq=(%a%iR{c#bEOoG;nsDk_PRmt zBUx8%zq1yO{#DWkueoa)K5x!th>ID7f|jt;{KI+N3d(AA@NE{E4vQJ z@0N8!$iB7~wF4eGe_9HV70$``biH0tj;sQ(QH&NxV%9=~>cZcFYdu;~g#EG`S;LX@&?+pwHgH3FfM z2&_{BD}3@pA6VAd9_d9!0O!`Q6Yc;2AOJ~3K~(%iANqV0}h^R41Y#*XXW3L}l8##-0gmP5FD# zCi5B6)`4IlCw=E4uE9`?)FTgc=b6?u?_Y8)h4y3Pd2H;Y?T5{;TiGBfJ(pT5#Z|Dt zmWaI2?|TqF8IcafLU%C+nHSw~RuduSOllM3h4e_Y{%D>J>pzeI&^e6;L2dZ>_<&DQ z&&g^yGv`%%Ev?|f?k}>Qp^bxn5iB((T*`Xt_}K|Q3}lFza$pCF{fz1d;lACAYO4=s zk%7E$)Pcm=tbx~jUOV5iu}```I81^qr=&}JzSgsv3IRLiP}cjLv(oWNTUpGRk||VN zV>;7gkohL9Gj0&_*z@MT@3^r!SE)oiBNXDe_5xgecov7Ah0qjT)#urMzn`7e?C{ve zV$aXI?aj+TTTJIFCNy!_z5neV&V+qEqdrv5c@VYfxwK7D(-RS-HaD!z@_f|R6G|m{ zAR+>xpCN5u-S%ZZGilj6Y$hhze$HpY8oPf>k5R~Aov_$z*g;G%y+?_QlGwB=`$ePZ zu_EvSF=O){7e!pf&r8V}xBDFxyeIjQ)`s9!RP`AR<}>orXHk1|JoCIh{2n>U5^C%m zGfeO0vzRVBOR^+STRX}lASMg_JY|g9?V>sf=DT^0zu#vO zzcnn{nYa6dOqX*;FvK?nO<2>R5F6{bzsP&B^^omPOWozoOnxSLMj4WaK+#C$xHD4J zvs-|K7Cw;btvQDl3B{E;7u7NPw1Tii_w9g>2`9f|T~CPXf>s^2gBD_S>4Mw`x7!VQ zKk)Q)X7m^%=u1Y7jz4rmb%jVY-XkT+yeCw(G@kY5VyC3wW}|n=j1WDJOj+Jb(gGtI z44%+Qa?TVPWeWH1#*qb>orSJ{>CQvrRGbf3Pb{oCHYGjeQZy&dBF`!O7`oZC3AwIu zCi{;4en(3MaEsJQ(&Uh$m5QGOd#3m4BNg!aV3h{P(Ok7r z<1isn)?dv^sEF(c_h{;#_Q7L~31vS>F)a>)2IQR@d%4ix0YdyoM+i@fO4;Zdrvwy^ z#^TH~R~tP4JVib9eC*;pHct+evRAa+;8R3Ot2Pv9h+42nd`}~1gP_sD`R(CpY=Wgk z#qrzQ71!$x_2A+lc%07{q_kk$c9fdQ9aN7Yo=AqR!4pQDP;FfJRlcubqJRwMP>M%8 z%Inf@aIgz}EX@iggd~BT^c3Lz|Lo7XIB{8x?Z6J8H&WGS+xT&8&v@ zUgO<@G(K_{5~S#`O#>R+3=Dz9bKA!aK1Fpp6h4$?#x&cFxs;-gWmJkG@jg;RHD}aD zZp39darDavo=#^HJZwN zK8B=2$%d*d+PLy@e@;GX81(cnK#Vupc2a}%415&&c!GQwpen()DK=gt4%;WRyPZsIgNWT01 zj(_~)A4)c{O;*R`oAddMoN0ZmrSS9X>9CwL{_&50sM7tstf;Q>8W_!58j+2Y&=#!G z2UK+7-j^?5lwcz3i8L2!t>m?dhv#zmzTGw!Mn*XAvF~|^Nlb~{*y$E<_y7-bS9v(B zF~NIa+iu8Q3nUg0oKi%|S)(+MV@D|&VM&S;r^5xgMsh9K_YJr015Zy+xLk;e^7S|V zuK55hTjPuj04{`d!WA(jeP ziI$k<4@%8i(gN>jEj*ttczSxm`}@0bga{6NjJMk}J9s?Ts5N7|ADSKB#Hj1~ zy_ZtL+qds3=97pN>-LiC=DE4QL~$)U+-{p`nm5ixXMcVjvG^hifOn+KFLZcvjMjGC zu+V2L(2%1yubkr3ee^^k;PdEy96Auus0X-V|7qT-%AXqb2Vx3wEQ60u>1WYB1mq;i<4D^ zK|L1CqgKLe)9~mt47aRv#+n5%MM*X@*z=URMeAyanw>4w0V}v@lUU?Ic*}J_QBq2S zcMa7y+QUj6V!WizNWRB~k_fyEVk#Nl+WOvp79sIjch*d`uuZR{7L8Ps#(-_ONON}E zjzN6aN`pJfFocd_Ay5e|Z`%iDH0lx|1!n4b~)Pm>rj1(ep|A6VHa%_3j1}Yh$miVL_bV~B*fSOp5t_!|z&njF&fFN@^U(>LJ`zqRim-$G2=e@n zQ_L=``LFyn#3_lmhD9~Ckzf!V4KHim>2%UF0}bATQom#v)PyD+WY2Jl{ho!BgJa$~ zR9@psDZsuXuInJ)7(_;%|Ca?dCCy%-wWySv-pnln#k3CqSfC_!Ng=X`V25K^%H*<4 zDSjH4q!A)*BErd_uN)?~3p%v4n0717IF5s&5}#hwP$z`S+jb|~m7z0hTyo<3sDk&H zs6uUOLQ6B7T&ohBHaE_Nz62y_5!?(t$m}OVmI}cG=utFaQO0o`s7Kc8+!~QbD0Vxb zR3gI^W42Opmo&;*D7>5aY8&q;d#%P>OY~7GIJO=8e%EuDh+fZbghr9eJ=SfXb6;1jL=)_5ig``X#cUck%}zuj|RAo$<0!OM}yTJ6C!P+Mk7h9Bzn zl*afU?R#>~FhqrMeQ2Zcgh<`vRVDH?48zMVXkt2wtHb?m*F5Uu@wuS&z9W$>+dv!8 z-!VlwcEMRx@<(e8*jW5^bh?+^mj&%1#%_+pkbAGzO8pP+7m87%R_RSPrHOiuMQkRj zLTHMf<3hm%@bz>;+#`Gp2n)p@l5mFxzI!=mb$;npjpN2i4ZMo#sfFm*+vW zFLCer$U_vC9pIKyu$yy{jrqIn8~*y&zv7R7{G;wIHr`o!u=nHsKmoU=_sH`JcuzE< z)5?2j<#X03e3~N+8_4+UTzoLhh^RrL0cDTci{0z`x<*6|V&ygwSXMSsh)9Y_z9LYZ zjYu)F0KifI*cp>;DF+Mcp^@FKc{mq=LL#=pam{EEH2|m{-k5Z3iif3>$Y-}Pdd@js z1HwQavFn;c<$B0`SJuVJP_G6|zLzC20ghsIHKl>))zW_o3Qyqv zWlHdD0tJBelvK1dN3>xwIZ3hm87*oStI59~Ot@{O4dM?v*SI0>RpPNFdQbMO5Q2(o z<~bC&My5S~qz27mSE}*6&H$y>cC~2_)SA{L83L{Gtd2|Y+El2a!XHpCU+XT{hW+2} zWwcLJ_&|}4Qj$=;!AUd-186}$uL{2WL}2@b)}yrp#wgX9^qf-CSgP^~rD}}R3J?3~ zyspfmDd~gn`M?sBiWp}>jl^SB69Hyv&x1(D_V=6v92uQ6r9s1~h-Qr8Ix78~P`e%1 z!LH%K7$E&bOKi0XIkRX=*8eDO28*67r2t{fwrZfEVg=pALVsz|!!IjhTCmrGJxc*u zQK*B%xFss|3Ojo{-o4Wtw(S^IX!Y?%Y*Ms=zTC^@(%mmy*xhb7`tn$S;TvNobH;Y; z*lR)a0ew-?j}a7aH;!vy;~TS!tZxMywQ!(cs{^y1MB`U>`~;a>$vx^n*npr;q1&A;&6Q zDL%#REzTMGoQ>nSINGUIv|K3~%RwUyi2icNzB4|ZoeGB(FGf)+clnH|vX18NbYgW| zCWrrep^W?6?S>em;_uTb>31dQNjb!jxaQ1Q!^-yxeYfxL?|6HA!^V!8)6+#i&z!+M zquph5w-4`_r8~OFV@inYLT;03xS<1yGAew<-7H1m`FzIxe%HvXx3@PEov`?7T~{XS zwBax>1>DoqSql!UtacvU%)sajDWvfB@=Ue*P?W6enWND>4<@S$6eL0+#ibwgOHo0L z3}gihx9>YUX=o@`_5-)u4QHl;$n#+-BqFqv0`-2ss~AX}DV3W{(Rsv11Cz`{T<08~ zo}To&eSCbVFi(Eh^?Frwxki2EF5VIs_Vs$jzx~_4;fI%3{Q1v+HpNOCdxM($8~GXH zX0EyZa{q*o@bU41ulE~LJZtn;j2^jC(X`aDNDvxMt$=rQcq@gPyRw#@P8W81WWE0g z32$+GauBTg-OBwVs%=}GN^{sAZbJwNtq#S7tk2OnvgOY|KR+WZ-PwKQOv?6B5O`CT zLg4v)(e*%{O&M%iH<42X@r1wQhO8W774y6wM6F6e_bd8)8Qkd9z#uGaj1dk^*M2Hu zqEYIS@F1mxfB*Nt;`Q~F2R7eO3ccR@`@8N}B#5dy5Vc54a)|GyprHm&KeRW^3bq7_ z3eRg|=mJj`a@yzu-Gk5tLq5GXU{r!EQ@#)^T7u;?iOxA!#&@4+dlq@P}iw;0o>FxUUvs49J zRNJPnG=XbwIG@i-96GlBVb~~6J0b$ox>Sw>#fTa{K0Z)e!}ViBb`80hSRpHyWN!XcDvp1{QQhB zU%p^xF`FDdPEQw{)(dha!BZ=JjXs}O&AydqEXMI(+cy$9!Bza}=Rd;z)Z;~@aY^?L zkWMSsQ=&M?5DKW>8R*J=_Wk>J zt;1%ghiyE1Bft}4ne53T+_DE5k(Su|9^MVE4Vc5a4&_r+jJ?!Faa}ZCYZ$_#i%G@V z0*(QN$vcOGHr?&Iy@dF?IA?np7LkYU1-zb?V;>sV0dC5RCjn&6Be7A$C#X#a^g{i( z-ER29AO4{Glsv;ZXZV;#$FysM+e?OnF*?Pj+dRw%!-fuhg?$STjBcGoi)0*e!9jUz?5(S5YWG?|u@|s0-c< zH|#YKg4^t1vuAwUfS&IcJLoAb>)tN+vTfQ(6KppP!#N&oj?9TMl8J%Md&a?aBs@JQN2T+e4$zg_;T3CNO|!L9J~xXQJai{16-NWMlJT)`I6EL^;MO+m zH6W*id&x*C;s_1faUgCRJOcaztPA1z_x-N*^rC}V7Vwm@L2U;wAvz;e=mQs0G_jz} zM2*ZY$&?aM#;o_*5%?Jf-a6yv0pfhN@8>@^iPuL8-$0J3611g@LgQ^A~A0?u! z^v@&fGHAG)AQ2lQ5omN+^4Z(cn9O^U-}zaC*^<=efr}mT&o0vWKCxsNiHx(PJE^s0 zpAf^*zVC1>yf}_Bh<1w+kJI;`hP9g_E~^gwy^F*9lfB!<_o+ZEXZpVEy(Gk-*5Ktn ziV@MZ$yr=gj3<3#U!o3tZH%Yf*VRM?s3>-LmfRqq5!0Eim+L3>)@S`ji8irQ7$S$xa&lkCGvG0jE$2%cktL;#=z6LYp8JU@MB z=Vk3~dG9IuH+G^>t8I84p_t5c<=H(x$682qi+wgNWn&i8&>6O;0qFkCzwg3*4ZUX} zgRFl3lQY6dZhs_3+IoH_3)uIk0tPl=&^pnF=JwBOU!(H*NA|ag#;)gt<{x@}(yx^7 zNeJ0gulT`KQH~zRF%xNq^>Z353I#(1j=7dD2AG~_dA8)flUWUkFv39kLw0<2^eTR` zb@wRHqIjOxjQLE>1qsWVI6nG7-Zwax(3-=?{f5lvR4eEw<87Vd0n0@02*ciEYx9{T zVNDoH(`{WGM$Z?Nd|}rfe6p_Ebz5E|L^rI7BCK2EItcOgd~Qq{_H$UW%KZB+Nw$Bc zF(F_U!P(w|H8vr(2MW5J$L{w#S}qTi93m?6deo%FJHb;G%TBV zB(6(o^?MtHF>+nxyy<tXLVVE&l5{W$zTLGS}DQuKlYYo)_nft8LmmSXG z6~p|?LHY*co+Nz?dmjpMnbuJzopM4*J~A1Fc(&0RkdKNMGMi+Z`CsKDiK$hLkbWiz z_n!NhI5Jade(%|lbzq2b=b6vER@tF_HR5jfiD;0X2d82a5kJ_vzg|IXwSg*0w&_9CCLd4MV{f$ z&OvisZNE=z_>;c3_L$ovsZV2Dhx4hM`cRM2Z1Y@SM4{2gfL5ETrZjUm6O}_g-2HxI z2U8;(IVpE9T5tO zIgHwyq7*s&P)t!}$I$Ggqs@#^#bod#$NP2^VCM}cCREq3Z980TSmKCLlEHBZMo?fj z{uy)YTr)Y^O&^3>D>>XwCmpH_5kLlqtq~@(Razt^%dr}@O256m0kxvm!Vx-*J&F6!1#nazoNB<7ajoF$cOv=j=b%9P*lf&xDI$z`S|$I*ed|I-EIRO|Jd>n z4N+TGcNsaC#0d$-5EDs>9I#f6S!>0y6R|09bXfC!b4r0!=Yk0&x9(+F%!89$RW9Ng znO95C!7io1a~r^ifX0oZkB<)=?C^&Xnb-lYG$>?qmSQOQ1T?S8euP6fJ`XgFMRgZEXjc0@#4aeMoU<;w}l2OOLwyf_Sz6oRXy0|6HROF#%w zan3+dQiNcrTXQJ67v)00lK6?>*-^*>znU9rXjqmoY_@W3q+zB9D&yd@o210m$g^wL zV?7|(iu*=l138SwK!VJd=l`FwH*1n4Ns{zfFEexZh{&U=&wZF)JOhOP|6>+J1Hyo2 zx@)Q`<8XH~z3?E1iJC{xE{Z5;sqBD4m3D2_5C5;&xlnO2snI*qj_vSa6zmCzrT&+aa&idyfhe z)#B*i-`?KvGdY-2N{WTm=B6WOTzBLS7a{Y<^$n#Iobg0N zxzhy!P_anu4I4-80l+-bea+iOE=4(XdakuAxjuX&X9x||8VmUfoSP4>A#w-WYZomI z#S<+|Yd+JgkwK}`$S@;rb{$~Kn;bAL7TPwNY;=v1gLG{HIqse3J$T1x%erd!sr}wG zB}TXdM%C_}@_E!@y0?pUZ{0<+d&Ac@fu?D~c{y|4#;9L6Hr?m>q|GinEKnjq>*&01 zSyBFwCu~JeI$-P?TV@ZhDMYw5?duwUPB}}B(I0^+HIFE1k3IWc>aX1y-4F{?Vwj)_ zeNVzr3kHsJ^Bv@>GL#*infizhyH^>Ew*#Dyh!F$kzt&21K!-Z4=^5Y}onuR7@F{Vc zBJ>hhe696ioe<&GK-S=ldWpTtt)e+#;`5=i=v#}?ZqO(TYB=rB&NR=iAoW)tyi>O5#od}MO5#1p=YhAz9aMqY#G_F zYI2cvI0cX5I^mE*&_O72MPx%&-Dn*E|Jr-zUIvp~Pz$hSpf&UmP%{J^8 zDmtr74NyXh11r}5*F-d*3Tyt!&-1WK$s{&a514y5#zNVi z!hnMhMjUDf-%N}VVVXAOD~kd>ouA;kX&nU;0*8RuyGFc|_}D*)rF@JOCB^4ii3d~i zigUohRXzvppJxC7AOJ~3K~&OK!!TI(o+!&5M2E7&MIX4g(MO}6eGW@0@L`M&Yqi5W zBj)T5+nV9RDA)rN7WMP+egM>=2PNkt*+-op9j(Vkyd9!QGhS&vy^rx+&H*kmO?4a2 z#=g@zdu{ns(tr?a3$Oh_gjeRzrasP2G?P771g&=9*-_cNIo_XnK0OGRt#HLQ+=pls zGpGz9pkxw$dKRhLHN_5Fj;>=XNEZ>6M)`)IwT=h%&QeT3Ohl)⁡4ij*;r8Dkhf( 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 W`F4{Co>Lx=Ds@KWxI$I_gd?I20Mu)QZx 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

    a?g8r2=idV|0sNf!zKrZ#3u=3G^&kU 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

    GB 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%0AA9 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

    Qq){hP#>S8$_<$ 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 z z8Y8OVrd?tsI1hcAXSAIAp)ag%I+RksJc(e!&A3xcZnvuyVqAy9PyW8+OCZ$*%f);{ zLE=Msnr6&%=nhU)_@?e4Weg3Fav_Vz#H#3;awnWkj)+g*I^?(_$Aqml1m{q;2+6hKvdb622HWLHOOkMg@a?I!TvjT)jSOg zOF_4;Eik>2(N=Y$)Pf{oI}`qNA~IvCiDMDPp=|C>Wjb41KJPrwaK`p16K#P?O=dtX zxev;nGq5~}HKulAjWOtqY;jxw404GBFr}M80k)4#RYe;bk5;6f5X;B^m$P?mavV9b z#HRRA001BWNklh79uX|!XrviJZ0r5)KyT8;WvRhc9K#O?jy?hzhf z&hFZ_nXJ^+c_9fP!o&TX=dg<DW0GJVKb@t;al_Fb4CB6Z@P(h$uS+H+u9qitiMdTaWn+@kp8z$wqW zIAe=)atflG>Z^Td`bteE4Hp^e9uMqYB$Eb`SLFQ&FwnSUcrA_Af~EZBcrgPWNN4g)n{FI)XHvbZ=0}$UY~2?aVrO?iUEyVOnEr$ z%lnr4UlRr7UXr?B=$@J^Cht)OqA68aQx7yaH#DK-@LY`yWg_EY3v!7_3NLIO5UfLt z89*oG&~<-wg6VswKT~FKQXk_^vd;l%2*wuDmy{1 zIzJ5cT0P%}s~BQPj_y6(KoVk@cK&Jilos)6s$k9;aUUsuazED^hWHFYCij|cq&R6h zq5kY+iUYdXsfLtpGFCIX5#{`S#CMBp(6STMn2MB2iTo#|Y&0?X?lfK7ING%T7EO{18>p1&bq5Wu9l;_l-rusWm05BRZo9hxT=)y||W# zn6nn~972mqE;++{*PLC(*(M-pJs#&V*Mev&z@pXJ2P9umDxHmtG1y^|_Z`K1gv%Mx z8;%jAL365f?REg!0ei~G(}W!s(J+a`00tG_lR?KY0rb60`r|W|bB1N(Q-vMKmipNm z2Qa-6r=9d-0Fs`DZt}Kh!$Yi;9u^!OwYs*K8bIpLecy=|tqG2GJpah+I-2B?ipLc( zvTh0waX2z`P(&QgFMVHF^MCV?F^XD4(J&vH3suc{nSoyvrXKg2ZSOv8J*jBmxv*2iBPxn*sV! zp1FM%x-SP)hp)4s^YZ0#;Tjafx$NkS*LyLo^CO+1D1nWBPO};u7T$l_8mj7NP5lXt zFcsQhl4u96iDSt`T^ivpC0_gZ{qBl1)zb#t!?}t4JS22A&cU*ABgKL+O-P7Cf9fds zl6Bh)Eu$J1qjd9;m^|onC|H&=&0*U58(P$tJ_G18T3;_M*Y5dUVVXSG`?kXc4+}Sl z4mT!YolYmjk{gv-8^l5&k+s|d`@SQ|zF^%DyLS|rwtd7>%&ak89HQ@o_CA@6nwW%R zcpnq8SdUud*#Hmcor>hv=H^-}^=}P^h|ny3cMIeY;FuV$DaCr7Y4N|-9mrpnd%vTo zun(L2v+TVeNGF=?X02~ME#0>~68(nSQr&}^AW!F(&950DT6L{X^F~dR>%1^|coFNS$@LEbx9pt_8R2j#3@0ry{4MjAdDPSZ7FS>ib~Qn99Xh88A@Gvf%mY z1t}%GzP`3xPJIyY-s8iE4|sWb!iNtZ@XVQtMw)wqr&ahwDcZcZ2UU5&w%rk9cg^NP z(NWzkM;GH(Ym2_ng{ow^2N`z6+;Xw08P3h8lJWKHH>4DCHcKnc`@`BJo4lLaAVuTE zQ81(@fFv)FBWh+Xh-*5kf!`1b7^PNx$-|M(f!_piCFgv2|Y7fjCKc8k~( zp{?)x9Vw9-KZS{i7pXSHvT@w(aD=t?*1wJBX_?`IZ~1$_efbSvzI?&U%L^5b{;3_LrqcrF3^$4jT(GcyYR?GK zbGQ*eHCWDJagdLLvnp0+0)m0}8w1rt^Y% zny{~1&#Np2xl{z_VU2;!6?xlH_K31?FrkaUYROGe4*f5&l?XnFDND9G|jlKcf!#}i~H@0b-Uqqf5Q)-ziTd? zlmfi5u(iOWVhJ98o)E-wS__GLvq4(#NF~DqwDxkbGCTS_=&-|CrWq))AQ%gTiHH=a zBuvUAw(%jfIJaaIyuvw3F|nM_?J#StYfYA87Q74&dj@B33JKXp$0Et|o25w6S%&OR zbjF|zF(p)v!zk>AD6Qa< z@977Ea)`OmO@%$K4e_j<`am6UfzBAZW{xQkhVwWr->cTZ*a}V%0IFq?aBr4bYq8Ad z78fLnIf?OuF|fQo*f0%5CK+H14HD&wT~~Sr78X{fR9amjVq$85ZrJw?*Vk9PJU!v* zyddo>)*?bSKQykFO zFf@_cq0w@rB_F6WQ!wQBc`w<*_CZ9W9podLKfzkMPohHe>*x+?lpnFY+qU8L^>v6{ zmCss>DXluhlR(C`!AQsARu%~)s>@jX;=K$QfQk(7JS;3srS+hTKXQv9(PxgMYl<55 zcxa3rqb~+Wn{uG)p9?jhpaD@Hj0XC!O>w;r)fVhRDiViWm1dr4QG3Rq)zX7YIcLCB zsxj$Lu%Fp<`fG_0?sQr@=ZXopfskdciU9BR%{KcLYTF~;jbId9E@#AR z##S+^(<wCLD^Gt%zN*L^LdKi#XQ{OiMr#K7umR;{32I~Eu7GXnb zy#(F!k~;lJ%j&}is$FFr=5!~$7Vi`SD)kE>N4pA!u1~QO$?QCR>K@EJ) zIf#7P*-Ddm__}P{hCQZcOrXYpW}@dZoaK(92E)TpSNpK-Ju#)+OS*a7&X99pdXH_w z=_XvR34ZEP^sz+1P`s;kqD>k_r$TGfPIRe9Wf&&=wFs8pqaD({!~y~qz_sB(?t~gG zveC7v5a)DEA&hx&R!d~8a}H@wgP}==+Q!-kF{&Pty%$|b&-@rWsl^#IJmWK!a`<{X z#uw}LLDL<@=}a!$(rzui{v2sC!!ygzd**Ybn49#OQ~$djTE8bKl3MpTprL!;4`eb~ zCs6H!NV-}YK%|sVO~2kJ3zd@hm#)avFY zmNV2Fnangix8-0?6jM~q3Bg$ujHZNE$5=d2L3QM;+@D0ltb^D{JKhK5uoB)u30#da zFf{>%V%g-mmnf8D?KSlFE7ygM7+`>62SOFqA3P{E7G>X%(l*rVpFVsbVT&bUPH`he z#2OmBdhZ$;+hnjQ%%j!~&O1~`dvoUdQr0awk2-JKnP{MI<~oS%oF((1g+p+@^&wM}!Dfo6&O^ z5TiE!6XAUF0jVZzWo!E4ecOOa>&^2s#e!Y0S29_Zk(AW#Z#Hqa8ioZY)8vPJMb^_} z#7-BlbSkv;N#r@w(QGgVyE>0a!hui|g(TPong%)Vuu9xpTCxIQYDGy2RrUoYOc^`I zK50^Er#1I8qfq9X8O!-5GSW3cHFh-1l`cH@-uIYLa0FH?Y~-qg$VG@~sq9T;tNUNa z_#iE!(f?@E*4PWm!}pbncg=j-KyxGo>AFhR1lljjypZxJSk^RcsdbC0Q}6dXTBB=UF zkzT>^^-#5@Z+}k|W7nw5+5mm5+hmWCdZN^doqM=iXT8pn?}pCvM7lAE|al=W7F;Xj60ZQA9z4tJ_EAPxSiS-dCB~1H{eP0Pl z83LfP37?;zv92qw*DIc$o?zV6nhfi@BKSH8dt^ZN&|v4H#T?u$xAltC>4M90<{Zc` z_`@H6Y|8eO5+?Xo=m;803c7SC@@28PTrMcA+_l~z?itU|&#*kqx!!N6sO{RyLwM!r zqj_0cPAnCUwjq+G@S;YsY1D>VEBwp_e+7*9xSURHNI|hFX~4kiL9ZNyPNx&5K*hn= z*KfEyKj9BQ{)CSoKLUkg4y?gxUb?csWTY*_h1wqI=jUg8Txr zr!cXqKR!4+G@_phP@)rb_d}*a8&1)QfH_QfGy9cLjew;?VV+wJHZjIUqFWx3fdBDA5+{x)K45 z(TmPGyj-4OjluPL#mZEdx3@Qxl<{=F;KPRxSf&}*>lJyAG)U+8w6hPi0eO$g!>5=M zYz4OaifVvqnYj=s@W#QqfMS4+ht-j@RbfDMrWCQK0_2Q&p|~NF3t*_dPvR&d!vMf? zJ`tYQIm|6~#WxYd(WyCP8>*sEAL7Lkv2FET?&vzx z;ez&&tcJ&$gdoj9iLXlBEs)5L5)&?$%h0IRxydQ_bwDtfdO+MAhqg7#Pp1jp)22(A^M(nyfKL&tAuw6u2TNU^AiD#t;TxRziFU;o+;?IL`YHDcSg zMv9>8V_Na0-SM?%)aqcJK};E$hpOIKjy|b`0IoD}v<~e0V}z%tgJ3P=UVF^NJz^GN zFcf%34r6e`q5OP);(I7Is#F_J8INf)NQn^ZLSWJRm@|?woQL~;vhKm1C<9md-fi2+ ziLM&dr8x@CK)jI%h~_NfMydSS$tP12o`|bUzW(Lq1)o2E#&5sL zN4kgEDQ~@n4Gy*zlq%OCb4_SrgT*q<2!3gY#mnV_)9J*KPgKK+$i|vLu~p8K5U$jQ z%se*#bo_^Q2}qMqJKnSqWSS;S-VO-(qX#^2zE(}h}HcUT=Ni;6F zxj$-U473{t=UO-|uk(mO)oX&hM)|C?z@y>j)!|m|qhmg^thX{8(T7>t&ti-?olfoG zDD|Q~;OlJmqi8~!u7kiq2`>i}xA$=B@TKo_1A+-wQyO(-z?x?|gmoM{4|yyG0+KY- zj2*Gl*1Mr;Hu*5@UAh5B*S-#sNXJ+(-2m1N4_UKi{guYqkt){2Rf!s@6t|G!gUt7& zktiANwZ#NbgokfuIB60L_*22FD(vsEaid8*y2&ByT8oWS6ec0Pl$=}iLM^#9B#vSc zEr=01Qa$83>vNBGqYF-4ULRfekpdz6mJc1_+=W(t5TNP%xI6F4VQ6k21~c-RO3ki? zR^lR`%;@87-%$<6DDgVtg6CdFU;DJUL4;URD|+kk^zw`l9B$i++j?!UCB`^JS(0Fe z&hH;Sd?KQpb6B@~6X-V4?4c&=!hk+}vK2VZ3yCD-j{E%$ab2-hilB%w0+R)Drbufc zo$z(tc!0IV9W`@|R?avZHNdt8m8qKhzT?j4(K*c6w?grIm14za7{Fv0ZlXKyVT5{T z12z`KWK&64&!YQiGZ5%pT}r{0GB#M8V4E0RocGmLRGXV9f(T|FwbWsq*R`ZH$#t!) zpEPwTiDZBo$DFtSc*V$P9{qnp&)QSY2XWy05FL#zL!FQEq}HJ5>UBZ41& zwjnWa7u_~-v3xc;j}cIe9dDB;O|AKV`NtTJgko}y_e8~!=qK+1GrE=09`9xuh(HnC;}AS|2nQ)vNzJYKhlKyJy%E|Yit|F_J%o` zn6w*LjDbDoyFLt|=rgLr8Ku{vW6Y#TctT~bfb z`Wptii4Z;Y&`_10>?X_^3QaKGQ1cu(S4EytIf z&*%0!Wo@NcANtvu>GnJ*6hc;YG@Fv& zC(&7RnBeZN89LozU+Qs|d8i{|j+ne}>!T1*bcDQN5w!CjZ%mWb(OcG9Og;?euXZL< zB7h#XI>V_H2oW993?UChRlQE>^W%|7`ySELcrx#axJxMhx@MB+_HwzvI1A77#zqa2 zb)36ZS%zz+&j~svQLeoh z?M|l?=F`%IVp2=!J;tc}CFe}@P1X0581sU$&ec6XdcM%UUK1Rp7JARH)x?Z^HWx#j zq#sCsv)x~8u#_bFBeh>YAKeUXAEHXdbSm=}O|R5Fydy#MNLkXoD5L5xipMIWd69o^ za8o0s9cMNA{3h34C^l6^oau8xTXU`MA#*+G70Ji+I@mZ0_+2L4D87J|6+za$Dyt{25AKa!NFE6V2r7@{95^0k;+HNjo_Yr5Zj>;r&n zjw9{a9nw7fwrxxkm{DsS3bASK3SZQWWtp&qg)-9Jj9MI0A*Z?b7S&pu&rkF{DItWp zWofnIF4c|#VBOji_xS^2zhd3-Iy;`}T%-zjK_DZ=0QD10$};=}_4DaKO) ze*XDqy!`v0@#Bv_!a0lQ=Vv@UJz-sMSl1iw_dDi!!aPq%R-Ay`L=_xg$q$Vf5g(8<+@%{Hd(jYz; zlvv7@NTpz!7WiNRPZ@R8 zD0D4r-B}MCJUx5CBJUBYCY+y6c=_~#*#{o>Q08h$83putNe=rG2oVl|W7o*xXrn=0 z3lA=d;3A@tS_tu6b3)A&LL9eyQ{9%ti#;g%DQ-I~D#{#?W5RY{Deejexkie7bC$D3 zE1aQ716vD%qv3nC77;+aUMZ8hq80Df05+4rr=(0`rj(JrW%rgPwPB%VUh%z7SO5SZ z07*naR8AF01-=@1OJW6}0z0XreWin#VUY#7UI=4WG`YqAwiM*bt{mBT_>j19(?o<9 z`aoD%K`Jzs%lU$w6Mp{rKXF-3@CIDClQS}>9fhOSw@g{E>vl&74wuV!I4^UH#|fti zK2R*yvMh+H;I^$mCIlpM!9005XJIU5*HX^CBh(-lvffyD0P7yH-tWliMv7DmIAc&_ z!tL!1Km5yQT+V0u%%Bc-j`A>A>~c4whB3V26%S2$0C9BFz=Ms|{h zO0CG;cpDDE3jgcqrz7P8!;wts&{(Rx32HnlDapA3#(%eNE4lS}rUZ9jFU(psJ*pLq%@!8I{QaQZLXRwDiUcEBNOy zw?k;dtfI8vm!+A-qQc7Sj1+W7K|(8D%qWZ~bsW-V-V;Sslxi8sJuxyGR0=oam?W25 zQ?6&6=jIr;*1&tTf~%my`Hqw>{OmU@vGqeE$5d7UNT%v>xY*Urt9%dC#cD1QI_cYOZ*8K={XEoS5_%_@)Q=L?>nFK~h46<~oaZn&HSCa!-@ zr*2^*KwxjiE~BUUT( zC7w(-#0B5nT~3MXSu-5ck3t&neTy2EKTjv33*BxvyuQA+0ql{kv8^lY!6Dfl_jz#c z$a|4}Ow(+Ru9y0bfKd(;a+uPMFpW9Y4FK)%APU+>djq4ekBDtK1d;%Yv#WW1@YcYh z0?xoxxfgo#rA4{KUIWwnaP7Q7P7OXNBE!_&)|C=R_p>~MeUP8XfyZK=()1v?HCg2I z5<-(ShTj|R2&TW`u9b*PUa$WAQ4*HPW2>3#whA8{aw6wC{5z!Stecbly~_RM)!@c9 zXQI4zWAL!Xr0H3xew6{gyEMGNvLUF(dB z+?tN16lCQ(rD5cTTno|iSfoZyY!=0qiY-O#IU(hYJte~Rm&&zcL_&crOchHM8Rd;r z5ucgKz6O>Foemo5oDsr;sTOQ;Z3C!d%*^d}!^^+?2=6UsN3OcdUPY~C5E;<@T^d1VYzkN9h}Ct0f9TB|o8a9oIX(+xw3}s0 zhIyBYQ<+#Ac+ev;FoIr}0j`+PbgYnw&c#vcyn`)y9Ky6eMPQp6)qn^fBrY@Zd`}bg z*`&87|NkNWiC>3^Wu#%!c5-`&g5tO*!K%b4IkEIR%D8{%h$CZ&C{?SWecu{*>j#RK z?6tD?w6&e7G~U>Ojz)V?QPjcltR*#22)>DBOD*uuJk(iYxG5#kwKHghoRkv9m-8^K z5n?RuL9jGT005g3z)|dBp0Lz{^?q%ymueaN;0D(B!!f#1_F+AQ(=O}2R@3LJ*J6FH z$u*;z%0wU~3bO_!mnL>R(hHivrwMR*PpIZWY(jM3{@;e%>OgbsA}~9|v~@zCs?Uo= zPSelJwNvv9lkjToBDb7qc!yMA4kjX48g2&zGI(Wn##TGfXM|cHy=7Sgq?QWK!&KAO zU>VLDI}SDUwU+(&NOIG|F{$sxRU-F+3?k09Ut_pF$jsn++XmzUHZ*0J+-U}uMWnip zk?R5;IBO!Nj@L%D$R)$NQJk*Vs!~cnKdSmuNFfrFtp}h)^T_JnXJMjG;G>`;;)>#clDSmz+3Fp+};?r<{ zn08jB8lQR$VDmz7WXRFtC|Z|F6Jyy!>^rUXT@-jc`&MMWAM=Bl%^M5ri1bgj6d8I% zJTN&=bWJ|rwBa?2{Hc#tn=nYP|IRopfdnoh>`r?`&WUDQ-nZdr8{YBrX?CW~_|Sh( z?Lzos3cMl1Q_UIX^|hTzkEE|@nqY-`YDS8z7U0nt(+z?uBZ7*OMq+>-iXS3-b)W7S zjkgFp=II#hBhT zS_{3#+Du6?X1+HJj43VF_r3Z+h};I_^(@uMsk@0^0n?tlJ*VO4k>GY~{T?AtYO!Cf z6eiZD;_ zl2)AR@o2h@RS{GAHOYF`-;<_;nSuNSXPMrMhu(Or&8k7J1_ne2Z$dvmQT8vrX=EnB z(2SGsC1)RMQ!RKE;tEq^QK!g^lcezhyU|`J{ttRXE)Yg52SYkW3wn#If z&?sXRnVk#jK@3m&0@FmH^0`Z&NS~jZ7`I(6^B`ES{2=GrqoAz1kG1)^88Ku(L7$Bk zgW-IsjWzPKCKurMeaG!~!!%{0o(O8uv)hZN&Ta8=&f#)-MlBXGZ*T=zE*Cm{qvGl1 z1@{}rH3b^(=Th46veYsZGg=W!8Sd;Piye_R&okVutF2N>a7k3+u5FY=m>|{NZN1}i zx!~g;{s^4UzI&p-c+`~8mK=OOdX3f4&> zHU)1OW5k)A+4IL2JXeGLfBXgi_{Tr+Z~yw=@UQ>=?>LD(ec_DujGQB5B^``8VV(m#lNl%@-VHaJs4sKQ z*y}!^E^DS?q4BhVohNGOY!z)Vmr{ZQi(+`uxZm&i<(FSj3-HrVKf!yCFJHdk%a<=W zpU>F$9l!tn`!LLrjMh>Lo^e6nwPe0-M`fYgaHhAQ9#n*4&;JwG^ z&!2HVpYi;B;Xj|TEDN^nPPC9x@DT>V`G%`=mKS>|RDqU>N{eDfDv7f{DIO{DAafJc zBn4%`$l@zbU>5%fXxPuw;7I-9$A4i_gKJ+iO%tMttPr*EJdDvtCuX_|<>lX7#R zc<*41YZ^E~5kfBPHm_d7m+ z_kBBH`(RP4LELg%UrNdd#-Z?`D$Em-G&WeY7h}YU8^$?DLTDs;E>^+6ldbXke{KQ3T=8@(eQ+l zv8~nYa!n+zZxD895tz`lQXW*~f_#^pSnB}q=O%a+W2>mzb@qFVv8|g8Bg#W5%EC@P zllpM5vf|9k;{Z+s0CKq7w=_B-(>AR4MHQCx^UA|Lrl}`|#jk@9C++GGuN|v?IPmE# z@;#>(w?T)o9ycQ5MLA?NfwF3vZrjGuld(NBB3#<{9o7&zFr|d^`HaXIcNyG^TKsmq z;d;H|r=NbJ=VMR9z4Yfl{}~@Xd_YQxopG+whC&FqoaR=nSEeqx;!wHDHim{cPxFkJ zcUbFjKA-S(IknfLn}Q((JUu~Q3+s&~dB?mKG9z%&z$$kO+CCLA5{<;UVxyYfmY zu?OXe_oKnoC1LyN~5w)A)ILy~oe9IZxZbkrA*_4x&U{ zn#?>jxkc#HnqF=c_;kVs4L}7)ejLJR_k|TKy3VOqjfcvy5_COA7ef;g*-lLp$Ccj4 zbOY$!Xa*jN9f?Nz*&~tpc&}?=MM{Z>d*b-8K#fC#%zF&_cKBG2?dT2nQlzAiL%0CUGnIH z>2(RMAGOuo`gLjHiFQ99v$+T1EE8VdBZ|se+}+6GAlBoC6wDB{q2sAEvKj9TdGz{m z#1Qw4YcmX#^$>^l$@<{FIf{g|pl%p!^1A!pd)J?-wHDhx61jwW_2^LJfpr*ZI7Y>R zXfdPQcP*n`MOfsVvGP6N?zLjrj6%_n*7E%X16YUqPGao)N@5hSz^oWxFPX&JOic$(8Xk81SWKG?+4K>vkCHC9bFSzep6CvpJM8wG3{f_l^L-^M};WP(iXK_9+YIqbe z`Gw9*@)>ijAQZBVx@+rC`e$o28+(n*vO%u&Fo0B{oV(5jk@_u&Lx+tw69u z9~N4uWz>Bx1>Vs4`t|w-vnNc>W8pozbgnj_Yjy8M3d9LPlL* z$@zku;&!Mtj}b7Mswnl4CJzFx(U+YwfJLKkQUicZAda2Rd1|5;8eUEBMvh5ABj*x% ze?nr^qyni6Mc}1t;-QIM>+rb%AObO;*=7CJy~^XyI^x;&;PpsV)9%*e-l&BKW)Lw4iLPTj*@I#{FGtrr*OrGb#oH)leIJ^bjv9>YRLjGaI9kC_n~4(-iy&Z)<#kviZBSK3zg-yO6~q0nM3*;y&ld3 z(OyS^b7FSbg^M_Rljze8eM+hEl8xJ2#1 z7c#Cyq{`sD)^U&8StP7!4ggv_jee%-JUd35A8S)NJ4#IOKI zJty4n_eOC(M%3xrt5mu_7w_P?2OaqN@f;u7h%k=dOX$LS%)Ef4fmy;j@csU{a=rP^P5>=GX081?VX>U>ZA=rq*J z^7RtC*Y?=jqwM88=_`!ppX?bKX{eNMk$Io}_9CXP+?$0$wxeq=3fi5%RQ z(Pm+N4{ExX;dq*3pL2+0Jcw%a-XL|I^!W7iuOpm~LIR3ctSYLfl3|_WWRK_mBQb6y zGfSVfzJDe$c9;i1)=K9Plqf>Pw51e8)w`AJYg7y#lu+xq-X1CGx<7i{hmSSpQ4FWo z2Th@svmM17)_3cm_hQz)_oxTMmGt$GRP5tf$MHTWCTLv;)x+=e)-~aw+=n`v^mv9M z(b@Q!9w}EM64kZ9ktBZ_xlgW%JSJundhwf>MIbczABMR{^v<8b33!DRP_d9%`=oi4U^YV(g7yS0+4cH zl)G&RB}@6J?EEf3qS63gN6VqRs_GMq|}d zD1-j_8F+bV`OwA~+-^7g<*)w}Km73z!%$Lgie)*&yMXn+W10zpA7jM6C9E4cj;tSD zjMHfW5-G#I3rIrFutX0senPbdwv?8R6DH2rbpcZ#$NPRd;nlq|!KC2&`Zf%WT9eLr z6i}0^l!7%;bK7J_pxsw;ub<9+A$JzrZN=N`6<@x5!9V}`PZHSd8=jw^@yjp2;LDe9 z`0l&!+R!Kj8m!I}Q2@Taexu<;HO);Zi~sHI4gdL{|HR+^_IJE|d?CTi=>!;qx3@Rk zwiTbh`yT(_fB!T563FE=FTgzG$I0VcHJYy(;(>!iqAU{)^!I&5+E+$$TjaE(mIP-VyaDDZPy|EF zD0{;FzT^7qZ?H@;%5g*7H$2TJ*yk6xYG86jsS(~=1Y-e<7Il?V0#b$XzB$xsfulTB z3&0k}LT{0rthoR-AUKa)6ZRaLOJk8L9dtkVz@e2BHxU^&kS6FnQ3=QC1GxNUT3^x?$Lr-b!(CBnnR&4m;jZr1Q&ZQ{eBF^2LL zW5WIVhHbs!ayr9Vhv27vpxrkZld!F~zMme75Ri{E#kJKqzK1@j$p`Lnj*(vFinHRb^Q6wL@To>@D?yN zqvptNQ-h+gzsAx)9TvO}^-Z>LjMuTq(fCJl1$SaXN(s5}FdB65Y_3MZLbf7+TsCqr za+cOcRKeBNwr5mDP0{XXV+^+YinPZzbe`wXhU|hvj&aO6Kb=m1H3-2y6jh}){|a)B zu(n4%(K&0@KV4WoudI(5)ZwKO15^lFQBA4CnczQZh^KFfXL14r^cS?c8 z0_x^nb7s|Epswo*@Ik*8z#7-$89Vl0VP}mUTz>{YWH(uM|a?Xgk7lk=zY#d`Cj`K-e!W@m1q+woda}wx6yo)t@ z0eZc@a>2b}+aliH-Z0NI?(5VFZfO=uFHlg)x7!<2u^7qjEu0DPenQL?-89cLVoo@n zW{yPrh_v(XXL8g#7?!*i8>6!mGejs#4JY4 zzx=7|%@G;uTcc@cW*mfA5^Z%H@S6&(w>#2K&C}Do@FBGf!w2~uA(`mR+`xIjwC?o- z+`jKb*kh5Q+}8uTvZ6WXbTd#N$VJ>1W5lv7?fbWF!*<^fLMJ9o@L^xxqcqE8z!YO7 z#}!k@#L*((vu$^(1Hy%CquSQ*%FbZ#Epp9BC9+exH^+U@!X{e2N0)2nXdqd)xT%$i zDC2T~J{WUR}pI}Ts#EMW*-h(?3QpAs6)9l1~t8iL^^wm zPjk+}#MtN-RBuFD>vN@n2F78XUI&hmTKD_CH|5j;SoZW~Sz7#4`x%DZ>&{Q`VOFsL zBbNAx)Yc6l-7FMGr^HcdH}v^@MvCPjYKlm31*Y0Ts3gO%W7I{?wbcDpOH*IpBh~VdfCaTZ3av2FCczdGXSm>Dti!rfga7sQm0oYDC?JZO zvE*K^u&|yevFq)Q<#fRw6M{1c^NcVrczb&zlM=g%W9-BC`_A-S;)>Im(~wXdxghap zmK)7y!^_i|>Utg?SQvP&%jA8VQjzzFJdZI$-3bd6Zq#R!;jP6K0_GgC7lX+MJY6m* zB_XDS``Z=fJR>**Odf2BBC)WgGuiF>2IoBdX$GvtUJ@#wyt3t?k^y2R@z|adwp`lJ zXrdYwCE*O?sY^v^6d7{T&4Cv9Ek*1pAz6=8@R*&2-6Ga?Bcg1rbba=SU=6wOg>-`i z!{j5{4=bGQ#KPJrs6x-`uT2je-Zuq^5@vIn^O{s0p=dZLlAhf|z%@ zwh~ccJ>s^tv#kha+v~3u0+-cdBx4+=DGbBDoee8umTTvAMMX)efaVnJfH!#<%%zgY zL5^y6qco2@as>;f4cBNgl(F3RlU`YFBtq@JHJ0Ptc#SV=P~o5*v7M-;#cCD?1%~cB zN94Xer)K)NZ#$f~1Lep&gDph_6L`R55YsV20IIHYEjCdGP~z-A3SuOgNZ#MNZ!K1g z_R=0JdlcBoJuUCE7*GU_G01#hCnm4i;2Ap$8yUcaJ!2_j7573Ua z{W12=TQZEuuqjKuE`(R6PC8=|f^Q}u>zE`_M?pPYcb>~<_wC!aE;vIMSID`Gg#ASN za8p2C`}?ro4s~sFqNhlrHifL+z1V28hauGP>Gzo@>M{F#|nwC{VPbv9}Yzb~SM9tg6A#qh^C zXr>Ib;hqgBe1Cas@$~dWXFfIP_Z%N(tp$o{XIOdeX#aG)z0(@@`g$cnmY;?JyIyzX z+(gevKukMPpOkS_wY)Wi7G>4ekigk_!)W5j)nJ(k2&ROhJN-~k2Q`%^QI=plFD znjocaW(r~M1hL>7%>dTHdQZ>vK;MBtHtz_WX-)7C!f$Im8~M@J zTrIlOeXLwTkzc4IJuw%glHongfpRIZ8Erlwzh6hzlu}v)B(b6RD7@0~T>HKwarCWx zmRhVM^%uQnEdnQzG>oC7gIZxdlmMHD=hna$*CNdf94gngLOheRteCVipTVbT8ffk{ zlaMdh+-vyY;lf0T6_y2dp!Fryf>`LfI|HJ0*76`YXd(hhTaa3{mInik?pO5vx(tz? zviH_p$aoy=Ks(hU6j`H0a7<#OJj4cBnBjFfxPdgHqvx9#trnutsy>Gn6+1(5zVzJm z{ZIC?Dk7hpNwmwvlgS67uPC!pkHgFl^sZJfw%%SHdQDmoa}?GLLf=Ciq!{XJDHKVh z49#TXra5sbwIM5Y6zoVu?X!fWdamui<&45YsA-z82*{R}GXMY}07*naRQc~TAT714JJLW zG7|ra0gPp{lw)(ICt@uefk}+*h8uZbQD~O1!}HQ&mEVb$^%5Bnrhx19ia-AGCw%wa zM{H@w?_Yk!={)lRfHuP0w&Tl}Z}|D2zu~v9-{9SZ&wuy>K7IOxX*uKD>lai;blXzk z&oiv6n4G7>ghqDr0@oCSoL70f-SF+(8#~?&K7IPsZgz4?5WbC?8XX&b-?zbe?wmv3 zcf{)zejc;o4ZCV&;}kckZaJ2?Yi zzXB?o);WiwVntHgImThZ%ge$Iyx3H_uiviN_Z{c+nH*=f7yfT=Z>ZK_J}odj#1SPk z7`HkpDuNV^G~kcec6P#)PG2yNRLFv5)NT`Lj4sOp6uM515A46bUGeSPH#lSQ;ll^y zmo&I@_kC{%!PDu~uF<-#LsM7}MCIRQm~+41vCMZoKR;u3{XzTr=b!P{zy1|}`O9DM zZ|2|d)4%?)$C+HtSVSx{1-ce*Z-`&Nv4HA^%Cr>`tc{m}WvK<^p#<(a^}!P&nlk zlRaSy4vP=i?trlo2^PiyW}*13Vl7Z7AYU-MfSKdA0>=~~lj=SfDpuX(5I6cftzkT; zb+Dl5m=G)sqmWTSXy}|NF34B-5a0nA=aG#?$`o+`Tafk*)lh7ia}ukd=mUJcd*&XA z1Zg<#QB$UfnOf-{V=U^j&~S85c1cMf5h;Y}|RE~hgUXW+vvZy?J;>hqE^ zXQ_6TE;+>r&nAb~w9&d1xUh51!Fi9{?FNfV&7J~SMxi5ktXstE?_X%BdpeQ3?(K^E zG~v7X3^;==ZGg?#))h%M?n({y;3%`u@V#k3F+J7v9A|lsuUA^f&skYRq1X>|K6dWeD10N3fQc?BB7!mxW z8rl>av@8qm+d2?ybe^L|)5`VJ>-urP^d2$eNHvh}6UBQQltai2mY)As1eB&wKcCNZ zxORZ^)Ks9K4aQ;TwucD8M>n2C8C+SZZmmTY3Z0?7&l+h&xt1M >No698;w8#38oL&F@_5Ak>jVM#^cxG3)=X(S)UC$v?(*jmY)A zk@@sN@^ZN#rG#(azVW*3hvw$}es2dziCQ|J&rH6%ay=BVaLrV?i5>zC&ewb7C>pvK zPNx&rbw$nh-NdcET1>4M-KW+q>Rz|^%6Fiio$ znZdCq_rt!gtpV|v=ZuHvLmw(e2W!XlYscU~EmF#RU7+iOmKH-a+JM49%3(tv!00uV zMxYZswGaeGLd1CZm3#kuJ`c~ozV9_@B&lbml!BUSJ5b5*r|X(YT);Ji9{y-?jXpH! zL)*~>(VM&-!7J;KCc(&SxZm&W+?pQ_Uhg%CN!(UgG*WrEViocigB!&A&|*BS1>ox7 z3Oc$!^k47$jsn7szjtUN0?g>XIf@B1txUVxbmWs3tGBfPBLPHHJ{~dIV;C%?I%cD{>x;)s z?RP~f+QG=f0o|aFOpbIu3_s7vFozwi&FN|Cp$TaR7uP6^EbVL~f>SMm7Z;av6w|3c z+a^eDBHPhHs$*ZYga5yZchbYPBNkY%QF^@`#env~eKiP*U?1G@Be}*lWV(4r1byc? z<+tl=TZ?pL-Ec@bqiidjacu}M>#u&l(#+jsM5+aQ;%2d95w?1k zmt|>Z>A-cARdL8#%Ps)qRgNe2P50uwfW5p(GeKuf&pI zO+~NrMMqF<<6h9F)Hf1e0W;wlkF(>KPqLXgC6*meQzhNU29Mu>-J0KxukSRl=J8+kfQy<$NrkBd^~^3IDt| z1Hm)yTib{9AX?X5a&6{$elRT^KWDu@>itF6JQT$>4QGK;>;v^nJHxfu-g^(v`$*hL zm>)ubfrF9tq}5CbdDqx^O&;_pg<>eQ2||V{I&MeqsStcKXBdusmKt2&1A1?fb8cIU z*?F%2y$xRX*vM15pQS~Y$C~Or0*f9rHR`Fg@L_Hup_tR78&^jl7%~?f&un^cmwmO1 zKtx<^)c{#JasBABwYHyW-uvvdsG`Lds(V$(3RNXW>2-<3A@>?g-1;E|oX_XhgE%^} zHCa~IURo$D*F)kuKnsOPD@$1YSU z10Cr|4Au2xuOS~vD7xq5ogc`^0uFfSD~ZuXopCOgi`uj55Wl3)#nNLJkzNP^1^K@; z6v*ohA;8M~B6c&-ksv}t!7=8vo2GidOy94%hSJephQ;x+f0j%XQ zIKny7~VK9<~K zQ;+12*{aVdQyiqPhe9Sl0lxRs`v1>(5y2t$JUP zSb06q(r5eOzT+8z>?>0L>DqaqT?z?JUZYhM%vvewgUMNv@DkPh`)JBN_ASO|&#C9d zKJ@e6tMf`Jhuar}5cPXI(t-3dtD|N`s4i=tKC@}UkFK$GO;J_tp=aNk%66=? zBz8;pignLeQ;WmY#g7(}r0bd>U+N_}^ETsp#qfE1XNUfZ6_=+8*XtG6^^V{F<9Gb}+duL7^Y{3dpFYEwiu=CezFx84SL8?! z_zyq)fSf7|HOQ4$VnsO&uE+^iQA|dVW~Q_7CaBy+hf*l&=lk!!$NBk%BBWGNP2v+C zV6bbeyVU^0Z!lLH+DbwF_V$LQkkcYeQ$OgdgN&%EPp4ByqepU&cu$ckqSm6BG&K+Q zotjp^{`xDPpPz9$o#@660rl%w{PxQ)*tQM7|Nc8ZeE5hDA3mrB1ViM{{QdWsKYoP$ z+yBJkVTLv)1E5n5 zG{&3`el$$nbL#W~zJY02=h`9j+qZA{`27#<#?~8eN*O6;OcM{h45<|NoS2C78~*zD zzhRmd{P4pM4If1+_@1q7?1apOnu!l4Fa|YM+_#lp=QJV4jQh5t0(g4<0GlkfZ5;*_ z##wT89USWtE!41M#v+ys&rZdyB-E0~-I4ntc3BpLrRQuL?m3Zy+&8r|N`)~6!5LP0 z&akMs-YOFTNJ$))33J(TzRU=2YK!W=?``qE-&X7~VV)<1$??FJ-FBtGGUcY`jLM6C zaE$5}B2TICFmML&9JS?0)qtG4t9RQr#C-?q%$c?Zlk-%(ZIK&!hOv|t6sTHJZ+Bd` z6){&#XJD2h4HaQt$mC`yCq9)79~@CQ))iaIIJ1M^cn3cbW;thmMr%Pyl%?*1M+P`k zyCBCM|M>Zzbidz;dgPqLecy1NXSm?7#SQryVJh%+xzHNuEiSw%z1>K35}FD)(%~X_ zluEDlypU?&2S-!Q+0vW8ZI$G*WBD9yj>l5ZSq3i+RZE6rP@}am|Hn44kuy^kE1e zSPRD_kO(E~;i{>~Ne)N7nfmF|2V5>ETsZ=-iBW4A1_AwmX$O=dIVLhJXOTNgum8T$ zz8N^$Fy=I#*i9aa zJ0UZ;O3iD_gM*AT94xiVW)McGAq(Z{*46}|VO&BfX&@g6!ABf}B3P0JTaKjBEIlLYkquPZa z_x`c*uf-C#x9f0-X%2ctn2|;U)zuSnF4%Vxk_788IgiA9!2N#jf`Qx*jUxW>!J^b@ za2pL`3*{KsZVCE1)i zkl~JQQps~WxOzC;bQc`062|F)kX6nc`u;Qsj6?+6L^aI9$hi*9koPdgn(9(gkA2e( za@n)w8LuqFFopBbE$tajh7v4t@^)-|9R*0o*okAbWvw!3|KGoM*9ZyqAx1`LJ?mlI z7~}Ei?mG_fNUKbO2ib#~2#E#J$&S$oft`_t&q>z!A*!S`pQ;^l$c>RE7@8P?XnVN{ zKSf|YxX){^Z@lZjM{JJ9LjBxM{P2MrSg;S`AsU86A~y2cZVWwlRxr`Vl8ej$W+ox3 zZlZbb5xmFF!(gIldEB=Rzkm5c4n*(qcDvL1k!gQ69Dipyo}#vlZx)_}fNkF>hL#&u zsTR&I_we(CWH%JP-c6X}NvQha!-uwJt?P<)y}{cvMZ_uE#N<5YX~Mc~ivcg~ra?yAhV>W8~WdSv&?DATTu&7A4!>Z;7h2=~vw%YMh=J(}@&+#7m0 z>Ylg917TV4>4|U?C_r#sS5)UMmKIRW1#1!4fUpoDE0qk_fPg@8yryz*VR`69an6k$4ZPTl^Lt5E zNcn|?Gqs@<_n{a_JIHE)U7ka2+f7m22DRGBE%8jWJv&c<-3CNSPd<*Mgq8PNLCR55 zAs!@`CXwqxt(W~=4QHL4YnI+a@C&T*)92{D50|mYspcF3byiFNe<9Y;M$K*w1ke-M zLGEY}kzQ?xaTz3eIa}`cJH<(GjWZ1rPv^-;7USn37e%et>1@=otp|v1M^AYsed=Mt zoN(19_fv8PA{P` z*DYbxcD~oOw23gJhdF1moK`&3@U6qTLts-Ysp0(+3Ag3J?uaB*(L~yP^Q;hV=y?A0 zG7Y+Pq(KM))^vqAnTZT7{isBD(%O-ptEeHmA*Z-n-;w%-q%Xu8b0SITXuKmzl%4~* z*QsQ*3L>WIAubbHjYI$d@M?e6YG@h8YZv^pGb!yqb>LoteaY{-Z_xw~jVb6jpAqTa z+q+o6v#XB$E<|=cJlEe_6O(NF5&fi{EVST zDOj5PxwK4)1*dpDsULE7D77OxnPa%=dYV%NBTT1g7(?gb*n6`Oh}}DsbLz9i9Oh!Ng7 zv}GZurdrTDMVlFZzBDd%j-J*;t0RWa!J5O}rL+zh2WK37VBrERO~g96yGg=^wRVs* zwHQr{wGQzNyUj~700=t;lk=US+DH-|qMVzjNJVkg5|^)DI^!vhR2%NVGz13~XIdgL zp85=4D~%(5wF9rS4z)13P4Fh~VS1-uj4L!+nFmJZJRu?{97UYi(EE{+qv9|%30^yh zeC9ziRGXbi0y4R+eccK#^dzMzmxhpff<2-4T!0w%}R*~oo zfapB@i5yld35Z-L5j7qDJU<_RO&|T&Oj0%j-y(NK!2KWBum7QU;MZS%!Ee9)8UOfy z|401eKmG$=-+toX|NDQ3zxg+RzUA*HxO2HbI1qdEx-?42w_I<~XpFi=(KmL)d z?bns;k6&N0ZyV4_`S#_@7reZ@;OXhcwsEAa^=!dsD**5Cr+@iZyuH05gn(au`2{g9 z%xJUt^6RhYt>N3ZZ-Zo0YQ^KRA=mOQCs1NO&N*eyS+-a;+=N%OP9U~4tj;;qQU`IP zl!_3jP}m+sc)G0XuseIY-SGVMj4xll;Q8el+k>LK2nZ|$l=2Wr14{xzShhFz-YR9g z=LR64)Wb31$In;%%fI{!oO5{j{0ZJWJiR>Q>({SXFPEb!7%C20L*IV?#^2}h<;xc| zcKcX3rbdPfrBH7{?ApITvJBtH1qx#mZKNm+J*@KYt<>ibJy2kfTzJ#Qaux zk|mT~o>%nI^zraqavnKolQRt}dZYg?c|5X!CeH@Z;wX{Qmtr9@|EZ zsEYWy+^*yR#7-brI1 zvJY!=Q9|@qv273ZR#^=RlvX%qCQ%5aQUYQ_d(gvE4Hj zaa#3fo#TigapJ1<8LUHy2TRyU^Y($lSI0tlAI5-j44#}jA~=}f_qadC{-;6G!K`*i zX1e5-($6iU_!oQYk8;T~uMO{y$R%Bb3z4Ivy;D~Tz^m1?z1N8i4=%g~h!!P=H59$O`YPXI_(P$18>ey3T9V#oi?|Psj#XtR=WBm((L6lmv_4841OQBA$&)~On z`1b7^DaaYPd3t(MKoCxm1j?%0xO={pCBca zOijS$vU02#5hA~Q`HIgkpAbSs*)yE8c)DKke7oZ7=Py`79D**c(m8J*MLmk`t zNf9-FcB!vqZIj({8PO@i^moCJI!6z0plsx8%adaZaB}FWWe@|6Ic&q_=jyCoYu)sD z^k87rc5Km2AfX%2J?(3GB30-aq7ZmKa=;P$dKvQNoF)>3)CZzwlk)tmHX20PNtK&N z6dTq16oVjy1!MTU1`xx_>%@#}Ge;QpNs&jwg?Li*(Y_I5gfn)EjWWgz^4&*-j*nct z#IZ>TMG|`^KTj)8r4P{r5q%zL2L~M+(tDdg2?6#aD>P0-%EL>byNpV3Ttu*smFe0W@}() zslJFy;AcNf5d&J4WsMt3Vl!UHjp3Qpea0C0;3vi25ifNNNvQ8*0-&*jY(ww0P0zD9 ziwG&_Jb02`x5G?(9Js$qxs3JJLD%8+e#f>a)Yh?WJ94eq_Jouw_Ehlw#}EA1|N199 z9uLH2A>wweNI4_rjL!FHVY_)DYskKtQX++xq0voh86mD{WZP^B)2O8&I*WCU zxGpO$mlaP>H$>+Vmq5`2o#Ut13&$#u#qqiuxQ&b#NhKxm(+=|(=5jeaTF8@7H9@( z#Cd?DiX4lW)@6Y=B&G1iA{vJPgQpPjDK5Aei_jW;Z&+ZkdWuyH){&ihHwc!3W=Q(Q zF&NyK8&+ITgM0?{bUjf@8DJhcqjfCHGKND#+3!6JySG^WxnsXm?lyY=n%C^1))s(V zlXWz)Rrbu3_KEoU5g~`x{_K<>b)$9)pkBjLFY3Y=plc;%Wz1Dpf8FAKld)#rq--jY}3_Qr2Nv5hKnHbqAq??oISZUEet-y4Ez}6uV%SkaJ_MN2asR+EM=QcqcX-*a^d$^M^7#Fr9RLSG z_`dw!X|pJYUOUyjx=+{Qh_i#}`8hme0eT=c`k;1@pvY~#ju@Zo^?EoZoXCOtXP%Ys zbiHSHu#W^i@;#5oW4MlM=N7&9-|vqJJJ4YxR0RM4AOJ~3K~#>z(ywW9s?10VmK9<>_-k?`x} z^eXT7?EV%b<8cO)v+a3L(AQ8%ETs_s-CBcVQne-m4mULIYTS={U7Tu0>>emeqOpiI zERlxyC(@r|+({f-xqXqXsfLpMv(>`^RLFa0_Yx6v0ez4VaUwC$eQenG zZ8#Cjz9aYRdc95}Il*zXBS#;iAHr(R?#0rh=UgV@oZ6 zih9;(hv3e7FV>iz)ZyNHc-gMg5=hIrz^`o8@Ni?)Q;Y7|+w3%UyK_a{)Re)lCJ$V->oW?r)?z-vy>g-lEdXbaM zpV98>C#QHVcpm2#=31+%b6iAAQpd>Ips%x4e{PL103QO!3KE&gsNNr3i)kl9EfkcE zT=PXdYC|jOC~j-Rr{`z<;eY)Do_R=HGsVw*{`?uOB)$Vg#;NxYt+QAFn7s3;y#z|1>0R12VxA&h{Kcx zd9debfEJg4%k7H5`SSnc+n@36fBYHS_89Eaqp0!N_6JxTNe2MYIM7-~&lSrW;e*A~ z^E0^(efu4Wb5Y?eeti3eA3uIzy)K9=y{}(?{S`3=G;XM@wQwh8?$kuSKq@mcbK$g+1chuSugqaH8EGf%cC1)Aa;etbN1qO}WCeV-`+faF>Z6EP5#&kr#P(jL7 z^BN+sWY}C0gG1XhS|(+r^A@&MEYYJs3VNwnoW(T;1Q5}M)Lj+E0hOH`P%DDR^?EX&zT&{4vpze40xWLthMxN#fhVG-c9$U>=;{_os zxULs^F42+qgv}6XDrIK2cXBH*-r&BGg}t#Bx9gQ{06T(T;9Qvww3VGCYPXQ)Z9Af5F!_h z)}ZHvI^3ZQ5FCO5A`^>DFT(+$_J)!Q3@UmDifsr>gn>ogH`GGTVZlWLQpyo?L51A{ z*aJ|c;h-JG7~T5@aC1lG1X8iLl7L#^0ukR3Jd8J_QfM8uCbI4i9x2fok#oj!xxzUD z#+|1kMB5M6T1NAnQsD-F9s4@jgVy12)J&s%#!(dT9#-0LJUc7=gY&@UGRQZ}vLJ?q zRBA?m5@zFe89KQ^rlNZ&mac9BF-MVCnC#c+oVbm66*?me$E3KCU+$)ezg(#yzHg!? zrv@N#b}tQX7QS{JigPjw9s))iQcg%MqZV>I3Be&6DSjE4<;1p{X&-rTvs}^98$C~p zTi`5EdPQIxK53?U>*$sUBl7pX)q(X%BL{C#YDaHk@tE29%uWPU9VsG8B8sx|oW~mw z!h+l~T%)}_$TDv>D_63iWh&1~2 z@=RxTB7j*w>)X#)tjmJG`Rl*N=TBd7T~@RP1X$FT@%sG-zC1q>sO&Y;dnGv=k}`^(qq7@E zK&|sIPe@*pY5Pb!B08@@$AlPma_E+U*M{I%-cNX-fy!i9731R!t4PS%p_@jLbCxsK z>)}|Yn^*~3DjdJr4drM@PpZNuO;Vw#8Kc~I2>fE&W;0COHH!EJjzF9T2fbF9Zm>Ug z#5KNi&$(PKD2bdgTWjzxQZL03psj;dP6mNVLe5hzI_=d_HL>)X>vA0`aaxCBv1_Nn zofTz@vBQbdxx>a-&LH1BsXax(ZzQVkAT`z2U>W2W1+|cWY{O87X_Cr_+HKT(YPBvk zww<3<`!3o|1Njn8)`@CH^eQDCH=6*1MX1%iSXqN+RQFFI?klAx)H<4R`wh3JnvcaK)a9hfri=& zY?Z+@=D4R;7|1W9xAZokw8DfG8XR9%CP;F9=DG|@3=xVNtw|ahbdkw z`53A+gS=(j-(KcK5u!4#ftx)H{2g@*gIMI*WTd*Il(kb{kHcWm+OrjE?dX9-+sgO>`)nOrHONB3@KnTVSS2juqbm=QtRN zkuD>?$d2>Cz%hQ&*a@#05>vU}5rT*JaRL=JFs})TQs_&}<~v+Gv`4QBKNL5bcP+eg8l4DX&1y;OPs$zI{Iol_9?&zvXdH ztsP2Ys>gUJ*hSpYm8#q-#~2z`!OYP?&B$}pd9X-*O>UK(LKIm)rNrxi_H61iI(iSM zc(6Q3vl6j&b|w=Cn#Oh00n~$C4%~=25zdjdge|$@?!_^6P7|pl;xcn|i#xf4SmiEK zhdsPHmPgEaYaOL1S6gGSB_cUR=kfgf%mZ#Fgz<79f=vawf$MZOIyv)1b!z-@>2=18 zAubJBEov`nU}v~4t?YeAPBRpFPiF$1y^e54-a9DXHzBu75qVuXbnyFhwP0h>5)79d z{56Ry>@+B2lRI7ByGooS3LZ`+-*jJW<+rYbcUX zInj}O*zug`=vW>7n(Gm@NfABUxOXz-^3I`i|IjP#!!BA_&zNS)uz{}cecQ)=^my!J zuqVU#p*BA`z_(mc6W1d?pydYB2=8mH!?-}T4jg)`=ys0Ckk{F_G{=5;Ke>JyHISL> zia91mhJB-7&{1O_L`MjbY2P1As4!fowNdNJ`V<#^?>#{9|AJ(JHtKe6cMTi=0d6!;gGK9jd56( zh@AIPlZb=iAzX6&>{4$nwJF6uRZ_MyVZu2}XOwb?skILG)8RB%m;^7vXpX!e#G`t+ zee3u@(+WI0w$xh3b*ek5+oN9)9g%AOQdBK^Cx;AUi9kG&)Oef)a$oE2Ag=V<$QiWM z5z#Tkav;Z$+zcLxge-4wZ!qjy;>TwvH@V;(0K z3~~etF3j=7wNEY%B=+lL=siWB8jDq8g;|)>dsFyqV-i)K97o0d-&%{k93s44>ftN_ zN?{<}#lg^mfpI_sxhY$_z_~c}_nHV-2b1V?RXp{`rkl~*&vc1W=E(lbE&7Wbt0xAlRnIh97KVV2TJ62`k4SkyOGoay#O) z45cv~gd}o!lvp1j+SgiPn?vY;iM-ApwD$#`UD{4Pt6>Lk5jT2?gmZmF?a4l;_v?y6 z{XS@Z9XP(tu!B?#D-+GAo^gh-K_{do(?)Hl#mchwq9ehjkm#IsgP>t~U#0qq1e}h^ zeXW9@jY9+|@1N>A%P!-zA6SmzHr~wQfZB$eS1;7J#~6VM*lvdyc#vwub&7EY13d>X z0Q{(dq*kP}hI(c*&hCD=Em?!T9Aw~T8uBTwNW1^F*0869#1766Px~@c&je=ub4AQ(Rjj-a#6NxdG+eNnM1?W- z+e;gS($+i0v+-Q4^^TS2bhTDauBjsdsGfurdVNwq*U-C#7rQLk%>M9)KfnirM|$8- zfBF;lyphvEq&F$H&9ASo2&Llr`5C=8cpq`O1Q-DrSq(+D^B#_YF98cPGk>g+P1p_l zvfjzUQWg#=a5g%Sy&=mciSsCVVkWj$2#`>~0J)INOmD*-XUiEO1bqGam6=?aVn#mN z3<|61w`~JDCIHkNzFKs#gGC4w(;_O~l+yToSQp@SL;v}coDcZWlK3PU)aFc?&y6<% zAqr`Bt#Nh$XP)bd@>nP-C6v73>FEUyM?Ao~E~uIE11TOtiu?`t`yIv@ zJUu8N)3BY~y8R+uoyC`{kEk@bvToV>;g6GK-xWOy!Nak`0#SSQ^tU zgL0i4OW^YhMR5Fhd!@p+R_u=rY1?7pC~ksn1p^OSa?Ws`Ek|1ioI~_94Di7!(wNT4 zbZqb2r$WzrikaCHWo8SzxYj(1(aMVMS{v3Spfz?Vs+@;zXy5}2SmR(i*(2_WSnxH| zdNjSmy9nbzB%7QN48_lQ12pU4qCo(W#JX{C&0@RX(R#x=idwOPtFRo0Mc8R(`(6T~ z-rnA@gq1+vMovjJ8HAOhIl%1AnhRS!(`X*a{*tqr9X&%E?*Vq}h50d~9H&|1TN z-w^pQXk4^T$}G;Sb-d z7#KtBbTssm;k|*g3`(_%QZjPNsJ)VVmIv~qVq-hbT-lbG6=xR8rcbFzM(j?hD0UyV zw5Ij(zFO^YZs&oaSYcXrD46rRDMP#|(ncAd@$q;Y3W!n)QYll+iBUzyk&#)DWq;>k zmS5roz-WtFde8f$s?+yJv$m!15wPRjIBB-A04bW;FCeYFh7^TD*rK?rj(wlAyJ^cQ z=vADimT_(g0a3fx$dGcVhI||Lq?6-=w?`(qm-D4#Spp9TXZEpV(AE*ZYYBr?&vd8bW<3^>ehg?7j^~-L*ec{xtY|GCyU!IJq*>@ZZ4uh0ic1fq4e^%Appg=e14>#dF5JwusdQ zuvRn3Gi9wsNqH!1rEa3N(Iz0&Xx9>@#I?cC1-DX2>7R8FQR)CQq~_7X6M44JxzWe# zFrhXdL?B)73AlPDjEUopu5Y!%UY;|_VooVhP08mlSq^u2CMd};Ro@U z{agbb=Waj6a?STDXBmc=5wCF0To;hF){JiDe5Ad_`NJ8_Ift^BF-RmJX;um~<+vsL zkp^+~d!^50CMB8>sQLi2JdBwYmO-h8wdJ>5YXM2lcHg>R-S;$l^Yb$=*9!ogKjMLD z&9{@P?NBC@Oayi_cRCz`-9>Wd+i9;;nVXAd<;}iaO_>YTd4bhTnEP9K`Lv!jEJCSOaFwS~?-pQW7t}BAtYxaEy zYJ-abDQ#4%unT5Q8LJC$PZ4k56K=~28x03*Ws@#yu{R^QzTBS2reRckIQn! z+n(^}-+sgI_d9<5tG_~N9jVYB>#avMK;7@yQbDc-rCH=w&>P@wWMWH&?G4TcvQN(& zdQRB44K-)rvf}0W6MAJrrLhClHT58R@966ZcGOeC-Vovpy9B&*s`<#d#{5rYLFv!R&cmZfu#0MtpcA0Q|gyH#p`MyS>i+VUaxyF(X zAr6evur+;WOMh|nNa7j#4(SU2QZP@(D1zquIA?VtZOvu)IDZ*^VVpP zh*qaTkYH3g8gMuQga9~;#tx&F@2ULU5!w zDGjkt-q|5o5wWQ6IUJIue+%sXV@^u@u|Fusxyiv`-?4E_`l#1hr?{QoVVy(Xb`m8? zR1Wv=+jb}1iAgR(RD5te=;d-juN3QQoE@>*8W+$cG^w{kU}vk+hO-u(i)J{m=|1AT z|Bv;lL`5RTIY)>Qz7vl)OLpH8ahb&Q5Q&JQur1FJUEm>baYuZYJz`m*@0;zoSQ)CEMBgO*yHG zLz*TqjD4K%fkfeHhc3ay85z~ZebPUpwCVR~L?(FoUqdc_}$$`Vq>*f$Y$+Oj_l#|&dMByy*-13~D6q*&< z#ZNe*j&(n~EbE`4=dw~u(0VA7`=x%)1>=`w1gUW}_NuW9Jy+6rHSr$`QpqFE%v+g9 z^ohW)&qf_tu6w%C+bKeh#scMk`gzoG%z97M*Z%BWNJQqDG$c-f8ectQ^p)qZdhL2e z$~(vCo?|ZsPnK&d!a{2;x>Lj;CU--*;>mj{y#Zy8+B&;^>J$r|X5rJZB-!|A_al74=RU!@fIt*%~;@+I>nw71lE-pY`g$M2zYsU zfsYZX6#RI7rH8X781szZzI{hdbwqY-DUAgfec)kcM{Y{N&nlX8e!XsH`WSv?0@_L+ z_IBPywAP8ZU<1||Q7l<}{`~zrIY1O*{{|a4>#X9ktnk)hS!sYLxvzBSf$qQeNSv)H zMTiDjzkUB5-(P>id5aK_2&C1oi0fg0Mpkup+C223EQh{)y>Y}$?G3dwtSc*(1)Szc zuH!*2qoFg-BCa(2OEsa@Oay^O@k^N*d!I>db z7A#qf8@AYVNV#Im39oOjfHAn-uBe@yfvRWKeJ3ZVuV23+rG&?0N39Ll>lG_E$+cDj zP(e+6&Kbs9_+>$0=4!VNy;KBNQdM?e=$!zo+CgioQo+?SE6!2TjDhK$fDZn@Y2+@^ z9UoBE!A2t4l~&m1+J8m$}W zfkH)9*&f()f(_&%=?ggYn$d81~et4J}u+T;SG&-Mg%D zIF6WBVR<-B=TM&q&kl$Sxv1%Q2?5)>M5cs;9I;|R0MiRDn+&Iiy?Y|8+i>>l$u}~xd7Eta9P*k64P5l>xCHV%tjVR zi=5f!x-+_{3awmrigYs_Yh<9)8I&UDox$P*?kNwZyfrjLF`Zl)q$rMIrRRw=eobKD zi+J8_Q%*#^Mr;CB@X?;rRHH~v-e%4x?HJ%)&Ka2tm_3t%V6d+TSmsb`VzsZOx}g&p zWZO2hiV@FtE}(}pqIWpg#@etJOj_bSgJYhg!5fx>tTugpeH}vp&o+x~Fy%3v3`C7& zJCV&E#4#KzeIn8mWTz zeW&5r<$_;-{S__-z*xB8VFOu-d+)KV5l^=#MDK7}7c4%ExRxbETrVqLo^A}Lbu3GS zHV$>27u_O{JtB5H9yohDo0MD7p zaJa1(irBOkmkTMNTHX+yKa^rV06vU$(Mrd@?XX^=FBtSQq|$Kq07{&rn3P@%Iy)0d zuQSDOiCWeT`6IC{#2sb8h0#gXhXhDJw%{ zKLZ}pXB_I^C#)-m8x&xMB{iuA59cGTz7>!~zHjs#oq~j_vI*94aX10BTAimsDr+lR z+tFGcPC4}X9ZC^JpkbvRWk#pk)HBQgOBNu^Ov6AqH#?J^Y`5&j!JybF+7Rr3iAsYu z@BB1OIqx&3+2IB6T!3?B5SpxU!&#t~8LXFnw1qb9vj>qDV{m&WA~Y2ZnR6c!C))3X z7?sg`<^J5LVN&P8(cyTPQUYp6aCF9&l*ze|9Y=(u>*G3rXz%%&0eHQ?!R-mR%k>y; zGI^}_2EQ)!9G02HMatibpFe-%c3p8>FSy-q`26_=m&=8tL770DcLZn9ok7YQYP%vt z0-0mM2|YSj=FJ!DU(DqQzeskBW|;w!$t8dT{8@qBNkuz=%aT z2=I%J28-1>-1CkOOD>f#aMoe*4q=a|j}0l;Bd(H_xRnQa)dHzi#MX$Q!i2}7+@K~R zTR+)0l<;O!W49@W1MHYF4Q|<~E1aysaaPdEuq+r7WaNUz!hjgb zaZQ}xG&rjVw&Lu02K2N;i}XQypE-lW6ocX?AX$b=%^dMH8n8DU<L9~tvuT#Gmf8#-h-60A)% zgv3&dx|Lq5!}bQ#NTiceB4@c=(1M?wk4h1&CLRt2yp{+6p2-5^p7Fl#svc(gtz9wK@n&^xg`KbL@z`(gYPvkP^~EtrZpy z-Uf7g2y8oxFthERt>WE{}_yIY9l5@(o zZRA|w{cwJgXqU4SjSy#s@VAudUK|m*eh{OND3yl2>~kEHnZ+X_w(6K2YH%WskAK?_ zf|a~ysawf8h6uK{cL0IOQyJb1dAbePHxV~cEn5eP&U8zzb=JI#=^zK%{%&AcSezpy z1|5%{b0)_K=h*oD8iFBt zpX69W=>`%(gJ!Tl($Vk7Nb9JIYa_czI5$M7v^NsLqFWMcbq55VyW~tR^V*$7_BnB; zmFQt0PK2bR7O;%7(XUa*8rtI+I7Dq_kVl2wKmyPNiw2;V#l6%j>;S7z}R-9Qr#=5R_pmc{n{NWFHdb+ZE${V`9@Zm$7#^v%19~TxrABLwnm|>c3UEck z&4cB75Gd$F>1YO>DR;kP6sGj%?F9O3K;1cqw?$US9EiL#&J1Z1jtHVY|85x4q0W(NZ^B5MzT%2AqSN7AZyCN zL(Wl4(L`BRjmbt#O2&-n7kF!l z#KhKzxn`vOfk!L2-7W|W)R9dV4SRa8=&c}^9ZT@A&cIjD@T78KkA}{XNY769^E|eR}|@AX-CC6|EDa-Z>h;HsJ019Y22m9Z&0m{><#dTG4Yu>K!IlG#7_5 zC^`>#It*7C#^r(#JYrbTJE@^X-QR0N*%R`f*p8S0)t1R>*>aGBfg#5`9&px7_IS&3 zr6SS-HeQfB@V(t(HzER9&+$`i{ncxOT`UUk886SzsI4J{`zTtqVubdvfRcBPY3lgx zx8G2eGgMVB*riIgu$$QMDJ60WQ>p-A$;dd@fcQcy>}F4zbiwR!`j#)bEJ}X$*8p=Fd0tPiU3}6Cj6y*SlO#5YeTg@ zoO4KNL+x`zMRu+ZkH_Rt=^yWL>d-X7O7QARncC( z47)=O0%~=>Zgh0)5Jkp#v_|LV?RLZS^E2+RkKsHbpm(oFJ%rw|t}E8d1+`ZEyx$RG zq$1ioTrMj+kvMp35iA38u<*f+h@Q)JL5L0}vr40%GSQU)nd-+h>{ijuL{QVF8e2C^x`~*E<3f~D&KlyXGV*W7V7d?IlyiNl!PwT?P|eC7uR#W# z8%%X=8tY5|7O9y^J2L47BtJjX5>X~O?;2!1?>Snrs%vX;d_0sEGq9_N4rfKQ{yQPn z^xl~yhbd!vJnzwsrc&;od|ygz&CetUQU6$_2$c9gBDEZisLu4AhKCF^cS~dw-B5Y& ziA>o$#{j-p5t&nz?4fGy6R`aeY2+Lim{Ni>;k3`wHMRzmJ-hx4T0JNZmt%kEha-x1 z$!QhuR6cr0AvL>Jfk<2sDLwiiDNc$-do-KIHlXLzPy+AvEv?kiN`C^!-e-U7W?bJ7 z{q@NuM*%t-h}4R$kM;xF59@FaJKsYgyG%oVm}w8z&(lXh=y_FP>pK}IbV9$;O3|`k+tzFn50VlxW*caPGb`ij<)clSVr>~=~bM%l} z11TDGd`Ie0U(=3JGI(#S=&S9p>Nkxd`cg{hrQ&hFm9eSAh(^IJ&6X2 zy=KH-sUHtiU;7wfOU3Q^3B_8x<{hmYq)t&UE_#F*u5^D@KV^o6jpemzwi^aRq zCmCZ9mj%lbapUXVO;fcYk$P-r>uYP_;mPw;DQgW3xtPkpTVXzvYoXf9Wql5tZl$u* z&#Uw}0?G;r0ZJ9yRW!7mKT_+iRP& zNxNJ)9MNuf$lCg~rA7)NPLX+Ij$qrn=jm+6FN1F9+=$dN zQ>|~_?bmt$a~5UF^Qiw$e@#CdnjkOF(?{;8+GXbKrf_!0&^?x}XMsQ?0QZ zv^jcz-OKCxT@z{!ryMsC`1Jh{99jf7Ln!V22Pf}^I58i{_b?2`BiCO?(#hAPPSpF39;lzm8AcHS z&RCDswWSoe7$(PN*!O$ph&rux#F}YR`FYPf<0gW)w$_l8>6AA0Lqe(%Qo77gFd$F->y9qnC`fOZo*;>q3QAf-(@ zbkBTtk{)N5v+wp}egAdOF7IFSUI4)Tpa0wc{vWQlD_{+_eTVfH%evz8mrtZD4xTp7 z-jLD*DLn{SGXZjg0`M0QwKJUu<(dcDFKAnhB2tUwGA-jn^jRTkwj2HFrT zP-;Of8ND~Wy}eRwSRf)n$~zN#0z&Xu)&)Kgxnx}z#ASU4{;umvjxp^3Tdf)b5s8Z; z9IP`ij&qrv6hBNpa2A!-oux}WmdBR1q3T2L6a|zs_LP7Qw$-+jx5}zf18(NIffTT% zrix_=Sl7!?(8Lf%^J!ry2d**Wwu9DTZS3&kU^uo3t&?L6{Uh3h_l&gfXf>ncL?E}g zuz=XtrqgS+l2OtQg9d9FTFGdY?9pn;FbxRaV|#2!`_2~74y|PDk2_v}eut?QxAlTc zjOaB3ja@)$gNH>; zZ~;HR|G>^WZ0?VLtR=GhgnG{>SptOS4DtuVrmj%uR$U zGnaK8d8oBjq?F+~s>O2jSO*Z7h5t+kjKoxp<`osjQd1hdgR=&f6#_muZb~bhw*+37 z3Lof@6tV=+P*TF{+Yh$ICXm^n!&!si9o87ItP8H|3hx}&B_afm{jt%{7yBK)myH!; zja?&3&cn%ro(FO}Dy&xVo(qb`R{4g2aZxlmOL^P9344~+lv3o#aEr5s#gkjjJ!e1lcHCj=jcn@%l-onz+M3}a^|x{zw9cJFZB zVOf{aBprn(IfAv?7{KkkU-7=ij9TYukW7lXgB+5!9oNeh>l$H4fhw*u(u620N#5rU zyT#6fT#K9&_I=0W@gP;?81Qwp()bx>;1700AW4RE+S5UHQjBjQOG$B53VmMhJP%n8 zve?_(D-l4rAlf#{%zb)(g7+S8Z*RP3%Mg(Uz&?<&e@{DdE-1M&NvhC3m-F24i))!B z0#M|7K@{fQG|HSt!{c#BEo~^QmW5&-YA%Qp$GGjRG+U@%0S|n8mF+}?BWg(&|Nn$z1hX!95gpoe- zw2#5A8J5c8ETZeYjyl$VT*7cnFehd4c>Zvx6g4r)8aoxxt#%^%)y9r#NBo11r9nS~ zmUg%+2+>T}a%aZB<%X=)ijp%j+lY!1y7PW3WHVapceFNJZ41dulazt?Dnlcrlapn$ z)V6w1r)y~ootJIdZDJ-jiAqisj#U5-?^v+0l)N`K&$`l8X_bkexNr$M8%8zds3n~Zb|3ZHrbz9%7t2p z)GC804Vr1dhvJ_6aGvVWgANip{Jg&*mx5XwJLQpE=O6tuNymr{{SVZ}6wU0jT?-V)Jd4TynM`!NJ8 zF(PuG@pQYwTT8B8vZff63=A^eE>}E1J>&W5X+(CA4KwX^mK}L>VaEX(vhsP`*hMFo zjP6La<(7c%JoZ-bBR#P7ieiE0E%sVbEpWYF@#*;mx7!n(3wYahyzU#4v)Fq>F?SI%r^7xCeI5vwG9=nMi$s zv*d#3j2*ETaDEULShYmIj%oAan3F zhd4{tcf-$fw44n8$KIoGKZ<$h>%pLEPPCV4OiAjk;5|a{(*Q!_PX}J+_{_0W#I88V zkt>Wil5md*J7n~=v?=DL)_TMT8P9`ai&l?%RnGEdSrOwh1~^mn3p+2j6FHUQn)r6HG!`{RKJV>Pr-Tm1g}cYOQ(H{7=eIt+Y>C_Gr}#=r%N25$h@I33M& zCe~4%gl1^Z?rem{B(|bH`@ZieipUYGPp2v1IIMMhvXwy+Zd4y>}Alt?SfxigTupuIbi{y4o|oKHL`NaX}ybj22jF z5y}v$z; z4ew-M7|QrsdGDe1nNmjO^(NQjT@0C_GfHs3#>4aHmrr^8$vpJiW8biDdsPd z!=*nu-)E|Sjws_8BRg%YdXUK|mPNpAM1Idv!^16_`?rQZdO?a3Vgiyg!)1MP{IqV= z(=tq?&wM!VhY$#lZiMTJ*yAHbx>1DvfmJC2zjpl<@fd(Hr|_0$5QaB7i2*wXvo!lL zA4D^Xpj+xuStB`TSZ7HPnu$Ce*oCFG1|I_UoFSF;=o@5UZ7ecJi5GD-=s*(}|79gY z4&!*W6?XM$2VoF|_4d}$8|_0F(Tn4kxpmGo@Lu z(ivhH~WS+t7IyV);zPJEDc&dz|+Ok>X)B1~=A( zia3gJP5S5mUSK1(t0FSw!%k)D|exo4MQ zIF9Y&HDDn<&m5a3Ze-_3ud#ki=en!05T0Xxq~9{s%fuLlTPu;t0%NNFT?8ZvW9W=4 zt&W&dsqL(H?*v|Fapt%_r!yBPlCM#&EZU*P%O1qFQE-0XCAyw#>2nCnayoZ?@_agbXT5Q`CDLo~s$z_d* z1D&;&X8AnNGxor$HCaZJn=}DT5(!`pYCkw7lcUXv7^(^XGqIc2m$e4|)2C0Yb}wYR zTY>c=o3R@VZBla`R^V@MZ}|56ccfHsxjy0L^A~*m`jv5UxMRzsi@orLCxw|u7}?OGwAM^c0QlR#{abwf^%s2p z@&)&wcOHoHf(ilPreRr@!vRGOGPHNr+~zctS(XJYx53ISDZz6w+IvSYWn|##oBH(h zL=GK4ejr}2BY#@6ndN7THUH}m%JBWS|MuVF`S}?ypPqoHC+xrf89#pfASDL3WzJYs zX1sw9WAru^bz+;e^WZneWeis6`z$V(3u>t-yDbs0FqiFkfc25KEzAJB}CXpmj1o$XblLSuXP7n zuRtv@tnzq$ydk9xx649A2N@Ptauun0$Lo(D)KG&4GQ9!DIXqo&2nM)>1xs*nmeiV5 zJQ~zg(2c{V=Nn$u1>n!;yMr|y(XD9KqZJxhdh1|Zqz1fHiU49Kn$&l+o=0@V*MIZ3 zKyb(@;qiD3C!@S4xRt=unu$QuodLQ-ZDv@)nh;T1M=KtSA?vW7GhiL8@d(Bai?!02 zDGlS*zz6^UAOJ~3K~zxV6FguY+`{l{w;ErokZj*~_xPI1=j#^IO)9>|Nfw zk=YG6RWRG}8MV7bW%5Ae{B|L$$hxd8AtfAkyvl_m#t74n3|9gL?WEjlBa5BwhqpX6 zQZhUcrBhJZ^g6~*$VozAk{HWUbZnC)yYE5BH1Lk7Zo`&ATahzY0kt}O}PY<3G^Z}f=p^m&`x!xvchdS)fXO+K>^^n|l zYc2e8kSL^a)*0=nK=%Q;b@+9~*H53ZTrc?7fBo0-nq(85VGRwwET3Zp3Wbq-O0HdQ zIB)3&V*C>4k5=9R0+aedseW`rl}nvi^tvEFXU=QJ{@K+)t6jBSy&Vd-qp;T5vc1p4 z?^+Mgl@vF2a!AyBhAzzI`K|jl){?#+^11&X!rrY(k|W8^Ja%*Uh|H`ibT>FHLvls< z|NqiF@PU+_8Fu5AnGxY`7u^R{HCMApa3KN#P^ikx@Qaz6>N(%J-#y-CEFUaghO(}CMM+`V^$gJUEPr~si2^opQjT%y6X&f>hYLHyP5nBRR5APzb1 zIzZ50E9U*`hvnRm%;1+POMW1G*#oK-Ni?T~7~j_vEB z@3Dt7vbKwK(MIl}dN#U&-wb-}T74Bj7~zv1z?A^-d{{`R-O zVUbuo-RrN{Yj@z<8r7%MaZ9Zt`hX@bb*_(u*3t-6nOwO5@JmEqJRaomdVRq+SKuh) z?i(@@3VX=#C>aNUqY-Y$Cw{+w;!!dlE?^hRlSZ)ax7zFREiFhs;CP4=n7FpeA!GL% z1fUJ<$}t2o6yNW6P_BsUf^XX!_jYEtXJbL96Y~LFL@ot^P7#L2J8HDT-~g;`aBP0{ zjB_k`>|{({pWNVNvulNI###D+75nOaQ9{M+2%Ue9r}z!Chv<54iGJQVi^&Y3?awg& zt!~<}=`3A)3=@7Ua?$tF5^ePV%@iBs$km=$UtCXo%lYR-oT9(}EU0Q&xY zwCO$zH@~7gXx(51q8gW@&F)zMsekSJj?c%Zm@~Le{fg3JpUK(PS|_tb5Fu!g^I(-= zkcg2^q31tKp~#sB#m!u{^~QEO=MSd;}A*r?f%?JFO@2dXsP{-yN=$XnwNsVPxRWzB zO7|~4SJD)>JWx5D>oFUa0>b}Zdq2OFg6s9l?}dlN7*?eb?7?e$Ra;Ri5#1Bjv`%<=JOdhpm=$I!CO=afzpf*aQHdB2#cf|e#|pE>&uXOj(r%@|qI(=2#WbpVwGc z?Cqy|wf9L(Pi&4qRf2l073IkN%*TC1xi>Kag+&=oQy%b4kJ7=sy+0`gI3+RbdJg?_ zW38XMpurC@dr{A!d88$(S&sbJkL+J>I#cxfSjQel#aLewjpxQEF&5^1xD6()ne66+ ze0Yt|0(#Bkm+P;##_x;-WFx*G&ee35?!IG_EX2H@(2$TBIowOfI zfto3-^ErGzpWC(Qt0*@8toC~7o)R@H&=$AbwjnJG*i6hrD4#@S4lc4jKR;zdA;1Or zn6RV`-;+^-iL2~oTY0!6I8uFi`;ZU`1qEA-cz=J#zyIfd;Kz?2`1{}gj%{056aYqn z=2`?d)ZiRW^qp()!Q*mexBpvs!+N;@8w)P3-+$ox{*L4G6OYFOo7@B~sJ81Wjv96@ z`4E^)A;sHyL)+6Z)he=F%W}>a#Va&75(ySN7=>2a`gBC#*azU-BTx~uoH_1oq0dl zd3j{Pa~+)Tw{4wD;DX2fu_J9OHqA3`6)8q!->`&;NDjGDcVOltqaECuOvLYA066Bx zu~5Ld06Nain#ncXwD6*|zNQt~an^RN2O z0RiNYYsTZo#n;>Qf@Rro92r^0NRd`7F2FYe9R;p2Ss^+e@|7ba#lTTVwID4kXVm37 zH1E!Q@5Y6VxYRkjvmyBeFV522?S`Lz`Ux&2j+@zcJ}{62tt=#KrJ{L`Eln>CndOAfX@#gU4YC*Ti6z+NRUHm>_$Is4|Wa&2iGb)MQdfjQ(*T{ z^&Bnb9U%tCt_C6_)%)XPuq(7{mz-2;9{_5iEaS(P5*Yg!AGV- zT(28rI*BoCs<;lx!$*gVhI$Yx5gG)4S$Q41NX{zN%H~31ag#df>QRwv1?dnN1Rnr7 zHg*>t4|gg`mKZo{$j8~Z2#!!iR~kSj#>97wX^fGtrz2$fI;U%!NkX;qQ@5tA4?#Jr zIG{L>+A@|HgbYC)r{4%@ObeFvYscg9K#U9D`z0X8gb8{QYJ-h>&WH56?ku$MjkoQ2c;=|Gl3L9a_ zV!$!t!Fd+5+TzJ#qZw_g|L!EiybYp48?#`WMvCUvrb*6q7(DCYEWp7v>Ud0#anMSY z+oHCSX@vxxcp;4pEwYs0bG=@fmLosUa#?V{-|@fx*Z=AT77J^t2v|j=B$&s?=UuXK z-7qvvA!1ES-zU0@SDR%H$gLV-j_*w@K0L(!y?^`dx4yO=k2^l!-|_PHy^B8?<;n-P zlF!elh5m8uomldC9C&|!M_5+)0BlPf$OWqCuccvKTyHvT+t!O~?>$1UpzVS+EkJEZ z!2>D6gHWOetr3KZk_pLsyuM!X$h^&nigQg(31wk^d*T@4!C5tRk zbJ`mdFbHr_DLv~zPw;^$G`%;k4D{9_*X8edMg-~ze6uBd~NfGCS zkfh0;*(qo!4-Lf6t%?8a*lHSu2#PZ0@IN2otf>`XZ$IdaZ$lEtj+1>~Fp7Z9C|OgJ&kEM6lV2MffNoWqf6=MX|` z6lY@*=((Y;`;z8+Yvy|)APC~r3X%4GXJ>5%D5wyENfb%MNkJNfHkHbZ|B*2 z1xMUKXibDquJ*H>-si6bUL?5;b_g&G-Gp4G4&$8nVc1~rXR8$y5^5#+IT~6KvXI=T z$Kx1;CNomL=fTGn1*eEKh^WR2&K~UN=nH;ds5`=}m`DeI zvxu$NKX8L{^K@>pkk&RIbbYf8r#a)=t~+DHVw95U06uWqmK&Xvrn;h@NA5_VI-ub77n?`WLH8dGMM(>8YIXgm?n%K35 z&>L>rgsn{R6|;rDMl8JIXa&0l&Q0Y}d_`Xfz}+A=JB8OLVMS|bnSPYdG^LlQiO04Wm=Qo0-a(Q#;X1QM?$p*$tMyAOY1S%&w?E4LYsju(FHwT z=wA700BD>2Gl9anz!W{ILfJb9#LhXm6p{BGwGa!vyhmIXw9FKTZa$!bqX5n=U%Eki z+=L&6EWN1d`ah+o9ho0RuK-PX4 zkBL5i9=B~%oTDzb8bx*l)(Nuz$PxK=+;j7j2Bg;e4& zh)`!yMepgT7-o**H0Ki)BRVDbePIT*LIf3Pswqy-vr3ls5|=(3?(9BKeiSFov1c=J zX|7QUH6fJvlT#_r!q9{1=a44!HreYB^wf%3#Hxb(K^R{3>oIk<$(gI>F%GVO9U&rm z@T^cLmCiha!{;TQbrd5C`6?RA0i1wf?u!ce=4k5Snu;LQia6&;bo;&3NMj=<=QvQ? zubM^mUx`Y-IuAZkZH(wld)R{*Oa;#bM9-uq7O878fE$Fz-8>ciQ(W;J&uP!!r}&)L zBAY~H|NmD#qd6LErXbGi(Re+0ws7v*4e{4sf8_y8+VJ-F)-n5xUsDX^0m=Iq(Ccg{1zFm&=6}TC#auE|>1kpL6duu0n4> zOdc^^yDC^0{oBU}_FsR&+uIwW4>&$Q@%!(;KjC|F&PYCXaZ4{ymIYy1dQ%|CCaFWk zQVN>9q};5is8yXVekfjSj=eU!RXJ%hUG?yvV#2bn91kGsVyn1*-0#>vKk>^izuCB-MCrL{DeRU`SFPmJWjym?+9#&J2}?qW-KM zg}#X5)4Lw~5MxA@p-o6}aE_jt!G|nr3sVh(GtcCTN~zNi^m`qT9iR6P)LQZS{acUx ziJp;;-g_+H`Omddk=6xiTY2Gb6+uzUM+Vg*4Iu~Qim(8V8uIjR}K3LE~4!^(ufn~iQZ5v8uB;m3w?0|I+^O=narR{`jLK#qB|NF5LB*dvOkV z;qUu)ed!0V|M@@vC&yo|OMeeKv2DMxo5g8UG~o61l|`Wv(>Y+3<`|8s>04(^a2Qt7z{+m{SbrH4fhqj?GJC$m!oup>3iT>HytxbZp*Z0|e9wmI7 zm}B=u$FYq$d+k)9r!G0BmZZU`h|T?EOoL>q)=F ze*F}GY8#ZNBMW_PumVOao>D@=92YPjAcId5AdBf7=DPD%pS|G1h_&y|!BaqK2{rSf zU*BU(xKaVM9T@k6wwxDdH||VCvI8jFaGaYPR#-A0xOLCaftnj4RBGRwLkM`gzVtK7 z+;Flq7G2A&fMpi4*w12{1SCUejWTSlp_!cYDp8vnE2rVK-XLCs1PNQg1 z1-GYQl!oS$()QHxuj_@P@vXSY3cqaQS-+RAH?tVZ4yfj4o4wyDB}8fZ=)L4UwxU%& z6QdHJNsAc{`UvMT%3g3B1!X^wL&A2s;QP04Sk@KZ^EqYzyul^uB}j8@FLgMxaO|3K zCh9P`&!8a(ce zm}I)&asRxb<^%BTqAs-|Q^oPwkk%^@6W)b{Nrns32zc2p zh(6%HKYCM}`|}PC{CRR^Q4mKEIk;52Bl;A85+ISzY*rwokkH71ghWf=fj|)PyNYWY zjnN(&qY&gBs&qEbZJlZB)%!?`Tau^*a| z`mS|yX&B>9Y&4wKBvyPE>^rCe78R+hGn-Dq%kb~^_jN0VmO%+2&u zHo8P}t_(x`kKKD!gpNii6Sax25jqLQMkslSQ@2A%9kxT?iN^1P3N3UURVt(%a%vr} zf*|{DpFQc&3A?2fP&p}@`@Z)WizUP-N}R2yY_y?%o;jLpu3>aorthycADs8-j3KiF znR8%s?zj59GBJqn-?m(b{s#{J`P2y0&&NyZF+U*$siazKm0t50s{}%>xFs1GdiF#QJ4KtA8}7A4mEI$v7ZO} z&r#cOma}_>{rTsJnXf1TGo{NKF!UT8N_-kT&V$=o)MU>-U)7j)ICjzu>O_KbB6w(G zXK8?=Zn(3Q#`&CP_pbRqD|K71Q3!EZYxLP&V-mp#fy^0hjAX~t`NGelPU#(%BX=rX z&KV&x89s%GkYcYfkK+(Q0~;est?=?Q>O9VxbFx08X027>pbCh%KOXup-rf^O=e@gL zuT0A~Lrnb)+8;gd^BjXleI1$4IZxDvDeb|Ee)@at-7utuArjb`p_(n{zw}wQVxC!C zZmGuJb3~8*oZMrOdk>By^c5&a?lD5TX1%?=;eNm41tn5g$9wXA!5$^mfZ)efNzFX@ID#35kqG%md=u8 z=GzTA4a1(Qdz<~a_4jg2WShvHqj22ry?UOWi7xZ|WIxw@X0&U$74h1h;kvHUdl>iM zLEJ0XJf+k%0(LF4Yp-61xfiWpOMA<9-~K9Ua}et}44-wLm2`n$2SUhP#PlBQ*X&Vt z#w=i|jaH~>`o}8q>{_ehI(tuu2=RWu;pOEDc*0RK zwr$0-uK4`??2am;ib4f06Rz8e?ec=RZ!h@EU;c(t3IFjQ{|CSP`a8Q7_8sIP#dZMT z*`4SnIP|Zrpwx^I9jH(z=J?={%Z@!idV$MLV1FL|S<2QM3tI58`qKXGx+}>Jb9!c~ zIRNT#-9|CkqEOLMK00idMMN;^+-yn#{rkUT-*;@=hReDkhKR?p_d$pXkWyN(tnwl^ zb{msiSMt=e71i;fFT@&G@R*hrj_dV;?=j&&{_%g{qQmyG!PD8i4KeildJ3X=e#Xt{ z9gq7BFE1}xudjn+oPW-Medi|a?RM*~u9Om%ZIz{cZxwM3;ECPZnON!g@$rFw`?r6?zTffR z{-6KO3w4lTZELuFe)3`Qu`~H+-+94XJiDta=W*BLz+->FJC3k&(F3J|a>4C>$FXxP z8NA2iapMRj=db{HJ^m1Y&YX&6S6_^4_e0n^{ZR@Ois)?l3B6 zY1fAR*imGozFx05&ulJ^0$EcSrEd8N)@FQkgE2Z!|HfQ zebkJ0|3q_iHsid9s~&4)m1fj~F;zqt1{bg`0QArIh7_^2D@4v+?xd~8o4St%&o7Nb zs#*MFj>RjDknaz6AxSW(s|i8Z`M`oD4`~*vB3JHDEe9U^(WyOgNt{nBq85&4DR|fe zl^NdYbHrpYZVWY1b!!nDLhA8M+FY}l%#9cmPn`ted&ABV7!z+0tWNXCOUC_vLkOIE znZZKHxSk@5n7Ej|-ELhyzNV$`Cmu9J!puzq8!e=&bK7*&3|uP`(8H2lYgv>iV$RCg zf1Ate9pmew56F8#^a(MRr{al=N*V?;pZi0a%x9xcMPeE|@_0Okfx&Sc92Fu0l}1@aYqBNU9ZN;D9wB~#(n(q%RlgVJn-^z zm1|pu*bUCoB}6$KI#Js&jZ-W{hjZhmq(KK>{2~6lkuXW~fGv-vSs~D5oE z5CSUP(4fmr1v>mbdh+MtDRAQk{uK1^P@bE&J}~L(e!pW^Y_w|#W(__{Mx}yvxeU$p z<9MJ}zMdLUdAhgJv&tb|K=XPOR?DwLcXr@jmPbl}I=I|S+kt`o<44vn?>!UCnei{v0K!CpVefB@cnPje`> zu?^Na7UMEBA7cmzB0v~uJIw)sQ2mIco<&_>4IFIUFbshiL?xvJpJX5) z#8+}oU=b3T+1Pnr+8LMU6Pp%XJSj8PG{l?ak2^1PzShthJ9{kldKTi?VJbIgNu0S% zNaXh(U8u$P$M>_84vh!IdM7V=co+HH6Pd7E?vGCVQStL`hB3F>4ex*4`npBru!IF3 z0oTjQYk6rv0ZPsYM4;%gUN(uhWw+fRc9fn6qrs(7Zv-ZrT+_$nffOQMt{YOgp!tkn ze)$ELwBld>qca8}hQy@V zOrR`6EMSqEtg`);4L0kB=!9BhpChdqJX1;?yuqh?xBwZ31|c?xxJHIV1Eod2 zcIm_p^yZ~Hb=5tuzdqpR`J~asw|4IuVgmbnK8hMl1FF9d+Aq;aN7kK;F>zCkW7$gUFRWN4ri4R<_=`g%-J8#IR2R>9 zOKIhw!;&iWd+m?XW0;wgC9ZsJG>Zs^qcqOJtx^*jG5uI6ZA?A_ybnE+!~U%zuD+L& zM=eaO<+^}}WBT)}QO`PdS#aoucbHkN(Q*6D9w6g z_^_bJS^2AIBN8(x2?4xEk@^M80;Fy2QFO;~fJ`lOyWQ|{yZ1PwN)3-=$5HZmo@n}x zo~FZ63LBYf!PQ+s4%n~)lo1@8uUwBKlE^(-ul4<-atdfH*56CqA^CIgX+;?JogdDz zjw2H~nxCp@&}tWY==u~woQ7HFaArU5Oeu76i1C;a`Z4gJCWQ)$4RHKSq4Iza#DD8& z)S+G%%m@uKszB0*r^qng=cRt~Zm5H-`C=yA@X|64d)Nie-(wSDkQI!pSh&Ymix9ty zqNRUcTJ7(gUDNeGWOZcA9>W7taJ>SDm_&@{-4g*nB@uWKx+(4}!r&}&(K^!(4t1ZK z2S#W7V?k|z_ZzSO-r@0h7!iKzqQX(&g-*`51HvljUp8@6!1Fuj+-X`0&ch3#!Fvyv z7B~V9Y9J@{BRJ_Lx?V##5Mmd_@O9gB8RHm)63)@J+;^MlAG}A09y8raL1{pXsmIFL ze#J0M_F;%nwPYWy!(xnZ+hy2OO3ee+w78QjmK^Zd4?KC{g=OYI!fsEO~X-3 z7qTZGhT*O5Q@{TDD=wD{f{2JU{;m(j+Zff;gk;})fSNV{?P>5^L!_BK82uX9JV<)T|Mg zh$#K8eoaKM8=dDFn(XyDpQJ=jWUmkczJLFY+s6lL&C(N4(_%yLY(}pDlhOTYV%NGm zMy}bHB|XKA+iRr%)c%VV&)WWg6)V^{cp}2GaU{L&wN2{CPAfDN8aucS;DNZ3I~ui4 zO|<9WbKvhMnq3{qwB}5!*V4w!>1WVr8}36@q$Lgpv);#2@|=>4y$Cm*@1hhXIcW@% z7MwoCGh(z=5VaontUbo_c}zXVFQwE?UOm20=Aquivopb+-;sX5gmj|UHrF!r-YoIO z3Z*m#(lrd{Nqug59G!qC9E}DQr3LDK6HH%0>owg!EPc<;And+l`xSGPt%_Ndl4`}L zRwy;oQ`E%F&sUT8hh&9_U&i>P7|j_@Nrpi5$p~Rhz2bp&O}(EGTpA*hl&I1L;y%EI zb4F5{L>emDP6$Z)oXx^ZOTn|BSK$_Icz2jm!!U|bNM!{jwx4Ouw)UNxBfM>`IG6+E zXH~=4ETaD^ori?@$Kv#nTr>!rOniD5sS3ORhIF&8tLXR^yuQBSkq<70MRk{A1j!Hn>#x6pegj@#U-9?ov+20`$_0v|4qJ5{L24fq9VpsO&q;IMrNlqSem)4jA+qnd?YFKb{NMlk zf8+D>6Mz5v-{HggQmLag#)zl{3ZX41lF}Xq>%ZdVu(*Ob0(u5xLHM-RV`P=$_4*rzGO8EzWwv- zy5jBa1^XU5x)83xNi(6CJmn@LsSpz0-{0}^@qw3@3llsl52lk8$iMye8~*mUzcJD} z7v%kbyD-IuYexrHIh*llK&_dhcQPTD2i_lt9CQNbx#k0PKbXK0SO~L!e&GF&Piz;y z|7lAARV1$j4IssU)-uo>wvhO6S6Q^<$>GR%gv*AsT{(}mR2=(`z z?gwOkfeP?vkfCSv9xgd#=dm}!8X_DyB=7KXf1qA2IGO{ZW}y;aH*jPS-|N%GrSW1s zbUCA6y1Qpt0Qg=|Y0%ZYzP+O5g5n)VK)8w+*n#=SA2cU^nj@Du`**L+E{`H`wa zgA3j|>n@iIUS3}Ccsx+cc-YZ*L`efM*x+s3`heWY5LFvykJ}wS#i4enwIay?rIV9P z1K19Cbzr`(8b;oVXEuYn$Fg{u z9EqOm!4L-l+2wM1YBJg)xW^SKCCJ1kSiGbixNDu#T7zqKc=q)FA;iJ4>OG_`s<>XS zLtQe6#w0hsR*w*6p*I73jy*jO0 zG^S;Yz%mVxpkkEs_s!x3+vvI7ZYMn>>lki}Ow~1XCb8(}u5}`wO_5{%PtdT|nWE1YlZ$+>b=Gz5>2a z^p)G#4hCk&((LFt2|Mj6`ounu9OH%G7i zY)-drJn0&0g|V}+#^Sr}b(xz7_S*B=#Sd<4OG>lXSYst-=cjFCvzQ8BX1%NU#JY>M zF5~9>D3F>R)pJhvd}gyX);Q2VoA0)H;{1fZp0K{X(LOn>Eww{QTzY^1`OkmiesGk@ zel$EjZ}{b(|HSXV{*C~L*Xs-3US4@H``B^cA2{v@0=W4WW5Sje#1Kux#do6VaU57u zLX^ESYh%heeh*v4b$OMDSps4MYC}i?&NQeaP;RoW~M?hKg5D_)gydWF%Mda6oGr{(41O18ybbkNX`hMqIwVB1f({v&1$< z?{G;A)|jw_h)-tYOpZ3A!qe|Fu|ILJS9Alv`8 zv|$^Ur~C35k;gx4a?hx1`?J`XJFVwz9D38=tMNekw+dcV^rE%c9R2iXQBZbhFVACl zXlc9@(b%h#`j*eEWe`I*Gen%7r?Ug`YYK>v2TJMZD@#t8BQtcMNE6A@Cl!;KWzUSp225;WATwqMxS zZi(Hq&S8xovJ@wKF0@0OuNlJ(_~`d1^y zPoex6PwKtII><1+6b$uM%t^?Hk510jL19W9V{RjySE&;_fwR$*%UMM)y06WM`k6ed zU)vIMs7Z}e^YFY{0m4jX(m|#jYR9mglwK=VorJ^sEFQT&(OYz1w`Y1wa_mtbA#||= z+!$x;V)#1#!NeT(n7>+kGz^2e&vi~~Q%nA_!UVfsD{*=_k7^7`t555>U7Io0wf%b) z`jYmd*I4Vs^DMobwS!rI?HZ=snm&;{{K33D5 z734+}A6-g8IkG$}X`m~d@$8|C!bVZJ(0`=CSZW)3X;JQBuiK>mkWxZv71+^*0sXub zJX~{q-L$4noq^f2@$Gg)@K@=l_`&(Fgj0RSP{-LzKi`{LnTPb_JFjc^QOmFoTEU+s z6xn@MjpgS%@0mGTv z5*xv2&))WY-}hOJ#t>b%^uDSH)$SLz2lo|)Ztf!tbQ>rs&G-7-K1UkY)7KWS^8=v) zQXAI8bG=MmuJ=ssgjSaw~W`>OLEZ|fgRhaAYY z)Q0_C>ow3bwT;({(-5f7kUfLzv(Wb|L;joNw`ZZE{=Sq_-+ygCV~*ajBsx3yu-7T2 z*z0bcn-6o|fd+rlB0c%x>z(gk8sih=xUO~Kn>)o=R>)@GL0v<69eR$+voirJz_5Z2 z?WLSzB-iVC8~JEWX>)ReCArV<-V<^23scwpv)XyN_KEG+QgOPTFTaYP?9@&?6GOGG z)qThs>}K-5{ zB(h-|44Val&dB;IxZ}y%bA^ZPMyOUwPoa5@$K6; zG%C2?@A&ri1Hq>*o~gBBZy61(H+nnCrO|+PwfIO6-|_22+#I-EHl$SXxbtTH*T4QG z3t2{!LRpJ|2a>@q?yLCQeMa%&ao3`^$}rNnOu_DDdZXpXmWYrxHYUBKcByU{=pGy zd%^X3#mmbJLU1_p1FoG5s*fDK1kb`LPoX~p?Ch#o!-+I|JPx>U7HYh>O6FoC)W(9N zzy9+>f+KilHVc)cA_j*PBu0xWKujfJ2SLDkS>Z!KJ`UXOcjU^bXYYXK zm=;26Xe0tEixYwfd4PtT_wI;NXD^ExPF!P?<8b4Ew7zdNLt0QOmlmOCq}>W~WBkPu z;)#!}4UhfNvr(-WL7hF7ct8tN2w8^_%b?s-LqzYPllW#rJu^dv`mo<0>@4&iPQLG$ zzfD~%(~AW#ImwyA`zy4k7Bx(_Dk#nm7*>0*(Z=2ET(c22bKH@-KvZ<2P67Q|z1TMg zReOLt^MD0;sO~$>oGlg2D8AKIV267wA~-+K^?E%E-T=wJKE;7C#x6Qw*U%1sNKu^} zyk8~CM<`P*<2Z^L#2c)uG&(F5ga3~5&oCT{m%x-8Oi=_~93_nqMS#N#NeC6!>&D{I z>qVOK?ELY>>mur@?p~H<5JS!laaFG^ifGI`?w_CMz&o*8zt^I*^7SZ!I*#MPAbN)s z#zWjZ>>rC}dMc{>0edLC(ZwlelZg8Bn)50CZji`7?*&<{1Fa&lsk=1ROIPBb?@WIB zc?LHD2;>MM1swMS`~8Nuw>Ka-gyi9izJpb6ts4#^S_jX$v|r)%E%i*-G!?!)Zg+VG zmwxEg2Bk)_u~V-O5q8|X#ej{q>)g7gVTk2D#E~Q@&nd=+91Zn$TtaUa>iy3-gPJ}M zQYRYGAd8|}$I-K+(c^M?0V>mVnrj1Tj){LN-ZAT;XF--D@VY8%(COAV*DbQoW)oso z%}-4xD>i4RWkD;o3ypQiz)PF++9YVyggBtC!7?NXFWVq8SL8GMJ+9#@kb%_cw7~=>Y1`r!@Ng64nX6DCTErU#1t3K!!Ot8<7_5j z{6DWnZV=hnCYGfDal6ZZfw^`)vs;qU2TDWU3)jSj(CSIVc^n6esrG~EO^7&-f{%|6 z{Px>#czyc`KfeD3DJA^=@s4sFI3675aamTx#)9e?0t;-Emf`|@S?SSRVSEC`qzrjUm9*~lD+IBtleIzN}Z zXVTY${XCA)RTeJdPyaH`MMhB)dwg~MAd?Yg1qQOtp`GqtTGNAY?ihQ;(+6pNUOGZrGHNdel$3pbp>_0q^@Hc1J+irq6{%xWh)?t!yIqFfz;I6Syl3af-q!-AvY{J1_zV|&ZL)3K6KREeCgXF?qDT>{68Bv{K0d@C zAI_dBny|}wCN+pyy&D8Wdnu?Oyin_uFb_fu(uo#&r3s`1xBWe?4@F?64U-T7hzsFLgnAArT39NSNmBwK6`lJaQ zWTmOj5d zs#4c$qob_6TJjljj`SWVCeMbl@%PtG@*(fK@p%@R+t|0EUWTl>W}O-dH|?oT`6|xw zD}h6pj9m8m1<09i5^v7$k!w~Y)1Iz{u7R!8;pYn?xKqRQs?Iq803ZNKL_t(WNO73? z+n?7)5_#>*n0sO87k1D8D#qxfHD8e8I>dF)LfYYah$v@%r>yw@D^n3UxwEE6rPtjW zDChd3uQgwv;Utnh38=O8*taiHbQQSh^1 zW;S$LA*2;+ojo+y-+fC2=Chh1x4gc-azxKV8hqX(g@BZ#3GWinf)T+SXbsqp1EmPY z)p53RKA5->*99p?e1Cg`lPouK05y8LK#CC@@_dCp;{ven3CrWrn|)fu+6L*YO4H1{ z6yi`U+rffWJoZDnDsIpQ*R*Z$*@e;K#?Q@Oib~@69s6LP3hD*#@9*7p9D)!DjsrN* zvlL^DJjn2@uzmmh#Ov!T-amfF|M(yO125ONrx%Kddi;YnQ9zB0E%~{1VLM-5>cgcu zCoV+Si?aUGO-Lmztn>xf<~kDa{{C*9A6)p^H~~v=0DQl%MATz7G)_e09)?_B0Hx&q z@@?COB*OslKn}mY?(UZ1X{|h^+D=u1N+b-i)%K!uP$?>x|T z9ti>EQQ+2!;G;CSD}qF+MtPQ_^KdC3Ab?6mE(MFYGV75U-~GtFq3as)QPFb*NiT43 zca+lb`uYtqE?uydUramAki7~BJ7;Q+uK_g1f~>0j-AFn23*$#O%7LkE=bFU z*Xs+m>jlg9iue1DUw^&f{dU9akDsuAuJB7j^SV$MwCdoOg@@EB@u59%d{B2yqy>>0 z9ys7yLtH{95!`RL0XxRT9w$_*vzez31Vy18$HB2lrqC^=^oSC#PJ!dV^?K!^q7A7z*KSPxMvu9u4p0fG8B@W>g< z<$^^B9SuOP4IiJMs35GD4JkxKu*2MeX;0BPzz1y0+7INs{sK!}xsW0e6|jY=J0+b_ zrB-Svm4FZt91pQ#41kD#DzRe$liOX3#6d|<;xaahYsK=P(O%qTe|>$$vaI4ZDMRz& z@pyD$<4j}F1C(`^+NRBnN3=Pb4fX4cRrwmK?rkLx1)(k2XJ`3Wt`cp|dgnnQ!28;p z2ets~4R<;}hduCFC9pQyQc7^1hJmIM+-yNK=ki*t@o{9%qBaLnC0V%WdQ8|^Xr)0t zZ}-hLE$}h)du)r$ejfyVI7B*#laqPu> zzta`83iZuCTb8u4ENdT}F3ZAAq^S_@QA^y>@6FodIC>PAa}F<;3u<>$3Vyo)mp6_k z`~CM{MbzQD2zx|aqLT%<33cLW?H+D3aaDZcjo2hcrpeh{^CgC-Jk{AvGgIsA;cj*b z&TdUhM^LfvJWQ||-nO}M(!FfP_Zfxscs%-Zu`CNC_CbBG(U?GeMsm*h`1ruv+uPtW zvhS-t%PNYQhwge$=Dg$?udHj4Qqex&Kct3>W?+@NphoXs!`ZmEE>Q2|K>gAG|Lxmr zU!OFZ&Y2ut6_R!L5{(DDMAD4%X%Nj+)S&@3AJ}dEu5ljSQRiHb7t){0!wrr{eRoq@ zpRk|0FYxt^gL`ZjmrWNn_-6vzoLSD#a~*0OpTybX$Nc4);-mHSOf#5=yRD8Cm9zOh zey(cBH*-7)yJLBscSa0pn;ip6It129_W=t%IpyrnJd=6sdTpCEvv70%b?Z`_T{rd` z+J>GbR@kpqYn$AJC#9m4f)>-4q&I!PoEf;=D3C$yX9l+CuQ?es_#SJb^aQ&G>OIW) z7-&K^x?{kl8v(Eq5Ukk-D8qHN_iAjmg`sg~Yb#s(%+58tr=PJo`1+YOPPEw#2$SJH zMDg?{Q|jiS+0i+R9$1{_`#KY2#ARjS=>2}j7OmCDyQ1Sumw&CT%!tKBO_=dmy_z9QG1$p0l zWT;+~ecy3ewv=wluUcm{i9#a5;MWFOQjvUsuMNq0P)K}cO%W6l%1ZeD zlCk~xj`a4%gwk43WoRGa(87v!N!U`tTU_yxR#X}8<7lY4pk~>>C1#an6b-=rj$B}OcjBN-t>uA>$lCE@BFD9E5z#Ms3Hp*0-!fXfvgO+-2Y%@8N~Z$C5#?I7dH zMQg=MiI0f80RSTwg?pJ&9h{=4?OoO8Vvw7n6nu`QuWoAu5qnWjFOzyKC=>7TQ8 zzY;oUny`{k2ceMm%e0VH)scP<8|Cz8WSajQwMG#9olc|slm5GYeRFTvn6je55A~V- z%bs!c+->iH6+J7tq?2&Wb+iMp5YB-+H|trXw-W}D&PfY$BmGYr{~D*!?^knO5I95( z){Gdv2xX$wLs8bp^VyiAt?XWBpXX{wj6>WB!j~i^HOdjjI@~@xeEyL^a^{*(g?iS2 zXV+ru=pO4?As3t2lQ|}6*n4^n5JgNV?_!g>)SqO$A|xUv1s*sKCPXtKb{+N|OO#R5 zpAOt-ahr`14Mv2lv6l0YW{hHO{XMk?$ay$mBXegOKuT#KiRivoYeh7JJiE7^_h0(w zK27dNj^V&V#ia@jvp=XAfMi4?8zV3M){L{J24ls1EIzPvxKc_!wqD+{izNT85 z-&`NtC<~2&BqI2A92Qv8rIA9B?&DU*Svk#zN*c+FXsk9j}=Zh>4|{G{)8IAIHF~Y zvCyAa_d%^i)l@x4rku}o>*GDUPRv76oliu$PuK0*4Jz|s+}@}DzR*Yxax}(eb@7`B z{A_K&gdIL}Ue^uL`GNj34}?{Kct{ktzUwNeSl6}JH~lOo0=IS9M$+mu?6=e_H4)TW zyJ$y6N%Q?zW4rAuvPmfqy)t{2*7uX^tdYP?^3Q$WalhaD&via~P0Ek+z7*33@*)N+ zBDPTD%W)iN5TldO3}J@xR@~5kt)BPF%RaAU6D63PXC@j(^2tjMg`&C}cdBDFN&3ySg!onA$`#37wR}!nrn({1!7W z)X${Pa__xN6cRFK6s<$gJz09$ReLJoNra%pdhb1=S%=uXE%(TcdmtRs^zHhl&;NV| zm<>qw{j&XWOFOa8f;E}iUW1Ea*wg1;)>pK-zK0J{H8k{0dEG2sd}Gh)x#g!`>D*Ht z#J`5}p{Xz@W%G=jbW@zV{XH|SY^Y03-(uKfOr2xDe!utB2BM69A6<9)nk*zXOO3YV z7yGPy6*FmPLu%Ty@0vc}cF(bbU7Cb4Hqy!VhwR!gQ(0_Hu4h#{m!J1V``&`a8cP4X z?WuodOe-P;?`LC&VaC||K8A!n2$u;%KXxXdTO*mhHiO{K%rz|Gi03qTB0SFT>{lii zD@YtnasA()Yo9Kvu{W48!Y59PDq-6qDiLC30RT~jYg|m1#w3B{(o7R=11E}?k$wly^)t~~oz}ZE`>hSULf#Y~Es`Gy94p+spT4#g~HoBXX z)NvF9L3kcc)M?%^w&s9d#esBUqM58QyWlOEMp2=Bcq;%xcQ31Bu#0N07m#Bj50!@G z5{r(cu<2^w7&!aSIb2>?!Rs#<#QPn8`|E$fQ8IEZSk%4k2_ZVPd=C58Wf81YMHLJj z)rQ-CLv2+=Rk=H5^*~^SGW&yFkKf)Y*y{m!muat-U6BnD^4$Hzw>4e!xdA$W|Bd zsDxIT1QT3D3_t|uS{4x-rRxUQfdBZ<{}*}RasBykxE}?V;6aarUGn<_Z*MR7zFzS8 z_{4r>wDMpVj(14whPP!y1mSV}fS3MMN((=8jX(3|BOdL5s|}0y*dGUq6lll|&5`7+ zqB{amDi@ne;0>%al>I<06_FgmvT#h0kGNbnY>79}?XMTSU0%_u$G30aaQXgS?3p{@ z*x{o}b1zO$&SfUVxL{eU2u=92#I)k=+YhAsCzdT?&j)fo7nBKX6$ta4(rD0ZU?{N?K98!_g|X%Lc!2UTSWYMF!q+_Nx4xt7q}VvYx_) zx-5chZ}7&2#(*GR=bT%x7r~sCjNAQ&EKTn-o1D7P&f>>%t7!KdTnvcLBW*mGJ{~)6 zw+Aak8`C9@#{(&Hrn5K7>ktEiY$QvJ_`KiIN{6LCoh>jqZ~Tn&h#4o^P7M=u9jA=UWPbrd`|*K1)~ zM9CSh)xO^GHHwmhesI36sLU$}%bGwgu**-HHO&DfQ-78LJ zX;c&sCyJ~^5ite?^8GM)>^qL*!0YR4-~2UFr?n!agR^MWy(Z@j--k!s7|8qC1dfr3 zDAl-7wU7W+w3<9~sRFu_(H(0EasNL4_AjWzIfsw9rn_>{j1MYf9=Go&~)YE&?hjO)?W+SjS1pT!JM^u6r@lg5N750bb- z&J}+=m>je$3#c+Wd|OwvT2E}SklqxtYMVH-DqQz7FLWr*rp{tpibT+Ne#e4R|g{hggv*1BBdtGSkPIaZw1jrOi`oO(1`aEts^aZ*T&H}N4*}@ zgU-WTqs3sI?fQHoam&~QsRumyUdw9yWNqyHqs9YxJviyXVci4`?&8qUI!Qrp&n;_qiS-ZG4nA7Hcj&8jI^J{ydk@A?rm^lnyAIf4#~cBr z_qvn{CoV$Ul-6NUj2PZSKMmvO2H?}Lkw;fIV2nPjwW8$K*B~_wutWS{;%L8ir^A>B z6M}@N$Z^hqkQQp6hjTPi8H6mhk)ZK3dR85rkaJ{(?9VaQr@^CbG^z7D1UC&<$+$jg z8US+CvKJ8xlX6=JUjQ646mVX9yvs$bwLabH@d+`Uc=~7L9Mcb zlF}L30f#LHysTGTLx6i^1O^eIf{<&$eSctWgdoC4PYywbLcTEp$hC&hfJ{tbvo3ii zZKXcc)(A`6y!~p}p<+8CLZR~1V7KuLb0oF?`z*Av4SC*M%ZVm8>!E$;tl);a7*z%3 z)Xf}3t=BT@us<92OvuT(_Wi;R;D#8D!i3e6@+^Nh0)iXGHUpLB3lR4>A~r6NwE*#j{wW+*#G?l=%yEx25gn99OnGIUzsI4=}9FXsYC-1H(; z5KOU(qifS5(sh`^zs6M8E<(*GwdFXD9>1gYQ3WA*_td=B=PL#lCZEDs9i}lss@Gs8 zbHr1MeK6MPLlX(og@7eVGrSTS6-4h*)iHe>pilt>5HVT$uYdik3@$MYWX{O8h?G`& z^qCTi_C;)mHs!rXB|?}6V*QK|f#$&UZFP>fhSsP@|5#CkjTIeem*!RSAuzGSK3|0f z0d;OXcnyn)_WR(9pL+yDI_<+S5Ar}IVxc85DL8=7h#gytZd6HS_ zPtpCe;C2vZ$fc;%&_wLYpkjwcz)_|s3XFrtV%Fwnob_`&j9q`{L7DAAlhj$kr#{S5 zQS{|<6=7U?isV|BP2Sl*rB0-Pz!W<( zh|_nj7B-1Sb@!Ks+D>veM;S_=E&6U+1qjYlkL<8(k$tw6R5OrE83I zTUHbiJU$)|7H#Xk_5V@!w#{+m$d=~8TSR1%lvGvSvv+Lw?*IQ;WAo|Sba$ylGBYCr zfMY+nJHipk9@{CivTms)k{K_6!~LA+)QVOPacHcBb=&*%*T8-LApONm0M-2%J_;}B zGA$!P>m(XFo^PIKd8L_<)0@V6e(z+(LrCYaEE96x_-oqXq&xPQQVYtq zi1)t`nR`YuibE?Jbx?5HK<_3a zj!<)jJ=b{1tnDO5=mLgQEPL;lg{h0R&%IZ>*4XH$Gr8$_e?4k#z5i5+c+PktG24C} z%zAG7cUHh{&r*G#5pg5+uU`i;(K+7Q3ejzRD*4dQ^UB%$Dw^>urfuY&%#Jqp%nGTW zW*LS8WNU@tT^V95FhoFEBIyuI*ckBQ96+@UT2a4j%}Y>1c4Y$Bvj1Qk<}D1@G_g9VzJ>P^sef;K-UEzyF40aE8-#!It-4JOsxV ztr}&x9aPk&&ighDPo^mjMOUr0Z@Qz>lTJ$SBP)5xuh)aRS*UkGLR%%9Hcj>AQFZ8a zSq}A>i^y3H*Nq0We&0N5?Zvk$jC&M=DYW|UwT5uL;!PH$F7SDb2vvIsQP++RH`NK8 zQo@=acsw4Mmbp8aZIp&8`uiaU70yMxyu9G?c;J4&57%G6hkl=0D?UFz`;g=9?XA;k zYzFfg4>r0a`Fd(@s5XN1;eR|HXlBSgIEsu~Fy{;ybbSZ`zMZk*M}wUY@6_Yac;HI6`vQl=TTQ9Jlz=b+sED3jMOoshu0MVN z%M7e5qC}sSQt|nD?_C5tNXwP+$IHtV)0E((*;saN>dfq%qgHnkF+E>YFMQ)YxBdqo8YoM70;#c zTKeaof8xiFA1H!Q&pG!95k)iBS`SpO3{*e&6)%hA2j?Ag&OoVMK(p^V8bZe#Ml(2S}8|>njtGG)n6~{^LJ7QDL4h@^>8~@nOr)T$rke$HSp+J3fE@;`M5|3hAfx z{N@lN0z4{M?4*Ttk~lz6)A^%NhdBPC>7L>o=4lpT2RpibWFeLd9+1r3E%QK2<1!l6 z0b6LB8l?~y8PX8&Mx^)l_SO;nKY#v2FpUlCWZSlFa6PGbRS!eGsC9?yM)zJFU@pso zIZXrVU5ikST2aDBR|cERTRs#_gX<;w=SYvUTVjmO;5a%h##H#2vo!IGI(_Oew2UE` z!DH$BiC#xWpciT2i{M1!EEtpQhM{!`WAWO2L#xLSa6~k^e$doCO{ryP?0z3=NOL?I zG&wgP4qRp{)HB2Nb5#*443S^*zVmf%#(jl;@Vzc9=zahACBmpf4L?m2kc-qnaX1v6 z3usHGI6Ku8-+8~^5kkVt%ZmsSl4(H5HB)krIaD1ndLGmA%A&3`;m403*!IWJc*&H9 z>*)LuDaqu)-0MeM^lNQp-98}%q-l&V=$Y-NImiN?4qH zqMwNH`T02rRn~PKFzA=d9EBPXwGO?`^@tHpL-_#Fff!oPDL>d zb*vM!)W6Q3h!+?fL+JOPdXvjG|Ev&-NlxvF=JVA%W<>=2ck7eb-wFWibvieW&jN(MA)Atl}bjHW(`)$uWN7F(aoN^YlpWp7GrTD>_ z4d~g;W81c4UzPXayceD0;07`VvEabcFI3>8Xk(?2hQRMtCmQ-=tvm*T?BG|Yw61OA z^F2Cat$@{vw(@&CIAN1Ldb>RsmtYpN)8{lJMQ;&i0#s^>s##N+yF0YM-X&53zi$)AUF#lU?*nihC}><$ z0A-GD@#NqtA+&}pcy=Zk2b_Ch{N7+_0RKBQ`QfB&gCN%-41f1bq_DNgSx9$&FV0Rs zyUtrDr^R0Dx=_k4@4u|?5-X_dMQMjPS^HV`eGf)N$%GU?^s#zF*wSeJcT}4HzyD}H zoCc$5t#K0TedXdGoUvx$(Y`>P+lIg0cX}OV?#Fq*vVXrL$dw@EB3@r#QFD1RO{mD} z@p!Pf&Wbc!8ETDrNl2+;nYllwf@c-~Q5Q~X4eXvsj#dn5YYkg_pV#YS|87Hskk;%y zW)h=7*4CC9dl_N?k`8gu-!Xfx=`MVqhVx7CPI??uC%#(ut!--C`cI>unnq6e(Ty5H zz|?$rvHN+DE@4Kv>d)rM{hoxo7gG z{j9de(R*(9*5mWmr&@G~k2*yQ=wSaio4bBJRJ`gWTE*7O*1*8mJPq$smj)?0-94W- zzKXY~Qr~KQ)G9rZd2Rg`JO*NVH^b@B#Ji{AOh5C=S;6*Y`uX4aVfgr552s;`x922F zNW_V3XlccE-?9-#TK_&Ck6t5K(WU)!+CQvR`_N6#>1Q*G(l?%{?q=;EL$KGFXMz`CxT(BEm} z=6q@iwod&Fi{q6BU5s{7UNgak1f{UROf6iwX+w}hb*XKTpt*=4| zeFodbSLHC;@voovIU9Rt`(2t2a2Ck$S|>4c6@w|q_Pz$v`-zf&rrB81jopvFqL5HO zJ76HP+1`b|E1)*a59~D?2|>rtY|nthOxaR~WNy?6+^4gijo-61fH!-cjhVH3i;eBI zMmD>b+7uf5^cH zmGXR+v3+0N!_Fk1;XN_LHCykEXCDj{rn3R={Oi~kC-~loc|0Dt#%n*Yy}Vqo-XG$! zmCd(hEXx&JF4)#jCPFxeU=iWo^@g2(pqw*ODVXOACO4VE)D9rR2Uc;zIrzX$i5MfI z(@msy2Tn=}mlqb5toO%oNIWZ%WAva_;mCE&q~hO8DWD3(2)KzCjw92Vv)->)j;=~c zH&MBf&C4OBGBIP8VNV4J1x<#9@3&9<@y8#B1IoL8@K%SIsu#DC&4J$oF2K(djCBzA z`yJQm2i$T&U01|7b@G8Nuu_Wf{wVhKL7&q!6y{T$P;>3{iX=o4TTqw6+4A1s@weZ9 z@5FPt z{cnH6OG>!?^%EgDqz2Hsfv_9A28dr4sVCBhLJ5(IeBQ9H zE5f&LOfY(^sKo&|?z@W~^PDhWrv6S8iNu&64;DgD1AG9M1ukG)GX$K=dH;s8r#IDFCP$^AwTbaa}H$A`4;W6p&(otDH62;NYf&6dcyd`Mohj zzy%ZnCg(wpn*bb(M~Ld8_YS#7m+(8E<|v1_$j@8k!X!--e*OBz1^@kyZ$I8piLlp# z`?lix_SzekJ>sWuELoZ-{Ntbh!uwyp@Sp$r|KK_=c6!h(tDw4Pbm`&CY(Ri>RgFrNxIG?SAgYHO0Q~%k z$m?>s^x}t`-0ZNi1wk;v0z2gK;GxT9kzsvn*d7m*eFv2Sr-u?pLcd^qe-jak=E1@} z4{_B=>7-E4`!2MxbTmR_Uyn|TMvc*nq3?gKHOy1g(ARNz0AMer3xG6hnkiNRO@@9> z8Y4{(u|e*o&91hM5q4xTk;{9JOe6W4j9Pi6O{5aC!{SJx1t{l=|b4H71x)GkT}{fd_?oZ0ql&7 zZqisR`)2UqWQhEVDNXEXqqR2&&o4Ael)v+oBSsV}lL zJ+qK&USD6k<52~?L5N#QPjQi*oEA?Rz%?E7~N=t<%Q zSwy6VQg+=j0qGnK7ebKut!JdNimV!HcX09h+fd|dTAVUJ6TT1mT+;^K;d*n8odQ9` zXbuj|t6Rzq@l7g}(T1x=vGoHX+*53h_a6Jc%GU_e48W7aam>D^PAqJ#!3AJilF%)4 z7a?@4eRMrer^#@NiA5R%CPVKg4G21#AQlZ80*gH-8NztiP-}q?X=r|foSD-}uDTJS zRLT-L7>8!16%Ty1o)VSe&lhQ0sH5E;&g{XOvI;X*e3Lm^DNKVC#Kze2LAmxuWGTB4 zx%`vk$9otQIzNX*rISs1qpOT@x@Y{fl4?pjggG{vz#eY7Nq`~FvpZ-`&DwKA$kzGe zAW$0@x{t`;GnidFG>uV*e62SD&ufGJJxi(~YVyv@7I11R+QyU}f~Z?q&pkjA!KueI z1?VjZ72Wk>hxNJ-9k}!3eyRwN31(RcThs--M1*ZC{rs-YT8#k!Y=b2t#_4I89}oZs zq~wRDERMy<^g|V8d)Gj& z!8>+l6A^p}n5KkEo{5Nk5Rhbzjs5+dV#1UnrWktTQPJ%ot>Q!q5}U+Vr&v;wBwl6TDTr6 zbsq*Ex@K&f>6J8TzIzWs;WJk_+}nIW>z3^=s5D>EYP2x*&+$)+r4^bJLJ;z-ct8a* z6T-0$cj5*eXR=Y87oH;b*qO^*$0ox%rSmo+1L}I>BvP0MP(t=}9#w0nmf)jDxVY{j zS0lkV02oEyC6}Rw^??PGR3$dpMW)m>rU`lQxwKZ|=*h;kd{1QfXrWNMM%BVyF31HwF;NWIj0-*uj6Olj$EYygNMF{MVuHpU6A z@6+S)VD6?4|J_ly=&(bFirVYYSWu$&G=xwxg7ZRTHiHALTT`0)`Z!HfkNa@J%f6bA zNDZk6HX+oel;BK^lWtKDr%V zu?Z>-f&eSnIY+VCn1!?8u(mSNr%Y_D&IS1U;^|qoeF+uS==u723mGYx@9*!j_RAo1 zI0M8kp0@E{R6puC{JkTcH?J&n4tXf?Tz=vlKU*uKDXNY$VLpK;(EcPJ~Ck)hzSqX$% zONyx_qG6Z4SI;G1iK5TO1voyRpoL+rKKEhHB5yJjb)A7&A)1Q7tf9sB36J`4jKPhv zW~h1K*wbbai-y5Oa)>|mv(gad>wzvXwPsWOx0}~J29qkA{CFmCHVirEP>a-aGSfR7 zF?`}@ev){x5W^rAcHXnG&@s7!NX%7KnS`f3u7L5Z8vIDKfO|40eI*7xk_sFeRqQ1L z!86?}^6blbCgrqTJAuCM%k32RO?oscmvuv@85P$uZ?&zP3@@02XRDzlV@$9JUJ%%aB>~5GghE; zd_Q{XLwyywrDPymKiRtOd_EimC?>8dI^Rt|0S--wRw|%UGLzQm=lVj$v;%eJ6x(Kv zaA#7D?dK09VRQZUYbwA*>v5iGyWzyffRHiroBI!Js>dLdHs{qZ1cZlKfcg5C@_II< zSfSPsWoTj;ttqnKm&(rynbzDprA*9K*FDTQNz zP8sR!96OYp%d)^HcGAX4ai@N8(CYYFDJq^Ne|(<@w8fV4{n0cO9RwP=gIm+1{fqHU;T zpaOY&plmxM>;*Zt-Pm3FZMnj~?ug0b$LkAjzuqy$1XLananw#jD}=w^H+=i{ijepq zK3x+~2^Ea*tF<8tnE=#4nRqZ(7{%(SAxb0QkvUo|G$zbM7vZU3UKY68;0ZijZ-B23 zv}aJMNSA=n8t#t`zka^sIxm=i`;MA3*4rJ+W$y3O)6CT)h z;vQWi%pn4`z*7U|g5Ux;6~S?SDpmN}z@T@JI7g(k04X5X9l17qu8i^f_WczvFBg2? z9*lrDhq&c>8Jug^>lJr#tm%93+i$<=_VJWDAEQ$krE{rxDV^aILc-%x7h z!cZw(-eF1!O@ur>8&^a%)@idW3nq>1qr{PIvc}db1G~&ZOH{^%Q{|su*Ba*>W&kM! z{O!kY*viKAn#SJ4R=JS%oY897&83 zvrnS)AZmEITu_MMV?u~W9(E8%Y>{}DDb7+1JBdAP1DS%*kn@HZd3{$Wj=I~FQos)9 zj0QhsK3by0pvE>Xr$ZgiIx^Rep=>jUBPVEo=bQAekD{AnKB{rZhE znh|br^I;zLUGD{X95rkB*-6%Oqm63Wd(Q`%EU|qK0}jw0`gnhfqf)yV>|+??J-p*c zBHMVgs76~5x7P6T@*)vT6&rCesKk{b>xXZQ@b(xT%=Ui97!lkdyx?_-hQ`#{1$4wr z6;W63{bx-nAqIzK8P|+`-$51Piey*%JTJpOr-KA1q`WAkL3Oe3h1ZNYEx24RSevM| z!|`)2%Yx>>F>fYIS~Jt_p|THzFb;SuE|r_`$B^fCyP-%8#e;#`g)Y|BYnwhQF0lo< zC1mI@`aG<*+3r>_V84$g;~a;tIMg3{V4UaFGo@0<9H&oBOo4q$WGd&IRND%Gl@w&NOp z<#^@yolfK(*Uy7pT%0qi88Yj2UnJUQ#J7%=342(#>j9ty8x|jVv&Pu#f8<~Dno)fn zhPd`!)`2C9j|piC!?R%5?c+V7C)c=Lt7@elS4c#--yed#4qf1?*lOzvQ}So6higks zHhitaKnSw~IO|lbm7WAJ!~X(Cs6Z2aYz0>s>VspT69z$Sr+}DfzjNeN z-Ya%p>l@d5(-hER0JR;htxUyy+;RJSpf=z#FK{v7l3wLAR8S_4b!ZI%2_Rz8Go$ZN zY5_T560wXAfd%cg0NJDE6+U{TDRS(ad6sJ}m|hl4iP6TbRiPBFSe6-+5IV_A^RqS~ z)?jebd(-sPdUjgogQn*XN-v=qhgQL!H^KWm1OhxYcp^~E@M%I65rcOD@JR$#BC0{e z>?0dU$|2yUonye0$)N8h7pdb@h?rx-zGvJ%K7o?qU*9l!kB}-Z(~R2qXI%4!&>U_J z2z$j;2@^a50l^1u4$FJEqzOs(75z7cS;(}>L^8Uk=hMc&ouf1?p@Ky!T$@@axYh?p zJYgEvY}`iSma6RuGTn8PLXB{q{*CiEkyJvLF zD4r4g_jAP47a|*tjbfF&A}jdUR;W|!Qv?*#jYhYpb$0US#PIv)hy|u81n##O@d?_v zub)XTO4jjxy*;Q8Dh%QNU=-qu8|$ofbZeGOcz^#u$-wLDD=t#k^aeUnr+EWR0=5*A zGu_f+)$Q>6Ow8pt8FceNKeJYSFWS?2&N|``Y`r_Vv|AS}^q_?QrX)tTQ-nMOBP;1sEWjFd2(_Py~O+8RK)^z+4;;x-8T&EVOdPqp90#N?wd z%kO_1)=(uMc1nQEPXOO*8SPiInb-}2#?ttH=UTe4xm7|EW1EjhZy~0LSgS;7ALMl% zfS;dhU1N2oVu!%z=n~tr`znI+xWBDOZN=z8B7V|nRsHjJc>UEmNY^Pk#ldwFnhISS z@bdD4<`1zP_a9|n6|;Y*2G3Kc->mB@Gr>3voB_bAm^2q`e(SUvtzuMA5)Cy@$(E%Q zBo!r{sIy1EGCY|H?D_nt#oRDF*Rz`y)YyoeA>w8*$AvFzyh2Buo2?OTZL9m}BA|j& zMKEp7U%LNfb<&L-nTM?z4?*?{lij&k}f)CSxgGc5e;Abt2=LHfQU$bEMTks}k`QnfmA}0Z$D44((g% zeUP)z`b?S3Ldmzk?;OY7Y7)zkHgh7(ok?-${>iz1Jx2n%0bUY^XD@^}5(j&1q5SvS zhChF%u~z|%oFmNao?^|?-BjuPlTfGAf?@<54g1`gHacK z@G0Qik2k!&eaD_FYT2=`8`j$$n+$awxUu_qJj@`44|}iQ-mvdG?ur}?5%V;|g$UPJ zP@u6=rB=?ocO%Nw1BEWk;GXXte@bP@CujoBgIu>RKTiUg%1(V33f_9DtW)>5(!; z=r?Cn@#S)1H>PYR^Bq|GZ$J-v*vroZ4d%RK`w&D zb`1p;R121A#=Kn7N;@LKJU2Swxlu>Cpmj%K?ijK;B?Ra2a=Bnm38iJ!?T(fS-p|~0 ztpq9swKcq4u6Vu9D0K&InH#IuS4QKBV$?TQ#}+uW(hwpLTR__hfjolaxTa7K6e1j9 zy{{nW;L+e?KnxQLrgBBwGIHg?J*@>F+YR4dUJ<7SR5D^?M`i`!qsKK}P_e^P!@lkK z^Pm61`_Ff@@89wJw>SKF`_W^vJRC051&_~+&-WW1w+H6S6|b*XzJ`s}ww^pfjEE^> znwGxSXwD^C1?Ge)1j!yda9dLm&tLae7hY;8; zT8LdNDZ;-8?0G|+0$yL46jn34Y+hgAWC%*45|u-m2+qey&7ltx7}0!v&x@!nQqlpk7?3TSaf2%dH@n z4b)h?*5JEp-xl2V0L<4bh~tuQofnSJ5s^%c2~7@;!6!Hbyu2uidN<9PCPnOVF!g%S zBfvG+BdwwjXdxoZz6*FXQc(q=z3_zm_mt%G2EYf94+xGU3aFJ{=+z>mspgO**Bw)2 zBAt(Y$enA&R(L0X4{kt%i=x`I&irz>qrJy>AdI(&v zpdF6L6nW1}(=ia$_mbsR>b#z{a9Cha$5~hB@j^1&)wz!^DfT~}A znxYhDOBcX$-nPTr%M0e|f)IQcbKLJM;>==6*Ba`ck$gnm1sS^UNS6zu4|sWbL9Mwr zQb-!`d0R~l!p)J85_~C~aSXtBr?MV0WH2NdytNce{t$Nb#xaC2A)4T(8R$;PUsY~L z2v}rDbGcj)=Li&_ij%H802;cO!`45#wgkthWX;2V%Dt^LI3;+^EHa#2drZQ=YdADV z2q}V4k!8R#EprzX=bZ5n!d!FcjhrU6X`JKWGAKn3jDc&#R(UYnha!^)wTAoS1|q_b zA3wSXCi(yu_mVMK{MKDzGiW#Z*AJWnYh&ip=y%HQ|bug8FCg+Y_@ zn$*yILyUx&e0Mm7P=~s@$IA&Bpb??u4DYB91o&Vq?`-4dWhfqD;wI$dz9EFthnf8K z4-ut0g;p6}#~86~>yvm-hnt#V+$wsEgNnC9bjW!}kl2up&kg~gdTN3+*@x!gd1og* zVP78y-2@G#m{_A$K_Jvz#CbLi1W)gQT(&;^0J$fphz_f~WBMPvm;K;6vaUHE_H08O zS2F{AZ8F~4n+GGXkaGKY3zVLlXhL{j&HW8gHTb3L}buFbO>GSfHL^wd{b)0x^e@5FBR*$ zq2_8RG{Z6)7qrCZo3(K4lb*p{YnWn0 z7248ePVzqPAeunLMA;=p6w27^-i5$C)TsFN=U4z5;2=P<`6f7~J5O4_rj({ZwT;>I{3Q5~Rgltp8G^HW7bBggv zETTgpuJ`K@2c}K7)_GA|7blopvBz2#$!_&v(G5kKS^{$ii z2Fjz*BYlkBy>6TNAt>q}@PYd-r4(G}1+7$el*b4<4GRuJO%dU5G(sBg`-mc4YVp>+ zreDTI>F-6Q($qtIqe2?*=T_H+001BWNklEk41 z>eh%I)iE%#@Pz7Tk-vydVuGs`RO&!@@Bnrl;7Bc$Qev^WbBFn`nW$1Bl~@4^pZfV< z7g$iE15-GM6w)xnt95M^LI(g9# z>m{jZ$^qM6h5?HAUWm$4`^wqXr`Y#xCW=hF_dF_^cTBlRdag)-53)RU$)cgGh;idNBBR_-UvzO~vnjK1o-WTj5Fr`j`dx_IDGm$8>ITW?Y z_bi7n(-j1Xc0Fpl+Rfji;E2!ilgzV%=g9XWvlcY22UV~FrTQ>p1x1zCjibbEEzg1p^d7zyk3}K7D{*#RR~AbWdi2vvioI^p0Qx`$ zzxqJemt2bxGKxViv9Y=~-E*9fG{*sEH((iKH_vGfaeIia&tDo?lu(IDXpTr?ZVq#I za|Gwr*jtC_S?&uQ(J@N?Ag}jJd{|=KH(km?&9Akma41XNY@)?j)+PU(5N16eldpgyZ{fPzkPR9a$dTrN_nXwFM- zk=M$S#aJg|yRtvf{1`!vN^lcXqyrB40hHV>`#}g^2vIsZcl>LrJ-T-?XKH;m4gf4v54+JJw{HzT%GO)T5h-&f+E4i6`}m(%kz$D(G|$ zm^iBbxPPIGH#ub^^k=>`PQJ1ID0}u(A|t$zGDU-+ae|E+ud&|sC{A1BYu`=Z3wXyP zH+P7l`ZaY-y-F#7h$(|?HkPj`v5;QsxBW-S2nIQ^Y_1@egc|8%ily<}0RY!u`JD^Yata#47CN@*Q7au9xlDR3_DtHH1wMx zH|Vdw{=)zGAO8b?|BwHUzyIz3;-3)}kH@VaAo%5oeX~XgsM3U^ayWB%Q4pnGcWOq& z#0%l)C&y!zQcy*K-&J5Czz>TH-`vta1&US%94Rea9wPA_@Qw#`=aJ|g9*Bhccisl0-!`1bmO*Kcot3~Z@XV3uJZ9I!07Op|0yXmieYN)tc( zsVkbvfs23Fdi08Bjn6Umh$rU*Kn;)E9j&oIW)6(SB*EOSpEtaH{|1C8c3WbHrej)9 za!m9I9%#)YIpF&J8+@Ah;P~(>&w){X3@R3NM1Vv--MKe%35) zA%uWA&QdsvGaxz^HZ|bk96NgVof}CVd+H#Pis67`4?4&C??*f}bgfo*#!U*NdJIfV zHaJIrxGsvZl$H^(>7E9$>L|3d0jm^Og>NScc-O@(z2Jd24eE+o6NqyEd9=Z#hry5h z5Z7+%g0pjMpH%|~pWtV2Fs{`MhiFg`581EL4VdvJhlG?4!iX*Cx=YcSJk}~$#OAQ; zbqz=3Tm=?--7UGpo2D3F*YK3vY2V$~S9ZWtZZcq7y0grpCZ|ba%-r6G{sY3@`JoxQ z@4GY_TPGW6Zs@4I#%l|CBYa_(z*_OYLyxso>8ZzO3U%*8tm;)a=!2FxF>h+i`7ur@D{` zGUuH|Tuk|@{hjg24TmK?#7xtK+wF$?{f=px@Y`>{Jss*Tna1KinGl!+8QZ!@*T!`f z`B_7ZxSHXFr5ISeX?HmVKm1v{ZfXo$Zw|_5;lp)BDSpVW9R!8`AowU9)7EOmT)fmfWpbqZojO(DnnA+<;T}SNubRN7N zZY`nKV5Al}gTMWE*kfC(_=Z6=rwugg_$j5p`8GJhn#OMU@Pzp9G(PLrGvZh)Vz5op z^Yv81-r!`?uhCo=&M8Uk^Yf1Nu?rEE5Ng0K(YJXg{JP!o{{D&EV`pK_ZH03I-@m2^PP*gs5DRP^l6huottgcTs+VboOC0}9HDk>?e%(Lu>y!6Bb@Y43 zhL!*Jw+lYsf8pcyj$e64i!*8qD9$4+3*0=xV?u7gecv#VL-Ik+!V{d2SeArqWWmxT zdqt8VErf)ueGH8mCl!<$ft-zVfJE_V#E-4*lu%+xCKefee(!9|o9-n_VLgV6H2ilP z*`Rw5|9W(h9)rlSiLCFLU7L=*mnpaU-*e9J0Ud*_G_V7$T@U4;_N_S2RcJH#T0rx^ z`^UM_?bzB#!SNm_JpAd=bEe;9=@fP-b;h6D^Mk!dFrowJ9D>AG9(CBUKH8z-A!JNL z9sTn1GSp26;qDl8PSb=a`!dK$f9xP%TSt7Yggs}>DGa0w@1EVCgP7ICl-U}>4hGIq zs@|!r_Mv1*qsx^VA<8;!NfLT~?%xYdh^7q)t_wQ*eG(BeglN&MVNuS} zRxod!z8n#?bu*T8j_D-cqh#vmKwDqWLf`H*o{|R_cuGgD(1nSnHVUUb)(S*;zowx+ z@jg6}3C{6{X9uzs_?-y_dOj-V-kr}gHhv>Uj?)eA60v@s-`xp-AxHf&(`l{$x zYiK2vOw-isofy-XaS%hqj{KgI;fHt4Ym}yYqE6XsX0L&+4QDE)rRdvt*pjyN&uRR& z#sur|$P#ph8kxp5k4lA0<1=St6QmRw>ek`R?Fdttj_=c-;qe?}Yh=BLT<^6(RNydD zEY$p03ibY+UJpx>>h670zuRY^pY^GBk%+z*DJ71rJ~`s`XIR%2+b$HyiO+?FSOBf} z`hLHoIbhEf_iY{C^L1S@$+>kF@z)`W4MR+c#`MsMc4;X|){Q^B!>6b;OJvZwS92AW zN+%~KV<&y0W+;UkURB_!q;Xz z5w)Q2+oreNh=oKdf|MGqITrW36Q%SZ+Xj<%kcM~jOssS?ngZ<^`l~*{8Kz)GBLkrZ z?aO|QT|@Yq%hx{DT=x3gvxoNWY>&v&u5^Dn*Py!o9{T|XT9=peu$Mlu3QNv)EuCmQ zPd%ytfV`Na@kG=)Q`3R^MCY<3lyeNF0y^y8ql6bWa)mDmH}?M7S+^4Ol(289GtcpJ z?kQTk@9`KZTm9a3nwEPa%A_F-lD89899tWVBZjOnnR!&{%bMyZyrZJI6bH zd;5XkfB&5wEHV_XjqvN&FSOS1`tl;m#s)tJEZ!krrrubw7pv4dDis4ds<(mQ`hrH- zrKz~*73=*I>utsB>no<&gKEaU@873% z=l-UNan5EJ*dz~fN>_RL0;ZJU;tZ66^3Q+bzy9mL2E~_?Mu2k;h!dPA1Z;3I zB4-u_C|!rpP)StHLYh&5j2+_GCa#+%1R|!}hy${M9h*g*0J>=X`t=Lzx?)*4{$bm; z9y2pd6Q&S5^`cotaU+yc2Li8(Q8<>uAI(7LK;%G@SH_!;lb0`GkvCgq$> zk$6x8ra9tzy&%Q8M_c(uGE8@9RF2rFCQY>{O{!L8Fd=azXqZzRnpo^SYp9Z$Ola8i zDk|uL+wB8X3$E8U{Qmd9VcQguUN@9IqrAN_rZPCZ|Me4~ zhRJ(ut%3H9g=cxkdi!KDjAP1z4}?hEoOF$_?;DdMrU3xn7J{||i+6r2W9Q9HRF250iLyJAgf&2 z-Kj{-pTB;Ae*VO_*H`!{!3F+1g({G3qppc7jW^Lb&Vx9@1&=h3s79xPQYxa1X+!?1 zcf8(H<-@V}I&7>cI}eDXi|{ETh(foN#)Ur$JeUmQ9pH)Ji4a^vZ~%e~@2SBxR@fqV z5t(rDRdjgk1Daz8JC%y2_}=PJ#KjwZK$<2N2Rb0<4|YE^9wiHvR@|x)J+~P5)8w z;^nY%ph;bCHWCpaF*133bWE{+E-PNpXdC-;q&Opn_Jl!Je0Z&9DCj2merRRQwKlnQ zFYj>=ISopZql^KOkeTPh8;6GgI-RO>yM&{Tny8r+5N=bR2FvJyrVVQyW@HlBlsIGU*x zq=1D7D4wC>le(i)?gwXw@NWeZhjW}vgU=7m z0Tob#8dJ999-ap&`fTgJijTH}DvQka7!MZO;JMvyeXu+TO{59Kj(>Ew_?B6)sKP^z zCN1LpeI8tBQ}eRCAf*Y;^L5lA|1_m1wZ?bzC@P$KkF7z*U6Y4PBi|}N@y6)nX9>w8Z^&*d{?DVQiPs3Ce%xja_!#Ntn z8Y+&YAPo;X8VHRxG}J--&=^E1r@@cqa8#CG*(U@oc@A2ObmbJ;@MI_}MJK&N z4W$r1Z=Wc+VcT{VnD2Whk1g|r@87<62Vs>4x^DnE&$TB3dE3Of%5L4qZNu{Rf+^0} zO9s`7d(Ln>$CZ$mVY1U<$^$RU4Ag>UjzTOr)`RQyiogB#8>YlRyTzevWTVotT5G6# z9ik5Pd7SjmI3OfKn$R2NR=^em6YnTSga)7zA{vrs(*nFxek`*0peFcqaVEAnqvpcS z{Jq0@3nyHzFK{mfAGdeh)(xd>c;7RAOf#;( z{~fqo(a^B%8&H5$cT8?WYys2cfslqqq&~ZWWN&NeLUwJ27a{lQP(y1+ZXV_*QHCXA znE&$BjHd=3pviTk)=(;mJCS3k)^+WDp0m)<#yr^}hK-?6@>VNc<9Hbmz_HU@#qIib zMaAwrcHHY8Nx6U;P@{_ZwDEcx<_Kv6jU$5K=@7k`*iF+l`aclXw4)!;&cYloCYsjk z_bNg+-Y4)Bd1LDreOHdX;HdLbN`PFcdy5|4@$s)$^aKwzWE zY+OM|5iupW5QiRU6Y;AKVV(IIy4j9oVHM&|9qu9Itn7MyFsFnNz0?R&7db*DanRBi zW)1J)C7O9J1-^~(gG%uUiRr6a*J}(+7w6Q}>k}LEQ}Ql^xe z%YA`;-@4d=$#x|Fjk>YJx|ns3we=M5=R)fcvPE;~=LK~f+D|c6yHJ_qv_e&U%od092`0NZw>S0MsQ#3Fdq@^iSdd?>$N@qoZ7Y&LX{l zv*^rzuCpmg3GuBGveZEu!I=_u6AkytxpofW5Eua9_s2Vsq2!-`4#1eNPc*P@{xYBI zY$WXi$y$w(H5dw21sm7{n+yWi(M&unUDU;XV)=eVyapJuK&_Sc4afI0*K!ytq94{Z zD+X6$Jc};eK-xLZHT>KYXz06C%0~@tuHV^g-3eRGJ)P@v&M3ssdlC|)y}o_6BK?>_ zfG%~re*fC^j1xKq=4=kLF)y7Q;XSr}M@8#vMhF4L^e3ie=J$#MKoOJ+)^)}E`+MIH zJRJAq>^>y;;3q8X@Q$3hjdt{wvcX)rP(1p$4||nKA0GjTB-4B;ufkrf%x7 zjzAd5CgfP0;)QCa>zXrXZu_ojf0J?n)@ucOFON8@`Xo-YqSbShc&jH#`1bufK0iM2 zKmXT1Sall{_L4h}tI5r4h0#&-g=ChpU@9=Zx#i z(pAX!`&|wNsYg<%$~C3LaaFIcOt<;?#Gk+Z!rR-6L6h@M^RBP~A_UB;kTuR8OIqnS z*n7TC|NJRG*Yz0eIdq4Z7gvulNF^f*LA2N3^txoE!Fi#lEjd(PO*sxGRo(%~)@rNGaiE zy23YLUmw`+53KhUkB@hhZ{KlA9<^j_b?q@1-Z?2W3mhuS#t}YYN<3g}gjTqTM9qP6 zMp<{{b;INH1F5~D)EzN;#OAOU0&N*B6-2o&C390~UM3`X)OCk{Y20{hju&u}=&4%Z zDr0#)Fr6Sp@Oz zkYdDgxdPV<76RJ7BbOa%7Gy3lj^7jGOG8RP2poT;8`3lZDFUUyzr3J+exf!)(x|j$ z!R6%zXbsnO?E{qS^|dSAmt}#68=AO`NA7#fJ6PDL2ZjU?m#{)Z6+#YwtDR4uC8c=z|o}h!E2`w_(+0torU~-Xo7e$E2 zB*Wa+;46S4>sBq?=y3$!2t_dda4cS7k>o1P!aFxLg)A z=Mkp_(k@b~aO5zhqX_{=Xn_ZFsDu_|^Tcu8sU1ao-gb~6>gO~8o(lwsz=E4eRho5f zP`m27szVWnaX?B^6ltWE9b#Fe=vm2YX&81We7Mit(BwVbQ)3?U*==E+7AmS4TyUr- zCGX*y<9)|~l%|1dz%eb1T<^_~JfkhGi(+i^Oh3Qf#6Qb9RxB#aKvnOA&4Aqym1WZKCiKmwN_k=yGWZU-PMMQ7?(agI!CvVp#QC- z*ESNA98+tB*UxQ=`BDn@b(5O(5Fpr}A;x2XXx|OnDAjvz2LOj4=V&~tAY;g_7qge)wcj4F*z*J>={9yDSS@bHloe zI%dJ2T|#>OdSs|^Y3cf_@AKKsXPxA5O|Z*H1Mr*=-Kk#TXcjs{K+|Veufwt|NFfb$ z8g=&fpEda5o$Kp{A4N1cA)D=x?JQC{J3r5v&1YAxI`b@+zCUvfgV@VnUwi!~<1qg! zTiU*VXNNJ1@@p3@u#*PE5au|aO;5P(<9$rSXB@}^^4ye{$xZ0iFQ0=!QM@MzAXb}~Ug^&FLp zz;#stAvcaYgM8lt!kTwHa>lRQCm#ET>VPm$m}BUXg1sq6z?2piC*9f1;?@k8GXDPh z4Yf%;2eC`9fS;8WD<*hQA{j^=&-*k@OlK8wHP>l7W7Oe$y3o1dY}XdsG*)r)DCXAZ zy$t;hdrq>w5F(EHx!rC(n!~!`w8wQ`pR9mWMM38Q))*sIhvxM0^VZ(8vHMrA*AQhL zoCXr1vm_ZJh+?-Bm0=p~|HuF6*N~z1h&-StWcV-;FuxvSZN?hM(lYcsrp`=D_$ua{ zYtLSGjqS0Oa-FSM`RvBE!X*1IReqkPY3ZWINrr>Ek9Bc~afW{7NdJm*p)r784Ki%) ztLM10c>617?|D$t1(%kBr1cVwgI-J5(%8-+uIlvjYu!G?I2cn1+GrR#H{N@V;@i`} zO!wP)p1afENpoGVy^^RBCKDTQ>`6hz6>#G)#0b0XHSL4M6XD=olb@+emO7%>TA$Ca z+|t??)!MB#8qUXBgV<}XVl@v8(Pro8-mXV_9z7Fv4%({kb%BahHI|C6lOJQQPR|_C zQ3swy+C%-WwPg(5G zzzK)wOL~D?DVaiuHKi16*NxnN2ItqY$JEa5f^W2R3wCrDGQb$?Eb)sv&Nj#N;N~P^ zz5~0<-7~EnFRF^w)O~xyP}H-ke^#z#tL^0+H|W-4J0GoSvA;wjiGefqt>cEpd-jWG?xh%TDZ_WOP{rTe;&v~;hm-I<&@_Fa7s#=Q!IvyY@Zh_mm3 zJBdgx!&Y>CYqy`4el68XvlhL7Qf%3ApTUA>lPl7mS`3=TlO*cbO`*fHNB7^6NVI3_ z8#0TeW*>U<0Ojhg6FoErGR^=V&){SIi8Eb`7<=M^q8;AGT63(&8y0B1a%Ie&z)hUg zG;VRMzw+RA{mgO7Ti4YW)}lMVW%iDtjv1fb0}JVeR^#V;#37;9cIv*aYYDkLqcd@g z5%WBE5s8!V;5c*O z4Vm=WF8#xcux_|a?fde}x9-DS1E5&3O@PI)@YKxa5v%tdlZ8)FLsId4jFSLHr)+`%qDX^K=m9f69uhx(j078baau6C6q?QR<5|E2Qj1|@d ztm_L*%_u1XDFS&03b5Zd>?y*S7gBT@0#9m+WVMtcU@cjM7mleTHXOxO?He~1f%d$d zfq4cab+F+Dr+LQdbi(Cw;YQ)erkv-Q6cubUo=buE6J;lg!$g&#A`uJdxd7Jnh4OJv zFK~ezo2;>z3@JyEX|0r$vE_t4Mtqt+;=}i!vFtBYNY;#;DUUm)gjC3($~lLesE{Nx z0)r%llDLD_jE%`UF>M^p#}OEo?B=ClA+V;BQmz8tf)xb?76p^H2-cvc0#h=OA}dED z+sSeK9xSFgFbfzIhXzCWy~eUNeL;>p5GKlFmAq)qoXn{-;KdtqARE<8vTmjEFpdg} z$PHM~4l4}4%u}xbESZ3OPgZ2ANalShCS+q_*-@)-G}{4`qc!2CR!q*rngfimOcKec zZQqinuGZ99`O-ijBWJoVO|7Sj7_B1EV4$22)&VK)jWk0}5qqT z#9IrL+~N@f$3;;?v9p^?LCX7ac9?>kdY6EviZ;87-lAsXC^R3H4RBT|o=F8>YHl;F zheju{Q$_=B=#0y;v^@A}nlSmGND;?9*G&CzqR zA!mt)tQ`PLO*5@=2$1AFT&W07J33?pBW@0<5f8<2A%p;%Z3hN45X$8So`bD%z4Ng4 z7(l`r7`6}yG_(3E4+&!I2!>$ zO+ajsQ>Avpw0)<&KIQoExpL01!IEPQj zrURjE1yZH>9u5B5N=hdo2MXXXM5-lBWD3C7H$g?d0kA_fgjX>MdO&Sd+(QRA4i@Ov z;Q_4Is_IscFz6K;=;2twpPEAraWn*k_HF+pCo~~in+C=j;}HCeX)0LP73=zf%Xz~! z-ieIQ8Sd}z@A&fN3t}lS*27wQesYNiNmr5KBxhUHWU@!al8KO=**UPP0evypw+&m( zaFYXyX*IyMZI~U`KQ$xRW3Wz<1UsBR@DJK|$lXk?vk*9IqR3KT4??31pkj&6-q0pra7Y_eKQPj)ek( zcSC_<2U0WjonH0_&yF>PC*L%+QCy~hSR-VcYX988ro}$jR!74)uzf6`$o}IH@W24- z!!;WtWTXcv+-zBPEE$JFqw-(=o8k$0AjF`$oYBoGa!{ITV&NEbcBukW1N6|HgbqD?X1o@H??$C@sLe9%4+LW%V2fi6S&2(L~t}3d5ur^lHnUYQ))P> zD+)49Wyb_19MA#}Jz%GLgYX|YA9Os6h(iunI@yA`p0*xtI?g3I4}9{?5wRq~pXeGK z4*T7JpYbwhEx7?oJP?1r9QQVpkimT^nH=MDB=_l*_&PZHCb*73PmTjzOB!;`s^xHL z5`{c?eG%#9h~*lEBXo@%Ie}R7u=l5wP@O|c1rrln3a@<`!cIYkkyKZE?-~ZJBPOhQ z?32U+!&-|=zH(f=XY%CKp1U~&nAcZ&9%^As)S)^O6|d_Gl-dpWy0{#={+pV)EwrlbvT_C z9?kdcAh;Ql%z}YO&Ad9d2Ir+DcusB5B!EsRq8$D-aj@0(^@v|2=U^uN z6ec<_HZ;pK)M^A4S>>MmmbJsRr3hV`1E+2uXbwC=B=WASRpg9xD(ZX0XP*&nQ!R~v z)Cul#d2nmgHNU*GePmnhh--vh zvtV;@3DW)HK?*h8yGs3^Nvu!Sr&K$aN-q2DtggzbxFXx~Kr9@|I5LwngJ8H_N1mO- z6j<9|S9#t?fy41TXjo!lIDXZ@$~xy~%ql{*jusWiCd1-pGG^g@LiMTMI2evC?ws!{ zr5uQ^9@f&V&slZ^D&&l34T~(v3`QKXGw1HI+GcK14?)NKa zLYoHS{_p?&zvCbO_y^wK-|_3Ozv4gt^FI&EJKp$ZkqeVFgn-xe4MuDZ=Ri5*7Cn2C zFD%_aTJ)5K*0ZH$z$Q)zV^*BF(*()PX6C7G1f>ZTHPq>J>WVM@z~`J%Ia^l_1W`HZ zO(@rboNBXWe0h1H!`k<% zM%rVaaqK2!cN}0ZFE8{tW`B^P91Z!VX=>SuqqVq@VdMa%0dZ~D-oW)Xs0>y%S0qzA zX8foU7kkws*1~qfLs5y#y*)r#E~-5{0r=46fR0Q~V=!3Fq1j7{8b~(jX_{cdaS(|u zxUi#hOt{_dFt*})KI7wuS1i+vc)MZ_6PzU*PtT4s4hHXEzv1ief4~}p)4U)qE9Nla zw5&W3qM`xDVB7DA+m6%e1UF4>2)Ha0S#y^H)C_AU+5*uvFRBA?J2sxU~65V9;YY^}I& z8?NUI!ZgFp9>ydFwO3RNgy6X7qvvMH8DW}%FcI-15_n>q0}Q=qX_>BcCyu3p1sL;`k-+J%V*8&XH9d7pR5ZKPpGh7;%-U zq*Mbc495YuT8J-|3hpUkE(MdLp#vNfBCMtOnw0qVNOo;_P+QGmIvBF$F}IeAqD(F) zOcFU5_@=3?kMFOIIF^<3&i#Jpy;IJR+J+u_Xn7LyrgCf%Tg-J`A1p$jSwUuPNyz}s zq0~>uV2ul%7L8OQN|gb*?Q9UeieJ%0o%@~E{R=y}$r<6p#GfOzXhMA!wD*bHfdg70 z6GDI!l7XoYENx8|_5QHUmWEi)!)2OqI-Q#Rx1f>|k6~HODDOkAy|F~B*_CS0I@=U0 zRIHbQC0@F7%6ocku_2d13cdG;oD25dQaq=ML7Kyax3@RMZEph{tvniCOv<2Slji$$ zIfivB!FSwrjL!qH5XPQjyVv2Hl;ZHqC}>s&YGT9L0^ zHlAgy%372fL!3Zz&e)l>S5Oi6z1=^#4)l4^2JQ0mGQc1(#&?Ry%J1!dzc+HP?3v?Q zmd0sRRqBHNXws4zf|UnlpS+(3Ww!0XQq-OtWtECW-ZzoM?Su99SYy#zI-WV&S86xh zueLtKTl9k~gItm#=TUtx=a&poo<-SdKwcC0MCm&IUhOO;*RVyT<=Tl_1Tyf&}b8}}@(IfZmq|1jN9Qx9>+0j^eT2`Heg=G&gj17>Ls z1)LU8T^z9V{xG_|I0dlkfsbz71^AF5v7FuG_0izh5h;)!zzhKJ++DwEPM96%k$D_wwE^O8C6axmCpS!<+479g zGpdwzZL1wV#vup|eQn$4T3j=qYqBR(9n-7NM?(A<2Rd2vFtizCAc%7xy4P&)vG(NP zhF^-SG%L|3R@w*OJNHN&*Kv;ZL}RJlO783DE`rKhx(m)edruKFi=Hid+t)xx6e)^_%KpV0S0_hEI2x~ux^H~q6m^-AjM z9H~`hUu-qxupc!N)e~1K5)znhkJXB4amdlbuY)vETC9>_?^Tgl4i~`MIiI$*s2rHI z!$KqJ$v{UrC+YVv-uJ-$bIkiO=vHKI8Hnp=M-L$7>=d_GO}LcaMEX#1K9N`|?Vuxs zg3$?4JEK`^I|m2-9JIQ2SgUOxDS~BXCcKx2eyqPnWpJiJa|F>iz(|N`#2H0mAgso9 z?ij639G$@wb|%lfK6B+>9Ir$Bj!{k_U5}^8blsl8@xJT2;=Av@gJJxC5`4vydz3RI zR21AnuZ=B|gSr;;-0ydsPN$AMq5FU_PDtM)jSuObLfnOPJu~hP`t?R97!k*7TyS(g z&}WUjca5dQoKTAETtW49l{Mhq1h+b*l3Q(RJtaF79*ea-t&)?T-Y1-~*i%IM_KgTQ z?AD^!fyAc}DTQ6WWNqLeMrvo{(YZ$)YBgp*MsSVpSEGxZzJFs~sPB#Jy+U9a<6yLt zgk+$!zY}t0;=U`;@OaOucNDJt{T!cCQt5g)5&yJ(E4Xfc*^zfUfsn+k=7(N$>;ZL+ zqx(FXzq+>HOFi%`HfF?++TOzJAEn0)>VPrilv@;_;2Px2AxWhDnJSJtg5Q8$fJ`Yc zwI{9%`Bvj9ypR0dXmygbj+KD8k zgfLGXuBXW;)Z0wm9`LM}8Qro+LefYo5z*f>SLIrIyl6~0(erS|~fQO=#3C?<(PZ5`y&)z@u*1`!MEpC&it2i(wq`t%9c z>lL@#4Y%73r_+Md>4bT%{Phcd{`qH|UdgrK-~awMv1DIg8wo`(oYU!q;4QpA0GnD3 ztJnFEV-^yr_s}*Mxk=mY&H%6H;@K-kUOBA)I1AK!k0~7S7D9LtyLBO7)LOAL>-~!F zzWan}nqjTMYG+uBR)~%RGI@VeP)W}9ye{1aoKr=v5vFpsd6;p#-4M5g4<9}php67j zc!-J^VLUJ35P*~@3(osS7CD9W19>b; zt+jwJDAmAK*KA4!q+U;R%TTTbtRv&*DG{NgDZN#urq13LQVm5E9X6V}K@qZ(Sg(qb zTNe7KPoEGR-HQ(&J}|QsFZgsx6TWZY*K~|G`x?w5_8yCT(4(Z|1*)x?$;X? zvFkz#ub7UQtpFJ7fH1+&3%>jGnTF5o#v{W+Qcy|*l$&Con3JxvQ1sp-u!VS-W|(SJ z8gA|Bhe(^NW~oO244$Ird-l6IZOyhk@K*PC*@v=>?CEIv(W8!Lo5kveu0}D{NmwEz`oyb zyGQIL;q&PSBFR_>I1khWEDPWRu+H>%^9(p9)rfPACkCN=dBLeQ)WH3|qZ;6L+nW0p zaduocoGKf!Qzf%7yiH_r4}-UtS2{o}IX77+2U7$L5iX3+u+G67%HOOYOVe5_*}_{( zdloBcV%kw|H=uAKS1G&P6hmv$S)@b<`o8a?v+n?kiVSBea!$yR+$6uf!kWhJqS`f1G$omO#!{vm@<$utmil@V^I=Y${BDxT!3>x zg(W6&IC4Kz0jsEKPcob>3RB@F*WIvnybWB8X4G0*p6CMzYy=oUQ-L%>XU?c3l_q8| zJ34J`xD8hR%$+^!0{~iTW8GG9R%vI>AgBheIs_o0+Kl)7^!GWV+`Kj-avz> z6aWAq07*naR4~uvLUz4g51@(v9F2)MjSN}h@)=P&>rUMq^=jSRITo~QY-~4tt+_Ok znla?|X04^{<6KbK(ZpEFJ1=l;z*8lDLcq!T%+Ap^AgOcPsHNpoYlVj>FOJus?`i8E z{Q%83Yvwz=w+LbB6yf{6H+Ljy0166nPK|gYu~jXHy$z+s#jrN(?3faQ37D1u*xC~; zN`k3|i5*m97iRRM9N;r46$t>(DWf956yJeTFy!j+jJzkY66Aj1nhTAPTWEbm#JDjz zNE){T7^(%7-;IP)0ncDb+?9F+5!QIjvxA-KTBnrRou)R03+*i)&IaWC98hSDK087> zV`!j`W9^ify3g3xkp}a;z%T$&47y>Sc9Z~)n2`gRv>Zc{4;M;~&l86xshj2VjB0C9 zV3FtnU0m%vuQ0|T#R6vo*44Fs>3+Y%!62Ck=S|D~9tXl5NTR_1(Pn&f0?=_u5??Vk z=?BSAK=gk2(uU-QoAs8P-Gh=jXCQ;4)a(PnP!m`i0Z9$cHQ=BJaP4y-cSHIIr8^Hl z4sy-Zz4o6)%V+?|I0vWt6vt}XF5(eH)OMx^&z;PmW2Bf<|LDS_iHYK7C9W(Mp6h$p zffmKEVzZX6pB;z9ZJpRh(7ku;F%LlNXroR&T<;Vx4y}%7nF!?d32>AWMIzmAJNA@O zU^-FFx~}kH#y#$Mzg}Ug!{h?259GF+6PbLufXptArbHOEF3GThhg8*~#tIW0P=OR9 zQi!00LCJy z0maepZm_nXI*(Exhx~L8EydkB2Wx2XSwt0?frP?D9LLuA)IY>bF?3;>`8-4G@u!mE zON5OiHZh+1E}Pj=D{ja;5bX|c4Q_G6Ehd;SVF?CP2<)arme9x@j&*nNW zcv)A>^VHQ@6x&S0dLlp1O|YQPsjMO;nxIK%+YgZp2lyO1?#CFpqu2JfZ7_vub#E-W z&+rh3YS6<;+EzLPgcNO?0LVQKe1}2HxQ~tixvs&EK}PLBY7$G~fi%~E#=`CZ^FR#0 zGXwGDPh+4O8B#@=vl@~n| zV3&14Wa`?Y#Y!o#?6i_Wy?j$&*50*bTsL}1K;*s0bM{$8sa5ea-9XHnwjT8F8i_5A z&vQS8?(-WwiKG~YjN*t{t!Z_xCRdOXN$H|}N5!qIwP{-Twb?;U_EhI#OlkF-jw}!% zhB!;;K6|_#;*ws=a|h8D;mj)B)^Eks@QQvY^B5hWMUssi$Ni1Bo(4)voI?Ah#6lgP zuksmTD-kP8sW6T{gY*|k$ZbM)6E%9P^9^#TKuyP7VB280_qONoZtpL6zOBpG9_9zMmrIjr?3T+<~8o z79~|mbIcQ<(Z@;Dt{iT%ldm+PX|F$?dOE`l%~d~TFs*v6_2XiCM349 zUFTXUs+{q@XVGkWm_5#gTBMRaa@M40?1sz(*}Ze&X3?@ZSkf~Y*@=U&XgSMUWJ{9$ z%wd|?9WvJzeWJ-Pmhm-H!E221k7@yA8VD;gwcbZz$!#iE5`#PIu}7ZE#E5<0;HLoR z46fU~;fNwAKQRuU*%iVYayKz5PD~tDg~X|2-A7@ICJ0L8l_m_zdely5`n;8AS(D^w zUAeB8JnF$A#?f+Au?@&6k&xJ0%z<7rme@N84+Kin5PouHH#i6#LK=}h&033?%!Bx1 zbd;hqR|JxWLz|FoLI~u{Zf%P<65LJqdgO}#9Ivn{_Dmc-1Sb)4G{wQ@CNz-WNg~0l zYDet|!uab@@5}FNKT{9ltHe)r?lU}-?#KYVE~IW4Nim~fOV^$n=g{YhCP$7$@s3SlA^|lM%>6b*BpO~a+I+=Tak05k1DL}Fl(AS3AqcD zhj=@UmoyS^PN=Ci%)Z5d4uq^m7PGFAdQD5EH4Tpi#}Pk7nHqLW;qN8KUm(EIY7Bd{N<Fo`Gc65 z!6eX%=I+*>FL8oxd+;L}(rfm(&UUV~Vp$e^`SLq{{q>H_xSq97ySPF@3>qp zSQfHo`|Dr-iqD@vH&zv?Y$`H8)WmemNZSq<9PH%D;>Qwzl9>2WQpUb-6s^Dqnr4TN zcA#>I-0%0pmT#KCbCs^ZX&X#R&1FRfVWgb1ojUOK^+RW2q?_L{>yVo6hzx3CQc4JJ zYVUd5HeBvkeERf>i7U*mR1pM5Sc=R%HZmYlH&k0e>dlXs`?fJ136RJD7loM}Bffn3 zir3duBch1g3k_a;#~e;Ebs1<!E2z;=~8Z4s3;Gyq560;lTeyky@n{xqB(^Gp~W6;?Cr4%?rO@}B+ODWCW zDaOdmczRgV9`WtVH@vMU*upke#^QFr!A%Y(d(L(9@Wx>d6Fz_ZNcW}EnoO)fkzrPF z9-diw^W>2d4c&~1xV*okeD__mKPKBn2UN=nc(R}0V+3Yus@~t<31nQTfjBK|EADHp z*l#yX>k8~U73W;^YqlsA9UQ0SJQwCf{&;zLX#@}-sFaXs9BVDoo^ih?Tr-h-wiw~O zZO#bmwBq#g0^BzI_CNn8{@4HYzwp!F{))f^`Z|JIVIGZF--x^ zv!l@M&P>qUtkQF;T{dxykqjLRF><$U2jG#7WyWGgN;~4@P>hG&46HYZamV#`Z)#4m zH{qR}vSElwGtZn$MtcBF2-z0fIbdCh@x5(CP7DEGzrM38QV+NVKXr zC1)ard52ht#XryVtUG^zw*mmn^9+PuVJ}6Y=jNa_zlPOitO_zPjg%9dhbK4_-jI!_ zv6Uhe_ zD$&dkG3MrsAPv8BJiOu}a=TM;v#u`>xwb?e^$(e%G*m(7Xrr4oooy=To5bynDoxEm zm)NS7muhWurWglQF-CGhGqJflj7m;%c+>3ebzN8;eGp;1_i)y?cn1MF^sr)7LTM$O ze6~@Er?(weJfdz;j&EVfoF?g|qPUbby)MT;-VHf{;lqymzQIz{1c_ ziHUJ-uu&MN6PFy@104IFI4Y!eWMTP7;s#EqS0a|FGgrHv=#1QyQajIfCX#9Oqr@tW zjC460mt{c^<)-O}ntEVf3db}s^Iro2qx+05$j2senx^Jh*kVCAM$>zWh7?lGm{Z?| z;Po-KOgl%+^ZXDIrN3WdbK14!b)$j2en{tgrwU^`ds_im)^+WkF9A2Zymke)%e^{= z&RPMdo2A|oRvdUFYh0@(gV?Q(#sOJ?GxXA)^u!?>eA z5M^CefFC(m`tFR8&wfOy^{!-M)p{s{Y*({a;Hg5gbITcGenyqjGo{`5_oFJSxsRyl zUJpE)n(;xAbo7bR>}vo}-lGg3o<>7>syj7!tIwNJQKr|6c7vh1E_5KxsFc>~rCxnz zJNGQT_j&JOxLX6U&sp7XC$6jIz3U!SD=kMLrHdj#uTItbwO$*?a65P8 z;&FWls4@b_I=aF+cSO)MCqS-S_KeHrg6s9#2x^6E^5rzcN8q+^xZQ5}cD>>4?IR}d zvE3tb0cK!crQ&MyGXy+g+n+@;t+n%xS@vx=mJ#1MP zEY`!6id2C;vMQ8C6wU<%XW&>!;4G_yEnEGkf)LbzxuTI(HK_!D;=XCK@VWp5ePtE1za2KqB{r$QCHQLcM)mEdz&`X}4msd_g^U7L*2 z0W_#RBJ8w#SkCCy(0KmoI5TlHk=mMmw|gKs=(Bh11Drn`=f)aAgX|6WWYXL-<@QLF z)_rkGLcV!)nH^mLM%A@e-j{Z+v1oE|^%)(K#O+8s!0EcFl)lFW-yh4*oVch;EvX$W z#NoBMH&`Zv4=%6b;xP7adT?v`GfJ%>>$=6~4z8d@^;g@zW4mu~)?%?s!zZ+QKE~K^ z*_1O(=AmkRBrubB?r<2RVPx)yvl4r$2<{@;D6(qa0om*e+?=7dupu#%2+ z68um+vsEVs={3LTE5@6?)j7`73Xd1VFV8pH+nt%Onm=Nr&Ei4lpa_H zd81>FcCaxyJ)Ox^!6eFo^EBbCsVw3OD5@9e&nd(G?cRvZ($8eBm-O=-MTD~xaiMa| zr%~?rDJ71AMCYyNeOVYZE^2z)Ns zdc4oA?1$^JbGYB{sF?^g>$)n37W)0Kudgf&6erDI$T*6q$2vs!x?L@=dd5-oH9CIw zq$v9+08?0rVDM5KRVze@-X+@@Fo}TAD|Vt1EIa3n6fz4OBSILQUGLE9{QHj8(2|Ot^{7&C*O~{r1mifXca+Gsa<}J^JEBdo& z2PylcrXKf!b`~g7#WRtW)QhtAq;}Mi)FFh{7c}uAOy?3j)>oqor2hP)TTB_EnDzc7 z1UaBjqyAjF|>}(|O0D*O5Lz;YT<+DrQ+%>NpT8kSQX&8J(@*&4KmURA`HXFg zIGs-T@y8!=KA&+upYitghV^B|x~=#h|KtC}4?p~XpMU!ea$4Xg z9+p{0WC%mx5E5mN<`{8)e}{1n>w0SWw31m##ffQ3Dp69xP+^fWDME722yhK3HWCM7 zz>A>b{rw%+>lLLGTrOwMK&^0WBXzmH0|3tFl?%b2eRmz-Pux$}>-%)wcvTYkV9`NAj zk3asv<@^nwKYWBU9@p~?Wv18=dB9&^U$NbGyuN(E?3b3Eo;cPjiG8KDFqIg3B}N7# zNv(E1U+~*6zw#kvkd#v4!`mn9d&0UbaLmlDrQ+k;2Ymhd72p2&ie+A50Yo0GG=Syn zSA6~Bi&8-{D>PFSP$`scE{&;>G_<<}spsf9+%6Yxe0J1q5o5ybO6zdjHk@9lf%^9C z9kx1r{P!QsIq~?*Pk+PT{{A=M`|p95h2qk#fC~|m^_Z5G*w*(O5uvOc(B$MKQCW@~ zyY=-2e)fR1i2Fu`bS1?@%{#4s6y&s{Sk8x+!#o$pvR0G`az=t;kXYo=h=bTe<^ZxBZ*Xm?@mijU`&_UFS z+qS`5-wJvG_zQ@E8*^%rF5c7NI;M@-xeT5ePnq>8vHks?v3Lg`=4O8%Yate6t*|Mf zvTa%yU&TXp#|Pnl-}vy#Nc#@U&$})pBz~imgvdpyWe3HbL8V{~3_Hb`3iuEx5+U+o zUNR~YEDEvN4Mm5&PAkH)AOXm6gQ=E?IQs@;J@%5ZzMN2my`88aBE{`~+o}}o5|Ab;_E|3I~5e=u*n4|eybGhqTFQ_#|Sx9yJe`HX5T z!bDMj^BfvUz#5BnU9l{+8#uHAObsu`!dV7sF-D|4cVt;PcZ_j3olaPm3Cpq|@6>4Q zcXng(6Dx`=$B)Iv;ErOc54O={C!vxv9Fw{%hzaeiMezouSj={UL19aI8Ui?Lk=YK_ zSc_6q8wjA*BNAIF&IHWN>@ZeqMV`scVq!&2NfhHC;PkU5K**q!Pc8~4QewoI5&7&X zr66B5Fb7b*EKAE^_uk`jxg2EolA9Gb zMR@T*&d`2SEs$aYQf?}cV~?l}uyW1;m93CX<>4XNRmU`?p|}?6*P`RKw#Y24Fy%G} zsSv;)X4_?S9|Io4icwB@ZYDV92J0C;y7cW8aHrUj<_j^A|=M8NLCX}sm!sZ&vLn3u!kaC0Ch!n$o@IDaiHIYBA@6+)lc_66%_1at?ZQY-Bz>%8@Sz*bSnIpIV*yE8 zw5YWY;K~>eW-SqKM`fPgw+<3Od5Brjjd8;RP3{1LM$$m$C^GjjOp$@MRuXCAm%Mi& zc{X6)IanJog{e6$j7|t67)3(^QRI2f$o4G8aDr2;#`TVz`df?y0i(ON4KX5wXP~nS*?n6W*^EykBpW(QUad=Dj#& zz_9wMWMJQuiWHjQSgdr78yr6q%S7&lK025=Ae<(|noz7os0DeCC^5BOblWxrw^9tM zby(Mx>X$Gzfr&K+wvzhVm;&d+K|)VEj0NYF7am^is34cnToZ}`rbcYfP1Lb03$pjf z&f#`>KL)DKp%@3`jQf5=nH)^;Eg}hRSP)^1MMS|~B2q1|o-F!dJ+_<>(~f=L8mM)e zX3mCZ(9mQeCB@7GYhapYyv+-yYLIU?q>{1cgxkJhu@jslr=L@paGIBPo~PEMaAE` zC3obRoT>k9tlj^g=qFQ1oKjhgQuuW&3&-Spa^f?N6tFP%A=YPfwlEc#*ipNb+}xZB z*Jjf+Axy{npV=+bTFWt8OoYYZ{81sXaHZQ{rEb%`tp>vH_dBlFYa>~Y?^oA=dZ?ud zSKgDWRUgar#Ia5F<@>&4nmuAFq;6&RJ5yb^H#=tS5)(bYMJz(e>fB0(V%W*StR za71%>U1vNQKGN?$oLl#O=U(a{shLtS`vC7BBUrm3rSw5nzD5^d4pT?^)q~Gc3c@^b zFOZvqK&=!D<&?F56LZo~gu_d_JQv##_066QQEx zUIw6O^->Bs|FT;PtS9#xcHZXu4&l`mX^$OIQAZDraV{YQ-0yca z1S*YeAOci*&&#rK9J@m;Xjt>%_Ix<+gdhSC-#a(4V}vQ@(G3$oHROKf*{w9!jLIMe z37&lG|8oW6wlm)1np3L?m+5?q%~?acsIj3ev=ZloYL2)dd2X8nF0V6Z z$a!V`^oj2qIsR+6&Cyv*M|(+px3~q_K-fv^UsRtY-=|6SdeGU&skjy&tj~?MubAHX zY@R9dc#M;7#FCTe9xbER$n}pVa#TL^_$&#Y+!9klu9X~WGT>$KEUrJ?$L=Z~Nl2+i zouSg}#!OB)X(ytCbw|u^VpsTrdN>ntUo6j}d?q;?j=oUvfWzUXbNdB3+8(lJOxXBttB@Mqf%_Vrr(vv?pa zo{$<@_DUTAtgnZN&8oMpW?q64O_d5~4f4K`1BJ02$!+4a6LIses-7TGr)^{bay9OU z?~TB0h3r*2g1tU7bd6VeZbMFN<#2vhpKnXFpSj>M&rHs%h0PiJs8>zk)1nx?r|9#0 zj8i^vj=jzE$Th2S8j7q}KalJyyUW<85s^IxLvhQdqPby@5u`fai?FBAi8tHzMDHLY zrUqkgHvU_Sj`aB^*U=thkFJgyomOD*u5L3z zb>1?+!aor53JaNZ>V)3=ge0j+Vuiw}rfIXE^8Z>C>lX-MCF2A3uMD^B(t(567D>{3%391ws^&J+8-@xz41q|ysU1{&Av70x+! z+gW*WP94)p2D);9Og@kr!cACSUr~8DC+{Qj;&*U(dwXm4^5^pzzy0s`waIfCok+do(d=CaC;YqvMS3_ckmI^MnsmK+QxjNSxsc z8J>f3?pt#v%G6RHSlTHi#aQT8dN(!6B#Pp_;wJ zJWcT4;;%pbh=2X|U%0-X@%@KSn0&zH{R|X(?Y9p?&bR})AUKcn`P>zgq7a^ZluB(_^4P}ZV$n>`gvr8TN#p>DBlcSRhiaApEH!a#;{);L_RSGo>c z#O-!NH4d*I-tgm(KjO5$QY_lXPr%nN6pzOD4c;>mjV!4v?;S+W3RoY-@vi^?AOJ~3 zK~z@;0CU2=-{H1|5NPl%@nJ_!=3&DJWbAu}O$D)5%<}}e(!ew8XvlwhSs2{Q9D)k_2FpW`Ye(_le+XUlp1slIr7J6-1i+jU*EWAtn2z6lKZo+O z&9#Wh$wK1PL=^(WY&T%5YH!e>sCFOG>v|lfjh6Fc-=jaH{vC%Bt~TY$m?{5EF+3`@ zMkR6Q8ld|nQI0Ee=W&kP4n!K?H=RT2;htD)5x7ZzmUXUyNr~Z=d$nzQ2O^9B=d)|7 z)wTNTVjr*V%4=uEf4HWNF*o|2Xo8gG{r1L=9VzeKa8942t%u|NS;&W)G&DLH>FfMV zv34jQ*-^7z*m31hGt00tRf@~lxR-#j6k8Mm=4HVacZxmbm=tXjT*QU2WX#rJnrBiJ zTLYVIBdWL9R%F%%PwyrHEJhM|4tVM|lm-`jpwj1V;uUKAAKsB8T zRcxtaPDqtN{8TdT`;J_9+_nw3ZBsy%Yfa`kil6_Bxm!rBmgn-xA zSIqOwalED5SLE8Z9s{Lw{M7ru{9DdE!b>+?E|*5C(RI+aZFqTkIb0$J*B0&A<&=Zs zxZgi>UXb%x2-58wFS&DK6bI^2JwMh2aDCkgEA^S{>i*+gH{JVef5cUqf53Uyecmx@ z%sBhtKGdD_wRGgBW5~pg6E!sjyjUa1(EAxl7K5uzZZ$^fVxdIfBt#Ae)5Tco!DB~) zV^NUhc$)&#?uR}j<Kk^{~DP zU->me*w}DFaUwPbzLKiCG{-5rJo~=4C}X3Bw^Sbu5j1e!9+=p{q!DAfwQsuNnI>xJ zzDgo?9E&dXd;oPITC@ACc7q+2)%qX7ZS-(Z-y^-wHU1#@Mk$Z|x9;zovoZI59bv?K zcvi;K++^>fIXX%X-M(kX*rBGV zXJVvkM?wfl+r33nH1}}zJ7SFRwZdCR@vZ8!$oVSwklcw*-8vp)>ttQX-Xs0Gb25`j z-H=kxT1KbnXX{ntOug%`eGos&NX@XF}B*X=qQWkP^ z9Z37$YV}$x;A{8!N_&PJChy?jAJ$~rcUX1=v~$1qnp5gPLe=|%d@jAu>g%N)2&L9L z9L`-AP1epcxUOdvQf*Zc(=E|M?e`^@&OyD@p0wE<;>_WMMdC)&?LFG%L=T$B-b`Z% z((iVTt<3?kJfwwq?-8sU1RamgU=KBgF)jW&xBA#T6=QTbHanb(>mU727Jl%0)4g}+ za%)@@tP!4RR9q?R1;tID9ijJ}I;RZnP}1T!m6^gw92dgn=tebSEZW_L=4Iu;SFRZ|_%J1QN|XCGzjB^g1@U^IEZ4o)%8+|u-W z>>QlD>j_c@jr6F$U*qxB5+O-QSaRJX_ebOXFQveTK*Ou+^^BY;C;T3FOw)wd*Vo1@ zuAFTu%Dn&WA3x*s=g*jzfQpQLOWi?xyzCcMAD<8r>W z=6RlHEb~m@1iR!+Vd|{R+Tg)Z#D`s1xZ912Yab9SAL9J*6(%ysM)>`YKXi=OwMFgR zQDcOOo^r}}S^(d^p2>x0-{F)cxj3}QCIQ8Ketmsy3ZvWY#;QuPigkgCk#ArAXxXOJ zj1utgf^SYdwVIA8-*TI+Ma>mC7QoMHlX9$da_n3Kgg`{6IgqNZa8Bg6ZO6B7-%xAC z=g*(9EK6fwQsY8JuHkGotspgqR4y`T)8L}9q$m{S;r)JRz-ey7>>RVYkF=rYNNRt7 zqK4lO4VQrQCDVgNLl07tg%C(pmZ;IWY#UZqg_nKD>+382*lta6^SYjzVz}ng0JmjX z5YvWSBB}8At!=)O_i%niEe53~++xIaqn~?uSy2sedVRsN&~+=Q@Q#|Pd7fb$V5@6I zl>;{i^Mt?r_!B<7zEM2V^>)|>XJSy+TJf?jczHd+REtz1QZ6VdA#NGlc0=%vEc#f1 zM5;T=$h%*!WL3PZ?LO{X#I{8&6X4y9*%R4mKE1+wk3atXFL+j&o!_t6QpCJ2NU7kL zUw*-NX~X>CwW;20HB{JUj&w0}@OdBLY(VehVB!K&sYtoPd55%bD5WA)$;9LW!#T>Gw3KZKLkwEW#1R43s-Z*b z9(NQ|Fwe1Jpu!||7_6|X+-ffPYNmV4O4t~8+)7693v3|A7C-ss7E~>%l>q~3S8OTR zuNS226yvoNsAAh8($WU)2w08s|9 zYbi)AK7*A>w)P6{s+57QA{s7ot8JO+ay`bJQe%8`LdaEOaAq#jdYf>mIjmt${wwA5Uip1c2bI-BHw*QvDmpFnE?1SWy8j6)`O+p4@Oh`Glf>o=T zG7qWdFf}4+r&LI_DLB4<{fe(&-|@o_Kj8D{kAq$DVK+KvI1Bh7fOQ9O7HM$UDK92~ zqqrnvR{%818a8dPW7*Z`w5%u#xg-kV%UaXLTZ(0E8_o{uWDO!p^QYZxN=@+Lh$z+I zA;q!My7O)th`T-L-Wn@I?gpM?GfM4k>MMv~Tg#yk&G~2m69{yfmbp{F0hGmSAh8Wx zQ%O9_&_FlhwxRcNHybP3*1-WKa~-PpEyE6PM=Vki!c=qJ$c?l`_nw>L7?Jmgy$uH} zYBAXN$OGEg9FLTs@Qsw{Ef>=avE=N+HpIHRcEB=xWm^)%^8 z114kaLp68+YWiW2Y2Z5Fp$^a&)vn`g>Y{)QO;D5g8c|5n{x8EhCe9YqT#7~_YRj{J zVw>9tAa3eNr|nD}h&_FL)iEE|=kftAjv#_z6=EG6m-?aOx~}{?@Bq>oCc2eEjzi?S z)Z6FQxUnc>?MV`957Ojb{XS$rueBoBfPG6XW-RAp-zudbr>cg80#Oh~iP{XD-(ZLd~d?$5t~gF(Tg$vbo^5FTdlm@9?iH ztP2$V8xu;Z)FW*XK3BLoz!^uxQNGkA<>sQBYazGAT5-SM@b&zTTTDnG(h73M`F3rQ zj=|CS7p%iw2r%;uTj}eQ4>0qBU<+QV!N~`#W`Z@2+-)kwP)*C)qQ5oZCj+~hDSp!` zz_66wjb@DdX!}~G^GnFY-g}gpoQfr$vL>pZOG=H{Gg`MFz_jD2zaAK@rM5bGnnJ55 z1Z&doZH#u3Sb>yE7ada`)Y+zUw~?Whc2$tQQTh~30BSX#We1>~kIikg+x}CRn$nRj zP}A}M+fiT+A&Rw!h~-IaphUDi#Ci^K6t$WzX6ty{_Hd^(71h>mKNS^s$&oN2wN_*Z zFb;#|ya*vQR{FvcWN-9lJoNx2`cINO{ij4|x~T>F7U1yI;U83rX6cDy+Hy;@1755u?v zTvsDF6+Niq#}dbe>iR>7O53)|6KwEe}Ot(De(|po>xdOC&KlzjH3_2B+&hdklK3Iw())?2 z7R)@OeL!lHf;NAW+K_71!$DSR#hfa;m6EGFszLC;6!egvUH#aZ1lBx=kK}pKYouC( zm@B~VgE*pnY_kxBH2JZV)b>A_Cxj44WToZ|dJsqs+tl+okZYFg8(IJ(A}Y(ny~nfc zAY!9u9En?>&)#{iZIVi0hq;l#&&PXM9LWMEbFXxQH&NlP>igjKaKG#Sp^$^us zwT5Ep$*g7^mJe|%-9WyJ73uqNsjsY){=hdfVJ+0}76Vv&45I1UG6{uAblwsXCU_RP zX0AnT>72kTN7au)G}CZKCM#5myma2f0$8~YjdF%K!q&=g-zIin^v$uX7t#yq=WvRp z`{&@>9ImxsXm#Rfvn8z@$>bVN&i7LfSP zcD;f{QD=2e=%HS+HX{)Ib8-)+fmCTLnlMq!Ev$<398EDgSDi{fZ`eVt7@+c5V0c}c za?BiUMRO!<^8y1!uzJLhoOAHH++5nhJD*%vxD=r z*h?l$!4xBQCLX}dY+>x$5Fw@w^YRH{a=3n_jbm9B7(>xfFa_Svn3sTcUGXpTJ1akP zH((MK>N2lfy!C*CJPgf`SWL7&Q}yBkXUZ~W678q&=4imv^%72 z!@iLV&$29S%xhp=Ky;nY5g+#HQ zbH?lI8@%()_Ud@e1TPt@j_iE5Z3A+Gn?h6Y?>iB6N-V^9R}ZVR7Qq@s$tm1-T(4)m zy}eKb*ScbVd7&r{Yw^PmKaiqyqJiaymskAqe#I}p{DPczeEm50@H@C{ISdwavDPoHqTUb_NU z;wV~!<{avlXi!{liu4G#6YIb|>+`e5^nIr+kOMkd~zyoA=nU&o~ zWo42e5aHo|&hK#1zq@!nrfJ4}Isw+gri3kLz#AUM1uSVJ1a?aJ@#6=k`GS|17v+F= zOcC&i-eSvzNk^q;-qu=yOn7SVJ+A8w+p;3w7e-SD63XOE6K?Nz3O_|uCP0M{ur3KnIe?dC!H*w5@bdD4mzNiK9sp`Y zqTU#!7`tzGZW>WMjZ@9Eo+X$QOeU0e|VW-`5TI`wD9vxq{Dg-+O%Yu&oiI4nS%Ro?-8~W|Vb9%?)k>{5&I? zorqGmjUs=XL&*uLWK#_5doIugA1WRH{p!|;v9M$832SB7_De}GtIij z#k=F@X+qvMyuZI=noh%kd07^IW_@1^wTqkvX12#AX?6QCla$=de9g5hi(eP*cVm$* z+1rKV0xUdQTZjmz4)d)A1V6#ph7cma8Na!I6RUOsNwNm_|a_WnMSvNSeGG5+ykVuX~xaejL(CUEg)#M)s zv&XLVXR;z~V?ll-y2&tLj~ybC&M{Y1zjtZ4>1ePqr*(JONKIs|g|mC6y@)pc9w|iL zi^Oo~;j;uQhRNu z)%dxVj$(d>r=KQjW|l@#rMrS3U0kEd6hgX?XYxpCkl{&62|s`SuN#Yx+e>2`>0yJufvO*m;jJQ`hb28keDyUi&4& z%5yxM9s=~klRLOd)q5o^PaTG$`kFP>u+dG0eQ;U3^HvB)v<~dggph(l2x!LjL$)4J z^lbK_0frtyrA1fz(0IGum`)PH1YX*wOSFG zf+y>IHx_XOR0fb6HLeQdfMX;wil(U*jzfeo@UqXNobmDTf$7sHgs^{x_xrsMQ2$;I`q5D?_e0JZ1tWdHc@LXp zaF=jj?r6?pSywDAG6G_{{9RM~M->5+Tqyi<~lQYY5gN<&32*2r0v5z=oL&RK_DM z8ZMP?v* zn|fSJwF__{6BVfeRHU6kcpqJYJ*KM*X4`OYXtIH(em#p;(|bl>LC+X9fwGz=^C9--^NVK{!E{5%ug?NKeY4;hbS z%cJ{Vlk$YpEG9#JuQ*3hw7Oo_Lp34fXxH&57&60q(XRI19LE@W^Ni?1qJW*0D8u<@ z1eoI>UDJ1@MjhgxxeiKYds=@Si5`0Wr&t-=V-ZMT7#_%pdLSoz*t!szDcAB4Eopge zl5>+#b+xDf60@wX+dm@T^*xh&t4_|T+z&u`B**D{vd3L$0S~W(%d)UZg!ZBP{f_JP zI*=RFmWH|+p!aW_9q;)Atxt?k(m&87@uP#EqMA}S*+|rt9{)(|at*1}4OfHHO;)X($$AZFJ!{~)eV z?@jhVrzq!J=D5k4`#D6{ox2#m4Z}0t#}T6Tv)DdO+N1snKaW-1`y)|NuQ6IM)b~eT zPxf=A@Aq8@p^I5+rEBL8<^xTOIi5#E{4Fu>d#!3!Jur&7k89)cUdpXv3UP=?m0u#V zl08P=GZCNbgP|kFI1HgB3T@kHMxpnV=)!}b>L?ODQth-j?b)B{wOINITIhEq;)wa< zct+5@ola}!Z=EX9`ga;;?onG}G?#OL-m_~XT95^3Ee0N5n-&HbZ%|XlDnjJLGq0n( zrABK<8mJmL>)%K6(NpoCTEFDaNG!-=O}UR?9^#ny2xCQssBW0AX(4cHt@k$fdv~w@ zMBJOa@1{~5)?BXyq}JLVbEpNO66LM0`?Kdni~WxGls3rfDIwI0jGhjXg#N9-mq^H5X&y))U+ zZ?Z;36PJhg(%0(4{}aJ{)z7|qj`f~0oaxL+>^V|Mt+gboan9jSfBF+{w;TT7|L6Zk z3^QI%FZ6=uneoyqjA;nLchwbPea(PAm51-o-~NP`mlvE)C%oUTJzFd#LjBf8narkg zp4It`c)z2y4C_2OtN22#iKruY&K!(gfY(>x^Jl#M+yB6_EO>c& zfpHF%sV2csNF^h(b8EXVxL!YSyWPfo*WOf3j2SJkjUM2Q4>m%mDJ27-;qpAsB+38} zH#fk!%GqZWRbiWhZ4Nax+&=F8brMm*@vetqy%?QpTm5kE3*eVIWR)ot8(+UCicLWbk*=$82qB`xh!GnvJ8Bz4*rTrL+l?{GTJm}mNI=(SU` zn4X)JdRhy`rWr?t_wD0~_g}w&a=~eeFg)OifgE<;I((!Av+M^bB0=#$-%msH&vJKBHNKFhv$dWuiT$#0EINUK?1zVc;Bz=H~fK5lYr#E(P0`@$vqS zI?Z@{dqagC4rSsBLd}E9+&PC}97>_axNX#EskzZJ>pzfM!yi9Cu;hXmXS~1wxd3Yg zLIhF*0Kb>a$ z`OkmCmoHz?oQ1JKT@#5O%f&>V@J zZ17!(r;9n~To+rAf)>0VRCuR`qz;3!Rv%jAcW~@3H5P@HzPd3R{6y5W-0=E(!R2&@ zg~hflDC~rFoEvG3Bm6O|bBPK_3KxB`{sIsmk!(J0V{eu zjPB8*B>05$Y`m&Uppt<`YqIPQ>$>8$+;^0;!fQK6Yo#<%e58G;<6DC?D-TU*MRzjB zbhm-j)iFk77RpIXm^kiQZ7_Cs$}H;&$hrhe18l!H0SD*ulLHCW5M0MGEJX6%bwkHF zhmEoGzLJP2#4t9RB{RO&;l6wDrymX}$7Xr(vAe7Qa9x%FYvHT_5<%_0A_;&ai^%Io zE=B{CBI}RiC=lC4WZHrMta+}7WFlY?=Z}b+9x(1GD7EbP++1L|QIt~Z!&U7zl7YW5 z2G{Eq(=>N9x`=sRUtj6Iw+5vFHSYs$ar2Smg&Ts_^qO7-DuZzB@ZNd@&5Zc!-dGo6 zjgU8L#kMS%m1ADk8P62VW-tgoTWiR*49#?n={>&2onX)gvD7#SE_)nf8>5(xO*eUu zIxdi$;o$v+u*4}9giv}jMH+1K%(vFyW9SEN-3WDRppjC6F}aHjk4|6_Y00@qhLLnH zj;>~u+FexMd!RJfX-3NhsW!y0WB-G7s33IN9AYOJkOSQIVMnP2);T!Cwdoqx!O z%@=*o=z6Hf1($|YOHYE??=>1!%NbKU(YiIMwIRMiz6bqlJU=LJSDLz_NfjMAzdFiB_<}!r(lgC=&Sgv9IYMs$i=|QAJ1$UCaI)I~XKW z;Jig^6`olnwu~ij*h;~QiVZ*pWr#O<1}caIV@OD!N`@;LHfO}(;id_>(Q86A zFr{_ed4huv4tYvUrcKBkpV_RzmUc>=X;iBlG{UKyMszM7POW)`Yt)0trD53;%65ml zulVXC%;|;Vt-R~!nOZ7J0V-^7GUrUj5$W?d7!)~6wbBU{dD}<;Rgw}lxL)T<>~U}E zT8CyV6U)ST>`>W&B(6cd2I@6L4-ZOa^AGm3lF$eAKt`{RJqE@YA_#z}fnfZ##C)3u zru9%S!B`%sNUSf=>v{R!VvyRS1uUFnYM;a$i&>=Eomyk;qqycD{W2;}xqrU~vVzv$ z|LL(ktuRebn)S8!A@rK18_BvJ)7X0&s`KEYmWNpKXTr8)T>3HArT0Vl>x3GyYlLd= zA?dggf*54fDm69#&?RW#C9>_XfD`Wu@=S z1`-cH4ptyecGC%CBA)FcC>^Cylqf?B%OOJ;A{<&KanTyLp96)WCuSDscXJD@>6B_+ zXPr)`z9zzEk%6z%a>Ebx#scP)8{7S;Qv-e+}B zK-cS4iTZx~?Kj+RH@v>S_O)dfuTUH}WSG(HNTXsAstCIQ^Dsb=KBjzc8JY<3&oB`% z=K^D7cvOc$Tc_g`K10~i93bZttKu>TaiI+?X52=Rhcgf+KM^CSw^mz5E(XC-q^dU_ z@a#Buw!7z#l&9mMsEZkdlw$)enLP^C5~-Cb(*|xFrZvE{{Y;#h{6GW^jQxv7Bz_sF zt!YDuGg7YD*Z}E6fOQT&1bF47uj)SO5rOKyIYxqb7rHH8zJ8Ao-}fGEtQ$o1wej9y z``#mFS2~B6hT$@C-GV661sS zwi6|~fWQPy@x+l!4h9a+2Hsxw-ZfZcBfG#we$*Be7KpTKeH1f{21)9`FyS(YC6*5h|UWZ70L zMV+D$Q8IIHPRRPslUSQ6wtEB`3C*G>(!Ap{JF23cR;oXU@>+V|A?FP6nMMe6LUR_A zyf!Y;b+G%Gp9$~u?742jl0CE=9S$a!W85_jvl|P;157jU!S{2n#NbGuH-^xu*e5p3 zp*9i=Ei3o7++c!Fn?zCVF;6016oHfT7R~K@9ymr&@2B33M%uj(yw}#xM7_r-&wafk zac$#!(n>#A_FL&YIIiKO7iMH#CP8vxGF$I>(n$JIr%btF^|Jz0*4)IWc( z*=jeF?b`P-lKx05ALq5B$V&P)Qg6%m)ivU_Z7^*&SnK)8k-l||gWjVN_w_WT1ZVeH zQcY0N1_8M~)U(!UwqErl>|luWUY>K>8wW#fYcQ1!ex?rQ9}zVlUw^4A=&!pFtG0?# zTPM1afSwFSCGANrtu$Eg`d$=cq&_5z#gAgDJ$1MB&$Rm(c#kx86i1<1)RKlijO^#u z0>POfic5=#WiEn)QNc2}LWns>W1#Mx>3#B0bU%kZMbfzua^I;yWe zK0Z)u#rLm&BGfK7X`-j5V~m0<^f<+d?w0Ef?>~Rwzy90*2V*_HeEW*e^Jh%#cwCmH zJNwV)GpmY8M3NGTHBR=_oxsu*`uX!G-rnBWNxVC&dE-H#K!g+DTx?aRPM%3>Mn#ZS4pY{ev zDaa|oiR(KTw5lBcwIM4pMNSF#YweB?a*l*CW4N&Ua#`@(Z@=N~_sD_T4|`B3UyMO2b8v9%?Z(wIDv9R8>+RihlXU& zj%A`lN*S%te-r5ph?9pkXPl-PIW;UB(Y9_MANcm=3p^;Qt=58VBchA(hME_Qc8o4k z+|%s_INFnvt#CPGnr0p(H+W0#WoroStDTj59xl5{EfHHt)hx~z!J^U-cA6$M=xp@F zMS_uCWFKhNeb~`a>wL)c-s60J!N#ii)^>;cvm9@&3SX9Ga5uHqI*CLV+EU~mv%l%^ zyT{Gs)Ov)0VS$?{kW0xpoh~G*U9KFJVBsC(Nu%d|dqYkI!OH=>!nuIPhn$U_c&(XE zq&Z?#kC=X)>#N-!BkHmZju;ulH6GMU?4l45o(*Y-B3@mmQVL4XzHTTbky6==Po!X{CUdYN7j(o<12Yk zuAFxo;dpca9&=TX^^V+UyMtwS0`>?a|mLz3=WpS^w8{9oz)s(9xe$ceh&{vhL9jfu$5Qq&*6#3!C->C0JOYYe!85DeC9B zL!+GpEN!^%Fm7lrNnNaoJ4YwCCWE9NgJ&KNdh+au=;D6A>2bV$U4+rHibzGe>@FQiB}o$7ar>6Igzph>ecTTm8DrLBOFMLB~w- zV`P%PzqFx4-*SHwW@)6G>|-NG1beNSAL z4eLUC=@h9(e!t%O`OL$>)kb;hwZRs^I2ND>-;D*W(U7yCps+ZpavX$ll)Ig_0uKl8 z8*)vsF~A!ZZB|fSIy-nr*ZKPKj+!0*>FpDIZ3uIqxJf?ypU-o5mg{|SU03=%%+Bc^ zNGW0ps+J>OsF5UM3(Al8bS^Rmc}pk~`Dg4N?ctajvLrNLkaEV>3jX-`iJK|-{`P_s zU-Q#^!d4qx2=JwL?0#t#CKVI|oP5L@CywT-h|a)xhg-ek<9_Q+)L<;O!Xkga5B@wH zq5(p)OrUAl)(qqVZyZOldFnshH>_|7G4`PsoF}7@H3Q*|&d_F9$BvG25f0~^VQPDz zwjA;Oa_-XfHGL23eM}P&<+m{g-ib(kA9SBir-6K?U4VV9$3AeE`bVF&^nQy&L!X8Q zsjt66rqDv5FIzCIs zy}mN}a~E6ed#wmVv?KNy7aTmFQ7r$NInr{?5dWx&c*pzdnS1F?;*&?8OMwJhp;N?f%jqR24pC?Y!| z@~fhK>p^TkZ%IAe@RSPVq_=HUJfimxU(;>dNC>0EXr_%M+h>$py3c$+ z0}sPGxi{o`+I>beO%uHHLm#w@%^QZEhuo8WeJgbk%{~Zcoby~8j9lZCjZgl0#{U`TrN~xbcv_MLeHihhV>^u9YQMZEemKdw9ao{;{B^lY57 zsJw=0`kD0mhG;N5_TzMf&(YkX*Wu&3O7F8g+~3Fb&phc>9BUbgT@q27>%vI%by(u7 zDF&R9MY<3tGd(^ihQC*XSmw zfm(*=_e*ULYnYHqho~w8C6pYa!8O717!Ul6-XpR1nxOOSy=0CeZ%U}u6I#@@kskfi z`AxO3VPC%*H*($IAy^;xhd%%BYt$&{OIvv$tm(SH9*8(vyf6KkV^4lCRC@ogPKFQ= zoPR=lt`9M0eGfCBxUVNIgtX^z&1Oqv+|7Tvu`KV|NQX-=kpnFZ*O$5*vTq* z`OlxHqrAXwKt*|3Ci^eEt5lW9gS=!MY|~E+@>>8Pi1Bm-qV>DP?%?a5x#6jJ)hD?T7*#zN~*|P!Q15xpTB)(R}pPgOV0S~U;j!Xf?DByBt@%9SklJL z7KhUuk+!AZXL3l+Ib%r;=kp2MvcawkrV#P^`ih!}EET4R(kkBH--m)ZdRlas`<;tG z8oJNZgtwPh1Xy@Wf-nG-H|I&Q>5N5iR5a`vrVT#2zHpzfBwRcUst>_0^AylDb84azLR=;a+szQUS41E z^Wz;kU-9MJcYNIb0_Qz89{f?ZxmS&1#^-5*vktRrIEcU!(O_FvTEFo|K|+ z95Kd)%EE(PiGADdH{?VDoGyfrtjd&8QpOY_zJ7YaG@miW3rZ>YxBvd%@W&s&<9@v% zT8oAP%dtgJoUW-D=V7?qq7!AmtUN0hiMm(Ff!$VJ%x1 zPL)#d#~&1DD5AE#81hUI6Krl8L`!|hsgUtNLqk0vHthqpoJbLSvzf?4(lA07WzwI^ zAc34fl5LGc)2dai`bE#MHI^DLxzb)^RCJ0S4nH__rBLNVQKLVMPO z+n$=!4LK(wmPw)3?2ZkULfuhZi8BscB_T-Oa=(VgIJ8_4tV6=yNZ(YXWZrmC=sdDT zFXpv)fCRKesq#J!!YhpjCh>_;je^jN>eA_Yd!bl!fraY_Mk4eOT}v0B(u^R-1UVIs z4VqmvR));l-Ni!G7J3aC-bQYg+TJu@*A=Gik$mL%bp10tHsZ%}L(Us2J0gmq0c@_cuTOJ;_nP|Q$L69U zxfoa&zJ88th?Fw6En!UwkwvPt6j*MarP^rkW*4uqBm&g#sKSRdqSx7nYF{SBw@`70v0)ebUM4KW9sEE>Cbb~m`+kLQGYekH6 zKZoEDS%IG3Z1{E9j@fR_u(Pb@zq5Sv55H+R5LkFfl)O`pcB50}Er9q;H z40^AXA=MbSwy&*%?j4;$92MaMqT!)dA#zd?i71H4YG# zXL1*b`du*M?1QLsaJndw1rhNK(OVAgxh^m{xal>NYaKhQWANy{-x0WD7Bq|Zo58x0 zBUfT1poAwCt=|EnrAv| z?*t3mT}jp&pi=(12*xcp?AKI?X2L^`lD1ApgK;pP&WJf@l$Blo!Qq8TziVneCMaG` z95YJm{;&6Ud_J8J!_@CD-H?-?V@yM^j_A2EWH&S@ko~6*Ra-;i^-_L|qt+RVIZW_V zM2sigx0PIzEY{4ZJx9D5i;^=+U16F>Z4|2tAAm}(;weT%A22Z$*Lnxnu-7*LOxv)O z1n(SP&KFu=79be|8w1)_u-+Fkghar*fP{h&CRA5@%<3E?rUIBmb#=)Za2A(o#wQo7jbEx2Dm!*vpq?DeE`EH5 z=I^Evp|2=%M_+t&^wR^G#y*dM0vk|-7SgwSrXw^QVg=e$eE2gAz0lx@V6a%V(6&*&J9+@l(}jqQ|eNL{aoZq|;GW#wR|&_fh!En4sAa{r*zr!fV#F9#LQ8LoRZk&0@@%7O)B z>~L0)-jeK14}zQ?cR`e13(M{1_8=NM{x`*1X8z2{Y2G7WkAxODSXS@^Pk%-+W|4>5 z+ps=pst46Kb*PE^`L;9!A7PE7Gn+GPemwEt4*)Vp-COmX*>3!KDqfcw)Ol1x6zf4e zFC=;H>CxxoI`#E9R6RzUNbClQ=uMA!((4vcTdDt1Q|@Qp)9EzOZKMy-1u-gOrYeEs zvv@CBS1hdY-H5B#{XJ2@)B7}gY>Xbp?!!Vn9r|~1!{NMiq(h1@#sYAjg-ns?+B&|6 zj8+qDu!@vs9)$1mvyL%YeIIfT&U-Q#s`EkL>rF$c87)_oO0j%H{D-W8>hpfK7wWnN zpjm_%HUXftLPE`LA@YNWznFUBqk}89uRj>feXgHR_ox~YzSCUN^**IG)OqjWxz2LV zpz*#(eT)jU0s|Jf7_a)*29Ax2J&IA8#kJXN7foCB*^D&|321~0Rp5Pq4@}1{ZP-U) z$PjikrZhJ6IwmsK%GU#JxR5))+nj03ZNKL_t({j%5DWmJJ)zX=Wc_;V=^8aiD$#>nTzW8|ah&s)hA@EAl1GQ_U}_E%?r{k)88Nm0=<=4o8bex_~x zI$f{VE?8~3@;QNLoGXdQFio9QR+*OCn95|Vp)%FeUZLr2I{}TNgfbhX{`R-O;qCJ$ zI%nMPNTuN18q7?BM040z`nsd~F*#>Am`+b`Y+@-XQQx{%{@uDM%r^9UbRc5tULb!y zAv6@!hqya)5bTQC^JyHUh;`aXX4%&+^!IfXSV)Yn7D?>StnH#4`a8RzzVM8AFb&H0 z6Oxgo8VSn8Nqwn`7*!mUd5k7Ht{Zp~sgz~bf?b461Wbl-Lgo)d3T}|-r^LM?ijo&X z3=u=o34zDRSqBGiIIV!69dD_RWMR-0P5x*u8w?fv_42hMLNhRM*25Y*#HwmBQIm8T zru{d4|8iXK-fJtJ1ZLVUx<8VT`+nZQGuZL`bQIz~ocY+-(Ioa2Tmn1W`ypUctzk-@ zg+V^_Jw+IK6kB`m;s5fNzu?=qZ}|G{8@_z~gv;fEpFe;0Cc=*&Kk(zn4_vQTeERgM zyTi2_S02K*w>P}Ky$xBQ(==fY5#}O}=8BdZ*4rIF-hW}bUh(?*6TI>G^Pm0+snD?0 zb4)_b1ycz4_T?+4IqV8zRUC-QS*SJ?PvQIFcst8RaEQ(GieJrU(gkid6uf4>G6I3IFo1{~Nixlw)4#3pB9F zv>EayD+Qi0whtzc4ewz%LB74%U;yfHsp89!u0WRqk~GbJ*tE9 zKr6f7=$~kW%QK8gcg^6oExcLN=e#TnYReqsvTrQc>lL@#jSmp?P$#608kI#G3fo2n zQKqIHyLd$juQ6nLfumxSn!aop%?xgR+ z3hU6gQLY>C+C?f0_k5c0-Tw){m%r={cJI0Xrx_ZEZwn#Nq9-pawp>v2-aN=c zrLmQHjb;?h!0a(l&5RTpYw10N0Mw#HH#2>G$`sEMF##vW39y8m7u2OQG$74ef}bK#Dk}6QlaX6Rlw#i+ z1SUQ;arSY%9xMqDN-6M%yhUkbIm<)lyiv5DeL=7%oKIBX)>0^MIAz>^zT+}Q%4&7Q zMWOuk0#h?eEpV*@@NlqjrjX|5;{(lm#1K%Ig@_%-!d4n!q*k#k8$7#PbrYttBhX^c zT9v4}+6qO;n8vRAJUCf}xF+N`=OR1I_Jh857ByAfU9VT9lzM|r4*n9m;GE$Cb9e6T zPDvWjX!02iB}d0h%VQI{AG{oTO;D>K^Agro4v|*5)+u&{gqwE2(e}@~q7Mw{zYR@_v!U6_*jLA-DD7C6 z>}O4F5d^-_i}Zozhzi$v%tTeW53~;j0H*=E1Qm_ibh|igOOHudgJOI1pZF=sz~+rE@{A5l@GS(u~&EN3WIgtd^4Y z=g6*zVeYSAH^OwCray;Wyj!qssf#eRsAk)UmgkHeVp23|iVTJlO=1Tj!oH{Yhlam2 zfAktEBA;P!Vn$&vMGu&cnNLh}Xx3s`nFuH%S4#s8(<(|ya3P|h;C9=39N2wXaK6kG zbL#gda5I(2i7BDf1ml30w^y{8?w9xL2QDGt{Q5HNV{}gjUT^I_K+(?JI*QY3DcwCQ z&(?4b;C0Y*&%rdHl9U#eJ5eD7G@()$hiplJ;=IS%pWzyb5m9N#oO4Ds4aPbIX8|Af zK?>>k5RF4~4K+;N$?dH}v<@hI{X+n%VNx2^`6*{)V`2P66e1Brr;MC|3=89CChmC# zolt{y+cKuf5j3>#NpzlREZ*)S?D9x3JgzlFD6#_`Lf5t0!K-TwSr_!Wb|gS)QjPxk z^117?o7^AzXLPq}P7j2+rhUqxh2I{YGb_u64a#mt(0iZ04n+x1j*j+y&F6st##q3e{INfG`m-1X^cKsO zd#n~cXTCS>Kz`8zPkG%!?va{I)&~(26RCeEs^}O(>A3@ScrIihd8Fna#TfhE zv)5wYI^>!kt_xk))FVyDh!E2aK6L-AJ&vywqFOr_&<+B9Is0rI(H_oc5}FAaWEZuL zVh>G*(G=(2WAEaL{k;<@Uqs3{?9pa8J3-7*2m030l%V&2F)3)WhZX<|)l$ciNPW?T zVpgbwj)hq>j7dC1%v~I(*T!SqvVLuvBzB~U$vyx^+tJT5P~o^pefBp7h&Jw2SmSWtRvOypf@U3}^N61JcusFv z^EO2CNmOVjhVuU5&0e?Z>!bJ1T{stdowCpP9DlB1C&Y9kh*h=1Nak&A6fcSR%$boK z+vCHS#B((F=w8V@&&W(}+_nu+*K^Fk}T5v0#tnXbI2HPnIJrE536ck2G=KxKg}QVONH#PNC7{W0AK>#wb0AZp2VmSKPQXj7S zGg@$KvX9n5_%F|LJ4B9a6Q;x=9iM#>)adKK@3*74L9gdeMY|7?tv!5A32L%B)44r~ zMu~mpT6bY{8>93dD2WCKlNHamjp;_-k?d#T9S~w9QB5n@N*?NK9ig}PzU*MysC<8m zn7JLOhR^85`s~?XkF(u~cNDxI(=VP0s-BT#Mx$F*#$-Iuyfgt{8{>{NM7=*9YvkiO z_$Yim((y)esU0HDjf$D?6teziOM*qf<#K^@js^(E;C{dN!)VTRa6s$g!#YyV&X*IW z`w7N7EGeV>_(6DD%TWQjVB0b&isOky4@<(=w=ekq{X0@E`1Iv7-1!wK88LERG%LAE z%E->Z1a_Po3+s00cFPpA5^R8cX+J@|YI7Ru?0MQLr=h_0J|LVg zK+Y)qK&B07CiMb#S7^!yO^trRJI&#Qx63D7E^j~~dQjOa7ZILsf(BzaUZZ8)?`v1X z1{;XXquf^3_--1isiM`k<3QnX;%F>W8!99h%_D6E&eOtEGCg$X(+MF2+;0nVDkyn> zKtc!|NiFdcf*#&BV4fqUDbV0nh6={gg2wkmZ;~tt&iOqbH)VYMddIrmaXz2XszLOD z{(dH6P-W6a;YB<$&4&i(32ULBSyP5X!>5-EXUftr^Vg4`aNgkce8Knc-#dN7y2`3Z z3tOr9x_$h_@4x?snIkp&LJrCRKAq3_^7R{HoM5fNdb?xYHux~1+JaUE?@CcK1L6=4 zn>f@nJ)_I@hGii^)0Zz__Kn&*!|qK&mX9kimVs& zO3o?A1OslM&F2}2Gl^2XIN&&M9gYYwu>3U>#WLZJ%bc)mfg0I{hT$Oub^&tZNHv{) zeZ1rSSFBdvo7XxoSoOPsZUlNgKg58^n^9&9|2b!lIP0l2s5%EoF zfc1L=QXV$bNXW*j)83rSnch1Kb3&~M(+Q_j?sPHdc@tHH8EHy{DfY}vq6XDL?DzH4 zXIk5XM+j3N0_ME!jS2w9lkm_uhf|y|pCT*_wrzoFd#0o}7Qxe|l)AE>^4F^|FwXJp z&LEzMx&r?D#sVp=u;8Ip10B@1gzJxASXXMaI~aU^{ft&KEE?u1A}1Pzl(eDd4bEB2 zF_20>QKU%1Mh$i!Fuh&i%?W4~_n&{mH6_^TjLVnLXo(tbY2E1h={$Q?EaY4}T2E*m ztx@yeI*VLJ^rjrX8Y``Rvj~O~EWP(gOyR2Fe9qcBfkNVCEDvZTMnV@@c}r-Zy;lx5 zwEnl=G_18E%OKe~CROCI=oL|B1Ly0G!=A|ptfj)3Jx0eEgT}6GI;5RD-ECc07|`$n z079HO#=&#sqeX}(&J3lpmg1l&E?^2LH2MxGwUX#j@-JbAAzLr#RkN~3AFzXKW$boK z=uSC0Tu75E^cX~PraIIr_+4?}RBU;VYH~568ln@BtGuA_o*JFUb-DMo#>YU;{0eN_ zifJOWf6ImG2;A^%4$)1x=cU&UAp~wrtgvwX`y21zEa9&WOc(xGV^K{V3VfMV2${ke zuMR3Q;*?`~Z?rql2N_cVvmb7B^Fs)M-VzDwG`sG`Hj0$wy+^KGuo~N4sB~X} zi6jjbu;3oKXAGwKD&=HihjkWF+miWf&^$PPz1PQf^fR3U8!Mck0M?}<=yGz2m%*_F* z^F$zu^tO>3vX(;R#@gT}OM?>@>S8X4XYNUE=LPN8IIL0v5#u%!Zm$V^qBdIBXe-L$7ElRK44|x1qoXWQYpw~>+3kZZp#A$X=s^Fn-YgL-FHk9@)o9fO#C(S z9A^<5DWt7&wnqRnj*V!KwUWc%(fLC@uhGF(IRb@VbA?5)0igwywBzS%%S2Z#LKLM|E3I~v&AU1UR|(8hHJ-(x6fMjEdcqS7#qI)#}@ ze!&IgmQf7-tkz7AyAu)P?RM*V>m@gqL^H{N1stgsY&m0H>7EFdgn!752iFesJfWiD zcDv!eu88x5W-O|$u)*W<@MqblLnM^tq}QYu9fITwsb05kAhQ;Y*`QFz7rA%i61;abr#k*!1^8^DtnLYho@=k zVsN2%9t9$r#N{oW84LW-FweORq8>fS?{0V|UCLl4rG$06bAQHBEmP19WiW!b#VckfV zbCv;6xtB*Zi|h0W60w(FYYAbkGx33$ z`uRp`slYK4dQb1y-5Odmc&O3uH$y^8l-eml1NF+sy>_%7x#l4nrwi;v&;bi){b0g8 zMpNp@5Tam`lNoInY8e*j(78ImSjRO1_!^P9N(5!bP_!|FTj6gS`=m>fq``kgW& z^=^zrH>GvLp*0|cJ$_k8?ty#QHqd$hd?BhY@IQ$N(Oj!{tuq0a1{ z&BLudaflOzxzHC3&VEgPX)O=pQ9x)~Byii$2Nu>=UW>`lE9O+o;)OX(Fjc5+RO@(N z$Hlm*?|%_tlv3c0fp?B-FeQ3|rZhN<$VQ!Mn)_a8ES;e<;ra(dTjAPk z7FBsR;mAz!#H1l@Sb9bVJPMHZ{tP{P!8+0(^diP_%A-6UBmCAk(lAJm4&D4#y(u)~>0izzkrUc}R- z(43rL5xlPUXrE(zV&;<>c7tD);$SE83g~vDOqrOvJ z>jyOYjbRayhV1!#rbWd$;BV(0T2DX;kT{sVa}NO{G2 z&p1yLPUi`&RONW$O>G*lkEoWNV7+X^r%$hVeSM|RPoED0$UoX;~iJN84MVDIL6h6#Si{uF_YII!21K9^6QK8^Pt{~S69 z`aUSwwyh6dYpwY0KmLM`_Zwbb-e9f4^?L1?dgmO%G?A#yDfKpQo;D>Ctn|nvZmLB` zEA_TgBR57CpRn7l6kyA+f;EMs0WKfXQ=*8u*S9y^KHl-$@Be|{|Kkt*ynXbDyxVfe z^?t`Zp9cqZj1lp4qDI)dVp$VTZvpeT{Ke)zc;f}ZF~TS zS`MU|F4iHYC0t5);e#Zh_cK}=v);wo+7;r3T`KI*m(PBh{GfIwhks@dE7#D$V=^mGp$RFk%6tjHzU2fUf?;7n=7^U2o7?{Q-jT0Y8=X5aJgI<6IyY-FPH-m8At7$ zLyR6o%&WafEHxo#&fm5HY28q4?L~tW7%2gHTX_&>x=8kZU;A_2V;L%~r>FComDlA# z-90!^`2XGS_dYn#B!N=f5Vs={NXJ}dohK^$h;|Oid(nlt-ZT4JWk*Vl77a+@qfyU8 zVW1#oeC}*^ubu8BcwPwr(f0o~@os)8pmz2B1O~(}IC=K~c=6PmOe&gYj zLn*uK>gd`&Is&CBE8p*Ox%7stcEQQ#eT+8K>xcYIaii*cYoAfNE-*Rf2k$XX_5nxU z2UG|5r1zehqO~Hkpia9^hg|J~PT!H*S;XhZXI#HuE%=}zqg7D?Bc%JCA!DeKcDvnrJgVHo-h0$c(SA8+iimX%g~?cY?{&e$Wg^Ee z+lrUq;n?NuLxe@eW(<7I*s|OYtO4|veE_tsJ44a7@;NRXhb04gA)|?d(ZHhSjC^Rg za^@$3u>-BH8o)b`teo?u0&CeY*?<7gslOcc!5)Qm%Wyd(S{@Y5WaKK%z)DlySn@wG zd9fLT%AY;Jgn?GZ{YLIP5gF9c6>3xi+^Vx!cSiT&HPo>(*TN&7U!&o1puTAr`XQHv=``&@^zwIq zHT>gW#ytNbF`bm6M6vb|iPN6C8jpmbqszHFP}R@XktMpWkbC4vA<Uo$bLc-n%K2VeT_i^^&oOFzB83V zj@I0fe5q?D9qFN;y_|EWU`7@!9o^Oa-c&=`p;oYFaLRUvIvVePQ;*H?&Xbuc1Xv$> z{i?dCy@su zQL;UduH<{lXQ{<$aQIogryzyI(EZa z3xm?n-6DF^k<$JAV%>0_(nL|cpZ0l0C-jVQBS&Fmt^43o-e-)lKOee>a{RmcUOcW> zU2t^}Cu&g*ou68tNsz$ZJ`g{5fu>q-Ky|E#SG@(>`v=EoxZl^RUnXXVV+_2Gv+I4n z!`bJ!H`KC610K&l`g1B}Cp?U#Qj8>qy74_nCdpbr0yEE|DvsF}u~rBkCpLC#qn8k8 zHKoBh2U8x21|*gW!(3;Y#@=NsW52II-)28c>z={0h(f*Qc<)hi8=etOb#rd7D~H5~ zUb~HF-@UGEPxn%}KQysHlX3g`HPV9+K_*)?n^~gtMjP>5b!aUvU_JoiMZ*7lZw7g$^ z`}U2lQ8PGA6O3~RQ|xtzJ&2I{-oek2?0J373w|(LN?-L^#I~+k^w~l8XtkL389DhV zG(Gm)v>8xDhxEPeK%9~9t=FR}5v;17ko8R)u#Pp8re*JS)p$lLr42m_IUf8y@?w#? z)7ioFH%+#S?}e1E_aDP^mxi6pCZLBs@z%mZ1bcqCC;Pr+NT^a;9qK(T>d~L4{yc{M zZ^J;HH_dj^mHZst4{C<`1tL(crtOiw!0e~gv*>-7lQzt7b8g$#<0JrJiXOpx z)abi%T}TDM1Z#bFCCkknW9)Gem4~5q;R{m>*5yuzi5N(*<1BJcSnfAWQ=|{;*AFb~ zf{*uiY$;*R6HYG|DsXu~<%~hDz;Y*o0fr1$764c?x=2dn0&m6p`!BRcu^KK0xESC) zHR$H~%n!|mQt0o#o-d?o-Zrf3odh6r6jKo$M^^$X`*aJgLiut*l)ZEIceO;lZj2Fp<|6u-L?lv%Lbj9yA1o{{65`kgXcP3-;xtVth1@=thnJ^`97EUJ9Y6m1 z2VjW8f^FP%w=DoiLAbv6=Cp`bjHMj7v~EDDI8QTH&|x`vJ7Cr1p_H8I)8&NuJmXK_ zzvJ!g4eRYrgUTAac;*PRe`@rb(@`BTJ#>dA8wrydGmBZz7L9G$Le*M}7VJ-Kl z8UR>x!n!P7q_nOZ?)N+H_d9O)57b)m{rmT>WT#?x#&kYmnj>Niq!w-!RvgH+0+~f5 zTP9-5D`8zxI08zqYp0T<}Ci8#hN>IQRMTo=_; z77a&{rPv8I#C|9{rrY&miy*%Caq0dS|2 z!HCGL%(~UxBUk4Czoli~y61K7QcGrJ1Q&Mzw#|d88q~~LBRwNiA|aK*Af4`j!A$k& zSqc+;g7+vn;1(0s8|^=T{^eg#b3sPxqC-q2)m)5`l!>r#Y(1a$3~QyRT#;2_CU%=* zTWFkZafg&2%uZgcK6PxfUz*)9<>DSiy}`am02`ACqROyEV}TpV!-hV?N*kc^{Jv|h zTL&BZ!J#!3s2P@HwG0fYEJ|%^YvW9dSCJ;(vO zAys^iYH(nC=LZyv6k{Wo7*;fr?P)~KwZ&Y75XjN0kW$1;Y>|*eONO6`7-L~5)86zT zvf-iYWGBishv{QuSh;0H0aG|n)S9~nw3Gr9TvPHnN3SogZx!TrVF&jBagU=RnQ0AP z7tw@6`J$cAj;74D`x2St9K7eK$qG{olTuCRHq+D5DA2CT6{Zrj&xI5>^~T zBO99bU5U}7NIY`gIcng1kn37Bmu-amQVz0Ii?}m%&m`8P8X_GOjybBybRdiEgF>6zh4srHK|iTWA7$hE|-pg zJ;n(~=qKgfwy?)MsZK1U2PGMB0c2$5@nVOQA7YmP_f-Oc=W8kL=^J!_yE$idSCIykR1v^AkTDPSh zq?%j_9Mr(&;RBjD(xf-Df03Xn?)y~GY%XPP@*dj>daqq9=C+9l52oo64d<ug3sSbty~Vnote&gH9XhHhTt!9#s%b8IeVkb@0Fgn5kZRif1PLM| zpTS}J__G>kRjh3#H?ZN^(c~7XtH#LGF(PpkihM+(66N;z^C>0No$5s0kLH}4ctXUi zwvmlI>_p-=TMZ%)KP@bR3vI|?x$f9E?$JFBRb*(Wi5DVRkTdikLKBf^jCrA&&b4}K zj9Bj7Aj^j_uHN5^a|Bbh!6SS?5Z4&{As8qvTAJ3YX^LiYe&@Y-I-yk44TUrrXe3=6 z_cu3319_gty+ejGDJ8hs0YVNfn)seNW%L+j(1ymP-iZN5r!;Zw@ZPr=Xo|BshO}A$ zB967)5YA$707esMX`)jtb%-MA-?x4~b(G*p9FjfY%8BC>5n=n@-&oUnWmtnOy^~|Ne?^?q{kk4L>VbRf zmmK4rohZ7Z+CKWXu;_4I*Y-VvYmieU?<-#BXTJ6Q+KFhIN{g$NGm_$s4kyK0E2m{-C8Yp&)>Wt%j5R#nq z_O0e{=y0*IS0zuHgi_31gy1+_mO7d48}~u!)|{c_oYWXhb0FI}0*OgNDY9#tCjyye zva*3;v%#J~+=z-Ck$Vsj=o(qLhF7-e996$c{c@axr8`f@x#<`QFWO}7pwrbuYF`p( zJiV{W9+-m%m>AjZe>l!bYfU3bS@id%xj?1VopZSwSX4Mu@o+jf;h{KF&&xvhYfGr* zh=MbY5&^tCgM4miEOT@umbh3UC+WIsjF!?E2a!lBdfuHTh@|nhJ># zwONOvq>Ky$qeOpNpgIbrYc6dTR_;hDhI`7|>aCJ1xr;gn6HFt)h}iOQ($n*Fe|L|@ zy-4Fom6I=up_!B|+~1bk2}?3+JNr8a8-*7Nb|eWao?ZRDFeSf!{frO-Uf-|y{rBIS z>Nfbp&dAtG>MVG?yu5IB;@pT6)>_1!0rymJxm+;Kq=YG%0Q1P~{Fj#(TrL-!mlK>f z@L@W#33EX$6y;>t`nZ-tmOzeKh+;1#&1fwh>#iLVftcnigZS3a5Mo)D25KzJf*2z% zmy1$^^~wyg@pte(;C8#=`}gkvfWQ2g{{}Y&iUx2F8L4HL@B7}e%5|egOuN(-;g64x zSWYLbw_9U;l06tYX0f(R7iR+k*A3#%P3%N5TQo>LVmAK%_rG`6#QLzQIC2R?2#D*3 zzy0lRsI}r>|Mh>z<#NHgu6TKQ!MAVUV2r`}e8%N;p&?=Dl>vsYqhv<5SO@`93%cT4 z8qt_Mfojkb;)amAuH}?=g)cT@?c2Ol+xZ}9P}Y`yWQ}g|M{N? z6EV@3`P_bnfT-H8A%VfA#f%ts6*30IShlqlHQokxKJHzWa?betnWE3;IbaVHZ6zh) zdVNFU*Cpkr!M5GFSg}q0+U|dhs5!NU>h0|f-cyvybYcc|rs%W0$EKtZWo;=1m&eCu z|0t>}JA0TEnQ(VQtr?fg6E{K!vv-;%YYq(Gq&vpWMB>frjlb#=C2p$uuL;Tm|>YP;KLIE4>@DM zZP-!16{U5*KPhb9oy2ub-tFy>LlkSVd9EfZv1e8`(mx7o# zcr(E|59fp+$^$~SyIl9kjm^@|a8V65Hv!lN%+nc>;DT=%*vIq4*84TLf@{nV*Xkfy zXU(S6O>H<}?LqJq<&i!s{+ZqQI8bdTfe__xJbau%}%EmSw@ZuDIQ9aKSeR8&Q(wEQB@RzOGenavr9% zD-{O=F9R!IGRNQFZn&-QEh0_SSK4Zyl;`(=4cRjH_U^I=U9Z;;G-&L8eip>#Ko1PH z%1yv6Juv9%B$!TJ+TN1_qsM1jt7&xP6}Tpl`h(6P(-CeY!@Jq#W^}Kq6)2j7BH)3% z);!M~Lua}g!CC?CYIAQJo4Z<%#?121%HFD-SVT=Ejsc~VR%^@Jml{ng0-MW|0zxRJ z_ps{Ly$t@w z_Yit^LL)EfA;w3!<_Gakff65Nfy??7a8J9e8Q8Yh%DvJ~oO)jrcfHZ(Sf39~F`Dun z!AP!6XK4+|%Px2M(DK~tVU}D|J-|2sH5J8Cd(chpNzSDk%B7NqfwJvhS3AGav)e0v zWY5!<%%fAB-oxaXh#cqJMbWYHk`(sGb2z%oNi?(m9Q(eLC9wj1v|EiRpq;Z6lNdaZ zcTy6Tf?L}0_I^VG4IK>Ez5<5jOyJC(Blb06FC3TQE!MbV2`7p*^&~!`XU;WsH!PUs zM#H_pkpeIkxn{(&qjD@%iV>zPKrXmmuXuQP!1MDn&gV0`71cYntE>@gda&?_0ZO=B zE_n76ia~Su*&ADiLY7549p2cx`n0#D$KYUPI>#l6*cH(8 zaFXLauO8&Q&I!@rPJyhS%j561+jqrz?QSSB5Gkb2IO1jb+4QCjh@^K9A;47@dPqdE zv-b`)qAvJ<^FR6i=FH#@fAob#IT%Hz)U|i3M+{gT7#i@}4O1(IXRGfI^dLo( z`o?GOP|CaZcX2k9bs$4ztp?Tv7q22HtPv1B^zLhF|Ce)JUSIGhU9aeYgs%JbV7L)V zT_2e<4s%AOvUXt9nCDn4jl^OZUeoXENxK~YuE;wFo_S!f+NsVtJCJW!S={O&s?U&R zz<2L#G!myY*<~E?>Aq|H*)f)8R9JWJgr#>tl{!k!xZAek>FKGR^MP?j8Bpt={fO|@ z9Csw%i2MC*+YX{J5B^%Lv2!1~&T2x2tWSMr%lhs}wZjlg3n-kU$N^2{X|LAQ-9Mk2T2|!~QA`7UJ445~=j>)(ZLDqEQL6(b1>PS&juEwN^YlJlqY2 z{+TO|IOpiKBMNU#1lK*cuBqwVu>F3*Bt+f2>FX3UBb zpCJrxrL;#ny>h7{hK=?6@ho zwZ_u)d8WybavkJst|`I6z^GU(d5#;7QSo7KC})6nFVfHQ-Lu~IJ$rY~$~ma-qp{}0 z9{9lMN{hE2U2Ns|X(5bu6VdnPhy%SR(vA))V-%q7*L9C8PTTq%l06}+^-AA6%ymC- z8Q0_stD@|+uw!(*XmMOHck5Ee-Is zxB6?V-IBZ_{z-h2QBJ%c;k)B~YED-J!C4{)H4%k=FOy0KN2cSvtRLd#<^xwDeU2UP z$#zbW2+?YIJC{Fimuv3gO$PRx;(t zy<1-`rHl6)iE|y#Mu@5^_NaAV)0&#aLQ`%(Qeo^>NJObhh9J!U#S z=Zwqc(rgyD+lu$MH(V}fEc0QF7Cb3jQcAep-ZA@t%jt|cOh<-WE?BQuyuG|&@)PE1 zqNb#<>Wi7wrUJoR1aAq5Nq}D_Ou?b-8;};5DZuYL79X%oGY~jqJ7r>>4qBF6goRaG zb5u%2UYTWBfnXh+qsWk0D;^&oIh%_}3bPNCp=}+CE3Kj2whhksrpP|c3!a~!o1;%t zm3KF}G+S^wlrn?x+N=ka4g8S{KnOv__% z9#et!1-EU*|MlnzvHK`zu^7tN{R^M zFfV81m{2mX#Yp*wrG=p}nJFL&leMCeW4sG6u-I9tEsI)Mi`y2Ls;|y>IKh52N6+&R!;2qTvc}N(7Mp?5PI9OL269Vr5&VQ&D)yLI zP-ZaKitGCgZ`XHNXW<9k;5BeocE zemLXt`4Ok-)H1w{sfeXE#j>bH$=;iDj>Ck)q@efrcPwvjm`@AkjV8)$-O>u|H)@t_ zX!g*~%rM*9o~z8cmR8o@^$M7R^ZAU=pFd;WH~8Rjy}n~zZ+Ln6fv4wZE)+;LV6uU6 z2Di6&ir}#o+x3Q0fQxg$6p*(S*dp9K1D7-9AeJle_6D3DIIhZbwhw?D!2!xt1Z9cG?UOoa_Z1ToH$`vI$XZ6(my2_v@^qU0Kt<4z4R?^k=GOxxK9 ztk;eH%~)1s(|$+}9-gfKV!`+KKX5ud;Op0~^!qZYxHBS3j-(!DoBvd3@GC{_z9+J* zXX2{i;inf;#hy_zfmYVgP+FpYQUW|PdvmHNroh?IfJ|d7tnuu6;2Ox;+1^$QRLTc- zHt=~kwMZ;$Egl{ox`KIB1dVDYUHmknikEYlNWm2jmOo3*shuYpn36)gizyNt&iQy2 z_HAp;cN^+u%FInE9)&6l3TH#7RPgq8MUF%|h9%Ms5q2l+iCid<6Vkpn$F*t--rnAj znH1?v4`c_B%Z?~2y|T)dp}we_Pzps=R(0*Ng>@d@I;2ujA<8L^HsRq?a30K8Z-WNy zj%S2SlkV;Dbt9zTdl&P?S+1Q!K?Q6jx1kYq7BWZIK-Y>=cu;DDJhI){o$BT(=iGsL zt*I*JPywT&?1ux$vMh}(6}J^ZMKKr#S^Pw#%*;QhK|1K67ZUPUo2m`WgM`}7il$-#?RY%9ah(b#@Yf|$F zNuks%#y5x6v>}Hq=MRFFR&3kC`=${tX>QIe;$R{mL-%vWkUEG^@<-qe&BMs;PLVC zh=fWBTa37E8=|O7K~9pnR(NYMPZKO#!pk0AG7u&r{HK&K2O?TZQ<-yVYB`>0NAz$=I0yNU$jWU^pGR7qM$Qnmv;S{HCDpTZQD3!>d6L)D!w3Ul-L7qTK9c%+P{y?T z*Hl{SuIcdI001BWNkl=J^V1||++gX>5|M`Vnk zQ|``YSnv5s4HUL*>j-exiHpkA?w5`Vpzm=A(}dZQ1EvqQcP<0Fc{E40f*3PO+2NT; zl-0Uk+0A7npcKQF_bDP3QV!qZj&+Y%&S!w@*kCMDP3#;AL>@9F!;19a5p%`5@0gc> zTq3+(D4GbhDa$I8X=y*Pm_k5_JDf3CyuSmv!Vn82&oQ}1B>)p)GMQ7$Z3Sv!1%6NZ zlh1#-T&M?+iOAO8A-16oiG;j!h>a*~fJ%TFO2S?;R#Q-egPA;Rj7TA|0u)^194hAu z&Q9kjsAXBO?i(iWaoZwtObEu}ayrAJ;+l`OP>e&&L^?{Q!l9t#9kBo=XIQS&9?FbI zQ*nYpG8NTXBxA7c36nS@dXW17J3%BpR3jHTFwtUND{LdzXaLbvs6Cc@GL%N%kv&^n3gj6}%8}}x z!(y63aGDfJ*9ign1^!PCbC{6!*!IX0BdqsFl(G3B@~QiM|BK`r?yGpwOTpO_b>y|J z1=yL|8$;LDnKoeRoq5oyqK#7K=A1c}TZ8O97_QHoQ8h^eT-)5e#<&7Kh|>{vwf5w5 z8FqJourWyNMB3^qYha4(X&I^JCLU|GxTTt_R9f4{ssV8-JbVt#QAF0+JRbwyaqyte z<>ND1MBZy9mVs*D+}wv65kke%00pHaD$uf*A5B*l%x^pWr}e$NQvizCAcr}qA}gQr9)x7u7qGRe?gaBg|s;5bL@C8MxVC&-Xp`spgQx)9$zQYtXDbP-cjm)7Ql6+&N69m7qzCa#N| z9i1*T@kxI@vuMH_->tV}{nJ{lD2z9dfCZk;nNlkZTyrAJQj?hi=Sj4BxHlUZL+j33 z!r~=@P-;Q#HY|~Ax_)b9a%&M=lw@YSp`g}C(GM_4NHEoW7~7|#bOcio@`YUARk?k( zdon~U$p6-LZvw~=EMhK*xxlDcU}FsCFtyjw{gf5~c<+&89`2b4V{&urC;YiI{KTNP zAuU@b9M3~B{Xp9hhSs7#oF(yECD$A{!k8Ksq|Rk$Lvx#4m{3z1W<;*!KDbuHhY$dc zv-Q@&+5&6i;Y6z!sNXpWl6N~;mlSLCWp-H%G-lnc$&#YI=G3Q)P0-%n0myX ziz|jRwh@^FJ6SvaBT>CA)}`D#ceDs}jVD&z5mxnj(&Smeb#k^Xt_~NF^g~R13Ml?&k&VEUpGD^aytZ;>6C& z7G$PC!qb4_?%lY%2u5pQ1EoJeBCOQ9(}^?7vb5(`&KHf-$bK`Pf%VaObJ0*eRoES-6Z>*KR4uJRhx^Dr?F1yf-hnR}b`!2G zBGhoN^r5Jj`(Rth$b^J4nnYT#OJq2JQcEY2qnh(@v(+`6+&9A8a__z;5e6*6kvWpa z?|Zj-xpW79CIS-iROkpf6&<+>Dg{UrPRDb-Imu@dmKRjm+>`wL=g*%pO&&j9{=mzR zH%!yg9w-CD;?S^0M zuee+;*tZSKy1^QQ>)ShR{4)Ur5y$X_z}nQ9)kG*bhzdF*UN&=TNC`~XZa26P5W?K4 zUv=)K9KsZv(_8v}`t%9s%R{p~uF1kN!&h%Qn#CqyqS(J3jUFqP-`@{)h;zJ3l;xN) zaDz&5+csRUS8^?wPk4WS#kQu#%*{C?C*Ryo^!p;k)xDZf9*D1BzvBIcB6{B5-e8Qu z!@~n@wzst@RQ2bqqk2>+x3m&k7tqES{P^($#u)tk^Unw&VBc0evTF*d$AsZsn|;6Y z1}S4uq0<^{Q8I=|M&c?X*HPBBfK2ipFXuCU{qNUTi7pfItybhnLzHQnkazmM>$>9k`MKRkY2J6xfM8p91V7<)UfKag#lc}MYNrW{ z*o)0402NbC2)6)$9TN=YI&a&CZ{NP*<>dv>&(C;z{(?^@a;Et7z%`iDHDNyd&27<-!aW6oS&bG^kOqmB01K$ z30PM`yK*K1jkIIN(9j|!VB1)cSNq)hBS(k+pH;930b!nL-EOR2Pn`LPiV$WVg5BpD z$}mv=J}MOUE#dw8O4nlMD2hOUfnnvJH-`-+NkL7^mvj{OD8#75i;P2}CZirn1YK!FF2-oPT@6+uI8sA0J_@!Tb9=_B}GW z(vdniN2I(XZ#S5<129-$UXk}gYkCTRn_#R(7RQlkhNCHTivl#V{|I~CSV$mZQ+|d( z)~%&rz16leMsstKs-mjn(ON;@H18ynO$Gr>CdpI->1@*L8)TLbK1k&z(P_TS^u1GdFv989InxOmR@%s9XY4XiRRB9PfP*NOWX0^K;EI?g1n9**CqEgXz^o<}6v57`=w2_)mf3LO< z)qq3;_pEQu5SqX?4vqBB5ZIxVSv#!pzzCsgOz#U=xV z?l+8q=XeblJT}HRVvLx$1Dpc8JMq9*+;Qa|#}bK1YAvqo4VPtxF%zb0@OV1maz0ZX zn=;%ocYsn#3Ga*<=s~?+&*H=*PF?F7+qL)JBh0kU_mp6q#bg~4fVA(398*BJh{0Rl zv4a3X#zR}=Mz-W`=Q1hSV#z>?Fjj%-Im2)rVU2+^+_yT9r_%${9+CDRD7OvX&6r)l zHSaApfk=8x&bJg%Dr+yLjG7W`0rqNeD-nCmNY+ylFz9|!=SzQ39a2sxO#HAd3W$VW z;%+F9`{?l3VilAkUB^7rUYI)-_VIJBk@aMcmi1$xfEeq8aqrdc3dd)u16ln(DnJh*bllYF(4mLK zI#y9%H|@xw>rj2Zj_wNjwMU1Mv6j$7%kesmwXh~#HAh9$lXR>@+p9l{U>)6gw7Z3N zx;dZEO`NE|?;!Pr-Z=+@Ly(-`Lo88qFi-;*jrT&~j+zLq-?xyLK5|IaeYt+7+5kfh z{q$!VNyr`VZcxsTb!8WmrtUw*({GH)hbH3G?shSz&goGP8THU}90rPGz3lhix^6uR z@pN6+=2oK}7(^^F&r5fIq~6xV03F397(GRGAL~8l)QN}M^_g=QzjcT;(2+%TWa$xE z9FO-4j`884p9t_;j1$n|;idKj#YW0vu~lwPRSwfcQK7oGYjtYv-7I|TV=)l%d5@R9 z)PmiD{Sgtt!&Z5ob-(vf?KwI)$~};NTjn=JN=hAeH##4UXSn`8?Xq;&tKr^ZSYK=B z$N_rK=`OlS_hb6}AJ3Zc+1C9~Pmb_+&!v9;^d6)4fNk4agz`tEljA)=4dpWnu`Nmo zog?b$bb?doiC{O{0YnQIG)AP?mym0%w;vKJ$CyZcKQ$4aUZ3ytcqZ`PE$>g`6Q$%k zw+mgvjOU-mbL8IYe-k3Mp7|Y)UcQMToO5uDp*Cz~IG4tnNzYX}M=#}$FX9s+)%53T zy^B!w-t%n1+!2xM5Pvk*S5=8%XkOMkPRSIfT~qZO_H}UW`uS8cCOda{)7Z<)dzt4M z)iKtFio$6dLDXrZ2v=}>Ve zmeH}T-C3souAPpg$Dr@)BeFhnBN;J5O+q~I+37AyuygrQgc55lvcfE7-XKoKL@Gv? z=AhT%xUR<?Ml=o?1IjL~yFl7R;*6yq+#+Ox$Gs_S#u*JXdlj$CsoVV>;@k$CwOmh zTi;O&fiC;L^2IkepBGF%;O*@V@9(cjDPi)oajw@l?AwN59lQbl_~UnM+lHV1^cAHf zY}*are`GA%g0yc^UYE>XHwtqIU=Wu zeY>Hi+F5JKArvgJ>|^DkD3+$s1b`__aFvu*P)sZx5kNM>$3ZBOMe^UTudjG|dTN_f zDT)c2fo)sc`+j|W#rb^3G#~7E9rLrUJ3fE@+yFIkc(CRGL_dH2+{iWCw&DH#h!LRd zSJMvDQYwD>>1SB$aQXBE2`OwvYU&@rcI~)1%Q=zC!`)`HKn<-npn9yRK@1gmbgbFPk^q$k*ViBv0jTR6xx8=fCmc<)Q1Ua+u`R0r^_Qb zZ{&=bi{*9O+p|IT>%>%qvGh6>I6a&Zw}hHGGuD#zH#h@!S^{Fs6s-e;`Ly6)zx;$S zP5AHs{r|xK_&@(Amh%ap{_B6m=`;gz2MVyQE2eG2n#p-%#)+db3S8O&H^WU65);ez z6!G-*3De^RX3y};3|PO!|`1~!nvi#L-3T_2`$i@53%qSH z3;+<%jCaL^!LZwm29EDu%X7 z!-l|2+ZZEqEHJhr8;T1QGUs}I!|(t24cE6<#IIlR@OZ)P{YJ4TF!=QRL}Z;DX}?Mt zm#`pJgX{P2F#Za=oDd!!Q0E1UHwfNRR%K4Gg`BgDbsQa#;HC*4awv1b#Lg(z7z9hj zZQRJZU%vMF>C2H_UK5P6sLgRh&A@4zdDvmuEhQlB5!+70ycV0tjwZRO9z8i5RF0;x zfmA7_5F4BGbE_fs(6ktpQ%wpKGR|SA8ELF*K`a?XtdqHcp?!ykdNt7ity+X2S>&N3 z&*;V^>ZqSm8}Ox@{;@#Ppo}IEprpITO#`tl4uzG%wN~U9ftowOwWf>;1LIvAB50uV zXbLQy1vWQ_q8KwNjjKV-1=n>$$P|+nX46z{QuI&L#8GNQ-1+qQgndu&mIiV~z#g*U zL1I?|Z!NhH6^@XZRdYanvzn)bu`TbgMul95^UYFeCzZs;@^ z*Ja}7y~Uc1gc@;t`zWt@j3H6bR#OC%qe^d&Iu68zge{~J0l1UOdp<36?yUPpY88xpw!JoRE$j_)-%Qw+lDyCDZdMU|8)lz(+f3`MfbkoX=-? zFE*?7jxI$<7577>`Fv~!_c zyLmcMtzKy@CRU^fFeVLfiltYo4uHhyKBM;=J#5rX^GMdxFhQ%KB^D^e^#&2YgX^S}cDCU*>WUCzicqn3oSM@-h?5@sZmPz#V##1^+U0HmP< zt(^cO09hB{P~bte$TSC>tw-=D6zh-;5K*w^h-@tNgT^*;UP=))CO80|ol;>4Z!jch zV~1VCgH|&D?R`99719wL5tktVJ@0`rw`V{Pp9~y5L)NhQ5j(vJDBMIzrhC5iKwk*Z z$-&9qMZxGjGUkMoV^fAp zyy!=v`K;2{LA(E0B|vD;G7D8r%&69=vk^_*PZ8eku6GvajN|K$ z@CEB&Oi$XKrnw`xjl}w%sA%}}8rW1njIJ7czcze#u6upbH63oFcY+*mFx!Ay4vbX9 zL=-<0+wfUx)}t=1u(DQ!VNSKjWxxJ@IeLId?hH7qB z+ZzXCj#+?Haaf|#*85qm1u>`gIb^-*L0Ca0S9VRF%D{B;O|*JM#FvJ5&~@V)qf%7S z>;kzjuWMIRYnPE;d}}$%!BdYT>!YFx3B32M|CM=+;WJ&%$w}g#*j3x2^ifW=l4H$8 zf)i_MH^7}jfOn2?ImWkikERLp6i10W;jtYAj3}+?`TP6ur6cRub+&MAJJ|X?} zI7rSpV`GP8ut14imjGiz!wdI)2eKW=mq#R|5IAMvF0MFL#VG2*wsztgMGUf83Ym3` zMbspJU0(>fWS-|Eez8>4lH2ojlmG?J(u~j<8eHf0dkF)~+?R?ts9jSyc0QstKZoh) z9SdDUBXRK{(XL?fI+EUU4JEOVB9gKOg#RZZyvcK}$vC|Lj9kx0fuAP7QT#l)d>@)x zx#m$hG!%AX3#9Aa)15<5HE44p9YvTk*OS%4O&-<{BF2G8JVu*p5s>uDlo(Q51e~?D zMZE%q@fK9>!*(8SvzrtkRCMLZb4boLI#fdYKm(C-n|tBHq#2Zml7QdZ~xN@oyF# z5m;iJt0jzDoQSG5cki>5f-JQGJEjSNq3t_DnyvRe0Xe_q<``!knn0%QE&15TwD3U4 z>m#vdjFoKb)f4&1wEdzg*QWk?GVIE3G#Ojw5z6%^#)vB9r-7_)hWN0YYm2M8cS$Kq z)N)S%Bz%j1j{CP@s9qoGA56D7? z^S5mdRWy4ncm0lB2dPCwJldU!LUJh?j@v#x*Ot9?tdp&!1ecF+t??|;BpE9M5Z~`h zqbnk6ZIN-(SHW0h#?d9VUE&L^wM2|%98uiFEdU>5#PjnrE|&||b!~^L4Dm%VnbJ-Q z{t`R;Pt?PSgjmt6+D$7BLqX)0$F?A z*tQ6y2peb!{{7_*x9=-1pPmqyaVo=H?>&|<(SV(mjU79CKWyvH%Ly-UuXuZVBVx`p z-Q~2)rY`I~vB9neu-?KLkITGJW|$FBmNPwB#U%x^!=Vz6G2-?06~F)fJ4z|+{xUaU zB!qyHN%129=70Rhf8f_&f5rJ>Y0OS3*4A~!JR96@@9lHzf>prpUw-)oDJA^vZ-2wv z+Z(oR!!N)5(pk}JcJ(~ZO^Mx_C$T5Y2RlsEw_?ft5i?9cLFW#}u8!yU`t>V*`~4sI z{rBH7O%pzU{)}2P-rwJeP_&Txx^V0WIIGpbe5iUE!T5H_Thl45!HoKv3p)pJM1l|a z?RKL$wD)&-OZUz3@IFQw=%7@xQx%sVRx*U(I<+%33mZE(czEk!xe=BIoEqPH#|o$W zVmpPUpO*&e)mq`aZ_nR6&yDdd0~+rfuGec@e{$W)wZpas;r;!c+#P~%#H;i9Og4#A zfP-%Un5a6JWx_l!UB<56Hp>4qI0oy&I`$rTyx_n5Z~qPd{-1w66t|g`WhJ8|`bm3m#cw>(H4x18;p?&K6_wTq~ugJOJYao!)aW=Fx7+^4w8ggP7x)VL~zE+e( z4o}rM>~Te^M7BXC@K)B6WLLNNlawifE+r}gX9H8I5te2k-d31gP-8-UyTXJ3Oo^kW zEIHGdRosmU+%z2RWE~N199!nqLjOkDENpX~xq)FaO>?esfDb^ZuyWWb`$ByPkrR@~ z>+37xo?C9LkQ?Z1vhcGgO!fvIEXx@&ZipL!WHe}@22mRCQVNWt=0_r8goop2F5E!T zRzloy?AR2A;9!6-IlwrIDvOaCoeG$0koE-Y3B*o0Bkh@^m}p=4^8Ada%LP76u#Xm# zC!jp-ks1_^Z1ONTPcvez9F-FubN{1S2?K09F!VKE8F{-7c z5!m+~*7sJR7TRHWUfLb(v?9tgYlmMh#$vcOEX+*653B_bQhb001BW zNkl+n& zWqVS6UB--aeXsX@Z4}^|SlQ>eUeUEtBRZ*i zL+T{?pAb!C&q|5vyAUpIeb!p>{{GG+XsX`?bQG6JanOq`yB^(j*A3I#+Z(=o`O@Am zU7y?$3v%uw9vY~fs2b&6mhXXuu$T>iA+z}<@_f6B($VDlqR&UE|iL;c% zCQ&ojJ9=m`hHJ!wV<4r0A^BZGPN+gc{U@2=8u-(Bx#W<@w)Nh9=%mt|n$#L5m5*Gf z)H%L5=kWOWi1Yc}yR<09r@SYM2s`$8?Ix#z4gw8qAEQuu#Znu7hN(5HT{D_$+YbfE z)6YSzy~~qUf{VjaWyekdX|*%VsK#$(Mg_Qhlh1cZ`f1iJOkeX?ksHg-}0Sn)tJp50#${oPZ4FY!AGucwtRWF-98w*k@o{bEkl9 z(F)3$P$E&9y9|1VgK=*^o*mP`TLFZmMj?kQdTvsQcNyez?=@iD;tWMp(LQ^xj7<3e zp|zuf{;WDyLh6&zjZ5kV4eG;LoK7d?-C(Z9R> zp?M);j13+JrG1`#k1)<+nP#l(6%W&bQ<$*bZg^bII4>tm&SLfs=Xrs1$Gvxh^F~u@ z8QaeMR11)6x8DoN_)yIncF1DVUm+J4S1W>ZLHp8AQIh7E;#&FIjS z-?BH5gCjW+YEpFGBht2GjT_c|M?uAGJ;LP)d5`$rp*;5S_?bSMNt%43Kf1y1gmKhZq@(h0ASU*MNGj5FKG%i8@ti&LoE8+P{lu`v2-uGk!l6MvWZaxz`M?BzmtM2QnWy8){Og#AV5~ zYO%H|O0Ct@szx3oYjlsG*MRP^HGU_3!Dy@Bz~!MP{z%0w_kDCO(C3IgA3MOA&jE3@ z=q>Hd-QR2NRl0E)9+h(Mek64@osI58wXJq3p|7Q`E+2_4`aMyMki4E9)Td*tR~_m@ z+hVlF_pIH$wZ*@Q*wZ2~nsj40ymG7g&jrSgo z-}6D1zK@0&mD{3Nm+M9K>>>E0IWz9-xWkup?2DXf;@o1@_4~-t zO80y{DIIsQ*3E@S^@`&j@{x;@?sfHh)HS^Bb@cZg!T@t82%xo{y8*2xKaOq}x=#~w zvH5@iGsf6~P+X37r8C{xJ`Qko z#GYPf8i&&4-tn2x=ibatA0j?6&fdlGYC(rSqYoEvA>vScd?^&2lyipj$2F{lVnrpA zTD$&Ae4Ks;^m(Jn2Ku@mSOU7ey$-eRNG6m1QqTXS79As!YhE{uJw5+-0(_lL)hTD zI#Ha<#f==fKU>9VrJBB=G=VFn1Rt2Vn#*0C zq|Z}LRvh<3n%NySw8XV*(bgDEt!Dum_bEjT2W+<<4w5H2oNaV2`lwG6XHea@%WIBK zp2zc9?)EMEU47)%@p}*aom{1b9COqnu7a)~D&g%ajidlPLBqZ|Pvz9sl|FArhh+U3 z_kD+VQ*(?Ruet1-vQLk0kL?T#9!>sWX|}270D=jM^Q!C<`ivRL`^8k)QV(GvCl6uR z`wyay>CP*SUFvywTcfo!CsIw&AJ=dr`wqe*Ikzm=g(6&*`;wb^i6Xf>8}R-6cf5Z8 z0oVS)Ay|j~wqo`H+1M`HfY@6-D<~II$!}~gEO9sUGIg;(VVMyUZ3ut;>wn^#(sVOqh`NjNAJg{{H)K`2F|a@bynWc?f(EO?Mr}ffifz52%sfQP%G%C*U|x{d z6p3Hf%h6HLM8m-nGRtO`$8!CC5^R>aE!i9@P|le|g2* z^%bYni3YaLz^VMuFa@&N3KVOVw}RVt>o&i~rwiV%Z~PvKL{-^k;(C39sRftIg`7;7 znV(WZEj;`y3C@{r03h)Sq$+2J0|3QXcp*XYeU35W<>dwMuW$JK-~W!k{`Ife;*MpS zalSmzx|%2K>xMV;ikx;lJe+u=B$lm2J}k=u&qc`OJWMf&!XRJ;Ts5^tr&VOcNdFzY zy|erB-jni7+40I6e1E;-+i&0S^Upuy<>dwEWntw!4U{gIC(M^eAVo~`jJU4|3vXb& zF;4T0-@kpsayr4w;5;XsA1?^YjF*=e+-@5_fBr=G6cw=4c(3b<{e8!$i-6-m%sciJ z5epr3ZVE6iAhKf2PZJR7dw%})XPizaoF2}2|Kl6ty1{ry*UdZ1hxV*Ms|9;p5x5bf zO_G3zr^~rrpY{EUFrTO(DLXlDq#npz7K(I&xHZ%YJ58{~AhHr*TW?L3mkO(_Ek)Wb z<$N?DwxY5v`T2atGS5U@*%Q)A?gi_*V{#5i8EM@Rwg@Z*h?$gi*Bd$NEZ}`5kjl>p zAt(VGS*jDiz!PDn0$4Y+;J_S#eFJVA5ZI+hvL{n+&xHjQcafV(Ff0G|enpN61_tvq z!Bhha3ly?!Gp4{B15+v-98Sx_F}#Bza$2p}ThmU@AV9H3l@DiID~jcYevcIKS;%=x z$PhV47?{RvE;+&lPl~gAD7EvtqofK`DCgF2|K+Vi$`QA1!)f8jt^!!&iFsTtmT97c zx>Rg&C#4(=yMb8D-Xj~2lvv$f3LGlZc4gaGc4x^Id74oTDH*JHC_7j=Po*Vu64_9eJh}_$jnAusL1~pyWq3jnb^;lrYcalCs@ysD&d6a)g^sL;@65pEt-% zm@AUu9uuk$Anqqw{|bgGwVVb>1XxHZQC2q-WlPCOv0yS&H!SEBR5i7RNtzB#deFml zA(4stkM0W(G5GmU;vnM0b{Aa)n02JE%{ex;;GwcPqCM7iZOUD(+$=R=+i!S(e{a!~ zpFe-bJd*=dF~{IR8it35hjxF3Afqkodn;4RgRQ+~R6BRr5=$I~aTWy?*XykjYEsH= zV4iu{dAn^)@BlYKXwetzx_0gk5^o@{XN*DI64D+~f=4YJ8>HNOg7e5Gp@0AhBk^J~ zMD_x}awCg`d78;_&srjT6+_>jk7q-ZT&$`I(;iV$KJv67gF%B*HaJJ0#W-@{%Y6RI z=R81ME789U{u<0YxCIY`No{nHS9AGUG z8>LR0e8A4??0w(y@bJ*$IywvOAqwjNV*zVJOU!UKwDl~~egdX5DO!sFbo2~b&hEAx zUz-!D+zKjkim=5h$AgGHMHGqfF%DsxXs<6BrXJ*uxF?EY$>4N((||#-3)aIhJt)$| z7$MooH91Hg{m@eG$u#*7GrY$f?vJ7bI&eD|j^Hfad)JM;3>vgOwf-GsH&6T0*yxX$ z%q{Yf0gTZeT07ZL=6z~FYB%Jwb^zwhhXdoo6^Ma<&_J_nWw7loj1AlFe2q->-}h}$ z4B5NP_EHM0@r|^Wc0GJ%mzt7clm)OR^@!3`T)d=*)+E@&8I7Z;{j6fCgBsvX-7rQw zp6MaqK47;Q5*!SaeNiTZ2oMFAg^>)MLT{}0tH7yD( zI8tKHk54Em!^6O_z_mv_~_Z`kzoY`F~?HTVcuUKKR_<$2f#EN5ZPIPuG4;MV079bbo+X_<( zLhyK;&v3Z{YeuQSnj*XnNFV}K#^F*GoI_1O+(}WoC)zg+>j%YkW16Nz(OU}wt%80Bl0?}H3u^e}IkXF8u5Fm7>hOrExbT3APNkC8(f3_KL< zJxPufq=uaWTsKtI5foGx(wQNo;tyk2gy5pA!pZ6^Qr~TrOHDV;IL@~ZU24Rkq(vYf zjtPp{(ZE@;&$rdWR;vc~fOGcFaYXh4`ci3*Z~9!)->V(2w0n&>H)#9%kraCTu5w3! zZP7QD9lCg5E-ZLF_F*~m>HSQOU!$!hb2lvR;>OfH?n%tx{xlA*B&PdZ(m&-)wed*C zwANvsmpf9H9*pRp(a(V__+Xu~Cm@)kE)eXSlI z9*%Quhyc}tEbX@EoWmY-=Z+z9KI5=gK9jB;rfF)fqt2PGKd&lAs&{rpi^8zhp>hv5 z4g$5apC%<5c3#p^o%9)*C|M%UEzI4pPMi<)ni0ZqBQ%=)ApvhBP|GtFIo`*5Pfq%8 zZ{7X(mfU|5_mz*2k1&q*?;A&Wb@fX*#ASc{@dv(s{;AbCa(~4stm}*N5#MZ_MNqEC zZ6*`K;HC&{wZG?eHF2bLRhP+1gcb(}c&Q={7mtxx*XNa}{qAYK>N7;Ni`ZBLzZ zY-!g$;Njt+_3HZd=Xplqb-%4^H#F6xL3vH@J#s17V?6dE6%RN%!|K>tBR!z^ZH7cn zK-#r5!CB8P6Z9G7I#Lf}xK6H!aqD98bZtfbo#AuSeMop}PMO+$PR{CTScpmDfy1RH zH}SRfkk&iw>+KlAic4KJgIKDM6g$Kw71q{{TwQC$zU4OmD<-zD(|YtsX}@!l7@b&! zY~K@`=sg;^HutdXfL}G1$`(zA->a;R(UlLmH2jX9J7DISTt{$D8K-%He+-ys5`gCt zn=ASly)zOd!R{&}c{4?J>5(-QIsP(}OG#ESMw-yK1e#w-0)yB5JA<>3rJPe^-Vf+rC@<=mC~DE+RuL<;#r?&;}t>K!nd zTrcz818eU|8CG2@xt>CJG%zS1IA-<2f7-`W-8#}yGfptR;YGC=R8zZnAx$(I@2O+_ z2`a)%$k3Wlt8o&`b<7y0smV-)2Qu!=A_bX|9d)2!H$9PW6r}4KPUBI>f7cJ4Eaz!% z*!V~`v?@khJ7#JUrjBVEu`nGW+umCv{_?qOZ1*|Zd~k^6Vwt}p$B_F}0Y7g8IZ*IX zaWc}g7jlp}h?2&F99~OqYMfDv7GMngw{PE&GCiq8_X~OmThIL)ZDxH<7WxKHpO2k$RUS59S<>dv>&(AnNoUraUoaP0e zpC0kY%PZbrUa^1vOcy6n1ARU};^FZLU{;rGF#DDocqfdi$$1n*_R)nOG66ls4Yx5W z#c_tM&$bv5tbr|stn)!bBFS;H9Q9+sOeuE&oz_}>{`{HZsU+L69Ym~9a1+iC55P2G zU02+0H!P|NlQ)^Jnm@iBUDd*-R63Kh~{Pin6g#KXP>4$rs=hoDSTTbSK z@yHTC7Tdb62$M%H3C4OpW@Z*Ta=KmLK={{9bq|NfnrkDd;% z^K!!T^E1UQq>SyhVw(J6z3r(1*395#nbd~Hz=HA0CV4q5IZIO6#WV;jycyL}kxK#! zaJ#LrRse{=R*vL)^!4jkSW9j+FE1~+T+UdQg)L-{!vofI@no?ST(4Jr`}PfAzI?&M z`OJ!cvLSV?knqSbxNa-vc_uJ;CKsIVKfd9%ZFmUuy<6JokQK$RWEW>56>Q9AET!P5 zKmCk{hX<_Nj_*HyU|Ux#rxWVw1X~NN^(eK%mctD}l+?|hJ_I~HJzUtG!Cc*+qNTcj2l>WWO-Zd8lX&rKg02U)=2zFLE7lh3)Z1HB7fLgky3$) z>>lC++_d0reMij+lXsYXAp7)0geFmur#-e}+FDCZsHrf9L4g=y?F_>fqOcB*hoaW8 z<+7nYAGN}!9edef$_b^g>q)7YPYawm0hS}rQf$_rlopj>OKs1$=a@mDAjJ(Z1z~ci zX2F&soIeyrd)#1f095OCg-Z_a#vpM7riI;Mj$-N4r%!N(1~yT}xoEa-%Ncgz zF6*{}h6xyK^F*;k3WBA%Gf1JbZ4pmTGv*~=3X%zKy85623<_Xxd7tcL@KFY)20}-m z;b7{M#jAiBIa8#8c1WOWHc^b{fLA}|)ChN288CXQ*+_fyWioHMT1YdhnoX;!2)vP2)Fk)+1y*!C42ATF_Y zEp`G2kww7X(PB~Cds=0CDd2{#Bjx?cFoV`V*inI+MN;etvpjdKdLh;b;Ys3iPNx&O z5R}OAr0*2zcsh0QNQs+h?>%lDm-+bV3D3{ZTyMtqKJ{KGP88b~**PtDL-x~Y=JS6> z&b8U4j_+Hp*UQT*E|&{lUS6>8JI-gS8_o|4I~9bx=7~Npy`PzfatNkVC+i5&-eTBv z3X+n`2k8q3dHINjoV&<28D?k&qkR9iZEdYcWKmH=tFe*FIXCNDD6sU%Qb%)XZ2At6Afz7G`{vpd7! zxX)AvS)9-3rd+j3C8pJNIwIyiUs)m>2#gyEep-p5qg6F%u5Di_`@D986b}R+&z|ia{*956~OMM%uxFM--SXE3Wc1WA$zGRAT#e0 z5$?9~hnkwJSp=Hh1CbJ-5{bMKzL=@0p7R~8r*_^brF4|2M{A87T#mSOh(@oBf}(x7 z&r+B7X*U{}mNni{W<3qe1rF3_<7Dxc$=N~K`Zed1_D-pBS~L{H3VE^Go%AymRLPweb^66Lhj5F@%U1_aRX(yE`-GjHDGNJ2fG>d`^uqn4GBu+67zi z4b#okgw=1Ivx{-&&XDnBvUIkJ>#b2fcs*+GS{0Za=A{u>_#ISPbcTCrJ-zzz-)mvco?N|bTfP;LC&E7@9~v{_r?&hx4r{m+Xxq5pCO6~Hqhezpa`ze z>U^aX3HNGmMWJ9a7U#neYe{(BGS-rjmByMvjZ|VGmP3py*5F}N0ZPI_Ih@=KRICUXbZCpD_Ki-7w7`5ixebz{W&bGQ_6!VOPHr`|V_^O`9 zF-9!Ocu+}|kbjqCoKZaT=$?!Mn^D-+#W2?OlmDC1W$V2s;<erpa~#BOcC-LsYI8 zIOeMfW=ncNk?sjYN~!ky+Bz#ppmIpb`|%i~VXK&i>C$#`-Tp$+(IhT%&QauvhzI4* zb~qebtwchI*a;mp_UB1Dv?Y;anx-0g+mjjO`@r>T8#9b+Fy;|PpPSi4#=Y%*;2A}M zdPc_J>&r_!6Upn~syWJgkC&GhSnV45Q~q_mh87P?!>hWsm7$uHTR=M1*)$)060$tc{|K$gkuRGV- zX(0XZwUXy_c^+s+R6%Z#Vk}7zdnB~k1?i?IO$w4I3yCOh99>W4K0>RsNItnAj1lrN zq;{6&`H(a)?CXW@qN+RElGwBQ0Xe!@EM9Nr^H2tXEdTS~7qAV}{)p^hw7Da7apD0J zOPOXYslvX^X;s%#Vxm8PZb@otb$ETJcxcZ3e|~=1oFqk82ay#X`0I+5YFsxtv@>{gQenHkNzf52Do`k;Ub;k-uLO z)Fd6}(Ya+Ln0EAQ072*$`n?=?VsE)O+UxZS>vU79PHsW+8@6r3%gYPqdB!m=u(fGD z7OKYVxxvTd5r>5aO}ES1oIIse8U$1;`saDZ;W$I-g4=olz7@Q_y+CQo=T0f%+m~Ol zg@B)a`U8m=U~zC0KL79me^@U1KP^?Iu=G7>AOq7k-; zP@4cel!Q_^|L`3VWU5=el!W9t!ULk<+>5Z76I>=WmOSV>v1u7+U?z8m5|kSeK-eee z9L!>o-ro^RK=uiX{hr*`2Ke~#BkYF{ZP?xp*hpCB)9?~!fyC0aP@nHqeM(on>O^iv zazX;yDNM#y5=V7-0q~wgDOnZ7l8}&bd^%w|(ET)%Y0=z8(ZF1DBQSYDJ1onD)A>M% za3uIh4%CJb)&-ltwV0x(rxTWG#@qV~US7ZA^XJb^lo6r_wjGnj1udaBb#1ulu7GpS zHP<9HwYKK;`S|f8e);8>I?#GWjvjyf*9%@R@3nzks2OS}7!91CpD2^h7=#pH zvc=*KL>_{|r_Z0El)>flhTp#Y1~*$gojHq*B07*naRP=|< zJpMK3plYnu?RLfU^9NYxVB7?sVyDC;6?H;U1u79*F#3S#H{ARcDMe%$*vaAP`~h$j zTa>Q~>)QoCCUjsG{x0G=@v7<{|kkb;v8>;LI+_PH>J!3JsZU2k^M#jqg|+;zmW2sYRo7B{$)n;TVd97&BZV*BJ_+ji#84T(EljJvM8&nyVhX zM+zCXX!tFn7z>{>j3Otgu@n65hJ*;MEVNP3sgTOOP{p1i#abanC~KgRfVx&aKb?_5 zuJN#L@P0+|Bv><0NSVbK0hb(MD`985tq2=oC5=&S-LUhF!@R&KjifTRb%nx$AtrE5mMK*phK^1*`v*I zDE4Gp`%#HVxQhj$n7-VQ;S%?_8v$f*SC^DM#d(u=%awE_qNc*GncW?T1~yZgt?r zSbbD9IX`cP4}|r)`q1#sd(M1BjG?MPZAjL`#=5Tf z{QY+=v;K0~QMT;#<3k=bX=o6Y>U~pIHRtoX`d)CJdUBCc3hT|+IK~^EpFg&Ghee%k z`X0-&V4fEetkog5j4GASCP(?%x(DV=!{ZWZau{{Kb6>_7aeJqlXPFPJ$&gYe_hlOb z_LQg=Ns?=np4u_r{JlB$h#Oi~+1}-#%-tbLX7%m^Al(Tf_|F>!GN$HsGd5MaN|O*6 z%D+$3gy-ky`rMZ8yLr_3(*6xu$G!b=kxh)05FoaxM`kJYD6&Ue3Y?H zDekdM&Kab-UTIUGC8hVqPtM4S$P2tD$FSp4sRv7I^GI7F;?X`d2&oYHrfb;k&HtG9 z!#}OP{O)geO<5lLNUF;?K-&+{dz7klN=ZEbC<2m)dPyuBo5uj)biHQv{idkVUaTpF zK}JXTfn-~aO(a2y$Q;=VI4xiws~wZAQ0FI)@t|^ z@0xqLWGGGR+0)Zg`+3%oIijc@p)5tUcB#<_l^EoV#bhl#BU-^u6QbW5ok**Fn5m0y z!iUymM&I0PLSz}0DI&wP)=0J9QsUj9dYK59Q#BLJ(}bf{c-9uL>lL>UNsONhiUt!t9PNlIgrP|_cmbg;)u?4LQMgn4mo$i>11j_3+0Lgy+vw5FO>Dp>}mr^&D& zMvp`q?AgHoCt(c+VGWyj0O%6i5M^wjG66;oL*;$r??*#mbi~D!%ENfS-y`-&asEiR zkRqwE>C2zRSM0md3OOq%V*p+5s0Fza{bIdv2d-H_QBe@}&UjXm|^W+iwa0wp6l9kur$shyzZnC!s6F+ zvT;@5cR#!v;}9i<#5#kV6*}aa7*doP^R&m1*NBW7>&S#rNuHE~k|qk^_p6$-WYn<~ zfsGM%qgZB)AdsTyG0K78VT!NZ`xk7e=!Y|=`obECsjA1=n@0qR72o3^BmX)MF^6;BvdcdyjA5zLCMEzAMM&fYaeX&$CY` zS>g5Vjm{mzb)dDtqLkQN*Ewe(^wC9)_~|O;uI>+$bDjB!4Z)TNpGITW^W89R6j`NQ z>L8p4Zye)oU^NZPX}CthNL^`>!IMxd=R!S9P+hKUX<}AMjvAkZW&kL3_STiiu*E=; zVxWJACX(rUNo)!!U2KSguKTSt&UWk5Fc4<4T`rL#xm7ip)^(iYzj)x>gvgELgm%4S zN-*3z($vpYb>`vG>IyB&9X9 zAX1Hj!|~T?pHNMpJl0Dc`D5tuu@`n<<05jlC>b>>q#xFgaZc0Z?gT}0$lpj5qJF2? zkA#@Qz8BPMCaJ-^4ni1Znvgz*I)_q?YDM=!Ka3~YqhKshbTuWGZq1a>aA^dbO0zDh z+xKO?m{LMgx-+|~N@^~kvu9@dFrWE|<#0!Kl?E}nw@N~H7f)T&8<@nH>;8s9q;6jC zSft4ZR$2G({gX4;aUbFE5nX6lo)S7STM_YwrOusnP3K5;?<*)>4Oa#sO($wrsCz>h zjFr1s&1em**ZFdsnX(~q|i-@&{UnjJfauw zqI28L{deKN>WFVL?$3LVm^=y!QqrBkZ;PQLqsw)OKZ6wbIc9Rwmm&?@WO(#}D>AcUYDrBdN{ z)0Gs$KZ>z!LRv+1L}?Rg>pUG=d(nNphDpQ{a@;JLkGX~{O(ffD=L}>aQj>x6d<0}(N3-7}lTT&te<70|x_BcmQ&x;`?v zlmbg}Jyd*pPt*#2xcD&cCIjtsr_kIpAh$vJNef)CB=%rTxiJRIG9eghux|d=8towj zsEvjN);Szc18?;i0d~*t5CI>f>vnHf~SPI-^ z>EX^bjz{%*)CH++Y|W)pbDre`u*V4PqRHbXa%SMz3RyAoHmQy1U?bs>RhSuEJdVYRxMf&^ud(B|1F(fe{#DEE| z4HJ2|@$&M5^>W4Ge8TyBu90C|je?-qn{{1D05;Fani|4Ik=W|}c14I0%lSYtZ#BY) zNd)Uw4`L}nJ3>G6Ghm#+b4Baq%ii_-2nu6Oo2W@MfH9KU%hkbhA zQGk*XiJWv*^jEwpsmXR6I>%B$8NgUfrBF0feZClrt2K~Pq;+H609_Do8-Dxt1=h?s zoQ_b1ic@7QVnvWgAMnFZ-(xwQ2nm>90XX_hU%$co4HMy(kS^D*DA^mfcF%j)0Vvz< z%&ScjqIT6n6bjqrir@ncZgf4UMj}6jt-3>I&NucAze-Nz(3HX{1*DKs3Jn1%3ZxD` zCQbJ&B-q*Qn=e!s|Ik$Vpu#@~YTVE>zW^~cB%et{%TgIog~V1c85$Z+8$_k?KmX~U z@lXHr|HIEe{|Qg015(SXr(DpIGlKW@+*ZO_%oO1iQiKtQ8l5sq28z-MH;*-X=t%Sj zWfh#JX;2ED9AL^py9w#GB5IB2^8u++YOK>JF#xGRXZnu1Xy{ZU9IQr0uEQ7_IKybb zSS+d_IE(k!j8z+?6rn7=TR9W5KjlJ^Q*B?4b;w`$nGg}MqZ_&Kb7IKiV}OOhVOii~ zpq%MCNGe%1Trp)#S~%_69!LAwbf@I!wVH}#*JVe`B87`C*$yMO7Ogo9GGXF^Eb?dW+_|H?_eee<3Af}_i6=3|Zs@VcYYiFKO)S$lz1UqR zUDiB&-L|dWo73rpX_~Oi$F7d$8p5ZD*-be8_#;JIR+3-{+fFqU4m%cOkmKF9h@(^q zkC)4Z{<|u6<5;JX6~$(X!48pWXjuFG_us>NkIUtPx3?E;Yryj}eHMy)j1BS14py04 zuR&rtBcsg3U^2zr25A^G&);`S;TPQtH4Wb)SXLsH1DSi{cxGbE5#}(I7`F)!~Lm`pF{% z@S}#F6m_s*T{c(vd$Q11Hir02$Jbzwb_;?`QCb|tNUa$ikR#cpe;)N+Go1-Ka%jct z0DmTH>s~0DNwS$C&%|`CRk#1ky>6reHL9G5yOpFUxi0OET5~6=+r@SU+jhn4%R5E= zzTe<|LT$VUvBiYz+Z7k@;Z;V~23Y~2RAE}`2|>BK*iCInv)j{77KMe^HJX** z?@|hm%LJuW6NehJN1RM{H)rrVB;BD;Pfxpv>2TPG&GUrGSgPApTsKqD7~%~Le0 z5Y;JxUf;G2F$7G?!KegXfC(BV1J)=MV{qF%qTiqunHVN#U^I|If++kg2$SPLTgJxS_7`@4OVF^Gu4VdML3WUKW2)Yot)X;8jE%HV7a7#)=1y28>|k$b`S<+Aky7KY@vqCDGpvQ93!aFFX&CzT0@xHo zCzKe^FFPT~3__=SqKjPr$LJ+V5s}Z$j{UDSq9GBkvbr0V@4}Cso{}=|NMny&tt08P z4Lfk}%9YMvx&MvMX!>mBp_{g+5U6f&!vimVp15B;#)pjc)JV?Z{uYbFeouHiQUi4* zAw3duj7@oV_RA=bk#slKp5w4b)=^Azbk5Otuj_Rwxy4?O!xOnL${wK{mbThFRpPT6 zVy>W?kU-YRsQW}2&IwwO0pwY@qmqbvRuW-G+TKX~;UP3fggzS5N@uzx>zVc}#qRl* z_h%G&k0SoxBM-;{iX49Nc}dd9wv7zRm&*k)MjUEACF9L<&UkryYirB8uK1U~{28A= ze};1oYwfXzK=f1o{_DC@G-EY9^SzcL^E|}L@;RfeK|**XXA*M2=DkO$4*O}D??_(s z=aw$cll$3O46EdIjDZsm`pAo1dSd7(!r<@Ok_VjaYDw-L@_i|VVv)voeZPmfyAO@D zsryJkHmLF$MXpm!w&Z7)hq{l>0&PE4`&r5jQ~-I7l=KjJU&lST#SdCNXijw}a`-(% ziTw3`zSk3)wWLZ9gr*p&2R_E=vPenpjiaze_Jw{=SjQ#=x<4|$R^3quxCfK7ZX(z` z5JBX=BdNNNp1UOaN>r=)cJ`P3OW7}xy#h9SvAEF3UFa;|r}mw-x!ddbIpau4NsX0z z$GWaf#0KmHrWWlk&Rb2a3N?sohM4+i#UQ~+;1-gETj8q@55sP^`L$}gxeH+g*a&2!q z1?;5f(ZoPH0WG5bs3$?^rhNAuBx#RHQ9OgqIm4zLkZU%e6kCM2A?45xBdv+NuI+#n zLcsg`*M@)8`nf7|T@yK^I+Sx2haBC6m^`kx_vWl%M<5NO61MGz^ZAUAAD+q?GXC{Dhm|kVC{W&FuoY zX+kc0Ou(6Wv~mC zf@vWkjt&YieWR124@?~v-5Qz3DnpxYp@HUlx#IouitF`?({jMm(-W4%jAfbNIQz0b zH;D-A6_+0H_3IaW`SKf{jz^r91+EsJ^YPGf0y*=rqzG90o=6#mpJQzhs;DNF3~0b8 zjl*%l>3D|y`~msfZ?t$=gZJANtB;5=Bb5vv16IGmINb*Jxs=*iB}D9Xz13zYWiV?? z!%JU_tD~YpR%=Em4evK-9igp*j}cQTKy?Kxqj5Z+n(|m1gDpnHH4=R$Z3w|*J{;%( zJ1x-G0a|0N!j+UubF_z$NN8e6ZD}Wmzx?`FeERSa%jrl1#TdwOP-v*-FYkEy`UP9? z`0nzK51&3zCZEcf+=BT)?sYdiOv?=89CV}x*Xjdq>jjfraDIM*)`W}OT`!7I;?+rX z+bEjoa5!K-EZA;qJ#>|Z=OT9|QJ$0nIpc+L-WUU;OpBsIJp`+E=qZGXRth-;XlIcH ze*5|P1Du_qEs1Jeb#<)kiZxVstH{)~lSA|YK5i7(a=Btz6!hVMSyRsJ>+1{F=;7uW zDi>TP2bD;PdbwR;roSQ^h1GkwdBVq9FkR{pmhsP;7=@H{?u*YHKFA$$-e{wJ8o$vsZz`a=_$B z&_r}HwF}p(16dVvfO^lEJKfe&mC50tsz?plkVaflJ}y!Kl*XhNKoiX-K_UA{=z3_( z=V$!z=`;SzfBDaNe|^E<|NY;SD6cjK{I((afS?Ty(@fclF`#ILxCNw=5fK1ei{g^t z^NOMjf)7aEBj$i`nBmld`FO(QEUrF5ts9h0m?jI8GfYlcv_{nQoY|5QR*zhW8pVYq z08D1Wa&U+x!xW3G3dNyh%H-DC0H(lM+RRt)VHCMfSd3_t0&>B6yEXTJ&JoGip^VkE zpJWo0q!4jB9NRFQD3=b-&2WxH0LgF2MZr!EZsy@;sKhBvh~ccDY9cbJ-G>;YQU~Ef z{xlPiWUM$A#vz>(q z1W-96)gfUi1#4Q7QmBU_dzV2iQKOFvdN~vUc441r1(T33EI20KMDI=GNYuw#ZvzuU)#){gQL3MFf8czERNKhp;M^0;Qrbwbc zb{V0@pv8d8+dGcOBbJE-E-g13su6WcqQ;gsL?dESPKiX#D@xyCOPPA4l|@#$8%%T4 znGb7RC-H#VO$OVRI_&zgEHHX+3iHsIvc3yWrxWJG0;>(C$zomi9C8gcIKk;2P1eCE z4G-VyJU(c~7;#)qtqCIqk|;zW;pgPThYywLb^<`LeZTzj3!a~!DQ6l)BckVS#}HE^ z#nyPsjHlDF$9XD>(`#t$_H3(a95AsO#3y zqdizdBS&&PTdNuc(rC2!R*uoIR(BK^Mkq7(Top}Z!$?Mk*H`Kf)Seo=C-cF#w|8tI z;mg-Ah*~2VgMf|bC64O%>$X<$zN3bc(wOSAc)47}e(CmsevRfJLjn$C-^HmPhEDMqH9t+Y9cXMfuYW{0796MBvA)caaXX{WF zAl+`XZ|4G?3rqoKW8o0U?@(!bRv8pcR9^bNwMk}FH&|tHX(|O)S;VB8fG8FcnXohQ zI4}4(StM`pmOXBz#wA*Z427551=B{=r_%rd!5{uP5lp2+WduZN! z91e$0fZ7J|yg$SUCt{kUu<>v>>@+Quc8!^`Aft`QL{w=NVy~29Y>tm&oV$z@bQ496 zx1qDH{f$h5LAvjIB)L`Cqm^y#<#A+_h^hED3u*Y#%{BT-KlnWob)z*@9iFmd*%Sqr ztLPHB^>C=ROn323qfnjpzt9b>D4J4Z7Q3!9*Ho^UuFVXEjgA+@+$9!hlAyGBuDA^h%W5}E3jR8p-?iFoEC z^|nhayDqJYic%%T8KsaEnMK)|jiTECwiCt5nBrk@yhlOq*F7ihfkl8q42{GKjORZzQfzw8=~J3#Sn^nCTk|j z!#G5i@2D|`_RV^>)LO$-u{KdlQR8APLd>)W76oJI|8p#(E(NAO`%)NB-<>Ha^v@;t zqA9CQBO~(rLqkBWQ&c4dq8U(~Gvd7_@{Qjjwl(Y&9dSR~piBX()c2_rC?5FRYNXT( zDdrl@sP5uyn0(x7mKyT|9*|c8Nfc{38JFm1YY^#)MSM*-EY3$nW}_&}Pz^+Fm`doL zCRQpXLtBR!0%E9VVg8v$K@~-DpCv&z0%pGJQStsy?@8%I0V9FEt-+esL9KS`1^^;w zis%kiqkLrVs}mjZIe~voYm|Cj+t5^)8QRa~b5kTDBs5XGjHdWb+{NEoSW9L|u0=)> zj}&{b=uOVyq#>n!-};?$J-1ln07rXSX2WWt=bK~Wh#F@Fl&_D)8RG*V4Yd16(FCnn zXwZv-rCE;qQIFz-Lx^|v2G0jWB7-Kcqp0HCQffSl*h`4gTK8C`0d-Gk?Bh|Y$Y1re zH~xO@^T*Vv*eDt?=K7g)cW#l_ND6fynK|ShUkW8N&t6AKCT?&d;G*jXCUza*<-Rr=RQ!Sk{N5%?dBP+HI!C& zLN*pH+T~f_OAB>>`j-0Uf!;9CP$jLb*FXjDqw>lq*Rhqx$!r5Xf)= zQ%$2X>PbE~v1FpwRRNjOBw&qF7-%%8&_pBZGz~(X`J`I6w3$lX`$n^6>*Wois8JLn z0jF9iC^3JLhKEP7?{Yo^h4wzTQ)KDMn-JGet6mgN)b;iYy1GjUw|73DJJ%xTe{SLc z6+*!4>nq;g-tgm(KjP!ZkIf-$jPD$0tgtqEclA;X6gmG7%K^9B1#t^_dGSao;B-F1 z7=!KY1?pySxm@t_`U?Bc{|GxT2r1&}{EYMIjGun`1GbHXFJFKC4X>~7&`x644ZeN* zhQIvfFZkQP{aYLk2fV+(CceC6!JQsf=tJ6OZ~`f#R_8wzvWKvkgz z<@1LR)I`$MAYZ0g94g6q8A3ozgzk*hwf)miKjG7-Pt65T3JtwjDb|q5DOW+)o}a9; z8k{Tvxr$a$b8MY;z~xdM_VkS0ZZ{kcrsbq}gdtT3$6KBE(=;QL9pnG;<8yTds*du( z4XW$)+7@xnFK-K8iCC-K-+OV^t4A0??z$N_pMq&WByL5HMN-B}V$?s=M5*KG{5o6$% zBev_cs?9UeYP2RWYK;aEtWc zFo#%05i}ev$S6s{@Zmj0SYxrc3IFN;`oCd~!mq#nO5%|^)Qf!35c$eL6}44NV~c(f zMN>(cKt&)?O9T+Z2DR3r5R_XwD~+Nx94O_>DFq7}CTA2N284A*(X>9L)gx&|!}qD; zT2n->*^~+-X49&mCl^<+o+*&r|tkCX(IbRSn;VjBSNBf(TP*6(rute&fkd1IUuV>jgdQ{XKbH(PZR@cwP;*vlv#DYmSs6~ zj;7J&HfANa!>@2^$U{hbR;nCn`7&3oaj z92-^gV6V9uz)hCY=YbciddI$~c_nR0J#gZgp&pSae|9A`tZ;p{#wK_c@A{Y%EJZlH zrb%~fhx@N2L%C+t{nU33s&S3!8pMOslASX=)ZsHB<5Z=%MBWSeu8uTJYi*0ClY(T{i`bhXy{l}b-CCXzkI{% z+XdHc#kbd2%+Jq=KHx2^$faO89xxpiIBhy4bIA$VHXIIzM)#Nx3mGQ(-LJpjIfuhU z@8uQ)HLxH{Y_s_)$TLrNSfYk<1#{-hmC>#}>C?j>4Y=>E>Q2nc-uN;X>vR5f19>-=n3%DNDjN>4+bNq`ljHH#MRGqX&4`OK5T{o_OOwrwb z#Me&NdEE15T5A`N0rik7CnIT@OeKvM^K2eQRuw^vXogZrP!x3|J=3B4`C}AXqvF+Q zXE}V9&%YXIFC0fKh0n5%l7k---(wiW_JgC@&Uf^Sj+}_p4Uc#&ek6Dsi8OK$>wWCR zZDT!=;y$#d+R}CPnEVcMn8-vquJsW7K=%Y9r{a4pIr|x%I=T_5_$TZac{Z>h*QxlPL zoW@8=;QET`2Ska-ooIr{8zQDf#LkT|urlg{_fe{e>bu;z`_;d?#?W)#-`_?TFLhl| z`mUZIhlMPXcFqyqZ+Ks5Z@8y3ND9PmR?v6kA4%er=gX0B!RrO}_EJw88_rLXG%=FD z#@?QM_9X2k*Z52s5!9}+DndBAo6uW~m3&@7=V^+-RCmb`a-iBp8H(Q5xF*Z!OgZe| z&0O_+s=Y>XBHBl;Rn*^f56>#&x+?cQnlEX1AKUve8W~1oA&9kEbujNI+WHT6Acwvb zxtrxmBVQT%zkP29UHZltQ~HQpL)S|+3eTfiFz-9k;3(fASsRZt<}vb|W5ngYC+k@m zX(hj-G-i!vqn-|vJK;4EWK^S*vDlXg(e~kbIZ}M~x*J`;;EsqU>OW--RH0samQi?y zBA;?KP|NQq*GaB9WxOfZl9Cwtdz7KEH~i?lqEbfEi3FCVH_@?hrc|MTfo|6=*O_#V zsn-M4|3=nxvTkdnS3yPNdVCZQF>FEhV|P+#=^{d`d)-BEVl z6RH;gw)KkJ^}RWAo=+#lPoKnrBjN4s4Jm~hI}7?+(_up4FHt_cLhOb}0wSma8ZE$wQdZhv5$L9~2k0+cC7rYunXg6bl(+TCn{E287X-B8i@S_&-+ICs7*7Xj+DqM&6TZ`*qCD=UAFiK-S&WP)VZ{NP* zQUx8{r2Ffye@0Bcz3ki!`{kEknzNWPL${W7eLkP@_V(7?*>rtrKo)cT-1Xbc6*a63 zP3TI_BwCm)tmXlPP_~6kgHr2Y-0rH5IlvZ!lmH(iQXvJlQxjq)w?QcdRvS2HFuNn> z$pUFFq8RVDZIo%4a_A1#r}F_Ho=z~TVDmSmoNzv$0hMumf2AUA-C9w@j#e5ZR#$j- zZL`|%Q7u~HhTFQr+zbxK1%LYGXMFkfH+=c>1sMhNVZpS_I2;c2-RlA5Aq+PS$&pFe#>(Tb=jhY8E^ zfb;o;$r3ge#^C+s1*taQGBk=Zpj0v@jc7bSeZ)K+@cjIY7$e@^D5henBDs_jzW?C| zib1Px>BE`a?>B#=cMSz4Q}*z6TkFDwru3her8?4MZMu^pKb2J7B?^ z%*&aOkuk!=2%8e(^@@TF6(cU|4L&B=*+4r3QwI=60XYRAsum>xUFu#!IR7=!bA?iH zTn;!cCuAgCeL(OVw(AWyo8h#HhHLlI7Q;v`4TI zE`N3vJ(x%^MNNwx$xZ*$$V$N|v?iEs1hWENBwjW(S_JPAAtcyZJW=%0e(>fZ_HOVS z$??5A*U_3qbQn>MCR7Tk(<$4tHqp5N2e5_EGJ!+fpaY;_+E9~=;f4U#8rDv<*Hjl? z%B9CshKe*z`_RTJ4W+5^Gg${`EPV2aRq)sj0GaN4NFF&0M@ULU60nu5VT6Ey8@07T zL;u;11?N~P76rBImLpJf*I1C4Q^o+NlmWyJ!7UFIt*LGIKc5@Uv~SDY?$QR_TtE35 z_e739jl+DTb*CgO%K_7JAYpS%wZ@@+zQn$f$6_8i)Hgo!fRJu!bBSs+{DxkQ! zQlkw~$t^N6LLOM0(_M^0J6LAaVcdYx7Y7-6kj&LZ#7$X=0l+s-0 zkKA-D`lKk0(7w~QZ73qQ{(4#Q{(h~)2qJho=TK6FOAbk)qjf>t>s&?GEN3G1$j~}s24sNnd)Z?5%2pdv5?lnjq z1nZ((k792$r`ixwLu^eI>lur+u1~H~O^sG94s|jXK4(mdD388qtU1!K*IIJ3<^mrG zlkTh~GX>KJ3dO}*YntON+%_0n&y5^Sr&Sx2(eoAHw-vEOD6@;cH4J7)!ulNP88s8d za2KO79UQDlC|cv?@{X`Yd~yrCaoAGA8WSeeeZ>-qtGU&rVZ$2eLZVTvjp!NBxsU12 z6zQm;SY)0{CvM>(JO+V-6hO)W_!ypBxj8R3Q08JcaemS zFI4Z>Gdu5JF;R`ViRkTlo}mp|1C-abX{xAJWIz;kk~Vf&i)%!ibqKq== zQT=R(x?~sOpH8PH^hD~T9H^I=0JBs7WR0>5lei8iv*j+-+J`OMwuu3g>3YOg6PYgO zQrBzO3=B+F;Fxr+EHVJUdC(kqH@V2VkR!giM&^6ZaeB@{>!?orGjxqGu%n>Bn!DO}UDvi3Nzt{WpcQE3qD0gkJxeLXwpMXmpwKT3^oD~Tv0DOK~~?(&y^&kFD< zLdV>_LsHZu2e2|`j?d-v8Obo?6a9Jgdo=8Pyc1`PVhAb9B9gvpkvK{9;>|~Kd_){B zFfd55kA*`{?Hnb=Ffs;`i5jRx9uno(GgFNf)IbdN&*PB5Y}Pz15Fey>zAR8Ec1 z*eEr_S%ZeP)JM*V$jMAQr=)=T{R#^p*#Nc+BBii}ul*ip*%ME?na&`-8wc^cj!n}< zX&Jevsz|Y6%&EP5<6bceOvm_@CWK7BBY#M-l@vsB3?%J&s#`CVx{op>GF>5(+?{x} zJdB#!3myekG)h8Sr`Q;mQbEdqj~gbGYK+LO-euFb)*7mQj$8eisjl~0DHy$<5p5Nt zWD%$Od*Tr(&}sWm;V7Lw>Xhqftu;#h|B;3Dx{o^?lSX3BD5OwnwBIHS`Z8F?|EnhaVY9RSfim0>a#spgFV$yEK*J4zDj|@cy1nPC_E#T zB4h6Bjsmn%tS$R-QivtRE#saewXPE6q!BEhAu=fYh3flYiS3=KR3Y}XG( zoKJSaqj5w#*M{iWojGr~fBRZqptWsvpdR*}M-i)1OiO2v(f}Mx8RN5C&Z(00DRNi0 z=ZpzAJ-NtQ3%fsf`zB_sC8}@ExLhucra@VK_nBc&Pfso9`*OK7w0CnE>(Ujd&RL{- zVCM}jXN~jm1Z98^AD@8QMBpICNpz9{yF~-2wM)LCg_q4z#zYo-`g|a~O6ibn6wmXv$_;40{MnuNT%Qq}j#fKG& zun6o7DjEd|$LD8?uyEvRKR%zx{WVh*6K*#cV{mXa_>ES3{{Nw6<@x5 z!SQ&+-~PwH!PC=Id+%B36>`A&`I+J@)+GqWift?7OPPDP>sdcE7Hd6~{9T(UoyH95N7n9Xc80v^#IjYymexse*%}xP}lZ z$67nxROcZCtij{;^&Q4qELEh%bcJQ%LSZisrfDLfN-7AO$FG0+3r@!;!kZh{q7Js( zinw{4PAB+vgU$un2Ow$Wl;QOadYKTm4bX-#-_9c3RuW0&jJLN-mm_Pet`TyCyVsVA z44*uawTgze4x8VI(4xu391;mvw6)N%D6t@V535}j1SLeDkz7PFu?@%@Y+qLrR8~Mn zQ(A*brywCusgXrFtBUP!8hvP0Xy1uM)3L<>#lWWwm5AI_0ttiWX~8rv_twl=!cZ09P%*I8}-Ec7%_>i!z5eW(hqY*p}D73MF zDKNGGb|Xi!Qb=1sGAq`1jWu{&wiVZPLjiD97Di7*ph=0Y>z1IB!aS1*jEGnXsFa!% zHYiZk0~NqDc-dkg0#Gh^eSO8DA}eWQH$YBMHF{?f5fjciq$*;t#vtVYmFkdH@2+YV zk%6d`51aj_=DX8D8h7|^=}M7@)E4#RbcegXSJKx8c>Ni2NU^RfN-|xPPbs+#Kelb7 zby;gzO(;$tzPH2WT{AbgxFA048RMX^yAS#2$su5ju^S@t_v6Fv{_}LNbQgyXdFX2@ z?kY}(%B>dg-ox3sYtW_?I~UjaJhi3|I~So;H$dlMkaR#hK_+SlSw-TWF;kTqIKI}4 zxxL4Iu660u;L>3#Ysu!8D5^ur0;Ovf%KwHAPrVC;b9|X3Bi%yWIAvkCbO$mS&05h3G4&w9_XA6PUO%!B48 zKX1;t7MG-y?#LyQWHQflZNiimr7NSK_*vH?I+owrZQJTPkvj2)6lKU~L?ZY3vobwt zi~-^A#Dt{F#qFI}cNB zjZl1N>3^=||v}e&!yJe>jjWc?-OdBAXS{L$u$Jb_bl#PS$ zJzm(hp%>J?25My*CYqe<>^`M6|9ZXRdL`jZsR@(q)@FM`sS$1p)8r6Q z1ZlLcci3YbZ`DXpNP&NNr~=jSJ@w7wNu3fi9Z9hB6c_TLr{L(>`IKVU2^e z`wJeqNIQn zBD6IqsdQ`h7=QEVnUK^Oxo*C_z2S1XG+MQcry0p1WMr`*K)=f*O2ye;B6P` zhqiaIaFJ_ODQIXz0YxGqS<_3z|F|!VPUEfaOX>ktVjM>CJ?FhlQfF91#?QPwuSq&X z7iXc+2`Kr`=enXN0Nw93T5G6Axd@&3BvmqHVUn?Uw;#nljxig24OoOO2?SCU@~@GF z9+3tl-BFS@<#*&ii|RksM4xg9)I>I2gca_HjHA%S2p4YWIu=9@z84h3Ub>pIk$6}< zZe16_#e(g2eyq=d-+V{Vx?C=;p8eOzOsNe~Q=3P~dOHTLFU;d>Q2O;xl1F4+B?r)C zZVlaYJ;n?0J=jGgWq8hnaVhP;Uq)AB|cf2!|ME6LR0#MK!yCUA50qI(i3*P|TeGLB^tS zjAyALdnr(m!XLV3rvEJU+!6*cTp0iWAOJ~3K~!?+NW#wO*6ZND&Kh>Zj#fRHm)9sM zPFt3xGbM~?8LmyoNE%5$kXbBCUgP8$ zbX+%!c$bVZ6scZ^tmB!7>zUD1(2J!~6W`H%E$q=m1$XE8N2Hsctk4tTO3C8vq3;Ms zV-%fSDKObq&o87z%uoPfwY&Qw|1@%zWmtL#`Oc*3mBiHp5 zQ&?gpIWje~)(2cu8KqGyb#&Tit=| z8ggtTl%)FY-(fT)aUbzf^wt>TDbM=+?8#p7*wfPk-F~FD@cn<(dz5<%8(+QmWR?=Y zhohGH{HC>TCJCGSUYh)S?2NR!e?LT>ri3v}8Vlu`(RwB=rrE+Hc6-UA=s0=3C0R<= z<+5&+Jx+pV^fc~N-$Cx#rbM&3thir~miAy2kRf}sbcQAfta-S0wCmt(Bh|^hG6<5s zG#O5lx%R?@ z`1I)$?D-i8E7scu+7wL7gj5?AIVC#WYJ*%7*6jwR3YNo!vhD&EqZQuX-thYRj`R7M z1U|7qO{F!4-0=yoUtbY!E3WGe+SQn)$pO;@oXC7-irq z&1GI3l$zRL@#mj^uCWqHY@X!QH-?n-G)|}HsWTcSl;(<3H7Ws#3OJOSi*2Zx$uEhW zXUqyng*JtdsiA2mgXfP=aBilJBhdlua5zJQaM2}YSQzBs$%TaiUGdnG*nGF5;eqV9OgqEz-^dj3+?EAQ8iwI)TNpz7nMLkxG#+mSHzSs&kGg( zDkJ$Il+{2E9#-pG{Lmp;w_=q(+wF42?fMT$o^sU>hZENIMh98WH4WqnetCO`_W{!s z;pPc3B^Yb5`3O}MLMr%Q|Mbte-7YwtPWbsh{0Y-xK|+CBW+>~b5<0-z+62f61q#RW z2>|fdzy6AxGft-i{hXSWOYtNIg%R1-HbR0@b%WKl_|ZfY$tfc%U1OIbjL8To!#V}) z3=U<6-@;u^BnfeDG;ogzPai+va5z!(rFiP+sZ6DP&Xn^$J0N&OAH)GsBh=h)M29k5IXT-6P~{`xDPKb&E$#o=Iy5R<6jiQdB~4S!q7SyHNK%Tsd|8JG_wjtf_h zaHVz3S&eC;W_%6_u>^z^5psqp^bEbfyfpm#`|Vl}y%yzgfS&h5s8JRO!O2H|EqAaW;wSBDWU6nFQOjxYLG+Efm!5W3&Yt)+Av3Q1dRg_fYjIz3m zJIFax6C0|mBqi;=K$I@f=fNKCod89A;%NXR~5yRFa*Wk3JF|Ih!z|M;)}4Mqch z{KJoUetyPM>0AC5po_vXA1i4?SNvpv&E$A%g2$MUp%4od{nnW_1h~AtfQg!OvEEl}}(Do==2)MV65jY6ei z;o9L)O*9NsC1W-Q0fpR137D1{swf(CqzrpJ;j(4KK=FT?Rw23vDpN!hNPJ_ptFEfF z$NSX5im{4f2y>$6q8^x)p+S)p#gO1t!7UZ@&kF8Rv*5J>azRWaR*0cLkP_u21G*m| zx4~x}>W5sL94NI>zY}7P$0Mx9a9A`XOsE5{^NH3bC4LVV>)W<9vCvL*F!=b9;svkQ zE39^HT>=233akdjlp!O=)EwAK(OO{QmszO}T{-^+}9gG&vXaG4A<<8BOeiQ@kiOtbcS`-G|UyaRgbgg29 zwW-#nL`fp|5kzDp8bvXLK<|N3n2$u-vReOdzTR|6k|Vj&J+}E0ky#s-#=;)*^3G%M z{U74~nGtfxCK^ChR%R^jZrlB#s^)4Q)zcy^0IG6{@NhR%Q$6Q94~WN73Ib!rt;t<6 zemV`gkIDTa z;wSGdjG2{KXOHOe-s5_`Bc;-sueBH;JCqWUL=2G~%xt4kjts&!UJS#xUMMzd~f(*kz(lva&mvaF`=^{H$qql0Rt5SzF(D>$TW=|18m5k>BQ@-nA`|fFaEvSiC~}je5<7>auEnHbzinF=brk|p6h#np z9I{BH>E&`ELgo3~Q1bFj>ODiEZ)GT{1&>1W64QwOK51%dQP)l}GtHp{?S`uL;XEiJ zK^cr_BZCFttwm-bb`u14)Di>Z09*IQZCp1(JrC@ZvJO$si^jI0MvyFVSCLfHUe>pf zpPhVYs*dB>IizVXi`}|UR6mC>IHK@b67R^h7ID0Tfwz{|`O*jj0I+bKSOJtZH7DxE zXJCWJxHcN%(O|<^b_iM1oXnM;CZGZXM;q+9+m!@0?1Yjy;w=(s5|#!tB#buQKqHn6 zV=Y41vA$EF_@Gh>mbfCXhEhkteb-3UGC19F{5o-l(E#w+3 z24K?7s2b$XIT%Y#*UF-sU_{7nIzgwQ} zZmd*~E8(cC5s7;f2?aJ#bQ7F|pGJ&+#B#eMRiZ+!@rsYb33htIyANl)e{y)5&qU@O z0<3j#nFTbpz#6JkVoGqH-ZKGJh!jequ91ZXXio0nM>bUvHM9*^EK%pSQ~={(ZN}+z z!Z^=e{D#o3ydS70lNy+bKGyO5C+=Zmu%?J$9a2rG$k-I|E5`#}1LVpTk&hk_YZ``* zb$j>j9lrbSy9dF5VFIaj4&xNQA+SqGX+zHAE-uhw7t^|yyHP6vQ1o8TanL>KBdomt zy6O~F&T!#E0xeejseum>yL5B(xQ7EQ!sZ@JErp%)7O18h*z0C`CxGaN2wXqGG2xNL zBuv072V#&ODCnV(#P?N~Ve3v#+ph`_$V+~3&r@AzItQ{4HNbQ;Q3%vhSSZK$8WTsH zODLuw<$^Uuq)K%I#oO6Nc_;=j-nAGyE#e*L31d+dhMZAMW%^EOYhGdDl?*eib&d3? z2LUlg+;3|qjwJ%B`6m5T2AM6I!P+LS-svth8wPg{Z+a>}-M^X_HKt_yPC$OpqacN*h>pixY8eO^HnI-!3pal^8%?F^Nf zl$4hAKmyjWnMAH-+8%(+u6JMf^G}(C(t*qbm19Z^YfEFvNIA9PrE{)Py=?GUHWr`o z>`kJ?O6%vuPB0V+ z4<%ij85v^`cpV+XK+h8!$b@2G9QA4??na14A||Q)`nPT6=S89tGjiULYohzvP+!8b zF^cy8%5-3ZoFo5ibd(nzcSbQlfUkZ(^EeOhLnGp(9N~jQibN`=XEQ6}L1}$53j^l{ z7&sVPnd&#N7{Rj1vmnM*87Y906UDq0(`Z}PP`suH-8zZ~$4rF~h!$B2zplDR?aFp< zZHu9I)*}p_kD2u$LWr&lT0cRAa!o|U0`FW43>@`Y3={t%o6-z$kEs#L+P#-$(4A3? zL|(gQ$ZF;yrpOqASF3ra-=N8B(lQDTyW^jQsHs)~A5 zhH4Shq!P){TqO2r?-x}^wURxEUr5X|wc0{r;6!ZY!bo$m0ys8joBAkh7BjoV)r#nW zs2=u#;33cL9_@r(q{Z__bo(Rq#y4t5&IytGo~HIOZQB+*5uc8Q65*jX6&!_J zmFd`eZE5j*yxwbrY(d@U8X~gewO!81HDzQL)z(_EQT(qLY2vU_LS5B z-IJrb-Xi5f>ko_nN-ap0=B+wPUOy+)i(NVs8C35>*S-6*W!vwCq5UNU5AhfuBiDOT zBAG(0+RyZ?KpV_a3j8!pxLhujIjyjhQfx^BfG&tMz$(@?V_9$Qq0kQPY$_&hn9Qeu zoD=SMQKFGp<8+#EI-M||M)>m#3<2?a!5@GA9mC-8DZ zpZ}#(;>nF54hI^rP=oh}AASJ5N8v?7hL9RA;5$Y7(6}kiBS{Q$(;{V zI18BZ;_w4pNai^Q!8>w@WtT#bOKH@ zuq^a__XVYwh-t$RCcM490fl0ntT7a|w62J2 zRW1k?=NL!vSd|I|1BdJ7ju;~mc&x|knwziDRckkYz zqTuuA&vh!v z*q-IVdDv;jz?rGR6D{gA&B&JzZ@68q)YSF?Z*Olj40jGSW)vG4MNWkTYC(+& z@wQ-kenyQ6Th6%L=x5C5kqWH}l$3x%!mrAQP;V_x<3wwVqtCy@#F`h=;vwFh&P3PE z1u<>Zv@RqnDzzXRAUIF4S3Eeayvb74?wGDZEp%higbFALIkAh|kb2ux1INwwc97&| zk1Ief26ZdQ%LbEyc^t9if@~Ak`-(4L-;iU*r%&HuyWR1h|M@q(yu9L#%AD!m`UP&yWkZQF*gU%%qz%asIngNGkIa!DAc3G;k{cOL6}M-Ahk~cIU!FH1K?P4k(O_x7QB5K0Oe?qythj;%T45~- zIXJ3FoQ$QWj!<%RSJAU!J3Og&aaj8;H)&O_&b4#1XmN)%3U$a02Hoh_Zc^PStFkZ}!XWBMoI^Sg zQN*dG=_20CwXWU3LI@WfGBu@km=mrGi|SE&{4>9Z;=BL_szd#ZpXyw=@t6C`3{_4EPPZ_2#EDQsVm2N!)I2 zpKA!A31UQ;($LGbV%sQ=F{cDqJ?vl`rA8XF-djx5jB%WCKA-XQ^wdz|N5^iLUC-io z`wiD==e)Oo&lyo@OGZWL0W`SXHk8WIcaaCGTqKrKfZzZ_Ut4kp*4;Tx(^;@_W`Z+& zbawR~SV;Udcu$500}N$@StHjf2F@B(TajgWx{;A4j1-x7Tkbg7Kn8$ufX9Hr(r5ql z^n}S8m`ME+10ZiJf;DX|v>X-dtbr*#O|`|^sbQ9Lu3^Mm)6lw(Iw<#m3{$n^kcO+S zJ#WV-fQ~SOiWCzN(45als)lxaws;qqhx%Es;kq6YqVu+Gt-mMa$D#yu9p0+q{d?N(rVs z(wUBAxnnJ$o8wJrsYs*7a5OX5>!naYubA)d_d5nY3+xma)9t@qB&jjqtPyq0j~3wT zhz4C(TgwQ3b?qWwOV9V8J&1_(b=yOG@DSThk$==@F*G#a}lvhnjJi5yD@73hb{dwu*l`P!uzHYJCrCW0= zcG@5sL3=;9%YghC(`AE4;8Xw^;>x-!^{|}l+kh|Shk1>zXJvn#rm6KnwOd{4X-xoh zOrzJaW7@@jbjHgdU+*Wa?m#~r%_$#<7N#SVYs!ic_T}p|L7;%BdP07SIb%KuM2{p+ zAy$frT$Ewb_o=nwDilK*Zu2lw%%8`oB(KQN$LCzctg=>%$xna&@)@rzEWsjQ;%d09Ua`(P#UB(60a5@XJTclMrGY@EBeXMMJ|O*~5d72A;uYe7e=kTb@S9HY-w`gQMA6gIH<5e5d{OWclq z7#JJu{TpX}cQ*DebTz=f-tDo*niSKFCcIBt)1RT`Kjm!X>Vf#iWarBL!&oCKcEj1x z7^!1dh@!!DsIC2e$%YkE@es47NmIujtPrS=(Q_gu0LRC+v$c10CRU^?u;Eci@Uk{) z;z%Psi`m>+Ae&}bYc#0}gkhj`59i3htm27uthavFlj;#2&we8E)`A+n{*!p7f98+9 z5N*cP1V-tt-0w@@GgWcqnl>!gLKDRF=lF2%Dv`1#u?ShEnQd5rrti^G3JGrbTqXTT z>CYE+PS7=NTQi#=sJ1w=cAiFGgSXTM)%R&%2TcmEhgc>S3mu}Yc4AQOY91Y{rT4(J z?M6M_GxNrFb^mc+(7pPO5MDAtF^ui{cd&+pfBK%)>$TMNN`OmsN8O_ac^wd;{+g%< z-^ga_eYDT#(5usDo5$WJ9@Y^3HOF%NU0K869o4;aIU z^EBgjyWzgx`o$_|U|oTAMY`VrW8j}ogpbWdeNdI$bCPpysIV-#@Ip>%|11ZZlJItY zqnkaFliV1C6cd8;m^hxp8_Q~E5@XQ7iVihjzkbDs_wOls#*qle1y2X^x{GS)ra>!= zjwtOALTfZgzGy5NHAaNssDU`J*nn(;Kn;x1m6MM}$wYQA+~6V%ki+cez0eNw&i0d6&T={;IgJe`2eInt2n*c80 zybmy8z%Y6|ohWnu%jXN;E;oGm@PURc?hMZZXNhg7#h{uBm<(&^zSvU1wiX~0@q!|D z42*L;2r{h@b`~`B<|e2tHWN;S!wdn-m7-vN|Lwo=)6YL+Jk5xlDJmJE-g^|6+B5t1 z_J(;p;qQO{JLdBV<2)cZhrj&gXN*7Z#m39a3x50UH~iCIf5CW~@$&M5IaqvseZ~2F z#&n{B(0IX!2E;})sPN1ZgAxo-Gv40bNNpZ7 zp3l$t^zjE0Qx$_+GS)RBZ3*jb#flZ4Z&Fa(_enZd43099hS=#({#eW{y+Z{-dcS5{qOkl#QlCn zsfqR$$zeAZE(8Qeuia&bm?Ix1cynbjRa2;YhhZ8qof1MAVNAsjKm7nVINVr>S~;G< zT8p$TxYmM`IU@vz(=?#K!fg@NQ+K$ywqI zMXgn^B0Cd-t)QTmOaut;U@H&cIZiC4jT<2q!8uqHP|xQ!NY6QA9ERpLBXb4g4J#2Z z4EEg7oHNGLiHJT5p*paLt_(Y=!JuLsSX5C8MimhW6wW+WQ5FXWk&bDh{N9WhSLB>f z>!9co^!*ea`Pf*G>juCecu)DgrR*3-IY^{LF2Z4gAJEnVo`~`qSK$Uv12Gm1H1wfh zJ&nPZQ*)=6l$*=ZfXGSYo{lZvL=IfmT7X5HF3`R(4db5UdWZoMdP?SJS;yy8viQNO zfmL(Pjw8GqR3oa#ICl8rHjpMlimjgRdv@wLQ?cByT|}6Ug_I_P#>~t2(mqGRg-s0_ zRk(s6@ z3Vs73VbJxXJ>OZ12Q`eD_HJky&UD}I!W|jX>n4Iwg!+RXudz8J9tbA-I#ctbkDJiV zBz^D}r&#;ml2!9FG{TUG^hA6^F&(Lis`n;>Z8_{Tw6CZ&A?Lfg#|p*nu@G3?Z#uVF z=s2z61ll+0OdzfrJVsifzz4!*%lA&xgm-w?ga?_Q-P`@%T)p3lQECEKEmk@>IC3t4 zGe{}q z2Z}_q9j;y)lOkT&8%L!z#B{^;D1!m*z1O> ztV!}2F58NMKjUedP;y4xvTE=X<%{aeUif3$&}nygYMg&5=Al8R2l84VBSR#VK0c<8 z2rJ!n5La9iz(sBdDY1tb^kd3Ra2>{hVqz1!);aTsA6W> zsOFE$h7|YaUbPaLcgMP}L<|~6oX=0F-r^pKD7mE-2^GN_xG-Sw4mDXMJ}*hb70x1- z2%9XN_pp8!EtFC)VCV+TFnjac^FG|IUlPYwDuRE);KM%H3;U4IIfr>ZcLS(hH?T){ zNnPfwXJLb3_xcgVY}NB(;f%rL9M&NsR$wUwb~EkogC)vvGE_I@EuuPuVk^>?VI5It zC0c554!Krj#;aR5z!}FVbpvDA>6*#uJckjdF`K84QYuy ztjP@{eYsrl_j|&4{)i9r^DeM2ihKaTh5&CsgOg-oQHWIIOe4+efsu0#qgo$otxVCe zElx;?d8W%;mnf3b)-n-(>ZY-d=2u4nj-;HhOTgZ#DNrzBX()#3_}! z3vsQr*wnr@O%rn7g*x*2>g#ljh0()38B*zc%9x%EQ4NUpsf1`%JIwj@c>eiqpkL5T zdzFQq76$1M0T--8Dz(u?bRABSErzJ9-&l|Iy0Q<W!5#DdJKYYinJkUB`jCCB@O=oO{)AsfueP%qFL-wXyKa<1Q4 z1B|Kg-opE-JDU<^){vn}sAuC&DqZdyYB4C8jCnE9ev)G!)ubb(U z*DG$f+fK=`1|@D7V4IOdJ~uJpdhg)|*VV{vIC_XOOQny^7>60o1{4zyYlQ8Frcw)Q zK@6RdO()`$*zfzgDvDMgVFUm%@08beJ}sGI?`uWDfJw#2h!L}$QEFB(UbUU|kHdIb zqjTwp&{5DaD@fn z`m9CkLsoqWu((9(95x>@6-ms8RF_e2Nys>HONX_Nd;BGJ^;3?U5^8uQigayVu&|BF zB69;PKd+HqspqpY1#y2~Jac_`y{!e-*awkfJq+pFc~^;%YZslzKQB`cufUK%DD|T0 zly*_Ah{ujpL!uGKMm;6-hhgz&=6#9G!(zm6rovR)?gxN~GFrT=&&%Z?DsAhbDV=~a za~~U}ucH8}mm9^73Cl$Uk8MBWUI{YAvGM1bYk{dO4Ae1u#x>zlVj=prZ7m9O9!5Gx z^1N0I+ea$aP5?@%l|)w7ktsuJJ>5^-Ma zBZFGXsr@W5Qfgza4ZfMocR?OUCt3sJ>E71o9&2qQ<)Q*Lvk=l4HUQQKB4w#UmhJZ( z7&ZUSxy2EEE8;4~i1YbOKPM(wV=!=iYf2^JmDJ|m)3vmg{_L$sk1>Y{u;F-9i(^rY!7_VqwP z7qV|BUea;BDzdX9^fMHMQVUFLiD@yj7c}BdP6*Pr0~pZlpm0D=f#MJRI=l zpUbiUh9Uv3*K7Nwl##Wls2GNkZwT6=tT9NrAZ13Hrvg~otS*-e=3%6R(iSNj)On1jc~=~& z#-@CL-g~^he8o79_~n;hP)dRyLL&=ll&@?61LNLA;nsdOFQhOA7zX&1a9u7gH1h#AqhzC;Jcgpds>l4{Jzzcl z`2YSl{`TL0$G`pCzah*4zx~(WFpfL@q@cnDLS@q6V}FpA$C-Eh6%@bq+o9|ww>ijgxV>3g=awIOgRgtdNtcg8S!ELS4u4D-+yP46lC zDd&vSe8N1>xZf5Yj-U;TTg{Iwz`|e-0}Lv*xS@Iy(%EYFK|CBPXz+<*h*V=74BuB4z_unJMa(Y1W`p&<;qB!O zE>}DcXMBABo<&3s^LWBMj5y6Re){eQyj{LFH__!XwqbiQ=(81zZEMSPnsHn2s9WlC z;ZsU5&S4lweD~uIn5QTBalrNZhH;*#Xb42334w6Hv-4O|#u_)EPRLs%QOjU)o<^*h ziZ|y2?HeqZl45@l=Si*b&Lif8T7WqWxJW^oGhn5N&d4PpI7fZzispO?ZfKd8t*Ksj zw}iD0;9Tik3QQ(kA_@_P3^%e(A>^X>7R$CGxPX{9juP}uU_*!0#EpXOA?s9zxg#tV z|gh#1}Y3*Esl1gcoNJ)p|$y*TGzETPwD#8zt>zSMot_Eb$1pN-cMy{V7w(U z^Dt0k6KAxF+g&>XWY~UesL4>@aC1?bMm1;78+Dk+30sO?)Jkx^HQLfW!i+Nw^b85k znu4B-Up;`9wRLyz)aH~rM!V?ZRUgW&b*+w}h(Hp+IZsh3gC8DH?(*|)w_A%*lEa03 z7AfzJU)|guhT$ROUJEv);GU+5qd%5L=W)(a^pPGSsON#mG;_PRw{3%|L^C=%LidJ8 z=}@~esFJUd1F_|GS%d@5?!QxhZgZ!bk%xBR7)h_N+qTtJGGrwIU2FsUqw2qKBxZ-( z<@djBxeZ+R28(G8EAKMU2|38w)L=LUDwti(alRu z?9%sze!uebj`5lMAjx)-Z!&m$dwXkVlP)%a#nSS*9$ilogK-pc==)t?YpLbrzR-E< z(rlCGKsTk2KR2cAfz-1jiFZe+P`4h3EBzo7+?baC%V&gY+qKsXF-;w7$YSTZjAq?X z`_|C=m_4uE;YZ@t-t4Upu4w()OG8=Shpe9+WkL_+YI$&q>SlU#vzA>zr<-^3_el-8 zbks=`AhC#co@eP+(BB)1NDzUMh>`X>gPNDN+9u4R2-vcV97@HyM11-BiqD_FVA)m@ zm6Ga&&O?cI&)|^D~yF3Wi1JdX76ZZ!;81E_e1hn3I zYUs_C&Jm=2rLkRs$G{POnPY%u_ zoBdvNs-ZfJ9x-PO&cla*!f|F92Gtm>+Y09^g0t-$Bto5)2NWn2lh+!TOa@pjeg2zC zbpG-V@1CD=O$n`RE06)gDFmWL z{0ua)RmF{OwN3$BlSn`llI`^ z)I<;&pv&1y`V2=ZpA3O@)B0N!8f{=|XHMS_9CW=R-=_sS;w(O%A6kuE(NpS_38LRe zZ6}ZsagR3H>Do`Oy?*YGA}D&_{b#Ognsr@KnRq^qV@LndB46r#2(1U*+FuR2h$M+~ zM%n2|y1s2awZpTdU$YG5bnVj7GfGi}wf^2dQcR@Y6B5I5*k1TtZJq6Fqr-4su7$of z$DzFzS_8F-YD%H_l3FXwK@1`SkG7ws+R?o9o-I)(R8R7Ca~8qu@nNUasjEp#bzMCu zYqf}U5ohrZhbY z2T>T+KDImah@f2z;Ifu3%d+>AP?2+Ob>E=o4YC&J+zaX@siCbC=R3IW6S*!Jc z@+h7-o*5h6L#@~CTABUNawUqavtc)30EgJG`momNbwk2MiwkkD9qTvG9H}i#-xDx6n0!pX7wzJ(T~I4V8+{&e5)Y=#JDT(>5sc{}CQcJaOpDvr zVq;D0=>!Rf^Qqo%@MjHq;acUm9wFF$%b?TF z<<@Y&dEbL|f=R(qB!G?(XU!fznl@RDmP_~`uVMnH+_AtiRN;q?4GNG z7_re_L`3a9J*(fSfwFpzMNnfw_q)_^jzJ@>mmtw&O=M=8dEKhl)y|T&QuHfRrEKj# zUzvw!I;dU?bdN*#6g2@zJ}13a>)KPVtD4@b$=659VP7k<`0wkNS6D;1-a%Z_#k8VP z5RRmH@}$^Q4us~MjHzX<$|7{RTyVc-g9{!Nl?Gsy z7P{NA;&Qt-mu}1n!!#o2g4fqq)J%FJ3xaH-*Vzu$3tz2W`)_tXZg#eH4c0zUfyz+#OFudf%(Gr1z~%N4iV1*fMo{NQ1? z6`r$?W62nUZHKY@y0K`74tmpkqL>+%VeQ@w-5WZNH)00^qAE$Dm^X1GRaoOO1lzLi zPp4BmU^?gEEU>LBP}#wlDbG9v4dx!~=N#!k`10iouD3f(p&{Ps`HYzd#QVvmTlLu@U}m@BzVj%;SVyB2l_vnc$V_08z=EGKA1v zX@veK!AC9;1|I8nLrn$M6~uc)ylp_N$XmkYe}-jhS#SWClZ z!x`|b#$FeSP8*!ZIFYl!f?jdEjQ`Auh(IA!R)afQ^SOAVNEi$6EMm^Ea?o=Q-Z}(t zQQ^2TUfPgrSr+89@nB}-HN+w(+X@Px)@?&g?9KtzN-|g=QBp-o8NqUXw-X$FK}?zMt>8&)C)A8on07}Pau-5V z!Mm2p%uyM1MG$O&8y!r!qr^nc8>U;e#$_oSmuQ>fep?pQoZ*I{MZVB}VmKo=bp_fI*Y`Cl(TLb zaTT}R4iBh%PPObE;vCmaJZk#c4(GfhLo=g!Nz^-3-(p*0rN4Nt{y^ABpJOrA6)NJx3_ z8d&nIlQ4yxVt!yjRe>Tt^?B3#Jwr|Rm_)!1Y-w%xi!`&hHFjcxHkdc$9+II+Dl{ZF zLVK(R>uqf=K<7Q2yk28LzE4X77miigQbb7{k;7-ZbzSl2pMTqg8LI@agfKM68>@*!43yj%`0?t^tVZht=1?7H6^7B4?-Zm`8BGigvh}KJcI>(4Q zOHp37U>-(}`WYzF3;o(DgHs{5IU8CWMsNc%@?pSII#HmwrL(vf>rR{5hp@Hl!D+EA znLP@O$#5<_I@=Z5i((Y^7=)q*<9g_(2VyQzlvau>O010>A@0#?4Jr&wad38z{VXg- zr?oD@4g2e$g^hbML)Z_?OcNygrfKmU4^d8ys8sjwm7j^)eNSr~Th|<)nauz~N;o3H zsfOvBxw5WV9@v+votUnjJGAIS23p;afY%aZERiqWelF5NCoNbMil!cB>A_jUjVlK? zu6*NnIj>X+0d0{Z6QsN1;+1P8mb{S|a*x`z)Elw#E&wuWvY?iSVcIBYK=n zt3Ak^=DPPNeT3ZTsys}z4w<9S^v@Jir$knO&$(G*G114B=s2TpNPZYj%R1*==!r3M ze@lEvTc>0lL~lxE3VBsEp430u%%G!X^fR?T&(xcUQgan16&86vLsw6>``J`#tr(*7 zdFvh`&I0$sQc67BGO#R;G-V^xlks$>sg4QnG<+?d_YvNg-4I}FftA6YHE=_~5QY}1 zJdGo!^Qn7=B<@L{T}61~y{BFp$JBt?7!?(UhkG&v7a~R5N9tqzg2XwIxUqD#zb0!5 zu^b?=oru)$_j`-AP6xqKDr9Ce&NdOv8=JJBpPyTA*m?&GI?uhmUAh6Tj#iS_8RNn= zl|u;o-|2mwj3W|FBSc)+_Dd=YxE5CfyniI5)kAhoY1Jf4`EQvwNo1^iO=fYr%!PJQ zWkD(SKr7uvmMsp3Uyl%cZcOuNLV4cLwD?xXbL(@V#AsC&d!x+;9W_v04QYCwHPgehcxFZ_8+9h+ijdi0*x zC*ztyvg}x&2ZNOmru7-K)=HFXV<;h@Rya@R*BEoFVL}M)TvtkIJw^*6tjK*U@mDb? zSQS^PsY<#prG+&jYBZM5_BA6XqJQbAR+$t}J4(ZB1}aD9&6bSEFk8U64{C zGt2sL{uerl{8_360fBni#$w@TewaqC!)h}rdhbavUTZtYN$o?#$NjoL#!H$`G*b;d z!(vP|&Y>ugRo;5@Mm2^=FKzEco0k$9EcN2SOtT{cIv-fOc4GV^h@)0TwuF6%Eo}w` z7HVig!;!Q@`wyAT3wjZe#Mj0s5%9UAIPZduJ#JSh>rMCw(|X{IgoXM@{K>qY0WeZO zwAah#GPn1XM1+>1dR#&wJkYs>LA%EX+g2;f8M2Q@-9>ah?1s?H0-(IEjm9I-k;Js4 zk+lqLA%n)A2W~o%i!)?A6BCMO;an4@$hwaD(A&)-eYx3K8Aq|~kdn)E1phZfH7 zbv%Pl4*P4(_-22(6XG05v6{5qNN&;(V8dO^8Gcz7)ilY7iJFsA{C@cGp$*ThwMZ_t zXn}3pP;!rqou&z>7T4>QhZqitH#x!V{qe`2_+S6)f8*(S#>bEEVT{4ow<~I`_@}@A z5B%%D{=dM7Pr&Vhr>A$ArV$mH7Bx`!tJVbL$zd3`itT>KPyn2s3E#CuJ`mD_yRIuY zsw_^PVjI?V-Cc{9H{JxuRVxRtR5EQeAp>ymrXW>nh{5g~e^cD%f)q1Sj&P0!F{AV3 z>hd1j?T*4RCLR)s!&hyMSmu*fAy3umW82j?& z3&wGG4~gpDtP3!WnC2PR`xV1D!j1zqE`q0jIsoHHo9g|JdcWi4?G*s<@%vBob%tI$ z5@Hkp03ZNKL_t(PHA9LL(`5b`j{cpUMyJyWSXboh4K-yHmtofgqQ6?0TtU2f=`1_= z*<((L1SE#2CwpW>!Tl~xf2HnCh7a%_+ zP)%;C)Ga4WQ^3>di8cvi@brA*4J4zQ(hA+z*H^r~y>blB&{X^(1Ynu~W7>iE-T4W% z7QB4Np1b*^9#Oy`HWHuzW@GvOw&ZK|MEr$*qmw59Vn8`2ik<+KR?45 zgYSR%0o!xLU%vkV^V2ha`|WQSM&Dd0dg0JR#mnV_VV>ZIfS42h{onr`H5dH#ufMi+ z;PiCHiKDfsageZW3m4f#SNy;OHq(82ySI^gnQx=_Y_NiuMt_ZV{`tXNYb zJ3Ku-Jt+K}gCM6?aMIx-cR7T?IoN3grjhP>J7NwWfSQoj6>papyu7^P^h9XX^ZDG| zH?>y0+%66IOOE}eHNazxB)>BTOC)kkiW#pjUtz7q`}gk=g2(jyOb*ymQDY*p85jSM zp|!I}xxm38l>%=q#_@!=w>RWkaXxbtOQGkyWEyUlT(Fgd_4Wq5e~%9zKB4A<*OwQR zpMQq&VIQ=XiV_q4`2BZ$`bhU%WK>*QRwU~%%7K<9rzjN|ritU7GHfAquoSkn?uWvP z0_QDkrQwN(2RyA2mMTojxGVxO2vPttzntaw;oX<1ilX;zM z1yd<7e6Sjv-}A6V7|AuJgMpu>Hq>>DY&@#rOIsIuXPab_55v&teZlSrLZXJ%HgwSu zNQ3i8Fz`xTm#{m12k$YCp~E)H=OfLKoHP6|a3OCGg<)<)9^J?YAs}tJy(a=uu~Sy! znXKdAxpl)AamnfChPRHduWB|rBGpNAL@U5GfuS|KeeIf+ddMwnefA90bbsp?FZr7qV<(>C;8qZ=98`IPg%9@bhhj^l&# zlMWfBYi2oqcDF6HMwvJdhhZQbexlbY&Le%zEr?>{m_j4(q2~Sm6Nj$+UVTUjVJG19 z7~1`?EAPWq*SY+3Q%pCpo6F=7UyyT#^L>PZb`NL)fw&ZNCVJdBkq|eRf-P=scnL#I zJnJkddc7W^6p9)ombUh2>e4=x=!Y{${Iu)~f(q9MKbc)?_xK(QQ9GJJjIl**=o)2N z7DDm!8Ok{t6dnhmI)1CWwkm&J(-!oQcjL2APzP>$|FLtiOP!-#`bS5&c6!Tw+nRL1 z1D!;!?L5!zAg>R|O+d);9J0pB5LXcX+SPfa0g=$eKCDmre%5X${TY{1V7zPMZ;hPS z(HOFq%AN**&OGYx_3(5U2AsyJt-ZrAv}?Ve=L%m}_s}@i4Le)=&s@7+1u=dcp6e)t zoLMlHXzw}3v32{-!I?<{sniXmj`3GUMZD_fYKs|D*K*r7l*^^X7ii&)#OP_!lWu}$ z)pXZQO>(gl-FDp~)|lafLuB)VaTcaJLNr^8Y=CvS6GhTm*fEfJ8mV)hmQvu93mn!o zCn8G4eYsPY7gmdBG9QRD>8R;Cw=Vv+d zQ?%0FoX_8&opb|t+l$F)NXqeEJOr^QEn0CH1{xMROT?JA4_3GkketKh4B!Jc77B`B zQUBh&MP#lOZ?{`(#?zHSJKslR@VYJ7kl~FbI%iF&rm)Z%C>+^UnF2ZvBj#yB*$Pgl z6K?B*KfZj%sQ`YQF@=CwDmL$Max!eQ@Wvq60p1x5j_4%v{!A?ob&$MyqL~Z38PF}rV9Nnk8fX8-w ziM%hpc2JC4*`t~YM}Es*qnv~f|1;kp*=U29G>b)~!bBV!EPox^u&#Fun{IvI*Ur*i zyGA?U+N&9-QC#zZ%>OS1p_`SZ8 zI!c6w%d&Lh4jE=^0ja)Dk`@ zX&hXzn(CxqlME5{UZI~a*{4L*B+qiIWozm7>M0D}klOp96E7ZzNd9nc({vUc2PLoh ze!t`O^%YJ&%iyc?nrRb z|7-MHS?f`8y$)HbUdjrY(wt#zSn+ zkuIQLqkiuxC5oAfvCS9spk42`5+^M}o1OeZ|9(1!t`;*K=Tn)4R1fBvW6uDnJYTgP z*+PU^$8)^iE4p~8oH_%C{(Iez+R4wp-GBOCcGfi#N{kWX;COaX`upGzH7WPI)H_Eb z%JFQb#Xr)Aq?n?e%A0dW-~<$7cFJMgB5D&`x~`8b`(WI1C-7=DfI6RV8;NSVn6{F; zecgE141g3T&if2p*Nn%N07$)?e*Mq_C>?FD ze}=A)jzp$C$-{L0u48DF>B?vPZK%G8<6eS?m8cBqY;Akp^3N`2jry=;lU)dI!`(^$?3*0hMMyv25| zka|~yUj<|qmbfSD9K7lU(hLUOxmMqMwbmB5)&5L2>!wC;t}Z{J8%5)->P(Ev1C(^@?S^;oZA;`1I*h`^JUpha=Eo4&W96z`spX!?{^GgZ_3_pE1sVV&gU5)KMt7Z86kN5*MI#N zey-#Yz1?nD*Bf$KF$^B3r!$;0sMcXJ2F8x4HDO(ESe6a$?cTCDO95OMsX=KStOLbr zY`I}8ODTAL`3hLNfo3=JyqKJ?)J#oq^$r(Cy3I>Pid%EPW^r?J0bxtUx<+h_G_Hk) zzvuZx#X&BZBn~R3?oe&4#c7-{z8h)KZVGD6SZ=pAgdBWOhZj|8F+r8#zb%=Fc1e2JJ4>+9hd7B#u$7wpO{i(0L!!% z>nTQS9Cv|@wM`*Qc@>0Jb2+1|d;l37Y$0s#vaGNrV+sST_sB89S%YaFoAPrQ$*sEH zNx*TtURe-BH*^>Wq(qJF^Z5+#2CT~h?;JjU{0L(+UOxW;XDksf1TRuaojb6@fv5x2 z^sIci3+yuAhj^8g?@Yj;L#BvAa$9I`w+jX?p0D>CWg#=(au`RzR>Ekf49AYIoD$AY zCwzSW4wuUXDJ6XO-6t%|g6HRFoTeE**tR*yU}3a`zT_r~WH;)}Vv_b2!1FNJ(TvGw(e2cfJ zm4;xHKb)Hiy<~EI2R9&iqA!ghG=;bKp%a-{CJ0zQtkOM0bSe~%UNjco0>xYS!4oDF zw65gBMZb42)*|PGEhnsLMal_f0|ub|{B}qzRW)NRswq_L%lqI1m#sjGd;V!$7i=kF zvM1yi0asuu(ST42OeJcLF+fQh687P9%!OKEd`M3s-cW=6nurGAm?kKcDrbpK70h0s zir8=*M~bTBW>E-%=mKh3WRyGRTZ49K5FT?@ExSPFcb?DZcCeMf{Wy;Bfv7ZvMO>DL zfV{zt)u^ zNv-uTFeqt7+9Iaugu#!n#vyKLr-iWK$r>7_dK+N40W{Aef&6jyiZ#`$nMSLei&ji zH~HNjT|fdIX(le5l`SrK!Ilr~)YIA7wGk#tO~@somR=YlZcA@GoaOr1fJBfv15C1# zR)G&noD%rCsR^Yd#%Bkv9ZSn?@5Dlx1k^HA5O>N^^dztCdb@QZl=D3A?&q3O6AN&; z_D;s^&9IV@vw0AX=r}2Jh%M2A8EHIv?{Pk#JC|i^{_%l(Z%k85z*-@1)J{ApgCULJ zmS%HvuqoX5{(5%Tn+%u5+1AC}v}TQIw4^Rm`H;>2tpjs6h&wb#wUdWFm(m(#f=?gE zu@mh`1D^(F6;c)R1xEThT&V zaCb!C#+*o8%ftY^9*e+;8vi3Zk0|DFi5qU~g29nU#Q8@D;<7A6X=L}6SB==13w-HO z{QCWED<(i3BG7cn;%8}NW823zdc`t9*3u26TnopRgfg+<*!gbkT=czrDRC0ke9^P4qmQ9|g zVc;l-Cd4GMmg7OJH9SCZ4%UcJ*zU2y#&u11T?3_*5UgwK&M{U+)+K3N9)};AFj5X; z4IP`Pn~2pIicVvP@8I{ISS%SX@9{As-<#n2u!(Gp;d}@c@uZ10M*lhgvk7Z>4Xyk$ z4b>yu;8Sar2!Q&=Y0e@*i%e&%-TQ3oUad$u!|-zwgr-<460f&fRDK*NNL0XH18<#x zxQWe_@I}Y|9itBP&{m5<^8IuU8d_bEYUv{j(7Q&fqQRI_Th#R)9bO*dNcz~%(hU@j5eS{jnnkFZ4%B)K zhsYWlwwi}HG?y~ngB-E!K(q$qd*he>o%EbocD)njg6eRh$PT;*%6UnPm!~kPC^<4$ zmQory##!IpKmWG@`Z3C+^1ZJkV$SDttLgQiUJpsMpsN(Lcyv9KOr=NcAIU{BoN;Qs zqxTity>7VnaE=I-T2O|As7b^bP3)%z=f^k|J=CXq&mn{X!$7f&%d+5dd1X<9IYd_2 zE{4^H5ixE&4+#WuH$YIoo1Wi3PB3zOIZnDl`S?Z-y3T)UT z&1Hb>-GFh}DQ;pMYRLm7wjP=`$Fz7?0Jc(Gq7a4Ty2Tjb-N3)AdGk9ngC6?Hv!F#> zITLxs2&KH44Vd!8`%*Qao_Qr><1o>_T8+W^-7`Ms)Qfojf4<&pIg(`AvfM`9BLYBH zW|6~s`rdw;hkm&~HUBX`I&!B)ru(p}N&-YUF*XmXYOdzU(AarG*B=DGh5JlO%y~8? z7-O*K)Q9&%)Ve&~;OD6map5dnGdzKKAH91v*_@-HL_j9@fP`aic%HU(XE6&C1DRAH z^(stN#+L@*9G7T1?MTP^$@g@A6#wa%KfRXFeRW+>P0ybl#0fM{IY>tm`z6T<0EybG z7z<4}&eS*vLBR)AH&7ph`j(2m;2o7(11Ya40*t)36pLFWCXvaOwN)al>KP_KBj1Zy zskP#Mzr#x0I-5m$WHi_1hA`xC&JNe{TxT4{yz)*YEwQa#u)u#;01GK4?A+hlHag>Y zuAi-1`z_PhdIY)>8CFBj!oHCCqOUbF3$`?e?j$KTt2u}`$M)aTVwlXIOXyRfvUpX_ z<_(>k-9%h2;+~UOmS!+x6cySSzt`jIYwOR|*?gnxm1Y2=W}N*!t%f-Y?OjCNIjZ=3 z2B^b4HAd48f(jzqMu;JTXn z*3D4#TI1-Z+Qr$F$kRzh*1|g`_j5cHJ!h7gK1B4CII~`F);63&p=!r!_`H=fk#wcD zQ}MrNL1>dRYp?CayudXO%wXa@_ubC*D;e-7@89&aqT*}H@IKpyS`)+y(V<*|{Vg$rf*^Uu%E)Bp`L z{`ki~BIkrppFZJsyC6)Le)zmUzT)%eFNhqCv@8qW?qA@&#m80=qwj~~!<`%O*Z=i* zeEasmFF*eQ({$m32Vl(6{Oqo{cH|$25W4e1kY|<$CoMND`yFAL5hsuXA!oEykr+WQ zv>NXmYN=@ZA#Nz8VJ|Dnn(DAy~=C>?nV}T{vEe76NN6 za!I|YK2)hdYnBESj0F~T{r&z5XKz^79iKn{hHXn|rQ(;Le!^v%05r^V#J*e9l2~9- z;e7x~>uB4R^IOT?;yG6vpG$fx>ZC zq zLyNTz+p;31LNO{X_H}aGHvInk??@{-(!PHFLXGU}1!(mA{_TJMFLJ>bx-Q<(z^|r^ z>OK9kHE`_AvW=Xg#u?;XU_wAs__3e)3+Z*z_ z!6Z6}g`30VC)_SiuzWDx(?$XeRp2^DgL67S5+z1rJ#wbcr;B{c>+U>VP*6}InzNV8AFceR_E z*Z%D0OyW_?(-vo`DPgTg^dxj3cY%Xx4QXHDoZ&5k@S@F;fMiKKe+`SwS*^}{n0mM< z-rnA@m=(9DCs?Hn&+HT_EUYoM^@iHe%!EOfMwzUUaXJR2FvumtFq%+AJA^0nL$QA@ z$Yt-)jfz?;S}uqo5RQ-!9nQLr0tSG_!%cE`lQ=~;<_Zf~QcdLYQ3FnC4)=P5n{-mQ z^q*baXQiS!(}&C54YsF#(AoDL-a7bTalKw)mW7@*7RmKo_7D+$fOm9lmTg6h6pPqN zVIi{H|A;7{$cDp7EI&&Kf#`eu*}V6twst4q_o7(zL2#NT1TMmL=CW=I$(|$MQ&ShT zgFx=34DIFfh|5wRJaw~IyGZqbT9Z@G2RWiQrh!(}33%ECVUGKDP;3qtTF#kV|6Hic z-d0M%-u7M>P}B*Db6xN%Zpm_k^#aol%)D+cTGcq$)Fz{F+ay3GgsX1Cb9TpYNEHH) zJgdV%Uq2fq4(~)3mqc_YY$rO_T@&q$u><);;t1yH3hM&n+7H*D{JG-*CQSj!`6baH zOdW_g^6tkN`8}GtaGo%&Wf%nL=a-s!r4OkE`>I{)+F4V|(Kzp7X0HA9J0th;+|ZNj ztevT6H#E$9(t;34wU|UVbwr@7pWB`-t=@V1et6d`9uEI@#KDv6@7mqfXZp?eC?tJt zX-$b8N$4ZZd~qP_oNi48IMV?JH~guV8zM85lT71rWl&QK`a34g@tLC+&onk2*Kvr0 zY=7Uy;3BnOW8#`b2n|{2rva}1{F;zM2!EptGHGyl7SMgTTrS^jTx%lPFc`?~U95<# zA96n=ZcXRc-|t+nJWoS@b>A0QQ1Z&>SXooW*(m1+TaTvyo)SeEH3P#jC?)M(+;e}d zcx)T23%I>}!0WQ(_3aIxzrDgu5nI}ca5hDbeU6A}BC)Y&`dM(}KBvTc$U9P{DC}&G zTB2El3hHCrE?3G=&lyGuH*+Q;q?~KzOef9vI8V6UZg`q5YK?Uri)^hM-BW_BW{RJ! zI7B!4y>@n>#g$z9S>TU%5(4?@0>Fage#pl zYzUaI7X+q3fwR*qfOX&S;QhN<7B9fUp};%GR97Ax*NR*UCKHGd$xUZigJMbKv7{aM z2BgbOamU`Gno3lT0>-+#9_Oalh-h7Zwg<Og?MIhm zjn%>!7Gy!(o8_R)K(A?9M02Lv=wA~PS82VsCA4EYU$l;`*L$FLQ|fgubJU`c*5qgF zb%-5_DH4UO_Y&RsmBD5g>ZvtP527^rOxFj}pFN8lzZbnEj(9DWkb5Y5l-?ht#-Jer zjtEmGc<8$KaQo)r=hB0UGqzv5*|ocVh{J&yvF_z~rgeR9%t(eji(k(T^Y2mUdJ|q@ z>Cbf!3G3~5siq__6w*K&hGG4k?Q}GWX)wc?=X(R}Wm!7OL)VC!9HJvQb*-KG8VjkU z$2m&fVn#ubT-PIN&UVqV?yKlpNa|5Jqn(A>TA-dw9-`=k+AX(9Kg;78tG#;{og<=L zN(s^V;d2{yhKo2<2!G8&xt{az4C>*X(3;NA?0G;tO|<_SV>|JMtnDKJ03ZNKL_t)v z){1ozvg|w#2v0-+@6SRx^)8)+1mm;H@0L2-lGp-$=&A_~a^Lj6aJ^m!(Sh_Adh85e zPniReh-!Z)@YBylrv`H$+`8jjyzhIDXq1>5YvsACL!GB7i1PJG2*D;bIS*7h3pJG1 zU~7eO7PEK50AGZo8^@wuuh)SZH_Z~Scnp)}3>jnW!*f}ub8VeA+0zJ^h)m)J3}PY| zr++aNrnSPTUcs4Up=o5@NRn%>eF4C_W9=6a-Ti(agm7|wDa~MfFORyVjZv10a0Vql zI8*S>F|s|*@AR)+t4>$t`N-FAU(u|AuLWV^-hZPAWUs!LBrf!`2F$zlT$7LA^*59N zLK94T)NixnwQnQk^h~#qI9;5?BZtVZ!Us33@j9AH)(~Bf3C&*4M-+P_#zWuV7ZFl# zyV{3f-hB@5$fj{A_Lp8W5~5oZyE^kLR@#kX(Y@b(B3=n~SNe2~&qCe6m1#e^Ot+z~*1gAl-?1zUe){Pr+^!dj&MCD= zq0;@PuW#BIW24U}(qPxUhI7yPy!T}lHU2&NQ!^t`ODKdATc+2(5CT#y!`IU!DlsTX z6qkNsCxOu@ zj>o%t&^aRfp2?_PbR{vawGDq?2tdYJAXns8;TleLJ{t`9nRT4>Q%)jqUAK?3qV`T) zHcCb<}hYug{@#9Ba z=L?YyIDaf>i6(FZPRy9Y_2;Zdj8n%TX=NnE#Ozoecgh0w^rHDdq#A0x>_?7V@UYGx z#EAJ4al764YftcTrmr0WT%7Uw*WdB$ufJoy%m_RPb%BH~qzmJJTkW`fiZO67>?8^7 ze7Dvi<&0Vy4fz|Xue=Flu;J!Y^Z^D2p4DO7wqxIRJl&q~{PcvhB{(OUk)#xzr-`w& zl)-3u2uay}E4F>ZbeWJc*tx7%&g{868%>Yw`zg`hOykPqH5tsx0eeXy-69fHO zZ|T?OiT-OPgPUAxJr~`2R(!OEa7gT9x zmfTfyk{NFdeRgWbb=Q7hUcxQ6YWxnF^cE`+)kabz`cs#la z@pgN{hYuf+b`nSwCa3@nx7!WQTSCB2k+V7TkR3<`C^@~Y0WR}|r`r>1E!Z~tI%L!~ zh%q3igq#whb$I*jSN!#_f5o;hxXc&au2)Pk^1%n#_YIH7qyNm7GtzU;pjc#s+vSNG z#c*(jC{V2dAw<*y+}{?IQsIn;HJ->;FfbfrL5mpOGrI0TN;|e~#k#IomPaoVTdOFE zn+v(%?d=uow!wRc>+QzPx`v7ZwAwdN>mBg&Oz+E{u-spf_Jn;;onTNI8@TT)iLGEr z@!q)LVB~r3&6q~Q1xMnx%QR!2=YFX7OgIu;+&o{20AL*=6CJFfwJfECb=#2(kt+)0 z_nr4BxiO`R)*)v+(w@ojU@S$?vHJAs=?Tt9cD3>#5y0|z;OX|vjT3ZNLMa8PgvSqD zz&nc}J641awboAmXtk0FvC#kLl(9V?XoZ|aWlPwW70b6f?q6TA-&az8mkQqu-oCw3 z#%F01F_sJRwgU|$^e_!6Z^(H^oFn2yq=Z}(Qr=Kofpccqu%nN--Y$ght#s&{XIeL7 zoDilN!3S9D5Mo5U%p7+J>?z^#crfwA!#YpH1RfmR7orM09uNG_|Mge=^Pm63^>)SW z>4tBwue~7$0N#@La0-E_RZLCsJ|N}9;xTH@p*56LkV{4Ifq`JOmZ3DF-f%`H*gfHW zQ0rucVeybN4rsu#E=N)BY|o$cmP9jNeyvqFO9CKLIa8zGp-}ulE_f^p%9bc{B?}=c z5Skg5o{LiO z_DTM{ykkOf(v+H>4KB`OZZJd^J413(+u?Zro@>hSyHC1Irx4)WoJEgM&pY zG@Q$+@YgXkgcbKVQ;upO$DlNx_I*E^WqBX))Y6orYmoZ>3>e<0Yj+@nGj&TTSUGmc z+M|&mWCd}EOH&O^2nz=S+^|!~dvXmMiLm3`-=jH){ypUX<WU%d%iywt<8rBrIv* z37$WkVnk}I?5-tOp5^_v)uT~mEm1Xd9-E~);-L?Ks*nm=Z;(pUM?1}c)*S#WLDRmm zBvjt}07hS@v#7JbBTPIwVy`ma_tK+9hPV*N2w`)$>tl?VI2N}yb`mmXS$=jO!qA|U zCWox+-qE@*O}5e<@#yED`~8luudn!azhhZeSnDuduE@3G@4x+ufBg14?vEAU-ri6^ zgcTC}(KBF~eCFAFLs}FP)dVKkrETN-EYZ&(qC&pr+rHz==g+iGI}eM)T}XoB9eGdq z_~8SdpPumc`ig)5_kYLBhi6>o3og?I*ZGRb?^)#7NGEZ1o~U{`7wTU$up^t_)!GL0 zLQdqw@*%RDvv!vvi3W(AQfkHP{f=edQPI%6Lor0cg(D(Rs@%|;JX{DA)#6App7IXs z14WTq+nZzF(oiA92**E@bq=l4`uFyB$GVgG!$pS>Cpb%MyfsA7Ej3Xc%0CZk!{i(+ zXh<(K+F%`K=W%f!S7UK;4%ZM6S^O+<)4^Mg)gyXq<$jGdmc2b~h)UFh*P08~WgRF| zdU)<#K#UWU;*K+ej({SJwHsq7WMI#fpYN^FIzH3|4<7>U}cBS+%C>0htWJM6_TmMiGk=CViK9=Il_9O4Ijy!bLs& z?n668n$giGLMk}NhKT6&Oo8aeuL9if4*&+svL3=3rs~n(H+`tD_YV3ThZtK#jv`!; z=V~AxSUNF^;91}q`A;po?e~H4E26wg=pXm6= zye2XhLGAlYNZq#$E1&BR(R>@CO>-`Tk>H5M1``zRFpLDB*HWU0ZEyITSDCJ;u3_eR zf#o5S?D;Y$kn;eY9jV7F1{m)HoTG^PV+{n>oqCfouxN-~^3EKlRsmayqgZ-T=SbR4 zoK^3Zj;z$RrwpH`nQL4elvwElI%hFYGtER$0SoHI)zXOo8m@JaOMp@jfs+k>c!#OZ zOuR3QG?5-1Tn&Ew@h5~hA?1Qn8+?fLtoZ?`KjG8uc}<(w=4P zu|J6DTdqqVj#=4{={ZO_qevuKrF*q=e|FpUUQg>wd8x-5@>)i{DSAI@Iii~BWNMK3 z{e8OLju=jRtReCoSG0lHCFeW2uOgN^hQ$@uS?)#JK6lV-gceuGSxL@K(vvv^53Xxc zMKq(u5<155EFP9KohH!BzM%y!B6y(Zt#v{}j1jjd>bu{!wbOkK_gaQ?XDwqS49qD; z2`4cg?OAgDglN$GR5b&h+H7e9z-k&nJJ_1+uD%SMO`X}t*5D2GZIv|q2ioFsfFG> zo@H>?2bE{$r55<$2LZw$5UfmsZk69DuAMv)vST2E=NxA;Z?Iv5dfpzvhfb!qyuXXI z%Q5*?pIP+!F8k9tdQ=P@)ey;D;uz(OKbYcR`n*f1xQ9U6F$JG#^_FH9t%pQ`d*u$n z2O`EwErL;4V*uJG`QAW@Hu|2UL_1o%)*2}pMD)|&C)JO&s<%h?sIagbETEJ1NCZXn zYtnbFwWxEZt^=vhEv8J*h8Y7AzErLq2^eZwdjYN!lp&xU>vaQQlwb>n<`>dW6l1hL zPn-$$hhWt7{Z>9diQtboOo`z-3%3Mn}saTI{P{HbcQg-z&|}b^)Gt6 z-SFYV2gaupT5t*x>q?Y{$MRsh!qGSo#kF=a%omSVUH_rA10!cb#}j=c^+x3rE0|#q zh4#KT#F?UOo}R8~IMnzqM0UAYpj2$j8gsi+m~2(JC28(50% ziLTRTJ9^4mq&*R$o`+h^kb9yD3NJF!$Ww$zDFtiZ@ZomDVjXNP`1P-UM@r;i5hpC& zWCPfC6VZ$TUIg9I+oMJxEVSHH@YLd5#<#ol&4oCvr zfVFonAcTlq8$zHspIR#n7ebR{tL_wsw6BC4&)jq_^NhE*w=N3Uwhe#%>tFHfKmU$( zUGayXf5L|kANp_smWFmY6@=)!E1xzULV7xH0OObnQBWHX4Dxm?G^Qfu4PUm6Ueenvy(0ZSYlDbyt7Le=^qd-&_yS8QKaGy}Z+ z@B_IYY=h6F0!7+M@ekLZ7sG^*PJ>X`yjlqvx2-E5Y#8l%nTIBY&P$h~AjU{&w$_lg z9anyqXkd}My3#aS^C}8_hyWPRn+uHfxWoz0g+8F9K~5Z;C%UPi2W0a+<1c^t3&o~w z8{y4E7-$SN7o=^c*g3|e+LHsLD`atyF&qpU=d*bB-Bc4duvQA;MhEA1|%kINC7g>S5&`` z2UN#cJ$p2?9`_Ysh47XWp27=iBS&or0UJjs>E_JOKmQD44F34XKhhwoRDAjJ1)n~B z!W3uN2FxLnK+`%bi3XATx=}O_NN{kCL?+s|1*Q~O)6i;$w+3?zaBx`H9o6$8Cnq|n zOj|GR^}te^2EqCM9H&fwHeMnO=-^RPM&%)PGZepME#m-NgAE2HZ78WCItx2RP(PPq za%_`m5NdoE7+id$!)B#yQ*SNB>sWIjWyOW8vU^*pU99Gu>#nunJiK@PKqd`?loDQU zPiO|%mX)*0%{xMgsSPV13N?OG3OpStA_x2`MLyR;`@X|RX=F4OWFC$V2NJ(s;)IlU z+Ut3klgkd%Y#*-EP`@IVN<S9ZmLN9gDAN-ARq9epVV`V|Kd?GNqa0rGZ`B zJC%Q}73+QsZgm4lhK53lII^V=QH?%)%JtJOB~9;;HAAR4ny7ImHvs5EX^AP4VYBnG zH=ufx{&XK}t;pNnU6<0x*F$q_XdjyASs{eWJ5mXhP(cqvjCDgsdSej=T@QnlwsBaf zXg%6#Ey9vRWc(i6tQ|wrC=^kG3{sAPTkWn(9baMG(bUt8u5*0PdB{kIRMnWY7Nw?s z$QP%g#0XHcvAuI#bYTKUl8qLo$UR(^rK4{mYo z-34dHVL!!FVu+B^(M!5frX5RikL6mPhpaNV)lSbI#Xu_J9t(XIG-=UPrwH)#e>9El zFmTMyjt%g7I5Ve-;-6BKlVpiRfqyML=3l_jhNvels8nfm;8PrJh7C1+D=tC79B1xm^*a2_HXx z90XW;urD#A&N($*W-(;;F`*QDR6yEIi!4>slbxL&V=a6^kG&jcL!HaHdao*~2U zF=mK=CMWyC(GQXDDbF_TAyZ!ugm}`O@Lfn_59&;-LtK;UcH+BM$s-$vf6t7+-f)<> zSbTF{x3wr%8$x7oqHDX@Ma$fLHKQX~>T?}&E0nt~^iVw|iK5n@K@VApGH}Ft>FcYB z6`CL>&j+oou0M;K946m$ThlvYf-wdKZHOWOj=F1EmOiYNI$PEb>G^1phOP~bh$K!_ zkTa71s1tneALv?C_Al=Pzm`WWq-%7!e>&z&*Y&2M3yCQ%WOR9J+Mibuyt4ipMMBYH zMSXw9NTV^rO9py+V4~|Tsh72&W{4EYwMT59Bcx>g?6GUp)P<@?{rNs>VWb1vcRf%& z6xD-Lz3!dkH1)9kdo&?k^N3(W2;}Fpm3$v9D(laT#15R@*lISR@9mkID!tX-N9BJ+ zyx#{ceNXiL*&s4222oXOri)H=O{nWBdXCs!#o{Xwz{$N#NrY;45KtOE-+uh~v5VBc zef!qqx#XIM5C@Xl5t~fc`Z{0w`k<*-=Y2uewDUfeQtrd3@5R1lCQ6rm8)D<++9pMS z)X!l(?OERYA?nTWKD6fqTMsb@8Bi<2bQ$9Gj6Ts==-R{bw5B;UA4I7O#W)9@9Kkt-dTqMv5=v3RIDBV;^ey5>ybWR z$WU6y8TxZ-I+7MkbunkFDyp33vpHvc{rVLjK72s*0WMD6?DD;uCub5&pX1>)onqVe z;jE~sLVHeqIB$&~#9VTQ7gDbLox_aK-o-ba>1$&2l{F&gj9hXTDT@HlIqK!>zCy`# zPacnlG77zqn32z_#SCX^&N+%l3ulh!i1z89V$buMagfT| z$%NzkIc=V2Bo^D*PSNH1!|^j%N0F(1&h~xBz9|aViBNNn&XjuY`S}^C9K>HA$zZrX z78oU_&@?w$OZ(o$q>j?(3S-3bzV9?2xKP3l3U(dVYA2~7nxf6(5J;ay ziD310l87oXnVM>cnq9|Q%Nlo%@zgz5U7MWO6WtHgF`t@r*drHteQl?jU!G^Z*VL0C zOp}i^wMa*%Yrk6(jSyKEpxn2rB>|7h;#wDuYeA97zjJE ze&G8=;Uk*sxZlzT)V0o;!qiR?zcmjIyl;mEqKu-^2=wv>jPKuSXt_&``_SWky(?|}-Wb;al3 zKf^TO4}bgx({v%l^5YFJF|ZO9y!R$7fivS>@^jpD>COob%*5uT^L#-FQXEm^*@Zx44OmR^!oyJ(7}Nq-kL&H3hcD#7*;j6KT7!>2{fJ-x{x>`x z4?G?#YOVNx|MUMrj1fP5`Zy|&l_IiadZ%h9HB@#U$Xsxu|hKbC^R!DGm4gq7IP>732t^17?MH6=n*kc}Lz0P-$(tOf#Hyn5WpqPk=$R zo~bK9YX&(HVdH+kV@o^YG$Eyev@S5-z&{>*5|~EI$0@2YmZ>$Jc-ShR1!yU;gX=f$Q~3aYCi4 zqTZpk)K#j4L?$YNkF8^ggLNoO3fh+yP4MrQ3Rzgfm3!}D9X)g1buhUum~^Hm3X%vw za%7!@HC)8t*mS6oE}6v~F|_Td+$=E-@UU2y2iASZ`u0FtH;To3ak$J^_{$R>=?%-< z9rxEaR&7U)`JsVY;|6=m8>T7X_H>1{24BAZ&Kn{Sr@;A${veSxist$Jc*XU0!+g79 z^3x%@VV8vS4n9)k-sAD0sGmyL+SveSiO}V(D0Ksjv$$MtSoRH<%cVEEjj_m?)`-VH z|B2uK`5Qic`h;R>ZH-|@-ZHEO_LLDF(X1R(BX$;GdKhGo5F|Pe_`rFTl+|mzLnt0o zB^t;S4y13&J4)J-_eNsK?&fM(w}sY`tAUw9&#gzRh#~MHqrx_Fj~iQ&%1$(mS}_IM z|H}?+9Jw%oNE*gkm}bySLvRk)c}An)%mcNU6GaiQSj`&}*p|vTV>MhCC3tWi9LY?@ zYc8a4=4%t3@AQW_Uud7m3AGl4aEM)UBN7Z+gSQmrS1VDLs%h|!)abb+IB??+4V6C| zOoa~?)-;NRGX@2u?6*wAYoH-js|5}XHSGx2z#EQYXcnavpky>dj`O|Hy5XmYl;~Oo zsR@kWi)jc{b0S(EuL;334THi`k7%K7NAMBZSri$N)Pj@~Qrh~!>u}v#6coTyV+O@Q z=A(vjq}JKvd35Mm&Z6YE&Y(o!_stLjcBL{GyN31gsR-2KqD7Mu^9 zk>_Wqf4x!}fotEn^`tQ;c<;jvejtg_#%6#84^!)|1{wv<5v8ovN<_mZVv{xqjHGGQ zV~4CnMM!)XAM&bsM;Xw#?KSP#myBguhQ^aL{iJy*LlgZh$+IeiL@l&{8m4Qf$8i`p z19`eg}Z+Txeidjb;=*Fvjt;gfhhpBqNCPQUCFq8YM9rn@;5PG4Nh9Z<> zy|(YV*|*2SXEby|(9k@$ZNT%N<1uU>BKYAtmO>(U$0Wsyqw$tf!oFqf+kw|#c8Wl9 z-f`YG$JVhBP>4br8&AZjHbg}mA<%SD07bVz310_7hZ4MrFv?nsRPu<4uLbwzfzRI_ z_}f4Jj{CCrdmBQ43kNkKMly$Vx&zuU7^e8XLr}1njAdEz^zw{2dE_-CXUY`6Ua#cT zyOwvE%AJayCey^VhZ&G#>y%v>R(Jnh_VZ?GrdXTsuSxhasi! z$tPqt#agv4T&_&3K#w*sXvV;>SZWl_m|>W#g>YJc*ad8sgp{@(aYH(GNY=;h99Dw@ zaf&zPxDUbgm_ngQ>%obvjg_fI+E6FPvdVGbPNK*q5=vsAsyU*b3_3OMyMmfy5_rT% zNmJK*>M045g?mwYP%P_LZIz-H3%PTRMw=^o-5HrKWR3ognTkCXcxQ%ny|g+EMUQqPiFT@9P=`|03e%5E$qf#=VP90y|6(GS9@dnNZP>`bCrNA6o0Rr<8)+DoPzA z28IZ`aA2oV(0hkc6;V$i3Q8gQ8KQ6i2B z=wzy8@jxrM+^)T56f?pQEhc>a3Z}+e{%m}9^$re1=XQY{-SRx9lz>Jwyp*@$9ntkH zea~`4KjqBl)MK9!bIiVPuy#hyW)NEHx>pm1N=*pS0htX%LS_(OOZ7R9?zq#(As@E^{2}O}%cD06)E}vGjGb)^oaO>hG}k9j}yh|L=L)Q6$?CxgTSdgmP4 zN!)FXrz42e(l`lf4fWM(8AZ%waBBm-a};^i9YxYtn_OlLGfT8Ic;AysU?elD2r}>B*ihaK)55v`;h4N-l-a>>;s-@Kq4#im zTx%^TTpxHB=vgpq+-VKDWY|gqF`;allYq*Y)@xoZp48-@R_ih2JR5=S``S($Kq=nZ z(1))W#EX(Z)5(0?4?jo5ci4=$UPY-XS>C;2z>CT4c4M5l?+q?v(2>@H*v>iQ+t)Xg z((wHJj1Z24q7bavmP!+;OPnQ5%@|1 z3MzmSwteC6VKC2;;uoyJ#IBBGXaYX`8YF(njqyZPsTFD4@#Xi=SeG4_+ZE0Q#66<= z43{%t1K>PtrG||62Eou^6|Uhn&G_RlKjZQCK+Orw5GolJ*d7Ztz%LU_YY6OQgaM2+ zLrZ~We0!@6)>Rt%cp5zH_Z?VQWNuh|`0xRkJTOOK2Z?4PeMWdk4GhiHi_H9M9GYMd#kY^f+XUu%$T@!Dcnj0Y;4UrgGWaCMkW6bgUnKIbX z8gRVx9XZNaFSWMw?=j13Dqm2i1Kku)z$6F)0$aZG(3a)>7O; z2o %0amCo|dS}7|IX~l1kkA)(Pb{T9K7)y)w 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

    `oF=5g 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

    #ZGjYJ=HoGn$I0*&n&!8xBDeG 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%0DR@uG9Te1@X=Nv*+i*SiC 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%0Do1AGdX{|-uwut=xMduK?xRgR5g$O@6_=)iA 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

    to+yJ{Da@cfn-Gc#we*}8 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

    dU)WvBn#Lw77=8jH{~J_H0Y(ouIaE9 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\Ys%h-{!LPTDF8C?eKR2ZyrH$ywaP8 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

    Qdh0M9Pk8tCuNV^Wv5@)j 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%0Ax7-?*EpU}$Wjmu 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

    Y<(Ukfudtft!k<(i35CCP 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 z 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

    ^i=e==7HziajsmxWoq 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

    ~b9;5Ns$$ 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

    W849~@fC7=Qv!K~yDuN@2NmQ0fhD3p|8u#y? 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

    4K4 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 M07*qoM6N<$f|1v;{{R30 literal 0 HcmV?d00001 diff --git a/package/luci/docs/CBI.md b/docs/luci-docs/CBI.md similarity index 100% rename from package/luci/docs/CBI.md rename to docs/luci-docs/CBI.md diff --git a/package/luci/docs/JsonRpcHowTo.md b/docs/luci-docs/JsonRpcHowTo.md similarity index 100% rename from package/luci/docs/JsonRpcHowTo.md rename to docs/luci-docs/JsonRpcHowTo.md diff --git a/package/luci/docs/LAR.md b/docs/luci-docs/LAR.md similarity index 100% rename from package/luci/docs/LAR.md rename to docs/luci-docs/LAR.md diff --git a/package/luci/docs/LMO.md b/docs/luci-docs/LMO.md similarity index 100% rename from package/luci/docs/LMO.md rename to docs/luci-docs/LMO.md diff --git a/package/luci/docs/LuCI-0.10.md b/docs/luci-docs/LuCI-0.10.md similarity index 100% rename from package/luci/docs/LuCI-0.10.md rename to docs/luci-docs/LuCI-0.10.md diff --git a/package/luci/docs/Modules.md b/docs/luci-docs/Modules.md similarity index 100% rename from package/luci/docs/Modules.md rename to docs/luci-docs/Modules.md diff --git a/package/luci/docs/ModulesHowTo.md b/docs/luci-docs/ModulesHowTo.md similarity index 100% rename from package/luci/docs/ModulesHowTo.md rename to docs/luci-docs/ModulesHowTo.md diff --git a/package/luci/docs/README.md b/docs/luci-docs/README.md similarity index 100% rename from package/luci/docs/README.md rename to docs/luci-docs/README.md diff --git a/package/luci/docs/Templates.md b/docs/luci-docs/Templates.md similarity index 100% rename from package/luci/docs/Templates.md rename to docs/luci-docs/Templates.md diff --git a/package/luci/docs/ThemesHowTo.md b/docs/luci-docs/ThemesHowTo.md similarity index 100% rename from package/luci/docs/ThemesHowTo.md rename to docs/luci-docs/ThemesHowTo.md diff --git a/package/luci/docs/api/index.html b/docs/luci-docs/api/index.html similarity index 100% rename from package/luci/docs/api/index.html rename to docs/luci-docs/api/index.html diff --git a/package/luci/docs/api/luadoc.css b/docs/luci-docs/api/luadoc.css similarity index 100% rename from package/luci/docs/api/luadoc.css rename to docs/luci-docs/api/luadoc.css diff --git a/package/luci/docs/api/modules/luci.dispatcher.html b/docs/luci-docs/api/modules/luci.dispatcher.html similarity index 100% rename from package/luci/docs/api/modules/luci.dispatcher.html rename to docs/luci-docs/api/modules/luci.dispatcher.html diff --git a/package/luci/docs/api/modules/luci.http.conditionals.html b/docs/luci-docs/api/modules/luci.http.conditionals.html similarity index 100% rename from package/luci/docs/api/modules/luci.http.conditionals.html rename to docs/luci-docs/api/modules/luci.http.conditionals.html diff --git a/package/luci/docs/api/modules/luci.http.date.html b/docs/luci-docs/api/modules/luci.http.date.html similarity index 100% rename from package/luci/docs/api/modules/luci.http.date.html rename to docs/luci-docs/api/modules/luci.http.date.html diff --git a/package/luci/docs/api/modules/luci.http.html b/docs/luci-docs/api/modules/luci.http.html similarity index 100% rename from package/luci/docs/api/modules/luci.http.html rename to docs/luci-docs/api/modules/luci.http.html diff --git a/package/luci/docs/api/modules/luci.http.mime.html b/docs/luci-docs/api/modules/luci.http.mime.html similarity index 100% rename from package/luci/docs/api/modules/luci.http.mime.html rename to docs/luci-docs/api/modules/luci.http.mime.html diff --git a/package/luci/docs/api/modules/luci.i18n.html b/docs/luci-docs/api/modules/luci.i18n.html similarity index 100% rename from package/luci/docs/api/modules/luci.i18n.html rename to docs/luci-docs/api/modules/luci.i18n.html diff --git a/package/luci/docs/api/modules/luci.ip.cidr.html b/docs/luci-docs/api/modules/luci.ip.cidr.html similarity index 100% rename from package/luci/docs/api/modules/luci.ip.cidr.html rename to docs/luci-docs/api/modules/luci.ip.cidr.html diff --git a/package/luci/docs/api/modules/luci.ip.html b/docs/luci-docs/api/modules/luci.ip.html similarity index 100% rename from package/luci/docs/api/modules/luci.ip.html rename to docs/luci-docs/api/modules/luci.ip.html diff --git a/package/luci/docs/api/modules/luci.json.html b/docs/luci-docs/api/modules/luci.json.html similarity index 100% rename from package/luci/docs/api/modules/luci.json.html rename to docs/luci-docs/api/modules/luci.json.html diff --git a/package/luci/docs/api/modules/luci.jsonc.html b/docs/luci-docs/api/modules/luci.jsonc.html similarity index 100% rename from package/luci/docs/api/modules/luci.jsonc.html rename to docs/luci-docs/api/modules/luci.jsonc.html diff --git a/package/luci/docs/api/modules/luci.jsonc.parser.html b/docs/luci-docs/api/modules/luci.jsonc.parser.html similarity index 100% rename from package/luci/docs/api/modules/luci.jsonc.parser.html rename to docs/luci-docs/api/modules/luci.jsonc.parser.html diff --git a/package/luci/docs/api/modules/luci.model.ipkg.html b/docs/luci-docs/api/modules/luci.model.ipkg.html similarity index 100% rename from package/luci/docs/api/modules/luci.model.ipkg.html rename to docs/luci-docs/api/modules/luci.model.ipkg.html diff --git a/package/luci/docs/api/modules/luci.model.uci.html b/docs/luci-docs/api/modules/luci.model.uci.html similarity index 100% rename from package/luci/docs/api/modules/luci.model.uci.html rename to docs/luci-docs/api/modules/luci.model.uci.html diff --git a/package/luci/docs/api/modules/luci.rpcc.html b/docs/luci-docs/api/modules/luci.rpcc.html similarity index 100% rename from package/luci/docs/api/modules/luci.rpcc.html rename to docs/luci-docs/api/modules/luci.rpcc.html diff --git a/package/luci/docs/api/modules/luci.rpcc.ruci.html b/docs/luci-docs/api/modules/luci.rpcc.ruci.html similarity index 100% rename from package/luci/docs/api/modules/luci.rpcc.ruci.html rename to docs/luci-docs/api/modules/luci.rpcc.ruci.html diff --git a/package/luci/docs/api/modules/luci.sys.html b/docs/luci-docs/api/modules/luci.sys.html similarity index 100% rename from package/luci/docs/api/modules/luci.sys.html rename to docs/luci-docs/api/modules/luci.sys.html diff --git a/package/luci/docs/api/modules/luci.sys.init.html b/docs/luci-docs/api/modules/luci.sys.init.html similarity index 100% rename from package/luci/docs/api/modules/luci.sys.init.html rename to docs/luci-docs/api/modules/luci.sys.init.html diff --git a/package/luci/docs/api/modules/luci.sys.iptparser.html b/docs/luci-docs/api/modules/luci.sys.iptparser.html similarity index 100% rename from package/luci/docs/api/modules/luci.sys.iptparser.html rename to docs/luci-docs/api/modules/luci.sys.iptparser.html diff --git a/package/luci/docs/api/modules/luci.sys.net.html b/docs/luci-docs/api/modules/luci.sys.net.html similarity index 100% rename from package/luci/docs/api/modules/luci.sys.net.html rename to docs/luci-docs/api/modules/luci.sys.net.html diff --git a/package/luci/docs/api/modules/luci.sys.process.html b/docs/luci-docs/api/modules/luci.sys.process.html similarity index 100% rename from package/luci/docs/api/modules/luci.sys.process.html rename to docs/luci-docs/api/modules/luci.sys.process.html diff --git a/package/luci/docs/api/modules/luci.sys.user.html b/docs/luci-docs/api/modules/luci.sys.user.html similarity index 100% rename from package/luci/docs/api/modules/luci.sys.user.html rename to docs/luci-docs/api/modules/luci.sys.user.html diff --git a/package/luci/docs/api/modules/luci.sys.wifi.html b/docs/luci-docs/api/modules/luci.sys.wifi.html similarity index 100% rename from package/luci/docs/api/modules/luci.sys.wifi.html rename to docs/luci-docs/api/modules/luci.sys.wifi.html diff --git a/package/luci/docs/api/modules/luci.util.html b/docs/luci-docs/api/modules/luci.util.html similarity index 100% rename from package/luci/docs/api/modules/luci.util.html rename to docs/luci-docs/api/modules/luci.util.html diff --git a/package/luci/docs/api/modules/luci.xml.html b/docs/luci-docs/api/modules/luci.xml.html similarity index 100% rename from package/luci/docs/api/modules/luci.xml.html rename to docs/luci-docs/api/modules/luci.xml.html diff --git a/package/luci/docs/api/modules/nixio.CHANGELOG.html b/docs/luci-docs/api/modules/nixio.CHANGELOG.html similarity index 100% rename from package/luci/docs/api/modules/nixio.CHANGELOG.html rename to docs/luci-docs/api/modules/nixio.CHANGELOG.html diff --git a/package/luci/docs/api/modules/nixio.CryptoHash.html b/docs/luci-docs/api/modules/nixio.CryptoHash.html similarity index 100% rename from package/luci/docs/api/modules/nixio.CryptoHash.html rename to docs/luci-docs/api/modules/nixio.CryptoHash.html diff --git a/package/luci/docs/api/modules/nixio.File.html b/docs/luci-docs/api/modules/nixio.File.html similarity index 100% rename from package/luci/docs/api/modules/nixio.File.html rename to docs/luci-docs/api/modules/nixio.File.html diff --git a/package/luci/docs/api/modules/nixio.README.html b/docs/luci-docs/api/modules/nixio.README.html similarity index 100% rename from package/luci/docs/api/modules/nixio.README.html rename to docs/luci-docs/api/modules/nixio.README.html diff --git a/package/luci/docs/api/modules/nixio.Socket.html b/docs/luci-docs/api/modules/nixio.Socket.html similarity index 100% rename from package/luci/docs/api/modules/nixio.Socket.html rename to docs/luci-docs/api/modules/nixio.Socket.html diff --git a/package/luci/docs/api/modules/nixio.TLSContext.html b/docs/luci-docs/api/modules/nixio.TLSContext.html similarity index 100% rename from package/luci/docs/api/modules/nixio.TLSContext.html rename to docs/luci-docs/api/modules/nixio.TLSContext.html diff --git a/package/luci/docs/api/modules/nixio.TLSSocket.html b/docs/luci-docs/api/modules/nixio.TLSSocket.html similarity index 100% rename from package/luci/docs/api/modules/nixio.TLSSocket.html rename to docs/luci-docs/api/modules/nixio.TLSSocket.html diff --git a/package/luci/docs/api/modules/nixio.UnifiedIO.html b/docs/luci-docs/api/modules/nixio.UnifiedIO.html similarity index 100% rename from package/luci/docs/api/modules/nixio.UnifiedIO.html rename to docs/luci-docs/api/modules/nixio.UnifiedIO.html diff --git a/package/luci/docs/api/modules/nixio.bin.html b/docs/luci-docs/api/modules/nixio.bin.html similarity index 100% rename from package/luci/docs/api/modules/nixio.bin.html rename to docs/luci-docs/api/modules/nixio.bin.html diff --git a/package/luci/docs/api/modules/nixio.bit.html b/docs/luci-docs/api/modules/nixio.bit.html similarity index 100% rename from package/luci/docs/api/modules/nixio.bit.html rename to docs/luci-docs/api/modules/nixio.bit.html diff --git a/package/luci/docs/api/modules/nixio.crypto.html b/docs/luci-docs/api/modules/nixio.crypto.html similarity index 100% rename from package/luci/docs/api/modules/nixio.crypto.html rename to docs/luci-docs/api/modules/nixio.crypto.html diff --git a/package/luci/docs/api/modules/nixio.fs.html b/docs/luci-docs/api/modules/nixio.fs.html similarity index 100% rename from package/luci/docs/api/modules/nixio.fs.html rename to docs/luci-docs/api/modules/nixio.fs.html diff --git a/package/luci/docs/api/modules/nixio.html b/docs/luci-docs/api/modules/nixio.html similarity index 100% rename from package/luci/docs/api/modules/nixio.html rename to docs/luci-docs/api/modules/nixio.html diff --git a/package/luci/docs/i18n.md b/docs/luci-docs/i18n.md similarity index 100% rename from package/luci/docs/i18n.md rename to docs/luci-docs/i18n.md diff --git a/docs/luci-docs/jsapi/README.md b/docs/luci-docs/jsapi/README.md new file mode 100644 index 0000000000..d896bad4c2 --- /dev/null +++ b/docs/luci-docs/jsapi/README.md @@ -0,0 +1,5 @@ +# LuCI client side API documentation + +You can browse the JavaScript apis provided by LuCI here. A good starting point +is the central [luci.js class](https://librecmc.github.io/luci/jsapi/LuCI.html). + diff --git a/docs/old/Save_WiFi.md b/docs/old/Save_WiFi.md new file mode 100644 index 0000000000..9efd7c88cf --- /dev/null +++ b/docs/old/Save_WiFi.md @@ -0,0 +1,24 @@ +# Will you help us save WiFi ? + +For as long as the libreCMC and LibreWRT projects have existed, their core focus has been to +bring Free Software to embedded devices, some of which have WiFi chipsets. While the project(s) +core goals have not changed very much over the last few years, the landscape of WiFi enabled devices +has exploded. Many of the radios in these devices went from being single-purpose radios that can only +operate within certain ranges to modifiable SDRs that can be changed. While having the freedom to change +one's own hardware is important, it is also important to operate radio equipment within regulatory laws. + +Since a few individuals have operated devices outside of regulations, the FCC and other regulatory bodies are proposing tighter +restrictions on hardware that has WiFi or SDRs. These new restrictions would include a full lockout of third-party software +and prevent users from updating or running new software on hardware they own. With these new digital locks, hardware vendors +will exercise control over the user by preventing new innovative functionality or even preventing users from applying critical security patches. + +These new regulations won't work the way they are intended to and they should not be required. Users with the technical knowledge +will still be able to get around the restrictions and load their own software. Most free software projects +already put safeguards in place so that users can't accidentally violate regulatory rules that apply to their WiFi or SDR devices, unless +they choose to remove them on purpose. Instead of punishing everyone in the Free Software community for the actions of a few, individuals +who operate devices outside of regulations should be fined instead of taking away everyone's freedom. + +The libreCMC project and other members of the Free Software community would like to ask everyone to send a comment +to the FCC about these new proposals and why they won't help fix the misuse of WiFi or SDRs. More information +about this issue and how to submit comments can be found at [SaveWiFi.org](http://savewifi.org). + diff --git a/docs/testing.md b/docs/testing.md new file mode 100644 index 0000000000..91bdad4db3 --- /dev/null +++ b/docs/testing.md @@ -0,0 +1,12 @@ +# This is a sample file! + +Just testing a symlink'ed wiki! + +``` + Testing +;alkdfj;a +alksdjf;lka ` +``` + +` another block of text ` + diff --git a/docs/unbrick_with_uboot_mod.md b/docs/unbrick_with_uboot_mod.md new file mode 100644 index 0000000000..eadcfaf430 --- /dev/null +++ b/docs/unbrick_with_uboot_mod.md @@ -0,0 +1,26 @@ +Unbrick libreCMC routers from u-boot_mod +====================================================== + +1. Make sure the router is powered off. + +2. On the host machine, disable network management (NetworkManager, wicd, etc..) + +3. Set the host machine IP address to 192.168.1.2 + +4. Hold down the reset button. + +5. Power on the router with the reset button held. + +6. The red LED will light up, then flash every second. +After the 3rd flash, release the reset button (it may +take some coordination. From power on to the release of +the button is exactly 3 sec. + +7. Open a web browser and go to 192.168.1.1/index.html + +8. Click the "browse" button and select the firmware image for your router + +`librecmc-ar71xx-generic-*-squashfs-*.bin` + + +# WIP diff --git a/feeds.conf.default b/feeds.conf.default index bc1ff677cf..8a6d567bae 100644 --- a/feeds.conf.default +++ b/feeds.conf.default @@ -1 +1 @@ -src-git packages https://gogs.librecmc.org/librecmc/package-feed.git;librecmc-v6.0 +src-git packages https://gogs.librecmc.org/librecmc/package-feed.git;v6.0 diff --git a/include/autotools.mk b/include/autotools.mk index e9a7a82248..d0e4b3642f 100644 --- a/include/autotools.mk +++ b/include/autotools.mk @@ -23,7 +23,10 @@ AM_TOOL_PATHS:= \ LIBTOOLIZE=$(STAGING_DIR_HOST)/bin/libtoolize \ LIBTOOL=$(STAGING_DIR_HOST)/bin/libtool \ M4=$(STAGING_DIR_HOST)/bin/m4 \ - AUTOPOINT=true + AUTOPOINT=true \ + GTKDOCIZE=true + +AM_TOOL_PATHS_FAKE:=$(subst = ,=,$(patsubst "%,"$(TRUE)",$(subst =,= ",$(AM_TOOL_PATHS)))) # 1: build dir # 2: remove files @@ -113,7 +116,7 @@ ifneq ($(filter patch-libtool,$(PKG_FIXUP)),) endif ifneq ($(filter libtool,$(PKG_FIXUP)),) - PKG_BUILD_DEPENDS += libtool libiconv + PKG_BUILD_DEPENDS += libtool ifeq ($(filter no-autoreconf,$(PKG_FIXUP)),) Hooks/Configure/Pre += autoreconf_target endif @@ -123,13 +126,6 @@ ifneq ($(filter libtool-abiver,$(PKG_FIXUP)),) Hooks/Configure/Post += set_libtool_abiver endif -ifneq ($(filter libtool-ucxx,$(PKG_FIXUP)),) - PKG_BUILD_DEPENDS += libtool libiconv - ifeq ($(filter no-autoreconf,$(PKG_FIXUP)),) - Hooks/Configure/Pre += autoreconf_target - endif -endif - ifneq ($(filter autoreconf,$(PKG_FIXUP)),) ifeq ($(filter autoreconf,$(Hooks/Configure/Pre)),) Hooks/Configure/Pre += autoreconf_target @@ -165,12 +161,6 @@ ifneq ($(filter libtool,$(HOST_FIXUP)),) endif endif -ifneq ($(filter libtool-ucxx,$(HOST_FIXUP)),) - ifeq ($(filter no-autoreconf,$(HOST_FIXUP)),) - Hooks/HostConfigure/Pre += autoreconf_host - endif -endif - ifneq ($(filter autoreconf,$(HOST_FIXUP)),) ifeq ($(filter autoreconf,$(Hooks/HostConfigure/Pre)),) Hooks/HostConfigure/Pre += autoreconf_host diff --git a/include/bpf.mk b/include/bpf.mk index 7d0cfbd76d..ec3f04e1e9 100644 --- a/include/bpf.mk +++ b/include/bpf.mk @@ -63,13 +63,15 @@ BPF_CFLAGS := \ -Wno-unused-label \ -O2 -emit-llvm -Xclang -disable-llvm-passes -ifeq ($(DUMP),) +ifneq ($(CONFIG_HAS_BPF_TOOLCHAIN),) +ifeq ($(DUMP)$(filter download refresh,$(MAKECMDGOALS)),) CLANG_VER:=$(shell $(CLANG) -dM -E - < /dev/null | grep __clang_major__ | cut -d' ' -f3) CLANG_VER_VALID:=$(shell [ "$(CLANG_VER)" -ge "$(CLANG_MIN_VER)" ] && echo 1 ) ifeq ($(CLANG_VER_VALID),) $(error ERROR: LLVM/clang version too old. Minimum required: $(CLANG_MIN_VER), found: $(CLANG_VER)) endif endif +endif define CompileBPF $(CLANG) -g -target $(BPF_ARCH)-linux-gnu $(BPF_CFLAGS) $(2) \ diff --git a/include/depends.mk b/include/depends.mk index 8ab80daf39..a858d4b033 100644 --- a/include/depends.mk +++ b/include/depends.mk @@ -28,7 +28,7 @@ ifneq ($(wildcard $(2)),) { [ \! -f "$(3)" ] || diff $(3) $(3).1 >/dev/null; } && \ ) \ { \ - [ -f "$(2)_check.1" ] && mv "$(2)_check.1"; \ + [ -f "$(2)_check.1" ] && mv "$(2)_check.1" "$(2)_check"; \ $(TOPDIR)/scripts/timestamp.pl $(DEP_FINDPARAMS) $(4) -n $(2) $(1) && { \ $(call debug_eval,$(SUBDIR),r,echo "No need to rebuild $(2)";) \ touch -r "$(2)" "$(2)_check"; \ diff --git a/include/download.mk b/include/download.mk index 2fa266888e..370f28a960 100644 --- a/include/download.mk +++ b/include/download.mk @@ -18,6 +18,10 @@ endif DOWNLOAD_RDEP=$(STAMP_PREPARED) $(HOST_STAMP_PREPARED) +# Export options for download.pl +export DOWNLOAD_CHECK_CERTIFICATE:=$(CONFIG_DOWNLOAD_CHECK_CERTIFICATE) +export DOWNLOAD_TOOL_CUSTOM:=$(CONFIG_DOWNLOAD_TOOL_CUSTOM) + define dl_method_git $(if $(filter https://github.com/% git://github.com/%,$(1)),github_archive,git) endef @@ -183,7 +187,7 @@ define DownloadMethod/svn svn export --non-interactive --trust-server-cert -r$(VERSION) $(URL) $(SUBDIR) || \ svn export --non-interactive -r$(VERSION) $(URL) $(SUBDIR) ) && \ echo "Packing checkout..." && \ - export TAR_TIMESTAMP="" && \ + export TAR_TIMESTAMP="`svn info -r$(VERSION) --show-item last-changed-date $(URL)`" && \ $(call dl_tar_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \ mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \ rm -rf $(SUBDIR); \ diff --git a/include/host-build.mk b/include/host-build.mk index 22fcc31f15..dba6b819da 100644 --- a/include/host-build.mk +++ b/include/host-build.mk @@ -26,6 +26,7 @@ HOST_STAMP_CONFIGURED:=$(HOST_BUILD_DIR)/.configured HOST_STAMP_BUILT:=$(HOST_BUILD_DIR)/.built HOST_BUILD_PREFIX?=$(if $(IS_PACKAGE_BUILD),$(STAGING_DIR_HOSTPKG),$(STAGING_DIR_HOST)) HOST_STAMP_INSTALLED:=$(HOST_BUILD_PREFIX)/stamp/.$(PKG_NAME)_installed +HOST_STAMP_PROGRAMS:=$(foreach program,$(PKG_PROGRAMS),$(subst $(PKG_NAME),$(program),$(HOST_STAMP_INSTALLED)) ) override MAKEFLAGS= @@ -59,6 +60,7 @@ HOST_CONFIGURE_ARGS = \ --target=$(GNU_HOST_NAME) \ --host=$(GNU_HOST_NAME) \ --build=$(GNU_HOST_NAME) \ + --disable-dependency-tracking \ --program-prefix="" \ --program-suffix="" \ --prefix=$(HOST_BUILD_PREFIX) \ @@ -130,6 +132,7 @@ define Host/Exports/Default $(1) : export STAGING_PREFIX=$$(HOST_BUILD_PREFIX) $(1) : export PKG_CONFIG_PATH=$$(STAGING_DIR_HOST)/lib/pkgconfig:$$(HOST_BUILD_PREFIX)/lib/pkgconfig $(1) : export PKG_CONFIG_LIBDIR=$$(HOST_BUILD_PREFIX)/lib/pkgconfig + $(1) : export GIT_CEILING_DIRECTORIES=$$(BUILD_DIR_HOST) $(if $(HOST_CONFIG_SITE),$(1) : export CONFIG_SITE:=$(HOST_CONFIG_SITE)) $(if $(IS_PACKAGE_BUILD),$(1) : export PATH=$$(TARGET_PATH_PKG)) endef @@ -170,7 +173,7 @@ ifndef DUMP $(foreach hook,$(Hooks/HostInstall/Post),$(call $(hook))$(sep)) mkdir -p $$(shell dirname $$@) touch $(HOST_STAMP_BUILT) - touch $$@ + touch $$@ $(HOST_STAMP_PROGRAMS) $(call DefaultTargets,$(patsubst %,host-%,$(DEFAULT_SUBDIR_TARGETS))) ifndef STAMP_BUILT @@ -185,7 +188,7 @@ ifndef DUMP $(_host_target)host-prepare: $(HOST_STAMP_PREPARED) $(_host_target)host-configure: $(HOST_STAMP_CONFIGURED) - $(_host_target)host-compile: $(HOST_STAMP_BUILT) $(HOST_STAMP_INSTALLED) + $(_host_target)host-compile: $(HOST_STAMP_BUILT) $(HOST_STAMP_INSTALLED) $(HOST_STAMP_PROGRAMS) host-install: host-compile host-clean-build: FORCE @@ -194,7 +197,7 @@ ifndef DUMP host-clean: host-clean-build $(call Host/Clean) - rm -rf $(HOST_STAMP_INSTALLED) + rm -rf $(HOST_STAMP_INSTALLED) $(HOST_STAMP_PROGRAMS) ifneq ($(CONFIG_AUTOREMOVE),) host-compile: @@ -206,5 +209,9 @@ endif define HostBuild $(HostBuild/Core) - $(if $(if $(PKG_HOST_ONLY),,$(if $(and $(filter host-%,$(MAKECMDGOALS)),$(PKG_SKIP_DOWNLOAD)),,$(STAMP_PREPARED))),,$(if $(strip $(PKG_SOURCE_URL)),$(call Download,default))) + $(if $(if $(PKG_HOST_ONLY),,$(if $(and $(filter host-%,$(MAKECMDGOALS)),$(PKG_SKIP_DOWNLOAD)),,$(STAMP_PREPARED))),, + $(if $(and $(CONFIG_AUTOREMOVE), $(wildcard $(HOST_STAMP_INSTALLED), $(wildcard $(HOST_STAMP_BUILT)))),, + $(if $(strip $(PKG_SOURCE_URL)),$(call Download,default)) + ) + ) endef diff --git a/include/image-commands.mk b/include/image-commands.mk index 402e3d71ed..dc6ee6e7c1 100644 --- a/include/image-commands.mk +++ b/include/image-commands.mk @@ -4,7 +4,7 @@ IMAGE_KERNEL = $(word 1,$^) IMAGE_ROOTFS = $(word 2,$^) define ModelNameLimit16 -$(shell expr substr "$(word 2, $(subst _, ,$(1)))" 1 16) +$(shell printf %.16s "$(word 2, $(subst _, ,$(1)))") endef define rootfs_align @@ -53,6 +53,7 @@ define Build/append-image-stage cp "$(BIN_DIR)/$(DEVICE_IMG_PREFIX)-$(1)" "$@.stripmeta" fwtool -s /dev/null -t "$@.stripmeta" || : fwtool -i /dev/null -t "$@.stripmeta" || : + mkdir -p "$(STAGING_DIR_IMAGE)" dd if="$@.stripmeta" of="$(STAGING_DIR_IMAGE)/$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET))-$(DEVICE_NAME)-$(1)" dd if="$@.stripmeta" >> "$@" rm "$@.stripmeta" @@ -105,7 +106,7 @@ endef define Build/append-squashfs-fakeroot-be rm -rf $@.fakefs $@.fakesquashfs mkdir $@.fakefs - $(STAGING_DIR_HOST)/bin/mksquashfs-lzma \ + $(STAGING_DIR_HOST)/bin/mksquashfs3-lzma \ $@.fakefs $@.fakesquashfs \ -noappend -root-owned -be -nopad -b 65536 \ $(if $(SOURCE_DATE_EPOCH),-fixed-time $(SOURCE_DATE_EPOCH)) @@ -125,6 +126,13 @@ define Build/append-string echo -n $(1) >> $@ endef +define Build/append-md5sum-ascii-salted + cp $@ $@.salted + echo -ne $(1) >> $@.salted + $(STAGING_DIR_HOST)/bin/mkhash md5 $@.salted | head -c32 >> $@ + rm $@.salted +endef + define Build/append-ubi sh $(TOPDIR)/scripts/ubinize-image.sh \ $(if $(UBOOTENV_IN_UBI),--uboot-env) \ @@ -218,6 +226,11 @@ define Build/copy-file cat "$(1)" > "$@" endef +define Build/edimax-header + $(STAGING_DIR_HOST)/bin/mkedimaximg -i $@ -o $@.new $(1) + @mv $@.new $@ +endef + define Build/elecom-product-header $(eval product=$(word 1,$(1))) $(eval fw=$(if $(word 2,$(1)),$(word 2,$(1)),$@)) @@ -271,7 +284,9 @@ endef define Build/initrd_compression $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_BZIP2),.bzip2) \ $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_GZIP),.gzip) \ + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZ4),.lz4) \ $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZMA),.lzma) \ + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZO),.lzo) \ $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_XZ),.xz) \ $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_ZSTD),.zstd) endef @@ -279,9 +294,11 @@ endef define Build/fit $(TOPDIR)/scripts/mkits.sh \ -D $(DEVICE_NAME) -o $@.its -k $@ \ - -C $(word 1,$(1)) $(if $(word 2,$(1)),\ - $(if $(DEVICE_DTS_OVERLAY),-d $(KERNEL_BUILD_DIR)/image-$$(basename $(word 2,$(1))),\ - -d $(word 2,$(1)))) \ + -C $(word 1,$(1)) \ + $(if $(word 2,$(1)),\ + $(if $(findstring 11,$(if $(DEVICE_DTS_OVERLAY),1)$(if $(findstring $(KERNEL_BUILD_DIR)/image-,$(word 2,$(1))),,1)), \ + -d $(KERNEL_BUILD_DIR)/image-$$(basename $(word 2,$(1))), \ + -d $(word 2,$(1)))) \ $(if $(findstring with-rootfs,$(word 3,$(1))),-r $(IMAGE_ROOTFS)) \ $(if $(findstring with-initrd,$(word 3,$(1))), \ $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS_SEPARATE), \ @@ -289,7 +306,8 @@ define Build/fit -a $(KERNEL_LOADADDR) -e $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \ $(if $(DEVICE_FDT_NUM),-n $(DEVICE_FDT_NUM)) \ $(if $(DEVICE_DTS_DELIMITER),-l $(DEVICE_DTS_DELIMITER)) \ - $(if $(DEVICE_DTS_OVERLAY),$(foreach dtso,$(DEVICE_DTS_OVERLAY), -O $(dtso):$(KERNEL_BUILD_DIR)/image-$(dtso).dtb)) \ + $(if $(DEVICE_DTS_LOADADDR),-s $(DEVICE_DTS_LOADADDR)) \ + $(if $(DEVICE_DTS_OVERLAY),$(foreach dtso,$(DEVICE_DTS_OVERLAY), -O $(dtso):$(KERNEL_BUILD_DIR)/image-$(dtso).dtbo)) \ -c $(if $(DEVICE_DTS_CONFIG),$(DEVICE_DTS_CONFIG),"config-1") \ -A $(LINUX_KARCH) -v $(LINUX_VERSION) PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage $(if $(findstring external,$(word 3,$(1))),\ @@ -297,9 +315,23 @@ define Build/fit @mv $@.new $@ endef +define Build/libdeflate-gzip + $(STAGING_DIR_HOST)/bin/libdeflate-gzip -f -12 -c $@ $(1) > $@.new + @mv $@.new $@ +endef + define Build/gzip - gzip -f -9n -c $@ $(1) > $@.new + $(STAGING_DIR_HOST)/bin/gzip -f -9n -c $@ $(1) > $@.new + @mv $@.new $@ +endef + +define Build/gzip-filename + @mkdir -p $@.tmp + @cp $@ $@.tmp/$(word 1,$(1)) + $(if $(SOURCE_DATE_EPOCH),touch -hcd "@$(SOURCE_DATE_EPOCH)" $@.tmp/$(word 1,$(1)) $(word 2,$(1))) + $(STAGING_DIR_HOST)/bin/gzip -f -9 -N -c $@.tmp/$(word 1,$(1)) $(word 2,$(1)) > $@.new @mv $@.new $@ + @rm -rf $@.tmp endef define Build/install-dtb @@ -378,7 +410,7 @@ endef define Build/netgear-dni $(STAGING_DIR_HOST)/bin/mkdniimg \ - -B $(NETGEAR_BOARD_ID) -v $(VERSION_DIST).$(firstword $(subst -, ,$(REVISION))) \ + -B $(NETGEAR_BOARD_ID) -v $(shell cat $(VERSION_DIST)| sed -e 's/[[:space:]]/-/g').$(firstword $(subst -, ,$(REVISION))) \ $(if $(NETGEAR_HW_ID),-H $(NETGEAR_HW_ID)) \ -r "$(1)" \ -i $@ -o $@.new @@ -391,7 +423,9 @@ define Build/netgear-encrypted-factory --output-file $@ \ --model $(NETGEAR_ENC_MODEL) \ --region $(NETGEAR_ENC_REGION) \ - --version V1.0.0.0.$(VERSION_DIST).$(firstword $(subst -, ,$(REVISION))) \ + $(if $(NETGEAR_ENC_HW_ID_LIST),--hw-id-list "$(NETGEAR_ENC_HW_ID_LIST)") \ + $(if $(NETGEAR_ENC_MODEL_LIST),--model-list "$(NETGEAR_ENC_MODEL_LIST)") \ + --version V1.0.0.0.$(shell cat $(VERSION_DIST)| sed -e 's/[[:space:]]/-/g').$(firstword $(subst -, ,$(REVISION))) \ --encryption-block-size 0x20000 \ --openssl-bin "$(STAGING_DIR_HOST)/bin/openssl" \ --key 6865392d342b4d212964363d6d7e7765312c7132613364316e26322a5a5e2538 \ @@ -549,6 +583,7 @@ define Build/tplink-v2-image endef define Build/uImage + $(if $(UIMAGE_TIME),SOURCE_DATE_EPOCH="$(UIMAGE_TIME)") \ mkimage \ -A $(LINUX_KARCH) \ -O linux \ diff --git a/include/image.mk b/include/image.mk index 08fbbc529d..dc53fe8b25 100644 --- a/include/image.mk +++ b/include/image.mk @@ -40,8 +40,10 @@ IMG_PREFIX_VERCODE:=$(if $(CONFIG_VERSION_CODE_FILENAMES),$(call sanitize,$(VERS IMG_PREFIX:=$(VERSION_DIST_SANITIZED)-$(IMG_PREFIX_VERNUM)$(IMG_PREFIX_VERCODE)$(IMG_PREFIX_EXTRA)$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET)) IMG_ROOTFS:=$(IMG_PREFIX)-rootfs IMG_COMBINED:=$(IMG_PREFIX)-combined +ifeq ($(DUMP),) IMG_PART_SIGNATURE:=$(shell echo $(SOURCE_DATE_EPOCH)$(LINUX_VERMAGIC) | $(MKHASH) md5 | cut -b1-8) IMG_PART_DISKGUID:=$(shell echo $(SOURCE_DATE_EPOCH)$(LINUX_VERMAGIC) | $(MKHASH) md5 | sed -E 's/(.{8})(.{4})(.{4})(.{4})(.{10})../\1-\2-\3-\4-\500/') +endif MKFS_DEVTABLE_OPT := -D $(INCLUDE_DIR)/device_table.txt @@ -75,6 +77,7 @@ JFFS2OPTS += $(MKFS_DEVTABLE_OPT) SQUASHFS_BLOCKSIZE := $(CONFIG_TARGET_SQUASHFS_BLOCK_SIZE)k SQUASHFSOPT := -b $(SQUASHFS_BLOCKSIZE) SQUASHFSOPT += -p '/dev d 755 0 0' -p '/dev/console c 600 0 0 5 1' +SQUASHFSOPT += $(if $(CONFIG_SELINUX),-xattrs,-no-xattrs) SQUASHFSCOMP := gzip LZMA_XZ_OPTIONS := -Xpreset 9 -Xe -Xlc 0 -Xlp 2 -Xpb 2 ifeq ($(CONFIG_SQUASHFS_XZ),y) @@ -136,14 +139,6 @@ define Image/BuildKernel/MkuImage -n '$(call toupper,$(ARCH)) $(VERSION_DIST) Linux-$(LINUX_VERSION)' -d $(4) $(5) endef -define Image/BuildKernel/MkFIT - $(TOPDIR)/scripts/mkits.sh \ - -D $(1) -o $(KDIR)/fit-$(1).its -k $(2) $(if $(3),-d $(3)) -C $(4) -a $(5) -e $(6) \ - -c $(if $(DEVICE_DTS_CONFIG),$(DEVICE_DTS_CONFIG),"config-1") \ - -A $(LINUX_KARCH) -v $(LINUX_VERSION) - PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage -f $(KDIR)/fit-$(1).its $(KDIR)/fit-$(1)$(7).itb -endef - ifdef CONFIG_TARGET_IMAGES_GZIP define Image/Gzip rm -f $(1).gz @@ -153,7 +148,7 @@ endif # Disable noisy checks by default as in upstream -DTC_FLAGS += \ +DTC_WARN_FLAGS := \ -Wno-unit_address_vs_reg \ -Wno-simple_bus_reg \ -Wno-unit_address_format \ @@ -166,12 +161,17 @@ DTC_FLAGS += \ -Wno-graph_port \ -Wno-unique_unit_address +DTC_FLAGS += $(DTC_WARN_FLAGS) +DTCO_FLAGS += $(DTC_WARN_FLAGS) + define Image/pad-to dd if=$(1) of=$(1).new bs=$(2) conv=sync mv $(1).new $(1) endef +ifeq ($(DUMP),) ROOTFS_PARTSIZE=$(shell echo $$(($(CONFIG_TARGET_ROOTFS_PARTSIZE)*1024*1024))) +endif define Image/pad-root-squashfs $(call Image/pad-to,$(KDIR)/root.squashfs,$(if $(1),$(1),$(ROOTFS_PARTSIZE))) @@ -181,20 +181,29 @@ endef # $(2) target dtb file # $(3) extra CPP flags # $(4) extra DTC flags -define Image/BuildDTB +define Image/BuildDTB/sub $(TARGET_CROSS)cpp -nostdinc -x assembler-with-cpp \ + $(DTS_CPPFLAGS) \ -I$(DTS_DIR) \ -I$(DTS_DIR)/include \ -I$(LINUX_DIR)/include/ \ -undef -D__DTS__ $(3) \ -o $(2).tmp $(1) $(LINUX_DIR)/scripts/dtc/dtc -O dtb \ - -i$(dir $(1)) $(DTC_FLAGS) $(4) \ + -i$(dir $(1)) $(4) \ $(if $(CONFIG_HAS_DT_OVERLAY_SUPPORT),-@) \ -o $(2) $(2).tmp $(RM) $(2).tmp endef +define Image/BuildDTB + $(call Image/BuildDTB/sub,$(1),$(2),$(3),$(DTC_FLAGS) $(DEVICE_DTC_FLAGS) $(4)) +endef + +define Image/BuildDTBO + $(call Image/BuildDTB/sub,$(1),$(2),$(3),$(DTCO_FLAGS) $(DEVICE_DTCO_FLAGS) $(4)) +endef + define Image/mkfs/jffs2/sub-raw $(STAGING_DIR_HOST)/bin/mkfs.jffs2 \ $(2) \ @@ -231,9 +240,22 @@ define Image/mkfs/squashfs-common -comp $(SQUASHFSCOMP) $(SQUASHFSOPT) endef +ifeq ($(CONFIG_TARGET_ROOTFS_SECURITY_LABELS),y) +define Image/mkfs/squashfs + echo ". $(call mkfs_target_dir,$(1))/etc/selinux/config" > $@.fakeroot-script + echo "$(STAGING_DIR_HOST)/bin/setfiles -r" \ + "$(call mkfs_target_dir,$(1))" \ + "$(call mkfs_target_dir,$(1))/etc/selinux/\$${SELINUXTYPE}/contexts/files/file_contexts " \ + "$(call mkfs_target_dir,$(1))" >> $@.fakeroot-script + echo "$(Image/mkfs/squashfs-common)" >> $@.fakeroot-script + chmod +x $@.fakeroot-script + $(FAKEROOT) "$@.fakeroot-script" +endef +else define Image/mkfs/squashfs $(call Image/mkfs/squashfs-common,$(1)) endef +endif define Image/mkfs/ubifs $(STAGING_DIR_HOST)/bin/mkfs.ubifs \ @@ -259,6 +281,13 @@ endef define Image/Manifest $(call opkg,$(TARGET_DIR_ORIG)) list-installed > \ $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest +ifndef IB + $(if $(CONFIG_JSON_CYCLONEDX_SBOM), \ + $(SCRIPT_DIR)/package-metadata.pl imgcyclonedxsbom \ + $(TMP_DIR)/.packageinfo \ + $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest > \ + $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).bom.cdx.json) +endif endef define Image/gzip-ext4-padded-squashfs @@ -326,6 +355,8 @@ define Device/InitProfile DEVICE_ALT0_TITLE = $$(DEVICE_ALT0_VENDOR) $$(DEVICE_ALT0_MODEL)$$(if $$(DEVICE_ALT0_VARIANT), $$(DEVICE_ALT0_VARIANT)) DEVICE_ALT1_TITLE = $$(DEVICE_ALT1_VENDOR) $$(DEVICE_ALT1_MODEL)$$(if $$(DEVICE_ALT1_VARIANT), $$(DEVICE_ALT1_VARIANT)) DEVICE_ALT2_TITLE = $$(DEVICE_ALT2_VENDOR) $$(DEVICE_ALT2_MODEL)$$(if $$(DEVICE_ALT2_VARIANT), $$(DEVICE_ALT2_VARIANT)) + DEVICE_ALT3_TITLE = $$(DEVICE_ALT3_VENDOR) $$(DEVICE_ALT3_MODEL)$$(if $$(DEVICE_ALT3_VARIANT), $$(DEVICE_ALT3_VARIANT)) + DEVICE_ALT4_TITLE = $$(DEVICE_ALT4_VENDOR) $$(DEVICE_ALT4_MODEL)$$(if $$(DEVICE_ALT4_VARIANT), $$(DEVICE_ALT4_VARIANT)) DEVICE_VENDOR := DEVICE_MODEL := DEVICE_VARIANT := @@ -338,6 +369,12 @@ define Device/InitProfile DEVICE_ALT2_VENDOR := DEVICE_ALT2_MODEL := DEVICE_ALT2_VARIANT := + DEVICE_ALT3_VENDOR := + DEVICE_ALT3_MODEL := + DEVICE_ALT3_VARIANT := + DEVICE_ALT4_VENDOR := + DEVICE_ALT4_MODEL := + DEVICE_ALT4_VARIANT := DEVICE_PACKAGES := DEVICE_DESCRIPTION = Build firmware images for $$(DEVICE_TITLE) endef @@ -352,6 +389,7 @@ define Device/Init ARTIFACTS := DEVICE_IMG_PREFIX := $(IMG_PREFIX)-$(1) DEVICE_IMG_NAME = $$(DEVICE_IMG_PREFIX)-$$(1)-$$(2) + FACTORY_IMG_NAME := IMAGE_SIZE := KERNEL_PREFIX = $$(DEVICE_IMG_PREFIX) KERNEL_SUFFIX := -kernel.bin @@ -381,13 +419,17 @@ define Device/Init DEVICE_DTS_CONFIG := DEVICE_DTS_DELIMITER := DEVICE_DTS_DIR := + DEVICE_DTS_LOADADDR := DEVICE_DTS_OVERLAY := DEVICE_FDT_NUM := + DEVICE_DTC_FLAGS := + DEVICE_DTCO_FLAGS := SOC := BOARD_NAME := UIMAGE_MAGIC := UIMAGE_NAME := + UIMAGE_TIME := DEVICE_COMPAT_VERSION := 1.0 DEVICE_COMPAT_MESSAGE := SUPPORTED_DEVICES := $(subst _,$(comma),$(1)) @@ -404,16 +446,20 @@ endef DEFAULT_DEVICE_VARS := \ DEVICE_NAME KERNEL KERNEL_INITRAMFS KERNEL_INITRAMFS_IMAGE KERNEL_SIZE \ CMDLINE UBOOTENV_IN_UBI KERNEL_IN_UBI BLOCKSIZE PAGESIZE SUBPAGESIZE \ - VID_HDR_OFFSET UBINIZE_OPTS UBINIZE_PARTS MKUBIFS_OPTS DEVICE_DTS \ - DEVICE_DTS_CONFIG DEVICE_DTS_DELIMITER DEVICE_DTS_DIR DEVICE_DTS_OVERLAY \ + VID_HDR_OFFSET UBINIZE_OPTS UBINIZE_PARTS MKUBIFS_OPTS DEVICE_DTC_FLAGS \ + DEVICE_DTCO_FLAGS DEVICE_DTS DEVICE_DTS_CONFIG DEVICE_DTS_DELIMITER \ + DEVICE_DTS_DIR DEVICE_DTS_OVERLAY DEVICE_DTS_LOADADDR \ DEVICE_FDT_NUM DEVICE_IMG_PREFIX SOC BOARD_NAME UIMAGE_MAGIC UIMAGE_NAME \ - SUPPORTED_DEVICES IMAGE_METADATA KERNEL_ENTRY KERNEL_LOADADDR \ + UIMAGE_TIME SUPPORTED_DEVICES IMAGE_METADATA KERNEL_ENTRY KERNEL_LOADADDR \ UBOOT_PATH IMAGE_SIZE \ + FACTORY_IMG_NAME FACTORY_SIZE \ DEVICE_PACKAGES DEVICE_COMPAT_VERSION DEVICE_COMPAT_MESSAGE \ DEVICE_VENDOR DEVICE_MODEL DEVICE_VARIANT \ DEVICE_ALT0_VENDOR DEVICE_ALT0_MODEL DEVICE_ALT0_VARIANT \ DEVICE_ALT1_VENDOR DEVICE_ALT1_MODEL DEVICE_ALT1_VARIANT \ - DEVICE_ALT2_VENDOR DEVICE_ALT2_MODEL DEVICE_ALT2_VARIANT + DEVICE_ALT2_VENDOR DEVICE_ALT2_MODEL DEVICE_ALT2_VARIANT \ + DEVICE_ALT3_VENDOR DEVICE_ALT3_MODEL DEVICE_ALT3_VARIANT \ + DEVICE_ALT4_VENDOR DEVICE_ALT4_MODEL DEVICE_ALT4_VARIANT define Device/ExportVar $(1) : $(2):=$$($(2)) @@ -496,6 +542,12 @@ define Device/Build/initramfs DEVICE_ALT2_VENDOR="$$(DEVICE_ALT2_VENDOR)" \ DEVICE_ALT2_MODEL="$$(DEVICE_ALT2_MODEL)" \ DEVICE_ALT2_VARIANT="$$(DEVICE_ALT2_VARIANT)" \ + DEVICE_ALT3_VENDOR="$$(DEVICE_ALT3_VENDOR)" \ + DEVICE_ALT3_MODEL="$$(DEVICE_ALT3_MODEL)" \ + DEVICE_ALT3_VARIANT="$$(DEVICE_ALT3_VARIANT)" \ + DEVICE_ALT4_VENDOR="$$(DEVICE_ALT4_VENDOR)" \ + DEVICE_ALT4_MODEL="$$(DEVICE_ALT4_MODEL)" \ + DEVICE_ALT4_VARIANT="$$(DEVICE_ALT4_VARIANT)" \ DEVICE_TITLE="$$(DEVICE_TITLE)" \ DEVICE_PACKAGES="$$(DEVICE_PACKAGES)" \ TARGET="$(BOARD)" \ @@ -511,6 +563,7 @@ define Device/Build/compile $$(_COMPILE_TARGET): $(KDIR)/$(1) $(eval $(call Device/Export,$(KDIR)/$(1))) $(KDIR)/$(1): FORCE + rm -f $(KDIR)/$(1) $$(call concat_cmd,$(COMPILE/$(1))) endef @@ -525,16 +578,33 @@ define Device/Build/dtb image_prepare: $(KDIR)/image-$(1).dtb endif +endef + +define Device/Build/dtbo + ifndef BUILD_DTSO_$(1) + BUILD_DTSO_$(1) := 1 + $(KDIR)/image-$(1).dtbo: FORCE + $(call Image/BuildDTBO,$(strip $(2))/$(strip $(3)).dtso,$$@) + + image_prepare: $(KDIR)/image-$(1).dtbo + endif + endef endif define Device/Build/kernel - $$(eval $$(foreach dts,$$(DEVICE_DTS) $$(DEVICE_DTS_OVERLAY), \ + $$(eval $$(foreach dts,$$(DEVICE_DTS), \ $$(call Device/Build/dtb,$$(notdir $$(dts)), \ $$(if $$(DEVICE_DTS_DIR),$$(DEVICE_DTS_DIR),$$(DTS_DIR)), \ $$(dts) \ ) \ )) + $$(eval $$(foreach dtso,$$(DEVICE_DTS_OVERLAY), \ + $$(call Device/Build/dtbo,$$(notdir $$(dtso)), \ + $$(if $$(DEVICE_DTS_DIR),$$(DEVICE_DTS_DIR),$$(DTS_DIR)), \ + $$(dtso) \ + ) \ + )) $(KDIR)/$$(KERNEL_NAME):: image_prepare $$(_TARGET): $$(if $$(KERNEL_INSTALL),$(BIN_DIR)/$$(KERNEL_IMAGE)) @@ -603,6 +673,12 @@ define Device/Build/image DEVICE_ALT2_VENDOR="$(DEVICE_ALT2_VENDOR)" \ DEVICE_ALT2_MODEL="$(DEVICE_ALT2_MODEL)" \ DEVICE_ALT2_VARIANT="$(DEVICE_ALT2_VARIANT)" \ + DEVICE_ALT3_VENDOR="$(DEVICE_ALT3_VENDOR)" \ + DEVICE_ALT3_MODEL="$(DEVICE_ALT3_MODEL)" \ + DEVICE_ALT3_VARIANT="$(DEVICE_ALT3_VARIANT)" \ + DEVICE_ALT4_VENDOR="$(DEVICE_ALT4_VENDOR)" \ + DEVICE_ALT4_MODEL="$(DEVICE_ALT4_MODEL)" \ + DEVICE_ALT4_VARIANT="$(DEVICE_ALT4_VARIANT)" \ DEVICE_TITLE="$(DEVICE_TITLE)" \ DEVICE_PACKAGES="$(DEVICE_PACKAGES)" \ TARGET="$(BOARD)" \ @@ -648,6 +724,12 @@ define Device/Build/artifact DEVICE_ALT2_VENDOR="$(DEVICE_ALT2_VENDOR)" \ DEVICE_ALT2_MODEL="$(DEVICE_ALT2_MODEL)" \ DEVICE_ALT2_VARIANT="$(DEVICE_ALT2_VARIANT)" \ + DEVICE_ALT3_VENDOR="$(DEVICE_ALT3_VENDOR)" \ + DEVICE_ALT3_MODEL="$(DEVICE_ALT3_MODEL)" \ + DEVICE_ALT3_VARIANT="$(DEVICE_ALT3_VARIANT)" \ + DEVICE_ALT4_VENDOR="$(DEVICE_ALT4_VENDOR)" \ + DEVICE_ALT4_MODEL="$(DEVICE_ALT4_MODEL)" \ + DEVICE_ALT4_VARIANT="$(DEVICE_ALT4_VARIANT)" \ DEVICE_TITLE="$(DEVICE_TITLE)" \ DEVICE_PACKAGES="$(DEVICE_PACKAGES)" \ TARGET="$(BOARD)" \ @@ -689,6 +771,8 @@ $(if $(strip $(DEVICE_ALT0_TITLE)),Alternative device titles: - $(DEVICE_ALT0_TITLE)) $(if $(strip $(DEVICE_ALT1_TITLE)),- $(DEVICE_ALT1_TITLE)) $(if $(strip $(DEVICE_ALT2_TITLE)),- $(DEVICE_ALT2_TITLE)) +$(if $(strip $(DEVICE_ALT3_TITLE)),- $(DEVICE_ALT3_TITLE)) +$(if $(strip $(DEVICE_ALT4_TITLE)),- $(DEVICE_ALT4_TITLE)) @@ endef @@ -706,6 +790,14 @@ ifneq ($$(strip $$(DEVICE_ALT2_TITLE)),) DEVICE_DISPLAY = $$(DEVICE_ALT2_TITLE) ($$(DEVICE_TITLE)) $$(info $$(call Device/DumpInfo,$(1))) endif +ifneq ($$(strip $$(DEVICE_ALT3_TITLE)),) +DEVICE_DISPLAY = $$(DEVICE_ALT3_TITLE) ($$(DEVICE_TITLE)) +$$(info $$(call Device/DumpInfo,$(1))) +endif +ifneq ($$(strip $$(DEVICE_ALT4_TITLE)),) +DEVICE_DISPLAY = $$(DEVICE_ALT4_TITLE) ($$(DEVICE_TITLE)) +$$(info $$(call Device/DumpInfo,$(1))) +endif DEVICE_DISPLAY = $$(DEVICE_TITLE) $$(eval $$(if $$(DEVICE_TITLE),$$(info $$(call Device/DumpInfo,$(1))))) endef @@ -749,6 +841,7 @@ define BuildImage else image_prepare: + rm -rf $(KDIR)/tmp mkdir -p $(BIN_DIR) $(KDIR)/tmp endif diff --git a/include/kernel-5.10 b/include/kernel-5.10 deleted file mode 100644 index 68e192f8ac..0000000000 --- a/include/kernel-5.10 +++ /dev/null @@ -1,3 +0,0 @@ -LIBRE_REV = 1 -LINUX_VERSION-5.10 = .179 -LINUX_KERNEL_HASH-5.10.179 = d76270b9fdbf101b461ec000a796cf9d0db092a9c3e71da265e38dc33fedadb1 diff --git a/include/kernel-5.15 b/include/kernel-5.15 new file mode 100644 index 0000000000..902793aa51 --- /dev/null +++ b/include/kernel-5.15 @@ -0,0 +1,2 @@ +LINUX_VERSION-5.15 = .145 +LINUX_KERNEL_HASH-5.15.145 = fc054e6e0a00a0e997de83c1f8fe71835de9e1c507437ab3242039f29ce51b87 diff --git a/include/kernel-build.mk b/include/kernel-build.mk index 5dd033cda6..5b332258f8 100644 --- a/include/kernel-build.mk +++ b/include/kernel-build.mk @@ -162,7 +162,6 @@ define BuildKernel $(LINUX_RECONF_CMD) > $(LINUX_DIR)/.config $(_SINGLE)$(KERNEL_MAKE) \ $(if $(findstring Darwin,$(HOST_OS)), \ - HOST_LOADLIBES="-L$(STAGING_DIR_HOST)/lib -lncurses" \ HOSTLDLIBS_mconf="-L$(STAGING_DIR_HOST)/lib -lncurses" \ filechk_conf_cfg=" :" \ ) \ diff --git a/include/kernel-defaults.mk b/include/kernel-defaults.mk index 2e21392016..b17ff7f932 100644 --- a/include/kernel-defaults.mk +++ b/include/kernel-defaults.mk @@ -21,7 +21,7 @@ Kernel/Patch:=$(Kernel/Patch/Default) ifneq (,$(findstring .xz,$(LINUX_SOURCE))) LINUX_CAT:=xzcat else - LINUX_CAT:=gzip -dc + LINUX_CAT:=$(STAGING_DIR_HOST)/bin/libdeflate-gzip -dc endif ifeq ($(strip $(CONFIG_EXTERNAL_KERNEL_TREE)),"") @@ -117,7 +117,7 @@ define Kernel/Configure/Default cp $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config; \ cp $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config.prev; \ } - $(_SINGLE) [ -d $(LINUX_DIR)/user_headers ] || $(KERNEL_MAKE) INSTALL_HDR_PATH=$(LINUX_DIR)/user_headers headers_install + $(_SINGLE) [ -d $(LINUX_DIR)/user_headers ] || $(KERNEL_MAKE) $(if $(findstring uml,$(BOARD)),ARCH=$(ARCH)) INSTALL_HDR_PATH=$(LINUX_DIR)/user_headers headers_install grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | $(MKHASH) md5 > $(LINUX_DIR)/.vermagic endef @@ -153,17 +153,12 @@ define Kernel/CopyImage } endef -# Always add "modules" so a proper Module.symvers file is written that -# also contains symbols from the kernel modules. Without these symbols -# external packages that depend on exported symbols from kernel modules -# will fail to build. define Kernel/CompileImage/Default rm -f $(TARGET_DIR)/init - +$(KERNEL_MAKE) $(KERNEL_MAKEOPTS_IMAGE) $(if $(KERNELNAME),$(KERNELNAME),all) modules + +$(KERNEL_MAKE) $(KERNEL_MAKEOPTS_IMAGE) $(if $(KERNELNAME),$(KERNELNAME),all) $(call Kernel/CopyImage) endef -# Here as well, always add "modules", see comment above. ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),) define Kernel/CompileImage/Initramfs $(call Kernel/Configure/Initramfs) @@ -171,21 +166,21 @@ define Kernel/CompileImage/Initramfs $(if $(SOURCE_DATE_EPOCH),touch -hcd "@$(SOURCE_DATE_EPOCH)" $(TARGET_DIR) $(TARGET_DIR)/init) rm -rf $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)/usr/initramfs_data.cpio* ifeq ($(CONFIG_TARGET_ROOTFS_INITRAMFS_SEPARATE),y) -ifneq ($(qstrip $(CONFIG_EXTERNAL_CPIO)),) +ifneq ($(call qstrip,$(CONFIG_EXTERNAL_CPIO)),) $(CP) $(CONFIG_EXTERNAL_CPIO) $(KERNEL_BUILD_DIR)/initrd.cpio else ( cd $(TARGET_DIR); find . | LC_ALL=C sort | $(STAGING_DIR_HOST)/bin/cpio --reproducible -o -H newc -R 0:0 > $(KERNEL_BUILD_DIR)/initrd.cpio ) endif $(if $(SOURCE_DATE_EPOCH),touch -hcd "@$(SOURCE_DATE_EPOCH)" $(KERNEL_BUILD_DIR)/initrd.cpio) - $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_BZIP2),bzip2 -9 -c < $(KERNEL_BUILD_DIR)/initrd.cpio > $(KERNEL_BUILD_DIR)/initrd.cpio.bzip2) - $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_GZIP),gzip -n -f -S .gzip -9n $(KERNEL_BUILD_DIR)/initrd.cpio) + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_BZIP2),$(STAGING_DIR_HOST)/bin/bzip2 -9 -c < $(KERNEL_BUILD_DIR)/initrd.cpio > $(KERNEL_BUILD_DIR)/initrd.cpio.bzip2) + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_GZIP),$(STAGING_DIR_HOST)/bin/libdeflate-gzip -n -f -S .gzip -12 $(KERNEL_BUILD_DIR)/initrd.cpio) + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZ4),$(STAGING_DIR_HOST)/bin/lz4c -l -c1 -fz --favor-decSpeed $(KERNEL_BUILD_DIR)/initrd.cpio) $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZMA),$(STAGING_DIR_HOST)/bin/lzma e -lc1 -lp2 -pb2 $(KERNEL_BUILD_DIR)/initrd.cpio $(KERNEL_BUILD_DIR)/initrd.cpio.lzma) -# ? $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZO),) + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZO),$(STAGING_DIR_HOST)/bin/lzop -9 -f $(KERNEL_BUILD_DIR)/initrd.cpio) $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_XZ),$(STAGING_DIR_HOST)/bin/xz -T$(if $(filter 1,$(NPROC)),2,0) -9 -fz --check=crc32 $(KERNEL_BUILD_DIR)/initrd.cpio) -# ? $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZ4),) $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_ZSTD),$(STAGING_DIR_HOST)/bin/zstd -T0 -f -o $(KERNEL_BUILD_DIR)/initrd.cpio.zstd $(KERNEL_BUILD_DIR)/initrd.cpio) endif - +$(KERNEL_MAKE) $(KERNEL_MAKEOPTS_IMAGE) $(if $(KERNELNAME),$(KERNELNAME),all) modules + +$(KERNEL_MAKE) $(KERNEL_MAKEOPTS_IMAGE) $(if $(KERNELNAME),$(KERNELNAME),all) $(call Kernel/CopyImage,-initramfs) endef else diff --git a/include/kernel-version.mk b/include/kernel-version.mk index 1edb01df27..958ed9be0c 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -13,6 +13,15 @@ endif include $(KERNEL_DETAILS_FILE) +ifdef KERNEL_TESTING_PATCHVER + KERNEL_TESTING_DETAILS_FILE=$(INCLUDE_DIR)/kernel-$(KERNEL_TESTING_PATCHVER) + ifeq ($(wildcard $(KERNEL_TESTING_DETAILS_FILE)),) + $(error Missing kernel version/hash file for $(KERNEL_TESTING_PATCHVER). Please create $(KERNEL_TESTING_DETAILS_FILE)) + endif + + include $(KERNEL_TESTING_DETAILS_FILE) +endif + remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1))))))) diff --git a/include/kernel.mk b/include/kernel.mk index 6741fbcc18..a429dd3042 100644 --- a/include/kernel.mk +++ b/include/kernel.mk @@ -90,6 +90,8 @@ else ifneq (,$(findstring $(ARCH) , mipsel mips64 mips64el )) LINUX_KARCH := mips else ifneq (,$(findstring $(ARCH) , powerpc64 )) LINUX_KARCH := powerpc +else ifneq (,$(findstring $(ARCH) , riscv64 )) + LINUX_KARCH := riscv else ifneq (,$(findstring $(ARCH) , sh2 sh3 sh4 )) LINUX_KARCH := sh else ifneq (,$(findstring $(ARCH) , i386 x86_64 )) @@ -110,8 +112,7 @@ KERNEL_MAKE_FLAGS = \ KBUILD_BUILD_HOST="$(call qstrip,$(CONFIG_KERNEL_BUILD_DOMAIN))" \ KBUILD_BUILD_TIMESTAMP="$(KBUILD_BUILD_TIMESTAMP)" \ KBUILD_BUILD_VERSION="0" \ - HOST_LOADLIBES="-L$(STAGING_DIR_HOST)/lib" \ - KBUILD_HOSTLDLIBS="-L$(STAGING_DIR_HOST)/lib" \ + KBUILD_HOSTLDFLAGS="-L$(STAGING_DIR_HOST)/lib" \ CONFIG_SHELL="$(BASH)" \ $(if $(findstring c,$(LIBRECMC_VERBOSE)),V=1,V='') \ $(if $(PKG_BUILD_ID),LDFLAGS_MODULE=--build-id=0x$(PKG_BUILD_ID)) \ @@ -126,17 +127,17 @@ ifeq ($(call qstrip,$(CONFIG_EXTERNAL_KERNEL_TREE))$(call qstrip,$(CONFIG_KERNEL KERNELRELEASE=$(LINUX_VERSION) endif -KERNEL_MAKEOPTS := -C $(LINUX_DIR) $(KERNEL_MAKE_FLAGS) +ifneq ($(HOST_OS),Linux) + KERNEL_MAKE_FLAGS += CONFIG_STACK_VALIDATION= + export SKIP_STACK_VALIDATION:=1 +endif + +KERNEL_MAKEOPTS = -C $(LINUX_DIR) $(KERNEL_MAKE_FLAGS) ifdef CONFIG_USE_SPARSE KERNEL_MAKEOPTS += C=1 CHECK=$(STAGING_DIR_HOST)/bin/sparse endif -ifneq ($(HOST_OS),Linux) - KERNEL_MAKEOPTS += CONFIG_STACK_VALIDATION= - export SKIP_STACK_VALIDATION:=1 -endif - PKG_EXTMOD_SUBDIRS ?= . PKG_SYMVERS_DIR = $(KERNEL_BUILD_DIR)/symvers @@ -235,7 +236,7 @@ $(call KernelPackage/$(1)/config) $(call KernelPackage/depends) $(call KernelPackage/hooks) - ifneq ($(if $(filter-out %=y %=n %=m,$(KCONFIG)),$(filter m y,$(foreach c,$(filter-out %=y %=n %=m,$(KCONFIG)),$($(c)))),.),) + ifneq ($(if $(filter-out %=y %=n %=m,$(KCONFIG)),$(filter m y,$(foreach c,$(call version_filter,$(filter-out %=y %=n %=m,$(KCONFIG))),$($(c)))),.),) define Package/kmod-$(1)/install @for mod in $$(call version_filter,$$(FILES)); do \ if grep -q "$$$$$$$${mod##$(LINUX_DIR)/}" "$(LINUX_DIR)/modules.builtin"; then \ diff --git a/include/netfilter.mk b/include/netfilter.mk index 8b9ec7c49d..81488fe5c8 100644 --- a/include/netfilter.mk +++ b/include/netfilter.mk @@ -73,7 +73,6 @@ $(eval $(call nf_add,IPT_CONNTRACK,CONFIG_NETFILTER_XT_MATCH_CONNTRACK, $(P_XT)x $(eval $(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_XT_MATCH_CONNBYTES, $(P_XT)xt_connbytes)) $(eval $(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_XT_MATCH_CONNLIMIT, $(P_XT)xt_connlimit)) -$(eval $(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_CONNCOUNT, $(P_XT)nf_conncount)) $(eval $(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_XT_CONNMARK, $(P_XT)xt_connmark)) $(eval $(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_XT_MATCH_HELPER, $(P_XT)xt_helper)) $(eval $(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_XT_MATCH_RECENT, $(P_XT)xt_recent)) @@ -171,9 +170,10 @@ $(eval $(call nf_add,IPT_IPV6_EXTRA,CONFIG_IP6_NF_MATCH_RT, $(P_V6)ip6t_rt)) # log -$(eval $(call nf_add,NF_LOG,CONFIG_NF_LOG_COMMON, $(P_XT)nf_log_common)) -$(eval $(call nf_add,NF_LOG,CONFIG_NF_LOG_IPV4, $(P_V4)nf_log_ipv4)) -$(eval $(if $(NF_KMOD),$(call nf_add,NF_LOG6,CONFIG_NF_LOG_IPV6, $(P_V6)nf_log_ipv6),)) +$(eval $(call nf_add,NF_LOG,CONFIG_NF_LOG_COMMON, $(P_XT)nf_log_common, lt 5.13)) +$(eval $(call nf_add,NF_LOG,CONFIG_NF_LOG_IPV4, $(P_V4)nf_log_ipv4, lt 5.13)) +$(eval $(call nf_add,NF_LOG,CONFIG_NF_LOG_SYSLOG, $(P_XT)nf_log_syslog, ge 5.13)) +$(eval $(if $(NF_KMOD),$(call nf_add,NF_LOG6,CONFIG_NF_LOG_IPV6, $(P_V6)nf_log_ipv6,lt 5.13),)) # nat @@ -277,6 +277,10 @@ $(eval $(call nf_add,NFNETLINK_LOG,CONFIG_NETFILTER_NETLINK_LOG, $(P_XT)nfnetlin $(eval $(call nf_add,NFNETLINK_QUEUE,CONFIG_NETFILTER_NETLINK_QUEUE, $(P_XT)nfnetlink_queue)) +# conncount + +$(eval $(if $(NF_KMOD),$(call nf_add,NF_CONNCOUNT,CONFIG_NETFILTER_CONNCOUNT, $(P_XT)nf_conncount),)) + # # ebtables # @@ -351,6 +355,8 @@ $(eval $(if $(NF_KMOD),$(call nf_add,NFT_COMPAT,CONFIG_NFT_COMPAT, $(P_XT)nft_co $(eval $(if $(NF_KMOD),$(call nf_add,NFT_XFRM,CONFIG_NFT_XFRM, $(P_XT)nft_xfrm),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CONNLIMIT,CONFIG_NFT_CONNLIMIT, $(P_XT)nft_connlimit),)) + # userland only IPT_BUILTIN += $(NF_IPT-y) $(NF_IPT-m) IPT_BUILTIN += $(IPT_CORE-y) $(IPT_CORE-m) diff --git a/include/nls.mk b/include/nls.mk index 163e480932..f054d2bb68 100644 --- a/include/nls.mk +++ b/include/nls.mk @@ -10,27 +10,38 @@ ifeq ($(CONFIG_BUILD_NLS),y) INTL_PREFIX:=$(STAGING_DIR)/usr/lib/libintl-full INTL_FULL:=1 -# iconv stub + CMAKE_OPTIONS += -DCMAKE_PREFIX_PATH="$(ICONV_PREFIX);$(INTL_PREFIX)" else - ICONV_PREFIX:=$(STAGING_DIR)/usr/lib/libiconv-stub + ICONV_PREFIX:= ICONV_FULL:= - INTL_PREFIX:=$(STAGING_DIR)/usr/lib/libintl-stub + INTL_PREFIX:= INTL_FULL:= endif PKG_CONFIG_DEPENDS += CONFIG_BUILD_NLS -PKG_BUILD_DEPENDS += !BUILD_NLS:libiconv ICONV_DEPENDS:=+BUILD_NLS:libiconv-full -ICONV_CFLAGS:=-I$(ICONV_PREFIX)/include -ICONV_CPPFLAGS:=-I$(ICONV_PREFIX)/include -ICONV_LDFLAGS:=-L$(ICONV_PREFIX)/lib -Wl,-rpath-link=$(ICONV_PREFIX)/lib +ifeq ($(CONFIG_BUILD_NLS),y) + ICONV_CFLAGS:=-I$(ICONV_PREFIX)/include + ICONV_CPPFLAGS:=-I$(ICONV_PREFIX)/include + ICONV_LDFLAGS:=-L$(ICONV_PREFIX)/lib -Wl,-rpath-link=$(ICONV_PREFIX)/lib +else + ICONV_CFLAGS:= + ICONV_CPPFLAGS:= + ICONV_LDFLAGS:= +endif INTL_DEPENDS:=+BUILD_NLS:libintl-full -INTL_CFLAGS:=-I$(INTL_PREFIX)/include -INTL_CPPFLAGS:=-I$(INTL_PREFIX)/include -INTL_LDFLAGS:=-L$(INTL_PREFIX)/lib -Wl,-rpath-link=$(INTL_PREFIX)/lib +ifeq ($(CONFIG_BUILD_NLS),y) + INTL_CFLAGS:=-I$(INTL_PREFIX)/include + INTL_CPPFLAGS:=-I$(INTL_PREFIX)/include + INTL_LDFLAGS:=-L$(INTL_PREFIX)/lib -Wl,-rpath-link=$(INTL_PREFIX)/lib +else + INTL_CFLAGS:= + INTL_CPPFLAGS:= + INTL_LDFLAGS:= +endif TARGET_CFLAGS += $(ICONV_CFLAGS) $(INTL_CFLAGS) TARGET_CPPFLAGS += $(ICONV_CPPFLAGS) $(INTL_CPPFLAGS) diff --git a/include/openssl-module.mk b/include/openssl-module.mk new file mode 100644 index 0000000000..7348a10dbc --- /dev/null +++ b/include/openssl-module.mk @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2022-2023 Enéas Ulir de Queiroz + +ENGINES_DIR=engines-3 + +define Package/openssl/module/Default + SECTION:=libs + CATEGORY:=Libraries + SUBMENU:=SSL + DEPENDS:=libopenssl +libopenssl-conf +endef + +define Package/openssl/engine/Default + $(Package/openssl/module/Default) + DEPENDS+=@OPENSSL_ENGINE +endef + + +# 1 = moudule type (engine|provider) +# 2 = module name +# 3 = directory to save .so file +# 4 = [ package name, defaults to libopenssl-$(2) ] +define Package/openssl/add-module + $(eval MOD_TYPE:=$(1)) + $(eval MOD_NAME:=$(2)) + $(eval MOD_DIR:=$(3)) + $(eval OSSL_PKG:=$(if $(4),$(4),libopenssl-$(MOD_NAME))) + $(info Package/openssl/add-module 1='$(1)'; 2='$(2)'; 3='$(3)' 4='$(4)') + $(info MOD_TYPE='$(MOD_TYPE)'; MOD_NAME='$(MOD_NAME)'; MOD_DIR='$(MOD_DIR)' OSSL_PKG='$(OSSL_PKG)') + Package/$(OSSL_PKG)/conffiles:=/etc/ssl/modules.cnf.d/$(MOD_NAME).cnf + + define Package/$(OSSL_PKG)/install + $$(INSTALL_DIR) $$(1)/$(MOD_DIR) + $$(INSTALL_BIN) $$(PKG_INSTALL_DIR)/$(MOD_DIR)/$(MOD_NAME).so \ + $$(1)/$(MOD_DIR) + $$(INSTALL_DIR) $$(1)/etc/ssl/modules.cnf.d + $$(INSTALL_DATA) ./files/$(MOD_NAME).cnf $$(1)/etc/ssl/modules.cnf.d/ + endef + + define Package/$(OSSL_PKG)/postinst +#!/bin/sh +OPENSSL_UCI="$$$${IPKG_INSTROOT}/etc/config/openssl" + +[ -z "$$$${IPKG_INSTROOT}" ] \ + && uci -q get openssl.$(MOD_NAME) >/dev/null \ + && exit 0 + +cat << EOF >> "$$$${OPENSSL_UCI}" + +config $(MOD_TYPE) '$(MOD_NAME)' + option enabled '1' +EOF + +[ -n "$$$${IPKG_INSTROOT}" ] || /etc/init.d/openssl reload +exit 0 + endef + + define Package/$(OSSL_PKG)/postrm +#!/bin/sh +[ -n "$$$${IPKG_INSTROOT}" ] && exit 0 +uci -q delete openssl.$(MOD_NAME) && uci commit openssl +/etc/init.d/openssl reload +exit 0 + endef +endef + +# 1 = engine name +# 2 - package name, defaults to libopenssl-$(1) +define Package/openssl/add-engine + $(call Package/openssl/add-module,engine,$(1),/usr/lib/$(ENGINES_DIR),$(2)) +endef + +# 1 = provider name +# 2 = [ package name, defaults to libopenssl-$(1) ] +define Package/openssl/add-provider + $(call Package/openssl/add-module,provider,$(1),/usr/lib/ossl-modules,$(2)) +endef + diff --git a/include/package-defaults.mk b/include/package-defaults.mk index 3ee3a965f2..2cff26b531 100644 --- a/include/package-defaults.mk +++ b/include/package-defaults.mk @@ -2,7 +2,7 @@ # # Copyright (C) 2006-2020 OpenWrt.org -PKG_DEFAULT_DEPENDS = +libc +USE_GLIBC:librt +USE_GLIBC:libpthread +PKG_DEFAULT_DEPENDS = +libc ifneq ($(PKG_NAME),toolchain) PKG_FIXUP_DEPENDS = $(if $(filter kmod-%,$(1)),$(2),$(PKG_DEFAULT_DEPENDS) $(filter-out $(PKG_DEFAULT_DEPENDS),$(2))) @@ -80,6 +80,7 @@ CONFIGURE_ARGS = \ --target=$(GNU_TARGET_NAME) \ --host=$(GNU_TARGET_NAME) \ --build=$(GNU_HOST_NAME) \ + --disable-dependency-tracking \ --program-prefix="" \ --program-suffix="" \ --prefix=$(CONFIGURE_PREFIX) \ diff --git a/include/package-dumpinfo.mk b/include/package-dumpinfo.mk index 597452e4b9..6baf10225d 100644 --- a/include/package-dumpinfo.mk +++ b/include/package-dumpinfo.mk @@ -36,6 +36,8 @@ $(if $(USERID),Require-User: $(USERID) )Source: $(PKG_SOURCE) $(if $(LICENSE),License: $(LICENSE) )$(if $(LICENSE_FILES),LicenseFiles: $(LICENSE_FILES) +)$(if $(PKG_CPE_ID),CPE-ID: $(PKG_CPE_ID) +)$(if $(ABI_VERSION),ABI-Version: $(ABI_VERSION) )Type: $(if $(Package/$(1)/targets),$(Package/$(1)/targets),$(if $(PKG_TARGETS),$(PKG_TARGETS),ipkg)) $(if $(KCONFIG),Kernel-Config: $(KCONFIG) )$(if $(BUILDONLY),Build-Only: $(BUILDONLY) diff --git a/include/package.mk b/include/package.mk index 368bf0d7ca..c391d320aa 100644 --- a/include/package.mk +++ b/include/package.mk @@ -11,8 +11,6 @@ include $(INCLUDE_DIR)/download.mk PKG_BUILD_DIR ?= $(BUILD_DIR)/$(if $(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)$(PKG_NAME)$(if $(PKG_VERSION),-$(PKG_VERSION)) PKG_INSTALL_DIR ?= $(PKG_BUILD_DIR)/ipkg-install PKG_BUILD_PARALLEL ?= -PKG_USE_MIPS16 ?= 1 -PKG_IREMAP ?= 1 PKG_SKIP_DOWNLOAD=$(USE_SOURCE_DIR)$(USE_GIT_TREE)$(USE_GIT_SRC_CHECKOUT) MAKE_J:=$(if $(MAKE_JOBSERVER),$(MAKE_JOBSERVER) $(if $(filter 3.% 4.0 4.1,$(MAKE_VERSION)),-j)) @@ -24,15 +22,38 @@ PKG_JOBS?=-j1 else PKG_JOBS?=$(if $(PKG_BUILD_PARALLEL),$(MAKE_J),-j1) endif + +PKG_BUILD_FLAGS?= +__unknown_flags=$(filter-out no-iremap no-mips16 gc-sections no-gc-sections lto no-lto,$(PKG_BUILD_FLAGS)) +ifneq ($(__unknown_flags),) + $(error unknown PKG_BUILD_FLAGS: $(__unknown_flags)) +endif + +# $1=flagname, $2=default (0/1) +define pkg_build_flag +$(if $(filter no-$(1),$(PKG_BUILD_FLAGS)),0,$(if $(filter $(1),$(PKG_BUILD_FLAGS)),1,$(2))) +endef + +ifeq ($(call pkg_build_flag,iremap,1),1) + IREMAP_CFLAGS = $(call iremap,$(PKG_BUILD_DIR),$(notdir $(PKG_BUILD_DIR))) + TARGET_CFLAGS += $(IREMAP_CFLAGS) +endif ifdef CONFIG_USE_MIPS16 - ifeq ($(strip $(PKG_USE_MIPS16)),1) + ifeq ($(call pkg_build_flag,mips16,1),1) TARGET_ASFLAGS_DEFAULT = $(filter-out -mips16 -minterlink-mips16,$(TARGET_CFLAGS)) TARGET_CFLAGS += -mips16 -minterlink-mips16 + TARGET_CXXFLAGS += -mips16 -minterlink-mips16 endif endif -ifeq ($(strip $(PKG_IREMAP)),1) - IREMAP_CFLAGS = $(call iremap,$(PKG_BUILD_DIR),$(notdir $(PKG_BUILD_DIR))) - TARGET_CFLAGS += $(IREMAP_CFLAGS) +ifeq ($(call pkg_build_flag,gc-sections,$(if $(CONFIG_USE_GC_SECTIONS),1,0)),1) + TARGET_CFLAGS+= -ffunction-sections -fdata-sections + TARGET_CXXFLAGS+= -ffunction-sections -fdata-sections + TARGET_LDFLAGS+= -Wl,--gc-sections +endif +ifeq ($(call pkg_build_flag,lto,$(if $(CONFIG_USE_LTO),1,0)),1) + TARGET_CFLAGS+= -flto=auto -fno-fat-lto-objects + TARGET_CXXFLAGS+= -flto=auto -fno-fat-lto-objects + TARGET_LDFLAGS+= -flto=auto -fuse-linker-plugin endif include $(INCLUDE_DIR)/hardening.mk @@ -173,6 +194,7 @@ define Build/Exports/Default $(1) : export CONFIG_SITE:=$$(CONFIG_SITE) $(1) : export PKG_CONFIG_PATH:=$$(PKG_CONFIG_PATH) $(1) : export PKG_CONFIG_LIBDIR:=$$(PKG_CONFIG_PATH) + $(1) : export GIT_CEILING_DIRECTORIES:=$$(BUILD_DIR) endef Build/Exports=$(Build/Exports/Default) diff --git a/include/prereq-build.mk b/include/prereq-build.mk index 79b597fb17..7405bac446 100644 --- a/include/prereq-build.mk +++ b/include/prereq-build.mk @@ -8,6 +8,13 @@ include $(INCLUDE_DIR)/prereq.mk SHELL:=sh PKG_NAME:=Build dependency +$(eval $(call TestHostCommand,true, \ + Please install GNU 'coreutils', \ + $(TRUE))) + +$(eval $(call TestHostCommand,false, \ + Please install GNU 'coreutils', \ + $(FALSE); [ $$$$$$$$? = 1 ] && $(TRUE))) # Required for the toolchain $(eval $(call TestHostCommand,working-make, \ @@ -49,10 +56,16 @@ $(eval $(call TestHostCommand,working-g++, \ g++ -x c++ -o $(TMP_DIR)/a.out - -lstdc++ && \ $(TMP_DIR)/a.out)) -$(eval $(call TestHostCommand,ncurses, \ +$(eval $(call RequireCHeader,ncurses.h, \ Please install ncurses. (Missing libncurses.so or ncurses.h), \ - echo 'int main(int argc, char **argv) { initscr(); return 0; }' | \ - gcc -include ncurses.h -x c -o $(TMP_DIR)/a.out - -lncurses)) + initscr(), -lncurses)) + +$(eval $(call SetupHostCommand,git,Please install Git (git-core) >= 1.7.12.2, \ + git --exec-path | xargs -I % -- grep -q -- --recursive %/git-submodule, \ + git submodule --help | grep -- --recursive)) + +$(eval $(call SetupHostCommand,rsync,Please install 'rsync', \ + rsync --version &1 | grep GNU, \ gnutar --version 2>&1 | grep GNU, \ @@ -142,6 +167,9 @@ $(eval $(call SetupHostCommand,stat,Cannot find a file stat utility, \ gstat -c%s $(TOPDIR)/Makefile, \ stat -c%s $(TOPDIR)/Makefile)) +$(eval $(call SetupHostCommand,gzip,Please install 'gzip', \ + gzip --version &1 | grep zipfile, \ unzip)) @@ -159,8 +187,6 @@ $(eval $(call SetupHostCommand,install,Please install GNU 'install', \ $(eval $(call SetupHostCommand,perl,Please install Perl 5.x, \ perl --version | grep "perl.*v5")) -$(eval $(call CleanupPython2)) - $(eval $(call SetupHostCommand,python,Please install Python >= 3.6, \ python3.11 -V 2>&1 | grep 'Python 3', \ python3.10 -V 2>&1 | grep 'Python 3', \ @@ -181,27 +207,38 @@ $(eval $(call SetupHostCommand,python3,Please install Python >= 3.6, \ $(eval $(call TestHostCommand,python3-distutils, \ Please install the Python3 distutils module, \ - $(STAGING_DIR_HOST)/bin/python3 -c 'import distutils')) + $(STAGING_DIR_HOST)/bin/python3 -c 'from distutils import util')) -$(eval $(call TestHostCommand,python3-jsmin, \ - Please install the jsmin Python module, \ - python3 -c "import jsmin" 2>&1 )) +$(eval $(call TestHostCommand,python3-stdlib, \ + Please install the Python3 stdlib module, \ + $(STAGING_DIR_HOST)/bin/python3 -c 'import ntpath')) -$(eval $(call SetupHostCommand,git,Please install Git (git-core) >= 1.7.12.2, \ - git --exec-path | xargs -I % -- grep -q -- --recursive %/git-submodule, \ - git submodule --help | grep -- --recursive)) +$(eval $(call TestHostCommand,python3-jsmin, \ + Please install the jsmin Python module, \ + python3 -c "import jsmin" 2>&1 )) $(eval $(call SetupHostCommand,file,Please install the 'file' package, \ file --version 2>&1 | grep file)) -$(eval $(call SetupHostCommand,rsync,Please install 'rsync', \ - rsync --version /dev/null 2>/dev/null; then \ + if $(NO_TRACE_MAKE) -f $(firstword $(MAKEFILE_LIST)) check-$(1) PATH="$(ORIG_PATH)" >/dev/null 2>/dev/null; then \ echo 'ok.'; \ + elif $(NO_TRACE_MAKE) -f $(firstword $(MAKEFILE_LIST)) check-$(1) PATH="$(ORIG_PATH)" >/dev/null 2>/dev/null; then \ + echo 'updated.'; \ else \ echo 'failed.'; \ echo "$(PKG_NAME): $(strip $(2))" >> $(TMP_DIR)/.prereq-error; \ @@ -63,16 +65,16 @@ define RequireHeader $$(eval $$(call Require,$(1),$(2))) endef -define CleanupPython2 - define Require/python2-cleanup - if [ -f "$(STAGING_DIR_HOST)/bin/python" ] && \ - $(STAGING_DIR_HOST)/bin/python -V 2>&1 | \ - grep -q 'Python 2'; then \ - rm $(STAGING_DIR_HOST)/bin/python; \ - fi +# 1: header to test +# 2: failure message +# 3: optional compile time test +# 4: optional link library test (example -lncurses) +define RequireCHeader + define Require/$(1) + echo 'int main(int argc, char **argv) { $(3); return 0; }' | gcc -include $(1) -x c -o $(TMP_DIR)/a.out - $(4) endef - $$(eval $$(call Require,python2-cleanup)) + $$(eval $$(call Require,$(1),$(2))) endef define QuoteHostCommand @@ -95,17 +97,22 @@ endef # 3+: candidates define SetupHostCommand define Require/$(1) - [ -f "$(STAGING_DIR_HOST)/bin/$(strip $(1))" ] && exit 0; \ + mkdir -p "$(STAGING_DIR_HOST)/bin"; \ for cmd in $(call QuoteHostCommand,$(3)) $(call QuoteHostCommand,$(4)) \ $(call QuoteHostCommand,$(5)) $(call QuoteHostCommand,$(6)) \ $(call QuoteHostCommand,$(7)) $(call QuoteHostCommand,$(8)) \ $(call QuoteHostCommand,$(9)) $(call QuoteHostCommand,$(10)) \ $(call QuoteHostCommand,$(11)) $(call QuoteHostCommand,$(12)); do \ if [ -n "$$$$$$$$cmd" ]; then \ - bin="$$$$$$$$(PATH="$(subst $(space),:,$(filter-out $(STAGING_DIR_HOST)/%,$(subst :,$(space),$(PATH))))" \ - command -v "$$$$$$$${cmd%% *}")"; \ + bin="$$$$$$$$(command -v "$$$$$$$${cmd%% *}")"; \ if [ -x "$$$$$$$$bin" ] && eval "$$$$$$$$cmd" >/dev/null 2>/dev/null; then \ - mkdir -p "$(STAGING_DIR_HOST)/bin"; \ + case "$$$$$$$$(ls -dl -- $(STAGING_DIR_HOST)/bin/$(strip $(1)))" in \ + "-"* | \ + *" -> $$$$$$$$bin"* | \ + *" -> "[!/]*) \ + [ -x "$(STAGING_DIR_HOST)/bin/$(strip $(1))" ] && exit 0 \ + ;; \ + esac; \ ln -sf "$$$$$$$$bin" "$(STAGING_DIR_HOST)/bin/$(strip $(1))"; \ exit 0; \ fi; \ diff --git a/include/scan.mk b/include/scan.mk index 5032afa818..153c108359 100644 --- a/include/scan.mk +++ b/include/scan.mk @@ -11,7 +11,8 @@ TARGET_STAMP:=$(TMP_DIR)/info/.files-$(SCAN_TARGET).stamp FILELIST:=$(TMP_DIR)/info/.files-$(SCAN_TARGET)-$(SCAN_COOKIE) OVERRIDELIST:=$(TMP_DIR)/info/.overrides-$(SCAN_TARGET)-$(SCAN_COOKIE) -export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH) +export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH)) +export PATH:=$(STAGING_DIR_HOST)/bin:$(PATH) define feedname $(if $(patsubst feeds/%,,$(1)),,$(word 2,$(subst /, ,$(1)))) @@ -49,7 +50,8 @@ define PackageDir $$(call progress,Collecting $(SCAN_NAME) info: $(SCAN_DIR)/$(2)) \ echo Source-Makefile: $(SCAN_DIR)/$(2)/Makefile; \ $(if $(3),echo Override: $(3),true); \ - $(NO_TRACE_MAKE) --no-print-dir -r DUMP=1 FEED="$(call feedname,$(2))" -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) 2>/dev/null || { \ + $(if $(findstring c,$(LIBRECMC_VERBOSE)),$(MAKE),$(NO_TRACE_MAKE) --no-print-dir) -r DUMP=1 FEED="$(call feedname,$(2))" -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) \ + $(if $(findstring c,$(LIBRECMC_VERBOSE)),,2>/dev/null) || { \ mkdir -p "$(TOPDIR)/logs/$(SCAN_DIR)/$(2)"; \ $(NO_TRACE_MAKE) --no-print-dir -r DUMP=1 FEED="$(call feedname,$(2))" -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) > $(TOPDIR)/logs/$(SCAN_DIR)/$(2)/dump.txt 2>&1; \ $$(call progress,ERROR: please fix $(SCAN_DIR)/$(2)/Makefile - see logs/$(SCAN_DIR)/$(2)/dump.txt for details\n) \ diff --git a/include/site/riscv64 b/include/site/riscv64 new file mode 100644 index 0000000000..c5aa9c5543 --- /dev/null +++ b/include/site/riscv64 @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=yes} +ac_cv_c_bigendian=${ac_cv_c_bigendian=no} + +ac_cv_sizeof___int64=8 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=8 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=8 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=8 +ac_cv_sizeof_ssize_t=8 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=8 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=8 diff --git a/include/target.mk b/include/target.mk index e352e3e449..04fc92fe52 100644 --- a/include/target.mk +++ b/include/target.mk @@ -27,7 +27,11 @@ DEFAULT_PACKAGES:=\ urandom-seed \ urngd +ifneq ($(CONFIG_SELINUX),) +DEFAULT_PACKAGES+=busybox-selinux procd-selinux +else DEFAULT_PACKAGES+=busybox procd +endif # include ujail on systems with enough storage ifeq ($(CONFIG_SMALL_FLASH),) @@ -231,6 +235,7 @@ ifeq ($(DUMP),1) ifeq ($(ARCH),powerpc) CPU_CFLAGS_603e:=-mcpu=603e CPU_CFLAGS_8540:=-mcpu=8540 + CPU_CFLAGS_8548:=-mcpu=8548 CPU_CFLAGS_405:=-mcpu=405 CPU_CFLAGS_440:=-mcpu=440 CPU_CFLAGS_464fp:=-mcpu=464fp @@ -255,6 +260,10 @@ ifeq ($(DUMP),1) CPU_CFLAGS_arc700 = -mcpu=arc700 CPU_CFLAGS_archs = -mcpu=archs endif + ifeq ($(ARCH),riscv64) + CPU_TYPE ?= riscv64 + CPU_CFLAGS_riscv64:=-mabi=lp64d -march=rv64imafdc + endif ifneq ($(CPU_TYPE),) ifndef CPU_CFLAGS_$(CPU_TYPE) $(warning CPU_TYPE "$(CPU_TYPE)" doesn't correspond to a known type) diff --git a/include/toolchain-build.mk b/include/toolchain-build.mk index b7a253b71b..87ba8313df 100644 --- a/include/toolchain-build.mk +++ b/include/toolchain-build.mk @@ -18,6 +18,6 @@ define FixupLibdir mkdir -p $(1)/lib; \ mv $(1)/lib64/* $(1)/lib/; \ rm -rf $(1)/lib64; \ + ln -sf lib $(1)/lib64; \ fi - ln -sf lib $(1)/lib64 endef diff --git a/include/toplevel.mk b/include/toplevel.mk index e5396a999f..9ed79fd8ca 100644 --- a/include/toplevel.mk +++ b/include/toplevel.mk @@ -50,12 +50,14 @@ space:= $(empty) $(empty) path:=$(subst :,$(space),$(PATH)) path:=$(filter-out .%,$(path)) path:=$(subst $(space),:,$(path)) +export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH)) export PATH:=$(path) +export STAGING_DIR_HOST:=$(if $(STAGING_DIR),$(abspath $(STAGING_DIR)/../host),$(TOPDIR)/staging_dir/host) unexport TAR_OPTIONS ifeq ($(FORCE),) - .config scripts/config/conf scripts/config/mconf: staging_dir/host/.prereq-build + .config scripts/config/conf scripts/config/mconf: $(STAGING_DIR_HOST)/.prereq-build endif SCAN_COOKIE?=$(shell echo $$$$) @@ -65,7 +67,7 @@ SUBMAKE:=umask 022; $(SUBMAKE) ULIMIT_FIX=_limit=`ulimit -n`; [ "$$_limit" = "unlimited" -o "$$_limit" -ge 1024 ] || ulimit -n 1024; -prepare-mk: staging_dir/host/.prereq-build FORCE ; +prepare-mk: $(STAGING_DIR_HOST)/.prereq-build FORCE ; ifdef SDK IGNORE_PACKAGES = linux @@ -74,7 +76,7 @@ endif _ignore = $(foreach p,$(IGNORE_PACKAGES),--ignore $(p)) prepare-tmpinfo: FORCE - @+$(MAKE) -r -s staging_dir/host/.prereq-build $(PREP_MK) + @+$(MAKE) -r -s $(STAGING_DIR_HOST)/.prereq-build $(PREP_MK) mkdir -p tmp/info $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="packageinfo" SCAN_DIR="package" SCAN_NAME="package" SCAN_DEPTH=5 SCAN_EXTRA="" $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="targetinfo" SCAN_DIR="target/linux" SCAN_NAME="target" SCAN_DEPTH=3 SCAN_EXTRA="" SCAN_MAKEOPTS="TARGET_BUILD=1" @@ -151,7 +153,7 @@ xconfig: scripts/config/qconf prepare-tmpinfo FORCE prepare_kernel_conf: .config toolchain/install FORCE -ifeq ($(wildcard staging_dir/host/bin/quilt),) +ifeq ($(wildcard $(STAGING_DIR_HOST)/bin/quilt),) prepare_kernel_conf: @+$(SUBMAKE) -r tools/quilt/compile else @@ -175,7 +177,7 @@ kernel_nconfig: prepare_kernel_conf kernel_xconfig: prepare_kernel_conf $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux xconfig -staging_dir/host/.prereq-build: include/prereq-build.mk +$(STAGING_DIR_HOST)/.prereq-build: include/prereq-build.mk mkdir -p tmp @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq 2>/dev/null || { \ echo "Prerequisite check failed. Use FORCE=1 to override."; \ @@ -198,7 +200,7 @@ else DOWNLOAD_DIRS = package/download endif -download: .config FORCE $(if $(wildcard $(TOPDIR)/staging_dir/host/bin/flock),,tools/flock/compile) +download: .config FORCE $(if $(wildcard $(STAGING_DIR_HOST)/bin/flock),,tools/flock/compile) @+$(foreach dir,$(DOWNLOAD_DIRS),$(SUBMAKE) $(dir);) clean dirclean: .config @@ -262,7 +264,7 @@ distclean: @$(_SINGLE)$(SUBMAKE) -C scripts/config clean ifeq ($(findstring v,$(DEBUG)),) - .SILENT: symlinkclean clean dirclean distclean config-clean download help tmpinfo-clean .config scripts/config/mconf scripts/config/conf menuconfig staging_dir/host/.prereq-build tmp/.prereq-package prepare-tmpinfo + .SILENT: symlinkclean clean dirclean distclean config-clean download help tmpinfo-clean .config scripts/config/mconf scripts/config/conf menuconfig $(STAGING_DIR_HOST)/.prereq-build tmp/.prereq-package prepare-tmpinfo endif .PHONY: help FORCE .NOTPARALLEL: diff --git a/include/trusted-firmware-a.mk b/include/trusted-firmware-a.mk index 34fb71c56f..649cef08d1 100644 --- a/include/trusted-firmware-a.mk +++ b/include/trusted-firmware-a.mk @@ -1,8 +1,8 @@ PKG_NAME ?= trusted-firmware-a -PKG_CPE_ID ?= cpe:/a:arm:arm_trusted_firmware +PKG_CPE_ID ?= cpe:/a:arm:trusted_firmware-a ifndef PKG_SOURCE_PROTO -PKG_SOURCE = trusted-firmware-a-$(PKG_VERSION).tar.gz +PKG_SOURCE = trusted-firmware-a-$(PKG_VERSION)-libre.tar.gz PKG_SOURCE_URL:=https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/snapshot endif @@ -72,12 +72,16 @@ define Build/Configure/Trusted-Firmware-A $(INSTALL_DIR) $(STAGING_DIR)/usr/include endef +DTC=$(wildcard $(LINUX_DIR)/scripts/dtc/dtc) + define Build/Compile/Trusted-Firmware-A +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \ CROSS_COMPILE=$(TARGET_CROSS) \ OPENSSL_DIR=$(STAGING_DIR_HOST) \ + $(if $(DTC),DTC="$(DTC)") \ PLAT=$(PLAT) \ BUILD_STRING="libreCMC v$(PKG_VERSION)-$(PKG_RELEASE) ($(VARIANT))" \ + $(if $(CONFIG_BINUTILS_VERSION_2_37)$(CONFIG_BINUTILS_VERSION_2_38),,LDFLAGS="-no-warn-rwx-segments") \ $(TFA_MAKE_FLAGS) endef diff --git a/include/u-boot.mk b/include/u-boot.mk index 58370c4cb8..8c94505e0e 100644 --- a/include/u-boot.mk +++ b/include/u-boot.mk @@ -83,6 +83,9 @@ endef define Build/Configure/U-Boot +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) $(UBOOT_CONFIGURE_VARS) $(UBOOT_CONFIG)_config + $(if $(strip $(UBOOT_CUSTOMIZE_CONFIG)), + $(PKG_BUILD_DIR)/scripts/config --file $(PKG_BUILD_DIR)/.config $(UBOOT_CUSTOMIZE_CONFIG) + +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) $(UBOOT_CONFIGURE_VARS) oldconfig) endef DTC=$(wildcard $(LINUX_DIR)/scripts/dtc/dtc) diff --git a/include/unpack.mk b/include/unpack.mk index ebece69978..5959d55f4b 100644 --- a/include/unpack.mk +++ b/include/unpack.mk @@ -18,7 +18,7 @@ ifeq ($(strip $(UNPACK_CMD)),) ifeq ($(filter gz tgz,$(EXT)),$(EXT)) EXT:=$(call ext,$(PKG_SOURCE:.$(EXT)=)) - DECOMPRESS_CMD:=gzip -dc $(DL_DIR)/$(PKG_SOURCE) | + DECOMPRESS_CMD:=$(STAGING_DIR_HOST)/bin/libdeflate-gzip -dc $(DL_DIR)/$(PKG_SOURCE) | endif ifeq ($(filter bzip2 bz2 bz tbz2 tbz,$(EXT)),$(EXT)) EXT:=$(call ext,$(PKG_SOURCE:.$(EXT)=)) @@ -56,7 +56,7 @@ ifeq ($(strip $(UNPACK_CMD)),) endif # replace zcat with $(ZCAT), because some system don't support it properly ifeq ($(PKG_CAT),zcat) - UNPACK_CMD=gzip -dc $(DL_DIR)/$(PKG_SOURCE) | $(TAR_CMD) + UNPACK_CMD=$(STAGING_DIR_HOST)/bin/libdeflate-gzip -dc $(DL_DIR)/$(PKG_SOURCE) | $(TAR_CMD) endif endif endif diff --git a/package/Makefile b/package/Makefile index 4b8df7f484..8e72d4ec72 100644 --- a/package/Makefile +++ b/package/Makefile @@ -106,6 +106,14 @@ ifdef CONFIG_SIGNED_PACKAGES $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY); \ ); done endif +ifdef CONFIG_JSON_CYCLONEDX_SBOM + @echo Creating CycloneDX package SBOMs... + @for d in $(PACKAGE_SUBDIRS); do ( \ + [ -d $$d ] && \ + cd $$d || continue; \ + $(SCRIPT_DIR)/package-metadata.pl pkgcyclonedxsbom Packages.manifest > Packages.bom.cdx.json || true; \ + ); done +endif $(curdir)/flags-install:= -j1 diff --git a/package/base-files/Makefile b/package/base-files/Makefile index 9525f367ff..b052ff8963 100644 --- a/package/base-files/Makefile +++ b/package/base-files/Makefile @@ -39,7 +39,7 @@ endif define Package/base-files SECTION:=base CATEGORY:=Base system - DEPENDS:=+netifd +libc +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:openwrt-keyring +NAND_SUPPORT:ubi-utils +fstools +fwtool + DEPENDS:=+netifd +libc +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:librecmc-keyring +NAND_SUPPORT:ubi-utils +fstools +fwtool TITLE:=Base filesystem for libreCMC URL:=http://openwrt.org/ VERSION:=$(PKG_RELEASE)-$(REVISION) @@ -89,6 +89,19 @@ define ImageConfigOptions echo 'pi_preinit_net_messages="$(CONFIG_TARGET_PREINIT_SHOW_NETMSG)"' >>$(1)/lib/preinit/00_preinit.conf echo 'pi_preinit_no_failsafe_netmsg="$(CONFIG_TARGET_PREINIT_SUPPRESS_FAILSAFE_NETMSG)"' >>$(1)/lib/preinit/00_preinit.conf echo 'pi_preinit_no_failsafe="$(CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE)"' >>$(1)/lib/preinit/00_preinit.conf +ifeq ($(CONFIG_TARGET_DEFAULT_LAN_IP_FROM_PREINIT),y) + mkdir -p $(1)/etc/board.d + echo '. /lib/functions/uci-defaults.sh' >$(1)/etc/board.d/99-lan-ip + echo 'logger -t 99-lan-ip "setting custom default LAN IP"' >>$(1)/etc/board.d/99-lan-ip + echo 'board_config_update' >>$(1)/etc/board.d/99-lan-ip + echo 'json_select network' >>$(1)/etc/board.d/99-lan-ip + echo 'json_select lan' >>$(1)/etc/board.d/99-lan-ip + echo 'json_add_string ipaddr $(if $(CONFIG_TARGET_PREINIT_IP),$(CONFIG_TARGET_PREINIT_IP),"192.168.10.1")' >>$(1)/etc/board.d/99-lan-ip + echo 'json_add_string netmask $(if $(CONFIG_TARGET_PREINIT_NETMASK),$(CONFIG_TARGET_PREINIT_NETMASK),"255.255.255.0")' >>$(1)/etc/board.d/99-lan-ip + echo 'json_select ..' >>$(1)/etc/board.d/99-lan-ip + echo 'json_select ..' >>$(1)/etc/board.d/99-lan-ip + echo 'board_config_flush' >>$(1)/etc/board.d/99-lan-ip +endif endef define Build/Prepare diff --git a/package/base-files/files/bin/config_generate b/package/base-files/files/bin/config_generate index 3bd3e7affc..a64be59242 100755 --- a/package/base-files/files/bin/config_generate +++ b/package/base-files/files/bin/config_generate @@ -207,6 +207,15 @@ generate_network() { EOF } ;; + + ncm|\ + qmi|\ + mbim) + uci -q batch <<-EOF + set network.$1.proto='${protocol}' + set network.$1.pdptype='ipv4' + EOF + ;; esac } diff --git a/package/base-files/files/bin/ipcalc.sh b/package/base-files/files/bin/ipcalc.sh index 5d5eac3ea8..6e72617e1b 100755 --- a/package/base-files/files/bin/ipcalc.sh +++ b/package/base-files/files/bin/ipcalc.sh @@ -1,6 +1,5 @@ -#!/bin/sh +#!/usr/bin/awk -f -awk -f - $* < "/dev/stderr" + exit(1) + } - if (ARGC > 3) { - print "START="int2ip(start) - print "END="int2ip(end) + if (ipaddr > start && ipaddr < end) { + print "warning: ipaddr inside range - this might not be supported in future releases of Openwrt" > "/dev/stderr" } + + print "START="int2ip(start) + print "END="int2ip(end) } -EOF diff --git a/package/base-files/files/etc/init.d/led b/package/base-files/files/etc/init.d/led index 51cb8b5178..08a1e6df3b 100755 --- a/package/base-files/files/etc/init.d/led +++ b/package/base-files/files/etc/init.d/led @@ -29,7 +29,7 @@ load_led() { config_get delay $1 delay "150" config_get message $1 message "" config_get gpio $1 gpio "0" - config_get inverted $1 inverted "0" + config_get_bool inverted $1 inverted "0" # execute application led trigger [ -f "/usr/libexec/led-trigger/${trigger}" ] && { @@ -69,6 +69,10 @@ load_led() { return 1 } case "$trigger" in + "heartbeat") + echo "${inverted}" > "/sys/class/leds/${sysfs}/invert" + ;; + "netdev") [ -n "$dev" ] && { echo $dev > /sys/class/leds/${sysfs}/device_name diff --git a/package/base-files/files/etc/init.d/sysfixtime b/package/base-files/files/etc/init.d/sysfixtime index aab5b153d0..93f792266a 100755 --- a/package/base-files/files/etc/init.d/sysfixtime +++ b/package/base-files/files/etc/init.d/sysfixtime @@ -8,23 +8,33 @@ RTC_DEV=/dev/rtc0 HWCLOCK=/sbin/hwclock boot() { - start && exit 0 - - local maxtime="$(maxtime)" + hwclock_load + local maxtime="$(find_max_time)" local curtime="$(date +%s)" - [ $curtime -lt $maxtime ] && date -s @$maxtime + if [ $curtime -lt $maxtime ]; then + date -s @$maxtime + hwclock_save + fi } start() { - [ -e "$RTC_DEV" ] && [ -e "$HWCLOCK" ] && $HWCLOCK -s -u -f $RTC_DEV + hwclock_load } stop() { + hwclock_save +} + +hwclock_load() { + [ -e "$RTC_DEV" ] && [ -e "$HWCLOCK" ] && $HWCLOCK -s -u -f $RTC_DEV +} + +hwclock_save(){ [ -e "$RTC_DEV" ] && [ -e "$HWCLOCK" ] && $HWCLOCK -w -u -f $RTC_DEV && \ logger -t sysfixtime "saved '$(date)' to $RTC_DEV" } -maxtime() { +find_max_time() { local file newest for file in $( find /etc -type f ) ; do diff --git a/package/base-files/files/etc/os-release b/package/base-files/files/etc/os-release deleted file mode 120000 index c4c75b419c..0000000000 --- a/package/base-files/files/etc/os-release +++ /dev/null @@ -1 +0,0 @@ -../usr/lib/os-release \ No newline at end of file diff --git a/package/base-files/files/etc/sysctl.d/10-default.conf b/package/base-files/files/etc/sysctl.d/10-default.conf index bc8c579695..ee7df2bfa6 100644 --- a/package/base-files/files/etc/sysctl.d/10-default.conf +++ b/package/base-files/files/etc/sysctl.d/10-default.conf @@ -9,6 +9,7 @@ fs.protected_hardlinks=1 fs.protected_symlinks=1 net.core.bpf_jit_enable=1 +net.core.bpf_jit_kallsyms=1 net.ipv4.conf.default.arp_ignore=1 net.ipv4.conf.all.arp_ignore=1 diff --git a/package/base-files/files/lib/functions/network.sh b/package/base-files/files/lib/functions/network.sh index 055f18c11e..4851a5817a 100644 --- a/package/base-files/files/lib/functions/network.sh +++ b/package/base-files/files/lib/functions/network.sh @@ -90,6 +90,13 @@ network_get_prefix6() { __network_ifstatus "$1" "$2" "['ipv6-prefix'][0]['address','mask']" "/" } +# determine first IPv6 prefix assignment of given logical interface +# 1: destination variable +# 2: interface +network_get_prefix_assignment6() { + __network_ifstatus "$1" "$2" "['ipv6-prefix-assignment'][0]['address','mask']" "/" +} + # determine all IPv4 addresses of given logical interface # 1: destination variable # 2: interface @@ -187,6 +194,13 @@ network_get_prefixes6() { __network_ifstatus "$1" "$2" "['ipv6-prefix'][*]['address','mask']" "/ " } +# determine all IPv6 prefix assignments of given logical interface +# 1: destination variable +# 2: interface +network_get_prefix_assignments6() { + __network_ifstatus "$1" "$2" "['ipv6-prefix-assignment'][*]['address','mask']" "/ " +} + # determine IPv4 gateway of given logical interface # 1: destination variable # 2: interface diff --git a/package/base-files/files/lib/functions/system.sh b/package/base-files/files/lib/functions/system.sh index c17354d945..d06354b01f 100644 --- a/package/base-files/files/lib/functions/system.sh +++ b/package/base-files/files/lib/functions/system.sh @@ -110,11 +110,41 @@ mtd_get_mac_encrypted_arcadyan() { [ -n "$mac_dirty" ] && macaddr_canonicalize "$mac_dirty" } +mtd_get_mac_encrypted_deco() { + local mtdname="$1" + + if ! [ -e "$mtdname" ]; then + echo "mtd_get_mac_encrypted_deco: file $mtdname not found!" >&2 + return + fi + + tplink_key="3336303032384339" + + key=$(dd if=$mtdname bs=1 skip=16 count=8 2>/dev/null | \ + uencrypt -n -d -k $tplink_key -c des-ecb | hexdump -v -n 8 -e '1/1 "%02x"') + + macaddr=$(dd if=$mtdname bs=1 skip=32 count=8 2>/dev/null | \ + uencrypt -n -d -k $key -c des-ecb | hexdump -v -n 6 -e '5/1 "%02x:" 1/1 "%02x"') + + echo $macaddr +} + +mtd_get_mac_uci_config_ubi() { + local volumename="$1" + + . /lib/upgrade/nand.sh + + local ubidev=$(nand_attach_ubi $CI_UBIPART) + local part=$(nand_find_volume $ubidev $volumename) + + cat "/dev/$part" | sed -n 's/^\s*option macaddr\s*'"'"'\?\([0-9A-F:]\+\)'"'"'\?/\1/Ip' +} + mtd_get_mac_text() { - local mtdname=$1 - local offset=$(($2)) + local mtdname="$1" + local offset=$((${2:-0})) + local length="${3:-17}" local part - local mac_dirty part=$(find_mtd_part "$mtdname") if [ -z "$part" ]; then @@ -122,15 +152,9 @@ mtd_get_mac_text() { return fi - if [ -z "$offset" ]; then - echo "mtd_get_mac_text: offset missing!" >&2 - return - fi - - mac_dirty=$(dd if="$part" bs=1 skip="$offset" count=17 2>/dev/null) + [ $((offset + length)) -le $(mtd_get_part_size "$mtdname") ] || return - # "canonicalize" mac - [ -n "$mac_dirty" ] && macaddr_canonicalize "$mac_dirty" + macaddr_canonicalize $(dd bs=1 if="$part" skip="$offset" count="$length" 2>/dev/null) } mtd_get_mac_binary() { @@ -185,6 +209,14 @@ macaddr_add() { echo $oui:$nic } +macaddr_generate_from_mmc_cid() { + local mmc_dev=$1 + + local sd_hash=$(sha256sum /sys/class/block/$mmc_dev/device/cid) + local mac_base=$(macaddr_canonicalize "$(echo "${sd_hash}" | dd bs=1 count=12 2>/dev/null)") + echo "$(macaddr_unsetbit_mc "$(macaddr_setbit_la "${mac_base}")")" +} + macaddr_geteui() { local mac=$1 local sep=$2 @@ -264,3 +296,7 @@ macaddr_canonicalize() { printf "%02x:%02x:%02x:%02x:%02x:%02x" 0x${canon// / 0x} 2>/dev/null } + +dt_is_enabled() { + grep -q okay "/proc/device-tree/$1/status" +} diff --git a/package/base-files/files/lib/functions/uci-defaults.sh b/package/base-files/files/lib/functions/uci-defaults.sh index f96e645e73..6f395ec24b 100644 --- a/package/base-files/files/lib/functions/uci-defaults.sh +++ b/package/base-files/files/lib/functions/uci-defaults.sh @@ -96,7 +96,7 @@ ucidef_set_interfaces_lan_wan() { ucidef_set_bridge_device() { json_select_object bridge - json_add_string name "${1:switch0}" + json_add_string name "${1:-switch0}" json_select .. } @@ -107,13 +107,21 @@ ucidef_set_bridge_mac() { } ucidef_set_network_device_mac() { - json_select_object "network-device" + json_select_object "network_device" json_select_object "${1}" json_add_string macaddr "${2}" json_select .. json_select .. } +ucidef_set_network_device_path() { + json_select_object "network_device" + json_select_object "$1" + json_add_string path "$2" + json_select .. + json_select .. +} + _ucidef_add_switch_port() { # inherited: $num $device $need_tag $want_untag $role $index $prev_role # inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5 @@ -638,6 +646,21 @@ ucidef_set_ntpserver() { json_select .. } +ucidef_add_wlan() { + local path="$1"; shift + + ucidef_wlan_idx=${ucidef_wlan_idx:-0} + + json_select_object wlan + json_select_object "wl$ucidef_wlan_idx" + json_add_string path "$path" + json_add_fields "$@" + json_select .. + json_select .. + + ucidef_wlan_idx="$((ucidef_wlan_idx + 1))" +} + board_config_update() { json_init [ -f ${CFG} ] && json_load "$(cat ${CFG})" diff --git a/package/base-files/files/lib/preinit/10_indicate_preinit b/package/base-files/files/lib/preinit/10_indicate_preinit index 9e9dca95c8..8540e62ad6 100644 --- a/package/base-files/files/lib/preinit/10_indicate_preinit +++ b/package/base-files/files/lib/preinit/10_indicate_preinit @@ -63,6 +63,20 @@ preinit_config_switch() { json_select .. } +preinit_config_port() { + local original + + local netdev="$1" + local path="$2" + + [ -d "/sys/devices/$path/net" ] || return + original="$(ls "/sys/devices/$path/net" | head -1)" + + [ "$netdev" = "$original" ] && return + + ip link set "$original" name "$netdev" +} + preinit_config_board() { /bin/board_detect /tmp/board.json @@ -73,6 +87,33 @@ preinit_config_board() { json_init json_load "$(cat /tmp/board.json)" + # Find the current highest eth* + max_eth=$(grep -o '^ *eth[0-9]*:' /proc/net/dev | tr -dc '[0-9]\n' | sort -n | tail -1) + # Find and move netdevs using eth*s we are configuring + json_get_keys keys "network_device" + for netdev in $keys; do + json_select "network_device" + json_select "$netdev" + json_get_vars path path + if [ -n "$path" -a -h "/sys/class/net/$netdev" ]; then + ip link set "$netdev" down + ip link set "$netdev" name eth$((++max_eth)) + fi + json_select .. + json_select .. + done + + # Move interfaces by path to their netdev name + json_get_keys keys "network_device" + for netdev in $keys; do + json_select "network_device" + json_select "$netdev" + json_get_vars path path + [ -n "$path" ] && preinit_config_port "$netdev" "$path" + json_select .. + json_select .. + done + json_select network json_select "lan" json_get_vars device diff --git a/package/base-files/files/lib/preinit/30_failsafe_wait b/package/base-files/files/lib/preinit/30_failsafe_wait index f90de71d40..9ab2e8bd4d 100644 --- a/package/base-files/files/lib/preinit/30_failsafe_wait +++ b/package/base-files/files/lib/preinit/30_failsafe_wait @@ -40,35 +40,39 @@ fs_wait_for_key () { rm -f $keypress_wait } & - [ "$pi_preinit_no_failsafe" != "y" ] && echo "Press the [$1] key and hit [enter] $2" - echo "Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level" - # if we're on the console we wait for input - { - while [ -r $keypress_wait ]; do - timer="$(cat $keypress_sec)" + local consoles="$(sed -e 's/ /\n/g' /proc/cmdline | grep '^console=' | sed -e 's/^console=//' -e 's/,.*//')" + [ -n "$consoles" ] || consoles=console + for console in $consoles; do + [ -c "/dev/$console" ] || continue + [ "$pi_preinit_no_failsafe" != "y" ] && echo "Press the [$1] key and hit [enter] $2" > "/dev/$console" + echo "Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level" > "/dev/$console" + { + while [ -r $keypress_wait ]; do + timer="$(cat $keypress_sec)" - [ -n "$timer" ] || timer=1 - timer="${timer%%\ *}" - [ $timer -ge 1 ] || timer=1 - do_keypress="" - { - read -t "$timer" do_keypress - case "$do_keypress" in - $1) - echo "true" >$keypress_true - ;; - 1 | 2 | 3 | 4) - echo "$do_keypress" >/tmp/debug_level - ;; - *) - continue; - ;; - esac - lock -u $keypress_wait - rm -f $keypress_wait - } - done - } + [ -n "$timer" ] || timer=1 + timer="${timer%%\ *}" + [ $timer -ge 1 ] || timer=1 + do_keypress="" + { + read -t "$timer" do_keypress < "/dev/$console" + case "$do_keypress" in + $1) + echo "true" >$keypress_true + ;; + 1 | 2 | 3 | 4) + echo "$do_keypress" >/tmp/debug_level + ;; + *) + continue; + ;; + esac + lock -u $keypress_wait + rm -f $keypress_wait + } + done + } & + done lock -w $keypress_wait keypressed=1 diff --git a/package/base-files/files/lib/preinit/99_10_failsafe_login b/package/base-files/files/lib/preinit/99_10_failsafe_login index 1410c5f0db..6f4af3f28b 100644 --- a/package/base-files/files/lib/preinit/99_10_failsafe_login +++ b/package/base-files/files/lib/preinit/99_10_failsafe_login @@ -2,13 +2,14 @@ # Copyright (C) 2010 Vertical Communications failsafe_shell() { - local console="$(sed -e 's/ /\n/g' /proc/cmdline | grep '^console=' | head -1 | sed -e 's/^console=//' -e 's/,.*//')" - [ -n "$console" ] || console=console - [ -c "/dev/$console" ] || return 0 - while true; do - ash --login <"/dev/$console" >"/dev/$console" 2>"/dev/$console" - sleep 1 - done & + local consoles="$(sed -e 's/ /\n/g' /proc/cmdline | grep '^console=' | sed -e 's/^console=//' -e 's/,.*//')" + [ -n "$consoles" ] || consoles=console + for console in $consoles; do + [ -c "/dev/$console" ] && while true; do + ash --login <"/dev/$console" >"/dev/$console" 2>"/dev/$console" + sleep 1 + done & + done } boot_hook_add failsafe failsafe_shell diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh index 24ff77a8b3..af1182cb16 100644 --- a/package/base-files/files/lib/upgrade/common.sh +++ b/package/base-files/files/lib/upgrade/common.sh @@ -127,6 +127,33 @@ get_magic_fat32() { (get_image "$@" | dd bs=1 count=5 skip=82) 2>/dev/null } +identify_magic_long() { + local magic=$1 + case "$magic" in + "55424923") + echo "ubi" + ;; + "31181006") + echo "ubifs" + ;; + "68737173") + echo "squashfs" + ;; + "d00dfeed") + echo "fit" + ;; + "4349"*) + echo "combined" + ;; + "1f8b"*) + echo "gzip" + ;; + *) + echo "unknown $magic" + ;; + esac +} + part_magic_efi() { local magic=$(get_magic_gpt "$@") [ "$magic" = "EFI PART" ] @@ -155,9 +182,11 @@ export_bootdevice() { fi done ;; + PARTUUID=????????-????-????-????-??????????0?/PARTNROFF=1 | \ PARTUUID=????????-????-????-????-??????????02) uuid="${rootpart#PARTUUID=}" - uuid="${uuid%02}00" + uuid="${uuid%/PARTNROFF=1}" + uuid="${uuid%0?}00" for disk in $(find /dev -type b); do set -- $(dd if=$disk bs=1 skip=568 count=16 2>/dev/null | hexdump -v -e '8/1 "%02x "" "2/1 "%02x""-"6/1 "%02x"') if [ "$4$3$2$1-$6$5-$8$7-$9" = "$uuid" ]; then @@ -203,7 +232,7 @@ export_partdevice() { while read line; do export -n "$line" done < "$uevent" - if [ $BOOTDEV_MAJOR = $MAJOR -a $(($BOOTDEV_MINOR + $offset)) = $MINOR -a -b "/dev/$DEVNAME" ]; then + if [ "$BOOTDEV_MAJOR" = "$MAJOR" -a $(($BOOTDEV_MINOR + $offset)) = "$MINOR" -a -b "/dev/$DEVNAME" ]; then export "$var=$DEVNAME" return 0 fi diff --git a/package/base-files/files/lib/upgrade/emmc.sh b/package/base-files/files/lib/upgrade/emmc.sh index c3b02864aa..49cffe1c65 100644 --- a/package/base-files/files/lib/upgrade/emmc.sh +++ b/package/base-files/files/lib/upgrade/emmc.sh @@ -58,7 +58,7 @@ emmc_copy_config() { } emmc_do_upgrade() { - local file_type=$(identify $1) + local file_type=$(identify_magic_long "$(get_magic_long "$1")") case "$file_type" in "fit") emmc_upgrade_fit $1;; diff --git a/package/base-files/files/lib/upgrade/nand.sh b/package/base-files/files/lib/upgrade/nand.sh index 8720a78b4b..d910bf1791 100644 --- a/package/base-files/files/lib/upgrade/nand.sh +++ b/package/base-files/files/lib/upgrade/nand.sh @@ -7,6 +7,8 @@ CI_KERNPART="${CI_KERNPART:-kernel}" # 'ubi' partition on NAND contains UBI +# There are also CI_KERN_UBIPART and CI_ROOT_UBIPART if kernel +# and rootfs are on separated UBIs. CI_UBIPART="${CI_UBIPART:-ubi}" # 'rootfs' UBI volume on NAND contains the rootfs @@ -26,7 +28,7 @@ ubi_mknod() { nand_find_volume() { local ubidevdir ubivoldir - ubidevdir="/sys/devices/virtual/ubi/$1" + ubidevdir="/sys/class/ubi/" [ ! -d "$ubidevdir" ] && return 1 for ubivoldir in $ubidevdir/${1}_*; do [ ! -d "$ubivoldir" ] && continue @@ -39,13 +41,12 @@ nand_find_volume() { } nand_find_ubi() { - local ubidevdir ubidev mtdnum + local ubidevdir ubidev mtdnum cmtdnum mtdnum="$( find_mtd_index $1 )" [ ! "$mtdnum" ] && return 1 - for ubidevdir in /sys/devices/virtual/ubi/ubi*; do - [ ! -d "$ubidevdir" ] && continue + for ubidevdir in /sys/class/ubi/ubi*; do + [ ! -e "$ubidevdir/mtd_num" ] && continue cmtdnum="$( cat $ubidevdir/mtd_num )" - [ ! "$mtdnum" ] && continue if [ "$mtdnum" = "$cmtdnum" ]; then ubidev=$( basename $ubidevdir ) ubi_mknod "$ubidevdir" @@ -56,134 +57,175 @@ nand_find_ubi() { } nand_get_magic_long() { - dd if="$1" skip=$2 bs=4 count=1 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' + (${3}cat "$1" | dd bs=4 "skip=${2:-0}" count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2> /dev/null } get_magic_long_tar() { - ( tar xf $1 $2 -O | dd bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2> /dev/null + (tar xO${3}f "$1" "$2" | dd bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2> /dev/null } -identify_magic() { - local magic=$1 - case "$magic" in - "55424923") - echo "ubi" - ;; - "31181006") - echo "ubifs" - ;; - "68737173") - echo "squashfs" - ;; - "d00dfeed") - echo "fit" - ;; - "4349"*) - echo "combined" - ;; - *) - echo "unknown $magic" - ;; - esac -} - - identify() { - identify_magic $(nand_get_magic_long "$1" "${2:-0}") + identify_magic_long $(nand_get_magic_long "$@") } identify_tar() { - identify_magic $(get_magic_long_tar "$1" "$2") + identify_magic_long $(get_magic_long_tar "$@") +} + +identify_if_gzip() { + if [ "$(identify "$1")" = gzip ]; then echo -n z; fi } nand_restore_config() { - sync - local ubidev=$( nand_find_ubi $CI_UBIPART ) + local ubidev=$( nand_find_ubi "${CI_ROOT_UBIPART:-$CI_UBIPART}" ) local ubivol="$( nand_find_volume $ubidev rootfs_data )" - [ ! "$ubivol" ] && - ubivol="$( nand_find_volume $ubidev $CI_ROOTPART )" + if [ ! "$ubivol" ]; then + ubivol="$( nand_find_volume $ubidev "$CI_ROOTPART" )" + if [ ! "$ubivol" ]; then + echo "cannot find ubifs data volume" + return 1 + fi + fi mkdir /tmp/new_root if ! mount -t ubifs /dev/$ubivol /tmp/new_root; then - echo "mounting ubifs $ubivol failed" + echo "cannot mount ubifs volume $ubivol" rmdir /tmp/new_root return 1 fi - mv "$1" "/tmp/new_root/$BACKUP_FILE" - umount /tmp/new_root - sync + if mv "$1" "/tmp/new_root/$BACKUP_FILE"; then + if umount /tmp/new_root; then + echo "configuration saved" + rmdir /tmp/new_root + return 0 + fi + else + umount /tmp/new_root + fi + echo "could not save configuration to ubifs volume $ubivol" rmdir /tmp/new_root + return 1 } -nand_upgrade_prepare_ubi() { - local rootfs_length="$1" - local rootfs_type="$2" - local rootfs_data_max="$(fw_printenv -n rootfs_data_max 2>/dev/null)" - [ -n "$rootfs_data_max" ] && rootfs_data_max=$((rootfs_data_max)) +nand_remove_ubiblock() { + local ubivol="$1" - local kernel_length="$3" - local has_env="${4:-0}" + local ubiblk="ubiblock${ubivol:3}" + if [ -e "/dev/$ubiblk" ]; then + umount "/dev/$ubiblk" && echo "unmounted /dev/$ubiblk" || : + if ! ubiblock -r "/dev/$ubivol"; then + echo "cannot remove $ubiblk" + return 1 + fi + fi +} - [ -n "$rootfs_length" -o -n "$kernel_length" ] || return 1 +nand_attach_ubi() { + local ubipart="$1" + local has_env="${2:-0}" - local mtdnum="$( find_mtd_index "$CI_UBIPART" )" + local mtdnum="$( find_mtd_index "$ubipart" )" if [ ! "$mtdnum" ]; then - echo "cannot find ubi mtd partition $CI_UBIPART" + >&2 echo "cannot find ubi mtd partition $ubipart" return 1 fi - local ubidev="$( nand_find_ubi "$CI_UBIPART" )" + local ubidev="$( nand_find_ubi "$ubipart" )" if [ ! "$ubidev" ]; then - ubiattach -m "$mtdnum" - sync - ubidev="$( nand_find_ubi "$CI_UBIPART" )" - fi + >&2 ubiattach -m "$mtdnum" + ubidev="$( nand_find_ubi "$ubipart" )" - if [ ! "$ubidev" ]; then - ubiformat /dev/mtd$mtdnum -y - ubiattach -m "$mtdnum" - sync - ubidev="$( nand_find_ubi "$CI_UBIPART" )" - [ ! "$ubidev" ] && return 1 - [ "$has_env" -gt 0 ] && { - ubimkvol /dev/$ubidev -n 0 -N ubootenv -s 1MiB - ubimkvol /dev/$ubidev -n 1 -N ubootenv2 -s 1MiB - } + if [ ! "$ubidev" ]; then + >&2 ubiformat /dev/mtd$mtdnum -y + >&2 ubiattach -m "$mtdnum" + ubidev="$( nand_find_ubi "$ubipart" )" + + if [ ! "$ubidev" ]; then + >&2 echo "cannot attach ubi mtd partition $ubipart" + return 1 + fi + + if [ "$has_env" -gt 0 ]; then + >&2 ubimkvol /dev/$ubidev -n 0 -N ubootenv -s 1MiB + >&2 ubimkvol /dev/$ubidev -n 1 -N ubootenv2 -s 1MiB + fi + fi fi - local kern_ubivol="$( nand_find_volume $ubidev $CI_KERNPART )" - local root_ubivol="$( nand_find_volume $ubidev $CI_ROOTPART )" - local data_ubivol="$( nand_find_volume $ubidev rootfs_data )" + echo "$ubidev" + return 0 +} - local ubiblk ubiblkvol - for ubiblk in /dev/ubiblock${ubidev:3}_* ; do - [ -e "$ubiblk" ] || continue - case "$ubiblk" in - /dev/ubiblock*_*p*) - continue - ;; - esac - echo "removing ubiblock${ubiblk:13}" - ubiblkvol=ubi${ubiblk:13} - if ! ubiblock -r /dev/$ubiblkvol; then - echo "cannot remove $ubiblk" +nand_detach_ubi() { + local ubipart="$1" + + local mtdnum="$( find_mtd_index "$ubipart" )" + if [ ! "$mtdnum" ]; then + echo "cannot find ubi mtd partition $ubipart" + return 1 + fi + + local ubidev="$( nand_find_ubi "$ubipart" )" + if [ "$ubidev" ]; then + for ubivol in $(find /dev -name "${ubidev}_*" -maxdepth 1 | sort); do + ubivol="${ubivol:5}" + nand_remove_ubiblock "$ubivol" || : + umount "/dev/$ubivol" && echo "unmounted /dev/$ubivol" || : + done + if ! ubidetach -m "$mtdnum"; then + echo "cannot detach ubi mtd partition $ubipart" return 1 fi - done + fi +} + +nand_upgrade_prepare_ubi() { + local rootfs_length="$1" + local rootfs_type="$2" + local rootfs_data_max="$(fw_printenv -n rootfs_data_max 2> /dev/null)" + [ -n "$rootfs_data_max" ] && rootfs_data_max=$((rootfs_data_max)) + + local kernel_length="$3" + local has_env="${4:-0}" + local kern_ubidev + local root_ubidev + + [ -n "$rootfs_length" -o -n "$kernel_length" ] || return 1 + + if [ -n "$CI_KERN_UBIPART" -a -n "$CI_ROOT_UBIPART" ]; then + kern_ubidev="$( nand_attach_ubi "$CI_KERN_UBIPART" "$has_env" )" + [ -n "$kern_ubidev" ] || return 1 + root_ubidev="$( nand_attach_ubi "$CI_ROOT_UBIPART" )" + [ -n "$root_ubidev" ] || return 1 + else + kern_ubidev="$( nand_attach_ubi "$CI_UBIPART" "$has_env" )" + [ -n "$kern_ubidev" ] || return 1 + root_ubidev="$kern_ubidev" + fi + + local kern_ubivol="$( nand_find_volume $kern_ubidev "$CI_KERNPART" )" + local root_ubivol="$( nand_find_volume $root_ubidev "$CI_ROOTPART" )" + local data_ubivol="$( nand_find_volume $root_ubidev rootfs_data )" + [ "$root_ubivol" = "$kern_ubivol" ] && root_ubivol= + + # remove ubiblocks + [ "$kern_ubivol" ] && { nand_remove_ubiblock $kern_ubivol || return 1; } + [ "$root_ubivol" ] && { nand_remove_ubiblock $root_ubivol || return 1; } + [ "$data_ubivol" ] && { nand_remove_ubiblock $data_ubivol || return 1; } # kill volumes - [ "$kern_ubivol" ] && ubirmvol /dev/$ubidev -N $CI_KERNPART || : - [ "$root_ubivol" -a "$root_ubivol" != "$kern_ubivol" ] && ubirmvol /dev/$ubidev -N $CI_ROOTPART || : - [ "$data_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs_data || : + [ "$kern_ubivol" ] && ubirmvol /dev/$kern_ubidev -N "$CI_KERNPART" || : + [ "$root_ubivol" ] && ubirmvol /dev/$root_ubidev -N "$CI_ROOTPART" || : + [ "$data_ubivol" ] && ubirmvol /dev/$root_ubidev -N rootfs_data || : - # update kernel + # create kernel vol if [ -n "$kernel_length" ]; then - if ! ubimkvol /dev/$ubidev -N $CI_KERNPART -s $kernel_length; then + if ! ubimkvol /dev/$kern_ubidev -N "$CI_KERNPART" -s $kernel_length; then echo "cannot create kernel volume" return 1; fi fi - # update rootfs + # create rootfs vol if [ -n "$rootfs_length" ]; then local rootfs_size_param if [ "$rootfs_type" = "ubifs" ]; then @@ -191,155 +233,224 @@ nand_upgrade_prepare_ubi() { else rootfs_size_param="-s $rootfs_length" fi - if ! ubimkvol /dev/$ubidev -N $CI_ROOTPART $rootfs_size_param; then + if ! ubimkvol /dev/$root_ubidev -N "$CI_ROOTPART" $rootfs_size_param; then echo "cannot create rootfs volume" return 1; fi fi - # create rootfs_data for non-ubifs rootfs + # create rootfs_data vol for non-ubifs rootfs if [ "$rootfs_type" != "ubifs" ]; then local rootfs_data_size_param="-m" if [ -n "$rootfs_data_max" ]; then rootfs_data_size_param="-s $rootfs_data_max" fi - if ! ubimkvol /dev/$ubidev -N rootfs_data $rootfs_data_size_param; then - if ! ubimkvol /dev/$ubidev -N rootfs_data -m; then + if ! ubimkvol /dev/$root_ubidev -N rootfs_data $rootfs_data_size_param; then + if ! ubimkvol /dev/$root_ubidev -N rootfs_data -m; then echo "cannot initialize rootfs_data volume" return 1 fi fi fi - sync - return 0 -} - -nand_do_upgrade_success() { - local conf_tar="/tmp/sysupgrade.tgz" - sync - [ -f "$conf_tar" ] && nand_restore_config "$conf_tar" - echo "sysupgrade successful" - umount -a - reboot -f + return 0 } -# Flash the UBI image to MTD partition +# Write the UBI image to MTD ubi partition nand_upgrade_ubinized() { local ubi_file="$1" - local mtdnum="$(find_mtd_index "$CI_UBIPART")" + local gz="$2" - [ ! "$mtdnum" ] && { - CI_UBIPART="rootfs" - mtdnum="$(find_mtd_index "$CI_UBIPART")" - } + local ubi_length=$( (${gz}cat "$ubi_file" | wc -c) 2> /dev/null) - if [ ! "$mtdnum" ]; then - echo "cannot find mtd device $CI_UBIPART" - umount -a - reboot -f - fi + nand_detach_ubi "$CI_UBIPART" || return 1 - local mtddev="/dev/mtd${mtdnum}" - ubidetach -p "${mtddev}" || true - sync - ubiformat "${mtddev}" -y -f "${ubi_file}" - ubiattach -p "${mtddev}" - nand_do_upgrade_success + local mtdnum="$( find_mtd_index "$CI_UBIPART" )" + ${gz}cat "$ubi_file" | ubiformat "/dev/mtd$mtdnum" -S "$ubi_length" -y -f - && ubiattach -m "$mtdnum" } -# Write the UBIFS image to UBI volume +# Write the UBIFS image to UBI rootfs volume nand_upgrade_ubifs() { - local rootfs_length=$( (cat $1 | wc -c) 2> /dev/null) + local ubifs_file="$1" + local gz="$2" - nand_upgrade_prepare_ubi "$rootfs_length" "ubifs" "" "" + local ubifs_length=$( (${gz}cat "$ubifs_file" | wc -c) 2> /dev/null) - local ubidev="$( nand_find_ubi "$CI_UBIPART" )" - local root_ubivol="$(nand_find_volume $ubidev $CI_ROOTPART)" - ubiupdatevol /dev/$root_ubivol -s $rootfs_length $1 + nand_upgrade_prepare_ubi "$ubifs_length" "ubifs" "" "" || return 1 - nand_do_upgrade_success + local ubidev="$( nand_find_ubi "$CI_UBIPART" )" + local root_ubivol="$(nand_find_volume $ubidev "$CI_ROOTPART")" + ${gz}cat "$ubifs_file" | ubiupdatevol /dev/$root_ubivol -s "$ubifs_length" - } +# Write the FIT image to UBI kernel volume nand_upgrade_fit() { local fit_file="$1" - local fit_length="$(wc -c < "$fit_file")" + local gz="$2" + + local fit_length=$( (${gz}cat "$fit_file" | wc -c) 2> /dev/null) - nand_upgrade_prepare_ubi "" "" "$fit_length" "1" + nand_upgrade_prepare_ubi "" "" "$fit_length" "1" || return 1 local fit_ubidev="$(nand_find_ubi "$CI_UBIPART")" local fit_ubivol="$(nand_find_volume $fit_ubidev "$CI_KERNPART")" - ubiupdatevol /dev/$fit_ubivol -s $fit_length $fit_file - - nand_do_upgrade_success + ${gz}cat "$fit_file" | ubiupdatevol /dev/$fit_ubivol -s "$fit_length" - } +# Write images in the TAR file to MTD partitions and/or UBI volumes as required nand_upgrade_tar() { local tar_file="$1" - local kernel_mtd="$(find_mtd_index $CI_KERNPART)" + local gz="$2" + local jffs2_markers="${CI_JFFS2_CLEAN_MARKERS:-0}" + + # WARNING: This fails if tar contains more than one 'sysupgrade-*' directory. + local board_dir="$(tar t${gz}f "$tar_file" | grep -m 1 '^sysupgrade-.*/$')" + board_dir="${board_dir%/}" + + local kernel_mtd kernel_length + if [ "$CI_KERNPART" != "none" ]; then + kernel_mtd="$(find_mtd_index "$CI_KERNPART")" + kernel_length=$( (tar xO${gz}f "$tar_file" "$board_dir/kernel" | wc -c) 2> /dev/null) + [ "$kernel_length" = 0 ] && kernel_length= + fi + local rootfs_length=$( (tar xO${gz}f "$tar_file" "$board_dir/root" | wc -c) 2> /dev/null) + [ "$rootfs_length" = 0 ] && rootfs_length= + local rootfs_type + [ "$rootfs_length" ] && rootfs_type="$(identify_tar "$tar_file" "$board_dir/root" "$gz")" + + local ubi_kernel_length + if [ "$kernel_length" ]; then + if [ "$kernel_mtd" ]; then + # On some devices, the raw kernel and ubi partitions overlap. + # These devices brick if the kernel partition is erased. + # Hence only invalidate kernel for now. + dd if=/dev/zero bs=4096 count=1 2> /dev/null | \ + mtd write - "$CI_KERNPART" + else + ubi_kernel_length="$kernel_length" + fi + fi - local board_dir=$(tar tf "$tar_file" | grep -m 1 '^sysupgrade-.*/$') - board_dir=${board_dir%/} + local has_env=0 + nand_upgrade_prepare_ubi "$rootfs_length" "$rootfs_type" "$ubi_kernel_length" "$has_env" || return 1 - kernel_length=$( (tar xf "$tar_file" ${board_dir}/kernel -O | wc -c) 2> /dev/null) - local has_rootfs=0 - local rootfs_length - local rootfs_type + if [ "$rootfs_length" ]; then + local ubidev="$( nand_find_ubi "${CI_ROOT_UBIPART:-$CI_UBIPART}" )" + local root_ubivol="$( nand_find_volume $ubidev "$CI_ROOTPART" )" + tar xO${gz}f "$tar_file" "$board_dir/root" | \ + ubiupdatevol /dev/$root_ubivol -s "$rootfs_length" - + fi + if [ "$kernel_length" ]; then + if [ "$kernel_mtd" ]; then + if [ "$jffs2_markers" = 1 ]; then + flash_erase -j "/dev/mtd${kernel_mtd}" 0 0 + tar xO${gz}f "$tar_file" "$board_dir/kernel" | \ + nandwrite "/dev/mtd${kernel_mtd}" - + else + tar xO${gz}f "$tar_file" "$board_dir/kernel" | \ + mtd write - "$CI_KERNPART" + fi + else + local ubidev="$( nand_find_ubi "${CI_KERN_UBIPART:-$CI_UBIPART}" )" + local kern_ubivol="$( nand_find_volume $ubidev "$CI_KERNPART" )" + tar xO${gz}f "$tar_file" "$board_dir/kernel" | \ + ubiupdatevol /dev/$kern_ubivol -s "$kernel_length" - + fi + fi - tar tf "$tar_file" ${board_dir}/root 1>/dev/null 2>/dev/null && has_rootfs=1 - [ "$has_rootfs" = "1" ] && { - rootfs_length=$( (tar xf "$tar_file" ${board_dir}/root -O | wc -c) 2> /dev/null) - rootfs_type="$(identify_tar "$tar_file" ${board_dir}/root)" - } + return 0 +} - local has_kernel=1 - local has_env=0 +nand_verify_if_gzip_file() { + local file="$1" + local gz="$2" - [ "$kernel_length" != 0 -a -n "$kernel_mtd" ] && { - tar xf "$tar_file" ${board_dir}/kernel -O | mtd write - $CI_KERNPART - } - [ "$kernel_length" = 0 -o ! -z "$kernel_mtd" ] && has_kernel= - [ "$CI_KERNPART" = "none" ] && has_kernel= + if [ "$gz" = z ]; then + echo "verifying compressed sysupgrade file integrity" + if ! gzip -t "$file"; then + echo "corrupted compressed sysupgrade file" + return 1 + fi + fi +} - nand_upgrade_prepare_ubi "$rootfs_length" "$rootfs_type" "${has_kernel:+$kernel_length}" "$has_env" +nand_verify_tar_file() { + local file="$1" + local gz="$2" - local ubidev="$( nand_find_ubi "$CI_UBIPART" )" - [ "$has_kernel" = "1" ] && { - local kern_ubivol="$( nand_find_volume $ubidev $CI_KERNPART )" - tar xf "$tar_file" ${board_dir}/kernel -O | \ - ubiupdatevol /dev/$kern_ubivol -s $kernel_length - - } - - [ "$has_rootfs" = "1" ] && { - local root_ubivol="$( nand_find_volume $ubidev $CI_ROOTPART )" - tar xf "$tar_file" ${board_dir}/root -O | \ - ubiupdatevol /dev/$root_ubivol -s $rootfs_length - - } - nand_do_upgrade_success + echo "verifying sysupgrade tar file integrity" + if ! tar xO${gz}f "$file" > /dev/null; then + echo "corrupted sysupgrade tar file" + return 1 + fi } -# Recognize type of passed file and start the upgrade process -nand_do_upgrade() { - local file_type=$(identify $1) +nand_do_flash_file() { + local file="$1" - [ ! "$(find_mtd_index "$CI_UBIPART")" ] && CI_UBIPART="rootfs" + local gz="$(identify_if_gzip "$file")" + local file_type="$(identify "$file" "" "$gz")" + + [ ! "$(find_mtd_index "$CI_UBIPART")" ] && CI_UBIPART=rootfs case "$file_type" in - "fit") nand_upgrade_fit $1;; - "ubi") nand_upgrade_ubinized $1;; - "ubifs") nand_upgrade_ubifs $1;; - *) nand_upgrade_tar $1;; + "fit") + nand_verify_if_gzip_file "$file" "$gz" || return 1 + nand_upgrade_fit "$file" "$gz" + ;; + "ubi") + nand_verify_if_gzip_file "$file" "$gz" || return 1 + nand_upgrade_ubinized "$file" "$gz" + ;; + "ubifs") + nand_verify_if_gzip_file "$file" "$gz" || return 1 + nand_upgrade_ubifs "$file" "$gz" + ;; + *) + nand_verify_tar_file "$file" "$gz" || return 1 + nand_upgrade_tar "$file" "$gz" + ;; esac } -# Check if passed file is a valid one for NAND sysupgrade. Currently it accepts -# 3 types of files: -# 1) UBI - should contain an ubinized image, header is checked for the proper -# MAGIC -# 2) UBIFS - should contain UBIFS partition that will replace "rootfs" volume, -# header is checked for the proper MAGIC -# 3) TAR - archive has to include "sysupgrade-BOARD" directory with a non-empty -# "CONTROL" file (at this point its content isn't verified) +nand_do_restore_config() { + local conf_tar="/tmp/sysupgrade.tgz" + [ ! -f "$conf_tar" ] || nand_restore_config "$conf_tar" +} + +# Recognize type of passed file and start the upgrade process +nand_do_upgrade() { + local file="$1" + + sync + nand_do_flash_file "$file" && nand_do_upgrade_success + nand_do_upgrade_failed +} + +nand_do_upgrade_success() { + if nand_do_restore_config && sync; then + echo "sysupgrade successful" + umount -a + reboot -f + fi + nand_do_upgrade_failed +} + +nand_do_upgrade_failed() { + sync + echo "sysupgrade failed" + # Should we reboot or bring up some failsafe mode instead? + umount -a + reboot -f +} + +# Check if passed file is a valid one for NAND sysupgrade. +# Currently it accepts 4 types of files: +# 1) UBI: a ubinized image containing required UBI volumes. +# 2) UBIFS: a UBIFS rootfs volume image. +# 3) FIT: a FIT image containing kernel and rootfs. +# 4) TAR: an archive that includes directory "sysupgrade-${BOARD_NAME}" containing +# a non-empty "CONTROL" file and required partition and/or volume images. # # You usually want to call this function in platform_check_image. # @@ -347,14 +458,25 @@ nand_do_upgrade() { # $(2): file to be checked nand_do_platform_check() { local board_name="$1" - local tar_file="$2" - local control_length=$( (tar xf $tar_file sysupgrade-$board_name/CONTROL -O | wc -c) 2> /dev/null) - local file_type="$(identify $2)" + local file="$2" - [ "$control_length" = 0 -a "$file_type" != "ubi" -a "$file_type" != "ubifs" -a "$file_type" != "fit" ] && { - echo "Invalid sysupgrade file." - return 1 - } + local gz="$(identify_if_gzip "$file")" + local file_type="$(identify "$file" "" "$gz")" + local control_length=$( (tar xO${gz}f "$file" "sysupgrade-${board_name//,/_}/CONTROL" | wc -c) 2> /dev/null) + + if [ "$control_length" = 0 ]; then + control_length=$( (tar xO${gz}f "$file" "sysupgrade-${board_name//_/,}/CONTROL" | wc -c) 2> /dev/null) + fi + + if [ "$control_length" != 0 ]; then + nand_verify_tar_file "$file" "$gz" || return 1 + else + nand_verify_if_gzip_file "$file" "$gz" || return 1 + if [ "$file_type" != "fit" -a "$file_type" != "ubi" -a "$file_type" != "ubifs" ]; then + echo "invalid sysupgrade file" + return 1 + fi + fi return 0 } diff --git a/package/base-files/files/lib/upgrade/stage2 b/package/base-files/files/lib/upgrade/stage2 index 5e0d73631b..5ce0b3549c 100755 --- a/package/base-files/files/lib/upgrade/stage2 +++ b/package/base-files/files/lib/upgrade/stage2 @@ -39,9 +39,9 @@ switch_to_ramfs() { for binary in \ /bin/busybox /bin/ash /bin/sh /bin/mount /bin/umount \ pivot_root mount_root reboot sync kill sleep \ - md5sum hexdump cat zcat dd tar \ + md5sum hexdump cat zcat dd tar gzip \ ls basename find cp mv rm mkdir rmdir mknod touch chmod \ - '[' printf wc grep awk sed cut \ + '[' printf wc grep awk sed cut sort tail \ mtd partx losetup mkfs.ext4 nandwrite flash_erase \ ubiupdatevol ubiattach ubiblock ubiformat \ ubidetach ubirsvol ubirmvol ubimkvol \ @@ -121,7 +121,7 @@ kill_remaining() { # [ [ ] ] v "Sending signal $sig to $name ($pid)" kill -$sig $pid 2>/dev/null - [ $loop -eq 1 ] && run=true + [ $loop -eq 1 ] && sleep 2 && run=true done let loop_limit-- diff --git a/package/base-files/files/sbin/wifi b/package/base-files/files/sbin/wifi index 6b9662fe93..a3d3206ee7 100755 --- a/package/base-files/files/sbin/wifi +++ b/package/base-files/files/sbin/wifi @@ -6,7 +6,7 @@ usage() { cat < # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -7,44 +7,39 @@ include $(TOPDIR)/rules.mk -PKG_NAME:=arm-trusted-firmware-rockchip +PKG_VERSION:=2.9 PKG_RELEASE:=1 -PKG_VERSION:=2021-10-13-fa1e0167 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-libre.tar.xz -PKG_SOURCE_URL:=https://librecmc.org/librecmc/downloads/sources/v1.5 -PKG_HASH:=4292d29265218893b7f26c005fbb44361a667e8916ce2d940dc19617d017f8d0 +PKG_HASH:=aa3c40feea8de6e19e19096addaf700cb4a466b97d30f009555d3b845788a90a -PKG_LICENSE:=BSD-3-Clause -PKG_LICENSE_FILES:=license.md - -PKG_MAINTAINER:=Hauke Mehrtens +PKG_MAINTAINER:=Tobias Maedel +include $(INCLUDE_DIR)/kernel.mk +include $(INCLUDE_DIR)/trusted-firmware-a.mk include $(INCLUDE_DIR)/package.mk - -define Package/arm-trusted-firmware-rockchip - SECTION:=boot - CATEGORY:=Boot Loaders - TITLE:=ARM Trusted Firmware for Rockchip - DEPENDS:=@TARGET_rockchip_armv8 +define Trusted-Firmware-A/Default + NAME:=Rockchip $(1) SoCs + BUILD_TARGET:=rockchip endef -export GCC_HONOUR_COPTS=s +define Trusted-Firmware-A/rk3328 + BUILD_SUBTARGET:=armv8 + PLAT=rk3328 +endef -MAKE_VARS = \ - CROSS_COMPILE="$(TARGET_CROSS)" +define Trusted-Firmware-A/rk3399 + BUILD_SUBTARGET:=armv8 + PLAT:=rk3399 +endef -MAKE_FLAGS += \ - PLAT=rk3328 \ - bl31 +TFA_TARGETS:= \ + rk3328 \ + rk3399 -define Build/InstallDev +define Package/trusted-firmware-a/install $(INSTALL_DIR) $(STAGING_DIR_IMAGE) - $(CP) $(PKG_BUILD_DIR)/build/rk3328/release/bl31/bl31.elf $(STAGING_DIR_IMAGE)/rk3328_bl31.elf -endef - -define Package/arm-trusted-firmware-rockchip/install + $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/$(PLAT)/release/bl31/bl31.elf $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)_bl31.elf endef -$(eval $(call BuildPackage,arm-trusted-firmware-rockchip)) +$(eval $(call BuildPackage/Trusted-Firmware-A)) diff --git a/package/boot/arm-trusted-firmware-sunxi/Makefile b/package/boot/arm-trusted-firmware-sunxi/Makefile index 9b97587639..880b7c51bc 100644 --- a/package/boot/arm-trusted-firmware-sunxi/Makefile +++ b/package/boot/arm-trusted-firmware-sunxi/Makefile @@ -7,58 +7,42 @@ include $(TOPDIR)/rules.mk -PKG_NAME:=arm-trusted-firmware-sunxi -PKG_CPE_ID:=cpe:/o:arm:arm_trusted_firmware +PKG_VERSION:=2.8 PKG_RELEASE:=1 -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL=https://github.com/ARM-software/arm-trusted-firmware -PKG_SOURCE_DATE:=2020-11-17 -PKG_SOURCE_VERSION:=e2c509a39c6cc4dda8734e6509cdbe6e3603cdfc -PKG_MIRROR_HASH:=b212d369a5286ebbf6a5616486efa05fa54d4294fd6e9ba2e54fdfae9eda918d +PKG_HASH:=a149c3be4f9d49f4561c1f0b96928ae4a2492475d72bf30754b25f3f8691757c PKG_LICENSE:=BSD-3-Clause PKG_LICENSE_FILES:=license.md PKG_MAINTAINER:=Hauke Mehrtens +include $(INCLUDE_DIR)/kernel.mk include $(INCLUDE_DIR)/trusted-firmware-a.mk include $(INCLUDE_DIR)/package.mk - -define Package/arm-trusted-firmware-sunxi/Default - SECTION:=boot - CATEGORY:=Boot Loaders - TITLE:=ARM Trusted Firmware for Allwinner - DEPENDS:=@TARGET_sunxi_cortexa53 +define Trusted-Firmware-A/Default + BUILD_TARGET:=sunxi + BUILD_SUBTARGET:=cortexa53 endef -define Package/arm-trusted-firmware-sunxi-a64 - $(call Package/arm-trusted-firmware-sunxi/Default) - VARIANT:=sun50i_a64 +define Trusted-Firmware-A/sunxi-a64 + NAME:=Allwinner A64 + PLAT:=sun50i_a64 endef -define Package/arm-trusted-firmware-sunxi-h6 - $(call Package/arm-trusted-firmware-sunxi/Default) - VARIANT:=sun50i_h6 +define Trusted-Firmware-A/sunxi-h6 + NAME:=Allwinner H6 + PLAT:=sun50i_h6 endef -export GCC_HONOUR_COPTS=s - -MAKE_VARS = \ - CROSS_COMPILE="$(TARGET_CROSS)" - -MAKE_FLAGS += \ - PLAT=$(BUILD_VARIANT) \ - bl31 +TFA_TARGETS:= \ + sunxi-a64 \ + sunxi-h6 -define Build/InstallDev +define Package/trusted-firmware-a/install $(INSTALL_DIR) $(STAGING_DIR_IMAGE) - $(CP) $(PKG_BUILD_DIR)/build/$(BUILD_VARIANT)/release/bl31.bin $(STAGING_DIR_IMAGE)/bl31_$(BUILD_VARIANT).bin -endef - -define Package/arm-trusted-firmware-sunxi/install + $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/$(PLAT)/release/bl31.bin $(STAGING_DIR_IMAGE)/bl31_$(BUILD_VARIANT).bin endef -$(eval $(call BuildPackage,arm-trusted-firmware-sunxi-a64)) -$(eval $(call BuildPackage,arm-trusted-firmware-sunxi-h6)) +$(eval $(call BuildPackage/Trusted-Firmware-A)) diff --git a/package/boot/grub2/Makefile b/package/boot/grub2/Makefile index c4cc43de2e..865feee9ad 100644 --- a/package/boot/grub2/Makefile +++ b/package/boot/grub2/Makefile @@ -7,7 +7,7 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=grub PKG_VERSION:=2.06 -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=5 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/grub @@ -25,6 +25,7 @@ ifneq ($(BUILD_VARIANT),none) endif PKG_FLAGS:=nonshared +PKG_BUILD_FLAGS:=no-lto include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/package.mk @@ -32,14 +33,15 @@ include $(INCLUDE_DIR)/package.mk define Package/grub2/Default CATEGORY:=Boot Loaders SECTION:=boot - TITLE:=GRand Unified Bootloader ($(1)) + TITLE:=GRand Unified Bootloader ($(2)) URL:=http://www.gnu.org/software/grub/ - DEPENDS:=@TARGET_x86 - VARIANT:=$(1) + DEPENDS:=@TARGET_$(1) + VARIANT:=$(2) endef -Package/grub2=$(call Package/grub2/Default,pc) -Package/grub2-efi=$(call Package/grub2/Default,efi) +Package/grub2=$(call Package/grub2/Default,x86,pc) +Package/grub2-efi=$(call Package/grub2/Default,x86,efi) +Package/grub2-efi-arm=$(call Package/grub2/Default,armsr,efi) define Package/grub2-editenv CATEGORY:=Utilities @@ -106,6 +108,10 @@ ifneq ($(BUILD_VARIANT),none) MAKE_PATH := grub-core endif +ifeq ($(CONFIG_arm),y) + TARGET_CFLAGS := $(filter-out -mfloat-abi=hard,$(TARGET_CFLAGS)) +endif + define Host/Configure $(SED) 's,(RANLIB),(TARGET_RANLIB),' $(HOST_BUILD_DIR)/grub-core/Makefile.in $(Host/Configure/Default) @@ -122,14 +128,14 @@ define Package/grub2/install -O i386-pc \ -c $(PKG_BUILD_DIR)/grub-early.cfg \ -o $(STAGING_DIR_IMAGE)/grub2/gpt-core.img \ - at_keyboard biosdisk boot chain configfile fat linux ls part_gpt reboot search serial vga + at_keyboard biosdisk boot chain configfile fat linux ls part_gpt reboot search serial test vga $(STAGING_DIR_HOST)/bin/grub-mkimage \ -d $(PKG_BUILD_DIR)/grub-core \ -p /boot/grub \ -O i386-pc \ -c ./files/grub-early.cfg \ -o $(STAGING_DIR_IMAGE)/grub2/generic-core.img \ - at_keyboard biosdisk boot chain configfile ext2 linux ls part_msdos reboot search serial vga + at_keyboard biosdisk boot chain configfile ext2 linux ls part_msdos reboot search serial test vga $(STAGING_DIR_HOST)/bin/grub-mkimage \ -d $(PKG_BUILD_DIR)/grub-core \ -p /boot/grub \ @@ -154,16 +160,38 @@ define Package/grub2-efi/install -O $(CONFIG_ARCH)-efi \ -c $(PKG_BUILD_DIR)/grub-early.cfg \ -o $(STAGING_DIR_IMAGE)/grub2/boot$(if $(CONFIG_x86_64),x64,ia32).efi \ - at_keyboard boot chain configfile fat linux ls part_gpt reboot serial efi_gop efi_uga + at_keyboard boot chain configfile fat linux ls part_gpt reboot serial test efi_gop efi_uga $(STAGING_DIR_HOST)/bin/grub-mkimage \ -d $(PKG_BUILD_DIR)/grub-core \ -p /boot/grub \ -O $(CONFIG_ARCH)-efi \ -c ./files/grub-early.cfg \ -o $(STAGING_DIR_IMAGE)/grub2/iso-boot$(if $(CONFIG_x86_64),x64,ia32).efi \ - at_keyboard boot chain configfile fat iso9660 linux ls part_msdos part_gpt reboot serial test efi_gop efi_uga + boot chain configfile fat iso9660 linux ls part_msdos part_gpt reboot serial test efi_gop efi_uga endef +define Package/grub2-efi-arm/install + $(INSTALL_DIR) $(STAGING_DIR_IMAGE)/grub2 + cp ./files/grub-early-gpt.cfg $(PKG_BUILD_DIR)/grub-early.cfg + $(STAGING_DIR_HOST)/bin/grub-mkimage \ + -d $(PKG_BUILD_DIR)/grub-core \ + -p /boot/grub \ + -O arm$(if $(CONFIG_aarch64),64,)-efi \ + -c $(PKG_BUILD_DIR)/grub-early.cfg \ + -o $(STAGING_DIR_IMAGE)/grub2/boot$(if $(CONFIG_aarch64),aa64,arm).efi \ + boot chain configfile fat linux ls part_gpt part_msdos reboot search \ + search_fs_uuid search_label serial efi_gop lsefi minicmd ext2 + $(STAGING_DIR_HOST)/bin/grub-mkimage \ + -d $(PKG_BUILD_DIR)/grub-core \ + -p /boot/grub \ + -O arm$(if $(CONFIG_aarch64),64,)-efi \ + -c ./files/grub-early.cfg \ + -o $(STAGING_DIR_IMAGE)/grub2/iso-bootaa$(if $(CONFIG_aarch64),aa64,arm).efi \ + boot chain configfile fat iso9660 linux ls lsefi minicmd part_msdos part_gpt \ + reboot serial test efi_gop +endef + + define Package/grub2-editenv/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_BUILD_DIR)/grub-editenv $(1)/usr/sbin/ @@ -177,5 +205,6 @@ endef $(eval $(call HostBuild)) $(eval $(call BuildPackage,grub2)) $(eval $(call BuildPackage,grub2-efi)) +$(eval $(call BuildPackage,grub2-efi-arm)) $(eval $(call BuildPackage,grub2-editenv)) $(eval $(call BuildPackage,grub2-bios-setup)) diff --git a/package/boot/grub2/files/grub-early-gpt.cfg b/package/boot/grub2/files/grub-early-gpt.cfg new file mode 100644 index 0000000000..6720ed5041 --- /dev/null +++ b/package/boot/grub2/files/grub-early-gpt.cfg @@ -0,0 +1,2 @@ +search --set=root --label kernel +configfile ($root)/efi/librecmc/grub.cfg diff --git a/package/boot/kexec-tools/Makefile b/package/boot/kexec-tools/Makefile index 0fbbefdc3b..7f06ec7d64 100644 --- a/package/boot/kexec-tools/Makefile +++ b/package/boot/kexec-tools/Makefile @@ -8,15 +8,17 @@ include $(TOPDIR)/rules.mk PKG_NAME:=kexec-tools -PKG_VERSION:=2.0.21 -PKG_RELEASE:=2 +PKG_VERSION:=2.0.26 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/linux/utils/kernel/kexec -PKG_HASH:=e113142dee891638ad96e0f72cf9277b244477619470b30c41999d312e8e8702 +PKG_HASH:=7fe36a064101cd5c515e41b2be393dce3ca88adce59d6ee668e0af7c0c4570cd PKG_CONFIG_DEPENDS := CONFIG_KEXEC_ZLIB CONFIG_KEXEC_LZMA +PKG_BUILD_FLAGS:=gc-sections + include $(INCLUDE_DIR)/package.mk define Package/kexec-tools/Default @@ -49,6 +51,17 @@ define Package/kexec/description The kexec utility allows to load and boot another kernel. endef +define Package/kdump + $(call Package/kexec-tools/Default) + TITLE:=Kernel crash analysis + DEPENDS:=+kexec @(i386||x86_64||arm) @KERNEL_CRASH_DUMP +endef + +define Package/kdump/description + The kdump package allows to automatically boot into a + special kernel for analyzing kernel crashes using kdump. +endef + define Package/kexec/config source "$(SOURCE)/Config.in" endef @@ -71,9 +84,6 @@ CONFIGURE_ARGS = \ $(if $(CONFIG_KEXEC_LZMA),--with,--without)-lzma \ TARGET_LD="$(TARGET_CROSS)ld" -TARGET_CFLAGS += -ffunction-sections -fdata-sections -TARGET_LDFLAGS += -Wl,--gc-sections - CONFIGURE_VARS += \ BUILD_CC="$(HOSTCC)" \ TARGET_CC="$(TARGET_CC)" @@ -95,5 +105,28 @@ define Package/kexec/install $(LN) ../usr/sbin/kexec $(1)/sbin/kexec endef +define Package/kdump/install + $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d $(1)/etc/config $(1)/etc/uci-defaults + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/vmcore-dmesg $(1)/usr/sbin + $(INSTALL_BIN) ./files/kdump.init $(1)/etc/init.d/kdump + $(INSTALL_BIN) ./files/kdump.defaults $(1)/etc/uci-defaults/kdump + $(INSTALL_CONF) ./files/kdump.config $(1)/etc/config/kdump +endef + +define Package/kdump/prerm +#!/bin/sh + +case $$(uname -m) in + i?86|x86_64) + if grep -q " crashkernel=" /boot/grub/grub.cfg; then + mount /boot -o remount,rw + sed -i 's/ crashkernel=[^ ]*//' /boot/grub/grub.cfg + mount /boot -o remount,ro + fi + ;; +esac +endef + $(eval $(call BuildPackage,kexec-tools)) $(eval $(call BuildPackage,kexec)) +$(eval $(call BuildPackage,kdump)) diff --git a/package/boot/kexec-tools/patches/001-arm-do-not-copy-magic-4-bytes-of-appended-DTB-in-zIm.patch b/package/boot/kexec-tools/patches/001-arm-do-not-copy-magic-4-bytes-of-appended-DTB-in-zIm.patch deleted file mode 100644 index 82bdd4e7ed..0000000000 --- a/package/boot/kexec-tools/patches/001-arm-do-not-copy-magic-4-bytes-of-appended-DTB-in-zIm.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 9817ec81968a5eec7863902833fb77680544eae4 Mon Sep 17 00:00:00 2001 -From: Alexander Egorenkov -Date: Mon, 12 Apr 2021 13:18:05 +0200 -Subject: [PATCH 1/1] arm: do not copy magic 4 bytes of appended DTB in zImage - -If the passed zImage happens to have a DTB appended, then the magic 4 bytes -of the DTB are copied together with the kernel image. This leads to -failed kexec boots because the decompressor finds the aforementioned -DTB magic and falsely tries to replace the DTB passed in the register r2 -with the non-existent appended one. - -Signed-off-by: Alexander Egorenkov -Signed-off-by: Simon Horman ---- - kexec/arch/arm/kexec-zImage-arm.c | 12 +++++++++++- - 1 file changed, 11 insertions(+), 1 deletion(-) - ---- a/kexec/arch/arm/kexec-zImage-arm.c -+++ b/kexec/arch/arm/kexec-zImage-arm.c -@@ -382,6 +382,7 @@ int zImage_arm_load(int argc, char **arg - unsigned int atag_offset = 0x1000; /* 4k offset from memory start */ - unsigned int extra_size = 0x8000; /* TEXT_OFFSET */ - const struct zimage_tag *tag; -+ size_t kernel_buf_size; - size_t kernel_mem_size; - const char *command_line; - char *modified_cmdline = NULL; -@@ -538,6 +539,15 @@ int zImage_arm_load(int argc, char **arg - } - - /* -+ * Save the length of the compressed kernel image w/o the appended DTB. -+ * This will be required later on when the kernel image contained -+ * in the zImage will be loaded into a kernel memory segment. -+ * And we want to load ONLY the compressed kernel image from the zImage -+ * and discard the appended DTB. -+ */ -+ kernel_buf_size = len; -+ -+ /* - * Always extend the zImage by four bytes to ensure that an appended - * DTB image always sees an initialised value after _edata. - */ -@@ -759,7 +769,7 @@ int zImage_arm_load(int argc, char **arg - add_segment(info, dtb_buf, dtb_length, dtb_offset, dtb_length); - } - -- add_segment(info, buf, len, kernel_base, kernel_mem_size); -+ add_segment(info, buf, kernel_buf_size, kernel_base, kernel_mem_size); - - info->entry = (void*)kernel_base; - diff --git a/package/boot/uboot-envtools/Makefile b/package/boot/uboot-envtools/Makefile index 8bbe1eb991..2e4c1ac39e 100644 --- a/package/boot/uboot-envtools/Makefile +++ b/package/boot/uboot-envtools/Makefile @@ -9,15 +9,15 @@ include $(TOPDIR)/rules.mk PKG_NAME:=uboot-envtools PKG_DISTNAME:=u-boot -PKG_VERSION:=2022.01 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=2023.04 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_DISTNAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:= \ https://ftp.denx.de/pub/u-boot \ https://mirror.cyberbits.eu/u-boot \ ftp://ftp.denx.de/pub/u-boot -PKG_HASH:=81b4543227db228c03f8a1bf5ddbc813b0bb8f6555ce46064ef721a6fc680413 +PKG_HASH:=e31cac91545ff41b71cec5d8c22afd695645cd6e2a442ccdacacd60534069341 PKG_SOURCE_SUBDIR:=$(PKG_DISTNAME)-$(PKG_VERSION) PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_DISTNAME)-$(PKG_VERSION) diff --git a/package/boot/uboot-envtools/files/apm821xx b/package/boot/uboot-envtools/files/apm821xx deleted file mode 100644 index 690fbba332..0000000000 --- a/package/boot/uboot-envtools/files/apm821xx +++ /dev/null @@ -1,27 +0,0 @@ -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in -meraki,mr24) - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x4000" "0x4000" "4" - ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x4000" "0x4000" "4" - ;; -meraki,mx60) - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000" "4" - ;; -netgear,wndap620|\ -netgear,wndap660) - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x4000" "0x4000" "4" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/ath79 b/package/boot/uboot-envtools/files/ath79 index 8aa82ee66f..7a4f35e810 100644 --- a/package/boot/uboot-envtools/files/ath79 +++ b/package/boot/uboot-envtools/files/ath79 @@ -12,6 +12,7 @@ touch /etc/config/ubootenv board=$(board_name) case "$board" in +alcatel,hh40v|\ alfa-network,ap121f|\ alfa-network,ap121fe|\ alfa-network,n2q|\ @@ -26,7 +27,11 @@ araknis,an-700-ap-i-ac|\ arduino,yun|\ buffalo,bhr-4grv2|\ devolo,magic-2-wifi|\ +dlink,dir-859-a1|\ +dlink,dir-859-a3|\ +dlink,dir-869-a1|\ engenius,eap1200h|\ +engenius,eap1750h|\ engenius,eap300-v2|\ engenius,eap350-v1|\ engenius,eap600|\ @@ -37,11 +42,11 @@ engenius,ecb600|\ engenius,enh202-v1|\ engenius,ens202ext-v1|\ engenius,enstationac-v1|\ +engenius,ews660ap|\ etactica,eg200|\ glinet,gl-ar750s-nor|\ glinet,gl-ar750s-nor-nand|\ librerouter,librerouter-v1|\ -netgear,ex6400|\ netgear,ex7300|\ netgear,ex7300-v2|\ netgear,wndr4300-v2|\ @@ -66,7 +71,18 @@ openmesh,om5p-an|\ openmesh,om5p-ac-v1|\ openmesh,om5p-ac-v2|\ samsung,wam250|\ +ubnt,airrouter|\ +ubnt,bullet-m-ar7240|\ +ubnt,bullet-m-ar7241|\ +ubnt,nanobridge-m|\ +ubnt,nanostation-loco-m|\ ubnt,nanostation-m|\ +ubnt,picostation-m|\ +ubnt,powerbridge-m|\ +ubnt,rocket-m|\ +watchguard,ap100|\ +watchguard,ap200|\ +watchguard,ap300|\ yuncore,a770|\ yuncore,a782|\ yuncore,a930|\ @@ -76,6 +92,19 @@ ziking,cpe46b|\ zyxel,nbg6616) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x10000" ;; +aruba,ap-105|\ +aruba,ap-115|\ +aruba,ap-175|\ +dongwon,dw02-412h-64m|\ +dongwon,dw02-412h-128m|\ +glinet,gl-ar300m-lite|\ +glinet,gl-ar300m-nand|\ +glinet,gl-ar300m-nor|\ +glinet,gl-ar300m16) + idx="$(find_mtd_index u-boot-env)" + [ -n "$idx" ] && \ + ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000" + ;; buffalo,wzr-hp-ag300h) ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x10000" "0x10000" ;; @@ -87,16 +116,6 @@ linksys,ea4500-v3) domywifi,dw33d) ubootenv_add_uci_config "/dev/mtd4" "0x0" "0x10000" "0x10000" ;; -dongwon,dw02-412h-64m|\ -dongwon,dw02-412h-128m|\ -glinet,gl-ar300m-lite|\ -glinet,gl-ar300m-nand|\ -glinet,gl-ar300m-nor|\ -glinet,gl-ar300m16) - idx="$(find_mtd_index u-boot-env)" - [ -n "$idx" ] && \ - ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000" - ;; glinet,gl-ar150) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x8000" "0x10000" ;; @@ -105,6 +124,7 @@ netgear,wndr3700-v2|\ netgear,wndrmac-v1) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x10000" ;; +netgear,pgzng1|\ netgear,wndr3700-v4|\ netgear,wndr4300|\ netgear,wndr4300tn|\ @@ -126,16 +146,32 @@ plasmacloud,pa300e) qihoo,c301) ubootenv_add_uci_config "/dev/mtd9" "0x0" "0x10000" "0x10000" ;; +ruckus,zf7025|\ +ruckus,zf7341|\ +ruckus,zf7351|\ +ruckus,zf7363) + ubootenv_add_uci_config "/dev/mtd5" "0x0" "0x40000" "0x40000" + ;; ruckus,zf7321|\ ruckus,zf7372) ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x40000" "0x10000" ;; +sophos,ap15|\ sophos,ap55|\ sophos,ap55c|\ sophos,ap100|\ sophos,ap100c) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x10000" ;; +thinkpenguin,tpe-r1100) + ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x8000" "0x10000" + ;; +thinkpenguin,tpe-r1200|\ +thinkpenguin,tpe-r1300) + idx="$(find_mtd_index u-boot-env)" + [ -n "$idx" ] && \ + ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000" + ;; wallys,dr531) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0xf800" "0x10000" ;; diff --git a/package/boot/uboot-envtools/files/cns3xxx b/package/boot/uboot-envtools/files/cns3xxx deleted file mode 100644 index c8cca3091d..0000000000 --- a/package/boot/uboot-envtools/files/cns3xxx +++ /dev/null @@ -1,26 +0,0 @@ -# -# Copyright (C) 2013 OpenWrt.org -# - -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in -laguna) - # Laguna uboot env size/erasesize vary depending on NOR vs SPI FLASH - size=$(grep mtd1 /proc/mtd | awk '{print $2}') - erasesize=$(grep mtd1 /proc/mtd | awk '{print $3}') - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x$size" "0x$erasesize" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/imx_cortexa9 b/package/boot/uboot-envtools/files/imx_cortexa9 deleted file mode 100644 index c6d6d94d16..0000000000 --- a/package/boot/uboot-envtools/files/imx_cortexa9 +++ /dev/null @@ -1,64 +0,0 @@ -# -# Copyright (C) 2013-2014 OpenWrt.org -# - -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/imx.sh -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in -gw,imx6dl-gw51xx|\ -gw,imx6dl-gw52xx|\ -gw,imx6dl-gw53xx|\ -gw,imx6dl-gw54xx|\ -gw,imx6dl-gw551x|\ -gw,imx6dl-gw552x|\ -gw,imx6dl-gw553x|\ -gw,imx6dl-gw5904|\ -gw,imx6dl-gw5907|\ -gw,imx6dl-gw5910|\ -gw,imx6dl-gw5912|\ -gw,imx6dl-gw5913|\ -gw,imx6q-gw51xx|\ -gw,imx6q-gw52xx|\ -gw,imx6q-gw53xx|\ -gw,imx6q-gw5400-a|\ -gw,imx6q-gw54xx|\ -gw,imx6q-gw551x|\ -gw,imx6q-gw552x|\ -gw,imx6q-gw553x|\ -gw,imx6q-gw5904|\ -gw,imx6q-gw5907|\ -gw,imx6q-gw5910|\ -gw,imx6q-gw5912|\ -gw,imx6q-gw5913) - if [ -c /dev/mtd1 ]; then - # board boots from NAND - ubootenv_add_uci_config /dev/mtd1 0x0 0x20000 0x40000 - ubootenv_add_uci_config /dev/mtd1 0x80000 0x20000 0x40000 - else - # board boots from microSD - ubootenv_add_uci_config /dev/mmcblk0 0xb1400 0x20000 - ubootenv_add_uci_config /dev/mmcblk0 0xd1400 0x20000 - fi - ;; -toradex,apalis_imx6q-eval|\ -toradex,apalis_imx6q-ixora|\ -toradex,apalis_imx6q-ixora-v1.1) - ubootenv_add_uci_config $(bootdev_from_uuid)boot0 -0x2200 0x2000 0x200 10 - ;; -wand,imx6dl-wandboard) - ubootenv_add_uci_config "/dev/mmcblk0" "0x60000" "0x2000" "0x2000" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/ipq40xx b/package/boot/uboot-envtools/files/ipq40xx deleted file mode 100644 index 59ad963168..0000000000 --- a/package/boot/uboot-envtools/files/ipq40xx +++ /dev/null @@ -1,72 +0,0 @@ -# -# Copyright (C) 2016 LEDE -# - -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -ubootenv_mtdinfo () { - UBOOTENV_PART=$(cat /proc/mtd | grep APPSBLENV) - mtd_dev=$(echo $UBOOTENV_PART | awk '{print $1}' | sed 's/:$//') - mtd_size=$(echo $UBOOTENV_PART | awk '{print "0x"$2}') - mtd_erase=$(echo $UBOOTENV_PART | awk '{print "0x"$3}') - nor_flash=$(find /sys/bus/spi/devices/*/mtd -name ${mtd_dev}) - - if [ -n "$nor_flash" ]; then - ubootenv_size=$mtd_size - else - # size is fixed to 0x40000 in u-boot - ubootenv_size=0x40000 - fi - - sectors=$(( $ubootenv_size / $mtd_erase )) - sectors=$(printf "0x%x" $sectors ) - echo /dev/$mtd_dev 0x0 $ubootenv_size $mtd_erase $sectors -} - -case "$board" in -alfa-network,ap120c-ac|\ -devolo,magic-2-wifi-next|\ -edgecore,ecw5211|\ -glinet,gl-ap1300|\ -glinet,gl-b1300|\ -glinet,gl-b2200|\ -luma,wrtq-329acn|\ -netgear,wac510|\ -openmesh,a42|\ -openmesh,a62|\ -plasmacloud,pa1200|\ -plasmacloud,pa2200) - ubootenv_add_uci_config "/dev/mtd5" "0x0" "0x10000" "0x10000" - ;; -aruba,ap-303) - ubootenv_add_uci_config "/dev/mtd13" "0x0" "0x10000" "0x10000" - ;; -aruba,ap-365) - ubootenv_add_uci_config "/dev/mtd8" "0x0" "0x10000" "0x10000" - ;; -buffalo,wtr-m2133hp) - ubootenv_add_uci_config "/dev/mtd8" "0x0" "0x40000" "0x20000" - ;; -linksys,ea6350v3) - ubootenv_add_uci_config "/dev/mtd7" "0x0" "0x20000" "0x20000" - ;; -linksys,ea8300|\ -linksys,mr8300) - ubootenv_add_uci_config "/dev/mtd7" "0x0" "0x40000" "0x20000" - ;; -zyxel,nbg6617) - ubootenv_add_uci_config "/dev/mtd6" "0x0" "0x10000" "0x10000" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/ipq806x b/package/boot/uboot-envtools/files/ipq806x deleted file mode 100644 index 77dfefbcd8..0000000000 --- a/package/boot/uboot-envtools/files/ipq806x +++ /dev/null @@ -1,61 +0,0 @@ -# -# Copyright (C) 2016 LEDE -# - -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -ubootenv_mtdinfo () { - UBOOTENV_PART=$(cat /proc/mtd | grep APPSBLENV) - mtd_dev=$(echo $UBOOTENV_PART | awk '{print $1}' | sed 's/:$//') - mtd_size=$(echo $UBOOTENV_PART | awk '{print "0x"$2}') - mtd_erase=$(echo $UBOOTENV_PART | awk '{print "0x"$3}') - nor_flash=$(find /sys/bus/spi/devices/*/mtd -name ${mtd_dev}) - - if [ -n "$nor_flash" ]; then - ubootenv_size=$mtd_size - else - # size is fixed to 0x40000 in u-boot - ubootenv_size=0x40000 - fi - - sectors=$(( $ubootenv_size / $mtd_erase )) - sectors=$(printf "0x%x" $sectors ) - echo /dev/$mtd_dev 0x0 $ubootenv_size $mtd_erase $sectors -} - -case "$board" in -arris,tr4400-v2|\ -askey,rt4230w-rev6) - ubootenv_add_uci_config "/dev/mtd9" "0x0" "0x40000" "0x20000" - ;; -edgecore,ecw5410) - ubootenv_add_uci_config "/dev/mtd11" "0x0" "0x10000" "0x10000" - ;; -linksys,ea7500-v1|\ -linksys,ea8500) - ubootenv_add_uci_config "/dev/mtd10" "0x0" "0x20000" "0x20000" - ;; -netgear,r7800) - ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x040000" "0x20000" - ;; -qcom,ipq8064-ap148|\ -qcom,ipq8064-db149) - ubootenv_add_uci_config $(ubootenv_mtdinfo) - ;; -ubnt,unifi-ac-hd|\ -zyxel,nbg6817) - ubootenv_add_uci_config "/dev/mtdblock9" "0x0" "0x10000" "0x10000" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/kirkwood b/package/boot/uboot-envtools/files/kirkwood deleted file mode 100644 index 240371f48d..0000000000 --- a/package/boot/uboot-envtools/files/kirkwood +++ /dev/null @@ -1,38 +0,0 @@ -# -# Copyright (C) 2012-2014 OpenWrt.org -# - -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in -checkpoint,l-50|\ -cloudengines,pogoe02|\ -cloudengines,pogoplugv4|\ -globalscale,sheevaplug|\ -iom,ix2-200|\ -linksys,e4200-v2|\ -linksys,ea4500|\ -netgear,readynas-duo-v2|\ -raidsonic,ib-nas62x0|\ -seagate,dockstar|\ -zyxel,nsa310b|\ -zyxel,nsa310s|\ -zyxel,nsa325) - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000" - ;; -linksys,ea3500) - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x4000" "0x4000" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/lantiq b/package/boot/uboot-envtools/files/lantiq deleted file mode 100644 index 81af7e804f..0000000000 --- a/package/boot/uboot-envtools/files/lantiq +++ /dev/null @@ -1,37 +0,0 @@ -# -# Copyright (C) 2012 OpenWrt.org -# - -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in -bt,homehub-v2b) - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x10000" "1" - ;; -bt,homehub-v3a) - ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x4000" "0x4000" "1" - ;; -siemens,gigaset-sx76x) - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x10000" "1" - ;; -zyxel,p-2812hnu-f1) - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x2000" "0x20000" "1" - ;; -buffalo,wbmr-300hpd) - idx="$(find_mtd_index u-boot-env)" - [ -n "$idx" ] && \ - ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x2000" "0x1000" "2" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/layerscape b/package/boot/uboot-envtools/files/layerscape deleted file mode 100644 index b11587d876..0000000000 --- a/package/boot/uboot-envtools/files/layerscape +++ /dev/null @@ -1,24 +0,0 @@ -# -# Copyright (C) 2016 LEDE -# - -[ -f /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in - traverse,ls1043v|\ - traverse,ls1043s) - ubootenv_add_uci_config "/dev/mtd1" "0x40000" "0x2000" "0x20000" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/mediatek_filogic b/package/boot/uboot-envtools/files/mediatek_filogic new file mode 100644 index 0000000000..6e39fac657 --- /dev/null +++ b/package/boot/uboot-envtools/files/mediatek_filogic @@ -0,0 +1,96 @@ +# +# Copyright (C) 2021 OpenWrt.org +# + +[ -e /etc/config/ubootenv ] && exit 0 + +touch /etc/config/ubootenv + +. /lib/uboot-envtools.sh +. /lib/functions.sh + +board=$(board_name) + +case "$board" in +bananapi,bpi-r3) + rootdev="$(cmdline_get_var root)" + rootdev="${rootdev##*/}" + rootdev="${rootdev%%p[0-9]*}" + case "$rootdev" in + mmc*) + local envdev=$(find_mmc_part "ubootenv" $rootdev) + ubootenv_add_uci_config "$envdev" "0x0" "0x40000" "0x40000" "1" + ubootenv_add_uci_config "$envdev" "0x40000" "0x40000" "0x40000" "1" + ;; + mtd*) + local envdev=/dev/mtd$(find_mtd_index "u-boot-env") + ubootenv_add_uci_config "$envdev" "0x0" "0x20000" "0x20000" "1" + ubootenv_add_uci_config "$envdev" "0x20000" "0x20000" "0x20000" "1" + ;; + ubi*) + . /lib/upgrade/nand.sh + local envubi=$(nand_find_ubi ubi) + local envdev=/dev/$(nand_find_volume $envubi ubootenv) + local envdev2=/dev/$(nand_find_volume $envubi ubootenv2) + ubootenv_add_uci_config "$envdev" "0x0" "0x1f000" "0x1f000" "1" + ubootenv_add_uci_config "$envdev2" "0x0" "0x1f000" "0x1f000" "1" + ;; + esac + ;; +cmcc,rax3000m) + case "$(cmdline_get_var root)" in + /dev/mmc*) + local envdev=$(find_mmc_part "ubootenv" "mmcblk0") + ubootenv_add_uci_config "$envdev" "0x0" "0x40000" "0x40000" "1" + ubootenv_add_uci_config "$envdev" "0x40000" "0x40000" "0x40000" "1" + ;; + *) + . /lib/upgrade/nand.sh + local envubi=$(nand_find_ubi ubi) + local envdev=/dev/$(nand_find_volume $envubi ubootenv) + local envdev2=/dev/$(nand_find_volume $envubi ubootenv2) + ubootenv_add_uci_config "$envdev" "0x0" "0x1f000" "0x1f000" "1" + ubootenv_add_uci_config "$envdev2" "0x0" "0x1f000" "0x1f000" "1" + ;; + esac + ;; +glinet,gl-mt3000) + ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x80000" "0x20000" + ;; +mercusys,mr90x-v1) + local envdev=/dev/mtd$(find_mtd_index "u-boot-env") + ubootenv_add_uci_config "$envdev" "0x0" "0x20000" "0x20000" "1" + ;; +netgear,wax220) + ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000" + ;; +xiaomi,mi-router-wr30u-112m-nmbm|\ +xiaomi,mi-router-wr30u-stock|\ +xiaomi,redmi-router-ax6000-stock) + ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x20000" + ubootenv_add_uci_sys_config "/dev/mtd2" "0x0" "0x10000" "0x20000" + ;; +h3c,magic-nx30-pro|\ +qihoo,360t7|\ +tplink,tl-xdr4288|\ +tplink,tl-xdr6086|\ +tplink,tl-xdr6088|\ +xiaomi,mi-router-wr30u-ubootmod|\ +xiaomi,redmi-router-ax6000-ubootmod) + . /lib/upgrade/nand.sh + local envubi=$(nand_find_ubi ubi) + local envdev=/dev/$(nand_find_volume $envubi ubootenv) + local envdev2=/dev/$(nand_find_volume $envubi ubootenv2) + ubootenv_add_uci_config "$envdev" "0x0" "0x1f000" "0x20000" "1" + ubootenv_add_uci_config "$envdev2" "0x0" "0x1f000" "0x20000" "1" + ;; +zyxel,ex5601-t0) + local envdev=/dev/mtd$(find_mtd_index "u-boot-env") + ubootenv_add_uci_config "$envdev" "0x0" "0x20000" "0x40000" "2" + ;; +esac + +config_load ubootenv +config_foreach ubootenv_add_app_config + +exit 0 diff --git a/package/boot/uboot-envtools/files/mediatek_mt7622 b/package/boot/uboot-envtools/files/mediatek_mt7622 index 654f78056a..e01dcc4fef 100644 --- a/package/boot/uboot-envtools/files/mediatek_mt7622 +++ b/package/boot/uboot-envtools/files/mediatek_mt7622 @@ -17,16 +17,16 @@ linksys,e8450-ubi) ubootenv_add_uci_config "/dev/ubi0_1" "0x0" "0x1f000" "0x1f000" "1" ;; bananapi,bpi-r64) - . /lib/upgrade/common.sh - export_bootdevice - export_partdevice rootdev 0 + rootdev="$(cmdline_get_var root)" + rootdev="${rootdev##*/}" + rootdev="${rootdev%%p[0-9]*}" case "$rootdev" in mmc*) local envdev=$(find_mmc_part "ubootenv" $rootdev) ubootenv_add_uci_config "$envdev" "0x0" "0x80000" "0x80000" "1" ubootenv_add_uci_config "$envdev" "0x80000" "0x80000" "0x80000" "1" ;; - *) + ubi*) ubootenv_add_uci_config "/dev/ubi0_0" "0x0" "0x1f000" "0x1f000" "1" ubootenv_add_uci_config "/dev/ubi0_1" "0x0" "0x1f000" "0x1f000" "1" ;; diff --git a/package/boot/uboot-envtools/files/mediatek_mt7629 b/package/boot/uboot-envtools/files/mediatek_mt7629 new file mode 100644 index 0000000000..313fb6a448 --- /dev/null +++ b/package/boot/uboot-envtools/files/mediatek_mt7629 @@ -0,0 +1,24 @@ +# +# Copyright (C) 2021 OpenWrt.org +# + +[ -e /etc/config/ubootenv ] && exit 0 + +touch /etc/config/ubootenv + +. /lib/uboot-envtools.sh +. /lib/functions.sh + +board=$(board_name) + +case "$board" in +iptime,a6004mx|\ +netgear,ex6250-v2) + ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" + ;; +esac + +config_load ubootenv +config_foreach ubootenv_add_app_config ubootenv + +exit 0 diff --git a/package/boot/uboot-envtools/files/mpc85xx b/package/boot/uboot-envtools/files/mpc85xx deleted file mode 100644 index 36d9f753a1..0000000000 --- a/package/boot/uboot-envtools/files/mpc85xx +++ /dev/null @@ -1,27 +0,0 @@ -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in -extreme-networks,ws-ap3825i) - ubootenv_add_uci_config "$(find_mtd_part 'cfg1')" "0x0" "0x10000" "0x20000" - ubootenv_add_uci_config "$(find_mtd_part 'cfg2')" "0x0" "0x10000" "0x20000" - ;; -ocedo,panda) - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000" - ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x20000" "0x20000" - ;; -aerohive,hiveap-330) - ubootenv_add_uci_config "$(find_mtd_part 'u-boot-env')" "0x0" "0x20000" "0x10000" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/mvebu b/package/boot/uboot-envtools/files/mvebu index cffd396ae1..63b5132608 100644 --- a/package/boot/uboot-envtools/files/mvebu +++ b/package/boot/uboot-envtools/files/mvebu @@ -13,6 +13,7 @@ touch /etc/config/ubootenv board=$(board_name) case "$board" in +buffalo,ls220de|\ buffalo,ls421de) ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x10000" ;; @@ -58,8 +59,14 @@ linksys,wrt3200acm|\ linksys,wrt32x) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000" ;; -methode,udpu) +methode,udpu|\ +methode,edpu) + idx="$(find_mtd_index u-boot-env)" + if [ -n "$idx" ]; then + ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000" "1" + else ubootenv_add_uci_config "/dev/mtd0" "0x180000" "0x10000" "0x10000" + fi ;; esac diff --git a/package/boot/uboot-envtools/files/mxs b/package/boot/uboot-envtools/files/mxs deleted file mode 100644 index fc5cd54078..0000000000 --- a/package/boot/uboot-envtools/files/mxs +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (C) 2013 OpenWrt.org -# - -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in -i2se,duckbill) - ubootenv_add_uci_config "/dev/mmcblk0" "0x20000" "0x20000" - ubootenv_add_uci_config "/dev/mmcblk0" "0x40000" "0x20000" - ;; -olimex,imx23-olinuxino) - ubootenv_add_uci_config "/dev/mmcblk0" "0x40000" "0x4000" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/oxnas b/package/boot/uboot-envtools/files/oxnas deleted file mode 100644 index bd407c67d5..0000000000 --- a/package/boot/uboot-envtools/files/oxnas +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (C) 2013 OpenWrt.org -# - -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in -"cloudengines,pogoplug"*|\ -"shuttle,kd20") - ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x2000" "0x20000" "1" - ;; -"mitrastar,stg-212") - ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x20000" "0x20000" "1" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/pistachio b/package/boot/uboot-envtools/files/pistachio deleted file mode 100644 index 53515641bc..0000000000 --- a/package/boot/uboot-envtools/files/pistachio +++ /dev/null @@ -1,26 +0,0 @@ -# -# Copyright (C) 2017 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in -img,pistachio-marduk) - ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x2000" "0x1000" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/qoriq b/package/boot/uboot-envtools/files/qoriq deleted file mode 100644 index d024a7f008..0000000000 --- a/package/boot/uboot-envtools/files/qoriq +++ /dev/null @@ -1,19 +0,0 @@ -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in -watchguard,firebox-m300) - ubootenv_add_uci_config "/dev/mtd9" "0x0" "0x2000" "0x10000" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config ubootenv - -exit 0 diff --git a/package/boot/uboot-envtools/files/ramips b/package/boot/uboot-envtools/files/ramips index 790b4b4df0..83b54388e3 100644 --- a/package/boot/uboot-envtools/files/ramips +++ b/package/boot/uboot-envtools/files/ramips @@ -17,22 +17,46 @@ alfa-network,awusfree1|\ alfa-network,quad-e4g|\ alfa-network,r36m-e4g|\ alfa-network,tube-e4g|\ +engenius,epg600|\ engenius,esr600h|\ -sitecom,wlr-4100-v1-002) +linksys,re7000|\ +meig,slt866|\ +sitecom,wlr-4100-v1-002|\ +zyxel,keenetic-lite-iii-a) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x1000" ;; +alfa-network,ax1800rm|\ allnet,all0256n-4m|\ allnet,all0256n-8m|\ allnet,all5002|\ yuncore,ax820) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x10000" ;; +arcadyan,we420223-99) + ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x1000" "0x1000" + ;; ampedwireless,ally-00x19k|\ ampedwireless,ally-r1900k) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x20000" "4" ;; +beeline,smartbox-giga|\ +beeline,smartbox-turbo|\ +beeline,smartbox-turbo-plus|\ +etisalat,s3|\ +rostelecom,rt-sf-1) + ubootenv_add_uci_config "/dev/mtd0" "0x80000" "0x1000" "0x20000" + ;; +beeline,smartbox-pro|\ +tplink,ec330-g5u-v1|\ +wifire,s1500-nbn) + idx="$(find_mtd_index u-boot-env)" + [ -n "$idx" ] && \ + ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x1000" "0x20000" + ;; buffalo,wsr-1166dhp|\ buffalo,wsr-600dhp|\ +kroks,kndrt31r16|\ +kroks,kndrt31r19|\ mediatek,linkit-smart-7688|\ samknows,whitebox-v8|\ xiaomi,mi-router-4c|\ @@ -41,16 +65,29 @@ zbtlink,zbt-wg2626|\ zte,mf283plus) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x10000" ;; +asus,rt-ax53u|\ +asus,rt-ax54|\ +belkin,rt1800|\ +h3c,tx1800-plus|\ +h3c,tx1801-plus|\ +h3c,tx1806|\ +jcg,q20|\ +linksys,e7350|\ +netgear,wax202|\ +zyxel,wsm20) + ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000" + ;; +haier,har-20s2u1|\ +sim,simax1800t) + ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000" + ubootenv_add_uci_sys_config "/dev/mtd1" "0x40000" "0x40000" "0x20000" + ;; hootoo,ht-tm05|\ ravpower,rp-wd03) idx="$(find_mtd_index u-boot-env)" [ -n "$idx" ] && \ ubootenv_add_uci_config "/dev/mtd$idx" "0x4000" "0x1000" "0x1000" ;; -jcg,q20|\ -netgear,wax202) - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000" - ;; beeline,smartbox-flash|\ linksys,ea6350-v4|\ linksys,ea7300-v1|\ @@ -61,6 +98,17 @@ linksys,ea8100-v2|\ mts,wg430223) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x20000" ;; +snr,snr-cpe-me1|\ +snr,snr-cpe-me2-sfp|\ +snr,cpe-w4n-mt) + idx="$(find_mtd_index uboot-env)" + [ -n "$idx" ] && \ + ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x1000" "0x1000" + ;; +xiaomi,miwifi-mini) + ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x10000" + ubootenv_add_uci_sys_config "/dev/mtd9" "0x0" "0x4000" "0x10000" + ;; xiaomi,mi-router-3g-v2|\ xiaomi,mi-router-4a-gigabit|\ xiaomi,miwifi-3c) @@ -75,6 +123,9 @@ xiaomi,redmi-router-ac2100) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x20000" ubootenv_add_uci_sys_config "/dev/mtd2" "0x0" "0x4000" "0x20000" ;; +zyxel,lte3301-plus) + ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x80000" + ;; zyxel,nr7101) idx="$(find_mtd_index Config)" [ -n "$idx" ] && \ diff --git a/package/boot/uboot-envtools/files/realtek b/package/boot/uboot-envtools/files/realtek deleted file mode 100644 index af48d27078..0000000000 --- a/package/boot/uboot-envtools/files/realtek +++ /dev/null @@ -1,51 +0,0 @@ -[ -e /etc/config/ubootenv ] && exit 0 - -touch /etc/config/ubootenv - -. /lib/uboot-envtools.sh -. /lib/functions.sh - -board=$(board_name) - -case "$board" in -d-link,dgs-1210-16|\ -d-link,dgs-1210-28|\ -d-link,dgs-1210-10p|\ -zyxel,gs1900-8|\ -zyxel,gs1900-8hp-v1|\ -zyxel,gs1900-8hp-v2|\ -zyxel,gs1900-10hp|\ -zyxel,gs1900-16|\ -zyxel,gs1900-24-v1|\ -zyxel,gs1900-24e|\ -zyxel,gs1900-24hp-v1|\ -zyxel,gs1900-24hp-v2) - idx="$(find_mtd_index u-boot-env)" - [ -n "$idx" ] && \ - ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x400" "0x10000" - idx2="$(find_mtd_index u-boot-env2)" - [ -n "$idx2" ] && \ - ubootenv_add_uci_sys_config "/dev/mtd$idx2" "0x0" "0x1000" "0x10000" - ;; -iodata,bsh-g24mb) - idx="$(find_mtd_index u-boot-env)" - [ -n "$idx" ] && \ - ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000" - idx2="$(find_mtd_index u-boot-env2)" - [ -n "$idx2" ] && \ - ubootenv_add_uci_sys_config "/dev/mtd$idx2" "0x0" "0x3800" "0x10000" - ;; -*) - idx="$(find_mtd_index u-boot-env)" - [ -n "$idx" ] && \ - ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000" - idx2="$(find_mtd_index u-boot-env2)" - [ -n "$idx2" ] && \ - ubootenv_add_uci_sys_config "/dev/mtd$idx2" "0x0" "0x1000" "0x10000" - ;; -esac - -config_load ubootenv -config_foreach ubootenv_add_app_config - -exit 0 diff --git a/package/boot/uboot-rockchip/Makefile b/package/boot/uboot-rockchip/Makefile index 7fd4d74dae..f9ccfe5e8c 100644 --- a/package/boot/uboot-rockchip/Makefile +++ b/package/boot/uboot-rockchip/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_VERSION:=2021.07 -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=5 PKG_HASH:=312b7eeae44581d1362c3a3f02c28d806647756c82ba8c72241c7cdbe68ba77e @@ -24,65 +24,93 @@ endef # RK3328 boards -define U-Boot/nanopi-r2s-rk3328 +define U-Boot/rk3328/Default BUILD_SUBTARGET:=armv8 + DEPENDS:=+PACKAGE_u-boot-$(1):trusted-firmware-a-rk3328 + ATF:=rk3328_bl31.elf + OF_PLATDATA:=$(1) +endef + +define U-Boot/nanopi-r2c-rk3328 + $(U-Boot/rk3328/Default) + NAME:=NanoPi R2C + BUILD_DEVICES:= \ + friendlyarm_nanopi-r2c +endef + +define U-Boot/nanopi-r2s-rk3328 + $(U-Boot/rk3328/Default) NAME:=NanoPi R2S BUILD_DEVICES:= \ friendlyarm_nanopi-r2s - DEPENDS:=+PACKAGE_u-boot-nanopi-r2s-rk3328:arm-trusted-firmware-rockchip - PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip - ATF:=rk3328_bl31.elf - OF_PLATDATA:=$(1) +endef + +define U-Boot/orangepi-r1-plus-rk3328 + $(U-Boot/rk3328/Default) + NAME:=Orange Pi R1 Plus + BUILD_DEVICES:= \ + xunlong_orangepi-r1-plus +endef + +define U-Boot/orangepi-r1-plus-lts-rk3328 + $(U-Boot/rk3328/Default) + NAME:=Orange Pi R1 Plus LTS + BUILD_DEVICES:= \ + xunlong_orangepi-r1-plus-lts +endef + +define U-Boot/roc-cc-rk3328 + $(U-Boot/rk3328/Default) + NAME:=ROC-RK3328-CC + BUILD_DEVICES:= \ + firefly_roc-rk3328-cc endef define U-Boot/tpe-r1400-rk3328 - BUILD_SUBTARGET:=armv8 + $(U-Boot/rk3328/Default) NAME:=TPE-R1400 BUILD_DEVICES:= \ thinkpenguin_tpe-r1400 - DEPENDS:=+PACKAGE_u-boot-tpe-r1400-rk3328:arm-trusted-firmware-rockchip - PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip - ATF:=rk3328_bl31.elf - OF_PLATDATA:=$(1) endef # RK3399 boards -define U-Boot/nanopi-r4s-rk3399 +define U-Boot/rk3399/Default BUILD_SUBTARGET:=armv8 + DEPENDS:=+PACKAGE_u-boot-$(1):trusted-firmware-a-rk3399 + ATF:=rk3399_bl31.elf +endef + +define U-Boot/nanopi-r4s-rk3399 + $(U-Boot/rk3399/Default) NAME:=NanoPi R4S BUILD_DEVICES:= \ friendlyarm_nanopi-r4s - DEPENDS:=+PACKAGE_u-boot-nanopi-r4s-rk3399:arm-trusted-firmware-rockchip - PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip - ATF:=rk3399_bl31.elf endef define U-Boot/rock-pi-4-rk3399 - BUILD_SUBTARGET:=armv8 + $(U-Boot/rk3399/Default) NAME:=Rock Pi 4 BUILD_DEVICES:= \ radxa_rock-pi-4a - DEPENDS:=+PACKAGE_u-boot-rock-pi-4-rk3399:arm-trusted-firmware-rockchip - PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip - ATF:=rk3399_bl31.elf endef define U-Boot/rockpro64-rk3399 - BUILD_SUBTARGET:=armv8 + $(U-Boot/rk3399/Default) NAME:=RockPro64 BUILD_DEVICES:= \ pine64_rockpro64 - DEPENDS:=+PACKAGE_u-boot-rockpro64-rk3399:arm-trusted-firmware-rockchip - PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip - ATF:=rk3399_bl31.elf endef UBOOT_TARGETS := \ nanopi-r4s-rk3399 \ rock-pi-4-rk3399 \ rockpro64-rk3399 \ + nanopi-r2c-rk3328 \ nanopi-r2s-rk3328 \ + orangepi-r1-plus-rk3328 \ + orangepi-r1-plus-lts-rk3328 \ + roc-cc-rk3328 \ tpe-r1400-rk3328 UBOOT_CONFIGURE_VARS += USE_PRIVATE_LIBGCC=yes @@ -103,7 +131,6 @@ ifneq ($(OF_PLATDATA),) endif $(SED) 's#CONFIG_MKIMAGE_DTC_PATH=.*#CONFIG_MKIMAGE_DTC_PATH="$(PKG_BUILD_DIR)/scripts/dtc/dtc"#g' $(PKG_BUILD_DIR)/.config - echo 'CONFIG_IDENT_STRING=" libreCMC"' >> $(PKG_BUILD_DIR)/.config endef define Build/InstallDev diff --git a/package/boot/uboot-rockchip/patches/101-rock64pro-disable-CONFIG_USE_PREBOOT.patch b/package/boot/uboot-rockchip/patches/101-rock64pro-disable-CONFIG_USE_PREBOOT.patch index f630818358..174c9ea29c 100644 --- a/package/boot/uboot-rockchip/patches/101-rock64pro-disable-CONFIG_USE_PREBOOT.patch +++ b/package/boot/uboot-rockchip/patches/101-rock64pro-disable-CONFIG_USE_PREBOOT.patch @@ -17,9 +17,9 @@ Signed-off-by: Marty Jones --- a/configs/rockpro64-rk3399_defconfig +++ b/configs/rockpro64-rk3399_defconfig -@@ -12,7 +12,6 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y +@@ -12,7 +12,6 @@ CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_SPL_SPI_FLASH_SUPPORT=y CONFIG_SPL_SPI_SUPPORT=y - CONFIG_DEFAULT_DEVICE_TREE="rk3399-rockpro64" CONFIG_DEBUG_UART=y -CONFIG_USE_PREBOOT=y CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-rockpro64.dtb" diff --git a/package/boot/uboot-rockchip/patches/102-add-tpe-r1400.patch b/package/boot/uboot-rockchip/patches/102-add-tpe-r1400.patch deleted file mode 100644 index a5f03844a8..0000000000 --- a/package/boot/uboot-rockchip/patches/102-add-tpe-r1400.patch +++ /dev/null @@ -1,527 +0,0 @@ ---- a/arch/arm/dts/Makefile -+++ b/arch/arm/dts/Makefile -@@ -109,6 +109,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3308) += \ - dtb-$(CONFIG_ROCKCHIP_RK3328) += \ - rk3328-evb.dtb \ - rk3328-nanopi-r2s.dtb \ -+ rk3328-tpe-r1400.dtb \ - rk3328-roc-cc.dtb \ - rk3328-rock64.dtb \ - rk3328-rock-pi-e.dtb ---- /dev/null -+++ b/arch/arm/dts/rk3328-tpe-r1400-u-boot.dtsi -@@ -0,0 +1,40 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * (C) Copyright 2018-2019 Rockchip Electronics Co., Ltd -+ * (C) Copyright 2020 David Bauer -+ */ -+ -+#include "rk3328-u-boot.dtsi" -+#include "rk3328-sdram-ddr4-666.dtsi" -+/ { -+ chosen { -+ u-boot,spl-boot-order = "same-as-spl", &sdmmc, &emmc; -+ }; -+}; -+ -+&gpio0 { -+ u-boot,dm-spl; -+}; -+ -+&pinctrl { -+ u-boot,dm-spl; -+}; -+ -+&sdmmc0m1_gpio { -+ u-boot,dm-spl; -+}; -+ -+&pcfg_pull_up_4ma { -+ u-boot,dm-spl; -+}; -+ -+/* Need this and all the pinctrl/gpio stuff above to set pinmux */ -+&vcc_sd { -+ u-boot,dm-spl; -+}; -+ -+&gmac2io { -+ snps,reset-gpio = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; -+ snps,reset-active-low; -+ snps,reset-delays-us = <0 10000 50000>; -+}; ---- /dev/null -+++ b/arch/arm/dts/rk3328-tpe-r1400.dts -@@ -0,0 +1,370 @@ -+// SPDX-License-Identifier: (GPL-2.0+ OR MIT) -+/* -+ * Copyright (c) 2020 David Bauer -+ */ -+ -+/dts-v1/; -+ -+#include -+#include -+#include "rk3328.dtsi" -+ -+/ { -+ model = "ThinkPenguin TPE-R1400"; -+ compatible = "thinkpenguin,tpe-r1400", "rockchip,rk3328"; -+ -+ chosen { -+ stdout-path = "serial2:1500000n8"; -+ }; -+ -+ gmac_clk: gmac-clock { -+ compatible = "fixed-clock"; -+ clock-frequency = <125000000>; -+ clock-output-names = "gmac_clkin"; -+ #clock-cells = <0>; -+ }; -+ -+ keys { -+ compatible = "gpio-keys"; -+ pinctrl-0 = <&reset_button_pin>; -+ pinctrl-names = "default"; -+ -+ reset { -+ label = "reset"; -+ gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>; -+ linux,code = ; -+ debounce-interval = <50>; -+ }; -+ }; -+ -+ leds { -+ compatible = "gpio-leds"; -+ pinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>; -+ pinctrl-names = "default"; -+ -+ lan_led: led-0 { -+ gpios = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>; -+ label = "tpe-r1400:green:lan"; -+ }; -+ -+ sys_led: led-1 { -+ gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>; -+ label = "tpe-r1400:red:sys"; -+ }; -+ -+ wan_led: led-2 { -+ gpios = <&gpio2 RK_PC2 GPIO_ACTIVE_HIGH>; -+ label = "tpe-r1400:green:wan"; -+ }; -+ }; -+ -+ vcc_io_sdio: sdmmcio-regulator { -+ compatible = "regulator-gpio"; -+ enable-active-high; -+ gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>; -+ pinctrl-0 = <&sdio_vcc_pin>; -+ pinctrl-names = "default"; -+ regulator-name = "vcc_io_sdio"; -+ regulator-always-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <3300000>; -+ regulator-settling-time-us = <5000>; -+ regulator-type = "voltage"; -+ startup-delay-us = <2000>; -+ states = <1800000 0x1 -+ 3300000 0x0>; -+ vin-supply = <&vcc_io_33>; -+ }; -+ -+ vcc_sd: sdmmc-regulator { -+ compatible = "regulator-fixed"; -+ gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>; -+ pinctrl-0 = <&sdmmc0m1_gpio>; -+ pinctrl-names = "default"; -+ regulator-name = "vcc_sd"; -+ regulator-boot-on; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ vin-supply = <&vcc_io_33>; -+ }; -+ -+ vdd_5v: vdd-5v { -+ compatible = "regulator-fixed"; -+ regulator-name = "vdd_5v"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ }; -+}; -+ -+&cpu0 { -+ cpu-supply = <&vdd_arm>; -+}; -+ -+&cpu1 { -+ cpu-supply = <&vdd_arm>; -+}; -+ -+&cpu2 { -+ cpu-supply = <&vdd_arm>; -+}; -+ -+&cpu3 { -+ cpu-supply = <&vdd_arm>; -+}; -+ -+&gmac2io { -+ assigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>; -+ assigned-clock-parents = <&gmac_clk>, <&gmac_clk>; -+ clock_in_out = "input"; -+ phy-handle = <&rtl8211e>; -+ phy-mode = "rgmii"; -+ phy-supply = <&vcc_io_33>; -+ pinctrl-0 = <&rgmiim1_pins>; -+ pinctrl-names = "default"; -+ rx_delay = <0x18>; -+ snps,aal; -+ tx_delay = <0x24>; -+ status = "okay"; -+ -+ mdio { -+ compatible = "snps,dwmac-mdio"; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ rtl8211e: ethernet-phy@1 { -+ compatible = "ethernet-phy-id001c.c915", -+ "ethernet-phy-ieee802.3-c22"; -+ reg = <1>; -+ pinctrl-0 = <ð_phy_reset_pin>; -+ pinctrl-names = "default"; -+ reset-assert-us = <10000>; -+ reset-deassert-us = <50000>; -+ reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; -+ }; -+ }; -+}; -+ -+&i2c1 { -+ status = "okay"; -+ -+ rk805: pmic@18 { -+ compatible = "rockchip,rk805"; -+ reg = <0x18>; -+ interrupt-parent = <&gpio1>; -+ interrupts = <24 IRQ_TYPE_LEVEL_LOW>; -+ #clock-cells = <1>; -+ clock-output-names = "xin32k", "rk805-clkout2"; -+ gpio-controller; -+ #gpio-cells = <2>; -+ pinctrl-0 = <&pmic_int_l>; -+ pinctrl-names = "default"; -+ rockchip,system-power-controller; -+ wakeup-source; -+ -+ vcc1-supply = <&vdd_5v>; -+ vcc2-supply = <&vdd_5v>; -+ vcc3-supply = <&vdd_5v>; -+ vcc4-supply = <&vdd_5v>; -+ vcc5-supply = <&vcc_io_33>; -+ vcc6-supply = <&vdd_5v>; -+ -+ regulators { -+ vdd_log: DCDC_REG1 { -+ regulator-name = "vdd_log"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <712500>; -+ regulator-max-microvolt = <1450000>; -+ regulator-ramp-delay = <12500>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <1000000>; -+ }; -+ }; -+ -+ vdd_arm: DCDC_REG2 { -+ regulator-name = "vdd_arm"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <712500>; -+ regulator-max-microvolt = <1450000>; -+ regulator-ramp-delay = <12500>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <950000>; -+ }; -+ }; -+ -+ vcc_ddr: DCDC_REG3 { -+ regulator-name = "vcc_ddr"; -+ regulator-always-on; -+ regulator-boot-on; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ }; -+ }; -+ -+ vcc_io_33: DCDC_REG4 { -+ regulator-name = "vcc_io_33"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <3300000>; -+ }; -+ }; -+ -+ vcc_18: LDO_REG1 { -+ regulator-name = "vcc_18"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <1800000>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <1800000>; -+ }; -+ }; -+ -+ vcc18_emmc: LDO_REG2 { -+ regulator-name = "vcc18_emmc"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <1800000>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <1800000>; -+ }; -+ }; -+ -+ vdd_10: LDO_REG3 { -+ regulator-name = "vdd_10"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1000000>; -+ regulator-max-microvolt = <1000000>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <1000000>; -+ }; -+ }; -+ }; -+ }; -+}; -+ -+&io_domains { -+ pmuio-supply = <&vcc_io_33>; -+ vccio1-supply = <&vcc_io_33>; -+ vccio2-supply = <&vcc18_emmc>; -+ vccio3-supply = <&vcc_io_sdio>; -+ vccio4-supply = <&vcc_18>; -+ vccio5-supply = <&vcc_io_33>; -+ vccio6-supply = <&vcc_io_33>; -+ status = "okay"; -+}; -+ -+&pinctrl { -+ button { -+ reset_button_pin: reset-button-pin { -+ rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ }; -+ -+ ethernet-phy { -+ eth_phy_reset_pin: eth-phy-reset-pin { -+ rockchip,pins = <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>; -+ }; -+ }; -+ -+ leds { -+ lan_led_pin: lan-led-pin { -+ rockchip,pins = <2 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ -+ sys_led_pin: sys-led-pin { -+ rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ -+ wan_led_pin: wan-led-pin { -+ rockchip,pins = <2 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ }; -+ -+ pmic { -+ pmic_int_l: pmic-int-l { -+ rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>; -+ }; -+ }; -+ -+ sd { -+ sdio_vcc_pin: sdio-vcc-pin { -+ rockchip,pins = <1 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>; -+ }; -+ }; -+}; -+ -+&pwm2 { -+ status = "okay"; -+}; -+ -+&sdmmc { -+ bus-width = <4>; -+ cap-sd-highspeed; -+ disable-wp; -+ pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>; -+ pinctrl-names = "default"; -+ sd-uhs-sdr12; -+ sd-uhs-sdr25; -+ sd-uhs-sdr50; -+ sd-uhs-sdr104; -+ vmmc-supply = <&vcc_sd>; -+ vqmmc-supply = <&vcc_io_sdio>; -+ status = "okay"; -+}; -+ -+&tsadc { -+ rockchip,hw-tshut-mode = <0>; -+ rockchip,hw-tshut-polarity = <0>; -+ status = "okay"; -+}; -+ -+&u2phy { -+ status = "okay"; -+}; -+ -+&u2phy_host { -+ status = "okay"; -+}; -+ -+&u2phy_otg { -+ status = "okay"; -+}; -+ -+&uart2 { -+ status = "okay"; -+}; -+ -+&usb20_otg { -+ status = "okay"; -+ dr_mode = "host"; -+}; -+ -+&usb_host0_ehci { -+ status = "okay"; -+}; -+ -+&usb_host0_ohci { -+ status = "okay"; -+}; ---- /dev/null -+++ b/configs/tpe-r1400-rk3328_defconfig -@@ -0,0 +1,98 @@ -+CONFIG_ARM=y -+CONFIG_ARCH_ROCKCHIP=y -+CONFIG_SYS_TEXT_BASE=0x00200000 -+CONFIG_SPL_GPIO_SUPPORT=y -+CONFIG_NR_DRAM_BANKS=1 -+CONFIG_ENV_OFFSET=0x3F8000 -+CONFIG_DEFAULT_DEVICE_TREE="rk3328-tpe-r1400" -+CONFIG_ROCKCHIP_RK3328=y -+CONFIG_TPL_ROCKCHIP_COMMON_BOARD=y -+CONFIG_TPL_LIBCOMMON_SUPPORT=y -+CONFIG_TPL_LIBGENERIC_SUPPORT=y -+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y -+CONFIG_SPL_STACK_R_ADDR=0x600000 -+CONFIG_DEBUG_UART_BASE=0xFF130000 -+CONFIG_DEBUG_UART_CLOCK=24000000 -+CONFIG_DEBUG_UART=y -+CONFIG_TPL_SYS_MALLOC_F_LEN=0x800 -+# CONFIG_ANDROID_BOOT_IMAGE is not set -+CONFIG_FIT=y -+CONFIG_FIT_VERBOSE=y -+CONFIG_SPL_LOAD_FIT=y -+CONFIG_DEFAULT_FDT_FILE="rockchip/rk3328-tpe-r1400.dtb" -+# CONFIG_DISPLAY_CPUINFO is not set -+CONFIG_DISPLAY_BOARDINFO_LATE=y -+CONFIG_MISC_INIT_R=y -+# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set -+CONFIG_TPL_SYS_MALLOC_SIMPLE=y -+CONFIG_SPL_STACK_R=y -+CONFIG_SPL_I2C_SUPPORT=y -+CONFIG_SPL_POWER_SUPPORT=y -+CONFIG_SPL_ATF=y -+CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y -+CONFIG_CMD_BOOTZ=y -+CONFIG_CMD_GPT=y -+CONFIG_CMD_MMC=y -+CONFIG_CMD_USB=y -+# CONFIG_CMD_SETEXPR is not set -+CONFIG_CMD_TIME=y -+CONFIG_SPL_OF_CONTROL=y -+CONFIG_TPL_OF_CONTROL=y -+CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" -+CONFIG_TPL_OF_PLATDATA=y -+CONFIG_ENV_IS_IN_MMC=y -+CONFIG_SYS_RELOC_GD_ENV_ADDR=y -+CONFIG_NET_RANDOM_ETHADDR=y -+CONFIG_TPL_DM=y -+CONFIG_REGMAP=y -+CONFIG_SPL_REGMAP=y -+CONFIG_TPL_REGMAP=y -+CONFIG_SYSCON=y -+CONFIG_SPL_SYSCON=y -+CONFIG_TPL_SYSCON=y -+CONFIG_CLK=y -+CONFIG_SPL_CLK=y -+CONFIG_FASTBOOT_BUF_ADDR=0x800800 -+CONFIG_FASTBOOT_CMD_OEM_FORMAT=y -+CONFIG_ROCKCHIP_GPIO=y -+CONFIG_SYS_I2C_ROCKCHIP=y -+CONFIG_MMC_DW=y -+CONFIG_MMC_DW_ROCKCHIP=y -+CONFIG_SF_DEFAULT_SPEED=20000000 -+CONFIG_DM_ETH=y -+CONFIG_ETH_DESIGNWARE=y -+CONFIG_GMAC_ROCKCHIP=y -+CONFIG_PINCTRL=y -+CONFIG_SPL_PINCTRL=y -+CONFIG_DM_PMIC=y -+CONFIG_PMIC_RK8XX=y -+CONFIG_SPL_DM_REGULATOR=y -+CONFIG_REGULATOR_PWM=y -+CONFIG_DM_REGULATOR_FIXED=y -+CONFIG_SPL_DM_REGULATOR_FIXED=y -+CONFIG_REGULATOR_RK8XX=y -+CONFIG_PWM_ROCKCHIP=y -+CONFIG_RAM=y -+CONFIG_SPL_RAM=y -+CONFIG_TPL_RAM=y -+CONFIG_DM_RESET=y -+CONFIG_BAUDRATE=1500000 -+CONFIG_DEBUG_UART_SHIFT=2 -+CONFIG_SYSINFO=y -+CONFIG_SYSRESET=y -+# CONFIG_TPL_SYSRESET is not set -+CONFIG_USB=y -+CONFIG_USB_XHCI_HCD=y -+CONFIG_USB_XHCI_DWC3=y -+CONFIG_USB_EHCI_HCD=y -+CONFIG_USB_EHCI_GENERIC=y -+CONFIG_USB_OHCI_HCD=y -+CONFIG_USB_OHCI_GENERIC=y -+CONFIG_USB_DWC2=y -+CONFIG_USB_DWC3=y -+# CONFIG_USB_DWC3_GADGET is not set -+CONFIG_USB_GADGET=y -+CONFIG_USB_GADGET_DWC2_OTG=y -+CONFIG_SPL_TINY_MEMSET=y -+CONFIG_TPL_TINY_MEMSET=y -+CONFIG_ERRNO_STR=y diff --git a/package/boot/uboot-rockchip/patches/102-rockchip-rk3328-Add-support-for-FriendlyARM-NanoPi-R2C.patch b/package/boot/uboot-rockchip/patches/102-rockchip-rk3328-Add-support-for-FriendlyARM-NanoPi-R2C.patch new file mode 100644 index 0000000000..bc450b0dd4 --- /dev/null +++ b/package/boot/uboot-rockchip/patches/102-rockchip-rk3328-Add-support-for-FriendlyARM-NanoPi-R2C.patch @@ -0,0 +1,199 @@ +From 7000a609473ffe14d32c656cdd0ff3ca0d3ecbd7 Mon Sep 17 00:00:00 2001 +From: Tianling Shen +Date: Tue, 11 Apr 2023 18:14:49 +0800 +Subject: [PATCH] rockchip: rk3328: Add support for FriendlyARM NanoPi R2C + +The NanoPi R2C is a minor variant of NanoPi R2S with the on-board NIC +chip changed from rtl8211e to yt8521s, and otherwise identical to R2S. + +The device tree is taken from the kernel linux-next branch: +https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=004589ff9df5b75672a78b6c3c4cba93202b14c9 + +Signed-off-by: Tianling Shen +Reviewed-by: Kever Yang +--- + arch/arm/dts/Makefile | 1 + + arch/arm/dts/rk3328-nanopi-r2c-u-boot.dtsi | 3 + + arch/arm/dts/rk3328-nanopi-r2c.dts | 40 ++++++++ + board/rockchip/evb_rk3328/MAINTAINERS | 6 ++ + configs/nanopi-r2c-rk3328_defconfig | 112 +++++++++++++++++++++ + 5 files changed, 162 insertions(+) + create mode 100644 arch/arm/dts/rk3328-nanopi-r2c-u-boot.dtsi + create mode 100644 arch/arm/dts/rk3328-nanopi-r2c.dts + create mode 100644 configs/nanopi-r2c-rk3328_defconfig + +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -108,6 +108,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3308) += \ + + dtb-$(CONFIG_ROCKCHIP_RK3328) += \ + rk3328-evb.dtb \ ++ rk3328-nanopi-r2c.dtb \ + rk3328-nanopi-r2s.dtb \ + rk3328-roc-cc.dtb \ + rk3328-rock64.dtb \ +--- /dev/null ++++ b/arch/arm/dts/rk3328-nanopi-r2c-u-boot.dtsi +@@ -0,0 +1,3 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++ ++#include "rk3328-nanopi-r2s-u-boot.dtsi" +--- /dev/null ++++ b/arch/arm/dts/rk3328-nanopi-r2c.dts +@@ -0,0 +1,40 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT ++/* ++ * Copyright (c) 2021 FriendlyElec Computer Tech. Co., Ltd. ++ * (http://www.friendlyarm.com) ++ * ++ * Copyright (c) 2021-2023 Tianling Shen ++ */ ++ ++/dts-v1/; ++#include "rk3328-nanopi-r2s.dts" ++ ++/ { ++ model = "FriendlyElec NanoPi R2C"; ++ compatible = "friendlyarm,nanopi-r2c", "rockchip,rk3328"; ++}; ++ ++&gmac2io { ++ phy-handle = <&yt8521s>; ++ tx_delay = <0x22>; ++ rx_delay = <0x12>; ++ ++ mdio { ++ /delete-node/ ethernet-phy@1; ++ ++ yt8521s: ethernet-phy@3 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <3>; ++ ++ motorcomm,clk-out-frequency-hz = <125000000>; ++ motorcomm,keep-pll-enabled; ++ motorcomm,auto-sleep-disabled; ++ ++ pinctrl-0 = <ð_phy_reset_pin>; ++ pinctrl-names = "default"; ++ reset-assert-us = <10000>; ++ reset-deassert-us = <50000>; ++ reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++}; +--- a/board/rockchip/evb_rk3328/MAINTAINERS ++++ b/board/rockchip/evb_rk3328/MAINTAINERS +@@ -5,6 +5,12 @@ F: board/rockchip/evb_rk3328 + F: include/configs/evb_rk3328.h + F: configs/evb-rk3328_defconfig + ++NANOPI-R2C-RK3328 ++M: Tianling Shen ++S: Maintained ++F: configs/nanopi-r2c-rk3328_defconfig ++F: arch/arm/dts/rk3328-nanopi-r2c-u-boot.dtsi ++ + NANOPI-R2S-RK3328 + M: David Bauer + S: Maintained +--- /dev/null ++++ b/configs/nanopi-r2c-rk3328_defconfig +@@ -0,0 +1,98 @@ ++CONFIG_ARM=y ++CONFIG_ARCH_ROCKCHIP=y ++CONFIG_SYS_TEXT_BASE=0x00200000 ++CONFIG_SPL_GPIO_SUPPORT=y ++CONFIG_NR_DRAM_BANKS=1 ++CONFIG_ENV_OFFSET=0x3F8000 ++CONFIG_DEFAULT_DEVICE_TREE="rk3328-nanopi-r2c" ++CONFIG_ROCKCHIP_RK3328=y ++CONFIG_TPL_ROCKCHIP_COMMON_BOARD=y ++CONFIG_TPL_LIBCOMMON_SUPPORT=y ++CONFIG_TPL_LIBGENERIC_SUPPORT=y ++CONFIG_SPL_DRIVERS_MISC_SUPPORT=y ++CONFIG_SPL_STACK_R_ADDR=0x600000 ++CONFIG_DEBUG_UART_BASE=0xFF130000 ++CONFIG_DEBUG_UART_CLOCK=24000000 ++CONFIG_DEBUG_UART=y ++CONFIG_TPL_SYS_MALLOC_F_LEN=0x800 ++# CONFIG_ANDROID_BOOT_IMAGE is not set ++CONFIG_FIT=y ++CONFIG_FIT_VERBOSE=y ++CONFIG_SPL_LOAD_FIT=y ++CONFIG_DEFAULT_FDT_FILE="rockchip/rk3328-nanopi-r2c.dtb" ++# CONFIG_DISPLAY_CPUINFO is not set ++CONFIG_DISPLAY_BOARDINFO_LATE=y ++CONFIG_MISC_INIT_R=y ++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set ++CONFIG_TPL_SYS_MALLOC_SIMPLE=y ++CONFIG_SPL_STACK_R=y ++CONFIG_SPL_I2C_SUPPORT=y ++CONFIG_SPL_POWER_SUPPORT=y ++CONFIG_SPL_ATF=y ++CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y ++CONFIG_CMD_BOOTZ=y ++CONFIG_CMD_GPT=y ++CONFIG_CMD_MMC=y ++CONFIG_CMD_USB=y ++# CONFIG_CMD_SETEXPR is not set ++CONFIG_CMD_TIME=y ++CONFIG_SPL_OF_CONTROL=y ++CONFIG_TPL_OF_CONTROL=y ++CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" ++CONFIG_TPL_OF_PLATDATA=y ++CONFIG_ENV_IS_IN_MMC=y ++CONFIG_SYS_RELOC_GD_ENV_ADDR=y ++CONFIG_NET_RANDOM_ETHADDR=y ++CONFIG_TPL_DM=y ++CONFIG_REGMAP=y ++CONFIG_SPL_REGMAP=y ++CONFIG_TPL_REGMAP=y ++CONFIG_SYSCON=y ++CONFIG_SPL_SYSCON=y ++CONFIG_TPL_SYSCON=y ++CONFIG_CLK=y ++CONFIG_SPL_CLK=y ++CONFIG_FASTBOOT_BUF_ADDR=0x800800 ++CONFIG_FASTBOOT_CMD_OEM_FORMAT=y ++CONFIG_ROCKCHIP_GPIO=y ++CONFIG_SYS_I2C_ROCKCHIP=y ++CONFIG_MMC_DW=y ++CONFIG_MMC_DW_ROCKCHIP=y ++CONFIG_SF_DEFAULT_SPEED=20000000 ++CONFIG_DM_ETH=y ++CONFIG_ETH_DESIGNWARE=y ++CONFIG_GMAC_ROCKCHIP=y ++CONFIG_PINCTRL=y ++CONFIG_SPL_PINCTRL=y ++CONFIG_DM_PMIC=y ++CONFIG_PMIC_RK8XX=y ++CONFIG_SPL_DM_REGULATOR=y ++CONFIG_REGULATOR_PWM=y ++CONFIG_DM_REGULATOR_FIXED=y ++CONFIG_SPL_DM_REGULATOR_FIXED=y ++CONFIG_REGULATOR_RK8XX=y ++CONFIG_PWM_ROCKCHIP=y ++CONFIG_RAM=y ++CONFIG_SPL_RAM=y ++CONFIG_TPL_RAM=y ++CONFIG_DM_RESET=y ++CONFIG_BAUDRATE=1500000 ++CONFIG_DEBUG_UART_SHIFT=2 ++CONFIG_SYSINFO=y ++CONFIG_SYSRESET=y ++# CONFIG_TPL_SYSRESET is not set ++CONFIG_USB=y ++CONFIG_USB_XHCI_HCD=y ++CONFIG_USB_XHCI_DWC3=y ++CONFIG_USB_EHCI_HCD=y ++CONFIG_USB_EHCI_GENERIC=y ++CONFIG_USB_OHCI_HCD=y ++CONFIG_USB_OHCI_GENERIC=y ++CONFIG_USB_DWC2=y ++CONFIG_USB_DWC3=y ++# CONFIG_USB_DWC3_GADGET is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DWC2_OTG=y ++CONFIG_SPL_TINY_MEMSET=y ++CONFIG_TPL_TINY_MEMSET=y ++CONFIG_ERRNO_STR=y diff --git a/package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orange-Pi-R1-Plus.patch b/package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orange-Pi-R1-Plus.patch new file mode 100644 index 0000000000..ff17559c2f --- /dev/null +++ b/package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orange-Pi-R1-Plus.patch @@ -0,0 +1,564 @@ +From ff312af37d5f263f181468639aab83f645d331f1 Mon Sep 17 00:00:00 2001 +From: Tianling Shen +Date: Sat, 20 May 2023 18:50:38 +0800 +Subject: [PATCH] rockchip: rk3328: Add support for Orange Pi R1 Plus + +Orange Pi R1 Plus is a Rockchip RK3328 based SBC by Xunlong. + +This device is similar to the NanoPi R2S, and has a 16MB +SPI NOR (mx25l12805d). The reset button is changed to +directly reset the power supply, another detail is that +both network ports have independent MAC addresses. + +The device tree and description are taken from kernel v6.3-rc1. + +Reviewed-by: Kever Yang +Signed-off-by: Tianling Shen +--- + arch/arm/dts/Makefile | 1 + + .../dts/rk3328-orangepi-r1-plus-u-boot.dtsi | 46 +++ + arch/arm/dts/rk3328-orangepi-r1-plus.dts | 373 ++++++++++++++++++ + board/rockchip/evb_rk3328/MAINTAINERS | 6 + + configs/orangepi-r1-plus-rk3328_defconfig | 114 ++++++ + 5 files changed, 540 insertions(+) + create mode 100644 arch/arm/dts/rk3328-orangepi-r1-plus-u-boot.dtsi + create mode 100644 arch/arm/dts/rk3328-orangepi-r1-plus.dts + create mode 100644 configs/orangepi-r1-plus-rk3328_defconfig + +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -110,6 +110,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3328) += \ + rk3328-evb.dtb \ + rk3328-nanopi-r2c.dtb \ + rk3328-nanopi-r2s.dtb \ ++ rk3328-orangepi-r1-plus.dtb \ + rk3328-roc-cc.dtb \ + rk3328-rock64.dtb \ + rk3328-rock-pi-e.dtb +--- /dev/null ++++ b/arch/arm/dts/rk3328-orangepi-r1-plus-u-boot.dtsi +@@ -0,0 +1,46 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++/* ++ * (C) Copyright 2018-2019 Rockchip Electronics Co., Ltd ++ * (C) Copyright 2020 David Bauer ++ */ ++ ++#include "rk3328-u-boot.dtsi" ++#include "rk3328-sdram-ddr4-666.dtsi" ++/ { ++ chosen { ++ u-boot,spl-boot-order = "same-as-spl", &sdmmc, &emmc; ++ }; ++}; ++ ++&gpio0 { ++ u-boot,dm-spl; ++}; ++ ++&pinctrl { ++ u-boot,dm-spl; ++}; ++ ++&sdmmc0m1_gpio { ++ u-boot,dm-spl; ++}; ++ ++&pcfg_pull_up_4ma { ++ u-boot,dm-spl; ++}; ++ ++/* Need this and all the pinctrl/gpio stuff above to set pinmux */ ++&vcc_sd { ++ u-boot,dm-spl; ++}; ++ ++&gmac2io { ++ snps,reset-gpio = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; ++ snps,reset-active-low; ++ snps,reset-delays-us = <0 10000 50000>; ++}; ++ ++&spi0 { ++ spi_flash: spiflash@0 { ++ u-boot,dm-pre-reloc; ++ }; ++}; +--- /dev/null ++++ b/arch/arm/dts/rk3328-orangepi-r1-plus.dts +@@ -0,0 +1,359 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++/* ++ * Based on rk3328-nanopi-r2s.dts, which is: ++ * Copyright (c) 2020 David Bauer ++ */ ++ ++/dts-v1/; ++ ++#include ++#include ++#include "rk3328.dtsi" ++ ++/ { ++ model = "Xunlong Orange Pi R1 Plus"; ++ compatible = "xunlong,orangepi-r1-plus", "rockchip,rk3328"; ++ ++ aliases { ++ mmc0 = &sdmmc; ++ }; ++ ++ chosen { ++ stdout-path = "serial2:1500000n8"; ++ }; ++ ++ gmac_clk: gmac-clock { ++ compatible = "fixed-clock"; ++ clock-frequency = <125000000>; ++ clock-output-names = "gmac_clkin"; ++ #clock-cells = <0>; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ pinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>; ++ pinctrl-names = "default"; ++ ++ led-0 { ++ function = LED_FUNCTION_LAN; ++ color = ; ++ gpios = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ led-1 { ++ function = LED_FUNCTION_STATUS; ++ color = ; ++ gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>; ++ linux,default-trigger = "heartbeat"; ++ }; ++ ++ led-2 { ++ function = LED_FUNCTION_WAN; ++ color = ; ++ gpios = <&gpio2 RK_PC2 GPIO_ACTIVE_HIGH>; ++ }; ++ }; ++ ++ vcc_sd: sdmmc-regulator { ++ compatible = "regulator-fixed"; ++ gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>; ++ pinctrl-0 = <&sdmmc0m1_gpio>; ++ pinctrl-names = "default"; ++ regulator-name = "vcc_sd"; ++ regulator-boot-on; ++ vin-supply = <&vcc_io>; ++ }; ++ ++ vcc_sys: vcc-sys-regulator { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc_sys"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ }; ++ ++ vdd_5v_lan: vdd-5v-lan-regulator { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ gpio = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>; ++ pinctrl-0 = <&lan_vdd_pin>; ++ pinctrl-names = "default"; ++ regulator-name = "vdd_5v_lan"; ++ regulator-always-on; ++ regulator-boot-on; ++ vin-supply = <&vcc_sys>; ++ }; ++}; ++ ++&cpu0 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&cpu1 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&cpu2 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&cpu3 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&display_subsystem { ++ status = "disabled"; ++}; ++ ++&gmac2io { ++ assigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>; ++ assigned-clock-parents = <&gmac_clk>, <&gmac_clk>; ++ clock_in_out = "input"; ++ phy-handle = <&rtl8211e>; ++ phy-mode = "rgmii"; ++ phy-supply = <&vcc_io>; ++ pinctrl-0 = <&rgmiim1_pins>; ++ pinctrl-names = "default"; ++ snps,aal; ++ rx_delay = <0x18>; ++ tx_delay = <0x24>; ++ status = "okay"; ++ ++ mdio { ++ compatible = "snps,dwmac-mdio"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ rtl8211e: ethernet-phy@1 { ++ reg = <1>; ++ pinctrl-0 = <ð_phy_reset_pin>; ++ pinctrl-names = "default"; ++ reset-assert-us = <10000>; ++ reset-deassert-us = <50000>; ++ reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++}; ++ ++&i2c1 { ++ status = "okay"; ++ ++ rk805: pmic@18 { ++ compatible = "rockchip,rk805"; ++ reg = <0x18>; ++ interrupt-parent = <&gpio1>; ++ interrupts = <24 IRQ_TYPE_LEVEL_LOW>; ++ #clock-cells = <1>; ++ clock-output-names = "xin32k", "rk805-clkout2"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ pinctrl-0 = <&pmic_int_l>; ++ pinctrl-names = "default"; ++ rockchip,system-power-controller; ++ wakeup-source; ++ ++ vcc1-supply = <&vcc_sys>; ++ vcc2-supply = <&vcc_sys>; ++ vcc3-supply = <&vcc_sys>; ++ vcc4-supply = <&vcc_sys>; ++ vcc5-supply = <&vcc_io>; ++ vcc6-supply = <&vcc_sys>; ++ ++ regulators { ++ vdd_log: DCDC_REG1 { ++ regulator-name = "vdd_log"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <712500>; ++ regulator-max-microvolt = <1450000>; ++ regulator-ramp-delay = <12500>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1000000>; ++ }; ++ }; ++ ++ vdd_arm: DCDC_REG2 { ++ regulator-name = "vdd_arm"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <712500>; ++ regulator-max-microvolt = <1450000>; ++ regulator-ramp-delay = <12500>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <950000>; ++ }; ++ }; ++ ++ vcc_ddr: DCDC_REG3 { ++ regulator-name = "vcc_ddr"; ++ regulator-always-on; ++ regulator-boot-on; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ }; ++ }; ++ ++ vcc_io: DCDC_REG4 { ++ regulator-name = "vcc_io"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <3300000>; ++ }; ++ }; ++ ++ vcc_18: LDO_REG1 { ++ regulator-name = "vcc_18"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1800000>; ++ }; ++ }; ++ ++ vcc18_emmc: LDO_REG2 { ++ regulator-name = "vcc18_emmc"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1800000>; ++ }; ++ }; ++ ++ vdd_10: LDO_REG3 { ++ regulator-name = "vdd_10"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1000000>; ++ regulator-max-microvolt = <1000000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1000000>; ++ }; ++ }; ++ }; ++ }; ++}; ++ ++&io_domains { ++ pmuio-supply = <&vcc_io>; ++ vccio1-supply = <&vcc_io>; ++ vccio2-supply = <&vcc18_emmc>; ++ vccio3-supply = <&vcc_io>; ++ vccio4-supply = <&vcc_io>; ++ vccio5-supply = <&vcc_io>; ++ vccio6-supply = <&vcc_io>; ++ status = "okay"; ++}; ++ ++&pinctrl { ++ gmac2io { ++ eth_phy_reset_pin: eth-phy-reset-pin { ++ rockchip,pins = <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>; ++ }; ++ }; ++ ++ leds { ++ lan_led_pin: lan-led-pin { ++ rockchip,pins = <2 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ sys_led_pin: sys-led-pin { ++ rockchip,pins = <3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ wan_led_pin: wan-led-pin { ++ rockchip,pins = <2 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ lan { ++ lan_vdd_pin: lan-vdd-pin { ++ rockchip,pins = <2 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ pmic { ++ pmic_int_l: pmic-int-l { ++ rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++}; ++ ++&pwm2 { ++ status = "okay"; ++}; ++ ++&sdmmc { ++ bus-width = <4>; ++ cap-sd-highspeed; ++ disable-wp; ++ pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>; ++ pinctrl-names = "default"; ++ vmmc-supply = <&vcc_sd>; ++ status = "okay"; ++}; ++ ++&spi0 { ++ status = "okay"; ++ ++ flash@0 { ++ compatible = "jedec,spi-nor"; ++ reg = <0>; ++ spi-max-frequency = <50000000>; ++ }; ++}; ++ ++&tsadc { ++ rockchip,hw-tshut-mode = <0>; ++ rockchip,hw-tshut-polarity = <0>; ++ status = "okay"; ++}; ++ ++&u2phy { ++ status = "okay"; ++}; ++ ++&u2phy_host { ++ status = "okay"; ++}; ++ ++&u2phy_otg { ++ status = "okay"; ++}; ++ ++&uart2 { ++ status = "okay"; ++}; ++ ++&usb20_otg { ++ dr_mode = "host"; ++ status = "okay"; ++}; ++ ++&usb_host0_ehci { ++ status = "okay"; ++}; ++ ++&usb_host0_ohci { ++ status = "okay"; ++}; +--- a/board/rockchip/evb_rk3328/MAINTAINERS ++++ b/board/rockchip/evb_rk3328/MAINTAINERS +@@ -18,6 +18,12 @@ F: configs/nanopi-r2s-rk3328_defcon + F: arch/arm/dts/rk3328-nanopi-r2s-u-boot.dtsi + F: arch/arm/dts/rk3328-nanopi-r2s.dts + ++ORANGEPI-R1-PLUS-RK3328 ++M: Tianling Shen ++S: Maintained ++F: configs/orangepi-r1-plus-rk3328_defconfig ++F: arch/arm/dts/rk3328-orangepi-r1-plus-u-boot.dtsi ++ + ROC-RK3328-CC + M: Loic Devulder + M: Chen-Yu Tsai +--- /dev/null ++++ b/configs/orangepi-r1-plus-rk3328_defconfig +@@ -0,0 +1,98 @@ ++CONFIG_ARM=y ++CONFIG_ARCH_ROCKCHIP=y ++CONFIG_SYS_TEXT_BASE=0x00200000 ++CONFIG_SPL_GPIO_SUPPORT=y ++CONFIG_ENV_OFFSET=0x3F8000 ++CONFIG_ROCKCHIP_RK3328=y ++CONFIG_TPL_ROCKCHIP_COMMON_BOARD=y ++CONFIG_TPL_LIBCOMMON_SUPPORT=y ++CONFIG_TPL_LIBGENERIC_SUPPORT=y ++CONFIG_SPL_DRIVERS_MISC_SUPPORT=y ++CONFIG_SPL_STACK_R_ADDR=0x600000 ++CONFIG_NR_DRAM_BANKS=1 ++CONFIG_DEBUG_UART_BASE=0xFF130000 ++CONFIG_DEBUG_UART_CLOCK=24000000 ++CONFIG_SYSINFO=y ++CONFIG_DEBUG_UART=y ++CONFIG_TPL_SYS_MALLOC_F_LEN=0x800 ++# CONFIG_ANDROID_BOOT_IMAGE is not set ++CONFIG_FIT=y ++CONFIG_FIT_VERBOSE=y ++CONFIG_SPL_LOAD_FIT=y ++CONFIG_DEFAULT_FDT_FILE="rockchip/rk3328-orangepi-r1-plus.dtb" ++CONFIG_MISC_INIT_R=y ++# CONFIG_DISPLAY_CPUINFO is not set ++CONFIG_DISPLAY_BOARDINFO_LATE=y ++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set ++CONFIG_TPL_SYS_MALLOC_SIMPLE=y ++CONFIG_SPL_STACK_R=y ++CONFIG_SPL_I2C_SUPPORT=y ++CONFIG_SPL_POWER_SUPPORT=y ++CONFIG_SPL_ATF=y ++CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y ++CONFIG_CMD_BOOTZ=y ++CONFIG_CMD_GPT=y ++CONFIG_CMD_MMC=y ++CONFIG_CMD_USB=y ++# CONFIG_CMD_SETEXPR is not set ++CONFIG_CMD_TIME=y ++CONFIG_SPL_OF_CONTROL=y ++CONFIG_TPL_OF_CONTROL=y ++CONFIG_DEFAULT_DEVICE_TREE="rk3328-orangepi-r1-plus" ++CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" ++CONFIG_TPL_OF_PLATDATA=y ++CONFIG_ENV_IS_IN_MMC=y ++CONFIG_SYS_RELOC_GD_ENV_ADDR=y ++CONFIG_NET_RANDOM_ETHADDR=y ++CONFIG_TPL_DM=y ++CONFIG_REGMAP=y ++CONFIG_SPL_REGMAP=y ++CONFIG_TPL_REGMAP=y ++CONFIG_SYSCON=y ++CONFIG_SPL_SYSCON=y ++CONFIG_TPL_SYSCON=y ++CONFIG_CLK=y ++CONFIG_SPL_CLK=y ++CONFIG_FASTBOOT_BUF_ADDR=0x800800 ++CONFIG_FASTBOOT_CMD_OEM_FORMAT=y ++CONFIG_ROCKCHIP_GPIO=y ++CONFIG_SYS_I2C_ROCKCHIP=y ++CONFIG_MMC_DW=y ++CONFIG_MMC_DW_ROCKCHIP=y ++CONFIG_SF_DEFAULT_SPEED=20000000 ++CONFIG_DM_ETH=y ++CONFIG_ETH_DESIGNWARE=y ++CONFIG_GMAC_ROCKCHIP=y ++CONFIG_PINCTRL=y ++CONFIG_SPL_PINCTRL=y ++CONFIG_DM_PMIC=y ++CONFIG_PMIC_RK8XX=y ++CONFIG_SPL_DM_REGULATOR=y ++CONFIG_REGULATOR_PWM=y ++CONFIG_DM_REGULATOR_FIXED=y ++CONFIG_SPL_DM_REGULATOR_FIXED=y ++CONFIG_REGULATOR_RK8XX=y ++CONFIG_PWM_ROCKCHIP=y ++CONFIG_RAM=y ++CONFIG_SPL_RAM=y ++CONFIG_TPL_RAM=y ++CONFIG_DM_RESET=y ++CONFIG_BAUDRATE=1500000 ++CONFIG_DEBUG_UART_SHIFT=2 ++CONFIG_SYSRESET=y ++# CONFIG_TPL_SYSRESET is not set ++CONFIG_USB=y ++CONFIG_USB_XHCI_HCD=y ++CONFIG_USB_XHCI_DWC3=y ++CONFIG_USB_EHCI_HCD=y ++CONFIG_USB_EHCI_GENERIC=y ++CONFIG_USB_OHCI_HCD=y ++CONFIG_USB_OHCI_GENERIC=y ++CONFIG_USB_DWC2=y ++CONFIG_USB_DWC3=y ++# CONFIG_USB_DWC3_GADGET is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DWC2_OTG=y ++CONFIG_SPL_TINY_MEMSET=y ++CONFIG_TPL_TINY_MEMSET=y ++CONFIG_ERRNO_STR=y diff --git a/package/boot/uboot-rockchip/patches/104-rockchip-rk3328-Add-support-for-Orange-Pi-R1-Plus-LT.patch b/package/boot/uboot-rockchip/patches/104-rockchip-rk3328-Add-support-for-Orange-Pi-R1-Plus-LT.patch new file mode 100644 index 0000000000..05d569e720 --- /dev/null +++ b/package/boot/uboot-rockchip/patches/104-rockchip-rk3328-Add-support-for-Orange-Pi-R1-Plus-LT.patch @@ -0,0 +1,242 @@ +From 7a9326a96098bc63d2b60538f657c3a533415276 Mon Sep 17 00:00:00 2001 +From: Tianling Shen +Date: Sat, 20 May 2023 18:52:14 +0800 +Subject: [PATCH] rockchip: rk3328: Add support for Orange Pi R1 Plus LTS + +The OrangePi R1 Plus LTS is a minor variant of OrangePi R1 Plus with +the on-board NIC chip changed from rtl8211e to yt8531c, and RAM type +changed from DDR4 to LPDDR3. + +The device tree is taken from kernel v6.4-rc1. + +Signed-off-by: Tianling Shen + +--- + arch/arm/dts/Makefile | 1 + + .../rk3328-orangepi-r1-plus-lts-u-boot.dtsi | 46 +++++++ + arch/arm/dts/rk3328-orangepi-r1-plus-lts.dts | 40 ++++++ + board/rockchip/evb_rk3328/MAINTAINERS | 6 + + configs/orangepi-r1-plus-lts-rk3328_defconfig | 114 ++++++++++++++++++ + 5 files changed, 207 insertions(+) + create mode 100644 arch/arm/dts/rk3328-orangepi-r1-plus-lts-u-boot.dtsi + create mode 100644 arch/arm/dts/rk3328-orangepi-r1-plus-lts.dts + create mode 100644 configs/orangepi-r1-plus-lts-rk3328_defconfig + +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -111,6 +111,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3328) += \ + rk3328-nanopi-r2c.dtb \ + rk3328-nanopi-r2s.dtb \ + rk3328-orangepi-r1-plus.dtb \ ++ rk3328-orangepi-r1-plus-lts.dtb \ + rk3328-roc-cc.dtb \ + rk3328-rock64.dtb \ + rk3328-rock-pi-e.dtb +--- /dev/null ++++ b/arch/arm/dts/rk3328-orangepi-r1-plus-lts-u-boot.dtsi +@@ -0,0 +1,46 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++/* ++ * (C) Copyright 2018-2019 Rockchip Electronics Co., Ltd ++ * (C) Copyright 2020 David Bauer ++ */ ++ ++#include "rk3328-u-boot.dtsi" ++#include "rk3328-sdram-lpddr3-666.dtsi" ++/ { ++ chosen { ++ u-boot,spl-boot-order = "same-as-spl", &sdmmc, &emmc; ++ }; ++}; ++ ++&gpio0 { ++ u-boot,dm-spl; ++}; ++ ++&pinctrl { ++ u-boot,dm-spl; ++}; ++ ++&sdmmc0m1_gpio { ++ u-boot,dm-spl; ++}; ++ ++&pcfg_pull_up_4ma { ++ u-boot,dm-spl; ++}; ++ ++/* Need this and all the pinctrl/gpio stuff above to set pinmux */ ++&vcc_sd { ++ u-boot,dm-spl; ++}; ++ ++&gmac2io { ++ snps,reset-gpio = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; ++ snps,reset-active-low; ++ snps,reset-delays-us = <0 10000 50000>; ++}; ++ ++&spi0 { ++ spi_flash: spiflash@0 { ++ u-boot,dm-pre-reloc; ++ }; ++}; +--- /dev/null ++++ b/arch/arm/dts/rk3328-orangepi-r1-plus-lts.dts +@@ -0,0 +1,40 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT ++/* ++ * Copyright (c) 2016 Xunlong Software. Co., Ltd. ++ * (http://www.orangepi.org) ++ * ++ * Copyright (c) 2021-2023 Tianling Shen ++ */ ++ ++/dts-v1/; ++#include "rk3328-orangepi-r1-plus.dts" ++ ++/ { ++ model = "Xunlong Orange Pi R1 Plus LTS"; ++ compatible = "xunlong,orangepi-r1-plus-lts", "rockchip,rk3328"; ++}; ++ ++&gmac2io { ++ phy-handle = <&yt8531c>; ++ tx_delay = <0x19>; ++ rx_delay = <0x05>; ++ ++ mdio { ++ /delete-node/ ethernet-phy@1; ++ ++ yt8531c: ethernet-phy@0 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <0>; ++ ++ motorcomm,clk-out-frequency-hz = <125000000>; ++ motorcomm,keep-pll-enabled; ++ motorcomm,auto-sleep-disabled; ++ ++ pinctrl-0 = <ð_phy_reset_pin>; ++ pinctrl-names = "default"; ++ reset-assert-us = <15000>; ++ reset-deassert-us = <50000>; ++ reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++}; +--- a/board/rockchip/evb_rk3328/MAINTAINERS ++++ b/board/rockchip/evb_rk3328/MAINTAINERS +@@ -24,6 +24,12 @@ S: Maintained + F: configs/orangepi-r1-plus-rk3328_defconfig + F: arch/arm/dts/rk3328-orangepi-r1-plus-u-boot.dtsi + ++ORANGEPI-R1-PLUS-LTS-RK3328 ++M: Tianling Shen ++S: Maintained ++F: configs/orangepi-r1-plus-lts-rk3328_defconfig ++F: arch/arm/dts/rk3328-orangepi-r1-plus-lts-u-boot.dtsi ++ + ROC-RK3328-CC + M: Loic Devulder + M: Chen-Yu Tsai +--- /dev/null ++++ b/configs/orangepi-r1-plus-lts-rk3328_defconfig +@@ -0,0 +1,98 @@ ++CONFIG_ARM=y ++CONFIG_ARCH_ROCKCHIP=y ++CONFIG_SYS_TEXT_BASE=0x00200000 ++CONFIG_SPL_GPIO_SUPPORT=y ++CONFIG_ENV_OFFSET=0x3F8000 ++CONFIG_ROCKCHIP_RK3328=y ++CONFIG_TPL_ROCKCHIP_COMMON_BOARD=y ++CONFIG_TPL_LIBCOMMON_SUPPORT=y ++CONFIG_TPL_LIBGENERIC_SUPPORT=y ++CONFIG_SPL_DRIVERS_MISC_SUPPORT=y ++CONFIG_SPL_STACK_R_ADDR=0x600000 ++CONFIG_NR_DRAM_BANKS=1 ++CONFIG_DEBUG_UART_BASE=0xFF130000 ++CONFIG_DEBUG_UART_CLOCK=24000000 ++CONFIG_SYSINFO=y ++CONFIG_DEBUG_UART=y ++CONFIG_TPL_SYS_MALLOC_F_LEN=0x800 ++# CONFIG_ANDROID_BOOT_IMAGE is not set ++CONFIG_FIT=y ++CONFIG_FIT_VERBOSE=y ++CONFIG_SPL_LOAD_FIT=y ++CONFIG_DEFAULT_FDT_FILE="rockchip/rk3328-orangepi-r1-plus-lts.dtb" ++CONFIG_MISC_INIT_R=y ++# CONFIG_DISPLAY_CPUINFO is not set ++CONFIG_DISPLAY_BOARDINFO_LATE=y ++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set ++CONFIG_TPL_SYS_MALLOC_SIMPLE=y ++CONFIG_SPL_STACK_R=y ++CONFIG_SPL_I2C_SUPPORT=y ++CONFIG_SPL_POWER_SUPPORT=y ++CONFIG_SPL_ATF=y ++CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y ++CONFIG_CMD_BOOTZ=y ++CONFIG_CMD_GPT=y ++CONFIG_CMD_MMC=y ++CONFIG_CMD_USB=y ++# CONFIG_CMD_SETEXPR is not set ++CONFIG_CMD_TIME=y ++CONFIG_SPL_OF_CONTROL=y ++CONFIG_TPL_OF_CONTROL=y ++CONFIG_DEFAULT_DEVICE_TREE="rk3328-orangepi-r1-plus-lts" ++CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" ++CONFIG_TPL_OF_PLATDATA=y ++CONFIG_ENV_IS_IN_MMC=y ++CONFIG_SYS_RELOC_GD_ENV_ADDR=y ++CONFIG_NET_RANDOM_ETHADDR=y ++CONFIG_TPL_DM=y ++CONFIG_REGMAP=y ++CONFIG_SPL_REGMAP=y ++CONFIG_TPL_REGMAP=y ++CONFIG_SYSCON=y ++CONFIG_SPL_SYSCON=y ++CONFIG_TPL_SYSCON=y ++CONFIG_CLK=y ++CONFIG_SPL_CLK=y ++CONFIG_FASTBOOT_BUF_ADDR=0x800800 ++CONFIG_FASTBOOT_CMD_OEM_FORMAT=y ++CONFIG_ROCKCHIP_GPIO=y ++CONFIG_SYS_I2C_ROCKCHIP=y ++CONFIG_MMC_DW=y ++CONFIG_MMC_DW_ROCKCHIP=y ++CONFIG_SF_DEFAULT_SPEED=20000000 ++CONFIG_DM_ETH=y ++CONFIG_ETH_DESIGNWARE=y ++CONFIG_GMAC_ROCKCHIP=y ++CONFIG_PINCTRL=y ++CONFIG_SPL_PINCTRL=y ++CONFIG_DM_PMIC=y ++CONFIG_PMIC_RK8XX=y ++CONFIG_SPL_DM_REGULATOR=y ++CONFIG_REGULATOR_PWM=y ++CONFIG_DM_REGULATOR_FIXED=y ++CONFIG_SPL_DM_REGULATOR_FIXED=y ++CONFIG_REGULATOR_RK8XX=y ++CONFIG_PWM_ROCKCHIP=y ++CONFIG_RAM=y ++CONFIG_SPL_RAM=y ++CONFIG_TPL_RAM=y ++CONFIG_DM_RESET=y ++CONFIG_BAUDRATE=1500000 ++CONFIG_DEBUG_UART_SHIFT=2 ++CONFIG_SYSRESET=y ++# CONFIG_TPL_SYSRESET is not set ++CONFIG_USB=y ++CONFIG_USB_XHCI_HCD=y ++CONFIG_USB_XHCI_DWC3=y ++CONFIG_USB_EHCI_HCD=y ++CONFIG_USB_EHCI_GENERIC=y ++CONFIG_USB_OHCI_HCD=y ++CONFIG_USB_OHCI_GENERIC=y ++CONFIG_USB_DWC2=y ++CONFIG_USB_DWC3=y ++# CONFIG_USB_DWC3_GADGET is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DWC2_OTG=y ++CONFIG_SPL_TINY_MEMSET=y ++CONFIG_TPL_TINY_MEMSET=y ++CONFIG_ERRNO_STR=y diff --git a/package/boot/uboot-rockchip/patches/105-rockchip-rk3328-Add-support-for-ThinkPenguin-TPE-R1400.patch b/package/boot/uboot-rockchip/patches/105-rockchip-rk3328-Add-support-for-ThinkPenguin-TPE-R1400.patch new file mode 100644 index 0000000000..cfe6e56933 --- /dev/null +++ b/package/boot/uboot-rockchip/patches/105-rockchip-rk3328-Add-support-for-ThinkPenguin-TPE-R1400.patch @@ -0,0 +1,138 @@ +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -114,7 +114,8 @@ dtb-$(CONFIG_ROCKCHIP_RK3328) += \ + rk3328-orangepi-r1-plus-lts.dtb \ + rk3328-roc-cc.dtb \ + rk3328-rock64.dtb \ +- rk3328-rock-pi-e.dtb ++ rk3328-rock-pi-e.dtb \ ++ rk3328-tpe-r1400.dtb + + dtb-$(CONFIG_ROCKCHIP_RK3368) += \ + rk3368-lion-haikou.dtb \ +--- /dev/null ++++ b/arch/arm/dts/rk3328-tpe-r1400-u-boot.dtsi +@@ -0,0 +1,3 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++ ++#include "rk3328-nanopi-r2s-u-boot.dtsi" +--- /dev/null ++++ b/arch/arm/dts/rk3328-tpe-r1400.dts +@@ -0,0 +1,16 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT ++/* ++ * Copyright (c) 2021 FriendlyElec Computer Tech. Co., Ltd. ++ * (http://www.friendlyarm.com) ++ * ++ * Copyright (c) 2021-2023 Tianling Shen ++ */ ++ ++ ++/dts-v1/; ++#include "rk3328-nanopi-r2s.dts" ++ ++/ { ++ model = "ThinkPenguin TPE-R1400"; ++ compatible = "thinkpenguin,tpe-r1400", "rockchip,rk3328"; ++}; +--- /dev/null ++++ b/configs/tpe-r1400-rk3328_defconfig +@@ -0,0 +1,98 @@ ++CONFIG_ARM=y ++CONFIG_ARCH_ROCKCHIP=y ++CONFIG_SYS_TEXT_BASE=0x00200000 ++CONFIG_SPL_GPIO_SUPPORT=y ++CONFIG_NR_DRAM_BANKS=1 ++CONFIG_ENV_OFFSET=0x3F8000 ++CONFIG_DEFAULT_DEVICE_TREE="rk3328-nanopi-r2s" ++CONFIG_ROCKCHIP_RK3328=y ++CONFIG_TPL_ROCKCHIP_COMMON_BOARD=y ++CONFIG_TPL_LIBCOMMON_SUPPORT=y ++CONFIG_TPL_LIBGENERIC_SUPPORT=y ++CONFIG_SPL_DRIVERS_MISC_SUPPORT=y ++CONFIG_SPL_STACK_R_ADDR=0x600000 ++CONFIG_DEBUG_UART_BASE=0xFF130000 ++CONFIG_DEBUG_UART_CLOCK=24000000 ++CONFIG_DEBUG_UART=y ++CONFIG_TPL_SYS_MALLOC_F_LEN=0x800 ++# CONFIG_ANDROID_BOOT_IMAGE is not set ++CONFIG_FIT=y ++CONFIG_FIT_VERBOSE=y ++CONFIG_SPL_LOAD_FIT=y ++CONFIG_DEFAULT_FDT_FILE="rockchip/rk3328-nanopi-r2s.dtb" ++# CONFIG_DISPLAY_CPUINFO is not set ++CONFIG_DISPLAY_BOARDINFO_LATE=y ++CONFIG_MISC_INIT_R=y ++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set ++CONFIG_TPL_SYS_MALLOC_SIMPLE=y ++CONFIG_SPL_STACK_R=y ++CONFIG_SPL_I2C_SUPPORT=y ++CONFIG_SPL_POWER_SUPPORT=y ++CONFIG_SPL_ATF=y ++CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y ++CONFIG_CMD_BOOTZ=y ++CONFIG_CMD_GPT=y ++CONFIG_CMD_MMC=y ++CONFIG_CMD_USB=y ++# CONFIG_CMD_SETEXPR is not set ++CONFIG_CMD_TIME=y ++CONFIG_SPL_OF_CONTROL=y ++CONFIG_TPL_OF_CONTROL=y ++CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" ++CONFIG_TPL_OF_PLATDATA=y ++CONFIG_ENV_IS_IN_MMC=y ++CONFIG_SYS_RELOC_GD_ENV_ADDR=y ++CONFIG_NET_RANDOM_ETHADDR=y ++CONFIG_TPL_DM=y ++CONFIG_REGMAP=y ++CONFIG_SPL_REGMAP=y ++CONFIG_TPL_REGMAP=y ++CONFIG_SYSCON=y ++CONFIG_SPL_SYSCON=y ++CONFIG_TPL_SYSCON=y ++CONFIG_CLK=y ++CONFIG_SPL_CLK=y ++CONFIG_FASTBOOT_BUF_ADDR=0x800800 ++CONFIG_FASTBOOT_CMD_OEM_FORMAT=y ++CONFIG_ROCKCHIP_GPIO=y ++CONFIG_SYS_I2C_ROCKCHIP=y ++CONFIG_MMC_DW=y ++CONFIG_MMC_DW_ROCKCHIP=y ++CONFIG_SF_DEFAULT_SPEED=20000000 ++CONFIG_DM_ETH=y ++CONFIG_ETH_DESIGNWARE=y ++CONFIG_GMAC_ROCKCHIP=y ++CONFIG_PINCTRL=y ++CONFIG_SPL_PINCTRL=y ++CONFIG_DM_PMIC=y ++CONFIG_PMIC_RK8XX=y ++CONFIG_SPL_DM_REGULATOR=y ++CONFIG_REGULATOR_PWM=y ++CONFIG_DM_REGULATOR_FIXED=y ++CONFIG_SPL_DM_REGULATOR_FIXED=y ++CONFIG_REGULATOR_RK8XX=y ++CONFIG_PWM_ROCKCHIP=y ++CONFIG_RAM=y ++CONFIG_SPL_RAM=y ++CONFIG_TPL_RAM=y ++CONFIG_DM_RESET=y ++CONFIG_BAUDRATE=1500000 ++CONFIG_DEBUG_UART_SHIFT=2 ++CONFIG_SYSINFO=y ++CONFIG_SYSRESET=y ++# CONFIG_TPL_SYSRESET is not set ++CONFIG_USB=y ++CONFIG_USB_XHCI_HCD=y ++CONFIG_USB_XHCI_DWC3=y ++CONFIG_USB_EHCI_HCD=y ++CONFIG_USB_EHCI_GENERIC=y ++CONFIG_USB_OHCI_HCD=y ++CONFIG_USB_OHCI_GENERIC=y ++CONFIG_USB_DWC2=y ++CONFIG_USB_DWC3=y ++# CONFIG_USB_DWC3_GADGET is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DWC2_OTG=y ++CONFIG_SPL_TINY_MEMSET=y ++CONFIG_TPL_TINY_MEMSET=y ++CONFIG_ERRNO_STR=y diff --git a/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-decl.h b/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-decl.h new file mode 100644 index 0000000000..0919e4ed53 --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-decl.h @@ -0,0 +1,23 @@ +/* + * DO NOT MODIFY + * + * Declares externs for all device/uclass instances. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +#include +#include + +/* driver declarations - these allow DM_DRIVER_GET() to be used */ +extern U_BOOT_DRIVER(rockchip_rk3328_cru); +extern U_BOOT_DRIVER(rockchip_rk3328_dmc); +extern U_BOOT_DRIVER(rockchip_rk3288_dw_mshc); +extern U_BOOT_DRIVER(ns16550_serial); +extern U_BOOT_DRIVER(rockchip_rk3328_grf); + +/* uclass driver declarations - needed for DM_UCLASS_DRIVER_REF() */ +extern UCLASS_DRIVER(clk); +extern UCLASS_DRIVER(mmc); +extern UCLASS_DRIVER(ram); +extern UCLASS_DRIVER(serial); +extern UCLASS_DRIVER(syscon); diff --git a/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-plat.c b/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-plat.c new file mode 100644 index 0000000000..e5b330c9d9 --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-plat.c @@ -0,0 +1,155 @@ +/* + * DO NOT MODIFY + * + * Declares the U_BOOT_DRIVER() records and platform data. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +/* Allow use of U_BOOT_DRVINFO() in this file */ +#define DT_PLAT_C + +#include +#include +#include + +/* + * driver_info declarations, ordered by 'struct driver_info' linker_list idx: + * + * idx driver_info driver + * --- -------------------- -------------------- + * 0: clock_controller_at_ff440000 rockchip_rk3328_cru + * 1: dmc rockchip_rk3328_dmc + * 2: mmc_at_ff500000 rockchip_rk3288_dw_mshc + * 3: serial_at_ff130000 ns16550_serial + * 4: syscon_at_ff100000 rockchip_rk3328_grf + * --- -------------------- -------------------- + */ + +/* + * Node /clock-controller@ff440000 index 0 + * driver rockchip_rk3328_cru parent None + */ +static struct dtd_rockchip_rk3328_cru dtv_clock_controller_at_ff440000 = { + .reg = {0xff440000, 0x1000}, + .rockchip_grf = 0x3a, +}; +U_BOOT_DRVINFO(clock_controller_at_ff440000) = { + .name = "rockchip_rk3328_cru", + .plat = &dtv_clock_controller_at_ff440000, + .plat_size = sizeof(dtv_clock_controller_at_ff440000), + .parent_idx = -1, +}; + +/* + * Node /dmc index 1 + * driver rockchip_rk3328_dmc parent None + */ +static struct dtd_rockchip_rk3328_dmc dtv_dmc = { + .reg = {0xff400000, 0x1000, 0xff780000, 0x3000, 0xff100000, 0x1000, 0xff440000, 0x1000, + 0xff720000, 0x1000, 0xff798000, 0x1000}, + .rockchip_sdram_params = {0x1, 0xa, 0x2, 0x1, 0x0, 0x0, 0x11, 0x0, + 0x11, 0x0, 0x0, 0x94291288, 0x0, 0x27, 0x462, 0x15, + 0x242, 0xff, 0x14d, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x43049010, 0x64, 0x28003b, 0xd0, 0x20053, 0xd4, 0x220000, 0xd8, + 0x100, 0xdc, 0x40000, 0xe0, 0x0, 0xe4, 0x110000, 0xe8, + 0x420, 0xec, 0x400, 0xf4, 0xf011f, 0x100, 0x9060b06, 0x104, + 0x20209, 0x108, 0x505040a, 0x10c, 0x40400c, 0x110, 0x5030206, 0x114, + 0x3030202, 0x120, 0x3030b03, 0x124, 0x20208, 0x180, 0x1000040, 0x184, + 0x0, 0x190, 0x7030003, 0x198, 0x5001100, 0x1a0, 0xc0400003, 0x240, + 0x6000604, 0x244, 0x201, 0x250, 0xf00, 0x490, 0x1, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0x4, 0xc, 0x28, 0xa, 0x2c, + 0x0, 0x30, 0x9, 0xffffffff, 0xffffffff, 0x77, 0x88, 0x79, + 0x79, 0x87, 0x97, 0x87, 0x78, 0x77, 0x78, 0x87, + 0x88, 0x87, 0x87, 0x77, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x69, 0x9, 0x77, + 0x78, 0x77, 0x78, 0x77, 0x78, 0x77, 0x78, 0x77, + 0x79, 0x9, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x69, 0x9, 0x77, 0x78, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0x9, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x69, 0x9, 0x77, 0x78, 0x77, 0x78, 0x77, + 0x78, 0x77, 0x78, 0x77, 0x79, 0x9, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x69, + 0x9, 0x77, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x79, 0x9}, +}; +U_BOOT_DRVINFO(dmc) = { + .name = "rockchip_rk3328_dmc", + .plat = &dtv_dmc, + .plat_size = sizeof(dtv_dmc), + .parent_idx = -1, +}; + +/* + * Node /mmc@ff500000 index 2 + * driver rockchip_rk3288_dw_mshc parent None + */ +static struct dtd_rockchip_rk3288_dw_mshc dtv_mmc_at_ff500000 = { + .bus_width = 0x4, + .cap_sd_highspeed = true, + .clocks = { + {0, {317}}, + {0, {33}}, + {0, {74}}, + {0, {78}},}, + .disable_wp = true, + .fifo_depth = 0x100, + .interrupts = {0x0, 0xc, 0x4}, + .max_frequency = 0x8f0d180, + .pinctrl_0 = {0x47, 0x48, 0x49, 0x4a}, + .pinctrl_names = "default", + .reg = {0xff500000, 0x4000}, + .sd_uhs_sdr104 = true, + .sd_uhs_sdr12 = true, + .sd_uhs_sdr25 = true, + .sd_uhs_sdr50 = true, + .u_boot_spl_fifo_mode = true, + .vmmc_supply = 0x4b, + .vqmmc_supply = 0x1e, +}; +U_BOOT_DRVINFO(mmc_at_ff500000) = { + .name = "rockchip_rk3288_dw_mshc", + .plat = &dtv_mmc_at_ff500000, + .plat_size = sizeof(dtv_mmc_at_ff500000), + .parent_idx = -1, +}; + +/* + * Node /serial@ff130000 index 3 + * driver ns16550_serial parent None + */ +static struct dtd_ns16550_serial dtv_serial_at_ff130000 = { + .clock_frequency = 0x16e3600, + .clocks = { + {0, {40}}, + {0, {212}},}, + .dma_names = {"tx", "rx"}, + .dmas = {0x10, 0x6, 0x10, 0x7}, + .interrupts = {0x0, 0x39, 0x4}, + .pinctrl_0 = 0x26, + .pinctrl_names = "default", + .reg = {0xff130000, 0x100}, + .reg_io_width = 0x4, + .reg_shift = 0x2, +}; +U_BOOT_DRVINFO(serial_at_ff130000) = { + .name = "ns16550_serial", + .plat = &dtv_serial_at_ff130000, + .plat_size = sizeof(dtv_serial_at_ff130000), + .parent_idx = -1, +}; + +/* + * Node /syscon@ff100000 index 4 + * driver rockchip_rk3328_grf parent None + */ +static struct dtd_rockchip_rk3328_grf dtv_syscon_at_ff100000 = { + .reg = {0xff100000, 0x1000}, +}; +U_BOOT_DRVINFO(syscon_at_ff100000) = { + .name = "rockchip_rk3328_grf", + .plat = &dtv_syscon_at_ff100000, + .plat_size = sizeof(dtv_syscon_at_ff100000), + .parent_idx = -1, +}; + diff --git a/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-structs-gen.h b/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-structs-gen.h new file mode 100644 index 0000000000..b1ff08a927 --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2c-rk3328/dt-structs-gen.h @@ -0,0 +1,51 @@ +/* + * DO NOT MODIFY + * + * Defines the structs used to hold devicetree data. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +#include +#include +struct dtd_ns16550_serial { + fdt32_t clock_frequency; + struct phandle_1_arg clocks[2]; + const char * dma_names[2]; + fdt32_t dmas[4]; + fdt32_t interrupts[3]; + fdt32_t pinctrl_0; + const char * pinctrl_names; + fdt64_t reg[2]; + fdt32_t reg_io_width; + fdt32_t reg_shift; +}; +struct dtd_rockchip_rk3288_dw_mshc { + fdt32_t bus_width; + bool cap_sd_highspeed; + struct phandle_1_arg clocks[4]; + bool disable_wp; + fdt32_t fifo_depth; + fdt32_t interrupts[3]; + fdt32_t max_frequency; + fdt32_t pinctrl_0[4]; + const char * pinctrl_names; + fdt64_t reg[2]; + bool sd_uhs_sdr104; + bool sd_uhs_sdr12; + bool sd_uhs_sdr25; + bool sd_uhs_sdr50; + bool u_boot_spl_fifo_mode; + fdt32_t vmmc_supply; + fdt32_t vqmmc_supply; +}; +struct dtd_rockchip_rk3328_cru { + fdt64_t reg[2]; + fdt32_t rockchip_grf; +}; +struct dtd_rockchip_rk3328_dmc { + fdt64_t reg[12]; + fdt32_t rockchip_sdram_params[196]; +}; +struct dtd_rockchip_rk3328_grf { + fdt64_t reg[2]; +}; diff --git a/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-decl.h b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-decl.h new file mode 100644 index 0000000000..75795aa6cc --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-decl.h @@ -0,0 +1,24 @@ +/* + * DO NOT MODIFY + * + * Declares externs for all device/uclass instances. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +#include +#include + +/* driver declarations - these allow DM_DRIVER_GET() to be used */ +extern U_BOOT_DRIVER(rockchip_rk3328_cru); +extern U_BOOT_DRIVER(rockchip_rk3328_dmc); +extern U_BOOT_DRIVER(rockchip_rk3288_dw_mshc); +extern U_BOOT_DRIVER(ns16550_serial); +extern U_BOOT_DRIVER(rockchip_rk3328_spi); +extern U_BOOT_DRIVER(rockchip_rk3328_grf); + +/* uclass driver declarations - needed for DM_UCLASS_DRIVER_REF() */ +extern UCLASS_DRIVER(clk); +extern UCLASS_DRIVER(mmc); +extern UCLASS_DRIVER(ram); +extern UCLASS_DRIVER(serial); +extern UCLASS_DRIVER(syscon); diff --git a/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-plat.c b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-plat.c new file mode 100644 index 0000000000..12081b19e0 --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-plat.c @@ -0,0 +1,170 @@ +/* + * DO NOT MODIFY + * + * Declares the U_BOOT_DRIVER() records and platform data. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +/* Allow use of U_BOOT_DRVINFO() in this file */ +#define DT_PLAT_C + +#include +#include +#include + +/* + * driver_info declarations, ordered by 'struct driver_info' linker_list idx: + * + * idx driver_info driver + * --- -------------------- -------------------- + * 0: clock_controller_at_ff440000 rockchip_rk3328_cru + * 1: dmc rockchip_rk3328_dmc + * 2: mmc_at_ff500000 rockchip_rk3288_dw_mshc + * 3: serial_at_ff130000 ns16550_serial + * 4: spi_at_ff190000 rockchip_rk3328_spi + * 5: syscon_at_ff100000 rockchip_rk3328_grf + * --- -------------------- -------------------- + */ + +/* + * Node /clock-controller@ff440000 index 0 + * driver rockchip_rk3328_cru parent None + */ +static struct dtd_rockchip_rk3328_cru dtv_clock_controller_at_ff440000 = { + .reg = {0xff440000, 0x1000}, + .rockchip_grf = 0x38, +}; +U_BOOT_DRVINFO(clock_controller_at_ff440000) = { + .name = "rockchip_rk3328_cru", + .plat = &dtv_clock_controller_at_ff440000, + .plat_size = sizeof(dtv_clock_controller_at_ff440000), + .parent_idx = -1, +}; + +/* + * Node /dmc index 1 + * driver rockchip_rk3328_dmc parent None + */ +static struct dtd_rockchip_rk3328_dmc dtv_dmc = { + .reg = {0xff400000, 0x1000, 0xff780000, 0x3000, 0xff100000, 0x1000, 0xff440000, 0x1000, + 0xff720000, 0x1000, 0xff798000, 0x1000}, + .rockchip_sdram_params = {0x1, 0xc, 0x3, 0x1, 0x0, 0x0, 0x10, 0x10, + 0x10, 0x10, 0x0, 0x8c48a18a, 0x0, 0x21, 0x482, 0x15, + 0x21a, 0xff, 0x14d, 0x6, 0x1, 0x0, 0x0, 0x0, + 0x43041008, 0x64, 0x140023, 0xd0, 0x220002, 0xd4, 0x10000, 0xd8, + 0x703, 0xdc, 0x830004, 0xe0, 0x10000, 0xe4, 0x70003, 0xf4, + 0xf011f, 0x100, 0x6090b07, 0x104, 0x2020b, 0x108, 0x2030506, 0x10c, + 0x505000, 0x110, 0x3020204, 0x114, 0x1010303, 0x118, 0x2020003, 0x120, + 0x303, 0x138, 0x25, 0x180, 0x3c000f, 0x184, 0x900000, 0x190, + 0x7020000, 0x198, 0x5001100, 0x1a0, 0xc0400003, 0x240, 0x900090c, 0x244, + 0x101, 0x250, 0xf00, 0x490, 0x1, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0x4, 0xb, 0x28, 0x6, 0x2c, + 0x0, 0x30, 0x3, 0xffffffff, 0xffffffff, 0x77, 0x88, 0x79, + 0x79, 0x87, 0x97, 0x87, 0x78, 0x77, 0x78, 0x87, + 0x88, 0x87, 0x87, 0x77, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x69, 0x9, 0x77, + 0x78, 0x77, 0x78, 0x77, 0x78, 0x77, 0x78, 0x77, + 0x79, 0x9, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x69, 0x9, 0x77, 0x78, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0x9, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x69, 0x9, 0x77, 0x78, 0x77, 0x78, 0x77, + 0x78, 0x77, 0x78, 0x77, 0x79, 0x9, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x69, + 0x9, 0x77, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x79, 0x9}, +}; +U_BOOT_DRVINFO(dmc) = { + .name = "rockchip_rk3328_dmc", + .plat = &dtv_dmc, + .plat_size = sizeof(dtv_dmc), + .parent_idx = -1, +}; + +/* + * Node /mmc@ff500000 index 2 + * driver rockchip_rk3288_dw_mshc parent None + */ +static struct dtd_rockchip_rk3288_dw_mshc dtv_mmc_at_ff500000 = { + .bus_width = 0x4, + .cap_sd_highspeed = true, + .clocks = { + {0, {317}}, + {0, {33}}, + {0, {74}}, + {0, {78}},}, + .disable_wp = true, + .fifo_depth = 0x100, + .interrupts = {0x0, 0xc, 0x4}, + .max_frequency = 0x8f0d180, + .pinctrl_0 = {0x45, 0x46, 0x47, 0x48}, + .pinctrl_names = "default", + .reg = {0xff500000, 0x4000}, + .u_boot_spl_fifo_mode = true, + .vmmc_supply = 0x49, +}; +U_BOOT_DRVINFO(mmc_at_ff500000) = { + .name = "rockchip_rk3288_dw_mshc", + .plat = &dtv_mmc_at_ff500000, + .plat_size = sizeof(dtv_mmc_at_ff500000), + .parent_idx = -1, +}; + +/* + * Node /serial@ff130000 index 3 + * driver ns16550_serial parent None + */ +static struct dtd_ns16550_serial dtv_serial_at_ff130000 = { + .clock_frequency = 0x16e3600, + .clocks = { + {0, {40}}, + {0, {212}},}, + .dma_names = {"tx", "rx"}, + .dmas = {0x10, 0x6, 0x10, 0x7}, + .interrupts = {0x0, 0x39, 0x4}, + .pinctrl_0 = 0x24, + .pinctrl_names = "default", + .reg = {0xff130000, 0x100}, + .reg_io_width = 0x4, + .reg_shift = 0x2, +}; +U_BOOT_DRVINFO(serial_at_ff130000) = { + .name = "ns16550_serial", + .plat = &dtv_serial_at_ff130000, + .plat_size = sizeof(dtv_serial_at_ff130000), + .parent_idx = -1, +}; + +/* Node /spi@ff190000 index 4 */ +static struct dtd_rockchip_rk3328_spi dtv_spi_at_ff190000 = { + .clocks = { + {0, {32}}, + {0, {209}},}, + .dma_names = {"tx", "rx"}, + .dmas = {0x10, 0x8, 0x10, 0x9}, + .interrupts = {0x0, 0x31, 0x4}, + .pinctrl_0 = {0x2c, 0x2d, 0x2e, 0x2f}, + .pinctrl_names = "default", + .reg = {0xff190000, 0x1000}, +}; +U_BOOT_DRVINFO(spi_at_ff190000) = { + .name = "rockchip_rk3328_spi", + .plat = &dtv_spi_at_ff190000, + .plat_size = sizeof(dtv_spi_at_ff190000), + .parent_idx = -1, +}; + +/* + * Node /syscon@ff100000 index 5 + * driver rockchip_rk3328_grf parent None + */ +static struct dtd_rockchip_rk3328_grf dtv_syscon_at_ff100000 = { + .reg = {0xff100000, 0x1000}, +}; +U_BOOT_DRVINFO(syscon_at_ff100000) = { + .name = "rockchip_rk3328_grf", + .plat = &dtv_syscon_at_ff100000, + .plat_size = sizeof(dtv_syscon_at_ff100000), + .parent_idx = -1, +}; + diff --git a/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-structs-gen.h b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-structs-gen.h new file mode 100644 index 0000000000..d095831531 --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-lts-rk3328/dt-structs-gen.h @@ -0,0 +1,55 @@ +/* + * DO NOT MODIFY + * + * Defines the structs used to hold devicetree data. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +#include +#include +struct dtd_ns16550_serial { + fdt32_t clock_frequency; + struct phandle_1_arg clocks[2]; + const char * dma_names[2]; + fdt32_t dmas[4]; + fdt32_t interrupts[3]; + fdt32_t pinctrl_0; + const char * pinctrl_names; + fdt64_t reg[2]; + fdt32_t reg_io_width; + fdt32_t reg_shift; +}; +struct dtd_rockchip_rk3288_dw_mshc { + fdt32_t bus_width; + bool cap_sd_highspeed; + struct phandle_1_arg clocks[4]; + bool disable_wp; + fdt32_t fifo_depth; + fdt32_t interrupts[3]; + fdt32_t max_frequency; + fdt32_t pinctrl_0[4]; + const char * pinctrl_names; + fdt64_t reg[2]; + bool u_boot_spl_fifo_mode; + fdt32_t vmmc_supply; +}; +struct dtd_rockchip_rk3328_cru { + fdt64_t reg[2]; + fdt32_t rockchip_grf; +}; +struct dtd_rockchip_rk3328_dmc { + fdt64_t reg[12]; + fdt32_t rockchip_sdram_params[196]; +}; +struct dtd_rockchip_rk3328_grf { + fdt64_t reg[2]; +}; +struct dtd_rockchip_rk3328_spi { + struct phandle_1_arg clocks[2]; + const char * dma_names[2]; + fdt32_t dmas[4]; + fdt32_t interrupts[3]; + fdt32_t pinctrl_0[4]; + const char * pinctrl_names; + fdt64_t reg[2]; +}; diff --git a/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-decl.h b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-decl.h new file mode 100644 index 0000000000..75795aa6cc --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-decl.h @@ -0,0 +1,24 @@ +/* + * DO NOT MODIFY + * + * Declares externs for all device/uclass instances. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +#include +#include + +/* driver declarations - these allow DM_DRIVER_GET() to be used */ +extern U_BOOT_DRIVER(rockchip_rk3328_cru); +extern U_BOOT_DRIVER(rockchip_rk3328_dmc); +extern U_BOOT_DRIVER(rockchip_rk3288_dw_mshc); +extern U_BOOT_DRIVER(ns16550_serial); +extern U_BOOT_DRIVER(rockchip_rk3328_spi); +extern U_BOOT_DRIVER(rockchip_rk3328_grf); + +/* uclass driver declarations - needed for DM_UCLASS_DRIVER_REF() */ +extern UCLASS_DRIVER(clk); +extern UCLASS_DRIVER(mmc); +extern UCLASS_DRIVER(ram); +extern UCLASS_DRIVER(serial); +extern UCLASS_DRIVER(syscon); diff --git a/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c new file mode 100644 index 0000000000..90656fc306 --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c @@ -0,0 +1,170 @@ +/* + * DO NOT MODIFY + * + * Declares the U_BOOT_DRIVER() records and platform data. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +/* Allow use of U_BOOT_DRVINFO() in this file */ +#define DT_PLAT_C + +#include +#include +#include + +/* + * driver_info declarations, ordered by 'struct driver_info' linker_list idx: + * + * idx driver_info driver + * --- -------------------- -------------------- + * 0: clock_controller_at_ff440000 rockchip_rk3328_cru + * 1: dmc rockchip_rk3328_dmc + * 2: mmc_at_ff500000 rockchip_rk3288_dw_mshc + * 3: serial_at_ff130000 ns16550_serial + * 4: spi_at_ff190000 rockchip_rk3328_spi + * 5: syscon_at_ff100000 rockchip_rk3328_grf + * --- -------------------- -------------------- + */ + +/* + * Node /clock-controller@ff440000 index 0 + * driver rockchip_rk3328_cru parent None + */ +static struct dtd_rockchip_rk3328_cru dtv_clock_controller_at_ff440000 = { + .reg = {0xff440000, 0x1000}, + .rockchip_grf = 0x38, +}; +U_BOOT_DRVINFO(clock_controller_at_ff440000) = { + .name = "rockchip_rk3328_cru", + .plat = &dtv_clock_controller_at_ff440000, + .plat_size = sizeof(dtv_clock_controller_at_ff440000), + .parent_idx = -1, +}; + +/* + * Node /dmc index 1 + * driver rockchip_rk3328_dmc parent None + */ +static struct dtd_rockchip_rk3328_dmc dtv_dmc = { + .reg = {0xff400000, 0x1000, 0xff780000, 0x3000, 0xff100000, 0x1000, 0xff440000, 0x1000, + 0xff720000, 0x1000, 0xff798000, 0x1000}, + .rockchip_sdram_params = {0x1, 0xa, 0x2, 0x1, 0x0, 0x0, 0x11, 0x0, + 0x11, 0x0, 0x0, 0x94291288, 0x0, 0x27, 0x462, 0x15, + 0x242, 0xff, 0x14d, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x43049010, 0x64, 0x28003b, 0xd0, 0x20053, 0xd4, 0x220000, 0xd8, + 0x100, 0xdc, 0x40000, 0xe0, 0x0, 0xe4, 0x110000, 0xe8, + 0x420, 0xec, 0x400, 0xf4, 0xf011f, 0x100, 0x9060b06, 0x104, + 0x20209, 0x108, 0x505040a, 0x10c, 0x40400c, 0x110, 0x5030206, 0x114, + 0x3030202, 0x120, 0x3030b03, 0x124, 0x20208, 0x180, 0x1000040, 0x184, + 0x0, 0x190, 0x7030003, 0x198, 0x5001100, 0x1a0, 0xc0400003, 0x240, + 0x6000604, 0x244, 0x201, 0x250, 0xf00, 0x490, 0x1, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0x4, 0xc, 0x28, 0xa, 0x2c, + 0x0, 0x30, 0x9, 0xffffffff, 0xffffffff, 0x77, 0x88, 0x79, + 0x79, 0x87, 0x97, 0x87, 0x78, 0x77, 0x78, 0x87, + 0x88, 0x87, 0x87, 0x77, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x69, 0x9, 0x77, + 0x78, 0x77, 0x78, 0x77, 0x78, 0x77, 0x78, 0x77, + 0x79, 0x9, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x69, 0x9, 0x77, 0x78, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0x9, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x69, 0x9, 0x77, 0x78, 0x77, 0x78, 0x77, + 0x78, 0x77, 0x78, 0x77, 0x79, 0x9, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x69, + 0x9, 0x77, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x79, 0x9}, +}; +U_BOOT_DRVINFO(dmc) = { + .name = "rockchip_rk3328_dmc", + .plat = &dtv_dmc, + .plat_size = sizeof(dtv_dmc), + .parent_idx = -1, +}; + +/* + * Node /mmc@ff500000 index 2 + * driver rockchip_rk3288_dw_mshc parent None + */ +static struct dtd_rockchip_rk3288_dw_mshc dtv_mmc_at_ff500000 = { + .bus_width = 0x4, + .cap_sd_highspeed = true, + .clocks = { + {0, {317}}, + {0, {33}}, + {0, {74}}, + {0, {78}},}, + .disable_wp = true, + .fifo_depth = 0x100, + .interrupts = {0x0, 0xc, 0x4}, + .max_frequency = 0x8f0d180, + .pinctrl_0 = {0x45, 0x46, 0x47, 0x48}, + .pinctrl_names = "default", + .reg = {0xff500000, 0x4000}, + .u_boot_spl_fifo_mode = true, + .vmmc_supply = 0x49, +}; +U_BOOT_DRVINFO(mmc_at_ff500000) = { + .name = "rockchip_rk3288_dw_mshc", + .plat = &dtv_mmc_at_ff500000, + .plat_size = sizeof(dtv_mmc_at_ff500000), + .parent_idx = -1, +}; + +/* + * Node /serial@ff130000 index 3 + * driver ns16550_serial parent None + */ +static struct dtd_ns16550_serial dtv_serial_at_ff130000 = { + .clock_frequency = 0x16e3600, + .clocks = { + {0, {40}}, + {0, {212}},}, + .dma_names = {"tx", "rx"}, + .dmas = {0x10, 0x6, 0x10, 0x7}, + .interrupts = {0x0, 0x39, 0x4}, + .pinctrl_0 = 0x24, + .pinctrl_names = "default", + .reg = {0xff130000, 0x100}, + .reg_io_width = 0x4, + .reg_shift = 0x2, +}; +U_BOOT_DRVINFO(serial_at_ff130000) = { + .name = "ns16550_serial", + .plat = &dtv_serial_at_ff130000, + .plat_size = sizeof(dtv_serial_at_ff130000), + .parent_idx = -1, +}; + +/* Node /spi@ff190000 index 4 */ +static struct dtd_rockchip_rk3328_spi dtv_spi_at_ff190000 = { + .clocks = { + {0, {32}}, + {0, {209}},}, + .dma_names = {"tx", "rx"}, + .dmas = {0x10, 0x8, 0x10, 0x9}, + .interrupts = {0x0, 0x31, 0x4}, + .pinctrl_0 = {0x2c, 0x2d, 0x2e, 0x2f}, + .pinctrl_names = "default", + .reg = {0xff190000, 0x1000}, +}; +U_BOOT_DRVINFO(spi_at_ff190000) = { + .name = "rockchip_rk3328_spi", + .plat = &dtv_spi_at_ff190000, + .plat_size = sizeof(dtv_spi_at_ff190000), + .parent_idx = -1, +}; + +/* + * Node /syscon@ff100000 index 5 + * driver rockchip_rk3328_grf parent None + */ +static struct dtd_rockchip_rk3328_grf dtv_syscon_at_ff100000 = { + .reg = {0xff100000, 0x1000}, +}; +U_BOOT_DRVINFO(syscon_at_ff100000) = { + .name = "rockchip_rk3328_grf", + .plat = &dtv_syscon_at_ff100000, + .plat_size = sizeof(dtv_syscon_at_ff100000), + .parent_idx = -1, +}; + diff --git a/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h new file mode 100644 index 0000000000..d095831531 --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h @@ -0,0 +1,55 @@ +/* + * DO NOT MODIFY + * + * Defines the structs used to hold devicetree data. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +#include +#include +struct dtd_ns16550_serial { + fdt32_t clock_frequency; + struct phandle_1_arg clocks[2]; + const char * dma_names[2]; + fdt32_t dmas[4]; + fdt32_t interrupts[3]; + fdt32_t pinctrl_0; + const char * pinctrl_names; + fdt64_t reg[2]; + fdt32_t reg_io_width; + fdt32_t reg_shift; +}; +struct dtd_rockchip_rk3288_dw_mshc { + fdt32_t bus_width; + bool cap_sd_highspeed; + struct phandle_1_arg clocks[4]; + bool disable_wp; + fdt32_t fifo_depth; + fdt32_t interrupts[3]; + fdt32_t max_frequency; + fdt32_t pinctrl_0[4]; + const char * pinctrl_names; + fdt64_t reg[2]; + bool u_boot_spl_fifo_mode; + fdt32_t vmmc_supply; +}; +struct dtd_rockchip_rk3328_cru { + fdt64_t reg[2]; + fdt32_t rockchip_grf; +}; +struct dtd_rockchip_rk3328_dmc { + fdt64_t reg[12]; + fdt32_t rockchip_sdram_params[196]; +}; +struct dtd_rockchip_rk3328_grf { + fdt64_t reg[2]; +}; +struct dtd_rockchip_rk3328_spi { + struct phandle_1_arg clocks[2]; + const char * dma_names[2]; + fdt32_t dmas[4]; + fdt32_t interrupts[3]; + fdt32_t pinctrl_0[4]; + const char * pinctrl_names; + fdt64_t reg[2]; +}; diff --git a/package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-decl.h b/package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-decl.h new file mode 100644 index 0000000000..72675609cd --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-decl.h @@ -0,0 +1,24 @@ +/* + * DO NOT MODIFY + * + * Declares externs for all device/uclass instances. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +#include +#include + +/* driver declarations - these allow DM_DRIVER_GET() to be used */ +extern U_BOOT_DRIVER(rockchip_rk3328_cru); +extern U_BOOT_DRIVER(rockchip_rk3328_dmc); +extern U_BOOT_DRIVER(rockchip_rk3288_dw_mshc); +extern U_BOOT_DRIVER(rockchip_rk3288_dw_mshc); +extern U_BOOT_DRIVER(ns16550_serial); +extern U_BOOT_DRIVER(rockchip_rk3328_grf); + +/* uclass driver declarations - needed for DM_UCLASS_DRIVER_REF() */ +extern UCLASS_DRIVER(clk); +extern UCLASS_DRIVER(mmc); +extern UCLASS_DRIVER(ram); +extern UCLASS_DRIVER(serial); +extern UCLASS_DRIVER(syscon); diff --git a/package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-plat.c b/package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-plat.c new file mode 100644 index 0000000000..aa03298e58 --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-plat.c @@ -0,0 +1,189 @@ +/* + * DO NOT MODIFY + * + * Declares the U_BOOT_DRIVER() records and platform data. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +/* Allow use of U_BOOT_DRVINFO() in this file */ +#define DT_PLAT_C + +#include +#include +#include + +/* + * driver_info declarations, ordered by 'struct driver_info' linker_list idx: + * + * idx driver_info driver + * --- -------------------- -------------------- + * 0: clock_controller_at_ff440000 rockchip_rk3328_cru + * 1: dmc rockchip_rk3328_dmc + * 2: mmc_at_ff500000 rockchip_rk3288_dw_mshc + * 3: mmc_at_ff520000 rockchip_rk3288_dw_mshc + * 4: serial_at_ff130000 ns16550_serial + * 5: syscon_at_ff100000 rockchip_rk3328_grf + * --- -------------------- -------------------- + */ + +/* + * Node /clock-controller@ff440000 index 0 + * driver rockchip_rk3328_cru parent None + */ +static struct dtd_rockchip_rk3328_cru dtv_clock_controller_at_ff440000 = { + .reg = {0xff440000, 0x1000}, + .rockchip_grf = 0x3a, +}; +U_BOOT_DRVINFO(clock_controller_at_ff440000) = { + .name = "rockchip_rk3328_cru", + .plat = &dtv_clock_controller_at_ff440000, + .plat_size = sizeof(dtv_clock_controller_at_ff440000), + .parent_idx = -1, +}; + +/* + * Node /dmc index 1 + * driver rockchip_rk3328_dmc parent None + */ +static struct dtd_rockchip_rk3328_dmc dtv_dmc = { + .reg = {0xff400000, 0x1000, 0xff780000, 0x3000, 0xff100000, 0x1000, 0xff440000, 0x1000, + 0xff720000, 0x1000, 0xff798000, 0x1000}, + .rockchip_sdram_params = {0x1, 0xa, 0x2, 0x1, 0x0, 0x0, 0x11, 0x0, + 0x11, 0x0, 0x0, 0x94291288, 0x0, 0x27, 0x462, 0x15, + 0x242, 0xff, 0x14d, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x43049010, 0x64, 0x28003b, 0xd0, 0x20053, 0xd4, 0x220000, 0xd8, + 0x100, 0xdc, 0x40000, 0xe0, 0x0, 0xe4, 0x110000, 0xe8, + 0x420, 0xec, 0x400, 0xf4, 0xf011f, 0x100, 0x9060b06, 0x104, + 0x20209, 0x108, 0x505040a, 0x10c, 0x40400c, 0x110, 0x5030206, 0x114, + 0x3030202, 0x120, 0x3030b03, 0x124, 0x20208, 0x180, 0x1000040, 0x184, + 0x0, 0x190, 0x7030003, 0x198, 0x5001100, 0x1a0, 0xc0400003, 0x240, + 0x6000604, 0x244, 0x201, 0x250, 0xf00, 0x490, 0x1, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0x4, 0xc, 0x28, 0xa, 0x2c, + 0x0, 0x30, 0x9, 0xffffffff, 0xffffffff, 0x77, 0x88, 0x79, + 0x79, 0x87, 0x97, 0x87, 0x78, 0x77, 0x78, 0x87, + 0x88, 0x87, 0x87, 0x77, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x69, 0x9, 0x77, + 0x78, 0x77, 0x78, 0x77, 0x78, 0x77, 0x78, 0x77, + 0x79, 0x9, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x69, 0x9, 0x77, 0x78, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0x9, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x69, 0x9, 0x77, 0x78, 0x77, 0x78, 0x77, + 0x78, 0x77, 0x78, 0x77, 0x79, 0x9, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x69, + 0x9, 0x77, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x79, 0x9}, +}; +U_BOOT_DRVINFO(dmc) = { + .name = "rockchip_rk3328_dmc", + .plat = &dtv_dmc, + .plat_size = sizeof(dtv_dmc), + .parent_idx = -1, +}; + +/* + * Node /mmc@ff500000 index 2 + * driver rockchip_rk3288_dw_mshc parent None + */ +static struct dtd_rockchip_rk3288_dw_mshc dtv_mmc_at_ff500000 = { + .bus_width = 0x4, + .cap_mmc_highspeed = true, + .cap_sd_highspeed = true, + .clocks = { + {0, {317}}, + {0, {33}}, + {0, {74}}, + {0, {78}},}, + .disable_wp = true, + .fifo_depth = 0x100, + .interrupts = {0x0, 0xc, 0x4}, + .max_frequency = 0x8f0d180, + .pinctrl_0 = {0x47, 0x48, 0x49, 0x4a}, + .pinctrl_names = "default", + .reg = {0xff500000, 0x4000}, + .sd_uhs_sdr104 = true, + .sd_uhs_sdr12 = true, + .sd_uhs_sdr25 = true, + .sd_uhs_sdr50 = true, + .u_boot_spl_fifo_mode = true, + .vmmc_supply = 0x4b, + .vqmmc_supply = 0x1e, +}; +U_BOOT_DRVINFO(mmc_at_ff500000) = { + .name = "rockchip_rk3288_dw_mshc", + .plat = &dtv_mmc_at_ff500000, + .plat_size = sizeof(dtv_mmc_at_ff500000), + .parent_idx = -1, +}; + +/* + * Node /mmc@ff520000 index 3 + * driver rockchip_rk3288_dw_mshc parent None + */ +static struct dtd_rockchip_rk3288_dw_mshc dtv_mmc_at_ff520000 = { + .bus_width = 0x8, + .cap_mmc_highspeed = true, + .clocks = { + {0, {319}}, + {0, {35}}, + {0, {76}}, + {0, {80}},}, + .fifo_depth = 0x100, + .interrupts = {0x0, 0xe, 0x4}, + .max_frequency = 0x8f0d180, + .mmc_ddr_1_8v = true, + .mmc_hs200_1_8v = true, + .non_removable = true, + .pinctrl_0 = {0x4c, 0x4d, 0x4e, 0x0}, + .pinctrl_names = "default", + .reg = {0xff520000, 0x4000}, + .u_boot_spl_fifo_mode = true, + .vmmc_supply = 0x1c, + .vqmmc_supply = 0x1d, +}; +U_BOOT_DRVINFO(mmc_at_ff520000) = { + .name = "rockchip_rk3288_dw_mshc", + .plat = &dtv_mmc_at_ff520000, + .plat_size = sizeof(dtv_mmc_at_ff520000), + .parent_idx = -1, +}; + +/* + * Node /serial@ff130000 index 4 + * driver ns16550_serial parent None + */ +static struct dtd_ns16550_serial dtv_serial_at_ff130000 = { + .clock_frequency = 0x16e3600, + .clocks = { + {0, {40}}, + {0, {212}},}, + .dma_names = {"tx", "rx"}, + .dmas = {0x10, 0x6, 0x10, 0x7}, + .interrupts = {0x0, 0x39, 0x4}, + .pinctrl_0 = 0x26, + .pinctrl_names = "default", + .reg = {0xff130000, 0x100}, + .reg_io_width = 0x4, + .reg_shift = 0x2, +}; +U_BOOT_DRVINFO(serial_at_ff130000) = { + .name = "ns16550_serial", + .plat = &dtv_serial_at_ff130000, + .plat_size = sizeof(dtv_serial_at_ff130000), + .parent_idx = -1, +}; + +/* + * Node /syscon@ff100000 index 5 + * driver rockchip_rk3328_grf parent None + */ +static struct dtd_rockchip_rk3328_grf dtv_syscon_at_ff100000 = { + .reg = {0xff100000, 0x1000}, +}; +U_BOOT_DRVINFO(syscon_at_ff100000) = { + .name = "rockchip_rk3328_grf", + .plat = &dtv_syscon_at_ff100000, + .plat_size = sizeof(dtv_syscon_at_ff100000), + .parent_idx = -1, +}; + diff --git a/package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-structs-gen.h b/package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-structs-gen.h new file mode 100644 index 0000000000..5b729fc57f --- /dev/null +++ b/package/boot/uboot-rockchip/src/of-platdata/roc-cc-rk3328/dt-structs-gen.h @@ -0,0 +1,55 @@ +/* + * DO NOT MODIFY + * + * Defines the structs used to hold devicetree data. + * This was generated by dtoc from a .dtb (device tree binary) file. + */ + +#include +#include +struct dtd_ns16550_serial { + fdt32_t clock_frequency; + struct phandle_1_arg clocks[2]; + const char * dma_names[2]; + fdt32_t dmas[4]; + fdt32_t interrupts[3]; + fdt32_t pinctrl_0; + const char * pinctrl_names; + fdt64_t reg[2]; + fdt32_t reg_io_width; + fdt32_t reg_shift; +}; +struct dtd_rockchip_rk3288_dw_mshc { + fdt32_t bus_width; + bool cap_mmc_highspeed; + bool cap_sd_highspeed; + struct phandle_1_arg clocks[4]; + bool disable_wp; + fdt32_t fifo_depth; + fdt32_t interrupts[3]; + fdt32_t max_frequency; + bool mmc_ddr_1_8v; + bool mmc_hs200_1_8v; + bool non_removable; + fdt32_t pinctrl_0[4]; + const char * pinctrl_names; + fdt64_t reg[2]; + bool sd_uhs_sdr104; + bool sd_uhs_sdr12; + bool sd_uhs_sdr25; + bool sd_uhs_sdr50; + bool u_boot_spl_fifo_mode; + fdt32_t vmmc_supply; + fdt32_t vqmmc_supply; +}; +struct dtd_rockchip_rk3328_cru { + fdt64_t reg[2]; + fdt32_t rockchip_grf; +}; +struct dtd_rockchip_rk3328_dmc { + fdt64_t reg[12]; + fdt32_t rockchip_sdram_params[196]; +}; +struct dtd_rockchip_rk3328_grf { + fdt64_t reg[2]; +}; diff --git a/package/boot/uboot-sunxi/Makefile b/package/boot/uboot-sunxi/Makefile index 5c27407d15..cb0c93281d 100644 --- a/package/boot/uboot-sunxi/Makefile +++ b/package/boot/uboot-sunxi/Makefile @@ -9,9 +9,9 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk -PKG_VERSION:=2020.04 +PKG_VERSION:=2020.07 -PKG_HASH:=fe732aaf037d9cc3c0909bad8362af366ae964bbdac6913a34081ff4ad565372 +PKG_HASH:=c1f5bf9ee6bb6e648edbf19ce2ca9452f614b08a9f886f1a566aa42e8cf05f6a PKG_MAINTAINER:=Zoltan HERPAI @@ -29,7 +29,7 @@ define U-Boot/a64-olinuxino BUILD_SUBTARGET:=cortexa53 NAME:=Olimex A64-OLinuXino BUILD_DEVICES:=olimex_a64-olinuxino - DEPENDS:=+PACKAGE_u-boot-olimex_a64-olinuxino:arm-trusted-firmware-sunxi-a64 + DEPENDS:=+PACKAGE_u-boot-olimex_a64-olinuxino:trusted-firmware-a-sunxi-a64 UENV:=a64 ATF:=a64 endef @@ -38,7 +38,7 @@ define U-Boot/a64-olinuxino-emmc BUILD_SUBTARGET:=cortexa53 NAME:=Olimex A64-OLinuXino eMMC BUILD_DEVICES:=olimex_a64-olinuxino-emmc - DEPENDS:=+PACKAGE_u-boot-olimex_a64-olinuxino-emmc:arm-trusted-firmware-sunxi-a64 + DEPENDS:=+PACKAGE_u-boot-olimex_a64-olinuxino-emmc:trusted-firmware-a-sunxi-a64 UENV:=a64 ATF:=a64 endef @@ -116,8 +116,8 @@ endef define U-Boot/Marsboard_A10 BUILD_SUBTARGET:=cortexa8 - NAME:=Marsboard - BUILD_DEVICES:=marsboard_a10-marsboard + NAME:=HAOYU Marsboard A10 + BUILD_DEVICES:=haoyu_a10-marsboard endef define U-Boot/Mele_M9 @@ -207,7 +207,7 @@ endef define U-Boot/orangepi_one_plus BUILD_SUBTARGET:=cortexa53 NAME:=Orange Pi One Plus (H6) - DEPENDS:=+PACKAGE_u-boot-orangepi_one_plus:arm-trusted-firmware-sunxi-h6 + DEPENDS:=+PACKAGE_u-boot-orangepi_one_plus:trusted-firmware-a-sunxi-h6 BUILD_DEVICES:=xunlong_orangepi-one-plus UENV:=h6 ATF:=h6 @@ -247,7 +247,7 @@ define U-Boot/libretech_all_h3_cc_h5 BUILD_SUBTARGET:=cortexa53 NAME:=Libre Computer ALL-H3-CC H5 BUILD_DEVICES:=libretech_all-h3-cc-h5 - DEPENDS:=+PACKAGE_u-boot-libretech_all_h3_cc_h5:arm-trusted-firmware-sunxi-a64 + DEPENDS:=+PACKAGE_u-boot-libretech_all_h3_cc_h5:trusted-firmware-a-sunxi-a64 UENV:=a64 ATF:=a64 endef @@ -256,7 +256,7 @@ define U-Boot/nanopi_neo_plus2 BUILD_SUBTARGET:=cortexa53 NAME:=NanoPi NEO Plus2 (H5) BUILD_DEVICES:=friendlyarm_nanopi-neo-plus2 - DEPENDS:=+PACKAGE_u-boot-nanopi_neo_plus2:arm-trusted-firmware-sunxi-a64 + DEPENDS:=+PACKAGE_u-boot-nanopi_neo_plus2:trusted-firmware-a-sunxi-a64 UENV:=a64 ATF:=a64 endef @@ -265,7 +265,7 @@ define U-Boot/nanopi_neo2 BUILD_SUBTARGET:=cortexa53 NAME:=NanoPi NEO2 (H5) BUILD_DEVICES:=friendlyarm_nanopi-neo2 - DEPENDS:=+PACKAGE_u-boot-nanopi_neo2:arm-trusted-firmware-sunxi-a64 + DEPENDS:=+PACKAGE_u-boot-nanopi_neo2:trusted-firmware-a-sunxi-a64 UENV:=a64 ATF:=a64 endef @@ -274,7 +274,7 @@ define U-Boot/nanopi_r1s_h5 BUILD_SUBTARGET:=cortexa53 NAME:=NanoPi R1S (H5) BUILD_DEVICES:=friendlyarm_nanopi-r1s-h5 - DEPENDS:=+PACKAGE_u-boot-nanopi_r1s_h5:arm-trusted-firmware-sunxi-a64 + DEPENDS:=+PACKAGE_u-boot-nanopi_r1s_h5:trusted-firmware-a-sunxi-a64 UENV:=a64 ATF:=a64 endef @@ -283,7 +283,7 @@ define U-Boot/pine64_plus BUILD_SUBTARGET:=cortexa53 NAME:=Pine64 Plus A64 BUILD_DEVICES:=pine64_pine64-plus - DEPENDS:=+PACKAGE_u-boot-pine64_plus:arm-trusted-firmware-sunxi-a64 + DEPENDS:=+PACKAGE_u-boot-pine64_plus:trusted-firmware-a-sunxi-a64 UENV:=a64 ATF:=a64 endef @@ -298,7 +298,7 @@ define U-Boot/sopine_baseboard BUILD_SUBTARGET:=cortexa53 NAME:=Sopine Baseboard BUILD_DEVICES:=pine64_sopine-baseboard - DEPENDS:=+PACKAGE_u-boot-sopine_baseboard:arm-trusted-firmware-sunxi-a64 + DEPENDS:=+PACKAGE_u-boot-sopine_baseboard:trusted-firmware-a-sunxi-a64 UENV:=a64 ATF:=a64 endef @@ -308,7 +308,7 @@ define U-Boot/orangepi_zero_plus BUILD_SUBTARGET:=cortexa53 NAME:=Xunlong Orange Pi Zero Plus BUILD_DEVICES:=xunlong_orangepi-zero-plus - DEPENDS:=+PACKAGE_u-boot-orangepi_zero_plus:arm-trusted-firmware-sunxi-a64 + DEPENDS:=+PACKAGE_u-boot-orangepi_zero_plus:trusted-firmware-a-sunxi-a64 UENV:=a64 ATF:=a64 endef @@ -317,7 +317,7 @@ define U-Boot/orangepi_pc2 BUILD_SUBTARGET:=cortexa53 NAME:=Xunlong Orange Pi PC2 BUILD_DEVICES:=xunlong_orangepi-pc2 - DEPENDS:=+PACKAGE_u-boot-orangepi_pc2:arm-trusted-firmware-sunxi-a64 + DEPENDS:=+PACKAGE_u-boot-orangepi_pc2:trusted-firmware-a-sunxi-a64 UENV:=a64 ATF:=a64 endef @@ -385,7 +385,7 @@ UBOOT_TARGETS := \ UBOOT_CONFIGURE_VARS += USE_PRIVATE_LIBGCC=yes UBOOT_MAKE_FLAGS += \ - BL31=$(STAGING_DIR_IMAGE)/bl31_sun50i_$(ATF).bin + BL31=$(STAGING_DIR_IMAGE)/bl31_sunxi-$(ATF).bin define Build/InstallDev $(INSTALL_DIR) $(STAGING_DIR_IMAGE) diff --git a/package/boot/uboot-sunxi/patches/003-add-theobroma-a31-pangolin.patch b/package/boot/uboot-sunxi/patches/003-add-theobroma-a31-pangolin.patch index 29969a71ab..fab06e6a8e 100644 --- a/package/boot/uboot-sunxi/patches/003-add-theobroma-a31-pangolin.patch +++ b/package/boot/uboot-sunxi/patches/003-add-theobroma-a31-pangolin.patch @@ -1,6 +1,6 @@ --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile -@@ -455,6 +455,7 @@ dtb-$(CONFIG_MACH_SUN6I) += \ +@@ -475,6 +475,7 @@ dtb-$(CONFIG_MACH_SUN6I) += \ sun6i-a31-m9.dtb \ sun6i-a31-mele-a1000g-quad.dtb \ sun6i-a31-mixtile-loftq.dtb \ diff --git a/package/boot/uboot-sunxi/patches/062-A20-improve-gmac-upload.patch b/package/boot/uboot-sunxi/patches/062-A20-improve-gmac-upload.patch index b805bbd169..27b476472c 100644 --- a/package/boot/uboot-sunxi/patches/062-A20-improve-gmac-upload.patch +++ b/package/boot/uboot-sunxi/patches/062-A20-improve-gmac-upload.patch @@ -2,7 +2,7 @@ --- a/configs/A20-OLinuXino-Lime2_defconfig +++ b/configs/A20-OLinuXino-Lime2_defconfig -@@ -22,6 +22,7 @@ CONFIG_ETH_DESIGNWARE=y +@@ -23,6 +23,7 @@ CONFIG_ETH_DESIGNWARE=y CONFIG_RGMII=y CONFIG_MII=y CONFIG_SUN7I_GMAC=y diff --git a/package/boot/uboot-sunxi/patches/091-sun6i-sync-PLL1-multdiv-with-Boot1.patch b/package/boot/uboot-sunxi/patches/091-sun6i-sync-PLL1-multdiv-with-Boot1.patch index f2a2b5e48f..c637ccb792 100644 --- a/package/boot/uboot-sunxi/patches/091-sun6i-sync-PLL1-multdiv-with-Boot1.patch +++ b/package/boot/uboot-sunxi/patches/091-sun6i-sync-PLL1-multdiv-with-Boot1.patch @@ -14,7 +14,7 @@ More specifically, the following settings are now used: --- a/arch/arm/mach-sunxi/clock_sun6i.c +++ b/arch/arm/mach-sunxi/clock_sun6i.c -@@ -112,11 +112,12 @@ void clock_set_pll1(unsigned int clk) +@@ -114,11 +114,12 @@ void clock_set_pll1(unsigned int clk) struct sunxi_ccm_reg * const ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE; const int p = 0; diff --git a/package/boot/uboot-sunxi/patches/093-sun6i-fix-PLL-LDO-voltselect.patch b/package/boot/uboot-sunxi/patches/093-sun6i-fix-PLL-LDO-voltselect.patch index b62209e1dc..c20db1352e 100644 --- a/package/boot/uboot-sunxi/patches/093-sun6i-fix-PLL-LDO-voltselect.patch +++ b/package/boot/uboot-sunxi/patches/093-sun6i-fix-PLL-LDO-voltselect.patch @@ -18,7 +18,7 @@ required setting for the PLL LDO is 1.37v as per the A31 manual. --- a/arch/arm/mach-sunxi/clock_sun6i.c +++ b/arch/arm/mach-sunxi/clock_sun6i.c -@@ -25,13 +25,26 @@ void clock_init_safe(void) +@@ -27,13 +27,26 @@ void clock_init_safe(void) struct sunxi_prcm_reg * const prcm = (struct sunxi_prcm_reg *)SUNXI_PRCM_BASE; diff --git a/package/boot/uboot-sunxi/patches/101-sun6i-support-console-on-UART2.patch b/package/boot/uboot-sunxi/patches/101-sun6i-support-console-on-UART2.patch index 823c156809..4cbf0ea1d8 100644 --- a/package/boot/uboot-sunxi/patches/101-sun6i-support-console-on-UART2.patch +++ b/package/boot/uboot-sunxi/patches/101-sun6i-support-console-on-UART2.patch @@ -6,7 +6,7 @@ Subject: ARM: sun6i: Support console on UART2 (GPG6/GPG7) --- a/arch/arm/mach-sunxi/board.c +++ b/arch/arm/mach-sunxi/board.c -@@ -129,6 +129,10 @@ static int gpio_init(void) +@@ -132,6 +132,10 @@ static int gpio_init(void) sunxi_gpio_set_cfgpin(SUNXI_GPG(3), SUN5I_GPG_UART1); sunxi_gpio_set_cfgpin(SUNXI_GPG(4), SUN5I_GPG_UART1); sunxi_gpio_set_pull(SUNXI_GPG(4), SUNXI_GPIO_PULL_UP); diff --git a/package/boot/uboot-sunxi/patches/200-mkimage-check-environment-for-dtc-binary-location.patch b/package/boot/uboot-sunxi/patches/200-mkimage-check-environment-for-dtc-binary-location.patch index 482aa1a369..8aeae91ef4 100644 --- a/package/boot/uboot-sunxi/patches/200-mkimage-check-environment-for-dtc-binary-location.patch +++ b/package/boot/uboot-sunxi/patches/200-mkimage-check-environment-for-dtc-binary-location.patch @@ -17,7 +17,7 @@ Cc: Simon Glass --- a/tools/fit_image.c +++ b/tools/fit_image.c -@@ -726,9 +726,14 @@ static int fit_handle_file(struct image_ +@@ -751,9 +751,14 @@ static int fit_handle_file(struct image_ } *cmd = '\0'; } else if (params->datafile) { diff --git a/package/boot/uboot-sunxi/patches/210-sunxi-deactivate-binman.patch b/package/boot/uboot-sunxi/patches/210-sunxi-deactivate-binman.patch index 5efebbd056..48ddf6d318 100644 --- a/package/boot/uboot-sunxi/patches/210-sunxi-deactivate-binman.patch +++ b/package/boot/uboot-sunxi/patches/210-sunxi-deactivate-binman.patch @@ -12,7 +12,7 @@ old way of generating images. --- a/Makefile +++ b/Makefile -@@ -1555,8 +1555,10 @@ endif +@@ -1607,8 +1607,10 @@ endif ifneq ($(CONFIG_ARCH_SUNXI),) ifeq ($(CONFIG_ARM64),) @@ -27,7 +27,7 @@ old way of generating images. $(call if_changed,cat) --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig -@@ -962,7 +962,6 @@ config ARCH_SOCFPGA +@@ -995,7 +995,6 @@ config ARCH_SOCFPGA config ARCH_SUNXI bool "Support sunxi (Allwinner) SoCs" diff --git a/package/boot/uboot-sunxi/patches/230-disable-axp209-on-a13-olinuxino.diff b/package/boot/uboot-sunxi/patches/230-disable-axp209-on-a13-olinuxino.diff index b846cbf506..bc8bd144d6 100644 --- a/package/boot/uboot-sunxi/patches/230-disable-axp209-on-a13-olinuxino.diff +++ b/package/boot/uboot-sunxi/patches/230-disable-axp209-on-a13-olinuxino.diff @@ -8,7 +8,7 @@ # CONFIG_VIDEO_HDMI is not set CONFIG_VIDEO_VGA_VIA_LCD=y CONFIG_VIDEO_VGA_VIA_LCD_FORCE_SYNC_ACTIVE_HIGH=y -@@ -21,7 +20,7 @@ CONFIG_CMD_USB_MASS_STORAGE=y +@@ -20,7 +19,7 @@ CONFIG_CMD_USB_MASS_STORAGE=y CONFIG_DEFAULT_DEVICE_TREE="sun5i-a13-olinuxino" CONFIG_DFU_RAM=y CONFIG_FASTBOOT_CMD_OEM_FORMAT=y diff --git a/package/boot/uboot-sunxi/patches/250-sun8i-h3-add-support-for-zeropi.patch b/package/boot/uboot-sunxi/patches/250-sun8i-h3-add-support-for-zeropi.patch new file mode 100644 index 0000000000..838d90a7b0 --- /dev/null +++ b/package/boot/uboot-sunxi/patches/250-sun8i-h3-add-support-for-zeropi.patch @@ -0,0 +1,148 @@ +From 2527b24f39d8f27ba2fd922ca27a1f14119cfa1b Mon Sep 17 00:00:00 2001 +From: Yu-Tung Chang +Date: Sat, 19 Jun 2021 16:16:45 +0800 +Subject: [PATCH] sunxi: h3: Add initial ZeroPi support + +ZeroPi is a new board of high performance with low cost +designed by FriendlyElec., using the Allwinner H3 SOC. + +ZeroPi features +- Allwinner H3, Quad-core Cortex-A7@1.2GHz +- 256MB/512MB DDR3 RAM +- microsd slot +- 10/100/1000Mbps Ethernet +- Debug Serial Port +- DC 5V/2A power-supply + +Signed-off-by: Yu-Tung Chang +Reviewed-by: Andre Przywara +Signed-off-by: Andre Przywara +--- +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -560,7 +560,8 @@ dtb-$(CONFIG_MACH_SUN8I_H3) += \ + sun8i-h3-orangepi-plus.dtb \ + sun8i-h3-orangepi-plus2e.dtb \ + sun8i-h3-orangepi-zero-plus2.dtb \ +- sun8i-h3-rervision-dvk.dtb ++ sun8i-h3-rervision-dvk.dtb \ ++ sun8i-h3-zeropi.dtb + dtb-$(CONFIG_MACH_SUN8I_R40) += \ + sun8i-r40-bananapi-m2-ultra.dtb \ + sun8i-v40-bananapi-m2-berry.dtb +--- /dev/null ++++ b/arch/arm/dts/sun8i-h3-zeropi.dts +@@ -0,0 +1,85 @@ ++/* ++ * Copyright (C) 2020 Yu-Tung Chang ++ * ++ * This file is dual-licensed: you can use it either under the terms ++ * of the GPL or the X11 license, at your option. Note that this dual ++ * licensing only applies to this file, and not this project as a ++ * whole. ++ * ++ * a) This file is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the ++ * License, or (at your option) any later version. ++ * ++ * This file is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * Or, alternatively, ++ * ++ * b) Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation ++ * files (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, ++ * copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following ++ * conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++#include "sun8i-h3-nanopi.dtsi" ++ ++/ { ++ model = "FriendlyARM ZeroPi"; ++ compatible = "friendlyarm,zeropi", "allwinner,sun8i-h3"; ++ ++ aliases { ++ ethernet0 = &emac; ++ }; ++ ++ reg_gmac_3v3: gmac-3v3 { ++ compatible = "regulator-fixed"; ++ regulator-name = "gmac-3v3"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ startup-delay-us = <100000>; ++ enable-active-high; ++ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */ ++ }; ++}; ++ ++&external_mdio { ++ ext_rgmii_phy: ethernet-phy@7 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <7>; ++ }; ++}; ++ ++&emac { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&emac_rgmii_pins>; ++ phy-supply = <®_gmac_3v3>; ++ phy-handle = <&ext_rgmii_phy>; ++ phy-mode = "rgmii-id"; ++ ++ allwinner,leds-active-low; ++ status = "okay"; ++}; ++ ++&usb_otg { ++ status = "okay"; ++ dr_mode = "host"; ++}; +--- a/board/sunxi/MAINTAINERS ++++ b/board/sunxi/MAINTAINERS +@@ -508,3 +508,9 @@ YONES TOPTECH BS1078 V2 BOARD + M: Peter Korsgaard + S: Maintained + F: configs/Yones_Toptech_BS1078_V2_defconfig ++ ++ZEROPI BOARD ++M: Yu-Tung Chang ++S: Maintained ++F: configs/zeropi_defconfig ++F: arch/arm/dts/sun8i-h3-zeropi.dts +--- /dev/null ++++ b/configs/zeropi_defconfig +@@ -0,0 +1,13 @@ ++CONFIG_ARM=y ++CONFIG_ARCH_SUNXI=y ++CONFIG_DEFAULT_DEVICE_TREE="sun8i-h3-zeropi" ++CONFIG_SPL=y ++CONFIG_MACH_SUN8I_H3=y ++CONFIG_DRAM_CLK=408 ++CONFIG_MACPWR="PD6" ++# CONFIG_VIDEO_DE2 is not set ++# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set ++CONFIG_CONSOLE_MUX=y ++CONFIG_SUN8I_EMAC=y ++CONFIG_USB_EHCI_HCD=y ++CONFIG_USB_OHCI_HCD=y diff --git a/package/boot/uboot-sunxi/patches/250-sun8i-h3-zeropi-add-device-tree.patch b/package/boot/uboot-sunxi/patches/250-sun8i-h3-zeropi-add-device-tree.patch deleted file mode 100644 index 4250e4e9db..0000000000 --- a/package/boot/uboot-sunxi/patches/250-sun8i-h3-zeropi-add-device-tree.patch +++ /dev/null @@ -1,81 +0,0 @@ ---- a/arch/arm/dts/Makefile -+++ b/arch/arm/dts/Makefile -@@ -539,7 +539,8 @@ dtb-$(CONFIG_MACH_SUN8I_H3) += \ - sun8i-h3-orangepi-plus.dtb \ - sun8i-h3-orangepi-plus2e.dtb \ - sun8i-h3-orangepi-zero-plus2.dtb \ -- sun8i-h3-rervision-dvk.dtb -+ sun8i-h3-rervision-dvk.dtb \ -+ sun8i-h3-zeropi.dtb - dtb-$(CONFIG_MACH_SUN8I_R40) += \ - sun8i-r40-bananapi-m2-ultra.dtb \ - sun8i-v40-bananapi-m2-berry.dtb ---- /dev/null -+++ b/arch/arm/dts/sun8i-h3-zeropi.dts -@@ -0,0 +1,66 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT -+ -+#include "sun8i-h3-nanopi.dtsi" -+ -+/ { -+ model = "FriendlyElec ZeroPi"; -+ compatible = "friendlyarm,zeropi", "allwinner,sun8i-h3"; -+ -+ aliases { -+ ethernet0 = &emac; -+ }; -+ -+ reg_gmac_3v3: gmac-3v3 { -+ compatible = "regulator-fixed"; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&gmac_power_pin_nanopi>; -+ regulator-name = "gmac-3v3"; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ startup-delay-us = <100000>; -+ enable-active-high; -+ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; -+ }; -+}; -+ -+&ehci0 { -+ status = "okay"; -+}; -+ -+&ohci0 { -+ status = "okay"; -+}; -+ -+&pio { -+ gmac_power_pin_nanopi: gmac_power_pin@0 { -+ pins = "PD6"; -+ function = "gpio_out"; -+ }; -+}; -+ -+&external_mdio { -+ ext_rgmii_phy: ethernet-phy@1 { -+ compatible = "ethernet-phy-ieee802.3-c22"; -+ reg = <7>; -+ }; -+}; -+ -+&emac { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&emac_rgmii_pins>; -+ phy-supply = <®_gmac_3v3>; -+ phy-handle = <&ext_rgmii_phy>; -+ phy-mode = "rgmii"; -+ -+ allwinner,leds-active-low; -+ status = "okay"; -+}; -+ -+&usb_otg { -+ status = "okay"; -+ dr_mode = "peripheral"; -+}; -+ -+&usbphy { -+ usb0_id_det-gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */ -+}; diff --git a/package/boot/uboot-sunxi/patches/251-sun8i-h3-zeropi-add-defconfig.patch b/package/boot/uboot-sunxi/patches/251-sun8i-h3-zeropi-add-defconfig.patch deleted file mode 100644 index 76e333298e..0000000000 --- a/package/boot/uboot-sunxi/patches/251-sun8i-h3-zeropi-add-defconfig.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- /dev/null -+++ b/configs/zeropi_defconfig -@@ -0,0 +1,21 @@ -+CONFIG_ARM=y -+CONFIG_ARCH_SUNXI=y -+CONFIG_MACH_SUN8I_H3=y -+CONFIG_DRAM_CLK=408 -+CONFIG_DRAM_ZQ=3881979 -+CONFIG_DRAM_ODT_EN=y -+CONFIG_MACPWR="PD6" -+# CONFIG_VIDEO_DE2 is not set -+CONFIG_NR_DRAM_BANKS=1 -+CONFIG_DEFAULT_DEVICE_TREE="sun8i-h3-zeropi" -+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set -+CONFIG_CONSOLE_MUX=y -+CONFIG_SPL=y -+CONFIG_SYS_CLK_FREQ=480000000 -+# CONFIG_CMD_IMLS is not set -+# CONFIG_CMD_FLASH is not set -+# CONFIG_CMD_FPGA is not set -+CONFIG_SUN8I_EMAC=y -+CONFIG_USB_EHCI_HCD=y -+CONFIG_USB_EHCI_HCD=y -+CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y diff --git a/package/boot/uboot-sunxi/patches/252-sunxi-h3-add-support-for-nanopi-r1.patch b/package/boot/uboot-sunxi/patches/252-sunxi-h3-add-support-for-nanopi-r1.patch index 0db7be5421..5b3a68c602 100644 --- a/package/boot/uboot-sunxi/patches/252-sunxi-h3-add-support-for-nanopi-r1.patch +++ b/package/boot/uboot-sunxi/patches/252-sunxi-h3-add-support-for-nanopi-r1.patch @@ -14,7 +14,7 @@ Signed-off-by: Jayantajit Gogoi --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile -@@ -531,6 +531,7 @@ dtb-$(CONFIG_MACH_SUN8I_H3) += \ +@@ -551,6 +551,7 @@ dtb-$(CONFIG_MACH_SUN8I_H3) += \ sun8i-h3-nanopi-m1-plus.dtb \ sun8i-h3-nanopi-neo.dtb \ sun8i-h3-nanopi-neo-air.dtb \ @@ -173,7 +173,7 @@ Signed-off-by: Jayantajit Gogoi +}; --- /dev/null +++ b/configs/nanopi_r1_defconfig -@@ -0,0 +1,22 @@ +@@ -0,0 +1,21 @@ +CONFIG_ARM=y +CONFIG_ARCH_SUNXI=y +CONFIG_SPL=y @@ -186,7 +186,6 @@ Signed-off-by: Jayantajit Gogoi +CONFIG_NR_DRAM_BANKS=1 +# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set +CONFIG_CONSOLE_MUX=y -+CONFIG_SYS_CLK_FREQ=480000000 +# CONFIG_CMD_FLASH is not set +# CONFIG_SPL_DOS_PARTITION is not set +# CONFIG_SPL_EFI_PARTITION is not set diff --git a/package/boot/uboot-sunxi/patches/253-sunxi-h5-add-support-for-nanopi-r1s-h5.patch b/package/boot/uboot-sunxi/patches/253-sunxi-h5-add-support-for-nanopi-r1s-h5.patch index b89351d2e9..2c8d5a9459 100644 --- a/package/boot/uboot-sunxi/patches/253-sunxi-h5-add-support-for-nanopi-r1s-h5.patch +++ b/package/boot/uboot-sunxi/patches/253-sunxi-h5-add-support-for-nanopi-r1s-h5.patch @@ -25,11 +25,9 @@ Signed-off-by: Chukun Pan create mode 100644 arch/arm/dts/sun50i-h5-nanopi-r1s-h5.dts create mode 100644 configs/nanopi_r1s_h5_defconfig -diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile -index b8a382d1539..ed3d360bb10 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile -@@ -638,6 +638,7 @@ dtb-$(CONFIG_MACH_SUN50I_H5) += \ +@@ -575,6 +575,7 @@ dtb-$(CONFIG_MACH_SUN50I_H5) += \ sun50i-h5-libretech-all-h5-cc.dtb \ sun50i-h5-nanopi-neo2.dtb \ sun50i-h5-nanopi-neo-plus2.dtb \ @@ -37,9 +35,6 @@ index b8a382d1539..ed3d360bb10 100644 sun50i-h5-orangepi-zero-plus.dtb \ sun50i-h5-orangepi-pc2.dtb \ sun50i-h5-orangepi-prime.dtb \ -diff --git a/arch/arm/dts/sun50i-h5-nanopi-r1s-h5.dts b/arch/arm/dts/sun50i-h5-nanopi-r1s-h5.dts -new file mode 100644 -index 00000000000..55bcdf8d1a0 --- /dev/null +++ b/arch/arm/dts/sun50i-h5-nanopi-r1s-h5.dts @@ -0,0 +1,190 @@ @@ -233,8 +228,6 @@ index 00000000000..55bcdf8d1a0 + usb0_vbus-supply = <®_usb0_vbus>; + status = "okay"; +}; -diff --git a/board/sunxi/MAINTAINERS b/board/sunxi/MAINTAINERS -index 2543c94de79..56a0ee3689b 100644 --- a/board/sunxi/MAINTAINERS +++ b/board/sunxi/MAINTAINERS @@ -358,6 +358,11 @@ M: Jelle van der Waa @@ -249,9 +242,6 @@ index 2543c94de79..56a0ee3689b 100644 NANOPI-A64 BOARD M: Jagan Teki S: Maintained -diff --git a/configs/nanopi_r1s_h5_defconfig b/configs/nanopi_r1s_h5_defconfig -new file mode 100644 -index 00000000000..27cf172d72a --- /dev/null +++ b/configs/nanopi_r1s_h5_defconfig @@ -0,0 +1,14 @@ diff --git a/package/boot/uboot-sunxi/patches/270-arm-sunxi-increase-SYS_MALLOC_F_LEN.patch b/package/boot/uboot-sunxi/patches/270-arm-sunxi-increase-SYS_MALLOC_F_LEN.patch new file mode 100644 index 0000000000..6ce2be908d --- /dev/null +++ b/package/boot/uboot-sunxi/patches/270-arm-sunxi-increase-SYS_MALLOC_F_LEN.patch @@ -0,0 +1,29 @@ +From 20abdd7feefbb4fccef5c653e045911670237e8b Mon Sep 17 00:00:00 2001 +From: Stijn Tintel +Date: Thu, 22 Dec 2022 00:35:07 +0200 +Subject: [PATCH] arm: sunxi: increase SYS_MALLOC_F_LEN + +Version 2020.10 throws the following output after loading bl31: +alloc space exhausted + +This has been fixed in v2022.07, but the change is too intrusive to +backport. Instead, just modify the default for ARCH_SUNXI for now. + +See e05689242238 ("Kconfig: Change SYS_MALLOC_F_LEN default to 0x2000"). + +Signed-off-by: Stijn Tintel +--- + Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/Kconfig ++++ b/Kconfig +@@ -146,7 +146,7 @@ config SYS_MALLOC_F_LEN + default 0x2000 if (ARCH_IMX8 || ARCH_IMX8M || ARCH_MX7 || \ + ARCH_MX7ULP || ARCH_MX6 || ARCH_MX5 || \ + ARCH_LS1012A || ARCH_LS1021A || ARCH_LS1043A || \ +- ARCH_LS1046A || ARCH_QEMU) ++ ARCH_LS1046A || ARCH_QEMU || ARCH_SUNXI) + default 0x400 + help + Before relocation, memory is very limited on many platforms. Still, diff --git a/package/boot/uboot-sunxi/uEnv-default.txt b/package/boot/uboot-sunxi/uEnv-default.txt index e024954516..36e41c59b1 100644 --- a/package/boot/uboot-sunxi/uEnv-default.txt +++ b/package/boot/uboot-sunxi/uEnv-default.txt @@ -1,6 +1,8 @@ setenv fdt_high ffffffff -setenv loadkernel fatload mmc 0 \$kernel_addr_r uImage -setenv loaddtb fatload mmc 0 \$fdt_addr_r dtb -setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait +setenv mmc_rootpart 2 +part uuid mmc ${mmc_bootdev}:${mmc_rootpart} uuid +setenv loadkernel fatload mmc \$mmc_bootdev \$kernel_addr_r uImage +setenv loaddtb fatload mmc \$mmc_bootdev \$fdt_addr_r dtb +setenv bootargs console=ttyS0,115200 earlyprintk root=PARTUUID=${uuid} rootwait setenv uenvcmd run loadkernel \&\& run loaddtb \&\& bootm \$kernel_addr_r - \$fdt_addr_r run uenvcmd diff --git a/package/devel/binutils/Makefile b/package/devel/binutils/Makefile index 522a971051..8547190e99 100644 --- a/package/devel/binutils/Makefile +++ b/package/devel/binutils/Makefile @@ -8,16 +8,16 @@ include $(TOPDIR)/rules.mk PKG_NAME:=binutils -PKG_VERSION:=2.37 -PKG_RELEASE:=2 +PKG_VERSION:=2.40 +PKG_RELEASE:=1 PKG_SOURCE_URL:=@GNU/binutils PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_VERSION:=$(PKG_VERSION) -PKG_HASH:=820d9724f020a3e69cb337893a0b63c2db161dadcb0e06fc11dc29eb1e84a32c +PKG_HASH:=0f8a4c272d7f17f369ded10a4aca28b8e304828e95526da482b0ccc4dfc9d8e1 PKG_FIXUP:=patch-libtool -PKG_LIBTOOL_PATHS:=. gas bfd opcodes gprof binutils ld libiberty gold intl +PKG_LIBTOOL_PATHS:=. gas bfd opcodes gprof gprofng binutils ld libiberty gold intl libctf libsframe PKG_REMOVE_FILES:=libtool.m4 PKG_INSTALL:=1 @@ -25,7 +25,7 @@ PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-3.0+ PKG_CPE_ID:=cpe:/a:gnu:binutils PKG_BUILD_PARALLEL:=1 -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 include $(INCLUDE_DIR)/nls.mk include $(INCLUDE_DIR)/package.mk @@ -87,7 +87,11 @@ CONFIGURE_ARGS += \ --enable-shared \ --enable-install-libiberty \ --enable-install-libbfd \ - --enable-install-libctf + --enable-install-libctf \ + --with-system-zlib \ + --without-zstd \ + --without-msgpack \ + --disable-gprofng define Build/Install $(call Build/Install/Default) @@ -105,6 +109,7 @@ endef define Package/libbfd/install $(INSTALL_DIR) $(1)/usr/lib $(CP) $(PKG_INSTALL_DIR)/usr/lib/libbfd*.so* $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsframe*.so* $(1)/usr/lib/ endef define Package/libctf/install diff --git a/package/devel/binutils/patches/001-replace-attribute_const.patch b/package/devel/binutils/patches/001-replace-attribute_const.patch new file mode 100644 index 0000000000..5fd855efd1 --- /dev/null +++ b/package/devel/binutils/patches/001-replace-attribute_const.patch @@ -0,0 +1,88 @@ +Fix this compile error: +---------------------- +./../common/cpuid.c:27:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__get_cpuid' + 27 | __get_cpuid (unsigned int op ATTRIBUTE_UNUSED, unsigned int *eax, + | ^~~~~~~~~~~ +---------------------- + +and this error: +---------------------- +unwind.c: In function '__collector_ext_return_address': +unwind.c:236:34: error: '__u64' undeclared (first use in this function) + 236 | context->uc_mcontext.sp = (__u64) __builtin_frame_address(0); \ + | ^~~~~ +unwind.c:490:3: note: in expansion of macro 'FILL_CONTEXT' + 490 | FILL_CONTEXT ((&context)); + +---------------------- +--- a/gprofng/common/cpuid.c ++++ b/gprofng/common/cpuid.c +@@ -23,7 +23,7 @@ + #elif defined(__aarch64__) + #define ATTRIBUTE_UNUSED __attribute__((unused)) + +-static inline uint_t __attribute_const__ ++static inline uint_t __attribute__((__const__)) + __get_cpuid (unsigned int op ATTRIBUTE_UNUSED, unsigned int *eax, + unsigned int *ebx ATTRIBUTE_UNUSED, + unsigned int *ecx ATTRIBUTE_UNUSED, unsigned int *edx ATTRIBUTE_UNUSED) +--- a/gprofng/libcollector/unwind.c ++++ b/gprofng/libcollector/unwind.c +@@ -233,7 +233,7 @@ memory_error_func (int status ATTRIBUTE_ + #elif ARCH(Aarch64) + #define FILL_CONTEXT(context) \ + { CALL_UTIL (getcontext) (context); \ +- context->uc_mcontext.sp = (__u64) __builtin_frame_address(0); \ ++ context->uc_mcontext.sp = (uint64_t) __builtin_frame_address(0); \ + } + + #endif /* ARCH() */ +@@ -4579,11 +4579,11 @@ stack_unwind (char *buf, int size, void + if (buf && bptr && eptr && context && size + mode > 0) + getByteInstruction ((unsigned char *) eptr); + int ind = 0; +- __u64 *lbuf = (void *) buf; +- int lsize = size / sizeof (__u64); +- __u64 pc = context->uc_mcontext.pc; +- __u64 sp = context->uc_mcontext.sp; +- __u64 stack_base; ++ uint64_t *lbuf = (void *) buf; ++ int lsize = size / sizeof (uint64_t); ++ uint64_t pc = context->uc_mcontext.pc; ++ uint64_t sp = context->uc_mcontext.sp; ++ uint64_t stack_base; + unsigned long tbgn = 0; + unsigned long tend = 0; + +@@ -4594,7 +4594,7 @@ stack_unwind (char *buf, int size, void + { + stack_base = sp + 0x100000; + if (stack_base < sp) // overflow +- stack_base = (__u64) -1; ++ stack_base = (uint64_t) -1; + } + DprintfT (SP_DUMP_UNWIND, + "unwind.c:%d stack_unwind %2d pc=0x%llx sp=0x%llx stack_base=0x%llx\n", +@@ -4625,17 +4625,17 @@ stack_unwind (char *buf, int size, void + __LINE__, (unsigned long) sp); + break; + } +- pc = ((__u64 *) sp)[1]; +- __u64 old_sp = sp; +- sp = ((__u64 *) sp)[0]; ++ pc = ((uint64_t *) sp)[1]; ++ uint64_t old_sp = sp; ++ sp = ((uint64_t *) sp)[0]; + if (sp < old_sp) + break; + } + if (ind >= lsize) + { + ind = lsize - 1; +- lbuf[ind++] = (__u64) SP_TRUNC_STACK_MARKER; ++ lbuf[ind++] = (uint64_t) SP_TRUNC_STACK_MARKER; + } +- return ind * sizeof (__u64); ++ return ind * sizeof (uint64_t); + } + #endif /* ARCH() */ diff --git a/package/devel/gdb/Makefile b/package/devel/gdb/Makefile index 5add65a82a..4c0d6469a2 100644 --- a/package/devel/gdb/Makefile +++ b/package/devel/gdb/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gdb -PKG_VERSION:=11.2 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=12.1 +PKG_RELEASE:=3 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/gdb -PKG_HASH:=1497c36a71881b8671a9a84a0ee40faab788ca30d7ba19d8463c3cc787152e32 +PKG_HASH:=0e1793bf8f2b54d53f46dea84ccfd446f48f81b297b28c4f7fc017b818d69fed PKG_BUILD_PARALLEL:=1 PKG_INSTALL:=1 diff --git a/package/devel/gdb/patches/001-Add-support-for-readline-8.2.patch b/package/devel/gdb/patches/001-Add-support-for-readline-8.2.patch new file mode 100644 index 0000000000..eb93c7f290 --- /dev/null +++ b/package/devel/gdb/patches/001-Add-support-for-readline-8.2.patch @@ -0,0 +1,31 @@ +From 1add37b567a7dee39d99f37b37802034c3fce9c4 Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +Date: Sun, 20 Mar 2022 14:01:54 +0100 +Subject: [PATCH] Add support for readline 8.2 + +In readline 8.2 the type of rl_completer_word_break_characters changed to +include const. +--- + gdb/completer.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/gdb/completer.c ++++ b/gdb/completer.c +@@ -36,7 +36,7 @@ + calling a hook instead so we eliminate the CLI dependency. */ + #include "gdbcmd.h" + +-/* Needed for rl_completer_word_break_characters() and for ++/* Needed for rl_completer_word_break_characters and for + rl_filename_completion_function. */ + #include "readline/readline.h" + +@@ -2011,7 +2011,7 @@ gdb_completion_word_break_characters_thr + rl_basic_quote_characters = NULL; + } + +- return rl_completer_word_break_characters; ++ return (char *) rl_completer_word_break_characters; + } + + char * diff --git a/package/devel/gdb/patches/110-shared_libgcc.patch b/package/devel/gdb/patches/110-shared_libgcc.patch index 3979ccd26b..f1602bc695 100644 --- a/package/devel/gdb/patches/110-shared_libgcc.patch +++ b/package/devel/gdb/patches/110-shared_libgcc.patch @@ -1,6 +1,6 @@ --- a/configure.ac +++ b/configure.ac -@@ -1300,13 +1300,13 @@ if test -z "$LD"; then +@@ -1314,13 +1314,13 @@ if test -z "$LD"; then fi fi @@ -17,7 +17,7 @@ AC_LANG_PUSH(C++) AC_LINK_IFELSE([AC_LANG_SOURCE([ #if (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) -@@ -1705,7 +1705,7 @@ AC_ARG_WITH(stage1-ldflags, +@@ -1719,7 +1719,7 @@ AC_ARG_WITH(stage1-ldflags, # trust that they are doing what they want. if test "$with_static_standard_libraries" = yes -a "$stage1_libs" = "" \ -a "$have_static_libs" = yes; then @@ -26,7 +26,7 @@ fi]) AC_SUBST(stage1_ldflags) -@@ -1734,7 +1734,7 @@ AC_ARG_WITH(boot-ldflags, +@@ -1748,7 +1748,7 @@ AC_ARG_WITH(boot-ldflags, # statically. But if the user explicitly specified the libraries to # use, trust that they are doing what they want. if test "$poststage1_libs" = ""; then @@ -37,7 +37,7 @@ --- a/configure +++ b/configure -@@ -5257,14 +5257,14 @@ if test -z "$LD"; then +@@ -5275,14 +5275,14 @@ if test -z "$LD"; then fi fi @@ -56,7 +56,7 @@ ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -@@ -6149,7 +6149,7 @@ else +@@ -6167,7 +6167,7 @@ else # trust that they are doing what they want. if test "$with_static_standard_libraries" = yes -a "$stage1_libs" = "" \ -a "$have_static_libs" = yes; then @@ -65,7 +65,7 @@ fi fi -@@ -6185,7 +6185,7 @@ else +@@ -6203,7 +6203,7 @@ else # statically. But if the user explicitly specified the libraries to # use, trust that they are doing what they want. if test "$poststage1_libs" = ""; then diff --git a/package/devel/gdb/patches/130-gdb-ctrl-c.patch b/package/devel/gdb/patches/130-gdb-ctrl-c.patch index 72b7273434..f793a71cae 100644 --- a/package/devel/gdb/patches/130-gdb-ctrl-c.patch +++ b/package/devel/gdb/patches/130-gdb-ctrl-c.patch @@ -24,7 +24,7 @@ Signed-off-by: Khem Raj --- a/gdbserver/linux-low.cc +++ b/gdbserver/linux-low.cc -@@ -5733,7 +5733,7 @@ linux_process_target::request_interrupt +@@ -5496,7 +5496,7 @@ linux_process_target::request_interrupt { /* Send a SIGINT to the process group. This acts just like the user typed a ^C on the controlling terminal. */ diff --git a/package/devel/gperf/Makefile b/package/devel/gperf/Makefile new file mode 100644 index 0000000000..f0f794ee2d --- /dev/null +++ b/package/devel/gperf/Makefile @@ -0,0 +1,36 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=gperf +PKG_VERSION:=3.1 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=@GNU/gperf +PKG_HASH:=588546b945bba4b70b6a3a616e80b4ab466e3f33024a352fc2198112cdbb3ae2 + +PKG_LICENSE:=GPL-3.0 +PKG_LICENSE_FILES:=COPYING + +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/package.mk + +HOST_CPPFLAGS:=-I$(HOST_BUILD_DIR)/lib -I$(HOST_BUILD_DIR)/src $(HOST_CPPFLAGS) +TARGET_CPPFLAGS:=-I$(PKG_BUILD_DIR)/lib -I$(PKG_BUILD_DIR)/src $(TARGET_CPPFLAGS) + +define Package/gperf + SECTION:=devel + CATEGORY:=Development + TITLE:=GNU gperf + URL:=http://www.gnu.org/software/gperf +endef + +define Package/gperf/description + GNU gperf is a perfect hash function generator. For a given list of strings, + it produces a hash function and hash table, in form of C or C++ code, + for looking up a value depending on the input string. + The hash function is perfect, which means that the hash table has no collisions, + and the hash table lookup needs a single string comparison only. +endef + +$(eval $(call HostBuild)) +$(eval $(call BuildPackage,gperf)) diff --git a/package/devel/kselftests-bpf/Makefile b/package/devel/kselftests-bpf/Makefile new file mode 100644 index 0000000000..a5289d1fdc --- /dev/null +++ b/package/devel/kselftests-bpf/Makefile @@ -0,0 +1,63 @@ +# +# Copyright (C) 2021 Tony Ambardar +# +# 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:=kselftests-bpf +PKG_VERSION:=$(LINUX_VERSION) +PKG_RELEASE:=1 +PKG_MAINTAINER:=Tony Ambardar + +PKG_BUILD_FLAGS:=gc-sections lto +PKG_BUILD_PARALLEL:=1 +PKG_FLAGS:=nonshared + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/kselftests-bpf + SECTION:=devel + CATEGORY:=Development + DEPENDS:= +libelf +zlib +libpthread +librt @!IN_SDK \ + @KERNEL_DEBUG_FS @KERNEL_DEBUG_INFO_BTF @KERNEL_BPF_EVENTS + TITLE:=Linux Kernel Selftests (BPF) + URL:=http://www.kernel.org +endef + +define Package/kselftests-bpf/description + kselftests-bpf is the Linux kernel BPF test suite +endef + +TEST_TARGET = test_verifier + +MAKE_PATH:=tools/testing/selftests/bpf + +MAKE_VARS = \ + ARCH="$(LINUX_KARCH)" \ + CROSS_COMPILE="$(TARGET_CROSS)" \ + SAN_CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \ + LDLIBS="$(TARGET_LDFLAGS)" \ + TOOLCHAIN_INCLUDE="$(TOOLCHAIN_DIR)/include" \ + VMLINUX_BTF="$(LINUX_DIR)/vmlinux" + +MAKE_FLAGS = \ + $(if $(findstring c,$(LIBRECMC_VERBOSE)),V=1,V='') \ + O=$(PKG_BUILD_DIR) + +define Build/Compile + +$(MAKE_VARS) \ + $(MAKE) $(PKG_JOBS) -C $(LINUX_DIR)/$(MAKE_PATH) \ + $(MAKE_FLAGS) $(TEST_TARGET) ; +endef + +define Package/kselftests-bpf/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(TEST_TARGET) $(1)/usr/bin/ +endef + +$(eval $(call BuildPackage,kselftests-bpf)) diff --git a/package/devel/perf/Makefile b/package/devel/perf/Makefile index d556e2d9f0..c2bdc5f015 100644 --- a/package/devel/perf/Makefile +++ b/package/devel/perf/Makefile @@ -10,9 +10,9 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=perf PKG_VERSION:=$(LINUX_VERSION) -PKG_RELEASE:=4 +PKG_RELEASE:=5 -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 no-lto PKG_BUILD_PARALLEL:=1 PKG_MAINTAINER:=Felix Fietkau PKG_FLAGS:=nonshared @@ -62,7 +62,7 @@ MAKE_FLAGS = \ EXTRA_CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \ LDFLAGS="$(TARGET_LDFLAGS)" \ KBUILD_HOSTCFLAGS="$(HOST_CFLAGS)" \ - $(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') \ + $(if $(findstring c,$(LIBRECMC_VERBOSE)),V=1,V='') \ WERROR=0 \ O=$(PKG_BUILD_DIR) \ prefix=/usr diff --git a/package/devel/strace/Makefile b/package/devel/strace/Makefile index 71d7945003..9400608cdd 100644 --- a/package/devel/strace/Makefile +++ b/package/devel/strace/Makefile @@ -9,12 +9,12 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=strace -PKG_VERSION:=5.19 +PKG_VERSION:=6.3 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://strace.io/files/$(PKG_VERSION) -PKG_HASH:=aa3dc1c8e60e4f6ff3d396514aa247f3c7bf719d8a8dc4dd4fa793be786beca3 +PKG_HASH:=e17878e301506c1cc301611118ad14efee7f8bcef63b27ace5d290acce7bb731 PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=LGPL-2.1-or-later diff --git a/package/devel/trace-cmd/Makefile b/package/devel/trace-cmd/Makefile index e15b04ad23..687907acaa 100644 --- a/package/devel/trace-cmd/Makefile +++ b/package/devel/trace-cmd/Makefile @@ -1,18 +1,18 @@ include $(TOPDIR)/rules.mk PKG_NAME:=trace-cmd -PKG_VERSION:=v2.9.1 +PKG_VERSION:=v3.1.6 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git/snapshot/ -PKG_HASH:=9404fc3cf540ea795304608068c9db6cdb38b90584c7f3c43249785913d54b38 +PKG_SOURCE_URL:=https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/snapshot/ +PKG_HASH:=f9198ea306deee9cda3b262342b03b6029e82c1b9c671ba521739a9703e115b9 PKG_LICENSE:=GPL-2.0-only PKG_LICENSE_FILES:=COPYING PKG_INSTALL:=1 -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 PKG_BUILD_PARALLEL:=1 include $(INCLUDE_DIR)/package.mk @@ -21,42 +21,27 @@ define Package/trace-cmd SECTION:=devel CATEGORY:=Development TITLE:=Linux trace command line utility - DEPENDS:= + DEPENDS:=+libtracefs +zlib endef define Package/trace-cmd-extra SECTION:=devel CATEGORY:=Development TITLE:=Extra plugins for trace-cmd - DEPENDS:= + DEPENDS:=+libtraceevent-extra endef MAKE_FLAGS += \ NO_PYTHON=1 \ NO_AUDIT=1 \ + NO_LIBZSTD=1 \ prefix=/usr -PLUGINS_DIR := $(PKG_INSTALL_DIR)/usr/lib/traceevent/plugins -PLUGINS_MAIN := function hrtimer mac80211 sched_switch - TARGET_CFLAGS += --std=gnu99 -D_GNU_SOURCE define Package/trace-cmd/install $(INSTALL_DIR) $(1)/usr/bin $(1)/usr/lib/traceevent/plugins $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/trace-cmd $(1)/usr/bin/ - $(CP) \ - $(patsubst %,$(PLUGINS_DIR)/plugin_%.so,$(PLUGINS_MAIN)) \ - $(1)/usr/lib/traceevent/plugins -endef - -define Package/trace-cmd-extra/install - $(INSTALL_DIR) $(1)/usr/lib/traceevent/plugins - $(CP) \ - $$(patsubst %,$(PLUGINS_DIR)/plugin_%.so, \ - $$(filter-out $(PLUGINS_MAIN), \ - $$(patsubst $(PLUGINS_DIR)/plugin_%.so,%, \ - $$(wildcard $(PLUGINS_DIR)/plugin_*.so)))) \ - $(1)/usr/lib/traceevent/plugins endef $(eval $(call BuildPackage,trace-cmd)) diff --git a/package/devel/trace-cmd/patches/100-musl.patch b/package/devel/trace-cmd/patches/100-musl.patch deleted file mode 100644 index 80b419eb82..0000000000 --- a/package/devel/trace-cmd/patches/100-musl.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 1a000636c1828eecdcec5360a51623ef4ffbff04 Mon Sep 17 00:00:00 2001 -From: Beniamin Sandu -Date: Mon, 30 Nov 2020 14:27:55 +0200 -Subject: trace-cmd: make it build against musl C library - -* add some missing headers and macros -* set pthread affinity using pthread_setaffinity_np after creating the thread -instead of pthread_attr_setaffinity_np (which seems to not be implemented -in musl) - -Tested using https://musl.cc/x86_64-linux-musl-native.tgz - -Link: https://lore.kernel.org/linux-trace-devel/20201130122755.31000-1-beniaminsandu@gmail.com - -Reviewed-by: Tzvetomir Stoyanov (VMware) -Signed-off-by: Beniamin Sandu -[ Fixed a whitespace issue ] -Signed-off-by: Steven Rostedt (VMware) ---- - include/trace-cmd/trace-cmd.h | 1 + - lib/trace-cmd/include/trace-cmd-local.h | 1 + - lib/tracefs/tracefs-events.c | 1 + - tracecmd/include/trace-local.h | 1 + - tracecmd/trace-tsync.c | 16 +++++++++++----- - 5 files changed, 20 insertions(+), 5 deletions(-) - ---- a/include/trace-cmd/trace-cmd.h -+++ b/include/trace-cmd/trace-cmd.h -@@ -6,6 +6,7 @@ - #ifndef _TRACE_CMD_H - #define _TRACE_CMD_H - -+#include - #include "traceevent/event-parse.h" - - #define TRACECMD_MAGIC { 23, 8, 68 } ---- a/lib/trace-cmd/include/trace-cmd-local.h -+++ b/lib/trace-cmd/include/trace-cmd-local.h -@@ -26,5 +26,6 @@ void warning(const char *fmt, ...); - #endif - #endif - -+#include - - #endif /* _TRACE_CMD_LOCAL_H */ ---- a/lib/tracefs/tracefs-events.c -+++ b/lib/tracefs/tracefs-events.c -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - - #include "kbuffer.h" - #include "tracefs.h" ---- a/tracecmd/include/trace-local.h -+++ b/tracecmd/include/trace-local.h -@@ -8,6 +8,7 @@ - - #include - #include /* for DIR */ -+#include - - #include "trace-cmd.h" - #include "event-utils.h" ---- a/tracecmd/trace-tsync.c -+++ b/tracecmd/trace-tsync.c -@@ -104,13 +104,16 @@ int tracecmd_host_tsync(struct buffer_in - - pthread_attr_init(&attrib); - pthread_attr_setdetachstate(&attrib, PTHREAD_CREATE_JOINABLE); -- if (!get_first_cpu(&pin_mask, &mask_size)) -- pthread_attr_setaffinity_np(&attrib, mask_size, pin_mask); - - ret = pthread_create(&instance->tsync_thread, &attrib, - tsync_host_thread, &instance->tsync); -- if (!ret) -+ -+ if (!ret) { -+ if (!get_first_cpu(&pin_mask, &mask_size)) -+ pthread_setaffinity_np(instance->tsync_thread, mask_size, pin_mask); - instance->tsync_thread_running = true; -+ } -+ - if (pin_mask) - CPU_FREE(pin_mask); - pthread_attr_destroy(&attrib); -@@ -243,11 +246,14 @@ unsigned int tracecmd_guest_tsync(char * - pthread_attr_init(&attrib); - tsync->sync_proto = proto; - pthread_attr_setdetachstate(&attrib, PTHREAD_CREATE_JOINABLE); -- if (!get_first_cpu(&pin_mask, &mask_size)) -- pthread_attr_setaffinity_np(&attrib, mask_size, pin_mask); - - ret = pthread_create(thr_id, &attrib, tsync_agent_thread, tsync); - -+ if (!ret) { -+ if (!get_first_cpu(&pin_mask, &mask_size)) -+ pthread_setaffinity_np(*thr_id, mask_size, pin_mask); -+ } -+ - if (pin_mask) - CPU_FREE(pin_mask); - pthread_attr_destroy(&attrib); diff --git a/package/devel/trace-cmd/patches/110-mac80211_tracepoint.patch b/package/devel/trace-cmd/patches/110-mac80211_tracepoint.patch deleted file mode 100644 index cffcaa06b5..0000000000 --- a/package/devel/trace-cmd/patches/110-mac80211_tracepoint.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- a/lib/traceevent/plugins/plugin_mac80211.c -+++ b/lib/traceevent/plugins/plugin_mac80211.c -@@ -165,12 +165,15 @@ static int drv_config(struct trace_seq * - { 2, "IDLE" }, - { 3, "QOS"}, - ); -- tep_print_num_field(s, " chan:%d/", event, "center_freq", record, 1); -- print_enum(s, event, "channel_type", data, -- { 0, "noht" }, -- { 1, "ht20" }, -- { 2, "ht40-" }, -- { 3, "ht40+" }); -+ tep_print_num_field(s, " chan:%d@", event, "control_freq", record, 1); -+ print_enum(s, event, "chan_width", data, -+ { 0, "20_noht" }, -+ { 1, "20" }, -+ { 2, "40" }, -+ { 3, "80" }, -+ { 4, "80p80" }, -+ { 5, "160" }); -+ - trace_seq_putc(s, ' '); - SF("power_level"); - diff --git a/package/devel/valgrind/Makefile b/package/devel/valgrind/Makefile index e6ebff4b30..f696b28c3c 100644 --- a/package/devel/valgrind/Makefile +++ b/package/devel/valgrind/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=valgrind -PKG_VERSION:=3.18.1 +PKG_VERSION:=3.21.0 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -PKG_SOURCE_URL:=http://sourceware.org/pub/valgrind/ -PKG_HASH:=00859aa13a772eddf7822225f4b46ee0d39afbe071d32778da4d99984081f7f5 +PKG_SOURCE_URL:=https://sourceware.org/pub/valgrind/ +PKG_HASH:=10ce1618bb3e33fad16eb79552b0a3e1211762448a0d7fce11c8a6243b9ac971 PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0+ @@ -22,7 +22,7 @@ PKG_CPE_ID:=cpe:/a:valgrind:valgrind PKG_FIXUP = autoreconf PKG_INSTALL := 1 PKG_BUILD_PARALLEL := 1 -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 PKG_SSP:=0 STRIP:=: diff --git a/package/devel/valgrind/patches/010-mips-Fix-new-syscall-numbers.patch b/package/devel/valgrind/patches/010-mips-Fix-new-syscall-numbers.patch index e84273c973..5967b0cada 100644 --- a/package/devel/valgrind/patches/010-mips-Fix-new-syscall-numbers.patch +++ b/package/devel/valgrind/patches/010-mips-Fix-new-syscall-numbers.patch @@ -1,11 +1,11 @@ -From 86ab9452bd10f08dbfa22d94e1155838f6f9f2e0 Mon Sep 17 00:00:00 2001 +From 82e935c564699456a766044faa39367b47cce793 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sun, 31 Oct 2021 23:11:11 +0100 Subject: [PATCH] mips: Fix new syscall numbers The MIPS32 and MIPS64 O32 ABI are adding 4000 to all syscall numbers. The MIPS64 N64 ABI adds 5000 to each syscall and the MIPS64 N32 ABI adds -6000 to each syscall number. We can not sue the shared file for MIPS and +6000 to each syscall number. We can not use the shared file for MIPS and have to define this for each sycall separately. Without this change valgrind is not able to detect new syscalls like @@ -13,10 +13,10 @@ clock_gettime64 correctly. Signed-off-by: Hauke Mehrtens --- - include/pub_tool_vkiscnums_asm.h | 3 --- - include/vki/vki-scnums-mips32-linux.h | 36 +++++++++++++++++++++++++++ - include/vki/vki-scnums-mips64-linux.h | 32 ++++++++++++++++++++++++ - 3 files changed, 68 insertions(+), 3 deletions(-) + include/pub_tool_vkiscnums_asm.h | 3 -- + include/vki/vki-scnums-mips32-linux.h | 40 +++++++++++++++++++++++++++ + include/vki/vki-scnums-mips64-linux.h | 40 +++++++++++++++++++++++++++ + 3 files changed, 80 insertions(+), 3 deletions(-) --- a/include/pub_tool_vkiscnums_asm.h +++ b/include/pub_tool_vkiscnums_asm.h @@ -38,7 +38,7 @@ Signed-off-by: Hauke Mehrtens #elif defined(VGP_x86_freebsd) || defined(VGP_amd64_freebsd) --- a/include/vki/vki-scnums-mips32-linux.h +++ b/include/vki/vki-scnums-mips32-linux.h -@@ -401,6 +401,42 @@ +@@ -401,6 +401,46 @@ #define __NR_pkey_free (__NR_Linux + 365) #define __NR_statx (__NR_Linux + 366) @@ -73,17 +73,21 @@ Signed-off-by: Hauke Mehrtens +#define __NR_fsmount (__NR_Linux + 432) +#define __NR_fspick (__NR_Linux + 433) + ++#define __NR_pidfd_open (__NR_Linux + 434) +#define __NR_clone3 (__NR_Linux + 435) +#define __NR_close_range (__NR_Linux + 436) ++#define __NR_openat2 (__NR_Linux + 437) + +#define __NR_faccessat2 (__NR_Linux + 439) ++ ++#define __NR_epoll_pwait2 (__NR_Linux + 441) + /* * Offset of the last Linux o32 flavoured syscall */ --- a/include/vki/vki-scnums-mips64-linux.h +++ b/include/vki/vki-scnums-mips64-linux.h -@@ -363,6 +363,22 @@ +@@ -363,6 +363,26 @@ #define __NR_pkey_free (__NR_Linux + 325) #define __NR_statx (__NR_Linux + 326) @@ -98,15 +102,19 @@ Signed-off-by: Hauke Mehrtens +#define __NR_fsmount (__NR_Linux + 432) +#define __NR_fspick (__NR_Linux + 433) + ++#define __NR_pidfd_open (__NR_Linux + 434) +#define __NR_clone3 (__NR_Linux + 435) +#define __NR_close_range (__NR_Linux + 436) ++#define __NR_openat2 (__NR_Linux + 437) + +#define __NR_faccessat2 (__NR_Linux + 439) ++ ++#define __NR_epoll_pwait2 (__NR_Linux + 441) + #elif defined(VGABI_N32) /* -@@ -702,6 +718,22 @@ +@@ -702,6 +722,26 @@ #define __NR_pkey_free (__NR_Linux + 329) #define __NR_statx (__NR_Linux + 330) @@ -121,10 +129,14 @@ Signed-off-by: Hauke Mehrtens +#define __NR_fsmount (__NR_Linux + 432) +#define __NR_fspick (__NR_Linux + 433) + ++#define __NR_pidfd_open (__NR_Linux + 434) +#define __NR_clone3 (__NR_Linux + 435) +#define __NR_close_range (__NR_Linux + 436) ++#define __NR_openat2 (__NR_Linux + 437) + +#define __NR_faccessat2 (__NR_Linux + 439) ++ ++#define __NR_epoll_pwait2 (__NR_Linux + 441) + #else #error unknown mips64 abi diff --git a/package/devel/valgrind/patches/100-fix_configure_check.patch b/package/devel/valgrind/patches/100-fix_configure_check.patch index 6e9384ff88..5fa51977e7 100644 --- a/package/devel/valgrind/patches/100-fix_configure_check.patch +++ b/package/devel/valgrind/patches/100-fix_configure_check.patch @@ -1,6 +1,6 @@ --- a/configure.ac +++ b/configure.ac -@@ -345,7 +345,7 @@ case "${host_os}" in +@@ -364,7 +364,7 @@ case "${host_os}" in # Ok, this is linux. Check the kernel version AC_MSG_CHECKING([for the kernel version]) diff --git a/package/devel/valgrind/patches/130-fix_arm_arch_detection.patch b/package/devel/valgrind/patches/130-fix_arm_arch_detection.patch index 26291f777b..9a7b591e70 100644 --- a/package/devel/valgrind/patches/130-fix_arm_arch_detection.patch +++ b/package/devel/valgrind/patches/130-fix_arm_arch_detection.patch @@ -6,7 +6,7 @@ Last-Update: 2013-11-30 --- a/configure.ac +++ b/configure.ac -@@ -252,7 +252,7 @@ case "${host_cpu}" in +@@ -271,7 +271,7 @@ case "${host_cpu}" in ARCH_MAX="s390x" ;; diff --git a/package/devel/valgrind/patches/130-mips_fix_soft_float.patch b/package/devel/valgrind/patches/130-mips_fix_soft_float.patch index 427aa85524..9d3482815c 100644 --- a/package/devel/valgrind/patches/130-mips_fix_soft_float.patch +++ b/package/devel/valgrind/patches/130-mips_fix_soft_float.patch @@ -48,7 +48,7 @@ This fixes the following error message when compiling with a GCC 10 MIPS BE 32: --- a/coregrind/m_machine.c +++ b/coregrind/m_machine.c -@@ -2103,6 +2103,7 @@ Bool VG_(machine_get_hwcaps)( void ) +@@ -2106,6 +2106,7 @@ Bool VG_(machine_get_hwcaps)( void ) we are using alternative way to determine FP mode */ ULong result = 0; @@ -56,7 +56,7 @@ This fixes the following error message when compiling with a GCC 10 MIPS BE 32: if (!VG_MINIMAL_SETJMP(env_unsup_insn)) { __asm__ volatile ( ".set push\n\t" -@@ -2120,6 +2121,9 @@ Bool VG_(machine_get_hwcaps)( void ) +@@ -2123,6 +2124,9 @@ Bool VG_(machine_get_hwcaps)( void ) fpmode = (result != 0x3FF0000000000000ull); } diff --git a/package/firmware/linux-libre-firmware/Makefile b/package/firmware/linux-libre-firmware/Makefile old mode 100755 new mode 100644 diff --git a/package/firmware/linux-libre-firmware/qca.mk b/package/firmware/linux-libre-firmware/qca.mk old mode 100755 new mode 100644 diff --git a/package/firmware/wireless-regdb/Makefile b/package/firmware/wireless-regdb/Makefile index 9ce2a397ff..dfff35ff4d 100644 --- a/package/firmware/wireless-regdb/Makefile +++ b/package/firmware/wireless-regdb/Makefile @@ -1,12 +1,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=wireless-regdb -PKG_VERSION:=2023.05.03 +PKG_VERSION:=2023.09.01 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/software/network/wireless-regdb/ -PKG_HASH:=f254d08ab3765aeae2b856222e11a95d44aef519a6663877c71ef68fae4c8c12 +PKG_HASH:=26d4c2a727cc59239b84735aad856b7c7d0b04e30aa5c235c4f7f47f5f053491 PKG_MAINTAINER:=Felix Fietkau diff --git a/package/kernel/bpf-headers/Makefile b/package/kernel/bpf-headers/Makefile index 378856ed24..6b6cbf8ab1 100644 --- a/package/kernel/bpf-headers/Makefile +++ b/package/kernel/bpf-headers/Makefile @@ -13,12 +13,12 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=linux -PKG_PATCHVER:=5.10 +PKG_PATCHVER:=5.15 # Manually include kernel version and hash from kernel details file include $(INCLUDE_DIR)/kernel-$(PKG_PATCHVER) PKG_VERSION:=$(PKG_PATCHVER)$(strip $(LINUX_VERSION-$(PKG_PATCHVER))) -PKG_SOURCE:=$(PKG_NAME)-libre-$(PKG_VERSION)-gnu$(LIBRE_REV).tar.xz +PKG_SOURCE:=$(PKG_NAME)-libre-$(PKG_VERSION)-gnu.tar.xz PKG_SOURCE_URL:=$(LINUX_SITE) PKG_HASH:=$(LINUX_KERNEL_HASH-$(strip $(PKG_VERSION))) PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/bpf-headers/$(PKG_NAME)-$(PKG_VERSION) @@ -56,7 +56,6 @@ KERNEL_MAKE := \ LLVM=1 CC="$(CLANG)" LD="$(TARGET_CROSS)ld" \ HOSTCC="$(HOSTCC)" \ HOSTCXX="$(HOSTCXX)" \ - HOST_LOADLIBES="-L$(STAGING_DIR_HOST)/lib" \ KBUILD_HOSTLDLIBS="-L$(STAGING_DIR_HOST)/lib" \ CONFIG_SHELL="$(BASH)" \ INSTALL_HDR_PATH="$(PKG_BUILD_DIR)/user_headers" @@ -65,7 +64,7 @@ define Build/Patch $(Kernel/Patch/Default) endef -BPF_DOC = $(PKG_BUILD_DIR)/scripts/bpf_helpers_doc.py +BPF_DOC = $(PKG_BUILD_DIR)/scripts/bpf_doc.py define Build/Configure/64 echo 'CONFIG_CPU_MIPS64_R2=y' >> $(PKG_BUILD_DIR)/.config diff --git a/package/kernel/bpf-headers/patches/100-support_hz_300.patch b/package/kernel/bpf-headers/patches/100-support_hz_300.patch new file mode 100644 index 0000000000..9629958598 --- /dev/null +++ b/package/kernel/bpf-headers/patches/100-support_hz_300.patch @@ -0,0 +1,20 @@ +--- a/arch/mips/Kconfig ++++ b/arch/mips/Kconfig +@@ -2988,6 +2988,9 @@ choice + config HZ_256 + bool "256 HZ" if SYS_SUPPORTS_256HZ || SYS_SUPPORTS_ARBIT_HZ + ++ config HZ_300 ++ bool "300 HZ" if SYS_SUPPORTS_ARBIT_HZ ++ + config HZ_1000 + bool "1000 HZ" if SYS_SUPPORTS_1000HZ || SYS_SUPPORTS_ARBIT_HZ + +@@ -3039,6 +3042,7 @@ config HZ + default 128 if HZ_128 + default 250 if HZ_250 + default 256 if HZ_256 ++ default 300 if HZ_300 + default 1000 if HZ_1000 + default 1024 if HZ_1024 + diff --git a/package/kernel/button-hotplug/Makefile b/package/kernel/button-hotplug/Makefile index 55412e5685..8e8c02609c 100644 --- a/package/kernel/button-hotplug/Makefile +++ b/package/kernel/button-hotplug/Makefile @@ -28,23 +28,8 @@ define KernelPackage/button-hotplug/description If your device uses GPIO buttons, see gpio-button-hotplug. endef -EXTRA_KCONFIG:= \ - CONFIG_BUTTON_HOTPLUG=m - -EXTRA_CFLAGS:= \ - $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \ - $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \ - -MAKE_OPTS:= \ - $(KERNEL_MAKE_FLAGS) \ - M="$(PKG_BUILD_DIR)" \ - EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ - $(EXTRA_KCONFIG) - define Build/Compile - $(MAKE) -C "$(LINUX_DIR)" \ - $(MAKE_OPTS) \ - modules + $(KERNEL_MAKE) M="$(PKG_BUILD_DIR)" modules endef $(eval $(call KernelPackage,button-hotplug)) diff --git a/package/kernel/button-hotplug/src/Kconfig b/package/kernel/button-hotplug/src/Kconfig deleted file mode 100644 index aa292e9c13..0000000000 --- a/package/kernel/button-hotplug/src/Kconfig +++ /dev/null @@ -1,2 +0,0 @@ -config BUTTON_HOTPLUG - tristate "Button Hotplug driver" diff --git a/package/kernel/button-hotplug/src/Makefile b/package/kernel/button-hotplug/src/Makefile index 230d604f8c..e38fa40bb4 100644 --- a/package/kernel/button-hotplug/src/Makefile +++ b/package/kernel/button-hotplug/src/Makefile @@ -1 +1 @@ -obj-${CONFIG_BUTTON_HOTPLUG} += button-hotplug.o \ No newline at end of file +obj-m := button-hotplug.o diff --git a/package/kernel/cryptodev-linux/Makefile b/package/kernel/cryptodev-linux/Makefile index 345036b59d..0c1f63a605 100644 --- a/package/kernel/cryptodev-linux/Makefile +++ b/package/kernel/cryptodev-linux/Makefile @@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=cryptodev-linux PKG_VERSION:=1.12 -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=1 PKG_SOURCE_URL:=https://codeload.github.com/$(PKG_NAME)/$(PKG_NAME)/tar.gz/$(PKG_NAME)-$(PKG_VERSION)? PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz diff --git a/package/kernel/gpio-button-hotplug/Makefile b/package/kernel/gpio-button-hotplug/Makefile index 1957af30f0..be0b0af167 100644 --- a/package/kernel/gpio-button-hotplug/Makefile +++ b/package/kernel/gpio-button-hotplug/Makefile @@ -32,14 +32,8 @@ define KernelPackage/gpio-button-hotplug/description an overkill for libreCMC simple needs. endef -MAKE_OPTS:= \ - $(KERNEL_MAKE_FLAGS) \ - M="$(PKG_BUILD_DIR)" - define Build/Compile - $(MAKE) -C "$(LINUX_DIR)" \ - $(MAKE_OPTS) \ - modules + $(KERNEL_MAKE) M="$(PKG_BUILD_DIR)" modules endef $(eval $(call KernelPackage,gpio-button-hotplug)) diff --git a/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c b/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c index 9cad6814dd..88a661c24a 100644 --- a/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c +++ b/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c @@ -506,6 +506,13 @@ static int gpio_keys_button_probe(struct platform_device *pdev, goto out; } + if (button->irq) { + dev_err(dev, "skipping button %s (only gpio buttons supported)\n", + button->desc); + bdata->b = &pdata->buttons[i]; + continue; + } + if (gpio_is_valid(button->gpio)) { /* legacy platform data... but is it the lookup table? */ bdata->gpiod = devm_gpiod_get_index(dev, desc, i, diff --git a/package/kernel/ksmbd/Makefile b/package/kernel/ksmbd/Makefile deleted file mode 100644 index feeace9340..0000000000 --- a/package/kernel/ksmbd/Makefile +++ /dev/null @@ -1,73 +0,0 @@ -include $(TOPDIR)/rules.mk - -PKG_NAME:=ksmbd -PKG_VERSION:=3.4.7 -PKG_RELEASE:=1 - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://github.com/cifsd-team/ksmbd/releases/download/$(PKG_VERSION) -PKG_HASH:=ed9ecb2232046054bf0c1fef41690890f99d93b1d72b7e7d158746ac9be18c7f - -PKG_LICENSE:=GPL-2.0-or-later -PKG_LICENSE_FILES:=COPYING - -include $(INCLUDE_DIR)/kernel.mk -include $(INCLUDE_DIR)/package.mk - -TAR_OPTIONS+= --strip-components 1 -TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS) - -define KernelPackage/fs-ksmbd - SUBMENU:=Filesystems - TITLE:=SMB kernel server support - URL:=https://github.com/cifsd-team/cifsd - FILES:=$(PKG_BUILD_DIR)/ksmbd.ko - DEPENDS:= \ - +kmod-nls-base \ - +kmod-nls-utf8 \ - +kmod-crypto-md4 \ - +kmod-crypto-md5 \ - +kmod-crypto-hmac \ - +kmod-crypto-ecb \ - +kmod-crypto-des \ - +kmod-crypto-sha256 \ - +kmod-crypto-cmac \ - +kmod-crypto-sha512 \ - +kmod-crypto-aead \ - +kmod-crypto-ccm \ - +kmod-crypto-gcm \ - +kmod-asn1-decoder \ - +kmod-oid-registry -endef - -# The last two DEPENDS are hacks in order to get CONFIG_ASN1 and CONFIG_OID_REGISTRY -# which it seems can't be selected independently. Some bug in either base or upstream. - -define KernelPackage/fs-ksmbd/description - Ksmbd is an In-kernel SMBv(1)2/3 fileserver. - It's an implementation of the SMB protocol in kernel space for sharing files and IPC services over network. -endef - -define KernelPackage/fs-ksmbd/config -config KSMBD_SMB_INSECURE_SERVER - bool "Support for insecure SMB1/CIFS and SMB2.0 protocols" - depends on PACKAGE_kmod-fs-ksmbd - help - This enables deprecated insecure protocols dialects: SMB1/CIFS and SMB2.0. - default y -endef - -ifeq ($(CONFIG_KSMBD_SMB_INSECURE_SERVER),y) -PKG_EXTRA_KCONFIG:=CONFIG_SMB_INSECURE_SERVER=y -EXTRA_CFLAGS += -DCONFIG_SMB_INSECURE_SERVER=1 -endif - -define Build/Compile - $(KERNEL_MAKE) M="$(PKG_BUILD_DIR)" \ - EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ - $(PKG_EXTRA_KCONFIG) \ - CONFIG_SMB_SERVER=m \ - modules -endef - -$(eval $(call KernelPackage,fs-ksmbd)) diff --git a/package/kernel/ksmbd/patches/01-keep_kmod_metadata.patch b/package/kernel/ksmbd/patches/01-keep_kmod_metadata.patch deleted file mode 100644 index b2c6687d06..0000000000 --- a/package/kernel/ksmbd/patches/01-keep_kmod_metadata.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/glob.h -+++ b/glob.h -@@ -7,6 +7,8 @@ - #ifndef __KSMBD_GLOB_H - #define __KSMBD_GLOB_H - -+#undef CONFIG_MODULE_STRIPPED -+ - #include - - #include "unicode.h" diff --git a/package/kernel/linux/files/hotplug-sched-teql.sh b/package/kernel/linux/files/hotplug-sched-teql.sh index a0c0e503aa..2dc4ed4a84 100644 --- a/package/kernel/linux/files/hotplug-sched-teql.sh +++ b/package/kernel/linux/files/hotplug-sched-teql.sh @@ -12,7 +12,7 @@ config_get teql $INTERFACE teql if [ "$teql" != "" ]; then logger Adding device $DEVICE to TEQL master $teql - insmod sch_teql + modprobe sch_teql tc qdisc add dev $DEVICE root $teql # The kernel doesn't let us bring it up until it has at least one diff --git a/package/kernel/linux/modules/block.mk b/package/kernel/linux/modules/block.mk index 52541f2592..4ee3f78f38 100644 --- a/package/kernel/linux/modules/block.mk +++ b/package/kernel/linux/modules/block.mk @@ -90,21 +90,6 @@ endef $(eval $(call KernelPackage,ata-artop)) -define KernelPackage/ata-marvell-sata - TITLE:=Marvell Serial ATA support - KCONFIG:=CONFIG_SATA_MV - FILES:=$(LINUX_DIR)/drivers/ata/sata_mv.ko - AUTOLOAD:=$(call AutoLoad,41,sata_mv,1) - $(call AddDepends/ata) -endef - -define KernelPackage/ata-marvell-sata/description - SATA support for marvell chipsets -endef - -$(eval $(call KernelPackage,ata-marvell-sata)) - - define KernelPackage/ata-nvidia-sata TITLE:=Nvidia Serial ATA support KCONFIG:=CONFIG_SATA_NV @@ -465,7 +450,7 @@ define KernelPackage/loop CONFIG_BLK_DEV_LOOP \ CONFIG_BLK_DEV_CRYPTOLOOP=n FILES:=$(LINUX_DIR)/drivers/block/loop.ko - AUTOLOAD:=$(call AutoLoad,30,loop) + AUTOLOAD:=$(call AutoLoad,30,loop,1) endef define KernelPackage/loop/description @@ -520,7 +505,7 @@ define KernelPackage/nvme FILES:= \ $(LINUX_DIR)/drivers/nvme/host/nvme-core.ko \ $(LINUX_DIR)/drivers/nvme/host/nvme.ko - AUTOLOAD:=$(call AutoLoad,30,nvme-core nvme) + AUTOLOAD:=$(call AutoLoad,30,nvme-core nvme,1) endef define KernelPackage/nvme/description @@ -536,11 +521,13 @@ define KernelPackage/scsi-core TITLE:=SCSI device support KCONFIG:= \ CONFIG_SCSI \ + CONFIG_SCSI_COMMON \ CONFIG_BLK_DEV_SD FILES:= \ $(LINUX_DIR)/drivers/scsi/scsi_mod.ko \ + $(LINUX_DIR)/drivers/scsi/scsi_common.ko \ $(LINUX_DIR)/drivers/scsi/sd_mod.ko - AUTOLOAD:=$(call AutoLoad,40,scsi_mod sd_mod,1) + AUTOLOAD:=$(call AutoLoad,40,scsi_mod scsi_common sd_mod,1) endef $(eval $(call KernelPackage,scsi-core)) diff --git a/package/kernel/linux/modules/can.mk b/package/kernel/linux/modules/can.mk index 9cdebb9091..4ff85d1c01 100644 --- a/package/kernel/linux/modules/can.mk +++ b/package/kernel/linux/modules/can.mk @@ -152,7 +152,7 @@ define KernelPackage/can-mcp251x CONFIG_SPI=y \ CONFIG_CAN_MCP251X FILES:=$(LINUX_DIR)/drivers/net/can/spi/mcp251x.ko - AUTOLOAD:=$(call AutoProbe,can-mcp251x) + AUTOLOAD:=$(call AutoProbe,mcp251x) $(call AddDepends/can) endef diff --git a/package/kernel/linux/modules/crypto.mk b/package/kernel/linux/modules/crypto.mk index 71a62de798..ab23970477 100644 --- a/package/kernel/linux/modules/crypto.mk +++ b/package/kernel/linux/modules/crypto.mk @@ -42,7 +42,7 @@ define KernelPackage/crypto-aead CONFIG_CRYPTO_AEAD2 FILES:= \ $(LINUX_DIR)/crypto/aead.ko \ - $(LINUX_DIR)/crypto/geniv.ko@ge5.10 + $(LINUX_DIR)/crypto/geniv.ko AUTOLOAD:=$(call AutoLoad,09,aead,1) $(call AddDepends/crypto, +kmod-crypto-null) endef @@ -52,6 +52,7 @@ $(eval $(call KernelPackage,crypto-aead)) define KernelPackage/crypto-arc4 TITLE:=ARC4 cipher CryptoAPI module + DEPENDS:=+kmod-crypto-user KCONFIG:= \ CONFIG_CRYPTO_ARC4 \ CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y @@ -69,8 +70,10 @@ define KernelPackage/crypto-authenc TITLE:=Combined mode wrapper for IPsec DEPENDS:=+kmod-crypto-manager +kmod-crypto-null KCONFIG:=CONFIG_CRYPTO_AUTHENC - FILES:=$(LINUX_DIR)/crypto/authenc.ko - AUTOLOAD:=$(call AutoLoad,09,authenc) + FILES:= \ + $(LINUX_DIR)/crypto/authenc.ko \ + $(LINUX_DIR)/crypto/authencesn.ko + AUTOLOAD:=$(call AutoLoad,09,authenc authencesn) $(call AddDepends/crypto) endef @@ -415,6 +418,8 @@ endef $(eval $(call KernelPackage,crypto-hw-padlock)) + + define KernelPackage/crypto-hw-talitos TITLE:=Freescale integrated security engine (SEC) driver DEPENDS:=@(TARGET_mpc85xx||TARGET_layerscape) +kmod-crypto-manager \ @@ -511,7 +516,7 @@ define KernelPackage/crypto-lib-curve25519/config imply PACKAGE_kmod-crypto-kpp endef -define KernelPackage/crypto-lib-curve25519/x86/64 +define KernelPackage/crypto-lib-curve25519/x86_64 KCONFIG+=CONFIG_CRYPTO_CURVE25519_X86 FILES+=$(LINUX_DIR)/arch/x86/crypto/curve25519-x86_64.ko endef @@ -526,6 +531,11 @@ ifeq ($(ARCH)-$(CONFIG_KERNEL_MODE_NEON),arm-y) $(KernelPackage/crypto-lib-curve25519/arm-neon) endif +ifdef KernelPackage/crypto-lib-curve25519/$(ARCH) + KernelPackage/crypto-lib-curve25519/$(CRYPTO_TARGET)=\ + $(KernelPackage/crypto-lib-curve25519/$(ARCH)) +endif + $(eval $(call KernelPackage,crypto-lib-curve25519)) @@ -616,11 +626,16 @@ define KernelPackage/crypto-md5/octeon AUTOLOAD+=$(call AutoLoad,09,octeon-md5) endef -define KernelPackage/crypto-md5/mpc85xx +define KernelPackage/crypto-md5/powerpc FILES+=$(LINUX_DIR)/arch/powerpc/crypto/md5-ppc.ko AUTOLOAD+=$(call AutoLoad,09,md5-ppc) endef +ifdef KernelPackage/crypto-md5/$(ARCH) + KernelPackage/crypto-md5/$(CRYPTO_TARGET)=\ + $(KernelPackage/crypto-md5/$(ARCH)) +endif + $(eval $(call KernelPackage,crypto-md5)) @@ -638,7 +653,7 @@ $(eval $(call KernelPackage,crypto-michael-mic)) define KernelPackage/crypto-misc TITLE:=Other CryptoAPI modules - DEPENDS:=+kmod-crypto-xts + DEPENDS:=+kmod-crypto-xts +kmod-crypto-user KCONFIG:= \ CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y \ CONFIG_CRYPTO_CAMELLIA_X86_64 \ @@ -663,7 +678,6 @@ define KernelPackage/crypto-misc CONFIG_CRYPTO_KHAZAD \ CONFIG_CRYPTO_SERPENT \ CONFIG_CRYPTO_TEA \ - CONFIG_CRYPTO_TGR192 \ CONFIG_CRYPTO_TWOFISH \ CONFIG_CRYPTO_TWOFISH_COMMON \ CONFIG_CRYPTO_TWOFISH_586 \ @@ -676,7 +690,6 @@ define KernelPackage/crypto-misc $(LINUX_DIR)/crypto/cast6_generic.ko \ $(LINUX_DIR)/crypto/khazad.ko \ $(LINUX_DIR)/crypto/tea.ko \ - $(LINUX_DIR)/crypto/tgr192.ko \ $(LINUX_DIR)/crypto/twofish_common.ko \ $(LINUX_DIR)/crypto/wp512.ko \ $(LINUX_DIR)/crypto/twofish_generic.ko \ @@ -684,7 +697,7 @@ define KernelPackage/crypto-misc $(LINUX_DIR)/crypto/blowfish_generic.ko \ $(LINUX_DIR)/crypto/serpent_generic.ko AUTOLOAD:=$(call AutoLoad,10,anubis camellia_generic cast_common \ - cast5_generic cast6_generic khazad tea tgr192 twofish_common \ + cast5_generic cast6_generic khazad tea twofish_common \ wp512 blowfish_common serpent_generic) ifndef CONFIG_TARGET_x86 AUTOLOAD+= $(call AutoLoad,10,twofish_generic blowfish_generic) @@ -697,15 +710,14 @@ ifndef CONFIG_TARGET_x86_64 FILES+= \ $(LINUX_DIR)/arch/x86/crypto/twofish-i586.ko \ $(LINUX_DIR)/arch/x86/crypto/serpent-sse2-i586.ko \ - $(LINUX_DIR)/arch/x86/crypto/glue_helper.ko \ $(LINUX_DIR)/crypto/cryptd.ko \ $(LINUX_DIR)/crypto/crypto_simd.ko - AUTOLOAD+= $(call AutoLoad,10,cryptd glue_helper \ + AUTOLOAD+= $(call AutoLoad,10,cryptd \ serpent-sse2-i586 twofish-i586 blowfish_generic) endef endif -define KernelPackage/crypto-misc/x86/64 +define KernelPackage/crypto-misc/x86_64 FILES+= \ $(LINUX_DIR)/arch/x86/crypto/camellia-x86_64.ko \ $(LINUX_DIR)/arch/x86/crypto/blowfish-x86_64.ko \ @@ -725,6 +737,11 @@ define KernelPackage/crypto-misc/x86/64 twofish-avx-x86_64 blowfish-x86_64 serpent-avx-x86_64 serpent-avx2) endef +ifdef KernelPackage/crypto-misc/$(ARCH) + KernelPackage/crypto-misc/$(CRYPTO_TARGET)=\ + $(KernelPackage/crypto-misc/$(ARCH)) +endif + $(eval $(call KernelPackage,crypto-misc)) @@ -781,7 +798,7 @@ $(eval $(call KernelPackage,crypto-rmd160)) define KernelPackage/crypto-rng TITLE:=CryptoAPI random number generation - DEPENDS:=+kmod-crypto-hash +kmod-crypto-hmac +kmod-crypto-sha256 + DEPENDS:=+kmod-crypto-hash +kmod-crypto-hmac +kmod-crypto-sha512 KCONFIG:= \ CONFIG_CRYPTO_DRBG \ CONFIG_CRYPTO_DRBG_HMAC=y \ @@ -854,10 +871,17 @@ define KernelPackage/crypto-sha1/mpc85xx AUTOLOAD+=$(call AutoLoad,09,sha1-ppc-spe) endef -define KernelPackage/crypto-sha1/x86/64 +ifndef CONFIG_TARGET_uml +define KernelPackage/crypto-sha1/x86_64 FILES+=$(LINUX_DIR)/arch/x86/crypto/sha1-ssse3.ko AUTOLOAD+=$(call AutoLoad,09,sha1-ssse3) endef +endif + +ifdef KernelPackage/crypto-sha1/$(ARCH) + KernelPackage/crypto-sha1/$(CRYPTO_TARGET)=\ + $(KernelPackage/crypto-sha1/$(ARCH)) +endif $(eval $(call KernelPackage,crypto-sha1)) @@ -887,10 +911,17 @@ define KernelPackage/crypto-sha256/mpc85xx AUTOLOAD+=$(call AutoLoad,09,sha256-ppc-spe) endef -define KernelPackage/crypto-sha256/x86/64 +ifndef CONFIG_TARGET_uml +define KernelPackage/crypto-sha256/x86_64 FILES+=$(LINUX_DIR)/arch/x86/crypto/sha256-ssse3.ko AUTOLOAD+=$(call AutoLoad,09,sha256-ssse3) endef +endif + +ifdef KernelPackage/crypto-sha256/$(ARCH) + KernelPackage/crypto-sha256/$(CRYPTO_TARGET)=\ + $(KernelPackage/crypto-sha256/$(ARCH)) +endif $(eval $(call KernelPackage,crypto-sha256)) @@ -924,10 +955,17 @@ endef KernelPackage/crypto-sha512/tegra=$(KernelPackage/crypto-sha512/arm) -define KernelPackage/crypto-sha512/x86/64 +ifndef CONFIG_TARGET_uml +define KernelPackage/crypto-sha512/x86_64 FILES+=$(LINUX_DIR)/arch/x86/crypto/sha512-ssse3.ko AUTOLOAD+=$(call AutoLoad,09,sha512-ssse3) endef +endif + +ifdef KernelPackage/crypto-sha512/$(ARCH) + KernelPackage/crypto-sha512/$(CRYPTO_TARGET)=\ + $(KernelPackage/crypto-sha512/$(ARCH)) +endif $(eval $(call KernelPackage,crypto-sha512)) diff --git a/package/kernel/linux/modules/fs.mk b/package/kernel/linux/modules/fs.mk index c746479a3b..1dddebfed7 100644 --- a/package/kernel/linux/modules/fs.mk +++ b/package/kernel/linux/modules/fs.mk @@ -83,6 +83,23 @@ endef $(eval $(call KernelPackage,fs-btrfs)) +define KernelPackage/fs-smbfs-common + SUBMENU:=$(FS_MENU) + TITLE:=SMBFS common dependencies support + HIDDEN:=1 + KCONFIG:=CONFIG_SMBFS_COMMON + FILES:= \ + $(LINUX_DIR)/fs/smbfs_common/cifs_arc4.ko \ + $(LINUX_DIR)/fs/smbfs_common/cifs_md4.ko +endef + +define KernelPackage/fs-smbfs-common/description + Kernel module dependency for CIFS or SMB_SERVER support +endef + +$(eval $(call KernelPackage,fs-smbfs-common)) + + define KernelPackage/fs-cifs SUBMENU:=$(FS_MENU) TITLE:=CIFS support @@ -90,21 +107,24 @@ define KernelPackage/fs-cifs CONFIG_CIFS \ CONFIG_CIFS_DFS_UPCALL=n \ CONFIG_CIFS_UPCALL=n - FILES:=$(LINUX_DIR)/fs/cifs/cifs.ko + FILES:= \ + $(LINUX_DIR)/fs/cifs/cifs.ko AUTOLOAD:=$(call AutoLoad,30,cifs) $(call AddDepends/nls) DEPENDS+= \ - +kmod-crypto-md4 \ + +kmod-fs-smbfs-common \ +kmod-crypto-md5 \ +kmod-crypto-sha256 \ +kmod-crypto-sha512 \ +kmod-crypto-cmac \ +kmod-crypto-hmac \ - +kmod-crypto-arc4 \ +kmod-crypto-aead \ +kmod-crypto-ccm \ +kmod-crypto-ecb \ - +kmod-crypto-des + +kmod-crypto-des \ + +kmod-asn1-decoder \ + +kmod-oid-registry \ + +kmod-dnsresolver endef define KernelPackage/fs-cifs/description @@ -169,9 +189,7 @@ define KernelPackage/fs-exfat KCONFIG:= \ CONFIG_EXFAT_FS \ CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" - FILES:= \ - $(LINUX_DIR)/drivers/staging/exfat/exfat.ko@lt5.7 \ - $(LINUX_DIR)/fs/exfat/exfat.ko@ge5.7 + FILES:= $(LINUX_DIR)/fs/exfat/exfat.ko AUTOLOAD:=$(call AutoLoad,30,exfat,1) DEPENDS:=+kmod-nls-base endef @@ -242,18 +260,20 @@ $(eval $(call KernelPackage,fs-f2fs)) define KernelPackage/fs-fscache SUBMENU:=$(FS_MENU) TITLE:=General filesystem local cache manager - DEPENDS:= + DEPENDS:=+kmod-fs-netfs KCONFIG:=\ - CONFIG_FSCACHE=m \ + CONFIG_FSCACHE \ CONFIG_FSCACHE_STATS=y \ CONFIG_FSCACHE_HISTOGRAM=n \ CONFIG_FSCACHE_DEBUG=n \ CONFIG_FSCACHE_OBJECT_LIST=n \ - CONFIG_CACHEFILES=y \ + CONFIG_CACHEFILES \ CONFIG_CACHEFILES_DEBUG=n \ CONFIG_CACHEFILES_HISTOGRAM=n - FILES:=$(LINUX_DIR)/fs/fscache/fscache.ko - AUTOLOAD:=$(call AutoLoad,29,fscache) + FILES:= \ + $(LINUX_DIR)/fs/fscache/fscache.ko \ + $(LINUX_DIR)/fs/cachefiles/cachefiles.ko + AUTOLOAD:=$(call AutoLoad,29,fscache cachefiles) endef $(eval $(call KernelPackage,fs-fscache)) @@ -325,6 +345,43 @@ endef $(eval $(call KernelPackage,fs-jfs)) + +define KernelPackage/fs-ksmbd + SUBMENU:=$(FS_MENU) + TITLE:=SMB kernel server support + DEPENDS:= \ + +kmod-nls-base \ + +kmod-nls-utf8 \ + +kmod-crypto-md4 \ + +kmod-crypto-md5 \ + +kmod-crypto-hmac \ + +kmod-crypto-ecb \ + +kmod-crypto-des \ + +kmod-crypto-sha256 \ + +kmod-crypto-cmac \ + +kmod-crypto-sha512 \ + +kmod-crypto-aead \ + +kmod-crypto-ccm \ + +kmod-crypto-gcm \ + +kmod-asn1-decoder \ + +kmod-oid-registry \ + +kmod-fs-smbfs-common + KCONFIG:= \ + CONFIG_SMB_SERVER \ + CONFIG_SMB_SERVER_SMBDIRECT=n \ + CONFIG_SMB_SERVER_CHECK_CAP_NET_ADMIN=n \ + CONFIG_SMB_SERVER_KERBEROS5=n + FILES:=$(LINUX_DIR)/fs/ksmbd/ksmbd.ko + AUTOLOAD:=$(call AutoLoad,41,ksmbd) +endef + +define KernelPackage/fs-ksmbd/description + Kernel module for SMB kernel server support +endef + +$(eval $(call KernelPackage,fs-ksmbd)) + + define KernelPackage/fs-minix SUBMENU:=$(FS_MENU) TITLE:=Minix filesystem support @@ -357,6 +414,17 @@ endef $(eval $(call KernelPackage,fs-msdos)) +define KernelPackage/fs-netfs + SUBMENU:=$(FS_MENU) + TITLE:=Network Filesystems support + KCONFIG:= CONFIG_NETFS_SUPPORT + FILES:=$(LINUX_DIR)/fs/netfs/netfs.ko + AUTOLOAD:=$(call AutoLoad,28,netfs) +endef + +$(eval $(call KernelPackage,fs-netfs)) + + define KernelPackage/fs-nfs SUBMENU:=$(FS_MENU) TITLE:=NFS filesystem client support @@ -384,12 +452,18 @@ define KernelPackage/fs-nfs-common KCONFIG:= \ CONFIG_LOCKD \ CONFIG_SUNRPC \ - CONFIG_GRACE_PERIOD + CONFIG_GRACE_PERIOD \ + CONFIG_NFS_V4=y \ + CONFIG_NFS_V4_1=y \ + CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" \ + CONFIG_NFS_V4_1_MIGRATION=n \ + CONFIG_NFS_V4_2=y \ + CONFIG_NFS_V4_2_READ_PLUS=n FILES:= \ $(LINUX_DIR)/fs/lockd/lockd.ko \ $(LINUX_DIR)/net/sunrpc/sunrpc.ko \ $(LINUX_DIR)/fs/nfs_common/grace.ko \ - $(LINUX_DIR)/fs/nfs_common/nfs_ssc.ko@ge5.10 + $(LINUX_DIR)/fs/nfs_common/nfs_ssc.ko AUTOLOAD:=$(call AutoLoad,30,grace sunrpc lockd) endef @@ -470,7 +544,8 @@ define KernelPackage/fs-nfsd CONFIG_NFSD_BLOCKLAYOUT=n \ CONFIG_NFSD_SCSILAYOUT=n \ CONFIG_NFSD_FLEXFILELAYOUT=n \ - CONFIG_NFSD_FAULT_INJECTION=n + CONFIG_NFSD_FAULT_INJECTION=n \ + CONFIG_NFSD_V4_2_INTER_SSC=n FILES:=$(LINUX_DIR)/fs/nfsd/nfsd.ko AUTOLOAD:=$(call AutoLoad,40,nfsd) endef @@ -499,25 +574,23 @@ endef $(eval $(call KernelPackage,fs-ntfs)) -define KernelPackage/pstore +define KernelPackage/fs-ntfs3 SUBMENU:=$(FS_MENU) - TITLE:=Pstore file system - DEFAULT:=m if ALL_KMODS - KCONFIG:= \ - CONFIG_PSTORE \ - CONFIG_PSTORE_COMPRESS=y \ - CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" \ - CONFIG_PSTORE_DEFLATE_COMPRESS=y \ - CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y - FILES:= $(LINUX_DIR)/fs/pstore/pstore.ko - AUTOLOAD:=$(call AutoLoad,30,pstore,1) + TITLE:=NTFS filesystem read & write (new driver) support + KCONFIG:= CONFIG_NTFS3_FS CONFIG_NTFS3_FS_POSIX_ACL=y + FILES:=$(LINUX_DIR)/fs/ntfs3/ntfs3.ko + $(call AddDepends/nls) + AUTOLOAD:=$(call AutoLoad,80,ntfs3) endef -define KernelPackage/pstore/description - Kernel module for pstore filesystem support +define KernelPackage/fs-ntfs3/description + Kernel module for fully functional NTFS filesystem support. It allows + reading as well as writing. + + It supports NTFS versions up to 3.1. endef -$(eval $(call KernelPackage,pstore)) +$(eval $(call KernelPackage,fs-ntfs3)) define KernelPackage/fs-reiserfs @@ -577,7 +650,7 @@ define KernelPackage/fs-vfat FILES:= \ $(LINUX_DIR)/fs/fat/fat.ko \ $(LINUX_DIR)/fs/fat/vfat.ko - AUTOLOAD:=$(call AutoLoad,30,fat vfat) + AUTOLOAD:=$(call AutoLoad,30,fat vfat,1) $(call AddDepends/nls,cp437 iso8859-1 utf8) endef @@ -617,3 +690,24 @@ define KernelPackage/fuse/description endef $(eval $(call KernelPackage,fuse)) + + +define KernelPackage/pstore + SUBMENU:=$(FS_MENU) + TITLE:=Pstore file system + DEFAULT:=m if ALL_KMODS + KCONFIG:= \ + CONFIG_PSTORE \ + CONFIG_PSTORE_COMPRESS=y \ + CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" \ + CONFIG_PSTORE_DEFLATE_COMPRESS=y \ + CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y + FILES:= $(LINUX_DIR)/fs/pstore/pstore.ko + AUTOLOAD:=$(call AutoLoad,30,pstore,1) +endef + +define KernelPackage/pstore/description + Kernel module for pstore filesystem support +endef + +$(eval $(call KernelPackage,pstore)) diff --git a/package/kernel/linux/modules/hwmon.mk b/package/kernel/linux/modules/hwmon.mk index bef9f14302..29392548d4 100644 --- a/package/kernel/linux/modules/hwmon.mk +++ b/package/kernel/linux/modules/hwmon.mk @@ -108,6 +108,25 @@ endef $(eval $(call KernelPackage,hwmon-drivetemp)) +define KernelPackage/hwmon-gsc + TITLE:=Gateworks System Controller support + KCONFIG:=CONFIG_MFD_GATEWORKS_GSC \ + CONFIG_SENSORS_GSC + FILES:= \ + $(LINUX_DIR)/drivers/mfd/gateworks-gsc.ko \ + $(LINUX_DIR)/drivers/hwmon/gsc-hwmon.ko + AUTOLOAD:=$(call AutoLoad,20,gsc-hwmon,1) + $(call AddDepends/hwmon,+kmod-i2c-core) +endef + +define KernelPackage/hwmon-gsc/description + Kernel module for Gateworks System Controller with temperature sensor, +ADCs, and FAN controller +endef + +$(eval $(call KernelPackage,hwmon-gsc)) + + define KernelPackage/hwmon-gpiofan TITLE:=Generic GPIO FAN support KCONFIG:=CONFIG_SENSORS_GPIO_FAN @@ -335,6 +354,21 @@ endef $(eval $(call KernelPackage,hwmon-ltc4151)) +define KernelPackage/hwmon-max6642 + TITLE:=MAX6642 monitoring support + KCONFIG:=CONFIG_SENSORS_MAX6642 + FILES:=$(LINUX_DIR)/drivers/hwmon/max6642.ko + AUTOLOAD:=$(call AutoLoad,60,max6642 max6642) + $(call AddDepends/hwmon,+kmod-i2c-core) +endef + +define KernelPackage/hwmon-max6642/description + Kernel module for Maxim MAX6642 temperature monitor +endef + +$(eval $(call KernelPackage,hwmon-max6642)) + + define KernelPackage/hwmon-mcp3021 TITLE:=MCP3021/3221 monitoring support KCONFIG:=CONFIG_SENSORS_MCP3021 @@ -534,6 +568,20 @@ endef $(eval $(call KernelPackage,hwmon-tmp421)) +define KernelPackage/hwmon-tps23861 + TITLE:=Texas Instruments TPS23861 PoE PSE + KCONFIG:=CONFIG_SENSORS_TPS23861 + FILES:=$(LINUX_DIR)/drivers/hwmon/tps23861.ko + AUTOLOAD:=$(call AutoProbe,tps23861) + $(call AddDepends/hwmon,+kmod-i2c-core +kmod-regmap-i2c) +endef + +define KernelPackage/hwmon-tps23861/description + Kernel module for the Texas Instruments TPS23861 802.3at PoE PSE chips. +endef + +$(eval $(call KernelPackage,hwmon-tps23861)) + define KernelPackage/hwmon-vid TITLE:=VID/VRM/VRD voltage conversion module. KCONFIG:=CONFIG_HWMON_VID diff --git a/package/kernel/linux/modules/i2c.mk b/package/kernel/linux/modules/i2c.mk index f429763227..6b3cf98345 100644 --- a/package/kernel/linux/modules/i2c.mk +++ b/package/kernel/linux/modules/i2c.mk @@ -90,7 +90,7 @@ I2C_DWCORE_MODULES:= \ define KernelPackage/i2c-designware-core $(call i2c_defaults,$(I2C_DWCORE_MODULES),58) TITLE:=Synopsys DesignWare I2C core - DEPENDS:=+kmod-i2c-core +!LINUX_5_4:kmod-regmap-core + DEPENDS:=+kmod-i2c-core +kmod-regmap-core HIDDEN:=y endef @@ -103,7 +103,7 @@ I2C_DWPCI_MODULES:= \ define KernelPackage/i2c-designware-pci $(call i2c_defaults,$(I2C_DWPCI_MODULES),59) TITLE:=Synopsys DesignWare PCI - DEPENDS:=+kmod-i2c-designware-core + DEPENDS:=@PCI_SUPPORT +kmod-i2c-designware-core endef define KernelPackage/i2c-designware-pci/description diff --git a/package/kernel/linux/modules/iio.mk b/package/kernel/linux/modules/iio.mk index 6a2e040377..f901f87ddd 100644 --- a/package/kernel/linux/modules/iio.mk +++ b/package/kernel/linux/modules/iio.mk @@ -25,14 +25,17 @@ endef $(eval $(call KernelPackage,iio-core)) +define AddDepends/iio + SUBMENU:=$(IIO_MENU) + DEPENDS+=+kmod-iio-core $(1) +endef define KernelPackage/iio-kfifo-buf - SUBMENU:=$(IIO_MENU) TITLE:=Industrial I/O buffering based on kfifo - DEPENDS:=+kmod-iio-core KCONFIG:=CONFIG_IIO_KFIFO_BUF FILES:=$(LINUX_DIR)/drivers/iio/buffer/kfifo_buf.ko AUTOLOAD:=$(call AutoLoad,55,kfifo_buf) + $(call AddDepends/iio) endef define KernelPackage/iio-kfifo-buf/description @@ -44,12 +47,12 @@ $(eval $(call KernelPackage,iio-kfifo-buf)) define KernelPackage/industrialio-triggered-buffer - SUBMENU:=$(IIO_MENU) TITLE:=Provides helper functions for setting up triggered buffers. - DEPENDS:=+kmod-iio-core +kmod-iio-kfifo-buf + DEPENDS:=+kmod-iio-kfifo-buf KCONFIG:=CONFIG_IIO_TRIGGERED_BUFFER FILES:=$(LINUX_DIR)/drivers/iio/buffer/industrialio-triggered-buffer.ko AUTOLOAD:=$(call AutoLoad,55,industrialio-triggered-buffer) + $(call AddDepends/iio) endef define KernelPackage/industrialio-triggered-buffer/description @@ -60,14 +63,14 @@ $(eval $(call KernelPackage,industrialio-triggered-buffer)) define KernelPackage/iio-ad799x - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-i2c-core +kmod-iio-core +kmod-industrialio-triggered-buffer + DEPENDS:=+kmod-i2c-core +kmod-industrialio-triggered-buffer TITLE:=Analog Devices AD799x ADC driver KCONFIG:= \ CONFIG_AD799X_RING_BUFFER=y \ CONFIG_AD799X FILES:=$(LINUX_DIR)/drivers/iio/adc/ad799x.ko AUTOLOAD:=$(call AutoLoad,56,ad799x) + $(call AddDepends/iio) endef define KernelPackage/iio-ad799x/description @@ -79,12 +82,12 @@ endef $(eval $(call KernelPackage,iio-ad799x)) define KernelPackage/iio-ads1015 - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-i2c-core +kmod-iio-core +kmod-regmap-i2c +kmod-industrialio-triggered-buffer + DEPENDS:=+kmod-i2c-core +kmod-regmap-i2c +kmod-industrialio-triggered-buffer TITLE:=Texas Instruments ADS1015 ADC driver KCONFIG:= CONFIG_TI_ADS1015 FILES:=$(LINUX_DIR)/drivers/iio/adc/ti-ads1015.ko AUTOLOAD:=$(call AutoLoad,56,ti-ads1015) + $(call AddDepends/iio) endef define KernelPackage/iio-ads1015/description @@ -94,14 +97,14 @@ endef $(eval $(call KernelPackage,iio-ads1015)) define KernelPackage/iio-hmc5843 - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-i2c-core +kmod-iio-core +kmod-regmap-i2c +kmod-industrialio-triggered-buffer + DEPENDS:=+kmod-i2c-core +kmod-regmap-i2c +kmod-industrialio-triggered-buffer TITLE:=Honeywell HMC58x3 Magnetometer KCONFIG:= CONFIG_SENSORS_HMC5843_I2C FILES:= \ $(LINUX_DIR)/drivers/iio/magnetometer/hmc5843_i2c.ko \ $(LINUX_DIR)/drivers/iio/magnetometer/hmc5843_core.ko AUTOLOAD:=$(call AutoLoad,56,hmc5843) + $(call AddDepends/iio) endef define KernelPackage/iio-hmc5843/description @@ -111,12 +114,12 @@ endef $(eval $(call KernelPackage,iio-hmc5843)) define KernelPackage/iio-bh1750 - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-i2c-core +kmod-iio-core + DEPENDS:=+kmod-i2c-core TITLE:=ROHM BH1750 ambient light sensor KCONFIG:= CONFIG_BH1750 FILES:=$(LINUX_DIR)/drivers/iio/light/bh1750.ko AUTOLOAD:=$(call AutoLoad,56,bh1750) + $(call AddDepends/iio) endef define KernelPackage/iio-bh1750/description ROHM BH1750 ambient light sensor (i2c bus) @@ -124,12 +127,12 @@ endef $(eval $(call KernelPackage,iio-bh1750)) define KernelPackage/iio-am2315 - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-i2c-core +kmod-iio-core +kmod-industrialio-triggered-buffer + DEPENDS:=+kmod-i2c-core +kmod-industrialio-triggered-buffer TITLE:=Asong AM2315 humidity/temperature sensor KCONFIG:= CONFIG_AM2315 FILES:=$(LINUX_DIR)/drivers/iio/humidity/am2315.ko AUTOLOAD:=$(call AutoLoad,56,am2315) + $(call AddDepends/iio) endef define KernelPackage/iio-am2315/description Aosong AM2315 humidity/temperature sensor (I2C bus) @@ -137,13 +140,13 @@ endef $(eval $(call KernelPackage,iio-am2315)) define KernelPackage/iio-mxs-lradc - SUBMENU:=$(IIO_MENU) - DEPENDS:=@TARGET_mxs +kmod-iio-core +kmod-industrialio-triggered-buffer + DEPENDS:=@TARGET_mxs +kmod-industrialio-triggered-buffer TITLE:=Freescale i.MX23/i.MX28 LRADC ADC driver KCONFIG:= \ CONFIG_MXS_LRADC_ADC FILES:=$(LINUX_DIR)/drivers/iio/adc/mxs-lradc-adc.ko AUTOLOAD:=$(call AutoLoad,56,mxs-lradc-adc) + $(call AddDepends/iio) endef define KernelPackage/iio-mxs-lradc/description @@ -153,13 +156,13 @@ endef $(eval $(call KernelPackage,iio-mxs-lradc)) define KernelPackage/iio-dht11 - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-iio-core @GPIO_SUPPORT @USES_DEVICETREE + DEPENDS:=@GPIO_SUPPORT @USES_DEVICETREE TITLE:=DHT11 (and compatible) humidity and temperature sensors KCONFIG:= \ CONFIG_DHT11 FILES:=$(LINUX_DIR)/drivers/iio/humidity/dht11.ko AUTOLOAD:=$(call AutoLoad,56,dht11) + $(call AddDepends/iio) endef define KernelPackage/iio-dht11/description @@ -172,11 +175,11 @@ $(eval $(call KernelPackage,iio-dht11)) define KernelPackage/iio-bme680 - SUBMENU:=$(IIO_MENU) TITLE:=BME680 gas/humidity/pressure/temperature sensor - DEPENDS:=+kmod-iio-core +kmod-regmap-core + DEPENDS:=+kmod-regmap-core KCONFIG:=CONFIG_BME680 FILES:=$(LINUX_DIR)/drivers/iio/chemical/bme680_core.ko + $(call AddDepends/iio) endef define KernelPackage/iio-bme680/description @@ -187,12 +190,12 @@ endef $(eval $(call KernelPackage,iio-bme680)) define KernelPackage/iio-bme680-i2c - SUBMENU:=$(IIO_MENU) TITLE:=BME680 gas/humidity/pressure/temperature sensor (I2C) DEPENDS:=+kmod-iio-bme680 +kmod-regmap-i2c KCONFIG:=CONFIG_BME680_I2C FILES:=$(LINUX_DIR)/drivers/iio/chemical/bme680_i2c.ko AUTOLOAD:=$(call AutoProbe,bme680-i2c) + $(call AddDepends/iio) endef define KernelPackage/iio-bme680-i2c/description This driver adds support for Bosch Sensortec's BME680 connected via I2C. @@ -201,12 +204,12 @@ endef $(eval $(call KernelPackage,iio-bme680-i2c)) define KernelPackage/iio-bme680-spi - SUBMENU:=$(IIO_MENU) TITLE:=BME680 gas/humidity/pressure/temperature sensor (SPI) DEPENDS:=+kmod-iio-bme680 +kmod-regmap-spi KCONFIG:=CONFIG_BME680_SPI FILES:=$(LINUX_DIR)/drivers/iio/chemical/bme680_spi.ko AUTOLOAD:=$(call AutoProbe,bme680-spi) + $(call AddDepends/iio) endef define KernelPackage/iio-bme680-spi/description This driver adds support for Bosch Sensortec's BME680 connected via SPI. @@ -216,11 +219,11 @@ $(eval $(call KernelPackage,iio-bme680-spi)) define KernelPackage/iio-bmp280 - SUBMENU:=$(IIO_MENU) TITLE:=BMP180/BMP280/BME280 pressure/temperatur sensor - DEPENDS:=+kmod-iio-core +kmod-regmap-core + DEPENDS:=+kmod-regmap-core KCONFIG:=CONFIG_BMP280 FILES:=$(LINUX_DIR)/drivers/iio/pressure/bmp280.ko + $(call AddDepends/iio) endef define KernelPackage/iio-bmp280/description @@ -233,12 +236,12 @@ $(eval $(call KernelPackage,iio-bmp280)) define KernelPackage/iio-bmp280-i2c - SUBMENU:=$(IIO_MENU) TITLE:=BMP180/BMP280/BME280 pressure/temperatur sensor (I2C) DEPENDS:=+kmod-iio-bmp280 +kmod-i2c-core +kmod-regmap-i2c KCONFIG:=CONFIG_BMP280_I2C FILES:=$(LINUX_DIR)/drivers/iio/pressure/bmp280-i2c.ko AUTOLOAD:=$(call AutoProbe,bmp280-i2c) + $(call AddDepends/iio) endef define KernelPackage/iio-bmp280-i2c/description This driver adds support for Bosch Sensortec's digital pressure and @@ -249,12 +252,12 @@ $(eval $(call KernelPackage,iio-bmp280-i2c)) define KernelPackage/iio-bmp280-spi - SUBMENU:=$(IIO_MENU) TITLE:=BMP180/BMP280/BME280 pressure/temperatur sensor (SPI) DEPENDS:=+kmod-iio-bmp280 +kmod-spi-bitbang KCONFIG:=CONFIG_BMP280_SPI FILES:=$(LINUX_DIR)/drivers/iio/pressure/bmp280-spi.ko AUTOLOAD:=$(call AutoProbe,bmp280-spi) + $(call AddDepends/iio) endef define KernelPackage/iio-bmp280-spi/description This driver adds support for Bosch Sensortec's digital pressure and @@ -264,8 +267,7 @@ endef $(eval $(call KernelPackage,iio-bmp280-spi)) define KernelPackage/iio-htu21 - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-i2c-core +kmod-iio-core + DEPENDS:=+kmod-i2c-core TITLE:=HTU21 humidity & temperature sensor KCONFIG:= \ CONFIG_HTU21 \ @@ -274,6 +276,7 @@ define KernelPackage/iio-htu21 $(LINUX_DIR)/drivers/iio/humidity/htu21.ko \ $(LINUX_DIR)/drivers/iio/common/ms_sensors/ms_sensors_i2c.ko AUTOLOAD:=$(call AutoLoad,56,htu21) + $(call AddDepends/iio) endef define KernelPackage/iio-htu21/description @@ -287,13 +290,13 @@ $(eval $(call KernelPackage,iio-htu21)) define KernelPackage/iio-ccs811 - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-i2c-core +kmod-iio-core +kmod-industrialio-triggered-buffer + DEPENDS:=+kmod-i2c-core +kmod-industrialio-triggered-buffer TITLE:=AMS CCS811 VOC sensor KCONFIG:= \ CONFIG_CCS811 FILES:= $(LINUX_DIR)/drivers/iio/chemical/ccs811.ko AUTOLOAD:=$(call AutoLoad,56,ccs811) + $(call AddDepends/iio) endef define KernelPackage/iio-ccs811/description @@ -304,12 +307,12 @@ $(eval $(call KernelPackage,iio-ccs811)) define KernelPackage/iio-si7020 - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-i2c-core +kmod-iio-core + DEPENDS:=+kmod-i2c-core TITLE:=Silicon Labs Si7020 sensor KCONFIG:= CONFIG_SI7020 FILES:=$(LINUX_DIR)/drivers/iio/humidity/si7020.ko AUTOLOAD:=$(call AutoLoad,56,si7020) + $(call AddDepends/iio) endef define KernelPackage/iio-si7020/description @@ -322,15 +325,15 @@ $(eval $(call KernelPackage,iio-si7020)) define KernelPackage/iio-st_accel - SUBMENU:=$(IIO_MENU) TITLE:=STMicroelectronics accelerometer 3-Axis Driver - DEPENDS:=+kmod-iio-core +kmod-regmap-core +kmod-industrialio-triggered-buffer + DEPENDS:=+kmod-regmap-core +kmod-industrialio-triggered-buffer KCONFIG:= \ CONFIG_IIO_ST_ACCEL_3AXIS \ CONFIG_IIO_ST_SENSORS_CORE FILES:= \ $(LINUX_DIR)/drivers/iio/accel/st_accel.ko \ $(LINUX_DIR)/drivers/iio/common/st_sensors/st_sensors.ko + $(call AddDepends/iio) endef define KernelPackage/iio-st_accel/description @@ -344,7 +347,6 @@ $(eval $(call KernelPackage,iio-st_accel)) define KernelPackage/iio-st_accel-i2c - SUBMENU:=$(IIO_MENU) TITLE:=STMicroelectronics accelerometer 3-Axis Driver (I2C) DEPENDS:=+kmod-iio-st_accel +kmod-i2c-core +kmod-regmap-i2c KCONFIG:= CONFIG_IIO_ST_ACCEL_I2C_3AXIS @@ -352,6 +354,7 @@ define KernelPackage/iio-st_accel-i2c $(LINUX_DIR)/drivers/iio/accel/st_accel_i2c.ko \ $(LINUX_DIR)/drivers/iio/common/st_sensors/st_sensors_i2c.ko AUTOLOAD:=$(call AutoLoad,56,st_accel_i2c) + $(call AddDepends/iio) endef define KernelPackage/iio-st_accel-i2c/description @@ -362,7 +365,6 @@ $(eval $(call KernelPackage,iio-st_accel-i2c)) define KernelPackage/iio-st_accel-spi - SUBMENU:=$(IIO_MENU) TITLE:=STMicroelectronics accelerometer 3-Axis Driver (SPI) DEPENDS:=+kmod-iio-st_accel +kmod-regmap-spi KCONFIG:= CONFIG_IIO_ST_ACCEL_SPI_3AXIS @@ -370,6 +372,7 @@ define KernelPackage/iio-st_accel-spi $(LINUX_DIR)/drivers/iio/accel/st_accel_spi.ko \ $(LINUX_DIR)/drivers/iio/common/st_sensors/st_sensors_spi.ko AUTOLOAD:=$(call AutoLoad,56,st_accel_spi) + $(call AddDepends/iio) endef define KernelPackage/iio-st_accel-spi/description @@ -380,12 +383,12 @@ $(eval $(call KernelPackage,iio-st_accel-spi)) define KernelPackage/iio-lsm6dsx - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-iio-core +kmod-iio-kfifo-buf +kmod-regmap-core + DEPENDS:=+kmod-iio-kfifo-buf +kmod-regmap-core TITLE:=ST LSM6DSx driver for IMU MEMS sensors KCONFIG:=CONFIG_IIO_ST_LSM6DSX FILES:=$(LINUX_DIR)/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.ko AUTOLOAD:=$(call AutoProbe,st_lsm6dsx) + $(call AddDepends/iio) endef define KernelPackage/iio-lsm6dsx/description @@ -396,12 +399,12 @@ $(eval $(call KernelPackage,iio-lsm6dsx)) define KernelPackage/iio-lsm6dsx-i2c - SUBMENU:=$(IIO_MENU) DEPENDS:=+kmod-iio-lsm6dsx +kmod-i2c-core +kmod-regmap-i2c TITLE:=ST LSM6DSx driver for IMU MEMS sensors (I2C) KCONFIG:=CONFIG_IIO_ST_LSM6DSX FILES:=$(LINUX_DIR)/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.ko AUTOLOAD:=$(call AutoProbe,st_lsm6dsx-i2c) + $(call AddDepends/iio) endef define KernelPackage/iio-lsm6dsx-i2c/description @@ -412,12 +415,12 @@ $(eval $(call KernelPackage,iio-lsm6dsx-i2c)) define KernelPackage/iio-lsm6dsx-spi - SUBMENU:=$(IIO_MENU) DEPENDS:=+kmod-iio-lsm6dsx +kmod-regmap-spi TITLE:=ST LSM6DSx driver for IMU MEMS sensors (SPI) KCONFIG:=CONFIG_IIO_ST_LSM6DSX FILES:=$(LINUX_DIR)/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.ko AUTOLOAD:=$(call AutoProbe,st_lsm6dsx-spi) + $(call AddDepends/iio) endef define KernelPackage/iio-lsm6dsx-spi/description @@ -428,12 +431,16 @@ $(eval $(call KernelPackage,iio-lsm6dsx-spi)) define KernelPackage/iio-sps30 - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-i2c-core +kmod-iio-core +kmod-industrialio-triggered-buffer +kmod-lib-crc8 + DEPENDS:=+kmod-i2c-core +kmod-industrialio-triggered-buffer +kmod-lib-crc8 TITLE:=Sensirion SPS30 particulate matter sensor - KCONFIG:=CONFIG_SPS30 - FILES:=$(LINUX_DIR)/drivers/iio/chemical/sps30.ko - AUTOLOAD:=$(call AutoProbe,sps30) + KCONFIG:= \ + CONFIG_SPS30 \ + CONFIG_SPS30_I2C + FILES:= \ + $(LINUX_DIR)/drivers/iio/chemical/sps30.ko \ + $(LINUX_DIR)/drivers/iio/chemical/sps30_i2c.ko + AUTOLOAD:=$(call AutoProbe,sps30 sps30_i2c) + $(call AddDepends/iio) endef define KernelPackage/iio-sps30/description @@ -444,12 +451,12 @@ $(eval $(call KernelPackage,iio-sps30)) define KernelPackage/iio-tsl4531 - SUBMENU:=$(IIO_MENU) - DEPENDS:=+kmod-i2c-core +kmod-iio-core + DEPENDS:=+kmod-i2c-core TITLE:=TAOS TSL4531 ambient light sensor KCONFIG:= CONFIG_TSL4531 FILES:=$(LINUX_DIR)/drivers/iio/light/tsl4531.ko AUTOLOAD:=$(call AutoLoad,56,tsl4531) + $(call AddDepends/iio) endef define KernelPackage/iio-tsl4531/description @@ -462,12 +469,12 @@ $(eval $(call KernelPackage,iio-tsl4531)) define KernelPackage/iio-fxas21002c - SUBMENU:=$(IIO_MENU) TITLE:=Freescale FXAS21002C 3-axis gyro driver - DEPENDS:=+kmod-iio-core +kmod-regmap-core +kmod-industrialio-triggered-buffer + DEPENDS:=+kmod-regmap-core +kmod-industrialio-triggered-buffer KCONFIG:= CONFIG_FXAS21002C FILES:=$(LINUX_DIR)/drivers/iio/gyro/fxas21002c_core.ko AUTOLOAD:=$(call AutoLoad,56,fxas21002c) + $(call AddDepends/iio) endef define KernelPackage/iio-fxas21002c/description @@ -478,12 +485,12 @@ $(eval $(call KernelPackage,iio-fxas21002c)) define KernelPackage/iio-fxas21002c-i2c - SUBMENU:=$(IIO_MENU) TITLE:=Freescale FXAS21002C 3-axis gyro driver (I2C) DEPENDS:=+kmod-iio-fxas21002c +kmod-i2c-core +kmod-regmap-i2c KCONFIG:= CONFIG_FXAS21002C_I2C FILES:=$(LINUX_DIR)/drivers/iio/gyro/fxas21002c_i2c.ko AUTOLOAD:=$(call AutoLoad,56,fxas21002c_i2c) + $(call AddDepends/iio) endef define KernelPackage/iio-fxas21002c-i2c/description @@ -495,12 +502,12 @@ endef $(eval $(call KernelPackage,iio-fxas21002c-i2c)) define KernelPackage/iio-fxas21002c-spi - SUBMENU:=$(IIO_MENU) DEPENDS:=+kmod-iio-fxas21002c +kmod-regmap-spi TITLE:=Freescale FXAS21002C 3-axis gyro driver (SPI) KCONFIG:= CONFIG_FXAS21002C_SPI FILES:=$(LINUX_DIR)/drivers/iio/gyro/fxas21002c_spi.ko AUTOLOAD:=$(call AutoLoad,56,fxas21002c_spi) + $(call AddDepends/iio) endef define KernelPackage/iio-fxas21002c-spi/description @@ -512,12 +519,12 @@ $(eval $(call KernelPackage,iio-fxas21002c-spi)) define KernelPackage/iio-fxos8700 - SUBMENU:=$(IIO_MENU) TITLE:=Freescale FXOS8700 3-axis accelerometer driver - DEPENDS:=+kmod-iio-core +kmod-regmap-core + DEPENDS:=+kmod-regmap-core KCONFIG:= CONFIG_FXOS8700 FILES:=$(LINUX_DIR)/drivers/iio/imu/fxos8700_core.ko AUTOLOAD:=$(call AutoLoad,56,fxos8700) + $(call AddDepends/iio) endef define KernelPackage/iio-fxos8700/description @@ -528,12 +535,12 @@ $(eval $(call KernelPackage,iio-fxos8700)) define KernelPackage/iio-fxos8700-i2c - SUBMENU:=$(IIO_MENU) TITLE:=Freescale FXOS8700 3-axis acceleromter driver (I2C) DEPENDS:=+kmod-iio-fxos8700 +kmod-i2c-core +kmod-regmap-i2c KCONFIG:= CONFIG_FXOS8700_I2C FILES:=$(LINUX_DIR)/drivers/iio/imu/fxos8700_i2c.ko AUTOLOAD:=$(call AutoLoad,56,fxos8700_i2c) + $(call AddDepends/iio) endef define KernelPackage/iio-fxos8700-i2c/description @@ -545,12 +552,12 @@ endef $(eval $(call KernelPackage,iio-fxos8700-i2c)) define KernelPackage/iio-fxos8700-spi - SUBMENU:=$(IIO_MENU) DEPENDS:=+kmod-iio-fxos8700 +kmod-regmap-spi TITLE:=Freescale FXOS8700 3-axis accelerometer driver (SPI) KCONFIG:= CONFIG_FXOS8700_SPI FILES:=$(LINUX_DIR)/drivers/iio/imu/fxos8700_spi.ko AUTOLOAD:=$(call AutoLoad,56,fxos8700_spi) + $(call AddDepends/iio) endef define KernelPackage/iio-fxos8700-spi/description @@ -559,3 +566,17 @@ define KernelPackage/iio-fxos8700-spi/description endef $(eval $(call KernelPackage,iio-fxos8700-spi)) + +define KernelPackage/iio-ti-am335x-adc + TITLE:= TI Sitara AM335x ADC driver + DEPENDS:=@TARGET_omap + KCONFIG:=CONFIG_TI_AM335X_ADC + FILES:=$(LINUX_DIR)/drivers/iio/adc/ti_am335x_adc.ko + AUTOLOAD:=$(call AutoProbe,ti_am335x_adc) + $(call AddDepends/iio,+kmod-iio-kfifo-buf) +endef +define KernelPackage/iio-ti-am335x-adc/description + Driver for the TI AM335x ADC. +endef + +$(eval $(call KernelPackage,iio-ti-am335x-adc)) diff --git a/package/kernel/linux/modules/input.mk b/package/kernel/linux/modules/input.mk index e870bf7f8b..92587b1874 100644 --- a/package/kernel/linux/modules/input.mk +++ b/package/kernel/linux/modules/input.mk @@ -92,7 +92,7 @@ $(eval $(call KernelPackage,input-gpio-keys)) define KernelPackage/input-gpio-keys-polled SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=Polled GPIO key support - DEPENDS:=@GPIO_SUPPORT +kmod-input-polldev + DEPENDS:=@GPIO_SUPPORT +kmod-input-core KCONFIG:= \ CONFIG_KEYBOARD_GPIO_POLLED \ CONFIG_INPUT_KEYBOARD=y @@ -142,21 +142,6 @@ endef $(eval $(call KernelPackage,input-joydev)) -define KernelPackage/input-polldev - SUBMENU:=$(INPUT_MODULES_MENU) - TITLE:=Polled Input device support - DEPENDS:=+kmod-input-core - KCONFIG:=CONFIG_INPUT_POLLDEV - FILES:=$(LINUX_DIR)/drivers/input/input-polldev.ko -endef - -define KernelPackage/input-polldev/description - Kernel module for support of polled input devices -endef - -$(eval $(call KernelPackage,input-polldev)) - - define KernelPackage/input-matrixkmap SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=Input matrix devices support @@ -179,10 +164,8 @@ define KernelPackage/input-touchscreen-ads7846 DEPENDS:=+kmod-hwmon-core +kmod-input-core +kmod-spi-bitbang KCONFIG:= \ CONFIG_INPUT_TOUCHSCREEN=y \ - CONFIG_TOUCHSCREEN_PROPERTIES=y \ CONFIG_TOUCHSCREEN_ADS7846 - FILES:=$(LINUX_DIR)/drivers/input/touchscreen/ads7846.ko \ - $(LINUX_DIR)/drivers/input/touchscreen/of_touchscreen.ko + FILES:=$(LINUX_DIR)/drivers/input/touchscreen/ads7846.ko AUTOLOAD:=$(call AutoProbe,ads7846) endef @@ -193,6 +176,25 @@ endef $(eval $(call KernelPackage,input-touchscreen-ads7846)) +define KernelPackage/input-touchscreen-edt-ft5x06 + SUBMENU:=$(INPUT_MODULES_MENU) + TITLE:=EDT FT5x06 and Focaltech FT6236 based touchscreens + DEPENDS:=+kmod-i2c-core +kmod-input-core + KCONFIG:= \ + CONFIG_INPUT_TOUCHSCREEN=y \ + CONFIG_TOUCHSCREEN_EDT_FT5X06 + FILES:=$(LINUX_DIR)/drivers/input/touchscreen/edt-ft5x06.ko + AUTOLOAD:=$(call AutoProbe,edt-ft5x06) +endef + +define KernelPackage/input-touchscreen-edt-ft5x06/description + Kernel module for EDT FT5206, FT5306, FT5406, FT5506, Evervision FT5726 \ + and Focaltech FT6236 based touchscreens +endef + +$(eval $(call KernelPackage,input-touchscreen-edt-ft5x06)) + + define KernelPackage/keyboard-imx SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=IMX keypad support diff --git a/package/kernel/linux/modules/leds.mk b/package/kernel/linux/modules/leds.mk index 33b9f612ae..fcf9c987e8 100644 --- a/package/kernel/linux/modules/leds.mk +++ b/package/kernel/linux/modules/leds.mk @@ -115,6 +115,22 @@ endef $(eval $(call KernelPackage,ledtrig-pattern)) +define KernelPackage/ledtrig-tty + SUBMENU:=$(LEDS_MENU) + TITLE:=LED Trigger for TTY devices + KCONFIG:=CONFIG_LEDS_TRIGGER_TTY + FILES:=$(LED_TRIGGER_DIR)/ledtrig-tty.ko + AUTOLOAD:=$(call AutoLoad,50,ledtrig-tty) +endef + +define KernelPackage/ledtrig-tty/description + This allows LEDs to be controlled by activity on ttys which includes + serial devices like '/dev/ttyS0'. +endef + +$(eval $(call KernelPackage,ledtrig-tty)) + + define KernelPackage/leds-apu SUBMENU:=$(LEDS_MENU) TITLE:=PC Engines APU1 LED support @@ -131,6 +147,25 @@ endef $(eval $(call KernelPackage,leds-apu)) +define KernelPackage/leds-pca955x + SUBMENU:=$(LEDS_MENU) + TITLE:=LED driver for PCA955x I2C chips + DEPENDS:=@GPIO_SUPPORT +kmod-i2c-core + KCONFIG:=CONFIG_LEDS_PCA955X \ + CONFIG_LEDS_PCA955X_GPIO=y + FILES:=$(LINUX_DIR)/drivers/leds/leds-pca955x.ko + AUTOLOAD:=$(call AutoLoad,60,leds-pca955x,1) +endef + +define KernelPackage/leds-pca955x/description + This option enables support for LEDs connected to PCA955x + LED driver chips accessed via the I2C bus. Supported + devices include PCA9550, PCA9551, PCA9552, and PCA9553. +endef + +$(eval $(call KernelPackage,leds-pca955x)) + + define KernelPackage/leds-pca963x SUBMENU:=$(LEDS_MENU) TITLE:=PCA963x LED support diff --git a/package/kernel/linux/modules/lib.mk b/package/kernel/linux/modules/lib.mk index c52a8133be..299c5a8c35 100644 --- a/package/kernel/linux/modules/lib.mk +++ b/package/kernel/linux/modules/lib.mk @@ -152,13 +152,15 @@ define KernelPackage/lib-lz4 DEPENDS:=+kmod-crypto-acompress KCONFIG:= \ CONFIG_CRYPTO_LZ4 \ + CONFIG_CRYPTO_LZ4HC \ CONFIG_LZ4_COMPRESS \ CONFIG_LZ4_DECOMPRESS FILES:= \ $(LINUX_DIR)/crypto/lz4.ko \ $(LINUX_DIR)/lib/lz4/lz4_compress.ko \ + $(LINUX_DIR)/lib/lz4/lz4hc_compress.ko \ $(LINUX_DIR)/lib/lz4/lz4_decompress.ko - AUTOLOAD:=$(call AutoProbe,lz4 lz4_compress lz4_decompress) + AUTOLOAD:=$(call AutoProbe,lz4 lz4_compress lz4hc_compress lz4_decompress) endef define KernelPackage/lib-lz4/description @@ -168,6 +170,28 @@ endef $(eval $(call KernelPackage,lib-lz4)) +define KernelPackage/lib-842 + SUBMENU:=$(LIB_MENU) + TITLE:=842 support + DEPENDS:=+kmod-crypto-acompress +kmod-crypto-crc32 + KCONFIG:= \ + CONFIG_CRYPTO_842 \ + CONFIG_842_COMPRESS \ + CONFIG_842_DECOMPRESS + FILES:= \ + $(LINUX_DIR)/crypto/842.ko \ + $(LINUX_DIR)/lib/842/842_compress.ko \ + $(LINUX_DIR)/lib/842/842_decompress.ko + AUTOLOAD:=$(call AutoProbe,842 842_compress 842_decompress) +endef + +define KernelPackage/lib-842/description + Kernel module for 842 compression/decompression support +endef + +$(eval $(call KernelPackage,lib-842)) + + define KernelPackage/lib-raid6 SUBMENU:=$(LIB_MENU) TITLE:=RAID6 algorithm support @@ -274,6 +298,16 @@ endef $(eval $(call KernelPackage,asn1-decoder)) +define KernelPackage/asn1-encoder + SUBMENU:=$(LIB_MENU) + TITLE:=Simple ASN1 encoder + KCONFIG:= CONFIG_ASN1_ENCODER + HIDDEN:=1 + FILES:=$(LINUX_DIR)/lib/asn1_encoder.ko +endef + +$(eval $(call KernelPackage,asn1-encoder)) + define KernelPackage/oid-registry SUBMENU:=$(LIB_MENU) TITLE:=Object identifier registry diff --git a/package/kernel/linux/modules/netdevices.mk b/package/kernel/linux/modules/netdevices.mk index 89bbfbbba3..7f7d6aacac 100644 --- a/package/kernel/linux/modules/netdevices.mk +++ b/package/kernel/linux/modules/netdevices.mk @@ -141,7 +141,7 @@ $(eval $(call KernelPackage,mii)) define KernelPackage/mdio-devres SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=Supports MDIO device registration - DEPENDS:=@LINUX_5_10 +kmod-libphy PACKAGE_kmod-of-mdio:kmod-of-mdio + DEPENDS:=+kmod-libphy +(TARGET_armsr||TARGET_bcm27xx_bcm2708||TARGET_malta||TARGET_tegra):kmod-of-mdio KCONFIG:=CONFIG_MDIO_DEVRES HIDDEN:=1 FILES:=$(LINUX_DIR)/drivers/net/phy/mdio_devres.ko @@ -158,15 +158,13 @@ $(eval $(call KernelPackage,mdio-devres)) define KernelPackage/mdio-gpio SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:= Supports GPIO lib-based MDIO busses - DEPENDS:=+kmod-libphy @GPIO_SUPPORT +(TARGET_armvirt||TARGET_bcm27xx_bcm2708||TARGET_tegra):kmod-of-mdio + DEPENDS:=+kmod-libphy @GPIO_SUPPORT +(TARGET_armsr||TARGET_bcm27xx_bcm2708||TARGET_malta||TARGET_tegra):kmod-of-mdio KCONFIG:= \ CONFIG_MDIO_BITBANG \ CONFIG_MDIO_GPIO FILES:= \ - $(LINUX_DIR)/drivers/net/phy/mdio-gpio.ko@lt5.10 \ - $(LINUX_DIR)/drivers/net/phy/mdio-bitbang.ko@lt5.10 \ - $(LINUX_DIR)/drivers/net/mdio/mdio-gpio.ko@ge5.10 \ - $(LINUX_DIR)/drivers/net/mdio/mdio-bitbang.ko@ge5.10 + $(LINUX_DIR)/drivers/net/mdio/mdio-gpio.ko \ + $(LINUX_DIR)/drivers/net/mdio/mdio-bitbang.ko AUTOLOAD:=$(call AutoProbe,mdio-gpio) endef @@ -309,6 +307,24 @@ endef $(eval $(call KernelPackage,phy-marvell)) +define KernelPackage/phy-marvell-10g + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Marvell 10 Gigabit Ethernet PHY driver + KCONFIG:=CONFIG_MARVELL_10G_PHY + DEPENDS:=+kmod-libphy + FILES:=$(LINUX_DIR)/drivers/net/phy/marvell10g.ko + AUTOLOAD:=$(call AutoLoad,18,marvell10g) +endef + +define KernelPackage/phy-marvell/description + Supports Marvell 10 Gigabit Ethernet PHYs: + * 88E2110 + * 88E2111 + * 88x3310 + * 88x3340 +endef + +$(eval $(call KernelPackage,phy-marvell-10g)) define KernelPackage/phy-realtek SUBMENU:=$(NETWORK_DEVICES_MENU) @@ -342,6 +358,22 @@ endef $(eval $(call KernelPackage,phy-smsc)) +define KernelPackage/phy-aquantia + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Aquantia Ethernet PHYs + DEPENDS:=+kmod-libphy +kmod-hwmon-core + KCONFIG:=CONFIG_AQUANTIA_PHY + FILES:=$(LINUX_DIR)/drivers/net/phy/aquantia.ko + AUTOLOAD:=$(call AutoLoad,18,aquantia,1) +endef + +define KernelPackage/phy-aquantia/description + Kernel modules for Aquantia Ethernet PHYs +endef + +$(eval $(call KernelPackage,phy-aquantia)) + + define KernelPackage/swconfig SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=switch configuration API @@ -423,7 +455,7 @@ $(eval $(call KernelPackage,switch-rtl8306)) define KernelPackage/switch-rtl8366-smi SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=Realtek RTL8366 SMI switch interface support - DEPENDS:=@GPIO_SUPPORT +kmod-swconfig +(TARGET_armvirt||TARGET_bcm27xx_bcm2708||TARGET_tegra):kmod-of-mdio + DEPENDS:=@GPIO_SUPPORT +kmod-swconfig +(TARGET_armsr||TARGET_bcm27xx_bcm2708||TARGET_malta||TARGET_tegra):kmod-of-mdio KCONFIG:=CONFIG_RTL8366_SMI FILES:=$(LINUX_DIR)/drivers/net/phy/rtl8366_smi.ko AUTOLOAD:=$(call AutoLoad,42,rtl8366_smi,1) @@ -442,7 +474,7 @@ define KernelPackage/switch-rtl8366rb DEPENDS:=+kmod-switch-rtl8366-smi KCONFIG:=CONFIG_RTL8366RB_PHY FILES:=$(LINUX_DIR)/drivers/net/phy/rtl8366rb.ko - AUTOLOAD:=$(call AutoLoad,43,rtl8366rb) + AUTOLOAD:=$(call AutoLoad,43,rtl8366rb,1) endef define KernelPackage/switch-rtl8366rb/description @@ -458,7 +490,7 @@ define KernelPackage/switch-rtl8366s DEPENDS:=+kmod-switch-rtl8366-smi KCONFIG:=CONFIG_RTL8366S_PHY FILES:=$(LINUX_DIR)/drivers/net/phy/rtl8366s.ko - AUTOLOAD:=$(call AutoLoad,43,rtl8366s) + AUTOLOAD:=$(call AutoLoad,43,rtl8366s,1) endef define KernelPackage/switch-rtl8366s/description @@ -468,6 +500,22 @@ endef $(eval $(call KernelPackage,switch-rtl8366s)) +define KernelPackage/switch-rtl8367 + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Realtek RTL8367 switch support + DEPENDS:=+kmod-switch-rtl8366-smi + KCONFIG:=CONFIG_RTL8367_PHY + FILES:=$(LINUX_DIR)/drivers/net/phy/rtl8367.ko + AUTOLOAD:=$(call AutoLoad,43,rtl8367,1) +endef + +define KernelPackage/switch-rtl8367/description + Realtek RTL8367 switch support +endef + +$(eval $(call KernelPackage,switch-rtl8367)) + + define KernelPackage/switch-rtl8367b SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=Realtek RTL8367R/B switch support @@ -484,6 +532,22 @@ endef $(eval $(call KernelPackage,switch-rtl8367b)) +define KernelPackage/switch-ar8xxx + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Atheros AR8216/8327 switch support + DEPENDS:=+kmod-swconfig +kmod-mdio-devres + KCONFIG:=CONFIG_AR8216_PHY + FILES:=$(LINUX_DIR)/drivers/net/phy/ar8xxx.ko + AUTOLOAD:=$(call AutoLoad,43,ar8xxx,1) +endef + +define KernelPackage/switch-ar8xxx/description + Atheros AR8216/8327 switch support +endef + +$(eval $(call KernelPackage,switch-ar8xxx)) + + define KernelPackage/natsemi SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=National Semiconductor DP8381x series @@ -640,7 +704,23 @@ endef $(eval $(call KernelPackage,8139cp)) +define KernelPackage/r8169 + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=RealTek RTL-8169 PCI Gigabit Ethernet Adapter kernel support + DEPENDS:=@PCI_SUPPORT +kmod-mii +kmod-phy-realtek +kmod-mdio-devres + KCONFIG:= \ + CONFIG_R8169 \ + CONFIG_R8169_NAPI=y \ + CONFIG_R8169_VLAN=n + FILES:=$(LINUX_DIR)/drivers/net/ethernet/realtek/r8169.ko + AUTOLOAD:=$(call AutoProbe,r8169) +endef +define KernelPackage/r8169/description + Kernel modules for RealTek RTL-8169 PCI Gigabit Ethernet adapters +endef + +$(eval $(call KernelPackage,r8169)) define KernelPackage/ne2k-pci @@ -706,7 +786,7 @@ $(eval $(call KernelPackage,igbvf)) define KernelPackage/ixgbe SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=Intel(R) 82598/82599 PCI-Express 10 Gigabit Ethernet support - DEPENDS:=@PCI_SUPPORT +kmod-mdio +kmod-ptp +kmod-hwmon-core +kmod-libphy +LINUX_5_10:kmod-mdio-devres + DEPENDS:=@PCI_SUPPORT +kmod-mdio +kmod-ptp +kmod-hwmon-core +kmod-libphy +kmod-mdio-devres KCONFIG:=CONFIG_IXGBE \ CONFIG_IXGBE_VXLAN=n \ CONFIG_IXGBE_HWMON=y \ @@ -840,7 +920,7 @@ define KernelPackage/tg3 TITLE:=Broadcom Tigon3 Gigabit Ethernet KCONFIG:=CONFIG_TIGON3 \ CONFIG_TIGON3_HWMON=n - DEPENDS:=+!TARGET_bcm47xx:kmod-libphy +kmod-ptp + DEPENDS:=@PCI_SUPPORT +!TARGET_bcm47xx:kmod-libphy +kmod-ptp SUBMENU:=$(NETWORK_DEVICES_MENU) FILES:=$(LINUX_DIR)/drivers/net/ethernet/broadcom/tg3.ko AUTOLOAD:=$(call AutoLoad,19,tg3,1) @@ -856,7 +936,7 @@ $(eval $(call KernelPackage,tg3)) define KernelPackage/hfcpci TITLE:=HFC PCI cards (single port) support for mISDN KCONFIG:=CONFIG_MISDN_HFCPCI - DEPENDS:=+kmod-misdn + DEPENDS:=@PCI_SUPPORT +kmod-misdn SUBMENU:=$(NETWORK_DEVICES_MENU) FILES:=$(LINUX_DIR)/drivers/isdn/hardware/mISDN/hfcpci.ko AUTOLOAD:=$(call AutoLoad,31,hfcpci) @@ -873,7 +953,7 @@ $(eval $(call KernelPackage,hfcpci)) define KernelPackage/hfcmulti TITLE:=HFC multiport cards (HFC-4S/8S/E1) support for mISDN KCONFIG:=CONFIG_MISDN_HFCMULTI - DEPENDS:=+kmod-misdn + DEPENDS:=@PCI_SUPPORT +kmod-misdn SUBMENU:=$(NETWORK_DEVICES_MENU) FILES:=$(LINUX_DIR)/drivers/isdn/hardware/mISDN/hfcmulti.ko AUTOLOAD:=$(call AutoLoad,31,hfcmulti) @@ -1059,8 +1139,8 @@ define KernelPackage/of-mdio DEPENDS:=+kmod-libphy +kmod-fixed-phy @!TARGET_x86 KCONFIG:=CONFIG_OF_MDIO FILES:= \ - $(LINUX_DIR)/drivers/of/of_mdio.ko@lt5.10 \ - $(LINUX_DIR)/drivers/net/mdio/of_mdio.ko@ge5.10 + $(LINUX_DIR)/drivers/net/mdio/of_mdio.ko \ + $(LINUX_DIR)/drivers/net/mdio/fwnode_mdio.ko AUTOLOAD:=$(call AutoLoad,41,of_mdio) endef @@ -1196,6 +1276,22 @@ endef $(eval $(call KernelPackage,mlx5-core)) +define KernelPackage/net-selftests + SUBMENU:=$(NETWORK_DEVICES_MENU) + DEPENDS:=+kmod-libphy + TITLE:=Network generic selftest support + KCONFIG:=CONFIG_NET_SELFTESTS + FILES:=$(LINUX_DIR)/net/core/selftests.ko + AUTOLOAD:=$(call AutoLoad,99,selftests) +endef + +define KernelPackage/net-selftests/description + Kernel modules for the generic selftest support +endef + +$(eval $(call KernelPackage,net-selftests)) + + define KernelPackage/qlcnic SUBMENU:=$(NETWORK_DEVICES_MENU) DEPENDS:=@PCI_SUPPORT +kmod-hwmon-core @@ -1225,8 +1321,7 @@ define KernelPackage/sfp CONFIG_MDIO_I2C FILES:= \ $(LINUX_DIR)/drivers/net/phy/sfp.ko \ - $(LINUX_DIR)/drivers/net/phy/mdio-i2c.ko@lt5.10 \ - $(LINUX_DIR)/drivers/net/mdio/mdio-i2c.ko@ge5.10 + $(LINUX_DIR)/drivers/net/mdio/mdio-i2c.ko AUTOLOAD:=$(call AutoProbe,mdio-i2c sfp) endef @@ -1288,3 +1383,112 @@ define KernelPackage/sfc-falcon/description endef $(eval $(call KernelPackage,sfc-falcon)) + + +define KernelPackage/wwan + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=WWAN Driver Core + KCONFIG:=CONFIG_WWAN + FILES:=$(LINUX_DIR)/drivers/net/wwan/wwan.ko + AUTOLOAD:=$(call AutoProbe,wwan) +endef + +define KernelPackage/wwan/description + his driver provides a common framework for WWAN drivers. +endef + +$(eval $(call KernelPackage,wwan)) + + +define KernelPackage/mhi-net + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=MHI Network Device + DEPENDS:=@PCI_SUPPORT +kmod-mhi-bus + KCONFIG:=CONFIG_MHI_NET + FILES:=$(LINUX_DIR)/drivers/net/mhi_net.ko + AUTOLOAD:=$(call AutoProbe,mhi_net) +endef + +define KernelPackage/mhi-net/description + Driver for MHI network interface +endef + +$(eval $(call KernelPackage,mhi-net)) + +define KernelPackage/mhi-wwan-ctrl + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=MHI WWAN Control + DEPENDS:=@PCI_SUPPORT +kmod-mhi-bus +kmod-wwan + KCONFIG:=CONFIG_MHI_WWAN_CTRL + FILES:=$(LINUX_DIR)/drivers/net/wwan/mhi_wwan_ctrl.ko + AUTOLOAD:=$(call AutoProbe,mhi_wwan_ctrl) +endef + +define KernelPackage/mhi-wwan-ctrl/description + Driver for MHI WWAN Control + This exposes all modem control ports like AT, MBIM, QMI, DIAG, .. +endef + +$(eval $(call KernelPackage,mhi-wwan-ctrl)) + +define KernelPackage/mhi-wwan-mbim + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=MHI MBIM + DEPENDS:=@PCI_SUPPORT +kmod-mhi-bus +kmod-wwan + KCONFIG:=CONFIG_MHI_WWAN_MBIM + FILES:=$(LINUX_DIR)/drivers/net/wwan/mhi_wwan_mbim.ko + AUTOLOAD:=$(call AutoProbe,mhi_wwan_mbim) +endef + +define KernelPackage/mhi-wwan-mbim/description + Driver for MHI MBIM + This implements MBIM over MHI +endef + +$(eval $(call KernelPackage,mhi-wwan-mbim)) + +define KernelPackage/atlantic + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Aquantia AQtion 10Gbps Ethernet NIC + DEPENDS:=@PCI_SUPPORT +kmod-ptp +kmod-hwmon-core +kmod-macsec + KCONFIG:=CONFIG_AQTION + FILES:=$(LINUX_DIR)/drivers/net/ethernet/aquantia/atlantic/atlantic.ko + AUTOLOAD:=$(call AutoProbe,atlantic) +endef + +define KernelPackage/atlantic/description + Kernel modules for Aquantia AQtion 10Gbps Ethernet NIC +endef + +$(eval $(call KernelPackage,atlantic)) + +define KernelPackage/lan743x + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Microchip LAN743x PCI Express Gigabit Ethernet NIC + DEPENDS:=@PCI_SUPPORT +kmod-ptp +kmod-mdio-devres + KCONFIG:=CONFIG_LAN743X + FILES:=$(LINUX_DIR)/drivers/net/ethernet/microchip/lan743x.ko + AUTOLOAD:=$(call AutoProbe,lan743x) +endef + +define KernelPackage/lan743x/description + Kernel module for Microchip LAN743x PCI Express Gigabit Ethernet NIC +endef + +$(eval $(call KernelPackage,lan743x)) + +define KernelPackage/amazon-ena + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Elastic Network Adapter (for Amazon AWS) + DEPENDS:=@TARGET_x86_64||TARGET_armsr_armv8 + KCONFIG:=CONFIG_ENA_ETHERNET + FILES:=$(LINUX_DIR)/drivers/net/ethernet/amazon/ena/ena.ko + AUTOLOAD:=$(call AutoLoad,12,ena) +endef + +define KernelPackage/amazon-ena/description + This driver supports Elastic Network Adapter (ENA) + used by Amazon AWS T3 (2018) and later instances. +endef + +$(eval $(call KernelPackage,amazon-ena)) diff --git a/package/kernel/linux/modules/netfilter.mk b/package/kernel/linux/modules/netfilter.mk index 44c0e829bb..0d2f8a9140 100644 --- a/package/kernel/linux/modules/netfilter.mk +++ b/package/kernel/linux/modules/netfilter.mk @@ -1,6 +1,6 @@ # -# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2006-2023 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -39,6 +39,17 @@ endef $(eval $(call KernelPackage,nf-reject6)) +define KernelPackage/nf-conncount + SUBMENU:=$(NF_MENU) + TITLE:=Netfilter conncount support + KCONFIG:=$(KCONFIG_NF_CONNCOUNT) + HIDDEN:=1 + DEPENDS:=+kmod-nf-conntrack + FILES:=$(foreach mod,$(NF_CONNCOUNT-m),$(LINUX_DIR)/net/$(mod).ko) + AUTOLOAD:=$(call AutoProbe,$(notdir $(NF_CONNCOUNT-m))) +endef + +$(eval $(call KernelPackage,nf-conncount)) define KernelPackage/nf-ipt SUBMENU:=$(NF_MENU) @@ -176,9 +187,7 @@ define KernelPackage/nf-flow CONFIG_NF_FLOW_TABLE \ CONFIG_NF_FLOW_TABLE_HW DEPENDS:=+kmod-nf-conntrack - FILES:= \ - $(LINUX_DIR)/net/netfilter/nf_flow_table.ko \ - $(if $(CONFIG_LINUX_5_4),$(LINUX_DIR)/net/netfilter/nf_flow_table_hw.ko) + FILES:= $(LINUX_DIR)/net/netfilter/nf_flow_table.ko AUTOLOAD:=$(call AutoProbe,nf_flow_table nf_flow_table_hw) endef @@ -188,7 +197,7 @@ $(eval $(call KernelPackage,nf-flow)) define KernelPackage/nf-socket SUBMENU:=$(NF_MENU) TITLE:=Netfilter socket lookup support - KCONFIG:= $(KCOFNIG_NF_SOCKET) + KCONFIG:= $(KCONFIG_NF_SOCKET) FILES:=$(foreach mod,$(NF_SOCKET-m),$(LINUX_DIR)/net/$(mod).ko) AUTOLOAD:=$(call AutoProbe,$(notdir $(NF_SOCKET-m))) endef @@ -199,7 +208,7 @@ $(eval $(call KernelPackage,nf-socket)) define KernelPackage/nf-tproxy SUBMENU:=$(NF_MENU) TITLE:=Netfilter tproxy support - KCONFIG:= $(KCOFNIG_NF_TPROXY) + KCONFIG:= $(KCONFIG_NF_TPROXY) FILES:=$(foreach mod,$(NF_TPROXY-m),$(LINUX_DIR)/net/$(mod).ko) AUTOLOAD:=$(call AutoProbe,$(notdir $(NF_TPROXY-m))) endef @@ -236,6 +245,7 @@ $(eval $(call KernelPackage,ipt-conntrack)) define KernelPackage/ipt-conntrack-extra TITLE:=Extra connection tracking modules + DEPENDS:=+kmod-nf-conncount KCONFIG:=$(KCONFIG_IPT_CONNTRACK_EXTRA) FILES:=$(foreach mod,$(IPT_CONNTRACK_EXTRA-m),$(LINUX_DIR)/net/$(mod).ko) AUTOLOAD:=$(call AutoProbe,$(notdir $(IPT_CONNTRACK_EXTRA-m))) @@ -1131,13 +1141,32 @@ define KernelPackage/nft-bridge FILES:=$(foreach mod,$(NFT_BRIDGE-m),$(LINUX_DIR)/net/$(mod).ko) AUTOLOAD:=$(call AutoProbe,$(notdir $(NFT_BRIDGE-m))) KCONFIG:= \ - CONFIG_NF_LOG_BRIDGE=n \ $(KCONFIG_NFT_BRIDGE) endef $(eval $(call KernelPackage,nft-bridge)) +define KernelPackage/nft-dup-inet + SUBMENU:=$(NF_MENU) + TITLE:=Netfilter nf_tables dup in ip/ip6/inet family support + DEPENDS:=+kmod-nft-core +kmod-nf-conntrack +IPV6:kmod-nf-conntrack6 + KCONFIG:= \ + CONFIG_NF_DUP_IPV4 \ + CONFIG_NF_DUP_IPV6 \ + CONFIG_NFT_DUP_IPV4 \ + CONFIG_NFT_DUP_IPV6 + FILES:= \ + $(LINUX_DIR)/net/ipv4/netfilter/nf_dup_ipv4.ko \ + $(LINUX_DIR)/net/ipv6/netfilter/nf_dup_ipv6.ko \ + $(LINUX_DIR)/net/ipv4/netfilter/nft_dup_ipv4.ko \ + $(LINUX_DIR)/net/ipv6/netfilter/nft_dup_ipv6.ko + AUTOLOAD:=$(call AutoProbe,nf_dup_ipv4 nf_dup_ipv6 nft_dup_ipv4 nft_dup_ipv6) +endef + +$(eval $(call KernelPackage,nft-dup-inet)) + + define KernelPackage/nft-nat SUBMENU:=$(NF_MENU) TITLE:=Netfilter nf_tables NAT support @@ -1256,3 +1285,14 @@ define KernelPackage/nft-xfrm endef $(eval $(call KernelPackage,nft-xfrm)) + +define KernelPackage/nft-connlimit + SUBMENU:=$(NF_MENU) + TITLE:=Netfilter nf_tables connlimit support + DEPENDS:=+kmod-nft-core +kmod-nf-conncount + FILES:=$(foreach mod,$(NFT_CONNLIMIT-m),$(LINUX_DIR)/net/$(mod).ko) + AUTOLOAD:=$(call AutoProbe,$(notdir $(NFT_CONNLIMIT-m))) + KCONFIG:=$(KCONFIG_NFT_CONNLIMIT) +endef + +$(eval $(call KernelPackage,nft-connlimit)) diff --git a/package/kernel/linux/modules/netsupport.mk b/package/kernel/linux/modules/netsupport.mk index 526bd57246..27268ee043 100644 --- a/package/kernel/linux/modules/netsupport.mk +++ b/package/kernel/linux/modules/netsupport.mk @@ -46,6 +46,7 @@ define KernelPackage/bonding SUBMENU:=$(NETWORK_SUPPORT_MENU) TITLE:=Ethernet bonding driver KCONFIG:=CONFIG_BONDING + DEPENDS:=PACKAGE_kmod-tls:kmod-tls FILES:=$(LINUX_DIR)/drivers/net/bonding/bonding.ko AUTOLOAD:=$(call AutoLoad,40,bonding) MODPARAMS.bonding:=max_bonds=0 @@ -91,7 +92,8 @@ define KernelPackage/vxlan +kmod-udptunnel4 \ +IPV6:kmod-udptunnel6 KCONFIG:=CONFIG_VXLAN - FILES:=$(LINUX_DIR)/drivers/net/vxlan.ko + FILES:= \ + $(LINUX_DIR)/drivers/net/vxlan/vxlan.ko AUTOLOAD:=$(call AutoLoad,13,vxlan) endef @@ -969,6 +971,18 @@ endef $(eval $(call KernelPackage,sched-red)) +define KernelPackage/sched-skbprio + SUBMENU:=$(NETWORK_SUPPORT_MENU) + TITLE:=SKB priority queue scheduler (SKBPRIO) + DEPENDS:=+kmod-sched-core + KCONFIG:= CONFIG_NET_SCH_SKBPRIO + FILES:= $(LINUX_DIR)/net/sched/sch_skbprio.ko + AUTOLOAD:=$(call AutoProbe,sch_skbprio) +endef + +$(eval $(call KernelPackage,sched-skbprio)) + + define KernelPackage/bpf-test SUBMENU:=$(NETWORK_SUPPORT_MENU) TITLE:=Test Berkeley Packet Filter functionality @@ -1042,6 +1056,24 @@ endef $(eval $(call KernelPackage,tcp-bbr)) +define KernelPackage/tls + SUBMENU:=$(NETWORK_SUPPORT_MENU) + TITLE:=In-kernel TLS Support with HW Offload + KCONFIG:=CONFIG_TLS \ + CONFIG_TLS_DEVICE=y + FILES:=$(LINUX_DIR)/net/tls/tls.ko + AUTOLOAD:=$(call AutoProbe,tls) +endef + +define KernelPackage/tls/description + Kernel module for in-kernel TLS protocol support and hw offload + (to supported interfaces). + This allows symmetric encryption handling of the TLS protocol to + be done in-kernel and it's HW offload when available. +endef + +$(eval $(call KernelPackage,tls)) + define KernelPackage/tcp-hybla SUBMENU:=$(NETWORK_SUPPORT_MENU) @@ -1186,7 +1218,8 @@ define KernelPackage/sctp CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y FILES:= $(LINUX_DIR)/net/sctp/sctp.ko AUTOLOAD:= $(call AutoLoad,32,sctp) - DEPENDS:=+kmod-lib-crc32c +kmod-crypto-md5 +kmod-crypto-hmac + DEPENDS:=+kmod-lib-crc32c +kmod-crypto-md5 +kmod-crypto-hmac \ + +kmod-udptunnel4 +kmod-udptunnel6 endef define KernelPackage/sctp/description @@ -1339,6 +1372,21 @@ endef $(eval $(call KernelPackage,mdio)) +define KernelPackage/mdio-bus-mux + SUBMENU:=$(NETWORK_SUPPORT_MENU) + TITLE:=MDIO bus multiplexers + KCONFIG:=CONFIG_MDIO_BUS_MUX + HIDDEN:=1 + FILES:=$(LINUX_DIR)/drivers/net/mdio/mdio-mux.ko + AUTOLOAD:=$(call AutoLoad,32,mdio-mux) +endef + +define KernelPackage/mdio-bus-mux/description + Kernel framework for MDIO bus multiplexers. +endef + +$(eval $(call KernelPackage,mdio-bus-mux)) + define KernelPackage/macsec SUBMENU:=$(NETWORK_SUPPORT_MENU) TITLE:=IEEE 802.1AE MAC-level encryption (MAC) @@ -1395,6 +1443,22 @@ endef $(eval $(call KernelPackage,inet-diag)) +define KernelPackage/xdp-sockets-diag + SUBMENU:=$(NETWORK_SUPPORT_MENU) + TITLE:=PF_XDP sockets monitoring interface support for ss utility + DEPENDS:=@KERNEL_XDP_SOCKETS + KCONFIG:=CONFIG_XDP_SOCKETS_DIAG + FILES:=$(LINUX_DIR)/net/xdp/xsk_diag.ko + AUTOLOAD:=$(call AutoLoad,31,xsk_diag) +endef + +define KernelPackage/xdp-sockets-diag/description + Support for PF_XDP sockets monitoring interface used by the ss tool +endef + +$(eval $(call KernelPackage,xdp-sockets-diag)) + + define KernelPackage/wireguard SUBMENU:=$(NETWORK_SUPPORT_MENU) TITLE:=WireGuard secure network tunnel @@ -1436,3 +1500,65 @@ define KernelPackage/netconsole/description endef $(eval $(call KernelPackage,netconsole)) + + +define KernelPackage/qrtr + SUBMENU:=$(NETWORK_SUPPORT_MENU) + TITLE:=Qualcomm IPC Router support + HIDDEN:=1 + KCONFIG:=CONFIG_QRTR + FILES:= \ + $(LINUX_DIR)/net/qrtr/qrtr.ko + AUTOLOAD:=$(call AutoProbe,qrtr) +endef + +define KernelPackage/qrtr/description + Qualcomm IPC Router support +endef + +$(eval $(call KernelPackage,qrtr)) + +define KernelPackage/qrtr-tun + SUBMENU:=$(NETWORK_SUPPORT_MENU) + TITLE:=TUN device for Qualcomm IPC Router + DEPENDS:=+kmod-qrtr + KCONFIG:=CONFIG_QRTR_TUN + FILES:= $(LINUX_DIR)/net/qrtr/qrtr-tun.ko + AUTOLOAD:=$(call AutoProbe,qrtr-tun) +endef + +define KernelPackage/qrtr-tun/description + TUN device for Qualcomm IPC Router +endef + +$(eval $(call KernelPackage,qrtr-tun)) + +define KernelPackage/qrtr-smd + SUBMENU:=$(NETWORK_SUPPORT_MENU) + TITLE:=SMD IPC Router channels + DEPENDS:=+kmod-qrtr @TARGET_ipq807x + KCONFIG:=CONFIG_QRTR_SMD + FILES:= $(LINUX_DIR)/net/qrtr/qrtr-smd.ko + AUTOLOAD:=$(call AutoProbe,qrtr-smd) +endef + +define KernelPackage/qrtr-smd/description + SMD IPC Router channels +endef + +$(eval $(call KernelPackage,qrtr-smd)) + +define KernelPackage/qrtr-mhi + SUBMENU:=$(NETWORK_SUPPORT_MENU) + TITLE:=MHI IPC Router channels + DEPENDS:=+kmod-mhi-bus +kmod-qrtr + KCONFIG:=CONFIG_QRTR_MHI + FILES:= $(LINUX_DIR)/net/qrtr/qrtr-mhi.ko + AUTOLOAD:=$(call AutoProbe,qrtr-mhi) +endef + +define KernelPackage/qrtr-mhi/description + MHI IPC Router channels +endef + +$(eval $(call KernelPackage,qrtr-mhi)) diff --git a/package/kernel/linux/modules/nls.mk b/package/kernel/linux/modules/nls.mk index 05fce27bbc..7450ed1ce5 100644 --- a/package/kernel/linux/modules/nls.mk +++ b/package/kernel/linux/modules/nls.mk @@ -135,8 +135,10 @@ define KernelPackage/nls-cp932 SUBMENU:=Native Language Support TITLE:=Codepage 932 (Japanese) KCONFIG:=CONFIG_NLS_CODEPAGE_932 - FILES:=$(LINUX_DIR)/fs/nls/nls_cp932.ko - AUTOLOAD:=$(call AutoLoad,25,nls_cp932) + FILES:= \ + $(LINUX_DIR)/fs/nls/nls_cp932.ko \ + $(LINUX_DIR)/fs/nls/nls_euc-jp.ko + AUTOLOAD:=$(call AutoLoad,25,nls_cp932 nls_euc-jp) $(call AddDepends/nls) endef diff --git a/package/kernel/linux/modules/other.mk b/package/kernel/linux/modules/other.mk index 6daf6c75bc..18a9ae6331 100644 --- a/package/kernel/linux/modules/other.mk +++ b/package/kernel/linux/modules/other.mk @@ -40,6 +40,8 @@ define KernelPackage/bluetooth CONFIG_BT_BNEP \ CONFIG_BT_HCIBTUSB \ CONFIG_BT_HCIBTUSB_BCM=n \ + CONFIG_BT_HCIBTUSB_MTK=y \ + CONFIG_BT_HCIBTUSB_RTL=y \ CONFIG_BT_HCIUART \ CONFIG_BT_HCIUART_BCM=n \ CONFIG_BT_HCIUART_INTEL=n \ @@ -54,7 +56,8 @@ define KernelPackage/bluetooth $(LINUX_DIR)/net/bluetooth/hidp/hidp.ko \ $(LINUX_DIR)/drivers/bluetooth/hci_uart.ko \ $(LINUX_DIR)/drivers/bluetooth/btusb.ko \ - $(LINUX_DIR)/drivers/bluetooth/btintel.ko + $(LINUX_DIR)/drivers/bluetooth/btintel.ko \ + $(LINUX_DIR)/drivers/bluetooth/btrtl.ko AUTOLOAD:=$(call AutoProbe,bluetooth rfcomm bnep hidp hci_uart btusb) endef @@ -64,6 +67,8 @@ endef $(eval $(call KernelPackage,bluetooth)) + + define KernelPackage/bluetooth-6lowpan SUBMENU:=$(OTHER_MENU) TITLE:=Bluetooth 6LoWPAN support @@ -79,6 +84,9 @@ endef $(eval $(call KernelPackage,bluetooth-6lowpan)) + + + define KernelPackage/btsdio SUBMENU:=$(OTHER_MENU) TITLE:=Bluetooth HCI SDIO driver @@ -158,6 +166,32 @@ endef $(eval $(call KernelPackage,eeprom-at25)) +define KernelPackage/google-firmware + SUBMENU:=$(OTHER_MENU) + TITLE:=Google firmware drivers (Coreboot, VPD, Memconsole) + KCONFIG:= \ + CONFIG_GOOGLE_FIRMWARE=y \ + CONFIG_GOOGLE_COREBOOT_TABLE \ + CONFIG_GOOGLE_MEMCONSOLE \ + CONFIG_GOOGLE_MEMCONSOLE_COREBOOT \ + CONFIG_GOOGLE_VPD + FILES:= \ + $(LINUX_DIR)/drivers/firmware/google/coreboot_table.ko \ + $(LINUX_DIR)/drivers/firmware/google/memconsole.ko \ + $(LINUX_DIR)/drivers/firmware/google/memconsole-coreboot.ko \ + $(LINUX_DIR)/drivers/firmware/google/vpd-sysfs.ko + AUTOLOAD:=$(call AutoProbe,coreboot_table memconsole-coreboot vpd-sysfs) +endef + +define KernelPackage/google-firmware/description + Kernel modules for Google firmware drivers. Useful for examining firmware and + boot details on devices using a Google bootloader based on Coreboot. Provides + files like /sys/firmware/log and /sys/firmware/vpd. +endef + +$(eval $(call KernelPackage,google-firmware)) + + define KernelPackage/gpio-f7188x SUBMENU:=$(OTHER_MENU) TITLE:=Fintek F718xx/F818xx GPIO Support @@ -174,23 +208,72 @@ endef $(eval $(call KernelPackage,gpio-f7188x)) -define KernelPackage/gpio-mcp23s08 +define KernelPackage/lkdtm + SUBMENU:=$(OTHER_MENU) + TITLE:=Linux Kernel Dump Test Tool Module + KCONFIG:=CONFIG_LKDTM + FILES:=$(LINUX_DIR)/drivers/misc/lkdtm/lkdtm.ko + AUTOLOAD:=$(call AutoProbe,lkdtm) +endef + +define KernelPackage/lkdtm/description + This module enables testing of the different dumping mechanisms by inducing + system failures at predefined crash points. +endef + +$(eval $(call KernelPackage,lkdtm)) + + +define KernelPackage/pinctrl-mcp23s08 SUBMENU:=$(OTHER_MENU) TITLE:=Microchip MCP23xxx I/O expander - DEPENDS:=@GPIO_SUPPORT +kmod-i2c-core +kmod-regmap-i2c - KCONFIG:= \ - CONFIG_GPIO_MCP23S08 \ - CONFIG_PINCTRL_MCP23S08 - FILES:= \ - $(LINUX_DIR)/drivers/pinctrl/pinctrl-mcp23s08.ko + HIDDEN:=1 + DEPENDS:=@GPIO_SUPPORT +kmod-regmap-core + KCONFIG:=CONFIG_PINCTRL_MCP23S08 + FILES:=$(LINUX_DIR)/drivers/pinctrl/pinctrl-mcp23s08.ko AUTOLOAD:=$(call AutoLoad,40,pinctrl-mcp23s08) endef -define KernelPackage/gpio-mcp23s08/description - Kernel module for Microchip MCP23xxx SPI/I2C I/O expander +define KernelPackage/pinctrl-mcp23s08/description + Kernel module for Microchip MCP23xxx I/O expander +endef + +$(eval $(call KernelPackage,pinctrl-mcp23s08)) + + +define KernelPackage/pinctrl-mcp23s08-i2c + SUBMENU:=$(OTHER_MENU) + TITLE:=Microchip MCP23xxx I/O expander (I2C) + DEPENDS:=@GPIO_SUPPORT \ + +kmod-pinctrl-mcp23s08 \ + +kmod-i2c-core \ + +kmod-regmap-i2c + KCONFIG:=CONFIG_PINCTRL_MCP23S08_I2C + FILES:=$(LINUX_DIR)/drivers/pinctrl/pinctrl-mcp23s08_i2c.ko + AUTOLOAD:=$(call AutoLoad,40,pinctrl-mcp23s08-i2c) +endef + +define KernelPackage/pinctrl-mcp23s08-i2c/description + Kernel module for Microchip MCP23xxx I/O expander via I2C +endef + +$(eval $(call KernelPackage,pinctrl-mcp23s08-i2c)) + + +define KernelPackage/pinctrl-mcp23s08-spi + SUBMENU:=$(OTHER_MENU) + TITLE:=Microchip MCP23xxx I/O expander (SPI) + DEPENDS:=@GPIO_SUPPORT +kmod-pinctrl-mcp23s08 + KCONFIG:=CONFIG_PINCTRL_MCP23S08_SPI + FILES:=$(LINUX_DIR)/drivers/pinctrl/pinctrl-mcp23s08_spi.ko + AUTOLOAD:=$(call AutoLoad,40,pinctrl-mcp23s08-spi) endef -$(eval $(call KernelPackage,gpio-mcp23s08)) +define KernelPackage/pinctrl-mcp23s08-spi/description + Kernel module for Microchip MCP23xxx I/O expander via SPI +endef + +$(eval $(call KernelPackage,pinctrl-mcp23s08-spi)) define KernelPackage/gpio-nxp-74hc164 @@ -351,23 +434,6 @@ endef $(eval $(call KernelPackage,mmc)) -define KernelPackage/mvsdio - SUBMENU:=$(OTHER_MENU) - TITLE:=Marvell MMC/SD/SDIO host driver - DEPENDS:=+kmod-mmc @TARGET_kirkwood - KCONFIG:= CONFIG_MMC_MVSDIO - FILES:= \ - $(LINUX_DIR)/drivers/mmc/host/mvsdio.ko - AUTOLOAD:=$(call AutoProbe,mvsdio,1) -endef - -define KernelPackage/mvsdio/description - Kernel support for the Marvell SDIO host driver. -endef - -$(eval $(call KernelPackage,mvsdio)) - - define KernelPackage/sdhci SUBMENU:=$(OTHER_MENU) TITLE:=Secure Digital Host Controller Interface support @@ -437,6 +503,7 @@ define KernelPackage/ssb CONFIG_SSB_DRIVER_MIPS=n \ CONFIG_SSB_DRIVER_PCICORE=y \ CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y \ + CONFIG_SSB_FALLBACK_SPROM=y \ CONFIG_SSB_PCIHOST=y \ CONFIG_SSB_PCIHOST_POSSIBLE=y \ CONFIG_SSB_POSSIBLE=y \ @@ -461,6 +528,7 @@ define KernelPackage/bcma CONFIG_BCMA \ CONFIG_BCMA_POSSIBLE=y \ CONFIG_BCMA_BLOCKIO=y \ + CONFIG_BCMA_FALLBACK_SPROM=y \ CONFIG_BCMA_HOST_PCI_POSSIBLE=y \ CONFIG_BCMA_HOST_PCI=y \ CONFIG_BCMA_HOST_SOC=n \ @@ -733,7 +801,8 @@ define KernelPackage/ramoops SUBMENU:=$(OTHER_MENU) TITLE:=Ramoops (pstore-ram) DEFAULT:=m if ALL_KMODS - KCONFIG:=CONFIG_PSTORE_RAM + KCONFIG:=CONFIG_PSTORE_RAM \ + CONFIG_PSTORE_CONSOLE=y DEPENDS:=+kmod-pstore +kmod-reed-solomon FILES:= $(LINUX_DIR)/fs/pstore/ramoops.ko AUTOLOAD:=$(call AutoLoad,30,ramoops,1) @@ -797,7 +866,7 @@ define KernelPackage/serial-8250-exar KCONFIG:= CONFIG_SERIAL_8250_EXAR FILES:=$(LINUX_DIR)/drivers/tty/serial/8250/8250_exar.ko AUTOLOAD:=$(call AutoProbe,8250 8250_base 8250_exar) - DEPENDS:=+kmod-serial-8250 + DEPENDS:=@PCI_SUPPORT +kmod-serial-8250 endef define KernelPackage/serial-8250-exar/description @@ -892,7 +961,6 @@ $(eval $(call KernelPackage,ikconfig)) define KernelPackage/zram SUBMENU:=$(OTHER_MENU) TITLE:=ZRAM - DEPENDS:=+kmod-lib-lzo KCONFIG:= \ CONFIG_ZSMALLOC \ CONFIG_ZRAM \ @@ -909,8 +977,37 @@ define KernelPackage/zram/description Compressed RAM block device support endef -$(eval $(call KernelPackage,zram)) +define KernelPackage/zram/config + if PACKAGE_kmod-zram + choice + prompt "ZRAM Default compressor" + default ZRAM_DEF_COMP_LZORLE + + config ZRAM_DEF_COMP_LZORLE + bool "lzo-rle" + select PACKAGE_kmod-lib-lzo + + config ZRAM_DEF_COMP_LZO + bool "lzo" + select PACKAGE_kmod-lib-lzo + config ZRAM_DEF_COMP_LZ4 + bool "lz4" + select PACKAGE_kmod-lib-lz4 + + config ZRAM_DEF_COMP_LZ4HC + bool "lz4-hc" + select PACKAGE_kmod-lib-lz4hc + + config ZRAM_DEF_COMP_ZSTD + bool "zstd" + select PACKAGE_kmod-lib-zstd + + endchoice + endif +endef + +$(eval $(call KernelPackage,zram)) define KernelPackage/pps SUBMENU:=$(OTHER_MENU) @@ -1103,9 +1200,7 @@ define KernelPackage/keys-trusted TITLE:=TPM trusted keys on kernel keyring DEPENDS:=@KERNEL_KEYS +kmod-crypto-hash +kmod-crypto-hmac +kmod-crypto-sha1 +kmod-tpm KCONFIG:=CONFIG_TRUSTED_KEYS - FILES:= \ - $(LINUX_DIR)/security/keys/trusted.ko@lt5.10 \ - $(LINUX_DIR)/security/keys/trusted-keys/trusted.ko@ge5.10 + FILES:= $(LINUX_DIR)/security/keys/trusted-keys/trusted.ko AUTOLOAD:=$(call AutoLoad,01,trusted-keys,1) endef @@ -1123,7 +1218,8 @@ $(eval $(call KernelPackage,keys-trusted)) define KernelPackage/tpm SUBMENU:=$(OTHER_MENU) TITLE:=TPM Hardware Support - DEPENDS:= +kmod-random-core + DEPENDS:= +kmod-random-core +kmod-asn1-decoder \ + +kmod-asn1-encoder +kmod-oid-registry KCONFIG:= CONFIG_TCG_TPM FILES:= $(LINUX_DIR)/drivers/char/tpm/tpm.ko AUTOLOAD:=$(call AutoLoad,10,tpm,1) @@ -1186,67 +1282,50 @@ endef $(eval $(call KernelPackage,tpm-i2c-infineon)) -define KernelPackage/w83627hf-wdt +define KernelPackage/i6300esb-wdt SUBMENU:=$(OTHER_MENU) - TITLE:=Winbond 83627HF Watchdog Timer - KCONFIG:=CONFIG_W83627HF_WDT - FILES:=$(LINUX_DIR)/drivers/$(WATCHDOG_DIR)/w83627hf_wdt.ko - AUTOLOAD:=$(call AutoLoad,50,w83627hf-wdt,1) + TITLE:=Intel 6300ESB Timer/Watchdog + DEPENDS:=@PCI_SUPPORT @!SMALL_FLASH + KCONFIG:=CONFIG_I6300ESB_WDT \ + CONFIG_WATCHDOG_CORE=y + FILES:=$(LINUX_DIR)/drivers/$(WATCHDOG_DIR)/i6300esb.ko + AUTOLOAD:=$(call AutoLoad,50,i6300esb,1) endef -define KernelPackage/w83627hf-wdt/description - Kernel module for Winbond 83627HF Watchdog Timer +define KernelPackage/i6300esb-wdt/description + Kernel module for the watchdog timer built into the Intel + 6300ESB controller hub. Also used by QEMU/libvirt. endef -$(eval $(call KernelPackage,w83627hf-wdt)) +$(eval $(call KernelPackage,i6300esb-wdt)) -define KernelPackage/itco-wdt +define KernelPackage/mhi-bus SUBMENU:=$(OTHER_MENU) - TITLE:=Intel iTCO Watchdog Timer - KCONFIG:=CONFIG_ITCO_WDT \ - CONFIG_ITCO_VENDOR_SUPPORT=y - FILES:=$(LINUX_DIR)/drivers/$(WATCHDOG_DIR)/iTCO_wdt.ko \ - $(LINUX_DIR)/drivers/$(WATCHDOG_DIR)/iTCO_vendor_support.ko - AUTOLOAD:=$(call AutoLoad,50,iTCO_vendor_support iTCO_wdt,1) + TITLE:=MHI bus + KCONFIG:=CONFIG_MHI_BUS \ + CONFIG_MHI_BUS_DEBUG=y + FILES:=$(LINUX_DIR)/drivers/bus/mhi/host/mhi.ko + AUTOLOAD:=$(call AutoProbe,mhi) endef -define KernelPackage/itco-wdt/description - Kernel module for Intel iTCO Watchdog Timer +define KernelPackage/mhi-bus/description + Kernel module for the Qualcomm MHI bus. endef -$(eval $(call KernelPackage,itco-wdt)) - - -define KernelPackage/it87-wdt - SUBMENU:=$(OTHER_MENU) - TITLE:=ITE IT87 Watchdog Timer - KCONFIG:=CONFIG_IT87_WDT - FILES:=$(LINUX_DIR)/drivers/$(WATCHDOG_DIR)/it87_wdt.ko - AUTOLOAD:=$(call AutoLoad,50,it87-wdt,1) - MODPARAMS.it87-wdt:= \ - nogameport=1 \ - nocir=1 -endef - -define KernelPackage/it87-wdt/description - Kernel module for ITE IT87 Watchdog Timer -endef - -$(eval $(call KernelPackage,it87-wdt)) - +$(eval $(call KernelPackage,mhi-bus)) -define KernelPackage/f71808e-wdt +define KernelPackage/mhi-pci-generic SUBMENU:=$(OTHER_MENU) - TITLE:=Fintek F718xx/F818xx Watchdog Timer - DEPENDS:=@TARGET_x86 - KCONFIG:=CONFIG_F71808E_WDT - FILES:=$(LINUX_DIR)/drivers/$(WATCHDOG_DIR)/f71808e_wdt.ko - AUTOLOAD:=$(call AutoProbe,f71808e-wdt,1) + TITLE:=MHI PCI controller driver + DEPENDS:=@PCI_SUPPORT +kmod-mhi-bus + KCONFIG:=CONFIG_MHI_BUS_PCI_GENERIC + FILES:=$(LINUX_DIR)/drivers/bus/mhi/host/mhi_pci_generic.ko + AUTOLOAD:=$(call AutoProbe,mhi_pci_generic) endef -define KernelPackage/f71808e-wdt/description - Kernel module for the watchdog timer found on many Fintek Super-IO chips. +define KernelPackage/mhi-pci-generic/description + Kernel module for the MHI PCI controller driver. endef -$(eval $(call KernelPackage,f71808e-wdt)) +$(eval $(call KernelPackage,mhi-pci-generic)) diff --git a/package/kernel/linux/modules/sound.mk b/package/kernel/linux/modules/sound.mk index 83b3355f3f..2bfa146207 100644 --- a/package/kernel/linux/modules/sound.mk +++ b/package/kernel/linux/modules/sound.mk @@ -523,8 +523,7 @@ define KernelPackage/sound-hda-intel CONFIG_SND_HDA_INTEL FILES:= \ $(LINUX_DIR)/sound/pci/hda/snd-hda-intel.ko \ - $(LINUX_DIR)/sound/hda/snd-intel-nhlt.ko@lt5.5 \ - $(LINUX_DIR)/sound/hda/snd-intel-dspcfg.ko@ge5.5 + $(LINUX_DIR)/sound/hda/snd-intel-dspcfg.ko AUTOLOAD:=$(call AutoProbe,snd-hda-intel) $(call AddDepends/sound,kmod-sound-hda-core) endef diff --git a/package/kernel/linux/modules/spi.mk b/package/kernel/linux/modules/spi.mk index 01dc7dc7e6..78a1c8a032 100644 --- a/package/kernel/linux/modules/spi.mk +++ b/package/kernel/linux/modules/spi.mk @@ -15,9 +15,9 @@ define KernelPackage/mmc-spi CONFIG_SPI=y \ CONFIG_SPI_MASTER=y FILES:=\ - $(if $(CONFIG_OF),$(LINUX_DIR)/drivers/mmc/host/of_mmc_spi.ko) \ + $(LINUX_DIR)/drivers/mmc/host/of_mmc_spi.ko \ $(LINUX_DIR)/drivers/mmc/host/mmc_spi.ko - AUTOLOAD:=$(call AutoProbe,$(if $(CONFIG_OF),of_mmc_spi) mmc_spi) + AUTOLOAD:=$(call AutoProbe,of_mmc_spi mmc_spi) endef define KernelPackage/mmc-spi/description diff --git a/package/kernel/linux/modules/usb.mk b/package/kernel/linux/modules/usb.mk index 81da81ad4a..3e46b64918 100644 --- a/package/kernel/linux/modules/usb.mk +++ b/package/kernel/linux/modules/usb.mk @@ -430,10 +430,7 @@ define KernelPackage/usb-dwc2 TITLE:=DWC2 USB controller driver DEPENDS:=+USB_GADGET_SUPPORT:kmod-usb-gadget +kmod-usb-roles KCONFIG:= \ - CONFIG_USB_PCI=y \ CONFIG_USB_DWC2 \ - CONFIG_USB_DWC2_PCI \ - CONFIG_USB_DWC2_PLATFORM \ CONFIG_USB_DWC2_DEBUG=n \ CONFIG_USB_DWC2_VERBOSE=n \ CONFIG_USB_DWC2_TRACK_MISSED_SOFS=n \ @@ -452,6 +449,26 @@ endef $(eval $(call KernelPackage,usb-dwc2)) +define KernelPackage/usb-dwc2-pci + TITLE:=DWC2 USB controller driver (PCI) + DEPENDS:=@PCI_SUPPORT +kmod-usb-dwc2 +kmod-usb-phy-nop + KCONFIG:= \ + CONFIG_USB_PCI=y \ + CONFIG_USB_DWC2_PCI + FILES:= \ + $(LINUX_DIR)/drivers/usb/dwc2/dwc2_pci.ko + AUTOLOAD:=$(call AutoLoad,54,dwc2_pci,1) + $(call AddDepends/usb) +endef + +define KernelPackage/usb-dwc2-pci/description + The Designware USB2.0 PCI interface module for controllers + connected to a PCI bus. +endef + +$(eval $(call KernelPackage,usb-dwc2-pci)) + + define KernelPackage/usb-dwc3 TITLE:=DWC3 USB controller driver KCONFIG:= \ @@ -476,7 +493,7 @@ $(eval $(call KernelPackage,usb-dwc3)) define KernelPackage/usb-dwc3-qcom TITLE:=DWC3 Qualcomm USB driver - DEPENDS:=@(TARGET_ipq40xx||TARGET_ipq806x) +kmod-usb-dwc3 + DEPENDS:=@(TARGET_ipq40xx||TARGET_ipq806x||TARGET_ipq807x) +kmod-usb-dwc3 KCONFIG:= CONFIG_USB_DWC3_QCOM FILES:= $(LINUX_DIR)/drivers/usb/dwc3/dwc3-qcom.ko AUTOLOAD:=$(call AutoLoad,53,dwc3-qcom,1) @@ -1107,7 +1124,7 @@ $(eval $(call KernelPackage,usb-net-aqc111)) define KernelPackage/usb-net-asix TITLE:=Kernel module for USB-to-Ethernet Asix convertors - DEPENDS:=+kmod-libphy +kmod-phy-ax88796b + DEPENDS:=+kmod-libphy +kmod-net-selftests +kmod-mdio-devres +kmod-phy-ax88796b KCONFIG:=CONFIG_USB_NET_AX8817X FILES:=$(LINUX_DIR)/drivers/$(USBNET_DIR)/asix.ko AUTOLOAD:=$(call AutoProbe,asix) @@ -1219,7 +1236,7 @@ $(eval $(call KernelPackage,usb-net-mcs7830)) define KernelPackage/usb-net-smsc75xx TITLE:=SMSC LAN75XX based USB 2.0 Gigabit ethernet devices - DEPENDS:=+!LINUX_5_4:kmod-libphy + DEPENDS:=+kmod-libphy KCONFIG:=CONFIG_USB_NET_SMSC75XX FILES:=$(LINUX_DIR)/drivers/$(USBNET_DIR)/smsc75xx.ko AUTOLOAD:=$(call AutoProbe,smsc75xx) @@ -1235,7 +1252,7 @@ $(eval $(call KernelPackage,usb-net-smsc75xx)) define KernelPackage/usb-net-smsc95xx TITLE:=SMSC LAN95XX based USB 2.0 10/100 ethernet devices - DEPENDS:=+LINUX_5_10:kmod-libphy +kmod-phy-smsc + DEPENDS:=+kmod-libphy +kmod-phy-smsc KCONFIG:=CONFIG_USB_NET_SMSC95XX FILES:=$(LINUX_DIR)/drivers/$(USBNET_DIR)/smsc95xx.ko AUTOLOAD:=$(call AutoProbe,smsc95xx) @@ -1342,11 +1359,11 @@ $(eval $(call KernelPackage,usb-net-rtl8150)) define KernelPackage/usb-net-rtl8152 TITLE:=Kernel module for USB-to-Ethernet Realtek convertors - DEPENDS:=+kmod-crypto-sha256 +kmod-usb-net-cdc-ncm + DEPENDS:= +kmod-crypto-sha256 +kmod-usb-net-cdc-ncm KCONFIG:=CONFIG_USB_RTL8152 FILES:=$(LINUX_DIR)/drivers/$(USBNET_DIR)/r8152.ko AUTOLOAD:=$(call AutoProbe,r8152) - $(call AddDepends/usb-net, +LINUX_5_10:kmod-crypto-hash) + $(call AddDepends/usb-net) endef define KernelPackage/usb-net-rtl8152/description @@ -1408,7 +1425,7 @@ define KernelPackage/usb-net-cdc-ncm KCONFIG:=CONFIG_USB_NET_CDC_NCM FILES:= $(LINUX_DIR)/drivers/$(USBNET_DIR)/cdc_ncm.ko AUTOLOAD:=$(call AutoProbe,cdc_ncm) - $(call AddDepends/usb-net,+!LINUX_5_4:kmod-usb-net-cdc-ether) + $(call AddDepends/usb-net,+kmod-usb-net-cdc-ether) endef define KernelPackage/usb-net-cdc-ncm/description @@ -1510,8 +1527,8 @@ $(eval $(call KernelPackage,usb-hid)) define KernelPackage/usb-hid-cp2112 SUBMENU:=$(USB_MENU) TITLE:=Silicon Labs CP2112 HID USB to SMBus Master Bridge - KCONFIG:=CONFIG_GPIOLIB=y CONFIG_HID_CP2112 - DEPENDS:=+kmod-usb-hid +kmod-i2c-core + KCONFIG:=CONFIG_HID_CP2112 + DEPENDS:=@GPIO_SUPPORT +kmod-usb-hid +kmod-i2c-core FILES:=$(LINUX_DIR)/drivers/hid/hid-cp2112.ko AUTOLOAD:=$(call AutoProbe,hid-cp2112) endef @@ -1524,6 +1541,23 @@ endef $(eval $(call KernelPackage,usb-hid-cp2112)) +define KernelPackage/usb-hid-mcp2221 + SUBMENU:=$(USB_MENU) + TITLE:=Microchip USB 2.0 to I2C/UART Protocol Converter with GPIO + KCONFIG:=CONFIG_HID_MCP2221 + DEPENDS:=@GPIO_SUPPORT +kmod-usb-hid +kmod-i2c-core + FILES:=$(LINUX_DIR)/drivers/hid/hid-mcp2221.ko + AUTOLOAD:=$(call AutoProbe,hid-mcp2221) +endef + +define KernelPackage/usb-hid-mcp2221/description + HID device driver which registers as an i2c adapter and gpiochip to expose + these functions of the MCP2221. +endef + +$(eval $(call KernelPackage,usb-hid-mcp2221)) + + define KernelPackage/usb-yealink TITLE:=USB Yealink VOIP phone DEPENDS:=+kmod-input-evdev @@ -1680,6 +1714,7 @@ define KernelPackage/usb3 +kmod-usb-xhci-hcd \ +TARGET_bcm53xx:kmod-usb-bcma \ +TARGET_ramips_mt7621:kmod-usb-xhci-mtk \ + +TARGET_mediatek:kmod-usb-xhci-mtk \ +TARGET_apm821xx_nand:kmod-usb-xhci-pci-renesas \ +TARGET_mvebu_cortexa9:kmod-usb-xhci-pci-renesas KCONFIG:= \ @@ -1755,8 +1790,9 @@ define KernelPackage/usb-xhci-mtk DEPENDS:=+kmod-usb-xhci-hcd KCONFIG:=CONFIG_USB_XHCI_MTK HIDDEN:=1 - FILES:=$(LINUX_DIR)/drivers/usb/host/xhci-mtk.ko - AUTOLOAD:=$(call AutoLoad,54,xhci-mtk,1) + FILES:= \ + $(LINUX_DIR)/drivers/usb/host/xhci-mtk-hcd.ko + AUTOLOAD:=$(call AutoLoad,54,xhci-mtk-hcd,1) $(call AddDepends/usb) endef @@ -1769,7 +1805,6 @@ $(eval $(call KernelPackage,usb-xhci-mtk)) define KernelPackage/usb-xhci-pci-renesas TITLE:=Support for additional Renesas xHCI controller with firmware - DEPENDS:=@LINUX_5_10 KCONFIG:=CONFIG_USB_XHCI_PCI_RENESAS HIDDEN:=1 FILES:=$(LINUX_DIR)/drivers/usb/host/xhci-pci-renesas.ko diff --git a/package/kernel/linux/modules/video.mk b/package/kernel/linux/modules/video.mk index db956bcc4c..4bf91941f3 100644 --- a/package/kernel/linux/modules/video.mk +++ b/package/kernel/linux/modules/video.mk @@ -225,7 +225,8 @@ define KernelPackage/drm SUBMENU:=$(VIDEO_MENU) TITLE:=Direct Rendering Manager (DRM) support HIDDEN:=1 - DEPENDS:=+kmod-dma-buf +kmod-i2c-core +PACKAGE_kmod-backlight:kmod-backlight + DEPENDS:=+kmod-dma-buf +kmod-i2c-core +PACKAGE_kmod-backlight:kmod-backlight \ + +kmod-fb KCONFIG:=CONFIG_DRM FILES:= \ $(LINUX_DIR)/drivers/gpu/drm/drm.ko \ @@ -255,6 +256,20 @@ endef $(eval $(call KernelPackage,drm-ttm)) + +define KernelPackage/drm-ttm-helper + SUBMENU:=$(VIDEO_MENU) + TITLE:=Helpers for ttm-based gem objects + HIDDEN:=1 + DEPENDS:=@DISPLAY_SUPPORT +kmod-drm-ttm + KCONFIG:=CONFIG_DRM_TTM_HELPER + FILES:=$(LINUX_DIR)/drivers/gpu/drm/drm_ttm_helper.ko + AUTOLOAD:=$(call AutoProbe,drm_ttm_helper) +endef + +$(eval $(call KernelPackage,drm-ttm-helper)) + + define KernelPackage/drm-kms-helper SUBMENU:=$(VIDEO_MENU) TITLE:=CRTC helpers for KMS drivers @@ -340,7 +355,8 @@ define KernelPackage/drm-imx-ldb CONFIG_DRM_PANEL_S6E8AA0=n \ CONFIG_DRM_PANEL_SITRONIX_ST7789V=n FILES:=$(LINUX_DIR)/drivers/gpu/drm/imx/imx-ldb.ko \ - $(LINUX_DIR)/drivers/gpu/drm/panel/panel-simple.ko + $(LINUX_DIR)/drivers/gpu/drm/panel/panel-simple.ko \ + $(LINUX_DIR)/drivers/gpu/drm/drm_dp_aux_bus.ko AUTOLOAD:=$(call AutoLoad,08,imx-ldb) endef diff --git a/package/kernel/linux/modules/virt.mk b/package/kernel/linux/modules/virt.mk index 5ed0d5dbbf..f45cb17614 100644 --- a/package/kernel/linux/modules/virt.mk +++ b/package/kernel/linux/modules/virt.mk @@ -72,3 +72,70 @@ define KernelPackage/kvm-amd/description endef $(eval $(call KernelPackage,kvm-amd)) + + +define KernelPackage/vfio + SUBMENU:=Virtualization + TITLE:=VFIO Non-Privileged userspace driver framework + DEPENDS:=@TARGET_x86_64||TARGET_armsr_armv8 + KCONFIG:= \ + CONFIG_VFIO \ + CONFIG_VFIO_NOIOMMU=n \ + CONFIG_VFIO_MDEV=n + FILES:= \ + $(LINUX_DIR)/drivers/vfio/vfio.ko \ + $(LINUX_DIR)/drivers/vfio/vfio_virqfd.ko \ + $(LINUX_DIR)/drivers/vfio/vfio_iommu_type1.ko + AUTOLOAD:=$(call AutoProbe,vfio vfio_iommu_type1 vfio_virqfd) +endef + +define KernelPackage/vfio/description + VFIO provides a framework for secure userspace device drivers. +endef + +$(eval $(call KernelPackage,vfio)) + + +define KernelPackage/vfio-pci + SUBMENU:=Virtualization + TITLE:=Generic VFIO support for any PCI device + DEPENDS:=@TARGET_x86_64||TARGET_armsr_armv8 @PCI_SUPPORT +kmod-vfio +kmod-irqbypass + KCONFIG:= \ + CONFIG_VFIO_PCI \ + CONFIG_VFIO_PCI_IGD=n + FILES:= \ + $(LINUX_DIR)/drivers/vfio/pci/vfio-pci-core.ko \ + $(LINUX_DIR)/drivers/vfio/pci/vfio-pci.ko + AUTOLOAD:=$(call AutoProbe,vfio-pci) +endef + +define KernelPackage/vfio-pci/description + Support for the generic PCI VFIO bus driver which can connect any PCI + device to the VFIO framework. +endef + +$(eval $(call KernelPackage,vfio-pci)) + + +define KernelPackage/vhost + SUBMENU:=Virtualization + TITLE:=Host kernel accelerator for virtio (base) + KCONFIG:=CONFIG_VHOST + FILES:=$(LINUX_DIR)/drivers/vhost/vhost.ko \ + $(LINUX_DIR)/drivers/vhost/vhost_iotlb.ko + AUTOLOAD:=$(call AutoProbe,vhost vhost_iotlb) +endef + +$(eval $(call KernelPackage,vhost)) + + +define KernelPackage/vhost-net + SUBMENU:=Virtualization + TITLE:=Host kernel accelerator for virtio-net + DEPENDS:=+kmod-tun +kmod-vhost + KCONFIG:=CONFIG_VHOST_NET + FILES:=$(LINUX_DIR)/drivers/vhost/vhost_net.ko + AUTOLOAD:=$(call AutoProbe,vhost_net) +endef + +$(eval $(call KernelPackage,vhost-net)) diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile index 7c25dad1cb..4c0144decf 100644 --- a/package/kernel/mac80211/Makefile +++ b/package/kernel/mac80211/Makefile @@ -10,10 +10,11 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mac80211 -PKG_VERSION:=5.15.81-1 -PKG_RELEASE:=1 -PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.15.81/ -PKG_HASH:=5227d3c35ccebacfaee6b8180b3a87b9910f3c94ee768ebc5c0fef3c86b6146d +PKG_VERSION:=6.1.24 +PKG_RELEASE:=3 +# PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.15.58/ +PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources/ +PKG_HASH:=5d39aca7e34c33cb9b3e366117b2e86841b7bdd37933679d6b1e61be6b150648 PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION) @@ -22,7 +23,6 @@ PKG_BUILD_PARALLEL:=1 PKG_MAINTAINER:=Felix Fietkau PKG_DRIVERS = \ - lib80211 \ mac80211-hwsim PKG_CONFIG_DEPENDS:= \ @@ -30,10 +30,7 @@ PKG_CONFIG_DEPENDS:= \ CONFIG_PACKAGE_CFG80211_TESTMODE \ CONFIG_PACKAGE_MAC80211_DEBUGFS \ CONFIG_PACKAGE_MAC80211_MESH \ - CONFIG_PACKAGE_MAC80211_TRACING \ - CONFIG_PACKAGE_IWLWIFI_DEBUG \ - CONFIG_PACKAGE_IWLWIFI_DEBUGFS \ - CONFIG_PACKAGE_RTLWIFI_DEBUG \ + CONFIG_PACKAGE_MAC80211_TRACING include $(INCLUDE_DIR)/package.mk @@ -49,27 +46,12 @@ config_package=$(if $(CONFIG_PACKAGE_kmod-$(1)),m) config-y:= \ WLAN \ - CFG80211_WEXT \ CFG80211_CERTIFICATION_ONUS \ MAC80211_RC_MINSTREL \ MAC80211_RC_MINSTREL_HT \ MAC80211_RC_MINSTREL_VHT \ MAC80211_RC_DEFAULT_MINSTREL \ - WLAN_VENDOR_ADMTEK \ - WLAN_VENDOR_ATH \ - WLAN_VENDOR_ATMEL \ - WLAN_VENDOR_BROADCOM \ - WLAN_VENDOR_CISCO \ - WLAN_VENDOR_INTEL \ - WLAN_VENDOR_INTERSIL \ - WLAN_VENDOR_MARVELL \ - WLAN_VENDOR_MEDIATEK \ - WLAN_VENDOR_RALINK \ - WLAN_VENDOR_REALTEK \ - WLAN_VENDOR_RSI \ - WLAN_VENDOR_ST \ - WLAN_VENDOR_TI \ - WLAN_VENDOR_ZYDAS \ + WLAN_VENDOR_ATH config-$(call config_package,cfg80211) += CFG80211 config-$(CONFIG_PACKAGE_CFG80211_TESTMODE) += NL80211_TESTMODE @@ -153,36 +135,10 @@ define KernelPackage/mac80211/description Generic IEEE 802.11 Networking Stack (mac80211) endef -define KernelPackage/lib80211 - $(call KernelPackage/mac80211/Default) - TITLE:=802.11 Networking stack - DEPENDS:=+kmod-cfg80211 +kmod-crypto-hash +kmod-crypto-ccm - FILES:= \ - $(PKG_BUILD_DIR)/net/wireless/lib80211.ko \ - $(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_wep.ko \ - $(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_ccmp.ko \ - $(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_tkip.ko - AUTOLOAD:=$(call AutoProbe, \ - lib80211 \ - lib80211_crypt_wep \ - lib80211_crypt_ccmp \ - lib80211_crypt_tkip \ - ) -endef - -define KernelPackage/lib80211/description - Kernel modules for 802.11 Networking stack - Includes: - - lib80211 - - lib80211_crypt_wep - - lib80211_crypt_tkip - - lib80211_crytp_ccmp -endef - define KernelPackage/mac80211-hwsim $(call KernelPackage/mac80211/Default) TITLE:=mac80211 HW simulation device - DEPENDS+= +kmod-mac80211 +@DRIVER_11AC_SUPPORT +@DRIVER_11N_SUPPORT + DEPENDS+= +kmod-mac80211 +@DRIVER_11AX_SUPPORT +@DRIVER_11AC_SUPPORT FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mac80211_hwsim.ko AUTOLOAD:=$(call AutoProbe,mac80211_hwsim) endef @@ -198,16 +154,19 @@ ifdef CONFIG_PACKAGE_MAC80211_TRACING IWLWIFI_DEVICE_TRACING endif -config-$(call config_package,lib80211) += LIB80211 LIB80211_CRYPT_WEP LIB80211_CRYPT_CCMP LIB80211_CRYPT_TKIP - config-$(call config_package,mac80211-hwsim) += MAC80211_HWSIM + config-$(CONFIG_LEDS_TRIGGERS) += MAC80211_LEDS C_DEFINES= -MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \ - $(KERNEL_MAKE_FLAGS) \ +ifeq ($(BUILD_VARIANT),smallbuffers) + C_DEFINES+= -DCONFIG_ATH10K_SMALLBUFFERS +endif + +MAKE_OPTS:= \ + $(subst -C $(LINUX_DIR),-C "$(PKG_BUILD_DIR)",$(KERNEL_MAKEOPTS)) \ EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS) $(C_DEFINES)" \ KLIB_BUILD="$(LINUX_DIR)" \ MODPROBE=true \ @@ -240,14 +199,14 @@ define Build/Prepare $(PKG_BUILD_DIR)/include/linux/crc8.h \ $(PKG_BUILD_DIR)/include/linux/eeprom_93cx6.h \ $(PKG_BUILD_DIR)/include/linux/wl12xx.h \ - $(PKG_BUILD_DIR)/include/linux/spi/libertas_spi.h \ + $(PKG_BUILD_DIR)/include/linux/mhi.h \ $(PKG_BUILD_DIR)/include/net/ieee80211.h \ $(PKG_BUILD_DIR)/backport-include/linux/bcm47xx_nvram.h echo 'compat-wireless-$(PKG_VERSION)-$(PKG_RELEASE)-$(REVISION)' > $(PKG_BUILD_DIR)/compat_version endef -ifneq ($(CONFIG_PACKAGE_kmod-cfg80211)$(CONFIG_PACKAGE_kmod-lib80211),) +ifneq ($(CONFIG_PACKAGE_kmod-cfg80211),) define Build/Compile/kmod rm -rf $(PKG_BUILD_DIR)/modules +$(MAKE) $(PKG_JOBS) $(MAKE_OPTS) modules @@ -260,7 +219,6 @@ ifeq ($(strip $(CONFIG_EXTERNAL_KERNEL_TREE)),"") define Build/Configure cmp $(PKG_BUILD_DIR)/include/linux/ath9k_platform.h $(LINUX_DIR)/include/linux/ath9k_platform.h cmp $(PKG_BUILD_DIR)/include/linux/ath5k_platform.h $(LINUX_DIR)/include/linux/ath5k_platform.h - cmp $(PKG_BUILD_DIR)/include/linux/rt2x00_platform.h $(LINUX_DIR)/include/linux/rt2x00_platform.h endef endif endif @@ -272,11 +230,6 @@ define Build/Patch $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath,ath/) $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath5k,ath5k/) $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath9k,ath9k/) - $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath11k,ath11k/) - $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/) - $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/) - $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/) - $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rtl,rtl/) $(if $(QUILT),touch $(PKG_BUILD_DIR)/.quilt_used) endef @@ -286,11 +239,6 @@ define Quilt/Refresh/Package $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath,ath/) $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath5k,ath5k/) $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath9k,ath9k/) - $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath11k,ath11k/) - $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/) - $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/) - $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/) - $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rtl,rtl/) endef define Build/Compile diff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk index e32bf2f9ba..589e08cd9e 100644 --- a/package/kernel/mac80211/ath.mk +++ b/package/kernel/mac80211/ath.mk @@ -27,7 +27,7 @@ ifdef CONFIG_PACKAGE_MAC80211_TRACING endif config-$(call config_package,ath) += ATH_CARDS ATH_COMMON -config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH9K_STATION_STATISTICS +config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH9K_STATION_STATISTICS config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED config-$(CONFIG_PACKAGE_ATH_SPECTRAL) += ATH9K_COMMON_SPECTRAL config-$(CONFIG_PACKAGE_ATH_DYNACK) += ATH9K_DYNACK @@ -135,7 +135,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_ath79 +kmod-ath +@DRIVER_11N_SUPPORT + DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ath79 +kmod-ath +kmod-random-core FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_common.ko \ $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_hw.ko @@ -162,7 +162,7 @@ define KernelPackage/ath9k/config bool "Add wireless noise as source of randomness to kernel entropy pool" depends on PACKAGE_kmod-ath9k select PACKAGE_kmod-random-core - default n + default y config ATH9K_SUPPORT_PCOEM bool "Support chips used in PC OEM cards" @@ -198,7 +198,7 @@ endef define KernelPackage/carl9170 $(call KernelPackage/mac80211/Default) TITLE:=Driver for Atheros AR9170 USB sticks - DEPENDS:=@USB_SUPPORT +kmod-mac80211 +kmod-ath +kmod-usb-core +kmod-input-core +@DRIVER_11N_SUPPORT +carl9170-firmware + DEPENDS:=@USB_SUPPORT +kmod-mac80211 +kmod-ath +kmod-usb-core +kmod-input-core +carl9170-firmware FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/carl9170/carl9170.ko AUTOLOAD:=$(call AutoProbe,carl9170) endef @@ -227,3 +227,4 @@ define KernelPackage/ar5523 FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ar5523/ar5523.ko AUTOLOAD:=$(call AutoProbe,ar5523) endef + diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh index daa54949a0..1bf4db6e5f 100644 --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh @@ -1,6 +1,7 @@ #!/bin/sh . /lib/netifd/netifd-wireless.sh . /lib/netifd/hostapd.sh +. /lib/functions/system.sh init_wireless_driver "$@" @@ -14,12 +15,9 @@ MP_CONFIG_INT="mesh_retry_timeout mesh_confirm_timeout mesh_holding_timeout mesh MP_CONFIG_BOOL="mesh_auto_open_plinks mesh_fwding" MP_CONFIG_STRING="mesh_power_mode" -NEWAPLIST= -OLDAPLIST= -NEWSPLIST= -OLDSPLIST= -NEWUMLIST= -OLDUMLIST= +wdev_tool() { + ucode /usr/share/hostap/wdev.uc "$@" +} drv_mac80211_init_device_config() { hostapd_common_add_device_config @@ -28,8 +26,9 @@ drv_mac80211_init_device_config() { config_add_string tx_burst config_add_string distance config_add_int beacon_int chanbw frag rts - config_add_int rxantenna txantenna antenna_gain txpower - config_add_boolean noscan ht_coex acs_exclude_dfs + config_add_int rxantenna txantenna txpower min_tx_power + config_add_int num_global_macaddr multiple_bssid + config_add_boolean noscan ht_coex acs_exclude_dfs background_radar config_add_array ht_capab config_add_array channels config_add_array scan_list @@ -50,6 +49,8 @@ drv_mac80211_init_device_config() { rx_antenna_pattern \ tx_antenna_pattern \ he_spr_sr_control \ + he_spr_psr_enabled \ + he_bss_color_enabled \ he_twt_required config_add_int \ beamformer_antennas \ @@ -137,13 +138,15 @@ mac80211_hostapd_setup_base() { [ -n "$acs_exclude_dfs" ] && [ "$acs_exclude_dfs" -gt 0 ] && append base_cfg "acs_exclude_dfs=1" "$N" - json_get_vars noscan ht_coex - json_get_values ht_capab_list ht_capab tx_burst + json_get_vars noscan ht_coex min_tx_power:0 tx_burst + json_get_values ht_capab_list ht_capab json_get_values channel_list channels [ "$auto_channel" = 0 ] && [ -z "$channel_list" ] && \ channel_list="$channel" + [ "$min_tx_power" -gt 0 ] && append base_cfg "min_tx_power=$min_tx_power" + set_default noscan 0 [ "$noscan" -gt 0 ] && hostapd_noscan=1 @@ -273,6 +276,11 @@ mac80211_hostapd_setup_base() { vht_center_seg0=$idx ;; esac + [ "$band" = "5g" ] && { + json_get_vars background_radar:0 + + [ "$background_radar" -eq 1 ] && append base_cfg "enable_background_radar=1" "$N" + } [ "$band" = "6g" ] && { op_class= case "$htmode" in @@ -406,12 +414,14 @@ mac80211_hostapd_setup_base() { if [ "$enable_ax" != "0" ]; then json_get_vars \ he_su_beamformer:1 \ - he_su_beamformee:0 \ + he_su_beamformee:1 \ he_mu_beamformer:1 \ he_twt_required:0 \ - he_spr_sr_control:0 \ - he_spr_non_srg_obss_pd_max_offset:1 \ - he_bss_color + he_spr_sr_control:3 \ + he_spr_psr_enabled:0 \ + he_spr_non_srg_obss_pd_max_offset:0 \ + he_bss_color:128 \ + he_bss_color_enabled:1 he_phy_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: AP/,$p' | awk -F "[()]" '/HE PHY Capabilities/ { print $2 }' | head -1) he_phy_cap=${he_phy_cap:2} @@ -419,7 +429,6 @@ mac80211_hostapd_setup_base() { he_mac_cap=${he_mac_cap:2} append base_cfg "ieee80211ax=1" "$N" - [ -n "$he_bss_color" ] && append base_cfg "he_bss_color=$he_bss_color" "$N" [ "$hwmode" = "a" ] && { append base_cfg "he_oper_chwidth=$vht_oper_chwidth" "$N" append base_cfg "he_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N" @@ -429,10 +438,21 @@ mac80211_hostapd_setup_base() { he_su_beamformer:${he_phy_cap:6:2}:0x80:$he_su_beamformer \ he_su_beamformee:${he_phy_cap:8:2}:0x1:$he_su_beamformee \ he_mu_beamformer:${he_phy_cap:8:2}:0x2:$he_mu_beamformer \ - he_spr_sr_control:${he_phy_cap:14:2}:0x1:$he_spr_sr_control \ + he_spr_psr_enabled:${he_phy_cap:14:2}:0x1:$he_spr_psr_enabled \ he_twt_required:${he_mac_cap:0:2}:0x6:$he_twt_required - [ "$he_spr_sr_control" -gt 0 ] && append base_cfg "he_spr_non_srg_obss_pd_max_offset=$he_spr_non_srg_obss_pd_max_offset" "$N" + if [ "$he_bss_color_enabled" -gt 0 ]; then + append base_cfg "he_bss_color=$he_bss_color" "$N" + [ "$he_spr_non_srg_obss_pd_max_offset" -gt 0 ] && { \ + append base_cfg "he_spr_non_srg_obss_pd_max_offset=$he_spr_non_srg_obss_pd_max_offset" "$N" + he_spr_sr_control=$((he_spr_sr_control | (1 << 2))) + } + [ "$he_spr_psr_enabled" -gt 0 ] || he_spr_sr_control=$((he_spr_sr_control | (1 << 0))) + append base_cfg "he_spr_sr_control=$he_spr_sr_control" "$N" + else + append base_cfg "he_bss_color_disabled=1" "$N" + fi + append base_cfg "he_default_pe_duration=4" "$N" append base_cfg "he_rts_threshold=1023" "$N" @@ -468,12 +488,12 @@ ${channel:+channel=$channel} ${channel_list:+chanlist=$channel_list} ${hostapd_noscan:+noscan=1} ${tx_burst:+tx_queue_data2_burst=$tx_burst} +${multiple_bssid:+mbssid=$multiple_bssid} +#num_global_macaddr=$num_global_macaddr $base_cfg EOF json_select .. - radio_md5sum=$(md5sum $hostapd_conf_file | cut -d" " -f1) - echo "radio_config_id=${radio_md5sum}" >> $hostapd_conf_file } mac80211_hostapd_setup_bss() { @@ -500,6 +520,7 @@ mac80211_hostapd_setup_bss() { cat >> /var/run/hostapd-$phy.conf </dev/null); do - grep -i -q "$macaddr" "/sys/class/ieee80211/${phy}/macaddress" && return 0 + grep -i -q "$macaddr" "/sys/class/ieee80211/${phy}/macaddress" && { + path="$(iwinfo nl80211 path "$phy")" + rename_board_phy_by_path "$path" + return 0 + } done } return 1 @@ -577,72 +620,10 @@ mac80211_check_ap() { has_ap=1 } -mac80211_iw_interface_add() { +mac80211_set_ifname() { local phy="$1" - local ifname="$2" - local type="$3" - local wdsflag="$4" - local rc - local oldifname - - iw phy "$phy" interface add "$ifname" type "$type" $wdsflag >/dev/null 2>&1 - rc="$?" - - [ "$rc" = 233 ] && { - # Device might have just been deleted, give the kernel some time to finish cleaning it up - sleep 1 - - iw phy "$phy" interface add "$ifname" type "$type" $wdsflag >/dev/null 2>&1 - rc="$?" - } - - [ "$rc" = 233 ] && { - # Keep matching pre-existing interface - [ -d "/sys/class/ieee80211/${phy}/device/net/${ifname}" ] && \ - case "$(iw dev $ifname info | grep "^\ttype" | cut -d' ' -f2- 2>/dev/null)" in - "AP") - [ "$type" = "__ap" ] && rc=0 - ;; - "IBSS") - [ "$type" = "adhoc" ] && rc=0 - ;; - "managed") - [ "$type" = "managed" ] && rc=0 - ;; - "mesh point") - [ "$type" = "mp" ] && rc=0 - ;; - "monitor") - [ "$type" = "monitor" ] && rc=0 - ;; - esac - } - - [ "$rc" = 233 ] && { - iw dev "$ifname" del >/dev/null 2>&1 - [ "$?" = 0 ] && { - sleep 1 - - iw phy "$phy" interface add "$ifname" type "$type" $wdsflag >/dev/null 2>&1 - rc="$?" - } - } - - [ "$rc" != 0 ] && { - # Device might not support virtual interfaces, so the interface never got deleted in the first place. - # Check if the interface already exists, and avoid failing in this case. - [ -d "/sys/class/ieee80211/${phy}/device/net/${ifname}" ] && rc=0 - } - - [ "$rc" != 0 ] && { - # Device doesn't support virtual interfaces and may have existing interface other than ifname. - oldifname="$(basename "/sys/class/ieee80211/${phy}/device/net"/* 2>/dev/null)" - [ "$oldifname" ] && ip link set "$oldifname" name "$ifname" 1>/dev/null 2>&1 - rc="$?" - } - - [ "$rc" != 0 ] && echo "Failed to create interface $ifname" - return $rc + local prefix="$2" + eval "ifname=\"$phy-$prefix\${idx_$prefix:-0}\"; idx_$prefix=\$((\${idx_$prefix:-0 } + 1))" } mac80211_prepare_vif() { @@ -650,22 +631,35 @@ mac80211_prepare_vif() { json_get_vars ifname mode ssid wds powersave macaddr enable wpa_psk_file vlan_file - [ -n "$ifname" ] || ifname="wlan${phy#phy}${if_idx:+-$if_idx}" - if_idx=$((${if_idx:-0} + 1)) + [ -n "$ifname" ] || { + local prefix; + + case "$mode" in + ap|sta|mesh) prefix=$mode;; + adhoc) prefix=ibss;; + monitor) prefix=mon;; + esac + + mac80211_set_ifname "$phy" "$prefix" + } + append active_ifnames "$ifname" set_default wds 0 set_default powersave 0 + json_add_string _ifname "$ifname" - json_select .. - - [ -n "$macaddr" ] || { + default_macaddr= + if [ -z "$macaddr" ]; then macaddr="$(mac80211_generate_mac $phy)" macidx="$(($macidx + 1))" - } + default_macaddr=1 + elif [ "$macaddr" = 'random' ]; then + macaddr="$(macaddr_random)" + fi + json_add_string _macaddr "$macaddr" + json_add_string _default_macaddr "$default_macaddr" + json_select .. - json_add_object data - json_add_string ifname "$ifname" - json_close_object [ "$mode" == "ap" ] && { [ -z "$wpa_psk_file" ] && hostapd_set_psk "$ifname" @@ -676,9 +670,6 @@ mac80211_prepare_vif() { # It is far easier to delete and create the desired interface case "$mode" in - adhoc) - mac80211_iw_interface_add "$phy" "$ifname" adhoc || return - ;; ap) # Hostapd will handle recreating the interface and # subsequent virtual APs belonging to the same PHY @@ -690,118 +681,20 @@ mac80211_prepare_vif() { mac80211_hostapd_setup_bss "$phy" "$ifname" "$macaddr" "$type" || return - NEWAPLIST="${NEWAPLIST}$ifname " [ -n "$hostapd_ctrl" ] || { ap_ifname="${ifname}" hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd/$ifname}" } ;; - mesh) - mac80211_iw_interface_add "$phy" "$ifname" mp || return - ;; - monitor) - mac80211_iw_interface_add "$phy" "$ifname" monitor || return - ;; - sta) - local wdsflag= - [ "$enable" = 0 ] || staidx="$(($staidx + 1))" - [ "$wds" -gt 0 ] && wdsflag="4addr on" - mac80211_iw_interface_add "$phy" "$ifname" managed "$wdsflag" || return - if [ "$wds" -gt 0 ]; then - iw "$ifname" set 4addr on - else - iw "$ifname" set 4addr off - fi - [ "$powersave" -gt 0 ] && powersave="on" || powersave="off" - iw "$ifname" set power_save "$powersave" - ;; esac - case "$mode" in - monitor|mesh) - [ "$auto_channel" -gt 0 ] || iw dev "$ifname" set channel "$channel" $iw_htmode - ;; - esac - - if [ "$mode" != "ap" ]; then - # ALL ap functionality will be passed to hostapd - # All interfaces must have unique mac addresses - # which can either be explicitly set in the device - # section, or automatically generated - ip link set dev "$ifname" address "$macaddr" - fi - json_select .. } -mac80211_setup_supplicant() { - local enable=$1 - local add_sp=0 - local spobj="$(ubus -S list | grep wpa_supplicant.${ifname})" - - [ "$enable" = 0 ] && { - ubus call wpa_supplicant.${phy} config_remove "{\"iface\":\"$ifname\"}" - ip link set dev "$ifname" down - iw dev "$ifname" del - return 0 - } - - wpa_supplicant_prepare_interface "$ifname" nl80211 || { - iw dev "$ifname" del - return 1 - } - if [ "$mode" = "sta" ]; then - wpa_supplicant_add_network "$ifname" - else - wpa_supplicant_add_network "$ifname" "$freq" "$htmode" "$noscan" - fi - - NEWSPLIST="${NEWSPLIST}$ifname " - - if [ "${NEWAPLIST%% *}" != "${OLDAPLIST%% *}" ]; then - [ "$spobj" ] && ubus call wpa_supplicant config_remove "{\"iface\":\"$ifname\"}" - add_sp=1 - fi - [ -z "$spobj" ] && add_sp=1 - - NEW_MD5_SP=$(test -e "${_config}" && md5sum ${_config}) - OLD_MD5_SP=$(uci -q -P /var/state get wireless._${phy}.md5_${ifname}) - if [ "$add_sp" = "1" ]; then - wpa_supplicant_run "$ifname" "$hostapd_ctrl" - else - [ "${NEW_MD5_SP}" == "${OLD_MD5_SP}" ] || ubus call $spobj reload - fi - uci -q -P /var/state set wireless._${phy}.md5_${ifname}="${NEW_MD5_SP}" - return 0 -} - -mac80211_setup_supplicant_noctl() { - local enable=$1 - local spobj="$(ubus -S list | grep wpa_supplicant.${ifname})" - wpa_supplicant_prepare_interface "$ifname" nl80211 || { - iw dev "$ifname" del - return 1 - } - - wpa_supplicant_add_network "$ifname" "$freq" "$htmode" "$noscan" - - NEWSPLIST="${NEWSPLIST}$ifname " - [ "$enable" = 0 ] && { - ubus call wpa_supplicant config_remove "{\"iface\":\"$ifname\"}" - ip link set dev "$ifname" down - return 0 - } - if [ -z "$spobj" ]; then - wpa_supplicant_run "$ifname" - else - ubus call $spobj reload - fi -} - mac80211_prepare_iw_htmode() { case "$htmode" in - VHT20|HT20) iw_htmode=HT20;; - HT40*|VHT40|VHT160) + VHT20|HT20|HE20) iw_htmode=HT20;; + HT40*|VHT40|VHT160|HE40) case "$band" in 2g) case "$htmode" in @@ -825,7 +718,7 @@ mac80211_prepare_iw_htmode() { esac [ "$auto_channel" -gt 0 ] && iw_htmode="HT40+" ;; - VHT80) + VHT80|HE80) iw_htmode="80MHZ" ;; NONE|NOHT) @@ -835,6 +728,13 @@ mac80211_prepare_iw_htmode() { esac } +mac80211_add_mesh_params() { + for var in $MP_CONFIG_INT $MP_CONFIG_BOOL $MP_CONFIG_STRING; do + eval "mp_val=\"\$$var\"" + [ -n "$mp_val" ] && json_add_string "$var" "$mp_val" + done +} + mac80211_setup_adhoc() { local enable=$1 json_get_vars bssid ssid key mcast_rate @@ -876,82 +776,215 @@ mac80211_setup_adhoc() { mcval= [ -n "$mcast_rate" ] && wpa_supplicant_add_rate mcval "$mcast_rate" - iw dev "$ifname" set type ibss - iw dev "$ifname" ibss join "$ssid" $freq $iw_htmode fixed-freq $bssid \ - beacon-interval $beacon_int \ - ${brstr:+basic-rates $brstr} \ - ${mcval:+mcast-rate $mcval} \ - ${keyspec:+keys $keyspec} + local prev + json_set_namespace wdev_uc prev + + json_add_object "$ifname" + json_add_string mode adhoc + [ -n "$default_macaddr" ] || json_add_string macaddr "$macaddr" + json_add_string ssid "$ssid" + json_add_string freq "$freq" + json_add_string htmode "$iw_htmode" + [ -n "$bssid" ] && json_add_string bssid "$bssid" + json_add_int beacon-interval "$beacon_int" + [ -n "$brstr" ] && json_add_string basic-rates "$brstr" + [ -n "$mcval" ] && json_add_string mcast-rate "$mcval" + [ -n "$keyspec" ] && json_add_string keys "$keyspec" + json_close_object + + json_set_namespace "$prev" } mac80211_setup_mesh() { - local enable=$1 json_get_vars ssid mesh_id mcast_rate - NEWUMLIST="${NEWUMLIST}$ifname " - - [ "$enable" = 0 ] && { - ip link set dev "$ifname" down - return 0 - } - mcval= [ -n "$mcast_rate" ] && wpa_supplicant_add_rate mcval "$mcast_rate" [ -n "$mesh_id" ] && ssid="$mesh_id" - iw dev "$ifname" mesh join "$ssid" freq $freq $iw_htmode \ - ${mcval:+mcast-rate $mcval} \ - beacon-interval $beacon_int + local prev + json_set_namespace wdev_uc prev + + json_add_object "$ifname" + json_add_string mode mesh + [ -n "$default_macaddr" ] || json_add_string macaddr "$macaddr" + json_add_string ssid "$ssid" + json_add_string freq "$freq" + json_add_string htmode "$iw_htmode" + [ -n "$mcval" ] && json_add_string mcast-rate "$mcval" + json_add_int beacon-interval "$beacon_int" + mac80211_add_mesh_params + + json_close_object + + json_set_namespace "$prev" } -mac80211_setup_vif() { +mac80211_setup_monitor() { + local prev + json_set_namespace wdev_uc prev + + json_add_object "$ifname" + json_add_string mode monitor + [ -n "$freq" ] && json_add_string freq "$freq" + json_add_string htmode "$iw_htmode" + json_close_object + + json_set_namespace "$prev" +} + +mac80211_set_vif_txpower() { local name="$1" - local failed - local action=up - json_select data - json_get_vars ifname + json_select config + json_get_var ifname _ifname + json_get_vars vif_txpower json_select .. - json_select config - json_get_vars mode - json_get_var vif_txpower - json_get_var vif_enable enable 1 - - [ "$vif_enable" = 1 ] || action=down - if [ "$mode" != "ap" ] || [ "$ifname" = "$ap_ifname" ]; then - ip link set dev "$ifname" "$action" || { - wireless_setup_vif_failed IFUP_ERROR - json_select .. - return - } - [ -z "$vif_txpower" ] || iw dev "$ifname" set txpower fixed "${vif_txpower%%.*}00" + [ -z "$vif_txpower" ] || iw dev "$ifname" set txpower fixed "${vif_txpower%%.*}00" +} + +wpa_supplicant_init_config() { + json_set_namespace wpa_supp prev + + json_init + json_add_array config + + json_set_namespace "$prev" +} + +wpa_supplicant_add_interface() { + local ifname="$1" + local mode="$2" + local prev + + _wpa_supplicant_common "$ifname" + + json_set_namespace wpa_supp prev + + json_add_object + json_add_string ctrl "$_rpath" + json_add_string iface "$ifname" + json_add_string mode "$mode" + json_add_string config "$_config" + [ -n "$default_macaddr" ] || json_add_string macaddr "$macaddr" + [ -n "$network_bridge" ] && json_add_string bridge "$network_bridge" + [ -n "$wds" ] && json_add_boolean 4addr "$wds" + json_add_boolean powersave "$powersave" + [ "$mode" = "mesh" ] && mac80211_add_mesh_params + json_close_object + + json_set_namespace "$prev" + + wpa_supp_init=1 +} + +wpa_supplicant_set_config() { + local phy="$1" + local prev + + json_set_namespace wpa_supp prev + json_close_array + json_add_string phy "$phy" + json_add_boolean defer 1 + local data="$(json_dump)" + + json_cleanup + json_set_namespace "$prev" + + ubus -S -t 0 wait_for wpa_supplicant || { + [ -n "$wpa_supp_init" ] || return 0 + + ubus wait_for wpa_supplicant + } + + local supplicant_res="$(ubus call wpa_supplicant config_set "$data")" + ret="$?" + [ "$ret" != 0 -o -z "$supplicant_res" ] && wireless_setup_vif_failed WPA_SUPPLICANT_FAILED + + wireless_add_process "$(jsonfilter -s "$supplicant_res" -l 1 -e @.pid)" "/usr/sbin/wpa_supplicant" 1 1 + +} + +hostapd_set_config() { + [ -n "$hostapd_ctrl" ] || { + ubus call hostapd config_set '{ "phy": "'"$phy"'", "config": "", "prev_config": "'"${hostapd_conf_file}.prev"'" }' > /dev/null + return 0; + } + + ubus wait_for hostapd + local hostapd_res="$(ubus call hostapd config_set "{ \"phy\": \"$phy\", \"config\":\"${hostapd_conf_file}\", \"prev_config\": \"${hostapd_conf_file}.prev\"}")" + ret="$?" + [ "$ret" != 0 -o -z "$hostapd_res" ] && { + wireless_setup_failed HOSTAPD_START_FAILED + return + } + wireless_add_process "$(jsonfilter -s "$hostapd_res" -l 1 -e @.pid)" "/usr/sbin/hostapd" 1 1 +} + + +wpa_supplicant_start() { + local phy="$1" + + [ -n "$wpa_supp_init" ] || return 0 + + ubus call wpa_supplicant config_set '{ "phy": "'"$phy"'" }' > /dev/null +} + +mac80211_setup_supplicant() { + local enable=$1 + local add_sp=0 + + wpa_supplicant_prepare_interface "$ifname" nl80211 || return 1 + + if [ "$mode" = "sta" ]; then + wpa_supplicant_add_network "$ifname" + else + wpa_supplicant_add_network "$ifname" "$freq" "$htmode" "$hostapd_noscan" fi + wpa_supplicant_add_interface "$ifname" "$mode" + + return 0 +} + +mac80211_setup_vif() { + local name="$1" + local failed + + json_select config + json_get_var ifname _ifname + json_get_var macaddr _macaddr + json_get_var default_macaddr _default_macaddr + json_get_vars mode wds powersave + + set_default powersave 0 + set_default wds 0 + case "$mode" in mesh) + json_get_vars $MP_CONFIG_INT $MP_CONFIG_BOOL $MP_CONFIG_STRING wireless_vif_parse_encryption [ -z "$htmode" ] && htmode="NOHT"; - if [ "$wpa" -gt 0 -o "$auto_channel" -gt 0 ] || chan_is_dfs "$phy" "$channel"; then - mac80211_setup_supplicant $vif_enable || failed=1 + if wpa_supplicant -vmesh; then + mac80211_setup_supplicant || failed=1 else - mac80211_setup_mesh $vif_enable + mac80211_setup_mesh fi - for var in $MP_CONFIG_INT $MP_CONFIG_BOOL $MP_CONFIG_STRING; do - json_get_var mp_val "$var" - [ -n "$mp_val" ] && iw dev "$ifname" set mesh_param "$var" "$mp_val" - done ;; adhoc) wireless_vif_parse_encryption if [ "$wpa" -gt 0 -o "$auto_channel" -gt 0 ]; then - mac80211_setup_supplicant_noctl $vif_enable || failed=1 + mac80211_setup_supplicant || failed=1 else - mac80211_setup_adhoc $vif_enable + mac80211_setup_adhoc fi ;; sta) - mac80211_setup_supplicant $vif_enable || failed=1 + mac80211_setup_supplicant || failed=1 + ;; + monitor) + mac80211_setup_monitor ;; esac @@ -984,7 +1017,6 @@ band_match && $3 == "MHz" && $4 == channel { ' } - chan_is_dfs() { local phy="$1" local chan="$2" @@ -992,27 +1024,6 @@ chan_is_dfs() { return $! } -mac80211_vap_cleanup() { - local service="$1" - local vaps="$2" - - for wdev in $vaps; do - [ "$service" != "none" ] && ubus call ${service} config_remove "{\"iface\":\"$wdev\"}" - ip link set dev "$wdev" down 2>/dev/null - iw dev "$wdev" del - done -} - -mac80211_interface_cleanup() { - local phy="$1" - local primary_ap=$(uci -q -P /var/state get wireless._${phy}.aplist) - primary_ap=${primary_ap%% *} - - mac80211_vap_cleanup hostapd "${primary_ap}" - mac80211_vap_cleanup wpa_supplicant "$(uci -q -P /var/state get wireless._${phy}.splist)" - mac80211_vap_cleanup none "$(uci -q -P /var/state get wireless._${phy}.umlist)" -} - mac80211_set_noscan() { hostapd_noscan=1 } @@ -1021,49 +1032,44 @@ drv_mac80211_cleanup() { hostapd_common_cleanup } +mac80211_reset_config() { + local phy="$1" + + hostapd_conf_file="/var/run/hostapd-$phy.conf" + ubus call hostapd config_set '{ "phy": "'"$phy"'", "config": "", "prev_config": "'"$hostapd_conf_file"'" }' > /dev/null + ubus call wpa_supplicant config_set '{ "phy": "'"$phy"'", "config": [] }' > /dev/null + wdev_tool "$phy" set_config '{}' +} + drv_mac80211_setup() { json_select config json_get_vars \ phy macaddr path \ country chanbw distance \ - txpower antenna_gain \ + txpower \ rxantenna txantenna \ - frag rts beacon_int:100 htmode + frag rts beacon_int:100 htmode \ + num_global_macaddr:1 multiple_bssid json_get_values basic_rate_list basic_rate json_get_values scan_list scan_list json_select .. + json_select data && { + json_get_var prev_rxantenna rxantenna + json_get_var prev_txantenna txantenna + json_select .. + } + find_phy || { echo "Could not find PHY for device '$1'" wireless_set_retry 0 return 1 } - wireless_set_data phy="$phy" - [ -z "$(uci -q -P /var/state show wireless._${phy})" ] && uci -q -P /var/state set wireless._${phy}=phy - - OLDAPLIST=$(uci -q -P /var/state get wireless._${phy}.aplist) - OLDSPLIST=$(uci -q -P /var/state get wireless._${phy}.splist) - OLDUMLIST=$(uci -q -P /var/state get wireless._${phy}.umlist) - local wdev local cwdev local found - for wdev in $(list_phy_interfaces "$phy"); do - found=0 - for cwdev in $OLDAPLIST $OLDSPLIST $OLDUMLIST; do - if [ "$wdev" = "$cwdev" ]; then - found=1 - break - fi - done - if [ "$found" = "0" ]; then - ip link set dev "$wdev" down - iw dev "$wdev" del - fi - done - # convert channel to frequency [ "$auto_channel" -gt 0 ] || freq="$(get_freq "$phy" "$channel" "$band")" @@ -1076,7 +1082,6 @@ drv_mac80211_setup() { hostapd_conf_file="/var/run/hostapd-$phy.conf" - no_ap=1 macidx=0 staidx=0 @@ -1089,13 +1094,14 @@ drv_mac80211_setup() { set_default rxantenna 0xffffffff set_default txantenna 0xffffffff set_default distance 0 - set_default antenna_gain 0 [ "$txantenna" = "all" ] && txantenna=0xffffffff [ "$rxantenna" = "all" ] && rxantenna=0xffffffff + [ "$rxantenna" = "$prev_rxantenna" -a "$txantenna" = "$prev_txantenna" ] || mac80211_reset_config "$phy" + wireless_set_data phy="$phy" txantenna="$txantenna" rxantenna="$rxantenna" + iw phy "$phy" set antenna $txantenna $rxantenna >/dev/null 2>&1 - iw phy "$phy" set antenna_gain $antenna_gain >/dev/null 2>&1 iw phy "$phy" set distance "$distance" >/dev/null 2>&1 if [ -n "$txpower" ]; then @@ -1111,78 +1117,36 @@ drv_mac80211_setup() { hostapd_ctrl= ap_ifname= hostapd_noscan= + wpa_supp_init= for_each_interface "ap" mac80211_check_ap - rm -f "$hostapd_conf_file" + [ -f "$hostapd_conf_file" ] && mv "$hostapd_conf_file" "$hostapd_conf_file.prev" for_each_interface "sta adhoc mesh" mac80211_set_noscan [ -n "$has_ap" ] && mac80211_hostapd_setup_base "$phy" - mac80211_prepare_iw_htmode - for_each_interface "sta adhoc mesh monitor" mac80211_prepare_vif - NEWAPLIST= - for_each_interface "ap" mac80211_prepare_vif - NEW_MD5=$(test -e "${hostapd_conf_file}" && md5sum ${hostapd_conf_file}) - OLD_MD5=$(uci -q -P /var/state get wireless._${phy}.md5) - if [ "${NEWAPLIST}" != "${OLDAPLIST}" ]; then - mac80211_vap_cleanup hostapd "${OLDAPLIST}" - fi - [ -n "${NEWAPLIST}" ] && mac80211_iw_interface_add "$phy" "${NEWAPLIST%% *}" __ap - local add_ap=0 - local primary_ap=${NEWAPLIST%% *} - [ -n "$hostapd_ctrl" ] && { - local no_reload=1 - if [ -n "$(ubus list | grep hostapd.$primary_ap)" ]; then - no_reload=0 - [ "${NEW_MD5}" = "${OLD_MD5}" ] || { - ubus call hostapd.$primary_ap reload - no_reload=$? - if [ "$no_reload" != "0" ]; then - mac80211_vap_cleanup hostapd "${OLDAPLIST}" - mac80211_vap_cleanup wpa_supplicant "$(uci -q -P /var/state get wireless._${phy}.splist)" - mac80211_vap_cleanup none "$(uci -q -P /var/state get wireless._${phy}.umlist)" - sleep 2 - mac80211_iw_interface_add "$phy" "${NEWAPLIST%% *}" __ap - for_each_interface "sta adhoc mesh monitor" mac80211_prepare_vif - fi - } - fi - if [ "$no_reload" != "0" ]; then - add_ap=1 - ubus wait_for hostapd - local hostapd_res="$(ubus call hostapd config_add "{\"iface\":\"$primary_ap\", \"config\":\"${hostapd_conf_file}\"}")" - ret="$?" - [ "$ret" != 0 -o -z "$hostapd_res" ] && { - wireless_setup_failed HOSTAPD_START_FAILED - return - } - wireless_add_process "$(jsonfilter -s "$hostapd_res" -l 1 -e @.pid)" "/usr/sbin/hostapd" 1 1 - fi - } - uci -q -P /var/state set wireless._${phy}.aplist="${NEWAPLIST}" - uci -q -P /var/state set wireless._${phy}.md5="${NEW_MD5}" + local prev + json_set_namespace wdev_uc prev + json_init + json_set_namespace "$prev" + + wpa_supplicant_init_config - [ "${add_ap}" = 1 ] && sleep 1 - for_each_interface "ap" mac80211_setup_vif + mac80211_prepare_iw_htmode + active_ifnames= + for_each_interface "ap sta adhoc mesh monitor" mac80211_prepare_vif + for_each_interface "ap sta adhoc mesh monitor" mac80211_setup_vif - NEWSPLIST= - NEWUMLIST= + [ -x /usr/sbin/wpa_supplicant ] && wpa_supplicant_set_config "$phy" + [ -x /usr/sbin/hostapd ] && hostapd_set_config "$phy" - for_each_interface "sta adhoc mesh monitor" mac80211_setup_vif + [ -x /usr/sbin/wpa_supplicant ] && wpa_supplicant_start "$phy" - uci -q -P /var/state set wireless._${phy}.splist="${NEWSPLIST}" - uci -q -P /var/state set wireless._${phy}.umlist="${NEWUMLIST}" + json_set_namespace wdev_uc prev + wdev_tool "$phy" set_config "$(json_dump)" $active_ifnames + json_set_namespace "$prev" - local foundvap - local dropvap="" - for oldvap in $OLDSPLIST; do - foundvap=0 - for newvap in $NEWSPLIST; do - [ "$oldvap" = "$newvap" ] && foundvap=1 - done - [ "$foundvap" = "0" ] && dropvap="$dropvap $oldvap" - done - [ -n "$dropvap" ] && mac80211_vap_cleanup wpa_supplicant "$dropvap" + for_each_interface "ap sta adhoc mesh monitor" mac80211_set_vif_txpower wireless_set_up } @@ -1213,8 +1177,12 @@ drv_mac80211_teardown() { return 1 } - mac80211_interface_cleanup "$phy" - uci -q -P /var/state revert wireless._${phy} + mac80211_reset_config "$phy" + + for wdev in $(list_phy_interfaces "$phy"); do + ip link set dev "$wdev" down + iw dev "$wdev" del + done } add_driver mac80211 diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh index 8ae46892e2..8137c6bc8c 100644 --- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh +++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh @@ -2,58 +2,46 @@ append DRIVERS "mac80211" -lookup_phy() { - [ -n "$phy" ] && { - [ -d /sys/class/ieee80211/$phy ] && return - } - - local devpath - config_get devpath "$device" path - [ -n "$devpath" ] && { - phy="$(iwinfo nl80211 phyname "path=$devpath")" - [ -n "$phy" ] && return - } - - local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')" - [ -n "$macaddr" ] && { - for _phy in /sys/class/ieee80211/*; do - [ -e "$_phy" ] || continue - - [ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue - phy="${_phy##*/}" - return - done - } - phy= - return -} - -find_mac80211_phy() { +check_mac80211_device() { local device="$1" + local path="$2" + local macaddr="$3" + [ -n "$found" ] && return 0 + + phy_path= config_get phy "$device" phy - lookup_phy - [ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || { - echo "PHY for wifi device $1 not found" - return 1 + json_select wlan + [ -n "$phy" ] && case "$phy" in + phy*) + [ -d /sys/class/ieee80211/$phy ] && \ + phy_path="$(iwinfo nl80211 path "$dev")" + ;; + *) + if json_is_a "$phy" object; then + json_select "$phy" + json_get_var phy_path path + json_select .. + elif json_is_a "${phy%.*}" object; then + json_select "${phy%.*}" + json_get_var phy_path path + json_select .. + phy_path="$phy_path+${phy##*.}" + fi + ;; + esac + json_select .. + [ -n "$phy_path" ] || config_get phy_path "$device" path + [ -n "$path" -a "$phy_path" = "$path" ] && { + found=1 + return 0 } - config_set "$device" phy "$phy" - config_get macaddr "$device" macaddr - [ -z "$macaddr" ] && { - config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)" - } + config_get dev_macaddr "$device" macaddr - return 0 -} + [ -n "$macaddr" -a "$dev_macaddr" = "$macaddr" ] && found=1 -check_mac80211_device() { - config_get phy "$1" phy - [ -z "$phy" ] && { - find_mac80211_phy "$1" >/dev/null || return 0 - config_get phy "$1" phy - } - [ "$phy" = "$dev" ] && found=1 + return 0 } @@ -135,24 +123,41 @@ get_band_defaults() { done } +check_devidx() { + case "$1" in + radio[0-9]*) + local idx="${1#radio}" + [ "$devidx" -ge "${1#radio}" ] && devidx=$((idx + 1)) + ;; + esac +} + +check_board_phy() { + local name="$2" + + json_select "$name" + json_get_var phy_path path + json_select .. + + if [ "$path" = "$phy_path" ]; then + board_dev="$name" + elif [ "${path%+*}" = "$phy_path" ]; then + fallback_board_dev="$name.${path#*+}" + fi +} + detect_mac80211() { devidx=0 config_load wireless - while :; do - config_get type "radio$devidx" type - [ -n "$type" ] || break - devidx=$(($devidx + 1)) - done + config_foreach check_devidx wifi-device + + json_load_file /etc/board.json for _dev in /sys/class/ieee80211/*; do [ -e "$_dev" ] || continue dev="${_dev##*/}" - found=0 - config_foreach check_mac80211_device wifi-device - [ "$found" -gt 0 ] && continue - mode_band="" channel="" htmode="" @@ -161,30 +166,52 @@ detect_mac80211() { get_band_defaults "$dev" path="$(iwinfo nl80211 path "$dev")" - if [ -n "$path" ]; then - dev_id="set wireless.radio${devidx}.path='$path'" - else - dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)" - fi + macaddr="$(cat /sys/class/ieee80211/${dev}/macaddress)" + + # work around phy rename related race condition + [ -n "$path" -o -n "$macaddr" ] || continue + + board_dev= + fallback_board_dev= + json_for_each_item check_board_phy wlan + [ -n "$board_dev" ] || board_dev="$fallback_board_dev" + [ -n "$board_dev" ] && dev="$board_dev" + + found= + config_foreach check_mac80211_device wifi-device "$path" "$macaddr" + [ -n "$found" ] && continue + + name="radio${devidx}" + devidx=$(($devidx + 1)) + case "$dev" in + phy*) + if [ -n "$path" ]; then + dev_id="set wireless.${name}.path='$path'" + else + dev_id="set wireless.${name}.macaddr='$macaddr'" + fi + ;; + *) + dev_id="set wireless.${name}.phy='$dev'" + ;; + esac uci -q batch <<-EOF - set wireless.radio${devidx}=wifi-device - set wireless.radio${devidx}.type=mac80211 + set wireless.${name}=wifi-device + set wireless.${name}.type=mac80211 ${dev_id} - set wireless.radio${devidx}.channel=${channel} - set wireless.radio${devidx}.band=${mode_band} - set wireless.radio${devidx}.htmode=$htmode - set wireless.radio${devidx}.disabled=1 - - set wireless.default_radio${devidx}=wifi-iface - set wireless.default_radio${devidx}.device=radio${devidx} - set wireless.default_radio${devidx}.network=lan - set wireless.default_radio${devidx}.mode=ap - set wireless.default_radio${devidx}.ssid=libreCMC - set wireless.default_radio${devidx}.encryption=none + set wireless.${name}.channel=${channel} + set wireless.${name}.band=${mode_band} + set wireless.${name}.htmode=$htmode + set wireless.${name}.disabled=1 + + set wireless.default_${name}=wifi-iface + set wireless.default_${name}.device=${name} + set wireless.default_${name}.network=lan + set wireless.default_${name}.mode=ap + set wireless.default_${name}.ssid=libreCMC + set wireless.default_${name}.encryption=none EOF uci -q commit wireless - - devidx=$(($devidx + 1)) done } 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 4ea33365d1..fd5493de71 100644 --- a/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch +++ b/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch @@ -82,7 +82,7 @@ help --- a/local-symbols +++ b/local-symbols -@@ -106,6 +106,7 @@ ADM8211= +@@ -102,6 +102,7 @@ ADM8211= ATH_COMMON= WLAN_VENDOR_ATH= ATH_DEBUG= diff --git a/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch b/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch index c66301efa7..8d83921a3b 100644 --- a/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch +++ b/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch @@ -1,6 +1,6 @@ --- a/net/wireless/reg.c +++ b/net/wireless/reg.c -@@ -3315,6 +3315,8 @@ void regulatory_hint_country_ie(struct w +@@ -3370,6 +3370,8 @@ void regulatory_hint_country_ie(struct w enum environment_cap env = ENVIRON_ANY; struct regulatory_request *request = NULL, *lr; @@ -9,7 +9,7 @@ /* IE len must be evenly divisible by 2 */ if (country_ie_len & 0x01) return; -@@ -3566,6 +3568,7 @@ static bool is_wiphy_all_set_reg_flag(en +@@ -3621,6 +3623,7 @@ static bool is_wiphy_all_set_reg_flag(en void regulatory_hint_disconnect(void) { diff --git a/package/kernel/mac80211/patches/ath/405-ath_regd_us.patch b/package/kernel/mac80211/patches/ath/405-ath_regd_us.patch index 088833199d..6723721a47 100644 --- a/package/kernel/mac80211/patches/ath/405-ath_regd_us.patch +++ b/package/kernel/mac80211/patches/ath/405-ath_regd_us.patch @@ -8,7 +8,7 @@ FRANCE_RES = 0x31, FCC3_FCCA = 0x3A, FCC3_WORLD = 0x3B, -@@ -172,6 +173,7 @@ static struct reg_dmn_pair_mapping regDo +@@ -173,6 +174,7 @@ static struct reg_dmn_pair_mapping regDo {FCC2_WORLD, CTL_FCC, CTL_ETSI}, {FCC2_ETSIC, CTL_FCC, CTL_ETSI}, {FCC3_FCCA, CTL_FCC, CTL_FCC}, @@ -16,7 +16,7 @@ {FCC3_WORLD, CTL_FCC, CTL_ETSI}, {FCC3_ETSIC, CTL_FCC, CTL_ETSI}, {FCC4_FCCA, CTL_FCC, CTL_FCC}, -@@ -483,6 +485,7 @@ static struct country_code_to_enum_rd al +@@ -486,6 +488,7 @@ static struct country_code_to_enum_rd al {CTRY_UAE, NULL1_WORLD, "AE"}, {CTRY_UNITED_KINGDOM, ETSI1_WORLD, "GB"}, {CTRY_UNITED_STATES, FCC3_FCCA, "US"}, diff --git a/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch b/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch new file mode 100644 index 0000000000..41ad6006b5 --- /dev/null +++ b/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch @@ -0,0 +1,47 @@ +--- a/drivers/net/wireless/ath/ath10k/Kconfig ++++ b/drivers/net/wireless/ath/ath10k/Kconfig +@@ -86,6 +86,12 @@ config ATH10K_TRACING + help + Select this to ath10k use tracing infrastructure. + ++config ATH10K_THERMAL ++ bool "Atheros ath10k thermal monitoring support" ++ depends on THERMAL ++ ---help--- ++ Select this to ath10k use hwmon for thermal measurement. ++ + config ATH10K_DFS_CERTIFIED + bool "Atheros DFS support for certified platforms" + depends on ATH10K && CFG80211_CERTIFICATION_ONUS +--- a/drivers/net/wireless/ath/ath10k/Makefile ++++ b/drivers/net/wireless/ath/ath10k/Makefile +@@ -18,7 +18,7 @@ ath10k_core-y += mac.o \ + ath10k_core-$(CPTCFG_ATH10K_SPECTRAL) += spectral.o + ath10k_core-$(CPTCFG_NL80211_TESTMODE) += testmode.o + ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o +-ath10k_core-$(CONFIG_THERMAL) += thermal.o ++ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o + ath10k_core-$(CPTCFG_MAC80211_DEBUGFS) += debugfs_sta.o + ath10k_core-$(CONFIG_PM) += wow.o + ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o +--- a/drivers/net/wireless/ath/ath10k/thermal.h ++++ b/drivers/net/wireless/ath/ath10k/thermal.h +@@ -25,7 +25,7 @@ struct ath10k_thermal { + int temperature; + }; + +-#if IS_REACHABLE(CONFIG_THERMAL) ++#if IS_REACHABLE(CPTCFG_ATH10K_THERMAL) + int ath10k_thermal_register(struct ath10k *ar); + void ath10k_thermal_unregister(struct ath10k *ar); + void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature); +--- a/local-symbols ++++ b/local-symbols +@@ -161,6 +161,7 @@ ATH10K_SNOC= + ATH10K_DEBUG= + ATH10K_DEBUGFS= + ATH10K_SPECTRAL= ++ATH10K_THERMAL= + ATH10K_TRACING= + ATH10K_DFS_CERTIFIED= + WCN36XX= diff --git a/package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch new file mode 100644 index 0000000000..dd9e0069c3 --- /dev/null +++ b/package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch @@ -0,0 +1,33 @@ +From: Sven Eckelmann +Date: Tue, 18 Nov 2014 12:29:28 +0100 +Subject: [PATCH] ath10k: Don't initialize devices asynchronously + +libreCMC requires all PHYs to be initialized to create the configuration files +during bootup. ath10k violates this because it delays the creation of the PHY +to a not well defined point in the future. + +Forcing the work to be done immediately works around this problem but may also +delay the boot when firmware images cannot be found. + +Signed-off-by: Sven Eckelmann +--- + +--- a/drivers/net/wireless/ath/ath10k/core.c ++++ b/drivers/net/wireless/ath/ath10k/core.c +@@ -3516,6 +3516,16 @@ int ath10k_core_register(struct ath10k * + + queue_work(ar->workqueue, &ar->register_work); + ++ /* libreCMC requires all PHYs to be initialized to create the ++ * configuration files during bootup. ath10k violates this ++ * because it delays the creation of the PHY to a not well defined ++ * point in the future. ++ * ++ * Forcing the work to be done immediately works around this problem ++ * but may also delay the boot when firmware images cannot be found. ++ */ ++ flush_workqueue(ar->workqueue); ++ + return 0; + } + EXPORT_SYMBOL(ath10k_core_register); diff --git a/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch b/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch new file mode 100644 index 0000000000..e8beed17e8 --- /dev/null +++ b/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch @@ -0,0 +1,37 @@ +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -9909,6 +9909,21 @@ static int ath10k_mac_init_rd(struct ath + return 0; + } + ++#ifdef CPTCFG_MAC80211_LEDS ++static const struct ieee80211_tpt_blink ath10k_tpt_blink[] = { ++ { .throughput = 0 * 1024, .blink_time = 334 }, ++ { .throughput = 1 * 1024, .blink_time = 260 }, ++ { .throughput = 2 * 1024, .blink_time = 220 }, ++ { .throughput = 5 * 1024, .blink_time = 190 }, ++ { .throughput = 10 * 1024, .blink_time = 170 }, ++ { .throughput = 25 * 1024, .blink_time = 150 }, ++ { .throughput = 54 * 1024, .blink_time = 130 }, ++ { .throughput = 120 * 1024, .blink_time = 110 }, ++ { .throughput = 265 * 1024, .blink_time = 80 }, ++ { .throughput = 586 * 1024, .blink_time = 50 }, ++}; ++#endif ++ + int ath10k_mac_register(struct ath10k *ar) + { + static const u32 cipher_suites[] = { +@@ -10267,6 +10282,12 @@ int ath10k_mac_register(struct ath10k *a + + ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER; + ++#ifdef CPTCFG_MAC80211_LEDS ++ ieee80211_create_tpt_led_trigger(ar->hw, ++ IEEE80211_TPT_LEDTRIG_FL_RADIO, ath10k_tpt_blink, ++ ARRAY_SIZE(ath10k_tpt_blink)); ++#endif ++ + ret = ieee80211_register_hw(ar->hw); + if (ret) { + ath10k_err(ar, "failed to register ieee80211: %d\n", ret); diff --git a/package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch b/package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch new file mode 100644 index 0000000000..1c1630c051 --- /dev/null +++ b/package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch @@ -0,0 +1,609 @@ +From: Sebastian Gottschall + +Adds LED and GPIO Control support for 988x, 9887, 9888, 99x0, 9984 based +chipsets with on chipset connected led's using WMI Firmware API. The LED +device will get available named as "ath10k-phyX" at sysfs and can be controlled +with various triggers. adds also debugfs interface for gpio control. + +This patch is specific for OpenWRt base, as is use old backported package +with old wireless source. Support for QCA9984 is removed and a simbol +is added to local-simbol file to export the actually compile the code +with the ATH10K_LEDS simbol. + + +Signed-off-by: Sebastian Gottschall +Reviewed-by: Steve deRosier +[kvalo: major reorg and cleanup] +Signed-off-by: Kalle Valo +Signed-off-by: Ansuel Smith +--- + +v13: + +* only compile tested! + +* fix all checkpatch warnings + +* fix commit log + +* sizeof(struct ath10k_gpiocontrol) -> sizeof(*gpio) + +* unsigned -> unsigned int + +* remove GPIOLIB code, that should be added in a separate patch + +* rename gpio.c to leds.c + +* add leds.h + +* rename some functions: + + ath10k_attach_led() -> ath10k_leds_register() + ath10k_unregister_led() -> ath10k_leds_unregister() + ath10k_reset_led_pin() -> ath10k_leds_start() + +* call ath10k_leds_unregister() before ath10k_thermal_unregister() to preserve ordering + +* call ath10k_leds_start() only from ath10k_core_start() and not from mac.c + +* rename struct ath10k_gpiocontrol as anonymous function under struct + ath10k::leds, no need for memory allocation + +* merge ath10k_add_led() to ath10k_attach_led(), which is it's only caller + +* remove #if IS_ENABLED() checks from most of places, memory savings from those were not worth it + +* Kconfig help text improvement and move it lower in the menu, also don't enable it by default + +* switch to set_brightness_blocking() so that the callback can sleep, + then no need to use ath10k_wmi_cmd_send_nowait() and can take mutex + to access ar->state + +* don't touch ath10k_wmi_pdev_get_temperature() + +* as QCA6174/QCA9377 are not (yet) supported don't add the command to WMI-TLV interface + +* remove debugfs interface, that should be added in another patch + +* cleanup includes + + + drivers/net/wireless/ath/ath10k/Kconfig | 10 +++ + drivers/net/wireless/ath/ath10k/Makefile | 1 + + drivers/net/wireless/ath/ath10k/core.c | 22 +++++++ + drivers/net/wireless/ath/ath10k/core.h | 9 ++- + drivers/net/wireless/ath/ath10k/hw.h | 1 + + drivers/net/wireless/ath/ath10k/leds.c | 103 ++++++++++++++++++++++++++++++ + drivers/net/wireless/ath/ath10k/leds.h | 45 +++++++++++++ + drivers/net/wireless/ath/ath10k/mac.c | 1 + + drivers/net/wireless/ath/ath10k/wmi-ops.h | 32 ++++++++++ + drivers/net/wireless/ath/ath10k/wmi-tlv.c | 2 + + drivers/net/wireless/ath/ath10k/wmi.c | 54 ++++++++++++++++ + drivers/net/wireless/ath/ath10k/wmi.h | 35 ++++++++++ + 12 files changed, 314 insertions(+), 1 deletion(-) + create mode 100644 drivers/net/wireless/ath/ath10k/leds.c + create mode 100644 drivers/net/wireless/ath/ath10k/leds.h +--- a/drivers/net/wireless/ath/ath10k/Kconfig ++++ b/drivers/net/wireless/ath/ath10k/Kconfig +@@ -71,6 +71,16 @@ config ATH10K_DEBUGFS + + If unsure, say Y to make it easier to debug problems. + ++config ATH10K_LEDS ++ bool "Atheros ath10k LED support" ++ depends on ATH10K ++ select MAC80211_LEDS ++ select LEDS_CLASS ++ select NEW_LEDS ++ default y ++ ---help--- ++ This option is necessary, if you want LED support for chipset connected led pins. If unsure, say N. ++ + config ATH10K_SPECTRAL + bool "Atheros ath10k spectral scan support" + depends on ATH10K_DEBUGFS +--- a/drivers/net/wireless/ath/ath10k/Makefile ++++ b/drivers/net/wireless/ath/ath10k/Makefile +@@ -19,6 +19,7 @@ ath10k_core-$(CPTCFG_ATH10K_SPECTRAL) += + ath10k_core-$(CPTCFG_NL80211_TESTMODE) += testmode.o + ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o + ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o ++ath10k_core-$(CPTCFG_ATH10K_LEDS) += leds.o + ath10k_core-$(CPTCFG_MAC80211_DEBUGFS) += debugfs_sta.o + ath10k_core-$(CONFIG_PM) += wow.o + ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o +--- a/local-symbols ++++ b/local-symbols +@@ -162,6 +162,7 @@ ATH10K_DEBUG= + ATH10K_DEBUGFS= + ATH10K_SPECTRAL= + ATH10K_THERMAL= ++ATH10K_LEDS= + ATH10K_TRACING= + ATH10K_DFS_CERTIFIED= + WCN36XX= +--- a/drivers/net/wireless/ath/ath10k/core.c ++++ b/drivers/net/wireless/ath/ath10k/core.c +@@ -26,6 +26,7 @@ + #include "testmode.h" + #include "wmi-ops.h" + #include "coredump.h" ++#include "leds.h" + + unsigned int ath10k_debug_mask; + EXPORT_SYMBOL(ath10k_debug_mask); +@@ -65,6 +66,7 @@ static const struct ath10k_hw_params ath + .dev_id = QCA988X_2_0_DEVICE_ID, + .bus = ATH10K_BUS_PCI, + .name = "qca988x hw2.0", ++ .led_pin = 1, + .patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR, + .uart_pin = 7, + .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL, +@@ -146,6 +148,7 @@ static const struct ath10k_hw_params ath + .dev_id = QCA9887_1_0_DEVICE_ID, + .bus = ATH10K_BUS_PCI, + .name = "qca9887 hw1.0", ++ .led_pin = 1, + .patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR, + .uart_pin = 7, + .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL, +@@ -387,6 +390,7 @@ static const struct ath10k_hw_params ath + .dev_id = QCA99X0_2_0_DEVICE_ID, + .bus = ATH10K_BUS_PCI, + .name = "qca99x0 hw2.0", ++ .led_pin = 17, + .patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR, + .uart_pin = 7, + .otp_exe_param = 0x00000700, +@@ -433,6 +437,7 @@ static const struct ath10k_hw_params ath + .dev_id = QCA9984_1_0_DEVICE_ID, + .bus = ATH10K_BUS_PCI, + .name = "qca9984/qca9994 hw1.0", ++ .led_pin = 17, + .patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR, + .uart_pin = 7, + .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH, +@@ -486,6 +491,7 @@ static const struct ath10k_hw_params ath + .dev_id = QCA9888_2_0_DEVICE_ID, + .bus = ATH10K_BUS_PCI, + .name = "qca9888 hw2.0", ++ .led_pin = 17, + .patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR, + .uart_pin = 7, + .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH, +@@ -3231,6 +3237,10 @@ int ath10k_core_start(struct ath10k *ar, + goto err_hif_stop; + } + ++ status = ath10k_leds_start(ar); ++ if (status) ++ goto err_hif_stop; ++ + return 0; + + err_hif_stop: +@@ -3489,9 +3499,18 @@ static void ath10k_core_register_work(st + goto err_spectral_destroy; + } + ++ status = ath10k_leds_register(ar); ++ if (status) { ++ ath10k_err(ar, "could not register leds: %d\n", ++ status); ++ goto err_thermal_unregister; ++ } ++ + set_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags); + return; + ++err_thermal_unregister: ++ ath10k_thermal_unregister(ar); + err_spectral_destroy: + ath10k_spectral_destroy(ar); + err_debug_destroy: +@@ -3537,6 +3556,8 @@ void ath10k_core_unregister(struct ath10 + if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags)) + return; + ++ ath10k_leds_unregister(ar); ++ + ath10k_thermal_unregister(ar); + /* Stop spectral before unregistering from mac80211 to remove the + * relayfs debugfs file cleanly. Otherwise the parent debugfs tree +--- a/drivers/net/wireless/ath/ath10k/core.h ++++ b/drivers/net/wireless/ath/ath10k/core.h +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + + #include "htt.h" + #include "htc.h" +@@ -1253,6 +1254,13 @@ struct ath10k { + } testmode; + + struct { ++ struct gpio_led wifi_led; ++ struct led_classdev cdev; ++ char label[48]; ++ u32 gpio_state_pin; ++ } leds; ++ ++ struct { + /* protected by data_lock */ + u32 rx_crc_err_drop; + u32 fw_crash_counter; +--- a/drivers/net/wireless/ath/ath10k/hw.h ++++ b/drivers/net/wireless/ath/ath10k/hw.h +@@ -519,6 +519,7 @@ struct ath10k_hw_params { + const char *name; + u32 patch_load_addr; + int uart_pin; ++ int led_pin; + u32 otp_exe_param; + + /* Type of hw cycle counter wraparound logic, for more info +--- /dev/null ++++ b/drivers/net/wireless/ath/ath10k/leds.c +@@ -0,0 +1,103 @@ ++/* ++ * Copyright (c) 2005-2011 Atheros Communications Inc. ++ * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. ++ * Copyright (c) 2018 Sebastian Gottschall ++ * Copyright (c) 2018, 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 ++ ++#include "core.h" ++#include "wmi.h" ++#include "wmi-ops.h" ++ ++#include "leds.h" ++ ++static int ath10k_leds_set_brightness_blocking(struct led_classdev *led_cdev, ++ enum led_brightness brightness) ++{ ++ struct ath10k *ar = container_of(led_cdev, struct ath10k, ++ leds.cdev); ++ struct gpio_led *led = &ar->leds.wifi_led; ++ ++ mutex_lock(&ar->conf_mutex); ++ ++ if (ar->state != ATH10K_STATE_ON) ++ goto out; ++ ++ ar->leds.gpio_state_pin = (brightness != LED_OFF) ^ led->active_low; ++ ath10k_wmi_gpio_output(ar, led->gpio, ar->leds.gpio_state_pin); ++ ++out: ++ mutex_unlock(&ar->conf_mutex); ++ ++ return 0; ++} ++ ++int ath10k_leds_start(struct ath10k *ar) ++{ ++ if (ar->hw_params.led_pin == 0) ++ /* leds not supported */ ++ return 0; ++ ++ /* under some circumstances, the gpio pin gets reconfigured ++ * to default state by the firmware, so we need to ++ * reconfigure it this behaviour has only ben seen on ++ * QCA9984 and QCA99XX devices so far ++ */ ++ ath10k_wmi_gpio_config(ar, ar->hw_params.led_pin, 0, ++ WMI_GPIO_PULL_NONE, WMI_GPIO_INTTYPE_DISABLE); ++ ath10k_wmi_gpio_output(ar, ar->hw_params.led_pin, 1); ++ ++ return 0; ++} ++ ++int ath10k_leds_register(struct ath10k *ar) ++{ ++ int ret; ++ ++ if (ar->hw_params.led_pin == 0) ++ /* leds not supported */ ++ return 0; ++ ++ snprintf(ar->leds.label, sizeof(ar->leds.label), "ath10k-%s", ++ wiphy_name(ar->hw->wiphy)); ++ ar->leds.wifi_led.active_low = 1; ++ ar->leds.wifi_led.gpio = ar->hw_params.led_pin; ++ ar->leds.wifi_led.name = ar->leds.label; ++ ar->leds.wifi_led.default_state = LEDS_GPIO_DEFSTATE_KEEP; ++ ++ ar->leds.cdev.name = ar->leds.label; ++ ar->leds.cdev.brightness_set_blocking = ath10k_leds_set_brightness_blocking; ++ ++ /* FIXME: this assignment doesn't make sense as it's NULL, remove it? */ ++ ar->leds.cdev.default_trigger = ar->leds.wifi_led.default_trigger; ++ ++ ret = led_classdev_register(wiphy_dev(ar->hw->wiphy), &ar->leds.cdev); ++ if (ret) ++ return ret; ++ ++ return 0; ++} ++ ++void ath10k_leds_unregister(struct ath10k *ar) ++{ ++ if (ar->hw_params.led_pin == 0) ++ /* leds not supported */ ++ return; ++ ++ led_classdev_unregister(&ar->leds.cdev); ++} ++ +--- /dev/null ++++ b/drivers/net/wireless/ath/ath10k/leds.h +@@ -0,0 +1,41 @@ ++/* ++ * Copyright (c) 2018, 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 _LEDS_H_ ++#define _LEDS_H_ ++ ++#include "core.h" ++ ++#ifdef CPTCFG_ATH10K_LEDS ++void ath10k_leds_unregister(struct ath10k *ar); ++int ath10k_leds_start(struct ath10k *ar); ++int ath10k_leds_register(struct ath10k *ar); ++#else ++static inline void ath10k_leds_unregister(struct ath10k *ar) ++{ ++} ++ ++static inline int ath10k_leds_start(struct ath10k *ar) ++{ ++ return 0; ++} ++ ++static inline int ath10k_leds_register(struct ath10k *ar) ++{ ++ return 0; ++} ++ ++#endif ++#endif /* _LEDS_H_ */ +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -24,6 +24,7 @@ + #include "wmi-tlv.h" + #include "wmi-ops.h" + #include "wow.h" ++#include "leds.h" + + /*********/ + /* Rates */ +--- a/drivers/net/wireless/ath/ath10k/wmi-ops.h ++++ b/drivers/net/wireless/ath/ath10k/wmi-ops.h +@@ -226,7 +226,10 @@ struct wmi_ops { + const struct wmi_bb_timing_cfg_arg *arg); + struct sk_buff *(*gen_per_peer_per_tid_cfg)(struct ath10k *ar, + const struct wmi_per_peer_per_tid_cfg_arg *arg); ++ struct sk_buff *(*gen_gpio_config)(struct ath10k *ar, u32 gpio_num, ++ u32 input, u32 pull_type, u32 intr_mode); + ++ struct sk_buff *(*gen_gpio_output)(struct ath10k *ar, u32 gpio_num, u32 set); + }; + + int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id); +@@ -1122,6 +1125,35 @@ ath10k_wmi_force_fw_hang(struct ath10k * + return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid); + } + ++static inline int ath10k_wmi_gpio_config(struct ath10k *ar, u32 gpio_num, ++ u32 input, u32 pull_type, u32 intr_mode) ++{ ++ struct sk_buff *skb; ++ ++ if (!ar->wmi.ops->gen_gpio_config) ++ return -EOPNOTSUPP; ++ ++ skb = ar->wmi.ops->gen_gpio_config(ar, gpio_num, input, pull_type, intr_mode); ++ if (IS_ERR(skb)) ++ return PTR_ERR(skb); ++ ++ return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_config_cmdid); ++} ++ ++static inline int ath10k_wmi_gpio_output(struct ath10k *ar, u32 gpio_num, u32 set) ++{ ++ struct sk_buff *skb; ++ ++ if (!ar->wmi.ops->gen_gpio_config) ++ return -EOPNOTSUPP; ++ ++ skb = ar->wmi.ops->gen_gpio_output(ar, gpio_num, set); ++ if (IS_ERR(skb)) ++ return PTR_ERR(skb); ++ ++ return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_output_cmdid); ++} ++ + static inline int + ath10k_wmi_dbglog_cfg(struct ath10k *ar, u64 module_enable, u32 log_level) + { +--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c ++++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c +@@ -4594,6 +4594,8 @@ static const struct wmi_ops wmi_tlv_ops + .gen_echo = ath10k_wmi_tlv_op_gen_echo, + .gen_vdev_spectral_conf = ath10k_wmi_tlv_op_gen_vdev_spectral_conf, + .gen_vdev_spectral_enable = ath10k_wmi_tlv_op_gen_vdev_spectral_enable, ++ /* .gen_gpio_config not implemented */ ++ /* .gen_gpio_output not implemented */ + }; + + static const struct wmi_peer_flags_map wmi_tlv_peer_flags_map = { +--- a/drivers/net/wireless/ath/ath10k/wmi.c ++++ b/drivers/net/wireless/ath/ath10k/wmi.c +@@ -7472,6 +7472,49 @@ ath10k_wmi_op_gen_peer_set_param(struct + return skb; + } + ++static struct sk_buff *ath10k_wmi_op_gen_gpio_config(struct ath10k *ar, ++ u32 gpio_num, u32 input, ++ u32 pull_type, u32 intr_mode) ++{ ++ struct wmi_gpio_config_cmd *cmd; ++ struct sk_buff *skb; ++ ++ skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); ++ if (!skb) ++ return ERR_PTR(-ENOMEM); ++ ++ cmd = (struct wmi_gpio_config_cmd *)skb->data; ++ cmd->pull_type = __cpu_to_le32(pull_type); ++ cmd->gpio_num = __cpu_to_le32(gpio_num); ++ cmd->input = __cpu_to_le32(input); ++ cmd->intr_mode = __cpu_to_le32(intr_mode); ++ ++ ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_config gpio_num 0x%08x input 0x%08x pull_type 0x%08x intr_mode 0x%08x\n", ++ gpio_num, input, pull_type, intr_mode); ++ ++ return skb; ++} ++ ++static struct sk_buff *ath10k_wmi_op_gen_gpio_output(struct ath10k *ar, ++ u32 gpio_num, u32 set) ++{ ++ struct wmi_gpio_output_cmd *cmd; ++ struct sk_buff *skb; ++ ++ skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); ++ if (!skb) ++ return ERR_PTR(-ENOMEM); ++ ++ cmd = (struct wmi_gpio_output_cmd *)skb->data; ++ cmd->gpio_num = __cpu_to_le32(gpio_num); ++ cmd->set = __cpu_to_le32(set); ++ ++ ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_output gpio_num 0x%08x set 0x%08x\n", ++ gpio_num, set); ++ ++ return skb; ++} ++ + static struct sk_buff * + ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id, + enum wmi_sta_ps_mode psmode) +@@ -9160,6 +9203,9 @@ static const struct wmi_ops wmi_ops = { + .fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill, + .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, + .gen_echo = ath10k_wmi_op_gen_echo, ++ .gen_gpio_config = ath10k_wmi_op_gen_gpio_config, ++ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output, ++ + /* .gen_bcn_tmpl not implemented */ + /* .gen_prb_tmpl not implemented */ + /* .gen_p2p_go_bcn_ie not implemented */ +@@ -9230,6 +9276,8 @@ static const struct wmi_ops wmi_10_1_ops + .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, + .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, + .gen_echo = ath10k_wmi_op_gen_echo, ++ .gen_gpio_config = ath10k_wmi_op_gen_gpio_config, ++ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output, + /* .gen_bcn_tmpl not implemented */ + /* .gen_prb_tmpl not implemented */ + /* .gen_p2p_go_bcn_ie not implemented */ +@@ -9302,6 +9350,8 @@ static const struct wmi_ops wmi_10_2_ops + .gen_delba_send = ath10k_wmi_op_gen_delba_send, + .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, + .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, ++ .gen_gpio_config = ath10k_wmi_op_gen_gpio_config, ++ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output, + /* .gen_pdev_enable_adaptive_cca not implemented */ + }; + +@@ -9373,6 +9423,8 @@ static const struct wmi_ops wmi_10_2_4_o + ath10k_wmi_op_gen_pdev_enable_adaptive_cca, + .get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype, + .gen_bb_timing = ath10k_wmi_10_2_4_op_gen_bb_timing, ++ .gen_gpio_config = ath10k_wmi_op_gen_gpio_config, ++ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output, + /* .gen_bcn_tmpl not implemented */ + /* .gen_prb_tmpl not implemented */ + /* .gen_p2p_go_bcn_ie not implemented */ +@@ -9454,6 +9506,8 @@ static const struct wmi_ops wmi_10_4_ops + .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info, + .gen_echo = ath10k_wmi_op_gen_echo, + .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config, ++ .gen_gpio_config = ath10k_wmi_op_gen_gpio_config, ++ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output, + }; + + int ath10k_wmi_attach(struct ath10k *ar) +--- a/drivers/net/wireless/ath/ath10k/wmi.h ++++ b/drivers/net/wireless/ath/ath10k/wmi.h +@@ -3030,6 +3030,41 @@ enum wmi_10_4_feature_mask { + + }; + ++/* WMI_GPIO_CONFIG_CMDID */ ++enum { ++ WMI_GPIO_PULL_NONE, ++ WMI_GPIO_PULL_UP, ++ WMI_GPIO_PULL_DOWN, ++}; ++ ++enum { ++ WMI_GPIO_INTTYPE_DISABLE, ++ WMI_GPIO_INTTYPE_RISING_EDGE, ++ WMI_GPIO_INTTYPE_FALLING_EDGE, ++ WMI_GPIO_INTTYPE_BOTH_EDGE, ++ WMI_GPIO_INTTYPE_LEVEL_LOW, ++ WMI_GPIO_INTTYPE_LEVEL_HIGH ++}; ++ ++/* WMI_GPIO_CONFIG_CMDID */ ++struct wmi_gpio_config_cmd { ++ __le32 gpio_num; /* GPIO number to be setup */ ++ __le32 input; /* 0 - Output/ 1 - Input */ ++ __le32 pull_type; /* Pull type defined above */ ++ __le32 intr_mode; /* Interrupt mode defined above (Input) */ ++} __packed; ++ ++/* WMI_GPIO_OUTPUT_CMDID */ ++struct wmi_gpio_output_cmd { ++ __le32 gpio_num; /* GPIO number to be setup */ ++ __le32 set; /* Set the GPIO pin*/ ++} __packed; ++ ++/* WMI_GPIO_INPUT_EVENTID */ ++struct wmi_gpio_input_event { ++ __le32 gpio_num; /* GPIO number which changed state */ ++} __packed; ++ + struct wmi_ext_resource_config_10_4_cmd { + /* contains enum wmi_host_platform_type */ + __le32 host_platform_config; diff --git a/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch b/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch new file mode 100644 index 0000000000..4c1f9aa815 --- /dev/null +++ b/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch @@ -0,0 +1,53 @@ +From 79c9d7aabae1d1da9eea97d83b61e1517a8a2221 Mon Sep 17 00:00:00 2001 +From: Mathias Kresin +Date: Fri, 22 Jun 2018 18:59:44 +0200 +Subject: [PATCH] ath10k: use tpt LED trigger by default + +Use the tpt LED trigger for each created phy led. Ths way LEDs attached +to the ath10k GPIO pins are indicating the phy status and blink on +traffic. + +Signed-off-by: Mathias Kresin +--- + drivers/net/wireless/ath/ath10k/core.h | 4 ++++ + drivers/net/wireless/ath/ath10k/leds.c | 4 +--- + drivers/net/wireless/ath/ath10k/mac.c | 2 +- + 3 files changed, 6 insertions(+), 4 deletions(-) + +--- a/drivers/net/wireless/ath/ath10k/core.h ++++ b/drivers/net/wireless/ath/ath10k/core.h +@@ -1309,6 +1309,10 @@ struct ath10k { + s32 tx_power_2g_limit; + s32 tx_power_5g_limit; + ++#ifdef CPTCFG_MAC80211_LEDS ++ const char *led_default_trigger; ++#endif ++ + /* must be last */ + u8 drv_priv[] __aligned(sizeof(void *)); + }; +--- a/drivers/net/wireless/ath/ath10k/leds.c ++++ b/drivers/net/wireless/ath/ath10k/leds.c +@@ -81,9 +81,7 @@ int ath10k_leds_register(struct ath10k * + + ar->leds.cdev.name = ar->leds.label; + ar->leds.cdev.brightness_set_blocking = ath10k_leds_set_brightness_blocking; +- +- /* FIXME: this assignment doesn't make sense as it's NULL, remove it? */ +- ar->leds.cdev.default_trigger = ar->leds.wifi_led.default_trigger; ++ ar->leds.cdev.default_trigger = ar->led_default_trigger; + + ret = led_classdev_register(wiphy_dev(ar->hw->wiphy), &ar->leds.cdev); + if (ret) +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -10284,7 +10284,7 @@ int ath10k_mac_register(struct ath10k *a + ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER; + + #ifdef CPTCFG_MAC80211_LEDS +- ieee80211_create_tpt_led_trigger(ar->hw, ++ ar->led_default_trigger = ieee80211_create_tpt_led_trigger(ar->hw, + IEEE80211_TPT_LEDTRIG_FL_RADIO, ath10k_tpt_blink, + ARRAY_SIZE(ath10k_tpt_blink)); + #endif diff --git a/package/kernel/mac80211/patches/ath10k/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch b/package/kernel/mac80211/patches/ath10k/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch new file mode 100644 index 0000000000..3626debf19 --- /dev/null +++ b/package/kernel/mac80211/patches/ath10k/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch @@ -0,0 +1,101 @@ +From: Sven Eckelmann +Date: Wed, 28 Nov 2018 16:16:27 +0100 +Subject: ath10k: adjust tx power reduction for US regulatory domain + +FCC allows maximum antenna gain of 6 dBi. 15.247(b)(4): + +> (4) The conducted output power limit +> specified in paragraph (b) of this section +> is based on the use of antennas +> with directional gains that do not exceed +> 6 dBi. Except as shown in paragraph +> (c) of this section, if transmitting +> antennas of directional gain greater +> than 6 dBi are used, the conducted +> output power from the intentional radiator +> shall be reduced below the stated +> values in paragraphs (b)(1), (b)(2), +> and (b)(3) of this section, as appropriate, +> by the amount in dB that the +> directional gain of the antenna exceeds +> 6 dBi. + +https://www.gpo.gov/fdsys/pkg/CFR-2013-title47-vol1/pdf/CFR-2013-title47-vol1-sec15-247.pdf + +Signed-off-by: Sven Eckelmann + +Forwarded: no + +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -1028,6 +1028,40 @@ static inline int ath10k_vdev_setup_sync + return ar->last_wmi_vdev_start_status; + } + ++static u32 ath10k_get_max_antenna_gain(struct ath10k *ar, ++ u32 ch_max_antenna_gain) ++{ ++ u32 max_antenna_gain; ++ ++ if (ar->dfs_detector && ar->dfs_detector->region == NL80211_DFS_FCC) { ++ /* FCC allows maximum antenna gain of 6 dBi. 15.247(b)(4): ++ * ++ * > (4) The conducted output power limit ++ * > specified in paragraph (b) of this section ++ * > is based on the use of antennas ++ * > with directional gains that do not exceed ++ * > 6 dBi. Except as shown in paragraph ++ * > (c) of this section, if transmitting ++ * > antennas of directional gain greater ++ * > than 6 dBi are used, the conducted ++ * > output power from the intentional radiator ++ * > shall be reduced below the stated ++ * > values in paragraphs (b)(1), (b)(2), ++ * > and (b)(3) of this section, as appropriate, ++ * > by the amount in dB that the ++ * > directional gain of the antenna exceeds ++ * > 6 dBi. ++ * ++ * https://www.gpo.gov/fdsys/pkg/CFR-2013-title47-vol1/pdf/CFR-2013-title47-vol1-sec15-247.pdf ++ */ ++ max_antenna_gain = 6; ++ } else { ++ max_antenna_gain = 0; ++ } ++ ++ return max(ch_max_antenna_gain, max_antenna_gain); ++} ++ + static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id) + { + struct cfg80211_chan_def *chandef = NULL; +@@ -1060,7 +1094,8 @@ static int ath10k_monitor_vdev_start(str + arg.channel.min_power = 0; + arg.channel.max_power = channel->max_power * 2; + arg.channel.max_reg_power = channel->max_reg_power * 2; +- arg.channel.max_antenna_gain = channel->max_antenna_gain; ++ arg.channel.max_antenna_gain = ath10k_get_max_antenna_gain(ar, ++ channel->max_antenna_gain); + + reinit_completion(&ar->vdev_setup_done); + reinit_completion(&ar->vdev_delete_done); +@@ -1506,7 +1541,8 @@ static int ath10k_vdev_start_restart(str + arg.channel.min_power = 0; + arg.channel.max_power = chandef->chan->max_power * 2; + arg.channel.max_reg_power = chandef->chan->max_reg_power * 2; +- arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain; ++ arg.channel.max_antenna_gain = ath10k_get_max_antenna_gain(ar, ++ chandef->chan->max_antenna_gain); + + if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { + arg.ssid = arvif->u.ap.ssid; +@@ -3437,7 +3473,8 @@ static int ath10k_update_channel_list(st + ch->min_power = 0; + ch->max_power = channel->max_power * 2; + ch->max_reg_power = channel->max_reg_power * 2; +- ch->max_antenna_gain = channel->max_antenna_gain; ++ ch->max_antenna_gain = ath10k_get_max_antenna_gain(ar, ++ channel->max_antenna_gain); + ch->reg_class_id = 0; /* FIXME */ + + /* FIXME: why use only legacy modes, why not any 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..084e28a2d9 --- /dev/null +++ b/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch @@ -0,0 +1,37 @@ +From 22fb5991a44c78ff18ec0082dc90c809356eb893 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +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 +--- + drivers/net/wireless/ath/ath10k/core.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/net/wireless/ath/ath10k/core.c ++++ b/drivers/net/wireless/ath/ath10k/core.c +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -3407,6 +3408,8 @@ static int ath10k_core_probe_fw(struct a + + device_get_mac_address(ar->dev, 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", diff --git a/package/kernel/mac80211/patches/ath10k/988-ath10k-always-use-mac80211-loss-detection.patch b/package/kernel/mac80211/patches/ath10k/988-ath10k-always-use-mac80211-loss-detection.patch new file mode 100644 index 0000000000..f025fea63b --- /dev/null +++ b/package/kernel/mac80211/patches/ath10k/988-ath10k-always-use-mac80211-loss-detection.patch @@ -0,0 +1,28 @@ +From f7d6edafe4358e3880a26775cfde4cd5c71ba063 Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Wed, 5 Jul 2023 01:30:29 +0200 +Subject: [PATCH] ath10k: always use mac80211 loss detection + +ath10k does not report excessive loss in case of broken block-ack +sessions. The loss is communicated to the host-os, but ath10k does not +trigger a low-ack events by itself. + +The mac80211 framework for loss detection however detects this +circumstance well in case of ath10k. So use it regardless of ath10k's +own loss detection mechanism. + +Signed-off-by: David Bauer +--- + drivers/net/wireless/ath/ath10k/mac.c | 1 - + 1 file changed, 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -10080,7 +10080,6 @@ int ath10k_mac_register(struct ath10k *a + ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); + ieee80211_hw_set(ar->hw, QUEUE_CONTROL); + ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); +- ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); + + if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) + ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); diff --git a/package/kernel/mac80211/patches/ath10k/990-ath10k-small-buffers.patch b/package/kernel/mac80211/patches/ath10k/990-ath10k-small-buffers.patch new file mode 100644 index 0000000000..2f560c70a0 --- /dev/null +++ b/package/kernel/mac80211/patches/ath10k/990-ath10k-small-buffers.patch @@ -0,0 +1,64 @@ +--- a/drivers/net/wireless/ath/ath10k/htt.h ++++ b/drivers/net/wireless/ath/ath10k/htt.h +@@ -235,7 +235,11 @@ enum htt_rx_ring_flags { + }; + + #define HTT_RX_RING_SIZE_MIN 128 ++#ifndef CONFIG_ATH10K_SMALLBUFFERS + #define HTT_RX_RING_SIZE_MAX 2048 ++#else ++#define HTT_RX_RING_SIZE_MAX 512 ++#endif + #define HTT_RX_RING_SIZE HTT_RX_RING_SIZE_MAX + #define HTT_RX_RING_FILL_LEVEL (((HTT_RX_RING_SIZE) / 2) - 1) + #define HTT_RX_RING_FILL_LEVEL_DUAL_MAC (HTT_RX_RING_SIZE - 1) +--- a/drivers/net/wireless/ath/ath10k/pci.c ++++ b/drivers/net/wireless/ath/ath10k/pci.c +@@ -131,7 +131,11 @@ static const struct ce_attr pci_host_ce_ + .flags = CE_ATTR_FLAGS, + .src_nentries = 0, + .src_sz_max = 2048, ++#ifndef CONFIG_ATH10K_SMALLBUFFERS + .dest_nentries = 512, ++#else ++ .dest_nentries = 128, ++#endif + .recv_cb = ath10k_pci_htt_htc_rx_cb, + }, + +@@ -140,7 +144,11 @@ static const struct ce_attr pci_host_ce_ + .flags = CE_ATTR_FLAGS, + .src_nentries = 0, + .src_sz_max = 2048, ++#ifndef CONFIG_ATH10K_SMALLBUFFERS + .dest_nentries = 128, ++#else ++ .dest_nentries = 64, ++#endif + .recv_cb = ath10k_pci_htc_rx_cb, + }, + +@@ -167,7 +175,11 @@ static const struct ce_attr pci_host_ce_ + .flags = CE_ATTR_FLAGS, + .src_nentries = 0, + .src_sz_max = 512, ++#ifndef CONFIG_ATH10K_SMALLBUFFERS + .dest_nentries = 512, ++#else ++ .dest_nentries = 128, ++#endif + .recv_cb = ath10k_pci_htt_rx_cb, + }, + +@@ -192,7 +204,11 @@ static const struct ce_attr pci_host_ce_ + .flags = CE_ATTR_FLAGS, + .src_nentries = 0, + .src_sz_max = 2048, ++#ifndef CONFIG_ATH10K_SMALLBUFFERS + .dest_nentries = 128, ++#else ++ .dest_nentries = 96, ++#endif + .recv_cb = ath10k_pci_pktlog_rx_cb, + }, + diff --git a/package/kernel/mac80211/patches/ath11k/0001-wifi-ath11k-stop-tx-queues-immediately-upon-firmware.patch b/package/kernel/mac80211/patches/ath11k/0001-wifi-ath11k-stop-tx-queues-immediately-upon-firmware.patch new file mode 100644 index 0000000000..d0dc04febf --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0001-wifi-ath11k-stop-tx-queues-immediately-upon-firmware.patch @@ -0,0 +1,78 @@ +From 81e60b2dfb2744ab6642c4aa62534b4f711fdc5d Mon Sep 17 00:00:00 2001 +From: Aditya Kumar Singh +Date: Tue, 27 Sep 2022 09:18:54 +0300 +Subject: [PATCH] wifi: ath11k: stop tx queues immediately upon firmware exit + +Currently, recovery flag is set immediately upon firmware +exit but tx queues are stopped once firmware arrives back +and is ready which is during ath11k_core_restart. Once +ieee80211 hw restart is completed, tx queues are resumed. +If during the time delta between firmware exit and firmware +ready, mac80211 send packets, currently ath11k will drop it +since recovery flag will be set. But warning prints will +come - + "ath11k c000000.wifi: failed to transmit frame -108" + +If more tx packets are there, this could lead to flooding +of above print. + +However, actually tx queues should be stopped immediately +when firmware leaves. This will prevent packets to get +dropped when firmware is recovering. + +Add fix to stop tx queues immediately after firmware exit. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Aditya Kumar Singh +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220923170235.18873-1-quic_adisi@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 5 +---- + drivers/net/wireless/ath/ath11k/core.h | 1 + + drivers/net/wireless/ath/ath11k/qmi.c | 3 +++ + 3 files changed, 5 insertions(+), 4 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -1641,7 +1641,7 @@ static void ath11k_update_11d(struct wor + } + } + +-static void ath11k_core_pre_reconfigure_recovery(struct ath11k_base *ab) ++void ath11k_core_pre_reconfigure_recovery(struct ath11k_base *ab) + { + struct ath11k *ar; + struct ath11k_pdev *pdev; +@@ -1730,9 +1730,6 @@ static void ath11k_core_restart(struct w + struct ath11k_base *ab = container_of(work, struct ath11k_base, restart_work); + int ret; + +- if (!ab->is_reset) +- ath11k_core_pre_reconfigure_recovery(ab); +- + ret = ath11k_core_reconfigure_on_crash(ab); + if (ret) { + ath11k_err(ab, "failed to reconfigure driver on crash recovery\n"); +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -1158,6 +1158,7 @@ int ath11k_core_check_smbios(struct ath1 + void ath11k_core_halt(struct ath11k *ar); + int ath11k_core_resume(struct ath11k_base *ab); + int ath11k_core_suspend(struct ath11k_base *ab); ++void ath11k_core_pre_reconfigure_recovery(struct ath11k_base *ab); + + const struct firmware *ath11k_core_firmware_request(struct ath11k_base *ab, + const char *filename); +--- a/drivers/net/wireless/ath/ath11k/qmi.c ++++ b/drivers/net/wireless/ath/ath11k/qmi.c +@@ -3164,6 +3164,9 @@ static void ath11k_qmi_driver_event_work + case ATH11K_QMI_EVENT_SERVER_EXIT: + set_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags); + set_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags); ++ ++ if (!ab->is_reset) ++ ath11k_core_pre_reconfigure_recovery(ab); + break; + case ATH11K_QMI_EVENT_REQUEST_MEM: + ret = ath11k_qmi_event_mem_request(qmi); diff --git a/package/kernel/mac80211/patches/ath11k/0002-wifi-ath11k-Don-t-exit-on-wakeup-failure.patch b/package/kernel/mac80211/patches/ath11k/0002-wifi-ath11k-Don-t-exit-on-wakeup-failure.patch new file mode 100644 index 0000000000..47385e0458 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0002-wifi-ath11k-Don-t-exit-on-wakeup-failure.patch @@ -0,0 +1,45 @@ +From 45d2e268369b0c768d5a644f319758bcfd370521 Mon Sep 17 00:00:00 2001 +From: Baochen Qiang +Date: Wed, 28 Sep 2022 09:51:40 +0800 +Subject: [PATCH] wifi: ath11k: Don't exit on wakeup failure + +Currently, ath11k_pcic_read() returns an error if wakeup() +fails, this makes firmware crash debug quite hard because we can +get nothing. + +Change to go ahead on wakeup failure, in that case we still may +get something valid to check. There should be no mislead due +to incorrect content because we are aware of the failure with the +log printed. + +Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1 + +Signed-off-by: Baochen Qiang +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220928015140.5431-1-quic_bqiang@quicinc.com +--- + drivers/net/wireless/ath/ath11k/pcic.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/pcic.c ++++ b/drivers/net/wireless/ath/ath11k/pcic.c +@@ -218,9 +218,16 @@ int ath11k_pcic_read(struct ath11k_base + if (wakeup_required && ab->pci.ops->wakeup) { + ret = ab->pci.ops->wakeup(ab); + if (ret) { +- ath11k_warn(ab, "failed to wakeup for read from 0x%x: %d\n", +- start, ret); +- return ret; ++ ath11k_warn(ab, ++ "wakeup failed, data may be invalid: %d", ++ ret); ++ /* Even though wakeup() failed, continue processing rather ++ * than returning because some parts of the data may still ++ * be valid and useful in some cases, e.g. could give us ++ * some clues on firmware crash. ++ * Mislead due to invalid data could be avoided because we ++ * are aware of the wakeup failure. ++ */ + } + } + diff --git a/package/kernel/mac80211/patches/ath11k/0005-wifi-ath11k-Fix-spelling-mistake-chnange-change.patch b/package/kernel/mac80211/patches/ath11k/0005-wifi-ath11k-Fix-spelling-mistake-chnange-change.patch new file mode 100644 index 0000000000..4b52252ef3 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0005-wifi-ath11k-Fix-spelling-mistake-chnange-change.patch @@ -0,0 +1,25 @@ +From a797f479bf3e02c6d179c2e6aeace7f9b22b0acd Mon Sep 17 00:00:00 2001 +From: Colin Ian King +Date: Wed, 28 Sep 2022 15:38:34 +0100 +Subject: [PATCH] wifi: ath11k: Fix spelling mistake "chnange" -> "change" + +There is a spelling mistake in an ath11k_dbg debug message. Fix it. + +Signed-off-by: Colin Ian King +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220928143834.35189-1-colin.i.king@gmail.com +--- + drivers/net/wireless/ath/ath11k/wmi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -6829,7 +6829,7 @@ static void ath11k_wmi_event_peer_sta_ps + } + + ath11k_dbg(ab, ATH11K_DBG_WMI, +- "peer sta ps chnange ev addr %pM state %u sup_bitmap %x ps_valid %u ts %u\n", ++ "peer sta ps change ev addr %pM state %u sup_bitmap %x ps_valid %u ts %u\n", + ev->peer_macaddr.addr, ev->peer_ps_state, + ev->ps_supported_bitmap, ev->peer_ps_valid, + ev->peer_ps_timestamp); diff --git a/package/kernel/mac80211/patches/ath11k/0007-wifi-ath11k-suppress-add-interface-error.patch b/package/kernel/mac80211/patches/ath11k/0007-wifi-ath11k-suppress-add-interface-error.patch new file mode 100644 index 0000000000..fbef0abb8d --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0007-wifi-ath11k-suppress-add-interface-error.patch @@ -0,0 +1,52 @@ +From 638b26652b0438563a76ec90014c8cba34db982b Mon Sep 17 00:00:00 2001 +From: Karthikeyan Periyasamy +Date: Thu, 6 Oct 2022 06:28:42 +0530 +Subject: [PATCH 7/9] wifi: ath11k: suppress add interface error + +In the VIF (other than monitor type) creation request, we should not +throw the error code when the monitor VIF creation fails, since the +actual VIF creation succeeds. If we throw the error code from driver +then the actual VIF creation get fail. So suppress the monitor VIF +creation error by throwing warning message instead of error code. + +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.6.0.1-00760-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Karthikeyan Periyasamy +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221006005842.8599-1-quic_periyasa@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -6421,18 +6421,16 @@ static int ath11k_mac_op_add_interface(s + + ath11k_dp_vdev_tx_attach(ar, arvif); + ++ ath11k_debugfs_add_interface(arvif); ++ + if (vif->type != NL80211_IFTYPE_MONITOR && + test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) { + ret = ath11k_mac_monitor_vdev_create(ar); +- if (ret) { ++ if (ret) + ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d", + ret); +- goto err_peer_del; +- } + } + +- ath11k_debugfs_add_interface(arvif); +- + mutex_unlock(&ar->conf_mutex); + + return 0; +@@ -6457,7 +6455,6 @@ err_vdev_del: + spin_unlock_bh(&ar->data_lock); + + err: +- ath11k_debugfs_remove_interface(arvif); + mutex_unlock(&ar->conf_mutex); + + return ret; diff --git a/package/kernel/mac80211/patches/ath11k/0008-wifi-ath11k-add-support-to-configure-channel-dwell-t.patch b/package/kernel/mac80211/patches/ath11k/0008-wifi-ath11k-add-support-to-configure-channel-dwell-t.patch new file mode 100644 index 0000000000..d0b19fe59f --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0008-wifi-ath11k-add-support-to-configure-channel-dwell-t.patch @@ -0,0 +1,102 @@ +From c362daa213cdeb0a9e7c2ed84849544c24505720 Mon Sep 17 00:00:00 2001 +From: Manikanta Pubbisetty +Date: Fri, 7 Oct 2022 10:41:30 +0530 +Subject: [PATCH 8/9] wifi: ath11k: add support to configure channel dwell time + +Add support to configure channel dwell time during scan. +Dwell time help to stay on the channel for a specified duration +during scan and aid userspace in finding WiFi networks. Very +useful in passive scans where longer dwell times are needed +to find the WiFi networks. + +Configure channel dwell time from duration of the scan request +received from mac80211 when the duration is non-zero. When the +scan request does not have duration value, use the default ones, +the current implementation. + +Advertise corresponding feature flag NL80211_EXT_FEATURE_SET_SCAN_DWELL +to enable the feature. + +Change is applicable for all ath11k hardware. + +Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 + +Signed-off-by: Manikanta Pubbisetty +Reviewed-by: Jeff Johnson +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221007051130.6067-1-quic_mpubbise@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 33 +++++++++++++++++++++++---- + 1 file changed, 29 insertions(+), 4 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -241,7 +241,10 @@ const struct htt_rx_ring_tlv_filter ath1 + #define ath11k_a_rates (ath11k_legacy_rates + 4) + #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4) + +-#define ATH11K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */ ++#define ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD 200 /* in msecs */ ++ ++/* Overhead due to the processing of channel switch events from FW */ ++#define ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD 10 /* in msecs */ + + static const u32 ath11k_smps_map[] = { + [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC, +@@ -3612,6 +3615,7 @@ static int ath11k_mac_op_hw_scan(struct + struct scan_req_params arg; + int ret = 0; + int i; ++ u32 scan_timeout; + + mutex_lock(&ar->conf_mutex); + +@@ -3681,6 +3685,26 @@ static int ath11k_mac_op_hw_scan(struct + ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask); + } + ++ /* if duration is set, default dwell times will be overwritten */ ++ if (req->duration) { ++ arg.dwell_time_active = req->duration; ++ arg.dwell_time_active_2g = req->duration; ++ arg.dwell_time_active_6g = req->duration; ++ arg.dwell_time_passive = req->duration; ++ arg.dwell_time_passive_6g = req->duration; ++ arg.burst_duration = req->duration; ++ ++ scan_timeout = min_t(u32, arg.max_rest_time * ++ (arg.num_chan - 1) + (req->duration + ++ ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) * ++ arg.num_chan, arg.max_scan_time); ++ } else { ++ scan_timeout = arg.max_scan_time; ++ } ++ ++ /* Add a margin to account for event/command processing */ ++ scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD; ++ + ret = ath11k_start_scan(ar, &arg); + if (ret) { + ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret); +@@ -3689,10 +3713,8 @@ static int ath11k_mac_op_hw_scan(struct + spin_unlock_bh(&ar->data_lock); + } + +- /* Add a 200ms margin to account for event/command processing */ + ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, +- msecs_to_jiffies(arg.max_scan_time + +- ATH11K_MAC_SCAN_TIMEOUT_MSECS)); ++ msecs_to_jiffies(scan_timeout)); + + exit: + kfree(arg.chan_list); +@@ -9060,6 +9082,9 @@ static int __ath11k_mac_register(struct + NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP); + } + ++ wiphy_ext_feature_set(ar->hw->wiphy, ++ NL80211_EXT_FEATURE_SET_SCAN_DWELL); ++ + ath11k_reg_init(ar); + + if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) { diff --git a/package/kernel/mac80211/patches/ath11k/0010-wifi-ath11k-Fix-firmware-crash-on-vdev-delete-race-c.patch b/package/kernel/mac80211/patches/ath11k/0010-wifi-ath11k-Fix-firmware-crash-on-vdev-delete-race-c.patch new file mode 100644 index 0000000000..7275af06ea --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0010-wifi-ath11k-Fix-firmware-crash-on-vdev-delete-race-c.patch @@ -0,0 +1,116 @@ +From 3811fa1f231f1a3e29759efef4992116604aab8b Mon Sep 17 00:00:00 2001 +From: Sowmiya Sree Elavalagan +Date: Tue, 11 Oct 2022 15:23:46 +0530 +Subject: [PATCH] wifi: ath11k: Fix firmware crash on vdev delete race + condition + +Current code does not wait for vdev delete completion on vdev create +failures and tries to send another vdev create followed by vdev set +param to firmware with same vdev id. This causes firmware crash. +Fix this crash by waiting for vdev delete completion on vdev +create failures. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.6.0.1-00905-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sowmiya Sree Elavalagan +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221011095346.3901-1-quic_ssreeela@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 60 +++++++++++++++++---------- + 1 file changed, 37 insertions(+), 23 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -6233,6 +6233,40 @@ void ath11k_mac_11d_scan_stop_all(struct + } + } + ++static int ath11k_mac_vdev_delete(struct ath11k *ar, struct ath11k_vif *arvif) ++{ ++ unsigned long time_left; ++ struct ieee80211_vif *vif = arvif->vif; ++ int ret = 0; ++ ++ lockdep_assert_held(&ar->conf_mutex); ++ ++ reinit_completion(&ar->vdev_delete_done); ++ ++ ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id); ++ if (ret) { ++ ath11k_warn(ar->ab, "failed to delete WMI vdev %d: %d\n", ++ arvif->vdev_id, ret); ++ return ret; ++ } ++ ++ time_left = wait_for_completion_timeout(&ar->vdev_delete_done, ++ ATH11K_VDEV_DELETE_TIMEOUT_HZ); ++ if (time_left == 0) { ++ ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); ++ return -ETIMEDOUT; ++ } ++ ++ ar->ab->free_vdev_map |= 1LL << (arvif->vdev_id); ++ ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); ++ ar->num_created_vdevs--; ++ ++ ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n", ++ vif->addr, arvif->vdev_id); ++ ++ return ret; ++} ++ + static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw, + struct ieee80211_vif *vif) + { +@@ -6468,10 +6502,7 @@ err_peer_del: + } + + err_vdev_del: +- ath11k_wmi_vdev_delete(ar, arvif->vdev_id); +- ar->num_created_vdevs--; +- ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); +- ab->free_vdev_map |= 1LL << arvif->vdev_id; ++ ath11k_mac_vdev_delete(ar, arvif); + spin_lock_bh(&ar->data_lock); + list_del(&arvif->list); + spin_unlock_bh(&ar->data_lock); +@@ -6499,7 +6530,6 @@ static void ath11k_mac_op_remove_interfa + struct ath11k *ar = hw->priv; + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); + struct ath11k_base *ab = ar->ab; +- unsigned long time_left; + int ret; + int i; + +@@ -6520,29 +6550,13 @@ static void ath11k_mac_op_remove_interfa + arvif->vdev_id, ret); + } + +- reinit_completion(&ar->vdev_delete_done); +- +- ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id); ++ ret = ath11k_mac_vdev_delete(ar, arvif); + if (ret) { +- ath11k_warn(ab, "failed to delete WMI vdev %d: %d\n", ++ ath11k_warn(ab, "failed to delete vdev %d: %d\n", + arvif->vdev_id, ret); + goto err_vdev_del; + } + +- time_left = wait_for_completion_timeout(&ar->vdev_delete_done, +- ATH11K_VDEV_DELETE_TIMEOUT_HZ); +- if (time_left == 0) { +- ath11k_warn(ab, "Timeout in receiving vdev delete response\n"); +- goto err_vdev_del; +- } +- +- ab->free_vdev_map |= 1LL << (arvif->vdev_id); +- ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); +- ar->num_created_vdevs--; +- +- ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n", +- vif->addr, arvif->vdev_id); +- + if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { + clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); + ar->monitor_vdev_id = -1; diff --git a/package/kernel/mac80211/patches/ath11k/0011-wifi-ath11k-fix-monitor-vdev-creation-with-firmware-.patch b/package/kernel/mac80211/patches/ath11k/0011-wifi-ath11k-fix-monitor-vdev-creation-with-firmware-.patch new file mode 100644 index 0000000000..2f066d0a56 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0011-wifi-ath11k-fix-monitor-vdev-creation-with-firmware-.patch @@ -0,0 +1,40 @@ +From f3ca72b0327101a074a871539e61775d43908ca4 Mon Sep 17 00:00:00 2001 +From: Nagarajan Maran +Date: Fri, 14 Oct 2022 21:20:54 +0530 +Subject: [PATCH] wifi: ath11k: fix monitor vdev creation with firmware + recovery + +During firmware recovery, the monitor interface is not +getting created in the driver and firmware since +the respective flags are not updated properly. + +So after firmware recovery is successful, when monitor +interface is brought down manually, firmware assertion +is observed, since we are trying to bring down the +interface which is not yet created in the firmware. + +Fix this by updating the monitor flags properly per +phy#, during firmware recovery. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Nagarajan Maran +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221014155054.11471-1-quic_nmaran@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -1677,6 +1677,10 @@ void ath11k_core_pre_reconfigure_recover + ath11k_mac_tx_mgmt_pending_free, ar); + idr_destroy(&ar->txmgmt_idr); + wake_up(&ar->txmgmt_empty_waitq); ++ ++ ar->monitor_vdev_id = -1; ++ clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags); ++ clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); + } + + wake_up(&ab->wmi_ab.tx_credits_wq); diff --git a/package/kernel/mac80211/patches/ath11k/0012-wifi-ath11k-Fix-qmi_msg_handler-data-structure-initi.patch b/package/kernel/mac80211/patches/ath11k/0012-wifi-ath11k-Fix-qmi_msg_handler-data-structure-initi.patch new file mode 100644 index 0000000000..fccfa4385a --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0012-wifi-ath11k-Fix-qmi_msg_handler-data-structure-initi.patch @@ -0,0 +1,33 @@ +From ed3725e15a154ebebf44e0c34806c57525483f92 Mon Sep 17 00:00:00 2001 +From: Rahul Bhattacharjee +Date: Fri, 21 Oct 2022 14:31:26 +0530 +Subject: [PATCH] wifi: ath11k: Fix qmi_msg_handler data structure + initialization + +qmi_msg_handler is required to be null terminated by QMI module. +There might be a case where a handler for a msg id is not present in the +handlers array which can lead to infinite loop while searching the handler +and therefore out of bound access in qmi_invoke_handler(). +Hence update the initialization in qmi_msg_handler data structure. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Rahul Bhattacharjee +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221021090126.28626-1-quic_rbhattac@quicinc.com +--- + drivers/net/wireless/ath/ath11k/qmi.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/qmi.c ++++ b/drivers/net/wireless/ath/ath11k/qmi.c +@@ -1702,6 +1702,9 @@ static struct qmi_elem_info qmi_wlfw_fw_ + .data_type = QMI_EOTI, + .array_type = NO_ARRAY, + }, ++ ++ /* end of list */ ++ {}, + }; + + static int ath11k_qmi_host_cap_send(struct ath11k_base *ab) diff --git a/package/kernel/mac80211/patches/ath11k/0013-wifi-ath11k-synchronize-ath11k_mac_he_gi_to_nl80211_.patch b/package/kernel/mac80211/patches/ath11k/0013-wifi-ath11k-synchronize-ath11k_mac_he_gi_to_nl80211_.patch new file mode 100644 index 0000000000..1e89b4d4f2 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0013-wifi-ath11k-synchronize-ath11k_mac_he_gi_to_nl80211_.patch @@ -0,0 +1,42 @@ +From dd1c2322694522f674c874f5fa02ac5ae39135dd Mon Sep 17 00:00:00 2001 +From: "Jiri Slaby (SUSE)" +Date: Mon, 31 Oct 2022 12:43:41 +0100 +Subject: [PATCH] wifi: ath11k: synchronize + ath11k_mac_he_gi_to_nl80211_he_gi()'s return type + +ath11k_mac_he_gi_to_nl80211_he_gi() generates a valid warning with gcc-13: + drivers/net/wireless/ath/ath11k/mac.c:321:20: error: conflicting types for 'ath11k_mac_he_gi_to_nl80211_he_gi' due to enum/integer mismatch; have 'enum nl80211_he_gi(u8)' + drivers/net/wireless/ath/ath11k/mac.h:166:5: note: previous declaration of 'ath11k_mac_he_gi_to_nl80211_he_gi' with type 'u32(u8)' + +I.e. the type of the return value ath11k_mac_he_gi_to_nl80211_he_gi() in +the declaration is u32, while the definition spells enum nl80211_he_gi. +Synchronize them to the latter. + +Cc: Martin Liska +Cc: Kalle Valo +Cc: "David S. Miller" +Cc: Eric Dumazet +Cc: Jakub Kicinski +Cc: Paolo Abeni +Cc: ath11k@lists.infradead.org +Cc: linux-wireless@vger.kernel.org +Cc: netdev@vger.kernel.org +Signed-off-by: Jiri Slaby (SUSE) +Reviewed-by: Jeff Johnson +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221031114341.10377-1-jirislaby@kernel.org +--- + drivers/net/wireless/ath/ath11k/mac.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.h ++++ b/drivers/net/wireless/ath/ath11k/mac.h +@@ -163,7 +163,7 @@ void ath11k_mac_drain_tx(struct ath11k * + void ath11k_mac_peer_cleanup_all(struct ath11k *ar); + int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx); + u8 ath11k_mac_bw_to_mac80211_bw(u8 bw); +-u32 ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi); ++enum nl80211_he_gi ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi); + enum nl80211_he_ru_alloc ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc(u16 ru_phy); + enum nl80211_he_ru_alloc ath11k_mac_he_ru_tones_to_nl80211_he_ru_alloc(u16 ru_tones); + enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw); diff --git a/package/kernel/mac80211/patches/ath11k/0016-wifi-ath11k-Make-QMI-message-rules-const.patch b/package/kernel/mac80211/patches/ath11k/0016-wifi-ath11k-Make-QMI-message-rules-const.patch new file mode 100644 index 0000000000..1f48df73f7 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0016-wifi-ath11k-Make-QMI-message-rules-const.patch @@ -0,0 +1,341 @@ +From 93c1592889fca46d09d833455628bab05516cdbf Mon Sep 17 00:00:00 2001 +From: Jeff Johnson +Date: Wed, 14 Sep 2022 17:23:03 -0700 +Subject: [PATCH] wifi: ath11k: Make QMI message rules const + +Commit ff6d365898d4 ("soc: qcom: qmi: use const for struct +qmi_elem_info") allows QMI message encoding/decoding rules to be +const, so do that for ath11k. + +Compile tested only. + +Signed-off-by: Jeff Johnson +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220915002303.12206-1-quic_jjohnson@quicinc.com +--- + drivers/net/wireless/ath/ath11k/qmi.c | 72 +++++++++++++-------------- + 1 file changed, 36 insertions(+), 36 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/qmi.c ++++ b/drivers/net/wireless/ath/ath11k/qmi.c +@@ -29,7 +29,7 @@ module_param_named(cold_boot_cal, ath11k + MODULE_PARM_DESC(cold_boot_cal, + "Decrease the channel switch time but increase the driver load time (Default: true)"); + +-static struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = { + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, +@@ -280,7 +280,7 @@ static struct qmi_elem_info qmi_wlanfw_h + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, +@@ -297,7 +297,7 @@ static struct qmi_elem_info qmi_wlanfw_h + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = { + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, +@@ -522,7 +522,7 @@ static struct qmi_elem_info qmi_wlanfw_i + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, +@@ -558,7 +558,7 @@ static struct qmi_elem_info qmi_wlanfw_i + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_8_BYTE, + .elem_len = 1, +@@ -590,7 +590,7 @@ static struct qmi_elem_info qmi_wlanfw_m + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, +@@ -632,7 +632,7 @@ static struct qmi_elem_info qmi_wlanfw_m + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = { + { + .data_type = QMI_DATA_LEN, + .elem_len = 1, +@@ -659,7 +659,7 @@ static struct qmi_elem_info qmi_wlanfw_r + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_8_BYTE, + .elem_len = 1, +@@ -699,7 +699,7 @@ static struct qmi_elem_info qmi_wlanfw_m + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = { + { + .data_type = QMI_DATA_LEN, + .elem_len = 1, +@@ -726,7 +726,7 @@ static struct qmi_elem_info qmi_wlanfw_r + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, +@@ -744,7 +744,7 @@ static struct qmi_elem_info qmi_wlanfw_r + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = { + { + .data_type = QMI_EOTI, + .array_type = NO_ARRAY, +@@ -752,7 +752,7 @@ static struct qmi_elem_info qmi_wlanfw_c + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_device_info_req_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_device_info_req_msg_v01_ei[] = { + { + .data_type = QMI_EOTI, + .array_type = NO_ARRAY, +@@ -760,7 +760,7 @@ static struct qmi_elem_info qmi_wlanfw_d + }, + }; + +-static struct qmi_elem_info qmi_wlfw_device_info_resp_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlfw_device_info_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, +@@ -814,7 +814,7 @@ static struct qmi_elem_info qmi_wlfw_dev + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, +@@ -840,7 +840,7 @@ static struct qmi_elem_info qmi_wlanfw_r + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, +@@ -857,7 +857,7 @@ static struct qmi_elem_info qmi_wlanfw_r + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, +@@ -873,7 +873,7 @@ static struct qmi_elem_info qmi_wlanfw_s + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, +@@ -899,7 +899,7 @@ static struct qmi_elem_info qmi_wlanfw_f + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, +@@ -1100,7 +1100,7 @@ static struct qmi_elem_info qmi_wlanfw_c + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, +@@ -1235,7 +1235,7 @@ static struct qmi_elem_info qmi_wlanfw_b + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, +@@ -1253,7 +1253,7 @@ static struct qmi_elem_info qmi_wlanfw_b + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_8_BYTE, + .elem_len = 1, +@@ -1277,7 +1277,7 @@ static struct qmi_elem_info qmi_wlanfw_m + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, +@@ -1294,7 +1294,7 @@ static struct qmi_elem_info qmi_wlanfw_m + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, +@@ -1347,7 +1347,7 @@ static struct qmi_elem_info qmi_wlanfw_c + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, +@@ -1382,7 +1382,7 @@ static struct qmi_elem_info qmi_wlanfw_c + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_2_BYTE, + .elem_len = 1, +@@ -1406,7 +1406,7 @@ static struct qmi_elem_info qmi_wlanfw_s + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, +@@ -1423,7 +1423,7 @@ static struct qmi_elem_info qmi_wlanfw_s + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, +@@ -1458,7 +1458,7 @@ static struct qmi_elem_info qmi_wlanfw_w + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, +@@ -1476,7 +1476,7 @@ static struct qmi_elem_info qmi_wlanfw_w + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = { + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, +@@ -1615,7 +1615,7 @@ static struct qmi_elem_info qmi_wlanfw_w + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, +@@ -1632,28 +1632,28 @@ static struct qmi_elem_info qmi_wlanfw_w + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = { + { + .data_type = QMI_EOTI, + .array_type = NO_ARRAY, + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = { + { + .data_type = QMI_EOTI, + .array_type = NO_ARRAY, + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei[] = { + { + .data_type = QMI_EOTI, + .array_type = NO_ARRAY, + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_wlan_ini_req_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_wlan_ini_req_msg_v01_ei[] = { + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, +@@ -1679,7 +1679,7 @@ static struct qmi_elem_info qmi_wlanfw_w + }, + }; + +-static struct qmi_elem_info qmi_wlanfw_wlan_ini_resp_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlanfw_wlan_ini_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, +@@ -1697,7 +1697,7 @@ static struct qmi_elem_info qmi_wlanfw_w + }, + }; + +-static struct qmi_elem_info qmi_wlfw_fw_init_done_ind_msg_v01_ei[] = { ++static const struct qmi_elem_info qmi_wlfw_fw_init_done_ind_msg_v01_ei[] = { + { + .data_type = QMI_EOTI, + .array_type = NO_ARRAY, diff --git a/package/kernel/mac80211/patches/ath11k/0017-wifi-ath11k-Trigger-sta-disconnect-on-hardware-resta.patch b/package/kernel/mac80211/patches/ath11k/0017-wifi-ath11k-Trigger-sta-disconnect-on-hardware-resta.patch new file mode 100644 index 0000000000..f95e5027b2 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0017-wifi-ath11k-Trigger-sta-disconnect-on-hardware-resta.patch @@ -0,0 +1,119 @@ +From a018750a2cceaf4427c4ee3d9ce3e83a171d5bd6 Mon Sep 17 00:00:00 2001 +From: Youghandhar Chintala +Date: Fri, 4 Nov 2022 14:24:03 +0530 +Subject: [PATCH] wifi: ath11k: Trigger sta disconnect on hardware restart + +Currently after the hardware restart triggered from the driver, the +station interface connection remains intact, since a disconnect trigger +is not sent to userspace. This can lead to a problem in targets where +the wifi mac sequence is added by the firmware. + +After the target restart, its wifi mac sequence number gets reset to +zero. Hence AP to which our device is connected will receive frames with +a wifi mac sequence number jump to the past, thereby resulting in the +AP dropping all these frames, until the frame arrives with a wifi mac +sequence number which AP was expecting. + +To avoid such frame drops, its better to trigger a station disconnect +upon target hardware restart which can be done with API +ieee80211_reconfig_disconnect exposed to mac80211. + +The other targets are not affected by this change, since the hardware +params flag is not set. + +Reported-by: kernel test robot + +Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 + +Signed-off-by: Youghandhar Chintala +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221104085403.11025-1-quic_youghand@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 6 ++++++ + drivers/net/wireless/ath/ath11k/hw.h | 1 + + drivers/net/wireless/ath/ath11k/mac.c | 7 +++++++ + 3 files changed, 14 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -195,6 +195,7 @@ static const struct ath11k_hw_params ath + .tcl_ring_retry = true, + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, ++ .support_fw_mac_sequence = false, + }, + { + .name = "qca6390 hw2.0", +@@ -277,6 +278,7 @@ static const struct ath11k_hw_params ath + .tcl_ring_retry = true, + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, ++ .support_fw_mac_sequence = true, + }, + { + .name = "qcn9074 hw1.0", +@@ -356,6 +358,7 @@ static const struct ath11k_hw_params ath + .tcl_ring_retry = true, + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, ++ .support_fw_mac_sequence = false, + }, + { + .name = "wcn6855 hw2.0", +@@ -438,6 +441,7 @@ static const struct ath11k_hw_params ath + .tcl_ring_retry = true, + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, ++ .support_fw_mac_sequence = true, + }, + { + .name = "wcn6855 hw2.1", +@@ -519,6 +523,7 @@ static const struct ath11k_hw_params ath + .tcl_ring_retry = true, + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, ++ .support_fw_mac_sequence = true, + }, + { + .name = "wcn6750 hw1.0", +@@ -597,6 +602,7 @@ static const struct ath11k_hw_params ath + .tcl_ring_retry = false, + .tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750, + .smp2p_wow_exit = true, ++ .support_fw_mac_sequence = true, + }, + }; + +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -219,6 +219,7 @@ struct ath11k_hw_params { + bool tcl_ring_retry; + u32 tx_ring_size; + bool smp2p_wow_exit; ++ bool support_fw_mac_sequence; + }; + + struct ath11k_hw_ops { +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -8010,6 +8010,7 @@ ath11k_mac_op_reconfig_complete(struct i + struct ath11k *ar = hw->priv; + struct ath11k_base *ab = ar->ab; + int recovery_count; ++ struct ath11k_vif *arvif; + + if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART) + return; +@@ -8045,6 +8046,12 @@ ath11k_mac_op_reconfig_complete(struct i + ath11k_dbg(ab, ATH11K_DBG_BOOT, "reset success\n"); + } + } ++ if (ar->ab->hw_params.support_fw_mac_sequence) { ++ list_for_each_entry(arvif, &ar->arvifs, list) { ++ if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA) ++ ieee80211_hw_restart_disconnect(arvif->vif); ++ } ++ } + } + + mutex_unlock(&ar->conf_mutex); diff --git a/package/kernel/mac80211/patches/ath11k/0018-wifi-ath11k-Fix-race-condition-with-struct-htt_ppdu_.patch b/package/kernel/mac80211/patches/ath11k/0018-wifi-ath11k-Fix-race-condition-with-struct-htt_ppdu_.patch new file mode 100644 index 0000000000..cef61ee344 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0018-wifi-ath11k-Fix-race-condition-with-struct-htt_ppdu_.patch @@ -0,0 +1,103 @@ +From e44de90453bb2b46a523df78c39eb896bab35dcd Mon Sep 17 00:00:00 2001 +From: Govindaraj Saminathan +Date: Tue, 29 Nov 2022 13:04:02 +0200 +Subject: [PATCH] wifi: ath11k: Fix race condition with struct + htt_ppdu_stats_info + +A crash happens when running the traffic with multiple clients: + +Crash Signature : Unable to handle kernel paging request at +virtual address ffffffd700970918 During the crash, PC points to +"ieee80211_tx_rate_update+0x30/0x68 [mac80211]" +LR points to "ath11k_dp_htt_htc_t2h_msg_handler+0x5a8/0x8a0 [ath11k]". + +Struct ppdu_stats_info is allocated and accessed from event callback via copy +engine tasklet, this has a problem when freeing it from ath11k_mac_op_stop(). + +Use data_lock during entire ath11k_dp_htt_get_ppdu_desc() call to protect +struct htt_ppdu_stats_info access and to avoid race condition when accessing it +from ath11k_mac_op_stop(). + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Govindaraj Saminathan +Co-developed-by: Karthikeyan Kathirvel +Signed-off-by: Karthikeyan Kathirvel +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221124071104.22506-1-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/dp_rx.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/dp_rx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c +@@ -1535,13 +1535,12 @@ struct htt_ppdu_stats_info *ath11k_dp_ht + { + struct htt_ppdu_stats_info *ppdu_info; + +- spin_lock_bh(&ar->data_lock); ++ lockdep_assert_held(&ar->data_lock); ++ + if (!list_empty(&ar->ppdu_stats_info)) { + list_for_each_entry(ppdu_info, &ar->ppdu_stats_info, list) { +- if (ppdu_info->ppdu_id == ppdu_id) { +- spin_unlock_bh(&ar->data_lock); ++ if (ppdu_info->ppdu_id == ppdu_id) + return ppdu_info; +- } + } + + if (ar->ppdu_stat_list_depth > HTT_PPDU_DESC_MAX_DEPTH) { +@@ -1553,16 +1552,13 @@ struct htt_ppdu_stats_info *ath11k_dp_ht + kfree(ppdu_info); + } + } +- spin_unlock_bh(&ar->data_lock); + + ppdu_info = kzalloc(sizeof(*ppdu_info), GFP_ATOMIC); + if (!ppdu_info) + return NULL; + +- spin_lock_bh(&ar->data_lock); + list_add_tail(&ppdu_info->list, &ar->ppdu_stats_info); + ar->ppdu_stat_list_depth++; +- spin_unlock_bh(&ar->data_lock); + + return ppdu_info; + } +@@ -1586,16 +1582,17 @@ static int ath11k_htt_pull_ppdu_stats(st + ar = ath11k_mac_get_ar_by_pdev_id(ab, pdev_id); + if (!ar) { + ret = -EINVAL; +- goto exit; ++ goto out; + } + + if (ath11k_debugfs_is_pktlog_lite_mode_enabled(ar)) + trace_ath11k_htt_ppdu_stats(ar, skb->data, len); + ++ spin_lock_bh(&ar->data_lock); + ppdu_info = ath11k_dp_htt_get_ppdu_desc(ar, ppdu_id); + if (!ppdu_info) { + ret = -EINVAL; +- goto exit; ++ goto out_unlock_data; + } + + ppdu_info->ppdu_id = ppdu_id; +@@ -1604,10 +1601,13 @@ static int ath11k_htt_pull_ppdu_stats(st + (void *)ppdu_info); + if (ret) { + ath11k_warn(ab, "Failed to parse tlv %d\n", ret); +- goto exit; ++ goto out_unlock_data; + } + +-exit: ++out_unlock_data: ++ spin_unlock_bh(&ar->data_lock); ++ ++out: + rcu_read_unlock(); + + return ret; diff --git a/package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-update-hw-params-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-update-hw-params-for-IPQ5018.patch new file mode 100644 index 0000000000..25d39ddb0d --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-update-hw-params-for-IPQ5018.patch @@ -0,0 +1,125 @@ +From 8dfe875aa24aec68baf6702018633c84c2c1feca Mon Sep 17 00:00:00 2001 +From: Sriram R +Date: Fri, 2 Dec 2022 23:37:13 +0200 +Subject: [PATCH] wifi: ath11k: update hw params for IPQ5018 + +Add new compatible string for IPQ5018 and add +required hw params for IPQ5018. The hw descriptors size and +datapath ops are similar to QCN9074, hence reuse the same. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R +Co-developed-by: Karthikeyan Kathirvel +Signed-off-by: Karthikeyan Kathirvel +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221122132152.17771-3-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 71 ++++++++++++++++++++++++++ + drivers/net/wireless/ath/ath11k/core.h | 8 +++ + 2 files changed, 79 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -604,6 +604,77 @@ static const struct ath11k_hw_params ath + .smp2p_wow_exit = true, + .support_fw_mac_sequence = true, + }, ++ { ++ .hw_rev = ATH11K_HW_IPQ5018_HW10, ++ .name = "ipq5018 hw1.0", ++ .fw = { ++ .dir = "IPQ5018/hw1.0", ++ .board_size = 256 * 1024, ++ .cal_offset = 128 * 1024, ++ }, ++ .max_radios = MAX_RADIOS_5018, ++ .bdf_addr = 0x4BA00000, ++ /* hal_desc_sz and hw ops are similar to qcn9074 */ ++ .hal_desc_sz = sizeof(struct hal_rx_desc_qcn9074), ++ .qmi_service_ins_id = ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_IPQ8074, ++ .ring_mask = &ath11k_hw_ring_mask_ipq8074, ++ .credit_flow = false, ++ .max_tx_ring = 1, ++ .spectral = { ++ .fft_sz = 2, ++ .fft_pad_sz = 0, ++ .summary_pad_sz = 16, ++ .fft_hdr_len = 24, ++ .max_fft_bins = 1024, ++ }, ++ .internal_sleep_clock = false, ++ .host_ce_config = ath11k_host_ce_config_qcn9074, ++ .ce_count = CE_CNT_5018, ++ .rxdma1_enable = true, ++ .num_rxmda_per_pdev = RXDMA_PER_PDEV_5018, ++ .rx_mac_buf_ring = false, ++ .vdev_start_delay = false, ++ .htt_peer_map_v2 = true, ++ .interface_modes = BIT(NL80211_IFTYPE_STATION) | ++ BIT(NL80211_IFTYPE_AP) | ++ BIT(NL80211_IFTYPE_MESH_POINT), ++ .supports_monitor = false, ++ .supports_sta_ps = false, ++ .supports_shadow_regs = false, ++ .fw_mem_mode = 0, ++ .num_vdevs = 16 + 1, ++ .num_peers = 512, ++ .supports_regdb = false, ++ .idle_ps = false, ++ .supports_suspend = false, ++ .hal_params = &ath11k_hw_hal_params_ipq8074, ++ .single_pdev_only = false, ++ .cold_boot_calib = true, ++ .fix_l1ss = true, ++ .supports_dynamic_smps_6ghz = false, ++ .alloc_cacheable_memory = true, ++ .supports_rssi_stats = false, ++ .fw_wmi_diag_event = false, ++ .current_cc_support = false, ++ .dbr_debug_support = true, ++ .global_reset = false, ++ .bios_sar_capa = NULL, ++ .m3_fw_support = false, ++ .fixed_bdf_addr = true, ++ .fixed_mem_region = true, ++ .static_window_map = false, ++ .hybrid_bus_type = false, ++ .fixed_fw_mem = false, ++ .support_off_channel_tx = false, ++ .supports_multi_bssid = false, ++ ++ .sram_dump = {}, ++ ++ .tcl_ring_retry = true, ++ .tx_ring_size = DP_TCL_DATA_RING_SIZE, ++ .smp2p_wow_exit = false, ++ .support_fw_mac_sequence = false, ++ }, + }; + + static inline struct ath11k_pdev *ath11k_core_get_single_pdev(struct ath11k_base *ab) +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -142,6 +142,7 @@ enum ath11k_hw_rev { + ATH11K_HW_WCN6855_HW20, + ATH11K_HW_WCN6855_HW21, + ATH11K_HW_WCN6750_HW10, ++ ATH11K_HW_IPQ5018_HW10, + }; + + enum ath11k_firmware_mode { +@@ -230,6 +231,13 @@ struct ath11k_he { + + #define MAX_RADIOS 3 + ++/* ipq5018 hw param macros */ ++#define MAX_RADIOS_5018 1 ++#define CE_CNT_5018 6 ++#define TARGET_CE_CNT_5018 9 ++#define SVC_CE_MAP_LEN_5018 17 ++#define RXDMA_PER_PDEV_5018 1 ++ + enum { + WMI_HOST_TP_SCALE_MAX = 0, + WMI_HOST_TP_SCALE_50 = 1, diff --git a/package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-update-ce-configurations-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-update-ce-configurations-for-IPQ5018.patch new file mode 100644 index 0000000000..95643a95fe --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-update-ce-configurations-for-IPQ5018.patch @@ -0,0 +1,246 @@ +From 26af7aabd2d8225c6b2056234626ba5099610871 Mon Sep 17 00:00:00 2001 +From: Sriram R +Date: Fri, 2 Dec 2022 23:37:14 +0200 +Subject: [PATCH] wifi: ath11k: update ce configurations for IPQ5018 + +IPQ5018 is a single pdev device. Update host +and target CE configurations accordingly. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R +Co-developed-by: Karthikeyan Kathirvel +Signed-off-by: Karthikeyan Kathirvel +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221122132152.17771-4-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 4 + + drivers/net/wireless/ath/ath11k/core.h | 3 + + drivers/net/wireless/ath/ath11k/hw.c | 191 +++++++++++++++++++++++++ + 3 files changed, 198 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -630,6 +630,10 @@ static const struct ath11k_hw_params ath + .internal_sleep_clock = false, + .host_ce_config = ath11k_host_ce_config_qcn9074, + .ce_count = CE_CNT_5018, ++ .target_ce_config = ath11k_target_ce_config_wlan_ipq5018, ++ .target_ce_count = TARGET_CE_CNT_5018, ++ .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq5018, ++ .svc_to_ce_map_len = SVC_CE_MAP_LEN_5018, + .rxdma1_enable = true, + .num_rxmda_per_pdev = RXDMA_PER_PDEV_5018, + .rx_mac_buf_ring = false, +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -1145,6 +1145,9 @@ extern const struct service_to_pipe ath1 + extern const struct ce_pipe_config ath11k_target_ce_config_wlan_qca6390[]; + extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_qca6390[]; + ++extern const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq5018[]; ++extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq5018[]; ++ + extern const struct ce_pipe_config ath11k_target_ce_config_wlan_qcn9074[]; + extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_qcn9074[]; + int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab); +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -1972,6 +1972,197 @@ const struct ath11k_hw_ring_mask ath11k_ + }, + }; + ++/* Target firmware's Copy Engine configuration for IPQ5018 */ ++const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq5018[] = { ++ /* CE0: host->target HTC control and raw streams */ ++ { ++ .pipenum = __cpu_to_le32(0), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE1: target->host HTT + HTC control */ ++ { ++ .pipenum = __cpu_to_le32(1), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE2: target->host WMI */ ++ { ++ .pipenum = __cpu_to_le32(2), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE3: host->target WMI */ ++ { ++ .pipenum = __cpu_to_le32(3), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE4: host->target HTT */ ++ { ++ .pipenum = __cpu_to_le32(4), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), ++ .nentries = __cpu_to_le32(256), ++ .nbytes_max = __cpu_to_le32(256), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE5: target->host Pktlog */ ++ { ++ .pipenum = __cpu_to_le32(5), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE6: Reserved for target autonomous hif_memcpy */ ++ { ++ .pipenum = __cpu_to_le32(6), ++ .pipedir = __cpu_to_le32(PIPEDIR_INOUT), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(16384), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE7 used only by Host */ ++ { ++ .pipenum = __cpu_to_le32(7), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(0x2000), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE8 target->host used only by IPA */ ++ { ++ .pipenum = __cpu_to_le32(8), ++ .pipedir = __cpu_to_le32(PIPEDIR_INOUT), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(16384), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++}; ++ ++/* Map from service/endpoint to Copy Engine for IPQ5018. ++ * This table is derived from the CE TABLE, above. ++ * It is passed to the Target at startup for use by firmware. ++ */ ++const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq5018[] = { ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(3), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(2), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(3), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(2), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(3), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(2), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(3), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(2), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(3), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(2), ++ }, ++ ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(0), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(1), ++ }, ++ ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(0), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(1), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(4), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(1), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_PKT_LOG), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(5), ++ }, ++ ++ /* (Additions here) */ ++ ++ { /* terminator entry */ } ++}; ++ + const struct ath11k_hw_regs ipq8074_regs = { + /* SW2TCL(x) R0 ring configuration address */ + .hal_tcl1_ring_base_lsb = 0x00000510, diff --git a/package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-remap-ce-register-space-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-remap-ce-register-space-for-IPQ5018.patch new file mode 100644 index 0000000000..d07a258ac2 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-remap-ce-register-space-for-IPQ5018.patch @@ -0,0 +1,351 @@ +From b42b3678c91f3ca6e0888bf5a15c1e8678fd5f2d Mon Sep 17 00:00:00 2001 +From: Sriram R +Date: Fri, 2 Dec 2022 23:37:14 +0200 +Subject: [PATCH] wifi: ath11k: remap ce register space for IPQ5018 + +In IPQ5018 ce register space is moved out of wcss unlike +ipq8074 or ipq6018 and the space is not contiguous, +hence remap the CE registers to a new space to access them. + +Register read/write is modified to check if the register to be written +falls in the CE register space and corresponding register is written. +Also adjust the interrupt register address to ce irq enable/disable. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R +Co-developed-by: Karthikeyan Kathirvel +Signed-off-by: Karthikeyan Kathirvel +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221122132152.17771-5-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/ahb.c | 44 ++++++++++++++++++++++---- + drivers/net/wireless/ath/ath11k/ce.h | 16 ++++++++++ + drivers/net/wireless/ath/ath11k/core.c | 8 +++++ + drivers/net/wireless/ath/ath11k/core.h | 1 + + drivers/net/wireless/ath/ath11k/hal.c | 17 ++++++---- + drivers/net/wireless/ath/ath11k/hal.h | 5 +++ + drivers/net/wireless/ath/ath11k/hw.c | 17 ++++++++++ + drivers/net/wireless/ath/ath11k/hw.h | 9 ++++++ + drivers/net/wireless/ath/ath11k/pci.c | 2 ++ + 9 files changed, 107 insertions(+), 12 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -267,30 +267,42 @@ static void ath11k_ahb_clearbit32(struct + static void ath11k_ahb_ce_irq_enable(struct ath11k_base *ab, u16 ce_id) + { + const struct ce_attr *ce_attr; ++ const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr; ++ u32 ie1_reg_addr, ie2_reg_addr, ie3_reg_addr; ++ ++ ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab); ++ ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab); ++ ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab); + + ce_attr = &ab->hw_params.host_ce_config[ce_id]; + if (ce_attr->src_nentries) +- ath11k_ahb_setbit32(ab, ce_id, CE_HOST_IE_ADDRESS); ++ ath11k_ahb_setbit32(ab, ce_id, ie1_reg_addr); + + if (ce_attr->dest_nentries) { +- ath11k_ahb_setbit32(ab, ce_id, CE_HOST_IE_2_ADDRESS); ++ ath11k_ahb_setbit32(ab, ce_id, ie2_reg_addr); + ath11k_ahb_setbit32(ab, ce_id + CE_HOST_IE_3_SHIFT, +- CE_HOST_IE_3_ADDRESS); ++ ie3_reg_addr); + } + } + + static void ath11k_ahb_ce_irq_disable(struct ath11k_base *ab, u16 ce_id) + { + const struct ce_attr *ce_attr; ++ const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr; ++ u32 ie1_reg_addr, ie2_reg_addr, ie3_reg_addr; ++ ++ ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab); ++ ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab); ++ ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab); + + ce_attr = &ab->hw_params.host_ce_config[ce_id]; + if (ce_attr->src_nentries) +- ath11k_ahb_clearbit32(ab, ce_id, CE_HOST_IE_ADDRESS); ++ ath11k_ahb_clearbit32(ab, ce_id, ie1_reg_addr); + + if (ce_attr->dest_nentries) { +- ath11k_ahb_clearbit32(ab, ce_id, CE_HOST_IE_2_ADDRESS); ++ ath11k_ahb_clearbit32(ab, ce_id, ie2_reg_addr); + ath11k_ahb_clearbit32(ab, ce_id + CE_HOST_IE_3_SHIFT, +- CE_HOST_IE_3_ADDRESS); ++ ie3_reg_addr); + } + } + +@@ -1142,10 +1154,26 @@ static int ath11k_ahb_probe(struct platf + goto err_core_free; + } + ++ ab->mem_ce = ab->mem; ++ + ret = ath11k_core_pre_init(ab); + if (ret) + goto err_core_free; + ++ if (ab->hw_params.ce_remap) { ++ const struct ce_remap *ce_remap = ab->hw_params.ce_remap; ++ /* ce register space is moved out of wcss unlike ipq8074 or ipq6018 ++ * and the space is not contiguous, hence remapping the CE registers ++ * to a new space for accessing them. ++ */ ++ ab->mem_ce = ioremap(ce_remap->base, ce_remap->size); ++ if (IS_ERR(ab->mem_ce)) { ++ dev_err(&pdev->dev, "ce ioremap error\n"); ++ ret = -ENOMEM; ++ goto err_core_free; ++ } ++ } ++ + ret = ath11k_ahb_setup_resources(ab); + if (ret) + goto err_core_free; +@@ -1236,6 +1264,10 @@ static void ath11k_ahb_free_resources(st + ath11k_ahb_release_smp2p_handle(ab); + ath11k_ahb_fw_resource_deinit(ab); + ath11k_ce_free_pipes(ab); ++ ++ if (ab->hw_params.ce_remap) ++ iounmap(ab->mem_ce); ++ + ath11k_core_free(ab); + platform_set_drvdata(pdev, NULL); + } +--- a/drivers/net/wireless/ath/ath11k/ce.h ++++ b/drivers/net/wireless/ath/ath11k/ce.h +@@ -49,6 +49,11 @@ void ath11k_ce_byte_swap(void *mem, u32 + #define CE_HOST_IE_2_ADDRESS 0x00A18040 + #define CE_HOST_IE_3_ADDRESS CE_HOST_IE_ADDRESS + ++/* CE IE registers are different for IPQ5018 */ ++#define CE_HOST_IPQ5018_IE_ADDRESS 0x0841804C ++#define CE_HOST_IPQ5018_IE_2_ADDRESS 0x08418050 ++#define CE_HOST_IPQ5018_IE_3_ADDRESS CE_HOST_IPQ5018_IE_ADDRESS ++ + #define CE_HOST_IE_3_SHIFT 0xC + + #define CE_RING_IDX_INCR(nentries_mask, idx) (((idx) + 1) & (nentries_mask)) +@@ -84,6 +89,17 @@ struct ce_pipe_config { + __le32 reserved; + }; + ++struct ce_ie_addr { ++ u32 ie1_reg_addr; ++ u32 ie2_reg_addr; ++ u32 ie3_reg_addr; ++}; ++ ++struct ce_remap { ++ u32 base; ++ u32 size; ++}; ++ + struct ce_attr { + /* CE_ATTR_* values */ + unsigned int flags; +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -54,6 +54,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 11, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq8074, + .svc_to_ce_map_len = 21, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .single_pdev_only = false, + .rxdma1_enable = true, + .num_rxmda_per_pdev = 1, +@@ -137,6 +138,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 11, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq6018, + .svc_to_ce_map_len = 19, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .single_pdev_only = false, + .rxdma1_enable = true, + .num_rxmda_per_pdev = 1, +@@ -218,6 +220,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 9, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390, + .svc_to_ce_map_len = 14, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .single_pdev_only = true, + .rxdma1_enable = false, + .num_rxmda_per_pdev = 2, +@@ -301,6 +304,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 9, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qcn9074, + .svc_to_ce_map_len = 18, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .rxdma1_enable = true, + .num_rxmda_per_pdev = 1, + .rx_mac_buf_ring = false, +@@ -381,6 +385,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 9, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390, + .svc_to_ce_map_len = 14, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .single_pdev_only = true, + .rxdma1_enable = false, + .num_rxmda_per_pdev = 2, +@@ -546,6 +551,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 9, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390, + .svc_to_ce_map_len = 14, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .single_pdev_only = true, + .rxdma1_enable = false, + .num_rxmda_per_pdev = 1, +@@ -634,6 +640,8 @@ static const struct ath11k_hw_params ath + .target_ce_count = TARGET_CE_CNT_5018, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq5018, + .svc_to_ce_map_len = SVC_CE_MAP_LEN_5018, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq5018, ++ .ce_remap = &ath11k_ce_remap_ipq5018, + .rxdma1_enable = true, + .num_rxmda_per_pdev = RXDMA_PER_PDEV_5018, + .rx_mac_buf_ring = false, +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -851,6 +851,7 @@ struct ath11k_base { + struct ath11k_dp dp; + + void __iomem *mem; ++ void __iomem *mem_ce; + unsigned long mem_len; + + struct { +--- a/drivers/net/wireless/ath/ath11k/hal.c ++++ b/drivers/net/wireless/ath/ath11k/hal.c +@@ -1220,16 +1220,20 @@ static int ath11k_hal_srng_create_config + s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_HP; + + s = &hal->srng_config[HAL_CE_SRC]; +- s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_BASE_LSB; +- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_HP; ++ s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_BASE_LSB + ++ ATH11K_CE_OFFSET(ab); ++ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_HP + ++ ATH11K_CE_OFFSET(ab); + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab); + + s = &hal->srng_config[HAL_CE_DST]; +- s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_BASE_LSB; +- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_HP; ++ s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_BASE_LSB + ++ ATH11K_CE_OFFSET(ab); ++ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_HP + ++ ATH11K_CE_OFFSET(ab); + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - +@@ -1237,8 +1241,9 @@ static int ath11k_hal_srng_create_config + + s = &hal->srng_config[HAL_CE_DST_STATUS]; + s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + +- HAL_CE_DST_STATUS_RING_BASE_LSB; +- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_HP; ++ HAL_CE_DST_STATUS_RING_BASE_LSB + ATH11K_CE_OFFSET(ab); ++ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_HP + ++ ATH11K_CE_OFFSET(ab); + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - +--- a/drivers/net/wireless/ath/ath11k/hal.h ++++ b/drivers/net/wireless/ath/ath11k/hal.h +@@ -321,6 +321,10 @@ struct ath11k_base; + #define HAL_WBM2SW_RELEASE_RING_BASE_MSB_RING_SIZE 0x000fffff + #define HAL_RXDMA_RING_MAX_SIZE 0x0000ffff + ++/* IPQ5018 ce registers */ ++#define HAL_IPQ5018_CE_WFSS_REG_BASE 0x08400000 ++#define HAL_IPQ5018_CE_SIZE 0x200000 ++ + /* Add any other errors here and return them in + * ath11k_hal_rx_desc_get_err(). + */ +@@ -519,6 +523,7 @@ enum hal_srng_dir { + #define HAL_SRNG_FLAGS_MSI_INTR 0x00020000 + #define HAL_SRNG_FLAGS_CACHED 0x20000000 + #define HAL_SRNG_FLAGS_LMAC_RING 0x80000000 ++#define HAL_SRNG_FLAGS_REMAP_CE_RING 0x10000000 + + #define HAL_SRNG_TLV_HDR_TAG GENMASK(9, 1) + #define HAL_SRNG_TLV_HDR_LEN GENMASK(25, 10) +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -2163,6 +2163,23 @@ const struct service_to_pipe ath11k_targ + { /* terminator entry */ } + }; + ++const struct ce_ie_addr ath11k_ce_ie_addr_ipq8074 = { ++ .ie1_reg_addr = CE_HOST_IE_ADDRESS, ++ .ie2_reg_addr = CE_HOST_IE_2_ADDRESS, ++ .ie3_reg_addr = CE_HOST_IE_3_ADDRESS, ++}; ++ ++const struct ce_ie_addr ath11k_ce_ie_addr_ipq5018 = { ++ .ie1_reg_addr = CE_HOST_IPQ5018_IE_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .ie2_reg_addr = CE_HOST_IPQ5018_IE_2_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .ie3_reg_addr = CE_HOST_IPQ5018_IE_3_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE, ++}; ++ ++const struct ce_remap ath11k_ce_remap_ipq5018 = { ++ .base = HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .size = HAL_IPQ5018_CE_SIZE, ++}; ++ + const struct ath11k_hw_regs ipq8074_regs = { + /* SW2TCL(x) R0 ring configuration address */ + .hal_tcl1_ring_base_lsb = 0x00000510, +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -80,6 +80,8 @@ + #define ATH11K_M3_FILE "m3.bin" + #define ATH11K_REGDB_FILE_NAME "regdb.bin" + ++#define ATH11K_CE_OFFSET(ab) (ab->mem_ce - ab->mem) ++ + enum ath11k_hw_rate_cck { + ATH11K_HW_RATE_CCK_LP_11M = 0, + ATH11K_HW_RATE_CCK_LP_5_5M, +@@ -158,6 +160,8 @@ struct ath11k_hw_params { + u32 target_ce_count; + const struct service_to_pipe *svc_to_ce_map; + u32 svc_to_ce_map_len; ++ const struct ce_ie_addr *ce_ie_addr; ++ const struct ce_remap *ce_remap; + + bool single_pdev_only; + +@@ -277,6 +281,11 @@ extern const struct ath11k_hw_ring_mask + extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qcn9074; + extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_wcn6750; + ++extern const struct ce_ie_addr ath11k_ce_ie_addr_ipq8074; ++extern const struct ce_ie_addr ath11k_ce_ie_addr_ipq5018; ++ ++extern const struct ce_remap ath11k_ce_remap_ipq5018; ++ + extern const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074; + extern const struct ath11k_hw_hal_params ath11k_hw_hal_params_qca6390; + extern const struct ath11k_hw_hal_params ath11k_hw_hal_params_wcn6750; +--- a/drivers/net/wireless/ath/ath11k/pci.c ++++ b/drivers/net/wireless/ath/ath11k/pci.c +@@ -543,6 +543,8 @@ static int ath11k_pci_claim(struct ath11 + goto clear_master; + } + ++ ab->mem_ce = ab->mem; ++ + ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot pci_mem 0x%pK\n", ab->mem); + return 0; + diff --git a/package/kernel/mac80211/patches/ath11k/0022-wifi-ath11k-update-hal-srng-regs-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0022-wifi-ath11k-update-hal-srng-regs-for-IPQ5018.patch new file mode 100644 index 0000000000..35ea20a3c4 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0022-wifi-ath11k-update-hal-srng-regs-for-IPQ5018.patch @@ -0,0 +1,130 @@ +From 711b80acbdfb9667a9cf8374e13320a6e624ce73 Mon Sep 17 00:00:00 2001 +From: Sriram R +Date: Fri, 2 Dec 2022 23:37:14 +0200 +Subject: [PATCH] wifi: ath11k: update hal srng regs for IPQ5018 + +IPQ5018 hal srng register address & offsets are not +similar to IPQ8074/IPQ6018/QCN9074, hence define a +new set of srng register group data for IPQ5018. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R +Co-developed-by: Karthikeyan Kathirvel +Signed-off-by: Karthikeyan Kathirvel +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221122132152.17771-6-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 1 + + drivers/net/wireless/ath/ath11k/hw.c | 79 ++++++++++++++++++++++++++ + drivers/net/wireless/ath/ath11k/hw.h | 1 + + 3 files changed, 81 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -634,6 +634,7 @@ static const struct ath11k_hw_params ath + .max_fft_bins = 1024, + }, + .internal_sleep_clock = false, ++ .regs = &ipq5018_regs, + .host_ce_config = ath11k_host_ce_config_qcn9074, + .ce_count = CE_CNT_5018, + .target_ce_config = ath11k_target_ce_config_wlan_ipq5018, +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -2645,6 +2645,85 @@ static const struct ath11k_hw_tcl2wbm_rb + }, + }; + ++const struct ath11k_hw_regs ipq5018_regs = { ++ /* SW2TCL(x) R0 ring configuration address */ ++ .hal_tcl1_ring_base_lsb = 0x00000694, ++ .hal_tcl1_ring_base_msb = 0x00000698, ++ .hal_tcl1_ring_id = 0x0000069c, ++ .hal_tcl1_ring_misc = 0x000006a4, ++ .hal_tcl1_ring_tp_addr_lsb = 0x000006b0, ++ .hal_tcl1_ring_tp_addr_msb = 0x000006b4, ++ .hal_tcl1_ring_consumer_int_setup_ix0 = 0x000006c4, ++ .hal_tcl1_ring_consumer_int_setup_ix1 = 0x000006c8, ++ .hal_tcl1_ring_msi1_base_lsb = 0x000006dc, ++ .hal_tcl1_ring_msi1_base_msb = 0x000006e0, ++ .hal_tcl1_ring_msi1_data = 0x000006e4, ++ .hal_tcl2_ring_base_lsb = 0x000006ec, ++ .hal_tcl_ring_base_lsb = 0x0000079c, ++ ++ /* TCL STATUS ring address */ ++ .hal_tcl_status_ring_base_lsb = 0x000008a4, ++ ++ /* REO2SW(x) R0 ring configuration address */ ++ .hal_reo1_ring_base_lsb = 0x000001ec, ++ .hal_reo1_ring_base_msb = 0x000001f0, ++ .hal_reo1_ring_id = 0x000001f4, ++ .hal_reo1_ring_misc = 0x000001fc, ++ .hal_reo1_ring_hp_addr_lsb = 0x00000200, ++ .hal_reo1_ring_hp_addr_msb = 0x00000204, ++ .hal_reo1_ring_producer_int_setup = 0x00000210, ++ .hal_reo1_ring_msi1_base_lsb = 0x00000234, ++ .hal_reo1_ring_msi1_base_msb = 0x00000238, ++ .hal_reo1_ring_msi1_data = 0x0000023c, ++ .hal_reo2_ring_base_lsb = 0x00000244, ++ .hal_reo1_aging_thresh_ix_0 = 0x00000564, ++ .hal_reo1_aging_thresh_ix_1 = 0x00000568, ++ .hal_reo1_aging_thresh_ix_2 = 0x0000056c, ++ .hal_reo1_aging_thresh_ix_3 = 0x00000570, ++ ++ /* REO2SW(x) R2 ring pointers (head/tail) address */ ++ .hal_reo1_ring_hp = 0x00003028, ++ .hal_reo1_ring_tp = 0x0000302c, ++ .hal_reo2_ring_hp = 0x00003030, ++ ++ /* REO2TCL R0 ring configuration address */ ++ .hal_reo_tcl_ring_base_lsb = 0x000003fc, ++ .hal_reo_tcl_ring_hp = 0x00003058, ++ ++ /* SW2REO ring address */ ++ .hal_sw2reo_ring_base_lsb = 0x0000013c, ++ .hal_sw2reo_ring_hp = 0x00003018, ++ ++ /* REO CMD ring address */ ++ .hal_reo_cmd_ring_base_lsb = 0x000000e4, ++ .hal_reo_cmd_ring_hp = 0x00003010, ++ ++ /* REO status address */ ++ .hal_reo_status_ring_base_lsb = 0x00000504, ++ .hal_reo_status_hp = 0x00003070, ++ ++ /* WCSS relative address */ ++ .hal_seq_wcss_umac_ce0_src_reg = 0x08400000 ++ - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .hal_seq_wcss_umac_ce0_dst_reg = 0x08401000 ++ - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .hal_seq_wcss_umac_ce1_src_reg = 0x08402000 ++ - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .hal_seq_wcss_umac_ce1_dst_reg = 0x08403000 ++ - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ ++ /* WBM Idle address */ ++ .hal_wbm_idle_link_ring_base_lsb = 0x00000874, ++ .hal_wbm_idle_link_ring_misc = 0x00000884, ++ ++ /* SW2WBM release address */ ++ .hal_wbm_release_ring_base_lsb = 0x000001ec, ++ ++ /* WBM2SW release address */ ++ .hal_wbm0_release_ring_base_lsb = 0x00000924, ++ .hal_wbm1_release_ring_base_lsb = 0x0000097c, ++}; ++ + const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074 = { + .rx_buf_rbm = HAL_RX_BUF_RBM_SW3_BM, + .tcl2wbm_rbm_map = ath11k_hw_tcl2wbm_rbm_map_ipq8074, +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -415,6 +415,7 @@ extern const struct ath11k_hw_regs qca63 + extern const struct ath11k_hw_regs qcn9074_regs; + extern const struct ath11k_hw_regs wcn6855_regs; + extern const struct ath11k_hw_regs wcn6750_regs; ++extern const struct ath11k_hw_regs ipq5018_regs; + + static inline const char *ath11k_bd_ie_type_str(enum ath11k_bd_ie_type type) + { diff --git a/package/kernel/mac80211/patches/ath11k/0023-wifi-ath11k-initialize-hw_ops-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0023-wifi-ath11k-initialize-hw_ops-for-IPQ5018.patch new file mode 100644 index 0000000000..5ef701a445 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0023-wifi-ath11k-initialize-hw_ops-for-IPQ5018.patch @@ -0,0 +1,90 @@ +From ba60f2793d3a37a00da14bb56a26558a902d2831 Mon Sep 17 00:00:00 2001 +From: Sriram R +Date: Fri, 2 Dec 2022 23:37:14 +0200 +Subject: [PATCH] wifi: ath11k: initialize hw_ops for IPQ5018 + +The ipq5018_ops is initialized for IPQ5018. This is different from +other platforms. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R +Co-developed-by: Karthikeyan Kathirvel +Signed-off-by: Karthikeyan Kathirvel +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221122132152.17771-7-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 1 + + drivers/net/wireless/ath/ath11k/hw.c | 40 ++++++++++++++++++++++++++ + drivers/net/wireless/ath/ath11k/hw.h | 1 + + 3 files changed, 42 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -635,6 +635,7 @@ static const struct ath11k_hw_params ath + }, + .internal_sleep_clock = false, + .regs = &ipq5018_regs, ++ .hw_ops = &ipq5018_ops, + .host_ce_config = ath11k_host_ce_config_qcn9074, + .ce_count = CE_CNT_5018, + .target_ce_config = ath11k_target_ce_config_wlan_ipq5018, +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -1084,6 +1084,46 @@ const struct ath11k_hw_ops wcn6750_ops = + .get_ring_selector = ath11k_hw_wcn6750_get_tcl_ring_selector, + }; + ++/* IPQ5018 hw ops is similar to QCN9074 except for the dest ring remap */ ++const struct ath11k_hw_ops ipq5018_ops = { ++ .get_hw_mac_from_pdev_id = ath11k_hw_ipq6018_mac_from_pdev_id, ++ .wmi_init_config = ath11k_init_wmi_config_ipq8074, ++ .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_ipq8074, ++ .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_ipq8074, ++ .tx_mesh_enable = ath11k_hw_qcn9074_tx_mesh_enable, ++ .rx_desc_get_first_msdu = ath11k_hw_qcn9074_rx_desc_get_first_msdu, ++ .rx_desc_get_last_msdu = ath11k_hw_qcn9074_rx_desc_get_last_msdu, ++ .rx_desc_get_l3_pad_bytes = ath11k_hw_qcn9074_rx_desc_get_l3_pad_bytes, ++ .rx_desc_get_hdr_status = ath11k_hw_qcn9074_rx_desc_get_hdr_status, ++ .rx_desc_encrypt_valid = ath11k_hw_qcn9074_rx_desc_encrypt_valid, ++ .rx_desc_get_encrypt_type = ath11k_hw_qcn9074_rx_desc_get_encrypt_type, ++ .rx_desc_get_decap_type = ath11k_hw_qcn9074_rx_desc_get_decap_type, ++ .rx_desc_get_mesh_ctl = ath11k_hw_qcn9074_rx_desc_get_mesh_ctl, ++ .rx_desc_get_ldpc_support = ath11k_hw_qcn9074_rx_desc_get_ldpc_support, ++ .rx_desc_get_mpdu_seq_ctl_vld = ath11k_hw_qcn9074_rx_desc_get_mpdu_seq_ctl_vld, ++ .rx_desc_get_mpdu_fc_valid = ath11k_hw_qcn9074_rx_desc_get_mpdu_fc_valid, ++ .rx_desc_get_mpdu_start_seq_no = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_seq_no, ++ .rx_desc_get_msdu_len = ath11k_hw_qcn9074_rx_desc_get_msdu_len, ++ .rx_desc_get_msdu_sgi = ath11k_hw_qcn9074_rx_desc_get_msdu_sgi, ++ .rx_desc_get_msdu_rate_mcs = ath11k_hw_qcn9074_rx_desc_get_msdu_rate_mcs, ++ .rx_desc_get_msdu_rx_bw = ath11k_hw_qcn9074_rx_desc_get_msdu_rx_bw, ++ .rx_desc_get_msdu_freq = ath11k_hw_qcn9074_rx_desc_get_msdu_freq, ++ .rx_desc_get_msdu_pkt_type = ath11k_hw_qcn9074_rx_desc_get_msdu_pkt_type, ++ .rx_desc_get_msdu_nss = ath11k_hw_qcn9074_rx_desc_get_msdu_nss, ++ .rx_desc_get_mpdu_tid = ath11k_hw_qcn9074_rx_desc_get_mpdu_tid, ++ .rx_desc_get_mpdu_peer_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_peer_id, ++ .rx_desc_copy_attn_end_tlv = ath11k_hw_qcn9074_rx_desc_copy_attn_end, ++ .rx_desc_get_mpdu_start_tag = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_tag, ++ .rx_desc_get_mpdu_ppdu_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_ppdu_id, ++ .rx_desc_set_msdu_len = ath11k_hw_qcn9074_rx_desc_set_msdu_len, ++ .rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention, ++ .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload, ++ .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid, ++ .rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid, ++ .rx_desc_mpdu_start_addr2 = ath11k_hw_ipq9074_rx_desc_mpdu_start_addr2, ++ ++}; ++ + #define ATH11K_TX_RING_MASK_0 BIT(0) + #define ATH11K_TX_RING_MASK_1 BIT(1) + #define ATH11K_TX_RING_MASK_2 BIT(2) +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -275,6 +275,7 @@ extern const struct ath11k_hw_ops qca639 + extern const struct ath11k_hw_ops qcn9074_ops; + extern const struct ath11k_hw_ops wcn6855_ops; + extern const struct ath11k_hw_ops wcn6750_ops; ++extern const struct ath11k_hw_ops ipq5018_ops; + + extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_ipq8074; + extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qca6390; diff --git a/package/kernel/mac80211/patches/ath11k/0024-wifi-ath11k-add-new-hw-ops-for-IPQ5018-to-get-rx-des.patch b/package/kernel/mac80211/patches/ath11k/0024-wifi-ath11k-add-new-hw-ops-for-IPQ5018-to-get-rx-des.patch new file mode 100644 index 0000000000..64531f13f8 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0024-wifi-ath11k-add-new-hw-ops-for-IPQ5018-to-get-rx-des.patch @@ -0,0 +1,84 @@ +From 69968f88f1770d61cae0febef805fd00d66cf6a1 Mon Sep 17 00:00:00 2001 +From: Sriram R +Date: Fri, 2 Dec 2022 23:37:15 +0200 +Subject: [PATCH] wifi: ath11k: add new hw ops for IPQ5018 to get rx dest ring + hashmap + +The Destination ring control register is different +for IPQ5018 when compared to IPQ8074/IPQ6018/QCN9074. +Hence create a new hw ops to fetch the hash ring map +for different device variants. ipq5018 hw ops +is similar to qcn9074 except for this change, so reuse +all the qcn9074 ops for ipq5018. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R +Co-developed-by: Karthikeyan Kathirvel +Signed-off-by: Karthikeyan Kathirvel +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221122132152.17771-8-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/hw.c | 44 ++++++++++++++++++++++++++++ + 1 file changed, 44 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -791,6 +791,49 @@ static void ath11k_hw_wcn6855_reo_setup( + ring_hash_map); + } + ++static void ath11k_hw_ipq5018_reo_setup(struct ath11k_base *ab) ++{ ++ u32 reo_base = HAL_SEQ_WCSS_UMAC_REO_REG; ++ u32 val; ++ ++ /* Each hash entry uses three bits to map to a particular ring. */ ++ u32 ring_hash_map = HAL_HASH_ROUTING_RING_SW1 << 0 | ++ HAL_HASH_ROUTING_RING_SW2 << 4 | ++ HAL_HASH_ROUTING_RING_SW3 << 8 | ++ HAL_HASH_ROUTING_RING_SW4 << 12 | ++ HAL_HASH_ROUTING_RING_SW1 << 16 | ++ HAL_HASH_ROUTING_RING_SW2 << 20 | ++ HAL_HASH_ROUTING_RING_SW3 << 24 | ++ HAL_HASH_ROUTING_RING_SW4 << 28; ++ ++ val = ath11k_hif_read32(ab, reo_base + HAL_REO1_GEN_ENABLE); ++ ++ val &= ~HAL_REO1_GEN_ENABLE_FRAG_DST_RING; ++ val |= FIELD_PREP(HAL_REO1_GEN_ENABLE_FRAG_DST_RING, ++ HAL_SRNG_RING_ID_REO2SW1) | ++ FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_LIST_ENABLE, 1) | ++ FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_FLUSH_ENABLE, 1); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_GEN_ENABLE, val); ++ ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_0(ab), ++ HAL_DEFAULT_REO_TIMEOUT_USEC); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_1(ab), ++ HAL_DEFAULT_REO_TIMEOUT_USEC); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_2(ab), ++ HAL_DEFAULT_REO_TIMEOUT_USEC); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_3(ab), ++ HAL_DEFAULT_REO_TIMEOUT_USEC); ++ ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_0, ++ ring_hash_map); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_1, ++ ring_hash_map); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_2, ++ ring_hash_map); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_3, ++ ring_hash_map); ++} ++ + static u16 ath11k_hw_ipq8074_mpdu_info_get_peerid(u8 *tlv_data) + { + u16 peer_id = 0; +@@ -1117,6 +1160,7 @@ const struct ath11k_hw_ops ipq5018_ops = + .rx_desc_get_mpdu_ppdu_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_ppdu_id, + .rx_desc_set_msdu_len = ath11k_hw_qcn9074_rx_desc_set_msdu_len, + .rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention, ++ .reo_setup = ath11k_hw_ipq5018_reo_setup, + .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload, + .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid, + .rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid, diff --git a/package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-add-ipq5018-device-support.patch b/package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-add-ipq5018-device-support.patch new file mode 100644 index 0000000000..5b930e8d4f --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-add-ipq5018-device-support.patch @@ -0,0 +1,31 @@ +From 25edca7bb18a2a40cc7e54c6f522e9b3c917e2c5 Mon Sep 17 00:00:00 2001 +From: Sriram R +Date: Fri, 2 Dec 2022 23:37:15 +0200 +Subject: [PATCH] wifi: ath11k: add ipq5018 device support + +ipq5018 is a ahb 2ghz device, enable the compatible support for +ipq5018 in ahb. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R +Co-developed-by: Karthikeyan Kathirvel +Signed-off-by: Karthikeyan Kathirvel +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221122132152.17771-9-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/ahb.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -32,6 +32,9 @@ static const struct of_device_id ath11k_ + { .compatible = "qcom,wcn6750-wifi", + .data = (void *)ATH11K_HW_WCN6750_HW10, + }, ++ { .compatible = "qcom,ipq5018-wifi", ++ .data = (void *)ATH11K_HW_IPQ5018_HW10, ++ }, + { } + }; + diff --git a/package/kernel/mac80211/patches/ath11k/0026-wifi-ath11k-Fix-scan-request-param-frame-size-warnin.patch b/package/kernel/mac80211/patches/ath11k/0026-wifi-ath11k-Fix-scan-request-param-frame-size-warnin.patch new file mode 100644 index 0000000000..50c14e7b98 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0026-wifi-ath11k-Fix-scan-request-param-frame-size-warnin.patch @@ -0,0 +1,161 @@ +From d45daa6d1a8da080f1b516c570a8428a7b9225e4 Mon Sep 17 00:00:00 2001 +From: Karthikeyan Kathirvel +Date: Tue, 6 Dec 2022 00:51:25 +0530 +Subject: [PATCH] wifi: ath11k: Fix scan request param frame size warning + +Following warning was observed + +drivers/net/wireless/ath/ath11k/mac.c:2351:1: warning: the frame +size of 1184 bytes is larger than 1024 bytes [-Wframe-larger-than=] + +A local variable is declared with a size larger than 1024 bytes +this causing a compilation warning. Change the local variable to +heap memory to fix the warning. + +Tested-on: IPQ8074 AHB WLAN.HK.2.7.0.1-01701-QCAHKSWPL_SILICONZ-1 v2 + +Signed-off-by: Karthikeyan Kathirvel +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221205192125.13533-1-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 83 +++++++++++++++------------ + 1 file changed, 45 insertions(+), 38 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -3612,7 +3612,7 @@ static int ath11k_mac_op_hw_scan(struct + struct ath11k *ar = hw->priv; + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); + struct cfg80211_scan_request *req = &hw_req->req; +- struct scan_req_params arg; ++ struct scan_req_params *arg = NULL; + int ret = 0; + int i; + u32 scan_timeout; +@@ -3640,72 +3640,78 @@ static int ath11k_mac_op_hw_scan(struct + if (ret) + goto exit; + +- memset(&arg, 0, sizeof(arg)); +- ath11k_wmi_start_scan_init(ar, &arg); +- arg.vdev_id = arvif->vdev_id; +- arg.scan_id = ATH11K_SCAN_ID; ++ arg = kzalloc(sizeof(*arg), GFP_KERNEL); ++ ++ if (!arg) { ++ ret = -ENOMEM; ++ goto exit; ++ } ++ ++ ath11k_wmi_start_scan_init(ar, arg); ++ arg->vdev_id = arvif->vdev_id; ++ arg->scan_id = ATH11K_SCAN_ID; + + if (req->ie_len) { +- arg.extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); +- if (!arg.extraie.ptr) { ++ arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); ++ if (!arg->extraie.ptr) { + ret = -ENOMEM; + goto exit; + } +- arg.extraie.len = req->ie_len; ++ arg->extraie.len = req->ie_len; + } + + if (req->n_ssids) { +- arg.num_ssids = req->n_ssids; +- for (i = 0; i < arg.num_ssids; i++) { +- arg.ssid[i].length = req->ssids[i].ssid_len; +- memcpy(&arg.ssid[i].ssid, req->ssids[i].ssid, ++ arg->num_ssids = req->n_ssids; ++ for (i = 0; i < arg->num_ssids; i++) { ++ arg->ssid[i].length = req->ssids[i].ssid_len; ++ memcpy(&arg->ssid[i].ssid, req->ssids[i].ssid, + req->ssids[i].ssid_len); + } + } else { +- arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE; ++ arg->scan_flags |= WMI_SCAN_FLAG_PASSIVE; + } + + if (req->n_channels) { +- arg.num_chan = req->n_channels; +- arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list), +- GFP_KERNEL); ++ arg->num_chan = req->n_channels; ++ arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), ++ GFP_KERNEL); + +- if (!arg.chan_list) { ++ if (!arg->chan_list) { + ret = -ENOMEM; + goto exit; + } + +- for (i = 0; i < arg.num_chan; i++) +- arg.chan_list[i] = req->channels[i]->center_freq; ++ for (i = 0; i < arg->num_chan; i++) ++ arg->chan_list[i] = req->channels[i]->center_freq; + } + + if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { +- arg.scan_f_add_spoofed_mac_in_probe = 1; +- ether_addr_copy(arg.mac_addr.addr, req->mac_addr); +- ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask); ++ arg->scan_f_add_spoofed_mac_in_probe = 1; ++ ether_addr_copy(arg->mac_addr.addr, req->mac_addr); ++ ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask); + } + + /* if duration is set, default dwell times will be overwritten */ + if (req->duration) { +- arg.dwell_time_active = req->duration; +- arg.dwell_time_active_2g = req->duration; +- arg.dwell_time_active_6g = req->duration; +- arg.dwell_time_passive = req->duration; +- arg.dwell_time_passive_6g = req->duration; +- arg.burst_duration = req->duration; ++ arg->dwell_time_active = req->duration; ++ arg->dwell_time_active_2g = req->duration; ++ arg->dwell_time_active_6g = req->duration; ++ arg->dwell_time_passive = req->duration; ++ arg->dwell_time_passive_6g = req->duration; ++ arg->burst_duration = req->duration; + +- scan_timeout = min_t(u32, arg.max_rest_time * +- (arg.num_chan - 1) + (req->duration + ++ scan_timeout = min_t(u32, arg->max_rest_time * ++ (arg->num_chan - 1) + (req->duration + + ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) * +- arg.num_chan, arg.max_scan_time); ++ arg->num_chan, arg->max_scan_time); + } else { +- scan_timeout = arg.max_scan_time; ++ scan_timeout = arg->max_scan_time; + } + + /* Add a margin to account for event/command processing */ + scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD; + +- ret = ath11k_start_scan(ar, &arg); ++ ret = ath11k_start_scan(ar, arg); + if (ret) { + ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret); + spin_lock_bh(&ar->data_lock); +@@ -3717,10 +3723,11 @@ static int ath11k_mac_op_hw_scan(struct + msecs_to_jiffies(scan_timeout)); + + exit: +- kfree(arg.chan_list); +- +- if (req->ie_len) +- kfree(arg.extraie.ptr); ++ if (arg) { ++ kfree(arg->chan_list); ++ kfree(arg->extraie.ptr); ++ kfree(arg); ++ } + + mutex_unlock(&ar->conf_mutex); + diff --git a/package/kernel/mac80211/patches/ath11k/0029-wifi-ath11k-Add-support-to-configure-FTM-responder-r.patch b/package/kernel/mac80211/patches/ath11k/0029-wifi-ath11k-Add-support-to-configure-FTM-responder-r.patch new file mode 100644 index 0000000000..f652d689b5 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0029-wifi-ath11k-Add-support-to-configure-FTM-responder-r.patch @@ -0,0 +1,169 @@ +From a27c6a5853eb9d4f293b99be73a6891fe88263c7 Mon Sep 17 00:00:00 2001 +From: Sowmiya Sree Elavalagan +Date: Tue, 10 Jan 2023 15:30:57 +0200 +Subject: [PATCH] wifi: ath11k: Add support to configure FTM responder role + +Fine Timing Measurement(FTM) support is used to measure round trip +time between two nodes. + +Enable FTM responder feature using hw_params on supported device. +Since FTM functionality is offloaded to firmware, adding the +interface allows user space to enable or disable FTM responder. +Also add support for advertising the same in extended capabilities. + +QCA6390, WCN6855 and WCN6750 do not support this feature. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sowmiya Sree Elavalagan +Signed-off-by: Raj Kumar Bhagat +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221220044435.10506-1-quic_rajkbhag@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 8 ++++++++ + drivers/net/wireless/ath/ath11k/core.h | 1 + + drivers/net/wireless/ath/ath11k/hw.h | 1 + + drivers/net/wireless/ath/ath11k/mac.c | 20 +++++++++++++++++++- + drivers/net/wireless/ath/ath11k/wmi.h | 1 + + 5 files changed, 30 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -116,6 +116,7 @@ static const struct ath11k_hw_params ath + .tcl_ring_retry = true, + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, ++ .ftm_responder = true, + }, + { + .hw_rev = ATH11K_HW_IPQ6018_HW10, +@@ -198,6 +199,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = false, ++ .ftm_responder = true, + }, + { + .name = "qca6390 hw2.0", +@@ -282,6 +284,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = true, ++ .ftm_responder = false, + }, + { + .name = "qcn9074 hw1.0", +@@ -363,6 +366,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = false, ++ .ftm_responder = true, + }, + { + .name = "wcn6855 hw2.0", +@@ -447,6 +451,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = true, ++ .ftm_responder = false, + }, + { + .name = "wcn6855 hw2.1", +@@ -529,6 +534,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = true, ++ .ftm_responder = false, + }, + { + .name = "wcn6750 hw1.0", +@@ -609,6 +615,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750, + .smp2p_wow_exit = true, + .support_fw_mac_sequence = true, ++ .ftm_responder = false, + }, + { + .hw_rev = ATH11K_HW_IPQ5018_HW10, +@@ -688,6 +695,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = false, ++ .ftm_responder = true, + }, + }; + +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -346,6 +346,7 @@ struct ath11k_vif { + + bool is_started; + bool is_up; ++ bool ftm_responder; + bool spectral_enabled; + bool ps; + u32 aid; +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -224,6 +224,7 @@ struct ath11k_hw_params { + u32 tx_ring_size; + bool smp2p_wow_exit; + bool support_fw_mac_sequence; ++ bool ftm_responder; + }; + + struct ath11k_hw_ops { +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -3110,7 +3110,7 @@ static void ath11k_mac_op_bss_info_chang + u16 bitrate; + int ret = 0; + u8 rateidx; +- u32 rate; ++ u32 rate, param; + u32 ipv4_cnt; + + mutex_lock(&ar->conf_mutex); +@@ -3412,6 +3412,20 @@ static void ath11k_mac_op_bss_info_chang + } + } + ++ if (changed & BSS_CHANGED_FTM_RESPONDER && ++ arvif->ftm_responder != info->ftm_responder && ++ ar->ab->hw_params.ftm_responder && ++ (vif->type == NL80211_IFTYPE_AP || ++ vif->type == NL80211_IFTYPE_MESH_POINT)) { ++ arvif->ftm_responder = info->ftm_responder; ++ param = WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE; ++ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, ++ arvif->ftm_responder); ++ if (ret) ++ ath11k_warn(ar->ab, "Failed to set ftm responder %i: %d\n", ++ arvif->vdev_id, ret); ++ } ++ + if (changed & BSS_CHANGED_FILS_DISCOVERY || + changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP) + ath11k_mac_fils_discovery(arvif, info); +@@ -9113,6 +9127,10 @@ static int __ath11k_mac_register(struct + wiphy_ext_feature_set(ar->hw->wiphy, + NL80211_EXT_FEATURE_SET_SCAN_DWELL); + ++ if (ab->hw_params.ftm_responder) ++ wiphy_ext_feature_set(ar->hw->wiphy, ++ NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER); ++ + ath11k_reg_init(ar); + + if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) { +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -1073,6 +1073,7 @@ enum wmi_tlv_vdev_param { + WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE, + WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME, + WMI_VDEV_PARAM_HE_LTF = 0x74, ++ WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE = 0x7d, + WMI_VDEV_PARAM_BA_MODE = 0x7e, + WMI_VDEV_PARAM_AUTORATE_MISC_CFG = 0x80, + WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE = 0x87, diff --git a/package/kernel/mac80211/patches/ath11k/0030-wifi-ath11k-add-channel-177-into-5-GHz-channel-list.patch b/package/kernel/mac80211/patches/ath11k/0030-wifi-ath11k-add-channel-177-into-5-GHz-channel-list.patch new file mode 100644 index 0000000000..d0ed9c54b8 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0030-wifi-ath11k-add-channel-177-into-5-GHz-channel-list.patch @@ -0,0 +1,41 @@ +From e5e94d10c85653609a2893c8d0ef24a27471b68f Mon Sep 17 00:00:00 2001 +From: Wen Gong +Date: Tue, 10 Jan 2023 15:30:58 +0200 +Subject: [PATCH] wifi: ath11k: add channel 177 into 5 GHz channel list + +Add support for the 5 GHz channel 177 with center frequency 5885 MHz and +operating class 125 per IEEE Std 802.11ax-2021, Table E-4. + +Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3 + +Signed-off-by: Wen Gong +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221220101912.30816-1-quic_wgong@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.h | 4 ++-- + drivers/net/wireless/ath/ath11k/mac.c | 1 + + 2 files changed, 3 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -521,8 +521,8 @@ struct ath11k_sta { + #define ATH11K_MIN_5G_FREQ 4150 + #define ATH11K_MIN_6G_FREQ 5925 + #define ATH11K_MAX_6G_FREQ 7115 +-#define ATH11K_NUM_CHANS 101 +-#define ATH11K_MAX_5G_CHAN 173 ++#define ATH11K_NUM_CHANS 102 ++#define ATH11K_MAX_5G_CHAN 177 + + enum ath11k_state { + ATH11K_STATE_OFF, +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -96,6 +96,7 @@ static const struct ieee80211_channel at + CHAN5G(165, 5825, 0), + CHAN5G(169, 5845, 0), + CHAN5G(173, 5865, 0), ++ CHAN5G(177, 5885, 0), + }; + + static const struct ieee80211_channel ath11k_6ghz_channels[] = { diff --git a/package/kernel/mac80211/patches/ath11k/0031-wifi-ath11k-fix-ce-memory-mapping-for-ahb-devices.patch b/package/kernel/mac80211/patches/ath11k/0031-wifi-ath11k-fix-ce-memory-mapping-for-ahb-devices.patch new file mode 100644 index 0000000000..2786799972 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0031-wifi-ath11k-fix-ce-memory-mapping-for-ahb-devices.patch @@ -0,0 +1,114 @@ +From 53a998c4d7284debd77734d01e1466e59a1d03b2 Mon Sep 17 00:00:00 2001 +From: Raj Kumar Bhagat +Date: Fri, 13 Jan 2023 12:02:09 +0530 +Subject: [PATCH] wifi: ath11k: fix ce memory mapping for ahb devices + +Currently ath11k_ahb module is not loaded successfully and the wifi +interface is not created. Kernel trace is seen while loading the +ath11k_ahb module. The issue is seen in all ath11k AHB devices except +in IPQ5018. + +This happens because in ath11k_ahb_probe(), ab->mem_ce is initialized +with the value of ab->mem. However, at this instant ab->mem is not +yet set. + +Later, during write to a particular memory via ath11k_ahb_write32() +this ab->mem_ce is used with particular offset. Since ab->mem_ce is +not set properly this possibly leads to memory conflict to handle +kernel paging request and the below trace is seen. + +[ 93.035047] Unable to handle kernel paging request at virtual address ffff800100a00000 +[ 93.035083] Mem abort info: +[ 93.041869] ESR = 0x0000000096000045 +[ 93.044561] EC = 0x25: DABT (current EL), IL = 32 bits +[ 93.048377] SET = 0, FnV = 0 +[ 93.053840] EA = 0, S1PTW = 0 +[ 93.056704] FSC = 0x05: level 1 translation fault +[ 93.059745] Data abort info: +[ 93.064603] ISV = 0, ISS = 0x00000045 +[ 93.067729] CM = 0, WnR = 1 +[ 93.071287] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000042219000 +[ 93.074409] [ffff800100a00000] pgd=100000007ffff003, p4d=100000007ffff003, pud=0000000000000000 +[ 93.081195] Internal error: Oops: 0000000096000045 [#1] PREEMPT SMP +[ 93.089598] Modules linked in: ath11k_ahb ath11k_pci ath11k qmi_helpers +[ 93.095851] CPU: 2 PID: 66 Comm: kworker/u8:3 Not tainted 6.1.0-rc8-wt-ath-658126-g58e4b9df840c-dirty #2 +[ 93.102454] Hardware name: Qualcomm Technologies, Inc. IPQ8074/AP-HK14 (DT) +[ 93.112171] Workqueue: ath11k_qmi_driver_event ath11k_qmi_driver_event_work [ath11k] +[ 93.118856] pstate: 40000005 (nZcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) +[ 93.126838] pc : ath11k_ahb_write32+0xc/0x18 [ath11k_ahb] +[ 93.133520] lr : ath11k_hal_srng_setup+0x860/0x8f0 [ath11k] +[ 93.139075] sp : ffff80000aaebb70 +[ 93.144452] x29: ffff80000aaebb70 x28: 0000000000000020 x27: ffff80000aaebc50 +[ 93.147934] x26: ffff000004923750 x25: ffff000004921200 x24: ffff000004928000 +[ 93.155051] x23: 0000000000000020 x22: ffff000004930000 x21: ffff000004923200 +[ 93.162170] x20: ffff000004920000 x19: 00000000eea00000 x18: ffff0000049200f0 +[ 93.169288] x17: 0000000000000000 x16: 0000000000000000 x15: 000000000000025e +[ 93.176405] x14: ffff000003c414f0 x13: 0000000000000000 x12: 0000000000000008 +[ 93.183524] x11: ffff000003c41488 x10: 0000000000000040 x9 : 0000000000000000 +[ 93.190641] x8 : ffff80000a9dd100 x7 : 0000000000000000 x6 : 000000000000003f +[ 93.197759] x5 : ffff800100a00400 x4 : ffff8000031f4018 x3 : 0000000000000004 +[ 93.204877] x2 : 0000000047b62000 x1 : ffff800100a00000 x0 : ffff800012000000 +[ 93.211996] Call trace: +[ 93.219104] ath11k_ahb_write32+0xc/0x18 [ath11k_ahb] +[ 93.221366] ath11k_ce_init_ring+0x184/0x278 [ath11k] +[ 93.226576] ath11k_ce_init_pipes+0x4c/0x1a0 [ath11k] +[ 93.231610] ath11k_core_qmi_firmware_ready+0x3c/0x568 [ath11k] +[ 93.236646] ath11k_qmi_driver_event_work+0x168/0x4f8 [ath11k] +[ 93.242376] process_one_work+0x144/0x350 +[ 93.248275] worker_thread+0x120/0x430 +[ 93.252352] kthread+0xf4/0x110 +[ 93.255997] ret_from_fork+0x10/0x20 +[ 93.259043] Code: d503201f f94e1c00 8b214001 d50332bf (b9000022) +[ 93.262863] ---[ end trace 0000000000000000 ]--- + +However, for the device IPQ5018 ath11k_hw_params .ce_remap is +defined. This parameter is used to recalculate ab->mem_ce and hence, +this issue is not seen in IPQ5018. + +Hence, fix this by initializing ab->mem_ce after ab->mem is set. +ab->mem is set inside the ath11k_ahb_setup_resources() therefore +initialize ab->mem_ce after ath11k_ahb_setup_resources(). + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Fixes: b42b3678c91f ("wifi: ath11k: remap ce register space for IPQ5018") + +Signed-off-by: Raj Kumar Bhagat +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230113063209.7256-1-quic_rajkbhag@quicinc.com +--- + drivers/net/wireless/ath/ath11k/ahb.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -1157,12 +1157,16 @@ static int ath11k_ahb_probe(struct platf + goto err_core_free; + } + +- ab->mem_ce = ab->mem; +- + ret = ath11k_core_pre_init(ab); + if (ret) + goto err_core_free; + ++ ret = ath11k_ahb_setup_resources(ab); ++ if (ret) ++ goto err_core_free; ++ ++ ab->mem_ce = ab->mem; ++ + if (ab->hw_params.ce_remap) { + const struct ce_remap *ce_remap = ab->hw_params.ce_remap; + /* ce register space is moved out of wcss unlike ipq8074 or ipq6018 +@@ -1177,10 +1181,6 @@ static int ath11k_ahb_probe(struct platf + } + } + +- ret = ath11k_ahb_setup_resources(ab); +- if (ret) +- goto err_core_free; +- + ret = ath11k_ahb_fw_resources_init(ab); + if (ret) + goto err_core_free; diff --git a/package/kernel/mac80211/patches/ath11k/0033-wifi-ath11k-Set-ext-passive-scan-flag-to-adjust-pass.patch b/package/kernel/mac80211/patches/ath11k/0033-wifi-ath11k-Set-ext-passive-scan-flag-to-adjust-pass.patch new file mode 100644 index 0000000000..79b79e1053 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0033-wifi-ath11k-Set-ext-passive-scan-flag-to-adjust-pass.patch @@ -0,0 +1,73 @@ +From cf8f3d4deb02a8fdc806c46d4112b69868544697 Mon Sep 17 00:00:00 2001 +From: Tamizh Chelvam Raja +Date: Wed, 15 Feb 2023 20:31:36 +0200 +Subject: [PATCH] wifi: ath11k: Set ext passive scan flag to adjust passive + scan start time + +Set the WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE flag +while sending the scan command. If this flag is enabled when the +incoming scan request comes with a strict start time and its duration +overlaps with next TBTT, then target adjust the start time accordingly +for passive scan. Target supporting this feature will advertise +WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01467-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Tamizh Chelvam Raja +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221222131720.11368-1-quic_tamizhr@quicinc.com +--- + drivers/net/wireless/ath/ath11k/wmi.c | 8 ++++++++ + drivers/net/wireless/ath/ath11k/wmi.h | 3 +++ + 2 files changed, 11 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -2068,6 +2068,12 @@ void ath11k_wmi_start_scan_init(struct a + WMI_SCAN_EVENT_FOREIGN_CHAN | + WMI_SCAN_EVENT_DEQUEUED; + arg->scan_flags |= WMI_SCAN_CHAN_STAT_EVENT; ++ ++ if (test_bit(WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE, ++ ar->ab->wmi_ab.svc_map)) ++ arg->scan_ctrl_flags_ext |= ++ WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE; ++ + arg->num_bssid = 1; + + /* fill bssid_list[0] with 0xff, otherwise bssid and RA will be +@@ -2149,6 +2155,8 @@ ath11k_wmi_copy_scan_event_cntrl_flags(s + /* for adaptive scan mode using 3 bits (21 - 23 bits) */ + WMI_SCAN_SET_DWELL_MODE(cmd->scan_ctrl_flags, + param->adaptive_dwell_time_mode); ++ ++ cmd->scan_ctrl_flags_ext = param->scan_ctrl_flags_ext; + } + + int ath11k_wmi_send_scan_start_cmd(struct ath11k *ar, +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -2093,6 +2093,7 @@ enum wmi_tlv_service { + WMI_TLV_SERVICE_EXT2_MSG = 220, + WMI_TLV_SERVICE_PEER_POWER_SAVE_DURATION_SUPPORT = 246, + WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT = 249, ++ WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE = 263, + + /* The second 128 bits */ + WMI_MAX_EXT_SERVICE = 256, +@@ -3223,6 +3224,7 @@ struct wmi_start_scan_cmd { + + #define WMI_SCAN_DWELL_MODE_MASK 0x00E00000 + #define WMI_SCAN_DWELL_MODE_SHIFT 21 ++#define WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE 0x00000800 + + enum { + WMI_SCAN_DWELL_MODE_DEFAULT = 0, +@@ -3270,6 +3272,7 @@ struct scan_req_params { + }; + u32 scan_events; + }; ++ u32 scan_ctrl_flags_ext; + u32 dwell_time_active; + u32 dwell_time_active_2g; + u32 dwell_time_passive; diff --git a/package/kernel/mac80211/patches/ath11k/0034-wifi-ath11k-fix-return-value-check-in-ath11k_ahb_pro.patch b/package/kernel/mac80211/patches/ath11k/0034-wifi-ath11k-fix-return-value-check-in-ath11k_ahb_pro.patch new file mode 100644 index 0000000000..59132913bd --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0034-wifi-ath11k-fix-return-value-check-in-ath11k_ahb_pro.patch @@ -0,0 +1,27 @@ +From 342fcde9d91460f01f65707e16368a1571271a3a Mon Sep 17 00:00:00 2001 +From: Yang Yingliang +Date: Fri, 17 Feb 2023 11:00:31 +0800 +Subject: [PATCH] wifi: ath11k: fix return value check in ath11k_ahb_probe() + +ioremap() returns NULL pointer not PTR_ERR() when it fails, +so replace the IS_ERR() check with NULL pointer check. + +Fixes: b42b3678c91f ("wifi: ath11k: remap ce register space for IPQ5018") +Signed-off-by: Yang Yingliang +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230217030031.4021289-1-yangyingliang@huawei.com +--- + drivers/net/wireless/ath/ath11k/ahb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -1174,7 +1174,7 @@ static int ath11k_ahb_probe(struct platf + * to a new space for accessing them. + */ + ab->mem_ce = ioremap(ce_remap->base, ce_remap->size); +- if (IS_ERR(ab->mem_ce)) { ++ if (!ab->mem_ce) { + dev_err(&pdev->dev, "ce ioremap error\n"); + ret = -ENOMEM; + goto err_core_free; diff --git a/package/kernel/mac80211/patches/ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch b/package/kernel/mac80211/patches/ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch new file mode 100644 index 0000000000..93a9da8fc2 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch @@ -0,0 +1,50 @@ +From f117276638b7600b981b3fe28550823cfbe1ef23 Mon Sep 17 00:00:00 2001 +From: Douglas Anderson +Date: Wed, 1 Feb 2023 08:54:42 -0800 +Subject: [PATCH] wifi: ath11k: Use platform_get_irq() to get the interrupt + +As of commit a1a2b7125e10 ("of/platform: Drop static setup of IRQ +resource from DT core"), we need to use platform_get_irq() instead of +platform_get_resource() to get our IRQs because +platform_get_resource() simply won't get them anymore. + +This was already fixed in several other Atheros WiFi drivers, +apparently in response to Zeal Robot reports. An example of another +fix is commit 9503a1fc123d ("ath9k: Use platform_get_irq() to get the +interrupt"). ath11k seems to have been missed in this effort, though. + +Without this change, WiFi wasn't coming up on my Qualcomm sc7280-based +hardware. Specifically, "platform_get_resource(pdev, IORESOURCE_IRQ, +i)" was failing even for i=0. + +Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 + +Fixes: a1a2b7125e10 ("of/platform: Drop static setup of IRQ resource from DT core") +Fixes: 00402f49d26f ("ath11k: Add support for WCN6750 device") +Signed-off-by: Douglas Anderson +Tested-by: Jun Yu +Reviewed-by: Lad Prabhakar +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230201084131.v2.1.I69cf3d56c97098287fe3a70084ee515098390b70@changeid +--- + drivers/net/wireless/ath/ath11k/ahb.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -874,11 +874,11 @@ static int ath11k_ahb_setup_msi_resource + ab->pci.msi.ep_base_data = int_prop + 32; + + for (i = 0; i < ab->pci.msi.config->total_vectors; i++) { +- res = platform_get_resource(pdev, IORESOURCE_IRQ, i); +- if (!res) +- return -ENODEV; ++ ret = platform_get_irq(pdev, i); ++ if (ret < 0) ++ return ret; + +- ab->pci.msi.irqs[i] = res->start; ++ ab->pci.msi.irqs[i] = ret; + } + + set_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags); diff --git a/package/kernel/mac80211/patches/ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch b/package/kernel/mac80211/patches/ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch new file mode 100644 index 0000000000..b37f070ba6 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch @@ -0,0 +1,53 @@ +From 60b7d62ba8cdbd073997bff0f1cdae8d844002c0 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Thu, 9 Feb 2023 23:26:22 +0100 +Subject: [PATCH] wifi: ath11k: fix SAC bug on peer addition with sta band + migration + +Fix sleep in atomic context warning detected by Smatch static checker +analyzer. + +Following the locking pattern for peer_rhash_add lock tbl_mtx_lock mutex +always even if sta is not transitioning to another band. +This is peer_add function and a more secure locking should not cause +performance regression. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1 + +Fixes: d673cb6fe6c0 ("wifi: ath11k: fix peer addition/deletion error on sta band migration") +Reported-by: Dan Carpenter +Signed-off-by: Christian Marangi +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230209222622.1751-1-ansuelsmth@gmail.com +--- + drivers/net/wireless/ath/ath11k/peer.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/peer.c ++++ b/drivers/net/wireless/ath/ath11k/peer.c +@@ -382,22 +382,23 @@ int ath11k_peer_create(struct ath11k *ar + return -ENOBUFS; + } + ++ mutex_lock(&ar->ab->tbl_mtx_lock); + spin_lock_bh(&ar->ab->base_lock); + peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr); + if (peer) { + if (peer->vdev_id == param->vdev_id) { + spin_unlock_bh(&ar->ab->base_lock); ++ mutex_unlock(&ar->ab->tbl_mtx_lock); + return -EINVAL; + } + + /* Assume sta is transitioning to another band. + * Remove here the peer from rhash. + */ +- mutex_lock(&ar->ab->tbl_mtx_lock); + ath11k_peer_rhash_delete(ar->ab, peer); +- mutex_unlock(&ar->ab->tbl_mtx_lock); + } + spin_unlock_bh(&ar->ab->base_lock); ++ mutex_unlock(&ar->ab->tbl_mtx_lock); + + ret = ath11k_wmi_send_peer_create_cmd(ar, param); + if (ret) { diff --git a/package/kernel/mac80211/patches/ath11k/0037-wifi-ath11k-allow-system-suspend-to-survive-ath11k.patch b/package/kernel/mac80211/patches/ath11k/0037-wifi-ath11k-allow-system-suspend-to-survive-ath11k.patch new file mode 100644 index 0000000000..fa680954e6 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0037-wifi-ath11k-allow-system-suspend-to-survive-ath11k.patch @@ -0,0 +1,43 @@ +From 7c15430822e71e90203d87e6d0cfe83fa058b0dc Mon Sep 17 00:00:00 2001 +From: Len Brown +Date: Wed, 1 Feb 2023 12:32:01 -0600 +Subject: [PATCH] wifi: ath11k: allow system suspend to survive ath11k + +When ath11k runs into internal errors upon suspend, +it returns an error code to pci_pm_suspend, which +aborts the entire system suspend. + +The driver should not abort system suspend, but should +keep its internal errors to itself, and allow the system +to suspend. Otherwise, a user can suspend a laptop +by closing the lid and sealing it into a case, assuming +that is will suspend, rather than heating up and draining +the battery when in transit. + +In practice, the ath11k device seems to have plenty of transient +errors, and subsequent suspend cycles after this failure +often succeed. + +https://bugzilla.kernel.org/show_bug.cgi?id=216968 + +Fixes: d1b0c33850d29 ("ath11k: implement suspend for QCA6390 PCI devices") + +Signed-off-by: Len Brown +Cc: stable@vger.kernel.org +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230201183201.14431-1-len.brown@intel.com +--- + drivers/net/wireless/ath/ath11k/pci.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/pci.c ++++ b/drivers/net/wireless/ath/ath11k/pci.c +@@ -998,7 +998,7 @@ static __maybe_unused int ath11k_pci_pm_ + if (ret) + ath11k_warn(ab, "failed to resume core: %d\n", ret); + +- return ret; ++ return 0; + } + + static SIMPLE_DEV_PM_OPS(ath11k_pci_pm_ops, diff --git a/package/kernel/mac80211/patches/ath11k/0038-wifi-ath11k-modify-accessor-macros-to-match-index-si.patch b/package/kernel/mac80211/patches/ath11k/0038-wifi-ath11k-modify-accessor-macros-to-match-index-si.patch new file mode 100644 index 0000000000..42bf170a03 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0038-wifi-ath11k-modify-accessor-macros-to-match-index-si.patch @@ -0,0 +1,61 @@ +From a96f10422e74cde27c100b321b127ec32ae75747 Mon Sep 17 00:00:00 2001 +From: Muna Sinada +Date: Fri, 24 Feb 2023 12:28:03 +0200 +Subject: [PATCH] wifi: ath11k: modify accessor macros to match index size + +HE PHY is only 11 bytes, therefore it should be using byte indexes +instead of dword. Change corresponding macros to reflect this. + +Signed-off-by: Muna Sinada +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1666128501-12364-2-git-send-email-quic_msinada@quicinc.com +--- + drivers/net/wireless/ath/ath11k/wmi.h | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -2859,30 +2859,32 @@ struct rx_reorder_queue_remove_params { + #define WMI_VDEV_PARAM_TXBF_SU_TX_BFER BIT(2) + #define WMI_VDEV_PARAM_TXBF_MU_TX_BFER BIT(3) + +-#define HECAP_PHYDWORD_0 0 +-#define HECAP_PHYDWORD_1 1 +-#define HECAP_PHYDWORD_2 2 ++#define HE_PHYCAP_BYTE_0 0 ++#define HE_PHYCAP_BYTE_1 1 ++#define HE_PHYCAP_BYTE_2 2 ++#define HE_PHYCAP_BYTE_3 3 ++#define HE_PHYCAP_BYTE_4 4 + +-#define HECAP_PHY_SU_BFER BIT(31) ++#define HECAP_PHY_SU_BFER BIT(7) + #define HECAP_PHY_SU_BFEE BIT(0) + #define HECAP_PHY_MU_BFER BIT(1) +-#define HECAP_PHY_UL_MUMIMO BIT(22) +-#define HECAP_PHY_UL_MUOFDMA BIT(23) ++#define HECAP_PHY_UL_MUMIMO BIT(6) ++#define HECAP_PHY_UL_MUOFDMA BIT(7) + + #define HECAP_PHY_SUBFMR_GET(hecap_phy) \ +- FIELD_GET(HECAP_PHY_SU_BFER, hecap_phy[HECAP_PHYDWORD_0]) ++ FIELD_GET(HECAP_PHY_SU_BFER, hecap_phy[HE_PHYCAP_BYTE_3]) + + #define HECAP_PHY_SUBFME_GET(hecap_phy) \ +- FIELD_GET(HECAP_PHY_SU_BFEE, hecap_phy[HECAP_PHYDWORD_1]) ++ FIELD_GET(HECAP_PHY_SU_BFEE, hecap_phy[HE_PHYCAP_BYTE_4]) + + #define HECAP_PHY_MUBFMR_GET(hecap_phy) \ +- FIELD_GET(HECAP_PHY_MU_BFER, hecap_phy[HECAP_PHYDWORD_1]) ++ FIELD_GET(HECAP_PHY_MU_BFER, hecap_phy[HE_PHYCAP_BYTE_4]) + + #define HECAP_PHY_ULMUMIMO_GET(hecap_phy) \ +- FIELD_GET(HECAP_PHY_UL_MUMIMO, hecap_phy[HECAP_PHYDWORD_0]) ++ FIELD_GET(HECAP_PHY_UL_MUMIMO, hecap_phy[HE_PHYCAP_BYTE_2]) + + #define HECAP_PHY_ULOFDMA_GET(hecap_phy) \ +- FIELD_GET(HECAP_PHY_UL_MUOFDMA, hecap_phy[HECAP_PHYDWORD_0]) ++ FIELD_GET(HECAP_PHY_UL_MUOFDMA, hecap_phy[HE_PHYCAP_BYTE_2]) + + #define HE_MODE_SU_TX_BFEE BIT(0) + #define HE_MODE_SU_TX_BFER BIT(1) diff --git a/package/kernel/mac80211/patches/ath11k/0039-wifi-ath11k-push-MU-MIMO-params-from-hostapd-to-hard.patch b/package/kernel/mac80211/patches/ath11k/0039-wifi-ath11k-push-MU-MIMO-params-from-hostapd-to-hard.patch new file mode 100644 index 0000000000..298ce1a612 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0039-wifi-ath11k-push-MU-MIMO-params-from-hostapd-to-hard.patch @@ -0,0 +1,300 @@ +From 38dfe775d0abf511341f37c1cb77b919a3ad410b Mon Sep 17 00:00:00 2001 +From: Muna Sinada +Date: Fri, 24 Feb 2023 12:28:04 +0200 +Subject: [PATCH] wifi: ath11k: push MU-MIMO params from hostapd to hardware + +In the previous behaviour only HE IE in management frames are changed +regarding MU-MIMO configurations and not in hardware. Adding push of +MU-MIMO configurations to the hardware as well. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00356-QCAHKSWPL_SILICONZ-1 + +Co-developed-by: Anilkumar Kolli +Signed-off-by: Anilkumar Kolli +Signed-off-by: Muna Sinada +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1666128501-12364-3-git-send-email-quic_msinada@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 200 ++++++++++++++++---------- + drivers/net/wireless/ath/ath11k/wmi.h | 3 + + 2 files changed, 130 insertions(+), 73 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -2699,6 +2699,117 @@ static int ath11k_setup_peer_smps(struct + ath11k_smps_map[smps]); + } + ++static bool ath11k_mac_set_he_txbf_conf(struct ath11k_vif *arvif) ++{ ++ struct ath11k *ar = arvif->ar; ++ u32 param, value; ++ int ret; ++ ++ if (!arvif->vif->bss_conf.he_support) ++ return true; ++ ++ param = WMI_VDEV_PARAM_SET_HEMU_MODE; ++ value = 0; ++ if (arvif->vif->bss_conf.he_su_beamformer) { ++ value |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE); ++ if (arvif->vif->bss_conf.he_mu_beamformer && ++ arvif->vdev_type == WMI_VDEV_TYPE_AP) ++ value |= FIELD_PREP(HE_MODE_MU_TX_BFER, HE_MU_BFER_ENABLE); ++ } ++ ++ if (arvif->vif->type != NL80211_IFTYPE_MESH_POINT) { ++ value |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) | ++ FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE); ++ ++ if (arvif->vif->bss_conf.he_full_ul_mumimo) ++ value |= FIELD_PREP(HE_MODE_UL_MUMIMO, HE_UL_MUMIMO_ENABLE); ++ ++ if (arvif->vif->bss_conf.he_su_beamformee) ++ value |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE); ++ } ++ ++ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); ++ if (ret) { ++ ath11k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n", ++ arvif->vdev_id, ret); ++ return false; ++ } ++ ++ param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE; ++ value = FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) | ++ FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE, ++ HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE); ++ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, ++ param, value); ++ if (ret) { ++ ath11k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n", ++ arvif->vdev_id, ret); ++ return false; ++ } ++ return true; ++} ++ ++static bool ath11k_mac_vif_recalc_sta_he_txbf(struct ath11k *ar, ++ struct ieee80211_vif *vif, ++ struct ieee80211_sta_he_cap *he_cap) ++{ ++ struct ath11k_vif *arvif = (void *)vif->drv_priv; ++ struct ieee80211_he_cap_elem he_cap_elem = {0}; ++ struct ieee80211_sta_he_cap *cap_band = NULL; ++ struct cfg80211_chan_def def; ++ u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE; ++ u32 hemode = 0; ++ int ret; ++ ++ if (!vif->bss_conf.he_support) ++ return true; ++ ++ if (vif->type != NL80211_IFTYPE_STATION) ++ return false; ++ ++ if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) ++ return false; ++ ++ if (def.chan->band == NL80211_BAND_2GHZ) ++ cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap; ++ else ++ cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap; ++ ++ memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem)); ++ ++ if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) { ++ if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) ++ hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE); ++ if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) ++ hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE); ++ } ++ ++ if (vif->type != NL80211_IFTYPE_MESH_POINT) { ++ hemode |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) | ++ FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE); ++ ++ if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info)) ++ if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info)) ++ hemode |= FIELD_PREP(HE_MODE_UL_MUMIMO, ++ HE_UL_MUMIMO_ENABLE); ++ ++ if (FIELD_GET(HE_MODE_MU_TX_BFEE, hemode)) ++ hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE); ++ ++ if (FIELD_GET(HE_MODE_MU_TX_BFER, hemode)) ++ hemode |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE); ++ } ++ ++ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, hemode); ++ if (ret) { ++ ath11k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n", ++ hemode, ret); ++ return false; ++ } ++ ++ return true; ++} ++ + static void ath11k_bss_assoc(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + struct ieee80211_bss_conf *bss_conf) +@@ -2709,6 +2820,7 @@ static void ath11k_bss_assoc(struct ieee + struct ieee80211_sta *ap_sta; + struct ath11k_peer *peer; + bool is_auth = false; ++ struct ieee80211_sta_he_cap he_cap; + int ret; + + lockdep_assert_held(&ar->conf_mutex); +@@ -2726,6 +2838,9 @@ static void ath11k_bss_assoc(struct ieee + return; + } + ++ /* he_cap here is updated at assoc success for sta mode only */ ++ he_cap = ap_sta->deflink.he_cap; ++ + ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false); + + rcu_read_unlock(); +@@ -2753,6 +2868,12 @@ static void ath11k_bss_assoc(struct ieee + return; + } + ++ if (!ath11k_mac_vif_recalc_sta_he_txbf(ar, vif, &he_cap)) { ++ ath11k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM\n", ++ arvif->vdev_id, bss_conf->bssid); ++ return; ++ } ++ + WARN_ON(arvif->is_up); + + arvif->aid = vif->cfg.aid; +@@ -3202,6 +3323,8 @@ static void ath11k_mac_op_bss_info_chang + ether_addr_copy(arvif->bssid, info->bssid); + + if (changed & BSS_CHANGED_BEACON_ENABLED) { ++ if (info->enable_beacon) ++ ath11k_mac_set_he_txbf_conf(arvif); + ath11k_control_beaconing(arvif, info); + + if (arvif->is_up && vif->bss_conf.he_support && +@@ -5392,6 +5515,10 @@ static int ath11k_mac_copy_he_cap(struct + + he_cap_elem->mac_cap_info[1] &= + IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK; ++ he_cap_elem->phy_cap_info[0] &= ++ ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; ++ he_cap_elem->phy_cap_info[0] &= ++ ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; + + he_cap_elem->phy_cap_info[5] &= + ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK; +@@ -6026,69 +6153,6 @@ ath11k_mac_setup_vdev_create_params(stru + } + } + +-static u32 +-ath11k_mac_prepare_he_mode(struct ath11k_pdev *pdev, u32 viftype) +-{ +- struct ath11k_pdev_cap *pdev_cap = &pdev->cap; +- struct ath11k_band_cap *cap_band = NULL; +- u32 *hecap_phy_ptr = NULL; +- u32 hemode = 0; +- +- if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) +- cap_band = &pdev_cap->band[NL80211_BAND_2GHZ]; +- else +- cap_band = &pdev_cap->band[NL80211_BAND_5GHZ]; +- +- hecap_phy_ptr = &cap_band->he_cap_phy_info[0]; +- +- hemode = FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE) | +- FIELD_PREP(HE_MODE_SU_TX_BFER, HECAP_PHY_SUBFMR_GET(hecap_phy_ptr)) | +- FIELD_PREP(HE_MODE_UL_MUMIMO, HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr)); +- +- /* TODO WDS and other modes */ +- if (viftype == NL80211_IFTYPE_AP) { +- hemode |= FIELD_PREP(HE_MODE_MU_TX_BFER, +- HECAP_PHY_MUBFMR_GET(hecap_phy_ptr)) | +- FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) | +- FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE); +- } else { +- hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE); +- } +- +- return hemode; +-} +- +-static int ath11k_set_he_mu_sounding_mode(struct ath11k *ar, +- struct ath11k_vif *arvif) +-{ +- u32 param_id, param_value; +- struct ath11k_base *ab = ar->ab; +- int ret = 0; +- +- param_id = WMI_VDEV_PARAM_SET_HEMU_MODE; +- param_value = ath11k_mac_prepare_he_mode(ar->pdev, arvif->vif->type); +- ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, +- param_id, param_value); +- if (ret) { +- ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n", +- arvif->vdev_id, ret, param_value); +- return ret; +- } +- param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE; +- param_value = +- FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) | +- FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE, +- HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE); +- ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, +- param_id, param_value); +- if (ret) { +- ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d\n", +- arvif->vdev_id, ret); +- return ret; +- } +- return ret; +-} +- + static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw, + struct ieee80211_vif *vif) + { +@@ -6757,7 +6821,6 @@ ath11k_mac_vdev_start_restart(struct ath + struct ath11k_base *ab = ar->ab; + struct wmi_vdev_start_req_arg arg = {}; + const struct cfg80211_chan_def *chandef = &ctx->def; +- int he_support = arvif->vif->bss_conf.he_support; + int ret = 0; + + lockdep_assert_held(&ar->conf_mutex); +@@ -6798,15 +6861,6 @@ ath11k_mac_vdev_start_restart(struct ath + spin_lock_bh(&ab->base_lock); + arg.regdomain = ar->ab->dfs_region; + spin_unlock_bh(&ab->base_lock); +- +- if (he_support) { +- ret = ath11k_set_he_mu_sounding_mode(ar, arvif); +- if (ret) { +- ath11k_warn(ar->ab, "failed to set he mode vdev %i\n", +- arg.vdev_id); +- return ret; +- } +- } + } + + arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -2897,8 +2897,11 @@ struct rx_reorder_queue_remove_params { + #define HE_DL_MUOFDMA_ENABLE 1 + #define HE_UL_MUOFDMA_ENABLE 1 + #define HE_DL_MUMIMO_ENABLE 1 ++#define HE_UL_MUMIMO_ENABLE 1 + #define HE_MU_BFEE_ENABLE 1 + #define HE_SU_BFEE_ENABLE 1 ++#define HE_MU_BFER_ENABLE 1 ++#define HE_SU_BFER_ENABLE 1 + + #define HE_VHT_SOUNDING_MODE_ENABLE 1 + #define HE_SU_MU_SOUNDING_MODE_ENABLE 1 diff --git a/package/kernel/mac80211/patches/ath11k/0040-wifi-ath11k-move-HE-MCS-mapper-to-a-separate-functio.patch b/package/kernel/mac80211/patches/ath11k/0040-wifi-ath11k-move-HE-MCS-mapper-to-a-separate-functio.patch new file mode 100644 index 0000000000..6bc9880e10 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0040-wifi-ath11k-move-HE-MCS-mapper-to-a-separate-functio.patch @@ -0,0 +1,67 @@ +From 8077c1bbbc28e527fb29143c46f32c6a9d6cadf0 Mon Sep 17 00:00:00 2001 +From: Muna Sinada +Date: Fri, 24 Feb 2023 12:28:04 +0200 +Subject: [PATCH] wifi: ath11k: move HE MCS mapper to a separate function + +Move HE MCS mapper to a separate function and call new function +in ath11k_mac_copy_he_cap(). + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00356-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Muna Sinada +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1666128501-12364-4-git-send-email-quic_msinada@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 34 +++++++++++++++++---------- + 1 file changed, 22 insertions(+), 12 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -5483,6 +5483,27 @@ static __le16 ath11k_mac_setup_he_6ghz_c + return cpu_to_le16(bcap->he_6ghz_capa); + } + ++static void ath11k_mac_set_hemcsmap(struct ath11k *ar, ++ struct ath11k_pdev_cap *cap, ++ struct ieee80211_sta_he_cap *he_cap, ++ int band) ++{ ++ struct ath11k_band_cap *band_cap = &cap->band[band]; ++ ++ he_cap->he_mcs_nss_supp.rx_mcs_80 = ++ cpu_to_le16(band_cap->he_mcs & 0xffff); ++ he_cap->he_mcs_nss_supp.tx_mcs_80 = ++ cpu_to_le16(band_cap->he_mcs & 0xffff); ++ he_cap->he_mcs_nss_supp.rx_mcs_160 = ++ cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); ++ he_cap->he_mcs_nss_supp.tx_mcs_160 = ++ cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); ++ he_cap->he_mcs_nss_supp.rx_mcs_80p80 = ++ cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); ++ he_cap->he_mcs_nss_supp.tx_mcs_80p80 = ++ cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); ++} ++ + static int ath11k_mac_copy_he_cap(struct ath11k *ar, + struct ath11k_pdev_cap *cap, + struct ieee80211_sband_iftype_data *data, +@@ -5544,18 +5565,7 @@ static int ath11k_mac_copy_he_cap(struct + break; + } + +- he_cap->he_mcs_nss_supp.rx_mcs_80 = +- cpu_to_le16(band_cap->he_mcs & 0xffff); +- he_cap->he_mcs_nss_supp.tx_mcs_80 = +- cpu_to_le16(band_cap->he_mcs & 0xffff); +- he_cap->he_mcs_nss_supp.rx_mcs_160 = +- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); +- he_cap->he_mcs_nss_supp.tx_mcs_160 = +- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); +- he_cap->he_mcs_nss_supp.rx_mcs_80p80 = +- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); +- he_cap->he_mcs_nss_supp.tx_mcs_80p80 = +- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); ++ ath11k_mac_set_hemcsmap(ar, cap, he_cap, band); + + memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); + if (he_cap_elem->phy_cap_info[6] & diff --git a/package/kernel/mac80211/patches/ath11k/0041-wifi-ath11k-generate-rx-and-tx-mcs-maps-for-supporte.patch b/package/kernel/mac80211/patches/ath11k/0041-wifi-ath11k-generate-rx-and-tx-mcs-maps-for-supporte.patch new file mode 100644 index 0000000000..5cb7801b29 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0041-wifi-ath11k-generate-rx-and-tx-mcs-maps-for-supporte.patch @@ -0,0 +1,64 @@ +From ebf82988f844dd98e6b007cffcc5e95986056995 Mon Sep 17 00:00:00 2001 +From: Muna Sinada +Date: Fri, 24 Feb 2023 12:28:04 +0200 +Subject: [PATCH] wifi: ath11k: generate rx and tx mcs maps for supported HE + mcs + +Generate rx and tx mcs maps in ath11k_mac_set_hemcsmap() and set them +in supported mcs/nss for HE capabilities. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00356-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Muna Sinada +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1666128501-12364-5-git-send-email-quic_msinada@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 30 ++++++++++++++++++++------- + 1 file changed, 23 insertions(+), 7 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -5488,20 +5488,36 @@ static void ath11k_mac_set_hemcsmap(stru + struct ieee80211_sta_he_cap *he_cap, + int band) + { +- struct ath11k_band_cap *band_cap = &cap->band[band]; ++ u16 txmcs_map, rxmcs_map; ++ u32 i; + ++ rxmcs_map = 0; ++ txmcs_map = 0; ++ for (i = 0; i < 8; i++) { ++ if (i < ar->num_tx_chains && ++ (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) ++ txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); ++ else ++ txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); ++ ++ if (i < ar->num_rx_chains && ++ (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) ++ rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); ++ else ++ rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); ++ } + he_cap->he_mcs_nss_supp.rx_mcs_80 = +- cpu_to_le16(band_cap->he_mcs & 0xffff); ++ cpu_to_le16(rxmcs_map & 0xffff); + he_cap->he_mcs_nss_supp.tx_mcs_80 = +- cpu_to_le16(band_cap->he_mcs & 0xffff); ++ cpu_to_le16(txmcs_map & 0xffff); + he_cap->he_mcs_nss_supp.rx_mcs_160 = +- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); ++ cpu_to_le16(rxmcs_map & 0xffff); + he_cap->he_mcs_nss_supp.tx_mcs_160 = +- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); ++ cpu_to_le16(txmcs_map & 0xffff); + he_cap->he_mcs_nss_supp.rx_mcs_80p80 = +- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); ++ cpu_to_le16(rxmcs_map & 0xffff); + he_cap->he_mcs_nss_supp.tx_mcs_80p80 = +- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); ++ cpu_to_le16(txmcs_map & 0xffff); + } + + static int ath11k_mac_copy_he_cap(struct ath11k *ar, diff --git a/package/kernel/mac80211/patches/ath11k/0042-wifi-ath11k-Add-tx-ack-signal-support-for-management.patch b/package/kernel/mac80211/patches/ath11k/0042-wifi-ath11k-Add-tx-ack-signal-support-for-management.patch new file mode 100644 index 0000000000..8d41657311 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0042-wifi-ath11k-Add-tx-ack-signal-support-for-management.patch @@ -0,0 +1,150 @@ +From 01c6c9fccbd51c1d9eab0f5794b0271b026178df Mon Sep 17 00:00:00 2001 +From: Abinaya Kalaiselvan +Date: Mon, 19 Dec 2022 11:08:44 +0530 +Subject: [PATCH] wifi: ath11k: Add tx ack signal support for management + packets + +Add support to notify tx ack signal values for management +packets to userspace through nl80211 interface. + +Advertise NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT flag +to enable this feature and it will be used for data +packets as well. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Abinaya Kalaiselvan +Signed-off-by: Maharaja Kennadyrajan +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20221219053844.4084486-1-quic_mkenna@quicinc.com +--- + drivers/net/wireless/ath/ath11k/hw.c | 1 + + drivers/net/wireless/ath/ath11k/mac.c | 5 +++++ + drivers/net/wireless/ath/ath11k/wmi.c | 27 ++++++++++++++++----------- + drivers/net/wireless/ath/ath11k/wmi.h | 3 +++ + 4 files changed, 25 insertions(+), 11 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -201,6 +201,7 @@ static void ath11k_init_wmi_config_ipq80 + config->twt_ap_pdev_count = ab->num_radios; + config->twt_ap_sta_count = 1000; + config->flag1 |= WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64; ++ config->flag1 |= WMI_RSRC_CFG_FLAG1_ACK_RSSI; + } + + static int ath11k_hw_mac_id_to_pdev_id_ipq8074(struct ath11k_hw_params *hw, +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -9174,6 +9174,11 @@ static int __ath11k_mac_register(struct + goto err_free_if_combs; + } + ++ if (test_bit(WMI_TLV_SERVICE_TX_DATA_MGMT_ACK_RSSI, ++ ar->ab->wmi_ab.svc_map)) ++ wiphy_ext_feature_set(ar->hw->wiphy, ++ NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT); ++ + ar->hw->queues = ATH11K_HW_MAX_QUEUES; + ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN; + ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1; +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -5229,8 +5229,8 @@ static int ath11k_pull_mgmt_rx_params_tl + return 0; + } + +-static int wmi_process_mgmt_tx_comp(struct ath11k *ar, u32 desc_id, +- u32 status) ++static int wmi_process_mgmt_tx_comp(struct ath11k *ar, ++ struct wmi_mgmt_tx_compl_event *tx_compl_param) + { + struct sk_buff *msdu; + struct ieee80211_tx_info *info; +@@ -5238,24 +5238,29 @@ static int wmi_process_mgmt_tx_comp(stru + int num_mgmt; + + spin_lock_bh(&ar->txmgmt_idr_lock); +- msdu = idr_find(&ar->txmgmt_idr, desc_id); ++ msdu = idr_find(&ar->txmgmt_idr, tx_compl_param->desc_id); + + if (!msdu) { + ath11k_warn(ar->ab, "received mgmt tx compl for invalid msdu_id: %d\n", +- desc_id); ++ tx_compl_param->desc_id); + spin_unlock_bh(&ar->txmgmt_idr_lock); + return -ENOENT; + } + +- idr_remove(&ar->txmgmt_idr, desc_id); ++ idr_remove(&ar->txmgmt_idr, tx_compl_param->desc_id); + spin_unlock_bh(&ar->txmgmt_idr_lock); + + skb_cb = ATH11K_SKB_CB(msdu); + dma_unmap_single(ar->ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE); + + info = IEEE80211_SKB_CB(msdu); +- if ((!(info->flags & IEEE80211_TX_CTL_NO_ACK)) && !status) ++ if ((!(info->flags & IEEE80211_TX_CTL_NO_ACK)) && ++ !tx_compl_param->status) { + info->flags |= IEEE80211_TX_STAT_ACK; ++ if (test_bit(WMI_TLV_SERVICE_TX_DATA_MGMT_ACK_RSSI, ++ ar->ab->wmi_ab.svc_map)) ++ info->status.ack_signal = tx_compl_param->ack_rssi; ++ } + + ieee80211_tx_status_irqsafe(ar->hw, msdu); + +@@ -5267,7 +5272,7 @@ static int wmi_process_mgmt_tx_comp(stru + + ath11k_dbg(ar->ab, ATH11K_DBG_WMI, + "wmi mgmt tx comp pending %d desc id %d\n", +- num_mgmt, desc_id); ++ num_mgmt, tx_compl_param->desc_id); + + if (!num_mgmt) + wake_up(&ar->txmgmt_empty_waitq); +@@ -5300,6 +5305,7 @@ static int ath11k_pull_mgmt_tx_compl_par + param->pdev_id = ev->pdev_id; + param->desc_id = ev->desc_id; + param->status = ev->status; ++ param->ack_rssi = ev->ack_rssi; + + kfree(tb); + return 0; +@@ -7070,13 +7076,12 @@ static void ath11k_mgmt_tx_compl_event(s + goto exit; + } + +- wmi_process_mgmt_tx_comp(ar, tx_compl_param.desc_id, +- tx_compl_param.status); ++ wmi_process_mgmt_tx_comp(ar, &tx_compl_param); + + ath11k_dbg(ab, ATH11K_DBG_MGMT, +- "mgmt tx compl ev pdev_id %d, desc_id %d, status %d", ++ "mgmt tx compl ev pdev_id %d, desc_id %d, status %d ack_rssi %d", + tx_compl_param.pdev_id, tx_compl_param.desc_id, +- tx_compl_param.status); ++ tx_compl_param.status, tx_compl_param.ack_rssi); + + exit: + rcu_read_unlock(); +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -2311,6 +2311,7 @@ struct wmi_init_cmd { + } __packed; + + #define WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64 BIT(5) ++#define WMI_RSRC_CFG_FLAG1_ACK_RSSI BIT(18) + + struct wmi_resource_config { + u32 tlv_header; +@@ -4550,6 +4551,8 @@ struct wmi_mgmt_tx_compl_event { + u32 desc_id; + u32 status; + u32 pdev_id; ++ u32 ppdu_id; ++ u32 ack_rssi; + } __packed; + + struct wmi_scan_event { diff --git a/package/kernel/mac80211/patches/ath11k/0043-wifi-ath11k-use-proper-regulatory-reference-for-band.patch b/package/kernel/mac80211/patches/ath11k/0043-wifi-ath11k-use-proper-regulatory-reference-for-band.patch new file mode 100644 index 0000000000..5bc195528e --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0043-wifi-ath11k-use-proper-regulatory-reference-for-band.patch @@ -0,0 +1,216 @@ +From 25e289e1f52e1f4fb1d07622c6a24f8d8a8e420d Mon Sep 17 00:00:00 2001 +From: Aditya Kumar Singh +Date: Wed, 1 Mar 2023 16:20:58 +0200 +Subject: [PATCH] wifi: ath11k: use proper regulatory reference for bands + +Currently, during regulatory event, 2 GHz/5 GHz is referred +to as 2G/5G including variable names. However, there is no +such entity as 2G or 5G. + +Re-name such occurences to its proper name. No functional changes. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Aditya Kumar Singh +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230110121024.14051-2-quic_adisi@quicinc.com +--- + drivers/net/wireless/ath/ath11k/reg.c | 20 ++++----- + drivers/net/wireless/ath/ath11k/wmi.c | 58 ++++++++++++++------------- + drivers/net/wireless/ath/ath11k/wmi.h | 28 ++++++------- + 3 files changed, 54 insertions(+), 52 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/reg.c ++++ b/drivers/net/wireless/ath/ath11k/reg.c +@@ -619,7 +619,7 @@ ath11k_reg_build_regd(struct ath11k_base + u32 flags; + char alpha2[3]; + +- num_rules = reg_info->num_5g_reg_rules + reg_info->num_2g_reg_rules; ++ num_rules = reg_info->num_5ghz_reg_rules + reg_info->num_2ghz_reg_rules; + + if (!num_rules) + goto ret; +@@ -644,20 +644,20 @@ ath11k_reg_build_regd(struct ath11k_base + alpha2, ath11k_reg_get_regdom_str(tmp_regd->dfs_region), + reg_info->dfs_region, num_rules); + /* Update reg_rules[] below. Firmware is expected to +- * send these rules in order(2G rules first and then 5G) ++ * send these rules in order(2 GHz rules first and then 5 GHz) + */ + for (; i < num_rules; i++) { +- if (reg_info->num_2g_reg_rules && +- (i < reg_info->num_2g_reg_rules)) { +- reg_rule = reg_info->reg_rules_2g_ptr + i; ++ if (reg_info->num_2ghz_reg_rules && ++ (i < reg_info->num_2ghz_reg_rules)) { ++ reg_rule = reg_info->reg_rules_2ghz_ptr + i; + max_bw = min_t(u16, reg_rule->max_bw, +- reg_info->max_bw_2g); ++ reg_info->max_bw_2ghz); + flags = 0; +- } else if (reg_info->num_5g_reg_rules && +- (j < reg_info->num_5g_reg_rules)) { +- reg_rule = reg_info->reg_rules_5g_ptr + j++; ++ } else if (reg_info->num_5ghz_reg_rules && ++ (j < reg_info->num_5ghz_reg_rules)) { ++ reg_rule = reg_info->reg_rules_5ghz_ptr + j++; + max_bw = min_t(u16, reg_rule->max_bw, +- reg_info->max_bw_5g); ++ reg_info->max_bw_5ghz); + + /* FW doesn't pass NL80211_RRF_AUTO_BW flag for + * BW Auto correction, we can enable this by default +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -4959,7 +4959,7 @@ static int ath11k_pull_reg_chan_list_upd + const void **tb; + const struct wmi_reg_chan_list_cc_event *chan_list_event_hdr; + struct wmi_regulatory_rule_struct *wmi_reg_rule; +- u32 num_2g_reg_rules, num_5g_reg_rules; ++ u32 num_2ghz_reg_rules, num_5ghz_reg_rules; + int ret; + + ath11k_dbg(ab, ATH11K_DBG_WMI, "processing regulatory channel list\n"); +@@ -4978,10 +4978,10 @@ static int ath11k_pull_reg_chan_list_upd + return -EPROTO; + } + +- reg_info->num_2g_reg_rules = chan_list_event_hdr->num_2g_reg_rules; +- reg_info->num_5g_reg_rules = chan_list_event_hdr->num_5g_reg_rules; ++ reg_info->num_2ghz_reg_rules = chan_list_event_hdr->num_2ghz_reg_rules; ++ reg_info->num_5ghz_reg_rules = chan_list_event_hdr->num_5ghz_reg_rules; + +- if (!(reg_info->num_2g_reg_rules + reg_info->num_5g_reg_rules)) { ++ if (!(reg_info->num_2ghz_reg_rules + reg_info->num_5ghz_reg_rules)) { + ath11k_warn(ab, "No regulatory rules available in the event info\n"); + kfree(tb); + return -EINVAL; +@@ -5008,46 +5008,48 @@ static int ath11k_pull_reg_chan_list_upd + else if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_STATUS_FAIL) + reg_info->status_code = REG_SET_CC_STATUS_FAIL; + +- reg_info->min_bw_2g = chan_list_event_hdr->min_bw_2g; +- reg_info->max_bw_2g = chan_list_event_hdr->max_bw_2g; +- reg_info->min_bw_5g = chan_list_event_hdr->min_bw_5g; +- reg_info->max_bw_5g = chan_list_event_hdr->max_bw_5g; ++ reg_info->min_bw_2ghz = chan_list_event_hdr->min_bw_2ghz; ++ reg_info->max_bw_2ghz = chan_list_event_hdr->max_bw_2ghz; ++ reg_info->min_bw_5ghz = chan_list_event_hdr->min_bw_5ghz; ++ reg_info->max_bw_5ghz = chan_list_event_hdr->max_bw_5ghz; + +- num_2g_reg_rules = reg_info->num_2g_reg_rules; +- num_5g_reg_rules = reg_info->num_5g_reg_rules; ++ num_2ghz_reg_rules = reg_info->num_2ghz_reg_rules; ++ num_5ghz_reg_rules = reg_info->num_5ghz_reg_rules; + + ath11k_dbg(ab, ATH11K_DBG_WMI, +- "%s:cc %s dsf %d BW: min_2g %d max_2g %d min_5g %d max_5g %d", ++ "%s:cc %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", + __func__, reg_info->alpha2, reg_info->dfs_region, +- reg_info->min_bw_2g, reg_info->max_bw_2g, +- reg_info->min_bw_5g, reg_info->max_bw_5g); ++ reg_info->min_bw_2ghz, reg_info->max_bw_2ghz, ++ reg_info->min_bw_5ghz, reg_info->max_bw_5ghz); + + ath11k_dbg(ab, ATH11K_DBG_WMI, +- "%s: num_2g_reg_rules %d num_5g_reg_rules %d", __func__, +- num_2g_reg_rules, num_5g_reg_rules); ++ "%s: num_2ghz_reg_rules %d num_5ghz_reg_rules %d", __func__, ++ num_2ghz_reg_rules, num_5ghz_reg_rules); + + wmi_reg_rule = + (struct wmi_regulatory_rule_struct *)((u8 *)chan_list_event_hdr + + sizeof(*chan_list_event_hdr) + + sizeof(struct wmi_tlv)); + +- if (num_2g_reg_rules) { +- reg_info->reg_rules_2g_ptr = create_reg_rules_from_wmi(num_2g_reg_rules, +- wmi_reg_rule); +- if (!reg_info->reg_rules_2g_ptr) { ++ if (num_2ghz_reg_rules) { ++ reg_info->reg_rules_2ghz_ptr = ++ create_reg_rules_from_wmi(num_2ghz_reg_rules, ++ wmi_reg_rule); ++ if (!reg_info->reg_rules_2ghz_ptr) { + kfree(tb); +- ath11k_warn(ab, "Unable to Allocate memory for 2g rules\n"); ++ ath11k_warn(ab, "Unable to Allocate memory for 2 GHz rules\n"); + return -ENOMEM; + } + } + +- if (num_5g_reg_rules) { +- wmi_reg_rule += num_2g_reg_rules; +- reg_info->reg_rules_5g_ptr = create_reg_rules_from_wmi(num_5g_reg_rules, +- wmi_reg_rule); +- if (!reg_info->reg_rules_5g_ptr) { ++ if (num_5ghz_reg_rules) { ++ wmi_reg_rule += num_2ghz_reg_rules; ++ reg_info->reg_rules_5ghz_ptr = ++ create_reg_rules_from_wmi(num_5ghz_reg_rules, ++ wmi_reg_rule); ++ if (!reg_info->reg_rules_5ghz_ptr) { + kfree(tb); +- ath11k_warn(ab, "Unable to Allocate memory for 5g rules\n"); ++ ath11k_warn(ab, "Unable to Allocate memory for 5 GHz rules\n"); + return -ENOMEM; + } + } +@@ -6619,8 +6621,8 @@ fallback: + WARN_ON(1); + mem_free: + if (reg_info) { +- kfree(reg_info->reg_rules_2g_ptr); +- kfree(reg_info->reg_rules_5g_ptr); ++ kfree(reg_info->reg_rules_2ghz_ptr); ++ kfree(reg_info->reg_rules_5ghz_ptr); + kfree(reg_info); + } + return ret; +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -4129,14 +4129,14 @@ struct cur_regulatory_info { + u8 alpha2[REG_ALPHA2_LEN + 1]; + u32 dfs_region; + u32 phybitmap; +- u32 min_bw_2g; +- u32 max_bw_2g; +- u32 min_bw_5g; +- u32 max_bw_5g; +- u32 num_2g_reg_rules; +- u32 num_5g_reg_rules; +- struct cur_reg_rule *reg_rules_2g_ptr; +- struct cur_reg_rule *reg_rules_5g_ptr; ++ u32 min_bw_2ghz; ++ u32 max_bw_2ghz; ++ u32 min_bw_5ghz; ++ u32 max_bw_5ghz; ++ u32 num_2ghz_reg_rules; ++ u32 num_5ghz_reg_rules; ++ struct cur_reg_rule *reg_rules_2ghz_ptr; ++ struct cur_reg_rule *reg_rules_5ghz_ptr; + }; + + struct wmi_reg_chan_list_cc_event { +@@ -4148,12 +4148,12 @@ struct wmi_reg_chan_list_cc_event { + u32 domain_code; + u32 dfs_region; + u32 phybitmap; +- u32 min_bw_2g; +- u32 max_bw_2g; +- u32 min_bw_5g; +- u32 max_bw_5g; +- u32 num_2g_reg_rules; +- u32 num_5g_reg_rules; ++ u32 min_bw_2ghz; ++ u32 max_bw_2ghz; ++ u32 min_bw_5ghz; ++ u32 max_bw_5ghz; ++ u32 num_2ghz_reg_rules; ++ u32 num_5ghz_reg_rules; + } __packed; + + struct wmi_regulatory_rule_struct { diff --git a/package/kernel/mac80211/patches/ath11k/0044-wifi-ath11k-add-support-to-parse-new-WMI-event-for-6.patch b/package/kernel/mac80211/patches/ath11k/0044-wifi-ath11k-add-support-to-parse-new-WMI-event-for-6.patch new file mode 100644 index 0000000000..e165c09dc4 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0044-wifi-ath11k-add-support-to-parse-new-WMI-event-for-6.patch @@ -0,0 +1,844 @@ +From 91fa00fa69224aae5afb720c5e68b22e4c4f7333 Mon Sep 17 00:00:00 2001 +From: Aditya Kumar Singh +Date: Wed, 1 Mar 2023 16:20:59 +0200 +Subject: [PATCH] wifi: ath11k: add support to parse new WMI event for 6 GHz + +In order to support different power levels of 6 GHz AP and client, +new WMI event for regulatory - WMI_REG_CHAN_LIST_CC_EXT_EVENTID is +added in firmware. This event provides new parameters required for +6 GHz regulatory rules. + +Add support for parsing 2.4 GHz, 5 GHz and 6 GHz reg rules and other +parameters from WMI_REG_CHAN_LIST_CC_EXT_EVENTID. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Lavanya Suresh +Signed-off-by: Wen Gong +Signed-off-by: Aditya Kumar Singh +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230110121024.14051-3-quic_adisi@quicinc.com +--- + drivers/net/wireless/ath/ath11k/reg.c | 37 ++- + drivers/net/wireless/ath/ath11k/wmi.c | 418 +++++++++++++++++++++++++- + drivers/net/wireless/ath/ath11k/wmi.h | 163 +++++++++- + 3 files changed, 584 insertions(+), 34 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/reg.c ++++ b/drivers/net/wireless/ath/ath11k/reg.c +@@ -613,7 +613,7 @@ ath11k_reg_build_regd(struct ath11k_base + { + struct ieee80211_regdomain *tmp_regd, *default_regd, *new_regd = NULL; + struct cur_reg_rule *reg_rule; +- u8 i = 0, j = 0; ++ u8 i = 0, j = 0, k = 0; + u8 num_rules; + u16 max_bw; + u32 flags; +@@ -621,6 +621,12 @@ ath11k_reg_build_regd(struct ath11k_base + + num_rules = reg_info->num_5ghz_reg_rules + reg_info->num_2ghz_reg_rules; + ++ /* FIXME: Currently taking reg rules for 6 GHz only from Indoor AP mode list. ++ * This can be updated after complete 6 GHz regulatory support is added. ++ */ ++ if (reg_info->is_ext_reg_event) ++ num_rules += reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP]; ++ + if (!num_rules) + goto ret; + +@@ -666,6 +672,14 @@ ath11k_reg_build_regd(struct ath11k_base + * per other BW rule flags we pass from here + */ + flags = NL80211_RRF_AUTO_BW; ++ } else if (reg_info->is_ext_reg_event && ++ reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP] && ++ (k < reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP])) { ++ reg_rule = reg_info->reg_rules_6ghz_ap_ptr[WMI_REG_INDOOR_AP] + ++ k++; ++ max_bw = min_t(u16, reg_rule->max_bw, ++ reg_info->max_bw_6ghz_ap[WMI_REG_INDOOR_AP]); ++ flags = NL80211_RRF_AUTO_BW; + } else { + break; + } +@@ -693,12 +707,21 @@ ath11k_reg_build_regd(struct ath11k_base + continue; + } + +- ath11k_dbg(ab, ATH11K_DBG_REG, +- "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d)\n", +- i + 1, reg_rule->start_freq, reg_rule->end_freq, +- max_bw, reg_rule->ant_gain, reg_rule->reg_power, +- tmp_regd->reg_rules[i].dfs_cac_ms, +- flags); ++ if (reg_info->is_ext_reg_event) { ++ ath11k_dbg(ab, ATH11K_DBG_REG, ++ "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d) (%d, %d)\n", ++ i + 1, reg_rule->start_freq, reg_rule->end_freq, ++ max_bw, reg_rule->ant_gain, reg_rule->reg_power, ++ tmp_regd->reg_rules[i].dfs_cac_ms, flags, ++ reg_rule->psd_flag, reg_rule->psd_eirp); ++ } else { ++ ath11k_dbg(ab, ATH11K_DBG_REG, ++ "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d)\n", ++ i + 1, reg_rule->start_freq, reg_rule->end_freq, ++ max_bw, reg_rule->ant_gain, reg_rule->reg_power, ++ tmp_regd->reg_rules[i].dfs_cac_ms, ++ flags); ++ } + } + + tmp_regd->n_reg_rules = i; +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -105,6 +105,8 @@ static const struct wmi_tlv_policy wmi_t + = { .min_len = sizeof(struct wmi_vdev_stopped_event) }, + [WMI_TAG_REG_CHAN_LIST_CC_EVENT] + = { .min_len = sizeof(struct wmi_reg_chan_list_cc_event) }, ++ [WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT] ++ = { .min_len = sizeof(struct wmi_reg_chan_list_cc_ext_event) }, + [WMI_TAG_MGMT_RX_HDR] + = { .min_len = sizeof(struct wmi_mgmt_rx_hdr) }, + [WMI_TAG_MGMT_TX_COMPL_EVENT] +@@ -3974,6 +3976,10 @@ ath11k_wmi_copy_resource_config(struct w + wmi_cfg->sched_params = tg_cfg->sched_params; + wmi_cfg->twt_ap_pdev_count = tg_cfg->twt_ap_pdev_count; + wmi_cfg->twt_ap_sta_count = tg_cfg->twt_ap_sta_count; ++ wmi_cfg->host_service_flags &= ++ ~(1 << WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT); ++ wmi_cfg->host_service_flags |= (tg_cfg->is_reg_cc_ext_event_supported << ++ WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT); + } + + static int ath11k_init_cmd_send(struct ath11k_pdev_wmi *wmi, +@@ -4192,6 +4198,10 @@ int ath11k_wmi_cmd_init(struct ath11k_ba + + ab->hw_params.hw_ops->wmi_init_config(ab, &config); + ++ if (test_bit(WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT, ++ ab->wmi_ab.svc_map)) ++ config.is_reg_cc_ext_event_supported = 1; ++ + memcpy(&wmi_sc->wlan_resource_config, &config, sizeof(config)); + + init_param.res_cfg = &wmi_sc->wlan_resource_config; +@@ -4995,18 +5005,11 @@ static int ath11k_pull_reg_chan_list_upd + reg_info->phy_id = chan_list_event_hdr->phy_id; + reg_info->ctry_code = chan_list_event_hdr->country_id; + reg_info->reg_dmn_pair = chan_list_event_hdr->domain_code; +- if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_STATUS_PASS) +- reg_info->status_code = REG_SET_CC_STATUS_PASS; +- else if (chan_list_event_hdr->status_code == WMI_REG_CURRENT_ALPHA2_NOT_FOUND) +- reg_info->status_code = REG_CURRENT_ALPHA2_NOT_FOUND; +- else if (chan_list_event_hdr->status_code == WMI_REG_INIT_ALPHA2_NOT_FOUND) +- reg_info->status_code = REG_INIT_ALPHA2_NOT_FOUND; +- else if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_CHANGE_NOT_ALLOWED) +- reg_info->status_code = REG_SET_CC_CHANGE_NOT_ALLOWED; +- else if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_STATUS_NO_MEMORY) +- reg_info->status_code = REG_SET_CC_STATUS_NO_MEMORY; +- else if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_STATUS_FAIL) +- reg_info->status_code = REG_SET_CC_STATUS_FAIL; ++ ++ reg_info->status_code = ++ ath11k_wmi_cc_setting_code_to_reg(chan_list_event_hdr->status_code); ++ ++ reg_info->is_ext_reg_event = false; + + reg_info->min_bw_2ghz = chan_list_event_hdr->min_bw_2ghz; + reg_info->max_bw_2ghz = chan_list_event_hdr->max_bw_2ghz; +@@ -5060,6 +5063,372 @@ static int ath11k_pull_reg_chan_list_upd + return 0; + } + ++static struct cur_reg_rule ++*create_ext_reg_rules_from_wmi(u32 num_reg_rules, ++ struct wmi_regulatory_ext_rule *wmi_reg_rule) ++{ ++ struct cur_reg_rule *reg_rule_ptr; ++ u32 count; ++ ++ reg_rule_ptr = kcalloc(num_reg_rules, sizeof(*reg_rule_ptr), GFP_ATOMIC); ++ ++ if (!reg_rule_ptr) ++ return NULL; ++ ++ for (count = 0; count < num_reg_rules; count++) { ++ reg_rule_ptr[count].start_freq = ++ u32_get_bits(wmi_reg_rule[count].freq_info, ++ REG_RULE_START_FREQ); ++ reg_rule_ptr[count].end_freq = ++ u32_get_bits(wmi_reg_rule[count].freq_info, ++ REG_RULE_END_FREQ); ++ reg_rule_ptr[count].max_bw = ++ u32_get_bits(wmi_reg_rule[count].bw_pwr_info, ++ REG_RULE_MAX_BW); ++ reg_rule_ptr[count].reg_power = ++ u32_get_bits(wmi_reg_rule[count].bw_pwr_info, ++ REG_RULE_REG_PWR); ++ reg_rule_ptr[count].ant_gain = ++ u32_get_bits(wmi_reg_rule[count].bw_pwr_info, ++ REG_RULE_ANT_GAIN); ++ reg_rule_ptr[count].flags = ++ u32_get_bits(wmi_reg_rule[count].flag_info, ++ REG_RULE_FLAGS); ++ reg_rule_ptr[count].psd_flag = ++ u32_get_bits(wmi_reg_rule[count].psd_power_info, ++ REG_RULE_PSD_INFO); ++ reg_rule_ptr[count].psd_eirp = ++ u32_get_bits(wmi_reg_rule[count].psd_power_info, ++ REG_RULE_PSD_EIRP); ++ } ++ ++ return reg_rule_ptr; ++} ++ ++static u8 ++ath11k_invalid_5ghz_reg_ext_rules_from_wmi(u32 num_reg_rules, ++ const struct wmi_regulatory_ext_rule *rule) ++{ ++ u8 num_invalid_5ghz_rules = 0; ++ u32 count, start_freq; ++ ++ for (count = 0; count < num_reg_rules; count++) { ++ start_freq = u32_get_bits(rule[count].freq_info, ++ REG_RULE_START_FREQ); ++ ++ if (start_freq >= ATH11K_MIN_6G_FREQ) ++ num_invalid_5ghz_rules++; ++ } ++ ++ return num_invalid_5ghz_rules; ++} ++ ++static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab, ++ struct sk_buff *skb, ++ struct cur_regulatory_info *reg_info) ++{ ++ const void **tb; ++ const struct wmi_reg_chan_list_cc_ext_event *ext_chan_list_event_hdr; ++ struct wmi_regulatory_ext_rule *ext_wmi_reg_rule; ++ u32 num_2ghz_reg_rules, num_5ghz_reg_rules; ++ u32 num_6ghz_reg_rules_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; ++ u32 num_6ghz_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; ++ u32 total_reg_rules = 0; ++ int ret, i, j, num_invalid_5ghz_ext_rules = 0; ++ ++ ath11k_dbg(ab, ATH11K_DBG_WMI, "processing regulatory ext channel list\n"); ++ ++ tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC); ++ if (IS_ERR(tb)) { ++ ret = PTR_ERR(tb); ++ ath11k_warn(ab, "failed to parse tlv: %d\n", ret); ++ return ret; ++ } ++ ++ ext_chan_list_event_hdr = tb[WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT]; ++ if (!ext_chan_list_event_hdr) { ++ ath11k_warn(ab, "failed to fetch reg chan list ext update ev\n"); ++ kfree(tb); ++ return -EPROTO; ++ } ++ ++ reg_info->num_2ghz_reg_rules = ++ ext_chan_list_event_hdr->num_2ghz_reg_rules; ++ reg_info->num_5ghz_reg_rules = ++ ext_chan_list_event_hdr->num_5ghz_reg_rules; ++ reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP] = ++ ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_lpi; ++ reg_info->num_6ghz_rules_ap[WMI_REG_STANDARD_POWER_AP] = ++ ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_sp; ++ reg_info->num_6ghz_rules_ap[WMI_REG_VERY_LOW_POWER_AP] = ++ ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_vlp; ++ ++ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { ++ reg_info->num_6ghz_rules_client[WMI_REG_INDOOR_AP][i] = ++ ext_chan_list_event_hdr->num_6ghz_reg_rules_client_lpi[i]; ++ reg_info->num_6ghz_rules_client[WMI_REG_STANDARD_POWER_AP][i] = ++ ext_chan_list_event_hdr->num_6ghz_reg_rules_client_sp[i]; ++ reg_info->num_6ghz_rules_client[WMI_REG_VERY_LOW_POWER_AP][i] = ++ ext_chan_list_event_hdr->num_6ghz_reg_rules_client_vlp[i]; ++ } ++ ++ num_2ghz_reg_rules = reg_info->num_2ghz_reg_rules; ++ num_5ghz_reg_rules = reg_info->num_5ghz_reg_rules; ++ ++ total_reg_rules += num_2ghz_reg_rules; ++ total_reg_rules += num_5ghz_reg_rules; ++ ++ if ((num_2ghz_reg_rules > MAX_REG_RULES) || ++ (num_5ghz_reg_rules > MAX_REG_RULES)) { ++ ath11k_warn(ab, "Num reg rules for 2.4 GHz/5 GHz exceeds max limit (num_2ghz_reg_rules: %d num_5ghz_reg_rules: %d max_rules: %d)\n", ++ num_2ghz_reg_rules, num_5ghz_reg_rules, MAX_REG_RULES); ++ kfree(tb); ++ return -EINVAL; ++ } ++ ++ for (i = 0; i < WMI_REG_CURRENT_MAX_AP_TYPE; i++) { ++ num_6ghz_reg_rules_ap[i] = reg_info->num_6ghz_rules_ap[i]; ++ ++ if (num_6ghz_reg_rules_ap[i] > MAX_6GHZ_REG_RULES) { ++ ath11k_warn(ab, "Num 6 GHz reg rules for AP mode(%d) exceeds max limit (num_6ghz_reg_rules_ap: %d, max_rules: %d)\n", ++ i, num_6ghz_reg_rules_ap[i], MAX_6GHZ_REG_RULES); ++ kfree(tb); ++ return -EINVAL; ++ } ++ ++ total_reg_rules += num_6ghz_reg_rules_ap[i]; ++ } ++ ++ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { ++ num_6ghz_client[WMI_REG_INDOOR_AP][i] = ++ reg_info->num_6ghz_rules_client[WMI_REG_INDOOR_AP][i]; ++ total_reg_rules += num_6ghz_client[WMI_REG_INDOOR_AP][i]; ++ ++ num_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = ++ reg_info->num_6ghz_rules_client[WMI_REG_STANDARD_POWER_AP][i]; ++ total_reg_rules += num_6ghz_client[WMI_REG_STANDARD_POWER_AP][i]; ++ ++ num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = ++ reg_info->num_6ghz_rules_client[WMI_REG_VERY_LOW_POWER_AP][i]; ++ total_reg_rules += num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i]; ++ ++ if ((num_6ghz_client[WMI_REG_INDOOR_AP][i] > MAX_6GHZ_REG_RULES) || ++ (num_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] > ++ MAX_6GHZ_REG_RULES) || ++ (num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] > ++ MAX_6GHZ_REG_RULES)) { ++ ath11k_warn(ab, ++ "Num 6 GHz client reg rules exceeds max limit, for client(type: %d)\n", ++ i); ++ kfree(tb); ++ return -EINVAL; ++ } ++ } ++ ++ if (!total_reg_rules) { ++ ath11k_warn(ab, "No reg rules available\n"); ++ kfree(tb); ++ return -EINVAL; ++ } ++ ++ memcpy(reg_info->alpha2, &ext_chan_list_event_hdr->alpha2, ++ REG_ALPHA2_LEN); ++ ++ reg_info->dfs_region = ext_chan_list_event_hdr->dfs_region; ++ reg_info->phybitmap = ext_chan_list_event_hdr->phybitmap; ++ reg_info->num_phy = ext_chan_list_event_hdr->num_phy; ++ reg_info->phy_id = ext_chan_list_event_hdr->phy_id; ++ reg_info->ctry_code = ext_chan_list_event_hdr->country_id; ++ reg_info->reg_dmn_pair = ext_chan_list_event_hdr->domain_code; ++ ++ reg_info->status_code = ++ ath11k_wmi_cc_setting_code_to_reg(ext_chan_list_event_hdr->status_code); ++ ++ reg_info->is_ext_reg_event = true; ++ ++ reg_info->min_bw_2ghz = ext_chan_list_event_hdr->min_bw_2ghz; ++ reg_info->max_bw_2ghz = ext_chan_list_event_hdr->max_bw_2ghz; ++ reg_info->min_bw_5ghz = ext_chan_list_event_hdr->min_bw_5ghz; ++ reg_info->max_bw_5ghz = ext_chan_list_event_hdr->max_bw_5ghz; ++ ++ reg_info->min_bw_6ghz_ap[WMI_REG_INDOOR_AP] = ++ ext_chan_list_event_hdr->min_bw_6ghz_ap_lpi; ++ reg_info->max_bw_6ghz_ap[WMI_REG_INDOOR_AP] = ++ ext_chan_list_event_hdr->max_bw_6ghz_ap_lpi; ++ reg_info->min_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = ++ ext_chan_list_event_hdr->min_bw_6ghz_ap_sp; ++ reg_info->max_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = ++ ext_chan_list_event_hdr->max_bw_6ghz_ap_sp; ++ reg_info->min_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = ++ ext_chan_list_event_hdr->min_bw_6ghz_ap_vlp; ++ reg_info->max_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = ++ ext_chan_list_event_hdr->max_bw_6ghz_ap_vlp; ++ ++ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { ++ reg_info->min_bw_6ghz_client[WMI_REG_INDOOR_AP][i] = ++ ext_chan_list_event_hdr->min_bw_6ghz_client_lpi[i]; ++ reg_info->max_bw_6ghz_client[WMI_REG_INDOOR_AP][i] = ++ ext_chan_list_event_hdr->max_bw_6ghz_client_lpi[i]; ++ reg_info->min_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = ++ ext_chan_list_event_hdr->min_bw_6ghz_client_sp[i]; ++ reg_info->max_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = ++ ext_chan_list_event_hdr->max_bw_6ghz_client_sp[i]; ++ reg_info->min_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = ++ ext_chan_list_event_hdr->min_bw_6ghz_client_vlp[i]; ++ reg_info->max_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = ++ ext_chan_list_event_hdr->max_bw_6ghz_client_vlp[i]; ++ } ++ ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "%s:cc_ext %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", ++ __func__, reg_info->alpha2, reg_info->dfs_region, ++ reg_info->min_bw_2ghz, reg_info->max_bw_2ghz, ++ reg_info->min_bw_5ghz, reg_info->max_bw_5ghz); ++ ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "num_2ghz_reg_rules %d num_5ghz_reg_rules %d", ++ num_2ghz_reg_rules, num_5ghz_reg_rules); ++ ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "num_6ghz_reg_rules_ap_lpi: %d num_6ghz_reg_rules_ap_sp: %d num_6ghz_reg_rules_ap_vlp: %d", ++ num_6ghz_reg_rules_ap[WMI_REG_INDOOR_AP], ++ num_6ghz_reg_rules_ap[WMI_REG_STANDARD_POWER_AP], ++ num_6ghz_reg_rules_ap[WMI_REG_VERY_LOW_POWER_AP]); ++ ++ j = WMI_REG_DEFAULT_CLIENT; ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "6 GHz Regular client: num_6ghz_reg_rules_lpi: %d num_6ghz_reg_rules_sp: %d num_6ghz_reg_rules_vlp: %d", ++ num_6ghz_client[WMI_REG_INDOOR_AP][j], ++ num_6ghz_client[WMI_REG_STANDARD_POWER_AP][j], ++ num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][j]); ++ ++ j = WMI_REG_SUBORDINATE_CLIENT; ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "6 GHz Subordinate client: num_6ghz_reg_rules_lpi: %d num_6ghz_reg_rules_sp: %d num_6ghz_reg_rules_vlp: %d", ++ num_6ghz_client[WMI_REG_INDOOR_AP][j], ++ num_6ghz_client[WMI_REG_STANDARD_POWER_AP][j], ++ num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][j]); ++ ++ ext_wmi_reg_rule = ++ (struct wmi_regulatory_ext_rule *)((u8 *)ext_chan_list_event_hdr ++ + sizeof(*ext_chan_list_event_hdr) ++ + sizeof(struct wmi_tlv)); ++ if (num_2ghz_reg_rules) { ++ reg_info->reg_rules_2ghz_ptr = ++ create_ext_reg_rules_from_wmi(num_2ghz_reg_rules, ++ ext_wmi_reg_rule); ++ ++ if (!reg_info->reg_rules_2ghz_ptr) { ++ kfree(tb); ++ ath11k_warn(ab, "Unable to Allocate memory for 2 GHz rules\n"); ++ return -ENOMEM; ++ } ++ } ++ ++ ext_wmi_reg_rule += num_2ghz_reg_rules; ++ ++ /* Firmware might include 6 GHz reg rule in 5 GHz rule list ++ * for few countries along with separate 6 GHz rule. ++ * Having same 6 GHz reg rule in 5 GHz and 6 GHz rules list ++ * causes intersect check to be true, and same rules will be ++ * shown multiple times in iw cmd. ++ * Hence, avoid parsing 6 GHz rule from 5 GHz reg rule list ++ */ ++ num_invalid_5ghz_ext_rules = ++ ath11k_invalid_5ghz_reg_ext_rules_from_wmi(num_5ghz_reg_rules, ++ ext_wmi_reg_rule); ++ ++ if (num_invalid_5ghz_ext_rules) { ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "CC: %s 5 GHz reg rules number %d from fw, %d number of invalid 5 GHz rules", ++ reg_info->alpha2, reg_info->num_5ghz_reg_rules, ++ num_invalid_5ghz_ext_rules); ++ ++ num_5ghz_reg_rules = num_5ghz_reg_rules - num_invalid_5ghz_ext_rules; ++ reg_info->num_5ghz_reg_rules = num_5ghz_reg_rules; ++ } ++ ++ if (num_5ghz_reg_rules) { ++ reg_info->reg_rules_5ghz_ptr = ++ create_ext_reg_rules_from_wmi(num_5ghz_reg_rules, ++ ext_wmi_reg_rule); ++ ++ if (!reg_info->reg_rules_5ghz_ptr) { ++ kfree(tb); ++ ath11k_warn(ab, "Unable to Allocate memory for 5 GHz rules\n"); ++ return -ENOMEM; ++ } ++ } ++ ++ /* We have adjusted the number of 5 GHz reg rules above. But still those ++ * many rules needs to be adjusted in ext_wmi_reg_rule. ++ * ++ * NOTE: num_invalid_5ghz_ext_rules will be 0 for rest other cases. ++ */ ++ ext_wmi_reg_rule += (num_5ghz_reg_rules + num_invalid_5ghz_ext_rules); ++ ++ for (i = 0; i < WMI_REG_CURRENT_MAX_AP_TYPE; i++) { ++ reg_info->reg_rules_6ghz_ap_ptr[i] = ++ create_ext_reg_rules_from_wmi(num_6ghz_reg_rules_ap[i], ++ ext_wmi_reg_rule); ++ ++ if (!reg_info->reg_rules_6ghz_ap_ptr[i]) { ++ kfree(tb); ++ ath11k_warn(ab, "Unable to Allocate memory for 6 GHz AP rules\n"); ++ return -ENOMEM; ++ } ++ ++ ext_wmi_reg_rule += num_6ghz_reg_rules_ap[i]; ++ } ++ ++ for (j = 0; j < WMI_REG_CURRENT_MAX_AP_TYPE; j++) { ++ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { ++ reg_info->reg_rules_6ghz_client_ptr[j][i] = ++ create_ext_reg_rules_from_wmi(num_6ghz_client[j][i], ++ ext_wmi_reg_rule); ++ ++ if (!reg_info->reg_rules_6ghz_client_ptr[j][i]) { ++ kfree(tb); ++ ath11k_warn(ab, "Unable to Allocate memory for 6 GHz client rules\n"); ++ return -ENOMEM; ++ } ++ ++ ext_wmi_reg_rule += num_6ghz_client[j][i]; ++ } ++ } ++ ++ reg_info->client_type = ext_chan_list_event_hdr->client_type; ++ reg_info->rnr_tpe_usable = ext_chan_list_event_hdr->rnr_tpe_usable; ++ reg_info->unspecified_ap_usable = ++ ext_chan_list_event_hdr->unspecified_ap_usable; ++ reg_info->domain_code_6ghz_ap[WMI_REG_INDOOR_AP] = ++ ext_chan_list_event_hdr->domain_code_6ghz_ap_lpi; ++ reg_info->domain_code_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = ++ ext_chan_list_event_hdr->domain_code_6ghz_ap_sp; ++ reg_info->domain_code_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = ++ ext_chan_list_event_hdr->domain_code_6ghz_ap_vlp; ++ ++ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { ++ reg_info->domain_code_6ghz_client[WMI_REG_INDOOR_AP][i] = ++ ext_chan_list_event_hdr->domain_code_6ghz_client_lpi[i]; ++ reg_info->domain_code_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = ++ ext_chan_list_event_hdr->domain_code_6ghz_client_sp[i]; ++ reg_info->domain_code_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = ++ ext_chan_list_event_hdr->domain_code_6ghz_client_vlp[i]; ++ } ++ ++ reg_info->domain_code_6ghz_super_id = ++ ext_chan_list_event_hdr->domain_code_6ghz_super_id; ++ ++ ath11k_dbg(ab, ATH11K_DBG_WMI, "6 GHz client_type: %d domain_code_6ghz_super_id: %d", ++ reg_info->client_type, reg_info->domain_code_6ghz_super_id); ++ ++ ath11k_dbg(ab, ATH11K_DBG_WMI, "processed regulatory ext channel list\n"); ++ ++ kfree(tb); ++ return 0; ++} ++ + static int ath11k_pull_peer_del_resp_ev(struct ath11k_base *ab, struct sk_buff *skb, + struct wmi_peer_delete_resp_event *peer_del_resp) + { +@@ -6507,12 +6876,14 @@ static bool ath11k_reg_is_world_alpha(ch + return false; + } + +-static int ath11k_reg_chan_list_event(struct ath11k_base *ab, struct sk_buff *skb) ++static int ath11k_reg_chan_list_event(struct ath11k_base *ab, ++ struct sk_buff *skb, ++ enum wmi_reg_chan_list_cmd_type id) + { + struct cur_regulatory_info *reg_info = NULL; + struct ieee80211_regdomain *regd = NULL; + bool intersect = false; +- int ret = 0, pdev_idx; ++ int ret = 0, pdev_idx, i, j; + struct ath11k *ar; + + reg_info = kzalloc(sizeof(*reg_info), GFP_ATOMIC); +@@ -6521,7 +6892,11 @@ static int ath11k_reg_chan_list_event(st + goto fallback; + } + +- ret = ath11k_pull_reg_chan_list_update_ev(ab, skb, reg_info); ++ if (id == WMI_REG_CHAN_LIST_CC_ID) ++ ret = ath11k_pull_reg_chan_list_update_ev(ab, skb, reg_info); ++ else ++ ret = ath11k_pull_reg_chan_list_ext_update_ev(ab, skb, reg_info); ++ + if (ret) { + ath11k_warn(ab, "failed to extract regulatory info from received event\n"); + goto fallback; +@@ -6623,6 +6998,14 @@ mem_free: + if (reg_info) { + kfree(reg_info->reg_rules_2ghz_ptr); + kfree(reg_info->reg_rules_5ghz_ptr); ++ if (reg_info->is_ext_reg_event) { ++ for (i = 0; i < WMI_REG_CURRENT_MAX_AP_TYPE; i++) ++ kfree(reg_info->reg_rules_6ghz_ap_ptr[i]); ++ ++ for (j = 0; j < WMI_REG_CURRENT_MAX_AP_TYPE; j++) ++ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) ++ kfree(reg_info->reg_rules_6ghz_client_ptr[j][i]); ++ } + kfree(reg_info); + } + return ret; +@@ -8054,7 +8437,10 @@ static void ath11k_wmi_tlv_op_rx(struct + ath11k_service_ready_ext2_event(ab, skb); + break; + case WMI_REG_CHAN_LIST_CC_EVENTID: +- ath11k_reg_chan_list_event(ab, skb); ++ ath11k_reg_chan_list_event(ab, skb, WMI_REG_CHAN_LIST_CC_ID); ++ break; ++ case WMI_REG_CHAN_LIST_CC_EXT_EVENTID: ++ ath11k_reg_chan_list_event(ab, skb, WMI_REG_CHAN_LIST_CC_EXT_ID); + break; + case WMI_READY_EVENTID: + ath11k_ready_event(ab, skb); +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -797,6 +797,7 @@ enum wmi_tlv_event_id { + WMI_RMC_NEW_LEADER_EVENTID = WMI_TLV_CMD(WMI_GRP_RMC), + WMI_REG_CHAN_LIST_CC_EVENTID = WMI_TLV_CMD(WMI_GRP_REGULATORY), + WMI_11D_NEW_COUNTRY_EVENTID, ++ WMI_REG_CHAN_LIST_CC_EXT_EVENTID, + WMI_NDI_CAP_RSP_EVENTID = WMI_TLV_CMD(WMI_GRP_PROTOTYPE), + WMI_NDP_INITIATOR_RSP_EVENTID, + WMI_NDP_RESPONDER_RSP_EVENTID, +@@ -1865,6 +1866,8 @@ enum wmi_tlv_tag { + WMI_TAG_PDEV_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD, + WMI_TAG_PDEV_NON_SRG_OBSS_COLOR_ENABLE_BITMAP_CMD, + WMI_TAG_PDEV_NON_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD, ++ WMI_TAG_REGULATORY_RULE_EXT_STRUCT = 0x3A9, ++ WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT, + WMI_TAG_PDEV_SET_BIOS_SAR_TABLE_CMD = 0x3D8, + WMI_TAG_PDEV_SET_BIOS_GEO_TABLE_CMD, + WMI_TAG_MAX +@@ -2097,6 +2100,7 @@ enum wmi_tlv_service { + + /* The second 128 bits */ + WMI_MAX_EXT_SERVICE = 256, ++ WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT = 281, + WMI_TLV_SERVICE_BIOS_SAR_SUPPORT = 326, + + /* The third 128 bits */ +@@ -2313,6 +2317,8 @@ struct wmi_init_cmd { + #define WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64 BIT(5) + #define WMI_RSRC_CFG_FLAG1_ACK_RSSI BIT(18) + ++#define WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT 4 ++ + struct wmi_resource_config { + u32 tlv_header; + u32 num_vdevs; +@@ -2372,6 +2378,15 @@ struct wmi_resource_config { + u32 sched_params; + u32 twt_ap_pdev_count; + u32 twt_ap_sta_count; ++ u32 max_nlo_ssids; ++ u32 num_pkt_filters; ++ u32 num_max_sta_vdevs; ++ u32 max_bssid_indicator; ++ u32 ul_resp_config; ++ u32 msdu_flow_override_config0; ++ u32 msdu_flow_override_config1; ++ u32 flags2; ++ u32 host_service_flags; + } __packed; + + struct wmi_service_ready_event { +@@ -2854,6 +2869,8 @@ struct rx_reorder_queue_remove_params { + #define REG_RULE_MAX_BW 0x0000ffff + #define REG_RULE_REG_PWR 0x00ff0000 + #define REG_RULE_ANT_GAIN 0xff000000 ++#define REG_RULE_PSD_INFO BIT(0) ++#define REG_RULE_PSD_EIRP 0xff0000 + + #define WMI_VDEV_PARAM_TXBF_SU_TX_BFEE BIT(0) + #define WMI_VDEV_PARAM_TXBF_MU_TX_BFEE BIT(1) +@@ -4049,6 +4066,7 @@ struct wmi_he_rate_set { + + #define MAX_REG_RULES 10 + #define REG_ALPHA2_LEN 2 ++#define MAX_6GHZ_REG_RULES 5 + + enum wmi_start_event_param { + WMI_VDEV_START_RESP_EVENT = 0, +@@ -4079,16 +4097,6 @@ enum wmi_vdev_start_resp_status_code { + WMI_VDEV_START_RESPONSE_INVALID_REGDOMAIN = 4, + }; + +-; +-enum cc_setting_code { +- REG_SET_CC_STATUS_PASS = 0, +- REG_CURRENT_ALPHA2_NOT_FOUND = 1, +- REG_INIT_ALPHA2_NOT_FOUND = 2, +- REG_SET_CC_CHANGE_NOT_ALLOWED = 3, +- REG_SET_CC_STATUS_NO_MEMORY = 4, +- REG_SET_CC_STATUS_FAIL = 5, +-}; +- + /* Regaulatory Rule Flags Passed by FW */ + #define REGULATORY_CHAN_DISABLED BIT(0) + #define REGULATORY_CHAN_NO_IR BIT(1) +@@ -4102,13 +4110,72 @@ enum cc_setting_code { + #define REGULATORY_CHAN_NO_20MHZ BIT(11) + #define REGULATORY_CHAN_NO_10MHZ BIT(12) + +-enum { ++enum wmi_reg_chan_list_cmd_type { ++ WMI_REG_CHAN_LIST_CC_ID = 0, ++ WMI_REG_CHAN_LIST_CC_EXT_ID = 1, ++}; ++ ++enum wmi_reg_cc_setting_code { + WMI_REG_SET_CC_STATUS_PASS = 0, + WMI_REG_CURRENT_ALPHA2_NOT_FOUND = 1, + WMI_REG_INIT_ALPHA2_NOT_FOUND = 2, + WMI_REG_SET_CC_CHANGE_NOT_ALLOWED = 3, + WMI_REG_SET_CC_STATUS_NO_MEMORY = 4, + WMI_REG_SET_CC_STATUS_FAIL = 5, ++ ++ /* add new setting code above, update in ++ * @enum cc_setting_code as well. ++ * Also handle it in ath11k_wmi_cc_setting_code_to_reg() ++ */ ++}; ++ ++enum cc_setting_code { ++ REG_SET_CC_STATUS_PASS = 0, ++ REG_CURRENT_ALPHA2_NOT_FOUND = 1, ++ REG_INIT_ALPHA2_NOT_FOUND = 2, ++ REG_SET_CC_CHANGE_NOT_ALLOWED = 3, ++ REG_SET_CC_STATUS_NO_MEMORY = 4, ++ REG_SET_CC_STATUS_FAIL = 5, ++ ++ /* add new setting code above, update in ++ * @enum wmi_reg_cc_setting_code as well. ++ */ ++}; ++ ++static inline enum cc_setting_code ++ath11k_wmi_cc_setting_code_to_reg(enum wmi_reg_cc_setting_code status_code) ++{ ++ switch (status_code) { ++ case WMI_REG_SET_CC_STATUS_PASS: ++ return REG_SET_CC_STATUS_PASS; ++ case WMI_REG_CURRENT_ALPHA2_NOT_FOUND: ++ return REG_CURRENT_ALPHA2_NOT_FOUND; ++ case WMI_REG_INIT_ALPHA2_NOT_FOUND: ++ return REG_INIT_ALPHA2_NOT_FOUND; ++ case WMI_REG_SET_CC_CHANGE_NOT_ALLOWED: ++ return REG_SET_CC_CHANGE_NOT_ALLOWED; ++ case WMI_REG_SET_CC_STATUS_NO_MEMORY: ++ return REG_SET_CC_STATUS_NO_MEMORY; ++ case WMI_REG_SET_CC_STATUS_FAIL: ++ return REG_SET_CC_STATUS_FAIL; ++ } ++ ++ return REG_SET_CC_STATUS_FAIL; ++} ++ ++enum wmi_reg_6ghz_ap_type { ++ WMI_REG_INDOOR_AP = 0, ++ WMI_REG_STANDARD_POWER_AP = 1, ++ WMI_REG_VERY_LOW_POWER_AP = 2, ++ ++ WMI_REG_CURRENT_MAX_AP_TYPE, ++ WMI_REG_MAX_AP_TYPE = 7, ++}; ++ ++enum wmi_reg_6ghz_client_type { ++ WMI_REG_DEFAULT_CLIENT = 0, ++ WMI_REG_SUBORDINATE_CLIENT = 1, ++ WMI_REG_MAX_CLIENT_TYPE = 2, + }; + + struct cur_reg_rule { +@@ -4118,6 +4185,8 @@ struct cur_reg_rule { + u8 reg_power; + u8 ant_gain; + u16 flags; ++ bool psd_flag; ++ s8 psd_eirp; + }; + + struct cur_regulatory_info { +@@ -4137,6 +4206,22 @@ struct cur_regulatory_info { + u32 num_5ghz_reg_rules; + struct cur_reg_rule *reg_rules_2ghz_ptr; + struct cur_reg_rule *reg_rules_5ghz_ptr; ++ bool is_ext_reg_event; ++ enum wmi_reg_6ghz_client_type client_type; ++ bool rnr_tpe_usable; ++ bool unspecified_ap_usable; ++ u8 domain_code_6ghz_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; ++ u8 domain_code_6ghz_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; ++ u32 domain_code_6ghz_super_id; ++ u32 min_bw_6ghz_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; ++ u32 max_bw_6ghz_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; ++ u32 min_bw_6ghz_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; ++ u32 max_bw_6ghz_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; ++ u32 num_6ghz_rules_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; ++ u32 num_6ghz_rules_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; ++ struct cur_reg_rule *reg_rules_6ghz_ap_ptr[WMI_REG_CURRENT_MAX_AP_TYPE]; ++ struct cur_reg_rule *reg_rules_6ghz_client_ptr ++ [WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; + }; + + struct wmi_reg_chan_list_cc_event { +@@ -4163,6 +4248,61 @@ struct wmi_regulatory_rule_struct { + u32 flag_info; + }; + ++#define WMI_REG_CLIENT_MAX 4 ++ ++struct wmi_reg_chan_list_cc_ext_event { ++ u32 status_code; ++ u32 phy_id; ++ u32 alpha2; ++ u32 num_phy; ++ u32 country_id; ++ u32 domain_code; ++ u32 dfs_region; ++ u32 phybitmap; ++ u32 min_bw_2ghz; ++ u32 max_bw_2ghz; ++ u32 min_bw_5ghz; ++ u32 max_bw_5ghz; ++ u32 num_2ghz_reg_rules; ++ u32 num_5ghz_reg_rules; ++ u32 client_type; ++ u32 rnr_tpe_usable; ++ u32 unspecified_ap_usable; ++ u32 domain_code_6ghz_ap_lpi; ++ u32 domain_code_6ghz_ap_sp; ++ u32 domain_code_6ghz_ap_vlp; ++ u32 domain_code_6ghz_client_lpi[WMI_REG_CLIENT_MAX]; ++ u32 domain_code_6ghz_client_sp[WMI_REG_CLIENT_MAX]; ++ u32 domain_code_6ghz_client_vlp[WMI_REG_CLIENT_MAX]; ++ u32 domain_code_6ghz_super_id; ++ u32 min_bw_6ghz_ap_sp; ++ u32 max_bw_6ghz_ap_sp; ++ u32 min_bw_6ghz_ap_lpi; ++ u32 max_bw_6ghz_ap_lpi; ++ u32 min_bw_6ghz_ap_vlp; ++ u32 max_bw_6ghz_ap_vlp; ++ u32 min_bw_6ghz_client_sp[WMI_REG_CLIENT_MAX]; ++ u32 max_bw_6ghz_client_sp[WMI_REG_CLIENT_MAX]; ++ u32 min_bw_6ghz_client_lpi[WMI_REG_CLIENT_MAX]; ++ u32 max_bw_6ghz_client_lpi[WMI_REG_CLIENT_MAX]; ++ u32 min_bw_6ghz_client_vlp[WMI_REG_CLIENT_MAX]; ++ u32 max_bw_6ghz_client_vlp[WMI_REG_CLIENT_MAX]; ++ u32 num_6ghz_reg_rules_ap_sp; ++ u32 num_6ghz_reg_rules_ap_lpi; ++ u32 num_6ghz_reg_rules_ap_vlp; ++ u32 num_6ghz_reg_rules_client_sp[WMI_REG_CLIENT_MAX]; ++ u32 num_6ghz_reg_rules_client_lpi[WMI_REG_CLIENT_MAX]; ++ u32 num_6ghz_reg_rules_client_vlp[WMI_REG_CLIENT_MAX]; ++} __packed; ++ ++struct wmi_regulatory_ext_rule { ++ u32 tlv_header; ++ u32 freq_info; ++ u32 bw_pwr_info; ++ u32 flag_info; ++ u32 psd_power_info; ++} __packed; ++ + struct wmi_vdev_delete_resp_event { + u32 vdev_id; + } __packed; +@@ -5358,6 +5498,7 @@ struct target_resource_config { + u32 sched_params; + u32 twt_ap_pdev_count; + u32 twt_ap_sta_count; ++ u8 is_reg_cc_ext_event_supported; + }; + + enum wmi_debug_log_param { diff --git a/package/kernel/mac80211/patches/ath11k/0045-wifi-ath11k-add-debug-prints-in-regulatory-WMI-event.patch b/package/kernel/mac80211/patches/ath11k/0045-wifi-ath11k-add-debug-prints-in-regulatory-WMI-event.patch new file mode 100644 index 0000000000..b88e51928f --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0045-wifi-ath11k-add-debug-prints-in-regulatory-WMI-event.patch @@ -0,0 +1,567 @@ +From e238e62ba8868a784e485eb94451c87cd1b85cee Mon Sep 17 00:00:00 2001 +From: Aditya Kumar Singh +Date: Wed, 1 Mar 2023 16:20:59 +0200 +Subject: [PATCH] wifi: ath11k: add debug prints in regulatory WMI event + processing + +Add some more debug prints in processing regulatory WMI event in order to +increase more debuggability. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Aditya Kumar Singh +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230110121024.14051-4-quic_adisi@quicinc.com +--- + drivers/net/wireless/ath/ath11k/reg.c | 2 +- + drivers/net/wireless/ath/ath11k/wmi.c | 207 ++++++++++++++++++-------- + drivers/net/wireless/ath/ath11k/wmi.h | 142 ++++++++++++++++++ + 3 files changed, 291 insertions(+), 60 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/reg.c ++++ b/drivers/net/wireless/ath/ath11k/reg.c +@@ -646,7 +646,7 @@ ath11k_reg_build_regd(struct ath11k_base + tmp_regd->dfs_region = ath11k_map_fw_dfs_region(reg_info->dfs_region); + + ath11k_dbg(ab, ATH11K_DBG_REG, +- "\r\nCountry %s, CFG Regdomain %s FW Regdomain %d, num_reg_rules %d\n", ++ "Country %s, CFG Regdomain %s FW Regdomain %d, num_reg_rules %d\n", + alpha2, ath11k_reg_get_regdom_str(tmp_regd->dfs_region), + reg_info->dfs_region, num_rules); + /* Update reg_rules[] below. Firmware is expected to +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -4925,6 +4925,26 @@ static int ath11k_pull_vdev_start_resp_t + return 0; + } + ++static void ath11k_print_reg_rule(struct ath11k_base *ab, const char *band, ++ u32 num_reg_rules, ++ struct cur_reg_rule *reg_rule_ptr) ++{ ++ struct cur_reg_rule *reg_rule = reg_rule_ptr; ++ u32 count; ++ ++ ath11k_dbg(ab, ATH11K_DBG_WMI, "number of reg rules in %s band: %d\n", ++ band, num_reg_rules); ++ ++ for (count = 0; count < num_reg_rules; count++) { ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "reg rule %d: (%d - %d @ %d) (%d, %d) (FLAGS %d)\n", ++ count + 1, reg_rule->start_freq, reg_rule->end_freq, ++ reg_rule->max_bw, reg_rule->ant_gain, ++ reg_rule->reg_power, reg_rule->flags); ++ reg_rule++; ++ } ++} ++ + static struct cur_reg_rule + *create_reg_rules_from_wmi(u32 num_reg_rules, + struct wmi_regulatory_rule_struct *wmi_reg_rule) +@@ -5006,6 +5026,10 @@ static int ath11k_pull_reg_chan_list_upd + reg_info->ctry_code = chan_list_event_hdr->country_id; + reg_info->reg_dmn_pair = chan_list_event_hdr->domain_code; + ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "status_code %s", ++ ath11k_cc_status_to_str(reg_info->status_code)); ++ + reg_info->status_code = + ath11k_wmi_cc_setting_code_to_reg(chan_list_event_hdr->status_code); + +@@ -5020,13 +5044,13 @@ static int ath11k_pull_reg_chan_list_upd + num_5ghz_reg_rules = reg_info->num_5ghz_reg_rules; + + ath11k_dbg(ab, ATH11K_DBG_WMI, +- "%s:cc %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", +- __func__, reg_info->alpha2, reg_info->dfs_region, ++ "cc %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", ++ reg_info->alpha2, reg_info->dfs_region, + reg_info->min_bw_2ghz, reg_info->max_bw_2ghz, + reg_info->min_bw_5ghz, reg_info->max_bw_5ghz); + + ath11k_dbg(ab, ATH11K_DBG_WMI, +- "%s: num_2ghz_reg_rules %d num_5ghz_reg_rules %d", __func__, ++ "num_2ghz_reg_rules %d num_5ghz_reg_rules %d", + num_2ghz_reg_rules, num_5ghz_reg_rules); + + wmi_reg_rule = +@@ -5043,6 +5067,10 @@ static int ath11k_pull_reg_chan_list_upd + ath11k_warn(ab, "Unable to Allocate memory for 2 GHz rules\n"); + return -ENOMEM; + } ++ ++ ath11k_print_reg_rule(ab, "2 GHz", ++ num_2ghz_reg_rules, ++ reg_info->reg_rules_2ghz_ptr); + } + + if (num_5ghz_reg_rules) { +@@ -5055,6 +5083,10 @@ static int ath11k_pull_reg_chan_list_upd + ath11k_warn(ab, "Unable to Allocate memory for 5 GHz rules\n"); + return -ENOMEM; + } ++ ++ ath11k_print_reg_rule(ab, "5 GHz", ++ num_5ghz_reg_rules, ++ reg_info->reg_rules_5ghz_ptr); + } + + ath11k_dbg(ab, ATH11K_DBG_WMI, "processed regulatory channel list\n"); +@@ -5128,7 +5160,7 @@ static int ath11k_pull_reg_chan_list_ext + struct cur_regulatory_info *reg_info) + { + const void **tb; +- const struct wmi_reg_chan_list_cc_ext_event *ext_chan_list_event_hdr; ++ const struct wmi_reg_chan_list_cc_ext_event *ev; + struct wmi_regulatory_ext_rule *ext_wmi_reg_rule; + u32 num_2ghz_reg_rules, num_5ghz_reg_rules; + u32 num_6ghz_reg_rules_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; +@@ -5145,31 +5177,29 @@ static int ath11k_pull_reg_chan_list_ext + return ret; + } + +- ext_chan_list_event_hdr = tb[WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT]; +- if (!ext_chan_list_event_hdr) { ++ ev = tb[WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT]; ++ if (!ev) { + ath11k_warn(ab, "failed to fetch reg chan list ext update ev\n"); + kfree(tb); + return -EPROTO; + } + +- reg_info->num_2ghz_reg_rules = +- ext_chan_list_event_hdr->num_2ghz_reg_rules; +- reg_info->num_5ghz_reg_rules = +- ext_chan_list_event_hdr->num_5ghz_reg_rules; ++ reg_info->num_2ghz_reg_rules = ev->num_2ghz_reg_rules; ++ reg_info->num_5ghz_reg_rules = ev->num_5ghz_reg_rules; + reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP] = +- ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_lpi; ++ ev->num_6ghz_reg_rules_ap_lpi; + reg_info->num_6ghz_rules_ap[WMI_REG_STANDARD_POWER_AP] = +- ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_sp; ++ ev->num_6ghz_reg_rules_ap_sp; + reg_info->num_6ghz_rules_ap[WMI_REG_VERY_LOW_POWER_AP] = +- ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_vlp; ++ ev->num_6ghz_reg_rules_ap_vlp; + + for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { + reg_info->num_6ghz_rules_client[WMI_REG_INDOOR_AP][i] = +- ext_chan_list_event_hdr->num_6ghz_reg_rules_client_lpi[i]; ++ ev->num_6ghz_reg_rules_client_lpi[i]; + reg_info->num_6ghz_rules_client[WMI_REG_STANDARD_POWER_AP][i] = +- ext_chan_list_event_hdr->num_6ghz_reg_rules_client_sp[i]; ++ ev->num_6ghz_reg_rules_client_sp[i]; + reg_info->num_6ghz_rules_client[WMI_REG_VERY_LOW_POWER_AP][i] = +- ext_chan_list_event_hdr->num_6ghz_reg_rules_client_vlp[i]; ++ ev->num_6ghz_reg_rules_client_vlp[i]; + } + + num_2ghz_reg_rules = reg_info->num_2ghz_reg_rules; +@@ -5231,57 +5261,79 @@ static int ath11k_pull_reg_chan_list_ext + return -EINVAL; + } + +- memcpy(reg_info->alpha2, &ext_chan_list_event_hdr->alpha2, +- REG_ALPHA2_LEN); ++ memcpy(reg_info->alpha2, &ev->alpha2, REG_ALPHA2_LEN); ++ ++ reg_info->dfs_region = ev->dfs_region; ++ reg_info->phybitmap = ev->phybitmap; ++ reg_info->num_phy = ev->num_phy; ++ reg_info->phy_id = ev->phy_id; ++ reg_info->ctry_code = ev->country_id; ++ reg_info->reg_dmn_pair = ev->domain_code; + +- reg_info->dfs_region = ext_chan_list_event_hdr->dfs_region; +- reg_info->phybitmap = ext_chan_list_event_hdr->phybitmap; +- reg_info->num_phy = ext_chan_list_event_hdr->num_phy; +- reg_info->phy_id = ext_chan_list_event_hdr->phy_id; +- reg_info->ctry_code = ext_chan_list_event_hdr->country_id; +- reg_info->reg_dmn_pair = ext_chan_list_event_hdr->domain_code; ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "status_code %s", ++ ath11k_cc_status_to_str(reg_info->status_code)); + + reg_info->status_code = +- ath11k_wmi_cc_setting_code_to_reg(ext_chan_list_event_hdr->status_code); ++ ath11k_wmi_cc_setting_code_to_reg(ev->status_code); + + reg_info->is_ext_reg_event = true; + +- reg_info->min_bw_2ghz = ext_chan_list_event_hdr->min_bw_2ghz; +- reg_info->max_bw_2ghz = ext_chan_list_event_hdr->max_bw_2ghz; +- reg_info->min_bw_5ghz = ext_chan_list_event_hdr->min_bw_5ghz; +- reg_info->max_bw_5ghz = ext_chan_list_event_hdr->max_bw_5ghz; ++ reg_info->min_bw_2ghz = ev->min_bw_2ghz; ++ reg_info->max_bw_2ghz = ev->max_bw_2ghz; ++ reg_info->min_bw_5ghz = ev->min_bw_5ghz; ++ reg_info->max_bw_5ghz = ev->max_bw_5ghz; + + reg_info->min_bw_6ghz_ap[WMI_REG_INDOOR_AP] = +- ext_chan_list_event_hdr->min_bw_6ghz_ap_lpi; ++ ev->min_bw_6ghz_ap_lpi; + reg_info->max_bw_6ghz_ap[WMI_REG_INDOOR_AP] = +- ext_chan_list_event_hdr->max_bw_6ghz_ap_lpi; ++ ev->max_bw_6ghz_ap_lpi; + reg_info->min_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = +- ext_chan_list_event_hdr->min_bw_6ghz_ap_sp; ++ ev->min_bw_6ghz_ap_sp; + reg_info->max_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = +- ext_chan_list_event_hdr->max_bw_6ghz_ap_sp; ++ ev->max_bw_6ghz_ap_sp; + reg_info->min_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = +- ext_chan_list_event_hdr->min_bw_6ghz_ap_vlp; ++ ev->min_bw_6ghz_ap_vlp; + reg_info->max_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = +- ext_chan_list_event_hdr->max_bw_6ghz_ap_vlp; ++ ev->max_bw_6ghz_ap_vlp; ++ ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "6 GHz AP BW: LPI (%d - %d), SP (%d - %d), VLP (%d - %d)\n", ++ reg_info->min_bw_6ghz_ap[WMI_REG_INDOOR_AP], ++ reg_info->max_bw_6ghz_ap[WMI_REG_INDOOR_AP], ++ reg_info->min_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP], ++ reg_info->max_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP], ++ reg_info->min_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP], ++ reg_info->max_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP]); + + for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { + reg_info->min_bw_6ghz_client[WMI_REG_INDOOR_AP][i] = +- ext_chan_list_event_hdr->min_bw_6ghz_client_lpi[i]; ++ ev->min_bw_6ghz_client_lpi[i]; + reg_info->max_bw_6ghz_client[WMI_REG_INDOOR_AP][i] = +- ext_chan_list_event_hdr->max_bw_6ghz_client_lpi[i]; ++ ev->max_bw_6ghz_client_lpi[i]; + reg_info->min_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = +- ext_chan_list_event_hdr->min_bw_6ghz_client_sp[i]; ++ ev->min_bw_6ghz_client_sp[i]; + reg_info->max_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = +- ext_chan_list_event_hdr->max_bw_6ghz_client_sp[i]; ++ ev->max_bw_6ghz_client_sp[i]; + reg_info->min_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = +- ext_chan_list_event_hdr->min_bw_6ghz_client_vlp[i]; ++ ev->min_bw_6ghz_client_vlp[i]; + reg_info->max_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = +- ext_chan_list_event_hdr->max_bw_6ghz_client_vlp[i]; ++ ev->max_bw_6ghz_client_vlp[i]; ++ ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "6 GHz %s BW: LPI (%d - %d), SP (%d - %d), VLP (%d - %d)\n", ++ ath11k_6ghz_client_type_to_str(i), ++ reg_info->min_bw_6ghz_client[WMI_REG_INDOOR_AP][i], ++ reg_info->max_bw_6ghz_client[WMI_REG_INDOOR_AP][i], ++ reg_info->min_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i], ++ reg_info->max_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i], ++ reg_info->min_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i], ++ reg_info->max_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i]); + } + + ath11k_dbg(ab, ATH11K_DBG_WMI, +- "%s:cc_ext %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", +- __func__, reg_info->alpha2, reg_info->dfs_region, ++ "cc_ext %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", ++ reg_info->alpha2, reg_info->dfs_region, + reg_info->min_bw_2ghz, reg_info->max_bw_2ghz, + reg_info->min_bw_5ghz, reg_info->max_bw_5ghz); + +@@ -5310,9 +5362,8 @@ static int ath11k_pull_reg_chan_list_ext + num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][j]); + + ext_wmi_reg_rule = +- (struct wmi_regulatory_ext_rule *)((u8 *)ext_chan_list_event_hdr +- + sizeof(*ext_chan_list_event_hdr) +- + sizeof(struct wmi_tlv)); ++ (struct wmi_regulatory_ext_rule *)((u8 *)ev + sizeof(*ev) + ++ sizeof(struct wmi_tlv)); + if (num_2ghz_reg_rules) { + reg_info->reg_rules_2ghz_ptr = + create_ext_reg_rules_from_wmi(num_2ghz_reg_rules, +@@ -5323,6 +5374,10 @@ static int ath11k_pull_reg_chan_list_ext + ath11k_warn(ab, "Unable to Allocate memory for 2 GHz rules\n"); + return -ENOMEM; + } ++ ++ ath11k_print_reg_rule(ab, "2 GHz", ++ num_2ghz_reg_rules, ++ reg_info->reg_rules_2ghz_ptr); + } + + ext_wmi_reg_rule += num_2ghz_reg_rules; +@@ -5358,6 +5413,10 @@ static int ath11k_pull_reg_chan_list_ext + ath11k_warn(ab, "Unable to Allocate memory for 5 GHz rules\n"); + return -ENOMEM; + } ++ ++ ath11k_print_reg_rule(ab, "5 GHz", ++ num_5ghz_reg_rules, ++ reg_info->reg_rules_5ghz_ptr); + } + + /* We have adjusted the number of 5 GHz reg rules above. But still those +@@ -5378,10 +5437,17 @@ static int ath11k_pull_reg_chan_list_ext + return -ENOMEM; + } + ++ ath11k_print_reg_rule(ab, ath11k_6ghz_ap_type_to_str(i), ++ num_6ghz_reg_rules_ap[i], ++ reg_info->reg_rules_6ghz_ap_ptr[i]); ++ + ext_wmi_reg_rule += num_6ghz_reg_rules_ap[i]; + } + + for (j = 0; j < WMI_REG_CURRENT_MAX_AP_TYPE; j++) { ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "6 GHz AP type %s", ath11k_6ghz_ap_type_to_str(j)); ++ + for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { + reg_info->reg_rules_6ghz_client_ptr[j][i] = + create_ext_reg_rules_from_wmi(num_6ghz_client[j][i], +@@ -5393,35 +5459,58 @@ static int ath11k_pull_reg_chan_list_ext + return -ENOMEM; + } + ++ ath11k_print_reg_rule(ab, ++ ath11k_6ghz_client_type_to_str(i), ++ num_6ghz_client[j][i], ++ reg_info->reg_rules_6ghz_client_ptr[j][i]); ++ + ext_wmi_reg_rule += num_6ghz_client[j][i]; + } + } + +- reg_info->client_type = ext_chan_list_event_hdr->client_type; +- reg_info->rnr_tpe_usable = ext_chan_list_event_hdr->rnr_tpe_usable; ++ reg_info->client_type = ev->client_type; ++ reg_info->rnr_tpe_usable = ev->rnr_tpe_usable; + reg_info->unspecified_ap_usable = +- ext_chan_list_event_hdr->unspecified_ap_usable; ++ ev->unspecified_ap_usable; + reg_info->domain_code_6ghz_ap[WMI_REG_INDOOR_AP] = +- ext_chan_list_event_hdr->domain_code_6ghz_ap_lpi; ++ ev->domain_code_6ghz_ap_lpi; + reg_info->domain_code_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = +- ext_chan_list_event_hdr->domain_code_6ghz_ap_sp; ++ ev->domain_code_6ghz_ap_sp; + reg_info->domain_code_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = +- ext_chan_list_event_hdr->domain_code_6ghz_ap_vlp; ++ ev->domain_code_6ghz_ap_vlp; ++ ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "6 GHz reg info client type %s rnr_tpe_usable %d unspecified_ap_usable %d AP sub domain: lpi %s, sp %s, vlp %s\n", ++ ath11k_6ghz_client_type_to_str(reg_info->client_type), ++ reg_info->rnr_tpe_usable, ++ reg_info->unspecified_ap_usable, ++ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_ap_lpi), ++ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_ap_sp), ++ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_ap_vlp)); + + for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { + reg_info->domain_code_6ghz_client[WMI_REG_INDOOR_AP][i] = +- ext_chan_list_event_hdr->domain_code_6ghz_client_lpi[i]; ++ ev->domain_code_6ghz_client_lpi[i]; + reg_info->domain_code_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = +- ext_chan_list_event_hdr->domain_code_6ghz_client_sp[i]; ++ ev->domain_code_6ghz_client_sp[i]; + reg_info->domain_code_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = +- ext_chan_list_event_hdr->domain_code_6ghz_client_vlp[i]; ++ ev->domain_code_6ghz_client_vlp[i]; ++ ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "6 GHz client type %s client sub domain: lpi %s, sp %s, vlp %s\n", ++ ath11k_6ghz_client_type_to_str(i), ++ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_client_lpi[i]), ++ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_client_sp[i]), ++ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_client_vlp[i]) ++ ); + } + +- reg_info->domain_code_6ghz_super_id = +- ext_chan_list_event_hdr->domain_code_6ghz_super_id; ++ reg_info->domain_code_6ghz_super_id = ev->domain_code_6ghz_super_id; + +- ath11k_dbg(ab, ATH11K_DBG_WMI, "6 GHz client_type: %d domain_code_6ghz_super_id: %d", +- reg_info->client_type, reg_info->domain_code_6ghz_super_id); ++ ath11k_dbg(ab, ATH11K_DBG_WMI, ++ "6 GHz client_type %s 6 GHz super domain %s", ++ ath11k_6ghz_client_type_to_str(reg_info->client_type), ++ ath11k_super_reg_6ghz_to_str(reg_info->domain_code_6ghz_super_id)); + + ath11k_dbg(ab, ATH11K_DBG_WMI, "processed regulatory ext channel list\n"); + +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -4139,6 +4139,7 @@ enum cc_setting_code { + + /* add new setting code above, update in + * @enum wmi_reg_cc_setting_code as well. ++ * Also handle it in ath11k_cc_status_to_str() + */ + }; + +@@ -4163,21 +4164,162 @@ ath11k_wmi_cc_setting_code_to_reg(enum w + return REG_SET_CC_STATUS_FAIL; + } + ++static inline const char *ath11k_cc_status_to_str(enum cc_setting_code code) ++{ ++ switch (code) { ++ case REG_SET_CC_STATUS_PASS: ++ return "REG_SET_CC_STATUS_PASS"; ++ case REG_CURRENT_ALPHA2_NOT_FOUND: ++ return "REG_CURRENT_ALPHA2_NOT_FOUND"; ++ case REG_INIT_ALPHA2_NOT_FOUND: ++ return "REG_INIT_ALPHA2_NOT_FOUND"; ++ case REG_SET_CC_CHANGE_NOT_ALLOWED: ++ return "REG_SET_CC_CHANGE_NOT_ALLOWED"; ++ case REG_SET_CC_STATUS_NO_MEMORY: ++ return "REG_SET_CC_STATUS_NO_MEMORY"; ++ case REG_SET_CC_STATUS_FAIL: ++ return "REG_SET_CC_STATUS_FAIL"; ++ } ++ ++ return "Unknown CC status"; ++} ++ + enum wmi_reg_6ghz_ap_type { + WMI_REG_INDOOR_AP = 0, + WMI_REG_STANDARD_POWER_AP = 1, + WMI_REG_VERY_LOW_POWER_AP = 2, + ++ /* add AP type above, handle in ath11k_6ghz_ap_type_to_str() ++ */ + WMI_REG_CURRENT_MAX_AP_TYPE, + WMI_REG_MAX_AP_TYPE = 7, + }; + ++static inline const char * ++ath11k_6ghz_ap_type_to_str(enum wmi_reg_6ghz_ap_type type) ++{ ++ switch (type) { ++ case WMI_REG_INDOOR_AP: ++ return "INDOOR AP"; ++ case WMI_REG_STANDARD_POWER_AP: ++ return "STANDARD POWER AP"; ++ case WMI_REG_VERY_LOW_POWER_AP: ++ return "VERY LOW POWER AP"; ++ case WMI_REG_CURRENT_MAX_AP_TYPE: ++ return "CURRENT_MAX_AP_TYPE"; ++ case WMI_REG_MAX_AP_TYPE: ++ return "MAX_AP_TYPE"; ++ } ++ ++ return "unknown 6 GHz AP type"; ++} ++ + enum wmi_reg_6ghz_client_type { + WMI_REG_DEFAULT_CLIENT = 0, + WMI_REG_SUBORDINATE_CLIENT = 1, + WMI_REG_MAX_CLIENT_TYPE = 2, ++ ++ /* add client type above, handle it in ++ * ath11k_6ghz_client_type_to_str() ++ */ ++}; ++ ++static inline const char * ++ath11k_6ghz_client_type_to_str(enum wmi_reg_6ghz_client_type type) ++{ ++ switch (type) { ++ case WMI_REG_DEFAULT_CLIENT: ++ return "DEFAULT CLIENT"; ++ case WMI_REG_SUBORDINATE_CLIENT: ++ return "SUBORDINATE CLIENT"; ++ case WMI_REG_MAX_CLIENT_TYPE: ++ return "MAX_CLIENT_TYPE"; ++ } ++ ++ return "unknown 6 GHz client type"; ++} ++ ++enum reg_subdomains_6ghz { ++ EMPTY_6GHZ = 0x0, ++ FCC1_CLIENT_LPI_REGULAR_6GHZ = 0x01, ++ FCC1_CLIENT_SP_6GHZ = 0x02, ++ FCC1_AP_LPI_6GHZ = 0x03, ++ FCC1_CLIENT_LPI_SUBORDINATE = FCC1_AP_LPI_6GHZ, ++ FCC1_AP_SP_6GHZ = 0x04, ++ ETSI1_LPI_6GHZ = 0x10, ++ ETSI1_VLP_6GHZ = 0x11, ++ ETSI2_LPI_6GHZ = 0x12, ++ ETSI2_VLP_6GHZ = 0x13, ++ APL1_LPI_6GHZ = 0x20, ++ APL1_VLP_6GHZ = 0x21, ++ ++ /* add sub-domain above, handle it in ++ * ath11k_sub_reg_6ghz_to_str() ++ */ ++}; ++ ++static inline const char * ++ath11k_sub_reg_6ghz_to_str(enum reg_subdomains_6ghz sub_id) ++{ ++ switch (sub_id) { ++ case EMPTY_6GHZ: ++ return "N/A"; ++ case FCC1_CLIENT_LPI_REGULAR_6GHZ: ++ return "FCC1_CLIENT_LPI_REGULAR_6GHZ"; ++ case FCC1_CLIENT_SP_6GHZ: ++ return "FCC1_CLIENT_SP_6GHZ"; ++ case FCC1_AP_LPI_6GHZ: ++ return "FCC1_AP_LPI_6GHZ/FCC1_CLIENT_LPI_SUBORDINATE"; ++ case FCC1_AP_SP_6GHZ: ++ return "FCC1_AP_SP_6GHZ"; ++ case ETSI1_LPI_6GHZ: ++ return "ETSI1_LPI_6GHZ"; ++ case ETSI1_VLP_6GHZ: ++ return "ETSI1_VLP_6GHZ"; ++ case ETSI2_LPI_6GHZ: ++ return "ETSI2_LPI_6GHZ"; ++ case ETSI2_VLP_6GHZ: ++ return "ETSI2_VLP_6GHZ"; ++ case APL1_LPI_6GHZ: ++ return "APL1_LPI_6GHZ"; ++ case APL1_VLP_6GHZ: ++ return "APL1_VLP_6GHZ"; ++ } ++ ++ return "unknown sub reg id"; ++} ++ ++enum reg_super_domain_6ghz { ++ FCC1_6GHZ = 0x01, ++ ETSI1_6GHZ = 0x02, ++ ETSI2_6GHZ = 0x03, ++ APL1_6GHZ = 0x04, ++ FCC1_6GHZ_CL = 0x05, ++ ++ /* add super domain above, handle it in ++ * ath11k_super_reg_6ghz_to_str() ++ */ + }; + ++static inline const char * ++ath11k_super_reg_6ghz_to_str(enum reg_super_domain_6ghz domain_id) ++{ ++ switch (domain_id) { ++ case FCC1_6GHZ: ++ return "FCC1_6GHZ"; ++ case ETSI1_6GHZ: ++ return "ETSI1_6GHZ"; ++ case ETSI2_6GHZ: ++ return "ETSI2_6GHZ"; ++ case APL1_6GHZ: ++ return "APL1_6GHZ"; ++ case FCC1_6GHZ_CL: ++ return "FCC1_6GHZ_CL"; ++ } ++ ++ return "unknown domain id"; ++} ++ + struct cur_reg_rule { + u16 start_freq; + u16 end_freq; diff --git a/package/kernel/mac80211/patches/ath11k/0046-wifi-ath11k-Replace-fake-flex-array-with-flexible-ar.patch b/package/kernel/mac80211/patches/ath11k/0046-wifi-ath11k-Replace-fake-flex-array-with-flexible-ar.patch new file mode 100644 index 0000000000..bd16178564 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0046-wifi-ath11k-Replace-fake-flex-array-with-flexible-ar.patch @@ -0,0 +1,246 @@ +From 3b1088a09ec9438523c251d8435e78988824bc0d Mon Sep 17 00:00:00 2001 +From: "Gustavo A. R. Silva" +Date: Tue, 7 Mar 2023 16:22:39 -0600 +Subject: [PATCH] wifi: ath11k: Replace fake flex-array with flexible-array + member +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Zero-length arrays as fake flexible arrays are deprecated and we are +moving towards adopting C99 flexible-array members instead. + +Address 25 of the following warnings found with GCC-13 and +-fstrict-flex-arrays=3 enabled: +drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c:30:51: warning: array subscript is outside array bounds of ‘const u32[0]’ {aka ‘const unsigned int[]’} [-Warray-bounds=] + +This helps with the ongoing efforts to tighten the FORTIFY_SOURCE +routines on memcpy() and help us make progress towards globally +enabling -fstrict-flex-arrays=3 [1]. + +Link: https://github.com/KSPP/linux/issues/21 +Link: https://github.com/KSPP/linux/issues/266 +Link: https://gcc.gnu.org/pipermail/gcc-patches/2022-October/602902.html [1] +Signed-off-by: Gustavo A. R. Silva +Reviewed-by: Simon Horman +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/ZAe5L5DtmsQxzqRH@work +--- + .../wireless/ath/ath11k/debugfs_htt_stats.h | 73 +++++++++++-------- + 1 file changed, 43 insertions(+), 30 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h ++++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h +@@ -143,7 +143,8 @@ enum htt_tx_pdev_underrun_enum { + /* Bytes stored in little endian order */ + /* Length should be multiple of DWORD */ + struct htt_stats_string_tlv { +- u32 data[0]; /* Can be variable length */ ++ /* Can be variable length */ ++ DECLARE_FLEX_ARRAY(u32, data); + } __packed; + + #define HTT_STATS_MAC_ID GENMASK(7, 0) +@@ -205,27 +206,32 @@ struct htt_tx_pdev_stats_cmn_tlv { + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_tx_pdev_stats_urrn_tlv_v { +- u32 urrn_stats[0]; /* HTT_TX_PDEV_MAX_URRN_STATS */ ++ /* HTT_TX_PDEV_MAX_URRN_STATS */ ++ DECLARE_FLEX_ARRAY(u32, urrn_stats); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_tx_pdev_stats_flush_tlv_v { +- u32 flush_errs[0]; /* HTT_TX_PDEV_MAX_FLUSH_REASON_STATS */ ++ /* HTT_TX_PDEV_MAX_FLUSH_REASON_STATS */ ++ DECLARE_FLEX_ARRAY(u32, flush_errs); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_tx_pdev_stats_sifs_tlv_v { +- u32 sifs_status[0]; /* HTT_TX_PDEV_MAX_SIFS_BURST_STATS */ ++ /* HTT_TX_PDEV_MAX_SIFS_BURST_STATS */ ++ DECLARE_FLEX_ARRAY(u32, sifs_status); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_tx_pdev_stats_phy_err_tlv_v { +- u32 phy_errs[0]; /* HTT_TX_PDEV_MAX_PHY_ERR_STATS */ ++ /* HTT_TX_PDEV_MAX_PHY_ERR_STATS */ ++ DECLARE_FLEX_ARRAY(u32, phy_errs); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_tx_pdev_stats_sifs_hist_tlv_v { +- u32 sifs_hist_status[0]; /* HTT_TX_PDEV_SIFS_BURST_HIST_STATS */ ++ /* HTT_TX_PDEV_SIFS_BURST_HIST_STATS */ ++ DECLARE_FLEX_ARRAY(u32, sifs_hist_status); + }; + + struct htt_tx_pdev_stats_tx_ppdu_stats_tlv_v { +@@ -590,20 +596,20 @@ struct htt_tx_hwq_difs_latency_stats_tlv + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_tx_hwq_cmd_result_stats_tlv_v { +- /* Histogram of sched cmd result */ +- u32 cmd_result[0]; /* HTT_TX_HWQ_MAX_CMD_RESULT_STATS */ ++ /* Histogram of sched cmd result, HTT_TX_HWQ_MAX_CMD_RESULT_STATS */ ++ DECLARE_FLEX_ARRAY(u32, cmd_result); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_tx_hwq_cmd_stall_stats_tlv_v { +- /* Histogram of various pause conitions */ +- u32 cmd_stall_status[0]; /* HTT_TX_HWQ_MAX_CMD_STALL_STATS */ ++ /* Histogram of various pause conitions, HTT_TX_HWQ_MAX_CMD_STALL_STATS */ ++ DECLARE_FLEX_ARRAY(u32, cmd_stall_status); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_tx_hwq_fes_result_stats_tlv_v { +- /* Histogram of number of user fes result */ +- u32 fes_result[0]; /* HTT_TX_HWQ_MAX_FES_RESULT_STATS */ ++ /* Histogram of number of user fes result, HTT_TX_HWQ_MAX_FES_RESULT_STATS */ ++ DECLARE_FLEX_ARRAY(u32, fes_result); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size +@@ -635,8 +641,8 @@ struct htt_tx_hwq_tried_mpdu_cnt_hist_tl + * #define WAL_TXOP_USED_HISTOGRAM_INTERVAL 1000 ( 1 ms ) + */ + struct htt_tx_hwq_txop_used_cnt_hist_tlv_v { +- /* Histogram of txop used cnt */ +- u32 txop_used_cnt_hist[0]; /* HTT_TX_HWQ_TXOP_USED_CNT_HIST */ ++ /* Histogram of txop used cnt, HTT_TX_HWQ_TXOP_USED_CNT_HIST */ ++ DECLARE_FLEX_ARRAY(u32, txop_used_cnt_hist); + }; + + /* == TX SELFGEN STATS == */ +@@ -804,17 +810,20 @@ struct htt_tx_pdev_mpdu_stats_tlv { + /* == TX SCHED STATS == */ + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_sched_txq_cmd_posted_tlv_v { +- u32 sched_cmd_posted[0]; /* HTT_TX_PDEV_SCHED_TX_MODE_MAX */ ++ /* HTT_TX_PDEV_SCHED_TX_MODE_MAX */ ++ DECLARE_FLEX_ARRAY(u32, sched_cmd_posted); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_sched_txq_cmd_reaped_tlv_v { +- u32 sched_cmd_reaped[0]; /* HTT_TX_PDEV_SCHED_TX_MODE_MAX */ ++ /* HTT_TX_PDEV_SCHED_TX_MODE_MAX */ ++ DECLARE_FLEX_ARRAY(u32, sched_cmd_reaped); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_sched_txq_sched_order_su_tlv_v { +- u32 sched_order_su[0]; /* HTT_TX_PDEV_NUM_SCHED_ORDER_LOG */ ++ /* HTT_TX_PDEV_NUM_SCHED_ORDER_LOG */ ++ DECLARE_FLEX_ARRAY(u32, sched_order_su); + }; + + enum htt_sched_txq_sched_ineligibility_tlv_enum { +@@ -842,7 +851,7 @@ enum htt_sched_txq_sched_ineligibility_t + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_sched_txq_sched_ineligibility_tlv_v { + /* indexed by htt_sched_txq_sched_ineligibility_tlv_enum */ +- u32 sched_ineligibility[0]; ++ DECLARE_FLEX_ARRAY(u32, sched_ineligibility); + }; + + #define HTT_TX_PDEV_STATS_SCHED_PER_TXQ_MAC_ID GENMASK(7, 0) +@@ -888,18 +897,20 @@ struct htt_stats_tx_sched_cmn_tlv { + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_tx_tqm_gen_mpdu_stats_tlv_v { +- u32 gen_mpdu_end_reason[0]; /* HTT_TX_TQM_MAX_GEN_MPDU_END_REASON */ ++ /* HTT_TX_TQM_MAX_GEN_MPDU_END_REASON */ ++ DECLARE_FLEX_ARRAY(u32, gen_mpdu_end_reason); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_tx_tqm_list_mpdu_stats_tlv_v { +- u32 list_mpdu_end_reason[0]; /* HTT_TX_TQM_MAX_LIST_MPDU_END_REASON */ ++ /* HTT_TX_TQM_MAX_LIST_MPDU_END_REASON */ ++ DECLARE_FLEX_ARRAY(u32, list_mpdu_end_reason); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_tx_tqm_list_mpdu_cnt_tlv_v { +- u32 list_mpdu_cnt_hist[0]; +- /* HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS */ ++ /* HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS */ ++ DECLARE_FLEX_ARRAY(u32, list_mpdu_cnt_hist); + }; + + struct htt_tx_tqm_pdev_stats_tlv_v { +@@ -1098,7 +1109,7 @@ struct htt_tx_de_compl_stats_tlv { + * ENTRIES_PER_BIN_COUNT) + */ + struct htt_tx_de_fw2wbm_ring_full_hist_tlv { +- u32 fw2wbm_ring_full_hist[0]; ++ DECLARE_FLEX_ARRAY(u32, fw2wbm_ring_full_hist); + }; + + struct htt_tx_de_cmn_stats_tlv { +@@ -1151,7 +1162,7 @@ struct htt_ring_if_cmn_tlv { + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_sfm_client_user_tlv_v { + /* Number of DWORDS used per user and per client */ +- u32 dwords_used_by_user_n[0]; ++ DECLARE_FLEX_ARRAY(u32, dwords_used_by_user_n); + }; + + struct htt_sfm_client_tlv { +@@ -1436,12 +1447,14 @@ struct htt_rx_soc_fw_stats_tlv { + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_rx_soc_fw_refill_ring_empty_tlv_v { +- u32 refill_ring_empty_cnt[0]; /* HTT_RX_STATS_REFILL_MAX_RING */ ++ /* HTT_RX_STATS_REFILL_MAX_RING */ ++ DECLARE_FLEX_ARRAY(u32, refill_ring_empty_cnt); + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_rx_soc_fw_refill_ring_num_refill_tlv_v { +- u32 refill_ring_num_refill[0]; /* HTT_RX_STATS_REFILL_MAX_RING */ ++ /* HTT_RX_STATS_REFILL_MAX_RING */ ++ DECLARE_FLEX_ARRAY(u32, refill_ring_num_refill); + }; + + /* RXDMA error code from WBM released packets */ +@@ -1473,7 +1486,7 @@ enum htt_rx_rxdma_error_code_enum { + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v { +- u32 rxdma_err[0]; /* HTT_RX_RXDMA_MAX_ERR_CODE */ ++ DECLARE_FLEX_ARRAY(u32, rxdma_err); /* HTT_RX_RXDMA_MAX_ERR_CODE */ + }; + + /* REO error code from WBM released packets */ +@@ -1505,7 +1518,7 @@ enum htt_rx_reo_error_code_enum { + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v { +- u32 reo_err[0]; /* HTT_RX_REO_MAX_ERR_CODE */ ++ DECLARE_FLEX_ARRAY(u32, reo_err); /* HTT_RX_REO_MAX_ERR_CODE */ + }; + + /* == RX PDEV STATS == */ +@@ -1622,13 +1635,13 @@ struct htt_rx_pdev_fw_stats_phy_err_tlv + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_rx_pdev_fw_ring_mpdu_err_tlv_v { + /* Num error MPDU for each RxDMA error type */ +- u32 fw_ring_mpdu_err[0]; /* HTT_RX_STATS_RXDMA_MAX_ERR */ ++ DECLARE_FLEX_ARRAY(u32, fw_ring_mpdu_err); /* HTT_RX_STATS_RXDMA_MAX_ERR */ + }; + + /* NOTE: Variable length TLV, use length spec to infer array size */ + struct htt_rx_pdev_fw_mpdu_drop_tlv_v { + /* Num MPDU dropped */ +- u32 fw_mpdu_drop[0]; /* HTT_RX_STATS_FW_DROP_REASON_MAX */ ++ DECLARE_FLEX_ARRAY(u32, fw_mpdu_drop); /* HTT_RX_STATS_FW_DROP_REASON_MAX */ + }; + + #define HTT_PDEV_CCA_STATS_TX_FRAME_INFO_PRESENT (0x1) diff --git a/package/kernel/mac80211/patches/ath11k/0047-wifi-ath11k-fix-deinitialization-of-firmware-resourc.patch b/package/kernel/mac80211/patches/ath11k/0047-wifi-ath11k-fix-deinitialization-of-firmware-resourc.patch new file mode 100644 index 0000000000..eec11f50e3 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0047-wifi-ath11k-fix-deinitialization-of-firmware-resourc.patch @@ -0,0 +1,79 @@ +From 5a78ac33e3cb8822da64dd1af196e83664b332b0 Mon Sep 17 00:00:00 2001 +From: Aditya Kumar Singh +Date: Thu, 9 Mar 2023 15:23:08 +0530 +Subject: [PATCH] wifi: ath11k: fix deinitialization of firmware resources + +Currently, in ath11k_ahb_fw_resources_init(), iommu domain +mapping is done only for the chipsets having fixed firmware +memory. Also, for such chipsets, mapping is done only if it +does not have TrustZone support. + +During deinitialization, only if TrustZone support is not there, +iommu is unmapped back. However, for non fixed firmware memory +chipsets, TrustZone support is not there and this makes the +condition check to true and it tries to unmap the memory which +was not mapped during initialization. + +This leads to the following trace - + +[ 83.198790] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008 +[ 83.259537] Modules linked in: ath11k_ahb ath11k qmi_helpers +.. snip .. +[ 83.280286] pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) +[ 83.287228] pc : __iommu_unmap+0x30/0x140 +[ 83.293907] lr : iommu_unmap+0x5c/0xa4 +[ 83.298072] sp : ffff80000b3abad0 +.. snip .. +[ 83.369175] Call trace: +[ 83.376282] __iommu_unmap+0x30/0x140 +[ 83.378541] iommu_unmap+0x5c/0xa4 +[ 83.382360] ath11k_ahb_fw_resource_deinit.part.12+0x2c/0xac [ath11k_ahb] +[ 83.385666] ath11k_ahb_free_resources+0x140/0x17c [ath11k_ahb] +[ 83.392521] ath11k_ahb_shutdown+0x34/0x40 [ath11k_ahb] +[ 83.398248] platform_shutdown+0x20/0x2c +[ 83.403455] device_shutdown+0x16c/0x1c4 +[ 83.407621] kernel_restart_prepare+0x34/0x3c +[ 83.411529] kernel_restart+0x14/0x74 +[ 83.415781] __do_sys_reboot+0x1c4/0x22c +[ 83.419427] __arm64_sys_reboot+0x1c/0x24 +[ 83.423420] invoke_syscall+0x44/0xfc +[ 83.427326] el0_svc_common.constprop.3+0xac/0xe8 +[ 83.430974] do_el0_svc+0xa0/0xa8 +[ 83.435659] el0_svc+0x1c/0x44 +[ 83.438957] el0t_64_sync_handler+0x60/0x144 +[ 83.441910] el0t_64_sync+0x15c/0x160 +[ 83.446343] Code: aa0103f4 f9400001 f90027a1 d2800001 (f94006a0) +[ 83.449903] ---[ end trace 0000000000000000 ]--- + +This can be reproduced by probing an AHB chipset which is not +having a fixed memory region. During reboot (or rmmod) trace +can be seen. + +Fix this issue by adding a condition check on firmware fixed memory +hw_param as done in the counter initialization function. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Fixes: f9eec4947add ("ath11k: Add support for targets without trustzone") +Signed-off-by: Aditya Kumar Singh +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230309095308.24937-1-quic_adisi@quicinc.com +--- + drivers/net/wireless/ath/ath11k/ahb.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -1078,6 +1078,12 @@ static int ath11k_ahb_fw_resource_deinit + struct iommu_domain *iommu; + size_t unmapped_size; + ++ /* Chipsets not requiring MSA would have not initialized ++ * MSA resources, return success in such cases. ++ */ ++ if (!ab->hw_params.fixed_fw_mem) ++ return 0; ++ + if (ab_ahb->fw.use_tz) + return 0; + diff --git a/package/kernel/mac80211/patches/ath11k/0048-wifi-ath11k-fix-BUFFER_DONE-read-on-monitor-ring-rx-.patch b/package/kernel/mac80211/patches/ath11k/0048-wifi-ath11k-fix-BUFFER_DONE-read-on-monitor-ring-rx-.patch new file mode 100644 index 0000000000..3e22645331 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0048-wifi-ath11k-fix-BUFFER_DONE-read-on-monitor-ring-rx-.patch @@ -0,0 +1,130 @@ +From 68e93ac5a31d4975b25f819b2dfe914c72abc3bb Mon Sep 17 00:00:00 2001 +From: Harshitha Prem +Date: Wed, 15 Mar 2023 12:24:43 +0200 +Subject: [PATCH] wifi: ath11k: fix BUFFER_DONE read on monitor ring rx buffer + +Perform dma_sync_single_for_cpu() on monitor ring rx buffer before +reading BUFFER_DONE tag and do dma_unmap_single() only after device +had set BUFFER_DONE tag to the buffer. + +Also when BUFFER_DONE tag is not set, allow the buffer to get read +next time without freeing skb. + +This helps to fix AP+Monitor VAP with flood traffic scenario to see +monitor ring rx buffer overrun missing BUFFER_DONE tag to be set. + +Also remove redundant rx dma buf free performed on DP +rx_mon_status_refill_ring. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sathishkumar Muruganandam +Signed-off-by: Harshitha Prem +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230309164434.32660-1-quic_hprem@quicinc.com +--- + drivers/net/wireless/ath/ath11k/dp_rx.c | 57 ++++++++++--------------- + 1 file changed, 23 insertions(+), 34 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/dp_rx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c +@@ -435,7 +435,6 @@ fail_free_skb: + static int ath11k_dp_rxdma_buf_ring_free(struct ath11k *ar, + struct dp_rxdma_ring *rx_ring) + { +- struct ath11k_pdev_dp *dp = &ar->dp; + struct sk_buff *skb; + int buf_id; + +@@ -453,28 +452,6 @@ static int ath11k_dp_rxdma_buf_ring_free + idr_destroy(&rx_ring->bufs_idr); + spin_unlock_bh(&rx_ring->idr_lock); + +- /* if rxdma1_enable is false, mon_status_refill_ring +- * isn't setup, so don't clean. +- */ +- if (!ar->ab->hw_params.rxdma1_enable) +- return 0; +- +- rx_ring = &dp->rx_mon_status_refill_ring[0]; +- +- spin_lock_bh(&rx_ring->idr_lock); +- idr_for_each_entry(&rx_ring->bufs_idr, skb, buf_id) { +- idr_remove(&rx_ring->bufs_idr, buf_id); +- /* XXX: Understand where internal driver does this dma_unmap +- * of rxdma_buffer. +- */ +- dma_unmap_single(ar->ab->dev, ATH11K_SKB_RXCB(skb)->paddr, +- skb->len + skb_tailroom(skb), DMA_BIDIRECTIONAL); +- dev_kfree_skb_any(skb); +- } +- +- idr_destroy(&rx_ring->bufs_idr); +- spin_unlock_bh(&rx_ring->idr_lock); +- + return 0; + } + +@@ -3029,39 +3006,51 @@ static int ath11k_dp_rx_reap_mon_status_ + + spin_lock_bh(&rx_ring->idr_lock); + skb = idr_find(&rx_ring->bufs_idr, buf_id); ++ spin_unlock_bh(&rx_ring->idr_lock); ++ + if (!skb) { + ath11k_warn(ab, "rx monitor status with invalid buf_id %d\n", + buf_id); +- spin_unlock_bh(&rx_ring->idr_lock); + pmon->buf_state = DP_MON_STATUS_REPLINISH; + goto move_next; + } + +- idr_remove(&rx_ring->bufs_idr, buf_id); +- spin_unlock_bh(&rx_ring->idr_lock); +- + rxcb = ATH11K_SKB_RXCB(skb); + +- dma_unmap_single(ab->dev, rxcb->paddr, +- skb->len + skb_tailroom(skb), +- DMA_FROM_DEVICE); ++ dma_sync_single_for_cpu(ab->dev, rxcb->paddr, ++ skb->len + skb_tailroom(skb), ++ DMA_FROM_DEVICE); + + tlv = (struct hal_tlv_hdr *)skb->data; + if (FIELD_GET(HAL_TLV_HDR_TAG, tlv->tl) != + HAL_RX_STATUS_BUFFER_DONE) { +- ath11k_warn(ab, "mon status DONE not set %lx\n", ++ ath11k_warn(ab, "mon status DONE not set %lx, buf_id %d\n", + FIELD_GET(HAL_TLV_HDR_TAG, +- tlv->tl)); +- dev_kfree_skb_any(skb); ++ tlv->tl), buf_id); ++ /* If done status is missing, hold onto status ++ * ring until status is done for this status ++ * ring buffer. ++ * Keep HP in mon_status_ring unchanged, ++ * and break from here. ++ * Check status for same buffer for next time ++ */ + pmon->buf_state = DP_MON_STATUS_NO_DMA; +- goto move_next; ++ break; + } + ++ spin_lock_bh(&rx_ring->idr_lock); ++ idr_remove(&rx_ring->bufs_idr, buf_id); ++ spin_unlock_bh(&rx_ring->idr_lock); + if (ab->hw_params.full_monitor_mode) { + ath11k_dp_rx_mon_update_status_buf_state(pmon, tlv); + if (paddr == pmon->mon_status_paddr) + pmon->buf_state = DP_MON_STATUS_MATCH; + } ++ ++ dma_unmap_single(ab->dev, rxcb->paddr, ++ skb->len + skb_tailroom(skb), ++ DMA_FROM_DEVICE); ++ + __skb_queue_tail(skb_list, skb); + } else { + pmon->buf_state = DP_MON_STATUS_REPLINISH; diff --git a/package/kernel/mac80211/patches/ath11k/0049-wifi-ath11k-Optimize-6-GHz-scan-time.patch b/package/kernel/mac80211/patches/ath11k/0049-wifi-ath11k-Optimize-6-GHz-scan-time.patch new file mode 100644 index 0000000000..f468990feb --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0049-wifi-ath11k-Optimize-6-GHz-scan-time.patch @@ -0,0 +1,101 @@ +From 8b4d2f080afbd4280ecca0f4b3ceea943a7a86d0 Mon Sep 17 00:00:00 2001 +From: Manikanta Pubbisetty +Date: Thu, 23 Mar 2023 11:39:13 +0530 +Subject: [PATCH] wifi: ath11k: Optimize 6 GHz scan time + +Currently, time taken to scan all supported channels on WCN6750 +is ~8 seconds and connection time is almost 10 seconds. WCN6750 +supports three Wi-Fi bands (i.e., 2.4/5/6 GHz) and the numbers of +channels for scan come around ~100 channels (default case). +Since the chip doesn't have support for DBS (Dual Band Simultaneous), +scans cannot be parallelized resulting in longer scan times. + +Among the 100 odd channels, ~60 channels are in 6 GHz band. Therefore, +optimizing the scan for 6 GHz channels will bring down the overall +scan time. + +WCN6750 firmware has support to scan a 6 GHz channel based on co-located +AP information i.e., RNR IE which is found in the legacy 2.4/5 GHz scan +results. When a scan request with all supported channel list is enqueued +to the firmware, then based on WMI_SCAN_CHAN_FLAG_SCAN_ONLY_IF_RNR_FOUND +scan channel flag, firmware will scan only those 6 GHz channels for which +RNR IEs are found in the legacy scan results. + +In the proposed design, based on NL80211_SCAN_FLAG_COLOCATED_6GHZ scan +flag, driver will set the WMI_SCAN_CHAN_FLAG_SCAN_ONLY_IF_RNR_FOUND flag +for non-PSC channels. Since there is high probability to find 6 GHz APs +on PSC channels, these channels are always scanned. Only non-PSC channels +are selectively scanned based on cached RNR information from the legacy +scan results. + +If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set in the scan flags, +then scan will happen on all supported channels (default behavior). + +With these optimizations, scan time is improved by 1.5-1.8 seconds on +WCN6750. Similar savings have been observed on WCN6855. + +Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 +Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.16 + +Signed-off-by: Manikanta Pubbisetty +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230323060913.10097-1-quic_mpubbise@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 25 +++++++++++++++++++++++-- + drivers/net/wireless/ath/ath11k/wmi.h | 4 ++++ + 2 files changed, 27 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -3819,8 +3819,29 @@ static int ath11k_mac_op_hw_scan(struct + goto exit; + } + +- for (i = 0; i < arg->num_chan; i++) +- arg->chan_list[i] = req->channels[i]->center_freq; ++ for (i = 0; i < arg->num_chan; i++) { ++ if (test_bit(WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL, ++ ar->ab->wmi_ab.svc_map)) { ++ arg->chan_list[i] = ++ u32_encode_bits(req->channels[i]->center_freq, ++ WMI_SCAN_CONFIG_PER_CHANNEL_MASK); ++ ++ /* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set in scan ++ * flags, then scan all PSC channels in 6 GHz band and ++ * those non-PSC channels where RNR IE is found during ++ * the legacy 2.4/5 GHz scan. ++ * If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set, ++ * then all channels in 6 GHz will be scanned. ++ */ ++ if (req->channels[i]->band == NL80211_BAND_6GHZ && ++ req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ && ++ !cfg80211_channel_is_psc(req->channels[i])) ++ arg->chan_list[i] |= ++ WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND; ++ } else { ++ arg->chan_list[i] = req->channels[i]->center_freq; ++ } ++ } + } + + if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -2100,6 +2100,7 @@ enum wmi_tlv_service { + + /* The second 128 bits */ + WMI_MAX_EXT_SERVICE = 256, ++ WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL = 265, + WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT = 281, + WMI_TLV_SERVICE_BIOS_SAR_SUPPORT = 326, + +@@ -3249,6 +3250,9 @@ struct wmi_start_scan_cmd { + #define WMI_SCAN_DWELL_MODE_SHIFT 21 + #define WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE 0x00000800 + ++#define WMI_SCAN_CONFIG_PER_CHANNEL_MASK GENMASK(19, 0) ++#define WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND BIT(20) ++ + enum { + WMI_SCAN_DWELL_MODE_DEFAULT = 0, + WMI_SCAN_DWELL_MODE_CONSERVATIVE = 1, diff --git a/package/kernel/mac80211/patches/ath11k/0050-wifi-ath11k-Configure-the-FTM-responder-role-using-f.patch b/package/kernel/mac80211/patches/ath11k/0050-wifi-ath11k-Configure-the-FTM-responder-role-using-f.patch new file mode 100644 index 0000000000..bca08b177f --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0050-wifi-ath11k-Configure-the-FTM-responder-role-using-f.patch @@ -0,0 +1,117 @@ +From 813968c24126cc5c8320cd5db0e262069a535063 Mon Sep 17 00:00:00 2001 +From: Ganesh Babu Jothiram +Date: Fri, 24 Mar 2023 16:57:00 +0200 +Subject: [PATCH] wifi: ath11k: Configure the FTM responder role using firmware + capability flag + +Fine Time Measurement(FTM) is offloaded feature to firmware. +Hence, the configuration of FTM responder role is done using +firmware capability flag instead of hw param. + +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Ganesh Babu Jothiram +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230317072034.8217-1-quic_gjothira@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 8 -------- + drivers/net/wireless/ath/ath11k/hw.h | 1 - + drivers/net/wireless/ath/ath11k/mac.c | 4 ++-- + 3 files changed, 2 insertions(+), 11 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -116,7 +116,6 @@ static const struct ath11k_hw_params ath + .tcl_ring_retry = true, + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, +- .ftm_responder = true, + }, + { + .hw_rev = ATH11K_HW_IPQ6018_HW10, +@@ -199,7 +198,6 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = false, +- .ftm_responder = true, + }, + { + .name = "qca6390 hw2.0", +@@ -284,7 +282,6 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = true, +- .ftm_responder = false, + }, + { + .name = "qcn9074 hw1.0", +@@ -366,7 +363,6 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = false, +- .ftm_responder = true, + }, + { + .name = "wcn6855 hw2.0", +@@ -451,7 +447,6 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = true, +- .ftm_responder = false, + }, + { + .name = "wcn6855 hw2.1", +@@ -534,7 +529,6 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = true, +- .ftm_responder = false, + }, + { + .name = "wcn6750 hw1.0", +@@ -615,7 +609,6 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750, + .smp2p_wow_exit = true, + .support_fw_mac_sequence = true, +- .ftm_responder = false, + }, + { + .hw_rev = ATH11K_HW_IPQ5018_HW10, +@@ -695,7 +688,6 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = false, +- .ftm_responder = true, + }, + }; + +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -224,7 +224,6 @@ struct ath11k_hw_params { + u32 tx_ring_size; + bool smp2p_wow_exit; + bool support_fw_mac_sequence; +- bool ftm_responder; + }; + + struct ath11k_hw_ops { +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -3538,7 +3538,7 @@ static void ath11k_mac_op_bss_info_chang + + if (changed & BSS_CHANGED_FTM_RESPONDER && + arvif->ftm_responder != info->ftm_responder && +- ar->ab->hw_params.ftm_responder && ++ test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map) && + (vif->type == NL80211_IFTYPE_AP || + vif->type == NL80211_IFTYPE_MESH_POINT)) { + arvif->ftm_responder = info->ftm_responder; +@@ -9234,7 +9234,7 @@ static int __ath11k_mac_register(struct + wiphy_ext_feature_set(ar->hw->wiphy, + NL80211_EXT_FEATURE_SET_SCAN_DWELL); + +- if (ab->hw_params.ftm_responder) ++ if (test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map)) + wiphy_ext_feature_set(ar->hw->wiphy, + NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER); + diff --git a/package/kernel/mac80211/patches/ath11k/0051-wifi-ath11k-fix-rssi-station-dump-not-updated-in-QCN.patch b/package/kernel/mac80211/patches/ath11k/0051-wifi-ath11k-fix-rssi-station-dump-not-updated-in-QCN.patch new file mode 100644 index 0000000000..835dece1fe --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0051-wifi-ath11k-fix-rssi-station-dump-not-updated-in-QCN.patch @@ -0,0 +1,158 @@ +From 031ffa6c2cd305a57ccc6d610f2decd956b2e7f6 Mon Sep 17 00:00:00 2001 +From: P Praneesh +Date: Fri, 24 Mar 2023 16:57:00 +0200 +Subject: [PATCH] wifi: ath11k: fix rssi station dump not updated in QCN9074 + +In QCN9074, station dump signal values display default value which +is -95 dbm, since there is firmware header change for HAL_RX_MPDU_START +between QCN9074 and IPQ8074 which cause wrong peer_id fetch from msdu. +Fix this by updating hal_rx_mpdu_info with corresponding QCN9074 tlv +format. + +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01695-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: P Praneesh +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230320110312.20639-1-quic_ppranees@quicinc.com +--- + drivers/net/wireless/ath/ath11k/hal_rx.c | 10 ++++++++- + drivers/net/wireless/ath/ath11k/hal_rx.h | 18 +++++++++++++++- + drivers/net/wireless/ath/ath11k/hw.c | 27 ++++++++++++++++-------- + drivers/net/wireless/ath/ath11k/hw.h | 2 +- + 4 files changed, 45 insertions(+), 12 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/hal_rx.c ++++ b/drivers/net/wireless/ath/ath11k/hal_rx.c +@@ -865,6 +865,12 @@ ath11k_hal_rx_populate_mu_user_info(void + ath11k_hal_rx_populate_byte_count(rx_tlv, ppdu_info, rx_user_status); + } + ++static u16 ath11k_hal_rx_mpduinfo_get_peerid(struct ath11k_base *ab, ++ struct hal_rx_mpdu_info *mpdu_info) ++{ ++ return ab->hw_params.hw_ops->mpdu_info_get_peerid(mpdu_info); ++} ++ + static enum hal_rx_mon_status + ath11k_hal_rx_parse_mon_status_tlv(struct ath11k_base *ab, + struct hal_rx_mon_ppdu_info *ppdu_info, +@@ -1459,9 +1465,11 @@ ath11k_hal_rx_parse_mon_status_tlv(struc + break; + } + case HAL_RX_MPDU_START: { ++ struct hal_rx_mpdu_info *mpdu_info = ++ (struct hal_rx_mpdu_info *)tlv_data; + u16 peer_id; + +- peer_id = ab->hw_params.hw_ops->mpdu_info_get_peerid(tlv_data); ++ peer_id = ath11k_hal_rx_mpduinfo_get_peerid(ab, mpdu_info); + if (peer_id) + ppdu_info->peer_id = peer_id; + break; +--- a/drivers/net/wireless/ath/ath11k/hal_rx.h ++++ b/drivers/net/wireless/ath/ath11k/hal_rx.h +@@ -405,7 +405,7 @@ struct hal_rx_phyrx_rssi_legacy_info { + #define HAL_RX_MPDU_INFO_INFO0_PEERID_WCN6855 GENMASK(15, 0) + #define HAL_RX_MPDU_INFO_INFO1_MPDU_LEN GENMASK(13, 0) + +-struct hal_rx_mpdu_info { ++struct hal_rx_mpdu_info_ipq8074 { + __le32 rsvd0; + __le32 info0; + __le32 rsvd1[11]; +@@ -413,12 +413,28 @@ struct hal_rx_mpdu_info { + __le32 rsvd2[9]; + } __packed; + ++struct hal_rx_mpdu_info_qcn9074 { ++ __le32 rsvd0[10]; ++ __le32 info0; ++ __le32 rsvd1[2]; ++ __le32 info1; ++ __le32 rsvd2[9]; ++} __packed; ++ + struct hal_rx_mpdu_info_wcn6855 { + __le32 rsvd0[8]; + __le32 info0; + __le32 rsvd1[14]; + } __packed; + ++struct hal_rx_mpdu_info { ++ union { ++ struct hal_rx_mpdu_info_ipq8074 ipq8074; ++ struct hal_rx_mpdu_info_qcn9074 qcn9074; ++ struct hal_rx_mpdu_info_wcn6855 wcn6855; ++ } u; ++} __packed; ++ + #define HAL_RX_PPDU_END_DURATION GENMASK(23, 0) + struct hal_rx_ppdu_end_duration { + __le32 rsvd0[9]; +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -835,26 +835,35 @@ static void ath11k_hw_ipq5018_reo_setup( + ring_hash_map); + } + +-static u16 ath11k_hw_ipq8074_mpdu_info_get_peerid(u8 *tlv_data) ++static u16 ++ath11k_hw_ipq8074_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info) + { + u16 peer_id = 0; +- struct hal_rx_mpdu_info *mpdu_info = +- (struct hal_rx_mpdu_info *)tlv_data; + + peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID, +- __le32_to_cpu(mpdu_info->info0)); ++ __le32_to_cpu(mpdu_info->u.ipq8074.info0)); + + return peer_id; + } + +-static u16 ath11k_hw_wcn6855_mpdu_info_get_peerid(u8 *tlv_data) ++static u16 ++ath11k_hw_qcn9074_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info) ++{ ++ u16 peer_id = 0; ++ ++ peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID, ++ __le32_to_cpu(mpdu_info->u.qcn9074.info0)); ++ ++ return peer_id; ++} ++ ++static u16 ++ath11k_hw_wcn6855_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info) + { + u16 peer_id = 0; +- struct hal_rx_mpdu_info_wcn6855 *mpdu_info = +- (struct hal_rx_mpdu_info_wcn6855 *)tlv_data; + + peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID_WCN6855, +- __le32_to_cpu(mpdu_info->info0)); ++ __le32_to_cpu(mpdu_info->u.wcn6855.info0)); + return peer_id; + } + +@@ -1042,7 +1051,7 @@ const struct ath11k_hw_ops qcn9074_ops = + .rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention, + .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload, + .reo_setup = ath11k_hw_ipq8074_reo_setup, +- .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid, ++ .mpdu_info_get_peerid = ath11k_hw_qcn9074_mpdu_info_get_peerid, + .rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid, + .rx_desc_mpdu_start_addr2 = ath11k_hw_ipq9074_rx_desc_mpdu_start_addr2, + .get_ring_selector = ath11k_hw_ipq8074_get_tcl_ring_selector, +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -263,7 +263,7 @@ struct ath11k_hw_ops { + struct rx_attention *(*rx_desc_get_attention)(struct hal_rx_desc *desc); + u8 *(*rx_desc_get_msdu_payload)(struct hal_rx_desc *desc); + void (*reo_setup)(struct ath11k_base *ab); +- u16 (*mpdu_info_get_peerid)(u8 *tlv_data); ++ u16 (*mpdu_info_get_peerid)(struct hal_rx_mpdu_info *mpdu_info); + bool (*rx_desc_mac_addr2_valid)(struct hal_rx_desc *desc); + u8* (*rx_desc_mpdu_start_addr2)(struct hal_rx_desc *desc); + u32 (*get_ring_selector)(struct sk_buff *skb); diff --git a/package/kernel/mac80211/patches/ath11k/0052-wifi-ath11k-Fix-invalid-management-rx-frame-length-i.patch b/package/kernel/mac80211/patches/ath11k/0052-wifi-ath11k-Fix-invalid-management-rx-frame-length-i.patch new file mode 100644 index 0000000000..0c1637fb04 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0052-wifi-ath11k-Fix-invalid-management-rx-frame-length-i.patch @@ -0,0 +1,115 @@ +From 447b0398a9cd41ca343dfd43e555af92d6214487 Mon Sep 17 00:00:00 2001 +From: Bhagavathi Perumal S +Date: Fri, 24 Mar 2023 16:57:00 +0200 +Subject: [PATCH] wifi: ath11k: Fix invalid management rx frame length issue + +The WMI management rx event has multiple arrays of TLVs, however the common +WMI TLV parser won't handle multiple TLV tags of same type. +So the multiple array tags of WMI management rx TLV is parsed incorrectly +and the length calculated becomes wrong when the target sends multiple +array tags. + +Add separate TLV parser to handle multiple arrays for WMI management rx +TLV. This fixes invalid length issue when the target sends multiple array +tags. + +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Bhagavathi Perumal S +Co-developed-by: Nagarajan Maran +Signed-off-by: Nagarajan Maran +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230320133840.30162-1-quic_nmaran@quicinc.com +--- + drivers/net/wireless/ath/ath11k/wmi.c | 45 +++++++++++++++++++++------ + 1 file changed, 35 insertions(+), 10 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -82,6 +82,12 @@ struct wmi_tlv_fw_stats_parse { + bool chain_rssi_done; + }; + ++struct wmi_tlv_mgmt_rx_parse { ++ const struct wmi_mgmt_rx_hdr *fixed; ++ const u8 *frame_buf; ++ bool frame_buf_done; ++}; ++ + static const struct wmi_tlv_policy wmi_tlv_policies[] = { + [WMI_TAG_ARRAY_BYTE] + = { .min_len = 0 }, +@@ -5633,28 +5639,49 @@ static int ath11k_pull_vdev_stopped_para + return 0; + } + ++static int ath11k_wmi_tlv_mgmt_rx_parse(struct ath11k_base *ab, ++ u16 tag, u16 len, ++ const void *ptr, void *data) ++{ ++ struct wmi_tlv_mgmt_rx_parse *parse = data; ++ ++ switch (tag) { ++ case WMI_TAG_MGMT_RX_HDR: ++ parse->fixed = ptr; ++ break; ++ case WMI_TAG_ARRAY_BYTE: ++ if (!parse->frame_buf_done) { ++ parse->frame_buf = ptr; ++ parse->frame_buf_done = true; ++ } ++ break; ++ } ++ return 0; ++} ++ + static int ath11k_pull_mgmt_rx_params_tlv(struct ath11k_base *ab, + struct sk_buff *skb, + struct mgmt_rx_event_params *hdr) + { +- const void **tb; ++ struct wmi_tlv_mgmt_rx_parse parse = { }; + const struct wmi_mgmt_rx_hdr *ev; + const u8 *frame; + int ret; + +- tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC); +- if (IS_ERR(tb)) { +- ret = PTR_ERR(tb); +- ath11k_warn(ab, "failed to parse tlv: %d\n", ret); ++ ret = ath11k_wmi_tlv_iter(ab, skb->data, skb->len, ++ ath11k_wmi_tlv_mgmt_rx_parse, ++ &parse); ++ if (ret) { ++ ath11k_warn(ab, "failed to parse mgmt rx tlv %d\n", ++ ret); + return ret; + } + +- ev = tb[WMI_TAG_MGMT_RX_HDR]; +- frame = tb[WMI_TAG_ARRAY_BYTE]; ++ ev = parse.fixed; ++ frame = parse.frame_buf; + + if (!ev || !frame) { + ath11k_warn(ab, "failed to fetch mgmt rx hdr"); +- kfree(tb); + return -EPROTO; + } + +@@ -5673,7 +5700,6 @@ static int ath11k_pull_mgmt_rx_params_tl + + if (skb->len < (frame - skb->data) + hdr->buf_len) { + ath11k_warn(ab, "invalid length in mgmt rx hdr ev"); +- kfree(tb); + return -EPROTO; + } + +@@ -5685,7 +5711,6 @@ static int ath11k_pull_mgmt_rx_params_tl + + ath11k_ce_byte_swap(skb->data, hdr->buf_len); + +- kfree(tb); + return 0; + } + diff --git a/package/kernel/mac80211/patches/ath11k/0053-wifi-ath11k-fix-writing-to-unintended-memory-region.patch b/package/kernel/mac80211/patches/ath11k/0053-wifi-ath11k-fix-writing-to-unintended-memory-region.patch new file mode 100644 index 0000000000..7b8a7d4543 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0053-wifi-ath11k-fix-writing-to-unintended-memory-region.patch @@ -0,0 +1,43 @@ +From 756a7f90878f0866fd2fe167ef37e90b47326b96 Mon Sep 17 00:00:00 2001 +From: P Praneesh +Date: Fri, 24 Mar 2023 16:57:01 +0200 +Subject: [PATCH] wifi: ath11k: fix writing to unintended memory region + +While initializing spectral, the magic value is getting written to the +invalid memory address leading to random boot-up crash. This occurs +due to the incorrect index increment in ath11k_dbring_fill_magic_value +function. Fix it by replacing the existing logic with memset32 to ensure +there is no invalid memory access. + +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01838-QCAHKSWPL_SILICONZ-1 + +Fixes: d3d358efc553 ("ath11k: add spectral/CFR buffer validation support") +Signed-off-by: P Praneesh +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230321052900.16895-1-quic_ppranees@quicinc.com +--- + drivers/net/wireless/ath/ath11k/dbring.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/dbring.c ++++ b/drivers/net/wireless/ath/ath11k/dbring.c +@@ -26,13 +26,13 @@ int ath11k_dbring_validate_buffer(struct + static void ath11k_dbring_fill_magic_value(struct ath11k *ar, + void *buffer, u32 size) + { +- u32 *temp; +- int idx; ++ /* memset32 function fills buffer payload with the ATH11K_DB_MAGIC_VALUE ++ * and the variable size is expected to be the number of u32 values ++ * to be stored, not the number of bytes. ++ */ ++ size = size / sizeof(u32); + +- size = size >> 2; +- +- for (idx = 0, temp = buffer; idx < size; idx++, temp++) +- *temp++ = ATH11K_DB_MAGIC_VALUE; ++ memset32(buffer, ATH11K_DB_MAGIC_VALUE, size); + } + + static int ath11k_dbring_bufs_replenish(struct ath11k *ar, diff --git a/package/kernel/mac80211/patches/ath11k/0054-wifi-ath11k-Send-11d-scan-start-before-WMI_START_SCA.patch b/package/kernel/mac80211/patches/ath11k/0054-wifi-ath11k-Send-11d-scan-start-before-WMI_START_SCA.patch new file mode 100644 index 0000000000..0f8e637592 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0054-wifi-ath11k-Send-11d-scan-start-before-WMI_START_SCA.patch @@ -0,0 +1,61 @@ +From e89a51aedf380bc60219dc9afa96c36507060fb3 Mon Sep 17 00:00:00 2001 +From: Manikanta Pubbisetty +Date: Wed, 15 Mar 2023 21:48:17 +0530 +Subject: [PATCH] wifi: ath11k: Send 11d scan start before WMI_START_SCAN_CMDID + +Firmwares advertising the support of triggering 11d algorithm on the +scan results of a regular scan expects driver to send +WMI_11D_SCAN_START_CMDID before sending WMI_START_SCAN_CMDID. +Triggering 11d algorithm on the scan results of a normal scan helps +in completely avoiding a separate 11d scan for determining regdomain. +This indirectly helps in speeding up connections on station +interfaces on the chipsets supporting 11D scan. + +To enable this feature, send WMI_11D_SCAN_START_CMDID just before +sending WMI_START_SCAN_CMDID if the firmware advertises +WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN service flag. + +WCN6750 & WCN6855 supports this feature. + +Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-01160-QCAMSLSWPLZ-1 +Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23 + +Signed-off-by: Manikanta Pubbisetty +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230315161817.29627-1-quic_mpubbise@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 12 ++++++++++++ + drivers/net/wireless/ath/ath11k/wmi.h | 1 + + 2 files changed, 13 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -3755,6 +3755,18 @@ static int ath11k_mac_op_hw_scan(struct + int i; + u32 scan_timeout; + ++ /* Firmwares advertising the support of triggering 11D algorithm ++ * on the scan results of a regular scan expects driver to send ++ * WMI_11D_SCAN_START_CMDID before sending WMI_START_SCAN_CMDID. ++ * With this feature, separate 11D scan can be avoided since ++ * regdomain can be determined with the scan results of the ++ * regular scan. ++ */ ++ if (ar->state_11d == ATH11K_11D_PREPARING && ++ test_bit(WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN, ++ ar->ab->wmi_ab.svc_map)) ++ ath11k_mac_11d_scan_start(ar, arvif->vdev_id); ++ + mutex_lock(&ar->conf_mutex); + + spin_lock_bh(&ar->data_lock); +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -2103,6 +2103,7 @@ enum wmi_tlv_service { + WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL = 265, + WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT = 281, + WMI_TLV_SERVICE_BIOS_SAR_SUPPORT = 326, ++ WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN = 357, + + /* The third 128 bits */ + WMI_MAX_EXT2_SERVICE = 384 diff --git a/package/kernel/mac80211/patches/ath11k/0055-wifi-ath11k-Remove-redundant-pci_clear_master.patch b/package/kernel/mac80211/patches/ath11k/0055-wifi-ath11k-Remove-redundant-pci_clear_master.patch new file mode 100644 index 0000000000..0439727e72 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0055-wifi-ath11k-Remove-redundant-pci_clear_master.patch @@ -0,0 +1,58 @@ +From f812e2a9f85d6bea78957ccb5197e4491316848b Mon Sep 17 00:00:00 2001 +From: Cai Huoqing +Date: Thu, 23 Mar 2023 19:26:09 +0800 +Subject: [PATCH] wifi: ath11k: Remove redundant pci_clear_master + +Remove pci_clear_master to simplify the code, +the bus-mastering is also cleared in do_pci_disable_device, +like this: +./drivers/pci/pci.c:2197 +static void do_pci_disable_device(struct pci_dev *dev) +{ + u16 pci_command; + + pci_read_config_word(dev, PCI_COMMAND, &pci_command); + if (pci_command & PCI_COMMAND_MASTER) { + pci_command &= ~PCI_COMMAND_MASTER; + pci_write_config_word(dev, PCI_COMMAND, pci_command); + } + + pcibios_disable_device(dev); +}. +And dev->is_busmaster is set to 0 in pci_disable_device. + +Signed-off-by: Cai Huoqing +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230323112613.7550-1-cai.huoqing@linux.dev +--- + drivers/net/wireless/ath/ath11k/pci.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/pci.c ++++ b/drivers/net/wireless/ath/ath11k/pci.c +@@ -540,7 +540,7 @@ static int ath11k_pci_claim(struct ath11 + if (!ab->mem) { + ath11k_err(ab, "failed to map pci bar %d\n", ATH11K_PCI_BAR_NUM); + ret = -EIO; +- goto clear_master; ++ goto release_region; + } + + ab->mem_ce = ab->mem; +@@ -548,8 +548,6 @@ static int ath11k_pci_claim(struct ath11 + ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot pci_mem 0x%pK\n", ab->mem); + return 0; + +-clear_master: +- pci_clear_master(pdev); + release_region: + pci_release_region(pdev, ATH11K_PCI_BAR_NUM); + disable_device: +@@ -565,7 +563,6 @@ static void ath11k_pci_free_region(struc + + pci_iounmap(pci_dev, ab->mem); + ab->mem = NULL; +- pci_clear_master(pci_dev); + pci_release_region(pci_dev, ATH11K_PCI_BAR_NUM); + if (pci_is_enabled(pci_dev)) + pci_disable_device(pci_dev); diff --git a/package/kernel/mac80211/patches/ath11k/0056-wifi-ath11k-Disable-Spectral-scan-upon-removing-inte.patch b/package/kernel/mac80211/patches/ath11k/0056-wifi-ath11k-Disable-Spectral-scan-upon-removing-inte.patch new file mode 100644 index 0000000000..44532a4d72 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0056-wifi-ath11k-Disable-Spectral-scan-upon-removing-inte.patch @@ -0,0 +1,36 @@ +From 5c690db63b45c6c4c4932b13173af71df369dba5 Mon Sep 17 00:00:00 2001 +From: Tamizh Chelvam Raja +Date: Tue, 28 Mar 2023 12:41:50 +0530 +Subject: [PATCH] wifi: ath11k: Disable Spectral scan upon removing interface + +Host might receive spectral events during interface +down sequence and this might create below errors. + +failed to handle dma buf release event -22 +failed to handle dma buf release event -22 + +Fix this by disabling spectral config during remove interface. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Tamizh Chelvam Raja +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230328071150.29645-1-quic_tamizhr@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 5 +++++ + 1 file changed, 5 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -6685,6 +6685,11 @@ static void ath11k_mac_op_remove_interfa + ath11k_dbg(ab, ATH11K_DBG_MAC, "mac remove interface (vdev %d)\n", + arvif->vdev_id); + ++ ret = ath11k_spectral_vif_stop(arvif); ++ if (ret) ++ ath11k_warn(ab, "failed to stop spectral for vdev %i: %d\n", ++ arvif->vdev_id, ret); ++ + if (arvif->vdev_type == WMI_VDEV_TYPE_STA) + ath11k_mac_11d_scan_stop(ar); + diff --git a/package/kernel/mac80211/patches/ath11k/0057-wifi-ath11k-enable-SAR-support-on-WCN6750.patch b/package/kernel/mac80211/patches/ath11k/0057-wifi-ath11k-enable-SAR-support-on-WCN6750.patch new file mode 100644 index 0000000000..5e64e552c1 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0057-wifi-ath11k-enable-SAR-support-on-WCN6750.patch @@ -0,0 +1,29 @@ +From abf57d84973ce1abcb67504ac0df8aea1fe09a76 Mon Sep 17 00:00:00 2001 +From: Youghandhar Chintala +Date: Tue, 28 Mar 2023 17:04:55 +0530 +Subject: [PATCH] wifi: ath11k: enable SAR support on WCN6750 + +Currently, SAR is enabled only on WCN6855, enable this for WCN6750 too. This +functionality gets triggered, when the user space application calls +NL80211_CMD_SET_SAR_SPECS. + +Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 + +Signed-off-by: Youghandhar Chintala +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230328113455.11252-1-quic_youghand@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -593,7 +593,7 @@ static const struct ath11k_hw_params ath + .current_cc_support = true, + .dbr_debug_support = false, + .global_reset = false, +- .bios_sar_capa = NULL, ++ .bios_sar_capa = &ath11k_hw_sar_capa_wcn6855, + .m3_fw_support = false, + .fixed_bdf_addr = false, + .fixed_mem_region = false, diff --git a/package/kernel/mac80211/patches/ath11k/0058-wifi-ath11k-pci-Add-more-MODULE_FIRMWARE-entries.patch b/package/kernel/mac80211/patches/ath11k/0058-wifi-ath11k-pci-Add-more-MODULE_FIRMWARE-entries.patch new file mode 100644 index 0000000000..585864eff2 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0058-wifi-ath11k-pci-Add-more-MODULE_FIRMWARE-entries.patch @@ -0,0 +1,36 @@ +From 06c58473969239e00d76b683edd511952060ca56 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Thu, 30 Mar 2023 16:37:18 +0200 +Subject: [PATCH] wifi: ath11k: pci: Add more MODULE_FIRMWARE() entries + +As there are a few more models supported by the driver, let's add the +missing MODULE_FIRMWARE() entries for them. The lack of them resulted +in the missing device enablement on some systems, such as the +installation image of openSUSE. + +While we are at it, use the wildcard instead of listing each firmware +files individually for each. + +Signed-off-by: Takashi Iwai +Reviewed-by: Simon Horman +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230330143718.19511-1-tiwai@suse.de +--- + drivers/net/wireless/ath/ath11k/pci.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/pci.c ++++ b/drivers/net/wireless/ath/ath11k/pci.c +@@ -1036,7 +1036,8 @@ module_exit(ath11k_pci_exit); + MODULE_DESCRIPTION("Driver support for Qualcomm Technologies 802.11ax WLAN PCIe devices"); + MODULE_LICENSE("Dual BSD/GPL"); + +-/* QCA639x 2.0 firmware files */ +-MODULE_FIRMWARE(ATH11K_FW_DIR "/QCA6390/hw2.0/" ATH11K_BOARD_API2_FILE); +-MODULE_FIRMWARE(ATH11K_FW_DIR "/QCA6390/hw2.0/" ATH11K_AMSS_FILE); +-MODULE_FIRMWARE(ATH11K_FW_DIR "/QCA6390/hw2.0/" ATH11K_M3_FILE); ++/* firmware files */ ++MODULE_FIRMWARE(ATH11K_FW_DIR "/QCA6390/hw2.0/*"); ++MODULE_FIRMWARE(ATH11K_FW_DIR "/QCN9074/hw1.0/*"); ++MODULE_FIRMWARE(ATH11K_FW_DIR "/WCN6855/hw2.0/*"); ++MODULE_FIRMWARE(ATH11K_FW_DIR "/WCN6855/hw2.1/*"); diff --git a/package/kernel/mac80211/patches/ath11k/0059-wifi-ath11k-print-a-warning-when-crypto_alloc_shash-.patch b/package/kernel/mac80211/patches/ath11k/0059-wifi-ath11k-print-a-warning-when-crypto_alloc_shash-.patch new file mode 100644 index 0000000000..fab52a0fa7 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0059-wifi-ath11k-print-a-warning-when-crypto_alloc_shash-.patch @@ -0,0 +1,34 @@ +From a87a9110ac0dcbfd9458b6665c141fa1c16a669d Mon Sep 17 00:00:00 2001 +From: Kalle Valo +Date: Wed, 5 Apr 2023 12:04:25 +0300 +Subject: [PATCH] wifi: ath11k: print a warning when crypto_alloc_shash() fails + +Christoph reported that ath11k failed to initialise when michael_mic.ko +module was not installed. To make it easier to notice that case print a +warning when crypto_alloc_shash() fails. + +Compile tested only. + +Reported-by: Christoph Hellwig +Link: https://lore.kernel.org/all/20221130133016.GC3055@lst.de/ +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230405090425.1351-1-kvalo@kernel.org +--- + drivers/net/wireless/ath/ath11k/dp_rx.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/dp_rx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c +@@ -3106,8 +3106,11 @@ int ath11k_peer_rx_frag_setup(struct ath + int i; + + tfm = crypto_alloc_shash("michael_mic", 0, 0); +- if (IS_ERR(tfm)) ++ if (IS_ERR(tfm)) { ++ ath11k_warn(ab, "failed to allocate michael_mic shash: %ld\n", ++ PTR_ERR(tfm)); + return PTR_ERR(tfm); ++ } + + spin_lock_bh(&ab->base_lock); + diff --git a/package/kernel/mac80211/patches/ath11k/0060-wifi-ath11k-Ignore-frags-from-uninitialized-peer-in-.patch b/package/kernel/mac80211/patches/ath11k/0060-wifi-ath11k-Ignore-frags-from-uninitialized-peer-in-.patch new file mode 100644 index 0000000000..5bbf9e04a4 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0060-wifi-ath11k-Ignore-frags-from-uninitialized-peer-in-.patch @@ -0,0 +1,104 @@ +From a06bfb3c9f69f303692cdae87bc0899d2ae8b2a6 Mon Sep 17 00:00:00 2001 +From: Harshitha Prem +Date: Tue, 4 Apr 2023 00:11:54 +0530 +Subject: [PATCH] wifi: ath11k: Ignore frags from uninitialized peer in dp. + +When max virtual ap interfaces are configured in all the bands with +ACS and hostapd restart is done every 60s, a crash is observed at +random times. +In this certain scenario, a fragmented packet is received for +self peer, for which rx_tid and rx_frags are not initialized in +datapath. While handling this fragment, crash is observed as the +rx_frag list is uninitialised and when we walk in +ath11k_dp_rx_h_sort_frags, skb null leads to exception. + +To address this, before processing received fragments we check +dp_setup_done flag is set to ensure that peer has completed its +dp peer setup for fragment queue, else ignore processing the +fragments. + +Call trace: + ath11k_dp_process_rx_err+0x550/0x1084 [ath11k] + ath11k_dp_service_srng+0x70/0x370 [ath11k] + 0xffffffc009693a04 + __napi_poll+0x30/0xa4 + net_rx_action+0x118/0x270 + __do_softirq+0x10c/0x244 + irq_exit+0x64/0xb4 + __handle_domain_irq+0x88/0xac + gic_handle_irq+0x74/0xbc + el1_irq+0xf0/0x1c0 + arch_cpu_idle+0x10/0x18 + do_idle+0x104/0x248 + cpu_startup_entry+0x20/0x64 + rest_init+0xd0/0xdc + arch_call_rest_init+0xc/0x14 + start_kernel+0x480/0x4b8 + Code: f9400281 f94066a2 91405021 b94a0023 (f9406401) + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Harshitha Prem +Signed-off-by: Nagarajan Maran +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230403184155.8670-2-quic_nmaran@quicinc.com +--- + drivers/net/wireless/ath/ath11k/dp.c | 4 +++- + drivers/net/wireless/ath/ath11k/dp_rx.c | 8 ++++++++ + drivers/net/wireless/ath/ath11k/peer.h | 1 + + 3 files changed, 12 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/dp.c ++++ b/drivers/net/wireless/ath/ath11k/dp.c +@@ -36,6 +36,7 @@ void ath11k_dp_peer_cleanup(struct ath11 + } + + ath11k_peer_rx_tid_cleanup(ar, peer); ++ peer->dp_setup_done = false; + crypto_free_shash(peer->tfm_mmic); + spin_unlock_bh(&ab->base_lock); + } +@@ -72,7 +73,8 @@ int ath11k_dp_peer_setup(struct ath11k * + ret = ath11k_peer_rx_frag_setup(ar, addr, vdev_id); + if (ret) { + ath11k_warn(ab, "failed to setup rx defrag context\n"); +- return ret; ++ tid--; ++ goto peer_clean; + } + + /* TODO: Setup other peer specific resource used in data path */ +--- a/drivers/net/wireless/ath/ath11k/dp_rx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c +@@ -3130,6 +3130,7 @@ int ath11k_peer_rx_frag_setup(struct ath + } + + peer->tfm_mmic = tfm; ++ peer->dp_setup_done = true; + spin_unlock_bh(&ab->base_lock); + + return 0; +@@ -3575,6 +3576,13 @@ static int ath11k_dp_rx_frag_h_mpdu(stru + ret = -ENOENT; + goto out_unlock; + } ++ if (!peer->dp_setup_done) { ++ ath11k_warn(ab, "The peer %pM [%d] has uninitialized datapath\n", ++ peer->addr, peer_id); ++ ret = -ENOENT; ++ goto out_unlock; ++ } ++ + rx_tid = &peer->rx_tid[tid]; + + if ((!skb_queue_empty(&rx_tid->rx_frags) && seqno != rx_tid->cur_sn) || +--- a/drivers/net/wireless/ath/ath11k/peer.h ++++ b/drivers/net/wireless/ath/ath11k/peer.h +@@ -35,6 +35,7 @@ struct ath11k_peer { + u16 sec_type; + u16 sec_type_grp; + bool is_authorized; ++ bool dp_setup_done; + }; + + void ath11k_peer_unmap_event(struct ath11k_base *ab, u16 peer_id); diff --git a/package/kernel/mac80211/patches/ath11k/0061-wifi-ath11k-fix-undefined-behavior-with-__fls-in-dp.patch b/package/kernel/mac80211/patches/ath11k/0061-wifi-ath11k-fix-undefined-behavior-with-__fls-in-dp.patch new file mode 100644 index 0000000000..d68c19f160 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0061-wifi-ath11k-fix-undefined-behavior-with-__fls-in-dp.patch @@ -0,0 +1,29 @@ +From 41e02bf4ae32cf2ac47b08b4caaa9c1a032e4ce7 Mon Sep 17 00:00:00 2001 +From: Harshitha Prem +Date: Tue, 4 Apr 2023 00:11:55 +0530 +Subject: [PATCH] wifi: ath11k: fix undefined behavior with __fls in dp + +"__fls" would have an undefined behavior if the argument is passed +as "0". Hence, added changes to handle the same. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Harshitha Prem +Signed-off-by: Nagarajan Maran +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230403184155.8670-3-quic_nmaran@quicinc.com +--- + drivers/net/wireless/ath/ath11k/dp_rx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/dp_rx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c +@@ -3598,7 +3598,7 @@ static int ath11k_dp_rx_frag_h_mpdu(stru + goto out_unlock; + } + +- if (frag_no > __fls(rx_tid->rx_frag_bitmap)) ++ if (!rx_tid->rx_frag_bitmap || (frag_no > __fls(rx_tid->rx_frag_bitmap))) + __skb_queue_tail(&rx_tid->rx_frags, msdu); + else + ath11k_dp_rx_h_sort_frags(ar, &rx_tid->rx_frags, msdu); diff --git a/package/kernel/mac80211/patches/ath11k/0062-wifi-ath11k-fix-double-free-of-peer-rx_tid-during-re.patch b/package/kernel/mac80211/patches/ath11k/0062-wifi-ath11k-fix-double-free-of-peer-rx_tid-during-re.patch new file mode 100644 index 0000000000..dd37b1e4fa --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0062-wifi-ath11k-fix-double-free-of-peer-rx_tid-during-re.patch @@ -0,0 +1,144 @@ +From 93a91f40c25c3d0e61f8540a7accf105090f9995 Mon Sep 17 00:00:00 2001 +From: Harshitha Prem +Date: Mon, 17 Apr 2023 13:35:00 +0300 +Subject: [PATCH] wifi: ath11k: fix double free of peer rx_tid during reo cmd + failure + +Peer rx_tid is locally copied thrice during peer_rx_tid_cleanup to +send REO_CMD_UPDATE_RX_QUEUE followed by REO_CMD_FLUSH_CACHE to flush +all aged REO descriptors from HW cache. + +When sending REO_CMD_FLUSH_CACHE fails, we do dma unmap of already +mapped rx_tid->vaddr and free it. This is not checked during +reo_cmd_list_cleanup() and dp_reo_cmd_free() before trying to free and +unmap again. + +Fix this by setting rx_tid->vaddr NULL in rx tid delete and also +wherever freeing it to check in reo_cmd_list_cleanup() and +reo_cmd_free() before trying to free again. + +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sathishkumar Muruganandam +Signed-off-by: Harshitha Prem +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230403182420.23375-2-quic_hprem@quicinc.com +--- + drivers/net/wireless/ath/ath11k/dp_rx.c | 43 ++++++++++++++++++------- + 1 file changed, 31 insertions(+), 12 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/dp_rx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c +@@ -668,13 +668,18 @@ void ath11k_dp_reo_cmd_list_cleanup(stru + struct ath11k_dp *dp = &ab->dp; + struct dp_reo_cmd *cmd, *tmp; + struct dp_reo_cache_flush_elem *cmd_cache, *tmp_cache; ++ struct dp_rx_tid *rx_tid; + + spin_lock_bh(&dp->reo_cmd_lock); + list_for_each_entry_safe(cmd, tmp, &dp->reo_cmd_list, list) { + list_del(&cmd->list); +- dma_unmap_single(ab->dev, cmd->data.paddr, +- cmd->data.size, DMA_BIDIRECTIONAL); +- kfree(cmd->data.vaddr); ++ rx_tid = &cmd->data; ++ if (rx_tid->vaddr) { ++ dma_unmap_single(ab->dev, rx_tid->paddr, ++ rx_tid->size, DMA_BIDIRECTIONAL); ++ kfree(rx_tid->vaddr); ++ rx_tid->vaddr = NULL; ++ } + kfree(cmd); + } + +@@ -682,9 +687,13 @@ void ath11k_dp_reo_cmd_list_cleanup(stru + &dp->reo_cmd_cache_flush_list, list) { + list_del(&cmd_cache->list); + dp->reo_cmd_cache_flush_count--; +- dma_unmap_single(ab->dev, cmd_cache->data.paddr, +- cmd_cache->data.size, DMA_BIDIRECTIONAL); +- kfree(cmd_cache->data.vaddr); ++ rx_tid = &cmd_cache->data; ++ if (rx_tid->vaddr) { ++ dma_unmap_single(ab->dev, rx_tid->paddr, ++ rx_tid->size, DMA_BIDIRECTIONAL); ++ kfree(rx_tid->vaddr); ++ rx_tid->vaddr = NULL; ++ } + kfree(cmd_cache); + } + spin_unlock_bh(&dp->reo_cmd_lock); +@@ -698,10 +707,12 @@ static void ath11k_dp_reo_cmd_free(struc + if (status != HAL_REO_CMD_SUCCESS) + ath11k_warn(dp->ab, "failed to flush rx tid hw desc, tid %d status %d\n", + rx_tid->tid, status); +- +- dma_unmap_single(dp->ab->dev, rx_tid->paddr, rx_tid->size, +- DMA_BIDIRECTIONAL); +- kfree(rx_tid->vaddr); ++ if (rx_tid->vaddr) { ++ dma_unmap_single(dp->ab->dev, rx_tid->paddr, rx_tid->size, ++ DMA_BIDIRECTIONAL); ++ kfree(rx_tid->vaddr); ++ rx_tid->vaddr = NULL; ++ } + } + + static void ath11k_dp_reo_cache_flush(struct ath11k_base *ab, +@@ -740,6 +751,7 @@ static void ath11k_dp_reo_cache_flush(st + dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size, + DMA_BIDIRECTIONAL); + kfree(rx_tid->vaddr); ++ rx_tid->vaddr = NULL; + } + } + +@@ -792,6 +804,7 @@ free_desc: + dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size, + DMA_BIDIRECTIONAL); + kfree(rx_tid->vaddr); ++ rx_tid->vaddr = NULL; + } + + void ath11k_peer_rx_tid_delete(struct ath11k *ar, +@@ -804,6 +817,8 @@ void ath11k_peer_rx_tid_delete(struct at + if (!rx_tid->active) + return; + ++ rx_tid->active = false; ++ + cmd.flag = HAL_REO_CMD_FLG_NEED_STATUS; + cmd.addr_lo = lower_32_bits(rx_tid->paddr); + cmd.addr_hi = upper_32_bits(rx_tid->paddr); +@@ -818,9 +833,11 @@ void ath11k_peer_rx_tid_delete(struct at + dma_unmap_single(ar->ab->dev, rx_tid->paddr, rx_tid->size, + DMA_BIDIRECTIONAL); + kfree(rx_tid->vaddr); ++ rx_tid->vaddr = NULL; + } + +- rx_tid->active = false; ++ rx_tid->paddr = 0; ++ rx_tid->size = 0; + } + + static int ath11k_dp_rx_link_desc_return(struct ath11k_base *ab, +@@ -967,6 +984,7 @@ static void ath11k_dp_rx_tid_mem_free(st + dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size, + DMA_BIDIRECTIONAL); + kfree(rx_tid->vaddr); ++ rx_tid->vaddr = NULL; + + rx_tid->active = false; + +@@ -1067,7 +1085,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 + return ret; + + err_mem_free: +- kfree(vaddr); ++ kfree(rx_tid->vaddr); ++ rx_tid->vaddr = NULL; + + return ret; + } diff --git a/package/kernel/mac80211/patches/ath11k/0063-wifi-ath11k-Prevent-REO-cmd-failures.patch b/package/kernel/mac80211/patches/ath11k/0063-wifi-ath11k-Prevent-REO-cmd-failures.patch new file mode 100644 index 0000000000..4b9af18062 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0063-wifi-ath11k-Prevent-REO-cmd-failures.patch @@ -0,0 +1,43 @@ +From a8ae833657a45746debde85c38bb7f070d344026 Mon Sep 17 00:00:00 2001 +From: Harshitha Prem +Date: Mon, 17 Apr 2023 13:35:01 +0300 +Subject: [PATCH] wifi: ath11k: Prevent REO cmd failures + +Prevent REO cmd failures causing double free by increasing REO cmd +ring size and moving REO status ring mask to IRQ group 3 from group +0 to separate from tx completion ring on IRQ group 0 which may delay +reo status processing. + +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sathishkumar Muruganandam +Signed-off-by: Harshitha Prem +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230403182420.23375-3-quic_hprem@quicinc.com +--- + drivers/net/wireless/ath/ath11k/dp.h | 2 +- + drivers/net/wireless/ath/ath11k/hw.c | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/dp.h ++++ b/drivers/net/wireless/ath/ath11k/dp.h +@@ -214,7 +214,7 @@ struct ath11k_pdev_dp { + #define DP_REO_REINJECT_RING_SIZE 32 + #define DP_RX_RELEASE_RING_SIZE 1024 + #define DP_REO_EXCEPTION_RING_SIZE 128 +-#define DP_REO_CMD_RING_SIZE 128 ++#define DP_REO_CMD_RING_SIZE 256 + #define DP_REO_STATUS_RING_SIZE 2048 + #define DP_RXDMA_BUF_RING_SIZE 4096 + #define DP_RXDMA_REFILL_RING_SIZE 2048 +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -1233,6 +1233,7 @@ const struct ath11k_hw_ring_mask ath11k_ + ATH11K_RX_WBM_REL_RING_MASK_0, + }, + .reo_status = { ++ 0, 0, 0, + ATH11K_REO_STATUS_RING_MASK_0, + }, + .rxdma2host = { diff --git a/package/kernel/mac80211/patches/ath11k/0064-wifi-ath11k-add-peer-mac-information-in-failure-case.patch b/package/kernel/mac80211/patches/ath11k/0064-wifi-ath11k-add-peer-mac-information-in-failure-case.patch new file mode 100644 index 0000000000..fbcbdfff71 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0064-wifi-ath11k-add-peer-mac-information-in-failure-case.patch @@ -0,0 +1,74 @@ +From 20487cc3ff36bbfa9505f0a078ba98f09abfc717 Mon Sep 17 00:00:00 2001 +From: Harshitha Prem +Date: Mon, 17 Apr 2023 13:35:01 +0300 +Subject: [PATCH] wifi: ath11k: add peer mac information in failure cases + +During reo command failure, the peer mac detail for which the reo +command was not successful is unknown. Hence, to improve the +debuggability, add the peer mac information in the failure cases +which would be useful during multi client cases. + +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sathishkumar Muruganandam +Signed-off-by: Harshitha Prem +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230403182420.23375-4-quic_hprem@quicinc.com +--- + drivers/net/wireless/ath/ath11k/dp_rx.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/dp_rx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c +@@ -1009,7 +1009,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 + + peer = ath11k_peer_find(ab, vdev_id, peer_mac); + if (!peer) { +- ath11k_warn(ab, "failed to find the peer to set up rx tid\n"); ++ ath11k_warn(ab, "failed to find the peer %pM to set up rx tid\n", ++ peer_mac); + spin_unlock_bh(&ab->base_lock); + return -ENOENT; + } +@@ -1022,7 +1023,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 + ba_win_sz, ssn, true); + spin_unlock_bh(&ab->base_lock); + if (ret) { +- ath11k_warn(ab, "failed to update reo for rx tid %d\n", tid); ++ ath11k_warn(ab, "failed to update reo for peer %pM rx tid %d\n: %d", ++ peer_mac, tid, ret); + return ret; + } + +@@ -1030,8 +1032,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 + peer_mac, paddr, + tid, 1, ba_win_sz); + if (ret) +- ath11k_warn(ab, "failed to send wmi command to update rx reorder queue, tid :%d (%d)\n", +- tid, ret); ++ ath11k_warn(ab, "failed to send wmi rx reorder queue for peer %pM tid %d: %d\n", ++ peer_mac, tid, ret); + return ret; + } + +@@ -1064,6 +1066,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 + ret = dma_mapping_error(ab->dev, paddr); + if (ret) { + spin_unlock_bh(&ab->base_lock); ++ ath11k_warn(ab, "failed to setup dma map for peer %pM rx tid %d: %d\n", ++ peer_mac, tid, ret); + goto err_mem_free; + } + +@@ -1077,8 +1081,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 + ret = ath11k_wmi_peer_rx_reorder_queue_setup(ar, vdev_id, peer_mac, + paddr, tid, 1, ba_win_sz); + if (ret) { +- ath11k_warn(ar->ab, "failed to setup rx reorder queue, tid :%d (%d)\n", +- tid, ret); ++ ath11k_warn(ar->ab, "failed to setup rx reorder queue for peer %pM tid %d: %d\n", ++ peer_mac, tid, ret); + ath11k_dp_rx_tid_mem_free(ab, peer_mac, vdev_id, tid); + } + diff --git a/package/kernel/mac80211/patches/ath11k/0065-wifi-ath11k-fix-tx-status-reporting-in-encap-offload.patch b/package/kernel/mac80211/patches/ath11k/0065-wifi-ath11k-fix-tx-status-reporting-in-encap-offload.patch new file mode 100644 index 0000000000..e2fe419158 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0065-wifi-ath11k-fix-tx-status-reporting-in-encap-offload.patch @@ -0,0 +1,119 @@ +From 6257c702264c44d74c6b71f0c62a7665da2dc356 Mon Sep 17 00:00:00 2001 +From: Pradeep Kumar Chitrapu +Date: Mon, 17 Apr 2023 13:35:02 +0300 +Subject: [PATCH] wifi: ath11k: fix tx status reporting in encap offload mode + +ieee80211_tx_status() treats packets in 802.11 frame format and +tries to extract sta address from packet header. When tx encap +offload is enabled, this becomes invalid operation. Hence, switch +to using ieee80211_tx_status_ext() after filling in station +address for handling both 802.11 and 802.3 frames. + +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Pradeep Kumar Chitrapu +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230403195738.25367-2-quic_pradeepc@quicinc.com +--- + drivers/net/wireless/ath/ath11k/dp.h | 4 +++ + drivers/net/wireless/ath/ath11k/dp_tx.c | 33 ++++++++++++++++++++++++- + drivers/net/wireless/ath/ath11k/dp_tx.h | 1 + + 3 files changed, 37 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/dp.h ++++ b/drivers/net/wireless/ath/ath11k/dp.h +@@ -303,12 +303,16 @@ struct ath11k_dp { + + #define HTT_TX_WBM_COMP_STATUS_OFFSET 8 + ++#define HTT_INVALID_PEER_ID 0xffff ++ + /* HTT tx completion is overlaid in wbm_release_ring */ + #define HTT_TX_WBM_COMP_INFO0_STATUS GENMASK(12, 9) + #define HTT_TX_WBM_COMP_INFO0_REINJECT_REASON GENMASK(16, 13) + #define HTT_TX_WBM_COMP_INFO0_REINJECT_REASON GENMASK(16, 13) + + #define HTT_TX_WBM_COMP_INFO1_ACK_RSSI GENMASK(31, 24) ++#define HTT_TX_WBM_COMP_INFO2_SW_PEER_ID GENMASK(15, 0) ++#define HTT_TX_WBM_COMP_INFO2_VALID BIT(21) + + struct htt_tx_wbm_completion { + u32 info0; +--- a/drivers/net/wireless/ath/ath11k/dp_tx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_tx.c +@@ -316,10 +316,12 @@ ath11k_dp_tx_htt_tx_complete_buf(struct + struct dp_tx_ring *tx_ring, + struct ath11k_dp_htt_wbm_tx_status *ts) + { ++ struct ieee80211_tx_status status = { 0 }; + struct sk_buff *msdu; + struct ieee80211_tx_info *info; + struct ath11k_skb_cb *skb_cb; + struct ath11k *ar; ++ struct ath11k_peer *peer; + + spin_lock(&tx_ring->tx_idr_lock); + msdu = idr_remove(&tx_ring->txbuf_idr, ts->msdu_id); +@@ -341,6 +343,11 @@ ath11k_dp_tx_htt_tx_complete_buf(struct + + dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE); + ++ if (!skb_cb->vif) { ++ dev_kfree_skb_any(msdu); ++ return; ++ } ++ + memset(&info->status, 0, sizeof(info->status)); + + if (ts->acked) { +@@ -355,7 +362,23 @@ ath11k_dp_tx_htt_tx_complete_buf(struct + } + } + +- ieee80211_tx_status(ar->hw, msdu); ++ spin_lock_bh(&ab->base_lock); ++ peer = ath11k_peer_find_by_id(ab, ts->peer_id); ++ if (!peer || !peer->sta) { ++ ath11k_dbg(ab, ATH11K_DBG_DATA, ++ "dp_tx: failed to find the peer with peer_id %d\n", ++ ts->peer_id); ++ spin_unlock_bh(&ab->base_lock); ++ dev_kfree_skb_any(msdu); ++ return; ++ } ++ spin_unlock_bh(&ab->base_lock); ++ ++ status.sta = peer->sta; ++ status.info = info; ++ status.skb = msdu; ++ ++ ieee80211_tx_status_ext(ar->hw, &status); + } + + static void +@@ -379,7 +402,15 @@ ath11k_dp_tx_process_htt_tx_complete(str + ts.msdu_id = msdu_id; + ts.ack_rssi = FIELD_GET(HTT_TX_WBM_COMP_INFO1_ACK_RSSI, + status_desc->info1); ++ ++ if (FIELD_GET(HTT_TX_WBM_COMP_INFO2_VALID, status_desc->info2)) ++ ts.peer_id = FIELD_GET(HTT_TX_WBM_COMP_INFO2_SW_PEER_ID, ++ status_desc->info2); ++ else ++ ts.peer_id = HTT_INVALID_PEER_ID; ++ + ath11k_dp_tx_htt_tx_complete_buf(ab, tx_ring, &ts); ++ + break; + case HAL_WBM_REL_HTT_TX_COMP_STATUS_REINJ: + case HAL_WBM_REL_HTT_TX_COMP_STATUS_INSPECT: +--- a/drivers/net/wireless/ath/ath11k/dp_tx.h ++++ b/drivers/net/wireless/ath/ath11k/dp_tx.h +@@ -13,6 +13,7 @@ struct ath11k_dp_htt_wbm_tx_status { + u32 msdu_id; + bool acked; + int ack_rssi; ++ u16 peer_id; + }; + + void ath11k_dp_tx_update_txcompl(struct ath11k *ar, struct hal_tx_status *ts); diff --git a/package/kernel/mac80211/patches/ath11k/0066-wifi-ath11k-Fix-incorrect-update-of-radiotap-fields.patch b/package/kernel/mac80211/patches/ath11k/0066-wifi-ath11k-Fix-incorrect-update-of-radiotap-fields.patch new file mode 100644 index 0000000000..4f94580100 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0066-wifi-ath11k-Fix-incorrect-update-of-radiotap-fields.patch @@ -0,0 +1,49 @@ +From 2f0c9ac8362da09c80f1cd422ef7fd6fa9b252b9 Mon Sep 17 00:00:00 2001 +From: Pradeep Kumar Chitrapu +Date: Mon, 17 Apr 2023 13:35:02 +0300 +Subject: [PATCH] wifi: ath11k: Fix incorrect update of radiotap fields + +Fix incorrect update of ppdu stats causing incorrect radiotap +fields. + +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Pradeep Kumar Chitrapu +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230403195738.25367-3-quic_pradeepc@quicinc.com +--- + drivers/net/wireless/ath/ath11k/hal_rx.c | 4 ++-- + drivers/net/wireless/ath/ath11k/hal_rx.h | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/hal_rx.c ++++ b/drivers/net/wireless/ath/ath11k/hal_rx.c +@@ -1029,7 +1029,7 @@ ath11k_hal_rx_parse_mon_status_tlv(struc + info1 = __le32_to_cpu(vht_sig->info1); + + ppdu_info->ldpc = FIELD_GET(HAL_RX_VHT_SIG_A_INFO_INFO1_SU_MU_CODING, +- info0); ++ info1); + ppdu_info->mcs = FIELD_GET(HAL_RX_VHT_SIG_A_INFO_INFO1_MCS, + info1); + gi_setting = FIELD_GET(HAL_RX_VHT_SIG_A_INFO_INFO1_GI_SETTING, +@@ -1452,7 +1452,7 @@ ath11k_hal_rx_parse_mon_status_tlv(struc + * PHYRX_OTHER_RECEIVE_INFO TLV. + */ + ppdu_info->rssi_comb = +- FIELD_GET(HAL_RX_PHYRX_RSSI_LEGACY_INFO_INFO1_RSSI_COMB, ++ FIELD_GET(HAL_RX_PHYRX_RSSI_LEGACY_INFO_INFO0_RSSI_COMB, + __le32_to_cpu(rssi->info0)); + + if (db2dbm) { +--- a/drivers/net/wireless/ath/ath11k/hal_rx.h ++++ b/drivers/net/wireless/ath/ath11k/hal_rx.h +@@ -385,7 +385,7 @@ struct hal_rx_he_sig_b2_ofdma_info { + __le32 info0; + } __packed; + +-#define HAL_RX_PHYRX_RSSI_LEGACY_INFO_INFO1_RSSI_COMB GENMASK(15, 8) ++#define HAL_RX_PHYRX_RSSI_LEGACY_INFO_INFO0_RSSI_COMB GENMASK(15, 8) + + #define HAL_RX_PHYRX_RSSI_PREAMBLE_PRI20 GENMASK(7, 0) + diff --git a/package/kernel/mac80211/patches/ath11k/0067-wifi-ath11k-Fix-SKB-corruption-in-REO-destination-ri.patch b/package/kernel/mac80211/patches/ath11k/0067-wifi-ath11k-Fix-SKB-corruption-in-REO-destination-ri.patch new file mode 100644 index 0000000000..8b300f3a79 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0067-wifi-ath11k-Fix-SKB-corruption-in-REO-destination-ri.patch @@ -0,0 +1,70 @@ +From f9fff67d2d7ca6fa8066132003a3deef654c55b1 Mon Sep 17 00:00:00 2001 +From: Nagarajan Maran +Date: Mon, 17 Apr 2023 13:35:02 +0300 +Subject: [PATCH] wifi: ath11k: Fix SKB corruption in REO destination ring + +While running traffics for a long time, randomly an RX descriptor +filled with value "0" from REO destination ring is received. +This descriptor which is invalid causes the wrong SKB (SKB stored in +the IDR lookup with buffer id "0") to be fetched which in turn +causes SKB memory corruption issue and the same leads to crash +after some time. + +Changed the start id for idr allocation to "1" and the buffer id "0" +is reserved for error validation. Introduced Sanity check to validate +the descriptor, before processing the SKB. + +Crash Signature : + +Unable to handle kernel paging request at virtual address 3f004900 +PC points to "b15_dma_inv_range+0x30/0x50" +LR points to "dma_cache_maint_page+0x8c/0x128". +The Backtrace obtained is as follows: +[<8031716c>] (b15_dma_inv_range) from [<80313a4c>] (dma_cache_maint_page+0x8c/0x128) +[<80313a4c>] (dma_cache_maint_page) from [<80313b90>] (__dma_page_dev_to_cpu+0x28/0xcc) +[<80313b90>] (__dma_page_dev_to_cpu) from [<7fb5dd68>] (ath11k_dp_process_rx+0x1e8/0x4a4 [ath11k]) +[<7fb5dd68>] (ath11k_dp_process_rx [ath11k]) from [<7fb53c20>] (ath11k_dp_service_srng+0xb0/0x2ac [ath11k]) +[<7fb53c20>] (ath11k_dp_service_srng [ath11k]) from [<7f67bba4>] (ath11k_pci_ext_grp_napi_poll+0x1c/0x78 [ath11k_pci]) +[<7f67bba4>] (ath11k_pci_ext_grp_napi_poll [ath11k_pci]) from [<807d5cf4>] (__napi_poll+0x28/0xb8) +[<807d5cf4>] (__napi_poll) from [<807d5f28>] (net_rx_action+0xf0/0x280) +[<807d5f28>] (net_rx_action) from [<80302148>] (__do_softirq+0xd0/0x280) +[<80302148>] (__do_softirq) from [<80320408>] (irq_exit+0x74/0xd4) +[<80320408>] (irq_exit) from [<803638a4>] (__handle_domain_irq+0x90/0xb4) +[<803638a4>] (__handle_domain_irq) from [<805bedec>] (gic_handle_irq+0x58/0x90) +[<805bedec>] (gic_handle_irq) from [<80301a78>] (__irq_svc+0x58/0x8c) + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Nagarajan Maran +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230403191533.28114-1-quic_nmaran@quicinc.com +--- + drivers/net/wireless/ath/ath11k/dp_rx.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/dp_rx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c +@@ -389,10 +389,10 @@ int ath11k_dp_rxbufs_replenish(struct at + goto fail_free_skb; + + spin_lock_bh(&rx_ring->idr_lock); +- buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 0, +- rx_ring->bufs_max * 3, GFP_ATOMIC); ++ buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 1, ++ (rx_ring->bufs_max * 3) + 1, GFP_ATOMIC); + spin_unlock_bh(&rx_ring->idr_lock); +- if (buf_id < 0) ++ if (buf_id <= 0) + goto fail_dma_unmap; + + desc = ath11k_hal_srng_src_get_next_entry(ab, srng); +@@ -2665,6 +2665,9 @@ try_again: + cookie); + mac_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_PDEV_ID, cookie); + ++ if (unlikely(buf_id == 0)) ++ continue; ++ + ar = ab->pdevs[mac_id].ar; + rx_ring = &ar->dp.rx_refill_buf_ring; + spin_lock_bh(&rx_ring->idr_lock); diff --git a/package/kernel/mac80211/patches/ath11k/0068-wifi-ath11k-Remove-disabling-of-80-80-and-160-MHz.patch b/package/kernel/mac80211/patches/ath11k/0068-wifi-ath11k-Remove-disabling-of-80-80-and-160-MHz.patch new file mode 100644 index 0000000000..ce5ffd273b --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0068-wifi-ath11k-Remove-disabling-of-80-80-and-160-MHz.patch @@ -0,0 +1,49 @@ +From b100722a777f6455d913666a376f81342b2cb995 Mon Sep 17 00:00:00 2001 +From: Muna Sinada +Date: Mon, 17 Apr 2023 13:22:27 -0700 +Subject: [PATCH] wifi: ath11k: Remove disabling of 80+80 and 160 MHz + +This is a regression fix for 80+80 and 160 MHz support bits being +cleared, therefore not adverised. Remove disable of 80+80 and 160 MHz +capability flags and assign valid center frequency 2 similar to +VHT80_80. + +Fixes: 38dfe775d0ab ("wifi: ath11k: push MU-MIMO params from hostapd to hardware") +Reported-by: Robert Marko +Tested-by: Robert Marko # IPQ8074 WLAN.HK.2.9.0.1-01385-QCAHKSWPL_SILICONZ-1 +Link: https://bugzilla.kernel.org/show_bug.cgi?id=217299 +Co-developed-by: P Praneesh +Signed-off-by: P Praneesh +Signed-off-by: Muna Sinada +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1681762947-13882-1-git-send-email-quic_msinada@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 4 ---- + drivers/net/wireless/ath/ath11k/wmi.c | 3 ++- + 2 files changed, 2 insertions(+), 5 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -5585,10 +5585,6 @@ static int ath11k_mac_copy_he_cap(struct + + he_cap_elem->mac_cap_info[1] &= + IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK; +- he_cap_elem->phy_cap_info[0] &= +- ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; +- he_cap_elem->phy_cap_info[0] &= +- ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; + + he_cap_elem->phy_cap_info[5] &= + ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK; +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -871,7 +871,8 @@ static void ath11k_wmi_put_wmi_channel(s + + chan->band_center_freq2 = arg->channel.band_center_freq1; + +- } else if (arg->channel.mode == MODE_11AC_VHT80_80) { ++ } else if ((arg->channel.mode == MODE_11AC_VHT80_80) || ++ (arg->channel.mode == MODE_11AX_HE80_80)) { + chan->band_center_freq2 = arg->channel.band_center_freq2; + } else { + chan->band_center_freq2 = 0; diff --git a/package/kernel/mac80211/patches/ath11k/0069-wifi-ath11k-fix-registration-of-6Ghz-only-phy-withou.patch b/package/kernel/mac80211/patches/ath11k/0069-wifi-ath11k-fix-registration-of-6Ghz-only-phy-withou.patch new file mode 100644 index 0000000000..32468dbc4c --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0069-wifi-ath11k-fix-registration-of-6Ghz-only-phy-withou.patch @@ -0,0 +1,61 @@ +From e2ceb1de2f83aafd8003f0b72dfd4b7441e97d14 Mon Sep 17 00:00:00 2001 +From: Maxime Bizon +Date: Fri, 21 Apr 2023 16:54:45 +0200 +Subject: [PATCH] wifi: ath11k: fix registration of 6Ghz-only phy without the + full channel range + +Because of what seems to be a typo, a 6Ghz-only phy for which the BDF +does not allow the 7115Mhz channel will fail to register: + + WARNING: CPU: 2 PID: 106 at net/wireless/core.c:907 wiphy_register+0x914/0x954 + Modules linked in: ath11k_pci sbsa_gwdt + CPU: 2 PID: 106 Comm: kworker/u8:5 Not tainted 6.3.0-rc7-next-20230418-00549-g1e096a17625a-dirty #9 + Hardware name: Freebox V7R Board (DT) + Workqueue: ath11k_qmi_driver_event ath11k_qmi_driver_event_work + pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) + pc : wiphy_register+0x914/0x954 + lr : ieee80211_register_hw+0x67c/0xc10 + sp : ffffff800b123aa0 + x29: ffffff800b123aa0 x28: 0000000000000000 x27: 0000000000000000 + x26: 0000000000000000 x25: 0000000000000006 x24: ffffffc008d51418 + x23: ffffffc008cb0838 x22: ffffff80176c2460 x21: 0000000000000168 + x20: ffffff80176c0000 x19: ffffff80176c03e0 x18: 0000000000000014 + x17: 00000000cbef338c x16: 00000000d2a26f21 x15: 00000000ad6bb85f + x14: 0000000000000020 x13: 0000000000000020 x12: 00000000ffffffbd + x11: 0000000000000208 x10: 00000000fffffdf7 x9 : ffffffc009394718 + x8 : ffffff80176c0528 x7 : 000000007fffffff x6 : 0000000000000006 + x5 : 0000000000000005 x4 : ffffff800b304284 x3 : ffffff800b304284 + x2 : ffffff800b304d98 x1 : 0000000000000000 x0 : 0000000000000000 + Call trace: + wiphy_register+0x914/0x954 + ieee80211_register_hw+0x67c/0xc10 + ath11k_mac_register+0x7c4/0xe10 + ath11k_core_qmi_firmware_ready+0x1f4/0x570 + ath11k_qmi_driver_event_work+0x198/0x590 + process_one_work+0x1b8/0x328 + worker_thread+0x6c/0x414 + kthread+0x100/0x104 + ret_from_fork+0x10/0x20 + ---[ end trace 0000000000000000 ]--- + ath11k_pci 0002:01:00.0: ieee80211 registration failed: -22 + ath11k_pci 0002:01:00.0: failed register the radio with mac80211: -22 + ath11k_pci 0002:01:00.0: failed to create pdev core: -22 + +Signed-off-by: Maxime Bizon +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230421145445.2612280-1-mbizon@freebox.fr +--- + drivers/net/wireless/ath/ath11k/mac.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -8892,7 +8892,7 @@ static int ath11k_mac_setup_channels_rat + } + + if (supported_bands & WMI_HOST_WLAN_5G_CAP) { +- if (reg_cap->high_5ghz_chan >= ATH11K_MAX_6G_FREQ) { ++ if (reg_cap->high_5ghz_chan >= ATH11K_MIN_6G_FREQ) { + channels = kmemdup(ath11k_6ghz_channels, + sizeof(ath11k_6ghz_channels), GFP_KERNEL); + if (!channels) { diff --git a/package/kernel/mac80211/patches/ath11k/0070-wifi-ath-work-around-false-positive-stringop-overrea.patch b/package/kernel/mac80211/patches/ath11k/0070-wifi-ath-work-around-false-positive-stringop-overrea.patch new file mode 100644 index 0000000000..aa4df16a90 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0070-wifi-ath-work-around-false-positive-stringop-overrea.patch @@ -0,0 +1,84 @@ +From 695df2f417d25202bdac9cde3c82d2acb6492b4d Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Fri, 5 May 2023 16:11:25 +0300 +Subject: [PATCH] wifi: ath: work around false-positive stringop-overread + warning + +In a rare arm64 randconfig build, I got multiple warnings for ath11k +and ath12k: + +In function 'ath11k_peer_assoc_h_ht', + inlined from 'ath11k_peer_assoc_prepare' at drivers/net/wireless/ath/ath11k/mac.c:2665:2: +drivers/net/wireless/ath/ath11k/mac.c:1709:13: error: 'ath11k_peer_assoc_h_ht_masked' reading 10 bytes from a region of size 0 [-Werror=stringop-overread] + 1709 | if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This happens whenever gcc-13 fails to inline one of the functions +that take a fixed-length array argument but gets passed a pointer. + +Change these functions to all take a regular pointer argument +instead. + +Signed-off-by: Arnd Bergmann +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230417205447.1800912-1-arnd@kernel.org +--- + drivers/net/wireless/ath/ath11k/mac.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -433,7 +433,7 @@ u8 ath11k_mac_bitrate_to_idx(const struc + } + + static u32 +-ath11k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN]) ++ath11k_mac_max_ht_nss(const u8 *ht_mcs_mask) + { + int nss; + +@@ -445,7 +445,7 @@ ath11k_mac_max_ht_nss(const u8 ht_mcs_ma + } + + static u32 +-ath11k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX]) ++ath11k_mac_max_vht_nss(const u16 *vht_mcs_mask) + { + int nss; + +@@ -457,7 +457,7 @@ ath11k_mac_max_vht_nss(const u16 vht_mcs + } + + static u32 +-ath11k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX]) ++ath11k_mac_max_he_nss(const u16 *he_mcs_mask) + { + int nss; + +@@ -1658,7 +1658,7 @@ static void ath11k_peer_assoc_h_rates(st + } + + static bool +-ath11k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN]) ++ath11k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask) + { + int nss; + +@@ -1670,7 +1670,7 @@ ath11k_peer_assoc_h_ht_masked(const u8 h + } + + static bool +-ath11k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[]) ++ath11k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask) + { + int nss; + +@@ -2065,7 +2065,7 @@ static u16 ath11k_peer_assoc_h_he_limit( + } + + static bool +-ath11k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX]) ++ath11k_peer_assoc_h_he_masked(const u16 *he_mcs_mask) + { + int nss; + diff --git a/package/kernel/mac80211/patches/ath11k/0071-wifi-ath11k-driver-settings-for-MBSSID-and-EMA.patch b/package/kernel/mac80211/patches/ath11k/0071-wifi-ath11k-driver-settings-for-MBSSID-and-EMA.patch new file mode 100644 index 0000000000..bede4819ca --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0071-wifi-ath11k-driver-settings-for-MBSSID-and-EMA.patch @@ -0,0 +1,133 @@ +From a08dbb04d7365a04d52882143cf196005bfc88c3 Mon Sep 17 00:00:00 2001 +From: Aloka Dixit +Date: Fri, 5 May 2023 16:11:27 +0300 +Subject: [PATCH 71/77] wifi: ath11k: driver settings for MBSSID and EMA + +Advertise the driver support for multiple BSSID (MBSSID) and +enhanced multi-BSSID advertisements (EMA) by setting extended +capabilities. + +Configure mbssid_max_interfaces and ema_max_profile_periodicity +fields in structure wiphy which are used to advertise maximum number +of interfaces and profile periodicity supported by the driver. + +Add new WMI fields to configure maximum vdev count supported for +MBSSID and profile periodicity in case of EMA. +Setting WMI_RSRC_CFG_FLAG2_CALC_NEXT_DTIM_COUNT_SET flag +indicates that the firmware should track and update the DTIM counts +for each non-transmitted profile. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Aloka Dixit +Co-developed-by: John Crispin +Signed-off-by: John Crispin +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230405221648.17950-2-quic_alokad@quicinc.com +--- + drivers/net/wireless/ath/ath11k/hw.c | 3 +++ + drivers/net/wireless/ath/ath11k/hw.h | 1 + + drivers/net/wireless/ath/ath11k/mac.c | 7 +++++++ + drivers/net/wireless/ath/ath11k/wmi.c | 3 +++ + drivers/net/wireless/ath/ath11k/wmi.h | 6 ++++++ + 5 files changed, 20 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -202,6 +202,9 @@ static void ath11k_init_wmi_config_ipq80 + config->twt_ap_sta_count = 1000; + config->flag1 |= WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64; + config->flag1 |= WMI_RSRC_CFG_FLAG1_ACK_RSSI; ++ config->ema_max_vap_cnt = ab->num_radios; ++ config->ema_max_profile_period = TARGET_EMA_MAX_PROFILE_PERIOD; ++ config->beacon_tx_offload_max_vdev += config->ema_max_vap_cnt; + } + + static int ath11k_hw_mac_id_to_pdev_id_ipq8074(struct ath11k_hw_params *hw, +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -64,6 +64,7 @@ + #define TARGET_NUM_WDS_ENTRIES 32 + #define TARGET_DMA_BURST_SIZE 1 + #define TARGET_RX_BATCHMODE 1 ++#define TARGET_EMA_MAX_PROFILE_PERIOD 8 + + #define ATH11K_HW_MAX_QUEUES 4 + #define ATH11K_QUEUE_LEN 4096 +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -9001,19 +9001,23 @@ static int ath11k_mac_setup_iface_combin + + static const u8 ath11k_if_types_ext_capa[] = { + [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, ++ [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, + [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, + }; + + static const u8 ath11k_if_types_ext_capa_sta[] = { + [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, ++ [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, + [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, + [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT, + }; + + static const u8 ath11k_if_types_ext_capa_ap[] = { + [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, ++ [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, + [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, + [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT, ++ [10] = WLAN_EXT_CAPA11_EMA_SUPPORT, + }; + + static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = { +@@ -9251,6 +9255,9 @@ static int __ath11k_mac_register(struct + wiphy_ext_feature_set(ar->hw->wiphy, + NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER); + ++ ar->hw->wiphy->mbssid_max_interfaces = TARGET_NUM_VDEVS(ab); ++ ar->hw->wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD; ++ + ath11k_reg_init(ar); + + if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) { +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -3987,6 +3987,9 @@ ath11k_wmi_copy_resource_config(struct w + ~(1 << WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT); + wmi_cfg->host_service_flags |= (tg_cfg->is_reg_cc_ext_event_supported << + WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT); ++ wmi_cfg->flags2 = WMI_RSRC_CFG_FLAG2_CALC_NEXT_DTIM_COUNT_SET; ++ wmi_cfg->ema_max_vap_cnt = tg_cfg->ema_max_vap_cnt; ++ wmi_cfg->ema_max_profile_period = tg_cfg->ema_max_profile_period; + } + + static int ath11k_init_cmd_send(struct ath11k_pdev_wmi *wmi, +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -2317,6 +2317,7 @@ struct wmi_init_cmd { + } __packed; + + #define WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64 BIT(5) ++#define WMI_RSRC_CFG_FLAG2_CALC_NEXT_DTIM_COUNT_SET BIT(9) + #define WMI_RSRC_CFG_FLAG1_ACK_RSSI BIT(18) + + #define WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT 4 +@@ -2389,6 +2390,9 @@ struct wmi_resource_config { + u32 msdu_flow_override_config1; + u32 flags2; + u32 host_service_flags; ++ u32 max_rnr_neighbours; ++ u32 ema_max_vap_cnt; ++ u32 ema_max_profile_period; + } __packed; + + struct wmi_service_ready_event { +@@ -5646,6 +5650,8 @@ struct target_resource_config { + u32 twt_ap_pdev_count; + u32 twt_ap_sta_count; + u8 is_reg_cc_ext_event_supported; ++ u32 ema_max_vap_cnt; ++ u32 ema_max_profile_period; + }; + + enum wmi_debug_log_param { diff --git a/package/kernel/mac80211/patches/ath11k/0072-wifi-ath11k-MBSSID-configuration-during-vdev-create-.patch b/package/kernel/mac80211/patches/ath11k/0072-wifi-ath11k-MBSSID-configuration-during-vdev-create-.patch new file mode 100644 index 0000000000..4ba0717319 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0072-wifi-ath11k-MBSSID-configuration-during-vdev-create-.patch @@ -0,0 +1,215 @@ +From 5a81610acf66c4ad6e1a1fbd09f3f555fca863b1 Mon Sep 17 00:00:00 2001 +From: Aloka Dixit +Date: Fri, 5 May 2023 16:11:27 +0300 +Subject: [PATCH 72/77] wifi: ath11k: MBSSID configuration during vdev + create/start + +Configure multiple BSSID flags and index of the transmitting interface +in vdev create/start commands depending on the service bit +WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Aloka Dixit +Co-developed-by: John Crispin +Signed-off-by: John Crispin +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230405221648.17950-3-quic_alokad@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 70 +++++++++++++++++++++++++-- + drivers/net/wireless/ath/ath11k/wmi.c | 5 ++ + drivers/net/wireless/ath/ath11k/wmi.h | 19 ++++++++ + 3 files changed, 90 insertions(+), 4 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -6181,17 +6181,62 @@ static void ath11k_mac_op_stop(struct ie + atomic_set(&ar->num_pending_mgmt_tx, 0); + } + +-static void +-ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif, +- struct vdev_create_params *params) ++static int ath11k_mac_setup_vdev_params_mbssid(struct ath11k_vif *arvif, ++ u32 *flags, u32 *tx_vdev_id) ++{ ++ struct ath11k *ar = arvif->ar; ++ struct ath11k_vif *tx_arvif; ++ struct ieee80211_vif *tx_vif; ++ ++ *tx_vdev_id = 0; ++ tx_vif = arvif->vif->mbssid_tx_vif; ++ if (!tx_vif) { ++ *flags = WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP; ++ return 0; ++ } ++ ++ tx_arvif = (void *)tx_vif->drv_priv; ++ ++ if (arvif->vif->bss_conf.nontransmitted) { ++ if (ar->hw->wiphy != ieee80211_vif_to_wdev(tx_vif)->wiphy) ++ return -EINVAL; ++ ++ *flags = WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP; ++ *tx_vdev_id = ath11k_vif_to_arvif(tx_vif)->vdev_id; ++ } else if (tx_arvif == arvif) { ++ *flags = WMI_HOST_VDEV_FLAGS_TRANSMIT_AP; ++ } else { ++ return -EINVAL; ++ } ++ ++ if (arvif->vif->bss_conf.ema_ap) ++ *flags |= WMI_HOST_VDEV_FLAGS_EMA_MODE; ++ ++ return 0; ++} ++ ++static int ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif, ++ struct vdev_create_params *params) + { + struct ath11k *ar = arvif->ar; + struct ath11k_pdev *pdev = ar->pdev; ++ int ret; + + params->if_id = arvif->vdev_id; + params->type = arvif->vdev_type; + params->subtype = arvif->vdev_subtype; + params->pdev_id = pdev->pdev_id; ++ params->mbssid_flags = 0; ++ params->mbssid_tx_vdev_id = 0; ++ ++ if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, ++ ar->ab->wmi_ab.svc_map)) { ++ ret = ath11k_mac_setup_vdev_params_mbssid(arvif, ++ ¶ms->mbssid_flags, ++ ¶ms->mbssid_tx_vdev_id); ++ if (ret) ++ return ret; ++ } + + if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) { + params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; +@@ -6206,6 +6251,7 @@ ath11k_mac_setup_vdev_create_params(stru + params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; + params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; + } ++ return 0; + } + + static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw, +@@ -6500,7 +6546,12 @@ static int ath11k_mac_op_add_interface(s + for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) + vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1); + +- ath11k_mac_setup_vdev_create_params(arvif, &vdev_param); ++ ret = ath11k_mac_setup_vdev_create_params(arvif, &vdev_param); ++ if (ret) { ++ ath11k_warn(ab, "failed to create vdev parameters %d: %d\n", ++ arvif->vdev_id, ret); ++ goto err; ++ } + + ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param); + if (ret) { +@@ -6905,6 +6956,17 @@ ath11k_mac_vdev_start_restart(struct ath + arg.pref_tx_streams = ar->num_tx_chains; + arg.pref_rx_streams = ar->num_rx_chains; + ++ arg.mbssid_flags = 0; ++ arg.mbssid_tx_vdev_id = 0; ++ if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, ++ ar->ab->wmi_ab.svc_map)) { ++ ret = ath11k_mac_setup_vdev_params_mbssid(arvif, ++ &arg.mbssid_flags, ++ &arg.mbssid_tx_vdev_id); ++ if (ret) ++ return ret; ++ } ++ + if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { + arg.ssid = arvif->u.ap.ssid; + arg.ssid_len = arvif->u.ap.ssid_len; +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -724,6 +724,9 @@ int ath11k_wmi_vdev_create(struct ath11k + cmd->vdev_subtype = param->subtype; + cmd->num_cfg_txrx_streams = WMI_NUM_SUPPORTED_BAND_MAX; + cmd->pdev_id = param->pdev_id; ++ cmd->mbssid_flags = param->mbssid_flags; ++ cmd->mbssid_tx_vdev_id = param->mbssid_tx_vdev_id; ++ + ether_addr_copy(cmd->vdev_macaddr.addr, macaddr); + + ptr = skb->data + sizeof(*cmd); +@@ -941,6 +944,8 @@ int ath11k_wmi_vdev_start(struct ath11k + cmd->cac_duration_ms = arg->cac_duration_ms; + cmd->regdomain = arg->regdomain; + cmd->he_ops = arg->he_ops; ++ cmd->mbssid_flags = arg->mbssid_flags; ++ cmd->mbssid_tx_vdev_id = arg->mbssid_tx_vdev_id; + + if (!restart) { + if (arg->ssid) { +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -137,6 +137,14 @@ enum { + WMI_AUTORATE_3200NS_GI = BIT(11), + }; + ++enum { ++ WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP = 0x00000001, ++ WMI_HOST_VDEV_FLAGS_TRANSMIT_AP = 0x00000002, ++ WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP = 0x00000004, ++ WMI_HOST_VDEV_FLAGS_EMA_MODE = 0x00000008, ++ WMI_HOST_VDEV_FLAGS_SCAN_MODE_VAP = 0x00000010, ++}; ++ + /* + * wmi command groups. + */ +@@ -2096,6 +2104,7 @@ enum wmi_tlv_service { + WMI_TLV_SERVICE_EXT2_MSG = 220, + WMI_TLV_SERVICE_PEER_POWER_SAVE_DURATION_SUPPORT = 246, + WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT = 249, ++ WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT = 253, + WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE = 263, + + /* The second 128 bits */ +@@ -2583,6 +2592,8 @@ struct vdev_create_params { + u8 rx; + } chains[NUM_NL80211_BANDS]; + u32 pdev_id; ++ u32 mbssid_flags; ++ u32 mbssid_tx_vdev_id; + }; + + struct wmi_vdev_create_cmd { +@@ -2593,6 +2604,8 @@ struct wmi_vdev_create_cmd { + struct wmi_mac_addr vdev_macaddr; + u32 num_cfg_txrx_streams; + u32 pdev_id; ++ u32 mbssid_flags; ++ u32 mbssid_tx_vdev_id; + } __packed; + + struct wmi_vdev_txrx_streams { +@@ -2656,6 +2669,9 @@ struct wmi_vdev_start_request_cmd { + u32 he_ops; + u32 cac_duration_ms; + u32 regdomain; ++ u32 min_data_rate; ++ u32 mbssid_flags; ++ u32 mbssid_tx_vdev_id; + } __packed; + + #define MGMT_TX_DL_FRM_LEN 64 +@@ -2825,6 +2841,9 @@ struct wmi_vdev_start_req_arg { + u32 pref_rx_streams; + u32 pref_tx_streams; + u32 num_noa_descriptors; ++ u32 min_data_rate; ++ u32 mbssid_flags; ++ u32 mbssid_tx_vdev_id; + }; + + struct peer_create_params { diff --git a/package/kernel/mac80211/patches/ath11k/0073-wifi-ath11k-rename-MBSSID-fields-in-wmi_vdev_up_cmd.patch b/package/kernel/mac80211/patches/ath11k/0073-wifi-ath11k-rename-MBSSID-fields-in-wmi_vdev_up_cmd.patch new file mode 100644 index 0000000000..023a1dbb9f --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0073-wifi-ath11k-rename-MBSSID-fields-in-wmi_vdev_up_cmd.patch @@ -0,0 +1,52 @@ +From cf604e72bc6e6db68c7fcaa8779b03ec14b8d2fa Mon Sep 17 00:00:00 2001 +From: Aloka Dixit +Date: Fri, 5 May 2023 16:11:27 +0300 +Subject: [PATCH 73/77] wifi: ath11k: rename MBSSID fields in wmi_vdev_up_cmd + +Rename trans_bssid to tx_vdev_bssid to make it similar to vdev_bssid. + +Rename profile_num to nontx_profile_cnt, and profile_idx to +nontx_profile_idx which makes it clear that these store configurations +related to MBSSID non-transmitting profiles. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Aloka Dixit +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230405221648.17950-4-quic_alokad@quicinc.com +--- + drivers/net/wireless/ath/ath11k/wmi.c | 6 +++--- + drivers/net/wireless/ath/ath11k/wmi.h | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -1029,10 +1029,10 @@ int ath11k_wmi_vdev_up(struct ath11k *ar + bss_conf = &arvif->vif->bss_conf; + + if (bss_conf->nontransmitted) { +- ether_addr_copy(cmd->trans_bssid.addr, ++ ether_addr_copy(cmd->tx_vdev_bssid.addr, + bss_conf->transmitter_bssid); +- cmd->profile_idx = bss_conf->bssid_index; +- cmd->profile_num = bss_conf->bssid_indicator; ++ cmd->nontx_profile_idx = bss_conf->bssid_index; ++ cmd->nontx_profile_cnt = bss_conf->bssid_indicator; + } + } + +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -2625,9 +2625,9 @@ struct wmi_vdev_up_cmd { + u32 vdev_id; + u32 vdev_assoc_id; + struct wmi_mac_addr vdev_bssid; +- struct wmi_mac_addr trans_bssid; +- u32 profile_idx; +- u32 profile_num; ++ struct wmi_mac_addr tx_vdev_bssid; ++ u32 nontx_profile_idx; ++ u32 nontx_profile_cnt; + } __packed; + + struct wmi_vdev_stop_cmd { diff --git a/package/kernel/mac80211/patches/ath11k/0074-wifi-ath11k-MBSSID-parameter-configuration-in-AP-mod.patch b/package/kernel/mac80211/patches/ath11k/0074-wifi-ath11k-MBSSID-parameter-configuration-in-AP-mod.patch new file mode 100644 index 0000000000..d93e27dd42 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0074-wifi-ath11k-MBSSID-parameter-configuration-in-AP-mod.patch @@ -0,0 +1,138 @@ +From c82dc33f252fd8883be66f2d0230af0fd734c683 Mon Sep 17 00:00:00 2001 +From: Aloka Dixit +Date: Fri, 5 May 2023 16:11:27 +0300 +Subject: [PATCH 74/77] wifi: ath11k: MBSSID parameter configuration in AP mode + +Include MBSSID parameters in WMI vdev up operation. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Aloka Dixit +Co-developed-by: John Crispin +Signed-off-by: John Crispin +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230405221648.17950-5-quic_alokad@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 29 +++++++++++++++++++++------ + drivers/net/wireless/ath/ath11k/wmi.c | 8 +++++++- + drivers/net/wireless/ath/ath11k/wmi.h | 3 ++- + 3 files changed, 32 insertions(+), 8 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -964,7 +964,7 @@ static int ath11k_mac_monitor_vdev_start + return ret; + } + +- ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); ++ ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr, NULL, 0, 0); + if (ret) { + ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", + vdev_id, ret); +@@ -1423,6 +1423,7 @@ static void ath11k_control_beaconing(str + struct ieee80211_bss_conf *info) + { + struct ath11k *ar = arvif->ar; ++ struct ath11k_vif *tx_arvif = NULL; + int ret = 0; + + lockdep_assert_held(&arvif->ar->conf_mutex); +@@ -1451,8 +1452,14 @@ static void ath11k_control_beaconing(str + + ether_addr_copy(arvif->bssid, info->bssid); + ++ if (arvif->vif->mbssid_tx_vif) ++ tx_arvif = (struct ath11k_vif *)arvif->vif->mbssid_tx_vif->drv_priv; ++ + ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, +- arvif->bssid); ++ arvif->bssid, ++ tx_arvif ? tx_arvif->bssid : NULL, ++ info->bssid_index, ++ 1 << info->bssid_indicator); + if (ret) { + ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n", + arvif->vdev_id, ret); +@@ -2879,7 +2886,8 @@ static void ath11k_bss_assoc(struct ieee + arvif->aid = vif->cfg.aid; + ether_addr_copy(arvif->bssid, bss_conf->bssid); + +- ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); ++ ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid, ++ NULL, 0, 0); + if (ret) { + ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n", + arvif->vdev_id, ret); +@@ -7133,7 +7141,8 @@ ath11k_mac_update_vif_chan(struct ath11k + int n_vifs) + { + struct ath11k_base *ab = ar->ab; +- struct ath11k_vif *arvif; ++ struct ath11k_vif *arvif, *tx_arvif = NULL; ++ struct ieee80211_vif *mbssid_tx_vif; + int ret; + int i; + bool monitor_vif = false; +@@ -7187,8 +7196,15 @@ ath11k_mac_update_vif_chan(struct ath11k + ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n", + ret); + ++ mbssid_tx_vif = arvif->vif->mbssid_tx_vif; ++ if (mbssid_tx_vif) ++ tx_arvif = (struct ath11k_vif *)mbssid_tx_vif->drv_priv; ++ + ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, +- arvif->bssid); ++ arvif->bssid, ++ tx_arvif ? tx_arvif->bssid : NULL, ++ arvif->vif->bss_conf.bssid_index, ++ 1 << arvif->vif->bss_conf.bssid_indicator); + if (ret) { + ath11k_warn(ab, "failed to bring vdev up %d: %d\n", + arvif->vdev_id, ret); +@@ -7306,7 +7322,8 @@ static int ath11k_start_vdev_delay(struc + } + + if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { +- ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr); ++ ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr, ++ NULL, 0, 0); + if (ret) { + ath11k_warn(ab, "failed put monitor up: %d\n", ret); + return ret; +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -1001,7 +1001,8 @@ int ath11k_wmi_vdev_start(struct ath11k + return ret; + } + +-int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, const u8 *bssid) ++int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, const u8 *bssid, ++ u8 *tx_bssid, u32 nontx_profile_idx, u32 nontx_profile_cnt) + { + struct ath11k_pdev_wmi *wmi = ar->wmi; + struct wmi_vdev_up_cmd *cmd; +@@ -1025,6 +1026,11 @@ int ath11k_wmi_vdev_up(struct ath11k *ar + + ether_addr_copy(cmd->vdev_bssid.addr, bssid); + ++ cmd->nontx_profile_idx = nontx_profile_idx; ++ cmd->nontx_profile_cnt = nontx_profile_cnt; ++ if (tx_bssid) ++ ether_addr_copy(cmd->tx_vdev_bssid.addr, tx_bssid); ++ + if (arvif && arvif->vif->type == NL80211_IFTYPE_STATION) { + bss_conf = &arvif->vif->bss_conf; + +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -6301,7 +6301,8 @@ int ath11k_wmi_bcn_tmpl(struct ath11k *a + struct sk_buff *bcn); + int ath11k_wmi_vdev_down(struct ath11k *ar, u8 vdev_id); + int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, +- const u8 *bssid); ++ const u8 *bssid, u8 *tx_bssid, u32 nontx_profile_idx, ++ u32 nontx_profile_cnt); + int ath11k_wmi_vdev_stop(struct ath11k *ar, u8 vdev_id); + int ath11k_wmi_vdev_start(struct ath11k *ar, struct wmi_vdev_start_req_arg *arg, + bool restart); diff --git a/package/kernel/mac80211/patches/ath11k/0075-wifi-ath11k-refactor-vif-parameter-configurations.patch b/package/kernel/mac80211/patches/ath11k/0075-wifi-ath11k-refactor-vif-parameter-configurations.patch new file mode 100644 index 0000000000..8509e55978 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0075-wifi-ath11k-refactor-vif-parameter-configurations.patch @@ -0,0 +1,86 @@ +From cb9bea773c85e372931cd7a177db4165adf29d95 Mon Sep 17 00:00:00 2001 +From: Aloka Dixit +Date: Fri, 5 May 2023 16:11:28 +0300 +Subject: [PATCH 75/77] wifi: ath11k: refactor vif parameter configurations + +Security parameters for each non-transmitting profile can be +different when MBSSID is enabled and this information is included +in the MBSSID element in the Beacon frame. Current implementation +to set rsnie_present and wpaie_present does not parse this element +hence it applies only to the transmitting interface. + +Move the code to a separate function to make additions for +non-transmitting interfaces cleaner. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Aloka Dixit +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230405221648.17950-6-quic_alokad@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 41 ++++++++++++++++----------- + 1 file changed, 24 insertions(+), 17 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -1351,28 +1351,14 @@ err_mon_del: + return ret; + } + +-static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif) ++static void ath11k_mac_set_vif_params(struct ath11k_vif *arvif, ++ struct sk_buff *bcn) + { +- struct ath11k *ar = arvif->ar; +- struct ath11k_base *ab = ar->ab; +- struct ieee80211_hw *hw = ar->hw; +- struct ieee80211_vif *vif = arvif->vif; +- struct ieee80211_mutable_offsets offs = {}; +- struct sk_buff *bcn; + struct ieee80211_mgmt *mgmt; + u8 *ies; +- int ret; +- +- if (arvif->vdev_type != WMI_VDEV_TYPE_AP) +- return 0; +- +- bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0); +- if (!bcn) { +- ath11k_warn(ab, "failed to get beacon template from mac80211\n"); +- return -EPERM; +- } + + ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn); ++ mgmt = (struct ieee80211_mgmt *)bcn->data; + ies += sizeof(mgmt->u.beacon); + + if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies))) +@@ -1386,7 +1372,28 @@ static int ath11k_mac_setup_bcn_tmpl(str + arvif->wpaie_present = true; + else + arvif->wpaie_present = false; ++} ++ ++static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif) ++{ ++ struct ath11k *ar = arvif->ar; ++ struct ath11k_base *ab = ar->ab; ++ struct ieee80211_hw *hw = ar->hw; ++ struct ieee80211_vif *vif = arvif->vif; ++ struct ieee80211_mutable_offsets offs = {}; ++ struct sk_buff *bcn; ++ int ret; ++ ++ if (arvif->vdev_type != WMI_VDEV_TYPE_AP) ++ return 0; ++ ++ bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0); ++ if (!bcn) { ++ ath11k_warn(ab, "failed to get beacon template from mac80211\n"); ++ return -EPERM; ++ } + ++ ath11k_mac_set_vif_params(arvif, bcn); + ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn); + + kfree_skb(bcn); diff --git a/package/kernel/mac80211/patches/ath11k/0076-wifi-ath11k-MBSSID-beacon-support.patch b/package/kernel/mac80211/patches/ath11k/0076-wifi-ath11k-MBSSID-beacon-support.patch new file mode 100644 index 0000000000..d23ea8deea --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0076-wifi-ath11k-MBSSID-beacon-support.patch @@ -0,0 +1,190 @@ +From 335a92765d308dfe22826f5562cd4b4389b45e71 Mon Sep 17 00:00:00 2001 +From: Aloka Dixit +Date: Fri, 5 May 2023 16:11:28 +0300 +Subject: [PATCH 76/77] wifi: ath11k: MBSSID beacon support + +- Split ath11k_mac_setup_bcn_tmpl() to move the beacon retrieval and + WMI command to a new function, ath11k_mac_setup_bcn_tmpl_legacy(). + In the original function add checks to use the transmitting interface + when MBSSID is enabled. +- Set rsnie_present and wpaie_present fields for the non-transmitting + interfaces when MBSSID is enabled. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Aloka Dixit +Co-developed-by: John Crispin +Signed-off-by: John Crispin +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230405221648.17950-7-quic_alokad@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 116 ++++++++++++++++++++++++-- + drivers/net/wireless/ath/ath11k/wmi.c | 1 + + 2 files changed, 112 insertions(+), 5 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -1351,6 +1351,84 @@ err_mon_del: + return ret; + } + ++static void ath11k_mac_setup_nontx_vif_rsnie(struct ath11k_vif *arvif, ++ bool tx_arvif_rsnie_present, ++ const u8 *profile, u8 profile_len) ++{ ++ if (cfg80211_find_ie(WLAN_EID_RSN, profile, profile_len)) { ++ arvif->rsnie_present = true; ++ } else if (tx_arvif_rsnie_present) { ++ int i; ++ u8 nie_len; ++ const u8 *nie = cfg80211_find_ext_ie(WLAN_EID_EXT_NON_INHERITANCE, ++ profile, profile_len); ++ if (!nie) ++ return; ++ ++ nie_len = nie[1]; ++ nie += 2; ++ for (i = 0; i < nie_len; i++) { ++ if (nie[i] == WLAN_EID_RSN) { ++ arvif->rsnie_present = false; ++ break; ++ } ++ } ++ } ++} ++ ++static bool ath11k_mac_set_nontx_vif_params(struct ath11k_vif *tx_arvif, ++ struct ath11k_vif *arvif, ++ struct sk_buff *bcn) ++{ ++ struct ieee80211_mgmt *mgmt; ++ const u8 *ies, *profile, *next_profile; ++ int ies_len; ++ ++ ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn); ++ mgmt = (struct ieee80211_mgmt *)bcn->data; ++ ies += sizeof(mgmt->u.beacon); ++ ies_len = skb_tail_pointer(bcn) - ies; ++ ++ ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ies, ies_len); ++ arvif->rsnie_present = tx_arvif->rsnie_present; ++ ++ while (ies) { ++ u8 mbssid_len; ++ ++ ies_len -= (2 + ies[1]); ++ mbssid_len = ies[1] - 1; ++ profile = &ies[3]; ++ ++ while (mbssid_len) { ++ u8 profile_len; ++ ++ profile_len = profile[1]; ++ next_profile = profile + (2 + profile_len); ++ mbssid_len -= (2 + profile_len); ++ ++ profile += 2; ++ profile_len -= (2 + profile[1]); ++ profile += (2 + profile[1]); /* nontx capabilities */ ++ profile_len -= (2 + profile[1]); ++ profile += (2 + profile[1]); /* SSID */ ++ if (profile[2] == arvif->vif->bss_conf.bssid_index) { ++ profile_len -= 5; ++ profile = profile + 5; ++ ath11k_mac_setup_nontx_vif_rsnie(arvif, ++ tx_arvif->rsnie_present, ++ profile, ++ profile_len); ++ return true; ++ } ++ profile = next_profile; ++ } ++ ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, profile, ++ ies_len); ++ } ++ ++ return false; ++} ++ + static void ath11k_mac_set_vif_params(struct ath11k_vif *arvif, + struct sk_buff *bcn) + { +@@ -1374,18 +1452,26 @@ static void ath11k_mac_set_vif_params(st + arvif->wpaie_present = false; + } + +-static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif) ++static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif) + { + struct ath11k *ar = arvif->ar; + struct ath11k_base *ab = ar->ab; ++ struct ath11k_vif *tx_arvif = arvif; + struct ieee80211_hw *hw = ar->hw; + struct ieee80211_vif *vif = arvif->vif; + struct ieee80211_mutable_offsets offs = {}; + struct sk_buff *bcn; + int ret; + +- if (arvif->vdev_type != WMI_VDEV_TYPE_AP) +- return 0; ++ if (arvif->vif->mbssid_tx_vif) { ++ tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv; ++ if (tx_arvif != arvif) { ++ ar = tx_arvif->ar; ++ ab = ar->ab; ++ hw = ar->hw; ++ vif = tx_arvif->vif; ++ } ++ } + + bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0); + if (!bcn) { +@@ -1393,9 +1479,12 @@ static int ath11k_mac_setup_bcn_tmpl(str + return -EPERM; + } + +- ath11k_mac_set_vif_params(arvif, bcn); +- ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn); ++ if (tx_arvif == arvif) ++ ath11k_mac_set_vif_params(tx_arvif, bcn); ++ else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn)) ++ return -EINVAL; + ++ ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn); + kfree_skb(bcn); + + if (ret) +@@ -1405,6 +1494,23 @@ static int ath11k_mac_setup_bcn_tmpl(str + return ret; + } + ++static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif) ++{ ++ struct ieee80211_vif *vif = arvif->vif; ++ ++ if (arvif->vdev_type != WMI_VDEV_TYPE_AP) ++ return 0; ++ ++ /* Target does not expect beacon templates for the already up ++ * non-transmitting interfaces, and results in a crash if sent. ++ */ ++ if (vif->mbssid_tx_vif && ++ arvif != (void *)vif->mbssid_tx_vif->drv_priv && arvif->is_up) ++ return 0; ++ ++ return ath11k_mac_setup_bcn_tmpl_mbssid(arvif); ++} ++ + void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif) + { + struct ieee80211_vif *vif = arvif->vif; +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -1737,6 +1737,7 @@ int ath11k_wmi_bcn_tmpl(struct ath11k *a + } + + cmd->buf_len = bcn->len; ++ cmd->mbssid_ie_offset = offs->mbssid_off; + + ptr = skb->data + sizeof(*cmd); + diff --git a/package/kernel/mac80211/patches/ath11k/0077-wifi-ath11k-EMA-beacon-support.patch b/package/kernel/mac80211/patches/ath11k/0077-wifi-ath11k-EMA-beacon-support.patch new file mode 100644 index 0000000000..51353fa3e4 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0077-wifi-ath11k-EMA-beacon-support.patch @@ -0,0 +1,156 @@ +From 87bd401138161008fdb82fbca6e213af117bfeb9 Mon Sep 17 00:00:00 2001 +From: Aloka Dixit +Date: Fri, 5 May 2023 16:11:28 +0300 +Subject: [PATCH 77/77] wifi: ath11k: EMA beacon support + +Add new function ath11k_mac_setup_bcn_tmpl_ema() which invokes the new +API provided by MAC80211 to retrieve EMA beacons. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Aloka Dixit +Co-developed-by: John Crispin +Signed-off-by: John Crispin +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230405221648.17950-8-quic_alokad@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 59 ++++++++++++++++++++++++++- + drivers/net/wireless/ath/ath11k/wmi.c | 3 +- + drivers/net/wireless/ath/ath11k/wmi.h | 11 ++++- + 3 files changed, 70 insertions(+), 3 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -1452,6 +1452,60 @@ static void ath11k_mac_set_vif_params(st + arvif->wpaie_present = false; + } + ++static int ath11k_mac_setup_bcn_tmpl_ema(struct ath11k_vif *arvif) ++{ ++ struct ath11k_vif *tx_arvif; ++ struct ieee80211_ema_beacons *beacons; ++ int ret = 0; ++ bool nontx_vif_params_set = false; ++ u32 params = 0; ++ u8 i = 0; ++ ++ tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv; ++ ++ beacons = ieee80211_beacon_get_template_ema_list(tx_arvif->ar->hw, ++ tx_arvif->vif, 0); ++ if (!beacons || !beacons->cnt) { ++ ath11k_warn(arvif->ar->ab, ++ "failed to get ema beacon templates from mac80211\n"); ++ return -EPERM; ++ } ++ ++ if (tx_arvif == arvif) ++ ath11k_mac_set_vif_params(tx_arvif, beacons->bcn[0].skb); ++ else ++ arvif->wpaie_present = tx_arvif->wpaie_present; ++ ++ for (i = 0; i < beacons->cnt; i++) { ++ if (tx_arvif != arvif && !nontx_vif_params_set) ++ nontx_vif_params_set = ++ ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, ++ beacons->bcn[i].skb); ++ ++ params = beacons->cnt; ++ params |= (i << WMI_EMA_TMPL_IDX_SHIFT); ++ params |= ((!i ? 1 : 0) << WMI_EMA_FIRST_TMPL_SHIFT); ++ params |= ((i + 1 == beacons->cnt ? 1 : 0) << WMI_EMA_LAST_TMPL_SHIFT); ++ ++ ret = ath11k_wmi_bcn_tmpl(tx_arvif->ar, tx_arvif->vdev_id, ++ &beacons->bcn[i].offs, ++ beacons->bcn[i].skb, params); ++ if (ret) { ++ ath11k_warn(tx_arvif->ar->ab, ++ "failed to set ema beacon template id %i error %d\n", ++ i, ret); ++ break; ++ } ++ } ++ ++ ieee80211_beacon_free_ema_list(beacons); ++ ++ if (tx_arvif != arvif && !nontx_vif_params_set) ++ return -EINVAL; /* Profile not found in the beacons */ ++ ++ return ret; ++} ++ + static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif) + { + struct ath11k *ar = arvif->ar; +@@ -1484,7 +1538,7 @@ static int ath11k_mac_setup_bcn_tmpl_mbs + else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn)) + return -EINVAL; + +- ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn); ++ ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn, 0); + kfree_skb(bcn); + + if (ret) +@@ -1508,6 +1562,9 @@ static int ath11k_mac_setup_bcn_tmpl(str + arvif != (void *)vif->mbssid_tx_vif->drv_priv && arvif->is_up) + return 0; + ++ if (vif->bss_conf.ema_ap && vif->mbssid_tx_vif) ++ return ath11k_mac_setup_bcn_tmpl_ema(arvif); ++ + return ath11k_mac_setup_bcn_tmpl_mbssid(arvif); + } + +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -1699,7 +1699,7 @@ int ath11k_wmi_send_bcn_offload_control_ + + int ath11k_wmi_bcn_tmpl(struct ath11k *ar, u32 vdev_id, + struct ieee80211_mutable_offsets *offs, +- struct sk_buff *bcn) ++ struct sk_buff *bcn, u32 ema_params) + { + struct ath11k_pdev_wmi *wmi = ar->wmi; + struct wmi_bcn_tmpl_cmd *cmd; +@@ -1738,6 +1738,7 @@ int ath11k_wmi_bcn_tmpl(struct ath11k *a + + cmd->buf_len = bcn->len; + cmd->mbssid_ie_offset = offs->mbssid_off; ++ cmd->ema_params = ema_params; + + ptr = skb->data + sizeof(*cmd); + +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -3566,6 +3566,10 @@ struct wmi_get_pdev_temperature_cmd { + + #define WMI_BEACON_TX_BUFFER_SIZE 512 + ++#define WMI_EMA_TMPL_IDX_SHIFT 8 ++#define WMI_EMA_FIRST_TMPL_SHIFT 16 ++#define WMI_EMA_LAST_TMPL_SHIFT 24 ++ + struct wmi_bcn_tmpl_cmd { + u32 tlv_header; + u32 vdev_id; +@@ -3576,6 +3580,11 @@ struct wmi_bcn_tmpl_cmd { + u32 csa_event_bitmap; + u32 mbssid_ie_offset; + u32 esp_ie_offset; ++ u32 csc_switch_count_offset; ++ u32 csc_event_bitmap; ++ u32 mu_edca_ie_offset; ++ u32 feature_enable_bitmap; ++ u32 ema_params; + } __packed; + + struct wmi_key_seq_counter { +@@ -6298,7 +6307,7 @@ int ath11k_wmi_mgmt_send(struct ath11k * + struct sk_buff *frame); + int ath11k_wmi_bcn_tmpl(struct ath11k *ar, u32 vdev_id, + struct ieee80211_mutable_offsets *offs, +- struct sk_buff *bcn); ++ struct sk_buff *bcn, u32 ema_param); + int ath11k_wmi_vdev_down(struct ath11k *ar, u8 vdev_id); + int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, + const u8 *bssid, u8 *tx_bssid, u32 nontx_profile_idx, diff --git a/package/kernel/mac80211/patches/ath11k/0078-wifi-ath11k-Relocate-the-func-ath11k_mac_bitrate_mas.patch b/package/kernel/mac80211/patches/ath11k/0078-wifi-ath11k-Relocate-the-func-ath11k_mac_bitrate_mas.patch new file mode 100644 index 0000000000..610bf72514 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0078-wifi-ath11k-Relocate-the-func-ath11k_mac_bitrate_mas.patch @@ -0,0 +1,75 @@ +From 570eec3d40505c30babbe3b8f85a38496c975ab2 Mon Sep 17 00:00:00 2001 +From: Maharaja Kennadyrajan +Date: Tue, 9 May 2023 20:07:23 +0300 +Subject: [PATCH] wifi: ath11k: Relocate the func + ath11k_mac_bitrate_mask_num_ht_rates() and change hweight16 to hweight8 + +Relocate the function ath11k_mac_bitrate_mask_num_ht_rates() definition +to call this function from other functions which helps to avoid the +compilation error (function not defined). + +ht_mcs[] is 1 byte array and it is enough to use hweight8() instead +of hweight16(). Hence, fixed the same. + +Tested on: Compile tested only. + +Signed-off-by: Maharaja Kennadyrajan +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230504092033.3542456-2-quic_mkenna@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 30 +++++++++++++-------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BSD-3-Clause-Clear + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. +- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. ++ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #include +@@ -4338,6 +4338,20 @@ exit: + } + + static int ++ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar, ++ enum nl80211_band band, ++ const struct cfg80211_bitrate_mask *mask) ++{ ++ int num_rates = 0; ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) ++ num_rates += hweight8(mask->control[band].ht_mcs[i]); ++ ++ return num_rates; ++} ++ ++static int + ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar, + enum nl80211_band band, + const struct cfg80211_bitrate_mask *mask) +@@ -7791,20 +7805,6 @@ static void ath11k_mac_op_flush(struct i + ath11k_mac_flush_tx_complete(ar); + } + +-static int +-ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar, +- enum nl80211_band band, +- const struct cfg80211_bitrate_mask *mask) +-{ +- int num_rates = 0; +- int i; +- +- for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) +- num_rates += hweight16(mask->control[band].ht_mcs[i]); +- +- return num_rates; +-} +- + static bool + ath11k_mac_has_single_legacy_rate(struct ath11k *ar, + enum nl80211_band band, diff --git a/package/kernel/mac80211/patches/ath11k/0079-wifi-ath11k-Send-HT-fixed-rate-in-WMI-peer-fixed-par.patch b/package/kernel/mac80211/patches/ath11k/0079-wifi-ath11k-Send-HT-fixed-rate-in-WMI-peer-fixed-par.patch new file mode 100644 index 0000000000..6282f4462e --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0079-wifi-ath11k-Send-HT-fixed-rate-in-WMI-peer-fixed-par.patch @@ -0,0 +1,141 @@ +From df8e3729ffc0aa645839693f74ee7b6d999cdf64 Mon Sep 17 00:00:00 2001 +From: Maharaja Kennadyrajan +Date: Tue, 9 May 2023 20:07:24 +0300 +Subject: [PATCH] wifi: ath11k: Send HT fixed rate in WMI peer fixed param + +Due to the firmware behavior with HT fixed rate setting, +HT fixed rate MCS with NSS > 1 are treated as NSS = 1 +HT rates in the firmware and enables the HT fixed rate of +NSS = 1. + +This leads to HT fixed rate is always configured for NSS = 1 +even though the user sets NSS = 2 or > 1 HT fixed MCS in the +set bitrate command. + +Currently HT fixed MCS is sent via WMI peer assoc command. +Fix this issue, by sending the HT fixed rate MCS in WMI peer +fixed param instead of sending in peer assoc command. + +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Maharaja Kennadyrajan +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230504092033.3542456-3-quic_mkenna@quicinc.com +--- + drivers/net/wireless/ath/ath11k/mac.c | 63 ++++++++++++++++++++++++++- + 1 file changed, 61 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -4480,6 +4480,54 @@ ath11k_mac_set_peer_he_fixed_rate(struct + return ret; + } + ++static int ++ath11k_mac_set_peer_ht_fixed_rate(struct ath11k_vif *arvif, ++ struct ieee80211_sta *sta, ++ const struct cfg80211_bitrate_mask *mask, ++ enum nl80211_band band) ++{ ++ struct ath11k *ar = arvif->ar; ++ u8 ht_rate, nss = 0; ++ u32 rate_code; ++ int ret, i; ++ ++ lockdep_assert_held(&ar->conf_mutex); ++ ++ for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { ++ if (hweight8(mask->control[band].ht_mcs[i]) == 1) { ++ nss = i + 1; ++ ht_rate = ffs(mask->control[band].ht_mcs[i]) - 1; ++ } ++ } ++ ++ if (!nss) { ++ ath11k_warn(ar->ab, "No single HT Fixed rate found to set for %pM", ++ sta->addr); ++ return -EINVAL; ++ } ++ ++ /* Avoid updating invalid nss as fixed rate*/ ++ if (nss > sta->deflink.rx_nss) ++ return -EINVAL; ++ ++ ath11k_dbg(ar->ab, ATH11K_DBG_MAC, ++ "Setting Fixed HT Rate for peer %pM. Device will not switch to any other selected rates", ++ sta->addr); ++ ++ rate_code = ATH11K_HW_RATE_CODE(ht_rate, nss - 1, ++ WMI_RATE_PREAMBLE_HT); ++ ret = ath11k_wmi_set_peer_param(ar, sta->addr, ++ arvif->vdev_id, ++ WMI_PEER_PARAM_FIXED_RATE, ++ rate_code); ++ if (ret) ++ ath11k_warn(ar->ab, ++ "failed to update STA %pM HT Fixed Rate %d: %d\n", ++ sta->addr, rate_code, ret); ++ ++ return ret; ++} ++ + static int ath11k_station_assoc(struct ath11k *ar, + struct ieee80211_vif *vif, + struct ieee80211_sta *sta, +@@ -4491,7 +4539,7 @@ static int ath11k_station_assoc(struct a + struct cfg80211_chan_def def; + enum nl80211_band band; + struct cfg80211_bitrate_mask *mask; +- u8 num_vht_rates, num_he_rates; ++ u8 num_ht_rates, num_vht_rates, num_he_rates; + + lockdep_assert_held(&ar->conf_mutex); + +@@ -4519,6 +4567,7 @@ static int ath11k_station_assoc(struct a + + num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask); + num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask); ++ num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask); + + /* If single VHT/HE rate is configured (by set_bitrate_mask()), + * peer_assoc will disable VHT/HE. This is now enabled by a peer specific +@@ -4535,6 +4584,11 @@ static int ath11k_station_assoc(struct a + band); + if (ret) + return ret; ++ } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) { ++ ret = ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask, ++ band); ++ if (ret) ++ return ret; + } + + /* Re-assoc is run only to update supported rates for given station. It +@@ -4608,7 +4662,7 @@ static void ath11k_sta_rc_update_wk(stru + const u16 *vht_mcs_mask; + const u16 *he_mcs_mask; + u32 changed, bw, nss, smps, bw_prev; +- int err, num_vht_rates, num_he_rates; ++ int err, num_ht_rates, num_vht_rates, num_he_rates; + const struct cfg80211_bitrate_mask *mask; + struct peer_assoc_params peer_arg; + enum wmi_phy_mode peer_phymode; +@@ -4724,6 +4778,8 @@ static void ath11k_sta_rc_update_wk(stru + + if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) { + mask = &arvif->bitrate_mask; ++ num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band, ++ mask); + num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, + mask); + num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, +@@ -4746,6 +4802,9 @@ static void ath11k_sta_rc_update_wk(stru + } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) { + ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask, + band); ++ } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) { ++ ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask, ++ band); + } else { + /* If the peer is non-VHT/HE or no fixed VHT/HE rate + * is provided in the new bitrate mask we set the diff --git a/package/kernel/mac80211/patches/ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch b/package/kernel/mac80211/patches/ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch new file mode 100644 index 0000000000..5ff40aac7a --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch @@ -0,0 +1,127 @@ +From 88ca89202f8e8afb5225eb5244d79cd67c15d744 Mon Sep 17 00:00:00 2001 +From: Wen Gong +Date: Fri, 26 May 2023 12:41:06 +0300 +Subject: [PATCH] wifi: ath11k: add support default regdb while searching + board-2.bin for WCN6855 + +Sometimes board-2.bin does not have the regdb data which matched the +parameters such as vendor, device, subsystem-vendor, subsystem-device +and etc. Add default regdb data with 'bus=%s' into board-2.bin for +WCN6855, then ath11k use 'bus=pci' to search regdb data in board-2.bin +for WCN6855. + +kernel: [ 122.515808] ath11k_pci 0000:03:00.0: boot using board name 'bus=pci,vendor=17cb,device=1103,subsystem-vendor=17cb,subsystem-device=3374,qmi-chip-id=2,qmi-board-id=262' +kernel: [ 122.517240] ath11k_pci 0000:03:00.0: boot firmware request ath11k/WCN6855/hw2.0/board-2.bin size 6179564 +kernel: [ 122.517280] ath11k_pci 0000:03:00.0: failed to fetch regdb data for bus=pci,vendor=17cb,device=1103,subsystem-vendor=17cb,subsystem-device=3374,qmi-chip-id=2,qmi-board-id=262 from ath11k/WCN6855/hw2.0/board-2.bin +kernel: [ 122.517464] ath11k_pci 0000:03:00.0: boot using board name 'bus=pci' +kernel: [ 122.518901] ath11k_pci 0000:03:00.0: boot firmware request ath11k/WCN6855/hw2.0/board-2.bin size 6179564 +kernel: [ 122.518915] ath11k_pci 0000:03:00.0: board name +kernel: [ 122.518917] ath11k_pci 0000:03:00.0: 00000000: 62 75 73 3d 70 63 69 bus=pci +kernel: [ 122.518918] ath11k_pci 0000:03:00.0: boot found match regdb data for name 'bus=pci' +kernel: [ 122.518920] ath11k_pci 0000:03:00.0: boot found regdb data for 'bus=pci' +kernel: [ 122.518921] ath11k_pci 0000:03:00.0: fetched regdb + +Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3 + +Signed-off-by: Wen Gong +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230517133959.8224-1-quic_wgong@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 53 +++++++++++++++++++------- + 1 file changed, 40 insertions(+), 13 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -961,7 +961,8 @@ int ath11k_core_check_dt(struct ath11k_b + } + + static int __ath11k_core_create_board_name(struct ath11k_base *ab, char *name, +- size_t name_len, bool with_variant) ++ size_t name_len, bool with_variant, ++ bool bus_type_mode) + { + /* strlen(',variant=') + strlen(ab->qmi.target.bdf_ext) */ + char variant[9 + ATH11K_QMI_BDF_EXT_STR_LENGTH] = { 0 }; +@@ -972,15 +973,20 @@ static int __ath11k_core_create_board_na + + switch (ab->id.bdf_search) { + case ATH11K_BDF_SEARCH_BUS_AND_BOARD: +- scnprintf(name, name_len, +- "bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x,qmi-chip-id=%d,qmi-board-id=%d%s", +- ath11k_bus_str(ab->hif.bus), +- ab->id.vendor, ab->id.device, +- ab->id.subsystem_vendor, +- ab->id.subsystem_device, +- ab->qmi.target.chip_id, +- ab->qmi.target.board_id, +- variant); ++ if (bus_type_mode) ++ scnprintf(name, name_len, ++ "bus=%s", ++ ath11k_bus_str(ab->hif.bus)); ++ else ++ scnprintf(name, name_len, ++ "bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x,qmi-chip-id=%d,qmi-board-id=%d%s", ++ ath11k_bus_str(ab->hif.bus), ++ ab->id.vendor, ab->id.device, ++ ab->id.subsystem_vendor, ++ ab->id.subsystem_device, ++ ab->qmi.target.chip_id, ++ ab->qmi.target.board_id, ++ variant); + break; + default: + scnprintf(name, name_len, +@@ -999,13 +1005,19 @@ static int __ath11k_core_create_board_na + static int ath11k_core_create_board_name(struct ath11k_base *ab, char *name, + size_t name_len) + { +- return __ath11k_core_create_board_name(ab, name, name_len, true); ++ return __ath11k_core_create_board_name(ab, name, name_len, true, false); + } + + static int ath11k_core_create_fallback_board_name(struct ath11k_base *ab, char *name, + size_t name_len) + { +- return __ath11k_core_create_board_name(ab, name, name_len, false); ++ return __ath11k_core_create_board_name(ab, name, name_len, false, false); ++} ++ ++static int ath11k_core_create_bus_type_board_name(struct ath11k_base *ab, char *name, ++ size_t name_len) ++{ ++ return __ath11k_core_create_board_name(ab, name, name_len, false, true); + } + + const struct firmware *ath11k_core_firmware_request(struct ath11k_base *ab, +@@ -1309,7 +1321,7 @@ success: + + int ath11k_core_fetch_regdb(struct ath11k_base *ab, struct ath11k_board_data *bd) + { +- char boardname[BOARD_NAME_SIZE]; ++ char boardname[BOARD_NAME_SIZE], default_boardname[BOARD_NAME_SIZE]; + int ret; + + ret = ath11k_core_create_board_name(ab, boardname, BOARD_NAME_SIZE); +@@ -1323,6 +1335,21 @@ int ath11k_core_fetch_regdb(struct ath11 + ATH11K_BD_IE_REGDB, + ATH11K_BD_IE_REGDB_NAME, + ATH11K_BD_IE_REGDB_DATA); ++ if (!ret) ++ goto exit; ++ ++ ret = ath11k_core_create_bus_type_board_name(ab, default_boardname, ++ BOARD_NAME_SIZE); ++ if (ret) { ++ ath11k_dbg(ab, ATH11K_DBG_BOOT, ++ "failed to create default board name for regdb: %d", ret); ++ goto exit; ++ } ++ ++ ret = ath11k_core_fetch_board_data_api_n(ab, bd, default_boardname, ++ ATH11K_BD_IE_REGDB, ++ ATH11K_BD_IE_REGDB_NAME, ++ ATH11K_BD_IE_REGDB_DATA); + if (!ret) + goto exit; + diff --git a/package/kernel/mac80211/patches/ath11k/0081-wifi-ath11k-remove-unused-function-ath11k_tm_event_w.patch b/package/kernel/mac80211/patches/ath11k/0081-wifi-ath11k-remove-unused-function-ath11k_tm_event_w.patch new file mode 100644 index 0000000000..b5dc83f007 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0081-wifi-ath11k-remove-unused-function-ath11k_tm_event_w.patch @@ -0,0 +1,128 @@ +From 86f85575a3f6a20cef1c8bb98e78585fe3a53ccc Mon Sep 17 00:00:00 2001 +From: Govindaraj Saminathan +Date: Fri, 26 May 2023 12:41:06 +0300 +Subject: [PATCH 82/84] wifi: ath11k: remove unused function + ath11k_tm_event_wmi() + +The function ath11k_tm_event_wmi() is only defined and it is not used +anywhere. Hence remove the unused. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Govindaraj Saminathan +Signed-off-by: Raj Kumar Bhagat +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230517135934.16408-2-quic_rajkbhag@quicinc.com +--- + drivers/net/wireless/ath/ath11k/testmode.c | 64 +--------------------- + drivers/net/wireless/ath/ath11k/testmode.h | 8 +-- + 2 files changed, 2 insertions(+), 70 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/testmode.c ++++ b/drivers/net/wireless/ath/ath11k/testmode.c +@@ -1,6 +1,7 @@ + // SPDX-License-Identifier: BSD-3-Clause-Clear + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #include "testmode.h" +@@ -20,69 +21,6 @@ static const struct nla_policy ath11k_tm + [ATH11K_TM_ATTR_VERSION_MINOR] = { .type = NLA_U32 }, + }; + +-/* Returns true if callee consumes the skb and the skb should be discarded. +- * Returns false if skb is not used. Does not sleep. +- */ +-bool ath11k_tm_event_wmi(struct ath11k *ar, u32 cmd_id, struct sk_buff *skb) +-{ +- struct sk_buff *nl_skb; +- bool consumed; +- int ret; +- +- ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE, +- "testmode event wmi cmd_id %d skb %pK skb->len %d\n", +- cmd_id, skb, skb->len); +- +- ath11k_dbg_dump(ar->ab, ATH11K_DBG_TESTMODE, NULL, "", skb->data, skb->len); +- +- spin_lock_bh(&ar->data_lock); +- +- consumed = true; +- +- nl_skb = cfg80211_testmode_alloc_event_skb(ar->hw->wiphy, +- 2 * sizeof(u32) + skb->len, +- GFP_ATOMIC); +- if (!nl_skb) { +- ath11k_warn(ar->ab, +- "failed to allocate skb for testmode wmi event\n"); +- goto out; +- } +- +- ret = nla_put_u32(nl_skb, ATH11K_TM_ATTR_CMD, ATH11K_TM_CMD_WMI); +- if (ret) { +- ath11k_warn(ar->ab, +- "failed to put testmode wmi event cmd attribute: %d\n", +- ret); +- kfree_skb(nl_skb); +- goto out; +- } +- +- ret = nla_put_u32(nl_skb, ATH11K_TM_ATTR_WMI_CMDID, cmd_id); +- if (ret) { +- ath11k_warn(ar->ab, +- "failed to put testmode wmi even cmd_id: %d\n", +- ret); +- kfree_skb(nl_skb); +- goto out; +- } +- +- ret = nla_put(nl_skb, ATH11K_TM_ATTR_DATA, skb->len, skb->data); +- if (ret) { +- ath11k_warn(ar->ab, +- "failed to copy skb to testmode wmi event: %d\n", +- ret); +- kfree_skb(nl_skb); +- goto out; +- } +- +- cfg80211_testmode_event(nl_skb, GFP_ATOMIC); +- +-out: +- spin_unlock_bh(&ar->data_lock); +- +- return consumed; +-} +- + static int ath11k_tm_cmd_get_version(struct ath11k *ar, struct nlattr *tb[]) + { + struct sk_buff *skb; +--- a/drivers/net/wireless/ath/ath11k/testmode.h ++++ b/drivers/net/wireless/ath/ath11k/testmode.h +@@ -1,24 +1,18 @@ + /* SPDX-License-Identifier: BSD-3-Clause-Clear */ + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #include "core.h" + + #ifdef CPTCFG_NL80211_TESTMODE + +-bool ath11k_tm_event_wmi(struct ath11k *ar, u32 cmd_id, struct sk_buff *skb); + int ath11k_tm_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + void *data, int len); + + #else + +-static inline bool ath11k_tm_event_wmi(struct ath11k *ar, u32 cmd_id, +- struct sk_buff *skb) +-{ +- return false; +-} +- + static inline int ath11k_tm_cmd(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + void *data, int len) diff --git a/package/kernel/mac80211/patches/ath11k/0082-wifi-ath11k-factory-test-mode-support.patch b/package/kernel/mac80211/patches/ath11k/0082-wifi-ath11k-factory-test-mode-support.patch new file mode 100644 index 0000000000..f1b262724f --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0082-wifi-ath11k-factory-test-mode-support.patch @@ -0,0 +1,850 @@ +From b43310e44edc823a7f02af1e1e2b4e8a9abc7d91 Mon Sep 17 00:00:00 2001 +From: Govindaraj Saminathan +Date: Fri, 26 May 2023 12:41:07 +0300 +Subject: [PATCH 83/84] wifi: ath11k: factory test mode support + +Add support to process factory test mode commands (FTM) for calibration. +By default firmware start with NORMAL mode and to process the FTM commands +firmware needs to be restarted in FTM mode using module parameter ftm_mode. +The pre-request is all the radios should be down before starting the test. + +When start command ATH11K_TM_CMD_TESTMODE_START is received, ar->state +is set to Test Mode. If the FTM command or event length is greater +than 256 bytes, it will be broken down into multiple segments and +encoded with TLV header if it is segmented commands, else it is sent +to firmware as it is. + +On receiving UTF event from firmware, if it is segmented event, the driver +will wait until it receives all the segments and notify the complete +data to user application. In case the segmented sequence are missed or +lost from the firmware, driver will skip the already received partial data. + +In case of unsegmented UTF event from firmware, driver notifies the +data to the user application as it comes. Applications handles +the data further. + +Command to boot in ftm mode: + +insmod ath11k ftm_mode=1 + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Govindaraj Saminathan +Co-developed-by: Sowmiya Sree Elavalagan +Signed-off-by: Sowmiya Sree Elavalagan +Signed-off-by: Raj Kumar Bhagat +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230517135934.16408-4-quic_rajkbhag@quicinc.com +--- + drivers/net/wireless/ath/ath11k/ahb.c | 3 +- + drivers/net/wireless/ath/ath11k/core.c | 21 +- + drivers/net/wireless/ath/ath11k/core.h | 16 +- + drivers/net/wireless/ath/ath11k/debug.h | 1 + + drivers/net/wireless/ath/ath11k/mac.c | 11 +- + drivers/net/wireless/ath/ath11k/pci.c | 3 +- + drivers/net/wireless/ath/ath11k/testmode.c | 350 ++++++++++++++++++- + drivers/net/wireless/ath/ath11k/testmode.h | 6 + + drivers/net/wireless/ath/ath11k/testmode_i.h | 18 +- + drivers/net/wireless/ath/ath11k/wmi.c | 11 +- + drivers/net/wireless/ath/ath11k/wmi.h | 22 ++ + drivers/net/wireless/ath/ath11k/wow.c | 3 +- + 12 files changed, 444 insertions(+), 21 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BSD-3-Clause-Clear + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. +- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. ++ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #include +@@ -1155,6 +1155,7 @@ static int ath11k_ahb_probe(struct platf + ab->hif.ops = hif_ops; + ab->pdev = pdev; + ab->hw_rev = hw_rev; ++ ab->fw_mode = ATH11K_FIRMWARE_MODE_NORMAL; + platform_set_drvdata(pdev, ab); + + ret = ath11k_pcic_register_pci_ops(ab, pci_ops); +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BSD-3-Clause-Clear + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. +- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. ++ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #include +@@ -32,6 +32,10 @@ module_param_named(frame_mode, ath11k_fr + MODULE_PARM_DESC(frame_mode, + "Datapath frame mode (0: raw, 1: native wifi (default), 2: ethernet)"); + ++bool ath11k_ftm_mode; ++module_param_named(ftm_mode, ath11k_ftm_mode, bool, 0444); ++MODULE_PARM_DESC(ftm_mode, "Boots up in factory test mode"); ++ + static const struct ath11k_hw_params ath11k_hw_params[] = { + { + .hw_rev = ATH11K_HW_IPQ8074, +@@ -1381,6 +1385,11 @@ static int ath11k_core_soc_create(struct + { + int ret; + ++ if (ath11k_ftm_mode) { ++ ab->fw_mode = ATH11K_FIRMWARE_MODE_FTM; ++ ath11k_info(ab, "Booting in factory test mode\n"); ++ } ++ + ret = ath11k_qmi_init_service(ab); + if (ret) { + ath11k_err(ab, "failed to initialize qmi :%d\n", ret); +@@ -1607,7 +1616,7 @@ int ath11k_core_qmi_firmware_ready(struc + { + int ret; + +- ret = ath11k_core_start_firmware(ab, ATH11K_FIRMWARE_MODE_NORMAL); ++ ret = ath11k_core_start_firmware(ab, ab->fw_mode); + if (ret) { + ath11k_err(ab, "failed to start firmware: %d\n", ret); + return ret; +@@ -1772,7 +1781,8 @@ void ath11k_core_pre_reconfigure_recover + for (i = 0; i < ab->num_radios; i++) { + pdev = &ab->pdevs[i]; + ar = pdev->ar; +- if (!ar || ar->state == ATH11K_STATE_OFF) ++ if (!ar || ar->state == ATH11K_STATE_OFF || ++ ar->state == ATH11K_STATE_FTM) + continue; + + ieee80211_stop_queues(ar->hw); +@@ -1841,7 +1851,12 @@ static void ath11k_core_post_reconfigure + ath11k_warn(ab, + "device is wedged, will not restart radio %d\n", i); + break; ++ case ATH11K_STATE_FTM: ++ ath11k_dbg(ab, ATH11K_DBG_TESTMODE, ++ "fw mode reset done radio %d\n", i); ++ break; + } ++ + mutex_unlock(&ar->conf_mutex); + } + complete(&ab->driver_recovery); +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -1,7 +1,7 @@ + /* SPDX-License-Identifier: BSD-3-Clause-Clear */ + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. +- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. ++ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #ifndef ATH11K_CORE_H +@@ -52,6 +52,7 @@ + #define ATH11K_SMBIOS_BDF_EXT_MAGIC "BDF_" + + extern unsigned int ath11k_frame_mode; ++extern bool ath11k_ftm_mode; + + #define ATH11K_SCAN_TIMEOUT_HZ (20 * HZ) + +@@ -277,6 +278,7 @@ enum ath11k_dev_flags { + ATH11K_FLAG_FIXED_MEM_RGN, + ATH11K_FLAG_DEVICE_INIT_DONE, + ATH11K_FLAG_MULTI_MSI_VECTORS, ++ ATH11K_FLAG_FTM_SEGMENTED, + }; + + enum ath11k_monitor_flags { +@@ -530,6 +532,7 @@ enum ath11k_state { + ATH11K_STATE_RESTARTING, + ATH11K_STATE_RESTARTED, + ATH11K_STATE_WEDGED, ++ ATH11K_STATE_FTM, + /* Add other states as required */ + }; + +@@ -709,6 +712,8 @@ struct ath11k { + u32 last_ppdu_id; + u32 cached_ppdu_id; + int monitor_vdev_id; ++ struct completion fw_mode_reset; ++ u8 ftm_msgref; + #ifdef CPTCFG_ATH11K_DEBUGFS + struct ath11k_debug debug; + #endif +@@ -838,6 +843,7 @@ struct ath11k_msi_config { + /* Master structure to hold the hw data which may be used in core module */ + struct ath11k_base { + enum ath11k_hw_rev hw_rev; ++ enum ath11k_firmware_mode fw_mode; + struct platform_device *pdev; + struct device *dev; + struct ath11k_qmi qmi; +@@ -978,6 +984,14 @@ struct ath11k_base { + const struct ath11k_pci_ops *ops; + } pci; + ++#ifdef CPTCFG_NL80211_TESTMODE ++ struct { ++ u32 data_pos; ++ u32 expected_seq; ++ u8 *eventdata; ++ } testmode; ++#endif ++ + /* must be last */ + u8 drv_priv[] __aligned(sizeof(void *)); + }; +--- a/drivers/net/wireless/ath/ath11k/debug.h ++++ b/drivers/net/wireless/ath/ath11k/debug.h +@@ -1,6 +1,7 @@ + /* SPDX-License-Identifier: BSD-3-Clause-Clear */ + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #ifndef _ATH11K_DEBUG_H_ +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -643,7 +643,10 @@ struct ath11k *ath11k_mac_get_ar_by_pdev + return NULL; + + for (i = 0; i < ab->num_radios; i++) { +- pdev = rcu_dereference(ab->pdevs_active[i]); ++ if (ab->fw_mode == ATH11K_FIRMWARE_MODE_FTM) ++ pdev = &ab->pdevs[i]; ++ else ++ pdev = rcu_dereference(ab->pdevs_active[i]); + + if (pdev && pdev->pdev_id == pdev_id) + return (pdev->ar ? pdev->ar : NULL); +@@ -6271,6 +6274,11 @@ static int ath11k_mac_op_start(struct ie + struct ath11k_pdev *pdev = ar->pdev; + int ret; + ++ if (ath11k_ftm_mode) { ++ ath11k_warn(ab, "mac operations not supported in factory test mode\n"); ++ return -EOPNOTSUPP; ++ } ++ + ath11k_mac_drain_tx(ar); + mutex_lock(&ar->conf_mutex); + +@@ -6285,6 +6293,7 @@ static int ath11k_mac_op_start(struct ie + case ATH11K_STATE_RESTARTED: + case ATH11K_STATE_WEDGED: + case ATH11K_STATE_ON: ++ case ATH11K_STATE_FTM: + WARN_ON(1); + ret = -EINVAL; + goto err; +--- a/drivers/net/wireless/ath/ath11k/pci.c ++++ b/drivers/net/wireless/ath/ath11k/pci.c +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BSD-3-Clause-Clear + /* + * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. +- * Copyright (c) 2021-2022, Qualcomm Innovation Center, Inc. All rights reserved. ++ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #include +@@ -745,6 +745,7 @@ static int ath11k_pci_probe(struct pci_d + ab_pci->ab = ab; + ab_pci->pdev = pdev; + ab->hif.ops = &ath11k_pci_hif_ops; ++ ab->fw_mode = ATH11K_FIRMWARE_MODE_NORMAL; + pci_set_drvdata(pdev, ab); + spin_lock_init(&ab_pci->window_lock); + +--- a/drivers/net/wireless/ath/ath11k/testmode.c ++++ b/drivers/net/wireless/ath/ath11k/testmode.c +@@ -12,6 +12,9 @@ + #include "core.h" + #include "testmode_i.h" + ++#define ATH11K_FTM_SEGHDR_CURRENT_SEQ GENMASK(3, 0) ++#define ATH11K_FTM_SEGHDR_TOTAL_SEGMENTS GENMASK(7, 4) ++ + static const struct nla_policy ath11k_tm_policy[ATH11K_TM_ATTR_MAX + 1] = { + [ATH11K_TM_ATTR_CMD] = { .type = NLA_U32 }, + [ATH11K_TM_ATTR_DATA] = { .type = NLA_BINARY, +@@ -21,13 +24,217 @@ static const struct nla_policy ath11k_tm + [ATH11K_TM_ATTR_VERSION_MINOR] = { .type = NLA_U32 }, + }; + ++static struct ath11k *ath11k_tm_get_ar(struct ath11k_base *ab) ++{ ++ struct ath11k_pdev *pdev; ++ struct ath11k *ar = NULL; ++ int i; ++ ++ for (i = 0; i < ab->num_radios; i++) { ++ pdev = &ab->pdevs[i]; ++ ar = pdev->ar; ++ ++ if (ar && ar->state == ATH11K_STATE_FTM) ++ break; ++ } ++ ++ return ar; ++} ++ ++/* This function handles unsegmented events. Data in various events are aggregated ++ * in application layer, this event is unsegmented from host perspective. ++ */ ++static void ath11k_tm_wmi_event_unsegmented(struct ath11k_base *ab, u32 cmd_id, ++ struct sk_buff *skb) ++{ ++ struct sk_buff *nl_skb; ++ struct ath11k *ar; ++ ++ ath11k_dbg(ab, ATH11K_DBG_TESTMODE, ++ "event wmi cmd_id %d skb length %d\n", ++ cmd_id, skb->len); ++ ath11k_dbg_dump(ab, ATH11K_DBG_TESTMODE, NULL, "", skb->data, skb->len); ++ ++ ar = ath11k_tm_get_ar(ab); ++ if (!ar) { ++ ath11k_warn(ab, "testmode event not handled due to invalid pdev\n"); ++ return; ++ } ++ ++ spin_lock_bh(&ar->data_lock); ++ ++ nl_skb = cfg80211_testmode_alloc_event_skb(ar->hw->wiphy, ++ 2 * nla_total_size(sizeof(u32)) + ++ nla_total_size(skb->len), ++ GFP_ATOMIC); ++ if (!nl_skb) { ++ ath11k_warn(ab, ++ "failed to allocate skb for unsegmented testmode wmi event\n"); ++ goto out; ++ } ++ ++ if (nla_put_u32(nl_skb, ATH11K_TM_ATTR_CMD, ATH11K_TM_CMD_WMI) || ++ nla_put_u32(nl_skb, ATH11K_TM_ATTR_WMI_CMDID, cmd_id) || ++ nla_put(nl_skb, ATH11K_TM_ATTR_DATA, skb->len, skb->data)) { ++ ath11k_warn(ab, "failed to populate testmode unsegmented event\n"); ++ kfree_skb(nl_skb); ++ goto out; ++ } ++ ++ cfg80211_testmode_event(nl_skb, GFP_ATOMIC); ++ spin_unlock_bh(&ar->data_lock); ++ return; ++ ++out: ++ spin_unlock_bh(&ar->data_lock); ++ ath11k_warn(ab, "Failed to send testmode event to higher layers\n"); ++} ++ ++/* This function handles segmented events. Data of various events received ++ * from firmware is aggregated and sent to application layer ++ */ ++static int ath11k_tm_process_event(struct ath11k_base *ab, u32 cmd_id, ++ const struct wmi_ftm_event_msg *ftm_msg, ++ u16 length) ++{ ++ struct sk_buff *nl_skb; ++ int ret = 0; ++ struct ath11k *ar; ++ u8 const *buf_pos; ++ u16 datalen; ++ u8 total_segments, current_seq; ++ u32 data_pos; ++ u32 pdev_id; ++ ++ ath11k_dbg(ab, ATH11K_DBG_TESTMODE, ++ "event wmi cmd_id %d ftm event msg %pK datalen %d\n", ++ cmd_id, ftm_msg, length); ++ ath11k_dbg_dump(ab, ATH11K_DBG_TESTMODE, NULL, "", ftm_msg, length); ++ pdev_id = DP_HW2SW_MACID(ftm_msg->seg_hdr.pdev_id); ++ ++ if (pdev_id >= ab->num_radios) { ++ ath11k_warn(ab, "testmode event not handled due to invalid pdev id: %d\n", ++ pdev_id); ++ return -EINVAL; ++ } ++ ++ ar = ab->pdevs[pdev_id].ar; ++ if (!ar) { ++ ath11k_warn(ab, "testmode event not handled due to absence of pdev\n"); ++ return -ENODEV; ++ } ++ ++ current_seq = FIELD_GET(ATH11K_FTM_SEGHDR_CURRENT_SEQ, ++ ftm_msg->seg_hdr.segmentinfo); ++ total_segments = FIELD_GET(ATH11K_FTM_SEGHDR_TOTAL_SEGMENTS, ++ ftm_msg->seg_hdr.segmentinfo); ++ datalen = length - (sizeof(struct wmi_ftm_seg_hdr)); ++ buf_pos = ftm_msg->data; ++ ++ spin_lock_bh(&ar->data_lock); ++ ++ if (current_seq == 0) { ++ ab->testmode.expected_seq = 0; ++ ab->testmode.data_pos = 0; ++ } ++ ++ data_pos = ab->testmode.data_pos; ++ ++ if ((data_pos + datalen) > ATH11K_FTM_EVENT_MAX_BUF_LENGTH) { ++ ath11k_warn(ab, "Invalid ftm event length at %d: %d\n", ++ data_pos, datalen); ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ memcpy(&ab->testmode.eventdata[data_pos], buf_pos, datalen); ++ data_pos += datalen; ++ ++ if (++ab->testmode.expected_seq != total_segments) { ++ ab->testmode.data_pos = data_pos; ++ ath11k_dbg(ab, ATH11K_DBG_TESTMODE, ++ "partial data received current_seq %d total_seg %d\n", ++ current_seq, total_segments); ++ goto out; ++ } ++ ++ ath11k_dbg(ab, ATH11K_DBG_TESTMODE, ++ "total data length pos %d len %d\n", ++ data_pos, ftm_msg->seg_hdr.len); ++ nl_skb = cfg80211_testmode_alloc_event_skb(ar->hw->wiphy, ++ 2 * nla_total_size(sizeof(u32)) + ++ nla_total_size(data_pos), ++ GFP_ATOMIC); ++ if (!nl_skb) { ++ ath11k_warn(ab, ++ "failed to allocate skb for segmented testmode wmi event\n"); ++ ret = -ENOMEM; ++ goto out; ++ } ++ ++ if (nla_put_u32(nl_skb, ATH11K_TM_ATTR_CMD, ++ ATH11K_TM_CMD_WMI_FTM) || ++ nla_put_u32(nl_skb, ATH11K_TM_ATTR_WMI_CMDID, cmd_id) || ++ nla_put(nl_skb, ATH11K_TM_ATTR_DATA, data_pos, ++ &ab->testmode.eventdata[0])) { ++ ath11k_warn(ab, "failed to populate segmented testmode event"); ++ kfree_skb(nl_skb); ++ ret = -ENOBUFS; ++ goto out; ++ } ++ ++ cfg80211_testmode_event(nl_skb, GFP_ATOMIC); ++ ++out: ++ spin_unlock_bh(&ar->data_lock); ++ return ret; ++} ++ ++static void ath11k_tm_wmi_event_segmented(struct ath11k_base *ab, u32 cmd_id, ++ struct sk_buff *skb) ++{ ++ const void **tb; ++ const struct wmi_ftm_event_msg *ev; ++ u16 length; ++ int ret; ++ ++ tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC); ++ if (IS_ERR(tb)) { ++ ret = PTR_ERR(tb); ++ ath11k_warn(ab, "failed to parse ftm event tlv: %d\n", ret); ++ return; ++ } ++ ++ ev = tb[WMI_TAG_ARRAY_BYTE]; ++ if (!ev) { ++ ath11k_warn(ab, "failed to fetch ftm msg\n"); ++ kfree(tb); ++ return; ++ } ++ ++ length = skb->len - TLV_HDR_SIZE; ++ ret = ath11k_tm_process_event(ab, cmd_id, ev, length); ++ if (ret) ++ ath11k_warn(ab, "Failed to process ftm event\n"); ++ ++ kfree(tb); ++} ++ ++void ath11k_tm_wmi_event(struct ath11k_base *ab, u32 cmd_id, struct sk_buff *skb) ++{ ++ if (test_bit(ATH11K_FLAG_FTM_SEGMENTED, &ab->dev_flags)) ++ ath11k_tm_wmi_event_segmented(ab, cmd_id, skb); ++ else ++ ath11k_tm_wmi_event_unsegmented(ab, cmd_id, skb); ++} ++ + static int ath11k_tm_cmd_get_version(struct ath11k *ar, struct nlattr *tb[]) + { + struct sk_buff *skb; + int ret; + + ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE, +- "testmode cmd get version_major %d version_minor %d\n", ++ "cmd get version_major %d version_minor %d\n", + ATH11K_TESTMODE_VERSION_MAJOR, + ATH11K_TESTMODE_VERSION_MINOR); + +@@ -53,6 +260,43 @@ static int ath11k_tm_cmd_get_version(str + return cfg80211_testmode_reply(skb); + } + ++static int ath11k_tm_cmd_testmode_start(struct ath11k *ar, struct nlattr *tb[]) ++{ ++ int ret; ++ ++ mutex_lock(&ar->conf_mutex); ++ ++ if (ar->state == ATH11K_STATE_FTM) { ++ ret = -EALREADY; ++ goto err; ++ } ++ ++ /* start utf only when the driver is not in use */ ++ if (ar->state != ATH11K_STATE_OFF) { ++ ret = -EBUSY; ++ goto err; ++ } ++ ++ ar->ab->testmode.eventdata = kzalloc(ATH11K_FTM_EVENT_MAX_BUF_LENGTH, ++ GFP_KERNEL); ++ if (!ar->ab->testmode.eventdata) { ++ ret = -ENOMEM; ++ goto err; ++ } ++ ++ ar->state = ATH11K_STATE_FTM; ++ ar->ftm_msgref = 0; ++ ++ mutex_unlock(&ar->conf_mutex); ++ ++ ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE, "cmd start\n"); ++ return 0; ++ ++err: ++ mutex_unlock(&ar->conf_mutex); ++ return ret; ++} ++ + static int ath11k_tm_cmd_wmi(struct ath11k *ar, struct nlattr *tb[]) + { + struct ath11k_pdev_wmi *wmi = ar->wmi; +@@ -63,11 +307,6 @@ static int ath11k_tm_cmd_wmi(struct ath1 + + mutex_lock(&ar->conf_mutex); + +- if (ar->state != ATH11K_STATE_ON) { +- ret = -ENETDOWN; +- goto out; +- } +- + if (!tb[ATH11K_TM_ATTR_DATA]) { + ret = -EINVAL; + goto out; +@@ -80,11 +319,17 @@ static int ath11k_tm_cmd_wmi(struct ath1 + + buf = nla_data(tb[ATH11K_TM_ATTR_DATA]); + buf_len = nla_len(tb[ATH11K_TM_ATTR_DATA]); ++ if (!buf_len) { ++ ath11k_warn(ar->ab, "No data present in testmode wmi command\n"); ++ ret = -EINVAL; ++ goto out; ++ } ++ + cmd_id = nla_get_u32(tb[ATH11K_TM_ATTR_WMI_CMDID]); + + ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE, +- "testmode cmd wmi cmd_id %d buf %pK buf_len %d\n", +- cmd_id, buf, buf_len); ++ "cmd wmi cmd_id %d buf length %d\n", ++ cmd_id, buf_len); + + ath11k_dbg_dump(ar->ab, ATH11K_DBG_TESTMODE, NULL, "", buf, buf_len); + +@@ -111,6 +356,91 @@ out: + return ret; + } + ++static int ath11k_tm_cmd_wmi_ftm(struct ath11k *ar, struct nlattr *tb[]) ++{ ++ struct ath11k_pdev_wmi *wmi = ar->wmi; ++ struct ath11k_base *ab = ar->ab; ++ struct sk_buff *skb; ++ u32 cmd_id, buf_len, hdr_info; ++ int ret; ++ void *buf; ++ u8 segnumber = 0, seginfo; ++ u16 chunk_len, total_bytes, num_segments; ++ u8 *bufpos; ++ struct wmi_ftm_cmd *ftm_cmd; ++ ++ set_bit(ATH11K_FLAG_FTM_SEGMENTED, &ab->dev_flags); ++ ++ mutex_lock(&ar->conf_mutex); ++ ++ if (ar->state != ATH11K_STATE_FTM) { ++ ret = -ENETDOWN; ++ goto out; ++ } ++ ++ if (!tb[ATH11K_TM_ATTR_DATA]) { ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ buf = nla_data(tb[ATH11K_TM_ATTR_DATA]); ++ buf_len = nla_len(tb[ATH11K_TM_ATTR_DATA]); ++ cmd_id = WMI_PDEV_UTF_CMDID; ++ ++ ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE, ++ "cmd wmi ftm cmd_id %d buffer length %d\n", ++ cmd_id, buf_len); ++ ath11k_dbg_dump(ar->ab, ATH11K_DBG_TESTMODE, NULL, "", buf, buf_len); ++ ++ bufpos = buf; ++ total_bytes = buf_len; ++ num_segments = total_bytes / MAX_WMI_UTF_LEN; ++ ++ if (buf_len - (num_segments * MAX_WMI_UTF_LEN)) ++ num_segments++; ++ ++ while (buf_len) { ++ chunk_len = min_t(u16, buf_len, MAX_WMI_UTF_LEN); ++ ++ skb = ath11k_wmi_alloc_skb(wmi->wmi_ab, (chunk_len + ++ sizeof(struct wmi_ftm_cmd))); ++ if (!skb) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ ++ ftm_cmd = (struct wmi_ftm_cmd *)skb->data; ++ hdr_info = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_ARRAY_BYTE) | ++ FIELD_PREP(WMI_TLV_LEN, (chunk_len + ++ sizeof(struct wmi_ftm_seg_hdr))); ++ ftm_cmd->tlv_header = hdr_info; ++ ftm_cmd->seg_hdr.len = total_bytes; ++ ftm_cmd->seg_hdr.msgref = ar->ftm_msgref; ++ seginfo = FIELD_PREP(ATH11K_FTM_SEGHDR_TOTAL_SEGMENTS, num_segments) | ++ FIELD_PREP(ATH11K_FTM_SEGHDR_CURRENT_SEQ, segnumber); ++ ftm_cmd->seg_hdr.segmentinfo = seginfo; ++ segnumber++; ++ ++ memcpy(&ftm_cmd->data, bufpos, chunk_len); ++ ++ ret = ath11k_wmi_cmd_send(wmi, skb, cmd_id); ++ if (ret) { ++ ath11k_warn(ar->ab, "failed to send wmi ftm command: %d\n", ret); ++ goto out; ++ } ++ ++ buf_len -= chunk_len; ++ bufpos += chunk_len; ++ } ++ ++ ar->ftm_msgref++; ++ ret = 0; ++ ++out: ++ mutex_unlock(&ar->conf_mutex); ++ return ret; ++} ++ + int ath11k_tm_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + void *data, int len) + { +@@ -131,6 +461,10 @@ int ath11k_tm_cmd(struct ieee80211_hw *h + return ath11k_tm_cmd_get_version(ar, tb); + case ATH11K_TM_CMD_WMI: + return ath11k_tm_cmd_wmi(ar, tb); ++ case ATH11K_TM_CMD_TESTMODE_START: ++ return ath11k_tm_cmd_testmode_start(ar, tb); ++ case ATH11K_TM_CMD_WMI_FTM: ++ return ath11k_tm_cmd_wmi_ftm(ar, tb); + default: + return -EOPNOTSUPP; + } +--- a/drivers/net/wireless/ath/ath11k/testmode.h ++++ b/drivers/net/wireless/ath/ath11k/testmode.h +@@ -8,11 +8,17 @@ + + #ifdef CPTCFG_NL80211_TESTMODE + ++void ath11k_tm_wmi_event(struct ath11k_base *ab, u32 cmd_id, struct sk_buff *skb); + int ath11k_tm_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + void *data, int len); + + #else + ++static inline void ath11k_tm_wmi_event(struct ath11k_base *ab, u32 cmd_id, ++ struct sk_buff *skb) ++{ ++} ++ + static inline int ath11k_tm_cmd(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + void *data, int len) +--- a/drivers/net/wireless/ath/ath11k/testmode_i.h ++++ b/drivers/net/wireless/ath/ath11k/testmode_i.h +@@ -1,6 +1,7 @@ + /* SPDX-License-Identifier: BSD-3-Clause-Clear */ + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + /* "API" level of the ath11k testmode interface. Bump it after every +@@ -11,9 +12,10 @@ + /* Bump this after every _compatible_ interface change, for example + * addition of a new command or an attribute. + */ +-#define ATH11K_TESTMODE_VERSION_MINOR 0 ++#define ATH11K_TESTMODE_VERSION_MINOR 1 + + #define ATH11K_TM_DATA_MAX_LEN 5000 ++#define ATH11K_FTM_EVENT_MAX_BUF_LENGTH 2048 + + enum ath11k_tm_attr { + __ATH11K_TM_ATTR_INVALID = 0, +@@ -47,4 +49,18 @@ enum ath11k_tm_cmd { + * ATH11K_TM_ATTR_DATA. + */ + ATH11K_TM_CMD_WMI = 1, ++ ++ /* Boots the UTF firmware, the netdev interface must be down at the ++ * time. ++ */ ++ ATH11K_TM_CMD_TESTMODE_START = 2, ++ ++ /* The command used to transmit a FTM WMI command to the firmware ++ * and the event to receive WMI events from the firmware. The data ++ * received only contain the payload, need to add the tlv header ++ * and send the cmd to firmware with command id WMI_PDEV_UTF_CMDID. ++ * The data payload size could be large and the driver needs to ++ * send segmented data to firmware. ++ */ ++ ATH11K_TM_CMD_WMI_FTM = 3, + }; +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BSD-3-Clause-Clear + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. +- * Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved. ++ * Copyright (c) 2021, 2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + #include + #include +@@ -19,6 +19,7 @@ + #include "mac.h" + #include "hw.h" + #include "peer.h" ++#include "testmode.h" + + struct wmi_tlv_policy { + size_t min_len; +@@ -237,9 +238,8 @@ static int ath11k_wmi_tlv_parse(struct a + (void *)tb); + } + +-static const void ** +-ath11k_wmi_tlv_parse_alloc(struct ath11k_base *ab, const void *ptr, +- size_t len, gfp_t gfp) ++const void **ath11k_wmi_tlv_parse_alloc(struct ath11k_base *ab, const void *ptr, ++ size_t len, gfp_t gfp) + { + const void **tb; + int ret; +@@ -8628,6 +8628,9 @@ static void ath11k_wmi_tlv_op_rx(struct + case WMI_PDEV_CSA_SWITCH_COUNT_STATUS_EVENTID: + ath11k_wmi_pdev_csa_switch_count_status_event(ab, skb); + break; ++ case WMI_PDEV_UTF_EVENTID: ++ ath11k_tm_wmi_event(ab, id, skb); ++ break; + case WMI_PDEV_TEMPERATURE_EVENTID: + ath11k_wmi_pdev_temperature_event(ab, skb); + break; +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -1,6 +1,7 @@ + /* SPDX-License-Identifier: BSD-3-Clause-Clear */ + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #ifndef ATH11K_WMI_H +@@ -68,6 +69,7 @@ struct wmi_tlv { + + #define WMI_APPEND_TO_EXISTING_CHAN_LIST_FLAG 1 + ++#define MAX_WMI_UTF_LEN 252 + #define WMI_BA_MODE_BUFFER_SIZE_256 3 + /* + * HW mode config type replicated from FW header +@@ -3564,6 +3566,24 @@ struct wmi_get_pdev_temperature_cmd { + u32 pdev_id; + } __packed; + ++struct wmi_ftm_seg_hdr { ++ u32 len; ++ u32 msgref; ++ u32 segmentinfo; ++ u32 pdev_id; ++} __packed; ++ ++struct wmi_ftm_cmd { ++ u32 tlv_header; ++ struct wmi_ftm_seg_hdr seg_hdr; ++ u8 data[]; ++} __packed; ++ ++struct wmi_ftm_event_msg { ++ struct wmi_ftm_seg_hdr seg_hdr; ++ u8 data[]; ++} __packed; ++ + #define WMI_BEACON_TX_BUFFER_SIZE 512 + + #define WMI_EMA_TMPL_IDX_SHIFT 8 +@@ -6300,6 +6320,8 @@ enum wmi_sta_keepalive_method { + #define WMI_STA_KEEPALIVE_INTERVAL_DEFAULT 30 + #define WMI_STA_KEEPALIVE_INTERVAL_DISABLE 0 + ++const void **ath11k_wmi_tlv_parse_alloc(struct ath11k_base *ab, const void *ptr, ++ size_t len, gfp_t gfp); + int ath11k_wmi_cmd_send(struct ath11k_pdev_wmi *wmi, struct sk_buff *skb, + u32 cmd_id); + struct sk_buff *ath11k_wmi_alloc_skb(struct ath11k_wmi_base *wmi_sc, u32 len); +--- a/drivers/net/wireless/ath/ath11k/wow.c ++++ b/drivers/net/wireless/ath/ath11k/wow.c +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BSD-3-Clause-Clear + /* + * Copyright (c) 2020 The Linux Foundation. All rights reserved. +- * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved. ++ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #include +@@ -838,6 +838,7 @@ exit: + case ATH11K_STATE_RESTARTING: + case ATH11K_STATE_RESTARTED: + case ATH11K_STATE_WEDGED: ++ case ATH11K_STATE_FTM: + ath11k_warn(ar->ab, "encountered unexpected device state %d on resume, cannot recover\n", + ar->state); + ret = -EIO; diff --git a/package/kernel/mac80211/patches/ath11k/0083-wifi-ath11k-Allow-ath11k-to-boot-without-caldata-in-.patch b/package/kernel/mac80211/patches/ath11k/0083-wifi-ath11k-Allow-ath11k-to-boot-without-caldata-in-.patch new file mode 100644 index 0000000000..5a1fa88294 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0083-wifi-ath11k-Allow-ath11k-to-boot-without-caldata-in-.patch @@ -0,0 +1,47 @@ +From 8aeba427296bff6a6051686f1d139c89a0b00e4c Mon Sep 17 00:00:00 2001 +From: Sowmiya Sree Elavalagan +Date: Fri, 26 May 2023 12:41:07 +0300 +Subject: [PATCH 84/84] wifi: ath11k: Allow ath11k to boot without caldata in + ftm mode + +Currently, if ath11k is unable to load the calibration data file it will +always exit. However the calibration data may not be present in factory +test mode, so update the logic to allow the driver to execute in FTM mode +even if downloading the calibration data fails. + +Tested-on : IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sowmiya Sree Elavalagan +Signed-off-by: Raj Kumar Bhagat +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230517135934.16408-5-quic_rajkbhag@quicinc.com +--- + drivers/net/wireless/ath/ath11k/qmi.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/qmi.c ++++ b/drivers/net/wireless/ath/ath11k/qmi.c +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BSD-3-Clause-Clear + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. +- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. ++ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #include +@@ -2460,6 +2460,14 @@ static int ath11k_qmi_load_bdf_qmi(struc + + fw_entry = ath11k_core_firmware_request(ab, ATH11K_DEFAULT_CAL_FILE); + if (IS_ERR(fw_entry)) { ++ /* Caldata may not be present during first time calibration in ++ * factory hence allow to boot without loading caldata in ftm mode ++ */ ++ if (ath11k_ftm_mode) { ++ ath11k_info(ab, ++ "Booting without cal data file in factory test mode\n"); ++ return 0; ++ } + ret = PTR_ERR(fw_entry); + ath11k_warn(ab, + "qmi failed to load CAL data file:%s\n", diff --git a/package/kernel/mac80211/patches/ath11k/0084-wifi-ath11k-Add-HTT-stats-for-PHY-reset-case.patch b/package/kernel/mac80211/patches/ath11k/0084-wifi-ath11k-Add-HTT-stats-for-PHY-reset-case.patch new file mode 100644 index 0000000000..946f5f7b57 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0084-wifi-ath11k-Add-HTT-stats-for-PHY-reset-case.patch @@ -0,0 +1,261 @@ +From 2d4f9093e2d8531ad0a2bb98fe5b36dc8addf2a2 Mon Sep 17 00:00:00 2001 +From: Nidhi Jain +Date: Fri, 26 May 2023 12:41:07 +0300 +Subject: [PATCH] wifi: ath11k: Add HTT stats for PHY reset case + +New HTT stats are added with stats type 37 to +provide PHY reset stats and PHY reset counter stats. + +PHY reset stats are used to display the current +PHY-related operation information such as band, CCA +threshold, current operating channel etc., + +PHY reset counter stats are used to display the +PHY reset counter values like calibration counts, +temperature based recalibration counts etc., + +Usage: +echo 37 > /sys/kernel/debug/ieee80211/phyX/ath11k/htt_stats_type +cat /sys/kernel/debug/ieee80211/phyx/ath11k/htt_stats + +Output: + +HTT_PHY_RESET_STATS_TLV: +pdev_id = 0 +chan_mhz = 5180 +chan_band_center_freq1 = 5210 +chan_band_center_freq2 = 0 +chan_phy_mode = 18 +chan_flags = 0x8 +chan_num = 36 +reset_cause = 0x50000 +prev_reset_cause = 0x50000 +phy_warm_reset_src = 0x0 +rx_gain_tbl_mode = 0 +xbar_val = 0xfac688 +force_calibration = 0 +phyrf_mode = 0 +phy_homechan = 0 +phy_tx_ch_mask = 0x3 +phy_rx_ch_mask = 0x3 +phybb_ini_mask = 0x5 +phyrf_ini_mask = 0x0 +phy_dfs_en_mask = 0x0 +phy_sscan_en_mask = 0x0 +phy_synth_sel_mask = 0x0 +phy_adfs_freq = 0 +cck_fir_settings = 0x0 +phy_dyn_pri_chan = 6 +cca_thresh = 0x26232020 +dyn_cca_status = 0 +rxdesense_thresh_hw = 0xcfe0afe +rxdesense_thresh_sw = 0xcfe0afe + +HTT_PHY_RESET_COUNTERS_TLV: +pdev_id = 0 +cf_active_low_fail_cnt = 0 +cf_active_low_pass_cnt = 0 +phy_off_through_vreg_cnt = 0 +force_calibration_cnt = 0 +rf_mode_switch_phy_off_cnt = 0 + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Nidhi Jain +Signed-off-by: Maharaja Kennadyrajan +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230517141242.2754293-1-quic_mkenna@quicinc.com +--- + .../wireless/ath/ath11k/debugfs_htt_stats.c | 114 ++++++++++++++++++ + .../wireless/ath/ath11k/debugfs_htt_stats.h | 43 +++++++ + 2 files changed, 157 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c ++++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c +@@ -4011,6 +4011,114 @@ void htt_print_phy_stats_tlv(const void + stats_req->buf_len = len; + } + ++static inline void ++htt_print_phy_reset_counters_tlv(const void *tag_buf, ++ u16 tag_len, ++ struct debug_htt_stats_req *stats_req) ++{ ++ const struct htt_phy_reset_counters_tlv *htt_stats_buf = tag_buf; ++ u8 *buf = stats_req->buf; ++ u32 len = stats_req->buf_len; ++ u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; ++ ++ if (tag_len < sizeof(*htt_stats_buf)) ++ return; ++ ++ len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_COUNTERS_TLV:\n"); ++ ++ len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n", ++ htt_stats_buf->pdev_id); ++ len += scnprintf(buf + len, buf_len - len, "cf_active_low_fail_cnt = %u\n", ++ htt_stats_buf->cf_active_low_fail_cnt); ++ len += scnprintf(buf + len, buf_len - len, "cf_active_low_pass_cnt = %u\n", ++ htt_stats_buf->cf_active_low_pass_cnt); ++ len += scnprintf(buf + len, buf_len - len, "phy_off_through_vreg_cnt = %u\n", ++ htt_stats_buf->phy_off_through_vreg_cnt); ++ len += scnprintf(buf + len, buf_len - len, "force_calibration_cnt = %u\n", ++ htt_stats_buf->force_calibration_cnt); ++ len += scnprintf(buf + len, buf_len - len, "rf_mode_switch_phy_off_cnt = %u\n", ++ htt_stats_buf->rf_mode_switch_phy_off_cnt); ++ ++ stats_req->buf_len = len; ++} ++ ++static inline void ++htt_print_phy_reset_stats_tlv(const void *tag_buf, ++ u16 tag_len, ++ struct debug_htt_stats_req *stats_req) ++{ ++ const struct htt_phy_reset_stats_tlv *htt_stats_buf = tag_buf; ++ u8 *buf = stats_req->buf; ++ u32 len = stats_req->buf_len; ++ u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; ++ ++ if (tag_len < sizeof(*htt_stats_buf)) ++ return; ++ ++ len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_STATS_TLV:\n"); ++ ++ len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n", ++ htt_stats_buf->pdev_id); ++ len += scnprintf(buf + len, buf_len - len, "chan_mhz = %u\n", ++ htt_stats_buf->chan_mhz); ++ len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq1 = %u\n", ++ htt_stats_buf->chan_band_center_freq1); ++ len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq2 = %u\n", ++ htt_stats_buf->chan_band_center_freq2); ++ len += scnprintf(buf + len, buf_len - len, "chan_phy_mode = %u\n", ++ htt_stats_buf->chan_phy_mode); ++ len += scnprintf(buf + len, buf_len - len, "chan_flags = 0x%0x\n", ++ htt_stats_buf->chan_flags); ++ len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n", ++ htt_stats_buf->chan_num); ++ len += scnprintf(buf + len, buf_len - len, "reset_cause = 0x%0x\n", ++ htt_stats_buf->reset_cause); ++ len += scnprintf(buf + len, buf_len - len, "prev_reset_cause = 0x%0x\n", ++ htt_stats_buf->prev_reset_cause); ++ len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_src = 0x%0x\n", ++ htt_stats_buf->phy_warm_reset_src); ++ len += scnprintf(buf + len, buf_len - len, "rx_gain_tbl_mode = %d\n", ++ htt_stats_buf->rx_gain_tbl_mode); ++ len += scnprintf(buf + len, buf_len - len, "xbar_val = 0x%0x\n", ++ htt_stats_buf->xbar_val); ++ len += scnprintf(buf + len, buf_len - len, "force_calibration = %u\n", ++ htt_stats_buf->force_calibration); ++ len += scnprintf(buf + len, buf_len - len, "phyrf_mode = %u\n", ++ htt_stats_buf->phyrf_mode); ++ len += scnprintf(buf + len, buf_len - len, "phy_homechan = %u\n", ++ htt_stats_buf->phy_homechan); ++ len += scnprintf(buf + len, buf_len - len, "phy_tx_ch_mask = 0x%0x\n", ++ htt_stats_buf->phy_tx_ch_mask); ++ len += scnprintf(buf + len, buf_len - len, "phy_rx_ch_mask = 0x%0x\n", ++ htt_stats_buf->phy_rx_ch_mask); ++ len += scnprintf(buf + len, buf_len - len, "phybb_ini_mask = 0x%0x\n", ++ htt_stats_buf->phybb_ini_mask); ++ len += scnprintf(buf + len, buf_len - len, "phyrf_ini_mask = 0x%0x\n", ++ htt_stats_buf->phyrf_ini_mask); ++ len += scnprintf(buf + len, buf_len - len, "phy_dfs_en_mask = 0x%0x\n", ++ htt_stats_buf->phy_dfs_en_mask); ++ len += scnprintf(buf + len, buf_len - len, "phy_sscan_en_mask = 0x%0x\n", ++ htt_stats_buf->phy_sscan_en_mask); ++ len += scnprintf(buf + len, buf_len - len, "phy_synth_sel_mask = 0x%0x\n", ++ htt_stats_buf->phy_synth_sel_mask); ++ len += scnprintf(buf + len, buf_len - len, "phy_adfs_freq = %u\n", ++ htt_stats_buf->phy_adfs_freq); ++ len += scnprintf(buf + len, buf_len - len, "cck_fir_settings = 0x%0x\n", ++ htt_stats_buf->cck_fir_settings); ++ len += scnprintf(buf + len, buf_len - len, "phy_dyn_pri_chan = %u\n", ++ htt_stats_buf->phy_dyn_pri_chan); ++ len += scnprintf(buf + len, buf_len - len, "cca_thresh = 0x%0x\n", ++ htt_stats_buf->cca_thresh); ++ len += scnprintf(buf + len, buf_len - len, "dyn_cca_status = %u\n", ++ htt_stats_buf->dyn_cca_status); ++ len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_hw = 0x%x\n", ++ htt_stats_buf->rxdesense_thresh_hw); ++ len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_sw = 0x%x\n", ++ htt_stats_buf->rxdesense_thresh_sw); ++ ++ stats_req->buf_len = len; ++} ++ + static inline + void htt_print_peer_ctrl_path_txrx_stats_tlv(const void *tag_buf, + struct debug_htt_stats_req *stats_req) +@@ -4425,6 +4533,12 @@ static int ath11k_dbg_htt_ext_stats_pars + case HTT_STATS_PHY_STATS_TAG: + htt_print_phy_stats_tlv(tag_buf, stats_req); + break; ++ case HTT_STATS_PHY_RESET_COUNTERS_TAG: ++ htt_print_phy_reset_counters_tlv(tag_buf, len, stats_req); ++ break; ++ case HTT_STATS_PHY_RESET_STATS_TAG: ++ htt_print_phy_reset_stats_tlv(tag_buf, len, stats_req); ++ break; + case HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG: + htt_print_peer_ctrl_path_txrx_stats_tlv(tag_buf, stats_req); + break; +--- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h ++++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h +@@ -111,6 +111,8 @@ enum htt_tlv_tag_t { + HTT_STATS_TXBF_OFDMA_STEER_STATS_TAG = 116, + HTT_STATS_PHY_COUNTERS_TAG = 121, + HTT_STATS_PHY_STATS_TAG = 122, ++ HTT_STATS_PHY_RESET_COUNTERS_TAG = 123, ++ HTT_STATS_PHY_RESET_STATS_TAG = 124, + + HTT_STATS_MAX_TAG, + }; +@@ -1964,6 +1966,47 @@ struct htt_phy_stats_tlv { + u32 fw_run_time; + }; + ++struct htt_phy_reset_counters_tlv { ++ u32 pdev_id; ++ u32 cf_active_low_fail_cnt; ++ u32 cf_active_low_pass_cnt; ++ u32 phy_off_through_vreg_cnt; ++ u32 force_calibration_cnt; ++ u32 rf_mode_switch_phy_off_cnt; ++}; ++ ++struct htt_phy_reset_stats_tlv { ++ u32 pdev_id; ++ u32 chan_mhz; ++ u32 chan_band_center_freq1; ++ u32 chan_band_center_freq2; ++ u32 chan_phy_mode; ++ u32 chan_flags; ++ u32 chan_num; ++ u32 reset_cause; ++ u32 prev_reset_cause; ++ u32 phy_warm_reset_src; ++ u32 rx_gain_tbl_mode; ++ u32 xbar_val; ++ u32 force_calibration; ++ u32 phyrf_mode; ++ u32 phy_homechan; ++ u32 phy_tx_ch_mask; ++ u32 phy_rx_ch_mask; ++ u32 phybb_ini_mask; ++ u32 phyrf_ini_mask; ++ u32 phy_dfs_en_mask; ++ u32 phy_sscan_en_mask; ++ u32 phy_synth_sel_mask; ++ u32 phy_adfs_freq; ++ u32 cck_fir_settings; ++ u32 phy_dyn_pri_chan; ++ u32 cca_thresh; ++ u32 dyn_cca_status; ++ u32 rxdesense_thresh_hw; ++ u32 rxdesense_thresh_sw; ++}; ++ + struct htt_peer_ctrl_path_txrx_stats_tlv { + /* peer mac address */ + u8 peer_mac_addr[ETH_ALEN]; diff --git a/package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch b/package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch new file mode 100644 index 0000000000..9676abb407 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch @@ -0,0 +1,162 @@ +From 534a5f99d589cfa6b244b4433c192b6a278a67ff Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Sat, 5 Nov 2022 20:15:40 +0100 +Subject: [PATCH] wifi: ath11k: use unique QRTR instance ID + +Currently, trying to use AHB + PCI/MHI cards or multiple PCI/MHI cards +will cause a clash in the QRTR instance node ID and prevent the driver +from talking via QMI to the card and thus initializing it with: +[ 9.836329] ath11k c000000.wifi: host capability request failed: 1 90 +[ 9.842047] ath11k c000000.wifi: failed to send qmi host cap: -22 + +So, in order to allow for this combination of cards, especially AHB + PCI +cards like IPQ8074 + QCN9074 (Used by me and tested on) set the desired +QRTR instance ID offset by calculating a unique one based on PCI domain +and bus ID-s and writing it to bits 7-0 of BHI_ERRDBG2 MHI register by +using the SBL state callback that is added as part of the series. +We also have to make sure that new QRTR offset is added on top of the +default QRTR instance ID-s that are currently used in the driver. + +This finally allows using AHB + PCI or multiple PCI cards on the same +system. + +Since this is not supported on QCA6390 and like, its limited to QCN9074 +which is known to support changing QRTR instance ID. + +Before: +root@libreCMC:/# qrtr-lookup + Service Version Instance Node Port + 1054 1 0 7 1 + 69 1 2 7 3 ATH10k WLAN firmware service + +After: +root@libreCMC:/# qrtr-lookup + Service Version Instance Node Port + 1054 1 0 7 1 + 69 1 2 7 3 ATH10k WLAN firmware service + 15 1 0 8 1 Test service + 69 1 8 8 2 ATH10k WLAN firmware service + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1 +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Robert Marko +--- + drivers/net/wireless/ath/ath11k/mhi.c | 49 ++++++++++++++++++--------- + drivers/net/wireless/ath/ath11k/mhi.h | 3 ++ + drivers/net/wireless/ath/ath11k/pci.c | 9 ++++- + 3 files changed, 44 insertions(+), 17 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/mhi.c ++++ b/drivers/net/wireless/ath/ath11k/mhi.c +@@ -294,6 +294,34 @@ static void ath11k_mhi_op_runtime_put(st + { + } + ++static int ath11k_mhi_op_read_reg(struct mhi_controller *mhi_cntrl, ++ void __iomem *addr, ++ u32 *out) ++{ ++ *out = readl(addr); ++ ++ return 0; ++} ++ ++static void ath11k_mhi_op_write_reg(struct mhi_controller *mhi_cntrl, ++ void __iomem *addr, ++ u32 val) ++{ ++ writel(val, addr); ++} ++ ++static void ath11k_mhi_qrtr_instance_set(struct mhi_controller *mhi_cntrl) ++{ ++ struct ath11k_base *ab = dev_get_drvdata(mhi_cntrl->cntrl_dev); ++ ++ if (ab->hw_rev == ATH11K_HW_QCN9074_HW10) { ++ ath11k_mhi_op_write_reg(mhi_cntrl, ++ mhi_cntrl->bhi + BHI_ERRDBG2, ++ FIELD_PREP(QRTR_INSTANCE_MASK, ++ ab->qmi.service_ins_id - ab->hw_params.qmi_service_ins_id)); ++ } ++} ++ + static char *ath11k_mhi_op_callback_to_str(enum mhi_callback reason) + { + switch (reason) { +@@ -315,6 +343,8 @@ static char *ath11k_mhi_op_callback_to_s + return "MHI_CB_FATAL_ERROR"; + case MHI_CB_BW_REQ: + return "MHI_CB_BW_REQ"; ++ case MHI_CB_EE_SBL_MODE: ++ return "MHI_CB_EE_SBL_MODE"; + default: + return "UNKNOWN"; + } +@@ -336,27 +366,14 @@ static void ath11k_mhi_op_status_cb(stru + if (!(test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags))) + queue_work(ab->workqueue_aux, &ab->reset_work); + break; ++ case MHI_CB_EE_SBL_MODE: ++ ath11k_mhi_qrtr_instance_set(mhi_cntrl); ++ break; + default: + break; + } + } + +-static int ath11k_mhi_op_read_reg(struct mhi_controller *mhi_cntrl, +- void __iomem *addr, +- u32 *out) +-{ +- *out = readl(addr); +- +- return 0; +-} +- +-static void ath11k_mhi_op_write_reg(struct mhi_controller *mhi_cntrl, +- void __iomem *addr, +- u32 val) +-{ +- writel(val, addr); +-} +- + static int ath11k_mhi_read_addr_from_dt(struct mhi_controller *mhi_ctrl) + { + struct device_node *np; +--- a/drivers/net/wireless/ath/ath11k/mhi.h ++++ b/drivers/net/wireless/ath/ath11k/mhi.h +@@ -16,6 +16,9 @@ + #define MHICTRL 0x38 + #define MHICTRL_RESET_MASK 0x2 + ++#define BHI_ERRDBG2 0x38 ++#define QRTR_INSTANCE_MASK GENMASK(7, 0) ++ + int ath11k_mhi_start(struct ath11k_pci *ar_pci); + void ath11k_mhi_stop(struct ath11k_pci *ar_pci); + int ath11k_mhi_register(struct ath11k_pci *ar_pci); +--- a/drivers/net/wireless/ath/ath11k/pci.c ++++ b/drivers/net/wireless/ath/ath11k/pci.c +@@ -370,13 +370,20 @@ static void ath11k_pci_sw_reset(struct a + static void ath11k_pci_init_qmi_ce_config(struct ath11k_base *ab) + { + struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg; ++ struct ath11k_pci *ab_pci = ath11k_pci_priv(ab); ++ struct pci_bus *bus = ab_pci->pdev->bus; + + cfg->tgt_ce = ab->hw_params.target_ce_config; + cfg->tgt_ce_len = ab->hw_params.target_ce_count; + + cfg->svc_to_ce_map = ab->hw_params.svc_to_ce_map; + cfg->svc_to_ce_map_len = ab->hw_params.svc_to_ce_map_len; +- ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id; ++ ++ if (ab->hw_rev == ATH11K_HW_QCN9074_HW10) { ++ ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id + ++ (((pci_domain_nr(bus) & 0xF) << 4) | (bus->number & 0xF)); ++ } else ++ ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id; + + ath11k_ce_get_shadow_config(ab, &cfg->shadow_reg_v2, + &cfg->shadow_reg_v2_len); diff --git a/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch b/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch new file mode 100644 index 0000000000..342218a671 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch @@ -0,0 +1,66 @@ +From 703d6551f71e7290619d6effe2a25a64e10538b7 Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Thu, 15 Dec 2022 12:20:52 +0100 +Subject: [PATCH] ath11k: control thermal support via symbol + +Currently, thermal support will get built if CONFIG_THERMAL is reachable, +however this is not suitable for libreCMC as with ALL_KMODS being set to y +ATH11K_THERMAL wont get selected and so hwmon and thermal kmods wont get +pulled in resulting in a build-failure. + +So, to avoid that, lets do what is already done for ath10k and add a +config symbol into backports for enabling thermal support. + +Signed-off-by: Robert Marko +--- + drivers/net/wireless/ath/ath11k/Kconfig | 7 +++++++ + drivers/net/wireless/ath/ath11k/Makefile | 2 +- + drivers/net/wireless/ath/ath11k/thermal.h | 2 +- + local-symbols | 1 + + 4 files changed, 10 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/Kconfig ++++ b/drivers/net/wireless/ath/ath11k/Kconfig +@@ -61,3 +61,10 @@ config ATH11K_SPECTRAL + Enable ath11k spectral scan support + + Say Y to enable access to the FFT/spectral data via debugfs. ++ ++config ATH11K_THERMAL ++ bool "ath11k thermal sensors and throttling support" ++ depends on ATH11K ++ depends on THERMAL ++ help ++ Enable ath11k thermal sensors and throttling support. +--- a/drivers/net/wireless/ath/ath11k/Makefile ++++ b/drivers/net/wireless/ath/ath11k/Makefile +@@ -22,7 +22,7 @@ ath11k-y += core.o \ + ath11k-$(CPTCFG_ATH11K_DEBUGFS) += debugfs.o debugfs_htt_stats.o debugfs_sta.o + ath11k-$(CPTCFG_NL80211_TESTMODE) += testmode.o + ath11k-$(CPTCFG_ATH11K_TRACING) += trace.o +-ath11k-$(CONFIG_THERMAL) += thermal.o ++ath11k-$(CPTCFG_ATH11K_THERMAL) += thermal.o + ath11k-$(CPTCFG_ATH11K_SPECTRAL) += spectral.o + ath11k-$(CONFIG_PM) += wow.o + +--- a/drivers/net/wireless/ath/ath11k/thermal.h ++++ b/drivers/net/wireless/ath/ath11k/thermal.h +@@ -25,7 +25,7 @@ struct ath11k_thermal { + int temperature; + }; + +-#if IS_REACHABLE(CONFIG_THERMAL) ++#if IS_REACHABLE(CPTCFG_ATH11K_THERMAL) + int ath11k_thermal_register(struct ath11k_base *sc); + void ath11k_thermal_unregister(struct ath11k_base *sc); + int ath11k_thermal_set_throttling(struct ath11k *ar, u32 throttle_state); +--- a/local-symbols ++++ b/local-symbols +@@ -174,6 +174,7 @@ ATH11K_DEBUG= + ATH11K_DEBUGFS= + ATH11K_TRACING= + ATH11K_SPECTRAL= ++ATH11K_THERMAL= + WLAN_VENDOR_ATMEL= + ATMEL= + PCI_ATMEL= diff --git a/package/kernel/mac80211/patches/ath11k/901-wifi-ath11k-pci-fix-compilation-in-5.16-and-older.patch b/package/kernel/mac80211/patches/ath11k/901-wifi-ath11k-pci-fix-compilation-in-5.16-and-older.patch new file mode 100644 index 0000000000..7215656389 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/901-wifi-ath11k-pci-fix-compilation-in-5.16-and-older.patch @@ -0,0 +1,29 @@ +From 04178918e7f6b5f34dde81ec79ee8a1ccace3be3 Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Mon, 17 Oct 2022 11:45:03 +0200 +Subject: [PATCH] wifi: ath11k: pci: fix compilation in 5.16 and older + +Commit ("genirq/msi, treewide: Use a named struct for PCI/MSI attributes") +changed the msi_desc structure a bit, however that is only available in +kernels 5.17 and newer, so check for kernel version to allow compilation +in 5.16 and older. + +Signed-off-by: Robert Marko +--- + drivers/net/wireless/ath/ath11k/pci.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/pci.c ++++ b/drivers/net/wireless/ath/ath11k/pci.c +@@ -458,7 +458,11 @@ static int ath11k_pci_alloc_msi(struct a + pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_ADDRESS_LO, + &ab->pci.msi.addr_lo); + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 17, 0)) + if (msi_desc->pci.msi_attrib.is_64) { ++#else ++ if (msi_desc->msi_attrib.is_64) { ++#endif + pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_ADDRESS_HI, + &ab->pci.msi.addr_hi); + } else { diff --git a/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch b/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch new file mode 100644 index 0000000000..5454fa75e4 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch @@ -0,0 +1,24 @@ +From dd3b9c59cfa1e9e0b73a575f4646be905691eaef Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Sat, 16 Oct 2021 19:34:10 +0200 +Subject: [PATCH 241/241] ath11k: Disable coldboot calibration for IPQ8074 + +There is a bug with the remoteproc reset after coldboot calibration, +so until that is resolved disabled it to allow using the radio. + +Signed-off-by: Robert Marko +--- + drivers/net/wireless/ath/ath11k/core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -86,7 +86,7 @@ static const struct ath11k_hw_params ath + .supports_shadow_regs = false, + .idle_ps = false, + .supports_sta_ps = false, +- .cold_boot_calib = true, ++ .cold_boot_calib = false, + .cbcal_restart_fw = true, + .fw_mem_mode = 0, + .num_vdevs = 16 + 1, diff --git a/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch b/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch new file mode 100644 index 0000000000..22c2493ca9 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch @@ -0,0 +1,74 @@ +From fb1c40c225cbc413d82c872dd8c8af3469b2b921 Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Fri, 16 Dec 2022 17:17:52 +0100 +Subject: [PATCH] ath11k: support setting FW memory mode via DT + +ath11k is really memory intensive for devices with less that 1GB of RAM, +so lets allow saving a significant amount of memory by setting the FW to +Mode-1 via DTS for devices that need it. + +However the drawback is reduced number of VDEV-s and peers which is a +reasonable tradeoff. + +Mode-2 allows for further reduction, but it has further restrictions. + +While we are here, lets add a print to be able to easily determine what +FW memory mode is being used. + +Signed-off-by: Robert Marko +--- + drivers/net/wireless/ath/ath11k/core.c | 28 ++++++++++++++++++++++++-- + 1 file changed, 26 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -36,7 +36,7 @@ bool ath11k_ftm_mode; + module_param_named(ftm_mode, ath11k_ftm_mode, bool, 0444); + MODULE_PARM_DESC(ftm_mode, "Boots up in factory test mode"); + +-static const struct ath11k_hw_params ath11k_hw_params[] = { ++static struct ath11k_hw_params ath11k_hw_params[] = { + { + .hw_rev = ATH11K_HW_IPQ8074, + .name = "ipq8074 hw2.0", +@@ -1953,7 +1953,8 @@ static void ath11k_core_reset(struct wor + static int ath11k_init_hw_params(struct ath11k_base *ab) + { + const struct ath11k_hw_params *hw_params = NULL; +- int i; ++ u32 fw_mem_mode; ++ int i, ret; + + for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) { + hw_params = &ath11k_hw_params[i]; +@@ -1969,7 +1970,30 @@ static int ath11k_init_hw_params(struct + + ab->hw_params = *hw_params; + ++ ret = of_property_read_u32(ab->dev->of_node, ++ "qcom,ath11k-fw-memory-mode", ++ &fw_mem_mode); ++ if (!ret) { ++ if (fw_mem_mode == 0) { ++ ab->hw_params.fw_mem_mode = 0; ++ ab->hw_params.num_vdevs = 16 + 1; ++ ab->hw_params.num_peers = 512; ++ } ++ else if (fw_mem_mode == 1) { ++ ab->hw_params.fw_mem_mode = 1; ++ ab->hw_params.num_vdevs = 8; ++ ab->hw_params.num_peers = 128; ++ } else if (fw_mem_mode == 2) { ++ ab->hw_params.fw_mem_mode = 2; ++ ab->hw_params.num_vdevs = 8; ++ ab->hw_params.num_peers = 128; ++ ab->hw_params.cold_boot_calib = false; ++ } else ++ ath11k_info(ab, "Unsupported FW memory mode: %u\n", fw_mem_mode); ++ } ++ + ath11k_info(ab, "%s\n", ab->hw_params.name); ++ ath11k_info(ab, "FW memory mode: %d\n", ab->hw_params.fw_mem_mode); + + return 0; + } diff --git a/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch b/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch new file mode 100644 index 0000000000..b0ceb00ba0 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch @@ -0,0 +1,317 @@ +From abdd0985a36189ef2cc0e393b027276e86137ace Mon Sep 17 00:00:00 2001 +From: Aditya Kumar Singh +Date: Tue, 11 Apr 2023 20:08:49 +0200 +Subject: [PATCH] ath11k: remove intersection support for regulatory rules + +Currently, regulatory rules from new country settings is intersected with +rules from default country settings(during initialisation) in order to prevent +users to bypass their default country settings such as power limits, channel +flags, etc. + +However, the country setting in the BDF will take higher higher precendence +and FW will protect it. Therefore, there is no need to handle intersection +on the driver side now. + +Remove regulatory rules intersection logic support. + +Signed-off-by: Aditya Kumar Singh +--- + drivers/net/wireless/ath/ath11k/reg.c | 168 +++----------------------- + drivers/net/wireless/ath/ath11k/reg.h | 2 +- + drivers/net/wireless/ath/ath11k/wmi.c | 24 +--- + 3 files changed, 16 insertions(+), 178 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/reg.c ++++ b/drivers/net/wireless/ath/ath11k/reg.c +@@ -352,129 +352,6 @@ static u32 ath11k_map_fw_reg_flags(u16 r + return flags; + } + +-static bool +-ath11k_reg_can_intersect(struct ieee80211_reg_rule *rule1, +- struct ieee80211_reg_rule *rule2) +-{ +- u32 start_freq1, end_freq1; +- u32 start_freq2, end_freq2; +- +- start_freq1 = rule1->freq_range.start_freq_khz; +- start_freq2 = rule2->freq_range.start_freq_khz; +- +- end_freq1 = rule1->freq_range.end_freq_khz; +- end_freq2 = rule2->freq_range.end_freq_khz; +- +- if ((start_freq1 >= start_freq2 && +- start_freq1 < end_freq2) || +- (start_freq2 > start_freq1 && +- start_freq2 < end_freq1)) +- return true; +- +- /* TODO: Should we restrict intersection feasibility +- * based on min bandwidth of the intersected region also, +- * say the intersected rule should have a min bandwidth +- * of 20MHz? +- */ +- +- return false; +-} +- +-static void ath11k_reg_intersect_rules(struct ieee80211_reg_rule *rule1, +- struct ieee80211_reg_rule *rule2, +- struct ieee80211_reg_rule *new_rule) +-{ +- u32 start_freq1, end_freq1; +- u32 start_freq2, end_freq2; +- u32 freq_diff, max_bw; +- +- start_freq1 = rule1->freq_range.start_freq_khz; +- start_freq2 = rule2->freq_range.start_freq_khz; +- +- end_freq1 = rule1->freq_range.end_freq_khz; +- end_freq2 = rule2->freq_range.end_freq_khz; +- +- new_rule->freq_range.start_freq_khz = max_t(u32, start_freq1, +- start_freq2); +- new_rule->freq_range.end_freq_khz = min_t(u32, end_freq1, end_freq2); +- +- freq_diff = new_rule->freq_range.end_freq_khz - +- new_rule->freq_range.start_freq_khz; +- max_bw = min_t(u32, rule1->freq_range.max_bandwidth_khz, +- rule2->freq_range.max_bandwidth_khz); +- new_rule->freq_range.max_bandwidth_khz = min_t(u32, max_bw, freq_diff); +- +- new_rule->power_rule.max_antenna_gain = +- min_t(u32, rule1->power_rule.max_antenna_gain, +- rule2->power_rule.max_antenna_gain); +- +- new_rule->power_rule.max_eirp = min_t(u32, rule1->power_rule.max_eirp, +- rule2->power_rule.max_eirp); +- +- /* Use the flags of both the rules */ +- new_rule->flags = rule1->flags | rule2->flags; +- +- /* To be safe, lts use the max cac timeout of both rules */ +- new_rule->dfs_cac_ms = max_t(u32, rule1->dfs_cac_ms, +- rule2->dfs_cac_ms); +-} +- +-static struct ieee80211_regdomain * +-ath11k_regd_intersect(struct ieee80211_regdomain *default_regd, +- struct ieee80211_regdomain *curr_regd) +-{ +- u8 num_old_regd_rules, num_curr_regd_rules, num_new_regd_rules; +- struct ieee80211_reg_rule *old_rule, *curr_rule, *new_rule; +- struct ieee80211_regdomain *new_regd = NULL; +- u8 i, j, k; +- +- num_old_regd_rules = default_regd->n_reg_rules; +- num_curr_regd_rules = curr_regd->n_reg_rules; +- num_new_regd_rules = 0; +- +- /* Find the number of intersecting rules to allocate new regd memory */ +- for (i = 0; i < num_old_regd_rules; i++) { +- old_rule = default_regd->reg_rules + i; +- for (j = 0; j < num_curr_regd_rules; j++) { +- curr_rule = curr_regd->reg_rules + j; +- +- if (ath11k_reg_can_intersect(old_rule, curr_rule)) +- num_new_regd_rules++; +- } +- } +- +- if (!num_new_regd_rules) +- return NULL; +- +- new_regd = kzalloc(sizeof(*new_regd) + (num_new_regd_rules * +- sizeof(struct ieee80211_reg_rule)), +- GFP_ATOMIC); +- +- if (!new_regd) +- return NULL; +- +- /* We set the new country and dfs region directly and only trim +- * the freq, power, antenna gain by intersecting with the +- * default regdomain. Also MAX of the dfs cac timeout is selected. +- */ +- new_regd->n_reg_rules = num_new_regd_rules; +- memcpy(new_regd->alpha2, curr_regd->alpha2, sizeof(new_regd->alpha2)); +- new_regd->dfs_region = curr_regd->dfs_region; +- new_rule = new_regd->reg_rules; +- +- for (i = 0, k = 0; i < num_old_regd_rules; i++) { +- old_rule = default_regd->reg_rules + i; +- for (j = 0; j < num_curr_regd_rules; j++) { +- curr_rule = curr_regd->reg_rules + j; +- +- if (ath11k_reg_can_intersect(old_rule, curr_rule)) +- ath11k_reg_intersect_rules(old_rule, curr_rule, +- (new_rule + k++)); +- } +- } +- return new_regd; +-} +- + static const char * + ath11k_reg_get_regdom_str(enum nl80211_dfs_regions dfs_region) + { +@@ -609,9 +486,9 @@ ath11k_reg_update_weather_radar_band(str + + struct ieee80211_regdomain * + ath11k_reg_build_regd(struct ath11k_base *ab, +- struct cur_regulatory_info *reg_info, bool intersect) ++ struct cur_regulatory_info *reg_info) + { +- struct ieee80211_regdomain *tmp_regd, *default_regd, *new_regd = NULL; ++ struct ieee80211_regdomain *new_regd = NULL; + struct cur_reg_rule *reg_rule; + u8 i = 0, j = 0, k = 0; + u8 num_rules; +@@ -628,26 +505,26 @@ ath11k_reg_build_regd(struct ath11k_base + num_rules += reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP]; + + if (!num_rules) +- goto ret; ++ return new_regd; + + /* Add max additional rules to accommodate weather radar band */ + if (reg_info->dfs_region == ATH11K_DFS_REG_ETSI) + num_rules += 2; + +- tmp_regd = kzalloc(sizeof(*tmp_regd) + ++ new_regd = kzalloc(sizeof(*new_regd) + + (num_rules * sizeof(struct ieee80211_reg_rule)), + GFP_ATOMIC); +- if (!tmp_regd) +- goto ret; ++ if (!new_regd) ++ return new_regd; + +- memcpy(tmp_regd->alpha2, reg_info->alpha2, REG_ALPHA2_LEN + 1); ++ memcpy(new_regd->alpha2, reg_info->alpha2, REG_ALPHA2_LEN + 1); + memcpy(alpha2, reg_info->alpha2, REG_ALPHA2_LEN + 1); + alpha2[2] = '\0'; +- tmp_regd->dfs_region = ath11k_map_fw_dfs_region(reg_info->dfs_region); ++ new_regd->dfs_region = ath11k_map_fw_dfs_region(reg_info->dfs_region); + + ath11k_dbg(ab, ATH11K_DBG_REG, + "Country %s, CFG Regdomain %s FW Regdomain %d, num_reg_rules %d\n", +- alpha2, ath11k_reg_get_regdom_str(tmp_regd->dfs_region), ++ alpha2, ath11k_reg_get_regdom_str(new_regd->dfs_region), + reg_info->dfs_region, num_rules); + /* Update reg_rules[] below. Firmware is expected to + * send these rules in order(2 GHz rules first and then 5 GHz) +@@ -686,7 +563,7 @@ ath11k_reg_build_regd(struct ath11k_base + + flags |= ath11k_map_fw_reg_flags(reg_rule->flags); + +- ath11k_reg_update_rule(tmp_regd->reg_rules + i, ++ ath11k_reg_update_rule(new_regd->reg_rules + i, + reg_rule->start_freq, + reg_rule->end_freq, max_bw, + reg_rule->ant_gain, reg_rule->reg_power, +@@ -701,7 +578,7 @@ ath11k_reg_build_regd(struct ath11k_base + reg_info->dfs_region == ATH11K_DFS_REG_ETSI && + (reg_rule->end_freq > ETSI_WEATHER_RADAR_BAND_LOW && + reg_rule->start_freq < ETSI_WEATHER_RADAR_BAND_HIGH)){ +- ath11k_reg_update_weather_radar_band(ab, tmp_regd, ++ ath11k_reg_update_weather_radar_band(ab, new_regd, + reg_rule, &i, + flags, max_bw); + continue; +@@ -712,37 +589,20 @@ ath11k_reg_build_regd(struct ath11k_base + "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d) (%d, %d)\n", + i + 1, reg_rule->start_freq, reg_rule->end_freq, + max_bw, reg_rule->ant_gain, reg_rule->reg_power, +- tmp_regd->reg_rules[i].dfs_cac_ms, flags, ++ new_regd->reg_rules[i].dfs_cac_ms, flags, + reg_rule->psd_flag, reg_rule->psd_eirp); + } else { + ath11k_dbg(ab, ATH11K_DBG_REG, + "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d)\n", + i + 1, reg_rule->start_freq, reg_rule->end_freq, + max_bw, reg_rule->ant_gain, reg_rule->reg_power, +- tmp_regd->reg_rules[i].dfs_cac_ms, ++ new_regd->reg_rules[i].dfs_cac_ms, + flags); + } + } + +- tmp_regd->n_reg_rules = i; +- +- if (intersect) { +- default_regd = ab->default_regd[reg_info->phy_id]; +- +- /* Get a new regd by intersecting the received regd with +- * our default regd. +- */ +- new_regd = ath11k_regd_intersect(default_regd, tmp_regd); +- kfree(tmp_regd); +- if (!new_regd) { +- ath11k_warn(ab, "Unable to create intersected regdomain\n"); +- goto ret; +- } +- } else { +- new_regd = tmp_regd; +- } ++ new_regd->n_reg_rules = i; + +-ret: + return new_regd; + } + +--- a/drivers/net/wireless/ath/ath11k/reg.h ++++ b/drivers/net/wireless/ath/ath11k/reg.h +@@ -30,7 +30,7 @@ void ath11k_reg_free(struct ath11k_base + void ath11k_regd_update_work(struct work_struct *work); + struct ieee80211_regdomain * + ath11k_reg_build_regd(struct ath11k_base *ab, +- struct cur_regulatory_info *reg_info, bool intersect); ++ struct cur_regulatory_info *reg_info); + int ath11k_regd_update(struct ath11k *ar); + int ath11k_reg_update_chan_list(struct ath11k *ar, bool wait); + #endif +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -6996,24 +6996,12 @@ static void ath11k_wmi_htc_tx_complete(s + wake_up(&wmi->tx_ce_desc_wq); + } + +-static bool ath11k_reg_is_world_alpha(char *alpha) +-{ +- if (alpha[0] == '0' && alpha[1] == '0') +- return true; +- +- if (alpha[0] == 'n' && alpha[1] == 'a') +- return true; +- +- return false; +-} +- + static int ath11k_reg_chan_list_event(struct ath11k_base *ab, + struct sk_buff *skb, + enum wmi_reg_chan_list_cmd_type id) + { + struct cur_regulatory_info *reg_info = NULL; + struct ieee80211_regdomain *regd = NULL; +- bool intersect = false; + int ret = 0, pdev_idx, i, j; + struct ath11k *ar; + +@@ -7075,17 +7063,7 @@ static int ath11k_reg_chan_list_event(st + (char *)reg_info->alpha2, 2)) + goto mem_free; + +- /* Intersect new rules with default regd if a new country setting was +- * requested, i.e a default regd was already set during initialization +- * and the regd coming from this event has a valid country info. +- */ +- if (ab->default_regd[pdev_idx] && +- !ath11k_reg_is_world_alpha((char *) +- ab->default_regd[pdev_idx]->alpha2) && +- !ath11k_reg_is_world_alpha((char *)reg_info->alpha2)) +- intersect = true; +- +- regd = ath11k_reg_build_regd(ab, reg_info, intersect); ++ regd = ath11k_reg_build_regd(ab, reg_info); + if (!regd) { + ath11k_warn(ab, "failed to build regd from reg_info\n"); + goto fallback; diff --git a/package/kernel/mac80211/patches/ath5k/201-ath5k-WAR-for-AR71xx-PCI-bug.patch b/package/kernel/mac80211/patches/ath5k/201-ath5k-WAR-for-AR71xx-PCI-bug.patch index 21516ffde9..4fc97dfaec 100644 --- a/package/kernel/mac80211/patches/ath5k/201-ath5k-WAR-for-AR71xx-PCI-bug.patch +++ b/package/kernel/mac80211/patches/ath5k/201-ath5k-WAR-for-AR71xx-PCI-bug.patch @@ -17,7 +17,7 @@ { AR5K_RXNOFRM, 8 }, --- a/drivers/net/wireless/ath/ath5k/dma.c +++ b/drivers/net/wireless/ath/ath5k/dma.c -@@ -869,10 +869,18 @@ ath5k_hw_dma_init(struct ath5k_hw *ah) +@@ -854,10 +854,18 @@ ath5k_hw_dma_init(struct ath5k_hw *ah) * guess we can tweak it and see how it goes ;-) */ if (ah->ah_version != AR5K_AR5210) { diff --git a/package/kernel/mac80211/patches/ath5k/411-ath5k_allow_adhoc_and_ap.patch b/package/kernel/mac80211/patches/ath5k/411-ath5k_allow_adhoc_and_ap.patch index 35ed6ea555..1df4aab57e 100644 --- a/package/kernel/mac80211/patches/ath5k/411-ath5k_allow_adhoc_and_ap.patch +++ b/package/kernel/mac80211/patches/ath5k/411-ath5k_allow_adhoc_and_ap.patch @@ -18,7 +18,7 @@ goto end; --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c -@@ -1963,7 +1963,7 @@ ath5k_beacon_send(struct ath5k_hw *ah) +@@ -2009,7 +2009,7 @@ ath5k_beacon_send(struct ath5k_hw *ah) } if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs + @@ -27,7 +27,7 @@ ah->opmode == NL80211_IFTYPE_MESH_POINT) { u64 tsf = ath5k_hw_get_tsf64(ah); u32 tsftu = TSF_TO_TU(tsf); -@@ -2049,7 +2049,7 @@ ath5k_beacon_update_timers(struct ath5k_ +@@ -2095,7 +2095,7 @@ ath5k_beacon_update_timers(struct ath5k_ intval = ah->bintval & AR5K_BEACON_PERIOD; if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs @@ -36,7 +36,7 @@ intval /= ATH_BCBUF; /* staggered multi-bss beacons */ if (intval < 15) ATH5K_WARN(ah, "intval %u is too low, min 15\n", -@@ -2515,6 +2515,7 @@ static const struct ieee80211_iface_limi +@@ -2561,6 +2561,7 @@ static const struct ieee80211_iface_limi BIT(NL80211_IFTYPE_MESH_POINT) | #endif BIT(NL80211_IFTYPE_AP) }, diff --git a/package/kernel/mac80211/patches/ath9k/040-ath9k-support-DT-ieee80211-freq-limit-property-to-li.patch b/package/kernel/mac80211/patches/ath9k/040-ath9k-support-DT-ieee80211-freq-limit-property-to-li.patch deleted file mode 100644 index 7d44681760..0000000000 --- a/package/kernel/mac80211/patches/ath9k/040-ath9k-support-DT-ieee80211-freq-limit-property-to-li.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 03469e79fee9e8e908dae3bd1a80bcd9a66f2a88 Mon Sep 17 00:00:00 2001 -From: Christian Lamparter -Date: Mon, 11 Oct 2021 18:18:00 +0300 -Subject: ath9k: support DT ieee80211-freq-limit property to limit channels - -The common DT property can be used to limit the available channels -but ath9k has to manually call wiphy_read_of_freq_limits(). - -I would have put this into ath9k_of_init(). But it didn't work there. -The reason is that in ath9k_of_init() the channels and bands are not yet -registered in the wiphy struct. So there isn't any channel to flag as -disabled. - -Signed-off-by: Christian Lamparter -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20211009212847.1781986-1-chunkeey@gmail.com ---- ---- a/drivers/net/wireless/ath/ath9k/init.c -+++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -1038,6 +1038,8 @@ int ath9k_init_device(u16 devid, struct - ARRAY_SIZE(ath9k_tpt_blink)); - #endif - -+ wiphy_read_of_freq_limits(hw->wiphy); -+ - /* Register with mac80211 */ - error = ieee80211_register_hw(hw); - if (error) diff --git a/package/kernel/mac80211/patches/ath9k/401-ath9k_blink_default.patch b/package/kernel/mac80211/patches/ath9k/401-ath9k_blink_default.patch index 7405e594fe..3eb57bb1cf 100644 --- a/package/kernel/mac80211/patches/ath9k/401-ath9k_blink_default.patch +++ b/package/kernel/mac80211/patches/ath9k/401-ath9k_blink_default.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -47,7 +47,7 @@ int ath9k_modparam_nohwcrypt; +@@ -48,7 +48,7 @@ int ath9k_modparam_nohwcrypt; module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444); MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption"); diff --git a/package/kernel/mac80211/patches/ath9k/410-ath9k_allow_adhoc_and_ap.patch b/package/kernel/mac80211/patches/ath9k/410-ath9k_allow_adhoc_and_ap.patch index b355e8372f..b2f2763e8e 100644 --- a/package/kernel/mac80211/patches/ath9k/410-ath9k_allow_adhoc_and_ap.patch +++ b/package/kernel/mac80211/patches/ath9k/410-ath9k_allow_adhoc_and_ap.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -826,6 +826,7 @@ static const struct ieee80211_iface_limi +@@ -882,6 +882,7 @@ static const struct ieee80211_iface_limi BIT(NL80211_IFTYPE_AP) }, { .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO) }, diff --git a/package/kernel/mac80211/patches/ath9k/450-ath9k-enabled-MFP-capability-unconditionally.patch b/package/kernel/mac80211/patches/ath9k/450-ath9k-enabled-MFP-capability-unconditionally.patch index 284c88ff49..f424ca530b 100644 --- a/package/kernel/mac80211/patches/ath9k/450-ath9k-enabled-MFP-capability-unconditionally.patch +++ b/package/kernel/mac80211/patches/ath9k/450-ath9k-enabled-MFP-capability-unconditionally.patch @@ -14,7 +14,7 @@ Signed-off-by: David Bauer --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -907,6 +907,7 @@ static void ath9k_set_hw_capab(struct at +@@ -963,6 +963,7 @@ static void ath9k_set_hw_capab(struct at ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING); ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS); @@ -22,7 +22,7 @@ Signed-off-by: David Bauer if (ath9k_ps_enable) ieee80211_hw_set(hw, SUPPORTS_PS); -@@ -919,9 +920,6 @@ static void ath9k_set_hw_capab(struct at +@@ -975,9 +976,6 @@ static void ath9k_set_hw_capab(struct at IEEE80211_RADIOTAP_MCS_HAVE_STBC; } diff --git a/package/kernel/mac80211/patches/ath9k/500-ath9k_eeprom_debugfs.patch b/package/kernel/mac80211/patches/ath9k/500-ath9k_eeprom_debugfs.patch index 48ccc81308..2f5e75be8a 100644 --- a/package/kernel/mac80211/patches/ath9k/500-ath9k_eeprom_debugfs.patch +++ b/package/kernel/mac80211/patches/ath9k/500-ath9k_eeprom_debugfs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1364,6 +1364,53 @@ void ath9k_deinit_debug(struct ath_softc +@@ -1413,6 +1413,54 @@ void ath9k_deinit_debug(struct ath_softc ath9k_cmn_spectral_deinit_debug(&sc->spec_priv); } @@ -39,7 +39,8 @@ + } else { + bytes = 2; + } -+ copy_to_user(user_buf, from, bytes); ++ if (copy_to_user(user_buf, from, bytes)) ++ return -EFAULT; + user_buf += bytes; + } + return *ppos - pos; @@ -54,7 +55,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1383,6 +1430,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1432,6 +1480,8 @@ int ath9k_init_debug(struct ath_hw *ah) ath9k_tx99_init_debug(sc); ath9k_cmn_spectral_init_debug(&sc->spec_priv, sc->debug.debugfs_phy); diff --git a/package/kernel/mac80211/patches/ath9k/501-ath9k_ahb_init.patch b/package/kernel/mac80211/patches/ath9k/501-ath9k_ahb_init.patch index 6ab7972b55..740ddc39dc 100644 --- a/package/kernel/mac80211/patches/ath9k/501-ath9k_ahb_init.patch +++ b/package/kernel/mac80211/patches/ath9k/501-ath9k_ahb_init.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -1122,25 +1122,25 @@ static int __init ath9k_init(void) +@@ -1178,25 +1178,25 @@ static int __init ath9k_init(void) { int error; diff --git a/package/kernel/mac80211/patches/ath9k/512-ath9k_channelbw_debugfs.patch b/package/kernel/mac80211/patches/ath9k/512-ath9k_channelbw_debugfs.patch index 126d1d5c62..a871e458a4 100644 --- a/package/kernel/mac80211/patches/ath9k/512-ath9k_channelbw_debugfs.patch +++ b/package/kernel/mac80211/patches/ath9k/512-ath9k_channelbw_debugfs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1411,6 +1411,52 @@ static const struct file_operations fops +@@ -1461,6 +1461,52 @@ static const struct file_operations fops .owner = THIS_MODULE }; @@ -53,7 +53,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1432,6 +1478,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1482,6 +1528,8 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, &fops_eeprom); diff --git a/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch index c161237827..74506657e0 100644 --- a/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch +++ b/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch @@ -181,7 +181,7 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -1032,7 +1032,7 @@ int ath9k_init_device(u16 devid, struct +@@ -1088,7 +1088,7 @@ int ath9k_init_device(u16 devid, struct #ifdef CPTCFG_MAC80211_LEDS /* must be initialized before ieee80211_register_hw */ @@ -192,7 +192,7 @@ #endif --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1456,6 +1456,61 @@ static const struct file_operations fops +@@ -1506,6 +1506,61 @@ static const struct file_operations fops .llseek = default_llseek, }; @@ -254,7 +254,7 @@ int ath9k_init_debug(struct ath_hw *ah) { -@@ -1480,6 +1535,10 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1530,6 +1585,10 @@ int ath9k_init_debug(struct ath_hw *ah) &fops_eeprom); debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_chanbw); diff --git a/package/kernel/mac80211/patches/ath9k/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/ath9k/542-ath9k_debugfs_diag.patch index 5b64f560fd..e09bbc08ea 100644 --- a/package/kernel/mac80211/patches/ath9k/542-ath9k_debugfs_diag.patch +++ b/package/kernel/mac80211/patches/ath9k/542-ath9k_debugfs_diag.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1512,6 +1512,50 @@ static const struct file_operations fops +@@ -1562,6 +1562,50 @@ static const struct file_operations fops #endif @@ -51,7 +51,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1539,6 +1583,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1589,6 +1633,8 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_file("gpio_led", S_IWUSR, sc->debug.debugfs_phy, sc, &fops_gpio_led); #endif @@ -84,7 +84,7 @@ bool reset_power_on; bool htc_reset_init; -@@ -1077,6 +1085,7 @@ void ath9k_hw_check_nav(struct ath_hw *a +@@ -1079,6 +1087,7 @@ void ath9k_hw_check_nav(struct ath_hw *a bool ath9k_hw_check_alive(struct ath_hw *ah); bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode); diff --git a/package/kernel/mac80211/patches/ath9k/543-ath9k_entropy_from_adc.patch b/package/kernel/mac80211/patches/ath9k/543-ath9k_entropy_from_adc.patch index ef4e659870..6acc864d1e 100644 --- a/package/kernel/mac80211/patches/ath9k/543-ath9k_entropy_from_adc.patch +++ b/package/kernel/mac80211/patches/ath9k/543-ath9k_entropy_from_adc.patch @@ -18,7 +18,7 @@ void (*spectral_scan_trigger)(struct ath_hw *ah); --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c -@@ -1927,6 +1927,26 @@ void ar9003_hw_init_rate_txpower(struct +@@ -1918,6 +1918,26 @@ void ar9003_hw_init_rate_txpower(struct } } @@ -45,7 +45,7 @@ void ar9003_hw_attach_phy_ops(struct ath_hw *ah) { struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); -@@ -1963,6 +1983,7 @@ void ar9003_hw_attach_phy_ops(struct ath +@@ -1954,6 +1974,7 @@ void ar9003_hw_attach_phy_ops(struct ath priv_ops->set_radar_params = ar9003_hw_set_radar_params; priv_ops->fast_chan_change = ar9003_hw_fast_chan_change; @@ -55,7 +55,7 @@ ops->spectral_scan_config = ar9003_hw_spectral_scan_config; --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -814,7 +814,8 @@ static void ath9k_init_txpower_limits(st +@@ -870,7 +870,8 @@ static void ath9k_init_txpower_limits(st if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ); @@ -65,7 +65,7 @@ } static const struct ieee80211_iface_limit if_limits[] = { -@@ -992,6 +993,18 @@ static void ath9k_set_hw_capab(struct at +@@ -1048,6 +1049,18 @@ static void ath9k_set_hw_capab(struct at wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0); } @@ -84,7 +84,7 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, const struct ath_bus_ops *bus_ops) { -@@ -1039,6 +1052,8 @@ int ath9k_init_device(u16 devid, struct +@@ -1095,6 +1108,8 @@ int ath9k_init_device(u16 devid, struct wiphy_read_of_freq_limits(hw->wiphy); diff --git a/package/kernel/mac80211/patches/ath9k/545-ath9k_ani_ws_detect.patch b/package/kernel/mac80211/patches/ath9k/545-ath9k_ani_ws_detect.patch index 854bb3659a..d3bf07ff92 100644 --- a/package/kernel/mac80211/patches/ath9k/545-ath9k_ani_ws_detect.patch +++ b/package/kernel/mac80211/patches/ath9k/545-ath9k_ani_ws_detect.patch @@ -79,7 +79,7 @@ static const u8 ofdm2pwr[] = { ALL_TARGET_LEGACY_6_24, ALL_TARGET_LEGACY_6_24, -@@ -1077,11 +1063,6 @@ static bool ar9003_hw_ani_control(struct +@@ -1068,11 +1054,6 @@ static bool ar9003_hw_ani_control(struct struct ath_common *common = ath9k_hw_common(ah); struct ath9k_channel *chan = ah->curchan; struct ar5416AniState *aniState = &ah->ani; @@ -91,7 +91,7 @@ s32 value, value2; switch (cmd & ah->ani_function) { -@@ -1095,61 +1076,6 @@ static bool ar9003_hw_ani_control(struct +@@ -1086,61 +1067,6 @@ static bool ar9003_hw_ani_control(struct */ u32 on = param ? 1 : 0; diff --git a/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch b/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch index 6b5c0dc514..efc4b9187c 100644 --- a/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch +++ b/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch @@ -371,7 +371,7 @@ --- a/local-symbols +++ b/local-symbols -@@ -133,6 +133,7 @@ ATH9K_WOW= +@@ -129,6 +129,7 @@ ATH9K_WOW= ATH9K_RFKILL= ATH9K_CHANNEL_CONTEXT= ATH9K_PCOEM= diff --git a/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch index 7ce8bc5b82..57eef54e89 100644 --- a/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch +++ b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch @@ -271,7 +271,7 @@ if (!dev_get_platdata(&pdev->dev)) { dev_err(&pdev->dev, "no platform data specified\n"); -@@ -122,13 +371,16 @@ static int ath_ahb_probe(struct platform +@@ -118,13 +367,16 @@ static int ath_ahb_probe(struct platform sc->mem = mem; sc->irq = irq; @@ -289,7 +289,7 @@ if (ret) { dev_err(&pdev->dev, "failed to initialize device\n"); goto err_irq; -@@ -159,6 +411,9 @@ static int ath_ahb_remove(struct platfor +@@ -155,6 +407,9 @@ static int ath_ahb_remove(struct platfor free_irq(sc->irq, sc); ieee80211_free_hw(sc->hw); } @@ -299,7 +299,7 @@ return 0; } -@@ -168,6 +423,9 @@ static struct platform_driver ath_ahb_dr +@@ -164,6 +419,9 @@ static struct platform_driver ath_ahb_dr .remove = ath_ahb_remove, .driver = { .name = "ath9k", diff --git a/package/kernel/mac80211/patches/ath9k/553-ath9k_of_gpio_mask.patch b/package/kernel/mac80211/patches/ath9k/553-ath9k_of_gpio_mask.patch index 80e0dc4c5e..6d1820ecb7 100644 --- a/package/kernel/mac80211/patches/ath9k/553-ath9k_of_gpio_mask.patch +++ b/package/kernel/mac80211/patches/ath9k/553-ath9k_of_gpio_mask.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -644,6 +644,12 @@ static int ath9k_of_init(struct ath_soft +@@ -696,6 +696,12 @@ static int ath9k_of_init(struct ath_soft return 0; } @@ -13,7 +13,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, const struct ath_bus_ops *bus_ops) { -@@ -747,6 +753,9 @@ static int ath9k_init_softc(u16 devid, s +@@ -803,6 +809,9 @@ static int ath9k_init_softc(u16 devid, s if (ret) goto err_hw; diff --git a/package/kernel/mac80211/patches/ath9k/600-v5.16-ath9k-fetch-calibration-data-via-nvmem-subsystem.patch b/package/kernel/mac80211/patches/ath9k/600-v5.16-ath9k-fetch-calibration-data-via-nvmem-subsystem.patch deleted file mode 100644 index a250d2318e..0000000000 --- a/package/kernel/mac80211/patches/ath9k/600-v5.16-ath9k-fetch-calibration-data-via-nvmem-subsystem.patch +++ /dev/null @@ -1,154 +0,0 @@ -From dab16ef495dbb3cabb355b6c80f0771a4a25e35d Mon Sep 17 00:00:00 2001 -From: Christian Lamparter -Date: Fri, 20 Aug 2021 22:44:52 +0200 -Subject: [PATCH] ath9k: fetch calibration data via nvmem subsystem - -On most embedded ath9k devices (like range extenders, -routers, accesspoints, ...) the calibration data is -stored in a MTD partitions named "ART", or "caldata"/ -"calibration". - -Ever since commit -4b361cfa8624 ("mtd: core: add OTP nvmem provider support") -all MTD partitions are all automatically available through -the nvmem subsystem. This allows drivers like ath9k to read -the necessary data without needing any userspace helpers -that would do this extraction. - -Signed-off-by: Christian Lamparter ---- - -includes: - -From 57671351379b2051cfb07fc14e0bead9916a0880 Mon Sep 17 00:00:00 2001 -From: Dan Carpenter -Date: Mon, 11 Oct 2021 18:18:01 +0300 -Subject: ath9k: fix an IS_ERR() vs NULL check - -The devm_kmemdup() function doesn't return error pointers, it returns -NULL on error. - -Fixes: eb3a97a69be8 ("ath9k: fetch calibration data via nvmem subsystem") -Signed-off-by: Dan Carpenter -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20211011123533.GA15188@kili - ---- - ---- a/drivers/net/wireless/ath/ath9k/eeprom.c -+++ b/drivers/net/wireless/ath/ath9k/eeprom.c -@@ -135,13 +135,23 @@ static bool ath9k_hw_nvram_read_firmware - offset, data); - } - -+static bool ath9k_hw_nvram_read_nvmem(struct ath_hw *ah, off_t offset, -+ u16 *data) -+{ -+ return ath9k_hw_nvram_read_array(ah->nvmem_blob, -+ ah->nvmem_blob_len / sizeof(u16), -+ offset, data); -+} -+ - bool ath9k_hw_nvram_read(struct ath_hw *ah, u32 off, u16 *data) - { - struct ath_common *common = ath9k_hw_common(ah); - struct ath9k_platform_data *pdata = ah->dev->platform_data; - bool ret; - -- if (ah->eeprom_blob) -+ if (ah->nvmem_blob) -+ ret = ath9k_hw_nvram_read_nvmem(ah, off, data); -+ else if (ah->eeprom_blob) - ret = ath9k_hw_nvram_read_firmware(ah->eeprom_blob, off, data); - else if (pdata && !pdata->use_eeprom) - ret = ath9k_hw_nvram_read_pdata(pdata, off, data); ---- a/drivers/net/wireless/ath/ath9k/hw.h -+++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -988,6 +988,8 @@ struct ath_hw { - bool disable_5ghz; - - const struct firmware *eeprom_blob; -+ u16 *nvmem_blob; /* devres managed */ -+ size_t nvmem_blob_len; - - struct ath_dynack dynack; - ---- a/drivers/net/wireless/ath/ath9k/init.c -+++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -568,6 +569,57 @@ static void ath9k_eeprom_release(struct - release_firmware(sc->sc_ah->eeprom_blob); - } - -+static int ath9k_nvmem_request_eeprom(struct ath_softc *sc) -+{ -+ struct ath_hw *ah = sc->sc_ah; -+ struct nvmem_cell *cell; -+ void *buf; -+ size_t len; -+ int err; -+ -+ cell = devm_nvmem_cell_get(sc->dev, "calibration"); -+ if (IS_ERR(cell)) { -+ err = PTR_ERR(cell); -+ -+ /* nvmem cell might not be defined, or the nvmem -+ * subsystem isn't included. In this case, follow -+ * the established "just return 0;" convention of -+ * ath9k_init_platform to say: -+ * "All good. Nothing to see here. Please go on." -+ */ -+ if (err == -ENOENT || err == -EOPNOTSUPP) -+ return 0; -+ -+ return err; -+ } -+ -+ buf = nvmem_cell_read(cell, &len); -+ if (IS_ERR(buf)) -+ return PTR_ERR(buf); -+ -+ /* run basic sanity checks on the returned nvram cell length. -+ * That length has to be a multiple of a "u16" (i.e.: & 1). -+ * Furthermore, it has to be more than "let's say" 512 bytes -+ * but less than the maximum of AR9300_EEPROM_SIZE (16kb). -+ */ -+ if (((len & 1) == 1) || (len < 512) || (len >= AR9300_EEPROM_SIZE)) { -+ kfree(buf); -+ return -EINVAL; -+ } -+ -+ /* devres manages the calibration values release on shutdown */ -+ ah->nvmem_blob = (u16 *)devm_kmemdup(sc->dev, buf, len, GFP_KERNEL); -+ kfree(buf); -+ if (!ah->nvmem_blob) -+ return -ENOMEM; -+ -+ ah->nvmem_blob_len = len; -+ ah->ah_flags &= ~AH_USE_EEPROM; -+ ah->ah_flags |= AH_NO_EEP_SWAP; -+ -+ return 0; -+} -+ - static int ath9k_init_platform(struct ath_softc *sc) - { - struct ath9k_platform_data *pdata = sc->dev->platform_data; -@@ -710,6 +762,10 @@ static int ath9k_init_softc(u16 devid, s - if (ret) - return ret; - -+ ret = ath9k_nvmem_request_eeprom(sc); -+ if (ret) -+ return ret; -+ - if (ath9k_led_active_high != -1) - ah->config.led_active_high = ath9k_led_active_high == 1; - diff --git a/package/kernel/mac80211/patches/ath9k/601-v5.16-ath9k-owl-loader-fetch-pci-init-values-through-nvmem.patch b/package/kernel/mac80211/patches/ath9k/601-v5.16-ath9k-owl-loader-fetch-pci-init-values-through-nvmem.patch deleted file mode 100644 index 62c561d619..0000000000 --- a/package/kernel/mac80211/patches/ath9k/601-v5.16-ath9k-owl-loader-fetch-pci-init-values-through-nvmem.patch +++ /dev/null @@ -1,181 +0,0 @@ -From 9bf31835f11aa3c4fe5a9c1f7462c199c5d8e7ca Mon Sep 17 00:00:00 2001 -From: Christian Lamparter -Date: Sat, 21 Aug 2021 00:22:39 +0200 -Subject: [PATCH] ath9k: owl-loader: fetch pci init values through nvmem - -extends the owl loader to fetch important pci initialization -values - which are stored together with the calibration data - -through the nvmem subsystem. - -This allows for much faster WIFI/ath9k initializations on devices -that do not require to perform any post-processing (like XOR'ing/ -reversal or unpacking) since no userspace helper is required. - -Signed-off-by: Christian Lamparter ---- - .../wireless/ath/ath9k/ath9k_pci_owl_loader.c | 105 +++++++++++++----- - 1 file changed, 76 insertions(+), 29 deletions(-) - ---- a/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c -+++ b/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c -@@ -19,9 +19,14 @@ - #include - #include - #include -+#include -+#include - - struct owl_ctx { -+ struct pci_dev *pdev; - struct completion eeprom_load; -+ struct work_struct work; -+ struct nvmem_cell *cell; - }; - - #define EEPROM_FILENAME_LEN 100 -@@ -42,6 +47,12 @@ static int ath9k_pci_fixup(struct pci_de - u32 bar0; - bool swap_needed = false; - -+ /* also note that we are doing *u16 operations on the file */ -+ if (cal_len > 4096 || cal_len < 0x200 || (cal_len & 1) == 1) { -+ dev_err(&pdev->dev, "eeprom has an invalid size.\n"); -+ return -EINVAL; -+ } -+ - if (*cal_data != AR5416_EEPROM_MAGIC) { - if (*cal_data != swab16(AR5416_EEPROM_MAGIC)) { - dev_err(&pdev->dev, "invalid calibration data\n"); -@@ -99,38 +110,31 @@ static int ath9k_pci_fixup(struct pci_de - return 0; - } - --static void owl_fw_cb(const struct firmware *fw, void *context) -+static void owl_rescan(struct pci_dev *pdev) - { -- struct pci_dev *pdev = (struct pci_dev *)context; -- struct owl_ctx *ctx = (struct owl_ctx *)pci_get_drvdata(pdev); -- struct pci_bus *bus; -- -- complete(&ctx->eeprom_load); -- -- if (!fw) { -- dev_err(&pdev->dev, "no eeprom data received.\n"); -- goto release; -- } -- -- /* also note that we are doing *u16 operations on the file */ -- if (fw->size > 4096 || fw->size < 0x200 || (fw->size & 1) == 1) { -- dev_err(&pdev->dev, "eeprom file has an invalid size.\n"); -- goto release; -- } -- -- if (ath9k_pci_fixup(pdev, (const u16 *)fw->data, fw->size)) -- goto release; -+ struct pci_bus *bus = pdev->bus; - - pci_lock_rescan_remove(); -- bus = pdev->bus; - pci_stop_and_remove_bus_device(pdev); - /* the device should come back with the proper - * ProductId. But we have to initiate a rescan. - */ - pci_rescan_bus(bus); - pci_unlock_rescan_remove(); -+} -+ -+static void owl_fw_cb(const struct firmware *fw, void *context) -+{ -+ struct owl_ctx *ctx = (struct owl_ctx *)context; -+ -+ complete(&ctx->eeprom_load); - --release: -+ if (fw) { -+ ath9k_pci_fixup(ctx->pdev, (const u16 *)fw->data, fw->size); -+ owl_rescan(ctx->pdev); -+ } else { -+ dev_err(&ctx->pdev->dev, "no eeprom data received.\n"); -+ } - release_firmware(fw); - } - -@@ -152,6 +156,43 @@ static const char *owl_get_eeprom_name(s - return eeprom_name; - } - -+static void owl_nvmem_work(struct work_struct *work) -+{ -+ struct owl_ctx *ctx = container_of(work, struct owl_ctx, work); -+ void *buf; -+ size_t len; -+ -+ complete(&ctx->eeprom_load); -+ -+ buf = nvmem_cell_read(ctx->cell, &len); -+ if (!IS_ERR(buf)) { -+ ath9k_pci_fixup(ctx->pdev, buf, len); -+ kfree(buf); -+ owl_rescan(ctx->pdev); -+ } else { -+ dev_err(&ctx->pdev->dev, "no nvmem data received.\n"); -+ } -+} -+ -+static int owl_nvmem_probe(struct owl_ctx *ctx) -+{ -+ int err; -+ -+ ctx->cell = devm_nvmem_cell_get(&ctx->pdev->dev, "calibration"); -+ if (IS_ERR(ctx->cell)) { -+ err = PTR_ERR(ctx->cell); -+ if (err == -ENOENT || err == -EOPNOTSUPP) -+ return 1; /* not present, try firmware_request */ -+ -+ return err; -+ } -+ -+ INIT_WORK(&ctx->work, owl_nvmem_work); -+ schedule_work(&ctx->work); -+ -+ return 0; -+} -+ - static int owl_probe(struct pci_dev *pdev, - const struct pci_device_id *id) - { -@@ -164,21 +205,27 @@ static int owl_probe(struct pci_dev *pde - - pcim_pin_device(pdev); - -- eeprom_name = owl_get_eeprom_name(pdev); -- if (!eeprom_name) { -- dev_err(&pdev->dev, "no eeprom filename found.\n"); -- return -ENODEV; -- } -- - ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return -ENOMEM; - - init_completion(&ctx->eeprom_load); -+ ctx->pdev = pdev; - - pci_set_drvdata(pdev, ctx); -+ -+ err = owl_nvmem_probe(ctx); -+ if (err <= 0) -+ return err; -+ -+ eeprom_name = owl_get_eeprom_name(pdev); -+ if (!eeprom_name) { -+ dev_err(&pdev->dev, "no eeprom filename found.\n"); -+ return -ENODEV; -+ } -+ - err = request_firmware_nowait(THIS_MODULE, true, eeprom_name, -- &pdev->dev, GFP_KERNEL, pdev, owl_fw_cb); -+ &pdev->dev, GFP_KERNEL, ctx, owl_fw_cb); - if (err) - dev_err(&pdev->dev, "failed to request caldata (%d).\n", err); - diff --git a/package/kernel/mac80211/patches/build/015-ipw200-mtu.patch b/package/kernel/mac80211/patches/build/015-ipw200-mtu.patch deleted file mode 100644 index 68db4f72d3..0000000000 --- a/package/kernel/mac80211/patches/build/015-ipw200-mtu.patch +++ /dev/null @@ -1,34 +0,0 @@ ---- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c -+++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c -@@ -11470,6 +11470,15 @@ static const struct attribute_group ipw_ - .attrs = ipw_sysfs_entries, - }; - -+#if LINUX_VERSION_IS_LESS(4,10,0) -+static int __change_mtu(struct net_device *ndev, int new_mtu){ -+ if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN) -+ return -EINVAL; -+ ndev->mtu = new_mtu; -+ return 0; -+} -+#endif -+ - #ifdef CPTCFG_IPW2200_PROMISCUOUS - static int ipw_prom_open(struct net_device *dev) - { -@@ -11518,15 +11527,6 @@ static netdev_tx_t ipw_prom_hard_start_x - return NETDEV_TX_OK; - } - --#if LINUX_VERSION_IS_LESS(4,10,0) --static int __change_mtu(struct net_device *ndev, int new_mtu){ -- if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN) -- return -EINVAL; -- ndev->mtu = new_mtu; -- return 0; --} --#endif -- - static const struct net_device_ops ipw_prom_netdev_ops = { - #if LINUX_VERSION_IS_LESS(4,10,0) - .ndo_change_mtu = __change_mtu, diff --git a/package/kernel/mac80211/patches/build/060-no_local_ssb_bcma.patch b/package/kernel/mac80211/patches/build/060-no_local_ssb_bcma.patch index 089ff2117b..4ad2ac081a 100644 --- a/package/kernel/mac80211/patches/build/060-no_local_ssb_bcma.patch +++ b/package/kernel/mac80211/patches/build/060-no_local_ssb_bcma.patch @@ -1,6 +1,6 @@ --- a/local-symbols +++ b/local-symbols -@@ -451,43 +451,6 @@ USB_VL600= +@@ -470,43 +470,6 @@ USB_VL600= USB_NET_CH9200= USB_NET_AQC111= USB_RTL8153_ECM= @@ -99,7 +99,7 @@ return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev); #else return bus->chipco.dev; -@@ -4870,7 +4870,7 @@ static int b43_wireless_core_init(struct +@@ -4871,7 +4871,7 @@ static int b43_wireless_core_init(struct } if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW) hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */ @@ -158,27 +158,6 @@ pcidev = bus->pcicore.dev; #endif gpiodev = bus->chipco.dev ? : pcidev; ---- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.h -@@ -24,7 +24,7 @@ struct brcms_led { - struct gpio_desc *gpiod; - }; - --#ifdef CPTCFG_BCMA_DRIVER_GPIO -+#ifdef CONFIG_BCMA_DRIVER_GPIO - void brcms_led_unregister(struct brcms_info *wl); - int brcms_led_register(struct brcms_info *wl); - #else ---- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/Makefile -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/Makefile -@@ -42,6 +42,6 @@ brcmsmac-y := \ - brcms_trace_events.o \ - debug.o - --brcmsmac-$(CPTCFG_BCMA_DRIVER_GPIO) += led.o -+brcmsmac-$(CONFIG_BCMA_DRIVER_GPIO) += led.o - - obj-$(CPTCFG_BRCMSMAC) += brcmsmac.o --- a/drivers/net/wireless/broadcom/brcm80211/Kconfig +++ b/drivers/net/wireless/broadcom/brcm80211/Kconfig @@ -8,7 +8,7 @@ config BRCMSMAC @@ -187,12 +166,12 @@ depends on BCMA_POSSIBLE - select BCMA + depends on BCMA - select NEW_LEDS if BCMA_DRIVER_GPIO - select LEDS_CLASS if BCMA_DRIVER_GPIO select BRCMUTIL + depends on FW_LOADER + depends on CORDIC --- a/Kconfig.local +++ b/Kconfig.local -@@ -1357,117 +1357,6 @@ config BACKPORTED_USB_NET_AQC111 +@@ -1414,117 +1414,6 @@ config BACKPORTED_USB_NET_AQC111 config BACKPORTED_USB_RTL8153_ECM tristate default USB_RTL8153_ECM diff --git a/package/kernel/mac80211/patches/build/070-remove-broken-wext-select.patch b/package/kernel/mac80211/patches/build/070-remove-broken-wext-select.patch new file mode 100644 index 0000000000..121b7faad9 --- /dev/null +++ b/package/kernel/mac80211/patches/build/070-remove-broken-wext-select.patch @@ -0,0 +1,10 @@ +--- a/drivers/staging/rtl8723bs/Kconfig ++++ b/drivers/staging/rtl8723bs/Kconfig +@@ -5,7 +5,6 @@ config RTL8723BS + depends on m + depends on WLAN && MMC && CFG80211 + depends on m +- select CFG80211_WEXT + depends on CRYPTO + select BPAUTO_CRYPTO_LIB_ARC4 + help diff --git a/package/kernel/mac80211/patches/build/080-resv_start_op.patch b/package/kernel/mac80211/patches/build/080-resv_start_op.patch new file mode 100644 index 0000000000..40b8e94a20 --- /dev/null +++ b/package/kernel/mac80211/patches/build/080-resv_start_op.patch @@ -0,0 +1,24 @@ +--- a/drivers/net/wireless/mac80211_hwsim.c ++++ b/drivers/net/wireless/mac80211_hwsim.c +@@ -5363,7 +5363,9 @@ static struct genl_family hwsim_genl_fam + .module = THIS_MODULE, + .small_ops = hwsim_ops, + .n_small_ops = ARRAY_SIZE(hwsim_ops), ++#if LINUX_VERSION_IS_GEQ(6,1,0) + .resv_start_op = HWSIM_CMD_DEL_MAC_ADDR + 1, ++#endif + .mcgrps = hwsim_mcgrps, + .n_mcgrps = ARRAY_SIZE(hwsim_mcgrps), + }; +--- a/net/wireless/nl80211.c ++++ b/net/wireless/nl80211.c +@@ -17233,7 +17233,9 @@ static struct genl_family nl80211_fam __ + .n_ops = ARRAY_SIZE(nl80211_ops), + .small_ops = nl80211_small_ops, + .n_small_ops = ARRAY_SIZE(nl80211_small_ops), ++#if LINUX_VERSION_IS_GEQ(6,1,0) + .resv_start_op = NL80211_CMD_REMOVE_LINK_STA + 1, ++#endif + .mcgrps = nl80211_mcgrps, + .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), + .parallel_ops = true, diff --git a/package/kernel/mac80211/patches/build/090-bcma-otp.patch b/package/kernel/mac80211/patches/build/090-bcma-otp.patch new file mode 100644 index 0000000000..3974776124 --- /dev/null +++ b/package/kernel/mac80211/patches/build/090-bcma-otp.patch @@ -0,0 +1,13 @@ +--- /dev/null ++++ b/backport-include/linux/bcma/bcma_driver_chipcommon.h +@@ -0,0 +1,10 @@ ++#ifndef __BACKPORT_BCMA_DRIVER_CHIPCOMMON_H ++#define __BACKPORT_BCMA_DRIVER_CHIPCOMMON_H ++ ++#include_next ++ ++#ifndef BCMA_CC_SROM_CONTROL_OTP_PRESENT ++#define BCMA_CC_SROM_CONTROL_OTP_PRESENT 0x00000020 ++#endif ++ ++#endif diff --git a/package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch b/package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch new file mode 100644 index 0000000000..3977b01bef --- /dev/null +++ b/package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch @@ -0,0 +1,76 @@ +From 54e0f9aaf340377fb76acdffee9ec7372c4b70ae Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Mon, 17 Oct 2022 11:35:36 +0200 +Subject: [PATCH] backports: drop QRTR and MHI + +Backports currently include QRTR and MHI due to ath11k-pci requiring them, +however this at the same time prevents us from adding ath11k-ahb as it +also requires QRTR however its AHB variant from the kernel will conflict +with the core provided by backports. + +Since MHI also conflicts with existing libreCMC kmods providing MHI drop +both from backports and use the ones provided by libreCMC kernel. + +Signed-off-by: Robert Marko +--- + Kconfig.sources | 2 -- + Makefile.kernel | 2 -- + drivers/net/wireless/ath/ath11k/Kconfig | 6 +++--- + local-symbols | 8 -------- + 4 files changed, 3 insertions(+), 15 deletions(-) + +--- a/Kconfig.sources ++++ b/Kconfig.sources +@@ -4,8 +4,6 @@ source "$BACKPORT_DIR/compat/Kconfig" + # these are copied from the kernel + source "$BACKPORT_DIR/net/wireless/Kconfig" + source "$BACKPORT_DIR/net/mac80211/Kconfig" +-source "$BACKPORT_DIR/net/qrtr/Kconfig" +-source "$BACKPORT_DIR/drivers/bus/mhi/Kconfig" + source "$BACKPORT_DIR/drivers/soc/qcom/Kconfig" + source "$BACKPORT_DIR/drivers/net/wireless/Kconfig" + source "$BACKPORT_DIR/drivers/net/usb/Kconfig" +--- a/Makefile.kernel ++++ b/Makefile.kernel +@@ -39,9 +39,7 @@ obj-y += compat/ + + obj-$(CPTCFG_CFG80211) += net/wireless/ + obj-$(CPTCFG_MAC80211) += net/mac80211/ +-obj-$(CPTCFG_QRTR) += net/qrtr/ + obj-$(CPTCFG_QCOM_QMI_HELPERS) += drivers/soc/qcom/ +-obj-$(CPTCFG_MHI_BUS) += drivers/bus/mhi/ + obj-$(CPTCFG_WLAN) += drivers/net/wireless/ + obj-$(CPTCFG_USB_NET_RNDIS_WLAN) += drivers/net/usb/ + +--- a/drivers/net/wireless/ath/ath11k/Kconfig ++++ b/drivers/net/wireless/ath/ath11k/Kconfig +@@ -25,9 +25,9 @@ config ATH11K_PCI + tristate "Atheros ath11k PCI support" + depends on m + depends on ATH11K && PCI +- select MHI_BUS +- select QRTR +- select QRTR_MHI ++ depends on MHI_BUS ++ depends on QRTR ++ depends on QRTR_MHI + help + This module adds support for PCIE bus + +--- a/local-symbols ++++ b/local-symbols +@@ -65,14 +65,6 @@ MAC80211_MESH_PS_DEBUG= + MAC80211_TDLS_DEBUG= + MAC80211_DEBUG_COUNTERS= + MAC80211_STA_HASH_MAX_SIZE= +-QRTR= +-QRTR_SMD= +-QRTR_TUN= +-QRTR_MHI= +-MHI_BUS= +-MHI_BUS_DEBUG= +-MHI_BUS_PCI_GENERIC= +-MHI_BUS_EP= + QCOM_AOSS_QMP= + QCOM_COMMAND_DB= + QCOM_CPR= diff --git a/package/kernel/mac80211/patches/build/110-backport_napi_build_skb.patch b/package/kernel/mac80211/patches/build/110-backport_napi_build_skb.patch new file mode 100644 index 0000000000..1e152fecea --- /dev/null +++ b/package/kernel/mac80211/patches/build/110-backport_napi_build_skb.patch @@ -0,0 +1,11 @@ +--- a/backport-include/linux/skbuff.h ++++ b/backport-include/linux/skbuff.h +@@ -144,4 +144,8 @@ static inline u64 skb_get_kcov_handle(st + #define napi_build_skb build_skb + #endif + ++#if LINUX_VERSION_IS_LESS(5,11,0) ++#define napi_build_skb build_skb ++#endif ++ + #endif /* __BACKPORT_SKBUFF_H */ diff --git a/package/kernel/mac80211/patches/mt7601u/001-wifi-mt7601u-update-firmware-path.patch b/package/kernel/mac80211/patches/mt7601u/001-wifi-mt7601u-update-firmware-path.patch new file mode 100644 index 0000000000..5d982906c5 --- /dev/null +++ b/package/kernel/mac80211/patches/mt7601u/001-wifi-mt7601u-update-firmware-path.patch @@ -0,0 +1,55 @@ +From patchwork Mon May 15 22:56:53 2023 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Daniel Golle +X-Patchwork-Id: 13242309 +X-Patchwork-Delegate: kvalo@adurom.com +Return-Path: +Date: Tue, 16 May 2023 00:56:53 +0200 +From: Daniel Golle +To: Jakub Kicinski , Kalle Valo , + "David S. Miller" , + Eric Dumazet , + Paolo Abeni , + Matthias Brugger , + AngeloGioacchino Del Regno + , + linux-wireless@vger.kernel.org, netdev@vger.kernel.org, + linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, + linux-mediatek@lists.infradead.org +Subject: [PATCH] wifi: mt7601u: update firmware path +Message-ID: + +MIME-Version: 1.0 +Content-Disposition: inline +Precedence: bulk +List-ID: +X-Mailing-List: linux-wireless@vger.kernel.org + +mt7601u.bin was moved to mediatek/ folder in linux-wireless via commit +8451c2b1 ("mt76xx: Move the old Mediatek WiFi firmware to mediatek") +and linux-firmware release 20230515. + +Update the firmware path requested by the mt7601u driver to follow up +with the move of the file. + +Signed-off-by: Daniel Golle +--- + drivers/net/wireless/mediatek/mt7601u/usb.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + + +base-commit: 0d9b41daa5907756a31772d8af8ac5ff25cf17c1 + +--- a/drivers/net/wireless/mediatek/mt7601u/usb.h ++++ b/drivers/net/wireless/mediatek/mt7601u/usb.h +@@ -8,7 +8,7 @@ + + #include "mt7601u.h" + +-#define MT7601U_FIRMWARE "mt7601u.bin" ++#define MT7601U_FIRMWARE "mediatek/mt7601u.bin" + + #define MT_VEND_REQ_MAX_RETRY 10 + #define MT_VEND_REQ_TOUT_MS 300 diff --git a/package/kernel/mac80211/patches/rt2x00/001-rt2x00-define-RF5592-in-init_eeprom-routine.patch b/package/kernel/mac80211/patches/rt2x00/001-rt2x00-define-RF5592-in-init_eeprom-routine.patch deleted file mode 100644 index 4d5b670279..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/001-rt2x00-define-RF5592-in-init_eeprom-routine.patch +++ /dev/null @@ -1,52 +0,0 @@ -From patchwork Sat Sep 17 20:26:27 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 8bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12979242 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Sat, 17 Sep 2022 21:26:27 +0100 -From: Daniel Golle -To: linux-wireless@vger.kernel.org, Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg -Subject: [PATCH v3 01/16] rt2x00: define RF5592 in init_eeprom routine -Message-ID: - -References: -MIME-Version: 1.0 -Content-Disposition: inline -In-Reply-To: -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -From: Tomislav Požega - -Fix incorrect RF value encoded in EEPROM on devices with Ralink Rt5592 -PCIe radio (a single chip 2T2R 802.11abgn solution). - -Signed-off-by: Tomislav Požega -Signed-off-by: Daniel Golle -Acked-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -9461,6 +9461,8 @@ static int rt2800_init_eeprom(struct rt2 - rf = RF3853; - else if (rt2x00_rt(rt2x00dev, RT5350)) - rf = RF5350; -+ else if (rt2x00_rt(rt2x00dev, RT5592)) -+ rf = RF5592; - else - rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE); - diff --git a/package/kernel/mac80211/patches/rt2x00/002-rt2x00-add-throughput-LED-trigger.patch b/package/kernel/mac80211/patches/rt2x00/002-rt2x00-add-throughput-LED-trigger.patch deleted file mode 100644 index 02d1f7a2e5..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/002-rt2x00-add-throughput-LED-trigger.patch +++ /dev/null @@ -1,76 +0,0 @@ -From patchwork Sat Sep 17 20:26:40 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12979243 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Sat, 17 Sep 2022 21:26:40 +0100 -From: Daniel Golle -To: linux-wireless@vger.kernel.org, Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg -Subject: [PATCH v3 02/16] rt2x00: add throughput LED trigger -Message-ID: - <73f5ba4134e621462a26186449400cf0c1ac1730.1663445157.git.daniel@makrotopia.org> -References: -MIME-Version: 1.0 -Content-Disposition: inline -In-Reply-To: -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -From: David Bauer - -This adds a (currently missing) throughput LED trigger for the rt2x00 -driver. Previously, LED triggers had to be assigned to the netdev, which -was limited to a single VAP. - -Tested-by: Christoph Krapp -Signed-off-by: David Bauer -Acked-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1093,6 +1093,19 @@ static void rt2x00lib_remove_hw(struct r - kfree(rt2x00dev->spec.channels_info); - } - -+static const struct ieee80211_tpt_blink rt2x00_tpt_blink[] = { -+ { .throughput = 0 * 1024, .blink_time = 334 }, -+ { .throughput = 1 * 1024, .blink_time = 260 }, -+ { .throughput = 2 * 1024, .blink_time = 220 }, -+ { .throughput = 5 * 1024, .blink_time = 190 }, -+ { .throughput = 10 * 1024, .blink_time = 170 }, -+ { .throughput = 25 * 1024, .blink_time = 150 }, -+ { .throughput = 54 * 1024, .blink_time = 130 }, -+ { .throughput = 120 * 1024, .blink_time = 110 }, -+ { .throughput = 265 * 1024, .blink_time = 80 }, -+ { .throughput = 586 * 1024, .blink_time = 50 }, -+}; -+ - static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev) - { - struct hw_mode_spec *spec = &rt2x00dev->spec; -@@ -1174,6 +1187,11 @@ static int rt2x00lib_probe_hw(struct rt2 - - #undef RT2X00_TASKLET_INIT - -+ ieee80211_create_tpt_led_trigger(rt2x00dev->hw, -+ IEEE80211_TPT_LEDTRIG_FL_RADIO, -+ rt2x00_tpt_blink, -+ ARRAY_SIZE(rt2x00_tpt_blink)); -+ - /* - * Register HW. - */ diff --git a/package/kernel/mac80211/patches/rt2x00/003-rt2x00-add-support-for-external-PA-on-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/003-rt2x00-add-support-for-external-PA-on-MT7620.patch deleted file mode 100644 index 26c2020918..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/003-rt2x00-add-support-for-external-PA-on-MT7620.patch +++ /dev/null @@ -1,125 +0,0 @@ -From patchwork Sat Sep 17 20:26:55 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 8bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12979244 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Sat, 17 Sep 2022 21:26:55 +0100 -From: Daniel Golle -To: linux-wireless@vger.kernel.org, Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg -Subject: [PATCH v3 03/16] rt2x00: add support for external PA on MT7620 -Message-ID: - -References: -MIME-Version: 1.0 -Content-Disposition: inline -In-Reply-To: -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -Implement support for external PA connected to MT7620A. - -Signed-off-by: Tomislav Požega -[pozega.tomislav@gmail.com: use chanreg and dccal helpers.] -Signed-off-by: Daniel Golle -Acked-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2800.h | 1 + - .../net/wireless/ralink/rt2x00/rt2800lib.c | 52 ++++++++++++++++++- - 2 files changed, 52 insertions(+), 1 deletion(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h -@@ -2739,6 +2739,7 @@ enum rt2800_eeprom_word { - #define EEPROM_NIC_CONF2_RX_STREAM FIELD16(0x000f) - #define EEPROM_NIC_CONF2_TX_STREAM FIELD16(0x00f0) - #define EEPROM_NIC_CONF2_CRYSTAL FIELD16(0x0600) -+#define EEPROM_NIC_CONF2_EXTERNAL_PA FIELD16(0x8000) - - /* - * EEPROM LNA ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -4372,6 +4372,43 @@ static void rt2800_config_channel(struct - rt2800_iq_calibrate(rt2x00dev, rf->channel); - } - -+ if (rt2x00_rt(rt2x00dev, RT6352)) { -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, -+ &rt2x00dev->cap_flags)) { -+ reg = rt2800_register_read(rt2x00dev, RF_CONTROL3); -+ reg |= 0x00000101; -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, reg); -+ -+ reg = rt2800_register_read(rt2x00dev, RF_BYPASS3); -+ reg |= 0x00000101; -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); -+ -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0x73); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0x73); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0x73); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0xC8); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xA4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x05); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xC8); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xA4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x05); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0xC8); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xA4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x05); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 05, 0x00); -+ -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, -+ 0x36303636); -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, -+ 0x6C6C6B6C); -+ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, -+ 0x6C6C6B6C); -+ } -+ } -+ - bbp = rt2800_bbp_read(rt2x00dev, 4); - rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf)); - rt2800_bbp_write(rt2x00dev, 4, bbp); -@@ -9592,7 +9629,8 @@ static int rt2800_init_eeprom(struct rt2 - */ - eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); - -- if (rt2x00_rt(rt2x00dev, RT3352)) { -+ if (rt2x00_rt(rt2x00dev, RT3352) || -+ rt2x00_rt(rt2x00dev, RT6352)) { - if (rt2x00_get_field16(eeprom, - EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352)) - __set_bit(CAPABILITY_EXTERNAL_PA_TX0, -@@ -9603,6 +9641,18 @@ static int rt2800_init_eeprom(struct rt2 - &rt2x00dev->cap_flags); - } - -+ eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF2); -+ -+ if (rt2x00_rt(rt2x00dev, RT6352) && eeprom != 0 && eeprom != 0xffff) { -+ if (!rt2x00_get_field16(eeprom, -+ EEPROM_NIC_CONF2_EXTERNAL_PA)) { -+ __clear_bit(CAPABILITY_EXTERNAL_PA_TX0, -+ &rt2x00dev->cap_flags); -+ __clear_bit(CAPABILITY_EXTERNAL_PA_TX1, -+ &rt2x00dev->cap_flags); -+ } -+ } -+ - return 0; - } - diff --git a/package/kernel/mac80211/patches/rt2x00/004-rt2x00-move-up-and-reuse-busy-wait-functions.patch b/package/kernel/mac80211/patches/rt2x00/004-rt2x00-move-up-and-reuse-busy-wait-functions.patch deleted file mode 100644 index c9b0d82b64..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/004-rt2x00-move-up-and-reuse-busy-wait-functions.patch +++ /dev/null @@ -1,178 +0,0 @@ -From patchwork Sat Sep 17 20:27:10 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12979245 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Sat, 17 Sep 2022 21:27:10 +0100 -From: Daniel Golle -To: linux-wireless@vger.kernel.org, Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg -Subject: [PATCH v3 04/16] rt2x00: move up and reuse busy wait functions -Message-ID: - <3fdb9dc15e76a9f9c1948b4a3a1308a7a5677bb8.1663445157.git.daniel@makrotopia.org> -References: -MIME-Version: 1.0 -Content-Disposition: inline -In-Reply-To: -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -Move bbp_ready and rf_ready busy wait functions up in the code so they -can more easily be used. Allow specifying register mask in rf_ready -function which is useful for calibration routines which will be added -in follow-up commits. - -Signed-off-by: Daniel Golle -Acked-by: Stanislaw Gruszka ---- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 99 +++++++++---------- - 1 file changed, 46 insertions(+), 53 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -2143,6 +2143,48 @@ void rt2800_config_erp(struct rt2x00_dev - } - EXPORT_SYMBOL_GPL(rt2800_config_erp); - -+static int rt2800_wait_bbp_rf_ready(struct rt2x00_dev *rt2x00dev, -+ const struct rt2x00_field32 mask) -+{ -+ unsigned int i; -+ u32 reg; -+ -+ for (i = 0; i < REGISTER_BUSY_COUNT; i++) { -+ reg = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG); -+ if (!rt2x00_get_field32(reg, mask)) -+ return 0; -+ -+ udelay(REGISTER_BUSY_DELAY); -+ } -+ -+ rt2x00_err(rt2x00dev, "BBP/RF register access failed, aborting\n"); -+ return -EACCES; -+} -+ -+static int rt2800_wait_bbp_ready(struct rt2x00_dev *rt2x00dev) -+{ -+ unsigned int i; -+ u8 value; -+ -+ /* -+ * BBP was enabled after firmware was loaded, -+ * but we need to reactivate it now. -+ */ -+ rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0); -+ rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0); -+ msleep(1); -+ -+ for (i = 0; i < REGISTER_BUSY_COUNT; i++) { -+ value = rt2800_bbp_read(rt2x00dev, 0); -+ if ((value != 0xff) && (value != 0x00)) -+ return 0; -+ udelay(REGISTER_BUSY_DELAY); -+ } -+ -+ rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n"); -+ return -EACCES; -+} -+ - static void rt2800_config_3572bt_ant(struct rt2x00_dev *rt2x00dev) - { - u32 reg; -@@ -3799,10 +3841,9 @@ static void rt2800_config_alc(struct rt2 - struct ieee80211_channel *chan, - int power_level) { - u16 eeprom, target_power, max_power; -- u32 mac_sys_ctrl, mac_status; -+ u32 mac_sys_ctrl; - u32 reg; - u8 bbp; -- int i; - - /* hardware unit is 0.5dBm, limited to 23.5dBm */ - power_level *= 2; -@@ -3838,16 +3879,8 @@ static void rt2800_config_alc(struct rt2 - /* Disable Tx/Rx */ - rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0); - /* Check MAC Tx/Rx idle */ -- for (i = 0; i < 10000; i++) { -- mac_status = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG); -- if (mac_status & 0x3) -- usleep_range(50, 200); -- else -- break; -- } -- -- if (i == 10000) -- rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n"); -+ if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY))) -+ rt2x00_warn(rt2x00dev, "RF busy while configuring ALC\n"); - - if (chan->center_freq > 2457) { - bbp = rt2800_bbp_read(rt2x00dev, 30); -@@ -6275,46 +6308,6 @@ static int rt2800_init_registers(struct - return 0; - } - --static int rt2800_wait_bbp_rf_ready(struct rt2x00_dev *rt2x00dev) --{ -- unsigned int i; -- u32 reg; -- -- for (i = 0; i < REGISTER_BUSY_COUNT; i++) { -- reg = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG); -- if (!rt2x00_get_field32(reg, MAC_STATUS_CFG_BBP_RF_BUSY)) -- return 0; -- -- udelay(REGISTER_BUSY_DELAY); -- } -- -- rt2x00_err(rt2x00dev, "BBP/RF register access failed, aborting\n"); -- return -EACCES; --} -- --static int rt2800_wait_bbp_ready(struct rt2x00_dev *rt2x00dev) --{ -- unsigned int i; -- u8 value; -- -- /* -- * BBP was enabled after firmware was loaded, -- * but we need to reactivate it now. -- */ -- rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0); -- rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0); -- msleep(1); -- -- for (i = 0; i < REGISTER_BUSY_COUNT; i++) { -- value = rt2800_bbp_read(rt2x00dev, 0); -- if ((value != 0xff) && (value != 0x00)) -- return 0; -- udelay(REGISTER_BUSY_DELAY); -- } -- -- rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n"); -- return -EACCES; --} - - static void rt2800_bbp4_mac_if_ctrl(struct rt2x00_dev *rt2x00dev) - { -@@ -9136,7 +9129,7 @@ int rt2800_enable_radio(struct rt2x00_de - /* - * Wait BBP/RF to wake up. - */ -- if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev))) -+ if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY))) - return -EIO; - - /* diff --git a/package/kernel/mac80211/patches/rt2x00/005-rt2x00-add-RF-self-TXDC-calibration-for-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/005-rt2x00-add-RF-self-TXDC-calibration-for-MT7620.patch deleted file mode 100644 index 9ba16bee12..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/005-rt2x00-add-RF-self-TXDC-calibration-for-MT7620.patch +++ /dev/null @@ -1,106 +0,0 @@ -From patchwork Sat Sep 17 20:27:26 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 8bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12979246 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Sat, 17 Sep 2022 21:27:26 +0100 -From: Daniel Golle -To: linux-wireless@vger.kernel.org, Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg -Subject: [PATCH v3 05/16] rt2x00: add RF self TXDC calibration for MT7620 -Message-ID: - -References: -MIME-Version: 1.0 -Content-Disposition: inline -In-Reply-To: -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -From: Tomislav Požega - -Add TX self calibration based on mtk driver. - -Signed-off-by: Tomislav Požega -Signed-off-by: Daniel Golle -Acked-by: Stanislaw Gruszka ---- -v2: use ++i instead of i = i + 1 in loops - - .../net/wireless/ralink/rt2x00/rt2800lib.c | 48 +++++++++++++++++++ - 1 file changed, 48 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8454,6 +8454,53 @@ static void rt2800_init_rfcsr_5592(struc - rt2800_led_open_drain_enable(rt2x00dev); - } - -+static void rt2800_rf_self_txdc_cal(struct rt2x00_dev *rt2x00dev) -+{ -+ u8 rfb5r1_org, rfb7r1_org, rfvalue; -+ u32 mac0518, mac051c, mac0528, mac052c; -+ u8 i; -+ -+ mac0518 = rt2800_register_read(rt2x00dev, RF_CONTROL0); -+ mac051c = rt2800_register_read(rt2x00dev, RF_BYPASS0); -+ mac0528 = rt2800_register_read(rt2x00dev, RF_CONTROL2); -+ mac052c = rt2800_register_read(rt2x00dev, RF_BYPASS2); -+ -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x0); -+ rt2800_register_write(rt2x00dev, RF_BYPASS2, 0x0); -+ -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0xC); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x3306); -+ rt2800_register_write(rt2x00dev, RF_CONTROL2, 0x3330); -+ rt2800_register_write(rt2x00dev, RF_BYPASS2, 0xfffff); -+ rfb5r1_org = rt2800_rfcsr_read_bank(rt2x00dev, 5, 1); -+ rfb7r1_org = rt2800_rfcsr_read_bank(rt2x00dev, 7, 1); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, 0x4); -+ for (i = 0; i < 100; ++i) { -+ usleep_range(50, 100); -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 5, 1); -+ if ((rfvalue & 0x04) != 0x4) -+ break; -+ } -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, rfb5r1_org); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 1, 0x4); -+ for (i = 0; i < 100; ++i) { -+ usleep_range(50, 100); -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 7, 1); -+ if ((rfvalue & 0x04) != 0x4) -+ break; -+ } -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 1, rfb7r1_org); -+ -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x0); -+ rt2800_register_write(rt2x00dev, RF_BYPASS2, 0x0); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, mac0518); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, mac051c); -+ rt2800_register_write(rt2x00dev, RF_CONTROL2, mac0528); -+ rt2800_register_write(rt2x00dev, RF_BYPASS2, mac052c); -+} -+ - static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, - bool set_bw, bool is_ht40) - { -@@ -9061,6 +9108,7 @@ static void rt2800_init_rfcsr_6352(struc - rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); - rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); - -+ rt2800_rf_self_txdc_cal(rt2x00dev); - rt2800_bw_filter_calibration(rt2x00dev, true); - rt2800_bw_filter_calibration(rt2x00dev, false); - } diff --git a/package/kernel/mac80211/patches/rt2x00/006-rt2x00-add-r-calibration-for-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/006-rt2x00-add-r-calibration-for-MT7620.patch deleted file mode 100644 index e15de28ea0..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/006-rt2x00-add-r-calibration-for-MT7620.patch +++ /dev/null @@ -1,203 +0,0 @@ -From patchwork Sat Sep 17 20:27:41 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 8bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12979247 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Sat, 17 Sep 2022 21:27:41 +0100 -From: Daniel Golle -To: linux-wireless@vger.kernel.org, Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg -Subject: [PATCH v3 06/16] rt2x00: add r calibration for MT7620 -Message-ID: - -References: -MIME-Version: 1.0 -Content-Disposition: inline -In-Reply-To: -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -From: Tomislav Požega - -Add r calibration code as found in mtk driver. - -Signed-off-by: Tomislav Požega -Signed-off-by: Daniel Golle -Acked-by: Stanislaw Gruszka ---- -v2: use rt2800_wait_bbp_rf_ready() - - drivers/net/wireless/ralink/rt2x00/rt2800.h | 2 + - .../net/wireless/ralink/rt2x00/rt2800lib.c | 133 ++++++++++++++++++ - 2 files changed, 135 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h -@@ -1016,6 +1016,8 @@ - */ - #define MAC_STATUS_CFG 0x1200 - #define MAC_STATUS_CFG_BBP_RF_BUSY FIELD32(0x00000003) -+#define MAC_STATUS_CFG_BBP_RF_BUSY_TX FIELD32(0x00000001) -+#define MAC_STATUS_CFG_BBP_RF_BUSY_RX FIELD32(0x00000002) - - /* - * PWR_PIN_CFG: ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8501,6 +8501,138 @@ static void rt2800_rf_self_txdc_cal(stru - rt2800_register_write(rt2x00dev, RF_BYPASS2, mac052c); - } - -+static int rt2800_calcrcalibrationcode(struct rt2x00_dev *rt2x00dev, int d1, int d2) -+{ -+ int calcode = ((d2 - d1) * 1000) / 43; -+ -+ if ((calcode % 10) >= 5) -+ calcode += 10; -+ calcode = (calcode / 10); -+ -+ return calcode; -+} -+ -+static void rt2800_r_calibration(struct rt2x00_dev *rt2x00dev) -+{ -+ u32 savemacsysctrl; -+ u8 saverfb0r1, saverfb0r34, saverfb0r35; -+ u8 saverfb5r4, saverfb5r17, saverfb5r18; -+ u8 saverfb5r19, saverfb5r20; -+ u8 savebbpr22, savebbpr47, savebbpr49; -+ u8 bytevalue = 0; -+ int rcalcode; -+ u8 r_cal_code = 0; -+ char d1 = 0, d2 = 0; -+ u8 rfvalue; -+ u32 MAC_RF_BYPASS0, MAC_RF_CONTROL0, MAC_PWR_PIN_CFG; -+ u32 maccfg; -+ -+ saverfb0r1 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 1); -+ saverfb0r34 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 34); -+ saverfb0r35 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 35); -+ saverfb5r4 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4); -+ saverfb5r17 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 17); -+ saverfb5r18 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 18); -+ saverfb5r19 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 19); -+ saverfb5r20 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 20); -+ -+ savebbpr22 = rt2800_bbp_read(rt2x00dev, 22); -+ savebbpr47 = rt2800_bbp_read(rt2x00dev, 47); -+ savebbpr49 = rt2800_bbp_read(rt2x00dev, 49); -+ -+ savemacsysctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -+ MAC_RF_BYPASS0 = rt2800_register_read(rt2x00dev, RF_BYPASS0); -+ MAC_RF_CONTROL0 = rt2800_register_read(rt2x00dev, RF_CONTROL0); -+ MAC_PWR_PIN_CFG = rt2800_register_read(rt2x00dev, PWR_PIN_CFG); -+ -+ maccfg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -+ maccfg &= (~0x04); -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, maccfg); -+ -+ if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_TX))) -+ rt2x00_warn(rt2x00dev, "Wait MAC Tx Status to MAX !!!\n"); -+ -+ maccfg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -+ maccfg &= (~0x04); -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, maccfg); -+ -+ if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_RX))) -+ rt2x00_warn(rt2x00dev, "Wait MAC Rx Status to MAX !!!\n"); -+ -+ rfvalue = (MAC_RF_BYPASS0 | 0x3004); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, rfvalue); -+ rfvalue = (MAC_RF_CONTROL0 | (~0x3002)); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, rfvalue); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, 0x27); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, 0x80); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0x83); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0x00); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x20); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 1, 0x00); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 34, 0x13); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 35, 0x00); -+ -+ rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x1); -+ -+ rt2800_bbp_write(rt2x00dev, 47, 0x04); -+ rt2800_bbp_write(rt2x00dev, 22, 0x80); -+ usleep_range(100, 200); -+ bytevalue = rt2800_bbp_read(rt2x00dev, 49); -+ if (bytevalue > 128) -+ d1 = bytevalue - 256; -+ else -+ d1 = (char)bytevalue; -+ rt2800_bbp_write(rt2x00dev, 22, 0x0); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 35, 0x01); -+ -+ rt2800_bbp_write(rt2x00dev, 22, 0x80); -+ usleep_range(100, 200); -+ bytevalue = rt2800_bbp_read(rt2x00dev, 49); -+ if (bytevalue > 128) -+ d2 = bytevalue - 256; -+ else -+ d2 = (char)bytevalue; -+ rt2800_bbp_write(rt2x00dev, 22, 0x0); -+ -+ rcalcode = rt2800_calcrcalibrationcode(rt2x00dev, d1, d2); -+ if (rcalcode < 0) -+ r_cal_code = 256 + rcalcode; -+ else -+ r_cal_code = (u8)rcalcode; -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 7, r_cal_code); -+ -+ rt2800_bbp_write(rt2x00dev, 22, 0x0); -+ -+ bytevalue = rt2800_bbp_read(rt2x00dev, 21); -+ bytevalue |= 0x1; -+ rt2800_bbp_write(rt2x00dev, 21, bytevalue); -+ bytevalue = rt2800_bbp_read(rt2x00dev, 21); -+ bytevalue &= (~0x1); -+ rt2800_bbp_write(rt2x00dev, 21, bytevalue); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 1, saverfb0r1); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 34, saverfb0r34); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 35, saverfb0r35); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, saverfb5r4); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, saverfb5r17); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, saverfb5r18); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, saverfb5r19); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, saverfb5r20); -+ -+ rt2800_bbp_write(rt2x00dev, 22, savebbpr22); -+ rt2800_bbp_write(rt2x00dev, 47, savebbpr47); -+ rt2800_bbp_write(rt2x00dev, 49, savebbpr49); -+ -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, MAC_RF_BYPASS0); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, MAC_RF_CONTROL0); -+ -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl); -+ rt2800_register_write(rt2x00dev, PWR_PIN_CFG, MAC_PWR_PIN_CFG); -+} -+ - static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, - bool set_bw, bool is_ht40) - { -@@ -9108,6 +9240,7 @@ static void rt2800_init_rfcsr_6352(struc - rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); - rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); - -+ rt2800_r_calibration(rt2x00dev); - rt2800_rf_self_txdc_cal(rt2x00dev); - rt2800_bw_filter_calibration(rt2x00dev, true); - rt2800_bw_filter_calibration(rt2x00dev, false); diff --git a/package/kernel/mac80211/patches/rt2x00/007-rt2x00-add-RXDCOC-calibration-for-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/007-rt2x00-add-RXDCOC-calibration-for-MT7620.patch deleted file mode 100644 index a09d0abed0..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/007-rt2x00-add-RXDCOC-calibration-for-MT7620.patch +++ /dev/null @@ -1,117 +0,0 @@ -From patchwork Sat Sep 17 20:27:56 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 8bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12979248 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Sat, 17 Sep 2022 21:27:56 +0100 -From: Daniel Golle -To: linux-wireless@vger.kernel.org, Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg -Subject: [PATCH v3 07/16] rt2x00: add RXDCOC calibration for MT7620 -Message-ID: - <850b30f652e88de30d79e968af4eb47aa5bc2511.1663445157.git.daniel@makrotopia.org> -References: -MIME-Version: 1.0 -Content-Disposition: inline -In-Reply-To: -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -From: Tomislav Požega - -Add RXDCOC calibration code from mtk driver. - -Signed-off-by: Tomislav Požega -[fixed typo reported by Serge Vasilugin ] -Signed-off-by: Daniel Golle -Acked-by: Stanislaw Gruszka ---- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 60 +++++++++++++++++++ - 1 file changed, 60 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8633,6 +8633,65 @@ static void rt2800_r_calibration(struct - rt2800_register_write(rt2x00dev, PWR_PIN_CFG, MAC_PWR_PIN_CFG); - } - -+static void rt2800_rxdcoc_calibration(struct rt2x00_dev *rt2x00dev) -+{ -+ u8 bbpreg = 0; -+ u32 macvalue = 0; -+ u8 saverfb0r2, saverfb5r4, saverfb7r4, rfvalue; -+ int i; -+ -+ saverfb0r2 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 2); -+ rfvalue = saverfb0r2; -+ rfvalue |= 0x03; -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, rfvalue); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 141); -+ bbpreg = rt2800_bbp_read(rt2x00dev, 159); -+ bbpreg |= 0x10; -+ rt2800_bbp_write(rt2x00dev, 159, bbpreg); -+ -+ macvalue = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x8); -+ -+ if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_TX))) -+ rt2x00_warn(rt2x00dev, "RF TX busy in RX RXDCOC calibration\n"); -+ -+ saverfb5r4 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4); -+ saverfb7r4 = rt2800_rfcsr_read_bank(rt2x00dev, 7, 4); -+ saverfb5r4 = saverfb5r4 & (~0x40); -+ saverfb7r4 = saverfb7r4 & (~0x40); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x64); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, saverfb5r4); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 4, saverfb7r4); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 141); -+ bbpreg = rt2800_bbp_read(rt2x00dev, 159); -+ bbpreg = bbpreg & (~0x40); -+ rt2800_bbp_write(rt2x00dev, 159, bbpreg); -+ bbpreg |= 0x48; -+ rt2800_bbp_write(rt2x00dev, 159, bbpreg); -+ -+ for (i = 0; i < 10000; i++) { -+ bbpreg = rt2800_bbp_read(rt2x00dev, 159); -+ if ((bbpreg & 0x40) == 0) -+ break; -+ usleep_range(50, 100); -+ } -+ -+ bbpreg = rt2800_bbp_read(rt2x00dev, 159); -+ bbpreg = bbpreg & (~0x40); -+ rt2800_bbp_write(rt2x00dev, 159, bbpreg); -+ -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, macvalue); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 141); -+ bbpreg = rt2800_bbp_read(rt2x00dev, 159); -+ bbpreg &= (~0x10); -+ rt2800_bbp_write(rt2x00dev, 159, bbpreg); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, saverfb0r2); -+} -+ - static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, - bool set_bw, bool is_ht40) - { -@@ -9242,6 +9301,7 @@ static void rt2800_init_rfcsr_6352(struc - - rt2800_r_calibration(rt2x00dev); - rt2800_rf_self_txdc_cal(rt2x00dev); -+ rt2800_rxdcoc_calibration(rt2x00dev); - rt2800_bw_filter_calibration(rt2x00dev, true); - rt2800_bw_filter_calibration(rt2x00dev, false); - } diff --git a/package/kernel/mac80211/patches/rt2x00/008-rt2x00-add-RXIQ-calibration-for-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/008-rt2x00-add-RXIQ-calibration-for-MT7620.patch deleted file mode 100644 index 2087d5a336..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/008-rt2x00-add-RXIQ-calibration-for-MT7620.patch +++ /dev/null @@ -1,434 +0,0 @@ -From patchwork Sat Sep 17 20:28:10 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 8bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12979249 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Sat, 17 Sep 2022 21:28:10 +0100 -From: Daniel Golle -To: linux-wireless@vger.kernel.org, Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg -Subject: [PATCH v3 08/16] rt2x00: add RXIQ calibration for MT7620 -Message-ID: - <033a39a697d51f6df258acea4c33608e0944fe4c.1663445157.git.daniel@makrotopia.org> -References: -MIME-Version: 1.0 -Content-Disposition: inline -In-Reply-To: -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -From: Tomislav Požega - -Add RXIQ calibration found in mtk driver. With old librecmc builds this -gets us ~8Mbps more of RX bandwidth (test with iPA/eLNA layout). - -Signed-off-by: Tomislav Požega -Signed-off-by: Daniel Golle -Acked-by: Stanislaw Gruszka ---- -v2: use rt2800_wait_bbp_rf_ready(), fix indentation - - .../net/wireless/ralink/rt2x00/rt2800lib.c | 375 ++++++++++++++++++ - 1 file changed, 375 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8692,6 +8692,380 @@ static void rt2800_rxdcoc_calibration(st - rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, saverfb0r2); - } - -+static u32 rt2800_do_sqrt_accumulation(u32 si) -+{ -+ u32 root, root_pre, bit; -+ char i; -+ -+ bit = 1 << 15; -+ root = 0; -+ for (i = 15; i >= 0; i = i - 1) { -+ root_pre = root + bit; -+ if ((root_pre * root_pre) <= si) -+ root = root_pre; -+ bit = bit >> 1; -+ } -+ -+ return root; -+} -+ -+static void rt2800_rxiq_calibration(struct rt2x00_dev *rt2x00dev) -+{ -+ u8 rfb0r1, rfb0r2, rfb0r42; -+ u8 rfb4r0, rfb4r19; -+ u8 rfb5r3, rfb5r4, rfb5r17, rfb5r18, rfb5r19, rfb5r20; -+ u8 rfb6r0, rfb6r19; -+ u8 rfb7r3, rfb7r4, rfb7r17, rfb7r18, rfb7r19, rfb7r20; -+ -+ u8 bbp1, bbp4; -+ u8 bbpr241, bbpr242; -+ u32 i; -+ u8 ch_idx; -+ u8 bbpval; -+ u8 rfval, vga_idx = 0; -+ int mi = 0, mq = 0, si = 0, sq = 0, riq = 0; -+ int sigma_i, sigma_q, r_iq, g_rx; -+ int g_imb; -+ int ph_rx; -+ u32 savemacsysctrl = 0; -+ u32 orig_RF_CONTROL0 = 0; -+ u32 orig_RF_BYPASS0 = 0; -+ u32 orig_RF_CONTROL1 = 0; -+ u32 orig_RF_BYPASS1 = 0; -+ u32 orig_RF_CONTROL3 = 0; -+ u32 orig_RF_BYPASS3 = 0; -+ u32 bbpval1 = 0; -+ static const u8 rf_vga_table[] = {0x20, 0x21, 0x22, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f}; -+ -+ savemacsysctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -+ orig_RF_CONTROL0 = rt2800_register_read(rt2x00dev, RF_CONTROL0); -+ orig_RF_BYPASS0 = rt2800_register_read(rt2x00dev, RF_BYPASS0); -+ orig_RF_CONTROL1 = rt2800_register_read(rt2x00dev, RF_CONTROL1); -+ orig_RF_BYPASS1 = rt2800_register_read(rt2x00dev, RF_BYPASS1); -+ orig_RF_CONTROL3 = rt2800_register_read(rt2x00dev, RF_CONTROL3); -+ orig_RF_BYPASS3 = rt2800_register_read(rt2x00dev, RF_BYPASS3); -+ -+ bbp1 = rt2800_bbp_read(rt2x00dev, 1); -+ bbp4 = rt2800_bbp_read(rt2x00dev, 4); -+ -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x0); -+ -+ if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY))) -+ rt2x00_warn(rt2x00dev, "Timeout waiting for MAC status in RXIQ calibration\n"); -+ -+ bbpval = bbp4 & (~0x18); -+ bbpval = bbp4 | 0x00; -+ rt2800_bbp_write(rt2x00dev, 4, bbpval); -+ -+ bbpval = rt2800_bbp_read(rt2x00dev, 21); -+ bbpval = bbpval | 1; -+ rt2800_bbp_write(rt2x00dev, 21, bbpval); -+ bbpval = bbpval & 0xfe; -+ rt2800_bbp_write(rt2x00dev, 21, bbpval); -+ -+ rt2800_register_write(rt2x00dev, RF_CONTROL1, 0x00000202); -+ rt2800_register_write(rt2x00dev, RF_BYPASS1, 0x00000303); -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, 0x0101); -+ else -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, 0x0000); -+ -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, 0xf1f1); -+ -+ rfb0r1 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 1); -+ rfb0r2 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 2); -+ rfb0r42 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 42); -+ rfb4r0 = rt2800_rfcsr_read_bank(rt2x00dev, 4, 0); -+ rfb4r19 = rt2800_rfcsr_read_bank(rt2x00dev, 4, 19); -+ rfb5r3 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 3); -+ rfb5r4 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4); -+ rfb5r17 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 17); -+ rfb5r18 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 18); -+ rfb5r19 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 19); -+ rfb5r20 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 20); -+ -+ rfb6r0 = rt2800_rfcsr_read_bank(rt2x00dev, 6, 0); -+ rfb6r19 = rt2800_rfcsr_read_bank(rt2x00dev, 6, 19); -+ rfb7r3 = rt2800_rfcsr_read_bank(rt2x00dev, 7, 3); -+ rfb7r4 = rt2800_rfcsr_read_bank(rt2x00dev, 7, 4); -+ rfb7r17 = rt2800_rfcsr_read_bank(rt2x00dev, 7, 17); -+ rfb7r18 = rt2800_rfcsr_read_bank(rt2x00dev, 7, 18); -+ rfb7r19 = rt2800_rfcsr_read_bank(rt2x00dev, 7, 19); -+ rfb7r20 = rt2800_rfcsr_read_bank(rt2x00dev, 7, 20); -+ -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x87); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0x27); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x38); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x38); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x80); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 18, 0xC1); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 19, 0x60); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 20, 0x00); -+ -+ rt2800_bbp_write(rt2x00dev, 23, 0x0); -+ rt2800_bbp_write(rt2x00dev, 24, 0x0); -+ -+ rt2800_bbp_dcoc_write(rt2x00dev, 5, 0x0); -+ -+ bbpr241 = rt2800_bbp_read(rt2x00dev, 241); -+ bbpr242 = rt2800_bbp_read(rt2x00dev, 242); -+ -+ rt2800_bbp_write(rt2x00dev, 241, 0x10); -+ rt2800_bbp_write(rt2x00dev, 242, 0x84); -+ rt2800_bbp_write(rt2x00dev, 244, 0x31); -+ -+ bbpval = rt2800_bbp_dcoc_read(rt2x00dev, 3); -+ bbpval = bbpval & (~0x7); -+ rt2800_bbp_dcoc_write(rt2x00dev, 3, bbpval); -+ -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00000004); -+ udelay(1); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00000006); -+ usleep_range(1, 200); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x00003376); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001006); -+ udelay(1); -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) { -+ rt2800_bbp_write(rt2x00dev, 23, 0x06); -+ rt2800_bbp_write(rt2x00dev, 24, 0x06); -+ } else { -+ rt2800_bbp_write(rt2x00dev, 23, 0x02); -+ rt2800_bbp_write(rt2x00dev, 24, 0x02); -+ } -+ -+ for (ch_idx = 0; ch_idx < 2; ch_idx = ch_idx + 1) { -+ if (ch_idx == 0) { -+ rfval = rfb0r1 & (~0x3); -+ rfval = rfb0r1 | 0x1; -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 1, rfval); -+ rfval = rfb0r2 & (~0x33); -+ rfval = rfb0r2 | 0x11; -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, rfval); -+ rfval = rfb0r42 & (~0x50); -+ rfval = rfb0r42 | 0x10; -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, rfval); -+ -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001006); -+ udelay(1); -+ -+ bbpval = bbp1 & (~0x18); -+ bbpval = bbpval | 0x00; -+ rt2800_bbp_write(rt2x00dev, 1, bbpval); -+ -+ rt2800_bbp_dcoc_write(rt2x00dev, 1, 0x00); -+ } else { -+ rfval = rfb0r1 & (~0x3); -+ rfval = rfb0r1 | 0x2; -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 1, rfval); -+ rfval = rfb0r2 & (~0x33); -+ rfval = rfb0r2 | 0x22; -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, rfval); -+ rfval = rfb0r42 & (~0x50); -+ rfval = rfb0r42 | 0x40; -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, rfval); -+ -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00002006); -+ udelay(1); -+ -+ bbpval = bbp1 & (~0x18); -+ bbpval = bbpval | 0x08; -+ rt2800_bbp_write(rt2x00dev, 1, bbpval); -+ -+ rt2800_bbp_dcoc_write(rt2x00dev, 1, 0x01); -+ } -+ usleep_range(500, 1500); -+ -+ vga_idx = 0; -+ while (vga_idx < 11) { -+ rt2800_rfcsr_write_dccal(rt2x00dev, 3, rf_vga_table[vga_idx]); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 4, rf_vga_table[vga_idx]); -+ -+ rt2800_bbp_dcoc_write(rt2x00dev, 0, 0x93); -+ -+ for (i = 0; i < 10000; i++) { -+ bbpval = rt2800_bbp_read(rt2x00dev, 159); -+ if ((bbpval & 0xff) == 0x93) -+ usleep_range(50, 100); -+ else -+ break; -+ } -+ -+ if ((bbpval & 0xff) == 0x93) { -+ rt2x00_warn(rt2x00dev, "Fatal Error: Calibration doesn't finish"); -+ goto restore_value; -+ } -+ for (i = 0; i < 5; i++) { -+ u32 bbptemp = 0; -+ u8 value = 0; -+ int result = 0; -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x1e); -+ rt2800_bbp_write(rt2x00dev, 159, i); -+ rt2800_bbp_write(rt2x00dev, 158, 0x22); -+ value = rt2800_bbp_read(rt2x00dev, 159); -+ bbptemp = bbptemp + (value << 24); -+ rt2800_bbp_write(rt2x00dev, 158, 0x21); -+ value = rt2800_bbp_read(rt2x00dev, 159); -+ bbptemp = bbptemp + (value << 16); -+ rt2800_bbp_write(rt2x00dev, 158, 0x20); -+ value = rt2800_bbp_read(rt2x00dev, 159); -+ bbptemp = bbptemp + (value << 8); -+ rt2800_bbp_write(rt2x00dev, 158, 0x1f); -+ value = rt2800_bbp_read(rt2x00dev, 159); -+ bbptemp = bbptemp + value; -+ -+ if (i < 2 && (bbptemp & 0x800000)) -+ result = (bbptemp & 0xffffff) - 0x1000000; -+ else if (i == 4) -+ result = bbptemp; -+ else -+ result = bbptemp; -+ -+ if (i == 0) -+ mi = result / 4096; -+ else if (i == 1) -+ mq = result / 4096; -+ else if (i == 2) -+ si = bbptemp / 4096; -+ else if (i == 3) -+ sq = bbptemp / 4096; -+ else -+ riq = result / 4096; -+ } -+ -+ bbpval1 = si - mi * mi; -+ rt2x00_dbg(rt2x00dev, -+ "RXIQ si=%d, sq=%d, riq=%d, bbpval %d, vga_idx %d", -+ si, sq, riq, bbpval1, vga_idx); -+ -+ if (bbpval1 >= (100 * 100)) -+ break; -+ -+ if (bbpval1 <= 100) -+ vga_idx = vga_idx + 9; -+ else if (bbpval1 <= 158) -+ vga_idx = vga_idx + 8; -+ else if (bbpval1 <= 251) -+ vga_idx = vga_idx + 7; -+ else if (bbpval1 <= 398) -+ vga_idx = vga_idx + 6; -+ else if (bbpval1 <= 630) -+ vga_idx = vga_idx + 5; -+ else if (bbpval1 <= 1000) -+ vga_idx = vga_idx + 4; -+ else if (bbpval1 <= 1584) -+ vga_idx = vga_idx + 3; -+ else if (bbpval1 <= 2511) -+ vga_idx = vga_idx + 2; -+ else -+ vga_idx = vga_idx + 1; -+ } -+ -+ sigma_i = rt2800_do_sqrt_accumulation(100 * (si - mi * mi)); -+ sigma_q = rt2800_do_sqrt_accumulation(100 * (sq - mq * mq)); -+ r_iq = 10 * (riq - (mi * mq)); -+ -+ rt2x00_dbg(rt2x00dev, "Sigma_i=%d, Sigma_q=%d, R_iq=%d", sigma_i, sigma_q, r_iq); -+ -+ if (sigma_i <= 1400 && sigma_i >= 1000 && -+ (sigma_i - sigma_q) <= 112 && -+ (sigma_i - sigma_q) >= -112 && -+ mi <= 32 && mi >= -32 && -+ mq <= 32 && mq >= -32) { -+ r_iq = 10 * (riq - (mi * mq)); -+ rt2x00_dbg(rt2x00dev, "RXIQ Sigma_i=%d, Sigma_q=%d, R_iq=%d\n", -+ sigma_i, sigma_q, r_iq); -+ -+ g_rx = (1000 * sigma_q) / sigma_i; -+ g_imb = ((-2) * 128 * (1000 - g_rx)) / (1000 + g_rx); -+ ph_rx = (r_iq * 2292) / (sigma_i * sigma_q); -+ -+ if (ph_rx > 20 || ph_rx < -20) { -+ ph_rx = 0; -+ rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL"); -+ } -+ -+ if (g_imb > 12 || g_imb < -12) { -+ g_imb = 0; -+ rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL"); -+ } -+ } else { -+ g_imb = 0; -+ ph_rx = 0; -+ rt2x00_dbg(rt2x00dev, "RXIQ Sigma_i=%d, Sigma_q=%d, R_iq=%d\n", -+ sigma_i, sigma_q, r_iq); -+ rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL"); -+ } -+ -+ if (ch_idx == 0) { -+ rt2800_bbp_write(rt2x00dev, 158, 0x37); -+ rt2800_bbp_write(rt2x00dev, 159, g_imb & 0x3f); -+ rt2800_bbp_write(rt2x00dev, 158, 0x35); -+ rt2800_bbp_write(rt2x00dev, 159, ph_rx & 0x3f); -+ } else { -+ rt2800_bbp_write(rt2x00dev, 158, 0x55); -+ rt2800_bbp_write(rt2x00dev, 159, g_imb & 0x3f); -+ rt2800_bbp_write(rt2x00dev, 158, 0x53); -+ rt2800_bbp_write(rt2x00dev, 159, ph_rx & 0x3f); -+ } -+ } -+ -+restore_value: -+ rt2800_bbp_write(rt2x00dev, 158, 0x3); -+ bbpval = rt2800_bbp_read(rt2x00dev, 159); -+ rt2800_bbp_write(rt2x00dev, 159, (bbpval | 0x07)); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x00); -+ rt2800_bbp_write(rt2x00dev, 159, 0x00); -+ rt2800_bbp_write(rt2x00dev, 1, bbp1); -+ rt2800_bbp_write(rt2x00dev, 4, bbp4); -+ rt2800_bbp_write(rt2x00dev, 241, bbpr241); -+ rt2800_bbp_write(rt2x00dev, 242, bbpr242); -+ -+ rt2800_bbp_write(rt2x00dev, 244, 0x00); -+ bbpval = rt2800_bbp_read(rt2x00dev, 21); -+ bbpval |= 0x1; -+ rt2800_bbp_write(rt2x00dev, 21, bbpval); -+ usleep_range(10, 200); -+ bbpval &= 0xfe; -+ rt2800_bbp_write(rt2x00dev, 21, bbpval); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 1, rfb0r1); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, rfb0r2); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, rfb0r42); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 0, rfb4r0); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 19, rfb4r19); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, rfb5r3); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, rfb5r4); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, rfb5r17); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, rfb5r18); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, rfb5r19); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, rfb5r20); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 0, rfb6r0); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 19, rfb6r19); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 3, rfb7r3); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 4, rfb7r4); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 17, rfb7r17); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 18, rfb7r18); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 19, rfb7r19); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 20, rfb7r20); -+ -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00000006); -+ udelay(1); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00000004); -+ udelay(1); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, orig_RF_CONTROL0); -+ udelay(1); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, orig_RF_BYPASS0); -+ rt2800_register_write(rt2x00dev, RF_CONTROL1, orig_RF_CONTROL1); -+ rt2800_register_write(rt2x00dev, RF_BYPASS1, orig_RF_BYPASS1); -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, orig_RF_CONTROL3); -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, orig_RF_BYPASS3); -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl); -+} -+ - static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, - bool set_bw, bool is_ht40) - { -@@ -9304,6 +9678,7 @@ static void rt2800_init_rfcsr_6352(struc - rt2800_rxdcoc_calibration(rt2x00dev); - rt2800_bw_filter_calibration(rt2x00dev, true); - rt2800_bw_filter_calibration(rt2x00dev, false); -+ rt2800_rxiq_calibration(rt2x00dev); - } - - static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) diff --git a/package/kernel/mac80211/patches/rt2x00/010-rt2x00-add-TX-LOFT-calibration-for-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/010-rt2x00-add-TX-LOFT-calibration-for-MT7620.patch deleted file mode 100644 index 092d91afb6..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/010-rt2x00-add-TX-LOFT-calibration-for-MT7620.patch +++ /dev/null @@ -1,982 +0,0 @@ -From patchwork Sat Sep 17 20:28:43 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 8bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12979251 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Sat, 17 Sep 2022 21:28:43 +0100 -From: Daniel Golle -To: linux-wireless@vger.kernel.org, Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg -Subject: [PATCH v3 10/16] rt2x00: add TX LOFT calibration for MT7620 -Message-ID: - -References: -MIME-Version: 1.0 -Content-Disposition: inline -In-Reply-To: -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -From: Tomislav Požega - -Add TX LOFT calibration from mtk driver. - -Signed-off-by: Tomislav Požega -Signed-off-by: Daniel Golle ---- -v2: use helper functions, make tables static const, remove useless - debug prints -v3: don't export function not used anywhere else -Reported-by: kernel test robot - - .../net/wireless/ralink/rt2x00/rt2800lib.c | 902 ++++++++++++++++++ - .../net/wireless/ralink/rt2x00/rt2800lib.h | 10 + - 2 files changed, 912 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -9066,6 +9066,907 @@ restore_value: - rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl); - } - -+static void rt2800_rf_configstore(struct rt2x00_dev *rt2x00dev, -+ struct rf_reg_pair rf_reg_record[][13], u8 chain) -+{ -+ u8 rfvalue = 0; -+ -+ if (chain == CHAIN_0) { -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 0, 1); -+ rf_reg_record[CHAIN_0][0].bank = 0; -+ rf_reg_record[CHAIN_0][0].reg = 1; -+ rf_reg_record[CHAIN_0][0].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 0, 2); -+ rf_reg_record[CHAIN_0][1].bank = 0; -+ rf_reg_record[CHAIN_0][1].reg = 2; -+ rf_reg_record[CHAIN_0][1].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 0, 35); -+ rf_reg_record[CHAIN_0][2].bank = 0; -+ rf_reg_record[CHAIN_0][2].reg = 35; -+ rf_reg_record[CHAIN_0][2].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 0, 42); -+ rf_reg_record[CHAIN_0][3].bank = 0; -+ rf_reg_record[CHAIN_0][3].reg = 42; -+ rf_reg_record[CHAIN_0][3].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 4, 0); -+ rf_reg_record[CHAIN_0][4].bank = 4; -+ rf_reg_record[CHAIN_0][4].reg = 0; -+ rf_reg_record[CHAIN_0][4].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 4, 2); -+ rf_reg_record[CHAIN_0][5].bank = 4; -+ rf_reg_record[CHAIN_0][5].reg = 2; -+ rf_reg_record[CHAIN_0][5].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 4, 34); -+ rf_reg_record[CHAIN_0][6].bank = 4; -+ rf_reg_record[CHAIN_0][6].reg = 34; -+ rf_reg_record[CHAIN_0][6].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 5, 3); -+ rf_reg_record[CHAIN_0][7].bank = 5; -+ rf_reg_record[CHAIN_0][7].reg = 3; -+ rf_reg_record[CHAIN_0][7].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4); -+ rf_reg_record[CHAIN_0][8].bank = 5; -+ rf_reg_record[CHAIN_0][8].reg = 4; -+ rf_reg_record[CHAIN_0][8].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 5, 17); -+ rf_reg_record[CHAIN_0][9].bank = 5; -+ rf_reg_record[CHAIN_0][9].reg = 17; -+ rf_reg_record[CHAIN_0][9].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 5, 18); -+ rf_reg_record[CHAIN_0][10].bank = 5; -+ rf_reg_record[CHAIN_0][10].reg = 18; -+ rf_reg_record[CHAIN_0][10].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 5, 19); -+ rf_reg_record[CHAIN_0][11].bank = 5; -+ rf_reg_record[CHAIN_0][11].reg = 19; -+ rf_reg_record[CHAIN_0][11].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 5, 20); -+ rf_reg_record[CHAIN_0][12].bank = 5; -+ rf_reg_record[CHAIN_0][12].reg = 20; -+ rf_reg_record[CHAIN_0][12].value = rfvalue; -+ } else if (chain == CHAIN_1) { -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 0, 1); -+ rf_reg_record[CHAIN_1][0].bank = 0; -+ rf_reg_record[CHAIN_1][0].reg = 1; -+ rf_reg_record[CHAIN_1][0].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 0, 2); -+ rf_reg_record[CHAIN_1][1].bank = 0; -+ rf_reg_record[CHAIN_1][1].reg = 2; -+ rf_reg_record[CHAIN_1][1].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 0, 35); -+ rf_reg_record[CHAIN_1][2].bank = 0; -+ rf_reg_record[CHAIN_1][2].reg = 35; -+ rf_reg_record[CHAIN_1][2].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 0, 42); -+ rf_reg_record[CHAIN_1][3].bank = 0; -+ rf_reg_record[CHAIN_1][3].reg = 42; -+ rf_reg_record[CHAIN_1][3].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 6, 0); -+ rf_reg_record[CHAIN_1][4].bank = 6; -+ rf_reg_record[CHAIN_1][4].reg = 0; -+ rf_reg_record[CHAIN_1][4].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 6, 2); -+ rf_reg_record[CHAIN_1][5].bank = 6; -+ rf_reg_record[CHAIN_1][5].reg = 2; -+ rf_reg_record[CHAIN_1][5].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 6, 34); -+ rf_reg_record[CHAIN_1][6].bank = 6; -+ rf_reg_record[CHAIN_1][6].reg = 34; -+ rf_reg_record[CHAIN_1][6].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 7, 3); -+ rf_reg_record[CHAIN_1][7].bank = 7; -+ rf_reg_record[CHAIN_1][7].reg = 3; -+ rf_reg_record[CHAIN_1][7].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 7, 4); -+ rf_reg_record[CHAIN_1][8].bank = 7; -+ rf_reg_record[CHAIN_1][8].reg = 4; -+ rf_reg_record[CHAIN_1][8].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 7, 17); -+ rf_reg_record[CHAIN_1][9].bank = 7; -+ rf_reg_record[CHAIN_1][9].reg = 17; -+ rf_reg_record[CHAIN_1][9].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 7, 18); -+ rf_reg_record[CHAIN_1][10].bank = 7; -+ rf_reg_record[CHAIN_1][10].reg = 18; -+ rf_reg_record[CHAIN_1][10].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 7, 19); -+ rf_reg_record[CHAIN_1][11].bank = 7; -+ rf_reg_record[CHAIN_1][11].reg = 19; -+ rf_reg_record[CHAIN_1][11].value = rfvalue; -+ rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 7, 20); -+ rf_reg_record[CHAIN_1][12].bank = 7; -+ rf_reg_record[CHAIN_1][12].reg = 20; -+ rf_reg_record[CHAIN_1][12].value = rfvalue; -+ } else { -+ rt2x00_warn(rt2x00dev, "Unknown chain = %u\n", chain); -+ } -+} -+ -+static void rt2800_rf_configrecover(struct rt2x00_dev *rt2x00dev, -+ struct rf_reg_pair rf_record[][13]) -+{ -+ u8 chain_index = 0, record_index = 0; -+ u8 bank = 0, rf_register = 0, value = 0; -+ -+ for (chain_index = 0; chain_index < 2; chain_index++) { -+ for (record_index = 0; record_index < 13; record_index++) { -+ bank = rf_record[chain_index][record_index].bank; -+ rf_register = rf_record[chain_index][record_index].reg; -+ value = rf_record[chain_index][record_index].value; -+ rt2800_rfcsr_write_bank(rt2x00dev, bank, rf_register, value); -+ rt2x00_dbg(rt2x00dev, "bank: %d, rf_register: %d, value: %x\n", -+ bank, rf_register, value); -+ } -+ } -+} -+ -+static void rt2800_setbbptonegenerator(struct rt2x00_dev *rt2x00dev) -+{ -+ rt2800_bbp_write(rt2x00dev, 158, 0xAA); -+ rt2800_bbp_write(rt2x00dev, 159, 0x00); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xAB); -+ rt2800_bbp_write(rt2x00dev, 159, 0x0A); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xAC); -+ rt2800_bbp_write(rt2x00dev, 159, 0x3F); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xAD); -+ rt2800_bbp_write(rt2x00dev, 159, 0x3F); -+ -+ rt2800_bbp_write(rt2x00dev, 244, 0x40); -+} -+ -+static u32 rt2800_do_fft_accumulation(struct rt2x00_dev *rt2x00dev, u8 tidx, u8 read_neg) -+{ -+ u32 macvalue = 0; -+ int fftout_i = 0, fftout_q = 0; -+ u32 ptmp = 0, pint = 0; -+ u8 bbp = 0; -+ u8 tidxi; -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x00); -+ rt2800_bbp_write(rt2x00dev, 159, 0x9b); -+ -+ bbp = 0x9b; -+ -+ while (bbp == 0x9b) { -+ usleep_range(10, 50); -+ bbp = rt2800_bbp_read(rt2x00dev, 159); -+ bbp = bbp & 0xff; -+ } -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xba); -+ rt2800_bbp_write(rt2x00dev, 159, tidx); -+ rt2800_bbp_write(rt2x00dev, 159, tidx); -+ rt2800_bbp_write(rt2x00dev, 159, tidx); -+ -+ macvalue = rt2800_register_read(rt2x00dev, 0x057C); -+ -+ fftout_i = (macvalue >> 16); -+ fftout_i = (fftout_i & 0x8000) ? (fftout_i - 0x10000) : fftout_i; -+ fftout_q = (macvalue & 0xffff); -+ fftout_q = (fftout_q & 0x8000) ? (fftout_q - 0x10000) : fftout_q; -+ ptmp = (fftout_i * fftout_i); -+ ptmp = ptmp + (fftout_q * fftout_q); -+ pint = ptmp; -+ rt2x00_dbg(rt2x00dev, "I = %d, Q = %d, power = %x\n", fftout_i, fftout_q, pint); -+ if (read_neg) { -+ pint = pint >> 1; -+ tidxi = 0x40 - tidx; -+ tidxi = tidxi & 0x3f; -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xba); -+ rt2800_bbp_write(rt2x00dev, 159, tidxi); -+ rt2800_bbp_write(rt2x00dev, 159, tidxi); -+ rt2800_bbp_write(rt2x00dev, 159, tidxi); -+ -+ macvalue = rt2800_register_read(rt2x00dev, 0x057C); -+ -+ fftout_i = (macvalue >> 16); -+ fftout_i = (fftout_i & 0x8000) ? (fftout_i - 0x10000) : fftout_i; -+ fftout_q = (macvalue & 0xffff); -+ fftout_q = (fftout_q & 0x8000) ? (fftout_q - 0x10000) : fftout_q; -+ ptmp = (fftout_i * fftout_i); -+ ptmp = ptmp + (fftout_q * fftout_q); -+ ptmp = ptmp >> 1; -+ pint = pint + ptmp; -+ } -+ -+ return pint; -+} -+ -+static u32 rt2800_read_fft_accumulation(struct rt2x00_dev *rt2x00dev, u8 tidx) -+{ -+ u32 macvalue = 0; -+ int fftout_i = 0, fftout_q = 0; -+ u32 ptmp = 0, pint = 0; -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xBA); -+ rt2800_bbp_write(rt2x00dev, 159, tidx); -+ rt2800_bbp_write(rt2x00dev, 159, tidx); -+ rt2800_bbp_write(rt2x00dev, 159, tidx); -+ -+ macvalue = rt2800_register_read(rt2x00dev, 0x057C); -+ -+ fftout_i = (macvalue >> 16); -+ fftout_i = (fftout_i & 0x8000) ? (fftout_i - 0x10000) : fftout_i; -+ fftout_q = (macvalue & 0xffff); -+ fftout_q = (fftout_q & 0x8000) ? (fftout_q - 0x10000) : fftout_q; -+ ptmp = (fftout_i * fftout_i); -+ ptmp = ptmp + (fftout_q * fftout_q); -+ pint = ptmp; -+ -+ return pint; -+} -+ -+static void rt2800_write_dc(struct rt2x00_dev *rt2x00dev, u8 ch_idx, u8 alc, u8 iorq, u8 dc) -+{ -+ u8 bbp = 0; -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xb0); -+ bbp = alc | 0x80; -+ rt2800_bbp_write(rt2x00dev, 159, bbp); -+ -+ if (ch_idx == 0) -+ bbp = (iorq == 0) ? 0xb1 : 0xb2; -+ else -+ bbp = (iorq == 0) ? 0xb8 : 0xb9; -+ -+ rt2800_bbp_write(rt2x00dev, 158, bbp); -+ bbp = dc; -+ rt2800_bbp_write(rt2x00dev, 159, bbp); -+} -+ -+static void rt2800_loft_search(struct rt2x00_dev *rt2x00dev, u8 ch_idx, -+ u8 alc_idx, u8 dc_result[][RF_ALC_NUM][2]) -+{ -+ u32 p0 = 0, p1 = 0, pf = 0; -+ char idx0 = 0, idx1 = 0; -+ u8 idxf[] = {0x00, 0x00}; -+ u8 ibit = 0x20; -+ u8 iorq; -+ char bidx; -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xb0); -+ rt2800_bbp_write(rt2x00dev, 159, 0x80); -+ -+ for (bidx = 5; bidx >= 0; bidx--) { -+ for (iorq = 0; iorq <= 1; iorq++) { -+ if (idxf[iorq] == 0x20) { -+ idx0 = 0x20; -+ p0 = pf; -+ } else { -+ idx0 = idxf[iorq] - ibit; -+ idx0 = idx0 & 0x3F; -+ rt2800_write_dc(rt2x00dev, ch_idx, 0, iorq, idx0); -+ p0 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0); -+ } -+ -+ idx1 = idxf[iorq] + (bidx == 5 ? 0 : ibit); -+ idx1 = idx1 & 0x3F; -+ rt2800_write_dc(rt2x00dev, ch_idx, 0, iorq, idx1); -+ p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0); -+ -+ rt2x00_dbg(rt2x00dev, "alc=%u, IorQ=%u, idx_final=%2x\n", -+ alc_idx, iorq, idxf[iorq]); -+ rt2x00_dbg(rt2x00dev, "p0=%x, p1=%x, pf=%x, idx_0=%x, idx_1=%x, ibit=%x\n", -+ p0, p1, pf, idx0, idx1, ibit); -+ -+ if (bidx != 5 && pf <= p0 && pf < p1) { -+ idxf[iorq] = idxf[iorq]; -+ } else if (p0 < p1) { -+ pf = p0; -+ idxf[iorq] = idx0 & 0x3F; -+ } else { -+ pf = p1; -+ idxf[iorq] = idx1 & 0x3F; -+ } -+ rt2x00_dbg(rt2x00dev, "IorQ=%u, idx_final[%u]:%x, pf:%8x\n", -+ iorq, iorq, idxf[iorq], pf); -+ -+ rt2800_write_dc(rt2x00dev, ch_idx, 0, iorq, idxf[iorq]); -+ } -+ ibit = ibit >> 1; -+ } -+ dc_result[ch_idx][alc_idx][0] = idxf[0]; -+ dc_result[ch_idx][alc_idx][1] = idxf[1]; -+} -+ -+static void rt2800_iq_search(struct rt2x00_dev *rt2x00dev, u8 ch_idx, u8 *ges, u8 *pes) -+{ -+ u32 p0 = 0, p1 = 0, pf = 0; -+ char perr = 0, gerr = 0, iq_err = 0; -+ char pef = 0, gef = 0; -+ char psta, pend; -+ char gsta, gend; -+ -+ u8 ibit = 0x20; -+ u8 first_search = 0x00, touch_neg_max = 0x00; -+ char idx0 = 0, idx1 = 0; -+ u8 gop; -+ u8 bbp = 0; -+ char bidx; -+ -+ for (bidx = 5; bidx >= 1; bidx--) { -+ for (gop = 0; gop < 2; gop++) { -+ if (gop == 1 || bidx < 4) { -+ if (gop == 0) -+ iq_err = gerr; -+ else -+ iq_err = perr; -+ -+ first_search = (gop == 0) ? (bidx == 3) : (bidx == 5); -+ touch_neg_max = (gop) ? ((iq_err & 0x0F) == 0x08) : -+ ((iq_err & 0x3F) == 0x20); -+ -+ if (touch_neg_max) { -+ p0 = pf; -+ idx0 = iq_err; -+ } else { -+ idx0 = iq_err - ibit; -+ bbp = (ch_idx == 0) ? ((gop == 0) ? 0x28 : 0x29) : -+ ((gop == 0) ? 0x46 : 0x47); -+ -+ rt2800_bbp_write(rt2x00dev, 158, bbp); -+ rt2800_bbp_write(rt2x00dev, 159, idx0); -+ -+ p0 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 1); -+ } -+ -+ idx1 = iq_err + (first_search ? 0 : ibit); -+ idx1 = (gop == 0) ? (idx1 & 0x0F) : (idx1 & 0x3F); -+ -+ bbp = (ch_idx == 0) ? (gop == 0) ? 0x28 : 0x29 : -+ (gop == 0) ? 0x46 : 0x47; -+ -+ rt2800_bbp_write(rt2x00dev, 158, bbp); -+ rt2800_bbp_write(rt2x00dev, 159, idx1); -+ -+ p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 1); -+ -+ rt2x00_dbg(rt2x00dev, -+ "p0=%x, p1=%x, pwer_final=%x, idx0=%x, idx1=%x, iq_err=%x, gop=%d, ibit=%x\n", -+ p0, p1, pf, idx0, idx1, iq_err, gop, ibit); -+ -+ if (!(!first_search && pf <= p0 && pf < p1)) { -+ if (p0 < p1) { -+ pf = p0; -+ iq_err = idx0; -+ } else { -+ pf = p1; -+ iq_err = idx1; -+ } -+ } -+ -+ bbp = (ch_idx == 0) ? (gop == 0) ? 0x28 : 0x29 : -+ (gop == 0) ? 0x46 : 0x47; -+ -+ rt2800_bbp_write(rt2x00dev, 158, bbp); -+ rt2800_bbp_write(rt2x00dev, 159, iq_err); -+ -+ if (gop == 0) -+ gerr = iq_err; -+ else -+ perr = iq_err; -+ -+ rt2x00_dbg(rt2x00dev, "IQCalibration pf=%8x (%2x, %2x) !\n", -+ pf, gerr & 0x0F, perr & 0x3F); -+ } -+ } -+ -+ if (bidx > 0) -+ ibit = (ibit >> 1); -+ } -+ gerr = (gerr & 0x08) ? (gerr & 0x0F) - 0x10 : (gerr & 0x0F); -+ perr = (perr & 0x20) ? (perr & 0x3F) - 0x40 : (perr & 0x3F); -+ -+ gerr = (gerr < -0x07) ? -0x07 : (gerr > 0x05) ? 0x05 : gerr; -+ gsta = gerr - 1; -+ gend = gerr + 2; -+ -+ perr = (perr < -0x1f) ? -0x1f : (perr > 0x1d) ? 0x1d : perr; -+ psta = perr - 1; -+ pend = perr + 2; -+ -+ for (gef = gsta; gef <= gend; gef = gef + 1) -+ for (pef = psta; pef <= pend; pef = pef + 1) { -+ bbp = (ch_idx == 0) ? 0x28 : 0x46; -+ rt2800_bbp_write(rt2x00dev, 158, bbp); -+ rt2800_bbp_write(rt2x00dev, 159, gef & 0x0F); -+ -+ bbp = (ch_idx == 0) ? 0x29 : 0x47; -+ rt2800_bbp_write(rt2x00dev, 158, bbp); -+ rt2800_bbp_write(rt2x00dev, 159, pef & 0x3F); -+ -+ p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 1); -+ if (gef == gsta && pef == psta) { -+ pf = p1; -+ gerr = gef; -+ perr = pef; -+ } else if (pf > p1) { -+ pf = p1; -+ gerr = gef; -+ perr = pef; -+ } -+ rt2x00_dbg(rt2x00dev, "Fine IQCalibration p1=%8x pf=%8x (%2x, %2x) !\n", -+ p1, pf, gef & 0x0F, pef & 0x3F); -+ } -+ -+ ges[ch_idx] = gerr & 0x0F; -+ pes[ch_idx] = perr & 0x3F; -+} -+ -+static void rt2800_rf_aux_tx0_loopback(struct rt2x00_dev *rt2x00dev) -+{ -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 1, 0x21); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, 0x10); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 35, 0x00); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, 0x1b); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 0, 0x81); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 2, 0x81); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 34, 0xee); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, 0x2d); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, 0x2d); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, 0x80); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0xd7); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0xa2); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x20); -+} -+ -+static void rt2800_rf_aux_tx1_loopback(struct rt2x00_dev *rt2x00dev) -+{ -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 1, 0x22); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, 0x20); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 35, 0x00); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, 0x4b); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 0, 0x81); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 2, 0x81); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 34, 0xee); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 3, 0x2d); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 4, 0x2d); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 17, 0x80); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 18, 0xd7); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 19, 0xa2); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 20, 0x20); -+} -+ -+static void rt2800_loft_iq_calibration(struct rt2x00_dev *rt2x00dev) -+{ -+ struct rf_reg_pair rf_store[CHAIN_NUM][13]; -+ u32 macorg1 = 0; -+ u32 macorg2 = 0; -+ u32 macorg3 = 0; -+ u32 macorg4 = 0; -+ u32 macorg5 = 0; -+ u32 orig528 = 0; -+ u32 orig52c = 0; -+ -+ u32 savemacsysctrl = 0; -+ u32 macvalue = 0; -+ u32 mac13b8 = 0; -+ u32 p0 = 0, p1 = 0; -+ u32 p0_idx10 = 0, p1_idx10 = 0; -+ -+ u8 rfvalue; -+ u8 loft_dc_search_result[CHAIN_NUM][RF_ALC_NUM][2]; -+ u8 ger[CHAIN_NUM], per[CHAIN_NUM]; -+ -+ u8 vga_gain[] = {14, 14}; -+ u8 bbp = 0, ch_idx = 0, rf_alc_idx = 0, idx = 0; -+ u8 bbpr30, rfb0r39, rfb0r42; -+ u8 bbpr1; -+ u8 bbpr4; -+ u8 bbpr241, bbpr242; -+ u8 count_step; -+ -+ static const u8 rf_gain[] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x0c}; -+ static const u8 rfvga_gain_table[] = {0x24, 0x25, 0x26, 0x27, 0x28, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, -+ 0x31, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3F}; -+ static const u8 bbp_2324gain[] = {0x16, 0x14, 0x12, 0x10, 0x0c, 0x08}; -+ -+ savemacsysctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -+ macorg1 = rt2800_register_read(rt2x00dev, TX_PIN_CFG); -+ macorg2 = rt2800_register_read(rt2x00dev, RF_CONTROL0); -+ macorg3 = rt2800_register_read(rt2x00dev, RF_BYPASS0); -+ macorg4 = rt2800_register_read(rt2x00dev, RF_CONTROL3); -+ macorg5 = rt2800_register_read(rt2x00dev, RF_BYPASS3); -+ mac13b8 = rt2800_register_read(rt2x00dev, 0x13b8); -+ orig528 = rt2800_register_read(rt2x00dev, RF_CONTROL2); -+ orig52c = rt2800_register_read(rt2x00dev, RF_BYPASS2); -+ -+ macvalue = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -+ macvalue &= (~0x04); -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, macvalue); -+ -+ if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_TX))) -+ rt2x00_warn(rt2x00dev, "RF TX busy in LOFT IQ calibration\n"); -+ -+ macvalue = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -+ macvalue &= (~0x08); -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, macvalue); -+ -+ if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_RX))) -+ rt2x00_warn(rt2x00dev, "RF RX busy in LOFT IQ calibration\n"); -+ -+ for (ch_idx = 0; ch_idx < 2; ch_idx++) -+ rt2800_rf_configstore(rt2x00dev, rf_store, ch_idx); -+ -+ bbpr30 = rt2800_bbp_read(rt2x00dev, 30); -+ rfb0r39 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 39); -+ rfb0r42 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 42); -+ -+ rt2800_bbp_write(rt2x00dev, 30, 0x1F); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 39, 0x80); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, 0x5B); -+ -+ rt2800_bbp_write(rt2x00dev, 23, 0x00); -+ rt2800_bbp_write(rt2x00dev, 24, 0x00); -+ -+ rt2800_setbbptonegenerator(rt2x00dev); -+ -+ for (ch_idx = 0; ch_idx < 2; ch_idx++) { -+ rt2800_bbp_write(rt2x00dev, 23, 0x00); -+ rt2800_bbp_write(rt2x00dev, 24, 0x00); -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00); -+ rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x0000000F); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00000004); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x00003306); -+ rt2800_register_write(rt2x00dev, 0x13b8, 0x10); -+ udelay(1); -+ -+ if (ch_idx == 0) -+ rt2800_rf_aux_tx0_loopback(rt2x00dev); -+ else -+ rt2800_rf_aux_tx1_loopback(rt2x00dev); -+ -+ udelay(1); -+ -+ if (ch_idx == 0) -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001004); -+ else -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00002004); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x05); -+ rt2800_bbp_write(rt2x00dev, 159, 0x00); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x01); -+ if (ch_idx == 0) -+ rt2800_bbp_write(rt2x00dev, 159, 0x00); -+ else -+ rt2800_bbp_write(rt2x00dev, 159, 0x01); -+ -+ vga_gain[ch_idx] = 18; -+ for (rf_alc_idx = 0; rf_alc_idx < 3; rf_alc_idx++) { -+ rt2800_bbp_write(rt2x00dev, 23, bbp_2324gain[rf_alc_idx]); -+ rt2800_bbp_write(rt2x00dev, 24, bbp_2324gain[rf_alc_idx]); -+ -+ macvalue = rt2800_register_read(rt2x00dev, RF_CONTROL3); -+ macvalue &= (~0x0000F1F1); -+ macvalue |= (rf_gain[rf_alc_idx] << 4); -+ macvalue |= (rf_gain[rf_alc_idx] << 12); -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, macvalue); -+ macvalue = (0x0000F1F1); -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, macvalue); -+ -+ if (rf_alc_idx == 0) { -+ rt2800_write_dc(rt2x00dev, ch_idx, 0, 1, 0x21); -+ for (; vga_gain[ch_idx] > 0; -+ vga_gain[ch_idx] = vga_gain[ch_idx] - 2) { -+ rfvalue = rfvga_gain_table[vga_gain[ch_idx]]; -+ rt2800_rfcsr_write_dccal(rt2x00dev, 3, rfvalue); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 4, rfvalue); -+ rt2800_write_dc(rt2x00dev, ch_idx, 0, 1, 0x00); -+ rt2800_write_dc(rt2x00dev, ch_idx, 0, 0, 0x00); -+ p0 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0); -+ rt2800_write_dc(rt2x00dev, ch_idx, 0, 0, 0x21); -+ p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0); -+ rt2x00_dbg(rt2x00dev, "LOFT AGC %d %d\n", p0, p1); -+ if ((p0 < 7000 * 7000) && (p1 < (7000 * 7000))) -+ break; -+ } -+ -+ rt2800_write_dc(rt2x00dev, ch_idx, 0, 0, 0x00); -+ rt2800_write_dc(rt2x00dev, ch_idx, 0, 1, 0x00); -+ -+ rt2x00_dbg(rt2x00dev, "Used VGA %d %x\n", vga_gain[ch_idx], -+ rfvga_gain_table[vga_gain[ch_idx]]); -+ -+ if (vga_gain[ch_idx] < 0) -+ vga_gain[ch_idx] = 0; -+ } -+ -+ rfvalue = rfvga_gain_table[vga_gain[ch_idx]]; -+ -+ rt2800_rfcsr_write_dccal(rt2x00dev, 3, rfvalue); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 4, rfvalue); -+ -+ rt2800_loft_search(rt2x00dev, ch_idx, rf_alc_idx, loft_dc_search_result); -+ } -+ } -+ -+ for (rf_alc_idx = 0; rf_alc_idx < 3; rf_alc_idx++) { -+ for (idx = 0; idx < 4; idx++) { -+ rt2800_bbp_write(rt2x00dev, 158, 0xB0); -+ bbp = (idx << 2) + rf_alc_idx; -+ rt2800_bbp_write(rt2x00dev, 159, bbp); -+ rt2x00_dbg(rt2x00dev, " ALC %2x,", bbp); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xb1); -+ bbp = loft_dc_search_result[CHAIN_0][rf_alc_idx][0x00]; -+ bbp = bbp & 0x3F; -+ rt2800_bbp_write(rt2x00dev, 159, bbp); -+ rt2x00_dbg(rt2x00dev, " I0 %2x,", bbp); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xb2); -+ bbp = loft_dc_search_result[CHAIN_0][rf_alc_idx][0x01]; -+ bbp = bbp & 0x3F; -+ rt2800_bbp_write(rt2x00dev, 159, bbp); -+ rt2x00_dbg(rt2x00dev, " Q0 %2x,", bbp); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xb8); -+ bbp = loft_dc_search_result[CHAIN_1][rf_alc_idx][0x00]; -+ bbp = bbp & 0x3F; -+ rt2800_bbp_write(rt2x00dev, 159, bbp); -+ rt2x00_dbg(rt2x00dev, " I1 %2x,", bbp); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0xb9); -+ bbp = loft_dc_search_result[CHAIN_1][rf_alc_idx][0x01]; -+ bbp = bbp & 0x3F; -+ rt2800_bbp_write(rt2x00dev, 159, bbp); -+ rt2x00_dbg(rt2x00dev, " Q1 %2x\n", bbp); -+ } -+ } -+ -+ rt2800_bbp_write(rt2x00dev, 23, 0x00); -+ rt2800_bbp_write(rt2x00dev, 24, 0x00); -+ -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x04); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x00); -+ rt2800_bbp_write(rt2x00dev, 159, 0x00); -+ -+ bbp = 0x00; -+ rt2800_bbp_write(rt2x00dev, 244, 0x00); -+ -+ rt2800_bbp_write(rt2x00dev, 21, 0x01); -+ udelay(1); -+ rt2800_bbp_write(rt2x00dev, 21, 0x00); -+ -+ rt2800_rf_configrecover(rt2x00dev, rf_store); -+ -+ rt2800_register_write(rt2x00dev, TX_PIN_CFG, macorg1); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x04); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x00); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, macorg2); -+ udelay(1); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, macorg3); -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, macorg4); -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, macorg5); -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl); -+ rt2800_register_write(rt2x00dev, RF_CONTROL2, orig528); -+ rt2800_register_write(rt2x00dev, RF_BYPASS2, orig52c); -+ rt2800_register_write(rt2x00dev, 0x13b8, mac13b8); -+ -+ savemacsysctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -+ macorg1 = rt2800_register_read(rt2x00dev, TX_PIN_CFG); -+ macorg2 = rt2800_register_read(rt2x00dev, RF_CONTROL0); -+ macorg3 = rt2800_register_read(rt2x00dev, RF_BYPASS0); -+ macorg4 = rt2800_register_read(rt2x00dev, RF_CONTROL3); -+ macorg5 = rt2800_register_read(rt2x00dev, RF_BYPASS3); -+ -+ bbpr1 = rt2800_bbp_read(rt2x00dev, 1); -+ bbpr4 = rt2800_bbp_read(rt2x00dev, 4); -+ bbpr241 = rt2800_bbp_read(rt2x00dev, 241); -+ bbpr242 = rt2800_bbp_read(rt2x00dev, 242); -+ mac13b8 = rt2800_register_read(rt2x00dev, 0x13b8); -+ -+ macvalue = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -+ macvalue &= (~0x04); -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, macvalue); -+ -+ if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_TX))) -+ rt2x00_warn(rt2x00dev, "RF TX busy in LOFT IQ calibration\n"); -+ -+ macvalue = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -+ macvalue &= (~0x08); -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, macvalue); -+ -+ if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_RX))) -+ rt2x00_warn(rt2x00dev, "RF RX busy in LOFT IQ calibration\n"); -+ -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) { -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, 0x00000101); -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, 0x0000F1F1); -+ } -+ -+ rt2800_bbp_write(rt2x00dev, 23, 0x00); -+ rt2800_bbp_write(rt2x00dev, 24, 0x00); -+ -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) { -+ rt2800_bbp_write(rt2x00dev, 4, bbpr4 & (~0x18)); -+ rt2800_bbp_write(rt2x00dev, 21, 0x01); -+ udelay(1); -+ rt2800_bbp_write(rt2x00dev, 21, 0x00); -+ -+ rt2800_bbp_write(rt2x00dev, 241, 0x14); -+ rt2800_bbp_write(rt2x00dev, 242, 0x80); -+ rt2800_bbp_write(rt2x00dev, 244, 0x31); -+ } else { -+ rt2800_setbbptonegenerator(rt2x00dev); -+ } -+ -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00000004); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x00003306); -+ udelay(1); -+ -+ rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x0000000F); -+ -+ if (!test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) { -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, 0x00000000); -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, 0x0000F1F1); -+ } -+ -+ rt2800_register_write(rt2x00dev, 0x13b8, 0x00000010); -+ -+ for (ch_idx = 0; ch_idx < 2; ch_idx++) -+ rt2800_rf_configstore(rt2x00dev, rf_store, ch_idx); -+ -+ rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x3B); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x3B); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x03); -+ rt2800_bbp_write(rt2x00dev, 159, 0x60); -+ rt2800_bbp_write(rt2x00dev, 158, 0xB0); -+ rt2800_bbp_write(rt2x00dev, 159, 0x80); -+ -+ for (ch_idx = 0; ch_idx < 2; ch_idx++) { -+ rt2800_bbp_write(rt2x00dev, 23, 0x00); -+ rt2800_bbp_write(rt2x00dev, 24, 0x00); -+ -+ if (ch_idx == 0) { -+ rt2800_bbp_write(rt2x00dev, 158, 0x01); -+ rt2800_bbp_write(rt2x00dev, 159, 0x00); -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) { -+ bbp = bbpr1 & (~0x18); -+ bbp = bbp | 0x00; -+ rt2800_bbp_write(rt2x00dev, 1, bbp); -+ } -+ rt2800_rf_aux_tx0_loopback(rt2x00dev); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001004); -+ } else { -+ rt2800_bbp_write(rt2x00dev, 158, 0x01); -+ rt2800_bbp_write(rt2x00dev, 159, 0x01); -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX1, &rt2x00dev->cap_flags)) { -+ bbp = bbpr1 & (~0x18); -+ bbp = bbp | 0x08; -+ rt2800_bbp_write(rt2x00dev, 1, bbp); -+ } -+ rt2800_rf_aux_tx1_loopback(rt2x00dev); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00002004); -+ } -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x05); -+ rt2800_bbp_write(rt2x00dev, 159, 0x04); -+ -+ bbp = (ch_idx == 0) ? 0x28 : 0x46; -+ rt2800_bbp_write(rt2x00dev, 158, bbp); -+ rt2800_bbp_write(rt2x00dev, 159, 0x00); -+ -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) { -+ rt2800_bbp_write(rt2x00dev, 23, 0x06); -+ rt2800_bbp_write(rt2x00dev, 24, 0x06); -+ count_step = 1; -+ } else { -+ rt2800_bbp_write(rt2x00dev, 23, 0x1F); -+ rt2800_bbp_write(rt2x00dev, 24, 0x1F); -+ count_step = 2; -+ } -+ -+ for (; vga_gain[ch_idx] < 19; vga_gain[ch_idx] = (vga_gain[ch_idx] + count_step)) { -+ rfvalue = rfvga_gain_table[vga_gain[ch_idx]]; -+ rt2800_rfcsr_write_dccal(rt2x00dev, 3, rfvalue); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 4, rfvalue); -+ -+ bbp = (ch_idx == 0) ? 0x29 : 0x47; -+ rt2800_bbp_write(rt2x00dev, 158, bbp); -+ rt2800_bbp_write(rt2x00dev, 159, 0x00); -+ p0 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 0); -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) -+ p0_idx10 = rt2800_read_fft_accumulation(rt2x00dev, 0x0A); -+ -+ bbp = (ch_idx == 0) ? 0x29 : 0x47; -+ rt2800_bbp_write(rt2x00dev, 158, bbp); -+ rt2800_bbp_write(rt2x00dev, 159, 0x21); -+ p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 0); -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX1, &rt2x00dev->cap_flags)) -+ p1_idx10 = rt2800_read_fft_accumulation(rt2x00dev, 0x0A); -+ -+ rt2x00_dbg(rt2x00dev, "IQ AGC %d %d\n", p0, p1); -+ -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) { -+ rt2x00_dbg(rt2x00dev, "IQ AGC IDX 10 %d %d\n", p0_idx10, p1_idx10); -+ if ((p0_idx10 > 7000 * 7000) || (p1_idx10 > 7000 * 7000)) { -+ if (vga_gain[ch_idx] != 0) -+ vga_gain[ch_idx] = vga_gain[ch_idx] - 1; -+ break; -+ } -+ } -+ -+ if ((p0 > 2500 * 2500) || (p1 > 2500 * 2500)) -+ break; -+ } -+ -+ if (vga_gain[ch_idx] > 18) -+ vga_gain[ch_idx] = 18; -+ rt2x00_dbg(rt2x00dev, "Used VGA %d %x\n", vga_gain[ch_idx], -+ rfvga_gain_table[vga_gain[ch_idx]]); -+ -+ bbp = (ch_idx == 0) ? 0x29 : 0x47; -+ rt2800_bbp_write(rt2x00dev, 158, bbp); -+ rt2800_bbp_write(rt2x00dev, 159, 0x00); -+ -+ rt2800_iq_search(rt2x00dev, ch_idx, ger, per); -+ } -+ -+ rt2800_bbp_write(rt2x00dev, 23, 0x00); -+ rt2800_bbp_write(rt2x00dev, 24, 0x00); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x04); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x28); -+ bbp = ger[CHAIN_0] & 0x0F; -+ rt2800_bbp_write(rt2x00dev, 159, bbp); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x29); -+ bbp = per[CHAIN_0] & 0x3F; -+ rt2800_bbp_write(rt2x00dev, 159, bbp); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x46); -+ bbp = ger[CHAIN_1] & 0x0F; -+ rt2800_bbp_write(rt2x00dev, 159, bbp); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x47); -+ bbp = per[CHAIN_1] & 0x3F; -+ rt2800_bbp_write(rt2x00dev, 159, bbp); -+ -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) { -+ rt2800_bbp_write(rt2x00dev, 1, bbpr1); -+ rt2800_bbp_write(rt2x00dev, 241, bbpr241); -+ rt2800_bbp_write(rt2x00dev, 242, bbpr242); -+ } -+ rt2800_bbp_write(rt2x00dev, 244, 0x00); -+ -+ rt2800_bbp_write(rt2x00dev, 158, 0x00); -+ rt2800_bbp_write(rt2x00dev, 159, 0x00); -+ rt2800_bbp_write(rt2x00dev, 158, 0xB0); -+ rt2800_bbp_write(rt2x00dev, 159, 0x00); -+ -+ rt2800_bbp_write(rt2x00dev, 30, bbpr30); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 39, rfb0r39); -+ rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, rfb0r42); -+ -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) -+ rt2800_bbp_write(rt2x00dev, 4, bbpr4); -+ -+ rt2800_bbp_write(rt2x00dev, 21, 0x01); -+ udelay(1); -+ rt2800_bbp_write(rt2x00dev, 21, 0x00); -+ -+ rt2800_rf_configrecover(rt2x00dev, rf_store); -+ -+ rt2800_register_write(rt2x00dev, TX_PIN_CFG, macorg1); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x00); -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, macorg2); -+ udelay(1); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, macorg3); -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, macorg4); -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, macorg5); -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl); -+ rt2800_register_write(rt2x00dev, 0x13b8, mac13b8); -+} -+ - static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, - bool set_bw, bool is_ht40) - { -@@ -9678,6 +10579,7 @@ static void rt2800_init_rfcsr_6352(struc - rt2800_rxdcoc_calibration(rt2x00dev); - rt2800_bw_filter_calibration(rt2x00dev, true); - rt2800_bw_filter_calibration(rt2x00dev, false); -+ rt2800_loft_iq_calibration(rt2x00dev); - rt2800_rxiq_calibration(rt2x00dev); - } - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -17,6 +17,16 @@ - #define WCID_START 33 - #define WCID_END 222 - #define STA_IDS_SIZE (WCID_END - WCID_START + 2) -+#define CHAIN_0 0x0 -+#define CHAIN_1 0x1 -+#define RF_ALC_NUM 6 -+#define CHAIN_NUM 2 -+ -+struct rf_reg_pair { -+ u8 bank; -+ u8 reg; -+ u8 value; -+}; - - /* RT2800 driver data structure */ - struct rt2800_drv_data { diff --git a/package/kernel/mac80211/patches/rt2x00/011-rt2x00-move-helper-functions-up-in-file.patch b/package/kernel/mac80211/patches/rt2x00/011-rt2x00-move-helper-functions-up-in-file.patch deleted file mode 100644 index b07d449d6d..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/011-rt2x00-move-helper-functions-up-in-file.patch +++ /dev/null @@ -1,94 +0,0 @@ -From patchwork Sat Sep 17 20:28:58 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12979252 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Sat, 17 Sep 2022 21:28:58 +0100 -From: Daniel Golle -To: linux-wireless@vger.kernel.org, Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg -Subject: [PATCH v3 11/16] rt2x00: move helper functions up in file -Message-ID: - -References: -MIME-Version: 1.0 -Content-Disposition: inline -In-Reply-To: -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -Move register access helper functions up to the head of the file so -they can be used in all functions. - -Signed-off-by: Daniel Golle -Acked-by: Stanislaw Gruszka ---- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 40 +++++++++---------- - 1 file changed, 20 insertions(+), 20 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -198,6 +198,26 @@ static void rt2800_rfcsr_write_dccal(str - rt2800_rfcsr_write_bank(rt2x00dev, 7, reg, value); - } - -+static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev, -+ const u8 reg, const u8 value) -+{ -+ rt2800_bbp_write(rt2x00dev, 158, reg); -+ rt2800_bbp_write(rt2x00dev, 159, value); -+} -+ -+static u8 rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, const u8 reg) -+{ -+ rt2800_bbp_write(rt2x00dev, 158, reg); -+ return rt2800_bbp_read(rt2x00dev, 159); -+} -+ -+static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev, -+ const u8 reg, const u8 value) -+{ -+ rt2800_bbp_write(rt2x00dev, 195, reg); -+ rt2800_bbp_write(rt2x00dev, 196, value); -+} -+ - static u8 rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev, - const unsigned int word) - { -@@ -6972,26 +6992,6 @@ static void rt2800_init_bbp_5592(struct - rt2800_bbp_write(rt2x00dev, 103, 0xc0); - } - --static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev, -- const u8 reg, const u8 value) --{ -- rt2800_bbp_write(rt2x00dev, 195, reg); -- rt2800_bbp_write(rt2x00dev, 196, value); --} -- --static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev, -- const u8 reg, const u8 value) --{ -- rt2800_bbp_write(rt2x00dev, 158, reg); -- rt2800_bbp_write(rt2x00dev, 159, value); --} -- --static u8 rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, const u8 reg) --{ -- rt2800_bbp_write(rt2x00dev, 158, reg); -- return rt2800_bbp_read(rt2x00dev, 159); --} -- - static void rt2800_init_bbp_6352(struct rt2x00_dev *rt2x00dev) - { - u8 bbp; diff --git a/package/kernel/mac80211/patches/rt2x00/012-rt2x00-fix-HT20-HT40-bandwidth-switch-on-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/012-rt2x00-fix-HT20-HT40-bandwidth-switch-on-MT7620.patch deleted file mode 100644 index e989205ba2..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/012-rt2x00-fix-HT20-HT40-bandwidth-switch-on-MT7620.patch +++ /dev/null @@ -1,56 +0,0 @@ -From patchwork Sat Sep 17 20:29:13 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12979253 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Sat, 17 Sep 2022 21:29:13 +0100 -From: Daniel Golle -To: linux-wireless@vger.kernel.org, Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg -Subject: [PATCH v3 12/16] rt2x00: fix HT20/HT40 bandwidth switch on MT7620 -Message-ID: - <1664d89ba149f7b0bcec18b2a2abaedf49654507.1663445157.git.daniel@makrotopia.org> -References: -MIME-Version: 1.0 -Content-Disposition: inline -In-Reply-To: -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -Add missing configuration of the channel bandwidth filter to the -channel setup function for MT7620. - -Reported-by: Serge Vasilugin -Signed-off-by: Daniel Golle -Acked-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3855,6 +3855,14 @@ static void rt2800_config_channel_rf7620 - rfcsr |= tx_agc_fc; - rt2800_rfcsr_write_bank(rt2x00dev, 7, 59, rfcsr); - } -+ -+ if (conf_is_ht40(conf)) { -+ rt2800_bbp_glrt_write(rt2x00dev, 141, 0x10); -+ rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2f); -+ } else { -+ rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1a); -+ rt2800_bbp_glrt_write(rt2x00dev, 157, 0x40); -+ } - } - - static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev, diff --git a/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch b/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch index ba16e85510..ab0fa3670d 100644 --- a/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch +++ b/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch @@ -1,6 +1,6 @@ --- a/local-symbols +++ b/local-symbols -@@ -345,6 +345,7 @@ RT2X00_LIB_FIRMWARE= +@@ -347,6 +347,7 @@ RT2X00_LIB_FIRMWARE= RT2X00_LIB_CRYPTO= RT2X00_LIB_LEDS= RT2X00_LIB_DEBUGFS= @@ -95,7 +95,7 @@ /* Firmware functions */ static char *rt2800soc_get_firmware_name(struct rt2x00_dev *rt2x00dev) { -@@ -167,7 +154,6 @@ static const struct rt2800_ops rt2800soc +@@ -168,7 +155,6 @@ static const struct rt2800_ops rt2800soc .register_multiread = rt2x00mmio_register_multiread, .register_multiwrite = rt2x00mmio_register_multiwrite, .regbusy_read = rt2x00mmio_regbusy_read, diff --git a/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch b/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch index 38f8b77176..8964f8bf10 100644 --- a/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch +++ b/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch @@ -13,7 +13,7 @@ Signed-off-by: John Crispin --- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -@@ -224,10 +224,17 @@ static int rt2800soc_probe(struct platfo +@@ -225,10 +225,17 @@ static int rt2800soc_probe(struct platfo return rt2x00soc_probe(pdev, &rt2800soc_ops); } diff --git a/package/kernel/mac80211/patches/rt2x00/995-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch b/package/kernel/mac80211/patches/rt2x00/995-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch index 76114fe9ae..97a56de2b3 100644 --- a/package/kernel/mac80211/patches/rt2x00/995-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch +++ b/package/kernel/mac80211/patches/rt2x00/995-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch @@ -50,8 +50,8 @@ + static const struct ieee80211_ops rt2800pci_mac80211_ops = { .tx = rt2x00mac_tx, - .start = rt2x00mac_start, -@@ -328,6 +332,9 @@ static const struct rt2800_ops rt2800pci + .wake_tx_queue = ieee80211_handle_wake_tx_queue, +@@ -329,6 +333,9 @@ static const struct rt2800_ops rt2800pci .drv_init_registers = rt2800mmio_init_registers, .drv_get_txwi = rt2800mmio_get_txwi, .drv_get_dma_done = rt2800mmio_get_dma_done, @@ -103,8 +103,8 @@ + static const struct ieee80211_ops rt2800soc_mac80211_ops = { .tx = rt2x00mac_tx, - .start = rt2x00mac_start, -@@ -159,6 +186,9 @@ static const struct rt2800_ops rt2800soc + .wake_tx_queue = ieee80211_handle_wake_tx_queue, +@@ -160,6 +187,9 @@ static const struct rt2800_ops rt2800soc .drv_init_registers = rt2800mmio_init_registers, .drv_get_txwi = rt2800mmio_get_txwi, .drv_get_dma_done = rt2800mmio_get_dma_done, @@ -126,8 +126,8 @@ + static const struct ieee80211_ops rt2800usb_mac80211_ops = { .tx = rt2x00mac_tx, - .start = rt2x00mac_start, -@@ -671,6 +675,9 @@ static const struct rt2800_ops rt2800usb + .wake_tx_queue = ieee80211_handle_wake_tx_queue, +@@ -672,6 +676,9 @@ static const struct rt2800_ops rt2800usb .drv_init_registers = rt2800usb_init_registers, .drv_get_txwi = rt2800usb_get_txwi, .drv_get_dma_done = rt2800usb_get_dma_done, diff --git a/package/kernel/mac80211/patches/rt2x00/998-wifi-rt2x00-rework-MT7620-PA-LNA-RF-calibration.patch b/package/kernel/mac80211/patches/rt2x00/998-wifi-rt2x00-rework-MT7620-PA-LNA-RF-calibration.patch new file mode 100644 index 0000000000..5f6f5140d9 --- /dev/null +++ b/package/kernel/mac80211/patches/rt2x00/998-wifi-rt2x00-rework-MT7620-PA-LNA-RF-calibration.patch @@ -0,0 +1,413 @@ +From: Shiji Yang +Date: Tue, 25 Jul 2023 20:05:06 +0800 +Subject: [PATCH] wifi: rt2x00: rework MT7620 PA/LNA RF calibration + +1. Move MT7620 PA/LNA calibration code to dedicated functions. +2. For external PA/LNA devices, restore RF and BBP registers before + R-Calibration. +3. Do Rx DCOC calibration again before RXIQ calibration. +4. Correct MAC_SYS_CTRL register RX mask to 0x08 in R-Calibration + function. For MAC_SYS_CTRL register, Bit[2] controls MAC_TX_EN + and Bit[3] controls MAC_RX_EN (Bit index starts from 0). +5. Move the channel configuration code from rt2800_vco_calibration() + to the rt2800_config_channel(). +6. Use MT7620 SOC specific AGC initial LNA value instead of the + RT5592's value. +7. Adjust the register operation sequence according to the vendor + driver code. This may not be useful, but it can make things + clearer when developers try to review it. + +Signed-off-by: Shiji Yang +--- + .../net/wireless/ralink/rt2x00/rt2800lib.c | 306 ++++++++++-------- + drivers/net/wireless/ralink/rt2x00/rt2x00.h | 6 + + 2 files changed, 182 insertions(+), 130 deletions(-) + +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -3881,14 +3881,6 @@ static void rt2800_config_channel_rf7620 + rfcsr |= tx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 7, 59, rfcsr); + } +- +- if (conf_is_ht40(conf)) { +- rt2800_bbp_glrt_write(rt2x00dev, 141, 0x10); +- rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2f); +- } else { +- rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1a); +- rt2800_bbp_glrt_write(rt2x00dev, 157, 0x40); +- } + } + + static void rt2800_config_alc_rt6352(struct rt2x00_dev *rt2x00dev, +@@ -4457,89 +4449,63 @@ static void rt2800_config_channel(struct + usleep_range(1000, 1500); + } + +- if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) { ++ if (rt2x00_rt(rt2x00dev, RT5592)) { + reg = 0x10; +- if (!conf_is_ht40(conf)) { +- if (rt2x00_rt(rt2x00dev, RT6352) && +- rt2x00_has_cap_external_lna_bg(rt2x00dev)) { +- reg |= 0x5; +- } else { +- reg |= 0xa; +- } +- } ++ if (!conf_is_ht40(conf)) ++ reg |= 0xa; + rt2800_bbp_write(rt2x00dev, 195, 141); + rt2800_bbp_write(rt2x00dev, 196, reg); + +- /* AGC init. +- * Despite the vendor driver using different values here for +- * RT6352 chip, we use 0x1c for now. This may have to be changed +- * once TSSI got implemented. +- */ + reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2*rt2x00dev->lna_gain; + rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); +- +- if (rt2x00_rt(rt2x00dev, RT5592)) +- rt2800_iq_calibrate(rt2x00dev, rf->channel); ++ ++ rt2800_iq_calibrate(rt2x00dev, rf->channel); + } + + if (rt2x00_rt(rt2x00dev, RT6352)) { +- if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, +- &rt2x00dev->cap_flags)) { +- reg = rt2800_register_read(rt2x00dev, RF_CONTROL3); +- reg |= 0x00000101; +- rt2800_register_write(rt2x00dev, RF_CONTROL3, reg); +- +- reg = rt2800_register_read(rt2x00dev, RF_BYPASS3); +- reg |= 0x00000101; +- rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); +- +- rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0x73); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0x73); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0x73); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0xC8); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xA4); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x05); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xC8); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xA4); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x05); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x27); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0xC8); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xA4); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x05); +- rt2800_rfcsr_write_dccal(rt2x00dev, 05, 0x00); ++ /* BBP for GLRT BW */ ++ if (conf_is_ht40(conf)) { ++ rt2800_bbp_glrt_write(rt2x00dev, 141, 0x10); ++ rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2f); ++ } else { ++ rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1a); ++ rt2800_bbp_glrt_write(rt2x00dev, 157, 0x40); + +- rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, +- 0x36303636); +- rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, +- 0x6C6C6B6C); +- rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, +- 0x6C6C6B6C); ++ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && ++ rt2x00_has_cap_external_lna_bg(rt2x00dev)) ++ rt2800_bbp_glrt_write(rt2x00dev, 141, 0x15); + } + +- if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { +- reg = rt2800_register_read(rt2x00dev, RF_CONTROL3); +- reg |= 0x00000101; +- rt2800_register_write(rt2x00dev, RF_CONTROL3, reg); +- +- reg = rt2800_register_read(rt2x00dev, RF_BYPASS3); +- reg |= 0x00000101; +- rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); +- +- rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42); +- rt2800_bbp_write(rt2x00dev, 75, 0x68); +- rt2800_bbp_write(rt2x00dev, 76, 0x4C); +- rt2800_bbp_write(rt2x00dev, 79, 0x1C); +- rt2800_bbp_write(rt2x00dev, 80, 0x0C); +- rt2800_bbp_write(rt2x00dev, 82, 0xB6); +- /* bank 0 RF reg 42 and glrt BBP reg 141 will be set in +- * config channel function in dependence of channel and +- * HT20/HT40 so don't touch it +- */ ++ if (rt2x00dev->default_ant.rx_chain_num == 1) { ++ rt2800_bbp_write(rt2x00dev, 91, 0x07); ++ rt2800_bbp_write(rt2x00dev, 95, 0x1A); ++ rt2800_bbp_write(rt2x00dev, 195, 128); ++ rt2800_bbp_write(rt2x00dev, 196, 0xA0); ++ rt2800_bbp_write(rt2x00dev, 195, 170); ++ rt2800_bbp_write(rt2x00dev, 196, 0x12); ++ rt2800_bbp_write(rt2x00dev, 195, 171); ++ rt2800_bbp_write(rt2x00dev, 196, 0x10); ++ } else { ++ rt2800_bbp_write(rt2x00dev, 91, 0x06); ++ rt2800_bbp_write(rt2x00dev, 95, 0x9A); ++ rt2800_bbp_write(rt2x00dev, 195, 128); ++ rt2800_bbp_write(rt2x00dev, 196, 0xE0); ++ rt2800_bbp_write(rt2x00dev, 195, 170); ++ rt2800_bbp_write(rt2x00dev, 196, 0x30); ++ rt2800_bbp_write(rt2x00dev, 195, 171); ++ rt2800_bbp_write(rt2x00dev, 196, 0x30); + } ++ ++ /* AGC init */ ++ reg = rf->channel <= 14 ? 0x04 + 2 * rt2x00dev->lna_gain : 0; ++ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); ++ ++ /* On 11A, We should delay and wait RF/BBP to be stable ++ * and the appropriate time should be 1000 micro seconds ++ * 2005/06/05 - On 11G, we also need this delay time. ++ * Otherwise it's difficult to pass the WHQL. ++ */ ++ usleep_range(1000, 1500); + } + + bbp = rt2800_bbp_read(rt2x00dev, 4); +@@ -5649,43 +5615,6 @@ void rt2800_vco_calibration(struct rt2x0 + } + } + rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); +- +- if (rt2x00_rt(rt2x00dev, RT6352)) { +- if (rt2x00dev->default_ant.rx_chain_num == 1) { +- rt2800_bbp_write(rt2x00dev, 91, 0x07); +- rt2800_bbp_write(rt2x00dev, 95, 0x1A); +- rt2800_bbp_write(rt2x00dev, 195, 128); +- rt2800_bbp_write(rt2x00dev, 196, 0xA0); +- rt2800_bbp_write(rt2x00dev, 195, 170); +- rt2800_bbp_write(rt2x00dev, 196, 0x12); +- rt2800_bbp_write(rt2x00dev, 195, 171); +- rt2800_bbp_write(rt2x00dev, 196, 0x10); +- } else { +- rt2800_bbp_write(rt2x00dev, 91, 0x06); +- rt2800_bbp_write(rt2x00dev, 95, 0x9A); +- rt2800_bbp_write(rt2x00dev, 195, 128); +- rt2800_bbp_write(rt2x00dev, 196, 0xE0); +- rt2800_bbp_write(rt2x00dev, 195, 170); +- rt2800_bbp_write(rt2x00dev, 196, 0x30); +- rt2800_bbp_write(rt2x00dev, 195, 171); +- rt2800_bbp_write(rt2x00dev, 196, 0x30); +- } +- +- if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { +- rt2800_bbp_write(rt2x00dev, 75, 0x68); +- rt2800_bbp_write(rt2x00dev, 76, 0x4C); +- rt2800_bbp_write(rt2x00dev, 79, 0x1C); +- rt2800_bbp_write(rt2x00dev, 80, 0x0C); +- rt2800_bbp_write(rt2x00dev, 82, 0xB6); +- } +- +- /* On 11A, We should delay and wait RF/BBP to be stable +- * and the appropriate time should be 1000 micro seconds +- * 2005/06/05 - On 11G, we also need this delay time. +- * Otherwise it's difficult to pass the WHQL. +- */ +- usleep_range(1000, 1500); +- } + } + EXPORT_SYMBOL_GPL(rt2800_vco_calibration); + +@@ -8650,7 +8579,7 @@ static void rt2800_r_calibration(struct + rt2x00_warn(rt2x00dev, "Wait MAC Tx Status to MAX !!!\n"); + + maccfg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); +- maccfg &= (~0x04); ++ maccfg &= (~0x08); + rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, maccfg); + + if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_RX))) +@@ -10688,30 +10617,143 @@ static void rt2800_init_rfcsr_6352(struc + rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); + } ++} + +- rt6352_enable_pa_pin(rt2x00dev, 0); +- rt2800_r_calibration(rt2x00dev); +- rt2800_rf_self_txdc_cal(rt2x00dev); +- rt2800_rxdcoc_calibration(rt2x00dev); +- rt2800_bw_filter_calibration(rt2x00dev, true); +- rt2800_bw_filter_calibration(rt2x00dev, false); +- rt2800_loft_iq_calibration(rt2x00dev); +- rt2800_rxiq_calibration(rt2x00dev); +- rt6352_enable_pa_pin(rt2x00dev, 1); ++static void rt2800_init_palna_rt6352(struct rt2x00_dev *rt2x00dev) ++{ ++ u32 reg; ++ ++ if (rt2x00_has_cap_external_pa(rt2x00dev)) { ++ reg = rt2800_register_read(rt2x00dev, RF_CONTROL3); ++ reg |= 0x00000101; ++ rt2800_register_write(rt2x00dev, RF_CONTROL3, reg); ++ ++ reg = rt2800_register_read(rt2x00dev, RF_BYPASS3); ++ reg |= 0x00000101; ++ rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); ++ } + +- if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { ++ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && ++ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { + rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66); + rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20); + rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42); ++ } ++ ++ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && ++ rt2x00_has_cap_external_pa(rt2x00dev)) { ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0x73); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0x73); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0x73); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0xC8); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xA4); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x05); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xC8); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xA4); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x05); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x27); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0xC8); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xA4); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x05); ++ } ++ ++ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && ++ rt2x00_has_cap_external_pa(rt2x00dev)) ++ rt2800_rfcsr_write_dccal(rt2x00dev, 05, 0x00); ++ ++ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && ++ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { + rt2800_bbp_write(rt2x00dev, 75, 0x68); + rt2800_bbp_write(rt2x00dev, 76, 0x4C); + rt2800_bbp_write(rt2x00dev, 79, 0x1C); + rt2800_bbp_write(rt2x00dev, 80, 0x0C); + rt2800_bbp_write(rt2x00dev, 82, 0xB6); +- /* bank 0 RF reg 42 and glrt BBP reg 141 will be set in config +- * channel function in dependence of channel and HT20/HT40, +- * so don't touch them here. +- */ ++ } ++ ++ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && ++ rt2x00_has_cap_external_pa(rt2x00dev)) { ++ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, 0x36303636); ++ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C6B6C); ++ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, 0x6C6C6B6C); ++ } ++} ++ ++static void rt2800_restore_rf_bbp_rt6352(struct rt2x00_dev *rt2x00dev) ++{ ++ if (rt2x00_has_cap_external_pa(rt2x00dev)) { ++ rt2800_register_write(rt2x00dev, RF_CONTROL3, 0x0); ++ rt2800_register_write(rt2x00dev, RF_BYPASS3, 0x0); ++ } ++ ++ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && ++ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x02); ++ } ++ ++ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && ++ rt2x00_has_cap_external_pa(rt2x00dev)) { ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x20); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09); ++ } ++ ++ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && ++ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { ++ rt2800_bbp_write(rt2x00dev, 75, 0x60); ++ rt2800_bbp_write(rt2x00dev, 76, 0x44); ++ rt2800_bbp_write(rt2x00dev, 79, 0x1C); ++ rt2800_bbp_write(rt2x00dev, 80, 0x0C); ++ rt2800_bbp_write(rt2x00dev, 82, 0xB6); ++ } ++ ++ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && ++ rt2x00_has_cap_external_pa(rt2x00dev)) { ++ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, 0x3630363A); ++ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C666C); ++ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, 0x6C6C666C); ++ } ++} ++ ++static void rt2800_calibration_rt6352(struct rt2x00_dev *rt2x00dev) ++{ ++ if (rt2x00_has_cap_external_pa(rt2x00dev) || ++ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { ++ rt6352_enable_pa_pin(rt2x00dev, 0); ++ rt2800_restore_rf_bbp_rt6352(rt2x00dev); ++ } ++ ++ rt2800_r_calibration(rt2x00dev); ++ rt2800_rf_self_txdc_cal(rt2x00dev); ++ rt2800_rxdcoc_calibration(rt2x00dev); ++ rt2800_bw_filter_calibration(rt2x00dev, true); ++ rt2800_bw_filter_calibration(rt2x00dev, false); ++ rt2800_loft_iq_calibration(rt2x00dev); ++ ++ /* missing DPD Calibration for devices using internal PA */ ++ ++ rt2800_rxdcoc_calibration(rt2x00dev); ++ rt2800_rxiq_calibration(rt2x00dev); ++ ++ if (rt2x00_has_cap_external_pa(rt2x00dev) || ++ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { ++ rt6352_enable_pa_pin(rt2x00dev, 1); ++ rt2800_init_palna_rt6352(rt2x00dev); + } + } + +@@ -10804,6 +10846,10 @@ int rt2800_enable_radio(struct rt2x00_de + rt2800_init_bbp(rt2x00dev); + rt2800_init_rfcsr(rt2x00dev); + ++ /* Do calibration and init PA/LNA for RT6352 */ ++ if (rt2x00_rt(rt2x00dev, RT6352)) ++ rt2800_calibration_rt6352(rt2x00dev); ++ + if (rt2x00_is_usb(rt2x00dev) && + (rt2x00_rt(rt2x00dev, RT3070) || + rt2x00_rt(rt2x00dev, RT3071) || +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h +@@ -1277,6 +1277,12 @@ rt2x00_has_cap_external_lna_bg(struct rt + } + + static inline bool ++rt2x00_has_cap_external_pa(struct rt2x00_dev *rt2x00dev) ++{ ++ return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_EXTERNAL_PA_TX0); ++} ++ ++static inline bool + rt2x00_has_cap_double_antenna(struct rt2x00_dev *rt2x00dev) + { + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_DOUBLE_ANTENNA); diff --git a/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch b/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch index b9849d21e0..a1a0282d36 100644 --- a/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch +++ b/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch @@ -1,12 +1,19 @@ -Used for AP+STA support in libreCMC - preserve AP mode keys across STA reconnects +From: Felix Fietkau +Date: Mon, 27 Oct 2014 00:00:00 +0100 +Subject: [PATCH] mac80211: preseve AP mode keys across STA reconnect + +Used for AP+STA support in libreCMC - preserve AP mode keys across STA reconnect +--- + net/mac80211/cfg.c | 1 - + 1 file changed, 1 deletion(-) --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -1319,7 +1319,6 @@ static int ieee80211_stop_ap(struct wiph - sdata->vif.bss_conf.ftmr_params = NULL; +@@ -1519,7 +1519,6 @@ static int ieee80211_stop_ap(struct wiph + link_conf->bssid_indicator = 0; __sta_info_flush(sdata, true); - ieee80211_free_keys(sdata, true); - sdata->vif.bss_conf.enable_beacon = false; + link_conf->enable_beacon = false; sdata->beacon_rate_set = false; diff --git a/package/kernel/mac80211/patches/subsys/120-cfg80211_allow_perm_addr_change.patch b/package/kernel/mac80211/patches/subsys/120-cfg80211_allow_perm_addr_change.patch index ffd8807ccc..f315ae5ca2 100644 --- a/package/kernel/mac80211/patches/subsys/120-cfg80211_allow_perm_addr_change.patch +++ b/package/kernel/mac80211/patches/subsys/120-cfg80211_allow_perm_addr_change.patch @@ -1,3 +1,12 @@ +From: Felix Fietkau +Date: Thu, 11 Dec 2014 00:00:00 +0100 +Subject: [PATCH] cfg80211: add support for changing the device mac address via + sysfs + +--- + net/wireless/sysfs.c | 27 ++++++++++++++++++++++----- + 1 file changed, 22 insertions(+), 5 deletions(-) + --- a/net/wireless/sysfs.c +++ b/net/wireless/sysfs.c @@ -24,18 +24,35 @@ static inline struct cfg80211_registered diff --git a/package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch b/package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch deleted file mode 100644 index 5a7da84506..0000000000 --- a/package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch +++ /dev/null @@ -1,67 +0,0 @@ ---- a/net/mac80211/main.c -+++ b/net/mac80211/main.c -@@ -337,7 +337,7 @@ void ieee80211_restart_hw(struct ieee802 - } - EXPORT_SYMBOL(ieee80211_restart_hw); - --#ifdef CONFIG_INET -+#ifdef __disabled__CONFIG_INET - static int ieee80211_ifa_changed(struct notifier_block *nb, - unsigned long data, void *arg) - { -@@ -396,7 +396,7 @@ static int ieee80211_ifa_changed(struct - } - #endif - --#if IS_ENABLED(CONFIG_IPV6) -+#if IS_ENABLED(__disabled__CONFIG_IPV6) - static int ieee80211_ifa6_changed(struct notifier_block *nb, - unsigned long data, void *arg) - { -@@ -1321,14 +1321,14 @@ int ieee80211_register_hw(struct ieee802 - wiphy_unlock(hw->wiphy); - rtnl_unlock(); - --#ifdef CONFIG_INET -+#ifdef __disabled__CONFIG_INET - local->ifa_notifier.notifier_call = ieee80211_ifa_changed; - result = register_inetaddr_notifier(&local->ifa_notifier); - if (result) - goto fail_ifa; - #endif - --#if IS_ENABLED(CONFIG_IPV6) -+#if IS_ENABLED(__disabled__CONFIG_IPV6) - local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed; - result = register_inet6addr_notifier(&local->ifa6_notifier); - if (result) -@@ -1337,13 +1337,13 @@ int ieee80211_register_hw(struct ieee802 - - return 0; - --#if IS_ENABLED(CONFIG_IPV6) -+#if IS_ENABLED(__disabled__CONFIG_IPV6) - fail_ifa6: --#ifdef CONFIG_INET -+#ifdef __disabled__CONFIG_INET - unregister_inetaddr_notifier(&local->ifa_notifier); - #endif - #endif --#if defined(CONFIG_INET) || defined(CONFIG_IPV6) -+#if defined(__disabled__CONFIG_INET) || defined(__disabled__CONFIG_IPV6) - fail_ifa: - #endif - wiphy_unregister(local->hw.wiphy); -@@ -1373,10 +1373,10 @@ void ieee80211_unregister_hw(struct ieee - tasklet_kill(&local->tx_pending_tasklet); - tasklet_kill(&local->tasklet); - --#ifdef CONFIG_INET -+#ifdef __disabled__CONFIG_INET - unregister_inetaddr_notifier(&local->ifa_notifier); - #endif --#if IS_ENABLED(CONFIG_IPV6) -+#if IS_ENABLED(__disabled__CONFIG_IPV6) - unregister_inet6addr_notifier(&local->ifa6_notifier); - #endif - diff --git a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch index 0c06829ce4..10b842d9af 100644 --- a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch +++ b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch @@ -1,11 +1,19 @@ +From: Felix Fietkau +Date: Wed, 3 Oct 2012 00:00:00 +0200 +Subject: [PATCH] mac80211: allow scans in access point mode (for site survey) + +--- + net/mac80211/cfg.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -2497,7 +2497,7 @@ static int ieee80211_scan(struct wiphy * - * the frames sent while scanning on other channel will be - * lost) +@@ -2727,6 +2727,8 @@ static int ieee80211_scan(struct wiphy * */ -- if (sdata->u.ap.beacon && -+ if (0 && sdata->u.ap.beacon && - (!(wiphy->features & NL80211_FEATURE_AP_SCAN) || - !(req->flags & NL80211_SCAN_FLAG_AP))) - return -EOPNOTSUPP; + fallthrough; + case NL80211_IFTYPE_AP: ++ /* skip check */ ++ break; + /* + * If the scan has been forced (and the driver supports + * forcing), don't care about being beaconing already. diff --git a/package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch b/package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch index d09d70725e..63b2177471 100644 --- a/package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch +++ b/package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch @@ -28,7 +28,7 @@ Signed-off-by: Johannes Berg --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c -@@ -357,6 +357,7 @@ struct sta_info *sta_info_alloc(struct i +@@ -554,6 +554,7 @@ __sta_info_alloc(struct ieee80211_sub_if INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames); INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work); mutex_init(&sta->ampdu_mlme.mtx); diff --git a/package/kernel/mac80211/patches/subsys/309-mac80211-minstrel_ht-fix-MINSTREL_FRAC-macro.patch b/package/kernel/mac80211/patches/subsys/302-mac80211-minstrel_ht-fix-MINSTREL_FRAC-macro.patch similarity index 100% rename from package/kernel/mac80211/patches/subsys/309-mac80211-minstrel_ht-fix-MINSTREL_FRAC-macro.patch rename to package/kernel/mac80211/patches/subsys/302-mac80211-minstrel_ht-fix-MINSTREL_FRAC-macro.patch diff --git a/package/kernel/mac80211/patches/subsys/303-mac80211-minstrel_ht-reduce-fluctuations-in-rate-pro.patch b/package/kernel/mac80211/patches/subsys/303-mac80211-minstrel_ht-reduce-fluctuations-in-rate-pro.patch new file mode 100644 index 0000000000..f26477e811 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/303-mac80211-minstrel_ht-reduce-fluctuations-in-rate-pro.patch @@ -0,0 +1,30 @@ +From: Felix Fietkau +Date: Sat, 6 Feb 2021 16:08:01 +0100 +Subject: [PATCH] mac80211: minstrel_ht: reduce fluctuations in rate + probability stats + +In some scenarios when there is a lot of fluctuation in packet error rates, +rate switching can be amplified when the statistics get skewed by time slots +with very few tries. +Make the input data to the moving average more smooth by adding the +success/attempts count from the last stats window as well. This has the +advantage of smoothing the data without introducing any extra lag to sampling +rates. +This significantly improves rate stability on a strong test link subjected to +periodic noise bursts generated with a SDR + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -769,7 +769,8 @@ minstrel_ht_calc_rate_stats(struct minst + unsigned int cur_prob; + + if (unlikely(mrs->attempts > 0)) { +- cur_prob = MINSTREL_FRAC(mrs->success, mrs->attempts); ++ cur_prob = MINSTREL_FRAC(mrs->success + mrs->last_success, ++ mrs->attempts + mrs->last_attempts); + minstrel_filter_avg_add(&mrs->prob_avg, + &mrs->prob_avg_1, cur_prob); + mrs->att_hist += mrs->attempts; diff --git a/package/kernel/mac80211/patches/subsys/303-mac80211-set-up-the-fwd_skb-dev-for-mesh-forwarding.patch b/package/kernel/mac80211/patches/subsys/303-mac80211-set-up-the-fwd_skb-dev-for-mesh-forwarding.patch deleted file mode 100644 index 159aad564b..0000000000 --- a/package/kernel/mac80211/patches/subsys/303-mac80211-set-up-the-fwd_skb-dev-for-mesh-forwarding.patch +++ /dev/null @@ -1,62 +0,0 @@ -From: Xing Song -Date: Tue, 23 Nov 2021 11:31:23 +0800 -Subject: [PATCH] mac80211: set up the fwd_skb->dev for mesh forwarding - -Mesh forwarding requires that the fwd_skb->dev is set up for TX handling, -otherwise the following warning will be generated, so set it up for the -pending frames. - -[ 72.835674 ] WARNING: CPU: 0 PID: 1193 at __skb_flow_dissect+0x284/0x1298 -[ 72.842379 ] Modules linked in: ksmbd pppoe ppp_async l2tp_ppp ... -[ 72.962020 ] CPU: 0 PID: 1193 Comm: kworker/u5:1 Tainted: P S 5.4.137 #0 -[ 72.969938 ] Hardware name: MT7622_MT7531 RFB (DT) -[ 72.974659 ] Workqueue: napi_workq napi_workfn -[ 72.979025 ] pstate: 60000005 (nZCv daif -PAN -UAO) -[ 72.983822 ] pc : __skb_flow_dissect+0x284/0x1298 -[ 72.988444 ] lr : __skb_flow_dissect+0x54/0x1298 -[ 72.992977 ] sp : ffffffc010c738c0 -[ 72.996293 ] x29: ffffffc010c738c0 x28: 0000000000000000 -[ 73.001615 ] x27: 000000000000ffc2 x26: ffffff800c2eb818 -[ 73.006937 ] x25: ffffffc010a987c8 x24: 00000000000000ce -[ 73.012259 ] x23: ffffffc010c73a28 x22: ffffffc010a99c60 -[ 73.017581 ] x21: 000000000000ffc2 x20: ffffff80094da800 -[ 73.022903 ] x19: 0000000000000000 x18: 0000000000000014 -[ 73.028226 ] x17: 00000000084d16af x16: 00000000d1fc0bab -[ 73.033548 ] x15: 00000000715f6034 x14: 000000009dbdd301 -[ 73.038870 ] x13: 00000000ea4dcbc3 x12: 0000000000000040 -[ 73.044192 ] x11: 000000000eb00ff0 x10: 0000000000000000 -[ 73.049513 ] x9 : 000000000eb00073 x8 : 0000000000000088 -[ 73.054834 ] x7 : 0000000000000000 x6 : 0000000000000001 -[ 73.060155 ] x5 : 0000000000000000 x4 : 0000000000000000 -[ 73.065476 ] x3 : ffffffc010a98000 x2 : 0000000000000000 -[ 73.070797 ] x1 : 0000000000000000 x0 : 0000000000000000 -[ 73.076120 ] Call trace: -[ 73.078572 ] __skb_flow_dissect+0x284/0x1298 -[ 73.082846 ] __skb_get_hash+0x7c/0x228 -[ 73.086629 ] ieee80211_txq_may_transmit+0x7fc/0x17b8 [mac80211] -[ 73.092564 ] ieee80211_tx_prepare_skb+0x20c/0x268 [mac80211] -[ 73.098238 ] ieee80211_tx_pending+0x144/0x330 [mac80211] -[ 73.103560 ] tasklet_action_common.isra.16+0xb4/0x158 -[ 73.108618 ] tasklet_action+0x2c/0x38 -[ 73.112286 ] __do_softirq+0x168/0x3b0 -[ 73.115954 ] do_softirq.part.15+0x88/0x98 -[ 73.119969 ] __local_bh_enable_ip+0xb0/0xb8 -[ 73.124156 ] napi_workfn+0x58/0x90 -[ 73.127565 ] process_one_work+0x20c/0x478 -[ 73.131579 ] worker_thread+0x50/0x4f0 -[ 73.135249 ] kthread+0x124/0x128 -[ 73.138484 ] ret_from_fork+0x10/0x1c - -Signed-off-by: Xing Song ---- - ---- a/net/mac80211/rx.c -+++ b/net/mac80211/rx.c -@@ -2950,6 +2950,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80 - if (!fwd_skb) - goto out; - -+ fwd_skb->dev = sdata->dev; - fwd_hdr = (struct ieee80211_hdr *) fwd_skb->data; - fwd_hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_RETRY); - info = IEEE80211_SKB_CB(fwd_skb); diff --git a/package/kernel/mac80211/patches/subsys/304-mac80211-minstrel_ht-rework-rate-downgrade-code-and-.patch b/package/kernel/mac80211/patches/subsys/304-mac80211-minstrel_ht-rework-rate-downgrade-code-and-.patch new file mode 100644 index 0000000000..9b3cc3a664 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/304-mac80211-minstrel_ht-rework-rate-downgrade-code-and-.patch @@ -0,0 +1,151 @@ +From: Felix Fietkau +Date: Sat, 6 Feb 2021 16:33:14 +0100 +Subject: [PATCH] mac80211: minstrel_ht: rework rate downgrade code and + max_prob rate selection + +The current fallback code for fast rate switching on potentially failing rates +is triggering too often if there is some strong noise on the channel. This can +lead to wild fluctuations in the rate selection. +Additionally, switching down to max_prob_rate can create a significant gap down +in throughput, especially when using only 2 spatial streams, because max_prob_rate +is limited to using fewer streams than the max_tp rates. +In order to improve throughput without reducing reliability too much, use the +rate downgrade code for the max_prob_rate only, and allow the non-downgraded +max_prob_rate to use as many spatial streams as the max_tp rates + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -580,6 +580,14 @@ minstrel_ht_set_best_prob_rate(struct mi + int cur_tp_avg, cur_group, cur_idx; + int max_gpr_group, max_gpr_idx; + int max_gpr_tp_avg, max_gpr_prob; ++ int min_dur; ++ ++ min_dur = max(minstrel_get_duration(mi->max_tp_rate[0]), ++ minstrel_get_duration(mi->max_tp_rate[1])); ++ ++ /* make the rate at least 18% slower than max tp rates */ ++ if (minstrel_get_duration(index) <= min_dur * 19 / 16) ++ return; + + cur_group = MI_RATE_GROUP(index); + cur_idx = MI_RATE_IDX(index); +@@ -601,11 +609,6 @@ minstrel_ht_set_best_prob_rate(struct mi + !minstrel_ht_is_legacy_group(max_tp_group)) + return; + +- /* skip rates faster than max tp rate with lower prob */ +- if (minstrel_get_duration(mi->max_tp_rate[0]) > minstrel_get_duration(index) && +- mrs->prob_avg < max_tp_prob) +- return; +- + max_gpr_group = MI_RATE_GROUP(mg->max_group_prob_rate); + max_gpr_idx = MI_RATE_IDX(mg->max_group_prob_rate); + max_gpr_prob = mi->groups[max_gpr_group].rates[max_gpr_idx].prob_avg; +@@ -663,40 +666,6 @@ minstrel_ht_assign_best_tp_rates(struct + + } + +-/* +- * Try to increase robustness of max_prob rate by decrease number of +- * streams if possible. +- */ +-static inline void +-minstrel_ht_prob_rate_reduce_streams(struct minstrel_ht_sta *mi) +-{ +- struct minstrel_mcs_group_data *mg; +- int tmp_max_streams, group, tmp_idx, tmp_prob; +- int tmp_tp = 0; +- +- if (!mi->sta->deflink.ht_cap.ht_supported) +- return; +- +- group = MI_RATE_GROUP(mi->max_tp_rate[0]); +- tmp_max_streams = minstrel_mcs_groups[group].streams; +- for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) { +- mg = &mi->groups[group]; +- if (!mi->supported[group] || group == MINSTREL_CCK_GROUP) +- continue; +- +- tmp_idx = MI_RATE_IDX(mg->max_group_prob_rate); +- tmp_prob = mi->groups[group].rates[tmp_idx].prob_avg; +- +- if (tmp_tp < minstrel_ht_get_tp_avg(mi, group, tmp_idx, tmp_prob) && +- (minstrel_mcs_groups[group].streams < tmp_max_streams)) { +- mi->max_prob_rate = mg->max_group_prob_rate; +- tmp_tp = minstrel_ht_get_tp_avg(mi, group, +- tmp_idx, +- tmp_prob); +- } +- } +-} +- + static u16 + __minstrel_ht_get_sample_rate(struct minstrel_ht_sta *mi, + enum minstrel_sample_type type) +@@ -1176,8 +1145,6 @@ minstrel_ht_update_stats(struct minstrel + + mi->max_prob_rate = tmp_max_prob_rate; + +- /* Try to increase robustness of max_prob_rate*/ +- minstrel_ht_prob_rate_reduce_streams(mi); + minstrel_ht_refill_sample_rates(mi); + + #ifdef CPTCFG_MAC80211_DEBUGFS +@@ -1256,7 +1223,7 @@ minstrel_ht_ri_txstat_valid(struct minst + } + + static void +-minstrel_downgrade_rate(struct minstrel_ht_sta *mi, u16 *idx, bool primary) ++minstrel_downgrade_prob_rate(struct minstrel_ht_sta *mi, u16 *idx) + { + int group, orig_group; + +@@ -1271,11 +1238,7 @@ minstrel_downgrade_rate(struct minstrel_ + minstrel_mcs_groups[orig_group].streams) + continue; + +- if (primary) +- *idx = mi->groups[group].max_group_tp_rate[0]; +- else +- *idx = mi->groups[group].max_group_tp_rate[1]; +- break; ++ *idx = mi->groups[group].max_group_prob_rate; + } + } + +@@ -1286,7 +1249,7 @@ minstrel_ht_tx_status(void *priv, struct + struct ieee80211_tx_info *info = st->info; + struct minstrel_ht_sta *mi = priv_sta; + struct ieee80211_tx_rate *ar = info->status.rates; +- struct minstrel_rate_stats *rate, *rate2; ++ struct minstrel_rate_stats *rate; + struct minstrel_priv *mp = priv; + u32 update_interval = mp->update_interval; + bool last, update = false; +@@ -1354,18 +1317,13 @@ minstrel_ht_tx_status(void *priv, struct + /* + * check for sudden death of spatial multiplexing, + * downgrade to a lower number of streams if necessary. ++ * only do this for the max_prob_rate to prevent spurious ++ * rate fluctuations when the link changes suddenly + */ +- rate = minstrel_get_ratestats(mi, mi->max_tp_rate[0]); ++ rate = minstrel_get_ratestats(mi, mi->max_prob_rate); + if (rate->attempts > 30 && + rate->success < rate->attempts / 4) { +- minstrel_downgrade_rate(mi, &mi->max_tp_rate[0], true); +- update = true; +- } +- +- rate2 = minstrel_get_ratestats(mi, mi->max_tp_rate[1]); +- if (rate2->attempts > 30 && +- rate2->success < rate2->attempts / 4) { +- minstrel_downgrade_rate(mi, &mi->max_tp_rate[1], false); ++ minstrel_downgrade_prob_rate(mi, &mi->max_prob_rate); + update = true; + } + } diff --git a/package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch b/package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch new file mode 100644 index 0000000000..0ac972955f --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch @@ -0,0 +1,53 @@ +From: Felix Fietkau +Date: Sun, 26 Jun 2022 11:43:25 +0200 +Subject: [PATCH] mac80211: increase quantum for airtime scheduler + +Given the typical AQL budget and queue length, a quantum of 256 with the +default station weight often requires iterating over all queues frequently, +until one of them becomes eligible. +Improve performance by using 8 times station weight as scheduler quantum + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -90,6 +90,8 @@ extern const u8 ieee80211_ac_to_qos_mask + */ + #define AIRTIME_ACTIVE_DURATION (HZ / 10) + ++#define AIRTIME_QUANTUM_SHIFT 3 ++ + struct ieee80211_bss { + u32 device_ts_beacon, device_ts_presp; + +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -3984,7 +3984,7 @@ struct ieee80211_txq *ieee80211_next_txq + + if (deficit < 0) + sta->airtime[txqi->txq.ac].deficit += +- sta->airtime_weight; ++ sta->airtime_weight << AIRTIME_QUANTUM_SHIFT; + + if (deficit < 0 || !aql_check) { + list_move_tail(&txqi->schedule_order, +@@ -4127,7 +4127,8 @@ bool ieee80211_txq_may_transmit(struct i + } + sta = container_of(iter->txq.sta, struct sta_info, sta); + if (ieee80211_sta_deficit(sta, ac) < 0) +- sta->airtime[ac].deficit += sta->airtime_weight; ++ sta->airtime[ac].deficit += sta->airtime_weight << ++ AIRTIME_QUANTUM_SHIFT; + list_move_tail(&iter->schedule_order, &local->active_txqs[ac]); + } + +@@ -4135,7 +4136,7 @@ bool ieee80211_txq_may_transmit(struct i + if (sta->airtime[ac].deficit >= 0) + goto out; + +- sta->airtime[ac].deficit += sta->airtime_weight; ++ sta->airtime[ac].deficit += sta->airtime_weight << AIRTIME_QUANTUM_SHIFT; + list_move_tail(&txqi->schedule_order, &local->active_txqs[ac]); + spin_unlock_bh(&local->active_txq_lock[ac]); + diff --git a/package/kernel/mac80211/patches/subsys/306-01-v6.2-wifi-mac80211-add-internal-handler-for-wake_tx_queue.patch b/package/kernel/mac80211/patches/subsys/306-01-v6.2-wifi-mac80211-add-internal-handler-for-wake_tx_queue.patch new file mode 100644 index 0000000000..d14ba05e69 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/306-01-v6.2-wifi-mac80211-add-internal-handler-for-wake_tx_queue.patch @@ -0,0 +1,183 @@ +From: Alexander Wetzel +Date: Sun, 9 Oct 2022 18:30:38 +0200 +Subject: [PATCH] wifi: mac80211: add internal handler for wake_tx_queue + +Start to align the TX handling to only use internal TX queues (iTXQs): + +Provide a handler for drivers not having a custom wake_tx_queue +callback and update the documentation. + +Signed-off-by: Alexander Wetzel +Signed-off-by: Johannes Berg +--- + +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -89,15 +89,13 @@ + /** + * DOC: mac80211 software tx queueing + * +- * mac80211 provides an optional intermediate queueing implementation designed +- * to allow the driver to keep hardware queues short and provide some fairness +- * between different stations/interfaces. +- * In this model, the driver pulls data frames from the mac80211 queue instead +- * of letting mac80211 push them via drv_tx(). +- * Other frames (e.g. control or management) are still pushed using drv_tx(). ++ * mac80211 uses an intermediate queueing implementation, designed to allow the ++ * driver to keep hardware queues short and to provide some fairness between ++ * different stations/interfaces. + * +- * Drivers indicate that they use this model by implementing the .wake_tx_queue +- * driver operation. ++ * Drivers must provide the .wake_tx_queue driver operation by either ++ * linking it to ieee80211_handle_wake_tx_queue() or implementing a custom ++ * handler. + * + * Intermediate queues (struct ieee80211_txq) are kept per-sta per-tid, with + * another per-sta for non-data/non-mgmt and bufferable management frames, and +@@ -106,9 +104,12 @@ + * The driver is expected to initialize its private per-queue data for stations + * and interfaces in the .add_interface and .sta_add ops. + * +- * The driver can't access the queue directly. To dequeue a frame from a +- * txq, it calls ieee80211_tx_dequeue(). Whenever mac80211 adds a new frame to a +- * queue, it calls the .wake_tx_queue driver op. ++ * The driver can't access the internal TX queues (iTXQs) directly. ++ * Whenever mac80211 adds a new frame to a queue, it calls the .wake_tx_queue ++ * driver op. ++ * Drivers implementing a custom .wake_tx_queue op can get them by calling ++ * ieee80211_tx_dequeue(). Drivers using ieee80211_handle_wake_tx_queue() will ++ * simply get the individual frames pushed via the .tx driver operation. + * + * Drivers can optionally delegate responsibility for scheduling queues to + * mac80211, to take advantage of airtime fairness accounting. In this case, to +@@ -2248,8 +2249,8 @@ struct ieee80211_link_sta { + * For non MLO STA it will point to the deflink data. For MLO STA + * ieee80211_sta_recalc_aggregates() must be called to update it. + * @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not. +- * @txq: per-TID data TX queues (if driver uses the TXQ abstraction); note that +- * the last entry (%IEEE80211_NUM_TIDS) is used for non-data frames ++ * @txq: per-TID data TX queues; note that the last entry (%IEEE80211_NUM_TIDS) ++ * is used for non-data frames + * @deflink: This holds the default link STA information, for non MLO STA all link + * specific STA information is accessed through @deflink or through + * link[0] which points to address of @deflink. For MLO Link STA +@@ -5687,7 +5688,7 @@ void ieee80211_key_replay(struct ieee802 + * @hw: pointer as obtained from ieee80211_alloc_hw(). + * @queue: queue number (counted from zero). + * +- * Drivers should use this function instead of netif_wake_queue. ++ * Drivers must use this function instead of netif_wake_queue. + */ + void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue); + +@@ -5696,7 +5697,7 @@ void ieee80211_wake_queue(struct ieee802 + * @hw: pointer as obtained from ieee80211_alloc_hw(). + * @queue: queue number (counted from zero). + * +- * Drivers should use this function instead of netif_stop_queue. ++ * Drivers must use this function instead of netif_stop_queue. + */ + void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue); + +@@ -5705,7 +5706,7 @@ void ieee80211_stop_queue(struct ieee802 + * @hw: pointer as obtained from ieee80211_alloc_hw(). + * @queue: queue number (counted from zero). + * +- * Drivers should use this function instead of netif_stop_queue. ++ * Drivers must use this function instead of netif_queue_stopped. + * + * Return: %true if the queue is stopped. %false otherwise. + */ +@@ -5716,7 +5717,7 @@ int ieee80211_queue_stopped(struct ieee8 + * ieee80211_stop_queues - stop all queues + * @hw: pointer as obtained from ieee80211_alloc_hw(). + * +- * Drivers should use this function instead of netif_stop_queue. ++ * Drivers must use this function instead of netif_tx_stop_all_queues. + */ + void ieee80211_stop_queues(struct ieee80211_hw *hw); + +@@ -5724,7 +5725,7 @@ void ieee80211_stop_queues(struct ieee80 + * ieee80211_wake_queues - wake all queues + * @hw: pointer as obtained from ieee80211_alloc_hw(). + * +- * Drivers should use this function instead of netif_wake_queue. ++ * Drivers must use this function instead of netif_tx_wake_all_queues. + */ + void ieee80211_wake_queues(struct ieee80211_hw *hw); + +@@ -6946,6 +6947,18 @@ static inline struct sk_buff *ieee80211_ + } + + /** ++ * ieee80211_handle_wake_tx_queue - mac80211 handler for wake_tx_queue callback ++ * ++ * @hw: pointer as obtained from wake_tx_queue() callback(). ++ * @txq: pointer as obtained from wake_tx_queue() callback(). ++ * ++ * Drivers can use this function for the mandatory mac80211 wake_tx_queue ++ * callback in struct ieee80211_ops. They should not call this function. ++ */ ++void ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw, ++ struct ieee80211_txq *txq); ++ ++/** + * ieee80211_next_txq - get next tx queue to pull packets from + * + * @hw: pointer as obtained from ieee80211_alloc_hw() +--- a/net/mac80211/util.c ++++ b/net/mac80211/util.c +@@ -288,6 +288,52 @@ __le16 ieee80211_ctstoself_duration(stru + } + EXPORT_SYMBOL(ieee80211_ctstoself_duration); + ++static void wake_tx_push_queue(struct ieee80211_local *local, ++ struct ieee80211_sub_if_data *sdata, ++ struct ieee80211_txq *queue) ++{ ++ int q = sdata->vif.hw_queue[queue->ac]; ++ struct ieee80211_tx_control control = { ++ .sta = queue->sta, ++ }; ++ struct sk_buff *skb; ++ unsigned long flags; ++ bool q_stopped; ++ ++ while (1) { ++ spin_lock_irqsave(&local->queue_stop_reason_lock, flags); ++ q_stopped = local->queue_stop_reasons[q]; ++ spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); ++ ++ if (q_stopped) ++ break; ++ ++ skb = ieee80211_tx_dequeue(&local->hw, queue); ++ if (!skb) ++ break; ++ ++ drv_tx(local, &control, skb); ++ } ++} ++ ++/* wake_tx_queue handler for driver not implementing a custom one*/ ++void ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw, ++ struct ieee80211_txq *txq) ++{ ++ struct ieee80211_local *local = hw_to_local(hw); ++ struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->vif); ++ struct ieee80211_txq *queue; ++ ++ /* Use ieee80211_next_txq() for airtime fairness accounting */ ++ ieee80211_txq_schedule_start(hw, txq->ac); ++ while ((queue = ieee80211_next_txq(hw, txq->ac))) { ++ wake_tx_push_queue(local, sdata, queue); ++ ieee80211_return_txq(hw, queue, false); ++ } ++ ieee80211_txq_schedule_end(hw, txq->ac); ++} ++EXPORT_SYMBOL(ieee80211_handle_wake_tx_queue); ++ + static void __ieee80211_wake_txqs(struct ieee80211_sub_if_data *sdata, int ac) + { + struct ieee80211_local *local = sdata->local; diff --git a/package/kernel/mac80211/patches/subsys/306-02-v6.2-wifi-mac80211-add-wake_tx_queue-callback-to-drivers.patch b/package/kernel/mac80211/patches/subsys/306-02-v6.2-wifi-mac80211-add-wake_tx_queue-callback-to-drivers.patch new file mode 100644 index 0000000000..fee038d90c --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/306-02-v6.2-wifi-mac80211-add-wake_tx_queue-callback-to-drivers.patch @@ -0,0 +1,396 @@ +From: Alexander Wetzel +Date: Sun, 9 Oct 2022 18:30:39 +0200 +Subject: [PATCH] wifi: mac80211: add wake_tx_queue callback to drivers + +mac80211 is fully switching over to the internal TX queue (iTXQ) +implementation. Update all drivers not yet providing the now mandatory +wake_tx_queue() callback. + +As an side effect the netdev interfaces of all updated drivers will +switch to the noqueue qdisc. + +Signed-off-by: Alexander Wetzel +[add staging drivers] +Signed-off-by: Johannes Berg +--- + +--- a/drivers/net/wireless/admtek/adm8211.c ++++ b/drivers/net/wireless/admtek/adm8211.c +@@ -1760,6 +1760,7 @@ static int adm8211_alloc_rings(struct ie + + static const struct ieee80211_ops adm8211_ops = { + .tx = adm8211_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = adm8211_start, + .stop = adm8211_stop, + .add_interface = adm8211_add_interface, +--- a/drivers/net/wireless/ath/ar5523/ar5523.c ++++ b/drivers/net/wireless/ath/ar5523/ar5523.c +@@ -1361,6 +1361,7 @@ static const struct ieee80211_ops ar5523 + .start = ar5523_start, + .stop = ar5523_stop, + .tx = ar5523_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .set_rts_threshold = ar5523_set_rts_threshold, + .add_interface = ar5523_add_interface, + .remove_interface = ar5523_remove_interface, +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -8587,6 +8587,7 @@ err_fallback: + + static const struct ieee80211_ops ath11k_ops = { + .tx = ath11k_mac_op_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = ath11k_mac_op_start, + .stop = ath11k_mac_op_stop, + .reconfig_complete = ath11k_mac_op_reconfig_complete, +--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c ++++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c +@@ -781,6 +781,7 @@ static int ath5k_set_ringparam(struct ie + + const struct ieee80211_ops ath5k_hw_ops = { + .tx = ath5k_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = ath5k_start, + .stop = ath5k_stop, + .add_interface = ath5k_add_interface, +--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c ++++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c +@@ -1870,6 +1870,7 @@ static void ath9k_htc_channel_switch_bea + + struct ieee80211_ops ath9k_htc_ops = { + .tx = ath9k_htc_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = ath9k_htc_start, + .stop = ath9k_htc_stop, + .add_interface = ath9k_htc_add_interface, +--- a/drivers/net/wireless/ath/carl9170/main.c ++++ b/drivers/net/wireless/ath/carl9170/main.c +@@ -1715,6 +1715,7 @@ static const struct ieee80211_ops carl91 + .start = carl9170_op_start, + .stop = carl9170_op_stop, + .tx = carl9170_op_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .flush = carl9170_op_flush, + .add_interface = carl9170_op_add_interface, + .remove_interface = carl9170_op_remove_interface, +--- a/drivers/net/wireless/ath/wcn36xx/main.c ++++ b/drivers/net/wireless/ath/wcn36xx/main.c +@@ -1362,6 +1362,7 @@ static const struct ieee80211_ops wcn36x + .prepare_multicast = wcn36xx_prepare_multicast, + .configure_filter = wcn36xx_configure_filter, + .tx = wcn36xx_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .set_key = wcn36xx_set_key, + .hw_scan = wcn36xx_hw_scan, + .cancel_hw_scan = wcn36xx_cancel_hw_scan, +--- a/drivers/net/wireless/atmel/at76c50x-usb.c ++++ b/drivers/net/wireless/atmel/at76c50x-usb.c +@@ -2187,6 +2187,7 @@ static int at76_set_key(struct ieee80211 + + static const struct ieee80211_ops at76_ops = { + .tx = at76_mac80211_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .add_interface = at76_add_interface, + .remove_interface = at76_remove_interface, + .config = at76_config, +--- a/drivers/net/wireless/broadcom/b43/main.c ++++ b/drivers/net/wireless/broadcom/b43/main.c +@@ -5171,6 +5171,7 @@ static int b43_op_get_survey(struct ieee + + static const struct ieee80211_ops b43_hw_ops = { + .tx = b43_op_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .conf_tx = b43_op_conf_tx, + .add_interface = b43_op_add_interface, + .remove_interface = b43_op_remove_interface, +--- a/drivers/net/wireless/broadcom/b43legacy/main.c ++++ b/drivers/net/wireless/broadcom/b43legacy/main.c +@@ -3532,6 +3532,7 @@ static int b43legacy_op_get_survey(struc + + static const struct ieee80211_ops b43legacy_hw_ops = { + .tx = b43legacy_op_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .conf_tx = b43legacy_op_conf_tx, + .add_interface = b43legacy_op_add_interface, + .remove_interface = b43legacy_op_remove_interface, +--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c +@@ -962,6 +962,7 @@ static int brcms_ops_beacon_set_tim(stru + + static const struct ieee80211_ops brcms_ops = { + .tx = brcms_ops_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = brcms_ops_start, + .stop = brcms_ops_stop, + .add_interface = brcms_ops_add_interface, +--- a/drivers/net/wireless/intel/iwlegacy/3945-mac.c ++++ b/drivers/net/wireless/intel/iwlegacy/3945-mac.c +@@ -3439,6 +3439,7 @@ static const struct attribute_group il39 + + static struct ieee80211_ops il3945_mac_ops __ro_after_init = { + .tx = il3945_mac_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = il3945_mac_start, + .stop = il3945_mac_stop, + .add_interface = il_mac_add_interface, +--- a/drivers/net/wireless/intel/iwlegacy/4965-mac.c ++++ b/drivers/net/wireless/intel/iwlegacy/4965-mac.c +@@ -6308,6 +6308,7 @@ il4965_tx_queue_set_status(struct il_pri + + static const struct ieee80211_ops il4965_mac_ops = { + .tx = il4965_mac_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = il4965_mac_start, + .stop = il4965_mac_stop, + .add_interface = il_mac_add_interface, +--- a/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c ++++ b/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c +@@ -1571,6 +1571,7 @@ static void iwlagn_mac_sta_notify(struct + + const struct ieee80211_ops iwlagn_hw_ops = { + .tx = iwlagn_mac_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = iwlagn_mac_start, + .stop = iwlagn_mac_stop, + #ifdef CONFIG_PM_SLEEP +--- a/drivers/net/wireless/intersil/p54/main.c ++++ b/drivers/net/wireless/intersil/p54/main.c +@@ -705,6 +705,7 @@ static void p54_set_coverage_class(struc + + static const struct ieee80211_ops p54_ops = { + .tx = p54_tx_80211, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = p54_start, + .stop = p54_stop, + .add_interface = p54_add_interface, +--- a/drivers/net/wireless/mac80211_hwsim.c ++++ b/drivers/net/wireless/mac80211_hwsim.c +@@ -3109,6 +3109,7 @@ static int mac80211_hwsim_change_sta_lin + + #define HWSIM_COMMON_OPS \ + .tx = mac80211_hwsim_tx, \ ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, \ + .start = mac80211_hwsim_start, \ + .stop = mac80211_hwsim_stop, \ + .add_interface = mac80211_hwsim_add_interface, \ +--- a/drivers/net/wireless/marvell/libertas_tf/main.c ++++ b/drivers/net/wireless/marvell/libertas_tf/main.c +@@ -474,6 +474,7 @@ static int lbtf_op_get_survey(struct iee + + static const struct ieee80211_ops lbtf_ops = { + .tx = lbtf_op_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = lbtf_op_start, + .stop = lbtf_op_stop, + .add_interface = lbtf_op_add_interface, +--- a/drivers/net/wireless/marvell/mwl8k.c ++++ b/drivers/net/wireless/marvell/mwl8k.c +@@ -5611,6 +5611,7 @@ static void mwl8k_sw_scan_complete(struc + + static const struct ieee80211_ops mwl8k_ops = { + .tx = mwl8k_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = mwl8k_start, + .stop = mwl8k_stop, + .add_interface = mwl8k_add_interface, +--- a/drivers/net/wireless/mediatek/mt7601u/main.c ++++ b/drivers/net/wireless/mediatek/mt7601u/main.c +@@ -406,6 +406,7 @@ out: + + const struct ieee80211_ops mt7601u_ops = { + .tx = mt7601u_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = mt7601u_start, + .stop = mt7601u_stop, + .add_interface = mt7601u_add_interface, +--- a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c +@@ -1706,6 +1706,7 @@ static int rt2400pci_tx_last_beacon(stru + + static const struct ieee80211_ops rt2400pci_mac80211_ops = { + .tx = rt2x00mac_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = rt2x00mac_start, + .stop = rt2x00mac_stop, + .add_interface = rt2x00mac_add_interface, +--- a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c +@@ -2004,6 +2004,7 @@ static int rt2500pci_tx_last_beacon(stru + + static const struct ieee80211_ops rt2500pci_mac80211_ops = { + .tx = rt2x00mac_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = rt2x00mac_start, + .stop = rt2x00mac_stop, + .add_interface = rt2x00mac_add_interface, +--- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c +@@ -1795,6 +1795,7 @@ static int rt2500usb_probe_hw(struct rt2 + + static const struct ieee80211_ops rt2500usb_mac80211_ops = { + .tx = rt2x00mac_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = rt2x00mac_start, + .stop = rt2x00mac_stop, + .add_interface = rt2x00mac_add_interface, +--- a/drivers/net/wireless/ralink/rt2x00/rt2800pci.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800pci.c +@@ -288,6 +288,7 @@ static int rt2800pci_read_eeprom(struct + + static const struct ieee80211_ops rt2800pci_mac80211_ops = { + .tx = rt2x00mac_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = rt2x00mac_start, + .stop = rt2x00mac_stop, + .add_interface = rt2x00mac_add_interface, +--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c +@@ -133,6 +133,7 @@ static int rt2800soc_write_firmware(stru + + static const struct ieee80211_ops rt2800soc_mac80211_ops = { + .tx = rt2x00mac_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = rt2x00mac_start, + .stop = rt2x00mac_stop, + .add_interface = rt2x00mac_add_interface, +--- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c +@@ -630,6 +630,7 @@ static int rt2800usb_probe_hw(struct rt2 + + static const struct ieee80211_ops rt2800usb_mac80211_ops = { + .tx = rt2x00mac_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = rt2x00mac_start, + .stop = rt2x00mac_stop, + .add_interface = rt2x00mac_add_interface, +--- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c +@@ -2873,6 +2873,7 @@ static u64 rt61pci_get_tsf(struct ieee80 + + static const struct ieee80211_ops rt61pci_mac80211_ops = { + .tx = rt2x00mac_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = rt2x00mac_start, + .stop = rt2x00mac_stop, + .add_interface = rt2x00mac_add_interface, +--- a/drivers/net/wireless/ralink/rt2x00/rt73usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt73usb.c +@@ -2292,6 +2292,7 @@ static u64 rt73usb_get_tsf(struct ieee80 + + static const struct ieee80211_ops rt73usb_mac80211_ops = { + .tx = rt2x00mac_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = rt2x00mac_start, + .stop = rt2x00mac_stop, + .add_interface = rt2x00mac_add_interface, +--- a/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c ++++ b/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c +@@ -1608,6 +1608,7 @@ static void rtl8180_configure_filter(str + + static const struct ieee80211_ops rtl8180_ops = { + .tx = rtl8180_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = rtl8180_start, + .stop = rtl8180_stop, + .add_interface = rtl8180_add_interface, +--- a/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c ++++ b/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c +@@ -1378,6 +1378,7 @@ static int rtl8187_conf_tx(struct ieee80 + + static const struct ieee80211_ops rtl8187_ops = { + .tx = rtl8187_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = rtl8187_start, + .stop = rtl8187_stop, + .add_interface = rtl8187_add_interface, +--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c ++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +@@ -6548,6 +6548,7 @@ static void rtl8xxxu_stop(struct ieee802 + + static const struct ieee80211_ops rtl8xxxu_ops = { + .tx = rtl8xxxu_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .add_interface = rtl8xxxu_add_interface, + .remove_interface = rtl8xxxu_remove_interface, + .config = rtl8xxxu_config, +--- a/drivers/net/wireless/realtek/rtlwifi/core.c ++++ b/drivers/net/wireless/realtek/rtlwifi/core.c +@@ -1912,6 +1912,7 @@ const struct ieee80211_ops rtl_ops = { + .start = rtl_op_start, + .stop = rtl_op_stop, + .tx = rtl_op_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .add_interface = rtl_op_add_interface, + .remove_interface = rtl_op_remove_interface, + .change_interface = rtl_op_change_interface, +--- a/drivers/net/wireless/realtek/rtw88/mac80211.c ++++ b/drivers/net/wireless/realtek/rtw88/mac80211.c +@@ -896,6 +896,7 @@ static void rtw_ops_sta_rc_update(struct + + const struct ieee80211_ops rtw_ops = { + .tx = rtw_ops_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .wake_tx_queue = rtw_ops_wake_tx_queue, + .start = rtw_ops_start, + .stop = rtw_ops_stop, +--- a/drivers/net/wireless/realtek/rtw89/mac80211.c ++++ b/drivers/net/wireless/realtek/rtw89/mac80211.c +@@ -918,6 +918,7 @@ static int rtw89_ops_set_tid_config(stru + + const struct ieee80211_ops rtw89_ops = { + .tx = rtw89_ops_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .wake_tx_queue = rtw89_ops_wake_tx_queue, + .start = rtw89_ops_start, + .stop = rtw89_ops_stop, +--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c ++++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c +@@ -1958,6 +1958,7 @@ static int rsi_mac80211_resume(struct ie + + static const struct ieee80211_ops mac80211_ops = { + .tx = rsi_mac80211_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = rsi_mac80211_start, + .stop = rsi_mac80211_stop, + .add_interface = rsi_mac80211_add_interface, +--- a/drivers/net/wireless/st/cw1200/main.c ++++ b/drivers/net/wireless/st/cw1200/main.c +@@ -209,6 +209,7 @@ static const struct ieee80211_ops cw1200 + .remove_interface = cw1200_remove_interface, + .change_interface = cw1200_change_interface, + .tx = cw1200_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .hw_scan = cw1200_hw_scan, + .set_tim = cw1200_set_tim, + .sta_notify = cw1200_sta_notify, +--- a/drivers/net/wireless/ti/wl1251/main.c ++++ b/drivers/net/wireless/ti/wl1251/main.c +@@ -1359,6 +1359,7 @@ static const struct ieee80211_ops wl1251 + .prepare_multicast = wl1251_op_prepare_multicast, + .configure_filter = wl1251_op_configure_filter, + .tx = wl1251_op_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .set_key = wl1251_op_set_key, + .hw_scan = wl1251_op_hw_scan, + .bss_info_changed = wl1251_op_bss_info_changed, +--- a/drivers/net/wireless/ti/wlcore/main.c ++++ b/drivers/net/wireless/ti/wlcore/main.c +@@ -5942,6 +5942,7 @@ static const struct ieee80211_ops wl1271 + .prepare_multicast = wl1271_op_prepare_multicast, + .configure_filter = wl1271_op_configure_filter, + .tx = wl1271_op_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .set_key = wlcore_op_set_key, + .hw_scan = wl1271_op_hw_scan, + .cancel_hw_scan = wl1271_op_cancel_hw_scan, +--- a/drivers/net/wireless/zydas/zd1211rw/zd_mac.c ++++ b/drivers/net/wireless/zydas/zd1211rw/zd_mac.c +@@ -1344,6 +1344,7 @@ static u64 zd_op_get_tsf(struct ieee8021 + + static const struct ieee80211_ops zd_ops = { + .tx = zd_op_tx, ++ .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .start = zd_op_start, + .stop = zd_op_stop, + .add_interface = zd_op_add_interface, diff --git a/package/kernel/mac80211/patches/subsys/306-03-v6.2-wifi-mac80211-Drop-support-for-TX-push-path.patch b/package/kernel/mac80211/patches/subsys/306-03-v6.2-wifi-mac80211-Drop-support-for-TX-push-path.patch new file mode 100644 index 0000000000..f9f9977cee --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/306-03-v6.2-wifi-mac80211-Drop-support-for-TX-push-path.patch @@ -0,0 +1,683 @@ +From: Alexander Wetzel +Date: Sun, 9 Oct 2022 18:30:40 +0200 +Subject: [PATCH] wifi: mac80211: Drop support for TX push path + +All drivers are now using mac80211 internal queues (iTXQs). +Drop mac80211 internal support for the old push path. + +Signed-off-by: Alexander Wetzel +Signed-off-by: Johannes Berg +--- + +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -4346,9 +4346,6 @@ static int ieee80211_get_txq_stats(struc + struct ieee80211_sub_if_data *sdata; + int ret = 0; + +- if (!local->ops->wake_tx_queue) +- return 1; +- + spin_lock_bh(&local->fq.lock); + rcu_read_lock(); + +--- a/net/mac80211/debugfs.c ++++ b/net/mac80211/debugfs.c +@@ -663,9 +663,7 @@ void debugfs_hw_add(struct ieee80211_loc + DEBUGFS_ADD_MODE(force_tx_status, 0600); + DEBUGFS_ADD_MODE(aql_enable, 0600); + DEBUGFS_ADD(aql_pending); +- +- if (local->ops->wake_tx_queue) +- DEBUGFS_ADD_MODE(aqm, 0600); ++ DEBUGFS_ADD_MODE(aqm, 0600); + + DEBUGFS_ADD_MODE(airtime_flags, 0600); + +--- a/net/mac80211/debugfs_netdev.c ++++ b/net/mac80211/debugfs_netdev.c +@@ -677,8 +677,7 @@ static void add_common_files(struct ieee + DEBUGFS_ADD(rc_rateidx_vht_mcs_mask_5ghz); + DEBUGFS_ADD(hw_queues); + +- if (sdata->local->ops->wake_tx_queue && +- sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && ++ if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && + sdata->vif.type != NL80211_IFTYPE_NAN) + DEBUGFS_ADD(aqm); + } +--- a/net/mac80211/debugfs_sta.c ++++ b/net/mac80211/debugfs_sta.c +@@ -1057,10 +1057,8 @@ void ieee80211_sta_debugfs_add(struct st + DEBUGFS_ADD_COUNTER(rx_fragments, deflink.rx_stats.fragments); + DEBUGFS_ADD_COUNTER(tx_filtered, deflink.status_stats.filtered); + +- if (local->ops->wake_tx_queue) { +- DEBUGFS_ADD(aqm); +- DEBUGFS_ADD(airtime); +- } ++ DEBUGFS_ADD(aqm); ++ DEBUGFS_ADD(airtime); + + if (wiphy_ext_feature_isset(local->hw.wiphy, + NL80211_EXT_FEATURE_AQL)) +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -2294,7 +2294,6 @@ void ieee80211_wake_queue_by_reason(stru + void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue, + enum queue_stop_reason reason, + bool refcounted); +-void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue); + void ieee80211_add_pending_skb(struct ieee80211_local *local, + struct sk_buff *skb); + void ieee80211_add_pending_skbs(struct ieee80211_local *local, +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -460,12 +460,6 @@ static void ieee80211_do_stop(struct iee + if (cancel_scan) + ieee80211_scan_cancel(local); + +- /* +- * Stop TX on this interface first. +- */ +- if (!local->ops->wake_tx_queue && sdata->dev) +- netif_tx_stop_all_queues(sdata->dev); +- + ieee80211_roc_purge(local, sdata); + + switch (sdata->vif.type) { +@@ -813,13 +807,6 @@ static void ieee80211_uninit(struct net_ + ieee80211_teardown_sdata(IEEE80211_DEV_TO_SUB_IF(dev)); + } + +-static u16 ieee80211_netdev_select_queue(struct net_device *dev, +- struct sk_buff *skb, +- struct net_device *sb_dev) +-{ +- return ieee80211_select_queue(IEEE80211_DEV_TO_SUB_IF(dev), skb); +-} +- + static void + ieee80211_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) + { +@@ -833,7 +820,6 @@ static const struct net_device_ops ieee8 + .ndo_start_xmit = ieee80211_subif_start_xmit, + .ndo_set_rx_mode = ieee80211_set_multicast_list, + .ndo_set_mac_address = ieee80211_change_mac, +- .ndo_select_queue = ieee80211_netdev_select_queue, + .ndo_get_stats64 = ieee80211_get_stats64, + }; + +@@ -941,7 +927,6 @@ static const struct net_device_ops ieee8 + .ndo_start_xmit = ieee80211_subif_start_xmit_8023, + .ndo_set_rx_mode = ieee80211_set_multicast_list, + .ndo_set_mac_address = ieee80211_change_mac, +- .ndo_select_queue = ieee80211_netdev_select_queue, + .ndo_get_stats64 = ieee80211_get_stats64, + .ndo_fill_forward_path = ieee80211_netdev_fill_forward_path, + }; +@@ -1443,35 +1428,6 @@ int ieee80211_do_open(struct wireless_de + + ieee80211_recalc_ps(local); + +- if (sdata->vif.type == NL80211_IFTYPE_MONITOR || +- sdata->vif.type == NL80211_IFTYPE_AP_VLAN || +- local->ops->wake_tx_queue) { +- /* XXX: for AP_VLAN, actually track AP queues */ +- if (dev) +- netif_tx_start_all_queues(dev); +- } else if (dev) { +- unsigned long flags; +- int n_acs = IEEE80211_NUM_ACS; +- int ac; +- +- if (local->hw.queues < IEEE80211_NUM_ACS) +- n_acs = 1; +- +- spin_lock_irqsave(&local->queue_stop_reason_lock, flags); +- if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE || +- (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 && +- skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) { +- for (ac = 0; ac < n_acs; ac++) { +- int ac_queue = sdata->vif.hw_queue[ac]; +- +- if (local->queue_stop_reasons[ac_queue] == 0 && +- skb_queue_empty(&local->pending[ac_queue])) +- netif_start_subqueue(dev, ac); +- } +- } +- spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); +- } +- + set_bit(SDATA_STATE_RUNNING, &sdata->state); + + return 0; +@@ -1501,17 +1457,12 @@ static void ieee80211_if_setup(struct ne + { + ether_setup(dev); + dev->priv_flags &= ~IFF_TX_SKB_SHARING; ++ dev->priv_flags |= IFF_NO_QUEUE; + dev->netdev_ops = &ieee80211_dataif_ops; + dev->needs_free_netdev = true; + dev->priv_destructor = ieee80211_if_free; + } + +-static void ieee80211_if_setup_no_queue(struct net_device *dev) +-{ +- ieee80211_if_setup(dev); +- dev->priv_flags |= IFF_NO_QUEUE; +-} +- + static void ieee80211_iface_process_skb(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, + struct sk_buff *skb) +@@ -2096,9 +2047,7 @@ int ieee80211_if_add(struct ieee80211_lo + struct net_device *ndev = NULL; + struct ieee80211_sub_if_data *sdata = NULL; + struct txq_info *txqi; +- void (*if_setup)(struct net_device *dev); + int ret, i; +- int txqs = 1; + + ASSERT_RTNL(); + +@@ -2121,30 +2070,18 @@ int ieee80211_if_add(struct ieee80211_lo + sizeof(void *)); + int txq_size = 0; + +- if (local->ops->wake_tx_queue && +- type != NL80211_IFTYPE_AP_VLAN && ++ if (type != NL80211_IFTYPE_AP_VLAN && + (type != NL80211_IFTYPE_MONITOR || + (params->flags & MONITOR_FLAG_ACTIVE))) + txq_size += sizeof(struct txq_info) + + local->hw.txq_data_size; + +- if (local->ops->wake_tx_queue) { +- if_setup = ieee80211_if_setup_no_queue; +- } else { +- if_setup = ieee80211_if_setup; +- if (local->hw.queues >= IEEE80211_NUM_ACS) +- txqs = IEEE80211_NUM_ACS; +- } +- + ndev = alloc_netdev_mqs(size + txq_size, + name, name_assign_type, +- if_setup, txqs, 1); ++ ieee80211_if_setup, 1, 1); + if (!ndev) + return -ENOMEM; + +- if (!local->ops->wake_tx_queue && local->hw.wiphy->tx_queue_len) +- ndev->tx_queue_len = local->hw.wiphy->tx_queue_len; +- + dev_net_set(ndev, wiphy_net(local->hw.wiphy)); + + ndev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); +--- a/net/mac80211/main.c ++++ b/net/mac80211/main.c +@@ -630,7 +630,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ + + if (WARN_ON(!ops->tx || !ops->start || !ops->stop || !ops->config || + !ops->add_interface || !ops->remove_interface || +- !ops->configure_filter)) ++ !ops->configure_filter || !ops->wake_tx_queue)) + return NULL; + + if (WARN_ON(ops->sta_state && (ops->sta_add || ops->sta_remove))) +@@ -719,9 +719,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ + if (!ops->set_key) + wiphy->flags |= WIPHY_FLAG_IBSS_RSN; + +- if (ops->wake_tx_queue) +- wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_TXQS); +- ++ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_TXQS); + wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_RRM); + + wiphy->bss_priv_size = sizeof(struct ieee80211_bss); +@@ -834,10 +832,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ + atomic_set(&local->agg_queue_stop[i], 0); + } + tasklet_setup(&local->tx_pending_tasklet, ieee80211_tx_pending); +- +- if (ops->wake_tx_queue) +- tasklet_setup(&local->wake_txqs_tasklet, ieee80211_wake_txqs); +- ++ tasklet_setup(&local->wake_txqs_tasklet, ieee80211_wake_txqs); + tasklet_setup(&local->tasklet, ieee80211_tasklet_handler); + + skb_queue_head_init(&local->skb_queue); +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -1571,9 +1571,6 @@ static void sta_ps_start(struct sta_info + + ieee80211_clear_fast_xmit(sta); + +- if (!sta->sta.txq[0]) +- return; +- + for (tid = 0; tid < IEEE80211_NUM_TIDS; tid++) { + struct ieee80211_txq *txq = sta->sta.txq[tid]; + struct txq_info *txqi = to_txq_info(txq); +--- a/net/mac80211/sta_info.c ++++ b/net/mac80211/sta_info.c +@@ -140,17 +140,15 @@ static void __cleanup_single_sta(struct + atomic_dec(&ps->num_sta_ps); + } + +- if (sta->sta.txq[0]) { +- for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { +- struct txq_info *txqi; ++ for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { ++ struct txq_info *txqi; + +- if (!sta->sta.txq[i]) +- continue; ++ if (!sta->sta.txq[i]) ++ continue; + +- txqi = to_txq_info(sta->sta.txq[i]); ++ txqi = to_txq_info(sta->sta.txq[i]); + +- ieee80211_txq_purge(local, txqi); +- } ++ ieee80211_txq_purge(local, txqi); + } + + for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { +@@ -425,8 +423,7 @@ void sta_info_free(struct ieee80211_loca + + sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr); + +- if (sta->sta.txq[0]) +- kfree(to_txq_info(sta->sta.txq[0])); ++ kfree(to_txq_info(sta->sta.txq[0])); + kfree(rcu_dereference_raw(sta->sta.rates)); + #ifdef CPTCFG_MAC80211_MESH + kfree(sta->mesh); +@@ -527,6 +524,8 @@ __sta_info_alloc(struct ieee80211_sub_if + struct ieee80211_local *local = sdata->local; + struct ieee80211_hw *hw = &local->hw; + struct sta_info *sta; ++ void *txq_data; ++ int size; + int i; + + sta = kzalloc(sizeof(*sta) + hw->sta_data_size, gfp); +@@ -597,21 +596,18 @@ __sta_info_alloc(struct ieee80211_sub_if + + sta->last_connected = ktime_get_seconds(); + +- if (local->ops->wake_tx_queue) { +- void *txq_data; +- int size = sizeof(struct txq_info) + +- ALIGN(hw->txq_data_size, sizeof(void *)); ++ size = sizeof(struct txq_info) + ++ ALIGN(hw->txq_data_size, sizeof(void *)); + +- txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp); +- if (!txq_data) +- goto free; ++ txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp); ++ if (!txq_data) ++ goto free; + +- for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { +- struct txq_info *txq = txq_data + i * size; ++ for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { ++ struct txq_info *txq = txq_data + i * size; + +- /* might not do anything for the bufferable MMPDU TXQ */ +- ieee80211_txq_init(sdata, sta, txq, i); +- } ++ /* might not do anything for the (bufferable) MMPDU TXQ */ ++ ieee80211_txq_init(sdata, sta, txq, i); + } + + if (sta_prepare_rate_control(local, sta, gfp)) +@@ -685,8 +681,7 @@ __sta_info_alloc(struct ieee80211_sub_if + return sta; + + free_txq: +- if (sta->sta.txq[0]) +- kfree(to_txq_info(sta->sta.txq[0])); ++ kfree(to_txq_info(sta->sta.txq[0])); + free: + sta_info_free_link(&sta->deflink); + #ifdef CPTCFG_MAC80211_MESH +@@ -1960,9 +1955,6 @@ ieee80211_sta_ps_deliver_response(struct + * TIM recalculation. + */ + +- if (!sta->sta.txq[0]) +- return; +- + for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) { + if (!sta->sta.txq[tid] || + !(driver_release_tids & BIT(tid)) || +@@ -2447,7 +2439,7 @@ static void sta_set_tidstats(struct sta_ + tidstats->tx_msdu_failed = sta->deflink.status_stats.msdu_failed[tid]; + } + +- if (local->ops->wake_tx_queue && tid < IEEE80211_NUM_TIDS) { ++ if (tid < IEEE80211_NUM_TIDS) { + spin_lock_bh(&local->fq.lock); + rcu_read_lock(); + +@@ -2775,9 +2767,6 @@ unsigned long ieee80211_sta_last_active( + + static void sta_update_codel_params(struct sta_info *sta, u32 thr) + { +- if (!sta->sdata->local->ops->wake_tx_queue) +- return; +- + if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) { + sta->cparams.target = MS2TIME(50); + sta->cparams.interval = MS2TIME(300); +--- a/net/mac80211/tdls.c ++++ b/net/mac80211/tdls.c +@@ -1016,7 +1016,6 @@ ieee80211_tdls_prep_mgmt_packet(struct w + skb->priority = 256 + 5; + break; + } +- skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb)); + + /* + * Set the WLAN_TDLS_TEARDOWN flag to indicate a teardown in progress. +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -1600,9 +1600,6 @@ int ieee80211_txq_setup_flows(struct iee + bool supp_vht = false; + enum nl80211_band band; + +- if (!local->ops->wake_tx_queue) +- return 0; +- + ret = fq_init(fq, 4096); + if (ret) + return ret; +@@ -1650,9 +1647,6 @@ void ieee80211_txq_teardown_flows(struct + { + struct fq *fq = &local->fq; + +- if (!local->ops->wake_tx_queue) +- return; +- + kfree(local->cvars); + local->cvars = NULL; + +@@ -1669,8 +1663,7 @@ static bool ieee80211_queue_skb(struct i + struct ieee80211_vif *vif; + struct txq_info *txqi; + +- if (!local->ops->wake_tx_queue || +- sdata->vif.type == NL80211_IFTYPE_MONITOR) ++ if (sdata->vif.type == NL80211_IFTYPE_MONITOR) + return false; + + if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) +@@ -4193,12 +4186,7 @@ void __ieee80211_subif_start_xmit(struct + if (IS_ERR(sta)) + sta = NULL; + +- if (local->ops->wake_tx_queue) { +- u16 queue = __ieee80211_select_queue(sdata, sta, skb); +- skb_set_queue_mapping(skb, queue); +- skb_get_hash(skb); +- } +- ++ skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb)); + ieee80211_aggr_check(sdata, sta, skb); + + sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift); +@@ -4509,11 +4497,7 @@ static void ieee80211_8023_xmit(struct i + struct tid_ampdu_tx *tid_tx; + u8 tid; + +- if (local->ops->wake_tx_queue) { +- u16 queue = __ieee80211_select_queue(sdata, sta, skb); +- skb_set_queue_mapping(skb, queue); +- skb_get_hash(skb); +- } ++ skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb)); + + if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) && + test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state)) +@@ -4767,9 +4751,6 @@ void ieee80211_tx_pending(struct tasklet + if (!txok) + break; + } +- +- if (skb_queue_empty(&local->pending[i])) +- ieee80211_propagate_queue_wake(local, i); + } + spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); + +@@ -5962,10 +5943,9 @@ int ieee80211_tx_control_port(struct wip + } + + if (!IS_ERR(sta)) { +- u16 queue = __ieee80211_select_queue(sdata, sta, skb); ++ u16 queue = ieee80211_select_queue(sdata, sta, skb); + + skb_set_queue_mapping(skb, queue); +- skb_get_hash(skb); + + /* + * for MLO STA, the SA should be the AP MLD address, but +--- a/net/mac80211/util.c ++++ b/net/mac80211/util.c +@@ -444,39 +444,6 @@ void ieee80211_wake_txqs(struct tasklet_ + spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); + } + +-void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue) +-{ +- struct ieee80211_sub_if_data *sdata; +- int n_acs = IEEE80211_NUM_ACS; +- +- if (local->ops->wake_tx_queue) +- return; +- +- if (local->hw.queues < IEEE80211_NUM_ACS) +- n_acs = 1; +- +- list_for_each_entry_rcu(sdata, &local->interfaces, list) { +- int ac; +- +- if (!sdata->dev) +- continue; +- +- if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE && +- local->queue_stop_reasons[sdata->vif.cab_queue] != 0) +- continue; +- +- for (ac = 0; ac < n_acs; ac++) { +- int ac_queue = sdata->vif.hw_queue[ac]; +- +- if (ac_queue == queue || +- (sdata->vif.cab_queue == queue && +- local->queue_stop_reasons[ac_queue] == 0 && +- skb_queue_empty(&local->pending[ac_queue]))) +- netif_wake_subqueue(sdata->dev, ac); +- } +- } +-} +- + static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue, + enum queue_stop_reason reason, + bool refcounted, +@@ -507,11 +474,7 @@ static void __ieee80211_wake_queue(struc + /* someone still has this queue stopped */ + return; + +- if (skb_queue_empty(&local->pending[queue])) { +- rcu_read_lock(); +- ieee80211_propagate_queue_wake(local, queue); +- rcu_read_unlock(); +- } else ++ if (!skb_queue_empty(&local->pending[queue])) + tasklet_schedule(&local->tx_pending_tasklet); + + /* +@@ -521,12 +484,10 @@ static void __ieee80211_wake_queue(struc + * release someone's lock, but it is fine because all the callers of + * __ieee80211_wake_queue call it right before releasing the lock. + */ +- if (local->ops->wake_tx_queue) { +- if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER) +- tasklet_schedule(&local->wake_txqs_tasklet); +- else +- _ieee80211_wake_txqs(local, flags); +- } ++ if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER) ++ tasklet_schedule(&local->wake_txqs_tasklet); ++ else ++ _ieee80211_wake_txqs(local, flags); + } + + void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue, +@@ -554,8 +515,6 @@ static void __ieee80211_stop_queue(struc + bool refcounted) + { + struct ieee80211_local *local = hw_to_local(hw); +- struct ieee80211_sub_if_data *sdata; +- int n_acs = IEEE80211_NUM_ACS; + + trace_stop_queue(local, queue, reason); + +@@ -567,27 +526,7 @@ static void __ieee80211_stop_queue(struc + else + local->q_stop_reasons[queue][reason]++; + +- if (__test_and_set_bit(reason, &local->queue_stop_reasons[queue])) +- return; +- +- if (local->hw.queues < IEEE80211_NUM_ACS) +- n_acs = 1; +- +- rcu_read_lock(); +- list_for_each_entry_rcu(sdata, &local->interfaces, list) { +- int ac; +- +- if (!sdata->dev) +- continue; +- +- for (ac = 0; ac < n_acs; ac++) { +- if (!local->ops->wake_tx_queue && +- (sdata->vif.hw_queue[ac] == queue || +- sdata->vif.cab_queue == queue)) +- netif_stop_subqueue(sdata->dev, ac); +- } +- } +- rcu_read_unlock(); ++ set_bit(reason, &local->queue_stop_reasons[queue]); + } + + void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue, +--- a/net/mac80211/wme.c ++++ b/net/mac80211/wme.c +@@ -122,6 +122,9 @@ u16 ieee80211_select_queue_80211(struct + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); + u8 *p; + ++ /* Ensure hash is set prior to potential SW encryption */ ++ skb_get_hash(skb); ++ + if ((info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER) || + local->hw.queues < IEEE80211_NUM_ACS) + return 0; +@@ -141,13 +144,16 @@ u16 ieee80211_select_queue_80211(struct + return ieee80211_downgrade_queue(sdata, NULL, skb); + } + +-u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata, +- struct sta_info *sta, struct sk_buff *skb) ++u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata, ++ struct sta_info *sta, struct sk_buff *skb) + { + const struct ethhdr *eth = (void *)skb->data; + struct mac80211_qos_map *qos_map; + bool qos; + ++ /* Ensure hash is set prior to potential SW encryption */ ++ skb_get_hash(skb); ++ + /* all mesh/ocb stations are required to support WME */ + if ((sdata->vif.type == NL80211_IFTYPE_MESH_POINT && + !is_multicast_ether_addr(eth->h_dest)) || +@@ -178,59 +184,6 @@ u16 __ieee80211_select_queue(struct ieee + return ieee80211_downgrade_queue(sdata, sta, skb); + } + +- +-/* Indicate which queue to use. */ +-u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata, +- struct sk_buff *skb) +-{ +- struct ieee80211_local *local = sdata->local; +- struct sta_info *sta = NULL; +- const u8 *ra = NULL; +- u16 ret; +- +- /* when using iTXQ, we can do this later */ +- if (local->ops->wake_tx_queue) +- return 0; +- +- if (local->hw.queues < IEEE80211_NUM_ACS || skb->len < 6) { +- skb->priority = 0; /* required for correct WPA/11i MIC */ +- return 0; +- } +- +- rcu_read_lock(); +- switch (sdata->vif.type) { +- case NL80211_IFTYPE_AP_VLAN: +- sta = rcu_dereference(sdata->u.vlan.sta); +- if (sta) +- break; +- fallthrough; +- case NL80211_IFTYPE_AP: +- ra = skb->data; +- break; +- case NL80211_IFTYPE_STATION: +- /* might be a TDLS station */ +- sta = sta_info_get(sdata, skb->data); +- if (sta) +- break; +- +- ra = sdata->deflink.u.mgd.bssid; +- break; +- case NL80211_IFTYPE_ADHOC: +- ra = skb->data; +- break; +- default: +- break; +- } +- +- if (!sta && ra && !is_multicast_ether_addr(ra)) +- sta = sta_info_get(sdata, ra); +- +- ret = __ieee80211_select_queue(sdata, sta, skb); +- +- rcu_read_unlock(); +- return ret; +-} +- + /** + * ieee80211_set_qos_hdr - Fill in the QoS header if there is one. + * +--- a/net/mac80211/wme.h ++++ b/net/mac80211/wme.h +@@ -13,10 +13,8 @@ + u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata, + struct sk_buff *skb, + struct ieee80211_hdr *hdr); +-u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata, +- struct sta_info *sta, struct sk_buff *skb); + u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata, +- struct sk_buff *skb); ++ struct sta_info *sta, struct sk_buff *skb); + void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata, + struct sk_buff *skb); + diff --git a/package/kernel/mac80211/patches/subsys/306-04-v6.2-wifi-realtek-remove-duplicated-wake_tx_queue.patch b/package/kernel/mac80211/patches/subsys/306-04-v6.2-wifi-realtek-remove-duplicated-wake_tx_queue.patch new file mode 100644 index 0000000000..f0dfc75a78 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/306-04-v6.2-wifi-realtek-remove-duplicated-wake_tx_queue.patch @@ -0,0 +1,32 @@ +From: Johannes Berg +Date: Mon, 10 Oct 2022 19:17:46 +0200 +Subject: [PATCH] wifi: realtek: remove duplicated wake_tx_queue + +By accident, the previous patch duplicated the initialization +of the wake_tx_queue callback. Fix that by removing the new +initializations. + +Fixes: a790cc3a4fad ("wifi: mac80211: add wake_tx_queue callback to drivers") +Signed-off-by: Johannes Berg +--- + +--- a/drivers/net/wireless/realtek/rtw88/mac80211.c ++++ b/drivers/net/wireless/realtek/rtw88/mac80211.c +@@ -896,7 +896,6 @@ static void rtw_ops_sta_rc_update(struct + + const struct ieee80211_ops rtw_ops = { + .tx = rtw_ops_tx, +- .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .wake_tx_queue = rtw_ops_wake_tx_queue, + .start = rtw_ops_start, + .stop = rtw_ops_stop, +--- a/drivers/net/wireless/realtek/rtw89/mac80211.c ++++ b/drivers/net/wireless/realtek/rtw89/mac80211.c +@@ -918,7 +918,6 @@ static int rtw89_ops_set_tid_config(stru + + const struct ieee80211_ops rtw89_ops = { + .tx = rtw89_ops_tx, +- .wake_tx_queue = ieee80211_handle_wake_tx_queue, + .wake_tx_queue = rtw89_ops_wake_tx_queue, + .start = rtw89_ops_start, + .stop = rtw89_ops_stop, diff --git a/package/kernel/mac80211/patches/subsys/306-mac80211-use-coarse-boottime-for-airtime-fairness-co.patch b/package/kernel/mac80211/patches/subsys/306-mac80211-use-coarse-boottime-for-airtime-fairness-co.patch deleted file mode 100644 index c43cd3acb9..0000000000 --- a/package/kernel/mac80211/patches/subsys/306-mac80211-use-coarse-boottime-for-airtime-fairness-co.patch +++ /dev/null @@ -1,60 +0,0 @@ -From: Felix Fietkau -Date: Tue, 14 Dec 2021 17:53:12 +0100 -Subject: [PATCH] mac80211: use coarse boottime for airtime fairness code - -The time values used by the airtime fairness code only need to be accurate -enough to cover station activity detection. -Using ktime_get_coarse_boottime_ns instead of ktime_get_boottime_ns will -drop the accuracy down to jiffies intervals, but at the same time saves -a lot of CPU cycles in a hot path - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -3820,7 +3820,7 @@ struct ieee80211_txq *ieee80211_next_txq - { - struct ieee80211_local *local = hw_to_local(hw); - struct airtime_sched_info *air_sched; -- u64 now = ktime_get_boottime_ns(); -+ u64 now = ktime_get_coarse_boottime_ns(); - struct ieee80211_txq *ret = NULL; - struct airtime_info *air_info; - struct txq_info *txqi = NULL; -@@ -3947,7 +3947,7 @@ void ieee80211_update_airtime_weight(str - u64 weight_sum = 0; - - if (unlikely(!now)) -- now = ktime_get_boottime_ns(); -+ now = ktime_get_coarse_boottime_ns(); - - lockdep_assert_held(&air_sched->lock); - -@@ -3973,7 +3973,7 @@ void ieee80211_schedule_txq(struct ieee8 - struct ieee80211_local *local = hw_to_local(hw); - struct txq_info *txqi = to_txq_info(txq); - struct airtime_sched_info *air_sched; -- u64 now = ktime_get_boottime_ns(); -+ u64 now = ktime_get_coarse_boottime_ns(); - struct airtime_info *air_info; - u8 ac = txq->ac; - bool was_active; -@@ -4031,7 +4031,7 @@ static void __ieee80211_unschedule_txq(s - - if (!purge) - airtime_set_active(air_sched, air_info, -- ktime_get_boottime_ns()); -+ ktime_get_coarse_boottime_ns()); - - rb_erase_cached(&txqi->schedule_order, - &air_sched->active_txqs); -@@ -4119,7 +4119,7 @@ bool ieee80211_txq_may_transmit(struct i - if (RB_EMPTY_NODE(&txqi->schedule_order)) - goto out; - -- now = ktime_get_boottime_ns(); -+ now = ktime_get_coarse_boottime_ns(); - - /* Like in ieee80211_next_txq(), make sure the first station in the - * scheduling order is eligible for transmission to avoid starvation. diff --git a/package/kernel/mac80211/patches/subsys/307-mac80211_hwsim-make-6-GHz-channels-usable.patch b/package/kernel/mac80211/patches/subsys/307-mac80211_hwsim-make-6-GHz-channels-usable.patch deleted file mode 100644 index 9c3b38adbf..0000000000 --- a/package/kernel/mac80211/patches/subsys/307-mac80211_hwsim-make-6-GHz-channels-usable.patch +++ /dev/null @@ -1,74 +0,0 @@ -From: Felix Fietkau -Date: Mon, 24 May 2021 11:46:09 +0200 -Subject: [PATCH] mac80211_hwsim: make 6 GHz channels usable - -The previous commit that claimed to add 6 GHz channels didn't actually make -them usable, since the 6 GHz band was not registered with mac80211. - -Fixes: 28881922abd7 ("mac80211_hwsim: add 6GHz channels") -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/wireless/mac80211_hwsim.c -+++ b/drivers/net/wireless/mac80211_hwsim.c -@@ -3008,15 +3008,19 @@ static void mac80211_hwsim_he_capab(stru - { - u16 n_iftype_data; - -- if (sband->band == NL80211_BAND_2GHZ) { -+ switch (sband->band) { -+ case NL80211_BAND_2GHZ: - n_iftype_data = ARRAY_SIZE(he_capa_2ghz); - sband->iftype_data = - (struct ieee80211_sband_iftype_data *)he_capa_2ghz; -- } else if (sband->band == NL80211_BAND_5GHZ) { -+ break; -+ case NL80211_BAND_5GHZ: -+ case NL80211_BAND_6GHZ: - n_iftype_data = ARRAY_SIZE(he_capa_5ghz); - sband->iftype_data = - (struct ieee80211_sband_iftype_data *)he_capa_5ghz; -- } else { -+ break; -+ default: - return; - } - -@@ -3306,6 +3310,12 @@ static int mac80211_hwsim_new_radio(stru - sband->vht_cap.vht_mcs.tx_mcs_map = - sband->vht_cap.vht_mcs.rx_mcs_map; - break; -+ case NL80211_BAND_6GHZ: -+ sband->channels = data->channels_6ghz; -+ sband->n_channels = ARRAY_SIZE(hwsim_channels_6ghz); -+ sband->bitrates = data->rates + 4; -+ sband->n_bitrates = ARRAY_SIZE(hwsim_rates) - 4; -+ break; - case NL80211_BAND_S1GHZ: - memcpy(&sband->s1g_cap, &hwsim_s1g_cap, - sizeof(sband->s1g_cap)); -@@ -3316,6 +3326,13 @@ static int mac80211_hwsim_new_radio(stru - continue; - } - -+ mac80211_hwsim_he_capab(sband); -+ -+ hw->wiphy->bands[band] = sband; -+ -+ if (band == NL80211_BAND_6GHZ) -+ continue; -+ - sband->ht_cap.ht_supported = true; - sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | - IEEE80211_HT_CAP_GRN_FLD | -@@ -3329,10 +3346,6 @@ static int mac80211_hwsim_new_radio(stru - sband->ht_cap.mcs.rx_mask[0] = 0xff; - sband->ht_cap.mcs.rx_mask[1] = 0xff; - sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; -- -- mac80211_hwsim_he_capab(sband); -- -- hw->wiphy->bands[band] = sband; - } - - /* By default all radios belong to the first group */ diff --git a/package/kernel/mac80211/patches/subsys/308-mac80211-add-support-for-.ndo_fill_forward_path.patch b/package/kernel/mac80211/patches/subsys/308-mac80211-add-support-for-.ndo_fill_forward_path.patch deleted file mode 100644 index a9a6182ab2..0000000000 --- a/package/kernel/mac80211/patches/subsys/308-mac80211-add-support-for-.ndo_fill_forward_path.patch +++ /dev/null @@ -1,178 +0,0 @@ -From: Felix Fietkau -Date: Fri, 12 Nov 2021 12:22:23 +0100 -Subject: [PATCH] mac80211: add support for .ndo_fill_forward_path - -This allows drivers to provide a destination device + info for flow offload -Only supported in combination with 802.3 encap offload - -Signed-off-by: Felix Fietkau -Tested-by: Lorenzo Bianconi -Link: https://lore.kernel.org/r/20211112112223.1209-1-nbd@nbd.name -Signed-off-by: Johannes Berg ---- - ---- a/include/net/mac80211.h -+++ b/include/net/mac80211.h -@@ -3937,6 +3937,8 @@ struct ieee80211_prep_tx_info { - * twt structure. - * @twt_teardown_request: Update the hw with TWT teardown request received - * from the peer. -+ * @net_fill_forward_path: Called from .ndo_fill_forward_path in order to -+ * resolve a path for hardware flow offloading - */ - struct ieee80211_ops { - void (*tx)(struct ieee80211_hw *hw, -@@ -4265,6 +4267,13 @@ struct ieee80211_ops { - struct ieee80211_twt_setup *twt); - void (*twt_teardown_request)(struct ieee80211_hw *hw, - struct ieee80211_sta *sta, u8 flowid); -+#if LINUX_VERSION_IS_GEQ(5,10,0) -+ int (*net_fill_forward_path)(struct ieee80211_hw *hw, -+ struct ieee80211_vif *vif, -+ struct ieee80211_sta *sta, -+ struct net_device_path_ctx *ctx, -+ struct net_device_path *path); -+#endif - }; - - /** ---- a/net/mac80211/driver-ops.h -+++ b/net/mac80211/driver-ops.h -@@ -1486,4 +1486,28 @@ static inline void drv_twt_teardown_requ - trace_drv_return_void(local); - } - -+#if LINUX_VERSION_IS_GEQ(5,10,0) -+static inline int drv_net_fill_forward_path(struct ieee80211_local *local, -+ struct ieee80211_sub_if_data *sdata, -+ struct ieee80211_sta *sta, -+ struct net_device_path_ctx *ctx, -+ struct net_device_path *path) -+{ -+ int ret = -EOPNOTSUPP; -+ -+ sdata = get_bss_sdata(sdata); -+ if (!check_sdata_in_driver(sdata)) -+ return -EIO; -+ -+ trace_drv_net_fill_forward_path(local, sdata, sta); -+ if (local->ops->net_fill_forward_path) -+ ret = local->ops->net_fill_forward_path(&local->hw, -+ &sdata->vif, sta, -+ ctx, path); -+ trace_drv_return_int(local, ret); -+ -+ return ret; -+} -+#endif -+ - #endif /* __MAC80211_DRIVER_OPS */ ---- a/net/mac80211/ieee80211_i.h -+++ b/net/mac80211/ieee80211_i.h -@@ -1489,7 +1489,7 @@ struct ieee80211_local { - }; - - static inline struct ieee80211_sub_if_data * --IEEE80211_DEV_TO_SUB_IF(struct net_device *dev) -+IEEE80211_DEV_TO_SUB_IF(const struct net_device *dev) - { - return netdev_priv(dev); - } ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -822,6 +822,66 @@ static const struct net_device_ops ieee8 - - }; - -+#if LINUX_VERSION_IS_GEQ(5,10,0) -+static int ieee80211_netdev_fill_forward_path(struct net_device_path_ctx *ctx, -+ struct net_device_path *path) -+{ -+ struct ieee80211_sub_if_data *sdata; -+ struct ieee80211_local *local; -+ struct sta_info *sta; -+ int ret = -ENOENT; -+ -+ sdata = IEEE80211_DEV_TO_SUB_IF(ctx->dev); -+ local = sdata->local; -+ -+ if (!local->ops->net_fill_forward_path) -+ return -EOPNOTSUPP; -+ -+ rcu_read_lock(); -+ switch (sdata->vif.type) { -+ case NL80211_IFTYPE_AP_VLAN: -+ sta = rcu_dereference(sdata->u.vlan.sta); -+ if (sta) -+ break; -+ if (sdata->wdev.use_4addr) -+ goto out; -+ if (is_multicast_ether_addr(ctx->daddr)) -+ goto out; -+ sta = sta_info_get_bss(sdata, ctx->daddr); -+ break; -+ case NL80211_IFTYPE_AP: -+ if (is_multicast_ether_addr(ctx->daddr)) -+ goto out; -+ sta = sta_info_get(sdata, ctx->daddr); -+ break; -+ case NL80211_IFTYPE_STATION: -+ if (sdata->wdev.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) { -+ sta = sta_info_get(sdata, ctx->daddr); -+ if (sta && test_sta_flag(sta, WLAN_STA_TDLS_PEER)) { -+ if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER_AUTH)) -+ goto out; -+ -+ break; -+ } -+ } -+ -+ sta = sta_info_get(sdata, sdata->u.mgd.bssid); -+ break; -+ default: -+ goto out; -+ } -+ -+ if (!sta) -+ goto out; -+ -+ ret = drv_net_fill_forward_path(local, sdata, &sta->sta, ctx, path); -+out: -+ rcu_read_unlock(); -+ -+ return ret; -+} -+#endif -+ - static const struct net_device_ops ieee80211_dataif_8023_ops = { - #if LINUX_VERSION_IS_LESS(4,10,0) - .ndo_change_mtu = __change_mtu, -@@ -839,7 +899,9 @@ static const struct net_device_ops ieee8 - #else - .ndo_get_stats64 = bp_ieee80211_get_stats64, - #endif -- -+#if LINUX_VERSION_IS_GEQ(5,10,0) -+ .ndo_fill_forward_path = ieee80211_netdev_fill_forward_path, -+#endif - }; - - static bool ieee80211_iftype_supports_hdr_offload(enum nl80211_iftype iftype) ---- a/net/mac80211/trace.h -+++ b/net/mac80211/trace.h -@@ -2892,6 +2892,15 @@ TRACE_EVENT(drv_twt_teardown_request, - ) - ); - -+#if LINUX_VERSION_IS_GEQ(5,10,0) -+DEFINE_EVENT(sta_event, drv_net_fill_forward_path, -+ TP_PROTO(struct ieee80211_local *local, -+ struct ieee80211_sub_if_data *sdata, -+ struct ieee80211_sta *sta), -+ TP_ARGS(local, sdata, sta) -+); -+#endif -+ - #endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */ - - #undef TRACE_INCLUDE_PATH diff --git a/package/kernel/mac80211/patches/subsys/310-mac80211-minstrel_ht-reduce-fluctuations-in-rate-pro.patch b/package/kernel/mac80211/patches/subsys/310-mac80211-minstrel_ht-reduce-fluctuations-in-rate-pro.patch deleted file mode 100644 index 3be43b8782..0000000000 --- a/package/kernel/mac80211/patches/subsys/310-mac80211-minstrel_ht-reduce-fluctuations-in-rate-pro.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Felix Fietkau -Date: Sat, 6 Feb 2021 16:08:01 +0100 -Subject: [PATCH] mac80211: minstrel_ht: reduce fluctuations in rate - probability stats - -In some scenarios when there is a lot of fluctuation in packet error rates, -rate switching can be amplified when the statistics get skewed by time slots -with very few tries. -Make the input data to the moving average more smooth by adding the -success/attempts count from the last stats window as well. This has the -advantage of smoothing the data without introducing any extra lag to sampling -rates. -This significantly improves rate stability on a strong test link subjected to -periodic noise bursts generated with a SDR - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/rc80211_minstrel_ht.c -+++ b/net/mac80211/rc80211_minstrel_ht.c -@@ -703,7 +703,8 @@ minstrel_ht_calc_rate_stats(struct minst - unsigned int cur_prob; - - if (unlikely(mrs->attempts > 0)) { -- cur_prob = MINSTREL_FRAC(mrs->success, mrs->attempts); -+ cur_prob = MINSTREL_FRAC(mrs->success + mrs->last_success, -+ mrs->attempts + mrs->last_attempts); - minstrel_filter_avg_add(&mrs->prob_avg, - &mrs->prob_avg_1, cur_prob); - mrs->att_hist += mrs->attempts; diff --git a/package/kernel/mac80211/patches/subsys/310-v6.2-mac80211-add-support-for-restricting-netdev-features.patch b/package/kernel/mac80211/patches/subsys/310-v6.2-mac80211-add-support-for-restricting-netdev-features.patch new file mode 100644 index 0000000000..812b12189c --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/310-v6.2-mac80211-add-support-for-restricting-netdev-features.patch @@ -0,0 +1,506 @@ +From: Felix Fietkau +Date: Sun, 9 Oct 2022 20:15:46 +0200 +Subject: [PATCH] mac80211: add support for restricting netdev features per vif + +This can be used to selectively disable feature flags for checksum offload, +scatter/gather or GSO by changing vif->netdev_features. +Removing features from vif->netdev_features does not affect the netdev +features themselves, but instead fixes up skbs in the tx path so that the +offloads are not needed in the driver. + +Aside from making it easier to deal with vif type based hardware limitations, +this also makes it possible to optimize performance on hardware without native +GSO support by declaring GSO support in hw->netdev_features and removing it +from vif->netdev_features. This allows mac80211 to handle GSO segmentation +after the sta lookup, but before itxq enqueue, thus reducing the number of +unnecessary sta lookups, as well as some other per-packet processing. + +Signed-off-by: Felix Fietkau +--- + +--- a/include/net/fq_impl.h ++++ b/include/net/fq_impl.h +@@ -200,6 +200,7 @@ static void fq_tin_enqueue(struct fq *fq + fq_skb_free_t free_func) + { + struct fq_flow *flow; ++ struct sk_buff *next; + bool oom; + + lockdep_assert_held(&fq->lock); +@@ -214,11 +215,15 @@ static void fq_tin_enqueue(struct fq *fq + } + + flow->tin = tin; +- flow->backlog += skb->len; +- tin->backlog_bytes += skb->len; +- tin->backlog_packets++; +- fq->memory_usage += skb->truesize; +- fq->backlog++; ++ skb_list_walk_safe(skb, skb, next) { ++ skb_mark_not_on_list(skb); ++ flow->backlog += skb->len; ++ tin->backlog_bytes += skb->len; ++ tin->backlog_packets++; ++ fq->memory_usage += skb->truesize; ++ fq->backlog++; ++ __skb_queue_tail(&flow->queue, skb); ++ } + + if (list_empty(&flow->flowchain)) { + flow->deficit = fq->quantum; +@@ -226,7 +231,6 @@ static void fq_tin_enqueue(struct fq *fq + &tin->new_flows); + } + +- __skb_queue_tail(&flow->queue, skb); + oom = (fq->memory_usage > fq->memory_limit); + while (fq->backlog > fq->limit || oom) { + flow = fq_find_fattest_flow(fq); +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -1807,6 +1807,10 @@ struct ieee80211_vif_cfg { + * @addr: address of this interface + * @p2p: indicates whether this AP or STA interface is a p2p + * interface, i.e. a GO or p2p-sta respectively ++ * @netdev_features: tx netdev features supported by the hardware for this ++ * vif. mac80211 initializes this to hw->netdev_features, and the driver ++ * can mask out specific tx features. mac80211 will handle software fixup ++ * for masked offloads (GSO, CSUM) + * @driver_flags: flags/capabilities the driver has for this interface, + * these need to be set (or cleared) when the interface is added + * or, if supported by the driver, the interface type is changed +@@ -1846,6 +1850,7 @@ struct ieee80211_vif { + + struct ieee80211_txq *txq; + ++ netdev_features_t netdev_features; + u32 driver_flags; + u32 offload_flags; + +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -2181,6 +2181,7 @@ int ieee80211_if_add(struct ieee80211_lo + ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE; + ndev->hw_features |= ndev->features & + MAC80211_SUPPORTED_FEATURES_TX; ++ sdata->vif.netdev_features = local->hw.netdev_features; + + netdev_set_default_ethtool_ops(ndev, &ieee80211_ethtool_ops); + +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -1356,7 +1356,11 @@ static struct txq_info *ieee80211_get_tx + + static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb) + { +- IEEE80211_SKB_CB(skb)->control.enqueue_time = codel_get_time(); ++ struct sk_buff *next; ++ codel_time_t now = codel_get_time(); ++ ++ skb_list_walk_safe(skb, skb, next) ++ IEEE80211_SKB_CB(skb)->control.enqueue_time = now; + } + + static u32 codel_skb_len_func(const struct sk_buff *skb) +@@ -3579,55 +3583,79 @@ ieee80211_xmit_fast_finish(struct ieee80 + return TX_CONTINUE; + } + +-static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, +- struct sta_info *sta, +- struct ieee80211_fast_tx *fast_tx, +- struct sk_buff *skb) ++static netdev_features_t ++ieee80211_sdata_netdev_features(struct ieee80211_sub_if_data *sdata) + { +- struct ieee80211_local *local = sdata->local; +- u16 ethertype = (skb->data[12] << 8) | skb->data[13]; +- int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2); +- int hw_headroom = sdata->local->hw.extra_tx_headroom; +- struct ethhdr eth; +- struct ieee80211_tx_info *info; +- struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; +- struct ieee80211_tx_data tx; +- ieee80211_tx_result r; +- struct tid_ampdu_tx *tid_tx = NULL; +- u8 tid = IEEE80211_NUM_TIDS; ++ if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN) ++ return sdata->vif.netdev_features; + +- /* control port protocol needs a lot of special handling */ +- if (cpu_to_be16(ethertype) == sdata->control_port_protocol) +- return false; ++ if (!sdata->bss) ++ return 0; + +- /* only RFC 1042 SNAP */ +- if (ethertype < ETH_P_802_3_MIN) +- return false; ++ sdata = container_of(sdata->bss, struct ieee80211_sub_if_data, u.ap); ++ return sdata->vif.netdev_features; ++} + +- /* don't handle TX status request here either */ +- if (skb->sk && skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS) +- return false; ++static struct sk_buff * ++ieee80211_tx_skb_fixup(struct sk_buff *skb, netdev_features_t features) ++{ ++ if (skb_is_gso(skb)) { ++ struct sk_buff *segs; + +- if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { +- tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; +- tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]); +- if (tid_tx) { +- if (!test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) +- return false; +- if (tid_tx->timeout) +- tid_tx->last_tx = jiffies; +- } ++ segs = skb_gso_segment(skb, features); ++ if (!segs) ++ return skb; ++ if (IS_ERR(segs)) ++ goto free; ++ ++ consume_skb(skb); ++ return segs; + } + +- /* after this point (skb is modified) we cannot return false */ ++ if (skb_needs_linearize(skb, features) && __skb_linearize(skb)) ++ goto free; ++ ++ if (skb->ip_summed == CHECKSUM_PARTIAL) { ++ int ofs = skb_checksum_start_offset(skb); ++ ++ if (skb->encapsulation) ++ skb_set_inner_transport_header(skb, ofs); ++ else ++ skb_set_transport_header(skb, ofs); ++ ++ if (skb_csum_hwoffload_help(skb, features)) ++ goto free; ++ } ++ ++ skb_mark_not_on_list(skb); ++ return skb; ++ ++free: ++ kfree_skb(skb); ++ return NULL; ++} ++ ++static void __ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, ++ struct sta_info *sta, ++ struct ieee80211_fast_tx *fast_tx, ++ struct sk_buff *skb, u8 tid, bool ampdu) ++{ ++ struct ieee80211_local *local = sdata->local; ++ struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; ++ struct ieee80211_tx_info *info; ++ struct ieee80211_tx_data tx; ++ ieee80211_tx_result r; ++ int hw_headroom = sdata->local->hw.extra_tx_headroom; ++ int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2); ++ struct ethhdr eth; + + skb = skb_share_check(skb, GFP_ATOMIC); + if (unlikely(!skb)) +- return true; ++ return; + + if ((hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) && + ieee80211_amsdu_aggregate(sdata, sta, fast_tx, skb)) +- return true; ++ return; + + /* will not be crypto-handled beyond what we do here, so use false + * as the may-encrypt argument for the resize to not account for +@@ -3636,10 +3664,8 @@ static bool ieee80211_xmit_fast(struct i + if (unlikely(ieee80211_skb_resize(sdata, skb, + max_t(int, extra_head + hw_headroom - + skb_headroom(skb), 0), +- ENCRYPT_NO))) { +- kfree_skb(skb); +- return true; +- } ++ ENCRYPT_NO))) ++ goto free; + + memcpy(ð, skb->data, ETH_HLEN - 2); + hdr = skb_push(skb, extra_head); +@@ -3653,7 +3679,7 @@ static bool ieee80211_xmit_fast(struct i + info->control.vif = &sdata->vif; + info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT | + IEEE80211_TX_CTL_DONTFRAG | +- (tid_tx ? IEEE80211_TX_CTL_AMPDU : 0); ++ (ampdu ? IEEE80211_TX_CTL_AMPDU : 0); + info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT | + u32_encode_bits(IEEE80211_LINK_UNSPECIFIED, + IEEE80211_TX_CTRL_MLO_LINK); +@@ -3677,16 +3703,14 @@ static bool ieee80211_xmit_fast(struct i + tx.key = fast_tx->key; + + if (ieee80211_queue_skb(local, sdata, sta, skb)) +- return true; ++ return; + + tx.skb = skb; + r = ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs, + fast_tx->key, &tx); + tx.skb = NULL; +- if (r == TX_DROP) { +- kfree_skb(skb); +- return true; +- } ++ if (r == TX_DROP) ++ goto free; + + if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) + sdata = container_of(sdata->bss, +@@ -3694,6 +3718,56 @@ static bool ieee80211_xmit_fast(struct i + + __skb_queue_tail(&tx.skbs, skb); + ieee80211_tx_frags(local, &sdata->vif, sta, &tx.skbs, false); ++ return; ++ ++free: ++ kfree_skb(skb); ++} ++ ++static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, ++ struct sta_info *sta, ++ struct ieee80211_fast_tx *fast_tx, ++ struct sk_buff *skb) ++{ ++ u16 ethertype = (skb->data[12] << 8) | skb->data[13]; ++ struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; ++ struct tid_ampdu_tx *tid_tx = NULL; ++ struct sk_buff *next; ++ u8 tid = IEEE80211_NUM_TIDS; ++ ++ /* control port protocol needs a lot of special handling */ ++ if (cpu_to_be16(ethertype) == sdata->control_port_protocol) ++ return false; ++ ++ /* only RFC 1042 SNAP */ ++ if (ethertype < ETH_P_802_3_MIN) ++ return false; ++ ++ /* don't handle TX status request here either */ ++ if (skb->sk && skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS) ++ return false; ++ ++ if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { ++ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; ++ tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]); ++ if (tid_tx) { ++ if (!test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) ++ return false; ++ if (tid_tx->timeout) ++ tid_tx->last_tx = jiffies; ++ } ++ } ++ ++ /* after this point (skb is modified) we cannot return false */ ++ skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata)); ++ if (!skb) ++ return true; ++ ++ skb_list_walk_safe(skb, skb, next) { ++ skb_mark_not_on_list(skb); ++ __ieee80211_xmit_fast(sdata, sta, fast_tx, skb, tid, tid_tx); ++ } ++ + return true; + } + +@@ -4201,31 +4275,14 @@ void __ieee80211_subif_start_xmit(struct + goto out; + } + +- if (skb_is_gso(skb)) { +- struct sk_buff *segs; +- +- segs = skb_gso_segment(skb, 0); +- if (IS_ERR(segs)) { +- goto out_free; +- } else if (segs) { +- consume_skb(skb); +- skb = segs; +- } +- } else { +- /* we cannot process non-linear frames on this path */ +- if (skb_linearize(skb)) +- goto out_free; +- +- /* the frame could be fragmented, software-encrypted, and other +- * things so we cannot really handle checksum offload with it - +- * fix it up in software before we handle anything else. +- */ +- if (skb->ip_summed == CHECKSUM_PARTIAL) { +- skb_set_transport_header(skb, +- skb_checksum_start_offset(skb)); +- if (skb_checksum_help(skb)) +- goto out_free; +- } ++ /* the frame could be fragmented, software-encrypted, and other ++ * things so we cannot really handle checksum or GSO offload. ++ * fix it up in software before we handle anything else. ++ */ ++ skb = ieee80211_tx_skb_fixup(skb, 0); ++ if (!skb) { ++ len = 0; ++ goto out; + } + + skb_list_walk_safe(skb, skb, next) { +@@ -4443,9 +4500,11 @@ normal: + return NETDEV_TX_OK; + } + +-static bool ieee80211_tx_8023(struct ieee80211_sub_if_data *sdata, +- struct sk_buff *skb, struct sta_info *sta, +- bool txpending) ++ ++ ++static bool __ieee80211_tx_8023(struct ieee80211_sub_if_data *sdata, ++ struct sk_buff *skb, struct sta_info *sta, ++ bool txpending) + { + struct ieee80211_local *local = sdata->local; + struct ieee80211_tx_control control = {}; +@@ -4454,14 +4513,6 @@ static bool ieee80211_tx_8023(struct iee + unsigned long flags; + int q = info->hw_queue; + +- if (sta) +- sk_pacing_shift_update(skb->sk, local->hw.tx_sk_pacing_shift); +- +- ieee80211_tpt_led_trig_tx(local, skb->len); +- +- if (ieee80211_queue_skb(local, sdata, sta, skb)) +- return true; +- + spin_lock_irqsave(&local->queue_stop_reason_lock, flags); + + if (local->queue_stop_reasons[q] || +@@ -4488,6 +4539,26 @@ static bool ieee80211_tx_8023(struct iee + return true; + } + ++static bool ieee80211_tx_8023(struct ieee80211_sub_if_data *sdata, ++ struct sk_buff *skb, struct sta_info *sta, ++ bool txpending) ++{ ++ struct ieee80211_local *local = sdata->local; ++ struct sk_buff *next; ++ bool ret = true; ++ ++ if (ieee80211_queue_skb(local, sdata, sta, skb)) ++ return true; ++ ++ skb_list_walk_safe(skb, skb, next) { ++ skb_mark_not_on_list(skb); ++ if (!__ieee80211_tx_8023(sdata, skb, sta, txpending)) ++ ret = false; ++ } ++ ++ return ret; ++} ++ + static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata, + struct net_device *dev, struct sta_info *sta, + struct ieee80211_key *key, struct sk_buff *skb) +@@ -4495,9 +4566,13 @@ static void ieee80211_8023_xmit(struct i + struct ieee80211_tx_info *info; + struct ieee80211_local *local = sdata->local; + struct tid_ampdu_tx *tid_tx; ++ struct sk_buff *seg, *next; ++ unsigned int skbs = 0, len = 0; ++ u16 queue; + u8 tid; + +- skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb)); ++ queue = ieee80211_select_queue(sdata, sta, skb); ++ skb_set_queue_mapping(skb, queue); + + if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) && + test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state)) +@@ -4507,9 +4582,6 @@ static void ieee80211_8023_xmit(struct i + if (unlikely(!skb)) + return; + +- info = IEEE80211_SKB_CB(skb); +- memset(info, 0, sizeof(*info)); +- + ieee80211_aggr_check(sdata, sta, skb); + + tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; +@@ -4523,22 +4595,20 @@ static void ieee80211_8023_xmit(struct i + return; + } + +- info->flags |= IEEE80211_TX_CTL_AMPDU; + if (tid_tx->timeout) + tid_tx->last_tx = jiffies; + } + +- if (unlikely(skb->sk && +- skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)) +- info->ack_frame_id = ieee80211_store_ack_skb(local, skb, +- &info->flags, NULL); ++ skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata)); ++ if (!skb) ++ return; + +- info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; ++ info = IEEE80211_SKB_CB(skb); ++ memset(info, 0, sizeof(*info)); ++ if (tid_tx) ++ info->flags |= IEEE80211_TX_CTL_AMPDU; + +- dev_sw_netstats_tx_add(dev, 1, skb->len); +- +- sta->deflink.tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len; +- sta->deflink.tx_stats.packets[skb_get_queue_mapping(skb)]++; ++ info->hw_queue = sdata->vif.hw_queue[queue]; + + if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) + sdata = container_of(sdata->bss, +@@ -4550,6 +4620,24 @@ static void ieee80211_8023_xmit(struct i + if (key) + info->control.hw_key = &key->conf; + ++ skb_list_walk_safe(skb, seg, next) { ++ skbs++; ++ len += seg->len; ++ if (seg != skb) ++ memcpy(IEEE80211_SKB_CB(seg), info, sizeof(*info)); ++ } ++ ++ if (unlikely(skb->sk && ++ skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)) ++ info->ack_frame_id = ieee80211_store_ack_skb(local, skb, ++ &info->flags, NULL); ++ ++ dev_sw_netstats_tx_add(dev, skbs, len); ++ sta->deflink.tx_stats.packets[queue] += skbs; ++ sta->deflink.tx_stats.bytes[queue] += len; ++ ++ ieee80211_tpt_led_trig_tx(local, len); ++ + ieee80211_tx_8023(sdata, skb, sta, false); + + return; +@@ -4591,6 +4679,7 @@ netdev_tx_t ieee80211_subif_start_xmit_8 + key->conf.cipher == WLAN_CIPHER_SUITE_TKIP)) + goto skip_offload; + ++ sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift); + ieee80211_8023_xmit(sdata, dev, sta, key, skb); + goto out; + diff --git a/package/kernel/mac80211/patches/subsys/311-mac80211-minstrel_ht-rework-rate-downgrade-code-and-.patch b/package/kernel/mac80211/patches/subsys/311-mac80211-minstrel_ht-rework-rate-downgrade-code-and-.patch deleted file mode 100644 index 13bed48ec6..0000000000 --- a/package/kernel/mac80211/patches/subsys/311-mac80211-minstrel_ht-rework-rate-downgrade-code-and-.patch +++ /dev/null @@ -1,151 +0,0 @@ -From: Felix Fietkau -Date: Sat, 6 Feb 2021 16:33:14 +0100 -Subject: [PATCH] mac80211: minstrel_ht: rework rate downgrade code and - max_prob rate selection - -The current fallback code for fast rate switching on potentially failing rates -is triggering too often if there is some strong noise on the channel. This can -lead to wild fluctuations in the rate selection. -Additionally, switching down to max_prob_rate can create a significant gap down -in throughput, especially when using only 2 spatial streams, because max_prob_rate -is limited to using fewer streams than the max_tp rates. -In order to improve throughput without reducing reliability too much, use the -rate downgrade code for the max_prob_rate only, and allow the non-downgraded -max_prob_rate to use as many spatial streams as the max_tp rates - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/rc80211_minstrel_ht.c -+++ b/net/mac80211/rc80211_minstrel_ht.c -@@ -514,6 +514,14 @@ minstrel_ht_set_best_prob_rate(struct mi - int cur_tp_avg, cur_group, cur_idx; - int max_gpr_group, max_gpr_idx; - int max_gpr_tp_avg, max_gpr_prob; -+ int min_dur; -+ -+ min_dur = max(minstrel_get_duration(mi->max_tp_rate[0]), -+ minstrel_get_duration(mi->max_tp_rate[1])); -+ -+ /* make the rate at least 18% slower than max tp rates */ -+ if (minstrel_get_duration(index) <= min_dur * 19 / 16) -+ return; - - cur_group = MI_RATE_GROUP(index); - cur_idx = MI_RATE_IDX(index); -@@ -535,11 +543,6 @@ minstrel_ht_set_best_prob_rate(struct mi - !minstrel_ht_is_legacy_group(max_tp_group)) - return; - -- /* skip rates faster than max tp rate with lower prob */ -- if (minstrel_get_duration(mi->max_tp_rate[0]) > minstrel_get_duration(index) && -- mrs->prob_avg < max_tp_prob) -- return; -- - max_gpr_group = MI_RATE_GROUP(mg->max_group_prob_rate); - max_gpr_idx = MI_RATE_IDX(mg->max_group_prob_rate); - max_gpr_prob = mi->groups[max_gpr_group].rates[max_gpr_idx].prob_avg; -@@ -597,40 +600,6 @@ minstrel_ht_assign_best_tp_rates(struct - - } - --/* -- * Try to increase robustness of max_prob rate by decrease number of -- * streams if possible. -- */ --static inline void --minstrel_ht_prob_rate_reduce_streams(struct minstrel_ht_sta *mi) --{ -- struct minstrel_mcs_group_data *mg; -- int tmp_max_streams, group, tmp_idx, tmp_prob; -- int tmp_tp = 0; -- -- if (!mi->sta->ht_cap.ht_supported) -- return; -- -- group = MI_RATE_GROUP(mi->max_tp_rate[0]); -- tmp_max_streams = minstrel_mcs_groups[group].streams; -- for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) { -- mg = &mi->groups[group]; -- if (!mi->supported[group] || group == MINSTREL_CCK_GROUP) -- continue; -- -- tmp_idx = MI_RATE_IDX(mg->max_group_prob_rate); -- tmp_prob = mi->groups[group].rates[tmp_idx].prob_avg; -- -- if (tmp_tp < minstrel_ht_get_tp_avg(mi, group, tmp_idx, tmp_prob) && -- (minstrel_mcs_groups[group].streams < tmp_max_streams)) { -- mi->max_prob_rate = mg->max_group_prob_rate; -- tmp_tp = minstrel_ht_get_tp_avg(mi, group, -- tmp_idx, -- tmp_prob); -- } -- } --} -- - static u16 - __minstrel_ht_get_sample_rate(struct minstrel_ht_sta *mi, - enum minstrel_sample_type type) -@@ -1110,8 +1079,6 @@ minstrel_ht_update_stats(struct minstrel - - mi->max_prob_rate = tmp_max_prob_rate; - -- /* Try to increase robustness of max_prob_rate*/ -- minstrel_ht_prob_rate_reduce_streams(mi); - minstrel_ht_refill_sample_rates(mi); - - #ifdef CPTCFG_MAC80211_DEBUGFS -@@ -1156,7 +1123,7 @@ minstrel_ht_txstat_valid(struct minstrel - } - - static void --minstrel_downgrade_rate(struct minstrel_ht_sta *mi, u16 *idx, bool primary) -+minstrel_downgrade_prob_rate(struct minstrel_ht_sta *mi, u16 *idx) - { - int group, orig_group; - -@@ -1171,11 +1138,7 @@ minstrel_downgrade_rate(struct minstrel_ - minstrel_mcs_groups[orig_group].streams) - continue; - -- if (primary) -- *idx = mi->groups[group].max_group_tp_rate[0]; -- else -- *idx = mi->groups[group].max_group_tp_rate[1]; -- break; -+ *idx = mi->groups[group].max_group_prob_rate; - } - } - -@@ -1186,7 +1149,7 @@ minstrel_ht_tx_status(void *priv, struct - struct ieee80211_tx_info *info = st->info; - struct minstrel_ht_sta *mi = priv_sta; - struct ieee80211_tx_rate *ar = info->status.rates; -- struct minstrel_rate_stats *rate, *rate2; -+ struct minstrel_rate_stats *rate; - struct minstrel_priv *mp = priv; - u32 update_interval = mp->update_interval; - bool last, update = false; -@@ -1236,18 +1199,13 @@ minstrel_ht_tx_status(void *priv, struct - /* - * check for sudden death of spatial multiplexing, - * downgrade to a lower number of streams if necessary. -+ * only do this for the max_prob_rate to prevent spurious -+ * rate fluctuations when the link changes suddenly - */ -- rate = minstrel_get_ratestats(mi, mi->max_tp_rate[0]); -+ rate = minstrel_get_ratestats(mi, mi->max_prob_rate); - if (rate->attempts > 30 && - rate->success < rate->attempts / 4) { -- minstrel_downgrade_rate(mi, &mi->max_tp_rate[0], true); -- update = true; -- } -- -- rate2 = minstrel_get_ratestats(mi, mi->max_tp_rate[1]); -- if (rate2->attempts > 30 && -- rate2->success < rate2->attempts / 4) { -- minstrel_downgrade_rate(mi, &mi->max_tp_rate[1], false); -+ minstrel_downgrade_prob_rate(mi, &mi->max_prob_rate); - update = true; - } - } diff --git a/package/kernel/mac80211/patches/subsys/311-v6.2-wifi-mac80211-fix-and-simplify-unencrypted-drop-chec.patch b/package/kernel/mac80211/patches/subsys/311-v6.2-wifi-mac80211-fix-and-simplify-unencrypted-drop-chec.patch new file mode 100644 index 0000000000..804b02eb30 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/311-v6.2-wifi-mac80211-fix-and-simplify-unencrypted-drop-chec.patch @@ -0,0 +1,87 @@ +From: Felix Fietkau +Date: Thu, 1 Dec 2022 14:57:30 +0100 +Subject: [PATCH] wifi: mac80211: fix and simplify unencrypted drop check for + mesh + +ieee80211_drop_unencrypted is called from ieee80211_rx_h_mesh_fwding and +ieee80211_frame_allowed. + +Since ieee80211_rx_h_mesh_fwding can forward packets for other mesh nodes +and is called earlier, it needs to check the decryptions status and if the +packet is using the control protocol on its own, instead of deferring to +the later call from ieee80211_frame_allowed. + +Because of that, ieee80211_drop_unencrypted has a mesh specific check +that skips over the mesh header in order to check the payload protocol. +This code is invalid when called from ieee80211_frame_allowed, since that +happens after the 802.11->802.3 conversion. + +Fix this by moving the mesh specific check directly into +ieee80211_rx_h_mesh_fwding. + +Signed-off-by: Felix Fietkau +Link: https://lore.kernel.org/r/20221201135730.19723-1-nbd@nbd.name +Signed-off-by: Johannes Berg +--- + +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2403,7 +2403,6 @@ static int ieee80211_802_1x_port_control + + static int ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc) + { +- struct ieee80211_hdr *hdr = (void *)rx->skb->data; + struct sk_buff *skb = rx->skb; + struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); + +@@ -2414,31 +2413,6 @@ static int ieee80211_drop_unencrypted(st + if (status->flag & RX_FLAG_DECRYPTED) + return 0; + +- /* check mesh EAPOL frames first */ +- if (unlikely(rx->sta && ieee80211_vif_is_mesh(&rx->sdata->vif) && +- ieee80211_is_data(fc))) { +- struct ieee80211s_hdr *mesh_hdr; +- u16 hdr_len = ieee80211_hdrlen(fc); +- u16 ethertype_offset; +- __be16 ethertype; +- +- if (!ether_addr_equal(hdr->addr1, rx->sdata->vif.addr)) +- goto drop_check; +- +- /* make sure fixed part of mesh header is there, also checks skb len */ +- if (!pskb_may_pull(rx->skb, hdr_len + 6)) +- goto drop_check; +- +- mesh_hdr = (struct ieee80211s_hdr *)(skb->data + hdr_len); +- ethertype_offset = hdr_len + ieee80211_get_mesh_hdrlen(mesh_hdr) + +- sizeof(rfc1042_header); +- +- if (skb_copy_bits(rx->skb, ethertype_offset, ðertype, 2) == 0 && +- ethertype == rx->sdata->control_port_protocol) +- return 0; +- } +- +-drop_check: + /* Drop unencrypted frames if key is set. */ + if (unlikely(!ieee80211_has_protected(fc) && + !ieee80211_is_any_nullfunc(fc) && +@@ -2892,8 +2866,16 @@ ieee80211_rx_h_mesh_fwding(struct ieee80 + hdr = (struct ieee80211_hdr *) skb->data; + mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen); + +- if (ieee80211_drop_unencrypted(rx, hdr->frame_control)) +- return RX_DROP_MONITOR; ++ if (ieee80211_drop_unencrypted(rx, hdr->frame_control)) { ++ int offset = hdrlen + ieee80211_get_mesh_hdrlen(mesh_hdr) + ++ sizeof(rfc1042_header); ++ __be16 ethertype; ++ ++ if (!ether_addr_equal(hdr->addr1, rx->sdata->vif.addr) || ++ skb_copy_bits(rx->skb, offset, ðertype, 2) != 0 || ++ ethertype != rx->sdata->control_port_protocol) ++ return RX_DROP_MONITOR; ++ } + + /* frame is in RMC, don't forward */ + if (ieee80211_is_data(hdr->frame_control) && diff --git a/package/kernel/mac80211/patches/subsys/312-mac80211-split-beacon-retrieval-functions.patch b/package/kernel/mac80211/patches/subsys/312-mac80211-split-beacon-retrieval-functions.patch deleted file mode 100644 index 18b1951f6e..0000000000 --- a/package/kernel/mac80211/patches/subsys/312-mac80211-split-beacon-retrieval-functions.patch +++ /dev/null @@ -1,262 +0,0 @@ -From: Aloka Dixit -Date: Tue, 5 Oct 2021 21:09:36 -0700 -Subject: [PATCH] mac80211: split beacon retrieval functions - -Split __ieee80211_beacon_get() into a separate function for AP mode -ieee80211_beacon_get_ap(). -Also, move the code common to all modes (AP, adhoc and mesh) to -a separate function ieee80211_beacon_get_finish(). - -Signed-off-by: Aloka Dixit -Link: https://lore.kernel.org/r/20211006040938.9531-2-alokad@codeaurora.org -Signed-off-by: Johannes Berg ---- - ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -4987,6 +4987,115 @@ static int ieee80211_beacon_protect(stru - return 0; - } - -+static void -+ieee80211_beacon_get_finish(struct ieee80211_hw *hw, -+ struct ieee80211_vif *vif, -+ struct ieee80211_mutable_offsets *offs, -+ struct beacon_data *beacon, -+ struct sk_buff *skb, -+ struct ieee80211_chanctx_conf *chanctx_conf, -+ u16 csa_off_base) -+{ -+ struct ieee80211_local *local = hw_to_local(hw); -+ struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); -+ struct ieee80211_tx_info *info; -+ enum nl80211_band band; -+ struct ieee80211_tx_rate_control txrc; -+ -+ /* CSA offsets */ -+ if (offs && beacon) { -+ u16 i; -+ -+ for (i = 0; i < IEEE80211_MAX_CNTDWN_COUNTERS_NUM; i++) { -+ u16 csa_off = beacon->cntdwn_counter_offsets[i]; -+ -+ if (!csa_off) -+ continue; -+ -+ offs->cntdwn_counter_offs[i] = csa_off_base + csa_off; -+ } -+ } -+ -+ band = chanctx_conf->def.chan->band; -+ info = IEEE80211_SKB_CB(skb); -+ info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; -+ info->flags |= IEEE80211_TX_CTL_NO_ACK; -+ info->band = band; -+ -+ memset(&txrc, 0, sizeof(txrc)); -+ txrc.hw = hw; -+ txrc.sband = local->hw.wiphy->bands[band]; -+ txrc.bss_conf = &sdata->vif.bss_conf; -+ txrc.skb = skb; -+ txrc.reported_rate.idx = -1; -+ if (sdata->beacon_rate_set && sdata->beacon_rateidx_mask[band]) -+ txrc.rate_idx_mask = sdata->beacon_rateidx_mask[band]; -+ else -+ txrc.rate_idx_mask = sdata->rc_rateidx_mask[band]; -+ txrc.bss = true; -+ rate_control_get_rate(sdata, NULL, &txrc); -+ -+ info->control.vif = vif; -+ info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT | -+ IEEE80211_TX_CTL_ASSIGN_SEQ | -+ IEEE80211_TX_CTL_FIRST_FRAGMENT; -+} -+ -+static struct sk_buff * -+ieee80211_beacon_get_ap(struct ieee80211_hw *hw, -+ struct ieee80211_vif *vif, -+ struct ieee80211_mutable_offsets *offs, -+ bool is_template, -+ struct beacon_data *beacon, -+ struct ieee80211_chanctx_conf *chanctx_conf) -+{ -+ struct ieee80211_local *local = hw_to_local(hw); -+ struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); -+ struct ieee80211_if_ap *ap = &sdata->u.ap; -+ struct sk_buff *skb = NULL; -+ u16 csa_off_base = 0; -+ -+ if (beacon->cntdwn_counter_offsets[0]) { -+ if (!is_template) -+ ieee80211_beacon_update_cntdwn(vif); -+ -+ ieee80211_set_beacon_cntdwn(sdata, beacon); -+ } -+ -+ /* headroom, head length, -+ * tail length and maximum TIM length -+ */ -+ skb = dev_alloc_skb(local->tx_headroom + beacon->head_len + -+ beacon->tail_len + 256 + -+ local->hw.extra_beacon_tailroom); -+ if (!skb) -+ return NULL; -+ -+ skb_reserve(skb, local->tx_headroom); -+ skb_put_data(skb, beacon->head, beacon->head_len); -+ -+ ieee80211_beacon_add_tim(sdata, &ap->ps, skb, is_template); -+ -+ if (offs) { -+ offs->tim_offset = beacon->head_len; -+ offs->tim_length = skb->len - beacon->head_len; -+ offs->cntdwn_counter_offs[0] = beacon->cntdwn_counter_offsets[0]; -+ -+ /* for AP the csa offsets are from tail */ -+ csa_off_base = skb->len; -+ } -+ -+ if (beacon->tail) -+ skb_put_data(skb, beacon->tail, beacon->tail_len); -+ -+ if (ieee80211_beacon_protect(skb, local, sdata) < 0) -+ return NULL; -+ -+ ieee80211_beacon_get_finish(hw, vif, offs, beacon, skb, chanctx_conf, -+ csa_off_base); -+ return skb; -+} -+ - static struct sk_buff * - __ieee80211_beacon_get(struct ieee80211_hw *hw, - struct ieee80211_vif *vif, -@@ -4996,12 +5105,8 @@ __ieee80211_beacon_get(struct ieee80211_ - struct ieee80211_local *local = hw_to_local(hw); - struct beacon_data *beacon = NULL; - struct sk_buff *skb = NULL; -- struct ieee80211_tx_info *info; - struct ieee80211_sub_if_data *sdata = NULL; -- enum nl80211_band band; -- struct ieee80211_tx_rate_control txrc; - struct ieee80211_chanctx_conf *chanctx_conf; -- int csa_off_base = 0; - - rcu_read_lock(); - -@@ -5018,48 +5123,11 @@ __ieee80211_beacon_get(struct ieee80211_ - struct ieee80211_if_ap *ap = &sdata->u.ap; - - beacon = rcu_dereference(ap->beacon); -- if (beacon) { -- if (beacon->cntdwn_counter_offsets[0]) { -- if (!is_template) -- ieee80211_beacon_update_cntdwn(vif); -- -- ieee80211_set_beacon_cntdwn(sdata, beacon); -- } -- -- /* -- * headroom, head length, -- * tail length and maximum TIM length -- */ -- skb = dev_alloc_skb(local->tx_headroom + -- beacon->head_len + -- beacon->tail_len + 256 + -- local->hw.extra_beacon_tailroom); -- if (!skb) -- goto out; -- -- skb_reserve(skb, local->tx_headroom); -- skb_put_data(skb, beacon->head, beacon->head_len); -- -- ieee80211_beacon_add_tim(sdata, &ap->ps, skb, -- is_template); -- -- if (offs) { -- offs->tim_offset = beacon->head_len; -- offs->tim_length = skb->len - beacon->head_len; -- offs->cntdwn_counter_offs[0] = beacon->cntdwn_counter_offsets[0]; -- -- /* for AP the csa offsets are from tail */ -- csa_off_base = skb->len; -- } -- -- if (beacon->tail) -- skb_put_data(skb, beacon->tail, -- beacon->tail_len); -- -- if (ieee80211_beacon_protect(skb, local, sdata) < 0) -- goto out; -- } else -+ if (!beacon) - goto out; -+ -+ skb = ieee80211_beacon_get_ap(hw, vif, offs, is_template, -+ beacon, chanctx_conf); - } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { - struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; - struct ieee80211_hdr *hdr; -@@ -5085,6 +5153,9 @@ __ieee80211_beacon_get(struct ieee80211_ - hdr = (struct ieee80211_hdr *) skb->data; - hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | - IEEE80211_STYPE_BEACON); -+ -+ ieee80211_beacon_get_finish(hw, vif, offs, beacon, skb, -+ chanctx_conf, 0); - } else if (ieee80211_vif_is_mesh(&sdata->vif)) { - struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; - -@@ -5124,51 +5195,13 @@ __ieee80211_beacon_get(struct ieee80211_ - } - - skb_put_data(skb, beacon->tail, beacon->tail_len); -+ ieee80211_beacon_get_finish(hw, vif, offs, beacon, skb, -+ chanctx_conf, 0); - } else { - WARN_ON(1); - goto out; - } - -- /* CSA offsets */ -- if (offs && beacon) { -- int i; -- -- for (i = 0; i < IEEE80211_MAX_CNTDWN_COUNTERS_NUM; i++) { -- u16 csa_off = beacon->cntdwn_counter_offsets[i]; -- -- if (!csa_off) -- continue; -- -- offs->cntdwn_counter_offs[i] = csa_off_base + csa_off; -- } -- } -- -- band = chanctx_conf->def.chan->band; -- -- info = IEEE80211_SKB_CB(skb); -- -- info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; -- info->flags |= IEEE80211_TX_CTL_NO_ACK; -- info->band = band; -- -- memset(&txrc, 0, sizeof(txrc)); -- txrc.hw = hw; -- txrc.sband = local->hw.wiphy->bands[band]; -- txrc.bss_conf = &sdata->vif.bss_conf; -- txrc.skb = skb; -- txrc.reported_rate.idx = -1; -- if (sdata->beacon_rate_set && sdata->beacon_rateidx_mask[band]) -- txrc.rate_idx_mask = sdata->beacon_rateidx_mask[band]; -- else -- txrc.rate_idx_mask = sdata->rc_rateidx_mask[band]; -- txrc.bss = true; -- rate_control_get_rate(sdata, NULL, &txrc); -- -- info->control.vif = vif; -- -- info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT | -- IEEE80211_TX_CTL_ASSIGN_SEQ | -- IEEE80211_TX_CTL_FIRST_FRAGMENT; - out: - rcu_read_unlock(); - return skb; diff --git a/package/kernel/mac80211/patches/subsys/312-v6.3-wifi-cfg80211-move-A-MSDU-check-in-ieee80211_data_to.patch b/package/kernel/mac80211/patches/subsys/312-v6.3-wifi-cfg80211-move-A-MSDU-check-in-ieee80211_data_to.patch new file mode 100644 index 0000000000..f668905cca --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/312-v6.3-wifi-cfg80211-move-A-MSDU-check-in-ieee80211_data_to.patch @@ -0,0 +1,25 @@ +From: Felix Fietkau +Date: Fri, 2 Dec 2022 13:53:11 +0100 +Subject: [PATCH] wifi: cfg80211: move A-MSDU check in + ieee80211_data_to_8023_exthdr + +When parsing the outer A-MSDU header, don't check for inner bridge tunnel +or RFC1042 headers. This is handled by ieee80211_amsdu_to_8023s already. + +Signed-off-by: Felix Fietkau +--- + +--- a/net/wireless/util.c ++++ b/net/wireless/util.c +@@ -631,8 +631,9 @@ int ieee80211_data_to_8023_exthdr(struct + break; + } + +- if (likely(skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)) == 0 && +- ((!is_amsdu && ether_addr_equal(payload.hdr, rfc1042_header) && ++ if (likely(!is_amsdu && ++ skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)) == 0 && ++ ((ether_addr_equal(payload.hdr, rfc1042_header) && + payload.proto != htons(ETH_P_AARP) && + payload.proto != htons(ETH_P_IPX)) || + ether_addr_equal(payload.hdr, bridge_tunnel_header)))) { diff --git a/package/kernel/mac80211/patches/subsys/313-nl80211-MBSSID-and-EMA-support-in-AP-mode.patch b/package/kernel/mac80211/patches/subsys/313-nl80211-MBSSID-and-EMA-support-in-AP-mode.patch deleted file mode 100644 index 429886d701..0000000000 --- a/package/kernel/mac80211/patches/subsys/313-nl80211-MBSSID-and-EMA-support-in-AP-mode.patch +++ /dev/null @@ -1,493 +0,0 @@ -From: John Crispin -Date: Wed, 15 Sep 2021 19:54:34 -0700 -Subject: [PATCH] nl80211: MBSSID and EMA support in AP mode - -Add new attributes to configure support for multiple BSSID -and advanced multi-BSSID advertisements (EMA) in AP mode. - -- NL80211_ATTR_MBSSID_CONFIG used for per interface configuration. -- NL80211_ATTR_MBSSID_ELEMS used to MBSSID elements for beacons. - -Memory for the elements is allocated dynamically. This change frees -the memory in existing functions which call nl80211_parse_beacon(), -a comment is added to indicate the new references to do the same. - -Signed-off-by: John Crispin -Co-developed-by: Aloka Dixit -Signed-off-by: Aloka Dixit -Link: https://lore.kernel.org/r/20210916025437.29138-2-alokad@codeaurora.org -[don't leave ERR_PTR hanging around] -Signed-off-by: Johannes Berg ---- - ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -1046,6 +1046,36 @@ struct cfg80211_crypto_settings { - }; - - /** -+ * struct cfg80211_mbssid_config - AP settings for multi bssid -+ * -+ * @tx_wdev: pointer to the transmitted interface in the MBSSID set -+ * @index: index of this AP in the multi bssid group. -+ * @ema: set to true if the beacons should be sent out in EMA mode. -+ */ -+struct cfg80211_mbssid_config { -+ struct wireless_dev *tx_wdev; -+ u8 index; -+ bool ema; -+}; -+ -+/** -+ * struct cfg80211_mbssid_elems - Multiple BSSID elements -+ * -+ * @cnt: Number of elements in array %elems. -+ * -+ * @elem: Array of multiple BSSID element(s) to be added into Beacon frames. -+ * @elem.data: Data for multiple BSSID elements. -+ * @elem.len: Length of data. -+ */ -+struct cfg80211_mbssid_elems { -+ u8 cnt; -+ struct { -+ const u8 *data; -+ size_t len; -+ } elem[]; -+}; -+ -+/** - * struct cfg80211_beacon_data - beacon data - * @head: head portion of beacon (before TIM IE) - * or %NULL if not changed -@@ -1063,6 +1093,7 @@ struct cfg80211_crypto_settings { - * @assocresp_ies_len: length of assocresp_ies in octets - * @probe_resp_len: length of probe response template (@probe_resp) - * @probe_resp: probe response template (AP mode only) -+ * @mbssid_ies: multiple BSSID elements - * @ftm_responder: enable FTM responder functionality; -1 for no change - * (which also implies no change in LCI/civic location data) - * @lci: Measurement Report element content, starting with Measurement Token -@@ -1080,6 +1111,7 @@ struct cfg80211_beacon_data { - const u8 *probe_resp; - const u8 *lci; - const u8 *civicloc; -+ struct cfg80211_mbssid_elems *mbssid_ies; - s8 ftm_responder; - - size_t head_len, tail_len; -@@ -1194,6 +1226,7 @@ enum cfg80211_ap_settings_flags { - * @he_oper: HE operation IE (or %NULL if HE isn't enabled) - * @fils_discovery: FILS discovery transmission parameters - * @unsol_bcast_probe_resp: Unsolicited broadcast probe response parameters -+ * @mbssid_config: AP settings for multiple bssid - */ - struct cfg80211_ap_settings { - struct cfg80211_chan_def chandef; -@@ -1226,6 +1259,7 @@ struct cfg80211_ap_settings { - struct cfg80211_he_bss_color he_bss_color; - struct cfg80211_fils_discovery fils_discovery; - struct cfg80211_unsol_bcast_probe_resp unsol_bcast_probe_resp; -+ struct cfg80211_mbssid_config mbssid_config; - }; - - /** -@@ -4986,6 +5020,13 @@ struct wiphy_iftype_akm_suites { - * %NL80211_TID_CONFIG_ATTR_RETRY_LONG attributes - * @sar_capa: SAR control capabilities - * @rfkill: a pointer to the rfkill structure -+ * -+ * @mbssid_max_interfaces: maximum number of interfaces supported by the driver -+ * in a multiple BSSID set. This field must be set to a non-zero value -+ * by the driver to advertise MBSSID support. -+ * @mbssid_max_ema_profile_periodicity: maximum profile periodicity supported by -+ * the driver. Setting this field to a non-zero value indicates that the -+ * driver supports enhanced multi-BSSID advertisements (EMA AP). - */ - struct wiphy { - struct mutex mtx; -@@ -5133,6 +5174,9 @@ struct wiphy { - - struct rfkill *rfkill; - -+ u8 mbssid_max_interfaces; -+ u8 ema_max_profile_periodicity; -+ - char priv[] __aligned(NETDEV_ALIGN); - }; - ---- a/include/uapi/linux/nl80211.h -+++ b/include/uapi/linux/nl80211.h -@@ -337,7 +337,10 @@ - * @NL80211_CMD_DEL_INTERFACE: Virtual interface was deleted, has attributes - * %NL80211_ATTR_IFINDEX and %NL80211_ATTR_WIPHY. Can also be sent from - * userspace to request deletion of a virtual interface, then requires -- * attribute %NL80211_ATTR_IFINDEX. -+ * attribute %NL80211_ATTR_IFINDEX. If multiple BSSID advertisements are -+ * enabled using %NL80211_ATTR_MBSSID_CONFIG, %NL80211_ATTR_MBSSID_ELEMS, -+ * and if this command is used for the transmitting interface, then all -+ * the non-transmitting interfaces are deleted as well. - * - * @NL80211_CMD_GET_KEY: Get sequence counter information for a key specified - * by %NL80211_ATTR_KEY_IDX and/or %NL80211_ATTR_MAC. -@@ -2593,6 +2596,18 @@ enum nl80211_commands { - * @NL80211_ATTR_COLOR_CHANGE_ELEMS: Nested set of attributes containing the IE - * information for the time while performing a color switch. - * -+ * @NL80211_ATTR_MBSSID_CONFIG: Nested attribute for multiple BSSID -+ * advertisements (MBSSID) parameters in AP mode. -+ * Kernel uses this attribute to indicate the driver's support for MBSSID -+ * and enhanced multi-BSSID advertisements (EMA AP) to the userspace. -+ * Userspace should use this attribute to configure per interface MBSSID -+ * parameters. -+ * See &enum nl80211_mbssid_config_attributes for details. -+ * -+ * @NL80211_ATTR_MBSSID_ELEMS: Nested parameter to pass multiple BSSID elements. -+ * Mandatory parameter for the transmitting interface to enable MBSSID. -+ * Optional for the non-transmitting interfaces. -+ * - * @NUM_NL80211_ATTR: total number of nl80211_attrs available - * @NL80211_ATTR_MAX: highest attribute number currently defined - * @__NL80211_ATTR_AFTER_LAST: internal use -@@ -3096,6 +3111,9 @@ enum nl80211_attrs { - NL80211_ATTR_COLOR_CHANGE_COLOR, - NL80211_ATTR_COLOR_CHANGE_ELEMS, - -+ NL80211_ATTR_MBSSID_CONFIG, -+ NL80211_ATTR_MBSSID_ELEMS, -+ - /* add attributes here, update the policy in nl80211.c */ - - __NL80211_ATTR_AFTER_LAST, -@@ -7349,4 +7367,60 @@ enum nl80211_sar_specs_attrs { - NL80211_SAR_ATTR_SPECS_MAX = __NL80211_SAR_ATTR_SPECS_LAST - 1, - }; - -+/** -+ * enum nl80211_mbssid_config_attributes - multiple BSSID (MBSSID) and enhanced -+ * multi-BSSID advertisements (EMA) in AP mode. -+ * Kernel uses some of these attributes to advertise driver's support for -+ * MBSSID and EMA. -+ * Remaining attributes should be used by the userspace to configure the -+ * features. -+ * -+ * @__NL80211_MBSSID_CONFIG_ATTR_INVALID: Invalid -+ * -+ * @NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES: Used by the kernel to advertise -+ * the maximum number of MBSSID interfaces supported by the driver. -+ * Driver should indicate MBSSID support by setting -+ * wiphy->mbssid_max_interfaces to a value more than or equal to 2. -+ * -+ * @NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY: Used by the kernel -+ * to advertise the maximum profile periodicity supported by the driver -+ * if EMA is enabled. Driver should indicate EMA support to the userspace -+ * by setting wiphy->mbssid_max_ema_profile_periodicity to -+ * a non-zero value. -+ * -+ * @NL80211_MBSSID_CONFIG_ATTR_INDEX: Mandatory parameter to pass the index of -+ * this BSS (u8) in the multiple BSSID set. -+ * Value must be set to 0 for the transmitting interface and non-zero for -+ * all non-transmitting interfaces. The userspace will be responsible -+ * for using unique indices for the interfaces. -+ * Range: 0 to wiphy->mbssid_max_interfaces-1. -+ * -+ * @NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX: Mandatory parameter for -+ * a non-transmitted profile which provides the interface index (u32) of -+ * the transmitted profile. The value must match one of the interface -+ * indices advertised by the kernel. Optional if the interface being set up -+ * is the transmitting one, however, if provided then the value must match -+ * the interface index of the same. -+ * -+ * @NL80211_MBSSID_CONFIG_ATTR_EMA: Flag used to enable EMA AP feature. -+ * Setting this flag is permitted only if the driver advertises EMA support -+ * by setting wiphy->mbssid_max_ema_profile_periodicity to non-zero. -+ * -+ * @__NL80211_MBSSID_CONFIG_ATTR_LAST: Internal -+ * @NL80211_MBSSID_CONFIG_ATTR_MAX: highest attribute -+ */ -+enum nl80211_mbssid_config_attributes { -+ __NL80211_MBSSID_CONFIG_ATTR_INVALID, -+ -+ NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES, -+ NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY, -+ NL80211_MBSSID_CONFIG_ATTR_INDEX, -+ NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX, -+ NL80211_MBSSID_CONFIG_ATTR_EMA, -+ -+ /* keep last */ -+ __NL80211_MBSSID_CONFIG_ATTR_LAST, -+ NL80211_MBSSID_CONFIG_ATTR_MAX = __NL80211_MBSSID_CONFIG_ATTR_LAST - 1, -+}; -+ - #endif /* __LINUX_NL80211_H */ ---- a/net/wireless/nl80211.c -+++ b/net/wireless/nl80211.c -@@ -442,6 +442,16 @@ sar_policy[NL80211_SAR_ATTR_MAX + 1] = { - [NL80211_SAR_ATTR_SPECS] = NLA_POLICY_NESTED_ARRAY(sar_specs_policy), - }; - -+static const struct nla_policy -+nl80211_mbssid_config_policy[NL80211_MBSSID_CONFIG_ATTR_MAX + 1] = { -+ [NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES] = NLA_POLICY_MIN(NLA_U8, 2), -+ [NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY] = -+ NLA_POLICY_MIN(NLA_U8, 1), -+ [NL80211_MBSSID_CONFIG_ATTR_INDEX] = { .type = NLA_U8 }, -+ [NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX] = { .type = NLA_U32 }, -+ [NL80211_MBSSID_CONFIG_ATTR_EMA] = { .type = NLA_FLAG }, -+}; -+ - static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { - [0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD }, - [NL80211_ATTR_WIPHY] = { .type = NLA_U32 }, -@@ -788,6 +798,9 @@ static const struct nla_policy nl80211_p - [NL80211_ATTR_COLOR_CHANGE_COUNT] = { .type = NLA_U8 }, - [NL80211_ATTR_COLOR_CHANGE_COLOR] = { .type = NLA_U8 }, - [NL80211_ATTR_COLOR_CHANGE_ELEMS] = NLA_POLICY_NESTED(nl80211_policy), -+ [NL80211_ATTR_MBSSID_CONFIG] = -+ NLA_POLICY_NESTED(nl80211_mbssid_config_policy), -+ [NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED }, - }; - - /* policy for the key attributes */ -@@ -2236,6 +2249,35 @@ fail: - return -ENOBUFS; - } - -+static int nl80211_put_mbssid_support(struct wiphy *wiphy, struct sk_buff *msg) -+{ -+ struct nlattr *config; -+ -+ if (!wiphy->mbssid_max_interfaces) -+ return 0; -+ -+ config = nla_nest_start(msg, NL80211_ATTR_MBSSID_CONFIG); -+ if (!config) -+ return -ENOBUFS; -+ -+ if (nla_put_u8(msg, NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES, -+ wiphy->mbssid_max_interfaces)) -+ goto fail; -+ -+ if (wiphy->ema_max_profile_periodicity && -+ nla_put_u8(msg, -+ NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY, -+ wiphy->ema_max_profile_periodicity)) -+ goto fail; -+ -+ nla_nest_end(msg, config); -+ return 0; -+ -+fail: -+ nla_nest_cancel(msg, config); -+ return -ENOBUFS; -+} -+ - struct nl80211_dump_wiphy_state { - s64 filter_wiphy; - long start; -@@ -2821,6 +2863,9 @@ static int nl80211_send_wiphy(struct cfg - if (nl80211_put_sar_specs(rdev, msg)) - goto nla_put_failure; - -+ if (nl80211_put_mbssid_support(&rdev->wiphy, msg)) -+ goto nla_put_failure; -+ - /* done */ - state->split_start = 0; - break; -@@ -5020,6 +5065,96 @@ static int validate_beacon_tx_rate(struc - return 0; - } - -+static int nl80211_parse_mbssid_config(struct wiphy *wiphy, -+ struct net_device *dev, -+ struct nlattr *attrs, -+ struct cfg80211_mbssid_config *config, -+ u8 num_elems) -+{ -+ struct nlattr *tb[NL80211_MBSSID_CONFIG_ATTR_MAX + 1]; -+ -+ if (!wiphy->mbssid_max_interfaces) -+ return -EOPNOTSUPP; -+ -+ if (nla_parse_nested(tb, NL80211_MBSSID_CONFIG_ATTR_MAX, attrs, NULL, -+ NULL) || -+ !tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]) -+ return -EINVAL; -+ -+ config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]); -+ if (config->ema) { -+ if (!wiphy->ema_max_profile_periodicity) -+ return -EOPNOTSUPP; -+ -+ if (num_elems > wiphy->ema_max_profile_periodicity) -+ return -EINVAL; -+ } -+ -+ config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]); -+ if (config->index >= wiphy->mbssid_max_interfaces || -+ (!config->index && !num_elems)) -+ return -EINVAL; -+ -+ if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]) { -+ u32 tx_ifindex = -+ nla_get_u32(tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]); -+ -+ if ((!config->index && tx_ifindex != dev->ifindex) || -+ (config->index && tx_ifindex == dev->ifindex)) -+ return -EINVAL; -+ -+ if (tx_ifindex != dev->ifindex) { -+ struct net_device *tx_netdev = -+ dev_get_by_index(wiphy_net(wiphy), tx_ifindex); -+ -+ if (!tx_netdev || !tx_netdev->ieee80211_ptr || -+ tx_netdev->ieee80211_ptr->wiphy != wiphy || -+ tx_netdev->ieee80211_ptr->iftype != -+ NL80211_IFTYPE_AP) { -+ dev_put(tx_netdev); -+ return -EINVAL; -+ } -+ -+ config->tx_wdev = tx_netdev->ieee80211_ptr; -+ } else { -+ config->tx_wdev = dev->ieee80211_ptr; -+ } -+ } else if (!config->index) { -+ config->tx_wdev = dev->ieee80211_ptr; -+ } else { -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static struct cfg80211_mbssid_elems * -+nl80211_parse_mbssid_elems(struct wiphy *wiphy, struct nlattr *attrs) -+{ -+ struct nlattr *nl_elems; -+ struct cfg80211_mbssid_elems *elems; -+ int rem_elems; -+ u8 i = 0, num_elems = 0; -+ -+ if (!wiphy->mbssid_max_interfaces) -+ return ERR_PTR(-EINVAL); -+ -+ nla_for_each_nested(nl_elems, attrs, rem_elems) -+ num_elems++; -+ -+ elems = kzalloc(struct_size(elems, elem, num_elems), GFP_KERNEL); -+ if (!elems) -+ return ERR_PTR(-ENOMEM); -+ -+ nla_for_each_nested(nl_elems, attrs, rem_elems) { -+ elems->elem[i].data = nla_data(nl_elems); -+ elems->elem[i].len = nla_len(nl_elems); -+ i++; -+ } -+ elems->cnt = num_elems; -+ return elems; -+} -+ - static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev, - struct nlattr *attrs[], - struct cfg80211_beacon_data *bcn) -@@ -5100,6 +5235,17 @@ static int nl80211_parse_beacon(struct c - bcn->ftm_responder = -1; - } - -+ if (attrs[NL80211_ATTR_MBSSID_ELEMS]) { -+ struct cfg80211_mbssid_elems *mbssid = -+ nl80211_parse_mbssid_elems(&rdev->wiphy, -+ attrs[NL80211_ATTR_MBSSID_ELEMS]); -+ -+ if (IS_ERR(mbssid)) -+ return PTR_ERR(mbssid); -+ -+ bcn->mbssid_ies = mbssid; -+ } -+ - return 0; - } - -@@ -5556,6 +5702,17 @@ static int nl80211_start_ap(struct sk_bu - goto out; - } - -+ if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) { -+ err = nl80211_parse_mbssid_config(&rdev->wiphy, dev, -+ info->attrs[NL80211_ATTR_MBSSID_CONFIG], -+ ¶ms.mbssid_config, -+ params.beacon.mbssid_ies ? -+ params.beacon.mbssid_ies->cnt : -+ 0); -+ if (err) -+ goto out; -+ } -+ - nl80211_calculate_ap_params(¶ms); - - if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) -@@ -5577,6 +5734,11 @@ static int nl80211_start_ap(struct sk_bu - - out: - kfree(params.acl); -+ kfree(params.beacon.mbssid_ies); -+ if (params.mbssid_config.tx_wdev && -+ params.mbssid_config.tx_wdev->netdev && -+ params.mbssid_config.tx_wdev->netdev != dev) -+ dev_put(params.mbssid_config.tx_wdev->netdev); - - return err; - } -@@ -5601,12 +5763,14 @@ static int nl80211_set_beacon(struct sk_ - - err = nl80211_parse_beacon(rdev, info->attrs, ¶ms); - if (err) -- return err; -+ goto out; - - wdev_lock(wdev); - err = rdev_change_beacon(rdev, dev, ¶ms); - wdev_unlock(wdev); - -+out: -+ kfree(params.mbssid_ies); - return err; - } - -@@ -9283,12 +9447,14 @@ static int nl80211_channel_switch(struct - - err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after); - if (err) -- return err; -+ goto free; - - csa_attrs = kcalloc(NL80211_ATTR_MAX + 1, sizeof(*csa_attrs), - GFP_KERNEL); -- if (!csa_attrs) -- return -ENOMEM; -+ if (!csa_attrs) { -+ err = -ENOMEM; -+ goto free; -+ } - - err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX, - info->attrs[NL80211_ATTR_CSA_IES], -@@ -9407,6 +9573,8 @@ skip_beacons: - wdev_unlock(wdev); - - free: -+ kfree(params.beacon_after.mbssid_ies); -+ kfree(params.beacon_csa.mbssid_ies); - kfree(csa_attrs); - return err; - } -@@ -14959,6 +15127,8 @@ static int nl80211_color_change(struct s - wdev_unlock(wdev); - - out: -+ kfree(params.beacon_next.mbssid_ies); -+ kfree(params.beacon_color_change.mbssid_ies); - kfree(tb); - return err; - } diff --git a/package/kernel/mac80211/patches/subsys/313-v6.3-wifi-cfg80211-factor-out-bridge-tunnel-RFC1042-heade.patch b/package/kernel/mac80211/patches/subsys/313-v6.3-wifi-cfg80211-factor-out-bridge-tunnel-RFC1042-heade.patch new file mode 100644 index 0000000000..8641057869 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/313-v6.3-wifi-cfg80211-factor-out-bridge-tunnel-RFC1042-heade.patch @@ -0,0 +1,76 @@ +From: Felix Fietkau +Date: Fri, 2 Dec 2022 13:54:15 +0100 +Subject: [PATCH] wifi: cfg80211: factor out bridge tunnel / RFC1042 header + check + +The same check is done in multiple places, unify it. + +Signed-off-by: Felix Fietkau +--- + +--- a/net/wireless/util.c ++++ b/net/wireless/util.c +@@ -542,6 +542,21 @@ unsigned int ieee80211_get_mesh_hdrlen(s + } + EXPORT_SYMBOL(ieee80211_get_mesh_hdrlen); + ++static bool ieee80211_get_8023_tunnel_proto(const void *hdr, __be16 *proto) ++{ ++ const __be16 *hdr_proto = hdr + ETH_ALEN; ++ ++ if (!(ether_addr_equal(hdr, rfc1042_header) && ++ *hdr_proto != htons(ETH_P_AARP) && ++ *hdr_proto != htons(ETH_P_IPX)) && ++ !ether_addr_equal(hdr, bridge_tunnel_header)) ++ return false; ++ ++ *proto = *hdr_proto; ++ ++ return true; ++} ++ + int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr, + const u8 *addr, enum nl80211_iftype iftype, + u8 data_offset, bool is_amsdu) +@@ -633,14 +648,9 @@ int ieee80211_data_to_8023_exthdr(struct + + if (likely(!is_amsdu && + skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)) == 0 && +- ((ether_addr_equal(payload.hdr, rfc1042_header) && +- payload.proto != htons(ETH_P_AARP) && +- payload.proto != htons(ETH_P_IPX)) || +- ether_addr_equal(payload.hdr, bridge_tunnel_header)))) { +- /* remove RFC1042 or Bridge-Tunnel encapsulation and +- * replace EtherType */ ++ ieee80211_get_8023_tunnel_proto(&payload, &tmp.h_proto))) { ++ /* remove RFC1042 or Bridge-Tunnel encapsulation */ + hdrlen += ETH_ALEN + 2; +- tmp.h_proto = payload.proto; + skb_postpull_rcsum(skb, &payload, ETH_ALEN + 2); + } else { + tmp.h_proto = htons(skb->len - hdrlen); +@@ -756,8 +766,6 @@ void ieee80211_amsdu_to_8023s(struct sk_ + { + unsigned int hlen = ALIGN(extra_headroom, 4); + struct sk_buff *frame = NULL; +- u16 ethertype; +- u8 *payload; + int offset = 0, remaining; + struct ethhdr eth; + bool reuse_frag = skb->head_frag && !skb_has_frag_list(skb); +@@ -811,14 +819,8 @@ void ieee80211_amsdu_to_8023s(struct sk_ + frame->dev = skb->dev; + frame->priority = skb->priority; + +- payload = frame->data; +- ethertype = (payload[6] << 8) | payload[7]; +- if (likely((ether_addr_equal(payload, rfc1042_header) && +- ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) || +- ether_addr_equal(payload, bridge_tunnel_header))) { +- eth.h_proto = htons(ethertype); ++ if (likely(ieee80211_get_8023_tunnel_proto(frame->data, ð.h_proto))) + skb_pull(frame, ETH_ALEN + 2); +- } + + memcpy(skb_push(frame, sizeof(eth)), ð, sizeof(eth)); + __skb_queue_tail(list, frame); diff --git a/package/kernel/mac80211/patches/subsys/314-cfg80211-implement-APIs-for-dedicated-radar-detectio.patch b/package/kernel/mac80211/patches/subsys/314-cfg80211-implement-APIs-for-dedicated-radar-detectio.patch deleted file mode 100644 index 2038ee69db..0000000000 --- a/package/kernel/mac80211/patches/subsys/314-cfg80211-implement-APIs-for-dedicated-radar-detectio.patch +++ /dev/null @@ -1,378 +0,0 @@ -From: Lorenzo Bianconi -Date: Sat, 23 Oct 2021 11:10:50 +0200 -Subject: [PATCH] cfg80211: implement APIs for dedicated radar detection HW - -If a dedicated (off-channel) radar detection hardware (chain) -is available in the hardware/driver, allow this to be used by -calling the NL80211_CMD_RADAR_DETECT command with a new flag -attribute requesting off-channel radar detection is used. - -Offchannel CAC (channel availability check) avoids the CAC -downtime when switching to a radar channel or when turning on -the AP. - -Drivers advertise support for this using the new feature flag -NL80211_EXT_FEATURE_RADAR_OFFCHAN. - -Tested-by: Evelyn Tsai -Signed-off-by: Lorenzo Bianconi -Link: https://lore.kernel.org/r/7468e291ef5d05d692c1738d25b8f778d8ea5c3f.1634979655.git.lorenzo@kernel.org -Link: https://lore.kernel.org/r/1e60e60fef00e14401adae81c3d49f3e5f307537.1634979655.git.lorenzo@kernel.org -Link: https://lore.kernel.org/r/85fa50f57fc3adb2934c8d9ca0be30394de6b7e8.1634979655.git.lorenzo@kernel.org -Link: https://lore.kernel.org/r/4b6c08671ad59aae0ac46fc94c02f31b1610eb72.1634979655.git.lorenzo@kernel.org -Link: https://lore.kernel.org/r/241849ccaf2c228873c6f8495bf87b19159ba458.1634979655.git.lorenzo@kernel.org -[remove offchan_mutex, fix cfg80211_stop_offchan_radar_detection(), - remove gfp_t argument, fix documentation, fix tracing] -Signed-off-by: Johannes Berg ---- - ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -4057,6 +4057,15 @@ struct mgmt_frame_regs { - * @set_sar_specs: Update the SAR (TX power) settings. - * - * @color_change: Initiate a color change. -+ * -+ * @set_radar_offchan: Configure dedicated offchannel chain available for -+ * radar/CAC detection on some hw. This chain can't be used to transmit -+ * or receive frames and it is bounded to a running wdev. -+ * Offchannel radar/CAC detection allows to avoid the CAC downtime -+ * switching to a different channel during CAC detection on the selected -+ * radar channel. -+ * The caller is expected to set chandef pointer to NULL in order to -+ * disable offchannel CAC/radar detection. - */ - struct cfg80211_ops { - int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow); -@@ -4387,6 +4396,8 @@ struct cfg80211_ops { - int (*color_change)(struct wiphy *wiphy, - struct net_device *dev, - struct cfg80211_color_change_settings *params); -+ int (*set_radar_offchan)(struct wiphy *wiphy, -+ struct cfg80211_chan_def *chandef); - }; - - /* -@@ -7608,6 +7619,20 @@ void cfg80211_cac_event(struct net_devic - const struct cfg80211_chan_def *chandef, - enum nl80211_radar_event event, gfp_t gfp); - -+/** -+ * cfg80211_offchan_cac_event - Channel Availability Check (CAC) offchan event -+ * @wiphy: the wiphy -+ * @chandef: chandef for the current channel -+ * @event: type of event -+ * -+ * This function is called when a Channel Availability Check (CAC) is finished, -+ * started or aborted by a offchannel dedicated chain. -+ * -+ * Note that this acquires the wiphy lock. -+ */ -+void cfg80211_offchan_cac_event(struct wiphy *wiphy, -+ const struct cfg80211_chan_def *chandef, -+ enum nl80211_radar_event event); - - /** - * cfg80211_gtk_rekey_notify - notify userspace about driver rekeying ---- a/include/uapi/linux/nl80211.h -+++ b/include/uapi/linux/nl80211.h -@@ -2608,6 +2608,13 @@ enum nl80211_commands { - * Mandatory parameter for the transmitting interface to enable MBSSID. - * Optional for the non-transmitting interfaces. - * -+ * @NL80211_ATTR_RADAR_OFFCHAN: Configure dedicated offchannel chain available for -+ * radar/CAC detection on some hw. This chain can't be used to transmit -+ * or receive frames and it is bounded to a running wdev. -+ * Offchannel radar/CAC detection allows to avoid the CAC downtime -+ * switching on a different channel during CAC detection on the selected -+ * radar channel. -+ * - * @NUM_NL80211_ATTR: total number of nl80211_attrs available - * @NL80211_ATTR_MAX: highest attribute number currently defined - * @__NL80211_ATTR_AFTER_LAST: internal use -@@ -3114,6 +3121,8 @@ enum nl80211_attrs { - NL80211_ATTR_MBSSID_CONFIG, - NL80211_ATTR_MBSSID_ELEMS, - -+ NL80211_ATTR_RADAR_OFFCHAN, -+ - /* add attributes here, update the policy in nl80211.c */ - - __NL80211_ATTR_AFTER_LAST, -@@ -6013,6 +6022,9 @@ enum nl80211_feature_flags { - * @NL80211_EXT_FEATURE_BSS_COLOR: The driver supports BSS color collision - * detection and change announcemnts. - * -+ * @NL80211_EXT_FEATURE_RADAR_OFFCHAN: Device supports offchannel radar/CAC -+ * detection. -+ * - * @NUM_NL80211_EXT_FEATURES: number of extended features. - * @MAX_NL80211_EXT_FEATURES: highest extended feature index. - */ -@@ -6078,6 +6090,7 @@ enum nl80211_ext_feature_index { - NL80211_EXT_FEATURE_SECURE_RTT, - NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE, - NL80211_EXT_FEATURE_BSS_COLOR, -+ NL80211_EXT_FEATURE_RADAR_OFFCHAN, - - /* add new features before the definition below */ - NUM_NL80211_EXT_FEATURES, ---- a/net/wireless/core.c -+++ b/net/wireless/core.c -@@ -543,6 +543,7 @@ use_default_name: - INIT_WORK(&rdev->rfkill_block, cfg80211_rfkill_block_work); - INIT_WORK(&rdev->conn_work, cfg80211_conn_work); - INIT_WORK(&rdev->event_work, cfg80211_event_work); -+ INIT_DELAYED_WORK(&rdev->offchan_cac_work, cfg80211_offchan_cac_work); - - init_waitqueue_head(&rdev->dev_wait); - -@@ -1205,6 +1206,8 @@ void __cfg80211_leave(struct cfg80211_re - - cfg80211_pmsr_wdev_down(wdev); - -+ cfg80211_stop_offchan_radar_detection(wdev); -+ - switch (wdev->iftype) { - case NL80211_IFTYPE_ADHOC: - __cfg80211_leave_ibss(rdev, dev, true); ---- a/net/wireless/core.h -+++ b/net/wireless/core.h -@@ -84,6 +84,10 @@ struct cfg80211_registered_device { - - struct delayed_work dfs_update_channels_wk; - -+ struct wireless_dev *offchan_radar_wdev; -+ struct cfg80211_chan_def offchan_radar_chandef; -+ struct delayed_work offchan_cac_work; -+ - /* netlink port which started critical protocol (0 means not started) */ - u32 crit_proto_nlportid; - -@@ -491,6 +495,15 @@ cfg80211_chandef_dfs_cac_time(struct wip - - void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev); - -+int -+cfg80211_start_offchan_radar_detection(struct cfg80211_registered_device *rdev, -+ struct wireless_dev *wdev, -+ struct cfg80211_chan_def *chandef); -+ -+void cfg80211_stop_offchan_radar_detection(struct wireless_dev *wdev); -+ -+void cfg80211_offchan_cac_work(struct work_struct *work); -+ - bool cfg80211_any_wiphy_oper_chan(struct wiphy *wiphy, - struct ieee80211_channel *chan); - ---- a/net/wireless/mlme.c -+++ b/net/wireless/mlme.c -@@ -970,3 +970,116 @@ void cfg80211_cac_event(struct net_devic - nl80211_radar_notify(rdev, chandef, event, netdev, gfp); - } - EXPORT_SYMBOL(cfg80211_cac_event); -+ -+void cfg80211_offchan_cac_work(struct work_struct *work) -+{ -+ struct delayed_work *delayed_work = to_delayed_work(work); -+ struct cfg80211_registered_device *rdev; -+ -+ rdev = container_of(delayed_work, struct cfg80211_registered_device, -+ offchan_cac_work); -+ cfg80211_offchan_cac_event(&rdev->wiphy, &rdev->offchan_radar_chandef, -+ NL80211_RADAR_CAC_FINISHED); -+} -+ -+static void -+__cfg80211_offchan_cac_event(struct cfg80211_registered_device *rdev, -+ struct wireless_dev *wdev, -+ const struct cfg80211_chan_def *chandef, -+ enum nl80211_radar_event event) -+{ -+ struct wiphy *wiphy = &rdev->wiphy; -+ struct net_device *netdev; -+ -+ lockdep_assert_wiphy(&rdev->wiphy); -+ -+ if (event != NL80211_RADAR_CAC_STARTED && !rdev->offchan_radar_wdev) -+ return; -+ -+ switch (event) { -+ case NL80211_RADAR_CAC_FINISHED: -+ cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_AVAILABLE); -+ memcpy(&rdev->cac_done_chandef, chandef, sizeof(*chandef)); -+ queue_work(cfg80211_wq, &rdev->propagate_cac_done_wk); -+ cfg80211_sched_dfs_chan_update(rdev); -+ wdev = rdev->offchan_radar_wdev; -+ rdev->offchan_radar_wdev = NULL; -+ break; -+ case NL80211_RADAR_CAC_ABORTED: -+ cancel_delayed_work(&rdev->offchan_cac_work); -+ wdev = rdev->offchan_radar_wdev; -+ rdev->offchan_radar_wdev = NULL; -+ break; -+ case NL80211_RADAR_CAC_STARTED: -+ WARN_ON(!wdev); -+ rdev->offchan_radar_wdev = wdev; -+ break; -+ default: -+ return; -+ } -+ -+ netdev = wdev ? wdev->netdev : NULL; -+ nl80211_radar_notify(rdev, chandef, event, netdev, GFP_KERNEL); -+} -+ -+void cfg80211_offchan_cac_event(struct wiphy *wiphy, -+ const struct cfg80211_chan_def *chandef, -+ enum nl80211_radar_event event) -+{ -+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); -+ -+ wiphy_lock(wiphy); -+ __cfg80211_offchan_cac_event(rdev, NULL, chandef, event); -+ wiphy_unlock(wiphy); -+} -+EXPORT_SYMBOL(cfg80211_offchan_cac_event); -+ -+int -+cfg80211_start_offchan_radar_detection(struct cfg80211_registered_device *rdev, -+ struct wireless_dev *wdev, -+ struct cfg80211_chan_def *chandef) -+{ -+ unsigned int cac_time_ms; -+ int err; -+ -+ lockdep_assert_wiphy(&rdev->wiphy); -+ -+ if (!wiphy_ext_feature_isset(&rdev->wiphy, -+ NL80211_EXT_FEATURE_RADAR_OFFCHAN)) -+ return -EOPNOTSUPP; -+ -+ if (rdev->offchan_radar_wdev) -+ return -EBUSY; -+ -+ err = rdev_set_radar_offchan(rdev, chandef); -+ if (err) -+ return err; -+ -+ cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, chandef); -+ if (!cac_time_ms) -+ cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; -+ -+ rdev->offchan_radar_chandef = *chandef; -+ __cfg80211_offchan_cac_event(rdev, wdev, chandef, -+ NL80211_RADAR_CAC_STARTED); -+ queue_delayed_work(cfg80211_wq, &rdev->offchan_cac_work, -+ msecs_to_jiffies(cac_time_ms)); -+ -+ return 0; -+} -+ -+void cfg80211_stop_offchan_radar_detection(struct wireless_dev *wdev) -+{ -+ struct wiphy *wiphy = wdev->wiphy; -+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); -+ -+ lockdep_assert_wiphy(wiphy); -+ -+ if (wdev != rdev->offchan_radar_wdev) -+ return; -+ -+ rdev_set_radar_offchan(rdev, NULL); -+ -+ __cfg80211_offchan_cac_event(rdev, NULL, NULL, -+ NL80211_RADAR_CAC_ABORTED); -+} ---- a/net/wireless/nl80211.c -+++ b/net/wireless/nl80211.c -@@ -801,6 +801,7 @@ static const struct nla_policy nl80211_p - [NL80211_ATTR_MBSSID_CONFIG] = - NLA_POLICY_NESTED(nl80211_mbssid_config_policy), - [NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED }, -+ [NL80211_ATTR_RADAR_OFFCHAN] = { .type = NLA_FLAG }, - }; - - /* policy for the key attributes */ -@@ -9287,12 +9288,6 @@ static int nl80211_start_radar_detection - if (err) - return err; - -- if (netif_carrier_ok(dev)) -- return -EBUSY; -- -- if (wdev->cac_started) -- return -EBUSY; -- - err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); - if (err < 0) - return err; -@@ -9303,6 +9298,16 @@ static int nl80211_start_radar_detection - if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) - return -EINVAL; - -+ if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_OFFCHAN])) -+ return cfg80211_start_offchan_radar_detection(rdev, wdev, -+ &chandef); -+ -+ if (netif_carrier_ok(dev)) -+ return -EBUSY; -+ -+ if (wdev->cac_started) -+ return -EBUSY; -+ - /* CAC start is offloaded to HW and can't be started manually */ - if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) - return -EOPNOTSUPP; ---- a/net/wireless/rdev-ops.h -+++ b/net/wireless/rdev-ops.h -@@ -1381,4 +1381,21 @@ static inline int rdev_color_change(stru - return ret; - } - -+static inline int -+rdev_set_radar_offchan(struct cfg80211_registered_device *rdev, -+ struct cfg80211_chan_def *chandef) -+{ -+ struct wiphy *wiphy = &rdev->wiphy; -+ int ret; -+ -+ if (!rdev->ops->set_radar_offchan) -+ return -EOPNOTSUPP; -+ -+ trace_rdev_set_radar_offchan(wiphy, chandef); -+ ret = rdev->ops->set_radar_offchan(wiphy, chandef); -+ trace_rdev_return_int(wiphy, ret); -+ -+ return ret; -+} -+ - #endif /* __CFG80211_RDEV_OPS */ ---- a/net/wireless/trace.h -+++ b/net/wireless/trace.h -@@ -3643,6 +3643,25 @@ TRACE_EVENT(cfg80211_bss_color_notify, - __entry->color_bitmap) - ); - -+TRACE_EVENT(rdev_set_radar_offchan, -+ TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef), -+ -+ TP_ARGS(wiphy, chandef), -+ -+ TP_STRUCT__entry( -+ WIPHY_ENTRY -+ CHAN_DEF_ENTRY -+ ), -+ -+ TP_fast_assign( -+ WIPHY_ASSIGN; -+ CHAN_DEF_ASSIGN(chandef) -+ ), -+ -+ TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT, -+ WIPHY_PR_ARG, CHAN_DEF_PR_ARG) -+); -+ - #endif /* !__RDEV_OPS_TRACE || TRACE_HEADER_MULTI_READ */ - - #undef TRACE_INCLUDE_PATH diff --git a/package/kernel/mac80211/patches/subsys/314-v6.3-wifi-mac80211-remove-mesh-forwarding-congestion-chec.patch b/package/kernel/mac80211/patches/subsys/314-v6.3-wifi-mac80211-remove-mesh-forwarding-congestion-chec.patch new file mode 100644 index 0000000000..515176f0de --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/314-v6.3-wifi-mac80211-remove-mesh-forwarding-congestion-chec.patch @@ -0,0 +1,54 @@ +From: Felix Fietkau +Date: Fri, 2 Dec 2022 17:01:46 +0100 +Subject: [PATCH] wifi: mac80211: remove mesh forwarding congestion check + +Now that all drivers use iTXQ, it does not make sense to check to drop +tx forwarding packets when the driver has stopped the queues. +fq_codel will take care of dropping packets when the queues fill up + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/debugfs_netdev.c ++++ b/net/mac80211/debugfs_netdev.c +@@ -603,8 +603,6 @@ IEEE80211_IF_FILE(fwded_mcast, u.mesh.ms + IEEE80211_IF_FILE(fwded_unicast, u.mesh.mshstats.fwded_unicast, DEC); + IEEE80211_IF_FILE(fwded_frames, u.mesh.mshstats.fwded_frames, DEC); + IEEE80211_IF_FILE(dropped_frames_ttl, u.mesh.mshstats.dropped_frames_ttl, DEC); +-IEEE80211_IF_FILE(dropped_frames_congestion, +- u.mesh.mshstats.dropped_frames_congestion, DEC); + IEEE80211_IF_FILE(dropped_frames_no_route, + u.mesh.mshstats.dropped_frames_no_route, DEC); + +@@ -740,7 +738,6 @@ static void add_mesh_stats(struct ieee80 + MESHSTATS_ADD(fwded_frames); + MESHSTATS_ADD(dropped_frames_ttl); + MESHSTATS_ADD(dropped_frames_no_route); +- MESHSTATS_ADD(dropped_frames_congestion); + #undef MESHSTATS_ADD + } + +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -329,7 +329,6 @@ struct mesh_stats { + __u32 fwded_frames; /* Mesh total forwarded frames */ + __u32 dropped_frames_ttl; /* Not transmitted since mesh_ttl == 0*/ + __u32 dropped_frames_no_route; /* Not transmitted, no route found */ +- __u32 dropped_frames_congestion;/* Not forwarded due to congestion */ + }; + + #define PREQ_Q_F_START 0x1 +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2926,11 +2926,6 @@ ieee80211_rx_h_mesh_fwding(struct ieee80 + return RX_CONTINUE; + + ac = ieee802_1d_to_ac[skb->priority]; +- q = sdata->vif.hw_queue[ac]; +- if (ieee80211_queue_stopped(&local->hw, q)) { +- IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_congestion); +- return RX_DROP_MONITOR; +- } + skb_set_queue_mapping(skb, ac); + + if (!--mesh_hdr->ttl) { diff --git a/package/kernel/mac80211/patches/subsys/315-cfg80211-move-offchan_cac_event-to-a-dedicated-work.patch b/package/kernel/mac80211/patches/subsys/315-cfg80211-move-offchan_cac_event-to-a-dedicated-work.patch deleted file mode 100644 index b1a1d2c894..0000000000 --- a/package/kernel/mac80211/patches/subsys/315-cfg80211-move-offchan_cac_event-to-a-dedicated-work.patch +++ /dev/null @@ -1,183 +0,0 @@ -From: Lorenzo Bianconi -Date: Wed, 27 Oct 2021 11:03:42 +0200 -Subject: [PATCH] cfg80211: move offchan_cac_event to a dedicated work - -In order to make cfg80211_offchan_cac_abort() (renamed from -cfg80211_offchan_cac_event) callable in other contexts and -without so much locking restrictions, make it trigger a new -work instead of operating directly. - -Do some other renames while at it to clarify. - -Signed-off-by: Lorenzo Bianconi -Link: https://lore.kernel.org/r/6145c3d0f30400a568023f67981981d24c7c6133.1635325205.git.lorenzo@kernel.org -[rewrite commit log] -Signed-off-by: Johannes Berg ---- - ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -7620,19 +7620,13 @@ void cfg80211_cac_event(struct net_devic - enum nl80211_radar_event event, gfp_t gfp); - - /** -- * cfg80211_offchan_cac_event - Channel Availability Check (CAC) offchan event -+ * cfg80211_offchan_cac_abort - Channel Availability Check offchan abort event - * @wiphy: the wiphy -- * @chandef: chandef for the current channel -- * @event: type of event - * -- * This function is called when a Channel Availability Check (CAC) is finished, -- * started or aborted by a offchannel dedicated chain. -- * -- * Note that this acquires the wiphy lock. -+ * This function is called by the driver when a Channel Availability Check -+ * (CAC) is aborted by a offchannel dedicated chain. - */ --void cfg80211_offchan_cac_event(struct wiphy *wiphy, -- const struct cfg80211_chan_def *chandef, -- enum nl80211_radar_event event); -+void cfg80211_offchan_cac_abort(struct wiphy *wiphy); - - /** - * cfg80211_gtk_rekey_notify - notify userspace about driver rekeying ---- a/net/wireless/core.c -+++ b/net/wireless/core.c -@@ -543,7 +543,9 @@ use_default_name: - INIT_WORK(&rdev->rfkill_block, cfg80211_rfkill_block_work); - INIT_WORK(&rdev->conn_work, cfg80211_conn_work); - INIT_WORK(&rdev->event_work, cfg80211_event_work); -- INIT_DELAYED_WORK(&rdev->offchan_cac_work, cfg80211_offchan_cac_work); -+ INIT_WORK(&rdev->offchan_cac_abort_wk, cfg80211_offchan_cac_abort_wk); -+ INIT_DELAYED_WORK(&rdev->offchan_cac_done_wk, -+ cfg80211_offchan_cac_done_wk); - - init_waitqueue_head(&rdev->dev_wait); - -@@ -1053,11 +1055,13 @@ void wiphy_unregister(struct wiphy *wiph - cancel_work_sync(&rdev->conn_work); - flush_work(&rdev->event_work); - cancel_delayed_work_sync(&rdev->dfs_update_channels_wk); -+ cancel_delayed_work_sync(&rdev->offchan_cac_done_wk); - flush_work(&rdev->destroy_work); - flush_work(&rdev->sched_scan_stop_wk); - flush_work(&rdev->propagate_radar_detect_wk); - flush_work(&rdev->propagate_cac_done_wk); - flush_work(&rdev->mgmt_registrations_update_wk); -+ flush_work(&rdev->offchan_cac_abort_wk); - - #ifdef CONFIG_PM - if (rdev->wiphy.wowlan_config && rdev->ops->set_wakeup) ---- a/net/wireless/core.h -+++ b/net/wireless/core.h -@@ -86,7 +86,8 @@ struct cfg80211_registered_device { - - struct wireless_dev *offchan_radar_wdev; - struct cfg80211_chan_def offchan_radar_chandef; -- struct delayed_work offchan_cac_work; -+ struct delayed_work offchan_cac_done_wk; -+ struct work_struct offchan_cac_abort_wk; - - /* netlink port which started critical protocol (0 means not started) */ - u32 crit_proto_nlportid; -@@ -502,7 +503,9 @@ cfg80211_start_offchan_radar_detection(s - - void cfg80211_stop_offchan_radar_detection(struct wireless_dev *wdev); - --void cfg80211_offchan_cac_work(struct work_struct *work); -+void cfg80211_offchan_cac_done_wk(struct work_struct *work); -+ -+void cfg80211_offchan_cac_abort_wk(struct work_struct *work); - - bool cfg80211_any_wiphy_oper_chan(struct wiphy *wiphy, - struct ieee80211_channel *chan); ---- a/net/wireless/mlme.c -+++ b/net/wireless/mlme.c -@@ -971,17 +971,6 @@ void cfg80211_cac_event(struct net_devic - } - EXPORT_SYMBOL(cfg80211_cac_event); - --void cfg80211_offchan_cac_work(struct work_struct *work) --{ -- struct delayed_work *delayed_work = to_delayed_work(work); -- struct cfg80211_registered_device *rdev; -- -- rdev = container_of(delayed_work, struct cfg80211_registered_device, -- offchan_cac_work); -- cfg80211_offchan_cac_event(&rdev->wiphy, &rdev->offchan_radar_chandef, -- NL80211_RADAR_CAC_FINISHED); --} -- - static void - __cfg80211_offchan_cac_event(struct cfg80211_registered_device *rdev, - struct wireless_dev *wdev, -@@ -1006,7 +995,7 @@ __cfg80211_offchan_cac_event(struct cfg8 - rdev->offchan_radar_wdev = NULL; - break; - case NL80211_RADAR_CAC_ABORTED: -- cancel_delayed_work(&rdev->offchan_cac_work); -+ cancel_delayed_work(&rdev->offchan_cac_done_wk); - wdev = rdev->offchan_radar_wdev; - rdev->offchan_radar_wdev = NULL; - break; -@@ -1022,17 +1011,44 @@ __cfg80211_offchan_cac_event(struct cfg8 - nl80211_radar_notify(rdev, chandef, event, netdev, GFP_KERNEL); - } - --void cfg80211_offchan_cac_event(struct wiphy *wiphy, -- const struct cfg80211_chan_def *chandef, -- enum nl80211_radar_event event) -+static void -+cfg80211_offchan_cac_event(struct cfg80211_registered_device *rdev, -+ const struct cfg80211_chan_def *chandef, -+ enum nl80211_radar_event event) -+{ -+ wiphy_lock(&rdev->wiphy); -+ __cfg80211_offchan_cac_event(rdev, NULL, chandef, event); -+ wiphy_unlock(&rdev->wiphy); -+} -+ -+void cfg80211_offchan_cac_done_wk(struct work_struct *work) -+{ -+ struct delayed_work *delayed_work = to_delayed_work(work); -+ struct cfg80211_registered_device *rdev; -+ -+ rdev = container_of(delayed_work, struct cfg80211_registered_device, -+ offchan_cac_done_wk); -+ cfg80211_offchan_cac_event(rdev, &rdev->offchan_radar_chandef, -+ NL80211_RADAR_CAC_FINISHED); -+} -+ -+void cfg80211_offchan_cac_abort_wk(struct work_struct *work) -+{ -+ struct cfg80211_registered_device *rdev; -+ -+ rdev = container_of(work, struct cfg80211_registered_device, -+ offchan_cac_abort_wk); -+ cfg80211_offchan_cac_event(rdev, &rdev->offchan_radar_chandef, -+ NL80211_RADAR_CAC_ABORTED); -+} -+ -+void cfg80211_offchan_cac_abort(struct wiphy *wiphy) - { - struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); - -- wiphy_lock(wiphy); -- __cfg80211_offchan_cac_event(rdev, NULL, chandef, event); -- wiphy_unlock(wiphy); -+ queue_work(cfg80211_wq, &rdev->offchan_cac_abort_wk); - } --EXPORT_SYMBOL(cfg80211_offchan_cac_event); -+EXPORT_SYMBOL(cfg80211_offchan_cac_abort); - - int - cfg80211_start_offchan_radar_detection(struct cfg80211_registered_device *rdev, -@@ -1062,7 +1078,7 @@ cfg80211_start_offchan_radar_detection(s - rdev->offchan_radar_chandef = *chandef; - __cfg80211_offchan_cac_event(rdev, wdev, chandef, - NL80211_RADAR_CAC_STARTED); -- queue_delayed_work(cfg80211_wq, &rdev->offchan_cac_work, -+ queue_delayed_work(cfg80211_wq, &rdev->offchan_cac_done_wk, - msecs_to_jiffies(cac_time_ms)); - - return 0; diff --git a/package/kernel/mac80211/patches/subsys/315-v6.3-wifi-mac80211-fix-receiving-A-MSDU-frames-on-mesh-in.patch b/package/kernel/mac80211/patches/subsys/315-v6.3-wifi-mac80211-fix-receiving-A-MSDU-frames-on-mesh-in.patch new file mode 100644 index 0000000000..6aec9bc85f --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/315-v6.3-wifi-mac80211-fix-receiving-A-MSDU-frames-on-mesh-in.patch @@ -0,0 +1,753 @@ +From: Felix Fietkau +Date: Tue, 6 Dec 2022 11:15:02 +0100 +Subject: [PATCH] wifi: mac80211: fix receiving A-MSDU frames on mesh + interfaces + +The current mac80211 mesh A-MSDU receive path fails to parse A-MSDU packets +on mesh interfaces, because it assumes that the Mesh Control field is always +directly after the 802.11 header. +802.11-2020 9.3.2.2.2 Figure 9-70 shows that the Mesh Control field is +actually part of the A-MSDU subframe header. +This makes more sense, since it allows packets for multiple different +destinations to be included in the same A-MSDU, as long as RA and TID are +still the same. +Another issue is the fact that the A-MSDU subframe length field was apparently +accidentally defined as little-endian in the standard. + +In order to fix this, the mesh forwarding path needs happen at a different +point in the receive path. + +ieee80211_data_to_8023_exthdr is changed to ignore the mesh control field +and leave it in after the ethernet header. This also affects the source/dest +MAC address fields, which now in the case of mesh point to the mesh SA/DA. + +ieee80211_amsdu_to_8023s is changed to deal with the endian difference and +to add the Mesh Control length to the subframe length, since it's not covered +by the MSDU length field. + +With these changes, the mac80211 will get the same packet structure for +converted regular data packets and unpacked A-MSDU subframes. + +The mesh forwarding checks are now only performed after the A-MSDU decap. +For locally received packets, the Mesh Control header is stripped away. +For forwarded packets, a new 802.11 header gets added. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c ++++ b/drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c +@@ -33,7 +33,7 @@ static int mwifiex_11n_dispatch_amsdu_pk + skb_trim(skb, le16_to_cpu(local_rx_pd->rx_pkt_length)); + + ieee80211_amsdu_to_8023s(skb, &list, priv->curr_addr, +- priv->wdev.iftype, 0, NULL, NULL); ++ priv->wdev.iftype, 0, NULL, NULL, false); + + while (!skb_queue_empty(&list)) { + struct rx_packet_hdr *rx_hdr; +--- a/include/net/cfg80211.h ++++ b/include/net/cfg80211.h +@@ -6208,11 +6208,36 @@ static inline int ieee80211_data_to_8023 + * @extra_headroom: The hardware extra headroom for SKBs in the @list. + * @check_da: DA to check in the inner ethernet header, or NULL + * @check_sa: SA to check in the inner ethernet header, or NULL ++ * @mesh_control: A-MSDU subframe header includes the mesh control field + */ + void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, + const u8 *addr, enum nl80211_iftype iftype, + const unsigned int extra_headroom, +- const u8 *check_da, const u8 *check_sa); ++ const u8 *check_da, const u8 *check_sa, ++ bool mesh_control); ++ ++/** ++ * ieee80211_get_8023_tunnel_proto - get RFC1042 or bridge tunnel encap protocol ++ * ++ * Check for RFC1042 or bridge tunnel header and fetch the encapsulated ++ * protocol. ++ * ++ * @hdr: pointer to the MSDU payload ++ * @proto: destination pointer to store the protocol ++ * Return: true if encapsulation was found ++ */ ++bool ieee80211_get_8023_tunnel_proto(const void *hdr, __be16 *proto); ++ ++/** ++ * ieee80211_strip_8023_mesh_hdr - strip mesh header from converted 802.3 frames ++ * ++ * Strip the mesh header, which was left in by ieee80211_data_to_8023 as part ++ * of the MSDU data. Also move any source/destination addresses from the mesh ++ * header to the ethernet header (if present). ++ * ++ * @skb: The 802.3 frame with embedded mesh header ++ */ ++int ieee80211_strip_8023_mesh_hdr(struct sk_buff *skb); + + /** + * cfg80211_classify8021d - determine the 802.1p/1d tag for a data frame +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2720,6 +2720,174 @@ ieee80211_deliver_skb(struct ieee80211_r + } + } + ++static ieee80211_rx_result ++ieee80211_rx_mesh_data(struct ieee80211_sub_if_data *sdata, struct sta_info *sta, ++ struct sk_buff *skb) ++{ ++#ifdef CPTCFG_MAC80211_MESH ++ struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; ++ struct ieee80211_local *local = sdata->local; ++ uint16_t fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA; ++ struct ieee80211_hdr hdr = { ++ .frame_control = cpu_to_le16(fc) ++ }; ++ struct ieee80211_hdr *fwd_hdr; ++ struct ieee80211s_hdr *mesh_hdr; ++ struct ieee80211_tx_info *info; ++ struct sk_buff *fwd_skb; ++ struct ethhdr *eth; ++ bool multicast; ++ int tailroom = 0; ++ int hdrlen, mesh_hdrlen; ++ u8 *qos; ++ ++ if (!ieee80211_vif_is_mesh(&sdata->vif)) ++ return RX_CONTINUE; ++ ++ if (!pskb_may_pull(skb, sizeof(*eth) + 6)) ++ return RX_DROP_MONITOR; ++ ++ mesh_hdr = (struct ieee80211s_hdr *)(skb->data + sizeof(*eth)); ++ mesh_hdrlen = ieee80211_get_mesh_hdrlen(mesh_hdr); ++ ++ if (!pskb_may_pull(skb, sizeof(*eth) + mesh_hdrlen)) ++ return RX_DROP_MONITOR; ++ ++ eth = (struct ethhdr *)skb->data; ++ multicast = is_multicast_ether_addr(eth->h_dest); ++ ++ mesh_hdr = (struct ieee80211s_hdr *)(eth + 1); ++ if (!mesh_hdr->ttl) ++ return RX_DROP_MONITOR; ++ ++ /* frame is in RMC, don't forward */ ++ if (is_multicast_ether_addr(eth->h_dest) && ++ mesh_rmc_check(sdata, eth->h_source, mesh_hdr)) ++ return RX_DROP_MONITOR; ++ ++ /* Frame has reached destination. Don't forward */ ++ if (ether_addr_equal(sdata->vif.addr, eth->h_dest)) ++ goto rx_accept; ++ ++ if (!ifmsh->mshcfg.dot11MeshForwarding) { ++ if (is_multicast_ether_addr(eth->h_dest)) ++ goto rx_accept; ++ ++ return RX_DROP_MONITOR; ++ } ++ ++ /* forward packet */ ++ if (sdata->crypto_tx_tailroom_needed_cnt) ++ tailroom = IEEE80211_ENCRYPT_TAILROOM; ++ ++ if (!--mesh_hdr->ttl) { ++ if (multicast) ++ goto rx_accept; ++ ++ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_ttl); ++ return RX_DROP_MONITOR; ++ } ++ ++ if (mesh_hdr->flags & MESH_FLAGS_AE) { ++ struct mesh_path *mppath; ++ char *proxied_addr; ++ ++ if (multicast) ++ proxied_addr = mesh_hdr->eaddr1; ++ else if ((mesh_hdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6) ++ /* has_a4 already checked in ieee80211_rx_mesh_check */ ++ proxied_addr = mesh_hdr->eaddr2; ++ else ++ return RX_DROP_MONITOR; ++ ++ rcu_read_lock(); ++ mppath = mpp_path_lookup(sdata, proxied_addr); ++ if (!mppath) { ++ mpp_path_add(sdata, proxied_addr, eth->h_source); ++ } else { ++ spin_lock_bh(&mppath->state_lock); ++ if (!ether_addr_equal(mppath->mpp, eth->h_source)) ++ memcpy(mppath->mpp, eth->h_source, ETH_ALEN); ++ mppath->exp_time = jiffies; ++ spin_unlock_bh(&mppath->state_lock); ++ } ++ rcu_read_unlock(); ++ } ++ ++ skb_set_queue_mapping(skb, ieee802_1d_to_ac[skb->priority]); ++ ++ ieee80211_fill_mesh_addresses(&hdr, &hdr.frame_control, ++ eth->h_dest, eth->h_source); ++ hdrlen = ieee80211_hdrlen(hdr.frame_control); ++ if (multicast) { ++ int extra_head = sizeof(struct ieee80211_hdr) - sizeof(*eth); ++ ++ fwd_skb = skb_copy_expand(skb, local->tx_headroom + extra_head + ++ IEEE80211_ENCRYPT_HEADROOM, ++ tailroom, GFP_ATOMIC); ++ if (!fwd_skb) ++ goto rx_accept; ++ } else { ++ fwd_skb = skb; ++ skb = NULL; ++ ++ if (skb_cow_head(fwd_skb, hdrlen - sizeof(struct ethhdr))) ++ return RX_DROP_UNUSABLE; ++ } ++ ++ fwd_hdr = skb_push(fwd_skb, hdrlen - sizeof(struct ethhdr)); ++ memcpy(fwd_hdr, &hdr, hdrlen - 2); ++ qos = ieee80211_get_qos_ctl(fwd_hdr); ++ qos[0] = qos[1] = 0; ++ ++ skb_reset_mac_header(fwd_skb); ++ hdrlen += mesh_hdrlen; ++ if (ieee80211_get_8023_tunnel_proto(fwd_skb->data + hdrlen, ++ &fwd_skb->protocol)) ++ hdrlen += ETH_ALEN; ++ else ++ fwd_skb->protocol = htons(fwd_skb->len - hdrlen); ++ skb_set_network_header(fwd_skb, hdrlen); ++ ++ info = IEEE80211_SKB_CB(fwd_skb); ++ memset(info, 0, sizeof(*info)); ++ info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING; ++ info->control.vif = &sdata->vif; ++ info->control.jiffies = jiffies; ++ if (multicast) { ++ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_mcast); ++ memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN); ++ /* update power mode indication when forwarding */ ++ ieee80211_mps_set_frame_flags(sdata, NULL, fwd_hdr); ++ } else if (!mesh_nexthop_lookup(sdata, fwd_skb)) { ++ /* mesh power mode flags updated in mesh_nexthop_lookup */ ++ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast); ++ } else { ++ /* unable to resolve next hop */ ++ if (sta) ++ mesh_path_error_tx(sdata, ifmsh->mshcfg.element_ttl, ++ hdr.addr3, 0, ++ WLAN_REASON_MESH_PATH_NOFORWARD, ++ sta->sta.addr); ++ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_no_route); ++ kfree_skb(fwd_skb); ++ goto rx_accept; ++ } ++ ++ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames); ++ fwd_skb->dev = sdata->dev; ++ ieee80211_add_pending_skb(local, fwd_skb); ++ ++rx_accept: ++ if (!skb) ++ return RX_QUEUED; ++ ++ ieee80211_strip_8023_mesh_hdr(skb); ++#endif ++ ++ return RX_CONTINUE; ++} ++ + static ieee80211_rx_result debug_noinline + __ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx, u8 data_offset) + { +@@ -2728,8 +2896,10 @@ __ieee80211_rx_h_amsdu(struct ieee80211_ + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; + __le16 fc = hdr->frame_control; + struct sk_buff_head frame_list; ++ static ieee80211_rx_result res; + struct ethhdr ethhdr; + const u8 *check_da = ethhdr.h_dest, *check_sa = ethhdr.h_source; ++ bool mesh = false; + + if (unlikely(ieee80211_has_a4(hdr->frame_control))) { + check_da = NULL; +@@ -2746,6 +2916,8 @@ __ieee80211_rx_h_amsdu(struct ieee80211_ + break; + case NL80211_IFTYPE_MESH_POINT: + check_sa = NULL; ++ check_da = NULL; ++ mesh = true; + break; + default: + break; +@@ -2763,17 +2935,29 @@ __ieee80211_rx_h_amsdu(struct ieee80211_ + ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr, + rx->sdata->vif.type, + rx->local->hw.extra_tx_headroom, +- check_da, check_sa); ++ check_da, check_sa, mesh); + + while (!skb_queue_empty(&frame_list)) { + rx->skb = __skb_dequeue(&frame_list); + +- if (!ieee80211_frame_allowed(rx, fc)) { +- dev_kfree_skb(rx->skb); ++ res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb); ++ switch (res) { ++ case RX_QUEUED: + continue; ++ case RX_CONTINUE: ++ break; ++ default: ++ goto free; + } + ++ if (!ieee80211_frame_allowed(rx, fc)) ++ goto free; ++ + ieee80211_deliver_skb(rx); ++ continue; ++ ++free: ++ dev_kfree_skb(rx->skb); + } + + return RX_QUEUED; +@@ -2806,6 +2990,8 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx + if (!rx->sdata->u.mgd.use_4addr) + return RX_DROP_UNUSABLE; + break; ++ case NL80211_IFTYPE_MESH_POINT: ++ break; + default: + return RX_DROP_UNUSABLE; + } +@@ -2834,155 +3020,6 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx + return __ieee80211_rx_h_amsdu(rx, 0); + } + +-#ifdef CPTCFG_MAC80211_MESH +-static ieee80211_rx_result +-ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) +-{ +- struct ieee80211_hdr *fwd_hdr, *hdr; +- struct ieee80211_tx_info *info; +- struct ieee80211s_hdr *mesh_hdr; +- struct sk_buff *skb = rx->skb, *fwd_skb; +- struct ieee80211_local *local = rx->local; +- struct ieee80211_sub_if_data *sdata = rx->sdata; +- struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; +- u16 ac, q, hdrlen; +- int tailroom = 0; +- +- hdr = (struct ieee80211_hdr *) skb->data; +- hdrlen = ieee80211_hdrlen(hdr->frame_control); +- +- /* make sure fixed part of mesh header is there, also checks skb len */ +- if (!pskb_may_pull(rx->skb, hdrlen + 6)) +- return RX_DROP_MONITOR; +- +- mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen); +- +- /* make sure full mesh header is there, also checks skb len */ +- if (!pskb_may_pull(rx->skb, +- hdrlen + ieee80211_get_mesh_hdrlen(mesh_hdr))) +- return RX_DROP_MONITOR; +- +- /* reload pointers */ +- hdr = (struct ieee80211_hdr *) skb->data; +- mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen); +- +- if (ieee80211_drop_unencrypted(rx, hdr->frame_control)) { +- int offset = hdrlen + ieee80211_get_mesh_hdrlen(mesh_hdr) + +- sizeof(rfc1042_header); +- __be16 ethertype; +- +- if (!ether_addr_equal(hdr->addr1, rx->sdata->vif.addr) || +- skb_copy_bits(rx->skb, offset, ðertype, 2) != 0 || +- ethertype != rx->sdata->control_port_protocol) +- return RX_DROP_MONITOR; +- } +- +- /* frame is in RMC, don't forward */ +- if (ieee80211_is_data(hdr->frame_control) && +- is_multicast_ether_addr(hdr->addr1) && +- mesh_rmc_check(rx->sdata, hdr->addr3, mesh_hdr)) +- return RX_DROP_MONITOR; +- +- if (!ieee80211_is_data(hdr->frame_control)) +- return RX_CONTINUE; +- +- if (!mesh_hdr->ttl) +- return RX_DROP_MONITOR; +- +- if (mesh_hdr->flags & MESH_FLAGS_AE) { +- struct mesh_path *mppath; +- char *proxied_addr; +- char *mpp_addr; +- +- if (is_multicast_ether_addr(hdr->addr1)) { +- mpp_addr = hdr->addr3; +- proxied_addr = mesh_hdr->eaddr1; +- } else if ((mesh_hdr->flags & MESH_FLAGS_AE) == +- MESH_FLAGS_AE_A5_A6) { +- /* has_a4 already checked in ieee80211_rx_mesh_check */ +- mpp_addr = hdr->addr4; +- proxied_addr = mesh_hdr->eaddr2; +- } else { +- return RX_DROP_MONITOR; +- } +- +- rcu_read_lock(); +- mppath = mpp_path_lookup(sdata, proxied_addr); +- if (!mppath) { +- mpp_path_add(sdata, proxied_addr, mpp_addr); +- } else { +- spin_lock_bh(&mppath->state_lock); +- if (!ether_addr_equal(mppath->mpp, mpp_addr)) +- memcpy(mppath->mpp, mpp_addr, ETH_ALEN); +- mppath->exp_time = jiffies; +- spin_unlock_bh(&mppath->state_lock); +- } +- rcu_read_unlock(); +- } +- +- /* Frame has reached destination. Don't forward */ +- if (!is_multicast_ether_addr(hdr->addr1) && +- ether_addr_equal(sdata->vif.addr, hdr->addr3)) +- return RX_CONTINUE; +- +- ac = ieee802_1d_to_ac[skb->priority]; +- skb_set_queue_mapping(skb, ac); +- +- if (!--mesh_hdr->ttl) { +- if (!is_multicast_ether_addr(hdr->addr1)) +- IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, +- dropped_frames_ttl); +- goto out; +- } +- +- if (!ifmsh->mshcfg.dot11MeshForwarding) +- goto out; +- +- if (sdata->crypto_tx_tailroom_needed_cnt) +- tailroom = IEEE80211_ENCRYPT_TAILROOM; +- +- fwd_skb = skb_copy_expand(skb, local->tx_headroom + +- IEEE80211_ENCRYPT_HEADROOM, +- tailroom, GFP_ATOMIC); +- if (!fwd_skb) +- goto out; +- +- fwd_skb->dev = sdata->dev; +- fwd_hdr = (struct ieee80211_hdr *) fwd_skb->data; +- fwd_hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_RETRY); +- info = IEEE80211_SKB_CB(fwd_skb); +- memset(info, 0, sizeof(*info)); +- info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING; +- info->control.vif = &rx->sdata->vif; +- info->control.jiffies = jiffies; +- if (is_multicast_ether_addr(fwd_hdr->addr1)) { +- IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_mcast); +- memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN); +- /* update power mode indication when forwarding */ +- ieee80211_mps_set_frame_flags(sdata, NULL, fwd_hdr); +- } else if (!mesh_nexthop_lookup(sdata, fwd_skb)) { +- /* mesh power mode flags updated in mesh_nexthop_lookup */ +- IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast); +- } else { +- /* unable to resolve next hop */ +- mesh_path_error_tx(sdata, ifmsh->mshcfg.element_ttl, +- fwd_hdr->addr3, 0, +- WLAN_REASON_MESH_PATH_NOFORWARD, +- fwd_hdr->addr2); +- IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_no_route); +- kfree_skb(fwd_skb); +- return RX_DROP_MONITOR; +- } +- +- IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames); +- ieee80211_add_pending_skb(local, fwd_skb); +- out: +- if (is_multicast_ether_addr(hdr->addr1)) +- return RX_CONTINUE; +- return RX_DROP_MONITOR; +-} +-#endif +- + static ieee80211_rx_result debug_noinline + ieee80211_rx_h_data(struct ieee80211_rx_data *rx) + { +@@ -2991,6 +3028,7 @@ ieee80211_rx_h_data(struct ieee80211_rx_ + struct net_device *dev = sdata->dev; + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; + __le16 fc = hdr->frame_control; ++ static ieee80211_rx_result res; + bool port_control; + int err; + +@@ -3017,6 +3055,10 @@ ieee80211_rx_h_data(struct ieee80211_rx_ + if (unlikely(err)) + return RX_DROP_UNUSABLE; + ++ res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb); ++ if (res != RX_CONTINUE) ++ return res; ++ + if (!ieee80211_frame_allowed(rx, fc)) + return RX_DROP_MONITOR; + +@@ -3987,10 +4029,6 @@ static void ieee80211_rx_handlers(struct + CALL_RXH(ieee80211_rx_h_defragment); + CALL_RXH(ieee80211_rx_h_michael_mic_verify); + /* must be after MMIC verify so header is counted in MPDU mic */ +-#ifdef CPTCFG_MAC80211_MESH +- if (ieee80211_vif_is_mesh(&rx->sdata->vif)) +- CALL_RXH(ieee80211_rx_h_mesh_fwding); +-#endif + CALL_RXH(ieee80211_rx_h_amsdu); + CALL_RXH(ieee80211_rx_h_data); + +--- a/net/wireless/util.c ++++ b/net/wireless/util.c +@@ -542,7 +542,7 @@ unsigned int ieee80211_get_mesh_hdrlen(s + } + EXPORT_SYMBOL(ieee80211_get_mesh_hdrlen); + +-static bool ieee80211_get_8023_tunnel_proto(const void *hdr, __be16 *proto) ++bool ieee80211_get_8023_tunnel_proto(const void *hdr, __be16 *proto) + { + const __be16 *hdr_proto = hdr + ETH_ALEN; + +@@ -556,6 +556,49 @@ static bool ieee80211_get_8023_tunnel_pr + + return true; + } ++EXPORT_SYMBOL(ieee80211_get_8023_tunnel_proto); ++ ++int ieee80211_strip_8023_mesh_hdr(struct sk_buff *skb) ++{ ++ const void *mesh_addr; ++ struct { ++ struct ethhdr eth; ++ u8 flags; ++ } payload; ++ int hdrlen; ++ int ret; ++ ++ ret = skb_copy_bits(skb, 0, &payload, sizeof(payload)); ++ if (ret) ++ return ret; ++ ++ hdrlen = sizeof(payload.eth) + __ieee80211_get_mesh_hdrlen(payload.flags); ++ ++ if (likely(pskb_may_pull(skb, hdrlen + 8) && ++ ieee80211_get_8023_tunnel_proto(skb->data + hdrlen, ++ &payload.eth.h_proto))) ++ hdrlen += ETH_ALEN + 2; ++ else if (!pskb_may_pull(skb, hdrlen)) ++ return -EINVAL; ++ ++ mesh_addr = skb->data + sizeof(payload.eth) + ETH_ALEN; ++ switch (payload.flags & MESH_FLAGS_AE) { ++ case MESH_FLAGS_AE_A4: ++ memcpy(&payload.eth.h_source, mesh_addr, ETH_ALEN); ++ break; ++ case MESH_FLAGS_AE_A5_A6: ++ memcpy(&payload.eth.h_dest, mesh_addr, 2 * ETH_ALEN); ++ break; ++ default: ++ break; ++ } ++ ++ pskb_pull(skb, hdrlen - sizeof(payload.eth)); ++ memcpy(skb->data, &payload.eth, sizeof(payload.eth)); ++ ++ return 0; ++} ++EXPORT_SYMBOL(ieee80211_strip_8023_mesh_hdr); + + int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr, + const u8 *addr, enum nl80211_iftype iftype, +@@ -568,7 +611,6 @@ int ieee80211_data_to_8023_exthdr(struct + } payload; + struct ethhdr tmp; + u16 hdrlen; +- u8 mesh_flags = 0; + + if (unlikely(!ieee80211_is_data_present(hdr->frame_control))) + return -1; +@@ -589,12 +631,6 @@ int ieee80211_data_to_8023_exthdr(struct + memcpy(tmp.h_dest, ieee80211_get_DA(hdr), ETH_ALEN); + memcpy(tmp.h_source, ieee80211_get_SA(hdr), ETH_ALEN); + +- if (iftype == NL80211_IFTYPE_MESH_POINT && +- skb_copy_bits(skb, hdrlen, &mesh_flags, 1) < 0) +- return -1; +- +- mesh_flags &= MESH_FLAGS_AE; +- + switch (hdr->frame_control & + cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) { + case cpu_to_le16(IEEE80211_FCTL_TODS): +@@ -608,17 +644,6 @@ int ieee80211_data_to_8023_exthdr(struct + iftype != NL80211_IFTYPE_AP_VLAN && + iftype != NL80211_IFTYPE_STATION)) + return -1; +- if (iftype == NL80211_IFTYPE_MESH_POINT) { +- if (mesh_flags == MESH_FLAGS_AE_A4) +- return -1; +- if (mesh_flags == MESH_FLAGS_AE_A5_A6 && +- skb_copy_bits(skb, hdrlen + +- offsetof(struct ieee80211s_hdr, eaddr1), +- tmp.h_dest, 2 * ETH_ALEN) < 0) +- return -1; +- +- hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags); +- } + break; + case cpu_to_le16(IEEE80211_FCTL_FROMDS): + if ((iftype != NL80211_IFTYPE_STATION && +@@ -627,16 +652,6 @@ int ieee80211_data_to_8023_exthdr(struct + (is_multicast_ether_addr(tmp.h_dest) && + ether_addr_equal(tmp.h_source, addr))) + return -1; +- if (iftype == NL80211_IFTYPE_MESH_POINT) { +- if (mesh_flags == MESH_FLAGS_AE_A5_A6) +- return -1; +- if (mesh_flags == MESH_FLAGS_AE_A4 && +- skb_copy_bits(skb, hdrlen + +- offsetof(struct ieee80211s_hdr, eaddr1), +- tmp.h_source, ETH_ALEN) < 0) +- return -1; +- hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags); +- } + break; + case cpu_to_le16(0): + if (iftype != NL80211_IFTYPE_ADHOC && +@@ -646,7 +661,7 @@ int ieee80211_data_to_8023_exthdr(struct + break; + } + +- if (likely(!is_amsdu && ++ if (likely(!is_amsdu && iftype != NL80211_IFTYPE_MESH_POINT && + skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)) == 0 && + ieee80211_get_8023_tunnel_proto(&payload, &tmp.h_proto))) { + /* remove RFC1042 or Bridge-Tunnel encapsulation */ +@@ -722,7 +737,8 @@ __ieee80211_amsdu_copy_frag(struct sk_bu + + static struct sk_buff * + __ieee80211_amsdu_copy(struct sk_buff *skb, unsigned int hlen, +- int offset, int len, bool reuse_frag) ++ int offset, int len, bool reuse_frag, ++ int min_len) + { + struct sk_buff *frame; + int cur_len = len; +@@ -736,7 +752,7 @@ __ieee80211_amsdu_copy(struct sk_buff *s + * in the stack later. + */ + if (reuse_frag) +- cur_len = min_t(int, len, 32); ++ cur_len = min_t(int, len, min_len); + + /* + * Allocate and reserve two bytes more for payload +@@ -746,6 +762,7 @@ __ieee80211_amsdu_copy(struct sk_buff *s + if (!frame) + return NULL; + ++ frame->priority = skb->priority; + skb_reserve(frame, hlen + sizeof(struct ethhdr) + 2); + skb_copy_bits(skb, offset, skb_put(frame, cur_len), cur_len); + +@@ -762,23 +779,37 @@ __ieee80211_amsdu_copy(struct sk_buff *s + void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, + const u8 *addr, enum nl80211_iftype iftype, + const unsigned int extra_headroom, +- const u8 *check_da, const u8 *check_sa) ++ const u8 *check_da, const u8 *check_sa, ++ bool mesh_control) + { + unsigned int hlen = ALIGN(extra_headroom, 4); + struct sk_buff *frame = NULL; + int offset = 0, remaining; +- struct ethhdr eth; ++ struct { ++ struct ethhdr eth; ++ uint8_t flags; ++ } hdr; + bool reuse_frag = skb->head_frag && !skb_has_frag_list(skb); + bool reuse_skb = false; + bool last = false; ++ int copy_len = sizeof(hdr.eth); ++ ++ if (iftype == NL80211_IFTYPE_MESH_POINT) ++ copy_len = sizeof(hdr); + + while (!last) { + unsigned int subframe_len; +- int len; ++ int len, mesh_len = 0; + u8 padding; + +- skb_copy_bits(skb, offset, ð, sizeof(eth)); +- len = ntohs(eth.h_proto); ++ skb_copy_bits(skb, offset, &hdr, copy_len); ++ if (iftype == NL80211_IFTYPE_MESH_POINT) ++ mesh_len = __ieee80211_get_mesh_hdrlen(hdr.flags); ++ if (mesh_control) ++ len = le16_to_cpu(*(__le16 *)&hdr.eth.h_proto) + mesh_len; ++ else ++ len = ntohs(hdr.eth.h_proto); ++ + subframe_len = sizeof(struct ethhdr) + len; + padding = (4 - subframe_len) & 0x3; + +@@ -787,16 +818,16 @@ void ieee80211_amsdu_to_8023s(struct sk_ + if (subframe_len > remaining) + goto purge; + /* mitigate A-MSDU aggregation injection attacks */ +- if (ether_addr_equal(eth.h_dest, rfc1042_header)) ++ if (ether_addr_equal(hdr.eth.h_dest, rfc1042_header)) + goto purge; + + offset += sizeof(struct ethhdr); + last = remaining <= subframe_len + padding; + + /* FIXME: should we really accept multicast DA? */ +- if ((check_da && !is_multicast_ether_addr(eth.h_dest) && +- !ether_addr_equal(check_da, eth.h_dest)) || +- (check_sa && !ether_addr_equal(check_sa, eth.h_source))) { ++ if ((check_da && !is_multicast_ether_addr(hdr.eth.h_dest) && ++ !ether_addr_equal(check_da, hdr.eth.h_dest)) || ++ (check_sa && !ether_addr_equal(check_sa, hdr.eth.h_source))) { + offset += len + padding; + continue; + } +@@ -808,7 +839,7 @@ void ieee80211_amsdu_to_8023s(struct sk_ + reuse_skb = true; + } else { + frame = __ieee80211_amsdu_copy(skb, hlen, offset, len, +- reuse_frag); ++ reuse_frag, 32 + mesh_len); + if (!frame) + goto purge; + +@@ -819,10 +850,11 @@ void ieee80211_amsdu_to_8023s(struct sk_ + frame->dev = skb->dev; + frame->priority = skb->priority; + +- if (likely(ieee80211_get_8023_tunnel_proto(frame->data, ð.h_proto))) ++ if (likely(iftype != NL80211_IFTYPE_MESH_POINT && ++ ieee80211_get_8023_tunnel_proto(frame->data, &hdr.eth.h_proto))) + skb_pull(frame, ETH_ALEN + 2); + +- memcpy(skb_push(frame, sizeof(eth)), ð, sizeof(eth)); ++ memcpy(skb_push(frame, sizeof(hdr.eth)), &hdr.eth, sizeof(hdr.eth)); + __skb_queue_tail(list, frame); + } + diff --git a/package/kernel/mac80211/patches/subsys/316-cfg80211-fix-possible-NULL-pointer-dereference-in-cf.patch b/package/kernel/mac80211/patches/subsys/316-cfg80211-fix-possible-NULL-pointer-dereference-in-cf.patch deleted file mode 100644 index 362bb885d7..0000000000 --- a/package/kernel/mac80211/patches/subsys/316-cfg80211-fix-possible-NULL-pointer-dereference-in-cf.patch +++ /dev/null @@ -1,99 +0,0 @@ -From: Lorenzo Bianconi -Date: Wed, 3 Nov 2021 18:02:35 +0100 -Subject: [PATCH] cfg80211: fix possible NULL pointer dereference in - cfg80211_stop_offchan_radar_detection - -Fix the following NULL pointer dereference in -cfg80211_stop_offchan_radar_detection routine that occurs when hostapd -is stopped during the CAC on offchannel chain: - -Sat Jan 1 0[ 779.567851] ESR = 0x96000005 -0:12:50 2000 dae[ 779.572346] EC = 0x25: DABT (current EL), IL = 32 bits -mon.debug hostap[ 779.578984] SET = 0, FnV = 0 -d: hostapd_inter[ 779.583445] EA = 0, S1PTW = 0 -face_deinit_free[ 779.587936] Data abort info: -: num_bss=1 conf[ 779.592224] ISV = 0, ISS = 0x00000005 -->num_bss=1 -Sat[ 779.597403] CM = 0, WnR = 0 - Jan 1 00:12:50[ 779.601749] user pgtable: 4k pages, 39-bit VAs, pgdp=00000000418b2000 - 2000 daemon.deb[ 779.609601] [0000000000000000] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000 -ug hostapd: host[ 779.619657] Internal error: Oops: 96000005 [#1] SMP -[ 779.770810] CPU: 0 PID: 2202 Comm: hostapd Not tainted 5.10.75 #0 -[ 779.776892] Hardware name: MediaTek MT7622 RFB1 board (DT) -[ 779.782370] pstate: 80000005 (Nzcv daif -PAN -UAO -TCO BTYPE=--) -[ 779.788384] pc : cfg80211_chandef_valid+0x10/0x490 [cfg80211] -[ 779.794128] lr : cfg80211_check_station_change+0x3190/0x3950 [cfg80211] -[ 779.800731] sp : ffffffc01204b7e0 -[ 779.804036] x29: ffffffc01204b7e0 x28: ffffff80039bdc00 -[ 779.809340] x27: 0000000000000000 x26: ffffffc008cb3050 -[ 779.814644] x25: 0000000000000000 x24: 0000000000000002 -[ 779.819948] x23: ffffff8002630000 x22: ffffff8003e748d0 -[ 779.825252] x21: 0000000000000cc0 x20: ffffff8003da4a00 -[ 779.830556] x19: 0000000000000000 x18: ffffff8001bf7ce0 -[ 779.835860] x17: 00000000ffffffff x16: 0000000000000000 -[ 779.841164] x15: 0000000040d59200 x14: 00000000000019c0 -[ 779.846467] x13: 00000000000001c8 x12: 000636b9e9dab1c6 -[ 779.851771] x11: 0000000000000141 x10: 0000000000000820 -[ 779.857076] x9 : 0000000000000000 x8 : ffffff8003d7d038 -[ 779.862380] x7 : 0000000000000000 x6 : ffffff8003d7d038 -[ 779.867683] x5 : 0000000000000e90 x4 : 0000000000000038 -[ 779.872987] x3 : 0000000000000002 x2 : 0000000000000004 -[ 779.878291] x1 : 0000000000000000 x0 : 0000000000000000 -[ 779.883594] Call trace: -[ 779.886039] cfg80211_chandef_valid+0x10/0x490 [cfg80211] -[ 779.891434] cfg80211_check_station_change+0x3190/0x3950 [cfg80211] -[ 779.897697] nl80211_radar_notify+0x138/0x19c [cfg80211] -[ 779.903005] cfg80211_stop_offchan_radar_detection+0x7c/0x8c [cfg80211] -[ 779.909616] __cfg80211_leave+0x2c/0x190 [cfg80211] -[ 779.914490] cfg80211_register_netdevice+0x1c0/0x6d0 [cfg80211] -[ 779.920404] raw_notifier_call_chain+0x50/0x70 -[ 779.924841] call_netdevice_notifiers_info+0x54/0xa0 -[ 779.929796] __dev_close_many+0x40/0x100 -[ 779.933712] __dev_change_flags+0x98/0x190 -[ 779.937800] dev_change_flags+0x20/0x60 -[ 779.941628] devinet_ioctl+0x534/0x6d0 -[ 779.945370] inet_ioctl+0x1bc/0x230 -[ 779.948849] sock_do_ioctl+0x44/0x200 -[ 779.952502] sock_ioctl+0x268/0x4c0 -[ 779.955985] __arm64_sys_ioctl+0xac/0xd0 -[ 779.959900] el0_svc_common.constprop.0+0x60/0x110 -[ 779.964682] do_el0_svc+0x1c/0x24 -[ 779.967990] el0_svc+0x10/0x1c -[ 779.971036] el0_sync_handler+0x9c/0x120 -[ 779.974950] el0_sync+0x148/0x180 -[ 779.978259] Code: a9bc7bfd 910003fd a90153f3 aa0003f3 (f9400000) -[ 779.984344] ---[ end trace 0e67b4f5d6cdeec7 ]--- -[ 779.996400] Kernel panic - not syncing: Oops: Fatal exception -[ 780.002139] SMP: stopping secondary CPUs -[ 780.006057] Kernel Offset: disabled -[ 780.009537] CPU features: 0x0000002,04002004 -[ 780.013796] Memory Limit: none - -Fixes: b8f5facf286b ("cfg80211: implement APIs for dedicated radar detection HW") -Reported-by: Evelyn Tsai -Tested-by: Evelyn Tsai -Signed-off-by: Lorenzo Bianconi -Link: https://lore.kernel.org/r/c2e34c065bf8839c5ffa45498ae154021a72a520.1635958796.git.lorenzo@kernel.org -Signed-off-by: Johannes Berg ---- - ---- a/net/wireless/mlme.c -+++ b/net/wireless/mlme.c -@@ -982,6 +982,9 @@ __cfg80211_offchan_cac_event(struct cfg8 - - lockdep_assert_wiphy(&rdev->wiphy); - -+ if (!cfg80211_chandef_valid(chandef)) -+ return; -+ - if (event != NL80211_RADAR_CAC_STARTED && !rdev->offchan_radar_wdev) - return; - -@@ -1096,6 +1099,6 @@ void cfg80211_stop_offchan_radar_detecti - - rdev_set_radar_offchan(rdev, NULL); - -- __cfg80211_offchan_cac_event(rdev, NULL, NULL, -+ __cfg80211_offchan_cac_event(rdev, wdev, &rdev->offchan_radar_chandef, - NL80211_RADAR_CAC_ABORTED); - } diff --git a/package/kernel/mac80211/patches/subsys/316-v6.3-wifi-mac80211-add-a-workaround-for-receiving-non-sta.patch b/package/kernel/mac80211/patches/subsys/316-v6.3-wifi-mac80211-add-a-workaround-for-receiving-non-sta.patch new file mode 100644 index 0000000000..6dc98ae16a --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/316-v6.3-wifi-mac80211-add-a-workaround-for-receiving-non-sta.patch @@ -0,0 +1,145 @@ +From: Felix Fietkau +Date: Fri, 9 Dec 2022 21:15:04 +0100 +Subject: [PATCH] wifi: mac80211: add a workaround for receiving + non-standard mesh A-MSDU + +At least ath10k and ath11k supported hardware (maybe more) does not implement +mesh A-MSDU aggregation in a standard compliant way. +802.11-2020 9.3.2.2.2 declares that the Mesh Control field is part of the +A-MSDU header. As such, its length must not be included in the subframe +length field. +Hardware affected by this bug treats the mesh control field as part of the +MSDU data and sets the length accordingly. +In order to avoid packet loss, keep track of which stations are affected +by this and take it into account when converting A-MSDU to 802.3 + mesh control +packets. + +Signed-off-by: Felix Fietkau +--- + +--- a/include/net/cfg80211.h ++++ b/include/net/cfg80211.h +@@ -6194,6 +6194,19 @@ static inline int ieee80211_data_to_8023 + } + + /** ++ * ieee80211_is_valid_amsdu - check if subframe lengths of an A-MSDU are valid ++ * ++ * This is used to detect non-standard A-MSDU frames, e.g. the ones generated ++ * by ath10k and ath11k, where the subframe length includes the length of the ++ * mesh control field. ++ * ++ * @skb: The input A-MSDU frame without any headers. ++ * @mesh_hdr: use standard compliant mesh A-MSDU subframe header ++ * Returns: true if subframe header lengths are valid for the @mesh_hdr mode ++ */ ++bool ieee80211_is_valid_amsdu(struct sk_buff *skb, bool mesh_hdr); ++ ++/** + * ieee80211_amsdu_to_8023s - decode an IEEE 802.11n A-MSDU frame + * + * Decode an IEEE 802.11 A-MSDU and convert it to a list of 802.3 frames. +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2899,7 +2899,6 @@ __ieee80211_rx_h_amsdu(struct ieee80211_ + static ieee80211_rx_result res; + struct ethhdr ethhdr; + const u8 *check_da = ethhdr.h_dest, *check_sa = ethhdr.h_source; +- bool mesh = false; + + if (unlikely(ieee80211_has_a4(hdr->frame_control))) { + check_da = NULL; +@@ -2917,7 +2916,6 @@ __ieee80211_rx_h_amsdu(struct ieee80211_ + case NL80211_IFTYPE_MESH_POINT: + check_sa = NULL; + check_da = NULL; +- mesh = true; + break; + default: + break; +@@ -2932,10 +2930,21 @@ __ieee80211_rx_h_amsdu(struct ieee80211_ + data_offset, true)) + return RX_DROP_UNUSABLE; + ++ if (rx->sta && rx->sta->amsdu_mesh_control < 0) { ++ bool valid_std = ieee80211_is_valid_amsdu(skb, true); ++ bool valid_nonstd = ieee80211_is_valid_amsdu(skb, false); ++ ++ if (valid_std && !valid_nonstd) ++ rx->sta->amsdu_mesh_control = 1; ++ else if (valid_nonstd && !valid_std) ++ rx->sta->amsdu_mesh_control = 0; ++ } ++ + ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr, + rx->sdata->vif.type, + rx->local->hw.extra_tx_headroom, +- check_da, check_sa, mesh); ++ check_da, check_sa, ++ rx->sta->amsdu_mesh_control); + + while (!skb_queue_empty(&frame_list)) { + rx->skb = __skb_dequeue(&frame_list); +--- a/net/mac80211/sta_info.c ++++ b/net/mac80211/sta_info.c +@@ -591,6 +591,9 @@ __sta_info_alloc(struct ieee80211_sub_if + + sta->sta_state = IEEE80211_STA_NONE; + ++ if (sdata->vif.type == NL80211_IFTYPE_MESH_POINT) ++ sta->amsdu_mesh_control = -1; ++ + /* Mark TID as unreserved */ + sta->reserved_tid = IEEE80211_TID_UNRESERVED; + +--- a/net/mac80211/sta_info.h ++++ b/net/mac80211/sta_info.h +@@ -702,6 +702,7 @@ struct sta_info { + struct codel_params cparams; + + u8 reserved_tid; ++ s8 amsdu_mesh_control; + + struct cfg80211_chan_def tdls_chandef; + +--- a/net/wireless/util.c ++++ b/net/wireless/util.c +@@ -776,6 +776,38 @@ __ieee80211_amsdu_copy(struct sk_buff *s + return frame; + } + ++bool ieee80211_is_valid_amsdu(struct sk_buff *skb, bool mesh_hdr) ++{ ++ int offset = 0, remaining, subframe_len, padding; ++ ++ for (offset = 0; offset < skb->len; offset += subframe_len + padding) { ++ struct { ++ __be16 len; ++ u8 mesh_flags; ++ } hdr; ++ u16 len; ++ ++ if (skb_copy_bits(skb, offset + 2 * ETH_ALEN, &hdr, sizeof(hdr)) < 0) ++ return false; ++ ++ if (mesh_hdr) ++ len = le16_to_cpu(*(__le16 *)&hdr.len) + ++ __ieee80211_get_mesh_hdrlen(hdr.mesh_flags); ++ else ++ len = ntohs(hdr.len); ++ ++ subframe_len = sizeof(struct ethhdr) + len; ++ padding = (4 - subframe_len) & 0x3; ++ remaining = skb->len - offset; ++ ++ if (subframe_len > remaining) ++ return false; ++ } ++ ++ return true; ++} ++EXPORT_SYMBOL(ieee80211_is_valid_amsdu); ++ + void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, + const u8 *addr, enum nl80211_iftype iftype, + const unsigned int extra_headroom, diff --git a/package/kernel/mac80211/patches/subsys/317-cfg80211-schedule-offchan_cac_abort_wk-in-cfg80211_r.patch b/package/kernel/mac80211/patches/subsys/317-cfg80211-schedule-offchan_cac_abort_wk-in-cfg80211_r.patch deleted file mode 100644 index df7afefb34..0000000000 --- a/package/kernel/mac80211/patches/subsys/317-cfg80211-schedule-offchan_cac_abort_wk-in-cfg80211_r.patch +++ /dev/null @@ -1,136 +0,0 @@ -From: Lorenzo Bianconi -Date: Tue, 16 Nov 2021 12:41:52 +0100 -Subject: [PATCH] cfg80211: schedule offchan_cac_abort_wk in - cfg80211_radar_event - -If necessary schedule offchan_cac_abort_wk work in cfg80211_radar_event -routine adding offchan parameter to cfg80211_radar_event signature. -Rename cfg80211_radar_event in __cfg80211_radar_event and introduce -the two following inline helpers: -- cfg80211_radar_event -- cfg80211_offchan_radar_event -Doing so the drv will not need to run cfg80211_offchan_cac_abort() after -radar detection on the offchannel chain. - -Tested-by: Owen Peng -Signed-off-by: Lorenzo Bianconi -Link: https://lore.kernel.org/r/3ff583e021e3343a3ced54a7b09b5e184d1880dc.1637062727.git.lorenzo@kernel.org -Signed-off-by: Johannes Berg ---- - ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -7580,15 +7580,33 @@ void cfg80211_cqm_txe_notify(struct net_ - void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp); - - /** -- * cfg80211_radar_event - radar detection event -+ * __cfg80211_radar_event - radar detection event - * @wiphy: the wiphy - * @chandef: chandef for the current channel -+ * @offchan: the radar has been detected on the offchannel chain - * @gfp: context flags - * - * This function is called when a radar is detected on the current chanenl. - */ --void cfg80211_radar_event(struct wiphy *wiphy, -- struct cfg80211_chan_def *chandef, gfp_t gfp); -+void __cfg80211_radar_event(struct wiphy *wiphy, -+ struct cfg80211_chan_def *chandef, -+ bool offchan, gfp_t gfp); -+ -+static inline void -+cfg80211_radar_event(struct wiphy *wiphy, -+ struct cfg80211_chan_def *chandef, -+ gfp_t gfp) -+{ -+ __cfg80211_radar_event(wiphy, chandef, false, gfp); -+} -+ -+static inline void -+cfg80211_offchan_radar_event(struct wiphy *wiphy, -+ struct cfg80211_chan_def *chandef, -+ gfp_t gfp) -+{ -+ __cfg80211_radar_event(wiphy, chandef, true, gfp); -+} - - /** - * cfg80211_sta_opmode_change_notify - STA's ht/vht operation mode change event ---- a/net/wireless/mlme.c -+++ b/net/wireless/mlme.c -@@ -905,13 +905,13 @@ void cfg80211_dfs_channels_update_work(s - } - - --void cfg80211_radar_event(struct wiphy *wiphy, -- struct cfg80211_chan_def *chandef, -- gfp_t gfp) -+void __cfg80211_radar_event(struct wiphy *wiphy, -+ struct cfg80211_chan_def *chandef, -+ bool offchan, gfp_t gfp) - { - struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); - -- trace_cfg80211_radar_event(wiphy, chandef); -+ trace_cfg80211_radar_event(wiphy, chandef, offchan); - - /* only set the chandef supplied channel to unavailable, in - * case the radar is detected on only one of multiple channels -@@ -919,6 +919,9 @@ void cfg80211_radar_event(struct wiphy * - */ - cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_UNAVAILABLE); - -+ if (offchan) -+ queue_work(cfg80211_wq, &rdev->offchan_cac_abort_wk); -+ - cfg80211_sched_dfs_chan_update(rdev); - - nl80211_radar_notify(rdev, chandef, NL80211_RADAR_DETECTED, NULL, gfp); -@@ -926,7 +929,7 @@ void cfg80211_radar_event(struct wiphy * - memcpy(&rdev->radar_chandef, chandef, sizeof(struct cfg80211_chan_def)); - queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); - } --EXPORT_SYMBOL(cfg80211_radar_event); -+EXPORT_SYMBOL(__cfg80211_radar_event); - - void cfg80211_cac_event(struct net_device *netdev, - const struct cfg80211_chan_def *chandef, -@@ -998,7 +1001,8 @@ __cfg80211_offchan_cac_event(struct cfg8 - rdev->offchan_radar_wdev = NULL; - break; - case NL80211_RADAR_CAC_ABORTED: -- cancel_delayed_work(&rdev->offchan_cac_done_wk); -+ if (!cancel_delayed_work(&rdev->offchan_cac_done_wk)) -+ return; - wdev = rdev->offchan_radar_wdev; - rdev->offchan_radar_wdev = NULL; - break; ---- a/net/wireless/trace.h -+++ b/net/wireless/trace.h -@@ -3022,18 +3022,21 @@ TRACE_EVENT(cfg80211_ch_switch_started_n - ); - - TRACE_EVENT(cfg80211_radar_event, -- TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef), -- TP_ARGS(wiphy, chandef), -+ TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef, -+ bool offchan), -+ TP_ARGS(wiphy, chandef, offchan), - TP_STRUCT__entry( - WIPHY_ENTRY - CHAN_DEF_ENTRY -+ __field(bool, offchan) - ), - TP_fast_assign( - WIPHY_ASSIGN; - CHAN_DEF_ASSIGN(chandef); -+ __entry->offchan = offchan; - ), -- TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT, -- WIPHY_PR_ARG, CHAN_DEF_PR_ARG) -+ TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT ", offchan %d", -+ WIPHY_PR_ARG, CHAN_DEF_PR_ARG, __entry->offchan) - ); - - TRACE_EVENT(cfg80211_cac_event, diff --git a/package/kernel/mac80211/patches/subsys/318-cfg80211-allow-continuous-radar-monitoring-on-offcha.patch b/package/kernel/mac80211/patches/subsys/318-cfg80211-allow-continuous-radar-monitoring-on-offcha.patch deleted file mode 100644 index a1b6e3c80d..0000000000 --- a/package/kernel/mac80211/patches/subsys/318-cfg80211-allow-continuous-radar-monitoring-on-offcha.patch +++ /dev/null @@ -1,220 +0,0 @@ -From: Lorenzo Bianconi -Date: Tue, 16 Nov 2021 15:03:36 +0100 -Subject: [PATCH] cfg80211: allow continuous radar monitoring on offchannel - chain - -Allow continuous radar detection on the offchannel chain in order -to switch to the monitored channel whenever the underlying driver -reports a radar pattern on the main channel. - -Tested-by: Owen Peng -Signed-off-by: Lorenzo Bianconi -Link: https://lore.kernel.org/r/d46217310a49b14ff0e9c002f0a6e0547d70fd2c.1637071350.git.lorenzo@kernel.org -Signed-off-by: Johannes Berg ---- - ---- a/net/wireless/chan.c -+++ b/net/wireless/chan.c -@@ -712,6 +712,19 @@ static bool cfg80211_is_wiphy_oper_chan( - return false; - } - -+static bool -+cfg80211_offchan_chain_is_active(struct cfg80211_registered_device *rdev, -+ struct ieee80211_channel *channel) -+{ -+ if (!rdev->offchan_radar_wdev) -+ return false; -+ -+ if (!cfg80211_chandef_valid(&rdev->offchan_radar_chandef)) -+ return false; -+ -+ return cfg80211_is_sub_chan(&rdev->offchan_radar_chandef, channel); -+} -+ - bool cfg80211_any_wiphy_oper_chan(struct wiphy *wiphy, - struct ieee80211_channel *chan) - { -@@ -728,6 +741,9 @@ bool cfg80211_any_wiphy_oper_chan(struct - - if (cfg80211_is_wiphy_oper_chan(&rdev->wiphy, chan)) - return true; -+ -+ if (cfg80211_offchan_chain_is_active(rdev, chan)) -+ return true; - } - - return false; ---- a/net/wireless/mlme.c -+++ b/net/wireless/mlme.c -@@ -988,7 +988,7 @@ __cfg80211_offchan_cac_event(struct cfg8 - if (!cfg80211_chandef_valid(chandef)) - return; - -- if (event != NL80211_RADAR_CAC_STARTED && !rdev->offchan_radar_wdev) -+ if (!rdev->offchan_radar_wdev) - return; - - switch (event) { -@@ -998,17 +998,13 @@ __cfg80211_offchan_cac_event(struct cfg8 - queue_work(cfg80211_wq, &rdev->propagate_cac_done_wk); - cfg80211_sched_dfs_chan_update(rdev); - wdev = rdev->offchan_radar_wdev; -- rdev->offchan_radar_wdev = NULL; - break; - case NL80211_RADAR_CAC_ABORTED: - if (!cancel_delayed_work(&rdev->offchan_cac_done_wk)) - return; - wdev = rdev->offchan_radar_wdev; -- rdev->offchan_radar_wdev = NULL; - break; - case NL80211_RADAR_CAC_STARTED: -- WARN_ON(!wdev); -- rdev->offchan_radar_wdev = wdev; - break; - default: - return; -@@ -1024,7 +1020,8 @@ cfg80211_offchan_cac_event(struct cfg802 - enum nl80211_radar_event event) - { - wiphy_lock(&rdev->wiphy); -- __cfg80211_offchan_cac_event(rdev, NULL, chandef, event); -+ __cfg80211_offchan_cac_event(rdev, rdev->offchan_radar_wdev, -+ chandef, event); - wiphy_unlock(&rdev->wiphy); - } - -@@ -1071,7 +1068,13 @@ cfg80211_start_offchan_radar_detection(s - NL80211_EXT_FEATURE_RADAR_OFFCHAN)) - return -EOPNOTSUPP; - -- if (rdev->offchan_radar_wdev) -+ /* Offchannel chain already locked by another wdev */ -+ if (rdev->offchan_radar_wdev && rdev->offchan_radar_wdev != wdev) -+ return -EBUSY; -+ -+ /* CAC already in progress on the offchannel chain */ -+ if (rdev->offchan_radar_wdev == wdev && -+ delayed_work_pending(&rdev->offchan_cac_done_wk)) - return -EBUSY; - - err = rdev_set_radar_offchan(rdev, chandef); -@@ -1083,6 +1086,8 @@ cfg80211_start_offchan_radar_detection(s - cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; - - rdev->offchan_radar_chandef = *chandef; -+ rdev->offchan_radar_wdev = wdev; /* Get offchain ownership */ -+ - __cfg80211_offchan_cac_event(rdev, wdev, chandef, - NL80211_RADAR_CAC_STARTED); - queue_delayed_work(cfg80211_wq, &rdev->offchan_cac_done_wk, -@@ -1102,6 +1107,7 @@ void cfg80211_stop_offchan_radar_detecti - return; - - rdev_set_radar_offchan(rdev, NULL); -+ rdev->offchan_radar_wdev = NULL; /* Release offchain ownership */ - - __cfg80211_offchan_cac_event(rdev, wdev, &rdev->offchan_radar_chandef, - NL80211_RADAR_CAC_ABORTED); ---- a/net/wireless/nl80211.c -+++ b/net/wireless/nl80211.c -@@ -9278,42 +9278,60 @@ static int nl80211_start_radar_detection - struct cfg80211_chan_def chandef; - enum nl80211_dfs_regions dfs_region; - unsigned int cac_time_ms; -- int err; -+ int err = -EINVAL; -+ -+ flush_delayed_work(&rdev->dfs_update_channels_wk); -+ -+ wiphy_lock(wiphy); - - dfs_region = reg_get_dfs_region(wiphy); - if (dfs_region == NL80211_DFS_UNSET) -- return -EINVAL; -+ goto unlock; - - err = nl80211_parse_chandef(rdev, info, &chandef); - if (err) -- return err; -+ goto unlock; - - err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); - if (err < 0) -- return err; -+ goto unlock; - -- if (err == 0) -- return -EINVAL; -+ if (err == 0) { -+ err = -EINVAL; -+ goto unlock; -+ } - -- if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) -- return -EINVAL; -+ if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) { -+ err = -EINVAL; -+ goto unlock; -+ } - -- if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_OFFCHAN])) -- return cfg80211_start_offchan_radar_detection(rdev, wdev, -- &chandef); -+ if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_OFFCHAN])) { -+ err = cfg80211_start_offchan_radar_detection(rdev, wdev, -+ &chandef); -+ goto unlock; -+ } - -- if (netif_carrier_ok(dev)) -- return -EBUSY; -+ if (netif_carrier_ok(dev)) { -+ err = -EBUSY; -+ goto unlock; -+ } - -- if (wdev->cac_started) -- return -EBUSY; -+ if (wdev->cac_started) { -+ err = -EBUSY; -+ goto unlock; -+ } - - /* CAC start is offloaded to HW and can't be started manually */ -- if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) -- return -EOPNOTSUPP; -+ if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) { -+ err = -EOPNOTSUPP; -+ goto unlock; -+ } - -- if (!rdev->ops->start_radar_detection) -- return -EOPNOTSUPP; -+ if (!rdev->ops->start_radar_detection) { -+ err = -EOPNOTSUPP; -+ goto unlock; -+ } - - cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); - if (WARN_ON(!cac_time_ms)) -@@ -9326,6 +9344,9 @@ static int nl80211_start_radar_detection - wdev->cac_start_time = jiffies; - wdev->cac_time_ms = cac_time_ms; - } -+unlock: -+ wiphy_unlock(wiphy); -+ - return err; - } - -@@ -15961,7 +15982,8 @@ static const struct genl_small_ops nl802 - .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, - .doit = nl80211_start_radar_detection, - .flags = GENL_UNS_ADMIN_PERM, -- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP, -+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | -+ NL80211_FLAG_NO_WIPHY_MTX, - }, - { - .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, diff --git a/package/kernel/mac80211/patches/subsys/318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch b/package/kernel/mac80211/patches/subsys/318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch new file mode 100644 index 0000000000..7d01ffdfff --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch @@ -0,0 +1,37 @@ +From: Felix Fietkau +Date: Wed, 15 Feb 2023 15:21:37 +0100 +Subject: [PATCH] wifi: mac80211: fix race in mesh sequence number + assignment + +Since the sequence number is shared across different tx queues, it needs +to be atomic in order to avoid accidental duplicate assignment + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -696,7 +696,7 @@ struct ieee80211_if_mesh { + struct mesh_stats mshstats; + struct mesh_config mshcfg; + atomic_t estab_plinks; +- u32 mesh_seqnum; ++ atomic_t mesh_seqnum; + bool accepting_plinks; + int num_gates; + struct beacon_data __rcu *beacon; +--- a/net/mac80211/mesh.c ++++ b/net/mac80211/mesh.c +@@ -752,10 +752,8 @@ unsigned int ieee80211_new_mesh_header(s + + meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL; + +- /* FIXME: racy -- TX on multiple queues can be concurrent */ +- put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum); +- sdata->u.mesh.mesh_seqnum++; +- ++ put_unaligned_le32(atomic_inc_return(&sdata->u.mesh.mesh_seqnum), ++ &meshhdr->seqnum); + if (addr4or5 && !addr6) { + meshhdr->flags |= MESH_FLAGS_AE_A4; + memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN); diff --git a/package/kernel/mac80211/patches/subsys/319-mac80211-introduce-set_radar_offchan-callback.patch b/package/kernel/mac80211/patches/subsys/319-mac80211-introduce-set_radar_offchan-callback.patch deleted file mode 100644 index 6197abda56..0000000000 --- a/package/kernel/mac80211/patches/subsys/319-mac80211-introduce-set_radar_offchan-callback.patch +++ /dev/null @@ -1,67 +0,0 @@ -From: Lorenzo Bianconi -Date: Sat, 23 Oct 2021 11:10:51 +0200 -Subject: [PATCH] mac80211: introduce set_radar_offchan callback - -Similar to cfg80211, introduce set_radar_offchan callback in mac80211_ops -in order to configure a dedicated offchannel chain available on some hw -(e.g. mt7915) to perform offchannel CAC detection and avoid tx/rx downtime. - -Tested-by: Evelyn Tsai -Signed-off-by: Lorenzo Bianconi -Link: https://lore.kernel.org/r/201110606d4f3a7dfdf31440e351f2e2c375d4f0.1634979655.git.lorenzo@kernel.org -Signed-off-by: Johannes Berg ---- - ---- a/include/net/mac80211.h -+++ b/include/net/mac80211.h -@@ -3937,6 +3937,14 @@ struct ieee80211_prep_tx_info { - * twt structure. - * @twt_teardown_request: Update the hw with TWT teardown request received - * from the peer. -+ * @set_radar_offchan: Configure dedicated offchannel chain available for -+ * radar/CAC detection on some hw. This chain can't be used to transmit -+ * or receive frames and it is bounded to a running wdev. -+ * Offchannel radar/CAC detection allows to avoid the CAC downtime -+ * switching to a different channel during CAC detection on the selected -+ * radar channel. -+ * The caller is expected to set chandef pointer to NULL in order to -+ * disable offchannel CAC/radar detection. - * @net_fill_forward_path: Called from .ndo_fill_forward_path in order to - * resolve a path for hardware flow offloading - */ -@@ -4267,6 +4275,8 @@ struct ieee80211_ops { - struct ieee80211_twt_setup *twt); - void (*twt_teardown_request)(struct ieee80211_hw *hw, - struct ieee80211_sta *sta, u8 flowid); -+ int (*set_radar_offchan)(struct ieee80211_hw *hw, -+ struct cfg80211_chan_def *chandef); - #if LINUX_VERSION_IS_GEQ(5,10,0) - int (*net_fill_forward_path)(struct ieee80211_hw *hw, - struct ieee80211_vif *vif, ---- a/net/mac80211/cfg.c -+++ b/net/mac80211/cfg.c -@@ -4341,6 +4341,18 @@ out: - return err; - } - -+static int -+ieee80211_set_radar_offchan(struct wiphy *wiphy, -+ struct cfg80211_chan_def *chandef) -+{ -+ struct ieee80211_local *local = wiphy_priv(wiphy); -+ -+ if (!local->ops->set_radar_offchan) -+ return -EOPNOTSUPP; -+ -+ return local->ops->set_radar_offchan(&local->hw, chandef); -+} -+ - const struct cfg80211_ops mac80211_config_ops = { - .add_virtual_intf = ieee80211_add_iface, - .del_virtual_intf = ieee80211_del_iface, -@@ -4445,4 +4457,5 @@ const struct cfg80211_ops mac80211_confi - .reset_tid_config = ieee80211_reset_tid_config, - .set_sar_specs = ieee80211_set_sar_specs, - .color_change = ieee80211_color_change, -+ .set_radar_offchan = ieee80211_set_radar_offchan, - }; diff --git a/package/kernel/mac80211/patches/subsys/319-wifi-mac80211-mesh-fast-xmit-support.patch b/package/kernel/mac80211/patches/subsys/319-wifi-mac80211-mesh-fast-xmit-support.patch new file mode 100644 index 0000000000..968d2885f2 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/319-wifi-mac80211-mesh-fast-xmit-support.patch @@ -0,0 +1,850 @@ +From: Felix Fietkau +Date: Sun, 26 Feb 2023 13:53:08 +0100 +Subject: [PATCH] wifi: mac80211: mesh fast xmit support + +Previously, fast xmit only worked on interface types where initially a +sta lookup is performed, and a cached header can be attached to the sta, +requiring only some fields to be updated at runtime. + +This technique is not directly applicable for a mesh device type due +to the dynamic nature of the topology and protocol. There are more +addresses that need to be filled, and there is an extra header with a +dynamic length based on the addressing mode. + +Change the code to cache entries contain a copy of the mesh subframe header + +bridge tunnel header, as well as an embedded struct ieee80211_fast_tx, which +contains the information for building the 802.11 header. + +Add a mesh specific early fast xmit call, which looks up a cached entry and +adds only the mesh subframe header, before passing it over to the generic +fast xmit code. + +To ensure the changes in network are reflected in these cached headers, +flush affected cached entries on path changes, as well as other conditions +that currently trigger a fast xmit check in other modes (key changes etc.) + +This code is loosely based on a previous implementation by: +Sriram R + +Signed-off-by: Ryder Lee +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -37,6 +37,7 @@ + extern const struct cfg80211_ops mac80211_config_ops; + + struct ieee80211_local; ++struct ieee80211_mesh_fast_tx; + + /* Maximum number of broadcast/multicast frames to buffer when some of the + * associated stations are using power saving. */ +@@ -656,6 +657,19 @@ struct mesh_table { + atomic_t entries; /* Up to MAX_MESH_NEIGHBOURS */ + }; + ++/** ++ * struct mesh_tx_cache - mesh fast xmit header cache ++ * ++ * @rht: hash table containing struct ieee80211_mesh_fast_tx, using skb DA as key ++ * @walk_head: linked list containing all ieee80211_mesh_fast_tx objects ++ * @walk_lock: lock protecting walk_head and rht ++ */ ++struct mesh_tx_cache { ++ struct rhashtable rht; ++ struct hlist_head walk_head; ++ spinlock_t walk_lock; ++}; ++ + struct ieee80211_if_mesh { + struct timer_list housekeeping_timer; + struct timer_list mesh_path_timer; +@@ -734,6 +748,7 @@ struct ieee80211_if_mesh { + struct mesh_table mpp_paths; /* Store paths for MPP&MAP */ + int mesh_paths_generation; + int mpp_paths_generation; ++ struct mesh_tx_cache tx_cache; + }; + + #ifdef CPTCFG_MAC80211_MESH +@@ -2002,6 +2017,11 @@ int ieee80211_tx_control_port(struct wip + int link_id, u64 *cookie); + int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev, + const u8 *buf, size_t len); ++void __ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, ++ struct sta_info *sta, ++ struct ieee80211_fast_tx *fast_tx, ++ struct sk_buff *skb, bool ampdu, ++ const u8 *da, const u8 *sa); + + /* HT */ + void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, +--- a/net/mac80211/mesh.c ++++ b/net/mac80211/mesh.c +@@ -10,6 +10,7 @@ + #include + #include "ieee80211_i.h" + #include "mesh.h" ++#include "wme.h" + #include "driver-ops.h" + + static int mesh_allocated; +@@ -698,6 +699,95 @@ ieee80211_mesh_update_bss_params(struct + __le32_to_cpu(he_oper->he_oper_params); + } + ++bool ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata, ++ struct sk_buff *skb, u32 ctrl_flags) ++{ ++ struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; ++ struct ieee80211_mesh_fast_tx *entry; ++ struct ieee80211s_hdr *meshhdr; ++ u8 sa[ETH_ALEN] __aligned(2); ++ struct tid_ampdu_tx *tid_tx; ++ struct sta_info *sta; ++ bool copy_sa = false; ++ u16 ethertype; ++ u8 tid; ++ ++ if (ctrl_flags & IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP) ++ return false; ++ ++ if (ifmsh->mshcfg.dot11MeshNolearn) ++ return false; ++ ++ /* Add support for these cases later */ ++ if (ifmsh->ps_peers_light_sleep || ifmsh->ps_peers_deep_sleep) ++ return false; ++ ++ if (is_multicast_ether_addr(skb->data)) ++ return false; ++ ++ ethertype = (skb->data[12] << 8) | skb->data[13]; ++ if (ethertype < ETH_P_802_3_MIN) ++ return false; ++ ++ if (skb->sk && skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS) ++ return false; ++ ++ if (skb->ip_summed == CHECKSUM_PARTIAL) { ++ skb_set_transport_header(skb, skb_checksum_start_offset(skb)); ++ if (skb_checksum_help(skb)) ++ return false; ++ } ++ ++ entry = mesh_fast_tx_get(sdata, skb->data); ++ if (!entry) ++ return false; ++ ++ if (skb_headroom(skb) < entry->hdrlen + entry->fast_tx.hdr_len) ++ return false; ++ ++ sta = rcu_dereference(entry->mpath->next_hop); ++ if (!sta) ++ return false; ++ ++ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; ++ tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]); ++ if (tid_tx) { ++ if (!test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) ++ return false; ++ if (tid_tx->timeout) ++ tid_tx->last_tx = jiffies; ++ } ++ ++ skb = skb_share_check(skb, GFP_ATOMIC); ++ if (!skb) ++ return true; ++ ++ skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb)); ++ ++ meshhdr = (struct ieee80211s_hdr *)entry->hdr; ++ if ((meshhdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6) { ++ /* preserve SA from eth header for 6-addr frames */ ++ ether_addr_copy(sa, skb->data + ETH_ALEN); ++ copy_sa = true; ++ } ++ ++ memcpy(skb_push(skb, entry->hdrlen - 2 * ETH_ALEN), entry->hdr, ++ entry->hdrlen); ++ ++ meshhdr = (struct ieee80211s_hdr *)skb->data; ++ put_unaligned_le32(atomic_inc_return(&sdata->u.mesh.mesh_seqnum), ++ &meshhdr->seqnum); ++ meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL; ++ if (copy_sa) ++ ether_addr_copy(meshhdr->eaddr2, sa); ++ ++ skb_push(skb, 2 * ETH_ALEN); ++ __ieee80211_xmit_fast(sdata, sta, &entry->fast_tx, skb, tid_tx, ++ entry->mpath->dst, sdata->vif.addr); ++ ++ return true; ++} ++ + /** + * ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame + * @hdr: 802.11 frame header +@@ -780,6 +870,8 @@ static void ieee80211_mesh_housekeeping( + changed = mesh_accept_plinks_update(sdata); + ieee80211_mbss_info_change_notify(sdata, changed); + ++ mesh_fast_tx_gc(sdata); ++ + mod_timer(&ifmsh->housekeeping_timer, + round_jiffies(jiffies + + IEEE80211_MESH_HOUSEKEEPING_INTERVAL)); +--- a/net/mac80211/mesh.h ++++ b/net/mac80211/mesh.h +@@ -122,11 +122,41 @@ struct mesh_path { + u8 rann_snd_addr[ETH_ALEN]; + u32 rann_metric; + unsigned long last_preq_to_root; ++ unsigned long fast_tx_check; + bool is_root; + bool is_gate; + u32 path_change_count; + }; + ++#define MESH_FAST_TX_CACHE_MAX_SIZE 512 ++#define MESH_FAST_TX_CACHE_THRESHOLD_SIZE 384 ++#define MESH_FAST_TX_CACHE_TIMEOUT 8000 /* msecs */ ++ ++/** ++ * struct ieee80211_mesh_fast_tx - cached mesh fast tx entry ++ * @rhash: rhashtable pointer ++ * @addr_key: The Ethernet DA which is the key for this entry ++ * @fast_tx: base fast_tx data ++ * @hdr: cached mesh and rfc1042 headers ++ * @hdrlen: length of mesh + rfc1042 ++ * @walk_list: list containing all the fast tx entries ++ * @mpath: mesh path corresponding to the Mesh DA ++ * @mppath: MPP entry corresponding to this DA ++ * @timestamp: Last used time of this entry ++ */ ++struct ieee80211_mesh_fast_tx { ++ struct rhash_head rhash; ++ u8 addr_key[ETH_ALEN] __aligned(2); ++ ++ struct ieee80211_fast_tx fast_tx; ++ u8 hdr[sizeof(struct ieee80211s_hdr) + sizeof(rfc1042_header)]; ++ u16 hdrlen; ++ ++ struct mesh_path *mpath, *mppath; ++ struct hlist_node walk_list; ++ unsigned long timestamp; ++}; ++ + /* Recent multicast cache */ + /* RMC_BUCKETS must be a power of 2, maximum 256 */ + #define RMC_BUCKETS 256 +@@ -298,6 +328,20 @@ void mesh_path_discard_frame(struct ieee + void mesh_path_tx_root_frame(struct ieee80211_sub_if_data *sdata); + + bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt); ++struct ieee80211_mesh_fast_tx * ++mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata, const u8 *addr); ++bool ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata, ++ struct sk_buff *skb, u32 ctrl_flags); ++void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata, ++ struct sk_buff *skb, struct mesh_path *mpath); ++void mesh_fast_tx_gc(struct ieee80211_sub_if_data *sdata); ++void mesh_fast_tx_flush_addr(struct ieee80211_sub_if_data *sdata, ++ const u8 *addr); ++void mesh_fast_tx_flush_mpath(struct mesh_path *mpath); ++void mesh_fast_tx_flush_sta(struct ieee80211_sub_if_data *sdata, ++ struct sta_info *sta); ++void mesh_path_refresh(struct ieee80211_sub_if_data *sdata, ++ struct mesh_path *mpath, const u8 *addr); + + #ifdef CPTCFG_MAC80211_MESH + static inline +--- a/net/mac80211/mesh_hwmp.c ++++ b/net/mac80211/mesh_hwmp.c +@@ -394,6 +394,7 @@ static u32 hwmp_route_info_get(struct ie + u32 orig_sn, orig_metric; + unsigned long orig_lifetime, exp_time; + u32 last_hop_metric, new_metric; ++ bool flush_mpath = false; + bool process = true; + u8 hopcount; + +@@ -491,8 +492,10 @@ static u32 hwmp_route_info_get(struct ie + } + + if (fresh_info) { +- if (rcu_access_pointer(mpath->next_hop) != sta) ++ if (rcu_access_pointer(mpath->next_hop) != sta) { + mpath->path_change_count++; ++ flush_mpath = true; ++ } + mesh_path_assign_nexthop(mpath, sta); + mpath->flags |= MESH_PATH_SN_VALID; + mpath->metric = new_metric; +@@ -502,6 +505,8 @@ static u32 hwmp_route_info_get(struct ie + mpath->hop_count = hopcount; + mesh_path_activate(mpath); + spin_unlock_bh(&mpath->state_lock); ++ if (flush_mpath) ++ mesh_fast_tx_flush_mpath(mpath); + ewma_mesh_fail_avg_init(&sta->mesh->fail_avg); + /* init it at a low value - 0 start is tricky */ + ewma_mesh_fail_avg_add(&sta->mesh->fail_avg, 1); +@@ -539,8 +544,10 @@ static u32 hwmp_route_info_get(struct ie + } + + if (fresh_info) { +- if (rcu_access_pointer(mpath->next_hop) != sta) ++ if (rcu_access_pointer(mpath->next_hop) != sta) { + mpath->path_change_count++; ++ flush_mpath = true; ++ } + mesh_path_assign_nexthop(mpath, sta); + mpath->metric = last_hop_metric; + mpath->exp_time = time_after(mpath->exp_time, exp_time) +@@ -548,6 +555,8 @@ static u32 hwmp_route_info_get(struct ie + mpath->hop_count = 1; + mesh_path_activate(mpath); + spin_unlock_bh(&mpath->state_lock); ++ if (flush_mpath) ++ mesh_fast_tx_flush_mpath(mpath); + ewma_mesh_fail_avg_init(&sta->mesh->fail_avg); + /* init it at a low value - 0 start is tricky */ + ewma_mesh_fail_avg_add(&sta->mesh->fail_avg, 1); +@@ -1215,6 +1224,20 @@ static int mesh_nexthop_lookup_nolearn(s + return 0; + } + ++void mesh_path_refresh(struct ieee80211_sub_if_data *sdata, ++ struct mesh_path *mpath, const u8 *addr) ++{ ++ if (mpath->flags & (MESH_PATH_REQ_QUEUED | MESH_PATH_FIXED | ++ MESH_PATH_RESOLVING)) ++ return; ++ ++ if (time_after(jiffies, ++ mpath->exp_time - ++ msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) && ++ (!addr || ether_addr_equal(sdata->vif.addr, addr))) ++ mesh_queue_preq(mpath, PREQ_Q_F_START | PREQ_Q_F_REFRESH); ++} ++ + /** + * mesh_nexthop_lookup - put the appropriate next hop on a mesh frame. Calling + * this function is considered "using" the associated mpath, so preempt a path +@@ -1242,19 +1265,15 @@ int mesh_nexthop_lookup(struct ieee80211 + if (!mpath || !(mpath->flags & MESH_PATH_ACTIVE)) + return -ENOENT; + +- if (time_after(jiffies, +- mpath->exp_time - +- msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) && +- ether_addr_equal(sdata->vif.addr, hdr->addr4) && +- !(mpath->flags & MESH_PATH_RESOLVING) && +- !(mpath->flags & MESH_PATH_FIXED)) +- mesh_queue_preq(mpath, PREQ_Q_F_START | PREQ_Q_F_REFRESH); ++ mesh_path_refresh(sdata, mpath, hdr->addr4); + + next_hop = rcu_dereference(mpath->next_hop); + if (next_hop) { + memcpy(hdr->addr1, next_hop->sta.addr, ETH_ALEN); + memcpy(hdr->addr2, sdata->vif.addr, ETH_ALEN); + ieee80211_mps_set_frame_flags(sdata, next_hop, hdr); ++ if (ieee80211_hw_check(&sdata->local->hw, SUPPORT_FAST_XMIT)) ++ mesh_fast_tx_cache(sdata, skb, mpath); + return 0; + } + +--- a/net/mac80211/mesh_pathtbl.c ++++ b/net/mac80211/mesh_pathtbl.c +@@ -14,6 +14,7 @@ + #include "wme.h" + #include "ieee80211_i.h" + #include "mesh.h" ++#include + + static void mesh_path_free_rcu(struct mesh_table *tbl, struct mesh_path *mpath); + +@@ -32,6 +33,41 @@ static const struct rhashtable_params me + .hashfn = mesh_table_hash, + }; + ++static const struct rhashtable_params fast_tx_rht_params = { ++ .nelem_hint = 10, ++ .automatic_shrinking = true, ++ .key_len = ETH_ALEN, ++ .key_offset = offsetof(struct ieee80211_mesh_fast_tx, addr_key), ++ .head_offset = offsetof(struct ieee80211_mesh_fast_tx, rhash), ++ .hashfn = mesh_table_hash, ++}; ++ ++static void __mesh_fast_tx_entry_free(void *ptr, void *tblptr) ++{ ++ struct ieee80211_mesh_fast_tx *entry = ptr; ++ ++ kfree_rcu(entry, fast_tx.rcu_head); ++} ++ ++static void mesh_fast_tx_deinit(struct ieee80211_sub_if_data *sdata) ++{ ++ struct mesh_tx_cache *cache; ++ ++ cache = &sdata->u.mesh.tx_cache; ++ rhashtable_free_and_destroy(&cache->rht, ++ __mesh_fast_tx_entry_free, NULL); ++} ++ ++static void mesh_fast_tx_init(struct ieee80211_sub_if_data *sdata) ++{ ++ struct mesh_tx_cache *cache; ++ ++ cache = &sdata->u.mesh.tx_cache; ++ rhashtable_init(&cache->rht, &fast_tx_rht_params); ++ INIT_HLIST_HEAD(&cache->walk_head); ++ spin_lock_init(&cache->walk_lock); ++} ++ + static inline bool mpath_expired(struct mesh_path *mpath) + { + return (mpath->flags & MESH_PATH_ACTIVE) && +@@ -381,6 +417,243 @@ struct mesh_path *mesh_path_new(struct i + return new_mpath; + } + ++static void mesh_fast_tx_entry_free(struct mesh_tx_cache *cache, ++ struct ieee80211_mesh_fast_tx *entry) ++{ ++ hlist_del_rcu(&entry->walk_list); ++ rhashtable_remove_fast(&cache->rht, &entry->rhash, fast_tx_rht_params); ++ kfree_rcu(entry, fast_tx.rcu_head); ++} ++ ++struct ieee80211_mesh_fast_tx * ++mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata, const u8 *addr) ++{ ++ struct ieee80211_mesh_fast_tx *entry; ++ struct mesh_tx_cache *cache; ++ ++ cache = &sdata->u.mesh.tx_cache; ++ entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params); ++ if (!entry) ++ return NULL; ++ ++ if (!(entry->mpath->flags & MESH_PATH_ACTIVE) || ++ mpath_expired(entry->mpath)) { ++ spin_lock_bh(&cache->walk_lock); ++ entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params); ++ if (entry) ++ mesh_fast_tx_entry_free(cache, entry); ++ spin_unlock_bh(&cache->walk_lock); ++ return NULL; ++ } ++ ++ mesh_path_refresh(sdata, entry->mpath, NULL); ++ if (entry->mppath) ++ entry->mppath->exp_time = jiffies; ++ entry->timestamp = jiffies; ++ ++ return entry; ++} ++ ++void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata, ++ struct sk_buff *skb, struct mesh_path *mpath) ++{ ++ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ struct ieee80211_mesh_fast_tx *entry, *prev; ++ struct ieee80211_mesh_fast_tx build = {}; ++ struct ieee80211s_hdr *meshhdr; ++ struct mesh_tx_cache *cache; ++ struct ieee80211_key *key; ++ struct mesh_path *mppath; ++ struct sta_info *sta; ++ u8 *qc; ++ ++ if (sdata->noack_map || ++ !ieee80211_is_data_qos(hdr->frame_control)) ++ return; ++ ++ build.fast_tx.hdr_len = ieee80211_hdrlen(hdr->frame_control); ++ meshhdr = (struct ieee80211s_hdr *)(skb->data + build.fast_tx.hdr_len); ++ build.hdrlen = ieee80211_get_mesh_hdrlen(meshhdr); ++ ++ cache = &sdata->u.mesh.tx_cache; ++ if (atomic_read(&cache->rht.nelems) >= MESH_FAST_TX_CACHE_MAX_SIZE) ++ return; ++ ++ sta = rcu_dereference(mpath->next_hop); ++ if (!sta) ++ return; ++ ++ if ((meshhdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6) { ++ /* This is required to keep the mppath alive */ ++ mppath = mpp_path_lookup(sdata, meshhdr->eaddr1); ++ if (!mppath) ++ return; ++ build.mppath = mppath; ++ } else if (ieee80211_has_a4(hdr->frame_control)) { ++ mppath = mpath; ++ } else { ++ return; ++ } ++ ++ /* rate limit, in case fast xmit can't be enabled */ ++ if (mppath->fast_tx_check == jiffies) ++ return; ++ ++ mppath->fast_tx_check = jiffies; ++ ++ /* ++ * Same use of the sta lock as in ieee80211_check_fast_xmit, in order ++ * to protect against concurrent sta key updates. ++ */ ++ spin_lock_bh(&sta->lock); ++ key = rcu_access_pointer(sta->ptk[sta->ptk_idx]); ++ if (!key) ++ key = rcu_access_pointer(sdata->default_unicast_key); ++ build.fast_tx.key = key; ++ ++ if (key) { ++ bool gen_iv, iv_spc; ++ ++ gen_iv = key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV; ++ iv_spc = key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE; ++ ++ if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) || ++ (key->flags & KEY_FLAG_TAINTED)) ++ goto unlock_sta; ++ ++ switch (key->conf.cipher) { ++ case WLAN_CIPHER_SUITE_CCMP: ++ case WLAN_CIPHER_SUITE_CCMP_256: ++ if (gen_iv) ++ build.fast_tx.pn_offs = build.fast_tx.hdr_len; ++ if (gen_iv || iv_spc) ++ build.fast_tx.hdr_len += IEEE80211_CCMP_HDR_LEN; ++ break; ++ case WLAN_CIPHER_SUITE_GCMP: ++ case WLAN_CIPHER_SUITE_GCMP_256: ++ if (gen_iv) ++ build.fast_tx.pn_offs = build.fast_tx.hdr_len; ++ if (gen_iv || iv_spc) ++ build.fast_tx.hdr_len += IEEE80211_GCMP_HDR_LEN; ++ break; ++ default: ++ goto unlock_sta; ++ } ++ } ++ ++ memcpy(build.addr_key, mppath->dst, ETH_ALEN); ++ build.timestamp = jiffies; ++ build.fast_tx.band = info->band; ++ build.fast_tx.da_offs = offsetof(struct ieee80211_hdr, addr3); ++ build.fast_tx.sa_offs = offsetof(struct ieee80211_hdr, addr4); ++ build.mpath = mpath; ++ memcpy(build.hdr, meshhdr, build.hdrlen); ++ memcpy(build.hdr + build.hdrlen, rfc1042_header, sizeof(rfc1042_header)); ++ build.hdrlen += sizeof(rfc1042_header); ++ memcpy(build.fast_tx.hdr, hdr, build.fast_tx.hdr_len); ++ ++ hdr = (struct ieee80211_hdr *)build.fast_tx.hdr; ++ if (build.fast_tx.key) ++ hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); ++ ++ qc = ieee80211_get_qos_ctl(hdr); ++ qc[1] |= IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT >> 8; ++ ++ entry = kmemdup(&build, sizeof(build), GFP_ATOMIC); ++ if (!entry) ++ goto unlock_sta; ++ ++ spin_lock(&cache->walk_lock); ++ prev = rhashtable_lookup_get_insert_fast(&cache->rht, ++ &entry->rhash, ++ fast_tx_rht_params); ++ if (unlikely(IS_ERR(prev))) { ++ kfree(entry); ++ goto unlock_cache; ++ } ++ ++ /* ++ * replace any previous entry in the hash table, in case we're ++ * replacing it with a different type (e.g. mpath -> mpp) ++ */ ++ if (unlikely(prev)) { ++ rhashtable_replace_fast(&cache->rht, &prev->rhash, ++ &entry->rhash, fast_tx_rht_params); ++ hlist_del_rcu(&prev->walk_list); ++ kfree_rcu(prev, fast_tx.rcu_head); ++ } ++ ++ hlist_add_head(&entry->walk_list, &cache->walk_head); ++ ++unlock_cache: ++ spin_unlock(&cache->walk_lock); ++unlock_sta: ++ spin_unlock_bh(&sta->lock); ++} ++ ++void mesh_fast_tx_gc(struct ieee80211_sub_if_data *sdata) ++{ ++ unsigned long timeout = msecs_to_jiffies(MESH_FAST_TX_CACHE_TIMEOUT); ++ struct mesh_tx_cache *cache; ++ struct ieee80211_mesh_fast_tx *entry; ++ struct hlist_node *n; ++ ++ cache = &sdata->u.mesh.tx_cache; ++ if (atomic_read(&cache->rht.nelems) < MESH_FAST_TX_CACHE_THRESHOLD_SIZE) ++ return; ++ ++ spin_lock_bh(&cache->walk_lock); ++ hlist_for_each_entry_safe(entry, n, &cache->walk_head, walk_list) ++ if (!time_is_after_jiffies(entry->timestamp + timeout)) ++ mesh_fast_tx_entry_free(cache, entry); ++ spin_unlock_bh(&cache->walk_lock); ++} ++ ++void mesh_fast_tx_flush_mpath(struct mesh_path *mpath) ++{ ++ struct ieee80211_sub_if_data *sdata = mpath->sdata; ++ struct mesh_tx_cache *cache = &sdata->u.mesh.tx_cache; ++ struct ieee80211_mesh_fast_tx *entry; ++ struct hlist_node *n; ++ ++ cache = &sdata->u.mesh.tx_cache; ++ spin_lock_bh(&cache->walk_lock); ++ hlist_for_each_entry_safe(entry, n, &cache->walk_head, walk_list) ++ if (entry->mpath == mpath) ++ mesh_fast_tx_entry_free(cache, entry); ++ spin_unlock_bh(&cache->walk_lock); ++} ++ ++void mesh_fast_tx_flush_sta(struct ieee80211_sub_if_data *sdata, ++ struct sta_info *sta) ++{ ++ struct mesh_tx_cache *cache = &sdata->u.mesh.tx_cache; ++ struct ieee80211_mesh_fast_tx *entry; ++ struct hlist_node *n; ++ ++ cache = &sdata->u.mesh.tx_cache; ++ spin_lock_bh(&cache->walk_lock); ++ hlist_for_each_entry_safe(entry, n, &cache->walk_head, walk_list) ++ if (rcu_access_pointer(entry->mpath->next_hop) == sta) ++ mesh_fast_tx_entry_free(cache, entry); ++ spin_unlock_bh(&cache->walk_lock); ++} ++ ++void mesh_fast_tx_flush_addr(struct ieee80211_sub_if_data *sdata, ++ const u8 *addr) ++{ ++ struct mesh_tx_cache *cache = &sdata->u.mesh.tx_cache; ++ struct ieee80211_mesh_fast_tx *entry; ++ ++ cache = &sdata->u.mesh.tx_cache; ++ spin_lock_bh(&cache->walk_lock); ++ entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params); ++ if (entry) ++ mesh_fast_tx_entry_free(cache, entry); ++ spin_unlock_bh(&cache->walk_lock); ++} ++ + /** + * mesh_path_add - allocate and add a new path to the mesh path table + * @dst: destination address of the path (ETH_ALEN length) +@@ -464,6 +737,8 @@ int mpp_path_add(struct ieee80211_sub_if + + if (ret) + kfree(new_mpath); ++ else ++ mesh_fast_tx_flush_addr(sdata, dst); + + sdata->u.mesh.mpp_paths_generation++; + return ret; +@@ -523,6 +798,10 @@ static void __mesh_path_del(struct mesh_ + { + hlist_del_rcu(&mpath->walk_list); + rhashtable_remove_fast(&tbl->rhead, &mpath->rhash, mesh_rht_params); ++ if (tbl == &mpath->sdata->u.mesh.mpp_paths) ++ mesh_fast_tx_flush_addr(mpath->sdata, mpath->dst); ++ else ++ mesh_fast_tx_flush_mpath(mpath); + mesh_path_free_rcu(tbl, mpath); + } + +@@ -747,6 +1026,7 @@ void mesh_path_fix_nexthop(struct mesh_p + mpath->exp_time = 0; + mpath->flags = MESH_PATH_FIXED | MESH_PATH_SN_VALID; + mesh_path_activate(mpath); ++ mesh_fast_tx_flush_mpath(mpath); + spin_unlock_bh(&mpath->state_lock); + ewma_mesh_fail_avg_init(&next_hop->mesh->fail_avg); + /* init it at a low value - 0 start is tricky */ +@@ -758,6 +1038,7 @@ void mesh_pathtbl_init(struct ieee80211_ + { + mesh_table_init(&sdata->u.mesh.mesh_paths); + mesh_table_init(&sdata->u.mesh.mpp_paths); ++ mesh_fast_tx_init(sdata); + } + + static +@@ -785,6 +1066,7 @@ void mesh_path_expire(struct ieee80211_s + + void mesh_pathtbl_unregister(struct ieee80211_sub_if_data *sdata) + { ++ mesh_fast_tx_deinit(sdata); + mesh_table_free(&sdata->u.mesh.mesh_paths); + mesh_table_free(&sdata->u.mesh.mpp_paths); + } +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2791,6 +2791,7 @@ ieee80211_rx_mesh_data(struct ieee80211_ + if (mesh_hdr->flags & MESH_FLAGS_AE) { + struct mesh_path *mppath; + char *proxied_addr; ++ bool update = false; + + if (multicast) + proxied_addr = mesh_hdr->eaddr1; +@@ -2806,11 +2807,18 @@ ieee80211_rx_mesh_data(struct ieee80211_ + mpp_path_add(sdata, proxied_addr, eth->h_source); + } else { + spin_lock_bh(&mppath->state_lock); +- if (!ether_addr_equal(mppath->mpp, eth->h_source)) ++ if (!ether_addr_equal(mppath->mpp, eth->h_source)) { + memcpy(mppath->mpp, eth->h_source, ETH_ALEN); ++ update = true; ++ } + mppath->exp_time = jiffies; + spin_unlock_bh(&mppath->state_lock); + } ++ ++ /* flush fast xmit cache if the address path changed */ ++ if (update) ++ mesh_fast_tx_flush_addr(sdata, proxied_addr); ++ + rcu_read_unlock(); + } + +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -3022,6 +3022,9 @@ void ieee80211_check_fast_xmit(struct st + if (!ieee80211_hw_check(&local->hw, SUPPORT_FAST_XMIT)) + return; + ++ if (ieee80211_vif_is_mesh(&sdata->vif)) ++ mesh_fast_tx_flush_sta(sdata, sta); ++ + /* Locking here protects both the pointer itself, and against concurrent + * invocations winning data access races to, e.g., the key pointer that + * is used. +@@ -3403,6 +3406,9 @@ static bool ieee80211_amsdu_aggregate(st + if (sdata->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) + return false; + ++ if (ieee80211_vif_is_mesh(&sdata->vif)) ++ return false; ++ + if (skb_is_gso(skb)) + return false; + +@@ -3635,10 +3641,11 @@ free: + return NULL; + } + +-static void __ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, +- struct sta_info *sta, +- struct ieee80211_fast_tx *fast_tx, +- struct sk_buff *skb, u8 tid, bool ampdu) ++void __ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, ++ struct sta_info *sta, ++ struct ieee80211_fast_tx *fast_tx, ++ struct sk_buff *skb, bool ampdu, ++ const u8 *da, const u8 *sa) + { + struct ieee80211_local *local = sdata->local; + struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; +@@ -3647,7 +3654,6 @@ static void __ieee80211_xmit_fast(struct + ieee80211_tx_result r; + int hw_headroom = sdata->local->hw.extra_tx_headroom; + int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2); +- struct ethhdr eth; + + skb = skb_share_check(skb, GFP_ATOMIC); + if (unlikely(!skb)) +@@ -3667,11 +3673,10 @@ static void __ieee80211_xmit_fast(struct + ENCRYPT_NO))) + goto free; + +- memcpy(ð, skb->data, ETH_HLEN - 2); + hdr = skb_push(skb, extra_head); + memcpy(skb->data, fast_tx->hdr, fast_tx->hdr_len); +- memcpy(skb->data + fast_tx->da_offs, eth.h_dest, ETH_ALEN); +- memcpy(skb->data + fast_tx->sa_offs, eth.h_source, ETH_ALEN); ++ memcpy(skb->data + fast_tx->da_offs, da, ETH_ALEN); ++ memcpy(skb->data + fast_tx->sa_offs, sa, ETH_ALEN); + + info = IEEE80211_SKB_CB(skb); + memset(info, 0, sizeof(*info)); +@@ -3690,7 +3695,8 @@ static void __ieee80211_xmit_fast(struct + #endif + + if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { +- tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; ++ u8 tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; ++ + *ieee80211_get_qos_ctl(hdr) = tid; + } + +@@ -3733,6 +3739,7 @@ static bool ieee80211_xmit_fast(struct i + struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; + struct tid_ampdu_tx *tid_tx = NULL; + struct sk_buff *next; ++ struct ethhdr eth; + u8 tid = IEEE80211_NUM_TIDS; + + /* control port protocol needs a lot of special handling */ +@@ -3758,6 +3765,8 @@ static bool ieee80211_xmit_fast(struct i + } + } + ++ memcpy(ð, skb->data, ETH_HLEN - 2); ++ + /* after this point (skb is modified) we cannot return false */ + skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata)); + if (!skb) +@@ -3765,7 +3774,8 @@ static bool ieee80211_xmit_fast(struct i + + skb_list_walk_safe(skb, skb, next) { + skb_mark_not_on_list(skb); +- __ieee80211_xmit_fast(sdata, sta, fast_tx, skb, tid, tid_tx); ++ __ieee80211_xmit_fast(sdata, sta, fast_tx, skb, tid_tx, ++ eth.h_dest, eth.h_source); + } + + return true; +@@ -4252,8 +4262,15 @@ void __ieee80211_subif_start_xmit(struct + return; + } + ++ sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift); ++ + rcu_read_lock(); + ++ if (ieee80211_vif_is_mesh(&sdata->vif) && ++ ieee80211_hw_check(&local->hw, SUPPORT_FAST_XMIT) && ++ ieee80211_mesh_xmit_fast(sdata, skb, ctrl_flags)) ++ goto out; ++ + if (ieee80211_lookup_ra_sta(sdata, skb, &sta)) + goto out_free; + +@@ -4263,8 +4280,6 @@ void __ieee80211_subif_start_xmit(struct + skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb)); + ieee80211_aggr_check(sdata, sta, skb); + +- sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift); +- + if (sta) { + struct ieee80211_fast_tx *fast_tx; + diff --git a/package/kernel/mac80211/patches/subsys/320-cfg80211-rename-offchannel_chain-structs-to-backgrou.patch b/package/kernel/mac80211/patches/subsys/320-cfg80211-rename-offchannel_chain-structs-to-backgrou.patch deleted file mode 100644 index 608e72468d..0000000000 --- a/package/kernel/mac80211/patches/subsys/320-cfg80211-rename-offchannel_chain-structs-to-backgrou.patch +++ /dev/null @@ -1,532 +0,0 @@ -From: Lorenzo Bianconi -Date: Mon, 29 Nov 2021 14:11:24 +0100 -Subject: [PATCH] cfg80211: rename offchannel_chain structs to background_chain - to avoid confusion with ETSI standard - -ETSI standard defines "Offchannel CAC" as: -"Off-Channel CAC is performed by a number of non-continuous checks -spread over a period in time. This period, which is required to -determine the presence of radar signals, is defined as the Off-Channel -CAC Time.. -Minimum Off-Channel CAC Time 6 minutes and Maximum Off-Channel CAC Time -4 hours..". -mac80211 implementation refers to a dedicated hw chain used for continuous -radar monitoring. Rename offchannel_* references to background_* in -order to avoid confusion with ETSI standard. - -Signed-off-by: Lorenzo Bianconi -Link: https://lore.kernel.org/r/4204cc1d648d76b44557981713231e030a3bd991.1638190762.git.lorenzo@kernel.org -Signed-off-by: Johannes Berg ---- - ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -4058,14 +4058,14 @@ struct mgmt_frame_regs { - * - * @color_change: Initiate a color change. - * -- * @set_radar_offchan: Configure dedicated offchannel chain available for -+ * @set_radar_background: Configure dedicated offchannel chain available for - * radar/CAC detection on some hw. This chain can't be used to transmit - * or receive frames and it is bounded to a running wdev. -- * Offchannel radar/CAC detection allows to avoid the CAC downtime -+ * Background radar/CAC detection allows to avoid the CAC downtime - * switching to a different channel during CAC detection on the selected - * radar channel. - * The caller is expected to set chandef pointer to NULL in order to -- * disable offchannel CAC/radar detection. -+ * disable background CAC/radar detection. - */ - struct cfg80211_ops { - int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow); -@@ -4396,8 +4396,8 @@ struct cfg80211_ops { - int (*color_change)(struct wiphy *wiphy, - struct net_device *dev, - struct cfg80211_color_change_settings *params); -- int (*set_radar_offchan)(struct wiphy *wiphy, -- struct cfg80211_chan_def *chandef); -+ int (*set_radar_background)(struct wiphy *wiphy, -+ struct cfg80211_chan_def *chandef); - }; - - /* -@@ -7601,9 +7601,9 @@ cfg80211_radar_event(struct wiphy *wiphy - } - - static inline void --cfg80211_offchan_radar_event(struct wiphy *wiphy, -- struct cfg80211_chan_def *chandef, -- gfp_t gfp) -+cfg80211_background_radar_event(struct wiphy *wiphy, -+ struct cfg80211_chan_def *chandef, -+ gfp_t gfp) - { - __cfg80211_radar_event(wiphy, chandef, true, gfp); - } -@@ -7638,13 +7638,13 @@ void cfg80211_cac_event(struct net_devic - enum nl80211_radar_event event, gfp_t gfp); - - /** -- * cfg80211_offchan_cac_abort - Channel Availability Check offchan abort event -+ * cfg80211_background_cac_abort - Channel Availability Check offchan abort event - * @wiphy: the wiphy - * - * This function is called by the driver when a Channel Availability Check - * (CAC) is aborted by a offchannel dedicated chain. - */ --void cfg80211_offchan_cac_abort(struct wiphy *wiphy); -+void cfg80211_background_cac_abort(struct wiphy *wiphy); - - /** - * cfg80211_gtk_rekey_notify - notify userspace about driver rekeying ---- a/include/net/mac80211.h -+++ b/include/net/mac80211.h -@@ -3937,14 +3937,14 @@ struct ieee80211_prep_tx_info { - * twt structure. - * @twt_teardown_request: Update the hw with TWT teardown request received - * from the peer. -- * @set_radar_offchan: Configure dedicated offchannel chain available for -+ * @set_radar_background: Configure dedicated offchannel chain available for - * radar/CAC detection on some hw. This chain can't be used to transmit - * or receive frames and it is bounded to a running wdev. -- * Offchannel radar/CAC detection allows to avoid the CAC downtime -+ * Background radar/CAC detection allows to avoid the CAC downtime - * switching to a different channel during CAC detection on the selected - * radar channel. - * The caller is expected to set chandef pointer to NULL in order to -- * disable offchannel CAC/radar detection. -+ * disable background CAC/radar detection. - * @net_fill_forward_path: Called from .ndo_fill_forward_path in order to - * resolve a path for hardware flow offloading - */ -@@ -4275,8 +4275,8 @@ struct ieee80211_ops { - struct ieee80211_twt_setup *twt); - void (*twt_teardown_request)(struct ieee80211_hw *hw, - struct ieee80211_sta *sta, u8 flowid); -- int (*set_radar_offchan)(struct ieee80211_hw *hw, -- struct cfg80211_chan_def *chandef); -+ int (*set_radar_background)(struct ieee80211_hw *hw, -+ struct cfg80211_chan_def *chandef); - #if LINUX_VERSION_IS_GEQ(5,10,0) - int (*net_fill_forward_path)(struct ieee80211_hw *hw, - struct ieee80211_vif *vif, ---- a/include/uapi/linux/nl80211.h -+++ b/include/uapi/linux/nl80211.h -@@ -2608,10 +2608,10 @@ enum nl80211_commands { - * Mandatory parameter for the transmitting interface to enable MBSSID. - * Optional for the non-transmitting interfaces. - * -- * @NL80211_ATTR_RADAR_OFFCHAN: Configure dedicated offchannel chain available for -- * radar/CAC detection on some hw. This chain can't be used to transmit -- * or receive frames and it is bounded to a running wdev. -- * Offchannel radar/CAC detection allows to avoid the CAC downtime -+ * @NL80211_ATTR_RADAR_BACKGROUND: Configure dedicated offchannel chain -+ * available for radar/CAC detection on some hw. This chain can't be used -+ * to transmit or receive frames and it is bounded to a running wdev. -+ * Background radar/CAC detection allows to avoid the CAC downtime - * switching on a different channel during CAC detection on the selected - * radar channel. - * -@@ -3121,7 +3121,7 @@ enum nl80211_attrs { - NL80211_ATTR_MBSSID_CONFIG, - NL80211_ATTR_MBSSID_ELEMS, - -- NL80211_ATTR_RADAR_OFFCHAN, -+ NL80211_ATTR_RADAR_BACKGROUND, - - /* add attributes here, update the policy in nl80211.c */ - -@@ -6022,7 +6022,7 @@ enum nl80211_feature_flags { - * @NL80211_EXT_FEATURE_BSS_COLOR: The driver supports BSS color collision - * detection and change announcemnts. - * -- * @NL80211_EXT_FEATURE_RADAR_OFFCHAN: Device supports offchannel radar/CAC -+ * @NL80211_EXT_FEATURE_RADAR_BACKGROUND: Device supports background radar/CAC - * detection. - * - * @NUM_NL80211_EXT_FEATURES: number of extended features. -@@ -6090,7 +6090,7 @@ enum nl80211_ext_feature_index { - NL80211_EXT_FEATURE_SECURE_RTT, - NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE, - NL80211_EXT_FEATURE_BSS_COLOR, -- NL80211_EXT_FEATURE_RADAR_OFFCHAN, -+ NL80211_EXT_FEATURE_RADAR_BACKGROUND, - - /* add new features before the definition below */ - NUM_NL80211_EXT_FEATURES, ---- a/net/mac80211/cfg.c -+++ b/net/mac80211/cfg.c -@@ -4342,15 +4342,15 @@ out: - } - - static int --ieee80211_set_radar_offchan(struct wiphy *wiphy, -- struct cfg80211_chan_def *chandef) -+ieee80211_set_radar_background(struct wiphy *wiphy, -+ struct cfg80211_chan_def *chandef) - { - struct ieee80211_local *local = wiphy_priv(wiphy); - -- if (!local->ops->set_radar_offchan) -+ if (!local->ops->set_radar_background) - return -EOPNOTSUPP; - -- return local->ops->set_radar_offchan(&local->hw, chandef); -+ return local->ops->set_radar_background(&local->hw, chandef); - } - - const struct cfg80211_ops mac80211_config_ops = { -@@ -4457,5 +4457,5 @@ const struct cfg80211_ops mac80211_confi - .reset_tid_config = ieee80211_reset_tid_config, - .set_sar_specs = ieee80211_set_sar_specs, - .color_change = ieee80211_color_change, -- .set_radar_offchan = ieee80211_set_radar_offchan, -+ .set_radar_background = ieee80211_set_radar_background, - }; ---- a/net/wireless/chan.c -+++ b/net/wireless/chan.c -@@ -716,13 +716,13 @@ static bool - cfg80211_offchan_chain_is_active(struct cfg80211_registered_device *rdev, - struct ieee80211_channel *channel) - { -- if (!rdev->offchan_radar_wdev) -+ if (!rdev->background_radar_wdev) - return false; - -- if (!cfg80211_chandef_valid(&rdev->offchan_radar_chandef)) -+ if (!cfg80211_chandef_valid(&rdev->background_radar_chandef)) - return false; - -- return cfg80211_is_sub_chan(&rdev->offchan_radar_chandef, channel); -+ return cfg80211_is_sub_chan(&rdev->background_radar_chandef, channel); - } - - bool cfg80211_any_wiphy_oper_chan(struct wiphy *wiphy, ---- a/net/wireless/core.c -+++ b/net/wireless/core.c -@@ -543,9 +543,10 @@ use_default_name: - INIT_WORK(&rdev->rfkill_block, cfg80211_rfkill_block_work); - INIT_WORK(&rdev->conn_work, cfg80211_conn_work); - INIT_WORK(&rdev->event_work, cfg80211_event_work); -- INIT_WORK(&rdev->offchan_cac_abort_wk, cfg80211_offchan_cac_abort_wk); -- INIT_DELAYED_WORK(&rdev->offchan_cac_done_wk, -- cfg80211_offchan_cac_done_wk); -+ INIT_WORK(&rdev->background_cac_abort_wk, -+ cfg80211_background_cac_abort_wk); -+ INIT_DELAYED_WORK(&rdev->background_cac_done_wk, -+ cfg80211_background_cac_done_wk); - - init_waitqueue_head(&rdev->dev_wait); - -@@ -1055,13 +1056,13 @@ void wiphy_unregister(struct wiphy *wiph - cancel_work_sync(&rdev->conn_work); - flush_work(&rdev->event_work); - cancel_delayed_work_sync(&rdev->dfs_update_channels_wk); -- cancel_delayed_work_sync(&rdev->offchan_cac_done_wk); -+ cancel_delayed_work_sync(&rdev->background_cac_done_wk); - flush_work(&rdev->destroy_work); - flush_work(&rdev->sched_scan_stop_wk); - flush_work(&rdev->propagate_radar_detect_wk); - flush_work(&rdev->propagate_cac_done_wk); - flush_work(&rdev->mgmt_registrations_update_wk); -- flush_work(&rdev->offchan_cac_abort_wk); -+ flush_work(&rdev->background_cac_abort_wk); - - #ifdef CONFIG_PM - if (rdev->wiphy.wowlan_config && rdev->ops->set_wakeup) -@@ -1210,7 +1211,7 @@ void __cfg80211_leave(struct cfg80211_re - - cfg80211_pmsr_wdev_down(wdev); - -- cfg80211_stop_offchan_radar_detection(wdev); -+ cfg80211_stop_background_radar_detection(wdev); - - switch (wdev->iftype) { - case NL80211_IFTYPE_ADHOC: ---- a/net/wireless/core.h -+++ b/net/wireless/core.h -@@ -84,10 +84,10 @@ struct cfg80211_registered_device { - - struct delayed_work dfs_update_channels_wk; - -- struct wireless_dev *offchan_radar_wdev; -- struct cfg80211_chan_def offchan_radar_chandef; -- struct delayed_work offchan_cac_done_wk; -- struct work_struct offchan_cac_abort_wk; -+ struct wireless_dev *background_radar_wdev; -+ struct cfg80211_chan_def background_radar_chandef; -+ struct delayed_work background_cac_done_wk; -+ struct work_struct background_cac_abort_wk; - - /* netlink port which started critical protocol (0 means not started) */ - u32 crit_proto_nlportid; -@@ -497,15 +497,15 @@ cfg80211_chandef_dfs_cac_time(struct wip - void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev); - - int --cfg80211_start_offchan_radar_detection(struct cfg80211_registered_device *rdev, -- struct wireless_dev *wdev, -- struct cfg80211_chan_def *chandef); -+cfg80211_start_background_radar_detection(struct cfg80211_registered_device *rdev, -+ struct wireless_dev *wdev, -+ struct cfg80211_chan_def *chandef); - --void cfg80211_stop_offchan_radar_detection(struct wireless_dev *wdev); -+void cfg80211_stop_background_radar_detection(struct wireless_dev *wdev); - --void cfg80211_offchan_cac_done_wk(struct work_struct *work); -+void cfg80211_background_cac_done_wk(struct work_struct *work); - --void cfg80211_offchan_cac_abort_wk(struct work_struct *work); -+void cfg80211_background_cac_abort_wk(struct work_struct *work); - - bool cfg80211_any_wiphy_oper_chan(struct wiphy *wiphy, - struct ieee80211_channel *chan); ---- a/net/wireless/mlme.c -+++ b/net/wireless/mlme.c -@@ -920,7 +920,7 @@ void __cfg80211_radar_event(struct wiphy - cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_UNAVAILABLE); - - if (offchan) -- queue_work(cfg80211_wq, &rdev->offchan_cac_abort_wk); -+ queue_work(cfg80211_wq, &rdev->background_cac_abort_wk); - - cfg80211_sched_dfs_chan_update(rdev); - -@@ -975,10 +975,10 @@ void cfg80211_cac_event(struct net_devic - EXPORT_SYMBOL(cfg80211_cac_event); - - static void --__cfg80211_offchan_cac_event(struct cfg80211_registered_device *rdev, -- struct wireless_dev *wdev, -- const struct cfg80211_chan_def *chandef, -- enum nl80211_radar_event event) -+__cfg80211_background_cac_event(struct cfg80211_registered_device *rdev, -+ struct wireless_dev *wdev, -+ const struct cfg80211_chan_def *chandef, -+ enum nl80211_radar_event event) - { - struct wiphy *wiphy = &rdev->wiphy; - struct net_device *netdev; -@@ -988,7 +988,7 @@ __cfg80211_offchan_cac_event(struct cfg8 - if (!cfg80211_chandef_valid(chandef)) - return; - -- if (!rdev->offchan_radar_wdev) -+ if (!rdev->background_radar_wdev) - return; - - switch (event) { -@@ -997,12 +997,12 @@ __cfg80211_offchan_cac_event(struct cfg8 - memcpy(&rdev->cac_done_chandef, chandef, sizeof(*chandef)); - queue_work(cfg80211_wq, &rdev->propagate_cac_done_wk); - cfg80211_sched_dfs_chan_update(rdev); -- wdev = rdev->offchan_radar_wdev; -+ wdev = rdev->background_radar_wdev; - break; - case NL80211_RADAR_CAC_ABORTED: -- if (!cancel_delayed_work(&rdev->offchan_cac_done_wk)) -+ if (!cancel_delayed_work(&rdev->background_cac_done_wk)) - return; -- wdev = rdev->offchan_radar_wdev; -+ wdev = rdev->background_radar_wdev; - break; - case NL80211_RADAR_CAC_STARTED: - break; -@@ -1015,49 +1015,49 @@ __cfg80211_offchan_cac_event(struct cfg8 - } - - static void --cfg80211_offchan_cac_event(struct cfg80211_registered_device *rdev, -- const struct cfg80211_chan_def *chandef, -- enum nl80211_radar_event event) -+cfg80211_background_cac_event(struct cfg80211_registered_device *rdev, -+ const struct cfg80211_chan_def *chandef, -+ enum nl80211_radar_event event) - { - wiphy_lock(&rdev->wiphy); -- __cfg80211_offchan_cac_event(rdev, rdev->offchan_radar_wdev, -- chandef, event); -+ __cfg80211_background_cac_event(rdev, rdev->background_radar_wdev, -+ chandef, event); - wiphy_unlock(&rdev->wiphy); - } - --void cfg80211_offchan_cac_done_wk(struct work_struct *work) -+void cfg80211_background_cac_done_wk(struct work_struct *work) - { - struct delayed_work *delayed_work = to_delayed_work(work); - struct cfg80211_registered_device *rdev; - - rdev = container_of(delayed_work, struct cfg80211_registered_device, -- offchan_cac_done_wk); -- cfg80211_offchan_cac_event(rdev, &rdev->offchan_radar_chandef, -- NL80211_RADAR_CAC_FINISHED); -+ background_cac_done_wk); -+ cfg80211_background_cac_event(rdev, &rdev->background_radar_chandef, -+ NL80211_RADAR_CAC_FINISHED); - } - --void cfg80211_offchan_cac_abort_wk(struct work_struct *work) -+void cfg80211_background_cac_abort_wk(struct work_struct *work) - { - struct cfg80211_registered_device *rdev; - - rdev = container_of(work, struct cfg80211_registered_device, -- offchan_cac_abort_wk); -- cfg80211_offchan_cac_event(rdev, &rdev->offchan_radar_chandef, -- NL80211_RADAR_CAC_ABORTED); -+ background_cac_abort_wk); -+ cfg80211_background_cac_event(rdev, &rdev->background_radar_chandef, -+ NL80211_RADAR_CAC_ABORTED); - } - --void cfg80211_offchan_cac_abort(struct wiphy *wiphy) -+void cfg80211_background_cac_abort(struct wiphy *wiphy) - { - struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); - -- queue_work(cfg80211_wq, &rdev->offchan_cac_abort_wk); -+ queue_work(cfg80211_wq, &rdev->background_cac_abort_wk); - } --EXPORT_SYMBOL(cfg80211_offchan_cac_abort); -+EXPORT_SYMBOL(cfg80211_background_cac_abort); - - int --cfg80211_start_offchan_radar_detection(struct cfg80211_registered_device *rdev, -- struct wireless_dev *wdev, -- struct cfg80211_chan_def *chandef) -+cfg80211_start_background_radar_detection(struct cfg80211_registered_device *rdev, -+ struct wireless_dev *wdev, -+ struct cfg80211_chan_def *chandef) - { - unsigned int cac_time_ms; - int err; -@@ -1065,19 +1065,19 @@ cfg80211_start_offchan_radar_detection(s - lockdep_assert_wiphy(&rdev->wiphy); - - if (!wiphy_ext_feature_isset(&rdev->wiphy, -- NL80211_EXT_FEATURE_RADAR_OFFCHAN)) -+ NL80211_EXT_FEATURE_RADAR_BACKGROUND)) - return -EOPNOTSUPP; - - /* Offchannel chain already locked by another wdev */ -- if (rdev->offchan_radar_wdev && rdev->offchan_radar_wdev != wdev) -+ if (rdev->background_radar_wdev && rdev->background_radar_wdev != wdev) - return -EBUSY; - - /* CAC already in progress on the offchannel chain */ -- if (rdev->offchan_radar_wdev == wdev && -- delayed_work_pending(&rdev->offchan_cac_done_wk)) -+ if (rdev->background_radar_wdev == wdev && -+ delayed_work_pending(&rdev->background_cac_done_wk)) - return -EBUSY; - -- err = rdev_set_radar_offchan(rdev, chandef); -+ err = rdev_set_radar_background(rdev, chandef); - if (err) - return err; - -@@ -1085,30 +1085,31 @@ cfg80211_start_offchan_radar_detection(s - if (!cac_time_ms) - cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; - -- rdev->offchan_radar_chandef = *chandef; -- rdev->offchan_radar_wdev = wdev; /* Get offchain ownership */ -+ rdev->background_radar_chandef = *chandef; -+ rdev->background_radar_wdev = wdev; /* Get offchain ownership */ - -- __cfg80211_offchan_cac_event(rdev, wdev, chandef, -- NL80211_RADAR_CAC_STARTED); -- queue_delayed_work(cfg80211_wq, &rdev->offchan_cac_done_wk, -+ __cfg80211_background_cac_event(rdev, wdev, chandef, -+ NL80211_RADAR_CAC_STARTED); -+ queue_delayed_work(cfg80211_wq, &rdev->background_cac_done_wk, - msecs_to_jiffies(cac_time_ms)); - - return 0; - } - --void cfg80211_stop_offchan_radar_detection(struct wireless_dev *wdev) -+void cfg80211_stop_background_radar_detection(struct wireless_dev *wdev) - { - struct wiphy *wiphy = wdev->wiphy; - struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); - - lockdep_assert_wiphy(wiphy); - -- if (wdev != rdev->offchan_radar_wdev) -+ if (wdev != rdev->background_radar_wdev) - return; - -- rdev_set_radar_offchan(rdev, NULL); -- rdev->offchan_radar_wdev = NULL; /* Release offchain ownership */ -+ rdev_set_radar_background(rdev, NULL); -+ rdev->background_radar_wdev = NULL; /* Release offchain ownership */ - -- __cfg80211_offchan_cac_event(rdev, wdev, &rdev->offchan_radar_chandef, -- NL80211_RADAR_CAC_ABORTED); -+ __cfg80211_background_cac_event(rdev, wdev, -+ &rdev->background_radar_chandef, -+ NL80211_RADAR_CAC_ABORTED); - } ---- a/net/wireless/nl80211.c -+++ b/net/wireless/nl80211.c -@@ -801,7 +801,7 @@ static const struct nla_policy nl80211_p - [NL80211_ATTR_MBSSID_CONFIG] = - NLA_POLICY_NESTED(nl80211_mbssid_config_policy), - [NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED }, -- [NL80211_ATTR_RADAR_OFFCHAN] = { .type = NLA_FLAG }, -+ [NL80211_ATTR_RADAR_BACKGROUND] = { .type = NLA_FLAG }, - }; - - /* policy for the key attributes */ -@@ -9306,9 +9306,9 @@ static int nl80211_start_radar_detection - goto unlock; - } - -- if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_OFFCHAN])) { -- err = cfg80211_start_offchan_radar_detection(rdev, wdev, -- &chandef); -+ if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) { -+ err = cfg80211_start_background_radar_detection(rdev, wdev, -+ &chandef); - goto unlock; - } - ---- a/net/wireless/rdev-ops.h -+++ b/net/wireless/rdev-ops.h -@@ -1382,17 +1382,17 @@ static inline int rdev_color_change(stru - } - - static inline int --rdev_set_radar_offchan(struct cfg80211_registered_device *rdev, -- struct cfg80211_chan_def *chandef) -+rdev_set_radar_background(struct cfg80211_registered_device *rdev, -+ struct cfg80211_chan_def *chandef) - { - struct wiphy *wiphy = &rdev->wiphy; - int ret; - -- if (!rdev->ops->set_radar_offchan) -+ if (!rdev->ops->set_radar_background) - return -EOPNOTSUPP; - -- trace_rdev_set_radar_offchan(wiphy, chandef); -- ret = rdev->ops->set_radar_offchan(wiphy, chandef); -+ trace_rdev_set_radar_background(wiphy, chandef); -+ ret = rdev->ops->set_radar_background(wiphy, chandef); - trace_rdev_return_int(wiphy, ret); - - return ret; ---- a/net/wireless/trace.h -+++ b/net/wireless/trace.h -@@ -3646,7 +3646,7 @@ TRACE_EVENT(cfg80211_bss_color_notify, - __entry->color_bitmap) - ); - --TRACE_EVENT(rdev_set_radar_offchan, -+TRACE_EVENT(rdev_set_radar_background, - TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef), - - TP_ARGS(wiphy, chandef), diff --git a/package/kernel/mac80211/patches/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch b/package/kernel/mac80211/patches/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch new file mode 100644 index 0000000000..28b1ff1106 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch @@ -0,0 +1,132 @@ +From: Felix Fietkau +Date: Thu, 16 Feb 2023 11:07:30 +0100 +Subject: [PATCH] wifi: mac80211: use mesh header cache to speed up mesh + forwarding + +Significantly reduces mesh forwarding path CPU usage and enables the +direct use of iTXQ. + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2720,6 +2720,65 @@ ieee80211_deliver_skb(struct ieee80211_r + } + } + ++#ifdef CPTCFG_MAC80211_MESH ++static bool ++ieee80211_rx_mesh_fast_forward(struct ieee80211_sub_if_data *sdata, ++ struct sk_buff *skb, int hdrlen) ++{ ++ struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; ++ struct ieee80211_mesh_fast_tx *entry = NULL; ++ struct ieee80211s_hdr *mesh_hdr; ++ struct tid_ampdu_tx *tid_tx; ++ struct sta_info *sta; ++ struct ethhdr eth; ++ u8 tid; ++ ++ mesh_hdr = (struct ieee80211s_hdr *)(skb->data + sizeof(eth)); ++ if ((mesh_hdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6) ++ entry = mesh_fast_tx_get(sdata, mesh_hdr->eaddr1); ++ else if (!(mesh_hdr->flags & MESH_FLAGS_AE)) ++ entry = mesh_fast_tx_get(sdata, skb->data); ++ if (!entry) ++ return false; ++ ++ sta = rcu_dereference(entry->mpath->next_hop); ++ if (!sta) ++ return false; ++ ++ if (skb_linearize(skb)) ++ return false; ++ ++ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; ++ tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]); ++ if (tid_tx) { ++ if (!test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) ++ return false; ++ ++ if (tid_tx->timeout) ++ tid_tx->last_tx = jiffies; ++ } ++ ++ ieee80211_aggr_check(sdata, sta, skb); ++ ++ if (ieee80211_get_8023_tunnel_proto(skb->data + hdrlen, ++ &skb->protocol)) ++ hdrlen += ETH_ALEN; ++ else ++ skb->protocol = htons(skb->len - hdrlen); ++ skb_set_network_header(skb, hdrlen + 2); ++ ++ skb->dev = sdata->dev; ++ memcpy(ð, skb->data, ETH_HLEN - 2); ++ skb_pull(skb, 2); ++ __ieee80211_xmit_fast(sdata, sta, &entry->fast_tx, skb, tid_tx, ++ eth.h_dest, eth.h_source); ++ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast); ++ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames); ++ ++ return true; ++} ++#endif ++ + static ieee80211_rx_result + ieee80211_rx_mesh_data(struct ieee80211_sub_if_data *sdata, struct sta_info *sta, + struct sk_buff *skb) +@@ -2824,6 +2883,10 @@ ieee80211_rx_mesh_data(struct ieee80211_ + + skb_set_queue_mapping(skb, ieee802_1d_to_ac[skb->priority]); + ++ if (!multicast && ++ ieee80211_rx_mesh_fast_forward(sdata, skb, mesh_hdrlen)) ++ return RX_QUEUED; ++ + ieee80211_fill_mesh_addresses(&hdr, &hdr.frame_control, + eth->h_dest, eth->h_source); + hdrlen = ieee80211_hdrlen(hdr.frame_control); +@@ -2862,6 +2925,7 @@ ieee80211_rx_mesh_data(struct ieee80211_ + info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING; + info->control.vif = &sdata->vif; + info->control.jiffies = jiffies; ++ fwd_skb->dev = sdata->dev; + if (multicast) { + IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_mcast); + memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN); +@@ -2883,7 +2947,6 @@ ieee80211_rx_mesh_data(struct ieee80211_ + } + + IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames); +- fwd_skb->dev = sdata->dev; + ieee80211_add_pending_skb(local, fwd_skb); + + rx_accept: +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -2022,6 +2022,8 @@ void __ieee80211_xmit_fast(struct ieee80 + struct ieee80211_fast_tx *fast_tx, + struct sk_buff *skb, bool ampdu, + const u8 *da, const u8 *sa); ++void ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata, ++ struct sta_info *sta, struct sk_buff *skb); + + /* HT */ + void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -1191,10 +1191,8 @@ static bool ieee80211_tx_prep_agg(struct + return queued; + } + +-static void +-ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata, +- struct sta_info *sta, +- struct sk_buff *skb) ++void ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata, ++ struct sta_info *sta, struct sk_buff *skb) + { + struct rate_control_ref *ref = sdata->local->rate_ctrl; + u16 tid; diff --git a/package/kernel/mac80211/patches/subsys/321-mac80211-fix-mesh-forwarding.patch b/package/kernel/mac80211/patches/subsys/321-mac80211-fix-mesh-forwarding.patch new file mode 100644 index 0000000000..e2b268ae4c --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/321-mac80211-fix-mesh-forwarding.patch @@ -0,0 +1,32 @@ +From: Felix Fietkau +Date: Mon, 20 Feb 2023 12:50:50 +0100 +Subject: [PATCH] mac80211: fix mesh forwarding + +Linearize packets (needed for forwarding A-MSDU subframes). +Fix network header offset to fix flow dissector (and fair queueing). + +Fixes: 986e43b19ae9 ("wifi: mac80211: fix receiving A-MSDU frames on mesh interfaces") +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2904,6 +2904,9 @@ ieee80211_rx_mesh_data(struct ieee80211_ + + if (skb_cow_head(fwd_skb, hdrlen - sizeof(struct ethhdr))) + return RX_DROP_UNUSABLE; ++ ++ if (skb_linearize(fwd_skb)) ++ return RX_DROP_UNUSABLE; + } + + fwd_hdr = skb_push(fwd_skb, hdrlen - sizeof(struct ethhdr)); +@@ -2918,7 +2921,7 @@ ieee80211_rx_mesh_data(struct ieee80211_ + hdrlen += ETH_ALEN; + else + fwd_skb->protocol = htons(fwd_skb->len - hdrlen); +- skb_set_network_header(fwd_skb, hdrlen); ++ skb_set_network_header(fwd_skb, hdrlen + 2); + + info = IEEE80211_SKB_CB(fwd_skb); + memset(info, 0, sizeof(*info)); diff --git a/package/kernel/mac80211/patches/subsys/322-wifi-mac80211-fix-mesh-path-discovery-based-on-unica.patch b/package/kernel/mac80211/patches/subsys/322-wifi-mac80211-fix-mesh-path-discovery-based-on-unica.patch new file mode 100644 index 0000000000..292a89ef92 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/322-wifi-mac80211-fix-mesh-path-discovery-based-on-unica.patch @@ -0,0 +1,52 @@ +From: Felix Fietkau +Date: Sun, 26 Feb 2023 20:30:20 +0100 +Subject: [PATCH] wifi: mac80211: fix mesh path discovery based on unicast + packets + +If a packet has reached its intended destination, it was bumped to the code +that accepts it, without first checking if a mesh_path needs to be created +based on the discovered source. +Fix this by moving the destination address check further down + +Fixes: 986e43b19ae9 ("wifi: mac80211: fix receiving A-MSDU frames on mesh interfaces") +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2824,17 +2824,6 @@ ieee80211_rx_mesh_data(struct ieee80211_ + mesh_rmc_check(sdata, eth->h_source, mesh_hdr)) + return RX_DROP_MONITOR; + +- /* Frame has reached destination. Don't forward */ +- if (ether_addr_equal(sdata->vif.addr, eth->h_dest)) +- goto rx_accept; +- +- if (!ifmsh->mshcfg.dot11MeshForwarding) { +- if (is_multicast_ether_addr(eth->h_dest)) +- goto rx_accept; +- +- return RX_DROP_MONITOR; +- } +- + /* forward packet */ + if (sdata->crypto_tx_tailroom_needed_cnt) + tailroom = IEEE80211_ENCRYPT_TAILROOM; +@@ -2881,6 +2870,17 @@ ieee80211_rx_mesh_data(struct ieee80211_ + rcu_read_unlock(); + } + ++ /* Frame has reached destination. Don't forward */ ++ if (ether_addr_equal(sdata->vif.addr, eth->h_dest)) ++ goto rx_accept; ++ ++ if (!ifmsh->mshcfg.dot11MeshForwarding) { ++ if (is_multicast_ether_addr(eth->h_dest)) ++ goto rx_accept; ++ ++ return RX_DROP_MONITOR; ++ } ++ + skb_set_queue_mapping(skb, ieee802_1d_to_ac[skb->priority]); + + if (!multicast && diff --git a/package/kernel/mac80211/patches/subsys/323-mac80211-MBSSID-support-in-interface-handling.patch b/package/kernel/mac80211/patches/subsys/323-mac80211-MBSSID-support-in-interface-handling.patch deleted file mode 100644 index a135e3d1b5..0000000000 --- a/package/kernel/mac80211/patches/subsys/323-mac80211-MBSSID-support-in-interface-handling.patch +++ /dev/null @@ -1,144 +0,0 @@ -From: John Crispin -Date: Wed, 15 Sep 2021 19:54:35 -0700 -Subject: [PATCH] mac80211: MBSSID support in interface handling - -Configure multiple BSSID and enhanced multi-BSSID advertisement (EMA) -parameters in mac80211 for AP mode. - -For each interface, 'mbssid_tx_vif' points to the transmitting interface of -the MBSSID set. The pointer is set to NULL if MBSSID is disabled. - -Function ieee80211_stop() is modified to always bring down all the -non-transmitting interfaces first and the transmitting interface last. - -Signed-off-by: John Crispin -Co-developed-by: Aloka Dixit -Signed-off-by: Aloka Dixit -Link: https://lore.kernel.org/r/20210916025437.29138-3-alokad@codeaurora.org -[slightly change logic to be more obvious] -Signed-off-by: Johannes Berg ---- - ---- a/include/net/mac80211.h -+++ b/include/net/mac80211.h -@@ -1719,6 +1719,7 @@ enum ieee80211_offload_flags { - * write-protected by sdata_lock and local->mtx so holding either is fine - * for read access. - * @color_change_color: the bss color that will be used after the change. -+ * @mbssid_tx_vif: Pointer to the transmitting interface if MBSSID is enabled. - */ - struct ieee80211_vif { - enum nl80211_iftype type; -@@ -1750,6 +1751,8 @@ struct ieee80211_vif { - bool color_change_active; - u8 color_change_color; - -+ struct ieee80211_vif *mbssid_tx_vif; -+ - /* must be last */ - u8 drv_priv[] __aligned(sizeof(void *)); - }; ---- a/net/mac80211/cfg.c -+++ b/net/mac80211/cfg.c -@@ -112,6 +112,36 @@ static int ieee80211_set_mon_options(str - return 0; - } - -+static int ieee80211_set_ap_mbssid_options(struct ieee80211_sub_if_data *sdata, -+ struct cfg80211_mbssid_config params) -+{ -+ struct ieee80211_sub_if_data *tx_sdata; -+ -+ sdata->vif.mbssid_tx_vif = NULL; -+ sdata->vif.bss_conf.bssid_index = 0; -+ sdata->vif.bss_conf.nontransmitted = false; -+ sdata->vif.bss_conf.ema_ap = false; -+ -+ if (sdata->vif.type != NL80211_IFTYPE_AP || !params.tx_wdev) -+ return -EINVAL; -+ -+ tx_sdata = IEEE80211_WDEV_TO_SUB_IF(params.tx_wdev); -+ if (!tx_sdata) -+ return -EINVAL; -+ -+ if (tx_sdata == sdata) { -+ sdata->vif.mbssid_tx_vif = &sdata->vif; -+ } else { -+ sdata->vif.mbssid_tx_vif = &tx_sdata->vif; -+ sdata->vif.bss_conf.nontransmitted = true; -+ sdata->vif.bss_conf.bssid_index = params.index; -+ } -+ if (params.ema) -+ sdata->vif.bss_conf.ema_ap = true; -+ -+ return 0; -+} -+ - static struct wireless_dev *ieee80211_add_iface(struct wiphy *wiphy, - const char *name, - unsigned char name_assign_type, -@@ -1107,6 +1137,14 @@ static int ieee80211_start_ap(struct wip - changed |= BSS_CHANGED_HE_BSS_COLOR; - } - -+ if (sdata->vif.type == NL80211_IFTYPE_AP && -+ params->mbssid_config.tx_wdev) { -+ err = ieee80211_set_ap_mbssid_options(sdata, -+ params->mbssid_config); -+ if (err) -+ return err; -+ } -+ - mutex_lock(&local->mtx); - err = ieee80211_vif_use_channel(sdata, ¶ms->chandef, - IEEE80211_CHANCTX_SHARED); ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -632,17 +632,46 @@ static void ieee80211_do_stop(struct iee - ieee80211_add_virtual_monitor(local); - } - -+static void ieee80211_stop_mbssid(struct ieee80211_sub_if_data *sdata) -+{ -+ struct ieee80211_sub_if_data *tx_sdata, *non_tx_sdata, *tmp_sdata; -+ struct ieee80211_vif *tx_vif = sdata->vif.mbssid_tx_vif; -+ -+ if (!tx_vif) -+ return; -+ -+ tx_sdata = vif_to_sdata(tx_vif); -+ sdata->vif.mbssid_tx_vif = NULL; -+ -+ list_for_each_entry_safe(non_tx_sdata, tmp_sdata, -+ &tx_sdata->local->interfaces, list) { -+ if (non_tx_sdata != sdata && non_tx_sdata != tx_sdata && -+ non_tx_sdata->vif.mbssid_tx_vif == tx_vif && -+ ieee80211_sdata_running(non_tx_sdata)) { -+ non_tx_sdata->vif.mbssid_tx_vif = NULL; -+ dev_close(non_tx_sdata->wdev.netdev); -+ } -+ } -+ -+ if (sdata != tx_sdata && ieee80211_sdata_running(tx_sdata)) { -+ tx_sdata->vif.mbssid_tx_vif = NULL; -+ dev_close(tx_sdata->wdev.netdev); -+ } -+} -+ - static int ieee80211_stop(struct net_device *dev) - { - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); - -- /* close all dependent VLAN interfaces before locking wiphy */ -+ /* close dependent VLAN and MBSSID interfaces before locking wiphy */ - if (sdata->vif.type == NL80211_IFTYPE_AP) { - struct ieee80211_sub_if_data *vlan, *tmpsdata; - - list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, - u.vlan.list) - dev_close(vlan->dev); -+ -+ ieee80211_stop_mbssid(sdata); - } - - wiphy_lock(sdata->local->hw.wiphy); diff --git a/package/kernel/mac80211/patches/subsys/323-v6.3-wifi-mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee8.patch b/package/kernel/mac80211/patches/subsys/323-v6.3-wifi-mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee8.patch new file mode 100644 index 0000000000..e23dc4d226 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/323-v6.3-wifi-mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee8.patch @@ -0,0 +1,68 @@ +From: Muna Sinada +Date: Wed, 5 Oct 2022 14:54:45 -0700 +Subject: [PATCH] wifi: mac80211: Add VHT MU-MIMO related flags in + ieee80211_bss_conf + +Adding flags for SU Beamformer, SU Beamformee, MU Beamformer and +MU Beamformee for VHT. This is utilized to pass MU-MIMO +configurations from user space to driver in AP mode. + +Signed-off-by: Muna Sinada +Link: https://lore.kernel.org/r/1665006886-23874-1-git-send-email-quic_msinada@quicinc.com +[fixed indentation, removed redundant !!] +Signed-off-by: Johannes Berg +--- + +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -653,6 +653,14 @@ struct ieee80211_fils_discovery { + * write-protected by sdata_lock and local->mtx so holding either is fine + * for read access. + * @color_change_color: the bss color that will be used after the change. ++ * @vht_su_beamformer: in AP mode, does this BSS support operation as an VHT SU ++ * beamformer ++ * @vht_su_beamformee: in AP mode, does this BSS support operation as an VHT SU ++ * beamformee ++ * @vht_mu_beamformer: in AP mode, does this BSS support operation as an VHT MU ++ * beamformer ++ * @vht_mu_beamformee: in AP mode, does this BSS support operation as an VHT MU ++ * beamformee + */ + struct ieee80211_bss_conf { + const u8 *bssid; +@@ -726,6 +734,11 @@ struct ieee80211_bss_conf { + + bool color_change_active; + u8 color_change_color; ++ ++ bool vht_su_beamformer; ++ bool vht_su_beamformee; ++ bool vht_mu_beamformer; ++ bool vht_mu_beamformee; + }; + + /** +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -1252,6 +1252,21 @@ static int ieee80211_start_ap(struct wip + prev_beacon_int = link_conf->beacon_int; + link_conf->beacon_int = params->beacon_interval; + ++ if (params->vht_cap) { ++ link_conf->vht_su_beamformer = ++ params->vht_cap->vht_cap_info & ++ cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE); ++ link_conf->vht_su_beamformee = ++ params->vht_cap->vht_cap_info & ++ cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE); ++ link_conf->vht_mu_beamformer = ++ params->vht_cap->vht_cap_info & ++ cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE); ++ link_conf->vht_mu_beamformee = ++ params->vht_cap->vht_cap_info & ++ cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE); ++ } ++ + if (params->he_cap && params->he_oper) { + link_conf->he_support = true; + link_conf->htc_trig_based_pkt_ext = diff --git a/package/kernel/mac80211/patches/subsys/324-mac80211-MBSSID-beacon-handling-in-AP-mode.patch b/package/kernel/mac80211/patches/subsys/324-mac80211-MBSSID-beacon-handling-in-AP-mode.patch deleted file mode 100644 index a8fc02f92d..0000000000 --- a/package/kernel/mac80211/patches/subsys/324-mac80211-MBSSID-beacon-handling-in-AP-mode.patch +++ /dev/null @@ -1,326 +0,0 @@ -From: Lorenzo Bianconi -Date: Thu, 24 Feb 2022 12:54:58 +0100 -Subject: [PATCH] mac80211: MBSSID beacon handling in AP mode - -Add new fields in struct beacon_data to store all MBSSID elements. -Generate a beacon template which includes all MBSSID elements. -Move CSA offset to reflect the MBSSID element length. - -Co-developed-by: Aloka Dixit -Signed-off-by: Aloka Dixit -Co-developed-by: John Crispin -Signed-off-by: John Crispin -Signed-off-by: Lorenzo Bianconi -Tested-by: Money Wang -Link: https://lore.kernel.org/r/5322db3c303f431adaf191ab31c45e151dde5465.1645702516.git.lorenzo@kernel.org -[small cleanups] -Signed-off-by: Johannes Berg ---- - ---- a/include/net/mac80211.h -+++ b/include/net/mac80211.h -@@ -4938,12 +4938,14 @@ void ieee80211_report_low_ack(struct iee - * @cntdwn_counter_offs: array of IEEE80211_MAX_CNTDWN_COUNTERS_NUM offsets - * to countdown counters. This array can contain zero values which - * should be ignored. -+ * @mbssid_off: position of the multiple bssid element - */ - struct ieee80211_mutable_offsets { - u16 tim_offset; - u16 tim_length; - - u16 cntdwn_counter_offs[IEEE80211_MAX_CNTDWN_COUNTERS_NUM]; -+ u16 mbssid_off; - }; - - /** ---- a/net/mac80211/cfg.c -+++ b/net/mac80211/cfg.c -@@ -989,11 +989,29 @@ static int ieee80211_set_ftm_responder_p - return 0; - } - -+static int -+ieee80211_copy_mbssid_beacon(u8 *pos, struct cfg80211_mbssid_elems *dst, -+ struct cfg80211_mbssid_elems *src) -+{ -+ int i, offset = 0; -+ -+ for (i = 0; i < src->cnt; i++) { -+ memcpy(pos + offset, src->elem[i].data, src->elem[i].len); -+ dst->elem[i].len = src->elem[i].len; -+ dst->elem[i].data = pos + offset; -+ offset += dst->elem[i].len; -+ } -+ dst->cnt = src->cnt; -+ -+ return offset; -+} -+ - static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata, - struct cfg80211_beacon_data *params, - const struct ieee80211_csa_settings *csa, - const struct ieee80211_color_change_settings *cca) - { -+ struct cfg80211_mbssid_elems *mbssid = NULL; - struct beacon_data *new, *old; - int new_head_len, new_tail_len; - int size, err; -@@ -1021,6 +1039,17 @@ static int ieee80211_assign_beacon(struc - - size = sizeof(*new) + new_head_len + new_tail_len; - -+ /* new or old multiple BSSID elements? */ -+ if (params->mbssid_ies) { -+ mbssid = params->mbssid_ies; -+ size += struct_size(new->mbssid_ies, elem, mbssid->cnt); -+ size += ieee80211_get_mbssid_beacon_len(mbssid); -+ } else if (old && old->mbssid_ies) { -+ mbssid = old->mbssid_ies; -+ size += struct_size(new->mbssid_ies, elem, mbssid->cnt); -+ size += ieee80211_get_mbssid_beacon_len(mbssid); -+ } -+ - new = kzalloc(size, GFP_KERNEL); - if (!new) - return -ENOMEM; -@@ -1029,12 +1058,20 @@ static int ieee80211_assign_beacon(struc - - /* - * pointers go into the block we allocated, -- * memory is | beacon_data | head | tail | -+ * memory is | beacon_data | head | tail | mbssid_ies - */ - new->head = ((u8 *) new) + sizeof(*new); - new->tail = new->head + new_head_len; - new->head_len = new_head_len; - new->tail_len = new_tail_len; -+ /* copy in optional mbssid_ies */ -+ if (mbssid) { -+ u8 *pos = new->tail + new->tail_len; -+ -+ new->mbssid_ies = (void *)pos; -+ pos += struct_size(new->mbssid_ies, elem, mbssid->cnt); -+ ieee80211_copy_mbssid_beacon(pos, new->mbssid_ies, mbssid); -+ } - - if (csa) { - new->cntdwn_current_counter = csa->count; -@@ -1332,8 +1369,11 @@ static int ieee80211_stop_ap(struct wiph - - mutex_unlock(&local->mtx); - -- kfree(sdata->u.ap.next_beacon); -- sdata->u.ap.next_beacon = NULL; -+ if (sdata->u.ap.next_beacon) { -+ kfree(sdata->u.ap.next_beacon->mbssid_ies); -+ kfree(sdata->u.ap.next_beacon); -+ sdata->u.ap.next_beacon = NULL; -+ } - - /* turn off carrier for this interface and dependent VLANs */ - list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) -@@ -3126,12 +3166,24 @@ cfg80211_beacon_dup(struct cfg80211_beac - - len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len + - beacon->proberesp_ies_len + beacon->assocresp_ies_len + -- beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len; -+ beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len + -+ ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies); - - new_beacon = kzalloc(sizeof(*new_beacon) + len, GFP_KERNEL); - if (!new_beacon) - return NULL; - -+ if (beacon->mbssid_ies && beacon->mbssid_ies->cnt) { -+ new_beacon->mbssid_ies = -+ kzalloc(struct_size(new_beacon->mbssid_ies, -+ elem, beacon->mbssid_ies->cnt), -+ GFP_KERNEL); -+ if (!new_beacon->mbssid_ies) { -+ kfree(new_beacon); -+ return NULL; -+ } -+ } -+ - pos = (u8 *)(new_beacon + 1); - if (beacon->head_len) { - new_beacon->head_len = beacon->head_len; -@@ -3169,6 +3221,10 @@ cfg80211_beacon_dup(struct cfg80211_beac - memcpy(pos, beacon->probe_resp, beacon->probe_resp_len); - pos += beacon->probe_resp_len; - } -+ if (beacon->mbssid_ies && beacon->mbssid_ies->cnt) -+ pos += ieee80211_copy_mbssid_beacon(pos, -+ new_beacon->mbssid_ies, -+ beacon->mbssid_ies); - - /* might copy -1, meaning no changes requested */ - new_beacon->ftm_responder = beacon->ftm_responder; -@@ -3206,8 +3262,11 @@ static int ieee80211_set_after_csa_beaco - case NL80211_IFTYPE_AP: - err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon, - NULL, NULL); -- kfree(sdata->u.ap.next_beacon); -- sdata->u.ap.next_beacon = NULL; -+ if (sdata->u.ap.next_beacon) { -+ kfree(sdata->u.ap.next_beacon->mbssid_ies); -+ kfree(sdata->u.ap.next_beacon); -+ sdata->u.ap.next_beacon = NULL; -+ } - - if (err < 0) - return err; -@@ -3362,8 +3421,12 @@ static int ieee80211_set_csa_beacon(stru - if ((params->n_counter_offsets_beacon > - IEEE80211_MAX_CNTDWN_COUNTERS_NUM) || - (params->n_counter_offsets_presp > -- IEEE80211_MAX_CNTDWN_COUNTERS_NUM)) -+ IEEE80211_MAX_CNTDWN_COUNTERS_NUM)) { -+ kfree(sdata->u.ap.next_beacon->mbssid_ies); -+ kfree(sdata->u.ap.next_beacon); -+ sdata->u.ap.next_beacon = NULL; - return -EINVAL; -+ } - - csa.counter_offsets_beacon = params->counter_offsets_beacon; - csa.counter_offsets_presp = params->counter_offsets_presp; -@@ -3373,7 +3436,9 @@ static int ieee80211_set_csa_beacon(stru - - err = ieee80211_assign_beacon(sdata, ¶ms->beacon_csa, &csa, NULL); - if (err < 0) { -+ kfree(sdata->u.ap.next_beacon->mbssid_ies); - kfree(sdata->u.ap.next_beacon); -+ sdata->u.ap.next_beacon = NULL; - return err; - } - *changed |= err; -@@ -3460,8 +3525,11 @@ static int ieee80211_set_csa_beacon(stru - static void ieee80211_color_change_abort(struct ieee80211_sub_if_data *sdata) - { - sdata->vif.color_change_active = false; -- kfree(sdata->u.ap.next_beacon); -- sdata->u.ap.next_beacon = NULL; -+ if (sdata->u.ap.next_beacon) { -+ kfree(sdata->u.ap.next_beacon->mbssid_ies); -+ kfree(sdata->u.ap.next_beacon); -+ sdata->u.ap.next_beacon = NULL; -+ } - - cfg80211_color_change_aborted_notify(sdata->dev); - } -@@ -4199,8 +4267,11 @@ ieee80211_set_after_color_change_beacon( - - ret = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon, - NULL, NULL); -- kfree(sdata->u.ap.next_beacon); -- sdata->u.ap.next_beacon = NULL; -+ if (sdata->u.ap.next_beacon) { -+ kfree(sdata->u.ap.next_beacon->mbssid_ies); -+ kfree(sdata->u.ap.next_beacon); -+ sdata->u.ap.next_beacon = NULL; -+ } - - if (ret < 0) - return ret; -@@ -4243,7 +4314,11 @@ ieee80211_set_color_change_beacon(struct - err = ieee80211_assign_beacon(sdata, ¶ms->beacon_color_change, - NULL, &color_change); - if (err < 0) { -- kfree(sdata->u.ap.next_beacon); -+ if (sdata->u.ap.next_beacon) { -+ kfree(sdata->u.ap.next_beacon->mbssid_ies); -+ kfree(sdata->u.ap.next_beacon); -+ sdata->u.ap.next_beacon = NULL; -+ } - return err; - } - *changed |= err; ---- a/net/mac80211/ieee80211_i.h -+++ b/net/mac80211/ieee80211_i.h -@@ -261,6 +261,7 @@ struct beacon_data { - struct ieee80211_meshconf_ie *meshconf; - u16 cntdwn_counter_offsets[IEEE80211_MAX_CNTDWN_COUNTERS_NUM]; - u8 cntdwn_current_counter; -+ struct cfg80211_mbssid_elems *mbssid_ies; - struct rcu_head rcu_head; - }; - -@@ -1082,6 +1083,20 @@ ieee80211_vif_get_shift(struct ieee80211 - return shift; - } - -+static inline int -+ieee80211_get_mbssid_beacon_len(struct cfg80211_mbssid_elems *elems) -+{ -+ int i, len = 0; -+ -+ if (!elems) -+ return 0; -+ -+ for (i = 0; i < elems->cnt; i++) -+ len += elems->elem[i].len; -+ -+ return len; -+} -+ - enum { - IEEE80211_RX_MSG = 1, - IEEE80211_TX_STATUS_MSG = 2, ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -5041,6 +5041,19 @@ ieee80211_beacon_get_finish(struct ieee8 - IEEE80211_TX_CTL_FIRST_FRAGMENT; - } - -+static void -+ieee80211_beacon_add_mbssid(struct sk_buff *skb, struct beacon_data *beacon) -+{ -+ int i; -+ -+ if (!beacon->mbssid_ies) -+ return; -+ -+ for (i = 0; i < beacon->mbssid_ies->cnt; i++) -+ skb_put_data(skb, beacon->mbssid_ies->elem[i].data, -+ beacon->mbssid_ies->elem[i].len); -+} -+ - static struct sk_buff * - ieee80211_beacon_get_ap(struct ieee80211_hw *hw, - struct ieee80211_vif *vif, -@@ -5054,6 +5067,7 @@ ieee80211_beacon_get_ap(struct ieee80211 - struct ieee80211_if_ap *ap = &sdata->u.ap; - struct sk_buff *skb = NULL; - u16 csa_off_base = 0; -+ int mbssid_len; - - if (beacon->cntdwn_counter_offsets[0]) { - if (!is_template) -@@ -5063,11 +5077,12 @@ ieee80211_beacon_get_ap(struct ieee80211 - } - - /* headroom, head length, -- * tail length and maximum TIM length -+ * tail length, maximum TIM length and multiple BSSID length - */ -+ mbssid_len = ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies); - skb = dev_alloc_skb(local->tx_headroom + beacon->head_len + - beacon->tail_len + 256 + -- local->hw.extra_beacon_tailroom); -+ local->hw.extra_beacon_tailroom + mbssid_len); - if (!skb) - return NULL; - -@@ -5081,6 +5096,11 @@ ieee80211_beacon_get_ap(struct ieee80211 - offs->tim_length = skb->len - beacon->head_len; - offs->cntdwn_counter_offs[0] = beacon->cntdwn_counter_offsets[0]; - -+ if (mbssid_len) { -+ ieee80211_beacon_add_mbssid(skb, beacon); -+ offs->mbssid_off = skb->len - mbssid_len; -+ } -+ - /* for AP the csa offsets are from tail */ - csa_off_base = skb->len; - } diff --git a/package/kernel/mac80211/patches/subsys/324-v6.3-wifi-mac80211-Add-HE-MU-MIMO-related-flags-in-ieee80.patch b/package/kernel/mac80211/patches/subsys/324-v6.3-wifi-mac80211-Add-HE-MU-MIMO-related-flags-in-ieee80.patch new file mode 100644 index 0000000000..f843dba123 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/324-v6.3-wifi-mac80211-Add-HE-MU-MIMO-related-flags-in-ieee80.patch @@ -0,0 +1,68 @@ +From: Muna Sinada +Date: Wed, 5 Oct 2022 14:54:46 -0700 +Subject: [PATCH] wifi: mac80211: Add HE MU-MIMO related flags in + ieee80211_bss_conf + +Adding flags for SU Beamformer, SU Beamformee, MU Beamformer and Full +Bandwidth UL MU-MIMO for HE. This is utilized to pass MU-MIMO +configurations from user space to driver in AP mode. + +Signed-off-by: Muna Sinada +Link: https://lore.kernel.org/r/1665006886-23874-2-git-send-email-quic_msinada@quicinc.com +[fixed indentation, removed redundant !!] +Signed-off-by: Johannes Berg +--- + +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -661,6 +661,15 @@ struct ieee80211_fils_discovery { + * beamformer + * @vht_mu_beamformee: in AP mode, does this BSS support operation as an VHT MU + * beamformee ++ * @he_su_beamformer: in AP-mode, does this BSS support operation as an HE SU ++ * beamformer ++ * @he_su_beamformee: in AP-mode, does this BSS support operation as an HE SU ++ * beamformee ++ * @he_mu_beamformer: in AP-mode, does this BSS support operation as an HE MU ++ * beamformer ++ * @he_full_ul_mumimo: does this BSS support the reception (AP) or transmission ++ * (non-AP STA) of an HE TB PPDU on an RU that spans the entire PPDU ++ * bandwidth + */ + struct ieee80211_bss_conf { + const u8 *bssid; +@@ -739,6 +748,10 @@ struct ieee80211_bss_conf { + bool vht_su_beamformee; + bool vht_mu_beamformer; + bool vht_mu_beamformee; ++ bool he_su_beamformer; ++ bool he_su_beamformee; ++ bool he_mu_beamformer; ++ bool he_full_ul_mumimo; + }; + + /** +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -1281,6 +1281,21 @@ static int ieee80211_start_ap(struct wip + changed |= BSS_CHANGED_HE_BSS_COLOR; + } + ++ if (params->he_cap) { ++ link_conf->he_su_beamformer = ++ params->he_cap->phy_cap_info[3] & ++ IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER; ++ link_conf->he_su_beamformee = ++ params->he_cap->phy_cap_info[4] & ++ IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE; ++ link_conf->he_mu_beamformer = ++ params->he_cap->phy_cap_info[4] & ++ IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; ++ link_conf->he_full_ul_mumimo = ++ params->he_cap->phy_cap_info[2] & ++ IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO; ++ } ++ + if (sdata->vif.type == NL80211_IFTYPE_AP && + params->mbssid_config.tx_wdev) { + err = ieee80211_set_ap_mbssid_options(sdata, diff --git a/package/kernel/mac80211/patches/subsys/325-mac80211-MBSSID-channel-switch.patch b/package/kernel/mac80211/patches/subsys/325-mac80211-MBSSID-channel-switch.patch deleted file mode 100644 index 38b0de180e..0000000000 --- a/package/kernel/mac80211/patches/subsys/325-mac80211-MBSSID-channel-switch.patch +++ /dev/null @@ -1,52 +0,0 @@ -From: John Crispin -Date: Thu, 24 Feb 2022 12:54:59 +0100 -Subject: [PATCH] mac80211: MBSSID channel switch - -Trigger ieee80211_csa_finish() on the non-transmitting interfaces -when channel switch concludes on the transmitting interface. - -Co-developed-by: Lorenzo Bianconi -Signed-off-by: Lorenzo Bianconi -Co-developed-by: Aloka Dixit -Signed-off-by: Aloka Dixit -Signed-off-by: John Crispin -Link: https://lore.kernel.org/r/6fde4d7f9fa387494f46a7aa4a584478dcda06f1.1645702516.git.lorenzo@kernel.org -Signed-off-by: Johannes Berg ---- - ---- a/net/mac80211/cfg.c -+++ b/net/mac80211/cfg.c -@@ -3247,9 +3247,31 @@ cfg80211_beacon_dup(struct cfg80211_beac - void ieee80211_csa_finish(struct ieee80211_vif *vif) - { - struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); -+ struct ieee80211_local *local = sdata->local; - -- ieee80211_queue_work(&sdata->local->hw, -- &sdata->csa_finalize_work); -+ rcu_read_lock(); -+ -+ if (vif->mbssid_tx_vif == vif) { -+ /* Trigger ieee80211_csa_finish() on the non-transmitting -+ * interfaces when channel switch is received on -+ * transmitting interface -+ */ -+ struct ieee80211_sub_if_data *iter; -+ -+ list_for_each_entry_rcu(iter, &local->interfaces, list) { -+ if (!ieee80211_sdata_running(iter)) -+ continue; -+ -+ if (iter == sdata || iter->vif.mbssid_tx_vif != vif) -+ continue; -+ -+ ieee80211_queue_work(&iter->local->hw, -+ &iter->csa_finalize_work); -+ } -+ } -+ ieee80211_queue_work(&local->hw, &sdata->csa_finalize_work); -+ -+ rcu_read_unlock(); - } - EXPORT_SYMBOL(ieee80211_csa_finish); - diff --git a/package/kernel/mac80211/patches/subsys/325-wifi-mac80211-introduce-ieee80211_refresh_tx_agg_ses.patch b/package/kernel/mac80211/patches/subsys/325-wifi-mac80211-introduce-ieee80211_refresh_tx_agg_ses.patch new file mode 100644 index 0000000000..1be5fcfbfa --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/325-wifi-mac80211-introduce-ieee80211_refresh_tx_agg_ses.patch @@ -0,0 +1,60 @@ +From: Ryder Lee +Date: Sat, 18 Feb 2023 01:50:05 +0800 +Subject: [PATCH] wifi: mac80211: introduce + ieee80211_refresh_tx_agg_session_timer() + +This allows low level drivers to refresh the tx agg session timer, based on +querying stats from the firmware usually. Especially for some mt76 devices +support .net_fill_forward_path would bypass mac80211, which leads to tx BA +session timeout for certain clients. + +Signed-off-by: Ryder Lee +--- + +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -5964,6 +5964,18 @@ void ieee80211_queue_delayed_work(struct + unsigned long delay); + + /** ++ * ieee80211_refresh_tx_agg_session_timer - Refresh a tx agg session timer. ++ * @sta: the station for which to start a BA session ++ * @tid: the TID to BA on. ++ * ++ * This function allows low level driver to refresh tx agg session timer ++ * to maintain BA session, the session level will still be managed by the ++ * mac80211. ++ */ ++void ieee80211_refresh_tx_agg_session_timer(struct ieee80211_sta *sta, ++ u16 tid); ++ ++/** + * ieee80211_start_tx_ba_session - Start a tx Block Ack session. + * @sta: the station for which to start a BA session + * @tid: the TID to BA on. +--- a/net/mac80211/agg-tx.c ++++ b/net/mac80211/agg-tx.c +@@ -554,6 +554,23 @@ void ieee80211_tx_ba_session_handle_star + ieee80211_send_addba_with_timeout(sta, tid_tx); + } + ++void ieee80211_refresh_tx_agg_session_timer(struct ieee80211_sta *pubsta, ++ u16 tid) ++{ ++ struct sta_info *sta = container_of(pubsta, struct sta_info, sta); ++ struct tid_ampdu_tx *tid_tx; ++ ++ if (WARN_ON_ONCE(tid >= IEEE80211_NUM_TIDS)) ++ return; ++ ++ tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]); ++ if (!tid_tx) ++ return; ++ ++ tid_tx->last_tx = jiffies; ++} ++EXPORT_SYMBOL(ieee80211_refresh_tx_agg_session_timer); ++ + /* + * After accepting the AddBA Response we activated a timer, + * resetting it after each frame that we send. diff --git a/package/kernel/mac80211/patches/subsys/326-mac80211-update-bssid_indicator-in-ieee80211_assign_.patch b/package/kernel/mac80211/patches/subsys/326-mac80211-update-bssid_indicator-in-ieee80211_assign_.patch deleted file mode 100644 index 1955568607..0000000000 --- a/package/kernel/mac80211/patches/subsys/326-mac80211-update-bssid_indicator-in-ieee80211_assign_.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Lorenzo Bianconi -Date: Thu, 24 Feb 2022 12:55:00 +0100 -Subject: [PATCH] mac80211: update bssid_indicator in - ieee80211_assign_beacon - -Update bssid_indicator in ieee80211_bss_conf according to the -number of bssid in the set. - -Signed-off-by: Lorenzo Bianconi -Link: https://lore.kernel.org/r/f92317e002fca9933f05a445fcefb4f53291d601.1645702516.git.lorenzo@kernel.org -Signed-off-by: Johannes Berg ---- - ---- a/net/mac80211/cfg.c -+++ b/net/mac80211/cfg.c -@@ -1071,6 +1071,9 @@ static int ieee80211_assign_beacon(struc - new->mbssid_ies = (void *)pos; - pos += struct_size(new->mbssid_ies, elem, mbssid->cnt); - ieee80211_copy_mbssid_beacon(pos, new->mbssid_ies, mbssid); -+ /* update bssid_indicator */ -+ sdata->vif.bss_conf.bssid_indicator = -+ ilog2(__roundup_pow_of_two(mbssid->cnt + 1)); - } - - if (csa) { diff --git a/package/kernel/mac80211/patches/subsys/326-wifi-mac80211-add-mesh-fast-rx-support.patch b/package/kernel/mac80211/patches/subsys/326-wifi-mac80211-add-mesh-fast-rx-support.patch new file mode 100644 index 0000000000..11f39c2d10 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/326-wifi-mac80211-add-mesh-fast-rx-support.patch @@ -0,0 +1,77 @@ +From: Felix Fietkau +Date: Thu, 2 Mar 2023 13:52:29 +0100 +Subject: [PATCH] wifi: mac80211: add mesh fast-rx support + +This helps bring down rx CPU usage by avoiding calls to the rx handlers in +the slow path. Supports forwarding and local rx, including A-MSDU. + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -4564,6 +4564,12 @@ void ieee80211_check_fast_rx(struct sta_ + } + + break; ++ case NL80211_IFTYPE_MESH_POINT: ++ fastrx.expected_ds_bits = cpu_to_le16(IEEE80211_FCTL_FROMDS | ++ IEEE80211_FCTL_TODS); ++ fastrx.da_offs = offsetof(struct ieee80211_hdr, addr3); ++ fastrx.sa_offs = offsetof(struct ieee80211_hdr, addr4); ++ break; + default: + goto clear; + } +@@ -4772,6 +4778,7 @@ static bool ieee80211_invoke_fast_rx(str + struct sk_buff *skb = rx->skb; + struct ieee80211_hdr *hdr = (void *)skb->data; + struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); ++ static ieee80211_rx_result res; + int orig_len = skb->len; + int hdrlen = ieee80211_hdrlen(hdr->frame_control); + int snap_offs = hdrlen; +@@ -4833,7 +4840,8 @@ static bool ieee80211_invoke_fast_rx(str + snap_offs += IEEE80211_CCMP_HDR_LEN; + } + +- if (!(status->rx_flags & IEEE80211_RX_AMSDU)) { ++ if (!ieee80211_vif_is_mesh(&rx->sdata->vif) && ++ !(status->rx_flags & IEEE80211_RX_AMSDU)) { + if (!pskb_may_pull(skb, snap_offs + sizeof(*payload))) + return false; + +@@ -4872,13 +4880,29 @@ static bool ieee80211_invoke_fast_rx(str + /* do the header conversion - first grab the addresses */ + ether_addr_copy(addrs.da, skb->data + fast_rx->da_offs); + ether_addr_copy(addrs.sa, skb->data + fast_rx->sa_offs); +- skb_postpull_rcsum(skb, skb->data + snap_offs, +- sizeof(rfc1042_header) + 2); +- /* remove the SNAP but leave the ethertype */ +- skb_pull(skb, snap_offs + sizeof(rfc1042_header)); ++ if (ieee80211_vif_is_mesh(&rx->sdata->vif)) { ++ skb_pull(skb, snap_offs - 2); ++ put_unaligned_be16(skb->len - 2, skb->data); ++ } else { ++ skb_postpull_rcsum(skb, skb->data + snap_offs, ++ sizeof(rfc1042_header) + 2); ++ ++ /* remove the SNAP but leave the ethertype */ ++ skb_pull(skb, snap_offs + sizeof(rfc1042_header)); ++ } + /* push the addresses in front */ + memcpy(skb_push(skb, sizeof(addrs)), &addrs, sizeof(addrs)); + ++ res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb); ++ switch (res) { ++ case RX_QUEUED: ++ return true; ++ case RX_CONTINUE: ++ break; ++ default: ++ goto drop; ++ } ++ + ieee80211_rx_8023(rx, fast_rx, orig_len); + + return true; diff --git a/package/kernel/mac80211/patches/subsys/327-wifi-mac80211-add-support-for-letting-drivers-regist.patch b/package/kernel/mac80211/patches/subsys/327-wifi-mac80211-add-support-for-letting-drivers-regist.patch new file mode 100644 index 0000000000..ac290b5360 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/327-wifi-mac80211-add-support-for-letting-drivers-regist.patch @@ -0,0 +1,149 @@ +From: Felix Fietkau +Date: Mon, 20 Mar 2023 14:28:08 +0100 +Subject: [PATCH] wifi: mac80211: add support for letting drivers register tc + offload support + +On newer MediaTek SoCs (e.g. MT7986), WLAN->WLAN or WLAN->Ethernet flows can +be offloaded by the SoC. In order to support that, the .ndo_setup_tc op is +needed. + +Signed-off-by: Felix Fietkau +--- + +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -4192,6 +4192,10 @@ struct ieee80211_prep_tx_info { + * Note that a sta can also be inserted or removed with valid links, + * i.e. passed to @sta_add/@sta_state with sta->valid_links not zero. + * In fact, cannot change from having valid_links and not having them. ++ * @net_setup_tc: Called from .ndo_setup_tc in order to prepare hardware ++ * flow offloading for flows originating from the vif. ++ * Note that the driver must not assume that the vif driver_data is valid ++ * at this point, since the callback can be called during netdev teardown. + */ + struct ieee80211_ops { + void (*tx)(struct ieee80211_hw *hw, +@@ -4547,6 +4551,11 @@ struct ieee80211_ops { + struct ieee80211_vif *vif, + struct ieee80211_sta *sta, + u16 old_links, u16 new_links); ++ int (*net_setup_tc)(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, ++ struct net_device *dev, ++ enum tc_setup_type type, ++ void *type_data); + }; + + /** +--- a/net/mac80211/driver-ops.h ++++ b/net/mac80211/driver-ops.h +@@ -1470,6 +1470,23 @@ static inline int drv_net_fill_forward_p + return ret; + } + ++static inline int drv_net_setup_tc(struct ieee80211_local *local, ++ struct ieee80211_sub_if_data *sdata, ++ struct net_device *dev, ++ enum tc_setup_type type, void *type_data) ++{ ++ int ret = -EOPNOTSUPP; ++ ++ sdata = get_bss_sdata(sdata); ++ trace_drv_net_setup_tc(local, sdata, type); ++ if (local->ops->net_setup_tc) ++ ret = local->ops->net_setup_tc(&local->hw, &sdata->vif, dev, ++ type, type_data); ++ trace_drv_return_int(local, ret); ++ ++ return ret; ++} ++ + int drv_change_vif_links(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, + u16 old_links, u16 new_links, +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -1939,7 +1939,8 @@ void ieee80211_color_collision_detection + /* interface handling */ + #define MAC80211_SUPPORTED_FEATURES_TX (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | \ + NETIF_F_HW_CSUM | NETIF_F_SG | \ +- NETIF_F_HIGHDMA | NETIF_F_GSO_SOFTWARE) ++ NETIF_F_HIGHDMA | NETIF_F_GSO_SOFTWARE | \ ++ NETIF_F_HW_TC) + #define MAC80211_SUPPORTED_FEATURES_RX (NETIF_F_RXCSUM) + #define MAC80211_SUPPORTED_FEATURES (MAC80211_SUPPORTED_FEATURES_TX | \ + MAC80211_SUPPORTED_FEATURES_RX) +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -813,6 +813,21 @@ ieee80211_get_stats64(struct net_device + dev_fetch_sw_netstats(stats, dev->tstats); + } + ++static int ieee80211_netdev_setup_tc(struct net_device *dev, ++ enum tc_setup_type type, void *type_data) ++{ ++ struct ieee80211_sub_if_data *sdata; ++ struct ieee80211_local *local; ++ ++ sdata = IEEE80211_DEV_TO_SUB_IF(dev); ++ local = sdata->local; ++ ++ if (!local->ops->net_setup_tc) ++ return -EOPNOTSUPP; ++ ++ return drv_net_setup_tc(local, sdata, dev, type, type_data); ++} ++ + static const struct net_device_ops ieee80211_dataif_ops = { + .ndo_open = ieee80211_open, + .ndo_stop = ieee80211_stop, +@@ -821,6 +836,7 @@ static const struct net_device_ops ieee8 + .ndo_set_rx_mode = ieee80211_set_multicast_list, + .ndo_set_mac_address = ieee80211_change_mac, + .ndo_get_stats64 = ieee80211_get_stats64, ++ .ndo_setup_tc = ieee80211_netdev_setup_tc, + }; + + static u16 ieee80211_monitor_select_queue(struct net_device *dev, +@@ -929,6 +945,7 @@ static const struct net_device_ops ieee8 + .ndo_set_mac_address = ieee80211_change_mac, + .ndo_get_stats64 = ieee80211_get_stats64, + .ndo_fill_forward_path = ieee80211_netdev_fill_forward_path, ++ .ndo_setup_tc = ieee80211_netdev_setup_tc, + }; + + static bool ieee80211_iftype_supports_hdr_offload(enum nl80211_iftype iftype) +--- a/net/mac80211/trace.h ++++ b/net/mac80211/trace.h +@@ -2478,6 +2478,31 @@ DEFINE_EVENT(sta_event, drv_net_fill_for + TP_ARGS(local, sdata, sta) + ); + ++TRACE_EVENT(drv_net_setup_tc, ++ TP_PROTO(struct ieee80211_local *local, ++ struct ieee80211_sub_if_data *sdata, ++ u8 type), ++ ++ TP_ARGS(local, sdata, type), ++ ++ TP_STRUCT__entry( ++ LOCAL_ENTRY ++ VIF_ENTRY ++ __field(u8, type) ++ ), ++ ++ TP_fast_assign( ++ LOCAL_ASSIGN; ++ VIF_ASSIGN; ++ __entry->type = type; ++ ), ++ ++ TP_printk( ++ LOCAL_PR_FMT VIF_PR_FMT " type:%d\n", ++ LOCAL_PR_ARG, VIF_PR_ARG, __entry->type ++ ) ++); ++ + TRACE_EVENT(drv_change_vif_links, + TP_PROTO(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, diff --git a/package/kernel/mac80211/patches/subsys/328-mac80211-do-not-wake-queues-on-a-vif-that-is-being-s.patch b/package/kernel/mac80211/patches/subsys/328-mac80211-do-not-wake-queues-on-a-vif-that-is-being-s.patch deleted file mode 100644 index f0150ddef0..0000000000 --- a/package/kernel/mac80211/patches/subsys/328-mac80211-do-not-wake-queues-on-a-vif-that-is-being-s.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: Felix Fietkau -Date: Sat, 26 Mar 2022 23:58:35 +0100 -Subject: [PATCH] mac80211: do not wake queues on a vif that is being stopped - -When a vif is being removed and sdata->bss is cleared, __ieee80211_wake_txqs -can still be called on it, which crashes as soon as sdata->bss is being -dereferenced. -To fix this properly, check for SDATA_STATE_RUNNING before waking queues, -and take the fq lock when setting it (to ensure that __ieee80211_wake_txqs -observes the change when running on a different CPU - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -377,7 +377,9 @@ static void ieee80211_do_stop(struct iee - bool cancel_scan; - struct cfg80211_nan_func *func; - -+ spin_lock_bh(&local->fq.lock); - clear_bit(SDATA_STATE_RUNNING, &sdata->state); -+ spin_unlock_bh(&local->fq.lock); - - cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; - if (cancel_scan) ---- a/net/mac80211/util.c -+++ b/net/mac80211/util.c -@@ -301,6 +301,9 @@ static void __ieee80211_wake_txqs(struct - local_bh_disable(); - spin_lock(&fq->lock); - -+ if (!test_bit(SDATA_STATE_RUNNING, &sdata->state)) -+ goto out; -+ - if (sdata->vif.type == NL80211_IFTYPE_AP) - ps = &sdata->bss->ps; - diff --git a/package/kernel/mac80211/patches/subsys/329-wifi-mac80211-fix-receiving-mesh-packets-in-forwardi.patch b/package/kernel/mac80211/patches/subsys/329-wifi-mac80211-fix-receiving-mesh-packets-in-forwardi.patch new file mode 100644 index 0000000000..6882694da8 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/329-wifi-mac80211-fix-receiving-mesh-packets-in-forwardi.patch @@ -0,0 +1,50 @@ +From: Felix Fietkau +Date: Sun, 26 Mar 2023 17:11:34 +0200 +Subject: [PATCH] wifi: mac80211: fix receiving mesh packets in forwarding=0 + networks +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When forwarding is set to 0, frames are typically sent with ttl=1. +Move the ttl decrement check below the check for local receive in order to +fix packet drops. + +Reported-by: Thomas Hühn +Reported-by: Nick Hainke +Fixes: 986e43b19ae9 ("wifi: mac80211: fix receiving A-MSDU frames on mesh interfaces") +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2828,14 +2828,6 @@ ieee80211_rx_mesh_data(struct ieee80211_ + if (sdata->crypto_tx_tailroom_needed_cnt) + tailroom = IEEE80211_ENCRYPT_TAILROOM; + +- if (!--mesh_hdr->ttl) { +- if (multicast) +- goto rx_accept; +- +- IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_ttl); +- return RX_DROP_MONITOR; +- } +- + if (mesh_hdr->flags & MESH_FLAGS_AE) { + struct mesh_path *mppath; + char *proxied_addr; +@@ -2874,6 +2866,14 @@ ieee80211_rx_mesh_data(struct ieee80211_ + if (ether_addr_equal(sdata->vif.addr, eth->h_dest)) + goto rx_accept; + ++ if (!--mesh_hdr->ttl) { ++ if (multicast) ++ goto rx_accept; ++ ++ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_ttl); ++ return RX_DROP_MONITOR; ++ } ++ + if (!ifmsh->mshcfg.dot11MeshForwarding) { + if (is_multicast_ether_addr(eth->h_dest)) + goto rx_accept; diff --git a/package/kernel/mac80211/patches/subsys/330-mac80211-switch-airtime-fairness-back-to-deficit-rou.patch b/package/kernel/mac80211/patches/subsys/330-mac80211-switch-airtime-fairness-back-to-deficit-rou.patch deleted file mode 100644 index e59036f5a2..0000000000 --- a/package/kernel/mac80211/patches/subsys/330-mac80211-switch-airtime-fairness-back-to-deficit-rou.patch +++ /dev/null @@ -1,1249 +0,0 @@ -From: Felix Fietkau -Date: Sun, 19 Jun 2022 23:13:05 +0200 -Subject: [PATCH] mac80211: switch airtime fairness back to deficit round-robin - scheduling - -This reverts commits 6a789ba679d652587532cec2a0e0274fda172f3b and -2433647bc8d983a543e7d31b41ca2de1c7e2c198. - -The virtual time scheduler code has a number of issues: -- queues slowed down by hardware/firmware powersave handling were not properly - handled. -- on ath10k in push-pull mode, tx queues that the driver tries to pull from - were starved, causing excessive latency -- delay between tx enqueue and reported airtime use were causing excessively - bursty tx behavior - -The bursty behavior may also be present on the round-robin scheduler, but there -it is much easier to fix without introducing additional regressions - -Signed-off-by: Felix Fietkau ---- - ---- a/include/net/mac80211.h -+++ b/include/net/mac80211.h -@@ -6666,6 +6666,9 @@ static inline void ieee80211_txq_schedul - { - } - -+void __ieee80211_schedule_txq(struct ieee80211_hw *hw, -+ struct ieee80211_txq *txq, bool force); -+ - /** - * ieee80211_schedule_txq - schedule a TXQ for transmission - * -@@ -6678,7 +6681,11 @@ static inline void ieee80211_txq_schedul - * The driver may call this function if it has buffered packets for - * this TXQ internally. - */ --void ieee80211_schedule_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq); -+static inline void -+ieee80211_schedule_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq) -+{ -+ __ieee80211_schedule_txq(hw, txq, true); -+} - - /** - * ieee80211_return_txq - return a TXQ previously acquired by ieee80211_next_txq() -@@ -6690,8 +6697,12 @@ void ieee80211_schedule_txq(struct ieee8 - * The driver may set force=true if it has buffered packets for this TXQ - * internally. - */ --void ieee80211_return_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq, -- bool force); -+static inline void -+ieee80211_return_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq, -+ bool force) -+{ -+ __ieee80211_schedule_txq(hw, txq, force); -+} - - /** - * ieee80211_txq_may_transmit - check whether TXQ is allowed to transmit ---- a/net/mac80211/cfg.c -+++ b/net/mac80211/cfg.c -@@ -1554,38 +1554,6 @@ static void sta_apply_mesh_params(struct - #endif - } - --static void sta_apply_airtime_params(struct ieee80211_local *local, -- struct sta_info *sta, -- struct station_parameters *params) --{ -- u8 ac; -- -- for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { -- struct airtime_sched_info *air_sched = &local->airtime[ac]; -- struct airtime_info *air_info = &sta->airtime[ac]; -- struct txq_info *txqi; -- u8 tid; -- -- spin_lock_bh(&air_sched->lock); -- for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { -- if (air_info->weight == params->airtime_weight || -- !sta->sta.txq[tid] || -- ac != ieee80211_ac_from_tid(tid)) -- continue; -- -- airtime_weight_set(air_info, params->airtime_weight); -- -- txqi = to_txq_info(sta->sta.txq[tid]); -- if (RB_EMPTY_NODE(&txqi->schedule_order)) -- continue; -- -- ieee80211_update_airtime_weight(local, air_sched, -- 0, true); -- } -- spin_unlock_bh(&air_sched->lock); -- } --} -- - static int sta_apply_parameters(struct ieee80211_local *local, - struct sta_info *sta, - struct station_parameters *params) -@@ -1773,8 +1741,7 @@ static int sta_apply_parameters(struct i - sta_apply_mesh_params(local, sta, params); - - if (params->airtime_weight) -- sta_apply_airtime_params(local, sta, params); -- -+ sta->airtime_weight = params->airtime_weight; - - /* set the STA state after all sta info from usermode has been set */ - if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) || ---- a/net/mac80211/debugfs.c -+++ b/net/mac80211/debugfs.c -@@ -216,14 +216,14 @@ static ssize_t aql_txq_limit_read(struct - "VI %u %u\n" - "BE %u %u\n" - "BK %u %u\n", -- local->airtime[IEEE80211_AC_VO].aql_txq_limit_low, -- local->airtime[IEEE80211_AC_VO].aql_txq_limit_high, -- local->airtime[IEEE80211_AC_VI].aql_txq_limit_low, -- local->airtime[IEEE80211_AC_VI].aql_txq_limit_high, -- local->airtime[IEEE80211_AC_BE].aql_txq_limit_low, -- local->airtime[IEEE80211_AC_BE].aql_txq_limit_high, -- local->airtime[IEEE80211_AC_BK].aql_txq_limit_low, -- local->airtime[IEEE80211_AC_BK].aql_txq_limit_high); -+ local->aql_txq_limit_low[IEEE80211_AC_VO], -+ local->aql_txq_limit_high[IEEE80211_AC_VO], -+ local->aql_txq_limit_low[IEEE80211_AC_VI], -+ local->aql_txq_limit_high[IEEE80211_AC_VI], -+ local->aql_txq_limit_low[IEEE80211_AC_BE], -+ local->aql_txq_limit_high[IEEE80211_AC_BE], -+ local->aql_txq_limit_low[IEEE80211_AC_BK], -+ local->aql_txq_limit_high[IEEE80211_AC_BK]); - return simple_read_from_buffer(user_buf, count, ppos, - buf, len); - } -@@ -255,11 +255,11 @@ static ssize_t aql_txq_limit_write(struc - if (ac >= IEEE80211_NUM_ACS) - return -EINVAL; - -- q_limit_low_old = local->airtime[ac].aql_txq_limit_low; -- q_limit_high_old = local->airtime[ac].aql_txq_limit_high; -+ q_limit_low_old = local->aql_txq_limit_low[ac]; -+ q_limit_high_old = local->aql_txq_limit_high[ac]; - -- local->airtime[ac].aql_txq_limit_low = q_limit_low; -- local->airtime[ac].aql_txq_limit_high = q_limit_high; -+ local->aql_txq_limit_low[ac] = q_limit_low; -+ local->aql_txq_limit_high[ac] = q_limit_high; - - mutex_lock(&local->sta_mtx); - list_for_each_entry(sta, &local->sta_list, list) { -@@ -382,46 +382,6 @@ static const struct file_operations forc - .llseek = default_llseek, - }; - --static ssize_t airtime_read(struct file *file, -- char __user *user_buf, -- size_t count, -- loff_t *ppos) --{ -- struct ieee80211_local *local = file->private_data; -- char buf[200]; -- u64 v_t[IEEE80211_NUM_ACS]; -- u64 wt[IEEE80211_NUM_ACS]; -- int len = 0, ac; -- -- for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { -- spin_lock_bh(&local->airtime[ac].lock); -- v_t[ac] = local->airtime[ac].v_t; -- wt[ac] = local->airtime[ac].weight_sum; -- spin_unlock_bh(&local->airtime[ac].lock); -- } -- len = scnprintf(buf, sizeof(buf), -- "\tVO VI BE BK\n" -- "Virt-t\t%-10llu %-10llu %-10llu %-10llu\n" -- "Weight\t%-10llu %-10llu %-10llu %-10llu\n", -- v_t[0], -- v_t[1], -- v_t[2], -- v_t[3], -- wt[0], -- wt[1], -- wt[2], -- wt[3]); -- -- return simple_read_from_buffer(user_buf, count, ppos, -- buf, len); --} -- --static const struct file_operations airtime_ops = { -- .read = airtime_read, -- .open = simple_open, -- .llseek = default_llseek, --}; -- - #ifdef CONFIG_PM - static ssize_t reset_write(struct file *file, const char __user *user_buf, - size_t count, loff_t *ppos) -@@ -672,11 +632,7 @@ void debugfs_hw_add(struct ieee80211_loc - if (local->ops->wake_tx_queue) - DEBUGFS_ADD_MODE(aqm, 0600); - -- if (wiphy_ext_feature_isset(local->hw.wiphy, -- NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) { -- DEBUGFS_ADD_MODE(airtime, 0600); -- DEBUGFS_ADD_MODE(airtime_flags, 0600); -- } -+ DEBUGFS_ADD_MODE(airtime_flags, 0600); - - DEBUGFS_ADD(aql_txq_limit); - debugfs_create_u32("aql_threshold", 0600, ---- a/net/mac80211/debugfs_netdev.c -+++ b/net/mac80211/debugfs_netdev.c -@@ -512,34 +512,6 @@ static ssize_t ieee80211_if_fmt_aqm( - } - IEEE80211_IF_FILE_R(aqm); - --static ssize_t ieee80211_if_fmt_airtime( -- const struct ieee80211_sub_if_data *sdata, char *buf, int buflen) --{ -- struct ieee80211_local *local = sdata->local; -- struct ieee80211_txq *txq = sdata->vif.txq; -- struct airtime_info *air_info; -- int len; -- -- if (!txq) -- return 0; -- -- spin_lock_bh(&local->airtime[txq->ac].lock); -- air_info = to_airtime_info(txq); -- len = scnprintf(buf, -- buflen, -- "RX: %llu us\nTX: %llu us\nWeight: %u\n" -- "Virt-T: %lld us\n", -- air_info->rx_airtime, -- air_info->tx_airtime, -- air_info->weight, -- air_info->v_t); -- spin_unlock_bh(&local->airtime[txq->ac].lock); -- -- return len; --} -- --IEEE80211_IF_FILE_R(airtime); -- - IEEE80211_IF_FILE(multicast_to_unicast, u.ap.multicast_to_unicast, HEX); - - /* IBSS attributes */ -@@ -685,10 +657,8 @@ static void add_common_files(struct ieee - - if (sdata->local->ops->wake_tx_queue && - sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && -- sdata->vif.type != NL80211_IFTYPE_NAN) { -+ sdata->vif.type != NL80211_IFTYPE_NAN) - DEBUGFS_ADD(aqm); -- DEBUGFS_ADD(airtime); -- } - } - - static void add_sta_files(struct ieee80211_sub_if_data *sdata) ---- a/net/mac80211/debugfs_sta.c -+++ b/net/mac80211/debugfs_sta.c -@@ -202,7 +202,7 @@ static ssize_t sta_airtime_read(struct f - size_t bufsz = 400; - char *buf = kzalloc(bufsz, GFP_KERNEL), *p = buf; - u64 rx_airtime = 0, tx_airtime = 0; -- u64 v_t[IEEE80211_NUM_ACS]; -+ s64 deficit[IEEE80211_NUM_ACS]; - ssize_t rv; - int ac; - -@@ -210,18 +210,18 @@ static ssize_t sta_airtime_read(struct f - return -ENOMEM; - - for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { -- spin_lock_bh(&local->airtime[ac].lock); -+ spin_lock_bh(&local->active_txq_lock[ac]); - rx_airtime += sta->airtime[ac].rx_airtime; - tx_airtime += sta->airtime[ac].tx_airtime; -- v_t[ac] = sta->airtime[ac].v_t; -- spin_unlock_bh(&local->airtime[ac].lock); -+ deficit[ac] = sta->airtime[ac].deficit; -+ spin_unlock_bh(&local->active_txq_lock[ac]); - } - - p += scnprintf(p, bufsz + buf - p, - "RX: %llu us\nTX: %llu us\nWeight: %u\n" -- "Virt-T: VO: %lld us VI: %lld us BE: %lld us BK: %lld us\n", -- rx_airtime, tx_airtime, sta->airtime[0].weight, -- v_t[0], v_t[1], v_t[2], v_t[3]); -+ "Deficit: VO: %lld us VI: %lld us BE: %lld us BK: %lld us\n", -+ rx_airtime, tx_airtime, sta->airtime_weight, -+ deficit[0], deficit[1], deficit[2], deficit[3]); - - rv = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf); - kfree(buf); -@@ -236,11 +236,11 @@ static ssize_t sta_airtime_write(struct - int ac; - - for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { -- spin_lock_bh(&local->airtime[ac].lock); -+ spin_lock_bh(&local->active_txq_lock[ac]); - sta->airtime[ac].rx_airtime = 0; - sta->airtime[ac].tx_airtime = 0; -- sta->airtime[ac].v_t = 0; -- spin_unlock_bh(&local->airtime[ac].lock); -+ sta->airtime[ac].deficit = sta->airtime_weight; -+ spin_unlock_bh(&local->active_txq_lock[ac]); - } - - return count; -@@ -263,10 +263,10 @@ static ssize_t sta_aql_read(struct file - return -ENOMEM; - - for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { -- spin_lock_bh(&local->airtime[ac].lock); -+ spin_lock_bh(&local->active_txq_lock[ac]); - q_limit_l[ac] = sta->airtime[ac].aql_limit_low; - q_limit_h[ac] = sta->airtime[ac].aql_limit_high; -- spin_unlock_bh(&local->airtime[ac].lock); -+ spin_unlock_bh(&local->active_txq_lock[ac]); - q_depth[ac] = atomic_read(&sta->airtime[ac].aql_tx_pending); - } - ---- a/net/mac80211/ieee80211_i.h -+++ b/net/mac80211/ieee80211_i.h -@@ -862,16 +862,20 @@ enum txq_info_flags { - * @def_flow: used as a fallback flow when a packet destined to @tin hashes to - * a fq_flow which is already owned by a different tin - * @def_cvars: codel vars for @def_flow -- * @schedule_order: used with ieee80211_local->active_txqs - * @frags: used to keep fragments created after dequeue -+ * @schedule_order: used with ieee80211_local->active_txqs -+ * @schedule_round: counter to prevent infinite loops on TXQ scheduling - */ - struct txq_info { - struct fq_tin tin; - struct codel_vars def_cvars; - struct codel_stats cstats; -- struct rb_node schedule_order; -+ -+ u16 schedule_round; -+ struct list_head schedule_order; - - struct sk_buff_head frags; -+ - unsigned long flags; - - /* keep last! */ -@@ -948,8 +952,6 @@ struct ieee80211_sub_if_data { - struct ieee80211_tx_queue_params tx_conf[IEEE80211_NUM_ACS]; - struct mac80211_qos_map __rcu *qos_map; - -- struct airtime_info airtime[IEEE80211_NUM_ACS]; -- - struct work_struct csa_finalize_work; - bool csa_block_tx; /* write-protected by sdata_lock and local->mtx */ - struct cfg80211_chan_def csa_chandef; -@@ -1184,44 +1186,6 @@ enum mac80211_scan_state { - SCAN_ABORT, - }; - --/** -- * struct airtime_sched_info - state used for airtime scheduling and AQL -- * -- * @lock: spinlock that protects all the fields in this struct -- * @active_txqs: rbtree of currently backlogged queues, sorted by virtual time -- * @schedule_pos: the current position maintained while a driver walks the tree -- * with ieee80211_next_txq() -- * @active_list: list of struct airtime_info structs that were active within -- * the last AIRTIME_ACTIVE_DURATION (100 ms), used to compute -- * weight_sum -- * @last_weight_update: used for rate limiting walking active_list -- * @last_schedule_time: tracks the last time a transmission was scheduled; used -- * for catching up v_t if no stations are eligible for -- * transmission. -- * @v_t: global virtual time; queues with v_t < this are eligible for -- * transmission -- * @weight_sum: total sum of all active stations used for dividing airtime -- * @weight_sum_reciprocal: reciprocal of weight_sum (to avoid divisions in fast -- * path - see comment above -- * IEEE80211_RECIPROCAL_DIVISOR_64) -- * @aql_txq_limit_low: AQL limit when total outstanding airtime -- * is < IEEE80211_AQL_THRESHOLD -- * @aql_txq_limit_high: AQL limit when total outstanding airtime -- * is > IEEE80211_AQL_THRESHOLD -- */ --struct airtime_sched_info { -- spinlock_t lock; -- struct rb_root_cached active_txqs; -- struct rb_node *schedule_pos; -- struct list_head active_list; -- u64 last_weight_update; -- u64 last_schedule_activity; -- u64 v_t; -- u64 weight_sum; -- u64 weight_sum_reciprocal; -- u32 aql_txq_limit_low; -- u32 aql_txq_limit_high; --}; - DECLARE_STATIC_KEY_FALSE(aql_disable); - - struct ieee80211_local { -@@ -1235,8 +1199,13 @@ struct ieee80211_local { - struct codel_params cparams; - - /* protects active_txqs and txqi->schedule_order */ -- struct airtime_sched_info airtime[IEEE80211_NUM_ACS]; -+ spinlock_t active_txq_lock[IEEE80211_NUM_ACS]; -+ struct list_head active_txqs[IEEE80211_NUM_ACS]; -+ u16 schedule_round[IEEE80211_NUM_ACS]; -+ - u16 airtime_flags; -+ u32 aql_txq_limit_low[IEEE80211_NUM_ACS]; -+ u32 aql_txq_limit_high[IEEE80211_NUM_ACS]; - u32 aql_threshold; - atomic_t aql_total_pending_airtime; - -@@ -1660,125 +1629,6 @@ static inline bool txq_has_queue(struct - return !(skb_queue_empty(&txqi->frags) && !txqi->tin.backlog_packets); - } - --static inline struct airtime_info *to_airtime_info(struct ieee80211_txq *txq) --{ -- struct ieee80211_sub_if_data *sdata; -- struct sta_info *sta; -- -- if (txq->sta) { -- sta = container_of(txq->sta, struct sta_info, sta); -- return &sta->airtime[txq->ac]; -- } -- -- sdata = vif_to_sdata(txq->vif); -- return &sdata->airtime[txq->ac]; --} -- --/* To avoid divisions in the fast path, we keep pre-computed reciprocals for -- * airtime weight calculations. There are two different weights to keep track -- * of: The per-station weight and the sum of weights per phy. -- * -- * For the per-station weights (kept in airtime_info below), we use 32-bit -- * reciprocals with a devisor of 2^19. This lets us keep the multiplications and -- * divisions for the station weights as 32-bit operations at the cost of a bit -- * of rounding error for high weights; but the choice of divisor keeps rounding -- * errors <10% for weights <2^15, assuming no more than 8ms of airtime is -- * reported at a time. -- * -- * For the per-phy sum of weights the values can get higher, so we use 64-bit -- * operations for those with a 32-bit divisor, which should avoid any -- * significant rounding errors. -- */ --#define IEEE80211_RECIPROCAL_DIVISOR_64 0x100000000ULL --#define IEEE80211_RECIPROCAL_SHIFT_64 32 --#define IEEE80211_RECIPROCAL_DIVISOR_32 0x80000U --#define IEEE80211_RECIPROCAL_SHIFT_32 19 -- --static inline void airtime_weight_set(struct airtime_info *air_info, u16 weight) --{ -- if (air_info->weight == weight) -- return; -- -- air_info->weight = weight; -- if (weight) { -- air_info->weight_reciprocal = -- IEEE80211_RECIPROCAL_DIVISOR_32 / weight; -- } else { -- air_info->weight_reciprocal = 0; -- } --} -- --static inline void airtime_weight_sum_set(struct airtime_sched_info *air_sched, -- int weight_sum) --{ -- if (air_sched->weight_sum == weight_sum) -- return; -- -- air_sched->weight_sum = weight_sum; -- if (air_sched->weight_sum) { -- air_sched->weight_sum_reciprocal = IEEE80211_RECIPROCAL_DIVISOR_64; -- do_div(air_sched->weight_sum_reciprocal, air_sched->weight_sum); -- } else { -- air_sched->weight_sum_reciprocal = 0; -- } --} -- --/* A problem when trying to enforce airtime fairness is that we want to divide -- * the airtime between the currently *active* stations. However, basing this on -- * the instantaneous queue state of stations doesn't work, as queues tend to -- * oscillate very quickly between empty and occupied, leading to the scheduler -- * thinking only a single station is active when deciding whether to allow -- * transmission (and thus not throttling correctly). -- * -- * To fix this we use a timer-based notion of activity: a station is considered -- * active if it has been scheduled within the last 100 ms; we keep a separate -- * list of all the stations considered active in this manner, and lazily update -- * the total weight of active stations from this list (filtering the stations in -- * the list by their 'last active' time). -- * -- * We add one additional safeguard to guard against stations that manage to get -- * scheduled every 100 ms but don't transmit a lot of data, and thus don't use -- * up any airtime. Such stations would be able to get priority for an extended -- * period of time if they do start transmitting at full capacity again, and so -- * we add an explicit maximum for how far behind a station is allowed to fall in -- * the virtual airtime domain. This limit is set to a relatively high value of -- * 20 ms because the main mechanism for catching up idle stations is the active -- * state as described above; i.e., the hard limit should only be hit in -- * pathological cases. -- */ --#define AIRTIME_ACTIVE_DURATION (100 * NSEC_PER_MSEC) --#define AIRTIME_MAX_BEHIND 20000 /* 20 ms */ -- --static inline bool airtime_is_active(struct airtime_info *air_info, u64 now) --{ -- return air_info->last_scheduled >= now - AIRTIME_ACTIVE_DURATION; --} -- --static inline void airtime_set_active(struct airtime_sched_info *air_sched, -- struct airtime_info *air_info, u64 now) --{ -- air_info->last_scheduled = now; -- air_sched->last_schedule_activity = now; -- list_move_tail(&air_info->list, &air_sched->active_list); --} -- --static inline bool airtime_catchup_v_t(struct airtime_sched_info *air_sched, -- u64 v_t, u64 now) --{ -- air_sched->v_t = v_t; -- return true; --} -- --static inline void init_airtime_info(struct airtime_info *air_info, -- struct airtime_sched_info *air_sched) --{ -- atomic_set(&air_info->aql_tx_pending, 0); -- air_info->aql_limit_low = air_sched->aql_txq_limit_low; -- air_info->aql_limit_high = air_sched->aql_txq_limit_high; -- airtime_weight_set(air_info, IEEE80211_DEFAULT_AIRTIME_WEIGHT); -- INIT_LIST_HEAD(&air_info->list); --} -- - static inline int ieee80211_bssid_match(const u8 *raddr, const u8 *addr) - { - return ether_addr_equal(raddr, addr) || -@@ -2024,14 +1874,6 @@ int ieee80211_tx_control_port(struct wip - u64 *cookie); - int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev, - const u8 *buf, size_t len); --void ieee80211_resort_txq(struct ieee80211_hw *hw, -- struct ieee80211_txq *txq); --void ieee80211_unschedule_txq(struct ieee80211_hw *hw, -- struct ieee80211_txq *txq, -- bool purge); --void ieee80211_update_airtime_weight(struct ieee80211_local *local, -- struct airtime_sched_info *air_sched, -- u64 now, bool force); - - /* HT */ - void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -2192,9 +2192,6 @@ int ieee80211_if_add(struct ieee80211_lo - } - } - -- for (i = 0; i < IEEE80211_NUM_ACS; i++) -- init_airtime_info(&sdata->airtime[i], &local->airtime[i]); -- - ieee80211_set_default_queues(sdata); - - sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; ---- a/net/mac80211/main.c -+++ b/net/mac80211/main.c -@@ -707,13 +707,10 @@ struct ieee80211_hw *ieee80211_alloc_hw_ - spin_lock_init(&local->queue_stop_reason_lock); - - for (i = 0; i < IEEE80211_NUM_ACS; i++) { -- struct airtime_sched_info *air_sched = &local->airtime[i]; -- -- air_sched->active_txqs = RB_ROOT_CACHED; -- INIT_LIST_HEAD(&air_sched->active_list); -- spin_lock_init(&air_sched->lock); -- air_sched->aql_txq_limit_low = IEEE80211_DEFAULT_AQL_TXQ_LIMIT_L; -- air_sched->aql_txq_limit_high = -+ INIT_LIST_HEAD(&local->active_txqs[i]); -+ spin_lock_init(&local->active_txq_lock[i]); -+ local->aql_txq_limit_low[i] = IEEE80211_DEFAULT_AQL_TXQ_LIMIT_L; -+ local->aql_txq_limit_high[i] = - IEEE80211_DEFAULT_AQL_TXQ_LIMIT_H; - } - ---- a/net/mac80211/rx.c -+++ b/net/mac80211/rx.c -@@ -1583,8 +1583,12 @@ static void sta_ps_start(struct sta_info - - for (tid = 0; tid < IEEE80211_NUM_TIDS; tid++) { - struct ieee80211_txq *txq = sta->sta.txq[tid]; -+ struct txq_info *txqi = to_txq_info(txq); - -- ieee80211_unschedule_txq(&local->hw, txq, false); -+ spin_lock(&local->active_txq_lock[txq->ac]); -+ if (!list_empty(&txqi->schedule_order)) -+ list_del_init(&txqi->schedule_order); -+ spin_unlock(&local->active_txq_lock[txq->ac]); - - if (txq_has_queue(txq)) - set_bit(tid, &sta->txq_buffered_tids); ---- a/net/mac80211/sta_info.c -+++ b/net/mac80211/sta_info.c -@@ -426,11 +426,15 @@ struct sta_info *sta_info_alloc(struct i - if (sta_prepare_rate_control(local, sta, gfp)) - goto free_txq; - -+ sta->airtime_weight = IEEE80211_DEFAULT_AIRTIME_WEIGHT; - - for (i = 0; i < IEEE80211_NUM_ACS; i++) { - skb_queue_head_init(&sta->ps_tx_buf[i]); - skb_queue_head_init(&sta->tx_filtered[i]); -- init_airtime_info(&sta->airtime[i], &local->airtime[i]); -+ sta->airtime[i].deficit = sta->airtime_weight; -+ atomic_set(&sta->airtime[i].aql_tx_pending, 0); -+ sta->airtime[i].aql_limit_low = local->aql_txq_limit_low[i]; -+ sta->airtime[i].aql_limit_high = local->aql_txq_limit_high[i]; - } - - for (i = 0; i < IEEE80211_NUM_TIDS; i++) -@@ -1889,59 +1893,24 @@ void ieee80211_sta_set_buffered(struct i - } - EXPORT_SYMBOL(ieee80211_sta_set_buffered); - --void ieee80211_register_airtime(struct ieee80211_txq *txq, -- u32 tx_airtime, u32 rx_airtime) -+void ieee80211_sta_register_airtime(struct ieee80211_sta *pubsta, u8 tid, -+ u32 tx_airtime, u32 rx_airtime) - { -- struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->vif); -- struct ieee80211_local *local = sdata->local; -- u64 weight_sum, weight_sum_reciprocal; -- struct airtime_sched_info *air_sched; -- struct airtime_info *air_info; -+ struct sta_info *sta = container_of(pubsta, struct sta_info, sta); -+ struct ieee80211_local *local = sta->sdata->local; -+ u8 ac = ieee80211_ac_from_tid(tid); - u32 airtime = 0; - -- air_sched = &local->airtime[txq->ac]; -- air_info = to_airtime_info(txq); -- -- if (local->airtime_flags & AIRTIME_USE_TX) -+ if (sta->local->airtime_flags & AIRTIME_USE_TX) - airtime += tx_airtime; -- if (local->airtime_flags & AIRTIME_USE_RX) -+ if (sta->local->airtime_flags & AIRTIME_USE_RX) - airtime += rx_airtime; - -- /* Weights scale so the unit weight is 256 */ -- airtime <<= 8; -- -- spin_lock_bh(&air_sched->lock); -- -- air_info->tx_airtime += tx_airtime; -- air_info->rx_airtime += rx_airtime; -- -- if (air_sched->weight_sum) { -- weight_sum = air_sched->weight_sum; -- weight_sum_reciprocal = air_sched->weight_sum_reciprocal; -- } else { -- weight_sum = air_info->weight; -- weight_sum_reciprocal = air_info->weight_reciprocal; -- } -- -- /* Round the calculation of global vt */ -- air_sched->v_t += (u64)((airtime + (weight_sum >> 1)) * -- weight_sum_reciprocal) >> IEEE80211_RECIPROCAL_SHIFT_64; -- air_info->v_t += (u32)((airtime + (air_info->weight >> 1)) * -- air_info->weight_reciprocal) >> IEEE80211_RECIPROCAL_SHIFT_32; -- ieee80211_resort_txq(&local->hw, txq); -- -- spin_unlock_bh(&air_sched->lock); --} -- --void ieee80211_sta_register_airtime(struct ieee80211_sta *pubsta, u8 tid, -- u32 tx_airtime, u32 rx_airtime) --{ -- struct ieee80211_txq *txq = pubsta->txq[tid]; -- -- if (!txq) -- return; -- -- ieee80211_register_airtime(txq, tx_airtime, rx_airtime); -+ spin_lock_bh(&local->active_txq_lock[ac]); -+ sta->airtime[ac].tx_airtime += tx_airtime; -+ sta->airtime[ac].rx_airtime += rx_airtime; -+ sta->airtime[ac].deficit -= airtime; -+ spin_unlock_bh(&local->active_txq_lock[ac]); - } - EXPORT_SYMBOL(ieee80211_sta_register_airtime); - -@@ -2385,7 +2354,7 @@ void sta_set_sinfo(struct sta_info *sta, - } - - if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_AIRTIME_WEIGHT))) { -- sinfo->airtime_weight = sta->airtime[0].weight; -+ sinfo->airtime_weight = sta->airtime_weight; - sinfo->filled |= BIT_ULL(NL80211_STA_INFO_AIRTIME_WEIGHT); - } - ---- a/net/mac80211/sta_info.h -+++ b/net/mac80211/sta_info.h -@@ -135,25 +135,18 @@ enum ieee80211_agg_stop_reason { - #define AIRTIME_USE_TX BIT(0) - #define AIRTIME_USE_RX BIT(1) - -- - struct airtime_info { - u64 rx_airtime; - u64 tx_airtime; -- u64 v_t; -- u64 last_scheduled; -- struct list_head list; -+ s64 deficit; - atomic_t aql_tx_pending; /* Estimated airtime for frames pending */ - u32 aql_limit_low; - u32 aql_limit_high; -- u32 weight_reciprocal; -- u16 weight; - }; - - void ieee80211_sta_update_pending_airtime(struct ieee80211_local *local, - struct sta_info *sta, u8 ac, - u16 tx_airtime, bool tx_completed); --void ieee80211_register_airtime(struct ieee80211_txq *txq, -- u32 tx_airtime, u32 rx_airtime); - - struct sta_info; - -@@ -523,6 +516,7 @@ struct ieee80211_fragment_cache { - * @tid_seq: per-TID sequence numbers for sending to this STA - * @airtime: per-AC struct airtime_info describing airtime statistics for this - * station -+ * @airtime_weight: station weight for airtime fairness calculation purposes - * @ampdu_mlme: A-MPDU state machine state - * @mesh: mesh STA information - * @debugfs_dir: debug filesystem directory dentry -@@ -653,6 +647,7 @@ struct sta_info { - u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1]; - - struct airtime_info airtime[IEEE80211_NUM_ACS]; -+ u16 airtime_weight; - - /* - * Aggregation information, locked with lock. ---- a/net/mac80211/status.c -+++ b/net/mac80211/status.c -@@ -983,25 +983,6 @@ static void __ieee80211_tx_status(struct - if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked) - ieee80211_frame_acked(sta, skb); - -- } else if (wiphy_ext_feature_isset(local->hw.wiphy, -- NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) { -- struct ieee80211_sub_if_data *sdata; -- struct ieee80211_txq *txq; -- u32 airtime; -- -- /* Account airtime to multicast queue */ -- sdata = ieee80211_sdata_from_skb(local, skb); -- -- if (sdata && (txq = sdata->vif.txq)) { -- airtime = info->status.tx_time ?: -- ieee80211_calc_expected_tx_airtime(hw, -- &sdata->vif, -- NULL, -- skb->len, -- false); -- -- ieee80211_register_airtime(txq, airtime, 0); -- } - } - - /* SNMP counters ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -18,7 +18,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -1480,7 +1479,7 @@ void ieee80211_txq_init(struct ieee80211 - codel_vars_init(&txqi->def_cvars); - codel_stats_init(&txqi->cstats); - __skb_queue_head_init(&txqi->frags); -- RB_CLEAR_NODE(&txqi->schedule_order); -+ INIT_LIST_HEAD(&txqi->schedule_order); - - txqi->txq.vif = &sdata->vif; - -@@ -1524,7 +1523,9 @@ void ieee80211_txq_purge(struct ieee8021 - ieee80211_purge_tx_queue(&local->hw, &txqi->frags); - spin_unlock_bh(&fq->lock); - -- ieee80211_unschedule_txq(&local->hw, &txqi->txq, true); -+ spin_lock_bh(&local->active_txq_lock[txqi->txq.ac]); -+ list_del_init(&txqi->schedule_order); -+ spin_unlock_bh(&local->active_txq_lock[txqi->txq.ac]); - } - - void ieee80211_txq_set_params(struct ieee80211_local *local) -@@ -3819,259 +3820,102 @@ EXPORT_SYMBOL(ieee80211_tx_dequeue); - struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, u8 ac) - { - struct ieee80211_local *local = hw_to_local(hw); -- struct airtime_sched_info *air_sched; -- u64 now = ktime_get_coarse_boottime_ns(); - struct ieee80211_txq *ret = NULL; -- struct airtime_info *air_info; -- struct txq_info *txqi = NULL; -- struct rb_node *node; -- bool first = false; -+ struct txq_info *txqi = NULL, *head = NULL; -+ bool found_eligible_txq = false; - -- air_sched = &local->airtime[ac]; -- spin_lock_bh(&air_sched->lock); -+ spin_lock_bh(&local->active_txq_lock[ac]); - -- node = air_sched->schedule_pos; -- --begin: -- if (!node) { -- node = rb_first_cached(&air_sched->active_txqs); -- first = true; -- } else { -- node = rb_next(node); -- } -- -- if (!node) -- goto out; -- -- txqi = container_of(node, struct txq_info, schedule_order); -- air_info = to_airtime_info(&txqi->txq); -- -- if (air_info->v_t > air_sched->v_t && -- (!first || !airtime_catchup_v_t(air_sched, air_info->v_t, now))) -+ begin: -+ txqi = list_first_entry_or_null(&local->active_txqs[ac], -+ struct txq_info, -+ schedule_order); -+ if (!txqi) - goto out; - -- if (!ieee80211_txq_airtime_check(hw, &txqi->txq)) { -- first = false; -- goto begin; -- } -- -- air_sched->schedule_pos = node; -- air_sched->last_schedule_activity = now; -- ret = &txqi->txq; --out: -- spin_unlock_bh(&air_sched->lock); -- return ret; --} --EXPORT_SYMBOL(ieee80211_next_txq); -- --static void __ieee80211_insert_txq(struct rb_root_cached *root, -- struct txq_info *txqi) --{ -- struct rb_node **new = &root->rb_root.rb_node; -- struct airtime_info *old_air, *new_air; -- struct rb_node *parent = NULL; -- struct txq_info *__txqi; -- bool leftmost = true; -- -- while (*new) { -- parent = *new; -- __txqi = rb_entry(parent, struct txq_info, schedule_order); -- old_air = to_airtime_info(&__txqi->txq); -- new_air = to_airtime_info(&txqi->txq); -- -- if (new_air->v_t <= old_air->v_t) { -- new = &parent->rb_left; -- } else { -- new = &parent->rb_right; -- leftmost = false; -- } -+ if (txqi == head) { -+ if (!found_eligible_txq) -+ goto out; -+ else -+ found_eligible_txq = false; - } - -- rb_link_node(&txqi->schedule_order, parent, new); -- rb_insert_color_cached(&txqi->schedule_order, root, leftmost); --} -- --void ieee80211_resort_txq(struct ieee80211_hw *hw, -- struct ieee80211_txq *txq) --{ -- struct airtime_info *air_info = to_airtime_info(txq); -- struct ieee80211_local *local = hw_to_local(hw); -- struct txq_info *txqi = to_txq_info(txq); -- struct airtime_sched_info *air_sched; -- -- air_sched = &local->airtime[txq->ac]; -+ if (!head) -+ head = txqi; - -- lockdep_assert_held(&air_sched->lock); -- -- if (!RB_EMPTY_NODE(&txqi->schedule_order)) { -- struct airtime_info *a_prev = NULL, *a_next = NULL; -- struct txq_info *t_prev, *t_next; -- struct rb_node *n_prev, *n_next; -+ if (txqi->txq.sta) { -+ struct sta_info *sta = container_of(txqi->txq.sta, -+ struct sta_info, sta); -+ bool aql_check = ieee80211_txq_airtime_check(hw, &txqi->txq); -+ s64 deficit = sta->airtime[txqi->txq.ac].deficit; - -- /* Erasing a node can cause an expensive rebalancing operation, -- * so we check the previous and next nodes first and only remove -- * and re-insert if the current node is not already in the -- * correct position. -- */ -- if ((n_prev = rb_prev(&txqi->schedule_order)) != NULL) { -- t_prev = container_of(n_prev, struct txq_info, -- schedule_order); -- a_prev = to_airtime_info(&t_prev->txq); -- } -+ if (aql_check) -+ found_eligible_txq = true; - -- if ((n_next = rb_next(&txqi->schedule_order)) != NULL) { -- t_next = container_of(n_next, struct txq_info, -- schedule_order); -- a_next = to_airtime_info(&t_next->txq); -+ if (deficit < 0) -+ sta->airtime[txqi->txq.ac].deficit += -+ sta->airtime_weight; -+ -+ if (deficit < 0 || !aql_check) { -+ list_move_tail(&txqi->schedule_order, -+ &local->active_txqs[txqi->txq.ac]); -+ goto begin; - } -- -- if ((!a_prev || a_prev->v_t <= air_info->v_t) && -- (!a_next || a_next->v_t > air_info->v_t)) -- return; -- -- if (air_sched->schedule_pos == &txqi->schedule_order) -- air_sched->schedule_pos = n_prev; -- -- rb_erase_cached(&txqi->schedule_order, -- &air_sched->active_txqs); -- RB_CLEAR_NODE(&txqi->schedule_order); -- __ieee80211_insert_txq(&air_sched->active_txqs, txqi); - } --} -- --void ieee80211_update_airtime_weight(struct ieee80211_local *local, -- struct airtime_sched_info *air_sched, -- u64 now, bool force) --{ -- struct airtime_info *air_info, *tmp; -- u64 weight_sum = 0; -- -- if (unlikely(!now)) -- now = ktime_get_coarse_boottime_ns(); -- -- lockdep_assert_held(&air_sched->lock); -- -- if (!force && (air_sched->last_weight_update < -- now - AIRTIME_ACTIVE_DURATION)) -- return; -- -- list_for_each_entry_safe(air_info, tmp, -- &air_sched->active_list, list) { -- if (airtime_is_active(air_info, now)) -- weight_sum += air_info->weight; -- else -- list_del_init(&air_info->list); -- } -- airtime_weight_sum_set(air_sched, weight_sum); -- air_sched->last_weight_update = now; --} - --void ieee80211_schedule_txq(struct ieee80211_hw *hw, -- struct ieee80211_txq *txq) -- __acquires(txq_lock) __releases(txq_lock) --{ -- struct ieee80211_local *local = hw_to_local(hw); -- struct txq_info *txqi = to_txq_info(txq); -- struct airtime_sched_info *air_sched; -- u64 now = ktime_get_coarse_boottime_ns(); -- struct airtime_info *air_info; -- u8 ac = txq->ac; -- bool was_active; - -- air_sched = &local->airtime[ac]; -- air_info = to_airtime_info(txq); -- -- spin_lock_bh(&air_sched->lock); -- was_active = airtime_is_active(air_info, now); -- airtime_set_active(air_sched, air_info, now); -- -- if (!RB_EMPTY_NODE(&txqi->schedule_order)) -+ if (txqi->schedule_round == local->schedule_round[ac]) - goto out; - -- /* If the station has been inactive for a while, catch up its v_t so it -- * doesn't get indefinite priority; see comment above the definition of -- * AIRTIME_MAX_BEHIND. -- */ -- if ((!was_active && air_info->v_t < air_sched->v_t) || -- air_info->v_t < air_sched->v_t - AIRTIME_MAX_BEHIND) -- air_info->v_t = air_sched->v_t; -- -- ieee80211_update_airtime_weight(local, air_sched, now, !was_active); -- __ieee80211_insert_txq(&air_sched->active_txqs, txqi); -+ list_del_init(&txqi->schedule_order); -+ txqi->schedule_round = local->schedule_round[ac]; -+ ret = &txqi->txq; - - out: -- spin_unlock_bh(&air_sched->lock); --} --EXPORT_SYMBOL(ieee80211_schedule_txq); -- --static void __ieee80211_unschedule_txq(struct ieee80211_hw *hw, -- struct ieee80211_txq *txq, -- bool purge) --{ -- struct ieee80211_local *local = hw_to_local(hw); -- struct txq_info *txqi = to_txq_info(txq); -- struct airtime_sched_info *air_sched; -- struct airtime_info *air_info; -- -- air_sched = &local->airtime[txq->ac]; -- air_info = to_airtime_info(&txqi->txq); -- -- lockdep_assert_held(&air_sched->lock); -- -- if (purge) { -- list_del_init(&air_info->list); -- ieee80211_update_airtime_weight(local, air_sched, 0, true); -- } -- -- if (RB_EMPTY_NODE(&txqi->schedule_order)) -- return; -- -- if (air_sched->schedule_pos == &txqi->schedule_order) -- air_sched->schedule_pos = rb_prev(&txqi->schedule_order); -- -- if (!purge) -- airtime_set_active(air_sched, air_info, -- ktime_get_coarse_boottime_ns()); -- -- rb_erase_cached(&txqi->schedule_order, -- &air_sched->active_txqs); -- RB_CLEAR_NODE(&txqi->schedule_order); -+ spin_unlock_bh(&local->active_txq_lock[ac]); -+ return ret; - } -+EXPORT_SYMBOL(ieee80211_next_txq); - --void ieee80211_unschedule_txq(struct ieee80211_hw *hw, -+void __ieee80211_schedule_txq(struct ieee80211_hw *hw, - struct ieee80211_txq *txq, -- bool purge) -- __acquires(txq_lock) __releases(txq_lock) --{ -- struct ieee80211_local *local = hw_to_local(hw); -- -- spin_lock_bh(&local->airtime[txq->ac].lock); -- __ieee80211_unschedule_txq(hw, txq, purge); -- spin_unlock_bh(&local->airtime[txq->ac].lock); --} -- --void ieee80211_return_txq(struct ieee80211_hw *hw, -- struct ieee80211_txq *txq, bool force) -+ bool force) - { - struct ieee80211_local *local = hw_to_local(hw); - struct txq_info *txqi = to_txq_info(txq); - -- spin_lock_bh(&local->airtime[txq->ac].lock); -+ spin_lock_bh(&local->active_txq_lock[txq->ac]); - -- if (!RB_EMPTY_NODE(&txqi->schedule_order) && !force && -- !txq_has_queue(txq)) -- __ieee80211_unschedule_txq(hw, txq, false); -+ if (list_empty(&txqi->schedule_order) && -+ (force || !skb_queue_empty(&txqi->frags) || -+ txqi->tin.backlog_packets)) { -+ /* If airtime accounting is active, always enqueue STAs at the -+ * head of the list to ensure that they only get moved to the -+ * back by the airtime DRR scheduler once they have a negative -+ * deficit. A station that already has a negative deficit will -+ * get immediately moved to the back of the list on the next -+ * call to ieee80211_next_txq(). -+ */ -+ if (txqi->txq.sta && local->airtime_flags && -+ wiphy_ext_feature_isset(local->hw.wiphy, -+ NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) -+ list_add(&txqi->schedule_order, -+ &local->active_txqs[txq->ac]); -+ else -+ list_add_tail(&txqi->schedule_order, -+ &local->active_txqs[txq->ac]); -+ } - -- spin_unlock_bh(&local->airtime[txq->ac].lock); -+ spin_unlock_bh(&local->active_txq_lock[txq->ac]); - } --EXPORT_SYMBOL(ieee80211_return_txq); -+EXPORT_SYMBOL(__ieee80211_schedule_txq); - - DEFINE_STATIC_KEY_FALSE(aql_disable); - - bool ieee80211_txq_airtime_check(struct ieee80211_hw *hw, - struct ieee80211_txq *txq) - { -- struct airtime_info *air_info = to_airtime_info(txq); -+ struct sta_info *sta; - struct ieee80211_local *local = hw_to_local(hw); - - if (!wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL)) -@@ -4086,12 +3930,15 @@ bool ieee80211_txq_airtime_check(struct - if (unlikely(txq->tid == IEEE80211_NUM_TIDS)) - return true; - -- if (atomic_read(&air_info->aql_tx_pending) < air_info->aql_limit_low) -+ sta = container_of(txq->sta, struct sta_info, sta); -+ if (atomic_read(&sta->airtime[txq->ac].aql_tx_pending) < -+ sta->airtime[txq->ac].aql_limit_low) - return true; - - if (atomic_read(&local->aql_total_pending_airtime) < - local->aql_threshold && -- atomic_read(&air_info->aql_tx_pending) < air_info->aql_limit_high) -+ atomic_read(&sta->airtime[txq->ac].aql_tx_pending) < -+ sta->airtime[txq->ac].aql_limit_high) - return true; - - return false; -@@ -4101,59 +3948,60 @@ EXPORT_SYMBOL(ieee80211_txq_airtime_chec - bool ieee80211_txq_may_transmit(struct ieee80211_hw *hw, - struct ieee80211_txq *txq) - { -- struct txq_info *first_txqi = NULL, *txqi = to_txq_info(txq); - struct ieee80211_local *local = hw_to_local(hw); -- struct airtime_sched_info *air_sched; -- struct airtime_info *air_info; -- struct rb_node *node = NULL; -- bool ret = false; -- u64 now; -- -+ struct txq_info *iter, *tmp, *txqi = to_txq_info(txq); -+ struct sta_info *sta; -+ u8 ac = txq->ac; - -- if (!ieee80211_txq_airtime_check(hw, txq)) -- return false; -+ spin_lock_bh(&local->active_txq_lock[ac]); - -- air_sched = &local->airtime[txq->ac]; -- spin_lock_bh(&air_sched->lock); -+ if (!txqi->txq.sta) -+ goto out; - -- if (RB_EMPTY_NODE(&txqi->schedule_order)) -+ if (list_empty(&txqi->schedule_order)) - goto out; - -- now = ktime_get_coarse_boottime_ns(); -+ list_for_each_entry_safe(iter, tmp, &local->active_txqs[ac], -+ schedule_order) { -+ if (iter == txqi) -+ break; - -- /* Like in ieee80211_next_txq(), make sure the first station in the -- * scheduling order is eligible for transmission to avoid starvation. -- */ -- node = rb_first_cached(&air_sched->active_txqs); -- if (node) { -- first_txqi = container_of(node, struct txq_info, -- schedule_order); -- air_info = to_airtime_info(&first_txqi->txq); -- -- if (air_sched->v_t < air_info->v_t) -- airtime_catchup_v_t(air_sched, air_info->v_t, now); -+ if (!iter->txq.sta) { -+ list_move_tail(&iter->schedule_order, -+ &local->active_txqs[ac]); -+ continue; -+ } -+ sta = container_of(iter->txq.sta, struct sta_info, sta); -+ if (sta->airtime[ac].deficit < 0) -+ sta->airtime[ac].deficit += sta->airtime_weight; -+ list_move_tail(&iter->schedule_order, &local->active_txqs[ac]); - } - -- air_info = to_airtime_info(&txqi->txq); -- if (air_info->v_t <= air_sched->v_t) { -- air_sched->last_schedule_activity = now; -- ret = true; -- } -+ sta = container_of(txqi->txq.sta, struct sta_info, sta); -+ if (sta->airtime[ac].deficit >= 0) -+ goto out; -+ -+ sta->airtime[ac].deficit += sta->airtime_weight; -+ list_move_tail(&txqi->schedule_order, &local->active_txqs[ac]); -+ spin_unlock_bh(&local->active_txq_lock[ac]); - -+ return false; - out: -- spin_unlock_bh(&air_sched->lock); -- return ret; -+ if (!list_empty(&txqi->schedule_order)) -+ list_del_init(&txqi->schedule_order); -+ spin_unlock_bh(&local->active_txq_lock[ac]); -+ -+ return true; - } - EXPORT_SYMBOL(ieee80211_txq_may_transmit); - - void ieee80211_txq_schedule_start(struct ieee80211_hw *hw, u8 ac) - { - struct ieee80211_local *local = hw_to_local(hw); -- struct airtime_sched_info *air_sched = &local->airtime[ac]; - -- spin_lock_bh(&air_sched->lock); -- air_sched->schedule_pos = NULL; -- spin_unlock_bh(&air_sched->lock); -+ spin_lock_bh(&local->active_txq_lock[ac]); -+ local->schedule_round[ac]++; -+ spin_unlock_bh(&local->active_txq_lock[ac]); - } - EXPORT_SYMBOL(ieee80211_txq_schedule_start); - diff --git a/package/kernel/mac80211/patches/subsys/330-wifi-ieee80211-correctly-mark-FTM-frames-non-buffera.patch b/package/kernel/mac80211/patches/subsys/330-wifi-ieee80211-correctly-mark-FTM-frames-non-buffera.patch new file mode 100644 index 0000000000..079dd2a868 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/330-wifi-ieee80211-correctly-mark-FTM-frames-non-buffera.patch @@ -0,0 +1,134 @@ +From: Johannes Berg +Date: Wed, 29 Mar 2023 16:46:26 +0200 +Subject: [PATCH] wifi: ieee80211: correctly mark FTM frames non-bufferable + +The checks of whether or not a frame is bufferable were not +taking into account that some action frames aren't, such as +FTM. Check this, which requires some changes to the function +ieee80211_is_bufferable_mmpdu() since we need the whole skb +for the checks now. + +Signed-off-by: Johannes Berg +Reviewed-by: Greenman, Gregory +Reviewed-by: Peer, Ilan +--- + +--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +@@ -601,8 +601,9 @@ static void iwl_mvm_skb_prepare_status(s + + static int iwl_mvm_get_ctrl_vif_queue(struct iwl_mvm *mvm, + struct ieee80211_tx_info *info, +- struct ieee80211_hdr *hdr) ++ struct sk_buff *skb) + { ++ struct ieee80211_hdr *hdr = (void *)skb->data; + struct iwl_mvm_vif *mvmvif = + iwl_mvm_vif_from_mac80211(info->control.vif); + __le16 fc = hdr->frame_control; +@@ -621,7 +622,7 @@ static int iwl_mvm_get_ctrl_vif_queue(st + * reason 7 ("Class 3 frame received from nonassociated STA"). + */ + if (ieee80211_is_mgmt(fc) && +- (!ieee80211_is_bufferable_mmpdu(fc) || ++ (!ieee80211_is_bufferable_mmpdu(skb) || + ieee80211_is_deauth(fc) || ieee80211_is_disassoc(fc))) + return mvm->probe_queue; + +@@ -740,7 +741,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mv + else + sta_id = mvmvif->mcast_sta.sta_id; + +- queue = iwl_mvm_get_ctrl_vif_queue(mvm, &info, hdr); ++ queue = iwl_mvm_get_ctrl_vif_queue(mvm, &info, skb); + } else if (info.control.vif->type == NL80211_IFTYPE_MONITOR) { + queue = mvm->snif_queue; + sta_id = mvm->snif_sta.sta_id; +--- a/include/linux/ieee80211.h ++++ b/include/linux/ieee80211.h +@@ -772,20 +772,6 @@ static inline bool ieee80211_is_any_null + } + + /** +- * ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU +- * @fc: frame control field in little-endian byteorder +- */ +-static inline bool ieee80211_is_bufferable_mmpdu(__le16 fc) +-{ +- /* IEEE 802.11-2012, definition of "bufferable management frame"; +- * note that this ignores the IBSS special case. */ +- return ieee80211_is_mgmt(fc) && +- (ieee80211_is_action(fc) || +- ieee80211_is_disassoc(fc) || +- ieee80211_is_deauth(fc)); +-} +- +-/** + * ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set + * @seq_ctrl: frame sequence control bytes in little-endian byteorder + */ +@@ -4121,6 +4107,44 @@ static inline u8 *ieee80211_get_DA(struc + } + + /** ++ * ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU ++ * @skb: the skb to check, starting with the 802.11 header ++ */ ++static inline bool ieee80211_is_bufferable_mmpdu(struct sk_buff *skb) ++{ ++ struct ieee80211_mgmt *mgmt = (void *)skb->data; ++ __le16 fc = mgmt->frame_control; ++ ++ /* ++ * IEEE 802.11 REVme D2.0 definition of bufferable MMPDU; ++ * note that this ignores the IBSS special case. ++ */ ++ if (!ieee80211_is_mgmt(fc)) ++ return false; ++ ++ if (ieee80211_is_disassoc(fc) || ieee80211_is_deauth(fc)) ++ return true; ++ ++ if (!ieee80211_is_action(fc)) ++ return false; ++ ++ if (skb->len < offsetofend(typeof(*mgmt), u.action.u.ftm.action_code)) ++ return true; ++ ++ /* action frame - additionally check for non-bufferable FTM */ ++ ++ if (mgmt->u.action.category != WLAN_CATEGORY_PUBLIC && ++ mgmt->u.action.category != WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION) ++ return true; ++ ++ if (mgmt->u.action.u.ftm.action_code == WLAN_PUB_ACTION_FTM_REQUEST || ++ mgmt->u.action.u.ftm.action_code == WLAN_PUBLIC_ACTION_FTM_RESPONSE) ++ return false; ++ ++ return true; ++} ++ ++/** + * _ieee80211_is_robust_mgmt_frame - check if frame is a robust management frame + * @hdr: the frame (buffer must include at least the first octet of payload) + */ +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -488,7 +488,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee + int ac = skb_get_queue_mapping(tx->skb); + + if (ieee80211_is_mgmt(hdr->frame_control) && +- !ieee80211_is_bufferable_mmpdu(hdr->frame_control)) { ++ !ieee80211_is_bufferable_mmpdu(tx->skb)) { + info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER; + return TX_CONTINUE; + } +@@ -1326,7 +1326,7 @@ static struct txq_info *ieee80211_get_tx + if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) && + unlikely(!ieee80211_is_data_present(hdr->frame_control))) { + if ((!ieee80211_is_mgmt(hdr->frame_control) || +- ieee80211_is_bufferable_mmpdu(hdr->frame_control) || ++ ieee80211_is_bufferable_mmpdu(skb) || + vif->type == NL80211_IFTYPE_STATION) && + sta && sta->uploaded) { + /* diff --git a/package/kernel/mac80211/patches/subsys/331-mac80211-make-sta-airtime-deficit-field-s32-instead-.patch b/package/kernel/mac80211/patches/subsys/331-mac80211-make-sta-airtime-deficit-field-s32-instead-.patch deleted file mode 100644 index c006d3762a..0000000000 --- a/package/kernel/mac80211/patches/subsys/331-mac80211-make-sta-airtime-deficit-field-s32-instead-.patch +++ /dev/null @@ -1,52 +0,0 @@ -From: Felix Fietkau -Date: Mon, 20 Jun 2022 14:53:04 +0200 -Subject: [PATCH] mac80211: make sta airtime deficit field s32 instead of - s64 - -32 bit is more than enough range for the airtime deficit - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/debugfs_sta.c -+++ b/net/mac80211/debugfs_sta.c -@@ -202,7 +202,7 @@ static ssize_t sta_airtime_read(struct f - size_t bufsz = 400; - char *buf = kzalloc(bufsz, GFP_KERNEL), *p = buf; - u64 rx_airtime = 0, tx_airtime = 0; -- s64 deficit[IEEE80211_NUM_ACS]; -+ s32 deficit[IEEE80211_NUM_ACS]; - ssize_t rv; - int ac; - -@@ -219,7 +219,7 @@ static ssize_t sta_airtime_read(struct f - - p += scnprintf(p, bufsz + buf - p, - "RX: %llu us\nTX: %llu us\nWeight: %u\n" -- "Deficit: VO: %lld us VI: %lld us BE: %lld us BK: %lld us\n", -+ "Deficit: VO: %d us VI: %d us BE: %d us BK: %d us\n", - rx_airtime, tx_airtime, sta->airtime_weight, - deficit[0], deficit[1], deficit[2], deficit[3]); - ---- a/net/mac80211/sta_info.h -+++ b/net/mac80211/sta_info.h -@@ -138,7 +138,7 @@ enum ieee80211_agg_stop_reason { - struct airtime_info { - u64 rx_airtime; - u64 tx_airtime; -- s64 deficit; -+ s32 deficit; - atomic_t aql_tx_pending; /* Estimated airtime for frames pending */ - u32 aql_limit_low; - u32 aql_limit_high; ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -3847,7 +3847,7 @@ struct ieee80211_txq *ieee80211_next_txq - struct sta_info *sta = container_of(txqi->txq.sta, - struct sta_info, sta); - bool aql_check = ieee80211_txq_airtime_check(hw, &txqi->txq); -- s64 deficit = sta->airtime[txqi->txq.ac].deficit; -+ s32 deficit = sta->airtime[txqi->txq.ac].deficit; - - if (aql_check) - found_eligible_txq = true; diff --git a/package/kernel/mac80211/patches/subsys/331-wifi-mac80211-flush-queues-on-STA-removal.patch b/package/kernel/mac80211/patches/subsys/331-wifi-mac80211-flush-queues-on-STA-removal.patch new file mode 100644 index 0000000000..00232ec1b9 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/331-wifi-mac80211-flush-queues-on-STA-removal.patch @@ -0,0 +1,36 @@ +From: Johannes Berg +Date: Mon, 13 Mar 2023 11:42:12 +0100 +Subject: [PATCH] wifi: mac80211: flush queues on STA removal + +When we remove a station, we first make it unreachable, +then we (must) remove its keys, and then remove the +station itself. Depending on the hardware design, if +we have hardware crypto at all, frames still sitting +on hardware queues may then be transmitted without a +valid key, possibly unencrypted or with a fixed key. + +Fix this by flushing the queues when removing stations +so this cannot happen. + +Cc: stable@vger.kernel.org +Signed-off-by: Johannes Berg +Reviewed-by: Greenman, Gregory +--- + +--- a/net/mac80211/sta_info.c ++++ b/net/mac80211/sta_info.c +@@ -1271,6 +1271,14 @@ static void __sta_info_destroy_part2(str + WARN_ON_ONCE(ret); + } + ++ /* Flush queues before removing keys, as that might remove them ++ * from hardware, and then depending on the offload method, any ++ * frames sitting on hardware queues might be sent out without ++ * any encryption at all. ++ */ ++ if (local->ops->set_key) ++ ieee80211_flush_queues(local, sta->sdata, false); ++ + /* now keys can no longer be reached */ + ieee80211_free_sta_keys(local, sta); + diff --git a/package/kernel/mac80211/patches/subsys/332-mac80211-consider-aql_tx_pending-when-checking-airti.patch b/package/kernel/mac80211/patches/subsys/332-mac80211-consider-aql_tx_pending-when-checking-airti.patch deleted file mode 100644 index c214294603..0000000000 --- a/package/kernel/mac80211/patches/subsys/332-mac80211-consider-aql_tx_pending-when-checking-airti.patch +++ /dev/null @@ -1,48 +0,0 @@ -From: Felix Fietkau -Date: Mon, 20 Jun 2022 14:59:09 +0200 -Subject: [PATCH] mac80211: consider aql_tx_pending when checking airtime - deficit - -When queueing packets for a station, deficit only gets added once the packets -have been transmitted, which could be much later. During that time, a lot of -temporary unfairness could happen, which could lead to bursty behavior. -Fix this by subtracting the aql_tx_pending when checking the deficit in tx -scheduling. - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -3817,6 +3817,13 @@ out: - } - EXPORT_SYMBOL(ieee80211_tx_dequeue); - -+static inline s32 ieee80211_sta_deficit(struct sta_info *sta, u8 ac) -+{ -+ struct airtime_info *air_info = &sta->airtime[ac]; -+ -+ return air_info->deficit - atomic_read(&air_info->aql_tx_pending); -+} -+ - struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, u8 ac) - { - struct ieee80211_local *local = hw_to_local(hw); -@@ -3847,7 +3854,7 @@ struct ieee80211_txq *ieee80211_next_txq - struct sta_info *sta = container_of(txqi->txq.sta, - struct sta_info, sta); - bool aql_check = ieee80211_txq_airtime_check(hw, &txqi->txq); -- s32 deficit = sta->airtime[txqi->txq.ac].deficit; -+ s32 deficit = ieee80211_sta_deficit(sta, txqi->txq.ac); - - if (aql_check) - found_eligible_txq = true; -@@ -3972,7 +3979,7 @@ bool ieee80211_txq_may_transmit(struct i - continue; - } - sta = container_of(iter->txq.sta, struct sta_info, sta); -- if (sta->airtime[ac].deficit < 0) -+ if (ieee80211_sta_deficit(sta, ac) < 0) - sta->airtime[ac].deficit += sta->airtime_weight; - list_move_tail(&iter->schedule_order, &local->active_txqs[ac]); - } diff --git a/package/kernel/mac80211/patches/subsys/332-wifi-iwlwifi-mvm-support-flush-on-AP-interfaces.patch b/package/kernel/mac80211/patches/subsys/332-wifi-iwlwifi-mvm-support-flush-on-AP-interfaces.patch new file mode 100644 index 0000000000..3c31dfeddc --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/332-wifi-iwlwifi-mvm-support-flush-on-AP-interfaces.patch @@ -0,0 +1,34 @@ +From: Johannes Berg +Date: Mon, 13 Mar 2023 12:02:58 +0100 +Subject: [PATCH] wifi: iwlwifi: mvm: support flush on AP interfaces + +Support TX flush on AP interfaces so that we will do a +proper flush for frames on the queue before keys are +removed. + +Signed-off-by: Johannes Berg +Reviewed-by: Greenman, Gregory +--- + +--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +@@ -4854,9 +4854,6 @@ static void iwl_mvm_mac_flush(struct iee + return; + } + +- if (vif->type != NL80211_IFTYPE_STATION) +- return; +- + /* Make sure we're done with the deferred traffic before flushing */ + flush_work(&mvm->add_stream_wk); + +@@ -4874,9 +4871,6 @@ static void iwl_mvm_mac_flush(struct iee + if (mvmsta->vif != vif) + continue; + +- /* make sure only TDLS peers or the AP are flushed */ +- WARN_ON(i != mvmvif->ap_sta_id && !sta->tdls); +- + if (drop) { + if (iwl_mvm_flush_sta(mvm, mvmsta, false)) + IWL_ERR(mvm, "flush request fail\n"); diff --git a/package/kernel/mac80211/patches/subsys/333-mac80211-keep-recently-active-tx-queues-in-schedulin.patch b/package/kernel/mac80211/patches/subsys/333-mac80211-keep-recently-active-tx-queues-in-schedulin.patch deleted file mode 100644 index 317e4f0653..0000000000 --- a/package/kernel/mac80211/patches/subsys/333-mac80211-keep-recently-active-tx-queues-in-schedulin.patch +++ /dev/null @@ -1,118 +0,0 @@ -From: Felix Fietkau -Date: Mon, 20 Jun 2022 20:52:50 +0200 -Subject: [PATCH] mac80211: keep recently active tx queues in scheduling - list - -This allows proper deficit accounting to ensure that they don't carry their -deficit until the next time they become active - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/ieee80211_i.h -+++ b/net/mac80211/ieee80211_i.h -@@ -83,6 +83,13 @@ extern const u8 ieee80211_ac_to_qos_mask - - #define IEEE80211_MAX_NAN_INSTANCE_ID 255 - -+ -+/* -+ * Keep a station's queues on the active list for deficit accounting purposes -+ * if it was active or queued during the last 100ms -+ */ -+#define AIRTIME_ACTIVE_DURATION (HZ / 10) -+ - struct ieee80211_bss { - u32 device_ts_beacon, device_ts_presp; - ---- a/net/mac80211/sta_info.h -+++ b/net/mac80211/sta_info.h -@@ -138,6 +138,7 @@ enum ieee80211_agg_stop_reason { - struct airtime_info { - u64 rx_airtime; - u64 tx_airtime; -+ u32 last_active; - s32 deficit; - atomic_t aql_tx_pending; /* Estimated airtime for frames pending */ - u32 aql_limit_low; ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -3824,6 +3824,36 @@ static inline s32 ieee80211_sta_deficit( - return air_info->deficit - atomic_read(&air_info->aql_tx_pending); - } - -+static void -+ieee80211_txq_set_active(struct txq_info *txqi) -+{ -+ struct sta_info *sta; -+ -+ if (!txqi->txq.sta) -+ return; -+ -+ sta = container_of(txqi->txq.sta, struct sta_info, sta); -+ sta->airtime[txqi->txq.ac].last_active = (u32)jiffies; -+} -+ -+static bool -+ieee80211_txq_keep_active(struct txq_info *txqi) -+{ -+ struct sta_info *sta; -+ u32 diff; -+ -+ if (!txqi->txq.sta) -+ return false; -+ -+ sta = container_of(txqi->txq.sta, struct sta_info, sta); -+ if (ieee80211_sta_deficit(sta, txqi->txq.ac) >= 0) -+ return false; -+ -+ diff = (u32)jiffies - sta->airtime[txqi->txq.ac].last_active; -+ -+ return diff <= AIRTIME_ACTIVE_DURATION; -+} -+ - struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, u8 ac) - { - struct ieee80211_local *local = hw_to_local(hw); -@@ -3870,7 +3900,6 @@ struct ieee80211_txq *ieee80211_next_txq - } - } - -- - if (txqi->schedule_round == local->schedule_round[ac]) - goto out; - -@@ -3890,12 +3919,13 @@ void __ieee80211_schedule_txq(struct iee - { - struct ieee80211_local *local = hw_to_local(hw); - struct txq_info *txqi = to_txq_info(txq); -+ bool has_queue; - - spin_lock_bh(&local->active_txq_lock[txq->ac]); - -+ has_queue = force || txq_has_queue(txq); - if (list_empty(&txqi->schedule_order) && -- (force || !skb_queue_empty(&txqi->frags) || -- txqi->tin.backlog_packets)) { -+ (has_queue || ieee80211_txq_keep_active(txqi))) { - /* If airtime accounting is active, always enqueue STAs at the - * head of the list to ensure that they only get moved to the - * back by the airtime DRR scheduler once they have a negative -@@ -3903,7 +3933,7 @@ void __ieee80211_schedule_txq(struct iee - * get immediately moved to the back of the list on the next - * call to ieee80211_next_txq(). - */ -- if (txqi->txq.sta && local->airtime_flags && -+ if (txqi->txq.sta && local->airtime_flags && has_queue && - wiphy_ext_feature_isset(local->hw.wiphy, - NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) - list_add(&txqi->schedule_order, -@@ -3911,6 +3941,8 @@ void __ieee80211_schedule_txq(struct iee - else - list_add_tail(&txqi->schedule_order, - &local->active_txqs[txq->ac]); -+ if (has_queue) -+ ieee80211_txq_set_active(txqi); - } - - spin_unlock_bh(&local->active_txq_lock[txq->ac]); diff --git a/package/kernel/mac80211/patches/subsys/333-wifi-mac80211-add-flush_sta-method.patch b/package/kernel/mac80211/patches/subsys/333-wifi-mac80211-add-flush_sta-method.patch new file mode 100644 index 0000000000..3bba0b7e66 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/333-wifi-mac80211-add-flush_sta-method.patch @@ -0,0 +1,91 @@ +From: Johannes Berg +Date: Mon, 13 Mar 2023 11:53:51 +0100 +Subject: [PATCH] wifi: mac80211: add flush_sta method + +Some drivers like iwlwifi might have per-STA queues, so we +may want to flush/drop just those queues rather than all +when removing a station. Add a separate method for that. + +Signed-off-by: Johannes Berg +Reviewed-by: Greenman, Gregory +--- + +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -3918,6 +3918,10 @@ struct ieee80211_prep_tx_info { + * Note that vif can be NULL. + * The callback can sleep. + * ++ * @flush_sta: Flush or drop all pending frames from the hardware queue(s) for ++ * the given station, as it's about to be removed. ++ * The callback can sleep. ++ * + * @channel_switch: Drivers that need (or want) to offload the channel + * switch operation for CSAs received from the AP may implement this + * callback. They must then call ieee80211_chswitch_done() to indicate +@@ -4372,6 +4376,8 @@ struct ieee80211_ops { + #endif + void (*flush)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + u32 queues, bool drop); ++ void (*flush_sta)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ++ struct ieee80211_sta *sta); + void (*channel_switch)(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + struct ieee80211_channel_switch *ch_switch); +--- a/net/mac80211/driver-ops.h ++++ b/net/mac80211/driver-ops.h +@@ -617,6 +617,21 @@ static inline void drv_flush(struct ieee + trace_drv_return_void(local); + } + ++static inline void drv_flush_sta(struct ieee80211_local *local, ++ struct ieee80211_sub_if_data *sdata, ++ struct sta_info *sta) ++{ ++ might_sleep(); ++ ++ if (sdata && !check_sdata_in_driver(sdata)) ++ return; ++ ++ trace_drv_flush_sta(local, sdata, &sta->sta); ++ if (local->ops->flush_sta) ++ local->ops->flush_sta(&local->hw, &sdata->vif, &sta->sta); ++ trace_drv_return_void(local); ++} ++ + static inline void drv_channel_switch(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, + struct ieee80211_channel_switch *ch_switch) +--- a/net/mac80211/sta_info.c ++++ b/net/mac80211/sta_info.c +@@ -1276,8 +1276,12 @@ static void __sta_info_destroy_part2(str + * frames sitting on hardware queues might be sent out without + * any encryption at all. + */ +- if (local->ops->set_key) +- ieee80211_flush_queues(local, sta->sdata, false); ++ if (local->ops->set_key) { ++ if (local->ops->flush_sta) ++ drv_flush_sta(local, sta->sdata, sta); ++ else ++ ieee80211_flush_queues(local, sta->sdata, false); ++ } + + /* now keys can no longer be reached */ + ieee80211_free_sta_keys(local, sta); +--- a/net/mac80211/trace.h ++++ b/net/mac80211/trace.h +@@ -1177,6 +1177,13 @@ TRACE_EVENT(drv_flush, + ) + ); + ++DEFINE_EVENT(sta_event, drv_flush_sta, ++ TP_PROTO(struct ieee80211_local *local, ++ struct ieee80211_sub_if_data *sdata, ++ struct ieee80211_sta *sta), ++ TP_ARGS(local, sdata, sta) ++); ++ + TRACE_EVENT(drv_channel_switch, + TP_PROTO(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, diff --git a/package/kernel/mac80211/patches/subsys/334-mac80211-add-a-per-PHY-AQL-limit-to-improve-fairness.patch b/package/kernel/mac80211/patches/subsys/334-mac80211-add-a-per-PHY-AQL-limit-to-improve-fairness.patch deleted file mode 100644 index fb6fd6eac6..0000000000 --- a/package/kernel/mac80211/patches/subsys/334-mac80211-add-a-per-PHY-AQL-limit-to-improve-fairness.patch +++ /dev/null @@ -1,131 +0,0 @@ -From: Felix Fietkau -Date: Mon, 20 Jun 2022 21:26:34 +0200 -Subject: [PATCH] mac80211: add a per-PHY AQL limit to improve fairness - -In order to maintain fairness, the amount of queueing needs to be limited -beyond the simple per-station AQL budget, otherwise the driver can simply -repeatedly do scheduling rounds until all queues that have not used their -AQL budget become eligble. - -To be conservative, use the high AQL limit for the first txq and add half -of the low AQL for each subsequent queue. - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/ieee80211_i.h -+++ b/net/mac80211/ieee80211_i.h -@@ -1215,6 +1215,7 @@ struct ieee80211_local { - u32 aql_txq_limit_high[IEEE80211_NUM_ACS]; - u32 aql_threshold; - atomic_t aql_total_pending_airtime; -+ atomic_t aql_ac_pending_airtime[IEEE80211_NUM_ACS]; - - const struct ieee80211_ops *ops; - ---- a/net/mac80211/main.c -+++ b/net/mac80211/main.c -@@ -712,6 +712,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ - local->aql_txq_limit_low[i] = IEEE80211_DEFAULT_AQL_TXQ_LIMIT_L; - local->aql_txq_limit_high[i] = - IEEE80211_DEFAULT_AQL_TXQ_LIMIT_H; -+ atomic_set(&local->aql_ac_pending_airtime[i], 0); - } - - local->airtime_flags = AIRTIME_USE_TX | AIRTIME_USE_RX; ---- a/net/mac80211/sta_info.c -+++ b/net/mac80211/sta_info.c -@@ -1929,6 +1929,7 @@ void ieee80211_sta_update_pending_airtim - &sta->airtime[ac].aql_tx_pending); - - atomic_add(tx_airtime, &local->aql_total_pending_airtime); -+ atomic_add(tx_airtime, &local->aql_ac_pending_airtime[ac]); - return; - } - -@@ -1940,14 +1941,17 @@ void ieee80211_sta_update_pending_airtim - tx_pending, 0); - } - -+ atomic_sub(tx_airtime, &local->aql_total_pending_airtime); - tx_pending = atomic_sub_return(tx_airtime, -- &local->aql_total_pending_airtime); -+ &local->aql_ac_pending_airtime[ac]); - if (WARN_ONCE(tx_pending < 0, - "Device %s AC %d pending airtime underflow: %u, %u", - wiphy_name(local->hw.wiphy), ac, tx_pending, -- tx_airtime)) -- atomic_cmpxchg(&local->aql_total_pending_airtime, -+ tx_airtime)) { -+ atomic_cmpxchg(&local->aql_ac_pending_airtime[ac], - tx_pending, 0); -+ atomic_sub(tx_pending, &local->aql_total_pending_airtime); -+ } - } - - int sta_info_move_state(struct sta_info *sta, ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -3863,6 +3863,9 @@ struct ieee80211_txq *ieee80211_next_txq - - spin_lock_bh(&local->active_txq_lock[ac]); - -+ if (!local->schedule_round[ac]) -+ goto out; -+ - begin: - txqi = list_first_entry_or_null(&local->active_txqs[ac], - struct txq_info, -@@ -3984,6 +3987,25 @@ bool ieee80211_txq_airtime_check(struct - } - EXPORT_SYMBOL(ieee80211_txq_airtime_check); - -+static bool -+ieee80211_txq_schedule_airtime_check(struct ieee80211_local *local, u8 ac) -+{ -+ unsigned int num_txq = 0; -+ struct txq_info *txq; -+ u32 aql_limit; -+ -+ if (!wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL)) -+ return true; -+ -+ list_for_each_entry(txq, &local->active_txqs[ac], schedule_order) -+ num_txq++; -+ -+ aql_limit = (num_txq - 1) * local->aql_txq_limit_low[ac] / 2 + -+ local->aql_txq_limit_high[ac]; -+ -+ return atomic_read(&local->aql_ac_pending_airtime[ac]) < aql_limit; -+} -+ - bool ieee80211_txq_may_transmit(struct ieee80211_hw *hw, - struct ieee80211_txq *txq) - { -@@ -4000,6 +4022,9 @@ bool ieee80211_txq_may_transmit(struct i - if (list_empty(&txqi->schedule_order)) - goto out; - -+ if (!ieee80211_txq_schedule_airtime_check(local, ac)) -+ goto out; -+ - list_for_each_entry_safe(iter, tmp, &local->active_txqs[ac], - schedule_order) { - if (iter == txqi) -@@ -4039,7 +4064,15 @@ void ieee80211_txq_schedule_start(struct - struct ieee80211_local *local = hw_to_local(hw); - - spin_lock_bh(&local->active_txq_lock[ac]); -- local->schedule_round[ac]++; -+ -+ if (ieee80211_txq_schedule_airtime_check(local, ac)) { -+ local->schedule_round[ac]++; -+ if (!local->schedule_round[ac]) -+ local->schedule_round[ac]++; -+ } else { -+ local->schedule_round[ac] = 0; -+ } -+ - spin_unlock_bh(&local->active_txq_lock[ac]); - } - EXPORT_SYMBOL(ieee80211_txq_schedule_start); diff --git a/package/kernel/mac80211/patches/subsys/334-wifi-iwlwifi-mvm-support-new-flush_sta-method.patch b/package/kernel/mac80211/patches/subsys/334-wifi-iwlwifi-mvm-support-new-flush_sta-method.patch new file mode 100644 index 0000000000..18f39d505f --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/334-wifi-iwlwifi-mvm-support-new-flush_sta-method.patch @@ -0,0 +1,53 @@ +From: Johannes Berg +Date: Mon, 13 Mar 2023 12:05:35 +0100 +Subject: [PATCH] wifi: iwlwifi: mvm: support new flush_sta method + +For iwlwifi this is simple to implement, and on newer hardware +it's an improvement since we have per-station queues. + +Signed-off-by: Johannes Berg +Reviewed-by: Greenman, Gregory +--- + +--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +@@ -4890,6 +4890,31 @@ static void iwl_mvm_mac_flush(struct iee + iwl_trans_wait_tx_queues_empty(mvm->trans, msk); + } + ++static void iwl_mvm_mac_flush_sta(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, ++ struct ieee80211_sta *sta) ++{ ++ struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); ++ int i; ++ ++ mutex_lock(&mvm->mutex); ++ for (i = 0; i < mvm->fw->ucode_capa.num_stations; i++) { ++ struct iwl_mvm_sta *mvmsta; ++ struct ieee80211_sta *tmp; ++ ++ tmp = rcu_dereference_protected(mvm->fw_id_to_mac_id[i], ++ lockdep_is_held(&mvm->mutex)); ++ if (tmp != sta) ++ continue; ++ ++ mvmsta = iwl_mvm_sta_from_mac80211(sta); ++ ++ if (iwl_mvm_flush_sta(mvm, mvmsta, false)) ++ IWL_ERR(mvm, "flush request fail\n"); ++ } ++ mutex_unlock(&mvm->mutex); ++} ++ + static int iwl_mvm_mac_get_survey(struct ieee80211_hw *hw, int idx, + struct survey_info *survey) + { +@@ -5417,6 +5442,7 @@ const struct ieee80211_ops iwl_mvm_hw_op + .mgd_complete_tx = iwl_mvm_mac_mgd_complete_tx, + .mgd_protect_tdls_discover = iwl_mvm_mac_mgd_protect_tdls_discover, + .flush = iwl_mvm_mac_flush, ++ .flush_sta = iwl_mvm_mac_flush_sta, + .sched_scan_start = iwl_mvm_mac_sched_scan_start, + .sched_scan_stop = iwl_mvm_mac_sched_scan_stop, + .set_key = iwl_mvm_mac_set_key, diff --git a/package/kernel/mac80211/patches/subsys/335-mac80211-add-debugfs-file-to-display-per-phy-AQL-pen.patch b/package/kernel/mac80211/patches/subsys/335-mac80211-add-debugfs-file-to-display-per-phy-AQL-pen.patch deleted file mode 100644 index df45a520fa..0000000000 --- a/package/kernel/mac80211/patches/subsys/335-mac80211-add-debugfs-file-to-display-per-phy-AQL-pen.patch +++ /dev/null @@ -1,58 +0,0 @@ -From: Felix Fietkau -Date: Sat, 25 Jun 2022 21:25:40 +0200 -Subject: [PATCH] mac80211: add debugfs file to display per-phy AQL pending - airtime - -Now that the global pending airtime is more relevant for airtime fairness, -it makes sense to make it accessible via debugfs for debugging - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/debugfs.c -+++ b/net/mac80211/debugfs.c -@@ -201,6 +201,36 @@ static const struct file_operations airt - .llseek = default_llseek, - }; - -+static ssize_t aql_pending_read(struct file *file, -+ char __user *user_buf, -+ size_t count, loff_t *ppos) -+{ -+ struct ieee80211_local *local = file->private_data; -+ char buf[400]; -+ int len = 0; -+ -+ len = scnprintf(buf, sizeof(buf), -+ "AC AQL pending\n" -+ "VO %u us\n" -+ "VI %u us\n" -+ "BE %u us\n" -+ "BK %u us\n" -+ "total %u us\n", -+ atomic_read(&local->aql_ac_pending_airtime[IEEE80211_AC_VO]), -+ atomic_read(&local->aql_ac_pending_airtime[IEEE80211_AC_VI]), -+ atomic_read(&local->aql_ac_pending_airtime[IEEE80211_AC_BE]), -+ atomic_read(&local->aql_ac_pending_airtime[IEEE80211_AC_BK]), -+ atomic_read(&local->aql_total_pending_airtime)); -+ return simple_read_from_buffer(user_buf, count, ppos, -+ buf, len); -+} -+ -+static const struct file_operations aql_pending_ops = { -+ .read = aql_pending_read, -+ .open = simple_open, -+ .llseek = default_llseek, -+}; -+ - static ssize_t aql_txq_limit_read(struct file *file, - char __user *user_buf, - size_t count, -@@ -628,6 +658,7 @@ void debugfs_hw_add(struct ieee80211_loc - DEBUGFS_ADD(hw_conf); - DEBUGFS_ADD_MODE(force_tx_status, 0600); - DEBUGFS_ADD_MODE(aql_enable, 0600); -+ DEBUGFS_ADD(aql_pending); - - if (local->ops->wake_tx_queue) - DEBUGFS_ADD_MODE(aqm, 0600); diff --git a/package/kernel/mac80211/patches/subsys/335-wifi-mac80211-add-LDPC-related-flags-in-ieee80211_bs.patch b/package/kernel/mac80211/patches/subsys/335-wifi-mac80211-add-LDPC-related-flags-in-ieee80211_bs.patch new file mode 100644 index 0000000000..1b379b76ae --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/335-wifi-mac80211-add-LDPC-related-flags-in-ieee80211_bs.patch @@ -0,0 +1,62 @@ +From: Ryder Lee +Date: Sat, 18 Feb 2023 01:49:25 +0800 +Subject: [PATCH] wifi: mac80211: add LDPC related flags in ieee80211_bss_conf + +This is utilized to pass LDPC configurations from user space +(i.e. hostapd) to driver. + +Signed-off-by: Ryder Lee +Link: https://lore.kernel.org/r/1de696aaa34efd77a926eb657b8c0fda05aaa177.1676628065.git.ryder.lee@mediatek.com +Signed-off-by: Johannes Berg +--- + +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -653,6 +653,9 @@ struct ieee80211_fils_discovery { + * write-protected by sdata_lock and local->mtx so holding either is fine + * for read access. + * @color_change_color: the bss color that will be used after the change. ++ * @ht_ldpc: in AP mode, indicates interface has HT LDPC capability. ++ * @vht_ldpc: in AP mode, indicates interface has VHT LDPC capability. ++ * @he_ldpc: in AP mode, indicates interface has HE LDPC capability. + * @vht_su_beamformer: in AP mode, does this BSS support operation as an VHT SU + * beamformer + * @vht_su_beamformee: in AP mode, does this BSS support operation as an VHT SU +@@ -744,6 +747,9 @@ struct ieee80211_bss_conf { + bool color_change_active; + u8 color_change_color; + ++ bool ht_ldpc; ++ bool vht_ldpc; ++ bool he_ldpc; + bool vht_su_beamformer; + bool vht_su_beamformee; + bool vht_mu_beamformer; +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -1252,7 +1252,15 @@ static int ieee80211_start_ap(struct wip + prev_beacon_int = link_conf->beacon_int; + link_conf->beacon_int = params->beacon_interval; + ++ if (params->ht_cap) ++ link_conf->ht_ldpc = ++ params->ht_cap->cap_info & ++ cpu_to_le16(IEEE80211_HT_CAP_LDPC_CODING); ++ + if (params->vht_cap) { ++ link_conf->vht_ldpc = ++ params->vht_cap->vht_cap_info & ++ cpu_to_le32(IEEE80211_VHT_CAP_RXLDPC); + link_conf->vht_su_beamformer = + params->vht_cap->vht_cap_info & + cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE); +@@ -1282,6 +1290,9 @@ static int ieee80211_start_ap(struct wip + } + + if (params->he_cap) { ++ link_conf->he_ldpc = ++ params->he_cap->phy_cap_info[1] & ++ IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD; + link_conf->he_su_beamformer = + params->he_cap->phy_cap_info[3] & + IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER; diff --git a/package/kernel/mac80211/patches/subsys/336-mac80211-only-accumulate-airtime-deficit-for-active-.patch b/package/kernel/mac80211/patches/subsys/336-mac80211-only-accumulate-airtime-deficit-for-active-.patch deleted file mode 100644 index 35f07c1a97..0000000000 --- a/package/kernel/mac80211/patches/subsys/336-mac80211-only-accumulate-airtime-deficit-for-active-.patch +++ /dev/null @@ -1,36 +0,0 @@ -From: Felix Fietkau -Date: Sat, 25 Jun 2022 23:10:19 +0200 -Subject: [PATCH] mac80211: only accumulate airtime deficit for active - clients - -When a client does not generate any local tx activity, accumulating airtime -deficit for the round-robin scheduler can be harmful. If this goes on for too -long, the deficit could grow quite large, which might cause unreasonable -initial latency once the client becomes active - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/sta_info.c -+++ b/net/mac80211/sta_info.c -@@ -1900,6 +1900,7 @@ void ieee80211_sta_register_airtime(stru - struct ieee80211_local *local = sta->sdata->local; - u8 ac = ieee80211_ac_from_tid(tid); - u32 airtime = 0; -+ u32 diff; - - if (sta->local->airtime_flags & AIRTIME_USE_TX) - airtime += tx_airtime; -@@ -1909,7 +1910,11 @@ void ieee80211_sta_register_airtime(stru - spin_lock_bh(&local->active_txq_lock[ac]); - sta->airtime[ac].tx_airtime += tx_airtime; - sta->airtime[ac].rx_airtime += rx_airtime; -- sta->airtime[ac].deficit -= airtime; -+ -+ diff = (u32)jiffies - sta->airtime[ac].last_active; -+ if (diff <= AIRTIME_ACTIVE_DURATION) -+ sta->airtime[ac].deficit -= airtime; -+ - spin_unlock_bh(&local->active_txq_lock[ac]); - } - EXPORT_SYMBOL(ieee80211_sta_register_airtime); diff --git a/package/kernel/mac80211/patches/subsys/336-v6.4-wifi-mac80211-generate-EMA-beacons-in-AP-mode.patch b/package/kernel/mac80211/patches/subsys/336-v6.4-wifi-mac80211-generate-EMA-beacons-in-AP-mode.patch new file mode 100644 index 0000000000..088f468e37 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/336-v6.4-wifi-mac80211-generate-EMA-beacons-in-AP-mode.patch @@ -0,0 +1,372 @@ +From bd54f3c29077f23dad92ef82a78061b40be30c65 Mon Sep 17 00:00:00 2001 +From: Aloka Dixit +Date: Mon, 5 Dec 2022 16:50:37 -0800 +Subject: [PATCH] wifi: mac80211: generate EMA beacons in AP mode + +Add APIs to generate an array of beacons for an EMA AP (enhanced +multiple BSSID advertisements), each including a single MBSSID element. +EMA profile periodicity equals the count of elements. + +- ieee80211_beacon_get_template_ema_list() - Generate and return all +EMA beacon templates. Drivers must call ieee80211_beacon_free_ema_list() +to free the memory. No change in the prototype for the existing API, +ieee80211_beacon_get_template(), which should be used for non-EMA AP. + +- ieee80211_beacon_get_template_ema_index() - Generate a beacon which +includes the multiple BSSID element at the given index. Drivers can use +this function in a loop until NULL is returned which indicates end of +available MBSSID elements. + +- ieee80211_beacon_free_ema_list() - free the memory allocated for the +list of EMA beacon templates. + +Modify existing functions ieee80211_beacon_get_ap(), +ieee80211_get_mbssid_beacon_len() and ieee80211_beacon_add_mbssid() +to accept a new parameter for EMA index. + +Signed-off-by: Aloka Dixit +Co-developed-by: John Crispin +Signed-off-by: John Crispin +Link: https://lore.kernel.org/r/20221206005040.3177-2-quic_alokad@quicinc.com +Signed-off-by: Johannes Berg +--- + include/net/mac80211.h | 68 +++++++++++++++++++ + net/mac80211/cfg.c | 11 +-- + net/mac80211/ieee80211_i.h | 10 ++- + net/mac80211/tx.c | 134 ++++++++++++++++++++++++++++++++++--- + 4 files changed, 205 insertions(+), 18 deletions(-) + +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -5252,6 +5252,74 @@ ieee80211_beacon_get_template(struct iee + unsigned int link_id); + + /** ++ * ieee80211_beacon_get_template_ema_index - EMA beacon template generation ++ * @hw: pointer obtained from ieee80211_alloc_hw(). ++ * @vif: &struct ieee80211_vif pointer from the add_interface callback. ++ * @offs: &struct ieee80211_mutable_offsets pointer to struct that will ++ * receive the offsets that may be updated by the driver. ++ * @link_id: the link id to which the beacon belongs (or 0 for a non-MLD AP). ++ * @ema_index: index of the beacon in the EMA set. ++ * ++ * This function follows the same rules as ieee80211_beacon_get_template() ++ * but returns a beacon template which includes multiple BSSID element at the ++ * requested index. ++ * ++ * Return: The beacon template. %NULL indicates the end of EMA templates. ++ */ ++struct sk_buff * ++ieee80211_beacon_get_template_ema_index(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, ++ struct ieee80211_mutable_offsets *offs, ++ unsigned int link_id, u8 ema_index); ++ ++/** ++ * struct ieee80211_ema_beacons - List of EMA beacons ++ * @cnt: count of EMA beacons. ++ * ++ * @bcn: array of EMA beacons. ++ * @bcn.skb: the skb containing this specific beacon ++ * @bcn.offs: &struct ieee80211_mutable_offsets pointer to struct that will ++ * receive the offsets that may be updated by the driver. ++ */ ++struct ieee80211_ema_beacons { ++ u8 cnt; ++ struct { ++ struct sk_buff *skb; ++ struct ieee80211_mutable_offsets offs; ++ } bcn[]; ++}; ++ ++/** ++ * ieee80211_beacon_get_template_ema_list - EMA beacon template generation ++ * @hw: pointer obtained from ieee80211_alloc_hw(). ++ * @vif: &struct ieee80211_vif pointer from the add_interface callback. ++ * @link_id: the link id to which the beacon belongs (or 0 for a non-MLD AP) ++ * ++ * This function follows the same rules as ieee80211_beacon_get_template() ++ * but allocates and returns a pointer to list of all beacon templates required ++ * to cover all profiles in the multiple BSSID set. Each template includes only ++ * one multiple BSSID element. ++ * ++ * Driver must call ieee80211_beacon_free_ema_list() to free the memory. ++ * ++ * Return: EMA beacon templates of type struct ieee80211_ema_beacons *. ++ * %NULL on error. ++ */ ++struct ieee80211_ema_beacons * ++ieee80211_beacon_get_template_ema_list(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, ++ unsigned int link_id); ++ ++/** ++ * ieee80211_beacon_free_ema_list - free an EMA beacon template list ++ * @ema_beacons: list of EMA beacons of type &struct ieee80211_ema_beacons pointers. ++ * ++ * This function will free a list previously acquired by calling ++ * ieee80211_beacon_get_template_ema_list() ++ */ ++void ieee80211_beacon_free_ema_list(struct ieee80211_ema_beacons *ema_beacons); ++ ++/** + * ieee80211_beacon_get_tim - beacon generation function + * @hw: pointer obtained from ieee80211_alloc_hw(). + * @vif: &struct ieee80211_vif pointer from the add_interface callback. +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -1122,11 +1122,11 @@ static int ieee80211_assign_beacon(struc + if (params->mbssid_ies) { + mbssid = params->mbssid_ies; + size += struct_size(new->mbssid_ies, elem, mbssid->cnt); +- size += ieee80211_get_mbssid_beacon_len(mbssid); ++ size += ieee80211_get_mbssid_beacon_len(mbssid, mbssid->cnt); + } else if (old && old->mbssid_ies) { + mbssid = old->mbssid_ies; + size += struct_size(new->mbssid_ies, elem, mbssid->cnt); +- size += ieee80211_get_mbssid_beacon_len(mbssid); ++ size += ieee80211_get_mbssid_beacon_len(mbssid, mbssid->cnt); + } + + new = kzalloc(size, GFP_KERNEL); +@@ -3384,8 +3384,11 @@ cfg80211_beacon_dup(struct cfg80211_beac + + len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len + + beacon->proberesp_ies_len + beacon->assocresp_ies_len + +- beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len + +- ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies); ++ beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len; ++ ++ if (beacon->mbssid_ies) ++ len += ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies, ++ beacon->mbssid_ies->cnt); + + new_beacon = kzalloc(sizeof(*new_beacon) + len, GFP_KERNEL); + if (!new_beacon) +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -1182,13 +1182,17 @@ ieee80211_vif_get_shift(struct ieee80211 + } + + static inline int +-ieee80211_get_mbssid_beacon_len(struct cfg80211_mbssid_elems *elems) ++ieee80211_get_mbssid_beacon_len(struct cfg80211_mbssid_elems *elems, u8 i) + { +- int i, len = 0; ++ int len = 0; + +- if (!elems) ++ if (!elems || !elems->cnt || i > elems->cnt) + return 0; + ++ if (i < elems->cnt) ++ return elems->elem[i].len; ++ ++ /* i == elems->cnt, calculate total length of all MBSSID elements */ + for (i = 0; i < elems->cnt; i++) + len += elems->elem[i].len; + +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -5205,13 +5205,20 @@ ieee80211_beacon_get_finish(struct ieee8 + } + + static void +-ieee80211_beacon_add_mbssid(struct sk_buff *skb, struct beacon_data *beacon) ++ieee80211_beacon_add_mbssid(struct sk_buff *skb, struct beacon_data *beacon, ++ u8 i) + { +- int i; ++ if (!beacon->mbssid_ies || !beacon->mbssid_ies->cnt || ++ i > beacon->mbssid_ies->cnt) ++ return; + +- if (!beacon->mbssid_ies) ++ if (i < beacon->mbssid_ies->cnt) { ++ skb_put_data(skb, beacon->mbssid_ies->elem[i].data, ++ beacon->mbssid_ies->elem[i].len); + return; ++ } + ++ /* i == beacon->mbssid_ies->cnt, include all MBSSID elements */ + for (i = 0; i < beacon->mbssid_ies->cnt; i++) + skb_put_data(skb, beacon->mbssid_ies->elem[i].data, + beacon->mbssid_ies->elem[i].len); +@@ -5224,7 +5231,8 @@ ieee80211_beacon_get_ap(struct ieee80211 + struct ieee80211_mutable_offsets *offs, + bool is_template, + struct beacon_data *beacon, +- struct ieee80211_chanctx_conf *chanctx_conf) ++ struct ieee80211_chanctx_conf *chanctx_conf, ++ u8 ema_index) + { + struct ieee80211_local *local = hw_to_local(hw); + struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); +@@ -5243,7 +5251,9 @@ ieee80211_beacon_get_ap(struct ieee80211 + /* headroom, head length, + * tail length, maximum TIM length and multiple BSSID length + */ +- mbssid_len = ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies); ++ mbssid_len = ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies, ++ ema_index); ++ + skb = dev_alloc_skb(local->tx_headroom + beacon->head_len + + beacon->tail_len + 256 + + local->hw.extra_beacon_tailroom + mbssid_len); +@@ -5261,7 +5271,7 @@ ieee80211_beacon_get_ap(struct ieee80211 + offs->cntdwn_counter_offs[0] = beacon->cntdwn_counter_offsets[0]; + + if (mbssid_len) { +- ieee80211_beacon_add_mbssid(skb, beacon); ++ ieee80211_beacon_add_mbssid(skb, beacon, ema_index); + offs->mbssid_off = skb->len - mbssid_len; + } + +@@ -5280,12 +5290,51 @@ ieee80211_beacon_get_ap(struct ieee80211 + return skb; + } + ++static struct ieee80211_ema_beacons * ++ieee80211_beacon_get_ap_ema_list(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, ++ struct ieee80211_link_data *link, ++ struct ieee80211_mutable_offsets *offs, ++ bool is_template, struct beacon_data *beacon, ++ struct ieee80211_chanctx_conf *chanctx_conf) ++{ ++ struct ieee80211_ema_beacons *ema = NULL; ++ ++ if (!beacon->mbssid_ies || !beacon->mbssid_ies->cnt) ++ return NULL; ++ ++ ema = kzalloc(struct_size(ema, bcn, beacon->mbssid_ies->cnt), ++ GFP_ATOMIC); ++ if (!ema) ++ return NULL; ++ ++ for (ema->cnt = 0; ema->cnt < beacon->mbssid_ies->cnt; ema->cnt++) { ++ ema->bcn[ema->cnt].skb = ++ ieee80211_beacon_get_ap(hw, vif, link, ++ &ema->bcn[ema->cnt].offs, ++ is_template, beacon, ++ chanctx_conf, ema->cnt); ++ if (!ema->bcn[ema->cnt].skb) ++ break; ++ } ++ ++ if (ema->cnt == beacon->mbssid_ies->cnt) ++ return ema; ++ ++ ieee80211_beacon_free_ema_list(ema); ++ return NULL; ++} ++ ++#define IEEE80211_INCLUDE_ALL_MBSSID_ELEMS -1 ++ + static struct sk_buff * + __ieee80211_beacon_get(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + struct ieee80211_mutable_offsets *offs, + bool is_template, +- unsigned int link_id) ++ unsigned int link_id, ++ int ema_index, ++ struct ieee80211_ema_beacons **ema_beacons) + { + struct ieee80211_local *local = hw_to_local(hw); + struct beacon_data *beacon = NULL; +@@ -5314,8 +5363,29 @@ __ieee80211_beacon_get(struct ieee80211_ + if (!beacon) + goto out; + +- skb = ieee80211_beacon_get_ap(hw, vif, link, offs, is_template, +- beacon, chanctx_conf); ++ if (ema_beacons) { ++ *ema_beacons = ++ ieee80211_beacon_get_ap_ema_list(hw, vif, link, ++ offs, ++ is_template, ++ beacon, ++ chanctx_conf); ++ } else { ++ if (beacon->mbssid_ies && beacon->mbssid_ies->cnt) { ++ if (ema_index >= beacon->mbssid_ies->cnt) ++ goto out; /* End of MBSSID elements */ ++ ++ if (ema_index <= IEEE80211_INCLUDE_ALL_MBSSID_ELEMS) ++ ema_index = beacon->mbssid_ies->cnt; ++ } else { ++ ema_index = 0; ++ } ++ ++ skb = ieee80211_beacon_get_ap(hw, vif, link, offs, ++ is_template, beacon, ++ chanctx_conf, ++ ema_index); ++ } + } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { + struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; + struct ieee80211_hdr *hdr; +@@ -5403,10 +5473,50 @@ ieee80211_beacon_get_template(struct iee + struct ieee80211_mutable_offsets *offs, + unsigned int link_id) + { +- return __ieee80211_beacon_get(hw, vif, offs, true, link_id); ++ return __ieee80211_beacon_get(hw, vif, offs, true, link_id, ++ IEEE80211_INCLUDE_ALL_MBSSID_ELEMS, NULL); + } + EXPORT_SYMBOL(ieee80211_beacon_get_template); + ++struct sk_buff * ++ieee80211_beacon_get_template_ema_index(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, ++ struct ieee80211_mutable_offsets *offs, ++ unsigned int link_id, u8 ema_index) ++{ ++ return __ieee80211_beacon_get(hw, vif, offs, true, link_id, ema_index, ++ NULL); ++} ++EXPORT_SYMBOL(ieee80211_beacon_get_template_ema_index); ++ ++void ieee80211_beacon_free_ema_list(struct ieee80211_ema_beacons *ema_beacons) ++{ ++ u8 i; ++ ++ if (!ema_beacons) ++ return; ++ ++ for (i = 0; i < ema_beacons->cnt; i++) ++ kfree_skb(ema_beacons->bcn[i].skb); ++ ++ kfree(ema_beacons); ++} ++EXPORT_SYMBOL(ieee80211_beacon_free_ema_list); ++ ++struct ieee80211_ema_beacons * ++ieee80211_beacon_get_template_ema_list(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, ++ unsigned int link_id) ++{ ++ struct ieee80211_ema_beacons *ema_beacons = NULL; ++ ++ WARN_ON(__ieee80211_beacon_get(hw, vif, NULL, false, link_id, 0, ++ &ema_beacons)); ++ ++ return ema_beacons; ++} ++EXPORT_SYMBOL(ieee80211_beacon_get_template_ema_list); ++ + struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + u16 *tim_offset, u16 *tim_length, +@@ -5414,7 +5524,9 @@ struct sk_buff *ieee80211_beacon_get_tim + { + struct ieee80211_mutable_offsets offs = {}; + struct sk_buff *bcn = __ieee80211_beacon_get(hw, vif, &offs, false, +- link_id); ++ link_id, ++ IEEE80211_INCLUDE_ALL_MBSSID_ELEMS, ++ NULL); + struct sk_buff *copy; + int shift; + diff --git a/package/kernel/mac80211/patches/subsys/337-mac80211-increase-quantum-for-airtime-scheduler.patch b/package/kernel/mac80211/patches/subsys/337-mac80211-increase-quantum-for-airtime-scheduler.patch deleted file mode 100644 index 74e857679e..0000000000 --- a/package/kernel/mac80211/patches/subsys/337-mac80211-increase-quantum-for-airtime-scheduler.patch +++ /dev/null @@ -1,53 +0,0 @@ -From: Felix Fietkau -Date: Sun, 26 Jun 2022 11:43:25 +0200 -Subject: [PATCH] mac80211: increase quantum for airtime scheduler - -Given the typical AQL budget and queue length, a quantum of 256 with the -default station weight often requires iterating over all queues frequently, -until one of them becomes eligible. -Improve performance by using 8 times station weight as scheduler quantum - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/ieee80211_i.h -+++ b/net/mac80211/ieee80211_i.h -@@ -90,6 +90,8 @@ extern const u8 ieee80211_ac_to_qos_mask - */ - #define AIRTIME_ACTIVE_DURATION (HZ / 10) - -+#define AIRTIME_QUANTUM_SHIFT 3 -+ - struct ieee80211_bss { - u32 device_ts_beacon, device_ts_presp; - ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -3894,7 +3894,7 @@ struct ieee80211_txq *ieee80211_next_txq - - if (deficit < 0) - sta->airtime[txqi->txq.ac].deficit += -- sta->airtime_weight; -+ sta->airtime_weight << AIRTIME_QUANTUM_SHIFT; - - if (deficit < 0 || !aql_check) { - list_move_tail(&txqi->schedule_order, -@@ -4037,7 +4037,8 @@ bool ieee80211_txq_may_transmit(struct i - } - sta = container_of(iter->txq.sta, struct sta_info, sta); - if (ieee80211_sta_deficit(sta, ac) < 0) -- sta->airtime[ac].deficit += sta->airtime_weight; -+ sta->airtime[ac].deficit += sta->airtime_weight << -+ AIRTIME_QUANTUM_SHIFT; - list_move_tail(&iter->schedule_order, &local->active_txqs[ac]); - } - -@@ -4045,7 +4046,7 @@ bool ieee80211_txq_may_transmit(struct i - if (sta->airtime[ac].deficit >= 0) - goto out; - -- sta->airtime[ac].deficit += sta->airtime_weight; -+ sta->airtime[ac].deficit += sta->airtime_weight << AIRTIME_QUANTUM_SHIFT; - list_move_tail(&txqi->schedule_order, &local->active_txqs[ac]); - spin_unlock_bh(&local->active_txq_lock[ac]); - diff --git a/package/kernel/mac80211/patches/subsys/339-mac80211-exclude-multicast-packets-from-AQL-pending-.patch b/package/kernel/mac80211/patches/subsys/339-mac80211-exclude-multicast-packets-from-AQL-pending-.patch deleted file mode 100644 index 43c3e75d65..0000000000 --- a/package/kernel/mac80211/patches/subsys/339-mac80211-exclude-multicast-packets-from-AQL-pending-.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Felix Fietkau -Date: Wed, 13 Jul 2022 07:32:26 +0200 -Subject: [PATCH] mac80211: exclude multicast packets from AQL pending airtime - -In AP mode, multicast traffic is handled very differently from normal traffic, -especially if at least one client is in powersave mode. -This means that multicast packets can be buffered a lot longer than normal -unicast packets, and can eat up the AQL budget very quickly because of the low -data rate. -Along with the recent change to maintain a global PHY AQL limit, this can lead -to significant latency spikes for unicast traffic. - -Since queueing multicast to hardware is currently not constrained by AQL limits -anyway, let's just exclude it from the AQL pending airtime calculation entirely. - -Fixes: 8e4bac067105 ("wifi: mac80211: add a per-PHY AQL limit to improve fairness") -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -3792,7 +3792,7 @@ begin: - encap_out: - IEEE80211_SKB_CB(skb)->control.vif = vif; - -- if (vif && -+ if (tx.sta && - wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL)) { - bool ampdu = txq->ac != IEEE80211_AC_VO; - u32 airtime; diff --git a/package/kernel/mac80211/patches/subsys/340-cfg80211-allow-grace-period-for-DFS-available-after-.patch b/package/kernel/mac80211/patches/subsys/340-cfg80211-allow-grace-period-for-DFS-available-after-.patch new file mode 100644 index 0000000000..ad2e2e24c9 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/340-cfg80211-allow-grace-period-for-DFS-available-after-.patch @@ -0,0 +1,149 @@ +From: Felix Fietkau +Date: Thu, 14 Sep 2023 13:17:16 +0200 +Subject: [PATCH] cfg80211: allow grace period for DFS available after beacon + shutdown + +Fixes reconfiguring an AP on a DFS channel in non-ETSI regdomain + +Fixes: b35a51c7dd25 ("cfg80211: Make pre-CAC results valid only for ETSI domain") +Signed-off-by: Felix Fietkau +--- + +--- a/include/net/cfg80211.h ++++ b/include/net/cfg80211.h +@@ -175,6 +175,8 @@ enum ieee80211_channel_flags { + * @dfs_state: current state of this channel. Only relevant if radar is required + * on this channel. + * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered. ++ * @dfs_state_last_available: timestamp (jiffies) of the last time when the ++ * channel was available. + * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels. + */ + struct ieee80211_channel { +@@ -191,6 +193,7 @@ struct ieee80211_channel { + int orig_mag, orig_mpwr; + enum nl80211_dfs_state dfs_state; + unsigned long dfs_state_entered; ++ unsigned long dfs_state_last_available; + unsigned int dfs_cac_ms; + }; + +--- a/net/wireless/ap.c ++++ b/net/wireless/ap.c +@@ -30,6 +30,9 @@ static int ___cfg80211_stop_ap(struct cf + if (!wdev->links[link_id].ap.beacon_interval) + return -ENOENT; + ++ cfg80211_update_last_available(wdev->wiphy, ++ &wdev->links[link_id].ap.chandef); ++ + err = rdev_stop_ap(rdev, dev, link_id); + if (!err) { + wdev->conn_owner_nlportid = 0; +@@ -41,9 +44,6 @@ static int ___cfg80211_stop_ap(struct cf + if (notify) + nl80211_send_ap_stopped(wdev); + +- /* Should we apply the grace period during beaconing interface +- * shutdown also? +- */ + cfg80211_sched_dfs_chan_update(rdev); + } + +--- a/net/wireless/chan.c ++++ b/net/wireless/chan.c +@@ -461,6 +461,8 @@ static void cfg80211_set_chans_dfs_state + + c->dfs_state = dfs_state; + c->dfs_state_entered = jiffies; ++ if (dfs_state == NL80211_DFS_AVAILABLE) ++ c->dfs_state_last_available = jiffies; + } + } + +@@ -873,6 +875,49 @@ static bool cfg80211_get_chans_dfs_avail + return true; + } + ++static void ++__cfg80211_update_last_available(struct wiphy *wiphy, ++ u32 center_freq, ++ u32 bandwidth) ++{ ++ struct ieee80211_channel *c; ++ u32 freq, start_freq, end_freq; ++ ++ start_freq = cfg80211_get_start_freq(center_freq, bandwidth); ++ end_freq = cfg80211_get_end_freq(center_freq, bandwidth); ++ ++ /* ++ * Check entire range of channels for the bandwidth. ++ * If any channel in between is disabled or has not ++ * had gone through CAC return false ++ */ ++ for (freq = start_freq; freq <= end_freq; freq += MHZ_TO_KHZ(20)) { ++ c = ieee80211_get_channel_khz(wiphy, freq); ++ if (!c) ++ return; ++ ++ c->dfs_state_last_available = jiffies; ++ } ++} ++ ++void cfg80211_update_last_available(struct wiphy *wiphy, ++ const struct cfg80211_chan_def *chandef) ++{ ++ int width; ++ ++ width = cfg80211_chandef_get_width(chandef); ++ if (width < 0) ++ return; ++ ++ __cfg80211_update_last_available(wiphy, MHZ_TO_KHZ(chandef->center_freq1), ++ width); ++ if (chandef->width != NL80211_CHAN_WIDTH_80P80) ++ return; ++ ++ __cfg80211_update_last_available(wiphy, MHZ_TO_KHZ(chandef->center_freq2), ++ width); ++} ++ + static bool cfg80211_chandef_dfs_available(struct wiphy *wiphy, + const struct cfg80211_chan_def *chandef) + { +--- a/net/wireless/core.h ++++ b/net/wireless/core.h +@@ -477,6 +477,8 @@ void cfg80211_set_dfs_state(struct wiphy + enum nl80211_dfs_state dfs_state); + + void cfg80211_dfs_channels_update_work(struct work_struct *work); ++void cfg80211_update_last_available(struct wiphy *wiphy, ++ const struct cfg80211_chan_def *chandef); + + unsigned int + cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy, +--- a/net/wireless/mlme.c ++++ b/net/wireless/mlme.c +@@ -891,6 +891,8 @@ void cfg80211_dfs_channels_update_work(s + if (c->dfs_state == NL80211_DFS_UNAVAILABLE) { + time_dfs_update = IEEE80211_DFS_MIN_NOP_TIME_MS; + radar_event = NL80211_RADAR_NOP_FINISHED; ++ timeout = c->dfs_state_entered + ++ msecs_to_jiffies(time_dfs_update); + } else { + if (regulatory_pre_cac_allowed(wiphy) || + cfg80211_any_wiphy_oper_chan(wiphy, c)) +@@ -898,11 +900,10 @@ void cfg80211_dfs_channels_update_work(s + + time_dfs_update = REG_PRE_CAC_EXPIRY_GRACE_MS; + radar_event = NL80211_RADAR_PRE_CAC_EXPIRED; ++ timeout = c->dfs_state_last_available + ++ msecs_to_jiffies(time_dfs_update); + } + +- timeout = c->dfs_state_entered + +- msecs_to_jiffies(time_dfs_update); +- + if (time_after_eq(jiffies, timeout)) { + c->dfs_state = NL80211_DFS_USABLE; + c->dfs_state_entered = jiffies; diff --git a/package/kernel/mac80211/patches/subsys/340-wifi-mac80211-do-not-abuse-fq.lock-in-ieee80211_do_s.patch b/package/kernel/mac80211/patches/subsys/340-wifi-mac80211-do-not-abuse-fq.lock-in-ieee80211_do_s.patch deleted file mode 100644 index 82243f1d98..0000000000 --- a/package/kernel/mac80211/patches/subsys/340-wifi-mac80211-do-not-abuse-fq.lock-in-ieee80211_do_s.patch +++ /dev/null @@ -1,46 +0,0 @@ -From aa40d5a43526cca9439a2b45fcfdcd016594dece Mon Sep 17 00:00:00 2001 -From: Tetsuo Handa -Date: Sun, 17 Jul 2022 21:21:52 +0900 -Subject: [PATCH] wifi: mac80211: do not abuse fq.lock in ieee80211_do_stop() -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -lockdep complains use of uninitialized spinlock at ieee80211_do_stop() [1], -for commit f856373e2f31ffd3 ("wifi: mac80211: do not wake queues on a vif -that is being stopped") guards clear_bit() using fq.lock even before -fq_init() from ieee80211_txq_setup_flows() initializes this spinlock. - -According to discussion [2], Toke was not happy with expanding usage of -fq.lock. Since __ieee80211_wake_txqs() is called under RCU read lock, we -can instead use synchronize_rcu() for flushing ieee80211_wake_txqs(). - -Link: https://syzkaller.appspot.com/bug?extid=eceab52db7c4b961e9d6 [1] -Link: https://lkml.kernel.org/r/874k0zowh2.fsf@toke.dk [2] -Reported-by: syzbot -Signed-off-by: Tetsuo Handa -Fixes: f856373e2f31ffd3 ("wifi: mac80211: do not wake queues on a vif that is being stopped") -Tested-by: syzbot -Acked-by: Toke Høiland-Jørgensen -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/9cc9b81d-75a3-3925-b612-9d0ad3cab82b@I-love.SAKURA.ne.jp -[ pick up commit 3598cb6e1862 ("wifi: mac80211: do not abuse fq.lock in ieee80211_do_stop()") from -next] -Link: https://lore.kernel.org/all/87o7xcq6qt.fsf@kernel.org/ -Signed-off-by: Jakub Kicinski ---- - net/mac80211/iface.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -377,9 +377,8 @@ static void ieee80211_do_stop(struct iee - bool cancel_scan; - struct cfg80211_nan_func *func; - -- spin_lock_bh(&local->fq.lock); - clear_bit(SDATA_STATE_RUNNING, &sdata->state); -- spin_unlock_bh(&local->fq.lock); -+ synchronize_rcu(); /* flush _ieee80211_wake_txqs() */ - - cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; - if (cancel_scan) diff --git a/package/kernel/mac80211/patches/subsys/341-mac80211-Fix-deadlock-Don-t-start-TX-while-holding-f.patch b/package/kernel/mac80211/patches/subsys/341-mac80211-Fix-deadlock-Don-t-start-TX-while-holding-f.patch deleted file mode 100644 index 8c56acbf88..0000000000 --- a/package/kernel/mac80211/patches/subsys/341-mac80211-Fix-deadlock-Don-t-start-TX-while-holding-f.patch +++ /dev/null @@ -1,40 +0,0 @@ -From: Alexander Wetzel -Date: Thu, 15 Sep 2022 14:41:20 +0200 -Subject: [PATCH] mac80211: Fix deadlock: Don't start TX while holding - fq->lock - -ieee80211_txq_purge() calls fq_tin_reset() and -ieee80211_purge_tx_queue(); Both are then calling -ieee80211_free_txskb(). Which can decide to TX the skb again. - -There are at least two ways to get a deadlock: - -1) When we have a TDLS teardown packet queued in either tin or frags - ieee80211_tdls_td_tx_handle() will call ieee80211_subif_start_xmit() - while we still hold fq->lock. ieee80211_txq_enqueue() will thus - deadlock. - -2) A variant of the above happens if aggregation is up and running: - In that case ieee80211_iface_work() will deadlock with the original - task: The original tasks already holds fq->lock and tries to get - sta->lock after kicking off ieee80211_iface_work(). But the worker - can get sta->lock prior to the original task and will then spin for - fq->lock. - -Avoid these deadlocks by not sending out any skbs when called via -ieee80211_free_txskb(). - -Signed-off-by: Alexander Wetzel ---- - ---- a/net/mac80211/status.c -+++ b/net/mac80211/status.c -@@ -698,7 +698,7 @@ static void ieee80211_report_used_skb(st - - if (!sdata) { - skb->dev = NULL; -- } else { -+ } else if (!dropped) { - unsigned int hdr_size = - ieee80211_hdrlen(hdr->frame_control); - diff --git a/package/kernel/mac80211/patches/subsys/342-mac80211-Ensure-vif-queues-are-operational-after-sta.patch b/package/kernel/mac80211/patches/subsys/342-mac80211-Ensure-vif-queues-are-operational-after-sta.patch deleted file mode 100644 index 4310329319..0000000000 --- a/package/kernel/mac80211/patches/subsys/342-mac80211-Ensure-vif-queues-are-operational-after-sta.patch +++ /dev/null @@ -1,47 +0,0 @@ -From: Alexander Wetzel -Date: Thu, 15 Sep 2022 15:09:46 +0200 -Subject: [PATCH] mac80211: Ensure vif queues are operational after start - -Make sure local->queue_stop_reasons and vif.txqs_stopped stay in sync. - -When a new vif is created the queues may end up in an inconsistent state -and be inoperable: -Communication not using iTXQ will work, allowing to e.g. complete the -association. But the 4-way handshake will time out. The sta will not -send out any skbs queued in iTXQs. - -All normal attempts to start the queues will fail when reaching this -state. -local->queue_stop_reasons will have marked all queues as operational but -vif.txqs_stopped will still be set, creating an inconsistent internal -state. - -In reality this seems to be race between the mac80211 function -ieee80211_do_open() setting SDATA_STATE_RUNNING and the wake_txqs_tasklet: -Depending on the driver and the timing the queues may end up to be -operational or not. - -Cc: stable@vger.kernel.org -Fixes: f856373e2f31 ("wifi: mac80211: do not wake queues on a vif that is being stopped") -Signed-off-by: Alexander Wetzel ---- - ---- a/net/mac80211/util.c -+++ b/net/mac80211/util.c -@@ -301,14 +301,14 @@ static void __ieee80211_wake_txqs(struct - local_bh_disable(); - spin_lock(&fq->lock); - -+ sdata->vif.txqs_stopped[ac] = false; -+ - if (!test_bit(SDATA_STATE_RUNNING, &sdata->state)) - goto out; - - if (sdata->vif.type == NL80211_IFTYPE_AP) - ps = &sdata->bss->ps; - -- sdata->vif.txqs_stopped[ac] = false; -- - list_for_each_entry_rcu(sta, &local->sta_list, list) { - if (sdata != sta->sdata) - continue; diff --git a/package/kernel/mac80211/patches/subsys/343-wifi-mac80211-fix-decap-offload-for-stations-on-AP_V.patch b/package/kernel/mac80211/patches/subsys/343-wifi-mac80211-fix-decap-offload-for-stations-on-AP_V.patch deleted file mode 100644 index 0246785475..0000000000 --- a/package/kernel/mac80211/patches/subsys/343-wifi-mac80211-fix-decap-offload-for-stations-on-AP_V.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: Felix Fietkau -Date: Wed, 28 Sep 2022 13:50:34 +0200 -Subject: [PATCH] wifi: mac80211: fix decap offload for stations on AP_VLAN - interfaces - -Since AP_VLAN interfaces are not passed to the driver, check offload_flags -on the bss vif instead. - -Reported-by: Howard Hsu -Fixes: 80a915ec4427 ("mac80211: add rx decapsulation offload support") -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/rx.c -+++ b/net/mac80211/rx.c -@@ -4267,6 +4267,7 @@ void ieee80211_check_fast_rx(struct sta_ - .vif_type = sdata->vif.type, - .control_port_protocol = sdata->control_port_protocol, - }, *old, *new = NULL; -+ u32 offload_flags; - bool set_offload = false; - bool assign = false; - bool offload; -@@ -4382,10 +4383,10 @@ void ieee80211_check_fast_rx(struct sta_ - if (assign) - new = kmemdup(&fastrx, sizeof(fastrx), GFP_KERNEL); - -- offload = assign && -- (sdata->vif.offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED); -+ offload_flags = get_bss_sdata(sdata)->vif.offload_flags; -+ offload = offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED; - -- if (offload) -+ if (assign && offload) - set_offload = !test_and_set_sta_flag(sta, WLAN_STA_DECAP_OFFLOAD); - else - set_offload = test_and_clear_sta_flag(sta, WLAN_STA_DECAP_OFFLOAD); diff --git a/package/kernel/mac80211/patches/subsys/344-wifi-cfg80211-fix-ieee80211_data_to_8023_exthdr-hand.patch b/package/kernel/mac80211/patches/subsys/344-wifi-cfg80211-fix-ieee80211_data_to_8023_exthdr-hand.patch deleted file mode 100644 index 161c7d6c8f..0000000000 --- a/package/kernel/mac80211/patches/subsys/344-wifi-cfg80211-fix-ieee80211_data_to_8023_exthdr-hand.patch +++ /dev/null @@ -1,99 +0,0 @@ -From: Felix Fietkau -Date: Fri, 7 Oct 2022 10:54:47 +0200 -Subject: [PATCH] wifi: cfg80211: fix ieee80211_data_to_8023_exthdr - handling of small packets - -STP topology change notification packets only have a payload of 7 bytes, -so they get dropped due to the skb->len < hdrlen + 8 check. -Fix this by removing skb->len based checks and instead check the return code -on the skb_copy_bits calls. - -Fixes: 2d1c304cb2d5 ("cfg80211: add function for 802.3 conversion with separate output buffer") -Reported-by: Chad Monroe -Signed-off-by: Felix Fietkau ---- - ---- a/net/wireless/util.c -+++ b/net/wireless/util.c -@@ -557,7 +557,7 @@ int ieee80211_data_to_8023_exthdr(struct - return -1; - - hdrlen = ieee80211_hdrlen(hdr->frame_control) + data_offset; -- if (skb->len < hdrlen + 8) -+ if (skb->len < hdrlen) - return -1; - - /* convert IEEE 802.11 header + possible LLC headers into Ethernet -@@ -572,8 +572,9 @@ int ieee80211_data_to_8023_exthdr(struct - memcpy(tmp.h_dest, ieee80211_get_DA(hdr), ETH_ALEN); - memcpy(tmp.h_source, ieee80211_get_SA(hdr), ETH_ALEN); - -- if (iftype == NL80211_IFTYPE_MESH_POINT) -- skb_copy_bits(skb, hdrlen, &mesh_flags, 1); -+ if (iftype == NL80211_IFTYPE_MESH_POINT && -+ skb_copy_bits(skb, hdrlen, &mesh_flags, 1) < 0) -+ return -1; - - mesh_flags &= MESH_FLAGS_AE; - -@@ -593,11 +594,12 @@ int ieee80211_data_to_8023_exthdr(struct - if (iftype == NL80211_IFTYPE_MESH_POINT) { - if (mesh_flags == MESH_FLAGS_AE_A4) - return -1; -- if (mesh_flags == MESH_FLAGS_AE_A5_A6) { -- skb_copy_bits(skb, hdrlen + -- offsetof(struct ieee80211s_hdr, eaddr1), -- tmp.h_dest, 2 * ETH_ALEN); -- } -+ if (mesh_flags == MESH_FLAGS_AE_A5_A6 && -+ skb_copy_bits(skb, hdrlen + -+ offsetof(struct ieee80211s_hdr, eaddr1), -+ tmp.h_dest, 2 * ETH_ALEN) < 0) -+ return -1; -+ - hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags); - } - break; -@@ -611,10 +613,11 @@ int ieee80211_data_to_8023_exthdr(struct - if (iftype == NL80211_IFTYPE_MESH_POINT) { - if (mesh_flags == MESH_FLAGS_AE_A5_A6) - return -1; -- if (mesh_flags == MESH_FLAGS_AE_A4) -- skb_copy_bits(skb, hdrlen + -- offsetof(struct ieee80211s_hdr, eaddr1), -- tmp.h_source, ETH_ALEN); -+ if (mesh_flags == MESH_FLAGS_AE_A4 && -+ skb_copy_bits(skb, hdrlen + -+ offsetof(struct ieee80211s_hdr, eaddr1), -+ tmp.h_source, ETH_ALEN) < 0) -+ return -1; - hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags); - } - break; -@@ -626,18 +629,18 @@ int ieee80211_data_to_8023_exthdr(struct - break; - } - -- skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)); -- tmp.h_proto = payload.proto; -- -- if (likely((!is_amsdu && ether_addr_equal(payload.hdr, rfc1042_header) && -- tmp.h_proto != htons(ETH_P_AARP) && -- tmp.h_proto != htons(ETH_P_IPX)) || -- ether_addr_equal(payload.hdr, bridge_tunnel_header))) -+ if (likely(skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)) == 0 && -+ ((!is_amsdu && ether_addr_equal(payload.hdr, rfc1042_header) && -+ payload.proto != htons(ETH_P_AARP) && -+ payload.proto != htons(ETH_P_IPX)) || -+ ether_addr_equal(payload.hdr, bridge_tunnel_header)))) { - /* remove RFC1042 or Bridge-Tunnel encapsulation and - * replace EtherType */ - hdrlen += ETH_ALEN + 2; -- else -+ tmp.h_proto = payload.proto; -+ } else { - tmp.h_proto = htons(skb->len - hdrlen); -+ } - - pskb_pull(skb, hdrlen); - diff --git a/package/kernel/mac80211/patches/subsys/345-wifi-mac80211-do-not-drop-packets-smaller-than-the-L.patch b/package/kernel/mac80211/patches/subsys/345-wifi-mac80211-do-not-drop-packets-smaller-than-the-L.patch deleted file mode 100644 index 23047f68c9..0000000000 --- a/package/kernel/mac80211/patches/subsys/345-wifi-mac80211-do-not-drop-packets-smaller-than-the-L.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Felix Fietkau -Date: Fri, 7 Oct 2022 10:58:26 +0200 -Subject: [PATCH] wifi: mac80211: do not drop packets smaller than the - LLC-SNAP header on fast-rx - -Since STP TCN frames are only 7 bytes, the pskb_may_pull call returns an error. -Instead of dropping those packets, bump them back to the slow path for proper -processing. - -Fixes: 49ddf8e6e234 ("mac80211: add fast-rx path") -Reported-by: Chad Monroe -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/rx.c -+++ b/net/mac80211/rx.c -@@ -4603,7 +4603,7 @@ static bool ieee80211_invoke_fast_rx(str - - if (!(status->rx_flags & IEEE80211_RX_AMSDU)) { - if (!pskb_may_pull(skb, snap_offs + sizeof(*payload))) -- goto drop; -+ return false; - - payload = (void *)(skb->data + snap_offs); - diff --git a/package/kernel/mac80211/patches/subsys/346-v6.0-wifi-mac80211-fix-mesh-airtime-link-metric-estimatin.patch b/package/kernel/mac80211/patches/subsys/346-v6.0-wifi-mac80211-fix-mesh-airtime-link-metric-estimatin.patch deleted file mode 100644 index 7185a7fed6..0000000000 --- a/package/kernel/mac80211/patches/subsys/346-v6.0-wifi-mac80211-fix-mesh-airtime-link-metric-estimatin.patch +++ /dev/null @@ -1,36 +0,0 @@ -From: Aditya Kumar Singh -Date: Fri, 1 Jul 2022 19:06:11 +0530 -Subject: [PATCH] wifi: mac80211: fix mesh airtime link metric estimating - -ieee80211s_update_metric function uses sta_set_rate_info_tx -function to get struct rate_info data from ieee80211_tx_rate -struct, present in ieee80211_sta->deflink.tx_stats. However, -drivers can skip tx rate calculation by setting rate idx as --1. Such drivers provides rate_info directly and hence -ieee80211s metric is updated incorrectly since ieee80211_tx_rate -has inconsistent data. - -Add fix to use rate_info directly if present instead of -sta_set_rate_info_tx for updating ieee80211s metric. - -Signed-off-by: Aditya Kumar Singh -Link: https://lore.kernel.org/r/20220701133611.544-1-quic_adisi@quicinc.com -Signed-off-by: Johannes Berg ---- - ---- a/net/mac80211/mesh_hwmp.c -+++ b/net/mac80211/mesh_hwmp.c -@@ -310,7 +310,12 @@ void ieee80211s_update_metric(struct iee - LINK_FAIL_THRESH) - mesh_plink_broken(sta); - -- sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate, &rinfo); -+ /* use rate info set by the driver directly if present */ -+ if (st->rate) -+ rinfo = sta->tx_stats.last_rate_info; -+ else -+ sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate, &rinfo); -+ - ewma_mesh_tx_rate_avg_add(&sta->mesh->tx_rate_avg, - cfg80211_calculate_bitrate(&rinfo)); - } diff --git a/package/kernel/mac80211/patches/subsys/400-allow-ibss-mixed.patch b/package/kernel/mac80211/patches/subsys/400-allow-ibss-mixed.patch new file mode 100644 index 0000000000..c38fa13f03 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/400-allow-ibss-mixed.patch @@ -0,0 +1,40 @@ +From: Hauke Mehrtens +Date: Mon, 24 Feb 2020 00:00:00 +0100 +Subject: [PATCH] mac80211: Allow IBSS mode and different beacon intervals + +ath10k-ct supports the combination to select IBSS (ADHOC) mode and +different beacon intervals together. mac80211 does not like this +combination, but Ben says this is ok, so remove this check. + +ath10k-ct starting with version 5.2 allows the combination of +NL80211_IFTYPE_ADHOC and beacon_int_min_gcd in ath10k_10x_ct_if_comb +which triggers this warning. Ben told me that this is not a big problem +and we should ignore this. +--- + net/wireless/core.c | 15 --------------- + 1 file changed, 15 deletions(-) + +--- a/net/wireless/core.c ++++ b/net/wireless/core.c +@@ -614,21 +614,6 @@ static int wiphy_verify_combinations(str + c->limits[j].max > 1)) + return -EINVAL; + +- /* +- * This isn't well-defined right now. If you have an +- * IBSS interface, then its beacon interval may change +- * by joining other networks, and nothing prevents it +- * from doing that. +- * So technically we probably shouldn't even allow AP +- * and IBSS in the same interface, but it seems that +- * some drivers support that, possibly only with fixed +- * beacon intervals for IBSS. +- */ +- if (WARN_ON(types & BIT(NL80211_IFTYPE_ADHOC) && +- c->beacon_int_min_gcd)) { +- return -EINVAL; +- } +- + cnt += c->limits[j].max; + /* + * Don't advertise an unsupported type 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 962ae93cc7..58a590682a 100644 --- a/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch +++ b/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch @@ -1,6 +1,6 @@ --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h -@@ -3869,6 +3869,7 @@ struct mgmt_frame_regs { +@@ -4084,6 +4084,7 @@ struct mgmt_frame_regs { * (as advertised by the nl80211 feature flag.) * @get_tx_power: store the current TX power into the dbm variable; * return 0 if successful @@ -8,7 +8,7 @@ * * @rfkill_poll: polls the hw rfkill line, use cfg80211 reporting * functions to adjust rfkill hw state -@@ -4202,6 +4203,7 @@ struct cfg80211_ops { +@@ -4434,6 +4435,7 @@ struct cfg80211_ops { enum nl80211_tx_power_setting type, int mbm); int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, int *dbm); @@ -18,7 +18,7 @@ --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -1566,6 +1566,7 @@ enum ieee80211_smps_mode { +@@ -1677,6 +1677,7 @@ enum ieee80211_smps_mode { * * @power_level: requested transmit power (in dBm), backward compatibility * value only that is set to the minimum of all interfaces @@ -26,7 +26,7 @@ * * @chandef: the channel definition to tune to * @radar_enabled: whether radar detection is enabled -@@ -1586,6 +1587,7 @@ enum ieee80211_smps_mode { +@@ -1697,6 +1698,7 @@ enum ieee80211_smps_mode { struct ieee80211_conf { u32 flags; int power_level, dynamic_ps_timeout; @@ -36,19 +36,19 @@ u8 ps_dtim_period; --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h -@@ -2615,6 +2615,9 @@ enum nl80211_commands { - * switching on a different channel during CAC detection on the selected - * radar channel. - * +@@ -2749,6 +2749,9 @@ enum nl80211_commands { + * When used with %NL80211_CMD_FRAME_TX_STATUS, indicates the ack RX + * timestamp. When used with %NL80211_CMD_FRAME RX notification, indicates + * the incoming frame RX timestamp. + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce + * transmit power to stay within regulatory limits. u32, dBi. + * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use -@@ -3123,6 +3126,8 @@ enum nl80211_attrs { - - NL80211_ATTR_RADAR_BACKGROUND, +@@ -3277,6 +3280,8 @@ enum nl80211_attrs { + NL80211_ATTR_TX_HW_TIMESTAMP, + NL80211_ATTR_RX_HW_TIMESTAMP, + NL80211_ATTR_WIPHY_ANTENNA_GAIN, + @@ -57,7 +57,7 @@ __NL80211_ATTR_AFTER_LAST, --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -2812,6 +2812,19 @@ static int ieee80211_get_tx_power(struct +@@ -3046,6 +3046,19 @@ static int ieee80211_get_tx_power(struct return 0; } @@ -77,7 +77,7 @@ static void ieee80211_rfkill_poll(struct wiphy *wiphy) { struct ieee80211_local *local = wiphy_priv(wiphy); -@@ -4513,6 +4526,7 @@ const struct cfg80211_ops mac80211_confi +@@ -4956,6 +4969,7 @@ const struct cfg80211_ops mac80211_confi .set_wiphy_params = ieee80211_set_wiphy_params, .set_tx_power = ieee80211_set_tx_power, .get_tx_power = ieee80211_get_tx_power, @@ -87,7 +87,7 @@ CFG80211_TESTMODE_DUMP(ieee80211_testmode_dump) --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h -@@ -1447,6 +1447,7 @@ struct ieee80211_local { +@@ -1542,6 +1542,7 @@ struct ieee80211_local { int dynamic_ps_forced_timeout; int user_power_level; /* in dBm, for all interfaces */ @@ -119,7 +119,7 @@ if (local->hw.conf.power_level != power) { changed |= IEEE80211_CONF_CHANGE_POWER; local->hw.conf.power_level = power; -@@ -679,6 +685,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ +@@ -762,6 +768,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ IEEE80211_RADIOTAP_MCS_HAVE_BW; local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI | IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH; @@ -129,15 +129,15 @@ local->hw.max_mtu = IEEE80211_MAX_DATA_LEN; --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c -@@ -802,6 +802,7 @@ static const struct nla_policy nl80211_p - NLA_POLICY_NESTED(nl80211_mbssid_config_policy), - [NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED }, - [NL80211_ATTR_RADAR_BACKGROUND] = { .type = NLA_FLAG }, +@@ -799,6 +799,7 @@ static const struct nla_policy nl80211_p + [NL80211_ATTR_MLD_ADDR] = NLA_POLICY_EXACT_LEN(ETH_ALEN), + [NL80211_ATTR_MLO_SUPPORT] = { .type = NLA_FLAG }, + [NL80211_ATTR_MAX_NUM_AKM_SUITES] = { .type = NLA_REJECT }, + [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 }, }; /* policy for the key attributes */ -@@ -3391,6 +3392,22 @@ static int nl80211_set_wiphy(struct sk_b +@@ -3511,6 +3512,22 @@ static int nl80211_set_wiphy(struct sk_b if (result) goto out; } diff --git a/package/kernel/nat46/Makefile b/package/kernel/nat46/Makefile index c365026f08..5e5efbe101 100644 --- a/package/kernel/nat46/Makefile +++ b/package/kernel/nat46/Makefile @@ -3,11 +3,11 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=nat46 -PKG_MIRROR_HASH:=1476da31996e26ef76e2ba9623d978d33002abf357a59323d9b539812b0a4b76 +PKG_MIRROR_HASH:=aeff95aa278ec1e197b59700284c0210f32b92c1fb757e5c3088bd00b3b403d4 PKG_SOURCE_URL:=https://github.com/ayourtch/nat46.git -PKG_SOURCE_DATE:=2021-11-24 +PKG_SOURCE_DATE:=2022-09-19 PKG_SOURCE_PROTO:=git -PKG_SOURCE_VERSION:=d9bc161faa4c18ad1d327a96baa2dc4460b71ccd +PKG_SOURCE_VERSION:=4c5beee236841724219598fabb1edc93d4f08ce5 PKG_MAINTAINER:=Hans Dedecker PKG_LICENSE:=GPL-2.0 @@ -15,7 +15,7 @@ PKG_LICENSE:=GPL-2.0 include $(INCLUDE_DIR)/package.mk define KernelPackage/nat46 - DEPENDS:=@IPV6 + DEPENDS:=@IPV6 +kmod-nf-conntrack6 TITLE:=Stateless NAT46 translation kernel module SECTION:=kernel SUBMENU:=Network Support diff --git a/package/libs/argp-standalone/Makefile b/package/libs/argp-standalone/Makefile index 1a48dcb2cd..23e5169796 100644 --- a/package/libs/argp-standalone/Makefile +++ b/package/libs/argp-standalone/Makefile @@ -19,6 +19,8 @@ PKG_MAINTAINER:=Ted Hess PKG_LICENSE:=LGPL-2.1 PKG_LICENSE:=Makefile.am +PKG_BUILD_FLAGS:=no-lto + include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/host-build.mk diff --git a/package/libs/c-ares/Makefile b/package/libs/c-ares/Makefile new file mode 100644 index 0000000000..9f5a9424bb --- /dev/null +++ b/package/libs/c-ares/Makefile @@ -0,0 +1,63 @@ +# +# Copyright (C) 2009-2010 OpenWrt.org +# Copyright (C) 2009 Jakob Pfeiffer +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=c-ares +PKG_VERSION:=1.19.1 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://c-ares.org/download +PKG_HASH:=321700399b72ed0e037d0074c629e7741f6b2ec2dda92956abe3e9671d3e268e + +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=LICENSE.md +PKG_CPE_ID:=cpe:/a:c-ares_project:c-ares + +CMAKE_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/libcares + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Library for asyncronous DNS Requests (including name resolves) + URL:=http://c-ares.haxx.se/ + MAINTAINER:=Karl Palsson +endef + +define Package/libcares/description + c-ares is a C library for asynchronous DNS requests (including name resolves) + +C89 compatibility, MIT licensed, builds for and runs on POSIX, Windows, +Netware, Android and many more operating systems. + +endef + +CMAKE_OPTIONS += \ + -DCARES_STATIC=OFF \ + -DCARES_SHARED=ON \ + -DCARES_STATIC_PIC=ON \ + -DCARES_BUILD_TESTS=OFF \ + -DCARES_BUILD_TOOLS=OFF + +define Build/InstallDev + $(call Build/InstallDev/cmake,$(1)) + $(SED) 's,/usr/bin,$$$${prefix}/lib,g' $(1)/usr/lib/pkgconfig/libcares.pc + $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/libcares.pc + $(SED) 's,/usr/lib,$$$${prefix}/lib,g' $(1)/usr/lib/pkgconfig/libcares.pc +endef + +define Package/libcares/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcares.so.* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libcares)) diff --git a/package/libs/elfutils/Makefile b/package/libs/elfutils/Makefile index 9aa78d8352..f7364c36be 100644 --- a/package/libs/elfutils/Makefile +++ b/package/libs/elfutils/Makefile @@ -7,12 +7,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=elfutils -PKG_VERSION:=0.186 +PKG_VERSION:=0.189 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=https://sourceware.org/$(PKG_NAME)/ftp/$(PKG_VERSION) -PKG_HASH:=7f6fb9149b1673d38d9178a0d3e0fb8a1ec4f53a9f4c2ff89469609879641177 +PKG_HASH:=39bd8f1a338e2b7cd4abc3ff11a0eddc6e690f69578a57478d8179b4148708c8 PKG_MAINTAINER:=Luiz Angelo Daros de Luca PKG_LICENSE:=GPL-3.0-or-later @@ -21,12 +21,10 @@ PKG_CPE_ID:=cpe:/a:elfutils_project:elfutils PKG_FIXUP:=autoreconf PKG_INSTALL:=1 -PKG_USE_MIPS16:=1 PKG_BUILD_DEPENDS:=!USE_GLIBC:argp-standalone include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/nls.mk -include $(INCLUDE_DIR)/host-build.mk define Package/elfutils/Default SECTION:=libs @@ -62,8 +60,11 @@ CONFIGURE_ARGS += --disable-nls endif HOST_CONFIGURE_ARGS += \ + --disable-shared \ + --disable-nls \ --disable-debuginfod \ --disable-libdebuginfod \ + --without-bzlib \ --without-lzma \ --without-zstd @@ -71,6 +72,7 @@ CONFIGURE_ARGS += \ --program-prefix=eu- \ --disable-debuginfod \ --disable-libdebuginfod \ + --without-bzlib \ --without-lzma \ --without-zstd @@ -80,7 +82,15 @@ HOST_CONFIGURE_VARS += \ CONFIGURE_VARS += \ ac_cv_search__obstack_free=yes -TARGET_CFLAGS += -D_GNU_SOURCE -Wno-unused-result -Wno-format-nonliteral +TARGET_CFLAGS += \ + -D_GNU_SOURCE \ + -Wno-unused-result \ + -Wno-format-nonliteral + +ifneq ($(CONFIG_GCC_USE_VERSION_11),y) +TARGET_CFLAGS += \ + -Wno-error=use-after-free +endif define Build/InstallDev $(INSTALL_DIR) $(1)/usr/include @@ -110,7 +120,6 @@ define Package/libelf/install endef # these lines need to be ordered by dependency because of ABI versioning -$(eval $(call HostBuild)) $(eval $(call BuildPackage,libelf)) $(eval $(call BuildPackage,libdw)) $(eval $(call BuildPackage,libasm)) diff --git a/package/libs/elfutils/patches/003-libintl-compatibility.patch b/package/libs/elfutils/patches/003-libintl-compatibility.patch index 3254dcffb2..1271796af5 100644 --- a/package/libs/elfutils/patches/003-libintl-compatibility.patch +++ b/package/libs/elfutils/patches/003-libintl-compatibility.patch @@ -8,10 +8,10 @@ +Libs: -L${libdir} -lelf @intl_LDFLAGS@ Cflags: -I${includedir} - Requires.private: zlib + Requires.private: zlib @LIBZSTD@ --- a/configure.ac +++ b/configure.ac -@@ -610,6 +610,9 @@ dnl AM_GNU_GETTEXT_REQUIRE_VERSION suppo +@@ -717,6 +717,9 @@ dnl AM_GNU_GETTEXT_REQUIRE_VERSION suppo AM_GNU_GETTEXT_VERSION([0.19.6]) AM_GNU_GETTEXT_REQUIRE_VERSION([0.19.6]) diff --git a/package/libs/elfutils/patches/100-musl-compat.patch b/package/libs/elfutils/patches/100-musl-compat.patch index 52b9f2c43b..3fa095bd74 100644 --- a/package/libs/elfutils/patches/100-musl-compat.patch +++ b/package/libs/elfutils/patches/100-musl-compat.patch @@ -9,7 +9,7 @@ } --- a/libdwfl/dwfl_error.c +++ b/libdwfl/dwfl_error.c -@@ -140,6 +140,7 @@ __libdwfl_seterrno (Dwfl_Error error) +@@ -139,6 +139,7 @@ __libdwfl_seterrno (Dwfl_Error error) static const char * errnomsg(int error) { @@ -17,7 +17,7 @@ /* Won't be changed by strerror_r, but not const so compiler doesn't throw warning */ static char unknown[] = "unknown error"; -@@ -150,6 +151,9 @@ errnomsg(int error) +@@ -149,6 +150,9 @@ errnomsg(int error) static __thread char msg[128]; return strerror_r (error, msg, sizeof (msg)) ? unknown : msg; #endif diff --git a/package/libs/elfutils/patches/101-no-fts.patch b/package/libs/elfutils/patches/101-no-fts.patch index c4f0b88233..29a6c4b36c 100644 --- a/package/libs/elfutils/patches/101-no-fts.patch +++ b/package/libs/elfutils/patches/101-no-fts.patch @@ -1,6 +1,6 @@ --- a/libdwfl/argp-std.c +++ b/libdwfl/argp-std.c -@@ -53,9 +53,6 @@ static const struct argp_option options[ +@@ -51,9 +51,6 @@ static const struct argp_option options[ { "linux-process-map", 'M', "FILE", 0, N_("Find addresses in files mapped as read from FILE" " in Linux /proc/PID/maps format"), 0 }, @@ -10,7 +10,7 @@ { "debuginfo-path", OPT_DEBUGINFO, "PATH", 0, N_("Search path for separate debuginfo files"), 0 }, { NULL, 0, NULL, 0, NULL, 0 } -@@ -82,15 +79,6 @@ static const Dwfl_Callbacks proc_callbac +@@ -80,15 +77,6 @@ static const Dwfl_Callbacks proc_callbac .find_elf = INTUSE(dwfl_linux_proc_find_elf), }; @@ -26,7 +26,7 @@ /* Structure held at state->HOOK. */ struct parse_opt { -@@ -223,43 +211,6 @@ parse_opt (int key, char *arg, struct ar +@@ -221,43 +209,6 @@ parse_opt (int key, char *arg, struct ar } break; diff --git a/package/libs/expat/Makefile b/package/libs/expat/Makefile index 78c417cfa2..a0f6a241e3 100644 --- a/package/libs/expat/Makefile +++ b/package/libs/expat/Makefile @@ -6,12 +6,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=expat -PKG_VERSION:=2.4.9 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=2.5.0 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=@SF/expat -PKG_HASH:=6e8c0728fe5c7cd3f93a6acce43046c5e4736c7b4b68e032e9350daa0efc0354 +PKG_SOURCE_URL:=@SF/expat \ + https://github.com/libexpat/libexpat/releases/download/R_$(subst .,_,$(PKG_VERSION)) +PKG_HASH:=ef2420f0232c087801abf705e89ae65f6257df6b7931d37846a193ef2e8cdcbe PKG_MAINTAINER:=Ted Hess PKG_LICENSE:=MIT diff --git a/package/libs/gettext-full/Makefile b/package/libs/gettext-full/Makefile index f5f5e00542..1ed0e82df0 100644 --- a/package/libs/gettext-full/Makefile +++ b/package/libs/gettext-full/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gettext-full -PKG_VERSION:=0.21 +PKG_VERSION:=0.21.1 PKG_RELEASE:=2 PKG_SOURCE:=gettext-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/gettext -PKG_HASH:=d20fcbb537e02dcf1383197ba05bd0734ef7bf5db06bdb241eb69b7d16b73192 +PKG_HASH:=50dbc8f39797950aa2c98e939947c527e5ac9ebd2c1b99dd7b06ba33a6767ae6 PKG_BUILD_DIR:=$(BUILD_DIR)/gettext-$(PKG_VERSION) HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/gettext-$(PKG_VERSION) @@ -21,12 +21,42 @@ PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=GPL-3.0-or-later PKG_CPE_ID:=cpe:/a:gnu:gettext -PKG_FIXUP:=autoreconf PKG_INSTALL:=1 -PKG_BUILD_DEPENDS:=gettext-full/host +PKG_BUILD_DEPENDS:=gettext-full/host libunistring libxml2 PKG_BUILD_PARALLEL:=0 + +HOST_BUILD_DEPENDS:=gperf/host libunistring/host libxml2/host HOST_BUILD_PARALLEL:=0 +PKG_SUBDIRS:= \ + $$$$(foreach dir, \ + intl \ + intl-csharp \ + intl-java \ + its \ + gnulib-lib \ + gnulib-local \ + lib \ + $$$$(SUBDIR_libasprintf) \ + libgettextpo \ + libgrep \ + libtextstyle \ + m4 \ + misc \ + po \ + projects \ + src \ + styles \ + gettext-runtime \ + gettext-tools \ + ,$$$$(wildcard $$$$(dir)) ) + +PKG_MAKEFILES_FAKE:= \ + gnulib-local/m4/Makefile \ + libtextstyle/gnulib-local/Makefile \ + libtextstyle/m4/Makefile \ + m4/Makefile + include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/host-build.mk @@ -38,6 +68,8 @@ define Package/libintl-full ABI_VERSION:=8 endef +export GNULIB_SRCDIR:=$(HOST_GNULIB_SRCDIR) + TARGET_CFLAGS += $(FPIC) ifneq ($(HOST_OS),Linux) TARGET_CFLAGS += -I$(STAGING_DIR_HOSTPKG)/include @@ -55,6 +87,8 @@ CONFIGURE_ARGS += \ --with-included-gettext \ --without-libintl-prefix \ --without-libexpat-prefix \ + --with-libunistring-prefix=$(STAGING_DIR)/usr \ + --with-libxml2-prefix=$(STAGING_DIR) \ --without-emacs HOST_CONFIGURE_ARGS += \ @@ -65,7 +99,8 @@ HOST_CONFIGURE_ARGS += \ --disable-java \ --disable-openmp \ --without-emacs \ - --without-libxml2-prefix + --with-libunistring-prefix=$(STAGING_DIR_HOSTPKG) \ + --with-libxml2-prefix=$(STAGING_DIR_HOSTPKG) HOST_CONFIGURE_VARS += \ EMACS="no" \ @@ -75,6 +110,52 @@ HOST_CONFIGURE_VARS += \ HOST_CFLAGS += $(HOST_FPIC) +define Host/Bootstrap + ( \ + cd $(HOST_BUILD_DIR); \ + $(AM_TOOL_PATHS) \ + ./autogen.sh \ + ) +endef + +define Host/Prepare + $(call Host/Prepare/Default) + $(if $(QUILT),,$(call Host/Bootstrap)) +endef + +define Host/Configure + $(if $(QUILT),$(call Host/Bootstrap)) + $(call Host/Configure/Default) +endef + +define Host/Compile + $(foreach makefile,$(PKG_MAKEFILES_FAKE),printf '%s\n%s\n' 'all:' 'install:' > $(HOST_BUILD_DIR)/$(makefile); ) + $(call Host/Compile/Default,SUBDIRS='$(PKG_SUBDIRS)') +endef + +define Build/Bootstrap + ( \ + cd $(PKG_BUILD_DIR); \ + $(AM_TOOL_PATHS) \ + ./autogen.sh \ + ) +endef + +define Build/Prepare + $(call Build/Prepare/Default) + $(if $(QUILT),,$(call Build/Bootstrap)) +endef + +define Build/Configure + $(if $(QUILT),$(call Build/Bootstrap)) + $(call Build/Configure/Default) +endef + +define Build/Compile + $(foreach makefile,$(PKG_MAKEFILES_FAKE),printf '%s\n%s\n' 'all:' 'install:' > $(PKG_BUILD_DIR)/$(makefile); ) + $(call Build/Compile/Default,SUBDIRS='$(PKG_SUBDIRS)') +endef + define Build/InstallDev $(INSTALL_DIR) $(1)/usr/lib/libintl-full/include $(CP) $(PKG_INSTALL_DIR)/usr/include/libintl.h $(1)/usr/lib/libintl-full/include/ @@ -89,10 +170,14 @@ define Build/InstallDev endef define Host/Install - $(call Host/Install/Default) + $(call Host/Compile/Default,install SUBDIRS='$(PKG_SUBDIRS)') $(LN) msgfmt $(STAGING_DIR_HOSTPKG)/bin/gmsgfmt endef +define Build/Install + $(call Build/Install/Default,install SUBDIRS='$(PKG_SUBDIRS)') +endef + define Package/libintl-full/install $(INSTALL_DIR) $(1)/usr/lib $(CP) $(PKG_INSTALL_DIR)/usr/lib/libintl.so.* $(1)/usr/lib/ diff --git a/package/libs/gettext-full/patches/001-autotools.patch b/package/libs/gettext-full/patches/001-autotools.patch index 034fc938a3..7e1f005dc5 100644 --- a/package/libs/gettext-full/patches/001-autotools.patch +++ b/package/libs/gettext-full/patches/001-autotools.patch @@ -12,7 +12,7 @@ $(INSTALL_DATA) $$dir/$$file $(DESTDIR)$(htmldir)/$$file; \ --- a/gettext-tools/man/Makefile.am +++ b/gettext-tools/man/Makefile.am -@@ -157,8 +157,7 @@ recode-sr-latin.1.html: recode-sr-latin. +@@ -158,8 +158,7 @@ recode-sr-latin.1.html: recode-sr-latin. gettextize.1.html: gettextize.1 autopoint.1.html: autopoint.1 diff --git a/package/libs/gettext-full/patches/001-no_examples_and_tests.patch b/package/libs/gettext-full/patches/001-no_examples_and_tests.patch deleted file mode 100644 index d813d20ed6..0000000000 --- a/package/libs/gettext-full/patches/001-no_examples_and_tests.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/gettext-runtime/Makefile.am -+++ b/gettext-runtime/Makefile.am -@@ -27,7 +27,7 @@ SUBDIR_libasprintf = libasprintf - else - SUBDIR_libasprintf = - endif --SUBDIRS = doc intl intl-java intl-csharp gnulib-lib $(SUBDIR_libasprintf) src po man m4 tests -+SUBDIRS = intl intl-java intl-csharp gnulib-lib $(SUBDIR_libasprintf) src po m4 - - EXTRA_DIST = BUGS - ---- a/gettext-tools/Makefile.am -+++ b/gettext-tools/Makefile.am -@@ -19,7 +19,7 @@ - AUTOMAKE_OPTIONS = 1.5 gnu no-dependencies - ACLOCAL_AMFLAGS = -I m4 -I ../gettext-runtime/m4 -I ../m4 -I gnulib-m4 -I libgrep/gnulib-m4 -I libgettextpo/gnulib-m4 - --SUBDIRS = intl gnulib-lib libgrep src libgettextpo po its projects styles emacs misc man m4 tests system-tests gnulib-tests examples doc -+SUBDIRS = intl gnulib-lib libgrep src libgettextpo po its projects styles misc m4 - - EXTRA_DIST = misc/DISCLAIM - MOSTLYCLEANFILES = core *.stackdump diff --git a/package/libs/gettext-full/patches/010-m4.patch b/package/libs/gettext-full/patches/010-m4.patch deleted file mode 100644 index 6d08835e37..0000000000 --- a/package/libs/gettext-full/patches/010-m4.patch +++ /dev/null @@ -1,382 +0,0 @@ ---- a/gettext-runtime/gnulib-m4/stddef_h.m4 -+++ b/gettext-runtime/gnulib-m4/stddef_h.m4 -@@ -8,7 +8,7 @@ dnl with or without modifications, as lo - AC_DEFUN([gl_STDDEF_H], - [ - AC_REQUIRE([gl_STDDEF_H_DEFAULTS]) -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) - STDDEF_H= - - dnl Test whether the type max_align_t exists and whether its alignment ---- a/gettext-runtime/gnulib-m4/stdint.m4 -+++ b/gettext-runtime/gnulib-m4/stdint.m4 -@@ -15,7 +15,7 @@ AC_DEFUN_ONCE([gl_STDINT_H], - AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles - - AC_REQUIRE([gl_LIMITS_H]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - - dnl For backward compatibility. Some packages may still be testing these - dnl macros. ---- a/gettext-runtime/gnulib-m4/wchar_h.m4 -+++ b/gettext-runtime/gnulib-m4/wchar_h.m4 -@@ -27,7 +27,7 @@ AC_DEFUN([gl_WCHAR_H], - - AC_REQUIRE([gl_FEATURES_H]) - -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - if test $gt_cv_c_wint_t = yes; then - HAVE_WINT_T=1 - else ---- a/gettext-runtime/gnulib-m4/wchar_t.m4 -+++ b/gettext-runtime/gnulib-m4/wchar_t.m4 -@@ -8,7 +8,7 @@ dnl From Bruno Haible. - dnl Test whether has the 'wchar_t' type. - dnl Prerequisite: AC_PROG_CC - --AC_DEFUN([gt_TYPE_WCHAR_T], -+AC_DEFUN([gt_TYPE_WCHAR_T_GT], - [ - AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t], - [AC_COMPILE_IFELSE( ---- a/gettext-runtime/gnulib-m4/wctype_h.m4 -+++ b/gettext-runtime/gnulib-m4/wctype_h.m4 -@@ -22,7 +22,7 @@ AC_DEFUN([gl_WCTYPE_H], - fi - AC_SUBST([HAVE_ISWCNTRL]) - -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - if test $gt_cv_c_wint_t = yes; then - HAVE_WINT_T=1 - else ---- a/gettext-runtime/gnulib-m4/wcwidth.m4 -+++ b/gettext-runtime/gnulib-m4/wcwidth.m4 -@@ -12,8 +12,8 @@ AC_DEFUN([gl_FUNC_WCWIDTH], - dnl Persuade glibc to declare wcwidth(). - AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) - -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - - AC_CHECK_HEADERS_ONCE([wchar.h]) - AC_CHECK_FUNCS_ONCE([wcwidth]) ---- a/gettext-runtime/gnulib-m4/wint_t.m4 -+++ b/gettext-runtime/gnulib-m4/wint_t.m4 -@@ -9,7 +9,7 @@ dnl Test whether has the 'wint - dnl or would, if present, override 'wint_t'. - dnl Prerequisite: AC_PROG_CC - --AC_DEFUN([gt_TYPE_WINT_T], -+AC_DEFUN([gt_TYPE_WINT_T_GT], - [ - AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t], - [AC_COMPILE_IFELSE( ---- a/gettext-runtime/intl/Makefile.am -+++ b/gettext-runtime/intl/Makefile.am -@@ -274,7 +274,7 @@ libgnuintl.h: $(srcdir)/libgnuintl.in.h - -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \ - -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \ - -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ -- -e 's,@''HAVE_NAMELESS_LOCALES''@,@HAVE_NAMELESS_LOCALES@,g' \ -+ -e 's,@''HAVE_NAMELESS_LOCALES''@,0,g' \ - -e 's,@''HAVE_NEWLOCALE''@,@HAVE_NEWLOCALE@,g' \ - < $(srcdir)/libgnuintl.in.h \ - | if test '@WOE32DLL@' = yes; then \ -@@ -294,7 +294,7 @@ libintl.h: $(srcdir)/libgnuintl.in.h - -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \ - -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \ - -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ -- -e 's,@''HAVE_NAMELESS_LOCALES''@,@HAVE_NAMELESS_LOCALES@,g' \ -+ -e 's,@''HAVE_NAMELESS_LOCALES''@,0,g' \ - -e 's,@''HAVE_NEWLOCALE''@,@HAVE_NEWLOCALE@,g' \ - < $(srcdir)/libgnuintl.in.h > libintl.h - MOSTLYCLEANFILES += libintl.h ---- a/gettext-runtime/libasprintf/configure.ac -+++ b/gettext-runtime/libasprintf/configure.ac -@@ -76,8 +76,8 @@ dnl Checks for typedefs, structures, and - AC_C_INLINE - AC_TYPE_SIZE_T - AC_TYPE_LONG_LONG_INT --gt_TYPE_WCHAR_T --gt_TYPE_WINT_T -+gt_TYPE_WCHAR_T_GT -+gt_TYPE_WINT_T_GT - AC_TYPE_MBSTATE_T - AC_CHECK_TYPE([ptrdiff_t], , - [AC_DEFINE([ptrdiff_t], [long], ---- a/gettext-runtime/libasprintf/gnulib-m4/wchar_t.m4 -+++ b/gettext-runtime/libasprintf/gnulib-m4/wchar_t.m4 -@@ -8,7 +8,7 @@ dnl From Bruno Haible. - dnl Test whether has the 'wchar_t' type. - dnl Prerequisite: AC_PROG_CC - --AC_DEFUN([gt_TYPE_WCHAR_T], -+AC_DEFUN([gt_TYPE_WCHAR_T_GT], - [ - AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t], - [AC_COMPILE_IFELSE( ---- a/gettext-runtime/libasprintf/gnulib-m4/wint_t.m4 -+++ b/gettext-runtime/libasprintf/gnulib-m4/wint_t.m4 -@@ -9,7 +9,7 @@ dnl Test whether has the 'wint - dnl or would, if present, override 'wint_t'. - dnl Prerequisite: AC_PROG_CC - --AC_DEFUN([gt_TYPE_WINT_T], -+AC_DEFUN([gt_TYPE_WINT_T_GT], - [ - AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t], - [AC_COMPILE_IFELSE( ---- a/gettext-runtime/m4/intl.m4 -+++ b/gettext-runtime/m4/intl.m4 -@@ -31,8 +31,8 @@ AC_DEFUN([AM_INTL_SUBDIR], - AC_REQUIRE([gl_VISIBILITY])dnl - AC_REQUIRE([gt_INTL_SUBDIR_CORE])dnl - AC_REQUIRE([AC_TYPE_LONG_LONG_INT])dnl -- AC_REQUIRE([gt_TYPE_WCHAR_T])dnl -- AC_REQUIRE([gt_TYPE_WINT_T])dnl -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT])dnl -+ AC_REQUIRE([gt_TYPE_WINT_T_GT])dnl - AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) - AC_REQUIRE([gt_TYPE_INTMAX_T]) - AC_REQUIRE([gt_PRINTF_POSIX]) ---- a/gettext-tools/gnulib-m4/gnulib-comp.m4 -+++ b/gettext-tools/gnulib-m4/gnulib-comp.m4 -@@ -1843,8 +1843,8 @@ changequote([, ])dnl - AC_REQUIRE([gl_SOCKETS]) - gl_TYPE_SOCKLEN_T - gl_STDALIGN_H -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - gl_FUNC_STRERROR_R - if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1; then - AC_LIBOBJ([strerror_r]) ---- a/gettext-tools/gnulib-m4/stddef_h.m4 -+++ b/gettext-tools/gnulib-m4/stddef_h.m4 -@@ -8,7 +8,7 @@ dnl with or without modifications, as lo - AC_DEFUN([gl_STDDEF_H], - [ - AC_REQUIRE([gl_STDDEF_H_DEFAULTS]) -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) - STDDEF_H= - - dnl Test whether the type max_align_t exists and whether its alignment ---- a/gettext-tools/gnulib-m4/stdint.m4 -+++ b/gettext-tools/gnulib-m4/stdint.m4 -@@ -15,7 +15,7 @@ AC_DEFUN_ONCE([gl_STDINT_H], - AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles - - AC_REQUIRE([gl_LIMITS_H]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - - dnl For backward compatibility. Some packages may still be testing these - dnl macros. ---- a/gettext-tools/gnulib-m4/vasnprintf.m4 -+++ b/gettext-tools/gnulib-m4/vasnprintf.m4 -@@ -32,16 +32,16 @@ AC_DEFUN([gl_REPLACE_VASNPRINTF], - # Prerequisites of lib/printf-args.h, lib/printf-args.c. - AC_DEFUN([gl_PREREQ_PRINTF_ARGS], - [ -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - ]) - - # Prerequisites of lib/printf-parse.h, lib/printf-parse.c. - AC_DEFUN([gl_PREREQ_PRINTF_PARSE], - [ - AC_REQUIRE([gl_FEATURES_H]) -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - AC_REQUIRE([AC_TYPE_SIZE_T]) - AC_CHECK_TYPE([ptrdiff_t], , - [AC_DEFINE([ptrdiff_t], [long], -@@ -54,8 +54,8 @@ AC_DEFUN([gl_PREREQ_PRINTF_PARSE], - AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF], - [ - AC_REQUIRE([AC_FUNC_ALLOCA]) -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - AC_CHECK_FUNCS([snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb]) - dnl Use the _snprintf function only if it is declared (because on NetBSD it - dnl is defined as a weak alias of snprintf; we prefer to use the latter). ---- a/gettext-tools/gnulib-m4/wchar_h.m4 -+++ b/gettext-tools/gnulib-m4/wchar_h.m4 -@@ -27,7 +27,7 @@ AC_DEFUN([gl_WCHAR_H], - - AC_REQUIRE([gl_FEATURES_H]) - -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - if test $gt_cv_c_wint_t = yes; then - HAVE_WINT_T=1 - else ---- a/gettext-tools/gnulib-m4/wchar_t.m4 -+++ b/gettext-tools/gnulib-m4/wchar_t.m4 -@@ -8,7 +8,7 @@ dnl From Bruno Haible. - dnl Test whether has the 'wchar_t' type. - dnl Prerequisite: AC_PROG_CC - --AC_DEFUN([gt_TYPE_WCHAR_T], -+AC_DEFUN([gt_TYPE_WCHAR_T_GT], - [ - AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t], - [AC_COMPILE_IFELSE( ---- a/gettext-tools/gnulib-m4/wctype_h.m4 -+++ b/gettext-tools/gnulib-m4/wctype_h.m4 -@@ -22,7 +22,7 @@ AC_DEFUN([gl_WCTYPE_H], - fi - AC_SUBST([HAVE_ISWCNTRL]) - -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - if test $gt_cv_c_wint_t = yes; then - HAVE_WINT_T=1 - else ---- a/gettext-tools/gnulib-m4/wcwidth.m4 -+++ b/gettext-tools/gnulib-m4/wcwidth.m4 -@@ -12,8 +12,8 @@ AC_DEFUN([gl_FUNC_WCWIDTH], - dnl Persuade glibc to declare wcwidth(). - AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) - -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - - AC_CHECK_HEADERS_ONCE([wchar.h]) - AC_CHECK_FUNCS_ONCE([wcwidth]) ---- a/gettext-tools/gnulib-m4/wint_t.m4 -+++ b/gettext-tools/gnulib-m4/wint_t.m4 -@@ -9,7 +9,7 @@ dnl Test whether has the 'wint - dnl or would, if present, override 'wint_t'. - dnl Prerequisite: AC_PROG_CC - --AC_DEFUN([gt_TYPE_WINT_T], -+AC_DEFUN([gt_TYPE_WINT_T_GT], - [ - AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t], - [AC_COMPILE_IFELSE( ---- a/gettext-tools/intl/Makefile.am -+++ b/gettext-tools/intl/Makefile.am -@@ -274,7 +274,7 @@ libgnuintl.h: $(srcdir)/libgnuintl.in.h - -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \ - -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \ - -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ -- -e 's,@''HAVE_NAMELESS_LOCALES''@,@HAVE_NAMELESS_LOCALES@,g' \ -+ -e 's,@''HAVE_NAMELESS_LOCALES''@,0,g' \ - -e 's,@''HAVE_NEWLOCALE''@,@HAVE_NEWLOCALE@,g' \ - < $(srcdir)/libgnuintl.in.h \ - | if test '@WOE32DLL@' = yes; then \ -@@ -294,7 +294,7 @@ libintl.h: $(srcdir)/libgnuintl.in.h - -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \ - -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \ - -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ -- -e 's,@''HAVE_NAMELESS_LOCALES''@,@HAVE_NAMELESS_LOCALES@,g' \ -+ -e 's,@''HAVE_NAMELESS_LOCALES''@,0,g' \ - -e 's,@''HAVE_NEWLOCALE''@,@HAVE_NEWLOCALE@,g' \ - < $(srcdir)/libgnuintl.in.h > libintl.h - MOSTLYCLEANFILES += libintl.h ---- a/libtextstyle/gnulib-m4/stddef_h.m4 -+++ b/libtextstyle/gnulib-m4/stddef_h.m4 -@@ -8,7 +8,7 @@ dnl with or without modifications, as lo - AC_DEFUN([gl_STDDEF_H], - [ - AC_REQUIRE([gl_STDDEF_H_DEFAULTS]) -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) - STDDEF_H= - - dnl Test whether the type max_align_t exists and whether its alignment ---- a/libtextstyle/gnulib-m4/stdint.m4 -+++ b/libtextstyle/gnulib-m4/stdint.m4 -@@ -15,7 +15,7 @@ AC_DEFUN_ONCE([gl_STDINT_H], - AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles - - AC_REQUIRE([gl_LIMITS_H]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - - dnl For backward compatibility. Some packages may still be testing these - dnl macros. ---- a/libtextstyle/gnulib-m4/vasnprintf.m4 -+++ b/libtextstyle/gnulib-m4/vasnprintf.m4 -@@ -32,16 +32,16 @@ AC_DEFUN([gl_REPLACE_VASNPRINTF], - # Prerequisites of lib/printf-args.h, lib/printf-args.c. - AC_DEFUN([gl_PREREQ_PRINTF_ARGS], - [ -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - ]) - - # Prerequisites of lib/printf-parse.h, lib/printf-parse.c. - AC_DEFUN([gl_PREREQ_PRINTF_PARSE], - [ - AC_REQUIRE([gl_FEATURES_H]) -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - AC_REQUIRE([AC_TYPE_SIZE_T]) - AC_CHECK_TYPE([ptrdiff_t], , - [AC_DEFINE([ptrdiff_t], [long], -@@ -54,8 +54,8 @@ AC_DEFUN([gl_PREREQ_PRINTF_PARSE], - AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF], - [ - AC_REQUIRE([AC_FUNC_ALLOCA]) -- AC_REQUIRE([gt_TYPE_WCHAR_T]) -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WCHAR_T_GT]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - AC_CHECK_FUNCS([snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb]) - dnl Use the _snprintf function only if it is declared (because on NetBSD it - dnl is defined as a weak alias of snprintf; we prefer to use the latter). ---- a/libtextstyle/gnulib-m4/wchar_h.m4 -+++ b/libtextstyle/gnulib-m4/wchar_h.m4 -@@ -27,7 +27,7 @@ AC_DEFUN([gl_WCHAR_H], - - AC_REQUIRE([gl_FEATURES_H]) - -- AC_REQUIRE([gt_TYPE_WINT_T]) -+ AC_REQUIRE([gt_TYPE_WINT_T_GT]) - if test $gt_cv_c_wint_t = yes; then - HAVE_WINT_T=1 - else ---- a/libtextstyle/gnulib-m4/wchar_t.m4 -+++ b/libtextstyle/gnulib-m4/wchar_t.m4 -@@ -8,7 +8,7 @@ dnl From Bruno Haible. - dnl Test whether has the 'wchar_t' type. - dnl Prerequisite: AC_PROG_CC - --AC_DEFUN([gt_TYPE_WCHAR_T], -+AC_DEFUN([gt_TYPE_WCHAR_T_GT], - [ - AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t], - [AC_COMPILE_IFELSE( ---- a/libtextstyle/gnulib-m4/wint_t.m4 -+++ b/libtextstyle/gnulib-m4/wint_t.m4 -@@ -9,7 +9,7 @@ dnl Test whether has the 'wint - dnl or would, if present, override 'wint_t'. - dnl Prerequisite: AC_PROG_CC - --AC_DEFUN([gt_TYPE_WINT_T], -+AC_DEFUN([gt_TYPE_WINT_T_GT], - [ - AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t], - [AC_COMPILE_IFELSE( diff --git a/package/libs/gettext-full/patches/100-libxml-no-force-included.patch b/package/libs/gettext-full/patches/100-libxml-no-force-included.patch new file mode 100644 index 0000000000..af5c0a47ee --- /dev/null +++ b/package/libs/gettext-full/patches/100-libxml-no-force-included.patch @@ -0,0 +1,31 @@ +--- a/libtextstyle/gnulib-local/modules/libxml.diff ++++ /dev/null +@@ -1,28 +0,0 @@ +-*** libxml.orig 2018-10-28 14:37:07.007164889 +0100 +---- libxml 2019-02-14 22:19:29.994771110 +0100 +-*************** +-*** 118,124 **** +- fabs +- +- configure.ac: +-! gl_LIBXML +- +- Makefile.am: +- if INCLUDED_LIBXML +---- 118,133 ---- +- fabs +- +- configure.ac: +-! # In libtextstyle, we don't want to use an external libxml, because its +-! # dependencies and their dynamic relocations have an impact on the startup +-! # time of a program that is linked with it. As you can see by using +-! # 'readelf -r ... | wc -l' and 'readelf -d ... | grep NEEDED': +-! # - libxml2.so has more than 3300 relocations and depends on libicuuc. +-! # - libicuuc.so has more than 4900 relocations and depends on libstdc++. +-! # - libstdc++.so has more than 4600 relocations. +-! # These are more than 12800 relocations, to perform at program startup. +-! # So, force the use of the included libxml part. +-! gl_LIBXML([yes]) +- +- Makefile.am: +- if INCLUDED_LIBXML diff --git a/package/libs/gettext-full/patches/150-disable_libxml_iconv.patch b/package/libs/gettext-full/patches/150-disable_libxml_iconv.patch deleted file mode 100644 index bf60ecbdb5..0000000000 --- a/package/libs/gettext-full/patches/150-disable_libxml_iconv.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/gettext-tools/gnulib-lib/libxml/xmlversion.in.h -+++ b/gettext-tools/gnulib-lib/libxml/xmlversion.in.h -@@ -302,7 +302,7 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(i - * - * Whether iconv support is available - */ --#if 1 -+#if 0 - #define LIBXML_ICONV_ENABLED - #endif - ---- a/gnulib-local/lib/libxml/xmlversion.in.h -+++ b/gnulib-local/lib/libxml/xmlversion.in.h -@@ -302,7 +302,7 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(i - * - * Whether iconv support is available - */ --#if 1 -+#if 0 - #define LIBXML_ICONV_ENABLED - #endif - diff --git a/package/libs/gettext-full/patches/200-libunistring-missing-link.patch b/package/libs/gettext-full/patches/200-libunistring-missing-link.patch new file mode 100644 index 0000000000..2e1dbf84e8 --- /dev/null +++ b/package/libs/gettext-full/patches/200-libunistring-missing-link.patch @@ -0,0 +1,21 @@ +--- a/autogen.sh ++++ b/autogen.sh +@@ -78,6 +78,7 @@ if ! $skip_gnulib; then + getopt-gnu + gettext-h + havelib ++ libunistring-optional + memmove + noreturn + progname +--- a/gettext-runtime/src/Makefile.am ++++ b/gettext-runtime/src/Makefile.am +@@ -40,7 +40,7 @@ envsubst_SOURCES = envsubst.c + + # Link dependencies. + # Need @LTLIBICONV@ because striconv.c uses iconv(). +-LDADD = ../gnulib-lib/libgrt.a @LTLIBINTL@ @LTLIBICONV@ $(WOE32_LDADD) ++LDADD = ../gnulib-lib/libgrt.a $(LTLIBUNISTRING) @LTLIBINTL@ @LTLIBICONV@ $(WOE32_LDADD) + + # Specify installation directory, for --enable-relocatable. + gettext_CFLAGS = -DINSTALLDIR=\"$(bindir)\" diff --git a/package/libs/glib2/Makefile b/package/libs/glib2/Makefile index b7954dbee6..5ded2fbddf 100644 --- a/package/libs/glib2/Makefile +++ b/package/libs/glib2/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=glib2 -PKG_VERSION:=2.70.5 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=2.74.0 +PKG_RELEASE:=5 PKG_SOURCE:=glib-$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=@GNOME/glib/2.70 -PKG_HASH:=f70bf76ebcc84e0705722f038be8e2f9a58d17e1a700810c635fcc18b8974b7e +PKG_SOURCE_URL:=@GNOME/glib/$(basename $(PKG_VERSION)) +PKG_HASH:=3652c7f072d7b031a6b5edd623f77ebc5dcd2ae698598abcc89ff39ca75add30 PKG_MAINTAINER:=Peter Wagner PKG_LICENSE:=LGPL-2.1-or-later @@ -21,12 +21,12 @@ PKG_LICENSE_FILES:=COPYING PKG_CPE_ID:=cpe:/a:gnome:glib PKG_BUILD_DIR:=$(BUILD_DIR)/glib-$(PKG_VERSION) -HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/glib-$(PKG_VERSION) -PKG_BUILD_DEPENDS:=libiconv/host -HOST_BUILD_DEPENDS:=libiconv/host libffi/host pcre/host PKG_CONFIG_DEPENDS:=CONFIG_BUILD_NLS PKG_FORTIFY_SOURCE:=0 -PKG_INSTALL:=1 +PKG_BUILD_FLAGS:=gc-sections + +HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/glib-$(PKG_VERSION) +HOST_BUILD_DEPENDS:=pcre2/host libffi/host include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/package.mk @@ -36,7 +36,7 @@ include $(INCLUDE_DIR)/meson.mk define Package/glib2 SECTION:=libs CATEGORY:=Libraries - DEPENDS:=$(ICONV_DEPENDS) $(INTL_DEPENDS) +zlib +libpthread +libffi +libattr +libpcre + DEPENDS:=$(ICONV_DEPENDS) $(INTL_DEPENDS) +zlib +libpthread +libffi +libattr +libpcre2 TITLE:=glib 2.0 URL:=http://www.gtk.org/ endef @@ -45,9 +45,6 @@ define Package/glib2/description The GLib library of C routines endef -TARGET_CFLAGS += -ffunction-sections -fdata-sections -TARGET_LDFLAGS += -Wl,--gc-sections - COMP_ARGS= \ -Dselinux=disabled \ -Dlibmount=disabled \ @@ -58,7 +55,6 @@ COMP_ARGS= \ -Dgtk_doc=false \ -Dbsymbolic_functions=true \ -Dforce_posix_threads=true \ - -Dfam=false \ -Dtests=false \ -Dinstalled_tests=false \ -Doss_fuzz=disabled \ diff --git a/package/libs/glib2/patches/006-c99.patch b/package/libs/glib2/patches/006-c99.patch index f2f168c16e..de348d3850 100644 --- a/package/libs/glib2/patches/006-c99.patch +++ b/package/libs/glib2/patches/006-c99.patch @@ -1,6 +1,6 @@ --- a/meson.build +++ b/meson.build -@@ -948,7 +948,7 @@ if host_system == 'windows' and (cc.get_ +@@ -1045,7 +1045,7 @@ if host_system == 'windows' and (cc.get_ glib_conf.set('HAVE_C99_SNPRINTF', false) glib_conf.set('HAVE_C99_VSNPRINTF', false) glib_conf.set('HAVE_UNIX98_PRINTF', false) diff --git a/package/libs/glib2/patches/010-libintl.patch b/package/libs/glib2/patches/010-libintl.patch deleted file mode 100644 index 7e99b82d6f..0000000000 --- a/package/libs/glib2/patches/010-libintl.patch +++ /dev/null @@ -1,144 +0,0 @@ -From 750687bf2824fcaf8976fb8b558d583f29acdfeb Mon Sep 17 00:00:00 2001 -From: Eli Schwartz -Date: Tue, 7 Jun 2022 16:14:04 -0400 -Subject: [PATCH 1/2] meson: simplify iconv lookups using Meson's builtin - dependency lookup - -iconv is complicated to look up. That complexity now resides in -Meson, since 0.60.0, via a `dependency('iconv')` lookup, so use that -instead. - -No effort is made to support the old option for which type of iconv to -use. It was a false choice, because if only one was available, then -that's the only one you can use, and if both are available, the external -iconv shadows the builtin one and renders the builtin one unusable, -so there is still only one you can use. - -This meant that when configuring glib with -Diconv=libc on systems that -had an external iconv, the configure check would detect a valid libc -iconv, try to use it, and then fail during the build because iconv.h -belongs to the external iconv and generates machine code using the -external iconv ABI, but fails to link to the iconv `find_library()`. -Meson handles this transparently. ---- - meson.build | 20 +------------------- - meson_options.txt | 8 +------- - 2 files changed, 2 insertions(+), 26 deletions(-) - ---- a/meson.build -+++ b/meson.build -@@ -1958,28 +1958,10 @@ glibconfig_conf.set10('G_HAVE_GROWING_ST - # We should never use the MinGW C library's iconv because it may not be - # available in the actual runtime environment. On Windows, we always use - # the built-in implementation --iconv_opt = get_option('iconv') - if host_system == 'windows' - libiconv = [] -- # We have a #include "win_iconv.c" in gconvert.c on Windows, so we don't need -- # any external library for it -- if iconv_opt != 'auto' -- warning('-Diconv was set to @0@, which was ignored') -- endif - else -- found_iconv = false -- if ['auto', 'libc'].contains(iconv_opt) and cc.has_function('iconv_open') -- libiconv = [] -- found_iconv = true -- endif -- if not found_iconv and ['auto', 'external'].contains(iconv_opt) and cc.has_header_symbol('iconv.h', 'iconv_open') -- libiconv = [cc.find_library('iconv')] -- found_iconv = true -- endif -- -- if not found_iconv -- error('iconv implementation "@0@" not found'.format(iconv_opt)) -- endif -+ libiconv = dependency('iconv') - endif - - pcre = dependency('libpcre', version: '>= 8.31', required : false) # Should check for Unicode support, too. FIXME -@@ -2046,42 +2028,37 @@ endif - # FIXME: glib-gettext.m4 has much more checks to detect broken/uncompatible - # implementations. This could be extended if issues are found in some platforms. - libintl_deps = [] --if cc.has_function('ngettext', args : osx_ldflags) -- have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset') --else -- # First just find the bare library. -- libintl = cc.find_library('intl', required : false) -- # The bare library probably won't link without help if it's static. -- if libintl.found() and not cc.has_function('ngettext', args : osx_ldflags, dependencies : libintl) -- libintl_iconv = cc.find_library('iconv', required : false) -- # libintl supports different threading APIs, which may not -- # require additional flags, but it defaults to using pthreads if -- # found. Meson's "threads" dependency does not allow you to -- # prefer pthreads. We may not be using pthreads for glib itself -- # either so just link the library to satisfy libintl rather than -- # also defining the macros with the -pthread flag. -- libintl_pthread = cc.find_library('pthread', required : false) -- # Try linking with just libiconv. -- if libintl_iconv.found() and cc.has_function('ngettext', args : osx_ldflags, dependencies : [libintl, libintl_iconv]) -- libintl_deps += [libintl_iconv] -- # Then also try linking with pthreads. -- elif libintl_iconv.found() and libintl_pthread.found() and cc.has_function('ngettext', args : osx_ldflags, dependencies : [libintl, libintl_iconv, libintl_pthread]) -- libintl_deps += [libintl_iconv, libintl_pthread] -- else -- libintl = disabler() -- endif -- endif -- if not libintl.found() -- libintl = subproject('proxy-libintl').get_variable('intl_dep') -- libintl_deps = [libintl] + libintl_deps -- have_bind_textdomain_codeset = true # proxy-libintl supports it -+libintl = dependency('intl', required: false) -+if libintl.found() -+ # libintl supports different threading APIs, which may not -+ # require additional flags, but it defaults to using pthreads if -+ # found. Meson's "threads" dependency does not allow you to -+ # prefer pthreads. We may not be using pthreads for glib itself -+ # either so just link the library to satisfy libintl rather than -+ # also defining the macros with the -pthread flag. -+ # -+ # Meson's builtin dependency lookup as of 0.60.0 doesn't check for -+ # pthread, so we do this manually here. -+ if cc.has_function('ngettext', dependencies : libintl) -+ libintl_deps += [libintl] - else -- libintl_deps = [libintl] + libintl_deps -- have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset', args : osx_ldflags, -- dependencies : libintl_deps) -+ libintl_pthread = cc.find_library('pthread', required : false) -+ if libintl_pthread.found() and cc.has_function('ngettext', dependencies : [libintl, libintl_pthread]) -+ libintl_deps += [libintl, libintl_pthread] -+ else -+ libintl = disabler() -+ endif - endif - endif - -+if libintl.found() -+ have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset', dependencies: libintl_deps) -+else -+ libintl = subproject('proxy-libintl').get_variable('intl_dep') -+ libintl_deps = [libintl] -+ have_bind_textdomain_codeset = true # proxy-libintl supports it -+endif -+ - glib_conf.set('HAVE_BIND_TEXTDOMAIN_CODESET', have_bind_textdomain_codeset) - - # We require gettext to always be present ---- a/meson_options.txt -+++ b/meson_options.txt -@@ -3,12 +3,6 @@ option('runtime_libdir', - value : '', - description : 'install runtime libraries relative to libdir') - --option('iconv', -- type : 'combo', -- choices : ['auto', 'libc', 'external'], -- value : 'auto', -- description : 'iconv implementation to use (\'libc\' = \'Part of the C library\'; \'external\' = \'External libiconv\'; \'auto\' = \'Auto-detect which iconv is available\')') -- - option('charsetalias_dir', - type : 'string', - value : '', diff --git a/package/libs/glib2/patches/010-pcre.patch b/package/libs/glib2/patches/010-pcre.patch new file mode 100644 index 0000000000..87b32e73e9 --- /dev/null +++ b/package/libs/glib2/patches/010-pcre.patch @@ -0,0 +1,10 @@ +--- a/glib/meson.build ++++ b/glib/meson.build +@@ -365,6 +365,7 @@ pcre2_static_args = [] + + if use_pcre2_static_flag + pcre2_static_args = ['-DPCRE2_STATIC'] ++ pcre2 = pcre2.as_link_whole() + endif + + glib_c_args = ['-DG_LOG_DOMAIN="GLib"', '-DGLIB_COMPILATION'] + pcre2_static_args + glib_hidden_visibility_args diff --git a/package/libs/glib2/patches/020-locale.patch b/package/libs/glib2/patches/020-locale.patch new file mode 100644 index 0000000000..e171d58e13 --- /dev/null +++ b/package/libs/glib2/patches/020-locale.patch @@ -0,0 +1,24 @@ +From ebcc3c01db27b79af38b42c3c52a79d0225f744c Mon Sep 17 00:00:00 2001 +From: Seungha Yang +Date: Sun, 14 Aug 2022 04:56:20 +0900 +Subject: [PATCH] glib-mkenums: Specify output encoding as UTF-8 explicitly for + non-English locale + +Fixup regression introduced by +https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2797 +--- + gobject/glib-mkenums.in | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/gobject/glib-mkenums.in ++++ b/gobject/glib-mkenums.in +@@ -19,6 +19,9 @@ import errno + import codecs + import locale + ++# Non-english locale systems might complain to unrecognized character ++sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8') ++ + VERSION_STR = '''glib-mkenums version @VERSION@ + glib-mkenums comes with ABSOLUTELY NO WARRANTY. + You may redistribute copies of glib-mkenums under the terms of diff --git a/package/libs/gmp/Makefile b/package/libs/gmp/Makefile index eb7d808139..601e4f804d 100644 --- a/package/libs/gmp/Makefile +++ b/package/libs/gmp/Makefile @@ -19,8 +19,9 @@ PKG_BUILD_PARALLEL:=1 PKG_INSTALL:=1 PKG_FIXUP:=autoreconf PKG_LICENSE:=GPL-2.0-or-later +PKG_CPE_ID:=cpe:/a:gmplib:gmp -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/package.mk diff --git a/package/libs/jansson/Makefile b/package/libs/jansson/Makefile index 5799a362dd..e2b5206acb 100644 --- a/package/libs/jansson/Makefile +++ b/package/libs/jansson/Makefile @@ -8,14 +8,18 @@ include $(TOPDIR)/rules.mk PKG_NAME:=jansson -PKG_VERSION:=2.13.1 -PKG_RELEASE:=2 +PKG_VERSION:=2.14 +PKG_RELEASE:=3 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/akheron/$(PKG_NAME)/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=c739578bf6b764aa0752db9a2fdadcfe921c78f1228c7ec0bb47fa804c55d17b + PKG_LICENSE:=MIT PKG_LICENSE_FILES:=LICENSE +PKG_CPE_ID:=cpe:/a:jansson_project:jansson -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -PKG_SOURCE_URL:=http://www.digip.org/jansson/releases/ -PKG_HASH:=ee90a0f879d2b7b7159124ff22b937a2a9a8c36d3bb65d1da7dd3f04370a10bd +PKG_BUILD_FLAGS:=lto include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -39,12 +43,9 @@ define Package/jansson/description Jansson is a C library for encoding, decoding and manipulating JSON data endef -TARGET_CFLAGS += -flto -TARGET_LDFLAGS += -flto - define Package/jansson/install $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libjansson*so* $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libjansson*so.* $(1)/usr/lib/ endef $(eval $(call BuildPackage,jansson)) diff --git a/package/libs/libaudit/Makefile b/package/libs/libaudit/Makefile index d0cca1350a..0d79c25365 100644 --- a/package/libs/libaudit/Makefile +++ b/package/libs/libaudit/Makefile @@ -11,7 +11,7 @@ PKG_RELEASE:=1 PKG_SOURCE_NAME:=audit PKG_SOURCE:=$(PKG_SOURCE_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=http://people.redhat.com/sgrubb/audit +PKG_SOURCE_URL:=https://people.redhat.com/sgrubb/audit PKG_HASH:=0e5d4103646e00f8d1981e1cd2faea7a2ae28e854c31a803e907a383c5e2ecb7 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_NAME)-$(PKG_VERSION) HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_SOURCE_NAME)-$(PKG_VERSION) @@ -22,7 +22,7 @@ PKG_CPE_ID:=cpe:/a:linux_audit_project:linux_audit PKG_FIXUP:=autoreconf -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 PKG_INSTALL:=1 include $(INCLUDE_DIR)/package.mk diff --git a/package/libs/libbpf/Makefile b/package/libs/libbpf/Makefile new file mode 100644 index 0000000000..b820930e95 --- /dev/null +++ b/package/libs/libbpf/Makefile @@ -0,0 +1,76 @@ +# +# Copyright (C) 2020-2023 Tony Ambardar +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libbpf +PKG_VERSION:=1.2.2 +PKG_RELEASE:=1 + +PKG_SOURCE_URL:=https://github.com/libbpf/libbpf +PKG_MIRROR_HASH:=d20f5a226e5729c87c367f3fba61c44d5e13176ef12637d0e0b30629fa3ab0d6 +PKG_SOURCE_PROTO:=git +PKG_SOURCE_VERSION:=1728e3e4bef0e138ea95ffe62163eb9a6ac6fa32 +PKG_ABI_VERSION:=$(firstword $(subst .,$(space),$(PKG_VERSION))) + +PKG_MAINTAINER:=Tony Ambardar +PKG_CPE_ID:=cpe:/a:libbpf_project:libbpf + +PKG_BUILD_FLAGS:=no-mips16 +PKG_BUILD_PARALLEL:=1 +PKG_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/libbpf + SECTION:=libs + CATEGORY:=Libraries + TITLE:=libbpf - eBPF helper library + LICENSE:=LGPL-2.1 OR BSD-2-Clause + ABI_VERSION:=$(PKG_ABI_VERSION) + URL:=http://www.kernel.org + DEPENDS:=+libelf +endef + +define Package/libbpf/description + libbpf is a library for loading eBPF programs and reading and manipulating eBPF objects from user-space. +endef + +MAKE_VARS = \ + EXTRA_CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \ + LDFLAGS="$(TARGET_LDFLAGS)" + +MAKE_FLAGS += \ + $(if $(findstring c,$(LIBRECMC_VERBOSE)),V=1,V='') \ + LIBSUBDIR=lib + +MAKE_PATH = src + +define Build/InstallDev/libbpf + $(INSTALL_DIR) $(1)/usr/include/bpf + $(CP) $(PKG_INSTALL_DIR)/usr/include/bpf/*.h $(1)/usr/include/bpf/ + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libbpf.{a,so*} \ + $(1)/usr/lib/ + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libbpf.pc \ + $(1)/usr/lib/pkgconfig/ + $(SED) 's,/usr/include,$$$${prefix}/include,g' \ + $(1)/usr/lib/pkgconfig/libbpf.pc + $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' \ + $(1)/usr/lib/pkgconfig/libbpf.pc +endef + +Build/InstallDev=$(Build/InstallDev/libbpf) + +define Package/libbpf/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libbpf.so.* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libbpf)) diff --git a/package/libs/libbpf/patches/001-cflags.patch b/package/libs/libbpf/patches/001-cflags.patch new file mode 100644 index 0000000000..d6ffc3f907 --- /dev/null +++ b/package/libs/libbpf/patches/001-cflags.patch @@ -0,0 +1,10 @@ +--- a/src/Makefile ++++ b/src/Makefile +@@ -34,6 +34,7 @@ ALL_CFLAGS := $(INCLUDES) + + SHARED_CFLAGS += -fPIC -fvisibility=hidden -DSHARED + ++CFLAGS = $(EXTRA_CFLAGS) + CFLAGS ?= -g -O2 -Werror -Wall -std=gnu89 + ALL_CFLAGS += $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $(EXTRA_CFLAGS) + ALL_LDFLAGS += $(LDFLAGS) $(EXTRA_LDFLAGS) diff --git a/package/libs/libbsd/Makefile b/package/libs/libbsd/Makefile index 26e05f79a1..6a148a985f 100644 --- a/package/libs/libbsd/Makefile +++ b/package/libs/libbsd/Makefile @@ -1,18 +1,21 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libbsd -PKG_VERSION:=0.10.0 -PKG_RELEASE:=1 +PKG_VERSION:=0.11.7 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://libbsd.freedesktop.org/releases -PKG_HASH:=34b8adc726883d0e85b3118fa13605e179a62b31ba51f676136ecb2d0bc1a887 +PKG_HASH:=9baa186059ebbf25c06308e9f991fda31f7183c0f24931826d83aa6abd8a0261 PKG_LICENSE:=BSD-4-Clause PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:freedesktop:libbsd PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 +PKG_BUILD_DEPENDS := libmd +PKG_FIXUP:=autoreconf include $(INCLUDE_DIR)/package.mk @@ -27,6 +30,8 @@ define Package/libbsd/description This library provides useful functions commonly found on BSD systems, and lacking on others like GNU systems, thus making it easier to port projects with strong BSD origins, without needing to embed the same code over and over again on each project. endef +TARGET_CFLAGS += -D_LARGEFILE64_SOURCE + define Build/InstallDev $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_DIR) $(1)/usr/lib/pkgconfig @@ -42,4 +47,3 @@ define Package/libbsd/install endef $(eval $(call BuildPackage,libbsd)) - diff --git a/package/libs/libbsd/patches/001-fix-libpath.patch b/package/libs/libbsd/patches/001-fix-libpath.patch new file mode 100644 index 0000000000..ca24070249 --- /dev/null +++ b/package/libs/libbsd/patches/001-fix-libpath.patch @@ -0,0 +1,13 @@ +do not use host path to fix cross compiling + +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -160,7 +160,7 @@ + (echo '/* GNU ld script'; \ + echo ' * The MD5 functions are provided by the libmd library. */'; \ + cat format.ld; \ +- echo "GROUP($(runtimelibdir)/$$soname AS_NEEDED($(MD5_LIBS)))"; \ ++ echo "GROUP($$soname AS_NEEDED($(MD5_LIBS)))"; \ + )>$(DESTDIR)$(libdir)/libbsd.so + else + if [ "$(libdir)" != "$(runtimelibdir)" ]; then \ diff --git a/package/libs/libcap/Makefile b/package/libs/libcap/Makefile index dcd535becd..989209302a 100644 --- a/package/libs/libcap/Makefile +++ b/package/libs/libcap/Makefile @@ -6,16 +6,17 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libcap -PKG_VERSION:=2.63 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=2.69 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/linux/libs/security/linux-privs/libcap2 -PKG_HASH:=0c637b8f44fc7d8627787e9cf57f15ac06c1ddccb53e41feec5496be3466f77f +PKG_HASH:=f311f8f3dad84699d0566d1d6f7ec943a9298b28f714cae3c931dfd57492d7eb PKG_MAINTAINER:=Paul Wassi PKG_LICENSE:=GPL-2.0-only PKG_LICENSE_FILES:=License +PKG_CPE_ID:=cpe:/a:libcap_project:libcap PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 diff --git a/package/libs/libcap/patches/900-use-more-compatible-shebang.patch b/package/libs/libcap/patches/900-use-more-compatible-shebang.patch new file mode 100644 index 0000000000..454c703fbe --- /dev/null +++ b/package/libs/libcap/patches/900-use-more-compatible-shebang.patch @@ -0,0 +1,8 @@ +--- a/progs/mkcapshdoc.sh ++++ b/progs/mkcapshdoc.sh +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env bash + # This script generates some C code for inclusion in the capsh binary. + # The Makefile generally only generates the .c code and compares it + # with the checked in code in the progs directory. diff --git a/package/libs/libedit/Makefile b/package/libs/libedit/Makefile new file mode 100644 index 0000000000..9192ff26af --- /dev/null +++ b/package/libs/libedit/Makefile @@ -0,0 +1,56 @@ +# +# Copyright (C) 2016-2018 CZ.NIC, z.s.p.o. +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libedit +PKG_VERSION:=20221030-3.1 +PKG_RELEASE:=1 + +PKG_MAINTAINER:=Daniel Salzman +PKG_LICENSE:=BSD-3-Clause + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=http://thrysoee.dk/editline/ +PKG_HASH:=f0925a5adf4b1bf116ee19766b7daa766917aec198747943b1c4edf67a4be2bb + +PKG_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/libedit + SECTION:=libs + CATEGORY:=Libraries + TITLE:=BSD editline and history library + URL:=http://thrysoee.dk/editline/ + DEPENDS:=+libncurses +endef + +define Package/libedit/description + Generic line editing, history, and tokenization functions similar to GNU Readline. +endef + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/ + + $(INSTALL_DIR) $(1)/usr/include/editline + $(CP) $(PKG_INSTALL_DIR)/usr/include/editline/*.h $(1)/usr/include/editline/ + + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libedit.{a,so*} $(1)/usr/lib/ + + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libedit.pc $(1)/usr/lib/pkgconfig +endef + +define Package/libedit/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libedit.so.* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libedit)) diff --git a/package/libs/libevent2/Makefile b/package/libs/libevent2/Makefile index 85c159c2a6..92602607ae 100644 --- a/package/libs/libevent2/Makefile +++ b/package/libs/libevent2/Makefile @@ -26,6 +26,8 @@ PKG_CONFIG_DEPENDS:= \ CONFIG_PACKAGE_libevent2-pthreads \ CONFIG_PACKAGE_libevent2-mbedtls +PKG_BUILD_FLAGS:=gc-sections lto + include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -112,8 +114,8 @@ define Package/libevent2-pthreads/description threading & locking. endef -TARGET_CFLAGS += $(FPIC) -ffunction-sections -fdata-sections -flto -TARGET_LDFLAGS += -Wl,--gc-sections,--as-needed -flto +TARGET_CFLAGS += $(FPIC) +TARGET_LDFLAGS += -Wl,--as-needed CMAKE_OPTIONS += \ -DEVENT__DISABLE_BENCHMARK:BOOL=ON \ diff --git a/package/libs/libffi/Makefile b/package/libs/libffi/Makefile index 901a4f3a4d..e5ffda139e 100644 --- a/package/libs/libffi/Makefile +++ b/package/libs/libffi/Makefile @@ -21,7 +21,7 @@ PKG_LICENSE_FILES:=LICENSE PKG_FIXUP:=autoreconf PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/host-build.mk diff --git a/package/libs/libgcrypt/Makefile b/package/libs/libgcrypt/Makefile new file mode 100644 index 0000000000..2dea9f4cad --- /dev/null +++ b/package/libs/libgcrypt/Makefile @@ -0,0 +1,71 @@ +# +# Copyright (C) 2005-2011 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libgcrypt +PKG_VERSION:=1.10.2 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL:=https://www.gnupg.org/ftp/gcrypt/libgcrypt/ +PKG_HASH:=3b9c02a004b68c256add99701de00b383accccf37177e0d6c58289664cce0c03 + +PKG_MAINTAINER:=W. Michael Petullo +PKG_CPE_ID:=cpe:/a:gnupg:libgcrypt + +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/libgcrypt + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+libgpg-error + TITLE:=GNU crypto library + URL:=https://www.gnupg.org/related_software/libgcrypt/ + LICENSE:=LGPL-2.1-or-later + LICENSE_FILES:=COPYING.LIB +endef + +define Package/libgcrypt/description + This is a general purpose cryptographic library based on the code from + GnuPG. It provides functions for all cryptograhic building blocks: + symmetric ciphers (AES, DES, Arcfour, CAST5), hash algorithms (MD5, SHA-1, + RIPE-MD160, SHA-224/256, SHA-384/512), MACs (HMAC for all hash + algorithms), public key algorithms (RSA, DSA), large integer functions, + random numbers and a lot of supporting functions. Some algorithms have + been disabled to reduce size (Blowfish, Twofish, Serpent, + RC2, SEED, Camellia, CRC, MD4, TIGER-192, Whirlpool, ElGamal, ECC). +endef + +CONFIGURE_ARGS += \ + --enable-shared \ + --enable-static \ + --disable-asm \ + --disable-doc \ + --with-gpg-error-prefix="$(STAGING_DIR)/usr" + +TARGET_CFLAGS += $(FPIC) + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/bin $(2)/bin $(1)/usr/include $(1)/usr/lib $(1)/usr/share/aclocal + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/libgcrypt-config $(1)/usr/bin/ + $(CP) $(PKG_INSTALL_DIR)/usr/include/gcrypt*.h $(1)/usr/include/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgcrypt.{la,a,so*} $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/share/aclocal/libgcrypt.m4 $(1)/usr/share/aclocal/ + $(SED) 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' $(1)/usr/bin/libgcrypt-config + $(LN) ../../usr/bin/libgcrypt-config $(2)/bin/libgcrypt-config +endef + +define Package/libgcrypt/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgcrypt.so.* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libgcrypt)) diff --git a/package/libs/libgpg-error/Makefile b/package/libs/libgpg-error/Makefile new file mode 100644 index 0000000000..62a1784482 --- /dev/null +++ b/package/libs/libgpg-error/Makefile @@ -0,0 +1,108 @@ +# +# Copyright (C) 2005-2011 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libgpg-error +PKG_VERSION:=1.47 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL:=https://mirrors.dotsrc.org/gcrypt/libgpg-error \ + http://ring.ksc.gr.jp/archives/net/gnupg/libgpg-error \ + https://www.gnupg.org/ftp/gcrypt/libgpg-error +PKG_HASH:=9e3c670966b96ecc746c28c2c419541e3bcb787d1a73930f5e5f5e1bcbbb9bdb + +PKG_MAINTAINER:=W. Michael Petullo +PKG_LICENSE:=LGPL-2.1-or-later +PKG_LICENSE_FILES:=COPYING + +PKG_FIXUP:=autoreconf +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/libgpg-error + SECTION:=libs + CATEGORY:=Libraries + TITLE:=GnuPG error handling helper library + URL:=https://www.gnupg.org/related_software/libgpg-error/ +endef + +define Package/libgpg-error/description + An helper library for common error codes and descriptions. + This is a library that defines common error values for all GnuPG + components. Among these are GPG, GPGSM, GPGME, GPG-Agent, libgcrypt, + Libksba, DirMngr, Pinentry, SmartCard Daemon and possibly more in the + future. +endef + +CONFIGURE_ARGS += \ + --enable-shared \ + --enable-static \ + --enable-install-gpg-error-config \ + --disable-doc \ + --disable-languages \ + --disable-rpath \ + --disable-tests + +define Build/InstallDev + $(INSTALL_DIR) $(2)/bin $(1)/usr/bin + $(INSTALL_BIN) \ + $(PKG_INSTALL_DIR)/usr/bin/gpg-error-config \ + $(2)/bin/ + $(SED) \ + 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' \ + $(2)/bin/gpg-error-config + $(LN) $(STAGING_DIR)/host/bin/gpg-error-config $(1)/usr/bin/gpg-error-config + + $(INSTALL_BIN) \ + $(PKG_INSTALL_DIR)/usr/bin/gpgrt-config \ + $(2)/bin/ + $(SED) \ + 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' \ + $(2)/bin/gpgrt-config + $(LN) $(STAGING_DIR)/host/bin/gpgrt-config $(1)/usr/bin/gpgrt-config + + $(INSTALL_DIR) $(1)/usr/include + $(INSTALL_DATA) \ + $(PKG_INSTALL_DIR)/usr/include/gpg-error.h \ + $(1)/usr/include/ + + $(INSTALL_DATA) \ + $(PKG_INSTALL_DIR)/usr/include/gpgrt.h \ + $(1)/usr/include/ + + $(INSTALL_DIR) $(1)/usr/lib + $(CP) \ + $(PKG_INSTALL_DIR)/usr/lib/libgpg-error.{la,a,so*} \ + $(1)/usr/lib/ + + $(INSTALL_DIR) $(1)/usr/share/aclocal + $(INSTALL_DATA) \ + $(PKG_INSTALL_DIR)/usr/share/aclocal/gpg-error.m4 \ + $(1)/usr/share/aclocal/ + + $(INSTALL_DATA) \ + $(PKG_INSTALL_DIR)/usr/share/aclocal/gpgrt.m4 \ + $(1)/usr/share/aclocal/ + + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) \ + $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/gpg-error.pc \ + $(1)/usr/lib/pkgconfig +endef + +define Package/libgpg-error/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) \ + $(PKG_INSTALL_DIR)/usr/lib/libgpg-error.so.* \ + $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libgpg-error)) diff --git a/package/libs/libgpg-error/patches/001-cross-compile-fix.patch b/package/libs/libgpg-error/patches/001-cross-compile-fix.patch new file mode 100644 index 0000000000..606cdd3785 --- /dev/null +++ b/package/libs/libgpg-error/patches/001-cross-compile-fix.patch @@ -0,0 +1,24 @@ +--- a/configure.ac ++++ b/configure.ac +@@ -74,6 +74,21 @@ AM_SILENT_RULES + AC_CANONICAL_HOST + AB_INIT + ++case "${host}" in ++ x86_64-openwrt-linux-gnu|i?86-openwrt-linux-gnu) ++ host=$(echo $host | sed 's/openwrt/pc/g') ++ ;; ++ arm-openwrt-linux-gnu|armeb-openwrt-linux-gnu) ++ host=arm-unknown-linux-gnueabi ++ ;; ++ mips64-openwrt-linux-gnu) ++ host=mips64el-unknown-linux-gnuabi64 ++ ;; ++ *) ++ host=$(echo $host | sed 's/openwrt/unknown/g') ++ ;; ++esac ++ + # Checks for programs. + AC_PROG_CC + AM_PROG_CC_C_O diff --git a/package/libs/libgpg-error/patches/010-add-arc-support.patch b/package/libs/libgpg-error/patches/010-add-arc-support.patch new file mode 100644 index 0000000000..03387f8ee5 --- /dev/null +++ b/package/libs/libgpg-error/patches/010-add-arc-support.patch @@ -0,0 +1,64 @@ +From: Mylene Josserand + +DesignWare ARC Processors are a family of 32-bit CPUs from Synopsys. +This change allows us to build for and use libgpg-error on ARC cores. + +These values were obtained from a test application executed on ARC +in simulation this way: + +1. Instructions for cross-compilation used are here: + http://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgpg-error.git;a=blob;f=README + +2. Commands used on host: + # build="$(build-aux/config.guess)" + # ./configure --prefix=build/tmp-uclibc/sysroots/nsimhs/usr/ --host=arc-oe-linux-uclibc --build=$build + # cd src + # make gen-posix-lock-obj + +3. Commands used on target: + # ./gen-posix-lock-obj + +Signed-off-by: Mylene Josserand +Signed-off-by: Alexey Brodkin +--- + src/Makefile.am | 1 + + .../lock-obj-pub.arc-unknown-linux-gnu.h | 23 +++++++++++++++++++ + 2 files changed, 24 insertions(+) + create mode 100644 src/syscfg/lock-obj-pub.arc-unknown-linux-gnu.h + +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -40,6 +40,7 @@ lock_obj_pub = \ + syscfg/lock-obj-pub.aarch64-unknown-linux-gnu_ilp32.h \ + syscfg/lock-obj-pub.aarch64-apple-darwin.h \ + syscfg/lock-obj-pub.alpha-unknown-linux-gnu.h \ ++ syscfg/lock-obj-pub.arc-unknown-linux-gnu.h \ + syscfg/lock-obj-pub.arm-unknown-linux-androideabi.h \ + syscfg/lock-obj-pub.arm-unknown-linux-gnueabi.h \ + syscfg/lock-obj-pub.arm-apple-darwin.h \ +--- /dev/null ++++ b/src/syscfg/lock-obj-pub.arc-unknown-linux-gnu.h +@@ -0,0 +1,23 @@ ++## lock-obj-pub.arc-oe-linux-uclibc.h ++## File created by gen-posix-lock-obj - DO NOT EDIT ++## To be included by mkheader into gpg-error.h ++ ++typedef struct ++{ ++ long _vers; ++ union { ++ volatile char _priv[24]; ++ long _x_align; ++ long *_xp_align; ++ } u; ++} gpgrt_lock_t; ++ ++#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \ ++ 0,0,0,0,0,0,0,0, \ ++ 0,0,0,0,0,0,0,0}}} ++## ++## Local Variables: ++## mode: c ++## buffer-read-only: t ++## End: ++## diff --git a/package/libs/libiconv-full/Makefile b/package/libs/libiconv-full/Makefile index e4f925a1ae..0c793973a0 100644 --- a/package/libs/libiconv-full/Makefile +++ b/package/libs/libiconv-full/Makefile @@ -8,13 +8,14 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libiconv-full -PKG_VERSION:=1.16 +PKG_VERSION:=1.17 PKG_RELEASE:=1 PKG_SOURCE:=libiconv-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@GNU/libiconv -PKG_HASH:=e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04 +PKG_HASH:=8f74213b56238c85a50a5329f77e06198771e70dd9a739779f4c02f65d971313 PKG_BUILD_DIR:=$(BUILD_DIR)/libiconv-$(PKG_VERSION) +HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/libiconv-$(PKG_VERSION) PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=LGPL-2.1-or-later @@ -25,6 +26,7 @@ PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/host-build.mk define Package/libiconv-full/Default URL:=https://www.gnu.org/software/libiconv/ @@ -61,6 +63,10 @@ CONFIGURE_ARGS += \ --disable-rpath \ --enable-relocatable +HOST_CONFIGURE_ARGS += \ + --disable-shared \ + --with-pic + define Build/InstallDev $(INSTALL_DIR) $(1)/usr/lib/libiconv-full/include $(CP) $(PKG_INSTALL_DIR)/usr/include/iconv.h $(1)/usr/lib/libiconv-full/include/ @@ -88,3 +94,4 @@ endef $(eval $(call BuildPackage,libcharset)) $(eval $(call BuildPackage,libiconv-full)) $(eval $(call BuildPackage,iconv)) +$(eval $(call HostBuild)) diff --git a/package/libs/libiconv/COPYING b/package/libs/libiconv/COPYING deleted file mode 100644 index 223ede7de3..0000000000 --- a/package/libs/libiconv/COPYING +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/package/libs/libiconv/COPYRIGHT b/package/libs/libiconv/COPYRIGHT deleted file mode 100644 index d6c04ec1ba..0000000000 --- a/package/libs/libiconv/COPYRIGHT +++ /dev/null @@ -1,20 +0,0 @@ -Copyright status on all included code: - -All files which have no copyright comments are original works -Copyright (C) 2005-2006 Rich Felker. The decision to exclude such -comments is intentional, as it should be possible to carry around the -complete source code on tiny storage media. All public header files -(include/*) should be treated as Public Domain as they intentionally -contain no content which can be covered by copyright. Some source -modules may fall in this category as well. If you believe that a file -is so trivial that it should be in the Public Domain, please contact -me and, if I agree, I will explicitly release it from copyright. - -Some code has been modified by the libreCMC project, this includes -the conversion from char map files to C arrays and the iconv.h header -file in particular. - -The library as a whole is licensed under the GNU LGPL version 2.1. -See the file COPYING for the text of this license. - -The original source can be accessed at svn://svn.mplayerhq.hu/libc/trunk diff --git a/package/libs/libiconv/Makefile b/package/libs/libiconv/Makefile deleted file mode 100644 index 4d7dcd3498..0000000000 --- a/package/libs/libiconv/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# -# Copyright (C) 2010-2012 OpenWrt.org -# -# This Makefile and the code shipped in src/ is free software, licensed -# under the GNU Lesser General Public License, version 2.1 and later. -# See src/COPYING for more information. -# -# Refer to src/COPYRIGHT for copyright statements on the source files. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=libiconv -PKG_RELEASE:=8 - -PKG_LICENSE:=LGPL-2.1 -PKG_LICENSE_FILES:=LICENSE - -PKG_MAINTAINER:=Jo-Philipp Wich - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/host-build.mk - -define Package/libiconv - SECTION:=libs - CATEGORY:=Libraries - TITLE:=Tiny drop-in replacement for the GNU Character set conversion library -endef - -define Build/Configure -endef - -define Build/Compile - $(TARGET_CC) $(TARGET_CFLAGS) -c $(PKG_BUILD_DIR)/iconv.c -o $(PKG_BUILD_DIR)/iconv.o -I$(PKG_BUILD_DIR)/include $(FPIC) - $(TARGET_CROSS)ar rcs $(PKG_BUILD_DIR)/libiconv.a $(PKG_BUILD_DIR)/iconv.o -endef - -define Build/InstallDev - $(INSTALL_DIR) $(1)/usr/lib/libiconv-stub/lib - $(INSTALL_DATA) $(PKG_BUILD_DIR)/libiconv.a $(1)/usr/lib/libiconv-stub/lib/ - - $(INSTALL_DIR) $(1)/usr/lib/libiconv-stub/include - $(INSTALL_DATA) $(PKG_BUILD_DIR)/include/iconv.h $(1)/usr/lib/libiconv-stub/include/ - - $(INSTALL_DIR) $(1)/usr/share/aclocal - $(INSTALL_DATA) $(PKG_BUILD_DIR)/m4/* $(1)/usr/share/aclocal/ -endef - -define Package/libiconv/install - $(INSTALL_DIR) $(1)/tmp - touch $(1)/tmp/.libiconv-placeholder -endef - -define Host/Prepare - mkdir -p $(HOST_BUILD_DIR) -endef - -define Host/Configure - -endef - -define Host/Compile - $(HOSTCC) -c src/iconv.c -o $(HOST_BUILD_DIR)/iconv.o -Isrc/include -fPIC - ar rcs $(HOST_BUILD_DIR)/libiconv.a $(HOST_BUILD_DIR)/iconv.o -endef - -define Host/Install - $(INSTALL_DIR) $(STAGING_DIR_HOSTPKG)/lib - $(INSTALL_DATA) $(HOST_BUILD_DIR)/libiconv.a $(STAGING_DIR_HOSTPKG)/lib/ - - $(INSTALL_DIR) $(STAGING_DIR_HOSTPKG)/include - $(INSTALL_DATA) ./src/include/iconv.h $(STAGING_DIR_HOSTPKG)/include/ - - $(INSTALL_DIR) $(STAGING_DIR_HOSTPKG)/share/aclocal - $(INSTALL_DATA) ./src/m4/* $(STAGING_DIR_HOSTPKG)/share/aclocal/ -endef - -$(eval $(call HostBuild)) -$(eval $(call BuildPackage,libiconv)) diff --git a/package/libs/libiconv/src/LICENSE b/package/libs/libiconv/src/LICENSE deleted file mode 100644 index b59e7be47c..0000000000 --- a/package/libs/libiconv/src/LICENSE +++ /dev/null @@ -1,6 +0,0 @@ -The source file iconv.m4 contains the following message - -Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc. -This file is free software; the Free Software Foundation -gives unlimited permission to copy and/or distribute it, -with or without modifications, as long as this notice is preserved. diff --git a/package/libs/libiconv/src/iconv.c b/package/libs/libiconv/src/iconv.c deleted file mode 100644 index c3cfefa3cc..0000000000 --- a/package/libs/libiconv/src/iconv.c +++ /dev/null @@ -1,449 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -/* builtin charmaps */ -#include "charmaps.h" - -/* only 0-7 are valid as dest charset */ -#define UTF_16BE 000 -#define UTF_16LE 001 -#define UTF_32BE 002 -#define UTF_32LE 003 -#define WCHAR_T 004 -#define UTF_8 005 -#define US_ASCII 006 -#define LATIN_1 007 - -/* additional charsets with algorithmic conversion */ -#define LATIN_9 010 -#define TIS_620 011 -#define JIS_0201 012 - -/* some programs like php need this */ -int _libiconv_version = _LIBICONV_VERSION; - -/* these must match the constants above */ -static const unsigned char charsets[] = - "\005" "UTF-8" "\0" - "\004" "WCHAR_T" "\0" - "\000" "UTF-16BE" "\0" - "\001" "UTF-16LE" "\0" - "\002" "UTF-32BE" "\0" - "\003" "UTF-32LE" "\0" - "\006" "ASCII" "\0" - "\006" "US-ASCII" "\0" - "\006" "ISO646-US" "\0" - "\006" "ISO_646.IRV:1991" "\0" - "\006" "ISO-IR-6" "\0" - "\006" "ANSI_X3.4-1968" "\0" - "\006" "ANSI_X3.4-1986" "\0" - "\006" "CP367" "\0" - "\006" "IBM367" "\0" - "\006" "US" "\0" - "\006" "CSASCII" "\0" - "\007" "ISO-8859-1" "\0" - "\007" "LATIN1" "\0" - "\010" "ISO-8859-15""\0" - "\010" "LATIN9" "\0" - "\011" "ISO-8859-11""\0" - "\011" "TIS-620" "\0" - "\012" "JIS-0201" "\0" - "\377"; - -/* separate identifiers for sbcs/dbcs/etc map type */ -#define UCS2_8BIT 000 -#define UCS3_8BIT 001 -#define EUC 002 -#define EUC_TW 003 -#define SHIFT_JIS 004 -#define BIG5 005 -#define GBK 006 - -/* FIXME: these are not implemented yet -// EUC: A1-FE A1-FE -// GBK: 81-FE 40-7E,80-FE -// Big5: A1-FE 40-7E,A1-FE -*/ - -static const unsigned short maplen[] = { - [UCS2_8BIT] = 4+ 2* 128, - [UCS3_8BIT] = 4+ 3* 128, - [EUC] = 4+ 2* 94*94, - [SHIFT_JIS] = 4+ 2* 94*94, - [BIG5] = 4+ 2* 94*157, - [GBK] = 4+ 2* 126*190, - [EUC_TW] = 4+ 2* 2*94*94, -}; - -static int find_charmap(const char *name) -{ - int i; - for (i = 0; i < (sizeof(charmaps) / sizeof(charmaps[0])); i++) - if (!strcasecmp(charmaps[i].name, name)) - return i; - return -1; -} - -static int find_charset(const char *name) -{ - const unsigned char *s; - for (s=charsets; *s<0xff && strcasecmp(s+1, name); s+=strlen(s)+1); - return *s; -} - -iconv_t iconv_open(const char *to, const char *from) -{ - unsigned f, t; - int m; - - if ((t = find_charset(to)) > 8) - return -1; - - if ((f = find_charset(from)) < 255) - return 0 | (t<<1) | (f<<8); - - if ((m = find_charmap(from)) > -1) - return 1 | (t<<1) | (m<<8); - - return -1; -} - -int iconv_close(iconv_t cd) -{ - return 0; -} - -static inline wchar_t get_16(const unsigned char *s, int endian) -{ - endian &= 1; - return s[endian]<<8 | s[endian^1]; -} - -static inline void put_16(unsigned char *s, wchar_t c, int endian) -{ - endian &= 1; - s[endian] = c>>8; - s[endian^1] = c; -} - -static inline int utf8enc_wchar(char *outb, wchar_t c) -{ - if (c <= 0x7F) { - *outb = c; - return 1; - } - else if (c <= 0x7FF) { - *outb++ = ((c >> 6) & 0x1F) | 0xC0; - *outb++ = ( c & 0x3F) | 0x80; - return 2; - } - else if (c <= 0xFFFF) { - *outb++ = ((c >> 12) & 0x0F) | 0xE0; - *outb++ = ((c >> 6) & 0x3F) | 0x80; - *outb++ = ( c & 0x3F) | 0x80; - return 3; - } - else if (c <= 0x10FFFF) { - *outb++ = ((c >> 18) & 0x07) | 0xF0; - *outb++ = ((c >> 12) & 0x3F) | 0x80; - *outb++ = ((c >> 6) & 0x3F) | 0x80; - *outb++ = ( c & 0x3F) | 0x80; - return 4; - } - else { - *outb++ = '?'; - return 1; - } -} - -static inline int utf8seq_is_overlong(char *s, int n) -{ - switch (n) - { - case 2: - /* 1100000x (10xxxxxx) */ - return (((*s >> 1) == 0x60) && - ((*(s+1) >> 6) == 0x02)); - - case 3: - /* 11100000 100xxxxx (10xxxxxx) */ - return ((*s == 0xE0) && - ((*(s+1) >> 5) == 0x04) && - ((*(s+2) >> 6) == 0x02)); - - case 4: - /* 11110000 1000xxxx (10xxxxxx 10xxxxxx) */ - return ((*s == 0xF0) && - ((*(s+1) >> 4) == 0x08) && - ((*(s+2) >> 6) == 0x02) && - ((*(s+3) >> 6) == 0x02)); - } - - return 0; -} - -static inline int utf8seq_is_surrogate(char *s, int n) -{ - return ((n == 3) && (*s == 0xED) && (*(s+1) >= 0xA0) && (*(s+1) <= 0xBF)); -} - -static inline int utf8seq_is_illegal(char *s, int n) -{ - return ((n == 3) && (*s == 0xEF) && (*(s+1) == 0xBF) && - (*(s+2) >= 0xBE) && (*(s+2) <= 0xBF)); -} - -static inline int utf8dec_wchar(wchar_t *c, unsigned char *in, size_t inb) -{ - int i; - int n = -1; - - /* trivial char */ - if (*in <= 0x7F) { - *c = *in; - return 1; - } - - /* find utf8 sequence length */ - if ((*in & 0xE0) == 0xC0) n = 2; - else if ((*in & 0xF0) == 0xE0) n = 3; - else if ((*in & 0xF8) == 0xF0) n = 4; - else if ((*in & 0xFC) == 0xF8) n = 5; - else if ((*in & 0xFE) == 0xFC) n = 6; - - /* starved? */ - if (n > inb) - return -2; - - /* decode ... */ - if (n > 1 && n < 5) { - /* reject invalid sequences */ - if (utf8seq_is_overlong(in, n) || - utf8seq_is_surrogate(in, n) || - utf8seq_is_illegal(in, n)) - return -1; - - /* decode ... */ - *c = (char)(*in++ & (0x7F >> n)); - - for (i = 1; i < n; i++) { - /* illegal continuation byte */ - if (*in < 0x80 || *in > 0xBF) - return -1; - - *c = (*c << 6) | (*in++ & 0x3F); - } - - return n; - } - - /* unmapped sequence (> 4) */ - return -1; -} - -static inline wchar_t latin9_translit(wchar_t c) -{ - /* a number of trivial iso-8859-15 <> utf-8 transliterations */ - switch (c) { - case 0x20AC: return 0xA4; /* Euro */ - case 0x0160: return 0xA6; /* S caron */ - case 0x0161: return 0xA8; /* s caron */ - case 0x017D: return 0xB4; /* Z caron */ - case 0x017E: return 0xB8; /* z caron */ - case 0x0152: return 0xBC; /* OE */ - case 0x0153: return 0xBD; /* oe */ - case 0x0178: return 0xBE; /* Y diaeresis */ - default: return 0xFFFD; /* cannot translate */ - } -} - -size_t iconv(iconv_t cd, char **in, size_t *inb, char **out, size_t *outb) -{ - size_t x=0; - unsigned char to = (cd>>1)&127; - unsigned char from = 255; - const unsigned char *map = 0; - char tmp[MB_LEN_MAX]; - wchar_t c, d; - size_t k, l; - int err; - - if (!in || !*in || !*inb) return 0; - - if (cd & 1) - map = charmaps[cd>>8].map; - else - from = cd>>8; - - for (; *inb; *in+=l, *inb-=l) { - c = *(unsigned char *)*in; - l = 1; - if (from >= UTF_8 && c < 0x80) goto charok; - switch (from) { - case WCHAR_T: - l = sizeof(wchar_t); - if (*inb < l) goto starved; - c = *(wchar_t *)*in; - break; - case UTF_8: - l = utf8dec_wchar(&c, *in, *inb); - if (!l) l++; - else if (l == (size_t)-1) goto ilseq; - else if (l == (size_t)-2) goto starved; - break; - case US_ASCII: - goto ilseq; - case LATIN_9: - if ((unsigned)c - 0xa4 <= 0xbe - 0xa4) { - static const unsigned char map[] = { - 0, 0x60, 0, 0x61, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0x7d, 0, 0, 0, 0x7e, 0, 0, 0, - 0x52, 0x53, 0x78 - }; - if (c == 0xa4) c = 0x20ac; - else if (map[c-0xa5]) c = 0x100 | map[c-0xa5]; - } - case LATIN_1: - goto charok; - case TIS_620: - if (c >= 0xa1) c += 0x0e01-0xa1; - goto charok; - case JIS_0201: - if (c >= 0xa1) { - if (c <= 0xdf) c += 0xff61-0xa1; - else goto ilseq; - } - goto charok; - case UTF_16BE: - case UTF_16LE: - l = 2; - if (*inb < 2) goto starved; - c = get_16(*in, from); - if ((unsigned)(c-0xdc00) < 0x400) goto ilseq; - if ((unsigned)(c-0xd800) < 0x400) { - l = 4; - if (*inb < 4) goto starved; - d = get_16(*in + 2, from); - if ((unsigned)(c-0xdc00) >= 0x400) goto ilseq; - c = ((c-0xd800)<<10) | (d-0xdc00); - } - break; - case UTF_32BE: - case UTF_32LE: - l = 4; - if (*inb < 4) goto starved; - // FIXME - // c = get_32(*in, from); - break; - default: - /* only support ascii supersets */ - if (c < 0x80) break; - switch (map[0]) { - case UCS2_8BIT: - c -= 0x80; - break; - case EUC: - if ((unsigned)c - 0xa1 >= 94) goto ilseq; - if ((unsigned)in[0][1] - 0xa1 >= 94) goto ilseq; - c = (c-0xa1)*94 + (in[0][1]-0xa1); - l = 2; - break; - case SHIFT_JIS: - if ((unsigned)c - 0xa1 <= 0xdf-0xa1) { - c += 0xff61-0xa1; - goto charok; - } - // FIXME... - l = 2; - break; - default: - goto badf; - } - c = get_16(map + 4 + 2*c, 0); - if (c == 0xffff) goto ilseq; - goto charok; - } - - if ((unsigned)c - 0xd800 < 0x800 || (unsigned)c >= 0x110000) - goto ilseq; -charok: - switch (to) { - case WCHAR_T: - if (*outb < sizeof(wchar_t)) goto toobig; - *(wchar_t *)*out = c; - *out += sizeof(wchar_t); - *outb -= sizeof(wchar_t); - break; - case UTF_8: - if (*outb < 4) { - k = utf8enc_wchar(tmp, c); - if (*outb < k) goto toobig; - memcpy(*out, tmp, k); - } else k = utf8enc_wchar(*out, c); - *out += k; - *outb -= k; - break; - case US_ASCII: - if (c > 0x7f) c = 0xfffd; - /* fall thru and count replacement in latin1 case */ - case LATIN_9: - if (c >= 0x100 && c != 0xfffd) - c = latin9_translit(c); - /* fall through */ - case LATIN_1: - if (c > 0xff) goto ilseq; - if (!*outb) goto toobig; - **out = c; - ++*out; - --*outb; - break; - case UTF_16BE: - case UTF_16LE: - if (c < 0x10000) { - if (*outb < 2) goto toobig; - put_16(*out, c, to); - *out += 2; - *outb -= 2; - break; - } - if (*outb < 4) goto toobig; - put_16(*out, (c>>10)|0xd800, to); - put_16(*out + 2, (c&0x3ff)|0xdc00, to); - *out += 4; - *outb -= 4; - break; - default: - goto badf; - } - } - return x; -ilseq: - err = EILSEQ; - x = -1; - goto end; -badf: - err = EBADF; - x = -1; - goto end; -toobig: - err = E2BIG; - x = -1; - goto end; -starved: - err = EINVAL; -end: - errno = err; - return x; -} diff --git a/package/libs/libiconv/src/include/charmaps.h b/package/libs/libiconv/src/include/charmaps.h deleted file mode 100644 index 083cd699f1..0000000000 --- a/package/libs/libiconv/src/include/charmaps.h +++ /dev/null @@ -1,80 +0,0 @@ -#include "charmaps/iso-8859-2.h" -#include "charmaps/iso-8859-10.h" -#include "charmaps/windows-874.h" -#include "charmaps/windows-1250.h" -#include "charmaps/koi8-r.h" - -#ifdef ALL_CHARSETS -#include "charmaps/iso-8859-3.h" -#include "charmaps/iso-8859-4.h" -#include "charmaps/iso-8859-5.h" -#include "charmaps/iso-8859-6.h" -#include "charmaps/iso-8859-7.h" -#include "charmaps/iso-8859-8.h" -#include "charmaps/iso-8859-9.h" -#include "charmaps/iso-8859-13.h" -#include "charmaps/iso-8859-14.h" -#include "charmaps/iso-8859-16.h" -#include "charmaps/windows-1251.h" -#include "charmaps/windows-1252.h" -#include "charmaps/windows-1253.h" -#include "charmaps/windows-1254.h" -#include "charmaps/windows-1255.h" -#include "charmaps/windows-1256.h" -#include "charmaps/windows-1257.h" -#include "charmaps/windows-1258.h" -#endif - - -struct charmap { - const char name[13]; - const unsigned char *map; -}; - -static struct charmap charmaps[] = { - { "ISO-8859-2", map_iso_8859_2 }, - { "ISO-8859-10", map_iso_8859_10 }, - -#ifdef ALL_CHARSETS - { "ISO-8859-3", map_iso_8859_3 }, - { "ISO-8859-4", map_iso_8859_4 }, - { "ISO-8859-5", map_iso_8859_5 }, - { "ISO-8859-6", map_iso_8859_6 }, - { "ISO-8859-7", map_iso_8859_7 }, - { "ISO-8859-8", map_iso_8859_8 }, - { "ISO-8859-9", map_iso_8859_9 }, - { "ISO-8859-13", map_iso_8859_13 }, - { "ISO-8859-14", map_iso_8859_14 }, - { "ISO-8859-16", map_iso_8859_16 }, -#endif - - { "WINDOWS-874", map_windows_874 }, - { "WINDOWS-1250", map_windows_1250 }, - -#ifdef ALL_CHARSETS - { "WINDOWS-1251", map_windows_1251 }, - { "WINDOWS-1252", map_windows_1252 }, - { "WINDOWS-1253", map_windows_1253 }, - { "WINDOWS-1254", map_windows_1254 }, - { "WINDOWS-1255", map_windows_1255 }, - { "WINDOWS-1256", map_windows_1256 }, - { "WINDOWS-1257", map_windows_1257 }, - { "WINDOWS-1258", map_windows_1258 }, -#endif - - { "KOI8-R", map_koi8_r }, - - /* Aliases */ - { "LATIN2", map_iso_8859_2 }, - { "LATIN6", map_iso_8859_10 }, - -#ifdef ALL_CHARSETS - { "ARABIC", map_iso_8859_6 }, - { "CYRILLIC", map_iso_8859_5 }, - { "GREEK", map_iso_8859_7 }, - { "HEBREW", map_iso_8859_8 }, - { "LATIN3", map_iso_8859_3 }, - { "LATIN4", map_iso_8859_4 }, - { "LATIN5", map_iso_8859_9 }, -#endif -}; diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-10.h b/package/libs/libiconv/src/include/charmaps/iso-8859-10.h deleted file mode 100644 index cb93d027d1..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-10.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_iso_8859_10[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x01, 0x04, - 0x01, 0x12, 0x01, 0x22, 0x01, 0x2a, 0x01, 0x28, 0x01, 0x36, 0x00, 0xa7, - 0x01, 0x3b, 0x01, 0x10, 0x01, 0x60, 0x01, 0x66, 0x01, 0x7d, 0x00, 0xad, - 0x01, 0x6a, 0x01, 0x4a, 0x00, 0xb0, 0x01, 0x05, 0x01, 0x13, 0x01, 0x23, - 0x01, 0x2b, 0x01, 0x29, 0x01, 0x37, 0x00, 0xb7, 0x01, 0x3c, 0x01, 0x11, - 0x01, 0x61, 0x01, 0x67, 0x01, 0x7e, 0x20, 0x15, 0x01, 0x6b, 0x01, 0x4b, - 0x01, 0x00, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, - 0x00, 0xc6, 0x01, 0x2e, 0x01, 0x0c, 0x00, 0xc9, 0x01, 0x18, 0x00, 0xcb, - 0x01, 0x16, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x01, 0x45, - 0x01, 0x4c, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x01, 0x68, - 0x00, 0xd8, 0x01, 0x72, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, - 0x00, 0xde, 0x00, 0xdf, 0x01, 0x01, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0xe3, - 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x01, 0x2f, 0x01, 0x0d, 0x00, 0xe9, - 0x01, 0x19, 0x00, 0xeb, 0x01, 0x17, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, - 0x00, 0xf0, 0x01, 0x46, 0x01, 0x4d, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, - 0x00, 0xf6, 0x01, 0x69, 0x00, 0xf8, 0x01, 0x73, 0x00, 0xfa, 0x00, 0xfb, - 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x01, 0x38 -}; diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-13.h b/package/libs/libiconv/src/include/charmaps/iso-8859-13.h deleted file mode 100644 index b44d1b4346..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-13.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_iso_8859_13[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x20, 0x1d, - 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x20, 0x1e, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xd8, 0x00, 0xa9, 0x01, 0x56, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x00, 0xc6, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, - 0x20, 0x1c, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xf8, 0x00, 0xb9, - 0x01, 0x57, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xe6, - 0x01, 0x04, 0x01, 0x2e, 0x01, 0x00, 0x01, 0x06, 0x00, 0xc4, 0x00, 0xc5, - 0x01, 0x18, 0x01, 0x12, 0x01, 0x0c, 0x00, 0xc9, 0x01, 0x79, 0x01, 0x16, - 0x01, 0x22, 0x01, 0x36, 0x01, 0x2a, 0x01, 0x3b, 0x01, 0x60, 0x01, 0x43, - 0x01, 0x45, 0x00, 0xd3, 0x01, 0x4c, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, - 0x01, 0x72, 0x01, 0x41, 0x01, 0x5a, 0x01, 0x6a, 0x00, 0xdc, 0x01, 0x7b, - 0x01, 0x7d, 0x00, 0xdf, 0x01, 0x05, 0x01, 0x2f, 0x01, 0x01, 0x01, 0x07, - 0x00, 0xe4, 0x00, 0xe5, 0x01, 0x19, 0x01, 0x13, 0x01, 0x0d, 0x00, 0xe9, - 0x01, 0x7a, 0x01, 0x17, 0x01, 0x23, 0x01, 0x37, 0x01, 0x2b, 0x01, 0x3c, - 0x01, 0x61, 0x01, 0x44, 0x01, 0x46, 0x00, 0xf3, 0x01, 0x4d, 0x00, 0xf5, - 0x00, 0xf6, 0x00, 0xf7, 0x01, 0x73, 0x01, 0x42, 0x01, 0x5b, 0x01, 0x6b, - 0x00, 0xfc, 0x01, 0x7c, 0x01, 0x7e, 0x20, 0x19 -}; diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-14.h b/package/libs/libiconv/src/include/charmaps/iso-8859-14.h deleted file mode 100644 index 76cead98c7..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-14.h +++ /dev/null @@ -1,25 +0,0 @@ -static const unsigned char map_iso_8859_14[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x1e, 0x02, - 0x1e, 0x03, 0x00, 0xa3, 0x01, 0x0a, 0x01, 0x0b, 0x1e, 0x0a, 0x00, 0xa7, - 0x1e, 0x80, 0x00, 0xa9, 0x1e, 0x82, 0x1e, 0x0b, 0x1e, 0xf2, 0x00, 0xad, - 0x00, 0xae, 0x01, 0x78, 0x1e, 0x1e, 0x1e, 0x1f, 0x01, 0x20, 0x01, 0x21, - 0x1e, 0x40, 0x1e, 0x41, 0x00, 0xb6, 0x1e, 0x56, 0x1e, 0x81, 0x1e, 0x57, - 0x1e, 0x83, 0x1e, 0x60, 0x1e, 0xf3, 0x1e, 0x84, 0x1e, 0x85, 0x1e, 0x61, - 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, - 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, - 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x01, 0x74, 0x00, 0xd1, - 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x1e, 0x6a, - 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, - 0x01, 0x76, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0xe3, - 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, - 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, - 0x01, 0x75, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, - 0x00, 0xf6, 0x1e, 0x6b, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, - 0x00, 0xfc, 0x00, 0xfd, 0x01, 0x77, 0x00, 0xff -}; - diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-16.h b/package/libs/libiconv/src/include/charmaps/iso-8859-16.h deleted file mode 100644 index 4437a41f05..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-16.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_iso_8859_16[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x01, 0x04, - 0x01, 0x05, 0x01, 0x41, 0x20, 0xac, 0x20, 0x1e, 0x01, 0x60, 0x00, 0xa7, - 0x01, 0x61, 0x00, 0xa9, 0x02, 0x18, 0x00, 0xab, 0x01, 0x79, 0x00, 0xad, - 0x01, 0x7a, 0x01, 0x7b, 0x00, 0xb0, 0x00, 0xb1, 0x01, 0x0c, 0x01, 0x42, - 0x01, 0x7d, 0x20, 0x1d, 0x00, 0xb6, 0x00, 0xb7, 0x01, 0x7e, 0x01, 0x0d, - 0x02, 0x19, 0x00, 0xbb, 0x01, 0x52, 0x01, 0x53, 0x01, 0x78, 0x01, 0x7c, - 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x01, 0x02, 0x00, 0xc4, 0x01, 0x06, - 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, - 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x01, 0x10, 0x01, 0x43, - 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x01, 0x50, 0x00, 0xd6, 0x01, 0x5a, - 0x01, 0x70, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x01, 0x18, - 0x02, 0x1a, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x01, 0x03, - 0x00, 0xe4, 0x01, 0x07, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, - 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, - 0x01, 0x11, 0x01, 0x44, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x01, 0x51, - 0x00, 0xf6, 0x01, 0x5b, 0x01, 0x71, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, - 0x00, 0xfc, 0x01, 0x19, 0x02, 0x1b, 0x00, 0xff -}; diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-2.h b/package/libs/libiconv/src/include/charmaps/iso-8859-2.h deleted file mode 100644 index 631610e17c..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-2.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_iso_8859_2[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x01, 0x04, - 0x02, 0xd8, 0x01, 0x41, 0x00, 0xa4, 0x01, 0x3d, 0x01, 0x5a, 0x00, 0xa7, - 0x00, 0xa8, 0x01, 0x60, 0x01, 0x5e, 0x01, 0x64, 0x01, 0x79, 0x00, 0xad, - 0x01, 0x7d, 0x01, 0x7b, 0x00, 0xb0, 0x01, 0x05, 0x02, 0xdb, 0x01, 0x42, - 0x00, 0xb4, 0x01, 0x3e, 0x01, 0x5b, 0x02, 0xc7, 0x00, 0xb8, 0x01, 0x61, - 0x01, 0x5f, 0x01, 0x65, 0x01, 0x7a, 0x02, 0xdd, 0x01, 0x7e, 0x01, 0x7c, - 0x01, 0x54, 0x00, 0xc1, 0x00, 0xc2, 0x01, 0x02, 0x00, 0xc4, 0x01, 0x39, - 0x01, 0x06, 0x00, 0xc7, 0x01, 0x0c, 0x00, 0xc9, 0x01, 0x18, 0x00, 0xcb, - 0x01, 0x1a, 0x00, 0xcd, 0x00, 0xce, 0x01, 0x0e, 0x01, 0x10, 0x01, 0x43, - 0x01, 0x47, 0x00, 0xd3, 0x00, 0xd4, 0x01, 0x50, 0x00, 0xd6, 0x00, 0xd7, - 0x01, 0x58, 0x01, 0x6e, 0x00, 0xda, 0x01, 0x70, 0x00, 0xdc, 0x00, 0xdd, - 0x01, 0x62, 0x00, 0xdf, 0x01, 0x55, 0x00, 0xe1, 0x00, 0xe2, 0x01, 0x03, - 0x00, 0xe4, 0x01, 0x3a, 0x01, 0x07, 0x00, 0xe7, 0x01, 0x0d, 0x00, 0xe9, - 0x01, 0x19, 0x00, 0xeb, 0x01, 0x1b, 0x00, 0xed, 0x00, 0xee, 0x01, 0x0f, - 0x01, 0x11, 0x01, 0x44, 0x01, 0x48, 0x00, 0xf3, 0x00, 0xf4, 0x01, 0x51, - 0x00, 0xf6, 0x00, 0xf7, 0x01, 0x59, 0x01, 0x6f, 0x00, 0xfa, 0x01, 0x71, - 0x00, 0xfc, 0x00, 0xfd, 0x01, 0x63, 0x02, 0xd9 -}; diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-3.h b/package/libs/libiconv/src/include/charmaps/iso-8859-3.h deleted file mode 100644 index cd76d59c65..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-3.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_iso_8859_3[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x01, 0x26, - 0x02, 0xd8, 0x00, 0xa3, 0x00, 0xa4, 0xff, 0xff, 0x01, 0x24, 0x00, 0xa7, - 0x00, 0xa8, 0x01, 0x30, 0x01, 0x5e, 0x01, 0x1e, 0x01, 0x34, 0x00, 0xad, - 0xff, 0xff, 0x01, 0x7b, 0x00, 0xb0, 0x01, 0x27, 0x00, 0xb2, 0x00, 0xb3, - 0x00, 0xb4, 0x00, 0xb5, 0x01, 0x25, 0x00, 0xb7, 0x00, 0xb8, 0x01, 0x31, - 0x01, 0x5f, 0x01, 0x1f, 0x01, 0x35, 0x00, 0xbd, 0xff, 0xff, 0x01, 0x7c, - 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0xff, 0xff, 0x00, 0xc4, 0x01, 0x0a, - 0x01, 0x08, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, - 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0xff, 0xff, 0x00, 0xd1, - 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x01, 0x20, 0x00, 0xd6, 0x00, 0xd7, - 0x01, 0x1c, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x01, 0x6c, - 0x01, 0x5c, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0xff, 0xff, - 0x00, 0xe4, 0x01, 0x0b, 0x01, 0x09, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, - 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, - 0xff, 0xff, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x01, 0x21, - 0x00, 0xf6, 0x00, 0xf7, 0x01, 0x1d, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, - 0x00, 0xfc, 0x01, 0x6d, 0x01, 0x5d, 0x02, 0xd9 -}; diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-4.h b/package/libs/libiconv/src/include/charmaps/iso-8859-4.h deleted file mode 100644 index 5db2f77807..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-4.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_iso_8859_4[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x01, 0x04, - 0x01, 0x38, 0x01, 0x56, 0x00, 0xa4, 0x01, 0x28, 0x01, 0x3b, 0x00, 0xa7, - 0x00, 0xa8, 0x01, 0x60, 0x01, 0x12, 0x01, 0x22, 0x01, 0x66, 0x00, 0xad, - 0x01, 0x7d, 0x00, 0xaf, 0x00, 0xb0, 0x01, 0x05, 0x02, 0xdb, 0x01, 0x57, - 0x00, 0xb4, 0x01, 0x29, 0x01, 0x3c, 0x02, 0xc7, 0x00, 0xb8, 0x01, 0x61, - 0x01, 0x13, 0x01, 0x23, 0x01, 0x67, 0x01, 0x4a, 0x01, 0x7e, 0x01, 0x4b, - 0x01, 0x00, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, - 0x00, 0xc6, 0x01, 0x2e, 0x01, 0x0c, 0x00, 0xc9, 0x01, 0x18, 0x00, 0xcb, - 0x01, 0x16, 0x00, 0xcd, 0x00, 0xce, 0x01, 0x2a, 0x01, 0x10, 0x01, 0x45, - 0x01, 0x4c, 0x01, 0x36, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, - 0x00, 0xd8, 0x01, 0x72, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x01, 0x68, - 0x01, 0x6a, 0x00, 0xdf, 0x01, 0x01, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0xe3, - 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x01, 0x2f, 0x01, 0x0d, 0x00, 0xe9, - 0x01, 0x19, 0x00, 0xeb, 0x01, 0x17, 0x00, 0xed, 0x00, 0xee, 0x01, 0x2b, - 0x01, 0x11, 0x01, 0x46, 0x01, 0x4d, 0x01, 0x37, 0x00, 0xf4, 0x00, 0xf5, - 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf8, 0x01, 0x73, 0x00, 0xfa, 0x00, 0xfb, - 0x00, 0xfc, 0x01, 0x69, 0x01, 0x6b, 0x02, 0xd9 -}; diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-5.h b/package/libs/libiconv/src/include/charmaps/iso-8859-5.h deleted file mode 100644 index d9fe684a34..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-5.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_iso_8859_5[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x04, 0x01, - 0x04, 0x02, 0x04, 0x03, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, - 0x04, 0x08, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x0b, 0x04, 0x0c, 0x00, 0xad, - 0x04, 0x0e, 0x04, 0x0f, 0x04, 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, - 0x04, 0x14, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, 0x04, 0x18, 0x04, 0x19, - 0x04, 0x1a, 0x04, 0x1b, 0x04, 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, - 0x04, 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, 0x04, 0x24, 0x04, 0x25, - 0x04, 0x26, 0x04, 0x27, 0x04, 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, - 0x04, 0x2c, 0x04, 0x2d, 0x04, 0x2e, 0x04, 0x2f, 0x04, 0x30, 0x04, 0x31, - 0x04, 0x32, 0x04, 0x33, 0x04, 0x34, 0x04, 0x35, 0x04, 0x36, 0x04, 0x37, - 0x04, 0x38, 0x04, 0x39, 0x04, 0x3a, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3d, - 0x04, 0x3e, 0x04, 0x3f, 0x04, 0x40, 0x04, 0x41, 0x04, 0x42, 0x04, 0x43, - 0x04, 0x44, 0x04, 0x45, 0x04, 0x46, 0x04, 0x47, 0x04, 0x48, 0x04, 0x49, - 0x04, 0x4a, 0x04, 0x4b, 0x04, 0x4c, 0x04, 0x4d, 0x04, 0x4e, 0x04, 0x4f, - 0x21, 0x16, 0x04, 0x51, 0x04, 0x52, 0x04, 0x53, 0x04, 0x54, 0x04, 0x55, - 0x04, 0x56, 0x04, 0x57, 0x04, 0x58, 0x04, 0x59, 0x04, 0x5a, 0x04, 0x5b, - 0x04, 0x5c, 0x00, 0xa7, 0x04, 0x5e, 0x04, 0x5f -}; diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-6.h b/package/libs/libiconv/src/include/charmaps/iso-8859-6.h deleted file mode 100644 index 820020fd91..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-6.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_iso_8859_6[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xa4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x06, 0x0c, 0x00, 0xad, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x06, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x06, 0x1f, - 0xff, 0xff, 0x06, 0x21, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, - 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, 0x06, 0x29, 0x06, 0x2a, 0x06, 0x2b, - 0x06, 0x2c, 0x06, 0x2d, 0x06, 0x2e, 0x06, 0x2f, 0x06, 0x30, 0x06, 0x31, - 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, - 0x06, 0x38, 0x06, 0x39, 0x06, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x06, 0x40, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, - 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, - 0x06, 0x4a, 0x06, 0x4b, 0x06, 0x4c, 0x06, 0x4d, 0x06, 0x4e, 0x06, 0x4f, - 0x06, 0x50, 0x06, 0x51, 0x06, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff -}; diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-7.h b/package/libs/libiconv/src/include/charmaps/iso-8859-7.h deleted file mode 100644 index 174f9d3cbc..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-7.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_iso_8859_7[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x20, 0x18, - 0x20, 0x19, 0x00, 0xa3, 0x20, 0xac, 0x20, 0xaf, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xa8, 0x00, 0xa9, 0x03, 0x7a, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0xff, 0xff, 0x20, 0x15, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, - 0x03, 0x84, 0x03, 0x85, 0x03, 0x86, 0x00, 0xb7, 0x03, 0x88, 0x03, 0x89, - 0x03, 0x8a, 0x00, 0xbb, 0x03, 0x8c, 0x00, 0xbd, 0x03, 0x8e, 0x03, 0x8f, - 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, - 0x03, 0x96, 0x03, 0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, - 0x03, 0x9c, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, - 0xff, 0xff, 0x03, 0xa3, 0x03, 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, - 0x03, 0xa8, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xab, 0x03, 0xac, 0x03, 0xad, - 0x03, 0xae, 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb1, 0x03, 0xb2, 0x03, 0xb3, - 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb9, - 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, - 0x03, 0xc0, 0x03, 0xc1, 0x03, 0xc2, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, - 0x03, 0xc6, 0x03, 0xc7, 0x03, 0xc8, 0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, - 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, 0xff, 0xff -}; diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-8.h b/package/libs/libiconv/src/include/charmaps/iso-8859-8.h deleted file mode 100644 index 66d4a5ec1f..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-8.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_iso_8859_8[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0xff, 0xff, - 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xd7, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, - 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, - 0x00, 0xf7, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x17, 0x05, 0xd0, 0x05, 0xd1, 0x05, 0xd2, 0x05, 0xd3, - 0x05, 0xd4, 0x05, 0xd5, 0x05, 0xd6, 0x05, 0xd7, 0x05, 0xd8, 0x05, 0xd9, - 0x05, 0xda, 0x05, 0xdb, 0x05, 0xdc, 0x05, 0xdd, 0x05, 0xde, 0x05, 0xdf, - 0x05, 0xe0, 0x05, 0xe1, 0x05, 0xe2, 0x05, 0xe3, 0x05, 0xe4, 0x05, 0xe5, - 0x05, 0xe6, 0x05, 0xe7, 0x05, 0xe8, 0x05, 0xe9, 0x05, 0xea, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0e, 0x20, 0x0f, 0xff, 0xff -}; diff --git a/package/libs/libiconv/src/include/charmaps/iso-8859-9.h b/package/libs/libiconv/src/include/charmaps/iso-8859-9.h deleted file mode 100644 index f1a8646062..0000000000 --- a/package/libs/libiconv/src/include/charmaps/iso-8859-9.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_iso_8859_9[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, - 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, - 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, - 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, - 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, - 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, - 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, - 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, - 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, - 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, - 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x01, 0x1e, 0x00, 0xd1, - 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, - 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x01, 0x30, - 0x01, 0x5e, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0xe3, - 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, - 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, - 0x01, 0x1f, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, - 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, - 0x00, 0xfc, 0x01, 0x31, 0x01, 0x5f, 0x00, 0xff -}; diff --git a/package/libs/libiconv/src/include/charmaps/koi8-r.h b/package/libs/libiconv/src/include/charmaps/koi8-r.h deleted file mode 100644 index c2453a5319..0000000000 --- a/package/libs/libiconv/src/include/charmaps/koi8-r.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_koi8_r[] = { - 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x25, 0x02, 0x25, 0x0c, 0x25, 0x10, - 0x25, 0x14, 0x25, 0x18, 0x25, 0x1c, 0x25, 0x24, 0x25, 0x2c, 0x25, 0x34, - 0x25, 0x3c, 0x25, 0x80, 0x25, 0x84, 0x25, 0x88, 0x25, 0x8c, 0x25, 0x90, - 0x25, 0x91, 0x25, 0x92, 0x25, 0x93, 0x23, 0x20, 0x25, 0xa0, 0x22, 0x19, - 0x22, 0x1a, 0x22, 0x48, 0x22, 0x64, 0x22, 0x65, 0x00, 0xa0, 0x23, 0x21, - 0x00, 0xb0, 0x00, 0xb2, 0x00, 0xb7, 0x00, 0xf7, 0x25, 0x50, 0x25, 0x51, - 0x25, 0x52, 0x04, 0x51, 0x25, 0x53, 0x25, 0x54, 0x25, 0x55, 0x25, 0x56, - 0x25, 0x57, 0x25, 0x58, 0x25, 0x59, 0x25, 0x5a, 0x25, 0x5b, 0x25, 0x5c, - 0x25, 0x5d, 0x25, 0x5e, 0x25, 0x5f, 0x25, 0x60, 0x25, 0x61, 0x04, 0x01, - 0x25, 0x62, 0x25, 0x63, 0x25, 0x64, 0x25, 0x65, 0x25, 0x66, 0x25, 0x67, - 0x25, 0x68, 0x25, 0x69, 0x25, 0x6a, 0x25, 0x6b, 0x25, 0x6c, 0x00, 0xa9, - 0x04, 0x4e, 0x04, 0x30, 0x04, 0x31, 0x04, 0x46, 0x04, 0x34, 0x04, 0x35, - 0x04, 0x44, 0x04, 0x33, 0x04, 0x45, 0x04, 0x38, 0x04, 0x39, 0x04, 0x3a, - 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3d, 0x04, 0x3e, 0x04, 0x3f, 0x04, 0x4f, - 0x04, 0x40, 0x04, 0x41, 0x04, 0x42, 0x04, 0x43, 0x04, 0x36, 0x04, 0x32, - 0x04, 0x4c, 0x04, 0x4b, 0x04, 0x37, 0x04, 0x48, 0x04, 0x4d, 0x04, 0x49, - 0x04, 0x47, 0x04, 0x4a, 0x04, 0x2e, 0x04, 0x10, 0x04, 0x11, 0x04, 0x26, - 0x04, 0x14, 0x04, 0x15, 0x04, 0x24, 0x04, 0x13, 0x04, 0x25, 0x04, 0x18, - 0x04, 0x19, 0x04, 0x1a, 0x04, 0x1b, 0x04, 0x1c, 0x04, 0x1d, 0x04, 0x1e, - 0x04, 0x1f, 0x04, 0x2f, 0x04, 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, - 0x04, 0x16, 0x04, 0x12, 0x04, 0x2c, 0x04, 0x2b, 0x04, 0x17, 0x04, 0x28, - 0x04, 0x2d, 0x04, 0x29, 0x04, 0x27, 0x04, 0x2a -}; diff --git a/package/libs/libiconv/src/include/charmaps/windows-1250.h b/package/libs/libiconv/src/include/charmaps/windows-1250.h deleted file mode 100644 index 8e4723e48d..0000000000 --- a/package/libs/libiconv/src/include/charmaps/windows-1250.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_windows_1250[] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0xac, 0xff, 0xff, 0x20, 0x1a, 0xff, 0xff, - 0x20, 0x1e, 0x20, 0x26, 0x20, 0x20, 0x20, 0x21, 0xff, 0xff, 0x20, 0x30, - 0x01, 0x60, 0x20, 0x39, 0x01, 0x5a, 0x01, 0x64, 0x01, 0x7d, 0x01, 0x79, - 0xff, 0xff, 0x20, 0x18, 0x20, 0x19, 0x20, 0x1c, 0x20, 0x1d, 0x20, 0x22, - 0x20, 0x13, 0x20, 0x14, 0xff, 0xff, 0x21, 0x22, 0x01, 0x61, 0x20, 0x3a, - 0x01, 0x5b, 0x01, 0x65, 0x01, 0x7e, 0x01, 0x7a, 0x00, 0xa0, 0x02, 0xc7, - 0x02, 0xd8, 0x01, 0x41, 0x00, 0xa4, 0x01, 0x04, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xa8, 0x00, 0xa9, 0x01, 0x5e, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x01, 0x7b, 0x00, 0xb0, 0x00, 0xb1, 0x02, 0xdb, 0x01, 0x42, - 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x01, 0x05, - 0x01, 0x5f, 0x00, 0xbb, 0x01, 0x3d, 0x02, 0xdd, 0x01, 0x3e, 0x01, 0x7c, - 0x01, 0x54, 0x00, 0xc1, 0x00, 0xc2, 0x01, 0x02, 0x00, 0xc4, 0x01, 0x39, - 0x01, 0x06, 0x00, 0xc7, 0x01, 0x0c, 0x00, 0xc9, 0x01, 0x18, 0x00, 0xcb, - 0x01, 0x1a, 0x00, 0xcd, 0x00, 0xce, 0x01, 0x0e, 0x01, 0x10, 0x01, 0x43, - 0x01, 0x47, 0x00, 0xd3, 0x00, 0xd4, 0x01, 0x50, 0x00, 0xd6, 0x00, 0xd7, - 0x01, 0x58, 0x01, 0x6e, 0x00, 0xda, 0x01, 0x70, 0x00, 0xdc, 0x00, 0xdd, - 0x01, 0x62, 0x00, 0xdf, 0x01, 0x55, 0x00, 0xe1, 0x00, 0xe2, 0x01, 0x03, - 0x00, 0xe4, 0x01, 0x3a, 0x01, 0x07, 0x00, 0xe7, 0x01, 0x0d, 0x00, 0xe9, - 0x01, 0x19, 0x00, 0xeb, 0x01, 0x1b, 0x00, 0xed, 0x00, 0xee, 0x01, 0x0f, - 0x01, 0x11, 0x01, 0x44, 0x01, 0x48, 0x00, 0xf3, 0x00, 0xf4, 0x01, 0x51, - 0x00, 0xf6, 0x00, 0xf7, 0x01, 0x59, 0x01, 0x6f, 0x00, 0xfa, 0x01, 0x71, - 0x00, 0xfc, 0x00, 0xfd, 0x01, 0x63, 0x02, 0xd9 -}; diff --git a/package/libs/libiconv/src/include/charmaps/windows-1251.h b/package/libs/libiconv/src/include/charmaps/windows-1251.h deleted file mode 100644 index e278850727..0000000000 --- a/package/libs/libiconv/src/include/charmaps/windows-1251.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_windows_1251[] = { - 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x04, 0x03, 0x20, 0x1a, 0x04, 0x53, - 0x20, 0x1e, 0x20, 0x26, 0x20, 0x20, 0x20, 0x21, 0x20, 0xac, 0x20, 0x30, - 0x04, 0x09, 0x20, 0x39, 0x04, 0x0a, 0x04, 0x0c, 0x04, 0x0b, 0x04, 0x0f, - 0x04, 0x52, 0x20, 0x18, 0x20, 0x19, 0x20, 0x1c, 0x20, 0x1d, 0x20, 0x22, - 0x20, 0x13, 0x20, 0x14, 0xff, 0xff, 0x21, 0x22, 0x04, 0x59, 0x20, 0x3a, - 0x04, 0x5a, 0x04, 0x5c, 0x04, 0x5b, 0x04, 0x5f, 0x00, 0xa0, 0x04, 0x0e, - 0x04, 0x5e, 0x04, 0x08, 0x00, 0xa4, 0x04, 0x90, 0x00, 0xa6, 0x00, 0xa7, - 0x04, 0x01, 0x00, 0xa9, 0x04, 0x04, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x04, 0x07, 0x00, 0xb0, 0x00, 0xb1, 0x04, 0x06, 0x04, 0x56, - 0x04, 0x91, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x04, 0x51, 0x21, 0x16, - 0x04, 0x54, 0x00, 0xbb, 0x04, 0x58, 0x04, 0x05, 0x04, 0x55, 0x04, 0x57, - 0x04, 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, 0x14, 0x04, 0x15, - 0x04, 0x16, 0x04, 0x17, 0x04, 0x18, 0x04, 0x19, 0x04, 0x1a, 0x04, 0x1b, - 0x04, 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, 0x04, 0x20, 0x04, 0x21, - 0x04, 0x22, 0x04, 0x23, 0x04, 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, - 0x04, 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, 0x04, 0x2c, 0x04, 0x2d, - 0x04, 0x2e, 0x04, 0x2f, 0x04, 0x30, 0x04, 0x31, 0x04, 0x32, 0x04, 0x33, - 0x04, 0x34, 0x04, 0x35, 0x04, 0x36, 0x04, 0x37, 0x04, 0x38, 0x04, 0x39, - 0x04, 0x3a, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3d, 0x04, 0x3e, 0x04, 0x3f, - 0x04, 0x40, 0x04, 0x41, 0x04, 0x42, 0x04, 0x43, 0x04, 0x44, 0x04, 0x45, - 0x04, 0x46, 0x04, 0x47, 0x04, 0x48, 0x04, 0x49, 0x04, 0x4a, 0x04, 0x4b, - 0x04, 0x4c, 0x04, 0x4d, 0x04, 0x4e, 0x04, 0x4f -}; diff --git a/package/libs/libiconv/src/include/charmaps/windows-1252.h b/package/libs/libiconv/src/include/charmaps/windows-1252.h deleted file mode 100644 index a6dad8a05a..0000000000 --- a/package/libs/libiconv/src/include/charmaps/windows-1252.h +++ /dev/null @@ -1,25 +0,0 @@ -static const unsigned char map_windows_1252[] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0xac, 0xff, 0xff, 0x20, 0x1a, 0x01, 0x92, - 0x20, 0x1e, 0x20, 0x26, 0x20, 0x20, 0x20, 0x21, 0x02, 0xc6, 0x20, 0x30, - 0x01, 0x60, 0x20, 0x39, 0x01, 0x52, 0xff, 0xff, 0x01, 0x7d, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x18, 0x20, 0x19, 0x20, 0x1c, 0x20, 0x1d, 0x20, 0x22, - 0x20, 0x13, 0x20, 0x14, 0x02, 0xdc, 0x21, 0x22, 0x01, 0x61, 0x20, 0x3a, - 0x01, 0x53, 0xff, 0xff, 0x01, 0x7e, 0x01, 0x78, 0x00, 0xa0, 0x00, 0xa1, - 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, - 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, - 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, - 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, - 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, - 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, - 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, - 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, - 0x00, 0xde, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0xe3, - 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, - 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, - 0x00, 0xf0, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, - 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, - 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0xff -}; - diff --git a/package/libs/libiconv/src/include/charmaps/windows-1253.h b/package/libs/libiconv/src/include/charmaps/windows-1253.h deleted file mode 100644 index b0bdf1eb36..0000000000 --- a/package/libs/libiconv/src/include/charmaps/windows-1253.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_windows_1253[] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0xac, 0xff, 0xff, 0x20, 0x1a, 0x01, 0x92, - 0x20, 0x1e, 0x20, 0x26, 0x20, 0x20, 0x20, 0x21, 0xff, 0xff, 0x20, 0x30, - 0xff, 0xff, 0x20, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x18, 0x20, 0x19, 0x20, 0x1c, 0x20, 0x1d, 0x20, 0x22, - 0x20, 0x13, 0x20, 0x14, 0xff, 0xff, 0x21, 0x22, 0xff, 0xff, 0x20, 0x3a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xa0, 0x03, 0x85, - 0x03, 0x86, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xa8, 0x00, 0xa9, 0xff, 0xff, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x20, 0x15, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, - 0x03, 0x84, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x03, 0x88, 0x03, 0x89, - 0x03, 0x8a, 0x00, 0xbb, 0x03, 0x8c, 0x00, 0xbd, 0x03, 0x8e, 0x03, 0x8f, - 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, - 0x03, 0x96, 0x03, 0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, - 0x03, 0x9c, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, - 0xff, 0xff, 0x03, 0xa3, 0x03, 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, - 0x03, 0xa8, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xab, 0x03, 0xac, 0x03, 0xad, - 0x03, 0xae, 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb1, 0x03, 0xb2, 0x03, 0xb3, - 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb9, - 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, - 0x03, 0xc0, 0x03, 0xc1, 0x03, 0xc2, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, - 0x03, 0xc6, 0x03, 0xc7, 0x03, 0xc8, 0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, - 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, 0xff, 0xff -}; diff --git a/package/libs/libiconv/src/include/charmaps/windows-1254.h b/package/libs/libiconv/src/include/charmaps/windows-1254.h deleted file mode 100644 index be22600797..0000000000 --- a/package/libs/libiconv/src/include/charmaps/windows-1254.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_windows_1254[] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0xac, 0xff, 0xff, 0x20, 0x1a, 0x01, 0x92, - 0x20, 0x1e, 0x20, 0x26, 0x20, 0x20, 0x20, 0x21, 0x02, 0xc6, 0x20, 0x30, - 0x01, 0x60, 0x20, 0x39, 0x01, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x18, 0x20, 0x19, 0x20, 0x1c, 0x20, 0x1d, 0x20, 0x22, - 0x20, 0x13, 0x20, 0x14, 0x02, 0xdc, 0x21, 0x22, 0x01, 0x61, 0x20, 0x3a, - 0x01, 0x53, 0xff, 0xff, 0xff, 0xff, 0x01, 0x78, 0x00, 0xa0, 0x00, 0xa1, - 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, - 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, - 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, - 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, - 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, - 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x01, 0x1e, 0x00, 0xd1, - 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, - 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x01, 0x30, - 0x01, 0x5e, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0xe3, - 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, - 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, - 0x01, 0x1f, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, - 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, - 0x00, 0xfc, 0x01, 0x31, 0x01, 0x5f, 0x00, 0xff -}; diff --git a/package/libs/libiconv/src/include/charmaps/windows-1255.h b/package/libs/libiconv/src/include/charmaps/windows-1255.h deleted file mode 100644 index 28bf513d46..0000000000 --- a/package/libs/libiconv/src/include/charmaps/windows-1255.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_windows_1255[] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0xac, 0xff, 0xff, 0x20, 0x1a, 0x01, 0x92, - 0x20, 0x1e, 0x20, 0x26, 0x20, 0x20, 0x20, 0x21, 0x02, 0xc6, 0x20, 0x30, - 0xff, 0xff, 0x20, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x18, 0x20, 0x19, 0x20, 0x1c, 0x20, 0x1d, 0x20, 0x22, - 0x20, 0x13, 0x20, 0x14, 0x02, 0xdc, 0x21, 0x22, 0xff, 0xff, 0x20, 0x3a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xa0, 0x00, 0xa1, - 0x00, 0xa2, 0x00, 0xa3, 0x20, 0xaa, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xd7, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, - 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, - 0x00, 0xf7, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, - 0x05, 0xb0, 0x05, 0xb1, 0x05, 0xb2, 0x05, 0xb3, 0x05, 0xb4, 0x05, 0xb5, - 0x05, 0xb6, 0x05, 0xb7, 0x05, 0xb8, 0x05, 0xb9, 0xff, 0xff, 0x05, 0xbb, - 0x05, 0xbc, 0x05, 0xbd, 0x05, 0xbe, 0x05, 0xbf, 0x05, 0xc0, 0x05, 0xc1, - 0x05, 0xc2, 0x05, 0xc3, 0x05, 0xf0, 0x05, 0xf1, 0x05, 0xf2, 0x05, 0xf3, - 0x05, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x05, 0xd0, 0x05, 0xd1, 0x05, 0xd2, 0x05, 0xd3, - 0x05, 0xd4, 0x05, 0xd5, 0x05, 0xd6, 0x05, 0xd7, 0x05, 0xd8, 0x05, 0xd9, - 0x05, 0xda, 0x05, 0xdb, 0x05, 0xdc, 0x05, 0xdd, 0x05, 0xde, 0x05, 0xdf, - 0x05, 0xe0, 0x05, 0xe1, 0x05, 0xe2, 0x05, 0xe3, 0x05, 0xe4, 0x05, 0xe5, - 0x05, 0xe6, 0x05, 0xe7, 0x05, 0xe8, 0x05, 0xe9, 0x05, 0xea, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0e, 0x20, 0x0f, 0xff, 0xff -}; diff --git a/package/libs/libiconv/src/include/charmaps/windows-1256.h b/package/libs/libiconv/src/include/charmaps/windows-1256.h deleted file mode 100644 index fbca315eff..0000000000 --- a/package/libs/libiconv/src/include/charmaps/windows-1256.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_windows_1256[] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0xac, 0x06, 0x7e, 0x20, 0x1a, 0x01, 0x92, - 0x20, 0x1e, 0x20, 0x26, 0x20, 0x20, 0x20, 0x21, 0x02, 0xc6, 0x20, 0x30, - 0x06, 0x79, 0x20, 0x39, 0x01, 0x52, 0x06, 0x86, 0x06, 0x98, 0x06, 0x88, - 0x06, 0xaf, 0x20, 0x18, 0x20, 0x19, 0x20, 0x1c, 0x20, 0x1d, 0x20, 0x22, - 0x20, 0x13, 0x20, 0x14, 0x06, 0xa9, 0x21, 0x22, 0x06, 0x91, 0x20, 0x3a, - 0x01, 0x53, 0x20, 0x0c, 0x20, 0x0d, 0x06, 0xba, 0x00, 0xa0, 0x06, 0x0c, - 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xa8, 0x00, 0xa9, 0x06, 0xbe, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, - 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, - 0x06, 0x1b, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x06, 0x1f, - 0x06, 0xc1, 0x06, 0x21, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, - 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, 0x06, 0x29, 0x06, 0x2a, 0x06, 0x2b, - 0x06, 0x2c, 0x06, 0x2d, 0x06, 0x2e, 0x06, 0x2f, 0x06, 0x30, 0x06, 0x31, - 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x00, 0xd7, - 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3a, 0x06, 0x40, 0x06, 0x41, - 0x06, 0x42, 0x06, 0x43, 0x00, 0xe0, 0x06, 0x44, 0x00, 0xe2, 0x06, 0x45, - 0x06, 0x46, 0x06, 0x47, 0x06, 0x48, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, - 0x00, 0xea, 0x00, 0xeb, 0x06, 0x49, 0x06, 0x4a, 0x00, 0xee, 0x00, 0xef, - 0x06, 0x4b, 0x06, 0x4c, 0x06, 0x4d, 0x06, 0x4e, 0x00, 0xf4, 0x06, 0x4f, - 0x06, 0x50, 0x00, 0xf7, 0x06, 0x51, 0x00, 0xf9, 0x06, 0x52, 0x00, 0xfb, - 0x00, 0xfc, 0x20, 0x0e, 0x20, 0x0f, 0x06, 0xd2 -}; diff --git a/package/libs/libiconv/src/include/charmaps/windows-1257.h b/package/libs/libiconv/src/include/charmaps/windows-1257.h deleted file mode 100644 index 69d4474bc2..0000000000 --- a/package/libs/libiconv/src/include/charmaps/windows-1257.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_windows_1257[] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0xac, 0xff, 0xff, 0x20, 0x1a, 0xff, 0xff, - 0x20, 0x1e, 0x20, 0x26, 0x20, 0x20, 0x20, 0x21, 0xff, 0xff, 0x20, 0x30, - 0xff, 0xff, 0x20, 0x39, 0xff, 0xff, 0x00, 0xa8, 0x02, 0xc7, 0x00, 0xb8, - 0xff, 0xff, 0x20, 0x18, 0x20, 0x19, 0x20, 0x1c, 0x20, 0x1d, 0x20, 0x22, - 0x20, 0x13, 0x20, 0x14, 0xff, 0xff, 0x21, 0x22, 0xff, 0xff, 0x20, 0x3a, - 0xff, 0xff, 0x00, 0xaf, 0x02, 0xdb, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xff, - 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0xff, 0xff, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xd8, 0x00, 0xa9, 0x01, 0x56, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x00, 0xc6, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, - 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xf8, 0x00, 0xb9, - 0x01, 0x57, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xe6, - 0x01, 0x04, 0x01, 0x2e, 0x01, 0x00, 0x01, 0x06, 0x00, 0xc4, 0x00, 0xc5, - 0x01, 0x18, 0x01, 0x12, 0x01, 0x0c, 0x00, 0xc9, 0x01, 0x79, 0x01, 0x16, - 0x01, 0x22, 0x01, 0x36, 0x01, 0x2a, 0x01, 0x3b, 0x01, 0x60, 0x01, 0x43, - 0x01, 0x45, 0x00, 0xd3, 0x01, 0x4c, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, - 0x01, 0x72, 0x01, 0x41, 0x01, 0x5a, 0x01, 0x6a, 0x00, 0xdc, 0x01, 0x7b, - 0x01, 0x7d, 0x00, 0xdf, 0x01, 0x05, 0x01, 0x2f, 0x01, 0x01, 0x01, 0x07, - 0x00, 0xe4, 0x00, 0xe5, 0x01, 0x19, 0x01, 0x13, 0x01, 0x0d, 0x00, 0xe9, - 0x01, 0x7a, 0x01, 0x17, 0x01, 0x23, 0x01, 0x37, 0x01, 0x2b, 0x01, 0x3c, - 0x01, 0x61, 0x01, 0x44, 0x01, 0x46, 0x00, 0xf3, 0x01, 0x4d, 0x00, 0xf5, - 0x00, 0xf6, 0x00, 0xf7, 0x01, 0x73, 0x01, 0x42, 0x01, 0x5b, 0x01, 0x6b, - 0x00, 0xfc, 0x01, 0x7c, 0x01, 0x7e, 0x02, 0xd9 -}; diff --git a/package/libs/libiconv/src/include/charmaps/windows-1258.h b/package/libs/libiconv/src/include/charmaps/windows-1258.h deleted file mode 100644 index 5bbd737aec..0000000000 --- a/package/libs/libiconv/src/include/charmaps/windows-1258.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_windows_1258[] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0xac, 0xff, 0xff, 0x20, 0x1a, 0x01, 0x92, - 0x20, 0x1e, 0x20, 0x26, 0x20, 0x20, 0x20, 0x21, 0x02, 0xc6, 0x20, 0x30, - 0xff, 0xff, 0x20, 0x39, 0x01, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x18, 0x20, 0x19, 0x20, 0x1c, 0x20, 0x1d, 0x20, 0x22, - 0x20, 0x13, 0x20, 0x14, 0x02, 0xdc, 0x21, 0x22, 0xff, 0xff, 0x20, 0x3a, - 0x01, 0x53, 0xff, 0xff, 0xff, 0xff, 0x01, 0x78, 0x00, 0xa0, 0x00, 0xa1, - 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, - 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, - 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, - 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, - 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, - 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x01, 0x02, 0x00, 0xc4, 0x00, 0xc5, - 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, - 0x03, 0x00, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x01, 0x10, 0x00, 0xd1, - 0x03, 0x09, 0x00, 0xd3, 0x00, 0xd4, 0x01, 0xa0, 0x00, 0xd6, 0x00, 0xd7, - 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x01, 0xaf, - 0x03, 0x03, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x01, 0x03, - 0x00, 0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, - 0x00, 0xea, 0x00, 0xeb, 0x03, 0x01, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, - 0x01, 0x11, 0x00, 0xf1, 0x03, 0x23, 0x00, 0xf3, 0x00, 0xf4, 0x01, 0xa1, - 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, - 0x00, 0xfc, 0x01, 0xb0, 0x20, 0xab, 0x00, 0xff -}; diff --git a/package/libs/libiconv/src/include/charmaps/windows-874.h b/package/libs/libiconv/src/include/charmaps/windows-874.h deleted file mode 100644 index 5749280a5e..0000000000 --- a/package/libs/libiconv/src/include/charmaps/windows-874.h +++ /dev/null @@ -1,24 +0,0 @@ -static const unsigned char map_windows_874[] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0xac, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x26, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x18, 0x20, 0x19, 0x20, 0x1c, 0x20, 0x1d, 0x20, 0x22, - 0x20, 0x13, 0x20, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xa0, 0x0e, 0x01, - 0x0e, 0x02, 0x0e, 0x03, 0x0e, 0x04, 0x0e, 0x05, 0x0e, 0x06, 0x0e, 0x07, - 0x0e, 0x08, 0x0e, 0x09, 0x0e, 0x0a, 0x0e, 0x0b, 0x0e, 0x0c, 0x0e, 0x0d, - 0x0e, 0x0e, 0x0e, 0x0f, 0x0e, 0x10, 0x0e, 0x11, 0x0e, 0x12, 0x0e, 0x13, - 0x0e, 0x14, 0x0e, 0x15, 0x0e, 0x16, 0x0e, 0x17, 0x0e, 0x18, 0x0e, 0x19, - 0x0e, 0x1a, 0x0e, 0x1b, 0x0e, 0x1c, 0x0e, 0x1d, 0x0e, 0x1e, 0x0e, 0x1f, - 0x0e, 0x20, 0x0e, 0x21, 0x0e, 0x22, 0x0e, 0x23, 0x0e, 0x24, 0x0e, 0x25, - 0x0e, 0x26, 0x0e, 0x27, 0x0e, 0x28, 0x0e, 0x29, 0x0e, 0x2a, 0x0e, 0x2b, - 0x0e, 0x2c, 0x0e, 0x2d, 0x0e, 0x2e, 0x0e, 0x2f, 0x0e, 0x30, 0x0e, 0x31, - 0x0e, 0x32, 0x0e, 0x33, 0x0e, 0x34, 0x0e, 0x35, 0x0e, 0x36, 0x0e, 0x37, - 0x0e, 0x38, 0x0e, 0x39, 0x0e, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0e, 0x3f, 0x0e, 0x40, 0x0e, 0x41, 0x0e, 0x42, 0x0e, 0x43, - 0x0e, 0x44, 0x0e, 0x45, 0x0e, 0x46, 0x0e, 0x47, 0x0e, 0x48, 0x0e, 0x49, - 0x0e, 0x4a, 0x0e, 0x4b, 0x0e, 0x4c, 0x0e, 0x4d, 0x0e, 0x4e, 0x0e, 0x4f, - 0x0e, 0x50, 0x0e, 0x51, 0x0e, 0x52, 0x0e, 0x53, 0x0e, 0x54, 0x0e, 0x55, - 0x0e, 0x56, 0x0e, 0x57, 0x0e, 0x58, 0x0e, 0x59, 0x0e, 0x5a, 0x0e, 0x5b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff -}; diff --git a/package/libs/libiconv/src/include/iconv.h b/package/libs/libiconv/src/include/iconv.h deleted file mode 100644 index 8767be42ee..0000000000 --- a/package/libs/libiconv/src/include/iconv.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef _LIBICONV_H -#define _LIBICONV_H 1 - -#define _LIBICONV_VERSION 0x010B /* version number: (major<<8) + minor */ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern int _libiconv_version; /* Likewise */ - -typedef long iconv_t; - -#define iconv_open libiconv_open -#define iconv libiconv -#define iconv_close libiconv_close - -extern iconv_t -iconv_open(const char *tocode, const char *fromcode); - -extern size_t -iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, - char **outbuf, size_t *outbytesleft); - -extern int -iconv_close(iconv_t cd); - -#define libiconv_set_relocation_prefix(...) do {} while(0) - -#ifdef __cplusplus -} -#endif - -#endif /* _LIBICONV_H */ diff --git a/package/libs/libiconv/src/m4/iconv.m4 b/package/libs/libiconv/src/m4/iconv.m4 deleted file mode 100644 index e2041b9b49..0000000000 --- a/package/libs/libiconv/src/m4/iconv.m4 +++ /dev/null @@ -1,214 +0,0 @@ -# iconv.m4 serial 11 (gettext-0.18.1) -dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl From Bruno Haible. - -AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], -[ - dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - AC_REQUIRE([AC_LIB_RPATH]) - - dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV - dnl accordingly. - AC_LIB_LINKFLAGS_BODY([iconv]) -]) - -AC_DEFUN([AM_ICONV_LINK], -[ - dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and - dnl those with the standalone portable GNU libiconv installed). - AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles - - dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV - dnl accordingly. - AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) - - dnl Add $INCICONV to CPPFLAGS before performing the following checks, - dnl because if the user has installed libiconv and not disabled its use - dnl via --without-libiconv-prefix, he wants to use it. The first - dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. - am_save_CPPFLAGS="$CPPFLAGS" - AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) - - AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ - am_cv_func_iconv="no, consider installing GNU libiconv" - am_cv_lib_iconv=no - AC_TRY_LINK([#include -#include ], - [iconv_t cd = iconv_open("",""); - iconv(cd,NULL,NULL,NULL,NULL); - iconv_close(cd);], - [am_cv_func_iconv=yes]) - if test "$am_cv_func_iconv" != yes; then - am_save_LIBS="$LIBS" - LIBS="$LIBS $LIBICONV" - AC_TRY_LINK([#include -#include ], - [iconv_t cd = iconv_open("",""); - iconv(cd,NULL,NULL,NULL,NULL); - iconv_close(cd);], - [am_cv_lib_iconv=yes] - [am_cv_func_iconv=yes]) - LIBS="$am_save_LIBS" - fi - ]) - if test "$am_cv_func_iconv" = yes; then - AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ - dnl This tests against bugs in AIX 5.1, HP-UX 11.11, Solaris 10. - am_save_LIBS="$LIBS" - if test $am_cv_lib_iconv = yes; then - LIBS="$LIBS $LIBICONV" - fi - AC_TRY_RUN([ -#include -#include -int main () -{ - /* Test against AIX 5.1 bug: Failures are not distinguishable from successful - returns. */ - { - iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); - if (cd_utf8_to_88591 != (iconv_t)(-1)) - { - static const char input[] = "\342\202\254"; /* EURO SIGN */ - char buf[10]; - const char *inptr = input; - size_t inbytesleft = strlen (input); - char *outptr = buf; - size_t outbytesleft = sizeof (buf); - size_t res = iconv (cd_utf8_to_88591, - (char **) &inptr, &inbytesleft, - &outptr, &outbytesleft); - if (res == 0) - return 1; - } - } - /* Test against Solaris 10 bug: Failures are not distinguishable from - successful returns. */ - { - iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); - if (cd_ascii_to_88591 != (iconv_t)(-1)) - { - static const char input[] = "\263"; - char buf[10]; - const char *inptr = input; - size_t inbytesleft = strlen (input); - char *outptr = buf; - size_t outbytesleft = sizeof (buf); - size_t res = iconv (cd_ascii_to_88591, - (char **) &inptr, &inbytesleft, - &outptr, &outbytesleft); - if (res == 0) - return 1; - } - } -#if 0 /* This bug could be worked around by the caller. */ - /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ - { - iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); - if (cd_88591_to_utf8 != (iconv_t)(-1)) - { - static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; - char buf[50]; - const char *inptr = input; - size_t inbytesleft = strlen (input); - char *outptr = buf; - size_t outbytesleft = sizeof (buf); - size_t res = iconv (cd_88591_to_utf8, - (char **) &inptr, &inbytesleft, - &outptr, &outbytesleft); - if ((int)res > 0) - return 1; - } - } -#endif - /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is - provided. */ - if (/* Try standardized names. */ - iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) - /* Try IRIX, OSF/1 names. */ - && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) - /* Try AIX names. */ - && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) - /* Try HP-UX names. */ - && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) - return 1; - return 0; -}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], - [case "$host_os" in - aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; - *) am_cv_func_iconv_works="guessing yes" ;; - esac]) - LIBS="$am_save_LIBS" - ]) - case "$am_cv_func_iconv_works" in - *no) am_func_iconv=no am_cv_lib_iconv=no ;; - *) am_func_iconv=yes ;; - esac - else - am_func_iconv=no am_cv_lib_iconv=no - fi - if test "$am_func_iconv" = yes; then - AC_DEFINE([HAVE_ICONV], [1], - [Define if you have the iconv() function and it works.]) - fi - if test "$am_cv_lib_iconv" = yes; then - AC_MSG_CHECKING([how to link with libiconv]) - AC_MSG_RESULT([$LIBICONV]) - else - dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV - dnl either. - CPPFLAGS="$am_save_CPPFLAGS" - LIBICONV= - LTLIBICONV= - fi - AC_SUBST([LIBICONV]) - AC_SUBST([LTLIBICONV]) -]) - -dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to -dnl avoid warnings like -dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". -dnl This is tricky because of the way 'aclocal' is implemented: -dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN. -dnl Otherwise aclocal's initial scan pass would miss the macro definition. -dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions. -dnl Otherwise aclocal would emit many "Use of uninitialized value $1" -dnl warnings. -m4_define([gl_iconv_AC_DEFUN], - m4_version_prereq([2.64], - [[AC_DEFUN_ONCE( - [$1], [$2])]], - [[AC_DEFUN( - [$1], [$2])]])) -gl_iconv_AC_DEFUN([AM_ICONV], -[ - AM_ICONV_LINK - if test "$am_cv_func_iconv" = yes; then - AC_MSG_CHECKING([for iconv declaration]) - AC_CACHE_VAL([am_cv_proto_iconv], [ - AC_TRY_COMPILE([ -#include -#include -extern -#ifdef __cplusplus -"C" -#endif -#if defined(__STDC__) || defined(__cplusplus) -size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); -#else -size_t iconv(); -#endif -], [], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) - am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) - am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` - AC_MSG_RESULT([ - $am_cv_proto_iconv]) - AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], - [Define as const if the declaration of iconv() needs const.]) - fi -]) diff --git a/package/libs/libidn2/Makefile b/package/libs/libidn2/Makefile new file mode 100644 index 0000000000..d080cfcda2 --- /dev/null +++ b/package/libs/libidn2/Makefile @@ -0,0 +1,98 @@ +# +# Copyright (C) 2017-2018 Daniel Engberg +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libidn2 +PKG_VERSION:=2.3.4 +PKG_RELEASE:=1 + +PKG_SOURCE_URL:=@GNU/libidn +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_HASH:=93caba72b4e051d1f8d4f5a076ab63c99b77faee019b72b9783b267986dbb45f + +PKG_MAINTAINER:= +PKG_CPE_ID:=cpe:/a:libidn2_project:libidn2 + +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/idn2/Default + SECTION:=net + CATEGORY:=Network + URL:=http://www.gnu.org/software/libidn/ +endef + +define Package/idn2/Default/description + Libidn2 is a free software implementation of IDNA2008, + Punycode and TR46 in library form. It contains + functionality to convert internationalized domain + names to and from ASCII Compatible Encoding (ACE), + following the IDNA2008 and TR46 standards. +endef + +define Package/idn2 + $(call Package/idn2/Default) + SUBMENU:=IP Addresses and Names + TITLE:=GNU IDN2 (Internationalized Domain Name) tool + DEPENDS:=+libidn2 + LICENSE:=GPL-2.0-or-later + LICENSE_FILES:=COPYINGv2 +endef + +define Package/idn2/description +$(call Package/idn2/Default/description) + + Command line tool using libidn2 + +endef + +define Package/libidn2 + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+libunistring $(ICONV_DEPENDS) $(INTL_DEPENDS) + TITLE:=International domain name library (IDNA2008, Punycode and TR46) + URL:=https://www.gnu.org/software/libidn/#libidn2 + LICENSE:=LGPL-3.0-or-later + LICENSE_FILES:=COPYING.LESSERv3 +endef + +define Package/libidn2/description +$(call Package/idn2/Default/description) + + Library only package + +endef + +CONFIGURE_ARGS += \ + --disable-rpath \ + --disable-doc + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/idn2.h $(1)/usr/include + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{la,so}* $(1)/usr/lib/ + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libidn2.pc $(1)/usr/lib/pkgconfig/ +endef + +define Package/idn2/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/ +endef + +define Package/libidn2/install + $(INSTALL_DIR) $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,idn2)) +$(eval $(call BuildPackage,libidn2)) diff --git a/package/libs/libjson-c/Makefile b/package/libs/libjson-c/Makefile index 0f13883a3b..d925ac750d 100644 --- a/package/libs/libjson-c/Makefile +++ b/package/libs/libjson-c/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=json-c -PKG_VERSION:=0.15 -PKG_RELEASE:=2 +PKG_VERSION:=0.16 +PKG_RELEASE:=3 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-nodoc.tar.gz PKG_SOURCE_URL:=https://s3.amazonaws.com/json-c_releases/releases/ -PKG_HASH:=99bca4f944b8ced8ae0bbc6310d6a3528ca715e69541793a1ef51f8c5b4b0878 +PKG_HASH:=ac8a3dd6820daaca579b23fbc74664310fbc3d67f52f6707cda67d21dde5570f PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=MIT @@ -27,8 +27,12 @@ include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/cmake.mk CMAKE_HOST_OPTIONS += \ + -DDISABLE_EXTRA_LIBS=TRUE \ -DBUILD_SHARED_LIBS=FALSE +CMAKE_OPTIONS += \ + -DDISABLE_EXTRA_LIBS=TRUE + define Package/libjson-c SECTION:=libs CATEGORY:=Libraries diff --git a/package/libs/libjson-c/patches/001-dont-build-docs.patch b/package/libs/libjson-c/patches/001-dont-build-docs.patch index 1aa0da4f59..f35da80724 100644 --- a/package/libs/libjson-c/patches/001-dont-build-docs.patch +++ b/package/libs/libjson-c/patches/001-dont-build-docs.patch @@ -1,11 +1,11 @@ --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -401,8 +401,6 @@ set(JSON_C_SOURCES +@@ -433,8 +433,6 @@ configure_file(json.h.cmakein ${PROJECT_ include_directories(${PROJECT_SOURCE_DIR}) include_directories(${PROJECT_BINARY_DIR}) -add_subdirectory(doc) - - # uninstall - add_custom_target(uninstall - COMMAND cat ${PROJECT_BINARY_DIR}/install_manifest.txt | xargs rm + # "uninstall" custom target for make generators in unix like operating systems + # and if that target is not present + if (CMAKE_GENERATOR STREQUAL "Unix Makefiles") diff --git a/package/libs/libjson-c/patches/010-clang.patch b/package/libs/libjson-c/patches/010-clang.patch deleted file mode 100644 index 9ef73f1a82..0000000000 --- a/package/libs/libjson-c/patches/010-clang.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -265,7 +265,7 @@ message(STATUS "Wrote ${PROJECT_BINARY_D - configure_file(${PROJECT_SOURCE_DIR}/cmake/json_config.h.in ${PROJECT_BINARY_DIR}/json_config.h) - message(STATUS "Wrote ${PROJECT_BINARY_DIR}/json_config.h") - --if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") -+if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections") - if ("${DISABLE_WERROR}" STREQUAL "OFF") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") diff --git a/package/libs/libjson-c/patches/010-fix-build-with-clang-15.patch b/package/libs/libjson-c/patches/010-fix-build-with-clang-15.patch new file mode 100644 index 0000000000..d6af772e06 --- /dev/null +++ b/package/libs/libjson-c/patches/010-fix-build-with-clang-15.patch @@ -0,0 +1,184 @@ +From 6eca65617aacd19f4928acd5766b8dd20eda0b34 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 13 Aug 2022 20:37:03 -0700 +Subject: [PATCH] Fix build with clang-15+ + +Fixes +json_util.c:63:35: error: a function declaration without a prototype is deprecated in all versions of C [-We +rror,-Wstrict-prototypes] +const char *json_util_get_last_err() + ^ + void + +Signed-off-by: Khem Raj +--- + json_util.c | 2 +- + tests/test1.c | 6 +++--- + tests/test4.c | 2 +- + tests/test_cast.c | 2 +- + tests/test_charcase.c | 2 +- + tests/test_parse.c | 8 ++++---- + tests/test_printbuf.c | 4 ++-- + tests/test_util_file.c | 6 +++--- + 8 files changed, 16 insertions(+), 16 deletions(-) + +--- a/json_util.c ++++ b/json_util.c +@@ -60,7 +60,7 @@ static int _json_object_to_fd(int fd, st + + static char _last_err[256] = ""; + +-const char *json_util_get_last_err() ++const char *json_util_get_last_err(void) + { + if (_last_err[0] == '\0') + return NULL; +--- a/tests/test1.c ++++ b/tests/test1.c +@@ -58,7 +58,7 @@ static const char *to_json_string(json_o + #endif + + json_object *make_array(void); +-json_object *make_array() ++json_object *make_array(void) + { + json_object *my_array; + +@@ -74,7 +74,7 @@ json_object *make_array() + } + + void test_array_del_idx(void); +-void test_array_del_idx() ++void test_array_del_idx(void) + { + int rc; + size_t ii; +@@ -140,7 +140,7 @@ void test_array_del_idx() + } + + void test_array_list_expand_internal(void); +-void test_array_list_expand_internal() ++void test_array_list_expand_internal(void) + { + int rc; + size_t ii; +--- a/tests/test4.c ++++ b/tests/test4.c +@@ -28,7 +28,7 @@ void print_hex(const char *s) + } + + static void test_lot_of_adds(void); +-static void test_lot_of_adds() ++static void test_lot_of_adds(void) + { + int ii; + char key[50]; +--- a/tests/test_cast.c ++++ b/tests/test_cast.c +@@ -94,7 +94,7 @@ static void getit(struct json_object *ne + printf("new_obj.%s json_object_get_double()=%f\n", field, json_object_get_double(o)); + } + +-static void checktype_header() ++static void checktype_header(void) + { + printf("json_object_is_type: %s,%s,%s,%s,%s,%s,%s\n", json_type_to_name(json_type_null), + json_type_to_name(json_type_boolean), json_type_to_name(json_type_double), +--- a/tests/test_charcase.c ++++ b/tests/test_charcase.c +@@ -19,7 +19,7 @@ int main(int argc, char **argv) + } + + /* make sure only lowercase forms are parsed in strict mode */ +-static void test_case_parse() ++static void test_case_parse(void) + { + struct json_tokener *tok; + json_object *new_obj; +--- a/tests/test_parse.c ++++ b/tests/test_parse.c +@@ -92,7 +92,7 @@ static void single_basic_parse(const cha + if (getenv("TEST_PARSE_CHUNKSIZE") != NULL) + single_incremental_parse(test_string, clear_serializer); + } +-static void test_basic_parse() ++static void test_basic_parse(void) + { + single_basic_parse("\"\003\"", 0); + single_basic_parse("/* hello */\"foo\"", 0); +@@ -195,7 +195,7 @@ static void test_basic_parse() + single_basic_parse("[18446744073709551616]", 1); + } + +-static void test_utf8_parse() ++static void test_utf8_parse(void) + { + // json_tokener_parse doesn't support checking for byte order marks. + // It's the responsibility of the caller to detect and skip a BOM. +@@ -222,7 +222,7 @@ static int clear_serializer(json_object + return JSON_C_VISIT_RETURN_CONTINUE; + } + +-static void test_verbose_parse() ++static void test_verbose_parse(void) + { + json_object *new_obj; + enum json_tokener_error error = json_tokener_success; +@@ -562,7 +562,7 @@ struct incremental_step + {NULL, -1, -1, json_tokener_success, 0}, + }; + +-static void test_incremental_parse() ++static void test_incremental_parse(void) + { + json_object *new_obj; + enum json_tokener_error jerr; +--- a/tests/test_printbuf.c ++++ b/tests/test_printbuf.c +@@ -16,7 +16,7 @@ static void test_printbuf_memset_length( + #define __func__ __FUNCTION__ + #endif + +-static void test_basic_printbuf_memset() ++static void test_basic_printbuf_memset(void) + { + struct printbuf *pb; + +@@ -29,7 +29,7 @@ static void test_basic_printbuf_memset() + printf("%s: end test\n", __func__); + } + +-static void test_printbuf_memset_length() ++static void test_printbuf_memset_length(void) + { + struct printbuf *pb; + +--- a/tests/test_util_file.c ++++ b/tests/test_util_file.c +@@ -35,7 +35,7 @@ static void test_read_fd_equal(const cha + #define PATH_MAX 256 + #endif + +-static void test_write_to_file() ++static void test_write_to_file(void) + { + json_object *jso; + +@@ -231,7 +231,7 @@ static void test_read_valid_nested_with_ + close(d); + } + +-static void test_read_nonexistant() ++static void test_read_nonexistant(void) + { + const char *filename = "./not_present.json"; + +@@ -249,7 +249,7 @@ static void test_read_nonexistant() + } + } + +-static void test_read_closed() ++static void test_read_closed(void) + { + // Test reading from a closed fd + int d = open("/dev/null", O_RDONLY, 0); diff --git a/package/libs/libmbim/Makefile b/package/libs/libmbim/Makefile index 80cf70e28a..0d74b542eb 100644 --- a/package/libs/libmbim/Makefile +++ b/package/libs/libmbim/Makefile @@ -8,23 +8,22 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libmbim -PKG_SOURCE_VERSION:=1.26.4 -PKG_RELEASE:=$(AUTORELEASE) +PKG_SOURCE_VERSION:=1.28.4 +PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://gitlab.freedesktop.org/mobile-broadband/libmbim.git -PKG_MIRROR_HASH:=4963f9135f8ad26165d969d0b2028b00d68243201113c94a2ebe22c4227058a4 +PKG_MIRROR_HASH:=7ecc6d1e565392817311254045337907bbad015b46ec88542ea63594f47778be -PKG_MAINTAINER:=Nicholas Smith +PKG_BUILD_FLAGS:=gc-sections -PKG_INSTALL:=1 +PKG_MAINTAINER:=Nicholas Smith include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/nls.mk include $(INCLUDE_DIR)/meson.mk -TARGET_CFLAGS += -ffunction-sections -fdata-sections -fno-merge-all-constants -fmerge-constants -TARGET_LDFLAGS += -Wl,--gc-sections +TARGET_CFLAGS += -fno-merge-all-constants -fmerge-constants MESON_ARGS += \ -Dintrospection=false \ diff --git a/package/libs/libmd/Makefile b/package/libs/libmd/Makefile new file mode 100644 index 0000000000..faba27e5e9 --- /dev/null +++ b/package/libs/libmd/Makefile @@ -0,0 +1,47 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=libmd +PKG_VERSION:=1.0.4 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=https://archive.hadrons.org/software/libmd/ +PKG_HASH:=f51c921042e34beddeded4b75557656559cf5b1f2448033b4c1eec11c07e530f + +PKG_LICENSE:=BSD-3-Clause +PKG_LICENSE_FILES:=COPYING + +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk + +TARGET_CFLAGS += $(FPIC) + +CONFIGURE_ARGS += \ + --enable-static + +define Package/libmd + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Message Digest functions from BSD systems + ABI_VERSION:=0 +endef + +define Package/libmd/description + This library provides message digest functions found on BSD systems either + on their libc or libmd libraries and lacking on others like GNU systems, + thus making it easier to port projects with strong BSD origins, without + needing to embed the same code over and over again on each project. +endef + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/lib + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmd.a $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libmd*.pc $(1)/usr/lib/pkgconfig/ + $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/ +endef + +$(eval $(call BuildPackage,libmd)) diff --git a/package/libs/libmnl/Makefile b/package/libs/libmnl/Makefile index 2632cc2d94..06f79d5384 100644 --- a/package/libs/libmnl/Makefile +++ b/package/libs/libmnl/Makefile @@ -22,6 +22,7 @@ PKG_MAINTAINER:=Jo-Philipp Wich PKG_FIXUP:=autoreconf PKG_INSTALL:=1 PKG_LICENSE:=LGPL-2.1+ +PKG_CPE_ID:=cpe:/a:netfilter:libmnl include $(INCLUDE_DIR)/package.mk diff --git a/package/libs/libnetfilter-conntrack/Makefile b/package/libs/libnetfilter-conntrack/Makefile index 50432e9cd8..97197b4a61 100644 --- a/package/libs/libnetfilter-conntrack/Makefile +++ b/package/libs/libnetfilter-conntrack/Makefile @@ -18,6 +18,7 @@ PKG_HASH:=67bd9df49fe34e8b82144f6dfb93b320f384a8ea59727e92ff8d18b5f4b579a8 PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=GPL-2.0-or-later PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:netfilter:libnetfilter_conntrack PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 diff --git a/package/libs/libnfnetlink/Makefile b/package/libs/libnfnetlink/Makefile index 57bb0cdb98..be1eba6517 100644 --- a/package/libs/libnfnetlink/Makefile +++ b/package/libs/libnfnetlink/Makefile @@ -18,6 +18,7 @@ PKG_SOURCE_URL:= \ PKG_HASH:=b064c7c3d426efb4786e60a8e6859b82ee2f2c5e49ffeea640cfe4fe33cbc376 PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=GPL-2.0+ +PKG_CPE_ID:=cpe:/a:netfilter:libnfnetlink PKG_FIXUP:=autoreconf diff --git a/package/libs/libnftnl/Makefile b/package/libs/libnftnl/Makefile index 8434234156..b512d4d58f 100644 --- a/package/libs/libnftnl/Makefile +++ b/package/libs/libnftnl/Makefile @@ -9,12 +9,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libnftnl PKG_CPE_ID:=cpe:/a:netfilter:libnftnl -PKG_VERSION:=1.2.1 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=1.2.6 +PKG_RELEASE:=1 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://netfilter.org/projects/$(PKG_NAME)/files -PKG_HASH:=7508a5c414fab13e3cb3ce8262d0ce4f02c1590a8e4f8628ab497b5b4585937c +PKG_HASH:=ceeaea2cd92147da19f13a35a7f1a4bc2767ff897e838e4b479cf54b59c777f4 PKG_MAINTAINER:=Steven Barth PKG_LICENSE:=GPL-2.0-or-later @@ -22,6 +22,7 @@ PKG_LICENSE_FILES:=COPYING PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 +PKG_BUILD_FLAGS:=lto include $(INCLUDE_DIR)/package.mk @@ -41,8 +42,7 @@ define Package/libnftnl/description programming interface (API) to the in-kernel nf_tables subsystem. endef -TARGET_CFLAGS += $(FPIC) -flto -TARGET_LDFLAGS += -flto +TARGET_CFLAGS += $(FPIC) CONFIGURE_ARGS += \ --enable-static \ diff --git a/package/libs/libnl-tiny/Makefile b/package/libs/libnl-tiny/Makefile index 47a6cf969a..4c7945195f 100644 --- a/package/libs/libnl-tiny/Makefile +++ b/package/libs/libnl-tiny/Makefile @@ -12,9 +12,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/libnl-tiny.git -PKG_SOURCE_DATE:=2021-11-21 -PKG_SOURCE_VERSION:=8e0555fb39f51a5d6436b4f1370850caa03611ea -PKG_MIRROR_HASH:=2cfbcc62384535674a2c0157cb24a0736520fcb66ed50be23bf9141c8488885f +PKG_SOURCE_DATE:=2023-07-27 +PKG_SOURCE_VERSION:=bc92a280186f9becc53c0f17e4e43cfbdeec7e7b +PKG_MIRROR_HASH:=57c5ac75fdb4413e98e525bee7de419fc6cce5f23389581dafd9ffe22321224d CMAKE_INSTALL:=1 PKG_LICENSE:=LGPL-2.1 @@ -37,13 +37,13 @@ endef define Build/InstallDev $(INSTALL_DIR) $(1)/usr/lib/pkgconfig $(1)/usr/include/libnl-tiny $(CP) $(PKG_INSTALL_DIR)/usr/include/libnl-tiny/* $(1)/usr/include/libnl-tiny - $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libnl-tiny.so $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnl-tiny.so* $(1)/usr/lib/ $(INSTALL_DATA) $(PKG_BUILD_DIR)/libnl-tiny.pc $(1)/usr/lib/pkgconfig endef define Package/libnl-tiny/install $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libnl-tiny.so $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnl-tiny.so.* $(1)/usr/lib/ endef $(eval $(call BuildPackage,libnl-tiny)) diff --git a/package/libs/libnl/Makefile b/package/libs/libnl/Makefile index db0c65c7a7..f8c7437668 100644 --- a/package/libs/libnl/Makefile +++ b/package/libs/libnl/Makefile @@ -1,24 +1,27 @@ +# SPDX-License-Identifier: GPL-2.0-only # # Copyright (C) 2006-2013 OpenWrt.org # -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# include $(TOPDIR)/rules.mk PKG_NAME:=libnl -PKG_VERSION:=3.5.0 +PKG_VERSION:=3.7.0 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/thom311/libnl/releases/download/libnl$(subst .,_,$(PKG_VERSION)) -PKG_HASH:=352133ec9545da76f77e70ccb48c9d7e5324d67f6474744647a7ed382b5e05fa +PKG_HASH:=9fe43ccbeeea72c653bdcf8c93332583135cda46a79507bfd0a483bb57f65939 + PKG_LICENSE:=LGPL-2.1 +PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:libnl_project:libnl PKG_INSTALL:=1 PKG_FIXUP:=autoreconf +PKG_BUILD_FLAGS:=gc-sections + include $(INCLUDE_DIR)/package.mk define Package/libnl/default @@ -52,10 +55,16 @@ $(call Package/libnl/default) DEPENDS:=+libnl-route endef +define Package/libnl-cli +$(call Package/libnl/default) + TITLE:=CLI Netlink Library + DEPENDS:=+libnl-genl +libnl-nf +endef + define Package/libnl $(call Package/libnl/default) TITLE:=Full Netlink Library - DEPENDS:=+libnl-genl +libnl-route +libnl-nf + DEPENDS:=+libnl-genl +libnl-route +libnl-nf +libnl-cli endef define Package/libnl-core/description @@ -74,12 +83,16 @@ define Package/libnl-nf/description Netfilter Netlink Library Functions endef +define Package/libnl-cli/description + CLI Netlink Library Functions +endef + define Package/libnl/description Socket handling, connection management, sending and receiving of data, message construction and parsing, object caching system, etc. endef -TARGET_CFLAGS += -ffunction-sections -fdata-sections $(FPIC) +TARGET_CFLAGS += $(FPIC) CONFIGURE_ARGS += \ --disable-debug @@ -95,6 +108,7 @@ define Build/InstallDev $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnl-genl-3.so $(1)/usr/lib/libnl-genl.so $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnl-nf-3.so $(1)/usr/lib/libnl-nf.so $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnl-route-3.so $(1)/usr/lib/libnl-route.so + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnl-cli-3.so $(1)/usr/lib/libnl-cli.so endef define Package/libnl-core/install @@ -117,6 +131,11 @@ define Package/libnl-nf/install $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnl-nf-3.so.* $(1)/usr/lib/ endef +define Package/libnl-cli/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnl-cli-3.so.* $(1)/usr/lib/ +endef + define Package/libnl/install : endef @@ -125,4 +144,5 @@ $(eval $(call BuildPackage,libnl-core)) $(eval $(call BuildPackage,libnl-genl)) $(eval $(call BuildPackage,libnl-route)) $(eval $(call BuildPackage,libnl-nf)) +$(eval $(call BuildPackage,libnl-cli)) $(eval $(call BuildPackage,libnl)) diff --git a/package/libs/libnl/patches/100-build-add-Libs.private-field-in-libnl-pkg-config-file.patch b/package/libs/libnl/patches/100-build-add-Libs.private-field-in-libnl-pkg-config-file.patch deleted file mode 100644 index cec720b8e8..0000000000 --- a/package/libs/libnl/patches/100-build-add-Libs.private-field-in-libnl-pkg-config-file.patch +++ /dev/null @@ -1,25 +0,0 @@ -From db0d59cd06f3ffd350379847c0885e1bfb85af0f Mon Sep 17 00:00:00 2001 -From: Thomas Petazzoni -Date: Sat, 7 Mar 2015 11:34:42 +0100 -Subject: [PATCH 2/2] build: add Libs.private field in libnl pkg-config file - -In order to support static linking, the libnl pkg-config file should -indicate in its Libs.private field the libraries that libnl-3.0.a -requires. The LIBS variable contains the appropriate list of -libraries: -lm in all cases, and -lpthread when pthread support is -enabled. This allows to statically link applications against libnl -properly. - -Signed-off-by: Thomas Petazzoni ---- - libnl-3.0.pc.in | 1 + - 1 file changed, 1 insertion(+) - ---- a/libnl-3.0.pc.in -+++ b/libnl-3.0.pc.in -@@ -7,4 +7,5 @@ Name: libnl - Description: Convenience library for netlink sockets - Version: @PACKAGE_VERSION@ - Libs: -L${libdir} -lnl-@MAJ_VERSION@ -+Libs.private: @LIBS@ - Cflags: -I${includedir}/libnl@MAJ_VERSION@ diff --git a/package/libs/libpam/Makefile b/package/libs/libpam/Makefile index 7bc16dfcae..93de0a7e6e 100644 --- a/package/libs/libpam/Makefile +++ b/package/libs/libpam/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libpam -PKG_VERSION:=1.5.1 +PKG_VERSION:=1.5.2 PKG_RELEASE:=1 PKG_SOURCE:=Linux-PAM-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://github.com/linux-pam/linux-pam/releases/download/v$(PKG_VERSION) -PKG_HASH:=201d40730b1135b1b3cdea09f2c28ac634d73181ccd0172ceddee3649c5792fc +PKG_HASH:=e4ec7131a91da44512574268f493c6d8ca105c87091691b8e9b56ca685d4f94d PKG_BUILD_DIR:=$(BUILD_DIR)/Linux-PAM-$(PKG_VERSION) PKG_MAINTAINER:=Nikos Mavrogiannopoulos @@ -76,6 +76,8 @@ define Package/libpam/install $(CP) $(PKG_INSTALL_DIR)/usr/lib/security/*.so* $(1)/usr/lib/security/ $(CP) $(PKG_INSTALL_DIR)/usr/lib/security/pam_filter/* $(1)/usr/lib/security/pam_filter/ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/* $(1)/usr/sbin/ + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/*.pc $(1)/usr/lib/pkgconfig/ endef $(eval $(call BuildPackage,libpam)) diff --git a/package/libs/libpcap/Makefile b/package/libs/libpcap/Makefile index d5d9436994..d7358e32d0 100644 --- a/package/libs/libpcap/Makefile +++ b/package/libs/libpcap/Makefile @@ -8,16 +8,17 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libpcap -PKG_VERSION:=1.10.1 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=1.10.4 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=http://www.tcpdump.org/release/ -PKG_HASH:=ed285f4accaf05344f90975757b3dbfe772ba41d1c401c2648b7fa45b711bdd4 +PKG_SOURCE_URL:=https://www.tcpdump.org/release/ +PKG_HASH:=ed19a0383fad72e3ad435fd239d7cd80d64916b87269550159d20e47160ebe5f PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=BSD-3-Clause PKG_LICENSE_FILES:=LICENSE +PKG_CPE_ID:=cpe:/a:tcpdump:libpcap PKG_ASLR_PIE_REGULAR:=1 diff --git a/package/libs/libpcap/patches/100-no-openssl.patch b/package/libs/libpcap/patches/100-no-openssl.patch index 56896ad8ba..434f1ce006 100644 --- a/package/libs/libpcap/patches/100-no-openssl.patch +++ b/package/libs/libpcap/patches/100-no-openssl.patch @@ -1,6 +1,6 @@ --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -1042,7 +1042,6 @@ endif() +@@ -1325,7 +1325,6 @@ endif() # # OpenSSL/libressl. # diff --git a/package/libs/libpcap/patches/102-skip-manpages.patch b/package/libs/libpcap/patches/102-skip-manpages.patch index 79a365643e..43d393ac5f 100644 --- a/package/libs/libpcap/patches/102-skip-manpages.patch +++ b/package/libs/libpcap/patches/102-skip-manpages.patch @@ -9,7 +9,7 @@ Subject: [PATCH] skip manpages --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -2732,57 +2732,6 @@ if(NOT MSVC) +@@ -3325,57 +3325,6 @@ if(NOT MSVC) if(MINGW) find_program(LINK_EXECUTABLE ln) endif(MINGW) diff --git a/package/libs/libpcap/patches/201-space_optimization.patch b/package/libs/libpcap/patches/201-space_optimization.patch deleted file mode 100644 index bf9374dd54..0000000000 --- a/package/libs/libpcap/patches/201-space_optimization.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- a/pcap-common.c -+++ b/pcap-common.c -@@ -1662,14 +1662,23 @@ swap_pseudo_headers(int linktype, struct - break; - - case DLT_USB_LINUX: -+#ifndef PCAP_SUPPORT_USB -+ return; -+#endif - swap_linux_usb_header(hdr, data, 0); - break; - - case DLT_USB_LINUX_MMAPPED: -+#ifndef PCAP_SUPPORT_USB -+ return; -+#endif - swap_linux_usb_header(hdr, data, 1); - break; - - case DLT_NFLOG: -+#ifndef PCAP_SUPPORT_NETFILTER -+ return; -+#endif - swap_nflog_header(hdr, data); - break; - } diff --git a/package/libs/libpcap/patches/300-Add-support-for-B.A.T.M.A.N.-Advanced.patch b/package/libs/libpcap/patches/300-Add-support-for-B.A.T.M.A.N.-Advanced.patch new file mode 100644 index 0000000000..b3ff25286d --- /dev/null +++ b/package/libs/libpcap/patches/300-Add-support-for-B.A.T.M.A.N.-Advanced.patch @@ -0,0 +1,642 @@ +From 3d8d268320d2381021a409ff8d03533698dd6242 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Linus=20L=C3=BCssing?= +Date: Mon, 23 Nov 2020 00:38:22 +0100 +Subject: [PATCH] Add support for B.A.T.M.A.N. Advanced +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This adds support for the layer 2 mesh routing protocol +B.A.T.M.A.N. Advanced. "batadv" can be used to filter on batman-adv +packets. It also allows later filters to look at frames inside the +tunnel when both "version" and "type" are specified. + +Documentation for the batman-adv protocol can be found at the following +locations: + +https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/networking/batman-adv.rst +https://www.open-mesh.org/ + +Signed-off-by: Linus Lüssing +--- + Makefile.in | 2 + + batadv_legacy_packet.h | 77 +++++++++++++++++++ + batadv_packet.h | 78 ++++++++++++++++++++ + ethertype.h | 3 + + gencode.c | 164 +++++++++++++++++++++++++++++++++++++++++ + gencode.h | 3 + + grammar.y.in | 32 +++++++- + nametoaddr.c | 59 +++++++++++++++ + pcap-filter.manmisc.in | 35 ++++++++- + pcap/namedb.h | 2 + + scanner.l | 1 + + 11 files changed, 453 insertions(+), 3 deletions(-) + create mode 100644 batadv_legacy_packet.h + create mode 100644 batadv_packet.h + +--- a/Makefile.in ++++ b/Makefile.in +@@ -133,6 +133,8 @@ PUBHDR = \ + HDR = $(PUBHDR) \ + arcnet.h \ + atmuni31.h \ ++ batadv_legacy_packet.h \ ++ batadv_packet.h \ + diag-control.h \ + ethertype.h \ + extract.h \ +--- /dev/null ++++ b/batadv_legacy_packet.h +@@ -0,0 +1,77 @@ ++/* SPDX-License-Identifier: BSD-3 */ ++/* Copyright (C) 2020 Linus Lüssing */ ++ ++#ifndef _BATADV_LEGACY_PACKET_H_ ++#define _BATADV_LEGACY_PACKET_H_ ++ ++enum batadv_legacy_packettype { ++ BATADV_LEGACY_IV_OGM = 0x01, ++ BATADV_LEGACY_ICMP = 0x02, ++ BATADV_LEGACY_UNICAST = 0x03, ++ BATADV_LEGACY_BCAST = 0x04, ++ BATADV_LEGACY_VIS = 0x05, ++ BATADV_LEGACY_UNICAST_FRAG = 0x06, ++ BATADV_LEGACY_TT_QUERY = 0x07, ++ BATADV_LEGACY_ROAM_ADV = 0x08, ++ BATADV_LEGACY_UNICAST_4ADDR = 0x09, ++ BATADV_LEGACY_CODED = 0x0a, ++}; ++ ++#define ETH_ALEN 6 ++ ++struct batadv_legacy_unicast_packet { ++ uint8_t packet_type; ++ uint8_t version; ++ uint8_t ttl; ++ uint8_t ttvn; ++ uint8_t dest[ETH_ALEN]; ++}; ++ ++struct batadv_legacy_unicast_4addr_packet { ++ uint8_t packet_type; ++ uint8_t version; ++ uint8_t ttl; ++ uint8_t src[ETH_ALEN]; ++ uint8_t subtype; ++ uint8_t reserved; ++}; ++ ++struct batadv_legacy_unicast_frag_packet { ++ uint8_t packet_type; ++ uint8_t version; ++ uint8_t ttl; ++ uint8_t ttvn; ++ uint8_t dest[ETH_ALEN]; ++ uint8_t flags; ++ uint8_t align; ++ uint8_t orig[ETH_ALEN]; ++ uint8_t seqno[2]; /* 2-byte integral value */ ++}; ++ ++struct batadv_legacy_bcast_packet { ++ uint8_t packet_type; ++ uint8_t version; ++ uint8_t ttl; ++ uint8_t reserved; ++ uint8_t seqno[4]; /* 4-byte integral value */ ++ uint8_t orig[ETH_ALEN]; ++}; ++ ++struct batadv_legacy_coded_packet { ++ uint8_t packet_type; ++ uint8_t version; ++ uint8_t ttl; ++ uint8_t first_ttvn; ++ uint8_t first_source[ETH_ALEN]; ++ uint8_t first_orig_dest[ETH_ALEN]; ++ uint8_t first_crc[4]; /* 4-byte integral value */ ++ uint8_t second_ttl; ++ uint8_t second_ttvn; ++ uint8_t second_dest[ETH_ALEN]; ++ uint8_t second_source[ETH_ALEN]; ++ uint8_t second_orig_dest[ETH_ALEN]; ++ uint8_t second_crc[4]; /* 4-byte integral value */ ++ uint8_t coded_len[2]; /* 2-byte integral value */ ++}; ++ ++#endif /* _BATADV_LEGACY_PACKET_H_ */ +--- /dev/null ++++ b/batadv_packet.h +@@ -0,0 +1,78 @@ ++/* SPDX-License-Identifier: BSD-3 */ ++/* Copyright (C) 2020 Linus Lüssing */ ++ ++#ifndef _BATADV_PACKET_H_ ++#define _BATADV_PACKET_H_ ++ ++/* For the definitive and most recent packet format definition, ++ * see the batadv_packet.h in the Linux kernel. ++ */ ++ ++enum batadv_packettype { ++ BATADV_IV_OGM = 0x00, ++ BATADV_BCAST = 0x01, ++ BATADV_CODED = 0x02, ++ BATADV_ELP = 0x03, ++ BATADV_OGM2 = 0x04, ++ BATADV_UNICAST = 0x40, ++ BATADV_UNICAST_FRAG = 0x41, ++ BATADV_UNICAST_4ADDR = 0x42, ++ BATADV_ICMP = 0x43, ++ BATADV_UNICAST_TVLV = 0x44, ++}; ++ ++#define ETH_ALEN 6 ++ ++struct batadv_unicast_packet { ++ uint8_t packet_type; ++ uint8_t version; ++ uint8_t ttl; ++ uint8_t ttvn; ++ uint8_t dest[ETH_ALEN]; ++}; ++ ++struct batadv_unicast_4addr_packet { ++ struct batadv_unicast_packet u; ++ uint8_t src[ETH_ALEN]; ++ uint8_t subtype; ++ uint8_t reserved; ++}; ++ ++struct batadv_frag_packet { ++ uint8_t packet_type; ++ uint8_t version; ++ uint8_t ttl; ++ uint8_t num_pri; /* number and priority */ ++ uint8_t dest[ETH_ALEN]; ++ uint8_t orig[ETH_ALEN]; ++ uint8_t seqno[2]; /* 2-byte integral value */ ++ uint8_t total_size[2]; /* 2-byte integral value */ ++}; ++ ++struct batadv_bcast_packet { ++ uint8_t packet_type; ++ uint8_t version; ++ uint8_t ttl; ++ uint8_t reserved; ++ uint8_t seqno[4]; /* 4-byte integral value */ ++ uint8_t orig[ETH_ALEN]; ++}; ++ ++struct batadv_coded_packet { ++ uint8_t packet_type; ++ uint8_t version; ++ uint8_t ttl; ++ uint8_t first_ttvn; ++ uint8_t first_source[ETH_ALEN]; ++ uint8_t first_orig_dest[ETH_ALEN]; ++ uint8_t first_crc[4]; /* 4-byte integral value */ ++ uint8_t second_ttl; ++ uint8_t second_ttvn; ++ uint8_t second_dest[ETH_ALEN]; ++ uint8_t second_source[ETH_ALEN]; ++ uint8_t second_orig_dest[ETH_ALEN]; ++ uint8_t second_crc[4]; /* 4-byte integral value */ ++ uint8_t coded_len[2]; /* 2-byte integral value */ ++}; ++ ++#endif /* _BATADV_PACKET_H_ */ +--- a/ethertype.h ++++ b/ethertype.h +@@ -49,6 +49,9 @@ + #ifndef ETHERTYPE_TRAIL + #define ETHERTYPE_TRAIL 0x1000 + #endif ++#ifndef ETHERTYPE_BATMAN ++#define ETHERTYPE_BATMAN 0x4305 /* B.A.T.M.A.N. Advanced */ ++#endif + #ifndef ETHERTYPE_MOPDL + #define ETHERTYPE_MOPDL 0x6001 + #endif +--- a/gencode.c ++++ b/gencode.c +@@ -60,6 +60,8 @@ + #include "sunatmpos.h" + #include "pflog.h" + #include "ppp.h" ++#include "batadv_packet.h" ++#include "batadv_legacy_packet.h" + #include "pcap/sll.h" + #include "pcap/ipnet.h" + #include "arcnet.h" +@@ -9436,6 +9438,168 @@ gen_geneve(compiler_state_t *cstate, bpf + return b1; + } + ++static struct block * ++gen_batadv_check_version(compiler_state_t *cstate, struct block *b0, bpf_u_int32 version) ++{ ++ struct block *b1; ++ ++ if (version > UINT8_MAX) ++ bpf_error(cstate, ++ "batman-adv compatibility version number %u unsupported", ++ version); ++ ++ b1 = gen_cmp(cstate, OR_LINKPL, 1, BPF_B, version); ++ gen_and(b0, b1); ++ ++ return b1; ++} ++ ++static struct block * ++gen_batadv_check_type(compiler_state_t *cstate, struct block *b0, ++ bpf_u_int32 version, bpf_u_int32 type) ++{ ++ struct block *b1; ++ ++ switch (version) { ++ case 14: ++ case 15: ++ if (type > UINT8_MAX) ++ bpf_error(cstate, ++ "batman-adv packet type %u unsupported for compatibility version %u", ++ type, version); ++ ++ b1 = gen_cmp(cstate, OR_LINKPL, 0, BPF_B, type); ++ gen_and(b0, b1); ++ b0 = b1; ++ ++ break; ++ default: ++ bpf_error(cstate, ++ "batman-adv compatibility version number %u unsupported", ++ version); ++ } ++ ++ return b0; ++} ++ ++ ++static void gen_batadv_push_offset(compiler_state_t *cstate, u_int offset) ++{ ++ PUSH_LINKHDR(cstate, DLT_EN10MB, cstate->off_linkpl.is_variable, ++ cstate->off_linkpl.constant_part + cstate->off_nl + offset, ++ cstate->off_linkpl.reg); ++ ++ cstate->off_linktype.constant_part += cstate->off_linkhdr.constant_part; ++ cstate->off_linkpl.constant_part += cstate->off_linkhdr.constant_part; ++ ++ cstate->off_nl = 0; ++ cstate->off_nl_nosnap = 0; /* no 802.2 LLC */ ++} ++ ++static void ++gen_batadv_offsets_v14(compiler_state_t *cstate, bpf_u_int32 type) ++{ ++ size_t offset; ++ ++ switch (type) { ++ case BATADV_LEGACY_UNICAST: /* 0x03 */ ++ offset = sizeof(struct batadv_legacy_unicast_packet); ++ break; ++ case BATADV_LEGACY_BCAST: /* 0x04 */ ++ offset = sizeof(struct batadv_legacy_bcast_packet); ++ break; ++ case BATADV_LEGACY_UNICAST_FRAG: /* 0x06 */ ++ offset = sizeof(struct batadv_legacy_unicast_frag_packet); ++ break; ++ case BATADV_LEGACY_UNICAST_4ADDR: /* 0x09 */ ++ offset = sizeof(struct batadv_legacy_unicast_4addr_packet); ++ break; ++ case BATADV_LEGACY_CODED: /* 0x0a */ ++ offset = sizeof(struct batadv_legacy_coded_packet); ++ break; ++ default: ++ offset = 0; ++ } ++ ++ if (offset) ++ gen_batadv_push_offset(cstate, (u_int)offset); ++} ++ ++static void ++gen_batadv_offsets_v15(compiler_state_t *cstate, bpf_u_int32 type) ++{ ++ size_t offset; ++ ++ switch (type) { ++ case BATADV_BCAST: /* 0x01 */ ++ offset = sizeof(struct batadv_bcast_packet); ++ break; ++ case BATADV_CODED: /* 0x02 */ ++ offset = sizeof(struct batadv_coded_packet); ++ break; ++ case BATADV_UNICAST: /* 0x40 */ ++ offset = sizeof(struct batadv_unicast_packet); ++ break; ++ case BATADV_UNICAST_FRAG: /* 0x41 */ ++ offset = sizeof(struct batadv_frag_packet); ++ break; ++ case BATADV_UNICAST_4ADDR: /* 0x42 */ ++ offset = sizeof(struct batadv_unicast_4addr_packet); ++ break; ++ case BATADV_UNICAST_TVLV: ++ /* unsupported for now, needs variable offset to ++ * take tvlv_len into account ++ */ ++ /* fall through */ ++ default: ++ offset = 0; ++ } ++ ++ if (offset) ++ gen_batadv_push_offset(cstate, (u_int)offset); ++} ++ ++static void ++gen_batadv_offsets(compiler_state_t *cstate, bpf_u_int32 version, bpf_u_int32 type) ++{ ++ switch (version) { ++ case 14: ++ gen_batadv_offsets_v14(cstate, type); ++ break; ++ case 15: ++ gen_batadv_offsets_v15(cstate, type); ++ break; ++ default: ++ break; ++ } ++} ++ ++struct block * ++gen_batadv(compiler_state_t *cstate, bpf_u_int32 version, int has_version, ++ bpf_u_int32 type, int has_type) ++{ ++ struct block *b0; ++ ++ /* ++ * Catch errors reported by us and routines below us, and return NULL ++ * on an error. ++ */ ++ if (setjmp(cstate->top_ctx)) ++ return (NULL); ++ ++ b0 = gen_linktype(cstate, ETHERTYPE_BATMAN); ++ ++ if (has_version) ++ b0 = gen_batadv_check_version(cstate, b0, version); ++ ++ if (has_type) { ++ b0 = gen_batadv_check_type(cstate, b0, version, type); ++ gen_batadv_offsets(cstate, version, type); ++ } ++ ++ return b0; ++} ++ + /* Check that the encapsulated frame has a link layer header + * for Ethernet filters. */ + static struct block * +--- a/gencode.h ++++ b/gencode.h +@@ -358,6 +358,9 @@ struct block *gen_pppoes(compiler_state_ + + struct block *gen_geneve(compiler_state_t *, bpf_u_int32, int); + ++struct block *gen_batadv(compiler_state_t *, bpf_u_int32, int, ++ bpf_u_int32, int); ++ + struct block *gen_atmfield_code(compiler_state_t *, int, bpf_u_int32, + int, int); + struct block *gen_atmtype_abbrev(compiler_state_t *, int); +--- a/grammar.y.in ++++ b/grammar.y.in +@@ -375,6 +375,7 @@ DIAG_OFF_BISON_BYACC + %type mtp2type + %type mtp3field + %type mtp3fieldvalue mtp3value mtp3listvalue ++%type pbatadv + + + %token DST SRC HOST GATEWAY +@@ -393,7 +394,7 @@ DIAG_OFF_BISON_BYACC + %token LEN + %token IPV6 ICMPV6 AH ESP + %token VLAN MPLS +-%token PPPOED PPPOES GENEVE ++%token PPPOED PPPOES GENEVE BATADV + %token ISO ESIS CLNP ISIS L1 L2 IIH LSP SNP CSNP PSNP + %token STP + %token IPX +@@ -620,11 +621,40 @@ other: pqual TK_BROADCAST { CHECK_PTR_ + | PPPOES { CHECK_PTR_VAL(($$ = gen_pppoes(cstate, 0, 0))); } + | GENEVE pnum { CHECK_PTR_VAL(($$ = gen_geneve(cstate, $2, 1))); } + | GENEVE { CHECK_PTR_VAL(($$ = gen_geneve(cstate, 0, 0))); } ++ | BATADV pbatadv { $$ = $2; } + | pfvar { $$ = $1; } + | pqual p80211 { $$ = $2; } + | pllc { $$ = $1; } + ; + ++pbatadv: { CHECK_PTR_VAL(($$ = gen_batadv(cstate, 0, 0, 0, 0))); } ++ | pnum { CHECK_PTR_VAL(($$ = gen_batadv(cstate, $1, 1, 0, 0))); } ++ | pnum pnum { CHECK_PTR_VAL(($$ = gen_batadv(cstate, $1, 1, $2, 1))); } ++ | pnum ID ++ { ++ int type; ++ ++ switch ($1) { ++ case 14: ++ type = pcap_nametobatadvtype_v14($2); ++ break; ++ case 15: ++ type = pcap_nametobatadvtype_v15($2); ++ break; ++ default: ++ bpf_set_error(cstate, "batman-adv compatibility version number %u unsupported", $1); ++ YYABORT; ++ } ++ ++ if (type == PROTO_UNDEF) { ++ bpf_set_error(cstate, "invalid batman-adv packet type value \"%s\"", $2); ++ YYABORT; ++ } ++ ++ CHECK_PTR_VAL(($$ = gen_batadv(cstate, $1, 1, type, 1))); ++ } ++ ; ++ + pfvar: PF_IFNAME ID { CHECK_PTR_VAL($2); CHECK_PTR_VAL(($$ = gen_pf_ifname(cstate, $2))); } + | PF_RSET ID { CHECK_PTR_VAL($2); CHECK_PTR_VAL(($$ = gen_pf_ruleset(cstate, $2))); } + | PF_RNR NUM { CHECK_PTR_VAL(($$ = gen_pf_rnr(cstate, $2))); } +--- a/nametoaddr.c ++++ b/nametoaddr.c +@@ -136,8 +136,12 @@ + + #include "diag-control.h" + ++#include "batadv_packet.h" ++#include "batadv_legacy_packet.h" ++ + #include "gencode.h" + #include ++ + #include "nametoaddr.h" + + #ifdef HAVE_OS_PROTO_H +@@ -604,6 +608,7 @@ PCAP_API_DEF struct eproto eproto_db[] = + { "moprc", ETHERTYPE_MOPRC }, + { "rarp", ETHERTYPE_REVARP }, + { "sca", ETHERTYPE_SCA }, ++ { "batadv", ETHERTYPE_BATMAN }, + { (char *)0, 0 } + }; + +@@ -638,6 +643,60 @@ pcap_nametollc(const char *s) + + while (p->s != 0) { + if (strcmp(p->s, s) == 0) ++ return p->p; ++ p += 1; ++ } ++ return PROTO_UNDEF; ++} ++ ++/* Static data base of batman-adv v14 packet type values. */ ++static struct eproto batadv_type_db_v14[] = { ++ { "iv_ogm", BATADV_LEGACY_IV_OGM }, ++ { "icmp", BATADV_LEGACY_ICMP }, ++ { "unicast", BATADV_LEGACY_UNICAST }, ++ { "bcast", BATADV_LEGACY_BCAST }, ++ { "vis", BATADV_LEGACY_VIS }, ++ { "unicast_frag", BATADV_LEGACY_UNICAST_FRAG }, ++ { "tt_query", BATADV_LEGACY_TT_QUERY }, ++ { "roam_adv", BATADV_LEGACY_ROAM_ADV }, ++ { "unicast_4addr", BATADV_LEGACY_UNICAST_4ADDR }, ++ { "coded", BATADV_LEGACY_CODED }, ++ { (char *)0, 0 } ++}; ++ ++int pcap_nametobatadvtype_v14(const char *s) ++{ ++ struct eproto *p = batadv_type_db_v14; ++ ++ while (p->s != 0) { ++ if (strcmp(p->s, s) == 0) ++ return p->p; ++ p += 1; ++ } ++ return PROTO_UNDEF; ++} ++ ++/* Static data base of batman-adv v15 packet type values. */ ++static struct eproto batadv_type_db_v15[] = { ++ { "iv_ogm", BATADV_IV_OGM }, ++ { "bcast", BATADV_BCAST }, ++ { "coded", BATADV_CODED }, ++ { "elp", BATADV_ELP }, ++ { "ogm2", BATADV_OGM2 }, ++ { "unicast", BATADV_UNICAST }, ++ { "unicast_frag", BATADV_UNICAST_FRAG }, ++ { "unicast_4addr", BATADV_UNICAST_4ADDR }, ++ { "icmp", BATADV_ICMP }, ++ { "unicast_tvlv", BATADV_UNICAST_TVLV }, ++ { (char *)0, 0 } ++}; ++ ++int pcap_nametobatadvtype_v15(const char *s) ++{ ++ struct eproto *p = batadv_type_db_v15; ++ ++ while (p->s != 0) { ++ if (strcmp(p->s, s) == 0) + return p->p; + p += 1; + } +--- a/pcap-filter.manmisc.in ++++ b/pcap-filter.manmisc.in +@@ -98,6 +98,7 @@ protocols are: + .BR arp , + .BR rarp , + .BR decnet , ++.BR batadv , + .BR sctp , + .B tcp + and +@@ -400,7 +401,7 @@ True if the packet is an IPv6 multicast + .IP "\fBether proto \fIprotocol\fR" + True if the packet is of ether type \fIprotocol\fR. + \fIProtocol\fP can be a number or one of the names +-\fBaarp\fP, \fBarp\fP, \fBatalk\fP, \fBdecnet\fP, \fBip\fP, \fBip6\fP, ++\fBaarp\fP, \fBarp\fP, \fBatalk\fP, \fBbatadv\fP, \fBdecnet\fP, \fBip\fP, \fBip6\fP, + \fBipx\fP, \fBiso\fP, \fBlat\fP, \fBloopback\fP, \fBmopdl\fP, \fBmoprc\fP, \fBnetbeui\fP, + \fBrarp\fP, \fBsca\fP or \fBstp\fP. + Note these identifiers (except \fBloopback\fP) are also keywords +@@ -454,7 +455,7 @@ the filter checks for the IPX etype in a + DSAP in the LLC header, the 802.3-with-no-LLC-header encapsulation of + IPX, and the IPX etype in a SNAP frame. + .RE +-.IP "\fBip\fR, \fBip6\fR, \fBarp\fR, \fBrarp\fR, \fBatalk\fR, \fBaarp\fR, \fBdecnet\fR, \fBiso\fR, \fBstp\fR, \fBipx\fR, \fBnetbeui\fP" ++.IP "\fBip\fR, \fBip6\fR, \fBarp\fR, \fBrarp\fR, \fBatalk\fR, \fBaarp\fR, \fBdecnet\fR, \fBiso\fR, \fBstp\fR, \fBipx\fR, \fBnetbeui\fP, \fBbatadv\fP" + Abbreviations for: + .in +.5i + .nf +@@ -792,6 +793,36 @@ For example: + filters IPv4 protocol encapsulated in Geneve with VNI 0xb. This will + match both IPv4 directly encapsulated in Geneve as well as IPv4 contained + inside an Ethernet frame. ++.IP "\fBbatadv \fI[version] \fI[type]\fR" ++True if the packet is a B.A.T.M.A.N. Advanced packet (Ethernet type 0x4305). ++If the optional \fIversion\fR is specified, only true if the packet has the ++specified batman-adv compatibility \fIversion\fR. If the optional \fIversion\fR ++and \fItype\fR are specified, only true if the packet has both the specified ++batman-adv compatibility \fIversion\fR and batman-adv packet \fItype\fR. ++.IP ++\fIversion\fR may be a number from 0 to 255, though only compatibility version ++14 and 15 were actually deployed in the wild. Version 15 is the current version, ++14 is considered deprecated. ++.IP ++\fItype\fR is currently only defined for compatibility \fIversion\fR 14 and 15. ++\fItype\fR may be a number from 0 to 255 for compatibility \fIversion\fR 14 and 15. ++.IP ++The following packet \fItype\fR aliases are available for compat \fIversion\fR 14: ++\fBiv_ogm\fP, \fBicmp\fP, \fBunicast\fP, \fBbcast\fP, \fBvis\fP, \fBunicast-frag\fP, ++\fBtt_query\fP, \fBroam_adv\fP, \fBunicast_4addr\fP, \fPcoded\fP. ++.IP ++The following packet \fItype\fR aliases are available for compat \fIversion\fR 15: ++\fBiv_ogm\fP, \fBbcast\fP, \fBcoded\fP, \fBelp\fP, \fBogm2\fP, \fBunicast\fP, ++\fBunicast_frag\fP, \fBunicast_4addr\fP, \fBicmp\fP, \fPunicast_tvlv\fP. ++.IP ++Note that when the \fBbatadv\fR keyword is encountered in an expression and ++a batman-adv packet \fItype\fR is provided which specifies an encapsulating ++packet type then it changes the decoding offsets for the remainder of the ++expression on the assumption that the packet is a batman-adv packet. For compat ++\fIversion\fR 14 these are packet \fItype\fRs \fBunicast\fP, \fBbcast\fP, ++\fBunicast_frag\fP, \fBunicast_4addr\fP and \fBcoded\fP. For compat \fIversion\fR ++15 these are currently packet \fItype\fRs \fBbcast\fP, \fBcoded\fP, \fBunicast\fP, ++\fBunicast_frag\fP and \fBunicast_4addr\fP. + .IP "\fBiso proto \fIprotocol\fR" + True if the packet is an OSI packet of protocol type \fIprotocol\fP. + \fIProtocol\fP can be a number or one of the names +--- a/pcap/namedb.h ++++ b/pcap/namedb.h +@@ -70,6 +70,8 @@ PCAP_API int pcap_nametoportrange(const + PCAP_API int pcap_nametoproto(const char *); + PCAP_API int pcap_nametoeproto(const char *); + PCAP_API int pcap_nametollc(const char *); ++PCAP_API int pcap_nametobatadvtype_v14(const char *); ++PCAP_API int pcap_nametobatadvtype_v15(const char *); + /* + * If a protocol is unknown, PROTO_UNDEF is returned. + * Also, pcap_nametoport() returns the protocol along with the port number. +--- a/scanner.l ++++ b/scanner.l +@@ -347,6 +347,7 @@ mpls return MPLS; + pppoed return PPPOED; + pppoes return PPPOES; + geneve return GENEVE; ++batadv return BATADV; + + lane return LANE; + llc return LLC; diff --git a/package/libs/libqmi/Makefile b/package/libs/libqmi/Makefile index c36847f08d..21a7af1fc7 100644 --- a/package/libs/libqmi/Makefile +++ b/package/libs/libqmi/Makefile @@ -8,23 +8,22 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libqmi -PKG_SOURCE_VERSION:=1.30.8 -PKG_RELEASE:=$(AUTORELEASE) +PKG_SOURCE_VERSION:=1.32.4 +PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://gitlab.freedesktop.org/mobile-broadband/libqmi.git -PKG_MIRROR_HASH:=a0fa33a89011bdb593f66fd0b674f2a7c31f87e43ffd7f3e9a515b00864c4a91 +PKG_MIRROR_HASH:=674f5848c56c11cdc2fbc82c52e5bc2a3a0fddb56315dc4220544688a7b0e17a -PKG_MAINTAINER:=Nicholas Smith +PKG_BUILD_FLAGS:=gc-sections -PKG_INSTALL:=1 +PKG_MAINTAINER:=Nicholas Smith include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/nls.mk include $(INCLUDE_DIR)/meson.mk -TARGET_CFLAGS += -ffunction-sections -fdata-sections -fno-merge-all-constants -fmerge-constants -TARGET_LDFLAGS += -Wl,--gc-sections +TARGET_CFLAGS += -fno-merge-all-constants -fmerge-constants define Package/libqmi/config source "$(SOURCE)/Config.in" diff --git a/package/libs/libqrtr-glib/Makefile b/package/libs/libqrtr-glib/Makefile index a1634a4e1b..1796627a89 100644 --- a/package/libs/libqrtr-glib/Makefile +++ b/package/libs/libqrtr-glib/Makefile @@ -9,22 +9,23 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libqrtr-glib PKG_VERSION:=1.2.2 -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=3 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://gitlab.freedesktop.org/mobile-broadband/libqrtr-glib.git PKG_SOURCE_VERSION:=$(PKG_VERSION) PKG_MIRROR_HASH:=ffb918edf96581d4ba310bd1e975297e9a7006a7e26f37934afde462585125f2 -PKG_MAINTAINER:=Nicholas Smith +PKG_BUILD_FLAGS:=gc-sections -PKG_INSTALL:=1 -PKG_BUILD_PARALLEL:=1 +PKG_MAINTAINER:=Nicholas Smith include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/nls.mk include $(INCLUDE_DIR)/meson.mk +TARGET_CFLAGS += -fno-merge-all-constants -fmerge-constants + define Package/libqrtr-glib SECTION:=libs CATEGORY:=Libraries @@ -41,7 +42,8 @@ endef MESON_ARGS += \ -Dintrospection=false \ - -Dgtk_doc=false + -Dgtk_doc=false \ + -Db_lto=true define Build/InstallDev $(INSTALL_DIR) $(1)/usr/include diff --git a/package/libs/libselinux/Makefile b/package/libs/libselinux/Makefile new file mode 100644 index 0000000000..f90d4993c8 --- /dev/null +++ b/package/libs/libselinux/Makefile @@ -0,0 +1,161 @@ +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libselinux +PKG_VERSION:=3.5 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/SELinuxProject/selinux/releases/download/$(PKG_VERSION) +PKG_HASH:=9a3a3705ac13a2ccca2de6d652b6356fead10f36fb33115c185c5ccdf29eec19 + +PKG_LICENSE:=libselinux-1.0 +PKG_LICENSE_FILES:=LICENSE +PKG_MAINTAINER:=Thomas Petazzoni +PKG_CPE_ID:=cpe:/a:selinuxproject:libselinux + +PKG_BUILD_FLAGS:=no-lto + +HOST_BUILD_DEPENDS:=libsepol/host musl-fts/host pcre2/host + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/host-build.mk + +LIBSELINUX_UTILS := \ + avcstat \ + compute_av \ + compute_create \ + compute_member \ + compute_relabel \ + getconlist \ + getdefaultcon \ + getenforce \ + getfilecon \ + getpidcon \ + getsebool \ + getseuser \ + matchpathcon \ + policyvers \ + sefcontext_compile \ + selabel_digest \ + selabel_get_digests_all_partial_matches \ + selabel_lookup \ + selabel_lookup_best_match \ + selabel_partial_match \ + selinux_check_access \ + selinux_check_securetty_context \ + selinuxenabled \ + selinuxexeccon \ + setenforce \ + setfilecon \ + togglesebool \ + validatetrans + +LIBSELINUX_ALTS := \ + getenforce \ + getsebool \ + matchpathcon \ + selinuxenabled \ + setenforce + +$(eval $(foreach a,$(LIBSELINUX_ALTS),ALTS_$(a):=300:/usr/sbin/$(a):/usr/sbin/libselinux-$(a)$(newline))) + +define Package/libselinux/Default + TITLE:=Runtime SELinux library + URL:=http://selinuxproject.org/page/Main_Page +endef + +define Package/libselinux + $(call Package/libselinux/Default) + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+libsepol +libpcre2 +USE_MUSL:musl-fts +endef + +define Package/libselinux/description + libselinux is the runtime SELinux library that provides + interfaces (e.g. library functions for the SELinux kernel + APIs like getcon(), other support functions like + getseuserbyname()) to SELinux-aware applications. libselinux + may use the shared libsepol to manipulate the binary policy + if necessary (e.g. to downgrade the policy format to an + older version supported by the kernel) when loading policy. +endef + +define GenUtilPkg + define Package/$(1) + $(call Package/libselinux/Default) + TITLE+= $(2) utility + SECTION:=utils + DEPENDS:=+libselinux + CATEGORY:=Utilities + SUBMENU:=libselinux tools + ALTERNATIVES:=$(ALTS_$(2)) + endef + + define Package/$(1)/description + libselinux version of the $(2) utility. + endef +endef + +$(foreach a,$(LIBSELINUX_UTILS),$(eval $(call GenUtilPkg,libselinux-$(a),$(a)))) + +# Needed to link libselinux utilities, which link against +# libselinux.so, which indirectly depends on libpcre2.so, installed in +# $(STAGING_DIR_HOSTPKG). +HOST_LDFLAGS += -Wl,-rpath="$(STAGING_DIR_HOSTPKG)/lib" + +HOST_MAKE_FLAGS += \ + PREFIX=$(STAGING_DIR_HOSTPKG) \ + SHLIBDIR=$(STAGING_DIR_HOSTPKG)/lib \ + FTS_LDLIBS=-lfts + +ifeq ($(CONFIG_USE_MUSL),y) +MAKE_FLAGS += FTS_LDLIBS=-lfts +TARGET_CFLAGS += -D_LARGEFILE64_SOURCE +endif + +MAKE_FLAGS += \ + SHLIBDIR=/usr/lib \ + OS=Linux + +define Build/Compile + $(call Build/Compile/Default,all) +endef + +define Build/Install + $(call Build/Install/Default,install) +endef + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/ + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/ + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libselinux.pc $(1)/usr/lib/pkgconfig/ + $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/libselinux.pc + $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/libselinux.pc +endef + +define Package/libselinux/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libselinux.so.* $(1)/usr/lib/ +endef + +define BuildUtil + define Package/$(1)/install + $(INSTALL_DIR) $$(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/$(2) $$(1)/usr/sbin/$(if $(ALTS_$(2)),libselinux-$(2),$(2)) + endef + + $$(eval $$(call BuildPackage,$(1))) +endef + +$(eval $(call HostBuild)) +$(eval $(call BuildPackage,libselinux)) +$(foreach a,$(LIBSELINUX_UTILS),$(eval $(call BuildUtil,libselinux-$(a),$(a)))) diff --git a/package/libs/libsemanage/Makefile b/package/libs/libsemanage/Makefile new file mode 100644 index 0000000000..37e433b34c --- /dev/null +++ b/package/libs/libsemanage/Makefile @@ -0,0 +1,73 @@ +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libsemanage +PKG_VERSION:=3.5 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/SELinuxProject/selinux/releases/download/$(PKG_VERSION) +PKG_HASH:=f53534e50247538280ed0d76c6ce81d8fb3939bd64cadb89da10dba42e40dd9c +PKG_MAINTAINER:=Thomas Petazzoni +PKG_LICENSE:=LGPL-2.1 +PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:selinuxproject:libsemanage + + +HOST_BUILD_DEPENDS:=libaudit/host libselinux/host bzip2/host + + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/host-build.mk + +PKG_INSTALL:=1 + +define Package/libsemanage + SECTION:=libs + DEPENDS:=+libaudit +libselinux +libbz2 + CATEGORY:=Libraries + TITLE:=SELinux policy management library + URL:=http://selinuxproject.org/page/Main_Page +endef + +define Package/libsemanage/description + libsemanage is the policy management library. It uses + libsepol for binary policy manipulation and libselinux for + interacting with the SELinux system. It also exec's helper + programs for loading policy and for checking whether the + file_contexts configuration is valid (load_policy and + setfiles from policycoreutils) presently, although this may + change at least for the bootstrapping case (for rpm). +endef #' + + +HOST_MAKE_FLAGS += \ + DESTDIR=$(STAGING_DIR_HOSTPKG) \ + PREFIX="" + + +define Build/Configure +endef + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/ + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libsemanage.pc $(1)/usr/lib/pkgconfig/ + $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/libsemanage.pc + $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/libsemanage.pc + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/ +endef + +define Package/libsemanage/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsemanage.so.* $(1)/usr/lib/ +endef + +$(eval $(call HostBuild)) +$(eval $(call BuildPackage,libsemanage)) diff --git a/package/libs/libsepol/Makefile b/package/libs/libsepol/Makefile index 87f1ccd917..b1a34d293e 100644 --- a/package/libs/libsepol/Makefile +++ b/package/libs/libsepol/Makefile @@ -6,14 +6,17 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libsepol -PKG_VERSION:=3.3 +PKG_VERSION:=3.5 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/SELinuxProject/selinux/releases/download/$(PKG_VERSION) -PKG_HASH:=2d97df3eb8466169b389c3660acbb90c54200ac96e452eca9f41a9639f4f238b +PKG_HASH:=78fdaf69924db780bac78546e43d9c44074bad798c2c415d0b9bb96d065ee8a2 PKG_MAINTAINER:=Thomas Petazzoni +PKG_CPE_ID:=cpe:/a:selinuxproject:libsepol + +PKG_BUILD_FLAGS:=no-lto include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/host-build.mk diff --git a/package/libs/libssh2/Makefile b/package/libs/libssh2/Makefile new file mode 100644 index 0000000000..f5aa499539 --- /dev/null +++ b/package/libs/libssh2/Makefile @@ -0,0 +1,74 @@ +# +# Copyright (C) 2015-2018 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libssh2 +PKG_VERSION:=1.10.0 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://www.libssh2.org/download +PKG_HASH:=2d64e90f3ded394b91d3a2e774ca203a4179f69aebee03003e5a6fa621e41d51 + +PKG_MAINTAINER:=Jiri Slachta +PKG_LICENSE:=BSD-3-Clause +PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:libssh2:libssh2 + +CMAKE_INSTALL:=1 + +PKG_CONFIG_DEPENDS:= \ + CONFIG_LIBSSH2_MBEDTLS \ + CONFIG_LIBSSH2_OPENSSL + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/libssh2 + SECTION:=libs + CATEGORY:=Libraries + TITLE:=SSH2 library + URL:=https://www.libssh2.org/ + DEPENDS:=+LIBSSH2_MBEDTLS:libmbedtls +!LIBSSH2_MBEDTLS:libopenssl +zlib + ABI_VERSION:=1 +endef + +define Package/libssh2/description + libssh2 is a client-side C library implementing the SSH2 protocol. +endef + +define Package/libssh2/config +if PACKAGE_libssh2 + +choice + prompt "Choose crypto backend" + default LIBSSH2_OPENSSL + + config LIBSSH2_OPENSSL + bool "openssl" + + config LIBSSH2_MBEDTLS + bool "mbedtls" +endchoice + +endif +endef + +CMAKE_OPTIONS += \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_TESTING=OFF \ + -DENABLE_ZLIB_COMPRESSION=ON \ + -DCLEAR_MEMORY=ON \ + -DCRYPTO_BACKEND=$(if $(CONFIG_LIBSSH2_MBEDTLS),mbedTLS,OpenSSL) + +define Package/libssh2/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libssh2.so.$(ABI_VERSION)* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libssh2)) diff --git a/package/libs/libtool/Makefile b/package/libs/libtool/Makefile index 4b54ac495d..f897f98c16 100644 --- a/package/libs/libtool/Makefile +++ b/package/libs/libtool/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libtool -PKG_VERSION:=2.4.6 -PKG_RELEASE:=2 +PKG_VERSION:=2.4.7 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/libtool -PKG_HASH:=7c87a8c2c8c0fc9cd5019e402bed4292462d00a718a7cd5f11218153bf28b26f +PKG_HASH:=4f7f217f057ce655ff22559ad221a0fd8ef84ad1fc5fcb6990cecc333aa1635d PKG_LICENSE:=GPL-2.0+ PKG_LICENSE_FILES:=COPYING diff --git a/package/libs/libtraceevent/Makefile b/package/libs/libtraceevent/Makefile new file mode 100644 index 0000000000..5d8740faab --- /dev/null +++ b/package/libs/libtraceevent/Makefile @@ -0,0 +1,74 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=libtraceevent +PKG_VERSION:=1.7.2 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/snapshot/ +PKG_HASH:=a8b4bf8f05c06d1d6405f6d0038467a87e7ab218f0d8b0608d08bca5d1fc112a + +PKG_MAINTAINER:=Nick Hainke + +PKG_FIXUP:=autoreconf +PKG_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/libtraceevent + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Linux kernel trace event library + URL:=https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git + ABI_VERSION:=0 +endef + +define Package/libtraceevent/description +The libtraceevent library provides APIs to access kernel tracepoint events, located in +the tracefs file system under the events directory. +endef + +define Package/libtraceevent-extra + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Extra plugins for libtraceevent + DEPENDS:= +endef + +CONFIGURE_ARGS+= \ + --enable-shared \ + --enable-static + +PLUGINS_DIR := $(PKG_BUILD_DIR)/plugins +PLUGINS_MAIN := function hrtimer mac80211 sched_switch + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_BUILD_DIR)/include/traceevent $(1)/usr/include/ + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_BUILD_DIR)/lib/libtraceevent.{a,so*} $(1)/usr/lib/ + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) $(PKG_BUILD_DIR)/libtraceevent.pc $(1)/usr/lib/pkgconfig/ +endef + +define Package/libtraceevent/install + $(INSTALL_DIR) $(1)/usr/lib/traceevent/plugins + $(CP) $(PKG_BUILD_DIR)/lib/libtraceevent.so.* $(1)/usr/lib/ + $(INSTALL_DIR) $(1)/usr/lib + $(CP) \ + $(patsubst %,$(PLUGINS_DIR)/plugin_%.so,$(PLUGINS_MAIN)) \ + $(1)/usr/lib/traceevent/plugins +endef + +define Package/libtraceevent-extra/install + $(INSTALL_DIR) $(1)/usr/lib/traceevent/plugins + $(CP) \ + $$(patsubst %,$(PLUGINS_DIR)/plugin_%.so, \ + $$(filter-out $(PLUGINS_MAIN), \ + $$(patsubst $(PLUGINS_DIR)/plugin_%.so,%, \ + $$(wildcard $(PLUGINS_DIR)/plugin_*.so)))) \ + $(1)/usr/lib/traceevent/plugins +endef + +$(eval $(call BuildPackage,libtraceevent)) +$(eval $(call BuildPackage,libtraceevent-extra)) diff --git a/package/libs/libtracefs/Makefile b/package/libs/libtracefs/Makefile new file mode 100644 index 0000000000..b97922f460 --- /dev/null +++ b/package/libs/libtracefs/Makefile @@ -0,0 +1,49 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=libtracefs +PKG_VERSION:=1.6.4 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/snapshot/ +PKG_HASH:=52ce793dbb35a3e59bddce31de09a5d92cedd4d0702e64d0916f1ccdb00526c9 + +PKG_MAINTAINER:=Nick Hainke + +PKG_FIXUP:=autoreconf +PKG_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/libtracefs + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Linux kernel trace file system library + URL:=https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git + DEPENDS+=+libpthread +libtraceevent + ABI_VERSION:=0 +endef + +define Package/libtracefs/description +The libtracefs library provides APIs to access kernel trace file system. +endef + +CONFIGURE_ARGS+= \ + --enable-shared \ + --enable-static \ + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_BUILD_DIR)/include/* $(1)/usr/include/ + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_BUILD_DIR)/lib/libtracefs.{a,so*} $(1)/usr/lib/ + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) $(PKG_BUILD_DIR)/libtracefs.pc $(1)/usr/lib/pkgconfig/ +endef + +define Package/libtracefs/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_BUILD_DIR)/lib/libtracefs.so.* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libtracefs)) diff --git a/package/libs/libubox/Makefile b/package/libs/libubox/Makefile index f5310c6b6c..6a89956b60 100644 --- a/package/libs/libubox/Makefile +++ b/package/libs/libubox/Makefile @@ -5,9 +5,9 @@ PKG_RELEASE=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/libubox.git -PKG_MIRROR_HASH:=cf48d00ed0ea74d53f2043eb9f9dc52834c0b214f258201cf22dfff7dd6c6e40 -PKG_SOURCE_DATE:=2022-05-15 -PKG_SOURCE_VERSION:=d2223ef9da7172a84d1508733dc58840e1381e3c +PKG_MIRROR_HASH:=f22de22a784a0135cc2869fe81ff30e52136dca36863ee713503b4be5be01869 +PKG_SOURCE_DATE:=2023-05-23 +PKG_SOURCE_VERSION:=75a3b870cace1171faf57bd55e5a9a2f1564f757 PKG_ABI_VERSION:=$(call abi_version_str,$(PKG_SOURCE_DATE)) CMAKE_INSTALL:=1 diff --git a/package/libs/libunistring/Makefile b/package/libs/libunistring/Makefile new file mode 100644 index 0000000000..9b41cc3ce3 --- /dev/null +++ b/package/libs/libunistring/Makefile @@ -0,0 +1,64 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=libunistring +PKG_VERSION:=1.1 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=@GNU/$(PKG_NAME) +PKG_HASH:=827c1eb9cb6e7c738b171745dac0888aa58c5924df2e59239318383de0729b98 + +PKG_BUILD_PARALLEL:=1 +PKG_INSTALL:=1 + +PKG_LICENSE:=GPL-3.0 +PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:gnu:$(PKG_NAME) + +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/package.mk + +define Package/libunistring + SECTION:=libs + CATEGORY:=Libraries + TITLE:=libunistring + URL:=https://www.gnu.org/software/libunistring +endef + +define Package/libunistring/description + This library provides functions for manipulating Unicode strings + and for manipulating C strings according to the Unicode standard. +endef + +HOST_CFLAGS += $(HOST_FPIC) + +TARGET_CFLAGS += $(FPIC) + +HOST_CONFIGURE_ARGS += \ + --enable-static \ + --disable-shared \ + --without-libiconv-prefix \ + --with-pic + +CONFIGURE_ARGS += \ + --enable-static \ + --enable-shared \ + --without-libiconv-prefix \ + --with-pic + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/ + $(INSTALL_DIR) $(1)/usr/include/unistring + $(CP) $(PKG_INSTALL_DIR)/usr/include/unistring/*.h $(1)/usr/include/unistring/ + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libunistring.{a,so*} $(1)/usr/lib/ +endef + +define Package/libunistring/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libunistring.so.* $(1)/usr/lib/ +endef + +$(eval $(call HostBuild)) +$(eval $(call BuildPackage,libunistring)) diff --git a/package/libs/libunwind/Makefile b/package/libs/libunwind/Makefile index f129dafcbf..c676d501bd 100644 --- a/package/libs/libunwind/Makefile +++ b/package/libs/libunwind/Makefile @@ -9,12 +9,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libunwind -PKG_VERSION:=1.5.0 -PKG_RELEASE:=2 +PKG_VERSION:=1.6.2 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@SAVANNAH/$(PKG_NAME) -PKG_HASH:=90337653d92d4a13de590781371c604f9031cdb50520366aa1e3a91e1efb1017 +PKG_HASH:=4a6aec666991fb45d0889c44aede8ad6eb108071c3554fcdff671f9c94794976 PKG_MAINTAINER:=Yousong Zhou PKG_LICENSE:=X11 diff --git a/package/libs/libunwind/patches/001-Don-t-force-exec_prefix-lib64-libdir-on-ppc64.patch b/package/libs/libunwind/patches/001-Don-t-force-exec_prefix-lib64-libdir-on-ppc64.patch deleted file mode 100644 index d6010ec0ae..0000000000 --- a/package/libs/libunwind/patches/001-Don-t-force-exec_prefix-lib64-libdir-on-ppc64.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 0af7e7a53480ce8e1cf6cfb4e9fe071c1185ef31 Mon Sep 17 00:00:00 2001 -From: Matthias Diener -Date: Fri, 2 Jul 2021 12:36:10 -0500 -Subject: [PATCH] Don't force {exec_prefix}/lib64 libdir on ppc64 - ---- - configure.ac | 6 ------ - 1 file changed, 6 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 9fadc163..0dec4ca6 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -215,12 +215,6 @@ fi - AM_CONDITIONAL(USE_DWARF, [test x$use_dwarf = xyes]) - AC_MSG_RESULT([$use_dwarf]) - --if test x$target_arch = xppc64; then -- libdir='${exec_prefix}/lib64' -- AC_MSG_NOTICE([PowerPC64 detected, lib will be installed ${libdir}]); -- AC_SUBST([libdir]) --fi -- - AC_MSG_CHECKING([whether to restrict build to remote support]) - if test x$target_arch != x$host_arch; then - CPPFLAGS="${CPPFLAGS} -DUNW_REMOTE_ONLY" --- -2.32.0 - diff --git a/package/libs/libusb/Makefile b/package/libs/libusb/Makefile index fc26468c49..0c6de7cb61 100644 --- a/package/libs/libusb/Makefile +++ b/package/libs/libusb/Makefile @@ -8,18 +8,19 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libusb -PKG_VERSION:=1.0.24 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=1.0.26 +PKG_RELEASE:=3 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=\ https://github.com/libusb/libusb/releases/download/v$(PKG_VERSION) \ @SF/$(PKG_NAME) -PKG_HASH:=7efd2685f7b327326dcfb85cee426d9b871fd70e22caa15bb68d595ce2a2b12a +PKG_HASH:=12ce7a61fc9854d1d2a1ffe095f7b5fac19ddba095c259e6067a46500381b5a5 PKG_MAINTAINER:= Felix Fietkau PKG_LICENSE:=LGPL-2.1-or-later PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:libusb:libusb PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 @@ -30,7 +31,7 @@ define Package/libusb-1.0 SECTION:=libs CATEGORY:=Libraries TITLE:=A library for accessing Linux USB devices - DEPENDS:=+libpthread +librt + DEPENDS:=+libpthread +librt +libatomic URL:=http://libusb.info/ ABI_VERSION:=0 endef @@ -40,10 +41,26 @@ define Package/libusb-1.0/description many different operating systems. endef +define Package/fxload + SECTION:=utils + CATEGORY:=Utilities + TITLE:=fxload firmware loader + URL:=http://linux-hotplug.sourceforge.net + DEPENDS:=+libusb-1.0 +endef + +define Package/fxload/description +This program is conveniently able to download firmware into FX, FX2, +and FX2LP EZ-USB devices, as well as the original AnchorChips EZ-USB. +It is intended to be invoked by hotplug scripts when the unprogrammed +device appears on the bus. +endef + TARGET_CFLAGS += $(FPIC) CONFIGURE_ARGS += \ - --disable-udev \ - --disable-log + --enable-examples-build \ + --disable-log \ + --disable-udev define Build/InstallDev $(INSTALL_DIR) $(1)/usr/include/libusb-1.0 @@ -59,4 +76,10 @@ define Package/libusb-1.0/install $(CP) $(PKG_INSTALL_DIR)/usr/lib/libusb-1.0.so* $(1)/usr/lib/ endef +define Package/fxload/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/examples/.libs/fxload $(1)/usr/sbin +endef + $(eval $(call BuildPackage,libusb-1.0)) +$(eval $(call BuildPackage,fxload)) diff --git a/package/libs/libusb/patches/001-Correct-a-typo-in-the-Changelog-and-clean-up-a-stray.patch b/package/libs/libusb/patches/001-Correct-a-typo-in-the-Changelog-and-clean-up-a-stray.patch deleted file mode 100644 index b17d6178d3..0000000000 --- a/package/libs/libusb/patches/001-Correct-a-typo-in-the-Changelog-and-clean-up-a-stray.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 369af149e3ad92514a2d24f112cedfeb7acaf558 Mon Sep 17 00:00:00 2001 -From: Chris Dickens -Date: Sun, 13 Dec 2020 15:46:27 -0800 -Subject: [PATCH] Correct a typo in the Changelog and clean up a stray file - -Signed-off-by: Chris Dickens ---- - ChangeLog | 2 +- - libusb/version_nano.h | 2 +- - test | 0 - 3 files changed, 2 insertions(+), 2 deletions(-) - delete mode 100644 test - ---- a/ChangeLog -+++ b/ChangeLog -@@ -12,7 +12,7 @@ visit: http://log.libusb.info - * Darwin (macOS): use IOUSBDevice as darwin_device_class explicitly (#693) - * Linux: Drop support for kernel older than 2.6.32 - * Linux: Provide an event thread name (#689) --* Linux: Wait until all USBs have been reaped before freeing them (#607) -+* Linux: Wait until all URBs have been reaped before freeing them (#607) - * NetBSD: Recognize device timeouts (#710) - * OpenBSD: Allow opening ugen devices multiple times (#763) - * OpenBSD: Support libusb_get_port_number() (#764) ---- a/libusb/version_nano.h -+++ b/libusb/version_nano.h -@@ -1 +1 @@ --#define LIBUSB_NANO 11584 -+#define LIBUSB_NANO 11585 diff --git a/package/libs/libusb/patches/002-linux_usbfs-Fix-parsing-of-descriptors-for-multi-con.patch b/package/libs/libusb/patches/002-linux_usbfs-Fix-parsing-of-descriptors-for-multi-con.patch deleted file mode 100644 index a53a8900de..0000000000 --- a/package/libs/libusb/patches/002-linux_usbfs-Fix-parsing-of-descriptors-for-multi-con.patch +++ /dev/null @@ -1,61 +0,0 @@ -From f6d2cb561402c3b6d3627c0eb89e009b503d9067 Mon Sep 17 00:00:00 2001 -From: Chris Dickens -Date: Sun, 13 Dec 2020 15:49:19 -0800 -Subject: [PATCH] linux_usbfs: Fix parsing of descriptors for - multi-configuration devices - -Commit e2be556bd2 ("linux_usbfs: Parse config descriptors during device -initialization") introduced a regression for devices with multiple -configurations. The logic that verifies the reported length of the -configuration descriptors failed to count the length of the -configuration descriptor itself and would truncate the actual length by -9 bytes, leading to a parsing error for subsequent descriptors. - -Closes #825 - -Signed-off-by: Chris Dickens ---- - libusb/os/linux_usbfs.c | 12 ++++++++---- - libusb/version_nano.h | 2 +- - 2 files changed, 9 insertions(+), 5 deletions(-) - ---- a/libusb/os/linux_usbfs.c -+++ b/libusb/os/linux_usbfs.c -@@ -641,7 +641,12 @@ static int seek_to_next_config(struct li - uint8_t *buffer, size_t len) - { - struct usbi_descriptor_header *header; -- int offset = 0; -+ int offset; -+ -+ /* Start seeking past the config descriptor */ -+ offset = LIBUSB_DT_CONFIG_SIZE; -+ buffer += LIBUSB_DT_CONFIG_SIZE; -+ len -= LIBUSB_DT_CONFIG_SIZE; - - while (len > 0) { - if (len < 2) { -@@ -718,7 +723,7 @@ static int parse_config_descriptors(stru - } - - if (priv->sysfs_dir) { -- /* -+ /* - * In sysfs wTotalLength is ignored, instead the kernel returns a - * config descriptor with verified bLength fields, with descriptors - * with an invalid bLength removed. -@@ -727,8 +732,7 @@ static int parse_config_descriptors(stru - int offset; - - if (num_configs > 1 && idx < num_configs - 1) { -- offset = seek_to_next_config(ctx, buffer + LIBUSB_DT_CONFIG_SIZE, -- remaining - LIBUSB_DT_CONFIG_SIZE); -+ offset = seek_to_next_config(ctx, buffer, remaining); - if (offset < 0) - return offset; - sysfs_config_len = (uint16_t)offset; ---- a/libusb/version_nano.h -+++ b/libusb/version_nano.h -@@ -1 +1 @@ --#define LIBUSB_NANO 11585 -+#define LIBUSB_NANO 11586 diff --git a/package/libs/libxml2/Makefile b/package/libs/libxml2/Makefile index 904f7b39af..ed1965c019 100644 --- a/package/libs/libxml2/Makefile +++ b/package/libs/libxml2/Makefile @@ -1,31 +1,20 @@ -# -# Copyright (C) 2006-2016 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - include $(TOPDIR)/rules.mk PKG_NAME:=libxml2 -PKG_VERSION:=2.10.3 +PKG_VERSION:=2.11.4 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNOME/libxml2/$(basename $(PKG_VERSION)) -PKG_HASH:=5d2cc3d78bec3dbe212a9d7fa629ada25a7da928af432c93060ff5c17ee28a9c +PKG_HASH:=737e1d7f8ab3f139729ca13a2494fd17bf30ddb4b7a427cf336252cab57f57f7 PKG_LICENSE:=MIT PKG_LICENSE_FILES:=COPYING PKG_CPE_ID:=cpe:/a:xmlsoft:libxml2 -PKG_MAINTAINER:=Michael Heimpold - -PKG_INSTALL:=1 -PKG_BUILD_PARALLEL:=0 - include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk include $(INCLUDE_DIR)/nls.mk define Package/libxml2 @@ -37,7 +26,7 @@ define Package/libxml2 endef define Package/libxml2/description - A library for manipulating XML and HTML resources. + A library for manipulating XML and HTML resources. endef define Package/libxml2-dev @@ -68,69 +57,83 @@ define Package/libxml2-utils/description from libxml2, a library for manipulating XML and HTML resources. endef -TARGET_CFLAGS += $(FPIC) - -CONFIGURE_ARGS += \ - --enable-shared \ - --enable-static \ - --with-c14n \ - --without-catalog \ - --with-debug \ - --with-html \ - --without-ftp \ - --without-http \ - --without-iso8859x \ - --without-legacy \ - --with-output \ - --without-pattern \ - --without-push \ - --without-python \ - --with-reader \ - --without-readline \ - --without-regexps \ - --with-sax1 \ - --with-schemas \ - --with-threads \ - --with-tree \ - --with-valid \ - --with-writer \ - --with-xinclude \ - --with-xpath \ - --with-xptr \ - --with-zlib=$(STAGING_DIR)/usr \ - --without-lzma - -HOST_CONFIGURE_ARGS += \ - --disable-shared \ - --enable-static \ - --with-pic \ - --with-c14n \ - --without-catalog \ - --with-debug \ - --with-html \ - --without-ftp \ - --without-http \ - --without-iconv \ - --without-iso8859x \ - --without-legacy \ - --with-output \ - --without-pattern \ - --without-push \ - --without-python \ - --with-reader \ - --without-readline \ - --without-regexps \ - --with-sax1 \ - --with-schemas \ - --with-threads \ - --with-tree \ - --with-valid \ - --with-writer \ - --with-xinclude \ - --with-xpath \ - --with-xptr \ - --with-zlib \ - --without-lzma +CMAKE_HOST_OPTIONS += \ + -DBUILD_SHARED_LIBS=OFF \ + -DLIBXML2_WITH_C14N=ON \ + -DLIBXML2_WITH_CATALOG=OFF \ + -DLIBXML2_WITH_DEBUG=ON \ + -DLIBXML2_WITH_FTP=OFF \ + -DLIBXML2_WITH_HTML=ON \ + -DLIBXML2_WITH_HTTP=OFF \ + -DLIBXML2_WITH_ICONV=ON \ + -DLIBXML2_WITH_ICU=OFF \ + -DLIBXML2_WITH_ISO8859X=OFF \ + -DLIBXML2_WITH_LEGACY=OFF \ + -DLIBXML2_WITH_LZMA=OFF \ + -DLIBXML2_WITH_MEM_DEBUG=OFF \ + -DLIBXML2_WITH_MODULES=OFF \ + -DLIBXML2_WITH_OUTPUT=ON \ + -DLIBXML2_WITH_PATTERN=ON \ + -DLIBXML2_WITH_PROGRAMS=OFF \ + -DLIBXML2_WITH_PUSH=ON \ + -DLIBXML2_WITH_PYTHON=OFF \ + -DLIBXML2_WITH_READER=ON \ + -DLIBXML2_WITH_REGEXPS=ON \ + -DLIBXML2_WITH_RUN_DEBUG=OFF \ + -DLIBXML2_WITH_SAX1=ON \ + -DLIBXML2_WITH_SCHEMAS=ON \ + -DLIBXML2_WITH_SCHEMATRON=OFF \ + -DLIBXML2_WITH_TESTS=OFF \ + -DLIBXML2_WITH_THREADS=ON \ + -DLIBXML2_WITH_THREAD_ALLOC=OFF \ + -DLIBXML2_WITH_TREE=ON \ + -DLIBXML2_WITH_VALID=ON \ + -DLIBXML2_WITH_WRITER=ON \ + -DLIBXML2_WITH_XINCLUDE=ON \ + -DLIBXML2_WITH_XPATH=ON \ + -DLIBXML2_WITH_XPTR=ON \ + -DLIBXML2_WITH_XPTR_LOCS=ON \ + -DLIBXML2_WITH_ZLIB=ON + +CMAKE_OPTIONS += \ + -DBUILD_SHARED_LIBS=ON \ + -DLIBXML2_WITH_C14N=ON \ + -DLIBXML2_WITH_CATALOG=OFF \ + -DLIBXML2_WITH_DEBUG=ON \ + -DLIBXML2_WITH_FTP=OFF \ + -DLIBXML2_WITH_HTML=ON \ + -DLIBXML2_WITH_HTTP=OFF \ + -DLIBXML2_WITH_ICONV=ON \ + -DLIBXML2_WITH_ICU=OFF \ + -DLIBXML2_WITH_ISO8859X=OFF \ + -DLIBXML2_WITH_LEGACY=OFF \ + -DLIBXML2_WITH_LZMA=OFF \ + -DLIBXML2_WITH_MEM_DEBUG=OFF \ + -DLIBXML2_WITH_MODULES=OFF \ + -DLIBXML2_WITH_OUTPUT=ON \ + -DLIBXML2_WITH_PATTERN=ON \ + -DLIBXML2_WITH_PROGRAMS=ON \ + -DLIBXML2_WITH_PUSH=ON \ + -DLIBXML2_WITH_PYTHON=OFF \ + -DLIBXML2_WITH_READER=ON \ + -DLIBXML2_WITH_REGEXPS=ON \ + -DLIBXML2_WITH_RUN_DEBUG=OFF \ + -DLIBXML2_WITH_SAX1=ON \ + -DLIBXML2_WITH_SCHEMAS=ON \ + -DLIBXML2_WITH_SCHEMATRON=OFF \ + -DLIBXML2_WITH_TESTS=OFF \ + -DLIBXML2_WITH_THREADS=ON \ + -DLIBXML2_WITH_THREAD_ALLOC=OFF \ + -DLIBXML2_WITH_TREE=ON \ + -DLIBXML2_WITH_VALID=ON \ + -DLIBXML2_WITH_WRITER=ON \ + -DLIBXML2_WITH_XINCLUDE=ON \ + -DLIBXML2_WITH_XPATH=ON \ + -DLIBXML2_WITH_XPTR=ON \ + -DLIBXML2_WITH_XPTR_LOCS=ON \ + -DLIBXML2_WITH_ZLIB=ON \ + -DHAVE_LIBHISTORY=OFF \ + -DHAVE_LIBREADLINE=OFF define Build/InstallDev $(INSTALL_DIR) $(2)/bin @@ -140,14 +143,18 @@ define Build/InstallDev $(2)/bin/$(GNU_TARGET_NAME)-xml2-config $(LN) $(GNU_TARGET_NAME)-xml2-config $(2)/bin/xml2-config + $(INSTALL_DIR) $(1)/usr/bin + $(CP) $(PKG_INSTALL_DIR)/usr/bin/xmlcatalog $(1)/usr/bin/ + $(CP) $(PKG_INSTALL_DIR)/usr/bin/xmllint $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/usr/include $(CP) $(PKG_INSTALL_DIR)/usr/include/libxml2 $(1)/usr/include/ $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libxml2.{la,a,so*} $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libxml2.so* $(1)/usr/lib/ $(INSTALL_DIR) $(1)/usr/lib/cmake/libxml2 - $(CP) $(PKG_INSTALL_DIR)/usr/lib/cmake/libxml2/libxml2-config.cmake \ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/cmake/libxml2-$(PKG_VERSION)/*.cmake \ $(1)/usr/lib/cmake/libxml2 $(INSTALL_DIR) $(1)/usr/lib/pkgconfig diff --git a/package/libs/libxml2/patches/010-iconv.patch b/package/libs/libxml2/patches/010-iconv.patch new file mode 100644 index 0000000000..92b09685c5 --- /dev/null +++ b/package/libs/libxml2/patches/010-iconv.patch @@ -0,0 +1,12 @@ +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -469,6 +469,9 @@ if(LIBXML2_WITH_PROGRAMS) + add_executable(LibXml2::${PROGRAM} ALIAS ${PROGRAM}) + target_compile_definitions(${PROGRAM} PRIVATE SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}") + target_link_libraries(${PROGRAM} LibXml2) ++ if(LIBXML2_WITH_ICONV AND NOT Iconv_IS_BUILT_IN) ++ target_link_libraries(${PROGRAM} iconv) ++ endif() + if(HAVE_LIBHISTORY) + target_link_libraries(${PROGRAM} history) + endif() diff --git a/package/libs/libxslt/Makefile b/package/libs/libxslt/Makefile index c0db3e37c7..1edc610b95 100644 --- a/package/libs/libxslt/Makefile +++ b/package/libs/libxslt/Makefile @@ -8,27 +8,24 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libxslt -PKG_VERSION:=1.1.34 -PKG_RELEASE:=4 +PKG_VERSION:=1.1.37 +PKG_RELEASE:=1 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:= \ - http://xmlsoft.org/sources/ \ - ftp://fr.rpmfind.net/pub/libxml/ -PKG_HASH:=98b1bd46d6792925ad2dfe9a87452ea2adebf69dcb9919ffd55bf926a7f93f7f +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=@GNOME/libxslt/$(basename $(PKG_VERSION)) +PKG_HASH:=3a4b27dc8027ccd6146725950336f1ec520928f320f144eb5fa7990ae6123ab4 PKG_MAINTAINER:=Jiri Slachta PKG_LICENSE:=MIT PKG_LICENSE_FILES:=COPYING PKG_CPE_ID:=cpe:/a:xmlsoft:libxslt -PKG_FIXUP:=autoreconf -PKG_INSTALL:=1 -PKG_BUILD_PARALLEL:=1 HOST_BUILD_DEPENDS:=libxml2/host +CMAKE_BINARY_SUBDIR:=openwrt-build include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/cmake.mk include $(INCLUDE_DIR)/nls.mk define Package/libxslt @@ -67,36 +64,40 @@ define Package/xsltproc/description XSLT XML transformation utility. endef -CONFIGURE_ARGS += \ - --enable-shared \ - --enable-static \ - --without-python \ - --without-crypto \ - --without-debug \ - --without-mem-debug \ - --without-debugger \ - --without-plugins - -HOST_CONFIGURE_ARGS += \ - --with-libxml-prefix=$(STAGING_DIR_HOSTPKG) \ - --without-python \ - --without-crypto \ - --without-debug \ - --without-mem-debug \ - --without-debugger \ - --without-profiler \ - --without-plugins +CMAKE_HOST_OPTIONS += \ + -DBUILD_SHARED_LIBS=OFF \ + -DLIBXSLT_WITH_DEBUGGER=OFF \ + -DLIBXSLT_WITH_CRYPTO=OFF \ + -DLIBXSLT_WITH_MEM_DEBUG=OFF \ + -DLIBXSLT_WITH_MODULES=OFF \ + -DLIBXSLT_WITH_PROFILER=OFF \ + -DLIBXSLT_WITH_PYTHON=OFF \ + -DLIBXSLT_WITH_TESTS=OFF \ + -DLIBXSLT_WITH_THREADS=ON \ + -DLIBXSLT_WITH_XSLT_DEBUG=OFF + +CMAKE_OPTIONS += \ + -DBUILD_SHARED_LIBS=ON \ + -DLIBXSLT_WITH_DEBUGGER=OFF \ + -DLIBXSLT_WITH_CRYPTO=OFF \ + -DLIBXSLT_WITH_MEM_DEBUG=OFF \ + -DLIBXSLT_WITH_MODULES=OFF \ + -DLIBXSLT_WITH_PROFILER=ON \ + -DLIBXSLT_WITH_PYTHON=OFF \ + -DLIBXSLT_WITH_TESTS=OFF \ + -DLIBXSLT_WITH_THREADS=ON \ + -DLIBXSLT_WITH_XSLT_DEBUG=OFF define Build/InstallDev/Xslt $(INSTALL_DIR) $(1)/usr/bin $(2)/bin $(1)/usr/include/libxslt \ $(1)/usr/include/libexslt $(1)/usr/lib \ - $(1)/usr/lib/pkgconfig $(2)/share/aclocal + $(1)/usr/lib/pkgconfig $(INSTALL_BIN) \ $(PKG_INSTALL_DIR)/usr/bin/xslt-config \ $(2)/bin/ - ln -sf $(STAGING_DIR)/host/bin/xslt-config $(1)/usr/bin/xslt-config + $(LN) $(STAGING_DIR)/host/bin/xslt-config $(1)/usr/bin/xslt-config $(SED) \ 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' \ @@ -107,16 +108,12 @@ define Build/InstallDev/Xslt $(1)/usr/include/libxslt/ $(CP) \ - $(PKG_INSTALL_DIR)/usr/lib/libxslt.{la,a,so*} \ + $(PKG_INSTALL_DIR)/usr/lib/libxslt.so* \ $(1)/usr/lib/ $(INSTALL_DATA) \ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libxslt.pc \ $(1)/usr/lib/pkgconfig/ - - $(INSTALL_DATA) \ - $(PKG_INSTALL_DIR)/usr/share/aclocal/* \ - $(2)/share/aclocal endef define Build/InstallDev/Exslt @@ -126,7 +123,7 @@ define Build/InstallDev/Exslt $(1)/usr/include/libexslt/ $(CP) \ - $(PKG_INSTALL_DIR)/usr/lib/libexslt.{la,a,so*} \ + $(PKG_INSTALL_DIR)/usr/lib/libexslt.so* \ $(1)/usr/lib/ $(INSTALL_DATA) \ diff --git a/package/libs/libxslt/patches/010-fix-xml2-config-check.patch b/package/libs/libxslt/patches/010-fix-xml2-config-check.patch deleted file mode 100644 index 657705e914..0000000000 --- a/package/libs/libxslt/patches/010-fix-xml2-config-check.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/configure.ac -+++ b/configure.ac -@@ -546,7 +546,7 @@ dnl make sure xml2-config is executable, - dnl test version and init our variables - dnl - --if test "x$LIBXML_LIBS" = "x" && ${XML_CONFIG} --libs print > /dev/null 2>&1 -+if test "x$LIBXML_LIBS" = "x" && ${XML_CONFIG} --libs > /dev/null 2>&1 - then - AC_MSG_CHECKING(for libxml libraries >= $LIBXML_REQUIRED_VERSION) - XMLVERS=`$XML_CONFIG --version` diff --git a/package/libs/lzo/Makefile b/package/libs/lzo/Makefile new file mode 100644 index 0000000000..e78a0520a2 --- /dev/null +++ b/package/libs/lzo/Makefile @@ -0,0 +1,58 @@ +# +# Copyright (C) 2006-2016 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=lzo +PKG_VERSION:=2.10 +PKG_RELEASE:=4 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=http://www.oberhumer.com/opensource/lzo/download/ +PKG_HASH:=c0f892943208266f9b6543b3ae308fab6284c5c90e627931446fb49b4221a072 + +PKG_LICENSE:=GPL-2.0-or-later +PKG_LICENSE_FILES:=COPYING + +CMAKE_BINARY_SUBDIR:=openwrt-build + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/liblzo + SECTION:=libs + CATEGORY:=Libraries + TITLE:=A real-time data compression library + URL:=http://www.oberhumer.com/opensource/lzo/ + ABI_VERSION:=2 +endef + +define Package/liblzo/description + LZO is a data compression library which is suitable for data de-/compression + in real-time. This means it favours speed over compression ratio. +endef + +CMAKE_OPTIONS += \ + -DENABLE_SHARED=ON \ + -DENABLE_STATIC=ON \ + -DBUILD_TESTING=OFF + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/include/lzo $(1)/usr/include/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblzo2.{a,so*} $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/lzo2.pc $(1)/usr/lib/pkgconfig + $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/lzo2.pc + $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/lzo2.pc +endef + +define Package/liblzo/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblzo2.so.* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,liblzo)) diff --git a/package/libs/mbedtls/Config.in b/package/libs/mbedtls/Config.in new file mode 100644 index 0000000000..9fbe9f8a4a --- /dev/null +++ b/package/libs/mbedtls/Config.in @@ -0,0 +1,193 @@ +if PACKAGE_libmbedtls + +comment "Option details in source code: include/mbedtls/mbedtls_config.h" + +comment "Ciphers - unselect old or less-used ciphers to reduce binary size" + +config MBEDTLS_AES_C + bool "MBEDTLS_AES_C" + default y + +config MBEDTLS_CAMELLIA_C + bool "MBEDTLS_CAMELLIA_C" + default n + +config MBEDTLS_CCM_C + bool "MBEDTLS_CCM_C" + default n + +config MBEDTLS_CMAC_C + bool "MBEDTLS_CMAC_C (old but used by hostapd)" + default y + +config MBEDTLS_DES_C + bool "MBEDTLS_DES_C (old but used by hostapd)" + default y + +config MBEDTLS_GCM_C + bool "MBEDTLS_GCM_C" + default y + +config MBEDTLS_NIST_KW_C + bool "MBEDTLS_NIST_KW_C (old but used by hostapd)" + default y + +config MBEDTLS_RIPEMD160_C + bool "MBEDTLS_RIPEMD160_C" + default n + +config MBEDTLS_XTEA_C + bool "MBEDTLS_XTEA_C" + default n + +config MBEDTLS_RSA_NO_CRT + bool "MBEDTLS_RSA_NO_CRT" + default y + +config MBEDTLS_KEY_EXCHANGE_PSK_ENABLED + bool "MBEDTLS_KEY_EXCHANGE_PSK_ENABLED" + default y + +config MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED + bool "MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED" + default n + +config MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED + bool "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED" + default y + +config MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED + bool "MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED" + default n + +config MBEDTLS_KEY_EXCHANGE_RSA_ENABLED + bool "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED" + default n + +config MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED + bool "MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED" + default n + +config MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED + bool "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED" + default y + +config MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED + bool "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED" + default y + +config MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED + bool "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED" + default n + +config MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED + bool "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED" + default n + +comment "Curves - unselect old or less-used curves to reduce binary size" + +config MBEDTLS_ECP_DP_SECP192R1_ENABLED + bool "MBEDTLS_ECP_DP_SECP192R1_ENABLED" + default n + +config MBEDTLS_ECP_DP_SECP224R1_ENABLED + bool "MBEDTLS_ECP_DP_SECP224R1_ENABLED" + default n + +config MBEDTLS_ECP_DP_SECP256R1_ENABLED + bool "MBEDTLS_ECP_DP_SECP256R1_ENABLED" + default y + +config MBEDTLS_ECP_DP_SECP384R1_ENABLED + bool "MBEDTLS_ECP_DP_SECP384R1_ENABLED" + default y + +config MBEDTLS_ECP_DP_SECP521R1_ENABLED + bool "MBEDTLS_ECP_DP_SECP521R1_ENABLED" + default y + +config MBEDTLS_ECP_DP_SECP192K1_ENABLED + bool "MBEDTLS_ECP_DP_SECP192K1_ENABLED" + default n + +config MBEDTLS_ECP_DP_SECP224K1_ENABLED + bool "MBEDTLS_ECP_DP_SECP224K1_ENABLED" + default n + +config MBEDTLS_ECP_DP_SECP256K1_ENABLED + bool "MBEDTLS_ECP_DP_SECP256K1_ENABLED" + default y + +config MBEDTLS_ECP_DP_BP256R1_ENABLED + bool "MBEDTLS_ECP_DP_BP256R1_ENABLED" + default n + +config MBEDTLS_ECP_DP_BP384R1_ENABLED + bool "MBEDTLS_ECP_DP_BP384R1_ENABLED" + default n + +config MBEDTLS_ECP_DP_BP512R1_ENABLED + bool "MBEDTLS_ECP_DP_BP512R1_ENABLED" + default n + +config MBEDTLS_ECP_DP_CURVE25519_ENABLED + bool "MBEDTLS_ECP_DP_CURVE25519_ENABLED" + default y + +config MBEDTLS_ECP_DP_CURVE448_ENABLED + bool "MBEDTLS_ECP_DP_CURVE448_ENABLED" + default n + +comment "Build Options - unselect features to reduce binary size" + +config MBEDTLS_CERTS_C + bool "MBEDTLS_CERTS_C" + default n + +config MBEDTLS_CIPHER_MODE_OFB + bool "MBEDTLS_CIPHER_MODE_OFB" + default n + +config MBEDTLS_CIPHER_MODE_XTS + bool "MBEDTLS_CIPHER_MODE_XTS" + default n + +config MBEDTLS_DEBUG_C + bool "MBEDTLS_DEBUG_C" + default n + +config MBEDTLS_HKDF_C + bool "MBEDTLS_HKDF_C" + default n + +config MBEDTLS_PLATFORM_C + bool "MBEDTLS_PLATFORM_C" + default n + +config MBEDTLS_SELF_TEST + bool "MBEDTLS_SELF_TEST" + default n + +config MBEDTLS_SSL_TRUNCATED_HMAC + bool "MBEDTLS_SSL_TRUNCATED_HMAC" + default n + +config MBEDTLS_VERSION_C + bool "MBEDTLS_VERSION_C" + default n + +config MBEDTLS_VERSION_FEATURES + bool "MBEDTLS_VERSION_FEATURES" + default n + +comment "Build Options" + +config MBEDTLS_ENTROPY_FORCE_SHA256 + bool "MBEDTLS_ENTROPY_FORCE_SHA256" + default y + +config MBEDTLS_SSL_RENEGOTIATION + bool "MBEDTLS_SSL_RENEGOTIATION" + default n + +endif diff --git a/package/libs/mbedtls/Makefile b/package/libs/mbedtls/Makefile index 3ee4855cfa..246b21a853 100644 --- a/package/libs/mbedtls/Makefile +++ b/package/libs/mbedtls/Makefile @@ -8,21 +8,72 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mbedtls -PKG_VERSION:=2.28.1 -PKG_RELEASE:=$(AUTORELEASE) -PKG_USE_MIPS16:=0 +PKG_VERSION:=2.28.5 +PKG_RELEASE:=2 +PKG_BUILD_FLAGS:=no-mips16 gc-sections no-lto PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/ARMmbed/mbedtls/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=6797a7b6483ef589deeab8d33d401ed235d7be25eeecda1be8ddfed406d40ff4 +PKG_HASH:=849e86b626e42ded6bf67197b64aa771daa54e2a7e2868dc67e1e4711959e5e3 PKG_LICENSE:=GPL-2.0-or-later PKG_LICENSE_FILES:=gpl-2.0.txt PKG_CPE_ID:=cpe:/a:arm:mbed_tls -PKG_CONFIG_DEPENDS := \ - CONFIG_LIBMBEDTLS_DEBUG_C \ - CONFIG_LIBMBEDTLS_HKDF_C +MBEDTLS_BUILD_OPTS_CURVES= \ + CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED \ + CONFIG_MBEDTLS_ECP_DP_CURVE448_ENABLED + +MBEDTLS_BUILD_OPTS_CIPHERS= \ + CONFIG_MBEDTLS_AES_C \ + CONFIG_MBEDTLS_CAMELLIA_C \ + CONFIG_MBEDTLS_CCM_C \ + CONFIG_MBEDTLS_CMAC_C \ + CONFIG_MBEDTLS_DES_C \ + CONFIG_MBEDTLS_GCM_C \ + CONFIG_MBEDTLS_KEY_EXCHANGE_PSK_ENABLED \ + CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED \ + CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED \ + CONFIG_MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED \ + CONFIG_MBEDTLS_KEY_EXCHANGE_RSA_ENABLED \ + CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED \ + CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED \ + CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED \ + CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED \ + CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED \ + CONFIG_MBEDTLS_NIST_KW_C \ + CONFIG_MBEDTLS_RIPEMD160_C \ + CONFIG_MBEDTLS_RSA_NO_CRT \ + CONFIG_MBEDTLS_XTEA_C + +MBEDTLS_BUILD_OPTS= \ + $(MBEDTLS_BUILD_OPTS_CURVES) \ + $(MBEDTLS_BUILD_OPTS_CIPHERS) \ + CONFIG_MBEDTLS_CERTS_C \ + CONFIG_MBEDTLS_CIPHER_MODE_OFB \ + CONFIG_MBEDTLS_CIPHER_MODE_XTS \ + CONFIG_MBEDTLS_DEBUG_C \ + CONFIG_MBEDTLS_ENTROPY_FORCE_SHA256 \ + CONFIG_MBEDTLS_HKDF_C \ + CONFIG_MBEDTLS_PLATFORM_C \ + CONFIG_MBEDTLS_SELF_TEST \ + CONFIG_MBEDTLS_SSL_RENEGOTIATION \ + CONFIG_MBEDTLS_SSL_TRUNCATED_HMAC \ + CONFIG_MBEDTLS_VERSION_C \ + CONFIG_MBEDTLS_VERSION_FEATURES + +PKG_CONFIG_DEPENDS := $(MBEDTLS_BUILD_OPTS) include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -44,28 +95,11 @@ $(call Package/mbedtls/Default) SUBMENU:=SSL TITLE+= (library) ABI_VERSION:=12 + MENU:=1 endef define Package/libmbedtls/config -config LIBMBEDTLS_DEBUG_C - depends on PACKAGE_libmbedtls - bool "Enable debug functions" - default n - help - This option enables mbedtls library's debug functions. - - It increases the uncompressed libmbedtls binary size - by around 60 KiB (for an ARMv5 platform). - - Usually, you don't need this, so don't select this if you're unsure. - -config LIBMBEDTLS_HKDF_C - depends on PACKAGE_libmbedtls - bool "Enable the HKDF algorithm (RFC 5869)" - default n - help - This option adds support for the Hashed Message Authentication Code - (HMAC)-based key derivation function (HKDF). + source "$(SOURCE)/Config.in" endef define Package/mbedtls-util @@ -87,33 +121,22 @@ This package contains mbedtls helper programs for private key and CSR generation (gen_key, cert_req) endef -TARGET_CFLAGS += -ffunction-sections -fdata-sections TARGET_CFLAGS := $(filter-out -O%,$(TARGET_CFLAGS)) CMAKE_OPTIONS += \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DUSE_SHARED_MBEDTLS_LIBRARY:Bool=ON \ -DENABLE_TESTING:Bool=OFF \ -DENABLE_PROGRAMS:Bool=ON -define Build/Configure - $(Build/Configure/Default) - - awk 'BEGIN { rc = 1 } \ - /#define MBEDTLS_DEBUG_C/ { $$$$0 = "$(if $(CONFIG_LIBMBEDTLS_DEBUG_C),,// )#define MBEDTLS_DEBUG_C"; rc = 0 } \ - { print } \ - END { exit(rc) }' $(PKG_BUILD_DIR)/include/mbedtls/config.h \ - >$(PKG_BUILD_DIR)/include/mbedtls/config.h.new && \ - mv $(PKG_BUILD_DIR)/include/mbedtls/config.h.new $(PKG_BUILD_DIR)/include/mbedtls/config.h - - awk 'BEGIN { rc = 1 } \ - /#define MBEDTLS_HKDF_C/ { $$$$0 = "$(if $(CONFIG_LIBMBEDTLS_HKDF_C),,// )#define MBEDTLS_HKDF_C"; rc = 0 } \ - { print } \ - END { exit(rc) }' $(PKG_BUILD_DIR)/include/mbedtls/config.h \ - >$(PKG_BUILD_DIR)/include/mbedtls/config.h.new && \ - mv $(PKG_BUILD_DIR)/include/mbedtls/config.h.new $(PKG_BUILD_DIR)/include/mbedtls/config.h - - sed -i '/fuzz/d' $(PKG_BUILD_DIR)/programs/CMakeLists.txt - sed -i '/test/d' $(PKG_BUILD_DIR)/programs/CMakeLists.txt +define Build/Prepare + $(call Build/Prepare/Default) + + $(if $(strip $(foreach opt,$(MBEDTLS_BUILD_OPTS),$($(opt)))), + $(foreach opt,$(MBEDTLS_BUILD_OPTS), + $(PKG_BUILD_DIR)/scripts/config.py \ + -f $(PKG_BUILD_DIR)/include/mbedtls/config.h \ + $(if $($(opt)),set,unset) $(patsubst CONFIG_%,%,$(opt))),) endef define Build/InstallDev diff --git a/package/libs/mbedtls/patches/100-fix-compile.patch b/package/libs/mbedtls/patches/100-fix-compile.patch deleted file mode 100644 index c3b26ac9c9..0000000000 --- a/package/libs/mbedtls/patches/100-fix-compile.patch +++ /dev/null @@ -1,22 +0,0 @@ -Fix a compile problem introduced in commit 331c3421d1f0 ("Address review comments") - -Bug report: https://github.com/Mbed-TLS/mbedtls/issues/6243 - ---- a/programs/ssl/ssl_server2.c -+++ b/programs/ssl/ssl_server2.c -@@ -2511,7 +2511,6 @@ int main( int argc, char *argv[] ) - } - key_cert_init2 = 2; - #endif /* MBEDTLS_ECDSA_C */ -- } - - #if defined(MBEDTLS_USE_PSA_CRYPTO) - if( opt.key_opaque != 0 ) -@@ -2540,6 +2539,7 @@ int main( int argc, char *argv[] ) - } - #endif /* MBEDTLS_USE_PSA_CRYPTO */ - #endif /* MBEDTLS_CERTS_C */ -+ } - - mbedtls_printf( " ok (key types: %s - %s)\n", mbedtls_pk_get_name( &pkey ), mbedtls_pk_get_name( &pkey2 ) ); - #endif /* MBEDTLS_X509_CRT_PARSE_C */ diff --git a/package/libs/mbedtls/patches/100-x509-crt-verify-SAN-iPAddress.patch b/package/libs/mbedtls/patches/100-x509-crt-verify-SAN-iPAddress.patch new file mode 100644 index 0000000000..4ad2e8c7db --- /dev/null +++ b/package/libs/mbedtls/patches/100-x509-crt-verify-SAN-iPAddress.patch @@ -0,0 +1,197 @@ +From eb9d4fdf1846e688d51d86a9a50f0312aca2af25 Mon Sep 17 00:00:00 2001 +From: Glenn Strauss +Date: Sun, 23 Oct 2022 19:48:18 -0400 +Subject: [PATCH] x509 crt verify SAN iPAddress + +Signed-off-by: Glenn Strauss +--- + include/mbedtls/x509_crt.h | 2 +- + library/x509_crt.c | 126 ++++++++++++++++++++++++++++++------- + 2 files changed, 103 insertions(+), 25 deletions(-) + +--- a/include/mbedtls/x509_crt.h ++++ b/include/mbedtls/x509_crt.h +@@ -608,7 +608,7 @@ int mbedtls_x509_crt_verify_info(char *b + * \param cn The expected Common Name. This will be checked to be + * present in the certificate's subjectAltNames extension or, + * if this extension is absent, as a CN component in its +- * Subject name. Currently only DNS names are supported. This ++ * Subject name. DNS names and IP addresses are supported. This + * may be \c NULL if the CN need not be verified. + * \param flags The address at which to store the result of the verification. + * If the verification couldn't be completed, the flag value is +--- a/library/x509_crt.c ++++ b/library/x509_crt.c +@@ -57,6 +57,10 @@ + + #if defined(MBEDTLS_HAVE_TIME) + #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ++#define WIN32_LEAN_AND_MEAN ++#ifndef _WIN32_WINNT ++#define _WIN32_WINNT 0x0600 ++#endif + #include + #else + #include +@@ -3002,6 +3006,61 @@ find_parent: + } + } + ++#ifdef _WIN32 ++#ifdef _MSC_VER ++#pragma comment(lib, "ws2_32.lib") ++#include ++#include ++#elif (defined(__MINGW32__) || defined(__MINGW64__)) && _WIN32_WINNT >= 0x0600 ++#include ++#include ++#endif ++#elif defined(__sun) ++/* Solaris requires -lsocket -lnsl for inet_pton() */ ++#elif defined(__has_include) ++#if __has_include() ++#include ++#endif ++#if __has_include() ++#include ++#endif ++#endif ++ ++/* Use whether or not AF_INET6 is defined to indicate whether or not to use ++ * the platform inet_pton() or a local implementation (below). The local ++ * implementation may be used even in cases where the platform provides ++ * inet_pton(), e.g. when there are different includes required and/or the ++ * platform implementation requires dependencies on additional libraries. ++ * Specifically, Windows requires custom includes and additional link ++ * dependencies, and Solaris requires additional link dependencies. ++ * Also, as a coarse heuristic, use the local implementation if the compiler ++ * does not support __has_include(), or if the definition of AF_INET6 is not ++ * provided by headers included (or not) via __has_include() above. */ ++#ifndef AF_INET6 ++ ++#define x509_cn_inet_pton(cn, dst) (0) ++ ++#else ++ ++static int x509_inet_pton_ipv6(const char *src, void *dst) ++{ ++ return inet_pton(AF_INET6, src, dst) == 1 ? 0 : -1; ++} ++ ++static int x509_inet_pton_ipv4(const char *src, void *dst) ++{ ++ return inet_pton(AF_INET, src, dst) == 1 ? 0 : -1; ++} ++ ++#endif /* AF_INET6 */ ++ ++static size_t x509_cn_inet_pton(const char *cn, void *dst) ++{ ++ return strchr(cn, ':') == NULL ++ ? x509_inet_pton_ipv4(cn, dst) == 0 ? 4 : 0 ++ : x509_inet_pton_ipv6(cn, dst) == 0 ? 16 : 0; ++} ++ + /* + * Check for CN match + */ +@@ -3022,24 +3081,51 @@ static int x509_crt_check_cn(const mbedt + return -1; + } + ++static int x509_crt_check_san_ip(const mbedtls_x509_sequence *san, ++ const char *cn, size_t cn_len) ++{ ++ uint32_t ip[4]; ++ cn_len = x509_cn_inet_pton(cn, ip); ++ if (cn_len == 0) { ++ return -1; ++ } ++ ++ for (const mbedtls_x509_sequence *cur = san; cur != NULL; cur = cur->next) { ++ const unsigned char san_type = (unsigned char) cur->buf.tag & ++ MBEDTLS_ASN1_TAG_VALUE_MASK; ++ if (san_type == MBEDTLS_X509_SAN_IP_ADDRESS && ++ cur->buf.len == cn_len && memcmp(cur->buf.p, ip, cn_len) == 0) { ++ return 0; ++ } ++ } ++ ++ return -1; ++} ++ + /* + * Check for SAN match, see RFC 5280 Section 4.2.1.6 + */ +-static int x509_crt_check_san(const mbedtls_x509_buf *name, ++static int x509_crt_check_san(const mbedtls_x509_sequence *san, + const char *cn, size_t cn_len) + { +- const unsigned char san_type = (unsigned char) name->tag & +- MBEDTLS_ASN1_TAG_VALUE_MASK; +- +- /* dNSName */ +- if (san_type == MBEDTLS_X509_SAN_DNS_NAME) { +- return x509_crt_check_cn(name, cn, cn_len); ++ int san_ip = 0; ++ for (const mbedtls_x509_sequence *cur = san; cur != NULL; cur = cur->next) { ++ switch ((unsigned char) cur->buf.tag & MBEDTLS_ASN1_TAG_VALUE_MASK) { ++ case MBEDTLS_X509_SAN_DNS_NAME: /* dNSName */ ++ if (x509_crt_check_cn(&cur->buf, cn, cn_len) == 0) { ++ return 0; ++ } ++ break; ++ case MBEDTLS_X509_SAN_IP_ADDRESS: /* iPAddress */ ++ san_ip = 1; ++ break; ++ /* (We may handle other types here later.) */ ++ default: /* Unrecognized type */ ++ break; ++ } + } + +- /* (We may handle other types here later.) */ +- +- /* Unrecognized type */ +- return -1; ++ return san_ip ? x509_crt_check_san_ip(san, cn, cn_len) : -1; + } + + /* +@@ -3050,31 +3136,23 @@ static void x509_crt_verify_name(const m + uint32_t *flags) + { + const mbedtls_x509_name *name; +- const mbedtls_x509_sequence *cur; + size_t cn_len = strlen(cn); + + if (crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME) { +- for (cur = &crt->subject_alt_names; cur != NULL; cur = cur->next) { +- if (x509_crt_check_san(&cur->buf, cn, cn_len) == 0) { +- break; +- } +- } +- +- if (cur == NULL) { +- *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; ++ if (x509_crt_check_san(&crt->subject_alt_names, cn, cn_len) == 0) { ++ return; + } + } else { + for (name = &crt->subject; name != NULL; name = name->next) { + if (MBEDTLS_OID_CMP(MBEDTLS_OID_AT_CN, &name->oid) == 0 && + x509_crt_check_cn(&name->val, cn, cn_len) == 0) { +- break; ++ return; + } + } + +- if (name == NULL) { +- *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; +- } + } ++ ++ *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; + } + + /* diff --git a/package/libs/mbedtls/patches/101-bn_mul.h-workaround-for-gcc-11.2.0-issues.patch b/package/libs/mbedtls/patches/101-bn_mul.h-workaround-for-gcc-11.2.0-issues.patch deleted file mode 100644 index bb2ef9ec43..0000000000 --- a/package/libs/mbedtls/patches/101-bn_mul.h-workaround-for-gcc-11.2.0-issues.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 0b2528145eb5e9207e45e7fc150d574afc1ff628 Mon Sep 17 00:00:00 2001 -From: Nick Hainke -Date: Thu, 24 Nov 2022 15:23:26 +0100 -Subject: [PATCH] bn_mul.h: workaround for gcc-11.2.0 issues - -Currently curl fails on mpc85xx with: - curl[7227]: illegal instruction (4) at b7c94288 nip b7c94288 lr b7c6b528 code 1 in libmbedcrypto.so.2.28.1[b7c3e000+7e000] - curl[7227]: code: 3d7e0000 809e8004 91490000 816b814c 7d6903a6 4e800421 80010024 83c10018 - curl[7227]: code: 38210020 7c0803a6 4e800020 9421fff0 <7d4d42e6> 7c6c42e6 7d2d42e6 7c0a4840 - -This is due to a bug in gcc-11.2.0. It is fixed with gcc-11.3.0. -is planed. Instead, remove the code for mpc85xx that is the cause of the -issue. - -Signed-off-by: Nick Hainke ---- - include/mbedtls/bn_mul.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/include/mbedtls/bn_mul.h -+++ b/include/mbedtls/bn_mul.h -@@ -406,7 +406,7 @@ - - #endif /* __MACH__ && __APPLE__ */ - --#elif defined(__powerpc__) || defined(__ppc__) /* end PPC64/begin PPC32 */ -+#elif (defined(__powerpc__) || defined(__ppc__)) && GCC_VERSION != 110200 /* end PPC64/begin PPC32 */ - - #if defined(__MACH__) && defined(__APPLE__) - diff --git a/package/libs/mbedtls/patches/101-remove-test.patch b/package/libs/mbedtls/patches/101-remove-test.patch new file mode 100644 index 0000000000..e43f8757d7 --- /dev/null +++ b/package/libs/mbedtls/patches/101-remove-test.patch @@ -0,0 +1,15 @@ +--- a/programs/CMakeLists.txt ++++ b/programs/CMakeLists.txt +@@ -1,12 +1,8 @@ + add_subdirectory(aes) +-if (NOT WIN32) +- add_subdirectory(fuzz) +-endif() + add_subdirectory(hash) + add_subdirectory(pkey) + add_subdirectory(psa) + add_subdirectory(random) + add_subdirectory(ssl) +-add_subdirectory(test) + add_subdirectory(util) + add_subdirectory(x509) diff --git a/package/libs/mbedtls/patches/200-config.patch b/package/libs/mbedtls/patches/200-config.patch deleted file mode 100644 index 54d4cf431d..0000000000 --- a/package/libs/mbedtls/patches/200-config.patch +++ /dev/null @@ -1,228 +0,0 @@ ---- a/include/mbedtls/config.h -+++ b/include/mbedtls/config.h -@@ -670,14 +670,14 @@ - * - * Enable Output Feedback mode (OFB) for symmetric ciphers. - */ --#define MBEDTLS_CIPHER_MODE_OFB -+//#define MBEDTLS_CIPHER_MODE_OFB - - /** - * \def MBEDTLS_CIPHER_MODE_XTS - * - * Enable Xor-encrypt-xor with ciphertext stealing mode (XTS) for AES. - */ --#define MBEDTLS_CIPHER_MODE_XTS -+//#define MBEDTLS_CIPHER_MODE_XTS - - /** - * \def MBEDTLS_CIPHER_NULL_CIPHER -@@ -795,20 +795,20 @@ - * Comment macros to disable the curve and functions for it - */ - /* Short Weierstrass curves (supporting ECP, ECDH, ECDSA) */ --#define MBEDTLS_ECP_DP_SECP192R1_ENABLED --#define MBEDTLS_ECP_DP_SECP224R1_ENABLED -+//#define MBEDTLS_ECP_DP_SECP192R1_ENABLED -+//#define MBEDTLS_ECP_DP_SECP224R1_ENABLED - #define MBEDTLS_ECP_DP_SECP256R1_ENABLED - #define MBEDTLS_ECP_DP_SECP384R1_ENABLED --#define MBEDTLS_ECP_DP_SECP521R1_ENABLED --#define MBEDTLS_ECP_DP_SECP192K1_ENABLED --#define MBEDTLS_ECP_DP_SECP224K1_ENABLED -+//#define MBEDTLS_ECP_DP_SECP521R1_ENABLED -+//#define MBEDTLS_ECP_DP_SECP192K1_ENABLED -+//#define MBEDTLS_ECP_DP_SECP224K1_ENABLED - #define MBEDTLS_ECP_DP_SECP256K1_ENABLED --#define MBEDTLS_ECP_DP_BP256R1_ENABLED --#define MBEDTLS_ECP_DP_BP384R1_ENABLED --#define MBEDTLS_ECP_DP_BP512R1_ENABLED -+//#define MBEDTLS_ECP_DP_BP256R1_ENABLED -+//#define MBEDTLS_ECP_DP_BP384R1_ENABLED -+//#define MBEDTLS_ECP_DP_BP512R1_ENABLED - /* Montgomery curves (supporting ECP) */ - #define MBEDTLS_ECP_DP_CURVE25519_ENABLED --#define MBEDTLS_ECP_DP_CURVE448_ENABLED -+//#define MBEDTLS_ECP_DP_CURVE448_ENABLED - - /** - * \def MBEDTLS_ECP_NIST_OPTIM -@@ -961,7 +961,7 @@ - * See dhm.h for more details. - * - */ --#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED -+//#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED - - /** - * \def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED -@@ -981,7 +981,7 @@ - * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA - */ --#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED -+//#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED - - /** - * \def MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED -@@ -1006,7 +1006,7 @@ - * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA - */ --#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED -+//#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED - - /** - * \def MBEDTLS_KEY_EXCHANGE_RSA_ENABLED -@@ -1140,7 +1140,7 @@ - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - */ --#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED -+//#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED - - /** - * \def MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED -@@ -1164,7 +1164,7 @@ - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 - */ --#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED -+//#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED - - /** - * \def MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED -@@ -1268,7 +1268,7 @@ - * This option is only useful if both MBEDTLS_SHA256_C and - * MBEDTLS_SHA512_C are defined. Otherwise the available hash module is used. - */ --//#define MBEDTLS_ENTROPY_FORCE_SHA256 -+#define MBEDTLS_ENTROPY_FORCE_SHA256 - - /** - * \def MBEDTLS_ENTROPY_NV_SEED -@@ -1483,14 +1483,14 @@ - * Uncomment this macro to disable the use of CRT in RSA. - * - */ --//#define MBEDTLS_RSA_NO_CRT -+#define MBEDTLS_RSA_NO_CRT - - /** - * \def MBEDTLS_SELF_TEST - * - * Enable the checkup functions (*_self_test). - */ --#define MBEDTLS_SELF_TEST -+//#define MBEDTLS_SELF_TEST - - /** - * \def MBEDTLS_SHA256_SMALLER -@@ -1761,7 +1761,7 @@ - * configuration of this extension). - * - */ --#define MBEDTLS_SSL_RENEGOTIATION -+//#define MBEDTLS_SSL_RENEGOTIATION - - /** - * \def MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO -@@ -2022,7 +2022,7 @@ - * - * Comment this macro to disable support for truncated HMAC in SSL - */ --#define MBEDTLS_SSL_TRUNCATED_HMAC -+//#define MBEDTLS_SSL_TRUNCATED_HMAC - - /** - * \def MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT -@@ -2201,7 +2201,7 @@ - * - * Comment this to disable run-time checking and save ROM space - */ --#define MBEDTLS_VERSION_FEATURES -+//#define MBEDTLS_VERSION_FEATURES - - /** - * \def MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 -@@ -2550,7 +2550,7 @@ - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 - */ --#define MBEDTLS_CAMELLIA_C -+//#define MBEDTLS_CAMELLIA_C - - /** - * \def MBEDTLS_ARIA_C -@@ -2616,7 +2616,7 @@ - * This module enables the AES-CCM ciphersuites, if other requisites are - * enabled as well. - */ --#define MBEDTLS_CCM_C -+//#define MBEDTLS_CCM_C - - /** - * \def MBEDTLS_CERTS_C -@@ -2628,7 +2628,7 @@ - * - * This module is used for testing (ssl_client/server). - */ --#define MBEDTLS_CERTS_C -+//#define MBEDTLS_CERTS_C - - /** - * \def MBEDTLS_CHACHA20_C -@@ -2741,7 +2741,7 @@ - * \warning DES is considered a weak cipher and its use constitutes a - * security risk. We recommend considering stronger ciphers instead. - */ --#define MBEDTLS_DES_C -+//#define MBEDTLS_DES_C - - /** - * \def MBEDTLS_DHM_C -@@ -2906,7 +2906,7 @@ - * This module adds support for the Hashed Message Authentication Code - * (HMAC)-based key derivation function (HKDF). - */ --#define MBEDTLS_HKDF_C -+//#define MBEDTLS_HKDF_C - - /** - * \def MBEDTLS_HMAC_DRBG_C -@@ -3219,7 +3219,7 @@ - * - * This module enables abstraction of common (libc) functions. - */ --#define MBEDTLS_PLATFORM_C -+//#define MBEDTLS_PLATFORM_C - - /** - * \def MBEDTLS_POLY1305_C -@@ -3295,7 +3295,7 @@ - * Caller: library/md.c - * - */ --#define MBEDTLS_RIPEMD160_C -+//#define MBEDTLS_RIPEMD160_C - - /** - * \def MBEDTLS_RSA_C -@@ -3506,7 +3506,7 @@ - * - * This module provides run-time version information. - */ --#define MBEDTLS_VERSION_C -+//#define MBEDTLS_VERSION_C - - /** - * \def MBEDTLS_X509_USE_C -@@ -3616,7 +3616,7 @@ - * Module: library/xtea.c - * Caller: - */ --#define MBEDTLS_XTEA_C -+//#define MBEDTLS_XTEA_C - - /** \} name SECTION: mbed TLS modules */ - diff --git a/package/libs/ncurses/Makefile b/package/libs/ncurses/Makefile index 14f74082af..4d8e685f35 100644 --- a/package/libs/ncurses/Makefile +++ b/package/libs/ncurses/Makefile @@ -9,12 +9,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ncurses PKG_CPE_ID:=cpe:/a:gnu:ncurses -PKG_VERSION:=6.3 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=6.4 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@GNU/$(PKG_NAME) -PKG_HASH:=97fc51ac2b085d4cde31ef4d2c3122c21abc217e9090a43a30fc5ec21684e059 +PKG_HASH:=6931283d9ac87c5073f30b6290c4c75f21632bb4fc3603ac8100812bed248159 PKG_LICENSE:=MIT PKG_LICENSE_FILES:=README @@ -123,6 +123,7 @@ ifneq ($(HOST_OS),FreeBSD) ) for file in \ a/ansi \ + a/alacritty \ d/dumb \ l/linux \ r/rxvt \ diff --git a/package/libs/ncurses/patches/100-ncurses-5.6-20080112-urxvt.patch b/package/libs/ncurses/patches/100-ncurses-5.6-20080112-urxvt.patch index 2fdbb7b0be..70d64bd8e1 100644 --- a/package/libs/ncurses/patches/100-ncurses-5.6-20080112-urxvt.patch +++ b/package/libs/ncurses/patches/100-ncurses-5.6-20080112-urxvt.patch @@ -1,6 +1,6 @@ --- a/misc/terminfo.src +++ b/misc/terminfo.src -@@ -6616,6 +6616,172 @@ rxvt-cygwin-native|rxvt terminal emulato +@@ -6886,6 +6886,172 @@ rxvt-cygwin-native|rxvt terminal emulato rxvt-16color|rxvt with 16 colors like aixterm, ncv#32, use=ibm+16color, use=rxvt, diff --git a/package/libs/ncurses/patches/101-ncurses-5.6-20080628-kbs.patch b/package/libs/ncurses/patches/101-ncurses-5.6-20080628-kbs.patch index 2d299197b0..9f00350a46 100644 --- a/package/libs/ncurses/patches/101-ncurses-5.6-20080628-kbs.patch +++ b/package/libs/ncurses/patches/101-ncurses-5.6-20080628-kbs.patch @@ -1,14 +1,14 @@ --- a/misc/terminfo.src +++ b/misc/terminfo.src -@@ -4815,6 +4815,7 @@ xterm+nofkeys|building block for xterm f - # This version reflects the current xterm features. - xterm-new|modern xterm terminal emulator, +@@ -4984,6 +4984,7 @@ xterm-xfree86|xterm terminal emulator (X + + xterm+nofkeys|building block for xterm fkey-variants, npc, + kbs=\177, kcbt=\E[Z, kent=\EOM, nel=\EE, use=ecma+index, - use=ansi+rep, use=ecma+strikeout, use=xterm+pcfkeys, - use=xterm+nofkeys, -@@ -6416,6 +6417,7 @@ mlterm-256color|mlterm 3.0 with xterm 25 + use=ansi+rep, use=ecma+strikeout, use=vt420+lrmm, + use=xterm+sm+1006, use=xterm+tmux, use=ecma+italics, +@@ -6689,6 +6690,7 @@ mlterm-256color|mlterm 3.0 with xterm 25 rxvt-basic|rxvt terminal base (X Window System), OTbs, am, bce, eo, mir, msgr, xenl, xon, XT, cols#80, it#8, lines#24, @@ -16,24 +16,24 @@ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, -@@ -6425,7 +6427,7 @@ rxvt-basic|rxvt terminal base (X Window +@@ -6698,7 +6700,7 @@ rxvt-basic|rxvt terminal base (X Window enacs=\E(B\E)0, flash=\E[?5h$<100/>\E[?5l, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, is1=\E[?47l\E=\E[?1l, - is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, kbs=^H, + is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, kcbt=\E[Z, kmous=\E[M, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O, - rmcup=\E[2J\E[?47l\E8, rmir=\E[4l, rmkx=\E>, rmso=\E[27m, - rmul=\E[24m, -@@ -8060,6 +8062,7 @@ dumb-emacs-ansi|Emacs dumb terminal with - screen|VT 100/ANSI X3.64 virtual terminal, + rmir=\E[4l, rmkx=\E>, rmso=\E[27m, rmul=\E[24m, + rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, +@@ -8347,6 +8349,7 @@ dumb-emacs-ansi|Emacs dumb terminal with + screen-base|VT 100/ANSI X3.64 virtual terminal (base), OTbs, OTpt, am, km, mir, msgr, xenl, G0, colors#8, cols#80, it#8, lines#24, ncv@, pairs#64, U8#1, + kbs=\177, acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy yzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, -@@ -8071,7 +8074,7 @@ screen|VT 100/ANSI X3.64 virtual termina +@@ -8358,7 +8361,7 @@ screen-base|VT 100/ANSI X3.64 virtual te dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0, flash=\Eg, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, @@ -42,7 +42,7 @@ kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, -@@ -8199,6 +8202,7 @@ screen.xterm-r6|screen customized for X1 +@@ -8500,6 +8503,7 @@ screen.xterm-r6|screen customized for X1 # on Solaris because Sun's curses implementation gets confused. screen.teraterm|disable ncv in teraterm, ncv#127, diff --git a/package/libs/ncurses/patches/102-ncurses-5.9-gcc-5.patch b/package/libs/ncurses/patches/102-ncurses-5.9-gcc-5.patch index a6398acf8e..5f1461b7b0 100644 --- a/package/libs/ncurses/patches/102-ncurses-5.9-gcc-5.patch +++ b/package/libs/ncurses/patches/102-ncurses-5.9-gcc-5.patch @@ -15,7 +15,7 @@ Subject: [PATCH] ncurses 5.9 - patch 20141206 --- a/ncurses/base/MKlib_gen.sh +++ b/ncurses/base/MKlib_gen.sh -@@ -511,11 +511,22 @@ sed -n -f $ED1 \ +@@ -512,11 +512,22 @@ sed -n -f $ED1 \ -e 's/gen_$//' \ -e 's/ / /g' >>$TMP diff --git a/package/libs/ncurses/patches/103-ncurses-ar-determinism.patch b/package/libs/ncurses/patches/103-ncurses-ar-determinism.patch index 5ef8ab7ab0..a4599130cc 100644 --- a/package/libs/ncurses/patches/103-ncurses-ar-determinism.patch +++ b/package/libs/ncurses/patches/103-ncurses-ar-determinism.patch @@ -1,6 +1,6 @@ --- a/aclocal.m4 +++ b/aclocal.m4 -@@ -505,7 +505,7 @@ AC_CACHE_CHECK(for options to update arc +@@ -523,7 +523,7 @@ AC_CACHE_CHECK(for options to update arc ;; (*) cf_cv_ar_flags=unknown @@ -11,7 +11,7 @@ # check if $ARFLAGS already contains this choice --- a/configure +++ b/configure -@@ -5072,7 +5072,7 @@ else +@@ -5110,7 +5110,7 @@ else ;; (*) cf_cv_ar_flags=unknown diff --git a/package/libs/ncurses/patches/900-terminfo.patch b/package/libs/ncurses/patches/900-terminfo.patch index 96d78cde34..86e3bc16b2 100644 --- a/package/libs/ncurses/patches/900-terminfo.patch +++ b/package/libs/ncurses/patches/900-terminfo.patch @@ -1,6 +1,6 @@ --- a/misc/terminfo.src +++ b/misc/terminfo.src -@@ -6240,12 +6240,11 @@ konsole-xf3x|KDE console window with key +@@ -6514,12 +6514,11 @@ konsole-xf3x|KDE console window with key # The value for kbs (see konsole-vt100) reflects local customization rather # than the settings used for XFree86 xterm. konsole-xf4x|KDE console window with keyboard for XFree86 4.x xterm, diff --git a/package/libs/nettle/Makefile b/package/libs/nettle/Makefile index 87853baa82..e8dcb8ba91 100644 --- a/package/libs/nettle/Makefile +++ b/package/libs/nettle/Makefile @@ -8,16 +8,17 @@ include $(TOPDIR)/rules.mk PKG_NAME:=nettle -PKG_VERSION:=3.7.3 -PKG_RELEASE:=$(AUTORELEASE) -PKG_USE_MIPS16:=0 +PKG_VERSION:=3.9.1 +PKG_RELEASE:=1 +PKG_BUILD_FLAGS:=no-mips16 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@GNU/nettle -PKG_HASH:=661f5eb03f048a3b924c3a8ad2515d4068e40f67e774e8a26827658007e3bcf0 +PKG_HASH:=ccfeff981b0ca71bbd6fbcb054f407c60ffb644389a5be80d6716d5b550c6ce3 PKG_LICENSE:=GPL-2.0-or-later PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:nettle_project:nettle PKG_BUILD_PARALLEL:=1 PKG_CONFIG_DEPENDS := CONFIG_LIBNETTLE_MINI diff --git a/package/libs/nettle/patches/100-portability.patch b/package/libs/nettle/patches/100-portability.patch index 5bbae22752..a44baa296d 100644 --- a/package/libs/nettle/patches/100-portability.patch +++ b/package/libs/nettle/patches/100-portability.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -4661,6 +4661,7 @@ $as_echo_n "checking build system compil +@@ -4719,6 +4719,7 @@ $as_echo_n "checking build system compil # remove anything that might look like compiler output to our "||" expression rm -f conftest* a.out b.out a.exe a_out.exe cat >conftest.c <conftest.c <conftest.c <conftest.c < +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=COPYING + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/libnghttp2 + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Library implementing the framing layer of HTTP/2 + ABI_VERSION:=14 +endef + +define Package/libnghttp2/description + C library implementing the framing layer of the HTTP/2 protocol. It can be used to build a HTTP/2-capable HTTP client or server +endef + +CMAKE_OPTIONS += \ + -DENABLE_LIB_ONLY=ON + +define Build/InstallDev + $(call Build/InstallDev/cmake,$(1)) + $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/libnghttp2.pc + $(SED) 's,/usr/lib,$$$${prefix}/lib,g' $(1)/usr/lib/pkgconfig/libnghttp2.pc +endef + +define Package/libnghttp2/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnghttp2.so.* $(1)/usr/lib +endef + +$(eval $(call BuildPackage,libnghttp2)) diff --git a/package/libs/nghttp3/Makefile b/package/libs/nghttp3/Makefile new file mode 100644 index 0000000000..6573977fbd --- /dev/null +++ b/package/libs/nghttp3/Makefile @@ -0,0 +1,38 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=nghttp3 +PKG_VERSION:=1.1.0 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/ngtcp2/nghttp3/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=b3ffb23a90442a0eafe8bfbefbc8b4ffb5179d68a7c0b8a416a34cf04b28d7c5 + +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=COPYING +PKG_MAINTAINER:=Stan Grishin + +CMAKE_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/libnghttp3 + SECTION:=libs + CATEGORY:=Libraries + TITLE:=HTTP/3 library written in C + URL:=https://nghttp2.org/nghttp3 +endef + +define Package/libnghttp3/description +nghttp3 is a thin HTTP/3 layer over an underlying QUIC stack. +endef + +CMAKE_OPTIONS += -DENABLE_LIB_ONLY=ON + +define Package/libnghttp3/install + $(INSTALL_DIR) $(1)/usr/lib + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libnghttp3.so* $(1)/usr/lib +endef + +$(eval $(call BuildPackage,libnghttp3)) diff --git a/package/libs/ngtcp2/Makefile b/package/libs/ngtcp2/Makefile new file mode 100644 index 0000000000..dc5d04db5e --- /dev/null +++ b/package/libs/ngtcp2/Makefile @@ -0,0 +1,40 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=ngtcp2 +PKG_VERSION:=1.1.0 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/ngtcp2/ngtcp2/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=987d784643edea4f2859c405f7dfbc53871a9f7ae5fcddf5fb12ec5dfce1ef22 + +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=COPYING +PKG_MAINTAINER:=Stan Grishin + +CMAKE_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/libngtcp2 + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Implementation of QUIC protocol + URL:=https://nghttp2.org/ngtcp2 + DEPENDS:=+libnghttp3 +libopenssl +endef + +define Package/libngtcp2/description +ngtcp2 project is an effort to implement QUIC protocol which is now being +discussed in IETF QUICWG for its standardization. +endef + +CMAKE_OPTIONS += -DENABLE_LIB_ONLY=ON + +define Package/libngtcp2/install + $(INSTALL_DIR) $(1)/usr/lib + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libngtcp2*.so* $(1)/usr/lib +endef + +$(eval $(call BuildPackage,libngtcp2)) diff --git a/package/libs/openssl/Config.in b/package/libs/openssl/Config.in index ac086787f0..871080a4cb 100644 --- a/package/libs/openssl/Config.in +++ b/package/libs/openssl/Config.in @@ -8,33 +8,33 @@ config OPENSSL_OPTIMIZE_SPEED prompt "Enable optimization for speed instead of size" select OPENSSL_WITH_ASM help - Enabling this option increases code size (around 20%) and - performance. The increase in performance and size depends on the - target CPU. EC and AES seem to benefit the most, with EC speed - increased by 20%-50% (mipsel & x86). - AES-GCM is supposed to be 3x faster on x86. YMMV. + Enabling this option increases code size and performance. + The increase in performance and size depends on the + target CPU. EC and AES seem to benefit the most. + +config OPENSSL_SMALL_FOOTPRINT + bool + depends on !OPENSSL_OPTIMIZE_SPEED + default y if SMALL_FLASH || LOW_MEMORY_FOOTPRINT + prompt "Build with OPENSSL_SMALL_FOOTPRINT (read help)" + help + This turns on -DOPENSSL_SMALL_FOOTPRINT. This will save only + 1-3% of of the ipk size. The performance drop depends on + architecture and algorithm. MIPS drops 13% of performance for + a 3% decrease in ipk size. On Aarch64, for a 1% reduction in + size, ghash and GCM performance decreases 90%, while + Chacha20-Poly1305 is 15% slower. X86_64 drops 1% of its size + for 3% of performance. Other arches have not been tested. config OPENSSL_WITH_ASM bool - default y if !SMALL_FLASH || !arm + default y prompt "Compile with optimized assembly code" depends on !arc help Disabling this option will reduce code size and performance. The increase in performance and size depends on the target - CPU and on the algorithms being optimized. As of 1.1.0i*: - - Platform Pkg Inc. Algorithms where assembly is used - ~% Speed Increase - aarch64 174K BN, aes, sha1, sha256, sha512, nist256, poly1305 - arm 152K BN, aes, sha1, sha256, sha512, nist256, poly1305 - i386 183K BN+147%, aes+300%, rc4+55%, sha1+160%, sha256+114%, sha512+270%, nist256+282%, poly1305+292% - mipsel 1.5K BN+97%, aes+4%, sha1+94%, sha256+60% - mips64 3.7K BN, aes, sha1, sha256, sha512, poly1305 - powerpc 20K BN, aes, sha1, sha256, sha512, poly1305 - x86_64 228K BN+220%, aes+173%, rc4+38%, sha1+40%, sha256+64%, sha512+31%, nist256+354%, poly1305+228% - - * Only most common algorithms shown. Your mileage may vary. - BN (bignum) performance was measured using RSA sign/verify. + CPU and on the algorithms being optimized. config OPENSSL_WITH_SSE2 bool @@ -42,21 +42,17 @@ config OPENSSL_WITH_SSE2 prompt "Enable use of x86 SSE2 instructions" depends on OPENSSL_WITH_ASM && i386 help - Use of SSE2 instructions greatly increase performance (up to - 3x faster) with a minimum (~0.2%, or 23KB) increase in package - size, but it will bring no benefit if your hardware does not - support them, such as Geode GX and LX. In this case you may - save 23KB by saying yes here. AMD Geode NX, and Intel - Pentium 4 and above support SSE2. + Use of SSE2 instructions greatly increase performance with a + minimum increase in package size, but it will bring no benefit + if your hardware does not support them, such as Geode GX and LX. + AMD Geode NX, and Intel Pentium 4 and above support SSE2. config OPENSSL_WITH_DEPRECATED bool default y - prompt "Include deprecated APIs (See help for a list of packages that need this)" + prompt "Include deprecated APIs" help - Since openssl 1.1.x is still new to librecmc, some packages - requiring this option do not list it as a requirement yet: - * freeswitch-stable, freeswitch, python, python3, squid. + This drops all deprecated API, including engine support. config OPENSSL_NO_DEPRECATED bool @@ -64,7 +60,7 @@ config OPENSSL_NO_DEPRECATED config OPENSSL_WITH_ERROR_MESSAGES bool - default y if !SMALL_FLASH && !LOW_MEMORY_FOOTPRINT + default y if !OPENSSL_SMALL_FOOTPRINT || (!SMALL_FLASH && !LOW_MEMORY_FOOTPRINT) prompt "Include error messages" help This option aids debugging, but increases package size and @@ -84,7 +80,6 @@ config OPENSSL_WITH_TLS13 protocol; * to increase performance by reducing the number of round-trips when performing a full handshake. - It increases package size by ~4KB. config OPENSSL_WITH_DTLS bool @@ -172,16 +167,24 @@ config OPENSSL_WITH_CAMELLIA config OPENSSL_WITH_IDEA bool - prompt "Enable IDEA cipher support" + default y if !SMALL_FLASH + prompt "Enable IDEA cipher support (needs legacy provider)" help IDEA is a block cipher with 128-bit keys. + To use the cipher, one must install the libopenssl-legacy + package, using a main libopenssl package compiled with this + option enabled as well. config OPENSSL_WITH_SEED bool - prompt "Enable SEED cipher support" + default y if !SMALL_FLASH + prompt "Enable SEED cipher support (needs legacy provider)" help SEED is a block cipher with 128-bit keys broadly used in South Korea, but seldom found elsewhere. + To use the cipher, one must install the libopenssl-legacy + package, using a main libopenssl package compiled with this + option enabled as well. config OPENSSL_WITH_SM234 bool @@ -202,11 +205,21 @@ config OPENSSL_WITH_BLAKE2 config OPENSSL_WITH_MDC2 bool - prompt "Enable MDC2 digest support" + default y if !SMALL_FLASH + prompt "Enable MDC2 digest support (needs legacy provider)" + help + To use the digest, one must install the libopenssl-legacy + package, using a main libopenssl package compiled with this + option enabled as well. config OPENSSL_WITH_WHIRLPOOL bool - prompt "Enable Whirlpool digest support" + default y if !SMALL_FLASH + prompt "Enable Whirlpool digest support (needs legacy provider)" + help + To use the digest, one must install the libopenssl-legacy + package, using a main libopenssl package compiled with this + option enabled as well. config OPENSSL_WITH_COMPRESSION bool @@ -233,6 +246,7 @@ comment "Engine/Hardware Support" config OPENSSL_ENGINE bool "Enable engine support" + select OPENSSL_WITH_DEPRECATED default y help This enables alternative cryptography implementations, diff --git a/package/libs/openssl/Makefile b/package/libs/openssl/Makefile index e06dc68b50..93052deffa 100644 --- a/package/libs/openssl/Makefile +++ b/package/libs/openssl/Makefile @@ -8,14 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=openssl -PKG_BASE:=1.1.1 -PKG_BUGFIX:=t -PKG_VERSION:=$(PKG_BASE)$(PKG_BUGFIX) -PKG_RELEASE:=3 -PKG_USE_MIPS16:=0 +PKG_VERSION:=3.0.12 +PKG_RELEASE:=1 +PKG_BUILD_FLAGS:=no-mips16 gc-sections no-lto PKG_BUILD_PARALLEL:=1 +PKG_BASE:=$(subst $(space),.,$(wordlist 1,2,$(subst .,$(space),$(PKG_VERSION)))) PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:= \ http://www.openssl.org/source/ \ @@ -25,9 +24,9 @@ PKG_SOURCE_URL:= \ ftp://ftp.pca.dfn.de/pub/tools/net/openssl/source/ \ ftp://ftp.pca.dfn.de/pub/tools/net/openssl/source/old/$(PKG_BASE)/ -PKG_HASH:=8dee9b24bdb1dcbf0c3d1e9b02fb8f6bf22165e807f45adeb7c9677536859d3b +PKG_HASH:=f93c9e8edde5e9166119de31755fc87b4aa34863662f67ddfcba14d0b6b69b61 -PKG_LICENSE:=OpenSSL +PKG_LICENSE:=Apache-2.0 PKG_LICENSE_FILES:=LICENSE PKG_MAINTAINER:=Eneas U de Queiroz PKG_CPE_ID:=cpe:/a:openssl:openssl @@ -40,6 +39,7 @@ PKG_CONFIG_DEPENDS:= \ CONFIG_OPENSSL_NO_DEPRECATED \ CONFIG_OPENSSL_OPTIMIZE_SPEED \ CONFIG_OPENSSL_PREFER_CHACHA_OVER_GCM \ + CONFIG_OPENSSL_SMALL_FOOTPRINT \ CONFIG_OPENSSL_WITH_ARIA \ CONFIG_OPENSSL_WITH_ASM \ CONFIG_OPENSSL_WITH_ASYNC \ @@ -64,7 +64,7 @@ PKG_CONFIG_DEPENDS:= \ CONFIG_OPENSSL_WITH_WHIRLPOOL include $(INCLUDE_DIR)/package.mk -include engine.mk +include $(INCLUDE_DIR)/openssl-module.mk ifneq ($(CONFIG_CCACHE),) HOSTCC=$(HOSTCC_NOCACHE) @@ -95,9 +95,10 @@ $(call Package/openssl/Default) DEPENDS:=+OPENSSL_WITH_COMPRESSION:zlib \ +OPENSSL_ENGINE_BUILTIN_AFALG:kmod-crypto-user \ +OPENSSL_ENGINE_BUILTIN_DEVCRYPTO:kmod-cryptodev \ - +OPENSSL_ENGINE_BUILTIN_PADLOCK:kmod-crypto-hw-padlock + +OPENSSL_ENGINE_BUILTIN_PADLOCK:kmod-crypto-hw-padlock \ + +(arm||armeb||mips||mipsel||powerpc||arc):libatomic TITLE+= (libraries) - ABI_VERSION:=1.1 + ABI_VERSION:=$(firstword $(subst .,$(space),$(PKG_VERSION))) MENU:=1 endef @@ -128,8 +129,8 @@ endef define Package/libopenssl-conf/conffiles /etc/ssl/openssl.cnf -$(if $(CONFIG_OPENSSL_ENGINE_BUILTIN_DEVCRYPTO),/etc/ssl/engines.cnf.d/devcrypto.cnf) -$(if $(CONFIG_OPENSSL_ENGINE_BUILTIN_PADLOCK),/etc/ssl/engines.cnf.d/padlock.cnf) +$(if $(CONFIG_OPENSSL_ENGINE_BUILTIN_DEVCRYPTO),/etc/ssl/modules.cnf.d/devcrypto.cnf) +$(if $(CONFIG_OPENSSL_ENGINE_BUILTIN_PADLOCK),/etc/ssl/modules.cnf.d/padlock.cnf) endef define Package/libopenssl-conf/description @@ -137,6 +138,37 @@ $(call Package/openssl/Default/description) This package installs the OpenSSL configuration file /etc/ssl/openssl.cnf. endef +ifneq ($(CONFIG_OPENSSL_ENGINE_BUILTIN_PADLOCK)$(CONFIG_OPENSSL_ENGINE_BUILTIN_DEVCRYPTO),) +define Package/libopenssl-conf/postinst +#!/bin/sh + +add_engine_config() { + if [ -z "$${IPKG_INSTROOT}" ] && uci -q get "openssl.$$1" >/dev/null; then + [ "$$(uci -q get "openssl.$$1.builtin")" = 1 ] && return + uci set "openssl.$$1.builtin=1" && uci commit openssl + return + fi +} + +$(if $(CONFIG_OPENSSL_ENGINE_BUILTIN_DEVCRYPTO),add_engine_config devcrypto) +$(if $(CONFIG_OPENSSL_ENGINE_BUILTIN_PADLOCK),add_engine_config padlock) +endef +endif + +$(eval $(call Package/openssl/add-provider,legacy)) +define Package/libopenssl-legacy + $(call Package/openssl/Default) + $(call Package/openssl/module/Default) + TITLE:=OpenSSL legacy provider +endef + +define Package/libopenssl-legacy/description +The OpenSSL legacy provider supplies OpenSSL implementations of algorithms that +have been deemed legacy. Such algorithms have commonly fallen out of use, have +been deemed insecure by the cryptography community, or something similar. See +https://www.openssl.org/docs/man3.0/man7/OSSL_PROVIDER-legacy.html +endef + $(eval $(call Package/openssl/add-engine,afalg)) define Package/libopenssl-afalg $(call Package/openssl/Default) @@ -149,7 +181,7 @@ endef define Package/libopenssl-afalg/description This package adds an engine that enables hardware acceleration through the AF_ALG kernel interface. -See https://www.openssl.org/docs/man1.1.1/man5/config.html#Engine-Configuration-Module +See https://www.openssl.org/docs/man3.0/man5/config.html#Engine-Configuration and https://openwrt.org/docs/techref/hardware/cryptographic.hardware.accelerators The engine_id is "afalg" endef @@ -165,7 +197,7 @@ endef define Package/libopenssl-devcrypto/description This package adds an engine that enables hardware acceleration through the /dev/crypto kernel interface. -See https://www.openssl.org/docs/man1.1.1/man5/config.html#Engine-Configuration-Module +See https://www.openssl.org/docs/man3.0/man5/config.html#Engine-Configuration and https://openwrt.org/docs/techref/hardware/cryptographic.hardware.accelerators The engine_id is "devcrypto" endef @@ -181,12 +213,12 @@ endef define Package/libopenssl-padlock/description This package adds an engine that enables VIA Padlock hardware acceleration. -See https://www.openssl.org/docs/man1.1.1/man5/config.html#Engine-Configuration-Module +See https://www.openssl.org/docs/man3.0/man5/config.html#Engine-Configuration and https://openwrt.org/docs/techref/hardware/cryptographic.hardware.accelerators The engine_id is "padlock" endef -OPENSSL_OPTIONS:= shared +OPENSSL_OPTIONS:= shared no-tests ifndef CONFIG_OPENSSL_WITH_BLAKE2 OPENSSL_OPTIONS += no-blake2 @@ -258,7 +290,9 @@ endif ifeq ($(CONFIG_OPENSSL_OPTIMIZE_SPEED),y) TARGET_CFLAGS := $(filter-out -O%,$(TARGET_CFLAGS)) -O3 -else +endif + +ifeq ($(CONFIG_OPENSSL_SMALL_FOOTPRINT),y) OPENSSL_OPTIONS += -DOPENSSL_SMALL_FOOTPRINT endif @@ -272,7 +306,7 @@ ifdef CONFIG_OPENSSL_ENGINE OPENSSL_OPTIONS += enable-devcryptoeng endif ifndef CONFIG_OPENSSL_ENGINE_BUILTIN_PADLOCK - OPENSSL_OPTIONS += no-hw-padlock + OPENSSL_OPTIONS += no-padlockeng endif else ifdef CONFIG_PACKAGE_libopenssl-devcrypto @@ -282,7 +316,7 @@ ifdef CONFIG_OPENSSL_ENGINE OPENSSL_OPTIONS += no-afalgeng endif ifndef CONFIG_PACKAGE_libopenssl-padlock - OPENSSL_OPTIONS += no-hw-padlock + OPENSSL_OPTIONS += no-padlockeng endif endif else @@ -332,6 +366,7 @@ define Build/Configure --libdir=lib \ --openssldir=/etc/ssl \ --cross-compile-prefix="$(TARGET_CROSS)" \ + $(TARGET_CFLAGS) \ $(TARGET_CPPFLAGS) \ $(TARGET_LDFLAGS) \ $(OPENSSL_OPTIONS) && \ @@ -339,8 +374,7 @@ define Build/Configure ) endef -TARGET_CFLAGS += $(FPIC) -ffunction-sections -fdata-sections -TARGET_LDFLAGS += -Wl,--gc-sections +TARGET_CFLAGS += $(FPIC) define Build/Compile +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \ @@ -377,17 +411,17 @@ define Package/libopenssl/install endef define Package/libopenssl-conf/install - $(INSTALL_DIR) $(1)/etc/ssl/engines.cnf.d $(1)/etc/config $(1)/etc/init.d + $(INSTALL_DIR) $(1)/etc/ssl/modules.cnf.d $(1)/etc/config $(1)/etc/init.d $(CP) $(PKG_INSTALL_DIR)/etc/ssl/openssl.cnf $(1)/etc/ssl/ $(INSTALL_BIN) ./files/openssl.init $(1)/etc/init.d/openssl $(SED) 's!%ENGINES_DIR%!/usr/lib/$(ENGINES_DIR)!' $(1)/etc/init.d/openssl touch $(1)/etc/config/openssl $(if $(CONFIG_OPENSSL_ENGINE_BUILTIN_DEVCRYPTO), - $(CP) ./files/devcrypto.cnf $(1)/etc/ssl/engines.cnf.d/ - echo -e "config engine 'devcrypto'\n\toption enabled '1'" >> $(1)/etc/config/openssl) + $(CP) ./files/devcrypto.cnf $(1)/etc/ssl/modules.cnf.d/ + echo -e "config engine 'devcrypto'\n\toption enabled '1'\n\toption builtin '1'" >> $(1)/etc/config/openssl) $(if $(CONFIG_OPENSSL_ENGINE_BUILTIN_PADLOCK), - $(CP) ./files/padlock.cnf $(1)/etc/ssl/engines.cnf.d/ - echo -e "\nconfig engine 'padlock'\n\toption enabled '1'" >> $(1)/etc/config/openssl) + $(CP) ./files/padlock.cnf $(1)/etc/ssl/modules.cnf.d/ + echo -e "\nconfig engine 'padlock'\n\toption enabled '1'\n\toption builtin '1'" >> $(1)/etc/config/openssl) endef define Package/openssl-util/install @@ -399,5 +433,6 @@ $(eval $(call BuildPackage,libopenssl)) $(eval $(call BuildPackage,libopenssl-conf)) $(eval $(call BuildPackage,libopenssl-afalg)) $(eval $(call BuildPackage,libopenssl-devcrypto)) +$(eval $(call BuildPackage,libopenssl-legacy)) $(eval $(call BuildPackage,libopenssl-padlock)) $(eval $(call BuildPackage,openssl-util)) diff --git a/package/libs/openssl/engine.mk b/package/libs/openssl/engine.mk deleted file mode 100644 index 973a989904..0000000000 --- a/package/libs/openssl/engine.mk +++ /dev/null @@ -1,46 +0,0 @@ -ENGINES_DIR=engines-1.1 - -define Package/openssl/engine/Default - SECTION:=libs - CATEGORY:=Libraries - SUBMENU:=SSL - DEPENDS:=libopenssl @OPENSSL_ENGINE +libopenssl-conf -endef - -# 1 = engine name -# 2 - package name, defaults to libopenssl-$(1) -define Package/openssl/add-engine - OSSL_ENG_PKG:=$(if $(2),$(2),libopenssl-$(1)) - Package/$$(OSSL_ENG_PKG)/conffiles:=/etc/ssl/engines.cnf.d/$(1).cnf - - define Package/$$(OSSL_ENG_PKG)/install - $$(INSTALL_DIR) $$(1)/usr/lib/$(ENGINES_DIR) - $$(INSTALL_BIN) $$(PKG_INSTALL_DIR)/usr/lib/$(ENGINES_DIR)/$(1).so \ - $$(1)/usr/lib/$(ENGINES_DIR) - $$(INSTALL_DIR) $$(1)/etc/ssl/engines.cnf.d - $$(INSTALL_DATA) ./files/$(1).cnf $$(1)/etc/ssl/engines.cnf.d/ - endef - - define Package/$$(OSSL_ENG_PKG)/postinst := -#!/bin/sh -OPENSSL_UCI="$$$${IPKG_INSTROOT}/etc/config/openssl" - -[ -z "$$$${IPKG_INSTROOT}" ] && uci -q get openssl.$(1) >/dev/null && exit 0 - -cat << EOF >> "$$$${OPENSSL_UCI}" - -config engine '$(1)' - option enabled '1' -EOF - -[ -n "$$$${IPKG_INSTROOT}" ] || /etc/init.d/openssl reload - endef - - define Package/$$(OSSL_ENG_PKG)/postrm := -#!/bin/sh -[ -n "$$$${IPKG_INSTROOT}" ] && exit 0 -uci delete openssl.$(1) -uci commit openssl -/etc/init.d/openssl reload - endef -endef diff --git a/package/libs/openssl/files/afalg.cnf b/package/libs/openssl/files/afalg.cnf index 4f573d757c..fd206361bf 100644 --- a/package/libs/openssl/files/afalg.cnf +++ b/package/libs/openssl/files/afalg.cnf @@ -1,3 +1,3 @@ -[afalg] +[afalg_sect] default_algorithms = ALL diff --git a/package/libs/openssl/files/devcrypto.cnf b/package/libs/openssl/files/devcrypto.cnf index 549275600d..91d0eee17f 100644 --- a/package/libs/openssl/files/devcrypto.cnf +++ b/package/libs/openssl/files/devcrypto.cnf @@ -1,4 +1,4 @@ -[devcrypto] +[devcrypto_sect] # Leave this alone and configure algorithms with CIPERS/DIGESTS below default_algorithms = ALL @@ -17,8 +17,9 @@ default_algorithms = ALL # It is recommended to disable the ECB ciphers; in most cases, it will # only be used for PRNG, in small blocks, where performance is poor, # and there may be problems with apps forking with open crypto -# contexts, leading to failures. The CBC ciphers work well: -#CIPHERS=DES-CBC, DES-EDE3-CBC, AES-128-CBC, AES-192-CBC, AES-256-CBC +# contexts, leading to failures. The CBC ciphers work well. +CIPHERS=DES-CBC, DES-EDE3-CBC, AES-128-CBC, AES-192-CBC, AES-256-CBC, \ + AES-128-CTR, AES-192-CTR, AES-256-CTR # DIGESTS: either ALL, NONE, or a comma-separated list of digests to # enable [default=NONE] @@ -26,6 +27,8 @@ default_algorithms = ALL # is poor, and there are many cases in which they will not work, # especially when calling fork with open crypto contexts. Openssh, # for example, does this, and you may not be able to login. -#DIGESTS = NONE - +# Sysupgrade will fail as well. If you're adventurous enough to change +# this, you should change it back to NONE, and reboot before running +# sysupgrade! +DIGESTS = NONE diff --git a/package/libs/openssl/files/legacy.cnf b/package/libs/openssl/files/legacy.cnf new file mode 100644 index 0000000000..4c20617444 --- /dev/null +++ b/package/libs/openssl/files/legacy.cnf @@ -0,0 +1,3 @@ +[legacy_sect] +activate = 1 + diff --git a/package/libs/openssl/files/openssl.init b/package/libs/openssl/files/openssl.init index 21e253e7a5..1c1e8745ff 100755 --- a/package/libs/openssl/files/openssl.init +++ b/package/libs/openssl/files/openssl.init @@ -1,31 +1,72 @@ #!/bin/sh /etc/rc.common START=13 -ENGINES_CNF_D="/etc/ssl/engines.cnf.d" -ENGINES_CNF="/var/etc/ssl/engines.cnf" -ENGINES_DIR="%ENGINES_DIR%" +ENGINES_CNF=/var/etc/ssl/engines.cnf +ENGINES_DIR=%ENGINES_DIR% +MODULES_DIR=/usr/lib/ossl-modules +PROVIDERS_CNF=/var/etc/ssl/providers.cnf -config_engine() { - local enabled force +#1: cnf file +write_cnf_header() { + mkdir -p "$(dirname "$1")" && \ + echo "# This file is automatically generated from /etc/config/openssl." >"$1" || { + echo "Error writing to $1." + return 1 + } +} + + +#1: module name +#2: output cnf file +#3: module.so +enable_module() { + local builtin enabled force + + config_get_bool builtin "$1" builtin 0 config_get_bool enabled "$1" enabled 1 config_get_bool force "$1" force 0 - [ "$enabled" = 0 ] && return - if [ "$force" = 0 ] && \ - [ ! -f "${ENGINES_CNF_D}/$1.cnf" ] && \ - [ ! -f "${ENGINES_DIR}/$1.so" ]; then - echo Skipping engine "$1": not installed - return + + if [ "$enabled" = 0 ]; then + [ "$builtin" = 0 ] && return 1 + echo "Engine $1 is built into the libcrypto library and can't be disabled through UCI." + echo "If the engine was not built-in, remove 'config builtin' from /etc/config/openssl." + elif [ "$force" = 1 ]; then + printf "[Forced] " + elif ! grep -q "\\[ *$1_sect *]" /etc/ssl/modules.cnf.d/*; then + echo "$1: Could not find section [$1] in config files." + return 1 + elif [ "$builtin" = 1 ]; then + printf "[Builtin] " + elif [ ! -f "$3" ];then + echo "Skipping $1: $3 not found." + return 1 fi - echo Enabling engine "$1" - echo "$1=$1" >> "${ENGINES_CNF}" + echo "Enabling $1" + echo "$1=$1_sect" >>"$2" +} + +config_engine() { + enable_module "$1" "$ENGINES_CNF" \ + "${ENGINES_DIR}/${1}.so" +} + +config_provider() { + enable_module "$1" "$PROVIDERS_CNF" \ + "${MODULES_DIR}/${1}.so" } start() { - mkdir -p "$(dirname "${ENGINES_CNF}")" || exit 1 - echo Generating engines.cnf - echo "# This file is automatically generated from /etc/config/openssl." \ - > "${ENGINES_CNF}" || \ - { echo Error writing ${ENGINES_CNF} >&2; exit 1; } + local ret=0 + config_load openssl - config_foreach config_engine engine + + echo Generating engines.cnf + write_cnf_header "${ENGINES_CNF}" && \ + config_foreach config_engine engine || ret=$? + + echo Generating providers.cnf + write_cnf_header "${PROVIDERS_CNF}" && \ + config_foreach config_provider provider || ret=$? + + return $ret } diff --git a/package/libs/openssl/files/padlock.cnf b/package/libs/openssl/files/padlock.cnf index ef91079e5d..f4085d907b 100644 --- a/package/libs/openssl/files/padlock.cnf +++ b/package/libs/openssl/files/padlock.cnf @@ -1,3 +1,3 @@ -[padlock] +[padlock_sect] default_algorithms = ALL diff --git a/package/libs/openssl/patches/001-crypto-perlasm-ppc-xlate.pl-add-linux64v2-flavour.patch b/package/libs/openssl/patches/001-crypto-perlasm-ppc-xlate.pl-add-linux64v2-flavour.patch deleted file mode 100644 index 3da67e25fc..0000000000 --- a/package/libs/openssl/patches/001-crypto-perlasm-ppc-xlate.pl-add-linux64v2-flavour.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Andy Polyakov -Date: Sun, 5 May 2019 18:25:50 +0200 -Subject: crypto/perlasm/ppc-xlate.pl: add linux64v2 flavour -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This is a big endian ELFv2 configuration. ELFv2 was already being -used for little endian, and big endian was traditionally ELFv1 -but there are practical configurations that use ELFv2 with big -endian nowadays (Adélie Linux, Void Linux, possibly Gentoo, etc.) - -Reviewed-by: Paul Dale -Reviewed-by: Richard Levitte -(Merged from https://github.com/openssl/openssl/pull/8883) - ---- a/crypto/perlasm/ppc-xlate.pl -+++ b/crypto/perlasm/ppc-xlate.pl -@@ -49,7 +49,7 @@ my $globl = sub { - /osx/ && do { $name = "_$name"; - last; - }; -- /linux.*(32|64le)/ -+ /linux.*(32|64(le|v2))/ - && do { $ret .= ".globl $name"; - if (!$$type) { - $ret .= "\n.type $name,\@function"; -@@ -80,7 +80,7 @@ my $globl = sub { - }; - my $text = sub { - my $ret = ($flavour =~ /aix/) ? ".csect\t.text[PR],7" : ".text"; -- $ret = ".abiversion 2\n".$ret if ($flavour =~ /linux.*64le/); -+ $ret = ".abiversion 2\n".$ret if ($flavour =~ /linux.*64(le|v2)/); - $ret; - }; - my $machine = sub { -@@ -186,7 +186,7 @@ my $vmr = sub { - - # Some ABIs specify vrsave, special-purpose register #256, as reserved - # for system use. --my $no_vrsave = ($flavour =~ /aix|linux64le/); -+my $no_vrsave = ($flavour =~ /aix|linux64(le|v2)/); - my $mtspr = sub { - my ($f,$idx,$ra) = @_; - if ($idx == 256 && $no_vrsave) { -@@ -318,7 +318,7 @@ while($line=<>) { - if ($label) { - my $xlated = ($GLOBALS{$label} or $label); - print "$xlated:"; -- if ($flavour =~ /linux.*64le/) { -+ if ($flavour =~ /linux.*64(le|v2)/) { - if ($TYPES{$label} =~ /function/) { - printf "\n.localentry %s,0\n",$xlated; - } diff --git a/package/libs/openssl/patches/100-Configure-afalg-support.patch b/package/libs/openssl/patches/100-Configure-afalg-support.patch index 372dcabf42..5def0a314f 100644 --- a/package/libs/openssl/patches/100-Configure-afalg-support.patch +++ b/package/libs/openssl/patches/100-Configure-afalg-support.patch @@ -10,7 +10,7 @@ Signed-off-by: Eneas U de Queiroz --- a/Configure +++ b/Configure -@@ -1548,7 +1548,9 @@ unless ($disabled{"crypto-mdebug-backtra +@@ -1674,7 +1674,9 @@ $config{CFLAGS} = [ map { $_ eq '--ossl- unless ($disabled{afalgeng}) { $config{afalgeng}=""; diff --git a/package/libs/openssl/patches/110-openwrt_targets.patch b/package/libs/openssl/patches/110-openwrt_targets.patch index 9352b47b58..8784ce426a 100644 --- a/package/libs/openssl/patches/110-openwrt_targets.patch +++ b/package/libs/openssl/patches/110-openwrt_targets.patch @@ -9,7 +9,7 @@ Signed-off-by: Eneas U de Queiroz --- /dev/null +++ b/Configurations/25-librecmc.conf -@@ -0,0 +1,52 @@ +@@ -0,0 +1,56 @@ +## Openwrt "CONFIG_ARCH" matching targets. + +# The targets need to end in '-librecmc' for the AFALG patch to work @@ -23,7 +23,7 @@ Signed-off-by: Eneas U de Queiroz + inherit_from => [ "linux-aarch64", "librecmc" ], + }, + "linux-arc-librecmc" => { -+ inherit_from => [ "linux-generic32", "librecmc" ], ++ inherit_from => [ "linux-latomic", "librecmc" ], + }, + "linux-arm-librecmc" => { + inherit_from => [ "linux-armv4", "librecmc" ], @@ -53,6 +53,10 @@ Signed-off-by: Eneas U de Queiroz + inherit_from => [ "linux-ppc64", "librecmc" ], + perlasm_scheme => "linux64v2", + }, ++ "linux-riscv64-librecmc" => { ++ inherit_from => [ "linux-generic64", "librecmc" ], ++ perlasm_scheme => "linux64", ++ }, + "linux-x86_64-librecmc" => { + inherit_from => [ "linux-x86_64", "librecmc" ], + }, diff --git a/package/libs/openssl/patches/120-strip-cflags-from-binary.patch b/package/libs/openssl/patches/120-strip-cflags-from-binary.patch index 90282706d1..ebdb940b42 100644 --- a/package/libs/openssl/patches/120-strip-cflags-from-binary.patch +++ b/package/libs/openssl/patches/120-strip-cflags-from-binary.patch @@ -10,12 +10,12 @@ Signed-off-by: Eneas U de Queiroz --- a/crypto/build.info +++ b/crypto/build.info -@@ -10,7 +10,7 @@ EXTRA= ../ms/uplink-x86.pl ../ms/uplink - ppccpuid.pl pariscid.pl alphacpuid.pl arm64cpuid.pl armv4cpuid.pl +@@ -109,7 +109,7 @@ DEFINE[../libcrypto]=$UPLINKDEF + DEPEND[info.o]=buildinf.h DEPEND[cversion.o]=buildinf.h -GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(CC) $(LIB_CFLAGS) $(CPPFLAGS_Q)" "$(PLATFORM)" +GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(filter-out -I% -iremap% -fmacro-prefix-map% -ffile-prefix-map%,$(CC) $(LIB_CFLAGS) $(CPPFLAGS_Q))" "$(PLATFORM)" - DEPEND[buildinf.h]=../configdata.pm - GENERATE[uplink-x86.s]=../ms/uplink-x86.pl $(PERLASM_SCHEME) + GENERATE[uplink-x86.S]=../ms/uplink-x86.pl + GENERATE[uplink-x86_64.s]=../ms/uplink-x86_64.pl diff --git a/package/libs/openssl/patches/130-dont-build-fuzz-docs.patch b/package/libs/openssl/patches/130-dont-build-fuzz-docs.patch new file mode 100644 index 0000000000..60c4663923 --- /dev/null +++ b/package/libs/openssl/patches/130-dont-build-fuzz-docs.patch @@ -0,0 +1,20 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Eneas U de Queiroz +Date: Thu, 27 Sep 2018 08:34:38 -0300 +Subject: Do not build tests and fuzz directories + +This shortens build time. + +Signed-off-by: Eneas U de Queiroz + +--- a/build.info ++++ b/build.info +@@ -1,7 +1,7 @@ + # Note that some of these directories are filtered in Configure. Look for + # %skipdir there for further explanations. + +-SUBDIRS=crypto ssl apps util tools fuzz providers doc ++SUBDIRS=crypto ssl apps util tools providers + IF[{- !$disabled{tests} -}] + SUBDIRS=test + ENDIF diff --git a/package/libs/openssl/patches/130-dont-build-tests-fuzz.patch b/package/libs/openssl/patches/130-dont-build-tests-fuzz.patch deleted file mode 100644 index baf8bca9e1..0000000000 --- a/package/libs/openssl/patches/130-dont-build-tests-fuzz.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Eneas U de Queiroz -Date: Thu, 27 Sep 2018 08:34:38 -0300 -Subject: Do not build tests and fuzz directories - -This shortens build time. - -Signed-off-by: Eneas U de Queiroz - ---- a/Configure -+++ b/Configure -@@ -318,7 +318,7 @@ my $auto_threads=1; # enable threads - my $default_ranlib; - - # Top level directories to build --$config{dirs} = [ "crypto", "ssl", "engines", "apps", "test", "util", "tools", "fuzz" ]; -+$config{dirs} = [ "crypto", "ssl", "engines", "apps", "util", "tools" ]; - # crypto/ subdirectories to build - $config{sdirs} = [ - "objects", -@@ -330,7 +330,7 @@ $config{sdirs} = [ - "cms", "ts", "srp", "cmac", "ct", "async", "kdf", "store" - ]; - # test/ subdirectories to build --$config{tdirs} = [ "ossl_shim" ]; -+$config{tdirs} = []; - - # Known TLS and DTLS protocols - my @tls = qw(ssl3 tls1 tls1_1 tls1_2 tls1_3); diff --git a/package/libs/openssl/patches/140-allow-prefer-chacha20.patch b/package/libs/openssl/patches/140-allow-prefer-chacha20.patch index 99afd9acf8..43fd92e388 100644 --- a/package/libs/openssl/patches/140-allow-prefer-chacha20.patch +++ b/package/libs/openssl/patches/140-allow-prefer-chacha20.patch @@ -14,30 +14,9 @@ when the client has it on top of its ciphersuite preference. Signed-off-by: Eneas U de Queiroz ---- a/include/openssl/ssl.h -+++ b/include/openssl/ssl.h -@@ -173,9 +173,15 @@ extern "C" { - # define SSL_DEFAULT_CIPHER_LIST "ALL:!COMPLEMENTOFDEFAULT:!eNULL" - /* This is the default set of TLSv1.3 ciphersuites */ - # if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) --# define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ -- "TLS_CHACHA20_POLY1305_SHA256:" \ -- "TLS_AES_128_GCM_SHA256" -+# ifdef OPENSSL_PREFER_CHACHA_OVER_GCM -+# define TLS_DEFAULT_CIPHERSUITES "TLS_CHACHA20_POLY1305_SHA256:" \ -+ "TLS_AES_256_GCM_SHA384:" \ -+ "TLS_AES_128_GCM_SHA256" -+# else -+# define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ -+ "TLS_CHACHA20_POLY1305_SHA256:" \ -+ "TLS_AES_128_GCM_SHA256" -+# endif - # else - # define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ - "TLS_AES_128_GCM_SHA256" --- a/ssl/ssl_ciph.c +++ b/ssl/ssl_ciph.c -@@ -1465,11 +1465,29 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_ +@@ -1505,11 +1505,29 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_ ssl_cipher_apply_rule(0, SSL_kECDHE, 0, 0, 0, 0, 0, CIPHER_DEL, -1, &head, &tail); @@ -67,7 +46,7 @@ Signed-off-by: Eneas U de Queiroz /* * ...and generally, our preferred cipher is AES. -@@ -1525,7 +1543,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_ +@@ -1564,7 +1582,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_ * Within each group, ciphers remain sorted by strength and previous * preference, i.e., * 1) ECDHE > DHE @@ -76,3 +55,38 @@ Signed-off-by: Eneas U de Queiroz * 3) AES > rest * 4) TLS 1.2 > legacy * +@@ -2235,7 +2253,13 @@ const char *OSSL_default_cipher_list(voi + */ + const char *OSSL_default_ciphersuites(void) + { ++#ifdef OPENSSL_PREFER_CHACHA_OVER_GCM ++ return "TLS_CHACHA20_POLY1305_SHA256:" ++ "TLS_AES_256_GCM_SHA384:" ++ "TLS_AES_128_GCM_SHA256"; ++#else + return "TLS_AES_256_GCM_SHA384:" + "TLS_CHACHA20_POLY1305_SHA256:" + "TLS_AES_128_GCM_SHA256"; ++#endif + } +--- a/include/openssl/ssl.h.in ++++ b/include/openssl/ssl.h.in +@@ -195,9 +195,15 @@ extern "C" { + * DEPRECATED IN 3.0.0, in favor of OSSL_default_ciphersuites() + * Update both macro and function simultaneously + */ +-# define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ +- "TLS_CHACHA20_POLY1305_SHA256:" \ +- "TLS_AES_128_GCM_SHA256" ++# ifdef OPENSSL_PREFER_CHACHA_OVER_GCM ++# define TLS_DEFAULT_CIPHERSUITES "TLS_CHACHA20_POLY1305_SHA256:" \ ++ "TLS_AES_256_GCM_SHA384:" \ ++ "TLS_AES_128_GCM_SHA256" ++# else ++# define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ ++ "TLS_CHACHA20_POLY1305_SHA256:" \ ++ "TLS_AES_128_GCM_SHA256" ++# endif + # endif + /* + * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always diff --git a/package/libs/openssl/patches/150-openssl.cnf-add-engines-conf.patch b/package/libs/openssl/patches/150-openssl.cnf-add-engines-conf.patch index fa92fbe2ab..9fe9cdf590 100644 --- a/package/libs/openssl/patches/150-openssl.cnf-add-engines-conf.patch +++ b/package/libs/openssl/patches/150-openssl.cnf-add-engines-conf.patch @@ -10,20 +10,32 @@ Signed-off-by: Eneas U de Queiroz --- a/apps/openssl.cnf +++ b/apps/openssl.cnf -@@ -22,6 +22,16 @@ oid_section = new_oids - # (Alternatively, use a configuration file that has only - # X.509v3 extensions in its main [= default] section.) +@@ -52,10 +52,13 @@ tsa_policy3 = 1.2.3.4.5.7 -+openssl_conf=openssl_conf + [openssl_init] + providers = provider_sect ++engines = engines_sect + + # List of providers to load + [provider_sect] + default = default_sect ++.include /var/etc/ssl/providers.cnf + -+[openssl_conf] -+engines=engines + # The fips section name should match the section name inside the + # included fipsmodule.cnf. + # fips = fips_sect +@@ -69,7 +72,13 @@ default = default_sect + # OpenSSL may not work correctly which could lead to significant system + # problems including inability to remotely access the system. + [default_sect] +-# activate = 1 ++activate = 1 + -+[engines] ++[engines_sect] +.include /var/etc/ssl/engines.cnf + -+.include /etc/ssl/engines.cnf.d ++.include /etc/ssl/modules.cnf.d + - [ new_oids ] - # We can add new OIDs in here for use by 'ca', 'req' and 'ts'. + + #################################################################### diff --git a/package/libs/openssl/patches/200-x509-excessive-resource-use-verifying-policy-constra.patch b/package/libs/openssl/patches/200-x509-excessive-resource-use-verifying-policy-constra.patch deleted file mode 100644 index a3a4de6008..0000000000 --- a/package/libs/openssl/patches/200-x509-excessive-resource-use-verifying-policy-constra.patch +++ /dev/null @@ -1,214 +0,0 @@ -From 879f7080d7e141f415c79eaa3a8ac4a3dad0348b Mon Sep 17 00:00:00 2001 -From: Pauli -Date: Wed, 8 Mar 2023 15:28:20 +1100 -Subject: [PATCH] x509: excessive resource use verifying policy constraints - -A security vulnerability has been identified in all supported versions -of OpenSSL related to the verification of X.509 certificate chains -that include policy constraints. Attackers may be able to exploit this -vulnerability by creating a malicious certificate chain that triggers -exponential use of computational resources, leading to a denial-of-service -(DoS) attack on affected systems. - -Fixes CVE-2023-0464 - -Reviewed-by: Tomas Mraz -Reviewed-by: Shane Lontis -(Merged from https://github.com/openssl/openssl/pull/20569) - -diff --git a/crypto/x509v3/pcy_local.h b/crypto/x509v3/pcy_local.h -index 5daf78de45..344aa06765 100644 ---- a/crypto/x509v3/pcy_local.h -+++ b/crypto/x509v3/pcy_local.h -@@ -111,6 +111,11 @@ struct X509_POLICY_LEVEL_st { - }; - - struct X509_POLICY_TREE_st { -+ /* The number of nodes in the tree */ -+ size_t node_count; -+ /* The maximum number of nodes in the tree */ -+ size_t node_maximum; -+ - /* This is the tree 'level' data */ - X509_POLICY_LEVEL *levels; - int nlevel; -@@ -159,7 +164,8 @@ X509_POLICY_NODE *tree_find_sk(STACK_OF(X509_POLICY_NODE) *sk, - X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level, - X509_POLICY_DATA *data, - X509_POLICY_NODE *parent, -- X509_POLICY_TREE *tree); -+ X509_POLICY_TREE *tree, -+ int extra_data); - void policy_node_free(X509_POLICY_NODE *node); - int policy_node_match(const X509_POLICY_LEVEL *lvl, - const X509_POLICY_NODE *node, const ASN1_OBJECT *oid); -diff --git a/crypto/x509v3/pcy_node.c b/crypto/x509v3/pcy_node.c -index e2d7b15322..d574fb9d66 100644 ---- a/crypto/x509v3/pcy_node.c -+++ b/crypto/x509v3/pcy_node.c -@@ -59,10 +59,15 @@ X509_POLICY_NODE *level_find_node(const X509_POLICY_LEVEL *level, - X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level, - X509_POLICY_DATA *data, - X509_POLICY_NODE *parent, -- X509_POLICY_TREE *tree) -+ X509_POLICY_TREE *tree, -+ int extra_data) - { - X509_POLICY_NODE *node; - -+ /* Verify that the tree isn't too large. This mitigates CVE-2023-0464 */ -+ if (tree->node_maximum > 0 && tree->node_count >= tree->node_maximum) -+ return NULL; -+ - node = OPENSSL_zalloc(sizeof(*node)); - if (node == NULL) { - X509V3err(X509V3_F_LEVEL_ADD_NODE, ERR_R_MALLOC_FAILURE); -@@ -70,7 +75,7 @@ X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level, - } - node->data = data; - node->parent = parent; -- if (level) { -+ if (level != NULL) { - if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) { - if (level->anyPolicy) - goto node_error; -@@ -90,7 +95,7 @@ X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level, - } - } - -- if (tree) { -+ if (extra_data) { - if (tree->extra_data == NULL) - tree->extra_data = sk_X509_POLICY_DATA_new_null(); - if (tree->extra_data == NULL){ -@@ -103,6 +108,7 @@ X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level, - } - } - -+ tree->node_count++; - if (parent) - parent->nchild++; - -diff --git a/crypto/x509v3/pcy_tree.c b/crypto/x509v3/pcy_tree.c -index 6e8322cbc5..6c7fd35405 100644 ---- a/crypto/x509v3/pcy_tree.c -+++ b/crypto/x509v3/pcy_tree.c -@@ -13,6 +13,18 @@ - - #include "pcy_local.h" - -+/* -+ * If the maximum number of nodes in the policy tree isn't defined, set it to -+ * a generous default of 1000 nodes. -+ * -+ * Defining this to be zero means unlimited policy tree growth which opens the -+ * door on CVE-2023-0464. -+ */ -+ -+#ifndef OPENSSL_POLICY_TREE_NODES_MAX -+# define OPENSSL_POLICY_TREE_NODES_MAX 1000 -+#endif -+ - /* - * Enable this to print out the complete policy tree at various point during - * evaluation. -@@ -168,6 +180,9 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs, - return X509_PCY_TREE_INTERNAL; - } - -+ /* Limit the growth of the tree to mitigate CVE-2023-0464 */ -+ tree->node_maximum = OPENSSL_POLICY_TREE_NODES_MAX; -+ - /* - * http://tools.ietf.org/html/rfc5280#section-6.1.2, figure 3. - * -@@ -184,7 +199,7 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs, - level = tree->levels; - if ((data = policy_data_new(NULL, OBJ_nid2obj(NID_any_policy), 0)) == NULL) - goto bad_tree; -- if (level_add_node(level, data, NULL, tree) == NULL) { -+ if (level_add_node(level, data, NULL, tree, 1) == NULL) { - policy_data_free(data); - goto bad_tree; - } -@@ -243,7 +258,8 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs, - * Return value: 1 on success, 0 otherwise - */ - static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr, -- X509_POLICY_DATA *data) -+ X509_POLICY_DATA *data, -+ X509_POLICY_TREE *tree) - { - X509_POLICY_LEVEL *last = curr - 1; - int i, matched = 0; -@@ -253,13 +269,13 @@ static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr, - X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(last->nodes, i); - - if (policy_node_match(last, node, data->valid_policy)) { -- if (level_add_node(curr, data, node, NULL) == NULL) -+ if (level_add_node(curr, data, node, tree, 0) == NULL) - return 0; - matched = 1; - } - } - if (!matched && last->anyPolicy) { -- if (level_add_node(curr, data, last->anyPolicy, NULL) == NULL) -+ if (level_add_node(curr, data, last->anyPolicy, tree, 0) == NULL) - return 0; - } - return 1; -@@ -272,7 +288,8 @@ static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr, - * Return value: 1 on success, 0 otherwise. - */ - static int tree_link_nodes(X509_POLICY_LEVEL *curr, -- const X509_POLICY_CACHE *cache) -+ const X509_POLICY_CACHE *cache, -+ X509_POLICY_TREE *tree) - { - int i; - -@@ -280,7 +297,7 @@ static int tree_link_nodes(X509_POLICY_LEVEL *curr, - X509_POLICY_DATA *data = sk_X509_POLICY_DATA_value(cache->data, i); - - /* Look for matching nodes in previous level */ -- if (!tree_link_matching_nodes(curr, data)) -+ if (!tree_link_matching_nodes(curr, data, tree)) - return 0; - } - return 1; -@@ -311,7 +328,7 @@ static int tree_add_unmatched(X509_POLICY_LEVEL *curr, - /* Curr may not have anyPolicy */ - data->qualifier_set = cache->anyPolicy->qualifier_set; - data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS; -- if (level_add_node(curr, data, node, tree) == NULL) { -+ if (level_add_node(curr, data, node, tree, 1) == NULL) { - policy_data_free(data); - return 0; - } -@@ -373,7 +390,7 @@ static int tree_link_any(X509_POLICY_LEVEL *curr, - } - /* Finally add link to anyPolicy */ - if (last->anyPolicy && -- level_add_node(curr, cache->anyPolicy, last->anyPolicy, NULL) == NULL) -+ level_add_node(curr, cache->anyPolicy, last->anyPolicy, tree, 0) == NULL) - return 0; - return 1; - } -@@ -555,7 +572,7 @@ static int tree_calculate_user_set(X509_POLICY_TREE *tree, - extra->qualifier_set = anyPolicy->data->qualifier_set; - extra->flags = POLICY_DATA_FLAG_SHARED_QUALIFIERS - | POLICY_DATA_FLAG_EXTRA_NODE; -- node = level_add_node(NULL, extra, anyPolicy->parent, tree); -+ node = level_add_node(NULL, extra, anyPolicy->parent, tree, 1); - } - if (!tree->user_policies) { - tree->user_policies = sk_X509_POLICY_NODE_new_null(); -@@ -582,7 +599,7 @@ static int tree_evaluate(X509_POLICY_TREE *tree) - - for (i = 1; i < tree->nlevel; i++, curr++) { - cache = policy_cache_set(curr->cert); -- if (!tree_link_nodes(curr, cache)) -+ if (!tree_link_nodes(curr, cache, tree)) - return X509_PCY_TREE_INTERNAL; - - if (!(curr->flags & X509_V_FLAG_INHIBIT_ANY) diff --git a/package/libs/openssl/patches/210-Ensure-that-EXFLAG_INVALID_POLICY-is-checked-even-in.patch b/package/libs/openssl/patches/210-Ensure-that-EXFLAG_INVALID_POLICY-is-checked-even-in.patch deleted file mode 100644 index ffb7317d7c..0000000000 --- a/package/libs/openssl/patches/210-Ensure-that-EXFLAG_INVALID_POLICY-is-checked-even-in.patch +++ /dev/null @@ -1,48 +0,0 @@ -From b013765abfa80036dc779dd0e50602c57bb3bf95 Mon Sep 17 00:00:00 2001 -From: Matt Caswell -Date: Tue, 7 Mar 2023 16:52:55 +0000 -Subject: [PATCH] Ensure that EXFLAG_INVALID_POLICY is checked even in leaf - certs - -Even though we check the leaf cert to confirm it is valid, we -later ignored the invalid flag and did not notice that the leaf -cert was bad. - -Fixes: CVE-2023-0465 - -Reviewed-by: Hugo Landau -Reviewed-by: Tomas Mraz -(Merged from https://github.com/openssl/openssl/pull/20588) - -diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c -index 925fbb5412..1dfe4f9f31 100644 ---- a/crypto/x509/x509_vfy.c -+++ b/crypto/x509/x509_vfy.c -@@ -1649,18 +1649,25 @@ static int check_policy(X509_STORE_CTX *ctx) - } - /* Invalid or inconsistent extensions */ - if (ret == X509_PCY_TREE_INVALID) { -- int i; -+ int i, cbcalled = 0; - - /* Locate certificates with bad extensions and notify callback. */ -- for (i = 1; i < sk_X509_num(ctx->chain); i++) { -+ for (i = 0; i < sk_X509_num(ctx->chain); i++) { - X509 *x = sk_X509_value(ctx->chain, i); - - if (!(x->ex_flags & EXFLAG_INVALID_POLICY)) - continue; -+ cbcalled = 1; - if (!verify_cb_cert(ctx, x, i, - X509_V_ERR_INVALID_POLICY_EXTENSION)) - return 0; - } -+ if (!cbcalled) { -+ /* Should not be able to get here */ -+ X509err(X509_F_CHECK_POLICY, ERR_R_INTERNAL_ERROR); -+ return 0; -+ } -+ /* The callback ignored the error so we return success */ - return 1; - } - if (ret == X509_PCY_TREE_FAILURE) { diff --git a/package/libs/openssl/patches/400-eng_devcrypto-save-ioctl-if-EVP_MD_.FLAG_ONESHOT.patch b/package/libs/openssl/patches/400-eng_devcrypto-save-ioctl-if-EVP_MD_.FLAG_ONESHOT.patch deleted file mode 100644 index ed8204c339..0000000000 --- a/package/libs/openssl/patches/400-eng_devcrypto-save-ioctl-if-EVP_MD_.FLAG_ONESHOT.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Eneas U de Queiroz -Date: Mon, 5 Nov 2018 15:54:17 -0200 -Subject: eng_devcrypto: save ioctl if EVP_MD_..FLAG_ONESHOT - -Since each ioctl causes a context switch, slowing things down, if -EVP_MD_CTX_FLAG_ONESHOT is set, then: - - call the ioctl in digest_update, saving the result; and - - just copy the result in digest_final, instead of using another ioctl. - -Signed-off-by: Eneas U de Queiroz - -Reviewed-by: Matthias St. Pierre -Reviewed-by: Richard Levitte -(Merged from https://github.com/openssl/openssl/pull/7585) - ---- a/crypto/engine/eng_devcrypto.c -+++ b/crypto/engine/eng_devcrypto.c -@@ -461,6 +461,7 @@ struct digest_ctx { - struct session_op sess; - /* This signals that the init function was called, not that it succeeded. */ - int init_called; -+ unsigned char digest_res[HASH_MAX_LEN]; - }; - - static const struct digest_data_st { -@@ -564,12 +565,15 @@ static int digest_update(EVP_MD_CTX *ctx - if (digest_ctx == NULL) - return 0; - -- if (digest_op(digest_ctx, data, count, NULL, COP_FLAG_UPDATE) < 0) { -- SYSerr(SYS_F_IOCTL, errno); -- return 0; -+ if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_ONESHOT)) { -+ if (digest_op(digest_ctx, data, count, digest_ctx->digest_res, 0) >= 0) -+ return 1; -+ } else if (digest_op(digest_ctx, data, count, NULL, COP_FLAG_UPDATE) >= 0) { -+ return 1; - } - -- return 1; -+ SYSerr(SYS_F_IOCTL, errno); -+ return 0; - } - - static int digest_final(EVP_MD_CTX *ctx, unsigned char *md) -@@ -579,7 +583,10 @@ static int digest_final(EVP_MD_CTX *ctx, - - if (md == NULL || digest_ctx == NULL) - return 0; -- if (digest_op(digest_ctx, NULL, 0, md, COP_FLAG_FINAL) < 0) { -+ -+ if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_ONESHOT)) { -+ memcpy(md, digest_ctx->digest_res, EVP_MD_CTX_size(ctx)); -+ } else if (digest_op(digest_ctx, NULL, 0, md, COP_FLAG_FINAL) < 0) { - SYSerr(SYS_F_IOCTL, errno); - return 0; - } diff --git a/package/libs/openssl/patches/410-eng_devcrypto-add-configuration-options.patch b/package/libs/openssl/patches/410-eng_devcrypto-add-configuration-options.patch deleted file mode 100644 index bad7a37256..0000000000 --- a/package/libs/openssl/patches/410-eng_devcrypto-add-configuration-options.patch +++ /dev/null @@ -1,566 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Eneas U de Queiroz -Date: Sat, 3 Nov 2018 15:41:10 -0300 -Subject: eng_devcrypto: add configuration options - -USE_SOFTDRIVERS: whether to use software (not accelerated) drivers -CIPHERS: list of ciphers to enable -DIGESTS: list of digests to enable - -Signed-off-by: Eneas U de Queiroz - -Reviewed-by: Matthias St. Pierre -Reviewed-by: Richard Levitte -(Merged from https://github.com/openssl/openssl/pull/7585) - ---- a/crypto/engine/eng_devcrypto.c -+++ b/crypto/engine/eng_devcrypto.c -@@ -16,6 +16,7 @@ - #include - #include - -+#include - #include - #include - #include -@@ -36,6 +37,30 @@ - * saner... why re-open /dev/crypto for every session? - */ - static int cfd; -+#define DEVCRYPTO_REQUIRE_ACCELERATED 0 /* require confirmation of acceleration */ -+#define DEVCRYPTO_USE_SOFTWARE 1 /* allow software drivers */ -+#define DEVCRYPTO_REJECT_SOFTWARE 2 /* only disallow confirmed software drivers */ -+ -+#define DEVCRYPTO_DEFAULT_USE_SOFDTRIVERS DEVCRYPTO_REJECT_SOFTWARE -+static int use_softdrivers = DEVCRYPTO_DEFAULT_USE_SOFDTRIVERS; -+ -+/* -+ * cipher/digest status & acceleration definitions -+ * Make sure the defaults are set to 0 -+ */ -+struct driver_info_st { -+ enum devcrypto_status_t { -+ DEVCRYPTO_STATUS_UNUSABLE = -1, /* session open failed */ -+ DEVCRYPTO_STATUS_UNKNOWN = 0, /* not tested yet */ -+ DEVCRYPTO_STATUS_USABLE = 1 /* algo can be used */ -+ } status; -+ -+ enum devcrypto_accelerated_t { -+ DEVCRYPTO_NOT_ACCELERATED = -1, /* software implemented */ -+ DEVCRYPTO_ACCELERATION_UNKNOWN = 0, /* acceleration support unkown */ -+ DEVCRYPTO_ACCELERATED = 1 /* hardware accelerated */ -+ } accelerated; -+}; - - static int clean_devcrypto_session(struct session_op *sess) { - if (ioctl(cfd, CIOCFSESSION, &sess->ses) < 0) { -@@ -119,13 +144,22 @@ static const struct cipher_data_st { - #endif - }; - --static size_t get_cipher_data_index(int nid) -+static size_t find_cipher_data_index(int nid) - { - size_t i; - - for (i = 0; i < OSSL_NELEM(cipher_data); i++) - if (nid == cipher_data[i].nid) - return i; -+ return (size_t)-1; -+} -+ -+static size_t get_cipher_data_index(int nid) -+{ -+ size_t i = find_cipher_data_index(nid); -+ -+ if (i != (size_t)-1) -+ return i; - - /* - * Code further down must make sure that only NIDs in the table above -@@ -333,19 +367,40 @@ static int cipher_cleanup(EVP_CIPHER_CTX - } - - /* -- * Keep a table of known nids and associated methods. -+ * Keep tables of known nids, associated methods, selected ciphers, and driver -+ * info. - * Note that known_cipher_nids[] isn't necessarily indexed the same way as -- * cipher_data[] above, which known_cipher_methods[] is. -+ * cipher_data[] above, which the other tables are. - */ - static int known_cipher_nids[OSSL_NELEM(cipher_data)]; - static int known_cipher_nids_amount = -1; /* -1 indicates not yet initialised */ - static EVP_CIPHER *known_cipher_methods[OSSL_NELEM(cipher_data)] = { NULL, }; -+static int selected_ciphers[OSSL_NELEM(cipher_data)]; -+static struct driver_info_st cipher_driver_info[OSSL_NELEM(cipher_data)]; -+ -+ -+static int devcrypto_test_cipher(size_t cipher_data_index) -+{ -+ return (cipher_driver_info[cipher_data_index].status == DEVCRYPTO_STATUS_USABLE -+ && selected_ciphers[cipher_data_index] == 1 -+ && (cipher_driver_info[cipher_data_index].accelerated -+ == DEVCRYPTO_ACCELERATED -+ || use_softdrivers == DEVCRYPTO_USE_SOFTWARE -+ || (cipher_driver_info[cipher_data_index].accelerated -+ != DEVCRYPTO_NOT_ACCELERATED -+ && use_softdrivers == DEVCRYPTO_REJECT_SOFTWARE))); -+} - - static void prepare_cipher_methods(void) - { - size_t i; - struct session_op sess; - unsigned long cipher_mode; -+#ifdef CIOCGSESSINFO -+ struct session_info_op siop; -+#endif -+ -+ memset(&cipher_driver_info, 0, sizeof(cipher_driver_info)); - - memset(&sess, 0, sizeof(sess)); - sess.key = (void *)"01234567890123456789012345678901234567890123456789"; -@@ -353,15 +408,16 @@ static void prepare_cipher_methods(void) - for (i = 0, known_cipher_nids_amount = 0; - i < OSSL_NELEM(cipher_data); i++) { - -+ selected_ciphers[i] = 1; - /* -- * Check that the algo is really availably by trying to open and close -- * a session. -+ * Check that the cipher is usable - */ - sess.cipher = cipher_data[i].devcryptoid; - sess.keylen = cipher_data[i].keylen; -- if (ioctl(cfd, CIOCGSESSION, &sess) < 0 -- || ioctl(cfd, CIOCFSESSION, &sess.ses) < 0) -+ if (ioctl(cfd, CIOCGSESSION, &sess) < 0) { -+ cipher_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; - continue; -+ } - - cipher_mode = cipher_data[i].flags & EVP_CIPH_MODE; - -@@ -387,15 +443,41 @@ static void prepare_cipher_methods(void) - cipher_cleanup) - || !EVP_CIPHER_meth_set_impl_ctx_size(known_cipher_methods[i], - sizeof(struct cipher_ctx))) { -+ cipher_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; - EVP_CIPHER_meth_free(known_cipher_methods[i]); - known_cipher_methods[i] = NULL; - } else { -+ cipher_driver_info[i].status = DEVCRYPTO_STATUS_USABLE; -+#ifdef CIOCGSESSINFO -+ siop.ses = sess.ses; -+ if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) -+ cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; -+ else if (!(siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY)) -+ cipher_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; -+ else -+ cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; -+#endif /* CIOCGSESSINFO */ -+ } -+ ioctl(cfd, CIOCFSESSION, &sess.ses); -+ if (devcrypto_test_cipher(i)) { - known_cipher_nids[known_cipher_nids_amount++] = - cipher_data[i].nid; - } - } - } - -+static void rebuild_known_cipher_nids(ENGINE *e) -+{ -+ size_t i; -+ -+ for (i = 0, known_cipher_nids_amount = 0; i < OSSL_NELEM(cipher_data); i++) { -+ if (devcrypto_test_cipher(i)) -+ known_cipher_nids[known_cipher_nids_amount++] = cipher_data[i].nid; -+ } -+ ENGINE_unregister_ciphers(e); -+ ENGINE_register_ciphers(e); -+} -+ - static const EVP_CIPHER *get_cipher_method(int nid) - { - size_t i = get_cipher_data_index(nid); -@@ -438,6 +520,36 @@ static int devcrypto_ciphers(ENGINE *e, - return *cipher != NULL; - } - -+static void devcrypto_select_all_ciphers(int *cipher_list) -+{ -+ size_t i; -+ -+ for (i = 0; i < OSSL_NELEM(cipher_data); i++) -+ cipher_list[i] = 1; -+} -+ -+static int cryptodev_select_cipher_cb(const char *str, int len, void *usr) -+{ -+ int *cipher_list = (int *)usr; -+ char *name; -+ const EVP_CIPHER *EVP; -+ size_t i; -+ -+ if (len == 0) -+ return 1; -+ if (usr == NULL || (name = OPENSSL_strndup(str, len)) == NULL) -+ return 0; -+ EVP = EVP_get_cipherbyname(name); -+ if (EVP == NULL) -+ fprintf(stderr, "devcrypto: unknown cipher %s\n", name); -+ else if ((i = find_cipher_data_index(EVP_CIPHER_nid(EVP))) != (size_t)-1) -+ cipher_list[i] = 1; -+ else -+ fprintf(stderr, "devcrypto: cipher %s not available\n", name); -+ OPENSSL_free(name); -+ return 1; -+} -+ - /* - * We only support digests if the cryptodev implementation supports multiple - * data updates and session copying. Otherwise, we would be forced to maintain -@@ -493,13 +605,22 @@ static const struct digest_data_st { - #endif - }; - --static size_t get_digest_data_index(int nid) -+static size_t find_digest_data_index(int nid) - { - size_t i; - - for (i = 0; i < OSSL_NELEM(digest_data); i++) - if (nid == digest_data[i].nid) - return i; -+ return (size_t)-1; -+} -+ -+static size_t get_digest_data_index(int nid) -+{ -+ size_t i = find_digest_data_index(nid); -+ -+ if (i != (size_t)-1) -+ return i; - - /* - * Code further down must make sure that only NIDs in the table above -@@ -516,8 +637,8 @@ static const struct digest_data_st *get_ - } - - /* -- * Following are the four necessary functions to map OpenSSL functionality -- * with cryptodev. -+ * Following are the five necessary functions to map OpenSSL functionality -+ * with cryptodev: init, update, final, cleanup, and copy. - */ - - static int digest_init(EVP_MD_CTX *ctx) -@@ -630,52 +751,94 @@ static int digest_cleanup(EVP_MD_CTX *ct - return clean_devcrypto_session(&digest_ctx->sess); - } - --static int devcrypto_test_digest(size_t digest_data_index) --{ -- struct session_op sess1, sess2; -- struct cphash_op cphash; -- int ret=0; -- -- memset(&sess1, 0, sizeof(sess1)); -- memset(&sess2, 0, sizeof(sess2)); -- sess1.mac = digest_data[digest_data_index].devcryptoid; -- if (ioctl(cfd, CIOCGSESSION, &sess1) < 0) -- return 0; -- /* Make sure the driver is capable of hash state copy */ -- sess2.mac = sess1.mac; -- if (ioctl(cfd, CIOCGSESSION, &sess2) >= 0) { -- cphash.src_ses = sess1.ses; -- cphash.dst_ses = sess2.ses; -- if (ioctl(cfd, CIOCCPHASH, &cphash) >= 0) -- ret = 1; -- ioctl(cfd, CIOCFSESSION, &sess2.ses); -- } -- ioctl(cfd, CIOCFSESSION, &sess1.ses); -- return ret; --} -- - /* -- * Keep a table of known nids and associated methods. -+ * Keep tables of known nids, associated methods, selected digests, and -+ * driver info. - * Note that known_digest_nids[] isn't necessarily indexed the same way as -- * digest_data[] above, which known_digest_methods[] is. -+ * digest_data[] above, which the other tables are. - */ - static int known_digest_nids[OSSL_NELEM(digest_data)]; - static int known_digest_nids_amount = -1; /* -1 indicates not yet initialised */ - static EVP_MD *known_digest_methods[OSSL_NELEM(digest_data)] = { NULL, }; -+static int selected_digests[OSSL_NELEM(digest_data)]; -+static struct driver_info_st digest_driver_info[OSSL_NELEM(digest_data)]; -+ -+static int devcrypto_test_digest(size_t digest_data_index) -+{ -+ return (digest_driver_info[digest_data_index].status == DEVCRYPTO_STATUS_USABLE -+ && selected_digests[digest_data_index] == 1 -+ && (digest_driver_info[digest_data_index].accelerated -+ == DEVCRYPTO_ACCELERATED -+ || use_softdrivers == DEVCRYPTO_USE_SOFTWARE -+ || (digest_driver_info[digest_data_index].accelerated -+ != DEVCRYPTO_NOT_ACCELERATED -+ && use_softdrivers == DEVCRYPTO_REJECT_SOFTWARE))); -+} -+ -+static void rebuild_known_digest_nids(ENGINE *e) -+{ -+ size_t i; -+ -+ for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); i++) { -+ if (devcrypto_test_digest(i)) -+ known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; -+ } -+ ENGINE_unregister_digests(e); -+ ENGINE_register_digests(e); -+} - - static void prepare_digest_methods(void) - { - size_t i; -+ struct session_op sess1, sess2; -+#ifdef CIOCGSESSINFO -+ struct session_info_op siop; -+#endif -+ struct cphash_op cphash; -+ -+ memset(&digest_driver_info, 0, sizeof(digest_driver_info)); -+ -+ memset(&sess1, 0, sizeof(sess1)); -+ memset(&sess2, 0, sizeof(sess2)); - - for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); - i++) { - -+ selected_digests[i] = 1; -+ - /* -- * Check that the algo is usable -+ * Check that the digest is usable - */ -- if (!devcrypto_test_digest(i)) -- continue; -+ sess1.mac = digest_data[i].devcryptoid; -+ sess2.ses = 0; -+ if (ioctl(cfd, CIOCGSESSION, &sess1) < 0) { -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; -+ goto finish; -+ } - -+#ifdef CIOCGSESSINFO -+ /* gather hardware acceleration info from the driver */ -+ siop.ses = sess1.ses; -+ if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) -+ digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; -+ else if (siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY) -+ digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; -+ else -+ digest_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; -+#endif -+ -+ /* digest must be capable of hash state copy */ -+ sess2.mac = sess1.mac; -+ if (ioctl(cfd, CIOCGSESSION, &sess2) < 0) { -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; -+ goto finish; -+ } -+ cphash.src_ses = sess1.ses; -+ cphash.dst_ses = sess2.ses; -+ if (ioctl(cfd, CIOCCPHASH, &cphash) < 0) { -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; -+ goto finish; -+ } - if ((known_digest_methods[i] = EVP_MD_meth_new(digest_data[i].nid, - NID_undef)) == NULL - || !EVP_MD_meth_set_input_blocksize(known_digest_methods[i], -@@ -689,11 +852,18 @@ static void prepare_digest_methods(void) - || !EVP_MD_meth_set_cleanup(known_digest_methods[i], digest_cleanup) - || !EVP_MD_meth_set_app_datasize(known_digest_methods[i], - sizeof(struct digest_ctx))) { -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; - EVP_MD_meth_free(known_digest_methods[i]); - known_digest_methods[i] = NULL; -- } else { -- known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; -+ goto finish; - } -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_USABLE; -+finish: -+ ioctl(cfd, CIOCFSESSION, &sess1.ses); -+ if (sess2.ses != 0) -+ ioctl(cfd, CIOCFSESSION, &sess2.ses); -+ if (devcrypto_test_digest(i)) -+ known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; - } - } - -@@ -739,7 +909,153 @@ static int devcrypto_digests(ENGINE *e, - return *digest != NULL; - } - -+static void devcrypto_select_all_digests(int *digest_list) -+{ -+ size_t i; -+ -+ for (i = 0; i < OSSL_NELEM(digest_data); i++) -+ digest_list[i] = 1; -+} -+ -+static int cryptodev_select_digest_cb(const char *str, int len, void *usr) -+{ -+ int *digest_list = (int *)usr; -+ char *name; -+ const EVP_MD *EVP; -+ size_t i; -+ -+ if (len == 0) -+ return 1; -+ if (usr == NULL || (name = OPENSSL_strndup(str, len)) == NULL) -+ return 0; -+ EVP = EVP_get_digestbyname(name); -+ if (EVP == NULL) -+ fprintf(stderr, "devcrypto: unknown digest %s\n", name); -+ else if ((i = find_digest_data_index(EVP_MD_type(EVP))) != (size_t)-1) -+ digest_list[i] = 1; -+ else -+ fprintf(stderr, "devcrypto: digest %s not available\n", name); -+ OPENSSL_free(name); -+ return 1; -+} -+ -+#endif -+ -+/****************************************************************************** -+ * -+ * CONTROL COMMANDS -+ * -+ *****/ -+ -+#define DEVCRYPTO_CMD_USE_SOFTDRIVERS ENGINE_CMD_BASE -+#define DEVCRYPTO_CMD_CIPHERS (ENGINE_CMD_BASE + 1) -+#define DEVCRYPTO_CMD_DIGESTS (ENGINE_CMD_BASE + 2) -+#define DEVCRYPTO_CMD_DUMP_INFO (ENGINE_CMD_BASE + 3) -+ -+/* Helper macros for CPP string composition */ -+#ifndef OPENSSL_MSTR -+# define OPENSSL_MSTR_HELPER(x) #x -+# define OPENSSL_MSTR(x) OPENSSL_MSTR_HELPER(x) -+#endif -+ -+static const ENGINE_CMD_DEFN devcrypto_cmds[] = { -+#ifdef CIOCGSESSINFO -+ {DEVCRYPTO_CMD_USE_SOFTDRIVERS, -+ "USE_SOFTDRIVERS", -+ "specifies whether to use software (not accelerated) drivers (" -+ OPENSSL_MSTR(DEVCRYPTO_REQUIRE_ACCELERATED) "=use only accelerated drivers, " -+ OPENSSL_MSTR(DEVCRYPTO_USE_SOFTWARE) "=allow all drivers, " -+ OPENSSL_MSTR(DEVCRYPTO_REJECT_SOFTWARE) -+ "=use if acceleration can't be determined) [default=" -+ OPENSSL_MSTR(DEVCRYPTO_DEFAULT_USE_SOFDTRIVERS) "]", -+ ENGINE_CMD_FLAG_NUMERIC}, -+#endif -+ -+ {DEVCRYPTO_CMD_CIPHERS, -+ "CIPHERS", -+ "either ALL, NONE, or a comma-separated list of ciphers to enable [default=ALL]", -+ ENGINE_CMD_FLAG_STRING}, -+ -+#ifdef IMPLEMENT_DIGEST -+ {DEVCRYPTO_CMD_DIGESTS, -+ "DIGESTS", -+ "either ALL, NONE, or a comma-separated list of digests to enable [default=ALL]", -+ ENGINE_CMD_FLAG_STRING}, -+#endif -+ -+ {0, NULL, NULL, 0} -+}; -+ -+static int devcrypto_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) -+{ -+ int *new_list; -+ switch (cmd) { -+#ifdef CIOCGSESSINFO -+ case DEVCRYPTO_CMD_USE_SOFTDRIVERS: -+ switch (i) { -+ case DEVCRYPTO_REQUIRE_ACCELERATED: -+ case DEVCRYPTO_USE_SOFTWARE: -+ case DEVCRYPTO_REJECT_SOFTWARE: -+ break; -+ default: -+ fprintf(stderr, "devcrypto: invalid value (%ld) for USE_SOFTDRIVERS\n", i); -+ return 0; -+ } -+ if (use_softdrivers == i) -+ return 1; -+ use_softdrivers = i; -+#ifdef IMPLEMENT_DIGEST -+ rebuild_known_digest_nids(e); - #endif -+ rebuild_known_cipher_nids(e); -+ return 1; -+#endif /* CIOCGSESSINFO */ -+ -+ case DEVCRYPTO_CMD_CIPHERS: -+ if (p == NULL) -+ return 1; -+ if (strcasecmp((const char *)p, "ALL") == 0) { -+ devcrypto_select_all_ciphers(selected_ciphers); -+ } else if (strcasecmp((const char*)p, "NONE") == 0) { -+ memset(selected_ciphers, 0, sizeof(selected_ciphers)); -+ } else { -+ new_list=OPENSSL_zalloc(sizeof(selected_ciphers)); -+ if (!CONF_parse_list(p, ',', 1, cryptodev_select_cipher_cb, new_list)) { -+ OPENSSL_free(new_list); -+ return 0; -+ } -+ memcpy(selected_ciphers, new_list, sizeof(selected_ciphers)); -+ OPENSSL_free(new_list); -+ } -+ rebuild_known_cipher_nids(e); -+ return 1; -+ -+#ifdef IMPLEMENT_DIGEST -+ case DEVCRYPTO_CMD_DIGESTS: -+ if (p == NULL) -+ return 1; -+ if (strcasecmp((const char *)p, "ALL") == 0) { -+ devcrypto_select_all_digests(selected_digests); -+ } else if (strcasecmp((const char*)p, "NONE") == 0) { -+ memset(selected_digests, 0, sizeof(selected_digests)); -+ } else { -+ new_list=OPENSSL_zalloc(sizeof(selected_digests)); -+ if (!CONF_parse_list(p, ',', 1, cryptodev_select_digest_cb, new_list)) { -+ OPENSSL_free(new_list); -+ return 0; -+ } -+ memcpy(selected_digests, new_list, sizeof(selected_digests)); -+ OPENSSL_free(new_list); -+ } -+ rebuild_known_digest_nids(e); -+ return 1; -+#endif /* IMPLEMENT_DIGEST */ -+ -+ default: -+ break; -+ } -+ return 0; -+} - - /****************************************************************************** - * -@@ -806,6 +1122,8 @@ void engine_load_devcrypto_int() - - if (!ENGINE_set_id(e, "devcrypto") - || !ENGINE_set_name(e, "/dev/crypto engine") -+ || !ENGINE_set_cmd_defns(e, devcrypto_cmds) -+ || !ENGINE_set_ctrl_function(e, devcrypto_ctrl) - - /* - * Asymmetric ciphers aren't well supported with /dev/crypto. Among the BSD diff --git a/package/libs/openssl/patches/420-eng_devcrypto-add-command-to-dump-driver-info.patch b/package/libs/openssl/patches/420-eng_devcrypto-add-command-to-dump-driver-info.patch deleted file mode 100644 index eee71c6c62..0000000000 --- a/package/libs/openssl/patches/420-eng_devcrypto-add-command-to-dump-driver-info.patch +++ /dev/null @@ -1,273 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Eneas U de Queiroz -Date: Tue, 6 Nov 2018 22:54:07 -0200 -Subject: eng_devcrypto: add command to dump driver info - -This is useful to determine the kernel driver running each algorithm. - -Signed-off-by: Eneas U de Queiroz - -Reviewed-by: Matthias St. Pierre -Reviewed-by: Richard Levitte -(Merged from https://github.com/openssl/openssl/pull/7585) - ---- a/crypto/engine/eng_devcrypto.c -+++ b/crypto/engine/eng_devcrypto.c -@@ -50,16 +50,20 @@ static int use_softdrivers = DEVCRYPTO_D - */ - struct driver_info_st { - enum devcrypto_status_t { -- DEVCRYPTO_STATUS_UNUSABLE = -1, /* session open failed */ -- DEVCRYPTO_STATUS_UNKNOWN = 0, /* not tested yet */ -- DEVCRYPTO_STATUS_USABLE = 1 /* algo can be used */ -+ DEVCRYPTO_STATUS_FAILURE = -3, /* unusable for other reason */ -+ DEVCRYPTO_STATUS_NO_CIOCCPHASH = -2, /* hash state copy not supported */ -+ DEVCRYPTO_STATUS_NO_CIOCGSESSION = -1, /* session open failed */ -+ DEVCRYPTO_STATUS_UNKNOWN = 0, /* not tested yet */ -+ DEVCRYPTO_STATUS_USABLE = 1 /* algo can be used */ - } status; - - enum devcrypto_accelerated_t { -- DEVCRYPTO_NOT_ACCELERATED = -1, /* software implemented */ -- DEVCRYPTO_ACCELERATION_UNKNOWN = 0, /* acceleration support unkown */ -- DEVCRYPTO_ACCELERATED = 1 /* hardware accelerated */ -+ DEVCRYPTO_NOT_ACCELERATED = -1, /* software implemented */ -+ DEVCRYPTO_ACCELERATION_UNKNOWN = 0, /* acceleration support unkown */ -+ DEVCRYPTO_ACCELERATED = 1 /* hardware accelerated */ - } accelerated; -+ -+ char *driver_name; - }; - - static int clean_devcrypto_session(struct session_op *sess) { -@@ -415,7 +419,7 @@ static void prepare_cipher_methods(void) - sess.cipher = cipher_data[i].devcryptoid; - sess.keylen = cipher_data[i].keylen; - if (ioctl(cfd, CIOCGSESSION, &sess) < 0) { -- cipher_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; -+ cipher_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCGSESSION; - continue; - } - -@@ -443,19 +447,24 @@ static void prepare_cipher_methods(void) - cipher_cleanup) - || !EVP_CIPHER_meth_set_impl_ctx_size(known_cipher_methods[i], - sizeof(struct cipher_ctx))) { -- cipher_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; -+ cipher_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; - EVP_CIPHER_meth_free(known_cipher_methods[i]); - known_cipher_methods[i] = NULL; - } else { - cipher_driver_info[i].status = DEVCRYPTO_STATUS_USABLE; - #ifdef CIOCGSESSINFO - siop.ses = sess.ses; -- if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) -+ if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) { - cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; -- else if (!(siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY)) -- cipher_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; -- else -- cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; -+ } else { -+ cipher_driver_info[i].driver_name = -+ OPENSSL_strndup(siop.cipher_info.cra_driver_name, -+ CRYPTODEV_MAX_ALG_NAME); -+ if (!(siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY)) -+ cipher_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; -+ else -+ cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; -+ } - #endif /* CIOCGSESSINFO */ - } - ioctl(cfd, CIOCFSESSION, &sess.ses); -@@ -505,8 +514,11 @@ static void destroy_all_cipher_methods(v - { - size_t i; - -- for (i = 0; i < OSSL_NELEM(cipher_data); i++) -+ for (i = 0; i < OSSL_NELEM(cipher_data); i++) { - destroy_cipher_method(cipher_data[i].nid); -+ OPENSSL_free(cipher_driver_info[i].driver_name); -+ cipher_driver_info[i].driver_name = NULL; -+ } - } - - static int devcrypto_ciphers(ENGINE *e, const EVP_CIPHER **cipher, -@@ -550,6 +562,40 @@ static int cryptodev_select_cipher_cb(co - return 1; - } - -+static void dump_cipher_info(void) -+{ -+ size_t i; -+ const char *name; -+ -+ fprintf (stderr, "Information about ciphers supported by the /dev/crypto" -+ " engine:\n"); -+#ifndef CIOCGSESSINFO -+ fprintf(stderr, "CIOCGSESSINFO (session info call) unavailable\n"); -+#endif -+ for (i = 0; i < OSSL_NELEM(cipher_data); i++) { -+ name = OBJ_nid2sn(cipher_data[i].nid); -+ fprintf (stderr, "Cipher %s, NID=%d, /dev/crypto info: id=%d, ", -+ name ? name : "unknown", cipher_data[i].nid, -+ cipher_data[i].devcryptoid); -+ if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCGSESSION ) { -+ fprintf (stderr, "CIOCGSESSION (session open call) failed\n"); -+ continue; -+ } -+ fprintf (stderr, "driver=%s ", cipher_driver_info[i].driver_name ? -+ cipher_driver_info[i].driver_name : "unknown"); -+ if (cipher_driver_info[i].accelerated == DEVCRYPTO_ACCELERATED) -+ fprintf(stderr, "(hw accelerated)"); -+ else if (cipher_driver_info[i].accelerated == DEVCRYPTO_NOT_ACCELERATED) -+ fprintf(stderr, "(software)"); -+ else -+ fprintf(stderr, "(acceleration status unknown)"); -+ if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_FAILURE) -+ fprintf (stderr, ". Cipher setup failed"); -+ fprintf(stderr, "\n"); -+ } -+ fprintf(stderr, "\n"); -+} -+ - /* - * We only support digests if the cryptodev implementation supports multiple - * data updates and session copying. Otherwise, we would be forced to maintain -@@ -812,31 +858,36 @@ static void prepare_digest_methods(void) - sess1.mac = digest_data[i].devcryptoid; - sess2.ses = 0; - if (ioctl(cfd, CIOCGSESSION, &sess1) < 0) { -- digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCGSESSION; - goto finish; - } - - #ifdef CIOCGSESSINFO - /* gather hardware acceleration info from the driver */ - siop.ses = sess1.ses; -- if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) -+ if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) { - digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; -- else if (siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY) -- digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; -- else -- digest_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; -+ } else { -+ digest_driver_info[i].driver_name = -+ OPENSSL_strndup(siop.hash_info.cra_driver_name, -+ CRYPTODEV_MAX_ALG_NAME); -+ if (siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY) -+ digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; -+ else -+ digest_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; -+ } - #endif - - /* digest must be capable of hash state copy */ - sess2.mac = sess1.mac; - if (ioctl(cfd, CIOCGSESSION, &sess2) < 0) { -- digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; - goto finish; - } - cphash.src_ses = sess1.ses; - cphash.dst_ses = sess2.ses; - if (ioctl(cfd, CIOCCPHASH, &cphash) < 0) { -- digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCCPHASH; - goto finish; - } - if ((known_digest_methods[i] = EVP_MD_meth_new(digest_data[i].nid, -@@ -852,7 +903,7 @@ static void prepare_digest_methods(void) - || !EVP_MD_meth_set_cleanup(known_digest_methods[i], digest_cleanup) - || !EVP_MD_meth_set_app_datasize(known_digest_methods[i], - sizeof(struct digest_ctx))) { -- digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; - EVP_MD_meth_free(known_digest_methods[i]); - known_digest_methods[i] = NULL; - goto finish; -@@ -894,8 +945,11 @@ static void destroy_all_digest_methods(v - { - size_t i; - -- for (i = 0; i < OSSL_NELEM(digest_data); i++) -+ for (i = 0; i < OSSL_NELEM(digest_data); i++) { - destroy_digest_method(digest_data[i].nid); -+ OPENSSL_free(digest_driver_info[i].driver_name); -+ digest_driver_info[i].driver_name = NULL; -+ } - } - - static int devcrypto_digests(ENGINE *e, const EVP_MD **digest, -@@ -939,6 +993,43 @@ static int cryptodev_select_digest_cb(co - return 1; - } - -+static void dump_digest_info(void) -+{ -+ size_t i; -+ const char *name; -+ -+ fprintf (stderr, "Information about digests supported by the /dev/crypto" -+ " engine:\n"); -+#ifndef CIOCGSESSINFO -+ fprintf(stderr, "CIOCGSESSINFO (session info call) unavailable\n"); -+#endif -+ -+ for (i = 0; i < OSSL_NELEM(digest_data); i++) { -+ name = OBJ_nid2sn(digest_data[i].nid); -+ fprintf (stderr, "Digest %s, NID=%d, /dev/crypto info: id=%d, driver=%s", -+ name ? name : "unknown", digest_data[i].nid, -+ digest_data[i].devcryptoid, -+ digest_driver_info[i].driver_name ? digest_driver_info[i].driver_name : "unknown"); -+ if (digest_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCGSESSION) { -+ fprintf (stderr, ". CIOCGSESSION (session open) failed\n"); -+ continue; -+ } -+ if (digest_driver_info[i].accelerated == DEVCRYPTO_ACCELERATED) -+ fprintf(stderr, " (hw accelerated)"); -+ else if (digest_driver_info[i].accelerated == DEVCRYPTO_NOT_ACCELERATED) -+ fprintf(stderr, " (software)"); -+ else -+ fprintf(stderr, " (acceleration status unknown)"); -+ if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_FAILURE) -+ fprintf (stderr, ". Cipher setup failed\n"); -+ else if (digest_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCCPHASH) -+ fprintf(stderr, ", CIOCCPHASH failed\n"); -+ else -+ fprintf(stderr, ", CIOCCPHASH capable\n"); -+ } -+ fprintf(stderr, "\n"); -+} -+ - #endif - - /****************************************************************************** -@@ -983,6 +1074,11 @@ static const ENGINE_CMD_DEFN devcrypto_c - ENGINE_CMD_FLAG_STRING}, - #endif - -+ {DEVCRYPTO_CMD_DUMP_INFO, -+ "DUMP_INFO", -+ "dump info about each algorithm to stderr; use 'openssl engine -pre DUMP_INFO devcrypto'", -+ ENGINE_CMD_FLAG_NO_INPUT}, -+ - {0, NULL, NULL, 0} - }; - -@@ -1051,6 +1147,13 @@ static int devcrypto_ctrl(ENGINE *e, int - return 1; - #endif /* IMPLEMENT_DIGEST */ - -+ case DEVCRYPTO_CMD_DUMP_INFO: -+ dump_cipher_info(); -+#ifdef IMPLEMENT_DIGEST -+ dump_digest_info(); -+#endif -+ return 1; -+ - default: - break; - } diff --git a/package/libs/openssl/patches/430-e_devcrypto-make-the-dev-crypto-engine-dynamic.patch b/package/libs/openssl/patches/430-e_devcrypto-make-the-dev-crypto-engine-dynamic.patch deleted file mode 100644 index 00c74972ab..0000000000 --- a/package/libs/openssl/patches/430-e_devcrypto-make-the-dev-crypto-engine-dynamic.patch +++ /dev/null @@ -1,2718 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Eneas U de Queiroz -Date: Tue, 6 Nov 2018 10:57:03 -0200 -Subject: e_devcrypto: make the /dev/crypto engine dynamic - -Engine has been moved from crypto/engine/eng_devcrypto.c to -engines/e_devcrypto.c. - -Signed-off-by: Eneas U de Queiroz - ---- a/crypto/engine/build.info -+++ b/crypto/engine/build.info -@@ -6,6 +6,3 @@ SOURCE[../../libcrypto]=\ - tb_cipher.c tb_digest.c tb_pkmeth.c tb_asnmth.c tb_eckey.c \ - eng_openssl.c eng_cnf.c eng_dyn.c \ - eng_rdrand.c --IF[{- !$disabled{devcryptoeng} -}] -- SOURCE[../../libcrypto]=eng_devcrypto.c --ENDIF ---- a/crypto/init.c -+++ b/crypto/init.c -@@ -328,18 +328,6 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_engine_ - engine_load_openssl_int(); - return 1; - } --# ifndef OPENSSL_NO_DEVCRYPTOENG --static CRYPTO_ONCE engine_devcrypto = CRYPTO_ONCE_STATIC_INIT; --DEFINE_RUN_ONCE_STATIC(ossl_init_engine_devcrypto) --{ --# ifdef OPENSSL_INIT_DEBUG -- fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_devcrypto: " -- "engine_load_devcrypto_int()\n"); --# endif -- engine_load_devcrypto_int(); -- return 1; --} --# endif - - # ifndef OPENSSL_NO_RDRAND - static CRYPTO_ONCE engine_rdrand = CRYPTO_ONCE_STATIC_INIT; -@@ -364,6 +352,18 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_engine_ - return 1; - } - # ifndef OPENSSL_NO_STATIC_ENGINE -+# ifndef OPENSSL_NO_DEVCRYPTOENG -+static CRYPTO_ONCE engine_devcrypto = CRYPTO_ONCE_STATIC_INIT; -+DEFINE_RUN_ONCE_STATIC(ossl_init_engine_devcrypto) -+{ -+# ifdef OPENSSL_INIT_DEBUG -+ fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_devcrypto: " -+ "engine_load_devcrypto_int()\n"); -+# endif -+ engine_load_devcrypto_int(); -+ return 1; -+} -+# endif - # if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_PADLOCK) - static CRYPTO_ONCE engine_padlock = CRYPTO_ONCE_STATIC_INIT; - DEFINE_RUN_ONCE_STATIC(ossl_init_engine_padlock) -@@ -704,11 +704,6 @@ int OPENSSL_init_crypto(uint64_t opts, c - if ((opts & OPENSSL_INIT_ENGINE_OPENSSL) - && !RUN_ONCE(&engine_openssl, ossl_init_engine_openssl)) - return 0; --# if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_DEVCRYPTOENG) -- if ((opts & OPENSSL_INIT_ENGINE_CRYPTODEV) -- && !RUN_ONCE(&engine_devcrypto, ossl_init_engine_devcrypto)) -- return 0; --# endif - # ifndef OPENSSL_NO_RDRAND - if ((opts & OPENSSL_INIT_ENGINE_RDRAND) - && !RUN_ONCE(&engine_rdrand, ossl_init_engine_rdrand)) -@@ -718,6 +713,11 @@ int OPENSSL_init_crypto(uint64_t opts, c - && !RUN_ONCE(&engine_dynamic, ossl_init_engine_dynamic)) - return 0; - # ifndef OPENSSL_NO_STATIC_ENGINE -+# ifndef OPENSSL_NO_DEVCRYPTOENG -+ if ((opts & OPENSSL_INIT_ENGINE_CRYPTODEV) -+ && !RUN_ONCE(&engine_devcrypto, ossl_init_engine_devcrypto)) -+ return 0; -+# endif - # if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_PADLOCK) - if ((opts & OPENSSL_INIT_ENGINE_PADLOCK) - && !RUN_ONCE(&engine_padlock, ossl_init_engine_padlock)) ---- a/engines/build.info -+++ b/engines/build.info -@@ -11,6 +11,9 @@ IF[{- !$disabled{"engine"} -}] - IF[{- !$disabled{afalgeng} -}] - SOURCE[../libcrypto]=e_afalg.c - ENDIF -+ IF[{- !$disabled{"devcryptoeng"} -}] -+ SOURCE[../libcrypto]=e_devcrypto.c -+ ENDIF - ELSE - IF[{- !$disabled{hw} && !$disabled{'hw-padlock'} -}] - ENGINES=padlock -@@ -30,6 +33,12 @@ IF[{- !$disabled{"engine"} -}] - DEPEND[afalg]=../libcrypto - INCLUDE[afalg]= ../include - ENDIF -+ IF[{- !$disabled{"devcryptoeng"} -}] -+ ENGINES=devcrypto -+ SOURCE[devcrypto]=e_devcrypto.c -+ DEPEND[devcrypto]=../libcrypto -+ INCLUDE[devcrypto]=../include -+ ENDIF - - ENGINES_NO_INST=ossltest dasync - SOURCE[dasync]=e_dasync.c ---- a/crypto/engine/eng_devcrypto.c -+++ /dev/null -@@ -1,1277 +0,0 @@ --/* -- * Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#include "e_os.h" --#include --#include --#include --#include --#include --#include --#include -- --#include --#include --#include --#include --#include --#include -- --#include "crypto/engine.h" -- --/* #define ENGINE_DEVCRYPTO_DEBUG */ -- --#if CRYPTO_ALGORITHM_MIN < CRYPTO_ALGORITHM_MAX --# define CHECK_BSD_STYLE_MACROS --#endif -- --/* -- * ONE global file descriptor for all sessions. This allows operations -- * such as digest session data copying (see digest_copy()), but is also -- * saner... why re-open /dev/crypto for every session? -- */ --static int cfd; --#define DEVCRYPTO_REQUIRE_ACCELERATED 0 /* require confirmation of acceleration */ --#define DEVCRYPTO_USE_SOFTWARE 1 /* allow software drivers */ --#define DEVCRYPTO_REJECT_SOFTWARE 2 /* only disallow confirmed software drivers */ -- --#define DEVCRYPTO_DEFAULT_USE_SOFDTRIVERS DEVCRYPTO_REJECT_SOFTWARE --static int use_softdrivers = DEVCRYPTO_DEFAULT_USE_SOFDTRIVERS; -- --/* -- * cipher/digest status & acceleration definitions -- * Make sure the defaults are set to 0 -- */ --struct driver_info_st { -- enum devcrypto_status_t { -- DEVCRYPTO_STATUS_FAILURE = -3, /* unusable for other reason */ -- DEVCRYPTO_STATUS_NO_CIOCCPHASH = -2, /* hash state copy not supported */ -- DEVCRYPTO_STATUS_NO_CIOCGSESSION = -1, /* session open failed */ -- DEVCRYPTO_STATUS_UNKNOWN = 0, /* not tested yet */ -- DEVCRYPTO_STATUS_USABLE = 1 /* algo can be used */ -- } status; -- -- enum devcrypto_accelerated_t { -- DEVCRYPTO_NOT_ACCELERATED = -1, /* software implemented */ -- DEVCRYPTO_ACCELERATION_UNKNOWN = 0, /* acceleration support unkown */ -- DEVCRYPTO_ACCELERATED = 1 /* hardware accelerated */ -- } accelerated; -- -- char *driver_name; --}; -- --static int clean_devcrypto_session(struct session_op *sess) { -- if (ioctl(cfd, CIOCFSESSION, &sess->ses) < 0) { -- SYSerr(SYS_F_IOCTL, errno); -- return 0; -- } -- memset(sess, 0, sizeof(struct session_op)); -- return 1; --} -- --/****************************************************************************** -- * -- * Ciphers -- * -- * Because they all do the same basic operation, we have only one set of -- * method functions for them all to share, and a mapping table between -- * NIDs and cryptodev IDs, with all the necessary size data. -- * -- *****/ -- --struct cipher_ctx { -- struct session_op sess; -- int op; /* COP_ENCRYPT or COP_DECRYPT */ -- unsigned long mode; /* EVP_CIPH_*_MODE */ -- -- /* to handle ctr mode being a stream cipher */ -- unsigned char partial[EVP_MAX_BLOCK_LENGTH]; -- unsigned int blocksize, num; --}; -- --static const struct cipher_data_st { -- int nid; -- int blocksize; -- int keylen; -- int ivlen; -- int flags; -- int devcryptoid; --} cipher_data[] = { --#ifndef OPENSSL_NO_DES -- { NID_des_cbc, 8, 8, 8, EVP_CIPH_CBC_MODE, CRYPTO_DES_CBC }, -- { NID_des_ede3_cbc, 8, 24, 8, EVP_CIPH_CBC_MODE, CRYPTO_3DES_CBC }, --#endif --#ifndef OPENSSL_NO_BF -- { NID_bf_cbc, 8, 16, 8, EVP_CIPH_CBC_MODE, CRYPTO_BLF_CBC }, --#endif --#ifndef OPENSSL_NO_CAST -- { NID_cast5_cbc, 8, 16, 8, EVP_CIPH_CBC_MODE, CRYPTO_CAST_CBC }, --#endif -- { NID_aes_128_cbc, 16, 128 / 8, 16, EVP_CIPH_CBC_MODE, CRYPTO_AES_CBC }, -- { NID_aes_192_cbc, 16, 192 / 8, 16, EVP_CIPH_CBC_MODE, CRYPTO_AES_CBC }, -- { NID_aes_256_cbc, 16, 256 / 8, 16, EVP_CIPH_CBC_MODE, CRYPTO_AES_CBC }, --#ifndef OPENSSL_NO_RC4 -- { NID_rc4, 1, 16, 0, EVP_CIPH_STREAM_CIPHER, CRYPTO_ARC4 }, --#endif --#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_AES_CTR) -- { NID_aes_128_ctr, 16, 128 / 8, 16, EVP_CIPH_CTR_MODE, CRYPTO_AES_CTR }, -- { NID_aes_192_ctr, 16, 192 / 8, 16, EVP_CIPH_CTR_MODE, CRYPTO_AES_CTR }, -- { NID_aes_256_ctr, 16, 256 / 8, 16, EVP_CIPH_CTR_MODE, CRYPTO_AES_CTR }, --#endif --#if 0 /* Not yet supported */ -- { NID_aes_128_xts, 16, 128 / 8 * 2, 16, EVP_CIPH_XTS_MODE, CRYPTO_AES_XTS }, -- { NID_aes_256_xts, 16, 256 / 8 * 2, 16, EVP_CIPH_XTS_MODE, CRYPTO_AES_XTS }, --#endif --#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_AES_ECB) -- { NID_aes_128_ecb, 16, 128 / 8, 0, EVP_CIPH_ECB_MODE, CRYPTO_AES_ECB }, -- { NID_aes_192_ecb, 16, 192 / 8, 0, EVP_CIPH_ECB_MODE, CRYPTO_AES_ECB }, -- { NID_aes_256_ecb, 16, 256 / 8, 0, EVP_CIPH_ECB_MODE, CRYPTO_AES_ECB }, --#endif --#if 0 /* Not yet supported */ -- { NID_aes_128_gcm, 16, 128 / 8, 16, EVP_CIPH_GCM_MODE, CRYPTO_AES_GCM }, -- { NID_aes_192_gcm, 16, 192 / 8, 16, EVP_CIPH_GCM_MODE, CRYPTO_AES_GCM }, -- { NID_aes_256_gcm, 16, 256 / 8, 16, EVP_CIPH_GCM_MODE, CRYPTO_AES_GCM }, --#endif --#ifndef OPENSSL_NO_CAMELLIA -- { NID_camellia_128_cbc, 16, 128 / 8, 16, EVP_CIPH_CBC_MODE, -- CRYPTO_CAMELLIA_CBC }, -- { NID_camellia_192_cbc, 16, 192 / 8, 16, EVP_CIPH_CBC_MODE, -- CRYPTO_CAMELLIA_CBC }, -- { NID_camellia_256_cbc, 16, 256 / 8, 16, EVP_CIPH_CBC_MODE, -- CRYPTO_CAMELLIA_CBC }, --#endif --}; -- --static size_t find_cipher_data_index(int nid) --{ -- size_t i; -- -- for (i = 0; i < OSSL_NELEM(cipher_data); i++) -- if (nid == cipher_data[i].nid) -- return i; -- return (size_t)-1; --} -- --static size_t get_cipher_data_index(int nid) --{ -- size_t i = find_cipher_data_index(nid); -- -- if (i != (size_t)-1) -- return i; -- -- /* -- * Code further down must make sure that only NIDs in the table above -- * are used. If any other NID reaches this function, there's a grave -- * coding error further down. -- */ -- assert("Code that never should be reached" == NULL); -- return -1; --} -- --static const struct cipher_data_st *get_cipher_data(int nid) --{ -- return &cipher_data[get_cipher_data_index(nid)]; --} -- --/* -- * Following are the three necessary functions to map OpenSSL functionality -- * with cryptodev. -- */ -- --static int cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, -- const unsigned char *iv, int enc) --{ -- struct cipher_ctx *cipher_ctx = -- (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); -- const struct cipher_data_st *cipher_d = -- get_cipher_data(EVP_CIPHER_CTX_nid(ctx)); -- -- /* cleanup a previous session */ -- if (cipher_ctx->sess.ses != 0 && -- clean_devcrypto_session(&cipher_ctx->sess) == 0) -- return 0; -- -- cipher_ctx->sess.cipher = cipher_d->devcryptoid; -- cipher_ctx->sess.keylen = cipher_d->keylen; -- cipher_ctx->sess.key = (void *)key; -- cipher_ctx->op = enc ? COP_ENCRYPT : COP_DECRYPT; -- cipher_ctx->mode = cipher_d->flags & EVP_CIPH_MODE; -- cipher_ctx->blocksize = cipher_d->blocksize; -- if (ioctl(cfd, CIOCGSESSION, &cipher_ctx->sess) < 0) { -- SYSerr(SYS_F_IOCTL, errno); -- return 0; -- } -- -- return 1; --} -- --static int cipher_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, -- const unsigned char *in, size_t inl) --{ -- struct cipher_ctx *cipher_ctx = -- (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); -- struct crypt_op cryp; -- unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx); --#if !defined(COP_FLAG_WRITE_IV) -- unsigned char saved_iv[EVP_MAX_IV_LENGTH]; -- const unsigned char *ivptr; -- size_t nblocks, ivlen; --#endif -- -- memset(&cryp, 0, sizeof(cryp)); -- cryp.ses = cipher_ctx->sess.ses; -- cryp.len = inl; -- cryp.src = (void *)in; -- cryp.dst = (void *)out; -- cryp.iv = (void *)iv; -- cryp.op = cipher_ctx->op; --#if !defined(COP_FLAG_WRITE_IV) -- cryp.flags = 0; -- -- ivlen = EVP_CIPHER_CTX_iv_length(ctx); -- if (ivlen > 0) -- switch (cipher_ctx->mode) { -- case EVP_CIPH_CBC_MODE: -- assert(inl >= ivlen); -- if (!EVP_CIPHER_CTX_encrypting(ctx)) { -- ivptr = in + inl - ivlen; -- memcpy(saved_iv, ivptr, ivlen); -- } -- break; -- -- case EVP_CIPH_CTR_MODE: -- break; -- -- default: /* should not happen */ -- return 0; -- } --#else -- cryp.flags = COP_FLAG_WRITE_IV; --#endif -- -- if (ioctl(cfd, CIOCCRYPT, &cryp) < 0) { -- SYSerr(SYS_F_IOCTL, errno); -- return 0; -- } -- --#if !defined(COP_FLAG_WRITE_IV) -- if (ivlen > 0) -- switch (cipher_ctx->mode) { -- case EVP_CIPH_CBC_MODE: -- assert(inl >= ivlen); -- if (EVP_CIPHER_CTX_encrypting(ctx)) -- ivptr = out + inl - ivlen; -- else -- ivptr = saved_iv; -- -- memcpy(iv, ivptr, ivlen); -- break; -- -- case EVP_CIPH_CTR_MODE: -- nblocks = (inl + cipher_ctx->blocksize - 1) -- / cipher_ctx->blocksize; -- do { -- ivlen--; -- nblocks += iv[ivlen]; -- iv[ivlen] = (uint8_t) nblocks; -- nblocks >>= 8; -- } while (ivlen); -- break; -- -- default: /* should not happen */ -- return 0; -- } --#endif -- -- return 1; --} -- --static int ctr_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, -- const unsigned char *in, size_t inl) --{ -- struct cipher_ctx *cipher_ctx = -- (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); -- size_t nblocks, len; -- -- /* initial partial block */ -- while (cipher_ctx->num && inl) { -- (*out++) = *(in++) ^ cipher_ctx->partial[cipher_ctx->num]; -- --inl; -- cipher_ctx->num = (cipher_ctx->num + 1) % cipher_ctx->blocksize; -- } -- -- /* full blocks */ -- if (inl > (unsigned int) cipher_ctx->blocksize) { -- nblocks = inl/cipher_ctx->blocksize; -- len = nblocks * cipher_ctx->blocksize; -- if (cipher_do_cipher(ctx, out, in, len) < 1) -- return 0; -- inl -= len; -- out += len; -- in += len; -- } -- -- /* final partial block */ -- if (inl) { -- memset(cipher_ctx->partial, 0, cipher_ctx->blocksize); -- if (cipher_do_cipher(ctx, cipher_ctx->partial, cipher_ctx->partial, -- cipher_ctx->blocksize) < 1) -- return 0; -- while (inl--) { -- out[cipher_ctx->num] = in[cipher_ctx->num] -- ^ cipher_ctx->partial[cipher_ctx->num]; -- cipher_ctx->num++; -- } -- } -- -- return 1; --} -- --static int cipher_ctrl(EVP_CIPHER_CTX *ctx, int type, int p1, void* p2) --{ -- struct cipher_ctx *cipher_ctx = -- (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); -- EVP_CIPHER_CTX *to_ctx = (EVP_CIPHER_CTX *)p2; -- struct cipher_ctx *to_cipher_ctx; -- -- switch (type) { -- case EVP_CTRL_COPY: -- if (cipher_ctx == NULL) -- return 1; -- /* when copying the context, a new session needs to be initialized */ -- to_cipher_ctx = -- (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(to_ctx); -- memset(&to_cipher_ctx->sess, 0, sizeof(to_cipher_ctx->sess)); -- return cipher_init(to_ctx, cipher_ctx->sess.key, EVP_CIPHER_CTX_iv(ctx), -- (cipher_ctx->op == COP_ENCRYPT)); -- -- case EVP_CTRL_INIT: -- memset(&cipher_ctx->sess, 0, sizeof(cipher_ctx->sess)); -- return 1; -- -- default: -- break; -- } -- -- return -1; --} -- --static int cipher_cleanup(EVP_CIPHER_CTX *ctx) --{ -- struct cipher_ctx *cipher_ctx = -- (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); -- -- return clean_devcrypto_session(&cipher_ctx->sess); --} -- --/* -- * Keep tables of known nids, associated methods, selected ciphers, and driver -- * info. -- * Note that known_cipher_nids[] isn't necessarily indexed the same way as -- * cipher_data[] above, which the other tables are. -- */ --static int known_cipher_nids[OSSL_NELEM(cipher_data)]; --static int known_cipher_nids_amount = -1; /* -1 indicates not yet initialised */ --static EVP_CIPHER *known_cipher_methods[OSSL_NELEM(cipher_data)] = { NULL, }; --static int selected_ciphers[OSSL_NELEM(cipher_data)]; --static struct driver_info_st cipher_driver_info[OSSL_NELEM(cipher_data)]; -- -- --static int devcrypto_test_cipher(size_t cipher_data_index) --{ -- return (cipher_driver_info[cipher_data_index].status == DEVCRYPTO_STATUS_USABLE -- && selected_ciphers[cipher_data_index] == 1 -- && (cipher_driver_info[cipher_data_index].accelerated -- == DEVCRYPTO_ACCELERATED -- || use_softdrivers == DEVCRYPTO_USE_SOFTWARE -- || (cipher_driver_info[cipher_data_index].accelerated -- != DEVCRYPTO_NOT_ACCELERATED -- && use_softdrivers == DEVCRYPTO_REJECT_SOFTWARE))); --} -- --static void prepare_cipher_methods(void) --{ -- size_t i; -- struct session_op sess; -- unsigned long cipher_mode; --#ifdef CIOCGSESSINFO -- struct session_info_op siop; --#endif -- -- memset(&cipher_driver_info, 0, sizeof(cipher_driver_info)); -- -- memset(&sess, 0, sizeof(sess)); -- sess.key = (void *)"01234567890123456789012345678901234567890123456789"; -- -- for (i = 0, known_cipher_nids_amount = 0; -- i < OSSL_NELEM(cipher_data); i++) { -- -- selected_ciphers[i] = 1; -- /* -- * Check that the cipher is usable -- */ -- sess.cipher = cipher_data[i].devcryptoid; -- sess.keylen = cipher_data[i].keylen; -- if (ioctl(cfd, CIOCGSESSION, &sess) < 0) { -- cipher_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCGSESSION; -- continue; -- } -- -- cipher_mode = cipher_data[i].flags & EVP_CIPH_MODE; -- -- if ((known_cipher_methods[i] = -- EVP_CIPHER_meth_new(cipher_data[i].nid, -- cipher_mode == EVP_CIPH_CTR_MODE ? 1 : -- cipher_data[i].blocksize, -- cipher_data[i].keylen)) == NULL -- || !EVP_CIPHER_meth_set_iv_length(known_cipher_methods[i], -- cipher_data[i].ivlen) -- || !EVP_CIPHER_meth_set_flags(known_cipher_methods[i], -- cipher_data[i].flags -- | EVP_CIPH_CUSTOM_COPY -- | EVP_CIPH_CTRL_INIT -- | EVP_CIPH_FLAG_DEFAULT_ASN1) -- || !EVP_CIPHER_meth_set_init(known_cipher_methods[i], cipher_init) -- || !EVP_CIPHER_meth_set_do_cipher(known_cipher_methods[i], -- cipher_mode == EVP_CIPH_CTR_MODE ? -- ctr_do_cipher : -- cipher_do_cipher) -- || !EVP_CIPHER_meth_set_ctrl(known_cipher_methods[i], cipher_ctrl) -- || !EVP_CIPHER_meth_set_cleanup(known_cipher_methods[i], -- cipher_cleanup) -- || !EVP_CIPHER_meth_set_impl_ctx_size(known_cipher_methods[i], -- sizeof(struct cipher_ctx))) { -- cipher_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; -- EVP_CIPHER_meth_free(known_cipher_methods[i]); -- known_cipher_methods[i] = NULL; -- } else { -- cipher_driver_info[i].status = DEVCRYPTO_STATUS_USABLE; --#ifdef CIOCGSESSINFO -- siop.ses = sess.ses; -- if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) { -- cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; -- } else { -- cipher_driver_info[i].driver_name = -- OPENSSL_strndup(siop.cipher_info.cra_driver_name, -- CRYPTODEV_MAX_ALG_NAME); -- if (!(siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY)) -- cipher_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; -- else -- cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; -- } --#endif /* CIOCGSESSINFO */ -- } -- ioctl(cfd, CIOCFSESSION, &sess.ses); -- if (devcrypto_test_cipher(i)) { -- known_cipher_nids[known_cipher_nids_amount++] = -- cipher_data[i].nid; -- } -- } --} -- --static void rebuild_known_cipher_nids(ENGINE *e) --{ -- size_t i; -- -- for (i = 0, known_cipher_nids_amount = 0; i < OSSL_NELEM(cipher_data); i++) { -- if (devcrypto_test_cipher(i)) -- known_cipher_nids[known_cipher_nids_amount++] = cipher_data[i].nid; -- } -- ENGINE_unregister_ciphers(e); -- ENGINE_register_ciphers(e); --} -- --static const EVP_CIPHER *get_cipher_method(int nid) --{ -- size_t i = get_cipher_data_index(nid); -- -- if (i == (size_t)-1) -- return NULL; -- return known_cipher_methods[i]; --} -- --static int get_cipher_nids(const int **nids) --{ -- *nids = known_cipher_nids; -- return known_cipher_nids_amount; --} -- --static void destroy_cipher_method(int nid) --{ -- size_t i = get_cipher_data_index(nid); -- -- EVP_CIPHER_meth_free(known_cipher_methods[i]); -- known_cipher_methods[i] = NULL; --} -- --static void destroy_all_cipher_methods(void) --{ -- size_t i; -- -- for (i = 0; i < OSSL_NELEM(cipher_data); i++) { -- destroy_cipher_method(cipher_data[i].nid); -- OPENSSL_free(cipher_driver_info[i].driver_name); -- cipher_driver_info[i].driver_name = NULL; -- } --} -- --static int devcrypto_ciphers(ENGINE *e, const EVP_CIPHER **cipher, -- const int **nids, int nid) --{ -- if (cipher == NULL) -- return get_cipher_nids(nids); -- -- *cipher = get_cipher_method(nid); -- -- return *cipher != NULL; --} -- --static void devcrypto_select_all_ciphers(int *cipher_list) --{ -- size_t i; -- -- for (i = 0; i < OSSL_NELEM(cipher_data); i++) -- cipher_list[i] = 1; --} -- --static int cryptodev_select_cipher_cb(const char *str, int len, void *usr) --{ -- int *cipher_list = (int *)usr; -- char *name; -- const EVP_CIPHER *EVP; -- size_t i; -- -- if (len == 0) -- return 1; -- if (usr == NULL || (name = OPENSSL_strndup(str, len)) == NULL) -- return 0; -- EVP = EVP_get_cipherbyname(name); -- if (EVP == NULL) -- fprintf(stderr, "devcrypto: unknown cipher %s\n", name); -- else if ((i = find_cipher_data_index(EVP_CIPHER_nid(EVP))) != (size_t)-1) -- cipher_list[i] = 1; -- else -- fprintf(stderr, "devcrypto: cipher %s not available\n", name); -- OPENSSL_free(name); -- return 1; --} -- --static void dump_cipher_info(void) --{ -- size_t i; -- const char *name; -- -- fprintf (stderr, "Information about ciphers supported by the /dev/crypto" -- " engine:\n"); --#ifndef CIOCGSESSINFO -- fprintf(stderr, "CIOCGSESSINFO (session info call) unavailable\n"); --#endif -- for (i = 0; i < OSSL_NELEM(cipher_data); i++) { -- name = OBJ_nid2sn(cipher_data[i].nid); -- fprintf (stderr, "Cipher %s, NID=%d, /dev/crypto info: id=%d, ", -- name ? name : "unknown", cipher_data[i].nid, -- cipher_data[i].devcryptoid); -- if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCGSESSION ) { -- fprintf (stderr, "CIOCGSESSION (session open call) failed\n"); -- continue; -- } -- fprintf (stderr, "driver=%s ", cipher_driver_info[i].driver_name ? -- cipher_driver_info[i].driver_name : "unknown"); -- if (cipher_driver_info[i].accelerated == DEVCRYPTO_ACCELERATED) -- fprintf(stderr, "(hw accelerated)"); -- else if (cipher_driver_info[i].accelerated == DEVCRYPTO_NOT_ACCELERATED) -- fprintf(stderr, "(software)"); -- else -- fprintf(stderr, "(acceleration status unknown)"); -- if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_FAILURE) -- fprintf (stderr, ". Cipher setup failed"); -- fprintf(stderr, "\n"); -- } -- fprintf(stderr, "\n"); --} -- --/* -- * We only support digests if the cryptodev implementation supports multiple -- * data updates and session copying. Otherwise, we would be forced to maintain -- * a cache, which is perilous if there's a lot of data coming in (if someone -- * wants to checksum an OpenSSL tarball, for example). -- */ --#if defined(CIOCCPHASH) && defined(COP_FLAG_UPDATE) && defined(COP_FLAG_FINAL) --#define IMPLEMENT_DIGEST -- --/****************************************************************************** -- * -- * Digests -- * -- * Because they all do the same basic operation, we have only one set of -- * method functions for them all to share, and a mapping table between -- * NIDs and cryptodev IDs, with all the necessary size data. -- * -- *****/ -- --struct digest_ctx { -- struct session_op sess; -- /* This signals that the init function was called, not that it succeeded. */ -- int init_called; -- unsigned char digest_res[HASH_MAX_LEN]; --}; -- --static const struct digest_data_st { -- int nid; -- int blocksize; -- int digestlen; -- int devcryptoid; --} digest_data[] = { --#ifndef OPENSSL_NO_MD5 -- { NID_md5, /* MD5_CBLOCK */ 64, 16, CRYPTO_MD5 }, --#endif -- { NID_sha1, SHA_CBLOCK, 20, CRYPTO_SHA1 }, --#ifndef OPENSSL_NO_RMD160 --# if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_RIPEMD160) -- { NID_ripemd160, /* RIPEMD160_CBLOCK */ 64, 20, CRYPTO_RIPEMD160 }, --# endif --#endif --#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_224) -- { NID_sha224, SHA256_CBLOCK, 224 / 8, CRYPTO_SHA2_224 }, --#endif --#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_256) -- { NID_sha256, SHA256_CBLOCK, 256 / 8, CRYPTO_SHA2_256 }, --#endif --#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_384) -- { NID_sha384, SHA512_CBLOCK, 384 / 8, CRYPTO_SHA2_384 }, --#endif --#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_512) -- { NID_sha512, SHA512_CBLOCK, 512 / 8, CRYPTO_SHA2_512 }, --#endif --}; -- --static size_t find_digest_data_index(int nid) --{ -- size_t i; -- -- for (i = 0; i < OSSL_NELEM(digest_data); i++) -- if (nid == digest_data[i].nid) -- return i; -- return (size_t)-1; --} -- --static size_t get_digest_data_index(int nid) --{ -- size_t i = find_digest_data_index(nid); -- -- if (i != (size_t)-1) -- return i; -- -- /* -- * Code further down must make sure that only NIDs in the table above -- * are used. If any other NID reaches this function, there's a grave -- * coding error further down. -- */ -- assert("Code that never should be reached" == NULL); -- return -1; --} -- --static const struct digest_data_st *get_digest_data(int nid) --{ -- return &digest_data[get_digest_data_index(nid)]; --} -- --/* -- * Following are the five necessary functions to map OpenSSL functionality -- * with cryptodev: init, update, final, cleanup, and copy. -- */ -- --static int digest_init(EVP_MD_CTX *ctx) --{ -- struct digest_ctx *digest_ctx = -- (struct digest_ctx *)EVP_MD_CTX_md_data(ctx); -- const struct digest_data_st *digest_d = -- get_digest_data(EVP_MD_CTX_type(ctx)); -- -- digest_ctx->init_called = 1; -- -- memset(&digest_ctx->sess, 0, sizeof(digest_ctx->sess)); -- digest_ctx->sess.mac = digest_d->devcryptoid; -- if (ioctl(cfd, CIOCGSESSION, &digest_ctx->sess) < 0) { -- SYSerr(SYS_F_IOCTL, errno); -- return 0; -- } -- -- return 1; --} -- --static int digest_op(struct digest_ctx *ctx, const void *src, size_t srclen, -- void *res, unsigned int flags) --{ -- struct crypt_op cryp; -- -- memset(&cryp, 0, sizeof(cryp)); -- cryp.ses = ctx->sess.ses; -- cryp.len = srclen; -- cryp.src = (void *)src; -- cryp.dst = NULL; -- cryp.mac = res; -- cryp.flags = flags; -- return ioctl(cfd, CIOCCRYPT, &cryp); --} -- --static int digest_update(EVP_MD_CTX *ctx, const void *data, size_t count) --{ -- struct digest_ctx *digest_ctx = -- (struct digest_ctx *)EVP_MD_CTX_md_data(ctx); -- -- if (count == 0) -- return 1; -- -- if (digest_ctx == NULL) -- return 0; -- -- if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_ONESHOT)) { -- if (digest_op(digest_ctx, data, count, digest_ctx->digest_res, 0) >= 0) -- return 1; -- } else if (digest_op(digest_ctx, data, count, NULL, COP_FLAG_UPDATE) >= 0) { -- return 1; -- } -- -- SYSerr(SYS_F_IOCTL, errno); -- return 0; --} -- --static int digest_final(EVP_MD_CTX *ctx, unsigned char *md) --{ -- struct digest_ctx *digest_ctx = -- (struct digest_ctx *)EVP_MD_CTX_md_data(ctx); -- -- if (md == NULL || digest_ctx == NULL) -- return 0; -- -- if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_ONESHOT)) { -- memcpy(md, digest_ctx->digest_res, EVP_MD_CTX_size(ctx)); -- } else if (digest_op(digest_ctx, NULL, 0, md, COP_FLAG_FINAL) < 0) { -- SYSerr(SYS_F_IOCTL, errno); -- return 0; -- } -- -- return 1; --} -- --static int digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from) --{ -- struct digest_ctx *digest_from = -- (struct digest_ctx *)EVP_MD_CTX_md_data(from); -- struct digest_ctx *digest_to = -- (struct digest_ctx *)EVP_MD_CTX_md_data(to); -- struct cphash_op cphash; -- -- if (digest_from == NULL || digest_from->init_called != 1) -- return 1; -- -- if (!digest_init(to)) { -- SYSerr(SYS_F_IOCTL, errno); -- return 0; -- } -- -- cphash.src_ses = digest_from->sess.ses; -- cphash.dst_ses = digest_to->sess.ses; -- if (ioctl(cfd, CIOCCPHASH, &cphash) < 0) { -- SYSerr(SYS_F_IOCTL, errno); -- return 0; -- } -- return 1; --} -- --static int digest_cleanup(EVP_MD_CTX *ctx) --{ -- struct digest_ctx *digest_ctx = -- (struct digest_ctx *)EVP_MD_CTX_md_data(ctx); -- -- if (digest_ctx == NULL) -- return 1; -- -- return clean_devcrypto_session(&digest_ctx->sess); --} -- --/* -- * Keep tables of known nids, associated methods, selected digests, and -- * driver info. -- * Note that known_digest_nids[] isn't necessarily indexed the same way as -- * digest_data[] above, which the other tables are. -- */ --static int known_digest_nids[OSSL_NELEM(digest_data)]; --static int known_digest_nids_amount = -1; /* -1 indicates not yet initialised */ --static EVP_MD *known_digest_methods[OSSL_NELEM(digest_data)] = { NULL, }; --static int selected_digests[OSSL_NELEM(digest_data)]; --static struct driver_info_st digest_driver_info[OSSL_NELEM(digest_data)]; -- --static int devcrypto_test_digest(size_t digest_data_index) --{ -- return (digest_driver_info[digest_data_index].status == DEVCRYPTO_STATUS_USABLE -- && selected_digests[digest_data_index] == 1 -- && (digest_driver_info[digest_data_index].accelerated -- == DEVCRYPTO_ACCELERATED -- || use_softdrivers == DEVCRYPTO_USE_SOFTWARE -- || (digest_driver_info[digest_data_index].accelerated -- != DEVCRYPTO_NOT_ACCELERATED -- && use_softdrivers == DEVCRYPTO_REJECT_SOFTWARE))); --} -- --static void rebuild_known_digest_nids(ENGINE *e) --{ -- size_t i; -- -- for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); i++) { -- if (devcrypto_test_digest(i)) -- known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; -- } -- ENGINE_unregister_digests(e); -- ENGINE_register_digests(e); --} -- --static void prepare_digest_methods(void) --{ -- size_t i; -- struct session_op sess1, sess2; --#ifdef CIOCGSESSINFO -- struct session_info_op siop; --#endif -- struct cphash_op cphash; -- -- memset(&digest_driver_info, 0, sizeof(digest_driver_info)); -- -- memset(&sess1, 0, sizeof(sess1)); -- memset(&sess2, 0, sizeof(sess2)); -- -- for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); -- i++) { -- -- selected_digests[i] = 1; -- -- /* -- * Check that the digest is usable -- */ -- sess1.mac = digest_data[i].devcryptoid; -- sess2.ses = 0; -- if (ioctl(cfd, CIOCGSESSION, &sess1) < 0) { -- digest_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCGSESSION; -- goto finish; -- } -- --#ifdef CIOCGSESSINFO -- /* gather hardware acceleration info from the driver */ -- siop.ses = sess1.ses; -- if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) { -- digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; -- } else { -- digest_driver_info[i].driver_name = -- OPENSSL_strndup(siop.hash_info.cra_driver_name, -- CRYPTODEV_MAX_ALG_NAME); -- if (siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY) -- digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; -- else -- digest_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; -- } --#endif -- -- /* digest must be capable of hash state copy */ -- sess2.mac = sess1.mac; -- if (ioctl(cfd, CIOCGSESSION, &sess2) < 0) { -- digest_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; -- goto finish; -- } -- cphash.src_ses = sess1.ses; -- cphash.dst_ses = sess2.ses; -- if (ioctl(cfd, CIOCCPHASH, &cphash) < 0) { -- digest_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCCPHASH; -- goto finish; -- } -- if ((known_digest_methods[i] = EVP_MD_meth_new(digest_data[i].nid, -- NID_undef)) == NULL -- || !EVP_MD_meth_set_input_blocksize(known_digest_methods[i], -- digest_data[i].blocksize) -- || !EVP_MD_meth_set_result_size(known_digest_methods[i], -- digest_data[i].digestlen) -- || !EVP_MD_meth_set_init(known_digest_methods[i], digest_init) -- || !EVP_MD_meth_set_update(known_digest_methods[i], digest_update) -- || !EVP_MD_meth_set_final(known_digest_methods[i], digest_final) -- || !EVP_MD_meth_set_copy(known_digest_methods[i], digest_copy) -- || !EVP_MD_meth_set_cleanup(known_digest_methods[i], digest_cleanup) -- || !EVP_MD_meth_set_app_datasize(known_digest_methods[i], -- sizeof(struct digest_ctx))) { -- digest_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; -- EVP_MD_meth_free(known_digest_methods[i]); -- known_digest_methods[i] = NULL; -- goto finish; -- } -- digest_driver_info[i].status = DEVCRYPTO_STATUS_USABLE; --finish: -- ioctl(cfd, CIOCFSESSION, &sess1.ses); -- if (sess2.ses != 0) -- ioctl(cfd, CIOCFSESSION, &sess2.ses); -- if (devcrypto_test_digest(i)) -- known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; -- } --} -- --static const EVP_MD *get_digest_method(int nid) --{ -- size_t i = get_digest_data_index(nid); -- -- if (i == (size_t)-1) -- return NULL; -- return known_digest_methods[i]; --} -- --static int get_digest_nids(const int **nids) --{ -- *nids = known_digest_nids; -- return known_digest_nids_amount; --} -- --static void destroy_digest_method(int nid) --{ -- size_t i = get_digest_data_index(nid); -- -- EVP_MD_meth_free(known_digest_methods[i]); -- known_digest_methods[i] = NULL; --} -- --static void destroy_all_digest_methods(void) --{ -- size_t i; -- -- for (i = 0; i < OSSL_NELEM(digest_data); i++) { -- destroy_digest_method(digest_data[i].nid); -- OPENSSL_free(digest_driver_info[i].driver_name); -- digest_driver_info[i].driver_name = NULL; -- } --} -- --static int devcrypto_digests(ENGINE *e, const EVP_MD **digest, -- const int **nids, int nid) --{ -- if (digest == NULL) -- return get_digest_nids(nids); -- -- *digest = get_digest_method(nid); -- -- return *digest != NULL; --} -- --static void devcrypto_select_all_digests(int *digest_list) --{ -- size_t i; -- -- for (i = 0; i < OSSL_NELEM(digest_data); i++) -- digest_list[i] = 1; --} -- --static int cryptodev_select_digest_cb(const char *str, int len, void *usr) --{ -- int *digest_list = (int *)usr; -- char *name; -- const EVP_MD *EVP; -- size_t i; -- -- if (len == 0) -- return 1; -- if (usr == NULL || (name = OPENSSL_strndup(str, len)) == NULL) -- return 0; -- EVP = EVP_get_digestbyname(name); -- if (EVP == NULL) -- fprintf(stderr, "devcrypto: unknown digest %s\n", name); -- else if ((i = find_digest_data_index(EVP_MD_type(EVP))) != (size_t)-1) -- digest_list[i] = 1; -- else -- fprintf(stderr, "devcrypto: digest %s not available\n", name); -- OPENSSL_free(name); -- return 1; --} -- --static void dump_digest_info(void) --{ -- size_t i; -- const char *name; -- -- fprintf (stderr, "Information about digests supported by the /dev/crypto" -- " engine:\n"); --#ifndef CIOCGSESSINFO -- fprintf(stderr, "CIOCGSESSINFO (session info call) unavailable\n"); --#endif -- -- for (i = 0; i < OSSL_NELEM(digest_data); i++) { -- name = OBJ_nid2sn(digest_data[i].nid); -- fprintf (stderr, "Digest %s, NID=%d, /dev/crypto info: id=%d, driver=%s", -- name ? name : "unknown", digest_data[i].nid, -- digest_data[i].devcryptoid, -- digest_driver_info[i].driver_name ? digest_driver_info[i].driver_name : "unknown"); -- if (digest_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCGSESSION) { -- fprintf (stderr, ". CIOCGSESSION (session open) failed\n"); -- continue; -- } -- if (digest_driver_info[i].accelerated == DEVCRYPTO_ACCELERATED) -- fprintf(stderr, " (hw accelerated)"); -- else if (digest_driver_info[i].accelerated == DEVCRYPTO_NOT_ACCELERATED) -- fprintf(stderr, " (software)"); -- else -- fprintf(stderr, " (acceleration status unknown)"); -- if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_FAILURE) -- fprintf (stderr, ". Cipher setup failed\n"); -- else if (digest_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCCPHASH) -- fprintf(stderr, ", CIOCCPHASH failed\n"); -- else -- fprintf(stderr, ", CIOCCPHASH capable\n"); -- } -- fprintf(stderr, "\n"); --} -- --#endif -- --/****************************************************************************** -- * -- * CONTROL COMMANDS -- * -- *****/ -- --#define DEVCRYPTO_CMD_USE_SOFTDRIVERS ENGINE_CMD_BASE --#define DEVCRYPTO_CMD_CIPHERS (ENGINE_CMD_BASE + 1) --#define DEVCRYPTO_CMD_DIGESTS (ENGINE_CMD_BASE + 2) --#define DEVCRYPTO_CMD_DUMP_INFO (ENGINE_CMD_BASE + 3) -- --/* Helper macros for CPP string composition */ --#ifndef OPENSSL_MSTR --# define OPENSSL_MSTR_HELPER(x) #x --# define OPENSSL_MSTR(x) OPENSSL_MSTR_HELPER(x) --#endif -- --static const ENGINE_CMD_DEFN devcrypto_cmds[] = { --#ifdef CIOCGSESSINFO -- {DEVCRYPTO_CMD_USE_SOFTDRIVERS, -- "USE_SOFTDRIVERS", -- "specifies whether to use software (not accelerated) drivers (" -- OPENSSL_MSTR(DEVCRYPTO_REQUIRE_ACCELERATED) "=use only accelerated drivers, " -- OPENSSL_MSTR(DEVCRYPTO_USE_SOFTWARE) "=allow all drivers, " -- OPENSSL_MSTR(DEVCRYPTO_REJECT_SOFTWARE) -- "=use if acceleration can't be determined) [default=" -- OPENSSL_MSTR(DEVCRYPTO_DEFAULT_USE_SOFDTRIVERS) "]", -- ENGINE_CMD_FLAG_NUMERIC}, --#endif -- -- {DEVCRYPTO_CMD_CIPHERS, -- "CIPHERS", -- "either ALL, NONE, or a comma-separated list of ciphers to enable [default=ALL]", -- ENGINE_CMD_FLAG_STRING}, -- --#ifdef IMPLEMENT_DIGEST -- {DEVCRYPTO_CMD_DIGESTS, -- "DIGESTS", -- "either ALL, NONE, or a comma-separated list of digests to enable [default=ALL]", -- ENGINE_CMD_FLAG_STRING}, --#endif -- -- {DEVCRYPTO_CMD_DUMP_INFO, -- "DUMP_INFO", -- "dump info about each algorithm to stderr; use 'openssl engine -pre DUMP_INFO devcrypto'", -- ENGINE_CMD_FLAG_NO_INPUT}, -- -- {0, NULL, NULL, 0} --}; -- --static int devcrypto_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) --{ -- int *new_list; -- switch (cmd) { --#ifdef CIOCGSESSINFO -- case DEVCRYPTO_CMD_USE_SOFTDRIVERS: -- switch (i) { -- case DEVCRYPTO_REQUIRE_ACCELERATED: -- case DEVCRYPTO_USE_SOFTWARE: -- case DEVCRYPTO_REJECT_SOFTWARE: -- break; -- default: -- fprintf(stderr, "devcrypto: invalid value (%ld) for USE_SOFTDRIVERS\n", i); -- return 0; -- } -- if (use_softdrivers == i) -- return 1; -- use_softdrivers = i; --#ifdef IMPLEMENT_DIGEST -- rebuild_known_digest_nids(e); --#endif -- rebuild_known_cipher_nids(e); -- return 1; --#endif /* CIOCGSESSINFO */ -- -- case DEVCRYPTO_CMD_CIPHERS: -- if (p == NULL) -- return 1; -- if (strcasecmp((const char *)p, "ALL") == 0) { -- devcrypto_select_all_ciphers(selected_ciphers); -- } else if (strcasecmp((const char*)p, "NONE") == 0) { -- memset(selected_ciphers, 0, sizeof(selected_ciphers)); -- } else { -- new_list=OPENSSL_zalloc(sizeof(selected_ciphers)); -- if (!CONF_parse_list(p, ',', 1, cryptodev_select_cipher_cb, new_list)) { -- OPENSSL_free(new_list); -- return 0; -- } -- memcpy(selected_ciphers, new_list, sizeof(selected_ciphers)); -- OPENSSL_free(new_list); -- } -- rebuild_known_cipher_nids(e); -- return 1; -- --#ifdef IMPLEMENT_DIGEST -- case DEVCRYPTO_CMD_DIGESTS: -- if (p == NULL) -- return 1; -- if (strcasecmp((const char *)p, "ALL") == 0) { -- devcrypto_select_all_digests(selected_digests); -- } else if (strcasecmp((const char*)p, "NONE") == 0) { -- memset(selected_digests, 0, sizeof(selected_digests)); -- } else { -- new_list=OPENSSL_zalloc(sizeof(selected_digests)); -- if (!CONF_parse_list(p, ',', 1, cryptodev_select_digest_cb, new_list)) { -- OPENSSL_free(new_list); -- return 0; -- } -- memcpy(selected_digests, new_list, sizeof(selected_digests)); -- OPENSSL_free(new_list); -- } -- rebuild_known_digest_nids(e); -- return 1; --#endif /* IMPLEMENT_DIGEST */ -- -- case DEVCRYPTO_CMD_DUMP_INFO: -- dump_cipher_info(); --#ifdef IMPLEMENT_DIGEST -- dump_digest_info(); --#endif -- return 1; -- -- default: -- break; -- } -- return 0; --} -- --/****************************************************************************** -- * -- * LOAD / UNLOAD -- * -- *****/ -- --static int devcrypto_unload(ENGINE *e) --{ -- destroy_all_cipher_methods(); --#ifdef IMPLEMENT_DIGEST -- destroy_all_digest_methods(); --#endif -- -- close(cfd); -- -- return 1; --} --/* -- * This engine is always built into libcrypto, so it doesn't offer any -- * ability to be dynamically loadable. -- */ --void engine_load_devcrypto_int() --{ -- ENGINE *e = NULL; -- int fd; -- -- if ((fd = open("/dev/crypto", O_RDWR, 0)) < 0) { --#ifndef ENGINE_DEVCRYPTO_DEBUG -- if (errno != ENOENT) --#endif -- fprintf(stderr, "Could not open /dev/crypto: %s\n", strerror(errno)); -- return; -- } -- --#ifdef CRIOGET -- if (ioctl(fd, CRIOGET, &cfd) < 0) { -- fprintf(stderr, "Could not create crypto fd: %s\n", strerror(errno)); -- close(fd); -- cfd = -1; -- return; -- } -- close(fd); --#else -- cfd = fd; --#endif -- -- if ((e = ENGINE_new()) == NULL -- || !ENGINE_set_destroy_function(e, devcrypto_unload)) { -- ENGINE_free(e); -- /* -- * We know that devcrypto_unload() won't be called when one of the -- * above two calls have failed, so we close cfd explicitly here to -- * avoid leaking resources. -- */ -- close(cfd); -- return; -- } -- -- prepare_cipher_methods(); --#ifdef IMPLEMENT_DIGEST -- prepare_digest_methods(); --#endif -- -- if (!ENGINE_set_id(e, "devcrypto") -- || !ENGINE_set_name(e, "/dev/crypto engine") -- || !ENGINE_set_cmd_defns(e, devcrypto_cmds) -- || !ENGINE_set_ctrl_function(e, devcrypto_ctrl) -- --/* -- * Asymmetric ciphers aren't well supported with /dev/crypto. Among the BSD -- * implementations, it seems to only exist in FreeBSD, and regarding the -- * parameters in its crypt_kop, the manual crypto(4) has this to say: -- * -- * The semantics of these arguments are currently undocumented. -- * -- * Reading through the FreeBSD source code doesn't give much more than -- * their CRK_MOD_EXP implementation for ubsec. -- * -- * It doesn't look much better with cryptodev-linux. They have the crypt_kop -- * structure as well as the command (CRK_*) in cryptodev.h, but no support -- * seems to be implemented at all for the moment. -- * -- * At the time of writing, it seems impossible to write proper support for -- * FreeBSD's asym features without some very deep knowledge and access to -- * specific kernel modules. -- * -- * /Richard Levitte, 2017-05-11 -- */ --#if 0 --# ifndef OPENSSL_NO_RSA -- || !ENGINE_set_RSA(e, devcrypto_rsa) --# endif --# ifndef OPENSSL_NO_DSA -- || !ENGINE_set_DSA(e, devcrypto_dsa) --# endif --# ifndef OPENSSL_NO_DH -- || !ENGINE_set_DH(e, devcrypto_dh) --# endif --# ifndef OPENSSL_NO_EC -- || !ENGINE_set_EC(e, devcrypto_ec) --# endif --#endif -- || !ENGINE_set_ciphers(e, devcrypto_ciphers) --#ifdef IMPLEMENT_DIGEST -- || !ENGINE_set_digests(e, devcrypto_digests) --#endif -- ) { -- ENGINE_free(e); -- return; -- } -- -- ENGINE_add(e); -- ENGINE_free(e); /* Loose our local reference */ -- ERR_clear_error(); --} ---- /dev/null -+++ b/engines/e_devcrypto.c -@@ -0,0 +1,1327 @@ -+/* -+ * Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved. -+ * -+ * Licensed under the OpenSSL license (the "License"). You may not use -+ * this file except in compliance with the License. You can obtain a copy -+ * in the file LICENSE in the source distribution or at -+ * https://www.openssl.org/source/license.html -+ */ -+ -+#include "../e_os.h" -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "crypto/engine.h" -+ -+/* #define ENGINE_DEVCRYPTO_DEBUG */ -+ -+#if CRYPTO_ALGORITHM_MIN < CRYPTO_ALGORITHM_MAX -+# define CHECK_BSD_STYLE_MACROS -+#endif -+ -+#define engine_devcrypto_id "devcrypto" -+ -+/* -+ * ONE global file descriptor for all sessions. This allows operations -+ * such as digest session data copying (see digest_copy()), but is also -+ * saner... why re-open /dev/crypto for every session? -+ */ -+static int cfd = -1; -+#define DEVCRYPTO_REQUIRE_ACCELERATED 0 /* require confirmation of acceleration */ -+#define DEVCRYPTO_USE_SOFTWARE 1 /* allow software drivers */ -+#define DEVCRYPTO_REJECT_SOFTWARE 2 /* only disallow confirmed software drivers */ -+ -+#define DEVCRYPTO_DEFAULT_USE_SOFTDRIVERS DEVCRYPTO_REJECT_SOFTWARE -+static int use_softdrivers = DEVCRYPTO_DEFAULT_USE_SOFTDRIVERS; -+ -+/* -+ * cipher/digest status & acceleration definitions -+ * Make sure the defaults are set to 0 -+ */ -+struct driver_info_st { -+ enum devcrypto_status_t { -+ DEVCRYPTO_STATUS_FAILURE = -3, /* unusable for other reason */ -+ DEVCRYPTO_STATUS_NO_CIOCCPHASH = -2, /* hash state copy not supported */ -+ DEVCRYPTO_STATUS_NO_CIOCGSESSION = -1, /* session open failed */ -+ DEVCRYPTO_STATUS_UNKNOWN = 0, /* not tested yet */ -+ DEVCRYPTO_STATUS_USABLE = 1 /* algo can be used */ -+ } status; -+ -+ enum devcrypto_accelerated_t { -+ DEVCRYPTO_NOT_ACCELERATED = -1, /* software implemented */ -+ DEVCRYPTO_ACCELERATION_UNKNOWN = 0, /* acceleration support unkown */ -+ DEVCRYPTO_ACCELERATED = 1 /* hardware accelerated */ -+ } accelerated; -+ -+ char *driver_name; -+}; -+ -+static int clean_devcrypto_session(struct session_op *sess) { -+ if (ioctl(cfd, CIOCFSESSION, &sess->ses) < 0) { -+ SYSerr(SYS_F_IOCTL, errno); -+ return 0; -+ } -+ memset(sess, 0, sizeof(struct session_op)); -+ return 1; -+} -+ -+/****************************************************************************** -+ * -+ * Ciphers -+ * -+ * Because they all do the same basic operation, we have only one set of -+ * method functions for them all to share, and a mapping table between -+ * NIDs and cryptodev IDs, with all the necessary size data. -+ * -+ *****/ -+ -+struct cipher_ctx { -+ struct session_op sess; -+ int op; /* COP_ENCRYPT or COP_DECRYPT */ -+ unsigned long mode; /* EVP_CIPH_*_MODE */ -+ -+ /* to handle ctr mode being a stream cipher */ -+ unsigned char partial[EVP_MAX_BLOCK_LENGTH]; -+ unsigned int blocksize, num; -+}; -+ -+static const struct cipher_data_st { -+ int nid; -+ int blocksize; -+ int keylen; -+ int ivlen; -+ int flags; -+ int devcryptoid; -+} cipher_data[] = { -+#ifndef OPENSSL_NO_DES -+ { NID_des_cbc, 8, 8, 8, EVP_CIPH_CBC_MODE, CRYPTO_DES_CBC }, -+ { NID_des_ede3_cbc, 8, 24, 8, EVP_CIPH_CBC_MODE, CRYPTO_3DES_CBC }, -+#endif -+#ifndef OPENSSL_NO_BF -+ { NID_bf_cbc, 8, 16, 8, EVP_CIPH_CBC_MODE, CRYPTO_BLF_CBC }, -+#endif -+#ifndef OPENSSL_NO_CAST -+ { NID_cast5_cbc, 8, 16, 8, EVP_CIPH_CBC_MODE, CRYPTO_CAST_CBC }, -+#endif -+ { NID_aes_128_cbc, 16, 128 / 8, 16, EVP_CIPH_CBC_MODE, CRYPTO_AES_CBC }, -+ { NID_aes_192_cbc, 16, 192 / 8, 16, EVP_CIPH_CBC_MODE, CRYPTO_AES_CBC }, -+ { NID_aes_256_cbc, 16, 256 / 8, 16, EVP_CIPH_CBC_MODE, CRYPTO_AES_CBC }, -+#ifndef OPENSSL_NO_RC4 -+ { NID_rc4, 1, 16, 0, EVP_CIPH_STREAM_CIPHER, CRYPTO_ARC4 }, -+#endif -+#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_AES_CTR) -+ { NID_aes_128_ctr, 16, 128 / 8, 16, EVP_CIPH_CTR_MODE, CRYPTO_AES_CTR }, -+ { NID_aes_192_ctr, 16, 192 / 8, 16, EVP_CIPH_CTR_MODE, CRYPTO_AES_CTR }, -+ { NID_aes_256_ctr, 16, 256 / 8, 16, EVP_CIPH_CTR_MODE, CRYPTO_AES_CTR }, -+#endif -+#if 0 /* Not yet supported */ -+ { NID_aes_128_xts, 16, 128 / 8 * 2, 16, EVP_CIPH_XTS_MODE, CRYPTO_AES_XTS }, -+ { NID_aes_256_xts, 16, 256 / 8 * 2, 16, EVP_CIPH_XTS_MODE, CRYPTO_AES_XTS }, -+#endif -+#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_AES_ECB) -+ { NID_aes_128_ecb, 16, 128 / 8, 0, EVP_CIPH_ECB_MODE, CRYPTO_AES_ECB }, -+ { NID_aes_192_ecb, 16, 192 / 8, 0, EVP_CIPH_ECB_MODE, CRYPTO_AES_ECB }, -+ { NID_aes_256_ecb, 16, 256 / 8, 0, EVP_CIPH_ECB_MODE, CRYPTO_AES_ECB }, -+#endif -+#if 0 /* Not yet supported */ -+ { NID_aes_128_gcm, 16, 128 / 8, 16, EVP_CIPH_GCM_MODE, CRYPTO_AES_GCM }, -+ { NID_aes_192_gcm, 16, 192 / 8, 16, EVP_CIPH_GCM_MODE, CRYPTO_AES_GCM }, -+ { NID_aes_256_gcm, 16, 256 / 8, 16, EVP_CIPH_GCM_MODE, CRYPTO_AES_GCM }, -+#endif -+#ifndef OPENSSL_NO_CAMELLIA -+ { NID_camellia_128_cbc, 16, 128 / 8, 16, EVP_CIPH_CBC_MODE, -+ CRYPTO_CAMELLIA_CBC }, -+ { NID_camellia_192_cbc, 16, 192 / 8, 16, EVP_CIPH_CBC_MODE, -+ CRYPTO_CAMELLIA_CBC }, -+ { NID_camellia_256_cbc, 16, 256 / 8, 16, EVP_CIPH_CBC_MODE, -+ CRYPTO_CAMELLIA_CBC }, -+#endif -+}; -+ -+static size_t find_cipher_data_index(int nid) -+{ -+ size_t i; -+ -+ for (i = 0; i < OSSL_NELEM(cipher_data); i++) -+ if (nid == cipher_data[i].nid) -+ return i; -+ return (size_t)-1; -+} -+ -+static size_t get_cipher_data_index(int nid) -+{ -+ size_t i = find_cipher_data_index(nid); -+ -+ if (i != (size_t)-1) -+ return i; -+ -+ /* -+ * Code further down must make sure that only NIDs in the table above -+ * are used. If any other NID reaches this function, there's a grave -+ * coding error further down. -+ */ -+ assert("Code that never should be reached" == NULL); -+ return -1; -+} -+ -+static const struct cipher_data_st *get_cipher_data(int nid) -+{ -+ return &cipher_data[get_cipher_data_index(nid)]; -+} -+ -+/* -+ * Following are the three necessary functions to map OpenSSL functionality -+ * with cryptodev. -+ */ -+ -+static int cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, -+ const unsigned char *iv, int enc) -+{ -+ struct cipher_ctx *cipher_ctx = -+ (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); -+ const struct cipher_data_st *cipher_d = -+ get_cipher_data(EVP_CIPHER_CTX_nid(ctx)); -+ -+ /* cleanup a previous session */ -+ if (cipher_ctx->sess.ses != 0 && -+ clean_devcrypto_session(&cipher_ctx->sess) == 0) -+ return 0; -+ -+ cipher_ctx->sess.cipher = cipher_d->devcryptoid; -+ cipher_ctx->sess.keylen = cipher_d->keylen; -+ cipher_ctx->sess.key = (void *)key; -+ cipher_ctx->op = enc ? COP_ENCRYPT : COP_DECRYPT; -+ cipher_ctx->mode = cipher_d->flags & EVP_CIPH_MODE; -+ cipher_ctx->blocksize = cipher_d->blocksize; -+ if (ioctl(cfd, CIOCGSESSION, &cipher_ctx->sess) < 0) { -+ SYSerr(SYS_F_IOCTL, errno); -+ return 0; -+ } -+ -+ return 1; -+} -+ -+static int cipher_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, -+ const unsigned char *in, size_t inl) -+{ -+ struct cipher_ctx *cipher_ctx = -+ (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); -+ struct crypt_op cryp; -+ unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx); -+#if !defined(COP_FLAG_WRITE_IV) -+ unsigned char saved_iv[EVP_MAX_IV_LENGTH]; -+ const unsigned char *ivptr; -+ size_t nblocks, ivlen; -+#endif -+ -+ memset(&cryp, 0, sizeof(cryp)); -+ cryp.ses = cipher_ctx->sess.ses; -+ cryp.len = inl; -+ cryp.src = (void *)in; -+ cryp.dst = (void *)out; -+ cryp.iv = (void *)iv; -+ cryp.op = cipher_ctx->op; -+#if !defined(COP_FLAG_WRITE_IV) -+ cryp.flags = 0; -+ -+ ivlen = EVP_CIPHER_CTX_iv_length(ctx); -+ if (ivlen > 0) -+ switch (cipher_ctx->mode) { -+ case EVP_CIPH_CBC_MODE: -+ assert(inl >= ivlen); -+ if (!EVP_CIPHER_CTX_encrypting(ctx)) { -+ ivptr = in + inl - ivlen; -+ memcpy(saved_iv, ivptr, ivlen); -+ } -+ break; -+ -+ case EVP_CIPH_CTR_MODE: -+ break; -+ -+ default: /* should not happen */ -+ return 0; -+ } -+#else -+ cryp.flags = COP_FLAG_WRITE_IV; -+#endif -+ -+ if (ioctl(cfd, CIOCCRYPT, &cryp) < 0) { -+ SYSerr(SYS_F_IOCTL, errno); -+ return 0; -+ } -+ -+#if !defined(COP_FLAG_WRITE_IV) -+ if (ivlen > 0) -+ switch (cipher_ctx->mode) { -+ case EVP_CIPH_CBC_MODE: -+ assert(inl >= ivlen); -+ if (EVP_CIPHER_CTX_encrypting(ctx)) -+ ivptr = out + inl - ivlen; -+ else -+ ivptr = saved_iv; -+ -+ memcpy(iv, ivptr, ivlen); -+ break; -+ -+ case EVP_CIPH_CTR_MODE: -+ nblocks = (inl + cipher_ctx->blocksize - 1) -+ / cipher_ctx->blocksize; -+ do { -+ ivlen--; -+ nblocks += iv[ivlen]; -+ iv[ivlen] = (uint8_t) nblocks; -+ nblocks >>= 8; -+ } while (ivlen); -+ break; -+ -+ default: /* should not happen */ -+ return 0; -+ } -+#endif -+ -+ return 1; -+} -+ -+static int ctr_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, -+ const unsigned char *in, size_t inl) -+{ -+ struct cipher_ctx *cipher_ctx = -+ (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); -+ size_t nblocks, len; -+ -+ /* initial partial block */ -+ while (cipher_ctx->num && inl) { -+ (*out++) = *(in++) ^ cipher_ctx->partial[cipher_ctx->num]; -+ --inl; -+ cipher_ctx->num = (cipher_ctx->num + 1) % cipher_ctx->blocksize; -+ } -+ -+ /* full blocks */ -+ if (inl > (unsigned int) cipher_ctx->blocksize) { -+ nblocks = inl/cipher_ctx->blocksize; -+ len = nblocks * cipher_ctx->blocksize; -+ if (cipher_do_cipher(ctx, out, in, len) < 1) -+ return 0; -+ inl -= len; -+ out += len; -+ in += len; -+ } -+ -+ /* final partial block */ -+ if (inl) { -+ memset(cipher_ctx->partial, 0, cipher_ctx->blocksize); -+ if (cipher_do_cipher(ctx, cipher_ctx->partial, cipher_ctx->partial, -+ cipher_ctx->blocksize) < 1) -+ return 0; -+ while (inl--) { -+ out[cipher_ctx->num] = in[cipher_ctx->num] -+ ^ cipher_ctx->partial[cipher_ctx->num]; -+ cipher_ctx->num++; -+ } -+ } -+ -+ return 1; -+} -+ -+static int cipher_ctrl(EVP_CIPHER_CTX *ctx, int type, int p1, void* p2) -+{ -+ struct cipher_ctx *cipher_ctx = -+ (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); -+ EVP_CIPHER_CTX *to_ctx = (EVP_CIPHER_CTX *)p2; -+ struct cipher_ctx *to_cipher_ctx; -+ -+ switch (type) { -+ case EVP_CTRL_COPY: -+ if (cipher_ctx == NULL) -+ return 1; -+ /* when copying the context, a new session needs to be initialized */ -+ to_cipher_ctx = -+ (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(to_ctx); -+ memset(&to_cipher_ctx->sess, 0, sizeof(to_cipher_ctx->sess)); -+ return cipher_init(to_ctx, cipher_ctx->sess.key, EVP_CIPHER_CTX_iv(ctx), -+ (cipher_ctx->op == COP_ENCRYPT)); -+ -+ case EVP_CTRL_INIT: -+ memset(&cipher_ctx->sess, 0, sizeof(cipher_ctx->sess)); -+ return 1; -+ -+ default: -+ break; -+ } -+ -+ return -1; -+} -+ -+static int cipher_cleanup(EVP_CIPHER_CTX *ctx) -+{ -+ struct cipher_ctx *cipher_ctx = -+ (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); -+ -+ return clean_devcrypto_session(&cipher_ctx->sess); -+} -+ -+/* -+ * Keep tables of known nids, associated methods, selected ciphers, and driver -+ * info. -+ * Note that known_cipher_nids[] isn't necessarily indexed the same way as -+ * cipher_data[] above, which the other tables are. -+ */ -+static int known_cipher_nids[OSSL_NELEM(cipher_data)]; -+static int known_cipher_nids_amount = -1; /* -1 indicates not yet initialised */ -+static EVP_CIPHER *known_cipher_methods[OSSL_NELEM(cipher_data)] = { NULL, }; -+static int selected_ciphers[OSSL_NELEM(cipher_data)]; -+static struct driver_info_st cipher_driver_info[OSSL_NELEM(cipher_data)]; -+ -+ -+static int devcrypto_test_cipher(size_t cipher_data_index) -+{ -+ return (cipher_driver_info[cipher_data_index].status == DEVCRYPTO_STATUS_USABLE -+ && selected_ciphers[cipher_data_index] == 1 -+ && (cipher_driver_info[cipher_data_index].accelerated -+ == DEVCRYPTO_ACCELERATED -+ || use_softdrivers == DEVCRYPTO_USE_SOFTWARE -+ || (cipher_driver_info[cipher_data_index].accelerated -+ != DEVCRYPTO_NOT_ACCELERATED -+ && use_softdrivers == DEVCRYPTO_REJECT_SOFTWARE))); -+} -+ -+static void prepare_cipher_methods(void) -+{ -+ size_t i; -+ struct session_op sess; -+ unsigned long cipher_mode; -+#ifdef CIOCGSESSINFO -+ struct session_info_op siop; -+#endif -+ -+ memset(&cipher_driver_info, 0, sizeof(cipher_driver_info)); -+ -+ memset(&sess, 0, sizeof(sess)); -+ sess.key = (void *)"01234567890123456789012345678901234567890123456789"; -+ -+ for (i = 0, known_cipher_nids_amount = 0; -+ i < OSSL_NELEM(cipher_data); i++) { -+ -+ selected_ciphers[i] = 1; -+ /* -+ * Check that the cipher is usable -+ */ -+ sess.cipher = cipher_data[i].devcryptoid; -+ sess.keylen = cipher_data[i].keylen; -+ if (ioctl(cfd, CIOCGSESSION, &sess) < 0) { -+ cipher_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCGSESSION; -+ continue; -+ } -+ -+ cipher_mode = cipher_data[i].flags & EVP_CIPH_MODE; -+ -+ if ((known_cipher_methods[i] = -+ EVP_CIPHER_meth_new(cipher_data[i].nid, -+ cipher_mode == EVP_CIPH_CTR_MODE ? 1 : -+ cipher_data[i].blocksize, -+ cipher_data[i].keylen)) == NULL -+ || !EVP_CIPHER_meth_set_iv_length(known_cipher_methods[i], -+ cipher_data[i].ivlen) -+ || !EVP_CIPHER_meth_set_flags(known_cipher_methods[i], -+ cipher_data[i].flags -+ | EVP_CIPH_CUSTOM_COPY -+ | EVP_CIPH_CTRL_INIT -+ | EVP_CIPH_FLAG_DEFAULT_ASN1) -+ || !EVP_CIPHER_meth_set_init(known_cipher_methods[i], cipher_init) -+ || !EVP_CIPHER_meth_set_do_cipher(known_cipher_methods[i], -+ cipher_mode == EVP_CIPH_CTR_MODE ? -+ ctr_do_cipher : -+ cipher_do_cipher) -+ || !EVP_CIPHER_meth_set_ctrl(known_cipher_methods[i], cipher_ctrl) -+ || !EVP_CIPHER_meth_set_cleanup(known_cipher_methods[i], -+ cipher_cleanup) -+ || !EVP_CIPHER_meth_set_impl_ctx_size(known_cipher_methods[i], -+ sizeof(struct cipher_ctx))) { -+ cipher_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; -+ EVP_CIPHER_meth_free(known_cipher_methods[i]); -+ known_cipher_methods[i] = NULL; -+ } else { -+ cipher_driver_info[i].status = DEVCRYPTO_STATUS_USABLE; -+#ifdef CIOCGSESSINFO -+ siop.ses = sess.ses; -+ if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) { -+ cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; -+ } else { -+ cipher_driver_info[i].driver_name = -+ OPENSSL_strndup(siop.cipher_info.cra_driver_name, -+ CRYPTODEV_MAX_ALG_NAME); -+ if (!(siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY)) -+ cipher_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; -+ else -+ cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; -+ } -+#endif /* CIOCGSESSINFO */ -+ } -+ ioctl(cfd, CIOCFSESSION, &sess.ses); -+ if (devcrypto_test_cipher(i)) { -+ known_cipher_nids[known_cipher_nids_amount++] = -+ cipher_data[i].nid; -+ } -+ } -+} -+ -+static void rebuild_known_cipher_nids(ENGINE *e) -+{ -+ size_t i; -+ -+ for (i = 0, known_cipher_nids_amount = 0; i < OSSL_NELEM(cipher_data); i++) { -+ if (devcrypto_test_cipher(i)) -+ known_cipher_nids[known_cipher_nids_amount++] = cipher_data[i].nid; -+ } -+ ENGINE_unregister_ciphers(e); -+ ENGINE_register_ciphers(e); -+} -+ -+static const EVP_CIPHER *get_cipher_method(int nid) -+{ -+ size_t i = get_cipher_data_index(nid); -+ -+ if (i == (size_t)-1) -+ return NULL; -+ return known_cipher_methods[i]; -+} -+ -+static int get_cipher_nids(const int **nids) -+{ -+ *nids = known_cipher_nids; -+ return known_cipher_nids_amount; -+} -+ -+static void destroy_cipher_method(int nid) -+{ -+ size_t i = get_cipher_data_index(nid); -+ -+ EVP_CIPHER_meth_free(known_cipher_methods[i]); -+ known_cipher_methods[i] = NULL; -+} -+ -+static void destroy_all_cipher_methods(void) -+{ -+ size_t i; -+ -+ for (i = 0; i < OSSL_NELEM(cipher_data); i++) { -+ destroy_cipher_method(cipher_data[i].nid); -+ OPENSSL_free(cipher_driver_info[i].driver_name); -+ cipher_driver_info[i].driver_name = NULL; -+ } -+} -+ -+static int devcrypto_ciphers(ENGINE *e, const EVP_CIPHER **cipher, -+ const int **nids, int nid) -+{ -+ if (cipher == NULL) -+ return get_cipher_nids(nids); -+ -+ *cipher = get_cipher_method(nid); -+ -+ return *cipher != NULL; -+} -+ -+static void devcrypto_select_all_ciphers(int *cipher_list) -+{ -+ size_t i; -+ -+ for (i = 0; i < OSSL_NELEM(cipher_data); i++) -+ cipher_list[i] = 1; -+} -+ -+static int cryptodev_select_cipher_cb(const char *str, int len, void *usr) -+{ -+ int *cipher_list = (int *)usr; -+ char *name; -+ const EVP_CIPHER *EVP; -+ size_t i; -+ -+ if (len == 0) -+ return 1; -+ if (usr == NULL || (name = OPENSSL_strndup(str, len)) == NULL) -+ return 0; -+ EVP = EVP_get_cipherbyname(name); -+ if (EVP == NULL) -+ fprintf(stderr, "devcrypto: unknown cipher %s\n", name); -+ else if ((i = find_cipher_data_index(EVP_CIPHER_nid(EVP))) != (size_t)-1) -+ cipher_list[i] = 1; -+ else -+ fprintf(stderr, "devcrypto: cipher %s not available\n", name); -+ OPENSSL_free(name); -+ return 1; -+} -+ -+static void dump_cipher_info(void) -+{ -+ size_t i; -+ const char *name; -+ -+ fprintf (stderr, "Information about ciphers supported by the /dev/crypto" -+ " engine:\n"); -+#ifndef CIOCGSESSINFO -+ fprintf(stderr, "CIOCGSESSINFO (session info call) unavailable\n"); -+#endif -+ for (i = 0; i < OSSL_NELEM(cipher_data); i++) { -+ name = OBJ_nid2sn(cipher_data[i].nid); -+ fprintf (stderr, "Cipher %s, NID=%d, /dev/crypto info: id=%d, ", -+ name ? name : "unknown", cipher_data[i].nid, -+ cipher_data[i].devcryptoid); -+ if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCGSESSION ) { -+ fprintf (stderr, "CIOCGSESSION (session open call) failed\n"); -+ continue; -+ } -+ fprintf (stderr, "driver=%s ", cipher_driver_info[i].driver_name ? -+ cipher_driver_info[i].driver_name : "unknown"); -+ if (cipher_driver_info[i].accelerated == DEVCRYPTO_ACCELERATED) -+ fprintf(stderr, "(hw accelerated)"); -+ else if (cipher_driver_info[i].accelerated == DEVCRYPTO_NOT_ACCELERATED) -+ fprintf(stderr, "(software)"); -+ else -+ fprintf(stderr, "(acceleration status unknown)"); -+ if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_FAILURE) -+ fprintf (stderr, ". Cipher setup failed"); -+ fprintf(stderr, "\n"); -+ } -+ fprintf(stderr, "\n"); -+} -+ -+/* -+ * We only support digests if the cryptodev implementation supports multiple -+ * data updates and session copying. Otherwise, we would be forced to maintain -+ * a cache, which is perilous if there's a lot of data coming in (if someone -+ * wants to checksum an OpenSSL tarball, for example). -+ */ -+#if defined(CIOCCPHASH) && defined(COP_FLAG_UPDATE) && defined(COP_FLAG_FINAL) -+#define IMPLEMENT_DIGEST -+ -+/****************************************************************************** -+ * -+ * Digests -+ * -+ * Because they all do the same basic operation, we have only one set of -+ * method functions for them all to share, and a mapping table between -+ * NIDs and cryptodev IDs, with all the necessary size data. -+ * -+ *****/ -+ -+struct digest_ctx { -+ struct session_op sess; -+ /* This signals that the init function was called, not that it succeeded. */ -+ int init_called; -+ unsigned char digest_res[HASH_MAX_LEN]; -+}; -+ -+static const struct digest_data_st { -+ int nid; -+ int blocksize; -+ int digestlen; -+ int devcryptoid; -+} digest_data[] = { -+#ifndef OPENSSL_NO_MD5 -+ { NID_md5, /* MD5_CBLOCK */ 64, 16, CRYPTO_MD5 }, -+#endif -+ { NID_sha1, SHA_CBLOCK, 20, CRYPTO_SHA1 }, -+#ifndef OPENSSL_NO_RMD160 -+# if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_RIPEMD160) -+ { NID_ripemd160, /* RIPEMD160_CBLOCK */ 64, 20, CRYPTO_RIPEMD160 }, -+# endif -+#endif -+#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_224) -+ { NID_sha224, SHA256_CBLOCK, 224 / 8, CRYPTO_SHA2_224 }, -+#endif -+#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_256) -+ { NID_sha256, SHA256_CBLOCK, 256 / 8, CRYPTO_SHA2_256 }, -+#endif -+#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_384) -+ { NID_sha384, SHA512_CBLOCK, 384 / 8, CRYPTO_SHA2_384 }, -+#endif -+#if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_512) -+ { NID_sha512, SHA512_CBLOCK, 512 / 8, CRYPTO_SHA2_512 }, -+#endif -+}; -+ -+static size_t find_digest_data_index(int nid) -+{ -+ size_t i; -+ -+ for (i = 0; i < OSSL_NELEM(digest_data); i++) -+ if (nid == digest_data[i].nid) -+ return i; -+ return (size_t)-1; -+} -+ -+static size_t get_digest_data_index(int nid) -+{ -+ size_t i = find_digest_data_index(nid); -+ -+ if (i != (size_t)-1) -+ return i; -+ -+ /* -+ * Code further down must make sure that only NIDs in the table above -+ * are used. If any other NID reaches this function, there's a grave -+ * coding error further down. -+ */ -+ assert("Code that never should be reached" == NULL); -+ return -1; -+} -+ -+static const struct digest_data_st *get_digest_data(int nid) -+{ -+ return &digest_data[get_digest_data_index(nid)]; -+} -+ -+/* -+ * Following are the five necessary functions to map OpenSSL functionality -+ * with cryptodev: init, update, final, cleanup, and copy. -+ */ -+ -+static int digest_init(EVP_MD_CTX *ctx) -+{ -+ struct digest_ctx *digest_ctx = -+ (struct digest_ctx *)EVP_MD_CTX_md_data(ctx); -+ const struct digest_data_st *digest_d = -+ get_digest_data(EVP_MD_CTX_type(ctx)); -+ -+ digest_ctx->init_called = 1; -+ -+ memset(&digest_ctx->sess, 0, sizeof(digest_ctx->sess)); -+ digest_ctx->sess.mac = digest_d->devcryptoid; -+ if (ioctl(cfd, CIOCGSESSION, &digest_ctx->sess) < 0) { -+ SYSerr(SYS_F_IOCTL, errno); -+ return 0; -+ } -+ -+ return 1; -+} -+ -+static int digest_op(struct digest_ctx *ctx, const void *src, size_t srclen, -+ void *res, unsigned int flags) -+{ -+ struct crypt_op cryp; -+ -+ memset(&cryp, 0, sizeof(cryp)); -+ cryp.ses = ctx->sess.ses; -+ cryp.len = srclen; -+ cryp.src = (void *)src; -+ cryp.dst = NULL; -+ cryp.mac = res; -+ cryp.flags = flags; -+ return ioctl(cfd, CIOCCRYPT, &cryp); -+} -+ -+static int digest_update(EVP_MD_CTX *ctx, const void *data, size_t count) -+{ -+ struct digest_ctx *digest_ctx = -+ (struct digest_ctx *)EVP_MD_CTX_md_data(ctx); -+ -+ if (count == 0) -+ return 1; -+ -+ if (digest_ctx == NULL) -+ return 0; -+ -+ if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_ONESHOT)) { -+ if (digest_op(digest_ctx, data, count, digest_ctx->digest_res, 0) >= 0) -+ return 1; -+ } else if (digest_op(digest_ctx, data, count, NULL, COP_FLAG_UPDATE) >= 0) { -+ return 1; -+ } -+ -+ SYSerr(SYS_F_IOCTL, errno); -+ return 0; -+} -+ -+static int digest_final(EVP_MD_CTX *ctx, unsigned char *md) -+{ -+ struct digest_ctx *digest_ctx = -+ (struct digest_ctx *)EVP_MD_CTX_md_data(ctx); -+ -+ if (md == NULL || digest_ctx == NULL) -+ return 0; -+ -+ if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_ONESHOT)) { -+ memcpy(md, digest_ctx->digest_res, EVP_MD_CTX_size(ctx)); -+ } else if (digest_op(digest_ctx, NULL, 0, md, COP_FLAG_FINAL) < 0) { -+ SYSerr(SYS_F_IOCTL, errno); -+ return 0; -+ } -+ -+ return 1; -+} -+ -+static int digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from) -+{ -+ struct digest_ctx *digest_from = -+ (struct digest_ctx *)EVP_MD_CTX_md_data(from); -+ struct digest_ctx *digest_to = -+ (struct digest_ctx *)EVP_MD_CTX_md_data(to); -+ struct cphash_op cphash; -+ -+ if (digest_from == NULL || digest_from->init_called != 1) -+ return 1; -+ -+ if (!digest_init(to)) { -+ SYSerr(SYS_F_IOCTL, errno); -+ return 0; -+ } -+ -+ cphash.src_ses = digest_from->sess.ses; -+ cphash.dst_ses = digest_to->sess.ses; -+ if (ioctl(cfd, CIOCCPHASH, &cphash) < 0) { -+ SYSerr(SYS_F_IOCTL, errno); -+ return 0; -+ } -+ return 1; -+} -+ -+static int digest_cleanup(EVP_MD_CTX *ctx) -+{ -+ struct digest_ctx *digest_ctx = -+ (struct digest_ctx *)EVP_MD_CTX_md_data(ctx); -+ -+ if (digest_ctx == NULL) -+ return 1; -+ -+ return clean_devcrypto_session(&digest_ctx->sess); -+} -+ -+/* -+ * Keep tables of known nids, associated methods, selected digests, and -+ * driver info. -+ * Note that known_digest_nids[] isn't necessarily indexed the same way as -+ * digest_data[] above, which the other tables are. -+ */ -+static int known_digest_nids[OSSL_NELEM(digest_data)]; -+static int known_digest_nids_amount = -1; /* -1 indicates not yet initialised */ -+static EVP_MD *known_digest_methods[OSSL_NELEM(digest_data)] = { NULL, }; -+static int selected_digests[OSSL_NELEM(digest_data)]; -+static struct driver_info_st digest_driver_info[OSSL_NELEM(digest_data)]; -+ -+static int devcrypto_test_digest(size_t digest_data_index) -+{ -+ return (digest_driver_info[digest_data_index].status == DEVCRYPTO_STATUS_USABLE -+ && selected_digests[digest_data_index] == 1 -+ && (digest_driver_info[digest_data_index].accelerated -+ == DEVCRYPTO_ACCELERATED -+ || use_softdrivers == DEVCRYPTO_USE_SOFTWARE -+ || (digest_driver_info[digest_data_index].accelerated -+ != DEVCRYPTO_NOT_ACCELERATED -+ && use_softdrivers == DEVCRYPTO_REJECT_SOFTWARE))); -+} -+ -+static void rebuild_known_digest_nids(ENGINE *e) -+{ -+ size_t i; -+ -+ for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); i++) { -+ if (devcrypto_test_digest(i)) -+ known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; -+ } -+ ENGINE_unregister_digests(e); -+ ENGINE_register_digests(e); -+} -+ -+static void prepare_digest_methods(void) -+{ -+ size_t i; -+ struct session_op sess1, sess2; -+#ifdef CIOCGSESSINFO -+ struct session_info_op siop; -+#endif -+ struct cphash_op cphash; -+ -+ memset(&digest_driver_info, 0, sizeof(digest_driver_info)); -+ -+ memset(&sess1, 0, sizeof(sess1)); -+ memset(&sess2, 0, sizeof(sess2)); -+ -+ for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); -+ i++) { -+ -+ selected_digests[i] = 1; -+ -+ /* -+ * Check that the digest is usable -+ */ -+ sess1.mac = digest_data[i].devcryptoid; -+ sess2.ses = 0; -+ if (ioctl(cfd, CIOCGSESSION, &sess1) < 0) { -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCGSESSION; -+ goto finish; -+ } -+ -+#ifdef CIOCGSESSINFO -+ /* gather hardware acceleration info from the driver */ -+ siop.ses = sess1.ses; -+ if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) { -+ digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; -+ } else { -+ digest_driver_info[i].driver_name = -+ OPENSSL_strndup(siop.hash_info.cra_driver_name, -+ CRYPTODEV_MAX_ALG_NAME); -+ if (siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY) -+ digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; -+ else -+ digest_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; -+ } -+#endif -+ -+ /* digest must be capable of hash state copy */ -+ sess2.mac = sess1.mac; -+ if (ioctl(cfd, CIOCGSESSION, &sess2) < 0) { -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; -+ goto finish; -+ } -+ cphash.src_ses = sess1.ses; -+ cphash.dst_ses = sess2.ses; -+ if (ioctl(cfd, CIOCCPHASH, &cphash) < 0) { -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCCPHASH; -+ goto finish; -+ } -+ if ((known_digest_methods[i] = EVP_MD_meth_new(digest_data[i].nid, -+ NID_undef)) == NULL -+ || !EVP_MD_meth_set_input_blocksize(known_digest_methods[i], -+ digest_data[i].blocksize) -+ || !EVP_MD_meth_set_result_size(known_digest_methods[i], -+ digest_data[i].digestlen) -+ || !EVP_MD_meth_set_init(known_digest_methods[i], digest_init) -+ || !EVP_MD_meth_set_update(known_digest_methods[i], digest_update) -+ || !EVP_MD_meth_set_final(known_digest_methods[i], digest_final) -+ || !EVP_MD_meth_set_copy(known_digest_methods[i], digest_copy) -+ || !EVP_MD_meth_set_cleanup(known_digest_methods[i], digest_cleanup) -+ || !EVP_MD_meth_set_app_datasize(known_digest_methods[i], -+ sizeof(struct digest_ctx))) { -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; -+ EVP_MD_meth_free(known_digest_methods[i]); -+ known_digest_methods[i] = NULL; -+ goto finish; -+ } -+ digest_driver_info[i].status = DEVCRYPTO_STATUS_USABLE; -+finish: -+ ioctl(cfd, CIOCFSESSION, &sess1.ses); -+ if (sess2.ses != 0) -+ ioctl(cfd, CIOCFSESSION, &sess2.ses); -+ if (devcrypto_test_digest(i)) -+ known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; -+ } -+} -+ -+static const EVP_MD *get_digest_method(int nid) -+{ -+ size_t i = get_digest_data_index(nid); -+ -+ if (i == (size_t)-1) -+ return NULL; -+ return known_digest_methods[i]; -+} -+ -+static int get_digest_nids(const int **nids) -+{ -+ *nids = known_digest_nids; -+ return known_digest_nids_amount; -+} -+ -+static void destroy_digest_method(int nid) -+{ -+ size_t i = get_digest_data_index(nid); -+ -+ EVP_MD_meth_free(known_digest_methods[i]); -+ known_digest_methods[i] = NULL; -+} -+ -+static void destroy_all_digest_methods(void) -+{ -+ size_t i; -+ -+ for (i = 0; i < OSSL_NELEM(digest_data); i++) { -+ destroy_digest_method(digest_data[i].nid); -+ OPENSSL_free(digest_driver_info[i].driver_name); -+ digest_driver_info[i].driver_name = NULL; -+ } -+} -+ -+static int devcrypto_digests(ENGINE *e, const EVP_MD **digest, -+ const int **nids, int nid) -+{ -+ if (digest == NULL) -+ return get_digest_nids(nids); -+ -+ *digest = get_digest_method(nid); -+ -+ return *digest != NULL; -+} -+ -+static void devcrypto_select_all_digests(int *digest_list) -+{ -+ size_t i; -+ -+ for (i = 0; i < OSSL_NELEM(digest_data); i++) -+ digest_list[i] = 1; -+} -+ -+static int cryptodev_select_digest_cb(const char *str, int len, void *usr) -+{ -+ int *digest_list = (int *)usr; -+ char *name; -+ const EVP_MD *EVP; -+ size_t i; -+ -+ if (len == 0) -+ return 1; -+ if (usr == NULL || (name = OPENSSL_strndup(str, len)) == NULL) -+ return 0; -+ EVP = EVP_get_digestbyname(name); -+ if (EVP == NULL) -+ fprintf(stderr, "devcrypto: unknown digest %s\n", name); -+ else if ((i = find_digest_data_index(EVP_MD_type(EVP))) != (size_t)-1) -+ digest_list[i] = 1; -+ else -+ fprintf(stderr, "devcrypto: digest %s not available\n", name); -+ OPENSSL_free(name); -+ return 1; -+} -+ -+static void dump_digest_info(void) -+{ -+ size_t i; -+ const char *name; -+ -+ fprintf (stderr, "Information about digests supported by the /dev/crypto" -+ " engine:\n"); -+#ifndef CIOCGSESSINFO -+ fprintf(stderr, "CIOCGSESSINFO (session info call) unavailable\n"); -+#endif -+ -+ for (i = 0; i < OSSL_NELEM(digest_data); i++) { -+ name = OBJ_nid2sn(digest_data[i].nid); -+ fprintf (stderr, "Digest %s, NID=%d, /dev/crypto info: id=%d, driver=%s", -+ name ? name : "unknown", digest_data[i].nid, -+ digest_data[i].devcryptoid, -+ digest_driver_info[i].driver_name ? digest_driver_info[i].driver_name : "unknown"); -+ if (digest_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCGSESSION) { -+ fprintf (stderr, ". CIOCGSESSION (session open) failed\n"); -+ continue; -+ } -+ if (digest_driver_info[i].accelerated == DEVCRYPTO_ACCELERATED) -+ fprintf(stderr, " (hw accelerated)"); -+ else if (digest_driver_info[i].accelerated == DEVCRYPTO_NOT_ACCELERATED) -+ fprintf(stderr, " (software)"); -+ else -+ fprintf(stderr, " (acceleration status unknown)"); -+ if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_FAILURE) -+ fprintf (stderr, ". Cipher setup failed\n"); -+ else if (digest_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCCPHASH) -+ fprintf(stderr, ", CIOCCPHASH failed\n"); -+ else -+ fprintf(stderr, ", CIOCCPHASH capable\n"); -+ } -+ fprintf(stderr, "\n"); -+} -+ -+#endif -+ -+/****************************************************************************** -+ * -+ * CONTROL COMMANDS -+ * -+ *****/ -+ -+#define DEVCRYPTO_CMD_USE_SOFTDRIVERS ENGINE_CMD_BASE -+#define DEVCRYPTO_CMD_CIPHERS (ENGINE_CMD_BASE + 1) -+#define DEVCRYPTO_CMD_DIGESTS (ENGINE_CMD_BASE + 2) -+#define DEVCRYPTO_CMD_DUMP_INFO (ENGINE_CMD_BASE + 3) -+ -+/* Helper macros for CPP string composition */ -+#ifndef OPENSSL_MSTR -+# define OPENSSL_MSTR_HELPER(x) #x -+# define OPENSSL_MSTR(x) OPENSSL_MSTR_HELPER(x) -+#endif -+ -+static const ENGINE_CMD_DEFN devcrypto_cmds[] = { -+#ifdef CIOCGSESSINFO -+ {DEVCRYPTO_CMD_USE_SOFTDRIVERS, -+ "USE_SOFTDRIVERS", -+ "specifies whether to use software (not accelerated) drivers (" -+ OPENSSL_MSTR(DEVCRYPTO_REQUIRE_ACCELERATED) "=use only accelerated drivers, " -+ OPENSSL_MSTR(DEVCRYPTO_USE_SOFTWARE) "=allow all drivers, " -+ OPENSSL_MSTR(DEVCRYPTO_REJECT_SOFTWARE) -+ "=use if acceleration can't be determined) [default=" -+ OPENSSL_MSTR(DEVCRYPTO_DEFAULT_USE_SOFTDRIVERS) "]", -+ ENGINE_CMD_FLAG_NUMERIC}, -+#endif -+ -+ {DEVCRYPTO_CMD_CIPHERS, -+ "CIPHERS", -+ "either ALL, NONE, or a comma-separated list of ciphers to enable [default=ALL]", -+ ENGINE_CMD_FLAG_STRING}, -+ -+#ifdef IMPLEMENT_DIGEST -+ {DEVCRYPTO_CMD_DIGESTS, -+ "DIGESTS", -+ "either ALL, NONE, or a comma-separated list of digests to enable [default=ALL]", -+ ENGINE_CMD_FLAG_STRING}, -+#endif -+ -+ {DEVCRYPTO_CMD_DUMP_INFO, -+ "DUMP_INFO", -+ "dump info about each algorithm to stderr; use 'openssl engine -pre DUMP_INFO devcrypto'", -+ ENGINE_CMD_FLAG_NO_INPUT}, -+ -+ {0, NULL, NULL, 0} -+}; -+ -+static int devcrypto_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) -+{ -+ int *new_list; -+ switch (cmd) { -+#ifdef CIOCGSESSINFO -+ case DEVCRYPTO_CMD_USE_SOFTDRIVERS: -+ switch (i) { -+ case DEVCRYPTO_REQUIRE_ACCELERATED: -+ case DEVCRYPTO_USE_SOFTWARE: -+ case DEVCRYPTO_REJECT_SOFTWARE: -+ break; -+ default: -+ fprintf(stderr, "devcrypto: invalid value (%ld) for USE_SOFTDRIVERS\n", i); -+ return 0; -+ } -+ if (use_softdrivers == i) -+ return 1; -+ use_softdrivers = i; -+#ifdef IMPLEMENT_DIGEST -+ rebuild_known_digest_nids(e); -+#endif -+ rebuild_known_cipher_nids(e); -+ return 1; -+#endif /* CIOCGSESSINFO */ -+ -+ case DEVCRYPTO_CMD_CIPHERS: -+ if (p == NULL) -+ return 1; -+ if (strcasecmp((const char *)p, "ALL") == 0) { -+ devcrypto_select_all_ciphers(selected_ciphers); -+ } else if (strcasecmp((const char*)p, "NONE") == 0) { -+ memset(selected_ciphers, 0, sizeof(selected_ciphers)); -+ } else { -+ new_list=OPENSSL_zalloc(sizeof(selected_ciphers)); -+ if (!CONF_parse_list(p, ',', 1, cryptodev_select_cipher_cb, new_list)) { -+ OPENSSL_free(new_list); -+ return 0; -+ } -+ memcpy(selected_ciphers, new_list, sizeof(selected_ciphers)); -+ OPENSSL_free(new_list); -+ } -+ rebuild_known_cipher_nids(e); -+ return 1; -+ -+#ifdef IMPLEMENT_DIGEST -+ case DEVCRYPTO_CMD_DIGESTS: -+ if (p == NULL) -+ return 1; -+ if (strcasecmp((const char *)p, "ALL") == 0) { -+ devcrypto_select_all_digests(selected_digests); -+ } else if (strcasecmp((const char*)p, "NONE") == 0) { -+ memset(selected_digests, 0, sizeof(selected_digests)); -+ } else { -+ new_list=OPENSSL_zalloc(sizeof(selected_digests)); -+ if (!CONF_parse_list(p, ',', 1, cryptodev_select_digest_cb, new_list)) { -+ OPENSSL_free(new_list); -+ return 0; -+ } -+ memcpy(selected_digests, new_list, sizeof(selected_digests)); -+ OPENSSL_free(new_list); -+ } -+ rebuild_known_digest_nids(e); -+ return 1; -+#endif /* IMPLEMENT_DIGEST */ -+ -+ case DEVCRYPTO_CMD_DUMP_INFO: -+ dump_cipher_info(); -+#ifdef IMPLEMENT_DIGEST -+ dump_digest_info(); -+#endif -+ return 1; -+ -+ default: -+ break; -+ } -+ return 0; -+} -+ -+/****************************************************************************** -+ * -+ * LOAD / UNLOAD -+ * -+ *****/ -+ -+/* -+ * Opens /dev/crypto -+ */ -+static int open_devcrypto(void) -+{ -+ int fd; -+ -+ if (cfd >= 0) -+ return 1; -+ -+ if ((fd = open("/dev/crypto", O_RDWR, 0)) < 0) { -+#ifndef ENGINE_DEVCRYPTO_DEBUG -+ if (errno != ENOENT) -+#endif -+ fprintf(stderr, "Could not open /dev/crypto: %s\n", strerror(errno)); -+ return 0; -+ } -+ -+#ifdef CRIOGET -+ if (ioctl(fd, CRIOGET, &cfd) < 0) { -+ fprintf(stderr, "Could not create crypto fd: %s\n", strerror(errno)); -+ close(fd); -+ cfd = -1; -+ return 0; -+ } -+ close(fd); -+#else -+ cfd = fd; -+#endif -+ -+ return 1; -+} -+ -+static int close_devcrypto(void) -+{ -+ int ret; -+ -+ if (cfd < 0) -+ return 1; -+ ret = close(cfd); -+ cfd = -1; -+ if (ret != 0) { -+ fprintf(stderr, "Error closing /dev/crypto: %s\n", strerror(errno)); -+ return 0; -+ } -+ return 1; -+} -+ -+static int devcrypto_unload(ENGINE *e) -+{ -+ destroy_all_cipher_methods(); -+#ifdef IMPLEMENT_DIGEST -+ destroy_all_digest_methods(); -+#endif -+ -+ close_devcrypto(); -+ -+ return 1; -+} -+ -+static int bind_devcrypto(ENGINE *e) { -+ -+ if (!ENGINE_set_id(e, engine_devcrypto_id) -+ || !ENGINE_set_name(e, "/dev/crypto engine") -+ || !ENGINE_set_destroy_function(e, devcrypto_unload) -+ || !ENGINE_set_cmd_defns(e, devcrypto_cmds) -+ || !ENGINE_set_ctrl_function(e, devcrypto_ctrl)) -+ return 0; -+ -+ prepare_cipher_methods(); -+#ifdef IMPLEMENT_DIGEST -+ prepare_digest_methods(); -+#endif -+ -+ return (ENGINE_set_ciphers(e, devcrypto_ciphers) -+#ifdef IMPLEMENT_DIGEST -+ && ENGINE_set_digests(e, devcrypto_digests) -+#endif -+/* -+ * Asymmetric ciphers aren't well supported with /dev/crypto. Among the BSD -+ * implementations, it seems to only exist in FreeBSD, and regarding the -+ * parameters in its crypt_kop, the manual crypto(4) has this to say: -+ * -+ * The semantics of these arguments are currently undocumented. -+ * -+ * Reading through the FreeBSD source code doesn't give much more than -+ * their CRK_MOD_EXP implementation for ubsec. -+ * -+ * It doesn't look much better with cryptodev-linux. They have the crypt_kop -+ * structure as well as the command (CRK_*) in cryptodev.h, but no support -+ * seems to be implemented at all for the moment. -+ * -+ * At the time of writing, it seems impossible to write proper support for -+ * FreeBSD's asym features without some very deep knowledge and access to -+ * specific kernel modules. -+ * -+ * /Richard Levitte, 2017-05-11 -+ */ -+#if 0 -+# ifndef OPENSSL_NO_RSA -+ && ENGINE_set_RSA(e, devcrypto_rsa) -+# endif -+# ifndef OPENSSL_NO_DSA -+ && ENGINE_set_DSA(e, devcrypto_dsa) -+# endif -+# ifndef OPENSSL_NO_DH -+ && ENGINE_set_DH(e, devcrypto_dh) -+# endif -+# ifndef OPENSSL_NO_EC -+ && ENGINE_set_EC(e, devcrypto_ec) -+# endif -+#endif -+ ); -+} -+ -+#ifdef OPENSSL_NO_DYNAMIC_ENGINE -+/* -+ * In case this engine is built into libcrypto, then it doesn't offer any -+ * ability to be dynamically loadable. -+ */ -+void engine_load_devcrypto_int(void) -+{ -+ ENGINE *e = NULL; -+ -+ if (!open_devcrypto()) -+ return; -+ -+ if ((e = ENGINE_new()) == NULL -+ || !bind_devcrypto(e)) { -+ close_devcrypto(); -+ ENGINE_free(e); -+ return; -+ } -+ -+ ENGINE_add(e); -+ ENGINE_free(e); /* Loose our local reference */ -+ ERR_clear_error(); -+} -+ -+#else -+ -+static int bind_helper(ENGINE *e, const char *id) -+{ -+ if ((id && (strcmp(id, engine_devcrypto_id) != 0)) -+ || !open_devcrypto()) -+ return 0; -+ if (!bind_devcrypto(e)) { -+ close_devcrypto(); -+ return 0; -+ } -+ return 1; -+} -+ -+IMPLEMENT_DYNAMIC_CHECK_FN() -+IMPLEMENT_DYNAMIC_BIND_FN(bind_helper) -+ -+#endif diff --git a/package/libs/openssl/patches/500-e_devcrypto-default-to-not-use-digests-in-engine.patch b/package/libs/openssl/patches/500-e_devcrypto-default-to-not-use-digests-in-engine.patch index df5c16d8d2..f183263858 100644 --- a/package/libs/openssl/patches/500-e_devcrypto-default-to-not-use-digests-in-engine.patch +++ b/package/libs/openssl/patches/500-e_devcrypto-default-to-not-use-digests-in-engine.patch @@ -21,7 +21,7 @@ Signed-off-by: Eneas U de Queiroz --- a/engines/e_devcrypto.c +++ b/engines/e_devcrypto.c -@@ -852,7 +852,7 @@ static void prepare_digest_methods(void) +@@ -905,7 +905,7 @@ static void prepare_digest_methods(void) for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); i++) { @@ -30,7 +30,7 @@ Signed-off-by: Eneas U de Queiroz /* * Check that the digest is usable -@@ -1072,7 +1072,7 @@ static const ENGINE_CMD_DEFN devcrypto_c +@@ -1119,7 +1119,7 @@ static const ENGINE_CMD_DEFN devcrypto_c #ifdef IMPLEMENT_DIGEST {DEVCRYPTO_CMD_DIGESTS, "DIGESTS", diff --git a/package/libs/openssl/patches/510-e_devcrypto-ignore-error-when-closing-session.patch b/package/libs/openssl/patches/510-e_devcrypto-ignore-error-when-closing-session.patch index 87792cf9d0..40b1dc78d3 100644 --- a/package/libs/openssl/patches/510-e_devcrypto-ignore-error-when-closing-session.patch +++ b/package/libs/openssl/patches/510-e_devcrypto-ignore-error-when-closing-session.patch @@ -10,8 +10,8 @@ Signed-off-by: Eneas U de Queiroz --- a/engines/e_devcrypto.c +++ b/engines/e_devcrypto.c -@@ -195,9 +195,8 @@ static int cipher_init(EVP_CIPHER_CTX *c - get_cipher_data(EVP_CIPHER_CTX_nid(ctx)); +@@ -211,9 +211,8 @@ static int cipher_init(EVP_CIPHER_CTX *c + int ret; /* cleanup a previous session */ - if (cipher_ctx->sess.ses != 0 && diff --git a/package/libs/pcre/Config.in b/package/libs/pcre/Config.in deleted file mode 100644 index 15e75fc753..0000000000 --- a/package/libs/pcre/Config.in +++ /dev/null @@ -1,11 +0,0 @@ -config PCRE_JIT_ENABLED - bool - depends on PACKAGE_libpcre && (arm || i386 || i686 || x86_64 || mips || mipsel || powerpc || sparc) - default y if (arm || i686 || x86_64) - prompt "Enable JIT compiler support" - help - Enable JIT (Just-In-Time) compiler support. - - Enabling this option can give an about 10x performance increase on JIT operations. It can be desireable for e.g. high performance Apache mod_rewrite or HA-Proxy reqrep operations. - - However, JIT should _only_ be enabled on architectures that are supported. Enabling JIT on unsupported platforms will result in a compilation failure. A list of supported architectures can be found here: https://pcre.org/original/doc/html/pcrejit.html#SEC3 . diff --git a/package/libs/pcre/Makefile b/package/libs/pcre/Makefile deleted file mode 100644 index 43267562ea..0000000000 --- a/package/libs/pcre/Makefile +++ /dev/null @@ -1,129 +0,0 @@ -# -# Copyright (C) 2006-2015 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=pcre -PKG_VERSION:=8.45 -PKG_RELEASE:=$(AUTORELEASE) - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -PKG_SOURCE_URL:=@SF/$(PKG_NAME) -PKG_HASH:=4dae6fdcd2bb0bb6c37b5f97c33c2be954da743985369cddac3546e3218bffb8 - -PKG_MAINTAINER:=Thomas Heil -PKG_LICENSE:=BSD-3-Clause -PKG_LICENSE_FILES:=LICENCE -PKG_CPE_ID:=cpe:/a:pcre:pcre - -PKG_INSTALL:=1 -PKG_BUILD_PARALLEL:=1 - -PKG_CONFIG_DEPENDS:=\ - CONFIG_PACKAGE_libpcrecpp \ - CONFIG_PCRE_JIT_ENABLED - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/host-build.mk - -define Package/libpcre/default - SECTION:=libs - CATEGORY:=Libraries - URL:=https://www.pcre.org/ -endef - -define Package/libpcre/config - source "$(SOURCE)/Config.in" -endef - -define Package/libpcre - $(call Package/libpcre/default) - TITLE:=A Perl Compatible Regular Expression library -endef - -define Package/libpcre16 - $(call Package/libpcre/default) - TITLE:=A Perl Compatible Regular Expression library (16bit support) -endef - -define Package/libpcre32 - $(call Package/libpcre/default) - TITLE:=A Perl Compatible Regular Expression library (32bit support) -endef - -define Package/libpcrecpp - $(call Package/libpcre/default) - TITLE:=C++ wrapper for Perl Compatible Regular Expression library - DEPENDS:=+libpcre +libstdcpp -endef - -HOST_CONFIGURE_ARGS += \ - --disable-shared \ - --enable-utf8 \ - --enable-unicode-properties \ - --enable-pcre16 \ - --with-match-limit-recursion=16000 \ - --enable-cpp - -TARGET_CFLAGS += $(FPIC) - -CONFIGURE_ARGS += \ - --enable-utf8 \ - --enable-unicode-properties \ - --enable-pcre16 \ - --enable-pcre32 \ - $(if $(CONFIG_PCRE_JIT_ENABLED),--enable-jit,--disable-jit) \ - --with-match-limit-recursion=16000 \ - --$(if $(CONFIG_PACKAGE_libpcrecpp),en,dis)able-cpp - -MAKE_FLAGS += \ - CFLAGS="$(TARGET_CFLAGS)" - -define Build/InstallDev - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/pcre-config $(1)/usr/bin/ - $(SED) 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' $(1)/usr/bin/pcre-config - - $(INSTALL_DIR) $(2)/bin - $(LN) $(STAGING_DIR)/usr/bin/pcre-config $(2)/bin - - $(INSTALL_DIR) $(1)/usr/include - $(CP) $(PKG_INSTALL_DIR)/usr/include/pcre*.h $(1)/usr/include/ - - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre*.{a,so*} $(1)/usr/lib/ - - $(INSTALL_DIR) $(1)/usr/lib/pkgconfig - $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libpcre*.pc $(1)/usr/lib/pkgconfig/ -endef - -define Package/libpcre/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre{,posix}.so.* $(1)/usr/lib/ - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre.so $(1)/usr/lib/ -endef - -define Package/libpcre16/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre16.so* $(1)/usr/lib/ -endef - -define Package/libpcre32/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre32.so* $(1)/usr/lib/ -endef - -define Package/libpcrecpp/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcrecpp.so.* $(1)/usr/lib/ -endef - -$(eval $(call BuildPackage,libpcre)) -$(eval $(call BuildPackage,libpcre16)) -$(eval $(call BuildPackage,libpcre32)) -$(eval $(call BuildPackage,libpcrecpp)) -$(eval $(call HostBuild)) diff --git a/package/libs/pcre2/Config.in b/package/libs/pcre2/Config.in new file mode 100644 index 0000000000..8777a4e84c --- /dev/null +++ b/package/libs/pcre2/Config.in @@ -0,0 +1,30 @@ +config PCRE2_JIT_ENABLED + bool + depends on PACKAGE_libpcre2 && (aarch64 || aarch64_be || arm || i386 || i686 || x86_64 || mips || mipsel || mips64 || mips64el || powerpc || powerpc64 || powerpcle || sparc) + default y if (arm || i686 || x86_64) + prompt "Enable JIT compiler support" + help + Enable JIT (Just-In-Time) compiler support. + + Just-in-time compiling is a heavyweight optimization that can greatly + speed up pattern matching. However, it comes at the cost of extra + processing before the match is performed, so it is of most benefit when + the same pattern is going to be matched many times. This does not + necessarily mean many calls of a matching function; if the pattern is + not anchored, matching attempts may take place many times at various + positions in the subject, even for a single call. Therefore, if the + subject string is very long, it may still pay to use JIT even for + one-off matches. JIT support is available for all of the 8-bit, 16-bit + and 32-bit PCRE2 libraries and adds about 100KB to the resulting + libpcre2.so. JIT support applies only to the traditional Perl-compatible + matching function. It does not apply when the DFA matching function is + being used. + + Enabling this option can give an about 10x performance increase on JIT + operations. It can be desireable for e.g. high performance Apache + mod_rewrite or HA-Proxy reqrep operations. + + However, JIT should _only_ be enabled on architectures that are supported. + Enabling JIT on unsupported platforms will result in a compilation + failure. A list of supported architectures can be found here: + https://pcre.org/current/doc/html/pcre2jit.html#SEC2 diff --git a/package/libs/pcre2/Makefile b/package/libs/pcre2/Makefile new file mode 100644 index 0000000000..fa4282cee8 --- /dev/null +++ b/package/libs/pcre2/Makefile @@ -0,0 +1,109 @@ +# +# Copyright (C) 2017 Shane Peelar +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=pcre2 +PKG_VERSION:=10.42 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL:=https://github.com/PCRE2Project/pcre2/releases/download/$(PKG_NAME)-$(PKG_VERSION) +PKG_HASH:=8d36cd8cb6ea2a4c2bb358ff6411b0c788633a2a45dabbf1aeb4b701d1b5e840 + +PKG_MAINTAINER:=Shane Peelar +PKG_LICENSE:=BSD-3-Clause +PKG_LICENSE_FILES:=LICENCE +PKG_CPE_ID:=cpe:/a:pcre:pcre + +PKG_CONFIG_DEPENDS:=\ + CONFIG_PACKAGE_libpcre2-16 \ + CONFIG_PACKAGE_libpcre2-32 \ + CONFIG_PCRE2_JIT_ENABLED + +PKG_BUILD_DEPENDS:=zlib + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/libpcre2/default + SECTION:=libs + CATEGORY:=Libraries + URL:=https://www.pcre.org/ +endef + +define Package/libpcre2/config + source "$(SOURCE)/Config.in" +endef + +define Package/libpcre2 + $(call Package/libpcre2/default) + TITLE:=A Perl Compatible Regular Expression library +endef + +define Package/libpcre2-16 + $(call Package/libpcre2/default) + TITLE:=A Perl Compatible Regular Expression library (16bit support) +endef + +define Package/libpcre2-32 + $(call Package/libpcre2/default) + TITLE:=A Perl Compatible Regular Expression library (32bit support) +endef + +CMAKE_HOST_OPTIONS += \ + -DBUILD_SHARED_LIBS=OFF \ + -DPCRE2_BUILD_PCRE2_8=ON \ + -DPCRE2_BUILD_PCRE2_16=ON \ + -DPCRE2_BUILD_PCRE2_32=ON \ + -DPCRE2_DEBUG=OFF \ + -DPCRE2_DISABLE_PERCENT_ZT=ON \ + -DPCRE2_SUPPORT_JIT=OFF \ + -DPCRE2_SHOW_REPORT=OFF \ + -DPCRE2_BUILD_PCRE2GREP=OFF \ + -DPCRE2_BUILD_TESTS=OFF \ + -DPCRE2_STATIC_PIC=ON + +CMAKE_OPTIONS += \ + -DBUILD_SHARED_LIBS=ON \ + -DPCRE2_BUILD_PCRE2_8=ON \ + -DPCRE2_BUILD_PCRE2_16=O$(if $(CONFIG_PACKAGE_libpcre2-16),N,FF) \ + -DPCRE2_BUILD_PCRE2_32=O$(if $(CONFIG_PACKAGE_libpcre2-32),N,FF) \ + -DPCRE2_DEBUG=OFF \ + -DPCRE2_DISABLE_PERCENT_ZT=ON \ + -DPCRE2_SUPPORT_JIT=O$(if $(CONFIG_PCRE2_JIT_ENABLED),N,FF) \ + -DPCRE2_SHOW_REPORT=OFF \ + -DPCRE2_BUILD_PCRE2GREP=OFF \ + -DPCRE2_BUILD_TESTS=OFF + +define Build/InstallDev + $(call Build/InstallDev/cmake,$(1)) + $(SED) 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' $(1)/usr/bin/pcre2-config + $(INSTALL_DIR) $(2)/bin + $(LN) ../../usr/bin/pcre2-config $(2)/bin/pcre2-config +endef + +define Package/libpcre2/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre2-{8,posix}.so* $(1)/usr/lib/ +endef + +define Package/libpcre2-16/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre2-16.so* $(1)/usr/lib/ +endef + +define Package/libpcre2-32/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre2-32.so* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libpcre2)) +$(eval $(call BuildPackage,libpcre2-16)) +$(eval $(call BuildPackage,libpcre2-32)) +$(eval $(call HostBuild)) diff --git a/package/libs/popt/Makefile b/package/libs/popt/Makefile index 34ae4d7c61..ba9c82349b 100644 --- a/package/libs/popt/Makefile +++ b/package/libs/popt/Makefile @@ -8,16 +8,14 @@ include $(TOPDIR)/rules.mk PKG_NAME:=popt -PKG_VERSION:=1.16 -PKG_RELEASE:=2 +PKG_VERSION:=1.19 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:= \ - http://distfiles.gentoo.org/distfiles/ \ - http://distcache.freebsd.org/ports-distfiles/ \ - http://rpm5.org/files/popt/ -PKG_HASH:=e728ed296fe9f069a0e005003c3d6b2dde3d9cad453422a10d6558616d304cc8 +PKG_SOURCE_URL:=http://ftp.rpm.org/popt/releases/popt-1.x/ +PKG_HASH:=c25a4838fc8e4c1c8aacb8bd620edb3084a3d63bf8987fdad3ca2758c63240f9 PKG_LICENSE:=MIT +PKG_CPE_ID:=cpe:/a:popt_project:popt PKG_FIXUP:=autoreconf PKG_REMOVE_FILES:=autogen.sh aclocal.m4 @@ -33,7 +31,7 @@ define Package/libpopt SECTION:=libs CATEGORY:=Libraries TITLE:=A command line option parsing library - URL:=http://rpm5.org/files/popt/ + URL:=https://github.com/rpm-software-management/popt ABI_VERSION:=0 endef diff --git a/package/libs/popt/patches/100-configure.ac-remove-require-gettext-version.patch b/package/libs/popt/patches/100-configure.ac-remove-require-gettext-version.patch new file mode 100644 index 0000000000..f191828302 --- /dev/null +++ b/package/libs/popt/patches/100-configure.ac-remove-require-gettext-version.patch @@ -0,0 +1,26 @@ +From 19d21b2d9e5aea5f73b1709b3c7803f920471146 Mon Sep 17 00:00:00 2001 +From: Nick Hainke +Date: Sun, 25 Sep 2022 11:52:29 +0200 +Subject: [PATCH] configure.ac: remove require gettext version + +This breaks compilation with libreCMC: +./configure: line 13059: syntax error near unexpected token `0.19.8' +./configure: line 13059: `AM_GNU_GETTEXT_REQUIRE_VERSION(0.19.8)' + +Fixes: bf8dd64e8aa0 ("Update gettext autoconf usage") + +Signed-off-by: Nick Hainke +--- + configure.ac | 1 - + 1 file changed, 1 deletion(-) + +--- a/configure.ac ++++ b/configure.ac +@@ -53,7 +53,6 @@ AC_SEARCH_LIBS([setreuid], [ucb]) + AC_CHECK_FUNCS([getuid geteuid iconv mtrace secure_getenv __secure_getenv setreuid setuid stpcpy strerror vasprintf srandom glob_pattern_p mbsrtowcs]) + + AM_GNU_GETTEXT_VERSION([0.19.8]) +-AM_GNU_GETTEXT_REQUIRE_VERSION([0.19.8]) + AM_GNU_GETTEXT([external]) + AM_ICONV_LINK + diff --git a/package/libs/readline/Makefile b/package/libs/readline/Makefile index 9cf061a648..015a1ae2da 100644 --- a/package/libs/readline/Makefile +++ b/package/libs/readline/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=readline -PKG_VERSION:=8.1 +PKG_VERSION:=8.2 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@GNU/readline -PKG_HASH:=f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02 +PKG_HASH:=3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35 PKG_LICENSE:=GPL-3.0-or-later PKG_LICENSE_FILES:=COPYING diff --git a/package/libs/sqlite3/Config-cli.in b/package/libs/sqlite3/Config-cli.in new file mode 100644 index 0000000000..752db6e817 --- /dev/null +++ b/package/libs/sqlite3/Config-cli.in @@ -0,0 +1,24 @@ +menu "Configuration" + depends on PACKAGE_sqlite3-cli + +choice + prompt "Select command-line editing support" + default SQLITE3_LIBEDIT + + config SQLITE3_LIBEDIT + bool "libedit" + help + Link against libedit. This is the default. + + config SQLITE3_READLINE + bool "readline" + help + Link against GNU readline. + + config SQLITE3_READLINE_NONE + bool "none" + help + Disable command-line editing support. + +endchoice +endmenu diff --git a/package/libs/sqlite3/Config-lib.in b/package/libs/sqlite3/Config-lib.in new file mode 100644 index 0000000000..12313c63d5 --- /dev/null +++ b/package/libs/sqlite3/Config-lib.in @@ -0,0 +1,54 @@ +menu "Configuration" + depends on PACKAGE_libsqlite3 + +config SQLITE3_BATCH_ATOMIC_WRITE + bool "Batch-atomic write support" + default n + help + Enable batch-atomic write optimization (supported only on F2FS). + +config SQLITE3_COLUMN_METADATA + bool "Column metadata API extensions" + default y + help + Includes some additional APIs that provide convenient access to + meta-data about tables and queries. + +config SQLITE3_DYNAMIC_EXTENSIONS + bool "Dynamic extensions" + default y + help + Enable loadable extensions. + +config SQLITE3_FTS3 + bool "FTS3 support" + default y + help + Enable FTS3 support. + +config SQLITE3_FTS4 + bool "FTS4 support" + depends on SQLITE3_FTS3 + default y + help + Enable FTS4 support. + +config SQLITE3_FTS5 + bool "FTS5 support" + default y + help + Enable FTS5 support. + +config SQLITE3_RTREE + bool "R-Tree support" + default y + help + Enable R-Tree support. + +config SQLITE3_SESSION + bool "Session extension" + default n + help + Enable the session extension (default no). + +endmenu diff --git a/package/libs/sqlite3/Makefile b/package/libs/sqlite3/Makefile new file mode 100644 index 0000000000..9d1d04dee0 --- /dev/null +++ b/package/libs/sqlite3/Makefile @@ -0,0 +1,142 @@ +# +# Copyright (C) 2006-2014 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=sqlite +PKG_VERSION:=3410200 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-autoconf-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://www.sqlite.org/2023/ +PKG_HASH:=e98c100dd1da4e30fa460761dab7c0b91a50b785e167f8c57acc46514fae9499 + +PKG_CPE_ID:=cpe:/a:sqlite:sqlite +PKG_LICENSE:=PUBLICDOMAIN +PKG_LICENSE_FILES:= +PKG_MAINTAINER:= + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-autoconf-$(PKG_VERSION) +PKG_BUILD_PARALLEL:=1 +PKG_FIXUP:=autoreconf +PKG_INSTALL:=1 + +PKG_CONFIG_DEPENDS := \ + CONFIG_SQLITE3_BATCH_ATOMIC_WRITE \ + CONFIG_SQLITE3_COLUMN_METADATA \ + CONFIG_SQLITE3_DYNAMIC_EXTENSIONS \ + CONFIG_SQLITE3_FTS3 \ + CONFIG_SQLITE3_FTS4 \ + CONFIG_SQLITE3_FTS5 \ + CONFIG_SQLITE3_LIBEDIT \ + CONFIG_SQLITE3_READLINE \ + CONFIG_SQLITE3_RTREE \ + CONFIG_SQLITE3_SESSION + +include $(INCLUDE_DIR)/package.mk + +define Package/sqlite3/Default + SUBMENU:=Database + TITLE:=SQLite (v3.x) database engine + URL:=http://www.sqlite.org/ +endef + +define Package/sqlite3/Default/description + SQLite is a small C library that implements a self-contained, embeddable, + zero-configuration SQL database engine. +endef + +define Package/libsqlite3 + $(call Package/sqlite3/Default) + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+libpthread +zlib + TITLE+= (library) + ABI_VERSION:=0 +endef + +define Package/libsqlite3/description +$(call Package/sqlite3/Default/description) + This package contains the SQLite (v3.x) shared library, used by other + programs. +endef + +define Package/libsqlite3/config + source "$(SOURCE)/Config-lib.in" +endef + +define Package/sqlite3-cli + $(call Package/sqlite3/Default) + SECTION:=utils + CATEGORY:=Utilities + DEPENDS := \ + +libsqlite3 \ + +SQLITE3_LIBEDIT:libedit \ + +SQLITE3_READLINE:libreadline \ + +SQLITE3_READLINE:libncursesw + TITLE+= (cli) +endef + +define Package/sqlite3-cli/description +$(call Package/sqlite3/Default/description) + This package contains a terminal-based front-end to the SQLite (v3.x) library + that can evaluate queries interactively and display the results in multiple + formats. +endef + +define Package/sqlite3-cli/config + source "$(SOURCE)/Config-cli.in" +endef + +TARGET_CFLAGS += \ + -DHAVE_ISNAN \ + -DHAVE_MALLOC_USABLE_SIZE \ + -DSQLITE_ENABLE_UNLOCK_NOTIFY \ + $(if $(CONFIG_SQLITE3_BATCH_ATOMIC_WRITE),-DSQLITE_ENABLE_BATCH_ATOMIC_WRITE) \ + $(if $(CONFIG_SQLITE3_COLUMN_METADATA),-DSQLITE_ENABLE_COLUMN_METADATA) + +CONFIGURE_ARGS += \ + --disable-debug \ + --disable-static-shell \ + --enable-shared \ + --enable-static \ + --enable-threadsafe \ + $(if $(CONFIG_SQLITE3_DYNAMIC_EXTENSIONS),--enable-dynamic-extensions,--disable-dynamic-extensions) \ + $(if $(CONFIG_SQLITE3_FTS3),--enable-fts3,--disable-fts3) \ + $(if $(CONFIG_SQLITE3_FTS4),--enable-fts4,--disable-fts4) \ + $(if $(CONFIG_SQLITE3_FTS5),--enable-fts5,--disable-fts5) \ + $(if $(CONFIG_SQLITE3_RTREE),--enable-rtree,--disable-rtree) \ + $(if $(CONFIG_SQLITE3_SESSION),--enable-session,--disable-session) + +ifeq ($(CONFIG_SQLITE3_LIBEDIT),y) +CONFIGURE_ARGS+=--disable-readline +else ifeq ($(CONFIG_SQLITE3_READLINE),y) +CONFIGURE_ARGS+=--disable-editline +else +CONFIGURE_ARGS+=--disable-editline --disable-readline +endif + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsqlite3.{a,so*} $(1)/usr/lib + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/sqlite3{,ext}.h $(1)/usr/include + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/sqlite3.pc $(1)/usr/lib/pkgconfig +endef + +define Package/libsqlite3/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsqlite3.so.$(ABI_VERSION)* $(1)/usr/lib +endef + +define Package/sqlite3-cli/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sqlite3 $(1)/usr/bin +endef + +$(eval $(call BuildPackage,libsqlite3)) +$(eval $(call BuildPackage,sqlite3-cli)) diff --git a/package/libs/sysfsutils/Makefile b/package/libs/sysfsutils/Makefile index 8ce9a40f91..b7c9d8cdc1 100644 --- a/package/libs/sysfsutils/Makefile +++ b/package/libs/sysfsutils/Makefile @@ -9,12 +9,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=sysfsutils PKG_VERSION:=2.1.0 -PKG_RELEASE:=3 +PKG_RELEASE:=4 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@SF/linux-diag PKG_HASH:=e865de2c1f559fff0d3fc936e660c0efaf7afe662064f2fb97ccad1ec28d208a PKG_MAINTAINER:=Jo-Philipp Wich +PKG_CPE_ID:=cpe:/a:sysfsutils_project:sysfsutils PKG_LICENSE:=LGPL-2.1 PKG_LICENSE_FILES:=COPYING cmd/GPL lib/LGPL diff --git a/package/libs/sysfsutils/files/sysfsutils b/package/libs/sysfsutils/files/sysfsutils index 0305ca82a9..3c5b35e78d 100644 --- a/package/libs/sysfsutils/files/sysfsutils +++ b/package/libs/sysfsutils/files/sysfsutils @@ -4,6 +4,8 @@ # Based on Debian's script /etc/init.d/sysfsutils by # Martin Pitt +START=11 + load_conffile() { FILE="$1" sed 's/#.*$//; /^[[:space:]]*$/d; @@ -39,7 +41,6 @@ load_conffile() { } } -START=11 start() { for file in /etc/sysfs.conf /etc/sysfs.d/*.conf; do [ -r "$file" ] || continue diff --git a/package/libs/ustream-ssl/Makefile b/package/libs/ustream-ssl/Makefile index 9aafdfb846..875ef10ceb 100644 --- a/package/libs/ustream-ssl/Makefile +++ b/package/libs/ustream-ssl/Makefile @@ -5,9 +5,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/ustream-ssl.git -PKG_SOURCE_DATE:=2022-12-08 -PKG_SOURCE_VERSION:=9217ab46536353c7c792951b57163063f5ec7a3b -PKG_MIRROR_HASH:=cd4dc6a6c18290348b1f8b1c01df3320e4954dc46d714c797bef066f7a91248d +PKG_SOURCE_DATE:=2023-02-25 +PKG_SOURCE_VERSION:=498f6e268d4d2b0ad33b430f4ba1abe397d31496 +PKG_MIRROR_HASH:=a201d065dd613e30886c9f13a0851cec79538192cfe591b6f8ecd88724d55fb1 CMAKE_INSTALL:=1 PKG_LICENSE:=ISC @@ -39,15 +39,15 @@ define Package/libustream-wolfssl DEPENDS += +PACKAGE_libustream-wolfssl:libwolfssl CONFLICTS := libustream-openssl VARIANT:=wolfssl + DEFAULT_VARIANT:=1 endef define Package/libustream-mbedtls $(Package/libustream/default) TITLE += (mbedtls) - DEPENDS += +libmbedtls + DEPENDS += +PACKAGE_libustream-mbedtls:libmbedtls CONFLICTS := libustream-openssl libustream-wolfssl VARIANT:=mbedtls - DEFAULT_VARIANT:=1 endef ifeq ($(BUILD_VARIANT),wolfssl) diff --git a/package/libs/wolfssl/Config.in b/package/libs/wolfssl/Config.in index 025362ff6f..7c154ccb31 100644 --- a/package/libs/wolfssl/Config.in +++ b/package/libs/wolfssl/Config.in @@ -1,4 +1,4 @@ -if PACKAGE_libwolfssl +menu "wolfSSL Library Configuration" config WOLFSSL_HAS_AES_CCM bool "Include AES-CCM support" @@ -52,6 +52,9 @@ config WOLFSSL_HAS_ECC25519 bool "Include ECC Curve 25519 support" default y +config WOLFSSL_HAS_ECC448 + bool "Include ECC Curve 448 support" + config WOLFSSL_HAS_OPENVPN bool "Include OpenVPN support" default y @@ -63,38 +66,31 @@ config WOLFSSL_ALT_NAMES config WOLFSSL_HAS_DEVCRYPTO bool -config WOLFSSL_ASM_CAPABLE - bool - default x86_64 || (aarch64 && !TARGET_bcm27xx) - -choice - prompt "Hardware Acceleration" - default WOLFSSL_HAS_NO_HW - - config WOLFSSL_HAS_NO_HW - bool "None" - - config WOLFSSL_HAS_CPU_CRYPTO - bool "Use CPU crypto instructions" - depends on WOLFSSL_ASM_CAPABLE - help - This will use Intel AESNI insturctions or armv8 Crypto Extensions. - Either of them should easily outperform hardware crypto in WolfSSL. - - config WOLFSSL_HAS_AFALG - bool "AF_ALG" - - config WOLFSSL_HAS_DEVCRYPTO_CBC - bool "/dev/crytpo - AES-CBC-only" - select WOLFSSL_HAS_DEVCRYPTO - - config WOLFSSL_HAS_DEVCRYPTO_AES - bool "/dev/crypto - AES-only (all supported modes)" - select WOLFSSL_HAS_DEVCRYPTO - - config WOLFSSL_HAS_DEVCRYPTO_FULL - bool "/dev/crypto - full" - select WOLFSSL_HAS_DEVCRYPTO -endchoice - +if PACKAGE_libwolfssl + if PACKAGE_libwolfsslcpu-crypto + comment "Hardware Acceleration does not apply to libwolfsslcpu-crypto" + endif + choice + prompt "Hardware Acceleration" + default WOLFSSL_HAS_NO_HW + + config WOLFSSL_HAS_NO_HW + bool "None" + + config WOLFSSL_HAS_AFALG + bool "AF_ALG" + + config WOLFSSL_HAS_DEVCRYPTO_CBC + bool "/dev/crypto - AES-CBC-only" + select WOLFSSL_HAS_DEVCRYPTO + + config WOLFSSL_HAS_DEVCRYPTO_AES + bool "/dev/crypto - AES-only (all supported modes)" + select WOLFSSL_HAS_DEVCRYPTO + + config WOLFSSL_HAS_DEVCRYPTO_FULL + bool "/dev/crypto - full" + select WOLFSSL_HAS_DEVCRYPTO + endchoice endif +endmenu diff --git a/package/libs/wolfssl/Makefile b/package/libs/wolfssl/Makefile index 2ff3fea7a8..6451dca68d 100644 --- a/package/libs/wolfssl/Makefile +++ b/package/libs/wolfssl/Makefile @@ -8,16 +8,16 @@ include $(TOPDIR)/rules.mk PKG_NAME:=wolfssl -PKG_VERSION:=5.5.3-stable -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=5.6.4-stable +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/wolfSSL/wolfssl/archive/v$(PKG_VERSION) -PKG_HASH:=fd3135b8657d09fb96a8aad16585da850b96ea420ae8ce5ac4d5fdfc614c2683 +PKG_HASH:=031691906794ff45e1e792561cf31759f5d29ac74936bc8dffb8b14f16d820b4 PKG_FIXUP:=libtool libtool-abiver PKG_INSTALL:=1 -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 lto PKG_BUILD_PARALLEL:=1 PKG_LICENSE:=GPL-2.0-or-later PKG_LICENSE_FILES:=LICENSING COPYING @@ -32,6 +32,7 @@ PKG_CONFIG_DEPENDS:=\ CONFIG_WOLFSSL_HAS_DH \ CONFIG_WOLFSSL_HAS_DTLS \ CONFIG_WOLFSSL_HAS_ECC25519 \ + CONFIG_WOLFSSL_HAS_ECC448 \ CONFIG_WOLFSSL_HAS_OCSP \ CONFIG_WOLFSSL_HAS_OPENVPN CONFIG_WOLFSSL_ALT_NAMES \ CONFIG_WOLFSSL_HAS_SESSION_TICKET \ @@ -42,8 +43,8 @@ PKG_CONFIG_DEPENDS:=\ PKG_ABI_VERSION:=$(patsubst %-stable,%,$(PKG_VERSION)).$(call version_abbrev,$(call confvar,$(PKG_CONFIG_DEPENDS))) PKG_CONFIG_DEPENDS+=\ + CONFIG_PACKAGE_libwolfssl-benchmark \ CONFIG_WOLFSSL_HAS_AFALG \ - CONFIG_WOLFSSL_HAS_CPU_CRYPTO \ CONFIG_WOLFSSL_HAS_DEVCRYPTO_AES \ CONFIG_WOLFSSL_HAS_DEVCRYPTO_CBC \ CONFIG_WOLFSSL_HAS_DEVCRYPTO_FULL @@ -64,6 +65,9 @@ $(call Package/libwolfssl/Default) PROVIDES:=libcyassl DEPENDS:=+WOLFSSL_HAS_DEVCRYPTO:kmod-cryptodev +WOLFSSL_HAS_AFALG:kmod-crypto-user ABI_VERSION:=$(PKG_ABI_VERSION) + VARIANT:=regular + DEFAULT_VARIANT:=1 + CONFLICTS:=libwolfsslcpu-crypto endef define Package/libwolfssl/description @@ -75,12 +79,38 @@ define Package/libwolfssl/config source "$(SOURCE)/Config.in" endef +define Package/libwolfsslcpu-crypto +$(call Package/libwolfssl/Default) + TITLE:=wolfSSL library with AES CPU instructions + PROVIDES:=libwolfssl libcyassl + DEPENDS:=@((aarch64||x86_64)&&(m||!TARGET_bcm27xx)) + ABI_VERSION:=$(PKG_ABI_VERSION) + VARIANT:=cpu-crypto +endef + define Package/libwolfssl-benchmark $(call Package/libwolfssl/Default) TITLE:=wolfSSL Benchmark Utility DEPENDS:=libwolfssl endef +define Package/libwolfsslcpu-crypto/description +$(call Package/libwolfssl/description) +This variant uses AES CPU instructions (Intel AESNI or ARMv8 Crypto Extension) +endef + +define Package/libwolfsslcpu-crypto/config + if TARGET_armsr && PACKAGE_libwolfsslcpu-crypto = y + comment "You are about to build libwolfsslcpu-crypto into an armsr_64 image." + comment "Ensure all of your installation targets support the Crypto Extension. " + comment "Look for the 'aes' feature in /proc/cpuinfo. This library does not do " + comment "run-time detection and will crash if the CPU does not support it. " + endif + if TARGET_bcm27xx && PACKAGE_libwolfsslcpu-crypto + comment "Beware that libwolfsslcpu-crypto will not run in a bcm27xx target. " + endif +endef + define Package/libwolfssl-benchmark/description This is the wolfssl benchmark utility. endef @@ -88,12 +118,9 @@ endef TARGET_CFLAGS += \ $(FPIC) \ -fomit-frame-pointer \ - -flto \ -DFP_MAX_BITS=8192 \ $(if $(CONFIG_WOLFSSL_ALT_NAMES),-DWOLFSSL_ALT_NAMES) -TARGET_LDFLAGS += -flto - # --enable-stunnel needed for OpenSSL API compatibility bits CONFIGURE_ARGS += \ --enable-reproducible-build \ @@ -118,11 +145,49 @@ CONFIGURE_ARGS += \ --$(if $(CONFIG_WOLFSSL_HAS_SESSION_TICKET),enable,disable)-session-ticket \ --$(if $(CONFIG_WOLFSSL_HAS_DTLS),enable,disable)-dtls \ --$(if $(CONFIG_WOLFSSL_HAS_ECC25519),enable,disable)-curve25519 \ + --$(if $(CONFIG_WOLFSSL_HAS_ECC448),enable,disable)-curve448 \ + --$(if $(CONFIG_WOLFSSL_HAS_OPENVPN),enable,disable)-openvpn + +define Package/libwolfsslcpu-crypto/preinst-aarch64 +#!/bin/sh +exec >&2 +printf "[libwolfsslcpu-crypto] Checking for Arm v8-A Cryptographic Extension support: " +if [ -n "$${IPKG_INSTROOT}" ]; then + printf "...[offline]... " + eval "$$(grep '^DISTRIB_TARGET=' "$${IPKG_INSTROOT}/etc/openwrt_release")" + echo "$${DISTRIB_TARGET}" | grep '^bcm27xx/.*' > /dev/null && { + echo "not supported" + echo "Error: Target $${DISTRIB_TARGET} does not support Arm Cryptographic Extension." + echo "Install the regular libwolfssl package instead of libwolfsslcpu-crypto." + exit 1 + } +else + grep -q '^Features.*\baes\b' /proc/cpuinfo || { + echo "not supported" + echo "Error: Arm v8-A Cryptographic Extension not supported." + echo "Install the regular libwolfssl package instead of libwolfsslcpu-crypto." + echo "Contents of /proc/cpuinfo:" + cat /proc/cpuinfo + exit 1 + } +fi +echo OK +exit 0 +endef + +ifeq ($(BUILD_VARIANT),regular) +CONFIGURE_ARGS += \ --$(if $(CONFIG_WOLFSSL_HAS_AFALG),enable,disable)-afalg \ - --$(if $(CONFIG_WOLFSSL_HAS_OPENVPN),enable,disable)-openvpn \ --enable-devcrypto=$(if $(CONFIG_WOLFSSL_HAS_DEVCRYPTO_CBC),cbc\ ,$(if $(CONFIG_WOLFSSL_HAS_DEVCRYPTO_AES),aes\ ,$(if $(CONFIG_WOLFSSL_HAS_DEVCRYPTO_FULL),yes,no))) +else ifdef CONFIG_aarch64 + CONFIGURE_ARGS += --enable-armasm + TARGET_CFLAGS:=$(TARGET_CFLAGS:-mcpu%=-mcpu%+crypto) + Package/libwolfsslcpu-crypto/preinst=$(Package/libwolfsslcpu-crypto/preinst-aarch64) +else ifdef CONFIG_TARGET_x86_64 + CONFIGURE_ARGS += --enable-intelasm +endif ifeq ($(CONFIG_WOLFSSL_HAS_OCSP),y) CONFIGURE_ARGS += \ @@ -134,15 +199,6 @@ CONFIGURE_ARGS += \ --enable-wpas --enable-fortress --enable-fastmath endif -ifdef CONFIG_WOLFSSL_HAS_CPU_CRYPTO - ifdef CONFIG_aarch64 - CONFIGURE_ARGS += --enable-armasm - TARGET_CFLAGS:=$(TARGET_CFLAGS:-mcpu%=-mcpu%+crypto) - else ifdef CONFIG_TARGET_x86_64 - CONFIGURE_ARGS += --enable-intelasm - endif -endif - define Build/InstallDev $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib/pkgconfig $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/ @@ -160,10 +216,13 @@ define Package/libwolfssl/install $(CP) $(PKG_INSTALL_DIR)/usr/lib/libwolfssl.so.* $(1)/usr/lib/ endef +Package/libwolfsslcpu-crypto/install=$(Package/libwolfssl/install) + define Package/libwolfssl-benchmark/install $(INSTALL_DIR) $(1)/usr/bin $(CP) $(PKG_BUILD_DIR)/wolfcrypt/benchmark/.libs/benchmark $(1)/usr/bin/wolfssl-benchmark endef $(eval $(call BuildPackage,libwolfssl)) +$(eval $(call BuildPackage,libwolfsslcpu-crypto)) $(eval $(call BuildPackage,libwolfssl-benchmark)) diff --git a/package/libs/wolfssl/patches/100-disable-hardening-check.patch b/package/libs/wolfssl/patches/100-disable-hardening-check.patch index 904b424fa0..368ec3e7e0 100644 --- a/package/libs/wolfssl/patches/100-disable-hardening-check.patch +++ b/package/libs/wolfssl/patches/100-disable-hardening-check.patch @@ -1,10 +1,10 @@ --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h -@@ -2455,7 +2455,7 @@ extern void uITRON4_free(void *p) ; - #endif +@@ -2630,7 +2630,7 @@ extern void uITRON4_free(void *p) ; /* warning for not using harden build options (default with ./configure) */ --#ifndef WC_NO_HARDEN + /* do not warn if big integer support is disabled */ +-#if !defined(WC_NO_HARDEN) && !defined(NO_BIG_INT) +#if 0 #if (defined(USE_FAST_MATH) && !defined(TFM_TIMING_RESISTANT)) || \ (defined(HAVE_ECC) && !defined(ECC_TIMING_RESISTANT)) || \ diff --git a/package/libs/zlib/Makefile b/package/libs/zlib/Makefile index f30accf163..7031bc974f 100644 --- a/package/libs/zlib/Makefile +++ b/package/libs/zlib/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=zlib -PKG_VERSION:=1.2.11 -PKG_RELEASE:=6 +PKG_VERSION:=1.2.13 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=@SF/libpng http://www.zlib.net -PKG_HASH:=4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066 +PKG_SOURCE_URL:=https://github.com/madler/zlib/releases/download/v$(PKG_VERSION) +PKG_HASH:=d14c38e313afc35a9a8760dadf26042f51ea0f5d154b0630a31da0540107fb98 PKG_LICENSE:=Zlib PKG_LICENSE_FILES:=README diff --git a/package/libs/zlib/patches/001-neon-implementation-of-adler32.patch b/package/libs/zlib/patches/001-neon-implementation-of-adler32.patch deleted file mode 100644 index 843ef45c7d..0000000000 --- a/package/libs/zlib/patches/001-neon-implementation-of-adler32.patch +++ /dev/null @@ -1,253 +0,0 @@ -From d2f06cd65d7ac39c6dd6761eef162abc946b155b Mon Sep 17 00:00:00 2001 -From: Adenilson Cavalcanti -Date: Tue, 11 Apr 2017 17:13:02 -0700 -Subject: [PATCH] NEON implementation for Adler32 - -The checksum is calculated in the uncompressed PNG data -and can be made much faster by using SIMD. - -Tests in ARMv8 yielded an improvement of about 3x -(e.g. walltime was 350ms x 125ms for a 4096x4096 bytes -executed 30 times). That results in at least 18% improvement -in image decoding in Chromium. - -Further details at: -https://bugs.chromium.org/p/chromium/issues/detail?id=688601 ---- - CMakeLists.txt | 29 +++++++--- - adler32.c | 5 ++ - contrib/README.contrib | 3 + - contrib/arm/neon_adler32.c | 137 +++++++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 166 insertions(+), 8 deletions(-) - create mode 100644 contrib/arm/neon_adler32.c - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 0fe939df..8e75f664 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -7,6 +7,7 @@ set(VERSION "1.2.11") - - option(ASM686 "Enable building i686 assembly implementation") - option(AMD64 "Enable building amd64 assembly implementation") -+option(ARMv8 "Enable building ARM NEON intrinsics implementation") - - set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") - set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") -@@ -132,14 +133,26 @@ endif() - if(CMAKE_COMPILER_IS_GNUCC) - if(ASM686) - set(ZLIB_ASMS contrib/asm686/match.S) -- elseif (AMD64) -+ elseif(AMD64) - set(ZLIB_ASMS contrib/amd64/amd64-match.S) -- endif () -+ elseif(ARMv8) -+ set(ZLIB_ARMv8 contrib/arm/neon_adler32.c) -+ endif() - -- if(ZLIB_ASMS) -- add_definitions(-DASMV) -- set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE) -- endif() -+ if(ZLIB_ASMS) -+ add_definitions(-DASMV) -+ set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE) -+ elseif(ZLIB_ARMv8) -+ add_definitions(-DARMv8) -+ set(COMPILER ${CMAKE_C_COMPILER}) -+ # NEON is mandatory in ARMv8. -+ if(${COMPILER} MATCHES "aarch64") -+ set_source_files_properties(${ZLIB_ARMv8} PROPERTIES LANGUAGE C COMPILE_FLAGS -march=armv8-a) -+ # But it was optional for ARMv7. -+ elseif(${COMPILER} MATCHES "arm") -+ set_source_files_properties(${ZLIB_ARMv8} PROPERTIES LANGUAGE C COMPILE_FLAGS -mfpu=neon) -+ endif() -+ endif() - endif() - - if(MSVC) -@@ -183,8 +196,8 @@ if(MINGW) - set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj) - endif(MINGW) - --add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) --add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) -+add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_ARMv8} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) -+add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_ARMv8} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) - set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL) - set_target_properties(zlib PROPERTIES SOVERSION 1) - -diff --git a/adler32.c b/adler32.c -index d0be4380..45ebaa4b 100644 ---- a/adler32.c -+++ b/adler32.c -@@ -136,7 +136,12 @@ uLong ZEXPORT adler32(adler, buf, len) - const Bytef *buf; - uInt len; - { -+#ifdef ARMv8 -+# pragma message("Using NEON-ized Adler32.") -+ return NEON_adler32(adler, buf, len); -+#else - return adler32_z(adler, buf, len); -+#endif - } - - /* ========================================================================= */ -diff --git a/contrib/README.contrib b/contrib/README.contrib -index a411d5c3..3fd1d202 100644 ---- a/contrib/README.contrib -+++ b/contrib/README.contrib -@@ -12,6 +12,9 @@ amd64/ by Mikhail Teterin - asm code for AMD64 - See patch at http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/96393 - -+arm/ by Adenilson Cavalcanti -+ ARM optimizations (NEON and ARMv8 code). -+ - asm686/ by Brian Raiter - asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax - See http://www.muppetlabs.com/~breadbox/software/assembly.html -diff --git a/contrib/arm/neon_adler32.c b/contrib/arm/neon_adler32.c -new file mode 100644 -index 00000000..f173a74f ---- /dev/null -+++ b/contrib/arm/neon_adler32.c -@@ -0,0 +1,137 @@ -+/* Copyright (C) 1995-2011, 2016 Mark Adler -+ * Copyright (C) 2017 ARM Holdings Inc. -+ * Authors: Adenilson Cavalcanti -+ * Simon Hosie -+ * This software is provided 'as-is', without any express or implied -+ * warranty. In no event will the authors be held liable for any damages -+ * arising from the use of this software. -+ * Permission is granted to anyone to use this software for any purpose, -+ * including commercial applications, and to alter it and redistribute it -+ * freely, subject to the following restrictions: -+ * 1. The origin of this software must not be misrepresented; you must not -+ * claim that you wrote the original software. If you use this software -+ * in a product, an acknowledgment in the product documentation would be -+ * appreciated but is not required. -+ * 2. Altered source versions must be plainly marked as such, and must not be -+ * misrepresented as being the original software. -+ * 3. This notice may not be removed or altered from any source distribution. -+ */ -+ -+#if (defined(__ARM_NEON__) || defined(__ARM_NEON)) -+#include -+ -+static void NEON_accum32(uint32_t *s, const unsigned char *buf, -+ unsigned int len) -+{ -+ static const uint8_t taps[32] = { -+ 32, 31, 30, 29, 28, 27, 26, 25, -+ 24, 23, 22, 21, 20, 19, 18, 17, -+ 16, 15, 14, 13, 12, 11, 10, 9, -+ 8, 7, 6, 5, 4, 3, 2, 1 }; -+ -+ uint32x2_t adacc2, s2acc2, as; -+ uint8x16_t t0 = vld1q_u8(taps), t1 = vld1q_u8(taps + 16); -+ -+ uint32x4_t adacc = vdupq_n_u32(0), s2acc = vdupq_n_u32(0); -+ adacc = vsetq_lane_u32(s[0], adacc, 0); -+ s2acc = vsetq_lane_u32(s[1], s2acc, 0); -+ -+ while (len >= 2) { -+ uint8x16_t d0 = vld1q_u8(buf), d1 = vld1q_u8(buf + 16); -+ uint16x8_t adler, sum2; -+ s2acc = vaddq_u32(s2acc, vshlq_n_u32(adacc, 5)); -+ adler = vpaddlq_u8( d0); -+ adler = vpadalq_u8(adler, d1); -+ sum2 = vmull_u8( vget_low_u8(t0), vget_low_u8(d0)); -+ sum2 = vmlal_u8(sum2, vget_high_u8(t0), vget_high_u8(d0)); -+ sum2 = vmlal_u8(sum2, vget_low_u8(t1), vget_low_u8(d1)); -+ sum2 = vmlal_u8(sum2, vget_high_u8(t1), vget_high_u8(d1)); -+ adacc = vpadalq_u16(adacc, adler); -+ s2acc = vpadalq_u16(s2acc, sum2); -+ len -= 2; -+ buf += 32; -+ } -+ -+ while (len > 0) { -+ uint8x16_t d0 = vld1q_u8(buf); -+ uint16x8_t adler, sum2; -+ s2acc = vaddq_u32(s2acc, vshlq_n_u32(adacc, 4)); -+ adler = vpaddlq_u8(d0); -+ sum2 = vmull_u8( vget_low_u8(t1), vget_low_u8(d0)); -+ sum2 = vmlal_u8(sum2, vget_high_u8(t1), vget_high_u8(d0)); -+ adacc = vpadalq_u16(adacc, adler); -+ s2acc = vpadalq_u16(s2acc, sum2); -+ buf += 16; -+ len--; -+ } -+ -+ adacc2 = vpadd_u32(vget_low_u32(adacc), vget_high_u32(adacc)); -+ s2acc2 = vpadd_u32(vget_low_u32(s2acc), vget_high_u32(s2acc)); -+ as = vpadd_u32(adacc2, s2acc2); -+ s[0] = vget_lane_u32(as, 0); -+ s[1] = vget_lane_u32(as, 1); -+} -+ -+static void NEON_handle_tail(uint32_t *pair, const unsigned char *buf, -+ unsigned int len) -+{ -+ /* Oldie K&R code integration. */ -+ unsigned int i; -+ for (i = 0; i < len; ++i) { -+ pair[0] += buf[i]; -+ pair[1] += pair[0]; -+ } -+} -+ -+extern unsigned long NEON_adler32(unsigned long adler, const unsigned char *buf, -+ const unsigned int len) -+{ -+ /* initial Adler-32 value (deferred check for len == 1 speed) */ -+ if (!buf) -+ return 1L; -+ -+ /* The largest prime smaller than 65536. */ -+ const uint32_t M_BASE = 65521; -+ /* This is the threshold where doing accumulation may overflow. */ -+ const int M_NMAX = 5552; -+ -+ unsigned long sum2; -+ uint32_t pair[2]; -+ int n = M_NMAX; -+ unsigned int done = 0; -+ /* Oldie K&R code integration. */ -+ unsigned int i; -+ -+ /* Split Adler-32 into component sums, it can be supplied by -+ * the caller sites (e.g. in a PNG file). -+ */ -+ sum2 = (adler >> 16) & 0xffff; -+ adler &= 0xffff; -+ pair[0] = adler; -+ pair[1] = sum2; -+ -+ for (i = 0; i < len; i += n) { -+ if ((i + n) > len) -+ n = len - i; -+ -+ if (n < 16) -+ break; -+ -+ NEON_accum32(pair, buf + i, n / 16); -+ pair[0] %= M_BASE; -+ pair[1] %= M_BASE; -+ -+ done += (n / 16) * 16; -+ } -+ -+ /* Handle the tail elements. */ -+ if (done < len) { -+ NEON_handle_tail(pair, (buf + done), len - done); -+ pair[0] %= M_BASE; -+ pair[1] %= M_BASE; -+ } -+ -+ /* D = B * 65536 + A, see: https://en.wikipedia.org/wiki/Adler-32. */ -+ return (pair[1] << 16) | pair[0]; -+} -+#endif diff --git a/package/libs/zlib/patches/002-arm-specific-optimisations-for-inflate.patch b/package/libs/zlib/patches/002-arm-specific-optimisations-for-inflate.patch index d181b034e5..04e66621e1 100644 --- a/package/libs/zlib/patches/002-arm-specific-optimisations-for-inflate.patch +++ b/package/libs/zlib/patches/002-arm-specific-optimisations-for-inflate.patch @@ -11,9 +11,6 @@ Change-Id: Id4cda552b39bfb39ab35ec499dbe122b43b6d1a1 create mode 100644 contrib/arm/inffast.c create mode 100644 contrib/arm/inflate.c -diff --git a/contrib/arm/inffast.c b/contrib/arm/inffast.c -new file mode 100644 -index 00000000..0dbd1dbc --- /dev/null +++ b/contrib/arm/inffast.c @@ -0,0 +1,323 @@ @@ -340,9 +337,6 @@ index 00000000..0dbd1dbc + */ + +#endif /* !ASMINF */ -diff --git a/contrib/arm/inflate.c b/contrib/arm/inflate.c -new file mode 100644 -index 00000000..ac333e8c --- /dev/null +++ b/contrib/arm/inflate.c @@ -0,0 +1,1561 @@ diff --git a/package/libs/zlib/patches/003-arm-specific-optimisations-for-inflate.patch b/package/libs/zlib/patches/003-arm-specific-optimisations-for-inflate.patch index 9370264c40..1f83b500ba 100644 --- a/package/libs/zlib/patches/003-arm-specific-optimisations-for-inflate.patch +++ b/package/libs/zlib/patches/003-arm-specific-optimisations-for-inflate.patch @@ -16,9 +16,6 @@ Change-Id: I59854eb25d2b1e43561c8a2afaf9175bf10cf674 3 files changed, 335 insertions(+), 62 deletions(-) create mode 100644 contrib/arm/chunkcopy.h -diff --git a/contrib/arm/chunkcopy.h b/contrib/arm/chunkcopy.h -new file mode 100644 -index 00000000..2d6fd6f9 --- /dev/null +++ b/contrib/arm/chunkcopy.h @@ -0,0 +1,279 @@ @@ -301,8 +298,6 @@ index 00000000..2d6fd6f9 +#undef Z_RESTRICT + +#endif /* CHUNKCOPY_H */ -diff --git a/contrib/arm/inffast.c b/contrib/arm/inffast.c -index 0dbd1dbc..f7f50071 100644 --- a/contrib/arm/inffast.c +++ b/contrib/arm/inffast.c @@ -7,6 +7,7 @@ @@ -313,7 +308,7 @@ index 0dbd1dbc..f7f50071 100644 #ifdef ASMINF # pragma message("Assembler code may have bugs -- use at your own risk") -@@ -57,6 +58,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ +@@ -57,6 +58,7 @@ unsigned start; /* inflate()'s s unsigned char FAR *out; /* local strm->next_out */ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ unsigned char FAR *end; /* while out < end, enough space available */ @@ -321,7 +316,7 @@ index 0dbd1dbc..f7f50071 100644 #ifdef INFLATE_STRICT unsigned dmax; /* maximum distance from zlib header */ #endif -@@ -84,12 +86,13 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ +@@ -84,12 +86,13 @@ unsigned start; /* inflate()'s s out = strm->next_out; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - 257); @@ -336,7 +331,7 @@ index 0dbd1dbc..f7f50071 100644 window = state->window; hold = state->hold; bits = state->bits; -@@ -197,70 +200,51 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ +@@ -197,70 +200,51 @@ unsigned start; /* inflate()'s s #endif } from = window; @@ -371,14 +366,8 @@ index 0dbd1dbc..f7f50071 100644 - } while (--op); - from = out - dist; /* rest from output */ - } -+ out = chunkcopy_safe(out, from, op, limit); -+ from = window; /* more from start of window */ -+ op = wnext; -+ /* This (rare) case can create a situation where -+ the first chunkcopy below must be checked. -+ */ - } - } +- } +- } - else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ @@ -399,6 +388,14 @@ index 0dbd1dbc..f7f50071 100644 - *out++ = *from++; - if (len > 1) - *out++ = *from++; ++ out = chunkcopy_safe(out, from, op, limit); ++ from = window; /* more from start of window */ ++ op = wnext; ++ /* This (rare) case can create a situation where ++ the first chunkcopy below must be checked. ++ */ ++ } ++ } + if (op < len) { /* still need some from output */ + out = chunkcopy_safe(out, from, op, limit); + len -= op; @@ -443,8 +440,6 @@ index 0dbd1dbc..f7f50071 100644 } } else if ((op & 64) == 0) { /* 2nd level distance code */ -diff --git a/contrib/arm/inflate.c b/contrib/arm/inflate.c -index ac333e8c..e40322c3 100644 --- a/contrib/arm/inflate.c +++ b/contrib/arm/inflate.c @@ -84,6 +84,7 @@ diff --git a/package/libs/zlib/patches/004-attach-sourcefiles-in-patch-002-to-buildsystem.patch b/package/libs/zlib/patches/004-attach-sourcefiles-in-patch-002-to-buildsystem.patch index 68f317b24b..81816aed68 100644 --- a/package/libs/zlib/patches/004-attach-sourcefiles-in-patch-002-to-buildsystem.patch +++ b/package/libs/zlib/patches/004-attach-sourcefiles-in-patch-002-to-buildsystem.patch @@ -1,8 +1,6 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 8e75f66..24d7329 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -95,34 +95,67 @@ set(ZLIB_PUBLIC_HDRS +@@ -91,34 +91,67 @@ set(ZLIB_PUBLIC_HDRS ${CMAKE_CURRENT_BINARY_DIR}/zconf.h zlib.h ) diff --git a/package/libs/zlib/patches/006-fix-CVE-2022-37434.patch b/package/libs/zlib/patches/006-fix-CVE-2022-37434.patch deleted file mode 100644 index dc84d3a1d3..0000000000 --- a/package/libs/zlib/patches/006-fix-CVE-2022-37434.patch +++ /dev/null @@ -1,32 +0,0 @@ -From eff308af425b67093bab25f80f1ae950166bece1 Mon Sep 17 00:00:00 2001 -From: Mark Adler -Date: Sat, 30 Jul 2022 15:51:11 -0700 -Subject: [PATCH] Fix a bug when getting a gzip header extra field with - inflate(). - -If the extra field was larger than the space the user provided with -inflateGetHeader(), and if multiple calls of inflate() delivered -the extra header data, then there could be a buffer overflow of the -provided space. This commit assures that provided space is not -exceeded. ---- - inflate.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/inflate.c b/inflate.c -index 7be8c6366..7a7289749 100644 ---- a/inflate.c -+++ b/inflate.c -@@ -763,9 +763,10 @@ int flush; - copy = state->length; - if (copy > have) copy = have; - if (copy) { -+ len = state->head->extra_len - state->length; - if (state->head != Z_NULL && -- state->head->extra != Z_NULL) { -- len = state->head->extra_len - state->length; -+ state->head->extra != Z_NULL && -+ len < state->head->extra_max) { - zmemcpy(state->head->extra + len, next, - len + copy > state->head->extra_max ? - state->head->extra_max - len : copy); diff --git a/package/libs/zlib/patches/006-fix-compressor-crash-on-certain-inputs.patch b/package/libs/zlib/patches/006-fix-compressor-crash-on-certain-inputs.patch deleted file mode 100644 index 9f37ba5c58..0000000000 --- a/package/libs/zlib/patches/006-fix-compressor-crash-on-certain-inputs.patch +++ /dev/null @@ -1,343 +0,0 @@ -From 5c44459c3b28a9bd3283aaceab7c615f8020c531 Mon Sep 17 00:00:00 2001 -From: Mark Adler -Date: Tue, 17 Apr 2018 22:09:22 -0700 -Subject: [PATCH] Fix a bug that can crash deflate on some input when using - Z_FIXED. - -This bug was reported by Danilo Ramos of Eideticom, Inc. It has -lain in wait 13 years before being found! The bug was introduced -in zlib 1.2.2.2, with the addition of the Z_FIXED option. That -option forces the use of fixed Huffman codes. For rare inputs with -a large number of distant matches, the pending buffer into which -the compressed data is written can overwrite the distance symbol -table which it overlays. That results in corrupted output due to -invalid distances, and can result in out-of-bound accesses, -crashing the application. - -The fix here combines the distance buffer and literal/length -buffers into a single symbol buffer. Now three bytes of pending -buffer space are opened up for each literal or length/distance -pair consumed, instead of the previous two bytes. This assures -that the pending buffer cannot overwrite the symbol table, since -the maximum fixed code compressed length/distance is 31 bits, and -since there are four bytes of pending space for every three bytes -of symbol space. ---- - deflate.c | 74 ++++++++++++++++++++++++++++++++++++++++--------------- - deflate.h | 25 +++++++++---------- - trees.c | 50 +++++++++++-------------------------- - 3 files changed, 79 insertions(+), 70 deletions(-) - -diff --git a/deflate.c b/deflate.c -index 425babc00..19cba873a 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -255,11 +255,6 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - int wrap = 1; - static const char my_version[] = ZLIB_VERSION; - -- ushf *overlay; -- /* We overlay pending_buf and d_buf+l_buf. This works since the average -- * output size for (length,distance) codes is <= 24 bits. -- */ -- - if (version == Z_NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; -@@ -329,9 +324,47 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - - s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - -- overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); -- s->pending_buf = (uchf *) overlay; -- s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); -+ /* We overlay pending_buf and sym_buf. This works since the average size -+ * for length/distance pairs over any compressed block is assured to be 31 -+ * bits or less. -+ * -+ * Analysis: The longest fixed codes are a length code of 8 bits plus 5 -+ * extra bits, for lengths 131 to 257. The longest fixed distance codes are -+ * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest -+ * possible fixed-codes length/distance pair is then 31 bits total. -+ * -+ * sym_buf starts one-fourth of the way into pending_buf. So there are -+ * three bytes in sym_buf for every four bytes in pending_buf. Each symbol -+ * in sym_buf is three bytes -- two for the distance and one for the -+ * literal/length. As each symbol is consumed, the pointer to the next -+ * sym_buf value to read moves forward three bytes. From that symbol, up to -+ * 31 bits are written to pending_buf. The closest the written pending_buf -+ * bits gets to the next sym_buf symbol to read is just before the last -+ * code is written. At that time, 31*(n-2) bits have been written, just -+ * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at -+ * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 -+ * symbols are written.) The closest the writing gets to what is unread is -+ * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and -+ * can range from 128 to 32768. -+ * -+ * Therefore, at a minimum, there are 142 bits of space between what is -+ * written and what is read in the overlain buffers, so the symbols cannot -+ * be overwritten by the compressed data. That space is actually 139 bits, -+ * due to the three-bit fixed-code block header. -+ * -+ * That covers the case where either Z_FIXED is specified, forcing fixed -+ * codes, or when the use of fixed codes is chosen, because that choice -+ * results in a smaller compressed block than dynamic codes. That latter -+ * condition then assures that the above analysis also covers all dynamic -+ * blocks. A dynamic-code block will only be chosen to be emitted if it has -+ * fewer bits than a fixed-code block would for the same set of symbols. -+ * Therefore its average symbol length is assured to be less than 31. So -+ * the compressed data for a dynamic block also cannot overwrite the -+ * symbols from which it is being constructed. -+ */ -+ -+ s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); -+ s->pending_buf_size = (ulg)s->lit_bufsize * 4; - - if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || - s->pending_buf == Z_NULL) { -@@ -340,8 +373,12 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - deflateEnd (strm); - return Z_MEM_ERROR; - } -- s->d_buf = overlay + s->lit_bufsize/sizeof(ush); -- s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; -+ s->sym_buf = s->pending_buf + s->lit_bufsize; -+ s->sym_end = (s->lit_bufsize - 1) * 3; -+ /* We avoid equality with lit_bufsize*3 because of wraparound at 64K -+ * on 16 bit machines and because stored blocks are restricted to -+ * 64K-1 bytes. -+ */ - - s->level = level; - s->strategy = strategy; -@@ -552,7 +589,7 @@ int ZEXPORT deflatePrime (strm, bits, value) - - if (deflateStateCheck(strm)) return Z_STREAM_ERROR; - s = strm->state; -- if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) -+ if (s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) - return Z_BUF_ERROR; - do { - put = Buf_size - s->bi_valid; -@@ -1113,7 +1150,6 @@ int ZEXPORT deflateCopy (dest, source) - #else - deflate_state *ds; - deflate_state *ss; -- ushf *overlay; - - - if (deflateStateCheck(source) || dest == Z_NULL) { -@@ -1133,8 +1169,7 @@ int ZEXPORT deflateCopy (dest, source) - ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); -- overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); -- ds->pending_buf = (uchf *) overlay; -+ ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); - - if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || - ds->pending_buf == Z_NULL) { -@@ -1148,8 +1183,7 @@ int ZEXPORT deflateCopy (dest, source) - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); - - ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); -- ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); -- ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; -+ ds->sym_buf = ds->pending_buf + ds->lit_bufsize; - - ds->l_desc.dyn_tree = ds->dyn_ltree; - ds->d_desc.dyn_tree = ds->dyn_dtree; -@@ -1925,7 +1959,7 @@ local block_state deflate_fast(s, flush) - FLUSH_BLOCK(s, 1); - return finish_done; - } -- if (s->last_lit) -+ if (s->sym_next) - FLUSH_BLOCK(s, 0); - return block_done; - } -@@ -2056,7 +2090,7 @@ local block_state deflate_slow(s, flush) - FLUSH_BLOCK(s, 1); - return finish_done; - } -- if (s->last_lit) -+ if (s->sym_next) - FLUSH_BLOCK(s, 0); - return block_done; - } -@@ -2131,7 +2165,7 @@ local block_state deflate_rle(s, flush) - FLUSH_BLOCK(s, 1); - return finish_done; - } -- if (s->last_lit) -+ if (s->sym_next) - FLUSH_BLOCK(s, 0); - return block_done; - } -@@ -2170,7 +2204,7 @@ local block_state deflate_huff(s, flush) - FLUSH_BLOCK(s, 1); - return finish_done; - } -- if (s->last_lit) -+ if (s->sym_next) - FLUSH_BLOCK(s, 0); - return block_done; - } -diff --git a/deflate.h b/deflate.h -index 23ecdd312..d4cf1a98b 100644 ---- a/deflate.h -+++ b/deflate.h -@@ -217,7 +217,7 @@ typedef struct internal_state { - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - -- uchf *l_buf; /* buffer for literals or lengths */ -+ uchf *sym_buf; /* buffer for distances and literals/lengths */ - - uInt lit_bufsize; - /* Size of match buffer for literals/lengths. There are 4 reasons for -@@ -239,13 +239,8 @@ typedef struct internal_state { - * - I can't count above 4 - */ - -- uInt last_lit; /* running index in l_buf */ -- -- ushf *d_buf; -- /* Buffer for distances. To simplify the code, d_buf and l_buf have -- * the same number of elements. To use different lengths, an extra flag -- * array would be necessary. -- */ -+ uInt sym_next; /* running index in sym_buf */ -+ uInt sym_end; /* symbol table full when sym_next reaches this */ - - ulg opt_len; /* bit length of current block with optimal trees */ - ulg static_len; /* bit length of current block with static trees */ -@@ -325,20 +320,22 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - - # define _tr_tally_lit(s, c, flush) \ - { uch cc = (c); \ -- s->d_buf[s->last_lit] = 0; \ -- s->l_buf[s->last_lit++] = cc; \ -+ s->sym_buf[s->sym_next++] = 0; \ -+ s->sym_buf[s->sym_next++] = 0; \ -+ s->sym_buf[s->sym_next++] = cc; \ - s->dyn_ltree[cc].Freq++; \ -- flush = (s->last_lit == s->lit_bufsize-1); \ -+ flush = (s->sym_next == s->sym_end); \ - } - # define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (uch)(length); \ - ush dist = (ush)(distance); \ -- s->d_buf[s->last_lit] = dist; \ -- s->l_buf[s->last_lit++] = len; \ -+ s->sym_buf[s->sym_next++] = dist; \ -+ s->sym_buf[s->sym_next++] = dist >> 8; \ -+ s->sym_buf[s->sym_next++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ -- flush = (s->last_lit == s->lit_bufsize-1); \ -+ flush = (s->sym_next == s->sym_end); \ - } - #else - # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -diff --git a/trees.c b/trees.c -index 4f4a65011..decaeb7c3 100644 ---- a/trees.c -+++ b/trees.c -@@ -416,7 +416,7 @@ local void init_block(s) - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; -- s->last_lit = s->matches = 0; -+ s->sym_next = s->matches = 0; - } - - #define SMALLEST 1 -@@ -948,7 +948,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) - - Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, -- s->last_lit)); -+ s->sym_next / 3)); - - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; - -@@ -1017,8 +1017,9 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) - unsigned dist; /* distance of matched string */ - unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ - { -- s->d_buf[s->last_lit] = (ush)dist; -- s->l_buf[s->last_lit++] = (uch)lc; -+ s->sym_buf[s->sym_next++] = dist; -+ s->sym_buf[s->sym_next++] = dist >> 8; -+ s->sym_buf[s->sym_next++] = lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; -@@ -1033,30 +1034,7 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } -- --#ifdef TRUNCATE_BLOCK -- /* Try to guess if it is profitable to stop the current block here */ -- if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { -- /* Compute an upper bound for the compressed length */ -- ulg out_length = (ulg)s->last_lit*8L; -- ulg in_length = (ulg)((long)s->strstart - s->block_start); -- int dcode; -- for (dcode = 0; dcode < D_CODES; dcode++) { -- out_length += (ulg)s->dyn_dtree[dcode].Freq * -- (5L+extra_dbits[dcode]); -- } -- out_length >>= 3; -- Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", -- s->last_lit, in_length, out_length, -- 100L - out_length*100L/in_length)); -- if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; -- } --#endif -- return (s->last_lit == s->lit_bufsize-1); -- /* We avoid equality with lit_bufsize because of wraparound at 64K -- * on 16 bit machines and because stored blocks are restricted to -- * 64K-1 bytes. -- */ -+ return (s->sym_next == s->sym_end); - } - - /* =========================================================================== -@@ -1069,13 +1047,14 @@ local void compress_block(s, ltree, dtree) - { - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ -- unsigned lx = 0; /* running index in l_buf */ -+ unsigned sx = 0; /* running index in sym_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - -- if (s->last_lit != 0) do { -- dist = s->d_buf[lx]; -- lc = s->l_buf[lx++]; -+ if (s->sym_next != 0) do { -+ dist = s->sym_buf[sx++] & 0xff; -+ dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; -+ lc = s->sym_buf[sx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); -@@ -1100,11 +1079,10 @@ local void compress_block(s, ltree, dtree) - } - } /* literal or match pair ? */ - -- /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ -- Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, -- "pendingBuf overflow"); -+ /* Check that the overlay between pending_buf and sym_buf is ok: */ -+ Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - -- } while (lx < s->last_lit); -+ } while (sx < s->sym_next); - - send_code(s, END_BLOCK, ltree); - } diff --git a/package/libs/zlib/patches/007-fix-null-dereference-in-fix-CVE-2022-37434.patch b/package/libs/zlib/patches/007-fix-null-dereference-in-fix-CVE-2022-37434.patch deleted file mode 100644 index c5c95a92b2..0000000000 --- a/package/libs/zlib/patches/007-fix-null-dereference-in-fix-CVE-2022-37434.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 1eb7682f845ac9e9bf9ae35bbfb3bad5dacbd91d Mon Sep 17 00:00:00 2001 -From: Mark Adler -Date: Mon, 8 Aug 2022 10:50:09 -0700 -Subject: [PATCH] Fix extra field processing bug that dereferences NULL - state->head. - -The recent commit to fix a gzip header extra field processing bug -introduced the new bug fixed here. ---- - inflate.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/inflate.c b/inflate.c -index 7a7289749..2a3c4fe98 100644 ---- a/inflate.c -+++ b/inflate.c -@@ -763,10 +763,10 @@ int flush; - copy = state->length; - if (copy > have) copy = have; - if (copy) { -- len = state->head->extra_len - state->length; - if (state->head != Z_NULL && - state->head->extra != Z_NULL && -- len < state->head->extra_max) { -+ (len = state->head->extra_len - state->length) < -+ state->head->extra_max) { - zmemcpy(state->head->extra + len, next, - len + copy > state->head->extra_max ? - state->head->extra_max - len : copy); diff --git a/package/luci/.github/issue_template b/package/luci/.github/issue_template deleted file mode 100644 index 2d2aef2088..0000000000 --- a/package/luci/.github/issue_template +++ /dev/null @@ -1,40 +0,0 @@ -# Issue template: -1. Please make sure that the issue subject starts with `:` -2. Issues related to end of life (EOL) releases are not supported or maintained and will be closed -3. Remove lines from top till here and fill in the following questions -*** - -## Steps to reproduce: -**Example: Replace the following lines and remove this** - -1. go to: Network → Interfaces → LAN (an interface with a static address) → DHCP server tab → IPv6 RA settings tab -2. set RA MTU and RA Hop Limit to arbitrary non-default value -3. Save & Apply -4. go to: IPv6 RA settings tab again - -## Actual behavior: -**Example: Replace the following lines and remove this** - -1. option ra_mtu '1500' is set correctly in /etc/config/dhcp -2. In LuCI though, RA MTU and RA Hop Limit are still displaying the default values in light gray font color. - -## Expected behavior: -**Example: Replace the following lines and remove this** - -``` -RA MTU and RA Hop Limit are displaying the correct values found in /etc/config/dhcp in black font color. -``` - -## Additional Information: -OpenWrt version information from system `/etc/openwrt_release` - -**Example: Replace the following lines and remove this** -``` -DISTRIB_ID='OpenWrt' -DISTRIB_RELEASE='21.02.0-rc4' -DISTRIB_REVISION='r16256-2d5ee43dc6' -DISTRIB_TARGET='x86/64' -DISTRIB_ARCH='x86_64' -DISTRIB_DESCRIPTION='OpenWrt 21.02.0-rc4 r16256-2d5ee43dc6' -DISTRIB_TAINTS='' -``` diff --git a/package/luci/.github/workflows/build.yml b/package/luci/.github/workflows/build.yml deleted file mode 100644 index 5d3aa67a8d..0000000000 --- a/package/luci/.github/workflows/build.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Test Build - -on: - pull_request: - -jobs: - build: - name: Test ${{ matrix.arch }} - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - include: - - arch: x86_64 - target: x86-64 - - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - - name: Determine branch name - run: | - BRANCH="${GITHUB_BASE_REF#refs/heads/}" - echo "Building for $BRANCH" - echo "BRANCH=$BRANCH" >> $GITHUB_ENV - - - name: Determine changed packages - run: | - # only detect packages with changes - PKG_ROOTS=$(find . -name Makefile | \ - grep -v ".*/src/Makefile" | \ - sed -e 's@./\(.*\)/Makefile@\1/@') - CHANGES=$(git diff --diff-filter=d --name-only origin/$BRANCH) - - for ROOT in $PKG_ROOTS; do - for CHANGE in $CHANGES; do - if [[ "$CHANGE" == "$ROOT"* ]]; then - PACKAGES+=$(echo "$ROOT" | sed -e 's@.*/\(.*\)/@\1 @') - break - fi - done - done - - # fallback to test packages if nothing explicitly changes this is - # should run if other mechanics in packages.git changed - PACKAGES="${PACKAGES:-luci-app-attendedsysupgrade}" - - echo "Building $PACKAGES" - echo "PACKAGES=$PACKAGES" >> $GITHUB_ENV - - - name: Build - uses: openwrt/gh-action-sdk@v3 - env: - ARCH: ${{ matrix.arch }}-${{ env.BRANCH }} - FEEDNAME: packages_ci - - - name: Move created packages to project dir - run: cp bin/packages/${{ matrix.arch }}/packages_ci/*.ipk . || true - - - name: Store packages - uses: actions/upload-artifact@v2 - with: - name: ${{ matrix.arch}}-packages - path: "*.ipk" - - - name: Store logs - uses: actions/upload-artifact@v2 - with: - name: ${{ matrix.arch}}-logs - path: logs/ diff --git a/package/luci/.github/workflows/ci_helpers.sh b/package/luci/.github/workflows/ci_helpers.sh deleted file mode 100644 index 60dcd4ee12..0000000000 --- a/package/luci/.github/workflows/ci_helpers.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -color_out() { - printf "\e[0;$1m$PKG_NAME: %s\e[0;0m\n" "$2" -} - -success() { - color_out 32 "$1" -} - -info() { - color_out 36 "$1" -} - -err() { - color_out 31 "$1" -} - -warn() { - color_out 33 "$1" -} - -err_die() { - err "$1" - exit 1 -} diff --git a/package/luci/.github/workflows/formal.yml b/package/luci/.github/workflows/formal.yml deleted file mode 100644 index 25609174e8..0000000000 --- a/package/luci/.github/workflows/formal.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: Test Formalities - -on: - pull_request: - -jobs: - build: - name: Test Formalities - runs-on: ubuntu-latest - strategy: - fail-fast: false - - steps: - - uses: actions/checkout@v2 - with: - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 0 - - - name: Determine branch name - run: | - BRANCH="${GITHUB_BASE_REF#refs/heads/}" - echo "Building for $BRANCH" - echo "BRANCH=$BRANCH" >> $GITHUB_ENV - - - name: Test formalities - run: | - source .github/workflows/ci_helpers.sh - - RET=0 - for commit in $(git rev-list HEAD ^origin/$BRANCH); do - info "=== Checking commit '$commit'" - if git show --format='%P' -s $commit | grep -qF ' '; then - err "Pull request should not include merge commits" - RET=1 - fi - - author="$(git show -s --format=%aN $commit)" - if echo $author | grep -q '\S\+\s\+\S\+'; then - success "Author name ($author) seems ok" - else - err "Author name ($author) need to be your real name 'firstname lastname'" - RET=1 - fi - - subject="$(git show -s --format=%s $commit)" - if echo "$subject" | grep -q -e '^[0-9A-Za-z,+/_-]\+: ' -e '^Revert '; then - success "Commit subject line seems ok ($subject)" - else - err "Commit subject line MUST start with ': ' ($subject)" - RET=1 - fi - - body="$(git show -s --format=%b $commit)" - sob="$(git show -s --format='Signed-off-by: %aN <%aE>' $commit)" - if echo "$body" | grep -qF "$sob"; then - success "Signed-off-by match author" - else - err "Signed-off-by is missing or doesn't match author (should be '$sob')" - RET=1 - fi - done - - exit $RET diff --git a/package/luci/.github/workflows/jsdoc.yml b/package/luci/.github/workflows/jsdoc.yml deleted file mode 100644 index b67956ad18..0000000000 --- a/package/luci/.github/workflows/jsdoc.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: GitHub pages - -on: - push: - branches: - - master - -jobs: - deploy: - if: github.repository == 'openwrt/luci' - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Install - run: npm install - - - name: Build - run: npm run doc - - - name: Archive docs as artifact - uses: actions/upload-artifact@v2 - with: - name: docs - path: ./docs/ - - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./docs/ - enable_jekyll: true diff --git a/package/luci/.gitignore b/package/luci/.gitignore deleted file mode 100644 index 60dd7e18d6..0000000000 --- a/package/luci/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -dist/ -node_modules/ -/host -*.o -*.so -*.swp -*.po~ -*.mo -package-lock.json -modules/luci-base/src/po2lmo -modules/luci-base/src/jsmin -modules/luci-base/src/contrib/lemon -modules/luci-base/src/plural_formula.c -modules/luci-base/src/plural_formula.h -docs/jsapi/* -!docs/jsapi/README.md diff --git a/package/luci/applications/luci-app-adblock-fast/Makefile b/package/luci/applications/luci-app-adblock-fast/Makefile new file mode 100644 index 0000000000..d2759e00e2 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/Makefile @@ -0,0 +1,17 @@ +# Copyright 2023 MOSSDeF, Stan Grishin (stangri@melmac.ca) +# This is free software, licensed under the GNU General Public License v3. + +include $(TOPDIR)/rules.mk + +PKG_LICENSE:=GPL-3.0-or-later +PKG_MAINTAINER:=Stan Grishin +PKG_VERSION:=1.1.1-1 + +LUCI_TITLE:=AdBlock-Fast Web UI +LUCI_DESCRIPTION:=Provides Web UI for adblock-fast service. +LUCI_DEPENDS:=+luci-base +adblock-fast +jsonfilter +LUCI_PKGARCH:=all + +include ../../luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js b/package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js new file mode 100644 index 0000000000..703eb4ff7b --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js @@ -0,0 +1,509 @@ +// Copyright MOSSDeF, 2023 Stan Grishin +// This code wouldn't have been possible without help from: +// - [@vsviridov](https://github.com/vsviridov) + +"require ui"; +"require rpc"; +"require form"; +"require baseclass"; + +var pkg = { + get Name() { + return "adblock-fast"; + }, + get URL() { + return "https://docs.openwrt.melmac.net/" + pkg.Name + "/"; + }, +}; + +var getFileUrlFilesizes = rpc.declare({ + object: "luci." + pkg.Name, + method: "getFileUrlFilesizes", + params: ["name", "url"], +}); + +var getInitList = rpc.declare({ + object: "luci." + pkg.Name, + method: "getInitList", + params: ["name"], +}); + +var getInitStatus = rpc.declare({ + object: "luci." + pkg.Name, + method: "getInitStatus", + params: ["name"], +}); + +var getPlatformSupport = rpc.declare({ + object: "luci." + pkg.Name, + method: "getPlatformSupport", + params: ["name"], +}); + +var _setInitAction = rpc.declare({ + object: "luci." + pkg.Name, + method: "setInitAction", + params: ["name", "action"], + expect: { result: false }, +}); + +var RPC = { + listeners: [], + on: function (event, callback) { + var pair = { event: event, callback: callback }; + this.listeners.push(pair); + return function unsubscribe() { + this.listeners = this.listeners.filter(function (listener) { + return listener !== pair; + }); + }.bind(this); + }, + emit: function (event, data) { + this.listeners.forEach(function (listener) { + if (listener.event === event) { + listener.callback(data); + } + }); + }, + setInitAction: function (name, action) { + _setInitAction(name, action).then( + function (result) { + this.emit("setInitAction", result); + }.bind(this) + ); + }, +}; + +var status = baseclass.extend({ + render: function () { + return Promise.all([L.resolveDefault(getInitStatus(pkg.Name), {})]).then( + function (data) { + var reply = { + status: (data[0] && data[0][pkg.Name]) || { + enabled: false, + status: null, + running: null, + version: null, + errors: [], + warnings: [], + force_dns_active: null, + force_dns_ports: [], + entries: null, + dns: null, + outputFile: null, + outputCache: null, + outputGzip: null, + outputFileExists: null, + outputCacheExists: null, + outputGzipExists: null, + leds: [], + }, + }; + var text = ""; + var outputFile = reply.status.outputFile; + var outputCache = reply.status.outputCache; + var statusTable = { + statusNoInstall: _("%s is not installed or not found").format( + pkg.Name + ), + statusStopped: _("Stopped"), + statusStarting: _("Starting"), + statusProcessing: _("Processing lists"), + statusRestarting: _("Restarting"), + statusForceReloading: _("Force Reloading"), + statusDownloading: _("Downloading lists"), + statusFail: _("Failed to start"), + statusSuccess: _("Active"), + }; + + var header = E("h2", {}, _("AdBlock-Fast - Status")); + var statusTitle = E( + "label", + { class: "cbi-value-title" }, + _("Service Status") + ); + if (reply.status.version) { + text += _("Version %s").format(reply.status.version) + " - "; + switch (reply.status.status) { + case "statusSuccess": + text += statusTable[reply.status.status] + "."; + text += + "
    " + + _("Blocking %s domains (with %s).").format( + reply.status.entries, + reply.status.dns + ); + if (reply.status.outputGzipExists) { + text += "
    " + _("Compressed cache file created."); + } + if (reply.status.force_dns_active) { + text += "
    " + _("Force DNS ports:"); + reply.status.force_dns_ports.forEach((element) => { + text += " " + element; + }); + text += "."; + } + break; + case "statusStopped": + if (reply.status.enabled) { + text += statusTable[reply.status.status] + "."; + } else { + text += + statusTable[reply.status.status] + + " (" + + _("Disabled") + + ")."; + } + if (reply.status.outputCacheExists) { + text += "
    " + _("Cache file found."); + } else if (reply.status.outputGzipExists) { + text += "
    " + _("Compressed cache file found."); + } + break; + case "statusRestarting": + case "statusForceReloading": + case "statusDownloading": + case "statusProcessing": + text += statusTable[reply.status.status] + "..."; + break; + default: + text += statusTable[reply.status.status] + "."; + break; + } + } else { + text = _("Not installed or not found"); + } + var statusText = E("div", {}, text); + var statusField = E("div", { class: "cbi-value-field" }, statusText); + var statusDiv = E("div", { class: "cbi-value" }, [ + statusTitle, + statusField, + ]); + + var warningsDiv = []; + if (reply.status.warnings && reply.status.warnings.length) { + var warningTable = { + warningExternalDnsmasqConfig: _( + "Use of external dnsmasq config file detected, please set '%s' option to '%s'" + ).format("dns", "dnsmasq.conf"), + warningMissingRecommendedPackages: _( + "Some recommended packages are missing" + ), + warningInvalidCompressedCacheDir: _( + "Invalid compressed cache directory '%s'" + ), + warningFreeRamCheckFail: _("Can't detect free RAM"), + }; + var warningsTitle = E( + "label", + { class: "cbi-value-title" }, + _("Service Warnings") + ); + var text = ""; + reply.status.warnings.forEach((element) => { + text += + warningTable[element.id].format(element.extra || " ") + "
    "; + }); + var warningsText = E("div", {}, text); + var warningsField = E( + "div", + { class: "cbi-value-field" }, + warningsText + ); + warningsDiv = E("div", { class: "cbi-value" }, [ + warningsTitle, + warningsField, + ]); + } + + var errorsDiv = []; + if (reply.status.errors && reply.status.errors.length) { + var errorTable = { + errorConfigValidationFail: _( + "Config (%s) validation failure!" + ).format("/etc/config/" + pkg.Name), + errorServiceDisabled: _("%s is currently disabled").format( + pkg.Name + ), + errorNoDnsmasqIpset: _( + "The dnsmasq ipset support is enabled, but dnsmasq is either not installed or installed dnsmasq does not support ipset" + ), + errorNoIpset: _( + "The dnsmasq ipset support is enabled, but ipset is either not installed or installed ipset does not support '%s' type" + ).format("hash:net"), + errorNoDnsmasqNftset: _( + "The dnsmasq nft set support is enabled, but dnsmasq is either not installed or installed dnsmasq does not support nft set" + ), + errorNoNft: _( + "The dnsmasq nft sets support is enabled, but nft is not installed" + ), + errorNoWanGateway: _( + "The %s failed to discover WAN gateway" + ).format(pkg.Name), + errorOutputDirCreate: _("Failed to create directory for %s file"), + errorOutputFileCreate: _("Failed to create '%s' file").format( + outputFile + ), + errorFailDNSReload: _("Failed to restart/reload DNS resolver"), + errorSharedMemory: _("Failed to access shared memory"), + errorSorting: _("Failed to sort data file"), + errorOptimization: _("Failed to optimize data file"), + errorAllowListProcessing: _("Failed to process allow-list"), + errorDataFileFormatting: _("Failed to format data file"), + errorMovingDataFile: _( + "Failed to move temporary data file to '%s'" + ).format(outputFile), + errorCreatingCompressedCache: _( + "Failed to create compressed cache" + ), + errorRemovingTempFiles: _("Failed to remove temporary files"), + errorRestoreCompressedCache: _("Failed to unpack compressed cache"), + errorRestoreCache: _("Failed to move '%s' to '%s'").format( + outputCache, + outputFile + ), + errorOhSnap: _( + "Failed to create block-list or restart DNS resolver" + ), + errorStopping: _("Failed to stop %s").format(pkg.Name), + errorDNSReload: _("Failed to reload/restart DNS resolver"), + errorDownloadingConfigUpdate: _( + "Failed to download Config Update file" + ), + errorDownloadingList: _("Failed to download %s"), + errorParsingConfigUpdate: _("Failed to parse Config Update file"), + errorParsingList: _("Failed to parse %s"), + errorNoSSLSupport: _("No HTTPS/SSL support on device"), + errorCreatingDirectory: _( + "Failed to create output/cache/gzip file directory" + ), + errorDetectingFileType: _("Failed to detect format %s"), + errorNothingToDo: _( + "No blocked list URLs nor blocked-domains enabled" + ), + errorTooLittleRam: _( + "Free ram (%s) is not enough to process all enabled block-lists" + ), + }; + var errorsTitle = E( + "label", + { class: "cbi-value-title" }, + _("Service Errors") + ); + var text = ""; + reply.status.errors.forEach((element) => { + text += + errorTable[element.id].format(element.extra || " ") + "!
    "; + }); + text += _("Errors encountered, please check the %sREADME%s").format( + '
    ', + "!
    " + ); + var errorsText = E("div", {}, text); + var errorsField = E("div", { class: "cbi-value-field" }, errorsText); + errorsDiv = E("div", { class: "cbi-value" }, [ + errorsTitle, + errorsField, + ]); + } + + var btn_gap = E("span", {}, "  "); + var btn_gap_long = E( + "span", + {}, + "        " + ); + + var btn_start = E( + "button", + { + class: "btn cbi-button cbi-button-apply", + disabled: true, + click: function (ev) { + ui.showModal(null, [ + E( + "p", + { class: "spinning" }, + _("Starting %s service").format(pkg.Name) + ), + ]); + return RPC.setInitAction(pkg.Name, "start"); + }, + }, + _("Start") + ); + + var btn_action_dl = E( + "button", + { + class: "btn cbi-button cbi-button-apply", + disabled: true, + click: function (ev) { + ui.showModal(null, [ + E( + "p", + { class: "spinning" }, + _("Force redownloading %s block lists").format(pkg.Name) + ), + ]); + return RPC.setInitAction(pkg.Name, "dl"); + }, + }, + _("Redownload") + ); + + var btn_action_pause = E( + "button", + { + class: "btn cbi-button cbi-button-apply", + disabled: true, + click: function (ev) { + ui.showModal(null, [ + E("p", { class: "spinning" }, _("Pausing %s").format(pkg.Name)), + ]); + return RPC.setInitAction(pkg.Name, "pause"); + }, + }, + _("Pause") + ); + + var btn_stop = E( + "button", + { + class: "btn cbi-button cbi-button-reset", + disabled: true, + click: function (ev) { + ui.showModal(null, [ + E( + "p", + { class: "spinning" }, + _("Stopping %s service").format(pkg.Name) + ), + ]); + return RPC.setInitAction(pkg.Name, "stop"); + }, + }, + _("Stop") + ); + + var btn_enable = E( + "button", + { + class: "btn cbi-button cbi-button-apply", + disabled: true, + click: function (ev) { + ui.showModal(null, [ + E( + "p", + { class: "spinning" }, + _("Enabling %s service").format(pkg.Name) + ), + ]); + return RPC.setInitAction(pkg.Name, "enable"); + }, + }, + _("Enable") + ); + + var btn_disable = E( + "button", + { + class: "btn cbi-button cbi-button-reset", + disabled: true, + click: function (ev) { + ui.showModal(null, [ + E( + "p", + { class: "spinning" }, + _("Disabling %s service").format(pkg.Name) + ), + ]); + return RPC.setInitAction(pkg.Name, "disable"); + }, + }, + _("Disable") + ); + + if (reply.status.enabled) { + btn_enable.disabled = true; + btn_disable.disabled = false; + switch (reply.status.status) { + case "statusSuccess": + btn_start.disabled = true; + btn_action_dl.disabled = false; + btn_action_pause.disabled = false; + btn_stop.disabled = false; + break; + case "statusStopped": + btn_start.disabled = false; + btn_action_dl.disabled = true; + btn_action_pause.disabled = true; + btn_stop.disabled = true; + break; + default: + btn_start.disabled = false; + btn_action_dl.disabled = true; + btn_action_pause.disabled = true; + btn_stop.disabled = false; + btn_enable.disabled = true; + btn_disable.disabled = true; + break; + } + } else { + btn_start.disabled = true; + btn_action_dl.disabled = true; + btn_action_pause.disabled = true; + btn_stop.disabled = true; + btn_enable.disabled = false; + btn_disable.disabled = true; + } + + var buttonsDiv = []; + var buttonsTitle = E( + "label", + { class: "cbi-value-title" }, + _("Service Control") + ); + var buttonsText = E("div", {}, [ + btn_start, + btn_gap, + // btn_action_pause, + // btn_gap, + btn_action_dl, + btn_gap, + btn_stop, + btn_gap_long, + btn_enable, + btn_gap, + btn_disable, + ]); + var buttonsField = E("div", { class: "cbi-value-field" }, buttonsText); + if (reply.status.version) { + buttonsDiv = E("div", { class: "cbi-value" }, [ + buttonsTitle, + buttonsField, + ]); + } + + return E("div", {}, [ + header, + statusDiv, + warningsDiv, + errorsDiv, + buttonsDiv, + ]); + } + ); + }, +}); + +RPC.on("setInitAction", function (reply) { + ui.hideModal(); + location.reload(); +}); + +return L.Class.extend({ + status: status, + getFileUrlFilesizes: getFileUrlFilesizes, + getPlatformSupport: getPlatformSupport, +}); diff --git a/package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js b/package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js new file mode 100644 index 0000000000..7b0d93ab9f --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js @@ -0,0 +1,528 @@ +// Copyright 2023 MOSSDeF, Stan Grishin +// This code wouldn't have been possible without help from: +// - [@stokito](https://github.com/stokito) +// - [@vsviridov](https://github.com/vsviridov) + +"use strict"; +"require form"; +"require view"; +"require adblock-fast.status as adb"; + +var pkg = { + get Name() { + return "adblock-fast"; + }, + get URL() { + return "https://docs.openwrt.melmac.net/" + pkg.Name + "/"; + }, + humanFileSize: function (bytes, si = false, dp = 2) { + return `%${si ? 1000 : 1024}.${dp ?? 0}mB`.format(bytes); + }, + isObjEmpty: function (obj) { + return Object.keys(obj).length === 0; + }, +}; + +return view.extend({ + load: function () { + return Promise.all([ + L.resolveDefault(adb.getFileUrlFilesizes(pkg.Name), {}), + L.resolveDefault(adb.getPlatformSupport(pkg.Name), {}), + L.resolveDefault(L.uci.load(pkg.Name), {}), + L.resolveDefault(L.uci.load("dhcp"), {}), + L.resolveDefault(L.uci.load("smartdns"), {}), + ]); + }, + + render: function (data) { + var reply = { + sizes: (data[0] && data[0][pkg.Name] && data[0][pkg.Name]["sizes"]) || [], + platform: (data[1] && data[1][pkg.Name]) || { + ipset_installed: false, + nft_installed: false, + dnsmasq_installed: false, + dnsmasq_ipset_support: false, + dnsmasq_nftset_support: false, + smartdns_installed: false, + smartdns_ipset_support: false, + smartdns_nftset_support: false, + unbound_installed: false, + leds: [], + }, + pkg: (!pkg.isObjEmpty(data[2]) && data[2]) || null, + dhcp: (!pkg.isObjEmpty(data[3]) && data[3]) || null, + smartdns: (!pkg.isObjEmpty(data[4]) && data[4]) || null, + }; + var status, m, s1, s2, s3, o; + + status = new adb.status(); + m = new form.Map(pkg.Name, _("AdBlock-Fast - Configuration")); + s1 = m.section(form.NamedSection, "config", pkg.Name); + s1.tab("tab_basic", _("Basic Configuration")); + s1.tab("tab_advanced", _("Advanced Configuration")); + + var text = _( + "DNS resolution option, see the %sREADME%s for details." + ).format( + '', + "" + ); + if (!reply.platform.dnsmasq_installed) { + text += + "
    " + + _("Please note that %s is not supported on this system.").format( + "dnsmasq.addnhosts" + ); + text += + "
    " + + _("Please note that %s is not supported on this system.").format( + "dnsmasq.conf" + ); + text += + "
    " + + _("Please note that %s is not supported on this system.").format( + "dnsmasq.ipset" + ); + text += + "
    " + + _("Please note that %s is not supported on this system.").format( + "dnsmasq.servers" + ); + } else { + if (!reply.platform.dnsmasq_ipset_support) { + text += + "
    " + + _("Please note that %s is not supported on this system.").format( + "dnsmasq.ipset" + ); + } + if (!reply.platform.dnsmasq_nftset_support) { + text += + "
    " + + _("Please note that %s is not supported on this system.").format( + "dnsmasq.nftset" + ); + } + } + if (!reply.platform.smartdns_installed) { + text = + text + + "
    " + + _("Please note that %s is not supported on this system.").format( + "smartdns.domainset" + ); + } else { + if (!reply.platform.smartdns_ipset_support) { + text += + "
    " + + _("Please note that %s is not supported on this system.").format( + "smartdns.ipset" + ); + } + if (!reply.platform.smartdns_nftset_support) { + text += + "
    " + + _("Please note that %s is not supported on this system.").format( + "smartdns.nftset" + ); + } + } + if (!reply.platform.unbound_installed) { + text = + text + + "
    " + + _("Please note that %s is not supported on this system.").format( + "unbound.adb_list" + ); + } + + o = s1.taboption( + "tab_basic", + form.ListValue, + "dns", + _("DNS Service"), + text + ); + if (reply.platform.dnsmasq_installed) { + o.value("dnsmasq.addnhosts", _("dnsmasq additional hosts")); + o.value("dnsmasq.conf", _("dnsmasq config")); + if (reply.platform.dnsmasq_ipset_support) { + o.value("dnsmasq.ipset", _("dnsmasq ipset")); + } + if (reply.platform.dnsmasq_nftset_support) { + o.value("dnsmasq.nftset", _("dnsmasq nft set")); + } + o.value("dnsmasq.servers", _("dnsmasq servers file")); + } + if (reply.platform.smartdns_installed) { + o.value("smartdns.domainset", _("smartdns domain set")); + if (reply.platform.smartdns_ipset_support) { + o.value("smartdns.ipset", _("smartdns ipset")); + } + if (reply.platform.smartdns_nftset_support) { + o.value("smartdns.nftset", _("smartdns nft set")); + } + } + if (reply.platform.unbound_installed) { + o.value("unbound.adb_list", _("unbound adblock list")); + } + o.default = "dnsmasq.servers"; + + o = s1.taboption( + "tab_basic", + form.Value, + "dnsmasq_config_file_url", + _("Dnsmasq Config File URL"), + _( + "URL to the external dnsmasq config file, see the %sREADME%s for details." + ).format( + '', + "" + ) + ); + o.depends("dns", "dnsmasq.conf"); + + if (reply.platform.dnsmasq_installed && reply.dhcp) { + o = s1.taboption( + "tab_basic", + form.ListValue, + "dnsmasq_instance_option", + _("Use AdBlocking on the dnsmasq instance(s)"), + _( + "You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore information%s)." + ).format( + '', + "" + ) + ); + o.value("*", _("AdBlock on all instances")); + o.value("+", _("AdBlock on select instances")); + o.value("-", _("No AdBlock on dnsmasq")); + o.default = "*"; + o.depends("dns", "dnsmasq.addnhosts"); + o.depends("dns", "dnsmasq.servers"); + o.retain = true; + o.cfgvalue = function (section_id) { + let val = this.map.data.get( + this.map.config, + section_id, + "dnsmasq_instance" + ); + switch (val) { + case "*": + case "-": + return val; + default: + return "+"; + } + }; + o.write = function (section_id, formvalue) { + L.uci.set(pkg.Name, section_id, "dnsmasq_instance", formvalue); + }; + + o = s1.taboption( + "tab_basic", + form.MultiValue, + "dnsmasq_instance", + _("Pick the dnsmasq instance(s) for AdBlocking") + ); + Object.values(L.uci.sections("dhcp", "dnsmasq")).forEach(function ( + element + ) { + var description; + var key; + if (element[".name"] === L.uci.resolveSID("dhcp", element[".name"])) { + key = element[".index"]; + description = "dnsmasq[" + element[".index"] + "]"; + } else { + key = element[".name"]; + description = element[".name"]; + } + o.value(key, _("%s").format(description)); + }); + o.depends("dnsmasq_instance_option", "+"); + o.retain = true; + } + + if (reply.platform.smartdns_installed && reply.smartdns) { + o = s1.taboption( + "tab_basic", + form.ListValue, + "smartdns_instance_option", + _("Use AdBlocking on the SmartDNS instance(s)"), + _( + "You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore information%s)." + ).format( + '', + "" + ) + ); + o.value("*", _("AdBlock on all instances")); + o.value("+", _("AdBlock on select instances")); + o.value("-", _("No AdBlock on SmartDNS")); + o.default = "*"; + o.depends("dns", "smartdns.domainset"); + o.retain = true; + o.cfgvalue = function (section_id) { + let val = this.map.data.get( + this.map.config, + section_id, + "smartdns_instance" + ); + switch (val) { + case "*": + case "-": + return val; + default: + return "+"; + } + }; + o.write = function (section_id, formvalue) { + L.uci.set(pkg.Name, section_id, "smartdns_instance", formvalue); + }; + + o = s1.taboption( + "tab_basic", + form.MultiValue, + "smartdns_instance", + _("Pick the SmartDNS instance(s) for AdBlocking") + ); + Object.values(L.uci.sections("smartdns", "smartdns")).forEach(function ( + element + ) { + var description; + var key; + if ( + element[".name"] === L.uci.resolveSID("smartdns", element[".name"]) + ) { + key = element[".index"]; + description = "smartdns[" + element[".index"] + "]"; + } else { + key = element[".name"]; + description = element[".name"]; + } + o.value(key, _("%s").format(description)); + }); + o.depends("smartdns_instance_option", "+"); + o.retain = true; + } + o = s1.taboption( + "tab_basic", + form.ListValue, + "force_dns", + _("Force Router DNS"), + _("Forces Router DNS use on local devices, also known as DNS Hijacking.") + ); + o.value("0", _("Let local devices use their own DNS servers if set")); + o.value("1", _("Force Router DNS server to all local devices")); + o.default = "1"; + + o = s1.taboption( + "tab_basic", + form.ListValue, + "verbosity", + _("Output Verbosity Setting"), + _("Controls system log and console output verbosity.") + ); + o.value("0", _("Suppress output")); + o.value("1", _("Some output")); + o.value("2", _("Verbose output")); + o.default = "2"; + + if (reply.platform.leds.length) { + o = s1.taboption( + "tab_basic", + form.ListValue, + "led", + _("LED to indicate status"), + _( + "Pick the LED not already used in %sSystem LED Configuration%s." + ).format('', "") + ); + o.value("", _("none")); + reply.platform.leds.forEach((element) => { + o.value(element); + }); + } + + o = s1.taboption( + "tab_advanced", + form.ListValue, + "config_update_enabled", + _("Automatic Config Update"), + _("Perform config update before downloading the block/allow-lists.") + ); + o.value("0", _("Disable")); + o.value("1", _("Enable")); + o.default = "0"; + + o = s1.taboption( + "tab_advanced", + form.ListValue, + "ipv6_enabled", + _("IPv6 Support"), + _("Add IPv6 entries to block-list.") + ); + o.value("", _("Do not add IPv6 entries")); + o.value("1", _("Add IPv6 entries")); + o.depends("dns", "dnsmasq.addnhosts"); + o.depends("dns", "dnsmasq.nftset"); + o.default = ""; + o.rmempty = true; + o.retain = true; + + o = s1.taboption( + "tab_advanced", + form.Value, + "download_timeout", + _("Download time-out (in seconds)"), + _("Stop the download if it is stalled for set number of seconds.") + ); + o.default = "20"; + o.datatype = "range(1,60)"; + + o = s1.taboption( + "tab_advanced", + form.Value, + "curl_max_file_size", + _("Curl maximum file size (in bytes)"), + _( + "If curl is installed and detected, it would not download files bigger than this." + ) + ); + o.default = ""; + o.datatype = "uinteger"; + o.rmempty = true; + + o = s1.taboption( + "tab_advanced", + form.Value, + "curl_retry", + _("Curl download retry"), + _( + "If curl is installed and detected, it would retry download this many times on timeout/fail." + ) + ); + o.default = "3"; + o.datatype = "range(0,30)"; + + o = s1.taboption( + "tab_advanced", + form.ListValue, + "parallel_downloads", + _("Simultaneous processing"), + _( + "Launch all lists downloads and processing simultaneously, reducing service start time." + ) + ); + o.value("0", _("Do not use simultaneous processing")); + o.value("1", _("Use simultaneous processing")); + o.default = "1"; + + o = s1.taboption( + "tab_advanced", + form.ListValue, + "compressed_cache", + _("Store compressed cache file on router"), + _( + "Attempt to create a compressed cache of block-list in the persistent memory." + ) + ); + o.value("0", _("Do not store compressed cache")); + o.value("1", _("Store compressed cache")); + o.default = "0"; + + o = s1.taboption( + "tab_advanced", + form.Value, + "compressed_cache_dir", + _("Directory for compressed cache file"), + _( + "Directory for compressed cache file of block-list in the persistent memory." + ) + ); + o.datatype = "string"; + o.rmempty = true; + o.default = "/etc"; + o.depends("compressed_cache", "1"); + o.retain = true; + + o = s1.taboption( + "tab_advanced", + form.ListValue, + "debug", + _("Enable Debugging"), + _("Enables debug output to /tmp/adblock-fast.log.") + ); + o.value("0", _("Disable Debugging")); + o.value("1", _("Enable Debugging")); + o.default = "0"; + + s2 = m.section( + form.NamedSection, + "config", + "adblock-fast", + _("AdBlock-Fast - Allowed and Blocked Domains") + ); + o.addremove = true; + o.rmempty = true; + + o = s2.option( + form.DynamicList, + "allowed_domain", + _("Allowed Domains"), + _("Individual domains to be allowed.") + ); + o.addremove = true; + + o = s2.option( + form.DynamicList, + "blocked_domain", + _("Blocked Domains"), + _("Individual domains to be blocked.") + ); + o.addremove = true; + + s3 = m.section( + form.GridSection, + "file_url", + _("AdBlock-Fast - Allowed and Blocked Lists URLs"), + _("URLs to file(s) containing lists to be allowed or blocked.") + ); + s3.rowcolors = true; + s3.sortable = true; + s3.anonymous = true; + s3.addremove = true; + + o = s3.option(form.DummyValue, "_size", _("Size")); + o.modalonly = false; + o.cfgvalue = function (section_id) { + let url = L.uci.get(pkg.Name, section_id, "url"); + let ret = _("Unknown"); + reply.sizes.forEach((element) => { + if (element.url === url) { + ret = element.size === 0 ? ret : pkg.humanFileSize(element.size); + } + }); + return _("Size: %s").format(ret); + }; + + o = s3.option(form.Flag, "enabled", _("Enable")); + o.editable = true; + o.default = "1"; + + o = s3.option(form.ListValue, "action", _("Action")); + o.value("allow", _("Allow")); + o.value("block", _("Block")); + o.default = "block"; + o.textvalue = function (section_id) { + var val = this.cfgvalue(section_id); + return val == "allow" ? _("Allow") : _("Block"); + }; + + o = s3.option(form.Value, "url", _("URL")); + o.optional = false; + + return Promise.all([status.render(), m.render()]); + }, +}); diff --git a/package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js b/package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js new file mode 100644 index 0000000000..5dd3d9079c --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js @@ -0,0 +1,108 @@ +"require ui"; +"require rpc"; +"require form"; +"require baseclass"; + +var pkg = { + get Name() { + return "adblock-fast"; + }, + get URL() { + return "https://docs.openwrt.melmac.net/" + pkg.Name + "/"; + }, +}; + +var getInitStatus = rpc.declare({ + object: "luci." + pkg.Name, + method: "getInitStatus", + params: ["name"], +}); + +return baseclass.extend({ + title: _("AdBlock-Fast"), + + load: function () { + return Promise.all([getInitStatus(pkg.Name)]); + }, + + render: function (data) { + var reply = { + status: (data[0] && data[0][pkg.Name]) || { + enabled: false, + status: null, + running: null, + version: null, + errors: [], + warnings: [], + force_dns_active: null, + force_dns_ports: [], + entries: null, + dns: null, + outputFile: null, + outputCache: null, + outputGzip: null, + outputFileExists: null, + outputCacheExists: null, + outputGzipExists: null, + leds: [], + }, + }; + var statusTable = { + statusNoInstall: _("%s is not installed or not found").format(pkg.Name), + statusStopped: _("Stopped"), + statusStarting: _("Starting"), + statusProcessing: _("Processing lists"), + statusRestarting: _("Restarting"), + statusForceReloading: _("Force Reloading"), + statusDownloading: _("Downloading lists"), + statusError: _("Error"), + statusWarning: _("Warning"), + statusFail: _("Fail"), + statusSuccess: _("Active"), + }; + + var cacheText; + if (reply.status.outputCacheExists) { + cacheText = _("Cache file"); + } else if (reply.status.outputGzipExists) { + cacheText = _("Compressed cache"); + } + var forceDnsText = ""; + if (reply.status.force_dns_active) { + reply.status.force_dns_ports.forEach((element) => { + forceDnsText += element + " "; + }); + } else { + forceDnsText = "-"; + } + + var table = E( + "table", + { class: "table", id: "adblock-fast_status_table" }, + [ + E("tr", { class: "tr table-titles" }, [ + E("th", { class: "th" }, _("Status")), + E("th", { class: "th" }, _("Version")), + E("th", { class: "th" }, _("DNS Service")), + E("th", { class: "th" }, _("Blocked Domains")), + E("th", { class: "th" }, _("Cache")), + E("th", { class: "th" }, _("Force DNS Ports")), + ]), + E("tr", { class: "tr" }, [ + E( + "td", + { class: "td" }, + statusTable[reply.status.status] || _("Unknown") + ), + E("td", { class: "td" }, reply.status.version || _("-")), + E("td", { class: "td" }, reply.status.dns || _("-")), + E("td", { class: "td" }, reply.status.entries || _("-")), + E("td", { class: "td" }, cacheText || _("-")), + E("td", { class: "td" }, forceDnsText || _("-")), + ]), + ] + ); + + return table; + }, +}); diff --git a/package/luci/applications/luci-app-adblock-fast/po/ar/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/ar/adblock-fast.po new file mode 100644 index 0000000000..9688dae9e7 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/ar/adblock-fast.po @@ -0,0 +1,717 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-03-08 13:04+0000\n" +"Last-Translator: Said Zakaria \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Weblate 4.5.1\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "نطاقات محظورة" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "تعطيل" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "شغل" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "خطأ" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "بداية" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "قف" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "توقفت" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "تحذير" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "لا شيء" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/bg/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/bg/adblock-fast.po new file mode 100644 index 0000000000..1cd12af33b --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/bg/adblock-fast.po @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-09-22 00:01+0000\n" +"Last-Translator: Iskren Mihaylov \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Забрани" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Разрешаване" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Грешка" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/bn_BD/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/bn_BD/adblock-fast.po new file mode 100644 index 0000000000..871aa326b1 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/bn_BD/adblock-fast.po @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-10-08 17:53+0000\n" +"Last-Translator: Rayhan Nabi \n" +"Language-Team: Bengali (Bangladesh) \n" +"Language: bn_BD\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "সক্রিয় করুন" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "ভুল" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "শুরু করুন" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "সতর্কতা" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/ca/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/ca/adblock-fast.po new file mode 100644 index 0000000000..fd03f728de --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/ca/adblock-fast.po @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-03-08 13:04+0000\n" +"Last-Translator: BenRoura \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.5.1\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Dominis blocats" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/cs/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/cs/adblock-fast.po new file mode 100644 index 0000000000..0c48b959d8 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/cs/adblock-fast.po @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-09-27 23:28+0000\n" +"Last-Translator: David Rapaň \n" +"Language-Team: Czech \n" +"Language: cs\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s není nainstalován nebo nenalezen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Přidat IPv6 záznamy" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Přidat IPv6 záznamy do seznamu blokovaných položek." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Pokročilá konfigurace" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Základní konfigurace" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Blokované domény" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "Ovládá systémový protokol a podrobnosti výstupu konzoly." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Počet pokusů opakování stahování pomocí cURL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "Služba DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Zakázat" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Zakázáno" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Vypínání služby %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Povolit" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Aktivuji službu %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Chyba" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "Podpora IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Není instalováno nebo nenalezeno" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Řízení služby" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Chyby služby" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Stav služby" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Varování služby" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Start" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Start služby %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Zastavit" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Zastavuje se služba %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Podrobný výstup" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Varování" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "žádný" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/da/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/da/adblock-fast.po new file mode 100644 index 0000000000..c53d9217b0 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/da/adblock-fast.po @@ -0,0 +1,742 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-11-09 02:04+0000\n" +"Last-Translator: drax red \n" +"Language-Team: Danish \n" +"Language: da\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.2-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s er i øjeblikket deaktiveret" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s er ikke installeret eller ikke fundet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "- - - - -" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Handling" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Aktiv" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "AdBlock Fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "AdBlock på alle forekomster" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "AdBlock Fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "AdBlock-Fast - tilladt og Blocked Domains" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "AdBlock-Fast - tilladt og blokerede lister URLs" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "AdBlock-Fast - Configuration" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "AdBlock-Fast - Status" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Tilføj IPv6-poster" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Tilføj IPv6-poster til bloklisten." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Avanceret konfiguration" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "Tillad" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Tilladte domæner" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" +"Forsøg på at oprette en komprimeret cache af bloklisten i den vedvarende " +"hukommelse." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Automatisk konfigurationsopdatering" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Grundlæggende konfiguration" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Bloker" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Blokerede domæner" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Blokerer %s domæner (med %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "Cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "Cache-fil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Cache-fil fundet." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "Komprimeret cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Komprimeret cache-fil oprettet." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Komprimeret cache-fil fundet." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Konfig (%s) valideringsfejl!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "Styrer systemlog og konsoloutput verbositet." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Curl download prøv igen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Curl maksimal filstørrelse (i bytes)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "DNS-tjeneste" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "DNS-opløsningsindstilling, se %sREADME%s for yderligere oplysninger." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Mappe til komprimeret cache-fil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"Mappe til komprimeret cache-fil af blokliste i den vedvarende hukommelse." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Deaktiver" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Deaktiver fejlfinding" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Deaktiveret" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Deaktiverer %s tjenesten" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "URL til Dnsmasq-konfigurationsfilen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Tilføj ikke IPv6-poster" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Gem ikke komprimeret cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Brug ikke samtidig behandling" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Download timeout (i sekunder)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Downloader lister" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Aktiver" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Aktiver fejlfinding" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "Aktivere debug output til /tmp /adblock-fast.log." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Aktiverer %s tjeneste" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Fejl" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "Fejl, der opstår, skal du kontrollere %sREADME%s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Fejl" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "Detaljeret at få adgang til delt hukommelse" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "fejlede ved oprettelsen af '%s' fil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "Detaljeret for at oprette blokeringsliste eller genstarte DNS-starter" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "Detaljeret at oprette komprimeret cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "Detaljeret for at oprette mappe for %s fil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "Detaljeret for at oprette output/cache/gzip fil mappe" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "Detaljeret at opdage format %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "Detaljeret at downloade %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "Det lykkedes ikke at downloade filen Config Update" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "formatering af datafil mislykkedes" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "kunne ikke flytte '%s' til '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "Detaljeret at flytte midlertidige datafil til \"%s ''" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "Detaljeret for at optimere datafil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "undlod at parse" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "Detaljeret til parse Config Update-fil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "Detaljeret til proces tillader-list" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "Detaljeret om genindlæs/start DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "Detaljeret for at fjerne midlertidige filer" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "Detaljeret at genstarte/reload DNS-aftrækker" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "Detaljeret til at sortere datafil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "Detaljeret at stoppe %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "Detaljeret til udpakning af komprimeret cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "Force DNS Ports" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "Tving DNS porte:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Tving genindlæsning" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Tving router DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Tving router DNS-server til alle lokale enheder" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "Tving gendownload af %s blokeringslister" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Tvinger routerens DNS-brug på lokale enheder, også kendt som DNS-kapring." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "Grant UCI og filadgang til luci-app-adblock-fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "IPv6-understøttelse" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"Hvis curl er installeret og registreret, vil den ikke hente filer, der er " +"større end dette." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Hvis curl er installeret og registreret, vil den prøve at downloade så mange " +"gange ved timeout/fejl." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Individuelle domæner skal tillades." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Individuelle domæner skal blokeres." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED for at angive status" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Start alle lister, der downloades og behandles samtidigt, hvilket reducerer " +"tjenestens starttid." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "Lad lokale enheder bruge deres egne DNS-servere, hvis de er indstillet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "Ingen AdBlock på dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "Ingen HTTPS/SSL support på enheden" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "Ingen blokeret liste webadresser eller blokerede domæner aktiveret" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Ikke installeret eller ikke fundet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Indstilling af output verbositet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "Sæt pause" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "Pausing %" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Udfør en opdatering af konfigurationen, før downloading af blok-/" +"tilladelseslisterne." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" +"Vælg den LED, der ikke allerede er brugt i %sSystem LED Configuration%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Bemærk venligst, at %s ikke understøttes på dette system." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Behandling af lister" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "Gendownload" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Genstarter" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Kontrol af tjenesten" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Fejl i tjenesten" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Tjenestestatus" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Tjeneste Advarsler" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Samtidig behandling" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "Størrelse" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "Størrelse: %" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Noget output" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "Nogle anbefalede pakker mangler" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Start" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Starter" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Starter %s tjeneste" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "Status" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Stop" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" +"Stopper overførslen, hvis den er gået i stå i det indstillede antal sekunder." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Stoppet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Stopper tjenesten %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Gem komprimeret cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Gem komprimeret cache-fil på routeren" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Undertrykk output" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "% fejlede at opdage WAN gateway" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" +"Dnsmasq ipset understøttelse er aktiveret, men dnsmasq er enten ikke " +"installeret eller installeret dnsmasq understøtter ikke ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" +"Dnsmasq ipset understøttelse er aktiveret, men ipset er enten ikke " +"installeret eller installeret ipset understøtter ikke '%s' type" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" +"Dnsmasq nft sæt understøttelse er aktiveret, men dnsmasq er enten ikke " +"installeret eller installeret dnsmasq understøtter ikke nft sæt" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" +"Dnsmasq nft sæt understøttelse er aktiveret, men nft er ikke installeret" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "URL-ADRESSE" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"URL til den eksterne dnsmasq-konfigurationsfil, se %sREADME%s for detaljer." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" +"URL'er til fil(er), der indeholder lister, der skal være tilladt eller " +"blokeret." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "Ukendt" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "Brug AdBlocking på dnsmasq-instansen (s)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" +"Brug af ekstern dnsmasq config-fil, der er registreret, skal du angive " +"\"%s\" mulighed for at \"%s\"" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Brug samtidig behandling" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Verbose output" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "Version" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Version: %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Advarsel" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "dnsmasq yderligere værter" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "dnsmasq konfig" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "dnsmasq ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "dnsmasq nft sæt" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "dnsmasq-servere-fil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "ingen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "Unbound AdBlock Liste" diff --git a/package/luci/applications/luci-app-adblock-fast/po/de/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/de/adblock-fast.po new file mode 100644 index 0000000000..c915467468 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/de/adblock-fast.po @@ -0,0 +1,755 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-12-15 04:45+0000\n" +"Last-Translator: ssantos \n" +"Language-Team: German \n" +"Language: de\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.3\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s ist derzeit deaktiviert" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s ist nicht installiert oder konnte nicht gefunden werden" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "-" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Aktion" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Aktiv" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "AdBlock Fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "AdBlock auf allen Instanzen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "AdBlock-Fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "AdBlock-Fast – Erlaubte und blockierte Domains" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "AdBlock-Fast – Erlaubte und blockierte URL-Listen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "AdBlock-Fast – Konfiguration" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "AdBlock-Fast – Status" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "IPv6-Einträge hinzufügen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Füge IPv6-Einträge zur Blockliste hinzu." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Erweiterte Konfiguration" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "erlauben" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Erlaubte Domains" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" +"Versuche einen komprimierten Cache der Blockliste im persistenten Speicher " +"zu erstellen." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Automatisches Update der Konfiguration" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Grundlegende Konfiguration" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "blockieren" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Gesperrte Domains" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Blockieren von %s Domänen (mit %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "Cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "Cache-Datei" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Cache-Datei gefunden." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "Kann kein freies RAM erkennen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "Komprimierter Cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Komprimierte Cache-Datei erstellt." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Komprimierte Cache-Datei gefunden." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Validierungsfehler der Konfiguration (%s)!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" +"Steuert die Ausführlichkeit des Systemprotokolls und der Konsolenausgabe." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Curl-Download-Wiederholung" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Maximale Dateigröße für Curl (in Bytes)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "DNS-Dienst" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "DNS-Auflösungsoption, siehe %sREADME%s für Details." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Verzeichnis für die komprimierte Cache-Datei" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"Verzeichnis für die komprimierte Cachedatei der Blockliste im persistenten " +"Speicher." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Deaktivieren" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Debugging deaktivieren" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "deaktiviert" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Deaktiviere Dienst %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "URL der Dnsmasq-Konfigurationsdatei" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Keine IPv6-Einträge hinzufügen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Keinen komprimierten Cache speichern" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Verwende keine Simultanverarbeitung" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Download-Timeout (in Sekunden)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Herunterladen von Listen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "aktivieren" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Debugging aktivieren" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "Aktiviere Debug-Ausgabe an /tmp/adblock-fast.log." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Aktiviere Dienst %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Fehler" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "Es sind Fehler aufgetreten, bitte das %sREADME%s überprüfen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Fehlschlag" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "Zugriff auf den gemeinsamen Speicher fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "Die Datei „%s“ konnte nicht erstellt werden" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" +"Die Blockierungsliste konnte nicht erstellt werden oder der DNS-Resolver " +"konnte nicht neu gestartet werden" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "Anlegen des komprimierten Caches fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "Anlegen des Verzeichnisses für die Datei %s fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" +"Anlegen des output/cache/-Verzeichnisses für die gzip-Datei fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "Format %s nicht erkennbar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "Download von %s fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "Der Download der Konfigurations-Update-Datei ist fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "Das Formatieren der Datendatei ist fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "Das Bewegen von „%s“ nach „%s“ ist fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "Das Bewegen der temporären Datei nach „%s“ ist fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "Die Optimierung der Datendatei ist fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "Die Konfigurations-Update-Datei konnte nicht geparst werden" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "Die Allow-Liste konnte nicht verarbeitet werden" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "Der Neustart des DNS-Resolvers ist fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "Das Bewegen der temporären Dateien ist fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "Der Neustart des DNS-Resolvers ist fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "Das Sortieren der Datendatei ist fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "Fehler beim Starten" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "Das Anhalten von %s ist fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "Das Entpacken des komprimierten Caches ist fehlgeschlagen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "DNS-Ports erzwingen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "DNS-Ports erzwingen:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Erneut Laden erzwingen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Router-DNS erzwingen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Router-DNS-Server auf alle lokalen Geräte erzwingen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "Erneutes Herunterladen von %s Sperrlisten erzwingen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Erzwingt die Verwendung des Router-DNS auf lokalen Geräten, auch als DNS " +"Hijacking bekannt." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" +"Das freie RAM (%s) ist nicht ausreichend, um alle aktivierten Blocklisten zu " +"verarbeiten" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "UCI- und Dateizugriff für luci-app-adblock-fast gewähren" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "IPv6 Unterstützung" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"Wenn curl installiert ist und erkannt wird, werden keine Dateien " +"heruntergeladen, die größer sind als dieser Wert." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Neuversuche bei Zeitüberschreitung/Fehler des Downloads, falls Curl " +"installiert und erkannt wird." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Einzelne zuzulassende Domänen." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Einzelne zu sperrende Domains." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED für Statusanzeige" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Starte alle Listen Downloads und Verarbeitungsvorgänge gleichzeitig, " +"reduziert Startzeit des Dienstes." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"Lokale Geräte können ihre eigenen DNS-Server verwenden, wenn diese " +"eingestellt sind" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "Kein AdBlock auf dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "Keine HTTPS/SSL-Unterstützung auf dem Device" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Nicht installiert oder nicht gefunden" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Ausgabe-Verbositätseinstellung" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Konfigurationsaktualisierung vor dem Herunterladen der Block/Allow-Listen " +"durchführen." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" +"Wähle eine frei nutzbare LED aus, die noch nicht in der %sSystem-LED-" +"Konfiguration%s verwendet wird." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Bitte beachte, dass %s auf diesem System nicht unterstützt wird." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Listen verarbeiten" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Starte neu" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Dienstverwaltung" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Dienstfehler" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Dienststatus" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Dienstwarnungen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Gleichzeitige Verarbeitung" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "Größe: %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Einige Ausgaben" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "Einige empfohlene Pakete fehlen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Start" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Starte" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Dienst %s wird gestartet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Stopp" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" +"Stoppe den Download falls er für mehr als die gewählte Anzahl an Sekunden " +"stockt." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Angehalten" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Dienst %s wird angehalten" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Speicher komprimierten Zwischenspeicher" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Speicher komprimierte Zwischenspeicherdatei auf Router" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Unterdrücke Ausgabe" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "Der %s konnte das WAN-Gateway nicht finden" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" +"Die dnsmasq-ipset-Unterstützung ist aktiviert, aber dnsmasq ist entweder " +"nicht installiert oder dnsmasq unterstützt kein ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" +"Die dnsmasq-ipset-Unterstützung ist aktiviert, aber ipset ist entweder nicht " +"installiert oder das installierte ipset unterstützt den Typ „%s“ nicht" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" +"Die dnsmasq-nft-set-Unterstützung ist aktiviert, aber dnsmasq ist entweder " +"nicht installiert oder dnsmasq unterstützt kein nft-set" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" +"Die Unterstützung für dnsmasq-nft-Sets ist aktiviert, nft ist jedoch nicht " +"installiert" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"URL zur externen dnsmasq-Konfigurationsdatei, siehe %sREADME%s für Details." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" +"URLs zu Dateien, die Listen enthalten, die zugelassen oder blockiert werden " +"sollen." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "Unbekannt" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "AdBlocking für die dnsmasq-Instanz(en) verwenden" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" +"Verwendung einer externen dnsmasq-Konfigurationsdatei erkannt, bitte die " +"Option „%s“ auf „%s“ einstellen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Nutze Simultanverarbeitung" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Ausführliche Ausgabe" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Version %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Warnung" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "zusätzliche dnsmasq-Hosts" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "dnsmasq-Konfiguration" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "dnsmasq-ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "dnsmasq-nft-Set" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "dnsmasq-Server-Datei" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "kein" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "unbound-Werbeblockerliste" diff --git a/package/luci/applications/luci-app-adblock-fast/po/el/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/el/adblock-fast.po new file mode 100644 index 0000000000..45e6629102 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/el/adblock-fast.po @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-02-01 16:02+0000\n" +"Last-Translator: ChriZathens \n" +"Language-Team: Greek \n" +"Language: el\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.5-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Ενεργοποίηση" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Σφάλμα" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/en/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/en/adblock-fast.po new file mode 100644 index 0000000000..08be7839b7 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/en/adblock-fast.po @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-11-30 14:34+0000\n" +"Last-Translator: rygle \n" +"Language-Team: English \n" +"Language: en\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.3-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "Version" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/es/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/es/adblock-fast.po new file mode 100644 index 0000000000..6991d00413 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/es/adblock-fast.po @@ -0,0 +1,758 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2023-12-04 21:12+0000\n" +"Last-Translator: gallegonovato \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.3-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s está actualmente desactivado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s no está instalado o no se encuentra" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "-" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Acción" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Activo" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "Bloqueo de anuncios rápido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "Bloqueo de anuncios en todas las instancias" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "Bloqueador de anuncios rápido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "Bloqueo de anuncios rápido - Dominios permitidos y bloqueados" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "Bloqueo de anuncios rápido - URL de listas permitidas y bloqueadas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "Bloqueo de anuncios rápido - Configuración" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "Bloqueo de anuncios rápido - Estado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Añadir entradas IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Añadir entradas IPv6 a la lista de bloqueo." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Configuración avanzada" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "Permitir" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Dominios permitidos" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" +"Intente crear un caché comprimido de la lista de bloqueo en la memoria " +"persistente." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Actualización automática de configuración" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Configuración básica" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Bloquear" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Dominios bloqueados" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Bloqueando %s dominios(con %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "Caché" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "Archivo de caché" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Archivo de caché encontrado." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "No se detecta RAM libre" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "Caché comprimida" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Archivo de caché comprimido creado." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Archivo de caché comprimido encontrado." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "¡Error de validación de configuración (%s)!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" +"Controla el registro del sistema y la verbosidad de salida de la consola." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Intento de descarga de Curl" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Tamaño máximo del archivo Curl (en bytes)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "Servicio de DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" +"Opción de resolución de DNS, consulte %sREADME%s para obtener más " +"información." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Directorio para el archivo de caché comprimido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"El directorio para guardar los archivos de la caché comprimidos de la lista " +"de los intercepciones en la memoria persistente." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Desactivar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Desactivar depuración" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Desactivado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Desactivando el servicio %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "URL del archivo de configuración de Dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "No añadir entradas IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "No almacene caché comprimido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "No use procesamiento simultáneo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Tiempo de espera de descarga (en segundos)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Descargando listas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Activar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Activar depuración" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "Activa la salida de depuración a /tmp/adblock-fast.log." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Activando el servicio %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Error" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "Errores encontrados, por favor, compruebe el %sREADME%s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Fallo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "No se pudo acceder a la memoria compartida" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "No se pudo crear el archivo '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" +"No se pudo crear la lista de bloqueo o reiniciar el solucionador de DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "No se pudo crear la caché comprimida" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "No se pudo crear el directorio para el archivo %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "No se pudo crear el directorio de archivos de salida/caché/gzip" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "No se pudo detectar el formato %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "No se pudo descargar %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "No se pudo descargar el archivo de actualización de configuración" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "No se pudo formatear el archivo de datos" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "No se pudo mover '%s' a '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "No se pudo mover el archivo de datos temporal a '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "No se pudo optimizar el archivo de datos" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "No se pudo analizar %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "No se pudo analizar el archivo de actualización de configuración" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "No se pudo procesar la lista de permitidos" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "No se pudo recargar/reiniciar el solucionador de DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "No se pudieron eliminar archivos temporales" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "No se pudo reiniciar/recargar el solucionador de DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "No se pudo ordenar el archivo de datos" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "Fallo al iniciar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "No se pudo detener %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "No se pudo descomprimir la caché comprimida" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "Forzar puertos DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "Forzar puertos DNS:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Forzar recarga" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Forzar al DNS del enrutador" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Forzar al servidor DNS del enrutador a todos los dispositivos locales" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "Forzar la recarga de %s listas de bloques" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Fuerza el uso de DNS del enrutador en dispositivos locales, también conocido " +"como secuestro de DNS." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" +"La ram libre (%s) no es suficiente para procesar todas las listas de bloque " +"habilitadas" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "Otorgar acceso a archivos y UCI para luci-app-adblock-fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "Soporte IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"Si curl está instalado y detectado, no descargará archivos más grandes que " +"este." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Si curl está instalado y detectado, volvería a intentar descargar esto " +"muchas veces en tiempo de espera/falla." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Dominios individuales que se permitirán." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Dominios individuales para ser bloqueados." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "Directorio de la caché comprimido no válido '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED para indicar estado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Inicie todas las descargas y el procesamiento de listas simultáneamente, " +"reduciendo el tiempo de inicio del servicio." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"Permita que los dispositivos locales usen sus propios servidores DNS si " +"están configurados" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "Sin bloqueo de anuncios en dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "No hay soporte de HTTPS/SSL en el dispositivo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "No hay listas de URL bloqueadas ni dominios bloqueados activados" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "No instalado o no encontrado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Configuración de verbosidad de salida" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "Pausa" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "Pausando %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Realice la actualización de la configuración antes de descargar las listas " +"de bloqueos/permitidos." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" +"Elija el LED que ya no se utiliza en %sConfiguración del LED del sistema%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Tenga en cuenta que %s no es compatible con este sistema." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Procesando listas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "Volver a descargar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Reiniciando" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Control de servicio" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Errores de servicio" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Estado del servicio" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Advertencias de servicio" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Procesamiento simultáneo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "Tamaño" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "Tamaño: %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Alguna salida" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "Faltan algunos paquetes recomendados" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Iniciar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Iniciando" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Iniciando el servicio %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "Estado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Detener" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" +"Detenga la descarga si está detenida durante un número determinado de " +"segundos." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Detenido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Deteniendo el servicio %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Almacenar caché comprimido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Almacene el archivo de caché comprimido en el enrutador" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Suprimir salida" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "El %s no pudo descubrir la puerta de enlace WAN" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" +"La compatibilidad con ipset de dnsmasq está habilitada, pero dnsmasq no está " +"instalado o el instalado no es compatible con ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" +"La compatibilidad con ipset de dnsmasq está habilitada, pero ipset no está " +"instalado o el instalado no admite el tipo '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" +"El soporte dnsmasq nft set está habilitado, pero dnsmasq no está instalado o " +"dnsmasq instalado no soporta nft set" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" +"La compatibilidad con nft sets de dnsmasq está habilitada, pero nft no está " +"instalado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"URL del archivo de configuración de dnsmasq externo, consulte %sREADME%s " +"para obtener más información." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" +"Dirección URL a el(los) archivo(s) que contiene(n) la(s) listas que deben " +"permitirse o bloquearse." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "Desconocido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "Usar AdBlocking en la(s) instancia(s) dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" +"Se detectó el uso de un archivo de configuración dnsmasq externo; configure " +"la opción '%s' en '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Usar procesamiento simultáneo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Salida detallada" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "Versión" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Versión %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Advertencia" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "hosts dnsmasq adicionales" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "configuración de dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "dnsmasq ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "conjunto nft dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "archivo de servidores de dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "ninguno" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "lista de bloqueadores de anuncios sin vincular" diff --git a/package/luci/applications/luci-app-adblock-fast/po/fi/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/fi/adblock-fast.po new file mode 100644 index 0000000000..acc56d0ed2 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/fi/adblock-fast.po @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-03-12 13:29+0000\n" +"Last-Translator: Jiri Grönroos \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.12-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Estetyt verkkonimet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Poista käytöstä" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Ota käyttöön" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Virhe" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "IPv6-tuki" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Aloita" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Pysäytä" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Pysäytetty" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Varoitus" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "ei mitään" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/fr/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/fr/adblock-fast.po new file mode 100644 index 0000000000..29bfcfd975 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/fr/adblock-fast.po @@ -0,0 +1,739 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-09-05 14:23+0000\n" +"Last-Translator: Louis SCHNEIDER \n" +"Language-Team: French \n" +"Language: fr\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.0.1-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s est actuellement désactivé" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s n'est pas installé ou introuvable" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Actif" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Ajouter des entrées IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Ajouter des entrées IPv6 à la liste de blocage." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Configuration avancée" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Domaines autorisés" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" +"Tentative de création d'un cache compressé de la liste de blocage dans la " +"mémoire persistante." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Mise à jour automatique de la configuration" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Configuration de Base" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Domaines bloqués" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Blocage de %s domaines (avec %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Cache fichier trouvé." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Création d'un fichier cache compressé." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Fichier Compressé cache trouvé." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" +"Contrôle la verbosité du journal système et de la sortie de la console." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Réessayer le téléchargement via Curl" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Taille maximale du fichier Curl (en octets)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "Service DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" +"option de résolution DNS, consultez le %sREADME%s pour plus de détails." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Répertoire du fichier cache compressé" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"Répertoire du fichier cache compressé de la liste de blocs dans la mémoire " +"persistante." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Désactiver" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Désactiver le Débogage" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Désactivant le service %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "URL du fichier de configuration de Dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Ne pas ajouter d'entrées IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Ne pas conserver le cache compressé" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Ne pas utiliser de processus simultanés" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Time-out de téléchargement (en secondes)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Téléchargement de listes" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Active" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Activer le Débogage" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Activation du service %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Erreur" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Echec" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "Forcer les ports DNS :" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Forcer le re-chargement" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Forcer le Routeur DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Routage forcé du serveur DNS vers tous les appareils locaux" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Routage forcé du serveur DNS sur les appareils locaux, également connu sous " +"le nom de détournement de DNS." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "Support IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"Si curl est installé et détecté, il ne téléchargera pas de fichiers plus " +"gros que cela." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Si CURL est détecté et installé, il tentera à nouveau le téléchargement en " +"cas d'échec ou de time-out ce nombre de fois." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Domaines individuels à autoriser." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Domaines individuels à bloquer." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "Indiquer le status avec les LED" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Lancer simultanément le téléchargement et le traitement de toutes les " +"listes, ce qui réduit le temps de démarrage du service." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"Permettre aux appareils locaux d'utiliser leurs propres serveurs DNS s'ils " +"sont configurés" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Non installé ou non trouvé" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Configuration de la verbosité de la sortie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Effectuer la mise à jour de la configuration avant de télécharger les listes " +"de blocage / autorisation." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" +"Choisissez la LED qui n'est pas déjà utilisée dans %sConfiguration de la LED " +"du système%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Veuillez noter que ce système ne prend pas en charge le %s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Listes de traitement" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Redémarrage" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Contrôle de service" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Erreurs de service" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Statut du service" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Avertissements de service" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Traitement simultané" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Quelques informations en sortie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Démarrer" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Démarrage" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Démarrage du service %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Arrêter" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" +"Arrêter le téléchargement s'il est bloqué pendant ce nombre de secondes." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Arrêté" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Arrêt du service %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Conserver le cache compressé" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Conserver le fichier du cache compressé sur le routeur" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Supprimer la sortie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"URL du fichier de configuration dnsmasq externe, consultez %sREADME%s pour " +"plus de détails." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Utiliser des processus simultanés" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Sortie verbeuse" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Version %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Avertissement" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "dnsmasq hôtes supplémentaires" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "configuration dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "ipset dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "nft set dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "fichier des serveurs dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "aucun" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "Liste Adblock unbound" diff --git a/package/luci/applications/luci-app-adblock-fast/po/he/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/he/adblock-fast.po new file mode 100644 index 0000000000..d407f5aa9f --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/he/adblock-fast.po @@ -0,0 +1,717 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-09-07 08:59+0000\n" +"Last-Translator: Yaron Shahrabani \n" +"Language-Team: Hebrew \n" +"Language: he\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " +"n % 10 == 0) ? 2 : 3));\n" +"X-Generator: Weblate 5.0.1-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "הפעלה" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "אזהרה" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/hi/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/hi/adblock-fast.po new file mode 100644 index 0000000000..d730f134e9 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/hi/adblock-fast.po @@ -0,0 +1,710 @@ +msgid "" +msgstr "" +"Language: hi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/hu/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/hu/adblock-fast.po new file mode 100644 index 0000000000..8fc2832916 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/hu/adblock-fast.po @@ -0,0 +1,737 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-06 10:13+0000\n" +"Last-Translator: Norbert Szentner \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s jelenleg nem engedélyezett" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s nincs telepítve vagy nem található" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +#, fuzzy +msgid "Action" +msgstr "Művelet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Aktív" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "AdBlock Gyors" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +#, fuzzy +msgid "AdBlock on all instances" +msgstr "AdBlock minden esetben" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "AdBlock-Fast - Engedélyezett és Tiltott Domainek" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "AdBlock-Fast - Engedélyezett és Tiltott URL-ek" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "AdBlock-Fast - Konfiguráció" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "AdBlock-Fast - Állapot" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "IPv6 bejegyzések hozzáadása" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "IPv6 bejegyzések hozzáadása a tiltólistához." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Speciális beállítások" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "Engedélyez" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Engedélyezett domainek" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" +"Kísérlet a tiltólista egy tömörített gyorsítótárának létrehozására az " +"állandó memóriában." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Automatikus Konfig Frissítés" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Alapszintű beállítások" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Tilt" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Blokkolt domainek" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Blokkolt %s domainek (%s -el)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Cache fájl megtalálva." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Tömörített cache fájl létrehozva." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Tömörített cache fájl megtalálva." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Konfig (%s) érvényesítés sikertelen!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "A rendszernaplót és a konzolkimenet részletességét vezérli." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Curl letöltés újrapróbálása" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Curl maximális fájlmérete (byte-okban)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "DNS szolgáltatás" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Tömörített cache fájl célkönyvtára" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Letiltás" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Hibakeresés letiltása" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Letiltva" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "A %s szolgáltatás letiltása" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +#, fuzzy +msgid "Dnsmasq Config File URL" +msgstr "Dnsmasq Config File URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Ne adjon hozzá IPv6 bejegyzéseket" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Ne tároljon tömörített gyorsítótárat" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Ne használjon egyidejű feldolgozást" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Letöltés időkorlátja (másodpercben)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Listák letöltése" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Engedélyezés" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Hibakeresés engedélyezése" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +#, fuzzy +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "Engedélyezi a hibakeresési kimenetet a /tmp/simple-adblock.log fájlba." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "A %s szolgáltatás engedélyezése" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Hiba" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +#, fuzzy +msgid "Fail" +msgstr "Hiba" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "Hiba a megosztott memória elérése közben" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "A '%s' fájl létrehozása sikertelen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +#, fuzzy +msgid "Failed to create block-list or restart DNS resolver" +msgstr "Tiltó-lista látrehozása vagy a DNS-megoldó ujraindítása sikertelen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "Tömörített cache létrehozása sikertelen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "A %s fájl könyvtárának létrehozása sikertelen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "%s letöltése sikertelen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "Config Update fájl letöltése sikertelen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +#, fuzzy +msgid "Failed to format data file" +msgstr "Adatfájl formázása sikertelen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +#, fuzzy +msgid "Failed to move '%s' to '%s'" +msgstr "Hiba a fájl mozgatása közben (Innen:'%s' Ide: '%s')" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "Az adatfájl optimalizálása sikertelen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +#, fuzzy +msgid "Failed to process allow-list" +msgstr "Nem sikerült feldolgozni az engedélyezési listát" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "Átmeneti fájlok törlése sikertelen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Kényszerített újratöltés" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Kiszolgáló DNS-ének kényszerítése" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" +"Az útválasztó DNS-kiszolgálójának kényszerítése az összes helyi eszközre" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Kényszeríti az útválasztó DNS-ének használatát a helyi eszközökön. Ismert " +"még DNS-eltérítésként is." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "IPv6 támogatás" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Ha a cURL telepítve van és észlelhető, akkor megpróbálhatja ezt többször is " +"letölteni az időtúllépéskor vagy meghiúsuláskor." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED az állapot jelzéséhez" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Az összes lista letöltéseinek és egyidejű feldolgozásának indítása, " +"csökkentve a szolgáltatás indítási idejét." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"A helyi eszközök használhassák a saját DNS-kiszolgálóikat, ha be van állítva" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Kimenet részletességének beállítása" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +#, fuzzy +msgid "Please note that %s is not supported on this system." +msgstr "" +"Kérlek vedd figyelembe, hogy ez a/az %s nem támogatott ezen a rendszeren." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Újraindítás" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Szolgáltatás állapota" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Egyidejű feldolgozás" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Valamilyen kimenet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Indítás" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Indítás" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Megállítás" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "A letöltés leállítása, ha az leállt a beállított másodpercekig." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Megállítva" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Tömörített gyorsítótár tárolása" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Tömörített gyorsítótárfájl tárolása az útválasztón" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Kimenet elnyomása" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Egyidejű feldolgozás használata" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Részletes kimenet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Figyelmeztetés" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "nincs" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/it/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/it/adblock-fast.po new file mode 100644 index 0000000000..736f47f28e --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/it/adblock-fast.po @@ -0,0 +1,743 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-16 16:56+0000\n" +"Last-Translator: Frankie McEyes \n" +"Language-Team: Italian \n" +"Language: it\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.1\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s è attualmente disattivato" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s non è installato o non è stato trovato" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Azione" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Attivo" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "AdBlock Rapido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "AdBlock su tutte le istanze" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "AdBlock-Fast - Domini consentiti e bloccati" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "AdBlock-Fast - URL delle liste consentite e bloccate" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "AdBlock-Fast - Configurazione" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "AdBlock-Fast - Stato" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Aggiungi voci IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Aggiungi voci IPv6 alla lista di blocco." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Configurazione Avanzata" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "Consenti" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Domini consentiti" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" +"Tentativo di creare una cache compressa dell'elenco di blocchi nella memoria " +"persistente." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Aggiornamento automatico della configurazione" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Configurazione di base" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Blocco" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Domini bloccati" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Blocco di %s domini (con %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "File di cache trovato." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "File di cache compressa creato." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "File di cache compressa trovato." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Fallimento nella convalida della configurazione (%s)!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" +"Controlla il registro di sistema e la verbosità dell'output sulla console." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Ritenta il download con Curl" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Dimensione massima del file da scaricare con Curl (in byte)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "Servizio DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "Opzione di risoluzione DNS, consulta il %sREADME%s per i dettagli." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Directory per il file di cache compressa" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"Directory per il file di cache compressa dell'elenco di blocchi nella " +"memoria persistente." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Disattiva" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Disabilita il debug" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Disattivato" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Disattivazione del servizio %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "URL del file di configurazione Dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Non aggiungere voci IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Non memorizzare la cache compressa" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Non utilizzare l'elaborazione simultanea" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Timeout del download (in secondi)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Download delle liste" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Attiva" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Abilita il debug" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "Abilita l'output di debug su /tmp/adblock-fast.log." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Attivazione del servizio %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Errore" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "Errori riscontrati, controlla il %sREADME%s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Errore" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "Impossibile accedere alla memoria condivisa" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "Impossibile creare il file '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "Impossibile creare l'elenco di blocchi o riavviare il resolver DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "Impossibile creare la cache compressa" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "Impossibile creare la directory per il file %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "Impossibile creare la directory del file di output/cache/gzip" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "Impossibile rilevare il formato %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "Impossibile scaricare %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "Impossibile scaricare il file di aggiornamento della configurazione" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "Impossibile formattare il file di dati" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "Impossibile spostare '%s' in '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "Impossibile spostare il file temporaneo in '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "Impossibile ottimizzare il file di dati" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "Impossibile analizzare %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "Impossibile analizzare il file di aggiornamento della configurazione" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "Impossibile elaborare l'elenco consentito" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "Impossibile ricaricare/riavviare il resolver DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "Impossibile rimuovere i file temporanei" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "Impossibile riavviare/ricaricare il resolver DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "Impossibile ordinare il file di dati" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "Impossibile arrestare il servizio %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "Impossibile decomprimere la cache compressa" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "Forza porte DNS:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Forza il riavvio" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Forza il server DNS del router" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Forza il server DNS del router su tutti i dispositivi locali" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Forza l'uso del server DNS del router su tutti i dispositivi locali, noto " +"anche come DNS Hijacking." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "Concedi accesso UCI e file per luci-app-adblock-fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "Supporto IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"Se Curl è installato e rilevato, non scaricherà file più grandi di questo." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Se Curl è installato e rilevato, riproverà a scaricare questo numero di " +"volte in caso di timeout o fallimento." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Domini individuali da consentire." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Domini individuali da bloccare." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED per indicare lo stato" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Avvia tutti i download e l'elaborazione delle liste contemporaneamente, " +"riducendo il tempo di avvio del servizio." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"Consenti ai dispositivi locali di utilizzare i propri server DNS se impostati" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "Nessun AdBlock su dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "Nessun supporto HTTPS/SSL sul dispositivo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "Nessuna URL di liste bloccate né domini bloccati abilitati" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Non installato o non trovato" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Impostazione di verbosità dell'output" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Esegui l'aggiornamento della configurazione prima di scaricare le liste di " +"blocchi/consentiti." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" +"Scegli il LED che non è già in uso in %sConfigurazione LED di Sistema%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Si noti che %s non è supportato su questo sistema." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Elaborazione delle liste" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Riavvio in corso" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Controllo del servizio" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Errori del servizio" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Stato del servizio" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Avvertimenti del servizio" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Elaborazione simultanea" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "Dimensione: %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Alcuni output" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "Alcuni pacchetti consigliati non sono installati" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Avvia" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Avvio in corso" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Avvio del servizio %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Ferma" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" +"Interrompi il download se rimane bloccato per il numero di secondi impostato." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Fermato" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Arresto del servizio %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Memorizza la cache compressa" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Memorizza il file di cache compressa sul router" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Sopprimi l'output" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "Il %s non è riuscito a scoprire il gateway WAN" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" +"Il supporto ipset di dnsmasq è abilitato, ma dnsmasq non è installato o la " +"versione installata di dnsmasq non supporta ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" +"Il supporto ipset di dnsmasq è abilitato, ma ipset non è installato o la " +"versione installata di ipset non supporta il tipo '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" +"Il supporto nft set di dnsmasq è abilitato, ma dnsmasq non è installato o la " +"versione installata di dnsmasq non supporta i set nft" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "Il supporto nft set di dnsmasq è abilitato, ma nft non è installato" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"URL al file di configurazione esterno di dnsmasq, consulta il %sREADME%s per " +"i dettagli." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "URL a file(i) contenenti elenchi da consentire o bloccare." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "Sconosciuto" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "Usa il Blocco degli Annunci sulle istanze di dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" +"Rilevata l'uso di un file di configurazione esterno per dnsmasq, imposta " +"l'opzione '%s' su '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Usa l'elaborazione simultanea" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Output dettagliato" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Versione %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Avviso" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "Host aggiuntivi di dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "Configurazione di dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "Ipset di dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "Set nft di dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "File dei server di dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "nessuno" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "Elenco di AdBlock per Unbound" diff --git a/package/luci/applications/luci-app-adblock-fast/po/ja/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/ja/adblock-fast.po new file mode 100644 index 0000000000..935dfad9bf --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/ja/adblock-fast.po @@ -0,0 +1,719 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2021-04-14 13:49+0000\n" +"Last-Translator: Satoru Yoshida \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.6-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s は未インストールかまたは見つかりません" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "詳細設定" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "基本設定" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "ブロックされたドメイン" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "無効" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "デバッグ無効" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "ダウンロード タイムアウト(秒)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "有効化" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "デバッグ有効" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "エラー" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "ルーターDNSの強制" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "全ローカル デバイスにルーター DNSサーバーの使用を強制" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "IPv6 サポート" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "ステータスを表示するLED" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "DNSサーバーの使用を強制しない" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "出力詳細度の設定" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "サービス ステータス" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "軽量出力" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "開始" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "停止" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "停止済" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "出力の抑制" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "詳細出力" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "警告" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "なし" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/ko/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/ko/adblock-fast.po new file mode 100644 index 0000000000..895b85734f --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/ko/adblock-fast.po @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-04 07:12+0000\n" +"Last-Translator: Wonchul Kang \n" +"Language-Team: Korean \n" +"Language: ko\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s가 설치되지 않았거나 찾을 수 없습니다" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "차단된 도메인들" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "비활성화" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "비활성화" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "활성화" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "에러" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "%s시스템 LED 구성%s에서 사용하지 않은 LED를 선택하세요." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "참고: %s은(는) 이 시스템에서 지원하지 않습니다." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "다시 시작 중" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "시작" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "중지됨" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "경고" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "없음" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/lt/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/lt/adblock-fast.po new file mode 100644 index 0000000000..ca372813eb --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/lt/adblock-fast.po @@ -0,0 +1,720 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-12-16 01:05+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.3\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "-" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Veiksmas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Aktyvu" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Pažengusi konfigūracija" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "Leisti" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Leidžmiami domenai-sritys" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Paprasta konfigūracija" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Blokuoti" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Blokuojami domenai-sritys" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Blokuojame %s domenų-sričių (su %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "Talpykla" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "Talpyklos failas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Talpyklos failas rastas." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "„DNS“ tarnyba" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Išjungti" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Išjungtas/-i" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Išjungiama „%s“ tarnyba" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Įjungti" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Įjungiama „%s“ tarnyba" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Klaida" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "Nepavyko atsisiųsti %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "Nepavyko pradėti" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "Nepavyko sustabdyti" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "Priversti „DNS“ prievadai:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "Suteikti „UCI“ ir failų prieigą – „luci-app-adblock-fast“" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "„IPv6“ palaikymas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Neįdiegta arba nerasta" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "Pauzė" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Tarnybos valdymas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Tarnybos klaidos" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Tarnybos būsena" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Tarnybos įspėjimai" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "Dydis" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "Dydis: %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Pradėti" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Stop" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Sustabdytas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Stabdoma „%s“ tarnyba" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "„URL“" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "Nežinomas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "Versija" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Versija %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Įspėjimas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "joks" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/mr/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/mr/adblock-fast.po new file mode 100644 index 0000000000..4a348dad6a --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/mr/adblock-fast.po @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2020-02-07 09:18+0000\n" +"Last-Translator: Prachi Joshi \n" +"Language-Team: Marathi \n" +"Language: mr\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.11-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "सेवा स्थिती" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/ms/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/ms/adblock-fast.po new file mode 100644 index 0000000000..00662ed9dc --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/ms/adblock-fast.po @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-03-31 12:26+0000\n" +"Last-Translator: Faruki Ramly \n" +"Language-Team: Malay \n" +"Language: ms\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.6-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/nb_NO/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/nb_NO/adblock-fast.po new file mode 100644 index 0000000000..f80a9c67ff --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/nb_NO/adblock-fast.po @@ -0,0 +1,717 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-12-06 01:48+0000\n" +"Last-Translator: Allan Nordhøy \n" +"Language-Team: Norwegian Bokmål \n" +"Language: nb_NO\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.15-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s er ikke installert, eller ble ikke funnet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Legg til IPv6-oppføringer" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Legg til IPv6-oppføringer i blokkeringslisten." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Avansert oppsett" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Tillatte domener" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Automatisk oppsettsoppdatering" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Grunnleggende oppsett" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Blokkerte domener" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Blokkerer %s domener (med %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Skru av" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Skru på avlusning" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Ikke legg til noen IPv6-oppføringer" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Skru på" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Skru på avlusning" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Feil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Mislykket" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "IPv6-støtte" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Ikke installert, eller ble ikke funnet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Tjenestekontroll" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Tjenestestatus" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Start" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Starter …" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Stopp" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Stoppet" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Fortreng utdata" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Sirlig utdata" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Advarsel" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +#, fuzzy +msgid "none" +msgstr "ingen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/pl/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/pl/adblock-fast.po new file mode 100644 index 0000000000..d02ca5f139 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/pl/adblock-fast.po @@ -0,0 +1,754 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-12-07 17:39+0000\n" +"Last-Translator: Matthaiks \n" +"Language-Team: Polish \n" +"Language: pl\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 5.3-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s jest obecnie wyłączone" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s nie jest zainstalowany lub nie znaleziono" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "–" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Akcja" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Aktywne" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "Blokowanie reklam" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "Na wszystkich instancjach" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "Blokowanie reklam" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "Dozwolone i zablokowane domeny" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "Listy dozwolonych i zablokowanych adresów URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "Konfiguracja" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "Status" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Dodawanie wpisów IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Dodaj wpisy IPv6 do list blokujących." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Zaawansowana konfiguracja" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "Zezwól" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Dozwolone domeny" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" +"Próba utworzenia z skompresowanej pamięci podręcznej list blokujących w " +"pamięci trwałej." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Automatyczna aktualizacja konfiguracji" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Podstawowa konfiguracja" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Zablokuj" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Zablokowane domeny" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Blokowanie %s domen (z %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "Pamięć podręczna" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "Plik pamięci podręcznej" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Znaleziono plik pamięci podręcznej." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "Nie można wykryć wolnej pamięci RAM" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "Skompresowana pamięć podręczna" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Utworzono skompresowany plik pamięci podręcznej." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Znaleziono skompresowany plik w pamięci podręcznej." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Błąd sprawdzania poprawności konfiguracji (%s)!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" +"Kontroluje szczegółowość dziennika systemowego i danych wyjściowych konsoli." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Ponowne próby pobierania poprzez curl" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Maksymalny rozmiar pliku dla curl (w bajtach)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "Usługa DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" +"Opcja rozwiązywania DNS, zobacz %sREADME%s, aby uzyskać szczegółowe " +"informacje." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Katalog dla skompresowanego pliku pamięci podręcznej" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"Katalog dla skompresowanego pliku pamięci podręcznej listy zablokowanych w " +"pamięci trwałej." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Wyłącz" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Wyłącz debugowanie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Wyłączone" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Wyłączanie usługi %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "Adres URL pliku konfiguracyjnego dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Nie dodawaj wpisów IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Nie przechowuj skompresowanej pamięci podręcznej" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Nie używaj jednoczesnego przetwarzania" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Limit czasu pobierania (w sekundach)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Pobieranie list" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Włącz" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Włącz debugowanie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "Włącza dane wyjściowe debugowania do pliku /tmp/adblock-fast.log." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Włączanie usługi %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Błąd" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "Wystąpiły błędy. Sprawdź %sREADME%s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Niepowodzenie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "Nie udało się uzyskać dostępu do pamięci współdzielonej" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "Nie udało się utworzyć pliku '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" +"Nie udało się utworzyć listy zablokowanych lub zrestartować resolwera DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "Nie udało się utworzyć skompresowanej pamięci podręcznej" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "Nie udało się utworzyć katalogu dla pliku %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "Nie udało się utworzyć katalogu plików output/cache/gzip" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "Nie udało się wykryć formatu %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "Nie udało się pobrać %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "Nie udało się pobrać pliku aktualizacji konfiguracji" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "Nie udało się sformatować pliku danych" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "Nie udało się przenieść '%s' do '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "Nie udało się przenieść tymczasowego pliku danych do '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "Nie udało się zoptymalizować pliku danych" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "Nie udało się przeanalizować %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "Nie udało się przeanalizować pliku aktualizacji konfiguracji" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "Nie udało się przetworzyć listy dozwolonych" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "Nie udało się przeładować/zrestartować resolwera DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "Nie udało się usunąć plików tymczasowych" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "Nie udało się zrestartować/przeładować resolwera DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "Nie udało się posortować pliku danych" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "Nie udało się uruchomić" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "Nie udało się zatrzymać %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "Nie udało się rozpakować skompresowanej pamięci podręcznej" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "Wymuszone porty DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "Wymuszone porty DNS:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Wymuś przeładowanie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Wymuś DNS routera" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Wymuś serwer DNS routera na wszystkich urządzeniach lokalnych" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "Wymuszone ponowne pobieranie listy zablokowanych %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Wymusza użycie DNS routera na urządzeniach lokalnych, znane również jako DNS " +"Hijacking." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" +"Wolna pamięć RAM (%s) nie wystarczy do przetworzenia wszystkich włączonych " +"list blokowania" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "Przyznaj usłudze blokowania reklam dostęp do UCI i plików" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "Obsługa IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"Jeśli curl jest zainstalowany i wykryty, nie pobierze plików większych niż " +"ten." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Jeśli curl jest zainstalowany i wykryty, spróbuje pobrać go wiele razy po " +"przekroczeniu limitu czasu / awarii." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Poszczególne domeny, które mają być dozwolone." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Poszczególne domeny, które mają być zablokowane." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "Nieprawidłowy katalog skompresowanej pamięci podręcznej '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "Dioda LED wskazująca status" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Uruchom wszystkie listy plików do pobrania i przetwarzania jednocześnie, " +"zmniejszając czas rozpoczęcia usługi." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"Pozwól urządzeniom lokalnym używać własnych serwerów DNS, jeśli ustawiono" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "Brak usługi blokowania reklam na SmartDNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "Brak usługi blokowania reklam na dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "Brak obsługi HTTPS/SSL na urządzeniu" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "Brak list zablokowanych adresów URL ani zablokowanych domen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Nie zainstalowano lub nie znaleziono" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Ustawienia szczegółowości danych wyjściowych" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "Wstrzymaj" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "Wstrzymywanie %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Wykonaj aktualizację konfiguracji przed pobraniem list dozwolonych/" +"zablokowanych." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" +"Wybierz diodę LED, która nie jest jeszcze używana na stronie %sKonfiguracja " +"diod LED%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Należy pamiętać, że %s nie jest obsługiwany w tym systemie." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Przetwarzanie list" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "Pobierz ponownie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Ponowne uruchomienie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Kontrola usługi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Błędy usługi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Status usługi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Ostrzeżenia usługi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Jednoczesne przetwarzanie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "Rozmiar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "Rozmiar: %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Niektóre dane wyjściowe" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "Brakuje niektórych zalecanych pakietów" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Uruchom" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Uruchamianie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Uruchamianie usługi %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "Status" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Zatrzymaj" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" +"Zatrzymaj pobieranie, jeśli jest zablokowane przez ustawioną liczbę sekund." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Zatrzymane" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Zatrzymywanie usługi %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Przechowuj skompresowaną pamięć podręczną" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Przechowuj skompresowany plik pamięci podręcznej w routerze" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Pomiń dane wyjściowe" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "Nie udało się %s odnaleźć bramy WAN" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" +"Obsługa ipset dnsmasq jest włączona, ale dnsmasq nie jest zainstalowany lub " +"zainstalowany dnsmasq nie obsługuje ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" +"Obsługa ipset dnsmasq jest włączona, ale ipset nie jest zainstalowany lub " +"zainstalowany ipset nie obsługuje typu '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" +"Obsługa zestawów nft jest włączona, ale dnsmasq nie jest zainstalowany lub " +"zainstalowany dnsmasq nie obsługuje zestawów nft" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" +"Obsługa zestawów nft dnsmasq jest włączona, ale nft nie jest zainstalowany" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "Adres URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"Adres URL do zewnętrznego pliku konfiguracyjnego dnsmasq, zobacz %sREADME%s, " +"aby uzyskać szczegółowe informacje." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" +"Adresy URL plików zawierających listy, które mają być dozwolone lub " +"zablokowane." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "Nieznany" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "Użyj blokowania reklam w instancjach SmartDNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "Użyj blokowania reklam w instancjach dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" +"Wykryto użycie zewnętrznego pliku konfiguracyjnego dnsmasq, ustaw opcję '%s' " +"na '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Używaj jednoczesnego przetwarzania" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Pełne dane wyjściowe" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "Wersja" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Wersja %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Ostrzeżenie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "Dodatkowe hosty dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "Konfiguracja dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "ipset dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "Zestaw nft dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "Plik serwerów dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "Brak" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "Zestaw domen smartdns" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "ipset smartdns" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "Zestaw nft smartdns" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "lista blokowania reklam unbound" diff --git a/package/luci/applications/luci-app-adblock-fast/po/pt/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/pt/adblock-fast.po new file mode 100644 index 0000000000..4dd65d8c4a --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/pt/adblock-fast.po @@ -0,0 +1,737 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-08-14 17:53+0000\n" +"Last-Translator: ssantos \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s está desativado no momento" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s não está instalado ou não foi encontrado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Ativo" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Adicionar entradas IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Adicionar entradas IPv6 à lista de blocos." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Configurações Avançadas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Domínios Permitidos" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" +"Tentativa de criar um cache comprimido de lista de blocos na memória " +"persistente." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Atualização da configuração automática" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Configurações Básicas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Domínios Bloqueados" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Bloqueio de %s domínios (com %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Ficheiro de cache encontrado." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Ficheiro de cache comprimida criado." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Ficheiro de cache comprimido encontrado." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Houve uma falha na validação da configuração (%s)!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "Controla o log do sistema e a verbosidade da saída do console." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Repetir descarregamento do Curl" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Tamanho máximo do ficheiro curl (em bytes)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "Serviço DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "Opção de resolução de DNS, consulte %sREADME%s para obter detalhes." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Diretório para arquivo de cache compactado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"Diretório para o arquivo de cache compactado da lista de bloqueio na memória " +"persistente." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Desativar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Desativar Depuração" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Desativando o serviço %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "URL do ficheiro de configuração do dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Não adicionar entradas de IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Não armazenar cache comprimido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Não utilizar processamento simultâneo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Tempo limite ao descarregar (em segundos)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "A descarregar listas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Ativar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Ativar Depuração" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Ativando o serviço %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Erro" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Falha" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "Forçar portas DNS:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Forçar recarregamento" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Forçar o DNS do Roteador" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Forçar o servidor de DNS do Roteador para todos os aparelhos locais" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Força o uso do DNS do Router em aparelhos locais, também conhecido como DNS " +"Hijacking." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "Suporte de IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"Se o curl estiver instalado e for detetado, não serão transferidos ficheiros " +"maiores que isto." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Se o curl for instalado e detetado, ele tentaria descarrega-lo muitas vezes " +"se atingir limite de tempo/falhar." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Domínios individuais a serem permitidos." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Domínios individuais a serem bloqueados." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED para indicar o estado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Iniciar todos os descarregamentos e processamento de listas simultaneamente, " +"reduzindo a hora de início do serviço." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"Deixar aparelhos locais usar os próprios servidores de DNS deles, se forem " +"definidos" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Não está instalado ou não foi encontrado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Definição do detalhamento do registro" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Execute a atualização da configuração antes de descarregar as listas de " +"bloqueio/permissão." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" +"Escolha o LED ainda não utilizado em %sConfiguração dos LED do sistema%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Por favor, note que %s não é suportado neste sistema." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Processamento de listas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Reiniciando" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Controle de serviços" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Erros de Serviço" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Estado do Serviço" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Avisos de Serviço" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Processamento simultâneo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Pouco detalhado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Iniciar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Iniciando" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Iniciando o serviço %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Parar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" +"Parar o descarregamento se ele for interrompido por uma quantidade de " +"segundos definida." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Parado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Parando o serviço %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Armazenar cache comprimido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Armazenar ficheiro de cache comprimido no roteador" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Suprimir" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"URL para o ficheiro de configuração dnsmasq externo, consulte %sREADME%s " +"para obter detalhes." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Utilizar processamento simultâneo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Detalhado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Versão %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Aviso" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "Hosts adicionais dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "Configuração do dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "dnsmasq ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "dnsmasq nft set" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "Ficheiro de servidores dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "nenhum" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "lista de bloqueio de anúncios do unbound" diff --git a/package/luci/applications/luci-app-adblock-fast/po/pt_BR/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/pt_BR/adblock-fast.po new file mode 100644 index 0000000000..64e317bf79 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/pt_BR/adblock-fast.po @@ -0,0 +1,739 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2023-11-22 00:07+0000\n" +"Last-Translator: Edison F Carbol \n" +"Language-Team: Portuguese (Brazil) \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.2\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s está atualmente desativado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s não está instalado ou não foi encontrado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "-" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Ação" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Ativo" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "-" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "AdBlock em todas as instâncias" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "AdBlock-Fast - Domínios Permitidos e Bloqueados" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "AdBlock-Fast - Lista de URLs Permitidas e Bloqueadas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "AdBlock-Fast - Configuração" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Adicionar Entradas IPV6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Adicionar entradas IPv6 à lista de blocos." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Configuração Avançada" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "Permitir" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Domínios Permitidos" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" +"Tentar criar um cache comprimido da lisa de blocos na memória persistente." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Atualização automática da configuração" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Configurações Básicas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Bloquear" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Domínios Bloqueados" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Bloqueando %s domínios (com %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "Cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "Arquivo de cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Arquivo de cache foi encontrado." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "Cache compactado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Foi criado um arquivo de cache compactado." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Arquivo de cache compactado foi encontrado." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Houve uma falha na validação da configuração (%s)!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" +"Controla o registro de log do sistema e a verbosidade da saída do console." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Repetir o Download do Curl" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Tamanho máximo do arquivo Curl (em bytes)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "Serviço de DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" +"Opção da resolução do DNS, consulte %sREADME%s para obter mais detalhes." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Diretório para o arquivo de cache compactado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"Diretório para o arquivo de cache compactado da lista de bloqueio na memória " +"persistente." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Desativar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Desabilitar Depuração" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Desabilitado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Desativando o serviço %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "URL do arquivo de configuração do Dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Não adicionar entradas IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Não armazenar a cache compactada" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Não utilizar processamento simultâneo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Tempo limite ao baixar (em segundos)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Listas de download" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Ativar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Habilitar Depuração" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "Habilitar saída de depuração para /tmp/adblock-fast.log." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Ativando o serviço %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Erro" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "Erros encontrados, por favor verifique o %sREADME%s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Falha" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "Falha ao acessar memória compartilhada" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "Falha ao criar o arquivo '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "Falha ao criar o cache compactado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "Falha ao criar o diretório para o arquivo %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "Falha ao criar o diretório para a saída do arquivo /cache/gzip" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "Falha ao detectar o formato %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "Falha ao baixar %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "Falha ao baixar o arquivo de configuração de atualização" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "Falha ao formatar o arquivo de dados" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "Falha ao mover '%s' para '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "Falha ao mover o arquivo de dados temporário para '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "Falha ao otimizar o arquivo de dados" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "Falha ao remover arquivos temporários" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "Falha ao classificar o arquivo de dados" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "Falha ao parar %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "Falha ao descompactar o cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "Forçar portas DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "Imponha o uso das portas DNS:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Impor o Recarregamento" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Impor o DNS do roteador" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Impõem o servidor de DNS do roteador para todos os dispositivos locais" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Impõem o uso do DNS do Roteador em dispositivos locais, também é conhecido " +"como DNS Hijacking." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "Suporte ao IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"Se o curl estiver instalado e for detectado, ele não baixará arquivos " +"maiores que isso." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Se o curl for instalado e for detectado, ele tentará baixar isso várias " +"vezes em caso de falha ou limite de tempo." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Os domínios individuais que serão permitidos." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Os domínios individuais que serão bloqueados." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED para indicar o estado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Iniciar todos os downloads e processamento das listas simultaneamente, " +"reduzindo o tempo de início do serviço." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"Deixe que os dispositivos locais usem os seus próprios servidores DNS caso " +"seja definido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Não está instalado ou não foi encontrado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Definição do detalhamento do registro" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "Pausa" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "Pausando %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Execute a atualização da configuração antes de baixar as listas de bloqueio/" +"permissão." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" +"Escolha o LED ainda não utilizado em %sConfiguração do LED do sistema%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Por favor, note que %s não é compatível com este sistema." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Listas de processamento" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Reiniciando" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Controle do Serviço" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Erros do serviço" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Condição do Serviço" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Avisos do serviço" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Processamento simultâneo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "Tamanho" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "Tamanho: %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Pouco detalhado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Início" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Iniciando" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Iniciando o serviço %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Parar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "Pare o download caso ele esteja estagnado por determinados segundos." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Parado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Parando o serviço %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Armazene o cache que foi compactado" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Armazenar arquivo de cache que foi compactado no roteador" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Suprimir" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"A URL para o arquivo de configuração externa do dnsmasq, consulte %sREADME%s " +"para obter mais detalhes." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "Desconhecido" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Utilizar processamento simultâneo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Saída detalhada" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "Versão" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Versão %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Alerta" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "hosts adicionais do dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "configuração do dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "ipset do dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "conjunto nft do dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "arquivo dos servidores do dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "nenhum" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "lista de bloqueio de anúncios não vinculados" diff --git a/package/luci/applications/luci-app-adblock-fast/po/ro/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/ro/adblock-fast.po new file mode 100644 index 0000000000..2bd6fe6e22 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/ro/adblock-fast.po @@ -0,0 +1,739 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-11-05 16:31+0000\n" +"Last-Translator: Simona Iacob \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2;\n" +"X-Generator: Weblate 5.2-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s este în prezent dezactivat" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s nu este instalat sau nu este găsit" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Acțiune" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Activ" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "AdBlock rapid" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "AdBlock pe toate instanțele" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "AdBlock-Fast - Domenii permise și blocate" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "AdBlock-Fast - Listă de URL-uri permise și blocate" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "AdBlock-Fast - Configurație" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "AdBlock-Fast - Stare" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Adăugați intrări IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Adăugați intrări IPv6 la block-list." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Configurație avansată" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "Permiteți" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Domenii permise" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" +"Încercarea de a crea o memorie cache comprimată a listei de blocuri în " +"memoria persistentă." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Actualizare automată a configurației" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Configurație de Bază" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Blochează" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Domenii Blocate" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Blocarea domeniilor %s (cu %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Fișier cache găsit." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "A fost creat un fișier cache comprimat." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "S-a găsit fișierul cache comprimat." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Eșec de validare a configurației (%s)!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "Controlează verbalizarea jurnalului de sistem și a ieșirii consolei." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Reîncercarea descărcării Curl" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Dimensiunea maximă a fișierului Curl (în bytes)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "Serviciul DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "opțiunea de rezoluție DNS, consultați %sREADME%s pentru detalii." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Director pentru fișierul cache comprimat" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"Director pentru fișierul cache comprimat al listei de blocare din memoria " +"persistentă." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Dezactivați" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Dezactivarea depanării" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Dezactivat" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Dezactivarea serviciului %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "URL-ul fișierului de configurare Dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Nu adăugați intrări IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Nu stocați memoria cache comprimată" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Nu folosiți procesarea simultană" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Time-out pentru descărcare (în secunde)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Descărcarea listelor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Activează" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Activați depanarea" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "Activează ieșirea de depanare în /tmp/adblock-fast.log." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Activarea serviciului %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Eroare" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "Erori întâlnite, vă rugăm să verificați %sREADME%s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Eșec" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "Nu a reușit să acceseze memoria partajată" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "Nu s-a reușit crearea fișierului '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" +"Nu s-a reușit crearea listei de blocuri sau repornirea rezolvatorului DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "Nu a reușit să creeze memoria cache comprimată" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "Nu s-a reușit crearea unui director pentru fișierul %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "Nu a reușit să creeze directorul de fișiere output/cache/gzip" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "Nu a reușit să detecteze formatul %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "Nu a reușit să descarce %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "Nu s-a reușit descărcarea fișierului de actualizare a configurației" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "Nu a reușit să formateze fișierul de date" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "Nu a reușit să mute \"%s\" în \"%s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "Nu a reușit să mute fișierul de date temporare în \"%s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "Nu a reușit să optimizeze fișierul de date" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "Nu a reușit să analizeze %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "Nu a reușit să analizeze fișierul Config Update" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "Nu a reușit să proceseze allow-list" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "Nu s-a reușit sortarea fișierului de date" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "Nu a reușit să oprească %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "Forțați porturile DNS:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Reîncărcare de forță" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Forțați DNS-ul routerului" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Forțați serverul DNS al Routerului pentru toate dispozitivele locale" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Forțează utilizarea Router DNS pe dispozitivele locale, cunoscută și sub " +"numele de DNS Hijacking." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "Suport IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"Dacă curl este instalat și detectat, acesta nu va descărca fișiere mai mari " +"de atât." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"În cazul în care curl este instalat și detectat, acesta va încerca din nou " +"să descarce de atâtea ori la timeout/ eșec." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Domenii individuale care să fie permise." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Domenii individuale care urmează să fie blocate." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED pentru a indica starea" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Lansarea simultană a tuturor descărcărilor și procesării listelor, reducând " +"timpul de pornire a serviciului." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"Permiteți dispozitivelor locale să utilizeze propriile servere DNS, dacă " +"sunt setate" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Nu este instalat sau nu a fost găsit" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Setarea verbalității de ieșire" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Efectuați actualizarea configurației înainte de a descărca listele de " +"blocare/permitere." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" +"Alegeți LED-ul care nu este deja utilizat în %sSystem LED Configuration%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Vă rugăm să rețineți că %s nu este acceptat pe acest sistem." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Listă de prelucrare" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Repornire" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Controlul serviciilor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Erori de serviciu" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Starea serviciului" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Avertismente de serviciu" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Prelucrare simultană" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Unele ieșiri" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Porniți" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Începând cu" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Pornirea serviciului %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Stop" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" +"Oprește descărcarea în cazul în care aceasta este blocată pentru un număr de " +"secunde stabilit." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "S-a oprit" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Se operște servciul %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Stocarea cache-ului comprimat" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Stocați fișierul cache comprimat pe router" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Suprimarea ieșirii" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"URL către fișierul extern de configurare dnsmasq, consultați %sREADME%s " +"pentru detalii." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Utilizați procesarea simultană" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Ieșire abundentă" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Versiunea %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Avertisment" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "dnsmasq gazde suplimentare" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "configurare dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "dnsmasq ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "setați dnsmasq nft set" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "fișierul serverelor dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "niciunul" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "listă nelegată adblock" diff --git a/package/luci/applications/luci-app-adblock-fast/po/ru/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/ru/adblock-fast.po new file mode 100644 index 0000000000..e4f61adfd9 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/ru/adblock-fast.po @@ -0,0 +1,746 @@ +msgid "" +msgstr "" +"Project-Id-Version: LuCI: simple-adblock\n" +"POT-Creation-Date: 2017-12-07 14:00+0300\n" +"PO-Revision-Date: 2023-12-09 18:04+0000\n" +"Last-Translator: st7105 \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 5.3-dev\n" +"Project-Info: Это технический перевод, не дословный. Главное-удобный русский " +"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s сейчас отключен" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s не установлен или не найден" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "-" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Действие" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Активно" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "AdBlock Fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "AdBlock во всех случаях" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "AdBlock-Fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "AdBlock-Fast - Разрешенные и заблокированные домены" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "AdBlock-Fast - Разрешенные и заблокированные списки URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "AdBlock-Fast - Конфигурация" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "AdBlock-Fast - Статус" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Добавить записи IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Добавление записей IPv6 в чёрный список." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Расширенные настройки" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "Разрешить" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Разрешённые домены" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "Пытаться создавать сжатый кэш списка блокировок в постоянной памяти." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Автоматическое обновление конфигурации" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Основная конфигурация" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Блок" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Блокируемые домены" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Блокировка %s доменов (с %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "Кэш" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "Кэш-файл" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Файл кеша найден." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "Не удается обнаружить свободную оперативную память" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "Сжатый кэш" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Создан сжатый файл кеша." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Найден сжатый кэш-файл." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Конфигурация (%s) не прошла проверку!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "Контроль вывода системного журнала и его информативности." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Попытки загрузки через Curl" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Максимальный размер файла Curl (в байтах)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "Служба DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "Опция разрешения DNS, подробности см. в %sREADME%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Каталог для сжатого файла кэша" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "Каталог для сжатого кэш-файла блок-листа в постоянной памяти." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Отключить" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Отключить отладку" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Отключено" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Отключение службы %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "URL-адрес файла конфигурации Dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Не добавлять записи IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Не хранить сжатый кэш" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Не использовать одновременную обработку" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Время ожидания загрузки (в секундах)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Загрузка списков" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Включить" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Включить отладку" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "Включает вывод отладки в файл /tmp/adblock-fast.log." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Включение службы %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Ошибка" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "Обнаружены ошибки, сверьтесь с %sREADME%s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Ошибка" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "Не удалось получить доступ к общей памяти" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "Не удалось создать файл '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "Не удалось создать блок-лист или перезапустить DNS-резольвер" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "Не удалось создать сжатый кэш" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "Не удалось создать каталог для файла %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "Не удалось создать каталог output/cache/gzip" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "Не удалось определить формат %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "Не удалось загрузить %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "Не удалось загрузить файл обновления конфигурации" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "Не удалось отформатировать файл данных" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "Не удалось переместить '%s' в '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "Не удалось переместить временный файл данных в '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "Не удалось оптимизировать файл данных" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "Не удалось разобрать %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "Не удалось разобрать файл обновления конфигурации" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "Не удалось обработать разрешающий список" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "Не удалось перезагрузить/перезапустить DNS-резольвер" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "Не удалось удалить временные файлы" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "Не удалось перезапустить/перезагрузить DNS-резольвер" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "Не удалось сортировать файл данных" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "Не удалось запустить" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "Не удалось остановить %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "Не удалось распаковать сжатый кэш" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "Принудительное использование портов DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "Принудительное использование портов DNS:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Принудительная перезагрузка" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Назначить DNS роутера" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Назначить DNS роутера всем локальным устройствам" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "Принудительная повторная загрузка %s списков блоков" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Принудительное использование DNS роутера на локальных устройствах, или " +"перехват DNS." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" +"Свободной памяти (%s) недостаточно для обработки всех включенных блок-листов" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "Предоставить UCI и доступ к файлам для luci-app-adblock-fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "Поддержка IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"Если curl установлен и обнаружен, он не будет загружать файлы большего " +"размера." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Если curl установлен и обнаружен, данное значение устанавливает количество " +"повторных попыток загрузки в случае неудачи." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Отдельные домены, которые будут разрешены." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Отдельные домены, которые будут заблокированы." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "Недопустимый каталог сжатого кэша '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "Светодиоды для индикации состояния" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Запускает все загрузки и обработки списков одновременно, сокращая время " +"запуска службы." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"Разрешить локальным устройствам использовать собственные DNS, если они " +"прописаны в настройках сети устройства" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "Отсутствие AdBlock на SmartDNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "Отсутствие AdBlock на dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "Отсутствие поддержки HTTPS/SSL на устройстве" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "Нет заблокированных URL-адресов и доменов" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Не установлен или не найден" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Настройка журнала" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "Пауза" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "Пауза %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Осуществлять обновление конфигурации перед загрузкой списков блокировок." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "Выберите светодиод, не используемый в %sSystem LED Configuration%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Обратите внимание: %s не поддерживается в этой системе." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Обработка списков" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "Перезагрузить" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Перезапуск" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Управление службой" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Ошибки службы" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Статус службы" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Предупреждения службы" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Одновременная обработка" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "Размер" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "Размер: %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Частичная запись" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "Некоторые рекомендуемые пакеты отсутствуют" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Запустить" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Запуск" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Запуск службы %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "Состояние" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Остановить" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" +"Остановка загрузки, если она задерживается на заданное количество секунд." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Остановлена" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Остановка службы %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Хранить сжатый кэш" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Хранить сжатый файл кэша на роутере" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Запрет записи" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "%s не удалось обнаружить WAN-шлюз" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" +"Поддержка dnsmasq ipset включена, но dnsmasq либо не установлен, либо " +"установленный dnsmasq не поддерживает ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" +"Поддержка dnsmasq ipset включена, но ipset либо не установлен, либо " +"установленный ipset не поддерживает тип '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" +"Поддержка dnsmasq nft set включена, но dnsmasq либо не установлен, либо " +"установленный dnsmasq не поддерживает nft set" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "Поддержка наборов dnsmasq nft включена, но nft не установлен" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"URL-адрес внешнего файла конфигурации dnsmasq, подробности см. в %sREADME%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" +"URL-адреса файлов, содержащих списки, которые должны быть разрешены или " +"заблокированы." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "Неизвестный" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "Использовать AdBlocking на экземпляре(ах) SmartDNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "Использовать блокировку рекламы на экземпляре(ах) dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" +"Обнаружено использование внешнего файла конфигурации dnsmasq, пожалуйста, " +"установите опцию '%s' в значение '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Использовать одновременную обработку" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Подробный вывод" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "Версия" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Версия %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Внимание" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "dnsmasq дополнительные хосты" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "конфигурация dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "IP-набор dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "dnsmasq nft-набор" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "файл серверов dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "ничего" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "набор доменов smartdns" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "smartdns ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "smartdns nftset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "несвязанный список adblock" diff --git a/package/luci/applications/luci-app-adblock-fast/po/sk/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/sk/adblock-fast.po new file mode 100644 index 0000000000..a575e6fc61 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/sk/adblock-fast.po @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-07-10 15:50+0000\n" +"Last-Translator: MaycoH \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Aktívny" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Zakázať" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Povoliť" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Chyba" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Štart" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Zastaviť" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Upozornenie" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "žiadne" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/sv/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/sv/adblock-fast.po new file mode 100644 index 0000000000..aad534aed5 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/sv/adblock-fast.po @@ -0,0 +1,718 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-09-17 17:51+0000\n" +"Last-Translator: Kristoffer Grundström \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.0.2\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s är för närvarande avstängd" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s är inte installerat eller kunde inte hittas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Åtgärd" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Aktiv" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "AdBlock Fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "AdBlock på alla instanser" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "AdBlock-Fast - Tillåtna och Blockerade domäner" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "AdBlock-Fast - Tillåtna och Blockerade URL-listor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "AdBlock-Fast - Inställning" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "AdBlock-Fast - Status" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Lägg till IPv6-poster" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Lägg till IPv6-poter till blockeringslistan." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Avancerad konfiguration" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "Tillåt" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Tillåtna domäner" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Standardkonfiguration" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Blockera" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Blockerade domäner" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Blockerar %s-domäner (med %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Cache-filen hittades." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Packad cache-fil skapades." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Packad cache-fil hittades." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Valideringen för inställningen av (%s) misslyckades!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "Styr system-loggen och verbositet för konsolutmatningen." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Maximal filstorlek för Curl (i bytes)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "DNS-tjänst" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Katalog för packad cache-fil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"Katalog för packad cache-fil av blockeringslistan i det beständiga minnet." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Stäng av" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Inaktivera avlusning" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Avstängd" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Stänger av %s-tjänsten" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Lägg inte till IPv6-poster" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Lagra inte packad cache" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Time-out för hämtning (i sekunder)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Hämtar listor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Aktivera" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Aktivera avlusning" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "Aktiverar avlusningens utmatning till /tmp/adblock-fast.log." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Aktiverar %s-tjänsten" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Fel" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Misslycka" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "Skapandet av filen '%s' misslyckades" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" +"Skapandet av blockeringslistan eller att starta om DNS-utlösaren misslyckades" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "Skapandet av packad cache misslyckades" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "Skapandet av katalogen till filen %s misslyckades" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "Skapandet av katalogen för utmatningen/cache/gzip-fil misslyckades" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "Hämtningen av %s misslyckades" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "Formateringen av data-filen misslyckades" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "Flytten av '%s' till '%s' misslyckades" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "Flytten av temporär data-fil till '%s' misslyckades" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "Optimeringen av data-filen misslyckades" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "IPv6-stöd" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Individuella domäner att tillåta." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Individuella domäner att blockera." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED för att indikera status" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "Låt lokala enheter använda sina egna DNS-servrar om de är inställda" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Inte installerad eller kunde inte hittas" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Vänligen notera att %s stöds inte i det här systemet." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Startar om" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Tjänstkontroll" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Status för tjänsten" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Simultan behandling" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Viss utmatning" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Starta" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Startar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Stopp" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Stoppad" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Förträng utmatning" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "Okänd" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Använd simultan behandling" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Utförlig utmatning" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Version %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Varning" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "ytterligare värdar för dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "konfiguration för dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "ipset för dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "ställ in nft för dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "inga" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/templates/adblock-fast.pot b/package/luci/applications/luci-app-adblock-fast/po/templates/adblock-fast.pot new file mode 100644 index 0000000000..15f5041a03 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/templates/adblock-fast.pot @@ -0,0 +1,707 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/tr/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/tr/adblock-fast.po new file mode 100644 index 0000000000..60496ce259 --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/tr/adblock-fast.po @@ -0,0 +1,741 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-30 06:43+0000\n" +"Last-Translator: semih \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.2-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s şu anda devre dışı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s yüklenmemiş ya da bulunamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Aksiyon" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Etkin" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "AdBlock Fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "Tüm örneklerde AdBlock" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "AdBlock-Fast - İzin Verilen ve Engellenen Alan Adları" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "AdBlock-Fast - İzin Verilen ve Engellenen URL'leri Listeler" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "AdBlock-Fast - Yapılandırma" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "AdBlock-Fast - Durum" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "IPv6 girişleri ekle" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Engelleme listesine IPv6 girişleri ekle." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Gelişmiş Yapılandırma" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "İzin ver" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "İzin Verilen Alanlar" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" +"Kalıcı bellekte sıkıştırılmış bir blok liste önbelleği oluşturmaya çalış." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Otomatik Yapılandırma Güncellemesi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Temel Yapılandırma" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Engelle" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Engellenen Alan Adları" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "%s alanı (%s ile) engelleniyor." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Önbellek dosyası bulundu." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Sıkıştırılmış önbellek dosyası oluşturuldu." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Sıkıştırılmış önbellek dosyası bulundu." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Yapılandırma (%s) doğrulama hatası!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "Sistem günlüğünü ve konsol çıktı ayrıntı düzeyini kontrol eder." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Curl indirmeyi yeniden dene" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Curl azami dosya boyutu (bayt cinsinden)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "DNS Hizmeti" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "DNS çözümleme seçeneği, ayrıntılar için %sREADME%s bakın." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Sıkıştırılmış önbellek dosyası dizini" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"Kalıcı bellekteki blok listesinin sıkıştırılmış önbellek dosyası için dizin." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Devre dışı bırak" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Hata Ayıklamayı Devre Dışı Bırak" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Devre dışı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "%s hizmeti devre dışı bırakılıyor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "Dnsmasq Yapılandırma Dosyası URL'si" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "IPv6 girişleri ekleme" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Sıkıştırılmış önbelleği saklama" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Eşzamanlı işlemeyi kullanma" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "İndirme zaman aşımı (saniye cinsinden)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Listeler indiriliyor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Etkinleştir" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Hata ayıklamayı etkinleştir" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "/tmp/adblock-fast.log dosyasına hata ayıklama çıktısını etkinleştirir." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "%s hizmeti etkinleştiriliyor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Hata" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "Hatalarla karşılaşıldı, lütfen %sREADME%s dosyasını kontrol edin" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Başarısız" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "Paylaşılan belleğe erişilemedi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "'%s' dosyası oluşturulamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" +"Engellenenler listesi oluşturulamadı veya DNS çözümleyici yeniden " +"başlatılamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "Sıkıştırılmış önbellek oluşturulamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "%s dosyası için dizin oluşturulamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "Çıktı/önbellek/gzip dosya dizini oluşturulamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "%s biçimi algılanamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "%s indirilemedi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "Yapılandırma Güncelleme dosyası indirilemedi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "Veri dosyası biçimlendirilemedi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "'%s', '%s' konumuna taşınamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "Geçici veri dosyası '%s' dizinine taşınamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "Veri dosyası optimize edilemedi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "%s ayrıştırılamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "Yapılandırma Güncelleme dosyası ayrıştırılamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "İzin verilenler listesi işlenemedi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "DNS çözümleyici yeniden yüklenemedi/yeniden başlatılamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "Geçici dosyalar kaldırılamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "DNS çözümleyici yeniden başlatılamadı/yeniden yüklenemedi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "Veri dosyası sıralanamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "%s durdurulamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "Sıkıştırılmış önbellek paketi açılamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "DNS bağlantı noktalarını zorla:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Yeniden Yüklemeye Zorla" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Yönlendirici DNS'sini Zorla" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Yönlendirici DNS sunucusunu tüm yerel cihazlara zorla" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Yönlendirici DNS'sini zorla, yerel cihazlarda, DNS Hijacking olarak da " +"bilinir." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "Luci-app-adblock-fast için UCI ve dosya erişimi yetkisi verin" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "IPv6 Desteği" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"curl kuruluysa ve algılanırsa, bundan daha büyük dosyaları indirmeyecektir." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Curl kurulur ve algılanırsa, zaman aşımı/başarısızlık durumunda bunu birçok " +"kez indirmeyi deneyecektir." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "İzin verilecek bireysel alanlar." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Engellenecek bireysel alanlar." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "Durumu göstermek için LED" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Tüm liste indirmelerini ve işlemeyi aynı anda başlatarak hizmetin başlama " +"zamanını azaltın." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"Ayarlanmışsa, yerel cihazların kendi DNS sunucularını kullanmasına izin verin" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "dnsmasq'ta AdBlock yok" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "Cihazda HTTPS/SSL desteği yok" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "Engellenen liste URL'si veya engellenen alan adı etkin değil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Yüklü değil veya bulunamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Çıktı Ayrıntı Ayarı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Engelleme / izin listelerini indirmeden önce yapılandırma güncellemesini " +"gerçekleştirin." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "%sSystem LED Configuration%s kullanılmayan LED'i seçin." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Lütfen %s 'nin bu sistemde desteklenmediğini unutmayın." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Listeler işleniyor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Yeniden başlatılıyor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Hizmet Kontrolü" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Hizmet Hataları" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Hizmet Durumu" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Hizmet Uyarıları" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Eşzamanlı işleme" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "Boyut: %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Biraz çıktı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "Önerilen paketlerden bazıları eksik" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Başlat" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Başlıyor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "%s hizmeti başlatılıyor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Dur" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "Ayarlanan saniye kadar inmezse indirmeyi durdurun." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Durduruldu" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "%s hizmeti durduruluyor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Sıkıştırılmış önbelleği depola" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Sıkıştırılmış önbellek dosyasını yönlendiricide sakla" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Çıkışı bastır" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "%s WAN ağ geçidini bulamadı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" +"Dnsmasq ipset desteği etkin, ancak dnsmasq yüklü değil veya yüklü dnsmasq " +"ipset'i desteklemiyor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" +"Dnsmasq ipset desteği etkin, ancak ipset ya kurulu değil ya da kurulu ipset " +"'%s' tipini desteklemiyor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" +"Dnsmasq nft set desteği etkin, ancak dnsmasq yüklü değil veya yüklü dnsmasq " +"nft setini desteklemiyor" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "Dnsmasq nft setleri desteği etkin ancak nft yüklü değil" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"Harici dnsmasq yapılandırma dosyasının URL'si, ayrıntılar için %sREADME%s " +"bakın." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" +"İzin verilecek veya engellenecek listeleri içeren dosya(lar)ın URL'leri." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "Bilinmeyen" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "Şu dnsmasq örneklerinde AdBlocking kullan" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" +"Harici dnsmasq yapılandırma dosyası kullanımı algılandı, lütfen '%s' " +"seçeneğini '%s' olarak ayarlayın" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Eşzamanlı işlemeyi kullan" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Ayrıntılı çıktı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "Sürüm %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Uyarı" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "dnsmasq ek ana makineleri" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "dnsmasq yapılandırması" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "dnsmasq ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "dnsmasq nft kümesi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "dnsmasq sunucular dosyası" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "hiçbiri" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "unbound reklam engelleme listesi" diff --git a/package/luci/applications/luci-app-adblock-fast/po/uk/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/uk/adblock-fast.po new file mode 100644 index 0000000000..289e0dc38d --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/uk/adblock-fast.po @@ -0,0 +1,718 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-19 04:13+0000\n" +"Last-Translator: Oleksandr Shvets \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 5.1\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s зараз вимикнено" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s не встановлено, або не знайдено" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Дія" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Активне" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +#, fuzzy +msgid "AdBlock Fast" +msgstr "Швидкий AdBlock" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Розширена Конфігурація" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Базова конфігурація" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Заблоковані домени" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "DNS сервіс" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Вимкнути" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Увімкнути" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Увімкнути зневадження" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Помилка" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "Підтримка IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Стан сервісу" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Запустити" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Зупинити" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Зупинено" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Застереження" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "нічого" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock-fast/po/vi/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/vi/adblock-fast.po new file mode 100644 index 0000000000..a534c1617a --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/vi/adblock-fast.po @@ -0,0 +1,728 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-02 17:46+0000\n" +"Last-Translator: cuong-mudah \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s hiện đang bị vô hiệu hóa" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s chưa được cài đặt hoặc không tìm thấy" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "Hành động" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "Kích hoạt" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "AdBlock Fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "AdBlock trên tất cả" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "AdBlock-Fast - Cấu hình" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "Thêm các mục IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "Thêm các mục IPv6 vào danh sách chặn." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "Cấu hình nâng cao" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "Cho phép" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "Các miền được cho phép" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "Cố gắng tạo bộ nhớ đệm nén của danh sách chặn trong bộ nhớ cố định." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "Cập nhật cấu hình tự động" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "Cấu hình cơ bản" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "Chặn" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "Đã chặn tên miền" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "Chặn %s miền (với %s)." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "Tìm thấy tệp bộ nhớ đệm." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "Tạo tệp bộ nhớ đệm nén." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "Tìm thấy tệp bộ nhớ đệm nén." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "Kiểm tra cấu hình (%s) thất bại!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "Điều khiển độ chi tiết của nhật ký hệ thống và đầu ra bảng điều khiển." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Thử lại tải xuống curl" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Kích thước tệp tối đa của curl (theo byte)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "Dịch vụ DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "Tùy chọn giải quyết DNS, xem %sREADME%s để biết chi tiết." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "Thư mục cho tệp bộ nhớ đệm nén" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" +"Thư mục cho tệp bộ nhớ đệm nén của danh sách chặn trong bộ nhớ cố định." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "Vô hiệu hóa" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "Vô hiệu hóa gỡ lỗi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "Vô hiệu hoá" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "Vô hiệu hóa dịch vụ %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "URL tệp cấu hình Dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "Không thêm các mục IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "Không lưu trữ bộ nhớ đệm nén" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "Không sử dụng xử lý đồng thời" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "Thời gian chờ tải xuống (theo giây)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "Đang tải xuống danh sách" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "Bật lên" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "Bật gỡ lỗi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "Bật dịch vụ %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "Lỗi" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "Thất bại" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "Truy cập bộ nhớ được chia sẻ thất bại" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "Tạo file '%s' thất bại" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "Bắt buộc cổng DNS:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "Bắt buộc tải lại" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "Force Router DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "Force Router DNS server đến tất cả thiết bị nội bộ" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "" +"Force Router DNS của bộ định tuyến trên các thiết bị cục bộ, còn được gọi là " +"chiếm quyền điều khiển DNS." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "Hỗ trợ IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "" +"Nếu curl được cài đặt và phát hiện, nó sẽ không tải xuống các tệp lớn hơn số " +"này." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "" +"Nếu curl được cài đặt và phát hiện, nó sẽ thử lại tải xuống nhiều lần này " +"khi hết thời gian/chạy thất bại." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "Các miền riêng lẻ được cho phép." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "Các miền riêng lẻ bị chặn." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED để chỉ trạng thái" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "" +"Khởi chạy tải xuống và xử lý tất cả các danh sách đồng thời, giảm thời gian " +"khởi động dịch vụ." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "" +"Cho phép các thiết bị cục bộ sử dụng máy chủ DNS của riêng chúng nếu được đặt" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "Không được cài đặt hoặc không tìm thấy" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "Cài đặt độ chi tiết đầu ra" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "" +"Thực hiện cập nhật cấu hình trước khi tải xuống các danh sách chặn/cho phép." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "Chọn LED chưa được sử dụng trong %sCấu hình LED Hệ thống%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "Lưu ý rằng %s không được hỗ trợ trên hệ thống này." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "Đang xử lý danh sách" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "Đang khởi động lại" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "Điều khiển dịch vụ" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "Lỗi dịch vụ" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "Trạng thái dịch vụ" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "Cảnh báo dịch vụ" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "Xử lý đồng thời" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "Một số đầu ra" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "Bắt đầu" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "Đang bắt đầu" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "Bắt đầu dịch vụ %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "Dừng" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "Dừng tải xuống nếu nó bị treo trong số giây đã đặt." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "Đã dừng" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "Dừng dịch vụ %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "Lưu trữ bộ nhớ đệm nén" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "Lưu trữ tệp bộ nhớ đệm nén trên bộ định tuyến" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "Ngăn chặn đầu ra" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "" +"URL tới tệp cấu hình dnsmasq bên ngoài, xem %sREADME%s để biết chi tiết." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "Sử dụng xử lý đồng thời" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "Đầu ra chi tiết" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "Cảnh báo" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "các máy chủ bổ sung của dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "cấu hình dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "ipset của dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "bộ nft của dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "tệp máy chủ của dnsmasq" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "không" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "danh sách chặn quảng cáo không bị ràng buộc" diff --git a/package/luci/applications/luci-app-adblock-fast/po/zh_Hans/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/zh_Hans/adblock-fast.po new file mode 100644 index 0000000000..5489eed9fc --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/zh_Hans/adblock-fast.po @@ -0,0 +1,728 @@ +# +# Yangfl , 2018. +# Zheng Qian , 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-12-08 01:52+0000\n" +"Last-Translator: Eric \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_Hans\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.3-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s 当前已禁用" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s 未安装或未找到" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "-" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "操作" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "活跃" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "AdBlock Fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "在所有实例上实施广告拦截" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "AdBlock-Fast" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "AdBlock-Fast - 黑白域名" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "AdBlock-Fast - 黑白列表 URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "AdBlock-Fast -配置" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "AdBlock-Fast - 状态" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "添加 IPv6 条目" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "将 IPv6 条目添加到阻止列表。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "高级配置" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "允许" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "允许的域" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "尝试在非易失性内存中创建压缩的阻止列表缓存。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "自动配置更新" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "基本配置" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "拦截" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "已拦截域名" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "拦截 %s 个域名 (用 %s)。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "缓存" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "缓存文件" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "找到了缓存文件。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "无法检测剩余内存" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "压缩的缓存" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "创建了压缩的缓存文件。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "找到压缩的缓存文件。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "配置(%s)验证失败!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "控制系统日志和控制台输出的详细程度。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Curl 下载重试" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Curl 最大文件尺寸(单位 bytes)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "DNS 服务" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "DNS 解析选项,详情见 %sREADME%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "已压缩缓存文件的目录" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "保存持久化内存中拦截列表已压缩缓存文件的目录。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "禁用" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "禁用调试" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "已禁用" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "禁用 %s 服务中" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "Dnsmasq 配置文件 URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "不要添加 IPv6 条目" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "不要存储压缩的缓存" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "不要使用并行处理" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "下载超时(秒)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "下载列表中" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "启用" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "启用调试" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "将调试信息输出到 tmp/adblock-fast.log 文件。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "启用 %s 服务中" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "错误" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "遇到错误,请检查 %sREADME%s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "失败" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "访问共享内存失败" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "未能创建 '%s' 文件" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "未能创建拦截列表或重启 DNS 解析器" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "未能创建压缩缓存" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "未能为 %s 文件创建目录" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "未能创建 output/cache/gzip 文件目录" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "检测 %s 格式失败" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "未能下载 %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "未能下载配置更新文件" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "未能格式化数据文件" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "未能将 '%s' 移至 '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "未能将临时文件移至 '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "未能优化数据文件" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "解析 %s 格式失败" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "未能解析配置更新文件" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "未能处理白名单" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "未能重新加载/重启 DNS 解析器" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "未能删除临时文件" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "未能重启/重新加载 DNS 解析器" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "未能对数据文件进行排序" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "启动失败" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "未能停止 %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "未能解包压缩的缓存" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "强制 DNS 端口" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "强制使用特定 DNS 端口:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "强制刷新" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "强制使用路由器 DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "强制所有本地设备使用路由器 DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "强制重新下载 %s 个拦截清单" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "强制在本地设备上使用路由器 DNS,也称为 DNS 劫持。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "剩余内存(%s)不足以处理所有启用的黑名单列表" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "授予 luci-app-adblock-fast 模块UCI 和文件访问权限" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "IPv6 支持" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "如果安装了 curl 且被检测到,它不会下载超过这个大小的文件。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "如果安装并检测到 curl,则会在超时/失败时重试指定次数。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "允许使用单个域。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "单个域将被阻止。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "无效的压缩缓存目录 '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED 指示状态" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "同时开始所有的列表下载和处理任务,减少启动时间。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "如果进行了设置,允许本地设备使用自己的 DNS 服务器" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "SmartDNS 上没有 Adblock" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "dnsmasq 上无 AdBlock" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "设备不支持 HTTPS/SSL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "未启用黑名单网址和黑名单" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "未安装或未找到" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "输出详细程度设置" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "暂停" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "正在暂停 %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "在下载阻止/允许列表之前执行配置更新。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "选取尚未在 %s 系统 LED 配置%s 中使用的 LED。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "请注意,此系统不支持%s。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "处理列表中" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "已重新下载" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "正在重新启动" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "服务控制" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "服务出错" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "服务状态" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "服务警告" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "并行处理" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "大小" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "大小:%s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "一些输出" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "缺少某些推荐包" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "启动" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "正在启动" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "启动 %s 服务中" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "状态" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "停止" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "如果下载停顿了指定的秒数则停止下载。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "已停止" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "停止 %s 服务中" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "存储压缩的缓存" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "将压缩的缓存文件存储在路由器上" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "抑制输出" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "%s 未能发现 WAN 网关" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" +"已启用 dnsmasq ipset 支持,但要么没安装 dnsmasq ,要么已安装的 dnsmasq 不支" +"持 ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" +"已启用 dnsmasq ipset 支持,但要么没安装 ipset,要么已安装的 ipset 不支持 " +"'%s' 类型" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" +"已启用 dnsmasq nft set 支持,但要么没安装 dnsmasq,要么已安装的 dnsmasq 不支" +"持 nft set" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "已启用 dnsmasq nft sets 支持,但未安装 nft" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "URL" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "外部 dnsmasq 配置文件 URL,详情见 %sREADME%s." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "包含黑白名单文件的 URL 地址。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "未知" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "在 SmartDNS 实例上使用广告拦截" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "在 dnsmasq 实例上使用广告拦截" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "检测到使用了外部 dnsmasq 配置文件,请将 '%s' 选项设为 '%s'" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "使用并行处理" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "详细输出" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "版本" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "版本 %s" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "警告" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "dnsmasq 附加 hosts" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "dnsmasq 配置" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "dnsmasq ip集" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "dnsmasq nft 集" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "dnsmasq 服务器文件" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "无" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "smartdns 域名集" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "smartdns ip集" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "smartdns nft 集" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "unbound 广告拦截列表" diff --git a/package/luci/applications/luci-app-adblock-fast/po/zh_Hant/adblock-fast.po b/package/luci/applications/luci-app-adblock-fast/po/zh_Hant/adblock-fast.po new file mode 100644 index 0000000000..c1c52611cd --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/po/zh_Hant/adblock-fast.po @@ -0,0 +1,719 @@ +# +# Yangfl , 2018. +# +msgid "" +msgstr "" +"PO-Revision-Date: 2023-08-06 10:10+0000\n" +"Last-Translator: Trevor \n" +"Language-Team: Chinese (Traditional) \n" +"Language: zh_Hant\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:241 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304 +msgid "%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:225 +msgid "%s is currently disabled" +msgstr "%s 目前已禁用" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:106 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:51 +msgid "%s is not installed or not found" +msgstr "%s 未安裝或找不到" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:97 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:98 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:99 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:100 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:101 +msgid "-" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:514 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:116 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:61 +msgid "Active" +msgstr "已啓用" + +#: applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json:3 +msgid "AdBlock Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:198 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:260 +msgid "AdBlock on all instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:261 +msgid "AdBlock on select instances" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:22 +msgid "AdBlock-Fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:465 +msgid "AdBlock-Fast - Allowed and Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489 +msgid "AdBlock-Fast - Allowed and Blocked Lists URLs" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:59 +msgid "AdBlock-Fast - Configuration" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:119 +msgid "AdBlock-Fast - Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:367 +msgid "Add IPv6 entries" +msgstr "加入 IPv6 項目" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:364 +msgid "Add IPv6 entries to block-list." +msgstr "加入 IPv6 項目到封鎖清單。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:62 +msgid "Advanced Configuration" +msgstr "高級配置" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Allow" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473 +msgid "Allowed Domains" +msgstr "允許的網域" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:428 +msgid "" +"Attempt to create a compressed cache of block-list in the persistent memory." +msgstr "嘗試在持久性記憶體中創建區塊列表的壓縮快取。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:352 +msgid "Automatic Config Update" +msgstr "自動組態更新" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:61 +msgid "Basic Configuration" +msgstr "基本配置" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520 +msgid "Block" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:87 +msgid "Blocked Domains" +msgstr "封鎖的域名" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:132 +msgid "Blocking %s domains (with %s)." +msgstr "封鎖 %s 個網域 (用 %s)。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:88 +msgid "Cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:66 +msgid "Cache file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:158 +msgid "Cache file found." +msgstr "已找到快取檔案。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:195 +msgid "Can't detect free RAM" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:68 +msgid "Compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:137 +msgid "Compressed cache file created." +msgstr "已建立快取壓縮檔案。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:160 +msgid "Compressed cache file found." +msgstr "找到壓縮的快取文件。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:223 +msgid "Config (%s) validation failure!" +msgstr "設定 (%s) 驗證失敗!" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:325 +msgid "Controls system log and console output verbosity." +msgstr "控制系統日誌和主控台輸出的詳細程度。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:401 +msgid "Curl download retry" +msgstr "Curl 下載重試" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:388 +msgid "Curl maximum file size (in bytes)" +msgstr "Curl 最大的檔案限制(位元)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:143 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:86 +msgid "DNS Service" +msgstr "DNS服務" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:65 +msgid "DNS resolution option, see the %sREADME%s for details." +msgstr "DNS 解析選項,請參考%sREADME%s之詳細。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:439 +msgid "Directory for compressed cache file" +msgstr "已壓縮快取的目錄" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:441 +msgid "" +"Directory for compressed cache file of block-list in the persistent memory." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:424 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355 +msgid "Disable" +msgstr "停用" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:457 +msgid "Disable Debugging" +msgstr "禁用除錯" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:154 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:418 +msgid "Disabling %s service" +msgstr "正在停用 %s 服務" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:175 +msgid "Dnsmasq Config File URL" +msgstr "Dnsmasq 設定檔案的網址" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:366 +msgid "Do not add IPv6 entries" +msgstr "不要加入 IPv6 項目" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:431 +msgid "Do not store compressed cache" +msgstr "不存儲壓縮的快取" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:418 +msgid "Do not use simultaneous processing" +msgstr "不要使用同步處理" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:378 +msgid "Download time-out (in seconds)" +msgstr "下載超時(秒)" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:114 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:57 +msgid "Downloading lists" +msgstr "下載清單" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:405 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:510 +msgid "Enable" +msgstr "啟用" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:454 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:458 +msgid "Enable Debugging" +msgstr "啟用除錯" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:455 +msgid "Enables debug output to /tmp/adblock-fast.log." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:399 +msgid "Enabling %s service" +msgstr "正在啟用 %s 服務" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:58 +msgid "Error" +msgstr "錯誤" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:298 +msgid "Errors encountered, please check the %sREADME%s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:60 +msgid "Fail" +msgstr "失敗" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:248 +msgid "Failed to access shared memory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:244 +msgid "Failed to create '%s' file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:266 +msgid "Failed to create block-list or restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:257 +msgid "Failed to create compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:243 +msgid "Failed to create directory for %s file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:278 +msgid "Failed to create output/cache/gzip file directory" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:280 +msgid "Failed to detect format %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:273 +msgid "Failed to download %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:271 +msgid "Failed to download Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:252 +msgid "Failed to format data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:261 +msgid "Failed to move '%s' to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:254 +msgid "Failed to move temporary data file to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:250 +msgid "Failed to optimize data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:275 +msgid "Failed to parse %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:274 +msgid "Failed to parse Config Update file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:251 +msgid "Failed to process allow-list" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:269 +msgid "Failed to reload/restart DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:259 +msgid "Failed to remove temporary files" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:247 +msgid "Failed to restart/reload DNS resolver" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:249 +msgid "Failed to sort data file" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:115 +msgid "Failed to start" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:268 +msgid "Failed to stop %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:260 +msgid "Failed to unpack compressed cache" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:89 +msgid "Force DNS Ports" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:140 +msgid "Force DNS ports:" +msgstr "強制使用DNS端口:" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:113 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:56 +msgid "Force Reloading" +msgstr "強制重新載入中" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:313 +msgid "Force Router DNS" +msgstr "強制使用路由器 DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:317 +msgid "Force Router DNS server to all local devices" +msgstr "強制所有本地裝置使用路由器 DNS" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:346 +msgid "Force redownloading %s block lists" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314 +msgid "Forces Router DNS use on local devices, also known as DNS Hijacking." +msgstr "強制在本地裝置上使用路由器 DNS,也稱為 DNS 劫持。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:285 +msgid "Free ram (%s) is not enough to process all enabled block-lists" +msgstr "" + +#: applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json:3 +msgid "Grant UCI and file access for luci-app-adblock-fast" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:363 +msgid "IPv6 Support" +msgstr "支援 IPv6" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:390 +msgid "" +"If curl is installed and detected, it would not download files bigger than " +"this." +msgstr "如果已安裝並檢測到curl,則不會下載比這個更大的檔案。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:403 +msgid "" +"If curl is installed and detected, it would retry download this many times " +"on timeout/fail." +msgstr "如果已安裝並檢測到curl,則會在逾時/失敗時重試多次下載。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:474 +msgid "Individual domains to be allowed." +msgstr "允許使用單個網域。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:482 +msgid "Individual domains to be blocked." +msgstr "單個網域將被阻擋." + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:193 +msgid "Invalid compressed cache directory '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:337 +msgid "LED to indicate status" +msgstr "LED 指示狀態" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415 +msgid "" +"Launch all lists downloads and processing simultaneously, reducing service " +"start time." +msgstr "同時啟動所有列表下載和處理,從而縮短了服務啟動時間。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316 +msgid "Let local devices use their own DNS servers if set" +msgstr "如果進行了設定,允許本地裝置使用自己的 DNS 伺服器" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262 +msgid "No AdBlock on SmartDNS" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:200 +msgid "No AdBlock on dnsmasq" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:276 +msgid "No HTTPS/SSL support on device" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:282 +msgid "No blocked list URLs nor blocked-domains enabled" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:174 +msgid "Not installed or not found" +msgstr "未安裝或未找到" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:324 +msgid "Output Verbosity Setting" +msgstr "輸出詳細程度設定" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:367 +msgid "Pause" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:362 +msgid "Pausing %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:353 +msgid "Perform config update before downloading the block/allow-lists." +msgstr "下載封鎖/允許清單前執行組態更新。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:339 +msgid "Pick the LED not already used in %sSystem LED Configuration%s." +msgstr "選擇 %s系統 LED 組態%s 中尚未使用的 LED。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:288 +msgid "Pick the SmartDNS instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:227 +msgid "Pick the dnsmasq instance(s) for AdBlocking" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:73 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:78 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:83 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:88 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:95 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:102 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:118 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:125 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:134 +msgid "Please note that %s is not supported on this system." +msgstr "請注意:此系統不支援 %s。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:111 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:54 +msgid "Processing lists" +msgstr "處理清單" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:352 +msgid "Redownload" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:112 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:55 +msgid "Restarting" +msgstr "重新啟動中" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465 +msgid "Service Control" +msgstr "服務控制" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:291 +msgid "Service Errors" +msgstr "服務出錯" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:123 +msgid "Service Status" +msgstr "服務狀態" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:200 +msgid "Service Warnings" +msgstr "服務警告" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:413 +msgid "Simultaneous processing" +msgstr "同時處理中" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:497 +msgid "Size" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:507 +msgid "Size: %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328 +msgid "Some output" +msgstr "一些輸出" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:190 +msgid "Some recommended packages are missing" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:333 +msgid "Start" +msgstr "啟動" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:110 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:53 +msgid "Starting" +msgstr "開始中" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:327 +msgid "Starting %s service" +msgstr "正在啟動 %s 服務" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:84 +msgid "Status" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:386 +msgid "Stop" +msgstr "停止" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:379 +msgid "Stop the download if it is stalled for set number of seconds." +msgstr "如果下載停頓了指定的秒數,請停止下載。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:109 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:52 +msgid "Stopped" +msgstr "已停止" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:380 +msgid "Stopping %s service" +msgstr "正在停止 %s 服務" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:432 +msgid "Store compressed cache" +msgstr "存儲壓縮的快取" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:426 +msgid "Store compressed cache file on router" +msgstr "將壓縮的快取文件存儲在路由器上" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:327 +msgid "Suppress output" +msgstr "抑制輸出" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:241 +msgid "The %s failed to discover WAN gateway" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:229 +msgid "" +"The dnsmasq ipset support is enabled, but dnsmasq is either not installed or " +"installed dnsmasq does not support ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:232 +msgid "" +"The dnsmasq ipset support is enabled, but ipset is either not installed or " +"installed ipset does not support '%s' type" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:235 +msgid "" +"The dnsmasq nft set support is enabled, but dnsmasq is either not installed " +"or installed dnsmasq does not support nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:238 +msgid "The dnsmasq nft sets support is enabled, but nft is not installed" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:523 +msgid "URL" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:177 +msgid "" +"URL to the external dnsmasq config file, see the %sREADME%s for details." +msgstr "指向外部 dnsmasq 設置檔案的網址,請參考 %sREADME%s 之詳細內容。" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:490 +msgid "URLs to file(s) containing lists to be allowed or blocked." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501 +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:95 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:252 +msgid "Use AdBlocking on the SmartDNS instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:190 +msgid "Use AdBlocking on the dnsmasq instance(s)" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:187 +msgid "" +"Use of external dnsmasq config file detected, please set '%s' option to '%s'" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:419 +msgid "Use simultaneous processing" +msgstr "使用同步處理" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:329 +msgid "Verbose output" +msgstr "詳細輸出" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:85 +msgid "Version" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:126 +msgid "Version %s" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:59 +msgid "Warning" +msgstr "警告" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:254 +msgid "" +"You can limit the AdBlocking to the specific SmartDNS instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:192 +msgid "" +"You can limit the AdBlocking to the specific dnsmasq instance(s) (%smore " +"information%s)." +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:147 +msgid "dnsmasq additional hosts" +msgstr "dnsmasq 的額外主機" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:148 +msgid "dnsmasq config" +msgstr "dnsmasq 設置" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:150 +msgid "dnsmasq ipset" +msgstr "dnsmasq ipset" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:153 +msgid "dnsmasq nft set" +msgstr "dnsmasq nft set" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:155 +msgid "dnsmasq servers file" +msgstr "dnsmasq 服務器檔案設置" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:342 +msgid "none" +msgstr "無" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:158 +msgid "smartdns domain set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:160 +msgid "smartdns ipset" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:163 +msgid "smartdns nft set" +msgstr "" + +#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:167 +msgid "unbound adblock list" +msgstr "unbound 廣告攔截清單" diff --git a/package/luci/applications/luci-app-adblock-fast/root/etc/uci-defaults/40_luci-adblock-fast b/package/luci/applications/luci-app-adblock-fast/root/etc/uci-defaults/40_luci-adblock-fast new file mode 100644 index 0000000000..080086891a --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/root/etc/uci-defaults/40_luci-adblock-fast @@ -0,0 +1,4 @@ +#!/bin/sh +rm -rf /var/luci-modulecache/; rm -f /var/luci-indexcache; +[ -x /etc/init.d/rpcd ] && /etc/init.d/rpcd reload; +exit 0 diff --git a/package/luci/applications/luci-app-adblock-fast/root/usr/libexec/rpcd/luci.adblock-fast b/package/luci/applications/luci-app-adblock-fast/root/usr/libexec/rpcd/luci.adblock-fast new file mode 100755 index 0000000000..63c50c403d --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/root/usr/libexec/rpcd/luci.adblock-fast @@ -0,0 +1,319 @@ +#!/bin/sh +# Copyright 2023 MOSSDeF, Stan Grishin (stangri@melmac.ca) +# shellcheck disable=SC2018,SC2019,SC3043,SC3060 + +# TechRef: https://openwrt.org/docs/techref/rpcd +# TESTS +# ubus -v list luci.adblock-fast +# ubus -S call luci.adblock-fast getFileUrlFilesizes '{"name": "adblock-fast" }' +# ubus -S call luci.adblock-fast getInitList '{"name": "adblock-fast" }' +# ubus -S call luci.adblock-fast getInitStatus '{"name": "adblock-fast" }' +# ubus -S call luci.adblock-fast getPlatformSupport '{"name": "adblock-fast" }' +# ubus -S call luci.adblock-fast setInitAction '{"name": "adblock-fast", "action": "start" }' +# ubus -S call luci.adblock-fast setInitAction '{"name": "adblock-fast", "action": "dl" }' +# ubus -S call luci.adblock-fast setInitAction '{"name": "adblock-fast", "action": "pause" }' +# ubus -S call luci.adblock-fast setInitAction '{"name": "adblock-fast", "action": "stop" }' + +readonly adbFunctionsFile='/etc/init.d/adblock-fast' +if [ -s "$adbFunctionsFile" ]; then +# shellcheck source=../../../../../adblock-fast/files/etc/init.d/adblock-fast + . "$adbFunctionsFile" +else + logger -t adblock-fast 'error' "adblock-fast init.d file ($adbFunctionsFile) not found!" + print_json_string 'error' "adblock-fast init.d file ($adbFunctionsFile) not found!" +fi + +get_file_url_filesizes() { + _get_file_url_size() { + local url size + config_get url "$1" 'url' + config_get size "$1" 'size' + [ -n "$size" ] || size="$(get_url_filesize "$url")" + json_add_object + json_add_string 'url' "$url" + json_add_int 'size' "$size" + json_close_object + } + local name="$1" i + json_init + json_add_object "$name" + json_add_array 'sizes' + config_load "$name" + config_foreach _get_file_url_size 'file_url' + json_close_array + json_close_object + json_dump + json_cleanup +} + +get_init_list() { + local name + name="$(basename "$1")" + name="${name:-$packageName}" + json_init + json_add_object "$name" + json_add_boolean 'enabled' "$(is_enabled "$name")" + if is_running "$name"; then + json_add_boolean 'running' '1' + else + json_add_boolean 'running' '0' + fi + json_close_object + json_dump + json_cleanup +} + +set_init_action() { + local name action="$2" cmd + name="$(basename "$1")" + name="${name:-$packageName}" + if [ ! -f "/etc/init.d/$name" ]; then + print_json_string 'error' 'Init script not found!' + return + fi + case $action in + enable) + cmd="/etc/init.d/${name} ${action}" + cmd="${cmd} && uci_set ${name} config enabled 1 && uci_commit $name" + ;; + disable) + cmd="/etc/init.d/${name} ${action}" + cmd="${cmd} && uci_set ${name} config enabled 0 && uci_commit $name" + ;; + start|stop|reload|restart|dl|pause) + cmd="/etc/init.d/${name} ${action}" + ;; + esac + if [ -n "$cmd" ] && eval "$cmd" >/dev/null 2>&1; then + print_json_bool "result" '1' + else + print_json_bool "result" '0' + fi +} + +get_init_status() { + local name + name="$(basename "$1")" + name="${name:-$packageName}" + local errors warnings ports dns outputFile outputCache outputGzip outputConfig + local i j +# shellcheck disable=SC2034 + local compressed_cache_dir + config_load "$name" + config_get compressed_cache_dir 'config' 'compressed_cache_dir' '/etc' + compressed_cache_dir="$(sanitize_dir "$compressed_cache_dir")" + compressed_cache_dir="${compressed_cache_dir:-/etc}" + if [ -n "$(uci_get "$packageName" 'config' 'dnsmasq_config_file_url')" ]; then + dns="dnsmasq.conf" + else + dns="$(uci_get "$packageName" 'config' 'dns' 'dnsmasq.servers')" + fi + + dns_set_output_values "$dns" + + json_init + json_add_object "$name" + json_add_boolean 'enabled' "$(is_enabled "$name")" + json_add_string 'status' "$(json 'get' 'status')" + if is_running "$name"; then + json_add_boolean 'running' '1' + else + json_add_boolean 'running' '0' + fi + json_add_string 'version' "$(get_version "$name")" + errors="$(ubus_get_data errors)" + json_add_array 'errors' + if [ -n "$errors" ]; then + for i in $errors; do + if str_contains "$i" '|'; then + error_extra="${i##*|}" + error_id="${i%|*}" + else + error_id="$i" + unset error_extra + fi + json_add_object + json_add_string 'id' "$error_id" + json_add_string 'extra' "$error_extra" + json_close_object + done + fi + json_close_array + warnings="$(ubus_get_data warnings)" + json_add_array 'warnings' + if [ -n "$warnings" ]; then + for i in $warnings; do + if str_contains "$i" '|'; then + error_extra="${i##*|}" + error_id="${i%|*}" + else + error_id="$i" + unset error_extra + fi + json_add_object + json_add_string 'id' "$error_id" + json_add_string 'extra' "$error_extra" + json_close_object + done + fi + json_close_array + + ports="$(ubus_get_ports)" + if [ -n "$ports" ]; then + json_add_boolean 'force_dns_active' '1' + json_add_array 'force_dns_ports' + for i in $ports; do json_add_int '' "$i"; done + json_close_array + else + json_add_boolean 'force_dns_active' '0' + fi + json_add_int 'entries' "$(ubus_get_data entries)" + json_add_string 'dns' "$dns" + json_add_string 'outputFile' "$outputFile" + json_add_string 'outputCache' "$outputCache" + json_add_string 'outputGzip' "$outputGzip" + if [ -s "$outputFile" ]; then + json_add_boolean 'outputFileExists' '1' + else + json_add_boolean 'outputFileExists' '0' + fi + if [ -s "$outputCache" ]; then + json_add_boolean 'outputCacheExists' '1' + else + json_add_boolean 'outputCacheExists' '0' + fi + if [ -s "$outputGzip" ]; then + json_add_boolean 'outputGzipExists' '1' + else + json_add_boolean 'outputGzipExists' '0' + fi + json_add_array 'leds' + for i in /sys/class/leds/*; do json_add_string '' "$(basename "$i")"; done + json_close_array + json_close_object + json_dump + json_cleanup +} + +get_platform_support() { + local name + name="$(basename "$1")" + name="${name:-$packageName}" + json_init + json_add_object "$name" + if check_ipset; then + json_add_boolean 'ipset_installed' '1' + else + json_add_boolean 'ipset_installed' '0' + fi + if check_nft; then + json_add_boolean 'nft_installed' '1' + else + json_add_boolean 'nft_installed' '0' + fi + if check_dnsmasq; then + json_add_boolean 'dnsmasq_installed' '1' + else + json_add_boolean 'dnsmasq_installed' '0' + fi + if check_dnsmasq_ipset; then + json_add_boolean 'dnsmasq_ipset_support' '1' + else + json_add_boolean 'dnsmasq_ipset_support' '0' + fi + if check_dnsmasq_nftset; then + json_add_boolean 'dnsmasq_nftset_support' '1' + else + json_add_boolean 'dnsmasq_nftset_support' '0' + fi + if check_smartdns; then + json_add_boolean 'smartdns_installed' '1' + else + json_add_boolean 'smartdns_installed' '0' + fi + if check_smartdns_ipset; then + json_add_boolean 'smartdns_ipset_support' '1' + else + json_add_boolean 'smartdns_ipset_support' '0' + fi + if check_smartdns_nftset; then + json_add_boolean 'smartdns_nftset_support' '1' + else + json_add_boolean 'smartdns_nftset_support' '0' + fi + if check_unbound; then + json_add_boolean 'unbound_installed' '1' + else + json_add_boolean 'unbound_installed' '0' + fi + json_add_array 'leds' + for i in /sys/class/leds/*; do json_add_string '' "$(basename "$i")"; done + json_close_array + json_close_object + json_dump + json_cleanup +} + +case "$1" in + list) + json_init + json_add_object "getFileUrlFilesizes" + json_add_string 'name' 'name' + json_close_object + json_add_object "getInitList" + json_add_string 'name' 'name' + json_close_object + json_add_object "getInitStatus" + json_add_string 'name' 'name' + json_close_object + json_add_object "getPlatformSupport" + json_add_string 'name' 'name' + json_close_object + json_add_object "setInitAction" + json_add_string 'name' 'name' + json_add_string 'action' 'action' + json_close_object + json_dump + json_cleanup + ;; + call) + case "$2" in + getFileUrlFilesizes) + read -r input + json_load "$input" + json_get_var name 'name' + json_cleanup + get_file_url_filesizes "$name" + ;; + getInitList) + read -r input + json_load "$input" + json_get_var name 'name' + json_cleanup + get_init_list "$name" + ;; + getInitStatus) + read -r input + json_load "$input" + json_get_var name 'name' + json_cleanup + get_init_status "$name" + ;; + getPlatformSupport) + read -r input + json_load "$input" + json_get_var name 'name' + json_cleanup + get_platform_support "$name" + ;; + setInitAction) + read -r input + json_load "$input" + json_get_var name 'name' + json_get_var action 'action' + json_cleanup + set_init_action "$name" "$action" + ;; + esac + ;; +esac diff --git a/package/luci/applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json b/package/luci/applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json new file mode 100644 index 0000000000..542a75988c --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/root/usr/share/luci/menu.d/luci-app-adblock-fast.json @@ -0,0 +1,17 @@ +{ + "admin/services/adblock-fast": { + "title": "AdBlock Fast", + "action": { + "type": "view", + "path": "adblock-fast/overview" + }, + "depends": { + "acl": [ + "luci-app-adblock-fast" + ], + "uci": { + "adblock-fast": true + } + } + } +} diff --git a/package/luci/applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json b/package/luci/applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json new file mode 100644 index 0000000000..df272abe1c --- /dev/null +++ b/package/luci/applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json @@ -0,0 +1,35 @@ +{ + "luci-app-adblock-fast": { + "description": "Grant UCI and file access for luci-app-adblock-fast", + "read": { + "file": { + "/dev/shm/adblock-fast.config": [ "list", "read" ], + "/dev/shm/adblock-fast.error": [ "list", "read" ], + "/dev/shm/adblock-fast.status": [ "list", "read" ] + }, + "ubus": { + "luci.adblock-fast": [ + "getFileUrlFilesizes", + "getInitList", + "getInitStatus", + "getPlatformSupport" + ] + }, + "uci": [ + "adblock-fast", + "dhcp", + "smartdns" + ] + }, + "write": { + "uci": [ + "adblock-fast" + ], + "ubus": { + "luci.adblock-fast": [ + "setInitAction" + ] + } + } + } +} diff --git a/package/luci/applications/luci-app-adblock/Makefile b/package/luci/applications/luci-app-adblock/Makefile new file mode 100644 index 0000000000..0d4bc93949 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/Makefile @@ -0,0 +1,14 @@ +# Copyright 2017-2023 Dirk Brenken (dev@brenken.org) +# This is free software, licensed under the Apache License, Version 2.0 + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI support for Adblock +LUCI_DEPENDS:=+adblock +LUCI_PKGARCH:=all + +PKG_LICENSE:=Apache-2.0 + +include ../../luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js b/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js new file mode 100644 index 0000000000..1f657651ba --- /dev/null +++ b/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js @@ -0,0 +1,37 @@ +'use strict'; +'require view'; +'require fs'; +'require ui'; + +return view.extend({ + load: function() { + return L.resolveDefault(fs.read_direct('/etc/adblock/adblock.blacklist'), ''); + }, + handleSave: function(ev) { + var value = ((document.querySelector('textarea').value || '').trim().toLowerCase().replace(/\r\n/g, '\n')) + '\n'; + return fs.write('/etc/adblock/adblock.blacklist', value) + .then(function(rc) { + document.querySelector('textarea').value = value; + ui.addNotification(null, E('p', _('Blacklist changes have been saved. Refresh your adblock lists that changes take effect.')), 'info'); + }).catch(function(e) { + ui.addNotification(null, E('p', _('Unable to save changes: %s').format(e.message))); + }); + }, + render: function(blacklist) { + return E([ + E('p', {}, + _('This is the local adblock blacklist to always-deny certain (sub) domains.
    \ + Please note: add only one domain per line. Comments introduced with \'#\' are allowed - ip addresses, wildcards and regex are not.')), + E('p', {}, + E('textarea', { + 'style': 'width: 100% !important; padding: 5px; font-family: monospace', + 'spellcheck': 'false', + 'wrap': 'off', + 'rows': 25 + }, [ blacklist != null ? blacklist : '' ]) + ) + ]); + }, + handleSaveApply: null, + handleReset: null +}); diff --git a/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js b/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js new file mode 100644 index 0000000000..010e728cf1 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js @@ -0,0 +1,364 @@ +'use strict'; +'require view'; +'require fs'; +'require ui'; + +/* + button handling +*/ +function handleAction(ev) { + if (ev.target && ev.target.getAttribute('name') === 'blacklist') { + L.ui.showModal(_('Add Blacklist Domain'), [ + E('p', _('Add this (sub-)domain to your local blacklist.')), + E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [ + E('label', { 'class': 'cbi-input-text', 'style': 'padding-top:.5em' }, [ + E('input', { 'class': 'cbi-input-text', 'style': 'width:300px', 'spellcheck': 'false', 'id': 'blacklist', 'value': ev.target.getAttribute('value') }, []) + ]) + ]), + E('div', { 'class': 'right' }, [ + E('button', { + 'class': 'btn cbi-button', + 'click': L.hideModal + }, _('Cancel')), + ' ', + E('button', { + 'class': 'btn cbi-button-action', + 'click': ui.createHandlerFn(this, function(ev) { + L.resolveDefault(fs.read_direct('/etc/adblock/adblock.blacklist'), '') + .then(function(res) { + var domain = document.getElementById('blacklist').value.trim().toLowerCase().replace(/[^a-z0-9\.\-]/g,''); + var pattern = new RegExp('^' + domain.replace(/[\.]/g,'\\.') + '$', 'm'); + if (res.search(pattern) === -1) { + var blacklist = res + domain + '\n'; + fs.write('/etc/adblock/adblock.blacklist', blacklist); + ui.addNotification(null, E('p', _('Blacklist changes have been saved. Refresh your adblock lists that changes take effect.')), 'info'); + } + L.hideModal(); + }); + }) + }, _('Save')) + ]) + ]); + document.getElementById('blacklist').focus(); + } + + if (ev.target && ev.target.getAttribute('name') === 'whitelist') { + L.ui.showModal(_('Add Whitelist Domain'), [ + E('p', _('Add this (sub-)domain to your local whitelist.')), + E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [ + E('label', { 'class': 'cbi-input-text', 'style': 'padding-top:.5em' }, [ + E('input', { 'class': 'cbi-input-text', 'style': 'width:300px', 'spellcheck': 'false', 'id': 'whitelist', 'value': ev.target.getAttribute('value') }, []) + ]) + ]), + E('div', { 'class': 'right' }, [ + E('button', { + 'class': 'btn cbi-button', + 'click': L.hideModal + }, _('Cancel')), + ' ', + E('button', { + 'class': 'btn cbi-button-action', + 'click': ui.createHandlerFn(this, function(ev) { + L.resolveDefault(fs.read_direct('/etc/adblock/adblock.whitelist'), '') + .then(function(res) { + var domain = document.getElementById('whitelist').value.trim().toLowerCase().replace(/[^a-z0-9\.\-]/g,''); + var pattern = new RegExp('^' + domain.replace(/[\.]/g,'\\.') + '$', 'm'); + if (res.search(pattern) === -1) { + var whitelist = res + domain + '\n'; + fs.write('/etc/adblock/adblock.whitelist', whitelist); + ui.addNotification(null, E('p', _('Whitelist changes have been saved. Refresh your adblock lists that changes take effect.')), 'info'); + } + L.hideModal(); + }); + }) + }, _('Save')) + ]) + ]); + document.getElementById('whitelist').focus(); + } + + if (ev === 'query') { + L.ui.showModal(_('Blocklist Query'), [ + E('p', _('Query active blocklists and backups for a specific domain.')), + E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [ + E('label', { 'style': 'padding-top:.5em', 'id': 'run' }, [ + E('input', { + 'class': 'cbi-input-text', + 'placeholder': 'google.com', + 'style': 'width:300px', + 'spellcheck': 'false', + 'id': 'search' + }) + ]) + ]), + E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [ + '\xa0', + E('h5', _('Result')), + E('textarea', { + 'id': 'result', + 'style': 'width: 100% !important; padding: 5px; font-family: monospace', + 'readonly': 'readonly', + 'wrap': 'off', + 'rows': 20 + }) + ]), + E('div', { 'class': 'right' }, [ + E('button', { + 'class': 'btn cbi-button', + 'click': L.hideModal + }, _('Cancel')), + ' ', + E('button', { + 'class': 'btn cbi-button-action', + 'click': ui.createHandlerFn(this, function(ev) { + var domain = document.getElementById('search').value.trim().toLowerCase().replace(/[^a-z0-9\.\-]/g,''); + if (domain) { + document.getElementById('run').classList.add("spinning"); + document.getElementById('search').value = domain; + document.getElementById('result').textContent = 'The query is running, please wait...'; + L.resolveDefault(fs.exec_direct('/etc/init.d/adblock', ['query', domain])).then(function(res) { + var result = document.getElementById('result'); + if (res) { + result.textContent = res.trim(); + } else { + result.textContent = _('No Query results!'); + } + document.getElementById('run').classList.remove("spinning"); + document.getElementById('search').value = ''; + }) + } + document.getElementById('search').focus(); + }) + }, _('Query')) + ]) + ]); + document.getElementById('search').focus(); + } + + if (ev === 'refresh') { + L.ui.showModal(_('Refresh DNS Report'), [ + E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [ + E('label', { 'class': 'cbi-input-select', 'style': 'padding-top:.5em' }, [ + E('select', { 'class': 'cbi-input-select', 'id': 'top_count' }, [ + E('option', { 'value': '10' }, '10'), + E('option', { 'value': '20' }, '20'), + E('option', { 'value': '30' }, '30'), + E('option', { 'value': '40' }, '40'), + E('option', { 'value': '50' }, '50') + ]), + '\xa0\xa0\xa0', + _('max. top statistics') + ]) + ]), + E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [ + E('label', { 'class': 'cbi-input-select', 'style': 'padding-top:.5em' }, [ + E('select', { 'class': 'cbi-input-select', 'id': 'res_count' }, [ + E('option', { 'value': '50' }, '50'), + E('option', { 'value': '100' }, '100'), + E('option', { 'value': '150' }, '150'), + E('option', { 'value': '250' }, '250'), + E('option', { 'value': '500' }, '500') + ]), + '\xa0\xa0\xa0', + _('max. result set size') + ]) + ]), + E('label', { 'class': 'cbi-input-text', 'style': 'padding-top:.5em' }, [ + E('input', { 'class': 'cbi-input-text', 'spellcheck': 'false', 'id': 'search' }, [ + ]), + '\xa0\xa0\xa0', + _('Filter criteria like date, domain or client (optional)') + ]), + E('div', { 'class': 'right' }, [ + E('button', { + 'class': 'btn cbi-button', + 'click': L.hideModal + }, _('Cancel')), + ' ', + E('button', { + 'class': 'btn cbi-button-action', + 'id': 'refresh', + 'click': ui.createHandlerFn(this, async function(ev) { + var top_count = document.getElementById('top_count').value; + var res_count = document.getElementById('res_count').value; + var search = document.getElementById('search').value.trim().replace(/[^\w\.\-\:]/g,'') || '+'; + L.resolveDefault(fs.exec_direct('/etc/init.d/adblock', ['report', 'gen', top_count, res_count, search]),''); + var running = 1; + while (running === 1) { + await new Promise(r => setTimeout(r, 1000)); + L.resolveDefault(fs.read_direct('/var/run/adblock.pid')).then(function(res) { + if (!res) { + running = 0; + } + }) + } + L.hideModal(); + location.reload(); + }) + }, _('Refresh')) + ]) + ]); + document.getElementById('refresh').focus(); + } +} + +return view.extend({ + load: function() { + return L.resolveDefault(fs.exec_direct('/etc/init.d/adblock', ['report', 'json', '10', '50', '+']),''); + }, + + render: function(dnsreport) { + if (!dnsreport) { + dnsreport = '{}'; + }; + var content; + content = JSON.parse(dnsreport); + + var rows_top = []; + var tbl_top = E('table', { 'class': 'table', 'id': 'top_10' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th right' }, _('Count')), + E('th', { 'class': 'th' }, _('Clients')), + E('th', { 'class': 'th right' }, _('Count')), + E('th', { 'class': 'th' }, _('Domains')), + E('th', { 'class': 'th right' }, _('Count')), + E('th', { 'class': 'th' }, _('Blocked Domains')) + ]) + ]); + + var max = 0; + if (content.top_clients && content.top_domains && content.top_blocked) { + max = Math.max(content.top_clients.length, content.top_domains.length, content.top_blocked.length); + } + for (var i = 0; i < max; i++) { + var a_cnt = '\xa0', a_addr = '\xa0', b_cnt = '\xa0', b_addr = '\xa0', c_cnt = '\xa0', c_addr = '\xa0'; + if (content.top_clients[i]) { + a_cnt = content.top_clients[i].count; + } + if (content.top_clients[i]) { + a_addr = content.top_clients[i].address; + } + if (content.top_domains[i]) { + b_cnt = content.top_domains[i].count; + } + if (content.top_domains[i]) { + b_addr = '' + content.top_domains[i].address + ''; + } + if (content.top_blocked[i]) { + c_cnt = content.top_blocked[i].count; + } + if (content.top_blocked[i]) { + c_addr = '' + content.top_blocked[i].address + ''; + } + rows_top.push([ + a_cnt, + a_addr, + b_cnt, + b_addr, + c_cnt, + c_addr + ]); + } + cbi_update_table(tbl_top, rows_top); + + var rows_requests = []; + var tbl_requests = E('table', { 'class': 'table', 'id': 'requests' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, _('Date')), + E('th', { 'class': 'th' }, _('Time')), + E('th', { 'class': 'th' }, _('Client')), + E('th', { 'class': 'th' }, _('Domain')), + E('th', { 'class': 'th' }, _('Answer')), + E('th', { 'class': 'th' }, _('Action')) + ]) + ]); + + max = 0; + if (content.requests) { + var button; + max = content.requests.length; + for (var i = 0; i < max; i++) { + if (content.requests[i].rc === 'NX') { + button = E('button', { + 'class': 'btn cbi-button cbi-button-positive', + 'style': 'word-break: inherit', + 'name': 'whitelist', + 'value': content.requests[i].domain, + 'click': handleAction + }, [ _('Whitelist...') ]); + } else { + button = E('button', { + 'class': 'btn cbi-button cbi-button-negative', + 'style': 'word-break: inherit', + 'name': 'blacklist', + 'value': content.requests[i].domain, + 'click': handleAction + }, [ _('Blacklist...') ]); + } + rows_requests.push([ + content.requests[i].date, + content.requests[i].time, + content.requests[i].client, + '' + content.requests[i].domain + '', + content.requests[i].rc, + button + ]); + } + } + cbi_update_table(tbl_requests, rows_requests); + + return E('div', { 'class': 'cbi-map', 'id': 'map' }, [ + E('div', { 'class': 'cbi-section' }, [ + E('p', _('This tab shows the last generated DNS Report, press the \'Refresh\' button to get a current one.')), + E('p', '\xa0'), + E('div', { 'class': 'cbi-value' }, [ + E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Start Timestamp')), + E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, (content.start_date || '-') + ', ' + (content.start_time || '-')) + ]), + E('div', { 'class': 'cbi-value' }, [ + E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('End Timestamp')), + E('div', { 'class': 'cbi-value-title', 'id': 'end', 'style': 'float:left;color:#37c' }, (content.end_date || '-') + ', ' + (content.end_time || '-')) + ]), + E('div', { 'class': 'cbi-value' }, [ + E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Total DNS Requests')), + E('div', { 'class': 'cbi-value-title', 'id': 'total', 'style': 'float:left;color:#37c' }, content.total || '-') + ]), + E('div', { 'class': 'cbi-value' }, [ + E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Blocked DNS Requests')), + E('div', { 'class': 'cbi-value-title', 'id': 'blocked', 'style': 'float:left;color:#37c' }, (content.blocked || '-') + ' (' + (content.percent || '-') + ')') + ]), + E('div', { 'class': 'right' }, [ + E('button', { + 'class': 'btn cbi-button cbi-button-apply', + 'click': ui.createHandlerFn(this, function() { + return handleAction('query'); + }) + }, [ _('Blocklist Query...') ]), + '\xa0\xa0\xa0', + E('button', { + 'class': 'btn cbi-button cbi-button-positive', + 'click': ui.createHandlerFn(this, function() { + return handleAction('refresh'); + }) + }, [ _('Refresh...') ]) + ]), + ]), + E('div', { 'class': 'cbi-section' }, [ + E('div', { 'class': 'left' }, [ + E('h3', _('Top Statistics')), + tbl_top + ]) + ]), + E('br'), + E('div', { 'class': 'cbi-section' }, [ + E('div', { 'class': 'left' }, [ + E('h3', _('Latest DNS Requests')), + tbl_requests + ]) + ]) + ]); + }, + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js b/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js new file mode 100644 index 0000000000..4dc2a2e533 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js @@ -0,0 +1,41 @@ +'use strict'; +'require view'; +'require poll'; +'require fs'; + +return view.extend({ + load: function() { + return Promise.all([ + L.resolveDefault(fs.stat('/sbin/logread'), null), + L.resolveDefault(fs.stat('/usr/sbin/logread'), null) + ]); + }, + render: function(stat) { + var logger = stat[0] ? stat[0].path : stat[1] ? stat[1].path : null; + poll.add(function() { + return L.resolveDefault(fs.exec_direct(logger, ['-e', 'adblock-'])).then(function(res) { + var log = document.getElementById("logfile"); + if (res) { + log.value = res.trim(); + } else { + log.value = _('No adblock related logs yet!'); + } + log.scrollTop = log.scrollHeight; + }); + }); + return E('div', { class: 'cbi-map' }, + E('div', { class: 'cbi-section' }, [ + E('div', { class: 'cbi-section-descr' }, _('The syslog output, pre-filtered for adblock related messages only.')), + E('textarea', { + 'id': 'logfile', + 'style': 'width: 100% !important; padding: 5px; font-family: monospace', + 'readonly': 'readonly', + 'wrap': 'off', + 'rows': 25 + }) + ])); + }, + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js b/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js new file mode 100644 index 0000000000..9b0aa5bc0d --- /dev/null +++ b/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js @@ -0,0 +1,603 @@ +'use strict'; +'require view'; +'require poll'; +'require fs'; +'require ui'; +'require uci'; +'require form'; +'require tools.widgets as widgets'; + +/* + button handling +*/ +function handleAction(ev) { + if (ev === 'timer') { + L.ui.showModal(_('Refresh Timer'), [ + E('p', _('To keep your adblock lists up-to-date, you should set up an automatic update job for these lists.')), + E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [ + E('h5', _('Existing job(s)')), + E('textarea', { + 'id': 'cronView', + 'style': 'width: 100% !important; padding: 5px; font-family: monospace', + 'readonly': 'readonly', + 'wrap': 'off', + 'rows': 5 + }) + ]), + E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [ + E('label', { 'class': 'cbi-input-select', 'style': 'padding-top:.5em' }, [ + E('h5', _('Set a new adblock job')), + E('select', { 'class': 'cbi-input-select', 'id': 'timerA' }, [ + E('option', { 'value': 'start' }, 'Start'), + E('option', { 'value': 'reload' }, 'Reload'), + E('option', { 'value': 'restart' }, 'Restart'), + E('option', { 'value': 'suspend' }, 'Suspend'), + E('option', { 'value': 'resume' }, 'Resume'), + E('option', { 'value': 'report gen' }, 'Report'), + E('option', { 'value': 'report mail' }, 'Report & Mail') + ]), + '\xa0\xa0\xa0', + _('Adblock action') + ]), + E('label', { 'class': 'cbi-input-text', 'style': 'padding-top:.5em' }, [ + E('input', { 'class': 'cbi-input-text', 'id': 'timerH', 'maxlength': '2' }, [ + ]), + '\xa0\xa0\xa0', + _('The hours portition (req., range: 0-23)') + ]), + E('label', { 'class': 'cbi-input-text', 'style': 'padding-top:.5em' }, [ + E('input', { 'class': 'cbi-input-text', 'id': 'timerM', 'maxlength': '2' }), + '\xa0\xa0\xa0', + _('The minutes portion (opt., range: 0-59)') + ]), + E('label', { 'class': 'cbi-input-text', 'style': 'padding-top:.5em' }, [ + E('input', { 'class': 'cbi-input-text', 'id': 'timerD', 'maxlength': '13' }), + '\xa0\xa0\xa0', + _('The day of the week (opt., values: 0-6 possibly sep. by , or -)') + ]) + ]), + E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [ + E('label', { 'class': 'cbi-input-select', 'style': 'padding-top:.5em' }, [ + E('h5', _('Remove an existing job')), + E('input', { 'class': 'cbi-input-text', 'id': 'lineno', 'maxlength': '2' }, [ + ]), + '\xa0\xa0\xa0', + _('Line number to remove') + ]) + ]), + E('div', { 'class': 'right' }, [ + E('button', { + 'class': 'btn cbi-button', + 'click': L.hideModal + }, _('Cancel')), + ' ', + E('button', { + 'class': 'btn cbi-button-action', + 'click': ui.createHandlerFn(this, function(ev) { + var lineno = document.getElementById('lineno').value; + var action = document.getElementById('timerA').value; + var hours = document.getElementById('timerH').value; + var minutes = document.getElementById('timerM').value || '0'; + var days = document.getElementById('timerD').value || '*'; + if (hours) { + L.resolveDefault(fs.exec_direct('/etc/init.d/adblock', ['timer', 'add', action, hours, minutes, days])) + .then(function(res) { + if (res) { + ui.addNotification(null, E('p', _('The Refresh Timer could not been updated.')), 'error'); + } else { + ui.addNotification(null, E('p', _('The Refresh Timer has been updated.')), 'info'); + } + }); + } else if (lineno) { + L.resolveDefault(fs.exec_direct('/etc/init.d/adblock', ['timer', 'remove', lineno])) + .then(function(res) { + if (res) { + ui.addNotification(null, E('p', _('The Refresh Timer could not been updated.')), 'error'); + } else { + ui.addNotification(null, E('p', _('The Refresh Timer has been updated.')), 'info'); + } + }); + } else { + document.getElementById('timerH').focus(); + return + } + L.hideModal(); + }) + }, _('Save')) + ]) + ]); + L.resolveDefault(fs.exec_direct('/etc/init.d/adblock', ['timer', 'list'])) + .then(function(res) { + document.getElementById('cronView').value = res.trim(); + }); + document.getElementById('timerH').focus(); + return + } + + if (document.getElementById('status') && document.getElementById('status').textContent.substr(0,6) === 'paused') { + ev = 'resume'; + } + + fs.exec_direct('/etc/init.d/adblock', [ev]) +} + +return view.extend({ + load: function() { + return Promise.all([ + L.resolveDefault(fs.exec_direct('/etc/init.d/adblock', ['list']), {}), + L.resolveDefault(fs.read_direct('/etc/adblock/adblock.categories'), ''), + uci.load('adblock') + ]); + }, + + render: function(result) { + var m, s, o; + + m = new form.Map('adblock', 'Adblock', _('Configuration of the adblock package to block ad/abuse domains by using DNS. \ + For further information check the online documentation')); + + /* + poll runtime information + */ + pollData: poll.add(function() { + return L.resolveDefault(fs.read_direct('/tmp/adb_runtime.json'), 'null').then(function(res) { + var info = JSON.parse(res); + var status = document.getElementById('status'); + if (status && info) { + status.textContent = (info.adblock_status || '-') + ' / ' + (info.adblock_version || '-'); + if (info.adblock_status === "running") { + if (!status.classList.contains("spinning")) { + status.classList.add("spinning"); + } + } else { + if (status.classList.contains("spinning")) { + status.classList.remove("spinning"); + if (document.getElementById('btn_suspend')) { + if (status.textContent.substr(0,6) === 'paused') { + document.querySelector('#btn_suspend').textContent = 'Resume'; + } + if (document.getElementById('status').textContent.substr(0,7) === 'enabled') { + document.querySelector('#btn_suspend').textContent = 'Suspend'; + } + } + } + } + if (status.textContent.substr(0,6) === 'paused' && document.getElementById('btn_suspend')) { + document.querySelector('#btn_suspend').textContent = 'Resume'; + } + } else if (status) { + status.textContent = '-'; + if (status.classList.contains("spinning")) { + status.classList.remove("spinning"); + } + } + var domains = document.getElementById('domains'); + if (domains && info) { + domains.textContent = parseInt(info.blocked_domains, 10).toLocaleString() || '-'; + } + var sources = document.getElementById('sources'); + var src_array = []; + if (sources && info) { + for (var i = 0; i < info.active_sources.length; i++) { + if (i < info.active_sources.length-1) { + src_array += info.active_sources[i].source + ', '; + } else { + src_array += info.active_sources[i].source + } + } + sources.textContent = src_array || '-'; + } + var backend = document.getElementById('backend'); + if (backend && info) { + backend.textContent = info.dns_backend || '-'; + } + var utils = document.getElementById('utils'); + if (utils && info) { + utils.textContent = info.run_utils || '-'; + } + var ifaces = document.getElementById('ifaces'); + if (ifaces && info) { + ifaces.textContent = info.run_ifaces || '-'; + } + var dirs = document.getElementById('dirs'); + if (dirs && info) { + dirs.textContent = info.run_directories || '-'; + } + var flags = document.getElementById('flags'); + if (flags && info) { + flags.textContent = info.run_flags || '-'; + } + var run = document.getElementById('run'); + if (run && info) { + run.textContent = info.last_run || '-'; + } + }); + }, 1); + + /* + runtime information and buttons + */ + s = m.section(form.NamedSection, 'global'); + s.render = L.bind(function(view, section_id) { + return E('div', { 'class': 'cbi-section' }, [ + E('h3', _('Information')), + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title', 'style': 'padding-top:0rem' }, _('Status / Version')), + E('div', { 'class': 'cbi-value-field spinning', 'id': 'status', 'style': 'color:#37c' },'\xa0') + ]), + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title', 'style': 'padding-top:0rem' }, _('Blocked Domains')), + E('div', { 'class': 'cbi-value-field', 'id': 'domains', 'style': 'color:#37c' },'-') + ]), + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title', 'style': 'padding-top:0rem' }, _('Active Sources')), + E('div', { 'class': 'cbi-value-field', 'id': 'sources', 'style': 'color:#37c' },'-') + ]), + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title', 'style': 'padding-top:0rem' }, _('DNS Backend')), + E('div', { 'class': 'cbi-value-field', 'id': 'backend', 'style': 'color:#37c' },'-') + ]), + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title', 'style': 'padding-top:0rem' }, _('Run Utils')), + E('div', { 'class': 'cbi-value-field', 'id': 'utils', 'style': 'color:#37c' },'-') + ]), + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title', 'style': 'padding-top:0rem' }, _('Run Interfaces')), + E('div', { 'class': 'cbi-value-field', 'id': 'ifaces', 'style': 'color:#37c' },'-') + ]), + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title', 'style': 'padding-top:0rem' }, _('Run Directories')), + E('div', { 'class': 'cbi-value-field', 'id': 'dirs', 'style': 'color:#37c' },'-') + ]), + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title', 'style': 'padding-top:0rem' }, _('Run Flags')), + E('div', { 'class': 'cbi-value-field', 'id': 'flags', 'style': 'color:#37c' },'-') + ]), + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title', 'style': 'padding-top:0rem' }, _('Last Run')), + E('div', { 'class': 'cbi-value-field', 'id': 'run', 'style': 'color:#37c' },'-') + ]), + E('div', { class: 'right' }, [ + E('button', { + 'class': 'btn cbi-button cbi-button-apply', + 'click': ui.createHandlerFn(this, function() { + return handleAction('timer'); + }) + }, [ _('Refresh Timer...') ]), + '\xa0\xa0\xa0', + E('button', { + 'class': 'btn cbi-button cbi-button-apply', + 'id': 'btn_suspend', + 'click': ui.createHandlerFn(this, function() { + return handleAction('suspend'); + }) + }, [ _('Suspend') ]), + '\xa0\xa0\xa0', + E('button', { + 'class': 'btn cbi-button cbi-button-positive', + 'click': ui.createHandlerFn(this, function() { + return handleAction('reload'); + }) + }, [ _('Reload') ]), + '\xa0\xa0\xa0', + E('button', { + 'class': 'btn cbi-button cbi-button-negative', + 'click': ui.createHandlerFn(this, function() { + return handleAction('restart'); + }) + }, [ _('Restart') ]) + ]) + ]); + }, o, this); + this.pollData; + + /* + tabbed config section + */ + s = m.section(form.NamedSection, 'global', 'adblock', _('Settings')); + s.addremove = false; + s.tab('general', _('General Settings')); + s.tab('additional', _('Additional Settings')); + s.tab('adv_dns', _('Advanced DNS Settings')); + s.tab('adv_report', _('Advanced Report Settings')); + s.tab('adv_email', _('Advanced E-Mail Settings')); + s.tab('sources', _('Blocklist Sources')); + + /* + general settings tab + */ + o = s.taboption('general', form.Flag, 'adb_enabled', _('Enabled'), _('Enable the adblock service.')); + o.rmempty = false; + + o = s.taboption('general', widgets.NetworkSelect, 'adb_trigger', _('Startup Trigger Interface'), _('List of available network interfaces to trigger the adblock start. \ + Choose \'unspecified\' to use a classic startup timeout instead of a network trigger.')); + o.unspecified = true; + o.nocreate = true; + o.rmempty = true; + + o = s.taboption('general', form.Flag, 'adb_forcedns', _('Force Local DNS'), _('Redirect all DNS queries from specified zones to the local DNS resolver, applies to UDP and TCP protocol.')); + o.rmempty = false; + + o = s.taboption('general', widgets.ZoneSelect, 'adb_zonelist', _('Forced Zones'), _('Firewall source zones that should be forced locally.')); + o.depends('adb_forcedns', '1'); + o.unspecified = true; + o.multiple = true; + o.nocreate = true; + o.rmempty = true; + + o = s.taboption('general', form.DynamicList, 'adb_portlist', _('Forced Ports'), _('Firewall ports that should be forced locally.')); + o.depends('adb_forcedns', '1'); + o.unspecified = true; + o.multiple = true; + o.nocreate = false; + o.datatype = 'port'; + o.value('53'); + o.value('853'); + o.value('5353'); + o.rmempty = true; + + o = s.taboption('general', form.Flag, 'adb_safesearch', _('Enable SafeSearch'), _('Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and pixabay.')); + o.rmempty = false; + + o = s.taboption('general', form.MultiValue, 'adb_safesearchlist', _('Limit SafeSearch'), _('Limit SafeSearch to certain providers.')); + o.depends('adb_safesearch', '1'); + o.value('google'); + o.value('bing'); + o.value('duckduckgo'); + o.value('yandex'); + o.value('youtube'); + o.value('pixabay'); + o.rmempty = true; + + o = s.taboption('general', form.Flag, 'adb_safesearchmod', _('Relax SafeSearch'), _('Enable moderate SafeSearch filters for youtube.')); + o.depends('adb_safesearch', '1'); + o.rmempty = true; + + o = s.taboption('general', form.Flag, 'adb_report', _('DNS Report'), _('Gather DNS related network traffic via tcpdump and provide a DNS Report on demand. \ + Please note: this needs additional \'tcpdump\' or \'tcpdump-mini\' package installation and a full adblock service restart to take effect.')); + o.rmempty = false; + + o = s.taboption('general', form.Flag, 'adb_mail', _('E-Mail Notification'), _('Send adblock related notification e-mails. \ + Please note: this needs additional \'msmtp\' package installation.')); + o.rmempty = false; + + o = s.taboption('general', form.Value, 'adb_mailreceiver', _('E-Mail Receiver Address'), _('Receiver address for adblock notification e-mails.')); + o.depends('adb_mail', '1'); + o.placeholder = 'name@example.com'; + o.rmempty = true; + + /* + additional settings tab + */ + o = s.taboption('additional', form.Flag, 'adb_debug', _('Verbose Debug Logging'), _('Enable verbose debug logging in case of any processing errors.')); + o.rmempty = false; + + o = s.taboption('additional', form.Flag, 'adb_nice', _('Low Priority Service'), _('Reduce the priority of the adblock background processing to take fewer resources from the system. \ + Please note: This change requires a full adblock service restart to take effect.')); + o.enabled = '10'; + o.rmempty = true; + + o = s.taboption('additional', form.Value, 'adb_triggerdelay', _('Trigger Delay'), _('Additional trigger delay in seconds before adblock processing begins.')); + o.placeholder = '2'; + o.datatype = 'range(1,300)'; + o.rmempty = true; + + o = s.taboption('additional', form.Value, 'adb_tmpbase', _('Base Temp Directory'), _('Base Temp Directory for all adblock related runtime operations, \ + e.g. downloading, sorting, merging etc.')); + o.placeholder = '/tmp'; + o.rmempty = true; + + o = s.taboption('additional', form.Flag, 'adb_backup', _('Blocklist Backup'), _('Create compressed blocklist backups, they will be used in case of download errors or during startup.')); + o.default = 1 + o.rmempty = false; + + o = s.taboption('additional', form.Value, 'adb_backupdir', _('Backup Directory'), _('Target directory for blocklist backups.')); + o.depends('adb_backup', '1'); + o.placeholder = '/tmp/adblock-Backup'; + o.rmempty = true; + + o = s.taboption('additional', form.ListValue, 'adb_fetchutil', _('Download Utility'), _('List of supported and fully pre-configured download utilities.')); + o.value('uclient-fetch'); + o.value('wget'); + o.value('curl'); + o.value('aria2c'); + o.optional = true; + o.rmempty = true; + + o = s.taboption('additional', form.Flag, 'adb_fetchinsecure', _('Download Insecure'), _('Don\'t check SSL server certificates during download.')); + o.default = 0 + o.rmempty = true; + + o = s.taboption('additional', form.Value, 'adb_fetchparm', _('Download Parameters'), _('Manually override the pre-configured download options for the selected download utility.')); + o.optional = true; + o.rmempty = true; + + /* + advanced dns settings tab + */ + o = s.taboption('adv_dns', form.ListValue, 'adb_dns', _('DNS Backend'), _('List of supported DNS backends with their default list directory. \ + To overwrite the default path use the \'DNS Directory\' option.')); + o.value('dnsmasq', _('dnsmasq (/tmp/dnsmasq.d)')); + o.value('unbound', _('unbound (/var/lib/unbound)')); + o.value('named', _('bind (/var/lib/bind)')); + o.value('kresd', _('kresd (/etc/kresd)')); + o.value('raw', _('raw (/tmp)')); + o.optional = true; + o.rmempty = true; + + o = s.taboption('adv_dns', form.Value, 'adb_dnsdir', _('DNS Directory'), _('Target directory for the generated blocklist \'adb_list.overall\'.')); + o.placeholder = '/tmp'; + o.rmempty = true; + + o = s.taboption('adv_dns', form.ListValue, 'adb_dnsinstance', _('DNS Instance'), _('Set the dns backend instance used by adblock.')); + o.value('0', _('First instance (default)')); + o.value('1', _('Second instance')); + o.value('2', _('Third instance')); + o.value('3', _('Fourth instance')); + o.value('4', _('Fifth instance')); + o.depends('adb_dns', 'dnsmasq'); + o.optional = true; + o.rmempty = true; + + o = s.taboption('adv_dns', form.Value, 'adb_dnstimeout', _('DNS Restart Timeout'), _('Timeout to wait for a successful DNS backend restart.')); + o.placeholder = '20'; + o.datatype = 'range(1,60)'; + o.rmempty = true; + + o = s.taboption('adv_dns', form.Value, 'adb_lookupdomain', _('External DNS Lookup Domain'), _('External domain to check for a successful DNS backend restart. \ + Please note: To disable this check set this option to \'false\'.')); + o.placeholder = 'example.com'; + o.rmempty = true; + + o = s.taboption('adv_dns', form.Flag, 'adb_dnsflush', _('Flush DNS Cache'), _('Empty the DNS cache before adblock processing starts to reduce the memory consumption.')); + o.rmempty = true; + + o = s.taboption('adv_dns', form.Flag, 'adb_dnsallow', _('Disable DNS Allow'), _('Disable selective DNS whitelisting (RPZ-PASSTHRU).')); + o.rmempty = true; + + o = s.taboption('adv_dns', form.DynamicList, 'adb_denyip', _('Block Local Client IPs'), _('Block all requests of certain DNS clients based on their IP address (RPZ-CLIENT-IP). \ + Please note: This feature is currently only supported by bind DNS backend.')); + o.datatype = 'or(ip4addr("nomask"),ip6addr("nomask"))'; + o.optional = true; + o.rmempty = true; + + o = s.taboption('adv_dns', form.DynamicList, 'adb_allowip', _('Allow Local Client IPs'), _('Allow all requests of certain DNS clients based on their IP address (RPZ-CLIENT-IP). \ + Please note: This feature is currently only supported by bind DNS backend.')); + o.datatype = 'or(ip4addr("nomask"),ip6addr("nomask"))'; + o.optional = true; + o.rmempty = true; + + o = s.taboption('adv_dns', form.Flag, 'adb_jail', _('Additional Jail Blocklist'), _('Builds an additional DNS blocklist to block access to all domains except those listed in the whitelist. \ + Please note: You can use this restrictive blocklist e.g. for guest wifi or kidsafe configurations.')); + o.rmempty = true; + + o = s.taboption('adv_dns', form.Value, 'adb_jaildir', _('Jail Directory'), _('Target directory for the generated jail blocklist \'adb_list.jail\'.')); + o.depends('adb_jail', '1'); + o.placeholder = '/tmp'; + o.rmempty = true; + + /* + advanced report settings tab + */ + o = s.taboption('adv_report', form.DummyValue, '_sub'); + o.rawhtml = true; + o.default = 'Changes on this tab needs a full adblock service restart to take effect.'; + + o = s.taboption('adv_report', widgets.DeviceSelect, 'adb_repiface', _('Report Interface'), _('List of available network devices used by tcpdump.')); + o.unspecified = true; + o.nocreate = false; + o.rmempty = true; + + o = s.taboption('adv_report', form.Value, 'adb_reportdir', _('Report Directory'), _('Target directory for DNS related report files.')); + o.placeholder = '/tmp/adblock-Report'; + o.rmempty = true; + + o = s.taboption('adv_report', form.Value, 'adb_repchunkcnt', _('Report Chunk Count'), _('Report chunk count used by tcpdump.')); + o.placeholder = '5'; + o.datatype = 'range(1,10)'; + o.rmempty = true; + + o = s.taboption('adv_report', form.Value, 'adb_repchunksize', _('Report Chunk Size'), _('Report chunk size used by tcpdump in MByte.')); + o.placeholder = '1'; + o.datatype = 'range(1,10)'; + o.rmempty = true; + + o = s.taboption('adv_report', form.Value, 'adb_replisten', _('Report Ports'), _('Space separated list of ports used by tcpdump.')); + o.placeholder = '53'; + o.rmempty = true; + + o = s.taboption('adv_report', form.Flag, 'adb_represolve', _('Resolve IPs'), _('Resolve reporting IP addresses by using reverse DNS (PTR) lookups.')); + o.rmempty = true; + + /* + advanced email settings tab + */ + o = s.taboption('adv_email', form.Value, 'adb_mailsender', _('E-Mail Sender Address'), _('Sender address for adblock notification E-Mails.')); + o.placeholder = 'no-reply@adblock'; + o.rmempty = true; + + o = s.taboption('adv_email', form.Value, 'adb_mailtopic', _('E-Mail Topic'), _('Topic for adblock notification E-Mails.')); + o.placeholder = 'adblock notification'; + o.rmempty = true; + + o = s.taboption('adv_email', form.Value, 'adb_mailprofile', _('E-Mail Profile'), _('Profile used by \'msmtp\' for adblock notification E-Mails.')); + o.placeholder = 'adb_notify'; + o.rmempty = true; + + o = s.taboption('adv_email', form.Value, 'adb_mailcnt', _('E-Mail Notification Count'), _('Raise the notification count, to get E-Mails if the overall blocklist count is less or equal to the given limit.')); + o.placeholder = '0'; + o.datatype = 'min(0)'; + o.rmempty = true; + + /* + blocklist sources tab + */ + o = s.taboption('sources', form.DummyValue, '_sub'); + o.rawhtml = true; + o.default = 'List of supported and fully pre-configured adblock sources.
    \ + List size information with the respective domain ranges as follows:
    \ + • S (-10k), M (10k-30k) and L (30k-80k) should work for 128 MByte devices,
    \ + • XL (80k-200k) should work for 256-512 MByte devices,
    \ + • XXL (200k-) needs more RAM and Multicore support, e.g. x86 or raspberry devices.
    \ + • VAR (50k-500k) variable size depending on the selection.
    '; + + var name, size, focus, sources = []; + if (result[0]) { + sources = result[0].trim().split('\n'); + } + + o = s.taboption('sources', form.MultiValue, 'adb_sources', _('Sources (Size, Focus)')); + for (var i = 0; i < sources.length; i++) { + if (sources[i].match(/^\s+\+/)) { + name = sources[i].match(/^\s+\+\s(\w+)\s/)[1] || '-'; + size = sources[i].match(/^\s+\+\s\w+[\sx]+(\w+)/)[1] || '-'; + focus = sources[i].match(/^\s+\+\s\w+[\sx]+\w+\s+([\w\+]+)/)[1] || '-'; + o.value(name, name + ' (' + size + ', ' + focus + ')'); + } + } + o.optional = true; + o.rmempty = true; + + /* + prepare category data + */ + var code, category, list, path, categories = []; + if (result[1]) { + categories = result[1].trim().split('\n'); + } + + o = s.taboption('sources', form.DummyValue, '_sub'); + o.rawhtml = true; + o.default = 'UTCapitole Archive Selection'; + + o = s.taboption('sources', form.DynamicList, 'adb_utc_sources', _('Categories')); + for (var i = 0; i < categories.length; i++) { + code = categories[i].match(/^(\w+);/)[1].trim(); + if (code === 'utc') { + category = categories[i].match(/^\w+;(.*$)/)[1].trim(); + o.value(category); + } + } + o.optional = true; + o.rmempty = true; + + o = s.taboption('sources', form.DummyValue, '_sub'); + o.rawhtml = true; + o.default = 'StevenBlack List Selection'; + + o = s.taboption('sources', form.DynamicList, 'adb_stb_sources', _('Variants')); + for (var i = 0; i < categories.length; i++) { + code = categories[i].match(/^(\w+);/)[1].trim(); + if (code === 'stb') { + list = categories[i].match(/^\w+;(.*);/)[1].trim(); + path = categories[i].match(/^.*;(.*$)/)[1].trim(); + o.value(path, list); + } + } + o.optional = true; + o.rmempty = true; + + return m.render(); + }, + handleReset: null +}); diff --git a/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js b/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js new file mode 100644 index 0000000000..31e58d3c74 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js @@ -0,0 +1,37 @@ +'use strict'; +'require view'; +'require fs'; +'require ui'; + +return view.extend({ + load: function() { + return L.resolveDefault(fs.read_direct('/etc/adblock/adblock.whitelist'), ''); + }, + handleSave: function(ev) { + var value = ((document.querySelector('textarea').value || '').trim().toLowerCase().replace(/\r\n/g, '\n')) + '\n'; + return fs.write('/etc/adblock/adblock.whitelist', value) + .then(function(rc) { + document.querySelector('textarea').value = value; + ui.addNotification(null, E('p', _('Whitelist changes have been saved. Refresh your adblock lists that changes take effect.')), 'info'); + }).catch(function(e) { + ui.addNotification(null, E('p', _('Unable to save changes: %s').format(e.message))); + }); + }, + render: function(whitelist) { + return E([ + E('p', {}, + _('This is the local adblock whitelist to always allow certain (sub) domains.
    \ + Please note: add only one domain per line. Comments introduced with \'#\' are allowed - ip addresses, wildcards and regex are not.')), + E('p', {}, + E('textarea', { + 'style': 'width: 100% !important; padding: 5px; font-family: monospace', + 'spellcheck': 'false', + 'wrap': 'off', + 'rows': 25 + }, [ whitelist != null ? whitelist : '' ]) + ) + ]); + }, + handleSaveApply: null, + handleReset: null +}); diff --git a/package/luci/applications/luci-app-adblock/po/ar/adblock.po b/package/luci/applications/luci-app-adblock/po/ar/adblock.po new file mode 100644 index 0000000000..e27594697c --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/ar/adblock.po @@ -0,0 +1,837 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-09-18 15:45+0000\n" +"Last-Translator: David Rapaň \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Weblate 5.0.2\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "إجراء" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "المصادر المفعّلة" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "أدبلوك" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "إجراء أدبلوك" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "إضافة نطاق للقائمة السوداء" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "إضافة نطاق للقائمة المسموحة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "أضف هذا النطاق (الفرعي) لقائمتك السوداء المحلية." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "أضف هذا النطاق (الفرعي) لقائمتك المسموحة المحلية." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "قائمة حظر إضافية" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "إعدادات إضافية" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "وقت انتظار إضافي بالثواني قبل الشروع في تطبيق إعدادات أدبلوك." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "إعدادات DNS متقدمة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "إعدادات متقدمة للبريد الالكتروني" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "إعدادات متقدمة للتقارير" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "إجابة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "مجلد النسخ الاحتياطي" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "مجلد التخزين المؤقت الأساسي" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"مجلد التخزين المؤقت الأساسي لكل العمليات المتعلقة بأدبلوك، مثال: تحميل، " +"ترتيب، دمج، إلخ." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"تم حفظ التغييرات في القائمة السوداء. رجاء قم بتحديث قوائم أدبلوك الخاصة بك " +"لتظهر التغييرات." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "القائمة السوداء..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "طلبات DNS المحظورة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "نطاقات محظورة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "نسخة احتياطية لقائمة الحظر" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "استعلام لقائمة الحظر" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "استعلام لقائمة الحظر..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "مصادر قائمة الحظر" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"إنشاء قائمة حظر DNS إضافية لحظر الوصول إلى جميع النطاقات باستثناء تلك " +"المدرجة في القائمة المسموحة. ملاحظة: يمكنك استخدام قائمة الحظر هذه لشبكات " +"wifi المؤقتة أو للإعدادات المخصصة لسلامة الأطفال." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "إلغاء" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "فئات" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "العميل" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"إعدادات حزمة أدبلوك لمنع نطاقات الإعلانات/ النطاقات سيئة الاستخدام باستعمال " +"DNS. لمزيد من المعلومات راجع المساعدة على الشبكة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "العدد" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"إنشاء نسخ احتياطية لقائمة الحظر المضغوطة ، سيتم استخدامها في حالة حدوث أخطاء " +"في التنزيل أو أثناء بدء التشغيل." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS الخلفية" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "دليل DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "تقرير DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "مهلة إعادة تشغيل DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "تاريخ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "تعطيل السماح DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "اختصاص" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "تنزيل المعلمات" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "تحميل الأداة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "إعلام البريد الإلكتروني" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "عدد إعلام البريد الإلكتروني" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "ملف تعريف البريد الإلكتروني" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "عنوان مستقبل البريد الإلكتروني" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "عنوان مرسل البريد الإلكتروني" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "موضوع البريد الإلكتروني" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "تحرير القائمة السوداء" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "تحرير القائمة البيضاء" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "تمكين SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "تفعيل مرشحات البحث الآمن المعتدلة لموقع youtube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "قم بتمكين خدمة adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "تمكين التسجيل المطول لتصحيح الأخطاء في حالة وجود أي أخطاء في المعالجة." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "مفعل" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "الطابع الزمني للانتهاء" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"فرض البحث الآمن على google و bing و duckduckgo و yandex و youtube و pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "الوظائف الحالية" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "مجال بحث DNS خارجي" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"المجال الخارجي للتحقق من إعادة تشغيل DNS الخلفية بنجاح. يرجى ملاحظة: لتعطيل " +"هذا الاختيار ، قم بتعيين هذا الخيار على \"خطأ\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "معايير التصفية مثل التاريخ أو المجال أو العميل (اختياري)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "منافذ جدار الحماية التي يجب فرضها محليًا." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "مناطق مصدر جدار الحماية التي يجب فرضها محليًا." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "مسح ذاكرة التخزين المؤقت DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "فرض DNS المحلي" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "البوابات القسرية" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "مناطق قسرية" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"اجمع حركة مرور الشبكة ذات الصلة ب DNS عبر tcpdump وقدم تقرير DNS عند الطلب. " +"يرجى ملاحظة: هذا يحتاج إلى تثبيت حزمة إضافية \"tcpdump-mini\" وإعادة تشغيل " +"خدمة adblock كاملة لتصبح سارية المفعول." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "الاعدادات العامة" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "منح حق الوصول إلى Adblock لتطبيق LuCI" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "معلومة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "دليل السجن" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "آخر تشغيل" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "أحدث طلبات DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "تقييد البحث الآمن" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "قصر البحث الآمن على مقدمي خدمات معينين." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "رقم الخط المراد إزالته" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "قائمة بأجهزة الشبكة المتاحة التي يستخدمها برنامج tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"قائمة واجهات الشبكة المتاحة لبدء تشغيل adblock. اختر \"غير محدد\" لاستخدام " +"مهلة بدء التشغيل الكلاسيكية بدلاً من مشغل الشبكة." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"قائمة بالخلفيات الخلفية لنظام أسماء النطاقات المدعومة مع دليل القائمة " +"الافتراضي الخاص بها. للكتابة فوق المسار الافتراضي ، استخدم خيار \"دليل DNS\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "قائمة أدوات التنزيل المدعومة والمجهزة بالكامل مسبقًا" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "عرض السجل" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "خدمة ذات أولوية منخفضة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "لا توجد نتائج استعلام!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "لا توجد سجلات ذات صلة ب adblock حتى الآن!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "نظرة عامة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" +"الملف الشخصي المستخدم من قبل \"msmtp\" لرسائل البريد الإلكتروني الخاصة " +"بإشعار حظر الإعلانات." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "استعلام" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "الاستعلام عن قوائم الحظر والنسخ الاحتياطية النشطة لمجال معين." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"ارفع عدد الإشعارات للحصول على رسائل البريد الإلكتروني إذا كان العدد الإجمالي " +"لقائمة الحظر أقل من الحد المعطى أو مساويًا له." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "عنوان المستلم لرسائل البريد الإلكتروني الخاصة بإشعار adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"أعد توجيه جميع استعلامات DNS من مناطق محددة إلى محلل DNS المحلي ، ينطبق على " +"بروتوكول UDP و TCP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"تقليل أولوية معالجة خلفية adblock لأخذ موارد أقل من النظام. يرجى ملاحظة: هذا " +"التغيير يتطلب إعادة تشغيل خدمة adblock كاملة لتصبح سارية المفعول." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "نعش الذاكرة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "قم بتحديث تقرير DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "تحديث الموقت" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "تحديث المؤقت ..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "تنعيش الذاكرة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "استرخاء البحث الآمن" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "إعادة تحميل" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "إزالة وظيفة موجودة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "تقرير عدد القطع" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "تقرير حجم القطعة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "دليل التقارير" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "واجهة التقرير" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "تقرير المنافذ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "الإبلاغ عن عدد القطع المستخدم بواسطة tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "الإبلاغ عن حجم القطعة المستخدم بواسطة tcpdump بالميجابايت." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "إعادة تشغيل" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "نتيجة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "تشغيل الدلائل" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "تشغيل الإشارات" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "تشغيل واجهات" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "تشغيل الأدوات" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "إحفض" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"إرسال رسائل البريد الإلكتروني الخاصة بالإشعار عن حظر الإعلانات. يرجى ملاحظة: " +"هذا يحتاج إلى تثبيت حزمة 'msmtp' إضافية." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "عنوان المرسل لرسائل البريد الإلكتروني الخاصة بإشعار حظر الإعلانات." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "تعيين وظيفة adblock جديدة" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "إعدادات" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "المصادر (الحجم والتركيز)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "قائمة منافذ مفصولة بمسافة يستخدمها tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "بدء الطابع الزمني" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "بدء واجهة التشغيل" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "الحالة / الإصدار" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "تعليق" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "الدليل الهدف لملفات التقارير المتعلقة ب DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "الدليل الهدف للنسخ الاحتياطية لقائمة الحظر." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "الدليل المستهدف لقائمة الحظر التي تم إنشاؤها \"adb_list.overall\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "الدليل المستهدف لقائمة منع السجن التي تم إنشاؤها \"adb_list.jail\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "تعذر تحديث مؤقت التحديث." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "تم تحديث مؤقت التحديث." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" +"يوم الأسبوع (اختياري ، القيم: من 1 إلى 7 من المحتمل أن يفصل بينها أو -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "قسم الساعات (مطلوب ، النطاق: 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "جزء الدقائق (اختياري ، النطاق: 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "ناتج سجل النظام ، تمت تصفيته مسبقًا للرسائل ذات الصلة بحظر الإعلان فقط." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"هذه قائمة حظر الإعلانات المحلية لرفض بعض المجالات (الفرعية) دائمًا.
    " +"ملاحظة: إضافة مجال واحد فقط في كل سطر. يُسمح بالتعليقات المقدمة ب \"#\" - لا " +"يُسمح بعناوين IP و wildcards و regex." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"هذه هي القائمة البيضاء المحلية لحظر الإعلانات للسماح دائمًا بنطاقات (فرعية) " +"معينة.
    يُرجى ملاحظة: إضافة مجال واحد فقط في كل سطر. يُسمح بالتعليقات " +"المقدمة ب \"#\" - لا يُسمح بعناوين IP و wildcards و regex." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"تعرض علامة التبويب هذه آخر تقرير DNS تم إنشاؤه ، اضغط على الزر \"تحديث\" " +"للحصول على تقرير حالي." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "وقت" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "حان الوقت لانتظار إعادة تشغيل خلفية DNS ناجحة." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"للحفاظ على تحديث قوائم Adblock الخاصة بك ، يجب عليك إعداد مهمة تحديث تلقائي " +"لهذه القوائم." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "موضوع رسائل البريد الإلكتروني الخاصة بإشعار adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "إجمالي طلبات DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "تأخير الزناد" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "تعذر حفظ التغييرات: s%" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "المتغيرات" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "تسجيل مطول للتصحيح" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"تم حفظ تغييرات القائمة البيضاء. قم بتحديث قوائم منع الإعلانات التي تسري " +"التغييرات عليها." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "القائمة البيضاء ..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "نظام اسم المجال التخزين المؤقت dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "محلل العقد الخفي kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "مجموعة نتائج أعلى حجم." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "خام (/ tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "غير ملزم (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/bg/adblock.po b/package/luci/applications/luci-app-adblock/po/bg/adblock.po new file mode 100644 index 0000000000..a1da05635e --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/bg/adblock.po @@ -0,0 +1,790 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-10-05 12:02+0000\n" +"Last-Translator: Iskren Mihaylov \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Действие" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Активни източници" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Допълнителни настройки" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Директоря за резервни копия" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Източници на списък за блокиране" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Отмени" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Клиент" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Не проверявай SSL сертификати по време на сваляне." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Сваляй несигурно" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Параметри за теглене" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "E-Mail Известяване" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "E-Mail Профил" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "E-Mail Изпращач" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "E-Mail Тема" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Редактирай черен списък" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Редактирай бял списък" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "Включи подрбони журнали в случай на работни грешки." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Разрешен" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Основни настройки" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Информация" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Запази" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/bn_BD/adblock.po b/package/luci/applications/luci-app-adblock/po/bn_BD/adblock.po new file mode 100644 index 0000000000..95d3350dc0 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/bn_BD/adblock.po @@ -0,0 +1,790 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-10-08 18:54+0000\n" +"Last-Translator: Rayhan Nabi \n" +"Language-Team: Bengali (Bangladesh) \n" +"Language: bn_BD\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "চালু উৎস" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "অ্যাডব্লক ক্রিয়া" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "কালো তালিকাভুক্ত ডোমেইন যুক্ত করুন" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "হোয়াইটলিস্ট ডোমেন যুক্ত করুন" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "বাতিল করুন" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "সক্রিয়" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "সাধারণ সেটিংস" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "সংরক্ষণ করুন" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "সেটিংস" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/ca/adblock.po b/package/luci/applications/luci-app-adblock/po/ca/adblock.po new file mode 100644 index 0000000000..31b46fd1ad --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/ca/adblock.po @@ -0,0 +1,792 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-09-17 06:52+0000\n" +"Last-Translator: Roger Pueyo Centelles \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Acció" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Fonts actives" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Blocador d’anuncis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Acció d'Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Afegir domini a la llista negra" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Retard addicional en segons de l’activador abans que comenci el processament " +"del blocador d’anuncis." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Paràmetres DNS avançats" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Paràmetres de correu avançats" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Resposta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Directori de còpies de seguretat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Llista negra..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Peticions DNS blocades" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Dominis blocats" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Fonts de la llista negra" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Cancel•lar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Categories" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Client" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Recompte" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Directori del DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Data" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domini" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Paràmetres de descàrrega" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Utilitat de baixades" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Notificació de correu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Adreça del destinatari de correu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Edita la llista negra" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Edita la llista blanca" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Activat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Purga la memòria cau del DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Força el DNS local" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Paràmetres generals" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Informació" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Darrera execució" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "Llista d’utilitats de descàrrega admeses i plenament preconfigurades." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Servei de prioritat baixa" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Visió de conjunt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Consulta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Actualitza" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Torna a carregar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Reiniciar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Desar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Paràmetres" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Enregistrament detallat de depuració" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/cs/adblock.po b/package/luci/applications/luci-app-adblock/po/cs/adblock.po new file mode 100644 index 0000000000..9c07166891 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/cs/adblock.po @@ -0,0 +1,815 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-09-27 19:02+0000\n" +"Last-Translator: David Rapaň \n" +"Language-Team: Czech \n" +"Language: cs\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Akce" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Aktivní zdroje" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Blokování reklamy Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Akce Adblocku" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Přidat doménu na blacklist" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Přidat doménu na whitelist" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Přidejte tuto (sub)doménu na místní blacklist." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Přidat tuto (sub)doménu na místní whitelist." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Další nastavení" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Dodatečné zpoždění v sekundách před začátkem zpracování blokování reklamy." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Pokročilá nastavení DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +#, fuzzy +msgid "Advanced E-Mail Settings" +msgstr "Rozšířená nastavení e-mailu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Pokročilá nastavení hlášení" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Povolit lokální IP adresy klienta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Odpověd" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Záložní adresář" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Základní dočasný adresář" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Základní adresář pro dočasné soubory všech provozních operací, např. " +"stahování, řazení, slučování atd." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Změny v nastavení blacklistu byly uloženy. Pro aktivaci změn proveďte " +"opakované načtení seznamu." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Blacklist..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Zakázat lokální IP adresy" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Blokuje všechny požadavky určitých DNS klientů na základě jejich IP adres " +"(RPZ-CLIENT-IP). Poznámka: Tato funkcionalita je pouze podporována backendem " +"DNS bind." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Blokované požadavky DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Blokované domény" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Záloha blokovacího seznamu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Vyhledání v seznamech blokovaných" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Dotaz na blokovací seznam..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Zdroje seznamů blokování" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Vytvoří dodatečný blokovací seznam DNS pro zablokování přístupu ke všem " +"doménám kromě těch uvedených ve whitelistu. Upozornění: Tento restriktivní " +"blokovací seznam je možno využít například pro síť pro hosty či pro " +"konfiguraci dětské pojistky." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Zrušit" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Kategorie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Klient" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Klienti" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Počet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Vytváří komprimované zálohy blokovacího seznamu, budou použity v případě " +"chyb při stahování nebo po příštím spuštění." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Adresář DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Datum" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Doména" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domény" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Parametry stahování" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Nástroj pro stahování" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Oznámení e-mailem" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Počet e-mailových oznámení" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "E-mailový profil" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Adresa příjemce e-mailu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Adresa odesílatele e-mailu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Téma e-mailu" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Upravit blacklist" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Upravit whitelist" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Povolit bezpečné vyhledávání (SafeSearch)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Povolit střední filtry SafeSearch pro youtube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Povolit službu adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Zapnuto" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "Vynutit SafeSearch pro Google, Bing, DuckDuckGo, Yandex a Pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Stávající úlohy" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Externí doména pro ověření úspěšného restartováni DNS backendu. Pro vypnutí " +"tohoto ověření prosím vyberte možnost \"false\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Vyprázdnit mezipaměť DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Vynutit lokální DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Vynucené porty" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Vynucené zóny" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Obecná nastavení" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Informace" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Poslední spuštění" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Poslední dotazy DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Omezit SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Omezit SafeSearch na vybrané poskytovatele." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Číslo řádku k odstranění" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Seznam dostupných síťových zařízení pro tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Seznam dostupných síťových zařízení pro spuštění adblocku. Vyberte " +"\"unspecified\" pro využití klasického start-timeout mechanismu místo " +"síťového spouštění." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Seznam podporovaných DNS backendů a jejich standardních seznamových složek. " +"Pro přepsání výchozího adresáře použijte možnost \"Adresář DNS\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Seznam podporovaných a plně předkonfigurovaných nástrojů pro stahování." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Zobrazení protokolu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Služba s nízkou prioritou" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Žádné výsledky dotazu!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Zatím nejsou k dispozici žádné protokolové záznamy ohledně adblocku!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Přehled" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "Profil \"msmtp\" pro e-mailové oznámení adblocku." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Dotaz" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Adresa příjemce pro e-maily s upozorněním." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Přesměrovat veškeré dotazy DNS ze specifikovaných zón k lokálnímu " +"rekurzivnímu serveru DNS pro protokoly UDP a TCP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Aktualizovat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Zmírnit SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Počet bloků sestavy" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Velikost bloků sestavy" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Adresář sestav" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Rozhraní sestavy" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Restart" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Uložit" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Nastavení" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Pozastavit" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "Cílový adresář pro vygenerovaný blokovací seznam 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "Předfiltrovaný výstup syslog pouze se záznamy souvisejícími s adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Čas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Prodleva spuštění" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Podrobné protokolování ladění" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/da/adblock.po b/package/luci/applications/luci-app-adblock/po/da/adblock.po new file mode 100644 index 0000000000..406b17a47a --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/da/adblock.po @@ -0,0 +1,859 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-04-24 17:51+0000\n" +"Last-Translator: drax red \n" +"Language-Team: Danish \n" +"Language: da\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Handling" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Aktive kilder" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Adblock handling" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Tilføj sortlistedomæne" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Tilføj hvidlistedomæne" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Tilføj dette (under-)domæne til din lokale sortliste." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Tilføj dette (under-)domæne til din lokale hvidliste." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Yderligere fængselsblokeringsliste" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Yderligere indstillinger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Yderligere udløserforsinkelse i sekunder, før behandlingen af adblock " +"begynder." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Avancerede DNS-indstillinger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Avancerede indstillinger for e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Avancerede rapportindstillinger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Tillad lokale klient-IP'er" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Tillad alle anmodninger fra visse DNS-klienter baseret på deres IP-adresse " +"(RPZ-CLIENT-IP). Bemærk: Denne funktion er i øjeblikket kun understøttet af " +"bind DNS backend." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Svar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Backup Mappe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Midlertidig basismappe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Midlertidig basismappe for alle adblock-relaterede runtime-operationer, f." +"eks. downloading, sortering, sammenlægning osv." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Ændringerne på sortlisten er blevet gemt. Opdater dine adblock-lister, så " +"ændringerne træder i kraft." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Sortliste..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Bloker lokale klient-IP'er" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Bloker alle anmodninger fra visse DNS-klienter baseret på deres IP-adresse " +"(RPZ-CLIENT-IP). Bemærk: Denne funktion er i øjeblikket kun understøttet af " +"bind DNS backend." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Blokerede DNS-anmodninger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Blokerede domæner" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Blokliste Backup" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Blokliste Forespørgsel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Blokliste Forespørgsel..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Blokliste kilder" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Opretter en ekstra DNS blokeringsliste for at blokere adgangen til alle " +"domæner undtagen dem, der er anført på hvidlisten. Bemærk: Du kan bruge " +"denne restriktive blokliste til f.eks. gæstewifi eller børnesikre " +"konfigurationer." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Annuller" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Kategorier" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Klient" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Klienter" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Konfiguration af adblock-pakken til at blokere annonce-/misbrugsdomæner ved " +"at bruge DNS. For yderligere information se online dokumentationen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Tælle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Opret komprimerede backups af bloklisterne, de vil blive brugt i tilfælde af " +"downloadfejl eller under opstart." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS Backend" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS Mappe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "DNS Instans" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "DNS Rapport" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Tidsgrænse for genstart af DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Dato" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Deaktiver DNS Tillad" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Deaktiver selektiv DNS hvidlisting (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domæne" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domæner" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Kontroller ikke SSL-servercertifikater under download." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Download usikker" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Download parametre" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Download hjælpeprogram" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Meddelelse pr. e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Antal e-mail meddelelser" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "E-mail profil" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Modtagerens e-mailadresse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "E-mail afsenderadresse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "E-mail emne" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Rediger sortliste" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Rediger hvidliste" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Tøm DNS-cachen, før behandlingen af adblock starter, for at reducere " +"hukommelsesforbruget." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Aktiver SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Aktiver moderate SafeSearch-filtre for youtube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Aktiver adblock-tjenesten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" +"Aktiver verbose debug-logning i tilfælde af eventuelle behandlingsfejl." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Aktiver" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Sluttidsstempel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Håndhævelse af SafeSearch for google, bing, duckduckgo, yandex, youtube og " +"pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Eksisterende job(s)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Eksternt DNS-opslagsdomæne" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Eksternt domæne for at tjekke for en vellykket DNS-backend-genstart. Bemærk " +"venligst : For at deaktivere denne kontrol skal du indstille denne " +"indstilling til 'falsk'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Femte instans" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Filtrer kriterier som dato, domæne eller klient (valgfrit)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Firewall porte, der skal tvinges lokalt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Firewall-kildezoner, der skal tvinges lokalt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Første instans (standard)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Flush DNS Cache" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Tvinge lokal DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Tvungne Porte" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Tvungne Zoner" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Fjerde instans" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Saml DNS-relateret netværkstrafik via tcpdump og giv en DNS-rapport efter " +"behov. Bemærk venligst: dette kræver yderligere 'tcpdump' eller 'tcpdump-" +"mini'-pakkeinstallation og en fuldstændig genstart af adblock-tjenesten for " +"at træde i kraft." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Generelle indstillinger" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Giv adgang til LuCI-appen adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Information" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Fængselsmappe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Sidste kørsel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Seneste DNS-anmodninger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Begræns SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Begræns SafeSearch til visse udbydere." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Linjenummer, der skal fjernes" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Liste over tilgængelige netværksenheder, der bruges af tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Liste over tilgængelige netværks interfaces til at udløse adblock-starten. " +"Vælg 'uspecificeret' for at bruge en klassisk start-timeout i stedet for en " +"netværkstrigger." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Liste over understøttede DNS-backends med deres standardlistemappe. Brug " +"indstillingen 'DNS Mappe' for at overskrive standardstien." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Liste over understøttede og fuldt forudkonfigurerede downloadværktøjer." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Logvisning" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Tjeneste med lav prioritet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Manuelt tilsidesætte de forudkonfigurerede downloadindstillinger for det " +"valgte downloadværktøj." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Ingen forespørgselsresultater!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Ingen adblock-relaterede logs endnu!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Oversigt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "Profil brugt af 'msmtp' til adblock-meddelelses-e-mails." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Forespørgsel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" +"Forespørg på aktive blokeringslister og backups for et specifikt domæne." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Forhøjer antallet af meddelelser for at få e-mails, hvis det samlede antal " +"på bloklisten er mindre end eller lig med den angivne grænse." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Modtageradresse for adblock-meddelelses-e-mails." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Omdiriger alle DNS-forespørgsler fra specificerede zoner til den lokale DNS-" +"resolver, gælder for UDP- og TCP-protokol." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Nedsæt prioriteten for adblock-baggrundsbehandlingen for at tage færre " +"ressourcer fra systemet. Bemærk: Denne ændring kræver en fuldstændig " +"genstart af adblock-tjenesten for at få virkning." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Opdater" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Opdater DNS-rapport" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Opdateringstimer" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Opdateringstimer..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Opdater..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Slap af SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Genindlæs" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Fjern et eksisterende job" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Rapportér Chunk Count" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Rapporter Chunk Størrelse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Rapportmappe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Rapport Interface" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Rapportporte" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Rapporter chunk count brugt af tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Rapporter chunk størrelse brugt af tcpdump i MByte." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Resolve IP'er" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" +"Resolve rapporterende IP-adresser ved at bruge omvendte DNS-opslag (PTR)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Genstart" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Resultat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Kør mapper" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Kør flag" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Kør Interfaces" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Kør hjælpeprogrammer" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Gem" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Anden instans" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Send adblock-relaterede notifikations-e-mails. Bemærk venligst: dette kræver " +"yderligere 'msmtp'-pakkeinstallation." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Afsenderadresse for adblock-notifikations-e-mails." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Indstil et nyt adblock-job" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Indstil den dns-backend-instans, der bruges af adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Indstillinger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Kilder (størrelse, fokus)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" +"En liste over porte, der er separeret med mellemrum, og som anvendes af " +"tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Start-tidsstempel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Interface for opstartstrigger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Status / version" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Suspendere" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Destinationsmappe til DNS-relaterede rapportfiler." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Destinationsmappe til backups af bloklister." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" +"Destinationsmappe for den genererede blokeringsliste 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" +"Destinationsmappe for den genererede jail-blokeringsliste 'adb_list.jail'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Opdateringstimeren kunne ikke opdateres." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Opdateringstimeren er blevet opdateret." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "Ugedagen (opt., værdier: 0-6 evt. sep. med , eller -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "Timeportionen (anmodning, interval: 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "Minutterdelen (opt., interval: 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "Syslog-outputtet, kun præfiltreret for adblock-relaterede meddelelser." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Tredje instans" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Dette er den lokale adblock sortliste, der altid afviser visse (sub)domæner." +"
    Bemærk: tilføj kun ét domæne pr. linje. Kommentarer indledt med '#' " +"er tilladt - ip-adresser, wildcards og regex er ikke tilladt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Dette er den lokale adblock whitelist, der altid tillader visse (sub)domæner." +"
    Bemærk: tilføj kun ét domæne pr. linje. Kommentarer indledt med '#' " +"er tilladt - ip-adresser, wildcards og regex er ikke tilladt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Denne fane viser den sidst genererede DNS-rapport, tryk på knappen 'Opdater' " +"for at få en aktuel rapport." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Tid" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Timeout til at vente på en vellykket genstart af DNS-backend." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"For at holde dine adblock-lister opdaterede, bør du konfigurere et " +"automatisk opdateringsjob for disse lister." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Topstatistik" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Emne for adblock-notifikations-e-mails." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Samlede DNS-anmodninger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Udløserforsinkelse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Kunne ikke gemme ændringer: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Varianter" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Verbose Debug Logning" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Ændringerne i den Whitelist er blevet gemt. Opdater dine adblock-lister, så " +"ændringerne træder i kraft." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Hvidliste..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "max. resultatsæts størrelse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "max. topstatistik" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "rå (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/de/adblock.po b/package/luci/applications/luci-app-adblock/po/de/adblock.po new file mode 100644 index 0000000000..aa7ad4ac37 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/de/adblock.po @@ -0,0 +1,856 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-08-20 12:46+0000\n" +"Last-Translator: Felix Baumann \n" +"Language-Team: German \n" +"Language: de\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Aktion" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Aktive Quellen" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Werbeblocker" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Adblock Aktion" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Füge Blacklist-Domain hinzu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Füge Whitelist-Domain hinzu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Füge diese (Sub-)Domain zur lokalen Blacklist." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Füge diese (Sub-)Domain zur lokalen Whiteklist." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Zusätzliche Jail-Sperrliste" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Zusätzliche Einstellungen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Zusätzliche Verzögerung (in Sekunden) bis zur Verarbeitung durch den " +"Werbeblocker." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Erweiterte DNS Einstellungen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Erweiterte E-Mail Einstellungen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Erweiterte Berichtseinstellungen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Lokale Client-IPs zulassen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Alle Anfragen bestimmter DNS-Clients basierend auf deren IP-Adresse (RPZ-" +"CLIENT-IP) erlauben. Bitte beachten: Diese Funktion wird derzeit nur vom " +"bind DNS-Backend unterstützt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Antwort" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Backupverzeichnis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Basis-Temp-Verzeichnis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Basis-Temp-Verzeichnis für alle Adblock-relevanten Speicherzugriffe, z.B. " +"Merging, Downloads, Sortieren etc." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Änderung der Blackliste gespeichert. Aktualisiere deine Adblock-Liste, um " +"die Änderungen zu übernehmen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Blockierliste..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Lokale Client-IPs blockieren" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Alle Anfragen von bestimmten DNS-Clients auf Basis ihrer IP-Adresse (RPZ-" +"CLIENT-IP) blockieren. Bitte beachten: Diese Funktion wird derzeit nur vom " +"bind DNS-Backend unterstützt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Geblockte DNS-Anfragen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Gesperrte Domains" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Sperrliste Backup" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Sperrlistenabfrage" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Sperrlisten abfragen..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Blockierlisten-Quellen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Erzeugt eine zusätzliche DNS-Sperrliste um alles ausser Domains in der " +"Whitelist zu blockieren. Hinweis: eine solche restriktive Sperrliste kann z." +"B. für Gast-Wlans oder als Kindersicherung genutzt werden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Abbrechen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Kategorien" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Client" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Clientes" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Konfiguration des Adblock-Pakets um Werbe- und schädliche Domains zu via DNS " +"zu sperren. Weitere Informationen befindet sich in der Dokumentation" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Anzahl" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Erzeuge komprimierte Backups der Sperrlisten, um die Sperrfunktion schon " +"sofort ab dem Booten oder im Fall von Downloadfehlern zur Verfügung zu haben." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS-Backend" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS-Verzeichnis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "DNS-Instanz" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "DNS-Report" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "DNS-Restart-Timeout" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Datum" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Deaktiviere DNS-Zulassen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Das selektive DNS-Whitelisting deaktivieren (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domäne" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domänen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Während des Downloads keine SSL-Serverzertifikate überprüfen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Unsicher herunterladen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Download Parameter" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Download-Werkzeug" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "E-Mail-Benachrichtigung" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "E-Mail Benachrichtigungszähler" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "E-Mail-Profil" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "E-Mail Empfängeradresse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "E-Mail Absenderadresse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "E-Mail-Thema" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Blockierliste bearbeiten" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Positivliste bearbeiten" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Den DNS-Cache leeren, bevor die Adblock-Verarbeitung beginnt, den " +"Speicherverbrauch zu reduzieren." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Aktiviere SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Aktiviere moderate SafeSearch-Filter für YouTube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Aktiviere den Adblock-Dienst." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" +"Aktiviere das ausführliche Anwendungs-Logging bei Verarbeitungsfehlern." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Aktiviert" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Ende-Zeitstempel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "Erzwinge SafeSearch für Google, Bing, DuckDuckGo, Yandex und Pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Bestehende Job(s)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Externe DNS Lookup Domain" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Externe Beispiel-Domain um einen erfolgreichen Neustart des DNS-Backend zu " +"prüfen. Auf \"false\" setzen, um dies zu deaktivieren." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Fünfte Instanz" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Filterkriterien wie z.B. Datum, Domain oder Client (optional)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Firewall-Ports, die lokal erzwungen/aufgelöst werden sollen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Firewall-Zonen, die lokal erzwungen/aufgelöst werden sollen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Erste Instanz (Standard)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "DNS-Cache leeren" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Lokale DNS-Auflösung erzwingen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Erzwungene Ports" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Erzwungene Zonen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Vierte Instanz" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"DNS-relevanten Netzwerkverkehr via tcpdump mitschneiden um einen DNS-Report " +"auf Abruf bereitstellen zu können. Hinweis: Hierzu muss das Paket \"tcpdump-" +"mini\" installiert und der Adblock-Dienst danach neugestartet worden sein." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Allgemeine Einstellungen" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Zugriff auf LuCI adblock-App gewähren" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Informationen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Sperrverzeichnis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Letzter Durchgang" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Neueste DNS Anfragen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "SafeSearch einschränken" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "SafeSearch auf bestimmte Anbieter einschränken." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Zu entfernende Zeile" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" +"Liste an verfügbaren Netzwerkschnittstellen die von tcpdump verwendet werden " +"können." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Liste an verfügbaren Netzwerkschnittstellen um einen Adblock-Start zu " +"triggern. Wähle \"unspecified\", um einen herkömmlichen Start-Timeout-" +"Mechanismuss anstatt eines Netzwerk-Triggers zu verwenden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Liste an unterstützten DNS-Backens und deren Standard-Listenverzeichnissen. " +"Um einen Standardpfad zu überschreiben, nutze die \"DNS-Verzeichnis\"-Option." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Liste der unterstützten und vollständig vorkonfigurierten Download-" +"Hilfsprogramme." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Protokollansicht" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Dienst mit niedriger Priorität" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Die vorkonfigurierten Download-Optionen für das ausgewählte Download-" +"Dienstprogramm manuell außer Kraft setzen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Keine Abfrageergebnisse!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Aktuell noch keine Adblock-Logs vorhanden!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Übersicht" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" +"\"msmtp\"-Profil, das für Adblock-Benachrichtigunsmails verwendet wird." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Abfrage" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "Frage aktive Sperrlisten und Backups über eine spezifische Domain ab." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Erhöhe den Benachrichtigunszähler um Emails zu erhalten, wenn die Gesamtzahl " +"der Blocklisten kleiner gleich diesem Schwellwert ist." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Empfängeradresse für Adblock-Benachrichtigungs-E-Mails." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Leitet alle DNS-Anfragen aus den angegebenen Zonen an den lokalen DNS-" +"Resolver um, gilt für das UDP- und TCP-Protokoll." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Erniedrige die Priorität des Adblock-Hintergrundprozesses um die Auslastung " +"des Systems zu verringern. Hinweis: Diese Änderung benötigt einen Neustart " +"des Adblock-Dienstes um in Kraft zu treten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Aktualisieren" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Aktualisiere DNS-Report" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Timer" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Timer..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Aktualisiere..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "SafeSearch abschwächen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Neu laden" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Entferne einen vorhandenen Job" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Berichte Datenblock-Anzahl" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Berichte Datenblock-Größe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Report-Verzeichnis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Berichte-Schnittstelle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Berichte Ports" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Berichte Datenblock-Nutzung durch tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Berichte von tcpdump verwendete Datenblockgröße in MByte." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "IPs auflösen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" +"Auflösen von IP-Adressen für die Berichterstattung mithilfe von Reverse DNS " +"(PTR) Lookups." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Neustart" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Ergebnis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Run-Verzeichnisse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Laufzeit-Flags" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Run-Interfaces" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Run-Werkzeuge" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Speichern" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Zweite Instanz" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Sende relevante Adblock-Benachrichtigungen per Email. Hinweis: Hierzu muss " +"das \"msmtp\"-Zusatzpaket installiert sein." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Absenderadresse für Adblock-Benachrichtigungsmails." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Setze einen neuen adblock Job" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Die von Adblock verwendete DNS-Backend-Instanz festlegen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Einstellungen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Quellen (Größe, Fokus)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Leerzeichengetrennte Liste an Ports die von tcpdump genutzt werden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Start-Zeitstempel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Trigger-Interface fürs Starten" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Status / Version" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Anhalten" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Zielverzeichnis für DNS-bezogene Report Dateien." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Zielverzeichnis für Backups von Blocklisten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "Zielverzeichnis für die erzeugte Sperrliste 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "Zielverzeichnis für die erzeugte Jail-Sperrliste \"adb_list.jail\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Der Timer konnte nicht aktualisiert werden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Der Timer wurde aktualisiert." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "Der Wochentag (opt., Werte: 0-6 getrennt druch \",\" oder \"-\")" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "Der Stundenteil (Werte zw. 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "Der Minutenteil (Werte zw. 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "Die Syslog-Ausgabe, vorgefiltert nur für Adblock-bezogene Nachrichten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Dritte Instanz" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Dies hier ist die lokale Adblock-Blackliste, um bestimmte (Sub-) Domains " +"immer zu sperren.
    Hinweis: Nur eine Domain je Zeile ist erlaubt, " +"Kommentare mit # am Anfang ebenfalls, nicht jedoch IP-Adressen, Wildcards " +"und Regex-Ausdrücke." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Dies hier ist die lokale Adblock-Whiteliste, um bestimmte (Sub-) Domains " +"immer zu erlauben.
    Hinweis: Nur eine Domain je Zeile ist erlaubt, " +"Kommentare mit # am Anfang ebenfalls, nicht jedoch IP-Adressen, Wildcards " +"und Regex-Ausdrücke." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Auf diesem Tab ist der letzte generierte DNS Report zu sehen, drücke " +"'Aktualisieren' um ihn neu zu erstellen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Zeit" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Timeout für erfolgreichen DNS-Backend-Startvorgang." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Um die Adblock-Liste aktuell zu halten, sollte dafür ein automatischer " +"Update-Job eingerichtet werden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Top-Statistiken" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Betreff für Adblock-Benachrichtigungsmails." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Gesamte DNS-Anfragen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Verzögerung der Trigger-Bedingung" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Konnte Änderungen nicht speichern: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Varianten" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Ausführliche Debug-Protokollierung" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Änderungen der Positivliste wurden gespeichert. Aktualisiere die adblock-" +"Verarbeitung um die Änderung anzuwenden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Positivliste..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "Max. Größe des Result-Sets" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "Max. Top-Statistiken" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/el/adblock.po b/package/luci/applications/luci-app-adblock/po/el/adblock.po new file mode 100644 index 0000000000..dd9f47e28a --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/el/adblock.po @@ -0,0 +1,792 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-12-06 01:48+0000\n" +"Last-Translator: deb8ate \n" +"Language-Team: Greek \n" +"Language: el\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.15-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Δράση" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Ενεργές Πηγές" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Aντιδιαφημιστικό" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Δράση αντιδιαφημιστικού" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Προσθήκη κακόβουλου domain" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Προσθήκη επιτρεπόμενου domain" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Προσθέστε αυτό το (sub-)domain στην τοπική μαύρη λίστα." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Προσθέστε αυτό τον(sub-)domain στην τοπική λίστα επιτρεπόμενων." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Πρόσθετος κατάλογος αποκλεισμού" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Επιπρόσθετες ρυθμίσεις" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Επιπρόσθετη ενέργεια καθυστέρησης σε δευτερόλεπτα πρωτού ξεκινήσει η " +"αντιδιαφημιστική επεξεργασία." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Σύνθετες ρυθμίσεις DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Προηγμένες ρυθμίσεις ηλεκτρονικού ταχυδρομείου" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Σύνθετες ρυθμίσεις αναφοράς" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Να επιτρέπονται οι IPs τοπικών client" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Απάντηση" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "φάκελος διάσωσης" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Αποκλεισμένα αιτήματα DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Λίστα Μπλοκαρισμένων πηγών" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Ακύρωση" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "πελάτης" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Μέτρηση" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "κατάλογος DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Ημερομηνία" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Ενεργοποιήθηκε" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Γενικές ρυθμίσεις" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Ρυθμίσεις" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/en/adblock.po b/package/luci/applications/luci-app-adblock/po/en/adblock.po new file mode 100644 index 0000000000..6fb59cafe8 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/en/adblock.po @@ -0,0 +1,790 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-11-30 14:34+0000\n" +"Last-Translator: rygle \n" +"Language-Team: English \n" +"Language: en\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.3-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Cancel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Client" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Enabled" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "General Settings" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Overview" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/es/adblock.po b/package/luci/applications/luci-app-adblock/po/es/adblock.po new file mode 100644 index 0000000000..709c3030bb --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/es/adblock.po @@ -0,0 +1,870 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2022-10-21 05:07+0000\n" +"Last-Translator: Franco Castillo \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14.2-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Acción" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Fuentes activas" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Acción de Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Agregar dominio de lista negra" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Agregar dominio de lista blanca" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Agregue este (sub) dominio a su lista negra local." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Agregue este (sub) dominio a su lista blanca local." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Lista de bloqueo adicional de la cárcel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Configuración adicional" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Demora adicional del disparador en segundos antes de que comience el " +"procesamiento de adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Configuración avanzada de DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Configuración avanzada de correo electrónico" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Configuración avanzada de informes" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Permitir direcciones IP de clientes locales" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Permitir todas las peticiones de ciertos clientes DNS en función de su " +"dirección IP (RPZ-CLIENT-IP). Tenga en cuenta: esta función actualmente solo " +"es compatible con bind DNS backend." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Responder" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Directorio de respaldo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Directorio temporal base" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Directorio temporal base para todas las operaciones de tiempo de ejecución " +"relacionadas con adblock, p. Ej. descarga, clasificación, fusión, etc." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Se han guardado los cambios en la lista negra. Actualice sus listas de " +"bloqueos de anuncios para que los cambios surtan efecto." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Lista negra..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Bloquear direcciones IP de clientes locales" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Bloquea todas las peticiones de ciertos clientes DNS en función de su " +"dirección IP (RPZ-CLIENT-IP). Tenga en cuenta: esta función actualmente solo " +"es compatible con bind DNS backend." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Peticiones DNS bloqueadas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Dominios bloqueados" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Copia de seguridad de lista de bloqueo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Consulta de lista de bloqueo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Consulta de lista de bloqueo..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Fuentes de lista de bloqueo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Crea una lista de bloqueo DNS adicional para bloquear el acceso a todos los " +"dominios, excepto los que figuran en la lista blanca. Tenga en cuenta: puede " +"usar esta lista de bloqueo restrictiva, p. para configuraciones de wifi para " +"invitados o kidsafe." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Cancelar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Categorías" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Cliente" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Clientes" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Configuración del paquete adblock para bloquear dominios de publicidad/abuso " +"mediante DNS. Para obtener más información consulte la documentación en línea" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Contar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Cree copias de seguridad de listas de bloqueo comprimidas, se utilizarán en " +"caso de errores de descarga o durante el inicio." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "Backend de DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Directorio DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "Instancia DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "Informe DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Tiempo de espera de reinicio de DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Fecha" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Desactivar Permitir DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Desactivar la lista blanca selectiva de DNS (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Dominio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Dominios" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "No verificar los certificados SSL del servidor durante la descarga." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Descarga insegura" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Descargar parámetros" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Utilidad de descarga" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Notificación por correo electrónico" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Conteo de notificaciones por E-Mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "Perfil de correo electrónico" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Dirección del destinatario de correo electrónico" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Dirección del remitente de correo electrónico" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Tema del correo electrónico" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Editar lista negra" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Editar lista blanca" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Vaciar la caché de DNS antes de que comience el procesamiento de adblock " +"para reducir el consumo de memoria." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Activar SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Activar filtros moderados de SafeSearch para YouTube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Activa el servicio Adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" +"Activar el registro de depuración detallado en caso de errores de " +"procesamiento." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Activado" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Finalizar marca de tiempo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Hacer cumplir SafeSearch para google, bing, duckduckgo, yandex, youtube y " +"pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Trabajo(s) existente(s)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Dominio de búsqueda de DNS externo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Dominio externo para verificar si un reinicio del servidor DNS ha sido " +"exitoso. Tenga en cuenta: para desactivar esta comprobación, configure esta " +"opción en 'falso'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Quinta instancia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Criterios de filtro como fecha, dominio o cliente (opcional)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Puertos del cortafuegos que deben forzarse localmente." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Zonas de origen del cortafuegos que deben forzarse localmente." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Primera instancia (predeterminada)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Vaciar caché de DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Forzar DNS local" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Puertos forzados" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Zonas forzadas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Cuarta instancia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Reúna el tráfico de red relacionado con DNS a través de tcpdump y " +"proporcione un Informe DNS a pedido. Tenga en cuenta: esto necesita " +"instalación adicional del paquete 'tcpdump-mini' y un reinicio completo del " +"servicio adblock para que surta efecto." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Configuración general" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Conceder acceso a la aplicación adblock de LuCI" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Información" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Directorio de la cárcel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Último inicio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Últimas peticiones DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Limitar SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Limitar SafeSearch a proveedores specíficos." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Número de línea para eliminar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Lista de dispositivos de red disponibles utilizados por tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Lista de interfaces de red disponibles para activar el inicio de adblock. " +"Elija 'No especificado' para usar un tiempo de espera de inicio clásico en " +"lugar de un disparador de red." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Lista de backends DNS compatibles con su directorio de lista predeterminado. " +"Para sobrescribir la ruta predeterminada, use la opción 'Directorio DNS'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Lista de utilidades de descarga totalmente preconfiguradas y compatibles." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Vista de registro" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Servicio con prioridad baja" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Anular manualmente las opciones de descarga preconfiguradas para la utilidad " +"de descarga seleccionada." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "¡No hay resultados de consulta!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "¡Aún no hay registros relacionados con adblock!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Visión general" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "Perfil utilizado por 'msmtp' para notificaciones de E-Mails adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Consulta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" +"Consulta listas de bloqueo activas y copias de seguridad para un dominio " +"específico." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Aumente el recuento de notificaciones para obtener correos electrónicos si " +"el recuento general de la lista de bloqueo es menor o igual al límite dado." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Dirección del receptor para la notificación de bloqueos electrónicos." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Redirigir todas las consultas de DNS de las zonas especificadas al sistema " +"de resolución de DNS local, se aplica a los protocolos UDP y TCP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Reduzca la prioridad del procesamiento en segundo plano de adblock para " +"tomar menos recursos del sistema. Tenga en cuenta: este cambio requiere un " +"reinicio completo del servicio adblock para que surta efecto." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Refrescar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Actualizar informe DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Temporizador de actualización" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Actualizar temporizador..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Actualizar..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Relajar SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Recargar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Eliminar un trabajo existente" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Informar recuento de fragmentos" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Informar tamaño de fragmentos" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Informar directorio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Informar interfaz" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Informar puertos" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Informar recuento de fragmentos utilizados por tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Informar tamaño de fragmentos utilizados por tcpdump en MByte." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Resolver IPs" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" +"Resuelva las direcciones IP de informes mediante búsquedas de DNS inversas " +"(PTR)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Reiniciar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Resultado" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Ejecutar directorios" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Ejecutar banderas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Ejecutar interfaces" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Ejecutar utilidades" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Guardar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Segunda instancia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Enviar correos electrónicos de notificación relacionados con adblock. Tenga " +"en cuenta: esto necesita una instalación adicional del paquete 'msmtp'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" +"Dirección del remitente para los correos electrónicos de notificación de " +"adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Establecer un nuevo trabajo de adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Establecer la instancia de backend de dns utilizada por adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Configuraciones" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Fuentes (tamaño, enfoque)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Lista de puertos separados por espacios utilizados por tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Iniciar marca de tiempo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Interfaz de activación de inicio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Estado/Versión" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Suspender" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Directorio de destino para archivos de informes relacionados con DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Directorio de destino para copias de seguridad de listas de bloqueo." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" +"Directorio de destino para la lista de bloqueo generada 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" +"Directorio de destino para la lista de bloqueo de cárcel generada 'adb_list." +"jail'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "No se pudo actualizar el temporizador de actualización." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Se ha actualizado el temporizador de actualización." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" +"El día de la semana (opt., valores: 0-6 posiblemente separados por , o -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "El reparto de horas (req., rango: 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "La porción de minutos (opcional, rango: 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"La salida de syslog, prefiltrada solo para mensajes relacionados con adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Tercera instancia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Esta es la lista negra de bloque de anuncios local para negar siempre " +"ciertos (sub) dominios.
    Tenga en cuenta: agregue solo un dominio por " +"línea. Los comentarios introducidos con '#' están permitidos; las " +"direcciones IP, comodines y expresiones regulares no." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Esta es la lista blanca de bloque de anuncios local para permitir siempre " +"ciertos (sub) dominios.
    Tenga en cuenta: agregue solo un dominio por " +"línea. Los comentarios introducidos con '#' están permitidos; las " +"direcciones IP, comodines y expresiones regulares no." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Esta pestaña muestra el último informe DNS generado, presione el botón " +"'Actualizar' para obtener uno actual." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Hora" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Tiempo de espera para esperar un reinicio de backend de DNS exitoso." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Para mantener sus listas de bloqueos de anuncios actualizadas, debe " +"configurar un trabajo de actualización automática para estas listas." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Estadísticas principales" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Tema para los correos electrónicos de notificación de adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Peticiones DNS totales" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Retraso de disparo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "No se pudo guardar los cambios: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Variantes" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Registro de depuración detallado" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Se han guardado los cambios en la lista blanca. Actualice sus listas de " +"bloqueos de anuncios para que los cambios surtan efecto." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Lista blanca..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "máx. tamaño del conjunto de resultados" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "máx. estadísticas principales" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "crudo (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/fi/adblock.po b/package/luci/applications/luci-app-adblock/po/fi/adblock.po new file mode 100644 index 0000000000..58ef296c22 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/fi/adblock.po @@ -0,0 +1,809 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-18 05:43+0000\n" +"Last-Translator: Jiri Grönroos \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.1\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Toiminta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Aktiiviset lähteet" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Mainosesto" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Adblockin toimi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Lisää verkkonimi kieltolistalle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Lisää verkkonimi sallittujen listalle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Lisää tämä (ali-)verkkonimi kieltolistallesi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Lisää tämä (ali-)verkkonimi sallittujen listallesi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Lisäasetukset" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Ylimääräinen odotusaika sekunteina ennen adblock-käsittelyn aloittamista." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "DNS-lisäasetukset" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Sähköpostin lisäasetukset" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Raportoinnin lisäasetukset" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Salli paikallisten asiakkaiden IP-osoitteet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Salli kaikki tiettyjen DNS-asiakkaiden pyynnöt niiden IP-osoitteen (RPZ-" +"CLIENT-IP) perusteella. Huomaa: Tätä ominaisuutta tukee tällä hetkellä vain " +"bind DNS -taustajärjestelmä." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Vastaus" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Varmuuskopiohakemisto" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Oletushakemisto väliaikaistiedostoille" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Väliaikaistiedostojen hakemisto adblockin toiminnoille, esim. listojen " +"lataus, sorttaus ja yhdistäminen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Kieltolistan muutokset on tallennettu. Virkistä adblock-listat ottaaksesi " +"muutokset käyttöön." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Kieltolista..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Estä paikallisten asiakkaiden IP-osoitteet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Estä tiettyjen DNS-asiakkaiden kaikki pyynnöt niiden IP-osoitteen (RPZ-" +"CLIENT-IP) perusteella. Huomaa: Tätä ominaisuutta tukee tällä hetkellä vain " +"bind DNS -taustajärjestelmä." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Estetyt DNS-pyynnöt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Estetyt verkkonimet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Kieltolistan varmuuskopio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Estolistan kysely" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Estoluettelon kysely..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Estolistojen lähteet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Luo ylimääräisen DNS-estoluettelon estääkseen pääsyn kaikille " +"verkkotunnuksille paitsi sallittujen luettelossa lueteltuihin. Huomaa: Voit " +"käyttää tätä rajoittavaa estolistaa esim. vieraiden wifi- tai kidsafe-" +"kokoonpanoille." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Peruuta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Luokat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Asiakas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Asiakkaat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Määrä" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Luo pakattuja estoluettelon varmuuskopioita, joita käytetään latausvirheiden " +"sattuessa tai käynnistyksen aikana." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS-sovellus" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS-hakemisto" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "DNS-instanssi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "DNS-raportti" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "DNS:n uudelleenkäynnistyksen aikaraja" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Päivä" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Estä DNS:n salliminen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Verkkotunnus" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Verkkotunnukset" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Älä tarkista SSL-palvelinvarmenteita latauksen aikana." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Latausparametrit" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Lataustyökalu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Sähköposti-ilmoitus" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Sähköposti-ilmoitusten määrä" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "Sähköpostiprofiili" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Sähköposti: vastaanottajan osoite" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Sähköposti: lähettäjän osoite" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Sähköposti: otsikko" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Editoi estolistaa" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Editoi sallittujen lista" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Ota SafeSearch käyttöön" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Ota käyttöön kohtuulliset SafeSearch-suodattimet youtubea varten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Ota Adblock-palvelu käyttöön." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "Runsas lokisisältö toimintojen virheiden etsimistä varten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Käytössä" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Loppumisaikaleima" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"SafeSearchin pakottaminen googlelle, bingille, duckduckgolle, yandexille, " +"youtubelle ja pixabaylle." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Nykyiset työt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Viides instanssi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Suodatintekijät kuten päivä, verkkonimi tai asiakas (valinnainen)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Ensimmäinen instanssi (oletus)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Tyhjennä DNS-välimuisti" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Pakota paikallinen DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Pakotetut portit" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Pakotetut alueet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Neljäs instanssi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Yleiset asetukset" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Salli pääsy Adblock-asetuksiin" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Tietoja" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Viimeksi ajettu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Viimeiset DNS-kyselyt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "Tuetut ja valmiiksi asetetut lataustyökalut." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Lokinäkymä" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Matala sovelluksen prioriteetti" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Ei kyselyn tuloksia!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Ei vielä Adblock-lokeja!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Yleiskatsaus" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Kysely" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Vastaanottajan sähköpostiosoite Adblockin ilmoituksille." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Päivitä" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Päivitä DNS-raportti" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Päivitä ajastin" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Päivitysajastin..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Päivitä..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Lataa uudelleen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Poista olemassa oleva työ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Raporttipalojen määrä" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Raporttipalojen koko" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Raporttihakemisto" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Raportoitava sovitin" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Raportoitavat portit" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Selvitä IP:t" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Käynnistä uudelleen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Tulos" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Ajohakemistot" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Ajo-parametrit" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Ajettavat sovittimet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Tallenna" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Toinen instanssi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Lähettäjän osoite Adblockin sähköposti-ilmoituksille." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Aseta uusi adblock-työ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Asetukset" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Lähteet (koko, fokus)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Tila / versio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Kolmas instanssi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Aika" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "DNS-pyyntöjä yhteensä" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Muutoksia ei voitu tallentaa: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/fr/adblock.po b/package/luci/applications/luci-app-adblock/po/fr/adblock.po new file mode 100644 index 0000000000..74b0159d8d --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/fr/adblock.po @@ -0,0 +1,875 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-06-14 11:53+0000\n" +"Last-Translator: viking76 \n" +"Language-Team: French \n" +"Language: fr\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Action" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Sources Actives" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Bloqueur de publicité" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Action du bloqueur de publicités" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Ajouter un domaine en Liste noire" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Ajouter un domaine en Liste blanche" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Ajouter ce (sous-)domaine à la Liste noire locale." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Ajout ce (sous-)domaine à la Liste blanche locale." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Liste additionnelle de blocage des Bannis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Paramètres supplémentaires" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Délai de déclenchement supplémentaire en secondes avant que le bloqueur de " +"publicités ne démarre." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Paramètres DNS avancés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Paramètres avancés du courrier électronique" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Paramètres de rapport avancés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Autoriser les IPs locales du client" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Autoriserer toutes les requêtes de certains clients DNS sur la base de leur " +"adresse IP (RPZ-CLIENT-IP). Remarque : Cette fonctionnalité n'est supportée " +"actuellement que par lien d'arrière-plan DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Répondre" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Répertoire de sauvegarde" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Répertoire Temporaire" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Répertoire de base temporaire pour toutes les traitements temporaires du " +"bloqueur de publicités, ex : téléchargement, tri, collage, etc." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Les modifications dans la Liste noire ont été enregistrées. Actualisez vos " +"listes Adblock pour que ces changements soient effectifs." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Liste noire ..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Bloquer les IPs du client local" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Bloquer toutes les requêtes de certains clients DNS sur la base de leur " +"adresse IP (RPZ-CLIENT-IP). Remarque : Cette fonctionnalité n'est supportée " +"actuellement que par lien d'arrière-plan DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Requêtes DNS bloquées" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Domaines bloqués" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Sauvegarde de la liste de blocage" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Demande à la Liste de blocage" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Demande à la liste de blocage..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Sources de la liste de blocage" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Construit une liste de blocage DNS supplémentaire pour bloquer l'accès à " +"tous les domaines, sauf ceux qui figurent dans la liste blanche. Remarque : " +"vous pouvez utiliser cette liste de blocage restrictive, par exemple pour " +"les configurations de controle parental ou de WiFi des invités." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Annuler" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Catégories" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Client" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Clients" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Configuration du paquet AdBlock pour bloquer les domaines publicitaires/" +"abusifs en utilisant le DNS. Pour plus d'informations consulter la documentation en " +"ligne" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Compteur" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Créer des sauvegardes de listes de blocage compressées, elles seront " +"utilisées en cas d'erreurs de téléchargement ou lors du démarrage." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "Backend du DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Répertoire du DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "Instance DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "Rapport DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Délai de redémarrage DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Date" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Désactiver l'autorisation DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Désactiver les Listes blanches DNS séléctives (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domaine" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domaines" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" +"Ignorer la vérification des certificats serveur pendant le téléchargement." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Téléchargement non sécurisé" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Paramètres de téléchargement" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Télécharger l'utilitaire" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Notification par courriel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Nombre de notifications par e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "Courriel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Adresse courriel du destinataire" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Adresse courriel de l'expéditeur" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Objet du courriel" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Modifier la liste noire" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Modifier la liste blanche" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Vider le cache DNS avant le début du traitement d'adblock pour réduire la " +"consommation de mémoire." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Activer Safesearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Activez les filtres SafeSearch modérés pour Youtube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Activer le service AdBlock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" +"Activer la journalisation détaillée du débogage en cas d'erreurs de " +"traitement." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Activé" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Fin de l'horodatage" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Mise en œuvre de SafeSearch pour google, bing, duckduckgo, yandex, youtube " +"et pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Travaux en cours" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Domaine de recherche DNS externe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Domaine externe pour vérifier la réussite du redémarrage du backend DNS. " +"Remarque : Pour désactiver cette vérification, réglez cette option sur " +"\"Faux\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Cinquième instance" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Critère filtre comme la date, domaine, client (option)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Ports de pare-feu qui doivent être forcés localement." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Zones sources du pare-feu qui doivent être forcées localement." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Première instance (défaut)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Vider le cache DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Forcer le DNS local" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Ports forcés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Zones forcées" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Quatrième instance" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Recueillir le trafic réseau lié au DNS via tcpdump et fournir un rapport DNS " +"sur demande. Veuillez noter que cette opération nécessite l'installation " +"d'un paquet \"tcpdump-mini\" supplémentaire et le redémarrage complet du " +"service adblock pour prendre effet." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Paramètres généraux" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Donner tout accès à l'application LuCI adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Information" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Répertoire des bannis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Dernière exécution" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Dernière Requêtes DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Limiter SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Limitez SafeSearch à certains fournisseurs." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Numéro de la ligne à supprimer" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Liste des périphériques réseau disponibles utilisés par tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Liste des interfaces réseau disponibles pour déclencher le démarrage de " +"l'adblock. Choisissez \"non spécifié\" pour utiliser un délai de démarrage " +"classique au lieu d'un déclencheur réseau." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Liste des backends DNS supportés avec leur répertoire de liste par défaut. " +"Pour écraser le chemin d'accès par défaut, utilisez l'option \"Répertoire " +"DNS\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Liste des utilitaires de téléchargement pris en charge et entièrement pré-" +"configurés." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Affichage du journal" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Service en priorité basse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Outrepasse les options de téléchargement préconfigurées pour l'utilitaire de " +"téléchargement choisi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Aucun résultat de recherche !" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Pas encore de journaux liés à l'adblock !" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Vue d'ensemble" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "Profil utilisé par \"msmtp\" pour les e-mails de notification adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Requête" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" +"Recherchez des listes de blocage actives et des sauvegardes pour un domaine " +"spécifique." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Augmenter le nombre de notifications, afin d'obtenir des courriers " +"électroniques si le nombre total de blocages est inférieur ou égal à la " +"limite donnée." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" +"Adresse du destinataire pour les e-mails de notification du bloqueur de " +"publicité." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Redirigez toutes les requêtes DNS des zones spécifiées vers le résolveur DNS " +"local, s'applique aux protocoles UDP et TCP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Réduire la priorité du traitement en arrière-plan d'AdBlock afin de prélever " +"moins de ressources sur le système. Veuillez noter que ce changement " +"nécessite un redémarrage complet du service AdBlock pour prendre effet." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Actualiser" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Actualiser le rapport DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Minuteur d'actualisation" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Minuteur d'actualisation..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Actualisation..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Assouplir SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Recharger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Supprimer une tâche existante" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Signaler le nombre de blocs" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Rapporter la taille des partitions" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Répertoire des rapports" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Interface des rapports" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Rapport des Ports" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Signalez le nombre de morceaux utilisés par tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Indiquez la taille des morceaux utilisés par tcpdump en MByte." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Résoudre les IPs" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" +"Résoudre les rapports d'adresses IP à l'aide de recherches DNS inversées " +"(PTR)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Redémarrer" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Résultat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Répertoire de travail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Drapeaux d'exécution" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Interfaces de travail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Outils de travail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Sauvegarder" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Deuxième instance" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Envoyer des e-mails de notification relatifs à l'adblock. Veuillez noter que " +"l'installation du paquet \"msmtp\" supplémentaire est nécessaire." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" +"Adresse de l'expéditeur des courriers électroniques de notification de " +"l'adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Configurer un nouveau travail AdBlock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Réglez l'instance dns en arrière-plan utilisée par adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Paramètres" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Sources (Taille, Focus)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Liste des ports utilisés par tcpdump, séparés par des espaces." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Démarrer l'horodatage" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Interface des déclencheurs de démarrage" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Statut / Version" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Mettre en pause" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Répertoire cible des rapports DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Répertoire cible des sauvegardes de Listes de blocage." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" +"Répertoire cible pour la liste de blocage générée \"adb_list.overall\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "Répertoire cible pour la liste de blocage générée \"adb_list.jail\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Le minuteur d’actualisation n’a pas pu être mis à jour." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Minuteur d'actualisation mis à jour." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" +"Le jour de la semaine (opt., valeurs : 0-6 éventuellement sép. par , ou -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "La répartition des heures (req., plage : 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "La répartition des minutes (req., plage : 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"La sortie syslog, pré-filtrée pour les messages liés à adblock uniquement." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Troisième instance" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Il s'agit de la liste noire des adblocs locaux permettant de toujours " +"refuser certains (sous-) domaines.
    Veuillez noter : n'ajoutez qu'un " +"seul domaine par ligne. Les commentaires introduits par un \"#\" sont " +"autorisés - les adresses IP, les caractères génériques et les expressions " +"rationnelles ne le sont pas." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Il s'agit de la liste blanche des adblocs locaux, qui permet de toujours " +"autoriser certains (sous-) domaines.
    Veuillez noter : n'ajoutez qu'un " +"seul domaine par ligne. Les commentaires introduits par un \"#\" sont " +"autorisés - les adresses IP, les caractères génériques et les expressions " +"rationnelles ne le sont pas." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Cet onglet montre le dernier rapport DNS généré, appuyer sur le bouton " +"'Actualiser' pour le mettre à jour." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Heure" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Délai d'attente pour un redémarrage réussi du backend du DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Pour maintenir vos listes adblock à jour, vous devez configurer un travail " +"de mise à jour automatique de ces listes." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Statistiques principales" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Objet pour les notifications par e-mails d'adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Total des requêtes DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Délai de déclenchement" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Impossible de sauvegarder les modifications : %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Variantes" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Journalisation détaillée du débogage" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Les modifications apportées à la liste blanche ont été sauvegardées. " +"Actualisez votre liste de blocage des publicités pour que les modifications " +"prennent effet." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Liste Blanche..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "taille max. des résultats" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "stats max principales" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/he/adblock.po b/package/luci/applications/luci-app-adblock/po/he/adblock.po new file mode 100644 index 0000000000..99cafa1c10 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/he/adblock.po @@ -0,0 +1,791 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-09-07 05:53+0000\n" +"Last-Translator: Oren Bahar \n" +"Language-Team: Hebrew \n" +"Language: he\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " +"n % 10 == 0) ? 2 : 3));\n" +"X-Generator: Weblate 5.0.1-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "ביטול" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "הגדרות כלליות" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "הגדרות" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/hi/adblock.po b/package/luci/applications/luci-app-adblock/po/hi/adblock.po new file mode 100644 index 0000000000..5e3dca7cdf --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/hi/adblock.po @@ -0,0 +1,784 @@ +msgid "" +msgstr "" +"Language: hi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/hu/adblock.po b/package/luci/applications/luci-app-adblock/po/hu/adblock.po new file mode 100644 index 0000000000..2685112772 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/hu/adblock.po @@ -0,0 +1,811 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-06 08:29+0000\n" +"Last-Translator: Norbert Szentner \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +#, fuzzy +msgid "Action" +msgstr "Művelet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Aktív források" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Reklámblokkoló" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Reklámblokkoló művelet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Feketelistás domain hozzáadása" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Fehérlistás domain hozzáadása" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "További beállítások" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"További aktiválókésleltetés másodpercben, mielőtt a reklámblokkolás " +"feldolgozása elkezdődik." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Haladó DNS beállítások" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Haladó e-mail beállítások" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Haladó riport beállítások" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Válasz" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Biztonsági mentés könyvtára" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +#, fuzzy +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Feketelista beállítások elmentve. Frissítsd az adblockodat az " +"aktualizáláshoz." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Feketelista..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Blokkolt domainek" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +#, fuzzy +msgid "Blocklist Sources" +msgstr "Feketelista források" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Mégse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Kategóriák" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Ügyfél" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Kliensek" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Darabszám" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS könyvtár" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "DNS riport" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +#, fuzzy +msgid "DNS Restart Timeout" +msgstr "DNS újraindítás időtúllépés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Dátum" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Tartomány" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domainek" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Letöltési segédprogram" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "E-mail értesítés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +#, fuzzy +msgid "E-Mail Notification Count" +msgstr "E-Mail értesítés számláló" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "E-Mail profil" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "E-mail fogadócím" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "E-Mail küldő cím" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +#, fuzzy +msgid "E-Mail Topic" +msgstr "E-Mail téma" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Feketelista szerkesztése" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Fehérlista szerkesztése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "SafeSearch engedélyezése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Adblock szolgáltatás engedélyezése." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Engedélyezve" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +#, fuzzy +msgid "Existing job(s)" +msgstr "Létező munkamenet(ek)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "DNS gyorsítótár kiürítése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Helyi DNS kényszerítése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Általános Beállítások" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Hozzáférés megadása a \"LuCI app adblock\"-nak" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Információ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Utolsó futás" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Eltávolítandó sor száma" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"A támogatott és teljesen előre beállított letöltési segédprogramok listája." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Log nézet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Alacsony prioritású szolgáltatás" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Nincs a keresésnek megfelelő elem!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Még nincsenek adblock-os naplók!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Áttekintés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Lekérdezés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Fogadó címe a reklámblokkoló értesítési e-mailekhez." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Frissítés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "DNS Riport frissítése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +#, fuzzy +msgid "Refresh Timer" +msgstr "Időzítő frissítése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Időzítő frissítése..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Frissítés..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Újratöltés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Létező munkamenet eltávolítása" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Darabok számának jelentése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Darabok méretének jelentése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Könyvtár jelentése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Csatoló jelentése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "IP címek feloldása" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Újraindítás" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Eredmény" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +#, fuzzy +msgid "Run Directories" +msgstr "Futtatási mappák" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Mentés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Új adblock munkamenet hozzáadása" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Beállítások" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +#, fuzzy +msgid "Status / Version" +msgstr "Státusz / Verzió" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Felfüggesztés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "Célkönyvtár az előállított „adb_list.overall” blokkolási listához." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"A rendszernapló kimenete, előre szűrve csak a reklámblokkolóhoz kapcsolódó " +"üzenetekhez." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Ez a fül az utoljára generált DNS jelentést tartalmazza, nyomja meg a " +"'Frissítés' gombot, hogy egy frisset kapjon." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Idő" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Összes DNS kérés" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Aktiváló késleltetése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +#, fuzzy +msgid "Unable to save changes: %s" +msgstr "Nem sikerült a/az %s változtatás mentése" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +#, fuzzy +msgid "Variants" +msgstr "Variánsok" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Részletes hibakeresési naplózás" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Fehérlista..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/it/adblock.po b/package/luci/applications/luci-app-adblock/po/it/adblock.po new file mode 100644 index 0000000000..632faf9b3a --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/it/adblock.po @@ -0,0 +1,866 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2023-07-03 12:40+0000\n" +"Last-Translator: random r \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Azione" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Fonti attive" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Blocco pubblicità" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Azione blocco pubblicità" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Aggiungi dominio alla lista nera" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Aggiungi dominio alla lista bianca" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Aggiungi questo (sotto)dominio alla tua lista nera locale." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Aggiungi questo (sotto)dominio alla tua lista bianca locale." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Lista di blocco Jail aggiuntiva" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Impostazioni aggiuntive" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Tempo aggiutnivo di attesa in secondi prima che il blocco pubblicità si " +"avvii." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Impostazioni DNS avanzate" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Impostazioni e-mail avanzate" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Impostazioni avanzate dei report" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Consenti IP dei client locali" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Consenti tutte le richieste dai client in base all'indirizzo IP (RPZ-CLIENT-" +"IP). Nota: questa funzionalità, in questo momento, è supportata solo dal " +"backend di bind DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Risposta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Cartella del backup" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Cartella base temporanea" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Cartella base temporanea per tutte le operazioni di blocco pubblicità, es. " +"download, ordinamento, unione, ecc." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Modifiche alla lista nera salvate. Ricarica le liste di blocco pubblicità " +"per renderle effettive." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Lista nera..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Blocca IP dei client locali" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Blocca tutte le richieste dai client in base all'indirizzo IP (RPZ-CLIENT-" +"IP). Nota: questa funzionalità, in questo momento, è supportata solo dal " +"backend di bind DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Richieste DNS bloccate" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Domini bloccati" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Backup lista di blocco" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Consulta lista di blocco" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Cerca lista di blocco..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Fonti lista di blocco" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Crea una lista di blocco DNS aggiuntiva per bloccare l'accesso a tutti i " +"domini ad eccezione di quelli presenti nella lista bianca. NB: Puoi usare " +"questa lista di blocco restrittiva ad es. per wifi ospite o configurazioni " +"di controllo genitori." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Annulla" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Categorie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Client" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Client" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Configurazione del pacchetto adblock per bloccare pubblicità/domini " +"fraudolenti usando il DNS. Per informazioni aggiuntive consulta la documentazione " +"online" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Numero" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Crea dei backup delle liste di blocco compressi, saranno usati in caso di " +"errori nello scaricamento o all'avvio." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "Backend DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Directory DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "Istanza DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "Report del DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Scadenza di riavvio del DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Data" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Disattiva Consenti DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Disattiva lista bianca DNS selettiva (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Dominio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domini" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Non controllare i certificati SSL del server durante il download." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Download non sicuro" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Parametri di download" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Utilità di download" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Notifica e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Numero di notifiche e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "Profilo e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Indirizzo e-mail destinatario" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Indirizzo e-mail mittente" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Oggetto e-mail" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Modifica lista nera" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Modifica lista bianca" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Svuota la cache DNS prima dell'avvio del blocco pubblicità per ridurre il " +"consumo della memoria." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Attiva SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Attiva filtri moderati di SafeSearch per YouTube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Attiva il servizio di blocco pubblicità." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" +"Attiva log di debug esteso in caso di qualsiasi errore di elaborazione." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Attivato" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Fine marca temporale" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Forza SafeSearch per Google, Bing, Duckduckgo, Yandex, YouTube e Pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Processo/i esistente/i" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Dominio di lookup DNS esterno" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Dominio esterno per controllare il riavvio corretto del backend DNS. Da " +"notare: per disattivare questa funzione imposta questa opzione a 'false'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Quinta istanza" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Criteri del filtro, come data, dominio o client (facoltativo)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Porte del firewall che devono essere forzate localmente." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Zone di origine del firewall che devono essere forzate localmente." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Prima istanza (predefinito)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Svuota cache DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Forza DNS locale" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Porte forzate" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Zone forzate" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Quarta istanza" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Raccoglie il traffico di rete DNS via tcpdump e fornisce su richiesta un " +"report DNS. Da notare: richiede l'installazione dei pacchetti 'tcpdump' o " +"'tcpdump-mini' e un completo riavvio del servizio di blocco pubblicità per " +"avere effetto." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Impostazioni generali" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Consenti l'accesso all'app adblock di LuCI" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Informazioni" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Cartella di detenzione" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Ultimo avvio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Ultima richiesta DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Limita SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Limita SafeSearch a certi fornitori." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Numero di riga da eliminare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Lista di dispositivi di rete disponibili usati da tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Lista di interfacce di rete disponibili che provocano l'avvio del blocco " +"pubblicità. Scegli 'unspecified' per usare un timeout di avvio classico al " +"posto di un trigger di rete." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Lista dei backend DNS supportati con la loro lista directory predefinita. " +"Per sovrascrivere il percorso predefinito, usa l'opzione 'Directory DNS'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Elenco delle utilità di download supportate e completamente preconfigurate." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Vista dei log" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Servizio a bassa priorità" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Sovrascrivi manualmente le opzioni di download preconfigurate per l'utilità " +"di download selezionata." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Nessun risultato di ricerca!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Ancora nessun log relativo al blocco pubblicità!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Riepilogo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" +"Profilo usato da 'msmtp' per le notifiche e-mail del blocco pubblicità." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Ricerca" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "Cerca un dominio specifico nelle liste di blocco attive e nei backup." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Aumenta il conteggio delle notifiche per ricevere e-mail se il numero " +"complessivo della lista di blocco è inferiore o uguale al limite indicato." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" +"Indirizzo del destinatario per e-mail di notifica di blocco di pubblicità." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Reindirizza tutte le ricerche DNS dalle zone specificate al resolver DNS " +"locale, si applica al protocollo UDP e TCP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Riduci la priorità di elaborazione in secondo piano di adblock per usare " +"meno risorse di sistema. Nota: per rendere effettiva questa modifica, serve " +"un riavvio completo del servizio adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Aggiorna" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Aggiorna il report DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Aggiorna il timer" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Aggiornamento del timer..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Aggiorna..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Rilassare SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Ricarica" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Rimuovi un lavoro esistente" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Numero frammenti del report" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Dimensione frammenti del report" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Cartella del report" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Interfaccia del report" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Porte report" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Segnala contatore frammenti usato da tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Segnala dimensione frammenti usata da tcpdump in MByte." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Risolvi indirizzi IP" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" +"Risolve gli indirizzi IP segnalati utilizzando le ricerche DNS inverse (PTR)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Riavvia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Risultato" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Avvia directories" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Avvia flags" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Avvia interfacce" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Avvia utilità" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Salva" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Seconda istanza" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Invia e-mail di notifica relative al blocco pubblicità. Nota: richiede " +"l'installazione del pacchetto 'msmtp' aggiuntivo." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" +"Indirizzo del mittente per le e-mail di notifica del blocco pubblicità." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Imposta un nuovo lavoro per adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Imposta l'istanza di backend DNS usata da adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Impostazioni" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Fonti (dimensioni, focus)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Elenco separato da spazi delle porte usate da tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Avvia marca temporale" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Interfaccia trigger di avvio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Stato / Versione" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Sospendi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Cartella di destinazione per i file di report relativi al DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Cartella di destinazione per i backup della lista di blocco." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "Cartella per la lista di blocco generata 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" +"Cartella di destinazione per la lista di blocco di detenzione 'adb_list." +"jail' generata." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Impossibile aggiornare il timer di aggiornamento." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Il timer di aggiornamento è stato aggiornato." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" +"Il giorno della settimana (opz., valori: 0-6 eventualmente sep. da , o -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "Parte delle ore (obbligatoria, range: 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "Parte dei minuti (opz., range: 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"L'output di syslog, pre-filtrato solo per i messaggi relativi al blocco " +"pubblicità." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Terza istanza" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Questa è la lista nera del blocco pubblicità locale per negare sempre " +"determinati (sotto)domini.
    Nota: aggiungi un solo dominio per riga. I " +"commenti introdotti con '#' sono consentiti - indirizzi IP, caratteri jolly " +"e regex non lo sono." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Questa è la lista nera del blocco pubblicità locale per negare sempre " +"determinati (sotto)domini.
    Nota: aggiungi un solo dominio per riga. I " +"commenti introdotti con '#' sono consentiti - indirizzi IP, caratteri jolly " +"e regex non lo sono." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Questa scheda mostra l'ultimo rapporto DNS generato, premi il pulsante " +"\"Aggiorna\" per ottenere quello attuale." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Orario" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Tempo di attesa per un riavvio riuscito del backend DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Per mantenere aggiornate le tue liste di blocco pubblicità, dovresti " +"impostare un processo di aggiornamento automatico per queste liste." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Statistiche principali" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Argomento per le e-mail di notifica del blocco pubblicità." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Richieste DNS totali" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Ritardo innesco" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Impossibile salvare le modifiche: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Varianti" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Registro di debug dettagliato" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Le modifiche alla lista bianca sono state salvate. Aggiorna le tue liste di " +"blocco pubblicità in modo che le modifiche abbiano effetto." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Lista bianca..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "max. dimensione del set di risultati" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "max. statistiche principali" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/ja/adblock.po b/package/luci/applications/luci-app-adblock/po/ja/adblock.po new file mode 100644 index 0000000000..0ac76fe6a7 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/ja/adblock.po @@ -0,0 +1,834 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2021-03-31 12:26+0000\n" +"Last-Translator: Satoru Yoshida \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.6-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "アクション" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "アクティブなソース" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "アドブロックアクション" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "ブラックリストドメインの追加" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "ホワイトリストドメインの追加" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "この(サブ)ドメインをローカルのブラックリストに追加します。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "この(サブ)ドメインをローカルのホワイトリストに追加します。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "追加のJailブロックリスト" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "追加設定" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "Adblock の処理が開始されるまでの、追加の遅延時間(秒)です。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "DNS の詳細設定" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Eメールの詳細設定" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "リポートの詳細設定" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "回答" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "バックアップ先 ディレクトリ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "ベースとなるテンポラリディレクトリ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"ベースとなるテンポラリディレクトリはadblock関連の操作に使用されます(ダウン" +"ロード、ソート、統合など)。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"ブラックリストへの変更が保存されました。adblockを更新して変更を適用します。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "ブラックリスト..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "ブロックされたDNSリクエスト" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "ブロックされたドメイン" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "ブロックリストのバックアップ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "ブロックリストのクエリ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "ブロックリストのクエリ..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "ブロックリスト提供元" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"追加のDNSブロックリストを作成してホワイトリスト以外のドメインへのアクセスをブ" +"ロックします。注意: この制限付きブロックリストはゲストwifiまたはkidsafe構成で" +"使用できます。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "キャンセル" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "クライアント" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"adblockパッケージがDNSによって広告/不正ドメインをブロックする設定です。詳しく" +"は、オンラインド" +"キュメントを確認してください" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "カウント" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"圧縮されたブロックリストのバックアップを作成します。ダウンロードエラーや起動" +"時に使用されます。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNSバックエンド" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS ディレクトリ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "DNSレポート" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "DNS再起動タイムアウト" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "日付" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "DNS許可を無効化" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "ドメイン" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "ダウンロードのパラメータ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "ダウンロードユーティリティ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Eメール通知" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Eメール通知数" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "Eメールプロファイル" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Eメール受信アドレス" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Eメール送信者アドレス" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Eメールトピック" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "ブラックリストの編集" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "ホワイトリストの編集" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "セーフサーチを有効化" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "youtube用の適度なセーフサーチフィルタを有効にします。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "adblockサービスを有効にします。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "エラーが発生した際に詳細なデバッグロギングを有効にします。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "有効" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "終了タイムスタンプ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Google、Bing、DuckDuckGo、Yandex、YouTube、Pixabayのセーフサーチを使用しま" +"す。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "既存のジョブ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "外部DNSルックアップドメイン" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"DNSバックエンドが正常に再起動したかチェックする外部ドメイン。注意: このチェッ" +"クを無効にするにはオプションを無効に設定してください。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "日付、ドメイン、クライアントなどのフィルター基準(オプション)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "DNS キャッシュのクリア" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "ローカル DNS の強制" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"tcpdumpを介してDNS関連のネットワークトラフィックを収集し、オンデマンドでDNSレ" +"ポートを提供します。 注意: これを有効にするには、追加の「tcpdump-mini」パッ" +"ケージのインストールと完全なadblockサービスの再起動が必要です。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "一般設定" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "LuCIアプリのadblockへのアクセスを許可" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "情報" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Jailディレクトリ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "最終実行" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "最新のDNSリクエスト" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "セーフサーチを制限" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "セーフサーチを特定のプロバイダに制限します。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "削除する行番号" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "tcpdumpが使用する利用可能なネットワークデバイス一覧です。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"adblockの開始をトリガーできるネットワークインターフェース一覧です。未指定を選" +"択するとトリガーの代わりに従来のスタートアップタイムアウトを使用します。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"デフォルトのリストディレクトリを使用するDNSバックエンド一覧です。デフォルトの" +"パスを上書きするには'DNSディレクトリ'オプションを使用してください。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "サポートされ、かつ設定済のダウンロード ユーティリティの一覧です。" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "ログビュー" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "優先度が低いサービス" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "検索結果がありません!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "まだadblolck関連のログがありません!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "概要" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "'msmtp'をadblock通知Eメールに使用するプロファイル。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "検索" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "特定のドメインのアクティブなブロックリストとバックアップを検索します。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"通知数を上げて、ブロックリスト全体の数が指定された制限以下の場合に電子メール" +"を取得します。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "adblock 通知メールの受信アドレスです。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"システムリソースを増やすために、adblockのバックグラウンド処理の優先順位を下げ" +"ます。注意: この変更を有効にするには、完全なadblockサービスの再起動が必要で" +"す。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "リフレッシュ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "DNSリポートをリフレッシュ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "リフレッシュタイマー" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "タイマーをリフレッシュ..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "リフレッシュ..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "リラックスセーフサーチ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "リロード" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "既存のジョブを削除" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "レポート チャンクカウント" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "レポート チャンクサイズ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "レポート ディレクトリ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "レポート インターフェース" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "レポートポート" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "tcpdumpによって使用されるレポートチャンク数。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "tcpdumpがメガバイト単位で使用するレポートチャンクサイズ。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "再起動" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "結果" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "実行ディレクトリ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "実行フラグ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "実行インターフェース" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "実行ユーティリティー" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "保存" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"adblock関連の通知Eメールを送信します。注意: これは追加の'msmtp'パッケージのイ" +"ンストールが必要です。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "adblockの通知Eメール送信者アドレス。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "設定" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "ソース(サイズ、フォーカス)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "tcpdumpが使用するポートの、スペースで区切られたリスト。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "開始タイムスタンプ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "起動時トリガーインターフェース" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "ステータス / バージョン" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "一時停止" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "生成されたブロックリスト 'adb_list.overall' の保存先ディレクトリです。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" +"生成されたjailブロックリスト'adb_list.jail'のターゲットディレクトリです。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "リフレッシュタイマーを更新できませんでした。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "リフレッシュタイマーが更新されました。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "曜日(オプション、0-6の値。, または - で区切る)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "時(必須、0-23の値)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "分(オプション、0-59の値)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "Adblock に関連するメッセージのみが抽出された、システムログ出力です。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"これは、特定の(サブ)ドメインを常に拒否するローカルのadblockブラックリストで" +"す。
    注意: 1行につきドメインを1つだけ追加してください。'#'で始まるコメ" +"ントを追加できます - IPアドレス、ワイルドカード、正規表現は使用できません。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"これは、特定の(サブ)ドメインを常に拒否するローカルのadblockホワイトリストで" +"す。
    注意: 1行につきドメインを1つだけ追加してください。'#'で始まるコメ" +"ントを追加できます - IPアドレス、ワイルドカード、正規表現は使用できません。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "時刻" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "DNSバックエンドの再起動が成功するまでのタイムアウト。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"adblockリストを常に最新にするには、自動更新をこれらのリストに設定する必要があ" +"ります。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "adblockの通知Eメールのトピック。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "DNSリクエスト合計" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "トリガ遅延" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "変更を保存できませんでした: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "詳細なデバッグ ログ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"ホワイトリストへの変更が保存されました。adblockのリストを更新して変更を適用し" +"ます。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "ホワイトリスト..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "最大の結果セットサイズ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/ko/adblock.po b/package/luci/applications/luci-app-adblock/po/ko/adblock.po new file mode 100644 index 0000000000..0d1a6f1f6e --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/ko/adblock.po @@ -0,0 +1,794 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-04 07:12+0000\n" +"Last-Translator: Wonchul Kang \n" +"Language-Team: Korean \n" +"Language: ko\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "액션" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "활성화된 소스" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Adblock 액션" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "블랙리스트 도메인 추가" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "화이트리스트 도메인 추가" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "이 (서브)도메인을 로컬 블랙리스트에 추가." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "이 (서브)도메인을 로컬 화이트리스트에 추가." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "추가적인 Jail 블록리스트" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "추가 설정" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "애드블록 처리가 시작되기 전의 추가 트리거 지연 시간(초)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "고급 DNS 설정" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "고급 이메일 설정" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "고급 리포트 설정" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "허가된 로컬 클라이언드 아이피들" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +#, fuzzy +msgid "Answer" +msgstr "답변" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +#, fuzzy +msgid "Backup Directory" +msgstr "백업 경로" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"블랙리스트 변경사항이 저장되었습니다. Adblock 리스트를 새로고침하여 변경사항" +"을 적용하세요." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "블랙리스트..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "차단된 DNS 요청" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "차단된 도메인들" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "차단목록 백업" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "블록리스트 쿼리" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "블록리스트 등록..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "취소" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "클라이언트" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "활성화" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "기본 설정" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "정보" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "개요" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/lt/adblock.po b/package/luci/applications/luci-app-adblock/po/lt/adblock.po new file mode 100644 index 0000000000..318a816c66 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/lt/adblock.po @@ -0,0 +1,794 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-12-08 08:06+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.3-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Veiksmas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Aktyvūs Ištekliai" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "„Adblock“ – Reklaminio turinio blokatorius" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Reklaminio turinio blokatoriaus veiksmas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Papildomi nustatymai" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Pažengusieji „DNS“ nustatymai" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Pažengusieji el. pašto nustatymai" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Pažengusieji reportažo nustatymai" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Atsakymas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Atsarginės kopijos katalogas/vietovė" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Blokuojami domenai-sritys" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Atšaukti" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Kategorijos" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Klientas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Data" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domenas-Sritis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domenai-Sritys" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Netikrinti „SSL“ serverio sertifikatus, kol siunčiasi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Atsisiuntimas nesaugus" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Atsisiuntimo parametrai" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Atsisiuntimo įrankis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "El. pašto pranešimas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "El. pašto pranešimų skaičius" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "El. pašto profilis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "El. pašto gavėjo adresas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "El. pašto siuntėjo adresas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "El. pašto tema" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Įjungta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Bendri nustatymai" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Duoti prieigą prie „LuCI app adblock“" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Informacija" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Paskutinį kartą vykdytą" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Apžiūra" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Paleisti iš naujo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Rezultatas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Išsaugoti" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Nustatymai" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/mr/adblock.po b/package/luci/applications/luci-app-adblock/po/mr/adblock.po new file mode 100644 index 0000000000..79ef107027 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/mr/adblock.po @@ -0,0 +1,790 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2020-02-12 11:01+0000\n" +"Last-Translator: Prachi Joshi \n" +"Language-Team: Marathi \n" +"Language: mr\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.11-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "सक्षम केले" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "आढावा" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/ms/adblock.po b/package/luci/applications/luci-app-adblock/po/ms/adblock.po new file mode 100644 index 0000000000..226663a711 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/ms/adblock.po @@ -0,0 +1,790 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2019-12-18 04:21+0000\n" +"Last-Translator: Pusak Hitam \n" +"Language-Team: Malay \n" +"Language: ms\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.10-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Tindakan" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Sekatan Iklan" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "Terdapat kelewatan picu dalam saat sebelum proses adblock bermula." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Jawapan" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Direktori Sandaran" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Punca Senarai Sekatan" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Pelanggan" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Kiraan" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Direktori DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Tarikh" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/nb_NO/adblock.po b/package/luci/applications/luci-app-adblock/po/nb_NO/adblock.po new file mode 100644 index 0000000000..6904ba2300 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/nb_NO/adblock.po @@ -0,0 +1,810 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-11-02 07:03+0000\n" +"Last-Translator: averageperson \n" +"Language-Team: Norwegian Bokmål \n" +"Language: nb_NO\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.2-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Handling" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Aktive kilder" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Reklameblokkering" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Reklameblokkeringshandling" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Legg til svartelistedomene" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Legg til hvitlistedomene" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Legg til dette (under-)domenet til i din lokale svarteliste." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Legg til dette (under-)domenet til i din lokale hvitliste." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Ytterligere fengselssvarteliste" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Ytterligere innstillinger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Ytterligere utløserforsinkelse i sekunder før behandling av " +"reklameblokkering starter." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Avanserte DNS-innstillinger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Avanserte e-postinnstillinger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Avanserte rapporteringsinnstillinger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Tillat lokale klient-IPer" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Tillat alle forespørsler fra visse DNS-klienter basert på deres IP-adresse " +"(RPZ-CLIENT-IP). Merk: Denne funksjonen støttes for øyeblikket bare av bind " +"DNS backend." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Svar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Sikkerhetskopimappe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Midlertidig basismappe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Midlertidig basismappe for alle adblock-relaterte runtime-operasjoner, f.eks " +"nedlastning, sortering, sammenslåing osv." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +#, fuzzy +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Svartelisteendringene har blitt lagret. Gjenoppfrisk dine " +"reklameblokkeringslister slik at endringer trer i effekt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Svartelist …" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Blokker lokale klient-IPer" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Blokker alle forespørsler fra visse DNS-klienter basert på deres IP-adresse " +"(RPZ-CLIENT-IP). Merk: Denne funksjonen støttes for øyeblikket bare av bind " +"DNS backend." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Blokkerte DNS-forespørsler" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Blokkerte domener" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Blokkeringslistesikkerhetskopi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Blokkeringslistespørring" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Blokkeringslistespørring …" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Blokklistekilder" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Avbryt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Kategorier" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Klient" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Antall" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS-bakende" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS-mappe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "DNS-rapport" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "DNS-omstartstidsavbrudd" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Dato" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Skru av DNS-tillatelse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domene" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Nedlastingsparametre" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Nedlastingsverktøy" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "E-postmerknad" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "E-postmerknadsantall" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "E-postprofil" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "E-postmottagersadresse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "E-postsenderadresse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "E-postemne" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Rediger svarteliste" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Rediger hvitliste" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Skru på SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +#, fuzzy +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Skru på moderate SafeSearch-filtre for YouTube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Skru på reklameblokkeringstjenesten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Aktivert" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Slutt-tidsstempel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Eksisterende jobb(er)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Eksternt DNS-oppslagsdomene" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Tøm DNS-hurtiglageret" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Tving lokal DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Påtvingte porter" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Påtvingte soner" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Generelle innstillinger" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Innvilg tilgang til LuCI-programreklameblokkering" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Info" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Fengselsmappe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Sist kjørt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Siste DNS-forespørsler" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Begrens SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Begrens SafeSearch til gitte tilbydere." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Linjenummer å fjerne" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Liste over tilgjengelige nettverksenheter brukt av tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Loggvisning" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Lavprioritetstjeneste" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Oversikt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Spørring" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Gjenoppfrisk" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Gjenoppfrisk DNS-rapport" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Gjenoppfrisk tidsur" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Gjenoppfrisk tidsur …" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Gjenoppfrisk …" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Last inn igjen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Fjern en eksisterende jobb" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Rapportmappe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Rapportgrensesnitt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Rapportporter" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Omstart" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Resultat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +#, fuzzy +msgid "Run Directories" +msgstr "Kjøringsmapper" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +#, fuzzy +msgid "Run Flags" +msgstr "Kjøringsflagg" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +#, fuzzy +msgid "Run Interfaces" +msgstr "Kjøringsgrensesnitt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +#, fuzzy +msgid "Run Utils" +msgstr "Kjøringsverktøy" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Lagre" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Innstillinger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Kilder (størrelse, fokus)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Mellomromsinndelt liste over porter brukt av tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +#, fuzzy +msgid "Start Timestamp" +msgstr "Start-tidsstempel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Status/versjon" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Tid" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Totalt antall DNS-forespørsler" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Utløserforsinkelse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Kunne ikke lagre endringer: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Varianter" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Hvitliste …" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "maks. resultatsettstørrelse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "rå (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +#, fuzzy +msgid "unbound (/var/lib/unbound)" +msgstr "ubundet (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/nl/adblock.po b/package/luci/applications/luci-app-adblock/po/nl/adblock.po new file mode 100644 index 0000000000..834f0d3d72 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/nl/adblock.po @@ -0,0 +1,858 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-05-06 12:52+0000\n" +"Last-Translator: xtz1983 \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Actie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Actieve bronnen" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Adblock actie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Blacklist-domein toevoegen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Whitelist-domein toevoegen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Voeg dit (sub-)domein toe aan uw lokale zwarte lijst." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Voeg dit (sub-)domein toe aan uw lokale whitelist." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Aanvullende gevangenisblokkeerlijst" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Aanvullende instellingen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "Extra start-vertraging voordat adblock proces begint (secondes)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Geavanceerde DNS-instellingen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Geavanceerde e-mailinstellingen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Geavanceerde rapportinstellingen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Lokale client-IP's toestaan" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Sta alle verzoeken van bepaalde DNS-clients toe op basis van hun IP-adres " +"(RPZ-CLIENT-IP). Let op: deze functie wordt momenteel alleen ondersteund " +"door de bind DNS-backend." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Antwoord" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Backup Directory" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Basis Temp (tijdelijke bestanden) directory" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Base Temp Directory voor alle adblock-gerelateerde runtime-bewerkingen, b.v. " +"downloaden, sorteren, samenvoegen etc." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Wijzigingen op de zwarte lijst zijn opgeslagen. Vernieuw uw adblock-lijsten " +"zodat wijzigingen van kracht worden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Zwarte lijst..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Blokkeer lokale client-IP's" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Blokkeer alle verzoeken van bepaalde DNS-clients op basis van hun IP-adres " +"(RPZ-CLIENT-IP). Let op: deze functie wordt momenteel alleen ondersteund " +"door de bind DNS-backend." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Geblokkeerde DNS-verzoeken" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Geblokkeerde domeinen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Blokkeerlijst back-up" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Bloklijst-query" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Blokkeerlijst-query..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Blokkeerlijst bronnen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Bouwt een extra DNS-blokkeerlijst op om de toegang tot alle domeinen te " +"blokkeren, behalve de domeinen die op de witte lijst staan. Let op: u kunt " +"deze beperkende blokkeerlijst b.v. voor guest wifi of kidsafe configuraties." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Annuleren" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Categorieën" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Cliënt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Cliënten" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Configuratie van het adblock-pakket om domeinen met advertenties/misbruik te " +"blokkeren met behulp van DNS. Voor meer informatie bekijk de online " +"documentatie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Tellen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Maak gecomprimeerde blokkeerlijst-back-ups, deze worden gebruikt in geval " +"van downloadfouten of tijdens het opstarten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS-backend" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS-directory" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "DNS-instantie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "DNS-rapport" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "DNS herstart time-out" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Datum" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "DNS uitschakelen toestaan" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Selectieve DNS-whitelisting uitschakelen (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domein" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domeinen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Tijdens download niet de SSL server certificaten controleren." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Onbeveiligd downloaden" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Parameters downloaden" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Download hulpprogramma" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "E-Mail notificatie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Aantal e-mailmeldingen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "E-Mail profiel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "E-Mail adres van ontvanger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "E-Mail adres van verzender" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "E-Mail onderwerp" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Bewerk zwarte lijst" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Bewerk witte lijst" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Leeg de DNS-cache voordat adblock-verwerking begint om het geheugenverbruik " +"te verminderen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "SafeSearch inschakelen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Gematigde SafeSearch-filters inschakelen voor YouTube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "De adblock-service inschakelen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "Activeer uitgebreide logs in geval van verwerkingsfouten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Ingeschakeld" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Eindtijdstempel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"SafeSearch afdwingen voor google, bing, duckduckgo, yandex, youtube en " +"pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Bestaande taken(s)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Extern DNS-opzoekdomein" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Extern domein om te controleren of de DNS-backend opnieuw is opgestart. Let " +"op: Om dit vinkje uit te schakelen zet u deze optie op 'false'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Vijfde instantie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Filter criteria zoals datum, domein of klant (optioneel)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Firewall-poorten die lokaal moeten worden geforceerd." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Firewall-bronzones die lokaal moeten worden geforceerd." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Eerste instantie (standaard)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Flush DNS-cache" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Lokale DNS afdwingen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Geforceerde poorten" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Geforceerde Zones" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Vierde instantie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Verzamel DNS-gerelateerd netwerkverkeer via tcpdump en verstrek een DNS-" +"rapport op aanvraag. Let op: dit vereist extra 'tcpdump'- of 'tcpdump-mini'-" +"pakketinstallatie en een volledige herstart van de adblock-service om van " +"kracht te worden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Algemene instellingen" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Toegang verlenen tot luCI app adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Informatie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Gevangenis Directory" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Laatst gedraaid" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Laatste DNS-verzoeken" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "SafeSearch beperken" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Beperk SafeSearch tot bepaalde providers." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Regelnummer te verwijderen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" +"Lijst van beschikbare netwerkapparaten die door tcpdump worden gebruikt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Lijst met beschikbare netwerkinterfaces om de adblock-start te activeren. " +"Kies 'niet gespecificeerd' om een klassieke opstarttime-out te gebruiken in " +"plaats van een netwerktrigger." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Lijst met ondersteunde DNS-backends met hun standaardlijstdirectory. Gebruik " +"de optie 'DNS Directory' om het standaardpad te overschrijven." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Lijst met ondersteunde en volledig vooraf geconfigureerde " +"downloadhulpprogramma's." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Logboekweergave" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Service met lage prioriteit" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Negeer handmatig de vooraf geconfigureerde downloadopties voor het " +"geselecteerde downloadhulpprogramma." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Geen zoekresultaat gevonden!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Nog geen adblock gerelateerde logs!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Overzicht" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" +"Profiel gebruikt voor 'msmtp' voor adblock E-Mail berichten/notificaties." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Zoekopdracht" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "Query actieve blokkeerlijsten en back-ups voor een specifiek domein." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Verhoog het aantal meldingen om e-mails te ontvangen als het totale aantal " +"blokkeerlijsten kleiner is dan of gelijk is aan de opgegeven limiet." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Ontvangstadres voor adblock berichten/notificaties via E-Mail." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Leid alle DNS-query's van gespecificeerde zones om naar de lokale DNS-" +"resolver, is van toepassing op het UDP- en TCP-protocol." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Verlaag de prioriteit van de adblock-achtergrondverwerking om minder bronnen " +"van het systeem te gebruiken. Let op: deze wijziging vereist een volledige " +"herstart van de adblock-service om van kracht te worden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Herladen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "DNS-rapport vernieuwen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Herlaad timer" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Herlaad timer..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Vernieuwen..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Relax SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Herladen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Verwijder bestaande job" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Brokkentelling rapporteren" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Brokkengrootte rapporteren" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Rapportage directory" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Rapportage-interface" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Rapporteer poorten" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Rapporteer het brokkentelling dat wordt gebruikt door tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Rapporteer brokgrootte gebruikt door tcpdump in MByte." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "IP's oplossen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" +"Los rapporterende IP-adressen op met behulp van reverse DNS (PTR) lookups." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Herstart" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Resultaat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Mappen uitvoeren" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Vlaggen uitvoeren" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Interfaces uitvoeren" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Utils uitvoeren" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Opslaan" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Tweede instantie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Stuur adblock-gerelateerde e-mailmeldingen. Let op: hiervoor is extra " +"'msmtp'-pakketinstallatie nodig." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Afzender e-mailadres voor de adblock email meldingen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Stel een nieuwe adblock-taak in" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Stel de dns-backend-instantie in die wordt gebruikt door adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Instellingen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Bronnen (grootte, focus)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" +"Door spatie gescheiden lijst van poorten die worden gebruikt door tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Tijdstempel starten" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Startup Trigger-interface" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Status / Versie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Opschorten" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Doelmap voor DNS-gerelateerde rapportbestanden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Doelmap voor back-ups van blokkeerlijsten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "Doelmap voor de gegenereerde blokkeerlijst 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "Doelmap voor de gegenereerde jail blocklist 'adb_list.jail'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "De Refresh Timer kan niet worden bijgewerkt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "De Refresh Timer is bijgewerkt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "De dag van de week (opt., waarden: 0-6 mogelijk sep. door , of -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "Het urengedeelte (req., bereik: 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "Het minutengedeelte (opt., bereik: 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"De syslog-uitvoer, vooraf gefilterd voor alleen adblock-gerelateerde " +"berichten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Derde instantie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Dit is de lokale adblock blacklist om bepaalde (sub)domeinen altijd te " +"weigeren.
    Let op: voeg slechts één domein per regel toe. Opmerkingen " +"die zijn ingeleid met '#' zijn toegestaan - ip-adressen, wildcards en regex " +"zijn niet toegestaan." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Dit is de lokale adblock whitelist om bepaalde (sub)domeinen altijd toe te " +"staan.
    Let op: voeg slechts één domein per regel toe. Opmerkingen die " +"zijn ingeleid met '#' zijn toegestaan - ip-adressen, jokertekens en regex " +"zijn niet toegestaan." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Dit tabblad toont het laatst gegenereerde DNS-rapport, druk op de knop " +"'Vernieuwen' om een actueel rapport te krijgen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Tijd" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Time-out om te wachten op een succesvolle herstart van de DNS-backend." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Om uw adblock-lijsten up-to-date te houden, moet u een automatische " +"updatetaak voor deze lijsten instellen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Top statistieken" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Onderwerp voor adblock notificatie e-mails." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Totaal aantal DNS-verzoeken" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Trigger vertraging" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Kan wijzigingen niet opslaan: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Varianten" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Uitgebreide logboekregistratie voor foutopsporing" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Wijzigingen op de witte lijst zijn opgeslagen. Vernieuw uw adblock-lijsten " +"zodat de wijzigingen van kracht worden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Witte lijst..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "max. grootte van de resultatenset" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "max. top statistieken" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/pl/adblock.po b/package/luci/applications/luci-app-adblock/po/pl/adblock.po new file mode 100644 index 0000000000..c9c59f3242 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/pl/adblock.po @@ -0,0 +1,862 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-12-02 14:35+0000\n" +"Last-Translator: Xtremo3 \n" +"Language-Team: Polish \n" +"Language: pl\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 5.3-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Akcja" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Aktywne źródła" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Blokowanie reklam" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Akcje blokowania reklam" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Dodaj domenę do listy blokowanych" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Dodaj domenę do listy dozwolonych" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Dodaj tę (sub-)domenę do Twojej lokalnej listy blokowanych." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Dodaj tę (pod-)domenę do Twojej lokalnej listy dozwolonych." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Dodatkowa lista blokująca" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Dodatkowe ustawienia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Dodatkowe opóźnienie wyzwalacza w sekundach przed rozpoczęciem przetwarzania " +"blokowania reklam." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Ustawienia DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Zaawansowane ustawienia e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Ustawienia raportowania" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Zezwalaj na adresy IP klientów lokalnych" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Zezwalaj na wszystkie żądania określonych klientów DNS na podstawie ich " +"adresu IP (RPZ-CLIENT-IP). Uwaga: ta funkcja jest obecnie obsługiwana tylko " +"przez backend DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Odpowiedź" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Katalog kopii zapasowej" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Podstawowy katalog tymczasowy" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Podstawowy katalog temp dla wszystkich operacji związanych z blokowaniem " +"reklam, takich jak pobieranie, sortowanie, scalanie itp." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Zmiany listy blokowanych zostały zapisane. Odśwież listę blokowanych reklam, " +"aby zmiany zostały wprowadzone." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Lista blokowanych..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Blokuj adresy IP klientów lokalnych" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Blokuj wszystkie żądania niektórych klientów DNS na podstawie ich adresów IP " +"(RPZ-CLIENT-IP). Uwaga: ta funkcja jest obecnie obsługiwana tylko przez " +"backend bind DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Zablokowane żądania DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Zablokowane domeny" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Kopia zapasowa list blokujących" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Zapytanie do list blokujących" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Zapytanie..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Źródła list" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Tworzy dodatkową listę blokowania DNS, aby zablokować dostęp do wszystkich " +"domen oprócz tych wymienionych na liście dozwolonych. Uwaga: możesz użyć tej " +"restrykcyjnej listy bloków, np. dla konfiguracji WiFi dla gości lub dla " +"dzieci." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Anuluj" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Kategorie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Klient" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Klienty" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Konfiguracja pakietu blokowania reklam do blokowania domen za pomocą DNS. " +"Aby uzyskać więcej informacji, sprawdź dokumentację online" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Licznik" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Tworzenie skompresowanej kopii zapasowej list, będzie używana w przypadku " +"błędów pobierania lub podczas startu." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "Zaplecze DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Katalog DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "Instancja DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "Raport DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Limit czasu restartu DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Data" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Wyłącz pozwolenie na DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Wyłącz selektywne listy dozwolonych DNS (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domena" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domeny" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Nie sprawdzaj certyfikatów SSL serwera podczas pobierania." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Niezabezpieczone pobieranie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Parametry pobierania" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Narzędzie pobierania" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Powiadomienie e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Licznik powiadomień e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "Profil e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Adres e-mail odbiorcy" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Adres e-mail nadawcy" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Temat e-mail" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Lista blokowanych" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Lista dozwolonych" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Opróżniaj pamięć podręczną DNS przed rozpoczęciem przetwarzania blokowania " +"reklam, aby zmniejszyć zużycie pamięci." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Włącz SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Włącz umiarkowane filtry SafeSearch dla youtube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Włącz usługę blokowania reklam." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" +"Włącz rejestrowanie debugowania w przypadku wystąpienia błędów w " +"przetwarzaniu." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Włączone" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Sygnatura czasowa zakończenia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Wymuś SafeSearch dla Google, Bing, DuckDuckGo, Yandex, Youtube i Pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Istniejące zadania" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Zewnętrzna domena wyszukiwania DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Zewnętrzna domena do sprawdzania, czy restart zaplecza DNS zakończył się " +"sukcesem. Uwaga: Aby wyłączyć to zaznaczenie, należy ustawić opcję na " +"'false'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Instancja piąta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Kryteria filtrowania takie jak data, domena lub klient (opcjonalnie)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Porty zapory, które powinny być wymuszane lokalnie." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Strefy źródłowe zapory, które powinny być wymuszane lokalnie." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Instancja pierwsza (domyślna)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Opróżnij pamięć podręczną DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Wymuś lokalny DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Wymuszone porty" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Strefy wymuszone" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Instancja czwarta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Zbierz ruch sieciowy związany z DNS za pośrednictwem tcpdump i na żądanie " +"dostarczaj raport DNS. Uwaga: wymaga to dodatkowej instalacji pakietu " +"'tcpdump-mini' i pełnego ponownego uruchomienia usługi blokowania reklam." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Ustawienia główne" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Udziel dostępu LuCI do usługi blokowania reklam" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Informacje" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Katalog więzienia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Ostatnie uruchomienie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Ostatnie zapytania DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Limit SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Limit SafeSearch dla certyfikowanych dostawców." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Numer wiersza do usunięcia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Lista dostępnych urządzeń sieciowych używanych przez tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Lista dostępnych interfejsów sieciowych do uruchomienia blokowania reklam. " +"Wybierz 'nieokreślone', aby użyć klasycznego limitu czasu uruchamiania " +"zamiast wyzwalacza sieciowego." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Lista obsługiwanych zapleczy DNS z domyślnym katalogiem list. Aby zastąpić " +"domyślną ścieżkę, użyj opcji 'Katalog DNS'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Lista obsługiwanych i wstępnie skonfigurowanych narzędzi do pobierania." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Widok dziennika" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Usługa niskopriorytetowa" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Ręcznie zastąp wstępnie skonfigurowane opcje pobierania dla wybranego " +"narzędzia pobierania." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Brak wyników zapytania!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Brak dzienników związanych z blokowaniem reklam!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Przegląd" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" +"Profil używany przez 'msmtp' do powiadamiania e-mailem o blokowaniu reklam." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Zapytanie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" +"Wysyłaj zapytania do aktywnych list blokowania i kopii zapasowych dla " +"określonej domeny." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Zwiększ liczbę powiadomień, aby otrzymywać wiadomości e-mail jeśli ogólna " +"liczba blokowanych list jest mniejsza lub równa podanemu limitowi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Adres odbiorcy dla powiadomień e-mail blokowania reklam." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Przekieruj wszystkie zapytania DNS z określonych stref do lokalnego " +"resolwera DNS, dotyczy protokołów UDP i TCP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Zmniejsz priorytet przetwarzania w tle, aby pobierać mniej zasobów systemu. " +"Uwaga: wymagany restart usługi blokowania reklam." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Odśwież" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Odśwież raport DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Zaktualizuj listy automatycznie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Harmonogram..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Odświeżanie..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Odpoczynek SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Przeładuj" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Usuń istniejące zadanie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Zgłoś liczbę fragmentów" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Zgłoś wielkość porcji" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Katalog raportu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Interfejs raportowania" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Porty raportowania" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Raportuj liczbę fragmentów używaną przez tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Raportuj wielkość fragmentów używaną przez tcpdump w MB." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Rozwiązuj adresy IP" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" +"Rozwiązuj raportowane adresy IP za pomocą odwrotnych wyszukiwań DNS (PTR)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Restartuj" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Wynik" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Uruchomione katalogi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Flagi uruchomieniowe" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Uruchomione interfejsy" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Uruchomione narzędzia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Zapisz" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Instancja druga" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Wysyłaj powiadomienia e-mail związane z blokowaniem reklam. Uwaga: wymaga to " +"dodatkowej instalacji pakietu 'msmtp'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Adres nadawcy dla powiadomień e-mailowych blokowania reklam." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Ustaw nowe zadanie blokowania reklam" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Ustaw instancję backendu DNS używaną przez blokowanie reklam." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Ustawienia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Źródła (wielkość, skupienie)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Rozdzielona spacjami lista portów używanych przez tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Sygnatura czasowa uruchamiania" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Interfejs wyzwalacza uruchamiania" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Status / Wersja" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Wstrzymaj" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Katalog docelowy dla plików raportów związanych z DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Katalog docelowy dla kopii zapasowych listy blokującej." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" +"Katalog docelowy dla wygenerowanej listy blokowania 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" +"Katalog docelowy dla wygenerowanej listy zablokowanych 'adb_list.jail'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Nie można zaktualizować czasu odświeżania." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Czas odświeżania został zaktualizowany." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "Dni tygodnia (opcjonalnie, wartości: 0-6, osobno, lub -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "Godzina (wymagane, zakres: 0–23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "Minuta (opcjonalnie, zakres: 0–59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"Dane wyjściowe dziennika systemowego, wstępnie przefiltrowane dla informacji " +"związanych z blokowaniem reklam." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Instancja trzecia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Jest to lokalna lista blokowanych blokowania reklam, aby zawsze odmawiać na " +"niektóre domeny.
    Uwaga: dodaj tylko jedną domenę na linię. Komentarze " +"wprowadzone z '#' są dozwolone - adresy ip, wildcards i regex nie są " +"dozwolone." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Jest to lokalna lista dozwolonych blokowania reklam, aby zawsze zezwalać na " +"niektóre domeny.
    Uwaga: dodaj tylko jedną domenę na linię. Komentarze " +"wprowadzone z '#' są dozwolone - adresy ip, wildcards i regex nie są " +"dozwolone." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Ta zakładka pokazuje ostatni wygenerowany raport DNS, naciśnij przycisk " +"'Odśwież', aby uzyskać aktualny raport." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Czas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Limit czasu oczekiwania na pomyślne ponowne uruchomienie zaplecza DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Aby Twoje listy były aktualne, należy ustawić automatyczne zadanie " +"aktualizacji tych list." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Statystyki czołówek" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Temat dla powiadomień e-mail blokowania reklam." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Łączna liczba żądań DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Opóźnienie wyzwalacza" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Nie można zapisać zmian: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Warianty" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Pełne rejestrowanie debugowania" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Zmiany na liście dozwolonych zostały zapisane. Odśwież listę, aby zmiany " +"zostały wprowadzone." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Lista dozwolonych" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "maks. rozmiar zestawu wyników" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "maks. statystyki czołówek" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/pt/adblock.po b/package/luci/applications/luci-app-adblock/po/pt/adblock.po new file mode 100644 index 0000000000..5e3ed62dad --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/pt/adblock.po @@ -0,0 +1,867 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-10-22 18:07+0000\n" +"Last-Translator: ssantos \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.14.2-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Ação" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Fontes Ativas" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Ação do adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Adicionar o Domínio na Lista Negra" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Adicionar o Domínio na Lista Branca" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Adicione este (sub)domínio na sua lista negra local." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Adicione este (sub)domínio na sua lista branca local." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Lista de Bloqueio Priosional" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Configurações adicionais" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Atraso adicional do gatilho em segundos antes do processamento do adblock " +"começar." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Configurações Avançadas do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Configurações avançadas de E-Mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Configurações Avançadas do Relatório" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Permitir os IPs dos clientes locais" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Permitir todas as solicitações de certos clientes DNS com base no endereço " +"IP (RPZ-CLIENT-IP) deles. Nota: esta funcionalidade é atualmente suportada " +"apenas pelo backend DNS do BIND." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Resposta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Diretório do Backup" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Diretório Base Temporário" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"O Diretório Base Temporário é usado para tudo que for relacionado com as " +"operações em tempo real do adblock como descarrega, classificação de " +"ficheiros, mesclagem de ficheiros, etc." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"As alterações na lista negra foram gravadas. Atualize as suas listas de " +"adblock para que as alterações entrem em vigor." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Lista negra..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Bloquear IPs de clientes locais" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Bloquear todos os pedidos de certos clientes DNS com base no endereço IP " +"(RPZ-CLIENT-IP) deles. Atenção: esta funcionalidade é atualmente suportada " +"apenas pelo backend DNS do BIND." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Solicitações de DNS bloqueadas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Domínios Bloqueados" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Cópia de Segurança da Lista de Bloqueio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Consulta na Lista de Bloqueio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Pesquisando a Lista de Bloqueio..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Origem da Blocklist" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Cria uma lista de bloqueio DNS adicional para bloquear o acesso de todos os " +"domínios, exceto aqueles listados na lista branca. Nota: pode usar esta " +"lista de bloqueio restritiva para convidados na rede wifi ou configurações " +"restritivas para crianças por exemplo." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Cancelar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Categorias" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Cliente" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Clientes" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Configuração do pacote de adblock para bloquear domínios de anúncios/abuso " +"usando DNS. Para obter mais informações verifique a documentação on-line" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Contagem" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Crie cópias de segurança compactados da lista de bloqueio, estes serão " +"usados em caso de erros de descarregamento ou durante a inicialização." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "Infraestrutura do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Diretório DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "Instância de DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "Relatório do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Tempo Limite para Reiniciar o DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Data" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Desativar a opção DNS Permitir" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Desativar a lista branca de DNS (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domínio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domínios" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Não verificar os certificados de SSL do servidor durante a descarrega." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Descarregar inseguro" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Parâmetros de Descarregamento" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Ferramenta para Descarregar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Notificação por e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Contagem de Notificações por E-Mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "Perfil de e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Endereço de e-mail do destinatário" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Endereço de e-mail do remetente" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Assunto do e-mail" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Editar Lista Negra" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Editar lista de permissões" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Esvaziar o cache DNS antes que o processamento do adblock comece a reduzir o " +"consumo de memória." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Ativar o SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Ativar os filtros SafeSearch de forma moderada para o Youtube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Ativar o serviço adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" +"Ativa o registo de depuração detalhado para casos de todos os erros de " +"processamento." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Ativado" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Carimbo de tempo final" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Impõem o SafeSearch para o google, bing, duckduckgo, yandex, youtube e o " +"pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Tarefa(s) existente(s)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Domínio de Pesquisa Externa do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Domínio externo para verificar se houve uma reinicialização bem sucedida da " +"infraestrutura do DNS. Nota: defina como 'falsa' para desativar esta " +"verificação." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Quinta instância" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Filtrar critérios como data, domínio ou cliente (opcional)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Portas da firewall que devem ser localmente forçadas." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Zonas fonte da firewall que devem ser localmente forçadas." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Primeira instância (padrão)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Limpar o cache de DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Forçar o DNS Local" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Portas forçadas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Zonas forçadas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Quarta instância" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Reúna o tráfego de rede relacionado ao DNS através do tcpdump e forneça um " +"Relatório do DNS em tempo real. Nota: é necessário a instalação adicional do " +"pacote 'tcpdump-mini' e a reinicialização completa do serviço do adblock " +"para que as modificações entrem em vigor." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Configurações gerais" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Conceder acesso à app LuCI adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Informação" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Diretório Prisional" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Última Execução" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "As últimas solicitações do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Limite do SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Limite o SafeSearch a determinados provedores." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Número da linha a remover" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Lista de aparelhos da rede disponíveis que foram usados pelo tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Lista de interfaces de rede disponíveis para disparar o adblock. Escolha " +"'não especificado' para usar um tempo de inicialização clássico em vez de um " +"gatilho de rede." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Lista das infraestruturas de DNS compatíveis com a sua listagem predefinida " +"de diretório. Para substituir o caminho predefinido, use a opção 'Diretório " +"DNS'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Lista de ferramentas de descarregamento suportadas e completamente pré-" +"configuradas." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Vista do registo log" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Serviço de Baixa Prioridade" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Substituir manualmente as opções de descarregar pré-configuradas para o " +"utilitário de descarregar selecionado." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "A consulta não retornou resultados!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Ainda não há registos relacionados ao adblock!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Visão Geral" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "Perfil dos e-mails de notificação do adblock utilizado por 'msmtp'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Consulta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" +"Consulta as listas de bloqueios ativos e as cópias de segurança para um " +"domínio específico." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Aumente a contagem de notificações para receber e-mails caso a contagem " +"geral das listas de bloqueio seja menor ou igual ao limite informado." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Endereço do destinatário para e-mails de notificação do adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Redirecionar todas as consultas DNS de zonas especificadas para o resolvedor " +"DNS local, aplica-se ao protocolo UDP e TCP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Reduz a prioridade do processamento do adblock em segundo plano visando " +"economizar os recursos do sistema. Nota: Esta alteração requer uma " +"reinicialização completa do serviço adblock para que faça efeito." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Atualizar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Atualizar o Relatório do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Atualizar Temporizador" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Atualizando o Temporizador..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Atualizar..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Alivie o SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Recarregar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Remover uma tarefa existente" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Relatar Contagem de Porções" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Tamanho de Porções de Relatório" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Diretório de Relatórios" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Interface de Relatório" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Relatório das Portas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Informar a contagem dos pedaços usados pelo tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Informar o tamanho do pedaço utilizado pelo tcpdump em MByte." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Resolver IPs" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" +"Resolver os endereços IP de emissão de relatórios a usar pesquisas de DNS " +"reversas (PTR)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Reiniciar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Resultado" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Executar Diretórios" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Flags de Execução" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Executar Interfaces" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Executar Utilitários" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Guardar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Segunda instância" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Envie e-mails de notificação relacionados ao adblock. Note que: a instalação " +"adicional do pacote 'msmtp' é necessária." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Endereço E-Mail do remetente para as notificações do adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Definir uma nova tarefa de adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Defina a instância do backend de dns usada pela adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Configurações" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Fontes (Tamanho, Foco)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Lista separada por espaço das portas utilizadas pelo tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Carimbo de tempo incial" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Interface do Gatilho de Inicialização" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Condição geral / versão" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Suspender" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Diretório de destino para ficheiros de relatório relacionados ao DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Diretório de destino para os backups de listas de bloqueio." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" +"Diretório de destino para a lista de blocos 'adb_list.overall' gerada ." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" +"Diretório de destino para a lista que for gerada pelo lista de bloqueio " +"prisional 'adb_list.jail'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Não foi possível atualizar o tempo de atualização do temporizador." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "O tempo de atualização foi atualizado." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "O dia da semana (valores opc.: 0-6 possivelmente sep. por , ou -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "A parte das horas (obg., intervalo: 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "A parte dos minutos (opt., intervalo: 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"A saída do syslog, pré-filtrada somente para mensagens relacionadas ao " +"adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Terceira instância" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Está é a lista negra do adblock de certos (sub) domínios que sempre serão " +"negados.
    Nota: adicione apenas um domínio por linha. Comentários " +"introduzidos com '#' são permitidos - endereços ip, curingas e regex não são." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Está é a lista branca do adblock de certos (sub) domínios que sempre serão " +"permitidos.
    Nota: adicione apenas um domínio por linha. Comentários " +"introduzidos com '#' são permitidos - endereços ip, curingas e regex não são." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Esta guia mostra o último relatório DNS gerado, pressione o botão " +"'Atualizar' para obter o relatório atual." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Tempo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Tempo limite para aguardar o reinício bem sucedido do DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Para manter as suas listas de adblock atualizadas, deve configurar uma " +"tarefa de atualização automática para essas listas." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Estatísticas principais" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" +"Defina o assunto dos e-mails que serão usados nas notificações do adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Total de solicitações de DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Atraso do Gatilho" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Impossível gravar as modificações: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Variantes" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Registos detalhados de depuração" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"As modificações feitas na lista branca foram salvas. Atualize a sua lista de " +"adblock para que as modificações feitas tenham efeito." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Lista Branca..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "BIND (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "def. a quantidade máxima de resultados" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "estatísticas principais max." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/pt_BR/adblock.po b/package/luci/applications/luci-app-adblock/po/pt_BR/adblock.po new file mode 100644 index 0000000000..883518db70 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/pt_BR/adblock.po @@ -0,0 +1,876 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2022-10-19 10:29+0000\n" +"Last-Translator: Wellington Terumi Uemura \n" +"Language-Team: Portuguese (Brazil) \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.14.2-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Ação" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Fontes Ativas" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Bloqueio de anúncios" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Ação do adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Adicionar o Domínio na Lista Negra" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Adicionar o Domínio na Lista Branca" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Adicione este (sub)domínio na sua lista negra local." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Adicione este (sub)domínio na sua lista branca local." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Lista de Bloqueio Adicional" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Configurações Adicionais" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Atraso de gatilho adicional em segundos antes do processamento do adblock " +"começar." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Configurações Avançadas do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Configurações Avançadas do E-Mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Configurações Avançadas do Relatório" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Permita os IPs dos clientes locais" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Permite que todas as solicitações vindos de certos clientes DNS com base no " +"seu endereço IP (RPZ-CLIENT-IP). Observe: Este recurso só é compatível com a " +"estrutura de DNS do bind." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Resposta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Diretório da cópia de segurança" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Diretório Base Temporário" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"O Diretório Base Temporário é usado para tudo que for relacionado com as " +"operações em tempo real do adblock como download, classificação de arquivos, " +"mesclagem de arquivos, etc." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"As alterações na lista negra foram salvas. Atualize as suas listas de " +"bloqueio de anúncios para que as alterações entrem em vigor." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Lista negra..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Bloqueie os IPs dos clientes locais" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Faça o bloqueio de todas as solicitações vindas de certos clientes DNS com " +"base no seu endereço IP (RPZ-CLIENT-IP). Observe: Este recurso só é " +"compatível com a estrutura de DNS do bind." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Requisições bloqueadas do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Domínios Bloqueados" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Cópia de Segurança da Lista de Bloqueio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Consulta na Lista de Bloqueio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Pesquisando a Lista de Bloqueio..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Fontes das listas de bloqueio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Cria uma lista de bloqueio DNS adicional para bloquear o acesso de todos os " +"domínios, exceto aqueles listados na lista branca. Nota: Você pode usar esta " +"lista de bloqueio restritiva para convidados na rede wifi ou configurações " +"restritivas para crianças por exemplo." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Cancelar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Categorias" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Cliente" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Clientes" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Configuração do pacote de adblock para bloquear domínios de anúncio/abuso " +"usando DNS. Para obter mais informações verifique a documentação on-line" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Contagem" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Crie cópias de segurança compactados da lista de bloqueio, estes serão " +"usados em caso de erros de download ou durante a inicialização." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "Infraestrutura do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Diretório DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "Instância DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "Relatório do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Tempo Limite para Reiniciar o DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Dia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Desativar a opção DNS Permitir" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Desative a lista branca do DNS (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domínio" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domínios" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Não verifique os certificados do servidor SSL durante o download." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Download inseguro" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Parâmetros de Download" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Ferramenta para Baixar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Notificação por E-Mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Contagem de Notificações por E-Mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "E-Mail do Perfil" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Endereço de E-Mail do Destinatário" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Endereço de E-Mail do Remetente" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Assunto do E-Mail" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Editar a Lista Negra" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Editar a Lista Branca" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Esvazie o cache do DNS antes que o processamento do adblock comece a reduzir " +"o consumo da memória." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Ativar o SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Ativar os filtros SafeSearch de forma moderada para o youtube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Ativar o serviço de bloqueio de anúncios." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" +"Ativa o registro de depuração detalhada nos casos de qualquer erro de " +"processamento." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Ativado" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Fim da marca temporal" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Impõem o SafeSearch para o google, bing, duckduckgo, yandex, youtube e o " +"pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Tarefa(s) existente(s)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Domínio de Pesquisa Externa do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Domínio externo para verificar se houve uma reinicialização bem sucedida da " +"infraestrutura do DNS. Nota: Defina como 'falsa' para desativar esta " +"verificação." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Quinta instância" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Filtrar critérios como data, domínio ou cliente (opcional)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "As portas do firewall que devem ser impostas localmente." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Zonas de origem do firewall que devem ser imposta localmente." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Primeira instância (padrão)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Limpar a Cache do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Usar o DNS Local" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Portas Impostas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Zonas Impostas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Quarta instância" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Reúna o tráfego de rede relacionado ao DNS através do tcpdump e forneça um " +"Relatório do DNS em tempo real. Nota: É necessário a instalação adicional do " +"pacote 'tcpdump-mini' e da reinicialização completa do serviço do bloqueio " +"de anúncios para que as modificações entrem em vigor." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Configurações gerais" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Conceda acesso ao aplicativo LuCI adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Informações" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Diretório Prisional" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Última Execução" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "As últimas solicitações do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Limite do SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Limite o SafeSearch a determinados fornecedores." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "O número da linha para remover" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" +"Lista de dispositivos da rede disponíveis que foram usados pelo tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Lista de interfaces de rede disponíveis para disparar o bloqueio de anúncio. " +"Escolha 'não especificado' para usar um tempo de inicialização clássico em " +"vez de um gatilho de rede." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Lista das infraestruturas de DNS compatíveis com a sua listagem predefinida " +"de diretório. Para substituir o caminho predefinido, use a opção 'Diretório " +"DNS'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "Lista de ferramentas compatíveis e já pré-configuradas para download." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Exiba o registro log" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Serviço de Baixa Prioridade" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Substitua manualmente as opções do download pré-configurados para o " +"utilitário de download selecionado." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "A Consulta Não Retornou Resultados!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Ainda não há registros relacionados ao bloqueio de anúncio!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Visão geral" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" +"Perfil dos E-Mails de notificação do bloqueio de anúncio utilizado por " +"'msmtp'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Consulta" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" +"Consulta as listas de bloqueios ativos e as cópias de segurança para um " +"domínio específico." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Aumente a contagem de notificações para receber E-Mails caso a contagem " +"geral das listas de bloqueio seja menor ou igual ao limite informado." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" +"Endereço do E-Mail do destinatário para o recebimento das notificações do " +"adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Redirecione todas as consultas DNS das zonas especificadas para o resolvedor " +"do DNS local, aplica-se ao protocolo UDP e TCP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Reduza a prioridade do processamento do bloqueio de anúncios rodando em " +"segundo plano visando economizar os recursos do sistema. Nota: Essa " +"alteração requer uma reinicialização completa do serviço adblock para que " +"surta efeito." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Atualizar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Atualizar o Relatório do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Atualize o Temporizador" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Atualizando o Temporizador..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Atualizar..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Alivie o SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Recarregar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Exclua uma tarefa já existente" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Contagem de Pedaços do Relatório" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Tamanho dos Pedaços do Relatório" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Diretório do Relatório" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Interface do Relatório" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Relatório das Portas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Informar a contagem dos pedaços usados pelo tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Informar o tamanho do pedaço utilizado pelo tcpdump em MByte." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Resolva os IPs" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" +"Resolva os endereços IP reportados usando a pesquisa reversa do DNS (PTR)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Reiniciar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Resultado" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Executar Diretórios" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Executar Flags" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Executar Interfaces" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Executar Utilitários" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Salvar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Segunda instância" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Envie E-Mails de notificação relacionados ao bloqueio de anúncios. Note que: " +"é necessário a instalação adicional do pacote 'msmtp'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" +"Endereço E-Mail do remetente para as notificações do bloqueador de anúncios." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Defina uma nova tarefa ao adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Defina a estrutura da instância do dns usado pelo adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Configurações" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Fontes (Tamanho, Foco)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Lista separada por espaço das portas utilizadas pelo tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Início da marca temporal" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Interface do Gatilho de Inicialização" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Condição Geral / Versão" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Suspender" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" +"Diretório de destino dos relatórios para os arquivos relacionados ao DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "O diretório de destino para os backups da lista de bloqueio." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "Caminho do diretório para a lista nega gerada 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" +"Diretório de destino para a lista que for gerada pelo lista de bloqueio " +"prisional 'adb_list.jail'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Não foi possível atualizar o tempo de atualização do temporizador." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "O tempo de atualização foi atualizado." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "O dia da semana (valores opc.: 0-6 possivelmente set. por , ou -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "A parte das horas (obg., intervalo: 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "A parte dos minutos (obg., intervalo: 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"Saída do syslog, previamente filtrada para mensagens relacionadas ao adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Terceira instância" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Está é a lista negra do bloqueio de anúncios de certos (sub) domínios que " +"sempre serão negados.
    Nota: adicione apenas um domínio por linha. " +"Comentários introduzidos com '#' são permitidos - endereços ip, curingas e " +"regex não são." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Está é a lista branca do bloqueio de anúncios de certos (sub) domínios que " +"sempre serão permitidos.
    Nota: adicione apenas um domínio por linha. " +"Comentários introduzidos com '#' são permitidos - endereços ip, curingas e " +"regex não são." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Esta guia mostra o último relatório gerado do DNS, clique no botão " +"'Atualizar' para obter o mais atual." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Tempo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Tempo limite para aguardar o reinício bem sucedido do DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Para manter as suas listas de bloqueio de anúncios atualizadas, você deve " +"configurar uma tarefa de atualização automática para essas listas." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Principais estatísticas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" +"Defina o assunto dos E-Mais que serão usados nas notificações do bloqueador " +"de anúncios." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Total das solicitações do DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Gatilho de Atraso" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Impossível salvar as modificações: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Variantes" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Registros Detalhados de Depuração" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"As modificações feitas na lista branca foram salvas. Atualize a sua lista de " +"bloqueio de anúncios para que as modificações feitas surtam efeito." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Lista Branca..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "def. a quantidade máxima de resultados" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "principais estatísticas máx." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/ro/adblock.po b/package/luci/applications/luci-app-adblock/po/ro/adblock.po new file mode 100644 index 0000000000..055e064454 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/ro/adblock.po @@ -0,0 +1,864 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-04-23 07:03+0000\n" +"Last-Translator: olimpiumarius \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Acțiune" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Surse active" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Acțiune Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Adăugare Listă Domenii Interzise" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Adăugare Listă Domenii Admise" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Adăugați acest (sub) domeniu în lista locală de interzise." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Adăugați acest (sub) domeniu la lista locală de admise." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Lista blocurilor de închisori suplimentare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Setări suplimentare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Întârziere adițională înainte ca procesarea adblock-ului să înceapă (în " +"secunde)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Setări Avansate DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Setări avansate de e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Setări Avansate Raport" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Permiteți IP-urile clienților locali" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Permiteți toate solicitările anumitor clienți DNS pe baza adresei lor IP " +"(RPZ-CLIENT-IP). Rețineți: Această caracteristică este în prezent acceptată " +"numai de backend-ul bind DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Răspuns" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Director copie de siguranţă" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Directorul Temp de bază" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Director Temporar de Bază pentru toate operațiunile funcționale legate de " +"adblock, ex. descărcare, sortare, unire etc." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Schimbările la Lista de Interzise au fost salvate. Reîmprospătați lista " +"adblock pentru ca schimbările să aibă efect." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Lista de Interzise..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Blocați IP-urile clienților locali" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Blocați toate solicitările anumitor clienți DNS pe baza adresei IP a " +"acestora (RPZ-CLIENT-IP). Rețineți: Această funcție este în prezent " +"suportată numai de backend-ul bind DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Solicitări DNS blocate" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Domenii Blocate" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Copie de Rezervă Pentru Lista de Blocate" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Interogare Lista de Blocare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Interogare Lista de Blocare..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Surse din lista de blocuri" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Creează o listă de blocare DNS suplimentară pentru a bloca accesul la toate " +"domeniile, cu excepția celor enumerate în lista de admise. Vă rugăm să " +"rețineți: puteți utiliza această listă de blocare restrictivă, de ex. pentru " +"wifi-ul oaspeților sau configurațiile pentru copii." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Anulare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Categorii" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Client" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Clienți" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Configurarea pachetului adblock pentru a bloca reclamele/domeniile abuzive " +"prin utilizarea DNS. Pentru informații suplimentare verificați documentația " +"online" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Număr" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Creare copii de rezervă comprimate a listei de blocate, acestea vor fi " +"utilizate în cazul erorilor de descărcare sau în timpul pornirii." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS Backend" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Director DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "Instanța DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "Raport DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Timp Repornire DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Data" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Dezactivare Permite DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Dezactivați lista albă DNS selectivă (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domeniu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domenii" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Nu verificați certificatele serverului SSL în timpul descărcării." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Descărcați Insecure" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Parametrii de descărcare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Utilitar descărcare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Notificare prin e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Număr de Notificări pe E-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "Profil de e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Adresa de e-mail a destinatarului" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Adresa expeditorului de e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Subiect E-Mail" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Editare listă neagră" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Editare listă albă" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Goliți memoria cache DNS înainte de începerea procesării adblock pentru a " +"reduce consumul de memorie." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Activare Căutare Sigură" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Activare filtre moderate SafeSearch pentru YouTube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Activare serviciu adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" +"Activați jurnalizarea verbală a depanării în cazul în care apar erori de " +"procesare." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "activat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Timestamp de final" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Forțare căutare sigură pentru google, bing, duckduckgo, yandex, youtube și " +"pixbay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Loc de muncă existent(e)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Domeniul de căutare DNS extern" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Domeniu extern pentru a verifica dacă a fost repornit cu succes un DNS. Vă " +"rugăm să rețineți: pentru a dezactiva această verificare, setați această " +"opțiune pe „falsă”." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "A cincea instanță" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Criterii de filtrare precum dată, domeniu sau client (opțional)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Porturile firewall care trebuie forțate la nivel local." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Zonele sursă de firewall care ar trebui să fie forțate la nivel local." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Prima instanță (implicit)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Eliberează cache-ul DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Forţează DNS Local" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Porturi forțate" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Zonele forțate" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "A patra instanță" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Adunare trafic de rețea aferent DNS prin tcpdump și realizare raport DNS la " +"cerere. Vă rugăm să rețineți: aceasta necesită instalare suplimentară a " +"pachetului „tcpdump-mini” și o repornire completă a serviciului de blocare, " +"pentru a avea efect." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Setări generale" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Acordă acces la aplicația LuCI adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Informație" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Director Închisoare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Ultima rulare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Ultimele Cereri DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Limitarea SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Limitați SafeSearch la anumiți furnizori." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Numărul liniei de eliminat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Lista dispozitivelor de rețea utilizate de tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Lista interfețelor de rețea disponibile pentru a declanșa pornirea adblock. " +"Alegeți „nespecificat” pentru a utiliza un interval de timp de pornire " +"clasic în loc de declanșarea rețelei." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Lista DNS-urilor acceptate cu directorul lor al listelor implicite. Pentru a " +"rescrie calea implicită, utilizați opțiunea „Director DNS”." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "Lista utilităților de descărcare acceptate și complet pre-configurate." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Vizualizare jurnal" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Serviciu cu prioritate scăzută" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Suprascrieți manual opțiunile de descărcare preconfigurate pentru utilitarul " +"de descărcare selectat." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Nu există rezultate de căutare!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Nu există încă jurnale adblock!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Prezentare generală" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "Profil utilizat de „msmtp” pentru e-mailurile de notificare adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Interogare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" +"Interogare listă de blocări active și copii de rezervă pentru un anumit " +"domeniu." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Creșteți numărul de notificări pentru a primi e-mailuri dacă numărul total " +"de blocări este mai mic sau egal cu limita dată." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Adresa destinatarului pentru e-mailurile de notificare adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Redirecționează toate interogările DNS din zonele specificate către " +"rezolvatorul DNS local; se aplică protocoalelor UDP și TCP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Reducere prioritatea procesării adblock în fundal, pentru a consuma mai " +"puține resurse din sistem. Vă rugăm să rețineți: această modificare necesită " +"o repornire completă a serviciului de blocare pentru a avea efect." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Reîmprospătare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Actualizare Raport DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Cronometru de reîmprospătare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Cronometru de reîmprospătare..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Reîmprospătați..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Relaxare SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Reîncărcați" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Îndepărtarea unei lucrări existente" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Raportați numărul de bucăți" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Raportați dimensiunea bucăților" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Director de rapoarte" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Raport de interfață" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Raport porturi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Raportează numărul de bucăți utilizate de tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Raportează dimensiunea chunk folosită de tcpdump în MByte." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Rezolvarea IP-urilor" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" +"Rezolvarea adreselor IP de raportare prin utilizarea căutărilor DNS invers " +"(PTR)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Reporniți" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Rezultat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Rulați directoare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Fixați indicatoarele" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Interfețe de execuție" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Rulați Utils" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Salvați" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "A doua instanță" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Trimiteți e-mailuri de notificare legate de adblock. Vă rugăm să rețineți: " +"acest lucru necesită instalarea suplimentară a pachetului 'msmtp'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Adresa expeditorului pentru e-mailurile de notificare adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Setați un nou job adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Stabilește instanța dns backend utilizată de adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Setări" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Surse (mărime, focalizare)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Lista de porturi utilizate de tcpdump, separate prin spații." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Timpul de pornire" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Interfața de declanșare a pornirii" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Stare / Versiune" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Suspendați" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Directorul țintă pentru fișierele de raportare referitoare la DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Directorul țintă pentru copiile de rezervă ale listei de blocare." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" +"Directorul țintă pentru lista de blocuri generată \"adb_list.overall\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" +"Directorul de destinație pentru lista de blocuri jail generată \"adb_list." +"jail\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Cronometrul de reîmprospătare nu a putut fi actualizat." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Cronometrul de reîmprospătare a fost actualizat." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "Ziua săptămânii (opt., valori: 0-6, eventual separate prin , sau -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "Porțiunea de ore (necesar, interval: 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "Porțiunea de minute (opțional, interval: 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "Ieșirea syslog, prefiltrată numai pentru mesajele legate de adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "A treia instanță" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Aceasta este lista neagră a adblock-ului local pentru a interzice " +"întotdeauna anumite (sub)domenii.
    Vă rugăm să rețineți: adăugați doar " +"un singur domeniu pe linie. Comentariile introduse cu \"#\" sunt permise - " +"adresele ip, wildcards și regex nu sunt permise." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Aceasta este lista albă a adblock-ului local pentru a permite întotdeauna " +"anumite (sub)domenii.
    Vă rugăm să rețineți: adăugați doar un singur " +"domeniu pe linie. Comentariile introduse cu \"#\" sunt permise - adresele " +"ip, wildcards și regex nu sunt permise." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Această filă afișează ultimul raport DNS generat; apăsați butonul " +"'Actualizare' pentru a obține un raport actual." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Timp" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Timpul de așteptare pentru o repornire reușită a backend-ului DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Pentru a vă menține listele de adblock actualizate, ar trebui să configurați " +"o sarcină de actualizare automată pentru aceste liste." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Statistici de top" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Subiect pentru e-mailuri de notificare adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Solicitări DNS totale" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Intârzierea declanșării" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Nu se pot salva modificările: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Variante" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Jurnalizare Verbală de Depanare" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Modificările la lista albă au fost salvate. Actualizați listele adblock " +"pentru ca modificările să intre în vigoare." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Lista albă..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "legare (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "dimensiunea maximă a setului de rezultate" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "max. statistici de top" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "brut (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "fără legătură (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/ru/adblock.po b/package/luci/applications/luci-app-adblock/po/ru/adblock.po new file mode 100644 index 0000000000..01028945a8 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/ru/adblock.po @@ -0,0 +1,859 @@ +msgid "" +msgstr "" +"Project-Id-Version: LuCI: adblock\n" +"POT-Creation-Date: 2017-10-22 13:00+0300\n" +"PO-Revision-Date: 2023-08-22 18:57+0000\n" +"Last-Translator: \"Alexey D. Filimonov\" \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 5.0-dev\n" +"Project-Info: Это технический перевод, не дословный. Главное-удобный русский " +"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Действие" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Активные источники" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Блокировщик рекламы" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Действие блокировщика рекламы" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Добавить домен в чёрный список" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Добавить домен в белый список" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Добавить этот (под-)домен в локальный чёрный список." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Добавить этот (под-)домен в локальный белый список." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Дополнительный «тюремный» список блокировок" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Дополнительные настройки" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Дополнительная задержка в секундах до начала работы блокировщика рекламы." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Расширенные настройки DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Расширенные настройки электронной почты" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Расширенные настройки отчётов" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Разрешить локальные IP-адреса клиента" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Разрешить все запросы определенных DNS-клиентов на основе их IP-адреса (RPZ-" +"CLIENT-IP). Обратите внимание: В настоящее время эта функция поддерживается " +"только DNS-сервером bind." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Ответ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Папка для резервных копий" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Расположение временных файлов" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Временная папка для «рабочих» операций блокировщика рекламы, таких, как " +"загрузки, сортировки, слияния и т.п." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Изменения чёрного списка сохранены. Для того, чтобы они вступили в силу, " +"обновите списки блокировок." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Чёрный список..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Блокировать локальные IP-адреса клиента" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Блокировать все запросы определенных DNS-клиентов на основе их IP-адреса " +"(RPZ-CLIENT-IP). Обратите внимание: В настоящее время эта функция " +"поддерживается только DNS-сервером bind." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Заблокированные DNS-запросы" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Блокируемые домены" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Резервная копия чёрного списка" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Поиск по «чёрному списку»" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Поиск по чёрному списку..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Источники черного списка" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Создает дополнительный чёрный список DNS для блокирования доступа ко всем " +"доменам, кроме перечисленных в белом списке. Обратите внимание: этот список " +"можно использовать, например, для гостевых Wi-Fi или родительских " +"ограничений." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Отмена" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Категории" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Клиент" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Клиенты" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Конфигурация блокировщика рекламы для блокировки рекламных/мошеннических " +"доменов с помощью DNS. Для получения дополнительной информации, обратитесь к " +"документации" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Количество" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Создание сжатых резервных копий списков блокировок для использования при " +"различных проблемах с загрузкой или во время запуска." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "Служба DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Папка DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "Экземляр DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "Отчёт DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Тайм-аут перезапуска DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Дата" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Отключить пропуск DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Отключить выборочные белые списки DNS (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Домен" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Домены" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Не проверять SSL сертификаты сервера во время загрузки." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Небезопасная загрузка" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Параметры загрузки" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Утилита для загрузки" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Уведомление по электронной почте" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Счётчик e-mail уведомлений" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "Профиль электронной почты" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Адрес получателя" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Адрес отправителя" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Тема" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Редактировать чёрный список" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Редактировать белый список" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Очистить DNS кэш перед стартом Adblock чтобы уменьшить потребление памяти." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Включить Безопасный поиск" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Включить более умеренные фильтры Безопасного поиска для УouTube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Включить службу Adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "Включить подробное формирование отчёта на случай возникновения ошибок." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Включен" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Время окончания" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Принудительное использование Безопасного поиска для Google, Bing, " +"DuckDuckGo, Yandex, YouTube и Pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Существующие задания" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Внешний домен DNS Lookup" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Внешний домен для проверки успешной перезагрузки DNS-сервера. Обратите " +"внимание: чтобы отключить эту проверку, установите для этой опции значение " +"«false»." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Пятая инстанция" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Критерии фильтрации, такие как дата, домен или клиент (необязательно)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Порты файерволла, перенаправляемые локально." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Зоны файерволла, перенаправляемые локально." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Первая инстанция (по умолчанию)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Очистка кэша DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Принудительный локальный DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Перенаправляемые порты" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Перенаправляемые зоны" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Четвёртая инстанция" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Сбор информации о трафике DNS через tcpdump и создание отчётов DNS. Обратите " +"внимание: для работы этой функции необходим пакет 'tcpdump-mini' и полная " +"перезагрузка службы блокировщика рекламы." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Основные настройки" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Предоставить доступ к приложению Adblock для LuCI" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Информация" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Папка для «тюрьмы»" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Последний запуск" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Последние DNS-запросы" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Ограничить Безопасный поиск" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" +"Ограничить использование Безопасного поиска определёнными поисковыми " +"службами." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Номер строки для удаления" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Список доступных сетевых устройств, используемых tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Список сетевых интерфейсов для запуска Adblock в случае их доступности. " +"Выберите «не определено» для стандартного запуска по тайм-ауту." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Список поддерживаемых служб DNS с их каталогом по умолчанию. Чтобы " +"перезаписать путь по умолчанию, используйте опцию «Каталог DNS»." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Список поддерживаемых предварительно настроенных утилит для загрузки списков." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Просмотр журнала" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Низкий приоритет службы" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Вручную переопределить предварительно настроенные параметры загрузки для " +"выбранной утилиты загрузки." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Нет результатов запроса!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Ещё нет журналов, связанных с Adblock!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Обзор" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "Профиль, используемый 'msmtp' для отправки почтовых уведомлений." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Запрос" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" +"Поиск определенного домена в активных списках блокировок и резервных копиях." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Увеличение количества уведомлений для отправки письма в случае, если " +"количество блокировок не превышает указанного числа." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Адрес получателя для уведомлений по электронной почте." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Перенаправление всех DNS-запросов из указанных зон к локальной службе DNS " +"Lookup. Применяется к протоколам TCP и UDP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Уменьшить приоритет фоновой обработки блокировщика рекламы для уменьшения " +"нагрузки на систему. Обратите внимание: для работы данной опции требуется " +"полная перезагрузка службы блокировщика рекламы." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Обновить" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Обновить отчёт DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Обновить таймер" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Обновить таймер..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Обновить..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Ослабить Безопасный поиск" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Перезапустить" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Удалить существующее задание" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Количество фрагментов отчёта" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Размер фрагментов отчёта" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Папка для отчётов" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Интерфейсы в отчёте" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Порты в отчёте" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Количество фрагментов отчёта, используемых tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Размер фрагментов отчёта, используемых tcpdump, в мегабайтах." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Разрешение IP-адресов" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "Разрешение IP-адресов в отчетах с помощью обратного поиска DNS (PTR)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Перезапустить" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Результат" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Рабочие папки" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Флаги запуска" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Рабочие интерфейсы" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Рабочие утилиты" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Сохранить" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Вторая инстанция" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Отправлять связанные с adblock уведомления на e-mail. Замечание: требуется " +"установка дополнительного пакета \"msmtp\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "E-Mail адрес отправителя уведомлений Adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Задать новое задание adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Установить серверный экземпляр DNS, используемый adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Настройки" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Источники (Размер, Фокусировка)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Разделенный пробелами список портов, используемых tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Время начала" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Интерфейс для запуска" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Статус / Версия" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Приостановить" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Целевой каталог для файлов отчетов, связанных с DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Целевой каталог для резервного копирования черного списка." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "Папка для созданного списка блокировки 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "Папка для «тюремного» списка блокировки 'adb_list.jail'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Не удалось обновить таймер обновления." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Таймер обновления обновлён." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "День недели (необязательно, значения: 1–7, запятые или дефисы)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "Распределение часов (обязательно, значения: 0–23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "Распределение минут (необязательно, значения: 0–59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"Вывод системного журнала, предварительно отфильтрованного только для показа " +"сообщений, связанных с Adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Третья инстанция" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Это локальный чёрный список блокировки, указанные в котором (под-)домены " +"всегда блокируются.
    Обратите внимание: добавляйте по одному домену на " +"строку. Разрешается использование комментариев, начинающихся на '#'. IP-" +"адреса и регулярные выражения не поддерживаются." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Это локальный белый список блокировки, указанные в котором (под-)домены " +"всегда пропускаются.
    Обратите внимание: добавляйте по одному домену " +"на строку. Разрешается использование комментариев, начинающихся на '#'. IP-" +"адреса и регулярные выражения не поддерживаются." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"На этой вкладке показан последний созданный отчет DNS, нажмите кнопку " +"'Обновить', чтобы получить текущий отчет." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Время" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Тайм-аут ожидания успешного перезапуска службы DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "Чтобы списки были актуальны, настройте их автоматическое обновление." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Топ Статистика" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Тема, используемая для отправки электронных писем." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Всего DNS-запросов" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Задержка запуска" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Невозможно сохранить изменения: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Варианты" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Подробный журнал отладки" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Изменения в белом списке были сохранены. Обновите свои списки блокировок, " +"чтобы изменения вступили в силу." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Белый список..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "макс. размер списка результатов" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "максимум. топ статистика" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/si/adblock.po b/package/luci/applications/luci-app-adblock/po/si/adblock.po new file mode 100644 index 0000000000..b2b5936377 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/si/adblock.po @@ -0,0 +1,790 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-03-01 07:55+0000\n" +"Last-Translator: HelaBasa \n" +"Language-Team: Sinhala \n" +"Language: si\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.5\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "පිළිතුර" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/sk/adblock.po b/package/luci/applications/luci-app-adblock/po/sk/adblock.po new file mode 100644 index 0000000000..76f81171b3 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/sk/adblock.po @@ -0,0 +1,795 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-09-19 10:18+0000\n" +"Last-Translator: Jose Riha \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 4.14.1\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Akcia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Aktívne zdroje" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Blokovanie reklamy Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Akcia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Pridať zakázanú doménu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Pridať povolenú doménu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Pridať túto (sub-) doménu medzi lokálne zakázané domény." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Pridať túto (sub-) doménu medzi lokálne povolené domény." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Ďalšie nastavenia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Dodatočné oneskorenie v sekundách pred začiatkom spracovania blokovania " +"reklamy." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Pokročilé DNS nastavenia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Pokročilé nastavenia e-mailu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +#, fuzzy +msgid "Advanced Report Settings" +msgstr "Pokročilé nastavenia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Povoliť adresy IP miestnych klientov" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Odpoveď" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Záložný priečinok" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Základný Temp priečinok" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Zmeny v zozname zakázaných domén boli uložené. Obnovte zoznamy Adblocku aby " +"sa prejavili." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Zoznam zakázaných domén..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Blokovať adresy IP miestnych klientov" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Zablokované požiadavky servera DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Blokované domény" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Záloha zoznamu blokovaných domén" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Zdroje zoznamov blokovaní" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Zrušiť" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Kategórie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Klient" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Klienti" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Počet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS adresár" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Dátum" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Doména" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domény" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Nástroj na sťahovanie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Upozornenie e-mailom" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Adresa príjemcu e-mailu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Upraviť čiernu listinu" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Upraviť bielu listinu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Zapnuté" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Vyprázdniť medzipamäť DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Všeobecné nastavenia" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Informácie" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Prehľad" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Uložiť" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Nastavenia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/sv/adblock.po b/package/luci/applications/luci-app-adblock/po/sv/adblock.po new file mode 100644 index 0000000000..5d013bce27 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/sv/adblock.po @@ -0,0 +1,827 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-09-17 17:51+0000\n" +"Last-Translator: Kristoffer Grundström \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.0.2\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Åtgärd" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Aktiva källor" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Reklamblockeringshandling" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Lägg till svartlistad domän" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Lägg till vitlistad domän" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Lägg till denna (under-)domän till din lokala svartlista." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Lägg till denna (under-)domän i din lokala vitlista." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Ytterligare arrest-blocklista" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Ytterligare inställningar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Ytterligare trigger fördröjning i sekunder innan Adblock-bearbetningen " +"påbörjas." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Avancerade DNS-inställningar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Avancerade e-post-inställingar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Avancerade rapportinställningar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Tillåt lokala klienters IP" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Svar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Säkerhetskopiera mapp" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Tempkatalogbas" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Tempbaskatalog för alla annonsblockeringsrelaterade driftoperationer. T.ex. " +"nedladdning, sortering, sammanslagning, etc." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Ändringar av startlistan har sparats. Uppdatera dina annonsblockeringslistor " +"för att ändringarna ska få verkan." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Svartlista..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Blockera lokala klienters IP" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Blockerade DNS-uppslag" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Blockerade domäner" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Blockeringslistssäkerhetskopia" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Blockeringslistsfråga" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Blockeringslistsfråga..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Källor för blockeringslistor" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Bygger en ytterligare spärrlista för DNS som blockerar åtkomst till alla " +"domäner utom de vitlistade. Notera: Du kan använda denna begränsande " +"spärrlista för t.ex. gästnätverk eller barnsäkra uppsättningar." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Avbryt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Kategorier" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Klient" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Klienter" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Konfiguration av annonsblockeringspaketet för att spärra annons-/" +"missbruksdomäner via DNS. Se online-dokumentationen för mer information." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Räkna" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Skapa komprimerade säkerhetskopior av spärrlistor för att användas vid " +"uppstart i händelse av nedladdningsfel." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS-bakände" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS-mapp" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "DNS-instans" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "DNS-rapport" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Tidsgräns för DNS-omstart" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Datum" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Inaktivera DNS-tillåtelse" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Domän" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Domäner" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Kontrollera inte serverns SSL-certifikat under hämtning." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Ladda ner osäkert" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Ladda ner parametrar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Ladda ner verktyget" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "E-postavisering" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Antal E-postaviseringar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "E-postprofil" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Mottagarens e-postadress" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Avsändaradress för e-post" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "E-postämne" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Redigera svartlista" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Redigera vitlista" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Aktivera SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Aktivera måttliga SafeSearch-filter för Youtube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Aktivera annonsblockerinstjänsten." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "Aktivera utförlig avlusningsloggning i händelse av behandlingsfel." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Aktiverad" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Sluttidstämpel" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "Påtvingar SafeSearch på Google, Bing, DuckDuckGo, Yandex och Pixbay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Befintliga jobb" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Extern DNS-uppslagsdomän" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Extern domän för att verifiera en lyckad omstart av DNS-bakände. Notera: " +"Inaktivera denna verifiering genom att välja alternativet 'false'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Femte instans" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Filtreringsvillkor som datum, domän eller klient (valfritt)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Brandväggsportar som ska forceras lokalt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Brandväggskällzoner som ska forceras lokalt." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Första instans (standard)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Töm DNS-cache" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Tvinga lokal DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Forcerade portar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Forcerade zoner" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Fjärde instans" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Samla in DNS-relaterad nätverkstrafik med tcpdump och tillhandahåll en DNS-" +"rapport på begäran. Notera: detta kräver ytterligare installation av " +"'tcpdump-mini'-paketet och en fullständig omstart av " +"annonsblockeringstjänsten för att få verkan." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Generella inställningar" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Ge tillgång till LuCi-programmet annonsblockering" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Information" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Arrestkatalog" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Kördes senast" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Senaste DNS-begäranden" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Begränsa SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Begränsa SafeSearch till vissa leverantörer." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Radnummer att ta bort" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Lista med tillgängliga nätverksenheter använda av tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Lista tillgängliga nätverksgränssnitt för att påkalla uppstart av " +"annonsblockeringen. Välj 'unspecified' för att använda en klassisk " +"upstartstidsgräns istället för en nätverksaktivering." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Lista med tillgängliga DNS-bakändar med deras standardlistskatalog. För att " +"åsidosätta standardsökvägen; använd alternativet 'DNS-katalog'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "Lista över stödda och helt förkonfigurerade nedladdningsverktyg." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Logutsikt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Lågprioriterad tjänst" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Inga frågeresultat!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Inga annonsblockerinsrelaterade loggar ännu!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Överblick" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" +"Profil som används av 'msmtp' för annonsblockeringsaviserinse-" +"postmeddelanden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Fråga" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "Fråga aktiva svartlistor och säkerhetskopior efter en given domän." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Öka aviseringsantalet för att få e-post om den sammantagna spärrlistans " +"antal är mindre än eller lika med den givna gränsen." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Mottagande adress för annonsblockeringsaviserings-e-postmeddelanden." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Omdirigera alla DNS-frågor från specifika zoner till den lokala DNS-" +"utredaren, gäller för UDP- och TCP-protokoll." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Sänk prioriteten på annonsblockeringsbakgurndsbearbetning för att ta färre " +"systemresurser i anspråk. Notera: Denna ändring kräver en fullständig " +"omstart av annonsblockeringstjänsten för att ha verkan." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Uppdatera" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Förnya DNS-rapporten" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Förnya stoppuret" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Förnya stoppuret..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Fräscha upp..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Slappna av SafeSearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Ladda om" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Ta bort ett befintligt jobb" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Rapportera klimpantal" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Rapportera klimpstorlek" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Rapportkatalog" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Rapportgränssnitt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Rapporthamnar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Rapportera klimpantal använt av tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Rapportera klimpstorlek som används av tcpdump i MByte." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Starta om" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Resultat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Körkataloger" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Förflaggor" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Körgränssnitt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Kör verktyg" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Spara" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Andra instans" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Skicka adblock-relaterade aviseringar via e-post. Vänligen notera att: det " +"här kräver installation av 'msmtp'-paketet." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Avsändaradress för adblock-aviseringar via e-post." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Ställ in ett nytt adblock-jobb" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Ställ in DNS-bakändens instans som används av adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Inställningar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Källor (Storlek, Fokus)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Utrymmesseparerad lista över portar som används av tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Status / Version" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Stäng av" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Målmapp för DNS-relaterade rapport-filer." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "Målmapp för den genererade blockeringslistan 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Uppdateringstimern kunde inte uppdateras." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Uppdateringstimern har uppdaterats." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "Veckodagen (valfria, värden: 0-6 möjligen sep. av , eller -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/templates/adblock.pot b/package/luci/applications/luci-app-adblock/po/templates/adblock.pot new file mode 100644 index 0000000000..b8320d3d7c --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/templates/adblock.pot @@ -0,0 +1,781 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "" diff --git a/package/luci/applications/luci-app-adblock/po/tr/adblock.po b/package/luci/applications/luci-app-adblock/po/tr/adblock.po new file mode 100644 index 0000000000..f52310bbd5 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/tr/adblock.po @@ -0,0 +1,865 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-29 19:41+0000\n" +"Last-Translator: semih \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.2-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Aksiyon" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Etkin Kaynaklar" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Reklam Engelleyici" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Reklam engelleme eylemi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Alan Adını Kara Listeye Ekle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Beyaz listeye ekle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Bu (alt-)alan adını yerel kara listenize ekleyin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Bu (alt)alan adını yerel izin verilen listenize ekleyin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Ek \"Hapis\" Engelleme listesi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Ek Ayarlar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Reklam engelleme işlemi başlamadan önce saniye cinsinden gecikme süresi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Gelişmiş DNS Ayarları" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Gelişmiş E-Posta Ayarları" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Gelişmiş Rapor Ayarları" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Yerel İstemci IP'lerine İzin Ver" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"IP adreslerine (RPZ-CLIENT-IP) göre belirli DNS istemcilerinin tüm " +"isteklerine izin verin. Lütfen dikkat: Bu özellik şu anda yalnızca bind DNS " +"arka ucu tarafından desteklenmektedir." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Cevap" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Yedekleme Dizini" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Temel Geçici Dizin" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Reklam engelleyici ile ilişkili tüm gerçek zamanlı işlemler için Temel " +"Geçici Dizin, örn. indirme, sıralama, birleştirme vb." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Kara liste değişiklikleri kaydedildi. Değişikliklerin etkili olması için " +"reklam engelleme listelerinizi yenileyin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Kara liste..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Yerel İstemci IP'lerini Engelle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"IP adreslerine (RPZ-CLIENT-IP) göre belirli DNS istemcilerinin tüm " +"isteklerini engelleyin. Lütfen dikkat: Bu özellik şu anda yalnızca bind DNS " +"arka ucu tarafından desteklenmektedir." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Engellenen DNS İstekleri" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Engellenen Alan Adları" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Engelleme Listesi Yedekleme" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Engelleme Listesi Sorgusu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Engelleme Listesi Sorgusu..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Engelleme Listesi Kaynakları" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"İzin verilen alan adları listesindekiler dışındaki tüm alan adlarına erişimi " +"engellemek için ek bir DNS engelleme listesi oluşturur. Not: Bu kısıtlayıcı " +"engelleme listesini misafir veya çocuk wifi yapılandırmaları için " +"kullanabilirsiniz." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "İptal" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Kategoriler" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "İstemci" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "İstemciler" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Reklam engelleyici paketinin, DNS kullanarak reklam / kötüye kullanım " +"alanlarını engelleyecek şekilde yapılandırılması. Daha fazla bilgi için çevrimiçi " +"belgelere bakın." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Adet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Sıkıştırılmış kara liste yedekleri oluşturun, bunlar indirme hataları ve " +"başlatma sırasında kullanılacaktır." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS Arka Uç" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS Dizini" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "DNS Örneği" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "DNS Raporu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "DNS Yeniden Başlatma Zaman Aşımı" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Tarih" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "DNS İzin Vermeyi Devre Dışı bırakın" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Seçici DNS beyaz listeyi (RPZ-PASSTHRU) devre dışı bırakın." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Alan" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Alan adları" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "İndirme sırasında SSL sunucu sertifikalarını kontrol etme." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Güvensiz İndir" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "İndirme Parametreleri" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "İndirme Aracı" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "E-Posta Bildirimi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "E-Posta Bildirim Sayısı" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "E-Posta Profili" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "E-Posta Alıcı Adresi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "E-Posta Gönderen Adresi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "E-Posta Konusu" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Karalisteyi Düzenle" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Beyazlisteyi Düzenle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Bellek tüketimini azaltmak için reklam engelleme işlemeye başlamadan önce " +"DNS önbelleğini boşaltın." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "GüvenliArama'yı Etkinleştir" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Youtube için hafif GüvenliArama'yı etkinleştir." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Adblock servisini etkinleştir." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" +"Herhangi bir işleme hatası durumunda ayrıntılı hata ayıklama günlüğünü " +"etkinleştirin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Etkin" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Zaman damgasını bitir" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Google, bing, duckduckgo, yandex, youtube ve pixabay için GüvenliArama " +"uygulanıyor." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Mevcut iş(ler)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Harici DNS Arama Alanı" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"DNS arkaucunun başarılı şekilde yeniden başlatıldığını kontrol eden harici " +"alan. Lütfen dikkat: Bu kontrolü devre dışı bırakmak için 'false' olarak " +"ayarlayın." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Beşinci örnek" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Tarih, alan, client gibi filtre özellikleri (opsiyonel)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Yerel olarak zorlanması gereken güvenlik duvarı bağlantı noktaları." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Yerel olarak zorunlu olması gereken güvenlik duvarı kaynak bölgeleri." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "İlk örnek (varsayılan)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "DNS Önbelleğini Temizle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Yerel DNS zorla" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Zorlanan Erişim Noktaları" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Zorlanan Bölgeler" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Dördüncü örnek" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"DNS ile ilgili ağ trafiğini tcpdump aracılığıyla toplayın ve talep üzerine " +"bir DNS Raporu oluşturun. Lütfen dikkat: etkili olması için ek olarak " +"'tcpdump-mini' paket kurulumuna ve adblock hizmetinin tamamen yeniden " +"başlatılması gerekir." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Genel Ayarlar" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "LuCI uygulaması adblock'a izin verin" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Bilgi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Kafes Dizini" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Son çalışma zamanı" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Yeni DNS Sorguları" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "GüvenliArama'yı limitle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Belirli sağlayıcılar için GüvenliArama'yı limitle." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Kaldırılacak satırın numarası" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "tcpdump tarafından kullanılan mevcut ağ aygıtlarının listesi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Adblock başlangıcını tetiklemek için mevcut ağ arayüzlerinin listesi. Ağ " +"tetikleyicisi yerine klasik bir başlangıç zaman aşımı kullanmak için " +"\"belirtilmemiş\" i seçin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Varsayılan liste dizinleriyle birlikte desteklenen DNS arka uçlarının " +"listesi. Varsayılan yolun üzerine yazmak için 'DNS Dizini' seçeneğini " +"kullanın." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Desteklenen ve tam olarak önceden yapılandırılmış indirme yardımcı " +"programlarının listesi." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Günlük Kayıtlarını Göster" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Düşük Öncelikli Servis" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Seçilen indirme programının önceden yapılandırılmış indirme seçeneklerini " +"manuel olarak geçersiz kılın." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Sorgu sonuçları yok!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Henüz adblock ile ilgili kayıt yok!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Genel bakış" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" +"Adblock bildirim e-postaları için 'msmtp' tarafından kullanılan profil." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Sorgu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" +"Belirli bir etki alanı için etkin engelleme listelerini ve yedeklemeleri " +"sorgulayın." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Genel engelleme listesi verilen sınırdan az veya buna eşitse, E-Posta almak " +"için bildirim sayısını artırın." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Adblock bildirim e-postaları için alıcı adresi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Tüm DNS sorgularını belirtilen bölgelerden yerel DNS çözümleyiciye yeniden " +"yönlendir, UDP ve TCP protokolü için geçerlidir." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Sistemin daha az kaynağını kullanmak için adblock arka plan işlemenin " +"önceliğini azaltın. Lütfen dikkat: Bu değişikliğin yürürlüğe girmesi için " +"adblock hizmetinin tam olarak yeniden başlatılması gerekir." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Yenile" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "DNS Raporunu Yenile" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Zamanlayıcıyı Yenile" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Zamanlayıcıyı Yenile .." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Yenile.." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Güvenli Aramayı Rahatlat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Yeniden yükle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Mevcut bir işi kaldırın" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Yığın Sayısını Bildir" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Yığın Boyutunu Bildir" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Rapor Dizini" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Rapor Arayüzü" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Rapor Bağlantı Noktaları" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Tcpdump tarafından kullanılan yığın sayısını bildirin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Tcpdump tarafından kullanılan yığın boyutunu MByte cinsinden bildirin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "IP'leri çözümle" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "Ters DNS (PTR) aramalarını kullanarak raporlama IP adreslerini çözün." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Tekrar başlat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Sonuç" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Dizinleri Çalıştır" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Bayrakları Çalıştır" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Arayüzleri Çalıştır" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Araçları Çalıştır" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Kaydet" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "İkinci örnek" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Adblock ile ilgili bildirim e-postaları gönderin. Lütfen dikkat: bu, ek " +"'msmtp' paket kurulumuna ihtiyaç duyar." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Adblock bildirim e-postaları için gönderen adresi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Yeni bir reklam engelleme işi ayarlayın" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Adblock tarafından kullanılan dns sunucu ayarları örneğini ayarlayın." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Ayarlar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Kaynaklar (Boyut, Odak)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" +"Tcpdump tarafından kullanılan bağlantı noktalarının boşlukla ayrılmış " +"listesi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Zaman Damgasını Başlat" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Başlangıç Tetikleme Arayüzü" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Durum / Sürüm" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Askıya al" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "DNS ile ilgili rapor dosyaları için hedef dizin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Engelleme listesi yedeklemeleri için hedef dizin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "Oluşturulan engelleme listesi 'adb_list.overall' için hedef dizin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "Oluşturulan engelleme listesi 'adb_list.jail' için hedef dizin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Yenileme Zamanlayıcısı güncellenemedi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Yenileme Zamanlayıcısı güncellendi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "Haftanın günü (ops., Değerler: 0-6 muhtemelen or - ile ayrılmış)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "Saat bölümü (gerekli, aralık: 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "Dakika bölümü (isteğe bağlı, aralık: 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"Yalnızca adblock ile ilgili mesajlar için önceden filtrelenmiş syslog " +"çıktısı." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Üçüncü örnek" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Bu, belirli (alt) alan adlarını her zaman reddeden yerel reklam engelleme " +"kara listesidir.
    Lütfen unutmayın: Her satıra yalnızca bir alan " +"ekleyin. '#' İle tanıtılan yorumlara izin verilir - ip adresleri, joker " +"karakterler ve normal ifadelere izin verilmez." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Bu, belirli (alt) alan adlarına her zaman izin veren yerel reklam engelleme " +"beyaz listesidir.
    Lütfen unutmayın: satır başına yalnızca bir etki " +"alanı ekleyin. '#' İle tanıtılan yorumlara izin verilir - ip adresleri, " +"joker karakterler ve normal ifadelere izin verilmez." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Bu sekme, oluşturulan son DNS Raporunu gösterir, güncel olanı almak için " +"'Yenile' düğmesine basın." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Zaman" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Başarılı bir DNS arka uç yeniden başlatması için bekleme süresi." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Reklam engelleme listelerinizi güncel tutmak için, bu listeler için otomatik " +"bir güncelleme işi ayarlamalısınız." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "En İyi İstatistikler" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Adblock bildirim e-postaları için konu." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Toplam DNS İstekleri" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Tetikleme Gecikmesi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Değişiklikler kaydedilemiyor: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Varyantlar" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Ayrıntılı Hata Ayıklama Günlüğü" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Beyaz liste değişiklikleri kaydedildi. Değişikliklerin etkili olacağı " +"adblock listelerinizi yenileyin." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Beyaz liste..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "maks. sonuç kümesi boyutu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "maks. en iyi istatistikler" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/uk/adblock.po b/package/luci/applications/luci-app-adblock/po/uk/adblock.po new file mode 100644 index 0000000000..1d0eb583e6 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/uk/adblock.po @@ -0,0 +1,854 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-12-29 23:53+0000\n" +"Last-Translator: Dan \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.15.1-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Дія" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Активні джерела" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Блокування реклами" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Дія Adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Додати домен до чорного списку" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Додати домен до білого списку" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Додати цей (суб-)домен до локального чорного списку." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Додати цей (суб-)домен до локального білого списку." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Додатковий «тюремний» список блокування" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Додаткові налаштування" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "Додаткова затримка в секундах до початку роботи adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Розширені налаштування DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Розширені налаштування E-Mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Розширені налаштування звітів" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Дозволити локальні IP-адресі клієнтів" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Дозволити всі запити певних DNS-клієнтів на основі їхньої IP-адреси (RPZ-" +"CLIENT-IP). Запримітьте: наразі ця функція підтримується лише DNS-сервером " +"bind." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Відповідь" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Тека для резервних копій" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Розташування тимчасових файлів" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Тимчасова тека для «робочих» операцій Adblock, таких як завантаження, " +"сортування, об'єднання тощо." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Зміни чорного списку збережено. Оновіть свої списки блокування реклами, щоб " +"зміни вступили в силу." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Чорний список..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Блокувати IP-адреси локальних клієнтів" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Блокувати всі запити певних клієнтів DNS на основі їх IP-адреси (RPZ-CLIENT-" +"IP). Запримітьте: наразі ця функція підтримується лише DNS-сервером bind." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Заблоковані DNS-запити" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Заблоковані домени" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Резервна копія списку блокування" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Запит до списку блокування" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Запит до списку блокування..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Джерела чорного списку" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Створює додатковий список блокування DNS для блокування доступу до всіх " +"доменів, окрім тих, що перераховані в білому списку. Будь ласка, " +"запримітьте: ви можете використовувати цей обмежувальний список блокування, " +"до прикладу, для конфігурацій гостьового Wi-Fi або безпечного для дітей." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Скасувати" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Категорії" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Клієнт" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Клієнти" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"Налаштування adblock пакету для блокування реклами/небезпечних доменів " +"використовуючи DNS. Для більш детальної інформації дивіться онлайн документацію" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Кількість" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Створення стиснених резервних копій списків блокування, вони будуть " +"використані у разі помилок завантаження або під час запуску." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "Служба DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Тека DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "Екземпляр DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "Звіт DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Тайм-аут перезапуску DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Дата" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Вимкнути пропуск DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Вимкнути вибірковий білий список DNS (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Домен" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Домени" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Не перевіряти SSL-сертифікати сервера під час завантаження." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Завантажувати небезпечним шляхом" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Параметри завантаження" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Утиліта для завантаження" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "E-Mail повідомлення" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Кількість E-Mail повідомлень" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "E-Mail профіль" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "E-Mail адреса отримувача" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "E-Mail адреса відправника" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Тема" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Редагувати чорний список" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Редагувати білий список" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Очистити кеш DNS, перш ніж розпочнеться обробка блокування реклами, щоб " +"зменшити споживання пам’яті." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Увімкнути Безпечний пошук" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Увімкнути помірні фільтри Безпечного пошуку для YouTube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Увімкнути службу Adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "Увімкнути детальний звіт на випадок будь-яких помилок обробки." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Увімкнено" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Час завершення" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Навязати Безпечний пошук для google, bing, duckduckgo, yandex, youtube та " +"pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Існуючі завдання" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Зовнішній домен DNS Lookup" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Зовнішній домен для перевірки успішного перезапуску DNS-сервера. Будь ласка, " +"завбачте: щоб вимкнути цю перевірку, слід встановити значення «false»." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "П'ятий екземпляр" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Критерії фільтра, як дата, домен або клієнт (необов'язково)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Порти брандмауера, які необхідно переспрямувати локально." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Зони брандмауера, які необхідно переспрямувати локально." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Перший екземпляр (за умовчанням)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Очистка кеша DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Примусово локальний DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Переспрямовані порти" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Переспрямовані зони" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Четвертий екземпляр" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Збір інформації щодо трафіку DNS через tcpdump і створення звітів DNS. Будь-" +"ласка, запримітьте: для цього необхідне встановлення додаткового пакету " +"'tcpdump' або 'tcpdump-mini' та повний перезапуск служби Adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Загальні налаштування" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Надати доступ LuCI до застосунку adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Інформація" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Тека для «в'язниці» (jail)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Останній запуск" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Останні DNS-запити" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Обмежити Безпечний пошук" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Обмежити Безпечний пошук певними пошуковими системами." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Номер рядка для видалення" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Перелік доступних мережевих пристроїв, що використовуються tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Перелік доступних мережевих інтерфейсів для запуску старту Adblock. Виберіть " +"\"невизначено\", щоб використовувати класичний тайм-аут запуску замість " +"мережевого тригера." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Перелік підтримуваних служб DNS з їх текою за умовчанням. Щоб переписати " +"шлях за умовчанням, використовуйте опцію \"Тека DNS\"." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "" +"Перелік підтримуваних попередньо налаштовуваних утиліт завантаження списків." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Перегляд журналу" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Низький пріоритет служби" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Вручну перевизначити попередньо налаштовані параметри завантаження для " +"вибраної утиліти завантаження." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Немає результатів запиту!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Ще немає журналів, пов’язаних з Adblock!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Огляд" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "" +"Профіль, який використовується 'msmtp' для сповіщень електронною поштою." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Запит" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "Пошук певного домену в активних списках блокувань та резервних копіях." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Збільшити кількості сповіщень для відправлення листа, якщо кількість " +"блокувань не перевищує зазначеного числа." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Адреса одержувача для сповіщень електронною поштою." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Переспрямовувати всі запити DNS із зазначених зон до локального DNS серверу, " +"застосовується до протоколів UDP і TCP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Зменшити пріоритет фонової обробки adblock для зменшення навантаження на " +"систему. Будь ласка, запримітьте: ця зміна вимагає повного перезапуску " +"adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Оновити" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Оновити звіт DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Оновити таймер" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Оновити таймер..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Оновити..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Послабити Безпечний пошук" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Перезавантажити" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Видалити існуюче завдання" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Кількість фрагментів звіту" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Розмір фрагментів звіту" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Тека для звітів" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Інтерфейси у звіті" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Порти у звіті" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Кількість фрагментів звіту, які використовує tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Розмір фрагментів звіту, який використовує tcpdump, у мегабайтах." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Визначати IP-адреси" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "Визначати IP-адреси у звітах за допомогою зворотного пошуку DNS (PTR)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Перезапустити" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Результат" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Робочі теки" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Прапорці запуску" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Робочі інтерфейси" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Робочі застосунки" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Зберегти" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Другий екземпляр" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Надсилати електронні листи зі сповіщеннями про блокування реклами. Зауважте: " +"для цього потрібно встановити додатковий пакет 'msmtp'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Адреса відправника електронної пошти для сповіщень adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Встановити нове завдання adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Оберіть серверний екземпляр DNS, який використовується adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Налаштування" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Джерела (розмір, фокусування)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "Розділений пробілами список портів, які використовує tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Час початку" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Інтерфейс тригера запуску" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Статус / Версія" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Призупинити" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Цільовий каталог для файлів звітів, пов’язаних з DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Цільовий каталог для резервного копіювання списку блокування." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "Цільовий каталог для створеного списку блокування 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "Цільовий каталог «тюремного» (jail) списку блокування 'adb_list.jail'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Не вдалося оновити таймер оновлення." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Таймер оновлення оновлено." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "День тижня (необов’язково, значення: 1-7, через коми або дефіси)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "Розподіл годин (обов’язково, діапазон: 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "Розподіл хвилин (необов’язково, діапазон: 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"Вихід системного журналу, попередньо відфільтрований лише для повідомлень " +"adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Третій екземпляр" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Це локальний чорний список adblock. Вказані в ньому (під)домени завжди " +"блокуються.
    Будь ласка, зауважте: слід додавати лише один домен на " +"рядок. Дозволено використання коментарів, що починаються з '#'; IP-адреси та " +"регулярні вирази не підтримуються." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Це локальний білий список блокування, вказані в якому (під)домени завжди " +"дозволяються.
    Будь ласка, зауважте: слід додавати лише один домен на " +"рядок. Дозволено використання коментарів, що починається з '#'; IP-адреси та " +"регулярні вирази не підтримуються." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"На цій вкладці відображається останній згенерований звіт DNS, натисніть " +"кнопку «Оновити», щоб отримати поточний звіт." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Час" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Тайм-аут очікування успішного перезавантаження служби DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Щоб ваші списки блокування реклами залишалися актуальними, вам слід " +"налаштувати завдання автоматичного оновлення для цих списків." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Статистика" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Тема E-Mail сповіщень про блокування реклами." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Усього DNS-запитів" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Затримка запуску" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Не вдалося зберегти зміни: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Варіанти" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Докладний журнал відлагодження" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Зміни білого списку збережено. Оновіть свої списки блокування реклами, щоб " +"зміни вступили в силу." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Білий список..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "макс. розмір набору результатів" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "макс. розмір статистики" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/vi/adblock.po b/package/luci/applications/luci-app-adblock/po/vi/adblock.po new file mode 100644 index 0000000000..136b415f93 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/vi/adblock.po @@ -0,0 +1,857 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-06-20 01:57+0000\n" +"Last-Translator: Mashiro \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.18.1\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "Hành động" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "Kích hoạt nguồn" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "Chặn quảng cáo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Hoạt động chặn quảng cáo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "Thêm tên miền vào danh sách đen" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "Thêm tên miền vào Whilelist" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "Thêm tên miền con cho danh sách đen nội bộ của bạn." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "Thêm tên miền (phụ) này vào danh sách trắng cục bộ của bạn." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "Blocklist Jail bổ sung" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "Cài đặt thêm" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "" +"Kích hoạt độ trễ trong vài giây trước khi bắt đầu tiến trình chặn quảng cáo." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "Cài đặt nâng cao DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "Cài đặt nâng cao Email" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "Cài đặt nâng cao báo cáo" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "Chấp nhận IP máy nội bộ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Cho phép tất cả các yêu cầu của một số máy khách DNS nhất định dựa trên địa " +"chỉ IP của chúng (RPZ-CLIENT-IP). Xin lưu ý: Tính năng này hiện chỉ được hỗ " +"trợ bởi phụ trợ DNS liên kết." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "Phản hồi" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "Thư mục sao lưu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "Đường dẫn thư mục tạm" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"Thư mục tạm thời cơ sở cho tất cả các hoạt động thời gian chạy liên quan đến " +"khối quảng cáo, ví dụ: tải xuống, sắp xếp, hợp nhất, v.v." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Các thay đổi trong danh sách đen đã được lưu. Làm mới danh sách chặn quảng " +"cáo của bạn để các thay đổi có hiệu lực." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "Danh sách đen..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "Chặn IP máy nội bộ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"Chặn tất cả các yêu cầu của một số máy khách DNS nhất định dựa trên địa chỉ " +"IP của chúng (RPZ-CLIENT-IP). Xin lưu ý: Tính năng này hiện chỉ được hỗ trợ " +"bởi phụ trợ DNS liên kết." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "Đã chặn yêu cầu DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "Đã chặn tên miền" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "Sao lưu danh sách chặn" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "Danh sách chặn truy vấn" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "Truy vấn danh sách chặn..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "Bộ lọc" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"Xây dựng danh sách chặn DNS bổ sung để chặn quyền truy cập vào tất cả các " +"miền ngoại trừ những miền được liệt kê trong danh sách trắng. Xin lưu ý: Bạn " +"có thể sử dụng danh sách chặn hạn chế này, ví dụ: cho wifi khách hoặc cấu " +"hình an toàn cho trẻ em." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "Hủy lệnh" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "Các thể loại" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "Máy Khách" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "Các máy khách" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information
    check the online documentation" +msgstr "" +"Cấu hình của gói chặn quảng cáo để chặn các miền quảng cáo/lạm dụng bằng " +"cách sử dụng DNS. Để biết thêm thông tin kiểm tra tài liệu trực tuyến " + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "Bộ đếm" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "" +"Tạo các bản sao lưu danh sách chặn đã nén, chúng sẽ được sử dụng trong " +"trường hợp lỗi tải xuống hoặc trong quá trình khởi động." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS Backend" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "Thư mục DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "DNS instance" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "Báo cáo DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "Quá thời gian khởi động DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "Ngày" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "Tắt DNS Allow" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "Vô hiệu hóa danh sách trắng DNS có chọn lọc (RPZ-PASSTHRU)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "Tên Miền" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "Các Tên Miền" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "Không kiểm tra chứng chỉ máy chủ SSL trong khi tải xuống." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "Tải về không bảo mật" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "Tải xuống Parameters" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "Tiện ích tải xuống" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "Thông báo Email" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "Số lượng thông báo e-mail" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "Hồ sơ Email" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "Địa chỉ người nhận Email" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "Địa chỉ người gửi Email" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "Chủ đề Email" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "Chỉnh danh sách đen" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "Chỉnh danh sách trắng" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "" +"Làm trống bộ đệm DNS trước khi bắt đầu xử lý khối quảng cáo để giảm mức tiêu " +"thụ bộ nhớ." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "Kích hoạt tìm kiếm an toàn" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "Bật bộ lọc Tìm kiếm an toàn cho youtube." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "Bật dịch vụ chặn quảng cáo." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "" +"Cho phép ghi nhật ký gỡ lỗi chi tiết trong trường hợp có bất kỳ lỗi xử lý " +"nào." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "Kích Hoạt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "Dấu thời gian kết thúc" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"Thực thi Tìm kiếm an toàn cho google, bing, duckduckgo, yandex, youtube và " +"pixabay." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "Công việc hiện tại" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "Tên miền tra cứu DNS external" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"Tên miền bên ngoài để kiểm tra khởi động lại phụ trợ DNS thành công. Xin lưu " +"ý: Để tắt kiểm tra này, hãy đặt tùy chọn này thành 'false'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "Instance thứ 5" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "Tiêu chí lọc như ngày, tên miền hoặc ứng dụng khách (tùy chọn)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "Các cổng tường lửa nên được cục bộ." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "Vùng nguồn tường lửa nên được để cục bộ." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "Instance đầu tiên (mặc định)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "Xoá bộ đệm DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "Force DNS nội bộ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "Forced Port" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "Forced Zone" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "Instance thứ 4" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"Thu thập lưu lượng mạng liên quan đến DNS thông qua tcpdump và cung cấp Báo " +"cáo DNS theo yêu cầu. Xin lưu ý: điều này cần cài đặt gói 'tcpdump' hoặc " +"'tcpdump-mini' bổ sung và khởi động lại dịch vụ chặn quảng cáo đầy đủ để có " +"hiệu lực." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "Các cài đặt chung" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "Cấp quyền truy cập vào ứng dụng LuCI adblock" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "Thông Tin" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Jail directory" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "Lần chạy cuối cùng" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "Yêu cầu DNS mới nhất" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "Giới hạn tìm kiếm an toàn" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "Giới hạn Tìm kiếm an toàn cho các nhà cung cấp nhất định." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "Số dòng cần xóa" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "Danh sách các thiết bị mạng khả dụng được sử dụng bởi tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"Danh sách các giao diện mạng có sẵn để kích hoạt bắt đầu chặn quảng cáo. " +"Chọn 'không xác định' để sử dụng thời gian chờ khởi động cổ điển thay vì " +"kích hoạt mạng." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"Danh sách các chương trình phụ trợ DNS được hỗ trợ với thư mục danh sách mặc " +"định của chúng. Để ghi đè lên đường dẫn mặc định, hãy sử dụng tùy chọn 'Thư " +"mục DNS'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "Danh sách các tiện ích tải xuống được hỗ trợ và cấu hình sẵn đầy đủ." + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "Xem nhật ký" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "Dịch vụ ưu tiên thấp" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "" +"Ghi đè thủ công các tùy chọn tải xuống được định cấu hình sẵn cho tiện ích " +"tải xuống đã chọn." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "Không tìm thấy kết quả truy vấn!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "Chưa có nhật ký nào liên quan đến chặn quảng cáo!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "Tổng quan" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "Hồ sơ được sử dụng bởi 'msmtp' cho E-Mail thông báo chặn quảng cáo." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "Truy vấn" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "" +"Truy vấn danh sách chặn và bản sao lưu đang hoạt động cho một miền cụ thể." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"Tăng số lượng thông báo để nhận E-Mail nếu tổng số lượng danh sách chặn nhỏ " +"hơn hoặc bằng giới hạn đã cho." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Địa chỉ người nhận e-mail thông báo chặn quảng cáo." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"Chuyển hướng tất cả các truy vấn DNS từ các vùng được chỉ định sang trình " +"phân giải DNS cục bộ, áp dụng cho giao thức UDP và TCP." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"Giảm mức độ ưu tiên của quá trình xử lý nền khối quảng cáo để lấy ít tài " +"nguyên hơn từ hệ thống. Xin lưu ý: Thay đổi này yêu cầu khởi động lại toàn " +"bộ dịch vụ chặn quảng cáo để có hiệu lực." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "Làm mới" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "Báo cáo làm mới DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "Hẹn giờ làm mới" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "Đang hẹn giờ làm mới..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "Đang làm mới..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "Relax safesearch" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "Tải lại" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "Xóa công việc hiện tại" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "Báo cáo số lượng chunk" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "Báo cáo kích thước Chunk" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "Đường dẫn Report" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "Report interface" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "Report Port" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "Báo cáo số đoạn được sử dụng bởi tcpdump." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "Kích thước khối báo cáo được sử dụng bởi tcpdump trong mbyte." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "Resolve IP" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "Resolve Report địa chỉ IP bằng cách sử dụng tra cứu DNS ngược (PTR)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "Khởi Động Lại" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "Kết quả" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "Run directories" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "Run flags" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "Chạy giao thức" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "Chạy Công cụ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "Lưu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "Đối tượng thứ hai" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"Gửi các email thông báo liên quan đến Adblock. Lưu ý: điều này yêu cầu cài " +"đặt gói 'msmtp' bổ sung." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Địa chỉ người gửi cho các email thông báo liên quan đến Adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "Thiết lập một công việc Adblock mới" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "Thiết lập DNS phía sau đối tượng được sử dụng bởi Adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "Cài đặt" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "Nguồn (Kích thước, Trọng điểm)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "" +"Danh sách các cổng được sử dụng bởi tcpdump (phân cách bằng khoảng trắng)." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "Bắt đầu thời gian" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "Giao diện kích hoạt khởi động" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "Trạng thái / Phiên bản" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "Tạm dừng" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "Thư mục đích cho các tệp báo cáo liên quan đến DNS." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "Thư mục đích cho sao lưu danh sách chặn." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "Thư mục đích cho danh sách chặn được tạo ra 'adb_list.overall'." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "Thư mục đích cho danh sách chặn tù 'adb_list.jail' được tạo ra." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "Không thể cập nhật định kỳ làm mới." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "Định kỳ làm mới đã được cập nhật." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "" +"Ngày trong tuần (tùy chọn, giá trị: 0-6 có thể phân cách bằng dấu phẩy hoặc " +"dấu -)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "Phần giờ (yêu cầu, khoảng: 0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "Phần phút (tùy chọn, phạm vi: 0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "" +"Đầu ra syslog, đã được lọc trước cho các thông báo liên quan đến adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "Bản ghi thứ ba" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Đây là danh sách đen adblock cục bộ để luôn từ chối một số tên miền con.
    Vui lòng lưu ý: chỉ thêm một tên miền mỗi dòng. Ghi chú bắt đầu bằng '#' " +"cho phép - địa chỉ IP, ký tự đại diện và regex không được phép." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"Đây là danh sách trắng adblock cục bộ để luôn cho phép một số (tên miền con)." +"
    Vui lòng lưu ý: chỉ thêm một tên miền mỗi dòng. Ghi chú bắt đầu bằng " +"'#' được phép - địa chỉ IP, ký tự đại diện và regex không được phép." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "" +"Tab này hiển thị Báo cáo DNS được tạo gần đây nhất, nhấn nút 'Làm mới' để " +"lấy báo cáo mới nhất." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "Thời gian" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "Thời gian chờ để đợi khởi động lại thành công của DNS backend." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "" +"Để giữ danh sách adblock của bạn luôn được cập nhật, bạn nên thiết lập một " +"công việc cập nhật tự động cho các danh sách này." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "Thống kê hàng đầu" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Chủ đề cho các E-Mail thông báo adblock." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "Tổng số yêu cầu DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "Kích hoạt độ trễ" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "Không thể lưu các thay đổi: %s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "Biến thể" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "Ghi nhật ký gỡ lỗi chi tiết (Verbose Debug Logging)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "" +"Các thay đổi danh sách trắng đã được lưu. Làm mới danh sách adblock của bạn " +"để thay đổi có hiệu lực." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "Danh sách trắng..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "bind (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "kresd (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "kích thước tối đa của tập kết quả" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "số liệu hàng đầu tối đa" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "raw (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/zh_Hans/adblock.po b/package/luci/applications/luci-app-adblock/po/zh_Hans/adblock.po new file mode 100644 index 0000000000..454f6122f9 --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/zh_Hans/adblock.po @@ -0,0 +1,820 @@ +# liushuyu , 2017. +# Yangfl , 2017-2019. +# Zheng Qian , 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2023-06-11 13:51+0000\n" +"Last-Translator: Eric \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_Hans\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "操作" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "活动源" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "广告拦截" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "拦截操作" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "添加黑名单域名" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "添加白名单域名" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "添加此域名到本地黑名单。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "添加此域名到本地白名单。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "其它被屏蔽列表" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "额外设置" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "事件触发启动前的延时(秒)。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "高级设置 - DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "高级设置 - 邮箱" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "高级设置 - 报告" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "允许本地客户端 IP" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"基于特定DNS客户端的IP地址允许这些客户端的所有请求(RPZ-CLIENT-IP)。请注意:眼" +"下只有bind DNS后端支持此功能。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "回答" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "备份目录" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "基础临时目录" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "所有与广告拦截相关运行时操作的基础临时目录,如下载、排序、合并等。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "黑名单更改已保存。刷新您的广告拦截列表以使更改生效。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "黑名单..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "拦截本地客户端IP" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"基于特定DNS客户端的IP地址拦截它们的所有请求 (RPZ-CLIENT-IP)。请注意:眼下只有" +"bind DNS 后端支持此功能。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "阻止的DNS请求" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "已拦截域名" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "黑名单列表的备份" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "拦截列表查询" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "黑名单查询..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "阻止列表内容" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"构建一个附加的DNS阻止列表,以阻止对除白名单中列出的所有域之外的所有域的访问。" +"请注意:您可以使用此限制性阻止列表,例如用于访客wifi或kidsafe配置。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "取消" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "类别" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "客户端" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "客户端" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"配置广告拦截软件包,以通过 DNS 屏蔽广告/滥用域名。更多有关信息,请查看在线文档" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "计数" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "创建压缩的阻止列表备份,将在下载错误或启动期间使用它们。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS后端" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS 目录" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "DNS 实例" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "DNS报告" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "DNS重新启动超时" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "日期" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "禁用DNS允许" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "禁用选择性DNS白名单(RPZ-PASSTHRU)。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "域名" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "域名" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "下载期间不检查 SSL 服务器证书。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "下载不安全" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "下载参数" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "下载工具" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "电子邮件通知" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "电子邮件通知计数" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "电子邮件概要" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "电子邮件收件人地址" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "电子邮件发件人地址" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "电子邮件主题" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "编辑黑名单" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "编辑白名单" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "在 adblock 处理开始降低内存消耗前清空 DNS 缓存。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "启用安全搜索" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "为YouTube启用适度的安全搜索过滤器." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "启用广告拦截服务。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "在出现任何处理错误时启用详细的调试日志。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "启用" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "结束时间戳" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "强制执行Google,Bing,Duckduckgo,Yandex,youtube和Google的SafeSearc." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "现有任务" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "外部DNS查找域" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"外部域,用于检查DNS后端是否成功重启。请注意:要禁用此检查,请将此选项设置为“ " +"false”。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "第五个实例" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "过滤条件,例如日期,域或客户(可选)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "本地应强制使用的防火墙端口。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "本地应强制使用的防火墙源域。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "第一个实例 (默认)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "清空 DNS 缓存" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "强制本地 DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "强制端口" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "强制域" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "第四个实例" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"通过 tcpdump 收集与 DNS 相关的网络流量,并按需提供 DNS 报告。请注意:这需要额" +"外的“tcpdump-mini”软件包,并重新启动完整的广告拦截服务才能生效。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "常规设置" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "授予访问 LuCI 应用 adblock 的权限" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "信息" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "黑名单目录" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "最后运行" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "最新的DNS请求" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "限定安全搜索" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "限定特定搜索引擎使用安全搜索。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "要移除的行号" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "tcpdump使用的可用网络设备列表." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"触发adblock启动的可用网络接口列表.选择“未指定”以使用传统的启动超时而不是网络" +"触发器." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"支持的DNS后端列表及其默认列表目录.要覆盖默认路径,请使用“ DNS目录”选项." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "支持和完全预配置的下载实用程序列表。" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "日志视图" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "低优先级服务" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "手动覆盖所选下载工具的预配置下载选项。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "无查询结果!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "尚无与广告拦截相关的日志!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "概览" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "'msmtp' 用于adblock通知电子邮件的配置文件。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "查询" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "查询特定域的活动阻止列表和备份." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"如果总体阻止列表总数小于或等于给定的限制,请提高通知数量,以获取电子邮件." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "adblock 通知 E-Mail 的收件人地址。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "将所有DNS查询从指定区域重定向到本地DNS解析器,适用于UDP和TCP协议。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"降低adblock后台处理的优先级以减少系统资源.请注意:此更改要求重新启动完整的" +"adblock服务才能生效." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "刷新" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "刷新DNS报告" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "定时恢复" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "定时恢复中..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "刷新..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "放宽安全搜寻" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "重新加载" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "移除一个现有任务" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "报告区块计数" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "报告区块大小" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "报告目录" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "报告接口" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "报告端口" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "报告 tcpdump 所使用的区块数量。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "报告 tcpdump 所使用的区块大小 (以 MByte 显示)。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "解析 IP 地址" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "使用反向 DNS (PTR) 查找来解析报告 IP 地址。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "重启" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "结果" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "运行目录" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "运行标记" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "运行接口" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "运行工具" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "保存" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "第二个实例" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "发送 AdBlock 相关的通知邮件。请留意:此功能需要安装 \"msmtp\"。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "AdBlock 通知邮件的发送地址。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "设置一个新的广告拦截作业" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "设置 adblock 所用的 dns 后端实例。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "设置" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "来源(大小,焦点)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "tcpdump使用的端口列表,用空格分隔端口。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "开始时间戳" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "启动触发接口" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "状态 / 版本" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "暂停" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "DNS 相关报告文件的目标目录。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "拦截列表备份的目标目录。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "生成拦截列表“adb_list.overall”的目标目录。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "生成拦截列表“adb_list.overall”的目标目录。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "无法更新刷新计时器。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "刷新计时器已更新。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "星期几(可选。取值范围:0-6,可用 , 或 - 分隔)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "小时(必须。取值范围:0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "分钟(可选。取值范围:0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "系统日志输出,仅针对 adblock 相关的消息进行了预筛选。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "第三个实例" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"这是始终拒绝某些(子)域的本地adblock黑名单。
    请注意:每行仅添加一个域。" +"允许以“#”开头的注释-不允许使用IP地址,通配符和正则表达式。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"这是本地adblock白名单,始终允许某些(子)域。
    请注意:每行仅添加一个域。" +"允许以“#”开头的注释-不允许使用IP地址,通配符和正则表达式。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "此选项卡显示上次生成的 DNS 报告,按“刷新”按钮获取当前报告。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "时间" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "等待成功的DNS后端重新启动的超时。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "为了使您的广告过滤列表保持最新,您应该为这些列表设置一个自动更新任务。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "热门统计" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "广告拦截通知邮件的主题。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "DNS 请求总数" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "触发延时" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "无法保存更改:%s" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "变种" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "详细的调试记录" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "白名单更改已保存。刷新您的广告拦截列表以使更改生效。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "白名单..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "捆 (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "Dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "抑制 (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "最大结果集大小" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "max. top statistics" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "原始(/ tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "未绑定 (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/po/zh_Hant/adblock.po b/package/luci/applications/luci-app-adblock/po/zh_Hant/adblock.po new file mode 100644 index 0000000000..b9a966af4e --- /dev/null +++ b/package/luci/applications/luci-app-adblock/po/zh_Hant/adblock.po @@ -0,0 +1,829 @@ +# liushuyu , 2017. +# Yangfl , 2017-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2023-04-16 06:28+0000\n" +"Last-Translator: Hulen \n" +"Language-Team: Chinese (Traditional) \n" +"Language: zh_Hant\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.17-dev\n" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:272 +msgid "Action" +msgstr "動作" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:233 +msgid "Active Sources" +msgstr "使用中的來源" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:3 +msgid "Adblock" +msgstr "廣告攔截" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:40 +msgid "Adblock action" +msgstr "Adblock 動作" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 +msgid "Add Blacklist Domain" +msgstr "加入黑名單域名" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 +msgid "Add Whitelist Domain" +msgstr "加入白名單域名" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 +msgid "Add this (sub-)domain to your local blacklist." +msgstr "加入該(子)域名到您的本地黑名單。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:47 +msgid "Add this (sub-)domain to your local whitelist." +msgstr "加入該(子)域名到您的本地白名單。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "Additional Jail Blocklist" +msgstr "附加 Jail 封鎖清單" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:300 +msgid "Additional Settings" +msgstr "附加設定" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Additional trigger delay in seconds before adblock processing begins." +msgstr "附加觸發 Adblock 行程延遲開始的秒數。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:301 +msgid "Advanced DNS Settings" +msgstr "進階 DNS 設定" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:303 +msgid "Advanced E-Mail Settings" +msgstr "進階電子郵件設定" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:302 +msgid "Advanced Report Settings" +msgstr "進階報告設定" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "Allow Local Client IPs" +msgstr "允許本地用戶端 IP" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:464 +msgid "" +"Allow all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"基於特定 DNS 用戶端的 IP 位址允許這些用戶端的所有請求 (RPZ-CLIENT-IP)。請注" +"意:目前只有 bind DNS 後端支援此功能。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:271 +msgid "Answer" +msgstr "回答" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Backup Directory" +msgstr "備份目錄" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "Base Temp Directory" +msgstr "基本臨時目錄" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:385 +msgid "" +"Base Temp Directory for all adblock related runtime operations, e.g. " +"downloading, sorting, merging etc." +msgstr "" +"執行期間所有與 Adblock 操作(例如下載、排序、合併等)相關的基本臨時目錄。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 +msgid "" +"Blacklist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "黑名單變更已儲存;請重新整理您的 Adblock 清單來使變更生效。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:296 +msgid "Blacklist..." +msgstr "黑名單…" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "Block Local Client IPs" +msgstr "封鎖本地用戶端 IP" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:458 +msgid "" +"Block all requests of certain DNS clients based on their IP address (RPZ-" +"CLIENT-IP). Please note: This feature is currently only supported by bind " +"DNS backend." +msgstr "" +"基於特定 DNS 用戶端的 IP 位址封鎖它們的所有請求 (RPZ-CLIENT-IP)。請注意:目前" +"只有 bind DNS 後端支援此功能。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:327 +msgid "Blocked DNS Requests" +msgstr "封鎖的 DNS 請求" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:225 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:229 +msgid "Blocked Domains" +msgstr "封鎖的域名" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "Blocklist Backup" +msgstr "黑名單備份" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:81 +msgid "Blocklist Query" +msgstr "封鎖清單查詢" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:336 +msgid "Blocklist Query..." +msgstr "黑名單查詢…" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:304 +msgid "Blocklist Sources" +msgstr "封鎖清單來源" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:470 +msgid "" +"Builds an additional DNS blocklist to block access to all domains except " +"those listed in the whitelist. Please note: You can use this restrictive " +"blocklist e.g. for guest wifi or kidsafe configurations." +msgstr "" +"建立附加的 Jail 封鎖清單,以封鎖使用者存取除「此名單包含域名」之外的所有網" +"域;請注意:您可以在訪客 Wi-Fi 抑或兒童安全組態中使用此限制性封鎖清單。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:109 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:176 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:72 +msgid "Cancel" +msgstr "取消" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:573 +msgid "Categories" +msgstr "類別" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:269 +msgid "Client" +msgstr "用戶端" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:221 +msgid "Clients" +msgstr "用戶端" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:136 +msgid "" +"Configuration of the adblock package to block ad/abuse domains by using DNS. " +"For further information check the online documentation" +msgstr "" +"您可以在這裡設定 Adblock(廣告封鎖)套件的組態,以透過 DNS 封鎖廣告/濫用網" +"域;請參閱線上文" +"件 以獲得更多資訊" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:220 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:222 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:224 +msgid "Count" +msgstr "計數" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:390 +msgid "" +"Create compressed blocklist backups, they will be used in case of download " +"errors or during startup." +msgstr "建立壓縮的封鎖清單備份;它們將在下載錯誤時或啟動期間被使用。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:237 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "DNS Backend" +msgstr "DNS 後端" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "DNS Directory" +msgstr "DNS 目錄" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "DNS Instance" +msgstr "DNS 實例" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:27 +msgid "DNS Report" +msgstr "DNS 報告" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "DNS Restart Timeout" +msgstr "DNS 重新啟動逾時值" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:267 +msgid "Date" +msgstr "日期" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable DNS Allow" +msgstr "停用 DNS 解析修改" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:455 +msgid "Disable selective DNS whitelisting (RPZ-PASSTHRU)." +msgstr "停用選擇性 DNS 白名單 (RPZ-PASSTHRU)。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:270 +msgid "Domain" +msgstr "網域名稱" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:223 +msgid "Domains" +msgstr "網域" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Don't check SSL server certificates during download." +msgstr "下載期間不檢查 SSL 伺服器證書。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:407 +msgid "Download Insecure" +msgstr "下載不安全" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "Download Parameters" +msgstr "下載參數" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "Download Utility" +msgstr "下載工具" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "E-Mail Notification" +msgstr "電子郵件通知" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "E-Mail Notification Count" +msgstr "電郵通知數量" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "E-Mail Profile" +msgstr "電郵設定檔" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "E-Mail Receiver Address" +msgstr "電郵收件人位址" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "E-Mail Sender Address" +msgstr "電郵寄件人位址" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "E-Mail Topic" +msgstr "電郵主旨" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:35 +msgid "Edit Blacklist" +msgstr "編輯黑名單" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:43 +msgid "Edit Whitelist" +msgstr "編輯白名單" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "" +"Empty the DNS cache before adblock processing starts to reduce the memory " +"consumption." +msgstr "在 adblock 處理開始降低記憶體消耗前清空 DNS 快取。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "Enable SafeSearch" +msgstr "啟用安全搜尋" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Enable moderate SafeSearch filters for youtube." +msgstr "啟用為 YouTube 設定的中度安全搜尋篩選器。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enable the adblock service." +msgstr "啟用 Adblock 服務。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Enable verbose debug logging in case of any processing errors." +msgstr "在出現任何處理錯誤的情況下,請啟用詳細除錯日誌記錄。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:309 +msgid "Enabled" +msgstr "啟用" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:319 +msgid "End Timestamp" +msgstr "結束時間戳" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:339 +msgid "" +"Enforcing SafeSearch for google, bing, duckduckgo, yandex, youtube and " +"pixabay." +msgstr "" +"正在強制執行 Google, Bing, DuckDuckGo, Yandex, YouTube, Pixabay 的安全搜尋" +"中。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:18 +msgid "Existing job(s)" +msgstr "現存工作" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "External DNS Lookup Domain" +msgstr "供 DNS 查詢的外部域名" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:447 +msgid "" +"External domain to check for a successful DNS backend restart. Please note: " +"To disable this check set this option to 'false'." +msgstr "" +"使用外部網域來檢查「DNS 後端」是否成功重新啟動;請注意:要停用此檢查,請輸入 " +"\"false\"。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:437 +msgid "Fifth instance" +msgstr "第五個實例" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:170 +msgid "Filter criteria like date, domain or client (optional)" +msgstr "篩選器準則(例如:日期、域名或客戶端,可選)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Firewall ports that should be forced locally." +msgstr "本地應被強制重新導向的防火牆通訊埠號。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Firewall source zones that should be forced locally." +msgstr "本地應被強制重新導向的防火牆來源區域。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:433 +msgid "First instance (default)" +msgstr "第一個實例 (預設)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:452 +msgid "Flush DNS Cache" +msgstr "清除 DNS 快取" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "Force Local DNS" +msgstr "強制本地 DNS" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:328 +msgid "Forced Ports" +msgstr "強制埠號" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:321 +msgid "Forced Zones" +msgstr "強制區域" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:436 +msgid "Fourth instance" +msgstr "第四個實例" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:356 +msgid "" +"Gather DNS related network traffic via tcpdump and provide a DNS Report on " +"demand. Please note: this needs additional 'tcpdump' or 'tcpdump-mini' " +"package installation and a full adblock service restart to take effect." +msgstr "" +"透過 tcpdump 收集與 DNS 相關的網路流量,並隨需提供 DNS 報告;請注意:這需要安" +"裝 \"tcpdump-mini\" 附加套件,且在完全重新啟動 Adblock 服務後才能生效。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:299 +msgid "General Settings" +msgstr "一般設定" + +#: applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json:3 +msgid "Grant access to LuCI app adblock" +msgstr "授予 luci-app-adblock 擁有 UCI 存取的權限" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:223 +msgid "Information" +msgstr "資訊" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Jail Directory" +msgstr "Jail 檔案目錄" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:257 +msgid "Last Run" +msgstr "最後執行" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:355 +msgid "Latest DNS Requests" +msgstr "最新 DNS 請求" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch" +msgstr "限制性安全搜尋" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:342 +msgid "Limit SafeSearch to certain providers." +msgstr "啟用限制性安全搜尋,以限制給定搜尋引擎的搜尋範圍。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:65 +msgid "Line number to remove" +msgstr "要移除的行號" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "List of available network devices used by tcpdump." +msgstr "用於 tcpdump 的可用網路裝置清單。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "" +"List of available network interfaces to trigger the adblock start. Choose " +"'unspecified' to use a classic startup timeout instead of a network trigger." +msgstr "" +"用來觸發 Adblock 啟動的可用網路介面清單;選擇「未指定」則使用傳統的啟動逾時," +"而不透過網路觸發。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:418 +msgid "" +"List of supported DNS backends with their default list directory. To " +"overwrite the default path use the 'DNS Directory' option." +msgstr "" +"支援的 DNS 後端清單及其預設清單目錄;要重寫預設路徑,請使用「DNS 目錄」選項。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:399 +msgid "List of supported and fully pre-configured download utilities." +msgstr "支援的下載工具清單(完全預先配置)。" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:51 +msgid "Log View" +msgstr "日誌檢視" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "Low Priority Service" +msgstr "低優先權服務" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:411 +msgid "" +"Manually override the pre-configured download options for the selected " +"download utility." +msgstr "手動覆蓋所選下載工具的預先設定下載選項。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:124 +msgid "No Query results!" +msgstr "查詢結果為空!" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:21 +msgid "No adblock related logs yet!" +msgstr "尚無與 Adblock 相關的日誌!" + +#: applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json:19 +msgid "Overview" +msgstr "概覽" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:523 +msgid "Profile used by 'msmtp' for adblock notification E-Mails." +msgstr "\"msmtp\" 使用的設定檔,用於 Adblock 寄送通知電子郵件。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:132 +msgid "Query" +msgstr "查詢" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:82 +msgid "Query active blocklists and backups for a specific domain." +msgstr "查詢「特定網域」的活躍封鎖清單和備份。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:527 +msgid "" +"Raise the notification count, to get E-Mails if the overall blocklist count " +"is less or equal to the given limit." +msgstr "" +"提高通知數量;除非整體「封鎖清單數」小於或等於給定的限制,否則將不再取得電子" +"郵件。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:364 +msgid "Receiver address for adblock notification e-mails." +msgstr "Adblock 通知電子郵件的收件人位址。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:318 +msgid "" +"Redirect all DNS queries from specified zones to the local DNS resolver, " +"applies to UDP and TCP protocol." +msgstr "" +"重新導向指定區域的所有「DNS 查詢」到本地 DNS 解析器(適用於 UDP 與 TCP 協" +"定)。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:375 +msgid "" +"Reduce the priority of the adblock background processing to take fewer " +"resources from the system. Please note: This change requires a full adblock " +"service restart to take effect." +msgstr "" +"降低 Adblock 後台行程的優先權以耗費更少的系統資源;請注意:此變更需要您完全重" +"新啟動 Adblock 服務後才能生效。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:198 +msgid "Refresh" +msgstr "重新整理" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:139 +msgid "Refresh DNS Report" +msgstr "重新整理 DNS 報告" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:15 +msgid "Refresh Timer" +msgstr "定時重整" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:266 +msgid "Refresh Timer..." +msgstr "定時重整中..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:343 +msgid "Refresh..." +msgstr "重新整理…" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:352 +msgid "Relax SafeSearch" +msgstr "放寬安全搜尋" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:281 +msgid "Reload" +msgstr "重新載入" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:61 +msgid "Remove an existing job" +msgstr "移除一個現存工作" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report Chunk Count" +msgstr "報告區塊數量" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report Chunk Size" +msgstr "報告區塊大小" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Report Directory" +msgstr "報告目錄" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:486 +msgid "Report Interface" +msgstr "報告介面" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Report Ports" +msgstr "報告埠號" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:495 +msgid "Report chunk count used by tcpdump." +msgstr "報告 tcpdump 使用的區塊數量。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:500 +msgid "Report chunk size used by tcpdump in MByte." +msgstr "報告 tcpdump 使用的區塊大小(單位:MB)。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve IPs" +msgstr "解析多個 IP 位址" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:509 +msgid "Resolve reporting IP addresses by using reverse DNS (PTR) lookups." +msgstr "使用 DNS (PTR) 反向尋找解析報告中的 IP 位址。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:288 +msgid "Restart" +msgstr "重新啟動" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:96 +msgid "Result" +msgstr "結果" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:249 +msgid "Run Directories" +msgstr "執行目錄" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:253 +msgid "Run Flags" +msgstr "執行旗標" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:245 +msgid "Run Interfaces" +msgstr "執行介面" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:241 +msgid "Run Utils" +msgstr "執行工具" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:39 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:74 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:106 +msgid "Save" +msgstr "儲存" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:434 +msgid "Second instance" +msgstr "第二個實例" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:360 +msgid "" +"Send adblock related notification e-mails. Please note: this needs " +"additional 'msmtp' package installation." +msgstr "" +"寄送與 Adblock 相關的通知電子郵件;請注意:這需要安裝 \"msmtp\" 附加套件。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:515 +msgid "Sender address for adblock notification E-Mails." +msgstr "Adblock 通知電子郵件的寄件人位址。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:29 +msgid "Set a new adblock job" +msgstr "設定一個新的廣告攔截工作" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:432 +msgid "Set the dns backend instance used by adblock." +msgstr "設定 adblock 所用的 dns 後端實例。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:297 +msgid "Settings" +msgstr "設置" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:549 +msgid "Sources (Size, Focus)" +msgstr "來源(大小、聚焦的類別)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:505 +msgid "Space separated list of ports used by tcpdump." +msgstr "tcpdump 使用的通訊埠號(以空格分隔)。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:315 +msgid "Start Timestamp" +msgstr "啟動時間戳" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:312 +msgid "Startup Trigger Interface" +msgstr "啟動觸發介面" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:225 +msgid "Status / Version" +msgstr "狀態/版本" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:274 +msgid "Suspend" +msgstr "暫停" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:491 +msgid "Target directory for DNS related report files." +msgstr "DNS 相關報告檔案的目標目錄。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:394 +msgid "Target directory for blocklist backups." +msgstr "攔截清單備份的目標目錄。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:428 +msgid "Target directory for the generated blocklist 'adb_list.overall'." +msgstr "產生封鎖清單 \"adb_list.overall\" 的目標目錄。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:474 +msgid "Target directory for the generated jail blocklist 'adb_list.jail'." +msgstr "產生 Jail 封鎖清單 \"adb_list.jail\" 的目標目錄。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:86 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:95 +msgid "The Refresh Timer could not been updated." +msgstr "無法更新重整計時器。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:88 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:97 +msgid "The Refresh Timer has been updated." +msgstr "重整計時器已更新。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:56 +msgid "The day of the week (opt., values: 0-6 possibly sep. by , or -)" +msgstr "星期幾 (可選。取值範圍:0-6,可用 , 或 - 分隔)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:46 +msgid "The hours portition (req., range: 0-23)" +msgstr "小時 (必須。取值範圍:0-23)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:51 +msgid "The minutes portion (opt., range: 0-59)" +msgstr "分鐘 (可選。取值範圍:0-59)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js:28 +msgid "The syslog output, pre-filtered for adblock related messages only." +msgstr "系統日誌輸出(預先篩選出只與 Adblock 相關的訊息)。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:435 +msgid "Third instance" +msgstr "第三個實例" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:23 +msgid "" +"This is the local adblock blacklist to always-deny certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"這是永遠拒絕存取給定(子)網域的本地 Adblock 黑名單;
    請注意:每行只能加" +"入一個域名,允許使用 \"#\" 來引入註解,但不允許使用 IP 位址、萬用字元和正規表" +"示式。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:23 +msgid "" +"This is the local adblock whitelist to always allow certain (sub) domains." +"
    Please note: add only one domain per line. Comments introduced with " +"'#' are allowed - ip addresses, wildcards and regex are not." +msgstr "" +"這是永遠拒絕存取給定(子)網域的本地 Adblock 白名單;
    請注意:每行只能加" +"入一個域名,允許使用 \"#\" 來引入註解,但不允許使用 IP 位址、萬用字元和正規表" +"示式。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:312 +msgid "" +"This tab shows the last generated DNS Report, press the 'Refresh' button to " +"get a current one." +msgstr "此頁籤顯示上次產生的 DNS 報告,按「更新」按鈕取得目前報告。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:268 +msgid "Time" +msgstr "時間" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:442 +msgid "Timeout to wait for a successful DNS backend restart." +msgstr "等待 DNS 後端成功重新啟動的逾時值。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:16 +msgid "" +"To keep your adblock lists up-to-date, you should set up an automatic update " +"job for these lists." +msgstr "要保持最新的 Adblock 清單,您應該設定這些清單的自動更新工作。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:348 +msgid "Top Statistics" +msgstr "熱門統計" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:519 +msgid "Topic for adblock notification E-Mails." +msgstr "Adblock 通知電子郵件的主旨。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:323 +msgid "Total DNS Requests" +msgstr "DNS 請求總數" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:380 +msgid "Trigger Delay" +msgstr "觸發延遲" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:17 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:17 +msgid "Unable to save changes: %s" +msgstr "無法儲存變更(訊息:%s)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:588 +msgid "Variants" +msgstr "變體" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:372 +msgid "Verbose Debug Logging" +msgstr "詳細除錯日誌" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:69 +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/whitelist.js:15 +msgid "" +"Whitelist changes have been saved. Refresh your adblock lists that changes " +"take effect." +msgstr "白名單變更已儲存;請重新整理您的 Adblock 清單來使變更生效。" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:288 +msgid "Whitelist..." +msgstr "白名單..." + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:422 +msgid "bind (/var/lib/bind)" +msgstr "綁定 (/var/lib/bind)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:420 +msgid "dnsmasq (/tmp/dnsmasq.d)" +msgstr "Dnsmasq (/tmp/dnsmasq.d)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:423 +msgid "kresd (/etc/kresd)" +msgstr "抑制 (/etc/kresd)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:163 +msgid "max. result set size" +msgstr "最大結果集大小" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:150 +msgid "max. top statistics" +msgstr "最大熱門統計" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:424 +msgid "raw (/tmp)" +msgstr "原始 (/tmp)" + +#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:421 +msgid "unbound (/var/lib/unbound)" +msgstr "Unbound (/var/lib/unbound)" diff --git a/package/luci/applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json b/package/luci/applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json new file mode 100644 index 0000000000..9f2659c1da --- /dev/null +++ b/package/luci/applications/luci-app-adblock/root/usr/share/luci/menu.d/luci-app-adblock.json @@ -0,0 +1,58 @@ +{ + "admin/services/adblock": { + "title": "Adblock", + "order": "60", + "action": { + "type": "alias", + "path": "admin/services/adblock/overview" + }, + "depends": { + "acl": [ "luci-app-adblock" ], + "fs": { + "/usr/bin/adblock.sh": "executable", + "/etc/init.d/adblock": "executable" + }, + "uci": { "adblock": true } + } + }, + "admin/services/adblock/overview": { + "title": "Overview", + "order": 10, + "action": { + "type": "view", + "path": "adblock/overview" + } + }, + "admin/services/adblock/dnsreport": { + "title": "DNS Report", + "order": 20, + "action": { + "type": "view", + "path": "adblock/dnsreport" + } + }, + "admin/services/adblock/blacklist": { + "title": "Edit Blacklist", + "order": 30, + "action": { + "type": "view", + "path": "adblock/blacklist" + } + }, + "admin/services/adblock/whitelist": { + "title": "Edit Whitelist", + "order": 40, + "action": { + "type": "view", + "path": "adblock/whitelist" + } + }, + "admin/services/adblock/logread": { + "title": "Log View", + "order": 50, + "action": { + "type": "view", + "path": "adblock/logread" + } + } +} diff --git a/package/luci/applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json b/package/luci/applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json new file mode 100644 index 0000000000..61b6f3b57d --- /dev/null +++ b/package/luci/applications/luci-app-adblock/root/usr/share/rpcd/acl.d/luci-app-adblock.json @@ -0,0 +1,34 @@ +{ + "luci-app-adblock": { + "description": "Grant access to LuCI app adblock", + "write": { + "uci": ["adblock"], + "file": { + "/etc/adblock/*": ["read"], + "/etc/adblock/adblock.blacklist": ["write"], + "/etc/adblock/adblock.whitelist": ["write"] + } + }, + "read": { + "cgi-io": [ "exec" ], + "file": { + "/var/run/adblock.pid": ["read"], + "/tmp/adb_runtime.json": ["read"], + "/etc/crontabs/root": ["read"], + "/sbin/logread -e adblock-": [ "exec" ], + "/usr/sbin/logread -e adblock-": [ "exec" ], + "/etc/init.d/adblock list" : [ "exec" ], + "/etc/init.d/adblock reload" : [ "exec" ], + "/etc/init.d/adblock restart" : [ "exec" ], + "/etc/init.d/adblock suspend" : [ "exec" ], + "/etc/init.d/adblock resume" : [ "exec" ], + "/etc/init.d/adblock report [a-z]* [0-9]* [0-9]* *" : [ "exec" ], + "/etc/init.d/adblock timer list" : [ "exec" ], + "/etc/init.d/adblock timer remove [0-9]*" : [ "exec" ], + "/etc/init.d/adblock timer add * [0-9]* [0-9*]* [0-6,-*]*" : [ "exec" ], + "/etc/init.d/adblock query *" : [ "exec" ] + }, + "uci": ["adblock"] + } + } +} diff --git a/package/luci/applications/luci-app-aria2/Makefile b/package/luci/applications/luci-app-aria2/Makefile new file mode 100644 index 0000000000..ad6bd1d184 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/Makefile @@ -0,0 +1,18 @@ +# +# Copyright (C) 2017-2019 Xingwang Liao +# +# This is free software, licensed under the MIT License. +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI Support for Aria2 +LUCI_DEPENDS:=+aria2 +LUCI_PKGARCH:=all + +PKG_MAINTAINER:=Xingwang Liao +PKG_LICENSE:=MIT + +include ../../luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js b/package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js new file mode 100644 index 0000000000..84b5075fd7 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js @@ -0,0 +1,630 @@ +'use strict'; +'require dom'; +'require form'; +'require fs'; +'require poll'; +'require rpc'; +'require tools.widgets as widgets'; +'require ui'; +'require view'; + +var callServiceList, CBIAria2Status, CBIRpcSecret, CBIRpcUrl; + +callServiceList = rpc.declare({ + object: 'service', + method: 'list', + params: [ 'name' ], + expect: { '': {} }, + filter: function (data, args, extra) { + var i, res = data[args.name] || {}; + for (i = 0; (i < extra.length) && (Object.keys(res).length > 0); ++i) + res = res[extra[i]] || {}; + return res; + } +}); + +CBIAria2Status = form.DummyValue.extend({ + renderWidget: function() { + var extra = ['instances', 'aria2.main']; + var node = E('div', {}, E('p', {}, E('em', {}, _('Collecting data...')))); + poll.add(function() { + return Promise.all([ + callServiceList('aria2', extra) + .then(function(res) { + return E('p', {}, E('em', {}, res.running + ? _('The Aria2 service is running.') + : _('The Aria2 service is not running.')) + ); + }), + getWebFrontInstalled() + .then(function(installed) { + var btns = [E('label'), _('Installed web interface: ')]; + for (var i in installed) { + btns.push(E('button', { + 'class': 'btn cbi-button', + 'click': openWebInterface.bind(this, i) + }, installed[i])); + } + return btns.length > 0 ? E('p', btns) : null; + }) + ]).then(function(res) { + res = res.filter(function(r) { return r ? 1 : 0 }); + dom.content(node, res); + }); + }); + return node; + } +}); + +CBIRpcSecret = form.Value.extend({ + renderWidget: function(section_id, option_index, cfgvalue) { + var node = this.super('renderWidget', [section_id, option_index, cfgvalue]); + dom.append(node, [ + E('br'), + E('span', { 'class': 'control-group' }, + E('button', { + 'class': 'btn cbi-button cbi-button-neutral', + 'click': this.clickFn.bind(this, section_id) + }, this.btnTitle) + ) + ]); + return node; + } +}); + +CBIRpcUrl = form.DummyValue.extend({ + renderWidget: function(section_id, option_index, cfgvalue) { + var inputEl = new ui.Textfield('', {'id': this.cbid(section_id), 'readonly': true}); + return E([inputEl.render(), + E('br'), + E('span', { 'class': 'control-group' }, [ + E('button', { + 'class': 'btn cbi-button cbi-button-neutral', + 'click': this.clickFn.bind(this, section_id, 0, inputEl) + }, 'HTTP(s)'), + E('button', { + 'class': 'btn cbi-button cbi-button-neutral', + 'click': this.clickFn.bind(this, section_id, 1, inputEl) + }, 'WebSocket(s)') + ]) + ]); + } +}); + +function getToken(section_id) { + var len = 32, randomStr = ''; + var inputLength = prompt(_('Please input token length:'), len); + if (inputLength === null || inputLength === '') { + return; + } else if (/^\d+$/.test(inputLength)) { + len = parseInt(inputLength); + } + + while(len - randomStr.length > 0) { + randomStr += Math.random().toString(36).substring(2, 2 + len - randomStr.length); + } + document.getElementById('widget.' + this.cbid(section_id)).value = randomStr; +}; + +function getWebFrontInstalled() { + var supported = {'ariang': 'AriaNg', 'webui-aria2': 'WebUI-Aria2', 'yaaw': 'YAAW'}; + var actions = []; + + for (var s in supported) { + actions.push(fs.stat('/www/' + s + '/index.html') + .then(L.bind(function(s) { return s; }, this, s)) + .catch(function(err) { return null; })); + } + + return Promise.all(actions).then(function(res) { + var installed = {}; + for (var i = 0; i < res.length; ++i) + if (res[i]) + installed[res[i]] = supported[res[i]]; + return installed; + }); +} + +function openWebInterface(path) { + var host = window.location.host; + var protocol = window.location.protocol; + window.open(protocol + '//' + host + '/' + path); +}; + +function showRPCURL(section_id, useWS, inputEl) { + var getOptVal = L.bind(function(opt, default_val) { + default_val = default_val || null; + return this.section.formvalue(section_id, opt) || default_val; + }, this); + + var port = getOptVal('rpc_listen_port', 6800); + var authMethod = getOptVal('rpc_auth_method', 'none'); + var secure = JSON.parse(getOptVal('rpc_secure', false)); + + var protocol = useWS + ? (secure ? 'wss' : 'ws') + : (secure ? 'https' : 'http'); + var url = protocol + '://'; + + if (authMethod == 'token') { + var authToken = getOptVal('rpc_secret'); + if (authToken) + url += 'token:' + authToken + '@'; + } else if (authMethod == 'user_pass') { + var authUser = getOptVal('rpc_user'); + var authPasswd = getOptVal('rpc_passwd'); + if (authUser && authPasswd) + url += authUser + ':' + authPasswd + '@'; + } + url += window.location.hostname + ':' + port + '/jsonrpc'; + inputEl.setValue(url); +}; + +return view.extend({ + load: function() { + return fs.exec_direct('/usr/bin/aria2c', [ '-v' ]).then(function(res) { + var info = {}, lines = res.split(/\r?\n|\r/g); + + for (var i = 0; i < lines.length; ++i) { + if (/^aria2 version/.exec(lines[i])) { + info.version = lines[i].match(/(\d+\.){2}\d+/)[0]; + } + else if (/^Enabled Features/.exec(lines[i])) { + info.gzip = lines[i].search(/GZip/) >= 0; + info.https = lines[i].search(/HTTPS/) >= 0; + info.bt = lines[i].search(/BitTorrent/) >= 0; + info.sftp = lines[i].search(/SFTP/) >= 0; + info.adns = lines[i].search(/Async DNS/) >= 0; + info.cookie = lines[i].search(/Firefox3 Cookie/) >= 0; + } + } + return info; + }); + }, + + render: function(aria2) { + var m, s, o; + + m = new form.Map('aria2', '%s - %s'.format(_('Aria2'), _('Settings')), '

    %s

    %s

    '.format( + _('Aria2 is a lightweight multi-protocol & multi-source, cross platform download utility.'), + _('For more information, please visit: %s.') + .format('https://aria2.github.io'))); + + s = m.section(form.TypedSection); + s.title = '%s - %s'.format(_('Aria2'), _('Running Status')); + s.anonymous = true; + s.cfgsections = function() { return [ 'status' ] }; + + o = s.option(CBIAria2Status); + + s = m.section(form.NamedSection, 'main', 'aria2'); + s.addremove = false; + s.anonymous = true; + + s.tab('basic', _('Basic Options')); + + o = s.taboption('basic', form.Flag, 'enabled', _('Enabled')); + o.rmempty = false; + + o = s.taboption('basic', widgets.UserSelect, 'user', _('Run daemon as user'), + _('Leave blank to use default user.')); + + o = s.taboption('basic', form.Value, 'dir', _('Download directory'), + _('The directory to store the downloaded file. For example /mnt/sda1.')); + o.rmempty = false; + + o = s.taboption('basic', form.Value, 'config_dir', _('Config file directory'), + _('The directory to store the config file, session file and DHT file.')); + o.placeholder = '/var/etc/aria2'; + + o = s.taboption('basic', form.Flag, 'enable_logging', _('Enable logging')); + o.rmempty = false; + + o = s.taboption('basic', form.Value, 'log', _('Log file'), + _('The file name of the log file.')); + o.depends('enable_logging', '1'); + o.placeholder = '/var/log/aria2.log'; + + o = s.taboption('basic', form.ListValue, 'log_level', _('Log level')); + o.depends('enable_logging', '1'); + o.value('debug', _('Debug')); + o.value('info', _('Info')); + o.value('notice', _('Notice')); + o.value('warn', _('Warn')); + o.value('error', _('Error')); + o.default = 'warn'; + + o = s.taboption('basic', form.Value, 'max_concurrent_downloads', _('Max concurrent downloads')); + o.placeholder = '5'; + + s.tab('rpc', _('RPC Options')) + + o = s.taboption('rpc', form.Flag, 'pause', _('Pause'), _('Pause download after added.')); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'false'; + + o = s.taboption('rpc', form.Flag, 'pause_metadata', _('Pause metadata'), + _('Pause downloads created as a result of metadata download.')); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'false'; + + o = s.taboption('rpc', form.Value, 'rpc_listen_port', _('RPC port')); + o.datatype = 'range(1024,65535)'; + o.placeholder = '6800'; + + o = s.taboption('rpc', form.ListValue, 'rpc_auth_method', _('RPC authentication method')); + o.value('none', _('No Authentication')); + o.value('user_pass', _('Username & Password')); + o.value('token', _('Token')); + + o = s.taboption('rpc', form.Value, 'rpc_user', _('RPC username')); + o.depends('rpc_auth_method', 'user_pass'); + + o = s.taboption('rpc', form.Value, 'rpc_passwd', _('RPC password')); + o.depends('rpc_auth_method', 'user_pass'); + o.password = true; + + o = s.taboption('rpc', CBIRpcSecret, 'rpc_secret', _('RPC token')); + o.depends('rpc_auth_method', 'token'); + o.btnTitle = _('Generate Randomly'); + o.clickFn = getToken; + o.password = true; + + if (aria2.https) { + o = s.taboption('rpc', form.Flag, 'rpc_secure', _('RPC secure'), + _('RPC transport will be encrypted by SSL/TLS. The RPC clients must use https' + + ' scheme to access the server. For WebSocket client, use wss scheme.')); + o.enabled = 'true'; + o.disabled = 'false'; + o.rmempty = false; + + o = s.taboption('rpc', form.Value, 'rpc_certificate', _('RPC certificate'), + _('Use the certificate in FILE for RPC server. The certificate must be either' + + ' in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the' + + ' certificate, a key and optionally a chain of additional certificates. Only PKCS12' + + ' files with a blank import password can be opened!
    When using PEM, you have to' + + ' specify the "RPC private key" as well.')); + o.depends('rpc_secure', 'true'); + o.optional = false; + o.rmempty = false; + + o = s.taboption('rpc', form.Value, 'rpc_private_key', _('RPC private key'), + _('Use the private key in FILE for RPC server. The private key must be' + + ' decrypted and in PEM format.')); + o.depends('rpc_secure', 'true'); + o.optional = false; + o.rmempty = false; + } + + o = s.taboption('rpc', CBIRpcUrl, '_rpc_url', _('Json-RPC URL')); + o.clickFn = showRPCURL; + + s.tab('http', _('HTTP/FTP/SFTP Options')); + + o = s.taboption('http', form.Flag, 'enable_proxy', _('Enable proxy')); + o.rmempty = false; + + o = s.taboption('http', form.Value, 'all_proxy', _('All proxy'), + _('Use a proxy server for all protocols.')); + o.depends('enable_proxy', '1'); + o.placeholder = '[http://][USER:PASSWORD@]HOST[:PORT]'; + + o = s.taboption('http', form.Value, 'all_proxy_user', _('Proxy user')); + o.depends('enable_proxy', '1'); + + o = s.taboption('http', form.Value, 'all_proxy_passwd', _('Proxy password')); + o.depends('enable_proxy', '1'); + o.password = true; + + if (aria2.https) { + o = s.taboption('http', form.Flag, 'check_certificate', _('Check certificate'), + _('Verify the peer using certificates specified in "CA certificate" option.')); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'true'; + o.rmempty = false; + + o = s.taboption('http', form.Value, 'ca_certificate', _('CA certificate'), + _('Use the certificate authorities in FILE to verify the peers. The certificate' + + ' file must be in PEM format and can contain multiple CA certificates.')); + o.depends('check_certificate', 'true'); + + o = s.taboption('http', form.Value, 'certificate', _('Certificate'), + _('Use the client certificate in FILE. The certificate must be either in PKCS12' + + ' (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the certificate, a' + + ' key and optionally a chain of additional certificates. Only PKCS12 files with a' + + ' blank import password can be opened!
    When using PEM, you have to specify the' + + ' "Private key" as well.')); + + o = s.taboption('http', form.Value, 'private_key', _('Private key'), + _('Use the private key in FILE. The private key must be decrypted and in PEM' + + ' format. The behavior when encrypted one is given is undefined.')); + } + + if (aria2.gzip) { + o = s.taboption('http', form.Flag, 'http_accept_gzip', _('HTTP accept gzip'), + _('Send Accept: deflate, gzip request header and inflate response' + + ' if remote server responds with Content-Encoding: gzip or' + + ' Content-Encoding: deflate.')); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'false'; + } + + o = s.taboption('http', form.Flag, 'http_no_cache', _('HTTP no cache'), + _('Send Cache-Control: no-cache and Pragma: no-cache' + + ' header to avoid cached content. If disabled, these headers are not sent and you' + + ' can add Cache-Control header with a directive you like using "Header" option.')); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'false'; + + o = s.taboption('http', form.DynamicList, 'header', _('Header'), + _('Append HEADERs to HTTP request header.')); + + o = s.taboption('http', form.Value, 'connect_timeout', _('Connect timeout'), + _('Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy server.' + + ' After the connection is established, this option makes no effect and "Timeout" option is used instead.')); + o.datatype = 'uinteger'; + o.placeholder = '60'; + + o = s.taboption('http', form.Value, 'timeout', _('Timeout')); + o.datatype = 'uinteger'; + o.placeholder = '60'; + + o = s.taboption('http', form.Value, 'lowest_speed_limit', _('Lowest speed limit'), + '%s %s'.format( + _('Close connection if download speed is lower than or equal to this value (bytes per sec). ' + + '0 means has no lowest speed limit.'), + _('You can append K or M.') + )); + o.placeholder = '0'; + + o = s.taboption('http', form.Value, 'max_connection_per_server', _('Max connection per server'), + _('The maximum number of connections to one server for each download.')); + o.datatype = 'uinteger'; + o.placeholder = '1'; + + o = s.taboption('http', form.Value, 'split', _('Max number of split'), + _('Download a file using N connections.')); + o.datatype = 'uinteger'; + o.placeholder = '5'; + + o = s.taboption('http', form.Value, 'min_split_size', _('Min split size'), + _('Don\'t split less than 2*SIZE byte range. Possible values: 1M-1024M.')); + o.placeholder = '20M'; + + o = s.taboption('http', form.Value, 'max_tries', _('Max tries')); + o.datatype = 'uinteger'; + o.placeholder = '5'; + + o = s.taboption('http', form.Value, 'retry_wait', _('Retry wait'), + _('Set the seconds to wait between retries.')); + o.datatype = 'uinteger'; + o.placeholder = '0'; + + o = s.taboption('http', form.Value, 'user_agent', _('User agent'), + _('Set user agent for HTTP(S) downloads.')); + o.placeholder = 'aria2/%s'.format(aria2.version ? aria2.version : '$VERSION'); + + if (aria2.bt) { + s.tab('bt', _('BitTorrent Options')); + + o = s.taboption('bt', form.Flag, 'enable_dht', _('IPv4 DHT enabled'), + '%s %s'.format( + _('Enable IPv4 DHT functionality. It also enables UDP tracker support.'), + _('This option will be ignored if a private flag is set in a torrent.') + )); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'true'; + o.rmempty = false; + + o = s.taboption('bt', form.Flag, 'enable_dht6', _('IPv6 DHT enabled'), + '%s %s'.format( + _('Enable IPv6 DHT functionality.'), + _('This option will be ignored if a private flag is set in a torrent.') + )); + o.enabled = 'true'; + o.disabled = 'false'; + + o = s.taboption('bt', form.Flag, 'bt_enable_lpd', _('LPD enabled'), + '%s %s'.format( + _('Enable Local Peer Discovery.'), + _('This option will be ignored if a private flag is set in a torrent.') + )); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'false'; + + o = s.taboption('bt', form.Flag, 'enable_peer_exchange', _('Enable peer exchange'), + '%s %s'.format( + _('Enable Peer Exchange extension.'), + _('This option will be ignored if a private flag is set in a torrent.') + )); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'true'; + o.rmempty = false; + + o = s.taboption('bt', form.Flag, 'bt_save_metadata', _('Save metadata'), + _('Save meta data as ".torrent" file. This option has effect only when BitTorrent' + + ' Magnet URI is used. The file name is hex encoded info hash with suffix ".torrent".')); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'false'; + + o = s.taboption('bt', form.Flag, 'bt_remove_unselected_file', _('Remove unselected file'), + _('Removes the unselected files when download is completed in BitTorrent. Please' + + ' use this option with care because it will actually remove files from your disk.')); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'false'; + + o = s.taboption('bt', form.Flag, 'bt_seed_unverified', _('Seed unverified'), + _('Seed previously downloaded files without verifying piece hashes.')); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'false'; + + o = s.taboption('bt', form.Value, 'listen_port', _('BitTorrent listen port'), + _('Set TCP port number for BitTorrent downloads. Accept format: "6881,6885",' + + ' "6881-6999" and "6881-6889,6999". Make sure that the specified ports are open' + + ' for incoming TCP traffic.')); + o.placeholder = '6881-6999'; + + o = s.taboption('bt', form.Value, 'dht_listen_port', _('DHT Listen port'), + _('Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure that the ' + + 'specified ports are open for incoming UDP traffic.')); + o.depends('enable_dht', 'true'); + o.depends('enable_dht6', 'true'); + o.placeholder = '6881-6999'; + + o = s.taboption('bt', form.ListValue, 'follow_torrent', _('Follow torrent')); + o.value('true', _('True')); + o.value('false', _('False')); + o.value('mem', _('Keep in memory')); + + o = s.taboption('bt', form.Value, 'max_overall_upload_limit', _('Max overall upload limit'), + '%s %s'.format( + _('Set max overall upload speed in bytes/sec. 0 means unrestricted.'), + _('You can append K or M.') + )); + o.placeholder = '0'; + + o = s.taboption('bt', form.Value, 'max_upload_limit', _('Max upload limit'), + '%s %s'.format( + _('Set max upload speed per each torrent in bytes/sec. 0 means unrestricted.'), + _('You can append K or M.') + )); + o.placeholder = '0'; + + o = s.taboption('bt', form.Value, 'bt_max_open_files', _('Max open files'), + _('Specify maximum number of files to open in multi-file BitTorrent download globally.')); + o.datatype = 'uinteger'; + o.placeholder = '100'; + + o = s.taboption('bt', form.Value, 'bt_max_peers', _('Max peers'), + _('Specify the maximum number of peers per torrent, 0 means unlimited.')); + o.datatype = 'uinteger'; + o.placeholder = '55'; + + o = s.taboption('bt', form.Value, 'bt_request_peer_speed_limit', _('Request peer speed limit'), + '%s %s'.format( + _('If the whole download speed of every torrent is lower than SPEED, aria2' + + ' temporarily increases the number of peers to try for more download speed.' + + ' Configuring this option with your preferred download speed can increase your' + + ' download speed in some cases.'), + _('You can append K or M.') + )); + o.placeholder = '50K'; + + o = s.taboption('bt', form.Value, 'bt_stop_timeout', _('Stop timeout'), + _('Stop BitTorrent download if download speed is 0 in consecutive N seconds. If 0 is' + + ' given, this feature is disabled.')); + o.datatype = 'uinteger'; + o.placeholder = '0'; + + o = s.taboption('bt', form.Value, 'peer_id_prefix', _('Prefix of peer ID'), + _('Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length.' + + ' If more than 20 bytes are specified, only first 20 bytes are used. If less than 20' + + ' bytes are specified, random byte data are added to make its length 20 bytes.')); + o.placeholder = 'A2-%s-'.format( + aria2.version ? aria2.version.replace(/\./g, '-') : '$MAJOR-$MINOR-$PATCH' + ); + + o = s.taboption('bt', form.Value, 'seed_ratio', _('Seed ratio'), + _('Specify share ratio. Seed completed torrents until share ratio reaches RATIO.' + + ' You are strongly encouraged to specify equals or more than 1.0 here. Specify 0.0 if' + + ' you intend to do seeding regardless of share ratio.')); + o.datatype = 'ufloat'; + o.placeholder = '1.0'; + + o = s.taboption('bt', form.Value, 'seed_time', _('Seed time'), + _('Specify seeding time in minutes. If "Seed ratio" option is' + + ' specified along with this option, seeding ends when at least one of the conditions' + + ' is satisfied. Specifying 0 disables seeding after download completed.')); + o.datatype = 'ufloat'; + + o = s.taboption('bt', form.DynamicList, 'bt_tracker', _('Additional BT tracker'), + _('List of additional BitTorrent tracker\'s announce URI.')); + o.placeholder = 'http://tracker.example.com/announce'; + } + + s.tab('advance', _('Advanced Options')); + + o = s.taboption('advance', form.Flag, 'disable_ipv6', _('IPv6 disabled'), + _('Disable IPv6. This is useful if you have to use broken DNS and want to avoid terribly' + + ' slow AAAA record lookup.')); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'false'; + + o = s.taboption('advance', form.Value, 'auto_save_interval', _('Auto save interval'), + _('Save a control file (*.aria2) every N seconds. If 0 is given, a control file is not' + + ' saved during download.')); + o.datatype = 'range(0, 600)'; + o.placeholder = '60'; + + o = s.taboption('advance', form.Value, 'save_session_interval', _('Save session interval'), + _('Save error/unfinished downloads to session file every N seconds. If 0 is given, file' + + ' will be saved only when aria2 exits.')); + o.datatype = 'uinteger'; + o.placeholder = '0'; + + o = s.taboption('advance', form.Value, 'disk_cache', _('Disk cache'), + '%s %s'.format( + _('Enable disk cache (in bytes), set 0 to disabled.'), + _('You can append K or M.') + )); + o.placeholder = '16M'; + + o = s.taboption('advance', form.ListValue, 'file_allocation', _('File allocation'), + _('Specify file allocation method. If you are using newer file systems such as ext4' + + ' (with extents support), btrfs, xfs or NTFS (MinGW build only), "falloc" is your best choice.' + + ' It allocates large(few GiB) files almost instantly, but it may not be available if your system' + + ' doesn\'t have posix_fallocate(3) function. Don\'t use "falloc" with legacy file systems such as' + + ' ext3 and FAT32 because it takes almost same time as "prealloc" and it blocks aria2 entirely' + + ' until allocation finishes.')); + o.value('none', _('None')); + o.value('prealloc', _('prealloc')); + o.value('trunc', _('trunc')); + o.value('falloc', _('falloc')); + o.default = 'prealloc'; + + o = s.taboption('advance', form.Flag, 'force_save', _('Force save'), + _('Save download to session file even if the download is completed or removed.' + + ' This option also saves control file in that situations. This may be useful to save' + + ' BitTorrent seeding which is recognized as completed state.')); + o.enabled = 'true'; + o.disabled = 'false'; + o.default = 'false'; + + o = s.taboption('advance', form.Value, 'max_overall_download_limit', _('Max overall download limit'), + '%s %s'.format( + _('Set max overall download speed in bytes/sec. 0 means unrestricted.'), + _('You can append K or M.') + )); + o.placeholder = '0'; + + o = s.taboption('advance', form.Value, 'max_download_limit', _('Max download limit'), + '%s %s'.format( + _('Set max download speed per each download in bytes/sec. 0 means unrestricted.'), + _('You can append K or M.') + )); + o.placeholder = '0'; + + s = m.section(form.NamedSection, 'main', 'aria2', _('Extra Settings'), + _('Settings in this section will be added to config file.')); + s.addremove = false; + s.anonymous = true; + + o = s.option(form.DynamicList, 'extra_settings', _('Settings list'), + _('List of extra settings. Format: option=value, eg. netrc-path=/tmp/.netrc.')); + o.placeholder = 'option=value'; + + return m.render(); + } +}); diff --git a/package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js b/package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js new file mode 100644 index 0000000000..c86c794a93 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js @@ -0,0 +1,55 @@ +'use strict'; +'require fs'; +'require view'; + +return view.extend({ + load: function() { + var list_files = ['conf', 'session'], + actions = []; + for (var index = 0; index < list_files.length; ++index) { + actions.push( + fs.exec_direct('/usr/libexec/aria2-call', [ 'cat', list_files[index] ]) + .then(function(json) { + var res = {}; + + try { res = JSON.parse(json); } + catch(err) {} + + res.file = res.file || ''; + res.content = 'content' in res ? res.content.trim() : ''; + res.rows = res.content.split('\n', 20).length; + return res; + }) + ); + } + return Promise.all(actions); + }, + + render: function(data) { + var textareaEl = function(id, data, descr) { + return E('div', {'class': 'cbi-section'}, [ + E('div', {'class': 'cbi-section-descr'}, descr.format(data.file)), + E('div', { 'id' : id}, + E('textarea', { + 'id': 'widget.' + id, + 'style': 'width: 100%', + 'readonly': true, + 'wrap': 'off', + 'rows': data.rows >= 20 ? 20 : data.rows + 1 + }, data.content) + ) + ]); + }; + + return E('div', {'class': 'cbi-map'}, [ + E('h2', {'name': 'content'}, '%s - %s'.format(_('Aria2'), _('Files'))), + E('div', {'class': 'cbi-map-descr'}, _('Here shows the files used by aria2.')), + textareaEl('config_area', data[0], _('Content of config file: %s')), + textareaEl('session_area', data[1], _('Content of session file: %s')) + ]); + }, + + handleSave: null, + handleSaveApply: null, + handleReset: null +}); diff --git a/package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js b/package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js new file mode 100644 index 0000000000..075b110d59 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js @@ -0,0 +1,72 @@ +'use strict'; +'require dom'; +'require fs'; +'require poll'; +'require view'; + +var css = ' \ +#log_textarea { \ + padding: 10px; \ + text-align: left; \ +} \ +#log_textarea pre { \ + padding: .5rem; \ + word-break: break-all; \ + margin: 0; \ +} \ +.description { \ + background-color: #33ccff; \ +}'; + +function pollLog(e) { + return Promise.all([ + fs.exec_direct('/usr/libexec/aria2-call', [ 'tail' ]).then(function(res) { + return res.trim().split(/\n/).reverse().join('\n') + }), + fs.exec_direct('/sbin/logread', [ '-e', 'aria2' ]).then(function(res) { + return res.trim().split(/\n/).reverse().slice(0, 50).join('\n') + }) + ]).then(function(data) { + var t = E('pre', { 'wrap': 'pre' }, [ + E('div', { 'class': 'description' }, _('Last 50 lines of log file:')), + E('br'), + data[0] || _('No log data.'), + E('br'), + E('br'), + E('div', { 'class': 'description' }, _('Last 50 lines of syslog:')), + E('br'), + data[1] || _('No log data.') + ]); + dom.content(e, t); + }); +}; + +return view.extend({ + render: function() { + var log_textarea = E('div', { 'id': 'log_textarea' }, + E('img', { + 'src': L.resource(['icons/loading.gif']), + 'alt': _('Loading'), + 'style': 'vertical-align:middle' + }, _('Collecting data...')) + ); + + poll.add(pollLog.bind(this, log_textarea)); + return E([ + E('style', [ css ]), + E('div', {'class': 'cbi-map'}, [ + E('h2', {'name': 'content'}, '%s - %s'.format(_('Aria2'), _('Log Data'))), + E('div', {'class': 'cbi-section'}, [ + log_textarea, + E('div', {'style': 'text-align:right'}, + E('small', {}, _('Refresh every %s seconds.').format(L.env.pollinterval)) + ) + ]) + ]) + ]); + }, + + handleSave: null, + handleSaveApply: null, + handleReset: null +}); diff --git a/package/luci/applications/luci-app-aria2/po/ar/aria2.po b/package/luci/applications/luci-app-aria2/po/ar/aria2.po new file mode 100644 index 0000000000..62338f5f20 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/ar/aria2.po @@ -0,0 +1,784 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-10-22 18:07+0000\n" +"Last-Translator: Abdullah AlShaikh \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Weblate 4.14.2-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD مفعّل" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "شهادة" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "جمع البيانات..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "إعدادات" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "تصحيح الأخطاء" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "تمكين سجل التسجيل" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "مفعل" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "خطأ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "معلومات" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "جار التحميل" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "√" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "ملف تسجيل" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "لاشيء" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "ملاحضة" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "إعدادات" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/bg/aria2.po b/package/luci/applications/luci-app-aria2/po/bg/aria2.po new file mode 100644 index 0000000000..63eadf4136 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/bg/aria2.po @@ -0,0 +1,783 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-03-18 11:40+0000\n" +"Last-Translator: Zi \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.16.2-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD enabled" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Събиране данни..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Конфигурация" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Разреши журнала" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Разрешен" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Грешка" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Зареждане" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/bn_BD/aria2.po b/package/luci/applications/luci-app-aria2/po/bn_BD/aria2.po new file mode 100644 index 0000000000..47c12fcc11 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/bn_BD/aria2.po @@ -0,0 +1,783 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-10-08 17:53+0000\n" +"Last-Translator: Rayhan Nabi \n" +"Language-Team: Bengali (Bangladesh) \n" +"Language: bn_BD\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "কনফিগারেশন" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "ডিবাগ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "সক্রিয়" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "ভুল" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "তথ্য" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "লগ করুন" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "লগ ফাইল" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "লগ লেভেল" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "নির্দেশনা" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "ব্যবহারকারী হিসাবে ডেমন চালান" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "সেটিংস" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "টোকেন" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/ca/aria2.po b/package/luci/applications/luci-app-aria2/po/ca/aria2.po new file mode 100644 index 0000000000..7c7f503925 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/ca/aria2.po @@ -0,0 +1,786 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-03-08 13:03+0000\n" +"Last-Translator: BenRoura \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.5.1\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" +"S'ha activat l'LPD" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Rastrejador addicional del BT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Opcions avançades" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Interval de desament automàtic" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Opcions bàsiques" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Opcions del BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "Port d'escolta del BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Certificat CA" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Certificat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Comprova el certificat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Tanca la connexió si la velocitat de baixada és menor que o igual a aquest " +"valor (bytes per segon). 0 indica que no hi ha un límit de velocitat mínima." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "S’estan recollint dades…" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Directori de fitxer de configuració" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Configuració" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "Port d'escolta del DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Depuració" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Memòria cau del disc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Directori de baixades" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Activat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "S’està carregant" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Paràmetres" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Llista de paràmetres" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "S'està executant el servei Aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Temps d'espera" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "Agent d'usuari" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Nom d'usuari i contrasenya" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/cs/aria2.po b/package/luci/applications/luci-app-aria2/po/cs/aria2.po new file mode 100644 index 0000000000..4f165e4636 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/cs/aria2.po @@ -0,0 +1,795 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-09-30 22:00+0000\n" +"Last-Translator: David Rapaň \n" +"Language-Team: Czech \n" +"Language: cs\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD povoleno" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Další BT tracker" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Pokročilé nastavení" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Vše skrz proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Připojit HEADERy k hlavičce HTTP požadavku." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2 je lehký multi-protokolový & multi-zdrojový a multiplatformní " +"nástroj pro stahování." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Interval automatického ukládání" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Základní nastavení" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "BitTorrent nastavení" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "Port naslouchání BitTorrentu" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Certifikát CA" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Certifikát" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Zkontrolovat certifikát" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Uzavřít spojení, pokud rychlost stahování je nižší nebo rovna této hodnotě " +"(bajtů za sekundu). 0 znamená, že nemá nejnižší rychlostní limit." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Shromažďování údajů…" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Adresář pro uložení konfiguračního souboru" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Nastavení" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Časový limit pro připojení" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Obsah konfiguračního souboru: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Obsah session souboru: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "Port naslouchání DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Ladění" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Vypnout IPv6. Užitečné, pokud musíte používat nefunkční DNS a chcete se " +"vyhnout velmi pomalému vyhledávání AAAA záznamů." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Disková mezipaměť" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "Nedělit rozsah menší než 2*SIZE bajtů. Možné hodnoty: 1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Stáhnout soubor pomocí N spojení." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Adresář pro stahované" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "Povolit IPv4 DHT funkcionalitu. Povoluje rovněž podporu UDP trackeru." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Povolit IPv6 DHT funkcionalitu." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Povolit objevování místních peerů." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Povolit rozšíření Peer Exchange." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Povolit diskovou mezipaměť (v bajtech), nastavte 0 pro vypnutí." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Zaznamenávat události" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Povolit výměnu peerů" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Povolit proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Zapnuto" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Chyba" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Extra nastavení" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Nepravdivé" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Alokace souboru" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Soubory" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Sledovat torrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Pro více informací navštivte: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Vynutit uložení" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Generovat náhodně" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Udělit oprávnění k UCI pro luci-app-aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP akceptovat gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP bez mezipaměti" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "Možnosti HTTP/FTP/SFTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Hlavička" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Zde jsou zobrazeny soubory používané aplikací aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "IPv4 DHT povoleno" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "IPv6 DHT povoleno" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "IPv6 vypnuto" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Pokud je celková stahovací rychlost každého torrentu nižší než RYCHLOST, " +"aria2 dočasně zvyšuje počet peerů, aby zkusila dosáhnout vyšší rychlosti " +"stahování. Nastavení této možnosti na vámi preferovanou rychlost stahování " +"může v některých případech zvýšit rychlost stahování." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Info" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Instalované webové rozhraní:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "Json-RPC URL" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Uchovat v paměti" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "Posledních 50 řádků logu:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "Posledních 50 řádků syslogu:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Ponechte prázdné pro použití výchozího uživatele." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Seznam dalších announce URI pro BitTorrent tracker." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Seznam extra nastavení. Formát: option=value, eg. netrc-path=/tmp/." +"netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Načítání" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Protokol" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Log data" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Soubor pro záznam událostí" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Úroveň logu" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Nejnižší limit rychlosti" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Maximum souběžných stahování" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Maximum spojení na server" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Maximální limit stahování" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Maximální počet rozdělení" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Maximum otevřených souborů" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Maximální celkový limit stahování" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Maximální celkový limit nahrávání" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Maximum peerů" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Maximum pokusů" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Maximální limit nahrávání" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Minimální velikost splitů" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Žádná autentizace" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Žádná logovací data." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Žádný" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Upozornění" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Pauza" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Pozastavit stahování po přidání." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "Pozastavit stahování vytvořená jako výsledek stahování metadat." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Soukromý klíč" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Heslo proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Uživatel proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "Volby RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "Metoda autentizace RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "RPC certifikát" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC heslo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "Soukromý klíč RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC secure" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "RPC token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "Uživatelské jméno RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Spustit démona pod uživatelskými oprávněními" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Nastavení" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Časový limit" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/da/aria2.po b/package/luci/applications/luci-app-aria2/po/da/aria2.po new file mode 100644 index 0000000000..127f9031eb --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/da/aria2.po @@ -0,0 +1,783 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-11-09 02:04+0000\n" +"Last-Translator: drax red \n" +"Language-Team: Danish \n" +"Language: da\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.2-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "CA-certifikat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Konfigurationsfil mappe" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Debug" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Download mappe" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Aktiver" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Fejl" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Info" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Indlæser" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Log niveau" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Ingen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Varsel" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Sæt pause" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC kodeord" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "RPC brugernavn" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Kør dæmon som bruger" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Indstillinger" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Timeout" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "præalloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/de/aria2.po b/package/luci/applications/luci-app-aria2/po/de/aria2.po new file mode 100644 index 0000000000..93ee5eef68 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/de/aria2.po @@ -0,0 +1,900 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-07-09 09:41+0000\n" +"Last-Translator: ssantos \n" +"Language-Team: German \n" +"Language: de\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD aktiviert" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Zusätzliche BT-Tracker" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Erweiterte Optionen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Alle Proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "HEADER zu den HTTP-Anfrage-Header anhängen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2 ist ein kleines, plattformübergreifendes Multi-Protokoll & Multi-" +"Quellen Download-Programm." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Automatisches Speicherintervall" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Grundlegende Optionen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "BitTorrent-Optionen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "BitTorrent Listening-Port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "CA-Zertifikat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Zertifikat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Zertifikat überprüfen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Schließe die Verbindung wenn die Download-Geschwinidigkeit niedriger oder " +"gleich dieses Wertes (Bytes pro Sekunde) ist. 0 heißt es gibt keine " +"niedrigste Geschwindigkeitsgrenze." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Sammle Daten..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Verzeichnis der Konfigurationsdatei" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Konfiguration" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Verbindungszeitüberschreitung" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Inhalt der Konfigurationsdatei: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Inhalt der Sitzungsdatei: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "DHT Listening-Port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Debuggen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Deaktiviere IPv6. Dies ist sinnvoll falls man einen kaputten DNS benutzen " +"muss und fürchterlich langsame AAAA Record Lookups vermeiden will." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Festplatten-Cache" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" +"Splitte nicht wenn die Byte-Range kleiner als 2*SIZE beträgt. Mögliche " +"Werte: 1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Lade eine Datei mit N Verbindungen herunter." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Download-Verzeichnis" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" +"Aktiviere IPv4 DHT Funktionalität. Aktiviviert auch UDP-Tracker-" +"Unterstützung." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Aktiviere IPv6 DHT Funktionalität." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Lokale Peer-Erkennung aktivieren." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Peer Exchange Erweiterung aktivieren." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Festplatten-Cache aktivieren (in Bytes), 0 zum Deaktivieren." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Protokollierung aktivieren" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Peer Exchange aktivieren" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Proxy aktivieren" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Aktiviert" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Fehler" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Zusätzliche Einstellungen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Falsch" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Dateizuweisung" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Dateien" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Folge Torrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Für weitere Informationen siehe: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Speichern erzwingen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Zufällig generieren" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Gewähre UCI Zugriff auf luci-app-aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP akzeptiert gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP kein Cache" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "HTTP/FTP/SFTP-Optionen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Header" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Hier werden die von aria2 verwendeten Dateien angezeigt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "IPv4 DHT aktiviert" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "IPv6 DHT aktiviert" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "IPv6 deaktiviert" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Wenn die gesamte Download-Geschwindigkeit jedes Torrents niedriger ist als " +"SPEED, erhöht aria2 vorübergehend die Anzahl der Peers, um mehr Download-" +"Geschwindigkeit zu erreichen. Diese Option mit der bevorzugten Download-" +"Geschwindigkeit zu konfigurieren kann in einigen Fällen die Download-" +"Geschwindigkeit erhöhen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Info" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Installiertes Webinterface:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "Json-RPC-URL" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Im Speicher behalten" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "Letzte 50 Zeilen der Protokolldatei:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "Letzte 50 Zeilen des Syslog:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Leer lassen für Standard-Benutzer." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Liste von Announce-URIs zusätzlicher BitTorrent-Tracker." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Liste der zusätzlichen Einstellungen. Format: Option=Wert, z.B. netrc-" +"path=/tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Lade" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Protokoll" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Protokolldaten" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Protokolldatei" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Protokollierungsstufe" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Niedrigste Geschwindigkeitsbegrenzung" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Max. gleichzeitiger Downloads" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Max. Verbindungen pro Server" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Maximales Download-Limit" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Maximale Anzahl von Splits" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Max. geöffnete Dateien" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Maximales Gesamt-Download-Limit" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Maximales Gesamt-Upload-Limit" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Maximal Peers" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Maximale Versuche" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Maximales Upload-Limit" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Min. Splitgröße" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Keine Authentifizierung" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Keine Protokolldaten." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Keine" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Notiz" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Pausieren" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Pausiere Download nach dem Hinzufügen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" +"Pausiere Downloads, die aufgrund des Herunterladens von Metadaten erstellt " +"wurden." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Pausiere Metadaten" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Bitte Tokenlänge eingeben:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Präfix der Peer-ID" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Privater Schlüssel" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Proxy-Passwort" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Proxy-Benutzer" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "RPC Optionen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "RPC-Authentifizierungsverfahren" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "RPC-Zertifikat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC-Passwort" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC-Port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "Privater RPC-Schlüssel" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC gesichert" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "RPC-Token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"RPC-Transport wird mit SSL/TLS verschlüsselt. Die RPC-Clients müssen das " +"https-Schema verwenden, um auf den Server zuzugreifen. Für WebSocket-Client " +"wss-Schema verwenden." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "RPC Benutzername" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Alle %s Sekunden aktualisieren." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Nicht ausgewählte Datei entfernen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Entfernt die nicht ausgewählten Dateien, wenn der Download in BitTorrent " +"abgeschlossen ist. Bitte verwenden diese Option mit Vorsicht verwenden, da " +"sie tatsächlich Dateien von der Festplatte entfernt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Peer-Geschwindigkeitsbegrenzung anfordern" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Wartezeit vor Wiederholung" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Daemon als Gruppe ausführen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Ausführungsstatus" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Speichere alle N Sekunden eine Kontrolldatei (*.aria2). Wenn 0 angegeben " +"wird, wird beim Herunterladen keine Kontrolldatei gespeichert." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Speichere den Download in einer Sessiondatei, auch wenn der Download " +"abgeschlossen oder entfernt wurde. Diese Option speichert auch die " +"Kontrolldatei in diesen Situationen. Dies kann nützlich sein, um BitTorrent-" +"Seeding zu speichern, das als abgeschlossener Zustand erkannt wird." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Alle N Sekunden Fehler/unbeendete Downloads in der Sitzungsdatei speichern. " +"Wenn 0 angegeben wird, wird die Datei nur beim Beenden von aria2 gespeichert." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Speichere Metadaten als \".torrent\"-Datei. Diese Option wirkt sich nur aus, " +"wenn eine BitTorrent Magnet-URI verwendet wird. Der Dateiname ist ein " +"hexadezimal kodierter Info-Hash mit der Endung \".torrent\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Speichere Metadaten" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Session-Speicherintervall" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" +"Seeden von zuvor heruntergeladenen Dateien, ohne die Teilhashes zu " +"überprüfen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Seed-Verhältnis" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Seed-Zeit" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Seed unverifiziert" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Sende Accept: deflate, gzip-Anfrage-Header und dekomprimiere " +"die erhaltene Serverantwort, wenn der Server mit Content-Encoding: " +"gzip oder Content-Encoding: deflate antwortet." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Sende Cache-Control: no-cache und Pragma: no-cache " +"Header, um zwischengespeicherte Inhalte zu vermeiden. Wenn sie deaktiviert " +"sind, werden diese Header nicht gesendet, und Sie können mit der Option " +"\"Header\" einen Cache-Control-Header mit einer beliebigen Direktive " +"hinzufügen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"Setzen der TCP-Portnummer für BitTorrent-Downloads. Formate die akzeptiert " +"werden: \"6881,6885\", \"6881-6999\" und \"6881-6889,6999\". Überprüfen sie, " +"dass die angegebenen Ports für den eingehenden TCP-Traffic geöffnet sind." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"Setzen des UDP-Listen-Ports, der von DHT (IPv4, IPv6) und dem UDP-Tracker " +"verwendet wird. Überprüfen Sie, dass die angegebenen Ports für eingehenden " +"UDP-Traffic erreichbar sind." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Legt die maximale Download-Geschwindigkeit pro Download fest in Bytes/Sek. 0 " +"bedeutet uneingeschränkt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Legt die maximale Gesamt-Download-Geschwindigkeit fest in Bytes/Sek. 0 " +"bedeutet uneingeschränkt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Legt die maximale Gesamt-Upload-Geschwindigkeit fest in Bytes/Sek. 0 " +"bedeutet uneingeschränkt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Legt die maximale Upload-Geschwindigkeit pro Torrent fest in Bytes/Sek. 0 " +"bedeutet uneingeschränkt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Legt den Verbindungs-Timeout in Sekunden fest für den Verbindungsaufbau zu " +"HTTP/FTP/Proxy-Servern. Nachdem die Verbindung hergestellt wurde, hat dieser " +"Wert keinen Effekt mehr und der \"Timeout\"-Wert wird stattdessen verwendet." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Sekunden, die zwischen Wiederholungsversuchen gewartet wird." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Setze User-Agent für HTTP(S)-Downloads." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Einstellungen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" +"Einstellungen in diesem Abschnitt werden der Konfigurationsdatei hinzugefügt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Liste der Einstellungen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Geben Sie die File-Allocation-Methode an. Für neuere Dateisysteme wie ext4 " +"(mit Unterstützung von Extents), btrfs, xfs oder NTFS (nur MinGW-Build) ist " +"\"falloc\" die beste Wahl. Diese ordnet (wenige GiB) große Dateien fast " +"sofort zu, ist aber möglicherweise nicht verfügbar, wenn das System nicht " +"über die posix_fallocate(3)-Funktion verfügt. Die \"falloc\"-Methode sollte " +"nicht mit älteren Dateisystemen wie ext3 und FAT32 verwendet werden, da es " +"fast dieselbe Zeit wie \"prealloc\" benötigt und aria2 vollständig " +"blockiert, bis die Zuweisung abgeschlossen ist." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Geben Sie die maximale Anzahl von Dateien an, die beim BitTorrent-Download " +"mit mehreren Dateien global geöffnet werden sollen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Geben Sie die Seed-Zeit in Minuten an. Wenn die Option \"Seed ratio\" " +"zusammen mit dieser Option angegeben wird, wird der Seed beendet, wenn " +"mindestens eine der Bedingungen erfüllt ist. Die Angabe von 0 deaktiviert " +"das Seeding nach Abschluss des Downloads." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Geben Sie das Share-Verhältnis an. Seeden der Torrents, bis das Share-" +"Verhältnis das RATIO erreicht. Es wird dringend empfohlen, hier Gleichheit " +"oder mehr als 1,0 anzugeben. Geben Sie 0,0 an, wenn Sie beabsichtigen, " +"unabhängig vom Share-Verhältnis zu seeden." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" +"Geben Sie die maximale Anzahl von Peers pro Torrent an, 0 bedeutet " +"unbegrenzt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Geben Sie das Präfix der Peer-ID an. Die Peer-ID in BitTorrent ist 20 Byte " +"lang. Wenn mehr als 20 Byte angegeben werden, werden nur die ersten 20 Byte " +"verwendet. Wenn weniger als 20 Byte angegeben werden, werden zufällige Byte-" +"Daten hinzugefügt, um die Länge auf 20 Byte zu erhöhen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"Stoppt den BitTorrent-Download, wenn die Download-Geschwindigkeit während N " +"Sekunden 0 bleibt. Wenn 0 angegeben wird, ist diese Funktion deaktiviert." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Stopp-Timeout" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Der Aria2-Dienst läuft nicht." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Der Aria2-Dienst läuft." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" +"Das Verzeichnis zum Speichern von Konfigurations-, Sitzungs- und DHT-Dateien." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" +"Das Verzeichnis zum Speichern der heruntergeladenen Datei. Zum Beispiel " +"/mnt/sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "Der Dateiname der Protokolldatei." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "Die maximale Anzahl von Verbindungen zu einem Server je Download." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" +"Diese Option wird ignoriert, wenn ein Torrent das Private-Flag gesetzt hat." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Zeitüberschreitung" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "Wahr" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Benutze einen Proxy-Server für alle Protokolle." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Benutze die Zertifizierungsstellen in FILE, um die Peers zu überprüfen. Die " +"Zertifikatsdatei muss im PEM-Format vorliegen und kann mehrere CA-" +"Zertifikate enthalten." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"Benutze das Zertifikat im FILE for RPC Server. Das Zertifikat muss entweder " +"in PKCS12 (.p12, .pfx) oder im PEM-Format vorliegen.
    PKCS12-Dateien " +"müssen das Zertifikat, einen Schlüssel und optional eine Kette von " +"zusätzlichen Zertifikaten enthalten. Es können nur PKCS12-Dateien mit einem " +"leeren Importpasswort geöffnet werden!
    Bei der Verwendung von PEM müssen " +"Sie auch den \"RPC Private Key\" angeben." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Benutze das Client-Zertifikat im FILE. Das Zertifikat muss entweder in " +"PKCS12 (.p12, .pfx) oder im PEM-Format vorliegen.
    PKCS12-Dateien müssen " +"das Zertifikat, einen Schlüssel und optional eine Kette von zusätzlichen " +"Zertifikaten enthalten. Es können nur PKCS12-Dateien mit einem leeren " +"Importkennwort geöffnet werden!
    Bei Verwendung von PEM müssen Sie auch " +"den \"Privaten Schlüssel\" angeben." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"Benutze den privaten Schlüssel in FILE for RPC Server. Der private Schlüssel " +"muss entschlüsselt im PEM-Format vorliegen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Benutze den privaten Schlüssel in FILE. Der private Schlüssel muss " +"unverschlüsselt im PEM-Format vorliegen. Das Verhalten, wenn ein " +"verschlüsselter Schlüssel angegeben wird, ist undefiniert." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "User-Agent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Benutzername & Passwort" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"Überprüfe den Peer unter Verwendung der in der Option \"CA-Zertifikat\" " +"angegebenen Zertifikate." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Achtung" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "Sie können K oder M anhängen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/el/aria2.po b/package/luci/applications/luci-app-aria2/po/el/aria2.po new file mode 100644 index 0000000000..30df372c28 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/el/aria2.po @@ -0,0 +1,786 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-03-25 12:08+0000\n" +"Last-Translator: MarioK239 \n" +"Language-Team: Greek \n" +"Language: el\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.12-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD ενεργό" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Επιλογές για Προχωρημένους" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Μεσοδιάστημα αυτόματης αποθήκευσης" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Βασικές Επιλογές" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Επιλογές BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Πιστοποιητικό CA" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Πιστοποιητικό" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Έλεγχος πιστοποιητικού" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Κλείσιμο της σύνδεσης όταν η ταχύτητα κατεβάσματος είναι χαμηλότερη ή ίση με " +"αυτή την τιμή (bytes ανά sec). Το 0 σημαίνει ότι δεν υπάρχει χαμηλότερο όριο " +"ταχύτητας." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Συλλογή δεδομένων..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Φάκελος αρχείου διαμόρφωσης" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Διαμόρφωση" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Περιεχόμενο του αρχείου διαμόφωσης: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Αποσφαλμάτωση" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Κρυφή μνήμη δίσκου" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Λήψη ενός αρχείου με χρήση Ν συνδέσεων." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Φάκελος λήψης" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Ενεργοποίηση καταγραφής" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Ενεργοποιήθηκε" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Σφάλμα" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Αρχεία" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Φόρτωση" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Αρχείο καταγραφής" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Επίπεδο καταγραφής" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Ρυθμίσεις" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Τέλος χρόνου" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/en/aria2.po b/package/luci/applications/luci-app-aria2/po/en/aria2.po new file mode 100644 index 0000000000..cbe85e5e42 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/en/aria2.po @@ -0,0 +1,783 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-11-30 14:34+0000\n" +"Last-Translator: rygle \n" +"Language-Team: English \n" +"Language: en\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.3-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Configuration" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Enabled" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Private Key" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/es/aria2.po b/package/luci/applications/luci-app-aria2/po/es/aria2.po new file mode 100644 index 0000000000..8cab72c66e --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/es/aria2.po @@ -0,0 +1,894 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2023-11-07 22:01+0000\n" +"Last-Translator: Franco Castillo \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.2-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "Activar LPD" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Tracker BT adicional" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Opciones avanzadas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Todos los proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Añadir ENCABEZADOs al encabezado de solicitud HTTP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2 es una utilidad ligera de descarga multiplataforma y multiprotocolo." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Intervalo de guardado automático" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Opciones avanzadas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Opciones de BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "Puerto/s de BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Certificado CA" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Certificado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Comprobar certificado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Cierre la conexión si la velocidad de descarga es menor o igual a este valor " +"(bytes por segundo). 0 significa que no tiene límite de velocidad mínima." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Recolectando datos…" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Directorio de archivos de configuración" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Configuración" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Tiempo de espera de conexión" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Contenido del archivo de configuración: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Contenido del archivo de sesión: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "Puerto DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Depurar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Desactiva IPv6. Esto es útil si tiene que usar un DNS roto y desea evitar " +"una búsqueda de registros AAAA terriblemente lenta." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Caché de disco" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" +"No divida menos de 2*TAMAÑO de rango de bytes. Valores posibles: 1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Descargue un archivo usando N conexiones." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Directorio de descarga" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "Activar DHT IPv4. También activa el soporte de tracker UDP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Activar DHT IPv6." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Activar descubrimiento de pares locales." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Activa la extensión de intercambio de pares." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Activa el caché de disco (en bytes), establezca 0 para desactivar." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Activar registro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Activar intercambio entre pares" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Activar proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Activado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Error" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Configuraciones extra" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Falso" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Asignación de archivos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Archivos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Seguir torrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Para obtener más información, visite: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Forzar guardado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Generar aleatoriamente" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Conceder acceso UCI para luci-app-aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP acepta gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP sin caché" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "Opciones HTTP/FTP/SFTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Encabezado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Aquí se muestran los archivos utilizados por aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "Activar DHT IPv4" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "Activar DHT IPv6" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "Desactivar IPv6" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Si toda la velocidad de descarga de cada torrent es inferior al límite " +"máximo, aria2 aumenta temporalmente el número de pares para intentar obtener " +"más velocidad de descarga. Configurar esta opción con su velocidad de " +"descarga preferida puede aumentar su velocidad de descarga en algunos casos." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Info" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Interfaz web instalada:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "URL de Json-RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Guardar en la memoria" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "Últimas 50 líneas del archivo de registro:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "Últimas 50 líneas de syslog:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Déjelo en blanco para usar el usuario predeterminado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Lista de URI de anuncio de trackers de BitTorrent adicionales." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Lista de configuraciones adicionales. Formato: opción=valor, p. Ej. " +"netrc-path=/tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Cargando" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Registro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Dato de registro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Archivo de registro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Nivel de registro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Límite de velocidad mínima" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Máximo de descargas concurrentes" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Máxima conexiones por servidor" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Límite máximo de descarga" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Número máximo de división" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Máx. archivos abiertos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Límite máximo de descarga total" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Límite total máximo de carga" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Máx. pares" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Máx. de intentos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Límite máximo de carga" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Tamaño mínimo de división" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Sin autenticacion" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "No hay datos de registro." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Ninguno" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Aviso" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Pausa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Pausa la descarga después de añadir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" +"Pausa las descargas creadas como resultado de la descarga de metadatos." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Pausar metadatos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Ingrese la longitud del token:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Prefijo de ID de par" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Clave privada" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Contraseña de proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Usuario de proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "Opciones de RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "Método de autenticación RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "Certificado de RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "Contraseña RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "Puerto RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "Clave privada de RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC seguro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "Token RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"El transporte RPC será encriptado por SSL/TLS. Los clientes RPC deben usar " +"el esquema https para acceder al servidor. Para el cliente WebSocket, use el " +"esquema wss." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "Nombre de usuario RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Actualiza cada %s segundos." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Eliminar archivo no seleccionado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Elimina los archivos no seleccionados cuando se completa la descarga en " +"BitTorrent. Utilice esta opción con cuidado porque en realidad eliminará los " +"archivos de su disco." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Solicitar límite de velocidad del par" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Espera de reintento" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Ejecutar demonio como usuario" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Estado de ejecución" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Guarda un archivo de control (*.aria2) cada N segundos. Si se da 0, no se " +"guarda un archivo de control durante la descarga." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Guarda la descarga en el archivo de sesión incluso si la descarga se ha " +"completado o eliminado. Esta opción también guarda el archivo de control en " +"esas situaciones. Esto puede ser útil para guardar la siembra de BitTorrent " +"que se reconoce como estado completado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Guarda el error/descargas inacabadas en el archivo de sesión cada N " +"segundos. Si se da 0, el archivo se guardará solo cuando cierre aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Guarda los metadatos como archivo \".torrent\". Esta opción solo tiene " +"efecto cuando se utiliza la URI de BitTorrent Magnet. El nombre del archivo " +"es hash de información codificado hexadecimal con sufijo \".torrent\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Guardar metadatos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Guardar intervalo de sesión" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" +"Siembra los archivos descargados previamente sin verificar hashes de piezas." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Proporción de semilla" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Tiempo de sembrado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Sembrar sin verificar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Enviar Aceptar: deflate, gzip encabezado de solicitud e inflar " +"respuesta si el servidor remoto responde con Content-Encoding: gzip o Content-Encoding: deflate." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Envía el encabezado Cache-Control: no-cache y Pragma: no-" +"cache para evitar el contenido en caché. Si está desactivado, estos " +"encabezados no se envían y puede agregar el encabezado Cache-Control con una " +"directiva que le guste usando la opción \"Encabezado\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"Establezca el número de puerto TCP para las descargas de BitTorrent. Formato " +"de aceptación: \"6881,6885\", \"6881-6999\" y \"6881-6889,6999\". Asegúrese " +"de que los puertos especificados estén abiertos para el tráfico TCP entrante." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"Configure el puerto de escucha UDP utilizado por DHT (IPv4, IPv6) y el " +"tracker UDP. Asegúrese de que los puertos especificados estén abiertos para " +"el tráfico UDP entrante." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Establezca la velocidad máxima de descarga por cada descarga en bytes/seg. 0 " +"significa sin restricciones." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Establezca la velocidad máxima de descarga global en bytes/seg. 0 significa " +"sin restricciones." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Establezca la velocidad máxima de carga general en bytes/seg. 0 significa " +"sin restricciones." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Establezca la velocidad máxima de carga por cada torrent en bytes/seg. 0 " +"significa sin restricciones." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Establezca el tiempo de espera de conexión en segundos para establecer la " +"conexión al servidor HTTP/FTP/proxy. Una vez establecida la conexión, esta " +"opción no tiene efecto y en su lugar se utiliza la opción \"Tiempo de " +"espera\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Establezca los segundos para esperar entre reintentos." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Establezca el agente de usuario para descargas HTTP(S)." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Configuraciones" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" +"La configuración de esta sección se agregará al archivo de configuración." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Lista de configuraciones" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Especifique el método de asignación de archivos. Si está utilizando sistemas " +"de archivos más nuevos como ext4 (con soporte de extensión), btrfs, xfs o " +"NTFS (solo compilación MinGW), \"falloc\" es su mejor opción. Asigna " +"archivos grandes (pocos GiB) casi instantáneamente, pero puede no estar " +"disponible si su sistema no tiene la función posix_fallocate(3). No use " +"\"falloc\" con sistemas de archivos heredados como ext3 y FAT32 porque toma " +"casi el mismo tiempo que \"prealloc\" y bloquea completamente aria2 hasta " +"que finaliza la asignación." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Especifique el número máximo de archivos para abrir en la descarga de " +"BitTorrent de varios archivos a nivel mundial." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Especifique el tiempo de sembrado en minutos. Si se especifica la opción " +"\"Proporción de sembrado\" junto con esta opción, la siembra finaliza cuando " +"se cumple al menos una de las condiciones. Especificar 0 desactiva el " +"sembrado después de completar la descarga." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Especifique la proporción de compartición. Sembrar torrents completados " +"hasta que la proporción de compartición alcance la PROPORCIÓN. Se recomienda " +"que especifique iguales o más de 1.0 aquí. Especifique 0.0 si tiene la " +"intención de sembrar, independientemente de la proporción de compartición." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" +"Especifique el número máximo de pares por torrent, 0 significa ilimitado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Especifique el prefijo de la ID del par. La ID del par en BitTorrent tiene " +"20 bytes de longitud. Si se especifican más de 20 bytes, sólo se utilizan " +"los primeros 20 bytes. Si se especifica menos de 20 bytes, se agregan datos " +"de bytes aleatorios para que su longitud sea de 20 bytes." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"Detiene la descarga de BitTorrent si la velocidad de descarga es 0 en N " +"segundos consecutivos. Si se da 0, esta característica estará desactivada." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Detener tiempo de espera" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "El servicio Aria2 no se está ejecutando." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "El servicio Aria2 se está ejecutando." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" +"Directorio para almacenar el archivo de configuración, el archivo de sesión " +"y el archivo DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" +"El directorio para almacenar el archivo descargado. p.ej. /mnt/sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "El nombre del archivo de registro." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "Número máximo de conexiones a un servidor para cada descarga." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" +"Esta opción se ignorará si se establece un indicador privado en un torrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Se acabó el tiempo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "Verdadero" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Use un servidor proxy para todos los protocolos." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Use las autoridades de certificación en ARCHIVO para verificar los pares. El " +"archivo del certificado debe estar en formato .PEM y puede contener " +"múltiples certificados de CA." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"Utilice el certificado en ARCHIVO para el servidor RPC. El certificado debe " +"estar en PKCS12 (.p12, .pfx) o en formato .PEM.
    Los archivos PKCS12 " +"deben contener el certificado, una clave y, opcionalmente, una cadena de " +"certificados adicionales. ¡Solo se pueden abrir archivos PKCS12 con una " +"contraseña de importación en blanco!
    Al usar PEM, también debe " +"especificar la \"clave privada RPC\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Use el certificado del cliente en ARCHIVO. El certificado debe estar en " +"PKCS12 (.p12, .pfx) o en formato PEM.
    Los archivos PKCS12 deben contener " +"el certificado, una clave y, opcionalmente, una cadena de certificados " +"adicionales. ¡Solo se pueden abrir archivos PKCS12 con una contraseña de " +"importación en blanco!
    Al usar PEM, también debe especificar la \"Clave " +"privada\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"Use la clave privada en ARCHIVO para el servidor RPC. La clave privada debe " +"ser descifrada y en formato .PEM." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Use la clave privada en ARCHIVO. La clave privada debe ser descifrada y en " +"formato .PEM. El comportamiento cuando se da cifrado uno no está definido." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "Agente de usuario" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Nombre de usuario y contraseña" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"Verifica el par utilizando los certificados especificados en la opción " +"\"Certificado CA\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Advertir" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "Puedes agregar K o M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "truncar" diff --git a/package/luci/applications/luci-app-aria2/po/fi/aria2.po b/package/luci/applications/luci-app-aria2/po/fi/aria2.po new file mode 100644 index 0000000000..cbcbd6a60f --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/fi/aria2.po @@ -0,0 +1,783 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-18 05:43+0000\n" +"Last-Translator: Jiri Grönroos \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.1\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Perusasetukset" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "BitTorrent-asetukset" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "BitTorrentin kuunteluportti" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "CA-varmenne" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Varmenne" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Kerätään tietoja…" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Asetustiedoston hakemisto" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Kokoonpano" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "DHT:n kuunteluportti" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Debug" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Lataushakemisto" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Käytä lokitusta" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Käytössä" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Virhe" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Lisäasetukset" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "HTTP/FTP/SFTP-asetukset" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Tietoja" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Ladataan" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Loki" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Lokitiedosto" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Lokitaso" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Ei mikään" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Huomaa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Keskeytä" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC-salasana" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC-portti" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "RPC-käyttäjätunus" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Asetukset" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Aria2-palvelu ei ole käynnissä." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Aria2-palvelu on käynnissä." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "Käyttäjäagentti" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Käyttäjätunnus ja salasana" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/fr/aria2.po b/package/luci/applications/luci-app-aria2/po/fr/aria2.po new file mode 100644 index 0000000000..34cc830024 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/fr/aria2.po @@ -0,0 +1,899 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-06-24 21:54+0000\n" +"Last-Translator: viking76 \n" +"Language-Team: French \n" +"Language: fr\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.18.1\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "Protocole LPD activé" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Traqueur BT additionnel" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Options avancées" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Tous les proxys" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Ajouter les HEADERs aux entêtes de requêtes HTTP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2 est un outil de téléchargement multi-protocole, multi-source et multi-" +"plateforme." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Intervalle de sauvegarde automatique" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Options de base" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Options BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "Port d'écoute de BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Certificat CA" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Certificat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Vérifier le certificat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Ferme la connexion si la vitesse de téléchargement est inférieure ou égale à " +"cette valeur (en bits par seconde). 0 signifie qu'il n'y a pas de limite de " +"vitesse minimale." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Récupération des données…" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Dossier du fichier de configuration" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Configuration" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Délai d'attente dépassé" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Contenu du fichier de configuration : %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Contenu du fichier de session : %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "Port d'écoute DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Débogage" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Désactiver IPv6. Cela est utile si vous utilisez un DNS défaillant et voulez " +"éviter une résolution des enregistrements AAAA terriblement lente." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Cache du disque" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" +"Ne divisez pas moins de 2*plage d'octets SIZE. Valeurs possibles: 1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Télécharger un fichier en utilisant N connexions." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Télécharger un dossier" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" +"Activer la fonctionnalité de DHT IPv4. Cela active également le support UDP " +"du traqueur." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Activer la fonctionnalité de DHT IPv6." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Activer la découverte des pairs locaux." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Activer l'extension d'échange de pairs." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Active le cache du disque (en octets), désactivé si 0." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Activer la journalisation" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Activer l'échange entre pairs" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Activer le proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Activé" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Erreur" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Paramètres supplémentaires" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Faux" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Attribution de l'espace pour les fichiers" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Fichiers" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Suivre le torrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Pour plus d'information, visitez : %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Forcer l'enregistrement" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Générer aléatoirement" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Accorder tout accès UCI pour luci-app-arias2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP accepte gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "Pas de cache HTTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "Options HTTP/FTP/SFTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "En-tête" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Voici les fichiers utilisés par aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "IPv4 DHT activé" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "IPv6 DHT activé" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "IPv6 désactivé" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Si la vitesse de téléchargement de chacun des torrents est inférieure à " +"SPEED, aria2 augmentera temporairement le nombre de pairs pour essayer " +"d'augmenter la vitesse de téléchargement. Configurer cette option avec votre " +"vitesse de téléchargement préférée peut augmenter votre vitesse de " +"téléchargement de certains cas." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Infos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Interface Web installée :" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "URL de Json-RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Conserver en mémoire" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "50 dernières lignes du fichier de journal :" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "50 dernière lignes du journal système :" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Laissez vide pour utiliser l'utilisateur par défaut." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "URI de l'annonce de la liste des traqueurs BitTorrent additionnels." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Liste des paramètres supplémentaires. Format : option=valeur, par ex. " +"netrc-path=/tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Chargement" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Journal" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Données de journal" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Fichier journal" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Niveau de journalisation" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Limite de vitesse minimale" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Nombre maximum de téléchargements simultanés" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Nombre maximum de connexions par serveur" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Limite maximale de téléchargement" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Nombre maximum de coupures" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Nombre maximum de fichiers ouverts" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Limite globale maximale de téléchargement" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Limite globale maximale de téléversement" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Nombre maximum de pairs" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Nombre maximum de tentatives" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Limite maximale de téléversement" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Taille minimale de fractionnement" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Pas d'authentification" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Pas de données de journal." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Rien" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Remarque" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Mettre en pause" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Met en pause le téléchargement après l'ajout." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" +"Mettre en pause les téléchargements créés comme résultats de téléchargement " +"de métadata." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Mettre en pause les métadonnées" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Veuillez entrer la longueur du jeton :" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Préfixe ou ID du pair" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Clé privée" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Mot de passe du proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Utilisateur du proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "Options RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "Méthode d'authentification RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "Certificat RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "Mot de passe RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "Port RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "Clé privée RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC sécurisé" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "Jeton de RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"Le transport RPC sera chiffré par SSL/TLS. Les clients RPX devront utiliser " +"https pour accéder au serveur. Pour les clients WebSocket, utiliser wss." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "Nom d'utilisateur RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Actualiser toutes les %s secondes." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Supprimer le fichier non sélectionné" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Supprime les fichiers non sélectionnés lorsqu'un téléchargement est terminé " +"dans BitTorrent. Veuillez utiliser cette option avec précaution car elle " +"supprime des fichiers de votre disque." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Demande de limite de vitesse de paire" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Attente avant nouvel essai" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Exécuter le démon en tant qu'utilisateur" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "État d'exécution" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Enregistre un fichier de contrôle (*.aria2) toutes les N secondes. Si défini " +"à 0, aucun fichier de contrôle de sera enregistré pendant le téléchargement." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Enregistrer le téléchargement dans un fichier de session même si le " +"téléchargement est terminé ou supprimé. Cette option enregistre également le " +"fichier de contrôle dans ces situations. Cela peut être utile pour " +"enregistrer les partages BitTorrent qui sont reconnus comme terminés." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Enregistrer les erreurs/téléchargements inachevés dans le fichier de session " +"toutes les N secondes. Si 0 est donné, le fichier ne sera enregistré qu'à la " +"sortie de aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Enregistrez les métadonnées dans un fichier \".torrent\". Cette option n'a " +"d'effet que lorsque BitTorrent Magnet URI est utilisé. Le nom du fichier est " +"un hachage d'informations au format hexadécimal avec le suffixe \".torrent\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Enregistrer les métadonnées" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Intervalle d'enregistrement de la session" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" +"Graine des fichiers téléchargés précédemment sans vérifier les hachages de " +"pièces." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Ratio de partage" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Temps de partage" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Partage non vérifié" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Envoyer Accept : deflate, gzip dans l'entête de la demande et " +"utiliser la compression inflate pour répondre si le serveur distant répond " +"avec Content-Encoding : gzip ou Content-Encoding : " +"deflate." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Envoyer Cache-Control : no-cache et Pragma : no-cache dans l'entête pour prévenir la mise en cache du contenu. Si désactivé, " +"ces entêtes ne sont pas envoyées et vous pouvez ajouter une entête Cache-" +"Control avec une directive de votre choix en utilisant l'option \"Entête\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"Assigne le numéro de port TCP pour les téléchargements BitTorrent. Format " +"accepté: \"6881,6885\", \"6881-6999\" et \"6881-6889,6999\". Assurez-vous " +"que les ports spécifiés sont ouverts pour le trafic TCP entrant." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"Définissez le port d'écoute UDP utilisé par DHT (IPv4, IPv6) et le tracker " +"UDP. Assurez-vous que les ports spécifiés sont ouverts pour le trafic UDP " +"entrant." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Définit la vitesse de téléchargement maximale pour chaque téléchargement en " +"octets/s. 0 signifie sans limite." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Définit la vitesse globale maximale de téléchargement en octets/s. 0 " +"signifie sans limite." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Définit la vitesse globale maximale de téléversement en octets/s. 0 signifie " +"sans limite." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Définit la vitesse maximale de téléversement pour chaque torrent en octets/" +"s. 0 signifie sans limite." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Définir le délai d'attente en secondes pour établir une connexion au serveur " +"HTTP/FTP/proxy. Une fois la connexion établie, cette option n'a aucun effet " +"et la fonction « Délai d'attente » est utilisée à la place." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Définit le nombre de secondes à attendre entre chaque tentative." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Définit l'agent utilisateur pour les téléchargements HTTP(S)." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Paramètres" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" +"Les paramètres de cette section seront ajoutés au fichier de configuration." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Liste des paramètres" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Spécifiez la méthode d'allocation des fichiers. Si vous utilisez des " +"systèmes de fichiers plus récents tels que ext4 (avec prise en charge des " +"extensions), btrfs, xfs ou NTFS (build MinGW uniquement), \"falloc\" est " +"votre meilleur choix. Il alloue des fichiers volumineux (quelques Gio) " +"presque instantanément, mais il peut ne pas être disponible si votre système " +"n'a pas la fonction posix_fallocate(3). N'utilisez pas \"falloc\" avec les " +"systèmes de fichiers hérités tels que ext3 et FAT32 car cela prend presque " +"le même temps que \"prealloc\" et il bloque entièrement aria2 jusqu'à la fin " +"de l'allocation." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Spécifiez le nombre maximal de fichiers à ouvrir dans le téléchargement " +"BitTorrent multi-fichiers à l'échelle mondiale." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Spécifiez le temps de semis en minutes. Si l'option \"Ratio d'amorçage\" est " +"spécifiée avec cette option, l'amorçage se termine lorsqu'au moins une des " +"conditions est remplie. La spécification de 0 désactive l'amorçage une fois " +"le téléchargement terminé." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Spécifiez le ratio de partage. Semence terminée torrents jusqu'à ce que le " +"ratio de partage atteigne RATIO. Vous êtes fortement encouragé à spécifier " +"égal ou supérieur à 1.0 ici. Indiquez 0.0 si vous envisagez d'effectuer un " +"amorçage quel que soit le taux de partage." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "Spécifie le nombre maximum de pairs par torrent, 0 signifie illimité." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Spécifie le préfixe ou l'ID de pair. L'ID de pair dans BitTorrent est long " +"de 20 octets. Si plus de 20 octets sont spécifiés, seuls les 20 premiers " +"octets sont utilisés. Si moins de 20 octets sont spécifiés, des données " +"aléatoires sont ajoutées pour l'étendre jusqu'à 20 octets." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"Interrompt le téléchargement du BitTorrent si la vitesse de téléchargement " +"est à 0 pendant N secondes consécutives. Si définit à 0, cette " +"fonctionnalité sera désactivée." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Délai d'interruption" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Le service Aria2 n'est pas en cours d'exécution." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Le service Aria2 est en cours d'exécution." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" +"Répertoire dans lequel stocker le fichier de configuration, le fichier de " +"session et le fichier DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" +"Le répertoire pour stocker le fichier téléchargé. Par exemple /mnt/" +"sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "Nom de fichier du fichier de journal." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "Nombre maximum de connexions à un serveur pour chaque téléchargement." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" +"Cette option sera ignorée si un drapeau privé est défini dans un torrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Délai d'attente" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "Vrai" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Utilise un serveur proxy pour tous les protocoles." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Utilise les autorités de certification dans FILE pour vérifier les pairs. Le " +"fichier de certificat doit être dans le format PEM et peut contenir " +"plusieurs certificats CA." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"Utilisez le certificat dans le FICHIER pour le serveur RPC. Le certificat " +"doit être au format PKCS12 (.p12, .pfx) ou au format PEM.
    Les fichiers " +"PKCS12 doivent contenir le certificat, une clé et éventuellement une chaîne " +"de certificats supplémentaires. Seuls les fichiers PKCS12 avec un mot de " +"passe d'importation vide peuvent être ouverts!
    Lorsque vous utilisez " +"PEM, vous devez également spécifier la \"clé privée RPC\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Utilisez le certificat client dans FILE. Le certificat doit être au format " +"PKCS12 (.p12, .pfx) ou au format PEM.
    Les fichiers PKCS12 doivent " +"contenir le certificat, une clé et éventuellement une chaîne de certificats " +"supplémentaires. Seuls les fichiers PKCS12 avec un mot de passe " +"d'importation vide peuvent être ouverts!
    Lorsque vous utilisez PEM, vous " +"devez également spécifier la \"clé privée\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"Utilise la clé privée dans FILE pour le serveur RPC. La clé privée doit être " +"déchiffrée et au format PEM." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Utilise la clé privée dans FILE. La clé privée doit être déchiffrée et au " +"format PEM. Si la clé est chiffrée, elle ne sera pas définie." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "Agent utilisateur" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Nom d'utilisateur et mot de passe" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"Vérifie si le pair utilise les certificats spécifiés dans l'option « " +"Certificats CA »." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Avertir" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "Vous pouvez ajouter K ou M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "pré-allocation" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/he/aria2.po b/package/luci/applications/luci-app-aria2/po/he/aria2.po new file mode 100644 index 0000000000..669287bba0 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/he/aria2.po @@ -0,0 +1,784 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-01-15 22:31+0000\n" +"Last-Translator: Yaron Shahrabani \n" +"Language-Team: Hebrew \n" +"Language: he\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " +"n % 10 == 0) ? 2 : 3));\n" +"X-Generator: Weblate 4.5-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "נאספים נתונים…" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "הגדרות" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "הגדרות" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/hi/aria2.po b/package/luci/applications/luci-app-aria2/po/hi/aria2.po new file mode 100644 index 0000000000..d899dbf8bf --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/hi/aria2.po @@ -0,0 +1,777 @@ +msgid "" +msgstr "" +"Language: hi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/hu/aria2.po b/package/luci/applications/luci-app-aria2/po/hu/aria2.po new file mode 100644 index 0000000000..bea68d5558 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/hu/aria2.po @@ -0,0 +1,903 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-12-14 00:53+0000\n" +"Last-Translator: Gajdos Tamás \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.15-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD engedélyezve" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "További BT követő" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Speciális beállítások" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Összes proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "FEJLÉCEK hozzáfűzése a HTTP kérés fejlécéhez." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Az Aria2 egy könnyűsúlyú, többprotokollos és többforrásos, keresztplatformos " +"letöltési segédprogram." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Automatikus mentés időköze" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Alapvető beállítások" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "BitTorrent beállítások" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "BitTorrent figyelési port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "CA tanúsítvány" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Tanúsítvány" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Tanúsítvány ellenőrzése" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Kapcsolat lezárása, ha a letöltési sebesség kisebb vagy egyenlő ezzel az " +"értékkel (bájt/másodperc). A 0 azt jelenti, hogy nincs legalacsonyabb " +"sebességkorlát." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Adatok összegyűjtése…" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Beállítófájl könyvtára" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Beállítás" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Kapcsolat időkorlátja" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Beállítófájl tartalma: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Munkamenetfájl tartalma: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "DHT figyelési port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Hibakeresés" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"IPv6 letiltása. Ez akkor hasznos, ha törött DNS-t kell használnia, és el " +"szeretné kerülni a borzasztóan lassú AAAA rekord keresést." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Lemezgyorsítótár" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" +"Ne osszon fel 2×MÉRETNÉL kisebb bájttartományt. Lehetséges értékek: 1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Egy fájl letöltése N kapcsolat használatával." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Letöltési könyvtár" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" +"IPv4 DHT funkcionalitás engedélyezése. Engedélyezi az UDP követő támogatását " +"is." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "IPv6 DHT funkcionalitás engedélyezése." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Helyi partnerfelderítés engedélyezése." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Partnerkicserélés kiterjesztés engedélyezése." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" +"Lemezgyorsítótár engedélyezése (bájtban). Állítsa 0 értékre a letiltásához." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Naplózás engedélyezése" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Partnerkicserélés engedélyezése" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Proxy engedélyezése" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Engedélyezve" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Hiba" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "További beállítások" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Hamis" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Fájllefoglalás" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Fájlok" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Torrent követése" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "További információért látogassa meg: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Mentés kényszerítése" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Előállítás véletlenszerűen" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "UCI hozzáférés megadása a luci-app-aria2 alkalmazásnak" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP elfogad gzip-et" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP nincs gyorsítótár" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "HTTP/FTP/SFTP beállítások" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Fejléc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Itt jeleníti meg az aria2 által használt fájlokat." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "IPv4 DHT engedélyezve" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "IPv6 DHT engedélyezve" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "IPv6 letiltva" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Ha az egyes torrentek teljes letöltési sebessége kisebb mint SEBESSÉG, akkor " +"az aria2 átmenetileg megnöveli a partnerek számát, hogy nagyobb letöltési " +"sebességet próbáljon. Ennek a beállításnak az előnyben részesített letöltési " +"sebességgel történő beállítása megnövelheti a letöltési sebességet néhány " +"esetben." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Információ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Telepített webes felület:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "Json-RPC URL" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Memóriában tartás" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "A naplófájl utolsó 50 sora:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "A rendszernapló utolsó 50 sora:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Hagyja üresen az alapértelmezett felhasználó használatához." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "További BitTorrent követő bejelentési URI-jának listája." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"További beállítások listája. Formátum: beállítás=érték, például netrc-" +"path=/tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Betöltés" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Napló" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Naplóadatok" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Naplófájl" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Naplózási szint" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Legalacsonyabb sebességkorlát" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Legtöbb egyidejű letöltés" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Kiszolgálónkénti legtöbb kapcsolat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Legnagyobb letöltési korlát" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Felosztások legnagyobb száma" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Legtöbb nyitott fájl" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Legnagyobb összesített letöltési korlát" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Legnagyobb összesített feltöltési korlát" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Legtöbb partner" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Legtöbb próbálkozás" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Legnagyobb feltöltési korlát" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Legkisebb felosztási méret" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Nincs hitelesítés" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Nincsenek naplóadatok." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Nincs" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Figyelmeztetés" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Szüneteltetés" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Letöltés szüneteltetése hozzáadás után." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" +"A metaadatok letöltésének eredményeként létrehozott letöltések " +"szüneteltetése." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Metaadatok szüneteltetése" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Írja be a token hosszát:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Partnerazonosító előtagja" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Személyes kulcs" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Proxy jelszava" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Proxy felhasználó" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "RPC beállítások" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "RPC hitelesítési módszer" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "RPC tanúsítvány" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC jelszó" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "RPC személyes kulcs" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC biztonság" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "RPC token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"Az RPC átvitel titkosítva lesz SSL/TLS használatával. Az RPC ügyfeleknek " +"https sémát kell használniuk a kiszolgáló eléréséhez. WebSocket klienseknél " +"használjon wss sémát." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "RPC felhasználónév" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Frissítés minden %s másodpercben." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Nem kiválasztott fájlok eltávolítása" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Eltávolítja a nem kiválasztott fájlokat, ha a letöltés befejeződött a " +"BitTorrentben. Óvatosan használja ezt a beállítást, mert ténylegesen el " +"fogja távolítani a fájlokat a lemezről." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Partner-sebességkorlát kérése" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Újrapróbálás várakozása" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Démon futtatása felhasználóként" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Futási állapot" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Vezérlőfájl (*.aria2) mentése N másodpercenként. Ha 0 van megadva, akkor a " +"vezérlőfájl nem lesz elmentve a letöltés során." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Letöltés mentése munkamenetfájlba, akkor is ha a letöltés befejeződött vagy " +"eltávolították. Ez a beállítás elmenti a vezérlőfájlt is abban az esetben. " +"Ez hasznos lehet olyan BitTorrent megosztás mentéséhez, amely befejezett " +"állapotként van felismerve." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Hibás vagy befejezetlen letöltések mentése munkamenetfájlba N " +"másodpercenként. Ha 0 van megadva, akkor a fájl csak akkor lesz mentve, ha " +"az aria2 kilép." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Metaadatok mentése „.torrent” fájlként. Ennek a beállításnak csak akkor van " +"hatása, ha BitTorrent mágnes URI-t használnak. A fájlnév hexadecimálisan " +"kódolt információs kivonat „.torrent” utótaggal." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Metaadatok mentése" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Munkamenet mentési időköze" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" +"Előzőleg letöltött fájlok megosztása a darabok kivonatainak ellenőrzése " +"nélkül." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Megosztási arány" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Megosztási idő" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Ellenőrizetlen megosztása" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Az Accept: deflate, gzip kérésfejléc küldése és a válasz " +"kibővítése, ha a távoli kiszolgáló Content-Encoding: gzip vagy " +"Content-Encoding: deflate választ küld." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"A Cache-Control: no-cache és Pragma: no-cache " +"fejléc küldése a gyorsítótárazott tartalom elkerüléséhez. Ha le van tiltva, " +"akkor ezek a fejlécek nem lesznek elküldve, és hozzáadhatja a „Cache-" +"Control” fejlécet azzal az irányelvvel, amelyet használni szeretne „Header” " +"beállításként." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"TCP portszám beállítása a BitTorrent letöltésekhez. Elfogadott formátum: " +"„6881,6885”, „6881-6999” és „6881-6889,6999”. Győződjön meg arról, hogy a " +"megadott portok nyitva vannak-e a bejövő TCP forgalomhoz." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"A DHT (IPv4, IPv6) és az UDP követő által használt UDP figyelési port " +"beállítása. Győződjön meg arról, hogy a megadott portok nyitva vannak-e a " +"bejövő UDP forgalomhoz." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Legnagyobb letöltési sebesség beállítása az egyes letöltéseknél bájt/" +"másodpercben. A 0 azt jelenti, hogy korlátlan." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Legnagyobb összesített letöltési sebesség beállítása bájt/másodpercben. A 0 " +"azt jelenti, hogy korlátlan." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Legnagyobb összesített feltöltési sebesség beállítása bájt/másodpercben. A 0 " +"azt jelenti, hogy korlátlan." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Legnagyobb feltöltési sebesség beállítása az egyes torrenteknél bájt/" +"másodpercben. A 0 azt jelenti, hogy korlátlan." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Kapcsolat időkorlátjának beállítása másodpercben a HTTP/FTP/" +"proxykiszolgálóval történő kapcsolatkiépítéshez. Miután a kapcsolat kiépült, " +"ennek a beállításnak nincs hatása, és az „Időkorlát” beállítás lesz " +"használva helyette." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Az újrapróbálások közti várakozás másodperceinek beállítása." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Felhasználói ügynök beállítása a HTTP(S) letöltésekhez." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Beállítások" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" +"Az ebben a szakaszban lévő beállítások hozzá lesznek adva a beállítófájlhoz." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Beállítások listája" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Fájllefoglalási módszer meghatározása. Ha újabb fájlrendszereket használ, " +"mint például ext4 (kiterjesztések támogatásával), btrfs, xfs vagy NTFS (csak " +"MinGW összeállítás), akkor a „falloc” a legjobb választás. A nagy (néhány " +"GiB méretű) fájlokat szinte azonnal lefoglalja, de esetleg nem érhető el, ha " +"a rendszerének nincs posix_fallocate(3) függvénye. Ne használja a „falloc” " +"lehetőséget örökölt fájlrendszerekkel, mint például ext3 és FAT32, mert " +"nagyjából ugyanannyi ideig tart mint a „prealloc”, és teljesen blokkolja az " +"aria2 programot, amíg a lefoglalás be nem feleződik." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Többfájlos BitTorrent letöltésben megnyitandó fájlok legnagyobb számának " +"megadása globálisan." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Megosztási idő megadása percben. Ha a „Megosztási arány” beállítás meg van " +"adva ezzel a beállítással együtt, akkor a megosztás befejeződik, ha a " +"feltételek legalább egyike kielégítésre kerül. A 0 megadása letiltja a " +"megosztást a letöltés befejezése után." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Megosztási arány meghatározása. Befejezett torrentek megosztása, amíg a " +"megosztási arány el nem éri az ARÁNYT. Nyomatékosan kérjük, hogy legalább " +"1,0 értéket adjon meg itt. Akkor adjon meg 0,0 értéket, ha a megosztási " +"aránytól függetlenül szeretne megosztani." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" +"A partnerek legnagyobb számának megadása torrentenként. A 0 azt jeleni, hogy " +"korlátlan." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"A partnerazonosító előtagjának megadása. A BitTorrentben lévő " +"partnerazonosító 20 bájt hosszúságú. Ha több mint 20 bájt van megadva, akkor " +"csak az első 20 bájt lesz használva. Ha kevesebb mint 20 bájt van megadva, " +"akkor véletlenszerű bájtadatok lesznek hozzáadva, hogy kiegészítsék a " +"hosszát 20 bájtra." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"BitTorrent letöltés leállítása, ha a letöltési sebesség 0 az egymást követő " +"N másodpercben. Ha 0 van megadva, akkor ez a funkció le van tiltva." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Leállítás időkorlátja" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Az Aria2 szolgáltatás nem fut." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Az Aria2 szolgáltatás fut." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "A könyvtár a beállítófájl, a munkamenetfájl és a DHT-fájl tárolásához." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" +"A könyvtár a letöltött fájl tárolásához. Például /mnt/sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "A naplófájl fájlneve." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" +"A kapcsolatok legnagyobb száma egy kiszolgálóhoz az egyes letöltéseknél." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" +"Ez a beállítás figyelmen kívül lesz hagyva, ha személyes jelző van beállítva " +"egy torrentben." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Időkorlát" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "Igaz" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Proxykiszolgáló használata az összes protokollnál." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"A FÁJLBAN lévő hitelesítésszolgáltató használata a partnerek ellenőrzéséhez. " +"A tanúsítványfájlnak PEM formátumban kell lennie és tartalmazhat több CA " +"tanúsítványt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"A FÁJLBAN lévő tanúsítvány használata az RPC kiszolgálóhoz. A tanúsítványnak " +"vagy PKCS12 (.p12, .pfx), vagy PEM formátumban kell lennie.
    A PKCS12 " +"fájloknak tartalmazniuk kell a tanúsítványt, egy kulcsot és esetlegesen a " +"további tanúsítványok láncát. Csak az üres importálási jelszóval rendelkező " +"PKCS12 fájlok nyithatók meg!
    PEM használatakor meg kell adnia az „RPC " +"személyes kulcsot” is." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"A FÁJLBAN lévő ügyféltanúsítvány használata. A tanúsítványnak vagy PKCS12 (." +"p12, .pfx), vagy PEM formátumban kell lennie.
    A PKCS12 fájloknak " +"tartalmazniuk kell a tanúsítványt, egy kulcsot és esetlegesen a további " +"tanúsítványok láncát. Csak az üres importálási jelszóval rendelkező PKCS12 " +"fájlok nyithatók meg!
    PEM használatakor meg kell adnia a „Személyes " +"kulcsot” is." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"A FÁJLBAN lévő személyes kulcs használata az RPC kiszolgálóhoz. A személyes " +"kulcsnak visszafejtve és PEM formátumban kell lennie." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"A személyes kulcs használata a FÁJLBAN. A személyes kulcsnak visszafejtve és " +"PEM formátumban kell lennie. Nincs meghatározva a viselkedés, ha titkosított " +"kulcs van megadva." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "Felhasználói ügynök" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Felhasználónév és jelszó" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"A „CA tanúsítvány” beállításban meghatározott tanúsítványokat használó " +"partner ellenőrzése." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Figyelmeztetés" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "Hozzáfűzhet K vagy M értéket." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/it/aria2.po b/package/luci/applications/luci-app-aria2/po/it/aria2.po new file mode 100644 index 0000000000..586290cff0 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/it/aria2.po @@ -0,0 +1,896 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-08-05 15:50+0000\n" +"Last-Translator: random r \n" +"Language-Team: Italian \n" +"Language: it\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD attivato" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Tracker BT aggiuntivo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Opzioni avanzate" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Tutti i proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Aggiungi gli HEADER all'header della richiesta http." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2 è uno strumento di download leggero, multi-protocollo, multi-sorgente " +"e multipiattaforma." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Intervallo salvataggio automatico" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Opzioni di base" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Opzioni BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "Porta in ascolto di BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Certificato CA" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Certificato" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Controlla il certificato" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Chiudi la connessione se la velocità di download è minore o uguale a questo " +"valore (byte al secondo). 0 significa che il limite non è applicato." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Raccolta dei dati..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Cartella file di configurazione" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Configurazione" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Timeout di connessione" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Contenuto del file di configurazione: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Contenuto del file di sessione: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "Porta in ascolto per DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Debug" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Disattiva IPv6. Questa opzione è utile se si deve usare un DNS non " +"funzionante e si vuole evitare una ricerca del record AAAA terribilmente " +"lenta." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Cache disco" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "Non dividere meno di 2 * SIZE byte. Valori possibili: 1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Scarica un file usando N connessioni." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Cartella download" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" +"Attiva funzionalità IPv4 DHT. Attiva anche il supporto per tracker UDP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Attiva funzionalità IPv6 DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Attiva Local Peer Discovery." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Attiva estensione Peer Exchange." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Attiva la cache su disco (in bytes), 0 per disattivare." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Attiva registro eventi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Attiva scambio dei peer" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Attiva proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Attivato" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Errore" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Impostazioni extra" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Falso" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Allocazione file" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "File" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Segui il torrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Per ulteriori informazioni, visita: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Forza il salvataggio" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Genera casualmente" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Concedi l'accesso a UCI per luci-app-aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP accetta gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP no cache" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "Opzioni HTTP/FTP/SFTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Header" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Qua sono mostrati i file usati da aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "IPv4 DHT attivato" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "IPv6 DHT attivato" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "IPv6 disattivato" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Se l'intera velocità di download di ogni torrent è inferiore a SPEED, aria2 " +"aumenta temporaneamente il numero di peer da provare per una maggiore " +"velocità di download. Configurare questa opzione con la velocità di download " +"preferita può aumentare la velocità di download in alcuni casi." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Info" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "interfaccia web installata:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "URL Json-RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Tieni in memoria" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "Ultime 50 righe del file di registro:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "Ultime 50 righe di syslog:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Lascia vuoto per usare l'utente predefinito." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Elenco di ulteriori URI di annuncio del tracker BitTorrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Lista di impostazioni extra. Formato: option=value, eg. netrc-path=/" +"tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Caricamento" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Registro eventi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Dati registro eventi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "File registro eventi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Livello registro eventi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Limite di velocità più basso" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Download simultanei massimi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Connessioni massime per server" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Limite massimo di download" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Numero massimo di divisioni" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Numero massimo di file aperti" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Limite massimo di download complessivo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Limite massimo di caricamento complessivo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "N° max di peer" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "N° max di tentativi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Limite massimo di caricamento" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Dimensione minima di divisione" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Senza autenticazione" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Nessun dato nel registro." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Nessuno" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Avviso" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Pausa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Metti in pausa il download dopo l'aggiunta." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "Metti in pausa i download creati a seguito del download dei metadati." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Pausa metadati" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Inserisci la lunghezza del token:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Prefisso dell'ID peer" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Chiave privata" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Password del proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Utente del proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "Opzioni RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "Metodo di autenticazione RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "Certificato RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "Password RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "Porta RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "Chiave privata RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC sicuro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "Token RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"Il trasporto RPC sarà crittografato da SSL/TLS. I client RPC devono usare lo " +"schema https per accedere al server. Per il client WebSocket, usare lo " +"schema wss." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "Nome utente RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Aggiorna ogni %s secondi." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Rimuovi file non selezionati" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Rimuove i file non selezionati al termine del download in BitTorrent. Si " +"prega di utilizzare questa opzione con attenzione perché rimuoverà " +"effettivamente i file dal disco." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Richiedi limite di velocità del peer" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Tempo di attesa tra tentativi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Esegui il demone come utente" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Stato di esecuzione" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Salva un file di controllo (*.aria2) ogni N secondi. Se viene fornito 0, il " +"file di controllo non viene salvato durante il download." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Salva il download nel file di sessione anche se il download è stato " +"completato o rimosso. Questa opzione salva anche il file di controllo in " +"quelle situazioni. Questo può essere utile per salvare il seeding di " +"BitTorrent che viene riconosciuto come stato completato." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Salva gli errori/download non completati nel file di sessione ogni N " +"secondi. Se viene fornito il valore 0, il file verrà salvato solo quando " +"aria2 viene chiuso." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Salva i metadati come file \".torrent\". Questa opzione ha effetto solo " +"quando viene usato un BitTorrent Magnet URI. Il nome del file è l'info hash " +"codificato in esadecimale con il suffisso \".torrent\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Salva i metadati" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Salva intervallo di sessione" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" +"Condividi i file precedentemente scaricati senza verificare gli hash delle " +"parti." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Rapporto di condivisione" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Tempo di condivisione" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Condividi non verificati" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Invia l'intestazione di richiesta Accept: deflate, gzip e " +"decomprimi la risposta se il server remoto risponde con Content-" +"Encoding: gzip o Content-Encoding: deflate." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Invia l'intestazione Cache-Control: no-cache e Pragma: no-" +"cache per evitare contenuti in cache. Se disabilitato, queste " +"intestazioni non vengono inviate e puoi aggiungere l'intestazione Cache-" +"Control con la direttiva desiderata utilizzando l'opzione \"Header\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"Imposta il numero di porta TCP per i download BitTorrent. Accetta formati " +"come \"6881,6885\", \"6881-6999\" e \"6881-6889,6999\". Assicurati che le " +"porte specificate siano aperte per il traffico TCP in entrata." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"Imposta la porta di ascolto UDP utilizzata da DHT (IPv4, IPv6) e il tracker " +"UDP. Assicurati che le porte specificate siano aperte per il traffico UDP in " +"entrata." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Imposta la velocità massima di download per ogni download in byte/secondo. 0 " +"significa senza restrizioni." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Imposta la velocità massima complessiva di download in byte/secondo. 0 " +"significa senza restrizioni." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Imposta la velocità massima complessiva di upload in byte/secondo. 0 " +"significa senza restrizioni." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Imposta la velocità massima di upload per ogni torrent in byte/secondo. 0 " +"significa senza restrizioni." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Imposta il timeout di connessione in secondi per stabilire la connessione al " +"server HTTP/FTP/proxy. Dopo che la connessione è stata stabilita, questa " +"opzione non ha effetto e viene utilizzata l'opzione \"Timeout\" al suo posto." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Imposta il numero di secondi da attendere tra i tentativi di riprova." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Imposta l'user agent per i download HTTP(S)." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Impostazioni" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" +"Le impostazioni in questa sezione saranno aggiunte al file di configurazione." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Elenco impostazioni" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Specificare il metodo di allocazione dei file. Se si utilizzano i file " +"system più recenti, come ext4 (con il supporto degli extent), btrfs, xfs o " +"NTFS (solo per la versione MinGW), \"falloc\" è la scelta migliore. Alloca " +"file di grandi dimensioni (pochi GiB) quasi istantaneamente, ma potrebbe non " +"essere disponibile se il vostro sistema non ha la funzione " +"posix_fallocate(3). Non usate \"falloc\" con i file system tradizionali, " +"come ext3 e FAT32, perché impiega quasi lo stesso tempo di \"prealloc\" e " +"blocca completamente aria2 fino al termine dell'allocazione." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Specificare il numero massimo di file da aprire nel download multi-file di " +"BitTorrent a livello globale." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Specificare il tempo di condivisione in minuti. Se l'opzione \"Rapporto di " +"condivisione\" è specificata insieme a questa opzione, la condivisione " +"termina quando almeno una delle condizioni è soddisfatta. Specificando 0 si " +"disattiva la condivisione al termine del download." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Specificare il rapporto di condivisione. Condividi i torrent completati " +"finché il rapporto di condivisione non raggiunge il valore RATIO. Si " +"consiglia vivamente di specificare qui un valore uguale o superiore a 1,0. " +"Specificare 0.0 se si intende eseguire la condivisione indipendentemente dal " +"rapporto di condivisione." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" +"Specificare il numero massimo di peer per torrent, 0 significa illimitato." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Specificare il prefisso dell'ID peer. L'ID peer in BitTorrent ha una " +"lunghezza di 20 byte. Se vengono specificati più di 20 byte, vengono " +"utilizzati solo i primi 20 byte. Se sono specificati meno di 20 byte, " +"vengono aggiunti byte casuali per raggiungere la lunghezza di 20 byte." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"Interrompe il download di BitTorrent se la velocità di download è 0 per N " +"secondi consecutivi. Se viene dato 0, questa funzione è disabilitata." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Timeout di arresto" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Il servizio Aria2 non è in esecuzione." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Il servizio Aria2 è in esecuzione." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" +"La directory in cui memorizzare il file di configurazione, il file di " +"sessione e il file DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" +"La directory in cui memorizzare il file scaricato. Per esempio /mnt/" +"sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "Il nome del file di log." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" +"Il numero massimo di connessioni ad un singolo server per ogni download." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" +"Questa opzione viene ignorata se in un torrent è impostato un flag privato." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Scadenza" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "True" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Usa un server proxy per tutti i protocolli." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Utilizzare le autorità di certificazione presenti nel FILE per verificare i " +"peer. Il file del certificato deve essere in formato PEM e può contenere più " +"certificati CA." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"Utilizzare il certificato in FILE per il server RPC. Il certificato deve " +"essere in formato PKCS12 (.p12, .pfx) o in formato PEM.
    I file PKCS12 " +"devono contenere il certificato, una chiave ed eventualmente una catena di " +"certificati aggiuntivi. È possibile aprire solo i file PKCS12 con una " +"password di importazione vuota!
    Quando si utilizza PEM, è necessario " +"specificare anche la \"chiave privata RPC\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Utilizzare il certificato del client in FILE. Il certificato deve essere in " +"formato PKCS12 (.p12, .pfx) o in formato PEM.
    I file PKCS12 devono " +"contenere il certificato, una chiave ed eventualmente una catena di " +"certificati aggiuntivi. È possibile aprire solo i file PKCS12 con una " +"password di importazione vuota!
    Quando si utilizza PEM, è necessario " +"specificare anche la \"Chiave privata\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"Utilizzare la chiave privata in FILE per il server RPC. La chiave privata " +"deve essere decifrata e in formato PEM." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Utilizzare la chiave privata in FILE. La chiave privata deve essere " +"decifrata e in formato PEM. Il comportamento se viene fornita una chiave " +"criptata è indefinito." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "User agent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Nome utente e password" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"Verificare il peer utilizzando i certificati specificati nell'opzione " +"\"Certificato CA\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Avviso" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "È possibile aggiungere K o M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/ja/aria2.po b/package/luci/applications/luci-app-aria2/po/ja/aria2.po new file mode 100644 index 0000000000..22f61a7709 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/ja/aria2.po @@ -0,0 +1,789 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2020-12-10 19:29+0000\n" +"Last-Translator: Ryota <21ryotagamer@gmail.com>\n" +"Language-Team: Japanese \n" +"Language: ja\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.4-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD2を有効" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "追加のBTトラッカー" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "詳細オプション" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "すべてのプロキシ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "HTTPリクエストヘッダーにHEADERを追加します。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2は、軽量のマルチプロトコル&マルチソース、クロスプラットフォームのダ" +"ウンロードユーティリティです。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "自動保存間隔" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "基本オプション" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "BitTorrentオプション" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "BitTorrentリッスンポート" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "CA証明書" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "証明書" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "証明書をチェック" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"ダウンロード速度がこの値(バイト/秒)以下の場合は接続を終了します。最低速度の" +"制限を無効にするには、0を設定します。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "データを収集中..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "コンフィグファイル・ディレクトリ" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "設定" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "接続タイムアウト" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "設定ファイルの内容: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "セッションファイルの内容: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "DHTリッスンポート" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "デバッグ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"IPv6を無効にします。壊れた DNS を使用する必要があり、AAAA レコード検索が非常" +"に遅くなる場合に便利です。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "ディスク・キャッシュ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "ダウンロード先のディレクトリ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "ログの有効化" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "プロキシーを有効にする" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "有効" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "エラー" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "追加設定" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "ファイル" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "強制保存" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "ランダムに生成" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "luci-app-aria2にUCIアクセスを許可" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "ヘッダ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "情報" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "ログファイルの最後の 50 行 :" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "syslog の最後の 50 行 :" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "読み込み中" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "ログ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "ログファイル" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "ログレベル" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "サーバーごとの最大接続数" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "ログデータがありません。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "なし" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "注意" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "一時停止" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "追加後にダウンロードを一時停止します。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC パスワード" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC ポート" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "RPC ユーザー名" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "デーモンをユーザーとして実行" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "メタデータを保存" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "セッション保存間隔" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "設定" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Aria2 サービスは実行されていません。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Aria2 サービスは実行中です。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "ログファイルのファイル名です。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "タイムアウト" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "トークン" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "ユーザー名とパスワード" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "警告" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/ko/aria2.po b/package/luci/applications/luci-app-aria2/po/ko/aria2.po new file mode 100644 index 0000000000..cf2a9c8d33 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/ko/aria2.po @@ -0,0 +1,783 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-12-27 13:49+0000\n" +"Last-Translator: somni \n" +"Language-Team: Korean \n" +"Language: ko\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.15.1-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "데이터 수집 중..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "설정" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "디버그" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "활성화" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "에러" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "정보" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "불러오는 중" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "로그 파일" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "시간초과" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/lt/aria2.po b/package/luci/applications/luci-app-aria2/po/lt/aria2.po new file mode 100644 index 0000000000..dfd47cef98 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/lt/aria2.po @@ -0,0 +1,790 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-12-13 15:09+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.3-rc\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "„LPD“ įjungtas/-a" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Papildomas „BT sekiklis“" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Pažangūs pasirinkimai" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "„Aria2“" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Automatiško išsaugojimo intervalas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Įprasti pasirinkimai" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "„BitTorrent“ pasirinkimai" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "„BitTorrent“ klausimosi prievadas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "„CA“ sertifikatas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Sertifikatas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Patikrinti sertifikatą" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Renkama informacija (data)..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Konfigūracijos failo katalogas" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Konfigūravimas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Konfigūracijos failo turinys: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Sesijos failo turinys: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Disko talpykla" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Atsisiuntimo katalogas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Įjungta" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Klaida" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Papildomi nustatymai" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Failai" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Suteikti „UCI“ prieigą – „luci-app-aria2“" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "„HTTP“/„FTP“/„SFTP“ parinktys" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Info" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "„Json-RPC URL“" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Laikyti atmintyje" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Kraunama" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Žurnalas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Žurnalo duomenys" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Žurnalo failas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Žurnalo lygis" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Nėra žurnalo duomenų." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Joks" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Pranešimas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Pauzė" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Sustabdyti atsisiuntimą po pridėjimo." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Privatus raktas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "„RPC“ parinktys" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "„RPC“ autentifikavimo metodas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "„RPC“ sertifikatas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "„RPC“ slaptažodis" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "„RPC“ prievadas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "„RPC“ privatus raktas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "„RPC“ apsaugotas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "„RPC“ žetonas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Pašalinti nepasirinktą failą" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Siųsti Priimti: „deflate“, „gzip“ prašyti antraštes ir įspausti " +"atsakymą, jeigu nuotolinis serveris atsako su „Content-Encoding: " +"gzip“ ar „Content-Encoding: deflate“." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Nustatymai" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Nustatymų sąrašas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "„Aria2“ tarnyba neveikia." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "„Aria2“ tarnyba veikia." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Pasibaigė užklausos laikas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Žetonas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Įspėti" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "„falloc“" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "„prealloc“" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "„trunc“" diff --git a/package/luci/applications/luci-app-aria2/po/mr/aria2.po b/package/luci/applications/luci-app-aria2/po/mr/aria2.po new file mode 100644 index 0000000000..1766ff6aaa --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/mr/aria2.po @@ -0,0 +1,783 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2020-01-29 21:15+0000\n" +"Last-Translator: Prachi Joshi \n" +"Language-Team: Marathi \n" +"Language: mr\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.11-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "डेटा संकलित करीत आहे ..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "कॉन्फिगरेशन" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "सक्षम केले" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "लोड करीत आहे" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "नोंद" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "लॉग फाइल" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "एकही नाही" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "सेटिंग्ज" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "वेळ संपला" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/ms/aria2.po b/package/luci/applications/luci-app-aria2/po/ms/aria2.po new file mode 100644 index 0000000000..2557e9fa30 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/ms/aria2.po @@ -0,0 +1,783 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-03-31 12:26+0000\n" +"Last-Translator: Faruki Ramly \n" +"Language-Team: Malay \n" +"Language: ms\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.6-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Mengumpul data..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Konfigurasi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/nb_NO/aria2.po b/package/luci/applications/luci-app-aria2/po/nb_NO/aria2.po new file mode 100644 index 0000000000..a9a62dad21 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/nb_NO/aria2.po @@ -0,0 +1,783 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-11-02 07:03+0000\n" +"Last-Translator: averageperson \n" +"Language-Team: Norwegian Bokmål \n" +"Language: nb_NO\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.2-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Samler inn data…" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Oppsett" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Aktivert" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Feil" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Info" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Laster inn" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC-passord" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC-port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "RPC-brukernavn" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Kjør nisse som bruker" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Innstillinger" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Tidsavbrudd" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/nl/aria2.po b/package/luci/applications/luci-app-aria2/po/nl/aria2.po new file mode 100644 index 0000000000..60fe35de45 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/nl/aria2.po @@ -0,0 +1,897 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-05-06 12:52+0000\n" +"Last-Translator: xtz1983 \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD ingeschakeld" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Extra BT-tracker" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Geavanceerde Opties" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Alles proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Voeg HEADERs toe aan de HTTP request header." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2 is een lightweight multi-protocol & multi-source, cross platform " +"download hulpprogramma." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Interval voor automatisch opslaan" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Eenvoudige Opties" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "BitTorrent Opties" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "BitTorrent luisterpoort" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "CA certificaat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Certificaat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Certificaat controleren" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Verbreek de verbinding als de downloadsnelheid lager is dan of gelijk aan " +"deze waarde (bytes per seconde). 0 betekent dat er geen laagste " +"snelheidslimiet is." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Gegevens verzamelen..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Configuratiebestanden directory" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Configuratie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Time-out verbinding" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Inhoud van configuratiebestand: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Inhoud van sessiebestand: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "DHT Luisterpoort" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Debuggen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Schakel IPv6 uit. Dit is handig als u gebroken DNS moet gebruiken en " +"vreselijk traag zoeken naar AAAA-records wilt voorkomen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Schijfcache" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "Splits niet minder dan 2*SIZE bytebereik. Mogelijke waarden: 1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Download een bestand met N verbindingen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Directory downloaden" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" +"Schakel IPv4 DHT-functionaliteit in. Het maakt ook UDP-trackerondersteuning " +"mogelijk." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "IPv6 DHT-functionaliteit inschakelen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Local Peer Discovery inschakelen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Peer Exchange-extensie inschakelen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Schakel schijfcache in (in bytes), stel 0 in op uitgeschakeld." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Logging inschakelen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Peer uitwisseling inschakelen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Proxy inschakelen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Ingeschakeld" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Fout" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Extra instellingen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Vals" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Bestandstoewijzing" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Bestanden" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Volg torrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Ga voor meer informatie naar: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Forceer opslaan" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Willekeurig genereren" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Verleen UCI-toegang voor luci-app-aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP accepteert gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP geen cache" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "HTTP/FTP/SFTP-opties" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Koptekst" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Hier ziet u de bestanden die door aria2 worden gebruikt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "IPv4 DHT ingeschakeld" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "IPv6 DHT ingeschakeld" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "IPv6 uitgeschakeld" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Als de volledige downloadsnelheid van elke torrent lager is dan SPEED, " +"verhoogt aria2 tijdelijk het aantal peers om te proberen voor meer " +"downloadsnelheid. Als u deze optie configureert met uw gewenste " +"downloadsnelheid, kan uw downloadsnelheid in sommige gevallen worden " +"verhoogd." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Info" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Geïnstalleerde webinterface:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "Json-RPC-URL" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Bewaar in het geheugen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "Laatste 50 regels logbestand:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "Laatste 50 regels van syslog:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Laat leeg om de standaardgebruiker te gebruiken." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Lijst met aankondigings-URI van extra BitTorrent-tracker." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Lijst met extra instellingen. Formaat: optie=waarde, bijv. netrc-pad=/" +"tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Laden" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Logboek" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Loggegevens" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Logbestand" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Logboek niveau" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Laagste snelheidslimiet" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Maximale gelijktijdige downloads" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Maximale verbinding per server" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Maximale downloadlimiet" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Max aantal splitsingen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Maximaal aantal geopende bestanden" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Maximale totale downloadlimiet" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Maximale totale uploadlimiet" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Max collega's" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Max probeert" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Maximale uploadlimiet" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Minimale splitgrootte" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Geen authenticatie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Geen loggegevens." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Geen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Kennisgeving" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Pauze" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Pauzeer het downloaden na het toevoegen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" +"Pauzeer downloads die zijn gemaakt als gevolg van het downloaden van " +"metadata." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Metagegevens onderbreken" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Voer de tokenlengte in:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Prefix van peer-ID" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Privé sleutel" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Proxy wachtwoord" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Proxy-gebruiker" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "RPC-opties" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "RPC-authenticatiemethode" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "RPC certificaat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC-wachtwoord" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC-poort" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "RPC-privésleutel" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC veilig" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "RPC-token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"RPC-transport wordt versleuteld met SSL/TLS. De RPC-clients moeten het https-" +"schema gebruiken om toegang te krijgen tot de server. Gebruik het wss-schema " +"voor de WebSocket-client." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "RPC-gebruikersnaam" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Ververs elke %s seconden." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Verwijder niet-geselecteerd bestand" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Verwijdert de niet-geselecteerde bestanden wanneer het downloaden is " +"voltooid in BitTorrent. Gebruik deze optie met zorg, want het zal " +"daadwerkelijk bestanden van uw schijf verwijderen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Verzoek om peer-snelheidslimiet" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Wacht opnieuw" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Voer daemon uit als gebruiker" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Lopende status" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Sla elke N seconden een controlebestand (*.aria2) op. Als 0 wordt gegeven, " +"wordt er tijdens het downloaden geen controlebestand opgeslagen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Sla de download op in het sessiebestand, zelfs als de download is voltooid " +"of verwijderd. Deze optie slaat in die situaties ook het controlebestand op. " +"Dit kan handig zijn om BitTorrent seeding op te slaan die als voltooid wordt " +"herkend." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Sla elke N seconden foutieve/onvoltooide downloads op in het sessiebestand. " +"Als 0 wordt gegeven, wordt het bestand alleen opgeslagen wanneer aria2 wordt " +"afgesloten." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Sla metagegevens op als \".torrent\"-bestand. Deze optie heeft alleen effect " +"wanneer BitTorrent Magnet URI wordt gebruikt. De bestandsnaam is hex-" +"gecodeerde info-hash met achtervoegsel \".torrent\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Metagegevens opslaan" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Sessie-interval opslaan" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "Seed eerder gedownloade bestanden zonder stuk-hashes te verifiëren." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Seed verhouding" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Seed tijd" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Seed niet geverifieerd" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Verstuur Accepteren: deflate, gzip verzoekkop en reactie " +"opblazen als externe server reageert met Content-Encoding: gzip " +"of Content-Encoding: deflate." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Verzend de header Cache-Control: no-cache en Pragma: no-" +"cache om inhoud in de cache te vermijden. Indien uitgeschakeld, " +"worden deze headers niet verzonden en kunt u de Cache-Control-header " +"toevoegen met een richtlijn die u leuk vindt met behulp van de \"Header\"-" +"optie." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"Stel het TCP-poortnummer in voor BitTorrent-downloads. Accepteer formaat: " +"\"6881,6885\", \"6881-6999\" en \"6881-6889,6999\". Zorg ervoor dat de " +"opgegeven poorten open staan voor binnenkomend TCP-verkeer." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"Stel de UDP-luisterpoort in die wordt gebruikt door DHT (IPv4, IPv6) en UDP-" +"tracker. Zorg ervoor dat de opgegeven poorten openstaan voor binnenkomend " +"UDP-verkeer." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Stel de maximale downloadsnelheid per download in bytes/sec in. 0 betekent " +"onbeperkt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Stel de maximale totale downloadsnelheid in bytes/sec in. 0 betekent " +"onbeperkt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Stel de maximale totale uploadsnelheid in bytes/sec in. 0 betekent onbeperkt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Stel de maximale uploadsnelheid per torrent in bytes/sec in. 0 betekent " +"onbeperkt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Stel de verbindingstime-out in seconden in om verbinding te maken met HTTP/" +"FTP/proxyserver. Nadat de verbinding tot stand is gebracht, heeft deze optie " +"geen effect en wordt in plaats daarvan de optie \"Time-out\" gebruikt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" +"Stel het aantal seconden in dat moet worden gewacht tussen nieuwe pogingen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Stel user-agent in voor HTTP(S)-downloads." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Instellingen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" +"Instellingen in deze sectie worden toegevoegd aan het configuratiebestand." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Lijst met instellingen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Geef de bestandstoewijzingsmethode op. Als u nieuwere bestandssystemen " +"gebruikt, zoals ext4 (met ondersteuning voor extents), btrfs, xfs of NTFS " +"(alleen MinGW-build), is \"falloc\" uw beste keuze. Het wijst vrijwel " +"onmiddellijk grote (weinig GiB) bestanden toe, maar het is mogelijk niet " +"beschikbaar als uw systeem geen posix_fallocate(3) functie heeft. Gebruik " +"\"falloc\" niet met verouderde bestandssystemen zoals ext3 en FAT32 omdat " +"het bijna evenveel tijd kost als \"prealloc\" en het aria2 volledig " +"blokkeert totdat de toewijzing is voltooid." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Geef het maximale aantal bestanden op dat wereldwijd moet worden geopend in " +"BitTorrent-downloads met meerdere bestanden." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Specificeer de zaaitijd in minuten. Als de optie \"Zaadverhouding\" samen " +"met deze optie is gespecificeerd, eindigt het zaaien wanneer aan ten minste " +"één van de voorwaarden is voldaan. Als u 0 opgeeft, wordt seeding " +"uitgeschakeld nadat de download is voltooid." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Specificeer de aandeelverhouding. Zaai voltooide torrents totdat de " +"aandeelratio RATIO bereikt. U wordt sterk aangemoedigd om hier gelijk aan of " +"meer dan 1,0 te specificeren. Geef 0,0 op als u van plan bent om seeding uit " +"te voeren, ongeacht de deelverhouding." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" +"Specificeer het maximale aantal peers per torrent, 0 betekent onbeperkt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Geef het voorvoegsel van de peer-ID op. De peer-ID in BitTorrent is 20 bytes " +"lang. Als er meer dan 20 bytes zijn opgegeven, worden alleen de eerste 20 " +"bytes gebruikt. Als er minder dan 20 bytes zijn opgegeven, worden " +"willekeurige bytegegevens toegevoegd om de lengte 20 bytes te maken." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"Stop het downloaden van BitTorrent als de downloadsnelheid 0 is in " +"opeenvolgende N seconden. Als 0 wordt gegeven, is deze functie uitgeschakeld." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Time-out stoppen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "De Aria2-service is niet actief." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "De Aria2-service is actief." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" +"De map om het configuratiebestand, het sessiebestand en het DHT-bestand op " +"te slaan." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" +"De map om het gedownloade bestand op te slaan. Bijvoorbeeld /mnt/sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "De bestandsnaam van het logbestand." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "Het maximale aantal verbindingen met één server voor elke download." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" +"Deze optie wordt genegeerd als er een privévlag is ingesteld in een torrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Time-out" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "Waar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Gebruik een proxyserver voor alle protocollen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Gebruik de certificeringsinstanties in FILE om de peers te verifiëren. Het " +"certificaatbestand moet de PEM-indeling hebben en kan meerdere CA-" +"certificaten bevatten." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"Gebruik het certificaat in FILE voor RPC-server. Het certificaat moet de " +"indeling PKCS12 (.p12, .pfx) of PEM hebben.
    PKCS12-bestanden moeten het " +"certificaat, een sleutel en eventueel een reeks aanvullende certificaten " +"bevatten. Alleen PKCS12-bestanden met een leeg importwachtwoord kunnen " +"worden geopend!
    Als u PEM gebruikt, moet u ook de \"RPC private key\" " +"specificeren." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Gebruik het clientcertificaat in FILE. Het certificaat moet de indeling " +"PKCS12 (.p12, .pfx) of PEM hebben.
    PKCS12-bestanden moeten het " +"certificaat, een sleutel en eventueel een reeks aanvullende certificaten " +"bevatten. Alleen PKCS12-bestanden met een leeg importwachtwoord kunnen " +"worden geopend!
    Als u PEM gebruikt, moet u ook de \"Private key\" " +"specificeren." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"Gebruik de persoonlijke sleutel in FILE voor de RPC-server. De privésleutel " +"moet worden gedecodeerd en in PEM-indeling." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Gebruik de privésleutel in FILE. De privésleutel moet worden gedecodeerd en " +"in PEM-indeling. Het gedrag wanneer een versleutelde wordt gegeven, is " +"ongedefinieerd." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "Gebruikersagent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Gebruikersnaam & Wachtwoord" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"Verifieer de peer met behulp van certificaten die zijn opgegeven in de optie " +"\"CA-certificaat\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Waarschuwen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "U kunt K of M toevoegen." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/pl/aria2.po b/package/luci/applications/luci-app-aria2/po/pl/aria2.po new file mode 100644 index 0000000000..530099b1a1 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/pl/aria2.po @@ -0,0 +1,881 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-11-07 22:37+0000\n" +"Last-Translator: Matthaiks \n" +"Language-Team: Polish \n" +"Language: pl\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 5.2-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD włączone" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Dodatkowy tracker BT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Opcje zaawansowane" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Wszystkie proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Dodaj HEADERs do nagłówka żądania HTTP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2 to lekkie, wieloprotokołowe, wieloźródłowe i wieloplatformowe " +"narzędzie do pobierania plików." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Interwał automatycznego zapisywania" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Opcje podstawowe" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Opcje BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "Port nasłuchowy BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Certyfikat CA" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Certyfikat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Sprawdź certyfikat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Zamknij połączenie, jeśli prędkość pobierania jest mniejsza lub równa tej " +"wartości (bajty na sekundę). 0 oznacza, że nie ma dolnej granicy prędkości." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Trwa zbieranie danych..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Katalog plików konfiguracyjnych" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Konfiguracja" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Limit połączenia" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Zawartość pliku konfiguracyjnego: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Zawartość pliku sesji: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "Port nasłuchowy DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Debugowanie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Wyłącz IPv6. Jest to przydatne, jeśli musisz użyć uszkodzonego DNS i chcesz " +"uniknąć strasznie powolnego wyszukiwania rekordów AAAA." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Pamięć podręczna dysku" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" +"Nie należy rozdzielać zakresu bajtów poniżej 2*SIZE. Możliwe wartości: " +"1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Pobierz używając wielu połączeń." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Katalog pobierania" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "Włącz DHT dla IPv4. Włącza również trackery UDP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Włącz funkcjonalność IPv6 DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Włącz wykrywanie lokalnych partnerów." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Włącz wymianę peerów lokalnych." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Włącz pamięć podręczną dysku (w bajtach), ustaw 0 na wyłączone." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Włącz rejestrowanie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Włączenie wymiany peerów" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Włącz proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Włączone" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Błąd" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Specjalne ustawienia" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Nieprawda" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Przydział dla pliku" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Pliki" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Podążaj za torrentem" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Aby uzyskać więcej informacji, odwiedź: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Wymuś zapisanie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Generuj losowo" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Przyznaj luci-app-aria2 dostęp do UCI" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "Akceptuj gzip dla HTTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "Nie buforuj HTTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "Opcje HTTP/FTP/SFTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Nagłówek" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Pokazuje pliki używane przez aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "IPv4 DHT włączone" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "IPv6 DHT włączone" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "Wyłączenie IPv6" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Jeśli prędkość pobierania każdego torrenta jest mniejsza od SPEED, aria2 " +"tymczasowo zwiększa liczbę peerów aby zwiększyć prędkość pobierania. " +"Ustawiając tą opcję prędkość pobierania może się zwiększyć w niektórych " +"przypadkach." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Informacja" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Zainstalowany interfejs sieciowy:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "Adres URL dla Json-RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Trzymaj w pamięci" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "Ostatnie 50 wierszy pliku log:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "Ostatnie 50 wierszy dziennika systemowego:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Pozostaw puste, aby użyć domyślnej nazwy użytkownika." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Lista dodatkowych adresów dla trackerów BT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Lista dodatkowych ustawień. Format: opcja=wartość, np. netrc-path=/" +"tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Ładowanie" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Dziennik" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Dane dziennika" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Plik dziennika" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Poziom logowania" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Najniższy limit prędkości" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Maksymalna liczba jednoczesnych pobierań" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Maksymalna liczba połączeń z serwerem" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Maksymalny limit pobierania" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Maksymalna liczba części" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Maksymalna liczba otwartych plików" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Maksymalna łączna prędkość pobierania" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Maksymalna łączna prędkość wysyłania" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Maksymalna liczba peerów" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Maksymalna liczba prób" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Maksymalny limit wysyłania" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Minimalny rozmiar części" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Brak uwierzytelnienia" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Nie zapisuj danych dziennika." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Brak" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Spostrzeżenie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Wstrzymaj" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Wstrzymaj pobieranie po dodaniu." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "Wstrzymaj pobieranie po pobraniu metadanych." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Wstrzymaj metadane" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Proszę podać długość tokena:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Prefiks ID peera" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Klucz prywatny" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Hasło proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Użytkownik proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "Opcje RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "Metoda uwierzytelnienia RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "Certyfikat RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "Hasło RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "Port RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "Prywatny klucz RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "Zabezpieczenie RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "Token RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"Transmisja RPC będzie szyfrowana przez SSL/TLS. Klient RPC musi używać " +"https, aby połączyć się z tym serwerem. Dla klienta WebSocket, użyj schematu " +"wss." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "Nazwa użytkownika RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Odświeżaj co %s sekund(y)." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Usuń niezaznaczone pliki" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Usuń niezaznaczone pliki po zakończonym pobraniu. Proszę używać tej opcji z " +"ostrożnością, pliki zostaną usunięte z dysku." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Zastosuj ograniczenie prędkości peerów" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Ponów oczekiwanie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Uruchom demona jako użytkownik" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Stan działania" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Zapisz plik kontrolny(*.aria2) co N sekund. Jeśli podano 0, plik kontrolny " +"nie jest zapisywany podczas pobierania." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Zapisz pobieranie do pliku sesji, nawet jeśli pobieranie zostało zakończone " +"lub usunięte. Opcja ta zapisuje również plik kontrolny w takich sytuacjach. " +"Może to być przydatne w celu zapisania seedów BitTorrent, które są " +"rozpoznane jako ukończone." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Zapisz błąd/niezakończone pobieranie do pliku sesji co N sekund. Jeśli " +"podano 0, plik zostanie zapisany tylko wtedy, gdy aria2 zakończy pracę." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Zapisz metadane jako plik \".torrent\". Opcja ta działa tylko wtedy, gdy " +"używany jest BitTorrent Magnet URI. Nazwa pliku jest zakodowana w postaci " +"pliku hash z przyrostkiem \".torrent\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Zapisz metadane" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Zapisz interwał sesji" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "Seeduj uprzednio pobrane pliki bez sprawdzania części z hashem." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Współczynnik Seedów" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Czas seedowania" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Niezweryfikowane seedy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Wyślij Accept: deflate, gzip, żądaj nagłówka i wywołaj " +"odpowiedź, jeśli zdalny serwer zareaguje za pomocą Content-Encoding: " +"gzip lub Content-Encoding: deflate." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Wyślij Cache-Control: no-cache and Pragma: no-cache nagłówka w celu uniknięcia buforowania zawartości. Jeśli wyłączono, " +"nagłówki nie są wysyłane i można dodać Cache-Control nagłówka z dyrektywą, " +"którą lubisz używać w opcji \"Header\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"Ustaw numer portu TCP dla pobierań BitTorrent. Akceptowalny format: " +"\"6881,6885\", \"6881-6999\" i \"6881-6889,6999\". Upewnij się, że określone " +"porty są otwarte dla przychodzącego ruchu TCP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"Ustaw port odsłuchu UDP używany przez DHT(IPv4, IPv6) i tracker UDP. Upewnij " +"się, że określone porty są otwarte dla przychodzącego ruchu UDP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Ustaw maksymalną prędkość poszczególnych pobierań w bajtach/s. 0 oznacza " +"brak limitów." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Ustaw łączną maksymalną prędkość pobierania w bajtach/s. 0 oznacza brak " +"limitów." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Ustaw maksymalną łączną prędkość wysyłania w bajtach/s. 0 oznacza brak " +"limitów." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Ustaw maksymalną prędkość wysyłania poszczególnych torrentów w bajtach/s. 0 " +"oznacza brak limitów." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Ustaw czas połączenia w sekundach, aby nawiązać połączenie z serwerem HTTP/" +"FTP/proxy. Po nawiązaniu połączenia opcja ta nie daje żadnego efektu i " +"zamiast tego używana jest opcja \"Timeout\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Ustaw czas w sekundach między kolejną próbą." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Ustala agenta pobierania przez HTTP(S) dla użytkownika." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Ustawienia" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "Ustawienia w tej sekcji będą dodane do pliku konfiguracyjnego." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Lista ustawień" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Określ metodę alokacji plików. Jeśli używasz nowszych systemów plików, " +"takich jak ext4 (z obsługą ekstentów), btrfs, xfs lub NTFS (tylko kompilacja " +"MinGW), najlepszym wyborem będzie \"falloc\". Przydziela duże pliki (kilka " +"GiB) niemal natychmiast, ale może nie być dostępna, jeśli system nie ma " +"funkcji posix_fallocate(3). Nie używaj \"falloc\" ze starszymi systemami " +"plików, takimi jak ext3 i FAT32, ponieważ zajmuje to prawie tyle samo czasu " +"co \"prealloc\" i całkowicie blokuje program aria2 aż do zakończenia " +"alokacji." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Określ maksymalną liczbę plików do otwarcia w pliku BitTorrent do pobrania " +"globalnie." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Określ czas seedowania w minutach. Jeśli wraz z tą opcją podana jest opcja " +"\"Współczynnik seedów\", seedowanie zakończy się, gdy spełniony jest " +"przynajmniej jeden z warunków. Ustawienie 0 wyłącza seedowanie po " +"zakończeniu pobierania." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Podaj współczynnik udziałów. Seeduj ukończone torrenty aż do momentu, gdy " +"współczynnik udziałów osiągnął wartość RATIO. Gorąco zachęcamy do określenia " +"wartości równych lub większych niż 1.0. Określ 0.0, jeśli zamierzasz " +"seedować bez względu na współczynnik udziałów." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "Maksymalna liczba peerów na torrent. 0 oznacza brak limitów." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Określ prefiks identyfikatora peer ID. Identyfikator w programie BitTorrent " +"ma długość 20 bajtów. Jeśli podano więcej niż 20 bajtów, stosuje się tylko " +"pierwsze 20 bajtów. Jeżeli podano mniej niż 20 bajtów, to dane o długości 20 " +"bajtów są dodawane losowo, aby uzyskać długość 20 bajtów." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"Zatrzymaj BitTorrent, jeżeli prędkość pobierania wynosi 0 przez N sekund. " +"Wpisanie 0 oznacza wyłączenie tej funkcji." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Limit czasu na zatrzymanie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Usługa Aria2 nie jest uruchomiona." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Usługa Aria2 jest uruchomiona." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" +"Katalog do przechowywania pliku konfiguracyjnego, pliku sesji i pliku DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "Katalog do zapisu pobranych plików. np. /mnt/sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "Nazwa pliku log-u." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "Maksymalna liczba połączeń z jednym serwerem dla każdego pobrania." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "Opcja będzie wyłączona jeżeli torrent ma ustawioną flagę prywatności." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Limit czasu" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "Prawda" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Użyj serwera proxy dla wszystkich protokołów." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Skorzystaj z usług jednostek certyfikujących w FILE, aby zweryfikować peery. " +"Plik certyfikatu musi być w formacie PEM i może zawierać wiele certyfikatów " +"CA." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"Użyj certyfikatu w FILE dla serwera RPC. Certyfikat musi być albo w pliku " +"PKCS12 (.p12, .pfx) albo w formacie PEM.
    PKCS12 musi zawierać " +"certyfikat, klucz i opcjonalnie łańcuch dodatkowych certyfikatów. Tylko " +"pliki PKCS12 z pustym importowanym hasłem mogą być otwierane!
    Podczas " +"używania PEM należy również określić \"klucz prywatny RPC\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Użyj certyfikatu klienta w FILE. Certyfikat musi być albo w pliku PKCS12 (." +"p12, .pfx) albo w formacie PEM.
    PKCS12 musi zawierać certyfikat, klucz i " +"opcjonalnie łańcuch dodatkowych certyfikatów. Tylko pliki PKCS12 z pustym " +"importowanym hasłem mogą być otwierane!
    Podczas używania PEM należy " +"również określić \"Klucz prywatny\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"Użyj klucza prywatnego w FILE dla serwera RPC. Klucz musi odszyfrowany i w " +"formacie PEM." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Użyj klucza prywatnego w FILE dla serwera RPC. Klucz musi odszyfrowany i w " +"formacie PEM. Zachowanie podczas szyfrowania jest nieokreślone." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "Agent użytkownika" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Nazwa użytkownika i hasło" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"Weryfikuj peery przy użyciu certyfikatów określonych w opcjach \"certyfikat " +"CA\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Uwaga" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "Możesz dodać K lub M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/pt/aria2.po b/package/luci/applications/luci-app-aria2/po/pt/aria2.po new file mode 100644 index 0000000000..f853a02603 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/pt/aria2.po @@ -0,0 +1,898 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-07-20 17:18+0000\n" +"Last-Translator: ssantos \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.14-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD ativado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Rastreador BT adicional" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Opções Avançadas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Todos os proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Acrescentar HEADERs ao cabeçalho do pedido HTTP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2 é uma ferramenta multiplataforma de descarregas multiprotocolo leve " +"& multi-fonte." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Intervalo de gravação automático" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Opções Básicas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Opções BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "Porta de escuta BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Certificado CA" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Certificado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Verificar o certificado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Fechar a ligação se a velocidade de transferência for inferior ou igual a " +"este valor (bytes por segundo). 0 significa que não tem limite de velocidade " +"mais baixo." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "A recolher dados..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Diretório do ficheiro de configuração" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Configuração" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Tempo limite de conexão" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Conteúdo do ficheiro de config: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Conteúdo do ficheiro da sessão: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "Porta de escuta DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Depuração" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Desativar IPv6. Isso é útil se tiver que usar DNS quebrado e quiser evitar " +"uma pesquisa de registos AAAA terrivelmente lenta." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Cache em disco" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" +"Não dividir um intervale menos de 2*SIZE de bytes. Valores possíveis: " +"1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Descarregue um ficheiro usando N conexões." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Descarregar directório" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" +"Ativar a funcionalidade IPv4 DHT. Também ativa o suporte do rastreador UDP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Ativar a funcionalidade IPv6 DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Ativar a Descoberta por Pares Locais." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Ativar a extensão da Troca de Pares." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Ativar o cache do disco (em bytes), defina 0 como desativado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Ativar registo de dados" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Permitir a troca de pares" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Ativar proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Ativado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Erro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Configurações Adicionais" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Falso" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Alocação de ficheiroa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Ficheiros" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Seguir o torrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Para obter mais informações, visite:% s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Gravar forçadamente" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Gerar Aleatoriamente" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Conceder acesso UCI ao luci-app-aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP aceitar gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP sem cache" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "Opções HTTP/FTP/SFTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Cabeçalho" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Exibir aqui os ficheiros usados pela aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "DHT IPv4 ativado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "DHT IPv6 ativado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "IPv6 desativado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Se toda a velocidade de descarrega de cada torrent for menor que SPEED, " +"aria2 aumenta temporariamente o número de pares para tentar obter mais " +"velocidade de descarrega. Configurar esta opção com a sua velocidade de " +"descarrega preferida pode aumentar a sua velocidade de descarrega em alguns " +"casos." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Info" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Interface web instalada:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "URL de Json-RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Manter na memória" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "As últimas 50 linhas do ficheiro de registo:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "As últimas 50 linhas do syslog:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Deixar em branco para usar o utilizador predefinido." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Lista de anúncios URL adicionais do rastreador de BitTorrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Lista de configurações adicionais. Formato: opção=valor, por exemplo " +"netrc-path=/tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "A carregar" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Log" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Dados de Registo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Ficheiro de registo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Nível de registo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Limite de velocidade mais baixo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Máximo de descarregamentos simultâneos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Quantidade máxima de conexões por servidor" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Limite máximo de descarregamentos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Quantidade máxima de divisões" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Máximo de ficheiros abertos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Limite máximo global de descarregamento" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Limite máximo global de envio" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Máximo de pares" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Max tenta" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Limite máximo de envio" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Tamanho mínimo de divisão" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Sem Autenticação" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Sem dados de registo." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Nenhum" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Aviso" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Pausa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Pausa descarregar após adicionado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" +"Pausar descarregamentos criados como resultado do descarregamento de " +"metadados." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Pausar metadados" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Por favor, introduza o comprimento do token:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Prefixo do ID do par" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Chave privada" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Palavra-passe da proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Utilizador do proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "Opções de RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "Método de autenticação de RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "Certificado do RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "Palavra-passe de RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "Porta RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "Chave privada de RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC seguro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "Token de RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"O transporte RPC será criptografado por SSL/TLS. Os clientes de RPC devem " +"usar o esquema https para acessar o servidor. Para o cliente WebSocket, use " +"o esquema wss." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "Nome do utilizador RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Atualize a cada %s segundos." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Remover ficheiro não selecionado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Remove os ficheiros não selecionados quando o descarregamento é concluído no " +"BitTorrent. Por favor, use esta opção com cuidado porque ele irá realmente " +"remover ficheiros do seu disco." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Solicitar limite de velocidade do par" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Esperar até repetir" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Executar serviço como utilizador" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Estado de execução" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Gravar um ficheiro de controle (*.aria2) a cada N segundos. Se 0 for dado, " +"um ficheiro de controle não será salvo durante o descarregamento." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Gravar o descarregamento no ficheiro de sessão mesmo que o descarregamento " +"tenha sido concluído ou removido. Esta opção também grava o ficheiro de " +"controle nessas situações. Isso pode ser útil para gravar a propagação " +"BitTorrent, que é reconhecida como estado concluído." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Gravar erros/descarregamentos inacabados no ficheiro de sessão a cada N " +"segundos. Se 0 for dado, o ficheiro será gravado somente quando aria2 sair." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Gravar metadados como ficheiro \".torrent\". Esta opção tem efeito apenas " +"quando BitTorrent Magnet URI é usado. O nome do ficheiro é codificado " +"hexadecimal info hash com o sufixo \".torrent\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Gravar metadados" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Gravar intervalo de sessão" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" +"Semear ficheiros descarregados anteriormente sem verificar os hashes das " +"peças." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Proporção de sementes" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Tempo da semente" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Semente não verificada" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Enviar cabeçalho de solicitação Accept: deflate, gzip e inflar " +"a resposta se o servidor remoto responder com Content-Encoding: gzip ou Content-Encoding: deflate.." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Enviar cabeçalho Cache-Control: no-cache e Pragma: no-" +"cache para evitar conteúdo do cache. Se desativado, esses cabeçalhos " +"não são enviados e pode adicionar o cabeçalho Cache-Control com uma diretiva " +"que gosta de usando a opção \"Header\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"Defina o número da porta TCP para desarregas BitTorrent. Aceitar formato: " +"\"6881.6885\", \"6881-6999\" e \"6881-6889,6999\". Certifique-se de que as " +"portas especificadas estão abertas para o tráfego TCP de entrada." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"Definir a porta de escuta UDP usada pelo DHT (IPv4, IPv6) e pelo rastreador " +"UDP. Certifique-se de que as portas especificadas estão abertas para o " +"tráfego UDP de entrada." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Definir a velocidade máxima de descarregamento por cada descarregamento em " +"bytes/sec. 0 significa irrestrito." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Defina a velocidade máxima global de descarregamento em bytes/seg. 0 " +"significa irrestrito." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Defina a velocidade máxima global de envio em bytes/segundos. 0 significa " +"irrestrito." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Defina a velocidade máxima de envio por cada torrent em bytes/segundos. 0 " +"significa irrestrito." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Defina o tempo limite de conexão em segundos para estabelecer conexão com o " +"servidor HTTP/FTP/proxy. Depois que a conexão é estabelecida, esta opção não " +"faz nenhum efeito e a opção \"Timeout\" é usada em vez disso." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Defina os segundos para esperar entre novas tentativas." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Defina o agente de utilizador para descarregas HTTP(S)." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Configurações" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" +"As configurações nesta secção serão adicionadas ao ficheiro de configuração." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Lista de configurações" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Especifique o método de alocação de ficheiros. Se estiver a usar sistemas de " +"ficheiros mais recentes, como ext4 (com suporte a extensões), btrfs, xfs ou " +"NTFS (somente compilação MinGW), \"falloc\" será a sua melhor escolha. Aloca " +"ficheiros grandes (alguns GiB) quase instantaneamente, mas pode não estar " +"disponível se o seu sistema não tiver a função posix_fallocate (3). Não use " +"\"falloc\" com sistemas de ficheiros legados, como ext3 e FAT32, pois leva " +"quase o mesmo tempo como \"prealloc\" e bloqueia aria2 completamente até a " +"alocação terminar." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Especificar a quantidade máxima de ficheiros a serem abertos no " +"descarregamento global do BitTorrent para vários ficheiros." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Especifica o tempo de semeadura em minutos. Se a opção \"Relação de " +"sementes\" for especificada com esta opção, semear termina quando pelo menos " +"uma das condições for satisfeita. Especificar 0 desativa semear após a " +"conclusão do descarregamento." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Especifique a relação da participação. Semea torrents completadas até que o " +"rácio de partilha atinja a RATIO. É fortemente encorajado a especificar " +"iguais ou mais de 1.0 aqui. Especifique 0.0 se pretende semear " +"independentemente da proporção de compartilhamento." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" +"Especifique a quantidade máxima de pares por torrent, 0 significa ilimitado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Especifique o prefixo do peer ID. O peer ID no BitTorrent tem 20 bytes de " +"comprimento. Se forem especificados mais de 20 bytes, apenas os primeiros 20 " +"bytes são utilizados . Se menos de 20 bytes forem especificados, dados de " +"bytes aleatórios são adicionados para chegar ao comprimento de 20 bytes." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"Parar o descarregamento do BitTorrent se a velocidade de descarregar for 0 " +"em N segundos consecutivos. Se 0 for dado, este recurso será desativado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Tempo limite de paragem" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "O serviço Aria2 não está em execução." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "O serviço Aria2 está em execução." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" +"O diretório para armazenar o ficheiro de configuração, ficheiro de sessão e " +"ficheiro DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" +"O diretório para armazenar o ficheiro descarregado, por exemplo, /mnt/" +"sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "O nome do ficheiro de log." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" +"A quantidade máxima de conexões a um servidor para cada descarregamento." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" +"Essa opção será ignorada se um sinalizador privado for definido num torrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Tempo limite" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Chave eletrónica" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "Verdadeiro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Usar um servidor proxy para todos os protocolos." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Usar as autoridades certificadoras no FILE para verificar os pares. O " +"ficheiro de certificado deve estar no formato PEM e pode conter vários " +"certificados AC." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"Utilizar o certificado em FILE para o servidor RPC. O certificado deve estar " +"em formato PKCS12 (.p12, .pfx) ou PEM.
    Os ficheiros PKCS12 devem conter " +"o certificado, uma chave e opcionalmente uma cadeia de certificados " +"adicionais. Somente ficheiros PKCS12 com uma palavra-passe de importação em " +"branco podem ser abertos!
    Ao usar o PEM, também tem que especificar a " +"\"chave privada RPC\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Utilizar o certificado de cliente no FILE. O certificado deve estar em " +"formato PKCS12 (.p12, .pfx) ou PEM.
    Os ficheiros PKCS12 devem conter o " +"certificado, uma chave e opcionalmente uma cadeia de certificados " +"adicionais. Somente ficheiros PKCS12 com uma palavra-passe de importação em " +"branco podem ser abertos!
    Ao usar o PEM, também tem que especificar a " +"\"Private key\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"Usar a chave privada em FILE para o servidor RPC. A chave privada deve ser " +"descodificada e em formato PEM." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Usar a chave privada em FILE. A chave privada deve ser descodificada e em " +"formato PEM. O comportamento quando um encriptado é dado é indefinido." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "Agente de utilizador" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Nome de Utilizador e Palavra-passe" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"Verificar o par usando certificados especificados na opção \"Certificado " +"AC\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Avisar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "Pode anexar K ou M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/pt_BR/aria2.po b/package/luci/applications/luci-app-aria2/po/pt_BR/aria2.po new file mode 100644 index 0000000000..00848a7e7b --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/pt_BR/aria2.po @@ -0,0 +1,902 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2023-06-13 08:35+0000\n" +"Last-Translator: Wellington Terumi Uemura \n" +"Language-Team: Portuguese (Brazil) \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" +"LPD habilitado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Rastreador BT adicional" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Opções Avançadas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Todos os proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Acrescentar HEADERs ao cabeçalho do pedido HTTP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2 é um utilitário de download multiprotocolo & multiplataforma e " +"multi-source." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Intervalo de gravação automática" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Opções Básicas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Opções do BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "Porta de escuta do BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Certificado CA" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Certificado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Verificar o certificado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Feche a conexão caso a velocidade de download seja menor ou igual a este " +"valor (em bytes por segundo). 0 significa que não há limite mínimo de " +"velocidade." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Coletando dados..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Diretório dos arquivos de configuração" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Configuração" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Tempo limite da conexão" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Conteúdo do arquivo de configuração: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Conteúdo do arquivo da sessão: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "Porta de escuta do DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Depuração" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Desative o IPv6. Isso é útil caso você tenha que usar um DNS com problemas e " +"quer evitar uma pesquisa de registros AAAA terrivelmente lento." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Cache em Disco" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" +"Não divida a gama de byte para menos de 2*TAMANHO. Valores possíveis: " +"1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Baixar um arquivo usando N conexões." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Diretório dos arquivos baixados" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" +"Habilitar a funcionalidade DHT IPv4. Ele também ativa a compatibilidade com " +"o rastreador UDP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Ativar a funcionalidade HDT IPv6." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Habilitar a Descoberta Local dos Pares." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Ativar a Extensão de Troca de Pares." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Ativar o cache de disco (em bytes), defina como 0 para desativá-lo." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Habilite os registros (log)" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Ativar troca de pares" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Ativar o proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Ativado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Erro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Configurações Adicionais" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Falso" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Alocação de arquivo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Arquivos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Seguir torrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Para obter mais informações, visite: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Impor gravação" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Gerar aleatoriamente" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Conceda acesso UCI ao luci-app-aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "Aceitar gzip HTTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP sem cache" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "Opções HTTP/FTP/SFTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Cabeçalho" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Aqui são exibidos os arquivos utilizados pelo aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "IPv4 DHT ativado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "IPv6 DHT ativado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "IPv6 desativado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Caso a velocidade total de download de cada torrent seja menor do que SPEED, " +"o aria2 aumenta temporariamente a quantidade dos pares para tentar aumentar " +"mais a velocidade do download. Ao configurar está opção com a sua velocidade " +"preferida, em alguns casos, é possível que sua velocidade de download " +"aumente." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Informação" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Interface web instalada:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "URL Json-RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Manter na memória" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "As últimas 50 linhas do arquivo de registro log:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "As últimas 50 linhas do syslog:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Deixe em branco para usar o usuário padrão." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Lista dos rastreadores BitTorrent adicionais com anúncio URI." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Lista de configurações extras. Formato: option=value, por exemplo " +"netrc-path=/tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Carregando" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Log" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Dados do registro log" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Arquivo log" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Nível do registro do log" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Limite de velocidade mais baixo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Número máximo de transferencias simultâneas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Numero máximo de conexões por servidor" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Limite de download máximo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Quantidade máxima de divisões" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Quantidade máxima d arquivos abertos" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Limite global máximo de download" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Limite global máximo de upload" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Quantidade máxima de pares" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Quantidade máxima de tentativas" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Limite máximo de upload" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Tamanho mínimo da divisão" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Sem Autenticação" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Sem dados de registro log." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Nenhum" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Aviso" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Pausa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Pause o download depois que for adicionado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "Pausar os downloads criados como resultado do download de metadados." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Pausar metadados" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Por favor, insira o comprimento do token:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Prefixo de identificação do paceiro" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Chave Privada" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Senha do proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Usuário do proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "Opções RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "Método de autenticação do RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "Certificado RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "Senha do RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "Porta do RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "Chave privada do RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "Segurança do RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "Token do RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"O transporte RPC será criptografado por SSL/TLS. Os clientes RPC devem usar " +"o esquema https para acessar o servidor. Para o cliente WebSocket, use " +"esquema wss." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "Nome de usuário do RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Atualize a cada %s segundos." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Remover o arquivo não selecionado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Remove os arquivos não selecionados quando o download é concluído no " +"BitTorrent. Por favor, use esta opção com cuidado porque ela irá realmente " +"remover os arquivos do seu disco." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Solicitar o limite de velocidade dos pares" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Repetir espera" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Executar serviço como usuário" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Condição geral da execução" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Gravar um arquivo de controle (*.aria2) a cada N segundos. Caso este valor " +"seja 0, o arquivo de controle não será gravado durante o download." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Salve o download no arquivo de sessão mesmo que o download tenha sido " +"concluído ou removido. Esta opção também salva o arquivo de controle nessas " +"situações. Isso pode ser útil para manter um registros do seeding do " +"BitTorrent, que é uma condição reconhecida como concluído." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Salvar os erros/downloads inacabados no arquivo de sessão a cada N segundos. " +"Caso este valor seja 0, o arquivo será salvo somente quando encerrar o aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Salvar os metadados como um arquivo \".torrent\". Esta opção tem efeito " +"apenas quando BitTorrent Magnet URI é usado. O nome do arquivo é hexadecimal " +"codificado com a informação do hash com o sufixo \".torrent\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Salvar os metadados" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Salvar o intervalo da sessão" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" +"Semear os arquivos previamente baixados sem verificar os pedaços de hash." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Proporção de semeadura" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Tempo de semeadura" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Seed não verificado" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Enviar Accept: deflate, gzip requisitar o cabeçalho e inflar a " +"resposta caso o servidor remoto responda com Content-Encoding: gzip ou Content-Encoding: deflate." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Envie os cabeçalhos Cache-Control: no-cache e Pragma: " +"no-cache para evitar a cache de conteúdo. Se desativado, estes " +"cabeçalhos não são enviados e você pode adicionar o cabeçalho Cache-Control " +"com uma diretiva que você gosta usando a opção \"Cabeçalho\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"Defina o número da porta TCP para downloads BitTorrent. Formato aceitos: " +"\"6881,6885\", \"6881-6999\" e \"6881-6889,6999\". Certifique-se de que as " +"portas definidas estão abertas para o tráfego de entrada TCP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"Defina a porta de escuta UDP usada pelo DHT(IPv4, IPv6) e pelo rastreador " +"UDP. Certifique-se de que as portas especificadas estão abertas para tráfego " +"de entrada UDP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Defina a velocidade máxima de download para cada download em bytes/seg. 0 " +"significa sem restrições." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Defina a velocidade máxima global de download em bytes/seg. 0 significa sem " +"restrições." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Defina a velocidade máxima global de upload em bytes/segundos. 0 significa " +"sem restrições." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Defina a velocidade máxima de upload por cada torrent em bytes/segundos. 0 " +"significa sem restrições." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Defina o intervalo de conexão em segundos para estabelecer conexão com o " +"servidor HTTP/FTP/proxy. Depois que a conexão é estabelecida, esta opção não " +"tem nenhum efeito e a opção \"Timeout\" é usada em vez disso." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Definir os segundos para esperar entre as tentativas." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Definir o agente do usuário para downloads HTTP(s)." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Configurações" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" +"As configurações nesta seção serão adicionadas ao arquivo de configuração." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Lista de configurações" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Especifique o método de alocação de arquivo. Se você está usando sistemas de " +"arquivos mais novos, como ext4 (com suporte a extents), btrfs, xfs ou NTFS " +"(somente versões compiladas com MinGW), \"falloc\" é sua melhor escolha. Ele " +"aloca arquivos grandes (com alguns GiB) quase que instantaneamente, mas pode " +"não estar disponível caso o seu sistema não tenha a função " +"posix_fallocate(3). Não use \"falloc\" com sistemas de arquivos antigos como " +"ext3 e FAT32 porque leva quase o mesmo tempo que \"prealloc\" e bloqueia " +"aria2 completamente até que a alocação termine." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Especifique a quantidade máxima global onde vários arquivos serão abertos " +"durante o download do BitTorrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Especifique o tempo de semeadura em minutos. Se a opção \"Relação de " +"sementes\" for especificada em conjunto com esta, a semeadura termina quando " +"pelo menos uma das condições for satisfeita. Ao definir como 0 desativa a " +"semeadura após a conclusão do download." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Especifique a proporção de compartilhamento. Torrents já completos serão " +"semeados até atingir o RATIO. Encorajamos veementemente que você especifique " +"valores iguais ou maior a 1.0. Defina como 0.0 caso queira semear " +"independente do valor da proporção de compartilhamento." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" +"Especifique a quantidade máxima de pares por torrent, 0 significa ilimitado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Especifique o prefixo de identificação do peer ID. O peer ID no BitTorrent " +"tem 20 bytes de comprimento. Se mais de 20 bytes seja especificado, apenas " +"estes primeiros 20 bytes serão utilizados. Caso menos de 20 bytes sejam " +"definidos, dados aleatórios de bytes serão adicionados para que seu tamanho " +"complete os 20 bytes." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"Pare o download do BitTorrent no caso da velocidade de download for de 0 " +"segundos por um tempo de N consecutivos. Se o valor for 0, o recurso será " +"desativado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Tempo limite de parada" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "O serviço Aria2 está parado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "O serviço Aria2 está em execução." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" +"O diretório para armazenar o arquivo de configuração, arquivo de sessão e o " +"arquivo DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" +"O diretório para armazenar o arquivo baixado, por exemplo, /mnt/sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "O nome do arquivo do registro log." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "O limite máximo de conexões para cada download em um servidor." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "Essa opção será ignorada caso um torrent seja sinalizado como privado." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Tempo limite" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "Verdade" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Use um servidor proxy para todos os protocolos." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Use as autoridades certificadoras no ARQUIVO para verificar seus pares. O " +"arquivo de certificado deve estar no formato PEM e pode conter vários " +"certificados CA." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"Utilize o certificado em ARQUIVO para um servidor RPC. O certificado deve " +"estar em PKCS12 (.p12, .pfx) ou em formato PEM.
    Os arquivos PKCS12 devem " +"conter o certificado, uma chave e opcionalmente uma cadeia de certificados " +"adicionais. Somente os arquivos PKCS12 com uma senha de importação em branco " +"podem ser abertos!
    Ao usar o PEM, você também é obrigado a especificar a " +"\"chave privada RPC\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Utilize o certificado de cliente no ARQUIVO. O certificado deve estar em " +"PKCS12 (.p12, .pfx) ou em formato PEM.
    Os arquivos PKCS12 devem conter o " +"certificado, uma chave e opcionalmente uma cadeia de certificados " +"adicionais. Somente os arquivos PKCS12 com uma senha de importação em branco " +"podem ser abertos!
    Ao usar o PEM, você também é obrigado a especificar a " +"\"Chave privada\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"Use a chave privada em ARQUIVO para o servidor RPC. A chave privada deve " +"estar decodificada e em formato PEM." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Use a chave privada em ARQUIVO. A chave privada deve ser decodificada e em " +"formato PEM. Há um comportamento desconhecido quando uma chave criptografada " +"é fornecida." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "Agente de usuário" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Usuário & Senha" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"Verifique o par usando os certificados especificados na opção \"Certificado " +"CA\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Atenção" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "Você pode anexar K ou M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/ro/aria2.po b/package/luci/applications/luci-app-aria2/po/ro/aria2.po new file mode 100644 index 0000000000..13abc7a0e4 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/ro/aria2.po @@ -0,0 +1,901 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-04-23 07:03+0000\n" +"Last-Translator: olimpiumarius \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD activat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Urmăritor BT suplimentar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Opțiuni avansate" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Toate proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Adăugați HEADER-uri la antetul cererii HTTP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2 este un utilitar ușor de descărcare multi-protocol & multi-sursă, " +"cross platform." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Interval de salvare automată" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Opțiuni de bază" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Opțiuni BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "Port de ascultare BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Certificat CA" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Certificat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Verificați certificatul" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Închide conexiunea dacă viteza de descărcare este mai mică sau egală cu " +"această valoare (octeți pe secundă). 0 înseamnă că nu are o limită de viteză " +"minimă." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Colectare date..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Directorul fișierului de configurare" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Configurație" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Pauză de conectare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Conținutul fișierului de configurare: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Conținutul fișierului de sesiune: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "Port de ascultare DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Depanare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Dezactivați IPv6. Acest lucru este util dacă trebuie să folosiți un DNS " +"stricat și doriți să evitați căutarea teribil de lentă a înregistrărilor " +"AAAA." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Memoria cache a discului" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" +"Nu împărțiți mai puțin de 2*SIZE interval de octeți. Valori posibile: " +"1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Descărcați un fișier utilizând N conexiuni." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Director de descărcare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" +"Activați funcționalitatea DHT IPv4. De asemenea, activează suportul pentru " +"tracker UDP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Activați funcționalitatea IPv6 DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Activați Local Peer Discovery." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Activați extensia Peer Exchange." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" +"Activează memoria cache de disc (în octeți), setați 0 pentru dezactivare." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Activează fișierul log" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Activați schimbul de omologi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Activați proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "activat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Eroare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Setări suplimentare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Fals" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Alocarea fișierelor" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Fișiere" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Urmăriți torrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Pentru mai multe informații, vă rugăm să vizitați: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Forțați salvarea" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Generați aleatoriu" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Acordă acces la UCI pentru luci-app-aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP acceptă gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP fără cache" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "Opțiuni HTTP/FTP/SFTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Antet" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Aici sunt prezentate fișierele utilizate de aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "IPv4 DHT activat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "IPv6 DHT activat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "IPv6 dezactivat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Dacă viteza totală de descărcare a fiecărui torrent este mai mică decât " +"SPEED, aria2 mărește temporar numărul de omologi pentru a încerca să obțină " +"o viteză de descărcare mai mare. Configurarea acestei opțiuni cu viteza de " +"descărcare preferată poate crește viteza de descărcare în unele cazuri." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Informații" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Interfață web instalată:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "URL Json-RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Păstrați în memorie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "Ultimele 50 de linii din fișierul jurnal:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "Ultimele 50 de linii din syslog:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Lăsați gol pentru a utiliza utilizatorul implicit." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Listă de anunțuri URI suplimentare ale trackerilor BitTorrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Lista de setări suplimentare. Format: option=valoare, de exemplu, " +"netrc-path=/tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Încărcare" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Jurnal" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Jurnal de date" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Fișier jurnal" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Nivel de jurnal" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Cea mai mică limită de viteză" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Descărcări simultane maxime" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Conexiune maximă pe server" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Limita maximă de descărcare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Numărul maxim de diviziuni" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Număr maxim de fișiere deschise" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Limita maximă de descărcare globală" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Limita maximă de încărcare globală" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Maximul de perechi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Numărul maxim de încercări" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Limita maximă de încărcare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Dimensiunea minimă de divizare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Fără autentificare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Nu există date de jurnal." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Nici unul" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Aviz" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Pauză" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Întrerupeți descărcarea după adăugare." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "Întrerupe descărcările create ca urmare a descărcării metadatelor." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Pauză metadate" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Vă rugăm să introduceți lungimea token-ului:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Prefixul ID-ului omologului" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Cheie privată" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Parola Proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Utilizator proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "Opțiuni RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "Metoda de autentificare RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "Certificat RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "Parolă RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "Port RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "Cheia privată RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC securizat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "Token RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"Transportul RPC va fi criptat prin SSL/TLS. Clienții RPC trebuie să " +"utilizeze schema https pentru a accesa serverul. Pentru clientul WebSocket, " +"utilizați schema wss." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "Nume de utilizator RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Actualizare la fiecare %s secunde." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Eliminați fișierul neselectat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Elimină fișierele neselectate la finalizarea descărcării în BitTorrent. Vă " +"rugăm să folosiți această opțiune cu atenție, deoarece va elimina efectiv " +"fișierele de pe disc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Solicitarea limitei de viteză între colegi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Reîncercare așteptare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Rulați daemonul ca utilizator" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Stare de funcționare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Salvează un fișier de control (*.aria2) la fiecare N secunde. Dacă se dă 0, " +"nu se salvează un fișier de control în timpul descărcării." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Salvați descărcarea în fișierul de sesiune chiar dacă descărcarea este " +"finalizată sau eliminată. Această opțiune salvează, de asemenea, fișierul de " +"control în aceste situații. Acest lucru poate fi util pentru a salva " +"semănarea BitTorrent care este recunoscută ca fiind finalizată." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Salvați descărcările eronate/nefinalizate în fișierul de sesiune la fiecare " +"N secunde. Dacă se dă 0, fișierul va fi salvat numai când aria2 iese." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Salvați datele meta ca fișier \".torrent\". Această opțiune are efect numai " +"atunci când se utilizează BitTorrent Magnet URI. Numele fișierului este un " +"hash de informații codificat hexagonal cu sufixul \".torrent\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Salvarea metadatelor" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Salvare interval de sesiune" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" +"Însămânțarea fișierelor descărcate anterior fără a verifica hașurile " +"pieselor." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Raportul de semințe" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Timp de însămânțare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Seed neverificat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Trimiteți Trimiteți: deflate, gzip antetul cererii și extinde " +"răspunsul dacă serverul la distanță răspunde cu Content-Encoding: " +"gzip or Content-Encoding: deflate." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Trimiteți antetul Cache-Control: no-cache și Pragma: no-" +"cache pentru a evita conținutul din memoria cache. Dacă sunt " +"dezactivate, aceste antete nu sunt trimise și puteți adăuga antetul Cache-" +"Control cu o directivă pe care o doriți folosind opțiunea \"Header\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"Setați numărul portului TCP pentru descărcările BitTorrent. Acceptă " +"formatul: \"6881,6885\", \"6881-6999\" și \"6881-6889,6999\". Asigurați-vă " +"că porturile specificate sunt deschise pentru traficul TCP de intrare." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"Setați portul de ascultare UDP utilizat de DHT (IPv4, IPv6) și de UDP " +"tracker. Asigurați-vă că porturile specificate sunt deschise pentru traficul " +"UDP de intrare." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Setați viteza maximă de descărcare pentru fiecare descărcare în bytes/sec. 0 " +"înseamnă fără restricții." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Setați viteza maximă totală de descărcare în bytes/sec. 0 înseamnă fără " +"restricții." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Setați viteza maximă totală de încărcare în bytes/sec. 0 înseamnă fără " +"restricții." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Setați viteza maximă de încărcare pentru fiecare torrent în bytes/sec. 0 " +"înseamnă fără restricții." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Setați timpul de așteptare a conectării în secunde pentru stabilirea " +"conexiunii la serverul HTTP/FTP/proxy. După stabilirea conexiunii, această " +"opțiune nu mai are niciun efect și în locul ei se utilizează opțiunea " +"\"Timeout\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Setați secundele de așteptare între reintrări." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Setați agentul utilizatorului pentru descărcările HTTP(S)." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Setări" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" +"Setările din această secțiune vor fi adăugate la fișierul de configurare." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Lista de setări" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Specificați metoda de alocare a fișierelor. Dacă utilizați sisteme de " +"fișiere mai noi, cum ar fi ext4 (cu suport pentru extents), btrfs, xfs sau " +"NTFS (numai în versiunea MinGW), \"falloc\" este cea mai bună alegere. " +"Aceasta alocă fișiere mari (câțiva GiB) aproape instantaneu, dar este " +"posibil să nu fie disponibilă dacă sistemul dvs. nu are funcția " +"posix_fallocate(3). Nu folosiți \"falloc\" cu sisteme de fișiere vechi, cum " +"ar fi ext3 și FAT32, deoarece durează aproape la fel de mult ca \"prealloc\" " +"și blochează aria2 în întregime până când se termină alocarea." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Specificați numărul maxim de fișiere care urmează să fie deschise în " +"descărcări BitTorrent cu mai multe fișiere la nivel global." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Specificați timpul de însămânțare în minute. Dacă opțiunea \"Seed ratio\" " +"este specificată împreună cu această opțiune, însămânțarea se încheie atunci " +"când cel puțin una dintre condiții este îndeplinită. Dacă se specifică 0, se " +"dezactivează însămânțarea după finalizarea descărcării." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Precizați proporția de acțiuni. Însămânțați torrentele completate până când " +"raportul de partajare atinge RATIO. Sunteți puternic încurajat să " +"specificați egal sau mai mare de 1,0 aici. Specificați 0.0 dacă intenționați " +"să efectuați însămânțarea indiferent de raportul de distribuire." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "Specificați numărul maxim de colegi pe torrent, 0 înseamnă nelimitat." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Specificați prefixul ID-ului omologului. În BitTorrent, ID-ul peer are o " +"lungime de 20 de octeți. Dacă sunt specificați mai mult de 20 de octeți, " +"sunt utilizați doar primii 20 de octeți. Dacă sunt specificați mai puțin de " +"20 de octeți, se adaugă date aleatorii de octeți pentru ca lungimea sa să " +"fie de 20 de octeți." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"Oprește descărcarea BitTorrent dacă viteza de descărcare este 0 în N secunde " +"consecutive. Dacă se dă 0, această funcție este dezactivată." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Oprire a timpului de așteptare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Serviciul Aria2 nu este în funcțiune." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Serviciul Aria2 este în funcțiune." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" +"Directorul în care se stochează fișierul de configurare, fișierul de sesiune " +"și fișierul DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" +"Directorul în care se stochează fișierul descărcat. De exemplu /mnt/" +"sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "Numele fișierului de jurnal." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "Numărul maxim de conexiuni la un server pentru fiecare descărcare." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" +"Această opțiune va fi ignorată în cazul în care un indicator privat este " +"setat într-un torrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Pauză" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "Adevărat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Utilizați un server proxy pentru toate protocoalele." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Utilizați autoritățile de certificare din FILE pentru a verifica omologii. " +"Fișierul de certificate trebuie să fie în format PEM și poate conține mai " +"multe certificate CA." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"Utilizați certificatul din FILE pentru serverul RPC. Certificatul trebuie să " +"fie în format PKCS12 (.p12, .pfx) sau în format PEM.
    Arhivele PKCS12 " +"trebuie să conțină certificatul, o cheie și, opțional, un lanț de " +"certificate suplimentare. Numai fișierele PKCS12 cu o parolă de import goală " +"pot fi deschise!
    În cazul în care se utilizează PEM, trebuie să " +"specificați și \"cheia privată RPC\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Utilizați certificatul clientului din FILE. Certificatul trebuie să fie în " +"format PKCS12 (.p12, .pfx) sau în format PEM.
    Arhivele PKCS12 trebuie să " +"conțină certificatul, o cheie și, opțional, un lanț de certificate " +"suplimentare. Numai fișierele PKCS12 cu o parolă de import goală pot fi " +"deschise!
    În cazul în care se utilizează PEM, trebuie să specificați și " +"\"Cheia privată\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"Utilizați cheia privată din FILE pentru serverul RPC. Cheia privată trebuie " +"să fie decriptată și în format PEM." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Utilizați cheia privată din FILE. Cheia privată trebuie să fie decriptată și " +"în format PEM. Comportamentul în cazul în care este furnizată una criptată " +"este nedefinit." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "Agent utilizator" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Nume de utilizator & Parolă" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"Verificați omologul folosind certificatele specificate în opțiunea \"CA " +"certificate\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Avertizare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "Puteți adăuga K sau M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/ru/aria2.po b/package/luci/applications/luci-app-aria2/po/ru/aria2.po new file mode 100644 index 0000000000..4f88cef67d --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/ru/aria2.po @@ -0,0 +1,894 @@ +msgid "" +msgstr "" +"Project-Id-Version: LuCI: aria2\n" +"POT-Creation-Date: 2017-11-30 23:45+0300\n" +"PO-Revision-Date: 2023-12-05 09:48+0000\n" +"Last-Translator: st7105 \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 5.3-dev\n" +"Project-Info: Это технический перевод, не дословный. Главное-удобный русский " +"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD включено" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Дополнительный BT трекер" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Расширенные параметры" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Все прокси" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Добавляет HEADER-ы в заголовок HTTP запроса." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria это легковесная, кроссплатформенная утилита загрузки файлов с " +"поддержкой множества протоколов и источников." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Интервал автосохранения" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Основные параметры" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Параметры BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "Порты BitTorrent-а" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Сертификат удостоверяющего центра" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Сертификат" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Проверить сертификат" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Закрывать соединение при скорости загрузки меньшей или равной данному " +"значению(байт в секунду). 0 означает отсутствие минимального лимита скорости." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Сбор данных..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Каталог расположения сonfig файла" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Конфигурация" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Тайм-аут подключения" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Содержимое конфигурационного файла: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Содержимое файла сессии: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "Порт прослушивания DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Отладка" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Отключить IPv6. Полезно если ваш DNS работет некорректно и хочется избежать " +"ужастно медленного поиска AAAA записей." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Дисковый кэш" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" +"Не разделять в диапазоне менее, чем 2*РАЗМЕР байт. Возможные значения: " +"1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Загрузка файла используя N соединений." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Каталог для загрузки" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" +"Включает функциональность IPv4 DHT. Он также включает поддержку трекеров UDP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Включить функциональность IPv6 DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Включить Local Peer Discovery." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Включить расширение обмена пирами (Peer Exchange, PEX)." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Включить дисковый кэш (в байтах), 0 для отключения." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Включить ведение системного журнала" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Включить обмен пирами" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Включить прокси" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Включен" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Ошибка" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Дополнительные настройки" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Ложь" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Расположение файла" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Файлы" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Запустить
    торрент-файл" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Для получения дополнительной информации посетите: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Принудительное сохранение" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Генерировать случайно" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Предоставить UCI доступ для luci-app-aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP принимает gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP без кэша" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "HTTP/FTP/SFTP опции" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Заголовок" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Здесь показаны файлы используемые aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" +"IPv4 DHT включен" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" +"IPv6 DHT включен" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "Протокол IPv6 отключен" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Если общая скорость загрузки каждого торрента ниже, чем SPEED, aria2 " +"временно увеличивает количество пиров, чтобы попытаться получить большую " +"скорость загрузки. Настройка этого параметра с предпочтительной скоростью " +"загрузки может увеличить скорость загрузки в некоторых случаях." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Информация" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Установленный веб-интерфейс:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "URL-адрес Json-RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Хранить в памяти" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "Последние 50 строк лог файла:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "Последние 50 строк syslog'а:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Оставьте пустым, чтобы использовать пользователя по умолчанию." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Список дополнительных URI анонсов BitTorrent трекера." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Список дополнительных настроек. Формат: опция=значение, например, " +"netrc-path=/tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Загрузка" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Системный журнал" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Данные журнала" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Файл журнала" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Уровень журналирования" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Минимальное ограничение скорости" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Максимальное количество одновременных загрузок" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Максимальное количество
    подключений на сервер" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Максимальная скорость скачивания" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Максимальное
    число разделений" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Максимальное количество открытых файлов" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Максимальный общий лимит загрузки" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Максимальный общий лимит загрузки" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Максимум пиров" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Максимум попыток" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Максимальная скорость отдачи" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Минимальный размер разделений" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Без проверки подлинности" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Журнал пуст." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Ничего" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Уведомление" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Пауза" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Поставить загрузку на паузу после добавления." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "Приостановить загрузки, созданные в результате загрузки метаданных." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Приостановить метаданные" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Пожалуйста, введите длину токена:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Префикс ID пира" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Закрытый ключ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Пароль прокси-сервера" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Пользователь прокси-сервера" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "Параметры RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "Метод аутентификации для доступа к удаленному управлению (RPC)" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "Сертификат RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "Пароль для доступа к удаленному управлению (RPC)" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "Порт для доступа к удаленному управлению (RPC)" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "Закрытый ключ RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "Безопасность RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "RPC токен" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"Транспорт RPC будет зашифрован с помощью SSL/TLS. Клиенты RPC должны " +"использовать схему https для доступа к серверу. Для клиента WebSocket " +"используйте схему wss." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "Логин для доступа к удаленному управлению (RPC)" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Обновлять каждые %s секунд." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Удалить невыбранные файлы" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Удаляет невыбранные файлы после завершения загрузки в BitTorrent. " +"Пожалуйста, используйте эту опцию с осторожностью, так как она фактически " +"удаляет файлы с вашего диска." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Запрос ограничения скорости пира" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Ожидание повторной попытки" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Запуск демона от имени пользователя" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Текущее состояние" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Сохранять контрольный файл (*.aria2) каждые N секунд. Если задано 0, " +"контрольный файл не сохраняется во время загрузки." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Сохранить загрузку в файл сеанса, даже если загрузка завершена или удалена. " +"Эта опция также сохраняет управляющий файл в таких ситуациях. Это может быть " +"полезно для сохранения раздачи BitTorrent, которая распознается как " +"завершенная." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Сохранять ошибки/незавершенные загрузки в файл сессии каждые N секунд. Если " +"задан 0, файл будет сохраняться только при выходе из aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Сохранять метаданные в файле \".torrent\". Эта опция действует только при " +"использовании BitTorrent Magnet URI. Имя файла представляет собой хэш info в " +"шестнадцатеричной кодировке с суффиксом \".torrent\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Сохранить метаданные" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Сохранить интервал сессии" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "Передача ранее загруженных файлов без проверки хэшей частей." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Соотношение сид" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Время раздачи" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Непроверенный сид" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Отправлять Accept: deflate, gzip заголовок в запросе и " +"увеличить ответ если заголовок в ответе удалённого сервера содержит " +"Content-Encoding: gzip или Content-Encoding: deflate." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Отправить Cache-Control: no-cache и Pragma: no-cache заголовки чтобы не кешировать содержимое. Если параметр отключен, то " +"заголовки не будут отправлены. Вы можете добавить Cache-Control заголовок с " +"любым значением используя параметр \"Заголовки\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"Установить TCP порт для BitTorrent загрузок. Допустимые форматы: " +"\"6881,6885\", \"6881-6999\" и \"6881-6889,6999\". Убедитесь что указанные " +"порты открыты для входящего TCP трафика." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"Установите порт прослушивания UDP, используемый DHT (IPv4, IPv6) и UDP-" +"трекером. Убедитесь, что указанные порты открыты для входящего UDP-трафика." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Установить максимальную скорость загрузки для каждой загрузки в байт/сек. 0 " +"значит без ограничений." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Установить максимальную общую скорость загрузки в байт/сек. 0 значит без " +"ограничений." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Установить максимальную общую скорость отдачи в байт/сек. 0 значит без " +"ограничений." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Установить максимальную скорость отдачи для каждого торрента в байт/сек. 0 " +"значит без ограничений." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Установите таймаут подключения в секундах для установления соединения с HTTP/" +"FTP/прокси-сервером. После установления соединения эта опция не имеет " +"эффекта и вместо нее используется опция \"Timeout\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Установить время ожидания в секундах между повторами." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Установка user-agent для загрузок HTTP(S)." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Настройки" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "Настройки в этом разделе будут добавлены в файл конфигурации." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Список настроек" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Укажите способ размещения файлов. Если вы используете более новые файловые " +"системы, такие как ext4 (с поддержкой экстентов), btrfs, xfs или NTFS " +"(только сборка MinGW), \"falloc\" ваш лучший выбор. Он выделяет большие " +"(несколько ГиБ) файлы почти мгновенно, но может быть недоступен, если в " +"вашей системе нет функции posix_fallocate(3). Не используйте \"falloc\" с " +"устаревшими файловыми системами, такими как ext3 и FAT32, потому что это " +"занимает почти то же время, что и \"prealloc\", и полностью блокирует aria2 " +"до завершения выделения." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Укажите максимальное количество файлов для открытия при многофайловой " +"загрузки BitTorrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Укажите время раздачи в минутах. Если вместе с этим параметром указан " +"параметр \"Коэффициент сид\", раздача заканчивается при выполнении хотя бы " +"одного из условий. Указание 0 отключает раздачу после завершения загрузки." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Укажите соотношение. Раздавать завершенные торренты до тех пор, пока " +"соотношение дюне достигнет RATIO. Настоятельно рекомендуется указывать здесь " +"значение, равное или большее 1.0. Укажите 0.0, если вы собираетесь выполнять " +"раздачу независимо от коэффициента." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" +"Укажите максимальное количество пиров для каждого торрента, 0 значит " +"неограниченно." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Укажите префикс ID пира. Длинна ID пира в BitTorrent 20 байт, если указано " +"больше, будут использоваться только первые 20. Если меньше, будет дополнено " +"до 20 байт случайными данными." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"Остановка загрузки BitTorrent, если скорость загрузки равна 0 в течение N " +"секунд подряд. Если задан 0, эта функция отключена." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Таймаут остановки" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Aria2 сервис не запущен." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Aria2 сервис запущен." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "Каталог хранения конфигурационных файлов, сессий и DHT файлов." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "Каталог хранения загруженных файлов. Например /mnt/sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "Название лог файла." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "Максимальное число подключений к одному серверу для каждой загрузки." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" +"Этот параметр будет проигнорирован, если указан приватный флаг в торренте." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Тайм-аут" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Токен" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "Истина" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Использовать прокси-сервер для всех протоколов." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Используйте центры сертификации в файле FILE для проверки пиров. Файл " +"сертификата должен быть в формате PEM и может содержать несколько " +"сертификатов CA." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"Используйте сертификат в FILE для RPC-сервера. Сертификат должен быть либо в " +"формате PKCS12 (.p12, .pfx), либо в формате PEM.
    Файлы PKCS12 должны " +"содержать сертификат, ключ и, по желанию, цепочку дополнительных " +"сертификатов. Открывать можно только файлы PKCS12 с пустым паролем импорта!" +"
    При использовании PEM необходимо также указать \"закрытый ключ RPC\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Используйте сертификат клиента в FILE. Сертификат должен быть либо в формате " +"PKCS12 (.p12, .pfx), либо в формате PEM.
    Файлы PKCS12 должны содержать " +"сертификат, ключ и, по желанию, цепочку дополнительных сертификатов. " +"Открывать можно только файлы PKCS12 с пустым паролем импорта!
    При " +"использовании PEM необходимо указать также \"Закрытый ключ\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"Используйте закрытый ключ в FILE для RPC-сервера. Закрытый ключ должен быть " +"расшифрован и иметь формат PEM." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Используйте закрытый ключ в файле FILE. Закрытый ключ должен быть " +"расшифрован и иметь формат PEM. Поведение при передаче зашифрованного ключа " +"не определено." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "User agent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Имя и пароль" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"Убедитесь, что пир использует сертификаты, указанные в опции \"Сертификат " +"CA\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Внимание" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "Можно добавить K или M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/sk/aria2.po b/package/luci/applications/luci-app-aria2/po/sk/aria2.po new file mode 100644 index 0000000000..72da087be7 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/sk/aria2.po @@ -0,0 +1,793 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-07-12 15:48+0000\n" +"Last-Translator: MaycoH \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD povolené" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Ďalší BT tracker" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Pokročilé nastavenia" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Všetky proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Pripojiť HEADERy k hlavičke požiadavky HTTP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2 je jednoduchý multi-protokolový a viaczdrojový nástroj na sťahovanie z " +"viacerých platforiem." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Interval automatického ukladania" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Základné možnosti" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "BitTorrent možnosti" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Zbieram dáta..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Adresár konfiguračného súboru" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Konfigurácia" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Ladenie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Adresár na stiahnutie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Povoliť protokolovanie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Zapnuté" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Chyba" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "Možnosti HTTP/FTP/SFTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Informácia" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Nainštalované webové rozhranie:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "Json-RPC URL adresa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Ponechajte prázdne, ak chcete použiť predvoleného používateľa." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +#, fuzzy +msgid "Loading" +msgstr "Načítava sa" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Záznam" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Úroveň záznamu" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Maximálny počet súčasných sťahovaní" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Žiadny" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Oznámenie" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Pozastaviť" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Po pridaní pozastaviť sťahovanie." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "Pozastaviť sťahovanie vytvorené v dôsledku sťahovania metadát." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Pozastaviť metadáta" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "Možnosti RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "Metóda autentifikácie RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "Zabezpečiť RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"Transport RPC bude šifrovaný pomocou SSL/TLS. Klienti RPC musia na prístup k " +"serveru používať schému https. Pre klienta WebSocket použite schému wss." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Stav spustenia" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Ak chcete nadviazať spojenie s HTTP/FTP/proxy serverom, nastavte v sekundách " +"časový limit pripojenia. Po nadviazaní spojenia táto voľba nebude účinná a " +"namiesto toho sa použije voľba \"Časový limit\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Nastavenia" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Služba Aria2 nie je spustená." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Služba Aria2 je spustená." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" +"Adresár na uloženie konfiguračného súboru, súboru relácie a súboru DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" +"Adresár na uloženie stiahnutého súboru. Napríklad /mnt/sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/sv/aria2.po b/package/luci/applications/luci-app-aria2/po/sv/aria2.po new file mode 100644 index 0000000000..5ed1e8fbdb --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/sv/aria2.po @@ -0,0 +1,791 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-09-17 17:51+0000\n" +"Last-Translator: Kristoffer Grundström \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.0.2\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD aktiverat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Extra BT-spårare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Avancerade alternativ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Alla proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Autosparningsintervall" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Vanliga alternativ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "BitTorrent-alternativ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "Lyssningsport för BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "CA-certifikat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Certifikat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Kontrollera certifikat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Stäng ner anslutning om nerladdningshastigheten är lägre än eller är lika " +"med det här värdet (bytes per sek). 0 innebär utan lägsta för " +"nerladdningshastighet." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Samlar in data..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Ställ in fil-mapp" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Konfiguration" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Konfigurationsfilens innehåll: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Sessionsfilens innehåll: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "Lyssningsport för DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Felsökning" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Disk-cache" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Ladda ner en fil med N-anslutningar." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Nedladdningsmapp" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Aktivera DHT-funktionalitet för IPv6." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Aktiva disk-cache (i bytes), ställ in 0 för avstängd." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Aktivera loggning" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Aktivera proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Aktiverad" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Fel" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Extra inställningar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Falsk" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Fil-allokering" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Filer" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Följ torrenten" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "För mer information, vänligen besök: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Påtvinga sparning" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Generera slumpmässigt" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Godkänn UCI-åtkomst för luci-app-aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP acceptera gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP ingen cache" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "HTTP/FTP/SFTP-alternativ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Här visas filerna som används av aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "IPv6 avstängt" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Info" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Installerat webbgränssnitt:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "Json-RPC URL" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Behåll i minnet" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "Logg-filens sista 50 rader:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "Sys-loggens sista 50 rader:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Lämna tom för att använda standard-användare." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Lista över extra inställningar. Format: alternativ=värde, t.ex. netrc-" +"path=/tmp/.netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Laddar" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Logg" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Logg-data" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Loggfil" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Logg-nivå" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Lägsta nerladdningshastighet" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Maximalt sammanhängande nerladdningar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Max antalet anslutningar per server" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Maximal nerladdningsgräns" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Högst antal split" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Maximalt öppna filer" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Maximala försök" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Maximal gräns för uppladdning" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Minsta split-storlek" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Ingen autentisering" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Ingen logg-data." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Ingen" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Avisering" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Pausa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Pausa metadata" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Peer-ID prefix" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Privat nyckel" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Proxy-lösenord" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Proxy-användare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "RPC-alternativ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "RPC-autentiseringsmetod" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "RPC-certifikat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC-lösenord" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC-port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "Privat RPC-nyckel" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC-säker" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "RPC-användarnamn" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Uppdatera var %s sekunder." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Ta bort icke-vald fil" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Tar bort de filer som inte har valts när hämtningen är slutförd i " +"BitTorrent. Vänligen använd det här alternativet med omsorg eftersom att det " +"faktiskt kommer att ta bort filer från din hårddisk." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Kör daemon som användare" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Kör-status" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Spara metadata" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Inställningar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Aria2-tjänsten körs inte." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Aria2-tjänsten körs." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Timeout" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Tecken" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Användarnamn & Lösenord" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Varna" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/templates/aria2.pot b/package/luci/applications/luci-app-aria2/po/templates/aria2.pot new file mode 100644 index 0000000000..a1ec0d5a15 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/templates/aria2.pot @@ -0,0 +1,774 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/tr/aria2.po b/package/luci/applications/luci-app-aria2/po/tr/aria2.po new file mode 100644 index 0000000000..a5e3422d80 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/tr/aria2.po @@ -0,0 +1,886 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-29 19:41+0000\n" +"Last-Translator: semih \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.2-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD etkin" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Ek BT izleyici" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Gelişmiş Ayarlar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Bütün vekiller" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "BAŞLIKLARI HTTP istek başlığına ekleyin." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" +"Aria2, yükte hafif, çok protokollü & çok kaynaklı, çapraz platform " +"indirme programıdır." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Otomatik kaydetme aralığı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Temel Ayarlar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "BitTorrent Seçenekleri" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "BitTorrent dinleme bağlantı noktası" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "CA sertifikası" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Sertifika" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Sertifikayı kontrol et" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"İndirme hızı bu değerden düşükse veya bu değere eşitse bağlantıyı kapatın " +"(saniye başına bayt). 0, en düşük hız sınırının olmadığı anlamına gelir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Veriler toplanıyor..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Yapılandırma dosyası dizini" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Yapılandırma" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Bağlantı zaman aşımı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Yapılandırma dosyasının içeriği: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Oturum dosyasının içeriği: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "DHT Dinleme bağlantı noktası" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Hata ayıklama" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"IPv6'yı devre dışı bırakın. Bozuk DNS kullanmanız gerekiyorsa ve çok yavaş " +"AAAA kaydı aramasından kaçınmak istiyorsanız bu yararlıdır." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Disk önbelleği" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "2*SIZE bayt aralığından daha az bölmeyin. Olası değerler: 1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "N bağlantı kullanarak bir dosya indirin." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "İndirme dizini" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" +"IPv4 DHT işlevselliğini etkinleştirin. Ayrıca UDP izleyici desteğini de " +"etkinleştirir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "IPv6 DHT işlevselliğini etkinleştirin." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Yerel Eş Bulmayı etkinleştirin." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Peer Exchange uzantısını etkinleştirin." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" +"Disk önbelleğini etkinleştirin (bayt cinsinden), 0'ı devre dışı demektir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Günlük kaydını etkinleştir" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Eş değişimini etkinleştir" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Proxy'yi etkinleştir" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Etkin" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Hata" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Ek Ayarlar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "Yanlış" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Dosya tahsisi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Dosyalar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Torrent'i takip edin" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Daha fazla bilgi için lütfen şu adresi ziyaret edin: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Kaydetmeye zorla" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Rastgele Oluştur" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "luci-app-aria2 için UCI erişimi verin" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP gzip'i kabul et" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP önbellek yok" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "HTTP / FTP / SFTP Seçenekleri" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Üstbilgi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Burada aria2 tarafından kullanılan dosyalar gösterilmektedir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "IPv4 DHT etkin" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "IPv6 DHT etkin" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "IPv6 devre dışı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Her torrentin tüm indirme hızı belirtilen hızdan düşükse, aria2 daha fazla " +"indirme hızı için denenecek eş sayısını geçici olarak artırır. Bu seçeneği " +"tercih ettiğiniz indirme hızıyla yapılandırmak bazı durumlarda indirme " +"hızınızı artırabilir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Bilgi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Yüklenmiş web arayüzü:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "Json-RPC URL'si" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Hafızada tut" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "Günlük dosyasının son 50 satırı:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "Sistem günlüğünün son 50 satırı:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Varsayılan kullanıcıyı kullanmak için boş bırakın." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Ek BitTorrent izleyicisinin ilan URI'sinin listesi." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"Ekstra ayarların listesi. Format: option=value, örn. netrc-path=/tmp/." +"netrc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Yükleniyor" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Günlük" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Günlük Verileri" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Günlük dosyası" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Günlük seviyesi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "En düşük hız sınırı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Maksimum eşzamanlı indirme" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Sunucu başına maksimum bağlantı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Maksimum indirme sınırı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Maksimum bölme sayısı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Maksimum açık dosya" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Maksimum genel indirme sınırı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Maksimum genel yükleme sınırı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Maksimum eş sayısı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Maksimum deneme" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Maksimum yükleme sınırı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Minimum bölme boyutu" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Doğrulama Yok" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Günlük verisi yok." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Yok" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Uyarı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Duraklat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Ekledikten sonra indirmeyi duraklatın." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" +"Meta veri indirmesinin bir sonucu olarak oluşturulan indirmeleri duraklatın." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Meta veriyi duraklat" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Lütfen simge uzunluğunu girin:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Eş kimliğinin öneki" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Özel anahtar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Proxy şifresi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Proxy kullanıcı adı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "RPC Seçenekleri" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "RPC kimlik doğrulama yöntemi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "RPC sertifikası" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC şifresi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC bağlantı noktası" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "RPC özel anahtarı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC güvenli" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "RPC tokeni" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"RPC aktarımı, SSL / TLS ile şifrelenecektir. RPC istemcileri, sunucuya " +"erişmek için https şemasını kullanmalıdır. WebSocket istemcisi için wss " +"şemasını kullanın." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "RPC kullanıcı adı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Her %s saniyede bir yenile." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Seçili olmayan dosyayı kaldır" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"BitTorrent'te indirme tamamlandığında seçilmemiş dosyaları kaldırır. " +"Dosyaları gerçekten diskinizden kaldıracağı için lütfen bu seçeneği dikkatli " +"kullanın." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Eş hız sınırı isteyin" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Yeniden deneme için bekle" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Arka plan programı kullanıcı olarak çalıştır" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Çalışma Durumu" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Her N saniyede bir kontrol dosyası (*.aria2) kaydedin. 0 verilirse, indirme " +"sırasında bir kontrol dosyası kaydedilmez." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"İndirme tamamlansa veya kaldırılsa bile indirmeyi oturum dosyasına kaydedin. " +"Bu seçenek aynı zamanda bu durumlarda kontrol dosyasını da kaydeder. Bu, " +"tamamlanmış durum olarak tanınan BitTorrent göndermelerini kaydetmek için " +"yararlı olabilir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Hatayı / bitmemiş indirmeleri her N saniyede bir oturum dosyasına kaydedin. " +"0 verilirse, dosya yalnızca aria2 çıktığında kaydedilir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Meta verileri \".torrent\" dosyası olarak kaydedin. Bu seçenek yalnızca " +"BitTorrent Magnet URI kullanıldığında etkilidir. Dosya adı, \".torrent\" " +"sonekiyle birlikte onaltılık olarak kodlanmış bilgi karmasıdır." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Meta verileri kaydedin" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Oturum aralığını kaydet" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "Parça karmalarını doğrulamadan önceden indirilen dosyaları gönderin." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Gönderme oranı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Gönderme süresi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Doğrulanmamış gönderme" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Gönder Accept: deflate, gzip başlık ve şişirme yanıtını iste, " +"eğer uzak sunucu bununla yanıt verirse Content-Encoding: gzip " +"veya Content-Encoding: deflate." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Gönder Cache-Control: no-cache ve Pragma: no-cache " +"başlığı önbelleğe alınmış içeriği önlemek için. Devre dışı bırakılırsa, bu " +"başlıklar gönderilmez ve \"Başlık\" seçeneğini kullanarak beğendiğiniz bir " +"yönergeyle Cache-Control başlığı ekleyebilirsiniz." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"BitTorrent indirmeleri için TCP bağlantı noktası numarasını ayarlayın. " +"Format: \"6881,6885\", \"6881-6999\" ve \"6881-6889,6999\". Belirtilen " +"bağlantı noktalarının gelen TCP trafiği için açık olduğundan emin olun." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"DHT (IPv4, IPv6) ve UDP izleyici tarafından kullanılan UDP dinleme bağlantı " +"noktasını ayarlayın. Belirtilen bağlantı noktalarının gelen UDP trafiği için " +"açık olduğundan emin olun." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Her indirme başına maksimum indirme hızını bayt / saniye cinsinden " +"ayarlayın. 0, sınırsız anlamına gelir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Maksimum genel indirme hızını bayt / saniye cinsinden ayarlayın. 0, sınırsız " +"anlamına gelir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Maksimum genel yükleme hızını bayt / saniye cinsinden ayarlayın. 0, sınırsız " +"anlamına gelir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Her torrent için maksimum yükleme hızını bayt / saniye olarak ayarlayın. 0, " +"sınırsız anlamına gelir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"HTTP / FTP / proxy sunucusuna bağlantı kurmak için bağlantı zaman aşımını " +"saniye cinsinden ayarlayın. Bağlantı kurulduktan sonra bu seçenek bir etki " +"yapmaz ve onun yerine \"Zaman Aşımı\" seçeneği kullanılır." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Yeniden denemeler arasında beklenecek saniyeyi ayarlayın." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "HTTP(S) indirmeleri için kullanıcı aracısını ayarlayın." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Ayarlar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "Bu bölümdeki ayarlar yapılandırma dosyasına eklenecektir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Ayarlar listesi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Dosya ayırma yöntemini belirtin. Ext4 (uzantı destekli), btrfs, xfs veya " +"NTFS (yalnızca MinGW) gibi daha yeni dosya sistemleri kullanıyorsanız, " +"\"falloc\" en iyi seçimdir. Büyük (birkaç GiB) dosyaları neredeyse anında " +"ayırır, ancak sisteminizde posix_fallocate (3) işlevi yoksa " +"kullanılamayabilir. Ext3 ve FAT32 gibi eski dosya sistemlerinde \"falloc\" " +"kullanmayın çünkü \"prealloc\" ile neredeyse aynı süreyi alır ve tahsis " +"bitene kadar aria2'yi tamamen engeller." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Genel olarak çok dosyalı BitTorrent indirmesinde açılacak maksimum dosya " +"sayısını belirtin." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Gönderme süresini dakika cinsinden belirtin. Bu seçenekle birlikte " +"\"Gönderme oranı\" seçeneği belirtilirse, koşullardan en az biri " +"sağlandığında gönderme sona erer. 0 seçilirse, indirme tamamlandıktan sonra " +"göndermeyi devre dışı bırakır." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Paylaşım oranını belirtin. Paylaşım oranı ulaşana kadar tamamlanmış " +"torrentleri gönderin. Burada 1.0'a eşit veya daha fazla değeri belirtmeniz " +"şiddetle tavsiye edilir. Paylaşım oranından bağımsız olarak göndermeyi " +"planlıyorsanız 0,0 değerini belirtin." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" +"Torrent başına maksimum eş sayısını belirtin, 0 sınırsız anlamına gelir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Eş kimliğinin önekini belirtin. BitTorrent'teki eş kimliği 20 bayt " +"uzunluğundadır. 20 bayttan fazla belirtilirse, yalnızca ilk 20 bayt " +"kullanılır. 20 bayttan az belirtilirse, uzunluğunu 20 bayt yapmak için " +"rastgele bayt verileri eklenir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"İndirme hızı art arda N saniye içinde 0 ise BitTorrent indirmeyi durdursun. " +"0 seçilirse bu özellik devre dışı bırakılır." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Durma zaman aşımı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Aria2 hizmeti çalışmıyor." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Aria2 hizmeti çalışıyor." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" +"Yapılandırma dosyasını, oturum dosyasını ve DHT dosyasını depolamak için " +"dizin." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "İndirilen dosyanın saklanacağı dizin. Örneğin /mnt/sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "Günlük dosyasının dosya adı." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "Her indirme için bir sunucuya maksimum bağlantı sayısı." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" +"Bir torrentte özel bir bayrak ayarlanmışsa bu seçenek göz ardı edilecektir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Zaman aşımı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Jeton" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "Doğru" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Tüm protokoller için bir proxy sunucusu kullanın." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Eşleri doğrulamak için dosyadaki sertifika yetkililerini kullanın. Sertifika " +"dosyası PEM biçiminde olmalıdır ve birden çok CA sertifikası içerebilir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"RPC sunucusu için dosya içindeki sertifikayı kullanın. Sertifika, PKCS12 (." +"p12, .pfx) veya PEM biçiminde olmalıdır.
    PKCS12 dosyaları, sertifika, " +"bir anahtar ve isteğe bağlı olarak bir ek sertifika zinciri içermelidir. " +"Yalnızca boş bir içe aktarma şifresine sahip PKCS12 dosyaları açılabilir! " +"
    PEM kullanırken, \"RPC özel anahtarını\" da belirtmeniz gerekir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Dosya içindeki istemci sertifikasını kullanın. Sertifika, PKCS12 (.p12, ." +"pfx) veya PEM biçiminde olmalıdır.
    PKCS12 dosyaları, sertifika, bir " +"anahtar ve isteğe bağlı olarak bir ek sertifika zinciri içermelidir. " +"Yalnızca boş bir içe aktarma şifresine sahip PKCS12 dosyaları açılabilir! " +"
    PEM kullanırken, \"Özel anahtarı\" da belirtmeniz gerekir." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"RPC sunucusu için dosyadaki özel anahtarı kullanın. Özel anahtarın şifresi " +"çözülmüş ve PEM biçiminde olmalıdır." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Dosyadaki özel anahtarı kullanın. Özel anahtarın şifresi çözülmüş ve PEM " +"biçiminde olmalıdır. Şifrelenmiş olarak verildiği zamanki davranış " +"tanımsızdır." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "Kullanıcı aracısı" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Kullanıcı adı Şifre" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"\"CA sertifikası\" seçeneğinde belirtilen sertifikaları kullanarak eşi " +"doğrulayın." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Uyar" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "K veya M'yi ekleyebilirsiniz." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/uk/aria2.po b/package/luci/applications/luci-app-aria2/po/uk/aria2.po new file mode 100644 index 0000000000..54f3c5366d --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/uk/aria2.po @@ -0,0 +1,787 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-11-28 20:47+0000\n" +"Last-Translator: Arkadii Yakovets \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.15-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "" +"LPD увімкнено" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Додаткові параметри" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Інтервал автозбереження" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Основні параметри" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Параметри BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Збирання даних..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Каталог файлів конфігурації" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Конфігурація" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Час очікування з'єднання" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Вміст файлу конфігурації: % s " + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Вміст файлу сеансу: % s " + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Зневаджування" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Вимкнути IPv6. Це корисно, якщо вам доведеться використовувати зламаний DNS " +"і хочете уникнути надзвичайно повільного пошуку записів AAAA." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Дисковий кеш" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Завантажте файл за допомогою N з'єднань." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Каталог завантажень" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "Увімкнути функцію IPv4 DHT. Вона також активує підтримку UDP-трекера." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Увімкнути ведення звіту" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Увімкнено" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Помилка" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Додаткові налаштування" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Файли" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Генерувати випадково" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Інформація" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Завантаження" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Звіт" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Файл звіту" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Зауваження" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Налаштування" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Часове обмеження" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "" diff --git a/package/luci/applications/luci-app-aria2/po/vi/aria2.po b/package/luci/applications/luci-app-aria2/po/vi/aria2.po new file mode 100644 index 0000000000..50bdec7534 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/vi/aria2.po @@ -0,0 +1,873 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-06-20 05:31+0000\n" +"Last-Translator: Cường Quang \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.18.1\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "LPD kích hoạt" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "Trình theo dõi BT bổ sung" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "Cài đặt nâng cao" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "Tất cả proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "Nối HEADER vào tiêu đề yêu cầu HTTP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "Aria2 là một & tiện ích tải xuống đa nguồn, đa nền tảng." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "Tự động lưu khoảng thời gian" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "Cài đặt cơ bản" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "Cài đặt BitTorrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "BitTorrent listen port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "Chứng chỉ CA" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "Chứng chỉ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "Kiểm tra chứng chỉ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"Đóng kết nối nếu tốc độ tải xuống thấp hơn hoặc bằng giá trị này (byte trên " +"giây). 0 có nghĩa là không có giới hạn tốc độ thấp nhất." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "Đang lấy dữ liệu..." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "Thư mục tập tin cấu hình" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "Cấu hình" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "Quá thời gian kết nối" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "Nội dung file cấu hình: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "Nội dung của tệp: %s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "DHT Listen port" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "Debug" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"Vô hiệu hóa IPv6. Điều này hữu ích nếu bạn phải sử dụng DNS bị hỏng và muốn " +"tránh việc tra cứu bản ghi AAAA quá chậm." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "Bộ đệm đĩa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" +"Không phân chia phạm vi byte nhỏ hơn 2*SIZE. Các giá trị có thể có: 1M-1024M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "Tải xuống tệp bằng N kết nối." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "Thư mục tải về" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "Bật chức năng IPv4 DHT. Nó cũng cho phép hỗ trợ trình theo dõi UDP." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "Bật chức năng IPv6 DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "Bật Local Peer Discovery." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "Bật Peer Exchange extension." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "Bật bộ đệm đĩa (tính bằng byte), đặt 0 thành tắt." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "Bật logging" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "Bật peer exchange" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "Bật proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "Kích Hoạt" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "Lỗi" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "Cài đặt bổ sung" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "False" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "Phân bổ tệp" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "Tệp" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "Theo dõi Torrent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "Để biết thêm thông tin, vui lòng ghé qua: %s." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "Bắt buộc lưu" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "Tạo ngẫu nhiên" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "Cấp quyền truy cập UCI cho luci-app-aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP accept gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP không cache" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "Cài đặt HTTP/FTP/SFTP" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "Header" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "Ở đây hiển thị các tệp được sử dụng bởi aria2." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "IPv4 DHT đã được bật" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "IPv6 DHT đã được bật" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "Vô hiệu hóa IPv6" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"Nếu toàn bộ tốc độ tải xuống của mỗi torrent thấp hơn SPEED, thì aria2 tạm " +"thời tăng số lượng torrent ngang hàng để thử tăng tốc độ tải xuống. Định cấu " +"hình tùy chọn này với tốc độ tải xuống ưa thích của bạn có thể tăng tốc độ " +"tải xuống của bạn trong một số trường hợp." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "Thông tin" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "Đã cài đặt web interface:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "Json-RPC URL" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "Giữ trong bộ nhớ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "50 dòng cuối cùng của tệp nhật ký:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "50 dòng cuối cùng của tệp syslog:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "Để trống để sử dụng người dùng mặc định." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "Danh sách URI thông báo bổ sung của trình theo dõi BitTorrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "802.11k: Kích hoạt báo cáo đèn hiệu thông qua các phép đo vô tuyến." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "Đang tải" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "Nhật ký" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "Dữ liệu nhật ký" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "Tệp nhật ký" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "Cấp độ log" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "Giới hạn tốc độ thấp nhất" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "Tải xuống đồng thời tối đa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "Kết nối tối đa trên mỗi máy chủ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "Giới hạn tải xuống tối đa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "Số lần chia tối đa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "Tệp mở tối đa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "Giới hạn tải xuống tổng thể tối đa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "Giới hạn tải lên tổng thể tối đa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "Max peers" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "Lần thử lại tối đa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "Giới hạn tải lên tối đa" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "Kích thước chia tối thiểu" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "Không có chứng thực" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "Không có dữ liệu log." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "Không có" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "Lưu ý" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "Tạm dừng" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "Tạm dừng tải xuống sau khi thêm." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "Tạm dừng tải xuống được tạo do metadata." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "Pause metadata" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "Vui lòng nhập độ dài token:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Prefix of peer ID" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "Private key" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "Mật khẩu Proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "Người dùng Proxy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "Cài đặt RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "Phương thức xác thực RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "Chứng chỉ RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "Mật khẩu RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "Cổng RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "RPC private key" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC secure" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "RPC token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"Vận chuyển RPC sẽ được mã hóa bằng SSL/TLS. Máy khách RPC phải sử dụng lược " +"đồ https để truy cập máy chủ. Đối với máy khách WebSocket, hãy sử dụng sơ đồ " +"wss." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "Tên tài khoản RPC" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "Làm mới mỗi %s giây." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "Xóa bỏ tệp chưa chọn" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"Xóa các tệp không được chọn khi quá trình tải xuống hoàn tất trong " +"BitTorrent. Vui lòng sử dụng tùy chọn này cẩn thận vì nó thực sự sẽ xóa các " +"tệp khỏi đĩa của bạn." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "Yêu cầu giới hạn tốc độ peer" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "Thử đợi lại" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "Chạy daemon với tư cách người dùng" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "Trạng thái đang chạy" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"Lưu tệp điều khiển (*.aria2) cứ sau N giây. Nếu 0 được đưa ra, tệp điều " +"khiển sẽ không được lưu trong quá trình tải xuống." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"Lưu bản tải xuống vào tệp phiên ngay cả khi quá trình tải xuống hoàn tất " +"hoặc bị xóa. Tùy chọn này cũng lưu tệp điều khiển trong trường hợp đó. Điều " +"này có thể hữu ích để lưu tạo giống BitTorrent được công nhận là trạng thái " +"hoàn thành." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"Lưu lỗi/tải xuống chưa hoàn thành vào tệp phiên cứ sau N giây. Nếu 0 được " +"đưa ra, tệp sẽ chỉ được lưu khi aria2 thoát." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"Lưu metadata dưới dạng tệp \".torrent\". Tùy chọn này chỉ có tác dụng khi " +"URI BitTorrent Magnet được sử dụng. Tên tệp là hex thông tin được mã hóa hex " +"có hậu tố \".torrent\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "Lưu metadata" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "Lưu khoảng thời gian phiên" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "Tạo các tệp đã tải xuống trước đó mà không cần xác minh hashes." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "Tần suất seed" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "Thời gian Seed" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "Chưa xác minh Seed" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"Gửi tiêu đề yêu cầu Accept: deflate, gzip và tăng cường phản " +"hồi nếu máy chủ từ xa phản hồi bằng Content-Encoding: gzip hoặc " +"Content-Encoding: deflate." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"Gửi tiêu đề Cache-Control: no-cache và Pragma: no-cache để tránh nội dung được lưu trong bộ nhớ cache. Nếu bị tắt, các tiêu đề " +"này sẽ không được gửi và bạn có thể thêm tiêu đề Kiểm soát bộ đệm bằng lệnh " +"bạn muốn bằng cách sử dụng tùy chọn \"Tiêu đề\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"Đặt số cổng TCP để tải xuống BitTorrent. Chấp nhận định dạng: \"6881,6885\", " +"\"6881-6999\" và \"6881-6889,6999\". Đảm bảo rằng các cổng được chỉ định " +"đang mở cho lưu lượng TCP đến." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"Đặt cổng nghe UDP được sử dụng bởi DHT (IPv4, IPv6) và trình theo dõi UDP. " +"Đảm bảo rằng các cổng được chỉ định đang mở cho lưu lượng truy cập UDP đến." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "" +"Đặt tốc độ tải xuống tối đa cho mỗi lần tải xuống tính bằng byte/giây. 0 có " +"nghĩa là không giới hạn." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Đặt tốc độ tải xuống tổng thể tối đa tính bằng byte/giây. 0 có nghĩa là " +"không giới hạn." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "" +"Đặt tốc độ tải lên tổng thể tối đa tính bằng byte/giây. 0 có nghĩa là không " +"giới hạn." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "" +"Đặt tốc độ tải lên tối đa cho mỗi torrent tính bằng byte/giây. 0 có nghĩa là " +"không giới hạn." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"Đặt thời gian chờ kết nối tính bằng giây để thiết lập kết nối với máy chủ " +"HTTP/FTP/proxy. Sau khi kết nối được thiết lập, tùy chọn này không có hiệu " +"lực và tùy chọn \"Hết giờ\" được sử dụng thay thế." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "Đặt số giây chờ giữa các lần thử lại." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "Đặt user agent để tải xuống HTTP(S)." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "Cài đặt" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "Cài đặt trong phần này sẽ được thêm vào tệp cấu hình." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "Danh sách cài đặt" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"Chỉ định phương pháp phân bổ tập tin. Nếu bạn đang sử dụng các hệ thống tệp " +"mới hơn, chẳng hạn như ext4 (có hỗ trợ mở rộng), btrfs, xfs hoặc NTFS (chỉ " +"dành cho bản dựng MinGW), \"falloc\" là lựa chọn tốt nhất của bạn. Nó phân " +"bổ các tệp lớn (vài GiB) gần như ngay lập tức, nhưng nó có thể không khả " +"dụng nếu hệ thống của bạn không có chức năng posix_fallocate(3). Không sử " +"dụng \"falloc\" với các hệ thống tệp cũ như ext3 và FAT32 vì nó mất gần như " +"cùng thời gian với \"prealloc\" và nó chặn hoàn toàn aria2 cho đến khi quá " +"trình phân bổ kết thúc." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "" +"Chỉ định số lượng tệp tối đa để mở trong tải xuống BitTorrent nhiều tệp." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"Chỉ định thời gian seed tính bằng phút. Nếu tùy chọn \"Tỷ lệ seed\" được chỉ " +"định cùng với tùy chọn này, thì việc seed kết thúc khi ít nhất một trong các " +"điều kiện được thỏa mãn. Chỉ định 0 sẽ vô hiệu hóa quá trình tạo hạt giống " +"sau khi tải xuống hoàn tất." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"Chỉ định tỷ lệ chia sẻ. Tải torrent đã hoàn thành cho đến khi tỷ lệ chia sẻ " +"đạt RATIO. Bạn nên chỉ định bằng hoặc hơn 1 ở đây. Chỉ định 0,0 nếu bạn định " +"tạo seed bất kể tỷ lệ chia sẻ." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "" +"Chỉ định số lượng ngang hàng tối đa trên mỗi torrent, 0 có nghĩa là không " +"giới hạn." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"Chỉ định tiền tố của peer ID. Peer ID trong BitTorrent có độ dài 20 byte. " +"Nếu hơn 20 byte được chỉ định, chỉ 20 byte đầu tiên được sử dụng. Nếu ít hơn " +"20 byte được chỉ định, dữ liệu byte ngẫu nhiên sẽ được thêm vào để làm cho " +"độ dài của nó là 20 byte." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"Dừng tải xuống BitTorrent nếu tốc độ tải xuống bằng 0 trong N giây liên " +"tiếp. Nếu 0 được đưa ra, tính năng này bị vô hiệu hóa." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "Dừng hết thời gian chờ" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Dịch vụ The Aria2 đang không chạy." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Dịch vụ The Aria2 đang chạy." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "Thư mục lưu trữ tệp cấu hình, tệp phiên và tệp DHT." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "Thư mục lưu trữ tệp đã tải xuống. Ví dụ /mnt/sda1." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "Tên tệp của tệp nhật ký." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "Số lượng kết nối tối đa đến một máy chủ cho mỗi lần tải xuống." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "Tùy chọn này sẽ bị bỏ qua nếu cờ riêng tư được đặt trong một torrent." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "Quá thời gian" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "Token" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "True" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "Sử dụng máy chủ proxy cho tất cả các giao thức." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"Sử dụng cơ quan cấp chứng chỉ trong FILE để xác minh các đồng nghiệp. Tệp " +"chứng chỉ phải ở định dạng PEM và có thể chứa nhiều chứng chỉ CA." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"Sử dụng chứng chỉ trong TẬP TIN cho máy chủ RPC. Chứng chỉ phải ở định dạng " +"PKCS12 (.p12, .pfx) hoặc PEM.
    Tệp PKCS12 phải chứa chứng chỉ, khóa và " +"một chuỗi chứng chỉ bổ sung tùy chọn. Chỉ có thể mở các tệp PKCS12 có mật " +"khẩu nhập trống!
    Khi sử dụng PEM, bạn cũng phải chỉ định \"khóa riêng " +"RPC\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"Sử dụng chứng chỉ ứng dụng khách trong FILE. Chứng chỉ phải ở định dạng " +"PKCS12 (.p12, .pfx) hoặc PEM.
    Tệp PKCS12 phải chứa chứng chỉ, khóa và " +"một chuỗi chứng chỉ bổ sung tùy chọn. Chỉ có thể mở các tệp PKCS12 có mật " +"khẩu nhập trống!
    Khi sử dụng PEM, bạn cũng phải chỉ định \"Private key\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "" +"Sử dụng private key trong FILE cho máy chủ RPC. Private key phải được giải " +"mã và ở định dạng PEM." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "" +"Sử dụng private key trong FILE. Private key phải được giải mã và ở định dạng " +"PEM. Hành vi khi mã hóa được đưa ra là không xác định." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "User agent" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "Tên tài khoản & mật khẩu" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "" +"Xác minh Peer bằng cách sử dụng các chứng chỉ được chỉ định trong tùy chọn " +"\"Chứng chỉ CA\"." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "Cảnh báo" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "You can append K or M." + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/zh_Hans/aria2.po b/package/luci/applications/luci-app-aria2/po/zh_Hans/aria2.po new file mode 100644 index 0000000000..fd0f916dd8 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/zh_Hans/aria2.po @@ -0,0 +1,830 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-06-13 08:35+0000\n" +"Last-Translator: Eric \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_Hans\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "启用 LPD" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "附加的 BT Tracker" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "高级选项" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "全局代理" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "附加的 HTTP 请求头。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "Aria2 是一个轻量、多线程,跨平台的下载工具。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "自动保存间隔" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "基本选项" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "BT 选项" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "BT监听端口" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "CA 证书" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "证书" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "检查证书" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "" +"如果速度小于或等于这个速度(字节/秒),关闭下载下载连接。0 表示不限制下载速" +"度。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "正在收集数据…" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "配置文件目录" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "配置" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "连接超时时间" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "配置文件的内容:%s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "会话文件的内容:%s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "DHT 监听端口" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "调试" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"禁用 IPv6。如果你的 DNS 有问题并希望避免 AAAA 查询过慢,可以启用此选项。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "磁盘缓存" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "当数据小于 2*SIZE 时不分割。可能的值:1M-1024M。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "使用 N 个线程下载文件。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "下载目录" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "启用 IPv4 DHT 功能。会同时启用 UDP Tracker 支持。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "启用 IPv6 DHT 功能。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "启用本地 Peer 查找。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "启用 Peer 交换扩展。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "启用硬盘缓存(以字节为单位),0 表示禁用。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "启用日志" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "启用对等交换" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "启用代理" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "启用" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "错误" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "附加选项" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "否" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "文件分配" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "文件" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "自动添加下载的种子" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "更多信息,请访问:%s。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "强制保存" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "随机生成" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "允许 luci-app-aria2 访问 UCI" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "HTTP 接受 Gzip" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP 无缓存" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "HTTP/FTP/SFTP 选项" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "请求头" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "这里展示了 Aria2 使用的文件。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "启用 IPv4 DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "启用 IPv6 DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "禁用 IPv6" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"如果某个 BT 任务的下载速度小于配置的速度,Aria2 会临时提高对端的数量来尝试获" +"得更大的下载速度。在某些情况下,配置此选项能提高你的下载速度。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "信息" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "已安装的 WEB 界面:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "Json-RPC 统一资源定位地址" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "保存在内存中" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "日志文件的最新 50 行:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "系统日志的最新 50 行:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "留空以使用默认用户。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "额外的 BT Tracker 通告链接。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"额外设置的列表。格式:选项=值,例如:netrc-path=/tmp/.netrc。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "加载中" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "日志" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "日志数据" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "日志文件" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "日志记录等级" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "最低限速" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "最大同时下载任务数" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "单服务器最大连接数" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "最大下载限速" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "单文件最大线程数" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "最大打开文件数" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "最大全局下载限速" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "最大全局上传限速" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "最大 Peer 数量" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "最大重试次数" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "最大上传限速" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "最小文件分片大小" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "无认证" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "无日志数据。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "无" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "注意" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "暂停" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "在下载任务添加后暂停。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "暂停下载内容为元数据的下载(磁力链接和 Matalink)。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "暂停元数据" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "请输入密钥长度:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "对端 ID 前缀" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "私钥" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "代理密码" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "代理用户名" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "RPC 选项" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "RPC 认证方式" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "RPC 证书" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC 密码" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC 端口" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "RPC 私钥" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC 加密" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "RPC 令牌" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"用 SSL/TLS 加密 RPC 连接。RPC 客户端必须使用 HTTPS 协议来连接服务端,对于 " +"WebSocket 客户端,则使用 WSS 协议。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "RPC 用户名" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "每 %s 秒刷新。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "删除未选择的文件" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "BT 下载完成时删除未选择的文件。文件将从磁盘中被完全删除,请谨慎使用。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "单个 Peer 限速" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "重试等待" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "以此用户权限运行" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "运行状态" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"每 N 秒保存下载“控制文件”(*.aria2)。设置 0 表示在下载过程中不保存控制文件。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"即使下载已完成或已删除,也将其保存到会话文件。开启此选项也会同时保存“控制文" +"件”。此选项可能有助于保持被识别为已完成状态的 BT 做种。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"每 N 秒将失败的/未完成的下载保存到 Session 文件。设置 0 则仅在 Aria2 退出时保" +"存。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"将元数据保存到 \".torrent\" 文件。此选项仅在下载连接为 BT 磁力链接时生效。文" +"件名为 Hash 值,后缀为 \".torrent\"。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "保存元数据" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "会话保存间隔" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "继续之前的BT任务时, 无需再次校验分片 Hash。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "做种比率" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "做种时间" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "不校验种子" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"发送 Accept: deflate, gzip 请求头,当服务器响应头包含 " +"Content-Encoding: gzip 或者 Content-Encoding: deflate 时解压响应数据。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"发送 Cache-Control: no-cache 和 Pragma: no-cache 请" +"求头来防止缓存内容,禁用则不发送。你也可用使用“请求头”选项来设置 Cache-" +"Control 请求头。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"为 BT 下载设置 TCP 端口。支持的格式:\"6881,6885\",\"6881-6999\" 和 " +"\"6881-6889,6999\"。请确保正确放行了这些端口的 TCP 入站通信。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"为 DHT(IPv4,IPv6)和 UDP tracker 设置 UDP 监听端口。请确保正确放行了这些端" +"口的 UDP 入站通信。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "设置每个任务的最大下载速度(字节/秒),0 表示不限制。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "设置全局最大下载速度(字节/秒),0 表示不限制。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "设置全局最大上传速度,0 表示不限制。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "设置每个任务的最大上传速度(字节/秒),0 表示不限制。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"设置 HTTP、FTP 和代理服务器的连接超时时间。当连接建立后,该选项失去作用," +"而“超时时间”选项会被使用。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "设置重试的时间间隔。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "为 HTTP(S) 下载设置用户代理。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "设置" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "这个区域中的配置信息将被添加到配置文件中。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "设置列表" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"指定文件分配方式。如果你使用的文件系统较新,例如:ext4(支持扩展分区)," +"btrfs,xfs 或者 NTFS(仅限 MinGW 版本),强烈推荐 \"falloc\",这种方式几乎能" +"立即分配比较大的文件(GB),但是它要求你的系统支持 posix_fallocate(3) 函数。" +"不要在 ext3 或者 FAT32 这些旧文件系统中使用 \"falloc\",因为它花费的时间和 " +"\"prealloc\" 几乎一样多,而且在文件分配过程中会阻塞整个 Aria2 进程。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "设置 BT 全局最大同时下载的文件数量。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"指定做种时间(分钟)。如果同时指定了“做种比率”选项,那么将在任一条件满足时停" +"止做种。设置 0 表示下载完成后停止做种。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"指定做种比率。BT 下载完成之后持续做种,直到比率达到指定值。强烈建议将此选项设" +"置为大于或等于 1.0。设置为 0.0 来无限做种。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "设置每个 BT 任务的最大 Peer 数量,0 表示不限制。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"配置对端 ID 前缀。对端 ID 的长度为 20 字节。如果配置超过了 20 字节,将仅使用" +"前面的 20 字节。如果配置少于 20 字节,将添加额外的随机字符来让长度达到 20 字" +"节。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"当 BT 任务在 N 秒的持续时间内的下载速度一直为 0,则停止下载。0 表示禁用。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "停止超时时间" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Aria2 服务未运行。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Aria2 服务正在运行。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "用于放置配置文件,会话文件和 DHT 文件的目录。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "用于放置下载文件的目录。例如:/mnt/sda1。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "日志文件名。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "单一服务器最大连接数量。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "如果种子文件具有“私有”属性,该选项将会被忽略。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "超时" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "令牌" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "是" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "为所有协议设置代理服务器。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"使用文件中的证书来验证对端。证书文件必须为 PEM 格式并且可以包含多个证书。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"使用文件中的证书作为 RPC 服务器。证书必须为 PKCS12 (.p12, .pfx) 或者 PEM 格" +"式。
    PKCS12 文件必须包含证书,一个密钥和可选的附加证书链。只有导入密码为" +"空白的 PKCS12 文件才能被打开。
    使用 PEM 时,你必须同时指定“RPC 私钥”。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"使用文件中的客户端证书。证书必须为 PKCS12 (.p12, .pfx) 或者 PEM 格式。
    PKCS12 文件必须包含证书,一个密钥和可选的附加证书链。只有导入密码为空白的 " +"PKCS12 文件才能被打开。
    使用 PEM 时,你必须同时指定“RPC 私钥”。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "使用文件中的私钥作为 RPC 服务器。私钥必须解密并且为 PEM 格式。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "使用文件中的私钥。私钥必须解密并且为 PEM 格式,不支持加密的私钥。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "用户代理" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "用户名与密码" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "使用“CA 证书”里配置的证书来验证对端。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "警告" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "你可以追加 K 或者 M。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "prealloc" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc" diff --git a/package/luci/applications/luci-app-aria2/po/zh_Hant/aria2.po b/package/luci/applications/luci-app-aria2/po/zh_Hant/aria2.po new file mode 100644 index 0000000000..395bd844d6 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/po/zh_Hant/aria2.po @@ -0,0 +1,839 @@ +# +# Yangfl , 2017, 2018. +# +msgid "" +msgstr "" +"PO-Revision-Date: 2023-02-21 05:01+0000\n" +"Last-Translator: 王攀 <41330784@qq.com>\n" +"Language-Team: Chinese (Traditional) \n" +"Language: zh_Hant\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.16-dev\n" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:433 +msgid "LPD enabled" +msgstr "啟用 LPD" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:551 +msgid "Additional BT tracker" +msgstr "附加 BitTorrent tracker" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:556 +msgid "Advanced Options" +msgstr "進階選項" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:309 +msgid "All proxy" +msgstr "全部代理" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:365 +msgid "Append HEADERs to HTTP request header." +msgstr "附加該值到 HTTP 請求頭。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:3 +msgid "Aria2" +msgstr "Aria2" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:189 +msgid "" +"Aria2 is a lightweight multi-protocol & multi-source, cross platform " +"download utility." +msgstr "Aria2 是一個輕量化且支援多協定、多來源的跨平台下載工具。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:565 +msgid "Auto save interval" +msgstr "自動儲存間隔" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:204 +msgid "Basic Options" +msgstr "基本選項" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:413 +msgid "BitTorrent Options" +msgstr "BitTorrent 選項" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:472 +msgid "BitTorrent listen port" +msgstr "BitTorrent 監聽埠號" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:329 +msgid "CA certificate" +msgstr "CA 憑證" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:334 +msgid "Certificate" +msgstr "憑證" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:322 +msgid "Check certificate" +msgstr "檢查憑證" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:379 +msgid "" +"Close connection if download speed is lower than or equal to this value " +"(bytes per sec). 0 means has no lowest speed limit." +msgstr "下載速度小於或等於該值(單位:B/s)時關閉連線,輸入 0 則表示不限速。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:29 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:51 +msgid "Collecting data..." +msgstr "正在收集資料中…" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:216 +msgid "Config file directory" +msgstr "組態檔目錄" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:15 +msgid "Configuration" +msgstr "組態" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:367 +msgid "Connect timeout" +msgstr "連線逾時值" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:47 +msgid "Content of config file: %s" +msgstr "組態檔內容:%s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:48 +msgid "Content of session file: %s" +msgstr "工作階段檔內容:%s" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:478 +msgid "DHT Listen port" +msgstr "DHT 監聽埠號" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:230 +msgid "Debug" +msgstr "除錯" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:559 +msgid "" +"Disable IPv6. This is useful if you have to use broken DNS and want to avoid " +"terribly slow AAAA record lookup." +msgstr "" +"停用 IPv6;如果您的 IPv6 連線不穩定,並希望 DNS 避免查詢緩慢的 AAAA 紀錄,請" +"啟用此選項。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:577 +msgid "Disk cache" +msgstr "磁碟快取" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:396 +msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." +msgstr "" +"檔案的最小分割大小(取值範圍:1-1024M);如果「檔案大小」小於該值的 2 倍,則" +"不會分割此檔案。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:391 +msgid "Download a file using N connections." +msgstr "檔案的最大分割數量;下載該檔案時將使用同等數量的執行緒。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:212 +msgid "Download directory" +msgstr "下載目錄" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:417 +msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." +msgstr "" +"啟用 IPv4「分散式雜湊表」功能;這將同時啟用對「UDP tracker 協定」的支援。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:427 +msgid "Enable IPv6 DHT functionality." +msgstr "啟用 IPv6「分散式雜湊表」功能。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:435 +msgid "Enable Local Peer Discovery." +msgstr "啟用「本地節點發現」。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:444 +msgid "Enable Peer Exchange extension." +msgstr "啟用「節點交換」擴充套件。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:579 +msgid "Enable disk cache (in bytes), set 0 to disabled." +msgstr "啟用磁碟快取(單位:B),輸入 0 則表示停用。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:220 +msgid "Enable logging" +msgstr "啟用日誌記錄" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:442 +msgid "Enable peer exchange" +msgstr "啟用 PEX" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:306 +msgid "Enable proxy" +msgstr "啟用代理" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:206 +msgid "Enabled" +msgstr "啟用" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:234 +msgid "Error" +msgstr "錯誤" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:619 +msgid "Extra Settings" +msgstr "額外設定" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:487 +msgid "False" +msgstr "否" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:584 +msgid "File allocation" +msgstr "檔案分配" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:45 +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:24 +msgid "Files" +msgstr "檔案" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:485 +msgid "Follow torrent" +msgstr "下載種子後自動建立其下載任務" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:190 +msgid "For more information, please visit: %s." +msgstr "更多資訊,請存取:%s。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:597 +msgid "Force save" +msgstr "強制儲存" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:271 +msgid "Generate Randomly" +msgstr "隨機產生" + +#: applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json:3 +msgid "Grant UCI access for luci-app-aria2" +msgstr "授予 luci-app-aria2 擁有 UCI 存取的權限" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:347 +msgid "HTTP accept gzip" +msgstr "啟用 HTTP 壓縮" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:356 +msgid "HTTP no cache" +msgstr "HTTP 不快取" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:304 +msgid "HTTP/FTP/SFTP Options" +msgstr "HTTP/FTP/SFTP 選項" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:364 +msgid "Header" +msgstr "頭欄位" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/files.js:46 +msgid "Here shows the files used by aria2." +msgstr "在這裡顯示 Aria2 使用的檔案。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:415 +msgid "IPv4 DHT enabled" +msgstr "啟用 IPv4 DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:425 +msgid "IPv6 DHT enabled" +msgstr "啟用 IPv6 DHT" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:558 +msgid "IPv6 disabled" +msgstr "停用 IPv6" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:516 +msgid "" +"If the whole download speed of every torrent is lower than SPEED, aria2 " +"temporarily increases the number of peers to try for more download speed. " +"Configuring this option with your preferred download speed can increase your " +"download speed in some cases." +msgstr "" +"如果某個 BT 任務的下載速度小於設定的速度,Aria2 會臨時提高 Peer 的數量來嘗試" +"取得更大的下載速度。在某些情況下,設定此選項能提高您的下載速度。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:231 +msgid "Info" +msgstr "資訊" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:41 +msgid "Installed web interface:" +msgstr "已安装的 Web 介面:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:301 +msgid "Json-RPC URL" +msgstr "JSON-RPC URL" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:488 +msgid "Keep in memory" +msgstr "是,但不會儲存種子" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:31 +msgid "Last 50 lines of log file:" +msgstr "日誌檔最後 50 行內容:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:36 +msgid "Last 50 lines of syslog:" +msgstr "系統日誌最後 50 行內容:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:210 +msgid "Leave blank to use default user." +msgstr "如果不選擇,則使用預設使用者。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:552 +msgid "List of additional BitTorrent tracker's announce URI." +msgstr "附加 BitTorrent tracker 清單的發布 URI。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:625 +msgid "" +"List of extra settings. Format: option=value, eg. netrc-path=/tmp/." +"netrc." +msgstr "" +"額外設定清單;格式為 option=value(例如:netrc-path=/tmp/.netrc)。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:49 +msgid "Loading" +msgstr "正在載入中" + +#: applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json:33 +msgid "Log" +msgstr "日誌" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:58 +msgid "Log Data" +msgstr "日誌資料" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:223 +msgid "Log file" +msgstr "日誌檔案" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:228 +msgid "Log level" +msgstr "日誌級別" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:377 +msgid "Lowest speed limit" +msgstr "最小速度限制" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:237 +msgid "Max concurrent downloads" +msgstr "最大同時下載任務數" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:385 +msgid "Max connection per server" +msgstr "同一伺服器最大連線數" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:612 +msgid "Max download limit" +msgstr "最大下載速度限制" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:390 +msgid "Max number of split" +msgstr "最大分割數量" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:504 +msgid "Max open files" +msgstr "最大檔案開啟數" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:605 +msgid "Max overall download limit" +msgstr "最大整體下載速度限制" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:490 +msgid "Max overall upload limit" +msgstr "最大整體上傳速度限制" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:509 +msgid "Max peers" +msgstr "最大節點數量" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:399 +msgid "Max tries" +msgstr "最大重試次數" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:497 +msgid "Max upload limit" +msgstr "最大上傳速度限制" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:395 +msgid "Min split size" +msgstr "最小分割大小" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:258 +msgid "No Authentication" +msgstr "不認證" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:33 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:38 +msgid "No log data." +msgstr "日誌資料為空。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:591 +msgid "None" +msgstr "無" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:232 +msgid "Notice" +msgstr "注意" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause" +msgstr "暫停" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:242 +msgid "Pause download after added." +msgstr "加入任務後,暫停此下載任務。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:248 +msgid "Pause downloads created as a result of metadata download." +msgstr "元資料下載完成後,暫停由其建立的後續下載任務。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:247 +msgid "Pause metadata" +msgstr "暫停元資料" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:96 +msgid "Please input token length:" +msgstr "請輸入權杖長度:" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:530 +msgid "Prefix of peer ID" +msgstr "Peer ID 字首" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:341 +msgid "Private key" +msgstr "私鑰" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:317 +msgid "Proxy password" +msgstr "代理密碼" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:314 +msgid "Proxy user" +msgstr "代理使用者名稱" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:240 +msgid "RPC Options" +msgstr "RPC 選項" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:257 +msgid "RPC authentication method" +msgstr "RPC 認證方法" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:283 +msgid "RPC certificate" +msgstr "RPC 憑證" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:265 +msgid "RPC password" +msgstr "RPC 密碼" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:253 +msgid "RPC port" +msgstr "RPC 埠號" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:293 +msgid "RPC private key" +msgstr "RPC 私鑰" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:276 +msgid "RPC secure" +msgstr "RPC 加密" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:269 +msgid "RPC token" +msgstr "RPC 權杖" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:277 +msgid "" +"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https " +"scheme to access the server. For WebSocket client, use wss scheme." +msgstr "" +"通過 SSL/TLS 加密 RPC 傳輸;RPC 客戶端必須使用「HTTPS 協定」來存取伺服器," +"WebSocket 客戶端則使用「WWS 協定」。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:262 +msgid "RPC username" +msgstr "RPC 使用者名稱" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/log.js:62 +msgid "Refresh every %s seconds." +msgstr "每 %s 秒更新。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:459 +msgid "Remove unselected file" +msgstr "移除未選擇的檔案" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:460 +msgid "" +"Removes the unselected files when download is completed in BitTorrent. " +"Please use this option with care because it will actually remove files from " +"your disk." +msgstr "" +"BitTorrent 下載完成時移除未選擇的檔案;檔案將從您的磁碟中永久移除,請小心使用" +"此選項。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:514 +msgid "Request peer speed limit" +msgstr "請求節點速度限制" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:403 +msgid "Retry wait" +msgstr "重試等待" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:209 +msgid "Run daemon as user" +msgstr "執行守護行程的使用者" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:194 +msgid "Running Status" +msgstr "執行狀態" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:566 +msgid "" +"Save a control file (*.aria2) every N seconds. If 0 is given, a control file " +"is not saved during download." +msgstr "" +"每 N 秒儲存下載「控制檔案」(*.aria2)。設定 0 表示在下載過程中不儲存控制檔案。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:598 +msgid "" +"Save download to session file even if the download is completed or removed. " +"This option also saves control file in that situations. This may be useful " +"to save BitTorrent seeding which is recognized as completed state." +msgstr "" +"即使下載任務已完成或已移除,也將其儲存到「工作階段檔」;於此同時,啟用此選項" +"還會儲存「控制檔」。這可能有助於您儲存被辨識為「已完成狀態」的 BitTorrent 種" +"子。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:572 +msgid "" +"Save error/unfinished downloads to session file every N seconds. If 0 is " +"given, file will be saved only when aria2 exits." +msgstr "" +"每 N 秒將失敗的/未完成的下載儲存到工作階段檔案。設定 0 則僅在 Aria2 退出時儲" +"存。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:453 +msgid "" +"Save meta data as \".torrent\" file. This option has effect only when " +"BitTorrent Magnet URI is used. The file name is hex encoded info hash with " +"suffix \".torrent\"." +msgstr "" +"儲存元資料為 \".torrent\" 檔案;此選項僅在使用 BitTorrent 磁力連結下載時生" +"效。檔案名稱(包含字尾 \".torrent\")為十六進位編碼的雜湊值。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:452 +msgid "Save metadata" +msgstr "儲存元資料" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:571 +msgid "Save session interval" +msgstr "工作階段儲存間隔" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:467 +msgid "Seed previously downloaded files without verifying piece hashes." +msgstr "繼續之前的 BT 任務時, 無需再次校驗分片雜湊。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:538 +msgid "Seed ratio" +msgstr "做種比例" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:545 +msgid "Seed time" +msgstr "做種時間" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:466 +msgid "Seed unverified" +msgstr "不校驗種子" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:348 +msgid "" +"Send Accept: deflate, gzip request header and inflate response " +"if remote server responds with Content-Encoding: gzip or " +"Content-Encoding: deflate." +msgstr "" +"傳送請求頭欄位:Accept: deflate, gzip;當遠端伺服器的回應頭中具" +"有 Content-Encoding: gzip 或 Content-Encoding: deflate 時解壓回應資料,以提高資料傳輸速度。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:357 +msgid "" +"Send Cache-Control: no-cache and Pragma: no-cache " +"header to avoid cached content. If disabled, these headers are not sent and " +"you can add Cache-Control header with a directive you like using \"Header\" " +"option." +msgstr "" +"傳送 Cache-Control: no-cache 和 Pragma: no-cache 請" +"求標頭來防止快取內容,停用則不傳送。您也可用使用「請求標頭」選項來設定 Cache-" +"Control 請求標頭。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:473 +msgid "" +"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", " +"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are " +"open for incoming TCP traffic." +msgstr "" +"為 BitTorrent 下載設定 TCP 連接埠。支援的格式:「6881,6885」,「6881-6999」和" +"「6881-6889,6999」。請確保正確放行了這些連接埠的 TCP 入站通信。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:479 +msgid "" +"Set UDP listening port used by DHT (IPv4, IPv6) and UDP tracker. Make sure " +"that the specified ports are open for incoming UDP traffic." +msgstr "" +"設定用於 DHT (IPv4, IPv6) 和 UDP tracker 協定的 UDP 監聽埠;請確保指定的通訊" +"埠允許 UDP 傳入流量。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:614 +msgid "" +"Set max download speed per each download in bytes/sec. 0 means unrestricted." +msgstr "設定每個任務的最大下載速度(單位:B/s),輸入 0 則表示不限制。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:607 +msgid "Set max overall download speed in bytes/sec. 0 means unrestricted." +msgstr "設定整體的最大下載速度(單位:B/s),輸入 0 則表示不限制。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:492 +msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted." +msgstr "設定整體的最大上傳速度(單位:B/s),輸入 0 則表示不限制。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:499 +msgid "" +"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted." +msgstr "設定每個任務的最大上傳速度(單位:B/s),輸入 0 則表示不限制。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:368 +msgid "" +"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy " +"server. After the connection is established, this option makes no effect and " +"\"Timeout\" option is used instead." +msgstr "" +"設定 HTTP、FTP 和代理伺服器的連線逾時時間。當連線建立後,該選項失去作用,而" +"「逾時時間」選項會被使用。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:404 +msgid "Set the seconds to wait between retries." +msgstr "設定重試的等待間隔秒數。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:409 +msgid "Set user agent for HTTP(S) downloads." +msgstr "為 HTTP(S) 下載設定使用者代理。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:188 +msgid "Settings" +msgstr "設置" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:620 +msgid "Settings in this section will be added to config file." +msgstr "此部分的設定將被加入到組態檔。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:624 +msgid "Settings list" +msgstr "設定清單" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:585 +msgid "" +"Specify file allocation method. If you are using newer file systems such as " +"ext4 (with extents support), btrfs, xfs or NTFS (MinGW build only), " +"\"falloc\" is your best choice. It allocates large(few GiB) files almost " +"instantly, but it may not be available if your system doesn't have " +"posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems " +"such as ext3 and FAT32 because it takes almost same time as \"prealloc\" and " +"it blocks aria2 entirely until allocation finishes." +msgstr "" +"指定檔案分配方式。如果您使用的檔案系統較新,例如:ext4 (支援擴展分區)、" +"btrfs、xfs 或者 NTFS (僅限 MinGW 版本),強烈推薦「falloc」,這種方式幾乎能立" +"即分配比較大的檔案 (GB),但是它要求您的系統必須支援 posix_fallocate(3) 函數。" +"不要在 ext3 或者 FAT32 這些舊檔案系統中使用「falloc」,因為它花費的時間和" +"「prealloc」幾乎一樣多,而且在檔案分配過程中會阻塞整個 Aria2 處理程序。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:505 +msgid "" +"Specify maximum number of files to open in multi-file BitTorrent download " +"globally." +msgstr "設定 BitTorrent 全域最大同時下載的檔案數量。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:546 +msgid "" +"Specify seeding time in minutes. If \"Seed ratio\" option is specified along " +"with this option, seeding ends when at least one of the conditions is " +"satisfied. Specifying 0 disables seeding after download completed." +msgstr "" +"指定做種時間 (分鍾)。如果同時指定了「做種比例」選項,那麼將在任一條件滿足時停" +"止做種。設定 0 表示下載完成後停止做種。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:539 +msgid "" +"Specify share ratio. Seed completed torrents until share ratio reaches " +"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. " +"Specify 0.0 if you intend to do seeding regardless of share ratio." +msgstr "" +"指定做種比例。BT 下載完成之後持續做種,直到比例達到指定值。強烈建議將此選項設" +"定為大於或等於 1.0。設定為 0.0 來無限做種。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:510 +msgid "Specify the maximum number of peers per torrent, 0 means unlimited." +msgstr "指定每個任務的最大 peer 數量,輸入 0 則表示不限制。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:531 +msgid "" +"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. " +"If more than 20 bytes are specified, only first 20 bytes are used. If less " +"than 20 bytes are specified, random byte data are added to make its length " +"20 bytes." +msgstr "" +"設定 Peer ID 前綴。Peer ID 的長度為 20 位元組。如果設定超過了 20 位元組,將僅" +"使用前面的 20 位元組。如果設定少於 20 位元組,將加入額外的隨機字元來讓長度達" +"到 20 位元組。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:525 +msgid "" +"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If " +"0 is given, this feature is disabled." +msgstr "" +"當 BT 任務在 N 秒的持續時間內的下載速度一直為 0,則停止下載。0 表示停用。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:524 +msgid "Stop timeout" +msgstr "停止逾時值" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:36 +msgid "The Aria2 service is not running." +msgstr "Aria2 服務未執行。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:35 +msgid "The Aria2 service is running." +msgstr "Aria2 服務執行中。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:217 +msgid "The directory to store the config file, session file and DHT file." +msgstr "儲存設定檔、工作階段檔和 DHT 檔案的目錄。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:213 +msgid "" +"The directory to store the downloaded file. For example /mnt/sda1." +msgstr "儲存下載檔案的目錄(例如:/mnt/sda1)。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:224 +msgid "The file name of the log file." +msgstr "日誌檔的檔案名稱。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:386 +msgid "The maximum number of connections to one server for each download." +msgstr "每個下載任務與同一伺服器建立的最大連線數。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:418 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:428 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:436 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:445 +msgid "This option will be ignored if a private flag is set in a torrent." +msgstr "如果種子檔案具有「私有」屬性,該選項將會被忽略。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:373 +msgid "Timeout" +msgstr "逾時" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:260 +msgid "Token" +msgstr "權杖" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:486 +msgid "True" +msgstr "是" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:310 +msgid "Use a proxy server for all protocols." +msgstr "為所有協定使用代理伺服器。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:330 +msgid "" +"Use the certificate authorities in FILE to verify the peers. The certificate " +"file must be in PEM format and can contain multiple CA certificates." +msgstr "" +"使用檔案中的憑證來驗證對端。憑證檔案必須為 PEM 格式並且可以包含多個憑證。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:284 +msgid "" +"Use the certificate in FILE for RPC server. The certificate must be either " +"in PKCS12 (.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"RPC private key\" as well." +msgstr "" +"RPC 伺服器使用的「憑證檔」;憑證格式必須為 PKCS12 (.p12, .pfx) 或 PEM。
    PKCS12 檔案必須包含憑證、金鑰以及可選的附加「憑證鏈」,且該檔案不能有匯入密" +"碼!
    使用 PEM 時,您必須同時指定「RPC 私鑰」。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:335 +msgid "" +"Use the client certificate in FILE. The certificate must be either in PKCS12 " +"(.p12, .pfx) or in PEM format.
    PKCS12 files must contain the " +"certificate, a key and optionally a chain of additional certificates. Only " +"PKCS12 files with a blank import password can be opened!
    When using PEM, " +"you have to specify the \"Private key\" as well." +msgstr "" +"客戶端使用的「憑證檔」;憑證格式必須為 PKCS12 (.p12, .pfx) 或 PEM。
    PKCS12 檔案必須包含憑證、金鑰以及可選的附加「憑證鏈」,且該檔案不能有匯入密" +"碼!
    使用 PEM 時,您必須同時指定「私鑰」。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:294 +msgid "" +"Use the private key in FILE for RPC server. The private key must be " +"decrypted and in PEM format." +msgstr "RPC 伺服器使用的「私鑰檔」;私鑰必須被解密,且格式為 PEM。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:342 +msgid "" +"Use the private key in FILE. The private key must be decrypted and in PEM " +"format. The behavior when encrypted one is given is undefined." +msgstr "使用的「私鑰檔」;私鑰必須被解密,且格式為 PEM。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:408 +msgid "User agent" +msgstr "使用者代理" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:259 +msgid "Username & Password" +msgstr "使用者名稱與密碼" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:323 +msgid "" +"Verify the peer using certificates specified in \"CA certificate\" option." +msgstr "使用「CA 憑證」選項中指定的憑證來驗證節點。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:233 +msgid "Warn" +msgstr "警告" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:381 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:493 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:500 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:520 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:580 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:608 +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:615 +msgid "You can append K or M." +msgstr "您可以在該值後附加單位 K 或 M。" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:594 +msgid "falloc" +msgstr "falloc系統調試" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:592 +msgid "prealloc" +msgstr "預分配" + +#: applications/luci-app-aria2/htdocs/luci-static/resources/view/aria2/config.js:593 +msgid "trunc" +msgstr "trunc系統調試" diff --git a/package/luci/applications/luci-app-aria2/root/usr/libexec/aria2-call b/package/luci/applications/luci-app-aria2/root/usr/libexec/aria2-call new file mode 100755 index 0000000000..eba7aea5ec --- /dev/null +++ b/package/luci/applications/luci-app-aria2/root/usr/libexec/aria2-call @@ -0,0 +1,25 @@ +#!/bin/sh + +. "$IPKG_INSTROOT/usr/share/libubox/jshn.sh" + +action=$1 +shift + +case "$action" in + cat) + case "$1" in + conf|session) + config_dir="$(uci -q get aria2.main.config_dir)" + list_file="${config_dir:-/var/etc/aria2}/aria2.$1.main" + json_init + json_add_string file "$list_file" + json_add_string content "$(cat "$list_file")" + json_dump + ;; + esac + ;; + tail) + log_file=$(uci -q get aria2.main.log) + tail -n 50 "${log_file:-/var/log/aria2.log}" + ;; +esac diff --git a/package/luci/applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json b/package/luci/applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json new file mode 100644 index 0000000000..8728252501 --- /dev/null +++ b/package/luci/applications/luci-app-aria2/root/usr/share/luci/menu.d/luci-app-aria2.json @@ -0,0 +1,40 @@ +{ + "admin/services/aria2": { + "title": "Aria2", + "order": 30, + "action": { + "type": "firstchild" + }, + "depends": { + "acl": [ "luci-app-aria2" ], + "uci": { "aria2": true } + } + }, + + "admin/services/aria2/config": { + "title": "Configuration", + "order": 10, + "action": { + "type": "view", + "path": "aria2/config" + } + }, + + "admin/services/aria2/files": { + "title": "Files", + "order": 20, + "action": { + "type": "view", + "path": "aria2/files" + } + }, + + "admin/services/aria2/log": { + "title": "Log", + "order": 30, + "action": { + "type": "view", + "path": "aria2/log" + } + } +} diff --git a/package/luci/applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json b/package/luci/applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json new file mode 100644 index 0000000000..af5d31e9bd --- /dev/null +++ b/package/luci/applications/luci-app-aria2/root/usr/share/rpcd/acl.d/luci-app-aria2.json @@ -0,0 +1,20 @@ +{ + "luci-app-aria2": { + "description": "Grant UCI access for luci-app-aria2", + "read": { + "ubus": { + "service": [ "list" ] + }, + "file": { + "/etc/passwd": [ "read" ], + "/sbin/logread": [ "exec" ], + "/usr/bin/aria2c": [ "exec" ], + "/usr/libexec/aria2-call": [ "exec" ] + }, + "uci": [ "aria2" ] + }, + "write": { + "uci": [ "aria2" ] + } + } +} diff --git a/package/luci/applications/luci-app-commands/Makefile b/package/luci/applications/luci-app-commands/Makefile index 8cd3cf51e8..0e2e57c70d 100644 --- a/package/luci/applications/luci-app-commands/Makefile +++ b/package/luci/applications/luci-app-commands/Makefile @@ -7,10 +7,9 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Shell Command Module -LUCI_DEPENDS:=+luci-compat PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js b/package/luci/applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js new file mode 100644 index 0000000000..6d369733c6 --- /dev/null +++ b/package/luci/applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js @@ -0,0 +1,34 @@ +'use strict'; + +'require view'; +'require form'; + +return view.extend({ + render: function(data) { + var m, s, o; + + m = new form.Map('luci', _('Custom Commands'), + _('This page allows you to configure custom shell commands which can be easily invoked from the web interface.')); + + s = m.section(form.GridSection, 'command'); + s.nodescriptions = true; + s.anonymous = true; + s.addremove = true; + + o = s.option(form.Value, 'name', _('Description'), + _('A short textual description of the configured command')); + + o = s.option(form.Value, 'command', _('Command'), _('Command line to execute')); + o.textvalue = function(section_id) { + return E('code', [ this.cfgvalue(section_id) ]); + }; + + o = s.option(form.Flag, 'param', _('Custom arguments'), + _('Allow the user to provide additional command line arguments')); + + o = s.option(form.Flag, 'public', _('Public access'), + _('Allow executing the command and downloading its output without prior authentication')); + + return m.render(); + } +}); diff --git a/package/luci/applications/luci-app-commands/luasrc/controller/commands.lua b/package/luci/applications/luci-app-commands/luasrc/controller/commands.lua deleted file mode 100644 index f6227c6e4e..0000000000 --- a/package/luci/applications/luci-app-commands/luasrc/controller/commands.lua +++ /dev/null @@ -1,268 +0,0 @@ --- Copyright 2012 Jo-Philipp Wich --- Licensed to the public under the Apache License 2.0. - -module("luci.controller.commands", package.seeall) - -function index() - entry({"admin", "system", "commands"}, firstchild(), _("Custom Commands"), 80).acl_depends = { "luci-app-commands" } - entry({"admin", "system", "commands", "dashboard"}, template("commands"), _("Dashboard"), 1) - entry({"admin", "system", "commands", "config"}, cbi("commands"), _("Configure"), 2) - entry({"admin", "system", "commands", "run"}, call("action_run"), nil, 3).leaf = true - entry({"admin", "system", "commands", "download"}, call("action_download"), nil, 3).leaf = true - - entry({"command"}, call("action_public"), nil, 1).leaf = true -end - ---- Decode a given string into arguments following shell quoting rules ---- [[abc \def "foo\"bar" abc'def']] -> [[abc def]] [[foo"bar]] [[abcdef]] -local function parse_args(str) - local args = { } - - local function isspace(c) - if c == 9 or c == 10 or c == 11 or c == 12 or c == 13 or c == 32 then - return c - end - end - - local function isquote(c) - if c == 34 or c == 39 or c == 96 then - return c - end - end - - local function isescape(c) - if c == 92 then - return c - end - end - - local function ismeta(c) - if c == 36 or c == 92 or c == 96 then - return c - end - end - - --- Convert given table of byte values into a Lua string and append it to - --- the "args" table. Segment byte value sequence into chunks of 256 values - --- to not trip over the parameter limit for string.char() - local function putstr(bytes) - local chunks = { } - local csz = 256 - local upk = unpack - local chr = string.char - local min = math.min - local len = #bytes - local off - - for off = 1, len, csz do - chunks[#chunks+1] = chr(upk(bytes, off, min(off + csz - 1, len))) - end - - args[#args+1] = table.concat(chunks) - end - - --- Scan substring defined by the indexes [s, e] of the string "str", - --- perform unquoting and de-escaping on the fly and store the result in - --- a table of byte values which is passed to putstr() - local function unquote(s, e) - local off, esc, quote - local res = { } - - for off = s, e do - local byte = str:byte(off) - local q = isquote(byte) - local e = isescape(byte) - local m = ismeta(byte) - - if e then - esc = true - elseif esc then - if m then res[#res+1] = 92 end - res[#res+1] = byte - esc = false - elseif q and quote and q == quote then - quote = nil - elseif q and not quote then - quote = q - else - if m then res[#res+1] = 92 end - res[#res+1] = byte - end - end - - putstr(res) - end - - --- Find substring boundaries in "str". Ignore escaped or quoted - --- whitespace, pass found start- and end-index for each substring - --- to unquote() - local off, esc, start, quote - for off = 1, #str + 1 do - local byte = str:byte(off) - local q = isquote(byte) - local s = isspace(byte) or (off > #str) - local e = isescape(byte) - - if esc then - esc = false - elseif e then - esc = true - elseif q and quote and q == quote then - quote = nil - elseif q and not quote then - start = start or off - quote = q - elseif s and not quote then - if start then - unquote(start, off - 1) - start = nil - end - else - start = start or off - end - end - - --- If the "quote" is still set we encountered an unfinished string - if quote then - unquote(start, #str) - end - - return args -end - -local function parse_cmdline(cmdid, args) - local uci = require "luci.model.uci".cursor() - if uci:get("luci", cmdid) == "command" then - local cmd = uci:get_all("luci", cmdid) - local argv = parse_args(cmd.command) - local i, v - - if cmd.param == "1" and args then - for i, v in ipairs(parse_args(luci.http.urldecode(args))) do - argv[#argv+1] = v - end - end - - for i, v in ipairs(argv) do - if v:match("[^%w%.%-i/|]") then - argv[i] = '"%s"' % v:gsub('"', '\\"') - end - end - - return argv - end -end - -function execute_command(callback, ...) - local fs = require "nixio.fs" - local argv = parse_cmdline(...) - if argv then - local outfile = os.tmpname() - local errfile = os.tmpname() - - local rv = os.execute(table.concat(argv, " ") .. " >%s 2>%s" %{ outfile, errfile }) - local stdout = fs.readfile(outfile, 1024 * 512) or "" - local stderr = fs.readfile(errfile, 1024 * 512) or "" - - fs.unlink(outfile) - fs.unlink(errfile) - - local binary = not not (stdout:match("[%z\1-\8\14-\31]")) - - callback({ - ok = true, - command = table.concat(argv, " "), - stdout = not binary and stdout, - stderr = stderr, - exitcode = rv, - binary = binary - }) - else - callback({ - ok = false, - code = 404, - reason = "No such command" - }) - end -end - -function return_json(result) - if result.ok then - luci.http.prepare_content("application/json") - luci.http.write_json(result) - else - luci.http.status(result.code, result.reason) - end -end - -function action_run(...) - execute_command(return_json, ...) -end - -function return_html(result) - if result.ok then - require("luci.template") - luci.template.render("commands_public", { - exitcode = result.exitcode, - stdout = result.stdout, - stderr = result.stderr - }) - else - luci.http.status(result.code, result.reason) - end - -end - -function action_download(...) - local fs = require "nixio.fs" - local argv = parse_cmdline(...) - if argv then - local fd = io.popen(table.concat(argv, " ") .. " 2>/dev/null") - if fd then - local chunk = fd:read(4096) or "" - local name - if chunk:match("[%z\1-\8\14-\31]") then - luci.http.header("Content-Disposition", "attachment; filename=%s" - % fs.basename(argv[1]):gsub("%W+", ".") .. ".bin") - luci.http.prepare_content("application/octet-stream") - else - luci.http.header("Content-Disposition", "attachment; filename=%s" - % fs.basename(argv[1]):gsub("%W+", ".") .. ".txt") - luci.http.prepare_content("text/plain") - end - - while chunk do - luci.http.write(chunk) - chunk = fd:read(4096) - end - - fd:close() - else - luci.http.status(500, "Failed to execute command") - end - else - luci.http.status(404, "No such command") - end -end - - -function action_public(cmdid, args) - local disp = false - if string.sub(cmdid, -1) == "s" then - disp = true - cmdid = string.sub(cmdid, 1, -2) - end - local uci = require "luci.model.uci".cursor() - if cmdid and - uci:get("luci", cmdid) == "command" and - uci:get("luci", cmdid, "public") == "1" - then - if disp then - execute_command(return_html, cmdid, args) - else - action_download(cmdid, args) - end - else - luci.http.status(403, "Access to command denied") - end - end diff --git a/package/luci/applications/luci-app-commands/luasrc/model/cbi/commands.lua b/package/luci/applications/luci-app-commands/luasrc/model/cbi/commands.lua deleted file mode 100644 index 7794f15379..0000000000 --- a/package/luci/applications/luci-app-commands/luasrc/model/cbi/commands.lua +++ /dev/null @@ -1,27 +0,0 @@ --- Copyright 2012 Jo-Philipp Wich --- Licensed to the public under the Apache License 2.0. - -local m, s - -m = Map("luci", translate("Custom Commands"), - translate("This page allows you to configure custom shell commands which can be easily invoked from the web interface.")) - -s = m:section(TypedSection, "command", "") -s.template = "cbi/tblsection" -s.anonymous = true -s.addremove = true - - -s:option(Value, "name", translate("Description"), - translate("A short textual description of the configured command")) - -s:option(Value, "command", translate("Command"), - translate("Command line to execute")) - -s:option(Flag, "param", translate("Custom arguments"), - translate("Allow the user to provide additional command line arguments")) - -s:option(Flag, "public", translate("Public access"), - translate("Allow executing the command and downloading its output without prior authentication")) - -return m diff --git a/package/luci/applications/luci-app-commands/luasrc/view/commands.htm b/package/luci/applications/luci-app-commands/luasrc/view/commands.htm deleted file mode 100644 index 634090e7d7..0000000000 --- a/package/luci/applications/luci-app-commands/luasrc/view/commands.htm +++ /dev/null @@ -1,187 +0,0 @@ -<%# - Copyright 2012 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<% css = [[ - -.commandbox { - height: 12em; - width: 30%; - float: left; - height: 12em; - margin: 5px; - position: relative; -} - -.commandbox h3 { - font-size: 1.5em !important; - line-height: 2em !important; - margin: 0 !important; -} - -.commandbox input[type="text"] { - width: 50% !important; -} - -.commandbox div { - position: absolute; - left: 0; - bottom: 1.5em; -} - -]] -%> - -<%+header%> - - - -<% - local uci = require "luci.model.uci".cursor() - local commands = { } - - uci:foreach("luci", "command", function(s) commands[#commands+1] = s end) -%> - -
    -
    -

    <%:Custom Commands%>

    - <% if #commands == 0 then %> -
    -
    -
    -

    - <%:This section contains no values yet%> -

    -
    -
    -
    - <% else %> -
    - <% local _, command; for _, command in ipairs(commands) do %> -
    -

    <%=pcdata(command.name)%>

    -

    <%:Command:%> <%=pcdata(command.command)%>

    - <% if command.param == "1" then %> -

    <%:Arguments:%>

    - <% end %> -
    - - - <% if command.public == "1" then %> - - <% end %> -
    -
    - <% end %> - -

    - -
    - <% end %> - -
    - - -
    - -<%+footer%> diff --git a/package/luci/applications/luci-app-commands/luasrc/view/commands_public.htm b/package/luci/applications/luci-app-commands/luasrc/view/commands_public.htm deleted file mode 100644 index f20799d40f..0000000000 --- a/package/luci/applications/luci-app-commands/luasrc/view/commands_public.htm +++ /dev/null @@ -1,50 +0,0 @@ -<%# - Copyright 2016 t123yh - Licensed to the public under the Apache License 2.0. --%> - -<% css = [[ -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} - -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -]] -%> - -<%+header%> - -<% if exitcode == 0 then %> - -<% else %> - -<% end %> - -<% if stdout ~= "" then %> -

    <%:Standard Output%>

    -
    <%= stdout %>
    -<% end %> - -<% if stderr ~= "" then %> -

    <%:Standard Error%>

    -
    <%= stderr %>
    -<% end %> - - - -<%+footer%> \ No newline at end of file diff --git a/package/luci/applications/luci-app-commands/po/ar/commands.po b/package/luci/applications/luci-app-commands/po/ar/commands.po index 78372a67e9..d13dbcfd04 100644 --- a/package/luci/applications/luci-app-commands/po/ar/commands.po +++ b/package/luci/applications/luci-app-commands/po/ar/commands.po @@ -4,7 +4,7 @@ msgstr "" "POT-Creation-Date: \n" "PO-Revision-Date: 2020-07-10 10:41+0000\n" "Last-Translator: Mohammed Abu Hassan \n" -"Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" @@ -14,95 +14,95 @@ msgstr "" "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "X-Generator: Weblate 4.2-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "وصف نصي قصير للأمر الذي تم تكوينه" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "السماح بتنفيذ الأمر وتنزيل إخراجه دون مصادقة مسبقة" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "السماح للمستخدم بتقديم وسيطات سطر أوامر إضافية" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "الحجج:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "البيانات الثنائية غير معروضة، قم بتنزيلها بدلاً من ذلك." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "الكود:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "جمع البيانات..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "أمر" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "تم تنفيذ الأمر بنجاح." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "تم إنهاء الأمر برمز الحالة" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "فشل الأمر" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "سطر الأوامر للتنفيذ" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "الأمر ناجح" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "الأمر:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "تكوين" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "أوامر مخصصة" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "الحجج المخصصة" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "لوحة المعلومات" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "الوصف" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "تنزيل" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "تحميل نتيجة التنفيذ" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "فشل في تنفيذ الأمر!" @@ -110,35 +110,35 @@ msgstr "فشل في تنفيذ الأمر!" msgid "Grant UCI access for luci-app-commands" msgstr "امنح UCI حق الوصول إلى luci-app-wifischedule" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "رابط" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "جار التحميل" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "أو عرض النتيجة" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "وصول عام" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "شغل" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "خطأ تقليدي" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "الإخراج القياسي" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -146,10 +146,10 @@ msgstr "" "تتيح لك هذه الصفحة تكوين أوامر shell مخصصة يمكن استدعاؤها بسهولة من واجهة " "الويب." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "لا يحتوي هذا القسم على قيم حتى الآن" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "في انتظار اكتمال الأمر ..." diff --git a/package/luci/applications/luci-app-commands/po/bg/commands.po b/package/luci/applications/luci-app-commands/po/bg/commands.po index fd4ef9e9ee..f6498c6c0b 100644 --- a/package/luci/applications/luci-app-commands/po/bg/commands.po +++ b/package/luci/applications/luci-app-commands/po/bg/commands.po @@ -4,7 +4,7 @@ msgstr "" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-08-27 12:56+0000\n" "Last-Translator: Iskren Mihaylov \n" -"Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" @@ -13,96 +13,96 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.8.1-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Кратко текстово описание на конфигурираната команда" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "" "Позволяване изпълнение на командата и сваляне на аутпута й без аутентикация" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Позволи на потребителя да въведе допълнителни командни аргументи" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Аргументи:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Бинарни данни не са показани, свалете ги вместо това." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Код:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Събиране данни..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Команда" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Командата е изпълнена успешно." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Командата приключи с код" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Командата се провали" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Команден ред за изпълнение" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Успешна команда" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Команда:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Конфигурирай" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Персонализирани команди" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Персонализирани аргументи" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Табло" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Описание" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Сваляне" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Сваляне резултат от изпълнение" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Провалено изпълнение на команда!" @@ -110,35 +110,35 @@ msgstr "Провалено изпълнение на команда!" msgid "Grant UCI access for luci-app-commands" msgstr "Разреши UCI достъп за luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Връзка" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Зареждане" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Или покажи резултат" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Публичен достъп" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Изпълни" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Стандартна грешка" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Стандартен аутпут" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -146,10 +146,10 @@ msgstr "" "На тази страница можете да настроите персонализирани шел команди, които да " "извиквате лесно през уеб интерфейса." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Секцията всеоще не съдържа стойности" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Изчакване командата да приключи..." diff --git a/package/luci/applications/luci-app-commands/po/bn_BD/commands.po b/package/luci/applications/luci-app-commands/po/bn_BD/commands.po index bda168d819..ce9b6d50e0 100644 --- a/package/luci/applications/luci-app-commands/po/bn_BD/commands.po +++ b/package/luci/applications/luci-app-commands/po/bn_BD/commands.po @@ -5,7 +5,7 @@ msgstr "" "PO-Revision-Date: 2021-10-08 17:53+0000\n" "Last-Translator: Rayhan Nabi \n" "Language-Team: Bengali (Bangladesh) \n" +"librecmc/luciapplicationscommands/bn_BD/>\n" "Language: bn_BD\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -13,95 +13,95 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.9-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "কমান্ড" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "বর্ণনা" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "" @@ -109,44 +109,44 @@ msgstr "" msgid "Grant UCI access for luci-app-commands" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "" diff --git a/package/luci/applications/luci-app-commands/po/ca/commands.po b/package/luci/applications/luci-app-commands/po/ca/commands.po index f9ae23f0df..7c96a8a64b 100644 --- a/package/luci/applications/luci-app-commands/po/ca/commands.po +++ b/package/luci/applications/luci-app-commands/po/ca/commands.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2019-10-20 13:07+0000\n" -"Last-Translator: Adolfo Jayme Barrientos \n" -"Language-Team: Catalan \n" +"Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9.1-dev\n" +"X-Generator: Weblate 5.0.2\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Una breva descripció textual de l'ordre configurat" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -24,85 +24,85 @@ msgstr "" "Permet la execució de l'ordre i la baixada de la seva sortida sense " "autenticació prèvia" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Permet que l'usuari proveïa paràmetres de línia de consola addicionals" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Paràmetres:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Els dades binaris no es mostren, descarregueu-los." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Codi:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "S’estan recollint dades…" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Ordre" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" -msgstr "L'ordre ha fallat" +msgstr "Ha fallat l'ordre" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Línia d'ordre per executar" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "L'ordre ha tingut èxit" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" -msgstr "Ordre;" +msgstr "Ordre:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Configura" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Ordres personalitzats" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Paràmetres personalitzats" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Panell" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Descripció" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Baixa" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "L'execució de l'ordre ha fallat!" @@ -110,35 +110,35 @@ msgstr "L'execució de l'ordre ha fallat!" msgid "Grant UCI access for luci-app-commands" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Enllaç" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "S’està carregant" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Accés públic" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Executa" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -146,10 +146,10 @@ msgstr "" "Aquesta pàgina us permet configurar ordres de consola personalitzats que es " "poden invocar fàcilment de la interfície web." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "S’està esperant que l’ordre s’acabi…" diff --git a/package/luci/applications/luci-app-commands/po/cs/commands.po b/package/luci/applications/luci-app-commands/po/cs/commands.po index fd2202865a..459fd14da9 100644 --- a/package/luci/applications/luci-app-commands/po/cs/commands.po +++ b/package/luci/applications/luci-app-commands/po/cs/commands.po @@ -1,142 +1,142 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-09-15 08:34+0000\n" -"Last-Translator: Lukas Jelinek \n" -"Language-Team: Czech \n" +"Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 5.0.2\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Stručný popis nastaveného příkazu" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "Povolit vykonání příkazu a stažení výstupu bez předchozí autentizace" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Povolit uživateli poskytnout dodatečné argumenty příkazového řádku" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argumenty:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Binární data nezobrazena, stáhněte si je." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Kód:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Shromažďování údajů…" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Příkaz" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Příkaz byl úspěšně proveden." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Příkaz byl ukončen se stavovým kódem" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Příkaz skončil s následujícím stavovým kódem %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Vykonání příkazu se nezdařilo" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Příkazový řádek k vykonání" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Příkaz byl úspěšný" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Příkaz:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Konfigurovat" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Vlastní příkazy" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Vlastní parametry" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Řídicí panel" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Popis" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" -msgstr "Stáhnout" +msgstr "Staženo" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Stáhnout výsledek spuštění" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Chyba při zpracování příkazu!" #: applications/luci-app-commands/root/usr/share/rpcd/acl.d/luci-app-commands.json:3 msgid "Grant UCI access for luci-app-commands" -msgstr "" +msgstr "Udělit přístup k UCI pro aplikaci luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Odkaz" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Načítání" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Nebo zobrazit výsledek" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Veřejný přístup" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Spustit" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Standardní chybový výstup" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Standardní výstup" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -144,10 +144,10 @@ msgstr "" "Tato stránka umožňuje nastavit vlastní příkazy shellu, které lze snadno " "vyvolat z webového rozhraní." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Tato sekce ještě neobsahuje žádné hodnoty" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Čekání na dokončení příkazu..." diff --git a/package/luci/applications/luci-app-commands/po/da/commands.po b/package/luci/applications/luci-app-commands/po/da/commands.po index 2ddd7c13fe..1e30b85d11 100644 --- a/package/luci/applications/luci-app-commands/po/da/commands.po +++ b/package/luci/applications/luci-app-commands/po/da/commands.po @@ -4,7 +4,7 @@ msgstr "" "POT-Creation-Date: \n" "PO-Revision-Date: 2022-10-29 20:58+0000\n" "Last-Translator: drax red \n" -"Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" @@ -13,11 +13,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.14.2-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "En kort tekstbeskrivelse af den konfigurerede kommando" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -25,85 +25,85 @@ msgstr "" "Tillad at udføre kommandoen og downloade dens output uden forudgående " "godkendelse" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Tillad brugeren at angive yderligere kommandolinjeargumenter" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argumenter:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Binære data vises ikke, download i stedet." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Kode:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Indsamler data..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Kommando" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Kommandoen blev udført." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Kommando afslutede med statuskode" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Kommando afsluttet med statuskode %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Kommandoen mislykkedes" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Kommandolinje til udførelse" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Kommandoen lykkedes" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Kommando:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Konfigurer" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Brugerdefinerede kommandoer" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Brugerdefinerede argumenter" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Dashboard" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Beskrivelse" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Download" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Download udførelsesresultat" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Kunne ikke udføre kommandoen!" @@ -111,35 +111,35 @@ msgstr "Kunne ikke udføre kommandoen!" msgid "Grant UCI access for luci-app-commands" msgstr "Giv UCI-adgang til luci-app-kommandoer" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Link" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Indlæser" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Eller vis resultatet" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Offentlig adgang" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Kør" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Standard fejl" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Standard Output" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -147,10 +147,10 @@ msgstr "" "Denne side giver dig mulighed for at konfigurere brugerdefinerede shell-" "kommandoer, som nemt kan fremkaldes fra web interface." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Denne sektion indeholder endnu ingen værdier" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Venter på, at kommandoen er fuldført..." diff --git a/package/luci/applications/luci-app-commands/po/de/commands.po b/package/luci/applications/luci-app-commands/po/de/commands.po index 8ea4e58850..4dd0c42c01 100644 --- a/package/luci/applications/luci-app-commands/po/de/commands.po +++ b/package/luci/applications/luci-app-commands/po/de/commands.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-10-30 15:06+0000\n" +"PO-Revision-Date: 2023-06-20 16:22+0000\n" "Last-Translator: ssantos \n" -"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.18.1\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Eine kurze Beschreibung des konfigurierten Befehls" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -24,85 +24,85 @@ msgstr "" "Ausführen des Kommandos und Herunterladen der Ausgabe ohne vorherige " "Authentifizierung ermöglichen" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Erlaube dem Nutzer zusätzliche Kommandozeilenargumente zu übergeben" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argumente:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Binärdaten ausgeblendet, laden Sie die Ausgaben stattdessen herunter." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Rückgabewert:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Sammle Daten..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Befehl" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Befehl erfolgreich ausgeführt." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Befehl wurde mit einem Rückgabewert beendet" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Befehl wurde mit Statuscode %d beendet" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Befehl fehlgeschlagen" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Auszuführende Kommandozeile" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Kommando erfolgreich" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Kommando:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Konfigurieren" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Benutzerdefinierte Kommandos" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Benutzerdefinierte Argumente" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Übersicht" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Beschreibung" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" -msgstr "Download" +msgstr "Herunterladen" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Programmausgabe herunterladen" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Befehl konnte nicht ausgeführt werden!" @@ -110,35 +110,35 @@ msgstr "Befehl konnte nicht ausgeführt werden!" msgid "Grant UCI access for luci-app-commands" msgstr "Gewähre UCI Zugriff auf luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Link" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Lade" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Oder Ergebnis anzeigen" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Öffentlicher Zugriff" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Ausführen" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Fehlerausgabe" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Standardausgabe" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -146,10 +146,10 @@ msgstr "" "Diese Seite ermöglicht die Konfiguration eigener Shell-Kommandos um diese " "einfach über das Webinterface ausführen zu können." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Dieser Abschnitt enthält noch keine Werte" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Der Befehl wird ausgeführt..." diff --git a/package/luci/applications/luci-app-commands/po/el/commands.po b/package/luci/applications/luci-app-commands/po/el/commands.po index a4ad21ffe8..6189bd46f7 100644 --- a/package/luci/applications/luci-app-commands/po/el/commands.po +++ b/package/luci/applications/luci-app-commands/po/el/commands.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2022-05-15 17:03+0000\n" "Last-Translator: MarioK239 \n" -"Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" @@ -12,95 +12,95 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.13-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Συλλογή δεδομένων..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Ταμπλό" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Περιγραφή" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Λήψη" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "" @@ -108,44 +108,44 @@ msgstr "" msgid "Grant UCI access for luci-app-commands" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Φόρτωση" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Αυτή η ενότητα δεν περιέχει ακόμη τιμές" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "" diff --git a/package/luci/applications/luci-app-commands/po/en/commands.po b/package/luci/applications/luci-app-commands/po/en/commands.po index 41514735d0..7292b1bf08 100644 --- a/package/luci/applications/luci-app-commands/po/en/commands.po +++ b/package/luci/applications/luci-app-commands/po/en/commands.po @@ -4,7 +4,7 @@ msgstr "" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-06-18 19:32+0000\n" "Last-Translator: Demian Wright \n" -"Language-Team: English \n" "Language: en\n" "MIME-Version: 1.0\n" @@ -13,11 +13,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.7\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "A short textual description of the configured command" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -25,85 +25,85 @@ msgstr "" "Allow executing the command and downloading its output without prior " "authentication" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Allow the user to provide additional command line arguments" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Arguments:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Binary data not displayed, download instead." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Code:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Collecting data..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Command" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Command executed successfully." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Command exited with status code" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Command failed" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Command line to execute" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Command successful" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Command:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Configure" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Custom Commands" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Custom arguments" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Dashboard" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Description" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Download" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Download execution result" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Failed to execute command!" @@ -111,35 +111,35 @@ msgstr "Failed to execute command!" msgid "Grant UCI access for luci-app-commands" msgstr "Grant UCI access for luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Link" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Loading" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Or display result" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Public access" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Run" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Standard Error" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Standard Output" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -147,10 +147,10 @@ msgstr "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Waiting for command to complete..." diff --git a/package/luci/applications/luci-app-commands/po/es/commands.po b/package/luci/applications/luci-app-commands/po/es/commands.po index 78b4ce9380..6456a1fd0c 100644 --- a/package/luci/applications/luci-app-commands/po/es/commands.po +++ b/package/luci/applications/luci-app-commands/po/es/commands.po @@ -2,108 +2,108 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-10-28 15:05+0000\n" -"Last-Translator: Franco Castillo \n" -"Language-Team: Spanish \n" +"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.16-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Una breve descripción textual del comando configurado" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "" "Permitir ejecutar el comando y descargar su salida sin autenticación previa" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" "Permitir al usuario proporcionar argumentos de línea de comando adicionales" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Parámetros:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "No se pueden mostrar datos binarios; descárguelos." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Código:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Recolectando datos…" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Comando" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "La orden se ejecutó correctamente." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "El comando finalizó con un código de error" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Comando terminado con el código de estado %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Comando fallido" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Línea de comandos para ejecutar" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Comando exitoso" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Comando:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Configurar" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Comandos personalizados" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Parámetros personalizados" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Tablero" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Descripción" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Descargar" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Descargar resultado de ejecución" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Falló la ejecución del comando!" @@ -111,35 +111,35 @@ msgstr "Falló la ejecución del comando!" msgid "Grant UCI access for luci-app-commands" msgstr "Conceder acceso UCI para luci-app-command" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Enlace" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Cargando" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "O mostrar resultado" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Acceso público" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Ejecutar" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Error estándar" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Salida estándar" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -147,10 +147,10 @@ msgstr "" "Esta página le permite configurar comandos de shell personalizados que se " "pueden invocar fácilmente desde la interfaz web." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Esta sección aún no contiene valores" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Esperando a que se complete el comando..." diff --git a/package/luci/applications/luci-app-commands/po/fi/commands.po b/package/luci/applications/luci-app-commands/po/fi/commands.po index b173bd81f7..8925a76152 100644 --- a/package/luci/applications/luci-app-commands/po/fi/commands.po +++ b/package/luci/applications/luci-app-commands/po/fi/commands.po @@ -2,22 +2,22 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-03-12 13:29+0000\n" +"PO-Revision-Date: 2023-10-18 05:43+0000\n" "Last-Translator: Jiri Grönroos \n" -"Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 5.1\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Määritetyn komennon lyhyt kuvaus" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -25,85 +25,85 @@ msgstr "" "Salli komennon suoritus ja sen tuloksen lataaminen ilman erillistä " "hyväksyntää" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Salli käyttäjän määritellä lisää komentoriviargumentteja" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argumentit:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Binääridataa ei näytetä. Lataa se." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Koodi:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Kerätään tietoja…" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Komento" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Komento suoritettu onnistuneesti." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Komento päättyi statuskoodiin" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Komento epäonnistui" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Suoritettava komentorivi" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Komento onnistui" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Komento:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Asetukset" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Räätälöidyt komennot" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Erilliset argumentit" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Kojelauta" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Kuvaus" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" -msgstr "Lataus" +msgstr "Lataa" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Lataa suorituksen tulos" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Komennon suorittaminen epäonnistui!" @@ -111,35 +111,35 @@ msgstr "Komennon suorittaminen epäonnistui!" msgid "Grant UCI access for luci-app-commands" msgstr "Salli pääsy räätälöityjen komentojen asetuksiin" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Linkki" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Ladataan" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Tai näytä tulos" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Julkinen pääsy" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Suorita" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Vakiovirhe" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Vakiotulos" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -147,10 +147,10 @@ msgstr "" "Tällä sivulla voit räätälöidä komentorivillä ajettavia komentoja, jotka " "voidaan sitten suorittaa helposti verkkoselaimesta käsin." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Tässä osassa ei ole vielä arvoja" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Odotetaan komennon suorittamisen päättymistä..." diff --git a/package/luci/applications/luci-app-commands/po/fr/commands.po b/package/luci/applications/luci-app-commands/po/fr/commands.po index 6ce0558e42..2bf25bd8cf 100644 --- a/package/luci/applications/luci-app-commands/po/fr/commands.po +++ b/package/luci/applications/luci-app-commands/po/fr/commands.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2020-05-17 10:09+0000\n" +"PO-Revision-Date: 2023-06-11 22:12+0000\n" "Last-Translator: viking76 \n" -"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.1-dev\n" +"X-Generator: Weblate 4.18-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Une courte description de la commande configurée" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -24,87 +24,87 @@ msgstr "" "Autoriser l'exécution de la commande et le téléchargement de son résultat " "sans authentification préalable" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" "Autoriser l'utilisateur à fournir des arguments de ligne de commande " "supplémentaires" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Arguments :" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Données binaires non affichables, elle peuvent être téléchargées." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Code :" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Récupération des données…" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Commande" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Commande exécutée avec succès." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "La commande s'est arrêtée avec un code de sortie" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Commande terminée avec le code d'état %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Échec de la commande" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Ligne de commande à exécuter" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Commande réussie" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Commande :" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Configurer" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Commandes personnalisées" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Arguments personnalisés" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Tableau de bord" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Description" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Télécharger" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Télécharger le résultat de l'exécution" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Échec de l'exécution de la commande !" @@ -112,35 +112,35 @@ msgstr "Échec de l'exécution de la commande !" msgid "Grant UCI access for luci-app-commands" msgstr "Accorder tout accès UCI a luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Lien" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Chargement" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Ou afficher le résultat" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Accès public" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Exécuter" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Erreur standard" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Sortie standard" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -148,10 +148,10 @@ msgstr "" "Cette page vous permet de configurer des commandes shell personnalisées, " "pouvant être invoquées facilement depuis l'interface web." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Cette section ne contient pas encore de valeur" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "En attente que la commande se termine…" diff --git a/package/luci/applications/luci-app-commands/po/he/commands.po b/package/luci/applications/luci-app-commands/po/he/commands.po index 781d041f69..7d7691bf5b 100644 --- a/package/luci/applications/luci-app-commands/po/he/commands.po +++ b/package/luci/applications/luci-app-commands/po/he/commands.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-01-15 22:31+0000\n" "Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" @@ -12,95 +12,95 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Weblate 4.5-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "תיאור טקסטואלי קצר של הפקודה שהוגדרה" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "נאספים נתונים…" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "תיאור" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "" @@ -108,44 +108,44 @@ msgstr "" msgid "Grant UCI access for luci-app-commands" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "סעיף זה לא מכיל ערכים עדיין" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "" diff --git a/package/luci/applications/luci-app-commands/po/hi/commands.po b/package/luci/applications/luci-app-commands/po/hi/commands.po index dbe5064b7e..e70c5acfc4 100644 --- a/package/luci/applications/luci-app-commands/po/hi/commands.po +++ b/package/luci/applications/luci-app-commands/po/hi/commands.po @@ -12,95 +12,95 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Poedit 1.8.11\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "" @@ -108,44 +108,44 @@ msgstr "" msgid "Grant UCI access for luci-app-commands" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "" diff --git a/package/luci/applications/luci-app-commands/po/hu/commands.po b/package/luci/applications/luci-app-commands/po/hu/commands.po index 2b9310ec52..70f8d4bd8b 100644 --- a/package/luci/applications/luci-app-commands/po/hu/commands.po +++ b/package/luci/applications/luci-app-commands/po/hu/commands.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-08-12 12:55+0000\n" -"Last-Translator: Tudós Péter \n" -"Language-Team: Hungarian \n" +"Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 5.1-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "A beállított parancs rövid szöveges leírása" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -24,123 +24,123 @@ msgstr "" "Lehetővé teszi a parancs végrehajtását és a kimenetének letöltését előzetes " "hitelesítés nélkül" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" "Annak lehetővé tétele a felhasználó számára, hogy további parancssori " "argumentumokat adjon meg" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argumentumok:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "A bináris adat nem jelenik meg, töltse le inkább." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Kód:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Adatok összegyűjtése…" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Parancs" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "A parancs sikeresen végrehajtódott." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "A parancs állapotkóddal kilépett" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "A parancs %d állapotkóddal kilépett" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Parancs sikertelen" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Végrehajtandó parancssor" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "A parancs sikeres" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Parancs:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Beállítás" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Egyéni parancsok" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Egyéni argumentumok" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Kezelőfelület" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Leírás" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Letöltés" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Végrehajtás eredményének letöltése" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Parancs végrehajtása sikertelen!" #: applications/luci-app-commands/root/usr/share/rpcd/acl.d/luci-app-commands.json:3 msgid "Grant UCI access for luci-app-commands" -msgstr "" +msgstr "UCI hozzáférés megadása a luci-app-commands alkalmazásnak" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Hivatkozás" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Betöltés" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Vagy az eredmény megjelenítése" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Nyilvános hozzáférés" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Futtatás" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Szabványos hiba" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Szabványos kimenet" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -148,10 +148,11 @@ msgstr "" "Ez az oldal lehetővé teszi az egyéni parancsértelmező parancsok beállítását, " "amelyek egyszerűen meghívhatók a webes felületről." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 +#, fuzzy msgid "This section contains no values yet" -msgstr "" +msgstr "Ez a szakasz még nem tartalmaz értékeket" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Várakozás a parancs befejeződésére…" diff --git a/package/luci/applications/luci-app-commands/po/it/commands.po b/package/luci/applications/luci-app-commands/po/it/commands.po index 59e3a65613..846855819c 100644 --- a/package/luci/applications/luci-app-commands/po/it/commands.po +++ b/package/luci/applications/luci-app-commands/po/it/commands.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-10-10 21:04+0000\n" -"Last-Translator: garis \n" -"Language-Team: Italian \n" +"Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 5.0-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Una breve descrizione testuale del comando configurato" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -24,86 +24,86 @@ msgstr "" "Consentire l'esecuzione del comando e il download del suo output senza " "previa autenticazione" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" "Consente all'utente di fornire ulteriori argomenti della riga di comando" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argomenti:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "I dati binari non vengono visualizzati, ma possono essere scaricati." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Codice:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." -msgstr "Sto raccogliendo i dati..." +msgstr "Raccolta dei dati..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Comando" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Esecuzione comando completata." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Comando uscito con codice stato" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Il comando è terminato con status %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Comando fallito" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Riga di comando da eseguire" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Comando riuscito" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Comando:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Configura" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Comandi Personalizzati" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Argomenti Personalizzati" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Pannello di controllo" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Descrizione" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" -msgstr "Download" +msgstr "Scarica" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Risultato esecuzione download" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Impossibile eseguire il comando!" @@ -111,35 +111,35 @@ msgstr "Impossibile eseguire il comando!" msgid "Grant UCI access for luci-app-commands" msgstr "Concedi accesso UCI per luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Collegamento" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Caricamento" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "O visualizza risultato" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Accesso Pubblico" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Esegui" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Errore standard" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Output standard" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -147,10 +147,10 @@ msgstr "" "Questa pagina consente di configurare i comandi della shell personalizzate " "che possono essere facilmente richiamati dall'interfaccia web." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Questa sezione non contiene ancora valori" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "In attesa che il comando sia completato..." diff --git a/package/luci/applications/luci-app-commands/po/ja/commands.po b/package/luci/applications/luci-app-commands/po/ja/commands.po index 2ab7ea10bd..7d1885a2b5 100644 --- a/package/luci/applications/luci-app-commands/po/ja/commands.po +++ b/package/luci/applications/luci-app-commands/po/ja/commands.po @@ -4,7 +4,7 @@ msgstr "" "POT-Creation-Date: \n" "PO-Revision-Date: 2020-12-10 19:29+0000\n" "Last-Translator: Ryota <21ryotagamer@gmail.com>\n" -"Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" @@ -13,95 +13,95 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.4-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "設定したコマンドの簡単な説明文を記載します" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "事前認証なしでのコマンドの実行と、結果出力のダウンロードを許可します" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "コマンドラインに対する引数の追記を許可するか設定します" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "引数:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "バイナリデータは表示されずにダウンロードされます。" -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "コード:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "データを収集中..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "コマンド" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "コマンドの実行に成功しました。" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "コマンドは次のステータスコードで終了しました:" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "コマンド実行失敗" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "実行するコマンドラインを記載します" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "コマンド実行成功" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "コマンド:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "設定" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "カスタムコマンド" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "カスタム引数" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "ダッシュボード" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "説明" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "ダウンロード" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "実行結果のダウンロード:" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "コマンドの実行に失敗しました!" @@ -109,35 +109,35 @@ msgstr "コマンドの実行に失敗しました!" msgid "Grant UCI access for luci-app-commands" msgstr "luci-app-commandsにUCIアクセスを許可" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "リンク" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "読み込み中" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "または結果の表示:" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "パブリックアクセス" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "実行" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "標準エラー" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "標準出力" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -145,10 +145,10 @@ msgstr "" "このページでは、ウェブインターフェースから簡単にシェルコマンドを実行すること" "ができます。" -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "このセクションはまだ設定されていません" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "コマンド実行中..." diff --git a/package/luci/applications/luci-app-commands/po/ko/commands.po b/package/luci/applications/luci-app-commands/po/ko/commands.po index f8d8040409..231f179e97 100644 --- a/package/luci/applications/luci-app-commands/po/ko/commands.po +++ b/package/luci/applications/luci-app-commands/po/ko/commands.po @@ -2,151 +2,151 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-31 13:17+0000\n" -"Last-Translator: somni \n" -"Language-Team: Korean \n" +"Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 5.1-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" -msgstr "" +msgstr "설정 명령에 대한 짧은 설명문" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" -msgstr "" +msgstr "인수:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" -msgstr "" +msgstr "코드:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "데이터 수집 중..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" -msgstr "" +msgstr "명령어" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." -msgstr "" +msgstr "명령어가 성공적으로 실행되었습니다." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "명령어가 상태 코드 %d로 종료됨" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" -msgstr "" +msgstr "명령어 실행 실패" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" -msgstr "" +msgstr "실행할 명령줄" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" -msgstr "" +msgstr "명령어 실행 성공" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" -msgstr "" +msgstr "명령어:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" -msgstr "" +msgstr "설정" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" -msgstr "" +msgstr "사용자 지정 명령어" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" -msgstr "" +msgstr "사용자 지정 인수" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "대시보드" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "설명" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "다운로드" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" -msgstr "" +msgstr "실행 결과 다운로드" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" -msgstr "" +msgstr "명령어 실행에 실패했습니다!" #: applications/luci-app-commands/root/usr/share/rpcd/acl.d/luci-app-commands.json:3 msgid "Grant UCI access for luci-app-commands" -msgstr "" +msgstr "luci-app-commands에 UCI 접근 권한 허용" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" -msgstr "" +msgstr "링크" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" -msgstr "로드 중" +msgstr "불러오는 중" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" -msgstr "" +msgstr "또는 결과 표시" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" -msgstr "" +msgstr "공개 접근" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" -msgstr "" +msgstr "실행" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" -msgstr "" +msgstr "표준 오류" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" -msgstr "" +msgstr "표준 출력" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "이 항목에 입력된 값이 없습니다" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." -msgstr "" +msgstr "명령어 실행 완료까지 대기 중..." diff --git a/package/luci/applications/luci-app-commands/po/lt/commands.po b/package/luci/applications/luci-app-commands/po/lt/commands.po new file mode 100644 index 0000000000..392ecb7f8f --- /dev/null +++ b/package/luci/applications/luci-app-commands/po/lt/commands.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-08-15 00:55+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.0-dev\n" + +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 +msgid "A short textual description of the configured command" +msgstr "" + +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 +msgid "" +"Allow executing the command and downloading its output without prior " +"authentication" +msgstr "" + +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 +msgid "Allow the user to provide additional command line arguments" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:156 +msgid "Arguments:" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:60 +msgid "Binary data not displayed, download instead." +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:65 +msgid "Code:" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:174 +msgid "Collecting data..." +msgstr "Renkama informacija (data)..." + +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 +msgid "Command" +msgstr "Komanda" + +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 +msgid "Command executed successfully." +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:67 +msgid "Command failed" +msgstr "Komanda nesėkminga" + +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 +msgid "Command line to execute" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:67 +msgid "Command successful" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:154 +msgid "Command:" +msgstr "" + +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 +msgid "Configure" +msgstr "" + +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 +msgid "Custom Commands" +msgstr "" + +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 +msgid "Custom arguments" +msgstr "" + +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 +msgid "Dashboard" +msgstr "Ataskaitų skydelis" + +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 +msgid "Description" +msgstr "Aprašymas" + +#: applications/luci-app-commands/ucode/template/commands.ut:160 +msgid "Download" +msgstr "Atsisiųsti" + +#: applications/luci-app-commands/ucode/template/commands.ut:117 +msgid "Download execution result" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:73 +msgid "Failed to execute command!" +msgstr "" + +#: applications/luci-app-commands/root/usr/share/rpcd/acl.d/luci-app-commands.json:3 +msgid "Grant UCI access for luci-app-commands" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:162 +msgid "Link" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:47 +msgid "Loading" +msgstr "Kraunama" + +#: applications/luci-app-commands/ucode/template/commands.ut:117 +msgid "Or display result" +msgstr "" + +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 +msgid "Public access" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:159 +msgid "Run" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 +msgid "Standard Error" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 +msgid "Standard Output" +msgstr "" + +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 +msgid "" +"This page allows you to configure custom shell commands which can be easily " +"invoked from the web interface." +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:144 +msgid "This section contains no values yet" +msgstr "" + +#: applications/luci-app-commands/ucode/template/commands.ut:48 +msgid "Waiting for command to complete..." +msgstr "" diff --git a/package/luci/applications/luci-app-commands/po/mr/commands.po b/package/luci/applications/luci-app-commands/po/mr/commands.po index 5ffb8850a1..dbdf5bf364 100644 --- a/package/luci/applications/luci-app-commands/po/mr/commands.po +++ b/package/luci/applications/luci-app-commands/po/mr/commands.po @@ -4,7 +4,7 @@ msgstr "" "POT-Creation-Date: \n" "PO-Revision-Date: 2020-02-12 11:01+0000\n" "Last-Translator: Prachi Joshi \n" -"Language-Team: Marathi \n" "Language: mr\n" "MIME-Version: 1.0\n" @@ -13,11 +13,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 3.11-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "कॉन्फिगर केलेल्या कमांडचे लहान मजकूर वर्णन" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -25,85 +25,85 @@ msgstr "" "आधीच्या प्रमाणीकरणाशिवाय कमांड कार्यान्वित करण्यास आणि त्याचे आउटपुट डाउनलोड करण्यास " "अनुमती द्या" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "वापरकर्त्यास अतिरिक्त कमांड लाइन वितर्क प्रदान करण्याची परवानगी द्या" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "वितर्क:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "बायनरी डेटा प्रदर्शित नाही, त्याऐवजी डाउनलोड करा." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "कोड:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "डेटा संकलित करीत आहे ..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "कमांड" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "कमांड यशस्वीपणे चालवली ." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "स्टेटस कोडे सहा कमांड बाहेर पडली" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "कमांड अयशस्वी" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "कार्यान्वित करण्यासाठी कमांड लाइन" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "कमांड यशस्वी" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "कमांड:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "कॉन्फिगर करा" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "सानुकूल कमांड" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "सानुकूल वितर्क" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "डॅशबोर्ड" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "वर्णन" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "डाउनलोड" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "अंमलबजावणी परिणाम डाउनलोड करा" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "कमांड चालविण्यात अयशस्वी!" @@ -111,35 +111,35 @@ msgstr "कमांड चालविण्यात अयशस्वी!" msgid "Grant UCI access for luci-app-commands" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "दुवा" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "लोड करीत आहे" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "किंवा परिणाम दाखवा" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "सार्वजनिक प्रवेश" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "चालवा" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "मानक त्रुटी" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "मानक आउटपुट" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -147,10 +147,10 @@ msgstr "" "हे पृष्ठ आपल्याला सानुकूल शेल आदेश कॉन्फिगर करण्याची परवानगी देते जे वेब इंटरफेसवरून सहजपणे " "बोलाविले जाऊ शकतात ." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "कमांड पूर्ण होण्याची प्रतीक्षा करीत आहे ..." diff --git a/package/luci/applications/luci-app-commands/po/ms/commands.po b/package/luci/applications/luci-app-commands/po/ms/commands.po index d2b5e06ab6..5b7b0b16c4 100644 --- a/package/luci/applications/luci-app-commands/po/ms/commands.po +++ b/package/luci/applications/luci-app-commands/po/ms/commands.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2019-12-18 04:21+0000\n" "Last-Translator: Pusak Hitam \n" -"Language-Team: Malay \n" "Language: ms\n" "MIME-Version: 1.0\n" @@ -12,95 +12,95 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 3.10-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Mengumpul data..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Keterangan" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "" @@ -108,44 +108,44 @@ msgstr "" msgid "Grant UCI access for luci-app-commands" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "" diff --git a/package/luci/applications/luci-app-commands/po/nb_NO/commands.po b/package/luci/applications/luci-app-commands/po/nb_NO/commands.po index 948d68b53f..d837358db9 100644 --- a/package/luci/applications/luci-app-commands/po/nb_NO/commands.po +++ b/package/luci/applications/luci-app-commands/po/nb_NO/commands.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-07-30 13:52+0000\n" +"PO-Revision-Date: 2023-06-20 14:47+0000\n" "Last-Translator: Allan Nordhøy \n" -"Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7.2-dev\n" +"X-Generator: Weblate 4.18.1\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "En kort tekstlig beskrivelse av den konfigurerte kommandoen" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -24,121 +24,122 @@ msgstr "" "Tillat å utføre kommandoen og laste ned resultatet uten forutgående " "godkjenning" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Tillat brukeren å gi ytterligere kommandolinjeargumenter" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argumenter:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Binære data vises ikke, last ned i stedet." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Kode:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Samler inn data…" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Kommando" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." -msgstr "" +msgstr "Kommando utført." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Kommandoen avsluttet med statuskode «%d»." -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Kommando mislyktes" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Kommandolinje å utføre" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Kommando vellykket" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Kommando:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Konfigurer" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Egendefinerte Kommandoer" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Egendefinerte argumenter" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Oversikt" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Beskrivelse" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Last ned" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 +#, fuzzy msgid "Download execution result" -msgstr "" +msgstr "Resultat av nedlasting" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Kunne ikke utføre kommandoen!" #: applications/luci-app-commands/root/usr/share/rpcd/acl.d/luci-app-commands.json:3 msgid "Grant UCI access for luci-app-commands" -msgstr "" +msgstr "Innvilg UCI-tilgang for luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Link" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Laster inn" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" -msgstr "" +msgstr "Eller visningsresultat" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Tilgjengelig for alle" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Kjør" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" -msgstr "" +msgstr "Standardfeil" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" -msgstr "" +msgstr "Standardutdata" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -146,10 +147,10 @@ msgstr "" "Denne siden lar deg konfigurere egendefinerte shell-kommandoer som lett kan " "startes fra webgrensesnittet." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" -msgstr "" +msgstr "Denne delen inneholder ingen verdier enda" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Venter på at kommandoen fullføres..." diff --git a/package/luci/applications/luci-app-commands/po/pl/commands.po b/package/luci/applications/luci-app-commands/po/pl/commands.po index a8c7902f47..9e9533357e 100644 --- a/package/luci/applications/luci-app-commands/po/pl/commands.po +++ b/package/luci/applications/luci-app-commands/po/pl/commands.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-10-28 15:05+0000\n" +"PO-Revision-Date: 2023-10-25 20:42+0000\n" "Last-Translator: Matthaiks \n" -"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -11,13 +11,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 5.1.1\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Krótki opis konfigurowanej komendy" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -25,85 +25,85 @@ msgstr "" "Zezwól na uruchomienie komendy i pobranie wyjścia bez uprzedniego " "uwierzytelnienia" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" -msgstr "Zezwól użytkownikowi dodać argumenty wiersza poleceń" +msgstr "Zezwól użytkownikowi dodać argumenty wiersza komend" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argumenty:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Nie wyświetlono danych binarnych, możesz je pobrać." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Kod:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Trwa zbieranie danych..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" -msgstr "Polecenie" +msgstr "Komenda" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Pomyślne wykonanie komendy." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Komenda zakończona kodem statusu" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Komenda zakończona z kodem statusu %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" -msgstr "Błędne polecenie" +msgstr "Błędna komenda" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" -msgstr "Linia Komendy do wykonania" +msgstr "Linia komendy do wykonania" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" -msgstr "Komenda Wykonana" +msgstr "Komenda wykonana" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Komenda:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Konfiguracja" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Własne komendy" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Własne argumenty" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Info" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Opis" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" -msgstr "Pobieranie" +msgstr "Pobierz" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Pobierz wynik wykonania" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Nie można wykonać komendy!" @@ -111,46 +111,46 @@ msgstr "Nie można wykonać komendy!" msgid "Grant UCI access for luci-app-commands" msgstr "Udziel dostępu UCI do luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Łącze" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Ładowanie" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Lub wyświetl wynik" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Publiczny dostęp" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Uruchom" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Standardowy błąd" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Standardowe wyjście" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "" -"Ta strona pozwala ci skonfigurować niestandardową komendę którą można łatwo " -"wywołać z interfejsu sieciowego." +"Na tej stronie możesz skonfigurować niestandardowe komendy powłoki, które " +"można łatwo wywołać z poziomu interfejsu internetowego." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Ta sekcja nie zawiera jeszcze żadnych wartości" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." -msgstr "Oczekiwanie na polecenie do wykonania..." +msgstr "Oczekiwanie na komendę do wykonania..." diff --git a/package/luci/applications/luci-app-commands/po/pt/commands.po b/package/luci/applications/luci-app-commands/po/pt/commands.po index 3ab79ba5b3..d754db63e5 100644 --- a/package/luci/applications/luci-app-commands/po/pt/commands.po +++ b/package/luci/applications/luci-app-commands/po/pt/commands.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2022-10-30 15:06+0000\n" "Last-Translator: ssantos \n" -"Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" @@ -12,11 +12,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.14.2-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Uma pequena descrição textual do comando configurado" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -24,86 +24,86 @@ msgstr "" "Permitir a execução do comando e descarregar o resultado sem autenticação " "prévia" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" "Permitir que o utilizador forneça argumentos adicionais na linha de comandos" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argumentos:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Dados binários não mostrados, mas pode descarregar." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Código:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "A recolher dados..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Comando" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Comando executado com sucesso." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Comando terminou com código de estado" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "O comando saiu com o código de estado %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "O comando falhou" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Linha de comandos a executar" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Comando executado com sucesso" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Comando:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Configurar" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Comandos Personalizados" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Argumentos personalizados" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Painel de Controlo" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Descrição" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Descarregar" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Descarregamento do resultado da execução" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Falha ao executar comando!" @@ -111,35 +111,35 @@ msgstr "Falha ao executar comando!" msgid "Grant UCI access for luci-app-commands" msgstr "Conceder acesso UCI ao luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Link" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "A carregar" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Ou exibir resultado" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Acesso público" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Executar" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Erro Padrão" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Saída Padrão" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -147,10 +147,10 @@ msgstr "" "Esta página permite-lhe configurar uma linha de comandos personalizada que " "pode facilmente ser executada a partir da interface web." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Esta secção ainda não contém valores" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "A aguardar que o comando termine..." diff --git a/package/luci/applications/luci-app-commands/po/pt_BR/commands.po b/package/luci/applications/luci-app-commands/po/pt_BR/commands.po index 212441fb67..ffcfa675a9 100644 --- a/package/luci/applications/luci-app-commands/po/pt_BR/commands.po +++ b/package/luci/applications/luci-app-commands/po/pt_BR/commands.po @@ -2,22 +2,22 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-10-28 15:05+0000\n" +"PO-Revision-Date: 2023-06-22 19:55+0000\n" "Last-Translator: Wellington Terumi Uemura \n" "Language-Team: Portuguese (Brazil) \n" +"librecmc/luciapplicationscommands/pt_BR/>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.18.1\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Uma pequena descrição textual do comando configurado" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -25,85 +25,85 @@ msgstr "" "Permitir a execução do comando e descarregar o resultado sem autenticação " "prévia" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Permitir ao usuário inserir argumentos de linha de comando adicionais" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argumentos:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Dados binários não mostrados, mas podem ser baixados." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Código:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Coletando dados..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Comando" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "O comando executou com sucesso." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "O comando encerrou com um estado de erro" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "O comando encerrado com o código %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "O comando falhou" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Linha de comandos a executar" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Comando executado com sucesso" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Comando:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Configurar" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Comandos Personalizados" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Argumentos personalizados" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Painel de Controle" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Descrição" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" -msgstr "Download" +msgstr "Baixar" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Baixar os resultados da execução" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Falha ao executar comando!" @@ -111,35 +111,35 @@ msgstr "Falha ao executar comando!" msgid "Grant UCI access for luci-app-commands" msgstr "Conceda acesso UCI ao luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" -msgstr "Endereço" +msgstr "Enlace" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Carregando" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Ou mostre o resultado" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Acesso público" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Executar" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Saída de Erro" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Saída Padrão" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -147,10 +147,10 @@ msgstr "" "Esta página permite a configuração de comandos personalizados que podem ser " "facilmente executados através da interface web." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Esta seção ainda não possui nenhum valor" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Aguardando a conclusão do comando..." diff --git a/package/luci/applications/luci-app-commands/po/ro/commands.po b/package/luci/applications/luci-app-commands/po/ro/commands.po index ae3d5d10f6..6601596564 100644 --- a/package/luci/applications/luci-app-commands/po/ro/commands.po +++ b/package/luci/applications/luci-app-commands/po/ro/commands.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2022-11-04 20:04+0000\n" "Last-Translator: Simona Iacob \n" -"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" @@ -13,11 +13,11 @@ msgstr "" "20)) ? 1 : 2;\n" "X-Generator: Weblate 4.14.2-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "O scurta descriere textuala a comenzii configurate" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -25,85 +25,85 @@ msgstr "" "Permite executarea comenzii si descarcarea rezultatului fara o autentificare " "anterioara" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Permite utilizatorului sa adauge parametrii in linia de comanda" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Parametrii:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Datele binare nu sunt afișate, descărcați în schimb." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Cod:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Colectare date..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Comandă" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Comandă executată cu succes." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Comanda a ieșit cu codul de stare" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Comanda a ieșit cu codul de stare %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Comandă eşuată" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Linie de comanda pentru a executa" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Comanda reusita" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Comanda:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Configureaza" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Comenzi particulare" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Argumenta particulare" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Tabloul de bord" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Descriere" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Descărcați" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Descărcați rezultatul execuției" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "S-a esuat executarea comenzii!!" @@ -111,35 +111,35 @@ msgstr "S-a esuat executarea comenzii!!" msgid "Grant UCI access for luci-app-commands" msgstr "Acordarea accesului UCI pentru luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Link" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Încărcare" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Sau afișați rezultatul" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Access public" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Ruleaza" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Eroare standard" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Ieșire standard" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -147,10 +147,10 @@ msgstr "" "Această pagină vă permite să configurați comenzi shell personalizate care " "pot fi invocate cu ușurință din interfața web." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Această secțiune nu conține încă nicio valoare" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "În așteptarea finalizării comenzii..." diff --git a/package/luci/applications/luci-app-commands/po/ru/commands.po b/package/luci/applications/luci-app-commands/po/ru/commands.po index 42013790b7..acb674db93 100644 --- a/package/luci/applications/luci-app-commands/po/ru/commands.po +++ b/package/luci/applications/luci-app-commands/po/ru/commands.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: LuCI: commands\n" "POT-Creation-Date: 2013-10-15 16:48+0300\n" -"PO-Revision-Date: 2022-10-28 15:05+0000\n" -"Last-Translator: sergio \n" -"Language-Team: Russian \n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -12,15 +12,15 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.18-dev\n" "Project-Info: Это технический перевод, не дословный. Главное-удобный русский " "интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Короткое текстовое описание команды" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -28,87 +28,89 @@ msgstr "" "Разрешить выполнение команды и загрузку ее выходных данных без ввода пароля " "пользователя" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" "Разрешить пользователю предоставлять дополнительные аргументы командной " "строки" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Аргументы:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." -msgstr "Двоичные данные не отображаются, вместо этого загружаются." +msgstr "" +"Двоичные данные не отображаются, вы можете загрузить их, нажав " +"соответствующую кнопку." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Код:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Сбор данных..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Команда" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Команда выполнена успешно." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Команда вышла с кодом состояния" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Команда завершилась с кодом состояния %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" -msgstr "Ошибка команды" +msgstr "Команда выполнена НЕ успешно" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" -msgstr "Командная строка
    для выполнения" +msgstr "Командная строка для выполнения" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" -msgstr "Команда выполнена" +msgstr "Команда выполнена успешно" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Команда:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" -msgstr "Настройка панели управления" +msgstr "Настроить команды" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Пользовательские команды" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Пользовательские аргументы" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" -msgstr "Панель мониторинга" +msgstr "Информационная панель" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Описание" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Скачать" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" -msgstr "Результат выполнения загрузки" +msgstr "Загрузить результат выполнения" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Ошибка выполнения команды!" @@ -116,47 +118,46 @@ msgstr "Ошибка выполнения команды!" msgid "Grant UCI access for luci-app-commands" msgstr "Предоставить UCI доступ для luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Ссылка" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Загрузка" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" -msgstr "Или отобразить результат" +msgstr "Или показать результат выполнения" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Публичный доступ" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" -msgstr "Запуск" +msgstr "Запустить" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" -msgstr "Стандартная ошибка" +msgstr "Вывод stderr" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" -msgstr "Стандартный вывод" +msgstr "Вывод stdout" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "" -"Страница позволяет настроить выполнение консольных команд пользователя, " -"которые могут быть легко вызваны из веб-интерфейса по нажатию " -"соответствующей кнопки. Здесь вы можете подписать кнопки и указать команды." +"Здесь можно настроить консольные команды, которые могут быть легко вызваны " +"из веб-интерфейса на соседней вкладке \"Панель команд\"." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" -msgstr "Этот раздел не содержит данных" +msgstr "Здесь пока что пусто" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Ожидание завершения выполнения команды..." diff --git a/package/luci/applications/luci-app-commands/po/sk/commands.po b/package/luci/applications/luci-app-commands/po/sk/commands.po index f2d7bc9ce5..17ba36aab9 100644 --- a/package/luci/applications/luci-app-commands/po/sk/commands.po +++ b/package/luci/applications/luci-app-commands/po/sk/commands.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-11-15 00:45+0000\n" +"PO-Revision-Date: 2023-07-12 15:47+0000\n" "Last-Translator: MaycoH \n" -"Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.0-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Krátky textový popis nakonfigurovaného príkazu" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -24,85 +24,85 @@ msgstr "" "Povoliť vykonanie príkazu a stiahnutie jeho výstupu bez predchádzajúcej " "autentifikácie" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Umožniť používateľovi poskytnúť dodatočné parametre príkazového riadku" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Parametre:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Binárne údaje neboli zobrazené, ale môžu byť prevzaté." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Kód:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Zbierajú sa údaje..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Príkaz" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Príkaz úspešne spustený." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Príkaz skončil so stavovým kódom" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Príkaz skončil so stavovým kódom %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Príkaz zlyhal" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Príkazový riadok na spustenie" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Príkaz úspešný" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Príkaz:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Konfigurovať" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Vlastné príkazy" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Vlastné parametre" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Nástenka" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Popis" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" -msgstr "Prevziať" +msgstr "Stiahnuť" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Stiahnuť výsledok vykonania" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Zlyhalo spustenie príkazu!" @@ -110,36 +110,36 @@ msgstr "Zlyhalo spustenie príkazu!" msgid "Grant UCI access for luci-app-commands" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Odkaz" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 #, fuzzy msgid "Loading" msgstr "Načítava sa" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Alebo zobraziť výsledok" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Verejný prístup" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Spustiť" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Štandardná chyba" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Štandardný výstup" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -147,10 +147,10 @@ msgstr "" "Táto stránka umožňuje nakonfigurovať vlastné príkazy shellu, ktoré možno " "jednoducho vyvolať z webového rozhrania." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Táto sekcia zatiaľ neobsahuje žiadne hodnoty" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Čaká sa na dokončenie príkazu..." diff --git a/package/luci/applications/luci-app-commands/po/sv/commands.po b/package/luci/applications/luci-app-commands/po/sv/commands.po index 7f862fca19..769b04cbc7 100644 --- a/package/luci/applications/luci-app-commands/po/sv/commands.po +++ b/package/luci/applications/luci-app-commands/po/sv/commands.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-05-19 13:17+0000\n" "Last-Translator: Stefan Tamas \n" -"Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" @@ -12,11 +12,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.7-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "En kort textuell beskrivning av det inställda kommandot" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -24,85 +24,85 @@ msgstr "" "Tillåt att kommandot kan köras och ladda ner dess utmatning utan föregående " "autentisering" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Tillåt användaren att tillge extra kommandoradsargument" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argument:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Binärdatan visades inte, ladda ner istället." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Kod:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Samlar in data..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Kommando" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Kommandot utfördes korrekt." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Kommandot avslutade med statuskod" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Kommandot misslyckades" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Kommandorad att exekvera" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Kommandot lyckades" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Kommando:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Ställ in" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Anpassade kommandon" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Anpassade argument" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Instrumentbräda" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Beskrivning" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Nedladdning" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Resultatet av nerladdningen" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Misslyckade med att köra kommando!" @@ -110,35 +110,35 @@ msgstr "Misslyckade med att köra kommando!" msgid "Grant UCI access for luci-app-commands" msgstr "Ge UCI åtkomst för luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Länk" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Laddar" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Eller visa resultat" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Publik tillgång" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Kör" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Standardfel" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Standardinmatning" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -146,10 +146,10 @@ msgstr "" "Den här sidan tillåter dig att ställa in anpassade skalkommandon som lättast " "kan åberopas från webbgränssnittet." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Den här sektionen innehåller inga värden ännu" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Väntar på att kommandot ska slutföras..." diff --git a/package/luci/applications/luci-app-commands/po/templates/commands.pot b/package/luci/applications/luci-app-commands/po/templates/commands.pot index 3aefbea650..e8ccedbac6 100644 --- a/package/luci/applications/luci-app-commands/po/templates/commands.pot +++ b/package/luci/applications/luci-app-commands/po/templates/commands.pot @@ -1,95 +1,95 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "" @@ -97,44 +97,44 @@ msgstr "" msgid "Grant UCI access for luci-app-commands" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "" diff --git a/package/luci/applications/luci-app-commands/po/tr/commands.po b/package/luci/applications/luci-app-commands/po/tr/commands.po index e4457ced21..6dee4f26a4 100644 --- a/package/luci/applications/luci-app-commands/po/tr/commands.po +++ b/package/luci/applications/luci-app-commands/po/tr/commands.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2022-10-28 15:05+0000\n" "Last-Translator: Oğuz Ersen \n" -"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" @@ -12,11 +12,11 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.14.2-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Yapılandırılan komutun kısa bir metin açıklaması" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -24,85 +24,85 @@ msgstr "" "Önceden kimlik doğrulama yapmadan komutun çalıştırılmasına ve çıktısının " "indirilmesine izin ver" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Kullanıcının ek komut satırı argümanları sağlamasına izin ver" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Argümanlar:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "İkili veri görüntülenmiyor, bunun yerine indir." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Kod:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Veriler toplanıyor..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Komut" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Komut başarıyla çalıştırıldı." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Komut şu durum kodu ile çıktı:" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Komut, durum kodu %d ile çıktı" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Komut başarısız oldu" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Çalıştırılacak komut satırı" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Komut başarılı" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Komut:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Yapılandır" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Özel Komutlar" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Özel argümanlar" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Denetim Paneli" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Açıklama" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "İndir" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Çalıştırma sonucunu indir" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Komutu çalıştırma başarısız oldu!" @@ -110,35 +110,35 @@ msgstr "Komutu çalıştırma başarısız oldu!" msgid "Grant UCI access for luci-app-commands" msgstr "luci-app-commands için UCI erişimi verin" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Bağlantı" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Yükleniyor" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Veya sonucu göster" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Genel erişim" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Çalıştır" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Standart Hata" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Standart Çıktı" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -146,10 +146,10 @@ msgstr "" "Bu sayfa, web arayüzünden kolayca çağrılabilen özel kabuk komutlarını " "yapılandırmanıza olanak tanır." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Bu bölüm henüz herhangi bir değer içermiyor" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Komutun tamamlanması bekleniyor..." diff --git a/package/luci/applications/luci-app-commands/po/uk/commands.po b/package/luci/applications/luci-app-commands/po/uk/commands.po index 2484accb42..4f18bde166 100644 --- a/package/luci/applications/luci-app-commands/po/uk/commands.po +++ b/package/luci/applications/luci-app-commands/po/uk/commands.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-11-04 17:37+0000\n" -"Last-Translator: Paul Dee \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -11,13 +11,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.15-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "Короткий текстовий опис налаштовуваної команди" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" @@ -25,85 +25,85 @@ msgstr "" "Дозволити виконання команди та завантаження її результатів без попередньої " "автентифікації" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "Дозвольте користувачеві надати додаткові аргументи командного рядка" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "Аргументи:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "Бінарні дані не відображаються, завантажте замість цього." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "Код:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Збирання даних..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "Команда" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "Команду вдало виконано." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "Команда вийшла із кодом стану" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Команду завершено з кодом стану %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "Не вдалося виконати команду" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "Командний рядок для виконання" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "Команду виконано" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "Команда:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "Конфігурація" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "Власна команда" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "Власні аргументи" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "Панелі" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Опис" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "Завантажити" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "Підсумок виконання завантаження" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "Помилка виконання команди!" @@ -111,35 +111,35 @@ msgstr "Помилка виконання команди!" msgid "Grant UCI access for luci-app-commands" msgstr "Надати доступ UCI для команд luci-app" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "Посилання" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Завантаження" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "Або відобразити підсумок" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "Відкритий доступ" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "Запустити" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "Стандартна помилка" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "Стандартний вивід" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." @@ -147,10 +147,10 @@ msgstr "" "Ця сторінка дозволяє налаштувати користувацькі команди оболонки, які може " "бути легко запущені з веб-інтерфейсу." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "Ця секція поки що не містить значень" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Очікуємо завершення виконання команди..." diff --git a/package/luci/applications/luci-app-commands/po/vi/commands.po b/package/luci/applications/luci-app-commands/po/vi/commands.po index c999af0263..fbdc79287b 100644 --- a/package/luci/applications/luci-app-commands/po/vi/commands.po +++ b/package/luci/applications/luci-app-commands/po/vi/commands.po @@ -1,151 +1,154 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2019-11-20 17:05+0000\n" -"Last-Translator: Le Van Uoc \n" -"Language-Team: Vietnamese \n" +"Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.10-dev\n" +"X-Generator: Weblate 4.18.1\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" -msgstr "" +msgstr "Một mô tả văn bản ngắn về lệnh được cấu hình" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "" +"Cho phép thực thi lệnh và tải xuống đầu ra của nó mà không cần xác thực trước" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" -msgstr "" +msgstr "Cho phép người dùng cung cấp đối số dòng lệnh bổ sung" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" -msgstr "" +msgstr "Đối số:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." -msgstr "" +msgstr "Dữ liệu nhị phân không được hiển thị, tải xuống thay thế." -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" -msgstr "" +msgstr "Mã:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "Đang lấy dữ liệu..." -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" -msgstr "" +msgstr "Lệnh" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." -msgstr "" +msgstr "Lệnh được thực thi thành công." -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "Lệnh thoát với mã trạng thái %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" -msgstr "" +msgstr "Lệnh thất bại" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" -msgstr "" +msgstr "Dòng lệnh để thực thi" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" -msgstr "" +msgstr "Lệnh thành công" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" -msgstr "" +msgstr "Lệnh:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" -msgstr "" +msgstr "Cấu hình" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" -msgstr "" +msgstr "Lệnh Tùy chỉnh" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" -msgstr "" +msgstr "Tham số tùy chỉnh" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" -msgstr "" +msgstr "Màn hình chính" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "Mô tả" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" -msgstr "" +msgstr "Tải xuống" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" -msgstr "" +msgstr "Tải xuống kết quả thực thi" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" -msgstr "" +msgstr "Không thể thực thi lệnh!" #: applications/luci-app-commands/root/usr/share/rpcd/acl.d/luci-app-commands.json:3 msgid "Grant UCI access for luci-app-commands" -msgstr "" +msgstr "Cấp quyền truy cập UCI cho luci-app-commands" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" -msgstr "" +msgstr "Liên kết" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "Đang tải" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" -msgstr "" +msgstr "Hoặc hiển thị kết quả" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" -msgstr "" +msgstr "Truy cập công khai" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" -msgstr "" +msgstr "Chạy" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" -msgstr "" +msgstr "Lỗi tiêu chuẩn" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" -msgstr "" +msgstr "Đầu ra tiêu chuẩn" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "" +"Trang này cho phép bạn cấu hình các lệnh shell tùy chỉnh có thể được gọi một " +"cách dễ dàng từ giao diện web." -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" -msgstr "" +msgstr "Phần này chưa chứa giá trị nào" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "Vui lòng chờ đến khi lệnh được thực thi hoàn thành..." diff --git a/package/luci/applications/luci-app-commands/po/zh_Hans/commands.po b/package/luci/applications/luci-app-commands/po/zh_Hans/commands.po index dd1bf71766..a4505d6288 100644 --- a/package/luci/applications/luci-app-commands/po/zh_Hans/commands.po +++ b/package/luci/applications/luci-app-commands/po/zh_Hans/commands.po @@ -8,7 +8,7 @@ msgstr "" "PO-Revision-Date: 2022-10-28 15:05+0000\n" "Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" +"librecmc/luciapplicationscommands/zh_Hans/>\n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -16,95 +16,95 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.14.2-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "简短描述命令用途" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "允许不事先验证就执行命令并下载其输出" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "允许用户提供额外的命令行参数" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "参数:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "二进制数据未显示,以下载替代。" -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "状态码:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "正在收集数据…" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "命令" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "命令成功执行。" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "命令退出,状态码为" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "命令已退出,状态码 %d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "命令执行失败" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "执行命令行" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "执行命令成功" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "命令:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "配置" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "自定义命令" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "自定义参数" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "概览" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "描述" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "下载" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "下载执行结果" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "执行命令失败!" @@ -112,44 +112,44 @@ msgstr "执行命令失败!" msgid "Grant UCI access for luci-app-commands" msgstr "授予UCI访问luci-app-commands的权限" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "连接" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "加载中" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "显示执行结果" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "公开访问" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "运行" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "标准错误流" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "标准输出流" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "此页面允许您配置自定义 Shell 命令,并可以从 Web 界面调用。" -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "尚无任何配置" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "正在等待命令完成…" diff --git a/package/luci/applications/luci-app-commands/po/zh_Hant/commands.po b/package/luci/applications/luci-app-commands/po/zh_Hant/commands.po index a621a6d421..62705201f6 100644 --- a/package/luci/applications/luci-app-commands/po/zh_Hant/commands.po +++ b/package/luci/applications/luci-app-commands/po/zh_Hant/commands.po @@ -9,7 +9,7 @@ msgstr "" "PO-Revision-Date: 2022-11-25 14:34+0000\n" "Last-Translator: James Tien \n" "Language-Team: Chinese (Traditional) \n" +"librecmc/luciapplicationscommands/zh_Hant/>\n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,95 +17,95 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.15-dev\n" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:16 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:19 msgid "A short textual description of the configured command" msgstr "簡短描述指令用途" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:25 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:30 msgid "" "Allow executing the command and downloading its output without prior " "authentication" msgstr "允許執行命令並下載其輸出, 無須事先認證" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:22 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:27 msgid "Allow the user to provide additional command line arguments" msgstr "允許使用者提供額外的指令列引數" -#: applications/luci-app-commands/luasrc/view/commands.htm:162 +#: applications/luci-app-commands/ucode/template/commands.ut:156 msgid "Arguments:" msgstr "引數:" -#: applications/luci-app-commands/luasrc/view/commands.htm:66 +#: applications/luci-app-commands/ucode/template/commands.ut:60 msgid "Binary data not displayed, download instead." msgstr "二進位資料未顯示,以下載替代。" -#: applications/luci-app-commands/luasrc/view/commands.htm:71 +#: applications/luci-app-commands/ucode/template/commands.ut:65 msgid "Code:" msgstr "狀態碼:" -#: applications/luci-app-commands/luasrc/view/commands.htm:182 +#: applications/luci-app-commands/ucode/template/commands.ut:174 msgid "Collecting data..." msgstr "正在收集資料中…" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:18 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command" msgstr "命令" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:30 +#: applications/luci-app-commands/ucode/template/commands_public.ut:32 msgid "Command executed successfully." msgstr "指令成功執行。" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:32 -msgid "Command exited with status code" -msgstr "指令退出附狀態碼" +#: applications/luci-app-commands/ucode/template/commands_public.ut:34 +msgid "Command exited with status code %d" +msgstr "指令執行完的得到的狀態碼爲%d" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command failed" msgstr "指令失敗" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:19 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:21 msgid "Command line to execute" msgstr "執行指令列" -#: applications/luci-app-commands/luasrc/view/commands.htm:73 +#: applications/luci-app-commands/ucode/template/commands.ut:67 msgid "Command successful" msgstr "執行指令成功" -#: applications/luci-app-commands/luasrc/view/commands.htm:160 +#: applications/luci-app-commands/ucode/template/commands.ut:154 msgid "Command:" msgstr "指令:" -#: applications/luci-app-commands/luasrc/controller/commands.lua:9 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:23 msgid "Configure" msgstr "配置" -#: applications/luci-app-commands/luasrc/controller/commands.lua:7 -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:6 -#: applications/luci-app-commands/luasrc/view/commands.htm:144 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:10 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:3 +#: applications/luci-app-commands/ucode/template/commands.ut:137 msgid "Custom Commands" msgstr "自訂指令集" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:21 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:26 msgid "Custom arguments" msgstr "自訂參數集" -#: applications/luci-app-commands/luasrc/controller/commands.lua:8 +#: applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json:14 msgid "Dashboard" msgstr "儀表板" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:15 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:18 msgid "Description" msgstr "描述" -#: applications/luci-app-commands/luasrc/view/commands.htm:166 +#: applications/luci-app-commands/ucode/template/commands.ut:160 msgid "Download" msgstr "下載" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Download execution result" msgstr "下載執行結果" -#: applications/luci-app-commands/luasrc/view/commands.htm:79 +#: applications/luci-app-commands/ucode/template/commands.ut:73 msgid "Failed to execute command!" msgstr "執行指令失敗!" @@ -113,44 +113,44 @@ msgstr "執行指令失敗!" msgid "Grant UCI access for luci-app-commands" msgstr "授予 luci-app-commands 擁有 UCI 存取的權限" -#: applications/luci-app-commands/luasrc/view/commands.htm:168 +#: applications/luci-app-commands/ucode/template/commands.ut:162 msgid "Link" msgstr "連線" -#: applications/luci-app-commands/luasrc/view/commands.htm:53 +#: applications/luci-app-commands/ucode/template/commands.ut:47 msgid "Loading" msgstr "正在載入中" -#: applications/luci-app-commands/luasrc/view/commands.htm:123 +#: applications/luci-app-commands/ucode/template/commands.ut:117 msgid "Or display result" msgstr "顯示執行結果" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:24 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:29 msgid "Public access" msgstr "公開訪問" -#: applications/luci-app-commands/luasrc/view/commands.htm:165 +#: applications/luci-app-commands/ucode/template/commands.ut:159 msgid "Run" msgstr "執行" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:41 +#: applications/luci-app-commands/ucode/template/commands_public.ut:44 msgid "Standard Error" msgstr "標準錯誤流" -#: applications/luci-app-commands/luasrc/view/commands_public.htm:36 +#: applications/luci-app-commands/ucode/template/commands_public.ut:39 msgid "Standard Output" msgstr "標準輸出流" -#: applications/luci-app-commands/luasrc/model/cbi/commands.lua:7 +#: applications/luci-app-commands/htdocs/luci-static/resources/view/commands.js:11 msgid "" "This page allows you to configure custom shell commands which can be easily " "invoked from the web interface." msgstr "此頁面允許您配置自訂 Shell 指令,並可以從 Web 介面呼叫。" -#: applications/luci-app-commands/luasrc/view/commands.htm:150 +#: applications/luci-app-commands/ucode/template/commands.ut:144 msgid "This section contains no values yet" msgstr "這部分尚無數值" -#: applications/luci-app-commands/luasrc/view/commands.htm:54 +#: applications/luci-app-commands/ucode/template/commands.ut:48 msgid "Waiting for command to complete..." msgstr "正在等待指令完成…" diff --git a/package/luci/applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json b/package/luci/applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json new file mode 100644 index 0000000000..8230b14bc6 --- /dev/null +++ b/package/luci/applications/luci-app-commands/root/usr/share/luci/menu.d/luci-app-commands.json @@ -0,0 +1,56 @@ +{ + "admin/system/commands": { + "title": "Custom Commands", + "order": 80, + "action": { + "type": "firstchild" + }, + "depends": { + "acl": [ "luci-app-commands" ] + } + }, + + "admin/system/commands/dashboard": { + "title": "Dashboard", + "order": 1, + "action": { + "type": "template", + "path": "commands" + } + }, + + "admin/system/commands/config": { + "title": "Configure", + "order": 2, + "action": { + "type": "view", + "path": "commands" + } + }, + + "admin/system/commands/run/*": { + "order": 3, + "action": { + "type": "function", + "module": "luci.controller.commands", + "function": "action_run" + } + }, + + "admin/system/commands/download/*": { + "order": 4, + "action": { + "type": "function", + "module": "luci.controller.commands", + "function": "action_download" + } + }, + + "command/*": { + "action": { + "type": "function", + "module": "luci.controller.commands", + "function": "action_public" + } + } +} diff --git a/package/luci/applications/luci-app-commands/ucode/controller/commands.uc b/package/luci/applications/luci-app-commands/ucode/controller/commands.uc new file mode 100644 index 0000000000..9126d59eb0 --- /dev/null +++ b/package/luci/applications/luci-app-commands/ucode/controller/commands.uc @@ -0,0 +1,256 @@ +// Copyright 2012-2022 Jo-Philipp Wich +// Licensed to the public under the Apache License 2.0. + +'use strict'; + +import { basename, mkstemp, popen } from 'fs'; +import { urldecode } from 'luci.http'; + +// Decode a given string into arguments following shell quoting rules +// [[abc\ def "foo\"bar" abc'def']] -> [[abc def]] [[foo"bar]] [[abcdef]] +function parse_args(str) { + let args = []; + + function isspace(c) { + if (c == 9 || c == 10 || c == 11 || c == 12 || c == 13 || c == 32) + return c; + } + + function isquote(c) { + if (c == 34 || c == 39 || c == 96) + return c; + } + + function isescape(c) { + if (c == 92) + return c; + } + + function ismeta(c) { + if (c == 36 || c == 92 || c == 96) + return c; + } + + // Scan substring defined by the indexes [s, e] of the string "str", + // perform unquoting and de-escaping on the fly and store the result + function unquote(start, end) { + let esc, quote, res = []; + + for (let off = start; off < end; off++) { + const byte = ord(str, off); + const q = isquote(byte); + const e = isescape(byte); + const m = ismeta(byte); + + if (esc) { + if (!m) + push(res, 92); + + push(res, byte); + esc = false; + } + else if (e && quote != 39) { + esc = true; + } + else if (q && quote && q == quote) { + quote = null; + } + else if (q && !quote) { + quote = q; + } + else { + push(res, byte); + } + } + + push(args, chr(...res)); + } + + // Find substring boundaries in "str". Ignore escaped or quoted + // whitespace, pass found start- and end-index for each substring + // to unquote() + let esc, start, quote; + + for (let off = 0; off <= length(str); off++) { + const byte = ord(str, off); + const q = isquote(byte); + const s = isspace(byte) ?? (byte === null); + const e = isescape(byte); + + if (esc) { + esc = false; + } + else if (e && quote != 39) { + esc = true; + start ??= off; + } + else if (q && quote && q == quote) { + quote = null; + } + else if (q && !quote) { + start ??= off; + quote = q; + } + else if (s && !quote) { + if (start !== null) { + unquote(start, off); + start = null; + } + } + else { + start ??= off; + } + } + + // If the "quote" is still set we encountered an unfinished string + if (quote) + unquote(start, length(str)); + + return args; +} + +function test_binary(str) { + for (let off = 0, byte = ord(str); off < length(str); byte = ord(str, ++off)) + if (byte <= 8 || (byte >= 14 && byte <= 31)) + return true; + + return false; +} + +function parse_cmdline(cmdid, args) { + if (uci.get('luci', cmdid) == 'command') { + let cmd = uci.get_all('luci', cmdid); + let argv = parse_args(cmd?.command); + + if (cmd?.param == '1') { + if (length(args)) + push(argv, ...(parse_args(urldecode(args)) ?? [])); + else if (length(args = http.formvalue('args'))) + push(argv, ...(parse_args(args) ?? [])); + } + + return map(argv, v => match(v, /[^\w.\/|-]/) ? `'${replace(v, "'", "'\\''")}'` : v); + } +} + +function execute_command(callback, ...args) { + let argv = parse_cmdline(...args); + + if (argv) { + let outfd = mkstemp(); + let errfd = mkstemp(); + + const exitcode = system(`${join(' ', argv)} >&${outfd.fileno()} 2>&${errfd.fileno()}`); + + outfd.seek(0); + errfd.seek(0); + + const stdout = outfd.read(1024 * 512) ?? ''; + const stderr = errfd.read(1024 * 512) ?? ''; + + outfd.close(); + errfd.close(); + + const binary = test_binary(stdout); + + callback({ + ok: true, + command: join(' ', argv), + stdout: binary ? null : stdout, + stderr, + exitcode, + binary + }); + } + else { + callback({ + ok: false, + code: 404, + reason: "No such command" + }); + } +} + +function return_json(result) { + if (result.ok) { + http.prepare_content('application/json'); + http.write_json(result); + } + else { + http.status(result.code, result.reason); + } +} + + +function return_html(result) { + if (result.ok) { + include('commands_public', result); + } + else { + http.status(result.code, result.reason); + } +} + +return { + action_run: function(...args) { + execute_command(return_json, ...args); + }, + + action_download: function(...args) { + const argv = parse_cmdline(...args); + + if (argv) { + const fd = popen(`${join(' ', argv)} 2>/dev/null`); + + if (fd) { + let filename = replace(basename(argv[0]), /\W+/g, '.'); + let chunk = fd.read(4096) ?? ''; + let name; + + if (test_binary(chunk)) { + http.header("Content-Disposition", `attachment; filename=${filename}.bin`); + http.prepare_content("application/octet-stream"); + } + else { + http.header("Content-Disposition", `attachment; filename=${filename}.txt`); + http.prepare_content("text/plain"); + } + + while (length(chunk)) { + http.write(chunk); + chunk = fd.read(4096); + } + + fd.close(); + } + else { + http.status(500, "Failed to execute command"); + } + } + else { + http.status(404, "No such command"); + } + }, + + action_public: function(cmdid, ...args) { + let disp = false; + + if (substr(cmdid, -1) == "s") { + disp = true; + cmdid = substr(cmdid, 0, -1); + } + + if (cmdid && + uci.get('luci', cmdid) == 'command' && + uci.get('luci', cmdid, 'public') == '1') + { + if (disp) + execute_command(return_html, cmdid, ...args); + else + this.action_download(cmdid, args); + } + else { + http.status(403, "Access to command denied"); + } + } +}; diff --git a/package/luci/applications/luci-app-commands/ucode/template/commands.ut b/package/luci/applications/luci-app-commands/ucode/template/commands.ut new file mode 100644 index 0000000000..8e5ce0b486 --- /dev/null +++ b/package/luci/applications/luci-app-commands/ucode/template/commands.ut @@ -0,0 +1,179 @@ +{# + Copyright 2012-2022 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% + include('header', { css: ` + .commands { + display: flex; + flex-wrap: wrap; + } + + .commandbox { + flex: 0 0 30%; + margin: .5em; + display: flex; + flex-direction: column; + } + + .commandbox > p, + .commandbox > p > * { + display: block; + } + + .commandbox div { + margin-top: auto; + } + ` }); +-%} + + + +{% + const commands = []; + + uci.foreach('luci', 'command', s => push(commands, s)); +-%} + +
    +
    +

    {{ _('Custom Commands') }}

    + + {% if (length(commands) == 0): %} +
    +
    +
    +

    + {{ _('This section contains no values yet') }} +

    +
    +
    +
    + {% else %} +
    + {% for (let command in commands): %} +
    +

    {{ entityencode(command.name) }}

    +

    {{ _('Command:') }} {{ entityencode(command.command) }}

    + {% if (command.param == "1"): %} +

    {{ _('Arguments:') }}

    + {% endif %} +
    + + + {% if (command.public == "1"): %} + + {% endif %} +
    +
    + {% endfor %} + + +
    + {% endif %} +
    + + +
    + +{% include('footer') %} diff --git a/package/luci/applications/luci-app-commands/ucode/template/commands_public.ut b/package/luci/applications/luci-app-commands/ucode/template/commands_public.ut new file mode 100644 index 0000000000..aef072f802 --- /dev/null +++ b/package/luci/applications/luci-app-commands/ucode/template/commands_public.ut @@ -0,0 +1,48 @@ +{# + Copyright 2016 t123yh + Copyright 2022 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% + include('header', { blank_page: true, css: ` + .alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; + } + + .alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; + } + + .alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; + } + ` }); +-%} + + + +{% if (length(stdout)): %} +

    {{ _('Standard Output') }}

    +
    {{ entityencode(stdout) }}
    +{% endif %} + +{% if (length(stderr)): %} +

    {{ _('Standard Error') }}

    +
    {{ entityencode(stderr) }}
    +{% endif %} + +{% include('footer', { blank_page: true }) %} diff --git a/package/luci/applications/luci-app-firewall/Makefile b/package/luci/applications/luci-app-firewall/Makefile index 2e219d0096..0a9b813610 100644 --- a/package/luci/applications/luci-app-firewall/Makefile +++ b/package/luci/applications/luci-app-firewall/Makefile @@ -13,4 +13,4 @@ PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js index 03e505e89d..ec0ee369ea 100644 --- a/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js +++ b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js @@ -477,18 +477,20 @@ return baseclass.extend({ addLocalIPOption: function(s, tab, name, label, description, devices) { var o = s.taboption(tab, form.Value, name, label, description); + var fw4 = L.hasSystemFeature('firewall4'); o.modalonly = true; - o.datatype = 'ip4addr("nomask")'; + o.datatype = !fw4?'ip4addr("nomask")':'ipaddr("nomask")'; o.placeholder = _('any'); L.sortedKeys(devices, 'name').forEach(function(dev) { var ip4addrs = devices[dev].ipaddrs; + var ip6addrs = devices[dev].ip6addrs; - if (!L.isObject(devices[dev].flags) || !Array.isArray(ip4addrs) || devices[dev].flags.loopback) + if (!L.isObject(devices[dev].flags) || devices[dev].flags.loopback) return; - for (var i = 0; i < ip4addrs.length; i++) { + for (var i = 0; Array.isArray(ip4addrs) && i < ip4addrs.length; i++) { if (!L.isObject(ip4addrs[i]) || !ip4addrs[i].address) continue; @@ -496,6 +498,14 @@ return baseclass.extend({ ip4addrs[i].address, ' (', E('strong', {}, [dev]), ')' ])); } + for (var i = 0; fw4 && Array.isArray(ip6addrs) && i < ip6addrs.length; i++) { + if (!L.isObject(ip6addrs[i]) || !ip6addrs[i].address) + continue; + + o.value(ip6addrs[i].address, E([], [ + ip6addrs[i].address, ' (', E('strong', {}, [dev]), ')' + ])); + } }); return o; diff --git a/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js index cbd4362049..4b8e6bf604 100644 --- a/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js +++ b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js @@ -9,6 +9,8 @@ 'require tools.widgets as widgets'; function rule_proto_txt(s, ctHelpers) { + var family = (uci.get('firewall', s, 'family') || '').toLowerCase().replace(/^(?:any|\*)$/, ''); + var dip = uci.get('firewall', s, 'dest_ip') || ''; var proto = L.toArray(uci.get('firewall', s, 'proto')).filter(function(p) { return (p != '*' && p != 'any' && p != 'all'); }).map(function(p) { @@ -20,7 +22,7 @@ function rule_proto_txt(s, ctHelpers) { }; }); - m = String(uci.get('firewall', s, 'helper') || '').match(/^(!\s*)?(\S+)$/); + var m = String(uci.get('firewall', s, 'helper') || '').match(/^(!\s*)?(\S+)$/); var h = m ? { val: m[0].toUpperCase(), inv: m[1], @@ -35,7 +37,9 @@ function rule_proto_txt(s, ctHelpers) { mask: m[3] ? '0x%02X'.format(+m[3]) : null } : null; - return fwtool.fmt(_('Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP with types %{item.types#%{next?, }%{item}}:%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}'), { + return fwtool.fmt(_('Incoming %{ipv6?%{ipv4?IPv4 and IPv6:IPv6}:IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP with types %{item.types#%{next?, }%{item}}:%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}'), { + ipv4: ((!family && dip.indexOf(':') == -1) || family == 'ipv4'), + ipv6: ((!family && dip.indexOf(':') != -1) || (!family && !dip) || family == 'ipv6'), proto: proto, helper: h, mark: f @@ -85,6 +89,24 @@ function rule_target_txt(s) { }); } +function validate_opt_family(m, section_id, opt) { + var dopt = m.section.getOption('dest_ip'), + fmopt = m.section.getOption('family'); + + if (!dopt.isValid(section_id) && opt != 'dest_ip') + return true; + if (!fmopt.isValid(section_id) && opt != 'family') + return true; + + var dip = dopt.formvalue(section_id) || '', + fm = fmopt.formvalue(section_id) || ''; + + if (fm == '' || (fm == 'ipv6' && (dip.indexOf(':') != -1 || dip == '')) || (fm == 'ipv4' && dip.indexOf(':') == -1)) + return true; + + return _('Address family, Internal IP address must match'); +} + return view.extend({ callHostHints: rpc.declare({ object: 'luci-rpc', @@ -125,6 +147,7 @@ return view.extend({ ctHelpers = data[1], devs = data[2], m, s, o; + var fw4 = L.hasSystemFeature('firewall4'); m = new form.Map('firewall', _('Firewall - Port Forwards'), _('Port forwarding allows remote computers on the Internet to connect to a specific computer or service within the private LAN.')); @@ -160,6 +183,29 @@ return view.extend({ o.placeholder = _('Unnamed forward'); o.modalonly = true; + if (fw4) { + o = s.taboption('general', form.ListValue, 'family', _('Restrict to address family')); + o.modalonly = true; + o.rmempty = true; + o.value('ipv4', _('IPv4 only')); + o.value('ipv6', _('IPv6 only')); + o.value('', _('automatic')); // infer from zone or used IP addresses + o.cfgvalue = function(section_id) { + var val = this.map.data.get(this.map.config, section_id, 'family'); + + if (!val || val == 'any' || val == 'all' || val == '*') + return ''; + else if (val == 'inet' || String(val).indexOf('4') != -1) + return 'ipv4'; + else if (String(val).indexOf('6') != -1) + return 'ipv6'; + }; + o.validate = function(section_id, value) { + fwtool.updateHostHints(this.map, section_id, 'dest_ip', value, hosts); + return !fw4?true:validate_opt_family(this, section_id, 'family'); + }; + } + o = s.option(form.DummyValue, '_match', _('Match')); o.modalonly = false; o.textvalue = function(s) { @@ -194,15 +240,23 @@ return view.extend({ o.nocreate = true; o.default = 'wan'; + o = s.taboption('advanced', form.Value, 'ipset', _('Use ipset')); + uci.sections('firewall', 'ipset', function(s) { + if (typeof(s.name) == 'string') + o.value(s.name, s.comment ? '%s (%s)'.format(s.name, s.comment) : s.name); + }); + o.modalonly = true; + o.rmempty = true; + o = fwtool.addMACOption(s, 'advanced', 'src_mac', _('Source MAC address'), _('Only match incoming traffic from these MACs.'), hosts); o.rmempty = true; o.datatype = 'list(neg(macaddr))'; o = fwtool.addIPOption(s, 'advanced', 'src_ip', _('Source IP address'), - _('Only match incoming traffic from this IP or range.'), 'ipv4', hosts); + _('Only match incoming traffic from this IP or range.'), !fw4?'ipv4':'', hosts); o.rmempty = true; - o.datatype = 'neg(ipmask4("true"))'; + o.datatype = !fw4?'neg(ipmask4("true"))':'neg(ipmask("true"))'; o = s.taboption('advanced', form.Value, 'src_port', _('Source port'), _('Only match incoming traffic originating from the given source port or port range on the client host')); @@ -215,7 +269,7 @@ return view.extend({ o = fwtool.addLocalIPOption(s, 'advanced', 'src_dip', _('External IP address'), _('Only match incoming traffic directed at the given IP address.'), devs); - o.datatype = 'neg(ipmask4("true"))'; + o.datatype = !fw4?'neg(ipmask4("true"))':'neg(ipmask("true"))'; o.rmempty = true; o = s.taboption('general', form.Value, 'src_dport', _('External port'), @@ -232,9 +286,9 @@ return view.extend({ o.nocreate = true; o = fwtool.addIPOption(s, 'general', 'dest_ip', _('Internal IP address'), - _('Redirect matched incoming traffic to the specified internal host'), 'ipv4', hosts); + _('Redirect matched incoming traffic to the specified internal host'), !fw4?'ipv4':'', hosts); o.rmempty = true; - o.datatype = 'ipmask4'; + o.datatype = !fw4?'ipmask4':'ipmask'; o = s.taboption('general', form.Value, 'dest_port', _('Internal port'), _('Redirect matched incoming traffic to the given port on the internal host')); @@ -259,6 +313,12 @@ return view.extend({ uci.set('firewall', section_id, 'reflection_src', (value != 'internal') ? value : null); }; + o = s.taboption('advanced', widgets.ZoneSelect, 'reflection_zone', _('Reflection zones'), _('Zones from which reflection rules shall be created. If unset, only the destination zone is used.')); + o.nocreate = true; + o.multiple = true; + o.modalonly = true; + o.depends('reflection', '1'); + o = s.taboption('advanced', form.Value, 'helper', _('Match helper'), _('Match traffic using the specified connection tracking helper.')); o.modalonly = true; o.placeholder = _('any'); diff --git a/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js new file mode 100644 index 0000000000..40d47cb2e4 --- /dev/null +++ b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js @@ -0,0 +1,218 @@ +'use strict'; +'require view'; +'require uci'; +'require form'; +'require firewall'; +'require tools.firewall as fwtool'; + + +return view.extend({ + + load: function() { + return Promise.all([ + uci.load('firewall') + ]); + }, + + render: function(data) { + var m, s, o; + + m = new form.Map('firewall', _('Firewall - IP sets'), + _('firewall4 supports referencing and creating IP sets to simplify matching of large address lists without the need to create one rule per item to match. Port ranges in ipsets are unsupported by firewall4.
    ')); + + var have_fw4 = L.hasSystemFeature('firewall4'); + + if (have_fw4) { + s = m.section(form.NamedSection, 'fwver', 'fwver', '', _('Your device runs firewall4.')); + } else { + s = m.section(form.NamedSection, 'fwver', 'fwver', '', _('Your device does not run firewall4.')); + } + + + s = m.section(form.GridSection, 'ipset', _('IP Sets')); + s.addremove = true; + s.anonymous = true; + s.sortable = true; + s.nodescriptions = true; + + + /* refer to: https://ipset.netfilter.org/ipset.man.html */ + if (have_fw4) { + o = s.option(form.Value, 'name', _('Name')); + o.optional = false; + o.rmempty = false; + o.validate = function (section_id, value) { + if (!/^[a-zA-Z_.][a-zA-Z0-9\/_.-]*$/.test(value)) + return _('Invalid set name'); + + return true; + }; + } else { + o = s.option(form.Value, 'name', _('Name')); + o.depends({ external: '' }); + /* Default: (none) if external is unset + value of external if external is set */ + } + o.placeholder = _('Unnamed set'); + + + /* comment requires https://git.openwrt.org/?p=project/firewall4.git;a=commitdiff;h=39e8c70957c795bf0c12f04299170ae86c6efdf8 */ + o = s.option(form.Value, 'comment', _('Comment')); + o.placeholder = _('Comment'); + o.modalonly = true; + o.rmempty = true; + + + o = s.option(form.ListValue, 'family', _('Family')); + o.value('ipv4', _('IPv4')); + o.value('ipv6', _('IPv6')); + o.default = _('ipv4'); + + + /* Direction src, dst; (Data)Types: ip, port, mac, net or set + Tuples: direction_datatype e.g. src_port, dest_net */ + o = s.option(form.DynamicList, 'match', _('Packet Field Match'), + _('Packet fields to match upon.
    ' + + 'Syntax: direction_datatype. e.g.: src_port, dest_net.
    ' + + 'Directions: src, dst. Datatypes: ip, port, mac, net, set.
    ' + + 'Direction prefixes are optional.
    ' + + '*Note: datatype set is unsupported in fw4.')); + o.value('ip', _('ip: IP addr')); + o.value('port', _('port: Port')); + o.value('mac', _('mac: MAC addr')); + o.value('net', _('net: (sub)net')); + if (!have_fw4) + o.value('set', _('set: ipset*')); + o.value('src_ip', _('src_ip: Source IP')); + o.value('src_port', _('src_port: Source Port')); + o.value('src_mac', _('src_mac: Source MAC addr')); + o.value('src_net', _('src_net: Source (sub)net')); + if (!have_fw4) + o.value('src_set', _('src_Set: Source ipset*')); // fw4 unsupported + o.value('dest_ip', _('dest_ip: Destination IP')); + o.value('dest_port', _('dest_port: Destination Port')); + o.value('dest_mac', _('dest_mac: Destination MAC addr')); + o.value('dest_net', _('dest_net: Destination (sub)net')); + if (!have_fw4) + o.value('dest_set', _('dest_set: Destination ipset*')); // fw4 unsupported + o.optional = false; + o.rmempty = false; + + + // TODO: if/when firewall5 arrives, this 'else' check must change. + if (have_fw4) { + + //we have fw4 + o = s.option(form.DynamicList, 'entry', _('IPs/Networks/MACs'), + _('macaddr|ip[/cidr]
    ')); + o.datatype = 'or(ipaddr,macaddr)'; + o.rmempty = true; + + + o = s.option(form.Value, 'maxelem', _('Max Entries'), + _('up to 65536 entries.')); + o.datatype = 'port'; //covers 16 bit size + o.modalonly = true; + o.rmempty = true; + + } else { + // this else section is intended to handle firewall3 + + o = s.option(form.Value, 'external', _('Refer To External Set')); + /* Todo: loop to fill o.values with all other ipset names except itself */ + o.rmempty = true; + o.optional = true; + + + /* 'storage' depends on fw3. It must be removed for fw4 */ + //aka 'method' in netfilter terminology. + o = s.option(form.ListValue, 'storage', _('Storage Method')); + o.value('bitmap', _('bitmap')); //ipv4 only + o.value('hash', _('hash')); + o.value('list', _('list')); + o.validate = function(section_id, value) { + var family = this.section.formvalue(section_id, 'family'); + if (value.match(/bitmap/) && !family.match(/ipv4/)) + return _('bitmap is ipv4 only'); + return true; + } + + /* this iprange differs from netfilters range fromip-toip|ip/cidr: + uci enforces a datatype = cidr in order to be able to enter + an IP for all storage/data types. */ + o = s.option(form.Value, 'iprange', _('IP (range)'), + _('ip[/cidr]
    '+ + 'For use with Match datatypes: *_ip.')); + o.datatype = 'ipaddr'; + o.depends({family: 'ipv4', storage: 'bitmap', match: /_ip|_mac/ }); + o.depends({storage: 'hash', match: /_ip/ }); + + + o = s.option(form.DynamicList, 'entry', _('IPs/Networks'), + _('ip[/cidr]
    ')); + o.datatype = 'or(ipaddr,macaddr)'; + o.depends({storage: 'hash', match: /_ip|_net|_mac/ }); + + + o = s.option(form.Value, 'portrange', _('Port range'), + _('fromport-toport')); + o.datatype = 'neg(portrange)'; + o.depends({family: 'ipv4', storage: 'bitmap', match: /_port/ }); + o.depends({family: 'ipv4', storage: 'hash', match: /_port/ }); + o.depends({family: 'ipv6', storage: 'hash', match: /_port/ }); + + + o = s.option(form.Value, 'netmask', _('Netmask')); + o.datatype = 'or(ip4prefix,ip6prefix)'; + o.depends({family: 'ipv4', storage: 'bitmap', match: /_ip/ }); + o.depends({storage: 'hash', match: /_ip/}); + + + o = s.option(form.Value, 'maxelem', _('Max Length'), + _('up to 65536 entries.')); + o.datatype = 'port'; //covers 16 bit size + o.depends('storage', 'hash'); + o.depends('storage', 'list'); + o.modalonly = true; + + + o = s.option(form.Value, 'hashsize', _('Initial Hash Size')); + o.depends('storage', 'hash'); + o.placeholder = _('1024'); + o.modalonly = true; + + } + + o = s.option(form.FileUpload, 'loadfile', _('Include File'), + _('Path to file of CIDRs, subnets, host IPs, etc.
    ')); + o.root_directory = '/etc/luci-uploads'; + o.enable_delete = true; + o.enable_upload = true; + o.datatype = 'file'; + o.rmempty = true; + + + o = s.option(form.Value, 'timeout', _('Timeout'), + _('Unit: seconds. Default 0 means the entry is added permanently to the set.
    ' + + 'Max: 2147483 seconds.')); + o.placeholder = _('0'); + o.modalonly = true; + o.rmempty = true; + + + o = s.option(form.Flag, 'counters', _('Counters'), + _('Enables packet and byte count tracking for the set.')); + o.modalonly = true; + o.rmempty = true; + o.default = false; + + + o = s.option(form.Flag, 'enabled', _('Enabled')); + o.default = true; + o.editable = true; + o.modalonly = false; + + + return m.render(); + } +}); diff --git a/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js index c579c4aab1..156992caf0 100644 --- a/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js +++ b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js @@ -22,7 +22,7 @@ function rule_proto_txt(s, ctHelpers) { }; }); - m = String(uci.get('firewall', s, 'helper') || '').match(/^(!\s*)?(\S+)$/); + var m = String(uci.get('firewall', s, 'helper') || '').match(/^(!\s*)?(\S+)$/); var h = m ? { val: m[0].toUpperCase(), inv: m[1], @@ -294,30 +294,49 @@ return view.extend({ o.multiple = true; o.custom = true; o.cast = 'table'; - o.placeholder = _('any'); - o.value('', 'any'); + o.placeholder = _('any/all'); o.value('address-mask-reply'); o.value('address-mask-request'); - o.value('address-unreachable'); /* ipv6 */ - o.value('bad-header'); /* ipv6 */ + o.value('address-unreachable'); /* icmpv6 1:3 */ + o.value('bad-header'); /* icmpv6 4:0 */ + o.value('certification-path-solicitation-message'); /* icmpv6 148 */ + o.value('certification-path-advertisement-message'); /* icmpv6 149 */ o.value('communication-prohibited'); o.value('destination-unreachable'); + o.value('duplicate-address-request'); /* icmpv6 157 */ + o.value('duplicate-address-confirmation'); /* icmpv6 158 */ o.value('echo-reply'); o.value('echo-request'); + o.value('extended-echo-request'); /* icmpv6 160 */ + o.value('extended-echo-reply'); /* icmpv6 161 */ + o.value('fmipv6-message'); /* icmpv6 154 */ o.value('fragmentation-needed'); + o.value('home-agent-address-discovery-reply-message'); /* icmpv6 145 */ + o.value('home-agent-address-discovery-request-message'); /* icmpv6 144 */ o.value('host-precedence-violation'); o.value('host-prohibited'); o.value('host-redirect'); o.value('host-unknown'); o.value('host-unreachable'); + o.value('ilnpv6-locator-update-message'); /* icmpv6 156 */ + o.value('inverse-neighbour-discovery-advertisement-message'); /* icmpv6 142 */ + o.value('inverse-neighbour-discovery-solicitation-message'); /* icmpv6 141 */ o.value('ip-header-bad'); + o.value('mobile-prefix-advertisement'); /* icmpv6 147 */ + o.value('mobile-prefix-solicitation'); /* icmpv6 146 */ + o.value('mpl-control-message'); /* icmpv6 159 */ + o.value('multicast-router-advertisement'); /* icmpv6 151 */ + o.value('multicast-router-solicitation'); /* icmpv6 152 */ + o.value('multicast-router-termination'); /* icmpv6 153 */ o.value('neighbour-advertisement'); o.value('neighbour-solicitation'); o.value('network-prohibited'); o.value('network-redirect'); o.value('network-unknown'); o.value('network-unreachable'); - o.value('no-route'); /* ipv6 */ + o.value('no-route'); /* icmpv6 1:0 */ + o.value('node-info-query'); /* icmpv6 139 */ + o.value('node-info-response'); /* icmpv6 140 */ o.value('packet-too-big'); o.value('parameter-problem'); o.value('port-unreachable'); @@ -326,7 +345,9 @@ return view.extend({ o.value('redirect'); o.value('required-option-missing'); o.value('router-advertisement'); + o.value('router-renumbering'); /* icmpv6 138 */ o.value('router-solicitation'); + o.value('rpl-control-message'); /* icmpv6 155 */ o.value('source-quench'); o.value('source-route-failed'); o.value('time-exceeded'); @@ -338,8 +359,9 @@ return view.extend({ o.value('TOS-network-unreachable'); o.value('ttl-zero-during-reassembly'); o.value('ttl-zero-during-transit'); - o.value('unknown-header-type'); /* ipv6 */ - o.value('unknown-option'); /* ipv6 */ + o.value('v2-multicast-listener-report'); /* icmpv6 143 */ + o.value('unknown-header-type'); /* icmpv6 4:1 */ + o.value('unknown-option'); /* icmpv6 4:2 */ o.depends({ proto: 'icmp', '!contains': true }); o.depends({ proto: 'icmpv6', '!contains': true }); @@ -349,6 +371,14 @@ return view.extend({ o.allowany = true; o.allowlocal = 'src'; + o = s.taboption('advanced', form.Value, 'ipset', _('Use ipset')); + uci.sections('firewall', 'ipset', function(s) { + if (typeof(s.name) == 'string') + o.value(s.name, s.comment ? '%s (%s)'.format(s.name, s.comment) : s.name); + }); + o.modalonly = true; + o.rmempty = true; + fwtool.addMACOption(s, 'advanced', 'src_mac', _('Source MAC address'), null, hosts); fwtool.addIPOption(s, 'general', 'src_ip', _('Source address'), null, '', hosts, true); diff --git a/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js index e8c90a7574..3c1bbaaa2a 100644 --- a/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js +++ b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js @@ -9,6 +9,10 @@ 'require tools.widgets as widgets'; function rule_proto_txt(s) { + var family = (uci.get('firewall', s, 'family') || '').toLowerCase().replace(/^(?:any|\*)$/, ''); + var sip = uci.get('firewall', s, 'src_ip') || ''; + var dip = uci.get('firewall', s, 'dest_ip') || ''; + var rwip = uci.get('firewall', s, 'snat_ip') || ''; var proto = L.toArray(uci.get('firewall', s, 'proto')).filter(function(p) { return (p != '*' && p != 'any' && p != 'all'); }).map(function(p) { @@ -19,7 +23,7 @@ function rule_proto_txt(s) { }; }); - m = String(uci.get('firewall', s, 'mark')).match(/^(!\s*)?(0x[0-9a-f]{1,8}|[0-9]{1,10})(?:\/(0x[0-9a-f]{1,8}|[0-9]{1,10}))?$/i); + var m = String(uci.get('firewall', s, 'mark')).match(/^(!\s*)?(0x[0-9a-f]{1,8}|[0-9]{1,10})(?:\/(0x[0-9a-f]{1,8}|[0-9]{1,10}))?$/i); var f = m ? { val: m[0].toUpperCase().replace(/X/g, 'x'), inv: m[1], @@ -27,7 +31,9 @@ function rule_proto_txt(s) { mask: m[3] ? '0x%02X'.format(+m[3]) : null } : null; - return fwtool.fmt(_('Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}}'), { + return fwtool.fmt(_('Forwarded %{ipv6?%{ipv4?IPv4 and IPv6:IPv6}:IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}}'), { + ipv4: (family == 'ipv4' || (!family && sip.indexOf(':') == -1 && dip.indexOf(':') == -1 && rwip.indexOf(':') == -1)), + ipv6: (family == 'ipv6' || (!family && (!sip || !dip || !rwip)) || (!family && (sip.indexOf(':') != -1 || dip.indexOf(':') != -1 || rwip.indexOf(':') != -1))), proto: proto, mark: f }); @@ -91,6 +97,44 @@ function rule_target_txt(s) { } } +function validate_opt_family(m, section_id, opt) { + var sopt = m.section.getOption('src_ip'), + dopt = m.section.getOption('dest_ip'), + rwopt = m.section.getOption('snat_ip'), + fmopt = m.section.getOption('family'), + tgopt = m.section.getOption('target'); + + if (!sopt.isValid(section_id) && opt != 'src_ip') + return true; + if (!dopt.isValid(section_id) && opt != 'dest_ip') + return true; + if (!rwopt.isValid(section_id) && opt != 'snat_ip') + return true; + if (!fmopt.isValid(section_id) && opt != 'family') + return true; + if (!tgopt.isValid(section_id) && opt != 'target') + return true; + + var sip = sopt.formvalue(section_id) || '', + dip = dopt.formvalue(section_id) || '', + rwip = rwopt.formvalue(section_id) || '', + fm = fmopt.formvalue(section_id) || '', + tg = tgopt.formvalue(section_id); + + if (fm == 'ipv6' && (sip.indexOf(':') != -1 || sip == '') && (dip.indexOf(':') != -1 || dip == '') && ((rwip.indexOf(':') != -1 && tg == 'SNAT') || rwip == '')) + return true; + if (fm == 'ipv4' && (sip.indexOf(':') == -1) && (dip.indexOf(':') == -1) && ((rwip.indexOf(':') == -1 && tg == 'SNAT') || rwip == '')) + return true; + if (fm == '') { + if ((sip.indexOf(':') != -1 || sip == '') && (dip.indexOf(':') != -1 || dip == '') && ((rwip.indexOf(':') != -1 && tg == 'SNAT') || rwip == '')) + return true; + if ((sip.indexOf(':') == -1) && (dip.indexOf(':') == -1) && ((rwip.indexOf(':') == -1 && tg == 'SNAT') || rwip == '')) + return true; + } + + return _('Address family, source address, destination address, rewrite IP address must match'); +} + return view.extend({ callHostHints: rpc.declare({ object: 'luci-rpc', @@ -123,6 +167,7 @@ return view.extend({ var hosts = data[0], devs = data[1], m, s, o; + var fw4 = L.hasSystemFeature('firewall4'); m = new form.Map('firewall', _('Firewall - NAT Rules'), _('NAT rules allow fine grained control over the source IP to use for outbound or forwarded traffic.')); @@ -166,6 +211,30 @@ return view.extend({ o.default = o.enabled; o.editable = true; + if (fw4) { + o = s.taboption('general', form.ListValue, 'family', _('Restrict to address family')); + o.modalonly = true; + o.rmempty = true; + o.value('ipv4', _('IPv4 only')); + o.value('ipv6', _('IPv6 only')); + o.value('', _('automatic')); // infer from zone or used IP addresses + o.cfgvalue = function(section_id) { + var val = this.map.data.get(this.map.config, section_id, 'family'); + + if (!val || val == 'any' || val == 'all' || val == '*') + return ''; + else if (val == 'inet' || String(val).indexOf('4') != -1) + return 'ipv4'; + else if (String(val).indexOf('6') != -1) + return 'ipv6'; + }; + o.validate = function(section_id, value) { + fwtool.updateHostHints(this.map, section_id, 'src_ip', value, hosts); + fwtool.updateHostHints(this.map, section_id, 'dest_ip', value, hosts); + return !fw4?true:validate_opt_family(this, section_id, 'family'); + }; + } + o = s.taboption('general', fwtool.CBIProtocolSelect, 'proto', _('Protocol')); o.modalonly = true; o.default = 'all'; @@ -178,9 +247,12 @@ return view.extend({ o.default = 'lan'; o = fwtool.addIPOption(s, 'general', 'src_ip', _('Source address'), - _('Match forwarded traffic from this IP or range.'), 'ipv4', hosts); + _('Match forwarded traffic from this IP or range.'), !fw4?'ipv4':'', hosts); o.rmempty = true; - o.datatype = 'neg(ipmask4("true"))'; + o.datatype = !fw4?'neg(ipmask4("true"))':'neg(ipmask("true"))'; + o.validate = function(section_id, value) { + return !fw4?true:validate_opt_family(this, section_id, 'src_ip'); + }; o = s.taboption('general', form.Value, 'src_port', _('Source port'), _('Match forwarded traffic originating from the given source port or port range.')); @@ -192,9 +264,12 @@ return view.extend({ o.depends({ proto: 'udp', '!contains': true }); o = fwtool.addIPOption(s, 'general', 'dest_ip', _('Destination address'), - _('Match forwarded traffic directed at the given IP address.'), 'ipv4', hosts); + _('Match forwarded traffic directed at the given IP address.'), !fw4?'ipv4':'', hosts); o.rmempty = true; - o.datatype = 'neg(ipmask4("true"))'; + o.datatype = !fw4?'neg(ipmask4("true"))':'neg(ipmask("true"))'; + o.validate = function(section_id, value) { + return !fw4?true:validate_opt_family(this, section_id, 'dest_ip'); + }; o = s.taboption('general', form.Value, 'dest_port', _('Destination port'), _('Match forwarded traffic directed at the given destination port or port range.')); @@ -211,6 +286,9 @@ return view.extend({ o.value('SNAT', _('SNAT - Rewrite to specific source IP or port')); o.value('MASQUERADE', _('MASQUERADE - Automatically rewrite to outbound interface IP')); o.value('ACCEPT', _('ACCEPT - Disable address rewriting')); + o.validate = function(section_id, value) { + return !fw4?true:validate_opt_family(this, section_id, 'target'); + }; o = fwtool.addLocalIPOption(s, 'general', 'snat_ip', _('Rewrite IP address'), _('Rewrite matched traffic to the specified source IP address.'), devs); @@ -223,7 +301,7 @@ return view.extend({ if ((a == null || a == '') && (p == null || p == '') && value == '') return _('A rewrite IP must be specified!'); - return true; + return !fw4?true:validate_opt_family(this, section_id, 'snat_ip'); }; o = s.taboption('general', form.Value, 'snat_port', _('Rewrite port'), @@ -235,6 +313,17 @@ return view.extend({ o.depends({ proto: 'tcp', '!contains': true }); o.depends({ proto: 'udp', '!contains': true }); + var have_fw4 = L.hasSystemFeature('firewall4') + if (!have_fw4) { + o = s.taboption('advanced', form.Value, 'ipset', _('Use ipset')); + uci.sections('firewall', 'ipset', function(s) { + if (typeof(s.name) == 'string') + o.value(s.name, s.comment ? '%s (%s)'.format(s.name, s.comment) : s.name); + }); + o.modalonly = true; + o.rmempty = true; + } + o = s.taboption('advanced', widgets.DeviceSelect, 'device', _('Outbound device'), _('Matches forwarded traffic using the specified outbound network device.')); o.noaliases = true; @@ -245,7 +334,7 @@ return view.extend({ fwtool.addLimitOption(s); fwtool.addLimitBurstOption(s); - if (!L.hasSystemFeature('firewall4')) { + if (!have_fw4) { o = s.taboption('advanced', form.Value, 'extra', _('Extra arguments'), _('Passes additional arguments to iptables. Use with care!')); o.modalonly = true; diff --git a/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js index 58cd2a7c1e..1de98c2045 100644 --- a/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js +++ b/package/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js @@ -33,6 +33,7 @@ return view.extend({ var ctHelpers = data[0], fwDefaults = data[1], m, s, o, inp, out; + var fw4 = L.hasSystemFeature('firewall4'); m = new form.Map('firewall', _('Firewall - Zone Settings'), _('The firewall creates zones over your network interfaces to control network traffic flow.')); @@ -85,7 +86,7 @@ return view.extend({ o = s.option(form.Flag, 'flow_offloading_hw', _('Hardware flow offloading'), - _('Requires hardware NAT support. Implemented at least for mt7621')); + _('Requires hardware NAT support.')); o.optional = true; o.depends('flow_offloading', '1'); } @@ -95,6 +96,7 @@ return view.extend({ s.addremove = true; s.anonymous = true; s.sortable = true; + s.nodescriptions = true; s.handleRemove = function(section_id, ev) { return firewall.deleteZone(section_id).then(L.bind(function() { @@ -156,12 +158,14 @@ return view.extend({ p[1].default = fwDefaults.getOutput(); p[2].default = fwDefaults.getForward(); - o = s.taboption('general', form.Flag, 'masq', _('Masquerading')); + o = s.taboption('general', form.Flag, 'masq', _('Masquerading'), + _('Enable network address and port translation IPv4 (NAT4 or NAPT4) for outbound traffic on this zone. This is typically enabled on the wan zone.')); o.editable = true; o.tooltip = function(section_id) { + var family = uci.get('firewall', section_id, 'family') var masq_src = uci.get('firewall', section_id, 'masq_src') var masq_dest = uci.get('firewall', section_id, 'masq_dest') - if (masq_src || masq_dest) + if ((!family || family.indexOf('6') == -1) && (masq_src || masq_dest)) return _('Limited masquerading enabled'); return null; @@ -228,6 +232,20 @@ return view.extend({ o.modalonly = true; o.multiple = true; + if (fw4) { + o = s.taboption('advanced', form.Flag, 'masq6', _('IPv6 Masquerading'), + _('Enable network address and port translation IPv6 (NAT6 or NAPT6) for outbound traffic on this zone.')); + o.modalonly = true; + o.tooltip = function(section_id) { + var family = uci.get('firewall', section_id, 'family') + var masq_src = uci.get('firewall', section_id, 'masq_src') + var masq_dest = uci.get('firewall', section_id, 'masq_dest') + if ((!family || family.indexOf('6') >= 0) && (masq_src || masq_dest)) + return _('Limited masquerading enabled'); + return null; + }; + } + o = s.taboption('advanced', form.ListValue, 'family', _('Restrict to address family')); o.value('', _('IPv4 and IPv6')); o.value('ipv4', _('IPv4 only')); @@ -235,16 +253,24 @@ return view.extend({ o.modalonly = true; o = s.taboption('advanced', form.DynamicList, 'masq_src', _('Restrict Masquerading to given source subnets')); - o.depends('family', ''); - o.depends('family', 'ipv4'); - o.datatype = 'list(neg(or(uciname,hostname,ipmask4)))'; + if (fw4) { + o.datatype = 'list(neg(or(uciname,hostname,ipmask)))'; + } else { + o.depends('family', ''); + o.depends('family', 'ipv4'); + o.datatype = 'list(neg(or(uciname,hostname,ipmask4)))'; + } o.placeholder = '0.0.0.0/0'; o.modalonly = true; o = s.taboption('advanced', form.DynamicList, 'masq_dest', _('Restrict Masquerading to given destination subnets')); - o.depends('family', ''); - o.depends('family', 'ipv4'); - o.datatype = 'list(neg(or(uciname,hostname,ipmask4)))'; + if (fw4) { + o.datatype = 'list(neg(or(uciname,hostname,ipmask)))'; + } else { + o.depends('family', ''); + o.depends('family', 'ipv4'); + o.datatype = 'list(neg(or(uciname,hostname,ipmask4)))'; + } o.placeholder = '0.0.0.0/0'; o.modalonly = true; diff --git a/package/luci/applications/luci-app-firewall/po/ar/firewall.po b/package/luci/applications/luci-app-firewall/po/ar/firewall.po index 583fa86d06..b2d16bb016 100644 --- a/package/luci/applications/luci-app-firewall/po/ar/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/ar/firewall.po @@ -3,9 +3,9 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2021-03-07 14:36+0000\n" -"Last-Translator: Said Zakaria \n" -"Language-Team: Arabic \n" +"Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" @@ -13,7 +13,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.5.1\n" +"X-Generator: Weblate 5.0.2\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -36,21 +36,29 @@ msgstr "" msgid "-- add IP --" msgstr "- إضافة IP -" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "- اضافة MAC -" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" "‍‎Accept %{src?%{dest?forward:input}:output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "‏< ‏‏var/>‏ منع إعادة كتابة المصدر " -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -85,10 +93,10 @@ msgid "" "%{set_mark?Assign:XOR} firewall mark " "%{set_mark?:%{set_xmark}}" msgstr "" -"علامة جدار الحماية %{set_mark?Assign:XOR} " +"علامة جدار الحماية %{set_mark?Assign:XOR} " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "‎Automatically rewrite source IP" @@ -106,7 +114,7 @@ msgid "" msgstr "" "‎Reject %{src?%{dest?forward:input}:output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -114,23 +122,23 @@ msgstr "" "‎Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "يجب تحديد إعادة كتابة IP!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "قبول - تعطيل إعادة كتابة العنوان" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "إجراء" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -140,7 +148,7 @@ msgstr "" "سبيل المثال -p tcp --dport 443 لمطابقة حركة مرور HTTPS " "الصادرة فقط." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -149,33 +157,43 @@ msgstr "" "سبيل المثال -p tcp --sport 443 لمطابقة حركة مرور HTTPS " "الواردة فقط." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "إعدادات متقدمة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "السماح بحركة المرور \"الغير الصالحة\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "السماح بإعادة التوجيه من مناطق المصدر :" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "السماح بإعادة التوجيه إلى مناطق الوجهة :" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "أي" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "اي يوم" @@ -193,24 +211,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "قم بتطبيق فئة أو قيمة DSCP المحددة على الاتصالات القائمة." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "قم بتعيين مساعد تتبع الاتصال المحدد لحركة المرور المتطابقة." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "تعيين المساعد التلقائي" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "قم بتعيين مساعدي conntrack تلقائيًا بناءً على بروتوكول المرور والبوابة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "إعدادات Conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "مساعدين كونتراك" @@ -218,23 +241,27 @@ msgstr "مساعدين كونتراك" msgid "Contents have been saved." msgstr "تم حفظ المحتويات." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "يكمل" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "الأجهزة المغطاة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "الشبكات المغطاة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "الشبكات الفرعية المغطاة" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "القواعد المخصصة" @@ -248,7 +275,7 @@ msgstr "" "عمل جدار الحماية. يتم تنفيذ الأوامر بعد كل إعادة تشغيل لجدار الحماية ، " "مباشرة بعد تحميل مجموعة القواعد الافتراضية." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "تصنيف DSCP" @@ -260,17 +287,17 @@ msgstr "علامة DSCP" msgid "DSCP mark required" msgstr "علامة DSCP مطلوبة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "عنوان الوجهة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "بوابة الوجهة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "منطقة الوجهة" @@ -278,7 +305,7 @@ msgstr "منطقة الوجهة" msgid "Device name" msgstr "اسم الجهاز" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -287,66 +314,91 @@ msgstr "" " غير صالحة . قد يكون هذا مطلوبًا لإعدادات المسار غير المتماثلة " "المعقدة." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "قم بإسقاط الحزم غير الصالحة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "شغل" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "تفعيل NAT Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "تفعيل الحماية من الفيضانات SYN" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "قم بتمكين تسجيل الدخول إلى هذه المنطقة" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "توقع: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "ميزة تجريبية. غير متوافق تمامًا مع QoS / SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "يختار صراحة مساعدي تتبع الاتصال المسموح به لحركة مرور المنطقة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "عنوان IP خارجي" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "منفذ خارجي" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "حجج اضافية" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "وسيطات الوجهة الإضافية" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "حجج iptables الإضافية" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "حجج مصدر إضافي" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "جدار الحماية" @@ -355,11 +407,15 @@ msgstr "جدار الحماية" msgid "Firewall - Custom Rules" msgstr "جدار الحماية - القواعد المخصصة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "جدار الحماية - قواعد NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "جدار الحماية - منفذ إلى الأمام" @@ -367,39 +423,35 @@ msgstr "جدار الحماية - منفذ إلى الأمام" msgid "Firewall - Traffic Rules" msgstr "جدار الحماية - قواعد المرور" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "جدار الحماية - إعدادات المنطقة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "ترحيل تكوين جدار الحماية" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "إلى الأمام" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" -"}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "الجمعة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 #, fuzzy msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " @@ -435,7 +487,7 @@ msgstr "" "name}}.\":%{item.hint.name? data-tooltip=\"%{item.hint.name}\"}}>%{item.ival}" "}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 #, fuzzy msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "الاعدادات العامة" @@ -467,22 +519,55 @@ msgstr "الاعدادات العامة" msgid "Grant access to firewall configuration" msgstr "منح الوصول إلى تكوين جدار الحماية" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "تفريغ تدفق الأجهزة" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 و IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "IPv4 فقط" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "IPv6 فقط" @@ -490,10 +575,14 @@ msgstr "IPv6 فقط" msgid "Inbound device" msgstr "جهاز وارد" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 -#, fuzzy +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " -"with types %{item.types#%{next?, }%{item}}:" -"%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "إدخال" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "عنوان IP الداخلي" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "منفذ داخلي" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "المنطقة الداخلية" @@ -538,11 +622,15 @@ msgstr "علامة DSCP غير صالحة" msgid "Invalid limit value" msgstr "قيمة حد غير صالحة" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "حد الطلقات" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "تقييد رسائل السجل" @@ -550,9 +638,9 @@ msgstr "تقييد رسائل السجل" msgid "Limit matching" msgstr "حد المطابقة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -560,7 +648,8 @@ msgstr "" "مطابقة محدودة ل ٪ {limit.num} حزم لكل ٪ {limit.unit} ٪ {limit.burst؟ انفجار ٪ {limit.burst} }" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "تمكين التنكر المحدود" @@ -568,25 +657,25 @@ msgstr "تمكين التنكر المحدود" msgid "Limits traffic matching to the specified rate." msgstr "يحد من مطابقة حركة المرور إلى المعدل المحدد." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "IP مصدر الاسترجاع" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASQUERADE - إعادة الكتابة تلقائيًا إلى عنوان IP للواجهة الصادرة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "لقط MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "تنكر" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "تطابق" @@ -602,33 +691,33 @@ msgstr "تطابق نوع ICMP" msgid "Match device" msgstr "تطابق الأجهزة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "تطابق حركة المرور المعاد توجيهها إلى عنوان IP المحدد." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "تطابق حركة المرور المعاد توجيهها إلى منفذ الوجهة المحدد أو نطاق المنفذ." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "تطابق حركة المرور المعاد توجيهها من هذا IP أو النطاق." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "تطابق حركة المرور المعاد توجيهها الناشئة من منفذ المصدر المحدد أو نطاق " "المنفذ." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "مساعد المطابقة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -640,8 +729,8 @@ msgstr "" msgid "Match mark" msgstr "علامة المطابقة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "تطابق حركة المرور باستخدام مساعد تتبع الاتصال المحدد." @@ -649,7 +738,7 @@ msgstr "تطابق حركة المرور باستخدام مساعد تتبع ا msgid "Matches a specific firewall mark or a range of different marks." msgstr "يتطابق مع علامة جدار حماية معينة أو نطاق من العلامات المختلفة." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "يطابق حركة المرور المعاد توجيهها باستخدام جهاز الشبكة الصادرة المحدد." @@ -657,6 +746,14 @@ msgstr "يطابق حركة المرور المعاد توجيهها باستخ msgid "Matches traffic carrying the specified DSCP marking." msgstr "يطابق حركة المرور التي تحمل علامة DSCP المحددة." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -665,22 +762,22 @@ msgstr "" "الحد الأقصى لعدد الحزم التي يجب مطابقتها: يتم إعادة شحن هذا الرقم بواحدة في " "كل مرة لا يتم فيها الوصول إلى الحد المحدد أعلاه ، حتى هذا الرقم." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "الإثنين" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "أيام الشهر" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "قواعد NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -688,26 +785,32 @@ msgstr "" "تسمح قواعد NAT بالتحكم الدقيق في عنوان IP المصدر لاستخدامه في حركة المرور " "الصادرة أو المُعاد توجيهها." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "اسم" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "تطابق حركة المرور الواردة الموجهة إلى عنوان IP المحدد فقط." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "تطابق فقط حركة المرور الواردة من أجهزة MAC هذه." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "تطابق فقط حركة المرور الواردة من هذا IP أو النطاق." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -716,26 +819,38 @@ msgstr "" "على مضيف العميل" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "جهاز الصادر" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "المنطقة الصادرة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "انتاج" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "يمرر الحجج الإضافية إلى iptables. استخدم بعناية!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -748,12 +863,16 @@ msgstr "" "يجب استخدام هذه الخيارات بحذر شديد نظرًا لأن القيم غير الصالحة قد تؤدي إلى " "كسر مجموعة قواعد جدار الحماية ، مما يؤدي إلى تعريض جميع الخدمات تمامًا." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "بوابة التوجيه" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -761,66 +880,80 @@ msgstr "" "يسمح إعادة توجيه المنفذ لأجهزة الكمبيوتر البعيدة على الإنترنت بالاتصال " "بكمبيوتر أو خدمة معينة داخل شبكة LAN الخاصة." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "بروتوكول" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "إعادة توجيه حركة المرور الواردة المتطابقة إلى المنفذ المحدد على المضيف " "الداخلي" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "إعادة توجيه حركة المرور الواردة المتطابقة إلى المضيف الداخلي المحدد" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "يتطلب دعم NAT للأجهزة. تم التنفيذ على الأقل ل MT7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "يتطلب دعم NAT للأجهزة." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "قصر التنكر على الشبكات الفرعية للوجهة المحددة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "قصر التنكر على الشبكات الفرعية للمصدر المحدد" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "تقييد لمعالجة الأسرة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "أعد كتابة عنوان IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "أعد كتابة حركة المرور المتطابقة إلى عنوان IP المصدر المحدد." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "أعد كتابة حركة المرور المتطابقة إلى منفذ المصدر المحدد أو نطاق المنفذ." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "أعد كتابة المنفذ" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "التوجيه / تفريغ NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - إعادة الكتابة إلى عنوان IP أو منفذ معين" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "السبت" @@ -836,36 +969,36 @@ msgstr "" "قم بتعيين قيمة العلامة المحددة على الاتصالات القائمة. التنسيق هو القيمة [/ " "القناع]. إذا تم تحديد قناع ، فسيتم تعديل وحدات البت المحددة في القناع فقط." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "برنامج التفريغ القائم على التوجيه / NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "تفريغ تدفق البرنامج" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "عنوان IP المصدر" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "عنوان MAC المصدر" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "عنوان المصدر" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "منفذ المصدر" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "منطقة المصدر" @@ -876,7 +1009,7 @@ msgid "" msgstr "" "يحدد ما إذا كان سيتم ربط قاعدة حركة المرور هذه بجهاز شبكة محدد وارد أو صادر." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -884,38 +1017,42 @@ msgstr "" "يحدد ما إذا كان سيتم استخدام عنوان IP الخارجي أو الداخلي لحركة المرور " "المنعكسة." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "تاريخ البدء (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "وقت البدء (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "تاريخ التوقف (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "وقت التوقف (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "الأحد" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "يجب تغيير تكوين جدار الحماية الحالي لكي يعمل LuCI بشكل صحيح." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -923,8 +1060,8 @@ msgstr "" "يقوم جدار الحماية بإنشاء مناطق عبر واجهات الشبكة للتحكم في تدفق حركة مرور " "الشبكة." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -941,7 +1078,7 @@ msgstr "" "الشبكة إلى الشبكة الواسعة لا يعني ضمنًا إذنًا لإعادة التوجيه من " "الشبكة إلى الشبكة الواسعة أيضًا." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -955,18 +1092,18 @@ msgstr "" "الشبكات المختلفة داخل المنطقة. تحدد الشبكات المغطاة الشبكات " "المتاحة الأعضاء في هذه المنطقة." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "الخميس" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "قيود الوقت" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "الوقت بالتوقيت العالمي المنسق" @@ -974,6 +1111,10 @@ msgstr "الوقت بالتوقيت العالمي المنسق" msgid "Time restrictions are enabled for this rule" msgstr "تم تمكين قيود الوقت لهذه القاعدة" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 #, fuzzy msgid "" @@ -989,7 +1130,7 @@ msgstr "" "%{item." "ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "مساعد التتبع" @@ -1024,8 +1165,8 @@ msgstr "" "تحدد قواعد المرور سياسات الحزم التي تنتقل بين مناطق مختلفة ، على سبيل المثال " "لرفض حركة المرور بين مضيفين معينين أو لفتح منافذ WAN على جهاز التوجيه." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "الثلاثاء" @@ -1033,18 +1174,24 @@ msgstr "الثلاثاء" msgid "Unable to save contents: %s" msgstr "تعذر حفظ المحتويات: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "مساعد conntrack غير معروف أو غير مثبت \" %s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "NAT بدون اسم" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "تقدم بدون إسم" @@ -1053,15 +1200,19 @@ msgstr "تقدم بدون إسم" msgid "Unnamed rule" msgstr "قاعدة بدون اسم" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "منطقة بدون اسم" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "بروتوكول غير معروف" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1071,15 +1222,21 @@ msgstr "" "\"SNAT\" إلى أقسام \"nat\" وسيتم إعادة تشغيل جدار الحماية لتطبيق التكوين " "المحدث." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "استخدم عنوان IP خارجي" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "استخدم عنوان IP الداخلي" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1087,7 +1244,7 @@ msgstr "" "استخدم هذا الخيار لتصنيف حركة مرور المنطقة عن طريق أجهزة الشبكة الأولية غير " " uci ." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1099,17 +1256,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "مطلوب علامة صالحة لجدار الحماية" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "الأربعاء" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "أيام الأسبوع" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "علامة جدار الحماية XOR" @@ -1117,109 +1274,234 @@ msgstr "علامة جدار الحماية XOR" msgid "XOR mark" msgstr "علامة XOR" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "المنطقة=> تَوجِيه" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "المناطق" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "قبول" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "أي" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "أي منطقة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "تطبيق علامة جدار الحماية" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "تعيين مساعد conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "يوم" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "لا تعيد الكتابة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "لا تتبع" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "إبعاد" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "ساعة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "دقيقة" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "رفض" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "ثانية" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "هذا الجهاز" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "هذه المنطقة الجديدة" @@ -1231,6 +1513,11 @@ msgstr "غير محدود" msgid "unspecified" msgstr "غير محدد" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "علامة جدار حماية صالحة" diff --git a/package/luci/applications/luci-app-firewall/po/bg/firewall.po b/package/luci/applications/luci-app-firewall/po/bg/firewall.po index 4853588d45..c1c897cbdf 100644 --- a/package/luci/applications/luci-app-firewall/po/bg/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/bg/firewall.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2010-03-30 17:00+0200\n" "PO-Revision-Date: 2021-09-28 16:34+0000\n" "Last-Translator: Iskren Mihaylov \n" -"Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" @@ -35,20 +35,28 @@ msgstr "" msgid "-- add IP --" msgstr "-- добави IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- добави MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -77,7 +85,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -92,68 +100,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Действие" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Разширени настройки" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Разрешаване на \"невалиден\" трафик" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Разрешаване на препращане от изходящи зони :" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Разрешаване на препращане към дестинационни зони :" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Всички" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Всеки ден" @@ -168,24 +186,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Настройки на Conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Помощници на Conntrack" @@ -193,23 +216,27 @@ msgstr "Помощници на Conntrack" msgid "Contents have been saved." msgstr "Съдържанието е записано." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Продължи" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Обхванати устройства" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Обхванати мрежи" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Обхванати подмрежи" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Потребителски правила" @@ -220,7 +247,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -232,17 +259,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Адрес на дестинацията" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Дестинейшън Порт" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Дестинейшън зона" @@ -250,73 +277,98 @@ msgstr "Дестинейшън зона" msgid "Device name" msgstr "Име на устройството" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Изпускане на невалидни пакети" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Разрешаване" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Разрешаване на NAT loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Активиране на SYN-flood защита" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Разрешаване на журнал в тази зона" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 #, fuzzy msgid "Expecting: %s" msgstr "Очакване: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Експериментална функция. Не е напълно съвместима с QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Външен IP адрес" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Външен порт" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Допълнителни аргументи" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Допълнителни аргументи за дестинацията" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Допълнителни аргументи на iptables" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Допълнителни аргументи за източника" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Защитна стена" @@ -325,11 +377,15 @@ msgstr "Защитна стена" msgid "Firewall - Custom Rules" msgstr "Защитна стена - Потребителски правила" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Защитна стена - NAT правила" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Защитна стена - препращане на портове" @@ -337,34 +393,35 @@ msgstr "Защитна стена - препращане на портове" msgid "Firewall - Traffic Rules" msgstr "Защитна стена - Трафик правила" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Защитна стена - Настройки на зона" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Миграция на конфигурацията на защитната стена" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Препращане" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Петък" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Основни настройки" @@ -409,22 +466,55 @@ msgstr "Основни настройки" msgid "Grant access to firewall configuration" msgstr "Предоставяне на достъп до конфигурацията на защитната стена" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Хардуерно разтоварване на потока" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 и IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Само IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Само IPv6" @@ -432,9 +522,14 @@ msgstr "Само IPv6" msgid "Inbound device" msgstr "Входящо устройство" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Вход" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Вътрешен IP адрес" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Вътрешен порт" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Вътрешна зона" @@ -470,11 +569,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Бърст лимит" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Ограничаване на съобщенията в журнала" @@ -482,15 +585,16 @@ msgstr "Ограничаване на съобщенията в журнала" msgid "Limit matching" msgstr "Ограничи съвпадащаите" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -498,25 +602,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "Ограничава съвпадащия трафик до определената скорост." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -532,30 +636,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -565,8 +669,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -574,7 +678,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -582,79 +686,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Понеделник" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -663,75 +793,93 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Протокол" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Събота" @@ -745,36 +893,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "" @@ -784,51 +932,55 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Неделя" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -838,7 +990,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -847,18 +999,18 @@ msgid "" "networks
    specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Четвъртък" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -866,6 +1018,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -875,7 +1031,7 @@ msgid "" "ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -908,8 +1064,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Вторник" @@ -917,18 +1073,24 @@ msgstr "Вторник" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -937,36 +1099,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -976,17 +1148,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Сряда" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -994,109 +1166,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1108,6 +1405,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/bn_BD/firewall.po b/package/luci/applications/luci-app-firewall/po/bn_BD/firewall.po index c3adf0bc0b..98d917868d 100644 --- a/package/luci/applications/luci-app-firewall/po/bn_BD/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/bn_BD/firewall.po @@ -6,7 +6,7 @@ msgstr "" "PO-Revision-Date: 2021-10-08 18:54+0000\n" "Last-Translator: Rayhan Nabi \n" "Language-Team: Bengali (Bangladesh) \n" +"librecmc/luciapplicationsfirewall/bn_BD/>\n" "Language: bn_BD\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -35,20 +35,28 @@ msgstr "" msgid "-- add IP --" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -77,7 +85,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -92,68 +100,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "উন্নত সেটিংস" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "" @@ -168,24 +186,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -193,23 +216,27 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "" @@ -220,7 +247,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -232,17 +259,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "" @@ -250,72 +277,97 @@ msgstr "" msgid "Device name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "সক্রিয় করুন" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "" @@ -324,11 +376,15 @@ msgstr "" msgid "Firewall - Custom Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "" @@ -336,34 +392,35 @@ msgstr "" msgid "Firewall - Traffic Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "সাধারণ সেটিংস" @@ -408,22 +465,55 @@ msgstr "সাধারণ সেটিংস" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "" @@ -431,9 +521,14 @@ msgstr "" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "" @@ -469,11 +568,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "" @@ -481,15 +584,16 @@ msgstr "" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -497,25 +601,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -531,30 +635,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -564,8 +668,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -573,7 +677,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -581,79 +685,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -662,75 +792,93 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "প্রোটোকল" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "" @@ -744,36 +892,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "" @@ -783,51 +931,55 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -837,7 +989,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -846,18 +998,18 @@ msgid "" "networks
    specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -865,6 +1017,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -874,7 +1030,7 @@ msgid "" "ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -907,8 +1063,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "" @@ -916,18 +1072,24 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -936,36 +1098,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -975,17 +1147,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -993,109 +1165,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1107,6 +1404,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/ca/firewall.po b/package/luci/applications/luci-app-firewall/po/ca/firewall.po index aa49ef1cc6..607ea949f7 100644 --- a/package/luci/applications/luci-app-firewall/po/ca/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/ca/firewall.po @@ -5,16 +5,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2021-09-17 06:52+0000\n" +"PO-Revision-Date: 2023-03-03 19:40+0000\n" "Last-Translator: Roger Pueyo Centelles \n" -"Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.16.2-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -37,20 +37,28 @@ msgstr "" msgid "-- add IP --" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -79,7 +87,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -94,68 +102,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Acció" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Configuració avançada" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Permet el reenviament des dels zones d'origen:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Permet el reenviament als zones de destí:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Qualsevol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "" @@ -170,48 +188,57 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:16 msgid "Contents have been saved." -msgstr "" +msgstr "S'han desat els continguts." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Continua" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Xarxes cobertes" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Regles personalitzades" @@ -226,7 +253,7 @@ msgstr "" "ordres s'executen després de cada reinici de tallafocs, just després el " "conjunt de regles per defecte s'ha carregat." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -238,17 +265,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Adreça de destí" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Port de destí" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Zona de destí" @@ -256,72 +283,97 @@ msgstr "Zona de destí" msgid "Device name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Descarta els paquets invàlids" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Activa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Habilita protecció contra la inundació SYN" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Habilita el registre d'aquesta zona" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Adreça IP extern" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Port extern" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Paràmetres extres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Tallafocs" @@ -330,11 +382,15 @@ msgstr "Tallafocs" msgid "Firewall - Custom Rules" msgstr "Tallafocs - Regles personalitzades" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Tallafocs - Reenviaments de port" @@ -342,34 +398,35 @@ msgstr "Tallafocs - Reenviaments de port" msgid "Firewall - Traffic Rules" msgstr "Tallafocs - Regles de tràfic" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Tallafocs - Ajusts de zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Reenvia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Divendres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Paràmetres generals" @@ -414,22 +471,55 @@ msgstr "Paràmetres generals" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 i IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Només IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Només IPv6" @@ -437,9 +527,14 @@ msgstr "Només IPv6" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Entrada" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Adreça IP interna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Port intern" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Zona interna" @@ -475,11 +574,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Limita els missatges de registre" @@ -487,15 +590,16 @@ msgstr "Limita els missatges de registre" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -503,25 +607,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "Fixació MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Mascarada" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Coincideix" @@ -537,30 +641,30 @@ msgstr "Coincideix amb el tipus ICMP" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -572,8 +676,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -581,7 +685,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -589,53 +693,67 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Dilluns" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Nom" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Només coincideix amb trànsit entrant dirigit a la adreça IP donada." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Només coincideix amb trànsit entrant des d'aquests MAC." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Només coincideix amb trànsit entrant des d'aquest IP o rang." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -644,26 +762,38 @@ msgstr "" "rang de ports d'origen donat" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Sortida" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "Passa paràmetres addicionals al iptables. Utilitzeu-ho amb cura!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -672,12 +802,16 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Reenviaments de port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -685,64 +819,78 @@ msgstr "" "El reenviament de ports permet que els ordinadors remots en el Internet " "connectin a un ordinador o servei específic dins del LAN privat." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protocol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "Redirigeix trànsit entrant coincidit al port donat en el host intern" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Redirigeix trànsit entrant coincidit al host intern especificat" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Restringeix la mascarada a les subxarxes de destí donades" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Restringeix la mascarada a les subxarxes d'origen donades" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Restringeix a la família d'adreces" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Dissabte" @@ -756,36 +904,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Adreça IP d'origen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Adreça MAC d'origen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Adreça d'origen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Port d'origen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Zona d'origen" @@ -795,44 +943,48 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Diumenge" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -840,8 +992,8 @@ msgstr "" "El tallafocs crea zones a les teves interfícies de xarxa per controlar el " "flux de tràfic de xarxa." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -857,7 +1009,7 @@ msgstr "" "regla de reenviament es unidirectional, per exemple un reenviament " "de lan a wan no implica permís per reenviar de wan a lan també." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 #, fuzzy msgid "" "This section defines common properties of %q. The input and " @@ -873,18 +1025,18 @@ msgstr "" "Xarxes cobertes especifica quines xarxes disponibles són membres " "d'aquesta zona." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Dijous" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -892,6 +1044,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -901,7 +1057,7 @@ msgid "" "ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -937,8 +1093,8 @@ msgstr "" "zones distintes, per exemple per a rebutjar trànsit entre certs hosts o " "obrir ports WAN en el encaminador." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Dimarts" @@ -946,18 +1102,24 @@ msgstr "Dimarts" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -966,36 +1128,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1005,17 +1177,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Dimecres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -1023,109 +1195,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zona ⇒ Reenviaments" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zones" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "accepta" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "qualsevol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "qualsevol zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "no rastregis" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "descarta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "rebutja" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1137,6 +1434,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/cs/firewall.po b/package/luci/applications/luci-app-firewall/po/cs/firewall.po index b2418750ab..7ec75e5865 100644 --- a/package/luci/applications/luci-app-firewall/po/cs/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/cs/firewall.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2020-10-27 21:26+0000\n" -"Last-Translator: Lukas Jelinek \n" -"Language-Team: Czech \n" +"Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.3.2-dev\n" +"X-Generator: Weblate 5.1-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -28,25 +28,46 @@ msgid "" ""\">%{helper.val}:%{helper." "val}}}" msgstr "" +"%{src?%{dest?Forwarded:Incoming}:Outgoing} %{ipv6?%{ipv4?IPv4 and " +"IPv6:IPv6}:IPv4}%{proto?, protocol " +"%{proto#%{next?, }%{item.types?%{item." +"name}ICMP s typy %{item.types#%{next?, }" +"%{item}}:%{item.name}}}}%{mark?, mark " +"%{mark.val}}%{dscp?, DSCP " +"%{dscp.inv?%{dscp.val}:%{dscp.val}}}%{helper?, helper " +"%{helper.inv?%{helper.val}:%{helper." +"val}}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 msgid "-- add IP --" msgstr "-- přidat IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- přidat MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr " Zabránit přepsání zdroje" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -80,7 +101,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Automaticky přepsat zdrojovou IP " @@ -101,7 +122,7 @@ msgstr "" "Odmítnout %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -109,23 +130,23 @@ msgstr "" "Staticky přepsat na zdroj %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Musí být zadána IP adresa pro přepsání!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACCEPT - Zakázat přepis adresy" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Akce" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -134,7 +155,7 @@ msgstr "" "Další surové argumenty iptables ke klasifikaci provozu do cílové " "zóny, např. -p tcp --dport 443 pro pouze odchozí provoz HTTPS." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -142,33 +163,43 @@ msgstr "" "Další surové argumenty iptables ke klasifikaci provozu ze zdrojové " "zóny, např. -p tcp --sport 443 pro pouze příchozí provoz HTTPS." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Pokročilá nastavení" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Povolit \"neplatný\" provoz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Povolit přesměrování ze zdrojových oblastí:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Povolit přesměrování do zdrojových oblastí:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Libovolné" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Kterýkoli den" @@ -183,24 +214,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Nastavení pro Conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -208,23 +244,27 @@ msgstr "" msgid "Contents have been saved." msgstr "Obsah byl uložen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Pokračovat" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Pokrytá zařízení" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Pokryté sítě" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Pokryté podsítě" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Vlastní pravidla" @@ -238,7 +278,7 @@ msgstr "" "nejsou jinak pokryté frameworkem firewallu. Příkazy jsou spuštěny po každém " "restartu firewallu, právě po načtení výchozí sady pravidel." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "Klasifikace DSCP" @@ -250,17 +290,17 @@ msgstr "Značka DSCP" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Cílová adresa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Cílový port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Cílová zóna" @@ -268,72 +308,97 @@ msgstr "Cílová zóna" msgid "Device name" msgstr "Název zařízení" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Zahazovat neplatné pakety" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Povolit" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Povolit NAT Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Povolit ochranu proti SYN-flood" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Povolit logování v této oblasti" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Očekáváno: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Experimentální funkce. Není plně kompatibilní s QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Vnější IP adresa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Vnější port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Další argumenty volání" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Další argumenty pro cíl" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Další argumenty pro iptables" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Další argumenty pro zdroj" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Brána firewall" @@ -342,11 +407,15 @@ msgstr "Brána firewall" msgid "Firewall - Custom Rules" msgstr "Firewall - Vlastní pravidla" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Firewall - pravidla NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Firewall - Přesměrování portů" @@ -354,34 +423,35 @@ msgstr "Firewall - Přesměrování portů" msgid "Firewall - Traffic Rules" msgstr "Firewall - Pravidla síťového provozu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Firewall - Nastavení zón" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Migrace konfigurace brány firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Přesměrování" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "pátek" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Obecná nastavení" @@ -426,32 +496,70 @@ msgstr "Obecná nastavení" msgid "Grant access to firewall configuration" msgstr "Udělit přístup ke konfiguraci brány firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 a IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" -msgstr "pouze IPv4" +msgstr "Pouze IPv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" -msgstr "pouze IPv6" +msgstr "Pouze IPv6" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 msgid "Inbound device" msgstr "Příchozí zařízení" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Vstup" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Vnitřní IP adresa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Vnitřní port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Vnitřní zóna" @@ -487,11 +599,15 @@ msgstr "Neplatná značka DSCP" msgid "Invalid limit value" msgstr "Neplatná hodnota limitu" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Omezit logovací zprávy" @@ -499,15 +615,16 @@ msgstr "Omezit logovací zprávy" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -515,25 +632,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASQUERADE - Automaticky přepsat na IP adresu odchozího rozhraní" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSS clamping" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Maškárádování" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Shoda" @@ -549,30 +666,30 @@ msgstr "Odpovídá ICMP typu" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -584,8 +701,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -593,7 +710,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -601,28 +718,36 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "pondělí" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Dny v měsíci" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "Pravidla NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -630,26 +755,32 @@ msgstr "" "Pravidla NAT umožňují jemně odstupňovanou kontrolu nad zdrojovou IP adresou " "pro odchozí nebo předávaný provoz." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" -msgstr "Název" +msgstr "Jméno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Vybrat pouze příchozí provoz, směrovaný na danou IP adresu." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Vybrat pouze příchozí provoz z těchto MAC adres." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Vybrat pouze příchozí provoz z této IP nebo rozsahu IP adres." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -658,26 +789,38 @@ msgstr "" "portů klienta" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Odchozí zařízení" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Odchozí zóna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Výstup" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "Předává další argumenty iptables. Používat opatrně!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -686,12 +829,16 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Přesměrování portů" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -700,65 +847,79 @@ msgstr "" "Internetu připojení k vybraným počítačům nebo službám uvnitř privátní sítě " "LAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protokol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Přesměrovat vybraný příchozí provoz na uvedený port vnitřního hostitele" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Přesměrovat vybraný příchozí provoz na uvedeného vnitřního hostitele" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "Vyžaduje hardwarovou podporu NAT. Implementováno alespoň pro mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Vyžaduje hardwarovou podporu NAT." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Omezit maškarádování na uvedené cílové podsítě" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Omezit maškarádování na uvedené zdrojové podsítě" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Omezit na rodinu adres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "Přepsat IP adresu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Přepsat port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Přepsat na konkrétní zdrojovou IP adresu nebo port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "sobota" @@ -772,36 +933,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Zdrojová IP adresa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Zdrojová MAC adresa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Zdrojová adresa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Zdrojový port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Zdrojová zóna" @@ -811,44 +972,48 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Datum zahájení (rrrr-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Čas zahájení (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Datum ukončení (rrrr-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Čas ukončení (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "neděle" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -856,8 +1021,8 @@ msgstr "" "Firewall vytváří zóny přes vaše síťová rozhraní za účelem řízení síťového " "provozu." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -873,7 +1038,7 @@ msgstr "" "Přesměrovávací pravidlo je jednosměrné, například přesměrování z " "lan do wan nepovoluje přesměrování z wan do lan (a naopak)." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -887,18 +1052,18 @@ msgstr "" "pro přesměrování provozu mezi rozdílnými sítěmi uvnitř jedné zóny. " "Pokryté sítě určuje, které z dostupných sítí jsou členy této zóny." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "čtvrtek" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Časová omezení" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Čas v UTC" @@ -906,6 +1071,10 @@ msgstr "Čas v UTC" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Časový limit" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -915,7 +1084,7 @@ msgid "" "ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -951,8 +1120,8 @@ msgstr "" "různými zónami, například pro odmítnutí provozu mezi jistými hostiteli nebo " "pro otevření WAN portů na routeru." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "úterý" @@ -960,18 +1129,24 @@ msgstr "úterý" msgid "Unable to save contents: %s" msgstr "Nelze uložit obsah: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "Nejmenovaný NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -980,36 +1155,46 @@ msgstr "" msgid "Unnamed rule" msgstr "Nepojmenované pravidlo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Nepojmenovaná zóna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Nerozpoznaný protokol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Použít vnější IP adresu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Použít vnitřní IP adresu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1019,17 +1204,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "středa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Dny v týdnu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -1037,109 +1222,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zóna ⇒ Přesměrování" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zóny" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "přijmout" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "libovolný" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "libovolná zóna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "nesledovat" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "zahodit" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "odmítnout" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1151,6 +1461,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/da/firewall.po b/package/luci/applications/luci-app-firewall/po/da/firewall.po index d6655668cb..5e726f7e04 100644 --- a/package/luci/applications/luci-app-firewall/po/da/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/da/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2021-12-08 22:46+0000\n" +"PO-Revision-Date: 2023-10-27 08:55+0000\n" "Last-Translator: drax red \n" -"Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -48,10 +48,18 @@ msgstr "" msgid "-- add IP --" msgstr "-- tilføj IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- tilføj MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -59,11 +67,11 @@ msgstr "" "Accept %{src?%{dest?videresend:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Forhindrer kildeomskrivning" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -101,7 +109,7 @@ msgstr "" "%{set_mark?Assign:XOR} firewall mærke " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "Omskriv automatisk kilde IP" @@ -120,7 +128,7 @@ msgstr "" "Afvis %{src?%{dest?videresend:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -128,23 +136,23 @@ msgstr "" "Statisk omskriv til kilde %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "En omskrivnings-IP skal angives!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACCEPT - Deaktiver adresseomskrivning" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Handling" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -154,7 +162,7 @@ msgstr "" "zonedestinationstrafik, f.eks. -p tcp --dport 443 for kun at " "matche udgående HTTPS-trafik." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -163,33 +171,45 @@ msgstr "" "zonekildetrafik, f.eks. -p tcp --sport 443 for kun at matche " "indgående HTTPS-trafik." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Adressefamilie, intern IP-adresse skal stemme overens" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" +"Adressefamilie, kildeadresse, destinationsadresse, rewrite IP-adresse skal " +"stemme overens" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Avancerede indstillinger" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Tillad \"ugyldig\" trafik" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Tillad videresendelse fra kildezoner:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Tillad videresendelse til destinationszoner:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Enhver" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Enhver dag" @@ -207,24 +227,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "Anvend den givne DSCP-klasse eller værdi på etablerede forbindelser." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "Tildel den angivne forbindelsessporingshjælper til matchet trafik." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Automatisk hjælpertildeling" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "Tildel automatisk conntrack-hjælpere baseret på trafikprotokol og port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Kommentar" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Forbindelsesindstillinger" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Forbindelseshjælpere" @@ -232,23 +257,27 @@ msgstr "Forbindelseshjælpere" msgid "Contents have been saved." msgstr "Indholdet er blevet gemt." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Fortsæt" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Tællere" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Dækkede enheder" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Dækkede netværk" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Dækkede subnets" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Brugerdefinerede regler" @@ -263,7 +292,7 @@ msgstr "" "udføres efter hver genstart af firewall, lige efter standardregelsættet er " "blevet indlæst." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "DSCP klassifikation" @@ -275,17 +304,17 @@ msgstr "DSCP mærke" msgid "DSCP mark required" msgstr "DSCP-mærke påkrævet" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Destinationsadresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Destinationsport" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Destination zone" @@ -293,7 +322,7 @@ msgstr "Destination zone" msgid "Device name" msgstr "Enhedens navn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -302,66 +331,96 @@ msgstr "" "tilstand ugyldig. Dette kan være nødvendigt for komplekse " "asymmetriske ruteopsætninger." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Drop ugyldige pakker" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Aktiver" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Aktiver NAT Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Aktiver SYN-flood beskyttelse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Aktiver logning på denne zone" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Aktiver netværksadresse og portoversættelse IPv4 (NAT4 eller NAPT4) for " +"udgående trafik på denne zone. Dette er typisk aktiveret på zonen wan." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Aktiver netværksadresse og portoversættelse IPv6 (NAT6 eller NAPT6) for " +"udgående trafik på denne zone." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Aktiver" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "Aktiverer sporing af pakke og byttetælling for sættet." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Forventer: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Eksperimentel funktion. Ikke fuldt kompatibel med QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "Vælger eksplicit tilladte forbindelsessporingshjælpere til zonetrafik" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Ekstern IP-adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Ekstern port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Ekstra argumenter" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Ekstra destinationsargumenter" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Ekstra iptables-argumenter" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Ekstra kildeargumenter" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Familie" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Firewall" @@ -370,11 +429,15 @@ msgstr "Firewall" msgid "Firewall - Custom Rules" msgstr "Firewall - brugerdefinerede regler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Firewall - IP-sæt" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Firewall - NAT-regler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Firewall - Port Forwards" @@ -382,39 +445,41 @@ msgstr "Firewall - Port Forwards" msgid "Firewall - Traffic Rules" msgstr "Firewall - Trafikregler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Firewall - Zoneindstillinger" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Firewall-konfigurationsmigrering" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Videresend" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Videresend IPv4%{proto?, protokol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark." +"Videresendt %{ipv6?%{ipv4?IPv4 and IPv6:IPv6}:IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}" +"}}%{mark?, mark %{mark." "val}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Fredag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item." "ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item." "ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Generelle indstillinger" @@ -480,32 +545,70 @@ msgstr "Generelle indstillinger" msgid "Grant access to firewall configuration" msgstr "Giv adgang til firewall-konfiguration" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Aflæsning af hardwareflow" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (rækkevidde)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "IP-sæt" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IP'er/netværk" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IP'er/netværk/MAC'er" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 og IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Kun IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "IPv6-maskering" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" -msgstr "Kun IPv6" +msgstr "Kun IPv4" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 msgid "Inbound device" msgstr "Indgående enhed" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Medtag fil" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Indkommende IPv4%{proto?, protokol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protokol %{proto#%{næste?, }%{item.types?%{item.name}ICMP " "med typer %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:" -"%{helper.val}}}" +"fwmarks undtagen %{mark.num}%{mark.mask? med maske %{mark.mask}}.\":%{mark." +"mask? data-tooltip=\"Masker fwmark-værdi med %{mark.mask} før sammenligning." +"\"}}>%{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}" +":%{helper.val}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Oprindelig hash-størrelse" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Input" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Intern IP-adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Intern port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Intern zone" @@ -550,11 +658,15 @@ msgstr "Ugyldigt DSCP-mærke" msgid "Invalid limit value" msgstr "Ugyldig grænseværdi" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "Ugyldigt navn" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Grænse brist" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Begræns logmeddelelser" @@ -562,9 +674,9 @@ msgstr "Begræns logmeddelelser" msgid "Limit matching" msgstr "Begræns matchning" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -572,7 +684,8 @@ msgstr "" "Begræns matchning til %{limit.num} pakker pr. %{limit.unit}%{limit.burst? burst %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Begrænset maskering aktiveret" @@ -580,25 +693,25 @@ msgstr "Begrænset maskering aktiveret" msgid "Limits traffic matching to the specified rate." msgstr "Begrænser trafikmatchning til den specificeret sats." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "Loopback-kilde-IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASKERING - Omskriv automatisk til udgående grænseflade IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSS fastspænding" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Maskering" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Match" @@ -614,34 +727,34 @@ msgstr "Match ICMP-type" msgid "Match device" msgstr "Match enhed" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "Match videresendt trafik rettet mod den angivne IP-adresse." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "Match videresendt trafik rettet mod den givne destinationsport eller " "portområde." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "Match videresendt trafik fra denne IP eller dette område." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "Match videresendt trafik, der stammer fra den givne kildeport eller " "portinterval." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "Match hjælper" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -653,8 +766,8 @@ msgstr "" msgid "Match mark" msgstr "Match mærke" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "Match trafik ved hjælp af den angivne forbindelsessporingshjælper." @@ -662,7 +775,7 @@ msgstr "Match trafik ved hjælp af den angivne forbindelsessporingshjælper." msgid "Matches a specific firewall mark or a range of different marks." msgstr "Matcher et specifikt firewallmærke eller en række forskellige mærker." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" "Matcher videresendt trafik ved hjælp af den angivne udgående netværksenhed." @@ -671,6 +784,14 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "Matcher trafik, der bærer den specificerede DSCP-mærkning." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Maks indlæg" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Maks. længde" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -679,22 +800,22 @@ msgstr "" "Maksimalt indledende antal pakker, der skal matches: Dette antal genoplades " "med én, hver gang grænsen angivet ovenfor ikke nås, op til dette antal." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Mandag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Måned Dage" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "NAT regler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -702,26 +823,32 @@ msgstr "" "NAT-regler tillader finkornet kontrol over kilde-IP'en til brug for udgående " "eller videresendt trafik." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Navn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Netmaske" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Match kun indgående trafik rettet mod den angivne IP-adresse." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Match kun indgående trafik fra disse MAC'er." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Match kun indgående trafik fra denne IP eller dette område." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -730,26 +857,43 @@ msgstr "" "portinterval på klientværten" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Udgående enhed" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Udgående zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Output" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Pakkefelt match" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Pakkefelter, der skal matches på.
    Syntax: direction_datatype. " +"e.g.: src_port, dest_net.
    Retninger: src, dst. Datatyper: ip, port, mac, net, set.
    Retningspræfikser er valgfrie.
    *Note: datatype set " +"understøttes ikke i fw4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "Sender yderligere argumenter til iptables. Brug med omhu!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -763,12 +907,16 @@ msgstr "" "bør bruges med ekstrem forsigtighed, da ugyldige værdier kan gøre firewall-" "regelsættet brudt, hvilket fuldstændig afslører alle tjenester." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "Stien til filen med CIDR'er, undernet, værts-IP'er osv.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Port Forwards" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -777,66 +925,79 @@ msgstr "" "oprette forbindelse til en bestemt computer eller tjeneste inden for det " "private LAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Port rækkevidde" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protokol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Omdiriger matchet indgående trafik til den givne port på den interne vært" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Omdiriger matchet indgående trafik til den angivne interne vært" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "" -"Kræver hardware NAT-understøttelse. Implementeret i det mindste for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Henvis til eksternt sæt" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "Reflekszoner" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Kræver hardware NAT-understøttelse." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Begræns Maskering til givne destination subnets" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Begræns Maskering til givne kilde subnets" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Begræns til adresse familie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "Omskriv IP-adressen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "Omskriv matchet trafik til den angivne kilde-IP-adresse." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "Omskriv matchet trafik til den angivne kildeport eller portinterval." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Omskriv port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Routing/NAT Offloading" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Omskriv til specifik kilde-IP eller port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Lørdag" @@ -852,36 +1013,36 @@ msgstr "" "Indstil den givne mærkeværdi på etablerede forbindelser. Formatet er værdi[/" "mask]. Hvis der er angivet en maske, ændres kun de bits, der er sat i masken." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Softwarebaseret offloading til routing/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Software flow offloading" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Kilde IP-adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Kilde MAC-adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Kildeadresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Kildeport" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Kilde zone" @@ -893,7 +1054,7 @@ msgstr "" "Angiver, om denne trafikregel skal knyttes til en bestemt indgående eller " "udgående netværksenhed." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -901,32 +1062,36 @@ msgstr "" "Angiver, om den eksterne eller den interne IP-adresse skal bruges til " "reflekteret trafik." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Startdato (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Starttid (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Stopdato (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Stoptid (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Opbevaringsmetode" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Søndag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -934,7 +1099,7 @@ msgstr "" "Den eksisterende firewall-konfiguration skal ændres for at LuCI kan fungere " "korrekt." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -942,8 +1107,8 @@ msgstr "" "Firewallen opretter zoner over dine netværksgrænseflader for at kontrollere " "netværkstrafikstrømmen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -960,7 +1125,7 @@ msgstr "" "til wan betyder ikke en tilladelse til også at videresende fra wan " "til lan." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -975,18 +1140,18 @@ msgstr "" "inden for zonen. Dækkede netværk angiver, hvilke tilgængelige " "netværk der er medlemmer af denne zone." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Torsdag" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Tidsbegrænsninger" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Tid i UTC" @@ -994,6 +1159,10 @@ msgstr "Tid i UTC" msgid "Time restrictions are enabled for this rule" msgstr "Tidsbegrænsninger er aktiveret for denne regel" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Timeout" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1008,7 +1177,7 @@ msgstr "" "%{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Sporingshjælper" @@ -1053,8 +1222,8 @@ msgstr "" "zoner, for eksempel for at afvise trafik mellem bestemte værter eller for at " "åbne WAN-porte på routeren." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Tirsdag" @@ -1062,18 +1231,26 @@ msgstr "Tirsdag" msgid "Unable to save contents: %s" msgstr "Kan ikke gemme indholdet: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" +"Enhed: sekunder. Standard 0 betyder, at posten tilføjes " +"permanent til sættet.
    Max: 2147483 sekunder." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "Ukendt eller ikke installeret conntrack-hjælper \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "Unavngivet NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Unavngivne forward" @@ -1082,15 +1259,19 @@ msgstr "Unavngivne forward" msgid "Unnamed rule" msgstr "Unavngiven regel" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Unavngivet sæt" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Unavngiven zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Ukendt protokol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1100,15 +1281,21 @@ msgstr "" "\"SNAT\" blive konverteret til \"nat\" sektioner, og firewallen vil blive " "genstartet for at anvende den opdaterede konfiguration." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Brug ekstern IP-adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Brug intern IP-adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Brug ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1116,7 +1303,7 @@ msgstr "" "Brug denne mulighed til at klassificere zonetrafik efter rå, ikke-uci-administrerede netværksenheder." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1128,17 +1315,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Gyldigt firewallmærke påkrævet" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Onsdag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Ugedage" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "XOR firewall-mærke" @@ -1146,109 +1333,240 @@ msgstr "XOR firewall-mærke" msgid "XOR mark" msgstr "XOR mærke" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "Din enhed kører ikke firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "Din enhed kører firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zone ⇒ Videresendelser" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zoner" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" +"Zoner, hvor refleksionsregler skal skabes. Hvis det ikke er indstillet, " +"bruges kun destinationszonen." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "accept" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "enhver" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "enhver zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "enhver/alle" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "anvend firewall-mærke" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "tildel forbindelse-hjælper" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "automatisk" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bitmap" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "bitmap er kun ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "dag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: Destination IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: Destination MAC addr" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: Destinations(under)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: Destinationsport" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: Destination ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "omskriv ikke" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "spor ikke" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "drop" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"firewall4 understøtter henvisning og oprettelse af IP-sæt for at forenkle " +"matchning af store adresselister uden at skulle oprette en regel for hvert " +"element, der skal matches. Portintervaller i ips-sæt understøttes ikke af " +"firewall4.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "fraport-tilport" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "time" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: IP addr" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "ip[/cidr]
    Til brug med Match-datatyper: *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "liste" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: MAC addr" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macaddr|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "minut" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "net: (under)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "port: Port:" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "afvis" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "sekund" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "sæt: ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: Kilde ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: Kilde-IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: Source MAC addr" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: Kilde(under)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Kildeport" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "denne enhed" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "denne nye zone" @@ -1260,6 +1578,11 @@ msgstr "ubegrænset" msgid "unspecified" msgstr "uspecificeret" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "op til 65536 poster." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "gyldigt firewallmærke" diff --git a/package/luci/applications/luci-app-firewall/po/de/firewall.po b/package/luci/applications/luci-app-firewall/po/de/firewall.po index 446bc2e079..db1f1dc4fe 100644 --- a/package/luci/applications/luci-app-firewall/po/de/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/de/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2022-06-12 07:17+0000\n" -"Last-Translator: ssantos \n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -49,10 +49,18 @@ msgstr "" msgid "-- add IP --" msgstr "-- IP hinzufügen --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- MAC hinzufügen --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -60,11 +68,11 @@ msgstr "" "%{src?%{dest?Weiterleitung:Eingang}:Ausgang} erlauben" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Quellmaskierung unterbinden" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -103,7 +111,7 @@ msgstr "" "%{set_mark?Setze:XOR} Firewall-Markierung " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "Quell-IP automatisch maskieren" @@ -122,7 +130,7 @@ msgstr "" "%{src?%{dest?Weiterleitung:Eingang}:Ausgang} ablehnen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -130,23 +138,23 @@ msgstr "" "Quell%{snat_ip?-IP %{snat_ip}} %{snat_port?Port %{snat_port}" "} statisch umschreiben" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Es muss eine IP-Adresse zum Umschreiben angegeben werden!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACCEPT - Umschreiben von IP-Adressen deaktivieren" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Aktion" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -156,7 +164,7 @@ msgstr "" "Zonenzielverkehrs, z.B. -p tcp --dport 443, um nur ausgehenden " "HTTPS-Verkehr übereinstimmen zu lassen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -165,33 +173,45 @@ msgstr "" "Zonenquellenverkehr, z.B. -p tcp --sport 443, um nur " "eingehenden HTTPS-Verkehr übereinstimmen zu lassen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Adressfamilie, interne IP-Adresse muss übereinstimmen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" +"Adressfamilie, Quelladresse, Zieladresse, IP-Adressenumschreibung muss " +"übereinstimmen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Erweiterte Einstellungen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Erlaube \"ungültigen\" Verkehr" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Erlaube Weiterleitung von Quellzone:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Erlaube Weiterleitung zu Zielzone:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Beliebig" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Beliebig" @@ -211,27 +231,32 @@ msgstr "" "Wende die angegebene DSCP-Klasse oder den angegebenen DSCP-Wert auf " "etablierte Verbindungen an." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" "Weise den angegebenen Verbindungs-Tracking-Helfer selektiertem Verkehr zu." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Automatische Helferzuordnung" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "Automatische Zuweisung von Conntrack-Helfern basierend auf Traffic-Protokoll " "und Port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Kommentar" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Conntrack-Einstellungen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Conntrack-Helfer" @@ -239,23 +264,27 @@ msgstr "Conntrack-Helfer" msgid "Contents have been saved." msgstr "Inhalte wurden gespeichert." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Fortfahren" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Zähler" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Abgedeckte Geräte" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Abgedeckte Netzwerke" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Abgedeckte Subnetze" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Benutzerdefinierte Regeln" @@ -270,7 +299,7 @@ msgstr "" "Befehle werden mit jedem Firewall-Neustart abgearbeitet, direkt nach dem " "Laden der Basisregeln." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "DSCP-Klassifizierung" @@ -282,17 +311,17 @@ msgstr "DSCP-Markierung" msgid "DSCP mark required" msgstr "DSCP-Markierung benötigt" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Zieladresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Zielport" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Ziel-Zone" @@ -300,7 +329,7 @@ msgstr "Ziel-Zone" msgid "Device name" msgstr "Gerätename" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -309,67 +338,97 @@ msgstr "" "Conntrack-Status invalid abzulehnen. Dies kann bei komplexen " "asymmetrischen Routen erforderlich sein." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Ungültige Pakete verwerfen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" -msgstr "Aktivieren" +msgstr "aktivieren" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "NAT-Loopback aktivieren" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Schutz vor SYN-flood-Attacken" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Protokollierung innerhalb der Zone aktivieren" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Aktivieren der Netzwerkadressen- und Portübersetzung IPv4 (NAT4 oder NAPT4) " +"für den ausgehenden Verkehr in dieser Zone. Dies wird normalerweise für die " +"Zone wan aktiviert." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Aktivieren der Netzwerkadressen- und Portübersetzung IPv6 (NAT6 oder NAPT6) " +"für den ausgehenden Verkehr in dieser Zone." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Aktiviert" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "Aktiviert die Paket- und Byte-Zählungsverfolgung für das Set." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Erwarte: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Experimentelle Funktion. Nicht vollständig kompatibel mit QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" "Wählt explizit zulässige Verbindungs-Tracking-Helfer für den Zonenverkehr aus" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Externe IP-Adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Externer Port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Zusätzliche Argumente" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Zusätzliche Ziel-Argumente" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Zusätzliche iptables-Argumente" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Zusätzliche Quell-Argumente" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Familie" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Firewall" @@ -378,11 +437,15 @@ msgstr "Firewall" msgid "Firewall - Custom Rules" msgstr "Firewall - Benutzerdefinierte Regeln" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Firewall - IP-Sets" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Firewall - NAT Regeln" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Firewall - Portweiterleitungen" @@ -390,39 +453,42 @@ msgstr "Firewall - Portweiterleitungen" msgid "Firewall - Traffic Rules" msgstr "Firewall - Traffic-Regeln" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Firewall - Zoneneinstellungen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Migration der Firewall-Konfiguration" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" -msgstr "Weitergeleitet" +msgstr "Weiterleitung" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 +#, fuzzy msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Weitergeleiteter IPv4-Verkehr%{proto?, Protokoll %{proto#%{next?, }" -"%{item.name}}}%{mark?, Markierung %{mark.val}}" - -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +"Weitergeleiteter %{ipv6?%{ipv4?IPv4- und IPv6:" +"IPv6-}:IPv4}-Verkehr%{proto?, Protokoll " +"%{proto#%{next?, }%{item.name}}}%{mark?, Markierung %{mark.val}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Freitag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Allgemeine Einstellungen" #: applications/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json:3 msgid "Grant access to firewall configuration" -msgstr "Gewähre Zugriff auf die Konfiguration der Firewall" +msgstr "Zugriff auf die Firewall-Konfiguration gewähren" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Hardwarebeschleunigte Flusskontrolle" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (Bereich)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "IP-Sets" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IPs/Netzwerke" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IPs/Netzwerke/MACs" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 und IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" -msgstr "Nur IPv4" +msgstr "nur IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "IPv6-Masquerading" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" -msgstr "Nur IPv6" +msgstr "nur IPv6" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 msgid "Inbound device" msgstr "Eingehendes Gerät" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Datei einschließen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Eingehender IPv4-Verkehr%{proto?, Protokoll %{proto#%{next?, }%{item.types?" +"Eingehende %{ipv6?%{ipv4?IPv4 und IPv6:IPv6}:IPv4}%{proto?, Protokoll %{proto#%{next?, }%{item.types?" "%{item.name}ICMP mit Typen %{item.types#%{next?, }%{item}}:%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, " -"Helfer %{helper.inv?%{helper.val}:%{helper.val}}}" +"var>:%{item.name}}}}%{mark? mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Initiale Hash Größe" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Eingehend" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Interne IP-Adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Interner Port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Interne Zone" @@ -559,11 +668,15 @@ msgstr "Ungültige DSCP-Markierung" msgid "Invalid limit value" msgstr "Ungültiger Limit-Wert" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Limit-Häufung" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Protokollnachrichten limitieren" @@ -571,9 +684,9 @@ msgstr "Protokollnachrichten limitieren" msgid "Limit matching" msgstr "Limitiere Vergleiche" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -581,7 +694,8 @@ msgstr "" "Limitiere Vergleiche auf %{limit.num} Pakete pro %{limit." "unit}%{limit.burst? Häufung %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Eingeschränktes Masquerading aktiviert" @@ -589,27 +703,27 @@ msgstr "Eingeschränktes Masquerading aktiviert" msgid "Limits traffic matching to the specified rate." msgstr "Limitiere Verkehrsvergleiche auf die angegebene Rate." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "Loopback Quell-IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" "MASQUERADE - Automatisch auf IP-Adresse der ausgehenden Schnittstelle " "umschreiben" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSS Korrektur" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "NAT aktivieren" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Filter" @@ -625,34 +739,34 @@ msgstr "Nach ICMP-Typ filtern" msgid "Match device" msgstr "Gerät selektieren" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "Selektiert an die angegebene IP-Adresse gerichteten Verkehr." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "Selektiert an den angegeben Port oder Port-Bereich gerichteten Verkehr." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" "Selektiert weitergeleiteten Verkehr von dieser IP oder diesem IP-Bereich." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "Selektiert weitergeleiteten Verkehr vom angegebenem Quellport oder " "Portbereich." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "Helfer selektieren" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -664,8 +778,8 @@ msgstr "" msgid "Match mark" msgstr "Erfasse Markierung" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "Selektiere Verkehr welcher den angegebenen Tracking-Helfer benutzt." @@ -675,7 +789,7 @@ msgstr "" "Selektiert Verkehr mit einer spezifischen Firewall-Markierung oder einem " "Bereich von Markierungen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" "Selektiert weitergeleiteten Verkehr welcher die angegebene " @@ -685,6 +799,14 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "Selektiere Verkehr welcher die angegebene DSCP-Markierung trägt." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Maximale Einträge" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Maximale Länge" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -694,22 +816,22 @@ msgstr "" "jedes Mal erhöht, wenn das oben genannte Limit nicht erreicht wird, bis zur " "hier angegeben Anzahl." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Montag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Monatstage" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "NAT-Regeln" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -717,26 +839,32 @@ msgstr "" "NAT-Regeln erlauben eine detaillierte Kontrolle über die verwendete Quell-IP-" "Adresse für ausgehenden oder weitergeleiteten Verkehr." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Name" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Netzmaske" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Selektiert nur Traffic der an die angegebene IP-Adresse gerichtet ist." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Selektiert nur Traffic von den angegebenen MAC-Adressen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Selektiert nur Traffic vom angebenem Quell-IP-Adressbereich." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -745,28 +873,45 @@ msgstr "" "des Client-Host stammt, selektieren" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Ausgehende Schnittstelle" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Ausgehende Zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Ausgehend" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Paket-Feld Übereinstimmung" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Übereinstimmende Paketfelder.
    Syntax: direction_datatype. e." +"g.: src_port, dest_net.
    Richtung: src, dst. " +"Datentypen: ip, port, mac, net, set.
    Richtungspräfix ist " +"optional.
    *Hinweis: Datentyp set wird von fw4 nicht " +"unterstützt." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "Gibt zusätzliche Kommandozeilenargumente an iptables weiter. Mit Vorsicht " "benutzen!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -781,12 +926,16 @@ msgstr "" "führen können, dass der Firewall-Regelsatz außer Funktion gesetzt wird und " "alle Dienste vollständig offengelegt werden." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "Pfad zu Datei mit CIDRs, Subnetzen, Host IPs, etc.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Portweiterleitungen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -794,69 +943,82 @@ msgstr "" "Portweiterleitungen ermöglichen es entfernten Rechnern im Internet auf " "bestimmte Computer oder Dienste im lokalen LAN zuzugreifen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Port-Bereich" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protokoll" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Gefilterte Verbindungen an den angegeben Port auf dem internen Host " "weiterleiten" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Gefilterte Verbindungen an den angegeben internen Host weiterleiten" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "" -"Erfordert Hardware-NAT-Unterstützung. (Zumindest für mt7621 implementiert)" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Verweis auf externes Set" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "Reflection-Zonen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Erfordert Hardware-NAT-Unterstützung." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "NAT auf die angegebenen Ziel-Subnetze beschränken" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "NAT auf die angegebenen Quell-Subnetze beschränken" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" -msgstr "Beschränke auf Adressfamilie" +msgstr "Auf Adressfamilie beschränken" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "IP-Adresse umschreiben" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "Selektierten Verkehr auf die angegebene Quell-IP-Adresse umschreiben." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Selektierten Verkehr auf den angegebenen Quell-Port bzw. Port-Bereich " "umschreiben." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Port umschreiben" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Routing/NAT-Beschleunigung" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Umschreiben auf spezifische Quell-IP oder Port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Samstag" @@ -873,36 +1035,36 @@ msgstr "" "ist Wert[/Maske]. Wenn eine Maske spezifiziert ist, werden nur die " "korrespondierenden Bits des Markierungswertes verändert." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Softwarebasierte Auslagerung von Routing/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Beschleunigte Flusskontrolle" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Quell-IP-Adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Quell-MAC-Adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Quelladresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Quellport" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Quell-Zone" @@ -914,7 +1076,7 @@ msgstr "" "Gibt an, ob diese Verkehrsregel an eine spezifische Eingangs- oder " "Ausgangsschnittstelle gebunden wird." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -922,32 +1084,36 @@ msgstr "" "Gibt an, ob die externe oder die interne IP-Adresse für reflektierten " "Verkehr genutzt wird." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Startdatum (JJJJ-MM-TT)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Startzeit (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Enddatum (JJJJ-MM-TT)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Stoppzeit (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Speichermethode" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Sonntag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -955,7 +1121,7 @@ msgstr "" "Die existierende Firewall-Konfiguration muss geändert werden damit LuCI " "richtig funktioniert." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -963,8 +1129,8 @@ msgstr "" "Die Firewall erstellt Netzwerkzonen über bestimmte Netzwerkschnittstellen um " "den Netzwerk-Traffic zu trennen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -982,7 +1148,7 @@ msgstr "" "nicht zusätzlich die Erlaubnis, auch von WAN nach LAN " "weiterzuleiten." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -997,18 +1163,18 @@ msgstr "" "dieser Zone zu. Covered networks definiert welche der verfügbaren " "Netzwerke zu dieser Zone gehören." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Donnerstag" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Zeitbeschränkungen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Zeit ist UTC" @@ -1016,6 +1182,10 @@ msgstr "Zeit ist UTC" msgid "Time restrictions are enabled for this rule" msgstr "Zeitbeschränkungen sind aktiviert für diese Regel" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Zeitüberschreitung" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1030,7 +1200,7 @@ msgstr "" "var>}}%{dest_port?, Port %{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }}}%{dest_port?, Port %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, Port %{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Tracking-Helfer" @@ -1075,8 +1245,8 @@ msgstr "" "zum Beispiel um Traffic zwischen bestimmten Rechnern zu unterbinden oder um " "WAN-Ports auf dem Router zu öffnen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Dienstag" @@ -1084,18 +1254,26 @@ msgstr "Dienstag" msgid "Unable to save contents: %s" msgstr "Inhalt kann nicht gespeichert werden: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" +"Einheit: Sekunden. Voreinstellung 0 bedeutet der Eintrag wird " +"dauerhaft hinzugefügt.
    Maximaler Wert: 2147483 Sekunden." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "Unbekannter oder nicht installierter Tracking-Helfer \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "Unbenannte NAT-Regel" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Unbenannte Portweiterleitung" @@ -1104,15 +1282,19 @@ msgstr "Unbenannte Portweiterleitung" msgid "Unnamed rule" msgstr "Unbennante Regel" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Unbenanntes Set" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Unbenannte Zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Unbekanntes Protokoll" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1122,15 +1304,21 @@ msgstr "" "Sektionen konvertiert und die Firewall wird neu gestartet um die geänderte " "Konfiguration anzuwenden." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Externe IP-Adresse nutzen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Interne IP-Adresse nutzen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Benutze ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1138,7 +1326,7 @@ msgstr "" "Diese Option verwenden, um den Zonenverkehr nach rohen, nicht uci-" "verwalteten Netzwerkgeräten zu klassifizieren." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1150,17 +1338,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Gültige Firewall-Markierung benötigt" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Mittwoch" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Wochentage" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "Firewallmarkierung XOR-en" @@ -1168,111 +1356,244 @@ msgstr "Firewallmarkierung XOR-en" msgid "XOR mark" msgstr "Markierungen XOR-en" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "Firewall4 ist auf Ihrem Gerät nicht aktiviert." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "Firewall4 ist auf Ihrem Gerät aktiviert." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zone ⇒ Weiterleitungen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zonen" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" +"Zonen, aus denen Reflection-Regeln erstellt werden sollen. Wenn nicht " +"festgelegt, wird nur die Zielzone verwendet." + # Die richtige Übersetzung von ACCEPT im Firewallkontext ist nicht "Annehmen" sondern "Zulassen". Man kann ja keinen # ausgehenden Traffic annehmen. -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "zulassen" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "beliebig" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "beliebige Zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "beliebig/alle" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "Firewallmarkierung anwenden" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "Tracking-Helfer zuordnen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "Automatisch" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "Bitmap" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "Bitmap ist nur IPv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "Tag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: Ziel IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: Ziel MAC addr" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: Ziel (Sub)netz" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: Ziel Port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: Ziel ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "nicht umschreiben" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "nicht verfolgen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "verwerfen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"Firewall4 unterstützt die Referenzierung und Erzeugung von IP sets, um die " +"Übereinstimmung mit großen Adresslisten zu vereinfachen, ohne dass für jede " +"Adresse eine eigene Regel erzeugt werden muss. Portbereiche in ipsets werden " +"von Firewall4 nicht unterstützt.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "vonPort-bisPort" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "Hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "Stunde" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: IP-Adr" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" +"ip[/cidr]
    Zur Verwendung mit Übereinstimmungs-Datentypen: *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "Liste" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: MAC-Addr" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macAdr|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "Minute" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "net: (Sub-)Netz" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "port: Port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "zurückweisen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "Sekunde" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set: ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: Quell-ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: Quell-IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: Quell-MAC-Adr" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: Quell-(sub)netz" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Quell-Port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "dieses Gerät" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "diese neue Zone" @@ -1284,6 +1605,11 @@ msgstr "unlimitiert" msgid "unspecified" msgstr "unspezifiziert" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "bis zu 65536 Einträgen." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "gültige Firewall-Markierung" diff --git a/package/luci/applications/luci-app-firewall/po/el/firewall.po b/package/luci/applications/luci-app-firewall/po/el/firewall.po index 3318a86211..662b85a152 100644 --- a/package/luci/applications/luci-app-firewall/po/el/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/el/firewall.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2010-03-30 17:00+0200\n" "PO-Revision-Date: 2022-11-17 11:47+0000\n" "Last-Translator: TakissX \n" -"Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" @@ -35,10 +35,18 @@ msgstr "" msgid "-- add IP --" msgstr "-- προσθήκη IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- προσθήκη MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -46,11 +54,11 @@ msgstr "" "Accept %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Prevent source rewrite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -79,7 +87,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -94,68 +102,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Δράση" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Ρυθμίσεις για προχωρημένους" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Οποιοδήποτε" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "" @@ -170,24 +188,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -195,23 +218,27 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Προσαρμοσμένοι Κανόνες" @@ -222,7 +249,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -234,17 +261,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Διεύθυνση προορισμού" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Θύρα προορισμού" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Ζώνη προορισμού" @@ -252,73 +279,98 @@ msgstr "Ζώνη προορισμού" msgid "Device name" msgstr "Όνομα συσκευής" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Αγνόηση μη-έγκυρων πακετών" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Ενεργοποίηση" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 #, fuzzy msgid "Enable NAT Loopback" msgstr "Ενεργοποιήστε το NAT Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Ενεργοποιήστε την προστασία SYN-flood" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Ενεργοποιήστε τη σύνδεση σε αυτήν τη ζώνη" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Εξωτερική διεύθυνση IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Εξωτερική θύρα" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Επιπλέον παράμετροι" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Τείχος προστασίας" @@ -327,11 +379,15 @@ msgstr "Τείχος προστασίας" msgid "Firewall - Custom Rules" msgstr "Τείχος προστασίας - Προσαρμοσμένοι Κανόνες" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Τείχος προστασίας - Προώθηση Θυρών" @@ -339,34 +395,35 @@ msgstr "Τείχος προστασίας - Προώθηση Θυρών" msgid "Firewall - Traffic Rules" msgstr "Τείχος προστασίας - Κανόνες Κίνησεις" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Τείχος προστασίας - Ρυθμίσεις Ζώνης" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Προώθηση" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Γενικές ρυθμίσεις" @@ -411,22 +468,55 @@ msgstr "Γενικές ρυθμίσεις" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 και IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Μόνο IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Μόνο IPv6" @@ -434,9 +524,14 @@ msgstr "Μόνο IPv6" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Είσοδος" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Εσωτερική διεύθυνση IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 #, fuzzy msgid "Internal port" msgstr "Εξωτερική θύρα" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Εσωτερική ζώνη" @@ -473,11 +572,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Περιορισμός καταγραφών συστήματος" @@ -485,15 +588,16 @@ msgstr "Περιορισμός καταγραφών συστήματος" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -501,26 +605,26 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 #, fuzzy msgid "MSS clamping" msgstr "Περιορισμός MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -536,30 +640,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -569,8 +673,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -578,7 +682,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -586,79 +690,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Ονομα" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Έξοδος" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -667,75 +797,93 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Προώθηση Θυρών" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Πρωτόκολλο" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "" @@ -749,38 +897,38 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 #, fuzzy msgid "Source IP address" msgstr "Διεύθυνση MAC πηγής" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 #, fuzzy msgid "Source address" msgstr "Διεύθυνση MAC πηγής" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Θύρα πηγής" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 #, fuzzy msgid "Source zone" msgstr "Θύρα πηγής" @@ -791,44 +939,48 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Κυριακή" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -836,8 +988,8 @@ msgstr "" "Το τείχος προστασίας δημιουργεί ζώνες πάνω στις διεπαφές δικτύου για να " "ελέγχει την δικτυακή κίνηση." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -847,7 +999,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -856,18 +1008,18 @@ msgid "" "networks
    specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Πέμπτη" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Χρονικοί Περιορισμοί" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Ώρα σε UTC" @@ -875,6 +1027,10 @@ msgstr "Ώρα σε UTC" msgid "Time restrictions are enabled for this rule" msgstr "Οι χρονικοί περιορισμοί είναι ενεργοποιημένοι για αυτόν τον κανόνα" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -884,7 +1040,7 @@ msgid "" "ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Βοηθός παρακολούθησης" @@ -920,8 +1076,8 @@ msgstr "" "διαφορετικών ζωνών, για παράδειγμα μια απόρριψη κίνησης μεταξύ ορισμένων " "κεντρικών υπολογιστών ή για άνοιγμα θυρών WAN στο δρομολογητή." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Τρίτη" @@ -929,18 +1085,24 @@ msgstr "Τρίτη" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "Ανώνυμο NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -949,36 +1111,46 @@ msgstr "" msgid "Unnamed rule" msgstr "Κανόνας χωρίς όνομα" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -988,17 +1160,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -1006,109 +1178,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Ζώνη ⇒ Διαβιβάσεις" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Ζώνες" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "αποδοχή" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "οποιαδήποτε" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "αγνόηση" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "απόρριψη" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1120,6 +1417,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/en/firewall.po b/package/luci/applications/luci-app-firewall/po/en/firewall.po index b8af6f0ad5..e7eaacb7d7 100644 --- a/package/luci/applications/luci-app-firewall/po/en/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/en/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2021-01-07 17:03+0000\n" -"Last-Translator: Liao junchao \n" -"Language-Team: English \n" +"Language-Team: English \n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -35,20 +35,28 @@ msgstr "" msgid "-- add IP --" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -77,7 +85,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -92,68 +100,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" -msgstr "Action" +msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Advanced Settings" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "" @@ -168,24 +186,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -193,23 +216,27 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "" @@ -220,7 +247,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -232,17 +259,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Destination address" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Destination port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Destination zone" @@ -250,72 +277,97 @@ msgstr "Destination zone" msgid "Device name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Drop invalid packets" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Enable SYN-flood protection" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "External port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Firewall" @@ -324,11 +376,15 @@ msgstr "Firewall" msgid "Firewall - Custom Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "" @@ -336,34 +392,35 @@ msgstr "" msgid "Firewall - Traffic Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Forward" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "" @@ -408,22 +465,55 @@ msgstr "" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "" @@ -431,9 +521,14 @@ msgstr "" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Input" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Internal IP address" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Internal port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "" @@ -469,11 +568,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "" @@ -481,15 +584,16 @@ msgstr "" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -497,25 +601,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSS clamping" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Masquerading" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -531,30 +635,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -566,8 +670,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -575,7 +679,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -583,79 +687,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Name" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Output" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -664,76 +794,94 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protocol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Redirect matched incoming traffic to the given port on the internal host" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Redirect matched incoming traffic to the specified internal host" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "" @@ -747,36 +895,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Source IP address" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Source address" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Source port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Source zone" @@ -786,44 +934,48 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -831,8 +983,8 @@ msgstr "" "The firewall creates zones over your network interfaces to control network " "traffic flow." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -842,7 +994,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -851,18 +1003,18 @@ msgid "" "networks
    specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -870,6 +1022,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -879,7 +1035,7 @@ msgid "" "ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -912,8 +1068,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "" @@ -921,18 +1077,24 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -941,36 +1103,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -980,17 +1152,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -998,109 +1170,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zones" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "accept" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "any" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "drop" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "reject" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1112,6 +1409,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/es/firewall.po b/package/luci/applications/luci-app-firewall/po/es/firewall.po index 7d0cd349d1..e62f208a48 100644 --- a/package/luci/applications/luci-app-firewall/po/es/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/es/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2022-06-13 21:19+0000\n" -"Last-Translator: Franco Castillo \n" -"Language-Team: Spanish \n" +"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 5.1\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -49,10 +49,18 @@ msgstr "" msgid "-- add IP --" msgstr "-- añadir IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- añadir MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -60,12 +68,12 @@ msgstr "" "Aceptar %{src?%{dest?reenvío:entrada}:" "salida}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" "Prevenir la reescritura de la fuente" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -104,7 +112,7 @@ msgstr "" "%{set_mark?Asignar:XOR} marca de " "cortafuegos%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Reescribir automáticamente la IP de " @@ -125,7 +133,7 @@ msgstr "" "Rechazar %{src?%{dest?reenvío:entrada}:" "salida}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -133,23 +141,23 @@ msgstr "" "Reescribir estáticamente a origen %{snat_ip?" "IP %{snat_ip}} %{snat_port?puerto %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "¡Se debe especificar una IP de reescritura!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACEPTAR - Desactivar reescritura de direcciones" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Acción" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -159,7 +167,7 @@ msgstr "" "tráfico de destino de la zona, p.e. -p tcp --dport 443 para que " "solo coincida con el tráfico HTTPS saliente." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -168,33 +176,45 @@ msgstr "" "tráfico de origen de zona, p.e. -p tcp --sport 443 para que " "solo coincida con el tráfico HTTPS entrante." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Familia de direcciones, la dirección IP interna debe coincidir" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" +"La familia de direcciones, la dirección de origen, la dirección de destino, " +"la dirección IP de reescritura debe coincidir" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" -msgstr "Configuración avanzada" +msgstr "Ajustes avanzados" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Permitir tráfico \"inválido\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Permitir reenvío desde zonas de origen:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Permitir reenvío a zonas de destino:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Cualquiera" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Cualquier día" @@ -212,28 +232,33 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "Aplique la clase o valor DSCP dado a las conexiones establecidas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" "Asigne el asistente de seguimiento de conexión especificado al tráfico " "coincidente." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Asignación automática de ayuda" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "Asigna automáticamente ayudantes de conntrack según el protocolo de tráfico " "y el puerto" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Comentario" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Configuraciones de Conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Ayudantes de Conntrack" @@ -241,23 +266,27 @@ msgstr "Ayudantes de Conntrack" msgid "Contents have been saved." msgstr "Se han guardado los contenidos." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Continuar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Contadores" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Interfaces cubiertas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Redes cubiertas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Subredes cubiertas" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Reglas personalizadas" @@ -272,7 +301,7 @@ msgstr "" "tras cualquier reinicio del Cortafuegos, justo tras haber cargado el " "conjunto de reglas predeterminadas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "Clasificación DSCP" @@ -284,17 +313,17 @@ msgstr "Marca DSCP" msgid "DSCP mark required" msgstr "Marca DSCP requerida" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Dirección de destino" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Puerto de destino" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Zona de destino" @@ -302,7 +331,7 @@ msgstr "Zona de destino" msgid "Device name" msgstr "Nombre del dispositivo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -311,68 +340,98 @@ msgstr "" "estado conntrack inválido. Esto puede ser necesario para " "configuraciones complejas de rutas asimétricas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Descartar paquetes inválidos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Activar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Activar bucle invertido de NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Activar protección contra inundaciones SYN" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Activar registro en esta zona" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Activa la dirección de red y la traducción de puertos IPv4 (NAT4 o NAPT4) " +"para el tráfico saliente en esta zona. Esto normalmente está activo en la " +"zona wan." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Activa la dirección de red y la traducción de puertos IPv6 (NAT6 o NAPT6) " +"para el tráfico saliente en esta zona." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Activado" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "Activa el seguimiento del conteo de paquetes y bytes para el conjunto." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Esperando: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Característica experimental. No es totalmente compatible con QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" "Elige explícitamente los ayudantes de seguimiento de conexión permitidos " "para el tráfico de zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Dirección IP externa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Puerto externo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Argumentos extra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Argumentos de destino adicionales" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Argumentos adicionales de iptables" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Argumentos fuente adicionales" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Familia" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Cortafuegos" @@ -381,11 +440,15 @@ msgstr "Cortafuegos" msgid "Firewall - Custom Rules" msgstr "Cortafuegos - Reglas personalizadas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Cortafuegos: Conjuntos de IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Cortafuegos - Reglas de NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Cortafuegos - Reenvío de puertos" @@ -393,39 +456,41 @@ msgstr "Cortafuegos - Reenvío de puertos" msgid "Firewall - Traffic Rules" msgstr "Cortafuegos - Reglas de tráfico" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Cortafuegos - Configuración de la zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Migración de configuración del Cortafuegos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Reenviar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Reenviar IPv4%{proto?, protocolo %{proto#%{next?, }%{item.name}}}%{mark?, marca IPv4 y IPv6:IPv6}:" +"IPv4}%{proto? , protocolo %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Viernes" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Configuración general" @@ -491,32 +556,70 @@ msgstr "Configuración general" msgid "Grant access to firewall configuration" msgstr "Conceder acceso a la configuración del Cortafuegos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Descarga de flujo por hardware" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (rango)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "Conjuntos de IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IPs/Redes" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IPs/Redes/MACs" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 e IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" -msgstr "Sólo IPv4" +msgstr "Solo IPv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "Enmascarar la IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" -msgstr "Sólo IPv6" +msgstr "Solo IPv6" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 msgid "Inbound device" msgstr "Dispositivo de entrada" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Incluir archivo" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"IPv4 entrante%{proto?, protocolo %{proto#%{next?, }%{item.types?%{item.name}ICMP " -"con tipos %{item.types#%{next?, }%{item}}:" -"%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, ayudante %{helper.inv?" -"%{helper.val}:%{helper." -"val}}}" +"%{ipv6?%{ipv4?IPv4 y IPv6:IPv6}:IPv4}%{proto? , protocolo %{proto#%{next?, }%{item.types?%{item.name}ICMP con tipos % " +"{item.types#%{next?, }%{item}}:%{item.name}}}}%{ marca?, marca %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Tamaño de hash inicial" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Entrada" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Dirección IP interna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Puerto interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Zona interna" @@ -562,11 +669,15 @@ msgstr "Marca DSCP inválida" msgid "Invalid limit value" msgstr "Valor límite no válido" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "Nombre del conjunto no válido" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Límite de ráfaga" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Limitar registro de mensajes" @@ -574,9 +685,9 @@ msgstr "Limitar registro de mensajes" msgid "Limit matching" msgstr "Limitar coincidencia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -584,7 +695,8 @@ msgstr "" "Limitar coincidencia a %{limit.num} paquetes por %{limit." "unit}%{limit.burst? interrumpir %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Enmascaramiento limitado activado" @@ -592,26 +704,26 @@ msgstr "Enmascaramiento limitado activado" msgid "Limits traffic matching to the specified rate." msgstr "Limita el tráfico que coincide con la velocidad especificada." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "IP de origen de bucle invertido" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" "MASQUERADE - Reescribir automáticamente a la IP de la interfaz de salida" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "Sujeción MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Enmascaramiento" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Coincidir" @@ -627,34 +739,34 @@ msgstr "Coincidir con tipo ICMP" msgid "Match device" msgstr "Dispositivo de coincidencia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "Haga coincidir el tráfico reenviado dirigido a la dirección IP dada." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "Haga coincidir el tráfico reenviado dirigido al puerto de destino o rango de " "puertos dados." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "Haga coincidir el tráfico reenviado desde esta IP o rango." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "Haga coincidir el tráfico reenviado que se origina en el puerto fuente o " "rango de puertos dados." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "Ayudante de partido" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -666,8 +778,8 @@ msgstr "" msgid "Match mark" msgstr "Marca de partido" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" "Haga coincidir el tráfico con el ayudante de seguimiento de conexión " @@ -679,7 +791,7 @@ msgstr "" "Coincide con una marca de Cortafuegos específica o un rango de marcas " "diferentes." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" "Coincide con el tráfico reenviado utilizando el dispositivo de red saliente " @@ -689,6 +801,14 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "Coincide con el tráfico que lleva la marca DSCP especificada." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Máximo de entradas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Longitud máxima" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -698,22 +818,22 @@ msgstr "" "recarga en uno cada vez que no se alcanza el límite especificado " "anteriormente, hasta este número." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Lunes" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Días del mes" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "Reglas de NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -721,26 +841,32 @@ msgstr "" "Las reglas de NAT permiten un control detallado sobre la IP de origen para " "el tráfico saliente o reenviado." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Nombre" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Máscara de red" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Coincidir sólo con tráfico de entrada a esta dirección IP." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Coincidir sólo con tráfico de entrada desde estas MACs." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Coincidir sólo con tráfico de entrada desde esta IP o rango." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -749,26 +875,43 @@ msgstr "" "origen o el rango de puertos en el host del cliente" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Dispositivo de salida" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Zona de salida" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Salida" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Emparejar los paquetes" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Campos de paquetes para hacer coincidir.
    Sintaxis: " +"direction_datatype. p.e.: src_port, dest_net.
    Direcciones: src, dst. Tipos de datos: ip, port, mac, " +"net, set.
    Los prefijos de dirección son opcionales.
    *Nota: " +"el tipo de dato set no es compatible con fw4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "Ingrese argumentos adicionales a iptables. ¡Utilícelo con cuidado!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -783,12 +926,16 @@ msgstr "" "conjunto de reglas del cortafuegos se rompa, exponiendo completamente todos " "los servicios." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "Ruta al archivo de CIDR, subredes, IP de host, etc.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Reenvío de puertos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -796,71 +943,84 @@ msgstr "" "El reenvío de puertos permite a ordenadores remotos en internet conectar a " "un ordenador o servicio específico en la LAN privada." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Rango de puertos" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protocolo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Redirigir el tráfico de entrada que coincida al puerto dado en el host " "interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" "Redirigir el tráfico de entrada que coincida al host interno especificado" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "" -"Requiere soporte de NAT por hardware. Implementado al menos para mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Consulta el Conjunto externo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "Zonas de reflexión" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Requiere soporte de NAT por hardware." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Restringir enmascaramiento a las subredes destino" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Restringir enmascaramiento a las subredes origen" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" -msgstr "Restringir a la familia de direcciones" +msgstr "Restringir para dirigirse a la familia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "Reescribir dirección IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" "Reescribe el tráfico coincidente a la dirección IP de origen especificada." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Reescribe el tráfico coincidente al puerto de origen o rango de puertos " "especificados." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Reescribir puerto" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Enrutamiento/Descarga de NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Reescribe a una fuente específica IP o puerto" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Sábado" @@ -877,36 +1037,36 @@ msgstr "" "es el valor [/máscara]. Si se especifica una máscara, sólo se modifican los " "bits establecidos en la máscara." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Descarga basada en software para enrutamiento/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Descarga de flujo por software" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Dirección IP de origen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Dirección MAC de origen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Dirección de origen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Puerto de origen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Zona de origen" @@ -918,7 +1078,7 @@ msgstr "" "Especifica si se debe vincular esta regla de tráfico a un dispositivo de red " "entrante o saliente específico." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -926,32 +1086,36 @@ msgstr "" "Especifica si se debe usar la dirección IP externa o interna para el tráfico " "reflejado." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Fecha de inicio (aaaa-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Hora de inicio (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Fecha de finalización (aaaa-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Hora de finalización (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Método de almacenamiento" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Domingo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -959,7 +1123,7 @@ msgstr "" "La configuración del cortafuegos existente debe cambiarse para que LuCI " "funcione correctamente." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -967,8 +1131,8 @@ msgstr "" "El Cortafuegos crea zonas sobre sus interfaces de red para controlar el " "flujo del tráfico." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -985,7 +1149,7 @@ msgstr "" "la LAN a la WAN no implica permiso para reenviar desde la WAN a la " "LAN también." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -994,24 +1158,24 @@ msgid "" "networks specifies which available networks are members of this zone." msgstr "" "Esta sección define propiedades comunes de %q. Las opciones de entrada y la salida marcan las políticas por defecto para el tráfico " -"que entra y deja esta zona mientras que la opción reenvío describe " -"la política para tráfico reenviado desde diferentes redes en la zona. " -"Redes cubiertas especifican qué redes disponibles son miembros de " +"em> y salida marcan las políticas por defecto para el tráfico que " +"entra y sale de esta zona mientras que la opción reenviar describe " +"la política para tráfico reenviado entre diferentes redes dentro de la zona. " +"Redes cubiertas especifica qué redes disponibles son miembros de " "esta zona." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Jueves" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Restricciones de tiempo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Tiempo en UTC" @@ -1019,6 +1183,10 @@ msgstr "Tiempo en UTC" msgid "Time restrictions are enabled for this rule" msgstr "Las restricciones de tiempo están activadas para esta regla" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Se acabó el tiempo" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1033,7 +1201,7 @@ msgstr "" "puerto %{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, puerto %{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Ayudante de seguimiento" @@ -1078,8 +1246,8 @@ msgstr "" "diferentes zonas, por ejemplo, para rechazar el tráfico entre ciertos hosts " "o para abrir puertos WAN en el enrutador." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Martes" @@ -1087,18 +1255,26 @@ msgstr "Martes" msgid "Unable to save contents: %s" msgstr "No se puede guardar el contenido: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" +"Unidad: segundos. El 0 predeterminado significa que la entrada " +"se agrega permanentemente al conjunto.
    Máx.: 2147483 segundos." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "Ayudante de Conntrack desconocido o no instalado \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "NAT sin nombre" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Reenvío sin nombre" @@ -1107,15 +1283,19 @@ msgstr "Reenvío sin nombre" msgid "Unnamed rule" msgstr "Regla sin nombre" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Conjunto sin nombre" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Zona sin nombre" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Protocolo no reconocido" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1125,15 +1305,21 @@ msgstr "" "\"SNAT\" de destino se convertirán en secciones \"nat\" y el cortafuegos se " "reiniciará para aplicar la configuración actualizada." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Usar dirección IP externa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Usar dirección IP interna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Usar ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1141,7 +1327,7 @@ msgstr "" "Use esta opción para clasificar el tráfico de zona por raw, dispositivos de " "red no administrados uci." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1153,17 +1339,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Se requiere una marca de cortafuegos válida" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Miércoles" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Días de la semana" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "Marca de cortafuegos XOR" @@ -1171,109 +1357,241 @@ msgstr "Marca de cortafuegos XOR" msgid "XOR mark" msgstr "Marca XOR" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "Su dispositivo no ejecuta firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "Su dispositivo ejecuta firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zona ⇒ Reenvíos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zonas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" +"Zonas a partir de las cuales se crearán las reglas de reflexión. Si no está " +"configurado, solo se utiliza la zona de destino." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "aceptar" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "cualquiera" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "cualquier zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "cualquiera/todos" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "aplicar marca de cortafuegos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "asignar ayudante de Conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "automático" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bitmap" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "bitmap es solo ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "día" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: IP de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: Dirección MAC de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: (Sub)red de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: Puerto de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: conjunto de ips de destino*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "no reescribir" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "no seguir" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "descartar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"firewall4 admite la referencia y la creación de conjuntos de IP para " +"simplificar la coincidencia de listas de direcciones grandes sin la " +"necesidad de crear una regla por elemento para que coincida. Firewall4 no " +"admite rangos de puertos en ipsets.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "fromport-toport" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "hora" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: Dirección IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" +"ip[/cidr]
    Para usar con los tipos de datos de iguales:*_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "lista" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: Dirección MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macaddr|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "minuto" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "net: (Sub)red" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "port: Puerto" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "rechazar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "segundo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set: ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: IPset de origen*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: IP de origen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: Dirección MAC de origen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: (Sub)red de origen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Puerto de origen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "este dispositivo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "esta nueva zona" @@ -1285,6 +1603,11 @@ msgstr "ilimitado" msgid "unspecified" msgstr "sin especificar" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "hasta 65536 entradas." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "marca de cortafuegos válida" diff --git a/package/luci/applications/luci-app-firewall/po/fa/firewall.po b/package/luci/applications/luci-app-firewall/po/fa/firewall.po index 59bb69f48c..416fca6461 100644 --- a/package/luci/applications/luci-app-firewall/po/fa/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/fa/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2022-08-27 19:33+0000\n" -"Last-Translator: reza \n" -"Language-Team: Persian \n" +"Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -42,28 +42,35 @@ msgstr "" "name}}\">%{dscp.val}:%{dscp.val}}}%{helper?, helper " "%{helper.inv?%{helper.val}:%{helper." -"val}}}\n" -"Persian" +"val}}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 msgid "-- add IP --" msgstr "-- افزودن IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- افزودن مک آدرس --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" "تایید %{src?%{dest?forward:input}:output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "جلوگیری از منبع بازنویسی" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -101,7 +108,7 @@ msgstr "" "%{set_mark?Assign:XOR} علامت فایروال " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "باز نویسی خودکار منبع ایپی" @@ -110,74 +117,95 @@ msgid "" "Do not track %{src?%{dest?forward:input}:" "output}" msgstr "" +"{src?%{dest?forward:input}:output}% رديابي نکن " #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:121 msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" +"لغو %{src?%{dest?forward:input}:output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" +"بازنویسی ایستا به منبع %{snat_ip?IP " +"%{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" -msgstr "" +msgstr "یک IP بازنویسی شده باید مشخص شود!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" -msgstr "" +msgstr "تایید - بازنویسی آدرس غیر فعال شد" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "اجرا" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" +"استدلال های خام اضافی iptables برای طبقه بندی ترافیک مقصد منطقه، به " +"عنوان مثال. -p tcp --dport 443 فقط برای مطابقت با ترافیک خروجی " +"HTTPS." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" +"استدلال های خام اضافی iptables برای طبقه بندی ترافیک مقصد منطقه، به " +"عنوان مثال. -p tcp --dport 443 فقط برای مطابقت با ترافیک ورودی " +"HTTPS." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "تنظیمات پیشرفته" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" -msgstr "اجازه دادن به ترافیک «نامعتبر»" +msgstr "پذیرش ترافیک \"نامعتبر\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" -msgstr "" +msgstr "اجازه به جلو از مناطق منبع:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" -msgstr "" +msgstr "اجازه به جلو بهمناطق مقصد:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "هر" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "هر روز" @@ -187,55 +215,68 @@ msgid "" "established connections. Format is value[/mask]. If a mask is specified then " "those bits set in the mask are zeroed out." msgstr "" +"یک XOR بیتی از مقدار داده شده و مقدار علامت موجود روی اتصالات ایجاد شده " +"اعمال کنید. قالب مقدار[ / mask] است. اگر یک ماسک مشخص شده باشد، آن بیت های " +"تنظیم شده در ماسک صفر می شوند." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Apply the given DSCP class or value to established connections." -msgstr "" +msgstr "کلاس یا مقدار DSCP داده شده را برای اتصالات ایجاد شده اعمال کنید." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." -msgstr "" +msgstr "کمک ردیابی اتصال مشخص شده را به ترافیک همسان اختصاص دهید." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" -msgstr "" +msgstr "واگذاری کمک کننده خودکار" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" +"به طور خودکار کمک های conntrack را بر اساس پروتکل ترافیک و پورت اختصاص دهید" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 -msgid "Conntrack Settings" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 +msgid "Conntrack Settings" +msgstr "تنظیمات Conntrack" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" -msgstr "" +msgstr "کمک کنندگان Conntrack" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:16 msgid "Contents have been saved." -msgstr "" +msgstr "محتویات ذخیره شده اند." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" +msgstr "ادامه" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" -msgstr "" +msgstr "دستگاه های تحت پوشش" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" -msgstr "" +msgstr "شبکه های تحت پوشش" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" -msgstr "" +msgstr "زیرشبکه های تحت پوشش" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" -msgstr "" +msgstr "قوانین سفارشی" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:26 msgid "" @@ -243,151 +284,189 @@ msgid "" "otherwise covered by the firewall framework. The commands are executed after " "each firewall restart, right after the default ruleset has been loaded." msgstr "" +"قوانین سفارشی به شما این امکان را می دهد که دستورات iptables دلخواه را اجرا " +"کنید که در غیر این صورت تحت پوشش چارچوب فایروال قرار نمی گیرند. دستورات پس " +"از راه اندازی مجدد هر فایروال، درست پس از بارگذاری قوانین پیش فرض اجرا می " +"شوند." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" -msgstr "" +msgstr "طبقه بندی DSCP" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 msgid "DSCP mark" -msgstr "" +msgstr "علامت DSCP" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:296 msgid "DSCP mark required" -msgstr "" +msgstr "علامت مورد نیاز DSCP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" -msgstr "" +msgstr "آدرس مقصد" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" -msgstr "" +msgstr "پورت مقصد" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" -msgstr "" +msgstr "منطقه مقصد" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:268 msgid "Device name" -msgstr "" +msgstr "نام دستگاه" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" +"قوانین اضافی برای رد ترافیک ارسال شده با حالت conntrack نصب " +"نکنیدنامعتبر. این ممکن است برای راه اندازی مسیر نامتقارن پیچیده " +"مورد نیاز باشد." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" -msgstr "" +msgstr "رها کردن بسته های نامعتبر" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" -msgstr "" +msgstr "فعال کردن" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" -msgstr "" +msgstr "فعال کردن NAT Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" -msgstr "" +msgstr "محافظت SYN-flood را فعال کردن" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" +msgstr "فعال کردن ورود به سیستم در این منطقه" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" -msgstr "" +msgstr "انتظار: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." -msgstr "" +msgstr "ویژگی آزمایشی.به طور کامل با QoS / SQM سازگار نیست." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" +"به صراحت راهنماهای ردیابی اتصال مجاز را برای ترافیک منطقه انتخاب می کند" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" -msgstr "" +msgstr "آدرس IP خارجی" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" -msgstr "" +msgstr "پورت خارجی" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" -msgstr "" +msgstr "استدلال های اضافی" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" -msgstr "" +msgstr "استدلال های اضافی مقصد" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" -msgstr "" +msgstr "استدلال های اضافی iptables" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" +msgstr "استدلال های اضافی منبع" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" msgstr "" #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" -msgstr "" +msgstr "فایروال" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:25 msgid "Firewall - Custom Rules" +msgstr "فایروال - قوانین سفارشی" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" -msgstr "" +msgstr "فایروال - قوانین NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" -msgstr "" +msgstr "فایروال-پورت رو به جلو" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:173 msgid "Firewall - Traffic Rules" -msgstr "" +msgstr "فایروال - قوانین ترافیک" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" -msgstr "" +msgstr "فایروال - تنظیمات منطقه" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" -msgstr "" +msgstr "انتقال پیکربندی فایروال" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" -msgstr "" +msgstr "رو به جلو" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" -msgstr "" +msgstr "جمعه" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item." "ival}}}" msgstr "" +"From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }" +"%{item." +"ival}}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:64 msgid "" @@ -407,8 +491,16 @@ msgid "" "name}}.\":%{item.hint.name? data-tooltip=\"%{item.hint.name}\"}}>%{item.ival}" "}}" msgstr "" +"From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }" +"%{item." +"ival}}}%{src_mac?, MAC %{src_mac#%{next?, }%{item.ival}" +"}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" +"From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }%{item.ival}}}%{src_mac?, " +"MAC %{src_mac#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "تنظیمات عمومی" #: applications/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json:3 msgid "Grant access to firewall configuration" -msgstr "" +msgstr "اجازه دسترسی به پیکربندی فایروال" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" +msgstr "تخلیه جریان سخت افزار" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" -msgstr "" +msgstr "IPv4 و IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" +msgstr "فقط IPv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" -msgstr "" +msgstr "فقط IPv6" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 msgid "Inbound device" +msgstr "دستگاه ورودی" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 -msgid "Input" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +msgid "Input" +msgstr "ورودی" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" -msgstr "" +msgstr "آدرس IP داخلی" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" -msgstr "" +msgstr "پورت داخلی" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" -msgstr "" +msgstr "منطقه داخلی" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:304 msgid "Invalid DSCP mark" -msgstr "" +msgstr "علامت DSCP نامعتبر است" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:372 msgid "Invalid limit value" +msgstr "مقدار حد نامعتبر است" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" -msgstr "" +msgstr "ترکیدگی را محدود کنید" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" -msgstr "" +msgstr "محدود کردن پیام های گزارش" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:348 msgid "Limit matching" -msgstr "" +msgstr "محدود کردن تطابق" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" +"محدود کردن تطابق به %{limit.num} بسته ها در هر %{limit.unit}" +"%{limit.burst? burst %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" -msgstr "" +msgstr "مخفی کاری محدود فعال شد" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:349 msgid "Limits traffic matching to the specified rate." -msgstr "" +msgstr "تطابق ترافیک را با نرخ مشخص شده محدود می کند." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" -msgstr "" +msgstr "IP منبع Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" -msgstr "" +msgstr "بالماسکه - به طور خودکار در IP رابط خروجی بازنویسی شود" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" -msgstr "" +msgstr "بستن MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" -msgstr "" +msgstr "ماسکه کردن" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" -msgstr "" +msgstr "همخوانی داشتن" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 msgid "Match DSCP" -msgstr "" +msgstr "DSCP را مطابقت دهید" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:292 msgid "Match ICMP type" -msgstr "" +msgstr "با نوع ICMP مطابقت دهید" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:248 msgid "Match device" -msgstr "" +msgstr "دستگاه مطابق" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." -msgstr "" +msgstr "با ترافیک ارسال شده به آدرس IP داده شده مطابقت دهید." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" +"با ترافیک ارسالی هدایت شده در پورت مقصد یا محدوده پورت مشخص مطابقت دهید." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." -msgstr "" +msgstr "با ترافیک ارسال شده از این IP یا محدوده مطابقت دهید." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" +"با ترافیک ارسال شده منشأ گرفته از درگاه منبع پورت یا محدوده پورت داده شده " +"مطابقت دهید." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" -msgstr "" +msgstr "کمک کننده به همخوانی" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" msgstr "" +"با ترافیک ورودی هدایت شده به درگاه مقصد پورت یا محدوده پورت داده شده در این " +"میزبان مطابقت دهید" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "Match mark" -msgstr "" +msgstr "علامت مطابقت" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." -msgstr "" +msgstr "با استفاده از راهنمای ردیابی اتصال مشخص شده، ترافیک را مطابقت دهید." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:318 msgid "Matches a specific firewall mark or a range of different marks." -msgstr "" +msgstr "با یک علامت فایروال خاص یا طیف وسیعی از علامت های مختلف مطابقت دارد." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" +"با استفاده از دستگاه شبکه خروجی مشخص شده با ترافیک ارسال شده مطابقت دارد." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Matches traffic carrying the specified DSCP marking." +msgstr "با ترافیک حامل علامت DSCP مشخص شده مطابقت دارد." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 @@ -610,74 +772,98 @@ msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" +"حداکثر تعداد بسته های اولیه برای مطابقت: این تعداد هر بار که به حد تعیین شده " +"در بالا نرسیده باشد، تا این تعداد , یک بار شارژ می شود." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" -msgstr "" +msgstr "دوشنبه" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" -msgstr "" +msgstr "روزهای ماه" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" -msgstr "" +msgstr "قوانین NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" +"قوانین NAT اجازه می دهد تا کنترل دقیق روی IP منبع برای ترافیک خروجی یا ارسال " +"شده استفاده شود." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "نام" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 -msgid "Only match incoming traffic directed at the given IP address." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 +msgid "Only match incoming traffic directed at the given IP address." +msgstr "فقط با ترافیک ورودی هدایت شده در آدرس IP داده شده مطابقت دهید." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." -msgstr "" +msgstr "فقط ترافیک ورودی از این MACها را مطابقت دهید." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." -msgstr "" +msgstr "فقط ترافیک ورودی از این IP یا محدوده را مطابقت دهید." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" +"فقط با ترافیک ورودی که از پورت منبع یا محدوده پورت داده شده در میزبان مشتری " +"منشا می‌گیرد، مطابقت دهید" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" -msgstr "" +msgstr "دستگاه خروجی" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" -msgstr "" +msgstr "منطقه خروجی" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" +msgstr "خروجی" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 -msgid "Passes additional arguments to iptables. Use with care!" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 +msgid "Passes additional arguments to iptables. Use with care!" +msgstr "آرگومان های اضافی را به iptables ارسال می کند. با احتیاط استفاده کنید!" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -685,173 +871,212 @@ msgid "" "invalid values could render the firewall ruleset broken, completely exposing " "all services." msgstr "" +"ارسال آرگومان‌های خام iptables به قوانین طبقه‌بندی ترافیک مبدأ و مقصد، امکان " +"تطبیق بسته‌ها را بر اساس معیارهای دیگری غیر از رابط‌ها یا زیرشبکه‌ها فراهم " +"می‌کند. این گزینه‌ها باید با دقت زیاد مورد استفاده قرار گیرند، زیرا مقادیر " +"نامعتبر می‌توانند مجموعه قوانین فایروال را شکسته و به طور کامل همه سرویس‌ها را " +"در معرض دید قرار دهند." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" -msgstr "" +msgstr "هدایت پورت" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" +"ارسال پورت به رایانه های راه دور در اینترنت اجازه می دهد تا به رایانه یا " +"سرویس خاصی در شبکه LAN خصوصی متصل شوند." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" -msgstr "" +msgstr "پروتکل" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" -msgstr "" +msgstr "ترافیک ورودی منطبق را به پورت داده شده در میزبان داخلی تغییر مسیر دهید" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" +msgstr "ترافیک ورودی منطبق را به میزبان داخلی مشخص شده تغییر مسیر دهید" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "نیاز به پشتیبانی سخت افزاری NAT دارد." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" -msgstr "" +msgstr "Masquerading را به زیرشبکه‌های مقصد مشخص محدود کنید" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" -msgstr "" +msgstr "Masquerading را به زیرشبکه های منبع داده شده محدود کنید" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" -msgstr "" +msgstr "محدود کردن به آدرس خانواده" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" -msgstr "" +msgstr "آدرس IP را بازنویسی کنید" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." -msgstr "" +msgstr "ترافیک منطبق را به آدرس IP منبع مشخص شده بازنویسی کنید." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" +"ترافیک منطبق را در درگاه منبع پورت یا محدوده پورت مشخص شده بازنویسی کنید." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" -msgstr "" +msgstr "بازنویسی پورت" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" -msgstr "" +msgstr "بارگذاری مسیریابی/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" -msgstr "" +msgstr "SNAT - در IP یا پورت منبع خاصی بازنویسی کنید" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" -msgstr "" +msgstr "شنبه" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "Set mark" -msgstr "" +msgstr "علامت گذاری" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:317 msgid "" "Set the given mark value on established connections. Format is value[/mask]. " "If a mask is specified then only those bits set in the mask are modified." msgstr "" +"مقدار علامت داده شده را روی اتصالات ایجاد شده تنظیم کنید. قالب مقدار[/mask] " +"است. اگر یک ماسک مشخص شده باشد، فقط آن بیت هایی که در ماسک تنظیم شده اند، " +"اصلاح می شوند." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" -msgstr "" +msgstr "تخیله کردن مبتنی بر نرم افزار برای مسیریابی/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" -msgstr "" +msgstr "تخلیه جریان نرم افزار" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" -msgstr "" +msgstr "آدرس IP منبع" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" -msgstr "" +msgstr "آدرس MAC منبع" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" -msgstr "" +msgstr "آدرس منبع" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" -msgstr "" +msgstr "پورت منبع" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" -msgstr "" +msgstr "منطقه منبع" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:269 msgid "" "Specifies whether to tie this traffic rule to a specific inbound or outbound " "network device." msgstr "" +"مشخص می کند که آیا این قانون ترافیک به یک دستگاه شبکه ورودی یا خروجی خاص " +"مرتبط شود." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" +"مشخص می کند که آیا از آدرس IP خارجی یا داخلی برای ترافیک منعکس شده استفاده " +"شود." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" -msgstr "" +msgstr "تاریخ شروع (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" -msgstr "" +msgstr "زمان شروع (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" -msgstr "" +msgstr "تاریخ توقف (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" +msgstr "زمان توقف (hh:mm:ss)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" -msgstr "" +msgstr "یکشنبه" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." -msgstr "" +msgstr "پیکربندی فایروال موجود باید تغییر کند تا LuCI به درستی کار کند." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" +"فایروال مناطقی را روی رابط های شبکه شما ایجاد می کند تا جریان ترافیک شبکه را " +"کنترل کند." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -860,8 +1085,14 @@ msgid "" "rule is unidirectional, e.g. a forward from lan to wan does " "not imply a permission to forward from wan to lan as well." msgstr "" +"گزینه های زیر خط مشی های حمل و نقل بین این منطقه (%s) و مناطق دیگر را کنترل " +"می کنند. مناطق مقصد ترافیک ارسال‌شده منشاء %q را " +"پوشش می‌دهند. مناطق منبع با ترافیک بازارسال شده از مناطق دیگر مطابقت " +"دارد با هدف %q. قانون ارسال یک جهته است، به عنوان " +"مثال. فوروارد از lan به wan نیست مستلزم اجازه فوروارد از wan به lan " +"نیز نیست." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -869,24 +1100,33 @@ msgid "" "forwarded traffic between different networks within the zone. Covered " "networks specifies which available networks are members of this zone." msgstr "" +"این بخش ویژگی های رایج %q را تعریف می کند. گزینه‌های input و " +"output خط‌مشی‌های پیش‌فرض را برای ترافیک ورودی و خروجی از این منطقه " +"تنظیم می‌کنند در حالی که گزینه forward خط‌مشی برای ترافیک ارسال‌شده " +"بین شبکه‌های مختلف را شرح می‌دهد. در داخل منطقه شبکه های تحت پوشش " +"مشخص می کند که کدام شبکه های موجود عضو این منطقه هستند." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" -msgstr "" +msgstr "پنج شنبه" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" -msgstr "" +msgstr "محدودیت های زمانی" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" -msgstr "" +msgstr "زمان در UTC" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:243 msgid "Time restrictions are enabled for this rule" +msgstr "محدودیت زمانی برای این قانون فعال شده است" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 @@ -897,8 +1137,13 @@ msgid "" "%{item." "ival}
    }}" msgstr "" +"To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " +"%{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }" +"%{item." +"ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" +"To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port " +"%{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" msgstr "" +"To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" -msgstr "" +msgstr "کمک کننده ردیابی" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:176 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:35 msgid "Traffic Rules" -msgstr "" +msgstr "قوانین ترافیک" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:174 msgid "" @@ -930,207 +1184,363 @@ msgid "" "for example to reject traffic between certain hosts or to open WAN ports on " "the router." msgstr "" +"قوانین ترافیک سیاست هایی را برای بسته هایی که بین مناطق مختلف حرکت می کنند، " +"تعریف می کنند، به عنوان مثال برای رد ترافیک بین میزبان های خاص یا باز کردن " +"پورت های WAN روی روتر." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" -msgstr "" +msgstr "سه شنبه" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:19 msgid "Unable to save contents: %s" +msgstr "امکان ذخیره محتوا وجود ندارد: %s" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" -msgstr "" +msgstr "راهنمای کنتراک ناشناخته یا نصب نشده\"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" -msgstr "" +msgstr "NAT بدون نام" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" -msgstr "" +msgstr "فوروارد بدون نام" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:210 msgid "Unnamed rule" +msgstr "قانون بدون نام" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" -msgstr "" +msgstr "منطقه بدون نام" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" -msgstr "" +msgstr "پروتکل ناشناخته" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" +"با فشار دادن \"Continue\"، بخش‌های \"redirect\" با هدف \"SNAT\" به بخش‌های " +"\"nat\" تبدیل می‌شوند و فایروال برای اعمال پیکربندی به‌روز شده مجددا راه‌اندازی " +"می‌شود." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" -msgstr "" +msgstr "از آدرس IP خارجی استفاده کنید" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" +msgstr "از آدرس IP داخلی استفاده کنید" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" +"از این گزینه برای طبقه بندی ترافیک منطقه بر اساس دستگاه های شبکه مدیریت شده " +"خام و غیرuci استفاده کنید." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." msgstr "" +"از این گزینه برای طبقه بندی ترافیک منطقه بر اساس زیرشبکه مبدا یا مقصد به جای " +"شبکه ها یا دستگاه ها استفاده کنید." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:330 msgid "Valid firewall mark required" -msgstr "" +msgstr "علامت فایروال معتبر لازم است" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" -msgstr "" +msgstr "چهار شنبه" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" -msgstr "" +msgstr "روزهای هفته" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" -msgstr "" +msgstr "علامت فایروال XOR" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "XOR mark" +msgstr "علامت XOR" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 -msgid "Zone ⇒ Forwardings" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 +msgid "Zone ⇒ Forwardings" +msgstr "فوروارد ⇒منطقه" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" +msgstr "مناطق" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" -msgstr "" +msgstr "تایید" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" -msgstr "" +msgstr "هر" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" +msgstr "هر منطقه" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" -msgstr "" +msgstr "علامت فایروال را اعمال کنید" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" +msgstr "اختصاص کمک کننده conntrack" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" +msgstr "روز" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 -msgid "do not rewrite" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 -msgid "don't track" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 +msgid "do not rewrite" +msgstr "بازنویسی نکنید" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 +msgid "don't track" +msgstr "پیگیری نکنید" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" +msgstr "رها کردن" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" +msgstr "ساعت" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" +msgstr "دقیقه" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 -msgid "reject" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +msgid "reject" +msgstr "رد کردن" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" +msgstr "ثانیه" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" -msgstr "" +msgstr "این دستگاه" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" -msgstr "" +msgstr "این منطقه جدید" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:353 msgid "unlimited" -msgstr "" +msgstr "نامحدود" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:250 msgid "unspecified" +msgstr "نامشخص" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" -msgstr "" +msgstr "علامت فایروال معتبر" diff --git a/package/luci/applications/luci-app-firewall/po/fi/firewall.po b/package/luci/applications/luci-app-firewall/po/fi/firewall.po index 93b1626f10..106c25e8e3 100644 --- a/package/luci/applications/luci-app-firewall/po/fi/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/fi/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2022-03-13 12:25+0000\n" +"PO-Revision-Date: 2023-10-18 05:43+0000\n" "Last-Translator: Jiri Grönroos \n" -"Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 5.1\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -48,10 +48,18 @@ msgstr "" msgid "-- add IP --" msgstr "- lisää IP -" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "- lisää MAC -" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -59,11 +67,11 @@ msgstr "" " Hyväksy %{src?%{dest?välitä:tuleva}:" "lähtevä}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Estä lähteen uudelleenkirjoitus" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -101,7 +109,7 @@ msgstr "" "%{set_mark?Assign:XOR} palomuurimerkintä " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" " Uudelleenkirjoita automaattisesti " @@ -122,7 +130,7 @@ msgstr "" "Hylkää %{src?%{dest?välitä:tuleva}:" "lähtevä}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -131,23 +139,23 @@ msgstr "" "%{snat_ip? IP-%{snat_ip}} %{snat_port?portti {snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Uudelleenkirjoitus IP on määritettävä!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "HYVÄKSY - Uudelleenkirjoittamatta osoitetta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Toiminta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -157,7 +165,7 @@ msgstr "" "luokittelemiseksi, esimerkiksi -p tcp --dport 443 vastaa vain " "lähtevää HTTPS-liikennettä." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -166,33 +174,43 @@ msgstr "" "luokittelemiseksi, esimerkiksi -p tcp --dport 443 vastaa vain " "lähtevää HTTPS-liikennettä." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Lisäasetukset" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Salli \"virheellinen\" liikenne" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Salli välitys lähdevyöhykkeeltä:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Salli välitys kohdevyöhykkeelle:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Mikä tahansa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Minä päivänä tahansa" @@ -209,25 +227,30 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "Käytä annettua DSCP-luokkaa tai arvoa muodostetuille yhteyksille." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "Määritä yhteysseurantaapuri vastaavalle liikenteelle." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Automaattinen avustajan määritys" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "Määritä yhteysseurantaapuri automaattisesti protokollan ja portin perusteella" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Kommentti" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Conntrack-asetukset" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Conntrack-auttajat" @@ -235,23 +258,27 @@ msgstr "Conntrack-auttajat" msgid "Contents have been saved." msgstr "Sisältö on tallennettu." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Jatka" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Katetut laitteet" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Katetut verkot" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Katetut aliverkot" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Mukautetut säännöt" @@ -266,7 +293,7 @@ msgstr "" "palomuurin uudelleenkäynnistyksen jälkeen heti oletussääntöjoukon lataamisen " "jälkeen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "DSCP-luokitus" @@ -278,17 +305,17 @@ msgstr "DSCP-merkki" msgid "DSCP mark required" msgstr "DSCP-merkki vaaditaan" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Kohdeosoite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Kohdeportti" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Kohdevyöhyke" @@ -296,7 +323,7 @@ msgstr "Kohdevyöhyke" msgid "Device name" msgstr "Laitenimi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -305,66 +332,91 @@ msgstr "" "conntrack-tila on virheellinen . Tätä voidaan tarvita " "monimutkaisissa epäsymmetrisissä reittiasetuksissa." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Pudota virheelliset paketit" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Ota käyttöön" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Ota käyttöön NAT Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Käytä SYN-flood-suojausta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Ota kirjaaminen käyttöön tällä vyöhykkeellä" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Käytössä" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Odotettiin: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Kokeellinen ominaisuus. Ei täysin yhteensopiva QoS/SQM:n kanssa." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "Valitse käsin sallivat yhteydenseuranta-apurit vyöhykeliikenteelle" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Ulkoinen IP-osoite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Ulkoinen portti" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Ylimääräiset argumentit" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Lisäkohdeargumentit" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Iptablesin lisäargumentit" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Lisälähdeargumentit" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Palomuuri" @@ -373,11 +425,15 @@ msgstr "Palomuuri" msgid "Firewall - Custom Rules" msgstr "Palomuuri - Mukautetut säännöt" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Palomuuri - NAT-säännöt" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Palomuuri - Portin välitys" @@ -385,38 +441,35 @@ msgstr "Palomuuri - Portin välitys" msgid "Firewall - Traffic Rules" msgstr "Palomuuri - Liikennesäännöt" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Palomuuri - vyöhykeasetukset" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Palomuurin määritysten siirto" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Välitä" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Välitetty IPv4%{proto?, protokolla %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Perjantai" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item." "ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Yleiset asetukset" @@ -482,22 +535,55 @@ msgstr "Yleiset asetukset" msgid "Grant access to firewall configuration" msgstr "Anna pääsy palomuurin määrityksiin" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Laitteistovirran purku" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IP:t/verkot" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IP:t/verkot/MAC:it" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 ja IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Vain IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Vain IPv6" @@ -505,9 +591,14 @@ msgstr "Vain IPv6" msgid "Inbound device" msgstr "Saapuva laite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Saapuva IPv4%{proto?, protokolla %{proto#%{next?, }%{item.types?%{item.name}ICMP " -"tyypit %{item.types#%{next?, }%{item}}:%{item." -"name}}}}%{mark?, mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}" - -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Tuleva" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Sisäinen IP-osoite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Sisäinen portti" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Sisäinen vyöhyke" @@ -552,11 +638,15 @@ msgstr "Virheellinen DSCP-merkki" msgid "Invalid limit value" msgstr "Virheellinen raja-arvo" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Rajoita purskeet" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Rajoita lokisanomia" @@ -564,9 +654,9 @@ msgstr "Rajoita lokisanomia" msgid "Limit matching" msgstr "Rajoita vastaavat" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -574,7 +664,8 @@ msgstr "" "Rajoita vastaavuus %{limit.num} pakettia per %{limit.unit}%{limit.burst? purske %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Rajoitettu naamiointi käytössä" @@ -582,26 +673,26 @@ msgstr "Rajoitettu naamiointi käytössä" msgid "Limits traffic matching to the specified rate." msgstr "Rajoittaa liikenteen määritettyyn nopeuteen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "Loopback-lähteen IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" "MASQUERADE - Uudelleenkirjoitus automaattisesti lähtevän rajapinnan IP: lle" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSS-kiinnitys" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Naamiointi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Vastaa" @@ -617,34 +708,34 @@ msgstr "Vastaa ICMP-tyyppiä" msgid "Match device" msgstr "Vastaa laitetta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "Vastaa annettuun IP-osoitteeseen välitettyä liikennettä." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "Vastaa välitettyä liikennettä, joka on suunnattu määrättyyn porttiin tai " "portti-alueeseen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "Vastaa välitettyä liikennettä tästä IP-osoitteesta tai alueelta." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "Vastaa välitettyä liikennettä, joka on peräisin annetusta portista tai " "portti-alueesta." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "Vastaa auttajaa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -656,8 +747,8 @@ msgstr "" msgid "Match mark" msgstr "Vastaa merkkiä" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "Vastaa liikennettä määritetyllä yhteydenseuranta-apurilla." @@ -665,7 +756,7 @@ msgstr "Vastaa liikennettä määritetyllä yhteydenseuranta-apurilla." msgid "Matches a specific firewall mark or a range of different marks." msgstr "Vastaa tiettyä palomuurimerkkintää tai joukkoa erilaisia merkkintöjä." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "Vastaa välitettyä liikennettä tietyn lähtevän sovittimen perusteella." @@ -673,6 +764,14 @@ msgstr "Vastaa välitettyä liikennettä tietyn lähtevän sovittimen perusteell msgid "Matches traffic carrying the specified DSCP marking." msgstr "Vastaa liikennettä, jolla on määritetty DSCP-merkintä." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -681,22 +780,22 @@ msgstr "" "Alkuperäinen enimmäismäärä vastaamaan: tämä määrä kasvatetaan yhdellä aina, " "määritettyyn numeroon saakka, kunnes annettu määrä saavutetaan." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Maanantai" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Kuukauden päivät" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "NAT-säännöt" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -704,26 +803,32 @@ msgstr "" "NAT-säännöt sallivat lähde-IP:n hienostuneen hallinnan käytettäväksi " "lähtevässä tai välitetyssä liikenteessä." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Nimi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Vastaa vain annettuun IP-osoitteeseen suuntautuvaa liikennettä." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Vastaa vain näistä MAC-osoitteista tulevaa liikennettä." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Vastaa vain saapuvaa liikennettä tästä IP-osoitteesta tai alueelta." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -732,26 +837,38 @@ msgstr "" "tai porttialueesta" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Lähtevälaite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Lähtevä vyöhyke" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Lähtevä" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "Välittää lisäargumentteja iptablesille. Käytä varoen!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -764,12 +881,16 @@ msgstr "" "aliverkkoin. Näitä vaihtoehtoja tulee käyttää erittäin varovaisesti, koska " "virheelliset arvot voivat rikkoa palomuurisäännöt paljastaen kaikki palvelut." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Portin välitys" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -777,68 +898,82 @@ msgstr "" "Portinvälityksen avulla Internetin etätietokoneet voivat muodostaa yhteyden " "tiettyyn tietokoneeseen tai palveluun yksityisessä lähiverkossa." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Porttialue" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protokolla" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Uudelleenohjaa saapuva liikenne sisäisen palvelimelle annettuun porttiin" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Uudelleenohjaa saapuva liikenne määritettyyn sisäiseen palvelimeen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "Edellyttää laitteiston NAT-tukea. Toteutettu ainakin mt7621: lle" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Edellyttää laitteiston NAT-tukea." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Rajoita naamiointi tiettyihin kohdeverkkoihin" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Rajoita naamiointi tiettyihin kohdeverkkoihin" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Rajoita tietyille osoitteille" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "Kirjoita IP-osoite uudelleen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" "Kirjoita vastaava tietoliikenne uudelleen määritettyyn lähde-IP-osoitteeseen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Kirjoita vastaava tietoliikenne uudelleen määritettyyn lähdeporttiin tai " "porttialueeseen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Uudelleenkirjoita portti" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Reititys/NAT-purku" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Kirjoita tiettyyn lähde IP:hen tai porttiin" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Lauantai" @@ -854,36 +989,36 @@ msgstr "" "Määritä määritetty merkkiarvo muodostetuille yhteyksille. Muoto on arvo[/" "mask]. Jos maski on määritetty, vain maskiin määritettyjä bittiä muokataan." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Ohjelmistopohjainen reititys/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Ohjelmistopohjainen tietovirran nopeutus" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Lähde-IP-osoite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Lähde MAC-osoite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Lähdeosoite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Lähdeportti" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Lähdevyöhyke" @@ -895,7 +1030,7 @@ msgstr "" "Määrittää, sidotaanko tämä liikennesääntö tiettyyn saapuvaan vai lähtevään " "verkkolaitteeseen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -903,38 +1038,42 @@ msgstr "" "Määrittää, käytetäänkö ulkoista vai sisäistä IP-osoitetta heijastuneeseen " "liikenteeseen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Aloituspäivä (vvvv-kk-pp)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Aloitusaika (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Lopetuspäivä (vvv-kk-pp)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Lopetusaika (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Sunnuntai" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "Nykyistä palomuurimääritystä on muutettava, jotta LuCI toimisi oikein." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -942,8 +1081,8 @@ msgstr "" "Palomuuri luo vyöhykkeitä verkkosovittimista verkkoliikenteen kulun " "hallitsemiseksi." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -960,7 +1099,7 @@ msgstr "" "yksisuuntainen, esimerkiksi eteenpäin lanista waniin ei " "merkitse lupaa myös päästä eteenpäin wanista laniin." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -975,18 +1114,18 @@ msgstr "" "koskeva käytäntö. Katetut verkot määrittävät, mitkä käytettävissä " "olevat verkot ovat tämän vyöhykkeen jäseniä." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Torstai" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Aikarajoitukset" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "UTC-aika" @@ -994,6 +1133,10 @@ msgstr "UTC-aika" msgid "Time restrictions are enabled for this rule" msgstr "Aikarajoitukset ovat käytössä tälle säännölle" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1008,7 +1151,7 @@ msgstr "" "%{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Seurantaapuri" @@ -1053,8 +1196,8 @@ msgstr "" "paketeille, esimerkiksi tiettyjen isäntien välisen liikenteen hylkäämiseksi " "tai WAN-porttien avaamiseksi reitittimessä." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Tiistai" @@ -1062,18 +1205,24 @@ msgstr "Tiistai" msgid "Unable to save contents: %s" msgstr "Sisältöä ei voi tallentaa: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "Tuntematon tai asentamaton conntrack-auttaja \"% s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "Nimeämätön NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Nimeämätön välitys" @@ -1082,15 +1231,19 @@ msgstr "Nimeämätön välitys" msgid "Unnamed rule" msgstr "Nimetön sääntö" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Nimeämätön vyöhyke" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Tunnistamaton protokolla" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1100,15 +1253,21 @@ msgstr "" "\"SNAT\", muunnetaan \"nat\" -osioiksi ja palomuuri käynnistetään uudelleen " "päivitetyn määrityksen aktivoimiseksi." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Käytä ulkoista IP-osoitetta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Käytä sisäistä IP-osoitetta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1116,7 +1275,7 @@ msgstr "" "Tämän vaihtoehdon avulla voit luokitella vyöhykeliikennettä raakana, ei-" "uci -hallittujen sovittimien avulla." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1128,17 +1287,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Kelvollinen palomuurimerkintä vaaditaan" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Keskiviikko" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Viikon päivät" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "XOR-palomuurimerintä" @@ -1146,109 +1305,234 @@ msgstr "XOR-palomuurimerintä" msgid "XOR mark" msgstr "XOR-merkki" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Vyöhyke ⇒ Välitys" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Vyöhykkeet" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "hyväksy" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "mikä tahansa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "mikä tahansa vyöhyke" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "aseta palomuurimerkintä" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "määritä conntrack-helper" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "automaattinen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "päivä" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "älä kirjoita uudelleen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "älä seuraa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "pudota" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "tunti" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "minuutti" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "hylkää" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "sekunti" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "tämä laite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "tämä uusi vyöhyke" @@ -1260,6 +1544,11 @@ msgstr "rajoittamaton" msgid "unspecified" msgstr "määrittelemätön" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "kelvollinen palomuurimerkintä" diff --git a/package/luci/applications/luci-app-firewall/po/fr/firewall.po b/package/luci/applications/luci-app-firewall/po/fr/firewall.po index c57242429a..085dbac5cd 100644 --- a/package/luci/applications/luci-app-firewall/po/fr/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/fr/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2022-07-30 11:58+0000\n" -"Last-Translator: Christophe Blancon \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -48,10 +48,18 @@ msgstr "" msgid "-- add IP --" msgstr "-- ajouter IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- ajouter MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -59,17 +67,17 @@ msgstr "" "Accepter %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Empêcher la réécriture de la source" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" msgstr "" -"Suivre vers %{dest}%{dest_ip? IP " -"%{dest_ip}}%{dest_port? port %{dest_port}}" +"Transférer vers %{dest}%{dest_ip ? IP " +"%{dest_ip}}%{dest_port ? port %{dest_port}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:115 msgid "" @@ -101,7 +109,7 @@ msgstr "" "%{set_mark?Assign:XOR} firewall mark " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Réécrire automatiquement l'IP source" @@ -121,7 +129,7 @@ msgstr "" "Rejeter %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -129,23 +137,23 @@ msgstr "" "Réécrire statiquement vers la source " "%{snat_ip?IP %{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Une IP de réécriture doit être spécifiée !" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACCEPTER - Désactiver la réécriture d'adresses" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Action" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -155,7 +163,7 @@ msgstr "" "destination de la zone, par exemple -p tcp --dport 443 pour " "correspondre uniquement au trafic HTTPS sortant." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -164,33 +172,45 @@ msgstr "" "source de la zone, par exemple -p tcp --sport 443 pour " "correspondre uniquement au trafic HTTPS entrant." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Famille d’adresses, l’adresse IP interne doit correspondre" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" +"La famille d'adresses, l'adresse source, l'adresse de destination et " +"l'adresse IP de réécriture doivent correspondre" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Paramètres avancés" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" -msgstr "Autoriser le trafic \"non valide\"" +msgstr "Autoriser le trafic \"invalide\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Permettre la transmission des zones source :" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Permettre la transmission vers les zones destination :" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "N'importe lequel" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "N'importe quel jour" @@ -207,56 +227,65 @@ msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Apply the given DSCP class or value to established connections." -msgstr "Appliquez la classe ou la valeur DSCP donnée aux connexions établies." +msgstr "Applique la classe ou la valeur DSCP donnée aux connexions établies." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -"Attribuez l'assistant de suivi des connexions spécifié au trafic " +"Attribue l'assistant de suivi des connexions spécifié au trafic " "correspondant." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Affectation automatique des assistants" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "Attribuer automatiquement des assistants conntrack en fonction du protocole " "de trafic et du port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Commentaire" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Paramètres Conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Assistants Conntrack" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:16 msgid "Contents have been saved." -msgstr "Le contenu a été enregistré." +msgstr "Les contenus ont été enregistrés." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Continuer" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Compteurs" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Appareils couverts" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Réseaux couverts" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Sous-réseaux couverts" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" -msgstr "Régles spécifiques" +msgstr "Règles spécifiques" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:26 msgid "" @@ -269,7 +298,7 @@ msgstr "" "feu. Les commandes sont exécutées après chaque redémarrage du pare-feu, " "juste après le chargement de l'ensemble de règles par défaut." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "Classification DSCP" @@ -281,17 +310,17 @@ msgstr "Marque DSCP" msgid "DSCP mark required" msgstr "Marque DSCP requise" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Adresse de destination" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Port de destination" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Zone de destination" @@ -299,7 +328,7 @@ msgstr "Zone de destination" msgid "Device name" msgstr "Nom de l'appareil" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -308,68 +337,98 @@ msgstr "" "avec l'état conntrack invalide. Cela peut être nécessaire pour les " "configurations de route asymétriques complexes." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" -msgstr "Supprimer les paquets invalides" +msgstr "Ignorer les paquets invalides" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" -msgstr "Activer" +msgstr "Active" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Activer le NAT sur la boucle-locale" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Activer la protection contre le SYN-flood" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Activer les traces (logs) sur cette zone" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Activer la traduction d'adresse réseau et de port IPv4 (NAT4 ou NAPT4) pour " +"le trafic sortant de cette zone. Cette option est généralement activée dans " +"la zone wan." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Activer la traduction d'adresse réseau et de port IPv6 (NAT6 ou NAPT6) pour " +"le trafic sortant sur cette zone." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Activé" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "Active le suivi du nombre de paquets et d'octets pour l'ensemble." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Attendu : %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Fonction expérimentale. Pas entièrement compatible avec QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" "Choisit explicitement les assistants de suivi de connexion autorisés pour le " "trafic de zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Adresse IP externe" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Port externe" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Arguments supplémentaires" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Arguments de destination supplémentaires" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Arguments supplémentaires iptables" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Arguments sources supplémentaires" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Famille" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Pare-feu" @@ -378,11 +437,15 @@ msgstr "Pare-feu" msgid "Firewall - Custom Rules" msgstr "Pare-feu - Règles personnalisées" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Pare-feu - IPset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Pare-feu - Règles NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Pare-feu - Redirections de ports" @@ -390,39 +453,41 @@ msgstr "Pare-feu - Redirections de ports" msgid "Firewall - Traffic Rules" msgstr "Pare-feu - Règles de trafic" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Pare-feu - Configuration des zones" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Migration de la configuration du pare-feu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" -msgstr "Transférer" +msgstr "Avant" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 et IPv6:IPv6}:" +"IPv4}%{proto? protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" -"}" +"%{mark.num}%{mark.mask? avec le mask %{mark.mask}}.\":%{mark.mask? data-" +"tooltip=\"Valeur de Mask fwmark de %{mark.mask} avant comparaison.\"}}" +">%{mark.val}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Vendredi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}" "}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Paramètres généraux" #: applications/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json:3 msgid "Grant access to firewall configuration" -msgstr "Accès complète à la configuration du firewall" +msgstr "Octroi l'accès à la configuration du pare-feu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Déchargement de flux matériel" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "Plage d'IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "IP Sets" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IPs/Réseaux" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IPs/Réseaux/MACs" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 et IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" -msgstr "IPv4 seulement" +msgstr "IPv4 uniquement" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "Masquage IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" -msgstr "IPv6 seulement" +msgstr "IPv6 uniquement" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 msgid "Inbound device" msgstr "Appareil entrant" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Inclure le fichier" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 et IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}" +"mask? data-tooltip=\"Valeur de Masque fwmark de %{mark.mask} avant " +"comparaison.\"}}>%{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}" +":%{helper.val}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Taille initiale du hachage" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Entrée" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Adresse IP interne" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Port interne" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Zone interne" @@ -557,11 +665,15 @@ msgstr "Marque DSCP non valide" msgid "Invalid limit value" msgstr "Valeur limite non valide" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Rafale limite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Limiter les messages de journalisation" @@ -569,9 +681,9 @@ msgstr "Limiter les messages de journalisation" msgid "Limit matching" msgstr "Limiter la correspondance" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -579,7 +691,8 @@ msgstr "" "Limiter la correspondance à %{limit.num} paquets par %{limit." "unit}%{limit.burst? burst %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Autorise un masquage limité" @@ -587,31 +700,31 @@ msgstr "Autorise un masquage limité" msgid "Limits traffic matching to the specified rate." msgstr "Limite le trafic correspondant au débit spécifié." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "IP source de bouclage" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASQUERADE - Réécriture automatique sur l'IP de l'interface sortante" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "Contrainte du MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Masquage" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Correspond" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 msgid "Match DSCP" -msgstr "Match DSCP" +msgstr "Faire correspondre DSCP" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:292 msgid "Match ICMP type" @@ -619,39 +732,38 @@ msgstr "Type ICMP correspondant" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:248 msgid "Match device" -msgstr "Match device" +msgstr "Match appareil" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" "Faites correspondre le trafic transféré dirigé vers l'adresse IP donnée." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "Faites correspondre le trafic transféré dirigé vers le port de destination " -"ou la plage de ports donné." +"ou de ports donné." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -"Faites correspondre le trafic transféré depuis cette adresse IP ou cette " -"plage." +"Fait correspondre le trafic transféré depuis cette adresse IP ou cette plage." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -"Faites correspondre le trafic transféré provenant du port source ou de la " +"Fait correspondre le trafic transféré provenant du port source ou de la " "plage de ports donné." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" -msgstr "Aide au match" +msgstr "Assistant à la correspondance" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -661,31 +773,39 @@ msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "Match mark" -msgstr "Match mark" +msgstr "Correspondance mark" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" -"Faites correspondre le trafic à l'aide de l'assistant de suivi des " -"connexions spécifié." +"Fait correspondre le trafic à l'aide de l'assistant de suivi des connexions " +"spécifié." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:318 msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -"Correspond à une marque de pare-feu spécifique ou à une gamme de marques " -"différentes." +"Fait correspondre à un marquage de pare-feu spécifique ou à un intervalle de " +"marquages différents." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" -"Correspond au trafic transféré à l'aide du périphérique réseau sortant " -"spécifié." +"Fait correspondre le trafic transféré en fonction du périphérique réseau " +"sortant spécifié." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Matches traffic carrying the specified DSCP marking." msgstr "Correspond au trafic portant le marquage DSCP spécifié." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Entrées max" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Longueur Max" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -695,22 +815,22 @@ msgstr "" "rechargé d'un à chaque fois que la limite spécifiée ci-dessus n'est pas " "atteinte, jusqu'à ce nombre." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Lundi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Mois jours" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "Règles NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -718,29 +838,35 @@ msgstr "" "Les règles NAT permettent un contrôle fin sur l'IP source à utiliser pour le " "trafic sortant ou transféré." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Nom" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Masque réseau" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" "Correspondre uniquement au trafic entrant dirigé vers l'adresse IP donnée." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Montrer seulement le trafic entrant provenant de ces adresses MAC." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" "Correspondre uniquement au trafic entrant provenant de cette adresse IP ou " "de cette plage." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -749,28 +875,45 @@ msgstr "" "de la plage de ports donné sur l'hôte client" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Périphérique sortant" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Zone sortante" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Sortie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Packet Field Match" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Les champs de paquets correspondant à.
    Syntax : direction_datatype. e.g. : src_port, dest_net.
    Directions : src, " +"dst. Types de données : ip, port, mac, net, set.
    Les préfixes de direction sont optionnels.
    *Note : datatype " +"set n'est pas supporté dans fw4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "Passe des arguments supplémentaires aux tables d'adresses IP. A utiliser " "avec précaution !" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -785,12 +928,18 @@ msgstr "" "non valides peuvent endommager le jeu de règles du pare-feu, exposant " "complètement tous les services." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" +"Chemin d'accès au fichier des CIDR, des sous-réseaux, des IP hôtes, etc.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Redirections de port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -798,72 +947,86 @@ msgstr "" "La redirection de port permet aux ordinateurs distants sur Internet, de se " "connecter à un ordinateur ou service spécifié dans le réseau local privé." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Plage de ports" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protocole" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Rediriger le trafic entrant correspondant vers le port donné sur l'hôte " "interne" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Rediriger le trafic entrant correspondant vers l'hôte interne spécifié" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "Nécessite un support NAT matériel. Implémenté au moins pour mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Reportez-vous à l'ensemble externe" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "Zones de réflection" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Nécessite un support NAT matériel." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" "Restreindre la substitution d'adresses (Masquerade) à ces sous-réseaux " "destinataires" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" "Restreindre la substitution d'adresses (Masquerade) à ces sous-réseaux " "sources" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" -msgstr "Restreindre à cette famille d'adresses" +msgstr "Restreindre à la famille d’adresses" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "Réécrire l'adresse IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." -msgstr "Réécrivez le trafic correspondant à l'adresse IP source spécifiée." +msgstr "Réécrit le trafic correspondant à l'adresse IP source spécifiée." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -"Réécrivez le trafic correspondant sur le port source ou la plage de ports " +"Réécrit le trafic correspondant sur le port source ou la plage de ports " "spécifié." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Port de réécriture" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Routage/déchargement NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Réécriture sur IP ou port source spécifique" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Samedi" @@ -880,36 +1043,36 @@ msgstr "" "est la valeur[/mask]. Si un masque est spécifié, seuls les bits définis dans " "le masque sont modifiés." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Déchargement basé sur logiciel pour le routage/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Déchargement de flux logiciel" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Adresse IP source" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Adresse MAC source" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Adresse source" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Port source" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Zone source" @@ -921,7 +1084,7 @@ msgstr "" "Spécifie s'il faut lier cette règle de trafic à un périphérique réseau " "entrant ou sortant spécifique." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -929,32 +1092,36 @@ msgstr "" "Spécifie s'il faut utiliser l'adresse IP externe ou interne pour le trafic " "réfléchi." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Date de début (aaaa-mm-jj)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Heure de début (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Date d'arrêt (aaaa-mm-jj)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Heure d'arrêt (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Méthode de stockage" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Dimanche" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -962,7 +1129,7 @@ msgstr "" "La configuration de pare-feu existante doit être modifiée pour que LuCI " "fonctionne correctement." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -970,8 +1137,8 @@ msgstr "" "Le pare-feu crée des zones sur les interfaces réseau pour contrôler le flux " "du trafic réseau." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -988,7 +1155,7 @@ msgstr "" "transmission du LAN au WAN n'implique pas également l'autorisation " "de transmission du WAN au LAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -998,23 +1165,23 @@ msgid "" msgstr "" "Cette section définit les propriétés communes de %q. Les options entrée et sortie définissent les politiques par défaut pour le trafic " -"entrant et sortant de cette zone tandis que l'option en avant " +"entrant et sortant de cette zone tandis que l'option transfert " "décrit la politique pour le trafic transféré entre différents réseaux dans " "la zone. Réseaux couverts spécifie quels réseaux disponibles sont " "membres de cette zone." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Jeudi" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Restrictions de temps" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Heure en UTC" @@ -1022,6 +1189,10 @@ msgstr "Heure en UTC" msgid "Time restrictions are enabled for this rule" msgstr "Des restrictions horaires sont activées pour cette règle" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Délai d'attente" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1036,7 +1207,7 @@ msgstr "" "%{item." "ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Aide au suivi" @@ -1081,8 +1252,8 @@ msgstr "" "entre différentes zones, par exemple pour rejeter le trafic entre certains " "hôtes ou pour ouvrir des ports WAN sur le routeur." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Mardi" @@ -1090,35 +1261,47 @@ msgstr "Mardi" msgid "Unable to save contents: %s" msgstr "Impossible d'enregistrer le contenu : %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" +"Unité : secondes. Défaut 0 signifie que l'entrée est ajoutée de " +"manière permanente à l'ensemble.
    Max : 2147483 secondes." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "Assistant conntrack inconnu ou non installé \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "NAT sans nom" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" -msgstr "Transférer sans nom" +msgstr "Transfert sans nom" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:210 msgid "Unnamed rule" msgstr "Règle sans nom" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Unnamed set" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Zone sans nom" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Protocole non reconnu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1128,15 +1311,21 @@ msgstr "" "\"SNAT\" seront converties en sections \"nat\" et le pare-feu sera redémarré " "pour appliquer la configuration mise à jour." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Utiliser une adresse IP externe" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Utiliser l'adresse IP interne" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Utiliser ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1144,7 +1333,7 @@ msgstr "" "Utilisez cette option pour classer le trafic de zone par périphériques " "réseau bruts non uci gérés." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1156,17 +1345,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Marque de pare-feu valide requise" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Mercredi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Jours de la semaine" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "Marque de pare-feu XOR" @@ -1174,120 +1363,258 @@ msgstr "Marque de pare-feu XOR" msgid "XOR mark" msgstr "Marque XOR" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "Votre appareil n'exécute pas firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "Votre appareil fonctionne avec firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" -msgstr "Zone ⇒ Transmissions" +msgstr "Zone ⇒ Transferts" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zones" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" +"Zones depuis lesquelles les règles de réflexion doivent être appelées. Si " +"non défini, seulement la zone de destination est utilisée." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "accepter" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "tous" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "n'importe quelle zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "tout/tous" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "appliquer une marque de pare-feu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "affecter l'assistant conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "automatique" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bitmap" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "Bitmap uniquement pour IPv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "journée" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip : IP de destination" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac : Adresse MAC de destination" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net : Destination (sous -) Réseau" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port : Port de destination" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set : Destination ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" -msgstr "ne réécris pas" +msgstr "ne pas réécrire" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" -msgstr "ne pas suivre" +msgstr "ne pas pister" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "ignorer" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"firewall4 prend en charge le référencement et la création d' IPset afin de " +"simplifier la correspondance de gd listes d'adresses sans avoir à créer une " +"règle par élément. Les plages de ports dans les ipsets ne sont pas prises en " +"charge par firewall4.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "Du port au port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "heure" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip : addr IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" +"ip[/cidr]
    A utiliser avec les types de données Match : *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "liste" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac : MAC addr" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macaddr|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "minute" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "réseau : (sous-)réseau" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "port : Port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "rejeter" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "seconde" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set : ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set : Source ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip : IP source" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac : Source MAC addr" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net : Source (sous-)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Source Port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "cet appareil" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "cette nouvelle zone" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:353 msgid "unlimited" -msgstr "non limité" +msgstr "illimité" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:250 msgid "unspecified" msgstr "non précisé" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "jusqu'à 65536 entrées." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "marque de pare-feu valide" diff --git a/package/luci/applications/luci-app-firewall/po/he/firewall.po b/package/luci/applications/luci-app-firewall/po/he/firewall.po index fa394d9543..eff791cf43 100644 --- a/package/luci/applications/luci-app-firewall/po/he/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/he/firewall.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-01-12 09:37+0000\n" -"Last-Translator: wakan-tanka \n" -"Language-Team: Hebrew \n" +"Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -33,20 +33,28 @@ msgstr "" msgid "-- add IP --" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -75,7 +83,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -90,70 +98,80 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" -msgstr "" +msgstr "יש לציין כתובת IP לשכתוב!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" -msgstr "" +msgstr "פעולה" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "אגד הכתובות והכתובת הפנימיות חייבות להתאים" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "הגדרות מתקדמות" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" -msgstr "" +msgstr "כל" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" -msgstr "" +msgstr "כל יום" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:316 msgid "" @@ -166,24 +184,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "תגובה" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -191,23 +214,27 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" +msgstr "המשך" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "" @@ -218,7 +245,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -230,90 +257,115 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" -msgstr "" +msgstr "כתובת היעד" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" -msgstr "" +msgstr "פתחת היעד" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" -msgstr "" +msgstr "אזור היעד" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:268 msgid "Device name" -msgstr "" +msgstr "שם המכשיר" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" -msgstr "" +msgstr "הפעלה" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "" @@ -322,11 +374,15 @@ msgstr "" msgid "Firewall - Custom Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "" @@ -334,34 +390,35 @@ msgstr "" msgid "Firewall - Traffic Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "" @@ -406,22 +463,55 @@ msgstr "" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "" @@ -429,9 +519,14 @@ msgstr "" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "" @@ -467,11 +566,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "" @@ -479,15 +582,16 @@ msgstr "" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -495,25 +599,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -529,30 +633,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -562,8 +666,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -571,7 +675,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -579,79 +683,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -660,75 +790,93 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "" @@ -742,36 +890,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "" @@ -781,51 +929,55 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -835,7 +987,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -844,18 +996,18 @@ msgid "" "networks
    specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -863,6 +1015,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -872,7 +1028,7 @@ msgid "" "ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -905,8 +1061,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "" @@ -914,18 +1070,24 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -934,36 +1096,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -973,17 +1145,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -991,109 +1163,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1105,6 +1402,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/hi/firewall.po b/package/luci/applications/luci-app-firewall/po/hi/firewall.po index 2fe410a238..43effd7e18 100644 --- a/package/luci/applications/luci-app-firewall/po/hi/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/hi/firewall.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2010-03-30 17:00+0200\n" "PO-Revision-Date: 2020-01-14 15:22+0000\n" "Last-Translator: Franco Castillo \n" -"Language-Team: Hindi \n" "Language: hi\n" "MIME-Version: 1.0\n" @@ -35,20 +35,28 @@ msgstr "" msgid "-- add IP --" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -77,7 +85,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -92,68 +100,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "" @@ -168,24 +186,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -193,23 +216,27 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "" @@ -220,7 +247,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -232,17 +259,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "" @@ -250,72 +277,97 @@ msgstr "" msgid "Device name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "" @@ -324,11 +376,15 @@ msgstr "" msgid "Firewall - Custom Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "" @@ -336,34 +392,35 @@ msgstr "" msgid "Firewall - Traffic Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "" @@ -408,22 +465,55 @@ msgstr "" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "" @@ -431,9 +521,14 @@ msgstr "" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "" @@ -469,11 +568,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "" @@ -481,15 +584,16 @@ msgstr "" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -497,25 +601,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -531,30 +635,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -564,8 +668,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -573,7 +677,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -581,79 +685,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -662,75 +792,93 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "" @@ -744,36 +892,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "" @@ -783,51 +931,55 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -837,7 +989,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -846,18 +998,18 @@ msgid "" "networks
    specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -865,6 +1017,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -874,7 +1030,7 @@ msgid "" "ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -907,8 +1063,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "" @@ -916,18 +1072,24 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -936,36 +1098,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -975,17 +1147,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -993,109 +1165,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1107,6 +1404,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/hu/firewall.po b/package/luci/applications/luci-app-firewall/po/hu/firewall.po index d310777366..aaa690f2d1 100644 --- a/package/luci/applications/luci-app-firewall/po/hu/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/hu/firewall.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-08-12 12:55+0000\n" -"Last-Translator: Tudós Péter \n" -"Language-Team: Hungarian \n" +"Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 5.1-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -33,20 +33,28 @@ msgstr "" msgid "-- add IP --" msgstr "-- IP-cím hozzáadása --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- MAC-cím hozzáadása --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Forrás felülírásának tiltása" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -78,7 +86,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -93,29 +101,30 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Egy átírási IP-t meg kell adni!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ELFOGADÁS – címátírás letiltása" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 +#, fuzzy msgid "Action" msgstr "Művelet" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -125,7 +134,7 @@ msgstr "" "besorolásához, például -p tcp --dport 443 csak a kimenő HTTPS " "forgalom illesztéséhez." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -134,33 +143,44 @@ msgstr "" "besorolásához, például -p tcp --sport 443 csak a bejövő HTTPS " "forgalom illesztéséhez." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#, fuzzy msgid "Advanced Settings" msgstr "Haladó Beállítások" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "„Érvénytelen” forgalom engedélyezése" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Továbbítás engedélyezése a forrászónákból:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Továbbítás engedélyezése ezekbe a célzónákba:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Bármelyik" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Bármely nap" @@ -180,28 +200,33 @@ msgid "Apply the given DSCP class or value to established connections." msgstr "" "A megadott DSCP-osztály vagy érték alkalmazása a kiépített kapcsolatokra." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" "A megadott kapcsolatkövető segítőjének hozzárendelése az illesztett " "forgalomhoz." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Automatikus segítő hozzárendelés" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "Kapcsolatkövető segítők automatikus hozzárendelése a forgalom protokollja és " "portja alapján" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Kapcsolatkövető beállításai" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Kapcsolatkövető segítők" @@ -209,23 +234,27 @@ msgstr "Kapcsolatkövető segítők" msgid "Contents have been saved." msgstr "A tartalom mentésre került." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Tovább" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Lefedett eszközök" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Lefedett hálózatok" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Lefedett alhálózatok" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Egyéni szabályok" @@ -240,7 +269,7 @@ msgstr "" "parancsok minden tűzfal-újraindítás után végrehajtásra kerülnek, közvetlenül " "az alapértelmezett szabálykészletek betöltődése után." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "DSCP osztályozás" @@ -252,17 +281,17 @@ msgstr "DSCP jelölés" msgid "DSCP mark required" msgstr "DSCP jelölés szükséges" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Célcím" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Célport" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Célzóna" @@ -270,7 +299,7 @@ msgstr "Célzóna" msgid "Device name" msgstr "Eszköz név" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -278,68 +307,93 @@ msgstr "" "Ne telepítsen további szabályokat az érvénytelen kapcsolatkövető " "állapottal rendelkező továbbított forgalom visszautasításához." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Érvénytelen csomagok eldobása" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Engedélyezés" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "NAT visszacsatolás engedélyezése" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "SYN-elárasztás elleni védelem engedélyezése" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Naplózás engedélyezése ezen a zónán" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Elvárás: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Kísérleti funkció. Nem teljesen kompatibilis a QoS/SQM használatával." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" "Határozottan kiválasztja az engedélyezett kapcsolatkövető segítőket a " "zónaforgalomhoz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Külső IP-cím" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Külső port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "További argumentumok" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "További célargumentumok" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "További iptables argumentumok" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "További forrásargumentumok" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Tűzfal" @@ -348,11 +402,15 @@ msgstr "Tűzfal" msgid "Firewall - Custom Rules" msgstr "Tűzfal – egyéni szabályok" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Tűzfal – NAT szabályok" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Tűzfal – porttovábbítások" @@ -360,34 +418,35 @@ msgstr "Tűzfal – porttovábbítások" msgid "Firewall - Traffic Rules" msgstr "Tűzfal – forgalmi szabályok" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Tűzfal – Zóna beállításai" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Továbbítás" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Péntek" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Általános Beállítások" @@ -432,22 +491,55 @@ msgstr "Általános Beállítások" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Hardveres áramláskiürítés" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 és IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Csak IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Csak IPv6" @@ -455,9 +547,14 @@ msgstr "Csak IPv6" msgid "Inbound device" msgstr "Bejövő eszköz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Bemenet" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Belső IP-cím" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Belső port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Belső zóna" @@ -493,11 +594,15 @@ msgstr "Érvénytelen DSCP jelölés" msgid "Invalid limit value" msgstr "Érvénytelen korlátérték" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Löket korlátozása" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Naplóüzenetek korlátozása" @@ -505,15 +610,16 @@ msgstr "Naplóüzenetek korlátozása" msgid "Limit matching" msgstr "Illesztés korlátozása" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -521,25 +627,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "Korlátozza a megadott sebességre illeszkedő forgalmat." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "Visszacsatolás forrás IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "ÁLCÁZÁS – átírás automatikusan a kimenő csatoló IP-jére" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSS összefogás" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Álcázás" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Illesztés" @@ -555,34 +661,34 @@ msgstr "ICMP-típus illesztése" msgid "Match device" msgstr "Eszköz illesztése" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "A megadott IP-címre irányított továbbított forgalom illesztése." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "A megadott célportra vagy porttartományra irányított továbbított forgalom " "illesztése." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "Erről az IP-ről vagy tartományról továbbított forgalom illesztése." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "A megadott forrásportról vagy porttartományból eredő továbbított forgalom " "illesztése." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "Illesztési segítő" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -594,8 +700,8 @@ msgstr "" msgid "Match mark" msgstr "Jelölés illesztése" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "Forgalom illesztése a megadott kapcsolatkövető segítő használatával." @@ -604,7 +710,7 @@ msgid "Matches a specific firewall mark or a range of different marks." msgstr "" "Egy bizonyos tűzfaljelölést vagy különböző jelölések tartományát illeszti." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" "A megadott kimeneti hálózati eszköz használatával illeszti a továbbított " @@ -614,6 +720,14 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "A megadott DSCP jelölést szállító forgalmat illeszti." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -623,22 +737,22 @@ msgstr "" "minden alkalommal, amikor a fent meghatározott korlátot nem érik el, " "legfeljebb eddig a számig." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Hétfő" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Hónap napjai" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "NAT szabályok" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -646,27 +760,33 @@ msgstr "" "A NAT szabályok lehetővé teszik a részletes szabályozást a kimenő vagy " "továbbított forgalomnál használandó forrás IP fölött." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Név" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Csak a megadott IP-címre irányított bejövő forgalom illesztése." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Csak ezekről a MAC-ekről érkező bejövő forgalom illesztése." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" "Csak erről az IP-ről vagy tartományból érkező bejövő forgalom illesztése." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -675,28 +795,40 @@ msgstr "" "bejövő forgalom illesztése" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Kimeneti eszköz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Kimenő zóna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Kimenet" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "Átadja a további argumentumokat az iptables részére. Használja " "körültekintően!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -711,12 +843,16 @@ msgstr "" "tönkre tehetik a tűzfalszabálykészleteket, ezáltal teljesen feltárva az " "összes szolgáltatást." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Porttovábbítások" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -725,65 +861,79 @@ msgstr "" "személyes helyi hálózat bizonyos számítógépéhez vagy szolgáltatásához " "történő csatlakozását." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protokol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "Egyező bejövő forgalom átirányítása a belső gép megadott portjára" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Egyező bejövő forgalom átirányítása a megadott belső gépre" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "Hardveres NAT támogatás szükséges. Legalább az mt7621-hez megvalósítva" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Hardveres NAT támogatás szükséges." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Álcázás korlátozása a megadott célalhálózatokra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Álcázás korlátozása a megadott forrás alhálózatokra" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Korlátozás címcsaládra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "IP-cím átírása" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "Illesztett forgalom átírása a megadott forrás IP-címre." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Illesztett forgalom átírása a megadott forrásportra vagy porttartományra." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Port átírása" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Útválasztás vagy NAT kiürítés" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT – átírás egy adott forrás IP-re vagy portra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Szombat" @@ -800,36 +950,36 @@ msgstr "" "érték[/maszk]. Ha egy maszk meg van adva, akkor csak a maszkban beállított " "bitek lesznek módosítva." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Szoftver alapú kiürítés az útválasztásnál vagy NAT-nál" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Szoftveres áramláskiürítés" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Forrás IP-cím" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Forrás MAC-cím" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Forráscím" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Forrásport" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Forrászóna" @@ -841,7 +991,7 @@ msgstr "" "Meghatározza, hogy ezt a forgalomszabályt egy adott bejövő vagy kimenő " "hálózati eszközhöz kell kötni." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -849,38 +999,42 @@ msgstr "" "Meghatározza, hogy a külső vagy a belső IP-címet használja a visszatükrözött " "forgalomnál." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Kezdés dátuma (ÉÉÉÉ-HH-NN)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Kezdés ideje (ÓÓ.PP.MM)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Leállítás dátuma (ÉÉÉÉ-HH-NN)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Leállítás ideje (ÓÓ.PP.MM)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Vasárnap" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -888,8 +1042,8 @@ msgstr "" "A tűzfal zónákat hoz létre a hálózati csatolók fölött a hálózati forgalom " "áramlásának szabályozásához." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -906,7 +1060,7 @@ msgstr "" "LAN-ból WAN-ba nem jelenti azt, hogy a továbbítás WAN-ból LAN-ba is " "engedélyezett." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -921,18 +1075,18 @@ msgstr "" "belül. A lefedett hálózatok adják meg, hogy mely elérhető hálózatok " "tagjai ennek a zónának." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Csütörtök" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Időkorlátozások" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Idő UTC szerint" @@ -940,6 +1094,10 @@ msgstr "Idő UTC szerint" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -949,7 +1107,7 @@ msgid "" "ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Követési segítő" @@ -985,8 +1143,8 @@ msgstr "" "szabályokat határozzák meg, például bizonyos gépek közötti forgalom " "visszautasításához vagy WAN portok megnyitásához az útválasztón." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Kedd" @@ -994,18 +1152,24 @@ msgstr "Kedd" msgid "Unable to save contents: %s" msgstr "Nem lehet elmenteni a tartalmat: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "Ismeretlen vagy nem telepített kapcsolatkövető segítő: „%s”" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "Névtelen NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Névtelen továbbítás" @@ -1014,30 +1178,40 @@ msgstr "Névtelen továbbítás" msgid "Unnamed rule" msgstr "Névtelen szabály" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Névtelen zóna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Külső IP-cím használata" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Belső IP-cím használata" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1045,7 +1219,7 @@ msgstr "" "Használja ezt a beállítást a zónaforgalom nyers, nem uci által " "kezelt hálózati eszközök szerint történő besorolásához." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1057,17 +1231,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Érvényes tűzfaljelölés szükséges" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Szerda" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Hétköznapok" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "kizáró vagy tűzfaljelölés" @@ -1075,109 +1249,234 @@ msgstr "kizáró vagy tűzfaljelölés" msgid "XOR mark" msgstr "kizáró vagy jelölés" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zóna ⇒ Továbbítások" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zónák" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "elfogadás" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "bármely" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "bármely zóna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "tűzfaljelölés alkalmazása" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "kapcsolatkövető segítő hozzárendelése" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "nap" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "ne írja át" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "ne kövessen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "eldobás" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "óra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "perc" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "visszautasítás" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "másodperc" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "ez az új zóna" @@ -1189,6 +1488,11 @@ msgstr "korlátlan" msgid "unspecified" msgstr "nincs meghatározva" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "érvényes tűzfaljelölés" diff --git a/package/luci/applications/luci-app-firewall/po/id/firewall.po b/package/luci/applications/luci-app-firewall/po/id/firewall.po index 620b5eb02d..f8d6082bc6 100644 --- a/package/luci/applications/luci-app-firewall/po/id/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/id/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2022-04-25 11:12+0000\n" -"Last-Translator: Arief Hidayat \n" -"Language-Team: Indonesian \n" +"Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12.1-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -48,10 +48,18 @@ msgstr "" msgid "-- add IP --" msgstr "-- tambahkan IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- tambahkan MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -59,11 +67,11 @@ msgstr "" " Terima %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr " Cegah penulisan ulang sumber" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -101,7 +109,7 @@ msgstr "" "%{set_mark?Tetapkan:XOR} tanda firewall " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Menulis ulang IP sumber secara otomatisTolak %{src?%{dest?forward:input}:output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 #, fuzzy msgid "" "Statically rewrite to source %{snat_ip?IP " @@ -130,23 +138,23 @@ msgstr "" "Tulis secara statis ke sumber %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "IP penulisan ulang harus ditentukan!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACCEPT - Nonaktifkan penulisan ulang alamat" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Aksi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -156,7 +164,7 @@ msgstr "" "lintas tujuan zona, misalnya -p tcp --dport 443 agar hanya " "cocok dengan lalu lintas HTTPS keluar." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -165,33 +173,43 @@ msgstr "" "lintas sumber zona, mis. -p tcp --sport 443 agar hanya " "mencocokkan lalu lintas HTTPS masuk." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" -msgstr "Pengaturan Lanjutan" +msgstr "Setelan Lanjutan" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Izinkan lalu lintas \"tidak valid\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Izinkan forward dari zona sumber :" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Izinkan forward ke zona tujuan :" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Apapun" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Setiap hari" @@ -209,26 +227,31 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "Terapkan kelas atau nilai DSCP yang diberikan ke koneksi yang dibuat." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" "Tetapkan pembantu pelacakan koneksi yang ditentukan ke lalu lintas yang " "cocok." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Penetapan pembantu otomatis" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -236,23 +259,27 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "" @@ -263,7 +290,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -275,17 +302,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "" @@ -293,72 +320,97 @@ msgstr "" msgid "Device name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Diaktifkan" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "" @@ -367,11 +419,15 @@ msgstr "" msgid "Firewall - Custom Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "" @@ -379,34 +435,35 @@ msgstr "" msgid "Firewall - Traffic Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" -msgstr "" +msgstr "meneruskan" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" -msgstr "Pengaturan Umum" +msgstr "Setelan Umum" #: applications/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json:3 msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "" @@ -474,9 +564,14 @@ msgstr "" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "" @@ -512,11 +611,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "" @@ -524,15 +627,16 @@ msgstr "" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -540,25 +644,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -574,30 +678,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -607,8 +711,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -616,7 +720,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -624,79 +728,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Nama" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -705,75 +835,93 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protokol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "" @@ -787,36 +935,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "" @@ -826,51 +974,55 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -880,7 +1032,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -889,18 +1041,18 @@ msgid "" "networks specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -908,6 +1060,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -917,7 +1073,7 @@ msgid "" "ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -950,8 +1106,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "" @@ -959,18 +1115,24 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -979,36 +1141,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1018,17 +1190,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -1036,109 +1208,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "zona apapun" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "terapkan tanda firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "tetapkan conntrack helper" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "hari" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "jangan menulis ulang" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "jangan lacak" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "buang" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "jam" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "menit" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "tolak" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "detik" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "peranti ini" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "zona baru ini" @@ -1150,6 +1447,11 @@ msgstr "tak terbatas" msgid "unspecified" msgstr "tidak ditentukan" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "tanda firewall valid" diff --git a/package/luci/applications/luci-app-firewall/po/it/firewall.po b/package/luci/applications/luci-app-firewall/po/it/firewall.po index 3063c3f09b..598696a1d9 100644 --- a/package/luci/applications/luci-app-firewall/po/it/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/it/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2021-10-19 18:57+0000\n" -"Last-Translator: pisquan8 \n" -"Language-Team: Italian \n" +"Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 5.1\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -30,130 +30,192 @@ msgid "" ""\">%{helper.val}:%{helper." "val}}}" msgstr "" +"%{src?%{dest?Forwarded:Incoming}:Outgoing} %{ipv6?%{ipv4?IPv4 e " +"IPv6:IPv6}:IPv4}%{proto?, protocollo " +"%{proto#%{next?, }%{item.types?%{item." +"name}ICMP con tipi %{item.types#%{next?, }" +"%{item}}:%{item.name}}}}%{mark?, mark " +"%{mark.val}}%{dscp?, DSCP %{dscp.inv?%{dscp.val}:%{dscp.val}}}%{helper?, assistente %{helper.inv?%{helper.val}:%{helper.val}}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 msgid "-- add IP --" msgstr "-- aggiungi IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- aggiungi MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" +"Accetta %{src?%{dest?forward:input}:" +"output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" +"Previeni la riscrittura dell'origine" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" msgstr "" +"Inoltra a %{dest}%{dest_ip? IP " +"%{dest_ip}}%{dest_port? porta %{dest_port}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:115 msgid "" "Drop %{src?%{dest?forward:input}:output}" msgstr "" +"Scarta (drop)%{src?%{dest?forward:input}:" +"output}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:133 msgid "" "Assign DSCP classification %{set_dscp}" "" msgstr "" +"Assegna classificazione DSCP " +"%{set_dscp}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:127 msgid "" "Assign conntrack helper " "%{set_helper}" msgstr "" +"Assegna assistente conntrack " +"%{set_helper}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:130 msgid "" "%{set_mark?Assign:XOR} firewall mark " "%{set_mark?:%{set_xmark}}" msgstr "" +"Contrassegno firewall %{set_mark?Assign:XOR} %{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" +"Riscrivi automaticamente l'IP di " +"origine" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:124 msgid "" "Do not track %{src?%{dest?forward:input}:" "output}" msgstr "" +"Non rintracciare %{src?%{dest?forward:" +"input}:output}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:121 msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" +"Rifiuta %{src?%{dest?forward:input}:" +"output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" +"Riscrivi staticamente verso l'origine " +"%{snat_ip?IP %{snat_ip}} %{snat_port?porta %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" -msgstr "" +msgstr "È necessario specificare un IP di riscrittura!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" -msgstr "" +msgstr "ACCETTA - Disattiva riscrittura degli indirizzi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Azione" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" +"Ulteriori argomenti grezzi di iptables per classificare il traffico " +"di destinazione della zona, ad es. -p tcp --dport 443 per il " +"solo traffico HTTPS in uscita." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" +"Ulteriori argomenti grezzi di iptables per classificare il traffico " +"di origine della zona, ad es. -p tcp --sport 443 per il solo " +"traffico HTTPS in ingresso." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "La famiglia di indirizzi e l'indirizzo IP interno devono corrispondere" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" +"La famiglia di indirizzi, l'indirizzo di origine, l'indirizzo di " +"destinazione e l'indirizzo IP di riscrittura devono corrispondere" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" -msgstr "Impostazioni Avanzate" +msgstr "Impostazioni avanzate" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Consenti traffico \"non valido\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" -msgstr "Permetti routing da zone di origine:" +msgstr "Consenti l'inoltro da zone di origine:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" -msgstr "Permetti rounting a zone di destinazione:" +msgstr "Consenti l'inoltro a zone di destinazione:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Qualsiasi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Qualsiasi giorno" @@ -163,55 +225,71 @@ msgid "" "established connections. Format is value[/mask]. If a mask is specified then " "those bits set in the mask are zeroed out." msgstr "" +"Applica uno XOR bit a bit del valore dato e il valore contrassegno esistente " +"sulle connessioni stabilite. Il formato è valore[/maschera]. Se una maschera " +"è specificata allora quei bit impostati nella maschera sono azzerati." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Apply the given DSCP class or value to established connections." -msgstr "" +msgstr "Applica la classe o il valore DSCP dato per le connessioni stabilite." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" +"Assegna l'assistente di tracciamento di connessione specificato al traffico " +"corrispondente." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" -msgstr "" +msgstr "Assegnazione automatica dell'assistente" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" +"Assegna automaticamente gli assistenti conntrack in base al protocollo e " +"alla porta di traffico" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Commento" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" -msgstr "" +msgstr "Impostazioni di conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" -msgstr "" +msgstr "Assistenti di conntrack" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:16 msgid "Contents have been saved." msgstr "I contenuti sono stati salvati." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Continua" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Contatori" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Dispositivi coperti" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Reti coperte" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Sottoreti coperte" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" -msgstr "Regole Personalizzate" +msgstr "Regole personalizzate" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:26 msgid "" @@ -224,29 +302,29 @@ msgstr "" "comandi sono eseguiti dopo ogni riavvio del firewall, giusto dopo le altre " "regole che sono state caricate." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" -msgstr "" +msgstr "Classificazione DSCP" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 msgid "DSCP mark" -msgstr "" +msgstr "Contrassegno DSCP" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:296 msgid "DSCP mark required" -msgstr "" +msgstr "Contrassegno DSCP richiesto" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Indirizzo di destinazione" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Porta di destinazione" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Zona di destinazione" @@ -254,71 +332,107 @@ msgstr "Zona di destinazione" msgid "Device name" msgstr "Nome dispositivo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" +"Non installare regole extra per rifiutare il traffico inoltrato con lo stato " +"conntrack non valido. Può essere necessario per configurazioni di " +"instradamenti asimmetrici complesse." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" -msgstr "Scarta pacchetti invalidi" +msgstr "Scarta (drop) pacchetti non validi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" -msgstr "Abilita" +msgstr "Attiva" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" -msgstr "Attiva NAT Loopback" +msgstr "Attiva loopback NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Attiva protezione SYN-flood" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Attiva registro su questa zona" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Attiva la traduzione di indirizzo di rete e porta IPv4 (NAT4 o NAPT4) per il " +"traffico in uscita su questa zona. È tipicamente attivata nella zona " +"wan." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Attiva la traduzione di indirizzo di rete e porta IPv6 (NAT6 o NAPT6) per il " +"traffico in uscita su questa zona." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Attivato" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "Attiva il monitoraggio del conto di pacchetti e byte per il set." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Necessario: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" +"Caratteristica sperimentale. Non completamente compatibile con QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" +"Sceglie esplicitamente gli assistenti autorizzati del monitoraggio delle " +"connessioni per il traffico della zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" -msgstr "Indirizzo IP Esterno" +msgstr "Indirizzo IP esterno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Porta esterna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" -msgstr "Comandi extra" +msgstr "Argomenti extra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" -msgstr "" +msgstr "Argomenti di destinazione extra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" -msgstr "" +msgstr "Argomenti di iptables extra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" -msgstr "" +msgstr "Argomenti di origine extra" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Famiglia" #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" @@ -326,48 +440,59 @@ msgstr "Firewall" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:25 msgid "Firewall - Custom Rules" -msgstr "Firewall - Regole Personalizzate" +msgstr "Firewall - Regole personalizzate" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Firewall - Set di IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Firewall - Regole NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" -msgstr "Firewall - Inoltro Porte" +msgstr "Firewall - Inoltro porte" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:173 msgid "Firewall - Traffic Rules" -msgstr "Firewall - Regole Traffico" +msgstr "Firewall - Regole traffico" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" -msgstr "Firewall - Opzioni delle Zone" +msgstr "Firewall - Impostazioni zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" -msgstr "" +msgstr "Migrazione configurazione del firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Inoltra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" +"Inoltrato %{ipv6?%{ipv4?IPv4 e IPv6:IPv6}:" +"IPv4}%{proto?, protocollo %{proto#%{next?, }%{item.name}}}%{mark?, contrassegno %{mark.val}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Venerdì" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item." "ival}}}" msgstr "" +"Da %{src}%{src_device?, interfaccia %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, porta " +"%{src_port#%{next?, }%{item.ival}}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:64 msgid "" @@ -387,8 +517,16 @@ msgid "" "name}}.\":%{item.hint.name? data-tooltip=\"%{item.hint.name}\"}}>%{item.ival}" "}}" msgstr "" +"Da %{src}%{src_device?, interfaccia %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, porta " +"%{src_port#%{next?, }%{item.ival}}}%{src_mac?, MAC " +"%{src_mac#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" +"Da %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}}}%{src_port?, porta %{src_port#%{next?, }%{item.ival}}}%{src_mac?, MAC %{src_mac#%{next?, }%{item." +"ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" -msgstr "Impostazioni Generali" +msgstr "Impostazioni generali" #: applications/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json:3 msgid "Grant access to firewall configuration" -msgstr "" +msgstr "Concedi l'accesso alla configurazione del firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" -msgstr "" +msgstr "Scarico del flusso hardware" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (intervallo)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "Set di IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IP/Reti" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IP/Reti/MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 e IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Solo IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "Masquerading IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Solo IPv6" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 msgid "Inbound device" -msgstr "" +msgstr "Dispositivo di ingresso" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Includi file" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" +"In ingresso %{ipv6?%{ipv4?IPv4 e IPv6:IPv6}:" +"IPv4}%{proto?, protocollo %{proto#%{next?, }%{item.types?%{item.name}ICMP " +"con tipi %{item.types#%{next?, }%{item}}:%{item." +"name}}}}%{mark?, contrassegno %{mark.val}}%{helper?, " +"assistente %{helper.inv?%{helper.val}:%{helper.val}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Dimensione hash iniziale" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Ingresso" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Indirizzo IP interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Porta interna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" -msgstr "Zona Interna" +msgstr "Zona interna" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:304 msgid "Invalid DSCP mark" -msgstr "" +msgstr "Contrassegno DSCP non valido" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:372 msgid "Invalid limit value" +msgstr "Valore di limite non valido" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" -msgstr "" +msgstr "Limite di raffica" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Limita messaggi del registro" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:348 msgid "Limit matching" -msgstr "" +msgstr "Limita corrispondenza" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" +"Limita la corrispondenza a %{limit.num} pacchetti per " +"%{limit.unit}%{limit.burst? burst %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" -msgstr "" +msgstr "Masquerading limitato attivato" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:349 msgid "Limits traffic matching to the specified rate." -msgstr "" +msgstr "Limita il traffico corrispondente alla velocità specificata." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" -msgstr "" +msgstr "IP di origine loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" +"MASQUERADE - Riscrivi automaticamente all'IP dell'interfaccia in uscita" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" -msgstr "" +msgstr "Ancoraggio MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" -msgstr "" +msgstr "Masquerading" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Corrispondenza" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 msgid "Match DSCP" -msgstr "" +msgstr "Corrispondi DSCP" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:292 msgid "Match ICMP type" -msgstr "Corrispondenza tipo ICMP" +msgstr "Corrispondi tipo ICMP" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:248 msgid "Match device" -msgstr "" +msgstr "Corrispondi dispositivo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." -msgstr "" +msgstr "Corrispondi il traffico inoltrato diretto all'indirizzo IP indicato." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" +"Corrispondi traffico inoltrato diretto alla porta o all'intervallo di porte " +"di destinazione." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." -msgstr "" +msgstr "Corrispondi il traffico inoltrato da questo IP o intervallo." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" +"Corrispondi il traffico inoltrato derivante dalla porta o dall'intervallo di " +"porte di origine." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" -msgstr "" +msgstr "Corrispondi assistente" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" msgstr "" -"Corrispondi traffico in entrata diretto alla porta o intervallo di porte " -"dato su questo host" +"Corrispondi il traffico in ingresso diretto alla porta o all'intervallo di " +"porte su questo host" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "Match mark" -msgstr "" +msgstr "Corrispondi contrassegno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" +"Corrispondi il traffico usando l'assistente di monitoraggio della " +"connessione specificato." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:318 msgid "Matches a specific firewall mark or a range of different marks." msgstr "" +"Corrisponde un contrassegno specifico del firewall o un intervallo di " +"diversi contrassegni." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" +"Corrisponde il traffico inoltrato usando il dispositivo di rete in uscita " +"specificato." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +"Corrisponde il traffico che trasporta il contrassegno DSCP specificato." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Elementi massimi" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Dimensione massima" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" +"Numero massimo iniziale di pacchetti da corrispondere: questo numero viene " +"ricaricato da uno ogni volta che il limite specificato sopra non è " +"raggiunto, fino a questo numero." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Lunedì" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" -msgstr "Giorni del Mese" +msgstr "Giorni del mese" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "Regole NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" +"Le regole NAT consentono un controllo granulare sull'IP di origine da usare " +"per il traffico in uscita o inoltrato." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Maschera di rete" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Corrispondi solo traffico in entrata diretto al dato indirizzo IP." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Corrispondi solo traffico in entrata da questi MAC." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Corrispondi solo traffico in entrata da questo IP o intervallo." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -642,26 +879,43 @@ msgstr "" "porte sorgenti su host cliente" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" -msgstr "" +msgstr "Dispositivo di uscita" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" -msgstr "" +msgstr "Zona di uscita" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" -msgstr "" +msgstr "Output" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Corrispondenza campo pacchetto" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"I campi dei pacchetti da corrispondere.
    Sintassi: " +"direction_datatype. es.: src_port, dest_net.
    Direzioni: src, dst. Tipi di dati: ip, port, mac, net, " +"set.
    I prefissi di direzione sono facoltativi.
    *Nota: il " +"tipo di dati set non è supportato in fw4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "Passa comandi addizionali a iptables. Usare con cura!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -669,13 +923,23 @@ msgid "" "invalid values could render the firewall ruleset broken, completely exposing " "all services." msgstr "" +"Passare argomenti grezzi di iptables alle regole di classificazione del " +"traffico di origine e di destinazione, consente di corrispondere i pacchetti " +"in base ad altri criteri rispetto a interfacce o sottoreti. Queste opzioni " +"dovrebbero essere usate con estrema cura, in quanto valori non validi " +"possono invalidare le regole del firewall, esponendo completamente tutti i " +"servizi." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "Percorso al file dei CIDR, sottoreti, IP host, ecc.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Inoltri Porta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -683,107 +947,127 @@ msgstr "" "L'inoltro delle porte permette a computer remoti su Internet di connettersi " "a uno specifico computer o servizio presente nella LAN privata." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Intervallo di porte" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protocollo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "Reindirizza il traffico in entrata alla porta data su host interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Reindirizza il traffico in entrata allo specifico host interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Fare riferimento a set esterno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "Zone riflettive" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Richiede supporto NAT hardware." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Limita il Masquerading alle subnet di destinazione date" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Limita il Masquerading alle subnet sorgente date" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Limita agli indirizzi famiglia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" -msgstr "" +msgstr "Riscrivi l'indirizzo IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" +"Riscrivi il traffico corrispondente sull'indirizzo IP di origine specificato." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" +"Riscrivi il traffico corrispondente sulla porta o intervallo di porte di " +"origine specificate." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" -msgstr "" +msgstr "Riscrivi porta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" -msgstr "" +msgstr "Scarico instradamento/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" -msgstr "" +msgstr "SNAT - Riscrivi sull'IP o porta di origine specificati" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Sabato" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "Set mark" -msgstr "" +msgstr "Imposta contrassegno" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:317 msgid "" "Set the given mark value on established connections. Format is value[/mask]. " "If a mask is specified then only those bits set in the mask are modified." msgstr "" +"Imposta il valore del contrassegno sulle connessioni stabilite. Il formato è " +"valore[/maschera]. Se una maschera è specificata allora solo quei bit " +"impostati nella maschera sono modificati." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" -msgstr "" +msgstr "Scarico basato sul software per instradamento/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" -msgstr "" +msgstr "Scarico del flusso software" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Indirizzo IP di origine" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Indirizzo MAC di origine" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Indirizzo di origine" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Porta di origine" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Zona di origine" @@ -792,45 +1076,54 @@ msgid "" "Specifies whether to tie this traffic rule to a specific inbound or outbound " "network device." msgstr "" +"Specifica se legare questa regola di traffico a uno specifico dispositivo di " +"rete in ingresso o in uscita." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" +"Specifica se usare l'indirizzo IP esterno o interno per il traffico riflesso." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Data di Inizio (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" -msgstr "" +msgstr "Ora di inizio (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Data di Stop (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" -msgstr "" +msgstr "Ora di fine (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Metodo di archiviazione" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Domenica" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" +"L'attuale configurazione del firewall deve essere modificata affinché LuCI " +"funzioni correttamente." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -838,8 +1131,8 @@ msgstr "" "Il firewall crea delle zone nelle tue interfacce di rete per controllare il " "flusso del traffico." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -856,7 +1149,7 @@ msgstr "" "alla wan non implica anche un permesso da inoltrare dalla wan alla " "lan." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -871,24 +1164,28 @@ msgstr "" "differenti nella zona. Le reti coperte specificano quali reti " "disponibili sono membri di questa zona." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Giovedì" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" -msgstr "" +msgstr "Restrizioni temporali" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Orario in UTC" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:243 msgid "Time restrictions are enabled for this rule" -msgstr "" +msgstr "Le restrizioni temporali sono attive per questa regola" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Scadenza" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" @@ -898,8 +1195,13 @@ msgid "" "%{item." "ival}
    }}" msgstr "" +"Verso %{dest}%{dest_device?, interfaccia %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, porta %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" +"Verso %{dest}%{dest_device?, via interfaccia %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, porta %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" msgstr "" +"Verso %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, porta %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" -msgstr "" +msgstr "Assistente di monitoraggio" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:176 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:35 @@ -935,195 +1246,351 @@ msgstr "" "tra zone differenti, per esempio per rifiutare il traffico tra certi host o " "per aprire porte WAN sul router." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Martedì" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:19 msgid "Unable to save contents: %s" +msgstr "Impossibile salvare i contenuti: %s" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." msgstr "" +"Unità: secondi. Il predefinito 0 significa che la voce viene " +"aggiunta in modo permanente al set.
    Max: 2147483 secondi." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" -msgstr "" +msgstr "Assitente conntrack sconosciuto o non installato \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" -msgstr "" +msgstr "NAT senza nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" -msgstr "" +msgstr "Inoltro senza nome" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:210 msgid "Unnamed rule" msgstr "Regola senza nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Set senza nome" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Zona senza nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" -msgstr "" +msgstr "Protocollo non riconosciuto" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" +"Dopo aver premuto \"Continua\", le sezioni \"reindirizza\" con destinazione " +"\"SNAT\" saranno convertite in sezioni \"nat\" e il firewall verrà riavviato " +"per applicare la configurazione aggiornata." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" -msgstr "" +msgstr "Usa l'indirizzo IP esterno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" -msgstr "" +msgstr "Usa l'indirizzo IP interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Usa ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" +"Usa questa opzione per classificare il traffico di zona da dispositivi di " +"rete gestiti grezzi, nonuci." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." msgstr "" +"Usa questa opzione per classificare il traffico di zona per origine o " +"sottorete di destinazione, invece di reti o dispositivi." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:330 msgid "Valid firewall mark required" -msgstr "" +msgstr "Contrassegno firewall valido richiesto" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Mercoledì" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Giorni della Settimana" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" -msgstr "" +msgstr "Contrassegno firewall XOR" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "XOR mark" -msgstr "" +msgstr "Contrassegno XOR" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "Il dispositivo non sta eseguendo firewall4." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "Il dispositivo sta eseguendo firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zona ⇒ Inoltri" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" +"Zone da cui devono essere create regole riflettive. Se non impostato, viene " +"usata solo la zona di destinazione." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "accetta" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "qualsiasi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "qualsiasi zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "qualsiasi/tutti" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" -msgstr "" +msgstr "applica contrassegno firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" -msgstr "" +msgstr "assegna assistente conntrack" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "automatico" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bitmap" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "bitmap è solo ipv4" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "giorno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: IP di destinazione" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: indirizzo MAC di destinazione" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: (sotto)rete di destinazione" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: porta di destinazione" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: ipset* di destinazione" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "non riscrivere" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "non tracciare" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "scarta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"firewall4 supporta il riferimento e la creazione di set di IP per " +"semplificare la corrispondenza di liste di indirizzi di grandi dimensioni, " +"senza la necessità di creare una regola per elemento da abbinare. Gli " +"intervalli di porte in ipsets non sono supportati da firewall4.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "fromport-toport" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "ora" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: indirizzo IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "ip[/cidr]
    Da usare per i tipi di dati Match: *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "lista" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: indirizzo MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macaddr|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "minuto" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "net: (sotto)rete" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "port: porta" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "rifiuta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "secondo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set: ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: ipset* di origine" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: IP di origine" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: indirizzo MAC di origine" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: (sotto)rete di origine" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: porta di origine" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "questo dispositivo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "questa nuova zona" @@ -1135,7 +1602,11 @@ msgstr "illimitato" msgid "unspecified" msgstr "non specificato" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "fino a 65536 voci." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 -#, fuzzy msgid "valid firewall mark" msgstr "contrassegno firewall valido" diff --git a/package/luci/applications/luci-app-firewall/po/ja/firewall.po b/package/luci/applications/luci-app-firewall/po/ja/firewall.po index bd7efc542a..3251237595 100644 --- a/package/luci/applications/luci-app-firewall/po/ja/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/ja/firewall.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2010-03-30 17:00+0200\n" "PO-Revision-Date: 2021-02-06 08:29+0000\n" "Last-Translator: Satoru Yoshida \n" -"Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" @@ -48,21 +48,29 @@ msgstr "" msgid "-- add IP --" msgstr "-- IP を追加 --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- MAC を追加 --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" "%{src?%{dest?転送:受信}:送信} を 許可" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "アクセス元の書き換えを防止" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -98,7 +106,7 @@ msgstr "" "ファイアウォール マークの%{set_mark?割り当て:XOR}" " - %{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "アクセス元 IP を 自動的に書き換え" @@ -117,7 +125,7 @@ msgid "" msgstr "" "%{src?%{dest?転送:受信}:送信} を拒否" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -125,23 +133,23 @@ msgstr "" "アクセス元 %{snat_ip?IP %{snat_ip}} %{snat_port?ポート " "%{snat_port}} への静的書き換え" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "書き換え先 IP の指定が必要です!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACCEPT - アドレス書き換えを無効化" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "アクション" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -151,7 +159,7 @@ msgstr "" "em> 引数です。(例: HTTPS 送信トラフィックのみにマッチさせる -p tcp --" "dport 443)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -160,33 +168,43 @@ msgstr "" "em> 引数です。(例: HTTPS 受信トラフィックのみにマッチさせる -p tcp --" "sport 443)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "詳細設定" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "\"invalid\" トラフィックの許可" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "送信元ゾーンからの転送を許可する:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "宛先ゾーンへの転送を許可する:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "すべて" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "全日" @@ -204,26 +222,31 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "指定された DSCP クラスまたは値を確立された接続に適用します。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "指定された接続追跡ヘルパーを対象のトラフィックに割り当てます。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "自動ヘルパー割り当て" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "トラフィックのプロトコルとポートに基づいて、 conntrack ヘルパーを自動的に割り" "当てます。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Conntrack 設定" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Conntrack ヘルパー" @@ -231,23 +254,27 @@ msgstr "Conntrack ヘルパー" msgid "Contents have been saved." msgstr "内容が保存されました。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "続行" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "カバーされるデバイス" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "対象ネットワーク" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "カバーされるサブネット" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "手動設定ルール" @@ -262,7 +289,7 @@ msgstr "" "ドは、ファイアウォール機能の起動ごとに、標準のルールが読み込まれた後に実行さ" "れます。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "DSCP 区分" @@ -274,17 +301,17 @@ msgstr "DSCP マーク" msgid "DSCP mark required" msgstr "DSCP マークが必要です" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "宛先アドレス" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "宛先ポート" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "宛先ゾーン" @@ -292,7 +319,7 @@ msgstr "宛先ゾーン" msgid "Device name" msgstr "デバイス名" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -301,66 +328,91 @@ msgstr "" "追加ルールをインストールしない。これは、複雑で非対称なルートのセットアップに" "必要となることがあります。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "無効なパケットを遮断する" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "有効化" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "NATループバックを有効にする" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "SYN-Floodプロテクションを有効にする" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "このゾーンのログ記録を有効にする" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "%sである必要があります" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "実験的な機能です。 QoS/SQM との完全な互換性はありません。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "ゾーン トラフィックの接続追跡ヘルパーを明示的に選択します。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "外部IPアドレス" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "外部ポート" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "追加の引数" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "追加の送信先引数" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "追加の iptables 引数" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "追加の送信元引数" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "ファイアウォール" @@ -369,11 +421,15 @@ msgstr "ファイアウォール" msgid "Firewall - Custom Rules" msgstr "ファイアウォール - 手動設定ルール" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "ファイアウォール - NAT ルール" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "ファイアウォール - ポートフォワーディング" @@ -381,39 +437,35 @@ msgstr "ファイアウォール - ポートフォワーディング" msgid "Firewall - Traffic Rules" msgstr "ファイアウォール - トラフィック・ルール" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "ファイアウォール - ゾーン設定" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "ファイアウォール設定マイグレーション" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "転送" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"IPv4 の転送%{proto?, プロトコル %{proto#%{next?, }%{item.name}}}%{mark?, マーク %{mark.val}" -"}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "金曜日" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "一般設定" @@ -478,22 +530,55 @@ msgstr "一般設定" msgid "Grant access to firewall configuration" msgstr "ファイアウォール構成へのアクセスを許可" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "ハードウェア フローオフロード" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4及びIPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "IPv4のみ" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "IPv6のみ" @@ -501,9 +586,14 @@ msgstr "IPv6のみ" msgid "Inbound device" msgstr "受信側デバイス" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"IPv4 の受信%{proto?, プロトコル %{proto#%{next?, }%{item.types?%{item.name}含ま" -"れる ICMP タイプ - %{item.types#%{next?, }%{item}}:" -"%{item.name}}}}%{mark?, マーク %{mark.val}}%{helper?, ヘルパー %{helper.inv?%{helper." -"val}:%{helper.val}}}" - -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "受信" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "内部IPアドレス" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "内部ポート" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "内部ゾーン" @@ -548,11 +633,15 @@ msgstr "無効な DSCP マーク" msgid "Invalid limit value" msgstr "無効な制限値" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "バースト制限" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "ログメッセージを制限" @@ -560,9 +649,9 @@ msgstr "ログメッセージを制限" msgid "Limit matching" msgstr "一致の制限" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -570,7 +659,8 @@ msgstr "" "一致するパケット数を %{limit.unit} あたり %{limit.num} " "に制限%{limit.burst?(バースト %{limit.burst})}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "限定的なマスカレードが有効" @@ -578,25 +668,25 @@ msgstr "限定的なマスカレードが有効" msgid "Limits traffic matching to the specified rate." msgstr "トラフィックを指定されたレートに制限します。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "ループバック元 IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASQUERADE - 自動的に送信側インターフェース IP へ書き換え" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSSクランプ" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "マスカレード" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "対象" @@ -612,33 +702,33 @@ msgstr "ICMPタイプの一致" msgid "Match device" msgstr "デバイスの一致" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "指定された IP アドレスに転送されるトラフィックが対象になります。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "指定されたポートまたはポート範囲に転送されるトラフィックが対象になります。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "この IP または範囲からのトラフィックが対象になります。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "指定された送信元ポートまたはポート範囲から発信されたトラフィックが対象になり" "ます。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "ヘルパーの一致" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -650,8 +740,8 @@ msgstr "" msgid "Match mark" msgstr "マークの一致" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "指定された接続追跡ヘルパーを使用するトラフィックが対象になります。" @@ -660,7 +750,7 @@ msgid "Matches a specific firewall mark or a range of different marks." msgstr "" "特定のファイアウォール マークまたは異なる複数のマークの範囲が対象になります。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" "指定された送信側ネットワーク デバイスを使用して転送されるトラフィックが対象に" @@ -670,6 +760,14 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "指定された DSCP マークを持っているトラフィックが対象になります。" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -678,22 +776,22 @@ msgstr "" "対象となるパケットの最初の最大数です。この数は、上のレート制限で上限に到達し" "なかった場合に、その時間毎にここで指定された数まで1ずつ回復します。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "月曜日" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "月間" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "NAT ルール" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -701,28 +799,34 @@ msgstr "" "NAT ルールは、送信または転送トラフィックのために使用するアクセス元 IP に対し" "て、とても細かな制御を可能にします。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "名前" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "設定された宛先IPアドレスと一致した受信トラフィックが対象になります。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "設定されたMACアドレスと一致した受信したトラフィックが対象になります。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" "設定されたIPアドレス (または範囲) と一致した受信したトラフィックが対象になり" "ます。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -731,28 +835,40 @@ msgstr "" "フィックと一致したトラフィックのみを対象にします。" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "送信側デバイス" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "送信側ゾーン" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "送信" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "iptablesにパススルーする追加の引数を設定してください。注意して設定してくださ" "い!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -766,12 +882,16 @@ msgstr "" "し、全サービスを外部に晒す恐れがあることに、特段の注意を払い使用されなければ" "なりません。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "ポートフォワーディング" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -780,68 +900,81 @@ msgstr "" "ベートなネットワーク上の、特定のコンピュータやサービスへのアクセスを可能にし" "ます。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "プロトコル" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "ルールに一致した受信トラフィックを、内部ホストの設定されたポートへ転送します" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "ルールに一致した受信トラフィックを、設定された内部ホストへ転送します" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -"ハードウェア NAT サポートが必要です。 mt7621 のみにおいて実装されています。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "ハードウェア NAT サポートが必要です。" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "設定された宛先サブネットへのマスカレードを制限する" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "設定された送信元サブネットへのマスカレードを制限する" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "アドレスファミリの制限" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "IP アドレスの書き換え" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "対象のトラフィックを指定されたアクセス元 IP アドレスに書き換えます。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "対象のトラフィックを指定されたアクセス元ポートまたはポート範囲に書き換えま" "す。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "ポートの書き換え" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "ルーティング/NAT オフロード" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - 特定のアクセス元 IP またはポートへの書き換え" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "土曜日" @@ -857,36 +990,36 @@ msgstr "" "確立された接続にマーク値を設定します。フォーマットは value[/mask] です。もし" "マスクが指定されている場合、マスクによって有効なビットのみ設定されます。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "ルーティング/NAT のための、ソフトウェアベースのオフロードです。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "ソフトウェア フローオフロード" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "送信元IPアドレス" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "送信元MACアドレス" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "送信元アドレス" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "送信元ポート" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "送信元ゾーン" @@ -898,7 +1031,7 @@ msgstr "" "このトラフィック ルールを関連付ける、特定の受信側または送信側ネットワークデバ" "イスを指定します。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -906,32 +1039,36 @@ msgstr "" "反映されるトラフィックに対し、外部または内部 IP アドレスのどちらを使用するか" "を指定します。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "開始日 (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "開始時刻 (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "停止日 (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "停止時刻 (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "日曜日" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -939,7 +1076,7 @@ msgstr "" "既存のファイアウォール設定は、 LuCI が正常に機能するように変更する必要があり" "ます。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -947,8 +1084,8 @@ msgstr "" "ファイアウォール機能は、各ネットワークインターフェース上にゾーンを作成してト" "ラフィックの制御を行います。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -964,7 +1101,7 @@ msgstr "" "向であり、例えばlanからwanへの転送設定は、wanからlanへの転送を許可し" "ません。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -978,18 +1115,18 @@ msgstr "" "準のポリシーになります。対象ネットワークは、どのネットワーク設定がこ" "のゾーンに属するかを設定します。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "木曜日" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "時間制限" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "UTC時刻を使用" @@ -997,6 +1134,10 @@ msgstr "UTC時刻を使用" msgid "Time restrictions are enabled for this rule" msgstr "このルールでは時間制限が有効です" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1011,7 +1152,7 @@ msgstr "" "%{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, ポート %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "追跡ヘルパー" @@ -1056,8 +1197,8 @@ msgstr "" "します。例えば、特定のホスト間や、ルーターのWANポートへのトラフィックの拒否を" "設定することができます。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "火曜日" @@ -1065,18 +1206,24 @@ msgstr "火曜日" msgid "Unable to save contents: %s" msgstr "内容を保存できません: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "不明またはインストールされていない conntrack ヘルパー \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "名称未設定の NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "名称未設定の転送" @@ -1085,15 +1232,19 @@ msgstr "名称未設定の転送" msgid "Unnamed rule" msgstr "名称未設定のルール" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "名称未設定のゾーン" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "認識されていないプロトコル" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1103,15 +1254,21 @@ msgstr "" "\"nat\" セクションに変換されたうえで、ファイアウォールは更新された設定を適用" "するために再起動されます。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "外部 IP アドレスを使用" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "内部 IP アドレスを使用" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1119,7 +1276,7 @@ msgstr "" "生の、または非 uci 管理下にあるデバイスによるゾーン トラフィックの区" "分にこのオプションを使用します。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1131,17 +1288,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "有効なファイアウォール マークが必要です" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "水曜日" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "曜日" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "ファイアウォール マークの XOR" @@ -1149,109 +1306,234 @@ msgstr "ファイアウォール マークの XOR" msgid "XOR mark" msgstr "マークの XOR" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "ゾーン ⇒ 転送" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "ゾーン" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "許可" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "すべて" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "すべてのゾーン" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "ファイアウォール マークの適用" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "conntrack ヘルパーの割り当て" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "日" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "書き換えない" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "コネクション追跡を行わない" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "破棄" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "時間" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "分" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "拒否" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "秒" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "このデバイス" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "この新しいゾーン" @@ -1263,6 +1545,11 @@ msgstr "無制限" msgid "unspecified" msgstr "未設定" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "有効なファイアウォール マーク" diff --git a/package/luci/applications/luci-app-firewall/po/ko/firewall.po b/package/luci/applications/luci-app-firewall/po/ko/firewall.po index c4e404b834..57b75626e1 100644 --- a/package/luci/applications/luci-app-firewall/po/ko/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/ko/firewall.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2010-03-30 17:00+0200\n" "PO-Revision-Date: 2022-11-22 08:46+0000\n" "Last-Translator: Taewook Yang (ワリ) \n" -"Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" @@ -35,20 +35,28 @@ msgstr "" msgid "-- add IP --" msgstr "-- IP 추가 --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- MAC 주소 추가 --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -77,7 +85,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -92,68 +100,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "액션" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "고급 설정" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Source zone 로부터의 forward 허용:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Destination zone 으로 forward 허용:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "" @@ -168,24 +186,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -193,23 +216,27 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "사용자 규칙" @@ -223,7 +250,7 @@ msgstr "" "명령을 실행할 수 있습니다. 입력된 명령어들은 매 방화벽 재시작시 default " "ruleset을 불러온 직후 실행됩니다." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -235,17 +262,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "목적지 주소" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "" @@ -253,72 +280,97 @@ msgstr "" msgid "Device name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "활성화" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "NAT 루프백 활성화" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "SYN-flood protection 활성화" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "해당 Zone 의 로그 활성화" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "외부 IP 주소" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "외부 포트" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "추가 변수" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "방화벽" @@ -327,11 +379,15 @@ msgstr "방화벽" msgid "Firewall - Custom Rules" msgstr "방화벽 - 사용자 규칙" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "방화벽 - NAT 규칙" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "방화벽 - 포트 포워드" @@ -339,34 +395,35 @@ msgstr "방화벽 - 포트 포워드" msgid "Firewall - Traffic Rules" msgstr "방화벽 - 트래픽 규칙" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "방화벽 - Zone 설정" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "방화벽 구성 마이그레이션" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "포워드" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "금요일" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "기본 설정" @@ -411,22 +468,55 @@ msgstr "기본 설정" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4와 IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "IPv4 전용" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "IPv6 전용" @@ -434,9 +524,14 @@ msgstr "IPv6 전용" msgid "Inbound device" msgstr "인바운드 장치" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "입력" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "내부 IP 주소" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "내부 포트" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "내부 Zone" @@ -472,11 +571,15 @@ msgstr "잘못된 DSCP 마크" msgid "Invalid limit value" msgstr "잘못된 limit 값" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "로그 메시지 제한" @@ -484,15 +587,16 @@ msgstr "로그 메시지 제한" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -500,25 +604,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "루프백 소스 IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -534,30 +638,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -567,8 +671,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -576,7 +680,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -584,79 +688,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "월요일" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "이름" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "iptables 명령에 추가 변수들을 전달합니다. 주의하여 사용하세요!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -665,12 +795,16 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Port Forward" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -678,64 +812,78 @@ msgstr "" "Port forwarding 기능은 인터넷 상의 원격 컴퓨터가 내부 LAN 에 속한 특정 컴퓨터" "나 서비스에 접속할 수 있도록 합니다." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "프로토콜" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "주어진 destination subnet 으로 Masquerading 제한" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "주어진 source subnet 으로 Masquerading 제한" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Address family 제한" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "토요일" @@ -749,36 +897,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Source IP 주소" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Source MAC 주소" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Source 주소" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "" @@ -788,44 +936,48 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "시작 날짜 (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "종료 날짜 (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "일요일" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -833,8 +985,8 @@ msgstr "" "방화벽 기능을 이용하여 네트워크 인터페이스와 연결된 zone 을 생성할 수 있고 이" "를 이용하여 네트워크 traffic flow 를 제어할 수 있습니다." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -850,7 +1002,7 @@ msgstr "" "unidirectional 인데, 예를 들어 LAN 에서 WAN 으로의 forward 규칙이 " "WAN 에서 LAN 으로의 forward 를 허락하는 것이 아닙니다." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -864,18 +1016,18 @@ msgstr "" "를 오가는 포워드 트래픽에 대한 정책을 뜻합니다. Covered networks 에" "서는 Zone 의 영향을 받을 네트워크들을 지정할 수 있습니다." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "목요일" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "UTC 기준시" @@ -883,6 +1035,10 @@ msgstr "UTC 기준시" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -892,7 +1048,7 @@ msgid "" "ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -928,8 +1084,8 @@ msgstr "" "다. 예를 들어 특정 host 들 사이의 트래픽을 차단하거나 공유기의 WAN port 를 " "open 할때 사용됩니다." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "화요일" @@ -937,18 +1093,24 @@ msgstr "화요일" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -957,36 +1119,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -996,17 +1168,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "수요일" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "주일" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -1014,109 +1186,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zone 내역" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1128,6 +1425,11 @@ msgstr "무제한" msgid "unspecified" msgstr "명시되지 않음" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/lt/firewall.po b/package/luci/applications/luci-app-firewall/po/lt/firewall.po new file mode 100644 index 0000000000..e2822a7f12 --- /dev/null +++ b/package/luci/applications/luci-app-firewall/po/lt/firewall.po @@ -0,0 +1,1505 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-10-16 23:01+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.1\n" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 +msgid "" +"%{src?%{dest?Forwarded:Incoming}:Outgoing} %{ipv6?%{ipv4?IPv4 and " +"IPv6:IPv6}:IPv4}%{proto?, protocol " +"%{proto#%{next?, }%{item.types?%{item." +"name}ICMP with types %{item.types#%{next?, }" +"%{item}}:%{item.name}}}}%{mark?, mark " +"%{mark.val}}%{dscp?, DSCP %{dscp." +"inv?%{dscp.val}:%{dscp.val}}}%{helper?, helper " +"%{helper.inv?%{helper.val}:%{helper." +"val}}}" +msgstr "" +"%{src?%{dest?Persiųsta:Gaunama}:Išsiunčiama} %{ipv6?%{ipv4?IPv4 " +"and IPv6:IPv6}:IPv4}%{proto?, protocol " +"%{proto#%{next?, }%{item.types?%{item." +"name}„ICMP“ su tipais %{item.types#%{next?, }" +"%{item}}:%{item.name}}}}%{mark?, mark " +"%{mark.val}}%{dscp?, DSCP %{dscp.inv?%{dscp.val}:" +"%{dscp.val}}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 +msgid "-- add IP --" +msgstr "-- Pridėti „IP“ --" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 +msgid "-- add MAC --" +msgstr "-- Pridėti „MAC“ --" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 +msgid "" +"Accept %{src?%{dest?forward:input}:output}" +msgstr "" +"Priimti %{src?%{dest?forward:input}:" +"output}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 +msgid "Prevent source rewrite" +msgstr "Neleisti išteklio perrašymo" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 +msgid "" +"Forward to %{dest}%{dest_ip? IP " +"%{dest_ip}}%{dest_port? port %{dest_port}}" +msgstr "" +"Persiųsti to %{dest}%{dest_ip? IP " +"%{dest_ip}}%{dest_port? port %{dest_port}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:115 +msgid "" +"Drop %{src?%{dest?forward:input}:output}" +msgstr "" +"Mesti %{src?%{dest?forward:input}:output}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:133 +msgid "" +"Assign DSCP classification %{set_dscp}" +"" +msgstr "" +"Priskirti „DSCP“ classification " +"%{set_dscp}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:127 +msgid "" +"Assign conntrack helper " +"%{set_helper}" +msgstr "" +"Priskirti „conntrack“ helper " +"%{set_helper}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:130 +msgid "" +"%{set_mark?Assign:XOR} firewall mark " +"%{set_mark?:%{set_xmark}}" +msgstr "" +"%{set_mark?Assign:XOR} užkardos žymė " +"%{set_mark?:%{set_xmark}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 +msgid "Automatically rewrite source IP" +msgstr "" +"Automatiškai perrašyti šaltinio „IP“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:124 +msgid "" +"Do not track %{src?%{dest?forward:input}:" +"output}" +msgstr "" +"Nesekti %{src?%{dest?forward:input}:" +"output}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:121 +msgid "" +"Reject %{src?%{dest?forward:input}:output}" +msgstr "" +"Atmesti %{src?%{dest?forward:input}:" +"output}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +msgid "" +"Statically rewrite to source %{snat_ip?IP " +"%{snat_ip}} %{snat_port?port %{snat_port}}" +msgstr "" +"Statistiškai perrašyti to source %{snat_ip?" +"IP %{snat_ip}} %{snat_port?port %{snat_port}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 +msgid "A rewrite IP must be specified!" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 +msgid "ACCEPT - Disable address rewriting" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 +msgid "Action" +msgstr "Veiksmas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 +msgid "" +"Additional raw iptables arguments to classify zone destination " +"traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " +"traffic." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 +msgid "" +"Additional raw iptables arguments to classify zone source traffic, " +"e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +msgid "Advanced Settings" +msgstr "Pažangūs nustatymai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +msgid "Allow \"invalid\" traffic" +msgstr "Leisti „techniškai neveikiančiai“ veiklai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 +msgid "Allow forward from source zones:" +msgstr "Leisti perleidimą iš išteklio zonų:" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 +msgid "Allow forward to destination zones:" +msgstr "Leisti perleidimą į paskirties zonas:" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 +msgid "Any" +msgstr "Bet koks" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 +msgid "Any day" +msgstr "Bet kokią dieną" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:316 +msgid "" +"Apply a bitwise XOR of the given value and the existing mark value on " +"established connections. Format is value[/mask]. If a mask is specified then " +"those bits set in the mask are zeroed out." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 +msgid "Apply the given DSCP class or value to established connections." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 +msgid "Assign the specified connection tracking helper to matched traffic." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +msgid "Automatic helper assignment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +msgid "" +"Automatically assign conntrack helpers based on traffic protocol and port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Komentuoti" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 +msgid "Conntrack Settings" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 +msgid "Conntrack helpers" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:16 +msgid "Contents have been saved." +msgstr "Turinys buvo išsaugotas." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 +msgid "Continue" +msgstr "Tęsti" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Rodikliai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 +msgid "Covered devices" +msgstr "Įtraukti/Apgaubti įrenginiai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 +msgid "Covered networks" +msgstr "Įtraukti/Apgaubti tinklai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 +msgid "Covered subnets" +msgstr "Įtraukti/Apgaubti potinkliai" + +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 +msgid "Custom Rules" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:26 +msgid "" +"Custom rules allow you to execute arbitrary iptables commands which are not " +"otherwise covered by the firewall framework. The commands are executed after " +"each firewall restart, right after the default ruleset has been loaded." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 +msgid "DSCP classification" +msgstr "„DSCP“ klasifikacija" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 +msgid "DSCP mark" +msgstr "„DSCP“ žymė" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:296 +msgid "DSCP mark required" +msgstr "„DSCP“ žymė reikalinga" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +msgid "Destination address" +msgstr "Paskirties/Kelionės tikslo adresas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 +msgid "Destination port" +msgstr "Paskirties/Kelionės tikslo prievadas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 +msgid "Destination zone" +msgstr "Paskirties/Kelionės tikslo zona" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:268 +msgid "Device name" +msgstr "Įrenginio vardas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +msgid "" +"Do not install extra rules to reject forwarded traffic with conntrack state " +"invalid. This may be required for complex asymmetric route setups." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 +msgid "Drop invalid packets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 +msgid "Enable" +msgstr "Įjungti" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 +msgid "Enable NAT Loopback" +msgstr "Įjungti/Įgalinti „NAT Loopback“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 +msgid "Enable SYN-flood protection" +msgstr "Įjungti/Įgalinti „SYN-flood“ apsauga" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +msgid "Enable logging on this zone" +msgstr "Įjungti/Įgalinti žurnalinima šitoje zonoje" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Įjungti tinklo adresus ir prievado vertimą „IPv4 (NAT4 arba NAPT4)“ " +"išeinančiam srautui šitoje zonoje. Tai tipiškai įjungiama/įgalinima " +"„wan“ zonoje." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Įjungti tinklo adresus ir prievado vertimą „IPv6 (NAT6 arba NAPT6)“ " +"išeinančiam srautui šitoje zonoje." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Įjungta" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 +msgid "Expecting: %s" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 +msgid "Experimental feature. Not fully compatible with QoS/SQM." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 +msgid "Explicitly choses allowed connection tracking helpers for zone traffic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 +msgid "External IP address" +msgstr "Išorinis „IP“ adresas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 +msgid "External port" +msgstr "Išorinis prievadas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 +msgid "Extra arguments" +msgstr "Papildomi argumentai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 +msgid "Extra destination arguments" +msgstr "Papildomi paskirties/kelionės tikslo argumentai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 +msgid "Extra iptables arguments" +msgstr "Papildomi „iptables“ argumentai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 +msgid "Extra source arguments" +msgstr "Papildomi išteklio argumentai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Šeima" + +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 +msgid "Firewall" +msgstr "Užkarda" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:25 +msgid "Firewall - Custom Rules" +msgstr "Užkarda - Atskiros/Pasirinktinės taisyklės" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Užkarda - „IP“ rinkiniai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 +msgid "Firewall - NAT Rules" +msgstr "Užkarda - „NAT“ taisyklės" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 +msgid "Firewall - Port Forwards" +msgstr "Užkarda – Prievadų persiuntimas/-ai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:173 +msgid "Firewall - Traffic Rules" +msgstr "Užkarda - Srauto taisyklės" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +msgid "Firewall - Zone Settings" +msgstr "Užkarda - Zonų nustatymai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 +msgid "Firewall configuration migration" +msgstr "Užkardos konfigūracijos migracija" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 +msgid "Forward" +msgstr "Persiųsti" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 +msgid "" +"Forwarded %{ipv6?%{ipv4?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" +"}" +msgstr "" +"Persiųsta %{ipv6?%{ipv4?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" +"}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 +msgid "Friday" +msgstr "Penktadienis" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 +msgid "" +"From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }" +"%{item." +"ival}}}" +msgstr "" +"Iš %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }" +"%{item." +"ival}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:64 +msgid "" +"From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }" +"%{item." +"ival}}}%{src_mac?, MAC %{src_mac#%{next?, }%{item.ival}" +"}}" +msgstr "" +"Iš %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }" +"%{item." +"ival}}}%{src_mac?, MAC %{src_mac#%{next?, }%{item.ival}" +"}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 +msgid "" +"From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }%{item.ival}}}%{src_mac?, " +"MAC %{src_mac#%{next?, }%{item.ival}}}" +msgstr "" +"Iš %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }%{item.ival}}}%{src_mac?, " +"MAC %{src_mac#%{next?, }%{item.ival}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 +msgid "General Settings" +msgstr "Bendri nustatymai" + +#: applications/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json:3 +msgid "Grant access to firewall configuration" +msgstr "" +"Duoti prieigą prie užkardos konfigūravimo „pkg – firewall configuration“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 +msgid "Hardware flow offloading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "„IP“ rinkiniai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "„IPs“/Tinklai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "„IPs“/Tinklai/„MACs“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "„IPv4“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 +msgid "IPv4 and IPv6" +msgstr "„IPv4“ ir „IPv6“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +msgid "IPv4 only" +msgstr "Tik „IPv4“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "„IPv6“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 +msgid "IPv6 only" +msgstr "Tik „IPv6“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 +msgid "Inbound device" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 +msgid "" +"Incoming %{ipv6?%{ipv4?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " +"with types %{item.types#%{next?, }%{item}}:" +"%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}" +msgstr "" +"Incoming %{ipv6?%{ipv4?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " +"with types %{item.types#%{next?, }%{item}}:" +"%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +msgid "Input" +msgstr "Įvestis" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 +msgid "Internal IP address" +msgstr "Vidinis „IP“ adresas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 +msgid "Internal port" +msgstr "Vidinis prievadas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 +msgid "Internal zone" +msgstr "Vidinė zona" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:304 +msgid "Invalid DSCP mark" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:372 +msgid "Invalid limit value" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 +msgid "Limit burst" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 +msgid "Limit log messages" +msgstr "Riboti žurnalo pranešimus" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:348 +msgid "Limit matching" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 +msgid "" +"Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +msgid "Limited masquerading enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:349 +msgid "Limits traffic matching to the specified rate." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 +msgid "Loopback source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 +msgid "MASQUERADE - Automatically rewrite to outbound interface IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 +msgid "MSS clamping" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 +msgid "Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 +msgid "Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 +msgid "Match DSCP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:292 +msgid "Match ICMP type" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:248 +msgid "Match device" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 +msgid "Match forwarded traffic directed at the given IP address." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +msgid "" +"Match forwarded traffic directed at the given destination port or port range." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +msgid "Match forwarded traffic from this IP or range." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 +msgid "" +"Match forwarded traffic originating from the given source port or port range." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 +msgid "Match helper" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 +msgid "" +"Match incoming traffic directed at the given destination port or port range " +"on this host" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 +msgid "Match mark" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 +msgid "Match traffic using the specified connection tracking helper." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:318 +msgid "Matches a specific firewall mark or a range of different marks." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 +msgid "Matches forwarded traffic using the specified outbound network device." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 +msgid "Matches traffic carrying the specified DSCP marking." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 +msgid "" +"Maximum initial number of packets to match: this number gets recharged by " +"one every time the limit specified above is not reached, up to this number." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 +msgid "Monday" +msgstr "Pirmadienis" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 +msgid "Month Days" +msgstr "Mėnesis/Mėnuo, dienos" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 +msgid "NAT Rules" +msgstr "„NAT“ taisyklės" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +msgid "" +"NAT rules allow fine grained control over the source IP to use for outbound " +"or forwarded traffic." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 +msgid "Name" +msgstr "Vardas/Pavadinimas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 +msgid "Only match incoming traffic directed at the given IP address." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 +msgid "Only match incoming traffic from these MACs." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +msgid "Only match incoming traffic from this IP or range." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 +msgid "" +"Only match incoming traffic originating from the given source port or port " +"range on the client host" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 +msgid "Outbound device" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 +msgid "Outbound zone" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 +msgid "Output" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 +msgid "Passes additional arguments to iptables. Use with care!" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 +msgid "" +"Passing raw iptables arguments to source and destination traffic " +"classification rules allows to match packets based on other criteria than " +"interfaces or subnets. These options should be used with extreme care as " +"invalid values could render the firewall ruleset broken, completely exposing " +"all services." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 +msgid "Port Forwards" +msgstr "Prievadų persiuntimai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 +msgid "" +"Port forwarding allows remote computers on the Internet to connect to a " +"specific computer or service within the private LAN." +msgstr "" +"Prievadų persiuntimas leidžia išoriniams kompiuteriams internete prisijungti " +"prie Jūsų specifinio kompiuterio ar paslaugos veikiančio Jūsų privačiame " +"vietiniame („LAN“) tinkle." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Prievadų pasiekiamumas/numatomas apribojimas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +msgid "Protocol" +msgstr "Protokolas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 +msgid "" +"Redirect matched incoming traffic to the given port on the internal host" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 +msgid "Redirect matched incoming traffic to the specified internal host" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 +msgid "Restrict Masquerading to given destination subnets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 +msgid "Restrict Masquerading to given source subnets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 +msgid "Restrict to address family" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 +msgid "Rewrite IP address" +msgstr "Perrašyti „IP“ adresą" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +msgid "Rewrite matched traffic to the specified source IP address." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 +msgid "Rewrite matched traffic to the specified source port or port range." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 +msgid "Rewrite port" +msgstr "Perrašyti prievadą" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +msgid "Routing/NAT Offloading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +msgid "SNAT - Rewrite to specific source IP or port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 +msgid "Saturday" +msgstr "Šeštadienis" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 +msgid "Set mark" +msgstr "Nustatyti žymę" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:317 +msgid "" +"Set the given mark value on established connections. Format is value[/mask]. " +"If a mask is specified then only those bits set in the mask are modified." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 +msgid "Software based offloading for routing/NAT" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +msgid "Software flow offloading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +msgid "Source IP address" +msgstr "Šaltinio „IP“ adresas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 +msgid "Source MAC address" +msgstr "Šaltinio „MAC“ adresas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +msgid "Source address" +msgstr "Šaltinio adresas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 +msgid "Source port" +msgstr "Šaltinio prievadas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 +msgid "Source zone" +msgstr "Šaltinio zona" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:269 +msgid "" +"Specifies whether to tie this traffic rule to a specific inbound or outbound " +"network device." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 +msgid "" +"Specifies whether to use the external or the internal IP address for " +"reflected traffic." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 +msgid "Start Date (yyyy-mm-dd)" +msgstr "Pradžios data (Metai-Mėnuo-Diena/pvz:1990-03-11)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 +msgid "Start Time (hh:mm:ss)" +msgstr "Pradėti laiką (val:min:sek)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 +msgid "Stop Date (yyyy-mm-dd)" +msgstr "Pabaigos data (Metai-Mėnuo-Diena/pvz:1993-08-31)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 +msgid "Stop Time (hh:mm:ss)" +msgstr "Stabdyti laiką (val:min:sek)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Talpos metodas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 +msgid "Sunday" +msgstr "Sekmadienis" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 +msgid "" +"The existing firewall configuration needs to be changed for LuCI to function " +"properly." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 +msgid "" +"The firewall creates zones over your network interfaces to control network " +"traffic flow." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 +msgid "" +"The options below control the forwarding policies between this zone (%s) and " +"other zones. Destination zones cover forwarded traffic " +"originating from %q. Source zones match forwarded " +"traffic from other zones targeted at %q. The forwarding " +"rule is unidirectional, e.g. a forward from lan to wan does " +"not imply a permission to forward from wan to lan as well." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 +msgid "" +"This section defines common properties of %q. The input and " +"output options set the default policies for traffic entering and " +"leaving this zone while the forward option describes the policy for " +"forwarded traffic between different networks within the zone. Covered " +"networks specifies which available networks are members of this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 +msgid "Thursday" +msgstr "Ketvirtadienis" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 +msgid "Time Restrictions" +msgstr "Laiko ribojimai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 +msgid "Time in UTC" +msgstr "Laikas pagal GMT" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:243 +msgid "Time restrictions are enabled for this rule" +msgstr "Laiko ribojimai yra įgalinti šiai taisyklei" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Pasibaigė užklausos laikas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 +msgid "" +"To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " +"%{dest_ip#%{next?, }%{item.ival}
    }}%{dest_port?, port %{dest_port#%{next?, }" +"%{item." +"ival}}}" +msgstr "" +"Į %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " +"%{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }" +"%{item." +"ival}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 +msgid "" +"To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port " +"%{dest_port#%{next?, }%{item.ival}}}" +msgstr "" +"Į %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, " +"IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port " +"%{dest_port#%{next?, }%{item.ival}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 +msgid "" +"To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" +msgstr "" +"Į %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 +msgid "Tracking helper" +msgstr "Sekimo pagalbininkas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:176 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:35 +msgid "Traffic Rules" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:174 +msgid "" +"Traffic rules define policies for packets traveling between different zones, " +"for example to reject traffic between certain hosts or to open WAN ports on " +"the router." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 +msgid "Tuesday" +msgstr "Antradienis" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:19 +msgid "Unable to save contents: %s" +msgstr "Nepavyko išsaugoti turinį: %s" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 +msgid "Unknown or not installed conntrack helper \"%s\"" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 +msgid "Unnamed NAT" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 +msgid "Unnamed forward" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:190 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:210 +msgid "Unnamed rule" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 +msgid "Unnamed zone" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 +msgid "Unrecognized protocol" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 +msgid "" +"Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " +"be converted to \"nat\" sections and the firewall will be restarted to apply " +"the updated configuration." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 +msgid "Use external IP address" +msgstr "Naudoti išorinį „IP“ adresą" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 +msgid "Use internal IP address" +msgstr "Naudoti vidinį „IP“ adresą" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Naudoti „ipset“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 +msgid "" +"Use this option to classify zone traffic by raw, non-uci managed " +"network devices." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 +msgid "" +"Use this option to classify zone traffic by source or destination subnet " +"instead of networks or devices." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:330 +msgid "Valid firewall mark required" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 +msgid "Wednesday" +msgstr "Trečiadienis" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 +msgid "Week Days" +msgstr "Savaitės dienos" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 +msgid "XOR firewall mark" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 +msgid "XOR mark" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "Jūsų įrenginyje neveikia „firewall4“." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "Jūsų įrenginyje veikia „firewall4“." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 +msgid "Zone ⇒ Forwardings" +msgstr "Zona ⇒ Perleidimai" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 +msgid "Zones" +msgstr "Zonos" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 +msgid "accept" +msgstr "priimti" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 +msgid "any" +msgstr "bet koks" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 +msgid "any zone" +msgstr "bet kokia zona" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "bet koks/visi" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 +msgid "apply firewall mark" +msgstr "patvirtinti užkardos žymę" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 +msgid "assign conntrack helper" +msgstr "Priskirti „conntract helper“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "automatinis" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 +msgid "day" +msgstr "diena" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: Paskirties „IP“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: Paskirties „MAC“ adresas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: Paskirties „(sub)net“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: Paskirties Prievadas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: Paskirties „ipset“*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 +msgid "do not rewrite" +msgstr "neperrašyti" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 +msgid "don't track" +msgstr "Nesekti" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 +msgid "drop" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 +msgid "hour" +msgstr "valanda" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: „IP“ adresas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "„ip[/cidr]
    “" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "„ipv4“" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: „MAC“ adresas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "„macaddr|ip[/cidr]
    “" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 +msgid "minute" +msgstr "minutė" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "port: Prievadas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +msgid "reject" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 +msgid "second" +msgstr "sekundė" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 +msgid "this device" +msgstr "šis įrenginys" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 +msgid "this new zone" +msgstr "ši nauja zona" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:353 +msgid "unlimited" +msgstr "neribotas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:250 +msgid "unspecified" +msgstr "nenustatyta/-s/-i" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "iki 65536 įrašų." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 +msgid "valid firewall mark" +msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/mr/firewall.po b/package/luci/applications/luci-app-firewall/po/mr/firewall.po index dadec0e843..767b56244f 100644 --- a/package/luci/applications/luci-app-firewall/po/mr/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/mr/firewall.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2010-03-30 17:00+0200\n" "PO-Revision-Date: 2020-02-07 09:18+0000\n" "Last-Translator: Prachi Joshi \n" -"Language-Team: Marathi \n" "Language: mr\n" "MIME-Version: 1.0\n" @@ -35,20 +35,28 @@ msgstr "" msgid "-- add IP --" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -77,7 +85,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -92,68 +100,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "प्रगत सेटिंग्ज" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "" @@ -168,24 +186,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -193,23 +216,27 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "" @@ -220,7 +247,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -232,17 +259,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "गंतव्य पोर्ट" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "" @@ -250,72 +277,97 @@ msgstr "" msgid "Device name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "सक्षम करा" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "" @@ -324,11 +376,15 @@ msgstr "" msgid "Firewall - Custom Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "" @@ -336,34 +392,35 @@ msgstr "" msgid "Firewall - Traffic Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "सामान्य सेटिंग्ज" @@ -408,22 +465,55 @@ msgstr "सामान्य सेटिंग्ज" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 आणि IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "केवळ IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "केवळ IPv6" @@ -431,9 +521,14 @@ msgstr "केवळ IPv6" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "" @@ -469,11 +568,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "" @@ -481,15 +584,16 @@ msgstr "" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -497,25 +601,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -531,30 +635,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -564,8 +668,8 @@ msgstr "" msgid "Match mark" msgstr "चिन्ह जुळवा" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -573,7 +677,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -581,79 +685,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "नाव" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -662,75 +792,93 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "प्रोटोकॉल" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "" @@ -744,36 +892,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "स्रोत पोर्ट" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "" @@ -783,51 +931,55 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -837,7 +989,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -846,18 +998,18 @@ msgid "" "networks specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -865,6 +1017,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -874,7 +1030,7 @@ msgid "" "ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -907,8 +1063,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "" @@ -916,18 +1072,24 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -936,36 +1098,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -975,17 +1147,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -993,109 +1165,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1107,6 +1404,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/ms/firewall.po b/package/luci/applications/luci-app-firewall/po/ms/firewall.po index b2e21feaa4..42e083d50a 100644 --- a/package/luci/applications/luci-app-firewall/po/ms/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/ms/firewall.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-03-31 12:26+0000\n" "Last-Translator: Faruki Ramly \n" -"Language-Team: Malay \n" "Language: ms\n" "MIME-Version: 1.0\n" @@ -33,20 +33,28 @@ msgstr "" msgid "-- add IP --" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -75,7 +83,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -90,68 +98,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Tindakan" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Tetapan Lanjutan" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "" @@ -166,24 +184,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -191,23 +214,27 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "" @@ -218,7 +245,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -230,17 +257,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "" @@ -248,72 +275,97 @@ msgstr "" msgid "Device name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "" @@ -322,11 +374,15 @@ msgstr "" msgid "Firewall - Custom Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "" @@ -334,34 +390,35 @@ msgstr "" msgid "Firewall - Traffic Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "" @@ -406,22 +463,55 @@ msgstr "" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "" @@ -429,9 +519,14 @@ msgstr "" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "" @@ -467,11 +566,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "" @@ -479,15 +582,16 @@ msgstr "" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -495,25 +599,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -529,30 +633,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -562,8 +666,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -571,7 +675,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -579,79 +683,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -660,75 +790,93 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "" @@ -742,36 +890,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "" @@ -781,51 +929,55 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -835,7 +987,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -844,18 +996,18 @@ msgid "" "networks specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -863,6 +1015,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -872,7 +1028,7 @@ msgid "" "ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -905,8 +1061,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "" @@ -914,18 +1070,24 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -934,36 +1096,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -973,17 +1145,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -991,109 +1163,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1105,6 +1402,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/nb_NO/firewall.po b/package/luci/applications/luci-app-firewall/po/nb_NO/firewall.po index ac278ee82e..64fbffd997 100644 --- a/package/luci/applications/luci-app-firewall/po/nb_NO/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/nb_NO/firewall.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2021-11-20 21:48+0000\n" +"PO-Revision-Date: 2023-08-02 12:53+0000\n" "Last-Translator: Allan Nordhøy \n" -"Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9.1\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -31,20 +31,28 @@ msgstr "" msgid "-- add IP --" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -73,7 +81,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -88,68 +96,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Handling" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Avanserte innstillinger" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Tillat videresending fra kilde soner:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Tillat videresending til destinasjon soner:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Enhver" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "" @@ -164,24 +182,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -189,23 +212,27 @@ msgstr "" msgid "Contents have been saved." msgstr "Innholdet har blitt lagret." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Fortsett" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Gjeldene nettverk" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Egendefinerte Regler" @@ -219,7 +246,7 @@ msgstr "" "som ikke dekkes av brannmurens standardoppsett. Kommandoene utføres etter " "hver omstart av brannmuren, rett etter at standard regelsett er lastet." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -231,17 +258,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Destinasjon adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Målport" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Målsone" @@ -249,72 +276,97 @@ msgstr "Målsone" msgid "Device name" msgstr "Enhetsnavn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Forkast ugyldige pakker" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Skru på" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Aktiver NAT Tilbakekobling" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Aktiver SYN-flood beskyttelse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Aktiver logging av denne sonen" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Aktivert" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Forventer: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Ekstern IP adressse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Ekstern port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Ekstra argumenter" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Brannmur" @@ -323,11 +375,15 @@ msgstr "Brannmur" msgid "Firewall - Custom Rules" msgstr "Brannmur - Egendefinerte Regler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Brannmur - Port Videresending" @@ -335,34 +391,35 @@ msgstr "Brannmur - Port Videresending" msgid "Firewall - Traffic Rules" msgstr "Brannmur - Trafikk Regler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Brannmur - Sone Innstillinger" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Videresend" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Generelle innstillinger" @@ -407,22 +464,55 @@ msgstr "Generelle innstillinger" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 og IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Kun IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Kun IPv6" @@ -430,9 +520,14 @@ msgstr "Kun IPv6" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Inndata" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Intern IP adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Intern port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Intern sone" @@ -468,11 +567,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Begrens logging" @@ -480,15 +583,16 @@ msgstr "Begrens logging" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -496,25 +600,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSS Kontroll (Clamping)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Masquerading" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Match" @@ -530,30 +634,30 @@ msgstr "Match ICMP type" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -565,8 +669,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -574,7 +678,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -582,53 +686,67 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Navn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Nettmaske" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Match kun innkommende trafikk rettet mot den oppgitt IP adresse." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Match kun innkommende trafikk fra disse MAC adresser." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Match kun innkommende trafikk fra denne IP eller IP område." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -637,26 +755,38 @@ msgstr "" "fra portområdet til klienten" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Utdata" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "Sender flere argumenter til iptables. Bruk med forsiktighet!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -665,12 +795,16 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Port Videresendinger" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -678,66 +812,80 @@ msgstr "" "Port videresending tillater at eksterne datamaskiner på Internett kan koble " "seg til en bestemt maskin eller tjeneste innenfor det private LAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protokoll" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Viderekoble matchet innkommende trafikk til den oppgitte porten på intern " "vert" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Viderekoble matchet innkommende trafikk til den angitte interne vert" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Begrens Masquerading til oppgitt destinasjons subnett" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Begrens Masqeuerading til oppgitt kilde subnett" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Begrens til adresse familie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "" @@ -751,36 +899,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Kilde IP adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Kilde MAC adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Kilde adresse" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Kilde port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Kilde sone" @@ -790,44 +938,48 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -835,8 +987,8 @@ msgstr "" "Brannmuren skaper soner over nettverkets grensesnitt for å styre " "nettverkstrafikken." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -852,7 +1004,7 @@ msgstr "" "ved videresending er enveis, d.v.s at videresending fra LAN til WAN " "ikke automatisk også tillater videresending fra WAN til LAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 #, fuzzy msgid "" "This section defines common properties of %q. The input and " @@ -868,18 +1020,18 @@ msgstr "" "spesifiserer hvilken av de tilgjengelige nettverk som er medlem av denne " "sone." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -887,6 +1039,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -896,7 +1052,7 @@ msgid "" "ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -932,8 +1088,8 @@ msgstr "" "for eksempel for å avvise trafikk mellom visse verter eller for å åpne WAN " "porter på ruteren." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "" @@ -941,18 +1097,24 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -961,36 +1123,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1000,17 +1172,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -1018,109 +1190,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Sone = Videresendinger" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Soner" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "godta" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "enhver" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "enhver sone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "ikke track" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "forkast" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "avslå" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1132,6 +1429,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/nl/firewall.po b/package/luci/applications/luci-app-firewall/po/nl/firewall.po index 78b7769616..eccd273ecf 100644 --- a/package/luci/applications/luci-app-firewall/po/nl/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/nl/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2022-11-04 10:26+0000\n" -"Last-Translator: fodiator \n" -"Language-Team: Dutch \n" +"Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -30,14 +30,36 @@ msgid "" ""\">%{helper.val}:%{helper." "val}}}" msgstr "" +"%{src?%{dest?Forwarded:Inkomend}:Uitgaand} %{ipv6?%{ipv4?IPv4 and " +"IPv6:IPv6}:IPv4}%{proto?, protocol " +"%{proto#%{next?, }%{item.types?%{item." +"name}ICMP met types %{item.types#%{next?, }" +"%{item}}:%{item.name}}}}%{mark?, mark " +"%{mark.val}}%{dscp?, DSCP %{dscp.inv?%{dscp.val}:" +"%{dscp.val}}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 msgid "-- add IP --" -msgstr "IP adres toevoegen" +msgstr "-- IP toevoegen --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" -msgstr "MAC adres toevoegen" +msgstr "-- MAC toevoegen --" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" @@ -46,13 +68,11 @@ msgstr "" "Accepteer %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 -#, fuzzy +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Voorkom overschrijven van bron" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 -#, fuzzy +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -61,109 +81,139 @@ msgstr "" "%{dest_ip}}%{dest_port? port %{dest_port}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:115 -#, fuzzy msgid "" "Drop %{src?%{dest?forward:input}:output}" msgstr "" -"Drop %{src?%{dest?forward:input}:output}" +"Uitgang %{src?%{dest?forward:input}:output}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:133 msgid "" "Assign DSCP classification %{set_dscp}" "" msgstr "" +"Toewijzen DSCP classificatie " +"%{set_dscp}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:127 msgid "" "Assign conntrack helper " "%{set_helper}" msgstr "" +"Geassocieerde tracking helper " +"%{set_helper}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:130 msgid "" "%{set_mark?Assign:XOR} firewall mark " "%{set_mark?:%{set_xmark}}" msgstr "" +"%{set_mark?Assign:XOR} Firewall markering " +"%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" +"Automatisch herschrijven bron IP" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:124 msgid "" "Do not track %{src?%{dest?forward:input}:" "output}" msgstr "" +"Niet traceren %{src?%{dest?forward:" +"input}:output}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:121 msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" +"Afwijzen %{src?%{dest?forward:input}:" +"output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" +"Statisch herschrijven naar bron %{snat_ip?" +"IP %{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" -msgstr "" +msgstr "Een herschrijf IP moet gespecificeerd worden!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" -msgstr "" +msgstr "ACCEPTEREN - Herschrijven van adres uitschakelen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" -msgstr "" +msgstr "Actie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" +"Extra ruwe iptables argumenten om zonebestemmingsverkeer te " +"classificeren, bv. -p tcp --dport 443 om alleen overeen te " +"komen met uitgaand HTTPS-verkeer." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" +"Extra ruwe iptables argumenten om zonebronverkeer te classificeren, " +"bv. -p tcp --sport 443 om alleen inkomend HTTPS-verkeer te " +"matchen." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Adres familie, het interne IP-adres moet overeenkomen met" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" +"Adres familie, bronadres, bestemmingsadres, herschreven IP-adres moeten " +"overeenkomen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" -msgstr "" +msgstr "Geavanceerde instellingen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" -msgstr "" +msgstr "Laat \"ongeldig\" verkeer toe" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" -msgstr "" +msgstr "Doorsturen vanuit bronzones toestaan:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" -msgstr "" +msgstr "Doorsturen naar bestemmingszones toestaan:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" -msgstr "" +msgstr "Elke" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" -msgstr "" +msgstr "Elke dag" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:316 msgid "" @@ -171,55 +221,73 @@ msgid "" "established connections. Format is value[/mask]. If a mask is specified then " "those bits set in the mask are zeroed out." msgstr "" +"Past een bitwise XOR toe van de gegeven waarde en de bestaande markeerwaarde " +"op gevestigde verbindingen. Formaat is waarde[/masker]. Als een masker is " +"opgegeven, worden de bits in het masker op nul gezet." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Apply the given DSCP class or value to established connections." msgstr "" +"Past de opgegeven DSCP-klasse of -waarde toe op tot stand gebrachte " +"verbindingen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" +"Wijst de gespecificeerde helper voor het volgen van verbindingen toe aan " +"gematcht verkeer." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" -msgstr "" +msgstr "Automatische helper opdracht" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" +"Automatisch conntrack helpers toewijzen op basis van verkeersprotocol en " +"poort" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Opmerking" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" -msgstr "" +msgstr "Conntrack Instellingen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" -msgstr "" +msgstr "Conntrack helpers" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:16 msgid "Contents have been saved." -msgstr "" +msgstr "De inhoud is opgeslagen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" -msgstr "" +msgstr "Doorgaan" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Tellers" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" -msgstr "" +msgstr "Gedekte apparaten" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" -msgstr "" +msgstr "Gedekte netwerken" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" -msgstr "" +msgstr "Gedekte subnetten" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" -msgstr "" +msgstr "Aangepaste regels" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:26 msgid "" @@ -227,151 +295,199 @@ msgid "" "otherwise covered by the firewall framework. The commands are executed after " "each firewall restart, right after the default ruleset has been loaded." msgstr "" +"Aangepaste regels laten u toe om willekeurige iptables-commando's uit te " +"voeren die anders niet onder het firewall raamwerk vallen. De commando's " +"worden uitgevoerd na elke herstart van de firewall, direct nadat de " +"standaardregelset is geladen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" -msgstr "" +msgstr "DSCP classificatie" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 msgid "DSCP mark" -msgstr "" +msgstr "DSCP markering" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:296 msgid "DSCP mark required" -msgstr "" +msgstr "DSCP markering vereist" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" -msgstr "" +msgstr "Bestemmingsadres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" -msgstr "" +msgstr "Bestemmingspoort" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" -msgstr "" +msgstr "Bestemmingszone" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:268 msgid "Device name" -msgstr "" +msgstr "Naam apparaat" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" +"Installeer geen extra regels om doorgestuurd verkeer met conntrackstatus " +"ongeldig te weigeren. Dit kan nodig zijn voor complexe " +"asymmetrische route-instellingen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" -msgstr "" +msgstr "Verwijder ongeldige pakketten" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" -msgstr "" +msgstr "Activeren" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" -msgstr "" +msgstr "NAT Loopback inschakelen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" -msgstr "" +msgstr "SYN-flood bescherming inschakelen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" +msgstr "Logging op deze zone inschakelen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Netwerkadres- en poortvertaling IPv4 (NAT4 of NAPT4) inschakelen voor " +"uitgaand verkeer in deze zone. Dit is meestal ingeschakeld in de zone " +"wan." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." msgstr "" +"Netwerkadres- en poortvertaling IPv6 (NAT6 of NAPT6) inschakelen voor " +"uitgaand verkeer op deze zone." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Ingeschakeld" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "Schakelt het telling bijhouden van pakketten en bytes voor de set in." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" -msgstr "" +msgstr "Verwacht: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." -msgstr "" +msgstr "Experimentele functie. Niet volledig compatibel met QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" -msgstr "" +msgstr "Kiest expliciet toegestane connectie tracking helpers voor zoneverkeer" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" -msgstr "" +msgstr "Extern IP-adres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" -msgstr "" +msgstr "Externe poort" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" -msgstr "" +msgstr "Extra argumenten" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" -msgstr "" +msgstr "Extra bestemmingsargumenten" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" -msgstr "" +msgstr "Extra iptables argumenten" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" -msgstr "" +msgstr "Extra bron argumenten" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Familie" #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" -msgstr "" +msgstr "Firewall" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:25 msgid "Firewall - Custom Rules" -msgstr "" +msgstr "Firewall - Aangepaste regels" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Firewall - IP sets" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" -msgstr "" +msgstr "Firewall - NAT-regels" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" -msgstr "" +msgstr "Firewall - Poort doorsturen" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:173 msgid "Firewall - Traffic Rules" -msgstr "" +msgstr "Firewall - Verkeersregels" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" -msgstr "" +msgstr "Firewall - Zone-instellingen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" -msgstr "" +msgstr "Migratie van firewallconfiguratie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" -msgstr "" +msgstr "Forward" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" +"Forwarded %{ipv6?%{ipv4?IPv4 en IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" -msgstr "" +msgstr "Vrijdag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item." "ival}}}" msgstr "" +"Van %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, poort " +"%{src_port#%{next?, }%{item.ival}}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:64 msgid "" @@ -391,8 +512,16 @@ msgid "" "name}}.\":%{item.hint.name? data-tooltip=\"%{item.hint.name}\"}}>%{item.ival}" "}}" msgstr "" +"Van %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, poort " +"%{src_port#%{next?, }%{item.ival}}}%{src_mac?, MAC " +"%{src_mac#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" +"Van %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}}}%{src_port?, poort %{src_port#%{next?, }%{item.ival}}}%{src_mac?, MAC %{src_mac#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Algemene instellingen" #: applications/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json:3 msgid "Grant access to firewall configuration" -msgstr "" +msgstr "Toegang verlenen tot firewallconfiguratie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" -msgstr "" +msgstr "Hardware stroom ontlasten" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (bereik)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "IP-sets" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IP's/netwerken" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IP's/Netwerken/MAC's" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" -msgstr "" +msgstr "IPv4 en IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" -msgstr "" +msgstr "Alleen IPv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "IPv6-maskering" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" -msgstr "" +msgstr "Alleen IPv6" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 msgid "Inbound device" -msgstr "" +msgstr "Inkomend apparaat" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Inclusief bestand" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" +"Inkomend %{ipv6?%{ipv4?IPv4 en IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " +"met types %{item.types#%{next?, }%{item}}:" +"%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper " +"%{helper.inv?%{helper.val}:%{helper.val}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Initiële hashgrootte" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" -msgstr "" +msgstr "Invoer" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" -msgstr "" +msgstr "Intern IP-adres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" -msgstr "" +msgstr "Interne poort" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" -msgstr "" +msgstr "Interne zone" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:304 msgid "Invalid DSCP mark" -msgstr "" +msgstr "Ongeldige DSCP-markering" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:372 msgid "Invalid limit value" +msgstr "Ongeldige grenswaarde" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" -msgstr "" +msgstr "Beperk burst" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" -msgstr "" +msgstr "Logboekberichten beperken" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:348 msgid "Limit matching" -msgstr "" +msgstr "Beperk het matchen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" +"Beperk matching tot %{limit.num} pakketten per %{limit.unit}" +"%{limit.burst? burst %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" -msgstr "" +msgstr "Beperkte maskering ingeschakeld" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:349 msgid "Limits traffic matching to the specified rate." -msgstr "" +msgstr "Beperkt verkeer dat overeenkomt met de opgegeven snelheid." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" -msgstr "" +msgstr "Loopback-bron-IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" -msgstr "" +msgstr "MASQUERADE - Automatisch herschrijven naar uitgaande interface IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" -msgstr "" +msgstr "MSS klemmen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" -msgstr "" +msgstr "Gemaskerd" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" -msgstr "" +msgstr "Overeenkomst" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 msgid "Match DSCP" -msgstr "" +msgstr "DSCP overeenkomst" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:292 msgid "Match ICMP type" -msgstr "" +msgstr "ICMP-type overeenkomst" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:248 msgid "Match device" -msgstr "" +msgstr "Apparaat overeenkomst" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." -msgstr "" +msgstr "Match doorgestuurd verkeer gericht op het opgegeven IP-adres." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" +"Match doorgestuurd verkeer dat is gericht op de opgegeven bestemmingspoort " +"of poortbereik." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." -msgstr "" +msgstr "Match doorgestuurd verkeer van dit IP-adres of bereik." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" +"Match doorgestuurd verkeer afkomstig van de opgegeven bronpoort of " +"poortbereik." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" -msgstr "" +msgstr "Match helper" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" msgstr "" +"Binnenkomend verkeer afstemmen dat is gericht op de opgegeven " +"bestemmingspoort of het opgegeven poortbereik op deze host" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "Match mark" -msgstr "" +msgstr "Markering overeenkomst" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" +"Match verkeer met behulp van de opgegeven helper voor het bijhouden van " +"verbindingen." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:318 msgid "Matches a specific firewall mark or a range of different marks." msgstr "" +"Komt overeen met een specifieke firewallmarkering of een reeks verschillende " +"markeringen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" +"Komt overeen met doorgestuurd verkeer met behulp van het opgegeven uitgaande " +"netwerkapparaat." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Matches traffic carrying the specified DSCP marking." -msgstr "" +msgstr "Komt overeen met verkeer met de opgegeven DSCP-markering." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Max inzendingen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Max lengte" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" +"Maximum aanvankelijk aantal te matchen pakketten: dit aantal wordt elke keer " +"dat de hierboven gespecificeerde limiet niet wordt bereikt met één " +"aangevuld, tot dit aantal." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" -msgstr "" +msgstr "Maandag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" -msgstr "" +msgstr "Maand Dagen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" -msgstr "" +msgstr "NAT-regels" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" +"NAT-regels bieden een gedetailleerde controle over het bron-IP-adres dat " +"moet worden gebruikt voor uitgaand of doorgestuurd verkeer." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Naam" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Netmasker" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" +"Pas alleen binnenkomend verkeer toe dat naar het opgegeven IP-adres wordt " +"geleid." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." -msgstr "" +msgstr "Alleen binnenkomend verkeer van deze MAC's matchen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." -msgstr "" +msgstr "Match alleen binnenkomend verkeer van dit IP of bereik." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" +"Pas alleen binnenkomend verkeer toe dat afkomstig is van de opgegeven " +"bronpoort of poortbereik op de clienthost" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" -msgstr "" +msgstr "Uitgaand apparaat" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" -msgstr "" +msgstr "Uitgaande zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" -msgstr "" +msgstr "Uitgang" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Pakket veld matchen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Pakketvelden waarop moet worden afgestemd.
    Syntax: " +"direction_datatype. bijv.: src_port, dest_net.
    Richtingen: src, dst. Datatypes: ip, poort, mac, net, " +"set.
    Richtingvoorvoegsels zijn optioneel.
    *Noot: datatype " +"set wordt niet ondersteund in fw4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" -msgstr "" +msgstr "Geeft aanvullende argumenten door aan iptables. Zorgvuldig gebruiken!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -669,173 +918,218 @@ msgid "" "invalid values could render the firewall ruleset broken, completely exposing " "all services." msgstr "" +"Door onbewerkte iptables-argumenten door te geven aan classificatieregels " +"voor bron- en bestemmingsverkeer, kunnen pakketten worden vergeleken op " +"basis van andere criteria dan interfaces of subnetten. Deze opties moeten " +"uiterst voorzichtig worden gebruikt, omdat ongeldige waarden de regelset van " +"de firewall kunnen overtreden, waardoor alle services volledig worden " +"blootgesteld." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "Pad naar bestand van CIDR's, subnetten, host-IP's, enz.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" -msgstr "" +msgstr "Poort forwards" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" +"Met poort forwarding kunnen externe computers op internet verbinding maken " +"met een specifieke computer of service binnen het privé-LAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Poort bereik" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" -msgstr "" +msgstr "Protocol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" +"Leid overeenkomend binnenkomend verkeer om naar de opgegeven poort op de " +"interne host" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" +"Leid overeenkomend binnenkomend verkeer om naar de opgegeven interne host" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Raadpleeg Externe set" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Vereist hardware NAT-ondersteuning." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" -msgstr "" +msgstr "Beperk Masquerading tot bepaalde bestemmingssubnetten" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" -msgstr "" +msgstr "Beperk Masquerading tot bepaalde bronsubnetten" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" -msgstr "" +msgstr "Beperken tot adres familie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" -msgstr "" +msgstr "Herschrijf het IP-adres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." -msgstr "" +msgstr "Herschrijf overeenkomend verkeer naar het opgegeven bron-IP-adres." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" +"Herschrijf overeenkomend verkeer naar de opgegeven bronpoort of poortbereik." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" -msgstr "" +msgstr "Herschrijf poort" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" -msgstr "" +msgstr "Routering/NAT-offloading" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" -msgstr "" +msgstr "SNAT - herschrijven naar specifieke bron-IP of poort" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" -msgstr "" +msgstr "Zaterdag" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "Set mark" -msgstr "" +msgstr "Markering instellen" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:317 msgid "" "Set the given mark value on established connections. Format is value[/mask]. " "If a mask is specified then only those bits set in the mask are modified." msgstr "" +"Stel de gegeven markeringswaarde in op bestaande verbindingen. Formaat is " +"waarde[/mask]. Als een masker is opgegeven, worden alleen de bits die in het " +"masker zijn ingesteld, gewijzigd." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" -msgstr "" +msgstr "Op software gebaseerde offloading voor routing/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" -msgstr "" +msgstr "Software flow offloading" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" -msgstr "" +msgstr "Bron IP adres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" -msgstr "" +msgstr "Bron MAC-adres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" -msgstr "" +msgstr "Bron adres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" -msgstr "" +msgstr "Bronpoort" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" -msgstr "" +msgstr "Bronzone" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:269 msgid "" "Specifies whether to tie this traffic rule to a specific inbound or outbound " "network device." msgstr "" +"Geeft aan of deze verkeersregel moet worden gekoppeld aan een specifiek " +"inkomend of uitgaand netwerkapparaat." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" +"Specificeert of het externe of het interne IP-adres moet worden gebruikt " +"voor gereflecteerd verkeer." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" -msgstr "" +msgstr "Startdatum (jjjj-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" -msgstr "" +msgstr "Starttijd (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" -msgstr "" +msgstr "Stopdatum (jjjj-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" -msgstr "" +msgstr "Stoptijd (hh:mm:ss)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Opslagmethode" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" -msgstr "" +msgstr "Zondag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" +"De bestaande firewallconfiguratie moet worden gewijzigd om LuCI goed te " +"laten functioneren." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" +"De firewall creëert zones over uw netwerkinterfaces om de " +"netwerkverkeersstroom te regelen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -844,8 +1138,15 @@ msgid "" "rule is unidirectional, e.g. a forward from lan to wan does " "not imply a permission to forward from wan to lan as well." msgstr "" +"De onderstaande opties regelen het doorstuurbeleid tussen deze zone (%s) en " +"andere zones. Bestemmingszones dekken doorgestuurd verkeer " +"afkomstig van %q. Bronzones komen overeen met " +"doorgestuurd verkeer van andere zones gericht op %q. De " +"doorstuurregel is unidirectioneel, b.v. een forward van lan naar " +"wan impliceert niet een toestemming om ook van wan naar lan door te " +"sturen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -853,25 +1154,35 @@ msgid "" "forwarded traffic between different networks within the zone. Covered " "networks specifies which available networks are members of this zone." msgstr "" +"Deze sectie definieert gemeenschappelijke eigenschappen van %q. De opties " +"invoer en uitvoer stellen het standaardbeleid in voor " +"verkeer dat deze zone binnenkomt en verlaat, terwijl de optie forward het beleid beschrijft voor doorgestuurd verkeer tussen verschillende " +"netwerken binnen de zone . Overdekte netwerken specificeert welke " +"beschikbare netwerken lid zijn van deze zone." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" -msgstr "" +msgstr "Donderdag" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" -msgstr "" +msgstr "Tijdsbeperkingen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" -msgstr "" +msgstr "Tijd in UTC" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:243 msgid "Time restrictions are enabled for this rule" -msgstr "" +msgstr "Tijdsbeperkingen zijn ingeschakeld voor deze regel" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Time-out" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" @@ -881,8 +1192,13 @@ msgid "" "%{item." "ival}
    }}" msgstr "" +"Naar %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, " +"IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, poort " +"%{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" +"Naar %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, poort %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" msgstr "" +"Naar %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, poort %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" -msgstr "" +msgstr "Tracking helper" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:176 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:35 msgid "Traffic Rules" -msgstr "" +msgstr "Verkeersregels" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:174 msgid "" @@ -914,207 +1241,369 @@ msgid "" "for example to reject traffic between certain hosts or to open WAN ports on " "the router." msgstr "" +"Verkeersregels definiëren beleid voor pakketten die tussen verschillende " +"zones reizen, bijvoorbeeld om verkeer tussen bepaalde hosts te weigeren of " +"om WAN-poorten op de router te openen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" -msgstr "" +msgstr "Dinsdag" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:19 msgid "Unable to save contents: %s" +msgstr "Kan inhoud niet opslaan: %s" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." msgstr "" +"Eenheid: seconden. Standaard 0 betekent dat het item permanent " +"aan de set wordt toegevoegd.
    Max: 2147483 seconden." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" -msgstr "" +msgstr "Onbekende of niet geïnstalleerde conntrack helper \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" -msgstr "" +msgstr "Naamloze NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" -msgstr "" +msgstr "Naamloze forward" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:210 msgid "Unnamed rule" -msgstr "" +msgstr "Naamloze regel" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Naamloze set" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" -msgstr "" +msgstr "Naamloze zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" -msgstr "" +msgstr "Niet herkend protocol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" +"Als u op \"Doorgaan\" klikt, worden \"omleidings\"-secties met als doel " +"\"SNAT\" geconverteerd naar \"nat\"-secties en wordt de firewall opnieuw " +"gestart om de bijgewerkte configuratie toe te passen." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" -msgstr "" +msgstr "Extern IP-adres gebruiken" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" -msgstr "" +msgstr "Intern IP-adres gebruiken" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Gebruik ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" +"Gebruik deze optie om zoneverkeer te classificeren op basis van onbewerkte, " +"niet door uci beheerde netwerkapparaten." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." msgstr "" +"Gebruik deze optie om zoneverkeer te classificeren op bron- of " +"bestemmingssubnet in plaats van op netwerken of apparaten." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:330 msgid "Valid firewall mark required" -msgstr "" +msgstr "Geldige firewallmarkering vereist" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" -msgstr "" +msgstr "Woensdag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" -msgstr "" +msgstr "Weekdagen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" -msgstr "" +msgstr "XOR firewall markering" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "XOR mark" -msgstr "" +msgstr "XOR-markering" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "Uw apparaat heeft geen firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "Uw apparaat gebruikt een firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" -msgstr "" +msgstr "Zone ⇒ Forwardings" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" +msgstr "Zones" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" -msgstr "" +msgstr "accepteer" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" -msgstr "" +msgstr "elke" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" -msgstr "" +msgstr "elke zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "elke/alle" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" -msgstr "" +msgstr "firewallmarkering toepassen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" -msgstr "" +msgstr "conntrack helper toewijzen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "automatisch" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bitmap" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "bitmap is alleen ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" -msgstr "" +msgstr "dag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: Bestemmings IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: Bestemming MAC addr" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: Bestemming (sub)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: Bestemmingspoort" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: Bestemming ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" -msgstr "" +msgstr "niet herschrijven" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" -msgstr "" +msgstr "niet volgen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" +msgstr "laat vallen" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " msgstr "" +"firewall4 ondersteunt verwijzingen en het maken van IP-sets om het matchen " +"van grote adreslijsten te vereenvoudigen zonder de noodzaak om één regel per " +"item te maken om te matchen. Poortbereiken in ipsets worden niet ondersteund " +"door firewall4.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "vanpoort-naarpoort" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "hash" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" -msgstr "" +msgstr "uur" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: IP adres" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "ip[/cidr]
    Voor gebruik met Match datatypes: *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "lijst" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: MAC adres" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macaddr|ip[/cidr]
    " -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" -msgstr "" +msgstr "minuut" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "net: (sub)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "poort: Poort" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" -msgstr "" +msgstr "afwijzen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" -msgstr "" +msgstr "seconde" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set: ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: Bron ipset*" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: Bron IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: Bron MAC adres" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: Bron (sub)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Bronpoort" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" -msgstr "" +msgstr "dit apparaat" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" -msgstr "" +msgstr "deze nieuwe zone" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:353 msgid "unlimited" -msgstr "" +msgstr "onbeperkt" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:250 msgid "unspecified" -msgstr "" +msgstr "niet gespecificeerd" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "tot 65536 vermeldingen." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" -msgstr "" +msgstr "geldige firewallmarkering" diff --git a/package/luci/applications/luci-app-firewall/po/pl/firewall.po b/package/luci/applications/luci-app-firewall/po/pl/firewall.po index 9ebfd87eb0..468a5cb2ea 100644 --- a/package/luci/applications/luci-app-firewall/po/pl/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/pl/firewall.po @@ -3,9 +3,9 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2022-05-12 04:55+0000\n" +"PO-Revision-Date: 2023-10-20 00:56+0000\n" "Last-Translator: Matthaiks \n" -"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -13,7 +13,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.12.1\n" +"X-Generator: Weblate 5.1\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -31,28 +31,36 @@ msgid "" ""\">%{helper.val}:%{helper." "val}}}" msgstr "" -"%{src?%{dest?Forwarded:Incoming}:Outgoing} %{ipv6?%{ipv4?IPv4 i " -"IPv6:IPv6}:IPv4}%{proto?, protocol " +"%{src?%{dest?Przekazywane:Przychodzące}:Wychodzące} %{ipv6?%{ipv4?IPv4 i IPv6:IPv6}:IPv4}%{proto?, protokół " "%{proto#%{next?, }%{item.types?%{item." "name}ICMP z odmianami %{item.types#%{next?, }" -"%{item}}:%{item.name}}}}%{mark?, mark " -"%{mark.val}}%{dscp?, DSCP %{dscp." -"inv?%{dscp.val}:%{dscp.val}}}%{helper?, helper " -"%{helper.inv?%{helper.val}:%{helper." -"val}}}" +"%{item}}:%{item.name}}}}%{mark?, znacznik " +"%{mark.val}}%{dscp?, DSCP %{dscp.inv?%{dscp.val}:%{dscp.val}}}%{helper?, pomocnik %{helper.inv?%{helper.val}:%{helper.val}}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 msgid "-- add IP --" msgstr "-- dodaj IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- dodaj MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -60,11 +68,11 @@ msgstr "" "Akceptuj %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Zapobieganie przepisywaniu źródła" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -91,7 +99,7 @@ msgid "" "Assign conntrack helper " "%{set_helper}" msgstr "" -"Przydziel conntrack pomoc " +"Przydziel conntrack-pomocnika " "%{set_helper}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:130 @@ -102,7 +110,7 @@ msgstr "" "%{set_mark?Assign:XOR} znacznik zapory " "sieciowej %{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Automatycznie przepisz źródłowy adres " @@ -123,7 +131,7 @@ msgstr "" "Odrzucaj %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -131,23 +139,23 @@ msgstr "" "Statystycznie przepisz do źródła %{snat_ip?" "IP %{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Należy podać adres IP do ponownego zapisu!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" -msgstr "AKCEPTUJ - Wyłącz przepisywanie adresów" +msgstr "ACCEPT - Wyłącz przepisywanie adresów" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Akcja" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -157,7 +165,7 @@ msgstr "" "docelowej, np. -p tcp --dport 443 tylko w celu dopasowania " "ruchu wychodzącego HTTPS." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -166,33 +174,45 @@ msgstr "" "docelowej, np. -p tcp --sport 443 tylko w celu dopasowania " "ruchu przychodzącego HTTPS." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Rodzina adresów, wewnętrzny adres IP muszą być zgodne" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" +"Rodzina adresów, adres źródłowy, adres docelowy, przepisany adres IP muszą " +"być zgodne" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Ustawienia zaawansowane" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" -msgstr "Zezwól na \"nieprawidłowy\" ruch" +msgstr "Zezwól na „nieprawidłowy” ruch" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" -msgstr "Zezwól na przekazywanie z strefy źródłowej:" +msgstr "Zezwól na przekazywanie ze strefy źródłowej:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Zezwól na przekazywanie do strefy docelowej:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Każdy" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Każdy dzień" @@ -210,27 +230,32 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "Zastosuj daną klasę lub wartość DSCP do ustanowionych połączeń." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" "Przydziel określonego pomocnika śledzenia połączeń do dopasowanego ruchu." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" -msgstr "Automatyczne przydzielanie pomocy" +msgstr "Automatyczne przydzielanie pomocnika" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "Automatycznie przydzielaj pomocników conntrack na podstawie protokołu ruchu " "i portu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Komentarz" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Ustawienia conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Pomocnicy conntrack" @@ -238,23 +263,27 @@ msgstr "Pomocnicy conntrack" msgid "Contents have been saved." msgstr "Zawartość została zapisana." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Kontynuuj" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Liczniki" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Objęte urządzenia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Objęte sieci" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Objęte podsieci" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Własne reguły" @@ -268,7 +297,7 @@ msgstr "" "są objęte składnią zapory. Polecenia wykonywane są po każdym restarcie " "zapory, zaraz po załadowaniu zestawu reguł domyślnych." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "klasyfikacja DSCP" @@ -280,17 +309,17 @@ msgstr "Znacznik DSCP" msgid "DSCP mark required" msgstr "Wymagany znacznik DSCP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Adres docelowy" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Port docelowy" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Strefa docelowa" @@ -298,7 +327,7 @@ msgstr "Strefa docelowa" msgid "Device name" msgstr "Nazwa urządzenia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -307,67 +336,98 @@ msgstr "" "conntrack nieprawidłowy. Może to być wymagane w przypadku " "skomplikowanych asymetrycznych ustawień trasy." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" -msgstr "Porzuć wadliwe pakiety" +msgstr "Porzucaj wadliwe pakiety" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Włącz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Włącz pętlę zwrotną NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" -msgstr "Włącz ochronę SYN-flood" +msgstr "Włącz ochronę przed SYN‑flood" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Włącz logowanie tej strefy" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Włącz translację adresów sieciowych i portów IPv4 (NAT4 lub NAPT4) dla ruchu " +"wychodzącego w tej strefie. Jest ona zazwyczaj włączona w strefie wan." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Włącz translację adresów sieciowych i portów IPv6 (NAT6 lub NAPT6) dla ruchu " +"wychodzącego w tej strefie." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Włączone" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "Włącza śledzenie liczby pakietów i bajtów dla zestawu." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Zaleca się użyć: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Funkcja eksperymentalna. Nie w pełni kompatybilna z QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -"Dokładnie wybiera dozwolone pomoce śledzenia połączeń dla ruchu strefowego" +"Dokładnie wybiera dozwolonych pomocników śledzenia połączeń dla ruchu " +"strefowego" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Zewnętrzne adresy IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Port zewnętrzny" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Dodatkowe argumenty" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Dodatkowe argumenty przeznaczenia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Dodatkowe argumenty tablicy IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Dodatkowe argumenty zródłowe" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Rodzina" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Zapora sieciowa" @@ -376,51 +436,57 @@ msgstr "Zapora sieciowa" msgid "Firewall - Custom Rules" msgstr "Zapora sieciowa - Własne reguły" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Zapora sieciowa - Zestawy IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Zapora sieciowa - Zasady NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Zapora sieciowa - Przekazywanie portów" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:173 msgid "Firewall - Traffic Rules" -msgstr "Zapora sieciowa - Reguły ruchu" +msgstr "Zapora sieciowa - Reguły ruchu sieciowego" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" -msgstr "Zapora sieciowa - Ustawienia strefy" +msgstr "Zapora sieciowa - Ustawienia stref" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Migracja konfiguracji zapory sieciowej" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Ruch przekazujący" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Przekazywanie IPv4 %{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" -"}" - -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +"Przekazano %{ipv6?%{ipv4?IPv4 i IPv6:IPv6}:" +"IPv4}%{proto?, protokół {proto#%{next?, }%{item.name}}}%{mark?, znacznik %{mark." +"val}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Piątek" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item." "ival}}}" msgstr "" -"Z %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " -"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }" -"%{item." -"ival}}}" +"Z %{src}%{src_device?, interfejs %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port " +"%{src_port#%{next?, }%{item.ival}}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:64 msgid "" @@ -445,16 +511,16 @@ msgid "" "name}}.\":%{item.hint.name? data-tooltip=\"%{item.hint.name}\"}}>%{item.ival}" "}}" msgstr "" -"Z %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " -"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }" -"%{item." -"ival}}}%{src_mac?, MAC %{src_mac#%{next?, }%{item.ival}" -"}}" - -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +"Z %{src}%{src_device?, interfejs %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port " +"%{src_port#%{next?, }%{item.ival}}}%{src_mac?, MAC " +"%{src_mac#%{next?, }%{item.ival}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" "Z %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}%{src_port?, port %{src_port#%{next?, }%{item.ival}}}%{src_mac?, " -"MAC %{src_mac#%{next?, }%{item.ival}}}" +"tooltip=\"Dopasuj porty z wyjątkiem %{item.val}.\"}>%{item.ival}}}%{src_mac?, MAC %{src_mac#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Ustawienia główne" @@ -485,22 +552,55 @@ msgstr "Ustawienia główne" msgid "Grant access to firewall configuration" msgstr "Udziel dostępu do konfiguracji zapory sieciowej" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Sprzętowy flow offloading" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (zakres)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "Zestawy IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "Adresy IP/Sieci" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "Adresy IP/Sieci/Adresy MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 i IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Tylko IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "Maskarada IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Tylko IPv6" @@ -508,9 +608,14 @@ msgstr "Tylko IPv6" msgid "Inbound device" msgstr "Urządzenie przychodzące" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Plik dołączany" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Przychodzące IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 i IPv6:IPv6}:IPv4}%{proto?, protokół %{proto#%{next?, }%{item.types?%{item.name}ICMP " -"with types %{item.types#%{next?, }%{item}}:" -"%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}" +"z typami %{item.types#%{next?, }%{item}}:%{item." +"name}}}}%{mark?, znacznik %{mark.val}}%{helper?, pomocnik %{helper.inv?%{helper.val}:%{helper.val}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Początkowy rozmiar hasha" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Ruch przychodzący" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Wewnętrzny adres IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Port wewnętrzny" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Strefa wewnętrzna" @@ -555,11 +666,15 @@ msgstr "Nieprawidłowy znacznik DSCP" msgid "Invalid limit value" msgstr "Nieprawidłowa wartość graniczna" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "Nieprawidłowa nazwa zestawu" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Naruszenie limitu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Ograniczenie logowania" @@ -567,43 +682,44 @@ msgstr "Ograniczenie logowania" msgid "Limit matching" msgstr "Dopasowanie limitu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" "Dopasowanie limitu do %{limit.num} pakiety na %{limit.unit}%{limit.burst? burst %{limit.burst}}" +"var>%{limit.burst? seria %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Ograniczona maskarada włączona" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:349 msgid "Limits traffic matching to the specified rate." -msgstr "Ogranicza ruch zgodny z określoną stawką." +msgstr "Ogranicza dopasowanie ruchu do określonej szybkości." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "Źródło pętli zwrotnej IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASQUERADE - Automatyczne przepisywanie na interfejs wyjściowy IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "Dostosuj MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Maskarada" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Dopasuj" @@ -619,33 +735,33 @@ msgstr "Dopasuj typ ICMP" msgid "Match device" msgstr "Dopasuj urządzenie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." -msgstr "Dopasuj przesyłany ruch skierowany na podany adres IP." +msgstr "Dopasuj przekazywany ruch skierowany na podany adres IP." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -"Dopasuj przesyłany ruch skierowany na dany port docelowy lub zakres portów." +"Dopasuj przekazywany ruch skierowany na dany port docelowy lub zakres portów." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." -msgstr "Dopasuj przesyłany ruch z tego adresu IP lub zakresu." +msgstr "Dopasuj przekazywany ruch z tego adresu IP lub zakresu." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -"Dopasuj przesyłany ruch pochodzący z danego portu źródłowego lub zakresu " +"Dopasuj przekazywany ruch pochodzący z danego portu źródłowego lub zakresu " "portów." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" -msgstr "Dopasuj pomocnika" +msgstr "Pomocnik dopasowania" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -657,8 +773,8 @@ msgstr "" msgid "Match mark" msgstr "Znacznik dopasowania" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "Dopasuj ruch, używając określonego pomocnika śledzenia połączeń." @@ -666,16 +782,24 @@ msgstr "Dopasuj ruch, używając określonego pomocnika śledzenia połączeń." msgid "Matches a specific firewall mark or a range of different marks." msgstr "Odpowiada konkretnemu znakowi zapory lub zakresowi różnych znaków." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" -"Dopasowuje przesyłany ruch przy użyciu określonego wychodzącego urządzenia " +"Dopasowuje przekazywany ruch przy użyciu określonego wychodzącego urządzenia " "sieciowego." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Matches traffic carrying the specified DSCP marking." msgstr "Dopasowuje ruch niosący określone oznaczenie DSCP." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Maksymalna liczba wpisów" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Maksymalna długość" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -685,22 +809,22 @@ msgstr "" "ładowana jednorazowo za każdym razem, gdy limit określony powyżej nie " "zostanie osiągnięty, aż do tej liczby." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Poniedziałek" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Dni miesiąca" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "Zasady NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -708,26 +832,32 @@ msgstr "" "Reguły NAT umożliwiają precyzyjną kontrolę źródłowego adresu IP w celu " "użycia ruchu wychodzącego lub przekazywanego." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Nazwa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Maska sieci" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Dopasuj tylko przychodzący ruch skierowany do danego adresu IP." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Dopasuj tylko ruch z tych adresów MAC." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Dopasuj tylko ruch przychodzący z tego adresu IP lub zakresu adresów." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -736,27 +866,44 @@ msgstr "" "portów na hoście klienta" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Urządzenie wychodzące" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Strefa wychodząca" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Ruch wychodzący" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Dopasowanie pola pakietu" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Pola pakietów do dopasowania.
    Składnia: direction_datatype. " +"np.: src_port, dest_net.
    Kierunki: src, dst. " +"Typy danych: ip, port, mac, net, set.
    Prefiksy kierunku są " +"opcjonalne.
    *Uwaga: typ danych set nie jest obsługiwany w " +"fw4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "Przekazuje dodatkowe argumenty do iptables. Zachowaj szczególną ostrożność!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -771,12 +918,16 @@ msgstr "" "złamanie zestawu reguł zapory sieciowej, całkowicie odsłaniając wszystkie " "usługi." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "Ścieżka do pliku CIDR, podsieci, adresów IP hosta itp.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Przekazywanie portów" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -784,67 +935,81 @@ msgstr "" "Przekazanie portów pozwala komputerom z internetu na połączenia z " "komputerami z sieci LAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Zakres portów" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protokół" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Przekieruj ruch przychodzący na podany port do wskazanego hosta w sieci " "wewnętrznej" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Przekieruj ruch przychodzący do wskazanego hosta w sieci wewnętrznej" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "Wymaga sprzętowej obsługi NAT. Wdrożono dla co najmniej mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Patrz zestaw zewnętrzny" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "Strefy odbicia" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Wymaga obsługi sprzętowej NAT" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Ogranicz maskaradę do wskazanych podsieci docelowych" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Ogranicz maskaradę do wskazanych podsieci źródłowych" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Ogranicz do rodziny adresów" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "Przepisz adres IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "Przepisz dopasowany ruch do określonego źródłowego adresu IP." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Przepisz dopasowany ruch do określonego portu źródłowego lub zakresu portów." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Przepisz port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" -msgstr "Trasowanie/NAT Offloading" +msgstr "Offloading trasowania/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Przepisz do określonego źródłowego adresu IP lub portu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Sobota" @@ -861,36 +1026,36 @@ msgstr "" "[/mask]. Jeśli maska jest określona, modyfikowane są tylko te bity ustawione " "w masce." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" -msgstr "Oprogramowanie oparte na offloading dla trasowania/NAT" +msgstr "Offloading oparty na oprogramowaniu dla trasowania/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Programowy flow offloading" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Źródłowy adres IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Źródłowy adres MAC" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Adres źródłowy" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Port źródłowy" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Strefa źródłowa" @@ -902,7 +1067,7 @@ msgstr "" "Określa, czy powiązać tę regułę ruchu z określonym przychodzącym, czy " "wychodzącym urządzeniem sieciowym." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -910,32 +1075,36 @@ msgstr "" "Określa, czy użyć zewnętrznego czy wewnętrznego adresu IP do odbijanego " "ruchu." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Data rozpoczęcia (rrrr-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Czas rozpoczęcia (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Data zatrzymania (rrrr-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Czas zatrzymania (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Metoda przechowywania" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Niedziela" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -943,16 +1112,16 @@ msgstr "" "Istniejąca konfiguracja zapory sieciowej musi zostać zmieniona, aby LuCI " "mógł działać prawidłowo." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" -"Zapora tworzy strefy z twoich interfejsów sieciowych, aby kontrolować ruch " -"sieciowy." +"Zapora tworzy strefy na interfejsach sieciowych, aby kontrolować przepływ " +"ruchu w sieci." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -968,7 +1137,7 @@ msgstr "" "przekazywania jest jednokierunkowa, np. przekazywanie z sieci LAN " "do WAN nie implikuje pozwolenia na przekazywanie z sieci WAN do LAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -982,18 +1151,18 @@ msgstr "" "zasady przekazywania ruchu między różnymi sieciami w obrębie strefy. Opcja " "Objęte sieci określa, które dostępne sieci należą do tej strefy." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Czwartek" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Ograniczenia czasowe" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Czas w UTC" @@ -1001,6 +1170,10 @@ msgstr "Czas w UTC" msgid "Time restrictions are enabled for this rule" msgstr "Ograniczenia czasowe są włączone dla tej reguły" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Limit czasu" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1009,13 +1182,13 @@ msgid "" "%{item." "ival}
    }}" msgstr "" -"Do %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " -"%{dest_ip#%{next?, }%{item.ival}
    }}%{dest_port?, port %{dest_port#%{next?, }" -"%{item." -"ival}
    }}" +"Do %{dest}%{dest_device?, interfejs %{dest_device}}%{dest_ip?, IP " +"%{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port " +"%{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -"Do %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port " -"%{dest_port#%{next?, }%{item.ival}}}" +"Do %{dest}%{dest_device?, poprzez interfejs %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" "Do %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" +"tooltip=\"Dopasuj porty z wyjątkiem %{item.val}.\"}>%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Pomocnik śledzenia" @@ -1059,8 +1232,8 @@ msgstr "" "Reguły ruchu sieciowego definiują politykę dla pakietów przechodzących " "między strefami, np. aby odrzucać ruch między hostami lub otworzyć porty WAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Wtorek" @@ -1068,18 +1241,26 @@ msgstr "Wtorek" msgid "Unable to save contents: %s" msgstr "Nie można zapisać zawartości: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" +"Jednostka: sekundy. Domyślnie 0 oznacza, że wpis jest dodany na " +"stałe do zestawu.
    Maks.: 2147483 sekundy." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" -msgstr "Nieznany lub nie zainstalowany pomocnik conntrack \"%s\"" +msgstr "Nieznany lub niezainstalowany pomocnik conntrack \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "Nienazwany NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Przekazywanie bez nazwy" @@ -1088,42 +1269,51 @@ msgstr "Przekazywanie bez nazwy" msgid "Unnamed rule" msgstr "Nieznana zasada" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Zestaw nienazwany" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Strefa bez nazwy" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Nierozpoznany protokół" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" "Po naciśnięciu przycisku „Kontynuuj” sekcje przekierowujące z docelowym " -"\"SNAT\" zostaną przekonwertowane na sekcje \"nat\", a zapora sieciowa " -"zostanie ponownie uruchomiona w celu zastosowania zaktualizowanej " -"konfiguracji." +"„SNAT” zostaną przekonwertowane na sekcje „nat”, a zapora sieciowa zostanie " +"ponownie uruchomiona w celu zastosowania zaktualizowanej konfiguracji." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Użyj zewnętrznego adresu IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Użyj wewnętrznego adresu IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Użyj ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -"Opcja ta służy do klasyfikacji ruchu strefowego według surowych, nie-" -"uci obsługiwanych urządzeń sieciowych." +"Opcji tej należy używać do klasyfikacji ruchu strefowego według surowych, " +"niezarządzanych przez uci urządzeń sieciowych." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1135,17 +1325,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Wymagany prawidłowy znacznik zapory sieciowej" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Środa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Dni tygodnia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "znacznik zapory XOR" @@ -1153,109 +1343,241 @@ msgstr "znacznik zapory XOR" msgid "XOR mark" msgstr "Znacznik XOR" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "Na tym urządzeniu nie działa firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "Na tym urządzeniu działa firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Strefa ⇒ Przekazywanie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Strefy" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" +"Strefy, z których mają być tworzone reguły odbicia. Jeśli opcja nie jest " +"ustawiona, używana jest tylko strefa docelowa." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "akceptuj" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "dowolny" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "dowolna strefa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "dowolny/wszystkie" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "zastosuj znacznik zapory" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "przydziel pomocnika conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "automatyczne" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bitmap" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "bitmap to tylko ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "dzień" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: Docelowy adres IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: Docelowy adres MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: Docelowa (pod)sieć" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: Port docelowy" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: Docelowy ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "nie przepisuj" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "nie śledź" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "porzucaj" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"firewall4 obsługuje odwoływanie się i tworzenie zestawów IP, aby uprościć " +"dopasowywanie dużych list adresów bez potrzeby tworzenia jednej reguły dla " +"każdego elementu do dopasowania. Zakresy portów w zestawach ipset nie są " +"obsługiwane przez firewall4.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "zportu-doportu" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "godzina" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: Adres IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" +"ip[/cidr]
    Do użytku z dopasowanymi typami danych: *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "list" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: Adres MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "adresmac|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "minuta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "net: (Pod)sieć" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "port: Port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "odrzucaj" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "sekunda" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set: ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: Źródłowy ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: Źródłowy adres IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: Źródłowy adres MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: Źródłowa (pod)sieć" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Źródłowy port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "to urządzenie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "ta nowa strefa" @@ -1267,6 +1589,11 @@ msgstr "nielimitowane" msgid "unspecified" msgstr "nieokreślone" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "do 65536 wpisów." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "prawidłowy znacznik zapory sieciowej" diff --git a/package/luci/applications/luci-app-firewall/po/pt/firewall.po b/package/luci/applications/luci-app-firewall/po/pt/firewall.po index 88a624ba6f..9634b8d12c 100644 --- a/package/luci/applications/luci-app-firewall/po/pt/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/pt/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2021-01-24 12:59+0000\n" +"PO-Revision-Date: 2023-07-27 15:25+0000\n" "Last-Translator: ssantos \n" -"Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -49,10 +49,18 @@ msgstr "" msgid "-- add IP --" msgstr "-- adicionar IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- adicionar MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -60,11 +68,11 @@ msgstr "" "Aceitar %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Prevenir a reescrita da fonte" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -103,7 +111,7 @@ msgstr "" "%{set_mark?Assign:XOR} marca do firewall " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Reescrever automaticamente o IP de " @@ -124,7 +132,7 @@ msgstr "" "Rejeita %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -132,23 +140,23 @@ msgstr "" "Reescrever estaticamente para a origem " "%{snat_ip?IP %{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Um IP reescrito deve ser especificado!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACCEPT - Desativar reescrever endereços" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Ação" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -158,7 +166,7 @@ msgstr "" "destino da zona, por exemplo, -p tcp -- dport 443 para " "corresponder apenas ao tráfego https de saída." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -167,33 +175,45 @@ msgstr "" "fonte de zona, por exemplo, -p tcp - sport 443 para " "corresponder apenas ao tráfego HTTPS de entrada." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Família de endereços, o endereço de IP interno deve corresponder" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" +"Família de endereços, endereço de origem, endereço de destino, o endereço de " +"IP reescrito deve corresponder" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Definições Avançadas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Permitir tráfego \"inválido\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Permitir encaminhamento de zonas de origem:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Permitir encaminhamento para zonas de destino:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Qualquer" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Qualquer dia" @@ -211,28 +231,33 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "Aplique a classe ou valor de DSCP dado às conexões estabelecidas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" "Atribua o ajudante de rastreamento de conexão especificado para o tráfego " "combinado." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Atribuição automática de assistentes" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "Atribuir assistentes de conntrack automaticamente com base no protocolo de " "tráfego e na porta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Comentário" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Configurações do Conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Assistentes do Conntrack" @@ -240,23 +265,27 @@ msgstr "Assistentes do Conntrack" msgid "Contents have been saved." msgstr "Os conteúdos foram gravados." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Continuar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Contadores" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Aparelhos abrangidos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Redes abrangidas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Subredes abrangidas" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Regras Personalizadas" @@ -271,7 +300,7 @@ msgstr "" "comandos são executados a seguir ao reinicio da firewall, logo a seguir ao " "conjunto de regras predefinidas serem carregadas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "Classificação de DSCP" @@ -283,17 +312,17 @@ msgstr "Marca de DSCP" msgid "DSCP mark required" msgstr "Marca de DSCP necessária" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Endereço de destino" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Porta de destino" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Zona de destino" @@ -301,7 +330,7 @@ msgstr "Zona de destino" msgid "Device name" msgstr "Nome do aparelho" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -310,68 +339,99 @@ msgstr "" "conntrack invalid. Isto pode ser necessário para configurações " "complexas de rotas assimétricas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Descartar pacotes inválidos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Ativar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Ativar NAT Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Ativar a Proteção SYN-flood" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Ativar registo nesta zona" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Ative o endereço de rede e a tradução da porta IPv4 (NAT4 ou NAPT4) para o " +"tráfego de saída nesta zona. Normalmente, isso é ativado na zona wan." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Ative o endereço de rede e a tradução da porta IPv6 (NAT6 ou NAPT6) para o " +"tráfego de saída nesta zona." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Ativado" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" +"Ativa o rastreamento da contagem dos pacotes e dos bytes para o conjunto." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Esperando: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Característica experimental. Não totalmente compatível com QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" "Escolhe explicitamente os assistentes de rastreamento de conexão permitidos " "para o tráfego da zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Endereço IP externo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Porta externa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Argumentos adicionais" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Argumentos adicionais de destino" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Argumentos adicionais do iptables" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Argumentos adicionais da fonte" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Família" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Firewall" @@ -380,11 +440,15 @@ msgstr "Firewall" msgid "Firewall - Custom Rules" msgstr "Firewall - Regras Personalizadas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Firewall - Conjuntos de IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Firewall - Regras de NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Firewall - Encaminhamento de Portas" @@ -392,39 +456,41 @@ msgstr "Firewall - Encaminhamento de Portas" msgid "Firewall - Traffic Rules" msgstr "Firewall - Regras de Tráfego" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Firewall - Definições de Zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Migração de configuração do Firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Encaminhar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark." -"val}}" - -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +"Encaminhado %{ipv6?%{ipv4?IPv4 e IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Sexta-feira" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Configurações gerais" @@ -490,22 +556,55 @@ msgstr "Configurações gerais" msgid "Grant access to firewall configuration" msgstr "Conceder acesso à configuração do firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Descarga de fluxo em hardware" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (intervalo)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "Conjuntos de IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IPs/Redes" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IPs/Redes/MACs" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 e IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Apenas IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "Mascaramento IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Apenas IPv6" @@ -513,9 +612,14 @@ msgstr "Apenas IPv6" msgid "Inbound device" msgstr "Aparelho de entrada" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Incluir ficheiro" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 e IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " -"with types %{item.types#%{next?, }%{item}}:" +"com tipos %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper " -"%{helper.inv?%{helper.val}:%{helper.val}}}" +"%{mark.mask} antes de comparar.\"}}>%{mark.val}}%{helper?, helper " +"%{helper.inv?%{helper.val}:%{helper.val}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Tamanho inicial do hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Entrada" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Endereço IP interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Porta interna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Zona Interna" @@ -561,11 +670,15 @@ msgstr "Marca de DSCP inválida" msgid "Invalid limit value" msgstr "Valor limite inválido" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Limite de burst" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Limitar registo de mensagens" @@ -573,9 +686,9 @@ msgstr "Limitar registo de mensagens" msgid "Limit matching" msgstr "Limitar a correspondência" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -583,7 +696,8 @@ msgstr "" "Limitar a correspondência de %{limit.num} pacotes por " "%{limit.unit}%{limit.burst? estouro %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Mascaramento limitado ativado" @@ -591,25 +705,25 @@ msgstr "Mascaramento limitado ativado" msgid "Limits traffic matching to the specified rate." msgstr "Limita o tráfego de acordo com a taxa especificada." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "IP fonte de loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASQUERADE - Reescreve automaticamente para o IP da interface de saída" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "Fixação de MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Mascaramento" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Corresponder" @@ -625,37 +739,37 @@ msgstr "Correspondência do tipo de ICMP" msgid "Match device" msgstr "Aparelho de correspondência" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" "Encaminha o tráfego que obteve correspondência para um determinado endereço " "de IP." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "Encaminha o tráfego que obteve correspondência para uma determinada porta de " "destino ou uma faixa de portas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" "Encaminha o tráfego que obteve correspondência deste IP ou uma faixa de IPs." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "Encaminha o tráfego que obteve correspondência originado de uma determinada " "porta de origem ou faixa de portas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "Auxiliar de correspondência" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -667,8 +781,8 @@ msgstr "" msgid "Match mark" msgstr "Marca de correspondência" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" "Corresponder o tráfego usando uma conexão definida pelo auxiliar de " @@ -680,7 +794,7 @@ msgstr "" "Corresponder uma marca de firewall especifica ou uma variedade de diferentes " "marcas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" "Corresponda o tráfego encaminhado usando um aparelho de rede de saída " @@ -692,6 +806,14 @@ msgstr "" "Compara o tráfego correspondente que esteja carregando uma marca DSCP " "específica." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Total de registos" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Comprimento máximo" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -701,22 +823,22 @@ msgstr "" "recarregado por um cada vez que o limite especificado acima não é atingido, " "até este número." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Segunda-feira" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Dias do mês" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "Regras NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -724,26 +846,32 @@ msgstr "" "As regras da NAT permitem o controle fino sobre o IP de origem para usar com " "o tráfego de saída ou tráfego de encaminhamento." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Máscara de rede" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Só se tráfego de entrada corresponder ao endereço IP fornecido." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Só se o tráfego de entrada corresponder a um destes MACs." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Só se o tráfego de entrada corresponder a este IP ou intervalo." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -752,26 +880,43 @@ msgstr "" "intervalo de portas no host cliente" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Aparelho de saída" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Zona de saída" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Saída" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Campo do pacote coincidente" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Campos do pacote que correspondem.
    Síntaxe: direction_datatype. por exemplo: src_port, dest_net.
    Modo de preparo: " +"src, dst. Tipos de dados: ip, port, mac, net, set. " +"
    Os prefixos de direção são opcionais.
    *Nota: o tipo de dados " +"set não é suportado no fw4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "Passa argumentos adicionais para o iptables. Usar com cuidado!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -785,12 +930,16 @@ msgstr "" "cuidado, pois valores inválidos podem tornar o conjunto de regras do " "firewall quebrado, expondo completamente todos os serviços." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "Caminho ao ficheiro de CIDRs, sub-redes, IPs de host, etc.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Encaminhamento de Portas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -798,70 +947,83 @@ msgstr "" "O Encaminhamento de Portas permite que computadores remotos na internet se " "liguem a um computador ou serviço especifico na rede privada (LAN)." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Faixa de portas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protocolo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Redirecionar a entrada de trafego correspondente à porta fornecida no host " "interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Redirecionar o tráfego de entrada correspondente para o host interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "" -"Requer suporte de hardware para NAT. Implementado pelo menos para mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Consulte o conjunto externo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "Zonas de reflexão" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Requer suporte de hardware para NAT." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Restringir o Mascaramento às sub-redes de destino dadas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Restringir Mascaramento a sub-redes de origem fornecidas" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Restringir a família de endereços" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "Reescrever o endereço IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" "Reescrever o tráfego compatível com o endereço IP de origem especificado." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Reescrever tráfego compatível com a porta de origem especificado ou uma " "faixa de portas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Reescrever porta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Descargar Roteamento/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Reescrever para um IP de origem ou uma porta específica" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Sábado" @@ -878,36 +1040,36 @@ msgstr "" "máscara]. Se uma máscara for especificada, então apenas os bits definidos na " "máscara são modificados." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Descarga baseada em software para roteamento/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Descarga de fluxo de software" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Endereço IP de origem" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Endereço MAC de origem" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Endereço de origem" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Porta de origem" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Zona de origem" @@ -919,7 +1081,7 @@ msgstr "" "Especifica se esta regra de tráfego deve ser ligada a um aparelho de rede " "específico de entrada ou de saída." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -927,32 +1089,36 @@ msgstr "" "Especifica se deve usar o endereço do IP externo ou interno para o tráfego " "refletido." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Data de Início (aaaaa-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Hora de início (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Data de Paragem (aaaaa-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Tempo de Parada (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Método de armazenamento" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Domingo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -960,7 +1126,7 @@ msgstr "" "A configuração de firewall existente precisa ser alterada para que o LuCI " "funcione corretamente." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -968,8 +1134,8 @@ msgstr "" "A firewall cria zonas sobre as interfaces de rede para controlar o fluxo do " "tráfego." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -986,7 +1152,7 @@ msgstr "" "lan para wan não implica uma permissão para avançar de wan para lan " "também." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -1001,18 +1167,18 @@ msgstr "" "abrangidas
    especifica quais das redes disponíveis são membros desta " "zona." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Quinta-feira" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Restrições de Tempo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Tempo em UTC" @@ -1020,6 +1186,10 @@ msgstr "Tempo em UTC" msgid "Time restrictions are enabled for this rule" msgstr "Restrições de tempo estão ativadas para esta regra" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Tempo limite" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1034,7 +1204,7 @@ msgstr "" "%{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Auxiliar de rastreamento" @@ -1079,8 +1249,8 @@ msgstr "" "diferentes zonas, por exemplo, para rejeitar trafego entre certos hosts ou " "para abrir portas WAN no router." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Terça-feira" @@ -1088,18 +1258,26 @@ msgstr "Terça-feira" msgid "Unable to save contents: %s" msgstr "Incapaz de gravar conteúdos: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" +"Unidade: segundos. Padrão 0 significa que a entrada é " +"adicionada permanentemente ao conjunto.
    Max: 2147483 segundos." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "Auxiliar conntrack desconhecido ou não instalado \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "NAT sem nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Encaminhamento sem nome" @@ -1108,15 +1286,19 @@ msgstr "Encaminhamento sem nome" msgid "Unnamed rule" msgstr "Regra sem nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Conjunto sem nome" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Zona sem nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Protocolo desconhecido" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1126,15 +1308,21 @@ msgstr "" "serão convertidas para seções \"nat\" e o firewall será reiniciado para " "aplicar e atualizar as novas configurações." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Usar endereço IP externo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Usar endereço IP interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Use o ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1142,7 +1330,7 @@ msgstr "" "Use esta opção para classificar o tráfego da zona por aparelhos de rede " "brutos, não geridos por uci." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1154,17 +1342,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Marca de firewall válida necessária" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Quarta-feira" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Dias úteis" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "Marca de firewall XOR" @@ -1172,109 +1360,241 @@ msgstr "Marca de firewall XOR" msgid "XOR mark" msgstr "Marca XOR" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "O seu aparelho não executa o firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "O seu aparelho executa o firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zona ⇒ Encaminhamentos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zonas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" +"Zonas das quais as regras de reflexão devem ser criadas. Se não for " +"definido, apenas a zona de destino é utilizada." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "aceitar" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "qualquer" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "qualquer zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "qualquer/todos" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "aplicar marca de firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "atribuir auxiliar conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "automático" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bitmap" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "bitmap é ipv4 apenas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "dia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: IP de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: endereço MAC de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: (sub)rede de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: Porta de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: Destino ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "não reescrever" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "não rastrear" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "descartar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"firewall4 oferece suporte a referência e criação de conjuntos de IPs para " +"simplificar a correspondência de grandes listas de endereços sem a " +"necessidade de criar uma regra que coincida com cada item. Os intervalos das " +"portas em ipsets não são compatíveis com o firewall4.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "deporta-paraporta" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "hora" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: Endereço IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" +"ip[/cidr]
    Para uso com tipos de dados que coincidam: *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "lista" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: endereço MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macaddr|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "minuto" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "rede: (sub)rede" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "porta: Porta" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "rejeitar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "segundo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set: ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: Origem do ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: IP de origem" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: Origem do endereço MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: Origem (sub)rede" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Porta de origem" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "este aparelho" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "esta nova zona" @@ -1286,6 +1606,11 @@ msgstr "ilimitado" msgid "unspecified" msgstr "não especificado" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "até 65536 entradas." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "marca de firewall válida" diff --git a/package/luci/applications/luci-app-firewall/po/pt_BR/firewall.po b/package/luci/applications/luci-app-firewall/po/pt_BR/firewall.po index 94bb1b5885..48f7d8cbd0 100644 --- a/package/luci/applications/luci-app-firewall/po/pt_BR/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/pt_BR/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2021-10-23 23:47+0000\n" +"PO-Revision-Date: 2023-07-26 22:47+0000\n" "Last-Translator: Wellington Terumi Uemura \n" "Language-Team: Portuguese (Brazil) \n" +"librecmc/luciapplicationsfirewall/pt_BR/>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -49,21 +49,29 @@ msgstr "" msgid "-- add IP --" msgstr "-- Adicionar IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- Adicionar MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" "Aceite %{src?%{dest?forward:input}:output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Prevenir a reescrita da fonte" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -101,7 +109,7 @@ msgstr "" "%{set_mark?Assign:XOR} marca do firewall " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Reescrever automaticamente o IP de " @@ -122,7 +130,7 @@ msgstr "" "Rejeita %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -130,23 +138,23 @@ msgstr "" "Reescrever estaticamente para a origem " "%{snat_ip?IP %{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Um IP de reescrita deve ser especificado!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACEITAR - Desativar a reescrita do endereço" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Ação" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -156,7 +164,7 @@ msgstr "" "da zona, por exemplo, -p tcp --dport 443 para corresponder " "apenas ao tráfego HTTPS de saída." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -165,33 +173,45 @@ msgstr "" "da zona, por exemplo, -p tcp --sport 443 para corresponder " "apenas ao tráfego HTTPS de entrada." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Família de endereços, o endereço IP interno deve corresponder" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" +"Família de endereços, endereço de origem, endereço de destino, a reescrita " +"do endereço IP deve corresponder" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" -msgstr "Configurações Avançadas" +msgstr "Configurações avançadas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Permitir tráfego \"inválido\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Permite o encaminhamento da zona de origem:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Permite o encaminhamento para a zona de destino:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Qualquer" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Qualquer dia" @@ -209,28 +229,33 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "Aplique a classe ou valor DSCP dado às conexões estabelecidas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" "Atribua o auxiliar de rastreamento de conexão especificado para o tráfego " "combinado." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Atribuição automática de assistentes" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "Atribuir automaticamente ajudantes de conntrack com base no protocolo de " "tráfego e na porta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Comentário" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Configurações do Conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Ajudantes do Conntrack" @@ -238,23 +263,27 @@ msgstr "Ajudantes do Conntrack" msgid "Contents have been saved." msgstr "O conteúdo foi salvo." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Continuar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Contadores" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Dispositivos cobertos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Redes cobertas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Sub-redes cobertas" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Regras Personalizadas" @@ -268,7 +297,7 @@ msgstr "" "cobertos por esta ferramenta. Os comandos serão executados após cada " "reinício do firewall, logo após a carga do conjunto de regras padrão." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "Classificação DSCP" @@ -280,17 +309,17 @@ msgstr "Marca DSCP" msgid "DSCP mark required" msgstr "Marca DSCP necessária" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Endereço de destino" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Porta de destino" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Zona de destino" @@ -298,7 +327,7 @@ msgstr "Zona de destino" msgid "Device name" msgstr "Nome do dispositivo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -307,69 +336,100 @@ msgstr "" "estado do conntrack for invalid. Isto pode ser necessário para " "configurações complexas e de rotas assimétricas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Descartar pacotes inválidos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Ativar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Habilite o Loopback do NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Habilite proteção contra SYN-flood" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Habilite o registro nesta zona" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Ative o endereço de rede e a tradução da porta IPv4 (NAT4 ou NAPT4) para o " +"tráfego de saída nesta zona. Normalmente, isso é ativado na zona wan." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Ative o endereço de rede e a tradução da porta IPv6 (NAT6 ou NAPT6) para o " +"tráfego de saída nesta zona." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Ativado" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" +"Ativa o rastreamento da contagem dos pacotes e dos bytes para o conjunto." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Esperando: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" "Funcionalidade experimental. Ela não é totalmente compatível com QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" "Escolhe explicitamente os assistentes de rastreamento de conexão permitidos " "para o tráfego da zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Endereço IP externo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Porta Externa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Argumentos extras" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Argumentos extra de destino" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Argumentos extras para o iptables" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Argumentos extras da fonte" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Família" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Firewall" @@ -378,11 +438,15 @@ msgstr "Firewall" msgid "Firewall - Custom Rules" msgstr "Firewall - Regras personalizadas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Firewall - Conjuntos de IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Firewall - Regras NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Firewall - Encaminhamento de Portas" @@ -390,39 +454,41 @@ msgstr "Firewall - Encaminhamento de Portas" msgid "Firewall - Traffic Rules" msgstr "Firewall - Regras de Tráfego" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Firewall - Configurações de Zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Migração de configuração do Firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Encaminhar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark." -"val}}" - -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +"Encaminhado %{ipv6?%{ipv4?IPv4 e IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Sexta-feira" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Configurações gerais" @@ -488,32 +554,70 @@ msgstr "Configurações gerais" msgid "Grant access to firewall configuration" msgstr "Conceder acesso à configuração do firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Aceleração do fluxo dos dados via hardware" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (intervalo)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "Conjuntos de IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IPs/Redes" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IPs/Redes/MACs" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 e IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" -msgstr "Somente IPv4" +msgstr "Apenas IPv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "Mascaramento IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" -msgstr "Somente IPv6" +msgstr "Apenas IPv6" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 msgid "Inbound device" msgstr "Dispositivo de entrada" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Incluir arquivo" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 e IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " -"with types %{item.types#%{next?, }%{item}}:" +"com tipos %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper " -"%{helper.inv?%{helper.val}:%{helper.val}}}" +"%{mark.mask} antes de comparar.\"}}>%{mark.val}}%{helper?, helper " +"%{helper.inv?%{helper.val}:%{helper.val}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Tamanho inicial do hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Entrada" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Endereço IP interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Porta Interna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Zona interna" @@ -559,11 +668,15 @@ msgstr "Marca DSCP inválida" msgid "Invalid limit value" msgstr "Valor limite inválido" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Estouro limite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Limita as mensagens de registro" @@ -571,9 +684,9 @@ msgstr "Limita as mensagens de registro" msgid "Limit matching" msgstr "Limitar as correspondências" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -581,7 +694,8 @@ msgstr "" "Limitar a correspondência de %{limit.num} pacotes por " "%{limit.unit}%{limit.burst? estouro %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Mascaramento limitado ativado" @@ -589,25 +703,25 @@ msgstr "Mascaramento limitado ativado" msgid "Limits traffic matching to the specified rate." msgstr "Limita a correspondência de tráfego à taxa especificada." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "IP da fonte de Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASQUERADE - Reescreve automaticamente para o IP da interface de saída" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "Ajuste do MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Mascaramento" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Casa" @@ -623,37 +737,37 @@ msgstr "Casa com ICMP tipo" msgid "Match device" msgstr "Dispositivo de correspondência" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" "Encaminha o tráfego que obteve correspondência para um determinado endereço " "de IP." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "Encaminha o tráfego que obteve correspondência para uma determinada porta de " "destino ou uma faixa de portas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" "Encaminha o tráfego que obteve correspondência deste IP ou uma faixa de IPs." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "Encaminha o tráfego que obteve correspondência originado de uma determinada " "porta de origem ou faixa de portas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "Auxiliar de correspondência" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -665,8 +779,8 @@ msgstr "" msgid "Match mark" msgstr "Marca de correspondência" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" "Corresponder o tráfego usando uma conexão definida pelo auxiliar de " @@ -678,7 +792,7 @@ msgstr "" "Corresponder uma marca de firewall especifica ou uma variedade de diferentes " "marcas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" "Corresponda o tráfego encaminhado usando um dispositivo de rede de saída " @@ -690,6 +804,14 @@ msgstr "" "Casa o tráfego correspondente que esteja carregando uma marca DSCP " "específica." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Total de registros" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Comprimento máximo" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -699,22 +821,22 @@ msgstr "" "por um cada vez que o limite especificado acima não é atingido, até este " "número." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Segunda-Feira" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Dias do mês" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "Regras NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -722,27 +844,33 @@ msgstr "" "As regras da NAT permitem o controle fino sobre o IP de origem para usar com " "o tráfego de saída ou tráfego de encaminhamento." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Máscara de rede" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" "Somente case o tráfego entrante direcionado para o endereço IP fornecido." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Somente case o tráfego entrante destes endereços MAC." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Somente case o tráfego entrante desta faixa de endereços IP." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -751,26 +879,43 @@ msgstr "" "intervalo de portas no equipamento cliente" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Dispositivo de saída" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Zona de saída" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Saída" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Campo do pacote coincidente" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Campos do pacote que correspondem.
    Sintaxe: direction_datatype. por exemplo: src_port, dest_net.
    Modo de preparo: " +"src, dst. Tipos de dados: ip, port, mac, net, set. " +"
    Os prefixos de direção são opcionais.
    *Nota: o tipo de dados " +"set não é suportado no fw4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "Passa argumentos adicionais para o iptables. Use com cuidado!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -784,12 +929,16 @@ msgstr "" "extremo cuidado, pois valores inválidos podem quebrar todo o conjunto de " "regras do firewall expondo todos os serviços completamente." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "Caminho para o arquivo de CIDRs, sub-redes, IPs de host, etc.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Encaminhamentos de Porta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -797,68 +946,82 @@ msgstr "" "O encaminhamento de portas permite que computadores remotos na Internet " "conectem a um computador ou serviço específico dentro da rede local privada." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Faixa de portas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protocolo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Redireciona tráfego entrante para a porta especificada no computador interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Redireciona tráfego entrante para o computador interno especificado" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "Requer suporte de NAT em hardware. Implementado ao menos para mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Consulte o conjunto externo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "Zonas de reflexão" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Requer suporte de NAT em hardware." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Restringe o mascaramento para uma subrede de destino específica" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Restringe o mascaramento para uma subrede de origem específica" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" -msgstr "Restringe para uma família de endereços" +msgstr "Restringe à uma família de endereços" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "Reescreva o endereço IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" "Reescreva o tráfego compatível com o endereço IP de origem especificado." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Reescrever tráfego compatível com a porta de origem especificado ou uma " "faixa de portas." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Reescrever porta" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Aceleração do roteamento/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Reescrever para um IP de origem ou uma porta específica" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Sábado" @@ -875,36 +1038,36 @@ msgstr "" "mask]. Se uma máscara for especificada, então apenas os bits definidos na " "máscara são modificados." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Aceleração do roteamento/NAT via software" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Aceleração do fluxo dos dados via software" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Endereço IP de origem" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Endereço MAC de origem" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Endereço de origem" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Porta de origem" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Zona de origem" @@ -916,7 +1079,7 @@ msgstr "" "Especifica se esta regra de tráfego deve ser ligada a um dispositivo de rede " "específico de entrada ou de saída." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -924,32 +1087,36 @@ msgstr "" "Especifica se deve usar o endereço de IP externo ou interno para o tráfego " "refletido." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Dia inicial (aaaa-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Hora de Início (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Dia final (aaaa-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Hora de Parada (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Método de armazenamento" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Domingo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -957,7 +1124,7 @@ msgstr "" "A configuração de firewall existente precisa ser alterada para que o LuCI " "funcione corretamente." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -965,8 +1132,8 @@ msgstr "" "O firewall cria zonas sobre as interfaces de rede para controlar o fluxo do " "tráfego de rede." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -982,7 +1149,7 @@ msgstr "" "encaminhamento é unidirecional, ex: um encaminhamento da LAN para " "WAN não implica na permissão de encaminhar da WAN para LAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -997,18 +1164,18 @@ msgstr "" "Redes Cobertas especificam que redes disponíveis são membros desta " "zona." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Quita-feira" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Restrições de tempo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Hora em UTC" @@ -1016,6 +1183,10 @@ msgstr "Hora em UTC" msgid "Time restrictions are enabled for this rule" msgstr "As restrições de tempo estão ativadas para esta regra" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Tempo limite" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1030,7 +1201,7 @@ msgstr "" "%{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Auxiliar de rastreamento" @@ -1075,8 +1246,8 @@ msgstr "" "diferentes zonas. Por exemplo, rejeitar o tráfego entre certos equipamentos " "ou abrir portas WAN no roteador." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Terça-feira" @@ -1084,18 +1255,26 @@ msgstr "Terça-feira" msgid "Unable to save contents: %s" msgstr "Não foi possível salvar os conteúdos: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" +"Unidade: segundos. Padrão 0 significa que a entrada é " +"adicionada permanentemente ao conjunto.
    Max: 2147483 segundos." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "Auxiliar conntrack desconhecido ou não instalado \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "NAT sem nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Encaminhamento sem nome" @@ -1104,15 +1283,19 @@ msgstr "Encaminhamento sem nome" msgid "Unnamed rule" msgstr "Regra sem nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Conjunto sem nome" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Zona sem nome" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Protocolo desconhecido" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1122,15 +1305,21 @@ msgstr "" "serão convertidas para seções \"nat\" e o firewall será reiniciado para " "aplicar e atualizar as novas configurações." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Usar endereço IP externo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Usar endereço IP interno" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Use o ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1138,7 +1327,7 @@ msgstr "" "Use esta opção para classificar o tráfego bruto da zona por dispositivos de " "rede não gerenciados pelauci." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1150,17 +1339,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Marca de firewall válida necessária" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Quarta-feira" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Dias da semana" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "Marca de firewall XOR" @@ -1168,109 +1357,241 @@ msgstr "Marca de firewall XOR" msgid "XOR mark" msgstr "Marca XOR" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "O seu dispositivo não roda o firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "O seu dispositivo roda o firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zona ⇒ Encaminhamentos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zonas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" +"Zonas de onde devem ser criadas regras de reflexão. Se não for definido, " +"apenas a zona de destino é usada." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "aceitar" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "qualquer" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "qualquer zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "qualquer/tudo" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "aplicar marca de firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "atribuir auxiliar conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "automático" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bitmap" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "bitmap é ipv4 apenas" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "dia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: IP de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: endereço MAC de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: (sub)rede de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: Porta de destino" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: Destino ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "não reescrever" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "não rastrear" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "descartar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"firewall4 oferece suporte a referência e criação de conjuntos de IPs para " +"simplificar a correspondência de grandes listas de endereços sem a " +"necessidade de criar uma regra que coincida com cada item. Os intervalos das " +"portas em ipsets não são compatíveis com o firewall4.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "deporta-paraporta" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "hora" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: Endereço IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" +"ip[/cidr]
    Para uso com tipos de dados que coincidam: *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "lista" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: endereço MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macaddr|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "minuto" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "rede: (sub)rede" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "porta: Porta" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "rejeitar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "segundo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set: ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: Origem do ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: IP de origem" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: Origem do endereço MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: Origem (sub)rede" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Porta de origem" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "este dispositivo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "esta nova zona" @@ -1282,6 +1603,11 @@ msgstr "ilimitado" msgid "unspecified" msgstr "não especificado" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "até 65536 entradas." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "marca de firewall válida" diff --git a/package/luci/applications/luci-app-firewall/po/ro/firewall.po b/package/luci/applications/luci-app-firewall/po/ro/firewall.po index 1262ba0082..4ce74318a8 100644 --- a/package/luci/applications/luci-app-firewall/po/ro/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/ro/firewall.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-01-26 08:55+0000\n" -"Last-Translator: CRISTIAN ANDREI \n" -"Language-Team: Romanian \n" +"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.0.2\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -48,10 +48,18 @@ msgstr "" msgid "-- add IP --" msgstr "-- adăugați IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- adăugați MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -59,11 +67,11 @@ msgstr "" "Acceptă %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Preveniți rescrierea sursei" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -101,7 +109,7 @@ msgstr "" "%{set_mark?Assign:XOR} marcaj firewall " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Automat rescrieți automat sursa IP" @@ -121,7 +129,7 @@ msgstr "" "Rejectare %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -129,23 +137,23 @@ msgstr "" "Statically rewrite la sursă %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Trebuie specificat un IP de rescriere!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACCEPT - Dezactivează rescrierea adreselor" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Acțiune" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -155,7 +163,7 @@ msgstr "" "de destinație al zonei, de exemplu, -p tcp --dport 443 pentru a " "se potrivi numai cu traficul HTTPS de ieșire." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -164,33 +172,43 @@ msgstr "" "sursă din zonă, de exemplu, -p tcp --sport 443 pentru a se " "potrivi numai cu traficul HTTPS de intrare." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Familia de adrese, adresa IP internă trebuie să corespundă" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "Familia de adrese, adresa IP internă trebuie să corespundă" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Setări avansate" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Permiteți traficul \"invalid\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Permite trecerea din zonele sursa:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Permite trecerea catre zonele sursa:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Oricare" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Orice zi" @@ -208,28 +226,33 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "Aplică clasa sau valoarea DSCP dată la conexiunile stabilite." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" "Alocarea ajutorului de urmărire a conexiunilor specificat pentru traficul " "corespunzător." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Atribuirea automată a ajutorului" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "Atribuiți automat ajutoare de conntrack pe baza protocolului și portului de " "trafic" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Comentariu" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Setări Conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Ajutoarele Conntrack" @@ -237,23 +260,27 @@ msgstr "Ajutoarele Conntrack" msgid "Contents have been saved." msgstr "Conţinutul a fost salvat." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Continuați" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Contoare" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Dispozitive acoperite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Retele acoperite" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Subrețele acoperite" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Reguli suplimentare" @@ -268,7 +295,7 @@ msgstr "" "după fiecare repornire a firewall-ului, imediat după ce setul de reguli " "implicite a fost încărcat." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "Clasificarea DSCP" @@ -280,17 +307,17 @@ msgstr "Marcaj DSCP" msgid "DSCP mark required" msgstr "Marcaj DSCP necesar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Adresa de destinație" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Portul de destinație" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Zonă de destinație" @@ -298,7 +325,7 @@ msgstr "Zonă de destinație" msgid "Device name" msgstr "Numele dispozitivului" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -307,68 +334,98 @@ msgstr "" "starea conntrack invalid. Acest lucru poate fi necesar pentru " "configurații complexe de rute asimetrice." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Descarcă pachetele invalide" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" -msgstr "Activați" +msgstr "Activează" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Activează loopback NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Activează protecţia SYN-flood" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Activeaza log in aceasta zona" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Activați adresa de rețea și traducerea portului IPv4 (NAT4 sau NAPT4) pentru " +"traficul de ieșire din această zonă. Acest lucru este de obicei activat pe " +"wan zone." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Activați adresa de rețea și traducerea porturilor IPv6 (NAT6 sau NAPT6) " +"pentru traficul de ieșire din această zonă." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "activat" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "Activează urmărirea numărului de pachete și de octeți pentru set." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Se așteaptă: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Funcție experimentală. Nu este complet compatibiă cu QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" "Alege în mod explicit ajutoarele de urmărire a conexiunilor permise pentru " "traficul din zonă" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Adresă IP externă" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Port extern" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Argumente suplimentare" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Argumente suplimentare pentru destinație" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Argumente suplimentare pentru iptables" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Argumente sursă suplimentare" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Familie" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Firewall" @@ -377,11 +434,15 @@ msgstr "Firewall" msgid "Firewall - Custom Rules" msgstr "Firewall - Reguli particularizate" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Firewall - Seturi IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Firewall - Reguli NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Firewall - Port-uri forwardate" @@ -389,39 +450,41 @@ msgstr "Firewall - Port-uri forwardate" msgid "Firewall - Traffic Rules" msgstr "Firewall - Reguli ale traficului" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Setari zona la firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Migrarea configurației firewall-ului" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" -msgstr "Redirecţionare" +msgstr "redirecționare" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Redirecționat IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}}" +"Redirecționate %{ipv6?%{ipv4?IPv4 și IPv6:IPv6}:IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}" +"}}%{mark?, mark %{mark.val}" +"}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Vineri" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}" "}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Setări generale" @@ -487,22 +550,55 @@ msgstr "Setări generale" msgid "Grant access to firewall configuration" msgstr "Acordarea accesului la configurația firewall-ului" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Descărcarea fluxului hardware" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (interval)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "Seturi IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IP-uri/Rețele" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IP-uri/Rețele/MAC-uri" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 și IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Doar IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "Mascare IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Doar IPv6" @@ -510,9 +606,14 @@ msgstr "Doar IPv6" msgid "Inbound device" msgstr "Dispozitiv de intrare" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Includere fișier" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Intrând IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 și IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Dimensiunea inițială a hash-ului" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Intrare" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Adresa IP interna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Port intern" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Zonă internă" @@ -557,11 +663,15 @@ msgstr "Marcaj DSCP invalid" msgid "Invalid limit value" msgstr "Valoare limită invalidă" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Limitați explozia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Limitează mesaje în log" @@ -569,9 +679,9 @@ msgstr "Limitează mesaje în log" msgid "Limit matching" msgstr "Potrivirea limitelor" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -579,7 +689,8 @@ msgstr "" "Limitați potrivirea la %{limit.num} pachete pe %{limit.unit}" "%{limit.burst? burst %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Activarea limitată a mascării" @@ -587,25 +698,25 @@ msgstr "Activarea limitată a mascării" msgid "Limits traffic matching to the specified rate." msgstr "Limitează potrivirea traficului la rata specificată." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "IP sursă Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASQUERADE - Rescrierea automată către IP-ul interfeței de ieșire" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "Ajustare MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Translatare" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Potrivire" @@ -621,34 +732,34 @@ msgstr "Potriveste pe tipul de ICMP" msgid "Match device" msgstr "Dispozitiv de potrivire" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "Potrivește traficul redirecționat către adresa IP dată." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "Potrivește traficul redirecționat către portul de destinație sau intervalul " "de porturi dat." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "Potrivește traficul redirecționat de la acest IP sau interval." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "Potrivește traficul redirecționat care provine din portul sursă sau din " "intervalul de porturi dat." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "Ajutor de potrivire" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -660,8 +771,8 @@ msgstr "" msgid "Match mark" msgstr "Marca de meci" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" "Potrivește traficul care utilizează ajutorul de urmărire a conexiunilor " @@ -673,7 +784,7 @@ msgstr "" "Se potrivește cu o anumită marcă de firewall sau cu o serie de mărci " "diferite." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" "Potrivește traficul redirecționat utilizând dispozitivul de rețea de ieșire " @@ -683,6 +794,14 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "Potrivește traficul care poartă marcajul DSCP specificat." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Intrări max" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Lungime maximă" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -692,22 +811,22 @@ msgstr "" "se reîncarcă cu unu de fiecare dată când limita specificată mai sus nu este " "atinsă, până la acest număr." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Luni" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Luna Zile" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "Reguli NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -715,28 +834,34 @@ msgstr "" "Regulile NAT permit un control fin asupra IP-ului sursă care va fi utilizat " "pentru traficul de ieșire sau de redirecționare." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Nume" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Mască de rețea" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" "Se potrivește numai cu traficul de intrare direcționat către adresa IP dată." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Potriviți numai traficul de intrare de la aceste MAC-uri." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" "Se potrivește numai cu traficul de intrare de la acest IP sau interval." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -745,26 +870,43 @@ msgstr "" "sau din intervalul de porturi de pe gazda clientului" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Dispozitiv de ieșire" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Zona de ieșire" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Ieşire" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Potrivire câmp pachete" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Câmpurile pachetului care se potrivesc.
    Sintaxa: " +"direction_datatype. de exemplu: src_port, dest_net." +"
    Direcții: src, dst. Tipuri de date: ip, port, mac, " +"net, set.
    . Prefixele de direcție sunt opționale.
    *Nota: " +"tipul de date set nu este acceptat în fw4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "Transmite argumente suplimentare către iptables. Folosiți cu grijă!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -778,12 +920,17 @@ msgstr "" "utilizate cu mare atenție, deoarece valorile invalide ar putea face ca setul " "de reguli de firewall să fie rupt, expunând complet toate serviciile." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" +"Calea de acces la fișierul cu CIDR-uri, subrețele, IP-uri gazdă etc.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Port Redirecționări" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -792,70 +939,84 @@ msgstr "" "internet să se conecteze la un anumit computer sau serviciu din cadrul unei " "rețele locale private." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "interval de porturi" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protocol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Redirecționează traficul de intrare corespunzător către portul dat pe gazda " "internă" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" "Redirecționează traficul de intrare corespunzător către gazda internă " "specificată" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "Necesită suport hardware NAT. Implementat cel puțin pentru mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Consultați Setul extern" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "Zone de reflexie" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Necesită suport hardware NAT." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Restrângerea masquerading-ului la anumite subrețele de destinație" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Restrângerea masquerading-ului la anumite subrețele sursă" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" -msgstr "Restrângerea pentru a se adresa familiei" +msgstr "Restricționarea la adresa familiei" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "Rescrieți adresa IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "Răspândește traficul potrivit la adresa IP sursă specificată." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Rescrie traficul potrivit către portul sursă sau intervalul de porturi " "specificat." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Port de rescriere" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Rutarea/încărcarea NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Rescrierea către un anumit IP sau port sursă" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Sâmbătă" @@ -872,36 +1033,36 @@ msgstr "" "este value[/mask]. Dacă este specificată o mască, atunci sunt modificați " "numai acei biți setați în mască." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Descărcarea bazată pe software pentru rutare/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Descărcarea fluxului de software" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Sursă adresă IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Sursă adresă MAC" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Adresă sursă" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Port sursă" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Zona sursa" @@ -913,7 +1074,7 @@ msgstr "" "Specifică dacă se leagă această regulă de trafic de un anumit dispozitiv de " "intrare sau de ieșire din rețea." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -921,32 +1082,36 @@ msgstr "" "Specifică dacă se utilizează adresa IP externă sau internă pentru traficul " "reflectat." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Data de începere (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Ora de începere (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Data de oprire (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Timp de oprire (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Metoda de stocare" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Duminică" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -954,7 +1119,7 @@ msgstr "" "Configurația existentă a firewall-ului trebuie să fie modificată pentru ca " "LuCI să funcționeze corect." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -962,8 +1127,8 @@ msgstr "" "Firewall-ul creează zone peste interfețele de rețea pentru a controla fluxul " "de trafic de rețea." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -977,10 +1142,10 @@ msgstr "" "redirecționat provenit din %q. Zonele sursă se " "potrivesc cu traficul redirecționat din alte zone destinate la %q. Regula de redirecționare este unidirecțională, de exemplu, " -"o redirecționare de la lan la wan nu implicăo permisiune de a " -"redirecționa și de la wan la lan." +"o redirecționare de la lan la wan nu implicăo permisiune de " +"redirecționare de la wan la lan." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -995,18 +1160,18 @@ msgstr "" "diferite rețele din cadrul zonei. Rețele acoperite specifică ce " "rețele disponibile sunt membre ale acestei zone." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Joi" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Restricţii de timp" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Timp în UTC" @@ -1014,6 +1179,10 @@ msgstr "Timp în UTC" msgid "Time restrictions are enabled for this rule" msgstr "Restricțiile de timp sunt activate pentru această regulă" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Pauză" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1028,7 +1197,7 @@ msgstr "" "%{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Ajutor pentru urmărire" @@ -1073,8 +1242,8 @@ msgstr "" "între diferite zone, de exemplu pentru a respinge traficul între anumite " "gazde sau pentru a deschide porturile WAN pe router." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Marţi" @@ -1082,18 +1251,26 @@ msgstr "Marţi" msgid "Unable to save contents: %s" msgstr "Nu se poate salva conținutul: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" +"Unitate: secunde. Implicit 0 înseamnă că intrarea este adăugată " +"permanent la set.
    Max: 2147483 secunde." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "Ajutor conntrack necunoscut sau neinstalat \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "Fără nume NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Înainte fără nume" @@ -1102,15 +1279,19 @@ msgstr "Înainte fără nume" msgid "Unnamed rule" msgstr "Regula fără nume" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Set fără nume" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Zona fără nume" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Protocol nerecunoscut" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1120,15 +1301,21 @@ msgstr "" "\"SNAT\" vor fi convertite în secțiuni \"nat\", iar firewall-ul va fi " "repornit pentru a aplica configurația actualizată." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Utilizați adresa IP externă" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Utilizați adresa IP internă" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Utilizați ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1136,7 +1323,7 @@ msgstr "" "Utilizați această opțiune pentru a clasifica traficul de zonă prin " "dispozitive de rețea brute, neuci gestionate." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1148,17 +1335,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Este necesară o marcă de firewall validă" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Miercuri" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Zilele săptămânii" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "XOR marca firewall" @@ -1166,109 +1353,241 @@ msgstr "XOR marca firewall" msgid "XOR mark" msgstr "Marcajul XOR" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "Dispozitivul nu rulează firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "Dispozitivul rulează firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zonă ⇒ Redirecționări" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zone" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" +"Zonele din care se creează reguli de reflecție. Dacă nu este setată, se " +"utilizează numai zona de destinație." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "acceptă" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "oricare" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "orice zona" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "orice/toate" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "aplică marcajul firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "atribuirea ajutorului conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "automat" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bitmap" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "bitmap este doar ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "zi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: IP-ul destinației" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: Destinație adresa MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: Destinație (sub)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port:Destinatie port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: Destinație ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "nu rescrieți" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "nu urmăriți" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "picătură" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"firewall4 acceptă corelarea și crearea de seturi IP pentru a simplifica " +"potrivirea listelor de adrese mari, fără a fi nevoie să creați o regulă " +"pentru fiecare element pentru a se potrivi. Intervalele de porturi din " +"ipsets nu sunt acceptate de firewall4.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "de la port la port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "oră" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: Adresă IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "IP[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" +"ip[/cidr]
    Pentru utilizare cu tipurile de date Match: *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "listă" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: Adresă MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macaddr|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "minut" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "net: (sub)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "port: Port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "respingeți" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "secundă" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set: ipset *" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: Sursa ipset *" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: IP sursă" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: Adresă MAC sursă" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: (sub)rețea sursă" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Port sursă" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "acest dispozitiv" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "această nouă zonă" @@ -1280,6 +1599,11 @@ msgstr "nelimitat" msgid "unspecified" msgstr "nespecificat" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "până la 65536 intrări." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "marca de firewall validă" diff --git a/package/luci/applications/luci-app-firewall/po/ru/firewall.po b/package/luci/applications/luci-app-firewall/po/ru/firewall.po index 89581245f9..0253ee0683 100644 --- a/package/luci/applications/luci-app-firewall/po/ru/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/ru/firewall.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: LuCI: firewall\n" "POT-Creation-Date: 2013-09-05 16:02+0200\n" -"PO-Revision-Date: 2021-08-11 21:12+0000\n" -"Last-Translator: Anton Kikin \n" -"Language-Team: Russian \n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 5.1\n" "Project-Info: Это технический перевод, не дословный. Главное-удобный русский " "интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" @@ -51,10 +51,18 @@ msgstr "" msgid "-- add IP --" msgstr "-- добавить IP-адрес --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- добавить MAC-адрес --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -62,11 +70,11 @@ msgstr "" "Разрешить %{src?%{dest?перенаправляемый:" "входящий}:исходящий} трафик" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Предотвращать перезапись источника" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -106,7 +114,7 @@ msgstr "" "%{set_mark?Назначить метку:XOR метки} " "брандмауэра %{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Автоматически перезаписывать IP-адрес " @@ -127,7 +135,7 @@ msgstr "" "Отклонять %{src?%{dest?перенаправляемый:" "входящий}:исходящий} трафик" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -136,23 +144,23 @@ msgstr "" "источника на %{snat_ip}} %{snat_port?порт источника на " "%{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "IP-адрес для перезаписи должен быть указан!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACCEPT — отключить перезапись адреса" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Действие" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -160,44 +168,54 @@ msgid "" msgstr "" "Дополнительные аргументы iptables для классификации трафика зоны " "назначения, например -p tcp --dport 443 для соответствия только " -"исходящему HTTPS трафику." +"исходящему HTTPS-трафику." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" "Дополнительные аргументы iptables для классификации трафика зоны " "источника, например -p tcp --sport 443 для соответствия только " -"входящему HTTPS трафику." +"входящему HTTPS-трафику." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Внутренний IP-адрес должен соответствовать выбранной версии IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "Адреса источника, назначения и перезаписи должны быть одной версии IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" -msgstr "Дополнительные настройки" +msgstr "Расширенные настройки" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Разрешить «недействительный» трафик" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Разрешить перенаправление из 'зон источников':" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Разрешить перенаправление в 'зоны назначения':" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Любой" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Любой день" @@ -216,28 +234,33 @@ msgid "Apply the given DSCP class or value to established connections." msgstr "" "Применить заданный класс DSCP или значение к установленным соединениям." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" "Назначить указанного помощника отслеживания соединений для соответствующего " "трафика." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Автоматическое назначение помощников" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "Автоматическое назначение помощников отслеживания соединений (conntrack) на " "основе протокола и порта трафика" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Комментарий" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Отслеживание соединений (conntrack)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Помощники отслеживания соединений" @@ -245,23 +268,27 @@ msgstr "Помощники отслеживания соединений" msgid "Contents have been saved." msgstr "Содержимое сохранено." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Продолжить" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Счетчики" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Охватываемые устройства" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Охватываемые сети" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Охватываемые подсети" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Пользовательские правила" @@ -276,7 +303,7 @@ msgstr "" "каждой перезагрузки межсетевого экрана, сразу после загрузки набора правил " "по умолчанию." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "DSCP классификация" @@ -288,17 +315,17 @@ msgstr "DSCP метка" msgid "DSCP mark required" msgstr "Требуется DSCP метка" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Адрес назначения" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Порт назначения" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Зона назначения" @@ -306,7 +333,7 @@ msgstr "Зона назначения" msgid "Device name" msgstr "Имя устройства" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -315,68 +342,97 @@ msgstr "" "трафика с состоянием недействительный (invalid). Это может " "потребоваться для сложных настроек асимметричной маршрутизации." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Отбрасывать некорректные пакеты" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Включить" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Включить NAT Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Включить защиту от SYN-flood атак" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Включить журналирование в этой зоне" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Включите трансляцию сетевых адресов и портов IPv4 (NAT4 или NAPT4) для " +"исходящего трафика в этой зоне. Обычно это включается в зоне wan." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Включите трансляцию сетевых адресов и портов IPv6 (NAT6 или NAPT6) для " +"исходящего трафика в этой зоне." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Включен" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "Включает отслеживание количества пакетов и байтов для набора." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Ожидается: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Экспериментальный функционал. Не полностью совместим с QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" "Явно определяет допустимые варианты помощников (helpers) отслеживания " "соединений (connection tracking) трафика в зоне" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Внешний IP-адрес" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Внешний порт" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Дополнительные аргументы" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Дополнительные аргументы для назначения" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Дополнительные аргументы iptables" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Дополнительные аргументы для источника" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Семейство" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Межсетевой экран" @@ -385,11 +441,15 @@ msgstr "Межсетевой экран" msgid "Firewall - Custom Rules" msgstr "Межсетевой экран - Пользовательские правила" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Брандмауэр - наборы IP-адресов" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Межсетевой экран - Правила NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Межсетевой экран - Перенаправление портов" @@ -397,39 +457,41 @@ msgstr "Межсетевой экран - Перенаправление пор msgid "Firewall - Traffic Rules" msgstr "Межсетевой экран - Правила для трафика" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Межсетевой экран - Настройка зон" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Миграция конфигурации межсетевого экрана" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Перенаправление" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Перенаправление IPv4%{proto?, протокол %{proto#%{next?, }%{item.name}}}%{mark?, метка %{mark.val}}" - -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +"Перенаправление %{ipv6?%{ipv4?IPv4 и IPv6:IPv6}:IPv4}%{proto?, протокол %{proto#%{next?, }%{item.name}" +"}}%{mark?, пометка %{mark.val}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Пятница" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" -msgstr "Общие настройки" +msgstr "Основные настройки" #: applications/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json:3 msgid "Grant access to firewall configuration" msgstr "Разрешить конфигурировать брандмауер" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Аппаратная разгрузка потока" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (диапазон)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "Наборы IP-адресов" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IP-адреса/сети" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IP-адреса/сети/MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 и IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Только IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "Маскарадинг IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Только IPv6" @@ -518,9 +613,14 @@ msgstr "Только IPv6" msgid "Inbound device" msgstr "Входящее устройство" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Файл включения" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Входящий IPv4%{proto?, протокол %{proto#%{next?, }%{item.types?IPv4 и IPv6:IPv6}:" +"IPv4}%{proto?, протокол %{proto#%{next?, }%{item.types?%{item.name}ICMP " "с типами %{item.types#%{next?, }%{item}}:%{item." -"name}}}}%{mark?, метка %{mark.val}}%{helper?, помощник %{helper.inv?" -"%{helper.val}:%{helper." -"val}}}" +"name}}}}%{mark?, пометка %{mark.val}}%{helper?, помощник %{helper.inv?%{helper.val}:%{helper.val}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Начальный размер хэша" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Входящий трафик" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Внутренний IP-адрес" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Внутренний порт" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Внутренняя зона" @@ -566,11 +671,15 @@ msgstr "Неверная DSCP метка" msgid "Invalid limit value" msgstr "Неверное значение ограничения" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "Недопустимое имя набора" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Ограничение барста (burst)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Ограничить журнал сообщений" @@ -578,9 +687,9 @@ msgstr "Ограничить журнал сообщений" msgid "Limit matching" msgstr "Соответствие по ограничениям" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -588,7 +697,8 @@ msgstr "" "Ограничение до %{limit.num} пакетов в %{limit.unit}%{limit.burst? барст (burst) %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Включены ограничения маскарадинга" @@ -596,26 +706,26 @@ msgstr "Включены ограничения маскарадинга" msgid "Limits traffic matching to the specified rate." msgstr "Ограничивает сопоставление трафика указанной скорости." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "IP-адрес источника петли (Loopback)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" "MASQUERADE — автоматически переписывать на IP-адрес исходящего интерфейса" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "Ограничение MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Маскарадинг" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Соответствие" @@ -631,36 +741,36 @@ msgstr "Соответствие ICMP типу" msgid "Match device" msgstr "Соответствие устройству" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" "Соответствие перенаправляемого трафика, направленного на заданный IP-адрес." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "Соответствие перенаправляемого трафика, направленного на заданный порт " "назначения или диапазон портов." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" "Соответствие перенаправляемого трафика от данного IP-адреса или диапазона." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "Соответствие перенаправляемого трафика, исходящего от заданного порта " "источника или диапазона портов." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "Соответствие помощнику" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -672,8 +782,8 @@ msgstr "" msgid "Match mark" msgstr "Соответствие метки" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" "Сопоставление трафика с помощью указанного помощника отслеживания соединений." @@ -683,7 +793,7 @@ msgid "Matches a specific firewall mark or a range of different marks." msgstr "" "Соответствие определённой метке брандмауэра или диапазона различных меток." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" "Соответствие перенаправляемого трафика, использующего указанное исходящее " @@ -693,6 +803,14 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "Сопоставляет трафик с указанной DSCP-маркировкой." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Максимальное количество записей" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Максимальная длина" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -702,22 +820,22 @@ msgstr "" "пополняться на один каждый раз, когда лимит, указанный выше, не будет " "достигнут, вплоть до этого числа." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Понедельник" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Дни месяца" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "Правила NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -725,29 +843,35 @@ msgstr "" "Правила NAT позволяют точно контролировать IP-адрес источника в исходящем " "или перенаправляемом трафике." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Название" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Маска сети" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" "Применять правило только для входящих подключений на указанный IP-адрес." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Применять правило только для входящего трафика от этих MAC-адресов." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" "Применять правило только для входящего трафика от этого IP-адреса или " "диапазона адресов." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -756,28 +880,45 @@ msgstr "" "диапазона портов клиентского хоста" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Исходящее устройство" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Исходящая зона" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Исходящий трафик" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Соответствие поля пакета" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Поля пакета для сопоставления.
    Синтаксис: direction_datatype. " +"например: src_port, dest_net.
    Направления: src, dst. Типы данных: ip, port, mac, net, set.
    Префиксы " +"направления необязательны.
    *Примечание: тип данных set не " +"поддерживается в fw4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "Передаёт дополнительные аргументы таблице iptables. Используйте с " "осторожностью!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -791,12 +932,16 @@ msgstr "" "осторожностью, так как неверные значения могут привести к нарушению работы " "правил межсетевого экрана, полностью открывая доступ ко всем службам системы." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "Путь к файлу с CIDR, подсетями, IP-адресами хостов и т.д.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Перенаправление портов" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -804,69 +949,82 @@ msgstr "" "Перенаправленные портов позволяет удалённым компьютерам из Интернета " "соединяться с компьютером или службой внутри частной локальной сети." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Диапазон портов" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Протокол" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Перенаправлять трафик на указанный порт или диапазон портов внутреннего IP-" "адреса" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Перенаправлять трафик на указанный IP-адрес" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "" -"Требуется аппаратная поддержка NAT. Реализовано, по крайней мере, для mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Обращение к внешнему набору" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "Зоны отражения" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Требуется аппаратная поддержка NAT." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Использовать маскарадинг только для указанных подсетей-получателей" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Использовать маскарадинг только для указанных подсетей-отправителей" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Использовать протокол" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "IP-адрес для перезаписи" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "Перезаписать соответствующий трафик на указанный IP-адрес источника." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Перезаписать соответствующий трафик на указанный порт источника или диапазон " "портов." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Порт для перезаписи" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Маршрутизация/NAT offloading" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT — перезаписать на указанный IP-адрес источника или порт" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Суббота" @@ -883,36 +1041,36 @@ msgstr "" "Если указана маска, то изменяются только те биты, которые установлены в " "маске." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Программная реализация offloading для маршрутизации/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Программный flow offloading" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "IP-адрес источника" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "MAC-адрес источника" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Адрес источника" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Порт источника" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Зона источника" @@ -924,7 +1082,7 @@ msgstr "" "Определяет, привязывать ли это правило трафика к конкретному входящему или " "исходящему сетевому устройству." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -932,32 +1090,36 @@ msgstr "" "Определяет, использовать внешний или внутренний IP-адрес для отраженного " "трафика." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Дата начала (год-мес-день)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Время начала (чч:мм:сс)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Дата окончания (год-мес-день)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Время окончания (чч:мм:сс)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Метод хранения" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Воскресенье" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -965,14 +1127,14 @@ msgstr "" "Для правильной работы LuCI необходимо изменить существующую конфигурацию " "межсетевого экрана." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "Межсетевой экран создает зоны в вашей сети для контроля трафика." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -989,7 +1151,7 @@ msgstr "" "перенаправление из lan в wan 'не' допускает перенаправление трафика " "из wan в lan." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -1004,18 +1166,18 @@ msgstr "" "различными сетями внутри зоны. 'Использовать сети' указывает, какие " "доступные сети являются членами этой зоны." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Четверг" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Временные ограничения" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Время UTC" @@ -1023,6 +1185,10 @@ msgstr "Время UTC" msgid "Time restrictions are enabled for this rule" msgstr "Для правила включены временные ограничения" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Тайм-аут" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1037,7 +1203,7 @@ msgstr "" "%{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }}}%{dest_port?, порт %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, порт %{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Помощник отслеживания" @@ -1082,8 +1248,8 @@ msgstr "" "зонами, например, запрет трафика между некоторыми хостами или открытие WAN-" "портов маршрутизатора." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Вторник" @@ -1091,18 +1257,26 @@ msgstr "Вторник" msgid "Unable to save contents: %s" msgstr "Невозможно сохранить содержимое: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" +"Единица измерения: секунды. По умолчанию 0 означает, что запись " +"постоянно добавляется в набор.
    Максимум: 2147483 секунд." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "Неизвестный или не установленный помощник «‎%s»" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "NAT без имени" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Перенаправление без имени" @@ -1111,15 +1285,19 @@ msgstr "Перенаправление без имени" msgid "Unnamed rule" msgstr "Правило без имени" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Безымянный набор" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Зона без имени" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Нераспознанный протокол" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1129,15 +1307,21 @@ msgstr "" "типа «SNAT» будут сконвертированы в разделы «nat» и межсетевой экран будет " "перезапущен для применения и обновления конфигурации." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Использовать внешний IP-адрес" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Использовать внутренний IP-адрес" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Использовать ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1145,7 +1329,7 @@ msgstr "" "Используйте эту опцию для классификации трафика зоны по сетевым устройствам, " "управляемым не через uci." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1157,17 +1341,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Требуется верная метка брандмауэра" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Среда" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Дни недели" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "XOR метка брандмауэра" @@ -1175,109 +1359,241 @@ msgstr "XOR метка брандмауэра" msgid "XOR mark" msgstr "XOR метка" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "На вашем устройстве не работает firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "На вашем устройстве работает firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Зона ⇒ Перенаправления" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Зоны" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" +"Зоны, из которых будут создаваться правила отражения. Если значение не " +"задано, то используется только зона назначения." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "принимать" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "любой" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "любая зона" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "любой/все" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "применить метку брандмауэра" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "назначить помощника отслеживания соединений" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "автоматически" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "битовая карта" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "Битовая карта только для IPv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "день" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: IP-адрес назначения" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: MAC-адрес назначения" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: Сеть назначения" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: Порт назначения" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: ipset назначения*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "не перезаписывать" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "не отслеживать" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "не обрабатывать" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"firewall4 поддерживает ссылки и создание наборов IP-адресов для упрощения " +"согласования больших списков адресов без необходимости создавать по одному " +"правилу на каждый элемент для согласования. Диапазоны портов в наборах " +"ипсетов не поддерживаются firewall4.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "портисточника-портназначения" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "хэш" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "час" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: IP-адрес" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" +"ip[/cidr]
    Для использования с типами данных Match: *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "список" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: MAC-адрес" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macaddr|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "минута" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "net: Сеть" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "порт: Порт" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" -msgstr "отвергать" +msgstr "отклонить" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "секунда" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "набор: ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: Исходный ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: IP-адрес источника" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: MAC-адрес источника" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: (Под)сеть источника" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Исходный порт" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "это устройство" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "эта новая зона" @@ -1289,6 +1605,11 @@ msgstr "без ограничений" msgid "unspecified" msgstr "не определено" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "до 65536 записей." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "верная метка брандмауэра" diff --git a/package/luci/applications/luci-app-firewall/po/si/firewall.po b/package/luci/applications/luci-app-firewall/po/si/firewall.po index 499d655743..c097eef5ea 100644 --- a/package/luci/applications/luci-app-firewall/po/si/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/si/firewall.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2010-03-30 17:00+0200\n" "PO-Revision-Date: 2021-03-01 07:55+0000\n" "Last-Translator: HelaBasa \n" -"Language-Team: Sinhala \n" "Language: si\n" "MIME-Version: 1.0\n" @@ -35,20 +35,28 @@ msgstr "" msgid "-- add IP --" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -77,7 +85,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -92,68 +100,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "" @@ -168,24 +186,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -193,23 +216,27 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "" @@ -220,7 +247,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -232,17 +259,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "" @@ -250,72 +277,97 @@ msgstr "" msgid "Device name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "" @@ -324,11 +376,15 @@ msgstr "" msgid "Firewall - Custom Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "" @@ -336,34 +392,35 @@ msgstr "" msgid "Firewall - Traffic Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "" @@ -408,22 +465,55 @@ msgstr "" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "" @@ -431,9 +521,14 @@ msgstr "" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "" @@ -469,11 +568,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "" @@ -481,15 +584,16 @@ msgstr "" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -497,25 +601,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -531,30 +635,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -564,8 +668,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -573,7 +677,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -581,79 +685,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -662,75 +792,93 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "" @@ -744,36 +892,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "" @@ -783,51 +931,55 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "ඉරිදා" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -837,7 +989,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -846,18 +998,18 @@ msgid "" "networks
    specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "බ්‍රහස්පතින්දා" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -865,6 +1017,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -874,7 +1030,7 @@ msgid "" "ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -907,8 +1063,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "අඟහරුවාදා" @@ -916,18 +1072,24 @@ msgstr "අඟහරුවාදා" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -936,36 +1098,46 @@ msgstr "" msgid "Unnamed rule" msgstr "නම් නොකළ නීතිය" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -975,17 +1147,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "බදාදා" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "සතියේ දින" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -993,109 +1165,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "ඕනෑම" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "විනාඩිය" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "තත්පරය" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "මෙම උපාංගය" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1107,6 +1404,11 @@ msgstr "" msgid "unspecified" msgstr "නිශ්චිතව දක්වා නැත" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/sk/firewall.po b/package/luci/applications/luci-app-firewall/po/sk/firewall.po index b1b10c158c..c9835690c2 100644 --- a/package/luci/applications/luci-app-firewall/po/sk/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/sk/firewall.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-10-30 16:50+0000\n" +"PO-Revision-Date: 2023-07-10 15:50+0000\n" "Last-Translator: MaycoH \n" -"Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -46,21 +46,29 @@ msgstr "" msgid "-- add IP --" msgstr "-- pridať IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- pridať MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" "Prijať %{src?%{dest?forward:input}:output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Zabrániť prepísaniu zdroja" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -98,7 +106,7 @@ msgstr "" "%{set_mark?Assign:XOR} značka brány " "firewall %{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Automaticky prepisovať zdrojovú " @@ -119,68 +127,80 @@ msgstr "" "Odmietnuť %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Musí byť určená adresa IP na prepísanie!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" -msgstr "" +msgstr "ACCEPT - Zakázať prepis adresy" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Akcia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Rodina adries, Interná IP adresa sa musia zhodovať" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" +"Rodina adries, zdrojová adresa, cieľová adresa, prepísaná IP adresa sa musia " +"zhodovať" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Pokročilé nastavenia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Umožniť „neplatný“ prenos" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Umožniť presmerovanie zo zdrojových zón:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Umožniť presmerovanie do cieľových zón:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Nezáleží" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Akýkoľvek deň" @@ -195,24 +215,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -220,23 +245,27 @@ msgstr "" msgid "Contents have been saved." msgstr "Obsah bol uložený." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Pokračovať" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Pokryté zariadenia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Pokryté siete" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Pokryté podsiete" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Vlastné pravidlá" @@ -247,7 +276,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "Klasifikácia DSCP" @@ -259,17 +288,17 @@ msgstr "Značka DSCP" msgid "DSCP mark required" msgstr "Vyžaduje sa značka DSCP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Cieľová adresa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Cieľový port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Cieľová zóna" @@ -277,72 +306,97 @@ msgstr "Cieľová zóna" msgid "Device name" msgstr "Názov zariadenia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Zahodiť neplatné pakety" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" -msgstr "Zapnúť" +msgstr "Povoliť" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Povoliť slučku NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Povoliť ochranu pred útokom SYN-flood" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Povoliť zaznamenávanie tejto zóny" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Očakáva sa: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Experimentálna funkcia. Nie je plne kompatibilná so službami QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Vonkajšia adresa IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Vonkajší port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Argumenty navyše" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Brána Firewall" @@ -351,11 +405,15 @@ msgstr "Brána Firewall" msgid "Firewall - Custom Rules" msgstr "Brána Firewall - Vlastné pravidlá" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Brána Firewall - Pravidlá NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Brána Firewall - Presmerovanie portov" @@ -363,34 +421,35 @@ msgstr "Brána Firewall - Presmerovanie portov" msgid "Firewall - Traffic Rules" msgstr "Brána Firewall - Pravidlá prenosu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Brána Firewall - Nastavenia zón" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Migrácia konfigurácie brány Firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Presmerovanie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Piatok" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Všeobecné nastavenia" @@ -435,32 +494,70 @@ msgstr "Všeobecné nastavenia" msgid "Grant access to firewall configuration" msgstr "Udeliť prístup ku konfigurácii brány firewall" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Hardvérové odľahčenie toku" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (rozsah)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "IP sety" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IP/siete" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IP/siete/MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 a IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Iba IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Iba IPv6" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 msgid "Inbound device" +msgstr "Prichádzajúce zariadenie" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Vstup" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Vnútorná adresa IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Vnútorný port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Vnútorná zóna" @@ -496,11 +597,15 @@ msgstr "Neplatná značka DSCP" msgid "Invalid limit value" msgstr "Neplatná hodnota obmedzenia" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Obmedziť správy záznamu" @@ -508,15 +613,16 @@ msgstr "Obmedziť správy záznamu" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -524,27 +630,27 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "Obmedzenie prenosu podľa určenej frekvencie." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "Zdrojová adresa IP slučky" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Maškaráda" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" -msgstr "" +msgstr "Zhoda" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 msgid "Match DSCP" @@ -556,32 +662,32 @@ msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:248 msgid "Match device" -msgstr "" +msgstr "Zhoda zariadenia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -591,8 +697,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -600,7 +706,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -608,79 +714,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Pondelok" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Dni v mesiaci" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "Pravidlá NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Názov" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" -msgstr "" +msgstr "Odchádzajúce zariadenie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" +msgstr "Výstup" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -689,77 +821,98 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Presmerovania portov" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" +"Presmerovanie portov (port forwarding) umožňuje vzdialeným počítačom na " +"internete pripojenie k určitému počítaču alebo službe v rámci súkromnej " +"siete LAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protokol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Vyžaduje hardvérovú podporu NAT." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Obmedziť maškarádu na zadané cieľové podsiete" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Obmedziť maškarádu na zadané zdrojové podsiete" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Obmedziť na rodinu adries" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "Prepísať adresu IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "Prepísanie zhodného prenosu do určenej zdrojovej adresy IP." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Prepísanie zhodného prenosu do určeného zdrojového portu alebo rozsahu " "portov." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Prepísať port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Odľahčenie smerovania/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Prepísanie do určenej zdrojovej adresy IP alebo portu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Sobota" @@ -773,36 +926,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Softvérové odľahčenie smerovania/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Softvérové odľahčenie toku" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Zdrojová adresa IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Zdrojová adresa MAC" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Zdrojová adresa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Zdrojový port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Zdrojová zóna" @@ -812,38 +965,42 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Dátum spustenia (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Čas spustenia (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Dátum zastavenia (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Čas zastavenia (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Nedeľa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -851,7 +1008,7 @@ msgstr "" "Existujúca konfigurácia brány firewall musí byť zmenená, aby mohlo rozhranie " "LuCI fungovať správne." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -859,8 +1016,8 @@ msgstr "" "Brána firewall vytvorí zóny medzi vašimi sieťovými rozhraniami na ovládanie " "toku sieťového prenosu." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -870,7 +1027,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -879,18 +1036,18 @@ msgid "" "networks
    specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Štvrtok" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Časové obmedzenia" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Čas v UTC" @@ -898,6 +1055,10 @@ msgstr "Čas v UTC" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -907,7 +1068,7 @@ msgid "" "ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -940,8 +1101,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Utorok" @@ -949,18 +1110,24 @@ msgstr "Utorok" msgid "Unable to save contents: %s" msgstr "Nie je možné uložiť obsah: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "Nepomenované NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Nepomenované presmerovanie" @@ -969,36 +1136,46 @@ msgstr "Nepomenované presmerovanie" msgid "Unnamed rule" msgstr "Nepomenované pravidlo" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Nepomenovaná zóna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Nerozpoznaný protokol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Použiť vonkajšiu adresu IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Použiť vnútornú adresu IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1008,17 +1185,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Streda" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Dni v týždni" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "Značka XOR brány firewall" @@ -1026,109 +1203,234 @@ msgstr "Značka XOR brány firewall" msgid "XOR mark" msgstr "Značka XOR" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zóna ⇒ Presmerovania" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zóny" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "prijať" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "nezáleží" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "akákoľvek zóna" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "deň" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "neprepísať" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "nesledovať" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "zahodiť" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "hodinu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "minútu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "zamietnuť" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "sekundu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "toto zariadenie" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "táto nová zóna" @@ -1140,6 +1442,11 @@ msgstr "bez obmedzenia" msgid "unspecified" msgstr "neurčené" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/sv/firewall.po b/package/luci/applications/luci-app-firewall/po/sv/firewall.po index 5f9e259508..e8a9d1be9b 100644 --- a/package/luci/applications/luci-app-firewall/po/sv/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/sv/firewall.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2020-09-23 14:41+0000\n" -"Last-Translator: Kristoffer Grundström \n" -"Language-Team: Swedish \n" +"Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 5.0.2\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -33,10 +33,18 @@ msgstr "" msgid "-- add IP --" msgstr "-- lägg till IP-adress --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- lägg till MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -44,11 +52,11 @@ msgstr "" "Acceptera %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -84,7 +92,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Skriv om källans IP-adress automatiskt" @@ -103,68 +111,78 @@ msgid "" msgstr "" "Neka %{src?%{dest?forward:input}:output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Åtgärd" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Avancerade inställningar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Tillåt \"ogiltig\" trafik" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Tillåt vidarebefordring från källzonerna:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Till vidarebefordring till destinationszonerna::" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Något" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Vilken dag som helst" @@ -179,24 +197,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Inställningar för Conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Conntrack-hjälpare" @@ -204,23 +227,27 @@ msgstr "Conntrack-hjälpare" msgid "Contents have been saved." msgstr "Innehåll har sparats." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Fortsätt" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Täckta enheter" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Nätverk som omfattas" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Anpassade regler" @@ -231,7 +258,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "DSCP-klassificering" @@ -243,17 +270,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Destinationens adress" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Destinationsport" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Destinationens zon" @@ -261,72 +288,97 @@ msgstr "Destinationens zon" msgid "Device name" msgstr "Enhetens namn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Släpp ogiltiga paket" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Aktivera" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Aktivera loggning i den här zonen" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Förväntade: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Experimentell funktion. Inte fullt kompatibel med QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Extern IP-adress" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Extern port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Extra argument" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Brandvägg" @@ -335,11 +387,15 @@ msgstr "Brandvägg" msgid "Firewall - Custom Rules" msgstr "Brandvägg - Anpassade regler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Brandvägg - NAT-regler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Brandvägg - Vidarebefordring av port" @@ -347,39 +403,35 @@ msgstr "Brandvägg - Vidarebefordring av port" msgid "Firewall - Traffic Rules" msgstr "Brandvägg - Trafikregler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Brandvägg - Zoninställningar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Vidarebefordra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Vidarebefordrade IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark." -"val}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Fredag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Generella inställningar" @@ -429,22 +481,55 @@ msgstr "Generella inställningar" msgid "Grant access to firewall configuration" msgstr "Tillåt åtkomst till brandväggskonfigurationen" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 och IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Endast IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Endast IPv6" @@ -452,9 +537,14 @@ msgstr "Endast IPv6" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Inmatning" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Intern IP-adress" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Intern port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Intern zon" @@ -490,11 +584,15 @@ msgstr "" msgid "Invalid limit value" msgstr "Ogiltigt gränsvärde" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Begränsa loggmeddelanden" @@ -502,15 +600,16 @@ msgstr "Begränsa loggmeddelanden" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -518,25 +617,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Maskering" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Matcha" @@ -552,30 +651,30 @@ msgstr "Matchar ICMP-typ" msgid "Match device" msgstr "Matcha enhet" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -587,8 +686,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -596,7 +695,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -604,80 +703,106 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Måndag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Dagar i månaden" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "NAT-regler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Namn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Matcha endast inkommande trafik från de här MAC-adresserna." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" "Matcha endast inkommande trafik från den här IP-adressen eller räckvidden." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Utmatning" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -686,75 +811,93 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Vidarebefordringar av port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protokoll" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "Kräver hårdvarustöd för NAT. Implementerad åtminstone för mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Kräver hårdvarustöd för NAT." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Begränsa till adressfamilj" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "Skriv om IP-adress" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Skriv om port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Skriv om till specifik IP-källa eller port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Lördag" @@ -768,36 +911,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "IP-adress för källa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "MAC-adress för källa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Adress för källkod" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Käll-port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "" @@ -807,38 +950,42 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Startdatum (åååå-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Starttid (tt.mm.ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Stopptid (åååå-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Stopptid (tt.mm.ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Söndag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -846,14 +993,14 @@ msgstr "" "Den befintliga brandväggskonfigurationen behöver ändras för att LuCi ska " "fungera som det ska." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -863,7 +1010,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -872,18 +1019,18 @@ msgid "" "networks specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Torsdag" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Tidsbegränsningar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Tid enligt UTC" @@ -891,6 +1038,10 @@ msgstr "Tid enligt UTC" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -900,7 +1051,7 @@ msgid "" "ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -933,8 +1084,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Tisdag" @@ -942,18 +1093,24 @@ msgstr "Tisdag" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "NAT utan namn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -962,36 +1119,46 @@ msgstr "" msgid "Unnamed rule" msgstr "Regel utan namn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Zon utan namn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Använd en extern IP-adress" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Använd en intern IP-adress" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1001,17 +1168,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Onsdag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Veckodagar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -1019,109 +1186,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Zon ⇒ Vidarebefordringar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Zoner" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "acceptera" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "något" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "alla zoner" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "tilldela conntrack-hjälpare" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "dag" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "skriv inte om" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "spåra inte" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "släpp" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "timme" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "minut" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "neka" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "sekund" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "den här enheten" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "den här nya zonen" @@ -1133,6 +1425,11 @@ msgstr "obegränsad" msgid "unspecified" msgstr "ospecificerad" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/templates/firewall.pot b/package/luci/applications/luci-app-firewall/po/templates/firewall.pot index dac7da52e4..be4d456dd7 100644 --- a/package/luci/applications/luci-app-firewall/po/templates/firewall.pot +++ b/package/luci/applications/luci-app-firewall/po/templates/firewall.pot @@ -22,20 +22,28 @@ msgstr "" msgid "-- add IP --" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -64,7 +72,7 @@ msgid "" "%{set_mark?:%{set_xmark}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" @@ -79,68 +87,78 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "" @@ -155,24 +173,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" @@ -180,23 +203,27 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "" @@ -207,7 +234,7 @@ msgid "" "each firewall restart, right after the default ruleset has been loaded." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "" @@ -219,17 +246,17 @@ msgstr "" msgid "DSCP mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "" @@ -237,72 +264,97 @@ msgstr "" msgid "Device name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "" @@ -311,11 +363,15 @@ msgstr "" msgid "Firewall - Custom Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "" @@ -323,34 +379,35 @@ msgstr "" msgid "Firewall - Traffic Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "" @@ -395,22 +452,55 @@ msgstr "" msgid "Grant access to firewall configuration" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "" @@ -418,9 +508,14 @@ msgstr "" msgid "Inbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "" @@ -456,11 +555,15 @@ msgstr "" msgid "Invalid limit value" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "" @@ -468,15 +571,16 @@ msgstr "" msgid "Limit matching" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "" @@ -484,25 +588,25 @@ msgstr "" msgid "Limits traffic matching to the specified rate." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "" @@ -518,30 +622,30 @@ msgstr "" msgid "Match device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -551,8 +655,8 @@ msgstr "" msgid "Match mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" @@ -560,7 +664,7 @@ msgstr "" msgid "Matches a specific firewall mark or a range of different marks." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" @@ -568,79 +672,105 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -649,75 +779,93 @@ msgid "" "all services." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "" @@ -731,36 +879,36 @@ msgid "" "If a mask is specified then only those bits set in the mask are modified." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "" @@ -770,51 +918,55 @@ msgid "" "network device." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -824,7 +976,7 @@ msgid "" "not imply a permission to forward from wan to lan as well." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -833,18 +985,18 @@ msgid "" "networks specifies which available networks are members of this zone." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "" @@ -852,6 +1004,10 @@ msgstr "" msgid "Time restrictions are enabled for this rule" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -861,7 +1017,7 @@ msgid "" "ival}
    }}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "" @@ -894,8 +1050,8 @@ msgid "" "the router." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "" @@ -903,18 +1059,24 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "" @@ -923,36 +1085,46 @@ msgstr "" msgid "Unnamed rule" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -962,17 +1134,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "" @@ -980,109 +1152,234 @@ msgstr "" msgid "XOR mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "" @@ -1094,6 +1391,11 @@ msgstr "" msgid "unspecified" msgstr "" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/tr/firewall.po b/package/luci/applications/luci-app-firewall/po/tr/firewall.po index f1abd5103d..ebff9784a2 100644 --- a/package/luci/applications/luci-app-firewall/po/tr/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/tr/firewall.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-05-18 05:32+0000\n" +"PO-Revision-Date: 2023-10-29 19:41+0000\n" "Last-Translator: semih \n" -"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -47,10 +47,18 @@ msgstr "" msgid "-- add IP --" msgstr "IP ekle" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "MAC ekle" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -58,12 +66,12 @@ msgstr "" "KABUL ET %{src?%{dest?forward:input}:" "output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "" "Kaynağın yeniden yazılmasını engelle" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -101,7 +109,7 @@ msgstr "" "%{set_mark?Ata:XOR} güvenlik duvarı işareti " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Kaynak IP'siniOtomatik olarak yeniden yazREDDET %{src?%{dest?forward:input}:output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -129,23 +137,23 @@ msgstr "" "Statik olarak yeniden yaz kaynağa " "%{snat_ip?IP %{snat_ip}} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Yeniden yazmak için bir IP belirtilmek zorunda!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "KABUL ET - Adres yeniden yazmayı devre dışı bırak" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Eylem" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -155,7 +163,7 @@ msgstr "" "değişkenleri, ör. Yalnızca giden HTTPS trafiğini eşleştirmek için -p " "tcp --dport 443." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -164,33 +172,45 @@ msgstr "" "değişkenleri, ör. Yalnızca gelen HTTPS trafiğini eşleştirmek için -p " "tcp --sport 443." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Adres ailesi, Dahili IP adresi eşleşmelidir" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" +"Adres ailesi, kaynak adresi, hedef adresi, yeniden yazılan IP adresi " +"eşleşmelidir" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Gelişmiş Ayarlar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "\"Geçersiz\" trafiğe izin ver" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Kaynak bölgelerden gelen yönlendirmeye izin ver" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr " Hedef bölgelerden gelen yönlendirmeye izin ver" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Herhangi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Herhangi bir gün" @@ -208,26 +228,31 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "Verilen DSCP sınıfını veya değerini kurulan bağlantılara uygulayın." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "Belirtilen bağlantı izleme yardımcısını eşleşen trafiğe atayın." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Otomatik yardımcı atama" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" "Trafik protokolü ve bağlantı noktasına göre bağlantı yardımcılarını otomatik " "olarak atayın" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Yorum" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Conntrack Ayarları" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Conntrack yardımcıları" @@ -235,23 +260,27 @@ msgstr "Conntrack yardımcıları" msgid "Contents have been saved." msgstr "İçerik kaydedildi." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "Devam et" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Sayaçlar" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "Kapsanan cihazlar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "Kapsanan ağlar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "Kapsanan alt ağlar" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "Özel Ayarlar" @@ -266,7 +295,7 @@ msgstr "" "her güvenlik duvarı yeniden başlatıldıktan sonra, varsayılan kural seti " "yüklendikten hemen sonra yürütülür." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "DSCP sınıflandırması" @@ -278,17 +307,17 @@ msgstr "DSCP işareti" msgid "DSCP mark required" msgstr "DSCP işareti gerekli" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "Hedef adres" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "Hedef bağlantı noktası" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "Hedef bölge" @@ -296,7 +325,7 @@ msgstr "Hedef bölge" msgid "Device name" msgstr "Cihaz adı" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -305,67 +334,97 @@ msgstr "" "fazladan kurallar yüklemeyin. Bu, karmaşık asimetrik yol kurulumları için " "gerekli olabilir." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Geçersiz paketleri düşür" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Etkinleştir" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "NAT Döngü sınamasını etkinleştir" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "SYN-flood korumasını etkinleştir" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Bu bölgede günlük kaydetmeyi etkinleştir" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Bu bölgedeki giden trafik için ağ adresini ve bağlantı noktası çevirisi " +"IPv4'ü (NAT4 veya NAPT4) etkinleştirin. Bu genellikle wan " +"bölgesinde etkinleştirilir." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" +"Bu bölgedeki giden trafik için ağ adresini ve bağlantı noktası çevirisi " +"IPv6'yı (NAT6 veya NAPT6) etkinleştir." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Etkinleştirilmiş" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "Küme için paket ve bayt sayısı takibini etkinleştirir." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Beklenen: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Deneysel özellik. QoS/SQM ile tam uyumlu değildir." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" "Bölge trafiği için izin verilen bağlantı izleme yardımcılarını açıkça seçer" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Harici IP adresi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Harici port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Ekstra argümanlar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Ekstra hedef argümanlar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Ekstra iptables argümanları" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Ekstra kaynak argümanlar" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Aile" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Güvenlik Duvarı" @@ -374,11 +433,15 @@ msgstr "Güvenlik Duvarı" msgid "Firewall - Custom Rules" msgstr "Güvenlik duvarı - Özel Kurallar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Güvenlik Duvarı - IP setleri" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Güvenlik duvarı - NAT Kuralları" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Güvelik duvarı - Port Yönlendirme" @@ -386,39 +449,41 @@ msgstr "Güvelik duvarı - Port Yönlendirme" msgid "Firewall - Traffic Rules" msgstr "Güvenlik duvarı - Trafik Kuralları" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Güvenlik duvarı - Bölge Ayarları" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Güvenlik duvarı yapılandırma geçişi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Yönlendir" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Yönlendirilen IPv4 %{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, işaretle %{mark.val}}" - -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +"İletilen %{ipv6?%{ipv4?IPv4 ve IPv6:IPv6}:" +"IPv4}%{proto? , protokol %{proto#%{sonraki?, >%{item.name}}%{mark?, mark %{mark.val}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "Cuma" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Genel Ayarlar" @@ -484,22 +549,55 @@ msgstr "Genel Ayarlar" msgid "Grant access to firewall configuration" msgstr "Güvenlik duvarı yapılandırmasına erişim ver" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Donanım akış boşaltma" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (aralık)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "IP Setleri" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IP'ler/Ağlar" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IP'ler/Ağlar/MAC'ler" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 ve IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Yalnızca IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "IPv6 Maskeleme" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Yalnızca IPv6" @@ -507,9 +605,14 @@ msgstr "Yalnızca IPv6" msgid "Inbound device" msgstr "Gelen cihaz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Dosyayı İçer" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Gelen IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}Türlerle ICMP " -"%{item.types#%{next?, }%{item}}:%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, yardımcı %{helper.inv?%{helper.val}:%{helper.val}}}" +"Gelen %{ipv6?%{ipv4?IPv4 ve IPv6:IPv6}:" +"IPv4}%{proto? , protokol %{proto#%{sonraki?, }%{item.types?%{item.name>% " +"türleriyle ICMP {item.types#%{sonraki?, >%{item:" +"%{item.name}}}%{ mark?, mark %{mark.val}%{helper?, " +"helper %{helper.inv?%{helper.val dışındaki herhangi bir yardımcıyla eşleştir:%{helper.val} }}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "İlk Hash Boyutu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Giriş" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Dahili IP adresi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "İç bağlantı noktası" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "İç bölge" @@ -555,11 +663,15 @@ msgstr "Geçersiz DSCP işareti" msgid "Invalid limit value" msgstr "Geçersiz sınır değeri" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "Geçersiz küme adı" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Sınır patlaması" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Günlük mesajlarını sınırla" @@ -567,9 +679,9 @@ msgstr "Günlük mesajlarını sınırla" msgid "Limit matching" msgstr "Eşlemeyi sınırla" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -577,7 +689,8 @@ msgstr "" "Eşleşmeyi bununla sınırla %{limit.num} packets per %{limit." "unit}%{limit.burst? burst %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Sınırlı maskeleme etkin" @@ -585,25 +698,25 @@ msgstr "Sınırlı maskeleme etkin" msgid "Limits traffic matching to the specified rate." msgstr "Belirtilen oranla eşleşen trafiği sınırlar." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "Geri döngü kaynak IP'si" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASQUERADE - Giden arayüz IP'sine otomatik olarak yeniden yaz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSS bağlama" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Maskeleme" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Eşleştir" @@ -619,34 +732,34 @@ msgstr "ICMP tipiyle eşleş" msgid "Match device" msgstr "Cihazı eşleştir" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "Verilen IP adresine yönlendirilen trafiği eşleştirin." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "Verilen hedef, bağlantı noktası veya bağlantı noktası aralığına " "yönlendirilen iletilen trafiği eşleştirin." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "Bu IP veya aralıktan yönlendirilen trafiği eşleştirin." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "Verilen kaynak bağlantı noktasından veya bağlantı noktası aralığından gelen " "iletilen trafiği eşleştirin." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "Yardımcıyı eşleştir" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -658,8 +771,8 @@ msgstr "" msgid "Match mark" msgstr "İşaretleri eşleştir" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "Belirtilen bağlantı izleme yardımcısını kullanarak trafiği eşleştirin." @@ -668,7 +781,7 @@ msgid "Matches a specific firewall mark or a range of different marks." msgstr "" "Belirli bir güvenlik duvarı işaretiyle veya bir dizi farklı işaretle eşleşir." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "Belirtilen giden ağ cihazını kullanarak iletilen trafiği eşleştirir." @@ -676,6 +789,14 @@ msgstr "Belirtilen giden ağ cihazını kullanarak iletilen trafiği eşleştiri msgid "Matches traffic carrying the specified DSCP marking." msgstr "Belirtilen DSCP işaretini taşıyan trafikle eşleşir." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Maks Girişler" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Azami Uzunluk" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -684,22 +805,22 @@ msgstr "" "Eşleşecek maksimum ilk paket sayısı: Bu sayı, bu sayıya kadar yukarıda " "belirtilen sınıra her ulaşılmadığında bir kez yeniden doldurulur." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Pazartesi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Ayın Günleri" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "NAT Kuralları" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -707,26 +828,32 @@ msgstr "" "NAT kuralları, giden veya iletilen trafik için kullanmak üzere kaynak IP " "üzerinde ayrıntılı denetime izin verir." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Ad" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Netmask" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Yalnızca verilen IP adresine yönlendirilen gelen trafiği eşleştirin." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Yalnızca bu MAC'lardan gelen trafiği eşleştirin." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Yalnızca bu IP veya aralıktan gelen trafiği eşleştirin." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -735,26 +862,43 @@ msgstr "" "bağlantı noktası aralığından gelen trafiği eşleştirin" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Giden cihaz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Giden bölge" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Çıkış" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Paket Alan Eşleşmesi" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Eşleşecek paket alanları.
    Sözdizimi: direction_datatype. " +"örneğin: src_port, dest_net.
    Yol tarifleri: src, " +"dst. Veri türleri: ip, port, mac, net, set.
    Yön " +"önekleri isteğe bağlıdır.
    *Not: set veri türü fw4'te " +"desteklenmez." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "İptables'a ek argümanlar iletir. Dikkatli kullanın!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -768,12 +912,17 @@ msgstr "" "bozabileceğinden ve tüm hizmetleri tamamen açığa çıkarabileceğinden, bu " "seçenekler son derece dikkatli kullanılmalıdır." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" +"CIDR'lerin, alt ağların, ana bilgisayar IP'lerinin vb. dosyasının yolu.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Port Yönlendirmeleri" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -781,68 +930,82 @@ msgstr "" "Bağlantı noktası yönlendirme, İnternet üzerindeki uzak bilgisayarların özel " "LAN içindeki belirli bir bilgisayara veya hizmete bağlanmasına izin verir." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Bağlantı noktası aralığı" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Protokol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Gelen trafiği dahili ana bilgisayardaki belirli bağlantı noktasına " "yönlendirin" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Gelen trafiği belirtilen dahili ana bilgisayara yönlendirin" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "Donanımsal NAT desteği gerektirir. En az mt7621 için uygulanabilir" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Harici Sete Bakın" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "Yansıma bölgeleri" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Donanımsal NAT desteği gerektirir." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Maskelendirmeyi verilen hedef alt ağlarla sınırla" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Maskelemeyi verilen kaynak alt ağlarla kısıtla" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Adres ailesiyle sınırla" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "IP adresini yeniden yaz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "Eşleşen trafiği belirtilen kaynak IP adresine yeniden yazın." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Eşleşen trafiği belirtilen kaynak bağlantı noktasına veya bağlantı noktası " "aralığına yeniden yazın." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Bağlantı noktasını yeniden yaz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Yönlendirme / NAT Aktarımı" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Belirli bir kaynak IP'sine veya bağlantı noktasına yeniden yaz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Cumartesi" @@ -858,36 +1021,36 @@ msgstr "" "Kurulan bağlantılarda verilen işaret değerini ayarlayın. Biçim değerdir [/" "mask]. Bir maske belirtilirse, sadece maskede ayarlanan bitler değiştirilir." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Yazılım tabanlı boşaltma, yönlendirme/NAT için" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Yazılım tabanlı akış boşaltma" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Kaynak IP Adresi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "Kaynak MAC adresi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Kaynak adresi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Kaynak portu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Kaynak bölgesi" @@ -899,7 +1062,7 @@ msgstr "" "Bu trafik kuralının belirli bir gelen veya giden ağ cihazına bağlanıp " "bağlanmayacağını belirtir." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -907,32 +1070,36 @@ msgstr "" "Yansıtılan trafik için harici veya dahili IP adresinin kullanılıp " "kullanılmayacağını belirtir." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Başlangıç Tarihi (yyyy-aa-gg)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Başlangıç Zamanı (sa.dd.sn)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Bitiş Tarihi (yyyy-aa-gg)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Durdurma Zamanı (sa.dd.sn)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Depolama Yöntemi" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Pazar" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -940,7 +1107,7 @@ msgstr "" "LuCI'nin düzgün çalışması için mevcut güvenlik duvarı yapılandırmasının " "değiştirilmesi gerekir." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -948,8 +1115,8 @@ msgstr "" "Güvenlik duvarı, ağ trafiği akışını kontrol etmek için ağ arayüzleriniz " "üzerinde bölgeler oluşturur." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -965,7 +1132,7 @@ msgstr "" "%q
    . İletim kuralı tek yönlüdür,Örneğin. lan'dan wan'a " "yönlendirme, wan'dan lan'a yönlendirme izni anlamına gelmez." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -979,18 +1146,18 @@ msgstr "" "yönlendirilen trafik için politikayı açıklar bölge içinde. Kapsanan ağla " ", hangi kullanılabilir ağların bu bölgenin üyesi olduğunu belirtir." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Perşembe" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Zaman Kısıtlamaları" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "UTC Zamanı" @@ -998,6 +1165,10 @@ msgstr "UTC Zamanı" msgid "Time restrictions are enabled for this rule" msgstr "Bu kural için zaman kısıtlamaları etkinleştirildi" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Zaman aşımı" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1012,7 +1183,7 @@ msgstr "" "%{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item." "ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}%{item." "ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "İzleme yardımcısı" @@ -1059,8 +1230,8 @@ msgstr "" "reddetmek veya yönlendiricide WAN bağlantı noktalarını açmak gibi farklı " "bölgeler arasında seyahat eden paketler için politikalar tanımlar." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Salı" @@ -1068,18 +1239,26 @@ msgstr "Salı" msgid "Unable to save contents: %s" msgstr "İçerik kaydedilemiyor: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" +"Birim: saniye. Varsayılan 0, girişin sete kalıcı olarak " +"eklendiği anlamına gelir.
    Maks: 2147483 saniye." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "Bilinmeyen veya yüklenmemiş bağlantı yolu yardımcısı \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "İsimsiz NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "İsimsiz yönlendirme" @@ -1088,15 +1267,19 @@ msgstr "İsimsiz yönlendirme" msgid "Unnamed rule" msgstr "İsimsiz kural" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Adsız küme" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "İsimsiz bölge" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Bilinmeyen protokol" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1106,15 +1289,21 @@ msgstr "" "bölümleri \"nat\" bölümlerine dönüştürülecek ve güncellenmiş yapılandırmayı " "uygulamak için güvenlik duvarı yeniden başlatılacaktır." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Harici bir IP adresi kullan" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Dahili bir IP adresi kullan" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "ipset'i kullan" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1122,7 +1311,7 @@ msgstr "" "Bölge trafiğini ham, uci yönetilmeyen ağ cihazlarına göre " "sınıflandırmak için bu seçeneği kullanın." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1134,17 +1323,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Geçerli güvenlik duvarı işareti gerekli" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Çarşamba" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Hafta içi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "XOR güvenlik duvarı işareti" @@ -1152,109 +1341,241 @@ msgstr "XOR güvenlik duvarı işareti" msgid "XOR mark" msgstr "XOR işareti" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "Cihazınız firewall4'ü çalıştırmıyor." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "Cihazınız firewall4'ü çalıştırıyor." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Bölge ⇒ Yönlendirmeler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Bölgeler" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" +"Yansıma kurallarının oluşturulacağı bölgeler. Ayarlanmadığı takdirde " +"yalnızca hedef bölge kullanılır." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "kabul et" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "herhangi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "herhangi bir bölge" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "herhangi biri/hepsi" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "güvenlik duvarı işaretini uygula" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "bağlantı yardımcısı atama" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "otomatik" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bitmap" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "bitmap yalnızca ipv4'tür" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "gün" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: Hedef IP'si" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: Hedef MAC adresi" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: Hedef (alt)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: Hedef Bağlantı Noktası" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: Hedef ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "yeniden yazma" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "izleme" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "düşür" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"Firewall4, eşleşecek öğe başına bir kural oluşturmaya gerek kalmadan büyük " +"adres listelerinin eşleştirilmesini kolaylaştırmak için IP kümelerine " +"referans vermeyi ve oluşturmayı destekler. ipset'lerdeki bağlantı noktası " +"aralıkları güvenlik duvarı4 tarafından desteklenmez.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "fromport-toport" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "hash" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "saat" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: IP adresi" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" +"ip[/cidr]
    Eşleştirme veri türleriyle kullanım için: *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "liste" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: MAC adresi" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macaddr|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "dakika" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "net: (alt)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "port: Port" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "reddet" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "ikinci" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set: ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: Kaynak ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: Kaynak IP'si" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: Kaynak MAC adresi" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: Kaynak (alt)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Kaynak Bağlantı Noktası" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "bu cihaz" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "bu yeni bölge" @@ -1266,6 +1587,11 @@ msgstr "sınırsız" msgid "unspecified" msgstr "belirtilmemiş" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "65536 girişe kadar." + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "geçerli güvenlik duvarı işareti" diff --git a/package/luci/applications/luci-app-firewall/po/uk/firewall.po b/package/luci/applications/luci-app-firewall/po/uk/firewall.po index 72ab7848d8..bd6318570a 100644 --- a/package/luci/applications/luci-app-firewall/po/uk/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/uk/firewall.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2022-04-18 16:53+0000\n" "Last-Translator: Vladdrako \n" -"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -47,10 +47,18 @@ msgstr "" msgid "-- add IP --" msgstr "-- додати IP-адресу --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- додати MAC-адресу --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" @@ -58,11 +66,11 @@ msgstr "" "Приймати %{src?%{dest?переспрямований:" "вхідний}:вихідний} трафік" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "Запобігати перезапису джерела" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -102,7 +110,7 @@ msgstr "" "%{set_mark?Призначити мітку:XOR мітки} " "брандмауера %{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "" "Автоматично перезаписувати IP-адресу " @@ -123,7 +131,7 @@ msgstr "" "Відхиляти %{src?%{dest?переспрямований:" "вхідний}:вихідний} трафік" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -132,23 +140,23 @@ msgstr "" "джерела на %{snat_ip}} %{snat_port?порт джерела на " "%{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "Потрібно вказати IP-адресу для перезапису!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "ACCEPT — Вимкнути перезапис адреси" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Дія" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -158,7 +166,7 @@ msgstr "" "призначення зони, наприклад, -p tcp --dport 443, щоб зіставляти " "лише вихідний трафік HTTPS." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -167,33 +175,43 @@ msgstr "" "зони, наприклад, -p tcp --sport 443, щоб зіставляти лише " "вхідний трафік HTTPS." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Додаткові налаштування" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "Дозволити \"неправильний\" трафік" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "Дозволити переспрямовування від зон джерела:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "Дозволити переспрямовування до зон призначення:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "Будь-який" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "Будь-який день" @@ -211,17 +229,17 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "Застосувати заданий клас або значення DSCP до встановлених з'єднань." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "" "Призначити вказаного помічника відслідковування з'єднань для відповідного " "трафіку." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "Автоматичне призначення помічника" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" @@ -229,13 +247,18 @@ msgstr "" "title=\"Connection tracking\">Conntrack
    ) на підставі протоколу та " "порту трафіку" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "" "Параметри відслідковування з'єднань (Conntrack)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "" "Помічники відслідковування з'єднань (invalid. This may be required for complex asymmetric route setups." @@ -315,68 +342,93 @@ msgstr "" "зі станом відслідковування з'єднань invalid. Це може знадобитися " "для складних налаштувань асиметричного маршруту." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Відхиляти помилкові пакети" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "Увімкнути" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "Увімкнути NAT Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "Увімкнути захист від SYN-flood" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "Увімкнути реєстрування у цій зоні" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "Очікується: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "Експериментальна функція. Не повністю сумісно з QoS / SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" "В явному вигляді дозволені помічники відслідковування з'єднань для трафіку " "зони" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "Зовнішня IP-адреса" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "Зовнішній порт" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "Додаткові аргументи" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "Додаткові аргументи для призначення" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "Додаткові аргументи iptables" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "Додаткові аргументи для джерела" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "Брандмауер" @@ -385,11 +437,15 @@ msgstr "Брандмауер" msgid "Firewall - Custom Rules" msgstr "Брандмауер — Настроювані правила" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "Брандмауер — Правила NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "Брандмауер — Переспрямовування портів" @@ -397,39 +453,35 @@ msgstr "Брандмауер — Переспрямовування портів msgid "Firewall - Traffic Rules" msgstr "Брандмауер — Правила трафіку" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "Брандмауер — Параметри зон" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "Переміщення конфігурації брандмауера" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "Переспрямовування" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"Переспрямовування IPv4%{proto?, протокол %{proto#%{next?, }%{item.name}" -"}}%{mark?, позначка %{mark.val}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "П'ятниця" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "Загальні налаштування" @@ -495,22 +547,55 @@ msgstr "Загальні налаштування" msgid "Grant access to firewall configuration" msgstr "Надати доступ до конфігурування брандмауера" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "Апаратні засоби розвантаження потоку" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 та IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "Лише IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "Лише IPv6" @@ -518,9 +603,14 @@ msgstr "Лише IPv6" msgid "Inbound device" msgstr "Вхідний пристрій" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"Вхідний IPv4%{proto?, протокол %{proto#%{next?, }%{item.types?%{item.name}ICMP " -"із типами %{item.types#%{next?, }%{item}}:" -"%{item.name}}}}%{mark?, позначка %{mark.val}}%{helper?, помічник %{helper.inv?%{helper.val}:%{helper.val}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Вхідний трафік" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "Внутрішня IP-адреса" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "Внутрішній порт" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "Внутрішня зона" @@ -566,11 +650,15 @@ msgstr "Неприпустима позначка DHCP" msgid "Invalid limit value" msgstr "Неприпустиме значення обмеження" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "Обмеження блоку" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "Обмеження повідомлень журналу" @@ -578,9 +666,9 @@ msgstr "Обмеження повідомлень журналу" msgid "Limit matching" msgstr "Обмеження зіставляння" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -588,7 +676,8 @@ msgstr "" "Обмеження зіставляння до %{limit.num} пакетів на %{limit." "unit}%{limit.burst? блок %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "Увімкнено обмежене маскування" @@ -596,26 +685,26 @@ msgstr "Увімкнено обмежене маскування" msgid "Limits traffic matching to the specified rate." msgstr "Обмеження зіставляння трафіку із вказаною швидкістю." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "IP-адреса джерела зворотної петлі" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "" "MASQUERADE - Автоматично переписувати на IP-адресу вихідного інтерфейсу" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "Обмежування MSS" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "Підміна" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "Зіставляти" @@ -631,35 +720,35 @@ msgstr "Зіставляти ICMP типу" msgid "Match device" msgstr "Зіставляти пристрою" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "" "Зіставляння переспрямованого трафіку, спрямованого на вказану IP-адресу." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" "Зіставляння переспрямованого трафіку, спрямованого на вказаний порт " "призначення або діапазон портів." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "Зіставляння переспрямованого трафіку від цієї IP-адреси або діапазону." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" "Зіставляння переспрямованого трафіку, що походить із заданого порту джерела " "або діапазону портів." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "Зіставляти помічнику" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -671,8 +760,8 @@ msgstr "" msgid "Match mark" msgstr "Зіставляти позначці" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "" "Зіставляти трафік за допомогою вказаного помічника відслідковування з'єднань." @@ -682,7 +771,7 @@ msgid "Matches a specific firewall mark or a range of different marks." msgstr "" "Зіставляти вказаній позначці брандмауера або діапазону різних позначок." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "" "Зіставляння переспрямованого трафіку за допомогою вказаного вихідного " @@ -692,6 +781,14 @@ msgstr "" msgid "Matches traffic carrying the specified DSCP marking." msgstr "Зіставляти трафік із вказаною позначкою DSCP." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -701,22 +798,22 @@ msgstr "" "збільшується на одиницю щоразу, коли вказане вище обмеження не досягнуто, аж " "до цього числа." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "Понеділок" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "Дні місяця" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "Правила NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." @@ -724,26 +821,32 @@ msgstr "" "Правила NAT дозволяють тонко контролювати IP-адресу джерела, що " "використовується для вихідного чи переспрямованого трафіку." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "Назва" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "Зіставляти тільки вхідний трафік, спрямований на вказану IP-адресу." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "Зіставляти тільки вхідний трафік від цих MAC-адрес." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "Зіставляти тільки вхідний трафік від цього IP чи діапазону." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" @@ -752,27 +855,39 @@ msgstr "" "діапазоні портів вузла клієнта" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "Вихідний пристрій" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "Вихідна зона" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Вихідний трафік" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "Передавання додаткових аргументів для IPTables. Використовуйте з обережністю!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -786,12 +901,16 @@ msgstr "" "особливою обережністю, оскільки невірні значення можуть призвести до " "порушення набору правил брандмауера, повністю відкриваючи всі служби." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "Переспрямовування портів" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." @@ -799,66 +918,80 @@ msgstr "" "Переспрямовування портів дозволяє віддаленим комп'ютерам з Інтернету " "підключатися до певного комп'ютера або служби у приватній мережі." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Протокол" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "" "Переспрямувати відповідний вхідний трафік на заданий порт внутрішнього вузла" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Переспрямувати відповідний вхідний трафік на заданий внутрішній вузол" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "Необхідна апаратна підтримка NAT. Упроваджено принаймні для mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Необхідна апаратна підтримка NAT." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "Обмежити підміну заданими підмережами призначення" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "Обмежити підміну заданими підмережами джерела" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "Обмежити сімейство протоколів" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "IP-адреса для перезапису" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "Перезаписати відповідний трафік на вказану IP-адресу джерела." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "" "Перезаписати відповідний трафік на вказаний порт джерела або діапазон портів." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "Порт для перезапису" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "Розвантаження маршрутизації/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - Перезаписати на вказану IP-адресу джерела або порт" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "Субота" @@ -875,36 +1008,36 @@ msgstr "" "значення[/маска]. Якщо вказано маску, то змінюються лише ті біти, які " "встановлені в масці." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "Програмне розвантаження для маршрутизації/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "Програмне розвантаження потоку" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "IP-адреса джерела" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "MAC-адреса джерела" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "Адреса джерела" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "Порт джерела" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "Зона джерела" @@ -916,7 +1049,7 @@ msgstr "" "Визначає, чи слід прив'язувати це правило трафіку до певного вхідного або " "вихідного мережевого пристрою." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." @@ -924,32 +1057,36 @@ msgstr "" "Визначає, чи використовувати зовнішню або внутрішню IP-адресу для відбитого " "трафіку." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "Дата початку (рррр-мм-дд)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "Час початку (гг:хх:сс)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "Дата зупинки (рррр-мм-дд)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "Час зупинки (гг:хх:сс)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "Неділя" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." @@ -957,7 +1094,7 @@ msgstr "" "Для належного функціонування LuCI потрібно змінити існуючу конфігурацію " "брандмауера." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -965,8 +1102,8 @@ msgstr "" "Брандмауер створює зони поверх ваших мережевих інтерфейсів для управління " "потоком мережевого трафіку." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -983,7 +1120,7 @@ msgstr "" "від LAN до WAN не означає, що є також дозвіл спрямовувати від WAN " "до LAN." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -997,18 +1134,18 @@ msgstr "" "спрямовування трафіку між різними мережами в межах зони. Пункт Покриті " "мережі визначає, які доступні мережі є членами цієї зони." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "Четвер" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "Часові обмеження" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "Час в UTC" @@ -1016,6 +1153,10 @@ msgstr "Час в UTC" msgid "Time restrictions are enabled for this rule" msgstr "Для цього правила ввімкнено обмеження часу" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -1030,7 +1171,7 @@ msgstr "" "%{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }}}%{dest_port?, порт %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, порт %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "Помічник відслідковування" @@ -1075,8 +1216,8 @@ msgstr "" "різними зонами, наприклад, відхиляти трафік між певними вузлами або відкрити " "порти WAN на маршрутизаторі." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "Вівторок" @@ -1084,19 +1225,25 @@ msgstr "Вівторок" msgid "Unable to save contents: %s" msgstr "Не вдалося зберегти вміст: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "" "Невідомий або не інстальований помічник відслідковування з'єднань \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "NAT без назви" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "Переспрямовування без назви" @@ -1105,15 +1252,19 @@ msgstr "Переспрямовування без назви" msgid "Unnamed rule" msgstr "Правило без назви" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "Зона без назви" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "Нерозпізнаний протокол" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1123,15 +1274,21 @@ msgstr "" "\"SNAT\" буде перетворено на розділи \"nat\", і брандмауер буде перезапущено " "для застосування оновленої конфігурації." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "Використовувати зовнішню IP-адресу" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "Використовувати внутрішню IP-адресу" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." @@ -1139,7 +1296,7 @@ msgstr "" "Використовуйте цей параметр для класифікації трафіку зон за мережевими " "пристроями raw, які не управляються через uci." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1151,17 +1308,17 @@ msgstr "" msgid "Valid firewall mark required" msgstr "Потрібна дійсна позначка брандмауера" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "Середа" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "Дні тижня" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "XOR позначки брандмауера" @@ -1169,109 +1326,234 @@ msgstr "XOR позначки брандмауера" msgid "XOR mark" msgstr "XOR позначки" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "Зона ⇒ Переспрямовування" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "Зони" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "приймати" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "будь-який" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "будь-якої зони" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "застосувати позначку брандмауера" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "призначити помічника відслідковування з'єднань" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "день" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "не переписувати" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "не відстежувати" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "опускати" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "година" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "хвилина" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "відхиляти" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "секунду" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "цього пристрою" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "ця нова зона" @@ -1283,6 +1565,11 @@ msgstr "необмежено" msgid "unspecified" msgstr "невизначено" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "дійсна позначка брандмауера" diff --git a/package/luci/applications/luci-app-firewall/po/ur/firewall.po b/package/luci/applications/luci-app-firewall/po/ur/firewall.po new file mode 100644 index 0000000000..18f2ab96e1 --- /dev/null +++ b/package/luci/applications/luci-app-firewall/po/ur/firewall.po @@ -0,0 +1,1413 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-30 17:00+0200\n" +"PO-Revision-Date: 2021-01-07 17:03+0000\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ur\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.4.1-dev\n" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 +msgid "" +"%{src?%{dest?Forwarded:Incoming}:Outgoing} %{ipv6?%{ipv4?IPv4 and " +"IPv6:IPv6}:IPv4}%{proto?, protocol " +"%{proto#%{next?, }%{item.types?%{item." +"name}ICMP with types %{item.types#%{next?, }" +"%{item}}:%{item.name}}}}%{mark?, mark " +"%{mark.val}}%{dscp?, DSCP %{dscp." +"inv?%{dscp.val}:%{dscp.val}}}%{helper?, helper " +"%{helper.inv?%{helper.val}:%{helper." +"val}}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 +msgid "-- add IP --" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 +msgid "-- add MAC --" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 +msgid "" +"Accept %{src?%{dest?forward:input}:output}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 +msgid "Prevent source rewrite" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 +msgid "" +"Forward to %{dest}%{dest_ip? IP " +"%{dest_ip}}%{dest_port? port %{dest_port}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:115 +msgid "" +"Drop %{src?%{dest?forward:input}:output}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:133 +msgid "" +"Assign DSCP classification %{set_dscp}" +"" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:127 +msgid "" +"Assign conntrack helper " +"%{set_helper}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:130 +msgid "" +"%{set_mark?Assign:XOR} firewall mark " +"%{set_mark?:%{set_xmark}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 +msgid "Automatically rewrite source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:124 +msgid "" +"Do not track %{src?%{dest?forward:input}:" +"output}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:121 +msgid "" +"Reject %{src?%{dest?forward:input}:output}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +msgid "" +"Statically rewrite to source %{snat_ip?IP " +"%{snat_ip}} %{snat_port?port %{snat_port}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 +msgid "A rewrite IP must be specified!" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 +msgid "ACCEPT - Disable address rewriting" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 +msgid "Action" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 +msgid "" +"Additional raw iptables arguments to classify zone destination " +"traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " +"traffic." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 +msgid "" +"Additional raw iptables arguments to classify zone source traffic, " +"e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +msgid "Advanced Settings" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +msgid "Allow \"invalid\" traffic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 +msgid "Allow forward from source zones:" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 +msgid "Allow forward to destination zones:" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 +msgid "Any" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 +msgid "Any day" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:316 +msgid "" +"Apply a bitwise XOR of the given value and the existing mark value on " +"established connections. Format is value[/mask]. If a mask is specified then " +"those bits set in the mask are zeroed out." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 +msgid "Apply the given DSCP class or value to established connections." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 +msgid "Assign the specified connection tracking helper to matched traffic." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +msgid "Automatic helper assignment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +msgid "" +"Automatically assign conntrack helpers based on traffic protocol and port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 +msgid "Conntrack Settings" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 +msgid "Conntrack helpers" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:16 +msgid "Contents have been saved." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 +msgid "Continue" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 +msgid "Covered devices" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 +msgid "Covered networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 +msgid "Covered subnets" +msgstr "" + +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 +msgid "Custom Rules" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:26 +msgid "" +"Custom rules allow you to execute arbitrary iptables commands which are not " +"otherwise covered by the firewall framework. The commands are executed after " +"each firewall restart, right after the default ruleset has been loaded." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 +msgid "DSCP classification" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 +msgid "DSCP mark" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:296 +msgid "DSCP mark required" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +msgid "Destination address" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 +msgid "Destination port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 +msgid "Destination zone" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:268 +msgid "Device name" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +msgid "" +"Do not install extra rules to reject forwarded traffic with conntrack state " +"invalid. This may be required for complex asymmetric route setups." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 +msgid "Drop invalid packets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 +msgid "Enable" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 +msgid "Enable NAT Loopback" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 +msgid "Enable SYN-flood protection" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +msgid "Enable logging on this zone" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 +msgid "Expecting: %s" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 +msgid "Experimental feature. Not fully compatible with QoS/SQM." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 +msgid "Explicitly choses allowed connection tracking helpers for zone traffic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 +msgid "External IP address" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 +msgid "External port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 +msgid "Extra arguments" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 +msgid "Extra destination arguments" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 +msgid "Extra iptables arguments" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 +msgid "Extra source arguments" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 +msgid "Firewall" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:25 +msgid "Firewall - Custom Rules" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 +msgid "Firewall - NAT Rules" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 +msgid "Firewall - Port Forwards" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:173 +msgid "Firewall - Traffic Rules" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +msgid "Firewall - Zone Settings" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 +msgid "Firewall configuration migration" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 +msgid "Forward" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 +msgid "" +"Forwarded %{ipv6?%{ipv4?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" +"}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 +msgid "Friday" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 +msgid "" +"From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }" +"%{item." +"ival}}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:64 +msgid "" +"From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }" +"%{item." +"ival}}}%{src_mac?, MAC %{src_mac#%{next?, }%{item.ival}" +"}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 +msgid "" +"From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }%{item.ival}}}%{src_mac?, " +"MAC %{src_mac#%{next?, }%{item.ival}}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json:3 +msgid "Grant access to firewall configuration" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 +msgid "Hardware flow offloading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 +msgid "IPv4 and IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +msgid "IPv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 +msgid "IPv6 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 +msgid "Inbound device" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 +msgid "" +"Incoming %{ipv6?%{ipv4?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " +"with types %{item.types#%{next?, }%{item}}:" +"%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +msgid "Input" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 +msgid "Internal IP address" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 +msgid "Internal port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 +msgid "Internal zone" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:304 +msgid "Invalid DSCP mark" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:372 +msgid "Invalid limit value" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 +msgid "Limit burst" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 +msgid "Limit log messages" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:348 +msgid "Limit matching" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 +msgid "" +"Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +msgid "Limited masquerading enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:349 +msgid "Limits traffic matching to the specified rate." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 +msgid "Loopback source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 +msgid "MASQUERADE - Automatically rewrite to outbound interface IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 +msgid "MSS clamping" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 +msgid "Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 +msgid "Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 +msgid "Match DSCP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:292 +msgid "Match ICMP type" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:248 +msgid "Match device" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 +msgid "Match forwarded traffic directed at the given IP address." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +msgid "" +"Match forwarded traffic directed at the given destination port or port range." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +msgid "Match forwarded traffic from this IP or range." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 +msgid "" +"Match forwarded traffic originating from the given source port or port range." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 +msgid "Match helper" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 +msgid "" +"Match incoming traffic directed at the given destination port or port range " +"on this host" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 +msgid "Match mark" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 +msgid "Match traffic using the specified connection tracking helper." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:318 +msgid "Matches a specific firewall mark or a range of different marks." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 +msgid "Matches forwarded traffic using the specified outbound network device." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 +msgid "Matches traffic carrying the specified DSCP marking." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 +msgid "" +"Maximum initial number of packets to match: this number gets recharged by " +"one every time the limit specified above is not reached, up to this number." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 +msgid "Monday" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 +msgid "Month Days" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 +msgid "NAT Rules" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +msgid "" +"NAT rules allow fine grained control over the source IP to use for outbound " +"or forwarded traffic." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 +msgid "Name" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 +msgid "Only match incoming traffic directed at the given IP address." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 +msgid "Only match incoming traffic from these MACs." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +msgid "Only match incoming traffic from this IP or range." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 +msgid "" +"Only match incoming traffic originating from the given source port or port " +"range on the client host" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 +msgid "Outbound device" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 +msgid "Outbound zone" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 +msgid "Output" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 +msgid "Passes additional arguments to iptables. Use with care!" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 +msgid "" +"Passing raw iptables arguments to source and destination traffic " +"classification rules allows to match packets based on other criteria than " +"interfaces or subnets. These options should be used with extreme care as " +"invalid values could render the firewall ruleset broken, completely exposing " +"all services." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 +msgid "Port Forwards" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 +msgid "" +"Port forwarding allows remote computers on the Internet to connect to a " +"specific computer or service within the private LAN." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +msgid "Protocol" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 +msgid "" +"Redirect matched incoming traffic to the given port on the internal host" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 +msgid "Redirect matched incoming traffic to the specified internal host" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 +msgid "Restrict Masquerading to given destination subnets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 +msgid "Restrict Masquerading to given source subnets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 +msgid "Restrict to address family" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 +msgid "Rewrite IP address" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +msgid "Rewrite matched traffic to the specified source IP address." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 +msgid "Rewrite matched traffic to the specified source port or port range." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 +msgid "Rewrite port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +msgid "Routing/NAT Offloading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +msgid "SNAT - Rewrite to specific source IP or port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 +msgid "Saturday" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 +msgid "Set mark" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:317 +msgid "" +"Set the given mark value on established connections. Format is value[/mask]. " +"If a mask is specified then only those bits set in the mask are modified." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 +msgid "Software based offloading for routing/NAT" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +msgid "Software flow offloading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +msgid "Source IP address" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 +msgid "Source MAC address" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +msgid "Source address" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 +msgid "Source port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 +msgid "Source zone" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:269 +msgid "" +"Specifies whether to tie this traffic rule to a specific inbound or outbound " +"network device." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 +msgid "" +"Specifies whether to use the external or the internal IP address for " +"reflected traffic." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 +msgid "Start Date (yyyy-mm-dd)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 +msgid "Start Time (hh:mm:ss)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 +msgid "Stop Date (yyyy-mm-dd)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 +msgid "Stop Time (hh:mm:ss)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 +msgid "Sunday" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 +msgid "" +"The existing firewall configuration needs to be changed for LuCI to function " +"properly." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 +msgid "" +"The firewall creates zones over your network interfaces to control network " +"traffic flow." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 +msgid "" +"The options below control the forwarding policies between this zone (%s) and " +"other zones. Destination zones cover forwarded traffic " +"originating from %q. Source zones match forwarded " +"traffic from other zones targeted at %q. The forwarding " +"rule is unidirectional, e.g. a forward from lan to wan does " +"not imply a permission to forward from wan to lan as well." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 +msgid "" +"This section defines common properties of %q. The input and " +"output options set the default policies for traffic entering and " +"leaving this zone while the forward option describes the policy for " +"forwarded traffic between different networks within the zone. Covered " +"networks specifies which available networks are members of this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 +msgid "Thursday" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 +msgid "Time Restrictions" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 +msgid "Time in UTC" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:243 +msgid "Time restrictions are enabled for this rule" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 +msgid "" +"To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " +"%{dest_ip#%{next?, }%{item.ival}
    }}%{dest_port?, port %{dest_port#%{next?, }" +"%{item." +"ival}}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 +msgid "" +"To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port " +"%{dest_port#%{next?, }%{item.ival}}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 +msgid "" +"To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 +msgid "Tracking helper" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:176 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:35 +msgid "Traffic Rules" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:174 +msgid "" +"Traffic rules define policies for packets traveling between different zones, " +"for example to reject traffic between certain hosts or to open WAN ports on " +"the router." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 +msgid "Tuesday" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:19 +msgid "Unable to save contents: %s" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 +msgid "Unknown or not installed conntrack helper \"%s\"" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 +msgid "Unnamed NAT" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 +msgid "Unnamed forward" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:190 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:210 +msgid "Unnamed rule" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 +msgid "Unnamed zone" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 +msgid "Unrecognized protocol" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 +msgid "" +"Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " +"be converted to \"nat\" sections and the firewall will be restarted to apply " +"the updated configuration." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 +msgid "Use external IP address" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 +msgid "Use internal IP address" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 +msgid "" +"Use this option to classify zone traffic by raw, non-uci managed " +"network devices." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 +msgid "" +"Use this option to classify zone traffic by source or destination subnet " +"instead of networks or devices." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:330 +msgid "Valid firewall mark required" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 +msgid "Wednesday" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 +msgid "Week Days" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 +msgid "XOR firewall mark" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 +msgid "XOR mark" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 +msgid "Zone ⇒ Forwardings" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 +msgid "Zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 +msgid "accept" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 +msgid "any" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 +msgid "any zone" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 +msgid "apply firewall mark" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 +msgid "assign conntrack helper" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 +msgid "day" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 +msgid "do not rewrite" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 +msgid "don't track" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 +msgid "drop" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 +msgid "hour" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 +msgid "minute" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +msgid "reject" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 +msgid "second" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 +msgid "this device" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 +msgid "this new zone" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:353 +msgid "unlimited" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:250 +msgid "unspecified" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 +msgid "valid firewall mark" +msgstr "" diff --git a/package/luci/applications/luci-app-firewall/po/vi/firewall.po b/package/luci/applications/luci-app-firewall/po/vi/firewall.po index 49b19aa204..9df6c30fb7 100644 --- a/package/luci/applications/luci-app-firewall/po/vi/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/vi/firewall.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-30 17:00+0200\n" -"PO-Revision-Date: 2020-10-26 20:34+0000\n" -"Last-Translator: 0x2f0713 \n" -"Language-Team: Vietnamese \n" +"Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.3.2-dev\n" +"X-Generator: Weblate 4.18.1\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -30,132 +30,183 @@ msgid "" ""\">%{helper.val}:%{helper." "val}}}" msgstr "" +"%{src?%{dest?Được chuyển tiếp:Đến}:Ra} %{ipv6?%{ipv4?IPv4 và " +"IPv6:IPv6}:IPv4}%{proto?, giao thức " +"%{proto#%{next?, }%{item.types?%{item." +"name}ICMP với các loại %{item.types#%{next?, }" +"%{item}}:%{item.name}}}}%{mark?, mark " +"%{mark.val}}%{dscp?, DSCP %{dscp.inv?%{dscp.val}:%{dscp.val}" +"}}%{helper?, helper %{helper.inv?%{helper.val}:" +"%{helper.val}}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 msgid "-- add IP --" -msgstr "" +msgstr "-- thêm IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" -msgstr "" +msgstr "-- thêm MAC --" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" +"Chấp nhận %{src?%{dest?forward:input}:" +"output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" -msgstr "" +msgstr "Ngăn chặn viết lại nguồn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" msgstr "" +"Chuyển hướng to %{dest}%{dest_ip? IP " +"%{dest_ip}}%{dest_port? cổng%{dest_port}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:115 msgid "" "Drop %{src?%{dest?forward:input}:output}" msgstr "" +"Bỏ %{src?%{dest?forward:input}:output}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:133 msgid "" "Assign DSCP classification %{set_dscp}" "" msgstr "" +"Gắn DSCP phân loại %{set_dscp}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:127 msgid "" "Assign conntrack helper " "%{set_helper}" msgstr "" +"Gán conntrack trợ giúp%{set_helper}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:130 msgid "" "%{set_mark?Assign:XOR} firewall mark " "%{set_mark?:%{set_xmark}}" msgstr "" +"%{set_mark?Gán:XOR} đánh dấu trường " +"lửa%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" -msgstr "" +msgstr "Tự động viết lại IP nguồn" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:124 msgid "" "Do not track %{src?%{dest?forward:input}:" "output}" msgstr "" +"Không theo dõi %{src?%{dest?forward:" +"input}:output}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:121 msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "" +"Từ chối %{src?%{dest?tiến về:đầu vào}:đầu " +"ra}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" msgstr "" +"Viết lại tĩnh thành nguồn %{snat_ip?IP " +"%{snat_ip}} %{snat_port?cổng %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" -msgstr "" +msgstr "Phải chỉ định địa chỉ IP viết lại!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" -msgstr "" +msgstr "ACCEPT - Vô hiệu hóa viết lại địa chỉ" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "Hành động" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " "traffic." msgstr "" +"Các đối số thô iptables bổ sung để phân loại lưu lượng đích vùng, " +"ví dụ: -p tcp --dport 443 để chỉ khớp lưu lượng HTTPS đi ra." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." msgstr "" +"Các đối số thô iptables bổ sung để phân loại lưu lượng nguồn vùng, " +"ví dụ: -p tcp --sport 443 để chỉ khớp lưu lượng HTTPS đến." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "Họ địa chỉ, địa chỉ IP nội bộ phải khớp" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "Họ địa chỉ, địa chỉ nguồn, địa chỉ đích, địa chỉ IP viết lại phải khớp" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "Cài đặt nâng cao" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" -msgstr "" +msgstr "Cho phép lưu lượng \"không hợp lệ\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" -msgstr "" +msgstr "Cho phép tiến về từ vùng nguồn:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" -msgstr "" +msgstr "Cho phép tiến về đến vùng đích:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" -msgstr "" +msgstr "Bất kỳ" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" -msgstr "" +msgstr "Bất kỳ ngày nào" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:316 msgid "" @@ -163,55 +214,68 @@ msgid "" "established connections. Format is value[/mask]. If a mask is specified then " "those bits set in the mask are zeroed out." msgstr "" +"Áp dụng phép XOR bit cho giá trị đã cho và giá trị đánh dấu hiện có trên các " +"kết nối đã thiết lập. Định dạng là value[/mask]. Nếu có mặt nạ được chỉ " +"định, thì các bit được thiết lập trong mặt nạ sẽ bị gán giá trị 0." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Apply the given DSCP class or value to established connections." -msgstr "" +msgstr "Áp dụng lớp hoặc giá trị DSCP đã cho cho các kết nối đã thiết lập." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." -msgstr "" +msgstr "Gán trình theo dõi kết nối đã chỉ định cho lưu lượng khớp." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" -msgstr "" +msgstr "Gán tự động trình theo dõi kết nối" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "" +"Tự động gán trình theo dõi kết nối dựa trên giao thức và cổng lưu lượng" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "Bình luận" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" -msgstr "" +msgstr "Cài đặt Conntrack" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" -msgstr "" +msgstr "Trình theo dõi kết nối" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:16 msgid "Contents have been saved." -msgstr "" +msgstr "Nội dung đã được lưu." -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" -msgstr "" +msgstr "Tiếp tục" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "Bộ đếm" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" -msgstr "" +msgstr "Thiết bị được bao phủ" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" -msgstr "" +msgstr "Mạng được bao phủ" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" -msgstr "" +msgstr "Mạng con được bao phủ" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" -msgstr "" +msgstr "Quy tắc Tùy chỉnh" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:26 msgid "" @@ -219,104 +283,139 @@ msgid "" "otherwise covered by the firewall framework. The commands are executed after " "each firewall restart, right after the default ruleset has been loaded." msgstr "" +"Quy tắc tùy chỉnh cho phép bạn thực thi các lệnh iptables tùy ý mà không " +"được bao phủ bởi khung tường lửa. Các lệnh được thực thi sau mỗi lần khởi " +"động lại tường lửa, ngay sau khi tập luật mặc định đã được tải." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" -msgstr "" +msgstr "Phân loại DSCP" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 msgid "DSCP mark" -msgstr "" +msgstr "Đánh dấu DSCP" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:296 msgid "DSCP mark required" -msgstr "" +msgstr "Đánh dấu DSCP bắt buộc" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" -msgstr "Địa chỉ điểm đến" +msgstr "Địa chỉ đích" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" -msgstr "Cổng điểm đến" +msgstr "Cổng đích" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 -#, fuzzy +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" -msgstr "Điểm đến" +msgstr "Vùng điểm đến" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:268 msgid "Device name" -msgstr "" +msgstr "Tên thiết bị" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." msgstr "" +"Không cài đặt các quy tắc bổ sung để từ chối giao thông chuyển tiếp có trạng " +"thái conntrack invalid. Điều này có thể cần thiết cho các thiết lập " +"tuyến đường không đối xứng phức tạp." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "Bỏ qua nhưng gói không hợp lý" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" -msgstr "Kích hoạt" +msgstr "Bật lên" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" -msgstr "" +msgstr "Bật NAT Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 -#, fuzzy +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" -msgstr "SYN-flood bảo vệ " +msgstr "Kích hoạt bảo vệ SYN-flood" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" +msgstr "Bật ghi nhật ký trên vùng này" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"Bật chuyển đổi địa chỉ mạng và cổng IPv4 (NAT4 hoặc NAPT4) cho giao thông ra " +"ngoài trên vùng này. Thông thường, điều này được kích hoạt trên vùng " +"wan." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." msgstr "" +"Bật chuyển đổi địa chỉ mạng và cổng IPv6 (NAT6 hoặc NAPT6) cho giao thông ra " +"ngoài trên vùng này." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "Kích Hoạt" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "Bật theo dõi số gói tin và số byte cho bộ sưu tập." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" -msgstr "" +msgstr "Đang chờ: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." -msgstr "" +msgstr "Tính năng thử nghiệm. Không hoàn toàn tương thích với QoS/SQM." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "" +"Chọn rõ ràng các trình hỗ trợ theo dõi kết nối được phép cho giao thông vùng" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" -msgstr "" +msgstr "Địa chỉ IP bên ngoài" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "External port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" -msgstr "" +msgstr "Các tham số bổ sung" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" -msgstr "" +msgstr "Các tham số đích bổ sung" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" -msgstr "" +msgstr "Các tham số iptables bổ sung" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" -msgstr "" +msgstr "Các tham số nguồn bổ sung" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "Gia đình" #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" @@ -324,48 +423,59 @@ msgstr "Firewall" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:25 msgid "Firewall - Custom Rules" -msgstr "" +msgstr "Tường lửa - Quy tắc Tùy chỉnh" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "Tường lửa - Bộ IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" -msgstr "" +msgstr "Tường lửa - Quy tắc NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" -msgstr "" +msgstr "Tường lửa - Chuyển tiếp Cổng" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:173 msgid "Firewall - Traffic Rules" -msgstr "" +msgstr "Tường lửa - Quy tắc Giao thông" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" -msgstr "" +msgstr "Tường lửa - Cài đặt Vùng" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" -msgstr "" +msgstr "Di cư cấu hình tường lửa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" -msgstr "" +msgstr "Forward" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" +"Chuyển tiếp %{ipv6?%{ipv4?IPv4 và IPv6:IPv6}:IPv4}%{proto?, giao thức %{proto#%{next?, }%{item.name}" +"}}%{mark?, đánh dấu %{mark.val}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" -msgstr "" +msgstr "Thứ 6" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item." "ival}}}" msgstr "" +"Từ %{src}%{src_device?, giao diện %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, cổng %{src_port#%{next?, }" +"%{item.ival}}}" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:64 msgid "" @@ -385,8 +500,16 @@ msgid "" "name}}.\":%{item.hint.name? data-tooltip=\"%{item.hint.name}\"}}>%{item.ival}" "}}" msgstr "" +"Từ %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " +"%{src_ip#%{next?, }%{item.ival}}}%{src_port?, port %{src_port#%{next?, }" +"%{item." +"ival}}}%{src_mac?, MAC %{src_mac#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" msgstr "" +"Từ %{src}%{src_ip?, Địa chỉ IP %{src_ip#%{next?, }%{item.ival}}}%{src_port?, cổng %{src_port#%{next?, }%{item.ival}}}%{src_mac?, " +"MAC %{src_mac#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" -msgstr "" +msgstr "Các cài đặt chung" #: applications/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json:3 msgid "Grant access to firewall configuration" -msgstr "" +msgstr "Cấp quyền truy cập vào cấu hình tường lửa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" -msgstr "" +msgstr "Xả luồng phần cứng" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (phạm vi)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "Các bộ IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IP/Mạng" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IP/Mạng/MAC" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" -msgstr "" +msgstr "IPv4 và IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" -msgstr "" +msgstr "Chỉ IPv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "IPv6 Masquerading" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" -msgstr "" +msgstr "Chỉ IPv6" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:251 msgid "Inbound device" -msgstr "" +msgstr "Thiết bị đầu vào" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "Bao gồm Tệp" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" +"Đầu vào %{ipv6?%{ipv4?IPv4 và IPv6:IPv6}:" +"IPv4}%{proto?, giao thức %{proto#%{next?, }%{item.types?%{item.name}ICMP " +"với các loại %{item.types#%{next?, }%{item}}:" +"%{item.name}}}}%{mark?, đánh dấu %{mark.val}}%{helper?, trợ giúp " +"%{helper.inv?%{helper.val}:%{helper.val}}}" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "Kích thước băm Ban đầu" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "Input" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 -#, fuzzy +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" -msgstr "Internal address" +msgstr "Địa chỉ IP nội bộ" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 -#, fuzzy +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" -msgstr "External port" +msgstr "Cổng nội bộ" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" -msgstr "" +msgstr "Vùng nội bộ" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:304 msgid "Invalid DSCP mark" -msgstr "" +msgstr "Đánh dấu DSCP không hợp lệ" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:372 msgid "Invalid limit value" +msgstr "Giá trị giới hạn không hợp lệ" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" msgstr "" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" -msgstr "" +msgstr "Số lượng tắt đột ngột" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" -msgstr "" +msgstr "Giới hạn tin nhắn nhật ký" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:348 msgid "Limit matching" -msgstr "" +msgstr "Khớp giới hạn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" msgstr "" +"Giới hạn khớp %{limit.num} gói tin mỗi %{limit.unit}%{limit.burst? với cú pháp %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" -msgstr "" +msgstr "Bật masquerading có giới hạn" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:349 msgid "Limits traffic matching to the specified rate." -msgstr "" +msgstr "Giới hạn khớp lưu lượng với tốc độ được chỉ định." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" -msgstr "" +msgstr "Địa chỉ IP nguồn Loopback" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" -msgstr "" +msgstr "MASQUERADE - Tự động viết lại thành địa chỉ IP giao diện ra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 -#, fuzzy +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSS Clamping" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" -msgstr "" +msgstr "Masquerading" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" -msgstr "" +msgstr "Khớp" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:262 msgid "Match DSCP" -msgstr "" +msgstr "Khớp DSCP" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:292 msgid "Match ICMP type" -msgstr "" +msgstr "Khớp loại ICMP" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:248 msgid "Match device" -msgstr "" +msgstr "Khớp thiết bị" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." -msgstr "" +msgstr "Khớp lưu lượng chuyển tiếp được chỉ định đến địa chỉ IP." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "" +"Khớp lưu lượng chuyển tiếp được chỉ định đến cổng đích hoặc khoảng cổng." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." -msgstr "" +msgstr "Khớp lưu lượng chuyển tiếp từ địa chỉ IP này hoặc khoảng IP." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "" +"Khớp lưu lượng chuyển tiếp xuất phát từ cổng nguồn hoặc khoảng cổng được chỉ " +"định." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" -msgstr "" +msgstr "Khớp trợ giúp" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" msgstr "" +"Khớp lưu lượng đến đích được chỉ định đến cổng đích hoặc khoảng cổng trên " +"máy chủ này" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "Match mark" -msgstr "" +msgstr "Khớp nhãn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." -msgstr "" +msgstr "Khớp lưu lượng sử dụng trình hỗ trợ theo dõi kết nối đã chỉ định." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:318 msgid "Matches a specific firewall mark or a range of different marks." -msgstr "" +msgstr "Khớp nhãn tường lửa cụ thể hoặc một dải nhãn khác nhau." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." -msgstr "" +msgstr "Khớp lưu lượng chuyển tiếp sử dụng thiết bị mạng đầu cuối đã chỉ định." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Matches traffic carrying the specified DSCP marking." -msgstr "" +msgstr "Khớp lưu lượng mang nhãn DSCP đã chỉ định." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "Số lượng tối đa" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "Độ dài tối đa" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "" +"Số lượng gói ban đầu tối đa để khớp: số này sẽ được nạp lại một lần mỗi khi " +"không đạt đến giới hạn được chỉ định ở trên, lên tới số này." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" -msgstr "" +msgstr "Thứ 2" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" -msgstr "" +msgstr "Tháng Ngày" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" -msgstr "" +msgstr "Quy tắc NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "" +"Các quy tắc NAT cho phép kiểm soát chi tiết địa chỉ IP nguồn được sử dụng " +"cho lưu lượng đi ra hoặc chuyển tiếp." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" -msgstr "" +msgstr "Tên" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "Netmask" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." -msgstr "" +msgstr "Chỉ khớp lưu lượng đến địa chỉ IP cụ thể." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." -msgstr "" +msgstr "Chỉ khớp lưu lượng đến từ các địa chỉ MAC này." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." -msgstr "" +msgstr "Chỉ khớp lưu lượng đến từ địa chỉ IP hoặc dải cụ thể này." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "" +"Chỉ khớp lưu lượng đến từ cổng nguồn hoặc dải cổng cụ thể trên máy khách" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" -msgstr "" +msgstr "Thiết bị đầu cuối ra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" -msgstr "" +msgstr "Vùng đầu cuối ra" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "Output" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "Khớp trường gói tin" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"Các trường gói tin để khớp.
    Cú pháp: hướng_loạitruong. Ví dụ: " +"src_port, dest_net.
    Hướng: src, dst. Loại dữ " +"liệu: ip, port, mac, net, set.
    Tiền tố hướng là tùy chọn." +"
    *Ghi chú: loại dữ liệu set không được hỗ trợ trong fw4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" -msgstr "" +msgstr "Truyền các đối số bổ sung cho iptables. Sử dụng cẩn thận!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -666,169 +893,203 @@ msgid "" "invalid values could render the firewall ruleset broken, completely exposing " "all services." msgstr "" +"Việc truyền các đối số iptables nguyên thủy vào các quy tắc phân loại lưu " +"lượng nguồn và đích cho phép khớp các gói dựa trên các tiêu chí khác với " +"giao diện hoặc mạng con. Các tùy chọn này nên được sử dụng cẩn thận vì các " +"giá trị không hợp lệ có thể làm hỏng tập luật tường lửa, hoàn toàn tiết lộ " +"tất cả các dịch vụ." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "Đường dẫn đến tệp chứa CIDR, mạng con, IP máy chủ, v.v.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" -msgstr "" +msgstr "Chuyển tiếp cổng" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" +"Chuyển tiếp cổng cho phép các máy tính từ xa trên Internet kết nối tới một " +"máy tính cụ thể hoặc dịch vụ trong mạng LAN riêng." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "Dải cổng" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "Giao thức" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" -msgstr "" +msgstr "Chuyển hướng lưu lượng đến cổng được chỉ định trên máy chủ nội bộ" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" -msgstr "" +msgstr "Chuyển hướng lưu lượng đến máy chủ nội bộ được chỉ định" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "Tham chiếu tới tập hợp ngoại vi" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "Yêu cầu hỗ trợ NAT phần cứng." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" -msgstr "" +msgstr "Hạn chế Masquerading cho các mạng con đích được chỉ định" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" -msgstr "" +msgstr "Hạn chế Masquerading cho các mạng con nguồn được chỉ định" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" -msgstr "" +msgstr "Giới hạn địa chỉ gia đình" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" -msgstr "" +msgstr "Ghi đè địa chỉ IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." -msgstr "" +msgstr "Ghi đè lưu lượng khớp với địa chỉ IP nguồn được chỉ định." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." -msgstr "" +msgstr "Ghi đè lưu lượng khớp với cổng nguồn hoặc dải cổng được chỉ định." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" -msgstr "" +msgstr "Ghi đè cổng" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" -msgstr "" +msgstr "Bật tính năng Offloading cho định tuyến/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" -msgstr "" +msgstr "SNAT - Ghi đè lên địa chỉ IP hoặc cổng nguồn cụ thể" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" -msgstr "" +msgstr "Thứ 7" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "Set mark" -msgstr "" +msgstr "Đặt đánh dấu" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:317 msgid "" "Set the given mark value on established connections. Format is value[/mask]. " "If a mask is specified then only those bits set in the mask are modified." msgstr "" +"Đặt giá trị đánh dấu được chỉ định cho các kết nối đã thiết lập. Định dạng " +"là value[/mask]. Nếu có chỉ định mặt nạ, chỉ những bit được đặt trong mặt nạ " +"mới được thay đổi." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" -msgstr "" +msgstr "Bật tính năng Offloading dựa trên phần mềm cho định tuyến/NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" -msgstr "" +msgstr "Xả luồng dựa trên phần mềm" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 -#, fuzzy +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "Đỉa chỉ MAC nguồn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" -msgstr "" +msgstr "Địa chỉ MAC nguồn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 -#, fuzzy +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" -msgstr "Đỉa chỉ MAC nguồn" +msgstr "Đỉa chỉ nguồn" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" -msgstr "Cổng nguồn" +msgstr "Source port" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 -#, fuzzy +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" -msgstr "Cổng nguồn" +msgstr "Source zone" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:269 msgid "" "Specifies whether to tie this traffic rule to a specific inbound or outbound " "network device." msgstr "" +"Xác định xem có liên kết luật lưu lượng này với thiết bị mạng đầu vào hoặc " +"đầu ra cụ thể hay không." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "" +"Xác định xem có sử dụng địa chỉ IP ngoại vi hoặc nội bộ cho lưu lượng phản " +"chiếu hay không." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" -msgstr "" +msgstr "Ngày bắt đầu (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" -msgstr "" +msgstr "Thời gian bắt đầu (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" -msgstr "" +msgstr "Ngày kết thúc (yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" -msgstr "" +msgstr "Thời gian kết thúc (hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "Phương pháp lưu trữ" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" -msgstr "" +msgstr "Chủ Nhật" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "" +"Cấu hình tường lửa hiện có cần được thay đổi để LuCI hoạt động đúng cách." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." @@ -836,8 +1097,8 @@ msgstr "" "The firewall tạo zones trên giao diện mạng lưới để điều triển sự dòng lưu " "thông của mạng." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -846,8 +1107,14 @@ msgid "" "rule is unidirectional, e.g. a forward from lan to wan does " "not imply a permission to forward from wan to lan as well." msgstr "" +"Các tùy chọn dưới đây kiểm soát chính sách chuyển tiếp giữa vùng này (%s) và " +"các vùng khác. Vùng đích áp dụng cho lưu lượng được chuyển tiếp " +"xuất phát từ %q. Vùng nguồn khớp lưu lượng được " +"chuyển tiếp từ các vùng khác đích đến %q. Quy tắc chuyển " +"tiếp là một chiều, ví dụ: một chuyển tiếp từ lan đến wan không bao gồm quyền chuyển tiếp từ wan đến lan." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -855,25 +1122,34 @@ msgid "" "forwarded traffic between different networks within the zone. Covered " "networks specifies which available networks are members of this zone." msgstr "" +"Phần này xác định các thuộc tính chung của %q. Các tùy chọn input " +"và output đặt chính sách mặc định cho lưu lượng nhập và xuất khỏi " +"vùng này trong khi tùy chọn forward mô tả chính sách cho lưu lượng " +"chuyển tiếp giữa các mạng khác nhau trong vùng. Mạng bao gồm chỉ " +"định các mạng có sẵn là thành viên của vùng này." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" -msgstr "" +msgstr "Thứ 5" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" -msgstr "" +msgstr "Hạn chế Thời gian" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" -msgstr "" +msgstr "Thời gian theo UTC" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:243 msgid "Time restrictions are enabled for this rule" -msgstr "" +msgstr "Hạn chế thời gian được bật cho quy tắc này" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "Quá thời gian" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" @@ -883,8 +1159,13 @@ msgid "" "%{item." "ival}
    }}" msgstr "" +"Đến %{dest}%{dest_device?, giao diện %{dest_device}}%{dest_ip?, " +"IP %{dest_ip#%{next?, }%{item.ival}
    }}%{dest_port?, cổng %{dest_port#%{next?, }" +"%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" msgstr "" +"Đến %{dest}%{dest_device?, qua giao diện %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, cổng " +"%{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, port %{dest_port#%{next?, }%{item.ival}}}" msgstr "" +"Đến %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, cổng %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" -msgstr "" +msgstr "Bộ trợ giúp theo dõi" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:176 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:35 msgid "Traffic Rules" -msgstr "" +msgstr "Quy tắc Lưu lượng" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:174 msgid "" @@ -916,207 +1206,369 @@ msgid "" "for example to reject traffic between certain hosts or to open WAN ports on " "the router." msgstr "" +"Quy tắc giao thông xác định các chính sách cho các gói tin đi giữa các vùng " +"khác nhau, ví dụ như từ chối giao thông giữa các máy chủ nhất định hoặc mở " +"cổng WAN trên bộ định tuyến." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" -msgstr "" +msgstr "Thứ 3" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js:19 msgid "Unable to save contents: %s" +msgstr "Không thể lưu nội dung: %s" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." msgstr "" +"Đơn vị: giây. Mặc định 0 có nghĩa là mục được thêm vào bộ vĩnh " +"viễn.
    Tối đa: 2147483 giây." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" -msgstr "" +msgstr "Trợ giúp conntrack không xác định hoặc chưa cài đặt \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" -msgstr "" +msgstr "NAT không có tên" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" -msgstr "" +msgstr "Chuyển tiếp không có tên" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:210 msgid "Unnamed rule" -msgstr "" +msgstr "Quy tắc không có tên" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "Bộ không có tên" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" -msgstr "" +msgstr "Vùng không có tên" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" -msgstr "" +msgstr "Giao thức không được nhận dạng" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " "the updated configuration." msgstr "" +"Khi nhấn \"Tiếp tục\", các phần \"chuyển hướng\" với mục tiêu \"SNAT\" sẽ " +"được chuyển đổi thành các phần \"nat\" và tường lửa sẽ được khởi động lại để " +"áp dụng cấu hình đã cập nhật." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" -msgstr "" +msgstr "Sử dụng địa chỉ IP bên ngoài" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" -msgstr "" +msgstr "Sử dụng địa chỉ IP nội bộ" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "Sử dụng ipset" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "" +"Sử dụng tùy chọn này để phân loại lưu lượng vùng theo thiết bị mạng thô, " +"không được quản lý bởi uci." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." msgstr "" +"Sử dụng tùy chọn này để phân loại lưu lượng vùng theo mạng con nguồn hoặc " +"đích thay vì mạng hoặc thiết bị." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:330 msgid "Valid firewall mark required" -msgstr "" +msgstr "Yêu cầu dấu tường lửa hợp lệ" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" -msgstr "" +msgstr "Thứ 4" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" -msgstr "" +msgstr "Ngày trong tuần" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" -msgstr "" +msgstr "Dấu tường lửa XOR" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:315 msgid "XOR mark" -msgstr "" +msgstr "Dấu XOR" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "Thiết bị của bạn không chạy firewall4." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "Thiết bị của bạn chạy firewall4." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" -msgstr "" +msgstr "Vùng ⇒ Chuyển tiếp" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" -msgstr "Zones" +msgstr "Các vùng" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "chấp nhận" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" -msgstr "" +msgstr "Bất kì" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" -msgstr "" +msgstr "bất kỳ vùng nào" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "bất kỳ/tất cả" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" -msgstr "" +msgstr "áp dụng dấu tường lửa" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" -msgstr "" +msgstr "gán trợ giúp conntrack" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "Tự động hóa" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bản đồ bit" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "bản đồ bit chỉ dành cho ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" -msgstr "" +msgstr "ngày" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: IP đích" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: Địa chỉ MAC đích" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: Mạng (con) đích" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: Cổng đích" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "*dest_set: ipset đích*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" -msgstr "" +msgstr "không viết lại" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" -msgstr "" +msgstr "không theo dõi" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "drop" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"firewall4 hỗ trợ tham chiếu và tạo các bộ IP để đơn giản hóa việc khớp các " +"danh sách địa chỉ lớn mà không cần tạo một quy tắc cho mỗi mục để khớp. Phạm " +"vi cổng trong ipsets không được hỗ trợ bởi firewall4.
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "từ cổng đến cổng" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "băm" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" +msgstr "giờ" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: Địa chỉ IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." msgstr "" +"ip[/cidr]
    Để sử dụng với các kiểu dữ liệu Khớp: *_ip." + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "danh sách" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: Địa chỉ MAC" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "*macaddr|ip[/cidr]*
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" -msgstr "" +msgstr "*phút*" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "net: (sub)net" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "port: Cổng" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "Không chấp nhận" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" -msgstr "" +msgstr "giây" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set: ipset*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: ipset nguồn*" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: IP nguồn" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: Địa chỉ MAC nguồn" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: Mạng (con) nguồn" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: Cổng nguồn" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" -msgstr "" +msgstr "thiết bị này" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" -msgstr "" +msgstr "vùng mới này" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:353 msgid "unlimited" -msgstr "" +msgstr "không giới hạn" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:250 msgid "unspecified" -msgstr "" +msgstr "không xác định" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "lên đến 65536 mục." #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" -msgstr "" +msgstr "dấu tường lửa hợp lệ" diff --git a/package/luci/applications/luci-app-firewall/po/zh_Hans/firewall.po b/package/luci/applications/luci-app-firewall/po/zh_Hans/firewall.po index 7f66becb6c..dbc2cb7513 100644 --- a/package/luci/applications/luci-app-firewall/po/zh_Hans/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/zh_Hans/firewall.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2021-07-01 19:13+0000\n" -"Last-Translator: Tianling Shen \n" +"PO-Revision-Date: 2023-10-20 13:57+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" +"librecmc/luciapplicationsfirewall/zh_Hans/>\n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 5.1\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -45,20 +45,28 @@ msgstr "" msgid "-- add IP --" msgstr "-- 添加 IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- 添加 MAC --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "0" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "1024" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "接受 %{src?%{dest?转发:入站}:出站}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "防止重写源" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -93,7 +101,7 @@ msgstr "" "%{set_mark?分配:异或} 防火墙标记 " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "自动重写 源 IP" @@ -109,7 +117,7 @@ msgid "" "Reject %{src?%{dest?forward:input}:output}" msgstr "拒绝 %{src?%{dest?转发:入站}:出站}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -117,23 +125,23 @@ msgstr "" "静态重写 到源 %{snat_ip?IP %{snat_ip}} %{snat_port?端口 %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "必须指定重写 IP!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "接受 - 禁用地址重写" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "操作" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -142,7 +150,7 @@ msgstr "" "用于对区域目标流量进行分类的额外 iptables 参数。如:-p tcp --" "dport 443 表示仅匹配出站 HTTPS 流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -150,33 +158,43 @@ msgstr "" "用于对区域源流量进行分类的额外 iptables 参数。如:-p tcp --" "sport 443 表示仅匹配入站 HTTPS 流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "地址族、内部 IP 族必须相匹配" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "地址族、源地址、目标地址、重写 IP 地址必须相匹配" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "高级设置" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "允许“无效”流量" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "允许来自源区域的转发:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "允许转发到目标区域:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "任何" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "每天" @@ -193,24 +211,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "将给定的 DSCP 类或值应用于已建立的连接。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "将指定的连接跟踪助手分配给匹配的流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "自动助手分配" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "根据流量协议和端口自动分配 conntrack 助手" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "注释" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "连接跟踪设置" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "连接跟踪助手" @@ -218,23 +241,27 @@ msgstr "连接跟踪助手" msgid "Contents have been saved." msgstr "内容已保存。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "继续" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "计数器" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "涵盖的设备" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "涵盖的网络" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "涵盖的子网" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "自定义规则" @@ -247,7 +274,7 @@ msgstr "" "自定义规则允许您执行不属于防火墙框架的任意 iptables 命令。每次重启防火墙时," "这些命令在默认的规则运行后立即执行。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "DSCP 类别" @@ -259,17 +286,17 @@ msgstr "DSCP 标记" msgid "DSCP mark required" msgstr "需要 DSCP 标记" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "目标地址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "目标端口" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "目标区域" @@ -277,7 +304,7 @@ msgstr "目标区域" msgid "Device name" msgstr "设备名" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -285,66 +312,93 @@ msgstr "" "不安装额外的规则以拒绝连接跟踪状态为无效的转发流量。对复杂的非对称路" "由这可能是必需的设置。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "丢弃无效数据包" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "启用" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "启用 NAT 环回" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "启用 SYN-flood 防御" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "启用此区域的日志记录" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" +"为此区域的出站流量开启网络地址和端口转换 IPv4 (NAT4 或 NAPT4)。 wan区域通常开启此功能。" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "为此区域出站流量开启网络地址和端口转换 IPv6 (NAT6 或 NAPT6)。" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "启用" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "为该集合开启数据包和字节计数追踪。" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "请输入:%s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "实验特性。与 QoS/SQM 不完全兼容。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "为区域流量明确选择允许的连接跟踪助手" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "外部 IP 地址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "外部端口" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "额外参数" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "额外的目标参数" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "额外的 iptables 参数" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "额外的源参数" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "族" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "防火墙" @@ -353,11 +407,15 @@ msgstr "防火墙" msgid "Firewall - Custom Rules" msgstr "防火墙 - 自定义规则" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "防火墙 - IP 集合" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "防火墙 - NAT 规则" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "防火墙 - 端口转发" @@ -365,38 +423,41 @@ msgstr "防火墙 - 端口转发" msgid "Firewall - Traffic Rules" msgstr "防火墙 - 通信规则" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "防火墙 - 区域设置" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "防火墙配置迁移" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "转发" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"转发的 IPv4%{proto?, 协议 %{proto#%{next?, }%{item.name}}}%{mark?, 标记 %{mark.val}}" +"Forwarded %{ipv6?%{ipv4?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" +"}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "星期五" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "常规设置" @@ -461,22 +522,55 @@ msgstr "常规设置" msgid "Grant access to firewall configuration" msgstr "授予访问防火墙配置的权限" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "硬件流量分载" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "IP (范围)" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "IP 集合" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "IP/网络" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "IP/网络/MAC 地址" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "IPv4" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 和 IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "仅 IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "IPv6" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "IPv6 伪装" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "仅 IPv6" @@ -484,9 +578,14 @@ msgstr "仅 IPv6" msgid "Inbound device" msgstr "入站设备" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "包括文件" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"入站 IPv4%{proto?, 协议 %{proto#%{next?, }%{item.types?%{item.name}具有类型 %{item." -"types#%{next?, }%{item}} 的 ICMP:%{item.name}}}}%{mark?, 标记 %{mark.val}}%{helper?, 助手 " -"%{helper.inv?%{helper.val}:%{helper." -"val}}}" +"Incoming %{ipv6?%{ipv4?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " +"with types %{item.types#%{next?, }%{item}}:" +"%{item.name}}}}%{mark?, mark %{mark.val}}%{helper?, helper %{helper.inv?%{helper.val}:%{helper.val}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "初始哈希大小" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "入站数据" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "内部 IP 地址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "内部端口" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "内部区域" @@ -531,11 +635,15 @@ msgstr "无效的 DSCP 标记" msgid "Invalid limit value" msgstr "无效的限制值" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "无效的集合名" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "限制突发" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "限制日志信息" @@ -543,9 +651,9 @@ msgstr "限制日志信息" msgid "Limit matching" msgstr "限制匹配" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -553,7 +661,8 @@ msgstr "" "限制匹配到 %{limit.num} 包每 %{limit.unit}%{limit." "burst? 突发 %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "已启用有限伪装" @@ -561,25 +670,25 @@ msgstr "已启用有限伪装" msgid "Limits traffic matching to the specified rate." msgstr "将流量匹配限制为指定的速率。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "环回源 IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASQUERADE - 自动重写源地址为出站接口 IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSS 钳制" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "IP 动态伪装" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "匹配规则" @@ -595,30 +704,30 @@ msgstr "匹配 ICMP 类型" msgid "Match device" msgstr "匹配设备" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "匹配指向给定 IP 地址的转发流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "匹配指向给定目标端口或端口范围的转发流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "匹配来自此 IP 或范围的转发流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "匹配来自给定源端口或端口范围的转发流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "匹配助手" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -628,8 +737,8 @@ msgstr "匹配指向此主机上指定目标端口或目标端口范围的入站 msgid "Match mark" msgstr "匹配标记" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "使用指定的连接跟踪助手匹配流量。" @@ -637,87 +746,117 @@ msgstr "使用指定的连接跟踪助手匹配流量。" msgid "Matches a specific firewall mark or a range of different marks." msgstr "匹配特定的防火墙标记或防火墙标记范围。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." -msgstr "使用指定的出站网络设备匹配转发的流量。" +msgstr "匹配使用指定的出站网络设备转发的流量。" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:263 msgid "Matches traffic carrying the specified DSCP marking." msgstr "匹配承载指定 DSCP 标记的流量。" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "最大条目数" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "最大长度" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " "one every time the limit specified above is not reached, up to this number." msgstr "要匹配的最大初始数据包数:未达到上述指定限制时,每次加一直到达到此数。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "星期一" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "日期" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "NAT 规则" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "NAT 规则允许对源 IP 进行精细控制,以用于出站或转发流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "名称" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "网络掩码" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "仅匹配指定目的 IP 地址的入站流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "仅匹配来自这些 MAC 的入站流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "仅匹配来自此 IP 或 IP 范围的入站流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "仅匹配源自客户端主机上给定源端口或源端口范围的入站流量" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "出站设备" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "出站区域" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "出站数据" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "数据包字段匹配" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" +"要进行匹配的数据包字段。
    语法:direction_datatype。如:" +"src_port, dest_net。
    方向:src, dst。数据类" +"型:ip, port, mac, net, set。
    方向前缀可选。
    *注意:" +"datatypeset在 fw4 中不受支持。" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "传递到 iptables 的额外参数。小心使用!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -729,75 +868,93 @@ msgstr "" "他条件来匹配数据包。使用这些选项应格外小心,因为无效值可能会破坏防火墙规则集" "而对外暴露所有服务。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "CIDRs、subnets、host IP 等文件的路径。
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "端口转发" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "端口转发允许互联网上的远程计算机连接到内部网络中的特定计算机或服务。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "端口范围" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "协议" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "重定向匹配的入站流量到内部主机的端口" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "重定向匹配的入站流量到指定的内部主机" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "需要硬件 NAT 支持。目前 mt7621 已实现" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "参考外部集合" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "反射区" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "需要硬件 NAT 支持。" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "要限制 IP 动态伪装的目标子网" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "要限制 IP 动态伪装的源子网" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" -msgstr "限制地址类型" +msgstr "地址族限制" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "重写 IP 地址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "将匹配的流量重写到指定的源 IP 地址。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "将匹配的流量重写到指定的源端口或端口范围。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "重写端口" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "路由/NAT 分载" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - 重写为特定的源 IP 或端口" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "星期六" @@ -813,36 +970,36 @@ msgstr "" "在已建立的连接上设置给定的标记值。格式为:值[/掩码]。如果指定了掩码,则仅修改" "掩码中设置的位。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "基于软件的 路由/NAT 分载" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "软件流量分载" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "源 IP 地址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "源 MAC 地址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "源地址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "源端口" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "源区域" @@ -852,51 +1009,55 @@ msgid "" "network device." msgstr "指定是否将此流量规则绑定到特定的入站或出站网络设备。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "指定反射流量使用外部或内部 IP 地址。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "开始日期(yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "开始时间(hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "停止日期(yyyy-mm-dd)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "停止时间(hh:mm:ss)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "存储方式" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "星期日" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "需要更改现有的防火墙配置,以使 LuCI 正常运行。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "防火墙通过在网络接口上创建区域来控制网络流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -910,7 +1071,7 @@ msgstr "" "%q 的其它区域。转发规则的作用是单向的,例如:转发从 lan 到 " "wan 的流量并不意味着允许反向转发从 wan 到 lan 的流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -922,18 +1083,18 @@ msgstr "" "域入站和出站流量的默认策略,转发选项描述该区域内不同网络之间的流量转" "发策略。涵盖的网络指定从属于这个区域的网络。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "星期四" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "时间限制" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "UTC 时间" @@ -941,6 +1102,10 @@ msgstr "UTC 时间" msgid "Time restrictions are enabled for this rule" msgstr "对该规则启用了时间限制" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "超时" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -955,7 +1120,7 @@ msgstr "" "%{item." "ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item." "ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?, 端口 %{dest_port#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "跟踪助手" @@ -999,8 +1164,8 @@ msgstr "" "通信规则定义了不同区域间的数据包传输策略,例如:拒绝一些主机之间的通信、开放" "路由器 WAN 上的端口。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "星期二" @@ -1008,18 +1173,26 @@ msgstr "星期二" msgid "Unable to save contents: %s" msgstr "无法保存内容:%s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" +"单位:秒。默认值0表示该条目被永久添加到该集合。
    最大值:" +"2147483 秒。" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "未知或未安装的连接跟踪助手 \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "未命名 NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "未命名转发" @@ -1028,15 +1201,19 @@ msgstr "未命名转发" msgid "Unnamed rule" msgstr "未命名规则" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "未命名的集合" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "未命名区域" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "无法识别的协议" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1045,21 +1222,27 @@ msgstr "" "按下“继续”后,目标“SNAT”的“redirect”部分将转换为“nat”部分,防火墙将重新启动以" "应用更新的配置。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "使用外部 IP 地址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "使用内部 IP 地址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "使用 ip 集" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "此选项可对原始的、非 uci 托管的网络设备进行区域流量分类。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1069,17 +1252,17 @@ msgstr "此选项可对源或目标子网而非网络或设备进行区域流量 msgid "Valid firewall mark required" msgstr "需要有效的防火墙标记" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "星期三" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "星期" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "异或防火墙标记" @@ -1087,109 +1270,236 @@ msgstr "异或防火墙标记" msgid "XOR mark" msgstr "异或标记" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "你的设备不运行 firewall4。" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "你的设备运行 firewall4。" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "区域 ⇒ 转发" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "区域" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "应从中创建反射规则的区域。若未设置,将仅使用目标区域。" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "接受" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "任意" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "所有区域" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "任意/全部" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "应用防火墙标记" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "分配连接跟踪助手" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "自动" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "bitmap" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "bitmap 仅支持 ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "日" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "dest_ip: 目标 IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "dest_mac: 目标 MAC 地址" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "dest_net: 目标 (子)网" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "dest_port: 目标端口" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "dest_set: 目标 ip集*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "不重写" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "不跟踪" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "丢弃" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" +"firewall4 支持引用和创建 IP 集合,这样就无需为每个条目创建一条规则进行匹配," +"达到简化大型地址列表匹配的目的。firewall4 不支持 ip 集合中的 端口范围。
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "fromport-toport" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "哈希" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "小时" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "ip: IP 地址" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "ip[/cidr]
    用于 Match 数据类型: *_ip。" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "ipv4" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "列表" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "mac: MAC 地址" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "macaddr|ip[/cidr]
    " + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "分钟" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "net: (子)网" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "port: 端口" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "拒绝" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "秒" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "set: ip集*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "src_Set: 源 ip集*" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "src_ip: 源 IP" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "src_mac: 源 MAC 地址" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "src_net: 源(子)网" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "src_port: 源端口" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "此设备" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "此新区域" @@ -1201,6 +1511,11 @@ msgstr "无限制" msgid "unspecified" msgstr "未指定" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "最多 65536 个条目。" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "有效的防火墙标记" diff --git a/package/luci/applications/luci-app-firewall/po/zh_Hant/firewall.po b/package/luci/applications/luci-app-firewall/po/zh_Hant/firewall.po index ec78449af9..99a05371ca 100644 --- a/package/luci/applications/luci-app-firewall/po/zh_Hant/firewall.po +++ b/package/luci/applications/luci-app-firewall/po/zh_Hant/firewall.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2021-08-14 14:43+0000\n" +"PO-Revision-Date: 2023-03-15 14:40+0000\n" "Last-Translator: Hulen \n" "Language-Team: Chinese (Traditional) \n" +"librecmc/luciapplicationsfirewall/zh_Hant/>\n" "Language: zh_Hant\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.16.2-dev\n" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:48 msgid "" @@ -44,21 +44,29 @@ msgstr "" msgid "-- add IP --" msgstr "-- 新增 IP --" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:509 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:519 msgid "-- add MAC --" msgstr "-- 新增 MAC 位置 --" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:198 +msgid "0" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:181 +msgid "1024" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:118 msgid "" "Accept %{src?%{dest?forward:input}:output}" msgstr "" "套用 %{src?%{dest?forward:input}:output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:93 msgid "Prevent source rewrite" msgstr "避免來源重置" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:85 msgid "" "Forward to %{dest}%{dest_ip? IP " "%{dest_ip}}%{dest_port? port %{dest_port}}" @@ -96,7 +104,7 @@ msgstr "" "%{set_mark?Assign:XOR} 防火牆標記 " "%{set_mark?:%{set_xmark}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:84 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:90 msgid "Automatically rewrite source IP" msgstr "自動重置 來源IP" @@ -114,7 +122,7 @@ msgid "" msgstr "" "拒絕 %{src?%{dest?forward:input}:output}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:81 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:87 msgid "" "Statically rewrite to source %{snat_ip?IP " "%{snat_ip}} %{snat_port?port %{snat_port}}" @@ -122,23 +130,23 @@ msgstr "" "靜態重寫 到來源 %{snat_ip?IP %{snat_ip}" "} %{snat_port?port %{snat_port}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:224 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:302 msgid "A rewrite IP must be specified!" msgstr "必須指定重置IP!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:213 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:288 msgid "ACCEPT - Disable address rewriting" msgstr "接受 - 禁用位址重置" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:174 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:220 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:224 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:377 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:158 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:283 msgid "Action" msgstr "動作" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "" "Additional raw iptables arguments to classify zone destination " "traffic, e.g. -p tcp --dport 443 to only match outbound HTTPS " @@ -147,7 +155,7 @@ msgstr "" "允許原生 iptables 對區域目標流量進行分類的參數, 譬如... -p " "tcp --dport 443 只針對相符輸出的HTTPS流量." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "" "Additional raw iptables arguments to classify zone source traffic, " "e.g. -p tcp --sport 443 to only match inbound HTTPS traffic." @@ -155,33 +163,43 @@ msgstr "" "允許原生 iptables 參數對區域來源流量進行分類, 譬如... -p tcp " "--sport 443 只針對相符輸入的HTTPS流量." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:138 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:107 +msgid "Address family, Internal IP address must match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 +msgid "" +"Address family, source address, destination address, rewrite IP address must " +"match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:161 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:182 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:136 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:106 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 msgid "Advanced Settings" msgstr "進階設定" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "Allow \"invalid\" traffic" msgstr "允許 \"無效\" 流量" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:353 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:379 msgid "Allow forward from source zones:" msgstr "允許從來源區域轉發:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:312 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:338 msgid "Allow forward to destination zones:" msgstr "允許轉發到目標區:" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:539 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:549 msgid "Any" msgstr "任何" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:445 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:259 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:475 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:491 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:348 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:364 msgid "Any day" msgstr "任一天" @@ -198,24 +216,29 @@ msgstr "" msgid "Apply the given DSCP class or value to established connections." msgstr "啟用付予的DSCP(區別服務代碼點)來建立連線." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Assign the specified connection tracking helper to matched traffic." msgstr "指定特定的連線追蹤幫手來匹配流量." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "Automatic helper assignment" msgstr "自動分派幫手" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:254 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 msgid "" "Automatically assign conntrack helpers based on traffic protocol and port" msgstr "根據流量和埠號自動指定conntrack幫手" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:60 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:61 +msgid "Comment" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:109 msgid "Conntrack Settings" msgstr "Conntrack 設定值" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Conntrack helpers" msgstr "Conntrack 幫手" @@ -223,23 +246,27 @@ msgstr "Conntrack 幫手" msgid "Contents have been saved." msgstr "內容已儲存。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:688 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:698 msgid "Continue" msgstr "繼續" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:203 +msgid "Counters" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "Covered devices" msgstr "已涵蓋裝置" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:177 msgid "Covered networks" msgstr "已涵蓋網路" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "Covered subnets" msgstr "已涵蓋子網路" -#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:54 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:62 msgid "Custom Rules" msgstr "自訂規則" @@ -252,7 +279,7 @@ msgstr "" "自訂規則允許您執行不屬於防火牆框架的任意 iptables 指令。每次重啟防火牆時,在" "預設的規則執行後這些指令將立即執行。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:387 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:417 msgid "DSCP classification" msgstr "DSCP(區別服務代碼點)分類" @@ -264,17 +291,17 @@ msgstr "DSCP(區別服務代碼點)標記" msgid "DSCP mark required" msgstr "DSCP(區別服務代碼點)必須標記" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:194 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:398 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 msgid "Destination address" msgstr "目標位址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:370 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:199 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:400 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:274 msgid "Destination port" msgstr "目的通訊埠" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:362 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:392 msgid "Destination zone" msgstr "目標區域" @@ -282,7 +309,7 @@ msgstr "目標區域" msgid "Device name" msgstr "裝置名稱" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 msgid "" "Do not install extra rules to reject forwarded traffic with conntrack state " "invalid. This may be required for complex asymmetric route setups." @@ -290,66 +317,91 @@ msgstr "" "千萬別安裝額外的規則來拒絕轉發附帶 無效conntrack狀態的流量.對於複合" "的不對稱路由器安裝這可能是必要的." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:58 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:59 msgid "Drop invalid packets" msgstr "丟棄無效封包" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:228 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:230 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:164 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:209 msgid "Enable" msgstr "啟用" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:248 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:302 msgid "Enable NAT Loopback" msgstr "啟用 NAT 環回" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:44 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:45 msgid "Enable SYN-flood protection" msgstr "啟用 SYN-flood(SYN 洪水) 防禦" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 msgid "Enable logging on this zone" msgstr "啟用此區域的日誌記錄" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:162 +msgid "" +"Enable network address and port translation IPv4 (NAT4 or NAPT4) for " +"outbound traffic on this zone. This is typically enabled on the wan " +"zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +msgid "" +"Enable network address and port translation IPv6 (NAT6 or NAPT6) for " +"outbound traffic on this zone." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:210 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:204 +msgid "Enables packet and byte count tracking for the set." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "Expecting: %s" msgstr "預期: %s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:77 msgid "Experimental feature. Not fully compatible with QoS/SQM." msgstr "實驗性功能。與 QoS/SQM 不完全相容。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:258 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:284 msgid "Explicitly choses allowed connection tracking helpers for zone traffic" msgstr "針對區域流量明確選擇已允許的連接追蹤幫手" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:270 msgid "External IP address" msgstr "外部 IP 位址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:275 msgid "External port" msgstr "外部埠號" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:285 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:436 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:345 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:466 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:338 msgid "Extra arguments" msgstr "額外引數" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:316 msgid "Extra destination arguments" msgstr "額外目標引數" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:108 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:110 msgid "Extra iptables arguments" msgstr "額外iptables引數" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:280 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:306 msgid "Extra source arguments" msgstr "額外來源引數" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:66 +msgid "Family" +msgstr "" + #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:3 msgid "Firewall" msgstr "防火牆" @@ -358,11 +410,15 @@ msgstr "防火牆" msgid "Firewall - Custom Rules" msgstr "防火牆 - 自訂規則" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:127 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:20 +msgid "Firewall - IP sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:172 msgid "Firewall - NAT Rules" msgstr "防火牆 - NAT 規則" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:129 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:152 msgid "Firewall - Port Forwards" msgstr "防火牆 - 通訊埠轉發" @@ -370,39 +426,35 @@ msgstr "防火牆 - 通訊埠轉發" msgid "Firewall - Traffic Rules" msgstr "防火牆 - 流量規則" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:37 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 msgid "Firewall - Zone Settings" msgstr "防火牆 - 區域設定" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:681 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:691 msgid "Firewall configuration migration" msgstr "防火牆設定移轉" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:64 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:147 msgid "Forward" msgstr "轉發" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:30 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:34 msgid "" -"Forwarded IPv4%{proto?, protocol %{proto#%{next?, }%{item.name}IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.name}}}%{mark?, mark %{mark.val}" "}" msgstr "" -"已轉發 IPv4%{proto?,協定:%{proto#%{next?, }%{item.name}}}%{mark?,標記:%{mark.val}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:451 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:265 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:481 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:354 msgid "Friday" msgstr "星期五" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:39 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:45 msgid "" "From %{src}%{src_device?, interface %{src_device}}%{src_ip?, IP " "%{src_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:48 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:52 msgid "" "From %{src}%{src_ip?, IP %{src_ip#%{next?, }%{item.ival}%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:181 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:135 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:105 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:107 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:17 msgid "General Settings" msgstr "一般設定" @@ -467,22 +519,55 @@ msgstr "一般設定" msgid "Grant access to firewall configuration" msgstr "授予存取防火牆組態的權限" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:87 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 msgid "Hardware flow offloading" msgstr "硬體流量卸載" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:143 +msgid "IP (range)" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:32 +#: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:53 +msgid "IP Sets" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:151 +msgid "IPs/Networks" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:106 +msgid "IPs/Networks/MACs" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:67 +msgid "IPv4" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:279 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:232 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:250 msgid "IPv4 and IPv6" msgstr "IPv4 和 IPv6" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:190 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:280 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:218 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:251 msgid "IPv4 only" msgstr "僅 IPv4" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:68 +msgid "IPv6" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:236 +msgid "IPv6 Masquerading" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:281 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:219 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:252 msgid "IPv6 only" msgstr "僅 IPv6" @@ -490,9 +575,14 @@ msgstr "僅 IPv6" msgid "Inbound device" msgstr "輸入設備" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:186 +msgid "Include File" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:40 msgid "" -"Incoming IPv4%{proto?, protocol %{proto#%{next?, }%{item.types?IPv4 and IPv6:IPv6}:" +"IPv4}%{proto?, protocol %{proto#%{next?, }%{item.types?%{item.name}ICMP " "with types %{item.types#%{next?, }%{item}}:" "%{item.name}}}}%{mark?, mark %{helper.val}:%{helper.val}}}" msgstr "" -"傳入 IPv4%{proto?,協定:%{proto#%{next?, }%{item.types?%{item.name}ICMP 包含類型:" -"%{item.types#%{next?, }%{item}}:%{item.name}}}}%{mark?,標記:%{mark.val}}%{helper?,幫手:%{helper.inv?%{helper.val}:%{helper.val}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:61 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:143 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:179 +msgid "Initial Hash Size" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:145 msgid "Input" msgstr "入站資料" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:234 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:288 msgid "Internal IP address" msgstr "內部 IP 位址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:293 msgid "Internal port" msgstr "內部埠" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:283 msgid "Internal zone" msgstr "內部區域" @@ -537,11 +622,15 @@ msgstr "不正確的差異服務的程式碼點 DSCP標記" msgid "Invalid limit value" msgstr "不正確的限制值" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:46 +msgid "Invalid set name" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:382 msgid "Limit burst" msgstr "限制爆潰" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:267 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:293 msgid "Limit log messages" msgstr "限制日誌資訊量" @@ -549,9 +638,9 @@ msgstr "限制日誌資訊量" msgid "Limit matching" msgstr "限制相符" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:79 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:96 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:74 msgid "" "Limit matching to %{limit.num} packets per %{limit.unit}%{limit.burst? burst %{limit.burst}}" @@ -559,7 +648,8 @@ msgstr "" "限制相符到 %{limit.num} 封包數每 %{limit.unit}%{limit." "burst? burst %{limit.burst}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:165 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 msgid "Limited masquerading enabled" msgstr "已啟用有限偽裝" @@ -567,25 +657,25 @@ msgstr "已啟用有限偽裝" msgid "Limits traffic matching to the specified rate." msgstr "限制流量相符到指定速率." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "Loopback source IP" msgstr "回送來源IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:212 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:287 msgid "MASQUERADE - Automatically rewrite to outbound interface IP" msgstr "MASQUERADE偽裝 - 自動重置到輸出界面的IP" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:170 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:174 msgid "MSS clamping" msgstr "MSS 鉗制" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:161 msgid "Masquerading" msgstr "IP 動態偽裝" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:163 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:209 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:213 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:147 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:192 msgid "Match" msgstr "相符規則" @@ -601,30 +691,30 @@ msgstr "相符 ICMP 型別" msgid "Match device" msgstr "相符裝置" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:195 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:267 msgid "Match forwarded traffic directed at the given IP address." msgstr "相符轉發的流量指向給予的IP位址." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:200 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:275 msgid "" "Match forwarded traffic directed at the given destination port or port range." msgstr "相符轉發的流量指向給予的目標埠或範圍埠." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:181 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 msgid "Match forwarded traffic from this IP or range." msgstr "從這個IP或範圍相符轉發的流量." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:186 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:258 msgid "" "Match forwarded traffic originating from the given source port or port range." msgstr "相符轉發的流量源自給定的來源埠或範圍埠." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match helper" msgstr "相符小幫手" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:222 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:276 msgid "" "Match incoming traffic directed at the given destination port or port range " "on this host" @@ -634,8 +724,8 @@ msgstr "相符指向此主機上指定目標埠或目標埠範圍的入站流量 msgid "Match mark" msgstr "相符標記" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:322 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:442 msgid "Match traffic using the specified connection tracking helper." msgstr "相符流量使用特定的連線追蹤小幫手." @@ -643,7 +733,7 @@ msgstr "相符流量使用特定的連線追蹤小幫手." msgid "Matches a specific firewall mark or a range of different marks." msgstr "相符特定的FW防火牆標記或者不同的範圍標記." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:239 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:328 msgid "Matches forwarded traffic using the specified outbound network device." msgstr "相符正使用特定輸出網路設備的轉發流量." @@ -651,6 +741,14 @@ msgstr "相符正使用特定輸出網路設備的轉發流量." msgid "Matches traffic carrying the specified DSCP marking." msgstr "相符附帶特定之DSCP(區別服務代碼點)標記的流量." +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:112 +msgid "Max Entries" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:171 +msgid "Max Length" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:383 msgid "" "Maximum initial number of packets to match: this number gets recharged by " @@ -659,73 +757,91 @@ msgstr "" "相符的最大初始封包數量; 每次未達到上述指定的限制時,此數量將逐一地充實,直到此" "數量為止." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:447 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:477 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:350 msgid "Monday" msgstr "星期一" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:271 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:487 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:360 msgid "Month Days" msgstr "每月天數" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:175 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:44 msgid "NAT Rules" msgstr "NAT 規則" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:128 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 msgid "" "NAT rules allow fine grained control over the source IP to use for outbound " "or forwarded traffic." msgstr "NAT 規則允許對來源IP進行精細控制以便用於輸出或是轉發流量." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:159 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:182 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:41 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:51 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:209 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:143 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:121 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:188 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:123 msgid "Name" msgstr "名稱" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:217 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:165 +msgid "Netmask" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:271 msgid "Only match incoming traffic directed at the given IP address." msgstr "僅相符指定目的 IP 位址的入站流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:198 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:252 msgid "Only match incoming traffic from these MACs." msgstr "僅相符來自這些 MAC 的入站流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 msgid "Only match incoming traffic from this IP or range." msgstr "僅相符來自此 IP 或 IP 範圍的入站流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:208 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:262 msgid "" "Only match incoming traffic originating from the given source port or port " "range on the client host" msgstr "僅相符源自客戶端主機上給定來源埠或來源埠範圍的入站流量" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:252 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:327 msgid "Outbound device" msgstr "輸出設備" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:173 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:242 msgid "Outbound zone" msgstr "輸出區域" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:62 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:63 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:146 msgid "Output" msgstr "出站資料" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:286 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:250 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:74 +msgid "Packet Field Match" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:75 +msgid "" +"Packet fields to match upon.
    Syntax: direction_datatype. e.g.: " +"src_port, dest_net.
    Directions: src, dst. " +"Datatypes: ip, port, mac, net, set.
    Direction prefixes are " +"optional.
    *Note: datatype set is unsupported in fw4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:467 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339 msgid "Passes additional arguments to iptables. Use with care!" msgstr "傳遞附加引數到 iptables,小心使用!" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:277 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:303 msgid "" "Passing raw iptables arguments to source and destination traffic " "classification rules allows to match packets based on other criteria than " @@ -737,75 +853,93 @@ msgstr "" "外的其他條件來相符封包. 這些選項應格外小心, 因為無效值可能會使防火牆規則集損" "壞, 從而對外完全暴露所有服務." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:132 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:187 +msgid "Path to file of CIDRs, subnets, host IPs, etc.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:155 #: applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json:26 msgid "Port Forwards" msgstr "埠轉發" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:130 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:153 msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "通訊埠轉發允許 Internet 上的遠端電腦連線到內部網路中的特定電腦或服務。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:157 +msgid "Port range" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:233 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:288 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:169 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:238 msgid "Protocol" msgstr "協定" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:240 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:294 msgid "" "Redirect matched incoming traffic to the given port on the internal host" msgstr "重新導向相符的入站流量到內部主機給予的埠號" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:235 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:289 msgid "Redirect matched incoming traffic to the specified internal host" msgstr "重新導向相符的入站流量到指定的內部主機" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:88 -msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "需要硬體 NAT 支援。目前 mt7621 已實現" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:121 +msgid "Refer To External Set" +msgstr "" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:244 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "Reflection zones" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:89 +msgid "Requires hardware NAT support." +msgstr "需要硬體 NAT 支援。" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:266 msgid "Restrict Masquerading to given destination subnets" msgstr "要限制 IP 動態偽裝的目標子網" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:255 msgid "Restrict Masquerading to given source subnets" msgstr "要限制 IP 動態偽裝的來源子網路" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:187 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:276 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:231 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:249 msgid "Restrict to address family" msgstr "限制到位址群" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:215 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:293 msgid "Rewrite IP address" msgstr "重置IP位址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:216 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 msgid "Rewrite matched traffic to the specified source IP address." msgstr "重置已相符流量到特定的來源IP位址." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:230 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:308 msgid "Rewrite matched traffic to the specified source port or port range." msgstr "重置已相符流量到特定的來源埠或範圍埠." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:229 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:307 msgid "Rewrite port" msgstr "重置埠號" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:75 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:76 msgid "Routing/NAT Offloading" msgstr "路由/NAT 卸載" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:211 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 msgid "SNAT - Rewrite to specific source IP or port" msgstr "SNAT - 重置到特定的來源IP或埠" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:452 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:482 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:355 msgid "Saturday" msgstr "星期六" @@ -821,36 +955,36 @@ msgstr "" "在建立的連接上設置給定的標記值. 格式為value [/ mask]. 如果指定了子網路遮罩," "則僅修改子網路遮罩中設置的那些位元." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:84 msgid "Software based offloading for routing/NAT" msgstr "軟體式的 路由/NAT 卸載" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:83 msgid "Software flow offloading" msgstr "軟體式流量卸載" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:202 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 msgid "Source IP address" msgstr "來源 IP 位址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:197 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:352 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:251 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 msgid "Source MAC address" msgstr "來源 MAC 位址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:353 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:180 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:249 msgid "Source address" msgstr "來源位址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:207 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:355 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:261 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:257 msgid "Source port" msgstr "來源埠" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:191 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:346 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:237 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:368 msgid "Source zone" msgstr "來源區域" @@ -860,51 +994,55 @@ msgid "" "network device." msgstr "指定是否將此流量規則綁定到特定的輸入或輸出的網絡設備." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:253 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:307 msgid "" "Specifies whether to use the external or the internal IP address for " "reflected traffic." msgstr "指定是使用外部IP地址還是內部IP地址來映射流量." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:290 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:506 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:379 msgid "Start Date (yyyy-mm-dd)" msgstr "開始日期(西元年-月-日)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:468 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:282 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:498 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:371 msgid "Start Time (hh:mm:ss)" msgstr "啟動時間 (小時.分鐘.秒)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:294 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:510 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:383 msgid "Stop Date (yyyy-mm-dd)" msgstr "停止日期(西元年-月-日)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:472 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:286 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:502 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:375 msgid "Stop Time (hh:mm:ss)" msgstr "停止時間 (小時.分鐘.秒)" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:446 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:260 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:129 +msgid "Storage Method" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:476 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:349 msgid "Sunday" msgstr "星期日" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:682 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:692 msgid "" "The existing firewall configuration needs to be changed for LuCI to function " "properly." msgstr "已存在的防火牆設定需要被變更以便 LuCI發揮正常功效." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:38 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:39 msgid "" "The firewall creates zones over your network interfaces to control network " "traffic flow." msgstr "防火牆透過在網路介面上建立區域來控制網路流量。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:217 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:308 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:334 msgid "" "The options below control the forwarding policies between this zone (%s) and " "other zones. Destination zones cover forwarded traffic " @@ -919,7 +1057,7 @@ msgstr "" "如:一條允許從 LAN 到 WAN 的轉發規則並不隱含有允許相反方向從 WAN 到 " "LAN 的流量轉發。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:117 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:119 msgid "" "This section defines common properties of %q. The input and " "output options set the default policies for traffic entering and " @@ -931,18 +1069,18 @@ msgstr "" "域入站和出站流量的預設策略,轉發選項描述該區域內不同網路之間的流量轉" "發策略。覆蓋網路指定從屬於這個區域的網路。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:450 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:264 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:480 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:353 msgid "Thursday" msgstr "星期四" #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:183 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:137 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:182 msgid "Time Restrictions" msgstr "時間限制" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:484 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:298 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:514 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:387 msgid "Time in UTC" msgstr "UTC 時間" @@ -950,6 +1088,10 @@ msgstr "UTC 時間" msgid "Time restrictions are enabled for this rule" msgstr "對該規則啟用了時間限制" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:195 +msgid "Timeout" +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:77 msgid "" "To %{dest}%{dest_device?, interface %{dest_device}}%{dest_ip?, IP " @@ -964,7 +1106,7 @@ msgstr "" "%{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:49 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:55 msgid "" "To %{dest}%{dest_device?, via interface %{dest_device}}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:57 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:61 msgid "" "To %{dest}%{dest_ip?, IP %{dest_ip#%{next?, }%{item.ival}}}%{dest_port?,埠:%{dest_port#%{next?, }%{item.ival}
    }}" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:405 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:435 msgid "Tracking helper" msgstr "追蹤小幫手" @@ -1008,8 +1150,8 @@ msgstr "" "通訊規則定義了不同區域間的資料包傳輸策略,例如:拒絕一些主機之間的通訊,開放" "路由器 WAN 上的埠。" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:448 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:478 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:351 msgid "Tuesday" msgstr "星期二" @@ -1017,18 +1159,24 @@ msgstr "星期二" msgid "Unable to save contents: %s" msgstr "無法儲存內容:%s" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:277 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:427 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:196 +msgid "" +"Unit: seconds. Default 0 means the entry is added permanently " +"to the set.
    Max: 2147483 seconds." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:337 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:457 msgid "Unknown or not installed conntrack helper \"%s\"" msgstr "未知或未安裝的連線跟蹤小幫手 \"%s\"" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:140 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:144 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:185 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:189 msgid "Unnamed NAT" msgstr "未命名NAT" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:145 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:160 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:168 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:183 msgid "Unnamed forward" msgstr "未命名轉發" @@ -1037,15 +1185,19 @@ msgstr "未命名轉發" msgid "Unnamed rule" msgstr "未命名規則" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:122 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:56 +msgid "Unnamed set" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:124 msgid "Unnamed zone" msgstr "未命名區域" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:585 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:595 msgid "Unrecognized protocol" msgstr "無法識別的協定" -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:683 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:693 msgid "" "Upon pressing \"Continue\", \"redirect\" sections with target \"SNAT\" will " "be converted to \"nat\" sections and the firewall will be restarted to apply " @@ -1054,21 +1206,27 @@ msgstr "" "一旦按下\"繼續\"後, 附帶目標為\" SNAT\"的\"重導向\"欄位將轉換為\" nat\"欄位," "防火牆將重新啟動以套用更新的設定值." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:257 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:311 msgid "Use external IP address" msgstr "使用外部IP位址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:256 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:310 msgid "Use internal IP address" msgstr "使用內部IP位址" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:221 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:374 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:318 +msgid "Use ipset" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:225 msgid "" "Use this option to classify zone traffic by raw, non-uci managed " "network devices." msgstr "依照原生, 非-uci管理的網路設備採用選項來分類流量." -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:226 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:230 msgid "" "Use this option to classify zone traffic by source or destination subnet " "instead of networks or devices." @@ -1078,17 +1236,17 @@ msgstr "使用此選項可以按來源或目的子網路(而不是網路或裝 msgid "Valid firewall mark required" msgstr "需要有效的防火牆標記" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:449 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:263 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:479 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:352 msgid "Wednesday" msgstr "星期三" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:441 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:255 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:471 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:344 msgid "Week Days" msgstr "每週日數" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:386 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:416 msgid "XOR firewall mark" msgstr "按位元互斥XOR防火牆標記" @@ -1096,109 +1254,234 @@ msgstr "按位元互斥XOR防火牆標記" msgid "XOR mark" msgstr "按位元互斥XOR標記" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:135 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:28 +msgid "Your device does not run firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:26 +msgid "Your device runs firewall4." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:137 msgid "Zone ⇒ Forwardings" msgstr "區域 ⇒ 轉發" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:94 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:95 msgid "Zones" msgstr "區域" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:381 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:316 +msgid "" +"Zones from which reflection rules shall be created. If unset, only the " +"destination zone is used." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:411 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:70 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:153 msgid "accept" msgstr "接受" #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:267 #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:461 -#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:483 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:212 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:243 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:264 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:358 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:373 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:407 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:190 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:203 +#: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:484 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:266 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:297 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:324 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:388 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:403 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:437 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:444 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:262 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:278 msgid "any" msgstr "任意" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:40 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:46 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "any zone" msgstr "所有區域" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:385 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:297 +msgid "any/all" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:415 msgid "apply firewall mark" msgstr "套用防火牆標記" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:384 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:414 msgid "assign conntrack helper" msgstr "指定連線跟蹤幫手" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:192 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:220 +msgid "automatic" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:130 +msgid "bitmap" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:136 +msgid "bitmap is ipv4 only" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "day" msgstr "日" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:233 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:92 +msgid "dest_ip: Destination IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:94 +msgid "dest_mac: Destination MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:95 +msgid "dest_net: Destination (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:93 +msgid "dest_port: Destination Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:97 +msgid "dest_set: Destination ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:311 msgid "do not rewrite" msgstr "不重置" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:383 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:413 msgid "don't track" msgstr "不跟蹤" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:380 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:150 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:410 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:69 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:152 msgid "drop" msgstr "丟棄" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:21 +msgid "" +"firewall4 supports referencing and creating IP sets to simplify matching of " +"large address lists without the need to create one rule per item to match. " +"Port ranges in ipsets are unsupported by firewall4.
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:158 +msgid "fromport-toport" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:131 +msgid "hash" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "hour" msgstr "小時" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:80 +msgid "ip: IP addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:152 +msgid "ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:144 +msgid "ip[/cidr]
    For use with Match datatypes: *_ip." +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:69 +msgid "ipv4" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:132 +msgid "list" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:82 +msgid "mac: MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:107 +msgid "macaddr|ip[/cidr]
    " +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "minute" msgstr "分鐘" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:382 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:67 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:149 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:83 +msgid "net: (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:81 +msgid "port: Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:412 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:151 msgid "reject" msgstr "拒絕" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:68 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:72 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:89 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:61 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:67 msgid "second" msgstr "秒" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:49 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:58 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:82 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:85 +msgid "set: ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:91 +msgid "src_Set: Source ipset*" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:86 +msgid "src_ip: Source IP" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:88 +msgid "src_mac: Source MAC addr" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:89 +msgid "src_net: Source (sub)net" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:87 +msgid "src_port: Source Port" +msgstr "" + +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:53 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:62 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:86 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:65 #: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:78 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:50 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:56 msgid "this device" msgstr "此裝置" -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:116 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:216 -#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:307 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:118 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:220 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:333 msgid "this new zone" msgstr "新區域" @@ -1210,6 +1493,11 @@ msgstr "無限" msgid "unspecified" msgstr "未規定" +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:113 +#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/ipsets.js:172 +msgid "up to 65536 entries." +msgstr "" + #: applications/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js:338 msgid "valid firewall mark" msgstr "有效正確的防火牆標記" diff --git a/package/luci/applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json b/package/luci/applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json index 8fd1e9cae2..f024dcfe25 100644 --- a/package/luci/applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json +++ b/package/luci/applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json @@ -49,6 +49,14 @@ } }, + "admin/network/firewall/ipsets": { + "title": "IP Sets", + "order": 45, + "action": { + "type": "view", + "path": "firewall/ipsets" + } + }, "admin/network/firewall/custom": { "title": "Custom Rules", diff --git a/package/luci/applications/luci-app-openvpn/Makefile b/package/luci/applications/luci-app-openvpn/Makefile index 4dfcc682ce..de47d6307a 100644 --- a/package/luci/applications/luci-app-openvpn/Makefile +++ b/package/luci/applications/luci-app-openvpn/Makefile @@ -13,4 +13,4 @@ PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua b/package/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua index 51fe606336..03ce38e9d2 100644 --- a/package/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua +++ b/package/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua @@ -161,7 +161,7 @@ local knownParams = { translate("Policy level over usage of external programs and scripts") }, { ListValue, "compress", - { "lzo", "lz4", "stub-v2"}, + { "frames_only", "lzo", "lz4", "stub-v2"}, translate("Security recommendation: It is recommended to not enable compression and set this parameter to `stub-v2`") }, } }, @@ -750,6 +750,10 @@ local knownParams = { "tls_crypt", "/etc/openvpn/tlscrypt.key", translate("Encrypt and authenticate all control channel packets with the key") }, + { Value, + "tls_crypt_v2", + "/etc/openvpn/servertlscryptv2.key", + translate("Encrypt and authenticate all control channel packets with the key, version 2.") }, -- { Value, -- "askpass", -- "[file]", diff --git a/package/luci/applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm b/package/luci/applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm index 0792763085..c464ef4781 100644 --- a/package/luci/applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm +++ b/package/luci/applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm @@ -9,7 +9,7 @@

    <%:Overview%> » - <%=luci.i18n.translatef("Instance \"%s\"", self.instance)%> + <%=luci.i18n.translatef("Instance \"%s\"", pcdata(self.instance))%>

    <% if self.mode == "basic" then %> <%:Switch to advanced configuration%> »

    diff --git a/package/luci/applications/luci-app-openvpn/po/ar/openvpn.po b/package/luci/applications/luci-app-openvpn/po/ar/openvpn.po index a4f92cb962..1574282d9d 100644 --- a/package/luci/applications/luci-app-openvpn/po/ar/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/ar/openvpn.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:35+0200\n" "PO-Revision-Date: 2021-03-08 13:04+0000\n" "Last-Translator: Said Zakaria \n" -"Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" @@ -103,7 +103,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -188,7 +188,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -266,6 +266,11 @@ msgstr "مفعل" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -384,7 +389,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -507,11 +512,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -519,7 +524,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -739,16 +744,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -758,7 +763,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/bg/openvpn.po b/package/luci/applications/luci-app-openvpn/po/bg/openvpn.po index f37fc62689..ecbd3220cf 100644 --- a/package/luci/applications/luci-app-openvpn/po/bg/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/bg/openvpn.po @@ -3,20 +3,20 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-19 19:35+0200\n" -"PO-Revision-Date: 2021-08-26 11:44+0000\n" -"Last-Translator: Iskren Mihaylov \n" -"Language-Team: Bulgarian \n" +"Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.16.2-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" -msgstr "" +msgstr "'net30', 'p2p' или 'subnet'" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:481 msgid "Accept options pushed from server" @@ -101,7 +101,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -186,7 +186,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -264,6 +264,11 @@ msgstr "Разрешен" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -382,7 +387,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -505,11 +510,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -517,7 +522,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -737,16 +742,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -756,7 +761,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/bn_BD/openvpn.po b/package/luci/applications/luci-app-openvpn/po/bn_BD/openvpn.po index d0d83b9d0d..70d709d994 100644 --- a/package/luci/applications/luci-app-openvpn/po/bn_BD/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/bn_BD/openvpn.po @@ -6,7 +6,7 @@ msgstr "" "PO-Revision-Date: 2021-10-08 17:53+0000\n" "Last-Translator: Rayhan Nabi \n" "Language-Team: Bengali (Bangladesh) \n" +"librecmc/luciapplicationsopenvpn/bn_BD/>\n" "Language: bn_BD\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -101,7 +101,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -186,7 +186,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -264,6 +264,11 @@ msgstr "সক্রিয়" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -382,7 +387,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -505,11 +510,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -517,7 +522,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -737,16 +742,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -756,7 +761,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/ca/openvpn.po b/package/luci/applications/luci-app-openvpn/po/ca/openvpn.po index ad8279269e..57269d0f6c 100644 --- a/package/luci/applications/luci-app-openvpn/po/ca/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/ca/openvpn.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:40+0200\n" -"PO-Revision-Date: 2021-09-17 06:52+0000\n" -"Last-Translator: Roger Pueyo Centelles \n" -"Language-Team: Catalan \n" +"Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.16.2-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -104,7 +104,7 @@ msgstr "Canvia la prioritat del procés" msgid "Change to directory before initialization" msgstr "Canvia el directori abans de la inicialització" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Comprova el certificat de peer contra un CRL" @@ -189,7 +189,7 @@ msgstr "No executis ifconfig" msgid "Don't add routes automatically" msgstr "No afegeixis rutes automàticament" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "No desis a la memòria cau contrasenyes --askpass o --auth-user-pass" @@ -267,6 +267,11 @@ msgstr "Activat" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Xifra d'encriptació per paquets" @@ -385,7 +390,7 @@ msgstr "Número de línies per historial de fitxer de registre" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Accepta connexions només d'un cert nom X509" @@ -508,11 +513,11 @@ msgstr "Renegocia clau de canal de dades després de segons" msgid "Replay protection sliding window size" msgstr "Mida de la finestra lliscant de protecció de reproducció" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Requereix una designació explícita al certificat" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Requereix ús de clau explícit al certificat" @@ -520,7 +525,7 @@ msgstr "Requereix ús de clau explícit al certificat" msgid "Restart after remote ping timeout" msgstr "Reinicia després d'excedir el temps d'espera de ping remot" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -741,16 +746,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -760,7 +765,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" @@ -797,7 +802,7 @@ msgstr "Utilitza el nom d'usuari com a nom comú" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:368 msgid "VPN" -msgstr "" +msgstr "XPV (VPN)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:64 msgid "Write log to file" diff --git a/package/luci/applications/luci-app-openvpn/po/cs/openvpn.po b/package/luci/applications/luci-app-openvpn/po/cs/openvpn.po index 008d8a8f4a..1241074042 100644 --- a/package/luci/applications/luci-app-openvpn/po/cs/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/cs/openvpn.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2020-02-02 09:02+0000\n" -"Last-Translator: Pavel Borecki \n" -"Language-Team: Czech \n" +"Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 3.11-dev\n" +"X-Generator: Weblate 5.0.2\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -101,7 +101,7 @@ msgstr "Změnit prioritu procesu" msgid "Change to directory before initialization" msgstr "Změnit na adresář před inicializací" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" "Zkontrolovat certifikát druhé strany proti revokačnímu seznamu certifikátů " @@ -148,7 +148,7 @@ msgstr "Interval opakování připojení" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:564 msgid "Cryptography" -msgstr "" +msgstr "Kryptografie" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:233 msgid "Delay n seconds after connection" @@ -188,7 +188,7 @@ msgstr "Ve skutečnosti nespouÅ¡tět příkazy ifconfig/netsh" msgid "Don't add routes automatically" msgstr "Nepřidávat trasy automaticky" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "Neukládat --askpass nebo --auth-user-pass passwords do mezipaměti" @@ -266,6 +266,12 @@ msgstr "Zapnuto" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "Å ifrovat a autentizovat vÅ¡echny pakety řídícího kanálu pomocí klíče" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Å ifrovat a ověřovat vÅ¡echny pakety ovládacího kanálu s klíčem, verze 2." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Použitá Å¡ifra pro pakety" @@ -300,7 +306,7 @@ msgstr "Ukončit při selhání vyjednávání TLS" #: applications/luci-app-openvpn/root/usr/share/rpcd/acl.d/luci-app-openvpn.json:3 msgid "Grant access to OpenVPN configuration" -msgstr "" +msgstr "Udělit oprávnění k OpenVPN konfiguraci" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:573 msgid "HMAC authentication for packets" @@ -376,7 +382,7 @@ msgstr "Maximální počet odchozích TCP paketů ve frontě" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:168 msgid "Networking" -msgstr "" +msgstr "Síťování" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:447 msgid "Number of allocated broadcast buffers" @@ -390,7 +396,7 @@ msgstr "Počet řádků ve vyrovnávací paměti historie protokolu" msgid "OVPN configuration file upload" msgstr "Nahrání konfiguračního souboru OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Přijmout pouze spojení z daného X.509 názvu" @@ -514,11 +520,11 @@ msgstr "Znovuvyjednat klíč datového kanálu po n sekundách" msgid "Replay protection sliding window size" msgstr "Velikost posuvného okna ochrany proti přehrání" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Vyžadovat explicitní označení na certifikátu (zastaralé)" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Vyžadovat explicitní označení klíče u certifikátu" @@ -526,7 +532,7 @@ msgstr "Vyžadovat explicitní označení klíče u certifikátu" msgid "Restart after remote ping timeout" msgstr "Vyvolat SIGUSR1 restart pro vyprÅ¡ení časového limitu ping protistrany" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Omezit povolené Å¡ifry pro vyjednání" @@ -578,12 +584,16 @@ msgid "" "Security recommendation: It is recommended to not enable compression and set " "this parameter to `no`" msgstr "" +"Bezpečnostní doporučení: Doporučuje se nepovolovat kompresi a nastavit tento " +"parametr na `ne`" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:165 msgid "" "Security recommendation: It is recommended to not enable compression and set " "this parameter to `stub-v2`" msgstr "" +"Bezpečnostní doporučení: Doporučuje se nepovolovat kompresi a nastavit tento " +"parametr na `stub-v2`" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:85 msgid "Select template ..." @@ -595,7 +605,7 @@ msgstr "Poslat protistraně oznámení při odpojení" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:15 msgid "Service" -msgstr "" +msgstr "Služba" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:266 msgid "Set TCP/UDP MTU" @@ -747,16 +757,16 @@ msgid "" "configuration." msgstr "Konfigurační soubor OVPN (%s) nebyl nalezen, zkontrolujte konfiguraci." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "Nejvyšší podporovaná verze TLS" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "Směr klíče pro možnosti 'tls-auth' a 'secret'" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "Nejnižší podporovaná verze TLS" @@ -768,7 +778,7 @@ msgstr "" "Konfigurační soubor OVPN (%s) je příliÅ¡ velký pro online úpravy v LuCI (≥ " "100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Zcela zakázat vyjednání Å¡ifry" @@ -783,7 +793,7 @@ msgstr "Typ použitého zařízení" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 msgid "Upload" -msgstr "Nahrát" +msgstr "Nahráno" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 msgid "Upload ovpn file" @@ -805,7 +815,7 @@ msgstr "Použít uživatelské jméno jako Common Name" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:368 msgid "VPN" -msgstr "" +msgstr "VPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:64 msgid "Write log to file" diff --git a/package/luci/applications/luci-app-openvpn/po/da/openvpn.po b/package/luci/applications/luci-app-openvpn/po/da/openvpn.po index c1b57b58c6..ab258de49e 100644 --- a/package/luci/applications/luci-app-openvpn/po/da/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/da/openvpn.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-19 19:35+0200\n" -"PO-Revision-Date: 2022-10-29 20:58+0000\n" +"PO-Revision-Date: 2023-04-24 17:51+0000\n" "Last-Translator: drax red \n" -"Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -103,7 +103,7 @@ msgstr "Skift procesprioritet" msgid "Change to directory before initialization" msgstr "Skift til mappe før initialisering" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Tjek peer-certifikat mod en CRL" @@ -188,7 +188,7 @@ msgstr "Du skal ikke udføre ifconfig" msgid "Don't add routes automatically" msgstr "Tilføj ikke ruter automatisk" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "Gem ikke adgangskoderne --askpass eller --auth-user-pass i cache" @@ -260,12 +260,18 @@ msgstr "Aktiver management interface pÃ¥ IP port" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:104 msgid "Enabled" -msgstr "Aktiveret" +msgstr "Aktiver" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:752 msgid "Encrypt and authenticate all control channel packets with the key" msgstr "Krypterer og autentificerer alle kontrolkanalpakker med nøglen" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Krypterer og autentificerer alle kontrolkanalpakker med nøglen, version 2." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Krypteringscifre for pakker" @@ -390,7 +396,7 @@ msgstr "Antal linjer for logfilens historik" msgid "OVPN configuration file upload" msgstr "OVPN-konfigurationsfil upload" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Accepter kun forbindelser fra det givne X509-navn" @@ -515,11 +521,11 @@ msgstr "Genforhandle data kæde. nøgle efter sekunder" msgid "Replay protection sliding window size" msgstr "Størrelsen af det glidende vindue til beskyttelse mod gentagelse" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Krav om explicit betegnelse pÃ¥ certifikatet" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Kræv eksplicit brug af nøgle pÃ¥ certifikatet" @@ -527,7 +533,7 @@ msgstr "Kræv eksplicit brug af nøgle pÃ¥ certifikatet" msgid "Restart after remote ping timeout" msgstr "Genstart efter timeout for fjern-ping" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Begrænser de tilladte cifre, der kan forhandles" @@ -755,16 +761,16 @@ msgstr "" "OVPN-konfigurationsfilen (%s) kunne ikke findes, tjek venligst din " "konfiguration." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "Den højeste understøttede TLS-version" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "Den vigtigste retning for 'tls-auth' og 'hemmelige' indstillinger" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "Den lavest understøttede TLS-version" @@ -776,7 +782,7 @@ msgstr "" "Størrelsen af OVPN-konfigurationsfilen (%s) er for stor til online " "redigering i LuCI (≥ 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Dette deaktiverer fuldstændig krypteringsforhandling" diff --git a/package/luci/applications/luci-app-openvpn/po/de/openvpn.po b/package/luci/applications/luci-app-openvpn/po/de/openvpn.po index 5383e6b3ce..e81617c556 100644 --- a/package/luci/applications/luci-app-openvpn/po/de/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/de/openvpn.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-26 17:57+0200\n" -"PO-Revision-Date: 2022-10-30 15:06+0000\n" -"Last-Translator: ssantos \n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -102,7 +102,7 @@ msgstr "Prozess-Priorität anpassen" msgid "Change to directory before initialization" msgstr "Vor der Initialisierung in Verzeichnis wechseln" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Teilnehmerzertifikat mit Sperrliste abgleichen" @@ -187,7 +187,7 @@ msgstr "Schnittstellenkonfiguration nicht durchführen" msgid "Don't add routes automatically" msgstr "Netzwerkrouten nicht automatisch einrichten" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "Authentifikationsdaten nicht zwischenspeichern" @@ -268,6 +268,13 @@ msgstr "" "Verschlüsseln und authentifizieren aller Kontrollkanalpakete mit dem " "Schlüssel" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Verschlüsselung und Authentifizierung aller Kontrollkanalpakete mit dem " +"Schlüssel, Version 2." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Verschlüsselungsalgorithmus für Pakete" @@ -302,7 +309,7 @@ msgstr "Terminieren nach fehlgeschlagenem Schlüsselaustausch" #: applications/luci-app-openvpn/root/usr/share/rpcd/acl.d/luci-app-openvpn.json:3 msgid "Grant access to OpenVPN configuration" -msgstr "Gewähre Zugriff auf die OpenVPN-Konfiguration" +msgstr "Zugriff auf die OpenVPN-Konfiguration gewähren" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:573 msgid "HMAC authentication for packets" @@ -392,7 +399,7 @@ msgstr "Anzahl der Zeilen im Protokoll-Zwischenspeicher" msgid "OVPN configuration file upload" msgstr "OVPN-Konfigurationsdatei hochladen" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Nur Verbindungen vom angegebenem X.509 Name zulassen" @@ -516,11 +523,11 @@ msgstr "Schlüssel nach maximaler Verbindungsdauer neu aushandeln" msgid "Replay protection sliding window size" msgstr "Fenstergröße für \"Replay\"-Schutz" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Verwendungszweck von Zertifikaten überprüfen" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Zertifikat explizit auf einfachen Verwendungszweck prüfen" @@ -528,7 +535,7 @@ msgstr "Zertifikat explizit auf einfachen Verwendungszweck prüfen" msgid "Restart after remote ping timeout" msgstr "Neu Starten nach Ping-Timeout an Gegenstellen" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Einschränkung der zulässigen zu verhandelnden Verschlüsselungen" @@ -706,7 +713,7 @@ msgstr "Format für Status-Datei" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:15 msgid "Switch to advanced configuration" -msgstr "Erweiterte Einstellungen" +msgstr "Wechsel in die erweiterten Einstellungen" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:18 msgid "Switch to basic configuration" @@ -758,16 +765,16 @@ msgstr "" "Die OVPN-Konfigurationsdatei (%s) konnte nicht gefunden werden, bitte " "überprüfen Sie Ihre Konfiguration." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "Die höchste unterstützte TLS-Version" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "Schlüssel-Richtung für die Optionen 'tls-auth' und 'secret'" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "Die niedrigste unterstützte TLS-Version" @@ -779,7 +786,7 @@ msgstr "" "Die Größe der OVPN-Konfigurationsdatei (%s) ist zu groß für die Online-" "Bearbeitung in der LuCI (≥ 100KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Vollständig Deaktivierung der Chiffren-Verhandlung" diff --git a/package/luci/applications/luci-app-openvpn/po/el/openvpn.po b/package/luci/applications/luci-app-openvpn/po/el/openvpn.po index faa4e241c4..71a3de4069 100644 --- a/package/luci/applications/luci-app-openvpn/po/el/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/el/openvpn.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-28 02:08+0200\n" "PO-Revision-Date: 2022-05-15 17:03+0000\n" "Last-Translator: MarioK239 \n" -"Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" @@ -103,7 +103,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -188,7 +188,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -266,6 +266,11 @@ msgstr "Ενεργοποιήθηκε" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -385,7 +390,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -508,11 +513,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -520,7 +525,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -740,16 +745,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -759,7 +764,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/en/openvpn.po b/package/luci/applications/luci-app-openvpn/po/en/openvpn.po index bc70d63042..f058558bae 100644 --- a/package/luci/applications/luci-app-openvpn/po/en/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/en/openvpn.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:35+0200\n" "PO-Revision-Date: 2022-07-03 10:25+0000\n" "Last-Translator: Hannu Nyman \n" -"Language-Team: English \n" "Language: en\n" "MIME-Version: 1.0\n" @@ -102,7 +102,7 @@ msgstr "Change process priority" msgid "Change to directory before initialization" msgstr "Change to directory before initialization" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Check peer certificate against a CRL" @@ -187,7 +187,7 @@ msgstr "Don't actually execute ifconfig" msgid "Don't add routes automatically" msgstr "Don't add routes automatically" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "Don't cache --askpass or --auth-user-pass passwords" @@ -265,6 +265,11 @@ msgstr "Enabled" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "Encrypt and authenticate all control channel packets with the key" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Encryption cipher for packets" @@ -383,7 +388,7 @@ msgstr "Number of lines for log file history" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Only accept connections from given X509 name" @@ -506,11 +511,11 @@ msgstr "Renegotiate data chan. key after seconds" msgid "Replay protection sliding window size" msgstr "Replay protection sliding window size" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Require explicit designation on certificate" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Require explicit key usage on certificate" @@ -518,7 +523,7 @@ msgstr "Require explicit key usage on certificate" msgid "Restart after remote ping timeout" msgstr "Restart after remote ping timeout" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -738,16 +743,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -757,7 +762,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/es/openvpn.po b/package/luci/applications/luci-app-openvpn/po/es/openvpn.po index 0adcd7b64c..15c596387a 100644 --- a/package/luci/applications/luci-app-openvpn/po/es/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/es/openvpn.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:41+0200\n" -"PO-Revision-Date: 2022-10-28 15:05+0000\n" -"Last-Translator: Franco Castillo \n" -"Language-Team: Spanish \n" +"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.16-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -101,7 +101,7 @@ msgstr "Cambiar la prioridad del proceso" msgid "Change to directory before initialization" msgstr "Cambiar a este directorio antes de inicializar" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Comprobar certificados contra un CRL" @@ -186,7 +186,7 @@ msgstr "No ejecutar ifconfig" msgid "Don't add routes automatically" msgstr "No añadir rutas automáticamente" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "No guardar las contraseñas --askpass o --auth-user-pass" @@ -266,6 +266,13 @@ msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" "Cifre y autentique todos los paquetes del canal de control con la clave" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Cifrar y autenticar todos los paquetes del canal de control con la clave, " +"versión 2." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Cifra de encriptación de paquetes" @@ -390,7 +397,7 @@ msgstr "Líneas en el archivo de registro histórico" msgid "OVPN configuration file upload" msgstr "Carga del archivo de configuración OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Aceptar solo conexiones desde este nombre X509" @@ -515,11 +522,11 @@ msgstr "Segundos tras los que renegociar la clave del canal del datos" msgid "Replay protection sliding window size" msgstr "Tamaño de la ventana deslizante de la protección de reproducción" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Designación explícita de certificado" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Clave de uso explícita de certificado" @@ -527,7 +534,7 @@ msgstr "Clave de uso explícita de certificado" msgid "Restart after remote ping timeout" msgstr "Reiniciar después de tiempo de espera de ping remoto" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Restringir los cifrados permitidos para ser negociados" @@ -756,16 +763,16 @@ msgstr "" "No se pudo encontrar el archivo de configuración OVPN (%s), verifique su " "configuración." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "La versión TLS más alta soportada" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "La dirección clave para las opciones 'tls-auth' y 'secret'" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "La versión TLS más baja soportada" @@ -777,7 +784,7 @@ msgstr "" "El tamaño del archivo de configuración OVPN (%s) es demasiado grande para la " "edición en línea en LuCI (≥ 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Esto desactiva completamente la negociación de cifrado" diff --git a/package/luci/applications/luci-app-openvpn/po/fa/openvpn.po b/package/luci/applications/luci-app-openvpn/po/fa/openvpn.po index 39ebac1012..bab4f9eae0 100644 --- a/package/luci/applications/luci-app-openvpn/po/fa/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/fa/openvpn.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-19 19:35+0200\n" -"PO-Revision-Date: 2022-05-20 01:17+0000\n" -"Last-Translator: Amir Mahdi ajoodani \n" -"Language-Team: Persian \n" +"Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -103,7 +103,7 @@ msgstr "تغییر اولویت پردازش" msgid "Change to directory before initialization" msgstr "قبل از مقدار دهی اولیه، به دایرکتوری تغییر دهید" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "گواهی همتا را در برابر یک CRL بررسی کنید" @@ -188,7 +188,7 @@ msgstr "در واقع ifconfig را اجرا نکن" msgid "Don't add routes automatically" msgstr "مسیریابی را به صورت خودکار اضافه نکن" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "رمزهای عبور --askpass یا --auth-user-pass را به صورت cache ذخیره نکن" @@ -266,6 +266,11 @@ msgstr "فعال شد" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "تمام بسته های کانال کنترل را با کلید مربوطه رمزگذاری و تصدیق کن" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "رمزگذاری و احراز هویت تمام بسته های کانال کنترل با کلید, نسخه 2." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "متد رمزگذاری برای بسته ها" @@ -390,7 +395,7 @@ msgstr "تعداد خطوط برای تاریخچه فایل log" msgid "OVPN configuration file upload" msgstr "آپلود فایل پیکربندی OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "فقط اتصالات از نام X509 تعیین شده را بپذیر" @@ -413,7 +418,7 @@ msgstr "بهینه سازی نوشتن TUN/TAP/UDP" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:11 msgid "Overview" -msgstr "بررسی اجمالی" +msgstr "مرور کلی" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:674 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:73 @@ -446,11 +451,11 @@ msgstr "لطفا یک فایل پیکربندی معتبر OVPN را برای Ø¢ #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:23 msgid "Please select a valid VPN template!" -msgstr "" +msgstr "لطفا یک قالب VPN معتبر انتخاب کنید!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:161 msgid "Policy level over usage of external programs and scripts" -msgstr "" +msgstr "سطح سیاست بیش از استفاده از برنامه ها و اسکریپت های خارجی است" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:141 msgid "Port" @@ -458,117 +463,117 @@ msgstr "پورت" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:156 msgid "Protocol" -msgstr "" +msgstr "پروتکل" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:530 msgid "Proxy timeout in seconds" -msgstr "" +msgstr "پایان زمان پروکسی در چند ثانیه" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:407 msgid "Push an ifconfig option to remote" -msgstr "" +msgstr "گزینه ifconfig را روی ریموت فشار دهید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:382 msgid "Push options to peer" -msgstr "" +msgstr "گزینه‌ها را برای همتا کردن فشار دهید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:350 msgid "Query management channel for private key" -msgstr "" +msgstr "کانال مدیریت پرس و جو برای کلید خصوصی" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:505 msgid "Randomly choose remote server" -msgstr "" +msgstr "به طور تصادفی سرور راه دور را انتخاب کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:432 msgid "Refuse connection if no custom client config" -msgstr "" +msgstr "در صورت عدم پیکربندی مشتری سفارشی، از اتصال خودداری کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:92 msgid "Remap SIGUSR1 signals" -msgstr "" +msgstr "سیگنال های SIGUSR1 را دوباره نقشه برداری کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:501 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:61 msgid "Remote host name or IP address" -msgstr "" +msgstr "نام میزبان راه دور یا آدرس IP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:316 msgid "Remote ping timeout" -msgstr "" +msgstr "پایان زمان پینگ از راه دور" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:720 msgid "Renegotiate data chan. key after bytes" -msgstr "" +msgstr "مذاکره مجدد در مورد کانال داده chan . کلید بعد از بایت" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:724 msgid "Renegotiate data chan. key after packets" -msgstr "" +msgstr "مذاکره مجدد در مورد کانال داده chan . کلید بعد از بسته ها" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:728 msgid "Renegotiate data chan. key after seconds" -msgstr "" +msgstr "مذاکره مجدد در مورد کانال داده chan . کلید بعد از ثانیه ها" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:636 msgid "Replay protection sliding window size" -msgstr "" +msgstr "پخش مجدد حفاظت اندازه پنجره کشویی" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" -msgstr "" +msgstr "به تعیین صریح در گواهی نیاز دارد" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" -msgstr "" +msgstr "استفاده از کلید صریح در گواهی الزامی است" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:320 msgid "Restart after remote ping timeout" -msgstr "" +msgstr "پس از اتمام زمان پینگ از راه دور، مجددا راه اندازی شود" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" -msgstr "" +msgstr "رمزهای مجاز مورد مذاکره را محدود کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:716 msgid "Retransmit timeout on TLS control channel" -msgstr "" +msgstr "ارسال مجدد تایم اوت در کانال کنترل TLS" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:525 msgid "Retry indefinitely on HTTP proxy errors" -msgstr "" +msgstr "برای خطاهای پروکسی HTTP به طور نامحدود دوباره امتحان کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:546 msgid "Retry indefinitely on Socks proxy errors" -msgstr "" +msgstr "برای خطاهای پراکسی Socks به طور نامحدود دوباره امتحان کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:412 msgid "Route subnet to client" -msgstr "" +msgstr "مسیریابی زیرشبکه به مشتری" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:145 msgid "Run script cmd on client connection" -msgstr "" +msgstr "اسکریپت cmd را در اتصال مشتری اجرا کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:149 msgid "Run script cmd on client disconnection" -msgstr "" +msgstr "اسکریپت cmd را در قطع ارتباط مشتری اجرا کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:124 msgid "Run up/down scripts for all restarts" -msgstr "" +msgstr "اسکریپت های بالا/پایین را برای همه راه اندازی مجدد اجرا کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:41 msgid "Save" -msgstr "" +msgstr "ذخیره" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:65 msgid "" "Section to add an optional 'auth-user-pass' file with your credentials (%s)" -msgstr "" +msgstr "بخشی برای افزودن یک فایل اختیاری 'auth-user-pass' با اعتبار شما (%s)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:44 msgid "Section to modify the OVPN config file (%s)" -msgstr "" +msgstr "بخشی برای تغییر فایل پیکربندی OVPN (%s)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:257 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:45 @@ -576,228 +581,234 @@ msgid "" "Security recommendation: It is recommended to not enable compression and set " "this parameter to `no`" msgstr "" +"توصیه امنیتی: توصیه می شود فشرده سازی را فعال نکنید و این پارامتر را روی " +"\"no\" تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:165 msgid "" "Security recommendation: It is recommended to not enable compression and set " "this parameter to `stub-v2`" msgstr "" +"توصیه امنیتی: توصیه می شود فشرده سازی را فعال نکنید و این پارامتر را روی " +"\"stub-v2\" تنظیم کنید" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:85 msgid "Select template ..." -msgstr "" +msgstr "انتخاب قالب ..." #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:496 msgid "Send notification to peer on disconnect" -msgstr "" +msgstr "ارسال اعلان به همتا در هنگام قطع اتصال" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:15 msgid "Service" -msgstr "" +msgstr "سرویس" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:266 msgid "Set TCP/UDP MTU" -msgstr "" +msgstr "TCP/UDP MTU را تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:397 msgid "Set aside a pool of subnets" -msgstr "" +msgstr "مجموعه ای از زیرشبکه ها را کنار بگذارید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:535 msgid "Set extended HTTP proxy options" -msgstr "" +msgstr "گزینه های توسعه یافته پروکسی HTTP را تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:20 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:13 msgid "Set output verbosity" -msgstr "" +msgstr "دراز نویسی خروجی را تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:442 msgid "Set size of real and virtual address hash tables" -msgstr "" +msgstr "اندازه جداول هش آدرس واقعی و مجازی را تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:292 msgid "Set the TCP/UDP receive buffer size" -msgstr "" +msgstr "اندازه بافر دریافت TCP/UDP را تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:288 msgid "Set the TCP/UDP send buffer size" -msgstr "" +msgstr "اندازه بافر ارسال TCP/UDP را تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:296 msgid "Set tun/tap TX queue length" -msgstr "" +msgstr "طول/صف TX را تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:213 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:29 msgid "Set tun/tap adapter parameters" -msgstr "" +msgstr "پارامترهای آداپتور tun/tap را تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:270 msgid "Set tun/tap device MTU" -msgstr "" +msgstr "MTU دستگاه tun/tap را تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:274 msgid "Set tun/tap device overhead" -msgstr "" +msgstr "سربار tun/tap دستگاه را تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:283 msgid "Set upper bound on TCP MSS" -msgstr "" +msgstr "کران بالایی را در TCP MSS تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:300 msgid "Shaping for peer bandwidth" -msgstr "" +msgstr "شکل دهی برای پهنای باند همتا" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:108 msgid "Shell cmd to execute after tun device open" -msgstr "" +msgstr "دستور shell را اجرا کنید تا بعد از باز شدن دستگاه تنظیم شود" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:116 msgid "Shell cmd to run after tun device close" -msgstr "" +msgstr "دستور shell را برای اجرا , پس از بستن دستگاه تنظیم کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:141 msgid "Shell command to verify X509 name" -msgstr "" +msgstr "دستور Shell برای تأیید نام X509" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:640 msgid "Silence the output of replay warnings" -msgstr "" +msgstr "خروجی هشدارهای پخش مجدد را خاموش کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:627 msgid "Size of cipher key" -msgstr "" +msgstr "اندازه کلید رمز" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:229 msgid "Specify a default gateway for routes" -msgstr "" +msgstr "یک دروازه پیش فرض برای مسیرها مشخص کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:561 msgid "Specify whether the client is required to supply a valid certificate" -msgstr "" +msgstr "مشخص کنید که آیا مشتری ملزم به ارائه گواهی معتبر است یا خیر" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:355 msgid "Start OpenVPN in a hibernating state" -msgstr "" +msgstr "OpenVPN را در حالت خواب زمستانی راه اندازی کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:117 msgid "Start/Stop" -msgstr "" +msgstr "شروع/پایان" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:106 msgid "Started" -msgstr "" +msgstr "شروع شد" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:100 msgid "Status file format version" -msgstr "" +msgstr "وضعیت نسخه فرمت فایل" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:15 msgid "Switch to advanced configuration" -msgstr "" +msgstr "به تنظیمات پیشرفته بروید" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:18 msgid "Switch to basic configuration" -msgstr "" +msgstr "به پیکربندی اولیه بروید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:181 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:21 msgid "TCP/UDP port # for both local and remote" -msgstr "" +msgstr "پورت TCP/UDP # هم برای محلی و هم از راه دور" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:185 msgid "TCP/UDP port # for local (default=1194)" -msgstr "" +msgstr "پورت TCP/UDP # برای محلی (پیش‌فرض=1194)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:189 msgid "TCP/UDP port # for remote (default=1194)" -msgstr "" +msgstr "پورت TCP/UDP # برای از راه دور (پیش فرض = 1194)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:712 msgid "TLS 1.3 or newer cipher" -msgstr "" +msgstr "TLS 1.3 یا رمز جدیدتر" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:704 msgid "TLS cipher" -msgstr "" +msgstr "رمز TLS" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:56 msgid "TOS passthrough (applies to IPv4 only)" -msgstr "" +msgstr "عبور TOS (فقط برای IPv4 اعمال می شود)" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:78 msgid "Template based configuration" -msgstr "" +msgstr "پیکربندی مبتنی بر الگو" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:437 msgid "Temporary directory for client-connect return file" -msgstr "" +msgstr "دایرکتوری موقت برای فایل بازگشتی اتصال مشتری" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:12 #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:40 msgid "The 'Name' field must not be empty!" -msgstr "" +msgstr "فیلد 'Name' نباید خالی باشد!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:22 msgid "" "The OVPN config file (%s) could not be found, please check your " "configuration." -msgstr "" +msgstr "فایل پیکربندی OVPN (%s) یافت نشد، لطفا پیکربندی خود را بررسی کنید." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" -msgstr "" +msgstr "بالاترین نسخه پشتیبانی شده TLS" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" -msgstr "" +msgstr "جهت کلیدی برای گزینه های 'tls-auth' و 'secret'" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" -msgstr "" +msgstr "پایین ترین نسخه پشتیبانی شده TLS" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:31 msgid "" "The size of the OVPN config file (%s) is too large for online editing in " "LuCI (≥ 100 KB)." msgstr "" +"اندازه فایل پیکربندی OVPN (%s) برای ویرایش آنلاین در LuCI بسیار بزرگ است " +"(بیش از 100 کیلوبایت)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" -msgstr "" +msgstr "این به طور کامل مذاکره رمزنگاری را غیرفعال می کند" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:732 msgid "Timeframe for key exchange" -msgstr "" +msgstr "بازه زمانی برای تبادل کلید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:205 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:25 msgid "Type of used device" -msgstr "" +msgstr "نوع دستگاه مورد استفاده" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 msgid "Upload" -msgstr "" +msgstr "بارگذاری" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 msgid "Upload ovpn file" -msgstr "" +msgstr "فایل ovpn را آپلود کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:510 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:97 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:103 msgid "Use protocol" -msgstr "" +msgstr "از پروتکل استفاده کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:209 msgid "Use tun/tap device node" -msgstr "" +msgstr "از گره دستگاه tun/tap استفاده کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:472 msgid "Use username as common name" -msgstr "" +msgstr "از نام کاربری به عنوان نام مشترک استفاده کنید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:368 msgid "VPN" @@ -805,25 +816,25 @@ msgstr "شبکه خصوصی مجازی" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:64 msgid "Write log to file" -msgstr "" +msgstr "نوشتن گزارش در فایل" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:96 msgid "Write status to file every n seconds" -msgstr "" +msgstr "وضعیت را برای فایل هر n ثانیه بنویسید" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:112 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:114 msgid "no" -msgstr "" +msgstr "خیر" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:201 msgid "tun/tap device" -msgstr "" +msgstr "دستگاه tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:304 msgid "tun/tap inactivity timeout" -msgstr "" +msgstr "زمان عدم فعالیت tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:111 msgid "yes (%i)" -msgstr "" +msgstr "بله (%i)" diff --git a/package/luci/applications/luci-app-openvpn/po/fi/openvpn.po b/package/luci/applications/luci-app-openvpn/po/fi/openvpn.po index c5d7b43e99..eb61c06c6a 100644 --- a/package/luci/applications/luci-app-openvpn/po/fi/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/fi/openvpn.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:35+0200\n" "PO-Revision-Date: 2022-03-12 13:29+0000\n" "Last-Translator: Jiri Grönroos \n" -"Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" @@ -101,7 +101,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -186,7 +186,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "Älä lisää reittejä automaattisesti" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -264,6 +264,11 @@ msgstr "Käytössä" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -382,7 +387,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "OVPN-määritystiedoston lähetys" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -505,11 +510,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -517,7 +522,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -737,16 +742,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -756,7 +761,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/fr/openvpn.po b/package/luci/applications/luci-app-openvpn/po/fr/openvpn.po index cae12fcfc9..cdb980ddef 100644 --- a/package/luci/applications/luci-app-openvpn/po/fr/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/fr/openvpn.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-19 19:36+0200\n" -"PO-Revision-Date: 2022-07-31 13:17+0000\n" -"Last-Translator: Christophe Blancon \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -105,7 +105,7 @@ msgstr "Modifier la priorité du processus" msgid "Change to directory before initialization" msgstr "Aller dans ce répertorie avant l'initialisation" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" "Confronter le certificat du distant à une liste des certificats révoqués " @@ -194,7 +194,7 @@ msgstr "Ne pas exécuter réellement ifconfig" msgid "Don't add routes automatically" msgstr "Ne pas ajouter de routes automatiquement" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" "Ne pas copier en cache les mots de passe des options --askpass ou --auth-" @@ -276,6 +276,13 @@ msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" "Chiffrer et authentifier tous les paquets de canaux de contrôle avec la clé" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Chiffrez et authentifiez tous les paquets du canal de contrôle avec la clé, " +"version 2." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Méthode de chiffrement des paquets" @@ -401,7 +408,7 @@ msgstr "Nombre de lignes de l'historique du fichier-journal" msgid "OVPN configuration file upload" msgstr "Téléchargement de fichier de configuration OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Accepte seulement des connexions du nom X509 donné" @@ -425,7 +432,7 @@ msgstr "Optimiser les écritures TUN/TAP/UDP" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:11 msgid "Overview" -msgstr "Aperçu" +msgstr "Vue d'ensemble" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:674 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:73 @@ -528,11 +535,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "Taille de la fenêtre glissante pour la protection anti-rejeu" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Exiger l'appellation explicite sur le certificat" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Exiger l'utilisation explicite de la clé sur le certificat" @@ -540,7 +547,7 @@ msgstr "Exiger l'utilisation explicite de la clé sur le certificat" msgid "Restart after remote ping timeout" msgstr "Redémarrer aprés le dépassement du délai de ping du distant" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Restreindre les chiffres autorisés à négocier" @@ -769,16 +776,16 @@ msgstr "" "Le fichier de configuration OVPN (%s) n'a pas pu être trouvé, veuillez " "vérifier votre configuration." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "La version TLS la plus haute supportée" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "La direction clé pour les options 'tls-auth' et 'secret'" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "La version TLS la plus basse supportée" @@ -790,7 +797,7 @@ msgstr "" "La taille du fichier de configuration OVPN (%s) est trop importante pour une " "édition en ligne dans LuCI (&ge ; 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Cela désactive complètement la négociation du chiffrement" diff --git a/package/luci/applications/luci-app-openvpn/po/he/openvpn.po b/package/luci/applications/luci-app-openvpn/po/he/openvpn.po index 3ba21b5481..1d73c62023 100644 --- a/package/luci/applications/luci-app-openvpn/po/he/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/he/openvpn.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2022-11-14 15:47+0000\n" "Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" @@ -99,7 +99,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -184,7 +184,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -262,6 +262,11 @@ msgstr "" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -380,7 +385,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -503,11 +508,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -515,7 +520,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -735,16 +740,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -754,7 +759,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/hi/openvpn.po b/package/luci/applications/luci-app-openvpn/po/hi/openvpn.po index 1a9aa7bc3f..a3a4e4e0f0 100644 --- a/package/luci/applications/luci-app-openvpn/po/hi/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/hi/openvpn.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:35+0200\n" "PO-Revision-Date: 2020-01-14 15:22+0000\n" "Last-Translator: Franco Castillo \n" -"Language-Team: Hindi \n" "Language: hi\n" "MIME-Version: 1.0\n" @@ -101,7 +101,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -186,7 +186,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -264,6 +264,11 @@ msgstr "" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -382,7 +387,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -505,11 +510,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -517,7 +522,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -737,16 +742,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -756,7 +761,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/hu/openvpn.po b/package/luci/applications/luci-app-openvpn/po/hu/openvpn.po index cc9782283d..24dba73b49 100644 --- a/package/luci/applications/luci-app-openvpn/po/hu/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/hu/openvpn.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-08-16 10:33+0000\n" "Last-Translator: Bence Csókás \n" -"Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" @@ -102,7 +102,7 @@ msgstr "Folyamat prioritásának megváltoztatása" msgid "Change to directory before initialization" msgstr "Váltás könyvtárra az előkészítés előtt" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Partnertanúsítvány összevetése egy tanúsítvány-visszavonási listával" @@ -188,7 +188,7 @@ msgstr "Ne hajtsa végre ténylegesen az ifconfig parancsot" msgid "Don't add routes automatically" msgstr "Ne adjon hozzá útvonalakat automatikusan" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "Ne gyorsítótárazza az --askpass vagy --auth-user-pass jelszavakat" @@ -269,6 +269,11 @@ msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" "Az összes vezérlőcsatorna csomagjainak titkosítása és hitelesítése a kulccsal" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Titkosítás a csomagoknál" @@ -393,7 +398,7 @@ msgstr "Naplófájlelőzmények sorainak száma" msgid "OVPN configuration file upload" msgstr "OVPN beállítófájl feltöltése" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Kapcsolatok elfogadása csak a megadott X509 névtől" @@ -517,11 +522,11 @@ msgstr "Adatcsatorna-kulcs újraegyeztetése másodperc után" msgid "Replay protection sliding window size" msgstr "Visszajátszási védelem csúszóablakának mérete" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Kifejezett megnevezés szükséges a tanúsítványon" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Kifejezett kulcshasználat szükséges a tanúsítványon" @@ -529,7 +534,7 @@ msgstr "Kifejezett kulcshasználat szükséges a tanúsítványon" msgid "Restart after remote ping timeout" msgstr "Újraindítás a távoli ping időkorlátja után" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Az engedélyezett titkosítók egyeztetésének korlátozása" @@ -757,16 +762,16 @@ msgid "" "configuration." msgstr "Az OVPN beállítófájl (%s) nem található, ellenőrizze a beállításait." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "A legmagasabb támogatott TLS verzió" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "A kulcsirány a „tls-auth” és „secret” beállításoknál" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "A legalacsonyabb támogatott TLS verzió" @@ -778,7 +783,7 @@ msgstr "" "Az OVPN beállítófájl (%s) mérete túl nagy a LuCI-ban történő internetes " "szerkesztéshez (nagyobb mint 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Ez teljesen letiltja a titkosító egyeztetését" diff --git a/package/luci/applications/luci-app-openvpn/po/it/openvpn.po b/package/luci/applications/luci-app-openvpn/po/it/openvpn.po index ffd0ae9871..f0804276b7 100644 --- a/package/luci/applications/luci-app-openvpn/po/it/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/it/openvpn.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-19 19:36+0200\n" -"PO-Revision-Date: 2022-02-18 20:58+0000\n" -"Last-Translator: pisquan8 \n" -"Language-Team: Italian \n" +"Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.1\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -28,7 +28,7 @@ msgstr "Aggiungi" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:225 msgid "Add route after establishing connection" -msgstr "Aggiungi rotte dopo aver stabilito la connessione" +msgstr "Aggiungi rotta dopo aver stabilito la connessione" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:92 msgid "Add template based configuration" @@ -103,7 +103,7 @@ msgstr "Cambia priorità del processo" msgid "Change to directory before initialization" msgstr "Cambia cartella prima dell'inizializzazione" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Verifica il certificato del nodo su una CRL" @@ -188,7 +188,7 @@ msgstr "Non eseguire realmente ifconfig" msgid "Don't add routes automatically" msgstr "Non aggiungere rotte automaticamente" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "Non tenere in memoria le password di --askpass o di --auth-user-pass" @@ -207,7 +207,7 @@ msgstr "Non loggare timestamps" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:241 msgid "Don't pull routes automatically" -msgstr "Non spingere automaticamente le rotte" +msgstr "Non ottenere automaticamente le rotte" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:332 msgid "Don't re-read key on restart" @@ -261,7 +261,7 @@ msgstr "Abilita l'interfaccia di controllo su IP port" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:104 msgid "Enabled" -msgstr "Abilitato" +msgstr "Attivato" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:752 msgid "Encrypt and authenticate all control channel packets with the key" @@ -269,6 +269,13 @@ msgstr "" "Crittografa e autentica tutti i pacchetti del canale di controllo con la " "chiave" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Crittografa e autentica tutti i pacchetti del canale di controllo con la " +"chiave, versione 2." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Cifratura di criptazione dei pacchetti" @@ -349,7 +356,7 @@ msgstr "Mantienti il device tun/tap aperto al riavvio" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:736 msgid "Key transition window" -msgstr "" +msgstr "Finestra di transizione della chiave" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:104 msgid "Limit repeated log messages" @@ -371,19 +378,19 @@ msgstr "Chiave privata local" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:173 msgid "Major mode" -msgstr "" +msgstr "Modalità principale" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:452 msgid "Maximum number of queued TCP output packets" -msgstr "" +msgstr "Numero massimo di pacchetti di output TCP in coda" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:168 msgid "Networking" -msgstr "" +msgstr "Rete" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:447 msgid "Number of allocated broadcast buffers" -msgstr "" +msgstr "Numero di buffer di trasmissione allocati" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:360 msgid "Number of lines for log file history" @@ -393,13 +400,13 @@ msgstr "Numero di righe per la cronologia dei file di registro" msgid "OVPN configuration file upload" msgstr "Caricamento del file di configurazione OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" -msgstr "" +msgstr "Accetta solo connessioni dal nome X509 specificato" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:324 msgid "Only process ping timeouts if routes exist" -msgstr "" +msgstr "Elabora solo timeout ping se esistono percorsi" #: applications/luci-app-openvpn/luasrc/controller/openvpn.lua:8 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:10 @@ -429,15 +436,15 @@ msgstr "Passa le variabili d'ambiente allo script" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:644 msgid "Persist replay-protection state" -msgstr "" +msgstr "Mantieni lo stato di protezione contro i replay" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:402 msgid "Persist/unpersist ifconfig-pool" -msgstr "" +msgstr "Mantieni/non mantieni l'ifconfig-pool" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:312 msgid "Ping remote every n seconds over TCP/UDP port" -msgstr "" +msgstr "Esegui un ping al remoto ogni n secondi sulla porta TCP/UDP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:32 msgid "Please edit this file directly in a terminal session." @@ -453,7 +460,7 @@ msgstr "Seleziona un modello VPN valido!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:161 msgid "Policy level over usage of external programs and scripts" -msgstr "" +msgstr "Livello di policy sull'uso di programmi e script esterni" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:141 msgid "Port" @@ -473,11 +480,11 @@ msgstr "Invia (push) un'opzione ifconfig all'host remoto" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:382 msgid "Push options to peer" -msgstr "" +msgstr "Invia opzioni al peer" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:350 msgid "Query management channel for private key" -msgstr "" +msgstr "Interroga il canale di gestione per la chiave privata" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:505 msgid "Randomly choose remote server" @@ -486,10 +493,11 @@ msgstr "Scegliere casualmente il server remoto" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:432 msgid "Refuse connection if no custom client config" msgstr "" +"Rifiuta la connessione se non c'è una configurazione client personalizzata" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:92 msgid "Remap SIGUSR1 signals" -msgstr "" +msgstr "Riassegna i segnali SIGUSR1" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:501 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:61 @@ -498,67 +506,67 @@ msgstr "Nome host remoto o indirizzo IP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:316 msgid "Remote ping timeout" -msgstr "" +msgstr "Timeout ping remoto" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:720 msgid "Renegotiate data chan. key after bytes" -msgstr "" +msgstr "Rinegozia la chiave del canale di dati dopo i byte" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:724 msgid "Renegotiate data chan. key after packets" -msgstr "" +msgstr "Rinegozia la chiave del canale di dati dopo i pacchetti" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:728 msgid "Renegotiate data chan. key after seconds" -msgstr "" +msgstr "Rinegozia la chiave del canale di dati dopo i secondi" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:636 msgid "Replay protection sliding window size" -msgstr "" +msgstr "Dimensione della finestra di protezione contro i replay" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" -msgstr "" +msgstr "Richiedi una designazione esplicita sul certificato" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" -msgstr "" +msgstr "Richiedi un utilizzo esplicito della chiave sul certificato" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:320 msgid "Restart after remote ping timeout" -msgstr "" +msgstr "Riavvia dopo il timeout del ping remoto" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" -msgstr "" +msgstr "Limita le cifrature consentite da negoziare" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:716 msgid "Retransmit timeout on TLS control channel" -msgstr "" +msgstr "Timeout di ritrasmissione sul canale di controllo TLS" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:525 msgid "Retry indefinitely on HTTP proxy errors" -msgstr "" +msgstr "Riprova indefinitamente in caso di errori del proxy HTTP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:546 msgid "Retry indefinitely on Socks proxy errors" -msgstr "" +msgstr "Riprova indefinitamente in caso di errori del proxy Socks" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:412 msgid "Route subnet to client" -msgstr "" +msgstr "Instrada una sotto rete verso il client" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:145 msgid "Run script cmd on client connection" -msgstr "" +msgstr "Esegui lo script cmd alla connessione del client" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:149 msgid "Run script cmd on client disconnection" -msgstr "" +msgstr "Esegui lo script cmd alla disconnessione del client" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:124 msgid "Run up/down scripts for all restarts" -msgstr "" +msgstr "Esegui script di avvio/arresto per tutti i riavvii" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:41 msgid "Save" @@ -568,6 +576,8 @@ msgstr "Salva" msgid "" "Section to add an optional 'auth-user-pass' file with your credentials (%s)" msgstr "" +"Sezione per aggiungere un file 'auth-user-pass' opzionale con le tue " +"credenziali (%s)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:44 msgid "Section to modify the OVPN config file (%s)" @@ -596,7 +606,7 @@ msgstr "Selezionare il modello ..." #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:496 msgid "Send notification to peer on disconnect" -msgstr "" +msgstr "Invia una notifica al peer alla disconnessione" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:15 msgid "Service" @@ -608,11 +618,11 @@ msgstr "Impostare MTU di TCP/UDP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:397 msgid "Set aside a pool of subnets" -msgstr "" +msgstr "Riserva un pool di sotto reti" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:535 msgid "Set extended HTTP proxy options" -msgstr "" +msgstr "Imposta opzioni estese del proxy HTTP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:20 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:13 @@ -622,6 +632,7 @@ msgstr "Impostare la verbosità dell'output" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:442 msgid "Set size of real and virtual address hash tables" msgstr "" +"Imposta la dimensione delle tabelle di hash degli indirizzi reali e virtuali" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:292 msgid "Set the TCP/UDP receive buffer size" @@ -633,44 +644,44 @@ msgstr "Impostare la dimensione del buffer d'invio TCP/UDP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:296 msgid "Set tun/tap TX queue length" -msgstr "" +msgstr "Imposta la lunghezza della coda TX tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:213 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:29 msgid "Set tun/tap adapter parameters" -msgstr "" +msgstr "Imposta i parametri dell'adattatore tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:270 msgid "Set tun/tap device MTU" -msgstr "" +msgstr "Imposta il MTU del dispositivo tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:274 msgid "Set tun/tap device overhead" -msgstr "" +msgstr "Imposta il sovraccarico del dispositivo tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:283 msgid "Set upper bound on TCP MSS" -msgstr "" +msgstr "Imposta il limite superiore del MSS TCP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:300 msgid "Shaping for peer bandwidth" -msgstr "" +msgstr "Modellare la larghezza di banda per il peer" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:108 msgid "Shell cmd to execute after tun device open" -msgstr "" +msgstr "Comando shell da eseguire dopo l'apertura del dispositivo tun" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:116 msgid "Shell cmd to run after tun device close" -msgstr "" +msgstr "Comando shell da eseguire dopo la chiusura del dispositivo tun" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:141 msgid "Shell command to verify X509 name" -msgstr "" +msgstr "Comando shell per verificare il nome X509" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:640 msgid "Silence the output of replay warnings" -msgstr "" +msgstr "Silenzia l'output degli avvisi di replay" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:627 msgid "Size of cipher key" @@ -678,15 +689,15 @@ msgstr "Dimensione della chiave di cifratura" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:229 msgid "Specify a default gateway for routes" -msgstr "" +msgstr "Specifica un gateway predefinito per le route" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:561 msgid "Specify whether the client is required to supply a valid certificate" -msgstr "" +msgstr "Specifica se il client deve fornire un certificato valido" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:355 msgid "Start OpenVPN in a hibernating state" -msgstr "" +msgstr "Avvia OpenVPN in uno stato di ibernazione" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:117 msgid "Start/Stop" @@ -698,7 +709,7 @@ msgstr "Avviato" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:100 msgid "Status file format version" -msgstr "" +msgstr "Versione del formato del file di stato" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:15 msgid "Switch to advanced configuration" @@ -731,7 +742,7 @@ msgstr "Cifratura TLS" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:56 msgid "TOS passthrough (applies to IPv4 only)" -msgstr "" +msgstr "Inoltro TOS (si applica solo a IPv4)" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:78 msgid "Template based configuration" @@ -739,12 +750,12 @@ msgstr "Configurazione basata su un modello" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:437 msgid "Temporary directory for client-connect return file" -msgstr "" +msgstr "Cartella temporanea per il file di ritorno di client-connect" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:12 #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:40 msgid "The 'Name' field must not be empty!" -msgstr "" +msgstr "Il campo 'Nome' non deve essere vuoto!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:22 msgid "" @@ -754,16 +765,16 @@ msgstr "" "Impossibile trovare il file di configurazione OVPN (%s), controlla la tua " "configurazione." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "La versione TLS più alta supportata" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" -msgstr "" +msgstr "La direzione della chiave per le opzioni 'tls-auth' e 'secret'" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "La versione TLS più bassa supportata" @@ -775,18 +786,18 @@ msgstr "" "La dimensione del file di configurazione OVPN (%s) è troppo grande per la " "modifica in LuCI (≥ 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" -msgstr "" +msgstr "Questo disabilita completamente la negoziazione delle cifrature" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:732 msgid "Timeframe for key exchange" -msgstr "" +msgstr "Intervallo di scambio chiave" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:205 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:25 msgid "Type of used device" -msgstr "" +msgstr "Tipo di dispositivo utilizzato" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 msgid "Upload" @@ -800,15 +811,15 @@ msgstr "Carica il file OVPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:97 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:103 msgid "Use protocol" -msgstr "" +msgstr "Usa il protocollo" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:209 msgid "Use tun/tap device node" -msgstr "" +msgstr "Usa il nodo del dispositivo tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:472 msgid "Use username as common name" -msgstr "" +msgstr "Usa il nome utente come nome comune" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:368 msgid "VPN" @@ -820,7 +831,7 @@ msgstr "Scrivi log su file" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:96 msgid "Write status to file every n seconds" -msgstr "" +msgstr "Scrive lo stato su file ogni n secondi" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:112 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:114 @@ -829,11 +840,11 @@ msgstr "no" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:201 msgid "tun/tap device" -msgstr "" +msgstr "Dispositivo tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:304 msgid "tun/tap inactivity timeout" -msgstr "" +msgstr "Timeout di inattività del dispositivo tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:111 msgid "yes (%i)" diff --git a/package/luci/applications/luci-app-openvpn/po/ja/openvpn.po b/package/luci/applications/luci-app-openvpn/po/ja/openvpn.po index 2967cb8ebc..f02aa81227 100644 --- a/package/luci/applications/luci-app-openvpn/po/ja/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/ja/openvpn.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:36+0200\n" "PO-Revision-Date: 2022-09-04 03:20+0000\n" "Last-Translator: yamaken \n" -"Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" @@ -101,7 +101,7 @@ msgstr "プロセスの優先度を変更" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -186,7 +186,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "ルートを自動で追加しない" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -264,6 +264,11 @@ msgstr "有効" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -382,7 +387,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -505,11 +510,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -517,7 +522,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -737,16 +742,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -756,7 +761,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/ko/openvpn.po b/package/luci/applications/luci-app-openvpn/po/ko/openvpn.po index cb1972e136..55360c87ab 100644 --- a/package/luci/applications/luci-app-openvpn/po/ko/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/ko/openvpn.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:35+0200\n" "PO-Revision-Date: 2022-08-09 02:20+0000\n" "Last-Translator: SangHoon Kim \n" -"Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" @@ -101,7 +101,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -186,7 +186,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -264,6 +264,11 @@ msgstr "활성화" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -382,7 +387,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -505,11 +510,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -517,7 +522,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -737,16 +742,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -756,7 +761,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/lt/openvpn.po b/package/luci/applications/luci-app-openvpn/po/lt/openvpn.po new file mode 100644 index 0000000000..b89d4f4ccb --- /dev/null +++ b/package/luci/applications/luci-app-openvpn/po/lt/openvpn.po @@ -0,0 +1,826 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-10-15 04:23+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 +msgid "'net30', 'p2p', or 'subnet'" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:481 +msgid "Accept options pushed from server" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:92 +msgid "Add" +msgstr "Pridėti" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:225 +msgid "Add route after establishing connection" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:92 +msgid "Add template based configuration" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:748 +msgid "Additional authentication over TLS" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:417 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:57 +msgid "Allow client-to-client traffic" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:422 +msgid "Allow multiple clients with same certificate" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:740 +msgid "Allow only one session" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:193 +msgid "Allow remote to change its IP or port" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:457 +msgid "Allowed maximum of connected clients" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:462 +msgid "Allowed maximum of internal" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:467 +msgid "Allowed maximum of new connections" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:68 +msgid "Append log to file" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:486 +msgid "Authenticate using username/password" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:556 +msgid "Automatically redirect default route" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:11 +msgid "Below is a list of configured OpenVPN instances and their current state" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:120 +msgid "Call down cmd/script before TUN/TAP close" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:658 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:77 +msgid "Certificate authority" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:80 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:17 +msgid "Change process priority" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:40 +msgid "Change to directory before initialization" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +msgid "Check peer certificate against a CRL" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:44 +msgid "Chroot to directory after initialization" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:392 +msgid "Client is disabled" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:20 +msgid "Configuration category" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:477 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:53 +msgid "Configure client mode" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:377 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:37 +msgid "Configure server bridge" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:372 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:33 +msgid "Configure server mode" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:540 +msgid "Connect through Socks5 proxy" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:520 +msgid "Connect to remote host through an HTTP proxy" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:515 +msgid "Connection retry interval" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:564 +msgid "Cryptography" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:233 +msgid "Delay n seconds after connection" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:112 +msgid "Delay tun/tap open and up script execution" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:662 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:81 +msgid "Diffie-Hellman parameters" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:427 +msgid "Directory for custom client config files" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:24 +msgid "Disable Paging" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:28 +msgid "Disable options consistency check" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:197 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:41 +msgid "Do not bind to local address and port" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:217 +msgid "Don't actually execute ifconfig" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:237 +msgid "Don't add routes automatically" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +msgid "Don't cache --askpass or --auth-user-pass passwords" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:245 +msgid "Don't drop incoming tun packets with same destination as host" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:387 +msgid "Don't inherit global push options" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:72 +msgid "Don't log timestamps" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:241 +msgid "Don't pull routes automatically" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:332 +msgid "Don't re-read key on restart" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:261 +msgid "Don't use adaptive lzo compression" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:221 +msgid "Don't warn on ifconfig inconsistencies" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:88 +msgid "Echo parameters to log" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:253 +msgid "Empirically measure MTU" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:632 +msgid "Enable OpenSSL hardware crypto engines" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:249 +msgid "Enable Path MTU discovery" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:568 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:65 +msgid "Enable Static Key encryption mode (non-TLS)" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:653 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:678 +msgid "Enable TLS and assume client role" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:648 +msgid "Enable TLS and assume server role" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:278 +msgid "Enable internal datagram fragmentation" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:345 +msgid "Enable management interface on IP port" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:104 +msgid "Enabled" +msgstr "Ä®jungta" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:752 +msgid "Encrypt and authenticate all control channel packets with the key" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 +msgid "Encryption cipher for packets" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:128 +msgid "Execute shell cmd after routes are added" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:132 +msgid "Execute shell command on remote IP change" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:157 +msgid "" +"Executed in server mode on new client connections, when the client is still " +"untrusted" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:153 +msgid "" +"Executed in server mode whenever an IPv4 address/route or MAC address is " +"added to OpenVPN's internal routing table" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:744 +msgid "Exit on TLS negotiation failure" +msgstr "" + +#: applications/luci-app-openvpn/root/usr/share/rpcd/acl.d/luci-app-openvpn.json:3 +msgid "Grant access to OpenVPN configuration" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:573 +msgid "HMAC authentication for packets" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:491 +msgid "Handling of authentication failures" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:308 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:49 +msgid "" +"Helper directive to simplify the expression of --ping and --ping-restart in " +"server mode configurations" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:551 +msgid "If hostname resolve fails, retry" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:12 +msgid "Instance \"%s\"" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:18 +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:46 +msgid "Instance with that name already exists!" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:336 +msgid "Keep local IP address on restart" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:340 +msgid "Keep remote IP address on restart" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:328 +msgid "Keep tun/tap device open on restart" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:736 +msgid "Key transition window" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:104 +msgid "Limit repeated log messages" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:666 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:85 +msgid "Local certificate" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:177 +msgid "Local host name or IP address" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:670 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:89 +msgid "Local private key" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:173 +msgid "Major mode" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:452 +msgid "Maximum number of queued TCP output packets" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:168 +msgid "Networking" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:447 +msgid "Number of allocated broadcast buffers" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:360 +msgid "Number of lines for log file history" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:95 +msgid "OVPN configuration file upload" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +msgid "Only accept connections from given X509 name" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:324 +msgid "Only process ping timeouts if routes exist" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/controller/openvpn.lua:8 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:10 +msgid "OpenVPN" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:11 +msgid "OpenVPN instances" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:84 +msgid "Optimize TUN/TAP/UDP writes" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:11 +msgid "Overview" +msgstr "ApžiÅ«ra" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:674 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:73 +msgid "PKCS#12 file containing keys" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:137 +msgid "Pass environment variables to script" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:644 +msgid "Persist replay-protection state" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:402 +msgid "Persist/unpersist ifconfig-pool" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:312 +msgid "Ping remote every n seconds over TCP/UDP port" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:32 +msgid "Please edit this file directly in a terminal session." +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:51 +msgid "Please select a valid OVPN config file to upload!" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:23 +msgid "Please select a valid VPN template!" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:161 +msgid "Policy level over usage of external programs and scripts" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:141 +msgid "Port" +msgstr "Prievadas („Port'as“)" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:156 +msgid "Protocol" +msgstr "Protokolas" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:530 +msgid "Proxy timeout in seconds" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:407 +msgid "Push an ifconfig option to remote" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:382 +msgid "Push options to peer" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:350 +msgid "Query management channel for private key" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:505 +msgid "Randomly choose remote server" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:432 +msgid "Refuse connection if no custom client config" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:92 +msgid "Remap SIGUSR1 signals" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:501 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:61 +msgid "Remote host name or IP address" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:316 +msgid "Remote ping timeout" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:720 +msgid "Renegotiate data chan. key after bytes" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:724 +msgid "Renegotiate data chan. key after packets" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:728 +msgid "Renegotiate data chan. key after seconds" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:636 +msgid "Replay protection sliding window size" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +msgid "Require explicit designation on certificate" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +msgid "Require explicit key usage on certificate" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:320 +msgid "Restart after remote ping timeout" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 +msgid "Restrict the allowed ciphers to be negotiated" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:716 +msgid "Retransmit timeout on TLS control channel" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:525 +msgid "Retry indefinitely on HTTP proxy errors" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:546 +msgid "Retry indefinitely on Socks proxy errors" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:412 +msgid "Route subnet to client" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:145 +msgid "Run script cmd on client connection" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:149 +msgid "Run script cmd on client disconnection" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:124 +msgid "Run up/down scripts for all restarts" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:41 +msgid "Save" +msgstr "IÅ¡saugoti" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:65 +msgid "" +"Section to add an optional 'auth-user-pass' file with your credentials (%s)" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:44 +msgid "Section to modify the OVPN config file (%s)" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:257 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:45 +msgid "" +"Security recommendation: It is recommended to not enable compression and set " +"this parameter to `no`" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:165 +msgid "" +"Security recommendation: It is recommended to not enable compression and set " +"this parameter to `stub-v2`" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:85 +msgid "Select template ..." +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:496 +msgid "Send notification to peer on disconnect" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:15 +msgid "Service" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:266 +msgid "Set TCP/UDP MTU" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:397 +msgid "Set aside a pool of subnets" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:535 +msgid "Set extended HTTP proxy options" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:20 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:13 +msgid "Set output verbosity" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:442 +msgid "Set size of real and virtual address hash tables" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:292 +msgid "Set the TCP/UDP receive buffer size" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:288 +msgid "Set the TCP/UDP send buffer size" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:296 +msgid "Set tun/tap TX queue length" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:213 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:29 +msgid "Set tun/tap adapter parameters" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:270 +msgid "Set tun/tap device MTU" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:274 +msgid "Set tun/tap device overhead" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:283 +msgid "Set upper bound on TCP MSS" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:300 +msgid "Shaping for peer bandwidth" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:108 +msgid "Shell cmd to execute after tun device open" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:116 +msgid "Shell cmd to run after tun device close" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:141 +msgid "Shell command to verify X509 name" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:640 +msgid "Silence the output of replay warnings" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:627 +msgid "Size of cipher key" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:229 +msgid "Specify a default gateway for routes" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:561 +msgid "Specify whether the client is required to supply a valid certificate" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:355 +msgid "Start OpenVPN in a hibernating state" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:117 +msgid "Start/Stop" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:106 +msgid "Started" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:100 +msgid "Status file format version" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:15 +msgid "Switch to advanced configuration" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:18 +msgid "Switch to basic configuration" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:181 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:21 +msgid "TCP/UDP port # for both local and remote" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:185 +msgid "TCP/UDP port # for local (default=1194)" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:189 +msgid "TCP/UDP port # for remote (default=1194)" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:712 +msgid "TLS 1.3 or newer cipher" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:704 +msgid "TLS cipher" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:56 +msgid "TOS passthrough (applies to IPv4 only)" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:78 +msgid "Template based configuration" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:437 +msgid "Temporary directory for client-connect return file" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:12 +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:40 +msgid "The 'Name' field must not be empty!" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:22 +msgid "" +"The OVPN config file (%s) could not be found, please check your " +"configuration." +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +msgid "The highest supported TLS version" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 +msgid "The key direction for 'tls-auth' and 'secret' options" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +msgid "The lowest supported TLS version" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:31 +msgid "" +"The size of the OVPN config file (%s) is too large for online editing in " +"LuCI (≥ 100 KB)." +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +msgid "This completely disables cipher negotiation" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:732 +msgid "Timeframe for key exchange" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:205 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:25 +msgid "Type of used device" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 +msgid "Upload" +msgstr "Ä®kelti" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 +msgid "Upload ovpn file" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:510 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:97 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:103 +msgid "Use protocol" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:209 +msgid "Use tun/tap device node" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:472 +msgid "Use username as common name" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:368 +msgid "VPN" +msgstr "„VPN“" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:64 +msgid "Write log to file" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:96 +msgid "Write status to file every n seconds" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:112 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:114 +msgid "no" +msgstr "ne" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:201 +msgid "tun/tap device" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:304 +msgid "tun/tap inactivity timeout" +msgstr "" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:111 +msgid "yes (%i)" +msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/mr/openvpn.po b/package/luci/applications/luci-app-openvpn/po/mr/openvpn.po index aaca270d07..5b15817eef 100644 --- a/package/luci/applications/luci-app-openvpn/po/mr/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/mr/openvpn.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:35+0200\n" "PO-Revision-Date: 2020-02-07 09:18+0000\n" "Last-Translator: Prachi Joshi \n" -"Language-Team: Marathi \n" "Language: mr\n" "MIME-Version: 1.0\n" @@ -101,7 +101,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -186,7 +186,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -264,6 +264,11 @@ msgstr "सक्षम केले" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -382,7 +387,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -505,11 +510,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -517,7 +522,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -737,16 +742,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -756,7 +761,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/ms/openvpn.po b/package/luci/applications/luci-app-openvpn/po/ms/openvpn.po index 88e37633a1..4a711672e4 100644 --- a/package/luci/applications/luci-app-openvpn/po/ms/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/ms/openvpn.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2020-01-14 15:22+0000\n" "Last-Translator: Franco Castillo \n" -"Language-Team: Malay \n" "Language: ms\n" "MIME-Version: 1.0\n" @@ -99,7 +99,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -184,7 +184,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -262,6 +262,11 @@ msgstr "" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -380,7 +385,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -503,11 +508,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -515,7 +520,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -735,16 +740,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -754,7 +759,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/nb_NO/openvpn.po b/package/luci/applications/luci-app-openvpn/po/nb_NO/openvpn.po index 912da279d5..e9110b9871 100644 --- a/package/luci/applications/luci-app-openvpn/po/nb_NO/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/nb_NO/openvpn.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-04-04 07:26+0000\n" -"Last-Translator: Allan Nordhøy \n" -"Language-Team: Norwegian BokmÃ¥l \n" +"Language-Team: Norwegian BokmÃ¥l \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.6-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -22,7 +22,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:92 msgid "Add" -msgstr "" +msgstr "Legg til" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:225 msgid "Add route after establishing connection" @@ -39,15 +39,15 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:417 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:57 msgid "Allow client-to-client traffic" -msgstr "" +msgstr "Tillat klient-til-klient trafikk" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:422 msgid "Allow multiple clients with same certificate" -msgstr "" +msgstr "Tillat flere klienter med samme sertifikat" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:740 msgid "Allow only one session" -msgstr "" +msgstr "Bare tillat en økt" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:193 msgid "Allow remote to change its IP or port" @@ -55,7 +55,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:457 msgid "Allowed maximum of connected clients" -msgstr "" +msgstr "Maks antall tilkoblede klienter som er tillatt" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:462 msgid "Allowed maximum of internal" @@ -63,7 +63,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:467 msgid "Allowed maximum of new connections" -msgstr "" +msgstr "Maks antall nye tilkoblinger som er tillatt" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:68 msgid "Append log to file" @@ -71,7 +71,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:486 msgid "Authenticate using username/password" -msgstr "" +msgstr "Autentiser med brukernavn/passord" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:556 msgid "Automatically redirect default route" @@ -88,7 +88,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:658 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:77 msgid "Certificate authority" -msgstr "" +msgstr "Sertifikatmyndighet" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:80 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:17 @@ -99,7 +99,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -109,7 +109,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:392 msgid "Client is disabled" -msgstr "" +msgstr "Klient er deaktivert" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:20 msgid "Configuration category" @@ -144,7 +144,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:564 msgid "Cryptography" -msgstr "" +msgstr "Kryptografi" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:233 msgid "Delay n seconds after connection" @@ -184,7 +184,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -198,7 +198,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:72 msgid "Don't log timestamps" -msgstr "" +msgstr "Ikke loggfør tidsstempler" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:241 msgid "Don't pull routes automatically" @@ -256,12 +256,17 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:104 msgid "Enabled" -msgstr "PÃ¥skrudd" +msgstr "Aktivert" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:752 msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -345,11 +350,11 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:666 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:85 msgid "Local certificate" -msgstr "" +msgstr "Lokalt sertifikat" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:177 msgid "Local host name or IP address" -msgstr "" +msgstr "Lokalt vertsnavn eller IP-adresse" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:670 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:89 @@ -366,7 +371,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:168 msgid "Networking" -msgstr "" +msgstr "Nettverk" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:447 msgid "Number of allocated broadcast buffers" @@ -380,7 +385,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -432,7 +437,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:51 msgid "Please select a valid OVPN config file to upload!" -msgstr "" +msgstr "Vennligst velg en gyldig OVPN konfigurasjonsfil for opplasting!" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:23 msgid "Please select a valid VPN template!" @@ -503,11 +508,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -515,7 +520,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -583,7 +588,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:15 msgid "Service" -msgstr "" +msgstr "Tjeneste" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:266 msgid "Set TCP/UDP MTU" @@ -673,7 +678,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:117 msgid "Start/Stop" -msgstr "" +msgstr "Start/Stopp" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:106 msgid "Started" @@ -685,11 +690,11 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:15 msgid "Switch to advanced configuration" -msgstr "" +msgstr "Endre til avansert konfigurasjon" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:18 msgid "Switch to basic configuration" -msgstr "" +msgstr "Endre til enkel konfigurasjon" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:181 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:21 @@ -735,16 +740,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -754,7 +759,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" @@ -774,7 +779,7 @@ msgstr "Last opp" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 msgid "Upload ovpn file" -msgstr "" +msgstr "Last opp ovpn fil" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:510 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:97 @@ -792,7 +797,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:368 msgid "VPN" -msgstr "" +msgstr "VPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:64 msgid "Write log to file" diff --git a/package/luci/applications/luci-app-openvpn/po/nl/openvpn.po b/package/luci/applications/luci-app-openvpn/po/nl/openvpn.po new file mode 100644 index 0000000000..8c738032c1 --- /dev/null +++ b/package/luci/applications/luci-app-openvpn/po/nl/openvpn.po @@ -0,0 +1,847 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:35+0200\n" +"PO-Revision-Date: 2023-05-06 12:52+0000\n" +"Last-Translator: xtz1983 \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 +msgid "'net30', 'p2p', or 'subnet'" +msgstr "'net30', 'p2p' of 'subnet'" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:481 +msgid "Accept options pushed from server" +msgstr "Accepteer opties die van de server zijn gepusht" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:92 +msgid "Add" +msgstr "Toevoegen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:225 +msgid "Add route after establishing connection" +msgstr "Route toevoegen na tot stand brengen van verbinding" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:92 +msgid "Add template based configuration" +msgstr "Op sjablonen gebaseerde configuratie toevoegen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:748 +msgid "Additional authentication over TLS" +msgstr "Extra authenticatie via TLS" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:417 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:57 +msgid "Allow client-to-client traffic" +msgstr "Client-naar-client verkeer toestaan" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:422 +msgid "Allow multiple clients with same certificate" +msgstr "Meerdere cliënten met hetzelfde certificaat toestaan" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:740 +msgid "Allow only one session" +msgstr "Slechts één sessie toestaan" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:193 +msgid "Allow remote to change its IP or port" +msgstr "Sta remote toe zijn IP of poort te wijzigen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:457 +msgid "Allowed maximum of connected clients" +msgstr "Toegestaan maximum aantal verbonden clients" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:462 +msgid "Allowed maximum of internal" +msgstr "Toegestaan maximum van interne" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:467 +msgid "Allowed maximum of new connections" +msgstr "Toegestaan maximum aantal nieuwe verbindingen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:68 +msgid "Append log to file" +msgstr "Logboek toevoegen aan bestand" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:486 +msgid "Authenticate using username/password" +msgstr "Verifiëren met gebruikersnaam/wachtwoord" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:556 +msgid "Automatically redirect default route" +msgstr "Standaardroute automatisch omleiden" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:11 +msgid "Below is a list of configured OpenVPN instances and their current state" +msgstr "" +"Hieronder vindt u een lijst met geconfigureerde OpenVPN-instanties en hun " +"huidige status" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:120 +msgid "Call down cmd/script before TUN/TAP close" +msgstr "Roep cmd/script op voordat TUN/TAP sluit" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:658 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:77 +msgid "Certificate authority" +msgstr "Certificaat autoriteit" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:80 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:17 +msgid "Change process priority" +msgstr "Wijzig de procesprioriteit" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:40 +msgid "Change to directory before initialization" +msgstr "Wijzigen in map vóór initialisatie" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +msgid "Check peer certificate against a CRL" +msgstr "Peer-certificaat vergelijken met een CRL" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:44 +msgid "Chroot to directory after initialization" +msgstr "Chroot naar map na initialisatie" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:392 +msgid "Client is disabled" +msgstr "Cliënt is uitgeschakeld" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:20 +msgid "Configuration category" +msgstr "Configuratie categorie" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:477 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:53 +msgid "Configure client mode" +msgstr "Configureer de clientmodus" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:377 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:37 +msgid "Configure server bridge" +msgstr "Serverbrug configureren" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:372 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:33 +msgid "Configure server mode" +msgstr "Servermodus configureren" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:540 +msgid "Connect through Socks5 proxy" +msgstr "Maak verbinding via de Socks5-proxy" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:520 +msgid "Connect to remote host through an HTTP proxy" +msgstr "Maak verbinding met externe host via een HTTP-proxy" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:515 +msgid "Connection retry interval" +msgstr "Interval voor nieuwe verbindingspogingen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:564 +msgid "Cryptography" +msgstr "Cryptografie" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:233 +msgid "Delay n seconds after connection" +msgstr "Vertraging n seconden na verbinding" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:112 +msgid "Delay tun/tap open and up script execution" +msgstr "Vertraag tun/tap open en scriptuitvoering" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:662 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:81 +msgid "Diffie-Hellman parameters" +msgstr "Diffie-Hellman parameters" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:427 +msgid "Directory for custom client config files" +msgstr "Directory voor aangepaste clientconfiguratiebestanden" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:24 +msgid "Disable Paging" +msgstr "Paging uitschakelen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:28 +msgid "Disable options consistency check" +msgstr "Consistentiecontrole van opties uitschakelen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:197 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:41 +msgid "Do not bind to local address and port" +msgstr "Niet binden aan lokaal adres en poort" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:217 +msgid "Don't actually execute ifconfig" +msgstr "Voer ifconfig niet echt uit" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:237 +msgid "Don't add routes automatically" +msgstr "Routes niet automatisch toevoegen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +msgid "Don't cache --askpass or --auth-user-pass passwords" +msgstr "Bewaar --askpass of --auth-user-pass wachtwoorden niet in de cache" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:245 +msgid "Don't drop incoming tun packets with same destination as host" +msgstr "" +"Laat geen inkomende tun-pakketten vallen met dezelfde bestemming als de host" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:387 +msgid "Don't inherit global push options" +msgstr "Neem geen globale push-opties over" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:72 +msgid "Don't log timestamps" +msgstr "Log geen tijdstempels in" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:241 +msgid "Don't pull routes automatically" +msgstr "Haal routes niet automatisch op" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:332 +msgid "Don't re-read key on restart" +msgstr "Lees de sleutel niet opnieuw bij het opnieuw opstarten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:261 +msgid "Don't use adaptive lzo compression" +msgstr "Gebruik geen adaptieve lzo-compressie" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:221 +msgid "Don't warn on ifconfig inconsistencies" +msgstr "Waarschuw niet voor ifconfig-inconsistenties" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:88 +msgid "Echo parameters to log" +msgstr "Echo-parameters om te loggen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:253 +msgid "Empirically measure MTU" +msgstr "Empirisch meten van MTU" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:632 +msgid "Enable OpenSSL hardware crypto engines" +msgstr "OpenSSL hardware crypto-engines inschakelen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:249 +msgid "Enable Path MTU discovery" +msgstr "MTU-detectie van paden inschakelen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:568 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:65 +msgid "Enable Static Key encryption mode (non-TLS)" +msgstr "Encryptiemodus met statische sleutel inschakelen (niet-TLS)" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:653 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:678 +msgid "Enable TLS and assume client role" +msgstr "TLS inschakelen en de rol van client overnemen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:648 +msgid "Enable TLS and assume server role" +msgstr "TLS inschakelen en de serverfunctie overnemen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:278 +msgid "Enable internal datagram fragmentation" +msgstr "Interne datagramfragmentatie inschakelen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:345 +msgid "Enable management interface on IP port" +msgstr "Beheerinterface inschakelen op IP poort" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:104 +msgid "Enabled" +msgstr "Ingeschakeld" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:752 +msgid "Encrypt and authenticate all control channel packets with the key" +msgstr "Versleutel en authenticeer alle controlekanaalpakketten met de sleutel" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Versleutel en authenticeer alle controlekanaalpakketten met de sleutel, " +"versie 2." + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 +msgid "Encryption cipher for packets" +msgstr "Versleutelingscodering voor pakketten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:128 +msgid "Execute shell cmd after routes are added" +msgstr "Voer shell cmd uit nadat routes zijn toegevoegd" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:132 +msgid "Execute shell command on remote IP change" +msgstr "Shell-opdracht uitvoeren bij externe IP-wijziging" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:157 +msgid "" +"Executed in server mode on new client connections, when the client is still " +"untrusted" +msgstr "" +"Uitgevoerd in servermodus op nieuwe clientverbindingen, wanneer de client " +"nog steeds niet vertrouwd is" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:153 +msgid "" +"Executed in server mode whenever an IPv4 address/route or MAC address is " +"added to OpenVPN's internal routing table" +msgstr "" +"Wordt uitgevoerd in servermodus wanneer een IPv4-adres/route of MAC-adres " +"wordt toegevoegd aan de interne routeringstabel van OpenVPN" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:744 +msgid "Exit on TLS negotiation failure" +msgstr "Afsluiten bij mislukte TLS-onderhandeling" + +#: applications/luci-app-openvpn/root/usr/share/rpcd/acl.d/luci-app-openvpn.json:3 +msgid "Grant access to OpenVPN configuration" +msgstr "Toegang verlenen tot OpenVPN-configuratie" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:573 +msgid "HMAC authentication for packets" +msgstr "HMAC-authenticatie voor pakketten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:491 +msgid "Handling of authentication failures" +msgstr "Afhandelen van authenticatiefouten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:308 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:49 +msgid "" +"Helper directive to simplify the expression of --ping and --ping-restart in " +"server mode configurations" +msgstr "" +"Helperrichtlijn om de expressie van --ping en --ping-restart in " +"servermodusconfiguraties te vereenvoudigen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:551 +msgid "If hostname resolve fails, retry" +msgstr "Als het oplossen van de hostnaam mislukt, probeert u het opnieuw" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:12 +msgid "Instance \"%s\"" +msgstr "Instantie \"%s\"" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:18 +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:46 +msgid "Instance with that name already exists!" +msgstr "Instantie met die naam bestaat al!" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:336 +msgid "Keep local IP address on restart" +msgstr "Houd het lokale IP-adres bij het opnieuw opstarten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:340 +msgid "Keep remote IP address on restart" +msgstr "Bewaar extern IP-adres bij opnieuw opstarten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:328 +msgid "Keep tun/tap device open on restart" +msgstr "Houd het tun/tap-apparaat open bij het opnieuw opstarten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:736 +msgid "Key transition window" +msgstr "Sleutelovergangsvenster" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:104 +msgid "Limit repeated log messages" +msgstr "Beperk herhaalde logberichten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:666 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:85 +msgid "Local certificate" +msgstr "Lokaal certificaat" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:177 +msgid "Local host name or IP address" +msgstr "Lokale hostnaam of IP-adres" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:670 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:89 +msgid "Local private key" +msgstr "Lokale privésleutel" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:173 +msgid "Major mode" +msgstr "Major-modus" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:452 +msgid "Maximum number of queued TCP output packets" +msgstr "Maximaal aantal TCP-uitvoerpakketten in de wachtrij" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:168 +msgid "Networking" +msgstr "Netwerken" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:447 +msgid "Number of allocated broadcast buffers" +msgstr "Aantal toegewezen uitzendbuffers" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:360 +msgid "Number of lines for log file history" +msgstr "Aantal regels voor de geschiedenis van logboekbestanden" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:95 +msgid "OVPN configuration file upload" +msgstr "OVPN-configuratiebestand uploaden" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +msgid "Only accept connections from given X509 name" +msgstr "Accepteer alleen verbindingen van de opgegeven X509-naam" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:324 +msgid "Only process ping timeouts if routes exist" +msgstr "Verwerk ping-time-outs alleen als er routes bestaan" + +#: applications/luci-app-openvpn/luasrc/controller/openvpn.lua:8 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:10 +msgid "OpenVPN" +msgstr "OpenVPN" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:11 +msgid "OpenVPN instances" +msgstr "OpenVPN-instanties" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:84 +msgid "Optimize TUN/TAP/UDP writes" +msgstr "Optimaliseer TUN/TAP/UDP-schrijfbewerkingen" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:11 +msgid "Overview" +msgstr "Overzicht" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:674 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:73 +msgid "PKCS#12 file containing keys" +msgstr "PKCS#12-bestand met sleutels" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:137 +msgid "Pass environment variables to script" +msgstr "Omgevingsvariabelen doorgeven aan script" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:644 +msgid "Persist replay-protection state" +msgstr "Persist replay-beveiligingsstatus" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:402 +msgid "Persist/unpersist ifconfig-pool" +msgstr "Persist/unpersist ifconfig-pool" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:312 +msgid "Ping remote every n seconds over TCP/UDP port" +msgstr "Ping elke n seconden op afstand via de TCP/UDP-poort" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:32 +msgid "Please edit this file directly in a terminal session." +msgstr "Bewerk dit bestand rechtstreeks in een terminalsessie." + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:51 +msgid "Please select a valid OVPN config file to upload!" +msgstr "Selecteer een geldig OVPN-configuratiebestand om te uploaden!" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:23 +msgid "Please select a valid VPN template!" +msgstr "Selecteer een geldig VPN-sjabloon!" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:161 +msgid "Policy level over usage of external programs and scripts" +msgstr "Beleidsniveau over gebruik van externe programma's en scripts" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:141 +msgid "Port" +msgstr "Poort" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:156 +msgid "Protocol" +msgstr "Protocol" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:530 +msgid "Proxy timeout in seconds" +msgstr "Proxy time-out in seconden" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:407 +msgid "Push an ifconfig option to remote" +msgstr "Push een ifconfig-optie naar remote" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:382 +msgid "Push options to peer" +msgstr "Push-opties om te peeren" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:350 +msgid "Query management channel for private key" +msgstr "Querybeheerkanaal voor privésleutel" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:505 +msgid "Randomly choose remote server" +msgstr "Kies willekeurig een externe server" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:432 +msgid "Refuse connection if no custom client config" +msgstr "Verbinding weigeren als er geen aangepaste clientconfiguratie is" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:92 +msgid "Remap SIGUSR1 signals" +msgstr "Remap SIGUSR1 signalen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:501 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:61 +msgid "Remote host name or IP address" +msgstr "Externe hostnaam of IP-adres" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:316 +msgid "Remote ping timeout" +msgstr "Time-out voor ping op afstand" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:720 +msgid "Renegotiate data chan. key after bytes" +msgstr "Heronderhandelen over data chan.key na bytes" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:724 +msgid "Renegotiate data chan. key after packets" +msgstr "Heronderhandelen van data chan.key na pakketten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:728 +msgid "Renegotiate data chan. key after seconds" +msgstr "Heronderhandelen data chan. sleutel na seconden" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:636 +msgid "Replay protection sliding window size" +msgstr "Replay-beveiliging schuifvenstergrootte" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +msgid "Require explicit designation on certificate" +msgstr "Eis expliciete aanduiding op certificaat" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +msgid "Require explicit key usage on certificate" +msgstr "Expliciet sleutelgebruik op certificaat vereisen" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:320 +msgid "Restart after remote ping timeout" +msgstr "Opnieuw opstarten na time-out voor ping op afstand" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 +msgid "Restrict the allowed ciphers to be negotiated" +msgstr "Beperk de toegestane cijfers waarover kan worden onderhandeld" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:716 +msgid "Retransmit timeout on TLS control channel" +msgstr "Time-out voor opnieuw verzenden op TLS-besturingskanaal" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:525 +msgid "Retry indefinitely on HTTP proxy errors" +msgstr "Probeer het voor onbepaalde tijd opnieuw bij HTTP-proxyfouten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:546 +msgid "Retry indefinitely on Socks proxy errors" +msgstr "Probeer het voor onbepaalde tijd opnieuw op Socks-proxyfouten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:412 +msgid "Route subnet to client" +msgstr "Routeer subnet naar client" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:145 +msgid "Run script cmd on client connection" +msgstr "Script cmd uitvoeren op clientverbinding" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:149 +msgid "Run script cmd on client disconnection" +msgstr "Script cmd uitvoeren bij het verbreken van de verbinding met de client" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:124 +msgid "Run up/down scripts for all restarts" +msgstr "Scripts omhoog/omlaag uitvoeren voor alle herstarts" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:41 +msgid "Save" +msgstr "Opslaan" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:65 +msgid "" +"Section to add an optional 'auth-user-pass' file with your credentials (%s)" +msgstr "" +"Sectie om een optioneel 'auth-user-pass'-bestand toe te voegen met uw " +"inloggegevens (%s)" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:44 +msgid "Section to modify the OVPN config file (%s)" +msgstr "Sectie om het OVPN-configuratiebestand te wijzigen (%s)" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:257 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:45 +msgid "" +"Security recommendation: It is recommended to not enable compression and set " +"this parameter to `no`" +msgstr "" +"Beveiligingsaanbeveling: Het wordt aanbevolen om compressie niet in te " +"schakelen en deze parameter in te stellen op `nee`" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:165 +msgid "" +"Security recommendation: It is recommended to not enable compression and set " +"this parameter to `stub-v2`" +msgstr "" +"Beveiligingsaanbeveling: Het wordt aanbevolen om compressie niet in te " +"schakelen en deze parameter in te stellen op `stub-v2`" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:85 +msgid "Select template ..." +msgstr "Selecteer sjabloon ..." + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:496 +msgid "Send notification to peer on disconnect" +msgstr "Stuur een melding naar peer bij het verbreken van de verbinding" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:15 +msgid "Service" +msgstr "Dienst" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:266 +msgid "Set TCP/UDP MTU" +msgstr "Stel TCP/UDP MTU in" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:397 +msgid "Set aside a pool of subnets" +msgstr "Zet een pool van subnetten opzij" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:535 +msgid "Set extended HTTP proxy options" +msgstr "Stel uitgebreide HTTP-proxyopties in" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:20 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:13 +msgid "Set output verbosity" +msgstr "Stel de breedsprakigheid van de uitvoer in" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:442 +msgid "Set size of real and virtual address hash tables" +msgstr "Stel de grootte van echte en virtuele adres-hashtabellen in" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:292 +msgid "Set the TCP/UDP receive buffer size" +msgstr "Stel de grootte van de TCP/UDP-ontvangstbuffer in" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:288 +msgid "Set the TCP/UDP send buffer size" +msgstr "Stel de TCP/UDP-verzendbuffergrootte in" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:296 +msgid "Set tun/tap TX queue length" +msgstr "Stel de wachtrijlengte van tun/tap TX in" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:213 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:29 +msgid "Set tun/tap adapter parameters" +msgstr "Stel tun/tap-adapterparameters in" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:270 +msgid "Set tun/tap device MTU" +msgstr "Stel tun/tap-apparaat MTU in" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:274 +msgid "Set tun/tap device overhead" +msgstr "Stel tun/tap apparaat overhead in" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:283 +msgid "Set upper bound on TCP MSS" +msgstr "Stel bovengrens in op TCP MSS" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:300 +msgid "Shaping for peer bandwidth" +msgstr "Vormgeven voor peer-bandbreedte" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:108 +msgid "Shell cmd to execute after tun device open" +msgstr "Shell cmd om uit te voeren nadat het tun-apparaat is geopend" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:116 +msgid "Shell cmd to run after tun device close" +msgstr "Shell cmd om uit te voeren nadat het tun-apparaat is gesloten" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:141 +msgid "Shell command to verify X509 name" +msgstr "Shell-opdracht om de X509-naam te verifiëren" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:640 +msgid "Silence the output of replay warnings" +msgstr "Zet de uitvoer van herhalingswaarschuwingen uit" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:627 +msgid "Size of cipher key" +msgstr "Grootte van cijfersleutel" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:229 +msgid "Specify a default gateway for routes" +msgstr "Geef een standaardgateway op voor routes" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:561 +msgid "Specify whether the client is required to supply a valid certificate" +msgstr "Geef op of de client een geldig certificaat moet verstrekken" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:355 +msgid "Start OpenVPN in a hibernating state" +msgstr "Start OpenVPN in een slaapstand" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:117 +msgid "Start/Stop" +msgstr "Start/Stop" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:106 +msgid "Started" +msgstr "Begon" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:100 +msgid "Status file format version" +msgstr "Versie van het statusbestandsformaat" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:15 +msgid "Switch to advanced configuration" +msgstr "Overschakelen naar geavanceerde configuratie" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:18 +msgid "Switch to basic configuration" +msgstr "Schakel over naar de basisconfiguratie" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:181 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:21 +msgid "TCP/UDP port # for both local and remote" +msgstr "TCP/UDP-poort # voor zowel lokaal als op afstand" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:185 +msgid "TCP/UDP port # for local (default=1194)" +msgstr "TCP/UDP-poort # voor lokaal (default=1194)" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:189 +msgid "TCP/UDP port # for remote (default=1194)" +msgstr "TCP/UDP-poort # voor remote (default=1194)" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:712 +msgid "TLS 1.3 or newer cipher" +msgstr "TLS 1.3 of nieuwer cijfer" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:704 +msgid "TLS cipher" +msgstr "TLS-codering" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:56 +msgid "TOS passthrough (applies to IPv4 only)" +msgstr "TOS passthrough (geldt alleen voor IPv4)" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:78 +msgid "Template based configuration" +msgstr "Op sjablonen gebaseerde configuratie" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:437 +msgid "Temporary directory for client-connect return file" +msgstr "Tijdelijke map voor client-connect retourbestand" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:12 +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:40 +msgid "The 'Name' field must not be empty!" +msgstr "Het veld 'Naam' mag niet leeg zijn!" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:22 +msgid "" +"The OVPN config file (%s) could not be found, please check your " +"configuration." +msgstr "" +"Het OVPN-configuratiebestand (%s) kon niet worden gevonden, controleer uw " +"configuratie." + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +msgid "The highest supported TLS version" +msgstr "De hoogst ondersteunde TLS-versie" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 +msgid "The key direction for 'tls-auth' and 'secret' options" +msgstr "De sleutelrichting voor de opties 'tls-auth' en 'geheim'" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +msgid "The lowest supported TLS version" +msgstr "De laagst ondersteunde TLS-versie" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:31 +msgid "" +"The size of the OVPN config file (%s) is too large for online editing in " +"LuCI (≥ 100 KB)." +msgstr "" +"De grootte van het OVPN-configuratiebestand (%s) is te groot voor online " +"bewerking in LuCI (≥ 100 KB)." + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +msgid "This completely disables cipher negotiation" +msgstr "Dit schakelt coderingsonderhandeling volledig uit" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:732 +msgid "Timeframe for key exchange" +msgstr "Tijdschema voor sleuteluitwisseling" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:205 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:25 +msgid "Type of used device" +msgstr "Type gebruikt apparaat" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 +msgid "Upload" +msgstr "Uploaden" + +#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 +msgid "Upload ovpn file" +msgstr "Upload ovpn-bestand" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:510 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:97 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:103 +msgid "Use protocol" +msgstr "Gebruik protocol" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:209 +msgid "Use tun/tap device node" +msgstr "Gebruik het tun/tap-apparaatknooppunt" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:472 +msgid "Use username as common name" +msgstr "Gebruik gebruikersnaam als algemene naam" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:368 +msgid "VPN" +msgstr "VPN" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:64 +msgid "Write log to file" +msgstr "Logboek naar bestand schrijven" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:96 +msgid "Write status to file every n seconds" +msgstr "Schrijf elke n seconden de status naar het bestand" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:112 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:114 +msgid "no" +msgstr "nee" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:201 +msgid "tun/tap device" +msgstr "tun/tap apparaat" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:304 +msgid "tun/tap inactivity timeout" +msgstr "tun/tap inactiviteits time-out" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:111 +msgid "yes (%i)" +msgstr "ja (%i)" diff --git a/package/luci/applications/luci-app-openvpn/po/pl/openvpn.po b/package/luci/applications/luci-app-openvpn/po/pl/openvpn.po index d5838d982a..c2fbd9339b 100644 --- a/package/luci/applications/luci-app-openvpn/po/pl/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/pl/openvpn.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-10-28 15:05+0000\n" +"PO-Revision-Date: 2023-05-14 10:50+0000\n" "Last-Translator: Matthaiks \n" -"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -102,7 +102,7 @@ msgstr "Zmień priorytet procesu" msgid "Change to directory before initialization" msgstr "Przejdź do katalogu przed inicjalizacją" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Sprawdź certyfikat peera na obecność w CRL" @@ -187,7 +187,7 @@ msgstr "Nie uruchamiaj obecnie ifconfig" msgid "Don't add routes automatically" msgstr "Nie dodawaj tras automatycznie" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "Nie buforuj haseł --askpass lub --auth-user-pass" @@ -267,6 +267,13 @@ msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" "Szyfruj i uwierzytelnij wszystkie pakiety kanału kontrolnego za pomocą klucza" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Szyfruj i uwierzytelniaj wszystkie pakiety kanału kontrolnego za pomocą " +"klucza w wersji 2." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Szyfrowanie dla pakietów" @@ -293,7 +300,7 @@ msgid "" "added to OpenVPN's internal routing table" msgstr "" "Wykonane w trybie serwera, gdy adres IPv4, trasa lub adres MAC są dodane do " -"wewnętrznej tablicy routingu w OpenVPN" +"wewnętrznej tablicy trasowania OpenVPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:744 msgid "Exit on TLS negotiation failure" @@ -391,7 +398,7 @@ msgstr "Liczba linii w pliku dziennika historii" msgid "OVPN configuration file upload" msgstr "Przesyłanie pliku konfiguracyjnego OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Akceptuj tylko połączenia z podanej nazwy X509" @@ -515,11 +522,11 @@ msgstr "Renegocjacja danych charakteru klucza po sekundach" msgid "Replay protection sliding window size" msgstr "Powtórzenie osłony okna rozmiaru" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Potrzebna Podpis na Certyfikacie" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Potrzebna klucza używanego w certyfikacie" @@ -527,7 +534,7 @@ msgstr "Potrzebna klucza używanego w certyfikacie" msgid "Restart after remote ping timeout" msgstr "Restartuj po upływie limitu zdalnego pingowania" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Ograniczenie dozwolonych szyfrów, które mają być negocjowane" @@ -756,16 +763,16 @@ msgstr "" "Plik konfiguracyjny OVPN (%s) nie mógł zostać znaleziony, sprawdź swoją " "konfigurację." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "Najwyższa obsługiwana wersja protokołu TLS" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "Kluczowy kierunek dla opcji \"tls-auth\" i \"secret\"" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "Najniższa obsługiwana wersja protokołu TLS" @@ -777,7 +784,7 @@ msgstr "" "Rozmiar pliku konfiguracyjnego OVPN (%s) jest zbyt duży do edycji online w " "LuCI (≥ 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Spowoduje to całkowite wyłączenie negocjacji szyfrowania" diff --git a/package/luci/applications/luci-app-openvpn/po/pt/openvpn.po b/package/luci/applications/luci-app-openvpn/po/pt/openvpn.po index 62d53f4552..25159d3aad 100644 --- a/package/luci/applications/luci-app-openvpn/po/pt/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/pt/openvpn.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-26 19:03+0200\n" "PO-Revision-Date: 2022-10-30 15:06+0000\n" "Last-Translator: ssantos \n" -"Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" @@ -103,7 +103,7 @@ msgstr "Alterar prioridade do processo" msgid "Change to directory before initialization" msgstr "Mudar para o directório antes da inicialização" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Verificar certificado do remoto conta uma CRL" @@ -188,7 +188,7 @@ msgstr "Não executar ifconfig" msgid "Don't add routes automatically" msgstr "Não adicionar rotas automaticamente" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "Não pôr as palavras-passe em cache --askpass ou --auth-user-pass" @@ -268,6 +268,13 @@ msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" "Criptografar e autenticar todos os pacotes de canais de controle com a chave" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Cifrar e autenticar todos os pacotes de canal de controle com a chave, " +"versão 2." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Cifra de encriptação para pacotes" @@ -392,7 +399,7 @@ msgstr "Numero de linhas para o histórico de ficheiros de registo" msgid "OVPN configuration file upload" msgstr "Envio do ficheiro de configuração OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Aceitar ligações apenas de um dado nome X509" @@ -517,11 +524,11 @@ msgstr "Renegociar chave do canal de dados após n segundos" msgid "Replay protection sliding window size" msgstr "Tamanho da janela de protecção conta replay" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Requerer designação específica no certificado" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Requerer utilização explicita de utilização de chave no certificado" @@ -529,7 +536,7 @@ msgstr "Requerer utilização explicita de utilização de chave no certificado" msgid "Restart after remote ping timeout" msgstr "Reiniciar após timeout do ping remoto" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Restringir as cifras permitidas a serem negociadas" @@ -757,16 +764,16 @@ msgstr "" "O ficheiro de configuração OVPN (%s) não pôde ser encontrado, por favor " "verifique a sua configuração." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "A versão TLS mais alta suportada" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "A direção chave para as opções 'tls-auth' e 'secret'" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "A versão TLS suportada mais baixa" @@ -778,7 +785,7 @@ msgstr "" "O tamanho do ficheiro de configuração OVPN (%s) é demasiado grande para " "editá-lo online em LuCI (≥ 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Isso desativa completamente a negociação de cifras" diff --git a/package/luci/applications/luci-app-openvpn/po/pt_BR/openvpn.po b/package/luci/applications/luci-app-openvpn/po/pt_BR/openvpn.po index 83e190a14b..a217a5e0ad 100644 --- a/package/luci/applications/luci-app-openvpn/po/pt_BR/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/pt_BR/openvpn.po @@ -6,7 +6,7 @@ msgstr "" "PO-Revision-Date: 2022-10-28 15:05+0000\n" "Last-Translator: Wellington Terumi Uemura \n" "Language-Team: Portuguese (Brazil) \n" +"librecmc/luciapplicationsopenvpn/pt_BR/>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -103,7 +103,7 @@ msgstr "Alterar prioridade do processo" msgid "Change to directory before initialization" msgstr "Mudar para o diretório antes da iniciação" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Verificar certificado do parceiro conta uma CRL" @@ -188,7 +188,7 @@ msgstr "Não executar ifconfig de verdade" msgid "Don't add routes automatically" msgstr "Não adicionar rotas automaticamente" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "Não colocar em cache as senhas do --askpass ou --auth-user-pass" @@ -266,6 +266,13 @@ msgstr "Ativado" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "Cifre e autentique todos os pacotes do canal de controle com a chave" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Criptografe e autentique todos os pacotes do canal de controle com a chave, " +"versão 2." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Cifra de encriptação para pacotes" @@ -390,7 +397,7 @@ msgstr "Número de linhas para o histórico do registo" msgid "OVPN configuration file upload" msgstr "Enviar um arquivo de configuração OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Aceitar conexões apenas de um dado nome X509" @@ -513,11 +520,11 @@ msgstr "Renegociar chave do canal de dados após n segundos" msgid "Replay protection sliding window size" msgstr "Tamanho da janela de proteção conta replay" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Requerer designação específica no certificado" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Requerer que o uso da chave seja explicitado no certificado" @@ -525,7 +532,7 @@ msgstr "Requerer que o uso da chave seja explicitado no certificado" msgid "Restart after remote ping timeout" msgstr "Reiniciar após estouro do tempo do ping remoto" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Restringir as cifras permitidas para a negociação" @@ -755,16 +762,16 @@ msgstr "" "O arquivo de configuração OVPN (%s) não pôde ser encontrado, por favor " "verifique a sua configuração." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "A mais alta versão suporta do TLS" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "A direção da chave para as opções 'tls-auth' e 'secret'" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "A mais baixa versão suporta do TLS" @@ -776,7 +783,7 @@ msgstr "" "O tamanho do arquivo de configuração OVPN (%s) é grande demais para ser " "editado através do LuCI (≥ 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Isso desabilita completamente a negociação de cifras" diff --git a/package/luci/applications/luci-app-openvpn/po/ro/openvpn.po b/package/luci/applications/luci-app-openvpn/po/ro/openvpn.po index ba02739aa1..a98a4b4550 100644 --- a/package/luci/applications/luci-app-openvpn/po/ro/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/ro/openvpn.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-11-04 20:04+0000\n" -"Last-Translator: Simona Iacob \n" -"Language-Team: Romanian \n" +"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -101,7 +101,7 @@ msgstr "Prioritatea procesului de schimbare" msgid "Change to directory before initialization" msgstr "Schimbarea în director înainte de inițializare" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Verificarea certificatului omolog cu o CRL" @@ -186,7 +186,7 @@ msgstr "Nu executați efectiv ifconfig" msgid "Don't add routes automatically" msgstr "Nu adăugați automat rute" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "Nu stocați în memoria cache parolele --askpass sau --auth-user-pass" @@ -258,12 +258,19 @@ msgstr "Activați interfața de gestionare pe IP port" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:104 msgid "Enabled" -msgstr "Activat" +msgstr "activat" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:752 msgid "Encrypt and authenticate all control channel packets with the key" msgstr "Criptează și autentifică toate pachetele canalului de control cu cheia" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Criptează și autentifică toate pachetele canalului de control cu cheia, " +"versiunea 2." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Cifru de criptare pentru pachete" @@ -388,7 +395,7 @@ msgstr "Numărul de linii pentru istoricul fișierului jurnal" msgid "OVPN configuration file upload" msgstr "Încărcarea fișierului de configurare OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Acceptă doar conexiuni de la numele X509 dat" @@ -514,11 +521,11 @@ msgstr "Renegociați cheia de schimbare a datelor după câteva secunde" msgid "Replay protection sliding window size" msgstr "Dimensiunea ferestrei glisante de protecție a reluării" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Solicită o denumire explicită pe certificat" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Cereți utilizarea explicită a cheii pe certificat" @@ -526,7 +533,7 @@ msgstr "Cereți utilizarea explicită a cheii pe certificat" msgid "Restart after remote ping timeout" msgstr "Repornire după expirarea timpului de ping la distanță" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Limitarea cifrului permis pentru a fi negociat" @@ -755,16 +762,16 @@ msgstr "" "Fișierul de configurare OVPN (%s) nu a putut fi găsit, vă rugăm să vă " "verificați configurația." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "Cea mai înaltă versiune TLS acceptată" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "Direcția cheie pentru opțiunile \"tls-auth\" și \"secret" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "Cea mai mică versiune TLS acceptată" @@ -776,7 +783,7 @@ msgstr "" "Dimensiunea fișierului de configurare OVPN (%s) este prea mare pentru " "editarea online în LuCI (≥ 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Acest lucru dezactivează complet negocierea cifrului" diff --git a/package/luci/applications/luci-app-openvpn/po/ru/openvpn.po b/package/luci/applications/luci-app-openvpn/po/ru/openvpn.po index 22362bad12..cdeb194c7f 100644 --- a/package/luci/applications/luci-app-openvpn/po/ru/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/ru/openvpn.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: LuCI: openvpn\n" "POT-Creation-Date: 2013-09-06 10:01+0200\n" -"PO-Revision-Date: 2022-10-28 15:05+0000\n" -"Last-Translator: sergio \n" -"Language-Team: Russian \n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.17-dev\n" "Project-Info: Это технический перевод, не дословный. Главное-удобный русский " "интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" @@ -22,7 +22,7 @@ msgstr "'net30', 'p2p' или 'subnet'" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:481 msgid "Accept options pushed from server" -msgstr "Принимать настройки отправленные сервером" +msgstr "Принимать настройки, отправленные сервером" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:92 msgid "Add" @@ -38,7 +38,7 @@ msgstr "Добавить конфигурацию на основе шаблон #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:748 msgid "Additional authentication over TLS" -msgstr "Дополнительная аутентификация используя TLS" +msgstr "Дополнительная аутентификация с использованием TLS" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:417 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:57 @@ -60,16 +60,15 @@ msgstr "Разрешить удаленное изменение IP-адреса #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:457 msgid "Allowed maximum of connected clients" -msgstr "Разрешено максимальное количество подключенных клиентов" +msgstr "Максимальное количество подключенных клиентов" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:462 msgid "Allowed maximum of internal" -msgstr "" -"Разрешено максимальное кол-во внутренних маршрутов клиенту (по умолчанию 256)" +msgstr "Максимальное количество внутренних маршрутов клиенту" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:467 msgid "Allowed maximum of new connections" -msgstr "Разрешено максимальное кол-во новых соединений" +msgstr "Максимальное количество новых соединений" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:68 msgid "Append log to file" @@ -77,11 +76,11 @@ msgstr "Добавить запись в файл журнала" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:486 msgid "Authenticate using username/password" -msgstr "Аутентификация используя имя пользователя и пароль" +msgstr "Аутентификация по имени пользователя и паролю" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:556 msgid "Automatically redirect default route" -msgstr "Автоматически перенаправлять маршруты по умолчанию" +msgstr "Автоматически перенаправлять маршрут по умолчанию" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:11 msgid "Below is a list of configured OpenVPN instances and their current state" @@ -89,9 +88,7 @@ msgstr "Список настроенных экземпляров OpenVPN и и #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:120 msgid "Call down cmd/script before TUN/TAP close" -msgstr "" -"Команда/скрипт для командной строки, запускаемая(ый) перед отключением TUN/" -"TAP" +msgstr "Команда или скрипт, который будет выполнен перед отключением TUN/TAP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:658 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:77 @@ -101,15 +98,16 @@ msgstr "Центр сертификации" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:80 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:17 msgid "Change process priority" -msgstr "Изменить приоритет процесса после инициализации" +msgstr "Изменить приоритет процесса" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:40 msgid "Change to directory before initialization" msgstr "Перейти в указанную папку перед инициализацией" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" -msgstr "Проверить сертификат узла на соответствие файлу CRL в формате PEM" +msgstr "" +"Проверять наличие сертификата узла в CRL (списке отозванных сертификатов)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:44 msgid "Chroot to directory after initialization" @@ -123,7 +121,7 @@ msgstr "Клиент отключен" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:20 msgid "Configuration category" -msgstr "Категория настройки" +msgstr "Разделы настроек:" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:477 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:53 @@ -142,11 +140,11 @@ msgstr "Настроить режим сервера" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:540 msgid "Connect through Socks5 proxy" -msgstr "Соединяться используя Socks5 прокси" +msgstr "Подключаться через SOCKS5-прокси" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:520 msgid "Connect to remote host through an HTTP proxy" -msgstr "Подключиться к удалённому хосту используя HTTP прокси" +msgstr "Подключаться к удаленной машине с использованием HTTP-прокси" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:515 msgid "Connection retry interval" @@ -158,27 +156,24 @@ msgstr "Криптография" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:233 msgid "Delay n seconds after connection" -msgstr "Задержка n секунд после подключения" +msgstr "Задержка после подключения, в секундах" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:112 msgid "Delay tun/tap open and up script execution" -msgstr "Использовать задержку запуска tun/tap до выполнения скрипта" +msgstr "Задержка между запуском TUN/TAP и выполнением скрипта" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:662 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:81 msgid "Diffie-Hellman parameters" -msgstr "Файл параметров Диффи Хелмана" +msgstr "Файл параметров Диффи-Хеллмана" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:427 msgid "Directory for custom client config files" -msgstr "Папка для пользовательских config файлов клиента" +msgstr "Директория для пользовательских config-файлов клиента" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:24 msgid "Disable Paging" -msgstr "" -"Отключить пейджинг, путём вызвова функции 'POSIX mlockall'. Требуется, чтобы " -"OpenVPN был первоначально запущен от root.
    Хотя OpenVPN может " -"впоследствии понизить свой UID с помощью опции '-user'" +msgstr "Отключить сброс страниц из оперативной памяти в файл подкачки" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:28 msgid "Disable options consistency check" @@ -187,36 +182,29 @@ msgstr "Выключить проверку согласованности па #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:197 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:41 msgid "Do not bind to local address and port" -msgstr "" -"Не выполнять привязку к локальному адресу и порту. Используется динамический " -"порт, подключение только с параметром 'remote'" +msgstr "Не привязываться к локальному адресу и порту" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:217 msgid "Don't actually execute ifconfig" -msgstr "" -"На самом деле не выполнять команды 'ifconfig/netsh'. Вместо этого передавать " -"параметры '-ifconfig' сценариям с использованием переменных окружения" +msgstr "Не выполнять команды ifconfig" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:237 msgid "Don't add routes automatically" -msgstr "" -"Не добавлять маршруты автоматически. Вместо этого передавать маршруты в '-" -"route-up' скрипт используя переменные окружения" +msgstr "Не добавлять маршруты автоматически" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" -msgstr "" -"Не кэшировать пароли '-askpass' или '-auth-user-pass' в виртуальной памяти" +msgstr "Не кэшировать пароли --askpass и --auth-user-pass в оперативной памяти" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:245 msgid "Don't drop incoming tun packets with same destination as host" msgstr "" -"Не отбрасывать входящие tun пакеты с таким же адресом назначения, как и у " +"Не отбрасывать входящие tun-пакеты с таким же адресом назначения, как и у " "хоста" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:387 msgid "Don't inherit global push options" -msgstr "Не наследовать общие \"Push Options\"" +msgstr "Не наследовать глобальные опции push" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:72 msgid "Don't log timestamps" @@ -224,23 +212,17 @@ msgstr "Не записывать метки времени в системны #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:241 msgid "Don't pull routes automatically" -msgstr "" -"Когда используется опция '-client' или '-pull', принять опции переданные " -"сервером ИСКЛЮЧАЯ опции для маршрутов и dhcp опции например DNS серверы.
    Когда используется на клиенте, эта опция эффективно 'затыкает' сервер от " -"попытки добавить маршруты в таблицу маршрутизации клиента.
    Хотя имейте " -"ввиду что эта опция по прежнему позволяет серверу устанавливать свойства TCP/" -"IP для клиентского TUN/TAP интерфейса" +msgstr "Не добавлять маршруты автоматически" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:332 msgid "Don't re-read key on restart" msgstr "" -"Не перечитывайте файлы ключей при перезапуске (выполнении 'SIGUSR1' или " -"'ping-restart')" +"Не перечитывать файлы ключей при перезапуске (выполнении 'SIGUSR1' или 'ping-" +"restart')" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:261 msgid "Don't use adaptive lzo compression" -msgstr "Не использовать адаптивное сжатие 'lzo'" +msgstr "Не использовать адаптивное сжатие по алгоритму LZO" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:221 msgid "Don't warn on ifconfig inconsistencies" @@ -263,14 +245,14 @@ msgstr "Включить поддержку аппаратного шифров #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:249 msgid "Enable Path MTU discovery" -msgstr "Включить обнаружение пути MTU (PMTUD)" +msgstr "Автоматически определять MTU (PMTUD)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:568 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:65 msgid "Enable Static Key encryption mode (non-TLS)" msgstr "" -"Включить режим шифрования с использованием Статического ключа (не TLS). " -"Использовать общий секретный файл, который был сгенерирован 'genkey'" +"Симметричное шифрование (не TLS) по общему секретному файлу, который можно " +"сгенерировать при помощи --genkey" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:653 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:678 @@ -279,28 +261,32 @@ msgstr "Включить TLS и выступить в роли клиента в #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:648 msgid "Enable TLS and assume server role" -msgstr "Включить в режиме сервера протокол TLS" +msgstr "Включить TLS и выступить в роли сервера во время подтверждения TLS" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:278 msgid "Enable internal datagram fragmentation" msgstr "" -"Включить внутреннюю фрагментацию датаграмм, чтобы не отправлялись UDP-" -"датаграммы, размер которых превышает максимальное число байтов" +"Фрагментировать UDP-дейтаграммы, которые превышают указанный порог в байтах" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:345 msgid "Enable management interface on IP port" -msgstr "" -"Включить интерфейс управления, назначив ему IP-адрес порт" +msgstr "Включить интерфейс управления, по IP-адресу и порту" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:104 msgid "Enabled" -msgstr "Включено" +msgstr "Включен" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:752 msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" -"Шифрование и проверка подлинности всех пакетов каналов управления с помощью " -"ключа" +"Шифровать и аутентифицировать все пакеты канала управления с помощью ключа" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Шифровать и аутентифицировать все пакеты канала управления с помощью ключа, " +"версия 2." #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" @@ -340,14 +326,11 @@ msgstr "Предоставить доступ к конфигурации OpenVP #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:573 msgid "HMAC authentication for packets" -msgstr "Аутентификация с помощью HMAC ключа для пакетов" +msgstr "Алгоритм расчета HMAC кода для аутентификации пакетов" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:491 msgid "Handling of authentication failures" -msgstr "" -"Настройка реакции на ошибки проверки имени пользователя / пароля, такие как " -"ответ клиента на AUTH_FAILED сообщение от сервера или провал проверки пароля " -"закрытого ключа" +msgstr "Обработка отказов аутентификации" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:308 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:49 @@ -355,8 +338,8 @@ msgid "" "Helper directive to simplify the expression of --ping and --ping-restart in " "server mode configurations" msgstr "" -"Вспомогательная команда предназначенная для упрощения выражений '-ping' и '-" -"ping-restart' в режиме настройки сервера" +"Вспомогательная команда, предназначенная для упрощения выражений --ping и --" +"ping-restart в режиме настройки сервера" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:551 msgid "If hostname resolve fails, retry" @@ -369,7 +352,7 @@ msgstr "Экземпляр «%s»" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:18 #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:46 msgid "Instance with that name already exists!" -msgstr "Экзмепляр с таким именем уже существует!" +msgstr "Экземпляр с таким именем уже существует!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:336 msgid "Keep local IP address on restart" @@ -381,11 +364,11 @@ msgstr "Не изменять удалённый IP-адрес при перез #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:328 msgid "Keep tun/tap device open on restart" -msgstr "Сохранять виртуальное устройство tun/tap запущенным при перезагрузке" +msgstr "Сохранять виртуальное устройство TUN/TAP запущенным при перезагрузке" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:736 msgid "Key transition window" -msgstr "Окно передачи ключей" +msgstr "Период жизни старого ключа во время обновления" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:104 msgid "Limit repeated log messages" @@ -398,12 +381,12 @@ msgstr "Локальный сертификат" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:177 msgid "Local host name or IP address" -msgstr "Имя локального хоста или IP-адрес" +msgstr "Имя или IP-адрес локального хоста" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:670 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:89 msgid "Local private key" -msgstr "Локальный Приватный ключ" +msgstr "Локальный закрытый ключ" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:173 msgid "Major mode" @@ -411,7 +394,7 @@ msgstr "Основной режим" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:452 msgid "Maximum number of queued TCP output packets" -msgstr "Максимальное количество исходящих TCP пакетов в очереди" +msgstr "Максимальное количество сегментов TCP в очереди на отправку" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:168 msgid "Networking" @@ -429,9 +412,9 @@ msgstr "Количество строк в файле журнала" msgid "OVPN configuration file upload" msgstr "Загрузка конфигурационного файла OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" -msgstr "Принимать только соединения от имени указанного сертификата X509" +msgstr "Принимать только соединения от указанного X.509 имени" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:324 msgid "Only process ping timeouts if routes exist" @@ -460,8 +443,8 @@ msgstr "Обзор" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:73 msgid "PKCS#12 file containing keys" msgstr "" -"Задайте файл 'PKCS #12', содержащий локальный приватный ключ, локальный " -"сертификат и root CA сертификат" +"Файл PKCS#12, содержащий закрытый ключ, локальный сертификат и сертификат " +"корневого центра сертификации" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:137 msgid "Pass environment variables to script" @@ -475,7 +458,9 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:402 msgid "Persist/unpersist ifconfig-pool" -msgstr "Сохранять/не сохранять пул ifconfig" +msgstr "" +"Сохранять пул ifconfig в указанный файл с заданной периодичностью (в " +"секундах)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:312 msgid "Ping remote every n seconds over TCP/UDP port" @@ -487,11 +472,11 @@ msgstr "Редактируйте данный файл только в терм #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:51 msgid "Please select a valid OVPN config file to upload!" -msgstr "Пожалуйста выберите корректный OVPN файл для загрузки!" +msgstr "Пожалуйста, выберите для загрузки корректный OVPN файл!" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:23 msgid "Please select a valid VPN template!" -msgstr "Пожалуйста выберите корректный шаблон конфигурации!" +msgstr "Пожалуйста, выберите корректный шаблон VPN соединения!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:161 msgid "Policy level over usage of external programs and scripts" @@ -511,7 +496,7 @@ msgstr "Время ожидания прокси в секундах" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:407 msgid "Push an ifconfig option to remote" -msgstr "Выполнить команду ifconfig на удалённом узле" +msgstr "Выполнить команду ifconfig на удаленном узле" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:382 msgid "Push options to peer" @@ -519,27 +504,28 @@ msgstr "Параметры узла - 'Push options'" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:350 msgid "Query management channel for private key" -msgstr "Канал управления запросами для Приватного ключа" +msgstr "Канал управления запросами для закрытого ключа" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:505 msgid "Randomly choose remote server" -msgstr "Случайный выбор удалённого сервера" +msgstr "Случайно выбирать удаленный сервер" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:432 msgid "Refuse connection if no custom client config" msgstr "" -"Разорвать соединение, если пользовательский config файл клиента отсутствует" +"Разорвать соединение, если пользовательский конфигурационный файл клиента " +"отсутствует" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:92 msgid "Remap SIGUSR1 signals" msgstr "" -"Управление внутренними или внешними сигналами генерируемыми 'SIGUSR1' и " -"переназначаемыми 'SIGHUP'" +"Изменить реакцию на сигнал SIGUSR1: SIGHUP (перезагрузка без сохранения " +"состояния) или SIGTERM (выход)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:501 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:61 msgid "Remote host name or IP address" -msgstr "Имя удалённого хоста или IP-адрес" +msgstr "Имя удаленного хоста или его IP-адрес" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:316 msgid "Remote ping timeout" @@ -547,32 +533,29 @@ msgstr "Время ожидания удаленного пинг-запроса #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:720 msgid "Renegotiate data chan. key after bytes" -msgstr "" -"Повторное согласование ключа канала данных после отправки или получения n " -"байт (по умолчанию отключено)" +msgstr "Повторное согласование ключа канала данных после пересылки N байт" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:724 msgid "Renegotiate data chan. key after packets" -msgstr "" -"Повторное согласование ключа канала данных после отправки и получения n " -"пакетов (по умолчанию отключено)" +msgstr "Повторное согласование ключа канала данных после пересылки N пакетов" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:728 msgid "Renegotiate data chan. key after seconds" msgstr "" -"Повторное согласование ключа канала данных через n секунд (по умолчанию 3600)" +"Повторное согласование ключа канала данных каждые N секунд (по умолчанию " +"3600)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:636 msgid "Replay protection sliding window size" msgstr "" -"Использовать защиту от повтора - скользящее окно размером 'n' с интервалом " -"времени 't' секунд" +"Использовать защиту от повтора — скользящее окно размером N с интервалом " +"времени T секунд" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Требовать явного указания в сертификате" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Требовать явного использования ключа в сертификате" @@ -580,27 +563,23 @@ msgstr "Требовать явного использования ключа в msgid "Restart after remote ping timeout" msgstr "Перезапуск после таймаута ожидания удаленного пинг-запроса" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Ограничить разрешенные шифры согласования" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:716 msgid "Retransmit timeout on TLS control channel" msgstr "" -"Пакет ретранслирует тайм-аут на канале управления протокола TLS, если нет " -"подтверждения от удаленного узла в течение секунд (по умолчанию 2)" +"Период повторной передачи пакета по управляющему TLS каналу, если нет " +"подтверждения от удаленного узла, в секундах" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:525 msgid "Retry indefinitely on HTTP proxy errors" -msgstr "" -"Постоянно пытаться заново подключиться при ошибке HTTP прокси. Если " -"возникает ошибка прокси-сервера HTTP, имитировать сброс 'SIGUSR1'" +msgstr "Переподключаться в случае ошибок HTTP-прокси" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:546 msgid "Retry indefinitely on Socks proxy errors" -msgstr "" -"Постоянно пытаться заново подключиться при ошибке Socks прокси. Если " -"возникает ошибка прокси-сервера HTTP, имитировать сброс 'SIGUSR1'" +msgstr "Переподключаться в случае ошибок SOCKS-прокси" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:412 msgid "Route subnet to client" @@ -627,7 +606,7 @@ msgid "" "Section to add an optional 'auth-user-pass' file with your credentials (%s)" msgstr "" "Раздел для добавления дополнительного 'auto-user-pass' файла с вашими " -"учётными данными (%s)" +"учетными данными (%s)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:44 msgid "Section to modify the OVPN config file (%s)" @@ -639,16 +618,16 @@ msgid "" "Security recommendation: It is recommended to not enable compression and set " "this parameter to `no`" msgstr "" -"Рекомендация по безопасности: рекомендуется не включать сжатие и выставить " -"этот параметр как `no`" +"В целях безопасности включать сжатие не рекомендуется (выставьте этот " +"параметр в `no`)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:165 msgid "" "Security recommendation: It is recommended to not enable compression and set " "this parameter to `stub-v2`" msgstr "" -"Рекомендация по безопасности: рекомендуется не включать сжатие и выставить " -"этот параметр как `stub-v2`" +"В целях безопасности включать сжатие не рекомендуется (выставьте этот " +"параметр в `stub-v2`)" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:85 msgid "Select template ..." @@ -664,7 +643,7 @@ msgstr "Служба" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:266 msgid "Set TCP/UDP MTU" -msgstr "Задайте MTU для TCP/UDP" +msgstr "MTU для TCP/UDP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:397 msgid "Set aside a pool of subnets" @@ -672,76 +651,75 @@ msgstr "Выделить пул подсетей" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:535 msgid "Set extended HTTP proxy options" -msgstr "Задайте расширенные параметры HTTP прокси" +msgstr "Расширенные параметры HTTP-прокси" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:20 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:13 msgid "Set output verbosity" -msgstr "Задайте детализацию ведения журнала" +msgstr "Детализация ведения журнала" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:442 msgid "Set size of real and virtual address hash tables" msgstr "" -"Задайте размер реального адреса хэш-таблицы 'r' и виртуального адреса хэш-" -"таблицы 'v'. По умолчанию для обеих таблиц установлено значение 256" +"Размер реального адреса хэш-таблицы R и виртуального адреса хэш-таблицы R. " +"По умолчанию для обеих таблиц установлено значение 256" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:292 msgid "Set the TCP/UDP receive buffer size" -msgstr "Задайте размер буфера приёма TCP/UDP" +msgstr "Размер буфера TCP/UDP на прием" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:288 msgid "Set the TCP/UDP send buffer size" -msgstr "Задайте размер буфера передачи TCP/UDP" +msgstr "Размер буфера TCP/UDP на передачу" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:296 msgid "Set tun/tap TX queue length" -msgstr "" -"Задайте длину очереди передачи интерфейса tun/tap. В настоящее время по " -"умолчанию 100" +msgstr "Размер очереди передачи TUN/TAP-интерфейса" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:213 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:29 msgid "Set tun/tap adapter parameters" msgstr "" -"Задайте параметры адаптеру tun/tap. l это IP-адрес локальной конечной точки " -"VPN. Для устройств TUN rn является IP-адресом удаленной конечной точки VPN. " -"Для устройств TAP rn-это маска подсети сегмента виртуального Ethernet, к " -"которому создается или подключается" +"Параметры TUN/TAP-интерфейса в формате \"l rn\", где l — IP-адрес локальной " +"конечной точки VPN, а rn — это IP-адрес удаленной конечной точки VPN (TUN) " +"или маска подсети (TAP)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:270 msgid "Set tun/tap device MTU" -msgstr "Задайте MTU для виртуального устройства tun/tap" +msgstr "Задайте MTU для виртуального устройства TUN/TAP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:274 msgid "Set tun/tap device overhead" msgstr "" -"Задайте возможное превышение размера MTU для виртуального устройства tun/tap" +"Резерв из MTU на заголовки для сегментов виртуального устройства TUN/TAP в " +"байтах" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:283 msgid "Set upper bound on TCP MSS" -msgstr "Задайте верхнюю границу для TCP MSS" +msgstr "" +"Верхняя граница для TCP MSS (максимальный размер сегмента ≤ MTU − IP-" +"заголовок − TCP-заголовок)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:300 msgid "Shaping for peer bandwidth" -msgstr "Формирование полосы пропускания узлов" +msgstr "Ограничение полосы пропускания" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:108 msgid "Shell cmd to execute after tun device open" -msgstr "Выполнить shell команду после старта виртуального устройства tun" +msgstr "Выполнить команду оболочки после открытия виртуального устройства TUN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:116 msgid "Shell cmd to run after tun device close" -msgstr "Выполнить shell команду после закрытия виртуального устройства tun" +msgstr "Выполнить shell команду после закрытия виртуального устройства TUN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:141 msgid "Shell command to verify X509 name" -msgstr "Команда shell для проверки имени сертификата X509" +msgstr "Команда оболочки для проверки имени X.509-сертификата" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:640 msgid "Silence the output of replay warnings" msgstr "" -"Заглушить вывод предупреждений о повторах, которые являются обычным ложным " -"сигналом в Wi-Fi сетях" +"Не выводить предупреждения о повторах. В Wi-Fi сетях часты ложные сработки" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:627 msgid "Size of cipher key" @@ -749,7 +727,7 @@ msgstr "Размер ключа алгоритма шифрования" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:229 msgid "Specify a default gateway for routes" -msgstr "Назначить шлюз по умолчанию для маршрутов" +msgstr "Шлюз по умолчанию для маршрутов" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:561 msgid "Specify whether the client is required to supply a valid certificate" @@ -761,11 +739,11 @@ msgstr "Запустить OpenVPN в спящем режиме" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:117 msgid "Start/Stop" -msgstr "Старт/Стоп" +msgstr "Запуск/Остановка" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:106 msgid "Started" -msgstr "Запущено" +msgstr "Запущен" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:100 msgid "Status file format version" @@ -782,27 +760,29 @@ msgstr "Перейти к основным настройкам" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:181 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:21 msgid "TCP/UDP port # for both local and remote" -msgstr "Номер локального и удалённого TCP/UDP порта" +msgstr "Номер локального и удаленного TCP/UDP порта" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:185 msgid "TCP/UDP port # for local (default=1194)" -msgstr "Номер локального TCP/UDP порта (1194 по умолчанию)" +msgstr "Номер локального TCP/UDP порта (по умолчанию 1194)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:189 msgid "TCP/UDP port # for remote (default=1194)" -msgstr "Номер удалённого TCP/UDP порта (1194 по умолчанию)" +msgstr "Номер удаленного TCP/UDP порта (по умолчанию 1194)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:712 msgid "TLS 1.3 or newer cipher" -msgstr "Шифр TLS 1.3 или выше" +msgstr "Алгоритм шифрования TLS 1.3 и выше" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:704 msgid "TLS cipher" -msgstr "Алгоритм шифрования TLS" +msgstr "Алгоритм шифрования TLS 1.2 и ниже" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:56 msgid "TOS passthrough (applies to IPv4 only)" -msgstr "TOS пересылки (применяется только к IPv4)" +msgstr "" +"Задать поле ToS (тип обслуживания) на основании этого поля в " +"инкапсулированном пакете (применимо только к IPv4)" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:78 msgid "Template based configuration" @@ -810,29 +790,29 @@ msgstr "Конфигурация на основе шаблонов" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:437 msgid "Temporary directory for client-connect return file" -msgstr "Временная папка для файла возврата '-client-connect'" +msgstr "Временный каталог для файла возврата клиентского соединения" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:12 #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:40 msgid "The 'Name' field must not be empty!" -msgstr "Поле 'Имя' не должно быть пустым!" +msgstr "Поле \"Имя\" не должно быть пустым!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:22 msgid "" "The OVPN config file (%s) could not be found, please check your " "configuration." -msgstr "OPVN файл (%s) не найден, проверьте вашу конфигурацию." +msgstr "Не удалось найти OPVN-файл (%s), проверьте вашу конфигурацию." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "Самая высокая поддерживаемая версия протокола TLS" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" -msgstr "Указать ключ для параметров 'tls-auth' и 'secret'" +msgstr "Изменить направление ключа для параметров 'tls-auth' и 'secret'" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "Самая низкая поддерживаемая версия протокола TLS" @@ -844,7 +824,7 @@ msgstr "" "Размер OPVN файла (%s) слишком большой для онлайн редактирования в LuCI (&ge " "100 Кб)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Отключение механизма согласования шифров" @@ -863,7 +843,7 @@ msgstr "Загрузить" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 msgid "Upload ovpn file" -msgstr "Загрузка OVPN файла" +msgstr "Загрузить OVPN-файл" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:510 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:97 @@ -873,7 +853,7 @@ msgstr "Использовать протокол" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:209 msgid "Use tun/tap device node" -msgstr "Использование виртуального устройства tun/tap узлом" +msgstr "Виртуальный TUN/TAP-интерфейс узла" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:472 msgid "Use username as common name" @@ -889,7 +869,7 @@ msgstr "Записывать события в файл" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:96 msgid "Write status to file every n seconds" -msgstr "Записывать состояние в файл каждые n секунд" +msgstr "Период сохранения текущего состояния в файл, в секундах" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:112 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:114 @@ -898,11 +878,11 @@ msgstr "нет" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:201 msgid "tun/tap device" -msgstr "Виртуальное устройство tun/tap" +msgstr "Виртуальный TUN/TAP-интерфейс" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:304 msgid "tun/tap inactivity timeout" -msgstr "Промежуток времени простоя tun/tap" +msgstr "Тайм-аут бездействия tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:111 msgid "yes (%i)" diff --git a/package/luci/applications/luci-app-openvpn/po/sk/openvpn.po b/package/luci/applications/luci-app-openvpn/po/sk/openvpn.po index 90317e119f..cb31146aca 100644 --- a/package/luci/applications/luci-app-openvpn/po/sk/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/sk/openvpn.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-09-19 10:18+0000\n" -"Last-Translator: Jose Riha \n" -"Language-Team: Slovak \n" +"Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.18.1-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -99,7 +99,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -184,7 +184,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -262,6 +262,11 @@ msgstr "Zapnuté" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -380,7 +385,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -503,11 +508,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -515,7 +520,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -735,16 +740,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -754,7 +759,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" @@ -804,7 +809,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:112 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:114 msgid "no" -msgstr "" +msgstr "nie" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:201 msgid "tun/tap device" diff --git a/package/luci/applications/luci-app-openvpn/po/sv/openvpn.po b/package/luci/applications/luci-app-openvpn/po/sv/openvpn.po index 550b6e3668..a2b88b3bc8 100644 --- a/package/luci/applications/luci-app-openvpn/po/sv/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/sv/openvpn.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-04-02 20:06+0000\n" +"PO-Revision-Date: 2022-12-06 15:41+0000\n" "Last-Translator: Kristoffer Grundström \n" -"Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -101,7 +101,7 @@ msgstr "Ändra process-prioritet" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -186,7 +186,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "Lägg inte till rutter automatiskt" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -264,6 +264,11 @@ msgstr "Aktiverad" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -382,7 +387,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -505,11 +510,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -517,7 +522,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -585,7 +590,7 @@ msgstr "" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:15 msgid "Service" -msgstr "" +msgstr "Tjänst" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:266 msgid "Set TCP/UDP MTU" @@ -737,16 +742,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -756,7 +761,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/templates/openvpn.pot b/package/luci/applications/luci-app-openvpn/po/templates/openvpn.pot index 4c25b09783..7879c32bc5 100644 --- a/package/luci/applications/luci-app-openvpn/po/templates/openvpn.pot +++ b/package/luci/applications/luci-app-openvpn/po/templates/openvpn.pot @@ -88,7 +88,7 @@ msgstr "" msgid "Change to directory before initialization" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "" @@ -173,7 +173,7 @@ msgstr "" msgid "Don't add routes automatically" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "" @@ -251,6 +251,11 @@ msgstr "" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "" @@ -369,7 +374,7 @@ msgstr "" msgid "OVPN configuration file upload" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "" @@ -492,11 +497,11 @@ msgstr "" msgid "Replay protection sliding window size" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "" @@ -504,7 +509,7 @@ msgstr "" msgid "Restart after remote ping timeout" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "" @@ -724,16 +729,16 @@ msgid "" "configuration." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "" @@ -743,7 +748,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "" diff --git a/package/luci/applications/luci-app-openvpn/po/tr/openvpn.po b/package/luci/applications/luci-app-openvpn/po/tr/openvpn.po index 53619e04fd..0ad2c374ee 100644 --- a/package/luci/applications/luci-app-openvpn/po/tr/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/tr/openvpn.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-10-28 15:05+0000\n" -"Last-Translator: Oğuz Ersen \n" -"Language-Team: Turkish \n" +"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -101,7 +101,7 @@ msgstr "İşlem önceliğini değiştir" msgid "Change to directory before initialization" msgstr "Başlatma öncesinde dizine geç" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Eş sertifikayı bir CRL'ye göre kontrol edin" @@ -186,7 +186,7 @@ msgstr "Ä°fconfig'i gerçekte çalıştırmayın" msgid "Don't add routes automatically" msgstr "Rotaları otomatik olarak ekleme" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "--askpass veya --auth-user-pass parolalarını önbelleğe almayın" @@ -258,12 +258,18 @@ msgstr "IP port yönetim arayüzünü etkinleştirin" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:104 msgid "Enabled" -msgstr "Etkin" +msgstr "Etkinleştirilmiş" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:752 msgid "Encrypt and authenticate all control channel packets with the key" msgstr "Anahtarla tüm kontrol kanalı paketlerini şifreleyin ve doğrulayın" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "" +"Anahtar, sürüm 2 ile tüm denetim kanalı paketlerini şifreleyin ve doğrulayın." + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "Paketler için şifreleme şifresi" @@ -388,7 +394,7 @@ msgstr "Günlük dosyası geçmişi için satır sayısı" msgid "OVPN configuration file upload" msgstr "OVPN yapılandırma dosyası yükleme" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Yalnızca verilen X509 adından gelen bağlantıları kabul edin" @@ -513,11 +519,11 @@ msgstr "Saniyeden sonra veri kanalı anahtarını yeniden görüşün" msgid "Replay protection sliding window size" msgstr "Tekrar koruma sürgülü pencere boyutu" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "Sertifikada açık atama gerektir" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Sertifikada açık anahtar kullanımını zorunlu kılın" @@ -525,7 +531,7 @@ msgstr "Sertifikada açık anahtar kullanımını zorunlu kılın" msgid "Restart after remote ping timeout" msgstr "Uzak ping zaman aşımından sonra yeniden başlat" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "Müzakere edilmesine izin verilen şifreleri kısıtlayın" @@ -755,16 +761,16 @@ msgstr "" "OVPN yapılandırma dosyası (%s) bulunamadı, lütfen yapılandırmanızı kontrol " "edin." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "Desteklenen en yüksek TLS sürümü" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "'tls-auth' ve 'secret' seçeneklerinin temel yönü" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "Desteklenen en düşük TLS sürümü" @@ -776,7 +782,7 @@ msgstr "" "OVPN yapılandırma dosyasının (%s) boyutu, LuCI'de çevrimiçi düzenleme için " "çok büyük (≥ 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "Bu, şifre pazarlığını tamamen devre dışı bırakır" diff --git a/package/luci/applications/luci-app-openvpn/po/uk/openvpn.po b/package/luci/applications/luci-app-openvpn/po/uk/openvpn.po index 32945926b2..e9e9201e75 100644 --- a/package/luci/applications/luci-app-openvpn/po/uk/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/uk/openvpn.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-04-20 14:12+0000\n" -"Last-Translator: Vladdrako \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -81,10 +81,11 @@ msgstr "Автоматично перенаправити по маршруту #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:11 msgid "Below is a list of configured OpenVPN instances and their current state" msgstr "" +"Нижче наведено список налаштованих екземплярів OpenVPN та їх поточний стан" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:120 msgid "Call down cmd/script before TUN/TAP close" -msgstr "" +msgstr "Викликати команду/скрипт перед закриттям TUN/TAP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:658 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:77 @@ -100,7 +101,7 @@ msgstr "Змінити пріоритет процесу" msgid "Change to directory before initialization" msgstr "Перейти до каталогу перед ініціалізацією" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Перевірити peer-сертифікат у CRL" @@ -185,7 +186,7 @@ msgstr "Насправді не виконувати ifconfig" msgid "Don't add routes automatically" msgstr "Не додавати маршрути автоматично" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "Не кешувати --askpass або --auth-user-pass паролі" @@ -261,47 +262,58 @@ msgstr "Увімкнено" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:752 msgid "Encrypt and authenticate all control channel packets with the key" +msgstr "Шифрувати та аутентифікувати ключем всі пакети каналу управління" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." msgstr "" +"Шифрувати та аутентифікувати всі пакети каналу управління за допомогою " +"ключа, версія 2." #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" -msgstr "" +msgstr "Шифр шифрування пакетів" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:128 msgid "Execute shell cmd after routes are added" -msgstr "" +msgstr "Виконати shell команду після додавання маршрутів" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:132 msgid "Execute shell command on remote IP change" -msgstr "" +msgstr "Виконати shell команду при віддаленій зміні IP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:157 msgid "" "Executed in server mode on new client connections, when the client is still " "untrusted" msgstr "" +"Виконується в режимі сервера при нових клієнтських підключеннях, коли клієнт " +"ще не є довіреним" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:153 msgid "" "Executed in server mode whenever an IPv4 address/route or MAC address is " "added to OpenVPN's internal routing table" msgstr "" +"Виконується в режимі сервера при додаванні IPv4 адреси/маршруту або MAC-" +"адреси до внутрішньої таблиці маршрутизації OpenVPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:744 msgid "Exit on TLS negotiation failure" -msgstr "" +msgstr "Вихід у разі помилки узгодження TLS" #: applications/luci-app-openvpn/root/usr/share/rpcd/acl.d/luci-app-openvpn.json:3 msgid "Grant access to OpenVPN configuration" -msgstr "" +msgstr "Надати доступ до конфігурування OpenVPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:573 msgid "HMAC authentication for packets" -msgstr "" +msgstr "HMAC-аутентифікація для пакетів" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:491 msgid "Handling of authentication failures" -msgstr "" +msgstr "Обробка помилок автентифікації" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:308 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:49 @@ -309,85 +321,87 @@ msgid "" "Helper directive to simplify the expression of --ping and --ping-restart in " "server mode configurations" msgstr "" +"Допоміжна директива для спрощення виразу --ping і --ping-restart у " +"конфігураціях режиму сервера" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:551 msgid "If hostname resolve fails, retry" -msgstr "" +msgstr "Якщо розпізнати ім’я хоста не вдається, повторіть спробу" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:12 msgid "Instance \"%s\"" -msgstr "" +msgstr "Екземпляр \"%s\"" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:18 #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:46 msgid "Instance with that name already exists!" -msgstr "" +msgstr "Екземпляр з такою назвою вже існує!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:336 msgid "Keep local IP address on restart" -msgstr "" +msgstr "Збереження локальної IP-адреси при перезавантаженні" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:340 msgid "Keep remote IP address on restart" -msgstr "" +msgstr "Збереження віддаленої IP-адреси при перезавантаженні" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:328 msgid "Keep tun/tap device open on restart" -msgstr "" +msgstr "Тримати пристрій tun/tap відкритим при перезавантаженні" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:736 msgid "Key transition window" -msgstr "" +msgstr "Вікно передачі ключа" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:104 msgid "Limit repeated log messages" -msgstr "" +msgstr "Обмежити повторювані повідомлення журналу" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:666 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:85 msgid "Local certificate" -msgstr "" +msgstr "Локальний сертифікат" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:177 msgid "Local host name or IP address" -msgstr "" +msgstr "Локальне ім'я хоста або IP-адреса" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:670 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:89 msgid "Local private key" -msgstr "" +msgstr "Локальний приватний ключ" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:173 msgid "Major mode" -msgstr "" +msgstr "Основний режим" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:452 msgid "Maximum number of queued TCP output packets" -msgstr "" +msgstr "Максимальна кількість вихідних пакетів TCP у черзі" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:168 msgid "Networking" -msgstr "" +msgstr "Мережа" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:447 msgid "Number of allocated broadcast buffers" -msgstr "" +msgstr "Кількість виділених широкомовних буферів" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:360 msgid "Number of lines for log file history" -msgstr "" +msgstr "Кількість рядків для історії журналу" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:95 msgid "OVPN configuration file upload" -msgstr "" +msgstr "Завантаження файлу конфігурації OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" -msgstr "" +msgstr "Приймати з’єднання лише від вказаного X509 імені" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:324 msgid "Only process ping timeouts if routes exist" -msgstr "" +msgstr "Обробляти тайм-аути ping лише за наявності маршрутів" #: applications/luci-app-openvpn/luasrc/controller/openvpn.lua:8 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:10 @@ -396,11 +410,11 @@ msgstr "OpenVPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:11 msgid "OpenVPN instances" -msgstr "" +msgstr "Екземпляри OpenVPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:84 msgid "Optimize TUN/TAP/UDP writes" -msgstr "" +msgstr "Оптимізація записів TUN/TAP/UDP" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:11 msgid "Overview" @@ -409,39 +423,39 @@ msgstr "Огляд" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:674 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:73 msgid "PKCS#12 file containing keys" -msgstr "" +msgstr "Файл PKCS#12, що містить ключі" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:137 msgid "Pass environment variables to script" -msgstr "" +msgstr "Передача змінних середовища до скрипту" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:644 msgid "Persist replay-protection state" -msgstr "" +msgstr "Зберігати стан захисту від повторного відтворення" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:402 msgid "Persist/unpersist ifconfig-pool" -msgstr "" +msgstr "Зберігати/не зберігати ifconfig-pool" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:312 msgid "Ping remote every n seconds over TCP/UDP port" -msgstr "" +msgstr "Ping кожні n секунд через TCP/UDP порт" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:32 msgid "Please edit this file directly in a terminal session." -msgstr "" +msgstr "Будь ласка, редагуйте цей файл безпосередньо в терміналі." #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:51 msgid "Please select a valid OVPN config file to upload!" -msgstr "" +msgstr "Будь ласка, оберіть дійсний файл конфігурації OVPN для завантаження!" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:23 msgid "Please select a valid VPN template!" -msgstr "" +msgstr "Будь ласка, оберіть дійсний шаблон VPN!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:161 msgid "Policy level over usage of external programs and scripts" -msgstr "" +msgstr "Рівень політики щодо використання зовнішніх програм та скриптів" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:141 msgid "Port" @@ -453,100 +467,101 @@ msgstr "Протокол" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:530 msgid "Proxy timeout in seconds" -msgstr "" +msgstr "Тайм-аут проксі в секундах" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:407 msgid "Push an ifconfig option to remote" -msgstr "" +msgstr "Надішліть опцію ifconfig на віддалений вузол" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:382 msgid "Push options to peer" -msgstr "" +msgstr "Надіслати параметри до вузла" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:350 msgid "Query management channel for private key" -msgstr "" +msgstr "Канал керування запитами для приватного ключа" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:505 msgid "Randomly choose remote server" -msgstr "" +msgstr "Випадковий вибір віддаленого сервера" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:432 msgid "Refuse connection if no custom client config" -msgstr "" +msgstr "Відмовити в підключенні, якщо немає спеціальної конфігурації клієнта" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:92 msgid "Remap SIGUSR1 signals" -msgstr "" +msgstr "Перепризначити сигнали SIGUSR1" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:501 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:61 msgid "Remote host name or IP address" -msgstr "" +msgstr "Ім'я або IP-адреса віддаленого хоста" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:316 msgid "Remote ping timeout" -msgstr "" +msgstr "Час очікування ping віддаленого вузла" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:720 msgid "Renegotiate data chan. key after bytes" -msgstr "" +msgstr "Повторно узгодити ключ каналу даних після отримання/відправлення даних" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:724 msgid "Renegotiate data chan. key after packets" msgstr "" +"Повторно узгодити ключ каналу даних після отримання/відправлення пакетів" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:728 msgid "Renegotiate data chan. key after seconds" -msgstr "" +msgstr "Повторно узгодити ключ каналу даних через n секунд" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:636 msgid "Replay protection sliding window size" -msgstr "" +msgstr "Захист від повторного відтворення - розмір плаваючого вікна" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" -msgstr "" +msgstr "Вимагати чіткого зазначення на сертифікаті" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" -msgstr "" +msgstr "Вимагати явного використання ключа в сертифікаті" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:320 msgid "Restart after remote ping timeout" -msgstr "" +msgstr "Перезапустити після тайм-ауту ping віддаленого вузла" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" -msgstr "" +msgstr "Обмежте дозволені шифри для узгодження" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:716 msgid "Retransmit timeout on TLS control channel" -msgstr "" +msgstr "Таймаут повторної передачі по каналу управління TLS" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:525 msgid "Retry indefinitely on HTTP proxy errors" -msgstr "" +msgstr "Повторювати нескінченно при помилках HTTP проксі" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:546 msgid "Retry indefinitely on Socks proxy errors" -msgstr "" +msgstr "Повторювати нескінченно при помилках Socks проксі" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:412 msgid "Route subnet to client" -msgstr "" +msgstr "Направити підмережу до клієнта" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:145 msgid "Run script cmd on client connection" -msgstr "" +msgstr "Запуск скрипта при підключенні клієнта" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:149 msgid "Run script cmd on client disconnection" -msgstr "" +msgstr "Запуск скрипта при відключенні клієнта" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:124 msgid "Run up/down scripts for all restarts" -msgstr "" +msgstr "Запуск up/down скриптів для всіх перезапусків" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:41 msgid "Save" @@ -556,10 +571,12 @@ msgstr "Зберегти" msgid "" "Section to add an optional 'auth-user-pass' file with your credentials (%s)" msgstr "" +"Розділ для додавання необов'язкового файлу 'auth-user-pass' з вашими " +"обліковими даними (%s)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:44 msgid "Section to modify the OVPN config file (%s)" -msgstr "" +msgstr "Розділ для зміни конфігураційного файлу OVPN (%s)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:257 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:45 @@ -567,20 +584,24 @@ msgid "" "Security recommendation: It is recommended to not enable compression and set " "this parameter to `no`" msgstr "" +"Рекомендація з безпеки: Рекомендується не включати стиснення і встановити " +"цей параметр в значення `no`" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:165 msgid "" "Security recommendation: It is recommended to not enable compression and set " "this parameter to `stub-v2`" msgstr "" +"Рекомендація з безпеки: Рекомендується не включати стиснення і встановити " +"цей параметр в значення `stub-v2`" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:85 msgid "Select template ..." -msgstr "" +msgstr "Виберіть шаблон ..." #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:496 msgid "Send notification to peer on disconnect" -msgstr "" +msgstr "Надсилати сповіщення вузлу при відключенні" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:15 msgid "Service" @@ -588,185 +609,189 @@ msgstr "Служба" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:266 msgid "Set TCP/UDP MTU" -msgstr "" +msgstr "Встановити TCP/UDP MTU" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:397 msgid "Set aside a pool of subnets" -msgstr "" +msgstr "Виділіть пул підмереж" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:535 msgid "Set extended HTTP proxy options" -msgstr "" +msgstr "Встановіть розширені параметри HTTP проксі" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:20 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:13 msgid "Set output verbosity" -msgstr "" +msgstr "Встановіть деталізацію виводу" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:442 msgid "Set size of real and virtual address hash tables" -msgstr "" +msgstr "Задайте розмір хеш-таблиць реальних і віртуальних адрес" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:292 msgid "Set the TCP/UDP receive buffer size" -msgstr "" +msgstr "Встановіть розмір буфера отримання TCP/UDP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:288 msgid "Set the TCP/UDP send buffer size" -msgstr "" +msgstr "Встановіть розмір буфера надсилання TCP/UDP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:296 msgid "Set tun/tap TX queue length" -msgstr "" +msgstr "Встановіть довжину черги передачі tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:213 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:29 msgid "Set tun/tap adapter parameters" -msgstr "" +msgstr "Встановіть параметри адаптера tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:270 msgid "Set tun/tap device MTU" -msgstr "" +msgstr "Встановіть MTU tun/tap пристрою" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:274 msgid "Set tun/tap device overhead" -msgstr "" +msgstr "Встановіть накладні витрати tun/tap пристрою" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:283 msgid "Set upper bound on TCP MSS" -msgstr "" +msgstr "Встановіть верхню межу для TCP MSS" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:300 msgid "Shaping for peer bandwidth" -msgstr "" +msgstr "Формування пропускної здатності вузла" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:108 msgid "Shell cmd to execute after tun device open" msgstr "" +"Команда командного рядка, яку потрібно виконати після відкриття пристрою tun" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:116 msgid "Shell cmd to run after tun device close" msgstr "" +"Команда командного рядка, яку потрібно виконати після закриття пристрою tun" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:141 msgid "Shell command to verify X509 name" -msgstr "" +msgstr "Команда оболонки для перевірки імені X509" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:640 msgid "Silence the output of replay warnings" -msgstr "" +msgstr "Заглушити виведення попереджень про повторення" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:627 msgid "Size of cipher key" -msgstr "" +msgstr "Розмір ключа шифру" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:229 msgid "Specify a default gateway for routes" -msgstr "" +msgstr "Вказати шлюз за замовчуванням для маршрутів" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:561 msgid "Specify whether the client is required to supply a valid certificate" -msgstr "" +msgstr "Вкажіть, чи зобов'язаний клієнт надати дійсний сертифікат" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:355 msgid "Start OpenVPN in a hibernating state" -msgstr "" +msgstr "Запускати OpenVPN в сплячому режимі" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:117 msgid "Start/Stop" -msgstr "" +msgstr "Старт/Стоп" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:106 msgid "Started" -msgstr "" +msgstr "Запущено" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:100 msgid "Status file format version" -msgstr "" +msgstr "Версія формату файла стану" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:15 msgid "Switch to advanced configuration" -msgstr "" +msgstr "Перейти до розширеної конфігурації" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:18 msgid "Switch to basic configuration" -msgstr "" +msgstr "Перейти до базової конфігурації" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:181 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:21 msgid "TCP/UDP port # for both local and remote" -msgstr "" +msgstr "Номер локального та віддаленого порту TCP/UDP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:185 msgid "TCP/UDP port # for local (default=1194)" -msgstr "" +msgstr "Номер локального порту TCP/UDP (1194 за замовчуванням)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:189 msgid "TCP/UDP port # for remote (default=1194)" -msgstr "" +msgstr "Номер віддаленого порту TCP/UDP (1194 за замовчуванням)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:712 msgid "TLS 1.3 or newer cipher" -msgstr "" +msgstr "Шифр TLS 1.3 або новіший" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:704 msgid "TLS cipher" -msgstr "" +msgstr "Шифр TLS" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:56 msgid "TOS passthrough (applies to IPv4 only)" -msgstr "" +msgstr "Пропуск TOS (застосовується тільки для IPv4)" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:78 msgid "Template based configuration" -msgstr "" +msgstr "Конфігурація на основі шаблону" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:437 msgid "Temporary directory for client-connect return file" -msgstr "" +msgstr "Тимчасовий каталог для файлу повернення 'client-connect'" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:12 #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:40 msgid "The 'Name' field must not be empty!" -msgstr "" +msgstr "Поле \"Ім'я\" не повинно бути порожнім!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:22 msgid "" "The OVPN config file (%s) could not be found, please check your " "configuration." -msgstr "" +msgstr "Файл конфігурації OVPN (%s) не знайдено, перевірте ваші налаштування." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" -msgstr "" +msgstr "Найвища підтримувана версія TLS" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" -msgstr "" +msgstr "Задати ключ для параметрів 'tls-auth' і 'secret'" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" -msgstr "" +msgstr "Найнижча підтримувана версія TLS" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:31 msgid "" "The size of the OVPN config file (%s) is too large for online editing in " "LuCI (≥ 100 KB)." msgstr "" +"Розмір файлу конфігурації OVPN (%s) занадто великий для онлайн-редагування в " +"LuCI (≥ 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" -msgstr "" +msgstr "Це повністю вимикає узгодження шифру" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:732 msgid "Timeframe for key exchange" -msgstr "" +msgstr "Часові рамки обміну ключами" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:205 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:25 msgid "Type of used device" -msgstr "" +msgstr "Тип використовуваного пристрою" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 msgid "Upload" @@ -774,7 +799,7 @@ msgstr "Завантажити" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 msgid "Upload ovpn file" -msgstr "" +msgstr "Завантажити файл ovpn" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:510 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:97 @@ -784,11 +809,11 @@ msgstr "Використовувати протокол" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:209 msgid "Use tun/tap device node" -msgstr "" +msgstr "Використовуйте вузол пристрою tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:472 msgid "Use username as common name" -msgstr "" +msgstr "Використовувати ім'я користувача як загальне ім'я" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:368 msgid "VPN" @@ -796,11 +821,11 @@ msgstr "VPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:64 msgid "Write log to file" -msgstr "" +msgstr "Запис журналу у файл" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:96 msgid "Write status to file every n seconds" -msgstr "" +msgstr "Запис стану у файл кожні n секунд" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:112 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:114 @@ -809,11 +834,11 @@ msgstr "Ні" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:201 msgid "tun/tap device" -msgstr "" +msgstr "пристрій tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:304 msgid "tun/tap inactivity timeout" -msgstr "" +msgstr "тайм-аут бездіяльності tun/tap" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:111 msgid "yes (%i)" diff --git a/package/luci/applications/luci-app-openvpn/po/vi/openvpn.po b/package/luci/applications/luci-app-openvpn/po/vi/openvpn.po index c887f9902d..687c36f25a 100644 --- a/package/luci/applications/luci-app-openvpn/po/vi/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/vi/openvpn.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-08-16 06:58+0200\n" -"PO-Revision-Date: 2020-11-21 12:21+0000\n" -"Last-Translator: Darias \n" -"Language-Team: Vietnamese \n" +"Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.18.1\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -24,7 +24,7 @@ msgstr "Chấp nhận tùy chọn được đảy từ server" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:92 msgid "Add" -msgstr "" +msgstr "Thêm vào" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:225 msgid "Add route after establishing connection" @@ -32,7 +32,7 @@ msgstr "Thêm tuyến sau khi kết nối thành lập" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:92 msgid "Add template based configuration" -msgstr "" +msgstr "Thêm cấu hình dá»±a trên mẫu" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:748 msgid "Additional authentication over TLS" @@ -103,7 +103,7 @@ msgstr "Thay đổi quy trình Æ°u tiên" msgid "Change to directory before initialization" msgstr "Chuyển qua thÆ° mục trước khi khởi tạo" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "Kiểm tra chứng chỉ đối tác với một CRL" @@ -117,17 +117,17 @@ msgstr "Đối tượng bị vô hiệu hóa" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:20 msgid "Configuration category" -msgstr "" +msgstr "Danh mục cấu hình" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:477 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:53 msgid "Configure client mode" -msgstr "Định cấu hình chế độ đối tượng " +msgstr "Định cấu hình chế độ client" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:377 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:37 msgid "Configure server bridge" -msgstr "Định cấu hình cầu nối server" +msgstr "Định cấu hình bridge server" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:372 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:33 @@ -140,7 +140,7 @@ msgstr "Kết nối qua Socks5 proxy" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:520 msgid "Connect to remote host through an HTTP proxy" -msgstr "" +msgstr "Kết nối với máy chủ từ xa thông qua proxy HTTP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:515 msgid "Connection retry interval" @@ -148,11 +148,11 @@ msgstr "Khoảng thá»­ kết nối" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:564 msgid "Cryptography" -msgstr "" +msgstr "Cryptography" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:233 msgid "Delay n seconds after connection" -msgstr "" +msgstr "Trì hoãn n giây sau khi kết nối" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:112 msgid "Delay tun/tap open and up script execution" @@ -161,7 +161,7 @@ msgstr "Trì hoãn tun/tap mở và up script execution" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:662 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:81 msgid "Diffie-Hellman parameters" -msgstr "Tham số Diffie-Hellman " +msgstr "Tham số Diffie-Hellman" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:427 msgid "Directory for custom client config files" @@ -188,13 +188,13 @@ msgstr "Đừng thá»±c sá»± thá»±c hiện ifconfig" msgid "Don't add routes automatically" msgstr "Đừng tá»± động thêm vào đường dẫn" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" -msgstr "Don't cache --askpass or --auth-user-pass passwords" +msgstr "Không cache mật khẩu --askpass hoặc --auth-user-pass" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:245 msgid "Don't drop incoming tun packets with same destination as host" -msgstr "" +msgstr "Không thả các gói điều chỉnh đến có cùng đích với máy chủ" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:387 msgid "Don't inherit global push options" @@ -206,11 +206,11 @@ msgstr "Đừng log timestamps" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:241 msgid "Don't pull routes automatically" -msgstr "" +msgstr "Không tá»± động kéo các tuyến đường" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:332 msgid "Don't re-read key on restart" -msgstr "Đừng đọc lại key ở chế độ khởi động " +msgstr "Đừng đọc lại key ở chế độ khởi động" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:261 msgid "Don't use adaptive lzo compression" @@ -260,11 +260,17 @@ msgstr "Kích hoạt giao diện điều hành trên IP cổng #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:104 msgid "Enabled" -msgstr "Bật" +msgstr "Kích Hoạt" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:752 msgid "Encrypt and authenticate all control channel packets with the key" +msgstr "Mã hóa và xác thá»±c tất cả các gói kênh điều khiển bằng khóa" + +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." msgstr "" +"Mã hóa và xác thá»±c tất cả các gói kênh điều khiển bằng khóa, phiên bản 2." #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" @@ -283,12 +289,16 @@ msgid "" "Executed in server mode on new client connections, when the client is still " "untrusted" msgstr "" +"Được thá»±c thi ở chế độ máy chủ trên các kết nối máy khách mới, khi máy khách " +"vẫn chÆ°a được tin cậy" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:153 msgid "" "Executed in server mode whenever an IPv4 address/route or MAC address is " "added to OpenVPN's internal routing table" msgstr "" +"Được thá»±c thi ở chế độ máy chủ bất cứ khi nào một địa chỉ/tuyến đường IPv4 " +"hoặc địa chỉ MAC được thêm vào bảng định tuyến nội bộ của OpenVPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:744 msgid "Exit on TLS negotiation failure" @@ -296,7 +306,7 @@ msgstr "Exit trên TLS khi thÆ°Æ¡ng lượng thất bại" #: applications/luci-app-openvpn/root/usr/share/rpcd/acl.d/luci-app-openvpn.json:3 msgid "Grant access to OpenVPN configuration" -msgstr "" +msgstr "Cấp quyền truy cập vào cấu hình OpenVPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:573 msgid "HMAC authentication for packets" @@ -304,7 +314,7 @@ msgstr "Sá»± xác thá»±c HMAC cho gói" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:491 msgid "Handling of authentication failures" -msgstr "Xá»­ lý những sai soát khi xác thá»±c " +msgstr "Xá»­ lý những sai sót khi xác thá»±c" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:308 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:49 @@ -312,6 +322,8 @@ msgid "" "Helper directive to simplify the expression of --ping and --ping-restart in " "server mode configurations" msgstr "" +"Chỉ thị của trình trợ giúp để đơn giản hóa biểu thức của --ping và --ping-" +"restart trong cấu hình chế độ máy chủ" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:551 msgid "If hostname resolve fails, retry" @@ -324,7 +336,7 @@ msgstr "Instance \"%s\"" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:18 #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:46 msgid "Instance with that name already exists!" -msgstr "" +msgstr "Phiên bản với tên đó đã tồn tại!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:336 msgid "Keep local IP address on restart" @@ -336,7 +348,7 @@ msgstr "Giữ remote địa chỉ IP ở chế độ khởi động" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:328 msgid "Keep tun/tap device open on restart" -msgstr "Giữ công cụ tun/tap mở khi khởi động lại " +msgstr "Giữ công cụ tun/tap mở khi khởi động lại" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:736 msgid "Key transition window" @@ -370,7 +382,7 @@ msgstr "Số lượng tối đa của queued TCP output packets" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:168 msgid "Networking" -msgstr "" +msgstr "Networking" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:447 msgid "Number of allocated broadcast buffers" @@ -382,9 +394,9 @@ msgstr "Số dòng cho tập tin log history" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:95 msgid "OVPN configuration file upload" -msgstr "" +msgstr "Tải lên tệp cấu hình OVPN" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "Chỉ chấp nhận kết nối từ những tên X509 cho sẵn" @@ -407,7 +419,7 @@ msgstr "Tối Æ°u hóa TUN/TAP/UDP writes" #: applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm:11 msgid "Overview" -msgstr "" +msgstr "Tổng quan" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:674 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:73 @@ -432,19 +444,20 @@ msgstr "Ping remote mỗi n giây trên cổng TCP/UDP" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:32 msgid "Please edit this file directly in a terminal session." -msgstr "" +msgstr "Vui lòng chỉnh sá»­a tệp này trá»±c tiếp trong phiên cuối." #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:51 msgid "Please select a valid OVPN config file to upload!" -msgstr "" +msgstr "Vui lòng chọn tệp cấu hình OVPN hợp lệ để tải lên!" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:23 msgid "Please select a valid VPN template!" -msgstr "" +msgstr "Vui lòng chọn một mẫu VPN hợp lệ!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:161 msgid "Policy level over usage of external programs and scripts" msgstr "" +"Cấp độ chính sách đối với việc sá»­ dụng các chÆ°Æ¡ng trình và tập lệnh bên ngoài" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:141 msgid "Port" @@ -468,7 +481,7 @@ msgstr "Đẩy lá»±a chọn cho đối tác" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:350 msgid "Query management channel for private key" -msgstr "Tra vấn kênh điều hành cho phím bảo mật " +msgstr "Tra vấn kênh điều hành cho phím bảo mật" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:505 msgid "Randomly choose remote server" @@ -507,11 +520,11 @@ msgstr "ThÆ°Æ¡ng lượng lại data chan. key sau seconds" msgid "Replay protection sliding window size" msgstr "Replay chế độ bảo vệ kích thước window trượt" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" -msgstr "Yêu cầu rõ ràng về giấy chứng nhận " +msgstr "Yêu cầu rõ ràng về giấy chứng nhận" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "Yêu cầu key dùng rõ rãng trên chứng nhận" @@ -519,9 +532,9 @@ msgstr "Yêu cầu key dùng rõ rãng trên chứng nhận" msgid "Restart after remote ping timeout" msgstr "Khởi động lại sau khi remote ping timeout" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" -msgstr "" +msgstr "Hạn chế các mật mã được phép đàm phán" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:716 msgid "Retransmit timeout on TLS control channel" @@ -553,16 +566,18 @@ msgstr "Chạy up/down scripts cho tất cả khởi động" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:41 msgid "Save" -msgstr "" +msgstr "LÆ°u" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:65 msgid "" "Section to add an optional 'auth-user-pass' file with your credentials (%s)" msgstr "" +"Phần để thêm tệp 'auth-user-pass' tùy chọn với thông tin xác thá»±c của bạn " +"(%s)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:44 msgid "Section to modify the OVPN config file (%s)" -msgstr "" +msgstr "Phần sá»­a đổi tệp cấu hình OVPN (%s)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:257 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:45 @@ -570,16 +585,20 @@ msgid "" "Security recommendation: It is recommended to not enable compression and set " "this parameter to `no`" msgstr "" +"Khuyến nghị bảo mật: Bạn không nên bật tính năng nén và đặt tham số này " +"thành `no`" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:165 msgid "" "Security recommendation: It is recommended to not enable compression and set " "this parameter to `stub-v2`" msgstr "" +"Khuyến nghị bảo mật: Bạn không nên kích hoạt tính năng nén và đặt tham số " +"này thành `stub-v2`" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:85 msgid "Select template ..." -msgstr "" +msgstr "Chọn mẫu ..." #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:496 msgid "Send notification to peer on disconnect" @@ -587,7 +606,7 @@ msgstr "Gá»­i thông báo cho bạn bè về ngắt kết nối" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:15 msgid "Service" -msgstr "" +msgstr "Dịch vụ" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:266 msgid "Set TCP/UDP MTU" @@ -625,7 +644,7 @@ msgstr "Đặt tun/tap độ dài queue" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:213 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:29 msgid "Set tun/tap adapter parameters" -msgstr "" +msgstr "Set tun/tap adapter parameters" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:270 msgid "Set tun/tap device MTU" @@ -653,7 +672,7 @@ msgstr "Shell cmd để chạy sau khi thiết bị tun đóng" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:141 msgid "Shell command to verify X509 name" -msgstr "Shell command để hợp thức hóa tên X509 " +msgstr "Shell command để hợp thức hóa tên X509" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:640 msgid "Silence the output of replay warnings" @@ -670,6 +689,7 @@ msgstr "Chỉ định một cổng mặc định cho tuyến" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:561 msgid "Specify whether the client is required to supply a valid certificate" msgstr "" +"Chỉ định xem khách hàng có được yêu cầu cung cấp chứng chỉ hợp lệ hay không" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:355 msgid "Start OpenVPN in a hibernating state" @@ -677,7 +697,7 @@ msgstr "Bắt đầu OpenVPN trong một hibernating state" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:117 msgid "Start/Stop" -msgstr "" +msgstr "Bắt đầu/ Dừng lại" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:106 msgid "Started" @@ -710,7 +730,7 @@ msgstr "Cổng TCP/UDP # cho ngoài vùng (default=1194)" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:712 msgid "TLS 1.3 or newer cipher" -msgstr "" +msgstr "TLS 1.3 hoặc mật mã mới hÆ¡n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:704 msgid "TLS cipher" @@ -722,7 +742,7 @@ msgstr "TOS passthrough (chỉ áp dụng cho IPv4)" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:78 msgid "Template based configuration" -msgstr "" +msgstr "Cấu hình dá»±a trên mẫu" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:437 msgid "Temporary directory for client-connect return file" @@ -731,36 +751,40 @@ msgstr "Danh mục tạm thời cho tập tin client-connect return" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:12 #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:40 msgid "The 'Name' field must not be empty!" -msgstr "" +msgstr "Không được để trống trường 'Tên'!" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:22 msgid "" "The OVPN config file (%s) could not be found, please check your " "configuration." msgstr "" +"Không thể tìm thấy tệp cấu hình OVPN (%s), vui lòng kiểm tra cấu hình của " +"bạn." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" -msgstr "" +msgstr "Phiên bản TLS được hỗ trợ cao nhất" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" -msgstr "" +msgstr "Hướng chính cho các tùy chọn 'tls-auth' và 'bí mật'" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" -msgstr "" +msgstr "Phiên bản TLS được hỗ trợ thấp nhất" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:31 msgid "" "The size of the OVPN config file (%s) is too large for online editing in " "LuCI (≥ 100 KB)." msgstr "" +"Kích thước của tệp cấu hình OVPN (%s) quá lớn để chỉnh sá»­a trá»±c tuyến trong " +"LuCI (≥ 100 KB)." -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" -msgstr "" +msgstr "Điều này hoàn toàn vô hiệu hóa thÆ°Æ¡ng lượng mật mã" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:732 msgid "Timeframe for key exchange" @@ -773,11 +797,11 @@ msgstr "Loại công cụ sá»­ dụng" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 msgid "Upload" -msgstr "" +msgstr "Tải lên" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:104 msgid "Upload ovpn file" -msgstr "" +msgstr "Tải lên tệp ovpn" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:510 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:97 @@ -795,7 +819,7 @@ msgstr "Dùng tên đăng nhập nhÆ° tên thông thường" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:368 msgid "VPN" -msgstr "" +msgstr "VPN" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:64 msgid "Write log to file" @@ -808,7 +832,7 @@ msgstr "Viết tình trạng tới tập tin mỗi n giây" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:112 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:114 msgid "no" -msgstr "không" +msgstr "Không" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:201 msgid "tun/tap device" diff --git a/package/luci/applications/luci-app-openvpn/po/zh_Hans/openvpn.po b/package/luci/applications/luci-app-openvpn/po/zh_Hans/openvpn.po index 59acdbf13d..2d334c674e 100644 --- a/package/luci/applications/luci-app-openvpn/po/zh_Hans/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/zh_Hans/openvpn.po @@ -6,16 +6,16 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-19 19:35+0200\n" -"PO-Revision-Date: 2022-10-28 15:05+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2023-05-08 14:25+0000\n" +"Last-Translator: Keen \n" "Language-Team: Chinese (Simplified) \n" +"librecmc/luciapplicationsopenvpn/zh_Hans/>\n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -27,7 +27,7 @@ msgstr "接受从服务器推送的选项" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:92 msgid "Add" -msgstr "新增" +msgstr "添加" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:225 msgid "Add route after establishing connection" @@ -104,7 +104,7 @@ msgstr "改变进程优先级" msgid "Change to directory before initialization" msgstr "初始化前改变根目录" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "验证客户端证书以确保其是否过期" @@ -189,7 +189,7 @@ msgstr "不实际执行 ifconfig 命令" msgid "Don't add routes automatically" msgstr "不自动添加路由" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "不缓存 --askpass 或 --auth-user-pass passwords" @@ -261,12 +261,17 @@ msgstr "在 IP port 上启用可管理接口" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua:104 msgid "Enabled" -msgstr "已启用" +msgstr "启用" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:752 msgid "Encrypt and authenticate all control channel packets with the key" msgstr "使用密钥加密及认证所有的控制通道数据包" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "使用密钥版本 2 加密和验证所有控制通道数据包。" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "加密数据包" @@ -386,7 +391,7 @@ msgstr "历史日志文件的行数" msgid "OVPN configuration file upload" msgstr "OVPN 配置文件上传" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "只接收已给定的 X509 名称的连接" @@ -509,11 +514,11 @@ msgstr "传输若干秒后重新验证数据通道密钥" msgid "Replay protection sliding window size" msgstr "重播保护的滑动窗口大小" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "证书需要显式指定" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "证书需要明确的密钥" @@ -521,7 +526,7 @@ msgstr "证书需要明确的密钥" msgid "Restart after remote ping timeout" msgstr "远程 ping 超时后重启" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "限定协商时允许的密码算法" @@ -741,16 +746,16 @@ msgid "" "configuration." msgstr "无法找到 OVPN 配置文件(%s),请检查您的配置。" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "最高支持的 TLS 版本" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "“tls-auth”和“secret”选项的密钥类型" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "最低支持的 TLS 版本" @@ -760,7 +765,7 @@ msgid "" "LuCI (≥ 100 KB)." msgstr "OVPN 配置文件(%s)过大,无法使用 LuCI 在线编辑(≥ 100 KB)。" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "这将完全禁用密码协商" diff --git a/package/luci/applications/luci-app-openvpn/po/zh_Hant/openvpn.po b/package/luci/applications/luci-app-openvpn/po/zh_Hant/openvpn.po index 3b172ae92a..1279c0de1d 100644 --- a/package/luci/applications/luci-app-openvpn/po/zh_Hant/openvpn.po +++ b/package/luci/applications/luci-app-openvpn/po/zh_Hant/openvpn.po @@ -6,16 +6,16 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-19 19:35+0200\n" -"PO-Revision-Date: 2022-04-17 15:06+0000\n" -"Last-Translator: 王攀 <41330784@qq.com>\n" +"PO-Revision-Date: 2023-04-16 06:50+0000\n" +"Last-Translator: Hulen \n" "Language-Team: Chinese (Traditional) \n" +"librecmc/luciapplicationsopenvpn/zh_Hant/>\n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.17-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -27,7 +27,7 @@ msgstr "接受從伺服器傳送過來的選項" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:92 msgid "Add" -msgstr "新增" +msgstr "加入" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:225 msgid "Add route after establishing connection" @@ -104,7 +104,7 @@ msgstr "變更行程優先權" msgid "Change to directory before initialization" msgstr "初始化前改變根目錄" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 msgid "Check peer certificate against a CRL" msgstr "驗證客戶端證書以確保其是否過期" @@ -189,7 +189,7 @@ msgstr "不實際執行 ifconfig 指令" msgid "Don't add routes automatically" msgstr "不自動新增路由" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:760 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 msgid "Don't cache --askpass or --auth-user-pass passwords" msgstr "不快取 --askpass 或 --auth-user-pass passwords" @@ -267,6 +267,11 @@ msgstr "啟用" msgid "Encrypt and authenticate all control channel packets with the key" msgstr "使用金鑰加密及認證所有的控制通道資料包" +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:756 +msgid "" +"Encrypt and authenticate all control channel packets with the key, version 2." +msgstr "使用金鑰版本 2 加密和驗證所有控制通道資料封包。" + #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:622 msgid "Encryption cipher for packets" msgstr "加密資料包" @@ -387,7 +392,7 @@ msgstr "歷史日誌檔案的行數" msgid "OVPN configuration file upload" msgstr "OVPN組態文件上傳" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:764 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 msgid "Only accept connections from given X509 name" msgstr "只接收已給定的 X509 名稱的連線" @@ -510,11 +515,11 @@ msgstr "傳輸若干秒後重新驗證資料通道金鑰" msgid "Replay protection sliding window size" msgstr "重播保護的滑動視窗大小" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:768 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 msgid "Require explicit designation on certificate" msgstr "證書需要顯式指定" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:772 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:776 msgid "Require explicit key usage on certificate" msgstr "證書需要明確的金鑰" @@ -522,7 +527,7 @@ msgstr "證書需要明確的金鑰" msgid "Restart after remote ping timeout" msgstr "遠端 ping 超時後重啟" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:800 msgid "Restrict the allowed ciphers to be negotiated" msgstr "限制要協商的允許密碼" @@ -561,11 +566,11 @@ msgstr "儲存" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:65 msgid "" "Section to add an optional 'auth-user-pass' file with your credentials (%s)" -msgstr "本節添加帶有您的憑據(%s)的可選“ auth-user-pass”文件" +msgstr "本節加入帶有您的憑證(%s)的可選「auth-user-pass」檔案" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-file.lua:44 msgid "Section to modify the OVPN config file (%s)" -msgstr "節錄OVPN設置文件(%s)的部分" +msgstr "節錄 OVPN 設定檔案(%s)的部分" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:257 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:45 @@ -740,18 +745,18 @@ msgstr "'名稱'欄位不能是空白!" msgid "" "The OVPN config file (%s) could not be found, please check your " "configuration." -msgstr "找不到OVPN設置文件(%s),請檢查您的組態。" +msgstr "找不到 OVPN 設定檔(%s),請檢查您的組態。" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 msgid "The highest supported TLS version" msgstr "最高支援的 TLS 版本" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:788 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua:69 msgid "The key direction for 'tls-auth' and 'secret' options" msgstr "“tls-auth”和“secret”選項的金鑰型別" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:780 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:784 msgid "The lowest supported TLS version" msgstr "最低支援的 TLS 版本" @@ -759,10 +764,9 @@ msgstr "最低支援的 TLS 版本" msgid "" "The size of the OVPN config file (%s) is too large for online editing in " "LuCI (≥ 100 KB)." -msgstr "" -"OVPN設置文件(%s)的尺寸太大,無法在LuCI中進行在線編輯(&ge; 100 KB)。" +msgstr "OVPN 設定檔(%s)的尺寸太大,無法在 LuCI 中進行線上編輯(≥ 100 KB)。" -#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:792 +#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:796 msgid "This completely disables cipher negotiation" msgstr "這會完全禁用密碼協商" diff --git a/package/luci/applications/luci-app-opkg/Makefile b/package/luci/applications/luci-app-opkg/Makefile index 5763e9115e..72e3b4cab0 100644 --- a/package/luci/applications/luci-app-opkg/Makefile +++ b/package/luci/applications/luci-app-opkg/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+opkg include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js b/package/luci/applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js index c8aa4fdf54..af1e972efc 100644 --- a/package/luci/applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js +++ b/package/luci/applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js @@ -98,6 +98,8 @@ var packages = { installed: { providers: {}, pkgs: {} } }; +var languages = ['en']; + var currentDisplayMode = 'available', currentDisplayRows = []; function parseList(s, dest) @@ -201,13 +203,24 @@ function display(pattern) { var src = packages[currentDisplayMode === 'updates' ? 'installed' : currentDisplayMode], table = document.querySelector('#packages'), - pager = document.querySelector('#pager'); + pagers = document.querySelectorAll('.controls > .pager'), + i18n_filter = null; currentDisplayRows.length = 0; if (typeof(pattern) === 'string' && pattern.length > 0) pattern = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'ig'); + switch (document.querySelector('input[name="filter_i18n"]:checked').value) { + case 'all': + i18n_filter = /^luci-i18n-/; + break; + + case 'lang': + i18n_filter = new RegExp('^luci-i18n-(base-.+|.+-(' + languages.join('|') + '))$'); + break; + } + for (var name in src.pkgs) { var pkg = src.pkgs[name], desc = pkg.description || '', @@ -226,6 +239,9 @@ function display(pattern) !name.match(pattern) && !desc.match(pattern)) continue; + if (name.indexOf('luci-i18n-') === 0 && (!(i18n_filter instanceof RegExp) || !name.match(i18n_filter))) + continue; + var btn, ver; if (currentDisplayMode === 'updates') { @@ -294,8 +310,9 @@ function display(pattern) currentDisplayRows.push([ name, ver, - pkg.size ? '%.1024mB'.format(pkg.size) - : (altsize ? '~%.1024mB'.format(altsize) : '-'), + [ pkg.size || 0, + pkg.size ? '%1024mB'.format(pkg.size) + : (altsize ? '~%1024mB'.format(altsize) : '-') ], desc, btn ]); @@ -310,37 +327,43 @@ function display(pattern) return 0; }); - pager.parentNode.style.display = ''; - pager.setAttribute('data-offset', 100); - handlePage({ target: pager.querySelector('.prev') }); + for (var i = 0; i < pagers.length; i++) { + pagers[i].parentNode.style.display = ''; + pagers[i].setAttribute('data-offset', 100); + } + + handlePage({ target: pagers[0].querySelector('.prev') }); } function handlePage(ev) { var filter = document.querySelector('input[name="filter"]'), - pager = ev.target.parentNode, - offset = +pager.getAttribute('data-offset'), - next = ev.target.classList.contains('next'); + offset = +ev.target.parentNode.getAttribute('data-offset'), + next = ev.target.classList.contains('next'), + pagers = document.querySelectorAll('.controls > .pager'); if ((next && (offset + 100) >= currentDisplayRows.length) || (!next && (offset < 100))) return; offset += next ? 100 : -100; - pager.setAttribute('data-offset', offset); - pager.querySelector('.text').firstChild.data = currentDisplayRows.length - ? _('Displaying %d-%d of %d').format(1 + offset, Math.min(offset + 100, currentDisplayRows.length), currentDisplayRows.length) - : _('No packages'); - if (offset < 100) - pager.querySelector('.prev').setAttribute('disabled', 'disabled'); - else - pager.querySelector('.prev').removeAttribute('disabled'); + for (var i = 0; i < pagers.length; i++) { + pagers[i].setAttribute('data-offset', offset); + pagers[i].querySelector('.text').firstChild.data = currentDisplayRows.length + ? _('Displaying %d-%d of %d').format(1 + offset, Math.min(offset + 100, currentDisplayRows.length), currentDisplayRows.length) + : _('No packages'); - if ((offset + 100) >= currentDisplayRows.length) - pager.querySelector('.next').setAttribute('disabled', 'disabled'); - else - pager.querySelector('.next').removeAttribute('disabled'); + if (offset < 100) + pagers[i].querySelector('.prev').setAttribute('disabled', 'disabled'); + else + pagers[i].querySelector('.prev').removeAttribute('disabled'); + + if ((offset + 100) >= currentDisplayRows.length) + pagers[i].querySelector('.next').setAttribute('disabled', 'disabled'); + else + pagers[i].querySelector('.next').removeAttribute('disabled'); + } var placeholder = _('No information available'); @@ -376,6 +399,11 @@ function handleMode(ev) ev.preventDefault(); } +function handleI18nFilter(ev) +{ + display(document.querySelector('input[name="filter"]').value); +} + function orderOf(c) { if (c === '~') @@ -515,7 +543,7 @@ function pkgStatus(pkg, vop, ver, info) } } -function renderDependencyItem(dep, info) +function renderDependencyItem(dep, info, flat) { var li = E('li'), vop = dep.version ? dep.version[0] : null, @@ -533,9 +561,9 @@ function renderDependencyItem(dep, info) var text = pkg.name; if (pkg.installsize) - text += ' (%.1024mB)'.format(pkg.installsize); + text += ' (%1024mB)'.format(pkg.installsize); else if (pkg.size) - text += ' (~%.1024mB)'.format(pkg.size); + text += ' (~%1024mB)'.format(pkg.size); li.appendChild(E('span', { 'data-tooltip': pkg.description }, [ text, ' ', pkgStatus(pkg, vop, ver, info) ])); @@ -551,14 +579,16 @@ function renderDependencyItem(dep, info) [ dep.name, ' ', pkgStatus({ name: dep.name, missing: true }, vop, ver, info) ])); - var subdeps = renderDependencies(depends, info); - if (subdeps) - li.appendChild(subdeps); + if (!flat) { + var subdeps = renderDependencies(depends, info); + if (subdeps) + li.appendChild(subdeps); + } return li; } -function renderDependencies(depends, info) +function renderDependencies(depends, info, flat) { var deps = depends || [], items = []; @@ -600,7 +630,7 @@ function renderDependencies(depends, info) version: [vop, ver] }; - items.push(renderDependencyItem(info.seen[dep], info)); + items.push(renderDependencyItem(info.seen[dep], info, flat)); } if (items.length) @@ -636,9 +666,9 @@ function handleInstall(ev) size; if (pkg.installsize) - size = _('~%.1024mB installed').format(pkg.installsize); + size = _('~%1024mB installed').format(pkg.installsize); else if (pkg.size) - size = _('~%.1024mB compressed').format(pkg.size); + size = _('~%1024mB compressed').format(pkg.size); else size = _('unknown'); @@ -653,7 +683,8 @@ function handleInstall(ev) } var totalsize = pkg.installsize || pkg.size || 0, - totalpkgs = 1; + totalpkgs = 1, + suggestsize = 0; if (depcache.install && depcache.install.length) depcache.install.forEach(function(ipkg) { @@ -661,9 +692,53 @@ function handleInstall(ev) totalpkgs++; }); - inst = E('p', {}, - _('Require approx. %.1024mB size for %d package(s) to install.') - .format(totalsize, totalpkgs)); + var luci_basename = pkg.name.match(/^luci-([^-]+)-(.+)$/), + i18n_packages = [], + i18n_tree; + + if (luci_basename && (luci_basename[1] != 'i18n' || luci_basename[2].indexOf('base-') === 0)) { + var i18n_filter; + + if (luci_basename[1] == 'i18n') { + var basenames = []; + + for (var pkgname in packages.installed.pkgs) { + var m = pkgname.match(/^luci-([^-]+)-(.+)$/); + + if (m && m[1] != 'i18n') + basenames.push(m[2]); + } + + if (basenames.length) + i18n_filter = new RegExp('^luci-i18n-(' + basenames.join('|') + ')-' + pkg.name.replace(/^luci-i18n-base-/, '') + '$'); + } + else { + i18n_filter = new RegExp('^luci-i18n-' + luci_basename[2] + '-(' + languages.join('|') + ')$'); + } + + if (i18n_filter) { + for (var pkgname in packages.available.pkgs) + if (pkgname != pkg.name && pkgname.match(i18n_filter)) + i18n_packages.push(pkgname); + + var i18ncache = {}; + + i18n_tree = renderDependencies(i18n_packages, i18ncache, true); + + if (i18ncache.install && i18ncache.install.length) { + i18ncache.install.forEach(function(ipkg) { + suggestsize += ipkg.installsize || ipkg.size || 0; + }); + } + } + } + + inst = E('p', [ + _('Require approx. %1024mB size for %d package(s) to install.') + .format(totalsize, totalpkgs), + ' ', + suggestsize ? _('Suggested translations require approx. %1024mB additional space.').format(suggestsize) : '' + ]); if (deps) { tree = E('li', '%s:'.format(_('Dependencies'))); @@ -682,15 +757,43 @@ function handleInstall(ev) E('li', '%s: %h'.format(_('Version'), pkg.version)), E('li', '%s: %h'.format(_('Size'), size)), tree || '', + i18n_packages.length ? E('li', [ + E('strong', [_('Suggested translations'), ':']), + i18n_tree + ]) : '' ]), desc || '', errs || inst || '', + E('div', [ + E('hr'), + i18n_packages.length ? E('p', [ + E('label', { 'class': 'cbi-checkbox' }, [ + E('input', { + 'id': 'i18ninstall-cb', + 'type': 'checkbox', + 'name': 'i18ninstall', + 'data-packages': i18n_packages.join(' '), + 'disabled': isReadonlyView, + 'checked': true + }), ' ', + E('label', { 'for': 'i18ninstall-cb' }), ' ', + _('Install suggested translation packages as well') + ]) + ]) : '', + E('p', [ + E('label', { 'class': 'cbi-checkbox' }, [ + E('input', { + 'id': 'overwrite-cb', + 'type': 'checkbox', + 'name': 'overwrite', + 'disabled': isReadonlyView + }), ' ', + E('label', { 'for': 'overwrite-cb' }), ' ', + _('Allow overwriting conflicting package files') + ]) + ]) + ]), E('div', { 'class': 'right' }, [ - E('label', { 'class': 'cbi-checkbox', 'style': 'float:left' }, [ - E('input', { 'id': 'overwrite-cb', 'type': 'checkbox', 'name': 'overwrite', 'disabled': isReadonlyView }), ' ', - E('label', { 'for': 'overwrite-cb' }), ' ', - _('Overwrite files from other package(s)') - ]), E('div', { 'class': 'btn', 'click': ui.hideModal @@ -824,9 +927,9 @@ function handleRemove(ev) size, desc; if (avail.installsize) - size = _('~%.1024mB installed').format(avail.installsize); + size = _('~%1024mB installed').format(avail.installsize); else if (avail.size) - size = _('~%.1024mB compressed').format(avail.size); + size = _('~%1024mB compressed').format(avail.size); else size = _('unknown'); @@ -873,7 +976,8 @@ function handleOpkg(ev) var cmd = ev.target.getAttribute('data-command'), pkg = ev.target.getAttribute('data-package'), rem = document.querySelector('input[name="autoremove"]'), - owr = document.querySelector('input[name="overwrite"]'); + owr = document.querySelector('input[name="overwrite"]'), + i18n = document.querySelector('input[name="i18ninstall"]'); var dlg = ui.showModal(_('Executing package manager'), [ E('p', { 'class': 'spinning' }, @@ -888,6 +992,9 @@ function handleOpkg(ev) if (owr && owr.checked) argv.push('--force-overwrite'); + if (i18n && i18n.checked) + argv.push.apply(argv, i18n.getAttribute('data-packages').split(' ')); + if (pkg != null) argv.push(pkg); @@ -985,11 +1092,15 @@ function updateLists(data) .sort(function(a, b) { return a.mount > b.mount })[0] || { size: 0, free: 0 }; pg.firstElementChild.style.width = Math.floor(mount.size ? ((100 / mount.size) * mount.free) : 100) + '%'; - pg.setAttribute('title', '%s (%.1024mB)'.format(pg.firstElementChild.style.width, mount.free)); + pg.setAttribute('title', '%s (%1024mB)'.format(pg.firstElementChild.style.width, mount.free)); parseList(data[1], packages.available); parseList(data[2], packages.installed); + for (var pkgname in packages.installed.pkgs) + if (pkgname.indexOf('luci-i18n-base-') === 0) + languages.push(pkgname.substring(15)); + display(document.querySelector('input[name="filter"]').value); }); } @@ -1047,6 +1158,51 @@ return view.extend({ E('button', { 'class': 'btn cbi-button-action', 'click': handleUpload, 'disabled': isReadonlyView }, [ _('Upload Package…') ]), ' ', E('button', { 'class': 'btn cbi-button-neutral', 'click': handleConfig }, [ _('Configure opkg…') ]) ]) + ]), + + E('div', {}, [ + E('label', {}, _('Display LuCI translation packages') + ':'), ' ', + E('div', [ + E('label', { + 'data-tooltip': _('Display base translation packages and translation packages for already installed languages only') + }, [ + E('input', { + 'type': 'radio', + 'name': 'filter_i18n', + 'value': 'lang', + 'change': handleI18nFilter, + 'checked': true + }), + ' ', + _('filtered', 'Display translation packages') + ]), + ' \u00a0 ', + E('label', { + 'data-tooltip': _('Display all available translation packages') + }, [ + E('input', { + 'type': 'radio', + 'name': 'filter_i18n', + 'value': 'all', + 'change': handleI18nFilter + }), + ' ', + _('all', 'Display translation packages') + ]), + ' \u00a0 ', + E('label', { + 'data-tooltip': _('Hide all translation packages') + }, [ + E('input', { + 'type': 'radio', + 'name': 'filter_i18n', + 'value': 'none', + 'change': handleI18nFilter + }), + ' ', + _('none', 'Display translation packages') + ]) + ]) ]) ]), @@ -1057,7 +1213,7 @@ return view.extend({ ]), E('div', { 'class': 'controls', 'style': 'display:none' }, [ - E('div', { 'id': 'pager', 'class': 'center' }, [ + E('div', { 'class': 'pager center' }, [ E('button', { 'class': 'btn cbi-button-neutral prev', 'aria-label': _('Previous page'), 'click': handlePage }, [ '«' ]), E('div', { 'class': 'text' }, [ 'dummy' ]), E('button', { 'class': 'btn cbi-button-neutral next', 'aria-label': _('Next page'), 'click': handlePage }, [ '»' ]) @@ -1072,6 +1228,14 @@ return view.extend({ E('th', { 'class': 'th col-10 left' }, [ _('Description') ]), E('th', { 'class': 'th right cbi-section-actions' }, [ '\u00a0' ]) ]) + ]), + + E('div', { 'class': 'controls', 'style': 'display:none' }, [ + E('div', { 'class': 'pager center' }, [ + E('button', { 'class': 'btn cbi-button-neutral prev', 'aria-label': _('Previous page'), 'click': handlePage }, [ '«' ]), + E('div', { 'class': 'text' }, [ 'dummy' ]), + E('button', { 'class': 'btn cbi-button-neutral next', 'aria-label': _('Next page'), 'click': handlePage }, [ '»' ]) + ]) ]) ]); diff --git a/package/luci/applications/luci-app-opkg/po/ar/opkg.po b/package/luci/applications/luci-app-opkg/po/ar/opkg.po index a7f2ce3702..f1315e7adf 100644 --- a/package/luci/applications/luci-app-opkg/po/ar/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/ar/opkg.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "PO-Revision-Date: 2021-03-04 13:50+0000\n" "Last-Translator: Said Zakaria \n" -"Language-Team: Arabic \n" "Language: ar\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -11,19 +11,23 @@ msgstr "" "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "X-Generator: Weblate 4.5.1-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "إجراءات" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "قم بإزالة التبعيات غير المستخدمة تلقائيًا" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "متاح" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -35,61 +39,75 @@ msgstr "" "لإدخالات المستودع المخصصة. قد يتم تغيير التهيئة في الملفات الأخرى ولكن عادةً " "لا يتم الاحتفاظ بها بواسطة sysupgrade ." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "إلغاء" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "إجلاء" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "تكوين opkg …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "التبعيات" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "الوصف" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "تفاصيل الحزمة %h " -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "إلغاء" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "عرض d% -%d من %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "قم بتنزيل الحزمة وتثبيتها" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "أخطاء" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "تنفيذ مدير الحزم" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "مصفي" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "مساحة فارغة" @@ -97,20 +115,28 @@ msgstr "مساحة فارغة" msgid "Grant access to opkg management" msgstr "منح حقوق الدخول لإدارة opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "تثبيت" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "مثبت" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -118,228 +144,249 @@ msgstr "" "يعد تثبيت الحزم من مصادر غير موثوق بها مخاطرة أمنية محتملة! هل تحاول حقًا " "تثبيت %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "تثبيت…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "تحميل بيانات التكوين …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "جارٍ تحميل معلومات الحزمة …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "قم بتثبيت الحزمة يدويًا" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "يحتاج إلى ترقية" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "الصفحة التالية" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "لا توجد معلومات متاحة" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "لا توجد حزم" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "لا توجد حزم تطابق \"%h \"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "غير متوفر" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "غير مثبت" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "موافق" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "تكوين OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "الكتابة فوق الملفات من حزم أخرى" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "اسم الحزمة" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "اسم الحزمة أو URL …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "الصفحة السابقة" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "هل تحاول حقًا تثبيت %h ؟" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "نزع" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "قم بإزالة الحزمة % h " -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "يزيل…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "تتطلب تقريبا. Ùª .1024 ميغا بايت حجم لتثبيت %d حزمة (حزم)." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "إصدار مطلوب %h% h ، مثبت %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "حزمة التبعية المطلوبة %h غير متوفرة في أي مستودع." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "يتطلب التحديث إلى %h% h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "إعادة ضبط" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "إحفض" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "جارٍ حفظ بيانات التكوين …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "مقاس" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "الحجم (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "برنامج" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "فشل الأمر opkg % h برمز %d ." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" "الإصدار المثبت من الحزمة % h غير متوافق ، يتطلب٪ s أثناء تثبيت %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "الحزمة %h ليست متاحة في أي مستودع تم تكوينه." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" "إصدار المستودع للحزمة %h غير متوافق ، يتطلب %s ولكن يتوفر%s فقط." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "اكتب للتصفية …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "تعذر تنفيذ أمر opkg %s :%s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "غير قادر على قراءة٪ s: %s%" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "غير قادر على حفظ٪ %s% : s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "تحديث القوائم …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "التحديثات" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "تحديث النظام…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "تحميل الحزمة …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "الإصدار" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "الإصدار غير متوافق" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "في انتظار إكمال أمر opkg %h …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "غير معروف" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "مضغوط ~Ùª .1024 ميغا بايت" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "تم تثبيت ~Ùª .1024 ميغا بايت" diff --git a/package/luci/applications/luci-app-opkg/po/bg/opkg.po b/package/luci/applications/luci-app-opkg/po/bg/opkg.po index e4e80e115c..cd22c72246 100644 --- a/package/luci/applications/luci-app-opkg/po/bg/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/bg/opkg.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-06-10 03:40+0200\n" "PO-Revision-Date: 2021-08-31 01:32+0000\n" "Last-Translator: Iskren Mihaylov \n" -"Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.8.1-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Действия" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Автоматично премахни неизползвани зависимости" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Налични" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -38,61 +42,75 @@ msgstr "" "conf
    за ваши записи на хранилища. Конфигурацията в други файлове може " "да се промени, но обикновено не се запазва при sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Отмени" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Изчисти" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Конфигуриране opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Зависимости" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Описание" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Детайли за пакет %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Затвори" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Показване %d-%d of %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Свали и инсталирай пакет" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Грешки" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Стартиране на пакетния мениджър" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Филтър" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Свободно място" @@ -100,20 +118,28 @@ msgstr "Свободно място" msgid "Grant access to opkg management" msgstr "Разрешаване достъп до opkg менажиране" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Инсталирай" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Инсталирани" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -121,151 +147,157 @@ msgstr "" "Инсталиране на пакети от недоверени източници е потенциален риск за " "сигурността! Наистина ли да се опитам да инсталирам %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Инсталиране…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Зареждане на конфигурации…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Зареждане пакетна информация…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Ръчно инсталирай пакет" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Нуждаещ се от ъпгрейд" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Следваща страница" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Няма налична информация" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Няма пакети" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Няма съвпадение за \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Липсва" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Не е инсталиран" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "ОК" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "OPKG Конфигурация" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Заместване на файлове от други пакет(и)" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Име на пакет" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Име на пакет или URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Предишна страница" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Да се направи опит за инсталиране на %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Премахни" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Премахни пакет %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Премахване…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Нужни са прибл. %.1024mB място за инсталиране на %d пакет(а)." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Нужни са прибл. %1024mB място за инсталиране на %d пакет(а)." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Изисква версия %h %h, инсталирана %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "Необходим пакет %h не е наличен в никое хранилище." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Изисква се ъпдейт към %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Нулирай" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Запази" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Запазване на конфигурация…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Размер" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Размер (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Софтуер" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "Команда opkg %h се провали с код %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -273,11 +305,11 @@ msgstr "" "Инсталираната версия на пакета %h не е съвместима, изисква се %s " "докато %s е инсталирана." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "Пакетът %h не е наличен в нито едно от хранилищата." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -285,66 +317,81 @@ msgstr "" "Версията на пакета в хранилището %h не е свъместима, изисква се %s " "но само %s е налична." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Пиши за филтър…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Не може да се изпълни opkg %s команда: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Не може да се прочете %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Не може да се запази %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Обновяване на списъци…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Обновления" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Надстройване…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Качване пакет…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Версия" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Несъвместима версия" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Изчкаване opkg %h команда да приключи…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "неизвестен" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB архивирани" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB архивирани" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB инсталирани" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB инсталирани" diff --git a/package/luci/applications/luci-app-opkg/po/bn_BD/opkg.po b/package/luci/applications/luci-app-opkg/po/bn_BD/opkg.po index 60c355ea92..908b69e4e0 100644 --- a/package/luci/applications/luci-app-opkg/po/bn_BD/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/bn_BD/opkg.po @@ -6,7 +6,7 @@ msgstr "" "PO-Revision-Date: 2021-10-08 17:53+0000\n" "Last-Translator: Rayhan Nabi \n" "Language-Team: Bengali (Bangladesh) \n" +"librecmc/luciapplicationsopkg/bn_BD/>\n" "Language: bn_BD\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.9-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "ক্রিয়া" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -34,61 +38,75 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "বাতিল করুন" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "বর্ণনা" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "বাতিল" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "ছাঁকনি" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "" @@ -96,245 +114,274 @@ msgstr "" msgid "Grant access to opkg management" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "সংরক্ষণ করুন" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "সংস্করণ" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "অজ্ঞাত" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/ca/opkg.po b/package/luci/applications/luci-app-opkg/po/ca/opkg.po index e671574a66..0d60734cad 100644 --- a/package/luci/applications/luci-app-opkg/po/ca/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/ca/opkg.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-06-10 03:40+0200\n" "PO-Revision-Date: 2021-09-17 06:52+0000\n" "Last-Translator: Roger Pueyo Centelles \n" -"Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.9-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Accions" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Disponible" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -34,63 +38,77 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Cancel•lar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 #, fuzzy msgid "Configure opkg…" msgstr "Configuració" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Descripció" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Oblida-ho" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Descarrega i instal·la el paquet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 #, fuzzy msgid "Errors" msgstr "Error" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filtre" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Espai lliure" @@ -98,258 +116,287 @@ msgstr "Espai lliure" msgid "Grant access to opkg management" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Instal·la" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 #, fuzzy msgid "Installed" msgstr "Instal·la" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 #, fuzzy msgid "Install…" msgstr "Instal·la" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 #, fuzzy msgid "Loading configuration data…" msgstr "Vés a la pàgina de configuració" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 #, fuzzy msgid "Manually install package" msgstr "Descarrega i instal·la el paquet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "No hi ha informació disponible" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 #, fuzzy msgid "No packages" msgstr "Cerca paquet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 #, fuzzy msgid "Not available" msgstr "Total disponible" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 #, fuzzy msgid "Not installed" msgstr "No connectat" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "D'acord" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 #, fuzzy msgid "OPKG Configuration" msgstr "Configuració d'OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Nom del paquet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 #, fuzzy msgid "Package name or URL…" msgstr "Nom del paquet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Treu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Treu…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Restableix" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Desar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 #, fuzzy msgid "Saving configuration data…" msgstr "Configuració de dispositiu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Mida" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Mida (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Programari" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 #, fuzzy msgid "Update lists…" msgstr "Actualitza les llistes" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 #, fuzzy msgid "Updates" msgstr "Actualitza les llistes" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Versió" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 #, fuzzy msgid "Waiting for the opkg %h command to complete…" msgstr "Esperant que s'acabi l'ordre..." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "desconegut" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/cs/opkg.po b/package/luci/applications/luci-app-opkg/po/cs/opkg.po index 5d08c96baf..5da83940b0 100644 --- a/package/luci/applications/luci-app-opkg/po/cs/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/cs/opkg.po @@ -2,30 +2,34 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-15 08:34+0000\n" -"Last-Translator: Lukas Jelinek \n" -"Language-Team: Czech \n" +"Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Akce" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Povolit přepsání souborů konfliktních balíčků" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Automatické odstranění nepoužívaných závislostí" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "K dispozici" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -37,82 +41,106 @@ msgstr "" "customfeeds.conf pro vlastní položky úložiště. Konfigurace v jiných " "souborech může být změněna, ale obvykle není spravována sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" -msgstr "Storno" +msgstr "Zrušit" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Prázdný" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Nakonfigurujte opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Závislosti" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Popis" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Podrobnosti o balíčku %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Zahodit" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Zobrazit balíčky překladů LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Zobrazit všechny dostupné balíčky překladů" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Zobrazit základní balíčky překladů a balíčky překladů pro již nainstalované " +"jazyky" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Zobrazuji %d-%d z %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Stáhnout a nainstalovat balíček" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Chyby" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Spuštění správce balíčků" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filtr" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Volné místo" #: applications/luci-app-opkg/root/usr/share/rpcd/acl.d/luci-app-opkg.json:3 msgid "Grant access to opkg management" -msgstr "" +msgstr "Udělit přístup ke správě opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Skrýt všechny balíčky překladů" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Instalovat" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Instalovat také navrhované balíčky překladů" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" -msgstr "Instalací" +msgstr "Instalováno" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -120,152 +148,158 @@ msgstr "" "Instalace balíků z nedůvěryhodných zdrojů je potenciálním bezpečnostním " "rizikem! Opravdu se pokusíte nainstalovat %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Instalovat…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Načítání konfiguračních dat…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Načítání informací o balíčku…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Ručně nainstalujte balíček" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Vyžaduje upgrade" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Další stránka" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Údaje nejsou k dispozici" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Žádné balíčky" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Žádné balíčky odpovídající \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Není dostupný" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Není instalován" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Konfigurace OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Přepsat soubory z jiných balíčků" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Název balíčku" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Název balíčku nebo adresa URLL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Předchozí stránka" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Opravdu se pokusíte nainstalovat %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Odstranit" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Odstraňte balíček %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Odstranit…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Vyžadovat cca. %.1024mB velikost pro balíčky %d instalaci." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Vyžadovat cca. %1024mB velikost pro balíčky %d instalaci." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Vyžadovat verzi %h %h, instalovaná %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "Požadovaný balíček závislostí %h není dostupný v žádném úložišti." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Vyžaduje aktualizaci na %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Reset" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Uložit" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Ukládání konfiguračních dat…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Velikost" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Velikost (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Software" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Navrhované překlady" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "Navrhované překlady vyžadují přibližně %1024mB dalšího prostoru." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "Příkaz opkg %h byl označen kódem %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -273,11 +307,11 @@ msgstr "" "Nainstalovaná verze balíku %h není kompatibilní, vyžaduje instalaci " "%s, ale %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "Balík %h není k dispozici v žádném nakonfigurovaném úložišti." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -285,66 +319,81 @@ msgstr "" "Verze balíčku %h není kompatibilní, vyžaduje %s, ale k dispozici je " "pouze %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Začněte psát pro filtrování…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" -msgstr "" +msgstr "Nelze provést opkg %s příkaz: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" -msgstr "" +msgstr "Nelze přečíst %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" -msgstr "" +msgstr "Nelze uložit %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Aktualizovat seznamy…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Aktualizace" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Přechod na novější verzi…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Nahrát balíček…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Verze" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Verze nekompatibilní" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Čekání na dokončení příkazu opkg %h …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "vše" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "filtrovaný" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "žádný" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "neznámý" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB komprimován" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB komprimován" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB nainstalován" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB nainstalován" diff --git a/package/luci/applications/luci-app-opkg/po/da/opkg.po b/package/luci/applications/luci-app-opkg/po/da/opkg.po index 169a7a944c..e3e90fabaa 100644 --- a/package/luci/applications/luci-app-opkg/po/da/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/da/opkg.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "PO-Revision-Date: 2022-08-05 01:21+0000\n" "Last-Translator: drax red \n" -"Language-Team: Danish \n" "Language: da\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -10,19 +10,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.14-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Handlinger" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Tillad overskrivning af modstridende pakkefiler" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Fjern automatisk ubrugte dependencies" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Tilgængelig" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -35,61 +39,77 @@ msgstr "" "Konfigurationen i de andre filer kan ændres, men den bevares normalt ikke af " "sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Annuller" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Ryd" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Konfigurer opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Dependencies" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Beskrivelse" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Detaljer for pakke %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Afvis" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Vis LuCI-oversættelsespakker" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Vis alle tilgængelige oversættelsespakker" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Vis kun basisoversættelsespakker og oversættelsespakker til allerede " +"installerede sprog" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Viser %d-%d af %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Download og installer pakken" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Fejl" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Udførelse af pakkeadministrator" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filter" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Ledig plads" @@ -97,20 +117,28 @@ msgstr "Ledig plads" msgid "Grant access to opkg management" msgstr "Giv adgang til opkg administration" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Skjul alle oversættelsespakker" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Installer" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Installer også de foreslåede oversættelsespakker" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Installeret" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -118,152 +146,158 @@ msgstr "" "Installation af pakker fra kilder, der ikke er tillid til, er en potentiel " "sikkerhedsrisiko! Forsøger du virkelig at installere %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Installer…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Indlæser konfigurationsdata…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Indlæser pakkeoplysninger…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Installer pakke manuelt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Skal opgraderes" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Næste side" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Ingen oplysninger tilgængelige" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Ingen pakker" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Ingen pakker, der matcher \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Ikke tilgængelig" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Ikke installeret" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "OPKG konfiguration" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Overskriv filer fra andre pakke(r)" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Pakkenavn" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Pakkenavn eller URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Forrige side" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Forsøger du virkelig at installere %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Fjern" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Fjern pakke %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Fjern…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Kræver ca. %.1024mB størrelse for %d pakke(r) at installere." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Kræver ca. %1024mB størrelse for %d pakke(r) at installere." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Kræver version %h %h, installeret %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "Påkrævet dependency pakke %h er ikke tilgængelig i noget repository." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Kræver opdatering til %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Nulstil" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Gem" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Gemmer konfigurationsdata…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Størrelse" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Størrelse (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Software" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Forslag til oversættelser" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "Foreslåede oversættelser kræver ca. %1024mB ekstra plads." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "Kommandoen opkg %h mislykkedes med koden %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -271,12 +305,12 @@ msgstr "" "Den installerede version af pakken %h er ikke kompatibel, kræver %s " "mens %s er installeret." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" "Pakken %h er ikke tilgængelig i noget konfigureret repository." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -284,66 +318,81 @@ msgstr "" "repository version af pakken %h er ikke kompatibel, kræver %s, men " "kun %s er tilgængelig." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Skriv for at filtrere…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Kan ikke udføre opkg %s kommando: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Kan ikke læse %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Kan ikke gemme %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Opdater lister…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Opdateringer" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Opgrader…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Upload pakke…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Version" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Version inkompatibel" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Venter på at kommandoen opkg %h afsluttes…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "alle" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "filtreret" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "ingen" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "ukendt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB komprimeret" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB komprimeret" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB installeret" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB installeret" diff --git a/package/luci/applications/luci-app-opkg/po/de/opkg.po b/package/luci/applications/luci-app-opkg/po/de/opkg.po index 5029719f26..ac16088bc9 100644 --- a/package/luci/applications/luci-app-opkg/po/de/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/de/opkg.po @@ -3,30 +3,34 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-26 17:57+0200\n" -"PO-Revision-Date: 2022-08-01 15:53+0200\n" -"Last-Translator: Zocker1012 \n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Weblate 4.16-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Aktionen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Überschreiben von Dateien bei Konflikten mit anderen Paketen erlauben" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Unbenutzte Abhängigkeiten automatisch entfernen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Verfügbar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -40,82 +44,106 @@ msgstr "" "Konfigurationsdateien kann zwar geändert werden, wird aber überlicherweise " "bei Systemupdates zurückgesetzt." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Abbrechen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Zurücksetzen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Konfiguriere opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Abhängigkeiten" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Beschreibung" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Details für Paket %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Verwerfen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "LuCI Sprachpakete anzeigen" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Alle verfügbaren Sprachpakete anzeigen" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Nur Basis-Sprachpakete und zusätzliche Sprachpakete für bereits installierte " +"Sprachen anzeigen" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Einträge %d-%d von %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Paket herunterladen und installieren" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Fehler" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Paketmanager ausführen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filter" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Freier Platz" #: applications/luci-app-opkg/root/usr/share/rpcd/acl.d/luci-app-opkg.json:3 msgid "Grant access to opkg management" -msgstr "Zugriff auf opkg-Verwaltung erlauben" +msgstr "Zugriff auf die opkg-Verwaltung gewähren" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Alle Sprachpakete ausblenden" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Installieren" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Vorgeschlagene Sprachpakete auch installieren" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Installiert" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -124,154 +152,162 @@ msgstr "" "Sicherheitsrisiko! Soll wirklich versucht werden, %h zu " "installieren?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Installieren…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Lade Konfigurationsdaten…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Lade Paketinformationen…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Paket manuell installieren" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Aktualisierung benötigt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Nächste Seite" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Keine Informationen verfügbar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Keine Pakete" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Keine auf \"%h\" zutreffenden Pakete." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Nicht verfügbar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Nicht installiert" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "OPKG-Konfiguration" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Überschreiben von Dateien anderer Pakete erlauben" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Paketname" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Paketname oder URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Vorige Seite" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Soll wirklich versucht werden, %h zu installieren?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Entfernen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Paket %h entfernen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Entfernen…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -"Benötige etwa %.1024mB Speicherplatz für die Installation von %d Pakete(n)." +"Benötige etwa %1024mB Speicherplatz für die Installation von %d Pakete(n)." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Erforderliche Version %h %h, installiert %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "Benötigtes abhängiges Paket %h ist in keinem Repository verfügbar." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Benötigt Update auf Version %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Zurücksetzen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Speichern" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Speichere Konfigurationsdaten…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Größe" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Größe (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Paketverwaltung" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Vorgeschlagene Sprachpakete" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" +"Die vorgeschlagenen Sprachpakete benötigen etwa %1024mB zusätzlichen " +"Speicherplatz." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" "Das opkg %h Kommando wurde mit Fehlercode %d beendet." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -279,12 +315,12 @@ msgstr "" "Die installierte Version von Paket %h ist nicht kompatibel, " "benötige Version %s während %s installiert ist." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" "Das Paket %h ist in keinem konfiguriertem Repository verfügbar." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -292,66 +328,81 @@ msgstr "" "Die Repository-Version von Paket %h ist nicht kompatibel, benötige " "Version %s aber nur %s ist verfügbar." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Tippen zum Filtern…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Der Befehl opkg %s konnte nicht ausgeführt werden: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Kann %s nicht lesen: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "%s kann nicht gespeichert werden: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Listen aktualisieren…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Aktualisierungen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Aktualisieren…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Paket hochladen…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Version" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Version inkompatibel" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Warte auf das opkg %h Kommando…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "alle" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "gefiltert" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "keine" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "unbekannt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "ca. %.1024mB komprimiert" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "ca. %1024mB komprimiert" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "ca. %.1024mB installiert" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "ca. %1024mB installiert" diff --git a/package/luci/applications/luci-app-opkg/po/el/opkg.po b/package/luci/applications/luci-app-opkg/po/el/opkg.po index 383d069caa..170e8baaa6 100644 --- a/package/luci/applications/luci-app-opkg/po/el/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/el/opkg.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-06-10 03:40+0200\n" "PO-Revision-Date: 2020-01-14 15:22+0000\n" "Last-Translator: Franco Castillo \n" -"Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.11-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Ενέργειες" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Διαθέσιμο" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -34,63 +38,77 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Ακύρωση" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 #, fuzzy msgid "Configure opkg…" msgstr "Παραμετροποίηση" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Περιγραφή" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Κατέβασμα και εγκατάσταση πακέτου" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 #, fuzzy msgid "Errors" msgstr "Σφάλμα" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Φίλτρο" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Ελεύθερος χώρος" @@ -98,255 +116,284 @@ msgstr "Ελεύθερος χώρος" msgid "Grant access to opkg management" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Εγκατάσταση" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 #, fuzzy msgid "Installed" msgstr "Εγκατάσταση" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 #, fuzzy msgid "Install…" msgstr "Εγκατάσταση" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 #, fuzzy msgid "Loading configuration data…" msgstr "Μετάβαση στη σχετική σελίδα ρυθμίσεων" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 #, fuzzy msgid "Manually install package" msgstr "Κατέβασμα και εγκατάσταση πακέτου" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Δεν υπάρχουν πληροφορίες διαθέσιμες" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 #, fuzzy msgid "No packages" msgstr "Εύρεση πακέτου" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 #, fuzzy msgid "Not available" msgstr "Διαθέσιμο Συνολικά" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 #, fuzzy msgid "Not installed" msgstr "Εγκατάσταση" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "Εντάξει" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 #, fuzzy msgid "OPKG Configuration" msgstr "Παραμετροποίηση OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Όνομα πακέτου" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 #, fuzzy msgid "Package name or URL…" msgstr "Όνομα πακέτου" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Αφαίρεση" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Αφαίρεση…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Αρχικοποίηση" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Αποθήκευση" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 #, fuzzy msgid "Saving configuration data…" msgstr "Παραμετροποίηση Συσκευής" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Μέγεθος" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Λογισμικό" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Έκδοση" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/en/opkg.po b/package/luci/applications/luci-app-opkg/po/en/opkg.po index b6d00f31ce..fc5c3cebf9 100644 --- a/package/luci/applications/luci-app-opkg/po/en/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/en/opkg.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-06-10 03:40+0200\n" "PO-Revision-Date: 2022-07-03 10:25+0000\n" "Last-Translator: Hannu Nyman \n" -"Language-Team: English \n" "Language: en\n" "MIME-Version: 1.0\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.13.1-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -34,61 +38,75 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "" @@ -96,245 +114,274 @@ msgstr "" msgid "Grant access to opkg management" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/es/opkg.po b/package/luci/applications/luci-app-opkg/po/es/opkg.po index e7d7edcf99..10bfa0ba9b 100644 --- a/package/luci/applications/luci-app-opkg/po/es/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/es/opkg.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-06-10 03:41+0200\n" "PO-Revision-Date: 2022-08-28 23:17+0000\n" "Last-Translator: Franco Castillo \n" -"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.14.1-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Acciones" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Permitir sobrescribir archivos de paquetes en conflicto" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Eliminar automáticamente las dependencias no utilizadas" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Disponible" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -39,61 +43,77 @@ msgstr "" "repositorio personalizadas. La configuración en los otros archivos puede " "cambiarse, pero por lo general no se conserva mediante sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Cancelar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Limpiar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Configurar opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Dependencias" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Descripción" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Detalles para el paquete %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Descartar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Mostrar paquetes de traducción de LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Mostrar todos los paquetes de traducción disponibles" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Mostrar paquetes de traducción base y paquetes de traducción solo para " +"idiomas ya instalados" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Mostrando %d-%d de %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Descargar e instalar paquete" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Errores" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Ejecutando el gestor de paquetes" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filtrar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Espacio libre" @@ -101,20 +121,28 @@ msgstr "Espacio libre" msgid "Grant access to opkg management" msgstr "Conceder acceso a la gestión de opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Ocultar todos los paquetes de traducción" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Instalar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Instalar también los paquetes de traducción sugeridos" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Instalado" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -122,153 +150,160 @@ msgstr "" "¡Instalar paquetes de fuentes no confiables es un riesgo potencial de " "seguridad! ¿Realmente intentas instalar %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Instalar…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Cargando datos de configuración…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Cargando información del paquete…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Instalar manualmente el paquete" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Necesita actualización" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Página siguiente" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "No hay información disponible" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Sin paquetes" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Ningún paquete coincide con «%h»." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "No disponible" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "No instalado" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "Aceptar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Configuración de OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Sobrescribir archivos de otro/s paquete/s" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Nombre del paquete" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Nombre de paquete o URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Página anterior" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "¿Confirma que quiere instalar %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Eliminar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Eliminar paquete %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Desinstalar…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Se necesitan aproximadamente %.1024mB para instalar %d paquete/s." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Se necesitan aproximadamente %1024mB para instalar %d paquete/s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Requiere la versión%h%h, instalado %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "El paquete de dependencia requerido %h no está disponible en ningún " "repositorio." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Requiere actualización a %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Restablecer" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Guardar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Guardando datos de configuración…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Tamaño" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Tamaño (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Software" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Traducciones sugeridas" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" +"Las traducciones sugeridas requieren aprox. %1024mB de espacio adicional." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "El comando opkg %h falló con el código %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -276,12 +311,12 @@ msgstr "" "La versión instalada del paquete %h no es compatible; requiere %s, " "mientras que %s está instalado." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" "El paquete %h no está disponible en ningún repositorio configurado." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -289,66 +324,81 @@ msgstr "" "La versión de repositorio del paquete %h no es compatible, requiere " "%s pero solo %s está disponible." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Escriba para filtrar…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "No se puede ejecutar el comando opkg %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "No se puede leer %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "No se puede guardar %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Actualizar listas…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Actualizaciones" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Actualizar…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Subir paquete…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Versión" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Versión incompatible" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Esperando a que el comando opkg %h finalice…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "todos" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "filtrado" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "ninguno" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "desconocido" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB comprimido" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB comprimido" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB instalado" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB instalado" diff --git a/package/luci/applications/luci-app-opkg/po/fa/opkg.po b/package/luci/applications/luci-app-opkg/po/fa/opkg.po new file mode 100644 index 0000000000..c9c7a84781 --- /dev/null +++ b/package/luci/applications/luci-app-opkg/po/fa/opkg.po @@ -0,0 +1,393 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-01-05 22:12+0000\n" +"Last-Translator: Rose \n" +"Language-Team: Persian \n" +"Language: fa\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.15.1-dev\n" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 +msgid "Actions" +msgstr "اقدام ها" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "بازنویسی فایل های بسته متضاد را مجاز کنید" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 +msgid "Automatically remove unused dependencies" +msgstr "حذف اتوماتیک پیش نیازهای بدون استفاده" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 +msgid "Available" +msgstr "در دسترس" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 +msgid "" +"Below is a listing of the various configuration files used by opkg. " +"Use opkg.conf for global settings and customfeeds.conf for " +"custom repository entries. The configuration in the other files may be " +"changed but is usually not preserved by sysupgrade." +msgstr "" +"در زیر فهرستی از فایل های پیکربندی مختلف مورد استفاده توسط opkg " +"است. استفاده از opkg.conf برای تنظیمات جهانی و customfeeds." +"conf برای ورودی های مخزن سفارشی است. پیکربندی در فایل های دیگر ممکن است " +"تغییر کند اما معمولاً توسط sysupgrade حفظ نمی شود." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +msgid "Cancel" +msgstr "لغو" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 +msgid "Clear" +msgstr "پاک کردن" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 +msgid "Configure opkg…" +msgstr "پیکربندی opkg…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 +msgid "Dependencies" +msgstr "وابستگی ها" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 +msgid "Description" +msgstr "توضیحات" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +msgid "Details for package %h" +msgstr "جزئیات مربوط به بسته بندی %h" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 +msgid "Dismiss" +msgstr "رد کردن" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "نمایش بسته های ترجمه LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "نمایش همه موارد موجود در بسته های ترجمه" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"نمایش بسته‌های ترجمه پایه و بسته‌های ترجمه فقط برای زبان‌هایی که قبلاً نصب شده‌اند" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 +msgid "Displaying %d-%d of %d" +msgstr "نمایش %d-%d از %d" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 +msgid "Download and install package" +msgstr "دانلود و نصب بسته" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 +msgid "Errors" +msgstr "خطاها" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 +msgid "Executing package manager" +msgstr "در حال اجرای مدیر بسته" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 +msgid "Filter" +msgstr "فیلتر" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 +msgid "Free space" +msgstr "فضای خالی" + +#: applications/luci-app-opkg/root/usr/share/rpcd/acl.d/luci-app-opkg.json:3 +msgid "Grant access to opkg management" +msgstr "اعطای دسترسی به مدیریت opkg" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "پنهان کردن تمام بسته های ترجمه" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 +msgid "Install" +msgstr "نصب" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "بسته های ترجمه پیشنهادی را نیز نصب کنید" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 +msgid "Installed" +msgstr "نصب شد" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 +msgid "" +"Installing packages from untrusted sources is a potential security risk! " +"Really attempt to install %h?" +msgstr "" +"نصب بسته ها از منابع نامعتبر یک خطر امنیتی بالقوه است! آیا واقعاً سعی می‌کنید " +"%h را نصب کنید؟" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 +msgid "Install…" +msgstr "نصب…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 +msgid "Loading configuration data…" +msgstr "در حال بارگیری داده های پیکربندی…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 +msgid "Loading package information…" +msgstr "در حال بارگیری اطلاعات بسته…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 +msgid "MD5" +msgstr "MD5" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 +msgid "Manually install package" +msgstr "بسته را به صورت دستی نصب کنید" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +msgid "Needs upgrade" +msgstr "نیاز به ارتقا دارد" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 +msgid "Next page" +msgstr "صفحه بعد" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 +msgid "No information available" +msgstr "اطلاعاتی در دسترس نیست" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 +msgid "No packages" +msgstr "بدون بسته" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 +msgid "No packages matching \"%h\"." +msgstr "هیچ بسته ای مطابق با «%h» وجود ندارد." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 +msgid "Not available" +msgstr "در دسترس نیست" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 +msgid "Not installed" +msgstr "نصب نشده است" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 +msgid "OK" +msgstr "تایید" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 +msgid "OPKG Configuration" +msgstr "پیکربندی OPKG" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 +msgid "Package name" +msgstr "نام بسته" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 +msgid "Package name or URL…" +msgstr "نام بسته یا نشانی وب…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 +msgid "Previous page" +msgstr "صفحه قبلی" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 +msgid "Really attempt to install %h?" +msgstr "آیا واقعاً سعی می‌کنید %h را نصب کنید؟" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 +msgid "Remove" +msgstr "حذف" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 +msgid "Remove package %h" +msgstr "بسته %h را حذف کنید" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 +msgid "Remove…" +msgstr "حذف…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "نیاز به حدود اندازه %1024 مگابایت برای %d بسته(های) برای نصب." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 +msgid "Require version %h %h, installed %h" +msgstr "نیاز به نسخه %h% .h %h نصب شده است" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 +msgid "" +"Required dependency package %h is not available in any repository." +msgstr "بسته وابستگی مورد نیاز %h در هیچ مخزنی موجود نیست." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +msgid "Requires update to %h %h" +msgstr "نیاز به بروز رسانی به %h %h" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 +msgid "Reset" +msgstr "تنظیم مجدد" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +msgid "SHA256" +msgstr "SHA256" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 +msgid "Save" +msgstr "ذخیره" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 +msgid "Saving configuration data…" +msgstr "در حال ذخیره داده های پیکربندی…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +msgid "Size" +msgstr "اندازه" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 +msgid "Size (.ipk)" +msgstr "اندازه (ipk.)" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 +#: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 +msgid "Software" +msgstr "نرم افزار" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "ترجمه های پیشنهادی" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "ترجمه های پیشنهادی نیاز به فضای اضافی ٪1024mB دارند." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 +msgid "The opkg %h command failed with code %d." +msgstr "فرمان opkg %h با کد %d ناموفق بود." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +msgid "" +"The installed version of package %h is not compatible, require %s " +"while %s is installed." +msgstr "" +"نسخه نصب شده بسته %h سازگار نیست، تا زمانی که %s نصب شده باشد به %s " +"نیاز دارید." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 +msgid "The package %h is not available in any configured repository." +msgstr "بسته %h در هیچ مخزن پیکربندی شده ای موجود نیست." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 +msgid "" +"The repository version of package %h is not compatible, require %s " +"but only %s is available." +msgstr "" +"نسخه مخزن بسته %h سازگار نیست، به %s نیاز دارد اما فقط %s موجود است." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 +msgid "Type to filter…" +msgstr "برای فیلتر کردن تایپ کنید …" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +msgid "Unable to execute opkg %s command: %s" +msgstr "فرمان opkg %s را نمی‌توان اجرا کرد: %s" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 +msgid "Unable to read %s: %s" +msgstr "قادر به خواندن %s: %s نیست" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 +msgid "Unable to save %s: %s" +msgstr "قادر به ذخیره %s: %s نیست" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 +msgid "Update lists…" +msgstr "به روز رسانی لیست ها…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 +msgid "Updates" +msgstr "به روز رسانی ها" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 +msgid "Upgrade…" +msgstr "ارتقا…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 +msgid "Upload Package…" +msgstr "آپلود بسته…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 +msgid "Version" +msgstr "نسخه" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 +msgid "Version incompatible" +msgstr "نسخه ناسازگار است" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 +msgid "Waiting for the opkg %h command to complete…" +msgstr "در انتظار تکمیل شدن دستور opkg %h…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "همه" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "فیلتر شده" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "هیچکدام" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 +msgid "unknown" +msgstr "ناشناخته" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~% 1024 مگابایت فشرده شده است" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~% 1024 مگابایت نصب شده است" diff --git a/package/luci/applications/luci-app-opkg/po/fi/opkg.po b/package/luci/applications/luci-app-opkg/po/fi/opkg.po index 954bffda00..d8acefe4d5 100644 --- a/package/luci/applications/luci-app-opkg/po/fi/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/fi/opkg.po @@ -3,30 +3,34 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:40+0200\n" -"PO-Revision-Date: 2022-03-13 23:17+0000\n" +"PO-Revision-Date: 2023-10-18 05:43+0000\n" "Last-Translator: Jiri Grönroos \n" -"Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 5.1\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Toiminnot" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Salli ristiriitoja aiheuttavien pakettien ylikirjoittaminen" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Poista tarpeettomat riippuvuudet automaattisesti" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Saatavilla" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -39,61 +43,75 @@ msgstr "" "myös muita tiedostoja, mutta sysupgrade ei yleensä säilytä " "muutoksia." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Peruuta" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Tyhjennä" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Määritä opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Riippuvuudet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Kuvaus" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Paketin %h tiedot" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Hylkää" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Näytä LuCI:n kielikäännöspaketit" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Näytä kaikki saatavilla olevat kielikäännöspaketit" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Näytetään %d-%d / %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Lataa ja asenna paketti" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Virheet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Suoritetaan paketinhallintaa" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Suodatin" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Vapaa levytila" @@ -101,20 +119,28 @@ msgstr "Vapaa levytila" msgid "Grant access to opkg management" msgstr "Salli pääsy pakettiasennusten hallintaan (opkg)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Piilota kaikki kielikäännöspaketit" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Asenna" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Asenna myös ehdotetut kielikäännöspaketit" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Asennettu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -122,153 +148,159 @@ msgstr "" "Pakettien asentaminen epäluotettavista lähteistä on mahdollinen " "tietoturvariski! Yritätkö todella asentaa %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Asenna…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Ladataan asetustietoja…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Ladataan paketin tietoja…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Asenna paketti käsin" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Tarvitsee päivityksen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Seuraava sivu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Ei tietoja saatavilla" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Ei paketteja" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Ei paketteja, jotka vastaavat \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Ei saatavilla" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Ei asennettu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "OPKG-määritys" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Korvaa tiedostoja muista paketeista" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Paketin nimi" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Paketin nimi tai URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Edellinen sivu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Yritätkö todella asentaa %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Poista" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Poista paketti %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Poista…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "%d paketin asennus edellyttää noin %.1024mB tilaa." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "%d paketin asennus edellyttää noin %1024mB tilaa." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Vaatii version %h %h, asennettu %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "Vaadittava riippuvuuspaketti %h ei ole saatavilla mistään " "ohjelmistolähteestä." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Edellyttää päivitystä kohteeseen %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Palauta" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Tallenna" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Tallennetaan määritystietoja…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Koko" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Koko (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Ohjelmisto" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Ehdotetut kielikäännökset" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "opkg %h -komento epäonnistui koodilla %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -276,13 +308,13 @@ msgstr "" "Paketin %h asennettu versio ei ole yhteensopiva, se vaatii %s, kun " "%s on asennettu." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" "Paketti %h ei ole saatavilla mistään määritetystä " "ohjelmistolähteestä." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -290,66 +322,81 @@ msgstr "" "Ohjelmistolähteen versio paketista %h ei ole yhteensopiva, " "vaaditaan %s mutta vain %s on saatavilla." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Kirjoita suodattaaksesi…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Komentoa opkg %s ei voida suorittaa: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Ei voida lukea %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Ei voida tallentaa %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Päivitä luettelot…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Päivitykset" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Päivitys…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Lähetä paketti…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Versio" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Versio ei ole yhteensopiva" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Odotetaan opkg %h -komennon valmistumista…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "kaikki" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "tuntematon" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB pakattu" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB pakattu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB asennettuna" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB asennettuna" diff --git a/package/luci/applications/luci-app-opkg/po/fr/opkg.po b/package/luci/applications/luci-app-opkg/po/fr/opkg.po index 0d04903576..4e35fd6ac2 100644 --- a/package/luci/applications/luci-app-opkg/po/fr/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/fr/opkg.po @@ -3,30 +3,34 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:40+0200\n" -"PO-Revision-Date: 2022-07-31 13:17+0000\n" -"Last-Translator: Christophe Blancon \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.18-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Actions" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Autoriser l'écrasement des fichiers en conflit du package" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Supprimez automatiquement les dépendances inutilisées" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Disponible" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -39,61 +43,77 @@ msgstr "" "personnalisées. La configuration des autres fichiers peut être modifiée mais " "n'est généralement pas conservée par sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Annuler" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Nettoyer" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Configuration opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Dépendances" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Description" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Détails du package %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Annuler" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Afficher les paquets de traduction LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Afficher tous les paquets de traduction disponibles" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Afficher uniquement les paquets de traduction de base et les paquets de " +"traduction pour les langues déjà installées" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Affichage de %d-%d sur %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Télécharge et installe le paquet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Erreurs" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Exécution du gestionnaire de packages" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filtrer" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Espace libre" @@ -101,20 +121,28 @@ msgstr "Espace libre" msgid "Grant access to opkg management" msgstr "Permettre l'accès complet à la gestion des opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Masquer tous les paquets de traduction" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Installer" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Installer également les paquets de traduction suggérés" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Installé" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -122,153 +150,161 @@ msgstr "" "L'installation de packages à partir de sources non fiables est un risque " "potentiel pour la sécurité! Voulez-vous vraiment installer %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Installer…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Chargement des données de configuration…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Chargement des informations sur le package…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Installer manuellement le package" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Besoin de mise à niveau" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Page suivante" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Aucune information disponible" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Pas de paquet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Aucun package correspondant à \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Indisponible" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Pas installé" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Configuration OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Écraser les fichiers d'autres packages" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Nom du paquet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Nom ou URL du package…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Page précédente" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Voulez-vous vraiment installer %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Désinstaller" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Supprimer le package %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Désinstaller…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Exiger env taille. %.1024mB pour %d paquet(s) à installer." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Exiger env taille. %1024mB pour %d paquet(s) à installer." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Version requise %h %h, installée %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "Le package de dépendance requis %h n'est disponible dans aucun " "référentiel." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Nécessite une mise à jour vers %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Remise à zéro" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Sauvegarder" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Enregistrement des données de configuration…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Taille" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Taille (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Logiciels" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Traductions suggérées" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" +"Les traductions proposées nécessitent environ %1024mB d'espace " +"supplémentaire." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "La commande opkg %h a échoué avec le code %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -276,12 +312,12 @@ msgstr "" "La version installée du package %h n'est pas compatible, nécessite " "%s pendant que %s est installé." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" "Le package %h n'est disponible dans aucun référentiel configuré." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -289,66 +325,81 @@ msgstr "" "La version du référentiel du package %h n'est pas compatible, " "nécessite %s mais seulement %s est disponible." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Type à filtrer…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Impossible d'exécuter la commande opkg %s : %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Impossible de lire %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Impossible d'enregistrer %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Mettre à jour les listes…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Mises à jour" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Mettre à jour…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Télécharger le package…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Version" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Version incompatible" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "En attente de la fin de la commande opkg %h…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "tout" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "filtrée" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "aucun" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "inconnu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB compressé" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB compressé" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB installé" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB installé" diff --git a/package/luci/applications/luci-app-opkg/po/he/opkg.po b/package/luci/applications/luci-app-opkg/po/he/opkg.po index bef6fe8039..e382b54a74 100644 --- a/package/luci/applications/luci-app-opkg/po/he/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/he/opkg.po @@ -1,30 +1,34 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-01-15 22:31+0000\n" +"PO-Revision-Date: 2023-09-18 21:37+0000\n" "Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 5.0.2\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "פעולות" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "להסיר אוטומטית תלויות שאינן בשימוש" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "זמין" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -32,61 +36,75 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "ביטול" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "הגדר opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "תיאור" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "פרטים על החבילה %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "התעלמות" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "מוצגים %d-%d מתוך %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "הורדת והתקנת חבילות" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "שגיאות" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "מנהל החבילות מופעל" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "מסנן" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "מקום פנוי" @@ -94,20 +112,28 @@ msgstr "מקום פנוי" msgid "Grant access to opkg management" msgstr "הענקת גישה לניהול opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "התקנה" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "מותקנת" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -115,226 +141,247 @@ msgstr "" "התקנת חבילות ממקורות מפוקפקים היא הזמנה לסיכון אבטחה! לנסות להתקין את " "%h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "התקנה…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "נתוני התצורה נטענים…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "פרטי החבילה נטענים…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "התקנת חבילה באופן ידני" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "נדרש שדרוג" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "העמוד הבא" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "אין פרטים זמינים" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "אין חבילות" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "לא זמין" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "לא מותקן" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "תצורת OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "שם החבילה" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "שם החבילה או URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "שומר נתוני תצורה…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "תוכנה" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "גרסה" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 -msgid "unknown" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 +msgid "unknown" +msgstr "לא ידוע" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/hi/opkg.po b/package/luci/applications/luci-app-opkg/po/hi/opkg.po index f6c123acb3..096c7416ad 100644 --- a/package/luci/applications/luci-app-opkg/po/hi/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/hi/opkg.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-06-10 03:40+0200\n" "PO-Revision-Date: 2020-01-14 15:22+0000\n" "Last-Translator: Franco Castillo \n" -"Language-Team: Hindi \n" "Language: hi\n" "MIME-Version: 1.0\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 3.11-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "चाल-चलन" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -34,61 +38,75 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "" @@ -96,245 +114,274 @@ msgstr "" msgid "Grant access to opkg management" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/hu/opkg.po b/package/luci/applications/luci-app-opkg/po/hu/opkg.po index b1574f752e..bf53ba7fa2 100644 --- a/package/luci/applications/luci-app-opkg/po/hu/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/hu/opkg.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-06-14 19:53+0000\n" "Last-Translator: Gergő Szalka \n" -"Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" @@ -12,19 +12,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.7-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Műveletek" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Nem használt függőségek automatikus eltávolítása" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Elérhető" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -37,61 +41,75 @@ msgstr "" "fájlokban lévő beállítások megváltoztathatók, de általában nem lesznek " "megtartva rendszerfrissítéskor." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Mégse" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Törlés" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Az opkg beállítása…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Függőségek" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Leírás" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "A(z) %h csomag részletei" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Eltüntetés" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "%d-%d / %d megjelenítése" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Csomag letöltése és telepítése" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Hibák" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Csomagkezelő végrehajtása" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Szűrő" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Szabad hely" @@ -99,20 +117,28 @@ msgstr "Szabad hely" msgid "Grant access to opkg management" msgstr "Hozzáférés megadása az opkg kezelőnek" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Telepítés" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Telepítve" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -121,153 +147,159 @@ msgstr "" "biztonsági kockázattal járhat! Valóban megpróbálja telepíteni a(z) %h csomagot?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Telepítés…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Beállítási adatok betöltése…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Csomaginformációk betöltése…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Csomag kézi telepítése" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Frissítés szükséges" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Következő oldal" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Nincs elérhető információ" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Nincsenek csomagok" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Nincs „%h” mintára illeszkedő csomag." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Nem érhető el" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Nincs telepítve" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "Rendben" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "OPKG beállításai" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Fájlok felülírása más csomagokból" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Csomagnév" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Csomagnév vagy URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Előző oldal" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Valóban megpróbálja telepíteni a(z) %h csomagot?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Eltávolítás" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "A(z) %h csomag eltávolítása" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Eltávolítás…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Nagyjából %.1024mB méret szükséges %d csomag telepítéséhez." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Nagyjából %1024mB méret szükséges %d csomag telepítéséhez." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "A(z) %h %h verziója szükséges, %h van telepítve" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "A szükséges %h függőségcsomag nem érhető el egyik tárolóban sem." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "A(z) %h %h verzióra frissítést igényli" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Visszaállítás" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Mentés" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Beállítási adatok mentése…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Méret" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Méret (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Szoftver" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" "Az opkg %h parancs meghiúsult a következő kóddal: %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -275,11 +307,11 @@ msgstr "" "A(z) %h csomag telepített verziója nem megfelelő. %s szükséges, " "miközben %s van telepítve." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "A(z) %h csomag nem érhető el egyik beállított tárolóban sem." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -287,66 +319,81 @@ msgstr "" "A(z) %h csomag tárolóban lévő verziója nem megfelelő. %s szükséges, " "de csak %s érhető el." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Gépeljen a szűréshez…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Nem sikerült végrehajtani az opkg %s parancsot: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Nem sikerült beolvasni: %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Nem sikerült elmenteni: %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Listák frissítése…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Frissítések" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Frissítés…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Csomag feltöltése…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Verzió" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Nem megfelelő verzió" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Várakozás az opkg %h parancs befejeződésére…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "ismeretlen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB tömörítve" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB tömörítve" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB telepítve" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB telepítve" diff --git a/package/luci/applications/luci-app-opkg/po/it/opkg.po b/package/luci/applications/luci-app-opkg/po/it/opkg.po index 000e423637..d3f91ecf42 100644 --- a/package/luci/applications/luci-app-opkg/po/it/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/it/opkg.po @@ -3,30 +3,34 @@ msgstr "" "Project-Id-Version: LuCI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:40+0200\n" -"PO-Revision-Date: 2022-08-17 09:18+0000\n" -"Last-Translator: Angemon25 \n" -"Language-Team: Italian \n" +"Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 5.0-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Azioni" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Consenti la sovrascrittura dei pacchetti in conflitto" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" -msgstr "Rimuovi automaticamente le dipendenze non utilizzate" +msgstr "Rimuovi automaticamente le dipendenze inutilizzate" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" -msgstr "Disponibile" +msgstr "Disponibili" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -35,86 +39,110 @@ msgid "" msgstr "" "Di seguito è riportato un elenco dei vari file di configurazione utilizzati " "da opkg. Usa opkg.conf per le impostazioni globali e " -"customfeeds.conf per le voci delle repository personalizzate. La " -"configurazione negli altri file può essere cambiata ma solitamente non viene " -"conservata da sysupgrade." - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +"customfeeds.conf per le voci di repository personalizzati. La " +"configurazione negli altri file può essere cambiata, ma solitamente non " +"viene conservata da sysupgrade." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Annulla" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Cancella" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Configura opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Dipendenze" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Descrizione" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Dettagli per il pacchetto %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Chiudi" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Mostra pacchetti traduzione di LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Mostra tutti i pacchetti traduzione disponibili" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Mostra i pacchetti di traduzione di base e i pacchetti di traduzione solo " +"per le lingue già installate" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Mostrando %d-%d di %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" -msgstr "Scarica e installa pacchetto" +msgstr "Scarica e installa il pacchetto" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Errori" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Esecuzione del gestore pacchetti" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filtro" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" -msgstr "Spazio di archiviazione libero" +msgstr "Spazio libero" #: applications/luci-app-opkg/root/usr/share/rpcd/acl.d/luci-app-opkg.json:3 msgid "Grant access to opkg management" -msgstr "Concedere l'accesso alla gestione di opkg" +msgstr "Concedi l'accesso alla gestione di opkg" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Nascondi tutti i pacchetti di traduzione" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Installa" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Installa anche i pacchetti di traduzione suggeriti" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Installati" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -122,153 +150,159 @@ msgstr "" "L'installazione di pacchetti da fonti non attendibili è un potenziale " "rischio per la sicurezza! Tentare davvero di installare %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Installa…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Caricamento dati di configurazione…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Caricamento delle informazioni sul pacchetto…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Installa pacchetto manualmente" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Richiede aggiornamento" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Pagina successiva" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Nessuna informazione disponibile" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Nessun pacchetto" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Nessun pacchetto corrispondente a \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Non disponibile" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Non installato" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Configurazione OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Sovrascrivere i file da altri pacchetti" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Nome pacchetto" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Nome pacchetto o URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Pagina precedente" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Tentare davvero di installare %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Rimuovi" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Rimuovere il pacchetto %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Rimuovi…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Richiede circa %.1024mB per installare %d pacchetto(i)." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Richiede circa %1024mB per installare %d pacchetto(i)." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Richiede la versione %h %h, installata %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -"Il pacchetto di dipendenza %h non è disponibile in nessuna " +"Il pacchetto di dipendenza %h non è disponibile in nessun " "repository." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Richiede l'aggiornamento a %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" -msgstr "Reset" +msgstr "Reimposta" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Salva" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Salvataggio dati di configurazione…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Dimensione" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Dimensione (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Software" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Traduzioni suggerite" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "Le traduzioni suggerite richiedono ca. %1024 mB di spazio aggiuntivo." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." -msgstr "Il comando opkg %h ha fallito con il codice %d." +msgstr "Il comando opkg %h è fallito con il codice %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -276,79 +310,94 @@ msgstr "" "La versione installata del pacchetto %h non è compatibile, richiede " "%s mentre %s è installato." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -"Il pacchetto %h non è disponibile in nessuna repository configurata." +"Il pacchetto %h non è disponibile in nessun repository configurato." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -"La versione della repository del pacchetto %h non è compatibile, " +"La versione del repository del pacchetto %h non è compatibile, " "richiede %s ma è disponibile solo %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Scrivi per filtrare…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Impossibile eseguire il comando opkg %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Impossibile leggere %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Impossibile salvare %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Aggiorna liste…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Aggiornamenti" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Aggiorna…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" -msgstr "Carica Pacchetto…" +msgstr "Carica pacchetto…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Versione" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Versione incompatibile" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "In attesa del completamento del comando opkg %h…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "tutto" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "filtrato" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "nessuno" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "sconosciuto" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB compressi" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB compressi" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB installati" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB installati" diff --git a/package/luci/applications/luci-app-opkg/po/ja/opkg.po b/package/luci/applications/luci-app-opkg/po/ja/opkg.po index 934f8f26c1..28f215aa19 100644 --- a/package/luci/applications/luci-app-opkg/po/ja/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/ja/opkg.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-06-10 03:40+0200\n" "PO-Revision-Date: 2020-10-24 08:56+0000\n" "Last-Translator: RyotaGamer <21ryotagamer@gmail.com>\n" -"Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.3.1\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "操作" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "使用されない依存パッケージを自動的に削除" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "利用可能" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -38,61 +42,75 @@ msgstr "" "ポジトリの登録に使用します。これら以外のファイル内の設定を変更しても、通常は " "sysupgrade 時に保持されません。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "キャンセル" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "クリア" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "opkg設定…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "依存関係" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "説明" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "%h パッケージの詳細" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "閉じる" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "%d - %d 個を表示中(全 %d 個)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "パッケージのダウンロードとインストール" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "エラー" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "パッケージマネージャーが実行中" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "フィルター" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "空き容量" @@ -100,20 +118,28 @@ msgstr "空き容量" msgid "Grant access to opkg management" msgstr "opkg 管理へのアクセスを許可" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "インストール" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "インストール済" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -121,153 +147,159 @@ msgstr "" "信頼されていない提供元からのパッケージのインストールは、セキュリティ リスクを" "伴います! %h のインストールを試行してもよろしいですか?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "インストール…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "設定データをロード中…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "パッケージ情報をロード中…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "パッケージの手動インストール" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "要アップグレード" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "次のページ" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "情報なし" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "パッケージなし" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "\"%h\" に一致するパッケージはありません。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "利用不可" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "未インストール" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "OPKG 設定" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "他のパッケージからファイルを上書き" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "パッケージ名" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "パッケージ名または URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "前のページ" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "本当に %h をインストールしますか?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "削除" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "%h パッケージを削除" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "削除…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "%d のインストールには約 %.1024mB の領域が必要です。" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "%d のインストールには約 %1024mB の領域が必要です。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "バージョン %h %h が必要です。%h がインストール済みです" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "必須の依存パッケージ %h は、設定されているリポジトリでは利用できませ" "ん。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "%h %h への更新が必要です" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "リセット" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "保存" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "設定データを保存中…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "サイズ" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "サイズ (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "ソフトウェア" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "opkg %h コマンドが失敗しました(コード %d)。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -275,11 +307,11 @@ msgstr "" "%h のインストール済みバージョンは互換性がありません。 %s が、インス" "トールされている %s には必要です。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "%h パッケージは、設定済みのリポジトリでは利用できません。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -287,66 +319,81 @@ msgstr "" "%h パッケージのリポジトリ バージョンは互換性がありません。 %s が必要" "ですが、 %s のみ利用可能です。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "検索…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "opkg %s コマンドを実行できません: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "%s を読み取れません: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "%s を保存できません: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "リストを更新…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "アップデート" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "アップグレード…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "パッケージをアップロード…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "バージョン" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "互換性の無いバージョン" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "opkg %h コマンドが完了するのを待っています…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "不明" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB(圧縮後)" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB(圧縮後)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB(インストール後)" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB(インストール後)" diff --git a/package/luci/applications/luci-app-opkg/po/ko/opkg.po b/package/luci/applications/luci-app-opkg/po/ko/opkg.po index d824db0343..152591ea56 100644 --- a/package/luci/applications/luci-app-opkg/po/ko/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/ko/opkg.po @@ -3,30 +3,34 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:40+0200\n" -"PO-Revision-Date: 2022-08-01 05:54+0000\n" -"Last-Translator: somni \n" -"Language-Team: Korean \n" +"Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 5.1-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "관리 도구" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "사용 가능" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -34,61 +38,75 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "취소" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "opkg 설정…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "설명" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "닫기" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "패키지 다운로드 후 설치" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "패키지 관리자 실행 중" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "필터" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "여유 공간" @@ -96,256 +114,281 @@ msgstr "여유 공간" msgid "Grant access to opkg management" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "설치" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "설치됨" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" -msgstr "설치" +msgstr "설치…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" -msgstr "공통 설정" +msgstr "공통 설정 읽는 중…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 #, fuzzy msgid "Manually install package" msgstr "패키지 다운로드 후 설치" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "이용 가능한 정보가 없습니다" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 #, fuzzy msgid "No packages" msgstr "패키지 찾기" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 #, fuzzy msgid "Not available" msgstr "총 이용 가능한 양" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 #, fuzzy msgid "Not installed" msgstr "연결되지 않음" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 #, fuzzy msgid "OPKG Configuration" msgstr "OPKG-설정" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "패키지 이름" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" -msgstr "패키지 이름" +msgstr "패키지 이름 또는 URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "제거" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "제거…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "초기화" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 #, fuzzy msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "저장" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" -msgstr "장치 설정" +msgstr "장치 설정 저장중…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "크기" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "크기 (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "소프트웨어" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "버전" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 #, fuzzy msgid "Waiting for the opkg %h command to complete…" msgstr "실행한 명령이 끝나기를 기다리는 중입니다..." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "알 수 없는" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/lt/opkg.po b/package/luci/applications/luci-app-opkg/po/lt/opkg.po new file mode 100644 index 0000000000..7cbf4a5c26 --- /dev/null +++ b/package/luci/applications/luci-app-opkg/po/lt/opkg.po @@ -0,0 +1,406 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-10-14 02:30+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 +msgid "Actions" +msgstr "Veiksmai" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Leisti perrašymą konfliktuojamų paketų failus" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 +msgid "Automatically remove unused dependencies" +msgstr "Automatiškai pašalinti nenaudojamas priklausomybes" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 +msgid "Available" +msgstr "Pasiekiamas" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 +msgid "" +"Below is a listing of the various configuration files used by opkg. " +"Use opkg.conf for global settings and customfeeds.conf for " +"custom repository entries. The configuration in the other files may be " +"changed but is usually not preserved by sysupgrade." +msgstr "" +"Žemyn šio teksto yra įvairių konfigūracijų sąrašas, kurios naudoja " +"„opkg“. Naudoti opkg.conf visiems nustatymams ir " +"customfeeds.conf pasirinktinėms atsisiuntimo šaltinių įvestims. " +"Konfigūracijos kitose failuose gali būti pakeistos, bet dažniausiai nėra " +"išlaikomas „sysupgrade“." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +msgid "Cancel" +msgstr "Atšaukti" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 +msgid "Clear" +msgstr "Išvalyti" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 +msgid "Configure opkg…" +msgstr "Konfigūruoti „opkg“…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 +msgid "Dependencies" +msgstr "Priklausomybės" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 +msgid "Description" +msgstr "Aprašymas" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +msgid "Details for package %h" +msgstr "Išsami informacija paketui „%h“" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 +msgid "Dismiss" +msgstr "Nepaisyti" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Rodyti „LuCI“ vertimo/kalbos paketus" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Rodyti visus galimus vertimo/kalbos paketus" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Rody pagrindinius vertimų/kalbų paketus ir tik tuos kurie jau įdiegti " +"dabartinei kalbai" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 +msgid "Displaying %d-%d of %d" +msgstr "Rodoma %d-%d of %d" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 +msgid "Download and install package" +msgstr "Atsisiųsti ir įdiegti paketą" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 +msgid "Errors" +msgstr "Klaidos" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 +msgid "Executing package manager" +msgstr "Paleidžiama paketų tvarkyklė" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 +msgid "Filter" +msgstr "Filtruoti/Filtras" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 +msgid "Free space" +msgstr "Laisva vieta/-ovė" + +#: applications/luci-app-opkg/root/usr/share/rpcd/acl.d/luci-app-opkg.json:3 +msgid "Grant access to opkg management" +msgstr "Suteikti prieigą „opkg management“" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Slėpti visus vertimo/kalbos paketus" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 +msgid "Install" +msgstr "Įdiegti" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Įdiegti pritaikytus pasiūlomus vertimo/kalbos paketus" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 +msgid "Installed" +msgstr "Įdiegta" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 +msgid "" +"Installing packages from untrusted sources is a potential security risk! " +"Really attempt to install %h?" +msgstr "" +"Įdiegiant paketus iš nepatikimų šaltinių yra galimas saugos pažeidimas! Ar " +"tikrai norite įdiegti „%h“?" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 +msgid "Install…" +msgstr "Įdiegti…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 +msgid "Loading configuration data…" +msgstr "Kraunama konfigūravimo data…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 +msgid "Loading package information…" +msgstr "Kraunama paketo informacija…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 +msgid "MD5" +msgstr "„MD5“" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 +msgid "Manually install package" +msgstr "Savarankiškai įdiegti paketą" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +msgid "Needs upgrade" +msgstr "Reikia aukštutinio atnaujinimo" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 +msgid "Next page" +msgstr "Kitas puslapis" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 +msgid "No information available" +msgstr "Nėra informacijos" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 +msgid "No packages" +msgstr "Nėra paketų" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 +msgid "No packages matching \"%h\"." +msgstr "Nėra paketų atitinkančių \"„%h“\"." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 +msgid "Not available" +msgstr "Nėra pasiekiama" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 +msgid "Not installed" +msgstr "Nėra įdiegta" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 +msgid "OK" +msgstr "Gerai" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 +msgid "OPKG Configuration" +msgstr "„OPKG“ konfigūracija" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 +msgid "Package name" +msgstr "Paketo pavadinimas" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 +msgid "Package name or URL…" +msgstr "Paketo pavadinimas arba „URL“…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 +msgid "Previous page" +msgstr "Praeitas puslapis" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 +msgid "Really attempt to install %h?" +msgstr "Ar tikrai norite pamėginti įdiegti „%h“?" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 +msgid "Remove" +msgstr "Pašalinti" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 +msgid "Remove package %h" +msgstr "Pašalinti paketą „%h“" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 +msgid "Remove…" +msgstr "Pašalinti…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "" +"Reikalaujama apytiksliai %1024mB dydžio %d paketui/-ams, kad įdiegtumėte." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 +msgid "Require version %h %h, installed %h" +msgstr "Reikalaujama versija %h %h, įdiegta %h" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 +msgid "" +"Required dependency package %h is not available in any repository." +msgstr "" +"Reikalaujamas priklausomybės paketas „%h “ nėra pasiekiamas jokioje " +"atsisiuntimo vietovėje." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +msgid "Requires update to %h %h" +msgstr "Reikalaujama, kad atnaujintumėte į %h %h" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 +msgid "Reset" +msgstr "Atkurti/Grąžinimas į pradinę padėti/būsena/Atstatymas" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +msgid "SHA256" +msgstr "„SHA256“" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 +msgid "Save" +msgstr "Išsaugoti" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 +msgid "Saving configuration data…" +msgstr "Saugoma konfigūracijos duomenis…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +msgid "Size" +msgstr "Dydis" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 +msgid "Size (.ipk)" +msgstr "Dydis („*.ipk“)" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 +#: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 +msgid "Software" +msgstr "Taikomoji programa" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Pasiūlomi vertimai" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" +"Siūlomi vertimai reikalauja apytiksliai %1024mB papildomos vietos/-ovės." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 +msgid "The opkg %h command failed with code %d." +msgstr "„opkg %h“ komanda nepavyko su kodu – %d." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +msgid "" +"The installed version of package %h is not compatible, require %s " +"while %s is installed." +msgstr "" +"Įdiegta paketo versija „%h“ nėra palaikomas/-a. Reikalingas „%s“, " +"kol „%s“ yra įdiegtas." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 +msgid "The package %h is not available in any configured repository." +msgstr "" +"Paketas „%h“ nėra pasiekiamas jokioje konfigūruotame atsisiuntimo " +"vietovėje." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 +msgid "" +"The repository version of package %h is not compatible, require %s " +"but only %s is available." +msgstr "" +"Atsisiuntimo vietovės paketo versija „%h“ nėra palaikomas/-a, nes " +"reikalinga „%s“, bet tik „%s“ yra pasiekiamas." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 +msgid "Type to filter…" +msgstr "Rašykite, kad filtruotumėte…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +msgid "Unable to execute opkg %s command: %s" +msgstr "Negalima paleisti „opkg %s“ komanda: %s" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 +msgid "Unable to read %s: %s" +msgstr "Negalima nuskaityti %s: %s" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 +msgid "Unable to save %s: %s" +msgstr "Negalima išsaugoti %s: %s" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 +msgid "Update lists…" +msgstr "Atnaujinti sąrašus (Reikalingą)…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 +msgid "Updates" +msgstr "Atnaujinimai" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 +msgid "Upgrade…" +msgstr "Aukštutinis atnaujinimas…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 +msgid "Upload Package…" +msgstr "Įkelti paketą…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 +msgid "Version" +msgstr "Versija" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 +msgid "Version incompatible" +msgstr "Versija nesutampa/nepalaikoma" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 +msgid "Waiting for the opkg %h command to complete…" +msgstr "Laukiama kol „opkg %h“ komanda bus atlikta…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "Visi" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "Filtruoti" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "Jokie" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 +msgid "unknown" +msgstr "nežinoma" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB kompresuota/suspausta" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB įdiegtą" diff --git a/package/luci/applications/luci-app-opkg/po/mr/opkg.po b/package/luci/applications/luci-app-opkg/po/mr/opkg.po index 4c8d2d204e..edfcf4fdae 100644 --- a/package/luci/applications/luci-app-opkg/po/mr/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/mr/opkg.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-06-10 03:40+0200\n" "PO-Revision-Date: 2020-10-15 00:31+0000\n" "Last-Translator: Prachi Joshi \n" -"Language-Team: Marathi \n" "Language: mr\n" "MIME-Version: 1.0\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.3-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "क्रिया" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -34,61 +38,75 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "रद्द करा" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "वर्णन" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "डिसमिस करा" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "फिल्टर करा" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "" @@ -96,245 +114,274 @@ msgstr "" msgid "Grant access to opkg management" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/ms/opkg.po b/package/luci/applications/luci-app-opkg/po/ms/opkg.po index 7a1672b96c..27af3d3d34 100644 --- a/package/luci/applications/luci-app-opkg/po/ms/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/ms/opkg.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2010-05-07 17:57+1000\n" "PO-Revision-Date: 2020-01-14 15:22+0000\n" "Last-Translator: Franco Castillo \n" -"Language-Team: Malay \n" "Language: ms\n" "MIME-Version: 1.0\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 3.11-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Aksi" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Boleh didapati" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -34,63 +38,77 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Batal" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 #, fuzzy msgid "Configure opkg…" msgstr "Konfigurasi" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Keterangan" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Turun dan memasang pakej" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 #, fuzzy msgid "Errors" msgstr "Kesalahan" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Penapis" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "" @@ -98,254 +116,283 @@ msgstr "" msgid "Grant access to opkg management" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Memasang" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 #, fuzzy msgid "Installed" msgstr "Memasang" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 #, fuzzy msgid "Install…" msgstr "Memasang" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 #, fuzzy msgid "Loading configuration data…" msgstr "Menuju ke halaman konfigurasi yang relevan" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 #, fuzzy msgid "Manually install package" msgstr "Turun dan memasang pakej" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 #, fuzzy msgid "No packages" msgstr "Cari pakej" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 #, fuzzy msgid "Not available" msgstr "(%s sedia)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 #, fuzzy msgid "Not installed" msgstr "Memasang" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "Baik" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 #, fuzzy msgid "OPKG Configuration" msgstr "OPKG-Konfigurasi" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Nama pakej" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 #, fuzzy msgid "Package name or URL…" msgstr "Nama pakej" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Menghapuskan" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Menghapuskan…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Reset" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Simpan" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Saiz" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Perisian" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Versi" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/nb_NO/opkg.po b/package/luci/applications/luci-app-opkg/po/nb_NO/opkg.po index 51214a3698..fa5edbabee 100644 --- a/package/luci/applications/luci-app-opkg/po/nb_NO/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/nb_NO/opkg.po @@ -1,28 +1,32 @@ msgid "" msgstr "" -"PO-Revision-Date: 2021-02-07 07:33+0000\n" +"PO-Revision-Date: 2023-06-20 14:47+0000\n" "Last-Translator: Allan Nordhøy \n" -"Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.18.1\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Handlinger" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Fjern ubrukte avhengigheter automatisk" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Tilgjengelig" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -30,63 +34,77 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Avbryt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Tøm" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 #, fuzzy msgid "Configure opkg…" msgstr "Sett opp opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Avhengigheter" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Beskrivelse" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Detaljer for pakken %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" +msgstr "Avslå" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Viser %d-%d av %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Last ned og installer pakken" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 #, fuzzy msgid "Errors" msgstr "Feil" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filter" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Ledig plass" @@ -94,252 +112,281 @@ msgstr "Ledig plass" msgid "Grant access to opkg management" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Installer" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 #, fuzzy msgid "Installed" msgstr "Installer" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Installer…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Laster inn oppsettsdata…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Last inn pakkeinfo …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 #, fuzzy msgid "Manually install package" msgstr "Last ned og installer pakken" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Neste side" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Ingen informasjon tilgjengelig" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 #, fuzzy msgid "No packages" msgstr "Finn pakke" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 #, fuzzy msgid "Not available" msgstr "Totalt Tilgjengelig" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 #, fuzzy msgid "Not installed" msgstr "Ikke tilkoblet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 #, fuzzy msgid "OPKG Configuration" msgstr "OPKG-Konfigurasjon" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Pakkenavn" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Pakkenavn eller nettadresse…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Fjern" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Avinstaller…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Nullstill" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Lagre" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Lagrer oppsettsdata…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Størrelse" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Størrelse (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Programvare" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Oppdater lister…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 #, fuzzy msgid "Updates" msgstr "Oppdater lister" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Versjon" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Venter på at opkg %h-kommando fullføres…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "ukjent" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/pl/opkg.po b/package/luci/applications/luci-app-opkg/po/pl/opkg.po index 5bc0268e19..aa989cafd3 100644 --- a/package/luci/applications/luci-app-opkg/po/pl/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/pl/opkg.po @@ -3,9 +3,9 @@ msgstr "" "Project-Id-Version: LuCI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-04-20 09:40+0200\n" -"PO-Revision-Date: 2022-08-03 00:21+0000\n" +"PO-Revision-Date: 2023-05-14 10:50+0000\n" "Last-Translator: Matthaiks \n" -"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -13,21 +13,25 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.18-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Akcje" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Zezwalaj na zastępowanie plików pakietów powodujących konflikty" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Automatycznie usuwaj nieużywane zależności" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Dostępne" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -40,61 +44,77 @@ msgstr "" "Konfiguracja w innych plikach może zostać zmieniona, ale zwykle nie jest " "zachowywana przez sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Anuluj" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Wyczyść" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Skonfiguruj opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Zależności" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Opis" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Szczegóły pakietu %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Odrzuć" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Wyświetl pakiety tłumaczeń LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Wyświetl wszystkie dostępne pakiety tłumaczeń" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Wyświetl tylko podstawowe pakiety tłumaczeń i pakiety tłumaczeń dla już " +"zainstalowanych języków" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Wyświetlanie %d-%d z %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Pobierz i zainstaluj pakiet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Błędy" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Uruchamianie menedżera pakietów" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filtr" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Wolna przestrzeń" @@ -102,20 +122,28 @@ msgstr "Wolna przestrzeń" msgid "Grant access to opkg management" msgstr "Udziel dostępu do zarządzania opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Ukryj wszystkie pakiety tłumaczeń" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Instaluj" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Zainstaluj również sugerowane pakiety tłumaczeń" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Zainstalowane" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -123,154 +151,160 @@ msgstr "" "Instalowanie pakietów z niezaufanych źródeł jest potencjalnym zagrożeniem " "bezpieczeństwa! Czy na pewno chcesz zainstalować pakiet %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Zainstaluj.…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Wczytywanie danych konfiguracyjnych…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Ładowanie informacji o pakietach…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Ręczna instalacja pakietu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Wymaga aktualizacji" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Następna strona" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Brak dostępnych informacji" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Brak pakietów" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Brak pasujących pakietów \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Niedostępne" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Nie zainstalowano" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Konfiguracja OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Nadpisz pliki z innych pakietów" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Nazwa pakietu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Nazwa pakietu lub adres URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Poprzednia strona" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Czy na pewno chcesz zainstalować pakiet %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Usuń" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Usuń pakiet %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Usuń…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Wymaga ok. %.1024mB miejsca i instalacji %d pakietów." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Wymaga ok. %1024mB miejsca i instalacji %d pakietu(-ów)." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Wymagana wersja %h %h, zainstalowano %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "Wymagana zależność %h nie jest dostępna w żadnym repozytorium." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Wymaga aktualizacji do %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Resetuj" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Zapisz" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Zapisywanie danych konfiguracyjnych…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Rozmiar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Rozmiar (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Oprogramowanie" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Sugerowane tłumaczenia" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "Sugerowane tłumaczenia wymagają ok. %1024mB dodatkowej przestrzeni." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" "Polecenie opkg %h zakończyło się niepomyślnie z kodem %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -278,12 +312,12 @@ msgstr "" "Zainstalowana wersja pakietu %h nie jest zgodna, wymaga %s podczas " "gdy %s jest zainstalowana." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" "Pakiet %h nie jest dostępny w żadnym skonfigurowanym repozytorium." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -291,66 +325,81 @@ msgstr "" "Wersja pakietu w repozytorium %h nie jest zgodna, wymaga %s ale " "tylko %s jest dostępna." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Wpisz, aby przefiltrować…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Nie można wykonać polecenia opkg %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Nie można odczytać %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Nie można zapisać %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Aktualizuj listy…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Aktualizacje" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Zaktualizuj…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Prześlij pakiet…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Wersja" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Wersja niekompatybilna" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Oczekiwanie na opkg %h i wykonanie polecenia…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "wszystkie" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "przefiltrowane" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "żadne" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "nieznane" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB skompresowany" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB skompresowany" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB zainstalowany" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB zainstalowany" diff --git a/package/luci/applications/luci-app-opkg/po/pt/opkg.po b/package/luci/applications/luci-app-opkg/po/pt/opkg.po index ebf066863f..d4886883c4 100644 --- a/package/luci/applications/luci-app-opkg/po/pt/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/pt/opkg.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-26 19:03+0200\n" "PO-Revision-Date: 2022-11-30 14:48+0000\n" "Last-Translator: Gonçalo Pereira \n" -"Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.15-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Ações" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Permitir sobrescrever ficheiros de pacotes em conflito" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Remover automaticamente dependências não utilizadas" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Disponível" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -39,61 +43,77 @@ msgstr "" "configuração dos outros ficheiros pode ser alterada mas geralmente não é " "preservada pelo sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Cancelar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Limpar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Configurar opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Dependências" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Descrição" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Detalhes do pacote %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Dispensar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Mostrar pacotes de tradução do LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Mostrar todos os pacotes de tradução disponíveis" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Mostrar apenas pacotes de tradução base e pacotes de tradução apenas para " +"idiomas já instalados" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "A mostrar %d-%d de %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Descarregar e instalar o pacote" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Erros" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "A executar o gestor de pacotes" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filtro" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Espaço livre" @@ -101,20 +121,28 @@ msgstr "Espaço livre" msgid "Grant access to opkg management" msgstr "Conceder acesso à gestão do opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Ocultar todos os pacotes de tradução" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Instalar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Também instalar os pacotes de tradução sugeridos" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Instalado" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -122,154 +150,161 @@ msgstr "" "Instalar pacotes de fontes desconhecidas é uma potencial falha de segurança! " "Pretende mesmo tentar instalar %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Instalar…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "A carregar os dados de configuração…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "A carregar informações do pacote…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Instalar pacote manualmente" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Precisa de ser atualizado" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Próxima página" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Não há informação disponível" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Não há pacotes" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Não há pacotes com correspondência a \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Não disponível" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Não instalado" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Configuração do OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Substituir ficheiros de outro(s) pacote(s)" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Nome do pacote" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Nome do pacote ou URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Página anterior" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Tentar mesmo a instalação de %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Remover" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Remover o pacote %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Remover…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Requere aprox. %.1024mB de espaço para a instalação de %d pacote(s)." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Requere aprox. %1024mB de espaço para a instalação de %d pacote(s)." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Requere a versão %h %h, instalada %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "O pacote dependência %h requerido não se encontra disponível em " "nenhum repositório." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Requer a atualização de %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Reset" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Guardar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "A guardar dados de configuração…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Tamanho" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Tamanho (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Software" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Traduções sugeridas" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" +"As traduções sugeridas requerem aproximadamente %1024mB de espaço adicional." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" "O comando opkg %h falhou com o código de erro %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -277,13 +312,13 @@ msgstr "" "A versão instalada do pacote %h não é compatível, é necessária a %s " "enquanto a %s está instalada." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" "O pacote %h não se encontra disponível em nenhum dos repositórios " "configurados." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -291,66 +326,81 @@ msgstr "" "A versão do pacote %h do repositório não é compatível, é necessária " "a %s mas apenas a %s está disponível." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Escreva para filtrar…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Incapaz de executar o comando opkg %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Incapaz de ler %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Incapaz de gravar %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Atualizar listas…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Atualizações" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Atualizar…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Enviar pacote…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Versão" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Versão incompatível" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "A aguardar que o comando opkg %h termine…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "todos" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "filtrado" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "nenhum" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "desconhecido" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB comprimidos" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB comprimidos" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB instalados" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB instalados" diff --git a/package/luci/applications/luci-app-opkg/po/pt_BR/opkg.po b/package/luci/applications/luci-app-opkg/po/pt_BR/opkg.po index 39f296dc90..e8cec1174b 100644 --- a/package/luci/applications/luci-app-opkg/po/pt_BR/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/pt_BR/opkg.po @@ -6,7 +6,7 @@ msgstr "" "PO-Revision-Date: 2022-08-03 00:21+0000\n" "Last-Translator: Wellington Terumi Uemura \n" "Language-Team: Portuguese (Brazil) \n" +"librecmc/luciapplicationsopkg/pt_BR/>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -14,19 +14,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.14-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Ações" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Permite a substituição dos arquivos dos pacotes com conflito" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Remover automaticamente dependentes não-utilizados" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Disponível" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -39,61 +43,77 @@ msgstr "" "configurações em outros arquivos podem ser alterados, mas normalmente não " "são preservados por sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Cancelar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Limpar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Configurar o opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Dependentes" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Descrição" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Detalhes para o pacote %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Dispensar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Exibe os pacotes de tradução do LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Exibe todos os pacotes de tradução disponíveis" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Exibe os pacotes base de tradução e os pacotes de tradução apenas para os " +"idiomas já instalados" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Exibindo %d-%d de %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Baixe e instale o pacote" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Erros" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Executando o gerenciador de pacotes" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filtro" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Espaço livre" @@ -101,20 +121,28 @@ msgstr "Espaço livre" msgid "Grant access to opkg management" msgstr "Conceder acesso ao gerenciador opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Oculte todos os pacotes de tradução" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Instalar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Instale também os pacotes sugeridos de tradução" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Instalado" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -122,155 +150,160 @@ msgstr "" "Instalar pacotes de fontes não confiáveis é um risco de segurança em " "potencial! Realmente deseja tentar a instalação de %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Instalar…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Carregando dados de configuração…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Carregando informações de pacotes…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Instalar o pacote manualmente" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Precisa de atualização" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Próxima página" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Nenhuma informação disponível" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Sem pacotes" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Não há pacotes que correspondam a \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Não disponível" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Não instalado" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Configuração do OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Sobrescrever arquivos de outro(s) pacote(s)" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Nome do Pacote" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Nome do pacote ou URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Página anterior" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Realmente tentar instalar %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Remover" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Remover o pacote %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Remover…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -"Requer aprox. %.1024mB de tamanho para que o(s) pacote(s) %d sejam " -"instalados." +"Requer aprox. %1024mB de tamanho para que o(s) pacote(s) %d sejam instalados." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Requer a versão%h %h, instalada %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "Requer o pacote %h para suprir uma dependência que não está " "disponível em nenhum repositório." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Requer uma atualização para %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Limpar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Salvar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Salvando os dados de configuração…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Tamanho" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Tamanho (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Software" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Traduções sugeridas" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "As traduções sugeridas precisam de aprox. %1024mB de espaço adicional." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "O comando opkg %h falhou com o código %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -278,13 +311,13 @@ msgstr "" "A versão instalada do pacote %h não é compatível, requer o %s " "enquanto o %s estiver instalado." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" "O pacote %h não está disponível em nenhum repositório previamente " "configurado." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -292,66 +325,81 @@ msgstr "" "A versão do repositório do pacote %h não é compatível, requer o %s " "mas apenas o %s está disponível." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Digite para filtrar…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Impossível executar o comando opkg %s : %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Impossível ler %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Impossível salvar %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Atualizar listas…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Atualizações" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Atualizar…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Enviar Pacote…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Versão" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Versão incompatível" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Aguardando a conclusão do comando opkg %h…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "todos" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "filtrado" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "nenhum" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "desconhecido" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB comprimido" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB comprimido" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB instalado" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB instalado" diff --git a/package/luci/applications/luci-app-opkg/po/ro/opkg.po b/package/luci/applications/luci-app-opkg/po/ro/opkg.po index d43a5deed8..a5b2ab4df4 100644 --- a/package/luci/applications/luci-app-opkg/po/ro/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/ro/opkg.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-08-05 01:21+0000\n" -"Last-Translator: CRISTIAN ANDREI \n" -"Language-Team: Romanian \n" +"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" @@ -11,21 +11,25 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.16.2-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Acțiuni" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Permiteți suprascrierea fișierelor pachetelor conflictuale" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Eliminați automat dependențele neutilizate" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Disponibile" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -38,61 +42,77 @@ msgstr "" "Configurația din celelalte fișiere poate fi modificată, dar de obicei nu " "este păstrată de sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Anulare" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Curățați" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Configurați opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Dependențe" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Descriere" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Detalii pentru pachetul %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Închideți" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Afișați pachetele de traducere LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Afișați toate pachetele de traducere disponibile" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Afișați pachetele de traducere de bază și pachetele de traducere numai " +"pentru limbile deja instalate" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Se afișează %d-%d din %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Descărcați și instalați pachetul" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Erori" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Executarea managerului de pachete" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filtru" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Spațiu liber" @@ -100,20 +120,28 @@ msgstr "Spațiu liber" msgid "Grant access to opkg management" msgstr "Acordați acces la gestionarea opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Ascundeți toate pachetele de traducere" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Instalați" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Instalați și pachetele de traducere sugerate" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Instalat" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -121,153 +149,159 @@ msgstr "" "Instalarea de pachete din surse nesigure reprezintă un potențial risc de " "securitate! Încercați cu adevărat să instalați %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Instalați…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Se încarcă datele de configurare…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Se încarcă informațiile despre pachet…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Instalați manual pachetul" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Necesită actualizare" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Pagina următoare" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Nu există informații disponibile" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Fără pachete" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Nu există pachete care să corespundă cu \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Nu este disponibil" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Nu este instalat" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Configurația OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Suprascrierea fișierelor din alt(e) pachet(e)" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Numele pachetului" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Numele pachetului sau URL-ul…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Pagina anterioară" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Sigur doriți să instalați %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Eliminați" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Eliminați pachetul %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Eliminați…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Este necesar aproximativ %.1024mB pentru instalarea a %d pachete(e)." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Este necesar aproximativ %1024mB pentru instalarea a %d pachete(e)." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Necesită versiunea %h %h, instalată %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "Pachetul de dependență necesar %h nu este disponibil în niciun " "depozit." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Necesită actualizare la %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Resetați" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Salvați" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Se salvează datele de configurare…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Mărime" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Dimensiune (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Software" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Traduceri sugerate" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "Traducerile sugerate necesită aproximativ %1024mB spațiu suplimentar." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "Comanda opkg %h a eșuat cu codul %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -275,11 +309,11 @@ msgstr "" "Versiunea instalată a pachetului %h nu este compatibilă, necesită " "%s cât timp este instalat %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "Pachetul %h nu este disponibil în niciun depozit configurat." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -287,66 +321,81 @@ msgstr "" "Versiunea din depozit a pachetului %h nu este compatibilă, este " "necesar %s dar numai %s este disponibil." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Tastați pentru a filtra…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Nu se poate executa comanda opkg %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Nu se poate citi %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Nu se poate salva %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Actualizați listele…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Actualizări" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Faceți upgrade…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Încărcați pachetul…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" -msgstr "Versiunea" +msgstr "Versiune" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Versiune incompatibilă" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Se așteaptă finalizarea comenzii opkg %h…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "toate" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "Filtrate" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "niciunul" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "necunoscut" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB comprimat" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB comprimat" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB instalat" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB instalat" diff --git a/package/luci/applications/luci-app-opkg/po/ru/opkg.po b/package/luci/applications/luci-app-opkg/po/ru/opkg.po index fe50fd8376..4352419b51 100644 --- a/package/luci/applications/luci-app-opkg/po/ru/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/ru/opkg.po @@ -4,7 +4,7 @@ msgstr "" "POT-Creation-Date: 2010-05-09 01:01+0300\n" "PO-Revision-Date: 2022-09-25 14:22+0000\n" "Last-Translator: Alexey \n" -"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -16,19 +16,23 @@ msgstr "" "Project-Info: Это технический перевод, не дословный. Главное-удобный русский " "интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Действия" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Разрешить перезапись конфликтующих файлов пакетов" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Удалить неиспользуемые зависимости" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Доступно" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -41,61 +45,77 @@ msgstr "" "Конфигурация в других файлах может производится, но такие настройки могут не " "сохраняться утилитой sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Отмена" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Очистить" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Настройки" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Зависимости" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Описание" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Подробная информация о пакете %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Закрыть" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Отображение пакетов перевода LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Показывать все доступные переводы пакетов" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Показывать перевод только базовых пакетов и уже установленных языковых " +"пакетов" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Показано %d-%d из %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Загрузить и установить пакет" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Ошибки" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Выполнение..." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Фильтр" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Свободное место" @@ -103,20 +123,28 @@ msgstr "Свободное место" msgid "Grant access to opkg management" msgstr "Предоставить доступ к управлению opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Скрывать все пакеты переводов" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Установить" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Также установить рекомендуемые пакеты перевода" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Установлено" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -124,154 +152,160 @@ msgstr "" "Установка пакетов из недоверенных источников может привести к угрозе " "безопасности! Вы действительно хотите установить %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Установить…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Загрузка данных конфигурации…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Загрузка информации о пакете…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Ручная установка пакета" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Требуется обновление" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Следующая страница" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Нет доступной информации" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Нет пакетов" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Нет пакетов соответствующих запросу «%h»." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Не доступно" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Не установлено" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Настройка OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Переписать файлы для других пакетов" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Имя пакета" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Имя пакета или URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Предыдущая страница" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Вы действительно хотите установить %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Удалить" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Удалить пакет %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Удалить…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -"Требуется примерно %.1024mБ свободного пространства для установки %d пакетов." +"Требуется примерно %1024mБ свободного пространства для установки %d пакетов." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Требуемая версия %h %h, установлена %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "Требуемый в качестве зависимости пакет %h не доступен ни в одном из " "сконфигурированных репозиториев." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Требуется обновить до %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Очистить" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Сохранить" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Сохранение данных конфигурации…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Размер" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Размер (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Менеджер пакетов" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Рекомендуемые переводы" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "Рекомендуемые переводы требуют примерно %1024мБ дополнительного места." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "Команда opkg %h завершилась с кодом ошибки %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -279,12 +313,12 @@ msgstr "" "Установленная версия пакета %h не совместима. Требуется версия %s, " "а установлена %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" "Пакет %h не доступен ни в одном из сконфигурированных репозиториев." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -292,66 +326,81 @@ msgstr "" "Версия пакета %h, доступная в репозитории, несовместима. Требуется " "%s, но доступна только %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Введите для фильтрации" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Не удалось выполнить команду opkg %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Не удалось прочитать %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Не удалось сохранить %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Обновить списки" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Обновления" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Обновление…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Загрузить пакет" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Версия" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Версия несовместима" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Выполнение команды opkg %h…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "все" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "отфильтровать" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "нет" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "неизвестный" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mБ сжато" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mБ сжато" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mБ установлено" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mБ установлено" diff --git a/package/luci/applications/luci-app-opkg/po/sk/opkg.po b/package/luci/applications/luci-app-opkg/po/sk/opkg.po index f802630c77..d71c9185b9 100644 --- a/package/luci/applications/luci-app-opkg/po/sk/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/sk/opkg.po @@ -1,30 +1,34 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-02-15 13:57+0000\n" -"Last-Translator: Dušan Kazik \n" -"Language-Team: Slovak \n" +"Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.0-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Akcie" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Povoliť prepísanie konfliktných súborov balíkov" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Automatické odstránenie nepoužitých závislostí" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" -msgstr "Dostupný" +msgstr "Dostupné" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -36,61 +40,80 @@ msgstr "" "vlastné položky úložiska customfeeds.conf. Konfigurácia v ostatných " "súboroch sa môže zmeniť, ale zvyčajne ju sysupgrade nezachová." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Zrušiť" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Vymazať" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Konfigurovať opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Závislosti" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Popis" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Podrobnosti balíka %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Zahodiť" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +#, fuzzy +msgid "Display LuCI translation packages" +msgstr "Zobraziť balíky prekladov LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +#, fuzzy +msgid "Display all available translation packages" +msgstr "Zobraziť všetky dostupné balíky prekladov" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +#, fuzzy +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Zobraziť základné balíky prekladov a balíky prekladov len pre už " +"nainštalované jazyky" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Zobrazených %d-%d z %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Prevziať a nainštalovať balík" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Chyby" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Spúšťanie správcu balíkov" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filter" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Voľné miesto" @@ -98,20 +121,30 @@ msgstr "Voľné miesto" msgid "Grant access to opkg management" msgstr "Poskytnite prístup k správe opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +#, fuzzy +msgid "Hide all translation packages" +msgstr "Skryť všetky balíky prekladov" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Inštalovať" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +#, fuzzy +msgid "Install suggested translation packages as well" +msgstr "Inštalovať aj navrhované balíky prekladov" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" -msgstr "Nainštalovaný" +msgstr "Nainštalované" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -119,154 +152,160 @@ msgstr "" "Inštalácia balíkov z nedôveryhodných zdrojov predstavuje potenciálne " "bezpečnostné riziko! Naozaj sa snažíte nainštalovať %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Inštalovať…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Načítavajú sa konfiguračné údaje …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Načítavajú sa informácie o balíku …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Manuálna inštalácia balíka" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Vyžaduje aktualizáciu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Ďalšia strana" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Nie sú dostupné žiadne informácie" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Žiadne balíčky" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "\"%h\" nezodpovedajú žiadne balíky." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Nie je k dispozícií" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Nie je nainštalovaný" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Konfigurácia OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Prepísať súbory z iného balíka(kov)" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Názov balíka" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Názov balíka alebo URL adresa…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Predošlá strana" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Naozaj sa snažíte nainštalovať %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Odstrániť" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Odstrániť balík %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Odstrániť…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -"Vyžaduje sa veľkosť cca %.1024mB pre inštaláciu balíčka(kov) %d package(s)." +"Vyžaduje sa veľkosť cca %1024mB pre inštaláciu balíčka(kov) %d package(s)." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Požaduje sa verzia %h %h, nainštalovaná je %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "Požadovaný balík závislostí %h nie je k dispozícii v žiadnom " "úložisku." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Požaduje sa aktualizácia na %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Obnoviť" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Uložiť" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Ukladajú sa konfiguračné údaje …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Veľkosť" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Veľkosť (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Softvér" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Navrhované preklady" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "Navrhované preklady vyžadujú približne %1024mB ďalšieho priestoru." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "Príkaz opkg %h zlyhal s kódom %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -274,11 +313,11 @@ msgstr "" "Nainštalovaná verzia balíka %h nie je kompatibilná, požaduje sa %s, " "zatiaľ čo nainštalovaná je %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "Balík %h nie je dostupný v žiadnom nakonfigurovanom úložisku." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -286,66 +325,81 @@ msgstr "" "Verzia archívu balíka %h nie je kompatibilná, požaduje sa %s, ale " "je k dispozícii je iba %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Reťazec na filtrovanie…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Nedá sa vykonať príkaz opkg %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Nedá sa prečítať %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Nedá sa uložiť %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Aktualizovať zoznamy…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Aktualizácie" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Inovovať…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Odovzdať balík…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Verzia" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Verzia je nekompatibilná" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Čaká sa na dokončenie príkazu opkg %h…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "všetko" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "filtrované" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "žiadne" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "neznámy" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB komprimované" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB komprimované" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB nainštalovaných" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB nainštalovaných" diff --git a/package/luci/applications/luci-app-opkg/po/sv/opkg.po b/package/luci/applications/luci-app-opkg/po/sv/opkg.po index 7508f2b9cb..0088760f8e 100644 --- a/package/luci/applications/luci-app-opkg/po/sv/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/sv/opkg.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-09-22 00:01+0000\n" "Last-Translator: Kristoffer Grundström \n" -"Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" @@ -12,19 +12,23 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.9-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Åtgärder" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Ta automatiskt bort oanvända beroenden" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Tillgänglig" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -36,61 +40,75 @@ msgstr "" "conf för anpassade filförrådsposter. Konfigurationen i de andra filerna " "kan vara ändrade, men är oftast inte reserverad av sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Avbryt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Rensa" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Ställ in opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Beroenden" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Beskrivning" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Detaljer för paketet %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Avfärda" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Visar %d-%d av %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Ladda ner och installera paket" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Felen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Kör pakethanteraren" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filtrera" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Fritt utrymme" @@ -98,20 +116,28 @@ msgstr "Fritt utrymme" msgid "Grant access to opkg management" msgstr "Tillåt åtkomst till hantering av opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Installera" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Installerad" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -119,151 +145,157 @@ msgstr "" "Att installera paket från o-pålitliga källor är en potentiell säkerhetsrisk! " "Vill du verkligen försöka installera %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Installera…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Laddar konfigurationssidan…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Laddar paketinformationen…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Installera paket manuellt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Behöver uppgradering" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Nästa sida" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Ingen information tillgänglig" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Inga paket" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Inga paket matchar \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Ej tillgängligt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Inte installerad" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Konfiguration av OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Skriv över filer från andra paket(en)" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Paketnamn" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Paketnamn eller URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Föregående sida" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Vill du verkligen utföra installationen av %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Ta bort" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Ta bort paketet %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Ta bort…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Kräver ungefär %.1024mB utrymme för att %d paket(en) ska installeras." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Kräver ungefär %1024mB utrymme för att %d paket(en) ska installeras." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Kräv version %h %h, installerade %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "Paketet som behövs %h är inte tillgängligt i något filförråd." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Kräver uppdatering till %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Återställ" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Spara" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Sparar konfigurationsdata…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Storlek" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Storlek (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Mjukvara" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "opkg %h-kommandot misslyckades med koden %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -271,12 +303,12 @@ msgstr "" "Den installerade versionen av paketet %här inte kompatibel, kräver " "%s medans %s är installerat." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" "Paketet %h är inte tillgängligt i något konfigurerat filförråd." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -284,66 +316,81 @@ msgstr "" "Filförrådets version av paketet %h är inte tillgängligt, kräver %s, " "men endast %s är tillgänglig." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Skriv för att filtrera…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Kunde inte köra opkg %-kommandot: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Kunde inte läsa %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Kunde inte spara %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Uppdatera listor…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Uppdateringar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Uppgradera…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Ladda upp paket…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Version" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Versionen passar inte" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Väntar på att opkg %h-kommandot ska slutföras…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "okänd" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB komprimerat" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB komprimerat" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB installerat" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB installerat" diff --git a/package/luci/applications/luci-app-opkg/po/templates/opkg.pot b/package/luci/applications/luci-app-opkg/po/templates/opkg.pot index 8e40470354..f143bf9116 100644 --- a/package/luci/applications/luci-app-opkg/po/templates/opkg.pot +++ b/package/luci/applications/luci-app-opkg/po/templates/opkg.pot @@ -1,19 +1,23 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -21,61 +25,75 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "" @@ -83,245 +101,274 @@ msgstr "" msgid "Grant access to opkg management" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" msgstr "" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/tr/opkg.po b/package/luci/applications/luci-app-opkg/po/tr/opkg.po index 23ff4dc496..8d520e07d4 100644 --- a/package/luci/applications/luci-app-opkg/po/tr/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/tr/opkg.po @@ -4,7 +4,7 @@ msgstr "" "POT-Creation-Date: \n" "PO-Revision-Date: 2022-09-25 14:22+0000\n" "Last-Translator: semih \n" -"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" @@ -13,19 +13,23 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.14.1\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Eylemler" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Çakışan paket dosyalarının üzerine yazılmasına izin ver" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Kullanılmayan bağımlılıkları otomatik olarak kaldır" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Kullanılabilir" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -38,61 +42,77 @@ msgstr "" "dosyalardaki yapılandırmalar değiştirilebilir ancak genellikle " "sysupgrade tarafından korunmaz." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "İptal" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Temizle" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "opkg'yi yapılandır…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Bağımlılıklar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Açıklama" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Paket detayları %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Kapat" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "LuCI çeviri paketlerini görüntüle" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Mevcut tüm çeviri paketlerini göster" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Yalnızca önceden kurulmuş diller için temel çeviri paketlerini ve çeviri " +"paketlerini görüntüle" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Görüntülenen %d-%d toplam %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Paket indir ve yükle" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Hatalar" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Paket yöneticisi çalıştırılıyor" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Filtre" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Boş alan" @@ -100,20 +120,28 @@ msgstr "Boş alan" msgid "Grant access to opkg management" msgstr "Opkg yönetimine erişim izni verin" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Tüm çeviri paketlerini gizle" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Yükle" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Önerilen çeviri paketlerini de yükle" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Yüklenenler" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -121,152 +149,158 @@ msgstr "" "Güvenilmeyen kaynaklardan paket yüklemek, güvenlik riski oluşturabilir! Bu " "paketi yüklemeyi gerçekten denemek istiyor musunuz % h ?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Yükle…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Yapılandırma verisi yükleniyor…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Paket bilgisi yükleniyor…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Elle paket yükle" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Yükseltme gerekli" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Sonraki sayfa" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Bilgi bulunmamaktadır" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Paket(ler) yok" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Eşleşen paket yok \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Mevcut değil" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Yüklenmedi" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "Tamam" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "OPKG Yapılandırması" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Diğer paket(ler)in dosyalarının üzerine yaz" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Paket adı" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Paket adı veya URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Önceki sayfa" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Gerçekten yüklemeyi denemek istiyor musunuz %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Kaldır" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Paketi kaldır %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Kaldır…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." msgstr "" -"%d paket(ler)ini yüklemek için yaklaşık %.1024mB boyutunda alan gerekli." +"%d paket(ler)ini yüklemek için yaklaşık %1024mB boyutunda alan gerekli." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Gereken sürüm %h %h, yüklü olan %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "Gerekli olan bağımlılık paketi %h hiçbir depoda mevcut değil." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Şu sürüme güncellenmesi gerekiyor %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Sıfırla" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Kaydet" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Yapılandırma verisi kaydediliyor…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Boyut" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Boyut (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Yazılım" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Önerilen çeviriler" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "Önerilen çeviriler yaklaşık %1024mB ek alan gerektiriyor." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "opkg %h komutu %d koduyla başarısız oldu." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -274,11 +308,11 @@ msgstr "" "Yüklü olan %h paketinin sürümü uyumlu değil. Gerekli olan %s iken, " "%s sürümü yüklü." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "%h paketi yapılandırılmış depoların hiçbirinde mevcut değil." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -286,66 +320,81 @@ msgstr "" "%h paketinin depo bulunan sürümü uyumlu değil. Gerekli olan %s iken " "sadece %s sürümü mevcut." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Filtrelemek için yazın…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "opkg %s komutu çalıştırılamıyor: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Okunamıyor %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Kaydedilemiyor %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Listeyi güncelle…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Güncellemeler" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Yükselt…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Paket Yükle…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Sürüm" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Sürüm uyumsuz" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "opkg %h komutunun tamamlanması bekleniyor…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "tüm" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "filtrelenmiş" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "hiçbiri" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "bilinmeyen" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB sıkıştırıldı" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB sıkıştırıldı" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB yüklendi" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB yüklendi" diff --git a/package/luci/applications/luci-app-opkg/po/uk/opkg.po b/package/luci/applications/luci-app-opkg/po/uk/opkg.po index aa7e935d55..cd5233ee0c 100644 --- a/package/luci/applications/luci-app-opkg/po/uk/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/uk/opkg.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2022-02-13 10:08+0000\n" -"Last-Translator: Vova Buran \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -11,21 +11,25 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "Дії" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Дозволити перезапис файлів пакунків, які конфліктують" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "Автоматичне видалення невикористовуваних залежностей" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Доступно" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -38,61 +42,77 @@ msgstr "" "інших файлах може бути змінено, але вона зазвичай не зберігається при " "оновленні системи." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "Скасувати" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "Очистити" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "Налаштування opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "Залежності" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Опис" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "Подробиці про пакет %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "Закрити" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Відображати пакети перекладу LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Відображати всі доступні пакети перекладу" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" +"Відображати тільки базові пакети перекладів та пакети перекладів для вже " +"встановлених мов" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "Відображається %d-%d із %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Завантажити та інсталювати пакети" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Помилки" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "Виконання менеджера пакетів" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "Фільтр" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "Вільне місце" @@ -100,20 +120,28 @@ msgstr "Вільне місце" msgid "Grant access to opkg management" msgstr "Надати доступ до керування opkg" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Приховати всі пакети перекладів" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "Інсталювати" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Встановлювати запропоновані пакети перекладу також" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "Інстальовано" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" @@ -121,153 +149,160 @@ msgstr "" "Інсталяція пакетів з ненадійних джерел є потенційною загрозою безпеці! " "Дійсно спробувати інсталювати %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "Інсталювати…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "Завантаження даних конфігурації…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "Завантаження інформації про пакети…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "Інсталяція пакета вручну" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "Потребує оновлення" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "Наступна сторінка" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "Інформація відсутня" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "Немає пакетів" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "Немає пакетів, що відповідають \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "Недоступно" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "Не інстальовано" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Конфігурація OPKG" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "Перезаписати файли з інших пакетів" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Назва пакунку" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "Назва пакунка чи URL-адреса…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "Попередня сторінка" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "Дійсно спробувати інсталювати %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "Видалити" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "Видалити пакет %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Видалити…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "Потрібно приблизно %.1024mB для інсталяції %d пакетів." +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Потрібно приблизно %1024mB для інсталяції %d пакетів." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "Потрібна версія %h %h, інстальовано %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" "Необхідний за залежністю пакет %h не доступний ні в одному " "репозиторії." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "Потрібно оновити до %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "Скинути" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Зберегти" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "Збереження даних конфігурації…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "Розмір" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "Розмір (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Програмне забезпечення" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Пропоновані переклади" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" +"Запропоновані переклади потребують приблизно %1024мБ додаткового місця." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "Помилка виконання команди opkg %h з кодом %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." @@ -275,12 +310,12 @@ msgstr "" "Інстальована версія пакета %h несумісна, потрібно %s, а " "інстальовано %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" "Пакет %h не доступний ні в одному сконфігурованому репозиторії." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." @@ -288,66 +323,81 @@ msgstr "" "Версія пакету %h у репозиторії несумісна, потрібно %s, але доступна " "лише %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "Введіть текст для фільтра…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "Не вдалося виконати команду opkg %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "Не вдалося прочитати %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "Не вдалося зберегти %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "Оновити списки…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "Оновлення" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "Оновлення…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "Відвантажити пакет…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Версія" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "Несумісна версія" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "Очікуємо завершення виконання команди opkg %h …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "усі" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "фільтрувати" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "ні" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "невідомо" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB стиснуто" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB стиснуто" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB інстальовано" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB інстальовано" diff --git a/package/luci/applications/luci-app-opkg/po/ur/opkg.po b/package/luci/applications/luci-app-opkg/po/ur/opkg.po new file mode 100644 index 0000000000..62841929a1 --- /dev/null +++ b/package/luci/applications/luci-app-opkg/po/ur/opkg.po @@ -0,0 +1,394 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-07-24 14:21+0000\n" +"Last-Translator: Usama Khursheed \n" +"Language-Team: Urdu \n" +"Language: ur\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14-dev\n" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 +msgid "Actions" +msgstr "اعمال" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 +msgid "Automatically remove unused dependencies" +msgstr "غیر استعمال شدہ انحصار کو خود بخود ہٹا دیں" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 +msgid "Available" +msgstr "موجود" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 +msgid "" +"Below is a listing of the various configuration files used by opkg. " +"Use opkg.conf for global settings and customfeeds.conf for " +"custom repository entries. The configuration in the other files may be " +"changed but is usually not preserved by sysupgrade." +msgstr "" +"ذیل میں opkg کے ذریعے استعمال ہونے والی مختلف کنفیگریشن فائلوں کی " +"فہرست ہے۔ عالمی ترتیبات کے لیے opkg.conf اور حسب ضرورت ریپوزٹری " +"اندراجات کے لیے customfeeds.conf استعمال کریں۔ دوسری فائلوں میں " +"کنفیگریشن کو تبدیل کیا جا سکتا ہے لیکن عام طور پر sysupgrade کے " +"ذریعے محفوظ نہیں کیا جاتا ہے۔" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +msgid "Cancel" +msgstr "کینسل" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 +msgid "Clear" +msgstr "کلیر" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 +msgid "Configure opkg…" +msgstr "opkg کو ترتیب دیں…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 +msgid "Dependencies" +msgstr "انحصار" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 +msgid "Description" +msgstr "تفصیل" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +msgid "Details for package %h" +msgstr "پیکیج %h کی تفصیلات" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 +msgid "Dismiss" +msgstr "مسترد کریں" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 +msgid "Displaying %d-%d of %d" +msgstr "%d میں سے %d-%d ڈسپلے ہو رہا ہے" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 +msgid "Download and install package" +msgstr "پیکیج ڈاؤن لوڈ اور انسٹال کریں" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 +msgid "Errors" +msgstr "غلطیاں" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 +msgid "Executing package manager" +msgstr "پیکج مینیجر پر عمل درآمد ہو رہا" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 +msgid "Filter" +msgstr "فلٹر" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 +msgid "Free space" +msgstr "خالی جگہ" + +#: applications/luci-app-opkg/root/usr/share/rpcd/acl.d/luci-app-opkg.json:3 +msgid "Grant access to opkg management" +msgstr "opkg مینجمنٹ تک رسائی فراہم کریں" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 +msgid "Install" +msgstr "انسٹال کریں" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 +msgid "Installed" +msgstr "نصب خدمات" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 +msgid "" +"Installing packages from untrusted sources is a potential security risk! " +"Really attempt to install %h?" +msgstr "" +"غیر بھروسہ مند ذرائع سے پیکجز انسٹال کرنا ایک ممکنہ سیکورٹی رسک ہے! واقعی " +"انسٹال کرنے کی کوشش کریں %h؟" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 +msgid "Install…" +msgstr "انسٹال کریں…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 +msgid "Loading configuration data…" +msgstr "کنفیگریشن ڈیٹا لوڈ ہو رہا ہے…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 +msgid "Loading package information…" +msgstr "پیکیج کی معلومات لوڈ ہو رہی ہے…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 +#, fuzzy +msgid "MD5" +msgstr "MD5" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 +msgid "Manually install package" +msgstr "دستی طور پر پیکیج انسٹال کریں" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +msgid "Needs upgrade" +msgstr "اپ گریڈ کی ضرورت ہے" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 +msgid "Next page" +msgstr "اگلا صفحہ" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 +msgid "No information available" +msgstr "کوئی معلومات دستیاب نہیں" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 +msgid "No packages" +msgstr "کوئی پیکجز نہیں" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 +msgid "No packages matching \"%h\"." +msgstr "\"%h\" سے مماثل کوئی پیکیج نہیں ہے۔" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 +msgid "Not available" +msgstr "دستیاب نہیں ہے" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 +msgid "Not installed" +msgstr "انسٹال نہیں ہے" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 +msgid "OK" +msgstr "ٹھیک ہے" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 +msgid "OPKG Configuration" +msgstr "OPKG کنفیگریشن" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 +msgid "Package name" +msgstr "پیکیج کا نام" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 +msgid "Package name or URL…" +msgstr "پیکیج کا نام یا URL…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 +msgid "Previous page" +msgstr "پچھلا صفحہ" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 +msgid "Really attempt to install %h?" +msgstr "واقعی انسٹال کرنے کی کوشش کریں %h؟" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 +msgid "Remove" +msgstr "ہٹا دیا" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 +msgid "Remove package %h" +msgstr "پیکیج %h کو ہٹا دیں" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 +msgid "Remove…" +msgstr "الگ کرنا…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "لگ بھگ کی ضرورت ہے۔ انسٹال کرنے کے لیے %d پیکجز کے لیے %1024mB سائز۔" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 +msgid "Require version %h %h, installed %h" +msgstr "ورژن %h %h، انسٹال کردہ %h کی ضرورت ہے" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 +msgid "" +"Required dependency package %h is not available in any repository." +msgstr "مطلوبہ انحصار پیکج %h کسی بھی ذخیرہ میں دستیاب نہیں ہے" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +msgid "Requires update to %h %h" +msgstr "%h %h تک اپ ڈیٹ کی ضرورت ہے" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 +msgid "Reset" +msgstr "دوبارہ ترتیب دیں" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#, fuzzy +msgid "SHA256" +msgstr "SHA256" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 +msgid "Save" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 +msgid "Saving configuration data…" +msgstr "کنفیگریشن ڈیٹا محفوظ ہو رہا ہے…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +msgid "Size" +msgstr "سائز" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 +msgid "Size (.ipk)" +msgstr "سائز(.ipk)" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 +#: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 +msgid "Software" +msgstr "سافٹ ویئر" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 +msgid "The opkg %h command failed with code %d." +msgstr "opkg %h کمانڈ %d کوڈ کے ساتھ ناکام ہوگئی۔" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +msgid "" +"The installed version of package %h is not compatible, require %s " +"while %s is installed." +msgstr "opkg %h کمانڈ %d کوڈ کے ساتھ ناکام ہوگئی" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 +msgid "The package %h is not available in any configured repository." +msgstr "پیکیج %h کسی بھی ترتیب شدہ ذخیرہ میں دستیاب نہیں ہے" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 +msgid "" +"The repository version of package %h is not compatible, require %s " +"but only %s is available." +msgstr "" +"پیکیج %h کا ذخیرہ ورژن مطابقت نہیں رکھتا، %s کی ضرورت ہے لیکن صرف " +"%s دستیاب ہے۔" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 +msgid "Type to filter…" +msgstr "فلٹر کرنے کے لیے ٹائپ کریں…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +msgid "Unable to execute opkg %s command: %s" +msgstr "opkg %s کمانڈ پر عمل کرنے سے قاصر: %s" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 +msgid "Unable to read %s: %s" +msgstr "پڑھنے سے قاصر%s: s%" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 +msgid "Unable to save %s: %s" +msgstr "%s پڑھنے سے قاصر: %s" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 +msgid "Update lists…" +msgstr "فہرستوں کو اپ ڈیٹ کریں…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 +msgid "Updates" +msgstr "تازہ ترین" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 +msgid "Upgrade…" +msgstr "اپ گریڈ…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 +msgid "Upload Package…" +msgstr "پیکج اپ لوڈ کریں…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 +msgid "Version" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 +msgid "Version incompatible" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 +msgid "Waiting for the opkg %h command to complete…" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 +msgid "unknown" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "" diff --git a/package/luci/applications/luci-app-opkg/po/vi/opkg.po b/package/luci/applications/luci-app-opkg/po/vi/opkg.po index c7dd187b10..f995277610 100644 --- a/package/luci/applications/luci-app-opkg/po/vi/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/vi/opkg.po @@ -3,349 +3,399 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-08-16 06:59+0200\n" -"PO-Revision-Date: 2020-01-14 15:22+0000\n" -"Last-Translator: Franco Castillo \n" -"Language-Team: Vietnamese \n" +"Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.11-dev\n" +"X-Generator: Weblate 4.18.1\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" -msgstr "Hành động" +msgstr "hành động" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "Cho phép ghi đè các tệp gói xung đột" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" -msgstr "" +msgstr "Tự động gỡ bỏ các gói phụ thuộc không được sử dụng" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "Sẵn có" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " "custom repository entries. The configuration in the other files may be " "changed but is usually not preserved by sysupgrade." msgstr "" +"Dưới đây là danh sách các tập tin cấu hình khác nhau được sử dung bởi " +"opkg. Sử dụng opkg.conf cho cài đặt chính và " +"customfeeds.conf cho các mục repository tùy chỉnh. Cấu hình trong " +"các tập tin khác có thể thay đổi nhưng thường không được giữ lại thay đổi " +"bởi sysupgrade." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" -msgstr "Hủy bỏ" +msgstr "Hủy lệnh" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" -msgstr "" +msgstr "Xóa" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" -msgstr "Cấu hình" +msgstr "Cấu hình opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" -msgstr "" +msgstr "Các gói phụ thuộc" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "Mô tả" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" -msgstr "" +msgstr "Chi tiết cho gói %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" +msgstr "Bỏ qua" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "Hiển thị các gói dịch LuCI" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "Hiển thị tất cả các gói dịch có sẵn" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" msgstr "" +"Chỉ hiển thị các gói dịch cơ sở và gói dịch cho các ngôn ngữ đã được cài đặt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" -msgstr "" +msgstr "Hiển thị %d-%d của %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "Tải và cài đặt gói" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "Lỗi" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" -msgstr "" +msgstr "Đang thực thi quản lý gói" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" -msgstr "Lọc" +msgstr "Bộ lọc" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" -msgstr "" +msgstr "Dung lượng trống" #: applications/luci-app-opkg/root/usr/share/rpcd/acl.d/luci-app-opkg.json:3 msgid "Grant access to opkg management" -msgstr "" +msgstr "Cấp quyền truy cập vào quản lý opkg" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "Ẩn tất cả các gói dịch" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" -msgstr "Cài đặt " +msgstr "Cài đặt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "Cài đặt cả các gói dịch được đề xuất" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" -msgstr "Cài đặt " +msgstr "Đã cài đặt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "" +"Cài đặt các gói từ các nguồn không được tin tưởng là một rủi ro bảo mật tiềm " +"tàng! Chắc chắn muốn cài đặt %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" -msgstr "Cài đặt " +msgstr "Cài đặt…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" -msgstr "Đi tới trang cấu hình thích hợp" +msgstr "Tải dữ liệu cấu hình…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" -msgstr "" +msgstr "Tải thông tin gói…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" -msgstr "Tải và cài đặt gói" +msgstr "Cài đặt gói thủ công" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" -msgstr "" +msgstr "Cần nâng cấp" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" -msgstr "" +msgstr "Trang kế" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" -msgstr "" +msgstr "Không có thông tin có sẵn" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" -msgstr "Tìm gói" +msgstr "Không có các gói" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." -msgstr "" +msgstr "Không có gói khớp với \"%h\"." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" -msgstr "(%s available)" +msgstr "Không có sẵn" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" -msgstr "Cài đặt " +msgstr "Không được càu đặt" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" -msgstr "OK " +msgstr "OK" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "Cấu hình OPKG-" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "Tên gói" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 -#, fuzzy +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" -msgstr "Tên gói" +msgstr "Tên gói hoặc URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" -msgstr "" +msgstr "Trang trước" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" -msgstr "" +msgstr "Thực sự muốn cài %h?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" -msgstr "Loại bỏ" +msgstr "Xóa" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" -msgstr "" +msgstr "Gỡ bỏ gói %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "Loại bỏ…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "Yêu cầu khoảng Kích thước %1024mB cho %d gói cài đặt." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" -msgstr "" +msgstr "Yêu cầu phiên bản %h %h, đã cài %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "" +"Yêu cầu gói phụ thuộc %h không có sẵn trong bất kỳ repository nào." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" -msgstr "" +msgstr "Yêu cầu cập nhật cho %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" -msgstr "Reset" +msgstr "Khởi động lại" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" -msgstr "" +msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "Lưu" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" -msgstr "" +msgstr "Đang lưu dữ liệu cấu hình…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" -msgstr "Dung lượng " +msgstr "Dung lượng" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" -msgstr "" +msgstr "Kích cỡ (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "Phần mềm" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "Bản dịch được đề xuất" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "Các bản dịch được đề xuất yêu cầu khoảng. %1024mB dung lượng bổ sung." + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." -msgstr "" +msgstr "Câu lệnh opkg %h thất bại với mã lỗi %d." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "" +"Phiên bản được cài đặt của gói %h không tương thích, yêu cầu %s " +"trong khi %s được cài đặt." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "" +"Gói %h không có sẵn trong bật kỳ repository đã được cấu hình nào." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "" +"Phiên bản trên repository của gói %h không có sẵn, yêu cầu %s nhưng " +"chỉ có %s." -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" -msgstr "" +msgstr "Gõ để lọc…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" -msgstr "" +msgstr "Không thể thực thi câu lệnh opkg %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" -msgstr "" +msgstr "Không thể đọc %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" -msgstr "" +msgstr "Không thể lưu %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" -msgstr "" +msgstr "Cập nhật dan sách…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" -msgstr "" +msgstr "Các cập nhật" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" -msgstr "" +msgstr "Nâng cấp…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" -msgstr "" +msgstr "Tải lên gói…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "Phiên bản" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" -msgstr "" +msgstr "Phiên bản không tương thích" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" -msgstr "" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +msgstr "Đợi câu lệnh opkg %h hoàn thành…" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "Tất cả" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "Đã lọc" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "Không" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" -msgstr "" +msgstr "Không xác định" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB được nén" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB đã cài đặt" diff --git a/package/luci/applications/luci-app-opkg/po/zh_Hans/opkg.po b/package/luci/applications/luci-app-opkg/po/zh_Hans/opkg.po index 720a6bc133..ab7358f6c3 100644 --- a/package/luci/applications/luci-app-opkg/po/zh_Hans/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/zh_Hans/opkg.po @@ -5,30 +5,34 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2022-08-03 00:21+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2023-09-10 09:27+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" +"librecmc/luciapplicationsopkg/zh_Hans/>\n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "操作" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "允许覆盖冲突的包文件" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "自动移除未使用的依赖" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "可用" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -39,61 +43,75 @@ msgstr "" "置,customfeeds.conf 用于自定义仓库。其他配置文件的变更在系统升" "级时默认不被保留。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "取消" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "清除" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "配置 opkg…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "依赖" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "描述" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "软件包 %h 详情" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "关闭" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "显示 LuCI 翻译包" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "显示所有可用的翻译包" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "仅显示基础翻译包和已安装语言的翻译包" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "正在显示 %d-%d,共 %d" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "下载并安装软件包" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "错误" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "正在执行软件包管理器" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" -msgstr "筛选器" +msgstr "过滤器" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "空闲空间" @@ -101,245 +119,274 @@ msgstr "空闲空间" msgid "Grant access to opkg management" msgstr "授予访问 opkg 管理的权限" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "隐藏所有翻译包" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "安装" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "同样安装推荐的翻译包" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "已安装" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "从未信任的源安装软件包有潜在的安全隐患!您确定要安装 %h 吗?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "安装…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "载入配置数据…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "载入软件包信息…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "手动安装软件包" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "需要升级" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "下一页" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "无可用信息" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "没有软件包" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "没有匹配“%h”的软件包。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "不可用" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "未安装" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "确认" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "OPKG 配置" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "覆盖其他软件包中的文件" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "软件包名称" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "软件包名称或 URL…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "上一页" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "确定要安装 %h 吗?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "移除" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "移除软件包 %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "移除…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "需要大约 %.1024mB 空间来安装 %d 个软件包。" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "需要大约 %1024mB 空间来安装 %d 个软件包。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "需要 %h %h 版本,已安装 %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "依赖的软件包 %h 在所有仓库都未提供。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "需要更新到 %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "复位" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "保存" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "正在保存配置数据…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "大小" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "大小(.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "软件包" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "推荐的翻译" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "推荐的翻译需要约 %1024mB 额外空间。" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "opkg %h 命令失败,代码 %d。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "已安装的软件包 %h 版本不兼容,需要 %s 而 %s 已安装。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "软件包 %h 在所有已配置的仓库中都不存在。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "软件包 %h 在仓库中的版本不兼容,需要 %s 但仅可提供 %s。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "输入以筛选…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "无法执行 opkg %s 命令:%s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "无法读取 %s:%s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "无法保存 %s:%s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "更新列表…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "更新" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "升级…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "上传软件包…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "版本" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "版本不兼容" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "等待命令 opkg %h 执行完成…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "全部" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "已过滤" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "无" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "未知" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB 已压缩" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB 已压缩" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB 已安装" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB 已安装" diff --git a/package/luci/applications/luci-app-opkg/po/zh_Hant/opkg.po b/package/luci/applications/luci-app-opkg/po/zh_Hant/opkg.po index 882b1c42e2..f1bbbeed7b 100644 --- a/package/luci/applications/luci-app-opkg/po/zh_Hant/opkg.po +++ b/package/luci/applications/luci-app-opkg/po/zh_Hant/opkg.po @@ -4,7 +4,7 @@ msgstr "" "PO-Revision-Date: 2022-08-06 13:14+0000\n" "Last-Translator: 王攀 <41330784@qq.com>\n" "Language-Team: Chinese (Traditional) \n" +"librecmc/luciapplicationsopkg/zh_Hant/>\n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -12,19 +12,23 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.14-dev\n" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1154 msgid "Actions" msgstr "動作" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:850 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:791 +msgid "Allow overwriting conflicting package files" +msgstr "允許覆蓋衝突的包檔" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:952 msgid "Automatically remove unused dependencies" msgstr "自動移除不再使用的依賴項目" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1054 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1209 msgid "Available" msgstr "可用的" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:775 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:877 msgid "" "Below is a listing of the various configuration files used by opkg. " "Use opkg.conf for global settings and customfeeds.conf for " @@ -35,61 +39,75 @@ msgstr "" "customfeeds.conf 則用於自訂儲存庫項目。其他組態檔的變更可能在 系" "統升級 時不會被保留。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:697 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:790 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:949 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:799 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:845 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:892 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:958 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 msgid "Cancel" msgstr "取消" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1141 msgid "Clear" msgstr "清除" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1048 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1158 msgid "Configure opkg…" msgstr "設定 opkg …" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:669 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:743 msgid "Dependencies" msgstr "依賴項目" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:675 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:835 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1072 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:749 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:937 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1227 msgid "Description" msgstr "描述" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:680 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 msgid "Details for package %h" msgstr "套件 %h 的詳細資訊" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:923 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1029 msgid "Dismiss" msgstr "關閉" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:332 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1163 +msgid "Display LuCI translation packages" +msgstr "顯示 LuCI 翻譯包" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1180 +msgid "Display all available translation packages" +msgstr "顯示所有可用的翻譯包" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1166 +msgid "" +"Display base translation packages and translation packages for already " +"installed languages only" +msgstr "僅顯示已安裝語言的基本翻譯包和翻譯包" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:353 msgid "Displaying %d-%d of %d" msgstr "正在顯示第 %d 到 %d 筆,共 %d 筆" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1036 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1146 msgid "Download and install package" msgstr "下載並安裝套件包" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:901 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1007 msgid "Errors" msgstr "錯誤" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:878 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:981 msgid "Executing package manager" msgstr "正在執行套件包管理員" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1028 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1138 msgid "Filter" msgstr "過濾" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1023 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1133 msgid "Free space" msgstr "剩餘空間" @@ -97,245 +115,274 @@ msgstr "剩餘空間" msgid "Grant access to opkg management" msgstr "授予存取 opkg 管理的權限" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:705 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:721 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:959 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1193 +msgid "Hide all translation packages" +msgstr "隱藏所有翻譯包" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:823 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1065 msgid "Install" msgstr "安裝" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:283 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:494 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1055 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:779 +msgid "Install suggested translation packages as well" +msgstr "同時安裝建議的翻譯包" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:299 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:521 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1210 msgid "Installed" msgstr "已安裝" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:727 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:936 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1042 msgid "" "Installing packages from untrusted sources is a potential security risk! " "Really attempt to install %h?" msgstr "從不明來源安裝套件很危險! 確定要安裝 %h ?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:272 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:288 msgid "Install…" msgstr "安裝…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:754 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:856 msgid "Loading configuration data…" msgstr "載入組態資料中…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:977 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1083 msgid "Loading package information…" msgstr "載入套件資訊中…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:939 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1045 msgid "MD5" msgstr "MD5" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:737 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:935 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:839 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1041 msgid "Manually install package" msgstr "手動安裝套件包" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:482 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 msgid "Needs upgrade" msgstr "需要升級" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1063 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1218 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1236 msgid "Next page" msgstr "下一頁" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:345 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:367 msgid "No information available" msgstr "無可用資訊" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:333 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:354 msgid "No packages" msgstr "無套件包" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:349 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:371 msgid "No packages matching \"%h\"." msgstr "沒有與 \"%h\" 相符的軟體包。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:514 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:541 msgid "Not available" msgstr "無法使用" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:499 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:526 msgid "Not installed" msgstr "未安裝" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1039 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1149 msgid "OK" msgstr "確定" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:753 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:801 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:815 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:855 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:903 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:917 msgid "OPKG Configuration" msgstr "OPKG 設定" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:692 -msgid "Overwrite files from other package(s)" -msgstr "覆蓋其他套件包的檔案" - -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1069 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1224 msgid "Package name" msgstr "套件包名稱" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1038 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1148 msgid "Package name or URL…" msgstr "套件包名稱或網址…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1061 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1216 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1234 msgid "Previous page" msgstr "上一頁" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:734 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:836 msgid "Really attempt to install %h?" msgstr "確定安裝 %h ?" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:864 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:966 msgid "Remove" msgstr "移除" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:840 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:942 msgid "Remove package %h" msgstr "移除套件 %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:260 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:276 msgid "Remove…" msgstr "移除…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:665 -msgid "Require approx. %.1024mB size for %d package(s) to install." -msgstr "約需 %.1024mB 的空間來安裝 %d 個套件包。" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:736 +msgid "Require approx. %1024mB size for %d package(s) to install." +msgstr "約需 %1024mB 的空間來安裝 %d 個套件包。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:489 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:516 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:534 msgid "Require version %h %h, installed %h" msgstr "需要版本 %h %h,現已安裝 %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:539 msgid "" "Required dependency package %h is not available in any repository." msgstr "依賴的套件 %h 不存在於任何的儲存庫。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:480 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:507 msgid "Requires update to %h %h" msgstr "需要更新至 %h %h" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:350 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:372 msgid "Reset" msgstr "重置" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:940 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 msgid "SHA256" msgstr "SHA256" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:812 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:914 msgid "Save" msgstr "儲存" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:802 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:904 msgid "Saving configuration data…" msgstr "正在儲存設定值…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:683 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:843 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:938 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:757 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:945 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1044 msgid "Size" msgstr "容量" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1071 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1226 msgid "Size (.ipk)" msgstr "大小 (.ipk)" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1019 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1129 #: applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json:3 msgid "Software" msgstr "軟體" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:906 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:760 +msgid "Suggested translations" +msgstr "建議的翻譯" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:739 +msgid "Suggested translations require approx. %1024mB additional space." +msgstr "建議的翻譯需要大約 %1024mB 的額外空間。" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1012 msgid "The opkg %h command failed with code %d." msgstr "opkg%h 指令執行失敗,錯誤碼%d。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:485 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:512 msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." msgstr "已安裝的套件 %h 版本不相容,要求 %s 而 %s 已安裝。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:730 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:832 msgid "The package %h is not available in any configured repository." msgstr "套件 %h 在所有已設定的儲存庫中不可用。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:502 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:529 msgid "" "The repository version of package %h is not compatible, require %s " "but only %s is available." msgstr "套件包 %h 在儲存庫中的版本不相容,要求 %s 但僅有 %s 可用。" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1030 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1140 msgid "Type to filter…" msgstr "輸入以進行過濾…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:925 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1031 msgid "Unable to execute opkg %s command: %s" msgstr "無法執行 opkg %s 指令:%s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:768 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:870 msgid "Unable to read %s: %s" msgstr "無法讀取 %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:807 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:909 msgid "Unable to save %s: %s" msgstr "無法儲存 %s: %s" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1046 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1156 msgid "Update lists…" msgstr "更新清單…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1056 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1211 msgid "Updates" msgstr "可升級" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:249 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:278 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:265 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:294 msgid "Upgrade…" msgstr "升級…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1047 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1157 msgid "Upload Package…" msgstr "上傳套件包…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:682 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:842 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1070 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:756 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:944 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1225 msgid "Version" msgstr "版本" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:491 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:509 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:518 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:536 msgid "Version incompatible" msgstr "版本不相容" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:880 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:983 msgid "Waiting for the opkg %h command to complete…" msgstr "等待 opkg %h 指令完成…" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:643 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:831 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1024 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1189 +msgctxt "Display translation packages" +msgid "all" +msgstr "全部" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1176 +msgctxt "Display translation packages" +msgid "filtered" +msgstr "已過濾" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1202 +msgctxt "Display translation packages" +msgid "none" +msgstr "沒有" + +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:672 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:933 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:1134 msgid "unknown" msgstr "未知" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:641 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:829 -msgid "~%.1024mB compressed" -msgstr "~%.1024mB 已壓縮" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:670 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:931 +msgid "~%1024mB compressed" +msgstr "~%1024mB 已壓縮" -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:639 -#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:827 -msgid "~%.1024mB installed" -msgstr "~%.1024mB 已安裝" +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:668 +#: applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js:929 +msgid "~%1024mB installed" +msgstr "~%1024mB 已安裝" diff --git a/package/luci/applications/luci-app-p910nd/Makefile b/package/luci/applications/luci-app-p910nd/Makefile index 8c73f372f4..aa757ce7c6 100644 --- a/package/luci/applications/luci-app-p910nd/Makefile +++ b/package/luci/applications/luci-app-p910nd/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+luci-compat +p910nd include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/applications/luci-app-p910nd/po/ar/p910nd.po b/package/luci/applications/luci-app-p910nd/po/ar/p910nd.po index b3ca1606ab..b0fcc7bcde 100644 --- a/package/luci/applications/luci-app-p910nd/po/ar/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/ar/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:35+0200\n" "PO-Revision-Date: 2021-03-08 13:04+0000\n" "Last-Translator: Said Zakaria \n" -"Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/bg/p910nd.po b/package/luci/applications/luci-app-p910nd/po/bg/p910nd.po index a8399af2fd..a0176d6734 100644 --- a/package/luci/applications/luci-app-p910nd/po/bg/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/bg/p910nd.po @@ -3,20 +3,20 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-19 19:35+0200\n" -"PO-Revision-Date: 2021-09-15 08:34+0000\n" -"Last-Translator: Iskren Mihaylov \n" -"Language-Team: Bulgarian \n" +"Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.16.2-dev\n" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:47 msgid "Bidirectional mode" -msgstr "" +msgstr "Двупосочен режим" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:20 msgid "Device" diff --git a/package/luci/applications/luci-app-p910nd/po/bn_BD/p910nd.po b/package/luci/applications/luci-app-p910nd/po/bn_BD/p910nd.po index 36078e98f6..402335034d 100644 --- a/package/luci/applications/luci-app-p910nd/po/bn_BD/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/bn_BD/p910nd.po @@ -6,7 +6,7 @@ msgstr "" "PO-Revision-Date: 2021-10-08 17:53+0000\n" "Last-Translator: Rayhan Nabi \n" "Language-Team: Bengali (Bangladesh) \n" +"librecmc/luciapplicationsp910nd/bn_BD/>\n" "Language: bn_BD\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/package/luci/applications/luci-app-p910nd/po/ca/p910nd.po b/package/luci/applications/luci-app-p910nd/po/ca/p910nd.po index fd8a9be5be..bb9ad370f7 100644 --- a/package/luci/applications/luci-app-p910nd/po/ca/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/ca/p910nd.po @@ -7,7 +7,7 @@ msgstr "" "POT-Creation-Date: 2009-06-10 03:40+0200\n" "PO-Revision-Date: 2021-03-08 13:03+0000\n" "Last-Translator: BenRoura \n" -"Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/cs/p910nd.po b/package/luci/applications/luci-app-p910nd/po/cs/p910nd.po index 44b41bcca4..ffd56d7379 100644 --- a/package/luci/applications/luci-app-p910nd/po/cs/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/cs/p910nd.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-07-30 11:20+0000\n" -"Last-Translator: Jakub Brož \n" -"Language-Team: Czech \n" +"Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 5.1-dev\n" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:47 msgid "Bidirectional mode" @@ -30,7 +30,7 @@ msgstr "" #: applications/luci-app-p910nd/root/usr/share/rpcd/acl.d/luci-app-p910nd.json:3 msgid "Grant UCI access for luci-app-p910nd" -msgstr "" +msgstr "Udělit oprávnění k UCI pro luci-app-p910nd" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:22 msgid "Interface" @@ -54,7 +54,7 @@ msgstr "TCP port, na kterém očekávat spojení." #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:18 msgid "enable" -msgstr "Povolit" +msgstr "povolit" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:9 #: applications/luci-app-p910nd/root/usr/share/luci/menu.d/luci-app-p910nd.json:3 diff --git a/package/luci/applications/luci-app-p910nd/po/da/p910nd.po b/package/luci/applications/luci-app-p910nd/po/da/p910nd.po index b8405b8422..7e76305c0c 100644 --- a/package/luci/applications/luci-app-p910nd/po/da/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/da/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:35+0200\n" "PO-Revision-Date: 2021-11-16 17:38+0000\n" "Last-Translator: drax red \n" -"Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/de/p910nd.po b/package/luci/applications/luci-app-p910nd/po/de/p910nd.po index bbeb7ee591..03d8c77b68 100644 --- a/package/luci/applications/luci-app-p910nd/po/de/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/de/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-26 17:57+0200\n" "PO-Revision-Date: 2020-07-11 21:29+0000\n" "Last-Translator: ssantos \n" -"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/el/p910nd.po b/package/luci/applications/luci-app-p910nd/po/el/p910nd.po index 83f3cadf1f..3122bce134 100644 --- a/package/luci/applications/luci-app-p910nd/po/el/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/el/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-28 02:08+0200\n" "PO-Revision-Date: 2022-03-25 12:08+0000\n" "Last-Translator: MarioK239 \n" -"Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/en/p910nd.po b/package/luci/applications/luci-app-p910nd/po/en/p910nd.po index c0f1c1b784..d68a6272e9 100644 --- a/package/luci/applications/luci-app-p910nd/po/en/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/en/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:35+0200\n" "PO-Revision-Date: 2021-06-24 10:23+0000\n" "Last-Translator: Hannu Nyman \n" -"Language-Team: English \n" "Language: en\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/es/p910nd.po b/package/luci/applications/luci-app-p910nd/po/es/p910nd.po index f7226f3f67..5c7f4e6305 100644 --- a/package/luci/applications/luci-app-p910nd/po/es/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/es/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-06-10 03:41+0200\n" "PO-Revision-Date: 2021-02-11 14:23+0000\n" "Last-Translator: Franco Castillo \n" -"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/fi/p910nd.po b/package/luci/applications/luci-app-p910nd/po/fi/p910nd.po index 52cdbce71f..b626d7f6a7 100644 --- a/package/luci/applications/luci-app-p910nd/po/fi/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/fi/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:35+0200\n" "PO-Revision-Date: 2020-06-24 17:42+0000\n" "Last-Translator: Petri Asikainen \n" -"Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/fr/p910nd.po b/package/luci/applications/luci-app-p910nd/po/fr/p910nd.po index b3501c9ba6..7e8fa2854d 100644 --- a/package/luci/applications/luci-app-p910nd/po/fr/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/fr/p910nd.po @@ -3,20 +3,20 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-19 19:36+0200\n" -"PO-Revision-Date: 2021-11-21 18:56+0000\n" -"Last-Translator: Felix Braun \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.10-dev\n" +"X-Generator: Weblate 4.18.1\n" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:47 msgid "Bidirectional mode" -msgstr "Mode bi-directionnel" +msgstr "Mode bidirectionnel" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:20 msgid "Device" diff --git a/package/luci/applications/luci-app-p910nd/po/he/p910nd.po b/package/luci/applications/luci-app-p910nd/po/he/p910nd.po index 2932cd8cd6..a5d89fcbca 100644 --- a/package/luci/applications/luci-app-p910nd/po/he/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/he/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-01-15 22:31+0000\n" "Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/hu/p910nd.po b/package/luci/applications/luci-app-p910nd/po/hu/p910nd.po index 2280881f1a..34d5ac513d 100644 --- a/package/luci/applications/luci-app-p910nd/po/hu/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/hu/p910nd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-06-14 19:53+0000\n" "Last-Translator: Gergő Szalka \n" -"Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/it/p910nd.po b/package/luci/applications/luci-app-p910nd/po/it/p910nd.po index fe9df47aee..2d3552359d 100644 --- a/package/luci/applications/luci-app-p910nd/po/it/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/it/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:36+0200\n" "PO-Revision-Date: 2022-02-18 20:58+0000\n" "Last-Translator: pisquan8 \n" -"Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/ja/p910nd.po b/package/luci/applications/luci-app-p910nd/po/ja/p910nd.po index 79f792135a..026696f40f 100644 --- a/package/luci/applications/luci-app-p910nd/po/ja/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/ja/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:36+0200\n" "PO-Revision-Date: 2020-12-13 05:29+0000\n" "Last-Translator: Ryota <21ryotagamer@gmail.com>\n" -"Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/ko/p910nd.po b/package/luci/applications/luci-app-p910nd/po/ko/p910nd.po index 676943c3eb..a62e283e69 100644 --- a/package/luci/applications/luci-app-p910nd/po/ko/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/ko/p910nd.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-19 19:35+0200\n" -"PO-Revision-Date: 2021-06-07 10:49+0000\n" -"Last-Translator: Sunggu Choi \n" -"Language-Team: Korean \n" +"Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 5.1-dev\n" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:47 msgid "Bidirectional mode" @@ -20,7 +20,7 @@ msgstr "" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:20 msgid "Device" -msgstr "" +msgstr "장비" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:10 msgid "" diff --git a/package/luci/applications/luci-app-p910nd/po/lt/p910nd.po b/package/luci/applications/luci-app-p910nd/po/lt/p910nd.po new file mode 100644 index 0000000000..00f4a25bdc --- /dev/null +++ b/package/luci/applications/luci-app-p910nd/po/lt/p910nd.po @@ -0,0 +1,62 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-10-06 10:13+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:47 +msgid "Bidirectional mode" +msgstr "" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:20 +msgid "Device" +msgstr "Įrenginys" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:10 +msgid "" +"First you have to install the packages to get support for USB (kmod-usb-" +"printer) or parallel port (kmod-lp)." +msgstr "" + +#: applications/luci-app-p910nd/root/usr/share/rpcd/acl.d/luci-app-p910nd.json:3 +msgid "Grant UCI access for luci-app-p910nd" +msgstr "Suteikti „UCI“ prieigą prie „luci-app-p910nd“" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:22 +msgid "Interface" +msgstr "Sąsaja ir Sietuvas" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:41 +msgid "Port" +msgstr "Prievadas („Port'as“)" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:14 +msgid "Settings" +msgstr "Nustatymai" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:22 +msgid "Specifies the interface to listen on." +msgstr "" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:41 +msgid "TCP listener port." +msgstr "" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:18 +msgid "enable" +msgstr "Įjungti/Įgalinti" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:9 +#: applications/luci-app-p910nd/root/usr/share/luci/menu.d/luci-app-p910nd.json:3 +msgid "p910nd - Printer server" +msgstr "„p910nd“ – Spausdintuvo serveris" diff --git a/package/luci/applications/luci-app-p910nd/po/mr/p910nd.po b/package/luci/applications/luci-app-p910nd/po/mr/p910nd.po index e8044c4cfe..73b510b1ef 100644 --- a/package/luci/applications/luci-app-p910nd/po/mr/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/mr/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-19 19:35+0200\n" "PO-Revision-Date: 2020-01-29 10:50+0000\n" "Last-Translator: Prachi Joshi \n" -"Language-Team: Marathi \n" "Language: mr\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/nb_NO/p910nd.po b/package/luci/applications/luci-app-p910nd/po/nb_NO/p910nd.po index 4bb2355c62..6ce82eb595 100644 --- a/package/luci/applications/luci-app-p910nd/po/nb_NO/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/nb_NO/p910nd.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-12-13 05:29+0000\n" +"PO-Revision-Date: 2023-06-20 13:51+0000\n" "Last-Translator: Allan Nordhøy \n" -"Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.18.1\n" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:47 msgid "Bidirectional mode" @@ -28,7 +28,7 @@ msgstr "" #: applications/luci-app-p910nd/root/usr/share/rpcd/acl.d/luci-app-p910nd.json:3 msgid "Grant UCI access for luci-app-p910nd" -msgstr "" +msgstr "Innvilg UCI-tilgang for luci-app-p910nd" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:22 msgid "Interface" @@ -44,7 +44,7 @@ msgstr "Innstillinger" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:22 msgid "Specifies the interface to listen on." -msgstr "" +msgstr "Angir grensesnitt å lytte til." #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:41 msgid "TCP listener port." diff --git a/package/luci/applications/luci-app-p910nd/po/nl/p910nd.po b/package/luci/applications/luci-app-p910nd/po/nl/p910nd.po new file mode 100644 index 0000000000..9744648a10 --- /dev/null +++ b/package/luci/applications/luci-app-p910nd/po/nl/p910nd.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:35+0200\n" +"PO-Revision-Date: 2023-05-03 15:20+0000\n" +"Last-Translator: xtz1983 \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:47 +msgid "Bidirectional mode" +msgstr "Bidirectionele modus" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:20 +msgid "Device" +msgstr "Apparaat" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:10 +msgid "" +"First you have to install the packages to get support for USB (kmod-usb-" +"printer) or parallel port (kmod-lp)." +msgstr "" +"Eerst moet je de pakketten installeren om ondersteuning te krijgen voor USB " +"(kmod-usb-printer) of parallelle poort (kmod-lp)." + +#: applications/luci-app-p910nd/root/usr/share/rpcd/acl.d/luci-app-p910nd.json:3 +msgid "Grant UCI access for luci-app-p910nd" +msgstr "Verleen UCI toegang voor luci-app-p910nd" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:22 +msgid "Interface" +msgstr "Interface" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:41 +msgid "Port" +msgstr "Poort" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:14 +msgid "Settings" +msgstr "Instellingen" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:22 +msgid "Specifies the interface to listen on." +msgstr "Specifieeert de interface om te luisteren." + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:41 +msgid "TCP listener port." +msgstr "TCP luisterpoort." + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:18 +msgid "enable" +msgstr "inschakelen" + +#: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:9 +#: applications/luci-app-p910nd/root/usr/share/luci/menu.d/luci-app-p910nd.json:3 +msgid "p910nd - Printer server" +msgstr "p910nd - Printer server" diff --git a/package/luci/applications/luci-app-p910nd/po/pl/p910nd.po b/package/luci/applications/luci-app-p910nd/po/pl/p910nd.po index 0361c791e6..aaa955775e 100644 --- a/package/luci/applications/luci-app-p910nd/po/pl/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/pl/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2020-05-02 15:55+0000\n" "Last-Translator: Marcin Net \n" -"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/pt/p910nd.po b/package/luci/applications/luci-app-p910nd/po/pt/p910nd.po index 32da28b7ac..6fc65db83b 100644 --- a/package/luci/applications/luci-app-p910nd/po/pt/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/pt/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-05-26 19:03+0200\n" "PO-Revision-Date: 2022-03-16 09:23+0000\n" "Last-Translator: moonlightz \n" -"Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/pt_BR/p910nd.po b/package/luci/applications/luci-app-p910nd/po/pt_BR/p910nd.po index a49aaa7708..067e8bc827 100644 --- a/package/luci/applications/luci-app-p910nd/po/pt_BR/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/pt_BR/p910nd.po @@ -6,7 +6,7 @@ msgstr "" "PO-Revision-Date: 2020-05-02 10:21+0000\n" "Last-Translator: Wellington Terumi Uemura \n" "Language-Team: Portuguese (Brazil) \n" +"librecmc/luciapplicationsp910nd/pt_BR/>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/package/luci/applications/luci-app-p910nd/po/ro/p910nd.po b/package/luci/applications/luci-app-p910nd/po/ro/p910nd.po index cee2f0126a..2f6618839f 100644 --- a/package/luci/applications/luci-app-p910nd/po/ro/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/ro/p910nd.po @@ -5,7 +5,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-11-15 14:07+0000\n" "Last-Translator: Simona Iacob \n" -"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/ru/p910nd.po b/package/luci/applications/luci-app-p910nd/po/ru/p910nd.po index c7d41a6963..9826fd8bec 100644 --- a/package/luci/applications/luci-app-p910nd/po/ru/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/ru/p910nd.po @@ -4,7 +4,7 @@ msgstr "" "POT-Creation-Date: 2012-08-15 11:42+0300\n" "PO-Revision-Date: 2020-06-07 15:48+0000\n" "Last-Translator: Artem \n" -"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/sk/p910nd.po b/package/luci/applications/luci-app-p910nd/po/sk/p910nd.po index 5673ab7b4e..7d60b31e56 100644 --- a/package/luci/applications/luci-app-p910nd/po/sk/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/sk/p910nd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2022-10-30 16:50+0000\n" "Last-Translator: MaycoH \n" -"Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/sv/p910nd.po b/package/luci/applications/luci-app-p910nd/po/sv/p910nd.po index 49b117a84a..31dac09d7f 100644 --- a/package/luci/applications/luci-app-p910nd/po/sv/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/sv/p910nd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-11-07 15:53+0000\n" "Last-Translator: Kristoffer Grundström \n" -"Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/tr/p910nd.po b/package/luci/applications/luci-app-p910nd/po/tr/p910nd.po index 0243f4b702..1421fd7d31 100644 --- a/package/luci/applications/luci-app-p910nd/po/tr/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/tr/p910nd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-04-09 08:04+0000\n" "Last-Translator: Oğuz Ersen \n" -"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/uk/p910nd.po b/package/luci/applications/luci-app-p910nd/po/uk/p910nd.po index 68e74d6e1a..660549e6d4 100644 --- a/package/luci/applications/luci-app-p910nd/po/uk/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/uk/p910nd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2022-11-28 20:47+0000\n" "Last-Translator: Arkadii Yakovets \n" -"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-p910nd/po/vi/p910nd.po b/package/luci/applications/luci-app-p910nd/po/vi/p910nd.po index 5d691861aa..6e87497f25 100644 --- a/package/luci/applications/luci-app-p910nd/po/vi/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/vi/p910nd.po @@ -5,14 +5,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-08-16 06:58+0200\n" -"PO-Revision-Date: 2009-08-13 04:03+0200\n" -"Last-Translator: Hong Phuc Dang \n" -"Language-Team: LANGUAGE \n" -"Language: \n" +"PO-Revision-Date: 2023-06-20 05:55+0000\n" +"Last-Translator: Mashiro \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Pootle 1.1.0\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.18.1\n" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:47 msgid "Bidirectional mode" @@ -20,7 +22,7 @@ msgstr "Chế độ 2 chiều" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:20 msgid "Device" -msgstr "" +msgstr "Thiết bị" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:10 msgid "" @@ -32,33 +34,33 @@ msgstr "" #: applications/luci-app-p910nd/root/usr/share/rpcd/acl.d/luci-app-p910nd.json:3 msgid "Grant UCI access for luci-app-p910nd" -msgstr "" +msgstr "Cấp quyền truy cập UCI cho luci-app-p910nd" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:22 msgid "Interface" -msgstr "" +msgstr "Giao diện" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:41 msgid "Port" -msgstr "" +msgstr "Cổng" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:14 msgid "Settings" -msgstr "" +msgstr "Cài đặt" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:22 msgid "Specifies the interface to listen on." -msgstr "" +msgstr "Chỉ định giao thức để lắng nghe." #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:41 msgid "TCP listener port." -msgstr "" +msgstr "Cổng lắng nghe TCP." #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:18 msgid "enable" -msgstr "" +msgstr "bật" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:9 #: applications/luci-app-p910nd/root/usr/share/luci/menu.d/luci-app-p910nd.json:3 msgid "p910nd - Printer server" -msgstr "p910nd - Máy in chủ" +msgstr "p910nd - Máy chủ in" diff --git a/package/luci/applications/luci-app-p910nd/po/zh_Hans/p910nd.po b/package/luci/applications/luci-app-p910nd/po/zh_Hans/p910nd.po index 35af96a341..be12c134bf 100644 --- a/package/luci/applications/luci-app-p910nd/po/zh_Hans/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/zh_Hans/p910nd.po @@ -9,7 +9,7 @@ msgstr "" "PO-Revision-Date: 2020-11-17 12:29+0000\n" "Last-Translator: SunSpring \n" "Language-Team: Chinese (Simplified) \n" +"librecmc/luciapplicationsp910nd/zh_Hans/>\n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/package/luci/applications/luci-app-p910nd/po/zh_Hant/p910nd.po b/package/luci/applications/luci-app-p910nd/po/zh_Hant/p910nd.po index ea01e6668b..1c44e23083 100644 --- a/package/luci/applications/luci-app-p910nd/po/zh_Hant/p910nd.po +++ b/package/luci/applications/luci-app-p910nd/po/zh_Hant/p910nd.po @@ -6,16 +6,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-19 19:35+0200\n" -"PO-Revision-Date: 2022-02-05 09:21+0000\n" -"Last-Translator: Hulen \n" +"PO-Revision-Date: 2023-02-21 05:01+0000\n" +"Last-Translator: 王攀 <41330784@qq.com>\n" "Language-Team: Chinese (Traditional) \n" +"librecmc/luciapplicationsp910nd/zh_Hant/>\n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.16-dev\n" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:47 msgid "Bidirectional mode" @@ -45,7 +45,7 @@ msgstr "連接埠" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:14 msgid "Settings" -msgstr "設定" +msgstr "設置" #: applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua:22 msgid "Specifies the interface to listen on." diff --git a/package/luci/applications/luci-app-tor/Makefile b/package/luci/applications/luci-app-tor/Makefile new file mode 100644 index 0000000000..caecd80534 --- /dev/null +++ b/package/luci/applications/luci-app-tor/Makefile @@ -0,0 +1,14 @@ +# See /LICENSE for more information. +# This is free software, licensed under the Apache License, Version 2.0 . +# +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI app to configure Tor +LUCI_DEPENDS:=+luci-base +tor +tor-hs +PKG_VERSION:=1.0.0 +PKG_RELEASE:=1 +PKG_MAINTAINER:=Sergey Ponomarev + +include ../../luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js b/package/luci/applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js new file mode 100644 index 0000000000..ef8368ec1c --- /dev/null +++ b/package/luci/applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js @@ -0,0 +1,108 @@ +'use strict'; +'require view'; +'require form'; +'require rpc'; +'require uci'; + +var callTorHsList = rpc.declare({ + object: 'tor-hs-rpc', + method: 'list-hs', +}); + + +return view.extend({ + load: function () { + return Promise.all([ + L.resolveDefault(callTorHsList(), {}), + ]); + }, + + render: function (data) { + var hsList = []; + if (data[0]['hs-list']) { + hsList = data[0]['hs-list']; + } + var hsMap = new Map(); + hsList.forEach(function (hs) { + hsMap.set(hs.name, hs.hostname); + }); + + var m, s, o; + + m = new form.Map('tor-hs', _('Tor Onion Services'), + _('Tor Onion (Hidden) Services are proxy tunnels to your local website, SSH and other services.') + '
    ' + + _('For further information check the documentation') + .format('href="https://openwrt.org/docs/guide-user/services/tor/hs" target="_blank" rel="noreferrer"') + ); + + s = m.section(form.GridSection, 'hidden-service', _('Tor Onion Services')); + s.addremove = true; + s.nodescriptions = true; + s.sectiontitle = function (section_id) { + let tor = uci.get('tor-hs', section_id); + let sectionName = section_id; + if (tor['.anonymous']) { + sectionName = tor['Name']; + } + return sectionName; + }; + + o = s.option(form.Flag, 'Enabled', _('Enabled')); + o.default = '1'; + o.rmempty = false; + // We also need to set Name field with the same name as section + // The only option to do that is to override write() for some other field i.e. Enabled + o.write = function (section_id, formvalue) { + // first save the Enabled + uci.set('tor-hs', section_id, 'Enabled', formvalue); + // set Name field + var name = this.map.data.get(this.map.config, section_id, 'Name') || ''; + if (!name) { + // Typically the empty Name happens for new unsaved sections + name = section_id; + // manually set Name to trigger change + uci.set('tor-hs', section_id, 'Name', name); + } + return name; + }; + + o = s.option(form.DummyValue, '_Domain', _('Onion domain')); + o.modalonly = false; + o.rawhtml = true; + o.textvalue = function (section_id) { + var name = uci.get('tor-hs', section_id, 'Name'); + if (!name) + return ''; + var hostname = hsMap.get(name); + if (!hostname) + return ''; + return '' + _('Link') + ''; + }; + + o = s.option(form.Value, 'Description', _('Description')); + o.modalonly = true; + + o = s.option(form.Value, 'IPv4', _('Destination address'), + _('Traffic will be forwarded to the target hostname') + ); + o.datatype = 'host'; + o.default = '127.0.0.1'; + + o = s.option(form.DynamicList, 'PublicLocalPort', _('Public ports to local'), + _('A single Port when the public port is the same as local e.g. 80.') + '
    ' + + _('A pair PublicPort;LocalPort e.g. 80;8080.') + '
    ' + + _('A pair PublicPort;unix:Socket e.g. 80;unix:/var/run/nginx.sock.') + ); + o.datatype = 'list(string)'; + o.default = ['80', '443']; // by default expose http and https ports + o.rmempty = false; + + o = s.option(form.Value, 'HookScript', _('Hook Script'), + _('Path to script which is executed after starting Tor.') + '
    ' + + _('The .onion domain is passed into the script via parameter --update-onion HOSTNAME.') + ); + o.modalonly = true; + + return m.render(); + }, +}); diff --git a/package/luci/applications/luci-app-tor/po/ru/tor.po b/package/luci/applications/luci-app-tor/po/ru/tor.po new file mode 100644 index 0000000000..409a0d5dac --- /dev/null +++ b/package/luci/applications/luci-app-tor/po/ru/tor.po @@ -0,0 +1,94 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8\n" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:93 +msgid "A pair PublicPort;LocalPort e.g. 80;8080." +msgstr "" +"Пара ПубличныйПорт;ЛокальныйПорт н.п. 80;8080" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:94 +msgid "" +"A pair PublicPort;unix:Socket e.g. 80;unix:/var/run/nginx." +"sock." +msgstr "" +"Пара ПубличныйПорт;unix:Сокет н.п. 80;unix:/var/run/nginx." +"sock." + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:92 +msgid "" +"A single Port when the public port is the same as local e.g. " +"80." +msgstr "" +"Один Порт когда публичный порт такой же как и локальный н.п. " +"80." + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:82 +msgid "Description" +msgstr "Описание" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:85 +msgid "Destination address" +msgstr "Aдрес назначения" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:50 +msgid "Enabled" +msgstr "Включен" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:34 +msgid "For further information check the documentation" +msgstr "" +"Для получения дополнительной информации смотрите документацию" + +#: applications/luci-app-tor/root/usr/share/rpcd/acl.d/luci-app-tor.json:3 +msgid "Grant UCI access for luci-app-tor" +msgstr "Предоставить UCI доступ для LuCI приложения Tor" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:100 +msgid "Hook Script" +msgstr "Скрипт хука" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:79 +msgid "Link" +msgstr "Ссылка" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:69 +msgid "Onion domain" +msgstr "Домен Onion" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:101 +msgid "Path to script which is executed after starting Tor." +msgstr "Путь к скрипту который будет выполнен после запуска Tor." + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:91 +msgid "Public ports to local" +msgstr "Публичные порты к Локальным" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:102 +msgid "" +"The .onion domain is passed into the script via parameter --update-" +"onion HOSTNAME." +msgstr "" +"Домен .onion передаётся в скрипт через параметр --update-onion " +"HOSTNAME." + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:33 +msgid "" +"Tor Onion (Hidden) Services are proxy tunnels to your local website, SSH and " +"other services." +msgstr "" +"Tor Onion (Hidden) Services (луковичные/скрытые сервисы Tor) это прокси " +"тунели к вашему локальному вебсайту, SSH и другим сервисам." + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:32 +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:38 +#: applications/luci-app-tor/root/usr/share/luci/menu.d/luci-app-tor.json:16 +msgid "Tor Onion Services" +msgstr "Tor Onion Сервисы" + +#: applications/luci-app-tor/root/usr/share/luci/menu.d/luci-app-tor.json:3 +msgid "Tor onion router" +msgstr "Tor луковичный роутер" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:86 +msgid "Traffic will be forwarded to the target hostname" +msgstr "Трафик будет переправлен по этому имени хоста" diff --git a/package/luci/applications/luci-app-tor/po/templates/tor.pot b/package/luci/applications/luci-app-tor/po/templates/tor.pot new file mode 100644 index 0000000000..b2c0cadbf0 --- /dev/null +++ b/package/luci/applications/luci-app-tor/po/templates/tor.pot @@ -0,0 +1,84 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:93 +msgid "A pair PublicPort;LocalPort e.g. 80;8080." +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:94 +msgid "" +"A pair PublicPort;unix:Socket e.g. 80;unix:/var/run/nginx." +"sock." +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:92 +msgid "" +"A single Port when the public port is the same as local e.g. " +"80." +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:82 +msgid "Description" +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:85 +msgid "Destination address" +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:50 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:34 +msgid "For further information check the documentation" +msgstr "" + +#: applications/luci-app-tor/root/usr/share/rpcd/acl.d/luci-app-tor.json:3 +msgid "Grant UCI access for luci-app-tor" +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:100 +msgid "Hook Script" +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:79 +msgid "Link" +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:69 +msgid "Onion domain" +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:101 +msgid "Path to script which is executed after starting Tor." +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:91 +msgid "Public ports to local" +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:102 +msgid "" +"The .onion domain is passed into the script via parameter --update-" +"onion HOSTNAME." +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:33 +msgid "" +"Tor Onion (Hidden) Services are proxy tunnels to your local website, SSH and " +"other services." +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:32 +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:38 +#: applications/luci-app-tor/root/usr/share/luci/menu.d/luci-app-tor.json:16 +msgid "Tor Onion Services" +msgstr "" + +#: applications/luci-app-tor/root/usr/share/luci/menu.d/luci-app-tor.json:3 +msgid "Tor onion router" +msgstr "" + +#: applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js:86 +msgid "Traffic will be forwarded to the target hostname" +msgstr "" diff --git a/package/luci/applications/luci-app-tor/root/usr/share/luci/menu.d/luci-app-tor.json b/package/luci/applications/luci-app-tor/root/usr/share/luci/menu.d/luci-app-tor.json new file mode 100644 index 0000000000..19777f6bd0 --- /dev/null +++ b/package/luci/applications/luci-app-tor/root/usr/share/luci/menu.d/luci-app-tor.json @@ -0,0 +1,23 @@ +{ + "admin/services/tor": { + "title": "Tor onion router", + "order": 60, + "action": { + "type": "alias", + "path": "admin/services/tor/tor-hs" + }, + "depends": { + "acl": [ + "luci-app-tor" + ] + } + }, + "admin/services/tor/tor-hs": { + "title": "Tor Onion Services", + "order": 20, + "action": { + "type": "view", + "path": "tor/tor-hs" + } + } +} diff --git a/package/luci/applications/luci-app-tor/root/usr/share/rpcd/acl.d/luci-app-tor.json b/package/luci/applications/luci-app-tor/root/usr/share/rpcd/acl.d/luci-app-tor.json new file mode 100644 index 0000000000..81bb9272bd --- /dev/null +++ b/package/luci/applications/luci-app-tor/root/usr/share/rpcd/acl.d/luci-app-tor.json @@ -0,0 +1,22 @@ +{ + "luci-app-tor": { + "description": "Grant UCI access for luci-app-tor", + "read": { + "ubus": { + "tor_rpcd.sh": [ + "list-hs" + ] + }, + "uci": [ + "tor", + "tor-hs" + ] + }, + "write": { + "uci": [ + "tor", + "tor-hs" + ] + } + } +} diff --git a/package/luci/applications/luci-app-uhttpd/Makefile b/package/luci/applications/luci-app-uhttpd/Makefile index a365353cc6..41c386c075 100644 --- a/package/luci/applications/luci-app-uhttpd/Makefile +++ b/package/luci/applications/luci-app-uhttpd/Makefile @@ -12,10 +12,10 @@ LUCI_DEPENDS:=+luci-compat +uhttpd LUCI_PKGARCH:=all PKG_LICENSE:=Apache-2.0 -PKG_MAINTAINER:=Daniel Dickinson +PKG_MAINTAINER:=Daniel Dickinson LUA_TARGET:=source include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua b/package/luci/applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua index 940f09873b..40dc240dc9 100644 --- a/package/luci/applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua +++ b/package/luci/applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua @@ -137,7 +137,7 @@ o.optional = true o = ucs:taboption("server", Value, "realm", translate("Realm for Basic Auth")) o.optional = true -o.placeholder = luci.sys.hostname() or "OpenWrt" +o.placeholder = luci.sys.hostname() or "libreCMC" local httpconfig = ucs:taboption("server", Value, "config", translate("Config file (e.g. for credentials for Basic Auth)"), translate("Will not use HTTP authentication if not present")) httpconfig.optional = true diff --git a/package/luci/applications/luci-app-uhttpd/po/ar/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/ar/uhttpd.po index 44fa277495..8ae7aa3376 100644 --- a/package/luci/applications/luci-app-uhttpd/po/ar/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/ar/uhttpd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-03-08 13:04+0000\n" "Last-Translator: Said Zakaria \n" -"Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/bg/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/bg/uhttpd.po index aa162a0a83..09b75f2945 100644 --- a/package/luci/applications/luci-app-uhttpd/po/bg/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/bg/uhttpd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-10-06 21:07+0000\n" "Last-Translator: Iskren Mihaylov \n" -"Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/bn_BD/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/bn_BD/uhttpd.po index 5fba7f54d5..db5047c411 100644 --- a/package/luci/applications/luci-app-uhttpd/po/bn_BD/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/bn_BD/uhttpd.po @@ -4,7 +4,7 @@ msgstr "" "PO-Revision-Date: 2021-10-08 18:54+0000\n" "Last-Translator: Rayhan Nabi \n" "Language-Team: Bengali (Bangladesh) \n" +"librecmc/luciapplicationsuhttpd/bn_BD/>\n" "Language: bn_BD\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/ca/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/ca/uhttpd.po index ad7139e232..03f281552a 100644 --- a/package/luci/applications/luci-app-uhttpd/po/ca/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/ca/uhttpd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-03-20 23:20+0000\n" "Last-Translator: Toomoch \n" -"Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/cs/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/cs/uhttpd.po index f4024e8b49..3665e41fe5 100644 --- a/package/luci/applications/luci-app-uhttpd/po/cs/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/cs/uhttpd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2020-10-27 21:26+0000\n" "Last-Translator: Lukas Jelinek \n" -"Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/da/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/da/uhttpd.po index 8229bfeb24..ccaf817400 100644 --- a/package/luci/applications/luci-app-uhttpd/po/da/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/da/uhttpd.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-02-07 22:09+0000\n" +"PO-Revision-Date: 2023-10-05 19:12+0000\n" "Last-Translator: drax red \n" -"Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.1-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" diff --git a/package/luci/applications/luci-app-uhttpd/po/de/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/de/uhttpd.po index f27758b262..9db09ced9c 100644 --- a/package/luci/applications/luci-app-uhttpd/po/de/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/de/uhttpd.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2022-02-24 06:56+0000\n" -"Last-Translator: ssantos \n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" diff --git a/package/luci/applications/luci-app-uhttpd/po/el/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/el/uhttpd.po index c67bef8290..cd94f1d08a 100644 --- a/package/luci/applications/luci-app-uhttpd/po/el/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/el/uhttpd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-01-23 03:57+0000\n" "Last-Translator: Savvas Sfantos \n" -"Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/es/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/es/uhttpd.po index d00376917b..95adf3c2d6 100644 --- a/package/luci/applications/luci-app-uhttpd/po/es/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/es/uhttpd.po @@ -2,16 +2,16 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-02-07 07:32+0000\n" -"Last-Translator: Franco Castillo \n" -"Language-Team: Spanish \n" +"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" @@ -29,7 +29,7 @@ msgstr "Un servidor HTTP(S) liviano de un solo hilo" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 msgid "Advanced Settings" -msgstr "Configuración avanzada" +msgstr "Ajustes avanzados" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "Aliases" diff --git a/package/luci/applications/luci-app-uhttpd/po/fi/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/fi/uhttpd.po index 448d67971e..d7daceba4c 100644 --- a/package/luci/applications/luci-app-uhttpd/po/fi/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/fi/uhttpd.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-12-04 18:40+0000\n" -"Last-Translator: Hannu Nyman \n" -"Language-Team: Finnish \n" +"Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.1\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" @@ -201,7 +201,7 @@ msgstr "" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:98 msgid "Remove old certificate and key" -msgstr "" +msgstr "Poista vanha varmenne ja avain" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:218 msgid "Server Hostname" diff --git a/package/luci/applications/luci-app-uhttpd/po/fr/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/fr/uhttpd.po index cfafe440c2..32c2a44e0e 100644 --- a/package/luci/applications/luci-app-uhttpd/po/fr/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/fr/uhttpd.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-04-11 16:26+0000\n" -"Last-Translator: SRay \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.6-dev\n" +"X-Generator: Weblate 4.18.1\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" @@ -137,6 +137,7 @@ msgstr "Écouteur HTTPS (adresse:port)" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:221 msgid "If empty, a random/unique value is used in cert generation" msgstr "" +"Si vide, une valeur aléatoire/unique est utilisée pour la génération Cert" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:90 msgid "Ignore private IPs on public interface" @@ -180,7 +181,7 @@ msgstr "Temps d’attente maximal pour l’activité du réseau" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:221 msgid "Organization" -msgstr "" +msgstr "Organisation" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:166 msgid "Override path for ubus socket" diff --git a/package/luci/applications/luci-app-uhttpd/po/he/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/he/uhttpd.po index 9fb9a9beaf..5d233bdec3 100644 --- a/package/luci/applications/luci-app-uhttpd/po/he/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/he/uhttpd.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-01-12 09:37+0000\n" -"Last-Translator: wakan-tanka \n" -"Language-Team: Hebrew \n" +"Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" @@ -105,7 +105,7 @@ msgstr "" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:18 msgid "General Settings" -msgstr "" +msgstr "הגדרות כלליות" #: applications/luci-app-uhttpd/root/usr/share/rpcd/acl.d/luci-app-uhttpd.json:3 msgid "Grant UCI access for luci-app-uhttpd" diff --git a/package/luci/applications/luci-app-uhttpd/po/hu/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/hu/uhttpd.po index f2e593e540..29da4ae424 100644 --- a/package/luci/applications/luci-app-uhttpd/po/hu/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/hu/uhttpd.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-08-16 16:38+0000\n" -"Last-Translator: Bence Csókás \n" -"Language-Team: Hungarian \n" +"Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 5.1-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" @@ -26,6 +26,7 @@ msgid "A lightweight single-threaded HTTP(S) server" msgstr "" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 +#, fuzzy msgid "Advanced Settings" msgstr "Haladó Beállítások" diff --git a/package/luci/applications/luci-app-uhttpd/po/id/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/id/uhttpd.po index 168b27ab2f..843b5606c1 100644 --- a/package/luci/applications/luci-app-uhttpd/po/id/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/id/uhttpd.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-04-25 11:12+0000\n" -"Last-Translator: Arief Hidayat \n" -"Language-Team: Indonesian \n" +"Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12.1-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" @@ -29,7 +29,7 @@ msgstr "Server HTTP(S) utas tunggal yang ringan" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 msgid "Advanced Settings" -msgstr "Pengaturan Lanjutan" +msgstr "Setelan Lanjutan" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "Aliases" @@ -107,7 +107,7 @@ msgstr "Jalur nyata penuh ke penangan untuk skrip Lua" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:18 msgid "General Settings" -msgstr "Pengaturan Umum" +msgstr "Setelan Umum" #: applications/luci-app-uhttpd/root/usr/share/rpcd/acl.d/luci-app-uhttpd.json:3 msgid "Grant UCI access for luci-app-uhttpd" diff --git a/package/luci/applications/luci-app-uhttpd/po/it/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/it/uhttpd.po index 282840e049..f7d5224792 100644 --- a/package/luci/applications/luci-app-uhttpd/po/it/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/it/uhttpd.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-02-18 20:18+0000\n" -"Last-Translator: pisquan8 \n" -"Language-Team: Italian \n" +"Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" @@ -29,7 +29,7 @@ msgstr "Un server HTTP(S) leggero a thread singolo" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 msgid "Advanced Settings" -msgstr "Impostazioni Avanzate" +msgstr "Impostazioni avanzate" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "Aliases" @@ -115,7 +115,7 @@ msgstr "Percorso reale completo per il gestore per gli script Lua" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:18 msgid "General Settings" -msgstr "Impostazioni Generali" +msgstr "Impostazioni generali" #: applications/luci-app-uhttpd/root/usr/share/rpcd/acl.d/luci-app-uhttpd.json:3 msgid "Grant UCI access for luci-app-uhttpd" diff --git a/package/luci/applications/luci-app-uhttpd/po/ja/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/ja/uhttpd.po index 9b749e0cae..eb9aaa2aff 100644 --- a/package/luci/applications/luci-app-uhttpd/po/ja/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/ja/uhttpd.po @@ -4,7 +4,7 @@ msgstr "" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-02-11 14:23+0000\n" "Last-Translator: Satoru Yoshida \n" -"Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/ko/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/ko/uhttpd.po index 59fd80e373..a595d33974 100644 --- a/package/luci/applications/luci-app-uhttpd/po/ko/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/ko/uhttpd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2022-08-01 05:54+0000\n" "Last-Translator: somni \n" -"Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/lt/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/lt/uhttpd.po new file mode 100644 index 0000000000..c4f4dba687 --- /dev/null +++ b/package/luci/applications/luci-app-uhttpd/po/lt/uhttpd.po @@ -0,0 +1,271 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-10-15 04:23+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.1-dev\n" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 +msgid "" +"(/old/path=/new/path) or (just /old/path which becomes /cgi-prefix/old/path)" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:145 +msgid "404 Error" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:7 +msgid "A lightweight single-threaded HTTP(S) server" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 +msgid "Advanced Settings" +msgstr "Pažangūs nustatymai" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 +msgid "Aliases" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:149 +msgid "Base directory for files to be served" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:22 +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:50 +msgid "Bind to specific interface:port (by specifying interface address" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:126 +msgid "CGI filetype handler" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:153 +msgid "CGI is disabled if not present." +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:142 +msgid "Config file (e.g. for credentials for Basic Auth)" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:187 +msgid "Connection reuse" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:229 +msgid "Country" +msgstr "Šalis" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:173 +msgid "Disable JSON-RPC authorization via ubus session API" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:129 +msgid "Do not follow symlinks outside document root" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:132 +msgid "Do not generate directory listings." +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:148 +msgid "Document root" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:122 +msgid "E.g specify with index.html and index.php when using PHP" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:160 +msgid "Embedded Lua interpreter is disabled if not present." +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:169 +msgid "Enable JSON-RPC Cross-Origin Resource Support" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:19 +msgid "For settings primarily geared to serving more than the web UI" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:19 +msgid "Full Web Server Settings" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:160 +msgid "Full real path to handler for Lua scripts" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:18 +msgid "General Settings" +msgstr "Bendri nustatymai" + +#: applications/luci-app-uhttpd/root/usr/share/rpcd/acl.d/luci-app-uhttpd.json:3 +msgid "Grant UCI access for luci-app-uhttpd" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:22 +msgid "HTTP listeners (address:port)" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:94 +msgid "HTTPS Certificate (DER or PEM format)" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:96 +msgid "HTTPS Private Key (DER or PEM format)" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:50 +msgid "HTTPS listener (address:port)" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:221 +msgid "If empty, a random/unique value is used in cert generation" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:90 +msgid "Ignore private IPs on public interface" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:122 +msgid "Index page(s)" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:126 +msgid "" +"Interpreter to associate with file endings ('suffix=handler', e.g. '.php=/" +"usr/bin/php-cgi')" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:214 +msgid "Length of key in bits" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:223 +msgid "Location" +msgstr "Vietovė" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:197 +msgid "Maximum number of connections" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:201 +msgid "Maximum number of script requests" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:177 +msgid "Maximum wait time for Lua, CGI, or ubus execution" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:182 +msgid "Maximum wait time for network activity" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:221 +msgid "Organization" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:166 +msgid "Override path for ubus socket" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:153 +msgid "Path prefix for CGI scripts" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:90 +msgid "" +"Prevent access from private (RFC1918) IPs on an interface if it has an " +"public IP address" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:138 +msgid "Realm for Basic Auth" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:86 +msgid "Redirect all HTTP to HTTPS" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:109 +msgid "Remove configuration for certificate and key" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:98 +msgid "Remove old certificate and key" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:218 +msgid "Server Hostname" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 +msgid "" +"Settings which are either rarely needed or which affect serving the WebUI" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:226 +msgid "State" +msgstr "Būklė" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:192 +msgid "TCP Keepalive" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:110 +msgid "This permanently deletes the cert, key, and configuration to use same." +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:210 +msgid "Valid for # of Days" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:145 +msgid "" +"Virtual URL or CGI script to display on status '404 Not Found'. Must begin " +"with '/'" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:156 +msgid "Virtual path prefix for Lua scripts" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:163 +msgid "Virtual path prefix for ubus via JSON-RPC integration" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:142 +msgid "Will not use HTTP authentication if not present" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:218 +msgid "a.k.a CommonName" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:6 +#: applications/luci-app-uhttpd/root/usr/share/luci/menu.d/luci-app-uhttpd.json:3 +msgid "uHTTPd" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:205 +msgid "uHTTPd Self-signed Certificate Parameters" +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:99 +msgid "" +"uHTTPd will generate a new self-signed certificate using the configuration " +"shown below." +msgstr "" + +#: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:163 +msgid "ubus integration is disabled if not present" +msgstr "" diff --git a/package/luci/applications/luci-app-uhttpd/po/mr/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/mr/uhttpd.po index 26661261a3..e65d2c0433 100644 --- a/package/luci/applications/luci-app-uhttpd/po/mr/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/mr/uhttpd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2020-01-29 21:15+0000\n" "Last-Translator: Prachi Joshi \n" -"Language-Team: Marathi \n" "Language: mr\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/ms/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/ms/uhttpd.po index 88fde5698e..f0b7c109bc 100644 --- a/package/luci/applications/luci-app-uhttpd/po/ms/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/ms/uhttpd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2021-03-31 12:26+0000\n" "Last-Translator: Faruki Ramly \n" -"Language-Team: Malay \n" "Language: ms\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/nb_NO/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/nb_NO/uhttpd.po index aa012b496d..c1a2a6bbeb 100644 --- a/package/luci/applications/luci-app-uhttpd/po/nb_NO/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/nb_NO/uhttpd.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-02-27 05:11+0000\n" +"PO-Revision-Date: 2023-02-28 10:31+0000\n" "Last-Translator: Allan Nordhøy \n" -"Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5\n" +"X-Generator: Weblate 4.16-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" @@ -19,7 +19,7 @@ msgstr "" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:145 msgid "404 Error" -msgstr "" +msgstr "404-feil" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:7 msgid "A lightweight single-threaded HTTP(S) server" diff --git a/package/luci/applications/luci-app-uhttpd/po/pl/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/pl/uhttpd.po index a601a65d06..3bee1e6ed0 100644 --- a/package/luci/applications/luci-app-uhttpd/po/pl/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/pl/uhttpd.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-02-06 11:56+0000\n" +"PO-Revision-Date: 2023-07-03 08:57+0000\n" "Last-Translator: Matthaiks \n" -"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -11,13 +11,14 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" "(/old/path=/new/path) or (just /old/path which becomes /cgi-prefix/old/path)" msgstr "" -"(/old/path=/new/path) lub (just /old/path which becomes /cgi-prefix/old/path)" +"(/stara/ścieżka=/nowa/ścieżka) lub (po prostu /stara/ścieżka, która staje " +"się /cgi-prefix/stara/ścieżka)" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:145 msgid "404 Error" @@ -37,7 +38,7 @@ msgstr "Aliasy" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:149 msgid "Base directory for files to be served" -msgstr "Katalog bazowy dla plików, które mają być obsługiwane" +msgstr "Katalog podstawowy plików do udostępnienia" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:22 #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:50 @@ -69,11 +70,11 @@ msgstr "Kraj" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:173 msgid "Disable JSON-RPC authorization via ubus session API" -msgstr "Wyłącz autoryzację JSON-RPC poprzez interfejs API dla sesji ubus" +msgstr "Wyłącz autoryzację JSON‑RPC poprzez interfejs API dla sesji ubus" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:129 msgid "Do not follow symlinks outside document root" -msgstr "Nie należy podążać za symlinkami poza źródłem dokumentu" +msgstr "Nie podążaj za dowiązaniami symbolicznymi poza katalogiem głównym" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:132 msgid "Do not generate directory listings." @@ -81,19 +82,19 @@ msgstr "Nie generuj listy katalogów." #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:148 msgid "Document root" -msgstr "Źródło dokumentu" +msgstr "Katalog główny" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:122 msgid "E.g specify with index.html and index.php when using PHP" -msgstr "Np. podając z index.html i index.php podczas używania PHP" +msgstr "Np. określ za pomocą index.html i index.php podczas używania PHP" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:160 msgid "Embedded Lua interpreter is disabled if not present." -msgstr "Wbudowany tłumacz Lua jest wyłączony, jeśli nie jest obecny." +msgstr "Wbudowany interpreter Lua jest wyłączony, jeśli go nie ma." #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:169 msgid "Enable JSON-RPC Cross-Origin Resource Support" -msgstr "Włącz obsługę zasobów JSON-RPC Cross-Origin Resource Support" +msgstr "Włącz obsługę zasobów między źródłami JSON‑RPC" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:19 msgid "For settings primarily geared to serving more than the web UI" @@ -152,7 +153,7 @@ msgid "" "Interpreter to associate with file endings ('suffix=handler', e.g. '.php=/" "usr/bin/php-cgi')" msgstr "" -"Interpreter do kojarzenia z zakończeniami plików ('suffix=handler', e.g. '." +"Interpreter do powiązania z zakończeniami plików ('suffix=handler', np. '." "php=/usr/bin/php-cgi')" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:214 @@ -201,11 +202,11 @@ msgstr "" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:138 msgid "Realm for Basic Auth" -msgstr "Strefa dla podstawowej autoryzacji" +msgstr "Domena do uwierzytelniania podstawowego" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:86 msgid "Redirect all HTTP to HTTPS" -msgstr "Przekieruj wszystkie HTTP do HTTPS" +msgstr "Przekieruj cały HTTP na HTTPS" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:109 msgid "Remove configuration for certificate and key" @@ -222,7 +223,8 @@ msgstr "Nazwa hosta serwera" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 msgid "" "Settings which are either rarely needed or which affect serving the WebUI" -msgstr "Ustawienia, które są rzadko potrzebne lub mają wpływ na obsługę WebUI" +msgstr "" +"Ustawienia, które są rzadko potrzebne lub wpływają na obsługę interfejsu WWW" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:226 msgid "State" @@ -230,7 +232,7 @@ msgstr "Stan" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:192 msgid "TCP Keepalive" -msgstr "Trzymaj przy życiu protokół TCP" +msgstr "Utrzymywanie otwartego połączenia TCP (keepalive)" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:110 msgid "This permanently deletes the cert, key, and configuration to use same." @@ -245,8 +247,8 @@ msgid "" "Virtual URL or CGI script to display on status '404 Not Found'. Must begin " "with '/'" msgstr "" -"Wirtualny adres URL lub skrypt CGI do wyświetlania w statusie '404 Nie " -"znaleziono'. Musi zaczynać się od '/'" +"Wirtualny adres URL lub skrypt CGI do wyświetlenia przy statusie '404 Not " +"Found'. Musi zaczynać się od '/'" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:156 msgid "Virtual path prefix for Lua scripts" @@ -254,7 +256,7 @@ msgstr "Prefiks ścieżki wirtualnej dla skryptów Lua" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:163 msgid "Virtual path prefix for ubus via JSON-RPC integration" -msgstr "Prefiks ścieżki wirtualnej dla ubus via JSON-RPC" +msgstr "Prefiks ścieżki wirtualnej dla ubus poprzez integrację JSON‑RPC" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:142 msgid "Will not use HTTP authentication if not present" @@ -262,7 +264,7 @@ msgstr "Nie użyje uwierzytelniania HTTP, jeśli nie ma go w systemie" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:218 msgid "a.k.a CommonName" -msgstr "a.k.a Nazwa zwyczajowa" +msgstr "tzw. CommonName" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:6 #: applications/luci-app-uhttpd/root/usr/share/luci/menu.d/luci-app-uhttpd.json:3 diff --git a/package/luci/applications/luci-app-uhttpd/po/pt/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/pt/uhttpd.po index 11ddb65e4e..ef241f5333 100644 --- a/package/luci/applications/luci-app-uhttpd/po/pt/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/pt/uhttpd.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-02-07 22:09+0000\n" +"PO-Revision-Date: 2023-07-01 19:50+0000\n" "Last-Translator: ssantos \n" -"Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" @@ -28,7 +28,7 @@ msgstr "Um servidor HTTP(S) leve de thread única" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 msgid "Advanced Settings" -msgstr "Definições Avançadas" +msgstr "Configurações avançadas" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "Aliases" diff --git a/package/luci/applications/luci-app-uhttpd/po/pt_BR/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/pt_BR/uhttpd.po index 383f6fae31..422fbfd1da 100644 --- a/package/luci/applications/luci-app-uhttpd/po/pt_BR/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/pt_BR/uhttpd.po @@ -2,16 +2,16 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-02-09 16:03+0000\n" +"PO-Revision-Date: 2023-07-05 18:56+0000\n" "Last-Translator: Wellington Terumi Uemura \n" "Language-Team: Portuguese (Brazil) \n" +"librecmc/luciapplicationsuhttpd/pt_BR/>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" @@ -29,7 +29,7 @@ msgstr "Um servidor HTTP(S) leve de única thread" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 msgid "Advanced Settings" -msgstr "Configurações Avançadas" +msgstr "Configurações avançadas" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "Aliases" diff --git a/package/luci/applications/luci-app-uhttpd/po/ro/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/ro/uhttpd.po index 77b2387bed..97dcca8f2e 100644 --- a/package/luci/applications/luci-app-uhttpd/po/ro/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/ro/uhttpd.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-02-11 20:57+0000\n" +"PO-Revision-Date: 2023-06-29 20:41+0000\n" "Last-Translator: Simona Iacob \n" -"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.18.1\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" diff --git a/package/luci/applications/luci-app-uhttpd/po/ru/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/ru/uhttpd.po index b1f4791067..b5a72e8721 100644 --- a/package/luci/applications/luci-app-uhttpd/po/ru/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/ru/uhttpd.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: LuCI: uhttpd\n" "POT-Creation-Date: 2017-12-06 22:30+0300\n" -"PO-Revision-Date: 2022-03-30 01:31+0000\n" -"Last-Translator: Anton Kikin \n" -"Language-Team: Russian \n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 5.0-dev\n" "Project-Info: Это технический перевод, не дословный. Главное-удобный русский " "интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" @@ -33,7 +33,7 @@ msgstr "Легкий однопоточный HTTP(S) сервер" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 msgid "Advanced Settings" -msgstr "Дополнительные настройки" +msgstr "Расширенные настройки" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "Aliases" @@ -51,7 +51,7 @@ msgstr "" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:126 msgid "CGI filetype handler" -msgstr "Обработчик
    типа файла CGI" +msgstr "Обработчик файлов CGI" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:153 msgid "CGI is disabled if not present." @@ -115,7 +115,7 @@ msgstr "Полный путь
    к обработчику
    скрипто #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:18 msgid "General Settings" -msgstr "Общие настройки" +msgstr "Основные настройки" #: applications/luci-app-uhttpd/root/usr/share/rpcd/acl.d/luci-app-uhttpd.json:3 msgid "Grant UCI access for luci-app-uhttpd" @@ -232,7 +232,7 @@ msgstr "" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:226 msgid "State" -msgstr "Указывать" +msgstr "Состояние" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:192 msgid "TCP Keepalive" diff --git a/package/luci/applications/luci-app-uhttpd/po/sk/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/sk/uhttpd.po index b9c302d552..096788d1ba 100644 --- a/package/luci/applications/luci-app-uhttpd/po/sk/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/sk/uhttpd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2020-04-04 17:34+0000\n" "Last-Translator: DuÅ¡an Kazik \n" -"Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/sv/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/sv/uhttpd.po index c985bafa1d..654dbf529d 100644 --- a/package/luci/applications/luci-app-uhttpd/po/sv/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/sv/uhttpd.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-09-10 07:18+0000\n" +"PO-Revision-Date: 2023-10-02 03:20+0000\n" "Last-Translator: Kristoffer Grundström \n" -"Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 5.1-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" @@ -216,7 +216,7 @@ msgstr "" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:226 msgid "State" -msgstr "Skick" +msgstr "Status" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:192 msgid "TCP Keepalive" diff --git a/package/luci/applications/luci-app-uhttpd/po/tr/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/tr/uhttpd.po index c772956b15..039663a48f 100644 --- a/package/luci/applications/luci-app-uhttpd/po/tr/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/tr/uhttpd.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-02-18 20:58+0000\n" -"Last-Translator: Oğuz Ersen \n" -"Language-Team: Turkish \n" +"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" diff --git a/package/luci/applications/luci-app-uhttpd/po/uk/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/uk/uhttpd.po index 049a541f92..abf5101e74 100644 --- a/package/luci/applications/luci-app-uhttpd/po/uk/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/uk/uhttpd.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2022-02-14 11:56+0000\n" "Last-Translator: Vova Buran \n" -"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" diff --git a/package/luci/applications/luci-app-uhttpd/po/vi/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/vi/uhttpd.po index 05a8cf2aac..1591c4db03 100644 --- a/package/luci/applications/luci-app-uhttpd/po/vi/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/vi/uhttpd.po @@ -1,29 +1,30 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2020-10-26 20:34+0000\n" -"Last-Translator: 0x2f0713 \n" -"Language-Team: Vietnamese \n" +"Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.3.2-dev\n" +"X-Generator: Weblate 4.18.1\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" "(/old/path=/new/path) or (just /old/path which becomes /cgi-prefix/old/path)" msgstr "" +"(/old/path = /new/path) hoặc (just /old/path trở thành /cgi-prefix/old/path)" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:145 msgid "404 Error" -msgstr "" +msgstr "Lỗi 404" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:7 msgid "A lightweight single-threaded HTTP(S) server" -msgstr "" +msgstr "Máy chủ HTTP(S) đơn luồng nhẹ" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 msgid "Advanced Settings" @@ -31,239 +32,253 @@ msgstr "Cài đặt nâng cao" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "Aliases" -msgstr "" +msgstr "Bí danh" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:149 msgid "Base directory for files to be served" -msgstr "" +msgstr "ThÆ° mục cÆ¡ sở cho các tập tin được lÆ°u trữ" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:22 #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:50 msgid "Bind to specific interface:port (by specifying interface address" msgstr "" +"Liên kết với giao diện cụ thể: cổng (bằng cách chỉ định địa chỉ giao diện" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:126 msgid "CGI filetype handler" -msgstr "" +msgstr "Trình xá»­ lý loại tệp CGI" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:153 msgid "CGI is disabled if not present." -msgstr "" +msgstr "CGI bị tắt nếu không có." #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:142 msgid "Config file (e.g. for credentials for Basic Auth)" -msgstr "" +msgstr "Tệp cấu hình (ví dụ: thông tin đăng nhập cho Basic Auth)" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:187 msgid "Connection reuse" -msgstr "" +msgstr "Tái sá»­ dụng kết nối" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:229 msgid "Country" -msgstr "" +msgstr "Quốc gia" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:173 msgid "Disable JSON-RPC authorization via ubus session API" -msgstr "" +msgstr "Vô hiệu hóa ủy quyền JSON-RPC qua API phiên ubus" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:129 msgid "Do not follow symlinks outside document root" -msgstr "" +msgstr "Không theo các liên kết tượng trÆ°ng bên ngoài tài liệu gốc" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:132 msgid "Do not generate directory listings." -msgstr "" +msgstr "Không tạo danh sách thÆ° mục." #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:148 msgid "Document root" -msgstr "" +msgstr "Document root" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:122 msgid "E.g specify with index.html and index.php when using PHP" -msgstr "" +msgstr "Ví dụ: chỉ định với index.html và index.php khi sá»­ dụng PHP" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:160 msgid "Embedded Lua interpreter is disabled if not present." -msgstr "" +msgstr "Trình thông dịch Lua nhúng bị tắt nếu không có." #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:169 msgid "Enable JSON-RPC Cross-Origin Resource Support" -msgstr "" +msgstr "Bật hỗ trợ tài nguyên nguồn gốc JSON-RPC" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:19 msgid "For settings primarily geared to serving more than the web UI" msgstr "" +"Đối với cài đặt chủ yếu hướng đến phục vụ nhiều hÆ¡n giao diện người dùng web" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:19 msgid "Full Web Server Settings" -msgstr "" +msgstr "Cài đặt máy chủ web đầy đủ" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:160 msgid "Full real path to handler for Lua scripts" -msgstr "" +msgstr "Đường dẫn thá»±c đầy đủ tới trình xá»­ lý cho tập lệnh Lua" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:18 msgid "General Settings" -msgstr "" +msgstr "Các cài đặt chung" #: applications/luci-app-uhttpd/root/usr/share/rpcd/acl.d/luci-app-uhttpd.json:3 msgid "Grant UCI access for luci-app-uhttpd" -msgstr "" +msgstr "Cấp quyền truy cập UCI cho luci-app-uhttpd" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:22 msgid "HTTP listeners (address:port)" -msgstr "" +msgstr "HTTP listeners (địa chỉ: cổng)" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:94 msgid "HTTPS Certificate (DER or PEM format)" -msgstr "" +msgstr "Chứng chỉ HTTPS (định dạng DER hoặc PEM)" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:96 msgid "HTTPS Private Key (DER or PEM format)" -msgstr "" +msgstr "Khóa riêng HTTPS (định dạng DER hoặc PEM)" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:50 msgid "HTTPS listener (address:port)" -msgstr "" +msgstr "HTTPS listener (địa chỉ:cổng)" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:221 msgid "If empty, a random/unique value is used in cert generation" msgstr "" +"Nếu trống, một giá trị ngẫu nhiên/duy nhất được sá»­ dụng trong quá trình tạo " +"chứng chỉ" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:90 msgid "Ignore private IPs on public interface" -msgstr "" +msgstr "Bỏ qua IP riêng trên giao diện công cộng" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:122 msgid "Index page(s)" -msgstr "" +msgstr "(Các) trang chỉ mục" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:126 msgid "" "Interpreter to associate with file endings ('suffix=handler', e.g. '.php=/" "usr/bin/php-cgi')" msgstr "" +"Trình thông dịch để liên kết với phần cuối của tệp ('suffix=handler', ví dụ: " +"'.php=/usr/bin/php-cgi')" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:214 msgid "Length of key in bits" -msgstr "" +msgstr "Độ dài của khóa tính bằng bit" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:223 msgid "Location" -msgstr "" +msgstr "Vị trí" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:197 msgid "Maximum number of connections" -msgstr "" +msgstr "Số lượng kết nối tối đa" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:201 msgid "Maximum number of script requests" -msgstr "" +msgstr "Số lượng yêu cầu tập lệnh tối đa" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:177 msgid "Maximum wait time for Lua, CGI, or ubus execution" -msgstr "" +msgstr "Thời gian chờ tối đa để thá»±c thi Lua, CGI hoặc ubus" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:182 msgid "Maximum wait time for network activity" -msgstr "" +msgstr "Thời gian chờ tối đa cho hoạt động mạng" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:221 msgid "Organization" -msgstr "" +msgstr "Tổ chức" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:166 msgid "Override path for ubus socket" -msgstr "" +msgstr "Ghi đè đường dẫn cho ổ cắm ubus" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:153 msgid "Path prefix for CGI scripts" -msgstr "" +msgstr "Tiền tố đường dẫn cho tập lệnh CGI" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:90 msgid "" "Prevent access from private (RFC1918) IPs on an interface if it has an " "public IP address" msgstr "" +"Ngăn truy cập từ các IP riêng tÆ° (RFC1918) trên giao diện nếu giao diện đó " +"có địa chỉ IP công khai" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:138 msgid "Realm for Basic Auth" -msgstr "" +msgstr "Xác thá»±c cÆ¡ bản" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:86 msgid "Redirect all HTTP to HTTPS" -msgstr "" +msgstr "Chuyển hướng tất cả HTTP sang HTTPS" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:109 msgid "Remove configuration for certificate and key" -msgstr "" +msgstr "Xóa cấu hình cho chứng chỉ và khóa" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:98 msgid "Remove old certificate and key" -msgstr "" +msgstr "Xóa chứng chỉ và khóa cÅ©" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:218 msgid "Server Hostname" -msgstr "" +msgstr "Tên máy chủ" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:20 msgid "" "Settings which are either rarely needed or which affect serving the WebUI" -msgstr "" +msgstr "Cài đặt hiếm khi cần thiết hoặc ảnh hưởng đến việc cung cấp WebUI" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:226 msgid "State" -msgstr "" +msgstr "Trạng thái" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:192 msgid "TCP Keepalive" -msgstr "" +msgstr "TCP Keepalive" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:110 msgid "This permanently deletes the cert, key, and configuration to use same." msgstr "" +"Thao tác này sẽ xóa vÄ©nh viễn chứng chỉ, khóa và cấu hình để sá»­ dụng giống " +"nhau." #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:210 msgid "Valid for # of Days" -msgstr "" +msgstr "Có giá trị trong # ngày" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:145 msgid "" "Virtual URL or CGI script to display on status '404 Not Found'. Must begin " "with '/'" msgstr "" +"URL ảo hoặc tập lệnh CGI để hiển thị trên trạng thái 'Không tìm thấy 404'. " +"Phải bắt đầu bằng '/'" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:156 msgid "Virtual path prefix for Lua scripts" -msgstr "" +msgstr "Tiền tố đường dẫn ảo cho tập lệnh Lua" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:163 msgid "Virtual path prefix for ubus via JSON-RPC integration" -msgstr "" +msgstr "Tiền tố đường dẫn ảo cho ubus thông qua tích hợp JSON-RPC" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:142 msgid "Will not use HTTP authentication if not present" -msgstr "" +msgstr "Sẽ không sá»­ dụng xác thá»±c HTTP nếu không có" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:218 msgid "a.k.a CommonName" -msgstr "" +msgstr "a.k.a CommonName" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:6 #: applications/luci-app-uhttpd/root/usr/share/luci/menu.d/luci-app-uhttpd.json:3 msgid "uHTTPd" -msgstr "" +msgstr "uHTTPd" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:205 msgid "uHTTPd Self-signed Certificate Parameters" -msgstr "" +msgstr "uHTTPd Tham số chứng chỉ tá»± ký" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:99 msgid "" "uHTTPd will generate a new self-signed certificate using the configuration " "shown below." msgstr "" +"uHTTPd sẽ tạo chứng chỉ tá»± ký mới bằng cách sá»­ dụng cấu hình hiển thị bên " +"dưới." #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:163 msgid "ubus integration is disabled if not present" -msgstr "" +msgstr "tích hợp ubus bị vô hiệu hóa nếu không có" diff --git a/package/luci/applications/luci-app-uhttpd/po/zh_Hans/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/zh_Hans/uhttpd.po index 399d5fbf23..2ad71a44d9 100644 --- a/package/luci/applications/luci-app-uhttpd/po/zh_Hans/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/zh_Hans/uhttpd.po @@ -3,15 +3,15 @@ # msgid "" msgstr "" -"PO-Revision-Date: 2022-02-06 11:56+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2023-06-29 14:15+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" +"librecmc/luciapplicationsuhttpd/zh_Hans/>\n" "Language: zh_Hans\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.18.1\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" diff --git a/package/luci/applications/luci-app-uhttpd/po/zh_Hant/uhttpd.po b/package/luci/applications/luci-app-uhttpd/po/zh_Hant/uhttpd.po index f60b3b9336..e1e5f9ceca 100644 --- a/package/luci/applications/luci-app-uhttpd/po/zh_Hant/uhttpd.po +++ b/package/luci/applications/luci-app-uhttpd/po/zh_Hant/uhttpd.po @@ -3,15 +3,15 @@ # msgid "" msgstr "" -"PO-Revision-Date: 2022-10-16 23:59+0000\n" -"Last-Translator: Hulen \n" +"PO-Revision-Date: 2023-08-06 01:52+0000\n" +"Last-Translator: Trevor \n" "Language-Team: Chinese (Traditional) \n" +"librecmc/luciapplicationsuhttpd/zh_Hant/>\n" "Language: zh_Hant\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: applications/luci-app-uhttpd/luasrc/model/cbi/uhttpd/uhttpd.lua:135 msgid "" diff --git a/package/luci/applications/luci-app-wireguard/Makefile b/package/luci/applications/luci-app-wireguard/Makefile deleted file mode 100644 index 81110e9be2..0000000000 --- a/package/luci/applications/luci-app-wireguard/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -# -# Copyright (C) 2016-2017 Dan Luedtke -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=WireGuard Status -LUCI_DEPENDS:=+luci-proto-wireguard -LUCI_PKGARCH:=all - -include ../../luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js b/package/luci/applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js deleted file mode 100644 index b9c756de98..0000000000 --- a/package/luci/applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js +++ /dev/null @@ -1,228 +0,0 @@ -'use strict'; -'require view'; -'require rpc'; -'require form'; -'require poll'; - - -var callGetWgInstances = rpc.declare({ - object: 'luci.wireguard', - method: 'getWgInstances' -}); - -function timestampToStr(timestamp) { - if (timestamp < 1) { - return _('Never'); - } - var now = new Date(); - var seconds = (now.getTime() / 1000) - timestamp; - var ago = ''; - if (seconds < 60) { - ago = _('%ds ago').format(parseInt(seconds)); - } else if (seconds < 3600) { - ago = _('%dm ago').format(parseInt(seconds / 60)); - } else if (seconds < 86401) { - ago = _('%dh ago').format(parseInt(seconds / 3600)); - } else { - ago = _('over a day ago'); - } - var t = new Date(timestamp * 1000); - return t.toUTCString() + ' (' + ago + ')'; -} - -function generatePeerOption(key, title, value) { - return E('div', { 'class': 'cbi-value', 'style': 'padding: 0;' }, [ - E('label', { - 'class': 'cbi-value-title', 'style': 'font-weight: bold;' - }, title), - E('input', { - 'class': 'cbi-input-text', - 'data-name': key, - 'style': 'border: none; float: left; width: 50%;', - 'disabled': '', - 'value': value - }) - ]); -} - -function generatePeerTable(options, iconSrc) { - return E('div', { 'class': 'table cbi-section-table' }, [ - E('div', { 'class': 'td' }, - E('img', { 'src': iconSrc, 'class': 'tunnel-icon' }) - ), - E('div', { 'class': 'td peer-options' }, - options.filter(function (option) { - return option[2] != null; - }).map(function (option) { - return generatePeerOption.apply(null, option); - }) - ) - ]); -} - -function getTunnelIcon(latestHandshake) { - var img = (new Date().getTime() / 1000 - latestHandshake) < 140 ? - 'tunnel' : 'tunnel_disabled'; - - return L.resource('icons', img + '.png'); -} - -function generatePeerRows(peers) { - var peerRows = []; - - peers.forEach(function (peer) { - var peerData = parsePeerData(peer); - var iconSrc = getTunnelIcon(peer.latest_handshake); - - peerRows.push(E('tr', { - 'class': 'tr cbi-section-table-row' - }, [ - E('td', { - 'class': 'td peer-name', - 'style': 'width: 25%; font-size: 0.9rem;' - }, peer.name), - E('td', { 'class': 'td', 'data-section-id': peer.name }, - generatePeerTable(peerData, iconSrc) - ) - ])); - }); - - if (!peerRows.length) { - peerRows.push( - E('tr', { 'class': 'tr placeholder' }, - E('td', { 'class': 'td' }, - E('em', _('No peer information available'))))); - } - - return peerRows; -} - -function parseIfaceData(iface) { - return [ - ['public_key', _('Public Key'), - iface.public_key != '(none)' ? iface.public_key : null], - ['listen_port', _('Listen Port'), - iface.listen_port > 0 ? iface.listen_port : null], - ['fwmark', _('Firewall Mark'), - iface.fwmark != 'off' ? iface.fwmark : null] - ]; -} - -function parsePeerData(peer) { - return [ - ['public_key', _('Public Key'), - peer.public_key], - ['endpoint', _('Endpoint'), - peer.endpoint == '(none)' ? null : peer.endpoint], - ['allowed_ips', _('Allowed IPs'), - peer.allowed_ips.length == 0 ? null : peer.allowed_ips.join('\n')], - ['persistent_keepalive', _('Persistent Keepalive'), - peer.persistent_keepalive == 'off' ? null : peer.persistent_keepalive + 's'], - ['latest_handshake', _('Latest Handshake'), - timestampToStr(peer.latest_handshake)], - ['transfer_rx', _('Data Received'), - '%1024mB'.format(peer.transfer_rx)], - ['transfer_tx', _('Data Transmitted'), - '%1024mB'.format(peer.transfer_tx)] - ]; -} - -return view.extend({ - load: function () { - return callGetWgInstances(); - }, - - poll_status: function (nodes, ifaces) { - Object.keys(ifaces).forEach(function (ifaceName) { - var iface = ifaces[ifaceName]; - - var section = nodes.querySelector( - '[data-section-id="%q"]'.format(ifaceName) - ); - - parseIfaceData(iface).forEach(function (option) { - if (option[2] != null) { - var optionEl = section.querySelector( - '[data-name="%q"]'.format(option[0]) - ); - var inputEl = optionEl.querySelector('input'); - - inputEl.value = option[2]; - } - }); - - iface.peers.forEach(function (peer) { - var peerData = parsePeerData(peer); - var iconSrc = getTunnelIcon(peer.latest_handshake); - - var peerSection = section.querySelector( - '[data-section-id="%q"]'.format(peer.name) - ); - var iconEl = peerSection.querySelector('.tunnel-icon'); - iconEl.src = iconSrc; - - peerData.forEach(function (option) { - if (option[2]) { - var inputEl = peerSection.querySelector( - '[data-name="%q"]'.format(option[0]) - ); - inputEl.value = option[2]; - } - }) - }); - }); - }, - - render: function (ifaces) { - var m, s, o, ss; - - m = new form.JSONMap(ifaces, _('WireGuard Status')); - m.tabbed = true; - - var ifaceNames = Object.keys(ifaces); - - for (var i = ifaceNames.length - 1; i >= 0; i--) { - var ifaceName = ifaceNames[i]; - var iface = ifaces[ifaceName]; - - s = m.section(form.TypedSection, ifaceName); - s.tabbed = true; - s.anonymous = true; - - var ifaceData = parseIfaceData(iface); - ifaceData.forEach(function (option) { - if (option[2] != null) { - o = s.option(form.Value, option[0], option[1]); - o.readonly = true; - } - }); - - o = s.option(form.SectionValue, 'peers', form.TypedSection, 'peers'); - ss = o.subsection; - - ss.render = L.bind(function (view, section_id) { - return E('div', { 'class': 'cbi-section' }, [ - E('h3', _('Peers')), - E('table', { 'class': 'table cbi-section-table' }, - generatePeerRows(this.peers)) - ]); - }, iface, this); - } - - return m.render().then(L.bind(function (m, nodes) { - if (!ifaceNames.length) - nodes.appendChild(E('p', {}, E('em', _('No WireGuard interfaces configured.')))); - - poll.add(L.bind(function () { - return callGetWgInstances().then( - L.bind(this.poll_status, this, nodes) - ); - }, this), 5); - return nodes; - }, this, m)); - }, - - handleReset: null, - handleSaveApply: null, - handleSave: null -}); diff --git a/package/luci/applications/luci-app-wireguard/po/ar/wireguard.po b/package/luci/applications/luci-app-wireguard/po/ar/wireguard.po deleted file mode 100644 index 787a3b1586..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/ar/wireguard.po +++ /dev/null @@ -1,93 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-03-08 13:04+0000\n" -"Last-Translator: Said Zakaria \n" -"Language-Team: Arabic \n" -"Language: ar\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.5.1\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "عناوين IP المسموح بها" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "علامة جدار الحماية" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "بوابة الاستماع" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "أبدا" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "المفتاح العمومي" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "" diff --git a/package/luci/applications/luci-app-wireguard/po/bg/wireguard.po b/package/luci/applications/luci-app-wireguard/po/bg/wireguard.po deleted file mode 100644 index e5261b4e9a..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/bg/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-09-15 08:34+0000\n" -"Last-Translator: Iskren Mihaylov \n" -"Language-Team: Bulgarian \n" -"Language: bg\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%dh преди" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%dm преди" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%ds преди" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Разрешени IPs" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Получени данни" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Предадени данни" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Крайна точка" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Никога" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Публичен ключ" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Състояние на WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "преди повече от ден" diff --git a/package/luci/applications/luci-app-wireguard/po/bn_BD/wireguard.po b/package/luci/applications/luci-app-wireguard/po/bn_BD/wireguard.po deleted file mode 100644 index 00dd68f292..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/bn_BD/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-10-08 17:53+0000\n" -"Last-Translator: Rayhan Nabi \n" -"Language-Team: Bengali (Bangladesh) \n" -"Language: bn_BD\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d ঘণ্টা আগে" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d মিনিট আগে" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d সেকেন্ড আগে" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "অনুমোদিত আইপি" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "ডাটা গৃহীত হয়েছে" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "ডাটা প্রেরিত" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "এন্ডপয়েন্ট" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "ফায়ারওয়াল মার্ক" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "LuCI অ্যাপ ওয়্যারগার্ডে প্রবেশাধিকার প্রদান করুন" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "সর্বশেষ হ্যান্ডশেক" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "শোনার পোর্ট" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "কখনও না" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "পিয়ার" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "স্থায়ী Keepalive" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "পাবলিক কী" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "ওয়্যারগার্ড" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "ওয়্যারগার্ড স্ট্যাটাস" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "এক দিনের বেশি আগে" diff --git a/package/luci/applications/luci-app-wireguard/po/ca/wireguard.po b/package/luci/applications/luci-app-wireguard/po/ca/wireguard.po deleted file mode 100644 index 45a4c59060..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/ca/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-09-17 06:52+0000\n" -"Last-Translator: Roger Pueyo Centelles \n" -"Language-Team: Catalan \n" -"Language: ca\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "IPs permeses" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Mai" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "" diff --git a/package/luci/applications/luci-app-wireguard/po/cs/wireguard.po b/package/luci/applications/luci-app-wireguard/po/cs/wireguard.po deleted file mode 100644 index 1e4df11c66..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/cs/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2020-02-04 05:03+0000\n" -"Last-Translator: Pavel Borecki \n" -"Language-Team: Czech \n" -"Language: cs\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 3.11-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d hodin zpět" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d minut zpět" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d sekund zpět" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "IP adresy, ze kterých umožnit přístup" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Přijatá data" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Odeslaná data" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Koncový bod" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Označkování brány firewall" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Poslední handshake" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Port na kterém očekávat spojení" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Nikdy" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Trvalé udržování spojení (Keep Alive)" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Veřejný klíč" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Stav WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "před více než dnem" diff --git a/package/luci/applications/luci-app-wireguard/po/da/wireguard.po b/package/luci/applications/luci-app-wireguard/po/da/wireguard.po deleted file mode 100644 index 3e349d6864..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/da/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-12-03 21:07+0000\n" -"Last-Translator: drax red \n" -"Language-Team: Danish \n" -"Language: da\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%dh siden" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%dm siden" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%ds siden" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Tilladte IP'er" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Data modtaget" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Data Overført" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Endpoint" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Firewall-mærke" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Giv adgang til LuCI app wireguard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Seneste hÃ¥ndtryk" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Lytteport" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Aldrig" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Ingen WireGuard interfaces konfigureret." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Ingen peer-information tilgængelig" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Peers" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Vedvarende hold i live" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Offentlig nøgle" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "WireGuard-status" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "for over en dag siden" diff --git a/package/luci/applications/luci-app-wireguard/po/de/wireguard.po b/package/luci/applications/luci-app-wireguard/po/de/wireguard.po deleted file mode 100644 index 4151a5d2a2..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/de/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-02-24 06:56+0000\n" -"Last-Translator: Christoph Loesch \n" -"Language-Team: German \n" -"Language: de\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d Stunden zuvor" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d Minuten zuvor" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d Sekunden zuvor" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Erlaubte IP-Adressen" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Daten erhalten" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Daten gesendet" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Endpunkt" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Firewall Mark" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Zugriff auf die LuCI-App wireguard gewähren" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Letztes Handshake" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Listening-Port" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Niemals" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Keine WireGuard-Schnittstellen konfiguriert." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Keine Peer-Informationen verfügbar" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Partner" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Verbindung aufrechterhalten (Persistent Keepalive)" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Öffentlicher Schlüssel" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "WireGuard-Status" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "seit über einem Tag" diff --git a/package/luci/applications/luci-app-wireguard/po/el/wireguard.po b/package/luci/applications/luci-app-wireguard/po/el/wireguard.po deleted file mode 100644 index 2acd2831b7..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/el/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-03-25 12:08+0000\n" -"Last-Translator: MarioK239 \n" -"Language-Team: Greek \n" -"Language: el\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d ώρες πριν" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d λεπτά πριν" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d δευτερόλεπτα πριν" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Επιτρεπόμενες IPs" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Ληφθέντα δεδομένα" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Απεσταλμένα δεδομένα" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Τελικό σημείο" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Σημάδι τείχους προστασίας" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Παραχωρήστε πρόσβαση στην εφαρμογή LuCI Wireguard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Τελευταία Χειραψία" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Θύρα ακρόασης" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Ποτέ" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Δεν έχουν διαμορφωθεί διεπαφές WireGuard." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Δεν υπάρχουν διαθέσιμες πληροφορίες ομοτίμων" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Ομότιμοι" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Συνεχής διατήρηση σύνδεσης" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Δημόσιο κλειδί" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Κατάσταση του WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "πλέον της μιας ημέρας" diff --git a/package/luci/applications/luci-app-wireguard/po/en/wireguard.po b/package/luci/applications/luci-app-wireguard/po/en/wireguard.po deleted file mode 100644 index 55cd33a943..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/en/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-01-07 17:03+0000\n" -"Last-Translator: Liao junchao \n" -"Language-Team: English \n" -"Language: en\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4.1-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "" diff --git a/package/luci/applications/luci-app-wireguard/po/es/wireguard.po b/package/luci/applications/luci-app-wireguard/po/es/wireguard.po deleted file mode 100644 index 85eae1d5bf..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/es/wireguard.po +++ /dev/null @@ -1,95 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: 2022-04-04 16:09+0000\n" -"Last-Translator: Franco Castillo \n" -"Language-Team: Spanish \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "hace %dh" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "hace %dm" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "hace %ds" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "IPs permitidas" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Datos recibidos" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Datos transmitidos" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Punto final" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Marca de Cortafuegos" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Otorgar acceso a la app de LuCI WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Último Handshake" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Puerto de escucha" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Nunca" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "No se han configurado interfaces WireGuard." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "No hay información de pares disponible" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Pares" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Mantener conectado continuamente" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Clave pública" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Estado de WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "hace más de un día" diff --git a/package/luci/applications/luci-app-wireguard/po/fi/wireguard.po b/package/luci/applications/luci-app-wireguard/po/fi/wireguard.po deleted file mode 100644 index d6d1efe339..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/fi/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-03-12 13:29+0000\n" -"Last-Translator: Jiri Grönroos \n" -"Language-Team: Finnish \n" -"Language: fi\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d h sitten" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d min sitten" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d s sitten" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Sallitut IP:t" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Dataa vastaanotettu" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Dataa lähetetty" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Päätepiste" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Palomuurimerkintä" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Viimeisin kättely" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Kuunteluportti" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Ei ikinä" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "WireGuard-sovittimia ei ole määritetty." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Vertaistietoja ei ole saatavilla" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Vertaiset" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Pysyvä Keepalive" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Julkinen avain" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "WireGuardin tila" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "yli päivä sitten" diff --git a/package/luci/applications/luci-app-wireguard/po/fr/wireguard.po b/package/luci/applications/luci-app-wireguard/po/fr/wireguard.po deleted file mode 100644 index e0d2b85a7a..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/fr/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-02-02 16:56+0000\n" -"Last-Translator: ButterflyOfFire \n" -"Language-Team: French \n" -"Language: fr\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.11-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%dh passée" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%dm passée" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%ds passée" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "IP autorisées" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Donnée reçue" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Données transmises" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Point d'arrivée" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Marque du Pare-feu" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Autoriser l'accès à l'application LuCI wireguard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Dernière poignée de main" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Port d'écoute" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Jamais" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Aucune interface WireGuard configurée." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Aucune information sur les pairs n’est disponible" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Pairs" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "KeepAlive persistant" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Clé publique" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "État de WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "il y a plus d'un jour" diff --git a/package/luci/applications/luci-app-wireguard/po/he/wireguard.po b/package/luci/applications/luci-app-wireguard/po/he/wireguard.po deleted file mode 100644 index 0bab048790..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/he/wireguard.po +++ /dev/null @@ -1,93 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2020-10-17 15:26+0000\n" -"Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew \n" -"Language: he\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " -"n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 4.3.1-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "כתובות IP מורשות" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "התקבלו נתונים" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "הועברו נתונים" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "נקודת קצה" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "סימן חומת אש" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "לחיצת יד אחרונה" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "פתחת האזנה" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "אף פעם" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "מפתח ציבורי" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "מצב WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "לפני למעלה מיום" diff --git a/package/luci/applications/luci-app-wireguard/po/hi/wireguard.po b/package/luci/applications/luci-app-wireguard/po/hi/wireguard.po deleted file mode 100644 index f0fb70e407..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/hi/wireguard.po +++ /dev/null @@ -1,86 +0,0 @@ -msgid "" -msgstr "" -"Language: hi\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "" diff --git a/package/luci/applications/luci-app-wireguard/po/hu/wireguard.po b/package/luci/applications/luci-app-wireguard/po/hu/wireguard.po deleted file mode 100644 index 4c1736acc0..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/hu/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2020-03-31 13:27+0000\n" -"Last-Translator: Tamas Szanto \n" -"Language-Team: Hungarian \n" -"Language: hu\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d órával ezelőtt" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d perccel ezelőtt" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d másodperccel ezelőtt" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Engedélyezett IP-k" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Fogadott adat" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Átvitt adat" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Végpont" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Tűzfal jelölés" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Utolsó kapcsolatfelvétel" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Fogadó port" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Soha" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Megmaradó keepalive" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Nyilvános kulcs" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "WireGuard állapot" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "több mint egy nappal ezelőtt" diff --git a/package/luci/applications/luci-app-wireguard/po/id/wireguard.po b/package/luci/applications/luci-app-wireguard/po/id/wireguard.po deleted file mode 100644 index 408b3b43bd..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/id/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-08-11 05:53+0000\n" -"Last-Translator: KanekoHato \n" -"Language-Team: Indonesian \n" -"Language: id\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d jam yang lalu" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d menit yang lalu" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d detik yang lalu" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "IP yang Diizinkan" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Data Diterima" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Data Ditransmisikan" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Titik akhir" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Tanda Firewall" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Ijinkan akses ke wireguard applikasi LuCI" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Handshake Terbaru" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Port untuk Didengarkan" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Tidak pernah" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Tidak ada antarmuka WireGuard yang ter konfigurasi." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Tidak ada informasi peer yang tersedia" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Peers" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Keepalive Persisten" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Kunci Publik" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Status WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "lebih dari sehari yang lalu" diff --git a/package/luci/applications/luci-app-wireguard/po/it/wireguard.po b/package/luci/applications/luci-app-wireguard/po/it/wireguard.po deleted file mode 100644 index 377b3ea995..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/it/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-04-15 15:09+0000\n" -"Last-Translator: G R \n" -"Language-Team: Italian \n" -"Language: it\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%dore fa" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%dmin fa" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%dsec fa" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "IP permessi" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Dati ricevuti" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Dati trasmessi" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Punto finale" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Marcatore firewall" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Concedere l'accesso all'app LuCI wireguard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Ultimo handshake" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Porta in ascolto" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Mai" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Nessuna interfaccia WireGuard configurata." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Nessuna informazione disponibile sui peer" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Peer" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "KeepAlive persistente" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Chiave pubblica" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Stato WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "più di un giorno fa" diff --git a/package/luci/applications/luci-app-wireguard/po/ja/wireguard.po b/package/luci/applications/luci-app-wireguard/po/ja/wireguard.po deleted file mode 100644 index 64bd8337ed..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/ja/wireguard.po +++ /dev/null @@ -1,96 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: 2020-12-06 13:43+0000\n" -"Last-Translator: Ryota <21ryotagamer@gmail.com>\n" -"Language-Team: Japanese \n" -"Language: ja\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.4-dev\n" -"X-Poedit-Basepath: .\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d時間前" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d分前" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d秒前" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "許可されたIP" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "受信済みデータ" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "送信済みデータ" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "エンドポイント" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "ファイアウォールマーク" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "最新のハンドシェイク" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "リッスンポート" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "なし" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "永続的なキープアライブ" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "公開鍵" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "WireGuard ステータス" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "1日以上前" diff --git a/package/luci/applications/luci-app-wireguard/po/ko/wireguard.po b/package/luci/applications/luci-app-wireguard/po/ko/wireguard.po deleted file mode 100644 index 891e27631b..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/ko/wireguard.po +++ /dev/null @@ -1,93 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2020-07-28 17:55+0000\n" -"Last-Translator: TheNoFace \n" -"Language-Team: Korean \n" -"Language: ko\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.2-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d시간 전" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d분 전" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d초 전" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "허용된 IP" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "받은 데이터" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "보낸 데이터" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "마지막 핸드셰이크" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "접근 포트" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "안함" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "공개 키" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -#, fuzzy -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "WireGuard 상태" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "ë©°ì¹  전" diff --git a/package/luci/applications/luci-app-wireguard/po/mr/wireguard.po b/package/luci/applications/luci-app-wireguard/po/mr/wireguard.po deleted file mode 100644 index fcc9dff561..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/mr/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2020-01-29 10:50+0000\n" -"Last-Translator: Prachi Joshi \n" -"Language-Team: Marathi \n" -"Language: mr\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 3.11-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "" diff --git a/package/luci/applications/luci-app-wireguard/po/ms/wireguard.po b/package/luci/applications/luci-app-wireguard/po/ms/wireguard.po deleted file mode 100644 index cd172f442d..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/ms/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-03-31 12:26+0000\n" -"Last-Translator: Faruki Ramly \n" -"Language-Team: Malay \n" -"Language: ms\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.6-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "" diff --git a/package/luci/applications/luci-app-wireguard/po/nb_NO/wireguard.po b/package/luci/applications/luci-app-wireguard/po/nb_NO/wireguard.po deleted file mode 100644 index 4b7829c3fb..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/nb_NO/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-09-27 22:36+0000\n" -"Last-Translator: Allan Nordhøy \n" -"Language-Team: Norwegian BokmÃ¥l \n" -"Language: nb_NO\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Tillatte IP-er" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Lytteport" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "" diff --git a/package/luci/applications/luci-app-wireguard/po/pl/wireguard.po b/package/luci/applications/luci-app-wireguard/po/pl/wireguard.po deleted file mode 100644 index 6346842a0a..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/pl/wireguard.po +++ /dev/null @@ -1,93 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-10-14 04:08+0000\n" -"Last-Translator: Matthaiks \n" -"Language-Team: Polish \n" -"Language: pl\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d godzin temu" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%dm temu" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "$d sekund temu" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Dozwolone IP" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Otrzymane dane" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Przesyłane dane" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Punkt końcowy" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Znacznik zapory sieciowej" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Przyznaj dostęp do aplikacji LuCI WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Ostatni handshake" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Port nasłuchiwania" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Nigdy" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Brak skonfigurowanych interfejsów WireGuard." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Brak dostępnych informacji o peerach" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Peery" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Trwale trzymaj przy życiu" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Klucz publiczny" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Status WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "ponad dzień temu" diff --git a/package/luci/applications/luci-app-wireguard/po/pt/wireguard.po b/package/luci/applications/luci-app-wireguard/po/pt/wireguard.po deleted file mode 100644 index 2555166aeb..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/pt/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-11-27 23:39+0000\n" -"Last-Translator: ssantos \n" -"Language-Team: Portuguese \n" -"Language: pt\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.10-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%dh atrás" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%dm atrás" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%ds atrás" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Endereços IP autorizados" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Dados Recebidos" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Dados Transmitidos" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Ponto final" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Marca da Firewall" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Conceder acesso à app LuCI wireguard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Último Aperto de Mão" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Porta de escuta" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Nunca" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Nenhuma interface WireGuard foi configurada." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Nenhuma informação dos pares está disponível" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Pares" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Keepalive Persistente" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Chave Pública" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Estado do WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "mais de um dia atrás" diff --git a/package/luci/applications/luci-app-wireguard/po/pt_BR/wireguard.po b/package/luci/applications/luci-app-wireguard/po/pt_BR/wireguard.po deleted file mode 100644 index 4b1bea3fbd..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/pt_BR/wireguard.po +++ /dev/null @@ -1,95 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: 2021-11-27 23:39+0000\n" -"Last-Translator: Wellington Terumi Uemura \n" -"Language-Team: Portuguese (Brazil) \n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.10-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d horas atrás" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d meses atrás" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d segundos atrás" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Endereços IP autorizados" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Dados Recebidos" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Dados Enviados" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Endpoint" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Marca do firewall" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Conceda acesso ao aplicativo LuCI wireguard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Última Negociação" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Porta de escuta" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Nunca" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Nenhuma interface WireGuard foi configurada." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Nenhuma informação dos pares está disponível" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Pares" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Manter as Conexões Abertas (Keepalive)" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Chave Pública" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Condição Geral do WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "mais de um dia atrás" diff --git a/package/luci/applications/luci-app-wireguard/po/ro/wireguard.po b/package/luci/applications/luci-app-wireguard/po/ro/wireguard.po deleted file mode 100644 index 9d337ddc64..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/ro/wireguard.po +++ /dev/null @@ -1,93 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-12-07 14:52+0000\n" -"Last-Translator: Simona Iacob \n" -"Language-Team: Romanian \n" -"Language: ro\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " -"20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.10-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%dh în urmă" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%dm în urmă" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%ds în urmă" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "IP-uri permise" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Date primite" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Date transmise" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Punct final" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Marca Firewall" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Acordă acces la aplicația LuCI wireguard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Cea mai recentă strângere de mână" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Port de ascultare" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Niciodată" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Nu sunt configurate interfețe WireGuard." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Nu sunt disponibile informații de la egal la egal" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Perechi" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Keepalive persistent" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Cheia publică" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Starea WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "cu peste o zi în urmă" diff --git a/package/luci/applications/luci-app-wireguard/po/ru/wireguard.po b/package/luci/applications/luci-app-wireguard/po/ru/wireguard.po deleted file mode 100644 index 2aef66832d..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/ru/wireguard.po +++ /dev/null @@ -1,98 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: LuCI: wireguard\n" -"POT-Creation-Date: 2018-01-01 21:00+0300\n" -"PO-Revision-Date: 2021-12-22 14:41+0000\n" -"Last-Translator: Alexey \n" -"Language-Team: Russian \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.10.1\n" -"Project-Info: Это технический перевод, не дословный. Главное-удобный русский " -"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d ч. назад" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d мин. назад" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d сек. назад" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Разрешенные IP-адреса" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Полученные данные" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Переданные данные" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Конечная точка" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Метка межсетевого экрана" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Предоставить доступ к приложению LuCI Wireguard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Последнее «рукопожатие» (handshake)" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Порт для входящих соединений" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Никогда" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Интерфейсы WireGuard не настроены." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Информация об узле (peer) отсутствует" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Узлы (peers)" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Постоянные проверки активности (keepalive)" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Публичный ключ" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Состояние WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "более суток назад" diff --git a/package/luci/applications/luci-app-wireguard/po/sk/wireguard.po b/package/luci/applications/luci-app-wireguard/po/sk/wireguard.po deleted file mode 100644 index a2cc90fa3a..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/sk/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2020-04-04 17:35+0000\n" -"Last-Translator: DuÅ¡an Kazik \n" -"Language-Team: Slovak \n" -"Language: sk\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.0-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Povolené IP adresy" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Načúvací port" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Verejný kľúč" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "" diff --git a/package/luci/applications/luci-app-wireguard/po/sv/wireguard.po b/package/luci/applications/luci-app-wireguard/po/sv/wireguard.po deleted file mode 100644 index b82d9e3159..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/sv/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-11-04 17:37+0000\n" -"Last-Translator: Paul Dee \n" -"Language-Team: Swedish \n" -"Language: sv\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%dt sedan" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%dm sedan" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%ds sedan" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "TillÃ¥tna IP-adresser" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Mottagen data" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Överförd data" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Slutpunkt" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Brandväggsmarkering" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Bevilja Ã¥tkomst till LuCI-appen wireguard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Senaste handskakning" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Lyssningsport" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Aldrig" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Motpart" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "HÃ¥lla vid liv ständigt" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Publik nyckel" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Status för WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "över en dag sedan" diff --git a/package/luci/applications/luci-app-wireguard/po/templates/wireguard.pot b/package/luci/applications/luci-app-wireguard/po/templates/wireguard.pot deleted file mode 100644 index 1075263f36..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/templates/wireguard.pot +++ /dev/null @@ -1,83 +0,0 @@ -msgid "" -msgstr "Content-Type: text/plain; charset=UTF-8" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "" diff --git a/package/luci/applications/luci-app-wireguard/po/tr/wireguard.po b/package/luci/applications/luci-app-wireguard/po/tr/wireguard.po deleted file mode 100644 index dd40491917..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/tr/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-11-29 16:08+0000\n" -"Last-Translator: ToldYouThat \n" -"Language-Team: Turkish \n" -"Language: tr\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d sa önce" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d dak önce" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d sn önce" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Ä°zin verilen IP adresleri" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Alınan Veriler" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Ä°letilen Veriler" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Bitiş Noktası" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Güvenlik Duvarı İşareti" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "LuCI uygulaması wireguard'a erişim izni verin" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Son El Sıkışma" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Dinleme Bağlantı Noktası" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Asla" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Yapılandırılmış bir WireGuard arabirimi yok." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Kullanılabilir eş bilgisi yok" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Eşler" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Sürekli Canlı Tut" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Ortak Anahtar" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "WireGuard Durumu" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "bir günden daha önce" diff --git a/package/luci/applications/luci-app-wireguard/po/uk/wireguard.po b/package/luci/applications/luci-app-wireguard/po/uk/wireguard.po deleted file mode 100644 index 3d72df47f4..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/uk/wireguard.po +++ /dev/null @@ -1,93 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-04-15 15:09+0000\n" -"Last-Translator: Vladdrako \n" -"Language-Team: Ukrainian \n" -"Language: uk\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.12-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%dг тому" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%dхв тому" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%dс тому" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "Дозволено IP-адреси" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "Отримані дані" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "Передані дані" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "Кінцева точка" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "Позначка брандмауера" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "Надання доступу до дротового охоронця програми LuCI" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "Останнє рукостискання" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "Порти прослуховування" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "Ніколи" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "Інтерфейси WireGuard не налаштовано." - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "Інформація про вузол (peer) відсутня" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "Вузли (peers)" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Постійне утримання" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "Відкритий ключ" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "Стан WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "більше доби тому" diff --git a/package/luci/applications/luci-app-wireguard/po/vi/wireguard.po b/package/luci/applications/luci-app-wireguard/po/vi/wireguard.po deleted file mode 100644 index dece017b15..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/vi/wireguard.po +++ /dev/null @@ -1,92 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2020-11-21 12:21+0000\n" -"Last-Translator: Darias \n" -"Language-Team: Vietnamese \n" -"Language: vi\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.4-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "" diff --git a/package/luci/applications/luci-app-wireguard/po/zh_Hans/wireguard.po b/package/luci/applications/luci-app-wireguard/po/zh_Hans/wireguard.po deleted file mode 100644 index 98f69507d0..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/zh_Hans/wireguard.po +++ /dev/null @@ -1,98 +0,0 @@ -# -# Yangfl , 2018-2019. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: 2021-11-27 23:39+0000\n" -"Last-Translator: Eric \n" -"Language-Team: Chinese (Simplified) \n" -"Language: zh_Hans\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.10-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d小时前" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d分钟前" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d秒前" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "允许的 IP" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "已接收" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "已发送" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "传输端点" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "防火墙标识" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "将权限授予 LuCI 应用 wireguard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "上次握手" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "监听端口" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "永不" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "未配置 WireGuard 接口。" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "无对端信息可用" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "对端" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Keepalive 间隔(秒)" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "公钥" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "WireGuard 状态" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "超过一天前" diff --git a/package/luci/applications/luci-app-wireguard/po/zh_Hant/wireguard.po b/package/luci/applications/luci-app-wireguard/po/zh_Hant/wireguard.po deleted file mode 100644 index 395a928b0c..0000000000 --- a/package/luci/applications/luci-app-wireguard/po/zh_Hant/wireguard.po +++ /dev/null @@ -1,98 +0,0 @@ -# -# Yangfl , 2018-2019. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: 2022-02-05 09:21+0000\n" -"Last-Translator: Hulen \n" -"Language-Team: Chinese (Traditional) \n" -"Language: zh_Hant\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.11-dev\n" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:25 -msgid "%dh ago" -msgstr "%d小時前" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:23 -msgid "%dm ago" -msgstr "%d分鐘前" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:21 -msgid "%ds ago" -msgstr "%d秒前" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:117 -msgid "Allowed IPs" -msgstr "允許的 IP群" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:123 -msgid "Data Received" -msgstr "已接收" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 -msgid "Data Transmitted" -msgstr "已傳送" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:115 -msgid "Endpoint" -msgstr "傳輸端點" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:106 -msgid "Firewall Mark" -msgstr "防火牆遮罩" - -#: applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json:3 -msgid "Grant access to LuCI app wireguard" -msgstr "將權限授與 LuCI 應用 wireguard" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:121 -msgid "Latest Handshake" -msgstr "上次握手" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:104 -msgid "Listen Port" -msgstr "監聽連接埠" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:15 -msgid "Never" -msgstr "永不" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:214 -msgid "No WireGuard interfaces configured." -msgstr "未設定 WireGuard 介面。" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:94 -msgid "No peer information available" -msgstr "無對等資訊可用" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:205 -msgid "Peers" -msgstr "對等" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:119 -msgid "Persistent Keepalive" -msgstr "Keepalive 間隔(秒)" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:102 -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:113 -msgid "Public Key" -msgstr "公鑰" - -#: applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json:3 -msgid "WireGuard" -msgstr "WireGuard VPN" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:179 -msgid "WireGuard Status" -msgstr "WireGuard 狀態" - -#: applications/luci-app-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:27 -msgid "over a day ago" -msgstr "超過一天前" diff --git a/package/luci/applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json b/package/luci/applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json deleted file mode 100644 index 02cdb5e871..0000000000 --- a/package/luci/applications/luci-app-wireguard/root/usr/share/luci/menu.d/luci-app-wireguard.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "admin/status/wireguard": { - "title": "WireGuard", - "order": 92, - "action": { - "type": "view", - "path": "wireguard/status" - }, - "depends": { - "acl": [ "luci-app-wireguard" ], - "uci": { "network": true } - } - } -} diff --git a/package/luci/applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json b/package/luci/applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json deleted file mode 100644 index cd38bcf8ec..0000000000 --- a/package/luci/applications/luci-app-wireguard/root/usr/share/rpcd/acl.d/luci-app-wireguard.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "luci-app-wireguard": { - "description": "Grant access to LuCI app wireguard", - "read": { - "ubus": { - "luci.wireguard": [ - "getWgInstances" - ] - } - } - } -} diff --git a/package/luci/build/i18n-scan.pl b/package/luci/build/i18n-scan.pl index 0374b6d872..da7a944b96 100755 --- a/package/luci/build/i18n-scan.pl +++ b/package/luci/build/i18n-scan.pl @@ -4,6 +4,7 @@ use strict; use warnings; use IPC::Open2; use POSIX; +use Text::Balanced qw(gen_extract_tagged); $ENV{'LC_ALL'} = 'C'; POSIX::setlocale(POSIX::LC_ALL, 'C'); @@ -13,6 +14,8 @@ POSIX::setlocale(POSIX::LC_ALL, 'C'); my %keywords = ( '.js' => [ '_:1', '_:1,2c', 'N_:2,3', 'N_:2,3,4c' ], + '.ut' => [ '_:1', '_:1,2c', 'N_:2,3', 'N_:2,3,4c' ], + '.uc' => [ '_:1', '_:1,2c', 'translate:1', 'translate:1,2c', 'N_:2,3', 'N_:2,3,4c', 'ntranslate:2,3', 'ntranslate:2,3,4c' ], '.lua' => [ '_:1', '_:1,2c', 'translate:1', 'translate:1,2c', 'translatef:1', 'N_:2,3', 'N_:2,3,4c', 'ntranslate:2,3', 'ntranslate:2,3,4c' ], '.htm' => [ '_:1', '_:1,2c', 'translate:1', 'translate:1,2c', 'translatef:1', 'N_:2,3', 'N_:2,3,4c', 'ntranslate:2,3', 'ntranslate:2,3,4c' ], '.json' => [ '_:1', '_:1,2c' ] @@ -27,7 +30,7 @@ sub xgettext($@) { if ($ext eq '.htm' || $ext eq '.lua') { push @cmd, '--language=Lua'; } - elsif ($ext eq '.js' || $ext eq '.json') { + elsif ($ext eq '.ut' || $ext eq '.uc' || $ext eq '.js' || $ext eq '.json') { push @cmd, '--language=JavaScript'; } @@ -153,6 +156,59 @@ sub preprocess_htm($$) { return ("[==[$source]==]", @extra_function_keywords); } +sub preprocess_ut($$) { + my ($path, $source) = @_; + + # Translate the .ut source into valid JavaScript code by enclosing template text + # in multiline comments and extracting blocks as plain code. + my $comt = gen_extract_tagged('{#', '#}', '(?s).*?(?=\{[#{%])'); + my $expr = gen_extract_tagged('{{', '}}', '(?s).*?(?=\{[#{%])'); + my $stmt = gen_extract_tagged('{%', '%}', '(?s).*?(?=\{[#{%])'); + + my $res = ''; + + while (length($source)) { + my ($block, $remain, $prefix); + + ($block, $remain, $prefix) = $comt->($source); + ($block, $remain, $prefix) = $expr->($source) unless defined $block; + ($block, $remain, $prefix) = $stmt->($source) unless defined $block; + + last unless defined $block; + + $source = $remain; + + $prefix =~ s!\*/!*\\/!g; + $res .= '/*' . $prefix . '*/'; + + if ($block =~ s!^\{#(.*)#}$!$1!s) { + $block =~ s!\*/!*\\/!g; + $res .= '/*' . $block . '*/'; + } + elsif ($block =~ s!^\{\{(.*)}}$!$1!s) { + $block =~ s!^[+-]!!; + $block =~ s![+-]$!!; + $res .= '(' . $block . ')'; + } + elsif ($block =~ s!^\{%(.*)%}$!$1!s) { + $block =~ s!^[+-]!!; + $block =~ s![+-]$!!; + $res .= '{' . $block . '}'; + } + } + + if ($source =~ m!^(.*)\{%[+-]?(.*)$!s) { + my $prefix = $1; + my $block = $2; + + $prefix =~ s!\*/!*\\/!g; + $res .= '/*' . $prefix . '*/'; + $res .= '{' . $block . '}'; + } + + return ($res); +} + sub preprocess_lua($$) { my ($path, $source) = @_; @@ -181,7 +237,7 @@ my $msguniq_pid = open2($msguniq_out, $msguniq_in, 'msguniq', '-s'); print $msguniq_in "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n"; -if (open F, "find @ARGV -type f '(' -name '*.htm' -o -name '*.lua' -o -name '*.js' -o -path '*/menu.d/*.json' -o -path '*/acl.d/*.json' -o -path '*/statistics/plugins/*.json' ')' |") +if (open F, "find @ARGV -type f '(' -name '*.htm' -o -name '*.lua' -o -name '*.js' -o -name '*.uc' -o -name '*.ut' -o -path '*/menu.d/*.json' -o -path '*/acl.d/*.json' -o -path '*/statistics/plugins/*.json' ')' |") { while (defined( my $file = readline F)) { @@ -197,6 +253,10 @@ if (open F, "find @ARGV -type f '(' -name '*.htm' -o -name '*.lua' -o -name '*.j { ($source, @extra_function_keywords) = preprocess_htm($file, $source); } + elsif ($file =~ m!\.ut$!) + { + ($source, @extra_function_keywords) = preprocess_ut($file, $source); + } elsif ($file =~ m!\.lua$!) { ($source, @extra_function_keywords) = preprocess_lua($file, $source); diff --git a/package/luci/build/mkbasepot.sh b/package/luci/build/mkbasepot.sh index 0f9247536b..d59a151d6a 100755 --- a/package/luci/build/mkbasepot.sh +++ b/package/luci/build/mkbasepot.sh @@ -8,7 +8,7 @@ echo -n "Updating modules/luci-base/po/templates/base.pot ... " ./build/i18n-scan.pl \ - modules/luci-base/ modules/luci-compat/ modules/luci-mod-admin-full/ \ + modules/luci-base/ modules/luci-compat/ modules/luci-lua-runtime/ \ modules/luci-mod-network modules/luci-mod-status modules/luci-mod-system/ \ protocols/ themes/ \ > modules/luci-base/po/templates/base.pot diff --git a/package/luci/build/zoneinfo2ucode.pl b/package/luci/build/zoneinfo2ucode.pl new file mode 100755 index 0000000000..941255f2f4 --- /dev/null +++ b/package/luci/build/zoneinfo2ucode.pl @@ -0,0 +1,93 @@ +#!/usr/bin/perl +# zoneinfo2ucode.pl - Make ucode module from /usr/share/zoneinfo +# Execute from within root of Luci feed, usually feeds/luci + +use strict; + +my %TZ; + +my $tzdin = $ARGV[0] || "/usr/share/zoneinfo"; +my $tzdout = $ARGV[1] || "./modules/luci-base/ucode/zoneinfo.uc"; + +local $/ = "\012"; +open( ZTAB, "< $tzdin/zone.tab" ) || die "open($tzdin/zone.tab): $!"; + +while( ! eof ZTAB ) { + chomp( my $line = readline ZTAB ); + next if $line =~ /^#/ || $line =~ /^\s+$/; + + my ( undef, undef, $zone, @comment ) = split /\s+/, $line; + + printf STDERR "%-40s", $zone; + + if( open ZONE, "< $tzdin/$zone" ) { + seek ZONE, -2, 2; + + while( tell(ZONE) > 0 ) { + read ZONE, my $char, 1; + ( $char eq "\012" ) ? last : seek ZONE, -2, 1; + } + + chomp( my $tz = readline ZONE ); + print STDERR ( $tz || "(no tzinfo found)" ), "\n"; + close ZONE; + + if( $tz ) { + $zone =~ s/_/ /g; + $TZ{$zone} = $tz; + } + } + else + { + print STDERR "open($tzdin/$zone): $!\n"; + } +} + +close ZTAB; + +# Add Etc/GMT zones from manually as they are not in zone.tab +$TZ{"Etc/GMT"} = "GMT0"; +$TZ{"Etc/GMT-1"} = "<+01>-1"; +$TZ{"Etc/GMT-2"} = "<+02>-2"; +$TZ{"Etc/GMT-3"} = "<+03>-3"; +$TZ{"Etc/GMT-4"} = "<+04>-4"; +$TZ{"Etc/GMT-5"} = "<+05>-5"; +$TZ{"Etc/GMT-6"} = "<+06>-6"; +$TZ{"Etc/GMT-7"} = "<+07>-7"; +$TZ{"Etc/GMT-8"} = "<+08>-8"; +$TZ{"Etc/GMT-9"} = "<+09>-9"; +$TZ{"Etc/GMT-10"} = "<+10>-10"; +$TZ{"Etc/GMT-11"} = "<+11>-11"; +$TZ{"Etc/GMT-12"} = "<+12>-12"; +$TZ{"Etc/GMT-13"} = "<+13>-13"; +$TZ{"Etc/GMT-14"} = "<+14>-14"; +$TZ{"Etc/GMT+1"} = "<-01>1"; +$TZ{"Etc/GMT+2"} = "<-02>2"; +$TZ{"Etc/GMT+3"} = "<-03>3"; +$TZ{"Etc/GMT+4"} = "<-04>4"; +$TZ{"Etc/GMT+5"} = "<-05>5"; +$TZ{"Etc/GMT+6"} = "<-06>6"; +$TZ{"Etc/GMT+7"} = "<-07>7"; +$TZ{"Etc/GMT+8"} = "<-08>8"; +$TZ{"Etc/GMT+9"} = "<-09>9"; +$TZ{"Etc/GMT+10"} = "<-10>10"; +$TZ{"Etc/GMT+11"} = "<-11>11"; +$TZ{"Etc/GMT+12"} = "<-12>12"; + +open(O, "> $tzdout") || die "open($tzdout): $!\n"; + +print STDERR "Writing time zones to $tzdout ... "; +print O < + +include $(INCLUDE_DIR)/package.mk + +define Package/ucode-mod-html + SECTION:=utils + CATEGORY:=Utilities + TITLE:=ucode HTML utility library + DEPENDS:=+libucode +endef + +define Package/ucode-mod-html/install + $(INSTALL_DIR) $(1)/usr/lib/ucode + $(CP) $(PKG_BUILD_DIR)/html.so $(1)/usr/lib/ucode/ +endef + +define Build/Configure +endef + +define Build/Compile + $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) $(FPIC) \ + -Wall -ffunction-sections -Wl,--gc-sections -shared \ + -o $(PKG_BUILD_DIR)/html.so $(PKG_BUILD_DIR)/html.c +endef + +$(eval $(call BuildPackage,ucode-mod-html)) diff --git a/package/luci/contrib/package/ucode-mod-html/src/html.c b/package/luci/contrib/package/ucode-mod-html/src/html.c new file mode 100644 index 0000000000..76214ec9f9 --- /dev/null +++ b/package/luci/contrib/package/ucode-mod-html/src/html.c @@ -0,0 +1,2794 @@ +/* + * Copyright (C) 2022 Jo-Philipp Wich + * + * 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. + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include + +#include "ucode/module.h" + + +typedef enum { + T_TEXT, + T_RAW, + T_OPEN, + T_ATTR, + T_CLOSE, + T_COMMENT, + T_CDATA, + T_PROCINST, + T_EOF +} html_token_type_t; + +typedef bool (*html_token_callback_t)(html_token_type_t, const char *, size_t, void *); + + +/* The array below encodes all named character entities as specified in + * https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references + * + * Format of value is: + * bit 0 - 20: value of second unicode codepoint + * bit 21 - 31: unused + * bit 32 - 53: value of first unicode codepoint + * bit 54 - 62: unused + * bit 63: flag indicating whether semicolon is mandatory + * + * The array is pre-ordered to allow for efficient binary search. + */ +static const struct { const char *name; uint64_t value; } named_char_refs[] = { + { "AElig", 0x000000c600000000ULL }, + { "AMP", 0x0000002600000000ULL }, + { "Aacute", 0x000000c100000000ULL }, + { "Abreve", 0x8000010200000000ULL }, + { "Acirc", 0x000000c200000000ULL }, + { "Acy", 0x8000041000000000ULL }, + { "Afr", 0x8001d50400000000ULL }, + { "Agrave", 0x000000c000000000ULL }, + { "Alpha", 0x8000039100000000ULL }, + { "Amacr", 0x8000010000000000ULL }, + { "And", 0x80002a5300000000ULL }, + { "Aogon", 0x8000010400000000ULL }, + { "Aopf", 0x8001d53800000000ULL }, + { "ApplyFunction", 0x8000206100000000ULL }, + { "Aring", 0x000000c500000000ULL }, + { "Ascr", 0x8001d49c00000000ULL }, + { "Assign", 0x8000225400000000ULL }, + { "Atilde", 0x000000c300000000ULL }, + { "Auml", 0x000000c400000000ULL }, + { "Backslash", 0x8000221600000000ULL }, + { "Barv", 0x80002ae700000000ULL }, + { "Barwed", 0x8000230600000000ULL }, + { "Bcy", 0x8000041100000000ULL }, + { "Because", 0x8000223500000000ULL }, + { "Bernoullis", 0x8000212c00000000ULL }, + { "Beta", 0x8000039200000000ULL }, + { "Bfr", 0x8001d50500000000ULL }, + { "Bopf", 0x8001d53900000000ULL }, + { "Breve", 0x800002d800000000ULL }, + { "Bscr", 0x8000212c00000000ULL }, + { "Bumpeq", 0x8000224e00000000ULL }, + { "CHcy", 0x8000042700000000ULL }, + { "COPY", 0x000000a900000000ULL }, + { "Cacute", 0x8000010600000000ULL }, + { "Cap", 0x800022d200000000ULL }, + { "CapitalDifferentialD", 0x8000214500000000ULL }, + { "Cayleys", 0x8000212d00000000ULL }, + { "Ccaron", 0x8000010c00000000ULL }, + { "Ccedil", 0x000000c700000000ULL }, + { "Ccirc", 0x8000010800000000ULL }, + { "Cconint", 0x8000223000000000ULL }, + { "Cdot", 0x8000010a00000000ULL }, + { "Cedilla", 0x800000b800000000ULL }, + { "CenterDot", 0x800000b700000000ULL }, + { "Cfr", 0x8000212d00000000ULL }, + { "Chi", 0x800003a700000000ULL }, + { "CircleDot", 0x8000229900000000ULL }, + { "CircleMinus", 0x8000229600000000ULL }, + { "CirclePlus", 0x8000229500000000ULL }, + { "CircleTimes", 0x8000229700000000ULL }, + { "ClockwiseContourIntegral", 0x8000223200000000ULL }, + { "CloseCurlyDoubleQuote", 0x8000201d00000000ULL }, + { "CloseCurlyQuote", 0x8000201900000000ULL }, + { "Colon", 0x8000223700000000ULL }, + { "Colone", 0x80002a7400000000ULL }, + { "Congruent", 0x8000226100000000ULL }, + { "Conint", 0x8000222f00000000ULL }, + { "ContourIntegral", 0x8000222e00000000ULL }, + { "Copf", 0x8000210200000000ULL }, + { "Coproduct", 0x8000221000000000ULL }, + { "CounterClockwiseContourIntegral", 0x8000223300000000ULL }, + { "Cross", 0x80002a2f00000000ULL }, + { "Cscr", 0x8001d49e00000000ULL }, + { "Cup", 0x800022d300000000ULL }, + { "CupCap", 0x8000224d00000000ULL }, + { "DD", 0x8000214500000000ULL }, + { "DDotrahd", 0x8000291100000000ULL }, + { "DJcy", 0x8000040200000000ULL }, + { "DScy", 0x8000040500000000ULL }, + { "DZcy", 0x8000040f00000000ULL }, + { "Dagger", 0x8000202100000000ULL }, + { "Darr", 0x800021a100000000ULL }, + { "Dashv", 0x80002ae400000000ULL }, + { "Dcaron", 0x8000010e00000000ULL }, + { "Dcy", 0x8000041400000000ULL }, + { "Del", 0x8000220700000000ULL }, + { "Delta", 0x8000039400000000ULL }, + { "Dfr", 0x8001d50700000000ULL }, + { "DiacriticalAcute", 0x800000b400000000ULL }, + { "DiacriticalDot", 0x800002d900000000ULL }, + { "DiacriticalDoubleAcute", 0x800002dd00000000ULL }, + { "DiacriticalGrave", 0x8000006000000000ULL }, + { "DiacriticalTilde", 0x800002dc00000000ULL }, + { "Diamond", 0x800022c400000000ULL }, + { "DifferentialD", 0x8000214600000000ULL }, + { "Dopf", 0x8001d53b00000000ULL }, + { "Dot", 0x800000a800000000ULL }, + { "DotDot", 0x800020dc00000000ULL }, + { "DotEqual", 0x8000225000000000ULL }, + { "DoubleContourIntegral", 0x8000222f00000000ULL }, + { "DoubleDot", 0x800000a800000000ULL }, + { "DoubleDownArrow", 0x800021d300000000ULL }, + { "DoubleLeftArrow", 0x800021d000000000ULL }, + { "DoubleLeftRightArrow", 0x800021d400000000ULL }, + { "DoubleLeftTee", 0x80002ae400000000ULL }, + { "DoubleLongLeftArrow", 0x800027f800000000ULL }, + { "DoubleLongLeftRightArrow", 0x800027fa00000000ULL }, + { "DoubleLongRightArrow", 0x800027f900000000ULL }, + { "DoubleRightArrow", 0x800021d200000000ULL }, + { "DoubleRightTee", 0x800022a800000000ULL }, + { "DoubleUpArrow", 0x800021d100000000ULL }, + { "DoubleUpDownArrow", 0x800021d500000000ULL }, + { "DoubleVerticalBar", 0x8000222500000000ULL }, + { "DownArrow", 0x8000219300000000ULL }, + { "DownArrowBar", 0x8000291300000000ULL }, + { "DownArrowUpArrow", 0x800021f500000000ULL }, + { "DownBreve", 0x8000031100000000ULL }, + { "DownLeftRightVector", 0x8000295000000000ULL }, + { "DownLeftTeeVector", 0x8000295e00000000ULL }, + { "DownLeftVector", 0x800021bd00000000ULL }, + { "DownLeftVectorBar", 0x8000295600000000ULL }, + { "DownRightTeeVector", 0x8000295f00000000ULL }, + { "DownRightVector", 0x800021c100000000ULL }, + { "DownRightVectorBar", 0x8000295700000000ULL }, + { "DownTee", 0x800022a400000000ULL }, + { "DownTeeArrow", 0x800021a700000000ULL }, + { "Downarrow", 0x800021d300000000ULL }, + { "Dscr", 0x8001d49f00000000ULL }, + { "Dstrok", 0x8000011000000000ULL }, + { "ENG", 0x8000014a00000000ULL }, + { "ETH", 0x000000d000000000ULL }, + { "Eacute", 0x000000c900000000ULL }, + { "Ecaron", 0x8000011a00000000ULL }, + { "Ecirc", 0x000000ca00000000ULL }, + { "Ecy", 0x8000042d00000000ULL }, + { "Edot", 0x8000011600000000ULL }, + { "Efr", 0x8001d50800000000ULL }, + { "Egrave", 0x000000c800000000ULL }, + { "Element", 0x8000220800000000ULL }, + { "Emacr", 0x8000011200000000ULL }, + { "EmptySmallSquare", 0x800025fb00000000ULL }, + { "EmptyVerySmallSquare", 0x800025ab00000000ULL }, + { "Eogon", 0x8000011800000000ULL }, + { "Eopf", 0x8001d53c00000000ULL }, + { "Epsilon", 0x8000039500000000ULL }, + { "Equal", 0x80002a7500000000ULL }, + { "EqualTilde", 0x8000224200000000ULL }, + { "Equilibrium", 0x800021cc00000000ULL }, + { "Escr", 0x8000213000000000ULL }, + { "Esim", 0x80002a7300000000ULL }, + { "Eta", 0x8000039700000000ULL }, + { "Euml", 0x000000cb00000000ULL }, + { "Exists", 0x8000220300000000ULL }, + { "ExponentialE", 0x8000214700000000ULL }, + { "Fcy", 0x8000042400000000ULL }, + { "Ffr", 0x8001d50900000000ULL }, + { "FilledSmallSquare", 0x800025fc00000000ULL }, + { "FilledVerySmallSquare", 0x800025aa00000000ULL }, + { "Fopf", 0x8001d53d00000000ULL }, + { "ForAll", 0x8000220000000000ULL }, + { "Fouriertrf", 0x8000213100000000ULL }, + { "Fscr", 0x8000213100000000ULL }, + { "GJcy", 0x8000040300000000ULL }, + { "GT", 0x0000003e00000000ULL }, + { "Gamma", 0x8000039300000000ULL }, + { "Gammad", 0x800003dc00000000ULL }, + { "Gbreve", 0x8000011e00000000ULL }, + { "Gcedil", 0x8000012200000000ULL }, + { "Gcirc", 0x8000011c00000000ULL }, + { "Gcy", 0x8000041300000000ULL }, + { "Gdot", 0x8000012000000000ULL }, + { "Gfr", 0x8001d50a00000000ULL }, + { "Gg", 0x800022d900000000ULL }, + { "Gopf", 0x8001d53e00000000ULL }, + { "GreaterEqual", 0x8000226500000000ULL }, + { "GreaterEqualLess", 0x800022db00000000ULL }, + { "GreaterFullEqual", 0x8000226700000000ULL }, + { "GreaterGreater", 0x80002aa200000000ULL }, + { "GreaterLess", 0x8000227700000000ULL }, + { "GreaterSlantEqual", 0x80002a7e00000000ULL }, + { "GreaterTilde", 0x8000227300000000ULL }, + { "Gscr", 0x8001d4a200000000ULL }, + { "Gt", 0x8000226b00000000ULL }, + { "HARDcy", 0x8000042a00000000ULL }, + { "Hacek", 0x800002c700000000ULL }, + { "Hat", 0x8000005e00000000ULL }, + { "Hcirc", 0x8000012400000000ULL }, + { "Hfr", 0x8000210c00000000ULL }, + { "HilbertSpace", 0x8000210b00000000ULL }, + { "Hopf", 0x8000210d00000000ULL }, + { "HorizontalLine", 0x8000250000000000ULL }, + { "Hscr", 0x8000210b00000000ULL }, + { "Hstrok", 0x8000012600000000ULL }, + { "HumpDownHump", 0x8000224e00000000ULL }, + { "HumpEqual", 0x8000224f00000000ULL }, + { "IEcy", 0x8000041500000000ULL }, + { "IJlig", 0x8000013200000000ULL }, + { "IOcy", 0x8000040100000000ULL }, + { "Iacute", 0x000000cd00000000ULL }, + { "Icirc", 0x000000ce00000000ULL }, + { "Icy", 0x8000041800000000ULL }, + { "Idot", 0x8000013000000000ULL }, + { "Ifr", 0x8000211100000000ULL }, + { "Igrave", 0x000000cc00000000ULL }, + { "Im", 0x8000211100000000ULL }, + { "Imacr", 0x8000012a00000000ULL }, + { "ImaginaryI", 0x8000214800000000ULL }, + { "Implies", 0x800021d200000000ULL }, + { "Int", 0x8000222c00000000ULL }, + { "Integral", 0x8000222b00000000ULL }, + { "Intersection", 0x800022c200000000ULL }, + { "InvisibleComma", 0x8000206300000000ULL }, + { "InvisibleTimes", 0x8000206200000000ULL }, + { "Iogon", 0x8000012e00000000ULL }, + { "Iopf", 0x8001d54000000000ULL }, + { "Iota", 0x8000039900000000ULL }, + { "Iscr", 0x8000211000000000ULL }, + { "Itilde", 0x8000012800000000ULL }, + { "Iukcy", 0x8000040600000000ULL }, + { "Iuml", 0x000000cf00000000ULL }, + { "Jcirc", 0x8000013400000000ULL }, + { "Jcy", 0x8000041900000000ULL }, + { "Jfr", 0x8001d50d00000000ULL }, + { "Jopf", 0x8001d54100000000ULL }, + { "Jscr", 0x8001d4a500000000ULL }, + { "Jsercy", 0x8000040800000000ULL }, + { "Jukcy", 0x8000040400000000ULL }, + { "KHcy", 0x8000042500000000ULL }, + { "KJcy", 0x8000040c00000000ULL }, + { "Kappa", 0x8000039a00000000ULL }, + { "Kcedil", 0x8000013600000000ULL }, + { "Kcy", 0x8000041a00000000ULL }, + { "Kfr", 0x8001d50e00000000ULL }, + { "Kopf", 0x8001d54200000000ULL }, + { "Kscr", 0x8001d4a600000000ULL }, + { "LJcy", 0x8000040900000000ULL }, + { "LT", 0x0000003c00000000ULL }, + { "Lacute", 0x8000013900000000ULL }, + { "Lambda", 0x8000039b00000000ULL }, + { "Lang", 0x800027ea00000000ULL }, + { "Laplacetrf", 0x8000211200000000ULL }, + { "Larr", 0x8000219e00000000ULL }, + { "Lcaron", 0x8000013d00000000ULL }, + { "Lcedil", 0x8000013b00000000ULL }, + { "Lcy", 0x8000041b00000000ULL }, + { "LeftAngleBracket", 0x800027e800000000ULL }, + { "LeftArrow", 0x8000219000000000ULL }, + { "LeftArrowBar", 0x800021e400000000ULL }, + { "LeftArrowRightArrow", 0x800021c600000000ULL }, + { "LeftCeiling", 0x8000230800000000ULL }, + { "LeftDoubleBracket", 0x800027e600000000ULL }, + { "LeftDownTeeVector", 0x8000296100000000ULL }, + { "LeftDownVector", 0x800021c300000000ULL }, + { "LeftDownVectorBar", 0x8000295900000000ULL }, + { "LeftFloor", 0x8000230a00000000ULL }, + { "LeftRightArrow", 0x8000219400000000ULL }, + { "LeftRightVector", 0x8000294e00000000ULL }, + { "LeftTee", 0x800022a300000000ULL }, + { "LeftTeeArrow", 0x800021a400000000ULL }, + { "LeftTeeVector", 0x8000295a00000000ULL }, + { "LeftTriangle", 0x800022b200000000ULL }, + { "LeftTriangleBar", 0x800029cf00000000ULL }, + { "LeftTriangleEqual", 0x800022b400000000ULL }, + { "LeftUpDownVector", 0x8000295100000000ULL }, + { "LeftUpTeeVector", 0x8000296000000000ULL }, + { "LeftUpVector", 0x800021bf00000000ULL }, + { "LeftUpVectorBar", 0x8000295800000000ULL }, + { "LeftVector", 0x800021bc00000000ULL }, + { "LeftVectorBar", 0x8000295200000000ULL }, + { "Leftarrow", 0x800021d000000000ULL }, + { "Leftrightarrow", 0x800021d400000000ULL }, + { "LessEqualGreater", 0x800022da00000000ULL }, + { "LessFullEqual", 0x8000226600000000ULL }, + { "LessGreater", 0x8000227600000000ULL }, + { "LessLess", 0x80002aa100000000ULL }, + { "LessSlantEqual", 0x80002a7d00000000ULL }, + { "LessTilde", 0x8000227200000000ULL }, + { "Lfr", 0x8001d50f00000000ULL }, + { "Ll", 0x800022d800000000ULL }, + { "Lleftarrow", 0x800021da00000000ULL }, + { "Lmidot", 0x8000013f00000000ULL }, + { "LongLeftArrow", 0x800027f500000000ULL }, + { "LongLeftRightArrow", 0x800027f700000000ULL }, + { "LongRightArrow", 0x800027f600000000ULL }, + { "Longleftarrow", 0x800027f800000000ULL }, + { "Longleftrightarrow", 0x800027fa00000000ULL }, + { "Longrightarrow", 0x800027f900000000ULL }, + { "Lopf", 0x8001d54300000000ULL }, + { "LowerLeftArrow", 0x8000219900000000ULL }, + { "LowerRightArrow", 0x8000219800000000ULL }, + { "Lscr", 0x8000211200000000ULL }, + { "Lsh", 0x800021b000000000ULL }, + { "Lstrok", 0x8000014100000000ULL }, + { "Lt", 0x8000226a00000000ULL }, + { "Map", 0x8000290500000000ULL }, + { "Mcy", 0x8000041c00000000ULL }, + { "MediumSpace", 0x8000205f00000000ULL }, + { "Mellintrf", 0x8000213300000000ULL }, + { "Mfr", 0x8001d51000000000ULL }, + { "MinusPlus", 0x8000221300000000ULL }, + { "Mopf", 0x8001d54400000000ULL }, + { "Mscr", 0x8000213300000000ULL }, + { "Mu", 0x8000039c00000000ULL }, + { "NJcy", 0x8000040a00000000ULL }, + { "Nacute", 0x8000014300000000ULL }, + { "Ncaron", 0x8000014700000000ULL }, + { "Ncedil", 0x8000014500000000ULL }, + { "Ncy", 0x8000041d00000000ULL }, + { "NegativeMediumSpace", 0x8000200b00000000ULL }, + { "NegativeThickSpace", 0x8000200b00000000ULL }, + { "NegativeThinSpace", 0x8000200b00000000ULL }, + { "NegativeVeryThinSpace", 0x8000200b00000000ULL }, + { "NestedGreaterGreater", 0x8000226b00000000ULL }, + { "NestedLessLess", 0x8000226a00000000ULL }, + { "NewLine", 0x8000000a00000000ULL }, + { "Nfr", 0x8001d51100000000ULL }, + { "NoBreak", 0x8000206000000000ULL }, + { "NonBreakingSpace", 0x800000a000000000ULL }, + { "Nopf", 0x8000211500000000ULL }, + { "Not", 0x80002aec00000000ULL }, + { "NotCongruent", 0x8000226200000000ULL }, + { "NotCupCap", 0x8000226d00000000ULL }, + { "NotDoubleVerticalBar", 0x8000222600000000ULL }, + { "NotElement", 0x8000220900000000ULL }, + { "NotEqual", 0x8000226000000000ULL }, + { "NotEqualTilde", 0x8000224200000338ULL }, + { "NotExists", 0x8000220400000000ULL }, + { "NotGreater", 0x8000226f00000000ULL }, + { "NotGreaterEqual", 0x8000227100000000ULL }, + { "NotGreaterFullEqual", 0x8000226700000338ULL }, + { "NotGreaterGreater", 0x8000226b00000338ULL }, + { "NotGreaterLess", 0x8000227900000000ULL }, + { "NotGreaterSlantEqual", 0x80002a7e00000338ULL }, + { "NotGreaterTilde", 0x8000227500000000ULL }, + { "NotHumpDownHump", 0x8000224e00000338ULL }, + { "NotHumpEqual", 0x8000224f00000338ULL }, + { "NotLeftTriangle", 0x800022ea00000000ULL }, + { "NotLeftTriangleBar", 0x800029cf00000338ULL }, + { "NotLeftTriangleEqual", 0x800022ec00000000ULL }, + { "NotLess", 0x8000226e00000000ULL }, + { "NotLessEqual", 0x8000227000000000ULL }, + { "NotLessGreater", 0x8000227800000000ULL }, + { "NotLessLess", 0x8000226a00000338ULL }, + { "NotLessSlantEqual", 0x80002a7d00000338ULL }, + { "NotLessTilde", 0x8000227400000000ULL }, + { "NotNestedGreaterGreater", 0x80002aa200000338ULL }, + { "NotNestedLessLess", 0x80002aa100000338ULL }, + { "NotPrecedes", 0x8000228000000000ULL }, + { "NotPrecedesEqual", 0x80002aaf00000338ULL }, + { "NotPrecedesSlantEqual", 0x800022e000000000ULL }, + { "NotReverseElement", 0x8000220c00000000ULL }, + { "NotRightTriangle", 0x800022eb00000000ULL }, + { "NotRightTriangleBar", 0x800029d000000338ULL }, + { "NotRightTriangleEqual", 0x800022ed00000000ULL }, + { "NotSquareSubset", 0x8000228f00000338ULL }, + { "NotSquareSubsetEqual", 0x800022e200000000ULL }, + { "NotSquareSuperset", 0x8000229000000338ULL }, + { "NotSquareSupersetEqual", 0x800022e300000000ULL }, + { "NotSubset", 0x80002282000020d2ULL }, + { "NotSubsetEqual", 0x8000228800000000ULL }, + { "NotSucceeds", 0x8000228100000000ULL }, + { "NotSucceedsEqual", 0x80002ab000000338ULL }, + { "NotSucceedsSlantEqual", 0x800022e100000000ULL }, + { "NotSucceedsTilde", 0x8000227f00000338ULL }, + { "NotSuperset", 0x80002283000020d2ULL }, + { "NotSupersetEqual", 0x8000228900000000ULL }, + { "NotTilde", 0x8000224100000000ULL }, + { "NotTildeEqual", 0x8000224400000000ULL }, + { "NotTildeFullEqual", 0x8000224700000000ULL }, + { "NotTildeTilde", 0x8000224900000000ULL }, + { "NotVerticalBar", 0x8000222400000000ULL }, + { "Nscr", 0x8001d4a900000000ULL }, + { "Ntilde", 0x000000d100000000ULL }, + { "Nu", 0x8000039d00000000ULL }, + { "OElig", 0x8000015200000000ULL }, + { "Oacute", 0x000000d300000000ULL }, + { "Ocirc", 0x000000d400000000ULL }, + { "Ocy", 0x8000041e00000000ULL }, + { "Odblac", 0x8000015000000000ULL }, + { "Ofr", 0x8001d51200000000ULL }, + { "Ograve", 0x000000d200000000ULL }, + { "Omacr", 0x8000014c00000000ULL }, + { "Omega", 0x800003a900000000ULL }, + { "Omicron", 0x8000039f00000000ULL }, + { "Oopf", 0x8001d54600000000ULL }, + { "OpenCurlyDoubleQuote", 0x8000201c00000000ULL }, + { "OpenCurlyQuote", 0x8000201800000000ULL }, + { "Or", 0x80002a5400000000ULL }, + { "Oscr", 0x8001d4aa00000000ULL }, + { "Oslash", 0x000000d800000000ULL }, + { "Otilde", 0x000000d500000000ULL }, + { "Otimes", 0x80002a3700000000ULL }, + { "Ouml", 0x000000d600000000ULL }, + { "OverBar", 0x8000203e00000000ULL }, + { "OverBrace", 0x800023de00000000ULL }, + { "OverBracket", 0x800023b400000000ULL }, + { "OverParenthesis", 0x800023dc00000000ULL }, + { "PartialD", 0x8000220200000000ULL }, + { "Pcy", 0x8000041f00000000ULL }, + { "Pfr", 0x8001d51300000000ULL }, + { "Phi", 0x800003a600000000ULL }, + { "Pi", 0x800003a000000000ULL }, + { "PlusMinus", 0x800000b100000000ULL }, + { "Poincareplane", 0x8000210c00000000ULL }, + { "Popf", 0x8000211900000000ULL }, + { "Pr", 0x80002abb00000000ULL }, + { "Precedes", 0x8000227a00000000ULL }, + { "PrecedesEqual", 0x80002aaf00000000ULL }, + { "PrecedesSlantEqual", 0x8000227c00000000ULL }, + { "PrecedesTilde", 0x8000227e00000000ULL }, + { "Prime", 0x8000203300000000ULL }, + { "Product", 0x8000220f00000000ULL }, + { "Proportion", 0x8000223700000000ULL }, + { "Proportional", 0x8000221d00000000ULL }, + { "Pscr", 0x8001d4ab00000000ULL }, + { "Psi", 0x800003a800000000ULL }, + { "QUOT", 0x0000002200000000ULL }, + { "Qfr", 0x8001d51400000000ULL }, + { "Qopf", 0x8000211a00000000ULL }, + { "Qscr", 0x8001d4ac00000000ULL }, + { "RBarr", 0x8000291000000000ULL }, + { "REG", 0x000000ae00000000ULL }, + { "Racute", 0x8000015400000000ULL }, + { "Rang", 0x800027eb00000000ULL }, + { "Rarr", 0x800021a000000000ULL }, + { "Rarrtl", 0x8000291600000000ULL }, + { "Rcaron", 0x8000015800000000ULL }, + { "Rcedil", 0x8000015600000000ULL }, + { "Rcy", 0x8000042000000000ULL }, + { "Re", 0x8000211c00000000ULL }, + { "ReverseElement", 0x8000220b00000000ULL }, + { "ReverseEquilibrium", 0x800021cb00000000ULL }, + { "ReverseUpEquilibrium", 0x8000296f00000000ULL }, + { "Rfr", 0x8000211c00000000ULL }, + { "Rho", 0x800003a100000000ULL }, + { "RightAngleBracket", 0x800027e900000000ULL }, + { "RightArrow", 0x8000219200000000ULL }, + { "RightArrowBar", 0x800021e500000000ULL }, + { "RightArrowLeftArrow", 0x800021c400000000ULL }, + { "RightCeiling", 0x8000230900000000ULL }, + { "RightDoubleBracket", 0x800027e700000000ULL }, + { "RightDownTeeVector", 0x8000295d00000000ULL }, + { "RightDownVector", 0x800021c200000000ULL }, + { "RightDownVectorBar", 0x8000295500000000ULL }, + { "RightFloor", 0x8000230b00000000ULL }, + { "RightTee", 0x800022a200000000ULL }, + { "RightTeeArrow", 0x800021a600000000ULL }, + { "RightTeeVector", 0x8000295b00000000ULL }, + { "RightTriangle", 0x800022b300000000ULL }, + { "RightTriangleBar", 0x800029d000000000ULL }, + { "RightTriangleEqual", 0x800022b500000000ULL }, + { "RightUpDownVector", 0x8000294f00000000ULL }, + { "RightUpTeeVector", 0x8000295c00000000ULL }, + { "RightUpVector", 0x800021be00000000ULL }, + { "RightUpVectorBar", 0x8000295400000000ULL }, + { "RightVector", 0x800021c000000000ULL }, + { "RightVectorBar", 0x8000295300000000ULL }, + { "Rightarrow", 0x800021d200000000ULL }, + { "Ropf", 0x8000211d00000000ULL }, + { "RoundImplies", 0x8000297000000000ULL }, + { "Rrightarrow", 0x800021db00000000ULL }, + { "Rscr", 0x8000211b00000000ULL }, + { "Rsh", 0x800021b100000000ULL }, + { "RuleDelayed", 0x800029f400000000ULL }, + { "SHCHcy", 0x8000042900000000ULL }, + { "SHcy", 0x8000042800000000ULL }, + { "SOFTcy", 0x8000042c00000000ULL }, + { "Sacute", 0x8000015a00000000ULL }, + { "Sc", 0x80002abc00000000ULL }, + { "Scaron", 0x8000016000000000ULL }, + { "Scedil", 0x8000015e00000000ULL }, + { "Scirc", 0x8000015c00000000ULL }, + { "Scy", 0x8000042100000000ULL }, + { "Sfr", 0x8001d51600000000ULL }, + { "ShortDownArrow", 0x8000219300000000ULL }, + { "ShortLeftArrow", 0x8000219000000000ULL }, + { "ShortRightArrow", 0x8000219200000000ULL }, + { "ShortUpArrow", 0x8000219100000000ULL }, + { "Sigma", 0x800003a300000000ULL }, + { "SmallCircle", 0x8000221800000000ULL }, + { "Sopf", 0x8001d54a00000000ULL }, + { "Sqrt", 0x8000221a00000000ULL }, + { "Square", 0x800025a100000000ULL }, + { "SquareIntersection", 0x8000229300000000ULL }, + { "SquareSubset", 0x8000228f00000000ULL }, + { "SquareSubsetEqual", 0x8000229100000000ULL }, + { "SquareSuperset", 0x8000229000000000ULL }, + { "SquareSupersetEqual", 0x8000229200000000ULL }, + { "SquareUnion", 0x8000229400000000ULL }, + { "Sscr", 0x8001d4ae00000000ULL }, + { "Star", 0x800022c600000000ULL }, + { "Sub", 0x800022d000000000ULL }, + { "Subset", 0x800022d000000000ULL }, + { "SubsetEqual", 0x8000228600000000ULL }, + { "Succeeds", 0x8000227b00000000ULL }, + { "SucceedsEqual", 0x80002ab000000000ULL }, + { "SucceedsSlantEqual", 0x8000227d00000000ULL }, + { "SucceedsTilde", 0x8000227f00000000ULL }, + { "SuchThat", 0x8000220b00000000ULL }, + { "Sum", 0x8000221100000000ULL }, + { "Sup", 0x800022d100000000ULL }, + { "Superset", 0x8000228300000000ULL }, + { "SupersetEqual", 0x8000228700000000ULL }, + { "Supset", 0x800022d100000000ULL }, + { "THORN", 0x000000de00000000ULL }, + { "TRADE", 0x8000212200000000ULL }, + { "TSHcy", 0x8000040b00000000ULL }, + { "TScy", 0x8000042600000000ULL }, + { "Tab", 0x8000000900000000ULL }, + { "Tau", 0x800003a400000000ULL }, + { "Tcaron", 0x8000016400000000ULL }, + { "Tcedil", 0x8000016200000000ULL }, + { "Tcy", 0x8000042200000000ULL }, + { "Tfr", 0x8001d51700000000ULL }, + { "Therefore", 0x8000223400000000ULL }, + { "Theta", 0x8000039800000000ULL }, + { "ThickSpace", 0x8000205f0000200aULL }, + { "ThinSpace", 0x8000200900000000ULL }, + { "Tilde", 0x8000223c00000000ULL }, + { "TildeEqual", 0x8000224300000000ULL }, + { "TildeFullEqual", 0x8000224500000000ULL }, + { "TildeTilde", 0x8000224800000000ULL }, + { "Topf", 0x8001d54b00000000ULL }, + { "TripleDot", 0x800020db00000000ULL }, + { "Tscr", 0x8001d4af00000000ULL }, + { "Tstrok", 0x8000016600000000ULL }, + { "Uacute", 0x000000da00000000ULL }, + { "Uarr", 0x8000219f00000000ULL }, + { "Uarrocir", 0x8000294900000000ULL }, + { "Ubrcy", 0x8000040e00000000ULL }, + { "Ubreve", 0x8000016c00000000ULL }, + { "Ucirc", 0x000000db00000000ULL }, + { "Ucy", 0x8000042300000000ULL }, + { "Udblac", 0x8000017000000000ULL }, + { "Ufr", 0x8001d51800000000ULL }, + { "Ugrave", 0x000000d900000000ULL }, + { "Umacr", 0x8000016a00000000ULL }, + { "UnderBar", 0x8000005f00000000ULL }, + { "UnderBrace", 0x800023df00000000ULL }, + { "UnderBracket", 0x800023b500000000ULL }, + { "UnderParenthesis", 0x800023dd00000000ULL }, + { "Union", 0x800022c300000000ULL }, + { "UnionPlus", 0x8000228e00000000ULL }, + { "Uogon", 0x8000017200000000ULL }, + { "Uopf", 0x8001d54c00000000ULL }, + { "UpArrow", 0x8000219100000000ULL }, + { "UpArrowBar", 0x8000291200000000ULL }, + { "UpArrowDownArrow", 0x800021c500000000ULL }, + { "UpDownArrow", 0x8000219500000000ULL }, + { "UpEquilibrium", 0x8000296e00000000ULL }, + { "UpTee", 0x800022a500000000ULL }, + { "UpTeeArrow", 0x800021a500000000ULL }, + { "Uparrow", 0x800021d100000000ULL }, + { "Updownarrow", 0x800021d500000000ULL }, + { "UpperLeftArrow", 0x8000219600000000ULL }, + { "UpperRightArrow", 0x8000219700000000ULL }, + { "Upsi", 0x800003d200000000ULL }, + { "Upsilon", 0x800003a500000000ULL }, + { "Uring", 0x8000016e00000000ULL }, + { "Uscr", 0x8001d4b000000000ULL }, + { "Utilde", 0x8000016800000000ULL }, + { "Uuml", 0x000000dc00000000ULL }, + { "VDash", 0x800022ab00000000ULL }, + { "Vbar", 0x80002aeb00000000ULL }, + { "Vcy", 0x8000041200000000ULL }, + { "Vdash", 0x800022a900000000ULL }, + { "Vdashl", 0x80002ae600000000ULL }, + { "Vee", 0x800022c100000000ULL }, + { "Verbar", 0x8000201600000000ULL }, + { "Vert", 0x8000201600000000ULL }, + { "VerticalBar", 0x8000222300000000ULL }, + { "VerticalLine", 0x8000007c00000000ULL }, + { "VerticalSeparator", 0x8000275800000000ULL }, + { "VerticalTilde", 0x8000224000000000ULL }, + { "VeryThinSpace", 0x8000200a00000000ULL }, + { "Vfr", 0x8001d51900000000ULL }, + { "Vopf", 0x8001d54d00000000ULL }, + { "Vscr", 0x8001d4b100000000ULL }, + { "Vvdash", 0x800022aa00000000ULL }, + { "Wcirc", 0x8000017400000000ULL }, + { "Wedge", 0x800022c000000000ULL }, + { "Wfr", 0x8001d51a00000000ULL }, + { "Wopf", 0x8001d54e00000000ULL }, + { "Wscr", 0x8001d4b200000000ULL }, + { "Xfr", 0x8001d51b00000000ULL }, + { "Xi", 0x8000039e00000000ULL }, + { "Xopf", 0x8001d54f00000000ULL }, + { "Xscr", 0x8001d4b300000000ULL }, + { "YAcy", 0x8000042f00000000ULL }, + { "YIcy", 0x8000040700000000ULL }, + { "YUcy", 0x8000042e00000000ULL }, + { "Yacute", 0x000000dd00000000ULL }, + { "Ycirc", 0x8000017600000000ULL }, + { "Ycy", 0x8000042b00000000ULL }, + { "Yfr", 0x8001d51c00000000ULL }, + { "Yopf", 0x8001d55000000000ULL }, + { "Yscr", 0x8001d4b400000000ULL }, + { "Yuml", 0x8000017800000000ULL }, + { "ZHcy", 0x8000041600000000ULL }, + { "Zacute", 0x8000017900000000ULL }, + { "Zcaron", 0x8000017d00000000ULL }, + { "Zcy", 0x8000041700000000ULL }, + { "Zdot", 0x8000017b00000000ULL }, + { "ZeroWidthSpace", 0x8000200b00000000ULL }, + { "Zeta", 0x8000039600000000ULL }, + { "Zfr", 0x8000212800000000ULL }, + { "Zopf", 0x8000212400000000ULL }, + { "Zscr", 0x8001d4b500000000ULL }, + { "aacute", 0x000000e100000000ULL }, + { "abreve", 0x8000010300000000ULL }, + { "ac", 0x8000223e00000000ULL }, + { "acE", 0x8000223e00000333ULL }, + { "acd", 0x8000223f00000000ULL }, + { "acirc", 0x000000e200000000ULL }, + { "acute", 0x000000b400000000ULL }, + { "acy", 0x8000043000000000ULL }, + { "aelig", 0x000000e600000000ULL }, + { "af", 0x8000206100000000ULL }, + { "afr", 0x8001d51e00000000ULL }, + { "agrave", 0x000000e000000000ULL }, + { "alefsym", 0x8000213500000000ULL }, + { "aleph", 0x8000213500000000ULL }, + { "alpha", 0x800003b100000000ULL }, + { "amacr", 0x8000010100000000ULL }, + { "amalg", 0x80002a3f00000000ULL }, + { "amp", 0x0000002600000000ULL }, + { "and", 0x8000222700000000ULL }, + { "andand", 0x80002a5500000000ULL }, + { "andd", 0x80002a5c00000000ULL }, + { "andslope", 0x80002a5800000000ULL }, + { "andv", 0x80002a5a00000000ULL }, + { "ang", 0x8000222000000000ULL }, + { "ange", 0x800029a400000000ULL }, + { "angle", 0x8000222000000000ULL }, + { "angmsd", 0x8000222100000000ULL }, + { "angmsdaa", 0x800029a800000000ULL }, + { "angmsdab", 0x800029a900000000ULL }, + { "angmsdac", 0x800029aa00000000ULL }, + { "angmsdad", 0x800029ab00000000ULL }, + { "angmsdae", 0x800029ac00000000ULL }, + { "angmsdaf", 0x800029ad00000000ULL }, + { "angmsdag", 0x800029ae00000000ULL }, + { "angmsdah", 0x800029af00000000ULL }, + { "angrt", 0x8000221f00000000ULL }, + { "angrtvb", 0x800022be00000000ULL }, + { "angrtvbd", 0x8000299d00000000ULL }, + { "angsph", 0x8000222200000000ULL }, + { "angst", 0x800000c500000000ULL }, + { "angzarr", 0x8000237c00000000ULL }, + { "aogon", 0x8000010500000000ULL }, + { "aopf", 0x8001d55200000000ULL }, + { "ap", 0x8000224800000000ULL }, + { "apE", 0x80002a7000000000ULL }, + { "apacir", 0x80002a6f00000000ULL }, + { "ape", 0x8000224a00000000ULL }, + { "apid", 0x8000224b00000000ULL }, + { "apos", 0x8000002700000000ULL }, + { "approx", 0x8000224800000000ULL }, + { "approxeq", 0x8000224a00000000ULL }, + { "aring", 0x000000e500000000ULL }, + { "ascr", 0x8001d4b600000000ULL }, + { "ast", 0x8000002a00000000ULL }, + { "asymp", 0x8000224800000000ULL }, + { "asympeq", 0x8000224d00000000ULL }, + { "atilde", 0x000000e300000000ULL }, + { "auml", 0x000000e400000000ULL }, + { "awconint", 0x8000223300000000ULL }, + { "awint", 0x80002a1100000000ULL }, + { "bNot", 0x80002aed00000000ULL }, + { "backcong", 0x8000224c00000000ULL }, + { "backepsilon", 0x800003f600000000ULL }, + { "backprime", 0x8000203500000000ULL }, + { "backsim", 0x8000223d00000000ULL }, + { "backsimeq", 0x800022cd00000000ULL }, + { "barvee", 0x800022bd00000000ULL }, + { "barwed", 0x8000230500000000ULL }, + { "barwedge", 0x8000230500000000ULL }, + { "bbrk", 0x800023b500000000ULL }, + { "bbrktbrk", 0x800023b600000000ULL }, + { "bcong", 0x8000224c00000000ULL }, + { "bcy", 0x8000043100000000ULL }, + { "bdquo", 0x8000201e00000000ULL }, + { "becaus", 0x8000223500000000ULL }, + { "because", 0x8000223500000000ULL }, + { "bemptyv", 0x800029b000000000ULL }, + { "bepsi", 0x800003f600000000ULL }, + { "bernou", 0x8000212c00000000ULL }, + { "beta", 0x800003b200000000ULL }, + { "beth", 0x8000213600000000ULL }, + { "between", 0x8000226c00000000ULL }, + { "bfr", 0x8001d51f00000000ULL }, + { "bigcap", 0x800022c200000000ULL }, + { "bigcirc", 0x800025ef00000000ULL }, + { "bigcup", 0x800022c300000000ULL }, + { "bigodot", 0x80002a0000000000ULL }, + { "bigoplus", 0x80002a0100000000ULL }, + { "bigotimes", 0x80002a0200000000ULL }, + { "bigsqcup", 0x80002a0600000000ULL }, + { "bigstar", 0x8000260500000000ULL }, + { "bigtriangledown", 0x800025bd00000000ULL }, + { "bigtriangleup", 0x800025b300000000ULL }, + { "biguplus", 0x80002a0400000000ULL }, + { "bigvee", 0x800022c100000000ULL }, + { "bigwedge", 0x800022c000000000ULL }, + { "bkarow", 0x8000290d00000000ULL }, + { "blacklozenge", 0x800029eb00000000ULL }, + { "blacksquare", 0x800025aa00000000ULL }, + { "blacktriangle", 0x800025b400000000ULL }, + { "blacktriangledown", 0x800025be00000000ULL }, + { "blacktriangleleft", 0x800025c200000000ULL }, + { "blacktriangleright", 0x800025b800000000ULL }, + { "blank", 0x8000242300000000ULL }, + { "blk12", 0x8000259200000000ULL }, + { "blk14", 0x8000259100000000ULL }, + { "blk34", 0x8000259300000000ULL }, + { "block", 0x8000258800000000ULL }, + { "bne", 0x8000003d000020e5ULL }, + { "bnequiv", 0x80002261000020e5ULL }, + { "bnot", 0x8000231000000000ULL }, + { "bopf", 0x8001d55300000000ULL }, + { "bot", 0x800022a500000000ULL }, + { "bottom", 0x800022a500000000ULL }, + { "bowtie", 0x800022c800000000ULL }, + { "boxDL", 0x8000255700000000ULL }, + { "boxDR", 0x8000255400000000ULL }, + { "boxDl", 0x8000255600000000ULL }, + { "boxDr", 0x8000255300000000ULL }, + { "boxH", 0x8000255000000000ULL }, + { "boxHD", 0x8000256600000000ULL }, + { "boxHU", 0x8000256900000000ULL }, + { "boxHd", 0x8000256400000000ULL }, + { "boxHu", 0x8000256700000000ULL }, + { "boxUL", 0x8000255d00000000ULL }, + { "boxUR", 0x8000255a00000000ULL }, + { "boxUl", 0x8000255c00000000ULL }, + { "boxUr", 0x8000255900000000ULL }, + { "boxV", 0x8000255100000000ULL }, + { "boxVH", 0x8000256c00000000ULL }, + { "boxVL", 0x8000256300000000ULL }, + { "boxVR", 0x8000256000000000ULL }, + { "boxVh", 0x8000256b00000000ULL }, + { "boxVl", 0x8000256200000000ULL }, + { "boxVr", 0x8000255f00000000ULL }, + { "boxbox", 0x800029c900000000ULL }, + { "boxdL", 0x8000255500000000ULL }, + { "boxdR", 0x8000255200000000ULL }, + { "boxdl", 0x8000251000000000ULL }, + { "boxdr", 0x8000250c00000000ULL }, + { "boxh", 0x8000250000000000ULL }, + { "boxhD", 0x8000256500000000ULL }, + { "boxhU", 0x8000256800000000ULL }, + { "boxhd", 0x8000252c00000000ULL }, + { "boxhu", 0x8000253400000000ULL }, + { "boxminus", 0x8000229f00000000ULL }, + { "boxplus", 0x8000229e00000000ULL }, + { "boxtimes", 0x800022a000000000ULL }, + { "boxuL", 0x8000255b00000000ULL }, + { "boxuR", 0x8000255800000000ULL }, + { "boxul", 0x8000251800000000ULL }, + { "boxur", 0x8000251400000000ULL }, + { "boxv", 0x8000250200000000ULL }, + { "boxvH", 0x8000256a00000000ULL }, + { "boxvL", 0x8000256100000000ULL }, + { "boxvR", 0x8000255e00000000ULL }, + { "boxvh", 0x8000253c00000000ULL }, + { "boxvl", 0x8000252400000000ULL }, + { "boxvr", 0x8000251c00000000ULL }, + { "bprime", 0x8000203500000000ULL }, + { "breve", 0x800002d800000000ULL }, + { "brvbar", 0x000000a600000000ULL }, + { "bscr", 0x8001d4b700000000ULL }, + { "bsemi", 0x8000204f00000000ULL }, + { "bsim", 0x8000223d00000000ULL }, + { "bsime", 0x800022cd00000000ULL }, + { "bsol", 0x8000005c00000000ULL }, + { "bsolb", 0x800029c500000000ULL }, + { "bsolhsub", 0x800027c800000000ULL }, + { "bull", 0x8000202200000000ULL }, + { "bullet", 0x8000202200000000ULL }, + { "bump", 0x8000224e00000000ULL }, + { "bumpE", 0x80002aae00000000ULL }, + { "bumpe", 0x8000224f00000000ULL }, + { "bumpeq", 0x8000224f00000000ULL }, + { "cacute", 0x8000010700000000ULL }, + { "cap", 0x8000222900000000ULL }, + { "capand", 0x80002a4400000000ULL }, + { "capbrcup", 0x80002a4900000000ULL }, + { "capcap", 0x80002a4b00000000ULL }, + { "capcup", 0x80002a4700000000ULL }, + { "capdot", 0x80002a4000000000ULL }, + { "caps", 0x800022290000fe00ULL }, + { "caret", 0x8000204100000000ULL }, + { "caron", 0x800002c700000000ULL }, + { "ccaps", 0x80002a4d00000000ULL }, + { "ccaron", 0x8000010d00000000ULL }, + { "ccedil", 0x000000e700000000ULL }, + { "ccirc", 0x8000010900000000ULL }, + { "ccups", 0x80002a4c00000000ULL }, + { "ccupssm", 0x80002a5000000000ULL }, + { "cdot", 0x8000010b00000000ULL }, + { "cedil", 0x000000b800000000ULL }, + { "cemptyv", 0x800029b200000000ULL }, + { "cent", 0x000000a200000000ULL }, + { "centerdot", 0x800000b700000000ULL }, + { "cfr", 0x8001d52000000000ULL }, + { "chcy", 0x8000044700000000ULL }, + { "check", 0x8000271300000000ULL }, + { "checkmark", 0x8000271300000000ULL }, + { "chi", 0x800003c700000000ULL }, + { "cir", 0x800025cb00000000ULL }, + { "cirE", 0x800029c300000000ULL }, + { "circ", 0x800002c600000000ULL }, + { "circeq", 0x8000225700000000ULL }, + { "circlearrowleft", 0x800021ba00000000ULL }, + { "circlearrowright", 0x800021bb00000000ULL }, + { "circledR", 0x800000ae00000000ULL }, + { "circledS", 0x800024c800000000ULL }, + { "circledast", 0x8000229b00000000ULL }, + { "circledcirc", 0x8000229a00000000ULL }, + { "circleddash", 0x8000229d00000000ULL }, + { "cire", 0x8000225700000000ULL }, + { "cirfnint", 0x80002a1000000000ULL }, + { "cirmid", 0x80002aef00000000ULL }, + { "cirscir", 0x800029c200000000ULL }, + { "clubs", 0x8000266300000000ULL }, + { "clubsuit", 0x8000266300000000ULL }, + { "colon", 0x8000003a00000000ULL }, + { "colone", 0x8000225400000000ULL }, + { "coloneq", 0x8000225400000000ULL }, + { "comma", 0x8000002c00000000ULL }, + { "commat", 0x8000004000000000ULL }, + { "comp", 0x8000220100000000ULL }, + { "compfn", 0x8000221800000000ULL }, + { "complement", 0x8000220100000000ULL }, + { "complexes", 0x8000210200000000ULL }, + { "cong", 0x8000224500000000ULL }, + { "congdot", 0x80002a6d00000000ULL }, + { "conint", 0x8000222e00000000ULL }, + { "copf", 0x8001d55400000000ULL }, + { "coprod", 0x8000221000000000ULL }, + { "copy", 0x000000a900000000ULL }, + { "copysr", 0x8000211700000000ULL }, + { "crarr", 0x800021b500000000ULL }, + { "cross", 0x8000271700000000ULL }, + { "cscr", 0x8001d4b800000000ULL }, + { "csub", 0x80002acf00000000ULL }, + { "csube", 0x80002ad100000000ULL }, + { "csup", 0x80002ad000000000ULL }, + { "csupe", 0x80002ad200000000ULL }, + { "ctdot", 0x800022ef00000000ULL }, + { "cudarrl", 0x8000293800000000ULL }, + { "cudarrr", 0x8000293500000000ULL }, + { "cuepr", 0x800022de00000000ULL }, + { "cuesc", 0x800022df00000000ULL }, + { "cularr", 0x800021b600000000ULL }, + { "cularrp", 0x8000293d00000000ULL }, + { "cup", 0x8000222a00000000ULL }, + { "cupbrcap", 0x80002a4800000000ULL }, + { "cupcap", 0x80002a4600000000ULL }, + { "cupcup", 0x80002a4a00000000ULL }, + { "cupdot", 0x8000228d00000000ULL }, + { "cupor", 0x80002a4500000000ULL }, + { "cups", 0x8000222a0000fe00ULL }, + { "curarr", 0x800021b700000000ULL }, + { "curarrm", 0x8000293c00000000ULL }, + { "curlyeqprec", 0x800022de00000000ULL }, + { "curlyeqsucc", 0x800022df00000000ULL }, + { "curlyvee", 0x800022ce00000000ULL }, + { "curlywedge", 0x800022cf00000000ULL }, + { "curren", 0x000000a400000000ULL }, + { "curvearrowleft", 0x800021b600000000ULL }, + { "curvearrowright", 0x800021b700000000ULL }, + { "cuvee", 0x800022ce00000000ULL }, + { "cuwed", 0x800022cf00000000ULL }, + { "cwconint", 0x8000223200000000ULL }, + { "cwint", 0x8000223100000000ULL }, + { "cylcty", 0x8000232d00000000ULL }, + { "dArr", 0x800021d300000000ULL }, + { "dHar", 0x8000296500000000ULL }, + { "dagger", 0x8000202000000000ULL }, + { "daleth", 0x8000213800000000ULL }, + { "darr", 0x8000219300000000ULL }, + { "dash", 0x8000201000000000ULL }, + { "dashv", 0x800022a300000000ULL }, + { "dbkarow", 0x8000290f00000000ULL }, + { "dblac", 0x800002dd00000000ULL }, + { "dcaron", 0x8000010f00000000ULL }, + { "dcy", 0x8000043400000000ULL }, + { "dd", 0x8000214600000000ULL }, + { "ddagger", 0x8000202100000000ULL }, + { "ddarr", 0x800021ca00000000ULL }, + { "ddotseq", 0x80002a7700000000ULL }, + { "deg", 0x000000b000000000ULL }, + { "delta", 0x800003b400000000ULL }, + { "demptyv", 0x800029b100000000ULL }, + { "dfisht", 0x8000297f00000000ULL }, + { "dfr", 0x8001d52100000000ULL }, + { "dharl", 0x800021c300000000ULL }, + { "dharr", 0x800021c200000000ULL }, + { "diam", 0x800022c400000000ULL }, + { "diamond", 0x800022c400000000ULL }, + { "diamondsuit", 0x8000266600000000ULL }, + { "diams", 0x8000266600000000ULL }, + { "die", 0x800000a800000000ULL }, + { "digamma", 0x800003dd00000000ULL }, + { "disin", 0x800022f200000000ULL }, + { "div", 0x800000f700000000ULL }, + { "divide", 0x000000f700000000ULL }, + { "divideontimes", 0x800022c700000000ULL }, + { "divonx", 0x800022c700000000ULL }, + { "djcy", 0x8000045200000000ULL }, + { "dlcorn", 0x8000231e00000000ULL }, + { "dlcrop", 0x8000230d00000000ULL }, + { "dollar", 0x8000002400000000ULL }, + { "dopf", 0x8001d55500000000ULL }, + { "dot", 0x800002d900000000ULL }, + { "doteq", 0x8000225000000000ULL }, + { "doteqdot", 0x8000225100000000ULL }, + { "dotminus", 0x8000223800000000ULL }, + { "dotplus", 0x8000221400000000ULL }, + { "dotsquare", 0x800022a100000000ULL }, + { "doublebarwedge", 0x8000230600000000ULL }, + { "downarrow", 0x8000219300000000ULL }, + { "downdownarrows", 0x800021ca00000000ULL }, + { "downharpoonleft", 0x800021c300000000ULL }, + { "downharpoonright", 0x800021c200000000ULL }, + { "drbkarow", 0x8000291000000000ULL }, + { "drcorn", 0x8000231f00000000ULL }, + { "drcrop", 0x8000230c00000000ULL }, + { "dscr", 0x8001d4b900000000ULL }, + { "dscy", 0x8000045500000000ULL }, + { "dsol", 0x800029f600000000ULL }, + { "dstrok", 0x8000011100000000ULL }, + { "dtdot", 0x800022f100000000ULL }, + { "dtri", 0x800025bf00000000ULL }, + { "dtrif", 0x800025be00000000ULL }, + { "duarr", 0x800021f500000000ULL }, + { "duhar", 0x8000296f00000000ULL }, + { "dwangle", 0x800029a600000000ULL }, + { "dzcy", 0x8000045f00000000ULL }, + { "dzigrarr", 0x800027ff00000000ULL }, + { "eDDot", 0x80002a7700000000ULL }, + { "eDot", 0x8000225100000000ULL }, + { "eacute", 0x000000e900000000ULL }, + { "easter", 0x80002a6e00000000ULL }, + { "ecaron", 0x8000011b00000000ULL }, + { "ecir", 0x8000225600000000ULL }, + { "ecirc", 0x000000ea00000000ULL }, + { "ecolon", 0x8000225500000000ULL }, + { "ecy", 0x8000044d00000000ULL }, + { "edot", 0x8000011700000000ULL }, + { "ee", 0x8000214700000000ULL }, + { "efDot", 0x8000225200000000ULL }, + { "efr", 0x8001d52200000000ULL }, + { "eg", 0x80002a9a00000000ULL }, + { "egrave", 0x000000e800000000ULL }, + { "egs", 0x80002a9600000000ULL }, + { "egsdot", 0x80002a9800000000ULL }, + { "el", 0x80002a9900000000ULL }, + { "elinters", 0x800023e700000000ULL }, + { "ell", 0x8000211300000000ULL }, + { "els", 0x80002a9500000000ULL }, + { "elsdot", 0x80002a9700000000ULL }, + { "emacr", 0x8000011300000000ULL }, + { "empty", 0x8000220500000000ULL }, + { "emptyset", 0x8000220500000000ULL }, + { "emptyv", 0x8000220500000000ULL }, + { "emsp", 0x8000200300000000ULL }, + { "emsp13", 0x8000200400000000ULL }, + { "emsp14", 0x8000200500000000ULL }, + { "eng", 0x8000014b00000000ULL }, + { "ensp", 0x8000200200000000ULL }, + { "eogon", 0x8000011900000000ULL }, + { "eopf", 0x8001d55600000000ULL }, + { "epar", 0x800022d500000000ULL }, + { "eparsl", 0x800029e300000000ULL }, + { "eplus", 0x80002a7100000000ULL }, + { "epsi", 0x800003b500000000ULL }, + { "epsilon", 0x800003b500000000ULL }, + { "epsiv", 0x800003f500000000ULL }, + { "eqcirc", 0x8000225600000000ULL }, + { "eqcolon", 0x8000225500000000ULL }, + { "eqsim", 0x8000224200000000ULL }, + { "eqslantgtr", 0x80002a9600000000ULL }, + { "eqslantless", 0x80002a9500000000ULL }, + { "equals", 0x8000003d00000000ULL }, + { "equest", 0x8000225f00000000ULL }, + { "equiv", 0x8000226100000000ULL }, + { "equivDD", 0x80002a7800000000ULL }, + { "eqvparsl", 0x800029e500000000ULL }, + { "erDot", 0x8000225300000000ULL }, + { "erarr", 0x8000297100000000ULL }, + { "escr", 0x8000212f00000000ULL }, + { "esdot", 0x8000225000000000ULL }, + { "esim", 0x8000224200000000ULL }, + { "eta", 0x800003b700000000ULL }, + { "eth", 0x000000f000000000ULL }, + { "euml", 0x000000eb00000000ULL }, + { "euro", 0x800020ac00000000ULL }, + { "excl", 0x8000002100000000ULL }, + { "exist", 0x8000220300000000ULL }, + { "expectation", 0x8000213000000000ULL }, + { "exponentiale", 0x8000214700000000ULL }, + { "fallingdotseq", 0x8000225200000000ULL }, + { "fcy", 0x8000044400000000ULL }, + { "female", 0x8000264000000000ULL }, + { "ffilig", 0x8000fb0300000000ULL }, + { "fflig", 0x8000fb0000000000ULL }, + { "ffllig", 0x8000fb0400000000ULL }, + { "ffr", 0x8001d52300000000ULL }, + { "filig", 0x8000fb0100000000ULL }, + { "fjlig", 0x800000660000006aULL }, + { "flat", 0x8000266d00000000ULL }, + { "fllig", 0x8000fb0200000000ULL }, + { "fltns", 0x800025b100000000ULL }, + { "fnof", 0x8000019200000000ULL }, + { "fopf", 0x8001d55700000000ULL }, + { "forall", 0x8000220000000000ULL }, + { "fork", 0x800022d400000000ULL }, + { "forkv", 0x80002ad900000000ULL }, + { "fpartint", 0x80002a0d00000000ULL }, + { "frac12", 0x000000bd00000000ULL }, + { "frac13", 0x8000215300000000ULL }, + { "frac14", 0x000000bc00000000ULL }, + { "frac15", 0x8000215500000000ULL }, + { "frac16", 0x8000215900000000ULL }, + { "frac18", 0x8000215b00000000ULL }, + { "frac23", 0x8000215400000000ULL }, + { "frac25", 0x8000215600000000ULL }, + { "frac34", 0x000000be00000000ULL }, + { "frac35", 0x8000215700000000ULL }, + { "frac38", 0x8000215c00000000ULL }, + { "frac45", 0x8000215800000000ULL }, + { "frac56", 0x8000215a00000000ULL }, + { "frac58", 0x8000215d00000000ULL }, + { "frac78", 0x8000215e00000000ULL }, + { "frasl", 0x8000204400000000ULL }, + { "frown", 0x8000232200000000ULL }, + { "fscr", 0x8001d4bb00000000ULL }, + { "gE", 0x8000226700000000ULL }, + { "gEl", 0x80002a8c00000000ULL }, + { "gacute", 0x800001f500000000ULL }, + { "gamma", 0x800003b300000000ULL }, + { "gammad", 0x800003dd00000000ULL }, + { "gap", 0x80002a8600000000ULL }, + { "gbreve", 0x8000011f00000000ULL }, + { "gcirc", 0x8000011d00000000ULL }, + { "gcy", 0x8000043300000000ULL }, + { "gdot", 0x8000012100000000ULL }, + { "ge", 0x8000226500000000ULL }, + { "gel", 0x800022db00000000ULL }, + { "geq", 0x8000226500000000ULL }, + { "geqq", 0x8000226700000000ULL }, + { "geqslant", 0x80002a7e00000000ULL }, + { "ges", 0x80002a7e00000000ULL }, + { "gescc", 0x80002aa900000000ULL }, + { "gesdot", 0x80002a8000000000ULL }, + { "gesdoto", 0x80002a8200000000ULL }, + { "gesdotol", 0x80002a8400000000ULL }, + { "gesl", 0x800022db0000fe00ULL }, + { "gesles", 0x80002a9400000000ULL }, + { "gfr", 0x8001d52400000000ULL }, + { "gg", 0x8000226b00000000ULL }, + { "ggg", 0x800022d900000000ULL }, + { "gimel", 0x8000213700000000ULL }, + { "gjcy", 0x8000045300000000ULL }, + { "gl", 0x8000227700000000ULL }, + { "glE", 0x80002a9200000000ULL }, + { "gla", 0x80002aa500000000ULL }, + { "glj", 0x80002aa400000000ULL }, + { "gnE", 0x8000226900000000ULL }, + { "gnap", 0x80002a8a00000000ULL }, + { "gnapprox", 0x80002a8a00000000ULL }, + { "gne", 0x80002a8800000000ULL }, + { "gneq", 0x80002a8800000000ULL }, + { "gneqq", 0x8000226900000000ULL }, + { "gnsim", 0x800022e700000000ULL }, + { "gopf", 0x8001d55800000000ULL }, + { "grave", 0x8000006000000000ULL }, + { "gscr", 0x8000210a00000000ULL }, + { "gsim", 0x8000227300000000ULL }, + { "gsime", 0x80002a8e00000000ULL }, + { "gsiml", 0x80002a9000000000ULL }, + { "gt", 0x0000003e00000000ULL }, + { "gtcc", 0x80002aa700000000ULL }, + { "gtcir", 0x80002a7a00000000ULL }, + { "gtdot", 0x800022d700000000ULL }, + { "gtlPar", 0x8000299500000000ULL }, + { "gtquest", 0x80002a7c00000000ULL }, + { "gtrapprox", 0x80002a8600000000ULL }, + { "gtrarr", 0x8000297800000000ULL }, + { "gtrdot", 0x800022d700000000ULL }, + { "gtreqless", 0x800022db00000000ULL }, + { "gtreqqless", 0x80002a8c00000000ULL }, + { "gtrless", 0x8000227700000000ULL }, + { "gtrsim", 0x8000227300000000ULL }, + { "gvertneqq", 0x800022690000fe00ULL }, + { "gvnE", 0x800022690000fe00ULL }, + { "hArr", 0x800021d400000000ULL }, + { "hairsp", 0x8000200a00000000ULL }, + { "half", 0x800000bd00000000ULL }, + { "hamilt", 0x8000210b00000000ULL }, + { "hardcy", 0x8000044a00000000ULL }, + { "harr", 0x8000219400000000ULL }, + { "harrcir", 0x8000294800000000ULL }, + { "harrw", 0x800021ad00000000ULL }, + { "hbar", 0x8000210f00000000ULL }, + { "hcirc", 0x8000012500000000ULL }, + { "hearts", 0x8000266500000000ULL }, + { "heartsuit", 0x8000266500000000ULL }, + { "hellip", 0x8000202600000000ULL }, + { "hercon", 0x800022b900000000ULL }, + { "hfr", 0x8001d52500000000ULL }, + { "hksearow", 0x8000292500000000ULL }, + { "hkswarow", 0x8000292600000000ULL }, + { "hoarr", 0x800021ff00000000ULL }, + { "homtht", 0x8000223b00000000ULL }, + { "hookleftarrow", 0x800021a900000000ULL }, + { "hookrightarrow", 0x800021aa00000000ULL }, + { "hopf", 0x8001d55900000000ULL }, + { "horbar", 0x8000201500000000ULL }, + { "hscr", 0x8001d4bd00000000ULL }, + { "hslash", 0x8000210f00000000ULL }, + { "hstrok", 0x8000012700000000ULL }, + { "hybull", 0x8000204300000000ULL }, + { "hyphen", 0x8000201000000000ULL }, + { "iacute", 0x000000ed00000000ULL }, + { "ic", 0x8000206300000000ULL }, + { "icirc", 0x000000ee00000000ULL }, + { "icy", 0x8000043800000000ULL }, + { "iecy", 0x8000043500000000ULL }, + { "iexcl", 0x000000a100000000ULL }, + { "iff", 0x800021d400000000ULL }, + { "ifr", 0x8001d52600000000ULL }, + { "igrave", 0x000000ec00000000ULL }, + { "ii", 0x8000214800000000ULL }, + { "iiiint", 0x80002a0c00000000ULL }, + { "iiint", 0x8000222d00000000ULL }, + { "iinfin", 0x800029dc00000000ULL }, + { "iiota", 0x8000212900000000ULL }, + { "ijlig", 0x8000013300000000ULL }, + { "imacr", 0x8000012b00000000ULL }, + { "image", 0x8000211100000000ULL }, + { "imagline", 0x8000211000000000ULL }, + { "imagpart", 0x8000211100000000ULL }, + { "imath", 0x8000013100000000ULL }, + { "imof", 0x800022b700000000ULL }, + { "imped", 0x800001b500000000ULL }, + { "in", 0x8000220800000000ULL }, + { "incare", 0x8000210500000000ULL }, + { "infin", 0x8000221e00000000ULL }, + { "infintie", 0x800029dd00000000ULL }, + { "inodot", 0x8000013100000000ULL }, + { "int", 0x8000222b00000000ULL }, + { "intcal", 0x800022ba00000000ULL }, + { "integers", 0x8000212400000000ULL }, + { "intercal", 0x800022ba00000000ULL }, + { "intlarhk", 0x80002a1700000000ULL }, + { "intprod", 0x80002a3c00000000ULL }, + { "iocy", 0x8000045100000000ULL }, + { "iogon", 0x8000012f00000000ULL }, + { "iopf", 0x8001d55a00000000ULL }, + { "iota", 0x800003b900000000ULL }, + { "iprod", 0x80002a3c00000000ULL }, + { "iquest", 0x000000bf00000000ULL }, + { "iscr", 0x8001d4be00000000ULL }, + { "isin", 0x8000220800000000ULL }, + { "isinE", 0x800022f900000000ULL }, + { "isindot", 0x800022f500000000ULL }, + { "isins", 0x800022f400000000ULL }, + { "isinsv", 0x800022f300000000ULL }, + { "isinv", 0x8000220800000000ULL }, + { "it", 0x8000206200000000ULL }, + { "itilde", 0x8000012900000000ULL }, + { "iukcy", 0x8000045600000000ULL }, + { "iuml", 0x000000ef00000000ULL }, + { "jcirc", 0x8000013500000000ULL }, + { "jcy", 0x8000043900000000ULL }, + { "jfr", 0x8001d52700000000ULL }, + { "jmath", 0x8000023700000000ULL }, + { "jopf", 0x8001d55b00000000ULL }, + { "jscr", 0x8001d4bf00000000ULL }, + { "jsercy", 0x8000045800000000ULL }, + { "jukcy", 0x8000045400000000ULL }, + { "kappa", 0x800003ba00000000ULL }, + { "kappav", 0x800003f000000000ULL }, + { "kcedil", 0x8000013700000000ULL }, + { "kcy", 0x8000043a00000000ULL }, + { "kfr", 0x8001d52800000000ULL }, + { "kgreen", 0x8000013800000000ULL }, + { "khcy", 0x8000044500000000ULL }, + { "kjcy", 0x8000045c00000000ULL }, + { "kopf", 0x8001d55c00000000ULL }, + { "kscr", 0x8001d4c000000000ULL }, + { "lAarr", 0x800021da00000000ULL }, + { "lArr", 0x800021d000000000ULL }, + { "lAtail", 0x8000291b00000000ULL }, + { "lBarr", 0x8000290e00000000ULL }, + { "lE", 0x8000226600000000ULL }, + { "lEg", 0x80002a8b00000000ULL }, + { "lHar", 0x8000296200000000ULL }, + { "lacute", 0x8000013a00000000ULL }, + { "laemptyv", 0x800029b400000000ULL }, + { "lagran", 0x8000211200000000ULL }, + { "lambda", 0x800003bb00000000ULL }, + { "lang", 0x800027e800000000ULL }, + { "langd", 0x8000299100000000ULL }, + { "langle", 0x800027e800000000ULL }, + { "lap", 0x80002a8500000000ULL }, + { "laquo", 0x000000ab00000000ULL }, + { "larr", 0x8000219000000000ULL }, + { "larrb", 0x800021e400000000ULL }, + { "larrbfs", 0x8000291f00000000ULL }, + { "larrfs", 0x8000291d00000000ULL }, + { "larrhk", 0x800021a900000000ULL }, + { "larrlp", 0x800021ab00000000ULL }, + { "larrpl", 0x8000293900000000ULL }, + { "larrsim", 0x8000297300000000ULL }, + { "larrtl", 0x800021a200000000ULL }, + { "lat", 0x80002aab00000000ULL }, + { "latail", 0x8000291900000000ULL }, + { "late", 0x80002aad00000000ULL }, + { "lates", 0x80002aad0000fe00ULL }, + { "lbarr", 0x8000290c00000000ULL }, + { "lbbrk", 0x8000277200000000ULL }, + { "lbrace", 0x8000007b00000000ULL }, + { "lbrack", 0x8000005b00000000ULL }, + { "lbrke", 0x8000298b00000000ULL }, + { "lbrksld", 0x8000298f00000000ULL }, + { "lbrkslu", 0x8000298d00000000ULL }, + { "lcaron", 0x8000013e00000000ULL }, + { "lcedil", 0x8000013c00000000ULL }, + { "lceil", 0x8000230800000000ULL }, + { "lcub", 0x8000007b00000000ULL }, + { "lcy", 0x8000043b00000000ULL }, + { "ldca", 0x8000293600000000ULL }, + { "ldquo", 0x8000201c00000000ULL }, + { "ldquor", 0x8000201e00000000ULL }, + { "ldrdhar", 0x8000296700000000ULL }, + { "ldrushar", 0x8000294b00000000ULL }, + { "ldsh", 0x800021b200000000ULL }, + { "le", 0x8000226400000000ULL }, + { "leftarrow", 0x8000219000000000ULL }, + { "leftarrowtail", 0x800021a200000000ULL }, + { "leftharpoondown", 0x800021bd00000000ULL }, + { "leftharpoonup", 0x800021bc00000000ULL }, + { "leftleftarrows", 0x800021c700000000ULL }, + { "leftrightarrow", 0x8000219400000000ULL }, + { "leftrightarrows", 0x800021c600000000ULL }, + { "leftrightharpoons", 0x800021cb00000000ULL }, + { "leftrightsquigarrow", 0x800021ad00000000ULL }, + { "leftthreetimes", 0x800022cb00000000ULL }, + { "leg", 0x800022da00000000ULL }, + { "leq", 0x8000226400000000ULL }, + { "leqq", 0x8000226600000000ULL }, + { "leqslant", 0x80002a7d00000000ULL }, + { "les", 0x80002a7d00000000ULL }, + { "lescc", 0x80002aa800000000ULL }, + { "lesdot", 0x80002a7f00000000ULL }, + { "lesdoto", 0x80002a8100000000ULL }, + { "lesdotor", 0x80002a8300000000ULL }, + { "lesg", 0x800022da0000fe00ULL }, + { "lesges", 0x80002a9300000000ULL }, + { "lessapprox", 0x80002a8500000000ULL }, + { "lessdot", 0x800022d600000000ULL }, + { "lesseqgtr", 0x800022da00000000ULL }, + { "lesseqqgtr", 0x80002a8b00000000ULL }, + { "lessgtr", 0x8000227600000000ULL }, + { "lesssim", 0x8000227200000000ULL }, + { "lfisht", 0x8000297c00000000ULL }, + { "lfloor", 0x8000230a00000000ULL }, + { "lfr", 0x8001d52900000000ULL }, + { "lg", 0x8000227600000000ULL }, + { "lgE", 0x80002a9100000000ULL }, + { "lhard", 0x800021bd00000000ULL }, + { "lharu", 0x800021bc00000000ULL }, + { "lharul", 0x8000296a00000000ULL }, + { "lhblk", 0x8000258400000000ULL }, + { "ljcy", 0x8000045900000000ULL }, + { "ll", 0x8000226a00000000ULL }, + { "llarr", 0x800021c700000000ULL }, + { "llcorner", 0x8000231e00000000ULL }, + { "llhard", 0x8000296b00000000ULL }, + { "lltri", 0x800025fa00000000ULL }, + { "lmidot", 0x8000014000000000ULL }, + { "lmoust", 0x800023b000000000ULL }, + { "lmoustache", 0x800023b000000000ULL }, + { "lnE", 0x8000226800000000ULL }, + { "lnap", 0x80002a8900000000ULL }, + { "lnapprox", 0x80002a8900000000ULL }, + { "lne", 0x80002a8700000000ULL }, + { "lneq", 0x80002a8700000000ULL }, + { "lneqq", 0x8000226800000000ULL }, + { "lnsim", 0x800022e600000000ULL }, + { "loang", 0x800027ec00000000ULL }, + { "loarr", 0x800021fd00000000ULL }, + { "lobrk", 0x800027e600000000ULL }, + { "longleftarrow", 0x800027f500000000ULL }, + { "longleftrightarrow", 0x800027f700000000ULL }, + { "longmapsto", 0x800027fc00000000ULL }, + { "longrightarrow", 0x800027f600000000ULL }, + { "looparrowleft", 0x800021ab00000000ULL }, + { "looparrowright", 0x800021ac00000000ULL }, + { "lopar", 0x8000298500000000ULL }, + { "lopf", 0x8001d55d00000000ULL }, + { "loplus", 0x80002a2d00000000ULL }, + { "lotimes", 0x80002a3400000000ULL }, + { "lowast", 0x8000221700000000ULL }, + { "lowbar", 0x8000005f00000000ULL }, + { "loz", 0x800025ca00000000ULL }, + { "lozenge", 0x800025ca00000000ULL }, + { "lozf", 0x800029eb00000000ULL }, + { "lpar", 0x8000002800000000ULL }, + { "lparlt", 0x8000299300000000ULL }, + { "lrarr", 0x800021c600000000ULL }, + { "lrcorner", 0x8000231f00000000ULL }, + { "lrhar", 0x800021cb00000000ULL }, + { "lrhard", 0x8000296d00000000ULL }, + { "lrm", 0x8000200e00000000ULL }, + { "lrtri", 0x800022bf00000000ULL }, + { "lsaquo", 0x8000203900000000ULL }, + { "lscr", 0x8001d4c100000000ULL }, + { "lsh", 0x800021b000000000ULL }, + { "lsim", 0x8000227200000000ULL }, + { "lsime", 0x80002a8d00000000ULL }, + { "lsimg", 0x80002a8f00000000ULL }, + { "lsqb", 0x8000005b00000000ULL }, + { "lsquo", 0x8000201800000000ULL }, + { "lsquor", 0x8000201a00000000ULL }, + { "lstrok", 0x8000014200000000ULL }, + { "lt", 0x0000003c00000000ULL }, + { "ltcc", 0x80002aa600000000ULL }, + { "ltcir", 0x80002a7900000000ULL }, + { "ltdot", 0x800022d600000000ULL }, + { "lthree", 0x800022cb00000000ULL }, + { "ltimes", 0x800022c900000000ULL }, + { "ltlarr", 0x8000297600000000ULL }, + { "ltquest", 0x80002a7b00000000ULL }, + { "ltrPar", 0x8000299600000000ULL }, + { "ltri", 0x800025c300000000ULL }, + { "ltrie", 0x800022b400000000ULL }, + { "ltrif", 0x800025c200000000ULL }, + { "lurdshar", 0x8000294a00000000ULL }, + { "luruhar", 0x8000296600000000ULL }, + { "lvertneqq", 0x800022680000fe00ULL }, + { "lvnE", 0x800022680000fe00ULL }, + { "mDDot", 0x8000223a00000000ULL }, + { "macr", 0x000000af00000000ULL }, + { "male", 0x8000264200000000ULL }, + { "malt", 0x8000272000000000ULL }, + { "maltese", 0x8000272000000000ULL }, + { "map", 0x800021a600000000ULL }, + { "mapsto", 0x800021a600000000ULL }, + { "mapstodown", 0x800021a700000000ULL }, + { "mapstoleft", 0x800021a400000000ULL }, + { "mapstoup", 0x800021a500000000ULL }, + { "marker", 0x800025ae00000000ULL }, + { "mcomma", 0x80002a2900000000ULL }, + { "mcy", 0x8000043c00000000ULL }, + { "mdash", 0x8000201400000000ULL }, + { "measuredangle", 0x8000222100000000ULL }, + { "mfr", 0x8001d52a00000000ULL }, + { "mho", 0x8000212700000000ULL }, + { "micro", 0x000000b500000000ULL }, + { "mid", 0x8000222300000000ULL }, + { "midast", 0x8000002a00000000ULL }, + { "midcir", 0x80002af000000000ULL }, + { "middot", 0x000000b700000000ULL }, + { "minus", 0x8000221200000000ULL }, + { "minusb", 0x8000229f00000000ULL }, + { "minusd", 0x8000223800000000ULL }, + { "minusdu", 0x80002a2a00000000ULL }, + { "mlcp", 0x80002adb00000000ULL }, + { "mldr", 0x8000202600000000ULL }, + { "mnplus", 0x8000221300000000ULL }, + { "models", 0x800022a700000000ULL }, + { "mopf", 0x8001d55e00000000ULL }, + { "mp", 0x8000221300000000ULL }, + { "mscr", 0x8001d4c200000000ULL }, + { "mstpos", 0x8000223e00000000ULL }, + { "mu", 0x800003bc00000000ULL }, + { "multimap", 0x800022b800000000ULL }, + { "mumap", 0x800022b800000000ULL }, + { "nGg", 0x800022d900000338ULL }, + { "nGt", 0x8000226b000020d2ULL }, + { "nGtv", 0x8000226b00000338ULL }, + { "nLeftarrow", 0x800021cd00000000ULL }, + { "nLeftrightarrow", 0x800021ce00000000ULL }, + { "nLl", 0x800022d800000338ULL }, + { "nLt", 0x8000226a000020d2ULL }, + { "nLtv", 0x8000226a00000338ULL }, + { "nRightarrow", 0x800021cf00000000ULL }, + { "nVDash", 0x800022af00000000ULL }, + { "nVdash", 0x800022ae00000000ULL }, + { "nabla", 0x8000220700000000ULL }, + { "nacute", 0x8000014400000000ULL }, + { "nang", 0x80002220000020d2ULL }, + { "nap", 0x8000224900000000ULL }, + { "napE", 0x80002a7000000338ULL }, + { "napid", 0x8000224b00000338ULL }, + { "napos", 0x8000014900000000ULL }, + { "napprox", 0x8000224900000000ULL }, + { "natur", 0x8000266e00000000ULL }, + { "natural", 0x8000266e00000000ULL }, + { "naturals", 0x8000211500000000ULL }, + { "nbsp", 0x000000a000000000ULL }, + { "nbump", 0x8000224e00000338ULL }, + { "nbumpe", 0x8000224f00000338ULL }, + { "ncap", 0x80002a4300000000ULL }, + { "ncaron", 0x8000014800000000ULL }, + { "ncedil", 0x8000014600000000ULL }, + { "ncong", 0x8000224700000000ULL }, + { "ncongdot", 0x80002a6d00000338ULL }, + { "ncup", 0x80002a4200000000ULL }, + { "ncy", 0x8000043d00000000ULL }, + { "ndash", 0x8000201300000000ULL }, + { "ne", 0x8000226000000000ULL }, + { "neArr", 0x800021d700000000ULL }, + { "nearhk", 0x8000292400000000ULL }, + { "nearr", 0x8000219700000000ULL }, + { "nearrow", 0x8000219700000000ULL }, + { "nedot", 0x8000225000000338ULL }, + { "nequiv", 0x8000226200000000ULL }, + { "nesear", 0x8000292800000000ULL }, + { "nesim", 0x8000224200000338ULL }, + { "nexist", 0x8000220400000000ULL }, + { "nexists", 0x8000220400000000ULL }, + { "nfr", 0x8001d52b00000000ULL }, + { "ngE", 0x8000226700000338ULL }, + { "nge", 0x8000227100000000ULL }, + { "ngeq", 0x8000227100000000ULL }, + { "ngeqq", 0x8000226700000338ULL }, + { "ngeqslant", 0x80002a7e00000338ULL }, + { "nges", 0x80002a7e00000338ULL }, + { "ngsim", 0x8000227500000000ULL }, + { "ngt", 0x8000226f00000000ULL }, + { "ngtr", 0x8000226f00000000ULL }, + { "nhArr", 0x800021ce00000000ULL }, + { "nharr", 0x800021ae00000000ULL }, + { "nhpar", 0x80002af200000000ULL }, + { "ni", 0x8000220b00000000ULL }, + { "nis", 0x800022fc00000000ULL }, + { "nisd", 0x800022fa00000000ULL }, + { "niv", 0x8000220b00000000ULL }, + { "njcy", 0x8000045a00000000ULL }, + { "nlArr", 0x800021cd00000000ULL }, + { "nlE", 0x8000226600000338ULL }, + { "nlarr", 0x8000219a00000000ULL }, + { "nldr", 0x8000202500000000ULL }, + { "nle", 0x8000227000000000ULL }, + { "nleftarrow", 0x8000219a00000000ULL }, + { "nleftrightarrow", 0x800021ae00000000ULL }, + { "nleq", 0x8000227000000000ULL }, + { "nleqq", 0x8000226600000338ULL }, + { "nleqslant", 0x80002a7d00000338ULL }, + { "nles", 0x80002a7d00000338ULL }, + { "nless", 0x8000226e00000000ULL }, + { "nlsim", 0x8000227400000000ULL }, + { "nlt", 0x8000226e00000000ULL }, + { "nltri", 0x800022ea00000000ULL }, + { "nltrie", 0x800022ec00000000ULL }, + { "nmid", 0x8000222400000000ULL }, + { "nopf", 0x8001d55f00000000ULL }, + { "not", 0x000000ac00000000ULL }, + { "notin", 0x8000220900000000ULL }, + { "notinE", 0x800022f900000338ULL }, + { "notindot", 0x800022f500000338ULL }, + { "notinva", 0x8000220900000000ULL }, + { "notinvb", 0x800022f700000000ULL }, + { "notinvc", 0x800022f600000000ULL }, + { "notni", 0x8000220c00000000ULL }, + { "notniva", 0x8000220c00000000ULL }, + { "notnivb", 0x800022fe00000000ULL }, + { "notnivc", 0x800022fd00000000ULL }, + { "npar", 0x8000222600000000ULL }, + { "nparallel", 0x8000222600000000ULL }, + { "nparsl", 0x80002afd000020e5ULL }, + { "npart", 0x8000220200000338ULL }, + { "npolint", 0x80002a1400000000ULL }, + { "npr", 0x8000228000000000ULL }, + { "nprcue", 0x800022e000000000ULL }, + { "npre", 0x80002aaf00000338ULL }, + { "nprec", 0x8000228000000000ULL }, + { "npreceq", 0x80002aaf00000338ULL }, + { "nrArr", 0x800021cf00000000ULL }, + { "nrarr", 0x8000219b00000000ULL }, + { "nrarrc", 0x8000293300000338ULL }, + { "nrarrw", 0x8000219d00000338ULL }, + { "nrightarrow", 0x8000219b00000000ULL }, + { "nrtri", 0x800022eb00000000ULL }, + { "nrtrie", 0x800022ed00000000ULL }, + { "nsc", 0x8000228100000000ULL }, + { "nsccue", 0x800022e100000000ULL }, + { "nsce", 0x80002ab000000338ULL }, + { "nscr", 0x8001d4c300000000ULL }, + { "nshortmid", 0x8000222400000000ULL }, + { "nshortparallel", 0x8000222600000000ULL }, + { "nsim", 0x8000224100000000ULL }, + { "nsime", 0x8000224400000000ULL }, + { "nsimeq", 0x8000224400000000ULL }, + { "nsmid", 0x8000222400000000ULL }, + { "nspar", 0x8000222600000000ULL }, + { "nsqsube", 0x800022e200000000ULL }, + { "nsqsupe", 0x800022e300000000ULL }, + { "nsub", 0x8000228400000000ULL }, + { "nsubE", 0x80002ac500000338ULL }, + { "nsube", 0x8000228800000000ULL }, + { "nsubset", 0x80002282000020d2ULL }, + { "nsubseteq", 0x8000228800000000ULL }, + { "nsubseteqq", 0x80002ac500000338ULL }, + { "nsucc", 0x8000228100000000ULL }, + { "nsucceq", 0x80002ab000000338ULL }, + { "nsup", 0x8000228500000000ULL }, + { "nsupE", 0x80002ac600000338ULL }, + { "nsupe", 0x8000228900000000ULL }, + { "nsupset", 0x80002283000020d2ULL }, + { "nsupseteq", 0x8000228900000000ULL }, + { "nsupseteqq", 0x80002ac600000338ULL }, + { "ntgl", 0x8000227900000000ULL }, + { "ntilde", 0x000000f100000000ULL }, + { "ntlg", 0x8000227800000000ULL }, + { "ntriangleleft", 0x800022ea00000000ULL }, + { "ntrianglelefteq", 0x800022ec00000000ULL }, + { "ntriangleright", 0x800022eb00000000ULL }, + { "ntrianglerighteq", 0x800022ed00000000ULL }, + { "nu", 0x800003bd00000000ULL }, + { "num", 0x8000002300000000ULL }, + { "numero", 0x8000211600000000ULL }, + { "numsp", 0x8000200700000000ULL }, + { "nvDash", 0x800022ad00000000ULL }, + { "nvHarr", 0x8000290400000000ULL }, + { "nvap", 0x8000224d000020d2ULL }, + { "nvdash", 0x800022ac00000000ULL }, + { "nvge", 0x80002265000020d2ULL }, + { "nvgt", 0x8000003e000020d2ULL }, + { "nvinfin", 0x800029de00000000ULL }, + { "nvlArr", 0x8000290200000000ULL }, + { "nvle", 0x80002264000020d2ULL }, + { "nvlt", 0x8000003c000020d2ULL }, + { "nvltrie", 0x800022b4000020d2ULL }, + { "nvrArr", 0x8000290300000000ULL }, + { "nvrtrie", 0x800022b5000020d2ULL }, + { "nvsim", 0x8000223c000020d2ULL }, + { "nwArr", 0x800021d600000000ULL }, + { "nwarhk", 0x8000292300000000ULL }, + { "nwarr", 0x8000219600000000ULL }, + { "nwarrow", 0x8000219600000000ULL }, + { "nwnear", 0x8000292700000000ULL }, + { "oS", 0x800024c800000000ULL }, + { "oacute", 0x000000f300000000ULL }, + { "oast", 0x8000229b00000000ULL }, + { "ocir", 0x8000229a00000000ULL }, + { "ocirc", 0x000000f400000000ULL }, + { "ocy", 0x8000043e00000000ULL }, + { "odash", 0x8000229d00000000ULL }, + { "odblac", 0x8000015100000000ULL }, + { "odiv", 0x80002a3800000000ULL }, + { "odot", 0x8000229900000000ULL }, + { "odsold", 0x800029bc00000000ULL }, + { "oelig", 0x8000015300000000ULL }, + { "ofcir", 0x800029bf00000000ULL }, + { "ofr", 0x8001d52c00000000ULL }, + { "ogon", 0x800002db00000000ULL }, + { "ograve", 0x000000f200000000ULL }, + { "ogt", 0x800029c100000000ULL }, + { "ohbar", 0x800029b500000000ULL }, + { "ohm", 0x800003a900000000ULL }, + { "oint", 0x8000222e00000000ULL }, + { "olarr", 0x800021ba00000000ULL }, + { "olcir", 0x800029be00000000ULL }, + { "olcross", 0x800029bb00000000ULL }, + { "oline", 0x8000203e00000000ULL }, + { "olt", 0x800029c000000000ULL }, + { "omacr", 0x8000014d00000000ULL }, + { "omega", 0x800003c900000000ULL }, + { "omicron", 0x800003bf00000000ULL }, + { "omid", 0x800029b600000000ULL }, + { "ominus", 0x8000229600000000ULL }, + { "oopf", 0x8001d56000000000ULL }, + { "opar", 0x800029b700000000ULL }, + { "operp", 0x800029b900000000ULL }, + { "oplus", 0x8000229500000000ULL }, + { "or", 0x8000222800000000ULL }, + { "orarr", 0x800021bb00000000ULL }, + { "ord", 0x80002a5d00000000ULL }, + { "order", 0x8000213400000000ULL }, + { "orderof", 0x8000213400000000ULL }, + { "ordf", 0x000000aa00000000ULL }, + { "ordm", 0x000000ba00000000ULL }, + { "origof", 0x800022b600000000ULL }, + { "oror", 0x80002a5600000000ULL }, + { "orslope", 0x80002a5700000000ULL }, + { "orv", 0x80002a5b00000000ULL }, + { "oscr", 0x8000213400000000ULL }, + { "oslash", 0x000000f800000000ULL }, + { "osol", 0x8000229800000000ULL }, + { "otilde", 0x000000f500000000ULL }, + { "otimes", 0x8000229700000000ULL }, + { "otimesas", 0x80002a3600000000ULL }, + { "ouml", 0x000000f600000000ULL }, + { "ovbar", 0x8000233d00000000ULL }, + { "par", 0x8000222500000000ULL }, + { "para", 0x000000b600000000ULL }, + { "parallel", 0x8000222500000000ULL }, + { "parsim", 0x80002af300000000ULL }, + { "parsl", 0x80002afd00000000ULL }, + { "part", 0x8000220200000000ULL }, + { "pcy", 0x8000043f00000000ULL }, + { "percnt", 0x8000002500000000ULL }, + { "period", 0x8000002e00000000ULL }, + { "permil", 0x8000203000000000ULL }, + { "perp", 0x800022a500000000ULL }, + { "pertenk", 0x8000203100000000ULL }, + { "pfr", 0x8001d52d00000000ULL }, + { "phi", 0x800003c600000000ULL }, + { "phiv", 0x800003d500000000ULL }, + { "phmmat", 0x8000213300000000ULL }, + { "phone", 0x8000260e00000000ULL }, + { "pi", 0x800003c000000000ULL }, + { "pitchfork", 0x800022d400000000ULL }, + { "piv", 0x800003d600000000ULL }, + { "planck", 0x8000210f00000000ULL }, + { "planckh", 0x8000210e00000000ULL }, + { "plankv", 0x8000210f00000000ULL }, + { "plus", 0x8000002b00000000ULL }, + { "plusacir", 0x80002a2300000000ULL }, + { "plusb", 0x8000229e00000000ULL }, + { "pluscir", 0x80002a2200000000ULL }, + { "plusdo", 0x8000221400000000ULL }, + { "plusdu", 0x80002a2500000000ULL }, + { "pluse", 0x80002a7200000000ULL }, + { "plusmn", 0x000000b100000000ULL }, + { "plussim", 0x80002a2600000000ULL }, + { "plustwo", 0x80002a2700000000ULL }, + { "pm", 0x800000b100000000ULL }, + { "pointint", 0x80002a1500000000ULL }, + { "popf", 0x8001d56100000000ULL }, + { "pound", 0x000000a300000000ULL }, + { "pr", 0x8000227a00000000ULL }, + { "prE", 0x80002ab300000000ULL }, + { "prap", 0x80002ab700000000ULL }, + { "prcue", 0x8000227c00000000ULL }, + { "pre", 0x80002aaf00000000ULL }, + { "prec", 0x8000227a00000000ULL }, + { "precapprox", 0x80002ab700000000ULL }, + { "preccurlyeq", 0x8000227c00000000ULL }, + { "preceq", 0x80002aaf00000000ULL }, + { "precnapprox", 0x80002ab900000000ULL }, + { "precneqq", 0x80002ab500000000ULL }, + { "precnsim", 0x800022e800000000ULL }, + { "precsim", 0x8000227e00000000ULL }, + { "prime", 0x8000203200000000ULL }, + { "primes", 0x8000211900000000ULL }, + { "prnE", 0x80002ab500000000ULL }, + { "prnap", 0x80002ab900000000ULL }, + { "prnsim", 0x800022e800000000ULL }, + { "prod", 0x8000220f00000000ULL }, + { "profalar", 0x8000232e00000000ULL }, + { "profline", 0x8000231200000000ULL }, + { "profsurf", 0x8000231300000000ULL }, + { "prop", 0x8000221d00000000ULL }, + { "propto", 0x8000221d00000000ULL }, + { "prsim", 0x8000227e00000000ULL }, + { "prurel", 0x800022b000000000ULL }, + { "pscr", 0x8001d4c500000000ULL }, + { "psi", 0x800003c800000000ULL }, + { "puncsp", 0x8000200800000000ULL }, + { "qfr", 0x8001d52e00000000ULL }, + { "qint", 0x80002a0c00000000ULL }, + { "qopf", 0x8001d56200000000ULL }, + { "qprime", 0x8000205700000000ULL }, + { "qscr", 0x8001d4c600000000ULL }, + { "quaternions", 0x8000210d00000000ULL }, + { "quatint", 0x80002a1600000000ULL }, + { "quest", 0x8000003f00000000ULL }, + { "questeq", 0x8000225f00000000ULL }, + { "quot", 0x0000002200000000ULL }, + { "rAarr", 0x800021db00000000ULL }, + { "rArr", 0x800021d200000000ULL }, + { "rAtail", 0x8000291c00000000ULL }, + { "rBarr", 0x8000290f00000000ULL }, + { "rHar", 0x8000296400000000ULL }, + { "race", 0x8000223d00000331ULL }, + { "racute", 0x8000015500000000ULL }, + { "radic", 0x8000221a00000000ULL }, + { "raemptyv", 0x800029b300000000ULL }, + { "rang", 0x800027e900000000ULL }, + { "rangd", 0x8000299200000000ULL }, + { "range", 0x800029a500000000ULL }, + { "rangle", 0x800027e900000000ULL }, + { "raquo", 0x000000bb00000000ULL }, + { "rarr", 0x8000219200000000ULL }, + { "rarrap", 0x8000297500000000ULL }, + { "rarrb", 0x800021e500000000ULL }, + { "rarrbfs", 0x8000292000000000ULL }, + { "rarrc", 0x8000293300000000ULL }, + { "rarrfs", 0x8000291e00000000ULL }, + { "rarrhk", 0x800021aa00000000ULL }, + { "rarrlp", 0x800021ac00000000ULL }, + { "rarrpl", 0x8000294500000000ULL }, + { "rarrsim", 0x8000297400000000ULL }, + { "rarrtl", 0x800021a300000000ULL }, + { "rarrw", 0x8000219d00000000ULL }, + { "ratail", 0x8000291a00000000ULL }, + { "ratio", 0x8000223600000000ULL }, + { "rationals", 0x8000211a00000000ULL }, + { "rbarr", 0x8000290d00000000ULL }, + { "rbbrk", 0x8000277300000000ULL }, + { "rbrace", 0x8000007d00000000ULL }, + { "rbrack", 0x8000005d00000000ULL }, + { "rbrke", 0x8000298c00000000ULL }, + { "rbrksld", 0x8000298e00000000ULL }, + { "rbrkslu", 0x8000299000000000ULL }, + { "rcaron", 0x8000015900000000ULL }, + { "rcedil", 0x8000015700000000ULL }, + { "rceil", 0x8000230900000000ULL }, + { "rcub", 0x8000007d00000000ULL }, + { "rcy", 0x8000044000000000ULL }, + { "rdca", 0x8000293700000000ULL }, + { "rdldhar", 0x8000296900000000ULL }, + { "rdquo", 0x8000201d00000000ULL }, + { "rdquor", 0x8000201d00000000ULL }, + { "rdsh", 0x800021b300000000ULL }, + { "real", 0x8000211c00000000ULL }, + { "realine", 0x8000211b00000000ULL }, + { "realpart", 0x8000211c00000000ULL }, + { "reals", 0x8000211d00000000ULL }, + { "rect", 0x800025ad00000000ULL }, + { "reg", 0x000000ae00000000ULL }, + { "rfisht", 0x8000297d00000000ULL }, + { "rfloor", 0x8000230b00000000ULL }, + { "rfr", 0x8001d52f00000000ULL }, + { "rhard", 0x800021c100000000ULL }, + { "rharu", 0x800021c000000000ULL }, + { "rharul", 0x8000296c00000000ULL }, + { "rho", 0x800003c100000000ULL }, + { "rhov", 0x800003f100000000ULL }, + { "rightarrow", 0x8000219200000000ULL }, + { "rightarrowtail", 0x800021a300000000ULL }, + { "rightharpoondown", 0x800021c100000000ULL }, + { "rightharpoonup", 0x800021c000000000ULL }, + { "rightleftarrows", 0x800021c400000000ULL }, + { "rightleftharpoons", 0x800021cc00000000ULL }, + { "rightrightarrows", 0x800021c900000000ULL }, + { "rightsquigarrow", 0x8000219d00000000ULL }, + { "rightthreetimes", 0x800022cc00000000ULL }, + { "ring", 0x800002da00000000ULL }, + { "risingdotseq", 0x8000225300000000ULL }, + { "rlarr", 0x800021c400000000ULL }, + { "rlhar", 0x800021cc00000000ULL }, + { "rlm", 0x8000200f00000000ULL }, + { "rmoust", 0x800023b100000000ULL }, + { "rmoustache", 0x800023b100000000ULL }, + { "rnmid", 0x80002aee00000000ULL }, + { "roang", 0x800027ed00000000ULL }, + { "roarr", 0x800021fe00000000ULL }, + { "robrk", 0x800027e700000000ULL }, + { "ropar", 0x8000298600000000ULL }, + { "ropf", 0x8001d56300000000ULL }, + { "roplus", 0x80002a2e00000000ULL }, + { "rotimes", 0x80002a3500000000ULL }, + { "rpar", 0x8000002900000000ULL }, + { "rpargt", 0x8000299400000000ULL }, + { "rppolint", 0x80002a1200000000ULL }, + { "rrarr", 0x800021c900000000ULL }, + { "rsaquo", 0x8000203a00000000ULL }, + { "rscr", 0x8001d4c700000000ULL }, + { "rsh", 0x800021b100000000ULL }, + { "rsqb", 0x8000005d00000000ULL }, + { "rsquo", 0x8000201900000000ULL }, + { "rsquor", 0x8000201900000000ULL }, + { "rthree", 0x800022cc00000000ULL }, + { "rtimes", 0x800022ca00000000ULL }, + { "rtri", 0x800025b900000000ULL }, + { "rtrie", 0x800022b500000000ULL }, + { "rtrif", 0x800025b800000000ULL }, + { "rtriltri", 0x800029ce00000000ULL }, + { "ruluhar", 0x8000296800000000ULL }, + { "rx", 0x8000211e00000000ULL }, + { "sacute", 0x8000015b00000000ULL }, + { "sbquo", 0x8000201a00000000ULL }, + { "sc", 0x8000227b00000000ULL }, + { "scE", 0x80002ab400000000ULL }, + { "scap", 0x80002ab800000000ULL }, + { "scaron", 0x8000016100000000ULL }, + { "sccue", 0x8000227d00000000ULL }, + { "sce", 0x80002ab000000000ULL }, + { "scedil", 0x8000015f00000000ULL }, + { "scirc", 0x8000015d00000000ULL }, + { "scnE", 0x80002ab600000000ULL }, + { "scnap", 0x80002aba00000000ULL }, + { "scnsim", 0x800022e900000000ULL }, + { "scpolint", 0x80002a1300000000ULL }, + { "scsim", 0x8000227f00000000ULL }, + { "scy", 0x8000044100000000ULL }, + { "sdot", 0x800022c500000000ULL }, + { "sdotb", 0x800022a100000000ULL }, + { "sdote", 0x80002a6600000000ULL }, + { "seArr", 0x800021d800000000ULL }, + { "searhk", 0x8000292500000000ULL }, + { "searr", 0x8000219800000000ULL }, + { "searrow", 0x8000219800000000ULL }, + { "sect", 0x000000a700000000ULL }, + { "semi", 0x8000003b00000000ULL }, + { "seswar", 0x8000292900000000ULL }, + { "setminus", 0x8000221600000000ULL }, + { "setmn", 0x8000221600000000ULL }, + { "sext", 0x8000273600000000ULL }, + { "sfr", 0x8001d53000000000ULL }, + { "sfrown", 0x8000232200000000ULL }, + { "sharp", 0x8000266f00000000ULL }, + { "shchcy", 0x8000044900000000ULL }, + { "shcy", 0x8000044800000000ULL }, + { "shortmid", 0x8000222300000000ULL }, + { "shortparallel", 0x8000222500000000ULL }, + { "shy", 0x000000ad00000000ULL }, + { "sigma", 0x800003c300000000ULL }, + { "sigmaf", 0x800003c200000000ULL }, + { "sigmav", 0x800003c200000000ULL }, + { "sim", 0x8000223c00000000ULL }, + { "simdot", 0x80002a6a00000000ULL }, + { "sime", 0x8000224300000000ULL }, + { "simeq", 0x8000224300000000ULL }, + { "simg", 0x80002a9e00000000ULL }, + { "simgE", 0x80002aa000000000ULL }, + { "siml", 0x80002a9d00000000ULL }, + { "simlE", 0x80002a9f00000000ULL }, + { "simne", 0x8000224600000000ULL }, + { "simplus", 0x80002a2400000000ULL }, + { "simrarr", 0x8000297200000000ULL }, + { "slarr", 0x8000219000000000ULL }, + { "smallsetminus", 0x8000221600000000ULL }, + { "smashp", 0x80002a3300000000ULL }, + { "smeparsl", 0x800029e400000000ULL }, + { "smid", 0x8000222300000000ULL }, + { "smile", 0x8000232300000000ULL }, + { "smt", 0x80002aaa00000000ULL }, + { "smte", 0x80002aac00000000ULL }, + { "smtes", 0x80002aac0000fe00ULL }, + { "softcy", 0x8000044c00000000ULL }, + { "sol", 0x8000002f00000000ULL }, + { "solb", 0x800029c400000000ULL }, + { "solbar", 0x8000233f00000000ULL }, + { "sopf", 0x8001d56400000000ULL }, + { "spades", 0x8000266000000000ULL }, + { "spadesuit", 0x8000266000000000ULL }, + { "spar", 0x8000222500000000ULL }, + { "sqcap", 0x8000229300000000ULL }, + { "sqcaps", 0x800022930000fe00ULL }, + { "sqcup", 0x8000229400000000ULL }, + { "sqcups", 0x800022940000fe00ULL }, + { "sqsub", 0x8000228f00000000ULL }, + { "sqsube", 0x8000229100000000ULL }, + { "sqsubset", 0x8000228f00000000ULL }, + { "sqsubseteq", 0x8000229100000000ULL }, + { "sqsup", 0x8000229000000000ULL }, + { "sqsupe", 0x8000229200000000ULL }, + { "sqsupset", 0x8000229000000000ULL }, + { "sqsupseteq", 0x8000229200000000ULL }, + { "squ", 0x800025a100000000ULL }, + { "square", 0x800025a100000000ULL }, + { "squarf", 0x800025aa00000000ULL }, + { "squf", 0x800025aa00000000ULL }, + { "srarr", 0x8000219200000000ULL }, + { "sscr", 0x8001d4c800000000ULL }, + { "ssetmn", 0x8000221600000000ULL }, + { "ssmile", 0x8000232300000000ULL }, + { "sstarf", 0x800022c600000000ULL }, + { "star", 0x8000260600000000ULL }, + { "starf", 0x8000260500000000ULL }, + { "straightepsilon", 0x800003f500000000ULL }, + { "straightphi", 0x800003d500000000ULL }, + { "strns", 0x800000af00000000ULL }, + { "sub", 0x8000228200000000ULL }, + { "subE", 0x80002ac500000000ULL }, + { "subdot", 0x80002abd00000000ULL }, + { "sube", 0x8000228600000000ULL }, + { "subedot", 0x80002ac300000000ULL }, + { "submult", 0x80002ac100000000ULL }, + { "subnE", 0x80002acb00000000ULL }, + { "subne", 0x8000228a00000000ULL }, + { "subplus", 0x80002abf00000000ULL }, + { "subrarr", 0x8000297900000000ULL }, + { "subset", 0x8000228200000000ULL }, + { "subseteq", 0x8000228600000000ULL }, + { "subseteqq", 0x80002ac500000000ULL }, + { "subsetneq", 0x8000228a00000000ULL }, + { "subsetneqq", 0x80002acb00000000ULL }, + { "subsim", 0x80002ac700000000ULL }, + { "subsub", 0x80002ad500000000ULL }, + { "subsup", 0x80002ad300000000ULL }, + { "succ", 0x8000227b00000000ULL }, + { "succapprox", 0x80002ab800000000ULL }, + { "succcurlyeq", 0x8000227d00000000ULL }, + { "succeq", 0x80002ab000000000ULL }, + { "succnapprox", 0x80002aba00000000ULL }, + { "succneqq", 0x80002ab600000000ULL }, + { "succnsim", 0x800022e900000000ULL }, + { "succsim", 0x8000227f00000000ULL }, + { "sum", 0x8000221100000000ULL }, + { "sung", 0x8000266a00000000ULL }, + { "sup", 0x8000228300000000ULL }, + { "sup1", 0x000000b900000000ULL }, + { "sup2", 0x000000b200000000ULL }, + { "sup3", 0x000000b300000000ULL }, + { "supE", 0x80002ac600000000ULL }, + { "supdot", 0x80002abe00000000ULL }, + { "supdsub", 0x80002ad800000000ULL }, + { "supe", 0x8000228700000000ULL }, + { "supedot", 0x80002ac400000000ULL }, + { "suphsol", 0x800027c900000000ULL }, + { "suphsub", 0x80002ad700000000ULL }, + { "suplarr", 0x8000297b00000000ULL }, + { "supmult", 0x80002ac200000000ULL }, + { "supnE", 0x80002acc00000000ULL }, + { "supne", 0x8000228b00000000ULL }, + { "supplus", 0x80002ac000000000ULL }, + { "supset", 0x8000228300000000ULL }, + { "supseteq", 0x8000228700000000ULL }, + { "supseteqq", 0x80002ac600000000ULL }, + { "supsetneq", 0x8000228b00000000ULL }, + { "supsetneqq", 0x80002acc00000000ULL }, + { "supsim", 0x80002ac800000000ULL }, + { "supsub", 0x80002ad400000000ULL }, + { "supsup", 0x80002ad600000000ULL }, + { "swArr", 0x800021d900000000ULL }, + { "swarhk", 0x8000292600000000ULL }, + { "swarr", 0x8000219900000000ULL }, + { "swarrow", 0x8000219900000000ULL }, + { "swnwar", 0x8000292a00000000ULL }, + { "szlig", 0x000000df00000000ULL }, + { "target", 0x8000231600000000ULL }, + { "tau", 0x800003c400000000ULL }, + { "tbrk", 0x800023b400000000ULL }, + { "tcaron", 0x8000016500000000ULL }, + { "tcedil", 0x8000016300000000ULL }, + { "tcy", 0x8000044200000000ULL }, + { "tdot", 0x800020db00000000ULL }, + { "telrec", 0x8000231500000000ULL }, + { "tfr", 0x8001d53100000000ULL }, + { "there4", 0x8000223400000000ULL }, + { "therefore", 0x8000223400000000ULL }, + { "theta", 0x800003b800000000ULL }, + { "thetasym", 0x800003d100000000ULL }, + { "thetav", 0x800003d100000000ULL }, + { "thickapprox", 0x8000224800000000ULL }, + { "thicksim", 0x8000223c00000000ULL }, + { "thinsp", 0x8000200900000000ULL }, + { "thkap", 0x8000224800000000ULL }, + { "thksim", 0x8000223c00000000ULL }, + { "thorn", 0x000000fe00000000ULL }, + { "tilde", 0x800002dc00000000ULL }, + { "times", 0x000000d700000000ULL }, + { "timesb", 0x800022a000000000ULL }, + { "timesbar", 0x80002a3100000000ULL }, + { "timesd", 0x80002a3000000000ULL }, + { "tint", 0x8000222d00000000ULL }, + { "toea", 0x8000292800000000ULL }, + { "top", 0x800022a400000000ULL }, + { "topbot", 0x8000233600000000ULL }, + { "topcir", 0x80002af100000000ULL }, + { "topf", 0x8001d56500000000ULL }, + { "topfork", 0x80002ada00000000ULL }, + { "tosa", 0x8000292900000000ULL }, + { "tprime", 0x8000203400000000ULL }, + { "trade", 0x8000212200000000ULL }, + { "triangle", 0x800025b500000000ULL }, + { "triangledown", 0x800025bf00000000ULL }, + { "triangleleft", 0x800025c300000000ULL }, + { "trianglelefteq", 0x800022b400000000ULL }, + { "triangleq", 0x8000225c00000000ULL }, + { "triangleright", 0x800025b900000000ULL }, + { "trianglerighteq", 0x800022b500000000ULL }, + { "tridot", 0x800025ec00000000ULL }, + { "trie", 0x8000225c00000000ULL }, + { "triminus", 0x80002a3a00000000ULL }, + { "triplus", 0x80002a3900000000ULL }, + { "trisb", 0x800029cd00000000ULL }, + { "tritime", 0x80002a3b00000000ULL }, + { "trpezium", 0x800023e200000000ULL }, + { "tscr", 0x8001d4c900000000ULL }, + { "tscy", 0x8000044600000000ULL }, + { "tshcy", 0x8000045b00000000ULL }, + { "tstrok", 0x8000016700000000ULL }, + { "twixt", 0x8000226c00000000ULL }, + { "twoheadleftarrow", 0x8000219e00000000ULL }, + { "twoheadrightarrow", 0x800021a000000000ULL }, + { "uArr", 0x800021d100000000ULL }, + { "uHar", 0x8000296300000000ULL }, + { "uacute", 0x000000fa00000000ULL }, + { "uarr", 0x8000219100000000ULL }, + { "ubrcy", 0x8000045e00000000ULL }, + { "ubreve", 0x8000016d00000000ULL }, + { "ucirc", 0x000000fb00000000ULL }, + { "ucy", 0x8000044300000000ULL }, + { "udarr", 0x800021c500000000ULL }, + { "udblac", 0x8000017100000000ULL }, + { "udhar", 0x8000296e00000000ULL }, + { "ufisht", 0x8000297e00000000ULL }, + { "ufr", 0x8001d53200000000ULL }, + { "ugrave", 0x000000f900000000ULL }, + { "uharl", 0x800021bf00000000ULL }, + { "uharr", 0x800021be00000000ULL }, + { "uhblk", 0x8000258000000000ULL }, + { "ulcorn", 0x8000231c00000000ULL }, + { "ulcorner", 0x8000231c00000000ULL }, + { "ulcrop", 0x8000230f00000000ULL }, + { "ultri", 0x800025f800000000ULL }, + { "umacr", 0x8000016b00000000ULL }, + { "uml", 0x000000a800000000ULL }, + { "uogon", 0x8000017300000000ULL }, + { "uopf", 0x8001d56600000000ULL }, + { "uparrow", 0x8000219100000000ULL }, + { "updownarrow", 0x8000219500000000ULL }, + { "upharpoonleft", 0x800021bf00000000ULL }, + { "upharpoonright", 0x800021be00000000ULL }, + { "uplus", 0x8000228e00000000ULL }, + { "upsi", 0x800003c500000000ULL }, + { "upsih", 0x800003d200000000ULL }, + { "upsilon", 0x800003c500000000ULL }, + { "upuparrows", 0x800021c800000000ULL }, + { "urcorn", 0x8000231d00000000ULL }, + { "urcorner", 0x8000231d00000000ULL }, + { "urcrop", 0x8000230e00000000ULL }, + { "uring", 0x8000016f00000000ULL }, + { "urtri", 0x800025f900000000ULL }, + { "uscr", 0x8001d4ca00000000ULL }, + { "utdot", 0x800022f000000000ULL }, + { "utilde", 0x8000016900000000ULL }, + { "utri", 0x800025b500000000ULL }, + { "utrif", 0x800025b400000000ULL }, + { "uuarr", 0x800021c800000000ULL }, + { "uuml", 0x000000fc00000000ULL }, + { "uwangle", 0x800029a700000000ULL }, + { "vArr", 0x800021d500000000ULL }, + { "vBar", 0x80002ae800000000ULL }, + { "vBarv", 0x80002ae900000000ULL }, + { "vDash", 0x800022a800000000ULL }, + { "vangrt", 0x8000299c00000000ULL }, + { "varepsilon", 0x800003f500000000ULL }, + { "varkappa", 0x800003f000000000ULL }, + { "varnothing", 0x8000220500000000ULL }, + { "varphi", 0x800003d500000000ULL }, + { "varpi", 0x800003d600000000ULL }, + { "varpropto", 0x8000221d00000000ULL }, + { "varr", 0x8000219500000000ULL }, + { "varrho", 0x800003f100000000ULL }, + { "varsigma", 0x800003c200000000ULL }, + { "varsubsetneq", 0x8000228a0000fe00ULL }, + { "varsubsetneqq", 0x80002acb0000fe00ULL }, + { "varsupsetneq", 0x8000228b0000fe00ULL }, + { "varsupsetneqq", 0x80002acc0000fe00ULL }, + { "vartheta", 0x800003d100000000ULL }, + { "vartriangleleft", 0x800022b200000000ULL }, + { "vartriangleright", 0x800022b300000000ULL }, + { "vcy", 0x8000043200000000ULL }, + { "vdash", 0x800022a200000000ULL }, + { "vee", 0x8000222800000000ULL }, + { "veebar", 0x800022bb00000000ULL }, + { "veeeq", 0x8000225a00000000ULL }, + { "vellip", 0x800022ee00000000ULL }, + { "verbar", 0x8000007c00000000ULL }, + { "vert", 0x8000007c00000000ULL }, + { "vfr", 0x8001d53300000000ULL }, + { "vltri", 0x800022b200000000ULL }, + { "vnsub", 0x80002282000020d2ULL }, + { "vnsup", 0x80002283000020d2ULL }, + { "vopf", 0x8001d56700000000ULL }, + { "vprop", 0x8000221d00000000ULL }, + { "vrtri", 0x800022b300000000ULL }, + { "vscr", 0x8001d4cb00000000ULL }, + { "vsubnE", 0x80002acb0000fe00ULL }, + { "vsubne", 0x8000228a0000fe00ULL }, + { "vsupnE", 0x80002acc0000fe00ULL }, + { "vsupne", 0x8000228b0000fe00ULL }, + { "vzigzag", 0x8000299a00000000ULL }, + { "wcirc", 0x8000017500000000ULL }, + { "wedbar", 0x80002a5f00000000ULL }, + { "wedge", 0x8000222700000000ULL }, + { "wedgeq", 0x8000225900000000ULL }, + { "weierp", 0x8000211800000000ULL }, + { "wfr", 0x8001d53400000000ULL }, + { "wopf", 0x8001d56800000000ULL }, + { "wp", 0x8000211800000000ULL }, + { "wr", 0x8000224000000000ULL }, + { "wreath", 0x8000224000000000ULL }, + { "wscr", 0x8001d4cc00000000ULL }, + { "xcap", 0x800022c200000000ULL }, + { "xcirc", 0x800025ef00000000ULL }, + { "xcup", 0x800022c300000000ULL }, + { "xdtri", 0x800025bd00000000ULL }, + { "xfr", 0x8001d53500000000ULL }, + { "xhArr", 0x800027fa00000000ULL }, + { "xharr", 0x800027f700000000ULL }, + { "xi", 0x800003be00000000ULL }, + { "xlArr", 0x800027f800000000ULL }, + { "xlarr", 0x800027f500000000ULL }, + { "xmap", 0x800027fc00000000ULL }, + { "xnis", 0x800022fb00000000ULL }, + { "xodot", 0x80002a0000000000ULL }, + { "xopf", 0x8001d56900000000ULL }, + { "xoplus", 0x80002a0100000000ULL }, + { "xotime", 0x80002a0200000000ULL }, + { "xrArr", 0x800027f900000000ULL }, + { "xrarr", 0x800027f600000000ULL }, + { "xscr", 0x8001d4cd00000000ULL }, + { "xsqcup", 0x80002a0600000000ULL }, + { "xuplus", 0x80002a0400000000ULL }, + { "xutri", 0x800025b300000000ULL }, + { "xvee", 0x800022c100000000ULL }, + { "xwedge", 0x800022c000000000ULL }, + { "yacute", 0x000000fd00000000ULL }, + { "yacy", 0x8000044f00000000ULL }, + { "ycirc", 0x8000017700000000ULL }, + { "ycy", 0x8000044b00000000ULL }, + { "yen", 0x000000a500000000ULL }, + { "yfr", 0x8001d53600000000ULL }, + { "yicy", 0x8000045700000000ULL }, + { "yopf", 0x8001d56a00000000ULL }, + { "yscr", 0x8001d4ce00000000ULL }, + { "yucy", 0x8000044e00000000ULL }, + { "yuml", 0x000000ff00000000ULL }, + { "zacute", 0x8000017a00000000ULL }, + { "zcaron", 0x8000017e00000000ULL }, + { "zcy", 0x8000043700000000ULL }, + { "zdot", 0x8000017c00000000ULL }, + { "zeetrf", 0x8000212800000000ULL }, + { "zeta", 0x800003b600000000ULL }, + { "zfr", 0x8001d53700000000ULL }, + { "zhcy", 0x8000043600000000ULL }, + { "zigrarr", 0x800021dd00000000ULL }, + { "zopf", 0x8001d56b00000000ULL }, + { "zscr", 0x8001d4cf00000000ULL }, + { "zwj", 0x8000200d00000000ULL }, + { "zwnj", 0x8000200c00000000ULL }, +}; + +static void +ucv_stringbuf_addutf8(uc_stringbuf_t *buf, unsigned int code) +{ + unsigned char seq[5]; + size_t len = 0; + + switch (code) { + // disallow CR (https://html.spec.whatwg.org/multipage/syntax.html#character-references) + case 0xD: + + // disallow controls (https://infra.spec.whatwg.org/#control) except whitespace + case 0x0 ... 0x8: + case 0xB: + case 0xE ... 0x1F: + case 0x7F ... 0x9F: + + // disallow noncharacter (https://infra.spec.whatwg.org/#noncharacter) + case 0xFDD0 ... 0xFDEF: + case 0xFFFE ... 0xFFFF: + case 0x1FFFE ... 0x1FFFF: + case 0x2FFFE ... 0x2FFFF: + case 0x3FFFE ... 0x3FFFF: + case 0x4FFFE ... 0x4FFFF: + case 0x5FFFE ... 0x5FFFF: + case 0x6FFFE ... 0x6FFFF: + case 0x7FFFE ... 0x7FFFF: + case 0x8FFFE ... 0x8FFFF: + case 0x9FFFE ... 0x9FFFF: + case 0xAFFFE ... 0xAFFFF: + case 0xBFFFE ... 0xBFFFF: + case 0xCFFFE ... 0xCFFFF: + case 0xDFFFE ... 0xDFFFF: + case 0xEFFFE ... 0xEFFFF: + case 0xFFFFE ... 0xFFFFF: + case 0x10FFFE ... 0x10FFFF: + return; + } + + if (code <= 0x7F) { + seq[len++] = code; + } + else if (code <= 0x7FF) { + seq[len++] = ((code >> 6) & 0x1F) | 0xC0; + seq[len++] = ( code & 0x3F) | 0x80; + } + else if (code <= 0xFFFF) { + seq[len++] = ((code >> 12) & 0x0F) | 0xE0; + seq[len++] = ((code >> 6) & 0x3F) | 0x80; + seq[len++] = ( code & 0x3F) | 0x80; + } + else if (code <= 0x10FFFF) { + seq[len++] = ((code >> 18) & 0x07) | 0xF0; + seq[len++] = ((code >> 12) & 0x3F) | 0x80; + seq[len++] = ((code >> 6) & 0x3F) | 0x80; + seq[len++] = ( code & 0x3F) | 0x80; + } + + ucv_stringbuf_addstr(buf, (char *)seq, len); +} + +static void +expand_named_char_ref(uc_stringbuf_t *buf, const char *name, size_t len, bool semicolon) +{ + ssize_t l = 0; + ssize_t r = sizeof(named_char_refs) / sizeof(named_char_refs[0]) - 1; + ssize_t m; + int c; + + while (l <= r) { + m = (l + r) / 2; + c = strncmp(named_char_refs[m].name, name, len); + + if (c < 0) { + l = m + 1; + continue; + } + + if (c > 0 || named_char_refs[m].name[len] != 0) { + r = m - 1; + continue; + } + + if (!(named_char_refs[m].value & (1ULL << 63)) || semicolon) { + ucv_stringbuf_addutf8(buf, (named_char_refs[m].value >> 32) & 0x7FFFFFFFULL); + ucv_stringbuf_addutf8(buf, named_char_refs[m].value & 0xFFFFFFFFULL); + + return; + } + + break; + } + + ucv_stringbuf_append(buf, "&"); + ucv_stringbuf_addstr(buf, name, len); + + if (semicolon) + ucv_stringbuf_append(buf, ";"); +} + +static void +expand_char_refs(uc_stringbuf_t *buf, const char *s, size_t len, bool loose) +{ + const char *end = s + len, *p; + unsigned int u; + size_t elen; + char *e; + + while (s < end) { + p = memchr(s, '&', end - s); + elen = 1; + + if (!p) { + ucv_stringbuf_addstr(buf, s, end - s); + break; + } + + ucv_stringbuf_addstr(buf, s, p - s); + + while (isalpha(p[elen])) + elen++; + + if (elen > 1) { + if (p[elen] == ';') { + expand_named_char_ref(buf, p + 1, elen - 1, true); + s = p + elen + 1; + } + else if (loose) { + expand_named_char_ref(buf, p + 1, elen - 1, false); + s = p + elen; + } + else { + ucv_stringbuf_addstr(buf, p, elen); + s = p + elen; + } + } + else if (p[elen] == '#') { + if ((p[++elen] | 32) == 'x') { + u = strtoul(p + ++elen, &e, 16); + + if (e > p + elen && *e == ';') { + ucv_stringbuf_addutf8(buf, u); + s = e + 1; + } + else { + ucv_stringbuf_addstr(buf, p, e - p); + s = e; + } + } + else { + u = strtoul(p + elen, &e, 10); + + if (e > p + elen && *e == ';') { + ucv_stringbuf_addutf8(buf, u); + s = e + 1; + } + else { + ucv_stringbuf_addstr(buf, p, e - p); + s = e; + } + } + } + else { + ucv_stringbuf_addstr(buf, p, elen); + s = p + elen; + } + } +} + +static void +ucv_stringbuf_addtext(uc_stringbuf_t *buf, const char *s, size_t len) +{ + bool space = (buf->bpos && isspace(buf->buf[buf->bpos - 1])); + + while (space && isspace(*s)) { + s++; + len--; + } + + while (len > 1 && isspace(s[len - 1])) + len--; + + expand_char_refs(buf, s, len, true); +} + +static bool +_invoke_cb(const char *s, size_t len, html_token_callback_t cb, + html_token_type_t type, void *ud) +{ + size_t chunksize; + + while (len > 0) { + chunksize = (len > 1024) ? 1024 : len; + + if (!cb(type, s, chunksize, ud)) + return false; + + len -= chunksize; + s += chunksize; + } + + return true; +} + +#define invoke_cb(s, len, cb, type, ud) \ + do { \ + if (!_invoke_cb(s, len, cb, type, ud)) \ + return false; \ + } while(0) + +static size_t +_memspn(const char *s, size_t n, const char *set, size_t m, bool invert) +{ + uint64_t mask[(1 << CHAR_BIT) / (sizeof(uint64_t) * CHAR_BIT)] = { 0 }; + + #define mask_off(n) mask[((unsigned char)(n) / (sizeof(mask[0]) * CHAR_BIT))] + #define mask_bit(n) (1ULL << ((unsigned char)(n) % (sizeof(mask[0]) * CHAR_BIT))) + + /* NB: Nudge clang & gcc to unroll the mask initialization loop below. + * Since we only invoke _memspn() with constant set string literals + * containing only characters up to '>' (62), the loop below should + * be optimized into a single constant load opcode for mask[0]. + */ + #ifdef __clang__ + #pragma unroll 255 + #elif __GNUC__ + #pragma GCC unroll 255 + #endif + for (; m > 0; m--, set++) + mask_off(*set) |= mask_bit(*set); + + for (m = 0; m < n; m++) + if (!(mask_off(s[m]) & mask_bit(s[m])) == !invert) + break; + + #undef mask_off + #undef mask_bit + + return m; +} + +#define memspn(s, n, set) _memspn(s, n, set, sizeof(set) - 1, false) +#define memcspn(s, n, set) _memspn(s, n, set, sizeof(set) - 1, true) + +static bool +tokenize_html(const char *s, size_t len, html_token_callback_t cb, void *ud) +{ + const char *end = s + len, *p; + char raw[16] = { 0 }; + + enum { + SEARCH, + IDENTIFY, + COMMENT, + ATTR, + END + } state = 0; + + while (state != END) { + switch (state) { + case SEARCH: + p = memchr(s, '<', end - s); + + if (p) { + if (p != s) + invoke_cb(s, p - s, cb, raw[0] ? T_RAW : T_TEXT, ud); + + s = p + 1; + state = IDENTIFY; + } + else { + state = END; + } + + break; + + case IDENTIFY: + if (*s == '/') { + p = memchr(s, '>', end - s); + + if (p) { + while (p != s && isspace(p[-1])) + p--; + + if (!raw[0] || !strncasecmp(s + 1, raw, p - s - 1)) { + invoke_cb(s + 1, p - s - 1, cb, T_CLOSE, ud); + raw[0] = 0; + } + else { + invoke_cb(s - 1, p - s + 2, cb, T_RAW, ud); + } + + s = p + 1; + state = SEARCH; + } + else { + state = END; + } + } + else if (raw[0]) { + invoke_cb("<", 1, cb, T_RAW, ud); + state = SEARCH; + } + else if (*s == '!') { + state = COMMENT; + s++; + } + else { + p = s + memcspn(s, end - s, "/'\"> \f\r\t\n\0"); + + if (p != s) { + invoke_cb(s, p - s, cb, T_OPEN, ud); + + if (!strncasecmp(s, "script", p - s) || + !strncasecmp(s, "style", p - s)) { + memset(raw, 0, sizeof(raw)); + memcpy(raw, s, p - s); + } + + s = p + memspn(p, end - p, " \f\r\t\n\0"); + state = ATTR; + } + else { + invoke_cb("<", 1, cb, T_TEXT, ud); + state = SEARCH; + } + } + + break; + + case COMMENT: + if (!strncmp(s, "--", 2)) { + p = memmem(s + 2, end - s - 2, "-->", 3); + + if (p) { + invoke_cb(s + 2, p - s - 2, cb, raw[0] ? T_RAW : T_COMMENT, ud); + s = p + 3; + state = SEARCH; + } + else { + // unterminated comment + invoke_cb(s + 2, end - s - 2, cb, raw[0] ? T_RAW : T_COMMENT, ud); + s = NULL; + state = END; + } + } + else if (!strncasecmp(s, "[CDATA[", 7)) { + p = memmem(s + 7, end - s - 7, "]]>", 3); + + if (p) { + invoke_cb(s + 7, p - s - 7, cb, raw[0] ? T_RAW : T_CDATA, ud); + s = p + 3; + state = SEARCH; + } + else { + // unterminated comment + invoke_cb(s + 7, end - s - 7, cb, raw[0] ? T_RAW : T_CDATA, ud); + s = NULL; + state = END; + } + } + else { + p = memchr(s, '>', end - s); + + if (p) { + invoke_cb(s, p - s, cb, raw[0] ? T_RAW : T_PROCINST, ud); + s = p + 1; + state = SEARCH; + } + else { + // unterminated comment + invoke_cb(s, end - s, cb, raw[0] ? T_RAW : T_PROCINST, ud); + s = NULL; + state = END; + } + } + + break; + + case ATTR: + p = s + memcspn(s, end - s, "'\"> \f\r\t\n\0"); + + if (*p == '>') { + if (p != s) { + if ((p - s) > 1 || *s != '/') + invoke_cb(s, p - s, cb, T_ATTR, ud); + } + + s = p + 1; + state = SEARCH; + } + else if (*p == '"' || *p == '\'') { + p = memchr(p + 1, *p, end - p); + + if (p) { + invoke_cb(s, p - s + 1, cb, T_ATTR, ud); + s = p + 1; + } + else { + // unterminated quoted string + s = NULL; + state = END; + } + } + else if (*p) { + if (p != s) + invoke_cb(s, p - s, cb, T_ATTR, ud); + + s = p + memspn(p, end - p, " \f\r\t\n\0"); + } + else { + // eof + state = END; + } + + break; + + case END: + /* not reached */ + break; + } + } + + if (s && *s) + invoke_cb(s, end - s, cb, raw[0] ? T_RAW : T_TEXT, ud); + + invoke_cb("", 0, cb, T_EOF, ud); + + return true; +} + + +static bool +uc_html_tokenize_cb(html_token_type_t type, const char *s, size_t len, void *ud) +{ + const char *end = s + len, *val; + uc_vm_t *vm = ud; + + uc_vm_stack_push(vm, ucv_get(uc_vm_stack_peek(vm, 0))); + uc_vm_stack_push(vm, ucv_int64_new(type)); + + val = (type == T_ATTR && s != NULL) ? memchr(s, '=', len) : NULL; + + if (val) { + uc_vm_stack_push(vm, ucv_string_new_length(s, val - s)); + + val++; + + if ((end - val) >= 2 && (*val == '"' || *val == '\'')) { + val++; + end--; + } + + uc_vm_stack_push(vm, ucv_string_new_length(val, end - val)); + } + else if (type == T_TEXT && s) { + uc_vm_stack_push(vm, ucv_string_new_length(s, end - s)); + } + else if (s) { + uc_vm_stack_push(vm, ucv_string_new_length(s, len)); + } + + if (uc_vm_call(vm, false, 1 + !!s + !!val) == EXCEPTION_NONE) { + ucv_put(uc_vm_stack_pop(vm)); + + return true; + } + + return false; +} + +static uc_value_t * +uc_html_tokenize(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *input = uc_fn_arg(0); + uc_value_t *callback = uc_fn_arg(1); + bool res; + + if (ucv_type(input) != UC_STRING) + return NULL; + + if (!ucv_is_callable(callback)) + return NULL; + + uc_vm_stack_push(vm, ucv_get(callback)); + + res = tokenize_html( + ucv_string_get(input), ucv_string_length(input), + uc_html_tokenize_cb, vm); + + ucv_put(uc_vm_stack_pop(vm)); + + return ucv_boolean_new(res); +} + + +static bool +uc_html_striptags_cb(html_token_type_t type, const char *s, size_t len, void *ud) +{ + uc_stringbuf_t *buf = ud; + + if (type == T_TEXT) + ucv_stringbuf_addtext(buf, s, len); + else if (type == T_OPEN && (unsigned int)buf->bpos > sizeof(uc_string_t)) + ucv_stringbuf_append(buf, " "); + + return true; +} + +static uc_value_t * +uc_html_striptags(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *input = uc_fn_arg(0); + uc_stringbuf_t *buf; + + if (ucv_type(input) != UC_STRING) + return NULL; + + buf = ucv_stringbuf_new(); + + tokenize_html( + ucv_string_get(input), ucv_string_length(input), + uc_html_striptags_cb, buf); + + return ucv_stringbuf_finish(buf); +} + + +static uc_value_t * +uc_html_entitydecode(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *input = uc_fn_arg(0); + uc_value_t *loose = uc_fn_arg(1); + uc_stringbuf_t *buf; + + if (ucv_type(input) != UC_STRING) + return NULL; + + buf = ucv_stringbuf_new(); + + expand_char_refs(buf, ucv_string_get(input), ucv_string_length(input), + ucv_is_truish(loose)); + + return ucv_stringbuf_finish(buf); +} + +static uc_value_t * +uc_html_entityencode(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *input = uc_fn_arg(0); + uc_value_t *quote = uc_fn_arg(1); + const char *s, *p, *end; + uc_stringbuf_t *buf; + + if (ucv_type(input) != UC_STRING) + return NULL; + + s = ucv_string_get(input); + end = s + ucv_string_length(input); + buf = ucv_stringbuf_new(); + + while (s < end) { + if (ucv_is_truish(quote)) + p = s + memcspn(s, end - s, "<&'\">\0"); + else + p = s + memcspn(s, end - s, "<&>\0"); + + if (p != s) + ucv_stringbuf_addstr(buf, s, p - s); + + if (p < end) { + switch (*p) { + case '"': ucv_stringbuf_append(buf, """); break; + case '&': ucv_stringbuf_append(buf, "&"); break; + case '\'': ucv_stringbuf_append(buf, "'"); break; + case '<': ucv_stringbuf_append(buf, "<"); break; + case '>': ucv_stringbuf_append(buf, ">"); break; + default: ucv_stringbuf_append(buf, "�"); + } + } + + s = p + 1; + } + + if (s < end) + ucv_stringbuf_addstr(buf, s, end - s); + + return ucv_stringbuf_finish(buf); +} + + +static const uc_function_list_t html_fns[] = { + { "tokenize", uc_html_tokenize }, + { "striptags", uc_html_striptags }, + { "entitydecode", uc_html_entitydecode }, + { "entityencode", uc_html_entityencode }, +}; + +void uc_module_init(uc_vm_t *vm, uc_value_t *scope) +{ + uc_function_list_register(scope, html_fns); + + ucv_object_add(scope, "TEXT", ucv_int64_new(T_TEXT)); + ucv_object_add(scope, "RAW", ucv_int64_new(T_RAW)); + ucv_object_add(scope, "OPEN", ucv_int64_new(T_OPEN)); + ucv_object_add(scope, "ATTR", ucv_int64_new(T_ATTR)); + ucv_object_add(scope, "CLOSE", ucv_int64_new(T_CLOSE)); + ucv_object_add(scope, "COMMENT", ucv_int64_new(T_COMMENT)); + ucv_object_add(scope, "CDATA", ucv_int64_new(T_CDATA)); + ucv_object_add(scope, "PROCINST", ucv_int64_new(T_PROCINST)); + ucv_object_add(scope, "EOF", ucv_int64_new(T_EOF)); +} diff --git a/package/luci/contrib/package/ucode-mod-lua/Makefile b/package/luci/contrib/package/ucode-mod-lua/Makefile new file mode 100644 index 0000000000..a7937925b0 --- /dev/null +++ b/package/luci/contrib/package/ucode-mod-lua/Makefile @@ -0,0 +1,31 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=ucode-mod-lua +PKG_RELEASE:=1 +PKG_LICENSE:=ISC +PKG_MAINTAINER:=Jo-Philipp Wich + +include $(INCLUDE_DIR)/package.mk + +define Package/ucode-mod-lua + SECTION:=utils + CATEGORY:=Utilities + TITLE:=ucode to Lua bridge library + DEPENDS:=+libucode +liblua +endef + +define Package/ucode-mod-lua/install + $(INSTALL_DIR) $(1)/usr/lib/ucode + $(CP) $(PKG_BUILD_DIR)/lua.so $(1)/usr/lib/ucode/ +endef + +define Build/Configure +endef + +define Build/Compile + $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) $(FPIC) \ + -Wall -ffunction-sections -Wl,--gc-sections -shared -Wl,--no-as-needed -llua \ + -o $(PKG_BUILD_DIR)/lua.so $(PKG_BUILD_DIR)/lua.c +endef + +$(eval $(call BuildPackage,ucode-mod-lua)) diff --git a/package/luci/contrib/package/ucode-mod-lua/src/lua.c b/package/luci/contrib/package/ucode-mod-lua/src/lua.c new file mode 100644 index 0000000000..d02c6dc867 --- /dev/null +++ b/package/luci/contrib/package/ucode-mod-lua/src/lua.c @@ -0,0 +1,1098 @@ +/* + * Copyright (C) 2022 Jo-Philipp Wich + * + * 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 +#include +#include +#include +#include +#include +#include + +#include "ucode/module.h" + +static uc_resource_type_t *vm_type, *lv_type; + + +typedef struct { + uc_vm_t *vm; + uc_value_t *uv; +} ucv_userdata_t; + +typedef struct { + uc_value_t *uvL; + int ref; +} lua_resource_t; + +static int +lua_uv_gc(lua_State *L) +{ + ucv_userdata_t *ud = luaL_checkudata(L, 1, "ucode.value"); + + ucv_put(ud->uv); + ud->uv = NULL; + + return 0; +} + +static lua_Integer +lua_table_is_arraylike(lua_State *L, int index) +{ + lua_Integer max = 0, count = 0; + lua_Number k; + + lua_pushnil(L); + + /* check for non-integer keys */ + while (lua_next(L, index)) { + if (lua_type(L, -2) == LUA_TNUMBER && (k = lua_tonumber(L, -2)) >= 1) { + if (floor(k) == k) { + if (k > max) + max = k; + + count++; + + lua_pop(L, 1); + + continue; + } + } + + lua_pop(L, 2); + + return -1; + } + + if (max > count * 2) + return -1; + + return max; +} + +static bool +lua_table_new_or_ref(lua_State *L, struct lh_table *visited, uc_value_t *uv) +{ + struct lh_entry *entry; + unsigned long hash; + + hash = lh_get_hash(visited, uv); + entry = lh_table_lookup_entry_w_hash(visited, uv, hash); + + if (!entry) { + lua_newtable(L); + lua_pushvalue(L, -1); + lh_table_insert_w_hash(visited, uv, + (void *)(intptr_t)luaL_ref(L, LUA_REGISTRYINDEX), hash, 0); + + return true; + } + + lua_rawgeti(L, LUA_REGISTRYINDEX, (int)(intptr_t)entry->v); + + return false; +} + +static void +ucv_to_lua(uc_vm_t *vm, uc_value_t *uv, lua_State *L, struct lh_table *visited); + +static void +ucv_to_lua(uc_vm_t *vm, uc_value_t *uv, lua_State *L, struct lh_table *visited) +{ + struct lh_entry *entry; + bool freetbl = false; + lua_resource_t **lv; + ucv_userdata_t *ud; + lua_State **lvL; + uc_value_t *e; + size_t i; + char *s; + + switch (ucv_type(uv)) { + case UC_BOOLEAN: + lua_pushboolean(L, ucv_boolean_get(uv)); + break; + + case UC_STRING: + lua_pushlstring(L, ucv_string_get(uv), ucv_string_length(uv)); + break; + + case UC_DOUBLE: + lua_pushnumber(L, (lua_Number)ucv_double_get(uv)); + break; + + case UC_INTEGER: +#ifdef LUA_TINT + lua_pushinteger(L, (lua_Integer)ucv_int64_get(uv)); +#else + lua_pushnumber(L, (lua_Number)ucv_int64_get(uv)); +#endif + break; + + case UC_REGEXP: + s = ucv_to_string(vm, uv); + + if (s) + lua_pushstring(L, s); + else + lua_pushnil(L); + + free(s); + + break; + + case UC_ARRAY: + case UC_OBJECT: + if (ucv_prototype_get(uv)) { + ud = lua_newuserdata(L, sizeof(*ud)); + + if (ud) { + ud->vm = vm; + ud->uv = ucv_get(uv); + + luaL_getmetatable(L, "ucode.value"); + lua_setmetatable(L, -2); + } + else { + lua_pushnil(L); + } + } + else { + if (!visited) { + freetbl = true; + visited = lh_kptr_table_new(16, NULL); + } + + if (visited) { + if (lua_table_new_or_ref(L, visited, uv)) { + if (ucv_type(uv) == UC_ARRAY) { + for (i = 0; i < ucv_array_length(uv); i++) { + e = ucv_array_get(uv, i); + ucv_to_lua(vm, e, L, visited); + lua_rawseti(L, -2, (int)i + 1); + } + } + else { + ucv_object_foreach(uv, key, val) { + ucv_to_lua(vm, val, L, visited); + lua_setfield(L, -2, key); + } + } + } + } + else { + lua_pushnil(L); + } + } + + break; + + case UC_CFUNCTION: + case UC_CLOSURE: + ud = lua_newuserdata(L, sizeof(*ud)); + + if (ud) { + ud->vm = vm; + ud->uv = ucv_get(uv); + + luaL_getmetatable(L, "ucode.value"); + lua_setmetatable(L, -2); + } + else { + lua_pushnil(L); + } + + break; + + case UC_RESOURCE: + lv = (lua_resource_t **)ucv_resource_dataptr(uv, "lua.value"); + lvL = (lv && *lv) ? (lua_State **)ucv_resource_dataptr((*lv)->uvL, "lua.vm") : NULL; + + if (lvL && *lvL == L) + lua_rawgeti(L, LUA_REGISTRYINDEX, (*lv)->ref); + else + lua_pushnil(L); + + break; + + default: + lua_pushnil(L); + break; + } + + if (freetbl) { + lh_foreach(visited, entry) + luaL_unref(L, LUA_REGISTRYINDEX, (int)(intptr_t)entry->v); + + lh_table_free(visited); + } +} + +static uc_value_t * +ucv_table_new_or_ref(lua_State *L, int index, uc_vm_t *vm, struct lh_table *visited, lua_Integer *nkeys) +{ + struct lh_entry *entry; + unsigned long hash; + const void *tptr; + uc_value_t *uv; + + tptr = lua_topointer(L, index); + hash = lh_get_hash(visited, tptr); + entry = lh_table_lookup_entry_w_hash(visited, tptr, hash); + + if (!entry) { + *nkeys = lua_table_is_arraylike(L, index); + uv = (*nkeys > 0) ? ucv_array_new(vm) : ucv_object_new(vm); + lh_table_insert_w_hash(visited, tptr, uv, hash, 0); + + return uv; + } + + *nkeys = -2; + uv = (uc_value_t *)entry->v; + + return ucv_get(uv); +} + +static uc_value_t * +ucv_this_to_uvL(uc_vm_t *vm) +{ + uc_value_t *ctx = uc_vector_last(&vm->callframes)->ctx; + void *p; + + p = ucv_resource_dataptr(ctx, "lua.vm"); + + if (p) + return ucv_get(ctx); + + p = ucv_resource_dataptr(ctx, "lua.value"); + + if (p) + return ucv_get((*(lua_resource_t **)p)->uvL); + + return NULL; +} + +static uc_value_t * +lua_to_ucv(lua_State *L, int index, uc_vm_t *vm, struct lh_table *visited); + +static uc_value_t * +lua_to_ucv(lua_State *L, int index, uc_vm_t *vm, struct lh_table *visited) +{ + bool freetbl = false; + lua_Integer nkeys, i; + lua_resource_t *lv; + ucv_userdata_t *ud; + const char *key; + uc_value_t *rv; + size_t len; + + switch (lua_type(L, index)) { + case LUA_TNIL: + rv = NULL; + break; + + case LUA_TTABLE: + if (!visited) { + freetbl = true; + visited = lh_kptr_table_new(16, NULL); + } + + rv = ucv_table_new_or_ref(L, index, vm, visited, &nkeys); + + if (nkeys > 0) { + for (i = 1; i <= nkeys; i++) { + lua_rawgeti(L, index, i); + ucv_array_push(rv, lua_to_ucv(L, lua_gettop(L), vm, visited)); + lua_pop(L, 1); + } + } + else if (nkeys == -1) { + lua_pushnil(L); + + while (lua_next(L, index)) { + lua_pushvalue(L, -2); + key = lua_tostring(L, -1); + + if (key) + ucv_object_add(rv, key, lua_to_ucv(L, lua_gettop(L) - 1, vm, visited)); + + lua_pop(L, 2); + } + } + + if (freetbl) + lh_table_free(visited); + + break; + + case LUA_TBOOLEAN: + rv = ucv_boolean_new(lua_toboolean(L, index)); + break; + + case LUA_TNUMBER: +#ifdef LUA_TINT + if (lua_isinteger(L, index)) + rv = ucv_int64_new(lua_tointeger(L, index)); + else + rv = ucv_double_new(lua_tonumber(L, index)); +#else + lua_Number n = lua_tonumber(L, index); + i = lua_tointeger(L, index); + + if ((lua_Number)i == n) + rv = ucv_int64_new(i); + else + rv = ucv_double_new(n); +#endif + + break; + + case LUA_TSTRING: + key = lua_tolstring(L, index, &len); + rv = ucv_string_new_length(key, len); + break; + + case LUA_TUSERDATA: + rv = NULL; + + if (lua_getmetatable(L, index)) { + luaL_getmetatable(L, "ucode.value"); + + if (lua_rawequal(L, -1, -2)) { + ud = lua_touserdata(L, index); + rv = (ud->vm == vm) ? ucv_get(ud->uv) : NULL; + } + + lua_pop(L, 2); + } + + if (rv) + break; + + /* fall through */ + + default: + lua_pushvalue(L, index); + + lv = xalloc(sizeof(*lv)); + lv->ref = luaL_ref(L, LUA_REGISTRYINDEX); + lv->uvL = ucv_this_to_uvL(vm); + + rv = uc_resource_new(lv_type, lv); + break; + } + + return rv; +} + +static const char * +uc_exception_type_name(uc_exception_type_t type) +{ + switch (type) { + case EXCEPTION_SYNTAX: return "Syntax error"; + case EXCEPTION_RUNTIME: return "Runtime error"; + case EXCEPTION_TYPE: return "Type error"; + case EXCEPTION_REFERENCE: return "Reference error"; + case EXCEPTION_EXIT: return "Exit"; + default: return "Exception"; + } +} + +static int +lua_uv_call(lua_State *L) +{ + ucv_userdata_t *ud = luaL_checkudata(L, 1, "ucode.value"); + int nargs = lua_gettop(L), i; + uc_value_t *rv; + lua_Debug ar; + bool mcall; + + if (!ucv_is_callable(ud->uv)) + return luaL_error(L, "%s: Invoked value is not a function", + uc_exception_type_name(EXCEPTION_TYPE)); + + if (!lua_getstack(L, 0, &ar) || !lua_getinfo(L, "n", &ar)) + return luaL_error(L, "%s: Unable to obtain stackframe information", + uc_exception_type_name(EXCEPTION_RUNTIME)); + + mcall = !strcmp(ar.namewhat, "method"); + + if (mcall) + uc_vm_stack_push(ud->vm, lua_to_ucv(L, 2, ud->vm, NULL)); + + uc_vm_stack_push(ud->vm, ucv_get(ud->uv)); + + for (i = 2 + mcall; i <= nargs; i++) + uc_vm_stack_push(ud->vm, lua_to_ucv(L, i, ud->vm, NULL)); + + if (uc_vm_call(ud->vm, mcall, nargs - 1 - mcall)) { + rv = ucv_object_get(ucv_array_get(ud->vm->exception.stacktrace, 0), "context", NULL); + + return luaL_error(L, "%s: %s%s%s", + uc_exception_type_name(ud->vm->exception.type), + ud->vm->exception.message, + rv ? "\n" : "", rv ? ucv_string_get(rv) : ""); + } + + rv = uc_vm_stack_pop(ud->vm); + + ucv_to_lua(ud->vm, rv, L, NULL); + ucv_put(rv); + + return 1; +} + +static int +lua_uv_index(lua_State *L) +{ + ucv_userdata_t *ud = luaL_checkudata(L, 1, "ucode.value"); + const char *key = luaL_checkstring(L, 2); + long long idx; + char *e; + + if (ucv_type(ud->uv) == UC_ARRAY) { + idx = strtoll(key, &e, 10); + + if (e != key && *e == 0 && idx >= 1 && idx <= (long long)ucv_array_length(ud->uv)) { + ucv_to_lua(ud->vm, ucv_array_get(ud->uv, (size_t)(idx - 1)), L, NULL); + + return 1; + } + } + + ucv_to_lua(ud->vm, ucv_property_get(ud->uv, key), L, NULL); + + return 1; +} + +static int +lua_uv_tostring(lua_State *L) +{ + ucv_userdata_t *ud = luaL_checkudata(L, 1, "ucode.value"); + char *s = ucv_to_string(ud->vm, ud->uv); + + lua_pushstring(L, s); + free(s); + + return 1; +} + +static const luaL_reg ucode_ud_methods[] = { + { "__gc", lua_uv_gc }, + { "__call", lua_uv_call }, + { "__index", lua_uv_index }, + { "__tostring", lua_uv_tostring }, + + { } +}; + +static uc_value_t * +uc_lua_vm_claim_result(uc_vm_t *vm, lua_State *L, int oldtop) +{ + int nargs = lua_gettop(L) - oldtop - 1, i; + uc_value_t *uv; + + if (nargs > 1) { + uv = ucv_array_new_length(vm, nargs); + + for (i = 2; i <= nargs; i++) + ucv_array_push(uv, lua_to_ucv(L, oldtop + i, vm, NULL)); + } + else if (nargs == 1) { + uv = lua_to_ucv(L, oldtop + 2, vm, NULL); + } + else { + uv = NULL; + } + + return uv; +} + +static int +uc_lua_vm_pcall_error_cb(lua_State *L) +{ + const char *message = luaL_checkstring(L, 1); + uc_stringbuf_t *buf = xprintbuf_new(); + lua_Debug ar; + int level; + + ucv_stringbuf_printf(buf, "%s\n", message); + + for (level = 1; lua_getstack(L, level, &ar) == 1; level++) { + if (lua_getinfo(L, "Snl", &ar) == 0) + continue; + + if (level == 1) { + ucv_stringbuf_printf(buf, "\nIn %s(), file %s", + ar.name ? ar.name : "[anonymous function]", ar.short_src); + + if (ar.currentline > -1) + ucv_stringbuf_printf(buf, ", line %d", ar.currentline); + + ucv_stringbuf_append(buf, "\n"); + } + else { + ucv_stringbuf_printf(buf, " called from function %s (%s", + ar.name ? ar.name : "[anonymous function]", ar.short_src); + + if (ar.currentline > -1) + ucv_stringbuf_printf(buf, ":%d", ar.currentline); + + ucv_stringbuf_append(buf, ")\n"); + } + } + + lua_pushstring(L, buf->buf); + printbuf_free(buf); + + return 1; +} + +static uc_value_t * +uc_lua_vm_pcall(uc_vm_t *vm, lua_State *L, int oldtop) +{ + uc_value_t *uv; + + switch (lua_pcall(L, lua_gettop(L) - oldtop - 2, LUA_MULTRET, oldtop + 1)) { + case LUA_ERRRUN: + case LUA_ERRMEM: + case LUA_ERRERR: + uc_vm_raise_exception(vm, EXCEPTION_RUNTIME, + "%s", lua_tostring(L, -1)); + + uv = NULL; + break; + + default: + uv = uc_lua_vm_claim_result(vm, L, oldtop); + break; + } + + return uv; +} + +static uc_value_t * +uc_lua_vm_invoke(uc_vm_t *vm, size_t nargs) +{ + lua_State **L = uc_fn_this("lua.vm"); + uc_value_t *name = uc_fn_arg(0); + uc_value_t *uv; + size_t i; + int top; + + if (!L || !*L || ucv_type(name) != UC_STRING) + return NULL; + + top = lua_gettop(*L); + + lua_pushcfunction(*L, uc_lua_vm_pcall_error_cb); + lua_getglobal(*L, ucv_string_get(name)); + + for (i = 1; i < nargs; i++) { + uv = uc_fn_arg(i); + ucv_to_lua(vm, uv, *L, NULL); + } + + uv = uc_lua_vm_pcall(vm, *L, top); + + lua_settop(*L, top); + + return uv; +} + +static uc_value_t * +uc_lua_vm_eval(uc_vm_t *vm, size_t nargs) +{ + lua_State **L = uc_fn_this("lua.vm"); + uc_value_t *source = uc_fn_arg(0); + uc_value_t *uv = NULL; + int top; + + if (!L || !*L || ucv_type(source) != UC_STRING) + return NULL; + + top = lua_gettop(*L); + + lua_pushcfunction(*L, uc_lua_vm_pcall_error_cb); + + switch (luaL_loadstring(*L, ucv_string_get(source))) { + case LUA_ERRSYNTAX: + uc_vm_raise_exception(vm, EXCEPTION_SYNTAX, + "%s", lua_tostring(*L, -1)); + + break; + + case LUA_ERRMEM: + uc_vm_raise_exception(vm, EXCEPTION_RUNTIME, + "Out of memory while compiling Lua code: %s", + lua_tostring(*L, -1)); + + break; + + default: + uv = uc_lua_vm_pcall(vm, *L, top); + break; + } + + lua_settop(*L, top); + + return uv; +} + +static uc_value_t * +uc_lua_vm_include(uc_vm_t *vm, size_t nargs) +{ + lua_State **L = uc_fn_this("lua.vm"); + uc_value_t *path = uc_fn_arg(0); + uc_value_t *uv = NULL; + int top; + + if (!L || !*L || ucv_type(path) != UC_STRING) + return NULL; + + top = lua_gettop(*L); + + lua_pushcfunction(*L, uc_lua_vm_pcall_error_cb); + + switch (luaL_loadfile(*L, ucv_string_get(path))) { + case LUA_ERRSYNTAX: + uc_vm_raise_exception(vm, EXCEPTION_SYNTAX, + "Syntax error while compiling Lua file: %s", + lua_tostring(*L, -1)); + + break; + + case LUA_ERRFILE: + uc_vm_raise_exception(vm, EXCEPTION_RUNTIME, + "IO error while compiling Lua file: %s", + lua_tostring(*L, -1)); + + break; + + case LUA_ERRMEM: + uc_vm_raise_exception(vm, EXCEPTION_RUNTIME, + "Out of memory while compiling Lua file: %s", + lua_tostring(*L, -1)); + + break; + + default: + uv = uc_lua_vm_pcall(vm, *L, top); + break; + } + + lua_settop(*L, top); + + return uv; +} + +static uc_value_t * +uc_lua_vm_set(uc_vm_t *vm, size_t nargs) +{ + lua_State **L = uc_fn_this("lua.vm"); + uc_value_t *key = uc_fn_arg(0); + uc_value_t *val = uc_fn_arg(1); + + if (!L || !*L) + return NULL; + + if (ucv_type(key) == UC_OBJECT && !val) { + ucv_object_foreach(key, k, v) { + ucv_to_lua(vm, v, *L, NULL); + lua_setglobal(*L, k); + } + } + else if (ucv_type(key) == UC_STRING) { + ucv_to_lua(vm, val, *L, NULL); + lua_setglobal(*L, ucv_string_get(key)); + } + else { + return NULL; + } + + return ucv_boolean_new(true); +} + +static uc_value_t * +uc_lua_vm_get(uc_vm_t *vm, size_t nargs) +{ + lua_State **L = uc_fn_this("lua.vm"); + uc_value_t *key = uc_fn_arg(0); + lua_resource_t *lv; + size_t i; + int top; + + if (!L || !*L || ucv_type(key) != UC_STRING) + return NULL; + + top = lua_gettop(*L); + + lua_getglobal(*L, ucv_string_get(key)); + + for (i = 1; i < nargs; i++) { + if (lua_type(*L, -1) != LUA_TTABLE) { + lua_settop(*L, top); + + return NULL; + } + + ucv_to_lua(vm, uc_fn_arg(i), *L, NULL); + lua_gettable(*L, -2); + } + + lv = xalloc(sizeof(*lv)); + lv->ref = luaL_ref(*L, LUA_REGISTRYINDEX); + lv->uvL = ucv_this_to_uvL(vm); + + lua_settop(*L, top); + + return uc_resource_new(lv_type, lv); +} + + +static lua_State * +uc_lua_lv_to_L(lua_resource_t **lv) +{ + lua_State **L; + + if (!lv || !*lv) + return NULL; + + L = (lua_State **)ucv_resource_dataptr((*lv)->uvL, "lua.vm"); + + if (!L) + return NULL; + + return *L; +} + +static uc_value_t * +uc_lua_lv_call(uc_vm_t *vm, size_t nargs) +{ + lua_resource_t **lv = uc_fn_this("lua.value"); + lua_State *L = uc_lua_lv_to_L(lv); + uc_value_t *rv; + int oldtop; + size_t i; + + if (!L) + return NULL; + + oldtop = lua_gettop(L); + + lua_pushcfunction(L, uc_lua_vm_pcall_error_cb); + lua_rawgeti(L, LUA_REGISTRYINDEX, (*lv)->ref); + + for (i = 0; i < nargs; i++) + ucv_to_lua(vm, uc_fn_arg(i), L, NULL); + + rv = uc_lua_vm_pcall(vm, L, oldtop); + + lua_settop(L, oldtop); + + return rv; +} + +static uc_value_t * +uc_lua_lv_invoke(uc_vm_t *vm, size_t nargs) +{ + lua_resource_t **lv = uc_fn_this("lua.value"); + lua_State *L = uc_lua_lv_to_L(lv); + uc_value_t *method = uc_fn_arg(0); + uc_value_t *rv; + int oldtop; + size_t i; + + if (!L) + return NULL; + + oldtop = lua_gettop(L); + + lua_pushcfunction(L, uc_lua_vm_pcall_error_cb); + lua_rawgeti(L, LUA_REGISTRYINDEX, (*lv)->ref); + ucv_to_lua(vm, method, L, NULL); + lua_gettable(L, -2); + lua_pushvalue(L, -2); + + for (i = 1; i < nargs; i++) + ucv_to_lua(vm, uc_fn_arg(i), L, NULL); + + rv = uc_lua_vm_pcall(vm, L, oldtop + 1); + + lua_settop(L, oldtop); + + return rv; +} + +static uc_value_t * +uc_lua_lv_get_common(uc_vm_t *vm, size_t nargs, bool raw) +{ + lua_resource_t **lv = uc_fn_this("lua.value"), *ref; + lua_State *L = uc_lua_lv_to_L(lv); + uc_value_t *key; + size_t i; + int top; + + if (!L) + return NULL; + + top = lua_gettop(L); + + lua_rawgeti(L, LUA_REGISTRYINDEX, (*lv)->ref); + + for (i = 0; i < nargs; i++) { + key = uc_fn_arg(i); + + if (lua_type(L, -1) != LUA_TTABLE) { + lua_settop(L, top); + + return NULL; + } + + if (raw) { + if (ucv_type(key) == UC_INTEGER) { + lua_rawgeti(L, -1, (int)ucv_int64_get(key)); + } + else { + ucv_to_lua(vm, key, L, NULL); + lua_rawget(L, -2); + } + } + else { + ucv_to_lua(vm, key, L, NULL); + lua_gettable(L, -2); + } + } + + ref = xalloc(sizeof(*ref)); + ref->ref = luaL_ref(L, LUA_REGISTRYINDEX); + ref->uvL = ucv_this_to_uvL(vm); + + lua_settop(L, top); + + return uc_resource_new(lv_type, ref); +} + +static uc_value_t * +uc_lua_lv_get(uc_vm_t *vm, size_t nargs) +{ + return uc_lua_lv_get_common(vm, nargs, false); +} + +static uc_value_t * +uc_lua_lv_getraw(uc_vm_t *vm, size_t nargs) +{ + return uc_lua_lv_get_common(vm, nargs, true); +} + +static uc_value_t * +uc_lua_lv_getmt(uc_vm_t *vm, size_t nargs) +{ + lua_resource_t **lv = uc_fn_this("lua.value"), *ref; + uc_value_t *key = uc_fn_arg(0), *uv = NULL; + lua_State *L = uc_lua_lv_to_L(lv); + int oldtop; + + if (!L || (key && ucv_type(key) != UC_STRING)) + return NULL; + + oldtop = lua_gettop(L); + + lua_rawgeti(L, LUA_REGISTRYINDEX, (*lv)->ref); + + if (lua_getmetatable(L, -1)) { + if (key) + lua_getfield(L, -1, ucv_string_get(key)); + + if (!lua_isnil(L, -1)) { + ref = xalloc(sizeof(*ref)); + ref->ref = luaL_ref(L, LUA_REGISTRYINDEX); + ref->uvL = ucv_this_to_uvL(vm); + + uv = uc_resource_new(lv_type, ref); + } + } + + lua_settop(L, oldtop); + + return uv; +} + +static uc_value_t * +uc_lua_lv_value(uc_vm_t *vm, size_t nargs) +{ + lua_resource_t **lv = uc_fn_this("lua.value"); + lua_State *L = uc_lua_lv_to_L(lv); + uc_value_t *uv; + + if (!L) + return NULL; + + lua_rawgeti(L, LUA_REGISTRYINDEX, (*lv)->ref); + + uv = lua_to_ucv(L, lua_gettop(L), vm, NULL); + + lua_pop(L, 1); + + return uv; +} + +static uc_value_t * +uc_lua_lv_tostring(uc_vm_t *vm, size_t nargs) +{ + lua_resource_t **lv = uc_fn_this("lua.value"); + lua_State *L = uc_lua_lv_to_L(lv); + uc_value_t *uv = NULL; + uc_stringbuf_t *buf; + const char *s; + size_t len; + + if (!L) + return NULL; + + lua_rawgeti(L, LUA_REGISTRYINDEX, (*lv)->ref); + + if (luaL_callmeta(L, -1, "__tostring")) { + if (lua_isstring(L, -1)) { + s = lua_tolstring(L, -1, &len); + uv = ucv_string_new_length(s, len); + lua_pop(L, 2); + + return uv; + } + + lua_pop(L, 1); + } + + buf = ucv_stringbuf_new(); + + switch (lua_type(L, lua_gettop(L))) { + case LUA_TNIL: + case LUA_TTABLE: + case LUA_TBOOLEAN: + case LUA_TNUMBER: + case LUA_TSTRING: + uv = lua_to_ucv(L, lua_gettop(L), vm, NULL); + ucv_to_stringbuf(vm, buf, uv, false); + ucv_put(uv); + break; + + default: + ucv_stringbuf_printf(buf, "%s (%p)", + lua_typename(L, lua_type(L, lua_gettop(L))), + lua_topointer(L, lua_gettop(L))); + break; + } + + lua_pop(L, 1); + + return ucv_stringbuf_finish(buf); +} + + +static uc_value_t * +uc_lua_create(uc_vm_t *vm, size_t nargs) +{ + lua_State *L = luaL_newstate(); + + luaL_openlibs(L); + + luaL_newmetatable(L, "ucode.value"); + luaL_register(L, NULL, ucode_ud_methods); + lua_pop(L, 1); + + return uc_resource_new(vm_type, L); +} + + +static const uc_function_list_t vm_fns[] = { + { "invoke", uc_lua_vm_invoke }, + { "eval", uc_lua_vm_eval }, + { "include", uc_lua_vm_include }, + { "set", uc_lua_vm_set }, + { "get", uc_lua_vm_get }, +}; + +static const uc_function_list_t lv_fns[] = { + { "call", uc_lua_lv_call }, + { "invoke", uc_lua_lv_invoke }, + { "get", uc_lua_lv_get }, + { "getraw", uc_lua_lv_getraw }, + { "getmt", uc_lua_lv_getmt }, + { "value", uc_lua_lv_value }, + { "tostring", uc_lua_lv_tostring }, +}; + +static const uc_function_list_t lua_fns[] = { + { "create", uc_lua_create }, +}; + +static void +free_vm(void *ud) +{ + lua_State *L = ud; + + if (L) + lua_close(L); +} + +static void +free_lv(void *ud) +{ + lua_resource_t *lv = ud; + lua_State **L = (lua_State **)ucv_resource_dataptr(lv->uvL, "lua.vm"); + + luaL_unref(*L, LUA_REGISTRYINDEX, lv->ref); + ucv_put(lv->uvL); + free(lv); +} + +static void +dlopen_self(uc_vm_t *vm) +{ + uc_value_t *search, *entry; + char *path, *wildcard; + void *dlh = NULL; + size_t i; + + search = ucv_property_get(uc_vm_scope_get(vm), "REQUIRE_SEARCH_PATH"); + + for (i = 0; !dlh && i < ucv_array_length(search); i++) { + entry = ucv_array_get(search, i); + path = ucv_string_get(entry); + wildcard = path ? strchr(path, '*') : NULL; + + if (wildcard) { + xasprintf(&path, "%.*slua%s", (int)(wildcard - path), path, wildcard + 1); + dlh = dlopen(path, RTLD_LAZY|RTLD_GLOBAL); + dlerror(); /* clear error */ + free(path); + } + } +} + +void uc_module_init(uc_vm_t *vm, uc_value_t *scope) +{ + uc_function_list_register(scope, lua_fns); + + vm_type = uc_type_declare(vm, "lua.vm", vm_fns, free_vm); + lv_type = uc_type_declare(vm, "lua.value", lv_fns, free_lv); + + /* reopen ourself using dlopen(RTLD_GLOBAL) to make liblua symbols + * available to dynamic Lua extensions loaded by this module through + * Lua's require() */ + dlopen_self(vm); +} diff --git a/package/luci/docs/jsapi/README.md b/package/luci/docs/jsapi/README.md deleted file mode 100644 index ecd93766ad..0000000000 --- a/package/luci/docs/jsapi/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# LuCI client side API documentation - -You can browse the JavaScript apis provided by LuCI here. A good starting point -is the central [luci.js class](https://openwrt.github.io/luci/jsapi/LuCI.html). - diff --git a/package/luci/libs/luci-lib-base/Makefile b/package/luci/libs/luci-lib-base/Makefile index 35b1836ecd..f8ee691570 100644 --- a/package/luci/libs/luci-lib-base/Makefile +++ b/package/luci/libs/luci-lib-base/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+lua +luci-lib-nixio +luci-lib-ip +luci-lib-jsonc +liblucihttp-lua include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/libs/luci-lib-base/luasrc/http.lua b/package/luci/libs/luci-lib-base/luasrc/http.lua index 20b55f2854..882b71c8f7 100644 --- a/package/luci/libs/luci-lib-base/luasrc/http.lua +++ b/package/luci/libs/luci-lib-base/luasrc/http.lua @@ -6,234 +6,66 @@ local util = require "luci.util" local coroutine = require "coroutine" local table = require "table" local lhttp = require "lucihttp" -local nixio = require "nixio" -local ltn12 = require "luci.ltn12" -local table, ipairs, pairs, type, tostring, tonumber, error = - table, ipairs, pairs, type, tostring, tonumber, error +local L, table, ipairs, pairs, type, error = _G.L, table, ipairs, pairs, type, error module "luci.http" HTTP_MAX_CONTENT = 1024*100 -- 100 kB maximum content size -context = util.threadlocal() - -Request = util.class() -function Request.__init__(self, env, sourcein, sinkerr) - self.input = sourcein - self.error = sinkerr - - - -- File handler nil by default to let .content() work - self.filehandler = nil - - -- HTTP-Message table - self.message = { - env = env, - headers = {}, - params = urldecode_params(env.QUERY_STRING or ""), - } - - self.parsed_input = false -end - -function Request.formvalue(self, name, noparse) - if not noparse and not self.parsed_input then - self:_parse_input() - end - - if name then - return self.message.params[name] - else - return self.message.params - end -end - -function Request.formvaluetable(self, prefix) - local vals = {} - prefix = prefix and prefix .. "." or "." - - if not self.parsed_input then - self:_parse_input() - end - - local void = self.message.params[nil] - for k, v in pairs(self.message.params) do - if k:find(prefix, 1, true) == 1 then - vals[k:sub(#prefix + 1)] = tostring(v) - end - end - - return vals -end - -function Request.content(self) - if not self.parsed_input then - self:_parse_input() - end - - return self.message.content, self.message.content_length -end - -function Request.getcookie(self, name) - return lhttp.header_attribute("cookie; " .. (self:getenv("HTTP_COOKIE") or ""), name) -end - -function Request.getenv(self, name) - if name then - return self.message.env[name] - else - return self.message.env - end -end - -function Request.setfilehandler(self, callback) - self.filehandler = callback - - if not self.parsed_input then - return - end - - -- If input has already been parsed then uploads are stored as unlinked - -- temporary files pointed to by open file handles in the parameter - -- value table. Loop all params, and invoke the file callback for any - -- param with an open file handle. - local name, value - for name, value in pairs(self.message.params) do - if type(value) == "table" then - while value.fd do - local data = value.fd:read(1024) - local eof = (not data or data == "") - - callback(value, data, eof) - - if eof then - value.fd:close() - value.fd = nil - end - end - end - end -end - -function Request._parse_input(self) - parse_message_body( - self.input, - self.message, - self.filehandler - ) - self.parsed_input = true -end - function close() - if not context.eoh then - context.eoh = true - coroutine.yield(3) - end - - if not context.closed then - context.closed = true - coroutine.yield(5) - end + L.http:close() end function content() - return context.request:content() + return L.http:content() end function formvalue(name, noparse) - return context.request:formvalue(name, noparse) + return L.http:formvalue(name, noparse) end function formvaluetable(prefix) - return context.request:formvaluetable(prefix) + return L.http:formvaluetable(prefix) end function getcookie(name) - return context.request:getcookie(name) + return L.http:getcookie(name) end -- or the environment table itself. function getenv(name) - return context.request:getenv(name) + return L.http:getenv(name) end function setfilehandler(callback) - return context.request:setfilehandler(callback) + return L.http:setfilehandler(callback) end function header(key, value) - if not context.headers then - context.headers = {} - end - context.headers[key:lower()] = value - coroutine.yield(2, key, value) + L.http:header(key, value) end function prepare_content(mime) - if not context.headers or not context.headers["content-type"] then - if mime == "application/xhtml+xml" then - if not getenv("HTTP_ACCEPT") or - not getenv("HTTP_ACCEPT"):find("application/xhtml+xml", nil, true) then - mime = "text/html; charset=UTF-8" - end - header("Vary", "Accept") - end - header("Content-Type", mime) - end + L.http:prepare_content(mime) end function source() - return context.request.input + return L.http.input end function status(code, message) - code = code or 200 - message = message or "OK" - context.status = code - coroutine.yield(1, code, message) + L.http:status(code, message) end -- This function is as a valid LTN12 sink. -- If the content chunk is nil this function will automatically invoke close. function write(content, src_err) - if not content then - if src_err then - error(src_err) - else - close() - end - return true - elseif #content == 0 then - return true - else - if not context.eoh then - if not context.status then - status() - end - if not context.headers or not context.headers["content-type"] then - header("Content-Type", "text/html; charset=utf-8") - end - if not context.headers["cache-control"] then - header("Cache-Control", "no-cache") - header("Expires", "0") - end - if not context.headers["x-frame-options"] then - header("X-Frame-Options", "SAMEORIGIN") - end - if not context.headers["x-xss-protection"] then - header("X-XSS-Protection", "1; mode=block") - end - if not context.headers["x-content-type-options"] then - header("X-Content-Type-Options", "nosniff") - end - - context.eoh = true - coroutine.yield(3) - end - coroutine.yield(4, content) - return true + if src_err then + error(src_err) end + + return L.print(content) end function splice(fd, size) @@ -241,10 +73,7 @@ function splice(fd, size) end function redirect(url) - if url == "" then url = "/" end - status(302, "Found") - header("Location", url) - close() + L.http:redirect(url) end function build_querystring(q) @@ -266,35 +95,7 @@ urldecode = util.urldecode urlencode = util.urlencode function write_json(x) - util.serialize_json(x, write) -end - --- from given url or string. Returns a table with urldecoded values. --- Simple parameters are stored as string values associated with the parameter --- name within the table. Parameters with multiple values are stored as array --- containing the corresponding values. -function urldecode_params(url, tbl) - local parser, name - local params = tbl or { } - - parser = lhttp.urlencoded_parser(function (what, buffer, length) - if what == parser.TUPLE then - name, value = nil, nil - elseif what == parser.NAME then - name = lhttp.urldecode(buffer) - elseif what == parser.VALUE and name then - params[name] = lhttp.urldecode(buffer) or "" - end - - return true - end) - - if parser then - parser:parse((url or ""):match("[^?]*$")) - parser:parse(nil) - end - - return params + L.printf('%J', x) end -- separated by "&". Tables are encoded as parameters with multiple values by @@ -332,223 +133,13 @@ function urlencode_params(tbl) return table.concat(enc, "") end --- Content-Type. Stores all extracted data associated with its parameter name --- in the params table within the given message object. Multiple parameter --- values are stored as tables, ordinary ones as strings. --- If an optional file callback function is given then it is fed with the --- file contents chunk by chunk and only the extracted file name is stored --- within the params table. The callback function will be called subsequently --- with three arguments: --- o Table containing decoded (name, file) and raw (headers) mime header data --- o String value containing a chunk of the file data --- o Boolean which indicates whether the current chunk is the last one (eof) -function mimedecode_message_body(src, msg, file_cb) - local parser, header, field - local len, maxlen = 0, tonumber(msg.env.CONTENT_LENGTH or nil) - - parser, err = lhttp.multipart_parser(msg.env.CONTENT_TYPE, function (what, buffer, length) - if what == parser.PART_INIT then - field = { } - - elseif what == parser.HEADER_NAME then - header = buffer:lower() - - elseif what == parser.HEADER_VALUE and header then - if header:lower() == "content-disposition" and - lhttp.header_attribute(buffer, nil) == "form-data" - then - field.name = lhttp.header_attribute(buffer, "name") - field.file = lhttp.header_attribute(buffer, "filename") - field[1] = field.file - end - - if field.headers then - field.headers[header] = buffer - else - field.headers = { [header] = buffer } - end - - elseif what == parser.PART_BEGIN then - return not field.file - - elseif what == parser.PART_DATA and field.name and length > 0 then - if field.file then - if file_cb then - file_cb(field, buffer, false) - msg.params[field.name] = msg.params[field.name] or field - else - if not field.fd then - field.fd = nixio.mkstemp(field.name) - end - - if field.fd then - field.fd:write(buffer) - msg.params[field.name] = msg.params[field.name] or field - end - end - else - field.value = buffer - end - - elseif what == parser.PART_END and field.name then - if field.file and msg.params[field.name] then - if file_cb then - file_cb(field, "", true) - elseif field.fd then - field.fd:seek(0, "set") - end - else - local val = msg.params[field.name] - - if type(val) == "table" then - val[#val+1] = field.value or "" - elseif val ~= nil then - msg.params[field.name] = { val, field.value or "" } - else - msg.params[field.name] = field.value or "" - end - end - - field = nil - - elseif what == parser.ERROR then - err = buffer - end - - return true - end, HTTP_MAX_CONTENT) - - return ltn12.pump.all(src, function (chunk) - len = len + (chunk and #chunk or 0) - - if maxlen and len > maxlen + 2 then - return nil, "Message body size exceeds Content-Length" - end - - if not parser or not parser:parse(chunk) then - return nil, err - end - - return true - end) -end - --- Content-Type. Stores all extracted data associated with its parameter name --- in the params table within the given message object. Multiple parameter --- values are stored as tables, ordinary ones as strings. -function urldecode_message_body(src, msg) - local err, name, value, parser - local len, maxlen = 0, tonumber(msg.env.CONTENT_LENGTH or nil) - - parser = lhttp.urlencoded_parser(function (what, buffer, length) - if what == parser.TUPLE then - name, value = nil, nil - elseif what == parser.NAME then - name = lhttp.urldecode(buffer, lhttp.DECODE_PLUS) - elseif what == parser.VALUE and name then - local val = msg.params[name] - - if type(val) == "table" then - val[#val+1] = lhttp.urldecode(buffer, lhttp.DECODE_PLUS) or "" - elseif val ~= nil then - msg.params[name] = { val, lhttp.urldecode(buffer, lhttp.DECODE_PLUS) or "" } - else - msg.params[name] = lhttp.urldecode(buffer, lhttp.DECODE_PLUS) or "" - end - elseif what == parser.ERROR then - err = buffer - end - - return true - end, HTTP_MAX_CONTENT) - - return ltn12.pump.all(src, function (chunk) - len = len + (chunk and #chunk or 0) - - if maxlen and len > maxlen + 2 then - return nil, "Message body size exceeds Content-Length" - elseif len > HTTP_MAX_CONTENT then - return nil, "Message body size exceeds maximum allowed length" - end - - if not parser or not parser:parse(chunk) then - return nil, err - end - - return true - end) -end - --- This function will examine the Content-Type within the given message object --- to select the appropriate content decoder. --- Currently the application/x-www-urlencoded and application/form-data --- mime types are supported. If the encountered content encoding can't be --- handled then the whole message body will be stored unaltered as "content" --- property within the given message object. -function parse_message_body(src, msg, filecb) - if msg.env.CONTENT_LENGTH or msg.env.REQUEST_METHOD == "POST" then - local ctype = lhttp.header_attribute(msg.env.CONTENT_TYPE, nil) - - -- Is it multipart/mime ? - if ctype == "multipart/form-data" then - return mimedecode_message_body(src, msg, filecb) - - -- Is it application/x-www-form-urlencoded ? - elseif ctype == "application/x-www-form-urlencoded" then - return urldecode_message_body(src, msg) - - end - - -- Unhandled encoding - -- If a file callback is given then feed it chunk by chunk, else - -- store whole buffer in message.content - local sink - - -- If we have a file callback then feed it - if type(filecb) == "function" then - local meta = { - name = "raw", - encoding = msg.env.CONTENT_TYPE - } - sink = function( chunk ) - if chunk then - return filecb(meta, chunk, false) - else - return filecb(meta, nil, true) - end - end - -- ... else append to .content - else - msg.content = "" - msg.content_length = 0 - - sink = function( chunk ) - if chunk then - if ( msg.content_length + #chunk ) <= HTTP_MAX_CONTENT then - msg.content = msg.content .. chunk - msg.content_length = msg.content_length + #chunk - return true - else - return nil, "POST data exceeds maximum allowed length" - end - end - return true - end - end - - -- Pump data... - while true do - local ok, err = ltn12.pump.step( src, sink ) - - if not ok and err then - return nil, err - elseif not ok then -- eof - return true - end - end - - return true - end - - return false -end +context = { + request = { + formvalue = function(self, ...) return formvalue(...) end; + formvaluetable = function(self, ...) return formvaluetable(...) end; + content = function(self, ...) return content(...) end; + getcookie = function(self, ...) return getcookie(...) end; + setfilehandler = function(self, ...) return setfilehandler(...) end; + message = L and L.http.message + } +} diff --git a/package/luci/libs/luci-lib-base/luasrc/util.lua b/package/luci/libs/luci-lib-base/luasrc/util.lua index 89757917ff..80013179aa 100644 --- a/package/luci/libs/luci-lib-base/luasrc/util.lua +++ b/package/luci/libs/luci-lib-base/luasrc/util.lua @@ -100,32 +100,8 @@ end -- Scope manipulation routines -- -coxpt = setmetatable({}, { __mode = "kv" }) - -local tl_meta = { - __mode = "k", - - __index = function(self, key) - local t = rawget(self, coxpt[coroutine.running()] - or coroutine.running() or 0) - return t and t[key] - end, - - __newindex = function(self, key, value) - local c = coxpt[coroutine.running()] or coroutine.running() or 0 - local r = rawget(self, c) - if not r then - rawset(self, c, { [key] = value }) - else - r[key] = value - end - end -} - --- the current active coroutine. A thread local store is private a table object --- whose values can't be accessed from outside of the running coroutine. function threadlocal(tbl) - return setmetatable(tbl or {}, tl_meta) + return tbl or {} end @@ -772,7 +748,6 @@ function coxpcall(f, err, ...) co = coroutine.create(newf) end coromap[co] = current - coxpt[co] = coxpt[current] or current or 0 return performResume(err, co, ...) end end diff --git a/package/luci/libs/luci-lib-httpclient/Makefile b/package/luci/libs/luci-lib-httpclient/Makefile index 9c28c35d81..d3e2ba9b4c 100644 --- a/package/luci/libs/luci-lib-httpclient/Makefile +++ b/package/luci/libs/luci-lib-httpclient/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+luci-lib-base +luci-lib-nixio +luci-lib-httpprotoutils include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/libs/luci-lib-httpprotoutils/Makefile b/package/luci/libs/luci-lib-httpprotoutils/Makefile index 95f45d2002..af6ecf31df 100644 --- a/package/luci/libs/luci-lib-httpprotoutils/Makefile +++ b/package/luci/libs/luci-lib-httpprotoutils/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+luci-lib-base include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/libs/luci-lib-httpprotoutils/luasrc/http/mime.lua b/package/luci/libs/luci-lib-httpprotoutils/luasrc/http/mime.lua index 0bcff8a36b..90176b5a77 100644 --- a/package/luci/libs/luci-lib-httpprotoutils/luasrc/http/mime.lua +++ b/package/luci/libs/luci-lib-httpprotoutils/luasrc/http/mime.lua @@ -45,10 +45,13 @@ MIME_TYPES = { ["mp3"] = "audio/mpeg"; ["ogg"] = "audio/x-vorbis+ogg"; ["wav"] = "audio/x-wav"; + ["aac"] = "audio/aac"; ["mpg"] = "video/mpeg"; ["mpeg"] = "video/mpeg"; ["avi"] = "video/x-msvideo"; + ["mov"] = "video/quicktime"; + ["mp4"] = "video/mp4"; } -- "application/octet-stream" if the extension is unknown. diff --git a/package/luci/libs/luci-lib-ip/Makefile b/package/luci/libs/luci-lib-ip/Makefile index 15cb537cff..1095c72c50 100644 --- a/package/luci/libs/luci-lib-ip/Makefile +++ b/package/luci/libs/luci-lib-ip/Makefile @@ -13,4 +13,4 @@ PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/libs/luci-lib-ip/src/ip.c b/package/luci/libs/luci-lib-ip/src/ip.c index 9b157da265..a624f3f83f 100644 --- a/package/luci/libs/luci-lib-ip/src/ip.c +++ b/package/luci/libs/luci-lib-ip/src/ip.c @@ -406,28 +406,28 @@ static int _cidr_new(lua_State *L, int index, int family, bool mask) if (lua_type(L, index) == LUA_TNUMBER) { - n = htonl(lua_tointeger(L, index)); + n = lua_tointeger(L, index); if (family == AF_INET6) { cidr.family = AF_INET6; - cidr.addr.v6.s6_addr[12] = n; - cidr.addr.v6.s6_addr[13] = (n >> 8); - cidr.addr.v6.s6_addr[14] = (n >> 16); - cidr.addr.v6.s6_addr[15] = (n >> 24); + cidr.addr.v6.s6_addr[12] = n / 0x1000000; + cidr.addr.v6.s6_addr[13] = n % 0x1000000 / 0x10000; + cidr.addr.v6.s6_addr[14] = n % 0x10000 / 0x100; + cidr.addr.v6.s6_addr[15] = n % 0x100; } else if (family == AF_INET) { cidr.family = AF_INET; - cidr.addr.v4.s_addr = n; + cidr.addr.v4.s_addr = htonl(n); } else { cidr.family = AF_PACKET; - cidr.addr.mac.ether_addr_octet[2] = n; - cidr.addr.mac.ether_addr_octet[3] = (n >> 8); - cidr.addr.mac.ether_addr_octet[4] = (n >> 16); - cidr.addr.mac.ether_addr_octet[5] = (n >> 24); + cidr.addr.mac.ether_addr_octet[2] = n / 0x1000000; + cidr.addr.mac.ether_addr_octet[3] = n % 0x1000000 / 0x10000; + cidr.addr.mac.ether_addr_octet[4] = n % 0x10000 / 0x100; + cidr.addr.mac.ether_addr_octet[5] = n % 0x100; } cidr.bits = AF_BITS(cidr.family); diff --git a/package/luci/libs/luci-lib-ipkg/Makefile b/package/luci/libs/luci-lib-ipkg/Makefile index 52fcf6fe82..bece70ca9f 100644 --- a/package/luci/libs/luci-lib-ipkg/Makefile +++ b/package/luci/libs/luci-lib-ipkg/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+luci-base include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/libs/luci-lib-iptparser/Makefile b/package/luci/libs/luci-lib-iptparser/Makefile index 06748adbfc..1e4cb03630 100644 --- a/package/luci/libs/luci-lib-iptparser/Makefile +++ b/package/luci/libs/luci-lib-iptparser/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+luci-base include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/libs/luci-lib-json/Makefile b/package/luci/libs/luci-lib-json/Makefile index ededc1f650..32f822d8a3 100644 --- a/package/luci/libs/luci-lib-json/Makefile +++ b/package/luci/libs/luci-lib-json/Makefile @@ -13,4 +13,4 @@ PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/libs/luci-lib-jsonc/Makefile b/package/luci/libs/luci-lib-jsonc/Makefile index 6a63dab5ef..29a33b3053 100644 --- a/package/luci/libs/luci-lib-jsonc/Makefile +++ b/package/luci/libs/luci-lib-jsonc/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+liblua +libjson-c include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/libs/luci-lib-jsonc/src/jsonc.c b/package/luci/libs/luci-lib-jsonc/src/jsonc.c index 74839dd4f5..5abb738f5f 100644 --- a/package/luci/libs/luci-lib-jsonc/src/jsonc.c +++ b/package/luci/libs/luci-lib-jsonc/src/jsonc.c @@ -294,7 +294,7 @@ static bool visited(struct seen **sp, const void *ptr) { static struct json_object * _lua_to_json_rec(lua_State *L, int index, struct seen **seen) { - lua_Number nd, ni; + lua_Number nd; struct json_object *obj; const char *key; int i, max; @@ -364,10 +364,12 @@ static struct json_object * _lua_to_json_rec(lua_State *L, int index, return json_object_new_boolean(lua_toboolean(L, index)); case LUA_TNUMBER: + if (lua_isinteger(L, index)) + return json_object_new_int64(lua_tointeger(L, index)); + nd = lua_tonumber(L, index); - ni = lua_tointeger(L, index); - if (nd == ni) + if (isfinite(nd) && trunc(nd) == nd) return json_object_new_int64(nd); return json_object_new_double(nd); diff --git a/package/luci/libs/luci-lib-nixio/Makefile b/package/luci/libs/luci-lib-nixio/Makefile index 4e501b89ce..382413de9d 100644 --- a/package/luci/libs/luci-lib-nixio/Makefile +++ b/package/luci/libs/luci-lib-nixio/Makefile @@ -7,48 +7,10 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=NIXIO POSIX library -LUCI_DEPENDS:=+PACKAGE_luci-lib-nixio_openssl:libopenssl +PACKAGE_luci-lib-nixio_cyassl:libcyassl +liblua +LUCI_DEPENDS:=+liblua PKG_LICENSE:=Apache-2.0 -define Package/luci-lib-nixio/config - choice - prompt "TLS Provider" - default PACKAGE_luci-lib-nixio_notls - - config PACKAGE_luci-lib-nixio_notls - bool "Disabled" - - config PACKAGE_luci-lib-nixio_axtls - bool "Builtin (axTLS)" - - config PACKAGE_luci-lib-nixio_cyassl - bool "CyaSSL" - select PACKAGE_libcyassl - - config PACKAGE_luci-lib-nixio_openssl - bool "OpenSSL" - select PACKAGE_libopenssl - endchoice -endef - -NIXIO_TLS:= - -ifneq ($(CONFIG_PACKAGE_luci-lib-nixio_axtls),) - NIXIO_TLS:=axtls -endif - -ifneq ($(CONFIG_PACKAGE_luci-lib-nixio_openssl),) - NIXIO_TLS:=openssl -endif - -ifneq ($(CONFIG_PACKAGE_luci-lib-nixio_cyassl),) - NIXIO_TLS:=cyassl - LUCI_CFLAGS+=-I$(STAGING_DIR)/usr/include/cyassl -endif - -MAKE_VARS += NIXIO_TLS="$(NIXIO_TLS)" - include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/libs/luci-lib-px5g/Makefile b/package/luci/libs/luci-lib-px5g/Makefile index eefee107e8..21f5b73493 100644 --- a/package/luci/libs/luci-lib-px5g/Makefile +++ b/package/luci/libs/luci-lib-px5g/Makefile @@ -7,11 +7,11 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=RSA/X.509 Key Generator (required for LuCId SSL support) -LUCI_DEPENDS:=+liblua +LUCI_DEPENDS:=+lua +luci-lib-nixio -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 PKG_LICENSE:=LGPL-2.1 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/libs/luci-lib-rpcc/Makefile b/package/luci/libs/luci-lib-rpcc/Makefile index e0fea28a5c..6751ed5729 100644 --- a/package/luci/libs/luci-lib-rpcc/Makefile +++ b/package/luci/libs/luci-lib-rpcc/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=@BROKEN include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/libs/rpcd-mod-luci/Makefile b/package/luci/libs/rpcd-mod-luci/Makefile index 7909d4a7b3..ece32a4cc9 100644 --- a/package/luci/libs/rpcd-mod-luci/Makefile +++ b/package/luci/libs/rpcd-mod-luci/Makefile @@ -7,7 +7,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=rpcd-mod-luci -PKG_VERSION:=20210614 +PKG_VERSION:=20230123 +PKG_RELEASE:=1 PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=Apache-2.0 diff --git a/package/luci/libs/rpcd-mod-luci/src/luci.c b/package/luci/libs/rpcd-mod-luci/src/luci.c index 131180a750..e21105d3c6 100644 --- a/package/luci/libs/rpcd-mod-luci/src/luci.c +++ b/package/luci/libs/rpcd-mod-luci/src/luci.c @@ -76,9 +76,12 @@ struct invoke_context { void *priv; }; -static const char **iw_modenames; +typedef const char * const iw_text_t; +static iw_text_t *iw_modenames, *iw_authnames, *iw_kmgmtnames, + *iw_ciphernames, *iw_htmodenames, *iw_80211names; static struct iwinfo_ops *(*iw_backend)(const char *); static void (*iw_close)(void); +static size_t (*iw_format_hwmodes)(int, char *, size_t); static void invoke_data_cb(struct ubus_request *req, int type, struct blob_attr *msg) @@ -788,13 +791,13 @@ rpc_luci_parse_network_device_sys(const char *name, struct ifaddrs *ifaddr) blobmsg_close_table(&blob, o2); o2 = blobmsg_open_table(&blob, "flags"); - blobmsg_add_u8(&blob, "up", ifa_flags & IFF_UP); - blobmsg_add_u8(&blob, "broadcast", ifa_flags & IFF_BROADCAST); - blobmsg_add_u8(&blob, "promisc", ifa_flags & IFF_PROMISC); - blobmsg_add_u8(&blob, "loopback", ifa_flags & IFF_LOOPBACK); - blobmsg_add_u8(&blob, "noarp", ifa_flags & IFF_NOARP); - blobmsg_add_u8(&blob, "multicast", ifa_flags & IFF_MULTICAST); - blobmsg_add_u8(&blob, "pointtopoint", ifa_flags & IFF_POINTOPOINT); + blobmsg_add_u8(&blob, "up", !!(ifa_flags & IFF_UP)); + blobmsg_add_u8(&blob, "broadcast", !!(ifa_flags & IFF_BROADCAST)); + blobmsg_add_u8(&blob, "promisc", !!(ifa_flags & IFF_PROMISC)); + blobmsg_add_u8(&blob, "loopback", !!(ifa_flags & IFF_LOOPBACK)); + blobmsg_add_u8(&blob, "noarp", !!(ifa_flags & IFF_NOARP)); + blobmsg_add_u8(&blob, "multicast", !!(ifa_flags & IFF_MULTICAST)); + blobmsg_add_u8(&blob, "pointtopoint", !!(ifa_flags & IFF_POINTOPOINT)); blobmsg_close_table(&blob, o2); o2 = blobmsg_open_table(&blob, "link"); @@ -884,6 +887,48 @@ iw_call_num(int (*method)(const char *, int *), const char *dev, blobmsg_add_u32(blob, field, val); } +static void +iw_lower(const char *src, char *dst, size_t len) +{ + size_t i; + + for (i = 0; *src && i < len; i++) + *dst++ = tolower(*src++); + + *dst = 0; +} + +static void +iw_add_bit_array(struct blob_buf *buf, const char *name, uint32_t bits, + iw_text_t values[], size_t len, bool lower, uint32_t zero) +{ + void *c; + size_t i; + char l[128]; + const char *v; + + if (!bits) + bits = zero; + + c = blobmsg_open_array(buf, name); + + for (i = 0; i < len; i++) + if (bits & 1 << i) + { + v = values[i]; + + if (lower) + { + iw_lower(v, l, strlen(values[i])); + v = l; + } + + blobmsg_add_string(buf, NULL, v); + } + + blobmsg_close_array(buf, c); +} + static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, bool phy_only) { @@ -894,8 +939,10 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, void *o, *o2, *a; glob_t paths; int nret, i; + char text[32]; - if (!iw_backend || !iw_close || !iw_modenames) { + if (!iw_backend || !iw_close || !iw_format_hwmodes || !iw_modenames || !iw_80211names || + !iw_htmodenames || !iw_authnames || !iw_kmgmtnames || !iw_ciphernames) { if (glob("/usr/lib/libiwinfo.so*", 0, NULL, &paths) != 0) return false; @@ -909,9 +956,16 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, iw_backend = dlsym(iwlib, "iwinfo_backend"); iw_close = dlsym(iwlib, "iwinfo_close"); + iw_format_hwmodes = dlsym(iwlib, "iwinfo_format_hwmodes"); iw_modenames = dlsym(iwlib, "IWINFO_OPMODE_NAMES"); - - if (!iw_backend || !iw_close || !iw_modenames) + iw_80211names = dlsym(iwlib, "IWINFO_80211_NAMES"); + iw_htmodenames = dlsym(iwlib, "IWINFO_HTMODE_NAMES"); + iw_authnames = dlsym(iwlib, "IWINFO_AUTH_NAMES"); + iw_kmgmtnames = dlsym(iwlib, "IWINFO_KMGMT_NAMES"); + iw_ciphernames = dlsym(iwlib, "IWINFO_CIPHER_NAMES"); + + if (!iw_backend || !iw_close || !iw_format_hwmodes || !iw_modenames || !iw_80211names || + !iw_htmodenames || !iw_authnames || !iw_kmgmtnames || !iw_ciphernames) return false; } @@ -933,67 +987,16 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, iw_call_num(iw->frequency_offset, devname, buf, "frequency_offset"); if (!iw->hwmodelist(devname, &nret)) { - a = blobmsg_open_array(buf, "hwmodes"); - - if (nret & IWINFO_80211_AX) - blobmsg_add_string(buf, NULL, "ax"); - - if (nret & IWINFO_80211_AC) - blobmsg_add_string(buf, NULL, "ac"); - - if (nret & IWINFO_80211_A) - blobmsg_add_string(buf, NULL, "a"); - - if (nret & IWINFO_80211_B) - blobmsg_add_string(buf, NULL, "b"); - - if (nret & IWINFO_80211_G) - blobmsg_add_string(buf, NULL, "g"); + iw_add_bit_array(buf, "hwmodes", nret, + iw_80211names, IWINFO_80211_COUNT, true, 0); - if (nret & IWINFO_80211_N) - blobmsg_add_string(buf, NULL, "n"); - - blobmsg_close_array(buf, a); + if (iw_format_hwmodes(nret, text, sizeof(text)) > 0) + blobmsg_add_string(buf, "hwmodes_text", text); } - if (!iw->htmodelist(devname, &nret)) { - a = blobmsg_open_array(buf, "htmodes"); - - if (nret & IWINFO_HTMODE_HT20) - blobmsg_add_string(buf, NULL, "HT20"); - - if (nret & IWINFO_HTMODE_HT40) - blobmsg_add_string(buf, NULL, "HT40"); - - if (nret & IWINFO_HTMODE_VHT20) - blobmsg_add_string(buf, NULL, "VHT20"); - - if (nret & IWINFO_HTMODE_VHT40) - blobmsg_add_string(buf, NULL, "VHT40"); - - if (nret & IWINFO_HTMODE_VHT80) - blobmsg_add_string(buf, NULL, "VHT80"); - - if (nret & IWINFO_HTMODE_VHT80_80) - blobmsg_add_string(buf, NULL, "VHT80+80"); - - if (nret & IWINFO_HTMODE_VHT160) - blobmsg_add_string(buf, NULL, "VHT160"); - - if (nret & IWINFO_HTMODE_HE20) - blobmsg_add_string(buf, NULL, "HE20"); - - if (nret & IWINFO_HTMODE_HE40) - blobmsg_add_string(buf, NULL, "HE40"); - - if (nret & IWINFO_HTMODE_HE80) - blobmsg_add_string(buf, NULL, "HE80"); - - if (nret & IWINFO_HTMODE_HE160) - blobmsg_add_string(buf, NULL, "HE160"); - - blobmsg_close_array(buf, a); - } + if (!iw->htmodelist(devname, &nret)) + iw_add_bit_array(buf, "htmodes", nret & ~IWINFO_HTMODE_NOHT, + iw_htmodenames, IWINFO_HTMODE_COUNT, false, 0); if (!iw->hardware_id(devname, (char *)&ids)) { o2 = blobmsg_open_table(buf, "hardware"); @@ -1028,17 +1031,10 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, if (crypto.enabled) { if (!crypto.wpa_version) { - a = blobmsg_open_array(buf, "wep"); - - if (crypto.auth_algs & IWINFO_AUTH_OPEN) - blobmsg_add_string(buf, NULL, "open"); - - if (crypto.auth_algs & IWINFO_AUTH_SHARED) - blobmsg_add_string(buf, NULL, "shared"); - - blobmsg_close_array(buf, a); - } - else { + iw_add_bit_array(buf, "wep", crypto.auth_algs, + iw_authnames, IWINFO_AUTH_COUNT, + true, 0); + } else { a = blobmsg_open_array(buf, "wpa"); for (nret = 1; nret <= 3; nret++) @@ -1047,55 +1043,16 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, blobmsg_close_array(buf, a); - a = blobmsg_open_array(buf, "authentication"); - - if (crypto.auth_suites & IWINFO_KMGMT_PSK) - blobmsg_add_string(buf, NULL, "psk"); - - if (crypto.auth_suites & IWINFO_KMGMT_8021x) - blobmsg_add_string(buf, NULL, "802.1x"); - - if (crypto.auth_suites & IWINFO_KMGMT_SAE) - blobmsg_add_string(buf, NULL, "sae"); - - if (crypto.auth_suites & IWINFO_KMGMT_OWE) - blobmsg_add_string(buf, NULL, "owe"); - - if (!crypto.auth_suites || - (crypto.auth_suites & IWINFO_KMGMT_NONE)) - blobmsg_add_string(buf, NULL, "none"); - - blobmsg_close_array(buf, a); + iw_add_bit_array(buf, "authentication", + crypto.auth_suites, + iw_kmgmtnames, IWINFO_KMGMT_COUNT, + true, IWINFO_KMGMT_NONE); } - a = blobmsg_open_array(buf, "ciphers"); - nret = crypto.pair_ciphers | crypto.group_ciphers; - - if (nret & IWINFO_CIPHER_WEP40) - blobmsg_add_string(buf, NULL, "wep-40"); - - if (nret & IWINFO_CIPHER_WEP104) - blobmsg_add_string(buf, NULL, "wep-104"); - - if (nret & IWINFO_CIPHER_TKIP) - blobmsg_add_string(buf, NULL, "tkip"); - - if (nret & IWINFO_CIPHER_CCMP) - blobmsg_add_string(buf, NULL, "ccmp"); - - if (nret & IWINFO_CIPHER_WRAP) - blobmsg_add_string(buf, NULL, "wrap"); - - if (nret & IWINFO_CIPHER_AESOCB) - blobmsg_add_string(buf, NULL, "aes-ocb"); - - if (nret & IWINFO_CIPHER_CKIP) - blobmsg_add_string(buf, NULL, "ckip"); - - if (!nret || (nret & IWINFO_CIPHER_NONE)) - blobmsg_add_string(buf, NULL, "none"); - - blobmsg_close_array(buf, a); + iw_add_bit_array(buf, "ciphers", + crypto.pair_ciphers | crypto.group_ciphers, + iw_ciphernames, IWINFO_CIPHER_COUNT, + true, IWINFO_CIPHER_NONE); } blobmsg_close_table(buf, o2); diff --git a/package/luci/luci.mk b/package/luci/luci.mk index 02cd65dc95..cce3bc5925 100644 --- a/package/luci/luci.mk +++ b/package/luci/luci.mk @@ -12,8 +12,8 @@ LUCI_DEFAULTS:=$(notdir $(wildcard ${CURDIR}/root/etc/uci-defaults/*)) LUCI_PKGARCH?=$(if $(realpath src/Makefile),,all) LUCI_SECTION?=luci LUCI_CATEGORY?=LuCI -LUCI_URL?=https://github.com/openwrt/luci -LUCI_MAINTAINER?=OpenWrt LuCI community +LUCI_URL?=https://github.com/librecmc/luci +LUCI_MAINTAINER?=libreCMC LuCI community LUCI_MINIFY_LUA?=1 LUCI_MINIFY_CSS?=1 LUCI_MINIFY_JS?=1 @@ -27,7 +27,6 @@ LUCI_LANG.cs=ČeÅ¡tina (Czech) LUCI_LANG.da=Dansk (Danish) LUCI_LANG.de=Deutsch (German) LUCI_LANG.el=Ελληνικά (Greek) -LUCI_LANG.en=English LUCI_LANG.es=Español (Spanish) LUCI_LANG.fi=Suomi (Finnish) LUCI_LANG.fr=Français (French) @@ -37,6 +36,7 @@ LUCI_LANG.hu=Magyar (Hungarian) LUCI_LANG.it=Italiano (Italian) LUCI_LANG.ja=日本語 (Japanese) LUCI_LANG.ko=한국어 (Korean) +LUCI_LANG.lt=Lietuvių (Lithuanian) LUCI_LANG.mr=MarāṭhÄ« (Marathi) LUCI_LANG.ms=Bahasa Melayu (Malay) LUCI_LANG.nb_NO=Norsk (Norwegian) @@ -73,6 +73,7 @@ LUCI_LC_ALIAS.zh_Hant=zh-tw HTDOCS = /www LUA_LIBRARYDIR = /usr/lib/lua LUCI_LIBRARYDIR = $(LUA_LIBRARYDIR)/luci +UCODE_LIBRARYDIR = /usr/share/ucode/luci # 1: everything expect po subdir or only po subdir @@ -114,10 +115,10 @@ PKG_SRC_VERSION?=$(if $(DUMP),x,$(strip $(call findrev,1))) PKG_GITBRANCH?=$(if $(DUMP),x,$(strip $(shell \ variant="LuCI"; \ if git log -1 >/dev/null 2>/dev/null; then \ - branch="$$(git branch --remote --verbose --no-abbrev --contains 2>/dev/null | \ - sed -rne 's|^[^/]+/([^ ]+) [a-f0-9]{40} .+$$|\1|p' | head -n1)"; \ + branch=$$(git branch --format='%(refname:strip=3)' --remote --no-abbrev --contains 2>/dev/null | tail -n1); \ + branch=$${branch:-$$(git branch --format='%(refname:strip=2)' --no-abbrev --contains 2>/dev/null | tail -n1)}; \ if [ "$$branch" != "master" ]; then \ - variant="LuCI $$branch branch"; \ + variant="LuCI $${branch:-unknown} branch"; \ else \ variant="LuCI Master"; \ fi; \ @@ -127,16 +128,22 @@ PKG_GITBRANCH?=$(if $(DUMP),x,$(strip $(shell \ include $(INCLUDE_DIR)/package.mk -# LUCI_SUBMENU: the submenu-item below the LuCI top-level menu inside OpoenWrt menuconfig +# LUCI_SUBMENU: the submenu-item below the LuCI top-level menu inside libreCMC menuconfig # usually one of the LUCI_MENU.* definitions # LUCI_SUBMENU_DEFAULT: the regular SUBMENU defined by LUCI_TYPE or derrived from the packagename # LUCI_SUBMENU_FORCED: manually forced value SUBMENU to set to by explicit definiton -# can be any string, "none" disables the creation of a submenu +# can be any string, "none" disables the creation of a submenu # most usefull in combination with LUCI_CATEGORY, to make the package appear # anywhere in the menu structure LUCI_SUBMENU_DEFAULT=$(if $(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.app)) LUCI_SUBMENU=$(if $(LUCI_SUBMENU_FORCED),$(LUCI_SUBMENU_FORCED),$(LUCI_SUBMENU_DEFAULT)) +ifneq ($(wildcard ${CURDIR}/luasrc/*),) + ifneq ($(filter-out luci-lib-base luci-lua-runtime,$(PKG_NAME)),) + LUCI_DEPENDS += +luci-lua-runtime + endif +endif + define Package/$(PKG_NAME) SECTION:=$(LUCI_SECTION) CATEGORY:=$(LUCI_CATEGORY) @@ -160,7 +167,7 @@ ifneq ($(LUCI_DESCRIPTION),) endif define Build/Prepare - for d in luasrc htdocs root src; do \ + for d in luasrc ucode htdocs root src; do \ if [ -d ./$$$$d ]; then \ mkdir -p $(PKG_BUILD_DIR)/$$$$d; \ $(CP) ./$$$$d/* $(PKG_BUILD_DIR)/$$$$d/; \ @@ -185,33 +192,39 @@ else endif define Package/$(PKG_NAME)/install - if [ -d $(PKG_BUILD_DIR)/luasrc ]; then \ - $(INSTALL_DIR) $(1)$(LUCI_LIBRARYDIR); \ - cp -pR $(PKG_BUILD_DIR)/luasrc/* $(1)$(LUCI_LIBRARYDIR)/; \ - $(FIND) $(1)$(LUCI_LIBRARYDIR)/ -type f -name '*.luadoc' | $(XARGS) rm; \ - $(if $(CONFIG_LUCI_SRCDIET),$(call SrcDiet,$(1)$(LUCI_LIBRARYDIR)/),true); \ - $(call SubstituteVersion,$(1)$(LUCI_LIBRARYDIR)/); \ - else true; fi - if [ -d $(PKG_BUILD_DIR)/htdocs ]; then \ - $(INSTALL_DIR) $(1)$(HTDOCS); \ - cp -pR $(PKG_BUILD_DIR)/htdocs/* $(1)$(HTDOCS)/; \ - $(if $(CONFIG_LUCI_JSMIN),$(call JsMin,$(1)$(HTDOCS)/),true); \ - $(if $(CONFIG_LUCI_CSSTIDY),$(call CssTidy,$(1)$(HTDOCS)/),true); \ - else true; fi - if [ -d $(PKG_BUILD_DIR)/root ]; then \ - $(INSTALL_DIR) $(1)/; \ - cp -pR $(PKG_BUILD_DIR)/root/* $(1)/; \ - else true; fi - if [ -d $(PKG_BUILD_DIR)/src ]; then \ - $(call Build/Install/Default) \ - $(CP) $(PKG_INSTALL_DIR)/* $(1)/; \ - else true; fi + + ifneq ($(wildcard ${CURDIR}/luasrc),) + $(INSTALL_DIR) $(1)$(LUCI_LIBRARYDIR) + cp -pR $(PKG_BUILD_DIR)/luasrc/* $(1)$(LUCI_LIBRARYDIR)/ + $(FIND) $(1)$(LUCI_LIBRARYDIR)/ -type f -name '*.luadoc' | $(XARGS) rm + $(if $(CONFIG_LUCI_SRCDIET),$(call SrcDiet,$(1)$(LUCI_LIBRARYDIR)/),true) + $(call SubstituteVersion,$(1)$(LUCI_LIBRARYDIR)/) + endif + ifneq ($(wildcard ${CURDIR}/ucode),) + $(INSTALL_DIR) $(1)$(UCODE_LIBRARYDIR) + cp -pR $(PKG_BUILD_DIR)/ucode/* $(1)$(UCODE_LIBRARYDIR)/ + $(call SubstituteVersion,$(1)$(UCODE_LIBRARYDIR)/) + endif + ifneq ($(wildcard ${CURDIR}/htdocs),) + $(INSTALL_DIR) $(1)$(HTDOCS) + cp -pR $(PKG_BUILD_DIR)/htdocs/* $(1)$(HTDOCS)/ + $(if $(CONFIG_LUCI_JSMIN),$(call JsMin,$(1)$(HTDOCS)/),true) + $(if $(CONFIG_LUCI_CSSTIDY),$(call CssTidy,$(1)$(HTDOCS)/),true) + endif + ifneq ($(wildcard ${CURDIR}/root),) + $(INSTALL_DIR) $(1)/ + cp -pR $(PKG_BUILD_DIR)/root/* $(1)/ + endif + ifneq ($(wildcard ${CURDIR}/src),) + $(call Build/Install/Default) + $(CP) $(PKG_INSTALL_DIR)/* $(1)/ + endif endef ifndef Package/$(PKG_NAME)/postinst define Package/$(PKG_NAME)/postinst [ -n "$${IPKG_INSTROOT}" ] || { \ - rm -f /tmp/luci-indexcache + rm -f /tmp/luci-indexcache.* rm -rf /tmp/luci-modulecache/ killall -HUP rpcd 2>/dev/null exit 0 @@ -220,7 +233,7 @@ endef endif # some generic macros that can be used by all packages -ifeq ($(LUCI_MINIFY_JS),1) +ifeq ($(LUCI_MINIFY_LUA),1) define SrcDiet $(FIND) $(1) -type f -name '*.lua' | while read src; do \ if LUA_PATH="$(STAGING_DIR_HOSTPKG)/lib/lua/5.1/?.lua" luasrcdiet --noopt-binequiv -o "$$$$src.o" "$$$$src"; \ @@ -264,6 +277,11 @@ define SubstituteVersion $(SED) 's/<%# *\([^ ]*\)PKG_VERSION *%>/\1$(if $(PKG_VERSION),$(PKG_VERSION),$(PKG_SRC_VERSION))/g' \ -e 's/"\(<%= *\(media\|resource\) *%>[^"]*\.\(js\|css\)\)"/"\1?v=$(if $(PKG_VERSION),$(PKG_VERSION),$(PKG_SRC_VERSION))"/g' \ "$$$$src"; \ + done; \ + $(FIND) $(1) -type f -name '*.ut' | while read src; do \ + $(SED) 's/{# *\([^ ]*\)PKG_VERSION *#}/\1$(if $(PKG_VERSION),$(PKG_VERSION),$(PKG_SRC_VERSION))/g' \ + -e 's/"\({{ *\(media\|resource\) *}}[^"]*\.\(js\|css\)\)"/"\1?v=$(if $(PKG_VERSION),$(PKG_VERSION),$(PKG_SRC_VERSION))"/g' \ + "$$$$src"; \ done endef @@ -279,8 +297,8 @@ ifeq ($(PKG_NAME),luci-base) default y config LUCI_CSSTIDY - bool "Minify CSS files" - default y + bool "Minify CSS files" + default y menu "Translations"$(foreach lang,$(LUCI_LANGUAGES),$(if $(LUCI_LANG.$(lang)), diff --git a/package/luci/modules/luci-base/Makefile b/package/luci/modules/luci-base/Makefile index d5c0b88d4d..35617eea0c 100644 --- a/package/luci/modules/luci-base/Makefile +++ b/package/luci/modules/luci-base/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2008-2015 The LuCI Team +# Copyright (C) 2022 Jo-Philipp Wich # # This is free software, licensed under the Apache License, Version 2.0 . # @@ -11,8 +11,20 @@ PKG_NAME:=luci-base LUCI_TYPE:=mod LUCI_BASENAME:=base -LUCI_TITLE:=LuCI core libraries -LUCI_DEPENDS:=+lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc +liblucihttp-lua +luci-lib-base +rpcd-mod-file +rpcd-mod-luci +cgi-io +LUCI_TITLE:=LuCI core runtime +LUCI_DEPENDS:=\ + +rpcd \ + +rpcd-mod-file \ + +rpcd-mod-luci \ + +rpcd-mod-ucode \ + +cgi-io \ + +ucode \ + +ucode-mod-fs \ + +ucode-mod-uci \ + +ucode-mod-ubus \ + +ucode-mod-math \ + +ucode-mod-html \ + +liblucihttp-ucode PKG_LICENSE:=MIT @@ -26,6 +38,20 @@ define Package/luci-base/conffiles /etc/config/ucitrack endef +define Package/luci-base/postinst +#!/bin/sh + +if [ -z "$${PKG_INSTROOT}" ] && [ -f /etc/config/uhttpd ]; then + if ! uci -q get uhttpd.main.ucode_prefix | grep -sq /cgi-bin/luci; then + uci add_list uhttpd.main.ucode_prefix='/cgi-bin/luci=/usr/share/ucode/luci/uhttpd.uc' + uci commit uhttpd + service uhttpd reload + fi +fi + +exit 0 +endef + include ../../luci.mk define Host/Configure @@ -42,4 +68,4 @@ endef $(eval $(call HostBuild)) -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/modules/luci-base/htdocs/cgi-bin/luci b/package/luci/modules/luci-base/htdocs/cgi-bin/luci index c5c9847346..442e427d41 100755 --- a/package/luci/modules/luci-base/htdocs/cgi-bin/luci +++ b/package/luci/modules/luci-base/htdocs/cgi-bin/luci @@ -1,5 +1,41 @@ -#!/usr/bin/lua -require "luci.cacheloader" -require "luci.sgi.cgi" -luci.dispatcher.indexcache = "/tmp/luci-indexcache" -luci.sgi.cgi.run() +#!/usr/bin/env ucode + +'use strict'; + +import { stdin, stdout } from 'fs'; + +import dispatch from 'luci.dispatcher'; +import request from 'luci.http'; + +const input_bufsize = 4096; +let input_available = +getenv('CONTENT_LENGTH') || 0; + +function read(len) { + if (input_available == 0) { + stdin.close(); + + return null; + } + + let chunk = stdin.read(min(input_available, len ?? input_bufsize, input_bufsize)); + + if (chunk == null) { + input_available = 0; + stdin.close(); + } + else { + input_available -= length(chunk); + } + + return chunk; +} + +function write(data) { + return stdout.write(data); +} + +let req = request(getenv(), read, write); + +dispatch(req); + +req.close(); diff --git a/package/luci/modules/luci-base/htdocs/luci-static/resources/form.js b/package/luci/modules/luci-base/htdocs/luci-static/resources/form.js index 3c538b88ca..317b49fdfe 100644 --- a/package/luci/modules/luci-base/htdocs/luci-static/resources/form.js +++ b/package/luci/modules/luci-base/htdocs/luci-static/resources/form.js @@ -281,7 +281,7 @@ var CBIAbstractElement = baseclass.extend(/** @lends LuCI.form.AbstractElement.p * The input string to clean. * * @returns {string} - * The cleaned input string with HTML removes removed. + * The cleaned input string with HTML tags removed. */ stripTags: function(s) { if (typeof(s) == 'string' && !s.match(/[<>]/)) @@ -3211,8 +3211,17 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p return (stackedMap ? activeMap.save(null, true) : Promise.resolve()).then(L.bind(function() { section_id = sref['.name']; - var m = new CBIMap(parent.config, null, null), - s = m.section(CBINamedSection, section_id, this.sectiontype); + var m; + + if (parent instanceof CBIJSONMap) { + m = new CBIJSONMap(null, null, null); + m.data = parent.data; + } + else { + m = new CBIMap(parent.config, null, null); + } + + var s = m.section(CBINamedSection, section_id, this.sectiontype); m.parent = parent; m.section = section_id; diff --git a/package/luci/modules/luci-base/htdocs/luci-static/resources/luci.js b/package/luci/modules/luci-base/htdocs/luci-static/resources/luci.js index 741f568983..fbd5587253 100644 --- a/package/luci/modules/luci-base/htdocs/luci-static/resources/luci.js +++ b/package/luci/modules/luci-base/htdocs/luci-static/resources/luci.js @@ -2671,7 +2671,7 @@ var loc = window.location; window.location = loc.protocol + '//' + loc.host + loc.pathname + loc.search; } - }, _('To login…'))) + }, _('Log in…'))) ]); LuCI.prototype.raise('SessionError', 'Login session is expired'); diff --git a/package/luci/modules/luci-base/htdocs/luci-static/resources/network.js b/package/luci/modules/luci-base/htdocs/luci-static/resources/network.js index e0013c8ec0..46f07c8f06 100644 --- a/package/luci/modules/luci-base/htdocs/luci-static/resources/network.js +++ b/package/luci/modules/luci-base/htdocs/luci-static/resources/network.js @@ -3396,13 +3396,14 @@ WifiDevice = baseclass.extend(/** @lends LuCI.network.WifiDevice.prototype */ { getI18n: function() { var hw = this.ubus('dev', 'iwinfo', 'hardware'), type = L.isObject(hw) ? hw.name : null; + var modes = this.ubus('dev', 'iwinfo', 'hwmodes_text'); if (this.ubus('dev', 'iwinfo', 'type') == 'wl') type = 'Broadcom'; - return '%s 802.11%s Wireless Controller (%s)'.format( + return '%s %s Wireless Controller (%s)'.format( type || 'Generic', - this.getHWModes().sort(L.naturalCompare).join(''), + modes ? '802.11' + modes : 'unknown', this.getName()); }, @@ -3802,7 +3803,7 @@ WifiNetwork = baseclass.extend(/** @lends LuCI.network.WifiNetwork.prototype */ * * This function actually queries the up state of the related radio * device and assumes this network to be up as well when the parent - * radio is up. This is due to the fact that OpenWrt does not control + * radio is up. This is due to the fact that libreCMC does not control * virtual interfaces individually but within one common hostapd * instance. * diff --git a/package/luci/modules/luci-base/htdocs/luci-static/resources/ui.js b/package/luci/modules/luci-base/htdocs/luci-static/resources/ui.js index 7168b8c144..29810d5798 100644 --- a/package/luci/modules/luci-base/htdocs/luci-static/resources/ui.js +++ b/package/luci/modules/luci-base/htdocs/luci-static/resources/ui.js @@ -374,6 +374,7 @@ var UITextfield = UIElement.extend(/** @lends LuCI.ui.Textfield.prototype */ { 'disabled': this.options.disabled ? '' : null, 'maxlength': this.options.maxlength, 'placeholder': this.options.placeholder, + 'autocomplete': this.options.password ? 'new-password' : null, 'value': this.value, }); @@ -1050,7 +1051,8 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ { 'class': 'cbi-dropdown', 'multiple': this.options.multiple ? '' : null, 'optional': this.options.optional ? '' : null, - 'disabled': this.options.disabled ? '' : null + 'disabled': this.options.disabled ? '' : null, + 'tabindex': -1 }, E('ul')); var keys = Object.keys(this.choices); @@ -1186,11 +1188,11 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ { } else { sb.addEventListener('mouseover', this.handleMouseover.bind(this)); + sb.addEventListener('mouseout', this.handleMouseout.bind(this)); sb.addEventListener('focus', this.handleFocus.bind(this)); canary.addEventListener('focus', this.handleCanaryFocus.bind(this)); - window.addEventListener('mouseover', this.setFocus); window.addEventListener('click', this.closeAllDropdowns); } @@ -1343,7 +1345,12 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ { sb.lastElementChild.setAttribute('tabindex', 0); - this.setFocus(sb, sel || li[0], true); + var focusFn = L.bind(function(el) { + this.setFocus(sb, el, true); + ul.removeEventListener('transitionend', focusFn); + }, this, sel || li[0]); + + ul.addEventListener('transitionend', focusFn); }, /** @private */ @@ -1559,26 +1566,33 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ { /** @private */ setFocus: function(sb, elem, scroll) { - if (sb && sb.hasAttribute && sb.hasAttribute('locked-in')) + if (sb.hasAttribute('locked-in')) return; - if (sb.target && findParent(sb.target, 'ul.dropdown')) + sb.querySelectorAll('.focus').forEach(function(e) { + e.classList.remove('focus'); + }); + + elem.classList.add('focus'); + + if (scroll) + elem.parentNode.scrollTop = elem.offsetTop - elem.parentNode.offsetTop; + + elem.focus(); + }, + + /** @private */ + handleMouseout: function(ev) { + var sb = ev.currentTarget; + + if (!sb.hasAttribute('open')) return; - document.querySelectorAll('.focus').forEach(function(e) { - if (!matchesElem(e, 'input')) { - e.classList.remove('focus'); - e.blur(); - } + sb.querySelectorAll('.focus').forEach(function(e) { + e.classList.remove('focus'); }); - if (elem) { - elem.focus(); - elem.classList.add('focus'); - - if (scroll) - elem.parentNode.scrollTop = elem.offsetTop - elem.parentNode.offsetTop; - } + sb.querySelector('ul.dropdown').focus(); }, /** @private */ @@ -1758,7 +1772,8 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ { /** @private */ handleKeydown: function(ev) { - var sb = ev.currentTarget; + var sb = ev.currentTarget, + ul = sb.querySelector('ul.dropdown'); if (matchesElem(ev.target, 'input')) return; @@ -1779,6 +1794,7 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ { switch (ev.keyCode) { case 27: this.closeDropdown(sb); + ev.stopPropagation(); break; case 13: @@ -1802,6 +1818,10 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ { this.setFocus(sb, active.previousElementSibling); ev.preventDefault(); } + else if (document.activeElement === ul) { + this.setFocus(sb, ul.lastElementChild); + ev.preventDefault(); + } break; case 40: @@ -1809,6 +1829,10 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ { this.setFocus(sb, active.nextElementSibling); ev.preventDefault(); } + else if (document.activeElement === ul) { + this.setFocus(sb, ul.firstElementChild); + ev.preventDefault(); + } break; } } @@ -3209,6 +3233,17 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { if (!Array.isArray(data)) return; + this.data = data; + this.placeholder = placeholder; + + var n = 0, + rows = this.node.querySelectorAll('tr, .tr'), + trows = [], + headings = [].slice.call(this.node.firstElementChild.querySelectorAll('th, .th')), + captionClasses = this.options.captionClasses, + trTag = (rows[0] && rows[0].nodeName == 'DIV') ? 'div' : 'tr', + tdTag = (headings[0] && headings[0].nodeName == 'DIV') ? 'div' : 'td'; + if (sorting) { var list = data.map(L.bind(function(row) { return [ this.deriveSortKey(row[sorting[0]], sorting[0]), row ]; @@ -3225,25 +3260,23 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { list.forEach(function(item) { data.push(item[1]); }); - } - this.data = data; - this.placeholder = placeholder; - - var n = 0, - rows = this.node.querySelectorAll('tr'), - trows = [], - headings = [].slice.call(this.node.firstElementChild.querySelectorAll('th')), - captionClasses = this.options.captionClasses; + headings.forEach(function(th, i) { + if (i == sorting[0]) + th.setAttribute('data-sort-direction', sorting[1] ? 'desc' : 'asc'); + else + th.removeAttribute('data-sort-direction'); + }); + } data.forEach(function(row) { - trows[n] = E('tr', { 'class': 'tr' }); + trows[n] = E(trTag, { 'class': 'tr' }); for (var i = 0; i < headings.length; i++) { var text = (headings[i].innerText || '').trim(); var raw_val = Array.isArray(row[i]) ? row[i][0] : null; var disp_val = Array.isArray(row[i]) ? row[i][1] : row[i]; - var td = trows[n].appendChild(E('td', { + var td = trows[n].appendChild(E(tdTag, { 'class': 'td', 'data-title': (text !== '') ? text : null, 'data-value': raw_val @@ -3270,8 +3303,8 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { this.node.removeChild(rows[n]); if (placeholder && this.node.firstElementChild === this.node.lastElementChild) { - var trow = this.node.appendChild(E('tr', { 'class': 'tr placeholder' })), - td = trow.appendChild(E('td', { 'class': 'td' }, placeholder)); + var trow = this.node.appendChild(E(trTag, { 'class': 'tr placeholder' })), + td = trow.appendChild(E(tdTag, { 'class': 'td' }, placeholder)); if (typeof(captionClasses) == 'object') DOMTokenList.prototype.add.apply(td.classList, L.toArray(captionClasses[0])); @@ -3298,6 +3331,7 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { if (!headrow) return; + options.id = node.id; options.classes = [].slice.call(node.classList).filter(function(c) { return c != 'table' }); options.sortable = []; options.captionClasses = []; @@ -3396,8 +3430,11 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { if (this.sortState) return this.sortState; + if (!this.options.id) + return null; + var page = document.body.getAttribute('data-page'), - key = page + '.' + this.id, + key = page + '.' + this.options.id, state = session.getLocalData('tablesort'); if (L.isObject(state) && Array.isArray(state[key])) @@ -3414,7 +3451,7 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { return; var page = document.body.getAttribute('data-page'), - key = page + '.' + this.id, + key = page + '.' + this.options.id, state = session.getLocalData('tablesort'); if (!L.isObject(state)) @@ -3430,19 +3467,15 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { if (!ev.target.matches('th[data-sortable-row]')) return; - var th = ev.target, - direction = (th.getAttribute('data-sort-direction') == 'asc'), - index = 0; + var index, direction; - this.node.firstElementChild.querySelectorAll('th').forEach(function(other_th, i) { - if (other_th !== th) - other_th.removeAttribute('data-sort-direction'); - else + this.node.firstElementChild.querySelectorAll('th, .th').forEach(function(th, i) { + if (th === ev.target) { index = i; + direction = th.getAttribute('data-sort-direction') == 'asc'; + } }); - th.setAttribute('data-sort-direction', direction ? 'desc' : 'asc'); - this.setActiveSortState(index, direction); this.update(this.data, this.placeholder); } @@ -3461,8 +3494,17 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ { var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ { __init__: function() { modalDiv = document.body.appendChild( - dom.create('div', { id: 'modal_overlay' }, - dom.create('div', { class: 'modal', role: 'dialog', 'aria-modal': true }))); + dom.create('div', { + id: 'modal_overlay', + tabindex: -1, + keydown: this.cancelModal + }, [ + dom.create('div', { + class: 'modal', + role: 'dialog', + 'aria-modal': true + }) + ])); tooltipDiv = document.body.appendChild( dom.create('div', { class: 'cbi-tooltip' })); @@ -3526,6 +3568,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ { document.body.classList.add('modal-overlay-active'); modalDiv.scrollTop = 0; + modalDiv.focus(); return dlg; }, @@ -3542,6 +3585,17 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ { */ hideModal: function() { document.body.classList.remove('modal-overlay-active'); + modalDiv.blur(); + }, + + /** @private */ + cancelModal: function(ev) { + if (ev.key == 'Escape') { + var btn = modalDiv.querySelector('.right > button, .right > .btn'); + + if (btn) + btn.click(); + } }, /** @private */ @@ -4157,7 +4211,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ { 'class': 'btn', 'click': function() { UI.prototype.hideModal(); - rejectFn(new Error('Upload has been cancelled')); + rejectFn(new Error(_('Upload has been cancelled'))); } }, [ _('Cancel') ]), ' ', diff --git a/package/luci/modules/luci-base/htdocs/luci-static/resources/validation.js b/package/luci/modules/luci-base/htdocs/luci-static/resources/validation.js index 6dddf964fb..791a84823d 100644 --- a/package/luci/modules/luci-base/htdocs/luci-static/resources/validation.js +++ b/package/luci/modules/luci-base/htdocs/luci-static/resources/validation.js @@ -426,6 +426,15 @@ var ValidatorFactory = baseclass.extend({ return this.assert(this.value.match(/^[a-zA-Z0-9_]+$/), _('valid UCI identifier')); }, + netdevname: function() { + var v = this.value; + + if (v == '.' || v == '..') + return this.assert(false, _('valid network device name, not "." or ".."')); + + return this.assert(v.match(/^[^:\/%\s]{1,15}$/), _('valid network device name between 1 and 15 characters not containing ":", "/", "%" or spaces')); + }, + range: function(min, max) { var val = this.factory.parseDecimal(this.value); return this.assert(val >= +min && val <= +max, _('value between %f and %f').format(min, max)); diff --git a/package/luci/modules/luci-base/luasrc/controller/admin/index.lua b/package/luci/modules/luci-base/luasrc/controller/admin/index.lua deleted file mode 100644 index 8f9b481cce..0000000000 --- a/package/luci/modules/luci-base/luasrc/controller/admin/index.lua +++ /dev/null @@ -1,199 +0,0 @@ --- Copyright 2008 Steven Barth --- Licensed to the public under the Apache License 2.0. - -module("luci.controller.admin.index", package.seeall) - -function action_logout() - local dsp = require "luci.dispatcher" - local utl = require "luci.util" - local sid = dsp.context.authsession - - if sid then - utl.ubus("session", "destroy", { ubus_rpc_session = sid }) - - local url = dsp.build_url() - - if luci.http.getenv('HTTPS') == 'on' then - luci.http.header("Set-Cookie", "sysauth_https=; expires=Thu, 01 Jan 1970 01:00:00 GMT; path=%s" % url) - end - - luci.http.header("Set-Cookie", "sysauth_http=; expires=Thu, 01 Jan 1970 01:00:00 GMT; path=%s" % url) - end - - luci.http.redirect(dsp.build_url()) -end - -function action_translations(lang) - local i18n = require "luci.i18n" - local http = require "luci.http" - local fs = require "nixio".fs - - if lang and #lang > 0 then - lang = i18n.setlanguage(lang) - if lang then - local s = fs.stat("%s/base.%s.lmo" %{ i18n.i18ndir, lang }) - if s then - http.header("Cache-Control", "public, max-age=31536000") - http.header("ETag", "%x-%x-%x" %{ s["ino"], s["size"], s["mtime"] }) - end - end - end - - http.prepare_content("application/javascript; charset=utf-8") - http.write("window.TR=") - http.write_json(i18n.dump()) -end - -local function ubus_reply(id, data, code, errmsg) - local reply = { jsonrpc = "2.0", id = id } - if errmsg then - reply.error = { - code = code, - message = errmsg - } - elseif type(code) == "table" then - reply.result = code - else - reply.result = { code, data } - end - - return reply -end - -local ubus_types = { - nil, - "array", - "object", - "string", - nil, -- INT64 - "number", - nil, -- INT16, - "boolean", - "double" -} - -local function ubus_access(sid, obj, fun) - local res, code = luci.util.ubus("session", "access", { - ubus_rpc_session = sid, - scope = "ubus", - object = obj, - ["function"] = fun - }) - - return (type(res) == "table" and res.access == true) -end - -local function ubus_request(req) - if type(req) ~= "table" or type(req.method) ~= "string" or req.jsonrpc ~= "2.0" or req.id == nil then - return ubus_reply(nil, nil, -32600, "Invalid request") - - elseif req.method == "call" then - if type(req.params) ~= "table" or #req.params < 3 then - return ubus_reply(nil, nil, -32600, "Invalid parameters") - end - - local sid, obj, fun, arg = - req.params[1], req.params[2], req.params[3], req.params[4] or {} - if type(arg) ~= "table" or arg.ubus_rpc_session ~= nil then - return ubus_reply(req.id, nil, -32602, "Invalid parameters") - end - - if sid == "00000000000000000000000000000000" and luci.dispatcher.context.authsession then - sid = luci.dispatcher.context.authsession - end - - if not ubus_access(sid, obj, fun) then - return ubus_reply(req.id, nil, -32002, "Access denied") - end - - arg.ubus_rpc_session = sid - - local res, code = luci.util.ubus(obj, fun, arg) - return ubus_reply(req.id, res, code or 0) - - elseif req.method == "list" then - if req.params == nil or (type(req.params) == "table" and #req.params == 0) then - local objs = luci.util.ubus() - return ubus_reply(req.id, nil, objs) - - elseif type(req.params) == "table" then - local n, rv = nil, {} - for n = 1, #req.params do - if type(req.params[n]) ~= "string" then - return ubus_reply(req.id, nil, -32602, "Invalid parameters") - end - - local sig = luci.util.ubus(req.params[n]) - if sig and type(sig) == "table" then - rv[req.params[n]] = {} - - local m, p - for m, p in pairs(sig) do - if type(p) == "table" then - rv[req.params[n]][m] = {} - - local pn, pt - for pn, pt in pairs(p) do - rv[req.params[n]][m][pn] = ubus_types[pt] or "unknown" - end - end - end - end - end - return ubus_reply(req.id, nil, rv) - - else - return ubus_reply(req.id, nil, -32602, "Invalid parameters") - end - end - - return ubus_reply(req.id, nil, -32601, "Method not found") -end - -function action_ubus() - local parser = require "luci.jsonc".new() - - luci.http.context.request:setfilehandler(function(_, s) - if not s then - return nil - end - - local ok, err = parser:parse(s) - return (not err or nil) - end) - - luci.http.context.request:content() - - local json = parser:get() - if json == nil or type(json) ~= "table" then - luci.http.prepare_content("application/json") - luci.http.write_json(ubus_reply(nil, nil, -32700, "Parse error")) - return - end - - local response - if #json == 0 then - response = ubus_request(json) - else - response = {} - - local _, request - for _, request in ipairs(json) do - response[_] = ubus_request(request) - end - end - - luci.http.prepare_content("application/json") - luci.http.write_json(response) -end - -function action_menu() - local dsp = require "luci.dispatcher" - local http = require "luci.http" - - local _, _, acls = dsp.is_authenticated({ methods = { "cookie:sysauth_https", "cookie:sysauth_http" } }) - local menu = dsp.menu_json(acls or {}) or {} - - http.prepare_content("application/json") - http.write_json(menu) -end diff --git a/package/luci/modules/luci-base/luasrc/controller/admin/uci.lua b/package/luci/modules/luci-base/luasrc/controller/admin/uci.lua deleted file mode 100644 index 7aad10d58a..0000000000 --- a/package/luci/modules/luci-base/luasrc/controller/admin/uci.lua +++ /dev/null @@ -1,70 +0,0 @@ --- Copyright 2008 Steven Barth --- Copyright 2010-2019 Jo-Philipp Wich --- Licensed to the public under the Apache License 2.0. - -module("luci.controller.admin.uci", package.seeall) - -local function ubus_state_to_http(errstr) - local map = { - ["Invalid command"] = 400, - ["Invalid argument"] = 400, - ["Method not found"] = 404, - ["Entry not found"] = 404, - ["No data"] = 204, - ["Permission denied"] = 403, - ["Timeout"] = 504, - ["Not supported"] = 500, - ["Unknown error"] = 500, - ["Connection failed"] = 503 - } - - local code = map[errstr] or 200 - local msg = errstr or "OK" - - luci.http.status(code, msg) - - if code ~= 204 then - luci.http.prepare_content("text/plain") - luci.http.write(msg) - end -end - -function action_apply_rollback() - local uci = require "luci.model.uci" - local token, errstr = uci:apply(true) - if token then - luci.http.prepare_content("application/json") - luci.http.write_json({ token = token }) - else - ubus_state_to_http(errstr) - end -end - -function action_apply_unchecked() - local uci = require "luci.model.uci" - local _, errstr = uci:apply(false) - ubus_state_to_http(errstr) -end - -function action_confirm() - local uci = require "luci.model.uci" - local token = luci.http.formvalue("token") - local _, errstr = uci:confirm(token) - ubus_state_to_http(errstr) -end - -function action_revert() - local uci = require "luci.model.uci" - local changes = uci:changes() - - -- Collect files to be reverted - local _, errstr, r, tbl - for r, tbl in pairs(changes) do - _, errstr = uci:revert(r) - if errstr then - break - end - end - - ubus_state_to_http(errstr or "OK") -end diff --git a/package/luci/modules/luci-base/luasrc/dispatcher.lua b/package/luci/modules/luci-base/luasrc/dispatcher.lua deleted file mode 100644 index a3726fb1c1..0000000000 --- a/package/luci/modules/luci-base/luasrc/dispatcher.lua +++ /dev/null @@ -1,1564 +0,0 @@ --- Copyright 2008 Steven Barth --- Copyright 2008-2015 Jo-Philipp Wich --- Licensed to the public under the Apache License 2.0. - -local fs = require "nixio.fs" -local sys = require "luci.sys" -local util = require "luci.util" -local xml = require "luci.xml" -local http = require "luci.http" -local nixio = require "nixio", require "nixio.util" - -module("luci.dispatcher", package.seeall) -context = util.threadlocal() -uci = require "luci.model.uci" -i18n = require "luci.i18n" -_M.fs = fs - --- Index table -local index = nil - -local function check_fs_depends(spec) - local fs = require "nixio.fs" - - for path, kind in pairs(spec) do - if kind == "directory" then - local empty = true - for entry in (fs.dir(path) or function() end) do - empty = false - break - end - if empty then - return false - end - elseif kind == "executable" then - if fs.stat(path, "type") ~= "reg" or not fs.access(path, "x") then - return false - end - elseif kind == "file" then - if fs.stat(path, "type") ~= "reg" then - return false - end - elseif kind == "absent" then - if fs.stat(path, "type") then - return false - end - end - end - - return true -end - -local function check_uci_depends_options(conf, s, opts) - local uci = require "luci.model.uci" - - if type(opts) == "string" then - return (s[".type"] == opts) - elseif opts == true then - for option, value in pairs(s) do - if option:byte(1) ~= 46 then - return true - end - end - elseif type(opts) == "table" then - for option, value in pairs(opts) do - local sval = s[option] - if type(sval) == "table" then - local found = false - for _, v in ipairs(sval) do - if v == value then - found = true - break - end - end - if not found then - return false - end - elseif value == true then - if sval == nil then - return false - end - else - if sval ~= value then - return false - end - end - end - end - - return true -end - -local function check_uci_depends_section(conf, sect) - local uci = require "luci.model.uci" - - for section, options in pairs(sect) do - local stype = section:match("^@([A-Za-z0-9_%-]+)$") - if stype then - local found = false - uci:foreach(conf, stype, function(s) - if check_uci_depends_options(conf, s, options) then - found = true - return false - end - end) - if not found then - return false - end - else - local s = uci:get_all(conf, section) - if not s or not check_uci_depends_options(conf, s, options) then - return false - end - end - end - - return true -end - -local function check_uci_depends(conf) - local uci = require "luci.model.uci" - - for config, values in pairs(conf) do - if values == true then - local found = false - uci:foreach(config, nil, function(s) - found = true - return false - end) - if not found then - return false - end - elseif type(values) == "table" then - if not check_uci_depends_section(config, values) then - return false - end - end - end - - return true -end - -local function check_acl_depends(require_groups, groups) - if type(require_groups) == "table" and #require_groups > 0 then - local writable = false - - for _, group in ipairs(require_groups) do - local read = false - local write = false - if type(groups) == "table" and type(groups[group]) == "table" then - for _, perm in ipairs(groups[group]) do - if perm == "read" then - read = true - elseif perm == "write" then - write = true - end - end - end - if not read and not write then - return nil - elseif write then - writable = true - end - end - - return writable - end - - return true -end - -local function check_depends(spec) - if type(spec.depends) ~= "table" then - return true - end - - if type(spec.depends.fs) == "table" then - local satisfied = false - local alternatives = (#spec.depends.fs > 0) and spec.depends.fs or { spec.depends.fs } - for _, alternative in ipairs(alternatives) do - if check_fs_depends(alternative) then - satisfied = true - break - end - end - if not satisfied then - return false - end - end - - if type(spec.depends.uci) == "table" then - local satisfied = false - local alternatives = (#spec.depends.uci > 0) and spec.depends.uci or { spec.depends.uci } - for _, alternative in ipairs(alternatives) do - if check_uci_depends(alternative) then - satisfied = true - break - end - end - if not satisfied then - return false - end - end - - return true -end - -local function target_to_json(target, module) - local action - - if target.type == "call" then - action = { - ["type"] = "call", - ["module"] = module, - ["function"] = target.name, - ["parameters"] = target.argv - } - elseif target.type == "view" then - action = { - ["type"] = "view", - ["path"] = target.view - } - elseif target.type == "template" then - action = { - ["type"] = "template", - ["path"] = target.view - } - elseif target.type == "cbi" then - action = { - ["type"] = "cbi", - ["path"] = target.model, - ["config"] = target.config - } - elseif target.type == "form" then - action = { - ["type"] = "form", - ["path"] = target.model - } - elseif target.type == "firstchild" then - action = { - ["type"] = "firstchild" - } - elseif target.type == "firstnode" then - action = { - ["type"] = "firstchild", - ["recurse"] = true - } - elseif target.type == "arcombine" then - if type(target.targets) == "table" then - action = { - ["type"] = "arcombine", - ["targets"] = { - target_to_json(target.targets[1], module), - target_to_json(target.targets[2], module) - } - } - end - elseif target.type == "alias" then - action = { - ["type"] = "alias", - ["path"] = table.concat(target.req, "/") - } - elseif target.type == "rewrite" then - action = { - ["type"] = "rewrite", - ["path"] = table.concat(target.req, "/"), - ["remove"] = target.n - } - end - - if target.post and action then - action.post = target.post - end - - return action -end - -local function tree_to_json(node, json) - local fs = require "nixio.fs" - local util = require "luci.util" - - if type(node.nodes) == "table" then - for subname, subnode in pairs(node.nodes) do - local spec = { - title = xml.striptags(subnode.title), - order = subnode.order - } - - if subnode.leaf then - spec.wildcard = true - end - - if subnode.cors then - spec.cors = true - end - - if subnode.setuser then - spec.setuser = subnode.setuser - end - - if subnode.setgroup then - spec.setgroup = subnode.setgroup - end - - if type(subnode.target) == "table" then - spec.action = target_to_json(subnode.target, subnode.module) - end - - if type(subnode.file_depends) == "table" then - for _, v in ipairs(subnode.file_depends) do - spec.depends = spec.depends or {} - spec.depends.fs = spec.depends.fs or {} - - local ft = fs.stat(v, "type") - if ft == "dir" then - spec.depends.fs[v] = "directory" - elseif v:match("/s?bin/") then - spec.depends.fs[v] = "executable" - else - spec.depends.fs[v] = "file" - end - end - end - - if type(subnode.uci_depends) == "table" then - for k, v in pairs(subnode.uci_depends) do - spec.depends = spec.depends or {} - spec.depends.uci = spec.depends.uci or {} - spec.depends.uci[k] = v - end - end - - if type(subnode.acl_depends) == "table" then - for _, acl in ipairs(subnode.acl_depends) do - spec.depends = spec.depends or {} - spec.depends.acl = spec.depends.acl or {} - spec.depends.acl[#spec.depends.acl + 1] = acl - end - end - - if (subnode.sysauth_authenticator ~= nil) or - (subnode.sysauth ~= nil and subnode.sysauth ~= false) - then - if subnode.sysauth_authenticator == "htmlauth" then - spec.auth = { - login = true, - methods = { "cookie:sysauth_https", "cookie:sysauth_http" } - } - elseif subname == "rpc" and subnode.module == "luci.controller.rpc" then - spec.auth = { - login = false, - methods = { "query:auth", "cookie:sysauth_https", "cookie:sysauth_http" } - } - elseif subnode.module == "luci.controller.admin.uci" then - spec.auth = { - login = false, - methods = { "param:sid" } - } - end - elseif subnode.sysauth == false then - spec.auth = {} - end - - if not spec.action then - spec.title = nil - end - - spec.satisfied = check_depends(spec) - json.children = json.children or {} - json.children[subname] = tree_to_json(subnode, spec) - end - end - - return json -end - -function build_url(...) - local path = {...} - local url = { http.getenv("SCRIPT_NAME") or "" } - - local p - for _, p in ipairs(path) do - if p:match("^[a-zA-Z0-9_%-%.%%/,;]+$") then - url[#url+1] = "/" - url[#url+1] = p - end - end - - if #path == 0 then - url[#url+1] = "/" - end - - return table.concat(url, "") -end - - -function error404(message) - http.status(404, "Not Found") - message = message or "Not Found" - - local function render() - local template = require "luci.template" - template.render("error404", {message=message}) - end - - if not util.copcall(render) then - http.prepare_content("text/plain") - http.write(message) - end - - return false -end - -function error500(message) - util.perror(message) - if not context.template_header_sent then - http.status(500, "Internal Server Error") - http.prepare_content("text/plain") - http.write(message) - else - require("luci.template") - if not util.copcall(luci.template.render, "error500", {message=message}) then - http.prepare_content("text/plain") - http.write(message) - end - end - return false -end - -local function determine_request_language() - local conf = require "luci.config" - assert(conf.main, "/etc/config/luci seems to be corrupt, unable to find section 'main'") - - local lang = conf.main.lang or "auto" - if lang == "auto" then - local aclang = http.getenv("HTTP_ACCEPT_LANGUAGE") or "" - for aclang in aclang:gmatch("[%w_-]+") do - local country, culture = aclang:match("^([a-z][a-z])[_-]([a-zA-Z][a-zA-Z])$") - if country and culture then - local cc = "%s_%s" %{ country, culture:lower() } - if conf.languages[cc] then - lang = cc - break - elseif conf.languages[country] then - lang = country - break - end - elseif conf.languages[aclang] then - lang = aclang - break - end - end - end - - if lang == "auto" then - lang = i18n.default - end - - i18n.setlanguage(lang) -end - -function httpdispatch(request, prefix) - http.context.request = request - - local r = {} - context.request = r - - local pathinfo = http.urldecode(request:getenv("PATH_INFO") or "", true) - - if prefix then - for _, node in ipairs(prefix) do - r[#r+1] = node - end - end - - local node - for node in pathinfo:gmatch("[^/%z]+") do - r[#r+1] = node - end - - determine_request_language() - - local stat, err = util.coxpcall(function() - dispatch(context.request) - end, error500) - - http.close() - - --context._disable_memtrace() -end - -local function require_post_security(target, args) - if type(target) == "table" and target.type == "arcombine" and type(target.targets) == "table" then - return require_post_security((type(args) == "table" and #args > 0) and target.targets[2] or target.targets[1], args) - end - - if type(target) == "table" then - if type(target.post) == "table" then - local param_name, required_val, request_val - - for param_name, required_val in pairs(target.post) do - request_val = http.formvalue(param_name) - - if (type(required_val) == "string" and - request_val ~= required_val) or - (required_val == true and request_val == nil) - then - return false - end - end - - return true - end - - return (target.post == true) - end - - return false -end - -function test_post_security() - if http.getenv("REQUEST_METHOD") ~= "POST" then - http.status(405, "Method Not Allowed") - http.header("Allow", "POST") - return false - end - - if http.formvalue("token") ~= context.authtoken then - http.status(403, "Forbidden") - luci.template.render("csrftoken") - return false - end - - return true -end - -local function session_retrieve(sid, allowed_users) - local sdat = util.ubus("session", "get", { ubus_rpc_session = sid }) - local sacl = util.ubus("session", "access", { ubus_rpc_session = sid }) - - if type(sdat) == "table" and - type(sdat.values) == "table" and - type(sdat.values.token) == "string" and - (not allowed_users or - util.contains(allowed_users, sdat.values.username)) - then - uci:set_session_id(sid) - return sid, sdat.values, type(sacl) == "table" and sacl or {} - end - - return nil, nil, nil -end - -local function session_setup(user, pass) - local login = util.ubus("session", "login", { - username = user, - password = pass, - timeout = tonumber(luci.config.sauth.sessiontime) - }) - - local rp = context.requestpath - and table.concat(context.requestpath, "/") or "" - - if type(login) == "table" and - type(login.ubus_rpc_session) == "string" - then - util.ubus("session", "set", { - ubus_rpc_session = login.ubus_rpc_session, - values = { token = sys.uniqueid(16) } - }) - nixio.syslog("info", tostring("luci: accepted login on /%s for %s from %s\n" - %{ rp, user or "?", http.getenv("REMOTE_ADDR") or "?" })) - - return session_retrieve(login.ubus_rpc_session) - end - nixio.syslog("info", tostring("luci: failed login on /%s for %s from %s\n" - %{ rp, user or "?", http.getenv("REMOTE_ADDR") or "?" })) -end - -local function check_authentication(method) - local auth_type, auth_param = method:match("^(%w+):(.+)$") - local sid, sdat - - if auth_type == "cookie" then - sid = http.getcookie(auth_param) - elseif auth_type == "param" then - sid = http.formvalue(auth_param) - elseif auth_type == "query" then - sid = http.formvalue(auth_param, true) - end - - return session_retrieve(sid) -end - -local function merge_trees(node_a, node_b) - for k, v in pairs(node_b) do - if k == "children" then - node_a.children = node_a.children or {} - - for name, spec in pairs(v) do - node_a.children[name] = merge_trees(node_a.children[name] or {}, spec) - end - else - node_a[k] = v - end - end - - if type(node_a.action) == "table" and - node_a.action.type == "firstchild" and - node_a.children == nil - then - node_a.satisfied = false - end - - return node_a -end - -local function apply_tree_acls(node, acl) - if type(node.children) == "table" then - for _, child in pairs(node.children) do - apply_tree_acls(child, acl) - end - end - - local perm - if type(node.depends) == "table" then - perm = check_acl_depends(node.depends.acl, acl["access-group"]) - else - perm = true - end - - if perm == nil then - node.satisfied = false - elseif perm == false then - node.readonly = true - end -end - -function menu_json(acl) - local tree = context.tree or createtree() - local lua_tree = tree_to_json(tree, { - action = { - ["type"] = "firstchild", - ["recurse"] = true - } - }) - - local json_tree = createtree_json() - local menu_tree = merge_trees(lua_tree, json_tree) - - if acl then - apply_tree_acls(menu_tree, acl) - end - - return menu_tree -end - -local function init_template_engine(ctx) - local tpl = require "luci.template" - local media = luci.config.main.mediaurlbase - - if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then - media = nil - for name, theme in pairs(luci.config.themes) do - if name:sub(1,1) ~= "." and pcall(tpl.Template, - "themes/%s/header" % fs.basename(theme)) then - media = theme - end - end - assert(media, "No valid theme found") - end - - local function _ifattr(cond, key, val, noescape) - if cond then - local env = getfenv(3) - local scope = (type(env.self) == "table") and env.self - if type(val) == "table" then - if not next(val) then - return '' - else - val = util.serialize_json(val) - end - end - - val = tostring(val or - (type(env[key]) ~= "function" and env[key]) or - (scope and type(scope[key]) ~= "function" and scope[key]) or "") - - if noescape ~= true then - val = xml.pcdata(val) - end - - return string.format(' %s="%s"', tostring(key), val) - else - return '' - end - end - - tpl.context.viewns = setmetatable({ - write = http.write; - include = function(name) tpl.Template(name):render(getfenv(2)) end; - translate = i18n.translate; - translatef = i18n.translatef; - export = function(k, v) if tpl.context.viewns[k] == nil then tpl.context.viewns[k] = v end end; - striptags = xml.striptags; - pcdata = xml.pcdata; - media = media; - theme = fs.basename(media); - resource = luci.config.main.resourcebase; - ifattr = function(...) return _ifattr(...) end; - attr = function(...) return _ifattr(true, ...) end; - url = build_url; - }, {__index=function(tbl, key) - if key == "controller" then - return build_url() - elseif key == "REQUEST_URI" then - return build_url(unpack(ctx.requestpath)) - elseif key == "FULL_REQUEST_URI" then - local url = { http.getenv("SCRIPT_NAME") or "", http.getenv("PATH_INFO") } - local query = http.getenv("QUERY_STRING") - if query and #query > 0 then - url[#url+1] = "?" - url[#url+1] = query - end - return table.concat(url, "") - elseif key == "token" then - return ctx.authtoken - else - return rawget(tbl, key) or _G[key] - end - end}) - - return tpl -end - -function is_authenticated(auth) - if type(auth) == "table" and type(auth.methods) == "table" and #auth.methods > 0 then - local sid, sdat, sacl - for _, method in ipairs(auth.methods) do - sid, sdat, sacl = check_authentication(method) - - if sid and sdat and sacl then - return sid, sdat, sacl - end - end - end -end - -local function ctx_append(ctx, name, node) - ctx.path = ctx.path or {} - ctx.path[#ctx.path + 1] = name - - ctx.acls = ctx.acls or {} - - local acls = (type(node.depends) == "table" and type(node.depends.acl) == "table") and node.depends.acl or {} - for _, acl in ipairs(acls) do - ctx.acls[_] = acl - end - - ctx.auth = node.auth or ctx.auth - ctx.cors = node.cors or ctx.cors - ctx.suid = node.setuser or ctx.suid - ctx.sgid = node.setgroup or ctx.sgid - - return ctx -end - -local function node_weight(node) - local weight = node.order or 9999 - - if weight > 9999 then - weight = 9999 - end - - if type(node.auth) == "table" and node.auth.login then - weight = weight + 10000 - end - - return weight -end - -local function resolve_firstchild(node, sacl, login_allowed, ctx) - local candidate = nil - local candidate_ctx = nil - - for name, child in pairs(node.children) do - if child.satisfied then - if not sacl then - local _ - _, _, sacl = is_authenticated(node.auth) - end - - local cacl = (type(child.depends) == "table") and child.depends.acl or nil - local login = login_allowed or (type(child.auth) == "table" and child.auth.login) - if login or check_acl_depends(cacl, sacl and sacl["access-group"]) ~= nil then - if child.title and type(child.action) == "table" then - local child_ctx = ctx_append(util.clone(ctx, true), name, child) - if child.action.type == "firstchild" then - if not candidate or node_weight(candidate) > node_weight(child) then - local have_grandchild = resolve_firstchild(child, sacl, login, child_ctx) - if have_grandchild then - candidate = child - candidate_ctx = child_ctx - end - end - elseif not child.firstchild_ineligible then - if not candidate or node_weight(candidate) > node_weight(child) then - candidate = child - candidate_ctx = child_ctx - end - end - end - end - end - end - - if candidate then - for k, v in pairs(candidate_ctx) do - ctx[k] = v - end - - return true - end - - return false -end - -local function resolve_page(tree, request_path) - local node = tree - local sacl = nil - local login = false - local ctx = {} - - for i, s in ipairs(request_path) do - node = node.children and node.children[s] - - if not node or not node.satisfied then - break - end - - ctx_append(ctx, s, node) - - if not sacl then - local _ - _, _, sacl = is_authenticated(node.auth) - end - - if not login and type(node.auth) == "table" and node.auth.login then - login = true - end - - if node.wildcard then - ctx.request_args = {} - ctx.request_path = util.clone(ctx.path, true) - - for j = i + 1, #request_path do - ctx.request_path[j] = request_path[j] - ctx.request_args[j - i] = request_path[j] - end - - break - end - end - - if node and type(node.action) == "table" and node.action.type == "firstchild" then - resolve_firstchild(node, sacl, login, ctx) - end - - ctx.acls = ctx.acls or {} - ctx.path = ctx.path or {} - ctx.request_args = ctx.request_args or {} - ctx.request_path = ctx.request_path or util.clone(request_path, true) - - node = tree - - for _, s in ipairs(ctx.path or {}) do - node = node.children[s] - assert(node, "Internal node resolve error") - end - - return node, ctx -end - -function dispatch(request) - --context._disable_memtrace = require "luci.debug".trap_memtrace("l") - local ctx = context - - local auth, cors, suid, sgid - local menu = menu_json() - local page, lookup_ctx = resolve_page(menu, request) - local action = (page and type(page.action) == "table") and page.action or {} - - local tpl = init_template_engine(ctx) - - ctx.args = lookup_ctx.request_args - ctx.path = lookup_ctx.path - ctx.dispatched = page - - ctx.requestpath = ctx.requestpath or lookup_ctx.request_path - ctx.requestargs = ctx.requestargs or lookup_ctx.request_args - ctx.requested = ctx.requested or page - - if type(lookup_ctx.auth) == "table" and next(lookup_ctx.auth) then - local sid, sdat, sacl = is_authenticated(lookup_ctx.auth) - - if not (sid and sdat and sacl) and lookup_ctx.auth.login then - local user = http.getenv("HTTP_AUTH_USER") - local pass = http.getenv("HTTP_AUTH_PASS") - - if user == nil and pass == nil then - user = http.formvalue("luci_username") - pass = http.formvalue("luci_password") - end - - if user and pass then - sid, sdat, sacl = session_setup(user, pass) - end - - if not sid then - context.path = {} - - http.status(403, "Forbidden") - http.header("X-LuCI-Login-Required", "yes") - - local scope = { duser = "root", fuser = user } - local ok, res = util.copcall(tpl.render_string, [[<% include("themes/" .. theme .. "/sysauth") %>]], scope) - if ok then - return res - end - return tpl.render("sysauth", scope) - end - - http.header("Set-Cookie", 'sysauth_%s=%s; path=%s; SameSite=Strict; HttpOnly%s' %{ - http.getenv("HTTPS") == "on" and "https" or "http", - sid, build_url(), http.getenv("HTTPS") == "on" and "; secure" or "" - }) - - http.redirect(build_url(unpack(ctx.requestpath))) - return - end - - if not sid or not sdat or not sacl then - http.status(403, "Forbidden") - http.header("X-LuCI-Login-Required", "yes") - return - end - - ctx.authsession = sid - ctx.authtoken = sdat.token - ctx.authuser = sdat.username - ctx.authacl = sacl - end - - if #lookup_ctx.acls > 0 then - local perm = check_acl_depends(lookup_ctx.acls, ctx.authacl and ctx.authacl["access-group"]) - if perm == nil then - http.status(403, "Forbidden") - return - end - - if page then - page.readonly = not perm - end - end - - if action.type == "arcombine" then - action = (#lookup_ctx.request_args > 0) and action.targets[2] or action.targets[1] - end - - if lookup_ctx.cors and http.getenv("REQUEST_METHOD") == "OPTIONS" then - luci.http.status(200, "OK") - luci.http.header("Access-Control-Allow-Origin", http.getenv("HTTP_ORIGIN") or "*") - luci.http.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS") - return - end - - if require_post_security(action) then - if not test_post_security() then - return - end - end - - if lookup_ctx.sgid then - sys.process.setgroup(lookup_ctx.sgid) - end - - if lookup_ctx.suid then - sys.process.setuser(lookup_ctx.suid) - end - - if action.type == "view" then - tpl.render("view", { view = action.path }) - - elseif action.type == "call" then - local ok, mod = util.copcall(require, action.module) - if not ok then - error500(mod) - return - end - - local func = mod[action["function"]] - - assert(func ~= nil, - 'Cannot resolve function "' .. action["function"] .. '". Is it misspelled or local?') - - assert(type(func) == "function", - 'The symbol "' .. action["function"] .. '" does not refer to a function but data ' .. - 'of type "' .. type(func) .. '".') - - local argv = (type(action.parameters) == "table" and #action.parameters > 0) and { unpack(action.parameters) } or {} - for _, s in ipairs(lookup_ctx.request_args) do - argv[#argv + 1] = s - end - - local ok, err = util.copcall(func, unpack(argv)) - if not ok then - error500(err) - end - - --elseif action.type == "firstchild" then - -- tpl.render("empty_node_placeholder", getfenv(1)) - - elseif action.type == "alias" then - local sub_request = {} - for name in action.path:gmatch("[^/]+") do - sub_request[#sub_request + 1] = name - end - - for _, s in ipairs(lookup_ctx.request_args) do - sub_request[#sub_request + 1] = s - end - - dispatch(sub_request) - - elseif action.type == "rewrite" then - local sub_request = { unpack(request) } - for i = 1, action.remove do - table.remove(sub_request, 1) - end - - local n = 1 - for s in action.path:gmatch("[^/]+") do - table.insert(sub_request, n, s) - n = n + 1 - end - - for _, s in ipairs(lookup_ctx.request_args) do - sub_request[#sub_request + 1] = s - end - - dispatch(sub_request) - - elseif action.type == "template" then - tpl.render(action.path, getfenv(1)) - - elseif action.type == "cbi" then - _cbi({ config = action.config, model = action.path }, unpack(lookup_ctx.request_args)) - - elseif action.type == "form" then - _form({ model = action.path }, unpack(lookup_ctx.request_args)) - - else - if not menu.children then - error404("No root node was registered, this usually happens if no module was installed.\n" .. - "Install luci-mod-admin-full and retry. " .. - "If the module is already installed, try removing the /tmp/luci-indexcache file.") - else - error404("No page is registered at '/" .. table.concat(lookup_ctx.request_path, "/") .. "'.\n" .. - "If this url belongs to an extension, make sure it is properly installed.\n" .. - "If the extension was recently installed, try removing the /tmp/luci-indexcache file.") - end - end -end - -local function hash_filelist(files) - local fprint = {} - local n = 0 - - for i, file in ipairs(files) do - local st = fs.stat(file) - if st then - fprint[n + 1] = '%x' % st.ino - fprint[n + 2] = '%x' % st.mtime - fprint[n + 3] = '%x' % st.size - n = n + 3 - end - end - - return nixio.crypt(table.concat(fprint, "|"), "$1$"):sub(5):gsub("/", ".") -end - -local function read_cachefile(file, reader) - local euid = sys.process.info("uid") - local fuid = fs.stat(file, "uid") - local mode = fs.stat(file, "modestr") - - if euid ~= fuid or mode ~= "rw-------" then - return nil - end - - return reader(file) -end - -function createindex() - local controllers = { } - local base = "%s/controller/" % util.libpath() - local _, path - - for path in (fs.glob("%s*.lua" % base) or function() end) do - controllers[#controllers+1] = path - end - - for path in (fs.glob("%s*/*.lua" % base) or function() end) do - controllers[#controllers+1] = path - end - - local cachefile - - if indexcache then - cachefile = "%s.%s.lua" %{ indexcache, hash_filelist(controllers) } - - local res = read_cachefile(cachefile, function(path) return loadfile(path)() end) - if res then - index = res - return res - end - - for file in (fs.glob("%s.*.lua" % indexcache) or function() end) do - fs.unlink(file) - end - end - - index = {} - - for _, path in ipairs(controllers) do - local modname = "luci.controller." .. path:sub(#base+1, #path-4):gsub("/", ".") - local mod = require(modname) - assert(mod ~= true, - "Invalid controller file found\n" .. - "The file '" .. path .. "' contains an invalid module line.\n" .. - "Please verify whether the module name is set to '" .. modname .. - "' - It must correspond to the file path!") - - local idx = mod.index - if type(idx) == "function" then - index[modname] = idx - end - end - - if cachefile then - local f = nixio.open(cachefile, "w", 600) - f:writeall(util.get_bytecode(index)) - f:close() - end -end - -function createtree_json() - local json = require "luci.jsonc" - local tree = {} - - local schema = { - action = "table", - auth = "table", - cors = "boolean", - depends = "table", - order = "number", - setgroup = "string", - setuser = "string", - title = "string", - wildcard = "boolean", - firstchild_ineligible = "boolean" - } - - local files = {} - local cachefile - - for file in (fs.glob("/usr/share/luci/menu.d/*.json") or function() end) do - files[#files+1] = file - end - - if indexcache then - cachefile = "%s.%s.json" %{ indexcache, hash_filelist(files) } - - local res = read_cachefile(cachefile, function(path) return json.parse(fs.readfile(path) or "") end) - if res then - return res - end - - for file in (fs.glob("%s.*.json" % indexcache) or function() end) do - fs.unlink(file) - end - end - - for _, file in ipairs(files) do - local data = json.parse(fs.readfile(file) or "") - if type(data) == "table" then - for path, spec in pairs(data) do - if type(spec) == "table" then - local node = tree - - for s in path:gmatch("[^/]+") do - if s == "*" then - node.wildcard = true - break - end - - node.children = node.children or {} - node.children[s] = node.children[s] or {} - node = node.children[s] - end - - if node ~= tree then - for k, t in pairs(schema) do - if type(spec[k]) == t then - node[k] = spec[k] - end - end - - node.satisfied = check_depends(spec) - end - end - end - end - end - - if cachefile then - local f = nixio.open(cachefile, "w", 600) - f:writeall(json.stringify(tree)) - f:close() - end - - return tree -end - --- Build the index before if it does not exist yet. -function createtree() - if not index then - createindex() - end - - local ctx = context - local tree = {nodes={}, inreq=true} - - ctx.treecache = setmetatable({}, {__mode="v"}) - ctx.tree = tree - - local scope = setmetatable({}, {__index = luci.dispatcher}) - - for k, v in pairs(index) do - scope._NAME = k - setfenv(v, scope) - v() - end - - return tree -end - -function assign(path, clone, title, order) - local obj = node(unpack(path)) - obj.nodes = nil - obj.module = nil - - obj.title = title - obj.order = order - - setmetatable(obj, {__index = _create_node(clone)}) - - return obj -end - -function entry(path, target, title, order) - local c = node(unpack(path)) - - c.target = target - c.title = title - c.order = order - c.module = getfenv(2)._NAME - - return c -end - --- enabling the node. -function get(...) - return _create_node({...}) -end - -function node(...) - local c = _create_node({...}) - - c.module = getfenv(2)._NAME - c.auto = nil - - return c -end - -function lookup(...) - local i, path = nil, {} - for i = 1, select('#', ...) do - local name, arg = nil, tostring(select(i, ...)) - for name in arg:gmatch("[^/]+") do - path[#path+1] = name - end - end - - for i = #path, 1, -1 do - local node = context.treecache[table.concat(path, ".", 1, i)] - if node and (i == #path or node.leaf) then - return node, build_url(unpack(path)) - end - end -end - -function _create_node(path) - if #path == 0 then - return context.tree - end - - local name = table.concat(path, ".") - local c = context.treecache[name] - - if not c then - local last = table.remove(path) - local parent = _create_node(path) - - c = {nodes={}, auto=true, inreq=true} - - parent.nodes[last] = c - context.treecache[name] = c - end - - return c -end - --- Subdispatchers -- - -function firstchild() - return { type = "firstchild" } -end - -function firstnode() - return { type = "firstnode" } -end - -function alias(...) - return { type = "alias", req = { ... } } -end - -function rewrite(n, ...) - return { type = "rewrite", n = n, req = { ... } } -end - -function call(name, ...) - return { type = "call", argv = {...}, name = name } -end - -function post_on(params, name, ...) - return { - type = "call", - post = params, - argv = { ... }, - name = name - } -end - -function post(...) - return post_on(true, ...) -end - - -function template(name) - return { type = "template", view = name } -end - -function view(name) - return { type = "view", view = name } -end - - -function _cbi(self, ...) - local cbi = require "luci.cbi" - local tpl = require "luci.template" - local http = require "luci.http" - local util = require "luci.util" - - local config = self.config or {} - local maps = cbi.load(self.model, ...) - - local state = nil - - local function has_uci_access(config, level) - local rv = util.ubus("session", "access", { - ubus_rpc_session = context.authsession, - scope = "uci", object = config, - ["function"] = level - }) - - return (type(rv) == "table" and rv.access == true) or false - end - - local i, res - for i, res in ipairs(maps) do - if util.instanceof(res, cbi.SimpleForm) then - io.stderr:write("Model %s returns SimpleForm but is dispatched via cbi(),\n" - % self.model) - - io.stderr:write("please change %s to use the form() action instead.\n" - % table.concat(context.request, "/")) - end - - res.flow = config - local cstate = res:parse() - if cstate and (not state or cstate < state) then - state = cstate - end - end - - local function _resolve_path(path) - return type(path) == "table" and build_url(unpack(path)) or path - end - - if config.on_valid_to and state and state > 0 and state < 2 then - http.redirect(_resolve_path(config.on_valid_to)) - return - end - - if config.on_changed_to and state and state > 1 then - http.redirect(_resolve_path(config.on_changed_to)) - return - end - - if config.on_success_to and state and state > 0 then - http.redirect(_resolve_path(config.on_success_to)) - return - end - - if config.state_handler then - if not config.state_handler(state, maps) then - return - end - end - - http.header("X-CBI-State", state or 0) - - if not config.noheader then - tpl.render("cbi/header", {state = state}) - end - - local redirect - local messages - local applymap = false - local pageaction = true - local parsechain = { } - local writable = false - - for i, res in ipairs(maps) do - if res.apply_needed and res.parsechain then - local c - for _, c in ipairs(res.parsechain) do - parsechain[#parsechain+1] = c - end - applymap = true - end - - if res.redirect then - redirect = redirect or res.redirect - end - - if res.pageaction == false then - pageaction = false - end - - if res.message then - messages = messages or { } - messages[#messages+1] = res.message - end - end - - for i, res in ipairs(maps) do - local is_readable_map = has_uci_access(res.config, "read") - local is_writable_map = has_uci_access(res.config, "write") - - writable = writable or is_writable_map - - res:render({ - firstmap = (i == 1), - redirect = redirect, - messages = messages, - pageaction = pageaction, - parsechain = parsechain, - readable = is_readable_map, - writable = is_writable_map - }) - end - - if not config.nofooter then - tpl.render("cbi/footer", { - flow = config, - pageaction = pageaction, - redirect = redirect, - state = state, - autoapply = config.autoapply, - trigger_apply = applymap, - writable = writable - }) - end -end - -function cbi(model, config) - return { - type = "cbi", - post = { ["cbi.submit"] = true }, - config = config, - model = model - } -end - - -function arcombine(trg1, trg2) - return { - type = "arcombine", - env = getfenv(), - targets = {trg1, trg2} - } -end - - -function _form(self, ...) - local cbi = require "luci.cbi" - local tpl = require "luci.template" - local http = require "luci.http" - - local maps = luci.cbi.load(self.model, ...) - local state = nil - - local i, res - for i, res in ipairs(maps) do - local cstate = res:parse() - if cstate and (not state or cstate < state) then - state = cstate - end - end - - http.header("X-CBI-State", state or 0) - tpl.render("header") - for i, res in ipairs(maps) do - res:render() - end - tpl.render("footer") -end - -function form(model) - return { - type = "form", - post = { ["cbi.submit"] = true }, - model = model - } -end - -translate = i18n.translate - --- This function does not actually translate the given argument but --- is used by build/i18n-scan.pl to find translatable entries. -function _(text) - return text -end diff --git a/package/luci/modules/luci-base/luasrc/dispatcher.luadoc b/package/luci/modules/luci-base/luasrc/dispatcher.luadoc deleted file mode 100644 index a77f8d8b07..0000000000 --- a/package/luci/modules/luci-base/luasrc/dispatcher.luadoc +++ /dev/null @@ -1,220 +0,0 @@ ----[[ -LuCI web dispatcher. -]] -module "luci.dispatcher" - ----[[ -Build the URL relative to the server webroot from given virtual path. - -@class function -@name build_url -@param ... Virtual path -@return Relative URL -]] - ----[[ -Check whether a dispatch node shall be visible - -@class function -@name node_visible -@param node Dispatch node -@return Boolean indicating whether the node should be visible -]] - ----[[ -Return a sorted table of visible children within a given node - -@class function -@name node_childs -@param node Dispatch node -@return Ordered table of child node names -]] - ----[[ -Send a 404 error code and render the "error404" template if available. - -@class function -@name error404 -@param message Custom error message (optional) -@return false -]] - ----[[ -Send a 500 error code and render the "error500" template if available. - -@class function -@name error500 -@param message Custom error message (optional)# -@return false -]] - ----[[ -Dispatch an HTTP request. - -@class function -@name httpdispatch -@param request LuCI HTTP Request object -]] - ----[[ -Dispatches a LuCI virtual path. - -@class function -@name dispatch -@param request Virtual path -]] - ----[[ -Generate the dispatching index using the native file-cache based strategy. - - -@class function -@name createindex -]] - ----[[ -Create the dispatching tree from the index. - -Build the index before if it does not exist yet. - -@class function -@name createtree -]] - ----[[ -Clone a node of the dispatching tree to another position. - -@class function -@name assign -@param path Virtual path destination -@param clone Virtual path source -@param title Destination node title (optional) -@param order Destination node order value (optional) -@return Dispatching tree node -]] - ----[[ -Create a new dispatching node and define common parameters. - -@class function -@name entry -@param path Virtual path -@param target Target function to call when dispatched. -@param title Destination node title -@param order Destination node order value (optional) -@return Dispatching tree node -]] - ----[[ -Fetch or create a dispatching node without setting the target module or -enabling the node. - -@class function -@name get -@param ... Virtual path -@return Dispatching tree node -]] - ----[[ -Fetch or create a new dispatching node. - -@class function -@name node -@param ... Virtual path -@return Dispatching tree node -]] - ----[[ -Lookup node in dispatching tree. - -@class function -@name lookup -@param ... Virtual path -@return Node object, canonical url or nil if the path was not found. -]] - ----[[ -Alias the first (lowest order) page automatically - - -@class function -@name firstchild -]] - ----[[ -Create a redirect to another dispatching node. - -@class function -@name alias -@param ... Virtual path destination -]] - ----[[ -Rewrite the first x path values of the request. - -@class function -@name rewrite -@param n Number of path values to replace -@param ... Virtual path to replace removed path values with -]] - ----[[ -Create a function-call dispatching target. - -@class function -@name call -@param name Target function of local controller -@param ... Additional parameters passed to the function -]] - ----[[ -Create a template render dispatching target. - -@class function -@name template -@param name Template to be rendered -]] - ----[[ -Create a CBI model dispatching target. - -@class function -@name cbi -@param model CBI model to be rendered -]] - ----[[ -Create a combined dispatching target for non argv and argv requests. - -@class function -@name arcombine -@param trg1 Overview Target -@param trg2 Detail Target -]] - ----[[ -Create a CBI form model dispatching target. - -@class function -@name form -@param model CBI form model tpo be rendered -]] - ----[[ -Access the luci.i18n translate() api. - -@class function -@name translate -@param text Text to translate -]] - ----[[ -No-op function used to mark translation entries for menu labels. - -This function does not actually translate the given argument but -is used by build/i18n-scan.pl to find translatable entries. - -@class function -@name _ -]] - diff --git a/package/luci/modules/luci-base/luasrc/sgi/cgi.lua b/package/luci/modules/luci-base/luasrc/sgi/cgi.lua deleted file mode 100644 index 400db4710d..0000000000 --- a/package/luci/modules/luci-base/luasrc/sgi/cgi.lua +++ /dev/null @@ -1,73 +0,0 @@ --- Copyright 2008 Steven Barth --- Licensed to the public under the Apache License 2.0. - -exectime = os.clock() -module("luci.sgi.cgi", package.seeall) -local ltn12 = require("luci.ltn12") -require("nixio.util") -require("luci.http") -require("luci.sys") -require("luci.dispatcher") - --- Limited source to avoid endless blocking -local function limitsource(handle, limit) - limit = limit or 0 - local BLOCKSIZE = ltn12.BLOCKSIZE - - return function() - if limit < 1 then - handle:close() - return nil - else - local read = (limit > BLOCKSIZE) and BLOCKSIZE or limit - limit = limit - read - - local chunk = handle:read(read) - if not chunk then handle:close() end - return chunk - end - end -end - -function run() - local r = luci.http.Request( - luci.sys.getenv(), - limitsource(io.stdin, tonumber(luci.sys.getenv("CONTENT_LENGTH"))), - ltn12.sink.file(io.stderr) - ) - - local x = coroutine.create(luci.dispatcher.httpdispatch) - local hcache = "" - local active = true - - while coroutine.status(x) ~= "dead" do - local res, id, data1, data2 = coroutine.resume(x, r) - - if not res then - print("Status: 500 Internal Server Error") - print("Content-Type: text/plain\n") - print(id) - break; - end - - if active then - if id == 1 then - io.write("Status: " .. tostring(data1) .. " " .. data2 .. "\r\n") - elseif id == 2 then - hcache = hcache .. data1 .. ": " .. data2 .. "\r\n" - elseif id == 3 then - io.write(hcache) - io.write("\r\n") - elseif id == 4 then - io.write(tostring(data1 or "")) - elseif id == 5 then - io.flush() - io.close() - active = false - elseif id == 6 then - data1:copyz(nixio.stdout, data2) - data1:close() - end - end - end -end diff --git a/package/luci/modules/luci-base/luasrc/sgi/uhttpd.lua b/package/luci/modules/luci-base/luasrc/sgi/uhttpd.lua deleted file mode 100644 index 4cd3649c62..0000000000 --- a/package/luci/modules/luci-base/luasrc/sgi/uhttpd.lua +++ /dev/null @@ -1,99 +0,0 @@ --- Copyright 2010 Jo-Philipp Wich --- Licensed to the public under the Apache License 2.0. - -require "nixio.util" -require "luci.http" -require "luci.sys" -require "luci.dispatcher" -require "luci.ltn12" - -function handle_request(env) - exectime = os.clock() - local renv = { - CONTENT_LENGTH = env.CONTENT_LENGTH, - CONTENT_TYPE = env.CONTENT_TYPE, - REQUEST_METHOD = env.REQUEST_METHOD, - REQUEST_URI = env.REQUEST_URI, - PATH_INFO = env.PATH_INFO, - SCRIPT_NAME = env.SCRIPT_NAME:gsub("/+$", ""), - SCRIPT_FILENAME = env.SCRIPT_NAME, - SERVER_PROTOCOL = env.SERVER_PROTOCOL, - QUERY_STRING = env.QUERY_STRING, - DOCUMENT_ROOT = env.DOCUMENT_ROOT, - HTTPS = env.HTTPS, - REDIRECT_STATUS = env.REDIRECT_STATUS, - REMOTE_ADDR = env.REMOTE_ADDR, - REMOTE_NAME = env.REMOTE_NAME, - REMOTE_PORT = env.REMOTE_PORT, - REMOTE_USER = env.REMOTE_USER, - SERVER_ADDR = env.SERVER_ADDR, - SERVER_NAME = env.SERVER_NAME, - SERVER_PORT = env.SERVER_PORT - } - - local k, v - for k, v in pairs(env.headers) do - k = k:upper():gsub("%-", "_") - renv["HTTP_" .. k] = v - end - - local len = tonumber(env.CONTENT_LENGTH) or 0 - local function recv() - if len > 0 then - local rlen, rbuf = uhttpd.recv(4096) - if rlen >= 0 then - len = len - rlen - return rbuf - end - end - return nil - end - - local send = uhttpd.send - - local req = luci.http.Request( - renv, recv, luci.ltn12.sink.file(io.stderr) - ) - - - local x = coroutine.create(luci.dispatcher.httpdispatch) - local hcache = { } - local active = true - - while coroutine.status(x) ~= "dead" do - local res, id, data1, data2 = coroutine.resume(x, req) - - if not res then - send("Status: 500 Internal Server Error\r\n") - send("Content-Type: text/plain\r\n\r\n") - send(tostring(id)) - break - end - - if active then - if id == 1 then - send("Status: ") - send(tostring(data1)) - send(" ") - send(tostring(data2)) - send("\r\n") - elseif id == 2 then - hcache[data1] = data2 - elseif id == 3 then - for k, v in pairs(hcache) do - send(tostring(k)) - send(": ") - send(tostring(v)) - send("\r\n") - end - send("\r\n") - elseif id == 4 then - send(tostring(data1 or "")) - elseif id == 5 then - active = false - elseif id == 6 then - data1:copyz(nixio.stdout, data2) - end - end - end -end diff --git a/package/luci/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua b/package/luci/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua deleted file mode 100644 index f0397a9853..0000000000 --- a/package/luci/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua +++ /dev/null @@ -1,452 +0,0 @@ --- Licensed to the public under the Apache License 2.0. - -module "luci.sys.zoneinfo.tzdata" - -TZ = { - { 'Africa/Abidjan', 'GMT0' }, - { 'Africa/Accra', 'GMT0' }, - { 'Africa/Addis Ababa', 'EAT-3' }, - { 'Africa/Algiers', 'CET-1' }, - { 'Africa/Asmara', 'EAT-3' }, - { 'Africa/Bamako', 'GMT0' }, - { 'Africa/Bangui', 'WAT-1' }, - { 'Africa/Banjul', 'GMT0' }, - { 'Africa/Bissau', 'GMT0' }, - { 'Africa/Blantyre', 'CAT-2' }, - { 'Africa/Brazzaville', 'WAT-1' }, - { 'Africa/Bujumbura', 'CAT-2' }, - { 'Africa/Cairo', 'EET-2' }, - { 'Africa/Casablanca', '<+01>-1' }, - { 'Africa/Ceuta', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Africa/Conakry', 'GMT0' }, - { 'Africa/Dakar', 'GMT0' }, - { 'Africa/Dar es Salaam', 'EAT-3' }, - { 'Africa/Djibouti', 'EAT-3' }, - { 'Africa/Douala', 'WAT-1' }, - { 'Africa/El Aaiun', '<+01>-1' }, - { 'Africa/Freetown', 'GMT0' }, - { 'Africa/Gaborone', 'CAT-2' }, - { 'Africa/Harare', 'CAT-2' }, - { 'Africa/Johannesburg', 'SAST-2' }, - { 'Africa/Juba', 'CAT-2' }, - { 'Africa/Kampala', 'EAT-3' }, - { 'Africa/Khartoum', 'CAT-2' }, - { 'Africa/Kigali', 'CAT-2' }, - { 'Africa/Kinshasa', 'WAT-1' }, - { 'Africa/Lagos', 'WAT-1' }, - { 'Africa/Libreville', 'WAT-1' }, - { 'Africa/Lome', 'GMT0' }, - { 'Africa/Luanda', 'WAT-1' }, - { 'Africa/Lubumbashi', 'CAT-2' }, - { 'Africa/Lusaka', 'CAT-2' }, - { 'Africa/Malabo', 'WAT-1' }, - { 'Africa/Maputo', 'CAT-2' }, - { 'Africa/Maseru', 'SAST-2' }, - { 'Africa/Mbabane', 'SAST-2' }, - { 'Africa/Mogadishu', 'EAT-3' }, - { 'Africa/Monrovia', 'GMT0' }, - { 'Africa/Nairobi', 'EAT-3' }, - { 'Africa/Ndjamena', 'WAT-1' }, - { 'Africa/Niamey', 'WAT-1' }, - { 'Africa/Nouakchott', 'GMT0' }, - { 'Africa/Ouagadougou', 'GMT0' }, - { 'Africa/Porto-Novo', 'WAT-1' }, - { 'Africa/Sao Tome', 'GMT0' }, - { 'Africa/Tripoli', 'EET-2' }, - { 'Africa/Tunis', 'CET-1' }, - { 'Africa/Windhoek', 'CAT-2' }, - { 'America/Adak', 'HST10HDT,M3.2.0,M11.1.0' }, - { 'America/Anchorage', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/Anguilla', 'AST4' }, - { 'America/Antigua', 'AST4' }, - { 'America/Araguaina', '<-03>3' }, - { 'America/Argentina/Buenos Aires', '<-03>3' }, - { 'America/Argentina/Catamarca', '<-03>3' }, - { 'America/Argentina/Cordoba', '<-03>3' }, - { 'America/Argentina/Jujuy', '<-03>3' }, - { 'America/Argentina/La Rioja', '<-03>3' }, - { 'America/Argentina/Mendoza', '<-03>3' }, - { 'America/Argentina/Rio Gallegos', '<-03>3' }, - { 'America/Argentina/Salta', '<-03>3' }, - { 'America/Argentina/San Juan', '<-03>3' }, - { 'America/Argentina/San Luis', '<-03>3' }, - { 'America/Argentina/Tucuman', '<-03>3' }, - { 'America/Argentina/Ushuaia', '<-03>3' }, - { 'America/Aruba', 'AST4' }, - { 'America/Asuncion', '<-04>4<-03>,M10.1.0/0,M3.4.0/0' }, - { 'America/Atikokan', 'EST5' }, - { 'America/Bahia', '<-03>3' }, - { 'America/Bahia Banderas', 'CST6' }, - { 'America/Barbados', 'AST4' }, - { 'America/Belem', '<-03>3' }, - { 'America/Belize', 'CST6' }, - { 'America/Blanc-Sablon', 'AST4' }, - { 'America/Boa Vista', '<-04>4' }, - { 'America/Bogota', '<-05>5' }, - { 'America/Boise', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Cambridge Bay', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Campo Grande', '<-04>4' }, - { 'America/Cancun', 'EST5' }, - { 'America/Caracas', '<-04>4' }, - { 'America/Cayenne', '<-03>3' }, - { 'America/Cayman', 'EST5' }, - { 'America/Chicago', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Chihuahua', 'CST6' }, - { 'America/Ciudad Juarez', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Costa Rica', 'CST6' }, - { 'America/Creston', 'MST7' }, - { 'America/Cuiaba', '<-04>4' }, - { 'America/Curacao', 'AST4' }, - { 'America/Danmarkshavn', 'GMT0' }, - { 'America/Dawson', 'MST7' }, - { 'America/Dawson Creek', 'MST7' }, - { 'America/Denver', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Detroit', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Dominica', 'AST4' }, - { 'America/Edmonton', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Eirunepe', '<-05>5' }, - { 'America/El Salvador', 'CST6' }, - { 'America/Fort Nelson', 'MST7' }, - { 'America/Fortaleza', '<-03>3' }, - { 'America/Glace Bay', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'America/Goose Bay', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'America/Grand Turk', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Grenada', 'AST4' }, - { 'America/Guadeloupe', 'AST4' }, - { 'America/Guatemala', 'CST6' }, - { 'America/Guayaquil', '<-05>5' }, - { 'America/Guyana', '<-04>4' }, - { 'America/Halifax', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'America/Havana', 'CST5CDT,M3.2.0/0,M11.1.0/1' }, - { 'America/Hermosillo', 'MST7' }, - { 'America/Indiana/Indianapolis', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Knox', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Marengo', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Petersburg', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Tell City', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Vevay', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Vincennes', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Winamac', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Inuvik', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Iqaluit', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Jamaica', 'EST5' }, - { 'America/Juneau', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/Kentucky/Louisville', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Kentucky/Monticello', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Kralendijk', 'AST4' }, - { 'America/La Paz', '<-04>4' }, - { 'America/Lima', '<-05>5' }, - { 'America/Los Angeles', 'PST8PDT,M3.2.0,M11.1.0' }, - { 'America/Lower Princes', 'AST4' }, - { 'America/Maceio', '<-03>3' }, - { 'America/Managua', 'CST6' }, - { 'America/Manaus', '<-04>4' }, - { 'America/Marigot', 'AST4' }, - { 'America/Martinique', 'AST4' }, - { 'America/Matamoros', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Mazatlan', 'MST7' }, - { 'America/Menominee', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Merida', 'CST6' }, - { 'America/Metlakatla', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/Mexico City', 'CST6' }, - { 'America/Miquelon', '<-03>3<-02>,M3.2.0,M11.1.0' }, - { 'America/Moncton', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'America/Monterrey', 'CST6' }, - { 'America/Montevideo', '<-03>3' }, - { 'America/Montserrat', 'AST4' }, - { 'America/Nassau', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/New York', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Nome', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/Noronha', '<-02>2' }, - { 'America/North Dakota/Beulah', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/North Dakota/Center', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/North Dakota/New Salem', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Nuuk', '<-02>2' }, - { 'America/Ojinaga', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Panama', 'EST5' }, - { 'America/Paramaribo', '<-03>3' }, - { 'America/Phoenix', 'MST7' }, - { 'America/Port of Spain', 'AST4' }, - { 'America/Port-au-Prince', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Porto Velho', '<-04>4' }, - { 'America/Puerto Rico', 'AST4' }, - { 'America/Punta Arenas', '<-03>3' }, - { 'America/Rankin Inlet', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Recife', '<-03>3' }, - { 'America/Regina', 'CST6' }, - { 'America/Resolute', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Rio Branco', '<-05>5' }, - { 'America/Santarem', '<-03>3' }, - { 'America/Santiago', '<-04>4<-03>,M9.1.6/24,M4.1.6/24' }, - { 'America/Santo Domingo', 'AST4' }, - { 'America/Sao Paulo', '<-03>3' }, - { 'America/Scoresbysund', '<-01>1<+00>,M3.5.0/0,M10.5.0/1' }, - { 'America/Sitka', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/St Barthelemy', 'AST4' }, - { 'America/St Johns', 'NST3:30NDT,M3.2.0,M11.1.0' }, - { 'America/St Kitts', 'AST4' }, - { 'America/St Lucia', 'AST4' }, - { 'America/St Thomas', 'AST4' }, - { 'America/St Vincent', 'AST4' }, - { 'America/Swift Current', 'CST6' }, - { 'America/Tegucigalpa', 'CST6' }, - { 'America/Thule', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'America/Tijuana', 'PST8PDT,M3.2.0,M11.1.0' }, - { 'America/Toronto', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Tortola', 'AST4' }, - { 'America/Vancouver', 'PST8PDT,M3.2.0,M11.1.0' }, - { 'America/Whitehorse', 'MST7' }, - { 'America/Winnipeg', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Yakutat', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/Yellowknife', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'Antarctica/Casey', '<+11>-11' }, - { 'Antarctica/Davis', '<+07>-7' }, - { 'Antarctica/DumontDUrville', '<+10>-10' }, - { 'Antarctica/Macquarie', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, - { 'Antarctica/Mawson', '<+05>-5' }, - { 'Antarctica/McMurdo', 'NZST-12NZDT,M9.5.0,M4.1.0/3' }, - { 'Antarctica/Palmer', '<-03>3' }, - { 'Antarctica/Rothera', '<-03>3' }, - { 'Antarctica/Syowa', '<+03>-3' }, - { 'Antarctica/Troll', '<+00>0<+02>-2,M3.5.0/1,M10.5.0/3' }, - { 'Antarctica/Vostok', '<+06>-6' }, - { 'Arctic/Longyearbyen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Asia/Aden', '<+03>-3' }, - { 'Asia/Almaty', '<+06>-6' }, - { 'Asia/Amman', '<+03>-3' }, - { 'Asia/Anadyr', '<+12>-12' }, - { 'Asia/Aqtau', '<+05>-5' }, - { 'Asia/Aqtobe', '<+05>-5' }, - { 'Asia/Ashgabat', '<+05>-5' }, - { 'Asia/Atyrau', '<+05>-5' }, - { 'Asia/Baghdad', '<+03>-3' }, - { 'Asia/Bahrain', '<+03>-3' }, - { 'Asia/Baku', '<+04>-4' }, - { 'Asia/Bangkok', '<+07>-7' }, - { 'Asia/Barnaul', '<+07>-7' }, - { 'Asia/Beirut', 'EET-2EEST,M3.5.0/0,M10.5.0/0' }, - { 'Asia/Bishkek', '<+06>-6' }, - { 'Asia/Brunei', '<+08>-8' }, - { 'Asia/Chita', '<+09>-9' }, - { 'Asia/Choibalsan', '<+08>-8' }, - { 'Asia/Colombo', '<+0530>-5:30' }, - { 'Asia/Damascus', '<+03>-3' }, - { 'Asia/Dhaka', '<+06>-6' }, - { 'Asia/Dili', '<+09>-9' }, - { 'Asia/Dubai', '<+04>-4' }, - { 'Asia/Dushanbe', '<+05>-5' }, - { 'Asia/Famagusta', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Asia/Gaza', 'EET-2EEST,M3.4.4/50,M10.4.4/50' }, - { 'Asia/Hebron', 'EET-2EEST,M3.4.4/50,M10.4.4/50' }, - { 'Asia/Ho Chi Minh', '<+07>-7' }, - { 'Asia/Hong Kong', 'HKT-8' }, - { 'Asia/Hovd', '<+07>-7' }, - { 'Asia/Irkutsk', '<+08>-8' }, - { 'Asia/Jakarta', 'WIB-7' }, - { 'Asia/Jayapura', 'WIT-9' }, - { 'Asia/Jerusalem', 'IST-2IDT,M3.4.4/26,M10.5.0' }, - { 'Asia/Kabul', '<+0430>-4:30' }, - { 'Asia/Kamchatka', '<+12>-12' }, - { 'Asia/Karachi', 'PKT-5' }, - { 'Asia/Kathmandu', '<+0545>-5:45' }, - { 'Asia/Khandyga', '<+09>-9' }, - { 'Asia/Kolkata', 'IST-5:30' }, - { 'Asia/Krasnoyarsk', '<+07>-7' }, - { 'Asia/Kuala Lumpur', '<+08>-8' }, - { 'Asia/Kuching', '<+08>-8' }, - { 'Asia/Kuwait', '<+03>-3' }, - { 'Asia/Macau', 'CST-8' }, - { 'Asia/Magadan', '<+11>-11' }, - { 'Asia/Makassar', 'WITA-8' }, - { 'Asia/Manila', 'PST-8' }, - { 'Asia/Muscat', '<+04>-4' }, - { 'Asia/Nicosia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Asia/Novokuznetsk', '<+07>-7' }, - { 'Asia/Novosibirsk', '<+07>-7' }, - { 'Asia/Omsk', '<+06>-6' }, - { 'Asia/Oral', '<+05>-5' }, - { 'Asia/Phnom Penh', '<+07>-7' }, - { 'Asia/Pontianak', 'WIB-7' }, - { 'Asia/Pyongyang', 'KST-9' }, - { 'Asia/Qatar', '<+03>-3' }, - { 'Asia/Qostanay', '<+06>-6' }, - { 'Asia/Qyzylorda', '<+05>-5' }, - { 'Asia/Riyadh', '<+03>-3' }, - { 'Asia/Sakhalin', '<+11>-11' }, - { 'Asia/Samarkand', '<+05>-5' }, - { 'Asia/Seoul', 'KST-9' }, - { 'Asia/Shanghai', 'CST-8' }, - { 'Asia/Singapore', '<+08>-8' }, - { 'Asia/Srednekolymsk', '<+11>-11' }, - { 'Asia/Taipei', 'CST-8' }, - { 'Asia/Tashkent', '<+05>-5' }, - { 'Asia/Tbilisi', '<+04>-4' }, - { 'Asia/Tehran', '<+0330>-3:30' }, - { 'Asia/Thimphu', '<+06>-6' }, - { 'Asia/Tokyo', 'JST-9' }, - { 'Asia/Tomsk', '<+07>-7' }, - { 'Asia/Ulaanbaatar', '<+08>-8' }, - { 'Asia/Urumqi', '<+06>-6' }, - { 'Asia/Ust-Nera', '<+10>-10' }, - { 'Asia/Vientiane', '<+07>-7' }, - { 'Asia/Vladivostok', '<+10>-10' }, - { 'Asia/Yakutsk', '<+09>-9' }, - { 'Asia/Yangon', '<+0630>-6:30' }, - { 'Asia/Yekaterinburg', '<+05>-5' }, - { 'Asia/Yerevan', '<+04>-4' }, - { 'Atlantic/Azores', '<-01>1<+00>,M3.5.0/0,M10.5.0/1' }, - { 'Atlantic/Bermuda', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'Atlantic/Canary', 'WET0WEST,M3.5.0/1,M10.5.0' }, - { 'Atlantic/Cape Verde', '<-01>1' }, - { 'Atlantic/Faroe', 'WET0WEST,M3.5.0/1,M10.5.0' }, - { 'Atlantic/Madeira', 'WET0WEST,M3.5.0/1,M10.5.0' }, - { 'Atlantic/Reykjavik', 'GMT0' }, - { 'Atlantic/South Georgia', '<-02>2' }, - { 'Atlantic/St Helena', 'GMT0' }, - { 'Atlantic/Stanley', '<-03>3' }, - { 'Australia/Adelaide', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' }, - { 'Australia/Brisbane', 'AEST-10' }, - { 'Australia/Broken Hill', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' }, - { 'Australia/Darwin', 'ACST-9:30' }, - { 'Australia/Eucla', '<+0845>-8:45' }, - { 'Australia/Hobart', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, - { 'Australia/Lindeman', 'AEST-10' }, - { 'Australia/Lord Howe', '<+1030>-10:30<+11>-11,M10.1.0,M4.1.0' }, - { 'Australia/Melbourne', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, - { 'Australia/Perth', 'AWST-8' }, - { 'Australia/Sydney', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, - { 'Etc/GMT', 'GMT0' }, - { 'Etc/GMT+1', '<-01>1' }, - { 'Etc/GMT+10', '<-10>10' }, - { 'Etc/GMT+11', '<-11>11' }, - { 'Etc/GMT+12', '<-12>12' }, - { 'Etc/GMT+2', '<-02>2' }, - { 'Etc/GMT+3', '<-03>3' }, - { 'Etc/GMT+4', '<-04>4' }, - { 'Etc/GMT+5', '<-05>5' }, - { 'Etc/GMT+6', '<-06>6' }, - { 'Etc/GMT+7', '<-07>7' }, - { 'Etc/GMT+8', '<-08>8' }, - { 'Etc/GMT+9', '<-09>9' }, - { 'Etc/GMT-1', '<+01>-1' }, - { 'Etc/GMT-10', '<+10>-10' }, - { 'Etc/GMT-11', '<+11>-11' }, - { 'Etc/GMT-12', '<+12>-12' }, - { 'Etc/GMT-13', '<+13>-13' }, - { 'Etc/GMT-14', '<+14>-14' }, - { 'Etc/GMT-2', '<+02>-2' }, - { 'Etc/GMT-3', '<+03>-3' }, - { 'Etc/GMT-4', '<+04>-4' }, - { 'Etc/GMT-5', '<+05>-5' }, - { 'Etc/GMT-6', '<+06>-6' }, - { 'Etc/GMT-7', '<+07>-7' }, - { 'Etc/GMT-8', '<+08>-8' }, - { 'Etc/GMT-9', '<+09>-9' }, - { 'Europe/Amsterdam', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Andorra', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Astrakhan', '<+04>-4' }, - { 'Europe/Athens', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Belgrade', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Berlin', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Bratislava', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Brussels', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Bucharest', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Budapest', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Busingen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Chisinau', 'EET-2EEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Copenhagen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Dublin', 'IST-1GMT0,M10.5.0,M3.5.0/1' }, - { 'Europe/Gibraltar', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Guernsey', 'GMT0BST,M3.5.0/1,M10.5.0' }, - { 'Europe/Helsinki', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Isle of Man', 'GMT0BST,M3.5.0/1,M10.5.0' }, - { 'Europe/Istanbul', '<+03>-3' }, - { 'Europe/Jersey', 'GMT0BST,M3.5.0/1,M10.5.0' }, - { 'Europe/Kaliningrad', 'EET-2' }, - { 'Europe/Kirov', '<+03>-3' }, - { 'Europe/Kyiv', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Lisbon', 'WET0WEST,M3.5.0/1,M10.5.0' }, - { 'Europe/Ljubljana', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/London', 'GMT0BST,M3.5.0/1,M10.5.0' }, - { 'Europe/Luxembourg', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Madrid', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Malta', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Mariehamn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Minsk', '<+03>-3' }, - { 'Europe/Monaco', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Moscow', 'MSK-3' }, - { 'Europe/Oslo', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Paris', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Podgorica', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Prague', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Riga', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Rome', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Samara', '<+04>-4' }, - { 'Europe/San Marino', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Sarajevo', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Saratov', '<+04>-4' }, - { 'Europe/Simferopol', 'MSK-3' }, - { 'Europe/Skopje', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Sofia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Stockholm', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Tallinn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Tirane', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Ulyanovsk', '<+04>-4' }, - { 'Europe/Vaduz', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Vatican', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Vienna', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Vilnius', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Volgograd', '<+03>-3' }, - { 'Europe/Warsaw', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Zagreb', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Zurich', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Indian/Antananarivo', 'EAT-3' }, - { 'Indian/Chagos', '<+06>-6' }, - { 'Indian/Christmas', '<+07>-7' }, - { 'Indian/Cocos', '<+0630>-6:30' }, - { 'Indian/Comoro', 'EAT-3' }, - { 'Indian/Kerguelen', '<+05>-5' }, - { 'Indian/Mahe', '<+04>-4' }, - { 'Indian/Maldives', '<+05>-5' }, - { 'Indian/Mauritius', '<+04>-4' }, - { 'Indian/Mayotte', 'EAT-3' }, - { 'Indian/Reunion', '<+04>-4' }, - { 'Pacific/Apia', '<+13>-13' }, - { 'Pacific/Auckland', 'NZST-12NZDT,M9.5.0,M4.1.0/3' }, - { 'Pacific/Bougainville', '<+11>-11' }, - { 'Pacific/Chatham', '<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45' }, - { 'Pacific/Chuuk', '<+10>-10' }, - { 'Pacific/Easter', '<-06>6<-05>,M9.1.6/22,M4.1.6/22' }, - { 'Pacific/Efate', '<+11>-11' }, - { 'Pacific/Fakaofo', '<+13>-13' }, - { 'Pacific/Fiji', '<+12>-12' }, - { 'Pacific/Funafuti', '<+12>-12' }, - { 'Pacific/Galapagos', '<-06>6' }, - { 'Pacific/Gambier', '<-09>9' }, - { 'Pacific/Guadalcanal', '<+11>-11' }, - { 'Pacific/Guam', 'ChST-10' }, - { 'Pacific/Honolulu', 'HST10' }, - { 'Pacific/Kanton', '<+13>-13' }, - { 'Pacific/Kiritimati', '<+14>-14' }, - { 'Pacific/Kosrae', '<+11>-11' }, - { 'Pacific/Kwajalein', '<+12>-12' }, - { 'Pacific/Majuro', '<+12>-12' }, - { 'Pacific/Marquesas', '<-0930>9:30' }, - { 'Pacific/Midway', 'SST11' }, - { 'Pacific/Nauru', '<+12>-12' }, - { 'Pacific/Niue', '<-11>11' }, - { 'Pacific/Norfolk', '<+11>-11<+12>,M10.1.0,M4.1.0/3' }, - { 'Pacific/Noumea', '<+11>-11' }, - { 'Pacific/Pago Pago', 'SST11' }, - { 'Pacific/Palau', '<+09>-9' }, - { 'Pacific/Pitcairn', '<-08>8' }, - { 'Pacific/Pohnpei', '<+11>-11' }, - { 'Pacific/Port Moresby', '<+10>-10' }, - { 'Pacific/Rarotonga', '<-10>10' }, - { 'Pacific/Saipan', 'ChST-10' }, - { 'Pacific/Tahiti', '<-10>10' }, - { 'Pacific/Tarawa', '<+12>-12' }, - { 'Pacific/Tongatapu', '<+13>-13' }, - { 'Pacific/Wake', '<+12>-12' }, - { 'Pacific/Wallis', '<+12>-12' }, -} diff --git a/package/luci/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua b/package/luci/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua deleted file mode 100644 index 80bea8416e..0000000000 --- a/package/luci/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua +++ /dev/null @@ -1,45 +0,0 @@ --- Licensed to the public under the Apache License 2.0. - -module "luci.sys.zoneinfo.tzoffset" - -OFFSET = { - gmt = 0, -- GMT - eat = 10800, -- EAT - cet = 3600, -- CET - wat = 3600, -- WAT - cat = 7200, -- CAT - eet = 7200, -- EET - sast = 7200, -- SAST - hst = -36000, -- HST - hdt = -32400, -- HDT - akst = -32400, -- AKST - akdt = -28800, -- AKDT - ast = -14400, -- AST - est = -18000, -- EST - cst = -21600, -- CST - mst = -25200, -- MST - mdt = -21600, -- MDT - pst = -28800, -- PST - pdt = -25200, -- PDT - nst = -12600, -- NST - ndt = -9000, -- NDT - aest = 36000, -- AEST - aedt = 39600, -- AEDT - nzst = 43200, -- NZST - nzdt = 46800, -- NZDT - hkt = 28800, -- HKT - wib = 25200, -- WIB - wit = 32400, -- WIT - ist = 7200, -- IST - idt = 10800, -- IDT - pkt = 18000, -- PKT - wita = 28800, -- WITA - kst = 32400, -- KST - jst = 32400, -- JST - wet = 0, -- WET - acst = 34200, -- ACST - acdt = 37800, -- ACDT - awst = 28800, -- AWST - msk = 10800, -- MSK - sst = -39600, -- SST -} diff --git a/package/luci/modules/luci-base/luasrc/template.lua b/package/luci/modules/luci-base/luasrc/template.lua deleted file mode 100644 index 3955bd76f3..0000000000 --- a/package/luci/modules/luci-base/luasrc/template.lua +++ /dev/null @@ -1,100 +0,0 @@ --- Copyright 2008 Steven Barth --- Licensed to the public under the Apache License 2.0. - -local util = require "luci.util" -local config = require "luci.config" -local tparser = require "luci.template.parser" - -local tostring, pairs, loadstring = tostring, pairs, loadstring -local setmetatable, loadfile = setmetatable, loadfile -local getfenv, setfenv, rawget = getfenv, setfenv, rawget -local assert, type, error = assert, type, error - ---- LuCI template library. -module "luci.template" - -config.template = config.template or {} -viewdir = config.template.viewdir or util.libpath() .. "/view" - - --- Define the namespace for template modules -context = util.threadlocal() - ---- Render a certain template. --- @param name Template name --- @param scope Scope to assign to template (optional) -function render(name, scope) - return Template(name):render(scope or getfenv(2)) -end - ---- Render a template from a string. --- @param template Template string --- @param scope Scope to assign to template (optional) -function render_string(template, scope) - return Template(nil, template):render(scope or getfenv(2)) -end - - --- Template class -Template = util.class() - --- Shared template cache to store templates in to avoid unnecessary reloading -Template.cache = setmetatable({}, {__mode = "v"}) - - --- Constructor - Reads and compiles the template on-demand -function Template.__init__(self, name, template) - if name then - self.template = self.cache[name] - self.name = name - else - self.name = "[string]" - end - - -- Create a new namespace for this template - self.viewns = context.viewns - - -- If we have a cached template, skip compiling and loading - if not self.template then - - -- Compile template - local err - local sourcefile - - if name then - sourcefile = viewdir .. "/" .. name .. ".htm" - self.template, _, err = tparser.parse(sourcefile) - else - sourcefile = "[string]" - self.template, _, err = tparser.parse_string(template) - end - - -- If we have no valid template throw error, otherwise cache the template - if not self.template then - error("Failed to load template '" .. self.name .. "'.\n" .. - "Error while parsing template '" .. sourcefile .. "':\n" .. - (err or "Unknown syntax error")) - elseif name then - self.cache[name] = self.template - end - end -end - - --- Renders a template -function Template.render(self, scope) - scope = scope or getfenv(2) - - -- Put our predefined objects in the scope of the template - setfenv(self.template, setmetatable({}, {__index = - function(tbl, key) - return rawget(tbl, key) or self.viewns[key] or scope[key] - end})) - - -- Now finally render the thing - local stat, err = util.copcall(self.template) - if not stat then - error("Failed to execute template '" .. self.name .. "'.\n" .. - "A runtime error occurred: " .. tostring(err or "(nil)")) - end -end diff --git a/package/luci/modules/luci-base/luasrc/view/csrftoken.htm b/package/luci/modules/luci-base/luasrc/view/csrftoken.htm deleted file mode 100644 index 57ac03f3bf..0000000000 --- a/package/luci/modules/luci-base/luasrc/view/csrftoken.htm +++ /dev/null @@ -1,24 +0,0 @@ -<%# - Copyright 2015 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<%+header%> - -

    <%:Form token mismatch%>

    -
    - -

    <%:The submitted security token is invalid or already expired!%>

    - -

    <%: - In order to prevent unauthorized access to the system, your request has - been blocked. Click "Continue »" below to return to the previous page. -%>

    - -
    - -

    - Continue » -

    - -<%+footer%> diff --git a/package/luci/modules/luci-base/luasrc/view/error404.htm b/package/luci/modules/luci-base/luasrc/view/error404.htm deleted file mode 100644 index ff151d1834..0000000000 --- a/package/luci/modules/luci-base/luasrc/view/error404.htm +++ /dev/null @@ -1,12 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<%+header%> -

    404 <%:Not Found%>

    -

    <%:Sorry, the object you requested was not found.%>

    -

    <%=message%>

    -<%:Unable to dispatch%>: <%=url(unpack(luci.dispatcher.context.request))%> -<%+footer%> diff --git a/package/luci/modules/luci-base/luasrc/view/error500.htm b/package/luci/modules/luci-base/luasrc/view/error500.htm deleted file mode 100644 index 34a52cda84..0000000000 --- a/package/luci/modules/luci-base/luasrc/view/error500.htm +++ /dev/null @@ -1,11 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<%+header%> -

    500 <%:Internal Server Error%>

    -

    <%:Sorry, the server encountered an unexpected error.%>

    -
    <%=message%>
    -<%+footer%> diff --git a/package/luci/modules/luci-base/luasrc/view/footer.htm b/package/luci/modules/luci-base/luasrc/view/footer.htm deleted file mode 100644 index ba14ec8678..0000000000 --- a/package/luci/modules/luci-base/luasrc/view/footer.htm +++ /dev/null @@ -1,27 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008-2019 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<% - local is_rollback_pending, rollback_time_remaining, rollback_session, rollback_token = luci.model.uci:rollback_pending() - - if is_rollback_pending or trigger_apply or trigger_revert then -%> - -<% - end - - include("themes/" .. theme .. "/footer") -%> diff --git a/package/luci/modules/luci-base/luasrc/view/header.htm b/package/luci/modules/luci-base/luasrc/view/header.htm deleted file mode 100644 index cffe9482ca..0000000000 --- a/package/luci/modules/luci-base/luasrc/view/header.htm +++ /dev/null @@ -1,38 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008-2019 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<% - if not luci.dispatcher.context.template_header_sent then - include("themes/" .. theme .. "/header") - luci.dispatcher.context.template_header_sent = true - end - - local applyconf = luci.config and luci.config.apply -%> - - - - diff --git a/package/luci/modules/luci-base/luasrc/view/sysauth.htm b/package/luci/modules/luci-base/luasrc/view/sysauth.htm deleted file mode 100644 index 797c87a72e..0000000000 --- a/package/luci/modules/luci-base/luasrc/view/sysauth.htm +++ /dev/null @@ -1,75 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008-2012 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<%+header%> - -
    - <%- if fuser then %> -
    -

    <%:Invalid username and/or password! Please try again.%>

    -
    - <% end -%> - -
    -

    <%:Authorization Required%>

    -
    - <%:Please enter your username and password.%> -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    -
    - -
    - - -
    -
    - - -<% -local uci = require "luci.model.uci".cursor() -local fs = require "nixio.fs" -local https_key = uci:get("uhttpd", "main", "key") -local https_port = uci:get("uhttpd", "main", "listen_https") -if type(https_port) == "table" then - https_port = https_port[1] -end - -if https_port and fs.access(https_key) then - https_port = https_port:match("(%d+)$") -%> - - - -<% end %> - -<%+footer%> diff --git a/package/luci/modules/luci-base/luasrc/view/view.htm b/package/luci/modules/luci-base/luasrc/view/view.htm deleted file mode 100644 index b451e8cfbf..0000000000 --- a/package/luci/modules/luci-base/luasrc/view/view.htm +++ /dev/null @@ -1,12 +0,0 @@ -<%+header%> - -
    -
    <%:Loading view…%>
    - -
    - -<%+footer%> diff --git a/package/luci/modules/luci-base/po/ar/base.po b/package/luci/modules/luci-base/po/ar/base.po index 31205a44a7..f31209bae0 100644 --- a/package/luci/modules/luci-base/po/ar/base.po +++ b/package/luci/modules/luci-base/po/ar/base.po @@ -1,33 +1,50 @@ msgid "" msgstr "" -"PO-Revision-Date: 2022-10-22 18:07+0000\n" -"Last-Translator: Abdullah AlShaikh \n" -"Language-Team: Arabic \n" +"Language-Team: Arabic \n" "Language: ar\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 5.0.2\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f ديسيبل" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d بت" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d حقل غير صحيح" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +#, fuzzy +msgid "%dh ago" +msgstr "%dh قبل" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "s% بدون علامة في شبكات افتراضية متعددة!" @@ -52,10 +69,11 @@ msgstr "(فارغ)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(لا توجد وصلات بينية ملحقة)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "" @@ -65,19 +83,19 @@ msgid "-- Additional Field --" msgstr "--ميدانية إضافية --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- اختر من فضلك --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- إعداد--" @@ -103,7 +121,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = لا يستخدم حد أدنى ل RSSI ، تغيير برنامج التشغيل الافتراضي =1" @@ -116,7 +134,7 @@ msgstr "1" msgid "1 Minute Load:" msgstr "1 دقيقة تحميل:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" @@ -127,6 +145,11 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "تحميل 15 دقيقة:" @@ -141,12 +164,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "هوية سداسية عشرية ذات 4 أحرف" @@ -159,44 +187,99 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "5 دقائق تحميل:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "معرف 6-ثماني ككلمة سداسية عشرية - بدون نقط" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "انتقال سريع 802.11r" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "الحد الأقصى لمهلة استعلام اقتران 802.11w SA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "مهلة إعادة محاولة استعلام اقتران 802.11w SA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "حماية إطار الإدارة 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "أقصى مهلة نفذ الوقت 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "مهلة إعادة المحاولة 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 #, fuzzy msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "قناع الشبكة IPv4" @@ -208,30 +291,42 @@ msgstr "إعدادات LED" msgid "LED Name" msgstr "إسم LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -277,11 +372,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "يوجد دليل بنفس الاسم." @@ -289,25 +392,90 @@ msgstr "يوجد دليل بنفس الاسم." msgid "A new login is required since the authentication session expired." msgstr "يجب الدخول مجدداً لئن صلاحية جلسة قد انتهت." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -340,29 +508,36 @@ msgstr "لا يتم دعم مراقبة ARP للسياسة المحددة!" msgid "ARP retry threshold" msgstr "إعادة محاولة ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (وضع النقل غير المتزامن)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "جسور ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "معرّف القناة الافتراضية (VCI) ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "معرف المسار الافتراضي ATM (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -371,26 +546,22 @@ msgstr "" "كشف جسور ATM شبكة إيثرنت مغلفة في اتصالات AAL5 كواجهات شبكة Linux افتراضية " "يمكن استخدامها مع DHCP أو PPP للاتصال بشبكة المزود." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "رقم جهاز ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "معرف مزود نظام ATU-C" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "واجهة غائبة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "قصر خدمة DNS على واجهات الشبكات الفرعية التي نخدم DNS عليها." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "" @@ -399,7 +570,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -407,16 +578,25 @@ msgstr "" msgid "Access Concentrator" msgstr "تركيز دوائر الاتصال" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "نقطة الدخول" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "إجراءات" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "نشيط" @@ -454,8 +634,8 @@ msgstr "" msgid "Active-Backup policy (active-backup, 1)" msgstr "سياسة النسخ الاحتياطي النشط (النسخ الاحتياطي النشط ، 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "مخصصة" @@ -472,18 +652,18 @@ msgstr "موازنة تحميل الإرسال التكيفي (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "أضف" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "اضافة جسر ATM" @@ -503,11 +683,11 @@ msgstr "أضف عمل LED" msgid "Add VLAN" msgstr "أضف VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "" @@ -515,18 +695,18 @@ msgstr "" msgid "Add instance" msgstr "إضافة مثيل" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "إضافة مفتاح" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "أضف لاحقة المجال المحلي للأسماء التي يتم تقديمها من ملفات المضيفين" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "إضافة واجهة جديدة ..." @@ -534,6 +714,10 @@ msgstr "إضافة واجهة جديدة ..." msgid "Add peer" msgstr "إضافة نظير" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "أضف إلى القائمة السوداء" @@ -542,11 +726,11 @@ msgstr "أضف إلى القائمة السوداء" msgid "Add to Whitelist" msgstr "إضافة إلى القائمة البيضاء" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "ملفات Hosts إضافية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "ملف سرفير إضافي" @@ -563,7 +747,11 @@ msgstr "ملف سرفير إضافي" msgid "Address" msgstr "عنوان" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -576,7 +764,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "عنوان للوصول إلى جسر الترحيل المحلي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "عناوين" @@ -585,29 +773,29 @@ msgstr "عناوين" msgid "Administration" msgstr "إدارة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "إعدادات متقدمة" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "قدرة الإرسال الإجمالية (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -615,7 +803,7 @@ msgstr "منطق اختيار التجميع" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:263 msgid "Aggregator: All slaves down or has no slaves (stable, 0)" -msgstr "العارض: جميع التابعين معطلين أو ليس لديه تابع (مستقر ، 0)" +msgstr "العارض: جميع التابعين معطلين أو ليس لديه تابع (مستقر ، 0)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:265 msgid "" @@ -644,17 +832,17 @@ msgstr "واجهة الاسم المستعار" msgid "Alias of \"%s\"" msgstr "الاسم المستعار ل \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "جميع السيرفرات" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "قم بتخصيص عناوين IP بالتسلسل ، بدءًا من أدنى عنوان متاح" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "تخصيص IP بالتسلسل" @@ -662,11 +850,11 @@ msgstr "تخصيص IP بالتسلسل" msgid "Allow SSH password authentication" msgstr "السماح بمصادقة كلمة المرور SSH" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "اسمح لوضع AP بفصل STAts بناءً على حالة ACK المنخفضة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "السماح للجميع باستثناء المذكورة" @@ -674,15 +862,15 @@ msgstr "السماح للجميع باستثناء المذكورة" msgid "Allow full UCI access for legacy applications" msgstr "السماح بوصول UCI الكامل للتطبيقات القديمة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "السماح بمعدلات 802.11b القديمة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "السماح بالقائمة فقط" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "السماح ب localhost" @@ -703,19 +891,24 @@ msgid "Allow system feature probing" msgstr "السماح بفحص ميزات النظام" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "اسمح للمستخدم root بتسجيل الدخول باستخدام كلمة المرور" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "عناوين IP المسموح بها" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "" @@ -727,11 +920,11 @@ msgstr "دائما متوقف (النواة: لا شيء)" msgid "Always on (kernel: default-on)" msgstr "دائمًا قيد التشغيل (kernel: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -739,10 +932,14 @@ msgstr "" "استخدم دائمًا قنوات 40 ميجا هرتز حتى إذا تداخلت القناة الثانوية. استخدام هذا " "الخيار لا يتوافق مع معيار IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "حدث خطأ أثناء حفظ النموذج:" @@ -751,98 +948,47 @@ msgstr "حدث خطأ أثناء حفظ النموذج:" msgid "An optional, short description for this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "المرفق" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annex A + L + M (all)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "الملحق أ G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "الملحق أ G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "الملحق أ G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "الملحق أ G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "الملحق ب (الكل)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "الملحق ب ز ..992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "الملحق ب G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "الملحق ب 992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "الملحق ي (الكل)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "الملحق L G.992.3 الوعاء 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "الملحق م (الكل)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "الملحق م 992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "الملحق م 992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "أعلن مجالات DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "هوية مجهولة" @@ -854,7 +1000,7 @@ msgstr "mount مجهول" msgid "Anonymous Swap" msgstr "swap مجهول" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -866,11 +1012,11 @@ msgstr "" msgid "Any zone" msgstr "أي منطقة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -878,44 +1024,48 @@ msgstr "" msgid "Apply backup?" msgstr "تطبيق النسخ الاحتياطي؟" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "فشل تطبيق الطلب بالحالة h% " #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "تطبيق ملحوظ" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "جاري تطبيق تغييرات التكوين ... %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "بنية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "قم بتعيين جزء من الطول المحدد لكل بادئة IPv6 عامة لهذه الواجهة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "قم بتعيين أجزاء البادئة باستخدام معرف السداسي العشري هذا لهذه الواجهة." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "المحطات المرتبطة" @@ -924,15 +1074,15 @@ msgstr "المحطات المرتبطة" msgid "Associations" msgstr "الارتباطات" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -942,25 +1092,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "حاول تمكين نقاط التحميل المكونة للأجهزة المتصلة" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "مجموعة المصادقة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "المصادقة" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "نوع المصادقة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "موثوق" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "التفويض مطلوب" @@ -968,7 +1119,9 @@ msgstr "التفويض مطلوب" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -986,7 +1139,7 @@ msgstr "Automatic Homenet (HNCP)" msgid "Automatically check filesystem for errors before mounting" msgstr "افحص نظام الملفات تلقائيًا بحثًا عن الأخطاء قبل التركيب" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1008,6 +1161,10 @@ msgstr "نظام ملفات Automount" msgid "Automount Swap" msgstr "التركيب التلقائي ل swap" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "متاح" @@ -1026,11 +1183,15 @@ msgstr "متاح" msgid "Average:" msgstr "متوسط:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1038,15 +1199,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "" @@ -1055,11 +1220,7 @@ msgstr "" msgid "Back to Overview" msgstr "الرجوع إلى الملخص" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "الرجوع إلى التشكيل" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1072,16 +1233,15 @@ msgid "Backup / Flash Firmware" msgstr "نسخ احتياطي / فلاش firmware" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "قائمة ملفات النسخ الاحتياطي" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "نِطاق" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1089,12 +1249,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "الفاصل الزمني بين العلامات" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1108,7 +1291,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "ربط ديناميكيًا بالواجهات بدلاً من عنوان أحرف البدل (موصى به باعتباره افتراضيًا " @@ -1119,18 +1302,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "واجهة ربط" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1142,65 +1338,77 @@ msgstr "اربط النفق بهذه الواجهة (اختياري)." msgid "Bitrate" msgstr "معدل البت" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "سياسة الترابط" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "جسر" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "رقم وحدة الجسر" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "إحضار على التمهيد" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "سياسة البث (البث ، 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "تصفح…" @@ -1208,14 +1416,36 @@ msgstr "تصفح…" msgid "Buffered" msgstr "مخزنة" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "شهادة CA إذا كانت فارغة سيتم حفظها بعد الاتصال الأول." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "فشل تكوين CLAT" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "استخدام المعالج (٪)" @@ -1230,18 +1460,23 @@ msgstr "مخبأ" msgid "Call failed" msgstr "الاتصال فشل" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "إلغاء" @@ -1249,32 +1484,32 @@ msgstr "إلغاء" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1283,24 +1518,32 @@ msgstr "" msgid "Category" msgstr "فئة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "قيد الشهادة (المجال)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "قيد الشهادة (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "قيد الشهادة (الموضوع)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "قيد الشهادة (حرف البدل)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1308,8 +1551,8 @@ msgstr "" "السلسلة الفرعية لقيد الشهادة - على سبيل المثال /CN=wifi.mycompany.com
    " "راجع `logread -f` أثناء المصافحة لمعرفة القيم الفعلية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1317,8 +1560,8 @@ msgstr "" "قيد (قيود) الشهادة مقابل قيم DNS SAN (إذا كانت متوفرة)
    أو CN الموضوع " "(مطابقة تامة)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1326,8 +1569,8 @@ msgstr "" "قيد (قيود) الشهادة مقابل قيم DNS SAN (إذا كانت متوفرة)
    أو CN الموضوع " "(مطابقة لاحقة)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1341,16 +1584,16 @@ msgstr "" msgid "Chain" msgstr "سلسلة" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "التغييرات" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "تم التراجع عن التغييرات." @@ -1361,18 +1604,19 @@ msgstr "يغير كلمة مرور المسؤول للوصول إلى الجها #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "قناة" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "تحليل القناة" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "عرض القناة" @@ -1380,7 +1624,7 @@ msgstr "عرض القناة" msgid "Check filesystems before mount" msgstr "افحص أنظمة الملفات قبل التحميل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "حدد هذا الخيار لحذف الشبكات الموجودة من هذا الراديو." @@ -1397,8 +1641,8 @@ msgstr "جارٍ فحص الصورة …" msgid "Choose mtdblock" msgstr "اختر mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1409,7 +1653,7 @@ msgstr "" "em> لإزالة الواجهة من المنطقة المرتبطة أو املأ الحقل المخصص " "لتحديد منطقة جديدة وإرفاق الواجهة بها." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1417,7 +1661,7 @@ msgstr "" "اختر الشبكة (الشبكات) التي تريد إرفاقها بهذه الواجهة اللاسلكية أو املأ الحقل " " المخصص لتحديد شبكة جديدة." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "الشفرة" @@ -1439,9 +1683,10 @@ msgstr "" "انقر فوق \"حفظ mtdblock\" لتنزيل ملف mtdblock المحدد. (ملاحظة: هذه الميزة " "مخصصة للمهنيين!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "العميل" @@ -1450,9 +1695,9 @@ msgstr "العميل" msgid "Client ID to send when requesting DHCP" msgstr "معرّف العميل لإرساله عند طلب DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "إغلق" @@ -1468,20 +1713,20 @@ msgid "" msgstr "" "أغلق الاتصال غير النشط بعد مقدار الثواني المحدد ، واستخدم 0 لاستمرار الاتصال" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "إغلاق القائمة ..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "جمع البيانات..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "أمر" @@ -1498,7 +1743,7 @@ msgstr "فشل الأمر" msgid "Comment" msgstr "تعليق" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1521,29 +1766,28 @@ msgstr "حساب المجموع الاختباري الصادر (اختياري) msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "إعدادات" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "تم تطبيق تغييرات التكوين." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "تم التراجع عن تغييرات التكوين!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "فشل التكوين" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1560,28 +1804,28 @@ msgstr "" "ميجابت في الثانية باعتبارها المعدل الأساسي. لا يتم تقديم أسعار مدعومة أقل من " "الحد الأدنى للمعدل الأساسي." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1593,9 +1837,10 @@ msgstr "تأكيد قطع الاتصال" msgid "Confirmation" msgstr "تأكيد" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "متصل" @@ -1605,11 +1850,11 @@ msgstr "متصل" msgid "Connection attempt failed" msgstr "فشلت محاولة الاتصال" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "فشلت محاولة الاتصال." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1621,7 +1866,7 @@ msgstr "انقطع الاتصال" msgid "Connections" msgstr "روابط" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1650,9 +1895,9 @@ msgstr "ضع في اعتبارك التابع عندما يكون أي هدف AR msgid "Contents have been saved." msgstr "تم حفظ المحتويات." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1663,16 +1908,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1686,20 +1931,20 @@ msgstr "" msgid "Country" msgstr "بلد" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "الرقم الدولي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "كثافة خلايا التغطية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "إنشاء / تعيين منطقة جدار الحماية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "إنشاء واجهة" @@ -1711,7 +1956,7 @@ msgstr "حرج" msgid "Cron Log Level" msgstr "مستوى سجل Cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "القوة الحالية" @@ -1754,31 +1999,31 @@ msgstr "" "يضبط إعدادات الأجهزة-LED-اذا " "امكن." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "عميل -DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "بوابة -DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "سر -DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "سرفير DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP و DNS" @@ -1789,16 +2034,22 @@ msgstr "DHCP و DNS" msgid "DHCP client" msgstr "عميل DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "خيارات DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "عميل DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "خدمة DHCPv6" @@ -1810,19 +2061,19 @@ msgstr "خدمة DHCPv6" msgid "DNS" msgstr "نظام أسماء النطاقات" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "شحن DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNS query port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "منفذ سيرفرDNS System>" @@ -1830,7 +2081,7 @@ msgstr "منفذ سيرفرDNS System msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1838,11 +2089,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "DNS-Label / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "تحقق DNSSEC بدون توقيع" @@ -1854,39 +2105,49 @@ msgstr "مهلة خمول DPD" msgid "DS-Lite AFTR address" msgstr "عنوان DS-Lite AFTR" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "حالة DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "وضع خط DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "فترة DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "معدل البيانات" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +#, fuzzy +msgid "Data Received" +msgstr "لم تستلم أية بيانات" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +#, fuzzy +msgid "Data Transmitted" +msgstr "بث" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "تصحيح الأخطاء" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1894,7 +2155,7 @@ msgstr "" msgid "Default state" msgstr "الحالة التلقائية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1904,61 +2165,62 @@ msgstr "" "\"6,192.168.2.1,192.168.2.2\"التي تعلن عن خوادم DNS مختلفة " "للعملاء." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "احدف" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "احدف المفتاح" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "فشل طلب الحذف: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "احذف هذه الشبكة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "الفاصل الزمني لرسالة إشارة حركة التسليم" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "الوصف" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "إلغاء" @@ -1966,11 +2228,11 @@ msgstr "إلغاء" msgid "Design" msgstr "تصميم" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2005,9 +2267,9 @@ msgstr "منطقة الوجهة" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2017,36 +2279,40 @@ msgstr "منطقة الوجهة" msgid "Device" msgstr "جهاز" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "تكوين الجهاز" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "الجهاز غير نشط" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "الجهاز قيد إعادة التشغيل …" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "الجهاز لا يديره ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "الجهاز لا يمكن الوصول إليه!" @@ -2054,31 +2320,31 @@ msgstr "الجهاز لا يمكن الوصول إليه!" msgid "Device unreachable! Still waiting for device..." msgstr "لا يمكن التواصل مع الجهاز! في إنتظار الجهاز..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "التشخيص" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "رقم الاتصال الهاتفي" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "الدليل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "تعطيل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2095,20 +2361,24 @@ msgstr "تعطيل عمليات بحث DNS" msgid "Disable Encryption" msgstr "تعطيل التشفير" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "تعطيل أخذ عينات الخمول" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "تعطيل هذه الشبكة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2117,33 +2387,32 @@ msgstr "تعطيل هذه الشبكة" msgid "Disabled" msgstr "غير مفعل" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "إلغاء الارتباط عند الإقرار القليل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "تجاهل استجابات المنبع RFC1918" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "قطع الاتصال" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "فشلت محاولة قطع الاتصال" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "فشلت محاولة قطع الاتصال." @@ -2153,40 +2422,52 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "إلغاء" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "تحسين المسافة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "المسافة إلى أبعد عضو في الشبكة بالمتر." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" -"Dnsmasq هو مزيج من خادم DHCP- و DNS- " -"معاد توجيهه إلى جدران الحماية NAT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" "لا تقم بتخزين الردود السلبية مؤقتًا ، على سبيل المثال لغير المجالات الموجودة" @@ -2199,36 +2480,25 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "لا تقم بإنشاء مسار مضيف إلى نظير (اختياري)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "لا تقم بإعادة توجيه طلبات DNS بدون " "إسم DNS-" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"لا تقم بإعادة توجيه الطلبات التي لا يمكن الرد عليها بواسطة خوادم الأسماء " -"العامة" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "لا تقم بإعادة توجيه عمليات البحث العكسي للشبكات المحلية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "منع الاستماع على هذه الواجهات." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2238,17 +2508,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "لا ترسل اسم المضيف" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "هل تريد حقًا حذف \" %s\"؟" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "هل تريد حقًا حذف مفتاح SSH التالي؟" @@ -2256,11 +2526,11 @@ msgstr "هل تريد حقًا حذف مفتاح SSH التالي؟" msgid "Do you really want to erase all settings?" msgstr "هل تريد حقًا مسح جميع الإعدادات؟" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "هل تريد حقًا حذف الدليل \" s%\" بشكل متكرر؟" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2268,15 +2538,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "المجال مطلوب" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "القائمة البيضاء للمجال" @@ -2302,11 +2574,11 @@ msgstr "تنزيل نسخة احتياطية" msgid "Download mtdblock" msgstr "تحميل mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "تعويض مصب SNR" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2320,16 +2592,54 @@ msgstr "اسحب لإعادة ترتيب" msgid "Drop Duplicate Frames" msgstr "قم بإسقاط الإطارات المكررة" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "مثيل Dropbear" @@ -2347,20 +2657,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "مكدس مزدوج خفيف (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "DHCP ديناميكي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2368,7 +2678,7 @@ msgstr "" msgid "Dynamic tunnel" msgstr "نفق ديناميكي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2376,21 +2686,33 @@ msgstr "" "تخصيص عناوين DHCP للعملاء ديناميكيًا. إذا تم تعطيله ، فلن يتم تقديم سوى " "للعملاء الذين لديهم عقود إيجار ثابتة." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "طول EA بت" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "طريقة EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "تحرير" @@ -2398,6 +2720,10 @@ msgstr "تحرير" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2406,11 +2732,11 @@ msgstr "" "قم بتحرير بيانات التكوين الأولية أعلاه لإصلاح أي خطأ واضغط على \"حفظ\" " "لإعادة تحميل الصفحة." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "قم بتحرير هذه الشبكة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "تحرير الشبكة اللاسلكية" @@ -2419,55 +2745,45 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "طوارئ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "شغل" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" "خول التطفل على IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "شغل STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2485,10 +2801,11 @@ msgstr "تفعيل الخلط الديناميكي للتدفقات" msgid "Enable HE.net dynamic endpoint update" msgstr "تفعيل تحديث نقطة النهاية الديناميكية ل HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "قم بتمكين مفاوضات IPv6" @@ -2502,11 +2819,15 @@ msgstr "قم بتمكين مفاوضات IPv6" msgid "Enable IPv6 negotiation on the PPP link" msgstr "قم بتمكين مفاوضات IPv6 على ارتباط PPP" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "تفعيل عبور الإطار الجامبو" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2518,11 +2839,11 @@ msgstr "تمكين عميل NTP" msgid "Enable Single DES" msgstr "تمكين واحد DES" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "تفعيل خادم TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2530,7 +2851,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "قم بتمكين وظائف VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "تفعيل زر WPS يتطلب WPA (2) -PSK / WPA3-SAE" @@ -2541,12 +2862,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "تفعيل الإجراءات المضادة لإعادة تثبيت المفتاح (KRACK)" @@ -2562,26 +2883,26 @@ msgstr "تفعيل عكس الحزم الواردة" msgid "Enable mirroring of outgoing packets" msgstr "تفعيل عكس الحزم الصادرة" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "قم بتمكين توجيه الحزمة عبر جميع وحدات المعالجة المركزية (CPU). قد تساعد أو " "تعيق سرعة الشبكة." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2603,11 +2924,11 @@ msgstr "تمكين الدعم لحركة مرور البث المتعدد (اخ msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "قم بتمكين علامة DF (عدم تجزئة) للحزم المغلفة." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "فعل هذه الشبكة" @@ -2616,27 +2937,36 @@ msgstr "فعل هذه الشبكة" msgid "Enable tx checksum" msgstr "تفعيل المجموع الاختباري tx" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "مفعل" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "تمكن IGMP من التطفل على هذا الجسر" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "يتيح التجوال السريع بين نقاط الوصول التي تنتمي إلى نفس مجال التنقل" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "يُمكّن بروتوكول Spanning Tree على هذا الجسر" @@ -2644,24 +2974,30 @@ msgstr "يُمكّن بروتوكول Spanning Tree على هذا الجسر" msgid "Encapsulation limit" msgstr "حد التغليف" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "وضع التغليف" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "التشفير" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +#, fuzzy +msgid "Endpoint" +msgstr "مضيف نقطة النهاية" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "مضيف نقطة النهاية" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "منفذ نقطة النهاية" @@ -2669,23 +3005,23 @@ msgstr "منفذ نقطة النهاية" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2714,10 +3050,6 @@ msgstr "خطأ" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "الثواني الخطأ (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2736,38 +3068,52 @@ msgstr "كل 30 ثانية (بطيء ، 0)" msgid "Every second (fast, 1)" msgstr "كل ثانية (سريع ، 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "استبعاد واجهات" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" "السماح باستجابات المنبع في النطاق 127.0.0.0/8 ، على سبيل المثال لخدمات RBL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "قم بتوسيع المضيفين" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "توقع تلميح مهمة سداسية عشرية" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2776,11 +3122,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "توقع: %s" @@ -2792,7 +3138,7 @@ msgstr "توقع: قيمة غير فارغة" msgid "Expires" msgstr "تنتهي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2803,11 +3149,11 @@ msgstr "" msgid "External" msgstr "خارجي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "قائمة حامل مفاتيح R0 الخارجية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "قائمة حامل مفاتيح R1 الخارجية" @@ -2835,35 +3181,63 @@ msgstr "خيارات إضافية pppd" msgid "Extra sstpc options" msgstr "خيارات sstpc إضافية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT على DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT عبر الأثير" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "بروتوكول FT" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "فشل تغيير كلمة مرور النظام." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "فشل التأكيد على التطبيق خلال %ds ، في انتظار التراجع…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "فشل تنفيذ الإجراء\"%‎/etc/init.d/s% s\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "ملف" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2872,26 +3246,26 @@ msgstr "" "1.2.3.4' لخوادم DNS الخاصة " "بالمجال أو للخوادم." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "الملف لا يمكن الوصول إليه" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "ملف حيث سيتم تخزين الإجازات المعطاة DHCP " -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "الملف محلي DNS" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "اسم الملف" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "تم الإعلان عن اسم ملف صورة الاشهار للعملاء" @@ -2900,14 +3274,22 @@ msgstr "تم الإعلان عن اسم ملف صورة الاشهار للعم msgid "Filesystem" msgstr "نظام الملفات" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "تصفية خاصة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "تصفية عديمة الفائدة" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "تصفية لجميع التابعين ، لا تحقق من صحة" @@ -2920,8 +3302,13 @@ msgstr "التصفية لجميع التابعين ، والتحقق من صحة msgid "Filtering for all slaves, validation only for backup slaves" msgstr "التصفية لجميع التابعين ، والتحقق من صحة التابعين الاحتياطيين فقط" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "فشل الإنهاء" @@ -2933,7 +3320,7 @@ msgstr "" "ابحث عن جميع أنظمة الملفات المرفقة حاليًا وقم بتبديل واستبدال التكوين " "بالإعدادات الافتراضية بناءً على ما تم اكتشافه" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "البحث والانضمام إلى الشبكة" @@ -2947,10 +3334,11 @@ msgid "Firewall" msgstr "جدار الحماية" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "علامة جدار الحماية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "اعدادات جدار الحماية" @@ -2958,19 +3346,19 @@ msgstr "اعدادات جدار الحماية" msgid "Firewall Status" msgstr "حالة جدار الحماية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "ملف البرامج الثابتة" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "نسخة برنامج ثابت" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "منفذ مصدر ثابت لاستعلامات DNS الصادرة" @@ -2996,40 +3384,48 @@ msgstr "عمليات الفلاش" msgid "Flashing…" msgstr "تتبيت الصورة …" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "أجبار" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "فرض وضع 40 ميجا هرتز" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "فرض CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "فرض DHCP على هذه الشبكة حتى إذا تم اكتشاف خادم آخر." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "فرض TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "فرض TKIP و CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "ارتباط القوة" @@ -3041,11 +3437,11 @@ msgstr "قوة الترقية" msgid "Force use of NAT-T" msgstr "فرض استخدام NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "رمز النموذج غير متطابق" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3064,37 +3460,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "إعادة توجيه حركة مرور DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "ثواني تصحيح الخطأ الأمامي (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "حركة البث إلى الأمام" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "حركة الأقران المتشابكة إلى الأمام" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "وضع إعادة التوجيه" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "عتبة التجزيء" @@ -3118,7 +3518,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "فقطGPRS" @@ -3138,12 +3538,16 @@ msgstr "نفق GRETAP عبر IPv4" msgid "GRETAP tunnel over IPv6" msgstr "نفق GRETAP عبر IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "بوابة" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "منافذ البوابة" @@ -3153,23 +3557,23 @@ msgstr "منافذ البوابة" msgid "Gateway address is invalid" msgstr "عنوان البوابة غير صالح" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "الاعدادات العامة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "الإعداد العام" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3177,7 +3581,7 @@ msgstr "" msgid "Generate Config" msgstr "توليد التكوين" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "إنشاء PMK محليًا" @@ -3185,11 +3589,11 @@ msgstr "إنشاء PMK محليًا" msgid "Generate archive" msgstr "إنشاء أرشيف" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3197,15 +3601,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3217,39 +3621,40 @@ msgstr "نظرًا لعدم تطابق تأكيد كلمة المرور ، لم msgid "Global Settings" msgstr "الاعدادات العامة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "خيارات الشبكة العالمية" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "انتقل إلى تكوين كلمة المرور ..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "انتقل إلى صفحة التكوين ذات الصلة" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "منح تسجيل الدخول إلى تكوين DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "منح حق تسجيل الدخول إلى عرض حالة DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "منح حق تسجيل الدخول إلى عرض حالة DSL" @@ -3261,6 +3666,10 @@ msgstr "امنح حق تسجيل الدخول إلى إجراءات LuCI OpenCon msgid "Grant access to LuCI Wireguard procedures" msgstr "منح تسجيل الدخول إلى إجراءات LuCI Wireguard" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "منح تسجيل الدخول إلى تكوين SSH" @@ -3271,7 +3680,7 @@ msgstr "منح تسجيل الدخول إلى إجراءات LuCI الأساسي #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:79 msgid "Grant access to crontab configuration" -msgstr "منح تسجيل الدخول إلى تكوين crontab" +msgstr "منح تسجيل الدخول إلى تكوين crontab" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:70 msgid "Grant access to firewall status" @@ -3297,7 +3706,7 @@ msgstr "امنح تسجيل الدخول إلى تكوين التركيب" msgid "Grant access to network configuration" msgstr "منح تسجيل الدخول إلى تكوين الشبكة" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "منح تسجيل الدخول إلى أدوات تشخيص الشبكة" @@ -3305,6 +3714,10 @@ msgstr "منح تسجيل الدخول إلى أدوات تشخيص الشبكة msgid "Grant access to network status information" msgstr "منح تسجيل الدخول إلى معلومات حالة الشبكة" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "منح حق تسجيل الدخول إلى حالة العملية" @@ -3337,7 +3750,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "امنح حق الدخول إلى شاشة عرض الحالة اللاسلكية" @@ -3366,15 +3779,11 @@ msgstr "" msgid "Hang Up" msgstr "قطع الخط" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "رمز أخطاء (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "الفاصل الزمني لنبضات القلب (النواة: نبضات القلب)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3385,7 +3794,7 @@ msgid "" msgstr "" "هنا يمكنك تكوين الجوانب الأساسية لجهازك مثل اسم المضيف أو المنطقة الزمنية." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "إخفاء ESSID" @@ -3394,17 +3803,25 @@ msgstr "إخفاء ESSID" msgid "Hide empty chains" msgstr "إخفاء السلاسل الفارغة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "عالي" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3414,7 +3831,7 @@ msgstr "ضيف" msgid "Host expiry timeout" msgstr "انتهت مهلة انتهاء صلاحية المضيف" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3422,10 +3839,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "محتوى علامة Host-Uniq" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3435,11 +3858,11 @@ msgstr "اسم المضيف" msgid "Hostname to send when requesting DHCP" msgstr "اسم المضيف المراد إرساله عند طلب DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "أسماء المضيفين" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3495,23 +3918,27 @@ msgstr "تجميع الارتباط الديناميكي IEEE 802.3ad (802.3ad msgid "IKE DH Group" msgstr "مجموعة IKE DH" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "عناوينIP" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "بروتوكول IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "نوع IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3527,7 +3954,7 @@ msgstr "عنوان IP غير صالح" msgid "IP address is missing" msgstr "عنوان IP مفقود" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3539,20 +3966,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "تجاوز المجال الزائف NX" @@ -3560,14 +3987,15 @@ msgstr "تجاوز المجال الزائف NX" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3583,7 +4011,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3593,7 +4021,7 @@ msgstr "IPv4 المنبع" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3620,7 +4048,7 @@ msgstr "قناع الشبكة IPv4" msgid "IPv4 network in address/netmask notation" msgstr "شبكة IPv4 في تدوين العنوان / قناع الشبكة" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "IPv4 فقط" @@ -3633,11 +4061,11 @@ msgstr "بادئة IPv4" msgid "IPv4 prefix length" msgstr "طول بادئة IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3646,16 +4074,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-in-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4 / IPv6 (كلاهما - الافتراضيات إلى IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3666,7 +4098,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3674,7 +4107,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "جدار حماية IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3682,7 +4115,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "جيران IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3690,15 +4127,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "إعدادات IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6 ULA- بادئة" @@ -3712,12 +4149,12 @@ msgstr "IPv6 المنبع" msgid "IPv6 address" msgstr "عنوان IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "تلميح تخصيص IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "طول تعيين IPv6" @@ -3729,11 +4166,11 @@ msgstr "بوابة IPv6" msgid "IPv6 network in address/netmask notation" msgstr "شبكة IPv6 في تدوين العنوان / قناع الشبكة" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "IPv6 فقط" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3742,7 +4179,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "بادئة IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3756,24 +4193,19 @@ msgstr "طول بادئة IPv6" msgid "IPv6 routed prefix" msgstr "بادئة موجهة IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "لاحقة IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"لاحقة ( سداسية) IPv6" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "دعم IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3781,6 +4213,10 @@ msgstr "" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3796,10 +4232,16 @@ msgstr "IPv6-over-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-over-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "هوية" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "إذا تم تحديده ، يتم تمكين 1DES" @@ -3812,13 +4254,13 @@ msgstr "إذا تم تحديده ، فسيضيف \"+ ipv6\" إلى خيارات msgid "If checked, encryption is disabled" msgstr "إذا تم تحديده ، فسيتم تعطيل التشفير" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3839,21 +4281,23 @@ msgstr "" "إذا تم تحديد ذلك ، فقم بتركيب الجهاز من خلال تسمية القسم بدلاً من عقدة الجهاز " "الثابت" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "إذا لم يتم تحديده ، فلن يتم تكوين مسار افتراضي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "إذا لم يتم تحديده ، فسيتم تجاهل عناوين خادم DNS المعلن عنها" @@ -3873,15 +4317,23 @@ msgstr "" "المبادلة بالبيانات العالية الخاصة بـ RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "تجاهل / etc / hosts " -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "تجاهل الواجهة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "تجاهل حل الملف" @@ -3893,25 +4345,25 @@ msgstr "صورة" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3923,7 +4375,21 @@ msgstr "" msgid "In" msgstr "في" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -3931,7 +4397,7 @@ msgstr "" "لمنع الدخول غير المصرح به إلى النظام ، تم حظر طلبك. انقر فوق \"متابعة\" " "أدناه للعودة إلى الصفحة السابقة." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "في ثوان" @@ -3961,7 +4427,7 @@ msgstr "" msgid "Incoming checksum" msgstr "المجموع الاختباري الوارد" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3969,6 +4435,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "مفتاح وارد" @@ -3987,22 +4454,21 @@ msgstr "معلومات" msgid "Information" msgstr "معلومة" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "فشل التهيئة" @@ -4014,31 +4480,41 @@ msgstr "نص مبدئيinitscript" msgid "Initscripts" msgstr "نصوص أولية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "قيد الشهادة الداخلية (المجال)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "قيد الشهادة الداخلية (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "قيد الشهادة الداخلية (الموضوع)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "قيد الشهادة الداخلية (حرف البدل)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "تثبيت ملحقات البروتوكول ..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4050,6 +4526,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "أذونات غير كافية لقراءة تكوين UCI." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4057,7 +4537,7 @@ msgstr "أذونات غير كافية لقراءة تكوين UCI." msgid "Interface" msgstr "واجهه" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -4065,7 +4545,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "تم ترحيل الجهاز q% تلقائيًا من q% إلى %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "تكوين الواجهة" @@ -4096,11 +4576,11 @@ msgstr "تم وضع علامة على الواجهة للحذف" msgid "Interface is shutting down..." msgstr "الواجهة قيد الإغلاق ..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "الواجهة تبدأ ..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "الواجهة تتوقف ..." @@ -4109,12 +4589,12 @@ msgid "Interface name" msgstr "اسم الواجهة" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "الواجهة غير موجودة أو غير متصلة بعد." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "واجهات" @@ -4123,22 +4603,26 @@ msgstr "واجهات" msgid "Internal" msgstr "داخلي" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "خطأ في الخادم الداخلي" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "الفاصل الزمني لإرسال حزم التعلم" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4148,8 +4632,9 @@ msgid "Invalid" msgstr "غير صالح" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4159,6 +4644,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "سلسلة مفاتيح Base64 غير صالحة" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4171,7 +4660,7 @@ msgstr "قيمة فئة حركة المرور غير صالحة ، المتوق #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:285 msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." -msgstr "تم إعطاء معرف VLAN غير صالح! فقط المعرفات بين %d و %dمسموح لهم" +msgstr "تم إعطاء معرف VLAN غير صالح! فقط المعرفات بين %d و %dمسموح لهم" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:294 msgid "Invalid VLAN ID given! Only unique IDs are allowed" @@ -4181,7 +4670,7 @@ msgstr "تم تقديم معرف VLAN غير صالح! يسمح فقط بالم msgid "Invalid argument" msgstr "سيطة غير صالحة" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4197,15 +4686,36 @@ msgstr "أمر خاطئ" msgid "Invalid hexadecimal value" msgstr "قيمة سداسية عشرية غير صالحة" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "اسم المستخدم و / أو كلمة المرور غير صالحة! حاول مرة اخرى." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "عزل العملاء" @@ -4218,25 +4728,25 @@ msgstr "" "يبدو أنك تحاول وميض صورة لا تتناسب مع ذاكرة الفلاش ، يرجى التحقق من ملف " "الصورة!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "مطلوب جافا سكريبت!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "الانضمام إلى الشبكة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "الانضمام إلى الشبكة: المسح اللاسلكي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "الانضمام إلى الشبكة: q%" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4244,24 +4754,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "احتفظ بالإعدادات واحتفظ بالتكوين الحالي" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "سجل النواة" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "إصدار النواة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "مفتاح" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "المفتاح # d%" @@ -4269,6 +4783,7 @@ msgstr "المفتاح # d%" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "مفتاح للحزم الواردة (اختياري)." @@ -4276,14 +4791,19 @@ msgstr "مفتاح للحزم الواردة (اختياري)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "مفتاح الحزم الصادرة (اختياري)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4328,7 +4848,7 @@ msgstr "فاصل صدى LCP" msgid "LED Configuration" msgstr "تكوين الصمام" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4345,32 +4865,39 @@ msgstr "اللغة" msgid "Language and Style" msgstr "اللغة والأسلوب" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "وقت الإستجابة" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "ورقة" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "ملف الإيجار" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "مدة الايجار" @@ -4394,7 +4921,7 @@ msgstr "اتركه فارغًا للكشف التلقائي" msgid "Leave empty to use the current WAN address" msgstr "اتركه فارغًا لاستخدام عنوان WAN الحالي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4404,31 +4931,27 @@ msgstr "" "للتشغيل البيني. قد يتم تقليل كفاءة وقت الهواء بشكل كبير حيث يتم استخدامها. " "يوصى بعدم السماح بمعدلات 802.11b حيثما أمكن ذلك." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "عنوان تفسيري:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "حد" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "توهين الخط (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "وضع الخط" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "حالة الخط" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "جهوزية الخط" @@ -4449,16 +4972,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "قائمة المضيفين الذين يقدمون نتائج زائفة لمجال NX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4471,7 +4996,7 @@ msgstr "" "إلى عنوان MAC الوجهة عند طلب مفتاح PMK-R1 من R0KH الذي استخدمه STA أثناء " "اتحاد مجال التنقل الأولي." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4488,25 +5013,22 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "قائمة ملفات مفتاح SSH للمصادقة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "قائمة المجالات التي تسمح باستجابات RFC1918 ل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "قائمة المجالات التي سيتم فرضها على عنوان IP." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" "قائمة الخوادم لإعادة توجيه الطلبات إليها DNS" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "بوابة الاستماع" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "واجهات الاستماع" @@ -4514,7 +5036,7 @@ msgstr "واجهات الاستماع" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "استمع فقط على الواجهة المحددة أو على الكل ، إذا لم يتم تحديدها" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4524,7 +5046,7 @@ msgstr "الحد من الاستماع إلى هذه الواجهات والاس msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "منفذ الاستماع لاستعلامات DNS الواردة" @@ -4533,7 +5055,7 @@ msgstr "منفذ الاستماع لاستعلامات DNS الواردة" msgid "Load" msgstr "حمولة" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "متوسط الحمولة" @@ -4541,27 +5063,28 @@ msgstr "متوسط الحمولة" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "تحميل محتويات الدليل …" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "جارٍ تحميل العرض…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "عنوان IP المحلي" @@ -4581,11 +5104,12 @@ msgstr "عنوان IP المحلي المراد تعيينه" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "عنوان IPv4 المحلي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4601,44 +5125,70 @@ msgstr "عنوان IPv6 المحلي" msgid "Local Startup" msgstr "بدء التشغيل المحلي" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "التوقيت المحلي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "المجال المحلي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "يتم إلحاق لاحقة المجال المحلي بأسماء DHCP وإدخالات ملف المضيفين" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "السرفير المحلي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "الخدمة المحلية فقط" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "تحديد تواجد الاستعلامات" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "قفل ل BSSID" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "تسجيل الدخول" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "لتسجيل الدخول…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "تسجيل خروج" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "مستوى إخراج السجل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "سجل الاستفسارات" @@ -4664,37 +5214,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "الشبكة المنطقية التي سيتم إضافة النفق إليها (جسور) (اختياري)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "تسجيل الدخول" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "تسجيل خروج" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "فقدان ثانية الإشارة (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "أقل عنوان مؤجر تمت إزاحته من عنوان الشبكة." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "عامل تصفية عنوان MAC" @@ -4702,16 +5243,15 @@ msgstr "عامل تصفية عنوان MAC" msgid "MAC Address For The Actor" msgstr "عنوان MAC للممثل" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4720,11 +5260,15 @@ msgstr "" msgid "MAC address" msgstr "عنوان MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "مرشح MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "قائمة MAC" @@ -4738,6 +5282,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "قاعدة MAP غير صالحة" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4759,15 +5307,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "الفاصل الزمني MII" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4775,7 +5327,7 @@ msgid "" msgstr "تأكد من استنساخ نظام ملفات الجذر باستخدام شيء مثل الأوامر أدناه:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4784,78 +5336,86 @@ msgstr "تأكد من استنساخ نظام ملفات الجذر باستخد msgid "Manual" msgstr "يدوي" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "سيد" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "الأعلى. معدل البيانات الممكن تحقيقه (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "إيجارات Max. DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "حجم الحزمة Max. EDNS0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Max. أقصى استفسارات متزامنة" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "الحد الأقصى المسموح به لفاصل الاستماع" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "العدد الأقصى المسموح به لعقود إيجار DHCP النشطة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "العدد الأقصى المسموح به لاستعلامات DNS المتزامنة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "الحجم الأقصى المسموح به لحزم EDNS.0 UDP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "الحد الأقصى لعدد الثواني التي يجب انتظارها حتى يصبح المودم جاهزًا" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "الحد الأقصى لعدد العناوين المؤجرة." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "قوة الإرسال القصوى" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4882,7 +5442,7 @@ msgstr "ذاكرة" msgid "Memory usage (%)" msgstr "استخدام الذاكرة (٪)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "شبكية" @@ -4890,10 +5450,18 @@ msgstr "شبكية" msgid "Mesh ID" msgstr "معرف شبكة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "معرف شبكة" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "الطريقة غير موجودة" @@ -4906,7 +5474,7 @@ msgstr "طريقة مراقبة الارتباط" msgid "Method to determine link status" msgstr "طريقة لتحديد حالة الارتباط" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4917,11 +5485,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4929,13 +5497,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "الحد الأدنى لعدد الروابط" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4949,78 +5517,85 @@ msgstr "منفذ شاشة المرآة" msgid "Mirror source port" msgstr "مرآة مصدر البوابة" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "بيانات الجوال" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "مجال التنقل" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "شكل" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "نموذج" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "جارٍ تفكيك حامل المودم." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" "اتصال المودم قيد التقدم. انتظر من فضلك. ستنتهي هذه العملية بعد دقيقتين." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "المودم الافتراضي" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "جهاز مودم" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "جاري قطع اتصال المودم. انتظر من فضلك." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "فشل الاستعلام عن معلومات المودم" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "مهلة تهيئة المودم" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "المودم معطل." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "مودم ماناجر" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "مراقب" @@ -5089,6 +5664,10 @@ msgstr "تحرك لأسفل" msgid "Move up" msgstr "تحرك لأعلى" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5096,19 +5675,23 @@ msgstr "تحرك لأعلى" msgid "Multicast" msgstr "متعدد" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5120,12 +5703,16 @@ msgstr "وضع NAT-T" msgid "NAT64 Prefix" msgstr "بادئة NAT64" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5138,18 +5725,23 @@ msgid "NTP server candidates" msgstr "المرشحين لخادم NTP" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "اسم" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "اسم الشبكة الجديدة" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "التنقل" @@ -5158,13 +5750,17 @@ msgstr "التنقل" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5173,32 +5769,36 @@ msgstr "" msgid "Network" msgstr "شبكة الاتصال" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "l SSIDلشبكة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "مرافق الشبكة" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "صورة تمهيد الشبكة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5211,7 +5811,7 @@ msgstr "نشاط جهاز الشبكة (kernel: netdev)" msgid "Network device is not present" msgstr "جهاز الشبكة غير موجود" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5220,7 +5820,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5229,15 +5829,21 @@ msgstr "" msgid "Network interface" msgstr "واجهة الشبكة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "أبدا" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "أبدا" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5245,11 +5851,11 @@ msgstr "" "مواصفات المجال المحلي. لا يتم إعادة توجيه الأسماء المطابقة لهذا المجال مطلقًا " "ويتم حلها من خلال DHCP أو ملفات المضيفين فقط" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "لا يمكن إنشاء واجهة جديدة ل \"%s%: \"s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "اسم الواجهة الجديد …" @@ -5257,13 +5863,13 @@ msgstr "اسم الواجهة الجديد …" msgid "Next »" msgstr "التالي \"" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "لا" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "لم يتم تكوين خادم DHCP لهذه الواجهة" @@ -5271,7 +5877,7 @@ msgstr "لم يتم تكوين خادم DHCP لهذه الواجهة" msgid "No Data" msgstr "لايوجد بيانات" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "لا يوجد تشفير" @@ -5287,9 +5893,17 @@ msgstr "لا يوجد NAT-T" msgid "No RX signal" msgstr "لا توجد إشارة RX" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5300,7 +5914,11 @@ msgstr "" msgid "No client associated" msgstr "لا يوجد عميل مرتبط" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5309,8 +5927,8 @@ msgstr "" msgid "No data received" msgstr "لم تستلم أية بيانات" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5323,15 +5941,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "لا توجد إدخالات في هذا الدليل" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "لا توجد ملفات" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5345,7 +5959,7 @@ msgstr "" msgid "No host route" msgstr "لا يوجد مسار مضيف" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5366,30 +5980,40 @@ msgstr "لا مزيد من المستخدمين متاحين" msgid "No more slaves available, can not save interface" msgstr "لا مزيد من المستخدمين متاحين ، لا يمكن حفظ الواجهة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "لا توجد ذاكرة تخزين مؤقت سلبية" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "لم يتم تعيين كلمة مرور!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "غير متصل" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "لا توجد مفاتيح عمومية حتى الآن." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5403,7 +6027,8 @@ msgid "No validation or filtering" msgstr "لا يوجد تحقق من الصحة أو التصفية" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "لم يتم تعيين منطقة" @@ -5415,37 +6040,40 @@ msgstr "لم يتم تعيين منطقة" msgid "Noise" msgstr "التشويش" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "هامش التشويش (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "التشويش:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "أخطاء CRC غير استباقية (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "غير البدل" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "لاشيء" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "عادي" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "غير موجود" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "ليس مرتبط" @@ -5458,7 +6086,7 @@ msgstr "غير متصل" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "غير موجود" @@ -5470,7 +6098,7 @@ msgstr "لم تبدأ في التمهيد" msgid "Not supported" msgstr "غير مدعوم" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5478,6 +6106,12 @@ msgstr "" "ملاحظة: بعض برامج تشغيل اللاسلكية لا تدعم 802.11w بشكل كامل. على سبيل المثال " "قد تواجه مشاكل mwlwifi" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5486,7 +6120,7 @@ msgstr "" msgid "Notice" msgstr "ملاحضة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5494,7 +6128,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "عدد تقارير عضوية IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "عدد إدخالات DNS المخزنة مؤقتًا (الحد الأقصى 10000 ، 0 لا يوجد تخزين مؤقت)" @@ -5512,7 +6146,7 @@ msgid "Obfuscated Password" msgstr "كلمة المرور المبهمة" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5523,6 +6157,7 @@ msgid "Obtain IPv6 address" msgstr "الحصول على عنوان IPv6" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "مغلق" @@ -5531,6 +6166,12 @@ msgstr "مغلق" msgid "Off-State Delay" msgstr "تأخير خارج الحالة" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "مفتوح" @@ -5539,15 +6180,15 @@ msgstr "مفتوح" msgid "On-State Delay" msgstr "حالة التأخير" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "طريق على الارتباط" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "يجب تحديد اسم مضيف أو عنوان mac!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "واحد مما يلي: s%" @@ -5565,7 +6206,11 @@ msgstr "واحد أو أكثر من القيم غير الصالحة / المط msgid "One or more required fields have no value!" msgstr "واحد أو أكثر من الحقول المطلوبة ليس لها قيمة!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5574,49 +6219,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "فقط إذا فشل العبد النشط الحالي وارتفع العبد الأساسي (فشل ، 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "فتح القائمة ..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "تردد التشغيل" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "يحتوي الخيار \" s%\" على قيمة إدخال غير صالحة." @@ -5624,22 +6280,31 @@ msgstr "يحتوي الخيار \" s%\" على قيمة إدخال غير صال msgid "Option \"%s\" must not be empty." msgstr "يجب ألا يكون الخيار \" s%\" فارغًا." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "تغير الخيار" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "تمت إزالة الخيار" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "خياري" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5648,7 +6313,7 @@ msgstr "" "خياري. علامة 32 بت للحزم المشفرة الصادرة. أدخل قيمة سداسية عشرية ، بدءًا من " "0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5659,7 +6324,7 @@ msgstr "" "1: 2'. عند استلام بادئة IPv6 (مثل \"a: b: c: d ::\") من خادم مفوض ، استخدم " "اللاحقة (مثل \":: 1\") لتشكيل عنوان IPv6 ('a: b: c: d: : 1 ') للواجهة." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5667,11 +6332,11 @@ msgstr "" "خياري. مفتاح مشفر باستخدام Base64. يضيف طبقة إضافية من تشفير المفتاح " "المتماثل لمقاومة ما بعد الكم." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "خياري. إنشاء مسارات لعناوين IP المسموح بها لهذا النظير." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "خياري. وصف الأقران." @@ -5679,13 +6344,13 @@ msgstr "خياري. وصف الأقران." msgid "Optional. Do not create host routes to peers." msgstr "خياري. لا تقم بإنشاء مسارات مضيفة للأقران." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "خياري. مضيف الأقران. يتم حل الأسماء قبل إحضار الواجهة." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5700,11 +6365,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "خياري. وحدة النقل القصوى لواجهة النفق." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "خياري. بوابة الأقران." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5712,7 +6377,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5728,7 +6393,7 @@ msgstr "خياري. يستخدم منفذ UDP للحزم الصادرة والو msgid "Options" msgstr "خيارات" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "المسار إلى CA-Certificate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "مسار شهادة العميل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "المسار إلى المفتاح الخاص" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "المسار إلى شهادة CA الداخلية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "المسار إلى شهادة العميل الداخلية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "المسار إلى المفتاح الخاص الداخلي" @@ -6100,11 +6814,20 @@ msgstr "متوقف مؤقتًا" msgid "Peak:" msgstr "قمة:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +#, fuzzy +msgid "Peer" +msgstr "الأقران" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "عنوان IP النظير المراد تعيينه" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -6113,11 +6836,11 @@ msgstr "" msgid "Peer address is missing" msgstr "عنوان النظير مفقود" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6148,10 +6871,14 @@ msgstr "إجراء إعادة تعيين" msgid "Permission denied" msgstr "طلب الاذن مرفوض" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "مثابرة على البقاء حيا" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6160,13 +6887,13 @@ msgstr "" msgid "Phy Rate:" msgstr "المعدل المادي:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "الإعدادات المادية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "ping" @@ -6179,11 +6906,11 @@ msgstr "ping" msgid "Pkts." msgstr "الحزم." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "الرجاء إدخال اسم المستخدم وكلمة المرور الخاصة بك." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "الرجاء تحديد الملف المراد تحميله." @@ -6191,56 +6918,75 @@ msgstr "الرجاء تحديد الملف المراد تحميله." msgid "Policy" msgstr "سياسة" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "المنفذ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "المنفذ" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "حالة المنفذ:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "النفي المحتمل ل: s%" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "وضع إدارة الطاقة" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "أخطاء CRC الاستباقية (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "LTE المفضل" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "UMTS المفضل" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "تفويض البادئة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "مفتاح مشترك مسبقًا" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6265,15 +7011,16 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "يمنع الاتصال بين العميل والعميل" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "المستخدم الأساسي" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6286,29 +7033,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "يصبح الأساسي مستخدماً نشطًا كلما ظهر مرة أخرى (دائمًا ، 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "مفتاح سري" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6326,8 +7075,8 @@ msgid "Prot." msgstr "بروتوكول" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6339,13 +7088,13 @@ msgstr "بروتوكول" msgid "Provide NTP server" msgstr "توفير خادم NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "توفير شبكة جديدة" @@ -6355,25 +7104,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "المفتاح العمومي" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6401,61 +7161,85 @@ msgstr "QMI الخلوية" msgid "Quality" msgstr "جودة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" "الاستعلام عن جميع خوادم المنبع المتاحة DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "مفتاح RO دائم" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "حامل مفتاح R1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "منفد محاسبة -راديوس" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Radius- محاسبة- سر" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "خادم المحاسبة Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "منفذ مصادقة Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Radius- المصادقة السرية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "خادم مصادقة Radius" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "وضع RFC3947 NAT-T" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "حد RSSI للانضمام" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "عتبة RTS / CTS" @@ -6468,10 +7252,16 @@ msgstr "RX" msgid "RX Rate" msgstr "معدل RX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "معدل RX / معدل الإرسال" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6482,13 +7272,13 @@ msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" "بايت خام بترميز سداسي عشري. اتركه فارغًا ما لم يطلب مزود خدمة الإنترنت ذلك" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" "اقرأ /etc/ethers لتكوين الخادم DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "حقا تبديل البروتوكول؟" @@ -6496,11 +7286,11 @@ msgstr "حقا تبديل البروتوكول؟" msgid "Realtime Graphs" msgstr "الرسوم البيانية في الوقت الفعلي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "الموعد النهائي لإعادة التجمع" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "إعادة ربط الحماية" @@ -6524,11 +7314,40 @@ msgstr "يعيد تشغيل نظام تشغيل جهازك" msgid "Receive" msgstr "استقبل" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "استقبل" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "موصى به. عناوين IP لواجهة WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "أعد توصيل هذه الواجهة" @@ -6536,12 +7355,12 @@ msgstr "أعد توصيل هذه الواجهة" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6550,37 +7369,47 @@ msgstr "" msgid "References" msgstr "مراجع" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "تجديد" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "تناوب" @@ -6590,6 +7419,10 @@ msgstr "تناوب" msgid "Relay Bridge" msgstr "جسر التتابع" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "التناوب بين الشبكات" @@ -6599,6 +7432,14 @@ msgstr "التناوب بين الشبكات" msgid "Relay bridge" msgstr "جسر التناوب" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6608,6 +7449,7 @@ msgstr "عنوان IPv4 البعيد" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "عنوان IPv4 البعيد أو FQDN" @@ -6620,15 +7462,23 @@ msgstr "عنوان IPv6 البعيد" msgid "Remote IPv6 address or FQDN" msgstr "عنوان IPv6 البعيد أو FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "نزع" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "استبدل التكوين اللاسلكي" @@ -6658,7 +7508,8 @@ msgstr "يتطلب المجموع الاختباري الوارد (اختيار msgid "Require incoming packets serialization (optional)." msgstr "طلب تسلسل الحزم الواردة (اختياري)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "مطلوب" @@ -6674,7 +7525,7 @@ msgstr "مطلوب. المفتاح الخاص بترميز Base64 لهذه ال msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6686,67 +7537,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "يتطلب هوستابد" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "يتطلب hostapd مع دعم EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "يتطلب hostapd مع دعم EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "يتطلب hostapd مع دعم OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "يتطلب hostapd بدعم SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "يتطلب hostapd مع دعم WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "يتطلب wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "يتطلب wpa-supplicant مع دعم EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "يتطلب wpa-supplicant مع دعم EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "يتطلب wpa-supplicant مع دعم OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "يتطلب wpa-supplicant مع دعم SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "يتطلب wpa-supplicant مع دعم WEP" @@ -6755,7 +7612,7 @@ msgid "Reselection policy for primary slave" msgstr "سياسة إعادة الاختيار للمستخدم الأساسي" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6770,20 +7627,24 @@ msgstr "إعادة تعيين العدادات" msgid "Reset to defaults" msgstr "إعادة التعيين إلى الإعدادات الافتراضية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "لمفات resolv و hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "ملف resolve" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "قائمة المجالات التي سيتم فرضها على عنوان IP." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "الموارد غير موجود" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "إعادة تشغيل" @@ -6792,7 +7653,7 @@ msgstr "إعادة تشغيل" msgid "Restart Firewall" msgstr "أعد تشغيل جدار الحماية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "أعد تشغيل واجهة الراديو" @@ -6804,7 +7665,7 @@ msgstr "إعادة" msgid "Restore backup" msgstr "استرجاع النسخة الاحتياطية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -6812,80 +7673,91 @@ msgstr "" "ابحث عن اسم المضيف بناءً على الشبكة الفرعية المطلوبة في حالة توفر عدة عناوين " "IP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "كشف / إخفاء كلمة المرور" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "يرجع" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "التغيرات المرتدة" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "فشل طلب العودة مع الحالة h% " -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "جارٍ إعادة التكوين …" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6900,19 +7772,19 @@ msgstr "تحضير الجذر" msgid "Round-Robin policy (balance-rr, 0)" msgstr "سياسة Round-Robin (Balance-rr، 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "توجيه عناوين IP المسموح بها" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "نوع الطريق" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6930,6 +7802,10 @@ msgstr "كلمة مرور جهاز التوجيه" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6943,24 +7819,24 @@ msgstr "" msgid "Rule" msgstr "القاعدة" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6980,11 +7856,24 @@ msgstr "خطأ أثناء التشغيل" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7002,15 +7891,15 @@ msgstr "منفذ خادم SSH" msgid "SSH username" msgstr "اسم مستخدم SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "مفاتيح SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7027,7 +7916,7 @@ msgstr "خادم SSTP" msgid "SWAP" msgstr "ذاكرة المبادلة" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7038,7 +7927,7 @@ msgid "Save" msgstr "إحفض" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "حفظ وتطبيق" @@ -7055,7 +7944,7 @@ msgstr "حفظ mtdblock" msgid "Save mtdblock contents" msgstr "حفظ محتويات mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "مسح" @@ -7064,11 +7953,16 @@ msgstr "مسح" msgid "Scheduled Tasks" msgstr "المهام المجدولة" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "تمت إضافة القسم" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "تمت إزالة القسم" @@ -7085,9 +7979,9 @@ msgstr "" "حدد \"فرض الترقية\" وميض الصورة حتى إذا فشل فحص تنسيق الصورة. استخدمه فقط " "إذا كنت متأكدًا من أن البرنامج الثابت صحيح ومخصص لجهازك!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "حدد ملفًا …" @@ -7095,13 +7989,13 @@ msgstr "حدد ملفًا …" msgid "Selects the transmit hash policy to use for slave selection" msgstr "يحدد سياسة تجزئة الإرسال لاستخدامها في التحديد التابع" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -7122,11 +8016,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "أرسل اسم مضيف هذا الجهاز" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7151,16 +8049,20 @@ msgstr "انتهت الجلسة" msgid "Set Static" msgstr "تعيين ثابت" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7172,14 +8074,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "قم بتعيين نفس عنوان MAC لجميع المستخدمين" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7193,11 +8095,15 @@ msgstr "تعيين إلى تابع نشط حاليًا (نشط ، 1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "اضبط على المستخدم الأول المضاف إلى السند (اتبع ، 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "إعداد خادم DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7205,33 +8111,37 @@ msgid "Setting PLMN failed" msgstr "فشل إعداد PLMN" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "فشل تحديد وضع التشغيل" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "الثواني التي بها أخطاء جسيمة (SES)" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "GI قصير" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "لمحة سريعة" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "إظهار قائمة ملفات النسخ الاحتياطي الحالية" @@ -7244,16 +8154,16 @@ msgstr "عرض سلاسل فارغة" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "اغلاق هذه الواجهة" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7261,15 +8171,15 @@ msgstr "اغلاق هذه الواجهة" msgid "Signal" msgstr "الإشارة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "إشارة / تشويش" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "توهين الإشارة (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "معدل تحديث الإشارة" @@ -7277,12 +8187,12 @@ msgstr "معدل تحديث الإشارة" msgid "Signal:" msgstr "الإشارة:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "مقاس" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "حجم ذاكرة التخزين المؤقت لاستعلام DNS" @@ -7299,12 +8209,12 @@ msgstr "تخطى" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "تخطى الى المحتوى" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "تخطي إلى التصفح" @@ -7322,14 +8232,10 @@ msgstr "برنامج VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "بعض الحقول غير صالحة ، لا يمكن حفظ القيم!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "عذرا ، الشيء الذي طلبته لم يتم العثور عليه." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "عذرا ، واجه الخادم خطأ غير متوقع." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7339,8 +8245,8 @@ msgstr "" "عذرًا ، لا يوجد دعم لترقية النظام ؛ يجب أن تومض صورة البرنامج الثابت الجديدة " "يدويًا. يرجى الرجوع إلى wiki للحصول على إرشادات التثبيت الخاصة بالجهاز." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7367,26 +8273,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7413,7 +8319,7 @@ msgstr "يحدد عناوين IP لاستخدامها في مراقبة ARP" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "يحدد تردد مراقبة ارتباط MII بالمللي ثانية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7421,7 +8327,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "يحدد منطق اختيار التجميع المراد استخدامه" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7429,20 +8335,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "يحدد الدليل الذي يتصل به الجهاز" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7473,7 +8379,7 @@ msgid "" "dead" msgstr "يحدد الحد الأقصى لمقدار الثواني التي يُفترض أن المضيفين قد نتهو بعدها" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7493,7 +8399,7 @@ msgstr "يحدد الحد الأدنى لعدد الروابط التي يجب msgid "Specifies the mode to be used for this bonding interface" msgstr "يحدد الوضع الذي سيتم استخدامه لواجهة هدى الرابط" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7530,15 +8436,15 @@ msgid "" msgstr "" "يحدد عدد الثواني بين الحالات التي يرسل فيها سائق الربط حزم التعلم إلى كل تابع" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7562,19 +8468,19 @@ msgstr "" "يحدد سياسة إعادة التحديد للتابع الأساسي عند حدوث فشل التابع النشط أو استرداد " "التابع الأساسي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7598,7 +8504,7 @@ msgstr "" "يحدد الوقت بالمللي ثانية للانتظار قبل تمكين التابع بعد اكتشاف استرداد " "الارتباط" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7705,15 +8611,23 @@ msgid "" "bytes)." msgstr "حدد MTU (الحد الأقصى لوحدة الإرسال) بخلاف الافتراضي (1280 بايت)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "حدد مفتاح التشفير السري هنا." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "بداية" @@ -7726,16 +8640,16 @@ msgstr "ابدأ WPS" msgid "Start priority" msgstr "أولوية البدء" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "ابدأ التحديث" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "بدء تطبيق التكوين …" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "بدء المسح اللاسلكي ..." @@ -7744,6 +8658,10 @@ msgstr "بدء المسح اللاسلكي ..." msgid "Startup" msgstr "أبدء" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "مسارات IPv4 الثابتة" @@ -7757,7 +8675,7 @@ msgstr "مسارات IPv6 الثابتة" msgid "Static Lease" msgstr "إيجار ثابت" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "الإيجارات الثابتة" @@ -7767,7 +8685,7 @@ msgstr "الإيجارات الثابتة" msgid "Static address" msgstr "عنوان ثابت" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7777,18 +8695,18 @@ msgstr "" "DHCP. كما أنها مطلوبة أيضًا لتكوينات الواجهة غير الديناميكية حيث يتم تقديم " "المضيفين الذين لديهم إيجار مطابق فقط." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "حد عدم نشاط المحطة" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "الحالة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "قف" @@ -7797,8 +8715,8 @@ msgstr "قف" msgid "Stop WPS" msgstr "وقف WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "توقف عن التحديث" @@ -7806,11 +8724,11 @@ msgstr "توقف عن التحديث" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "ترتيب صارم" @@ -7819,15 +8737,15 @@ msgid "Strong" msgstr "متين" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "أرسل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "قم بإلغاء التسجيل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "قم بإيقاف تسجيل العملية الروتينية لهذه البروتوكولات" @@ -7858,7 +8776,7 @@ msgstr "محول VLAN" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "بروتوكول التبديل" @@ -7868,7 +8786,7 @@ msgstr "بروتوكول التبديل" msgid "Switch to CIDR list notation" msgstr "قم بالتبديل إلى تدوين قائمة CIDR" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "ارتباط رمزي" @@ -7880,8 +8798,16 @@ msgstr "مزامنة مع خادم NTP" msgid "Sync with browser" msgstr "تزامن مع المتصفح" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7905,9 +8831,9 @@ msgstr "خصائص النظام" msgid "System log buffer size" msgstr "حجم المخزن المؤقت لسجل النظام" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7936,7 +8862,7 @@ msgstr "" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "جذر خادم TFTP" @@ -7949,26 +8875,37 @@ msgstr "بث" msgid "TX Rate" msgstr "معدل الإرسال" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "جدول" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "هدف" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7984,26 +8921,26 @@ msgstr "" msgid "Terminate" msgstr "إنهاء" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8019,7 +8956,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8033,18 +8974,24 @@ msgstr "" "تم تغيير تكوين تحديث نقطة نهاية HE.net ، يجب عليك الآن استخدام اسم المستخدم " "العادي بدلاً من معرف المستخدم!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "عنوان IPv4 أو اسم المجال المؤهل بالكامل للطرف البعيد." @@ -8052,6 +8999,7 @@ msgstr "عنوان IPv4 أو اسم المجال المؤهل بالكامل ل #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "عنوان IPv4 أو اسم المجال المؤهل بالكامل لنهاية النفق البعيد." @@ -8066,6 +9014,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "عنوان IPv6 أو اسم المجال المؤهل بالكامل لنهاية النفق البعيد." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8076,7 +9030,7 @@ msgstr "عادةً ما تنتهي بادئة IPv6 المعينة للموفر msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -8093,21 +9047,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8119,13 +9077,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "تعذر تحميل ملف التكوين بسبب الخطأ التالي:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "يجب تحديد SSID الصحيح يدويًا عند الانضمام إلى شبكة لاسلكية مخفية" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8150,18 +9108,18 @@ msgstr "" "ملف الجهاز الخاص بالذاكرة أو القسم ((e.g. " "/dev/sda1))" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8181,7 +9139,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "القواعد التالية نشطة حاليًا على هذا النظام." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -8189,17 +9147,17 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "يجب ألا يكون عنوان البوابة عنوان IP محلي" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "تم بالفعل إضافة مفتاح SSH العمومي المحدد." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8207,15 +9165,31 @@ msgstr "" "مفتاح SSH العمومي المحدد غير صالح. يرجى تقديم مفاتيح RSA أو ECDSA العامة " "المناسبة." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "تم استخدام اسم الواجهة من قبل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "اسم الواجهة طويل جدًا" @@ -8238,6 +9212,7 @@ msgstr "عنوان IPv4 المحلي" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "عنوان IPv4 المحلي الذي تم إنشاء النفق من خلاله (اختياري)." @@ -8252,7 +9227,7 @@ msgstr "قناع شبكة IPv4 المحلي" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "عنوان IPv6 المحلي الذي تم إنشاء النفق من خلاله (اختياري)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8261,7 +9236,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8269,19 +9244,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "تم استخدام اسم الشبكة من قبل" @@ -8301,14 +9276,14 @@ msgstr "" "افتراضيًا للاتصال بالشبكة الأكبر التالية مثل الإنترنت والمنافذ الأخرى للشبكة " "المحلية." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8321,31 +9296,31 @@ msgstr "فشل أمر إعادة التشغيل مع الرمز %d" msgid "The restore command failed with code %d" msgstr "فشل أمر الاستعادة مع الرمز%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "وضع%s المحدد غير متوافق مع تشفير%s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "رمز الأمان المقدم غير صالح أو انتهت صلاحيته بالفعل!" @@ -8382,6 +9357,14 @@ msgstr "تم تغيير كلمة مرور النظام بنجاح." msgid "The sysupgrade command failed with code %d" msgstr "فشل أمر sysupgrade بالرمزs%" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8408,30 +9391,37 @@ msgstr "" "ملف الصورة الذي تم تحميله لا يحتوي على تنسيق مدعوم. تأكد من اختيار تنسيق " "الصورة العام للنظام الأساسي الخاص بك." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "لا توجد إيجارات نشطة" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "لا توجد تغييرات لتطبيقها" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8444,16 +9434,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "عنوان IPv4 الخاص بالمرحل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "لا ينطبق نوع المصادقة هذا على طريقة EAP المحددة." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "لا يبدو هذا كملف PEM صالح" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8471,6 +9461,17 @@ msgstr "" "هذا إما \"مفتاح التحديث\" الذي تم تكوينه للنفق أو كلمة مرور الحساب إذا لم " "يتم تكوين مفتاح التحديث" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8487,7 +9488,7 @@ msgstr "" "هذا هو عنوان نقطة النهاية المحلية المعين من قبل وسيط النفق ، وعادة ما ينتهي " "ب ...: 2/64 " -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "هذا هو DHCP " @@ -8517,8 +9518,8 @@ msgid "" "their status." msgstr "تقدم هذه القائمة نظرة عامة على عمليات النظام قيد التشغيل وحالتها" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "لا يمكن استخدام هذا الخيار نظرًا لعدم تثبيت حزمة ca-bundle." @@ -8533,31 +9534,39 @@ msgstr "لا يحتوي هذا القسم على قيم حتى الآن" msgid "Time Synchronization" msgstr "مزامنة الوقت" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "الفاصل الزمني لإعادة إدخال GTK" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "نفد وقته" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8565,17 +9574,13 @@ msgstr "" msgid "Timezone" msgstr "lلمنطقة الزمنية" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "لتسجيل الدخول…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8586,7 +9591,7 @@ msgstr "" "لإعادة تعيين البرنامج الثابت إلى حالته الأولية ، انقر فوق \"إجراء إعادة " "الضبط\" (هذا ممكن فقط مع صور squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "نغمة، رنه" @@ -8594,12 +9599,16 @@ msgstr "نغمة، رنه" msgid "Total Available" msgstr "مجموعه متاحة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "traceroute تتبع الطريق" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8611,11 +9620,11 @@ msgstr "حركة المرور" msgid "Traffic Class" msgstr "فئة المرور" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8632,6 +9641,27 @@ msgstr "بث" msgid "Transmit Hash Policy" msgstr "البث بسياسة التجزئة hash" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "بث" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8670,7 +9700,7 @@ msgstr "واجهة النفق" msgid "Tunnel Link" msgstr "رابط النفق" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8679,13 +9709,13 @@ msgid "Tx-Power" msgstr "قوة الإرسال" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "نوع" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8734,7 +9764,7 @@ msgstr "تعذر تحديد عنوان IP الخارجي" msgid "Unable to determine upstream interface" msgstr "تعذر تحديد واجهة المنبع" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "غير قادر على الإرسال" @@ -8785,19 +9815,31 @@ msgstr "غير قادر على إعادة تشغيل جدار الحماية: %s msgid "Unable to save contents: %s" msgstr "تعذر حفظ المحتويات: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "الثواني غير المتاحة (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "تنسيق بيانات رد غير متوقع" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8811,7 +9853,7 @@ msgstr "" msgid "Unknown" msgstr "مجهول" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "طريقة اتصال غير معروفة وغير مدعومة." @@ -8835,11 +9877,11 @@ msgstr "غير مُدار" msgid "Unmount" msgstr "قم بإلغاء التحميل" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "مفتاح بدون اسم" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "تغييرات غير محفوظة" @@ -8853,15 +9895,25 @@ msgid "Unsupported MAP type" msgstr "نوع MAP غير مدعوم" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "مودم غير مدعوم" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "نوع بروتوكول غير مدعوم." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8873,7 +9925,7 @@ msgstr "يشتغل" msgid "Up Delay" msgstr "تأخير التشغيل" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "تحميل" @@ -8890,25 +9942,29 @@ msgstr "" msgid "Upload archive..." msgstr "تحميل أرشيف ..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "رفع ملف" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "رفع ملف…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "فشل طلب التحميل: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "جارٍ تحميل الملف …" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -8917,33 +9973,37 @@ msgstr "" "عند الضغط على \"متابعة\" ، سيتم تعيين أقسام \"wifi-iface\" مجهولة باسم على " "الشكل wifinet # وستتم إعادة تشغيل الشبكة لتطبيق التكوين المحدث." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "DNS سيتم الاستعلام عن الخوادم " "بترتيب ملف resolv" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "مدة التشغيل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "استخدم / etc / ethers " +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "استخدم خوادم DHCP المعلن عنها" @@ -8952,13 +10012,18 @@ msgstr "استخدم خوادم DHCP المعلن عنها" msgid "Use DHCP gateway" msgstr "استخدم بوابة DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "استخدم خوادم DNS التي أعلن عنها الأقران" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "استخدم رموز البلدان ISO / IEC 3166 alpha2." @@ -9006,22 +10071,25 @@ msgstr "استخدم كنظام ملفات جذر (/)" msgid "Use broadcast flag" msgstr "استخدم علم البث" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "استخدم إدارة IPv6 المدمجة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "استخدم خوادم DNS المخصصة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "استخدم العبارة الافتراضية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "استخدام مقياس البوابة" @@ -9047,15 +10115,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "استخدم شهادات النظام" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "استخدم شهادات النظام للنفق الداخلي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9085,11 +10153,11 @@ msgstr "" msgid "Used" msgstr "مستخدم" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "فتحة مفتاح مستعملة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9097,59 +10165,61 @@ msgstr "" "يستخدم لغرضين مختلفين: RADIUS NAS ID و 802.11r R0KH-ID. غير مطلوب مع WPA " "العادي (2) -PSK." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "مجموعة المستخدمين" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "شهادة المستخدم (مشفرة PEM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "مفتاح المستخدم (مشفر PEM)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "اسم المستخدم" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "خط مشترك رقمي عالي السرعة VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -9169,24 +10239,27 @@ msgstr "عنوان VPN المحلي" msgid "VPN Local port" msgstr "منفذ VPN المحلي" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "بروتوكول VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "خادم VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "منفذ خادم VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "تجزئة SHA1 لشهادة خادم VPN" @@ -9195,6 +10268,10 @@ msgstr "تجزئة SHA1 لشهادة خادم VPN" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (وغيرها) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "شبكة محلية افتراضية قابلة للتوسيع VXLAN (RFC7348)" @@ -9208,7 +10285,7 @@ msgstr "معرف شبكة VXLAN" msgid "VXLANv6 (RFC7348)" msgstr "شبكة محلية افتراضية قابلة للتوسيع VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9216,8 +10293,8 @@ msgstr "" "يتطلب المنبع يدعم DNSSEC ؛ تحقق من أن استجابات المجال غير الموقعة تأتي " "بالفعل من المجالات غير الموقعة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9245,7 +10322,7 @@ msgstr "بائع" msgid "Vendor Class to send when requesting DHCP" msgstr "إرسال فئة البائع عند طلب DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9253,12 +10330,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "التحقق من ملف الصورة المرفوع." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "عالي جدا" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9266,34 +10343,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "واجهة ديناميكية افتراضية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "نظام التوزيع اللاسلكي WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "نظام WEP المفتوح" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "مفتاح WEP المشترك" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "عبارة مرور WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "شكل WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "عبارة مرور WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9322,19 +10411,61 @@ msgstr "تحذير: هناك تغييرات غير محفوظة ستضيع عن msgid "Weak" msgstr "ضعيف" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9343,7 +10474,7 @@ msgstr "" "عند استخدام PSK ، يمكن إنشاء PMK تلقائيًا. عند التمكين ، لا يتم تطبيق خيارات " "المفتاح R0 / R1 أدناه. قم بتعطيل هذا لاستخدام خيارات المفتاح R0 و R1." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9351,7 +10482,7 @@ msgstr "" "عندما يتم تعطيل جودة خدمة وضع وسائط Wi-Fi المتعددة (WMM) ، قد يتم تقييد " "العملاء بمعدلات 802.11a / 802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9360,16 +10491,27 @@ msgstr "" "كبير." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "عرض" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +#, fuzzy +msgid "WireGuard" +msgstr "شبكة خاصة افتراضية WireGuard VPN" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +#, fuzzy +msgid "WireGuard Status" +msgstr "حالة جدار الحماية" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "شبكة خاصة افتراضية WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9385,21 +10527,21 @@ msgid "Wireless Adapter" msgstr "محول الانترنت اللاسلكي" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "شبكة لاسلكية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "نظرة عامة على اللاسلكي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "الأمن اللاسلكي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "ترحيل التكوين اللاسلكي" @@ -9415,15 +10557,15 @@ msgstr "تم تعطيل اللاسلكي" msgid "Wireless is not associated" msgstr "اللاسلكي غير مرتبط" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "تم تعطيل الشبكة اللاسلكية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "تم تمكين الشبكة اللاسلكية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "اكتب طلبات DNS المستلمة إلى سجل النظام" @@ -9435,7 +10577,7 @@ msgstr "اكتب سجل النظام إلى ملف" msgid "XOR policy (balance-xor, 2)" msgstr "سياسة XOR (Balance-xor، 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9462,8 +10604,20 @@ msgstr "" "إعادة تشغيل الجهاز.
    تحذير: إذا عطلت البرامج النصية الأساسية " "للبادئ مثل \"الشبكة\" ، فقد يتعذر الوصول إلى جهازك! " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9492,34 +10646,54 @@ msgstr "إعدادات ZRam" msgid "ZRam Size" msgstr "حجم ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "أي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "تلقاءي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "أوتوماتيكي" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" -msgstr "baseT انتقال النطاق الأساسي بكابل ثنائي ملفوف" +msgstr "baseT انتقال النطاق الأساسي بكابل ثنائي ملفوف" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "جسر" @@ -9576,25 +10750,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "تعطيل" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "معطل" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "السائق الافتراضي" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "على سبيل المثال: - proxy 10.10.10.10" @@ -9603,14 +10782,23 @@ msgstr "على سبيل المثال: - proxy 10.10.10.10" msgid "e.g: dump" msgstr "على سبيل المثال: dump" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "منتهية الصلاحية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9620,22 +10808,22 @@ msgstr "" msgid "forward" msgstr "إلى الأمام" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "الازدواج الكامل" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "نصف مزدوج" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "قيمة مشفرة سداسية عشرية" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "مختفي" @@ -9644,9 +10832,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "الوضع الهجين" @@ -9654,6 +10842,10 @@ msgstr "الوضع الهجين" msgid "ignore" msgstr "تجاهل" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9668,11 +10860,19 @@ msgstr "مفتاح بين 8 و 63 حرفًا" msgid "key with either 5 or 13 characters" msgstr "مفتاح مكون من 5 أو 13 حرفًا" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "أمن متوسط" @@ -9681,11 +10881,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "دقائق" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9697,18 +10897,26 @@ msgstr "netif_carrier_ok()‎" msgid "no" msgstr "لا" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "لا يوجد ارتباط" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "قيمة غير فارغة" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "لا شيء" @@ -9719,20 +10927,20 @@ msgid "not present" msgstr "غير موجود" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "إيقاف" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "شبكة مفتوحة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9741,6 +10949,10 @@ msgstr "" msgid "output" msgstr "الحاصل" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9758,23 +10970,32 @@ msgstr "قيمة عدد صحيح موجب" msgid "random" msgstr "عشوائي" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "وضع التتابع" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "موجه" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "ثواني" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "وضع الخادم" @@ -9782,7 +11003,7 @@ msgstr "وضع الخادم" msgid "sstpc Log-level" msgstr "مستوى السجل sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "أمان قوي" @@ -9790,7 +11011,7 @@ msgstr "أمان قوي" msgid "tagged" msgstr "موسومة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "الوحدات الزمنية (TUs / 1.024 مللي ثانية) [1000-65535]" @@ -9801,25 +11022,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "قيمة فريدة" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "غير معروف" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "غير محدود" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9841,8 +11064,8 @@ msgid "untagged" msgstr "بدون علامات" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "عنوان IP صالح" @@ -9855,7 +11078,7 @@ msgid "valid IPv4 CIDR" msgstr "IPv4 CIDR صالح" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "عنوان IPv4 صالح" @@ -9884,7 +11107,7 @@ msgid "valid IPv6 CIDR" msgstr "IPv6 CIDR صالح" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "عنوان IPv6 صالح" @@ -9921,8 +11144,8 @@ msgstr "معرف UCI صالح أو اسم مضيف أو عنوان IP" msgid "valid address:port" msgstr "عنوان صالح: المنفذ" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "تاريخ صالح (YYYY-MM-DD)" @@ -9962,11 +11185,21 @@ msgstr "قيمة عدد صحيح" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "شبكة صالحة في تدوين العنوان / قناع الشبكة" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "رقم هاتف صالح (0-9 ، \"*\" ، \"#\" ، \"!\" أو \".\")" @@ -9976,43 +11209,43 @@ msgid "valid port or port range (port1-port2)" msgstr "منفذ أو نطاق منفذ صالح (port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "قيمة منفذ صالحة" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "الوقت الصالح (HH: MM: SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "قيمة بين %d و%d حرفًا" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "قيمة بين %f و %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "قيمة أكبر من أو تساوي %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "قيمة أصغر من أو تساوي %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "قيمة تحتوي على d% حرفًا" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "قيمة تحتوي على d% حرفًا على الأقل" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "قيمة تحتوي على d% حرفًا كحد أقصى" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "ضعيف الأمن" diff --git a/package/luci/modules/luci-base/po/bg/base.po b/package/luci/modules/luci-base/po/bg/base.po index 442534440a..958c3448cb 100644 --- a/package/luci/modules/luci-base/po/bg/base.po +++ b/package/luci/modules/luci-base/po/bg/base.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "PO-Revision-Date: 2021-10-06 21:07+0000\n" "Last-Translator: Iskren Mihaylov \n" -"Language-Team: Bulgarian \n" "Language: bg\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -10,23 +10,39 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.9-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Бита" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d невалидни полета" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%dh преди" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%dm преди" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%ds преди" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s е \"нетагнат\" в множество VLAN-и!" @@ -51,10 +67,11 @@ msgstr "(празно)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(няма закачени интерфейси)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "" @@ -64,19 +81,19 @@ msgid "-- Additional Field --" msgstr "-- Допълнително поле --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Моля изберете --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- персонализиран --" @@ -102,7 +119,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" @@ -115,13 +132,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "1 Минутно натоварване:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "" msgstr[1] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "15 Минутно натоварване:" @@ -136,12 +158,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "" @@ -154,43 +181,98 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "5 Минутно Натоварване:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-Мрежова маска" @@ -202,30 +284,42 @@ msgstr "LED Настройка" msgid "LED Name" msgstr "LED Име" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-Прокси" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA Флагове" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA Хоп лимит" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA Живот" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-Сървис" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -271,11 +365,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Конфигурация за устройството „%s“ вече съществува" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Вече съществува директория със същото име." @@ -284,25 +386,90 @@ msgid "A new login is required since the authentication session expired." msgstr "" "Необходимо е ново влизане, тъй като сесията за удостоверяване е изтекла." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -335,55 +502,58 @@ msgstr "ARP мониторингът не се поддържа за избра msgid "ARP retry threshold" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " "to dial into the provider network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "" @@ -392,7 +562,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -400,16 +570,25 @@ msgstr "" msgid "Access Concentrator" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Точка за достъп" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Действия" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Активен" @@ -447,8 +626,8 @@ msgstr "" msgid "Active-Backup policy (active-backup, 1)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -465,18 +644,18 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "" @@ -496,11 +675,11 @@ msgstr "" msgid "Add VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "" @@ -508,18 +687,18 @@ msgstr "" msgid "Add instance" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "" @@ -527,6 +706,10 @@ msgstr "" msgid "Add peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "" @@ -535,11 +718,11 @@ msgstr "" msgid "Add to Whitelist" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "" @@ -556,7 +739,11 @@ msgstr "" msgid "Address" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -569,7 +756,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "" @@ -578,28 +765,28 @@ msgstr "" msgid "Administration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Разширени настройки" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 @@ -634,17 +821,17 @@ msgstr "" msgid "Alias of \"%s\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "" @@ -652,11 +839,11 @@ msgstr "" msgid "Allow SSH password authentication" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "" @@ -664,15 +851,15 @@ msgstr "" msgid "Allow full UCI access for legacy applications" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "" @@ -693,19 +880,24 @@ msgid "Allow system feature probing" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Разрешаване на потребителя root да влезе с парола" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Разрешени IPs" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "" @@ -717,20 +909,24 @@ msgstr "" msgid "Always on (kernel: default-on)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "" @@ -739,98 +935,47 @@ msgstr "" msgid "An optional, short description for this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "" @@ -842,7 +987,7 @@ msgstr "" msgid "Anonymous Swap" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -854,11 +999,11 @@ msgstr "" msgid "Any zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -866,44 +1011,48 @@ msgstr "" msgid "Apply backup?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Архитектура" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "" @@ -912,15 +1061,15 @@ msgstr "" msgid "Associations" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -930,25 +1079,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "" @@ -956,7 +1106,9 @@ msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -974,7 +1126,7 @@ msgstr "" msgid "Automatically check filesystem for errors before mounting" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -996,6 +1148,10 @@ msgstr "" msgid "Automount Swap" msgstr "" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Налични" @@ -1014,11 +1170,15 @@ msgstr "Налични" msgid "Average:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1026,15 +1186,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "" @@ -1043,11 +1207,7 @@ msgstr "" msgid "Back to Overview" msgstr "Обратно към Общ преглед" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Обратно към Конфигуриране" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1060,16 +1220,15 @@ msgid "Backup / Flash Firmware" msgstr "Архивиране / Флаш на фърмуера" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Списък с файлове за архивиране" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Честота" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Базово устройство" @@ -1077,12 +1236,35 @@ msgstr "Базово устройство" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1096,7 +1278,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "Свързване динамично с интерфейси, а не със wildcard адрес (препоръчва се по " @@ -1107,18 +1289,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Свързване на интерфейс" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1130,65 +1325,77 @@ msgstr "" msgid "Bitrate" msgstr "Битрейт" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Бридж" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Бридж (Поддържа директна комуникация между MAC VLAN-и)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Филтриране на Бридж VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Бридж устройство" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "Специфични опции за порт на Бридж" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Бридж портове" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Номер на у-во в Бридж" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Пусни празен бридж" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Пусни при стартиране" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "Вдигнае на бриджа дори при липса на закачени портове" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Броудкаст политика (броудкаст, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Преглед…" @@ -1196,14 +1403,36 @@ msgstr "Преглед…" msgid "Buffered" msgstr "Буферирана" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Използване на процесора (%)" @@ -1218,18 +1447,23 @@ msgstr "Кеширана" msgid "Call failed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Отмени" @@ -1237,32 +1471,32 @@ msgstr "Отмени" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1271,45 +1505,53 @@ msgstr "" msgid "Category" msgstr "Категория" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Ограничение на сертификата (домейн)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Ограничение на сертификата (Относно)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Ограничение на сертификата (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1321,16 +1563,16 @@ msgstr "" msgid "Chain" msgstr "Чейн" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Промени" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Промените бяха върнати." @@ -1341,18 +1583,19 @@ msgstr "Променя администраторската парола за д #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Канал" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Анализ на канала" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Ширина на канала" @@ -1360,7 +1603,7 @@ msgstr "Ширина на канала" msgid "Check filesystems before mount" msgstr "Проверка на файловите системи преди монтиране" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" "Отбележете тази опция, за да изтриете съществуващите мрежи от това радио." @@ -1378,8 +1621,8 @@ msgstr "Проверка на изображението…" msgid "Choose mtdblock" msgstr "Изберете mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1390,7 +1633,7 @@ msgstr "" "unspecified за да премахнете интерфейса от зоната или попълнете " "custom полето, за да дефинирате нова зона и да я прикачите." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1398,7 +1641,7 @@ msgstr "" "Изберете мрежата(е), които да закачите към този безжичен интерфейс или " "попълнете custom, за да дефинирате нова мрежа." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Шифър" @@ -1422,9 +1665,10 @@ msgstr "" "Кликнете върху „Запазване на mtdblock“, за да изтеглите посочения mtdblock " "файл. (ЗАБЕЛЕЖКА: ТАЗИ ОПЦИЯ Е ЗА ПРОФЕСИОНАЛИСТИ!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Клиент" @@ -1433,9 +1677,9 @@ msgstr "Клиент" msgid "Client ID to send when requesting DHCP" msgstr "ИД на клиент за изпращане при заявяване на DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Затвори" @@ -1452,20 +1696,20 @@ msgstr "" "Затваряне на неактивна връзка след зададения брой секунди, използвайте 0, за " "да запазите връзката" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Затвори списъка..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Събиране данни..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Команда" @@ -1482,7 +1726,7 @@ msgstr "Командата се провали" msgid "Comment" msgstr "Коментар" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1501,29 +1745,28 @@ msgstr "Изчисляване на изходяща контролна сума msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Конфигурация" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Промените по конфигурацията са приложени." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Промените в конфигурацията са отменени!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Неуспешно конфигуриране" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1533,28 +1776,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Конфигуриране…" @@ -1566,9 +1809,10 @@ msgstr "Потвърждаване на прекъсване на връзкат msgid "Confirmation" msgstr "Потвърждаване" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Свързан" @@ -1578,11 +1822,11 @@ msgstr "Свързан" msgid "Connection attempt failed" msgstr "Опитът за свързване е неуспешен" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "Опитът за свързване е неуспешен." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1594,7 +1838,7 @@ msgstr "Връзката е загубена" msgid "Connections" msgstr "Връзки" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1622,9 +1866,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Съдържанието е записано." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1635,16 +1879,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1659,20 +1903,20 @@ msgstr "" msgid "Country" msgstr "Държава" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Код на страната" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Създаване/Закачане на зона на защитна стена" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Създай интерфейс" @@ -1684,7 +1928,7 @@ msgstr "Критично" msgid "Cron Log Level" msgstr "Ниво на дневника на Cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Текуща мощност" @@ -1723,31 +1967,31 @@ msgid "" "Diode\">LED
    s if possible." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "" @@ -1758,16 +2002,22 @@ msgstr "" msgid "DHCP client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "" @@ -1779,19 +2029,19 @@ msgstr "" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "Порт за заявки за DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" @@ -1799,7 +2049,7 @@ msgstr "" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "DNS тегло" @@ -1807,11 +2057,11 @@ msgstr "DNS тегло" msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1823,39 +2073,47 @@ msgstr "" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Получени данни" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Предадени данни" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1863,68 +2121,69 @@ msgstr "" msgid "Default state" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Изтрий" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Премахни ключ" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Неуспешна заявка за изтриване: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Изтриване на тази мрежа" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Описание" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Размаркирай" @@ -1932,11 +2191,11 @@ msgstr "Размаркирай" msgid "Design" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1971,9 +2230,9 @@ msgstr "Дестинейшън зона" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1983,36 +2242,40 @@ msgstr "Дестинейшън зона" msgid "Device" msgstr "Устройство" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Конфигурация на устройство" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Устройството не е активно" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Устройството се рестартира…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Име на устройството" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Устройството не се управлява от ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Устройството не е налично" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Тип на устройството" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Устройството е недостъпно!" @@ -2020,31 +2283,31 @@ msgstr "Устройството е недостъпно!" msgid "Device unreachable! Still waiting for device..." msgstr "Недостъпно устройство! Все още се изчаква устройството..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Устройства" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Диагностики" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Забрани" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2062,20 +2325,24 @@ msgstr "Забраняване на DNS справки" msgid "Disable Encryption" msgstr "Деактивиране на криптирането" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Забраняване на тази мрежа" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2084,35 +2351,34 @@ msgstr "Забраняване на тази мрежа" msgid "Disabled" msgstr "Забранен" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 #, fuzzy msgid "Disassociate On Low Acknowledgement" msgstr "Дисоцииране при ниско потвърждение" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Прекъсване" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 #, fuzzy msgid "Disconnection attempt failed" msgstr "Опитът за прекъсване на връзката е неуспешен" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Опитът за прекъсване е неуспешен." @@ -2122,29 +2388,41 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Затвори" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Оптимизиране на разстоянието" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Разстояние до най-отдалечения член на мрежата в метри." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP сървър и DNS препращач." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "Не кеширайте отрицателни отговори, например за несъществуващи домейни." @@ -2166,35 +2444,23 @@ msgstr "Не кеширайте отрицателни отговори, нап msgid "Do not create host route to peer (optional)." msgstr "Да не се създава маршрут към хост на партньор (по избор)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "Не препращай DNS заявки без точки или домейн части." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -#, fuzzy -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Не препращайте заявки, на които не може да се отговори от публичните " -"резолвери." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Не препращай обратно търсене за локални мрежи." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Да не се слуша на посочените интерфейси." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "Не предлагай DHCPv6 услуга на този интерфейс." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Не участвай" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2206,7 +2472,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Не изпращай име на хост" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2214,11 +2480,11 @@ msgstr "" "Не изпращай никакви RA съобщения на този интерфейс." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Наистина ли искате да изтриете %s ?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Наистина ли искате да изтриете следния SSH ключ?" @@ -2226,11 +2492,11 @@ msgstr "Наистина ли искате да изтриете следния msgid "Do you really want to erase all settings?" msgstr "Наистина ли искате да изтриете всички настройки?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Наистина ли искате да изтриете рекурсивно директорията \"%s\" ?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2238,15 +2504,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Изисква се домейн" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Бял списък на домейни" @@ -2272,11 +2540,11 @@ msgstr "Изтегли резервно копие" msgid "Download mtdblock" msgstr "Изтегляне на mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2290,16 +2558,54 @@ msgstr "Плъзнете, за да пренаредите" msgid "Drop Duplicate Frames" msgstr "Изпускане на дублиращи кадри" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Инстанция на Dropbear" @@ -2317,20 +2623,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Динамичен DHCP " -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2338,7 +2644,7 @@ msgstr "" msgid "Dynamic tunnel" msgstr "Динамичен тунел" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2346,22 +2652,34 @@ msgstr "" "Динамично разпределяне на DHCP адреси за клиенти. Ако е деактивирано, ще " "бъдат обслужвани само клиенти със статични адреси." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 #, fuzzy msgid "EA-bits length" msgstr "Дължина на EA-бита" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAP-метод" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Редактиране" @@ -2369,6 +2687,10 @@ msgstr "Редактиране" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 #, fuzzy msgid "" @@ -2378,11 +2700,11 @@ msgstr "" "Редактирайте необработените конфигурационни данни по-горе, за да отстраните " "всяка грешка и натиснете \"Save\", за да презаредите страницата." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Редактиране на тази мрежа" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Редактиране на безжична мрежа" @@ -2391,45 +2713,35 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 #, fuzzy msgid "Emergency" msgstr "Спешен случай" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Разрешаване" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 #, fuzzy msgid "" "Enable IGMP " @@ -2438,11 +2750,11 @@ msgstr "" "Активирайте на IGMP подслушване" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Разреши STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "Разреши SLAAC" @@ -2460,10 +2772,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Разрешаване на IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Разрешаване на iPv6 договаряне" @@ -2477,11 +2790,15 @@ msgstr "Разрешаване на iPv6 договаряне" msgid "Enable IPv6 negotiation on the PPP link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Активиране на Jumbo Frame passthrough" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "Активиране на изучаването на MAC адреси" @@ -2493,11 +2810,11 @@ msgstr "Разрешаване на NTP клиент" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Разрешаване на TFTP сървър" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Активиране на VLAN филтриране" @@ -2505,7 +2822,7 @@ msgstr "Активиране на VLAN филтриране" msgid "Enable VLAN functionality" msgstr "Активиране на VLAN функционалност" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Активиране на бутона WPS, изисква WPA(2)-PSK/WPA3-SAE" @@ -2516,12 +2833,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "" @@ -2538,24 +2855,24 @@ msgstr "Активиране на дублиране на входящи пак msgid "Enable mirroring of outgoing packets" msgstr "Активиране на дублиране на изходящи пакети" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Разрешаване на поддръжка на мултикаст" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2577,11 +2894,11 @@ msgstr "Активиране на поддръжката на мултикаст msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Разрешаване на тази мрежа" @@ -2590,27 +2907,36 @@ msgstr "Разрешаване на тази мрежа" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Разрешен" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Разрешава IGMP подслушване на този бридж" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Включва Spanning Tree протокола на този бридж" @@ -2618,25 +2944,30 @@ msgstr "Включва Spanning Tree протокола на този бридж msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Криптиране" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Крайна точка" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 #, fuzzy msgid "Endpoint Host" msgstr "Хост на крайна точка" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 #, fuzzy msgid "Endpoint Port" msgstr "Порт на крайна точка" @@ -2645,26 +2976,26 @@ msgstr "Порт на крайна точка" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 #, fuzzy msgid "Enforce IGMPv1" msgstr "Налагане на IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 #, fuzzy msgid "Enforce IGMPv2" msgstr "Налагане на IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 #, fuzzy msgid "Enforce IGMPv3" msgstr "Налагане на IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2693,10 +3024,6 @@ msgstr "Грешка" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2715,38 +3042,52 @@ msgstr "На всеки 30 секунди (бавно, 0)" msgid "Every second (fast, 1)" msgstr "Всяка секунда (бързо, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Изключване на интерфейси" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Съществуващо устройство" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 #, fuzzy msgid "Expand hosts" msgstr "Разгъване на хостове" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Очакване на валиден IPv4 адрес" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Очакване на валиден IPv6 адрес" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Очакване на две стойности на приоритет, разделени с двоеточие" @@ -2755,11 +3096,11 @@ msgstr "Очакване на две стойности на приоритет, #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 #, fuzzy msgid "Expecting: %s" msgstr "Очакване: %s" @@ -2773,7 +3114,7 @@ msgstr "Очакване: непразна стойност" msgid "Expires" msgstr "Изтича" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2782,11 +3123,11 @@ msgstr "" msgid "External" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2814,58 +3155,86 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "" @@ -2874,12 +3243,20 @@ msgstr "" msgid "Filesystem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 -msgid "Filter private" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 @@ -2894,8 +3271,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2905,7 +3287,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "" @@ -2919,10 +3301,11 @@ msgid "Firewall" msgstr "Защитна стена" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "" @@ -2930,19 +3313,19 @@ msgstr "" msgid "Firewall Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Версия на firmware" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2968,40 +3351,48 @@ msgstr "" msgid "Flashing…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "" @@ -3013,11 +3404,11 @@ msgstr "" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3036,37 +3427,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "" @@ -3088,7 +3483,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "" @@ -3108,12 +3503,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "" @@ -3123,23 +3522,23 @@ msgstr "" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Основни настройки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3147,7 +3546,7 @@ msgstr "" msgid "Generate Config" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3155,11 +3554,11 @@ msgstr "" msgid "Generate archive" msgstr "Създай архив" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3167,15 +3566,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3187,39 +3586,40 @@ msgstr "" msgid "Global Settings" msgstr "Глобални настройки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Разрешаване достъп до DHCP статус екран" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3231,6 +3631,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3267,7 +3671,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3275,6 +3679,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3307,7 +3715,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Разрешаване достъп до екран с безжичен статус" @@ -3336,15 +3744,11 @@ msgstr "" msgid "Hang Up" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3354,7 +3758,7 @@ msgid "" "the timezone." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" @@ -3363,17 +3767,25 @@ msgstr "" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3383,7 +3795,7 @@ msgstr "" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3391,10 +3803,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3404,11 +3822,11 @@ msgstr "Хостнейм" msgid "Hostname to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3464,23 +3882,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3496,7 +3918,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3508,20 +3930,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "" @@ -3529,14 +3951,15 @@ msgstr "" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3552,7 +3975,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3562,7 +3985,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3589,7 +4012,7 @@ msgstr "" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Само IPv4" @@ -3602,11 +4025,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3615,16 +4038,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3635,7 +4062,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3643,7 +4071,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3651,7 +4079,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3659,15 +4091,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3681,12 +4113,12 @@ msgstr "" msgid "IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3698,11 +4130,11 @@ msgstr "" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Само IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3711,7 +4143,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "IPv6 префикс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3725,23 +4157,19 @@ msgstr "" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "IPv6-Съфикс(hex)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3749,6 +4177,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3764,10 +4196,16 @@ msgstr "" msgid "IPv6-over-IPv4 (6to4)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3780,13 +4218,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3803,21 +4241,23 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3831,15 +4271,23 @@ msgid "" "datarates of the RAM." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "" @@ -3851,25 +4299,25 @@ msgstr "" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3881,13 +4329,27 @@ msgstr "" msgid "In" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3917,7 +4379,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3925,6 +4387,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3943,22 +4406,21 @@ msgstr "" msgid "Information" msgstr "Информация" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3970,31 +4432,41 @@ msgstr "" msgid "Initscripts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4004,6 +4476,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4011,7 +4487,7 @@ msgstr "" msgid "Interface" msgstr "Интерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -4019,7 +4495,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "" @@ -4050,11 +4526,11 @@ msgstr "" msgid "Interface is shutting down..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -4063,12 +4539,12 @@ msgid "Interface name" msgstr "Име на интерфейса" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "" @@ -4077,22 +4553,26 @@ msgstr "" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4102,8 +4582,9 @@ msgid "Invalid" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4113,6 +4594,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4135,7 +4620,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4149,15 +4634,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Невалидно потребителско име и/или парола! Моля, опитайте отново." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "" @@ -4170,25 +4676,25 @@ msgstr "" "Изглежда, че се опитвате да флашнете фирмуеър, което не се побира във флаш " "паметта, моля, проверете файла с изображението!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4196,24 +4702,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Версия на ядрото" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "" @@ -4221,6 +4731,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4228,14 +4739,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4280,7 +4796,7 @@ msgstr "" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "" @@ -4297,32 +4813,39 @@ msgstr "" msgid "Language and Style" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "" @@ -4346,38 +4869,34 @@ msgstr "" msgid "Leave empty to use the current WAN address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4398,16 +4917,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4416,7 +4937,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4429,23 +4950,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4453,7 +4971,7 @@ msgstr "" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4463,7 +4981,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "" @@ -4472,7 +4990,7 @@ msgstr "" msgid "Load" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Средно натоварване" @@ -4480,27 +4998,28 @@ msgstr "Средно натоварване" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4520,11 +5039,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4540,44 +5060,70 @@ msgstr "" msgid "Local Startup" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Местно време" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "За вписване в системата…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "" @@ -4601,25 +5147,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4627,11 +5164,11 @@ msgstr "" msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "" @@ -4639,16 +5176,15 @@ msgstr "" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4657,11 +5193,15 @@ msgstr "" msgid "MAC address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "" @@ -4675,6 +5215,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4696,15 +5240,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4712,7 +5260,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4721,76 +5269,84 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Max. DHCP лийзове" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Макс. едновременни заявки" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4817,7 +5373,7 @@ msgstr "Памет" msgid "Memory usage (%)" msgstr "Използване на паметта (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4825,10 +5381,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4841,7 +5405,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4852,11 +5416,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4864,13 +5428,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4884,77 +5448,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Модел" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "" @@ -5024,6 +5595,10 @@ msgstr "" msgid "Move up" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5031,19 +5606,23 @@ msgstr "" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5055,12 +5634,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5073,18 +5656,23 @@ msgid "NTP server candidates" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "" @@ -5093,13 +5681,17 @@ msgstr "" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5108,32 +5700,36 @@ msgstr "" msgid "Network" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5146,7 +5742,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5155,7 +5751,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5164,25 +5760,31 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 +msgid "Never" +msgstr "Никога" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" msgid "Never" msgstr "Никога" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5190,13 +5792,13 @@ msgstr "" msgid "Next »" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "" @@ -5204,7 +5806,7 @@ msgstr "" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5220,9 +5822,17 @@ msgstr "" msgid "No RX signal" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5233,7 +5843,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5242,8 +5856,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5256,15 +5870,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5278,7 +5888,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5299,30 +5909,40 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "Не е свързан" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5336,7 +5956,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "" @@ -5348,37 +5969,40 @@ msgstr "" msgid "Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "" @@ -5391,7 +6015,7 @@ msgstr "Не е свързан" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5403,12 +6027,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5417,7 +6047,7 @@ msgstr "" msgid "Notice" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "" @@ -5425,7 +6055,7 @@ msgstr "" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5442,7 +6072,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5453,6 +6083,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "" @@ -5461,6 +6092,12 @@ msgstr "" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "" @@ -5469,15 +6106,15 @@ msgstr "" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5495,7 +6132,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5504,49 +6145,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5554,29 +6206,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5584,17 +6245,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5602,13 +6263,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5623,11 +6284,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5635,7 +6296,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5649,7 +6310,7 @@ msgstr "" msgid "Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -6019,11 +6725,19 @@ msgstr "" msgid "Peak:" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -6032,11 +6746,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6067,10 +6781,14 @@ msgstr "" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6079,13 +6797,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "" @@ -6098,11 +6816,11 @@ msgstr "" msgid "Pkts." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Моля, въведете потребителско име и парола." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6110,56 +6828,74 @@ msgstr "" msgid "Policy" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6182,13 +6918,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6201,29 +6938,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6241,8 +6980,8 @@ msgid "Prot." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6254,13 +6993,13 @@ msgstr "Протокол" msgid "Provide NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6270,25 +7009,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Публичен ключ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6317,59 +7067,83 @@ msgstr "" msgid "Quality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "" @@ -6382,10 +7156,16 @@ msgstr "" msgid "RX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6395,11 +7175,11 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "" @@ -6407,11 +7187,11 @@ msgstr "" msgid "Realtime Graphs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6435,11 +7215,40 @@ msgstr "" msgid "Receive" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Получени данни" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "" @@ -6447,12 +7256,12 @@ msgstr "" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6461,37 +7270,47 @@ msgstr "" msgid "References" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "" @@ -6501,6 +7320,10 @@ msgstr "" msgid "Relay Bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "" @@ -6510,6 +7333,14 @@ msgstr "" msgid "Relay bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6519,6 +7350,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6531,15 +7363,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Премахни" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "" @@ -6569,7 +7409,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6585,7 +7426,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6597,67 +7438,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6666,7 +7513,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6681,20 +7528,24 @@ msgstr "" msgid "Reset to defaults" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "" @@ -6703,7 +7554,7 @@ msgstr "" msgid "Restart Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6715,86 +7566,97 @@ msgstr "" msgid "Restore backup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6809,19 +7671,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6839,6 +7701,10 @@ msgstr "" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6851,24 +7717,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6888,11 +7754,24 @@ msgstr "" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6910,15 +7789,15 @@ msgstr "" msgid "SSH username" msgstr "SSH потребителско име" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6935,7 +7814,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6946,7 +7825,7 @@ msgid "Save" msgstr "Запази" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Запиши & Приложи" @@ -6963,7 +7842,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "" @@ -6972,11 +7851,16 @@ msgstr "" msgid "Scheduled Tasks" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "" @@ -6991,9 +7875,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -7001,13 +7885,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -7026,11 +7910,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7055,16 +7943,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7074,14 +7966,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7095,9 +7987,13 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 -msgid "Set up DHCP Server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +msgid "Set up DHCP Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 @@ -7107,20 +8003,25 @@ msgid "Setting PLMN failed" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 -msgid "Settings" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 +msgid "Settings" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7128,12 +8029,11 @@ msgstr "" msgid "Short GI" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "" @@ -7146,16 +8046,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7163,15 +8063,15 @@ msgstr "" msgid "Signal" msgstr "Сигнал" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7179,12 +8079,12 @@ msgstr "" msgid "Signal:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Размер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7201,12 +8101,12 @@ msgstr "" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "" @@ -7224,14 +8124,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7239,8 +8135,8 @@ msgid "" "instructions." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7267,26 +8163,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7311,7 +8207,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7319,7 +8215,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7327,20 +8223,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7368,7 +8264,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7385,7 +8281,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7416,15 +8312,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7446,19 +8342,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7478,7 +8374,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7573,15 +8469,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "" @@ -7594,16 +8498,16 @@ msgstr "" msgid "Start priority" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7612,6 +8516,10 @@ msgstr "" msgid "Startup" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "" @@ -7625,7 +8533,7 @@ msgstr "" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "" @@ -7635,25 +8543,25 @@ msgstr "" msgid "Static address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Статус" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "" @@ -7662,8 +8570,8 @@ msgstr "" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7671,11 +8579,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "" @@ -7684,15 +8592,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7723,7 +8631,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "" @@ -7733,7 +8641,7 @@ msgstr "" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7745,8 +8653,16 @@ msgstr "" msgid "Sync with browser" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7770,9 +8686,9 @@ msgstr "" msgid "System log buffer size" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7801,7 +8717,7 @@ msgstr "" msgid "TCP:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "" @@ -7814,26 +8730,37 @@ msgstr "" msgid "TX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7849,26 +8776,26 @@ msgstr "" msgid "Terminate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7884,7 +8811,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7896,18 +8827,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7915,6 +8852,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7929,6 +8867,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7939,7 +8883,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7956,21 +8900,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -7980,13 +8928,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8006,18 +8954,18 @@ msgstr "" "Файлът на устройството на паметта или дяла (напр." " /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8034,7 +8982,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -8042,31 +8990,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8089,6 +9053,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8103,7 +9068,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8112,7 +9077,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8120,19 +9085,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8146,14 +9111,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8166,31 +9131,31 @@ msgstr "Командата за рестартиране се провали с msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8222,6 +9187,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8243,30 +9216,37 @@ msgid "" "you choose the generic image format for your platform." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8277,16 +9257,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8299,6 +9279,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8311,7 +9302,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" @@ -8339,8 +9330,8 @@ msgid "" "their status." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8355,31 +9346,39 @@ msgstr "Секцията всеоще не съдържа стойности" msgid "Time Synchronization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8387,17 +9386,13 @@ msgstr "" msgid "Timezone" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "За вписване в системата…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8409,7 +9404,7 @@ msgstr "" "щракнете върху „Извършване на нулиране“ (възможно е само с изображения на " "squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8417,12 +9412,16 @@ msgstr "" msgid "Total Available" msgstr "Общо налично" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8434,11 +9433,11 @@ msgstr "" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8455,6 +9454,27 @@ msgstr "" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Предадени данни" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8493,7 +9513,7 @@ msgstr "" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8502,13 +9522,13 @@ msgid "Tx-Power" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8557,7 +9577,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8608,19 +9628,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8634,7 +9666,7 @@ msgstr "" msgid "Unknown" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8658,11 +9690,11 @@ msgstr "" msgid "Unmount" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "" @@ -8676,15 +9708,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8696,7 +9738,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Качване" @@ -8711,56 +9753,64 @@ msgstr "" msgid "Upload archive..." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Ъптайм" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8769,13 +9819,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8821,22 +9876,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "" @@ -8860,15 +9918,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8891,69 +9949,71 @@ msgstr "" msgid "Used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Потребителско име" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -8973,24 +10033,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -8999,6 +10062,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -9012,14 +10079,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9045,7 +10112,7 @@ msgstr "" msgid "Vendor Class to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9053,12 +10120,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9066,34 +10133,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9120,48 +10199,99 @@ msgstr "" msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Състояние на WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9177,21 +10307,21 @@ msgid "Wireless Adapter" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9207,15 +10337,15 @@ msgstr "" msgid "Wireless is not associated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "" @@ -9227,7 +10357,7 @@ msgstr "" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9250,8 +10380,20 @@ msgid "" "scripts like \"network\", your device might become inaccessible!
    " msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9280,34 +10422,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "" @@ -9364,25 +10526,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9391,14 +10558,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9408,22 +10584,22 @@ msgstr "" msgid "forward" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "" @@ -9432,9 +10608,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9442,6 +10618,10 @@ msgstr "" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9456,11 +10636,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9469,11 +10657,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9485,18 +10673,26 @@ msgstr "" msgid "no" msgstr "не" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "" @@ -9507,20 +10703,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9529,6 +10725,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "преди повече от ден" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9546,23 +10746,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9570,7 +10779,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9578,7 +10787,7 @@ msgstr "" msgid "tagged" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9589,25 +10798,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "неизвестен" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9629,8 +10840,8 @@ msgid "untagged" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9643,7 +10854,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9672,7 +10883,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9709,8 +10920,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9750,11 +10961,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9764,43 +10985,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" diff --git a/package/luci/modules/luci-base/po/bn_BD/base.po b/package/luci/modules/luci-base/po/bn_BD/base.po index dab5e993d2..14a97efacd 100644 --- a/package/luci/modules/luci-base/po/bn_BD/base.po +++ b/package/luci/modules/luci-base/po/bn_BD/base.po @@ -3,30 +3,46 @@ msgstr "" "PO-Revision-Date: 2021-10-08 18:54+0000\n" "Last-Translator: Rayhan Nabi \n" "Language-Team: Bengali (Bangladesh) \n" +"librecmc/luci/bn_BD/>\n" "Language: bn_BD\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.9-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f ডিবি" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d বিট" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d ফিল্ড(গুলো) সঠিক নয়" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d ঘণ্টা আগে" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d মিনিট আগে" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d সেকেন্ড আগে" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "" @@ -51,10 +67,11 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "" @@ -64,19 +81,19 @@ msgid "-- Additional Field --" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "" @@ -102,7 +119,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" @@ -115,13 +132,18 @@ msgstr "" msgid "1 Minute Load:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "" msgstr[1] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "" @@ -136,12 +158,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "" @@ -154,43 +181,98 @@ msgstr "" msgid "5 Minute Load:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "" @@ -202,30 +284,42 @@ msgstr "" msgid "LED Name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -271,11 +365,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "" @@ -283,25 +385,90 @@ msgstr "" msgid "A new login is required since the authentication session expired." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "" @@ -334,55 +501,58 @@ msgstr "" msgid "ARP retry threshold" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " "to dial into the provider network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "" @@ -391,7 +561,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -399,16 +569,25 @@ msgstr "" msgid "Access Concentrator" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "ক্রিয়া" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "" @@ -446,8 +625,8 @@ msgstr "" msgid "Active-Backup policy (active-backup, 1)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "" @@ -464,18 +643,18 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "" @@ -495,11 +674,11 @@ msgstr "" msgid "Add VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "" @@ -507,18 +686,18 @@ msgstr "" msgid "Add instance" msgstr "ইন্সট্যান্স যোগ করুন" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "" @@ -526,6 +705,10 @@ msgstr "" msgid "Add peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "" @@ -534,11 +717,11 @@ msgstr "" msgid "Add to Whitelist" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "" @@ -555,7 +738,11 @@ msgstr "" msgid "Address" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -568,7 +755,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "" @@ -577,28 +764,28 @@ msgstr "" msgid "Administration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "উন্নত সেটিংস" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 @@ -633,17 +820,17 @@ msgstr "" msgid "Alias of \"%s\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "" @@ -651,11 +838,11 @@ msgstr "" msgid "Allow SSH password authentication" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "" @@ -663,15 +850,15 @@ msgstr "" msgid "Allow full UCI access for legacy applications" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "" @@ -692,19 +879,24 @@ msgid "Allow system feature probing" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "অনুমোদিত আইপি" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "" @@ -716,20 +908,24 @@ msgstr "" msgid "Always on (kernel: default-on)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "" @@ -738,98 +934,47 @@ msgstr "" msgid "An optional, short description for this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "" @@ -841,7 +986,7 @@ msgstr "" msgid "Anonymous Swap" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -853,11 +998,11 @@ msgstr "" msgid "Any zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -865,44 +1010,48 @@ msgstr "" msgid "Apply backup?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "" @@ -911,15 +1060,15 @@ msgstr "" msgid "Associations" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -929,25 +1078,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "" @@ -955,7 +1105,9 @@ msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -973,7 +1125,7 @@ msgstr "" msgid "Automatically check filesystem for errors before mounting" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -995,6 +1147,10 @@ msgstr "" msgid "Automount Swap" msgstr "" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "" @@ -1013,11 +1169,15 @@ msgstr "" msgid "Average:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "" @@ -1025,15 +1185,19 @@ msgstr "" msgid "BR / DMR / AFTR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "" @@ -1042,11 +1206,7 @@ msgstr "" msgid "Back to Overview" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1059,16 +1219,15 @@ msgid "Backup / Flash Firmware" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1076,12 +1235,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1092,7 +1274,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1101,18 +1283,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1124,65 +1319,77 @@ msgstr "" msgid "Bitrate" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "" @@ -1190,14 +1397,36 @@ msgstr "" msgid "Buffered" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "" @@ -1212,18 +1441,23 @@ msgstr "" msgid "Call failed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "বাতিল করুন" @@ -1231,32 +1465,32 @@ msgstr "বাতিল করুন" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1265,45 +1499,53 @@ msgstr "" msgid "Category" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1315,16 +1557,16 @@ msgstr "" msgid "Chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "" @@ -1335,18 +1577,19 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "" @@ -1354,7 +1597,7 @@ msgstr "" msgid "Check filesystems before mount" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" @@ -1371,8 +1614,8 @@ msgstr "" msgid "Choose mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1380,13 +1623,13 @@ msgid "" "interface to it." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "" @@ -1406,9 +1649,10 @@ msgid "" "FEATURE IS FOR PROFESSIONALS! )" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "" @@ -1417,9 +1661,9 @@ msgstr "" msgid "Client ID to send when requesting DHCP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "" @@ -1434,20 +1678,20 @@ msgid "" "persist connection" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "কমান্ড" @@ -1464,7 +1708,7 @@ msgstr "" msgid "Comment" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1483,29 +1727,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "কনফিগারেশন" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1515,28 +1758,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1548,9 +1791,10 @@ msgstr "" msgid "Confirmation" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "" @@ -1560,11 +1804,11 @@ msgstr "" msgid "Connection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1576,7 +1820,7 @@ msgstr "" msgid "Connections" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1604,9 +1848,9 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1617,16 +1861,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1637,20 +1881,20 @@ msgstr "" msgid "Country" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "" @@ -1662,7 +1906,7 @@ msgstr "" msgid "Cron Log Level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "" @@ -1701,31 +1945,31 @@ msgid "" "Diode\">LEDs if possible." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "" @@ -1736,16 +1980,22 @@ msgstr "" msgid "DHCP client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "" @@ -1757,19 +2007,19 @@ msgstr "" msgid "DNS" msgstr "ডিএনএস" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" @@ -1777,7 +2027,7 @@ msgstr "" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1785,11 +2035,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1801,39 +2051,47 @@ msgstr "" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "ডাটা গৃহীত হয়েছে" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "ডাটা প্রেরিত" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "ডিবাগ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1841,68 +2099,69 @@ msgstr "" msgid "Default state" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "বর্ণনা" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "" @@ -1910,11 +2169,11 @@ msgstr "" msgid "Design" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1949,9 +2208,9 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1961,36 +2220,40 @@ msgstr "" msgid "Device" msgstr "ডিভাইস" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "" @@ -1998,31 +2261,31 @@ msgstr "" msgid "Device unreachable! Still waiting for device..." msgstr "ডিভাইসে পৌঁছানো যাচ্ছে না! এখনও ডিভাইসের জন্য অপেক্ষমান ..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2037,20 +2300,24 @@ msgstr "" msgid "Disable Encryption" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2059,33 +2326,32 @@ msgstr "" msgid "Disabled" msgstr "নিষ্ক্রিয়" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" @@ -2095,36 +2361,48 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "বাতিল" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" @@ -2136,32 +2414,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2171,17 +2440,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "" @@ -2189,11 +2458,11 @@ msgstr "" msgid "Do you really want to erase all settings?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2201,15 +2470,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "" @@ -2235,11 +2506,11 @@ msgstr "" msgid "Download mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2253,16 +2524,54 @@ msgstr "" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "" @@ -2278,19 +2587,19 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2298,27 +2607,39 @@ msgstr "" msgid "Dynamic tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "" @@ -2326,17 +2647,21 @@ msgstr "" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "" @@ -2345,54 +2670,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "সক্রিয় করুন" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2410,10 +2725,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2427,11 +2743,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2443,11 +2763,11 @@ msgstr "" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2455,7 +2775,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "" @@ -2466,12 +2786,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "" @@ -2487,24 +2807,24 @@ msgstr "" msgid "Enable mirroring of outgoing packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2526,11 +2846,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "" @@ -2539,27 +2859,36 @@ msgstr "" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "সক্রিয়" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "" @@ -2567,24 +2896,29 @@ msgstr "" msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "এন্ডপয়েন্ট" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2592,23 +2926,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2637,10 +2971,6 @@ msgstr "ভুল" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2659,37 +2989,51 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2698,11 +3042,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "" @@ -2714,7 +3058,7 @@ msgstr "" msgid "Expires" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2723,11 +3067,11 @@ msgstr "" msgid "External" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2755,58 +3099,86 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "" @@ -2815,12 +3187,20 @@ msgstr "" msgid "Filesystem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 -msgid "Filter private" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 @@ -2835,8 +3215,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2846,7 +3231,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "" @@ -2860,10 +3245,11 @@ msgid "Firewall" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "ফায়ারওয়াল মার্ক" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "" @@ -2871,19 +3257,19 @@ msgstr "" msgid "Firewall Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2909,40 +3295,48 @@ msgstr "" msgid "Flashing…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "" @@ -2954,11 +3348,11 @@ msgstr "" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -2977,37 +3371,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "" @@ -3029,7 +3427,7 @@ msgid "GHz" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "" @@ -3049,12 +3447,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "" @@ -3064,23 +3466,23 @@ msgstr "" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "সাধারণ সেটিংস" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3088,7 +3490,7 @@ msgstr "" msgid "Generate Config" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3096,11 +3498,11 @@ msgstr "" msgid "Generate archive" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3108,15 +3510,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3128,39 +3530,40 @@ msgstr "" msgid "Global Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3172,6 +3575,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3208,7 +3615,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3216,6 +3623,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3248,7 +3659,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "" @@ -3277,15 +3688,11 @@ msgstr "" msgid "Hang Up" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3295,7 +3702,7 @@ msgid "" "the timezone." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" @@ -3304,17 +3711,25 @@ msgstr "" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3324,7 +3739,7 @@ msgstr "" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3332,10 +3747,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3345,11 +3766,11 @@ msgstr "হোস্টনেম" msgid "Hostname to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3405,23 +3826,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3437,7 +3862,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3449,20 +3874,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "" @@ -3470,14 +3895,15 @@ msgstr "" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "" @@ -3493,7 +3919,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3503,7 +3929,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3530,7 +3956,7 @@ msgstr "" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "" @@ -3543,11 +3969,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3556,16 +3982,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3576,7 +4006,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3584,7 +4015,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3592,7 +4023,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3600,15 +4035,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3622,12 +4057,12 @@ msgstr "" msgid "IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3639,11 +4074,11 @@ msgstr "" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3652,7 +4087,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3666,23 +4101,19 @@ msgstr "" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3690,6 +4121,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3705,10 +4140,16 @@ msgstr "" msgid "IPv6-over-IPv4 (6to4)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3721,13 +4162,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3744,21 +4185,23 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3772,15 +4215,23 @@ msgid "" "datarates of the RAM." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "" @@ -3792,25 +4243,25 @@ msgstr "" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3822,13 +4273,27 @@ msgstr "" msgid "In" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3858,7 +4323,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3866,6 +4331,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3884,22 +4350,21 @@ msgstr "তথ্য" msgid "Information" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3911,31 +4376,41 @@ msgstr "" msgid "Initscripts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -3945,6 +4420,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -3952,7 +4431,7 @@ msgstr "" msgid "Interface" msgstr "ইন্টারফেস" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -3960,7 +4439,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "" @@ -3991,11 +4470,11 @@ msgstr "" msgid "Interface is shutting down..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -4004,12 +4483,12 @@ msgid "Interface name" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "ইন্টারফেস" @@ -4018,22 +4497,26 @@ msgstr "ইন্টারফেস" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4043,8 +4526,9 @@ msgid "Invalid" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4054,6 +4538,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4076,7 +4564,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4090,15 +4578,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "" @@ -4109,25 +4618,25 @@ msgid "" "flash memory, please verify the image file!" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4135,24 +4644,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "" @@ -4160,6 +4673,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4167,14 +4681,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4219,7 +4738,7 @@ msgstr "" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "" @@ -4236,32 +4755,39 @@ msgstr "" msgid "Language and Style" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 -msgid "Last member interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +msgid "Last member interval" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "সর্বশেষ হ্যান্ডশেক" + #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "" @@ -4285,38 +4811,34 @@ msgstr "" msgid "Leave empty to use the current WAN address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4337,16 +4859,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4355,7 +4879,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4368,23 +4892,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "শোনার পোর্ট" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4392,7 +4913,7 @@ msgstr "" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4402,7 +4923,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "" @@ -4411,7 +4932,7 @@ msgstr "" msgid "Load" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "" @@ -4419,27 +4940,28 @@ msgstr "" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4459,11 +4981,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4479,44 +5002,70 @@ msgstr "" msgid "Local Startup" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "" @@ -4540,25 +5089,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4566,11 +5106,11 @@ msgstr "" msgid "MAC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC অ্যাড্রেস" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "" @@ -4578,16 +5118,15 @@ msgstr "" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4596,11 +5135,15 @@ msgstr "" msgid "MAC address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "" @@ -4614,6 +5157,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "" @@ -4635,15 +5182,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4651,7 +5202,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4660,74 +5211,82 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4754,7 +5313,7 @@ msgstr "" msgid "Memory usage (%)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4762,10 +5321,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4778,7 +5345,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4789,11 +5356,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4801,13 +5368,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4821,77 +5388,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "মোড" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "" @@ -4959,6 +5533,10 @@ msgstr "" msgid "Move up" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -4966,19 +5544,23 @@ msgstr "" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -4990,12 +5572,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5008,18 +5594,23 @@ msgid "NTP server candidates" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "" @@ -5028,13 +5619,17 @@ msgstr "" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5043,32 +5638,36 @@ msgstr "" msgid "Network" msgstr "নেটওয়ার্ক" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5081,7 +5680,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5090,7 +5689,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5099,25 +5698,31 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "কখনও না" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "কখনও না" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5125,13 +5730,13 @@ msgstr "" msgid "Next »" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "না" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "" @@ -5139,7 +5744,7 @@ msgstr "" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5155,9 +5760,17 @@ msgstr "" msgid "No RX signal" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5168,7 +5781,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5177,8 +5794,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5191,15 +5808,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5213,7 +5826,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5234,30 +5847,39 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5271,7 +5893,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "" @@ -5283,37 +5906,40 @@ msgstr "" msgid "Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "" @@ -5326,7 +5952,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5338,12 +5964,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5352,7 +5984,7 @@ msgstr "" msgid "Notice" msgstr "নির্দেশনা" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "" @@ -5360,7 +5992,7 @@ msgstr "" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5377,7 +6009,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5388,6 +6020,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "" @@ -5396,6 +6029,12 @@ msgstr "" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "" @@ -5404,15 +6043,15 @@ msgstr "" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5430,7 +6069,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5439,49 +6082,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5489,29 +6143,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5519,17 +6182,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5537,13 +6200,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5558,11 +6221,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5570,7 +6233,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5584,7 +6247,7 @@ msgstr "" msgid "Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -5954,11 +6662,20 @@ msgstr "" msgid "Peak:" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +#, fuzzy +msgid "Peer" +msgstr "পিয়ার" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -5967,11 +6684,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6002,10 +6719,14 @@ msgstr "" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6014,13 +6735,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "" @@ -6033,11 +6754,11 @@ msgstr "" msgid "Pkts." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6045,56 +6766,75 @@ msgstr "" msgid "Policy" msgstr "নীতি" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "পোর্ট" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "পোর্ট" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6117,13 +6857,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6136,29 +6877,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6176,8 +6919,8 @@ msgid "Prot." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6189,13 +6932,13 @@ msgstr "প্রোটোকল" msgid "Provide NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6205,25 +6948,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "পাবলিক কী" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6248,59 +7002,83 @@ msgstr "" msgid "Quality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "" @@ -6313,10 +7091,16 @@ msgstr "" msgid "RX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6326,11 +7110,11 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "" @@ -6338,11 +7122,11 @@ msgstr "" msgid "Realtime Graphs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6366,11 +7150,40 @@ msgstr "" msgid "Receive" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "ডাটা গৃহীত হয়েছে" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "" @@ -6378,12 +7191,12 @@ msgstr "" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6392,37 +7205,47 @@ msgstr "" msgid "References" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "" @@ -6432,6 +7255,10 @@ msgstr "" msgid "Relay Bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "" @@ -6441,6 +7268,14 @@ msgstr "" msgid "Relay bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6450,6 +7285,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6462,15 +7298,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "" @@ -6500,7 +7344,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6516,7 +7361,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6528,67 +7373,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6597,7 +7448,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6612,20 +7463,24 @@ msgstr "" msgid "Reset to defaults" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "" @@ -6634,7 +7489,7 @@ msgstr "" msgid "Restart Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6646,86 +7501,97 @@ msgstr "" msgid "Restore backup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6740,19 +7606,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6770,6 +7636,10 @@ msgstr "" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6782,24 +7652,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6819,11 +7689,24 @@ msgstr "" msgid "SHA256" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6841,15 +7724,15 @@ msgstr "" msgid "SSH username" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6866,7 +7749,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6877,7 +7760,7 @@ msgid "Save" msgstr "সংরক্ষণ করুন" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "" @@ -6894,7 +7777,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "" @@ -6903,11 +7786,16 @@ msgstr "" msgid "Scheduled Tasks" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "" @@ -6922,9 +7810,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -6932,13 +7820,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -6957,11 +7845,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -6986,16 +7878,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7005,14 +7901,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7026,9 +7922,13 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 -msgid "Set up DHCP Server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +msgid "Set up DHCP Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 @@ -7038,20 +7938,25 @@ msgid "Setting PLMN failed" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "সেটিংস" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7059,12 +7964,11 @@ msgstr "" msgid "Short GI" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "" @@ -7077,16 +7981,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7094,15 +7998,15 @@ msgstr "" msgid "Signal" msgstr "সংকেত" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7110,12 +8014,12 @@ msgstr "" msgid "Signal:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7132,12 +8036,12 @@ msgstr "" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "" @@ -7155,14 +8059,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7170,8 +8070,8 @@ msgid "" "instructions." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7198,26 +8098,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7242,7 +8142,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7250,7 +8150,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7258,20 +8158,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7299,7 +8199,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7316,7 +8216,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7347,15 +8247,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7377,19 +8277,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7409,7 +8309,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7504,15 +8404,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "শুরু করুন" @@ -7525,16 +8433,16 @@ msgstr "" msgid "Start priority" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7543,6 +8451,10 @@ msgstr "" msgid "Startup" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "" @@ -7556,7 +8468,7 @@ msgstr "" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "" @@ -7566,25 +8478,25 @@ msgstr "" msgid "Static address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "অবস্থা" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "" @@ -7593,8 +8505,8 @@ msgstr "" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7602,11 +8514,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "" @@ -7615,15 +8527,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7654,7 +8566,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "" @@ -7664,7 +8576,7 @@ msgstr "" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7676,8 +8588,16 @@ msgstr "" msgid "Sync with browser" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7701,9 +8621,9 @@ msgstr "" msgid "System log buffer size" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7732,7 +8652,7 @@ msgstr "" msgid "TCP:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "" @@ -7745,26 +8665,37 @@ msgstr "" msgid "TX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7780,26 +8711,26 @@ msgstr "" msgid "Terminate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7815,7 +8746,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7827,18 +8762,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7846,6 +8787,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7860,6 +8802,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7870,7 +8818,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7887,21 +8835,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -7911,13 +8863,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -7935,18 +8887,18 @@ msgid "" " /dev/sda1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -7963,7 +8915,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -7971,31 +8923,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8018,6 +8986,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8032,7 +9001,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8041,7 +9010,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8049,19 +9018,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8075,14 +9044,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8095,31 +9064,31 @@ msgstr "রিবুট কমান্ড ব্যর্থ হয়েছে msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8151,6 +9120,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8172,30 +9149,37 @@ msgid "" "you choose the generic image format for your platform." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8206,16 +9190,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8228,6 +9212,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8240,7 +9235,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" @@ -8268,8 +9263,8 @@ msgid "" "their status." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8284,31 +9279,39 @@ msgstr "" msgid "Time Synchronization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8316,17 +9319,13 @@ msgstr "" msgid "Timezone" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8334,7 +9333,7 @@ msgid "" "reset\" (only possible with squashfs images)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8342,12 +9341,16 @@ msgstr "" msgid "Total Available" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8359,11 +9362,11 @@ msgstr "" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8380,6 +9383,27 @@ msgstr "" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "ডাটা প্রেরিত" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8418,7 +9442,7 @@ msgstr "" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8427,13 +9451,13 @@ msgid "Tx-Power" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8482,7 +9506,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8533,19 +9557,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8559,7 +9595,7 @@ msgstr "" msgid "Unknown" msgstr "অজানা" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8583,11 +9619,11 @@ msgstr "" msgid "Unmount" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "" @@ -8601,15 +9637,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8621,7 +9667,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "" @@ -8636,56 +9682,64 @@ msgstr "" msgid "Upload archive..." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8694,13 +9748,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8746,22 +9805,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "" @@ -8785,15 +9847,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8816,69 +9878,71 @@ msgstr "" msgid "Used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -8898,24 +9962,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -8924,6 +9991,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -8937,14 +10008,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -8970,7 +10041,7 @@ msgstr "" msgid "Vendor Class to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -8978,12 +10049,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -8991,34 +10062,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9045,48 +10128,99 @@ msgstr "সতর্কতা: অসংরক্ষিত পরিবর্ত msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "ওয়্যারগার্ড" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "ওয়্যারগার্ড স্ট্যাটাস" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9102,21 +10236,21 @@ msgid "Wireless Adapter" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9132,15 +10266,15 @@ msgstr "" msgid "Wireless is not associated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "" @@ -9152,7 +10286,7 @@ msgstr "" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9175,8 +10309,20 @@ msgid "" "scripts like \"network\", your device might become inaccessible!
    " msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9205,34 +10351,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "" @@ -9289,25 +10455,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9316,14 +10487,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "মেয়াদোত্তীর্ণ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9333,22 +10513,22 @@ msgstr "" msgid "forward" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "" @@ -9357,9 +10537,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9367,6 +10547,10 @@ msgstr "" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9381,11 +10565,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9394,11 +10586,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9410,18 +10602,26 @@ msgstr "" msgid "no" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "" @@ -9432,20 +10632,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9454,6 +10654,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "এক দিনের বেশি আগে" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9471,23 +10675,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9495,7 +10708,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9503,7 +10716,7 @@ msgstr "" msgid "tagged" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9514,25 +10727,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "অজ্ঞাত" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9554,8 +10769,8 @@ msgid "untagged" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9568,7 +10783,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9597,7 +10812,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9634,8 +10849,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9675,11 +10890,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9689,43 +10914,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" diff --git a/package/luci/modules/luci-base/po/ca/base.po b/package/luci/modules/luci-base/po/ca/base.po index 9942f5a7bb..8e31cd0711 100644 --- a/package/luci/modules/luci-base/po/ca/base.po +++ b/package/luci/modules/luci-base/po/ca/base.po @@ -3,34 +3,50 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:40+0200\n" -"PO-Revision-Date: 2021-12-13 23:52+0000\n" -"Last-Translator: Josef Schlehofer \n" -"Language-Team: Catalan \n" +"Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10-dev\n" +"X-Generator: Weblate 5.0.2\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d camp(s) invàlid(s)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "fa %dh" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "fa %dm" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "fa %ds" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "¡%s està des-etiquetat (untagged) en més d'una VLAN!" @@ -55,32 +71,33 @@ msgstr "(buit)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(sense interfícies adjuntes)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" -msgstr "" +msgstr "+ %d més" #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:48 msgid "-- Additional Field --" msgstr "-- Camp addicional --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Escolliu, si us plau --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- personalitzat --" @@ -106,7 +123,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = no utilitzar el llindar RSSI, 1 = no canviar el valor per defecte del " @@ -121,12 +138,17 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Càrrega d'1 minut:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "1 senyalador" +msgstr[1] "%d senyaladors" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" @@ -142,12 +164,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "ID hexadecimal de 4 caràcters" @@ -160,44 +187,100 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Càrrega de 5 minuts:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" "Identificador de 6 octets com a cadena hexadecimal - sense els dos punts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" +"802.11k: Habilita l'informe de beacons a partir dels mesuraments ràdio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Habilita l'informe de veïns a partir dels mesuraments ràdio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" -msgstr "Activar 802.11r (FT)" +msgstr "802.11r Transició Ràpida (Fast Transition)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: Temps d'inactivitat màxim de BSS. Unitat: segons." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: gestió de transició de Basic Service Set (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: anuncis de la zona horària local a les trames de gestió." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Anuncis de l'hora a les trames de gestió." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "Consulta el temps d'espera màxim d'associació SA de 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "Consulta el temps d'espera de reintent d'associació SA de 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "Protecció de marc de gestió de 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" -msgstr "" +msgstr "802.11w temps d'espera màxim" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" -msgstr "" +msgstr "802.11w temps d'espera per reintentar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "" "Màscara de xarxa IPv4" @@ -210,30 +293,42 @@ msgstr "Configuració dels LEDs" msgid "LED Name" msgstr "Nom LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "Proxy NDP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "Límit de salts RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "Vida útil del RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "MTU RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "Servei RA" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -279,11 +374,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Ja existeix una configuració pel dispositiu\"%s\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Ja existeix un directori amb aquest mateix nom." @@ -291,25 +394,90 @@ msgstr "Ja existeix un directori amb aquest mateix nom." msgid "A new login is required since the authentication session expired." msgstr "Cal un inici de sessió nou ja que la sessió d'autenticació ha caducat." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -342,29 +510,36 @@ msgstr "La supervisió ARP no és compatible amb la política seleccionada!" msgid "ARP retry threshold" msgstr "Llindar de reintent ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Mode de transferència asíncrona)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "Ponts ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "Identificador de canal virtual (VCI) ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "Identificador de camí virtual (VPI) ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -374,28 +549,24 @@ msgstr "" "de xarxa virtual de Linux que es poden utilitzar conjuntament amb DHCP o PPP " "per trucar a la xarxa del proveïdor." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Número de dispositiu ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "Identificador del proveïdor del sistema ATU-C" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Interfície absent" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Accepta peticions DNS només de dispositius l'adreça dels quals sigui d'una " "subxarxa local." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Acceptar local" @@ -404,7 +575,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Accepta paquets amb adreces d'origen locals" @@ -412,16 +583,25 @@ msgstr "Accepta paquets amb adreces d'origen locals" msgid "Access Concentrator" msgstr "Concentrador d'accés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Punt d'accés" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Accions" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Actiu" @@ -459,8 +639,8 @@ msgstr "Regles IPv6 actives" msgid "Active-Backup policy (active-backup, 1)" msgstr "Política de còpia de seguretat activa (còpia de seguretat activa, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -477,18 +657,18 @@ msgstr "Equilibri de càrrega de transmissió adaptativa (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Afegeix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Afegiu pont ATM" @@ -508,11 +688,11 @@ msgstr "Afegir acció LED" msgid "Add VLAN" msgstr "Afegir VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Afegiu la configuració del dispositiu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Afegeix la configuració del dispositiu…" @@ -520,19 +700,19 @@ msgstr "Afegeix la configuració del dispositiu…" msgid "Add instance" msgstr "Afegeix una instància" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Afegeix una clau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" "Afegeix el sufix de domini local als noms servits des dels fitxers de hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Afegeix una interfície nova..." @@ -540,6 +720,10 @@ msgstr "Afegeix una interfície nova..." msgid "Add peer" msgstr "Afegiu un parell" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Afegeix a la llista negra" @@ -548,11 +732,11 @@ msgstr "Afegeix a la llista negra" msgid "Add to Whitelist" msgstr "Afegeix a la llista blanca" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Fitxers de Hosts addicionals" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Fitxer de servidors addicionals" @@ -569,7 +753,11 @@ msgstr "Fitxer de servidors addicionals" msgid "Address" msgstr "Adreça" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -582,7 +770,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "Adreça per accedir al relay bridge local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Adreces" @@ -591,30 +779,29 @@ msgstr "Adreces" msgid "Administration" msgstr "Administració" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Configuració avançada" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Opcions avançades de dispositiu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Temps d’envelliment" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -#, fuzzy -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Potència de transmissió agregada (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -650,11 +837,11 @@ msgstr "Àlies d'interfície" msgid "Alias of \"%s\"" msgstr "Àlies de \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Tots els servidors" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." @@ -662,7 +849,7 @@ msgstr "" "Assigna les adreces IP seqüencialment, començant per l'adreça més baixa " "disponible." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Assigna les adreces IP seqüencialment" @@ -672,11 +859,13 @@ msgstr "" "Permetre l'autenticació SSH amb " "contrasenya" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" +"Permet al punt d'accés (AP) desconnectar estacions (STAs) si tenen un nivell " +"baix de justificants de recepció (ACKs)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Permet-les totes menys les llistades" @@ -684,15 +873,15 @@ msgstr "Permet-les totes menys les llistades" msgid "Allow full UCI access for legacy applications" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Permet velocitats obsoletes de 802.11b" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Permet només les llistades" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Permetre el localhost" @@ -715,19 +904,24 @@ msgid "Allow system feature probing" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Permetre l'accés de l'usurari root amb contrasenya" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "IPs permeses" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Sempre" @@ -739,20 +933,26 @@ msgstr "Sempre apagat (kernel: none)" msgid "Always on (kernel: default-on)" msgstr "Sempre encès (kernel: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" +"Empra sempre canals de 40MHz, fins i tot si el canal secondari se solapa. " +"L'ús d'aquesta opció no compleix amb IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Hi ha hagut un error en desar el formulari:" @@ -761,110 +961,59 @@ msgstr "Hi ha hagut un error en desar el formulari:" msgid "An optional, short description for this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" -msgstr "" +msgstr "Dominis DNS anunciats" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Identitat anònima" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 msgid "Anonymous Mount" -msgstr "" +msgstr "Punt de muntatge anònim" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 msgid "Anonymous Swap" -msgstr "" +msgstr "Memòria d'intercanvi anònima" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -876,73 +1025,82 @@ msgstr "" msgid "Any zone" msgstr "Qualsevol zona" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 msgid "Apply backup?" -msgstr "" +msgstr "Aplicar la configuració de la còpia de seguretat?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" +"La petició d'aplicar els paràmetres ha fallat amb l'estat %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" -msgstr "" +msgstr "Aplicar sense verificar" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" -msgstr "" +msgstr "Arquitectura" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" +"Assignar a aquesta interfície una part, d'una mida determinada, de cada " +"prefix IPv6 públic" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" +"Assigna parts del prefix fent servir aquesta ID de subprefix hexadecimal per " +"a aquesta interfície." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Estacions associades" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:151 msgid "Associations" -msgstr "" +msgstr "Associacions" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -952,25 +1110,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" -msgstr "" +msgstr "Grup d'autenticació" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Autenticació" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" -msgstr "" +msgstr "Tipus d'autenticació" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autoritzada" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Es requereix autenticació" @@ -978,7 +1137,9 @@ msgstr "Es requereix autenticació" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -990,13 +1151,14 @@ msgstr "Automàtic" #: modules/luci-compat/luasrc/model/network/proto_hnet.lua:7 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:7 msgid "Automatic Homenet (HNCP)" -msgstr "" +msgstr "Homenet automàtica (HNCP)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 msgid "Automatically check filesystem for errors before mounting" msgstr "" +"Comprova els sistemes de fitxers a la recerca d'errors abans de muntar-los" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1004,18 +1166,22 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 msgid "Automatically mount filesystems on hotplug" -msgstr "" +msgstr "Munta els sistemes de fitxers automàticament quan s'endollin en calent" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 msgid "Automatically mount swap on hotplug" -msgstr "" +msgstr "Munta la memòria d'intercanvi automàticament quan s'endolli en calent" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 msgid "Automount Filesystem" -msgstr "" +msgstr "Muntatge automàtic de sistema de fitxers" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 msgid "Automount Swap" +msgstr "Muntatge automàtic de memòria d'intercanvi" + +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 @@ -1036,11 +1202,15 @@ msgstr "Disponible" msgid "Average:" msgstr "Mitjana:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1048,15 +1218,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Enrere" @@ -1065,11 +1239,7 @@ msgstr "Enrere" msgid "Back to Overview" msgstr "Enrere al Resum" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Enrere a la configuració" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1082,16 +1252,15 @@ msgid "Backup / Flash Firmware" msgstr "Còpia de seguretat i microprogramari" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Llista de còpies de seguretat" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Banda" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1099,12 +1268,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" +msgstr "Interval de balissa (beacon)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1118,7 +1310,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1127,10 +1319,22 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" +msgstr "Vincula la interfície" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 @@ -1138,11 +1342,12 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." -msgstr "" +msgstr "Vincula el túnel a aquesta interfície (opcional)." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 @@ -1150,78 +1355,113 @@ msgstr "" msgid "Bitrate" msgstr "Velocitat de bits" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Pont" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Número d'unitat de pont" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Aixecar a l'engegada" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" -msgstr "" +msgstr "Navega…" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:40 msgid "Buffered" msgstr "En memòria intermèdia" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +"Certificat CA; si ho deixeu buit es desarà després de la primera connexió." + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" +msgstr "Ha fallat la configuració de CLAT" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 @@ -1236,20 +1476,25 @@ msgstr "En cau" #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:53 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:21 msgid "Call failed" +msgstr "Ha fallat la crida" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Cancel•lar" @@ -1257,32 +1502,32 @@ msgstr "Cancel•lar" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1291,24 +1536,32 @@ msgstr "" msgid "Category" msgstr "Categoria" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Restricció de certificat (Domini)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Restricció de certificat (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Restricció de certificat (Subjecte)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Restricció de certificat (Comodí)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1317,22 +1570,22 @@ msgstr "" ">Vegeu `logread -f` durant l'establiment del protocol d'enllaç per conèixer " "els valors reals" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1344,18 +1597,18 @@ msgstr "" msgid "Chain" msgstr "Cadena" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Canvis" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." -msgstr "" +msgstr "S'han revertit els canvis." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 msgid "Changes the administrator password for accessing the device" @@ -1364,44 +1617,46 @@ msgstr "Canvia la paraula clau de l'administrador per accedir al dispositiu" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Canal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 msgid "Check filesystems before mount" -msgstr "" +msgstr "Comprova els sistemes de fitxers abans de muntar-los" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" +"Marqueu aquesta opció per esborrar les xarxes existents en aquesta ràdio." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:110 msgid "Checking archive…" -msgstr "" +msgstr "S'està comprovant l'arxiu…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:193 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:195 msgid "Checking image…" -msgstr "" +msgstr "S'està comprovant la imatge…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:427 msgid "Choose mtdblock" -msgstr "" +msgstr "Escolliu l'mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1413,7 +1668,7 @@ msgstr "" "ompliu el camp crea per definir una nova zona i adjuntar-hi la " "interfície." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1421,13 +1676,13 @@ msgstr "" "Trieu les xarxes que voleu adjuntar a la interfície sense fil o ompliu el " "camp crea per definir una xarxa nova." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Xifra" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:91 msgid "Cisco UDP encapsulation" -msgstr "" +msgstr "Encapsulat UDP de Cisco" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:391 msgid "" @@ -1442,10 +1697,13 @@ msgid "" "Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS " "FEATURE IS FOR PROFESSIONALS! )" msgstr "" +"Feu clic a \"Desa l'mtdblock\" per descarregar el fitxer de l'mtdblock " +"especificat. (NOTA: AQUESTA FUNCIÓ ÉS PER A EXPERTS!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Client" @@ -1454,9 +1712,9 @@ msgstr "Client" msgid "Client ID to send when requesting DHCP" msgstr "ID de client a enviar en les sol·licituds DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Tanca" @@ -1470,44 +1728,51 @@ msgid "" "Close inactive connection after the given amount of seconds, use 0 to " "persist connection" msgstr "" - -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Tanca la llista..." +"Tanca una connexió inactiva després dels segons especificats aquí, o empreu " +"0 per fer la connexió persistent" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "S’estan recollint dades…" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Ordre" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:401 msgid "Command OK" -msgstr "" +msgstr "Ordre correcta" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:33 msgid "Command failed" -msgstr "" +msgstr "Ha fallat l'ordre" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:73 msgid "Comment" msgstr "Commentari" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " "workaround might cause interoperability issues and reduced robustness of key " "negotiation especially in environments with heavy traffic load." msgstr "" +"Dificulta els atacs per reinstal·lació de clau a la banda del client, " +"deshabilitant la retransmissió de les trames EAPOL-Key que es fan servir per " +"instal·lar claus. Aquesta estratègia pot causar problemes " +"d'interoperabilitat i una menor robustesa en la negociació de claus, " +"especialment en entorns amb un trànsit molt elevat." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:106 @@ -1520,29 +1785,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Configuració" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" -msgstr "" +msgstr "Ha fallat la configuració" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1552,42 +1816,43 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Configura…" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:176 msgid "Confirm disconnect" -msgstr "" +msgstr "Confirmeu la desconnexió" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:55 msgid "Confirmation" msgstr "Confirmació" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Connectat" @@ -1595,25 +1860,25 @@ msgstr "Connectat" #: modules/luci-base/htdocs/luci-static/resources/network.js:9 #: modules/luci-compat/luasrc/model/network.lua:27 msgid "Connection attempt failed" -msgstr "" +msgstr "Ha fallat l'intent de connexió" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:411 msgid "Connection lost" -msgstr "" +msgstr "S'ha perdut la connexió" #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:160 msgid "Connections" msgstr "Connexions" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1639,11 +1904,11 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:368 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:55 msgid "Contents have been saved." -msgstr "" +msgstr "S'han desat els continguts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1654,42 +1919,46 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " "settings such as the IP address or wireless security credentials." msgstr "" +"No s'ha pogut accedir de nou al dispositiu després d'aplicar els canvis de " +"configuració. Potser haureu de reconnectar-vos-hi si heu modificat " +"paràmetres de xarxa tals com l'adreça IP o les credencials de seguretat " +"sense fils." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:189 msgid "Country" msgstr "País" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Codi de País" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Crea / Assigna zona de tallafocs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" -msgstr "" +msgstr "Crear interfície" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:191 msgid "Critical" @@ -1699,9 +1968,9 @@ msgstr "Crític" msgid "Cron Log Level" msgstr "Nivell de registre del Cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" -msgstr "" +msgstr "Potència actual" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:28 msgctxt "nft meta hour" @@ -1727,6 +1996,8 @@ msgid "" "Custom files (certificates, scripts) may remain on the system. To prevent " "this, perform a factory-reset first." msgstr "" +"Poden romandre al sistema alguns fitxers modificats (certificats, scripts). " +"Per evitar-ho, feu un reinici de fàbrica primer." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:6 msgid "Custom flash interval (kernel: timer)" @@ -1740,31 +2011,31 @@ msgstr "" "Personalitza el comportament dels LEDs del dispositiu, si és possible." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" -msgstr "" +msgstr "Client DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" -msgstr "" +msgstr "Port DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" -msgstr "" +msgstr "Secret DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Servidor DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP i DNS" @@ -1775,18 +2046,24 @@ msgstr "DHCP i DNS" msgid "DHCP client" msgstr "Client DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Opcions DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" -msgstr "" +msgstr "Client DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" -msgstr "" +msgstr "Servei DHCPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:45 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:46 @@ -1796,19 +2073,19 @@ msgstr "" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Reenviaments DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" -msgstr "Port de consulta DNS " +msgstr "Port de consulta DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "Port del servidor DNS" @@ -1816,64 +2093,73 @@ msgstr "Port del servidor DNS" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:33 msgid "DNS-Label / FQDN" -msgstr "" +msgstr "Etiqueta DNS / Nom de domini complet (FQDN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 -#, fuzzy +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:99 msgid "DPD Idle Timeout" -msgstr "" +msgstr "Temps d'espera per inactivitat de DPD" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:41 msgid "DS-Lite AFTR address" -msgstr "" +msgstr "Adreça AFTR DS-Lite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" -msgstr "" +msgstr "Estat de la DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" -msgstr "" +msgstr "Mode de línia DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" -msgstr "" +msgstr "Interval DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" -msgstr "" +msgstr "Taxa de dades" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +#, fuzzy +msgid "Data Received" +msgstr "Recepció" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +#, fuzzy +msgid "Data Transmitted" +msgstr "Transmissió" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Depuració" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1881,68 +2167,72 @@ msgstr "" msgid "Default state" msgstr "Estat per defecte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" +"Definiu opcions DHCP addicionals; per exemple, " +"\"6,192.168.2.1,192.168.2.2\" per anunciar uns altres servidors " +"DNS als clients." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Suprimeix" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" -msgstr "" +msgstr "Esborra la clau" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" -msgstr "" +msgstr "Ha fallat la petició d'esborrar: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Suprimeix aquesta xarxa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" -msgstr "" +msgstr "Interval dels missatges indicatius de lliurament de trànsit" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Descripció" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Deselecciona" @@ -1950,11 +2240,11 @@ msgstr "Deselecciona" msgid "Design" msgstr "Disseny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1982,16 +2272,16 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 msgid "Destination zone" -msgstr "" +msgstr "Zona de destí" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:67 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2001,68 +2291,74 @@ msgstr "" msgid "Device" msgstr "Dispositiu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Configuració de dispositiu" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" -msgstr "" +msgstr "El dispositiu no està actiu" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" -msgstr "" +msgstr "El dispositiu està reiniciant-se…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" -msgstr "" +msgstr "No s'ha pogut contactar amb el dispositiu!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:53 msgid "Device unreachable! Still waiting for device..." msgstr "" +"No s'ha pogut contactar amb el dispositiu! S'està esperant que torni a " +"respondre…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Dispositius" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnòstics" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" -msgstr "" +msgstr "Número per marcar" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Directori" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Inhabilita" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2077,22 +2373,26 @@ msgstr "" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 msgid "Disable Encryption" -msgstr "" +msgstr "Deshabilita el xifrat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" -msgstr "" +msgstr "Deshabilita la comprovació d'inactivitat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" -msgstr "" +msgstr "Deshabilita aquesta xarxa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2101,33 +2401,32 @@ msgstr "" msgid "Disabled" msgstr "Inhabilitat" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" -msgstr "" +msgstr "Desconnecta quan hi hagi un nivell baix de justificants de recepció" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "Descarta les respostes RFC1918 des de dalt." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Desconnecta" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" -msgstr "" +msgstr "Ha fallat l'intent de desconnexió" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" @@ -2137,29 +2436,41 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Oblida-ho" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Optimització de distància" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Distància al membre de la xarxa més allunyat en metres." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDNS per tallafocs NAT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" @@ -2182,34 +2493,25 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "No reenviïs les peticions DNS " "sense el nom DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2219,29 +2521,29 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" -msgstr "" +msgstr "Esteu segurs que voleu esborrar \"%s\" ?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" -msgstr "" +msgstr "Esteu segurs que voleu esborrar aquesta clau SSH?" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:94 msgid "Do you really want to erase all settings?" -msgstr "" +msgstr "Esteu segurs que voleu esborrar tota la configuració?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" -msgstr "" +msgstr "Esteu segurs que voleu esborrar el directori \"%s\" recursivament?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2249,23 +2551,25 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Es requereix un domini" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" -msgstr "" +msgstr "Llista blanca de dominis" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:83 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 msgid "Don't Fragment" -msgstr "" +msgstr "No fragmentis" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 msgid "Down" @@ -2281,13 +2585,13 @@ msgstr "Descarrega còpia de seguretat" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:432 msgid "Download mtdblock" -msgstr "" +msgstr "Baixa l'mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" -msgstr "" +msgstr "Òfset de l'SNR del canal de baixada" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2295,22 +2599,60 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2698 msgid "Drag to reorder" -msgstr "" +msgstr "Arrossegueu per reordenar" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:342 msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Instància de Dropbear" @@ -2326,22 +2668,22 @@ msgstr "" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:14 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:11 msgid "Dual-Stack Lite (RFC6333)" -msgstr "" +msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "DHCP dinàmic" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2349,27 +2691,41 @@ msgstr "" msgid "Dynamic tunnel" msgstr "Túnel dinàmic" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" +"Assigna adreces DHCP dinàmiques als clients. Si ho deshabiliteu, només se " +"servirà als clients que tinguin adreces estàtiques assignades." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Mètode EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Edita" @@ -2377,73 +2733,71 @@ msgstr "Edita" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" +"Editeu les dades de configuració en cru de dalt per arreglar els errors i " +"premeu \"Desa\" per recarregar la pàgina." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Edita aquesta xarxa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" -msgstr "" +msgstr "Edita la xarxa sense fils" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:65 msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Emergència" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Activa" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" +"Habilita l'espionatge (snooping) d'IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Habilita l'STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2459,15 +2813,16 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 msgid "Enable HE.net dynamic endpoint update" -msgstr "" +msgstr "Habilita l'actualització dinàmica del punt final de HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" -msgstr "" +msgstr "Habilita la negociació d'IPv6" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 @@ -2478,11 +2833,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Habilita negociació IPv6 en la enllaç PPP" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Habilita el passatge de trames enormes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2492,13 +2851,13 @@ msgstr "Habilita el client NTP" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "Enable Single DES" -msgstr "" +msgstr "Habilita Single DES" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Habilita el servidor TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2506,9 +2865,9 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "Habilita la funcionalitat VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" -msgstr "" +msgstr "Habilita el botó WPS, necessita WPA(2)-PSK/WPA3-SAE" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:14 msgid "" @@ -2517,14 +2876,14 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" -msgstr "" +msgstr "Habilita les mesures contra la reinstal·lació de claus (KRACK)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:189 msgid "Enable learning and aging" @@ -2532,30 +2891,30 @@ msgstr "Habilita l'aprenentatge i l'envelliment" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:200 msgid "Enable mirroring of incoming packets" -msgstr "" +msgstr "Habilita la replicació dels paquets d'entrada" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:201 msgid "Enable mirroring of outgoing packets" -msgstr "" +msgstr "Habilita la replicació dels paquets de sortida" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2575,101 +2934,117 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." -msgstr "" +msgstr "Habilita el senyal DF (No Fragmentis) als paquets d'encapsulació." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" -msgstr "" +msgstr "Habilita aquesta xarxa" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:75 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:70 msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Activat" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" -msgstr "" +msgstr "Habilita l'espionatge (snooping) IGMP en aquest pont (bridge)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" +"Habilita la itinerància ràpida entre punts d'accés que pertanyen al mateix " +"Domini de Mobilitat" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Habilita l'Spanning Tree Protocol a aquest pont" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:59 msgid "Encapsulation limit" -msgstr "" +msgstr "Límit d'encapsulat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Mode d'encapsulació" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Xifratge" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 -msgid "Endpoint Host" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 +msgid "Endpoint Host" +msgstr "Host del punt terminal" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" -msgstr "" +msgstr "Port del punt terminal" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:325 msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" #: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 msgid "Enter custom value" -msgstr "" +msgstr "Introduïu un valor personalitzat" #: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 msgid "Enter custom values" -msgstr "" +msgstr "Introduïu els valors personalitzats" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:97 msgid "Erasing..." @@ -2688,10 +3063,6 @@ msgstr "Error" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2710,37 +3081,51 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" +msgstr "Exclou les interfícies" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "Permet respostes del rang 127.0.0.0/8, p.e. per serveis RBL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" +msgstr "Expandeix els amfitrions" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2749,11 +3134,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "S’espera: %s" @@ -2765,22 +3150,25 @@ msgstr "" msgid "Expires" msgstr "Caduca" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" +"Temps de validesa de les adreces assignades, el mínim és 2 minuts (2m)." #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:19 msgid "External" msgstr "Extern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 +#, fuzzy msgid "External R0 Key Holder List" -msgstr "" +msgstr "Llista de titulars de claus R0 externes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" -msgstr "" +msgstr "Llista de titulars de claus R1 externes" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167 msgid "External system log server" @@ -2796,7 +3184,7 @@ msgstr "Protocol del servidor de registre del sistema extern" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:79 msgid "Extra SSH command options" -msgstr "" +msgstr "Opcions extra de comanda SSH" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 msgid "Extra pppd options" @@ -2806,60 +3194,90 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" -msgstr "" +msgstr "FT sobre DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" -msgstr "" +msgstr "FT per l'aire (over the air)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" +msgstr "Protocol FT" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." +msgstr "No s'ha pogut canviar la contrasenya del sistema." + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +"No s'ha pogut confirmar l'aplicació dels canvis en %ds, s'està esperant que " +"es desfacin…" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" +msgstr "Ha fallat l'execució de l'acció \"/etc/init.d/%s %s\": %s" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Fitxer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "No hi ha accés al fitxer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "fitxer on els leases de DHCP s'emmagatzemaran" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "fitxer DNS local" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Nom de fitxer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Nom de fitxer de la imatge d'inici que es publica als clients" @@ -2868,14 +3286,22 @@ msgstr "Nom de fitxer de la imatge d'inici que es publica als clients" msgid "Filesystem" msgstr "Sistema de fitxers" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filtra privat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filtra els no útils" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "" @@ -2888,18 +3314,26 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" -msgstr "" +msgstr "Ha fallat la finalització" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 msgid "" "Find all currently attached filesystems and swap and replace configuration " "with defaults based on what was detected" msgstr "" +"Troba tots els sistemes de fitxers i memòries d'intercanvi connectats " +"actualment i substitueix-ne la configuració amb els paràmetres per defecte " +"basats en allò que s'hagi detectat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Troba i uneix-te a la xarxa" @@ -2913,10 +3347,11 @@ msgid "Firewall" msgstr "Tallafocs" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" -msgstr "" +msgstr "Marca de tallafocs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Ajusts de tallafocs" @@ -2924,19 +3359,19 @@ msgstr "Ajusts de tallafocs" msgid "Firewall Status" msgstr "Estat de tallafocs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" -msgstr "" +msgstr "Fitxer de microprogramari" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Versió de microprogramari" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2947,7 +3382,7 @@ msgstr "Puja una imatge..." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:308 msgid "Flash image?" -msgstr "" +msgstr "Voleu escriure la imatge a la memòria flaix?" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:439 msgid "Flash new firmware image" @@ -2960,58 +3395,66 @@ msgstr "Operacions a la memòria flaix" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:317 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:319 msgid "Flashing…" +msgstr "S'està escrivint a la memòria flaix…" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Força" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" -msgstr "" +msgstr "Força el mode de 40 MHz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Força el CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Força el DHCP en aquesta xarxa encara que es detecti altre servidor." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Força el TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Força el TKIP i el CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 -msgid "Force link" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 +msgid "Force link" +msgstr "Força l'enllaç" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:281 msgid "Force upgrade" msgstr "" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:90 msgid "Force use of NAT-T" -msgstr "" +msgstr "Força l'ús de NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" -msgstr "" +msgstr "El testimoni del formulari no coincideix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3030,37 +3473,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Reenvia el trànsit DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Reenvia el trànsit difós" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" -msgstr "" +msgstr "Reenvia el trànsit dels nodes de la mesh" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Mode de reenviament" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Llindar de fragmentació" @@ -3074,6 +3521,8 @@ msgid "" "Further information about WireGuard interfaces and peers at wireguard.com." msgstr "" +"Hi ha més informació sobre les interfícies i els nodes de WireGuard a wireguard.com." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 @@ -3082,7 +3531,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Només GPRS" @@ -3102,12 +3551,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Passarel·la" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Ports de passarel·la" @@ -3115,45 +3568,45 @@ msgstr "Ports de passarel·la" #: modules/luci-base/htdocs/luci-static/resources/network.js:11 #: modules/luci-compat/luasrc/model/network.lua:29 msgid "Gateway address is invalid" -msgstr "" +msgstr "L'adreça de la passarel·la és invàlida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Paràmetres generals" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" -msgstr "" +msgstr "Configuració general" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 msgid "Generate Config" -msgstr "" +msgstr "Genera la configuració" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" -msgstr "" +msgstr "Genera la PMK localment" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:396 msgid "Generate archive" msgstr "Genera l'arxiu" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3161,15 +3614,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3183,39 +3636,40 @@ msgstr "" msgid "Global Settings" msgstr "Configuració global" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" -msgstr "" +msgstr "Opcions globals de xarxa" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Vés a la configuració de contrasenya" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Vés a la pàgina de configuració" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3227,6 +3681,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3263,7 +3721,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3271,6 +3729,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3303,13 +3765,13 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66 msgid "Group Password" -msgstr "" +msgstr "Contrasenya de grup" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:22 msgid "Guest" @@ -3321,7 +3783,7 @@ msgstr "Contrasenya de HE.net" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "HE.net username" -msgstr "" +msgstr "Nom d'usuari de HE.net" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:64 @@ -3332,15 +3794,11 @@ msgstr "" msgid "Hang Up" msgstr "Penja" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3352,7 +3810,7 @@ msgstr "" "Ací pots configurar els aspectes bàsics del teu dispositiu, com el nom de la " "màquina o el fus horari." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" "No mostris l'ESSID" @@ -3360,19 +3818,27 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:332 msgid "Hide empty chains" -msgstr "" +msgstr "Amaga les cadenes buides" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "Alt" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3382,7 +3848,7 @@ msgstr "Amfitrió" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3390,10 +3856,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3403,11 +3875,11 @@ msgstr "Nom de l’amfitrió" msgid "Hostname to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Noms de màquina" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3463,23 +3935,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3495,7 +3971,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3507,20 +3983,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Substitució dels dominis NX falsos" @@ -3528,14 +4004,15 @@ msgstr "Substitució dels dominis NX falsos" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3551,7 +4028,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3561,7 +4038,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3588,7 +4065,7 @@ msgstr "Màscara de xarxa IPv4" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Només IPv4" @@ -3601,11 +4078,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "Longitud de prefix IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3614,16 +4091,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3634,7 +4115,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3642,7 +4124,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Tallafocs IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3650,7 +4132,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "Veïns IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3658,15 +4144,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3680,12 +4166,12 @@ msgstr "" msgid "IPv6 address" msgstr "Adreça IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3697,11 +4183,11 @@ msgstr "Passarel·la IPv6" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Només IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3710,7 +4196,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "Prefix IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3724,23 +4210,19 @@ msgstr "Longitud de prefix IPv6" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "Sufix (hex)IPv6-" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3748,6 +4230,10 @@ msgstr "" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3763,10 +4249,16 @@ msgstr "IPv6-sobre-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-sobre-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identitat" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3779,13 +4271,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3802,21 +4294,23 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3836,15 +4330,23 @@ msgstr "" "es pot accedir al dispositiu d'intercanvi amb unes taxes tan altes com les " "de la RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignora /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignora la interfície" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignora el fitxer de resolució" @@ -3856,25 +4358,25 @@ msgstr "Fitxer d'imatge" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3886,13 +4388,27 @@ msgstr "" msgid "In" msgstr "Entr." -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3922,7 +4438,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3930,6 +4446,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3948,22 +4465,21 @@ msgstr "Informació" msgid "Information" msgstr "Informació" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3975,31 +4491,41 @@ msgstr "Script d'inici" msgid "Initscripts" msgstr "Scripts d'inici" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Instal·la extensions de protocol" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4009,6 +4535,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4016,7 +4546,7 @@ msgstr "" msgid "Interface" msgstr "Interfície" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -4024,7 +4554,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Configuració d'interfície" @@ -4055,11 +4585,11 @@ msgstr "La interfície s'està reconnectant..." msgid "Interface is shutting down..." msgstr "La interfície s'està aturant..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -4068,12 +4598,12 @@ msgid "Interface name" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Interfícies" @@ -4082,22 +4612,26 @@ msgstr "Interfícies" msgid "Internal" msgstr "Intern" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Error de servidor intern" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4107,8 +4641,9 @@ msgid "Invalid" msgstr "Invàlid" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4118,6 +4653,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4140,7 +4679,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4154,15 +4693,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Usuari i/o contrasenya invàlids! Si us plau prova-ho de nou." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "" @@ -4176,25 +4736,25 @@ msgstr "" "Sembla que intentes actualitzar una imatge que no hi cap a la memòria flaix, " "si us plau verifica el fitxer d'imatge!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "Es requereix JavaScript!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Uneix-te a la xarxa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4202,24 +4762,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Registre del nucli" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Versió del nucli" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Clau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Clau #%d" @@ -4227,6 +4791,7 @@ msgstr "Clau #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4234,14 +4799,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4286,7 +4856,7 @@ msgstr "Interval d'eco LCP" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4303,32 +4873,39 @@ msgstr "Llengua" msgid "Language and Style" msgstr "Llengua i estil" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Latència" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Fulla" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Aprèn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Fitxer d'arrendament" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "" @@ -4352,38 +4929,34 @@ msgstr "Deixeu-ho en blanc per autodetectar" msgid "Leave empty to use the current WAN address" msgstr "Deixeu-ho en blanc per utilitzar l'adreça WAN actual" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Llegenda:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Límit" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4404,16 +4977,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4422,7 +4997,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4435,23 +5010,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4461,7 +5033,7 @@ msgstr "" "Habilita el servei en totes les interfícies o, si no se n'especifica cap, en " "totes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4471,7 +5043,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "" @@ -4480,7 +5052,7 @@ msgstr "" msgid "Load" msgstr "Càrrega" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Càrrega mitjana" @@ -4488,27 +5060,28 @@ msgstr "Càrrega mitjana" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Local" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4528,11 +5101,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Adreça IPv4 local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4548,44 +5122,70 @@ msgstr "Adreça IPv6 local" msgid "Local Startup" msgstr "Inici local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Hora local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Domini local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Servidor local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Localitza les peticions" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Entra" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Surt" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Nivell de sortida de registre" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Registra les peticions" @@ -4609,25 +5209,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Entra" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Surt" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4635,11 +5226,11 @@ msgstr "" msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Filtre d'adreces MAC" @@ -4647,16 +5238,15 @@ msgstr "Filtre d'adreces MAC" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4665,11 +5255,15 @@ msgstr "" msgid "MAC address" msgstr "Adreça MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Filtre MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Llista MAC" @@ -4683,6 +5277,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4704,15 +5302,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4720,7 +5322,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4729,78 +5331,86 @@ msgstr "" msgid "Manual" msgstr "Manual" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Arrendaments de DHCP max." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Mida màx. de paquet EDNS0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Consultes concurrents max." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4827,7 +5437,7 @@ msgstr "Memòria" msgid "Memory usage (%)" msgstr "Ús de Memòria (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Malla" @@ -4835,10 +5445,18 @@ msgstr "Malla" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4851,7 +5469,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4862,11 +5480,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4874,13 +5492,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4894,77 +5512,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Mode" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Model" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Dispositiu mòdem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Temps d'espera d'inici de mòdem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" @@ -5034,6 +5659,10 @@ msgstr "Mou cap avall" msgid "Move up" msgstr "Mou cap amunt" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5041,19 +5670,23 @@ msgstr "Mou cap amunt" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5065,12 +5698,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5083,18 +5720,23 @@ msgid "NTP server candidates" msgstr "Candidats de servidor NTP" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Nom" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Nom de la nova xarxa" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navegació" @@ -5103,13 +5745,17 @@ msgstr "Navegació" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5118,32 +5764,36 @@ msgstr "" msgid "Network" msgstr "Xarxa" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Utilitats de xarxa" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Imatge d'inici de xarxa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5156,7 +5806,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5165,7 +5815,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5174,25 +5824,31 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 +msgid "Never" +msgstr "Mai" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" msgid "Never" msgstr "Mai" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5200,13 +5856,13 @@ msgstr "" msgid "Next »" msgstr "Següent" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "No" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Cap servidor DHCP configurat en aquesta interfície" @@ -5214,7 +5870,7 @@ msgstr "Cap servidor DHCP configurat en aquesta interfície" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5230,9 +5886,17 @@ msgstr "" msgid "No RX signal" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5243,7 +5907,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5252,8 +5920,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5266,15 +5934,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Cap fitxer trobat" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5288,7 +5952,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5309,30 +5973,40 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Sense memòria cau negativa" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "No hi ha cap contrasenya establerta!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "No connectat" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5346,7 +6020,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Cap zona assignada" @@ -5358,37 +6033,40 @@ msgstr "Cap zona assignada" msgid "Noise" msgstr "Soroll" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Soroll:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Cap" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "No trobat" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "No associat" @@ -5401,7 +6079,7 @@ msgstr "No connectat" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5413,12 +6091,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Notes" @@ -5427,7 +6111,7 @@ msgstr "Notes" msgid "Notice" msgstr "Avís" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5435,7 +6119,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5452,7 +6136,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5463,6 +6147,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Apagat" @@ -5471,6 +6156,12 @@ msgstr "Apagat" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Encès" @@ -5479,15 +6170,15 @@ msgstr "Encès" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Cal especificar o el nom de host o l'adreça MAC!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5505,7 +6196,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "Un o més dels camps requerits no té valor!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5514,49 +6209,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Obre una llista..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5564,29 +6270,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Opció canviada" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Opció treta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Opcional" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5594,17 +6309,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5612,13 +6327,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5633,11 +6348,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5645,7 +6360,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5659,7 +6374,7 @@ msgstr "" msgid "Options" msgstr "Opcions" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Camí cap al certificat CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Camí cap al certificat de client" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Camí cap a la clau privada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -6029,11 +6789,19 @@ msgstr "Pausat" msgid "Peak:" msgstr "Màxim:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -6042,11 +6810,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6077,10 +6845,14 @@ msgstr "Executa un reinici" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6089,13 +6861,13 @@ msgstr "" msgid "Phy Rate:" msgstr "Velocitat física:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Ajusts físics" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6108,11 +6880,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Paquets" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Si us plau entra el teu nom d'usuari i contrasenya." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6120,56 +6892,75 @@ msgstr "" msgid "Policy" msgstr "Política" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" -msgstr "Estatus de port" +msgstr "Estatus de port:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6192,13 +6983,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Evita la comunicació client a client" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6211,29 +7003,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Prioritat" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6251,8 +7045,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6264,13 +7058,13 @@ msgstr "Protocol" msgid "Provide NTP server" msgstr "Habilita el servidor NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6280,25 +7074,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6323,59 +7128,83 @@ msgstr "" msgid "Quality" msgstr "Calidad" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Llindar RTS/CTS" @@ -6388,10 +7217,16 @@ msgstr "RX" msgid "RX Rate" msgstr "Velocitat RX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6401,13 +7236,13 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" "Llegeix /etc/ethers per configurar el servidor DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "" @@ -6415,11 +7250,11 @@ msgstr "" msgid "Realtime Graphs" msgstr "Gràfiques en temps real" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6443,11 +7278,40 @@ msgstr "Arranca de nou el sistema operatiu del teu dispositiu" msgid "Receive" msgstr "Recepció" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Recepció" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Reconnex aquesta interfície" @@ -6455,12 +7319,12 @@ msgstr "Reconnex aquesta interfície" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6469,37 +7333,47 @@ msgstr "" msgid "References" msgstr "Referències" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Refrescant" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Relé" @@ -6509,6 +7383,10 @@ msgstr "Relé" msgid "Relay Bridge" msgstr "Pont de relé" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Relé entre xarxes" @@ -6518,6 +7396,14 @@ msgstr "Relé entre xarxes" msgid "Relay bridge" msgstr "Pont de relé" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6527,6 +7413,7 @@ msgstr "Adreça IPv4 remota" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Adreça IPv4 remota o FQDN" @@ -6539,15 +7426,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Treu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Reemplaça la configuració sense fil" @@ -6577,7 +7472,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6593,7 +7489,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6605,67 +7501,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6674,7 +7576,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6689,20 +7591,24 @@ msgstr "Reinicia els comptadors" msgid "Reset to defaults" msgstr "Reestableix els valors per defecte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Reiniciar" @@ -6711,7 +7617,7 @@ msgstr "Reiniciar" msgid "Restart Firewall" msgstr "Reinicia el tallafocs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6723,86 +7629,97 @@ msgstr "Restauració de la configuració" msgid "Restore backup" msgstr "Restaura còpia de seguretat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Mostra/amaga la contrasenya" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Reverteix" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Robustesa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6817,19 +7734,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6847,6 +7764,10 @@ msgstr "Contrasenya de l'encaminador" msgid "Routing" msgstr "Encaminament" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6861,24 +7782,24 @@ msgstr "" msgid "Rule" msgstr "Regla" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6898,11 +7819,24 @@ msgstr "" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6920,15 +7854,15 @@ msgstr "" msgid "SSH username" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "Claus SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6945,7 +7879,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6956,7 +7890,7 @@ msgid "Save" msgstr "Desar" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Desa i aplica" @@ -6973,7 +7907,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Escaneja" @@ -6982,11 +7916,16 @@ msgstr "Escaneja" msgid "Scheduled Tasks" msgstr "Tasques programades" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Secció afegida" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Secció treta" @@ -7001,9 +7940,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -7011,13 +7950,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -7036,11 +7975,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7065,16 +8008,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7084,14 +8031,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7105,11 +8052,15 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7117,33 +8068,37 @@ msgid "Setting PLMN failed" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 -msgid "Settings" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 +msgid "Settings" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" -msgstr "" +msgstr "IG curt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "" @@ -7156,16 +8111,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Atura aquesta interfície" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7173,15 +8128,15 @@ msgstr "Atura aquesta interfície" msgid "Signal" msgstr "Senyal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7189,12 +8144,12 @@ msgstr "" msgid "Signal:" msgstr "Senyal:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Mida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7211,12 +8166,12 @@ msgstr "Salta" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Salta al contingut" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Salta a la navegació" @@ -7234,14 +8189,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "No es pot desar els valors perquè alguns camps estan invàlids!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Tristament, l'object que heu sol·licitat no s'ha trobat." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Tristament, el servidor ha encontrat un error inesperat." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7249,8 +8200,8 @@ msgid "" "instructions." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7277,26 +8228,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7321,7 +8272,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7329,7 +8280,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7337,20 +8288,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "Especifica el directori a que el dispositiu està adjuntat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7378,7 +8329,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7395,7 +8346,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7426,15 +8377,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7456,19 +8407,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7488,7 +8439,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7583,15 +8534,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Especifiqueu el clau de xifració secret aquí." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Inici" @@ -7604,16 +8563,16 @@ msgstr "" msgid "Start priority" msgstr "Prioritat d'inici" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7622,6 +8581,10 @@ msgstr "" msgid "Startup" msgstr "Arrencada" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Rutes IPv4 estàtiques" @@ -7635,7 +8598,7 @@ msgstr "Rutes IPv6 estàtiques" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Leases estàtics" @@ -7645,25 +8608,25 @@ msgstr "Leases estàtics" msgid "Static address" msgstr "Adreça estàtica" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Estat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Atura" @@ -7672,8 +8635,8 @@ msgstr "Atura" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7681,11 +8644,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Ordre estricte" @@ -7694,15 +8657,15 @@ msgid "Strong" msgstr "Fort" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Envia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7733,7 +8696,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Protocol de commutador" @@ -7743,7 +8706,7 @@ msgstr "Protocol de commutador" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7755,8 +8718,16 @@ msgstr "" msgid "Sync with browser" msgstr "Sincronitza amb el navegador" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7780,9 +8751,9 @@ msgstr "Propietats del sistema" msgid "System log buffer size" msgstr "Mida de la memòria intermèdia per al registre del sistema" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7811,7 +8782,7 @@ msgstr "" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Arrel del servidor TFTP" @@ -7824,26 +8795,37 @@ msgstr "TX" msgid "TX Rate" msgstr "Velocitat TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Taula" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Destí" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7859,26 +8841,26 @@ msgstr "" msgid "Terminate" msgstr "Acaba" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7894,7 +8876,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7906,18 +8892,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7925,6 +8917,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7939,6 +8932,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7949,7 +8948,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7966,21 +8965,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -7992,13 +8995,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8018,18 +9021,18 @@ msgstr "" "El fitxer de dispositiu de la memòria o partició (p.e. /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8046,7 +9049,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Les següents regles estan actualment actives en aquest sistema." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -8054,31 +9057,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8102,6 +9121,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8116,7 +9136,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8125,7 +9145,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8133,19 +9153,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8159,14 +9179,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8179,31 +9199,31 @@ msgstr "" msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8243,6 +9263,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8266,30 +9294,37 @@ msgstr "" "La imatge pujada no conté un format suportat. Assegura't de triar el format " "d'imatge genèric per la teva plataforma." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8302,16 +9337,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8324,6 +9359,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8339,7 +9385,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "Aquest és l'únic DHCPconfiguration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8445,7 +9495,7 @@ msgstr "" "inicial, fes clic a \"Restableix la configuració\" (només funciona amb " "imatges squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "To" @@ -8453,12 +9503,16 @@ msgstr "To" msgid "Total Available" msgstr "Total disponible" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Rastre de ruta" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8470,11 +9524,11 @@ msgstr "Trànsit" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8491,6 +9545,27 @@ msgstr "Transmissió" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Antena transmissora" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8529,7 +9604,7 @@ msgstr "Interfície del túnel" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8538,13 +9613,13 @@ msgid "Tx-Power" msgstr "Potència Tx" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Tipus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8593,7 +9668,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8644,19 +9719,31 @@ msgstr "No s'ha pogut reiniciar el tallafocs: %s" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Desconfigura" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8670,7 +9757,7 @@ msgstr "" msgid "Unknown" msgstr "Desconegut" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8694,11 +9781,11 @@ msgstr "Sense gestionar" msgid "Unmount" msgstr "Desmunta" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Canvis sense desar" @@ -8712,15 +9799,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Tipus de protocol no suportat." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8732,7 +9829,7 @@ msgstr "Amunt" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Puja" @@ -8747,58 +9844,66 @@ msgstr "" msgid "Upload archive..." msgstr "Puja un arxiu..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "Es consultaran els servidors DNS " "segons l'ordre del fitxer de resolució" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Temps en marxa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Fes servir /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8807,13 +9912,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8859,22 +9969,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "Utilitza la bandera de difusió" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "" @@ -8898,15 +10011,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Empra els certificats del sistema" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8929,69 +10042,71 @@ msgstr "" msgid "Used" msgstr "Usat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Nom d'usuari" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -9001,7 +10116,7 @@ msgstr "VLANs en %q" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:54 msgid "VPN" -msgstr "VPN" +msgstr "XPV (VPN)" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:42 msgid "VPN Local address" @@ -9011,24 +10126,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Servidor VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -9037,6 +10155,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -9050,14 +10172,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9083,7 +10205,7 @@ msgstr "Venedor" msgid "Vendor Class to send when requesting DHCP" msgstr "Classe de venidor per enviar al sol·licitar DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9091,12 +10213,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9104,34 +10226,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "Sistema obert WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Clau compartit WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Contrasenya WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Mode WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Contrasenya WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9160,48 +10294,100 @@ msgstr "" msgid "Weak" msgstr "Dèbil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Amplada" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +#, fuzzy +msgid "WireGuard Status" +msgstr "Estat de tallafocs" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9217,21 +10403,21 @@ msgid "Wireless Adapter" msgstr "Adaptador sense fils" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Xarxa sense fils" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Resum sense fils" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Seguretat sense fils" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9247,15 +10433,15 @@ msgstr "El dispositiu sense fils està inhabilitat" msgid "Wireless is not associated" msgstr "El dispositiu sense fils està sense associar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "La xarxa sense fil està inhabilitada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "La xarxa sense fils està habilitada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Escriure les peticions DNS rebudes al registre del sistema" @@ -9267,7 +10453,7 @@ msgstr "Escriure el registre del sistema al fitxer" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9294,8 +10480,20 @@ msgstr "" "Si desactives scripts d'inici necessaris com el \"network\", el teu " "dispositiu pot resultar inaccessible!
    " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9326,34 +10524,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "qualsevol" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automàtic" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "pontejat" @@ -9410,25 +10628,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "inhabilita" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "deshabilitat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9437,14 +10660,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "caducat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "forçat" @@ -9454,22 +10686,22 @@ msgstr "forçat" msgid "forward" msgstr "transemès" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "amagat" @@ -9478,9 +10710,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9488,6 +10720,10 @@ msgstr "" msgid "ignore" msgstr "ignora" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9502,11 +10738,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9515,11 +10759,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minuts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9531,18 +10775,26 @@ msgstr "" msgid "no" msgstr "no" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "cap enllaç" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "cap" @@ -9553,20 +10805,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "parat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9575,6 +10827,10 @@ msgstr "" msgid "output" msgstr "sortida" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9592,23 +10848,32 @@ msgstr "" msgid "random" msgstr "aleatori" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "encaminat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "seg" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9616,7 +10881,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9624,7 +10889,7 @@ msgstr "" msgid "tagged" msgstr "etiquetat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9635,25 +10900,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "desconegut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "il·limitat" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9675,8 +10942,8 @@ msgid "untagged" msgstr "sense etiquetar" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9689,7 +10956,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9718,7 +10985,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9755,8 +11022,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9796,11 +11063,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9810,43 +11087,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" diff --git a/package/luci/modules/luci-base/po/cs/base.po b/package/luci/modules/luci-base/po/cs/base.po index 738d58d0b4..980e90554c 100644 --- a/package/luci/modules/luci-base/po/cs/base.po +++ b/package/luci/modules/luci-base/po/cs/base.po @@ -1,33 +1,49 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-07-30 11:20+0000\n" -"Last-Translator: Jakub Brož \n" -"Language-Team: Czech \n" +"PO-Revision-Date: 2023-09-30 22:00+0000\n" +"Last-Translator: David Rapaň \n" +"Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 5.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "!known (neznámý)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" tabulka \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d bitů" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d neplatných kolonek" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d hodin zpět" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d minut zpět" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d sekund zpět" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s je neotagováno ve více VLAN!" @@ -52,32 +68,33 @@ msgstr "(prázdný)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(nepřipojeno žádné rozhraní)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" -msgstr "" +msgstr "+ %d víc" #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:48 msgid "-- Additional Field --" msgstr "-- Doplňující pole --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Vyberte --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- vlastní --" @@ -103,7 +120,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = nepoužít práh RSSI, 1 = neměnit výchozí nastavení ovladače" @@ -116,13 +133,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Vytížení za 1 minutu:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "1 flag" +msgstr[1] "%d flags" +msgstr[2] "%d flags" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12h (12 hodin - default)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" @@ -138,12 +160,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3h (3 hodiny)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "čtyřznakový šestnáctkový identifikátor" @@ -156,43 +183,104 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Vytížení za 5 minut:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5m (5 minut)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "6oktetový identifikátor jako šestnáctkový řetězec - bez dvojteček" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7d (7 dní)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +#, fuzzy +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: Povolit hlášení o zprávách pomocí rádiových měření." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Povolit hlášení o sousedech pomocí rádiových měření." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r Fast Transition" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: BSS Max Idle. Jednotky: sekundy." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: Řízení přechodu v rámci základní sady služeb (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Oznamování místního časového pásma v řídicích rámcích." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Proxy ARP umožňuje ne-AP STA zůstat v režimu úspory energie déle." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Oznamování času v řídicích rámcích." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Řízení bezdrátové sítě (WNM) režim spánku (rozšířený režim spánku " +"pro stanice)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Opravy režimu spánku řízení bezdrátové sítě (WNM): Brání " +"reinstalačním útokům." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "Maximální časový limit 802.11w Association SA Query" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "Časový limit opakování 802.11w Association SA Query" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w Zabezpečení Řídících Rámců" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "Maximální časový limit 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "801.11w časový limit opětovného pokusu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-maska sítě" @@ -204,80 +292,108 @@ msgstr "Nastavení LED" msgid "LED Name" msgstr "Název pro LED kontrolku" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-Proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" -msgstr "" +msgstr "RA Flagy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" -msgstr "" +msgstr "RA Hop limit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" -msgstr "" +msgstr "RA Doba trvání" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" +msgstr "RA-Služba" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." msgstr "" +"/#/ odpovídá jakékoli doméně. /example.com/ vrací " +"NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# vrací NULL adresu (0.0.0.0 a " +"::) pro example.com a její subdomény." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" -msgstr "" +msgstr "%s větší než %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:85 msgctxt "nft relational \">=\" operator expression" msgid "%s greater than or equal to %s" -msgstr "" +msgstr "%s větší než nebo rovno %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:90 msgctxt "nft set match expression" msgid "%s in set %s" -msgstr "" +msgstr "%s v množině %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:83 msgctxt "nft relational \"==\" operator expression" msgid "%s is %s" -msgstr "" +msgstr "%s je %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:89 msgctxt "nft relational \"in\" operator expression" msgid "%s is one of %s" -msgstr "" +msgstr "%s je jedním z %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:88 msgctxt "nft relational \"<\" operator expression" msgid "%s lower than %s" -msgstr "" +msgstr "%s menší než %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:86 msgctxt "nft relational \"<=\" operator expression" msgid "%s lower than or equal to %s" -msgstr "" +msgstr "%s menší než nebo rovno %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:84 msgctxt "nft relational \"!=\" operator expression" msgid "%s not %s" -msgstr "" +msgstr "%s není %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:91 msgctxt "nft not in set match expression" msgid "%s not in set %s" +msgstr "%s není v množině %s" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." msgstr "" +"Nod batman-adv může běžet buď v režimu serveru (sdílení svého internetového " +"připojení s mesh sítí), nebo v režimu klienta (hledání nejvhodnějšího " +"internetového připojení v mesh síti), nebo může být zcela vypnutá podpora " +"brány (což je výchozí nastavení)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Konfigurace zařízení \"%s\" již existuje" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Složka se stejným názvem už existuje." @@ -286,25 +402,90 @@ msgid "A new login is required since the authentication session expired." msgstr "" "Je třeba se znovu přihlásit, protože platnost relace přihlášení skončila." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (všechny varianty) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (všechny varianty) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (všechny varianty) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (všechny varianty) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (všechny varianty) Annex B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (všechny varianty) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (všechny varianty) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annex L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -327,7 +508,7 @@ msgstr "Ověření ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:374 msgid "ARP mode to consider a slave as being up" -msgstr "" +msgstr "Režim ARP pro zvážení slave jako aktivního (online)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:79 msgid "ARP monitoring is not supported for the selected policy!" @@ -337,29 +518,40 @@ msgstr "Monitorování ARP není podporováno vybranými zásadami!" msgid "ARP retry threshold" msgstr "ARP limit opakování" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" +msgstr "ARP tabulka provozu \"%h\"" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." msgstr "" +"ARP, IPv4 a IPv6 (včetně 802.1Q) s multicastovými MAC adresami jsou " +"odesílány jako unicast na MAC adresu STA. Poznámka: Toto není služba " +"směrovaného multicastu (DMS) v 802.11v. Poznámka: může narušit očekávání " +"multicastu u příjemce STA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (asynchronní režim přenosu)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM mosty" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "Identifikátor virtuálního kanálu ATM (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "Identifikátor virtuální cesty ATM (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -369,36 +561,32 @@ msgstr "" "virtuální síťová rozhraní Linuxu, které mohou být použity ve spojení s DHCP " "nebo PPP vytáčeného připojení od poskytovatele sítě." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "číslo ATM zařízení" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C identifikace výrobce systému" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Rozhraní chybí" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Omezit obsluhování DNS na rozhraní podsítí, na kterých je DNS poskytováno." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Akceptovat lokální" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:95 msgctxt "nft accept action" msgid "Accept packet" -msgstr "" +msgstr "Příjmout paket" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Akceptovat pakety s lokální zdrojovou adresou" @@ -406,16 +594,25 @@ msgstr "Akceptovat pakety s lokální zdrojovou adresou" msgid "Access Concentrator" msgstr "Přístupový koncentrátor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Přístupový bod" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Izolace přístupového bodu" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Přístupové technologie" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Akce" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Aktivní" @@ -451,10 +648,10 @@ msgstr "Aktivní pravidla pro IPv6" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:205 msgid "Active-Backup policy (active-backup, 1)" -msgstr "" +msgstr "Aktivní-záložní pravidla (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -471,18 +668,18 @@ msgstr "Adaptivní vyvažování přenosové zátěže (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Přidat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Přidat ATM most" @@ -502,11 +699,11 @@ msgstr "Přidat akci LED kontrolky" msgid "Add VLAN" msgstr "Přidat síť VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Přidat konfiguraci zařízení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Přidat konfiguraci zařízení…" @@ -514,18 +711,18 @@ msgstr "Přidat konfiguraci zařízení…" msgid "Add instance" msgstr "Přidat instanci" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Přidat klíč" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "Přidat lokální koncovku k doménovým jménům ze souboru hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Přidat rozhraní..." @@ -533,6 +730,10 @@ msgstr "Přidat rozhraní..." msgid "Add peer" msgstr "Přidat protistranu" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "Přidejte statické směrovací a reverzní DNS záznamy pro tohoto hosta." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Přidat na blacklist" @@ -541,11 +742,11 @@ msgstr "Přidat na blacklist" msgid "Add to Whitelist" msgstr "Přidat na whitelist" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Dodatečné Hosts soubory" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Soubor s dalšími servery" @@ -562,20 +763,24 @@ msgstr "Soubor s dalšími servery" msgid "Address" msgstr "Adresa" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" -msgstr "" +msgstr "Rodina adres" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:284 msgid "Address setting is invalid" -msgstr "" +msgstr "Nastavení adresy není validní" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 msgid "Address to access local relay bridge" msgstr "Adresa pro přístup k místnímu relay bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Adresy" @@ -584,29 +789,29 @@ msgstr "Adresy" msgid "Administration" msgstr "Správa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Pokročilá nastavení" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Pokročilé nastavení zařízení" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" -msgstr "" +msgstr "Ageing time" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Celkový vysílací výkon (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Agregovat zprávy původce" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -615,16 +820,22 @@ msgstr "Logika výběru agregace" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:263 msgid "Aggregator: All slaves down or has no slaves (stable, 0)" msgstr "" +"Agregátor: Všechny slave uzly jsou offline nebo nemá žádné slave uzly " +"(stabilní, 0)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:265 msgid "" "Aggregator: Chosen by the largest number of ports + slave added/removed or " "state changes (count, 2)" msgstr "" +"Agregátor: Vybrán na základě největšího počtu portů + přidání/odebrání slave " +"uzlů nebo změn v jejich stavu (počet, 2)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:264 msgid "Aggregator: Slave added/removed or state changes (bandwidth, 1)" msgstr "" +"Agregátor: Přidání/odebrání slave uzlů nebo změny v jejich stavu (šířka " +"pásma, 1)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:192 msgid "Alert" @@ -640,17 +851,17 @@ msgstr "Alternativní název rozhraní" msgid "Alias of \"%s\"" msgstr "Alternativní název „%s“" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Všechny servery" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "Postupné přidělování adres IP od nejnižší dostupné adresy." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Postupné přidělování adres IP" @@ -658,13 +869,13 @@ msgstr "Postupné přidělování adres IP" msgid "Allow SSH password authentication" msgstr "Umožnit v SSH ověřování heslem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" "Povolit přístupovému bodu (v režimu Access Point) odpojit připojené stanice " "při nízkém počtu potvrzovacích zpráv ACK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Povolit vše mimo uvedené" @@ -672,15 +883,15 @@ msgstr "Povolit vše mimo uvedené" msgid "Allow full UCI access for legacy applications" msgstr "Povolit plný přístup UCI pro starší aplikace" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Povolit starší rychlosti 802.11b" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Povolit pouze uvedené" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Povolit localhost" @@ -703,19 +914,24 @@ msgid "Allow system feature probing" msgstr "Povolit zkoumání funkcí systému" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Povolit root účtu přihlášení bez nastaveného hesla" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "IP adresy, ze kterých umožnit přístup" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "Povolená technologie sítě" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" -msgstr "" +msgstr "Nastavení AllowedIPs není validní" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Vždy" @@ -727,11 +943,12 @@ msgstr "Vždy vypnuto (jádro: žádné)" msgid "Always on (kernel: default-on)" msgstr "Vždy zapnuto (jádro: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" +"Vždy odesílat DHCP možnosti. Někdy je to potřeba, například s PXELinuxem." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -739,9 +956,13 @@ msgstr "" "Vždy používat kanály šířky 40 MHz, i když se sekundární kanál překrývá. " "Použití této možnosti nevyhovuje standardu IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" -msgstr "" +msgstr "Množství sond k odeslání pro detekci duplicitní adresy" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Doba čekání v sekundách, než je modem připravený" #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" @@ -751,98 +972,55 @@ msgstr "Při ukládání formuláře došlo k chybě:" msgid "An optional, short description for this device" msgstr "Volitelný, krátký popis zařízení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annex A + L + M (všechny)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Annex A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Annex A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Annex A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Annex A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Annex B (všechny)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Annex B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Annex B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Annex B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Annex J (všechno)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Annex L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Annex M (všechny)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Annex M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"Oznámit NAT64 prefix v RA " +"zprávách." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Oznamovat tohoto zařízení jako IPv6 DNS server." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" +"Oznámit toto zařízení jako výchozí směrovač, pokud je přítomna místní IPv6 " +"výchozí trasa." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" +"Oznámit toto zařízení jako výchozí směrovač, pokud je k dispozici veřejný " +"IPv6 prefix, bez ohledu na dostupnost místní výchozí trasy." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" +"Oznámit toto zařízení jako výchozí směrovač, bez ohledu na přítomnost " +"prefixu nebo výchozí trasy." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Oznámené DNS domény" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" -msgstr "" +msgstr "Oznámené IPv6 DNS servery" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Anonymní identita" @@ -854,10 +1032,10 @@ msgstr "Anonymní připojení" msgid "Anonymous Swap" msgstr "Anonymní odkládací oddíl/soubor" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" -msgstr "" +msgstr "Jakýkoliv paket" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:84 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:174 @@ -866,60 +1044,64 @@ msgstr "" msgid "Any zone" msgstr "Libovolná zóna" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." -msgstr "" +msgstr "Použít DHCP možnosti pro tuto síť. (Prázdné = všichni klienti)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" -msgstr "" +msgstr "Aplikovat a ponechat nastavení" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 msgid "Apply backup?" msgstr "Aplikovat zálohu?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Provádění požadavku selhalo se stavem %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Použít nezkontrolované" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" +"Aplikovat s podmínkou návratu původního nastavení při ztrátě konektivity" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Aplikuji změny nastavení… %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Architektura" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" -msgstr "" +msgstr "Arp-sken" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Přiřadit zadanou délku každého veřejného IPv6 prefixu k tomuto rozhraní" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "Přiřadit nové volně formulované tagy k této položce." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 -#, fuzzy msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -"Přiřadit části prefixu pomocí šestnáctkového subprefixového ID k tomuto " +"Přiřadit části prefixu pomocí tohoto hexadecimálního ID podprefixu pro toto " "rozhraní." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Připojení klienti" @@ -928,15 +1110,17 @@ msgstr "Připojení klienti" msgid "Associations" msgstr "Přiřazení" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 +#, fuzzy msgid "" "At least %h per %h, burst of %h" msgstr "" +"Alespoň %h z %h, burst %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -947,26 +1131,27 @@ msgid "Attempt to enable configured mount points for attached devices" msgstr "" "Pokusit se povolit nakonfigurované přípojné body pro připojená zařízení" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 #, fuzzy msgid "Auth Group" msgstr "Autorizační skupina" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Ověřování se" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Typ ověřování se" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autoritativní" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Vyžadováno ověření se" @@ -974,7 +1159,9 @@ msgstr "Vyžadováno ověření se" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -992,7 +1179,7 @@ msgstr "Automatický Homenet (HNCP)" msgid "Automatically check filesystem for errors before mounting" msgstr "Před připojením automaticky zkontrolovat souborový systém na chyby" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1016,6 +1203,10 @@ msgstr "Automaticky připojovat souborový systém" msgid "Automount Swap" msgstr "Automaticky připojovat odkládací oddíl/soubor" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "K dispozici" @@ -1034,11 +1225,15 @@ msgstr "K dispozici" msgid "Average:" msgstr "Průměr:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1046,15 +1241,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Zpět" @@ -1063,11 +1262,7 @@ msgstr "Zpět" msgid "Back to Overview" msgstr "Zpět na přehled" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Zpět na nastavení" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1080,16 +1275,15 @@ msgid "Backup / Flash Firmware" msgstr "Zálohovat / nahrát firmware" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Seznam souborů k zálohování" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Frekvenční pásmo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Základní zařízení" @@ -1097,12 +1291,35 @@ msgstr "Základní zařízení" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Interval majáku (beacon)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1116,7 +1333,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "Dynamicky navázat k rozhraním místo wildcard adresy (doporučeno jako výchozí " @@ -1127,18 +1344,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Navázat k rozhraní" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1150,65 +1380,77 @@ msgstr "Navázat tunel k rozhraní (volitelné)." msgid "Bitrate" msgstr "Přenosová rychlost" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" -msgstr "Síťový most" +msgstr "Bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Zařízení síťového mostu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Porty síťového mostu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Číslo síťového mostu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Zapnout po startu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Procházet…" @@ -1216,16 +1458,38 @@ msgstr "Procházet…" msgid "Buffered" msgstr "Ve vyrovnávací paměti" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "Certifikát cert. autority; pokud je prázdné, bude uloženo po prvním " "připojení." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "Nastavení CLAT se nezdařilo" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Vytížení procesoru (%)" @@ -1240,51 +1504,56 @@ msgstr "Mezipaměť" msgid "Call failed" msgstr "Volání se nezdařilo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" -msgstr "Storno" +msgstr "Zrušit" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:347 msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1293,45 +1562,53 @@ msgstr "" msgid "Category" msgstr "Kategorie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Omezení certifikátu (doména)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Omezení certifikátu (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Omezení certifikátu (subjekt)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Omezení certifikátu (wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1343,16 +1620,16 @@ msgstr "" msgid "Chain" msgstr "Řetěz" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Změny" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Změny byly vzaty zpět." @@ -1363,18 +1640,19 @@ msgstr "Změní administrátorské heslo pro přístup k zařízení" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Kanál" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Analýza kanálů" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Šířka kanálu" @@ -1382,7 +1660,7 @@ msgstr "Šířka kanálu" msgid "Check filesystems before mount" msgstr "Zkontrolovat souborové systémy před připojením" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" "Zaškrtněte toto políčko pro odstranění stávajícících sítí z tohoto rádiového " @@ -1401,8 +1679,8 @@ msgstr "Kontroluji obraz…" msgid "Choose mtdblock" msgstr "Zvolte mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1414,7 +1692,7 @@ msgstr "" "zóny a její následné přiřazení danému rozhraní vyplňte pole vytvořit." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1422,7 +1700,7 @@ msgstr "" "Vyberte síť(ě), které chcete připojit k tomuto bezdrátovému rozhraní, nebo " "vyplňte pole vytvořit a pojmenujte novou síť." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Šifra" @@ -1445,9 +1723,10 @@ msgstr "" "Klepnutím na \"Uložit mtdblock\" stáhnete zadaný soubor mtdblock. (POZOR: " "TATO FUNKCE JE PRO PROFESIONÁLY!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Klient" @@ -1456,9 +1735,9 @@ msgstr "Klient" msgid "Client ID to send when requesting DHCP" msgstr "Identifikátor klienta, odesílaný v DHCP požadavku" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Zavřít" @@ -1475,20 +1754,20 @@ msgstr "" "Uzavírat neaktivní spojení po daném počtu sekund. Pro vypnutí časového " "omezení použijte jako hodntu nulu" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Zavřít seznam…" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Shromažďování údajů…" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Příkaz" @@ -1505,7 +1784,7 @@ msgstr "Vykonání příkazu se nezdařilo" msgid "Comment" msgstr "Komentář" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1529,29 +1808,28 @@ msgstr "Vypočítat odchozí kontrolní součet (volitelné)." msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Nastavení" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Změny nastavení byly provedeny." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Změny nastavení byly vráceny zpět!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Nastavení se nezdařilo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1561,28 +1839,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Konfigurovat…" @@ -1594,9 +1872,10 @@ msgstr "Potvrdit odpojení" msgid "Confirmation" msgstr "Potvrzení" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Připojeno" @@ -1606,11 +1885,11 @@ msgstr "Připojeno" msgid "Connection attempt failed" msgstr "Pokus o připojení se nezdařil" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "Pokus o připojení se nezdařil." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1622,7 +1901,7 @@ msgstr "Spojení ztraceno" msgid "Connections" msgstr "Připojení" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1650,9 +1929,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Obsah byl uložen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1663,16 +1942,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1686,20 +1965,20 @@ msgstr "" msgid "Country" msgstr "Země" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Kód země" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Vytvořit / přiřadit zónu brány firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Vytvořit rozhraní" @@ -1711,7 +1990,7 @@ msgstr "Kritické" msgid "Cron Log Level" msgstr "Úroveň protokolování Cronu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Stávající výkon" @@ -1754,31 +2033,31 @@ msgstr "" "Upraví chování LED diod zařízení " "pokud je to možné." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE klient" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAE-Secret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP a DNS" @@ -1789,16 +2068,22 @@ msgstr "DHCP a DNS" msgid "DHCP client" msgstr "DHCP klient" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Volby DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "Klient DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "Služba DHCPv6" @@ -1810,19 +2095,19 @@ msgstr "Služba DHCPv6" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Přeposílání DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "port dotazů DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "port serveru DNS" @@ -1830,7 +2115,7 @@ msgstr "port serveru DNS" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1838,11 +2123,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "DNSSEC kontrolovat nepodepsané" @@ -1854,39 +2139,47 @@ msgstr "Limit času nečinnosti protistrany (DPD timeout)" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "Stav DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "Režim DSL linky" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "Interval DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Rychlost přenosu dat" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Přijatá data" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Odeslaná data" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Ladění" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Výchozí router" @@ -1894,7 +2187,7 @@ msgstr "Výchozí router" msgid "Default state" msgstr "Výchozí stav" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1903,61 +2196,62 @@ msgstr "" "Další možnosti DHCP, například \"6,192.168.2.1,192.168.2.2\", " "které odkazuje na různé DNS servery pro klienty." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "Delegovat prefix IPv6" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Odstranit" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Smazat klíč" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Odstranění se nezdařilo: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Odstranit tuto síť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Interval zprávy Delivery Traffic Indication" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Popis" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Zrušit označení" @@ -1965,11 +2259,11 @@ msgstr "Zrušit označení" msgid "Design" msgstr "Vzhled" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2004,9 +2298,9 @@ msgstr "Cílová zóna" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2016,36 +2310,40 @@ msgstr "Cílová zóna" msgid "Device" msgstr "Zařízení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Nastavení zařízení" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Zařízení není aktivní" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Zařízení se restartuje…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Název zařízení" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Zařízení není spravováno nástrojem ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Zařízení není přítomné" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Druh zařízení" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Zařízení nedostupné!" @@ -2053,31 +2351,31 @@ msgstr "Zařízení nedostupné!" msgid "Device unreachable! Still waiting for device..." msgstr "Zařízení není dostupné! Pokračuje čekání na zařízení..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Zařízení" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnostika" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Vytáčené číslo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Adresář" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Zakázat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2094,20 +2392,24 @@ msgstr "Zakázat DNS překlad" msgid "Disable Encryption" msgstr "Zakázat šifrování" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Zakázat dotazování na nečinnost" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Vypnout tuto síť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2116,33 +2418,33 @@ msgstr "Vypnout tuto síť" msgid "Disabled" msgstr "Zakázáno" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" -msgstr "" +msgstr "Zakázáno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Zrušit spojení při nízkém počtu ACK potvrzení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." -msgstr "Vyřadit upstream RFC1918 odpovědi." +msgstr "" +"Vyřadit upstream odpovědi, které obsahují RFC1918 adresy." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Odpojit" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Pokud o odpojení se nezdařil" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Pokud o odpojení se nezdařil." @@ -2152,29 +2454,41 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Zahodit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Optimalizace na vzdálenost" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Vzdálenost nejodlehlejšího člena sítě v metrech." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP serveru a DNS forwarderu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" "Neukládat negativní odpovědi do mezipaměti (např. pro neexistující domény)." @@ -2197,36 +2511,25 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "Nepřeposílat DNS dotazy bez DNS jména." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Nepřeposílat požadavky, které nemohou být zodpovězeny veřejnými jmennými " -"servery." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Nepřeposílat reverzní dotazy na místní sítě." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Zabránit naslouchání na těchto rozhraních." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2236,17 +2539,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Opravdu chcete „%s“ smazat?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Opravdu chcete smazat následující SSH klíč?" @@ -2254,11 +2557,11 @@ msgstr "Opravdu chcete smazat následující SSH klíč?" msgid "Do you really want to erase all settings?" msgstr "Opravdu chcete smazat veškeré nastavení?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Opravdu chcete smazat složku „%s“ a tím i vše, co obsahuje?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2266,15 +2569,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Vyžadována doména" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Whitelist domén" @@ -2300,11 +2605,11 @@ msgstr "Stáhnout zálohu" msgid "Download mtdblock" msgstr "Stáhnout si mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Downstream SNR offset" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2319,16 +2624,54 @@ msgstr "Pořadí změníte přetažením" msgid "Drop Duplicate Frames" msgstr "Zavrhnout duplikátní rámce" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Instance Dropbear" @@ -2346,20 +2689,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Dynamický DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2367,7 +2710,7 @@ msgstr "" msgid "Dynamic tunnel" msgstr "Dynamický tunel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2375,21 +2718,33 @@ msgstr "" "Pro klienty alokovat DHCP adresy dynamicky. Pokud je volba zakázána, budou " "obsloužení pouze klienti se statickými výpůjčkami." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "EA bitová délka" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Metoda EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Upravit" @@ -2397,6 +2752,10 @@ msgstr "Upravit" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2405,11 +2764,11 @@ msgstr "" "Upravte výše uvedená nezpracovaná konfigurační data a opravte všechny chyby, " "a klepnutím na tlačítko \"Uložit\" stránku znovu načtěte." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Upravit tuto síť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Upravit bezdrátovou síť" @@ -2418,44 +2777,34 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Záchrana" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Povolit" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2463,11 +2812,11 @@ msgstr "" "Povolit IGMP " "snooping" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Povolit STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2485,10 +2834,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "Povolit dynamickou aktualizaci koncového bodu HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Povolit IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Povolit vyjednávání IPv6" @@ -2502,11 +2852,15 @@ msgstr "Povolit vyjednávání IPv6" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Na PPP spoji povolit vyjednání IPv6" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Povolit průchod jumbo rámců" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2518,11 +2872,11 @@ msgstr "Povolit NTP klienta" msgid "Enable Single DES" msgstr "Povolit Single DES" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Zapnout TFTP server" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Povolit filtrování VLAN" @@ -2530,7 +2884,7 @@ msgstr "Povolit filtrování VLAN" msgid "Enable VLAN functionality" msgstr "Zapnout funkci VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Povolit tlačítko WPS, vyžaduje WPA(2)-PSK / WPA3-SAE" @@ -2541,12 +2895,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Zapnout opatření proti reinstalaci klíče (KRACK)" @@ -2562,24 +2916,24 @@ msgstr "Zapnout zrcadlení příchozích paketů" msgid "Enable mirroring of outgoing packets" msgstr "Zapnout zrcadlení odchozích paketů" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Zapnout promiskuitní režim" @@ -2601,11 +2955,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Povolit příznak DF (Nefragmentovat) zapouzdřujících paketů." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Zapnout tuto síť" @@ -2614,21 +2968,24 @@ msgstr "Zapnout tuto síť" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Zapnuto" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Povolit IGMP snooping na tomto mostu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2636,7 +2993,13 @@ msgstr "" "Umožňuje rychlý roaming mezi přístupovými body, které patří do stejné domény " "mobility" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Na tomto síťovém mostě povolit Spanning Tree Protocol" @@ -2644,24 +3007,29 @@ msgstr "Na tomto síťovém mostě povolit Spanning Tree Protocol" msgid "Encapsulation limit" msgstr "Limit zapouzdření" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Režim zapouzdřování" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Šifrování" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Koncový bod" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Koncový bod" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Port koncového bodu" @@ -2669,23 +3037,23 @@ msgstr "Port koncového bodu" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2714,10 +3082,6 @@ msgstr "Chyba" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Sekund s chybami (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2736,11 +3100,17 @@ msgstr "Každých 30 vteřin (pomalý, 0)" msgid "Every second (fast, 1)" msgstr "Každou vteřinu (rychlý, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Vynechat rozhraní" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2748,27 +3118,35 @@ msgstr "" "Vyjmout rozsahy 127.0.0.0/8 a ::1 z kontroly na " "rebinding, např. pro RBL služby." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Existující zařízení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Rozšířit hostitele" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Očekávána šestnáctková hodnota" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Očekávání platné adresy IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Očekávání platné adresy IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2777,11 +3155,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Očekáváno: %s" @@ -2793,7 +3171,7 @@ msgstr "" msgid "Expires" msgstr "Platnost skončí" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 #, fuzzy msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." @@ -2804,11 +3182,11 @@ msgstr "" msgid "External" msgstr "Vnější" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Seznam držitelů externích klíčů R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Seznam držitelů externích klíčů R1" @@ -2836,66 +3214,94 @@ msgstr "Dodatečné nastavení pppd" msgid "Extra sstpc options" msgstr "Dodatečné nastavení sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT přes DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT vzduchem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "FT protokol" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Nepodařilo se změnit systémové heslo." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 #, fuzzy msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" "Nepodařilo se potvrdit provedení změn během %d sekund, čekání na vrácení " "změn zpět…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Nepodařilo se vykonat „/etc/init.d/%s %s“ akce: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Soubor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -"Tento soubor může obsahovat řádky jako 'server=/domain/1.2.3.4' " -"nebo 'server=1.2.3.4' pro konkrétní doménové nebo plně " -"nadřazené DNS servery." +"Seznam souborů s názvy serverů poskytovatelů služeb, volitelně specifických " +"pro určité domény, např. server=1.2.3.4 nebo server=/" +"domain/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Soubor není přístupný" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "Soubor, ve kterém budou uloženy zadané DHCP výpůjčky (leases)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "Soubor s nadřazenými resolvery." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Název souboru" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Název souboru s bootovacím obrazem oznamovaný klientům." @@ -2904,14 +3310,22 @@ msgstr "Název souboru s bootovacím obrazem oznamovaný klientům." msgid "Filesystem" msgstr "Souborový systém" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filtrovat soukromé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filtrovat nepotřebné" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "" @@ -2924,8 +3338,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Dokončení se nezdařilo" @@ -2937,7 +3356,7 @@ msgstr "" "Najít všechny aktuálně připojené souborové a odkládací systémy a nahradit " "konfiguraci výchozími detekovanými hodnotami" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Vyhledat a připojit se k síti" @@ -2951,10 +3370,11 @@ msgid "Firewall" msgstr "Brána firewall" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Označkování brány firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Nastavení brány firewall" @@ -2962,19 +3382,19 @@ msgstr "Nastavení brány firewall" msgid "Firewall Status" msgstr "Stav brány firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Soubor s firmware" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Verze firmware" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Pevný zdrojový port pro odchozí DNS dotazy." @@ -3000,40 +3420,48 @@ msgstr "Operace nad flash pamětí" msgid "Flashing…" msgstr "Flashování…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Vynutit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Vynutit 40MHz režim" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Vynutit CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Na této síti vynutit DHCP i v případě zjištění jiného serveru." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "Vynutit verzi IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "Vynutit verzi MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Vynutit TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Vynutit TKIP a CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Vynutit spojení" @@ -3045,11 +3473,11 @@ msgstr "Vynutit přechod na novější verzi" msgid "Force use of NAT-T" msgstr "Vynutit použití NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Neshoda tokenu formuláře" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3068,38 +3496,42 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Přeposílat DHCP provoz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "Dopředné korekce chyb v sekundách (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Přeposílat broadcasty" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 #, fuzzy msgid "Forward mesh peer traffic" msgstr "Forwardovat provoz mesh protistran" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Režim přeposílání" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Hranice fragmentace" @@ -3123,7 +3555,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Pouze GPRS" @@ -3143,12 +3575,16 @@ msgstr "Tunel GRETAP přes IPv4" msgid "GRETAP tunnel over IPv6" msgstr "Tunel GRETAP přes IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Brána" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Porty brány" @@ -3158,23 +3594,23 @@ msgstr "Porty brány" msgid "Gateway address is invalid" msgstr "Adresa brány není platná" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Obecná nastavení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Obecné nastavení" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Obecné nastavení zařízení" @@ -3182,7 +3618,7 @@ msgstr "Obecné nastavení zařízení" msgid "Generate Config" msgstr "Vytvořit konfiguraci" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Generovat klíč PMK lokálně" @@ -3190,11 +3626,11 @@ msgstr "Generovat klíč PMK lokálně" msgid "Generate archive" msgstr "Vytvorǐt archív" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3202,15 +3638,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3222,39 +3658,40 @@ msgstr "Heslo nezměněno z důvodu nesouhlasu nového hesla a ověření hesla! msgid "Global Settings" msgstr "Obecná nastavení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Globální možnosti sítě" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Přejít na nastavení hesla..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Přejít na související konfigurační stránku" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "Poskytnout přístup k nastavení DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Poskytnout přístup k zobrazení stavu DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "Poskytnout přístup k zobrazení stavu DSL" @@ -3266,6 +3703,10 @@ msgstr "Poskytnout přístup k procedurám LuCI OpenConnect" msgid "Grant access to LuCI Wireguard procedures" msgstr "Poskytnout přístup k procedurám LuCI Wireguard" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "Udělit přístup ke konfiguraci SSH" @@ -3288,7 +3729,7 @@ msgstr "" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:3 msgid "Grant access to main status display" -msgstr "Udělit přístup k hlavnímu zobrazení stavu" +msgstr "Udělit přístup k zobrazení hlavního stavu" #: protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json:3 msgid "Grant access to mmcli" @@ -3302,7 +3743,7 @@ msgstr "Udělit přístup ke konfiguraci připojení úložišť" msgid "Grant access to network configuration" msgstr "Udělit přístup ke konfiguraci sítě" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Udělit přístup k síťovým diagnostickým nástrojům" @@ -3310,6 +3751,10 @@ msgstr "Udělit přístup k síťovým diagnostickým nástrojům" msgid "Grant access to network status information" msgstr "Udělit přístup k informacím o stavu sítě" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "Udělit přístup ke stavu procesů" @@ -3342,9 +3787,9 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" -msgstr "Udělit přístup k zobrazení stavu bezdrátového připojení" +msgstr "Poskytnout přístup k zobrazení stavu bezdrátové sítě" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66 msgid "Group Password" @@ -3371,15 +3816,11 @@ msgstr "" msgid "Hang Up" msgstr "Zavěsit" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Chyby kódu hlavičky (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3391,7 +3832,7 @@ msgstr "" "Nastavení základních vlastností zařízení jako je časová zóna nebo název " "zařízení." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Skrývat ESSID" @@ -3400,17 +3841,25 @@ msgstr "Skrývat ESSID" msgid "Hide empty chains" msgstr "Skrýt prázdné řetězy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3420,7 +3869,7 @@ msgstr "Hostitel" msgid "Host expiry timeout" msgstr "Vypršení časového limitu hostitele" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3428,10 +3877,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "Obsah značky Host-Uniq" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3441,11 +3896,11 @@ msgstr "Název počítače" msgid "Hostname to send when requesting DHCP" msgstr "Jméno hostitele odesílané při vyžádání DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Jména hostitelů" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3501,23 +3956,27 @@ msgstr "IEEE 802.3ad Dynamická agregace linek (802.3ad, 4)" msgid "IKE DH Group" msgstr "Skupina IKE DH" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IP adresy" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "Protokol IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "Typ IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3533,7 +3992,7 @@ msgstr "Neplatná IP adresa" msgid "IP address is missing" msgstr "Chybí IP adresa" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3545,20 +4004,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Přepíše falešnou hodnotu NX Domény" @@ -3566,14 +4025,15 @@ msgstr "Přepíše falešnou hodnotu NX Domény" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3589,7 +4049,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3599,7 +4059,7 @@ msgstr "IPv4 Upstream" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3626,7 +4086,7 @@ msgstr "IPv4 maska sítě" msgid "IPv4 network in address/netmask notation" msgstr "Síť IPv4 v notaci adresa/maska sítě" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Pouze IPv4" @@ -3639,11 +4099,11 @@ msgstr "IPv4 prefix" msgid "IPv4 prefix length" msgstr "Délka IPv4 prefixu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3652,16 +4112,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-in-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (obojí - výchozí IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3672,7 +4136,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3680,7 +4145,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6 firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 #, fuzzy msgid "IPv6 MTU" msgstr "IPv6 MTU" @@ -3689,7 +4154,11 @@ msgstr "IPv6 MTU" msgid "IPv6 Neighbours" msgstr "Sousedé IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3697,15 +4166,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "Nastavení IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6 ULA prefix" @@ -3719,12 +4188,12 @@ msgstr "IPv6 Upstream" msgid "IPv6 address" msgstr "IPv6 adresa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "Nápověda pro přiřazení IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "Velikost přídělu IPv6" @@ -3736,11 +4205,11 @@ msgstr "IPv6 brána" msgid "IPv6 network in address/netmask notation" msgstr "Síť IPv6 v notaci adresa/maska sítě" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Pouze IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3749,7 +4218,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "IPv6 prefix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "Filtr prefixů IPv6" @@ -3763,25 +4232,19 @@ msgstr "Délka IPv6 prefixu" msgid "IPv6 routed prefix" msgstr "IPv6 směrovaný prefix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "IPv6 suffix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"IPv6-Suffix " -"(šestnáctkový)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "Podpora IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3789,6 +4252,10 @@ msgstr "" msgid "IPv6-PD" msgstr "IPv6 delegace prefixu (PD)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3804,10 +4271,16 @@ msgstr "IPv6-over-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-over-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identita" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Je-li zapnuto, je povoleno 1DES" @@ -3820,13 +4293,13 @@ msgstr "Pokud je zaškrtnuto, přidá \"+ipv6\" do možností pppd" msgid "If checked, encryption is disabled" msgstr "Je-li zaškrtnuto, je šifrování zakázáno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3843,21 +4316,23 @@ msgid "" "device node" msgstr "Namísto pevného uzlu zařízení připojovat pomocí názvu oddílu" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Pokud není povoleno, není nastaven žádný výchozí směrovací záznam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "Pokud není povoleno, oznámené adresy DNS serverů budou ignorovány" @@ -3877,15 +4352,23 @@ msgstr "" "přístup na odkládací zařízení je řádově pomalejší, než přístup do paměti " "RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignorovat /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignorovat rozhraní" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignorovat resolv soubor" @@ -3897,25 +4380,25 @@ msgstr "Obraz" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3927,7 +4410,21 @@ msgstr "" msgid "In" msgstr "Dovnitř" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -3935,7 +4432,7 @@ msgstr "" "Aby se zabránilo neautorizovanému přístupu do systému, byl váš požadavek " "zablokován. Kliknutím na \"Pokračovat\" níže se vrátíte na předchozí stránku." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "V sekundách" @@ -3965,7 +4462,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Příchozí kontrolní součet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Příchozí rozhraní" @@ -3973,6 +4470,7 @@ msgstr "Příchozí rozhraní" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Příchozí klíč" @@ -3985,29 +4483,28 @@ msgstr "Příchozí serializace" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:187 msgid "Info" -msgstr "Informace" +msgstr "Info" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 msgid "Information" msgstr "Informace" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 #, fuzzy msgid "Ingress QoS mapping" msgstr "Mapování QoS na vstupu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Inicializace se nezdařila" @@ -4019,31 +4516,41 @@ msgstr "Initskript" msgid "Initscripts" msgstr "Initskripty" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Instalovat protokolové rozšíření…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4055,6 +4562,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Nedostatečná oprávnění ke čtení konfigurace UCI." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4062,7 +4573,7 @@ msgstr "Nedostatečná oprávnění ke čtení konfigurace UCI." msgid "Interface" msgstr "Rozhraní" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -4070,7 +4581,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "Rozhraní zařízení %q automaticky změněno z %q na %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Konfigurace rozhraní" @@ -4101,11 +4612,11 @@ msgstr "Rozhraní se znovu připojuje…" msgid "Interface is shutting down..." msgstr "Rozhraní se vypíná..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Rozhraní se spouští…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Rozhraní se zastavuje…" @@ -4114,12 +4625,12 @@ msgid "Interface name" msgstr "Název rozhraní" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Rozhraní není přítomné nebo je dosud nepřipojeno." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Síťová rozhraní" @@ -4128,23 +4639,26 @@ msgstr "Síťová rozhraní" msgid "Internal" msgstr "Interní" -# Není co dodat. -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Vnitřní chyba serveru" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4154,8 +4668,9 @@ msgid "Invalid" msgstr "Neplatná vstupní hodnota" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4165,6 +4680,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "Neplatný Base64 řetězec klíče" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4188,7 +4707,7 @@ msgstr "Uvedené VLAN ID je neplatné! Každé ID musí být jedinečné" msgid "Invalid argument" msgstr "Neplatný argument" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4202,15 +4721,36 @@ msgstr "Neplatný příkaz" msgid "Invalid hexadecimal value" msgstr "Neplatná šestnáctková hodnota" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Špatné uživatelské jméno a/nebo heslo! Prosím zkuste to znovu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Izolovat klienty" @@ -4223,50 +4763,54 @@ msgstr "" "Vypadadá to, že se pokoušíte zapsat obraz, který se nevejde do flash paměti. " "Prosím ověřte soubor s obrazem!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "Je vyžadován JavaScript!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Připojit k síti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Připojit k síti: Vyhledání bezdrátových sítí" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Připojování k síti: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Přeskočit na pravidlo" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:228 msgid "Keep settings and retain the current configuration" -msgstr "Zachovat nastavení a ponechat aktuální konfiguraci" +msgstr "Uchovat nastavení a současnou konfiguraci" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Záznam kernelu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Verze kernelu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Klíč" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Klíč #%d" @@ -4274,6 +4818,7 @@ msgstr "Klíč #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Klíč pro příchozí pakety (volitelné)." @@ -4281,14 +4826,19 @@ msgstr "Klíč pro příchozí pakety (volitelné)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Klíč pro odchozí pakety (volitelné)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4333,7 +4883,7 @@ msgstr "LCP interval upozornění" msgid "LED Configuration" msgstr "Konfigurace LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4350,32 +4900,39 @@ msgstr "Jazyk" msgid "Language and Style" msgstr "Jazyk a vzhled" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Odezva" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Poslední handshake" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Leaf" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Soubor zápůjček" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Doba zapůjčení" @@ -4399,7 +4956,7 @@ msgstr "Ponechte prázdné pro automatickou detekci" msgid "Leave empty to use the current WAN address" msgstr "Ponecháte-li prázdné, použije stávající WAN adresu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4410,33 +4967,29 @@ msgstr "" "efektivita. Doporučuje se, pokud možno, nepovolovat rychlosti přenosu " "802.11b." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Legenda:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Limit" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Útlum vedení (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" -msgstr "Režim linky" +msgstr "Mód linky" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "Stav linky" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" -msgstr "Line Uptime" +msgstr "Uptime linky" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:125 msgid "Link Aggregation (Channel Bonding)" @@ -4455,16 +5008,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Seznam IP adres, které se mají převádět na odpovědi NXDOMAIN." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 #, fuzzy msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" @@ -4480,7 +5035,7 @@ msgstr "" "během počátečního přidružení do mobility domény (Initial Mobility Domain " "Association)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 #, fuzzy msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " @@ -4500,25 +5055,22 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Seznam SSH klíčů pro autentizaci" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Seznam domén, pro které povolit odpovědi podle RFC1918." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" "Seznam nadřazených DNS serverů, na " "které přeposílat požadavky." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Port na kterém očekávat spojení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Naslouchající rozhraní" @@ -4527,7 +5079,7 @@ msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" "Poslouchat pouze na daném rozhraní, nebo pokud není specifikováno, na všech" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4537,7 +5089,7 @@ msgstr "Omezit naslouchání na tato rozhraní a zpětnou smyčku." msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Port pro příchozí dotazy DNS." @@ -4546,7 +5098,7 @@ msgstr "Port pro příchozí dotazy DNS." msgid "Load" msgstr "Zátěž" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Průměrná zátěž" @@ -4554,27 +5106,28 @@ msgstr "Průměrná zátěž" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Načítání obsahu adresáře…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Načítání zobrazení…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Místní" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Místní IP adresa" @@ -4594,11 +5147,12 @@ msgstr "Lokální IP adresa pro přiřazení" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Místní IPv4 adresa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4614,46 +5168,72 @@ msgstr "Místní IPv6 adresa" msgid "Local Startup" msgstr "Místní startup" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Místní čas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "Místní ULA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Místní doména" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "Přípona místní domény, připojená za názvy DHCP jmen a záznamů v souboru " "hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Místní server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Pouze lokální služba" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Lokalizační dotazy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Uzamčení na BSSID" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Přihlásit" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Přihlásit se…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Odhlásit" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Úroveň logování" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Dotazy pro logování" @@ -4679,38 +5259,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Přihlásit" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Odhlásit" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Ztráta signálních sekund (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Nejnižší zapůjčenou adresu použít jako offset síťové adresy." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 -#, fuzzy +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC adresa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Filtr MAC adres" @@ -4718,16 +5288,15 @@ msgstr "Filtr MAC adres" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4736,11 +5305,15 @@ msgstr "MAC VLAN" msgid "MAC address" msgstr "MAC adresa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Filtr MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Seznam Mac" @@ -4754,6 +5327,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "Pravidlo MAP je neplatné" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4775,15 +5352,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 #, fuzzy msgid "" @@ -4794,7 +5375,7 @@ msgstr "" "podobným níže:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4803,78 +5384,86 @@ msgstr "" msgid "Manual" msgstr "Manuálně" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Master" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Max. dosažitelná rychlost přenosu dat (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Nejvyšší počet DHCP zápůjček" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Největší povolená velikost EDNS0 paketů" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Nejvyšší počet souběžných dotazů" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Maximální povolený naslouchací interval" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Nejvyšší povolené množství aktivních DHCP zápůjček." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Nejvyšší povolené množství souběžných DNS dotazů." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "Nejvyšší povolená velikost EDNS0 UDP paketů." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Nejvyšší počet sekund čekání, než bude modem připraven" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Maximální počet zapůjčených adres." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Maximální vysílací výkon" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4887,7 +5476,7 @@ msgstr "Maximální vysílací výkon" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:330 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:331 msgid "Mbit/s" -msgstr "Mbit/s" +msgstr "Mbitů/s" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 msgid "Medium" @@ -4901,7 +5490,7 @@ msgstr "Paměť" msgid "Memory usage (%)" msgstr "Využití paměti (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -4909,10 +5498,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "Mesh ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Mesh Id" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Metoda nebyla nalezena" @@ -4925,7 +5522,7 @@ msgstr "Způsob monitorování spojení" msgid "Method to determine link status" msgstr "Způsob pro určení stavu spojení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4936,11 +5533,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4948,13 +5545,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4968,35 +5565,49 @@ msgstr "Monitorovací port zrcadla" msgid "Mirror source port" msgstr "Zdrojový port zrcadla" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Mobilní data" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Doména mobility" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Mód" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Model" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 #, fuzzy msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " @@ -5005,44 +5616,36 @@ msgstr "" "Probíhá připojení k modemu. Prosím, čekejte. Tento proces vyprší po 2 " "minutách." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Výchozí nastavení modemu" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Modemové zařízení" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Probíhá odpojování modemu. Počkejte prosím." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Dotaz na informace o modemu selhal" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Časový limit inicializace modemu" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -#, fuzzy -msgid "Modem is disabled." -msgstr "Modem je zakázán." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "ModemManager" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Sledování" @@ -5113,6 +5716,10 @@ msgstr "Přesunout dolů" msgid "Move up" msgstr "Přesunout nahoru" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5120,19 +5727,23 @@ msgstr "Přesunout nahoru" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5144,12 +5755,16 @@ msgstr "Režim NAT-T" msgid "NAT64 Prefix" msgstr "Prefix NAT64" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5162,18 +5777,23 @@ msgid "NTP server candidates" msgstr "Kandidáti NTP serveru" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" -msgstr "Název" +msgstr "Jméno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Název nové sítě" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigace" @@ -5182,13 +5802,17 @@ msgstr "Navigace" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5197,32 +5821,36 @@ msgstr "" msgid "Network" msgstr "Síť" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "SSID sítě" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Síťové nástroje" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Síťový bootovací obraz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Síťové zařízení" @@ -5235,7 +5863,7 @@ msgstr "Aktivita síťového zařízení (kernel: netdev)" msgid "Network device is not present" msgstr "Síťové zařízení není k dispozici" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5244,7 +5872,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5253,15 +5881,21 @@ msgstr "" msgid "Network interface" msgstr "Síťové rozhraní" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 +msgid "Never" +msgstr "Nikdy" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" msgid "Never" msgstr "Nikdy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5269,11 +5903,11 @@ msgstr "" "Nikdy nepřesměrovávat odpovídající domény a subdomény, převádět jen podle " "DHCP a souborů hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Nové rozhraní pro \"%s\" nelze vytvořit: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Nový název rozhraní…" @@ -5281,13 +5915,13 @@ msgstr "Nový název rozhraní…" msgid "Next »" msgstr "Další »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Ne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Pro toto rozhraní není nastaven žádný DHCP server" @@ -5295,7 +5929,7 @@ msgstr "Pro toto rozhraní není nastaven žádný DHCP server" msgid "No Data" msgstr "Žádná data" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Bez šifrování" @@ -5311,9 +5945,17 @@ msgstr "Žádné NAT-T" msgid "No RX signal" msgstr "Žádný signál RX" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5324,7 +5966,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5333,8 +5979,8 @@ msgstr "" msgid "No data received" msgstr "Nebyla přijata žádná data" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5347,15 +5993,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "V tomto adresáři nejsou žádné položky" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Nebyly nalezeny žádné soubory" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5369,7 +6011,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5390,30 +6032,40 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Žádná negativní mezipaměť" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Žádné heslo!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "Nepřipojeno" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Zatím nejsou k dispozici žádné veřejné klíče." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5427,7 +6079,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Žádná zóna nepřiřazena" @@ -5439,37 +6092,40 @@ msgstr "Žádná zóna nepřiřazena" msgid "Noise" msgstr "Šum" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Odstup signálu od šumu (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Šum:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Nepreemptivní CRC chyby (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Bez zástupných znaků" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Žádný" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normální" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Nenalezeno" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Neasociováno" @@ -5482,7 +6138,7 @@ msgstr "Nepřipojeno" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Není k dispozici" @@ -5494,7 +6150,7 @@ msgstr "Nespouštěno při startu" msgid "Not supported" msgstr "Není podporováno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 #, fuzzy msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " @@ -5503,6 +6159,12 @@ msgstr "" "Poznámka: Některé bezdrátové ovladače plně nepodporují standard 802.11w. " "Např. mwlwifi může mít problémy" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 #, fuzzy msgid "Notes" @@ -5510,9 +6172,9 @@ msgstr "Poznámky" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:188 msgid "Notice" -msgstr "Oznámení" +msgstr "Upozornění" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5520,7 +6182,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "Počet záznamů v mezipaměti DNS (max. 10 000, 0 bez mezipaměťi)." @@ -5538,7 +6200,7 @@ msgid "Obfuscated Password" msgstr "Obfuskované heslo" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5549,6 +6211,7 @@ msgid "Obtain IPv6 address" msgstr "Získat IPv6 adresu" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Vypnuto" @@ -5557,6 +6220,12 @@ msgstr "Vypnuto" msgid "Off-State Delay" msgstr "Vypnutí prodlevy" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Zapnuto" @@ -5565,15 +6234,15 @@ msgstr "Zapnuto" msgid "On-State Delay" msgstr "Zapnutí prodlevy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "Link-local trasa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Jedno jméno nebo mac adresa, musí být zadáno!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Jeden z následujících: %s" @@ -5591,7 +6260,11 @@ msgstr "Jedna nebo více neplatných/vyžadovaných hodnot na záložce" msgid "One or more required fields have no value!" msgstr "Jedno nebo více požadovaných polí neobsahuje hodnotu!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5600,49 +6273,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Otevřít seznam..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Provozní frekvence" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "Volba \"%s\" obsahuje neplatnou vstupní hodnotu." @@ -5650,22 +6334,31 @@ msgstr "Volba \"%s\" obsahuje neplatnou vstupní hodnotu." msgid "Option \"%s\" must not be empty." msgstr "Volba \"%s\" nesmí být prázdná." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Volba změněna" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Volba odstraněna" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Volitelné" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Volitelné, volně formulované poznámky k tomuto zařízení" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5674,7 +6367,7 @@ msgstr "" "Volitelné. 32bitová značka pro odchozí šifrované pakety. Zadejte " "šestnáctkovou hodnotu začínající 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5686,7 +6379,7 @@ msgstr "" "b:c:d::\"), použijte k vytvoření IPv6 adresy (\"a:b:c:d::1\") pro dané " "rozhraní suffix (např. '::1')." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5694,12 +6387,12 @@ msgstr "" "Volitelné. Předsdílený klíč v kódování Base64. Přidává další vrstvu " "symetrické kryptografie pro post-kvantovou odolnost." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 #, fuzzy msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Volitelné. Vytvořte trasy pro povolené IP adresy této protistrany." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Volitelné. Popis protistrany." @@ -5707,7 +6400,7 @@ msgstr "Volitelné. Popis protistrany." msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." @@ -5715,7 +6408,7 @@ msgstr "" "Volitelné. Hostitel protistrany. Názvy jsou překládány před spuštěním " "síťového rozhraní." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5730,11 +6423,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Volitelné. Maximální přenosová jednotka (MTU) tunelového rozhraní." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Volitelné. Port protistrany." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5742,7 +6435,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5759,7 +6452,7 @@ msgstr "Volitelné. Port UDP používaný pro odchozí a příchozí pakety." msgid "Options" msgstr "Možnosti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Cesta k certifikátu CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Cesta k certifikátu klienta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Cesta k privátnímu klíči" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Cesta k vnitřnímu certifikátu CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Cesta k vnitřnímu klientskému certifikátu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Cesta k vnitřnímu soukromému klíči" @@ -6131,11 +6870,19 @@ msgstr "" msgid "Peak:" msgstr "Špička:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Protistrana" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "IP Adresa protistrany pro přiřazení" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -6144,11 +6891,11 @@ msgstr "" msgid "Peer address is missing" msgstr "Adresa protistrany chybí" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6179,10 +6926,14 @@ msgstr "Provést reset" msgid "Permission denied" msgstr "Přístup zamítnut" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Trvalé udržování spojení (Keep Alive)" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6191,13 +6942,13 @@ msgstr "" msgid "Phy Rate:" msgstr "Fyzická rychlost:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Fyzické nastavení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6208,13 +6959,13 @@ msgstr "Ping" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:138 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:64 msgid "Pkts." -msgstr "paketů" +msgstr "Paketů" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Prosím vložte vaše uživatelské jméno a heslo." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Vyberte soubor, který chcete nahrát." @@ -6222,56 +6973,75 @@ msgstr "Vyberte soubor, který chcete nahrát." msgid "Policy" msgstr "Politika" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Stav portu:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Potenciální negace: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Režim řízení spotřeby" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Preemptivní chyby CRC (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Preferovat LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Preferovat UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Delegovaný prefix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Předsdílený klíč" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6296,15 +7066,16 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Zabraňuje komunikaci klient-klient" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "Primární VLAN ID" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6315,29 +7086,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Priorita" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Soukromý klíč" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6355,8 +7128,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6368,13 +7141,13 @@ msgstr "Protokol" msgid "Provide NTP server" msgstr "Poskytování NTP serveru" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Poskytování nové sítě" @@ -6384,25 +7157,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Veřejný klíč" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6431,61 +7215,85 @@ msgstr "Mobilní QMI" msgid "Quality" msgstr "Kvalita" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" "Dotazovat se všech dostupných nadřazených DNS serverů." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Interval dotazů" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Interval odpovědí na dotazy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "Životnost klíče R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "Držitel klíče R1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Port pro Radius-Accounting" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Tajný klíč pro Radius-Accounting" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Server Radius-Accounting" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Výběr ověřování portů" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Tajný klíč pro Radius-Authentication" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Server Radius-Authentication" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "Režim RFC3947 NAT-T" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "Prahová hodnota RSSI pro připojení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Práh RTS/CTS" @@ -6498,10 +7306,16 @@ msgstr "RX" msgid "RX Rate" msgstr "RX Rate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "Rychlost přijímání / vysílání" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6513,13 +7327,11 @@ msgstr "" "Nezpracované šestnáctkové bajty. Ponechte prázdné, pokud to poskytovatel " "internetu nevyžaduje" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." -msgstr "" -"Přečtěte si /etc/ethers ke konfiguraci DHCP serveru." +msgstr "Načíst soubor /etc/ethers pro konfiguraci DHCP serveru." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Opravdu prohodit protokol?" @@ -6527,11 +7339,11 @@ msgstr "Opravdu prohodit protokol?" msgid "Realtime Graphs" msgstr "Grafy v reálném čase" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Termín reasociace" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Opětovné nastavení ochrany" @@ -6545,7 +7357,7 @@ msgstr "Restartovat" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:46 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:51 msgid "Rebooting…" -msgstr "Probíhá restartování…" +msgstr "Probíhá restart…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:21 msgid "Reboots the operating system of your device" @@ -6555,11 +7367,40 @@ msgstr "Restartuje operační systém vašeho zařízení" msgid "Receive" msgstr "Přijmout" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Přijmout" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Doporučeno. IP adresy rozhraní WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Přepojit toto rozhraní" @@ -6567,12 +7408,12 @@ msgstr "Přepojit toto rozhraní" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6581,37 +7422,47 @@ msgstr "" msgid "References" msgstr "Reference" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Přenos" @@ -6621,6 +7472,10 @@ msgstr "Přenos" msgid "Relay Bridge" msgstr "Relay Bridge" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Přenášet mezi sítěmi" @@ -6630,6 +7485,14 @@ msgstr "Přenášet mezi sítěmi" msgid "Relay bridge" msgstr "Relay bridge" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6639,6 +7502,7 @@ msgstr "Vzdálená IPv4 adresa" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Vzdálená IPv4 adresa nebo FQDN" @@ -6651,15 +7515,23 @@ msgstr "Vzdálená IPv6 adresa" msgid "Remote IPv6 address or FQDN" msgstr "Vzdálená IPv6 adresa nebo FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Odstranit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Nahradit bezdrátovou konfiguraci" @@ -6689,7 +7561,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Vyžadováno" @@ -6706,7 +7579,7 @@ msgstr "Povinné. Soukromý klíč tohoto rozhraní v kódování Base64." msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6718,67 +7591,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Vyžaduje hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Vyžaduje hostapd s podporou EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Vyžaduje hostapd s podporou OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Vyžaduje hostapd s podporou SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Vyžaduje wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Vyžaduje wpa-supplicant s podporou EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Vyžaduje wpa-supplicant s podporou OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Vyžaduje wpa-supplicant s podporou SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6787,7 +7666,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6802,20 +7681,24 @@ msgstr "Resetovat čítače" msgid "Reset to defaults" msgstr "Obnovit na výchozí" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Soubory Resolv a Hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Soubor resolve" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Zdroj nebyl nalezen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Restart" @@ -6824,7 +7707,7 @@ msgstr "Restart" msgid "Restart Firewall" msgstr "Restartovat firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Restartovat rádiové rozhraní" @@ -6836,7 +7719,7 @@ msgstr "Obnovit" msgid "Restore backup" msgstr "Obnovit ze zálohy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -6844,80 +7727,91 @@ msgstr "" "Lokalizovat jméno v závislosti na dotazující se podsíti, pokud bylo nalezeno " "více IP adres." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Odhalit/skrýt heslo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Vrátit zpět" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Vrátit změny" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "Požadavek na vrácení se nezdařil se stavem %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Vracení konfigurace…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Robustnost" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6932,19 +7826,19 @@ msgstr "Příprava kořenového adresáře" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Politika Round-Robin (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Směrovat povolené IP adresy" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Typ trasy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6962,6 +7856,10 @@ msgstr "Heslo routeru" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6975,24 +7873,24 @@ msgstr "" msgid "Rule" msgstr "Pravidlo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -7012,11 +7910,24 @@ msgstr "Běhová chyba" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "Odstup signálu od šumu" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7034,15 +7945,15 @@ msgstr "Port SSH serveru" msgid "SSH username" msgstr "SSH uživatelské jméno" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH klíče" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7059,7 +7970,7 @@ msgstr "Server SSTP" msgid "SWAP" msgstr "Odkládací soubor/oddíl" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7070,7 +7981,7 @@ msgid "Save" msgstr "Uložit" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Uložit & použít" @@ -7087,7 +7998,7 @@ msgstr "Uložit mtdblock" msgid "Save mtdblock contents" msgstr "Uložit obsah mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Skenovat" @@ -7096,11 +8007,16 @@ msgstr "Skenovat" msgid "Scheduled Tasks" msgstr "Naplánované úlohy" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Přidána sekce" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Sekce odebrána" @@ -7118,9 +8034,9 @@ msgstr "" "kontrola formátu firmware. Použijte, pouze pokud jste si jisti, že firmware " "je správný a určený pro vaše zařízení!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Vybrat soubor…" @@ -7128,13 +8044,13 @@ msgstr "Vybrat soubor…" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -7155,11 +8071,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Server" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7184,16 +8104,20 @@ msgstr "Sezení vypršelo" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7205,14 +8129,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7226,11 +8150,15 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Nastavit DHCP server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7238,33 +8166,37 @@ msgid "Setting PLMN failed" msgstr "Nastavení PLMN selhalo" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "Nastavení provozního režimu selhalo" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Nastavení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "Silně chybné sekundy (SES)" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "Krátký ochranný interval (GI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Krátká preambule" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Ukázat aktuální seznam záložních souborů" @@ -7277,16 +8209,16 @@ msgstr "Zobrazit prázdné řetězy" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Shodit toho rozhraní" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7294,15 +8226,15 @@ msgstr "Shodit toho rozhraní" msgid "Signal" msgstr "Signál" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Signál / šum" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Útlum signálu (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7310,12 +8242,12 @@ msgstr "" msgid "Signal:" msgstr "Signál:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Velikost" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Velikost mezipaměti DNS dotazů" @@ -7332,12 +8264,12 @@ msgstr "Přeskočit" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Skočit na obsah" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Skočit na navigaci" @@ -7349,20 +8281,16 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:3002 #: modules/luci-compat/luasrc/model/network.lua:1428 msgid "Software VLAN" -msgstr "Software VLAN" +msgstr "Softwarová VLAN" #: modules/luci-compat/luasrc/view/cbi/header.htm:5 msgid "Some fields are invalid, cannot save values!" msgstr "Některá pole obsahují neplatné hodnoty, nelze uložit!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Omlouváme se, ale požadovaný objekt nebyl nalezen." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Omlouváme se, na serveru došlo k neočekávané vyjímce." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7373,8 +8301,8 @@ msgstr "" "systému. Nový obraz firmwaru musí být zapsán ručně. Prosím, obraťte se na " "wiki pro zařízení specifické instalační instrukce." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7401,26 +8329,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7445,7 +8373,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7453,7 +8381,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7461,20 +8389,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "Určuje adresář, ke kterému je zařízení připojeno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7504,7 +8432,7 @@ msgid "" "dead" msgstr "Určuje počet sekund, po kterém je hostitel považovám za mrtvého" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7524,7 +8452,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7555,15 +8483,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7585,19 +8513,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7617,7 +8545,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7716,15 +8644,23 @@ msgstr "" "Zadejte hodnotu MTU (maximální přenosová jednotka) jinou než výchozí (1280 " "bajtů)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Zde nastavte soukromý šifrovací klíč." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Start" @@ -7737,16 +8673,16 @@ msgstr "" msgid "Start priority" msgstr "Priorita spouštění" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Provádění konfiguračních změn…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Zahájeno bezdrátové skenování..." @@ -7755,6 +8691,10 @@ msgstr "Zahájeno bezdrátové skenování..." msgid "Startup" msgstr "Po spuštění" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Stav" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Statické IPv4 trasy" @@ -7768,7 +8708,7 @@ msgstr "Statické IPv6 trasy" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Statické zápůjčky" @@ -7778,7 +8718,7 @@ msgstr "Statické zápůjčky" msgid "Static address" msgstr "Statická adresa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7788,18 +8728,18 @@ msgstr "" "jmen DHCP klientům. Jsou také vyžadovány pro nedynamické konfigurace " "rozhraní, kde jsou povoleni pouze hosté s odpovídajícím nastavením." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Limit nečinnosti stanice" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Stav" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Zastavit" @@ -7808,8 +8748,8 @@ msgstr "Zastavit" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7817,11 +8757,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Striktní výběr" @@ -7830,15 +8770,15 @@ msgid "Strong" msgstr "Silné" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Odeslat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Potlačit logování" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "Potlačit protokolování rutinního provozu protokolu DHCP." @@ -7870,7 +8810,7 @@ msgstr "Switch VLAN" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Směrovací protokol" @@ -7880,7 +8820,7 @@ msgstr "Směrovací protokol" msgid "Switch to CIDR list notation" msgstr "Přepnout na notaci seznamu CIDR" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Symbolický odkaz" @@ -7892,8 +8832,16 @@ msgstr "Synchronizovat s NTP serverem" msgid "Sync with browser" msgstr "Synchronizovat s prohlížečem" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7917,9 +8865,9 @@ msgstr "Vlastnosti systému" msgid "System log buffer size" msgstr "Velikost bufferu systémového logu" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7948,7 +8896,7 @@ msgstr "" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Kořenový adresář TFTP serveru" @@ -7961,26 +8909,37 @@ msgstr "TX" msgid "TX Rate" msgstr "Rychlost TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "Délka fronty TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tabulka" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Cíl" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7996,26 +8955,26 @@ msgstr "" msgid "Terminate" msgstr "Ukončit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8031,7 +8990,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8045,18 +9008,24 @@ msgstr "" "Postup aktualizace pro koncový bod HE.net se změnil. Místo číselného ID " "uživatele musí být nyní zadáno normální uživatelské jméno!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -8064,6 +9033,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "Adresa IPv4 nebo úplný název domény vzdáleného konce tunelu." @@ -8078,6 +9048,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8088,7 +9064,7 @@ msgstr "IPv6 prefix přidělený poskytovatelem většinou končí ::A-Z, a-z, 0-9 and _" @@ -8131,13 +9111,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "Konfigurační soubor nelze načíst z důvodu následující chyby:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8163,18 +9143,18 @@ msgstr "" "Soubor zařízení paměti nebo oddílu (např. " "/dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8196,7 +9176,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Následující pravidla jsou nyní na tomto systému aktivní." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -8204,17 +9184,17 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "Adresa brány nesmí být lokální IP adresa" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "Zadaný veřejný SSH klíč byl již přídán." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8222,15 +9202,31 @@ msgstr "" "Zadaný veřejný SSH klíč je neplatný. Použijte řádné veřejné RSA nebo ECDSA " "klíče." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Název rozhraní je již používán" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Název rozhraní je příliš dlouhý" @@ -8253,6 +9249,7 @@ msgstr "Místní IPv4 adresa" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "Lokální IPv4 adresa, přes kterou je tunel vytvořen (volitelné)." @@ -8267,7 +9264,7 @@ msgstr "Síťová maska místní IPv4 adresy" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8276,7 +9273,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8284,19 +9281,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Název sítě je již používán" @@ -8316,14 +9313,14 @@ msgstr "" "jeden port pro připojení k vyšší síti (Uplink) jako třeba internet a " "zbývající porty pro místní síť." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8336,31 +9333,31 @@ msgstr "Příkaz k restartu selhal s kódem %d" msgid "The restore command failed with code %d" msgstr "Příkaz pro obnovení selhal s kódem %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "Vybraný režim %s není kompatibilní s šifrováním %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "Odeslaný bezpečnostní token je neplatný nebo již vypršel!" @@ -8401,6 +9398,14 @@ msgstr "Systémové heslo bylo úspěšně změněno." msgid "The sysupgrade command failed with code %d" msgstr "Příkaz sysupgrade selhal s kódem %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8427,30 +9432,37 @@ msgstr "" "Nahraný soubor s firmware neobsahuje podporovaný formát. Ujistěte se, že " "jste vybrali správný formát pro svou platformu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Žádné aktivní zápůjčky" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Žádné změny k provedení" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8463,16 +9475,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "Toto je IPv4 adresa relé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Tento typ autentizace nelze použít s vybranou EAP metodou." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Toto nevypadá jako platný PEM soubor" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 #, fuzzy msgid "" "This is a list of shell glob patterns for matching files and directories to " @@ -8491,6 +9503,17 @@ msgstr "" "Jedná se buď o \"Aktualizační klíč\" konfigurovaný pro tunelové propojení, " "nebo heslo účtu, pokud nebyl nastaven žádný klíč" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8507,7 +9530,7 @@ msgstr "" "Toto je adresa lokálního koncového bodu přiřazená zprostředkovatelem " "tunelového propojení, obvykle končí na ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "Toto je jediný DHCPconfiguration import
    instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Přihlásit se…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8614,7 +9641,7 @@ msgstr "" "konfigurační soubory. Pro obnovení továrního nastavení stiskněte \"Obnovit " "výchozí\" (možné pouze s obrazy squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Tón" @@ -8622,12 +9649,16 @@ msgstr "Tón" msgid "Total Available" msgstr "Dostupná celkem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8639,11 +9670,11 @@ msgstr "Provoz" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8660,6 +9691,27 @@ msgstr "Přenos" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Anténa vysílače" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8698,7 +9750,7 @@ msgstr "Rozhraní tunelu" msgid "Tunnel Link" msgstr "Tunelové spojení" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8707,13 +9759,13 @@ msgid "Tx-Power" msgstr "Tx-Power" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Typ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Typ služby" @@ -8762,7 +9814,7 @@ msgstr "Nelze určit externí IP adresu" msgid "Unable to determine upstream interface" msgstr "Nelze určit odchozí WAN rozhraní" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Nelze odeslat" @@ -8813,19 +9865,31 @@ msgstr "Nelze restartovat bránu firewall: %s" msgid "Unable to save contents: %s" msgstr "Nelze uložit obsah: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Počet nedostupných sekund (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Neočekávaný formát dat odpovědi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8839,7 +9903,7 @@ msgstr "" msgid "Unknown" msgstr "Neznámé" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8863,11 +9927,11 @@ msgstr "Nespravovaný" msgid "Unmount" msgstr "Odpojit" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Nepojmenovaný klíč" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Neuložené změny" @@ -8881,15 +9945,25 @@ msgid "Unsupported MAP type" msgstr "Nepodporovaný typ MAP" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Nepodporovaný modem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Nepodporovaný typ protokolu." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8901,9 +9975,9 @@ msgstr "Nahoru" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" -msgstr "Nahrát" +msgstr "Nahráno" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:441 msgid "" @@ -8918,25 +9992,29 @@ msgstr "" msgid "Upload archive..." msgstr "Nahrát archiv..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Nahrát soubor" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Nahrát soubor…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Požadavek na nahrání selhal: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Nahrávání souboru…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -8946,33 +10024,37 @@ msgstr "" "přiřazeny názvy ve tvaru wifinet# a síť bude restartována kvůli " "provedení daných změn." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "DNS servery budou dotazovány podle " "pořadí v souboru resolv.conf." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Doba běhu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Použít /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Používat servery inzerované z DHCP" @@ -8981,13 +10063,18 @@ msgstr "Používat servery inzerované z DHCP" msgid "Use DHCP gateway" msgstr "Použít DHCP bránu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Používat DNS servery inzerované protistranou" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Pomocí ISO/IEC 3166 alpha2 kódů zemí." @@ -9033,22 +10120,25 @@ msgstr "Použít jako kořenový souborový systém (/)" msgid "Use broadcast flag" msgstr "Použít příznak broadcastu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Použít vestavěnou správu IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Použít vlastní DNS servery" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Použít výchozí bránu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Použít metriku brány" @@ -9072,15 +10162,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9109,11 +10199,11 @@ msgstr "" msgid "Used" msgstr "Použit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Použitý slot klíče" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9121,59 +10211,61 @@ msgstr "" "Používano pro dva různé účely: RADIUS NAS ID a 802.11r R0KH-ID. Není třeba v " "případě WPA(2)-PSK." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Uživatelský certifikát (PEM formát)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Uživatelský klíč (PEM formát)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Uživatelské jméno" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "VLAN ID" @@ -9193,24 +10285,27 @@ msgstr "Lokální VPN adresa" msgid "VPN Local port" msgstr "Lokální VPN port" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPN server" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Serverový VPN port" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "SHA1 hash serverového certifikátu VPN" @@ -9219,6 +10314,10 @@ msgstr "SHA1 hash serverového certifikátu VPN" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (a další) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -9232,7 +10331,7 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9240,8 +10339,8 @@ msgstr "" "Vyžaduje podporu DNSSEC nadřazeným DNS; ověřuje, zda nepodepsané doménové " "odpovědi skutečně pocházejí z nepodepsaných domén." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9269,7 +10368,7 @@ msgstr "Výrobce" msgid "Vendor Class to send when requesting DHCP" msgstr "Třída výrobce (Vendor Class) odesílaná při vyžádání DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9277,12 +10376,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Ověřuji nahraný soubor s obrazem." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Virtuální Ethernet" @@ -9290,34 +10389,46 @@ msgstr "Virtuální Ethernet" msgid "Virtual dynamic interface" msgstr "Virtuální dynamické rozhraní" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "WEP Open System" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Sdílený klíč WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "WEP heslo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Režim WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "WPA heslo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9346,19 +10457,61 @@ msgstr "Varování: Existují neuložené změny, které se po restartu ztratí! msgid "Weak" msgstr "Slabé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9368,7 +10521,7 @@ msgstr "" "nebudou použity níže uvedené možnosti klíčů R0 a R1. Zakažte tuto funkci, " "pokud chcete použít možnosti klíčů R0 a R1." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9376,7 +10529,7 @@ msgstr "" "Pokud je režim Wi-Fi Multimedia (WMM) QoS zakázán, mohou být klienti omezeni " "na rychlosti 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 #, fuzzy msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " @@ -9386,16 +10539,26 @@ msgstr "" "snížení efektivity." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Šířka" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +#, fuzzy +msgid "WireGuard" +msgstr "WireGuard VPN" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Stav WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9411,21 +10574,21 @@ msgid "Wireless Adapter" msgstr "Bezdrátový adaptér" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Bezdrátová síť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Přehled bezdrátových sití" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Zabezpečení bezdrátové sítě" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Migrace bezdrátové konfigurace" @@ -9441,15 +10604,15 @@ msgstr "Bezdrátová síť vypnuta" msgid "Wireless is not associated" msgstr "Bezdrátová síť nespojena" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Bezdrátová síť je zakázána" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Bezdrátová síť je povolena" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Zapisovat přijaté požadavky DNS do systemového logu." @@ -9461,7 +10624,7 @@ msgstr "Zapisovat systémový protokol do souboru" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9489,8 +10652,20 @@ msgstr "" "zařízení.
    Varování: Pokud zakážete základní init skripty jako " "\"network\", vaše zařízení se může stát nepřístupným!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9523,34 +10698,54 @@ msgstr "Nastavení ZRam" msgid "ZRam Size" msgstr "Velikost ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "libovolný" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automaticky" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "přemostěný" @@ -9607,25 +10802,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "zakázat" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "zakázáno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "výchozí nastavení ovladače" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "např.: --proxy 10.10.10.10" @@ -9634,14 +10834,23 @@ msgstr "např.: --proxy 10.10.10.10" msgid "e.g: dump" msgstr "např.: dump" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "expirovaná" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9651,22 +10860,22 @@ msgstr "" msgid "forward" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "plný-duplex" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "poloviční-duplex" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "hexadecimální hodnota" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "skrytý" @@ -9675,9 +10884,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "hybridní režim" @@ -9685,6 +10894,10 @@ msgstr "hybridní režim" msgid "ignore" msgstr "ignorovat" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9699,11 +10912,19 @@ msgstr "délka klíče v rozmezí 8 až 63 znaků" msgid "key with either 5 or 13 characters" msgstr "délka klíče 8, nebo 13 znaků" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "střední zabezpečení" @@ -9712,11 +10933,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minuty/minut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9728,18 +10949,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "ne" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "žádné spojení" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "neprázdná hodnota" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "žádný" @@ -9750,20 +10979,20 @@ msgid "not present" msgstr "není k dispozici" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" -msgstr "vypnuto" +msgstr "off" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "otevřená síť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9772,6 +11001,10 @@ msgstr "" msgid "output" msgstr "výstup" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "před více než dnem" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9789,23 +11022,32 @@ msgstr "kladná celočíselná hodnota" msgid "random" msgstr "náhodný" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "reléový režim" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "směrované" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "sekund" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "serverový řežim" @@ -9813,7 +11055,7 @@ msgstr "serverový řežim" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "silné zabezpečení" @@ -9821,7 +11063,7 @@ msgstr "silné zabezpečení" msgid "tagged" msgstr "označený" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "časové jednotky (ČJ / 1024 ms) [1000–65535]" @@ -9832,25 +11074,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "jedinečná hodnota" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "neznámý" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "neomezený" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9872,8 +11116,8 @@ msgid "untagged" msgstr "neoznačený" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "platná IP adresa" @@ -9886,7 +11130,7 @@ msgid "valid IPv4 CIDR" msgstr "platný IPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "platná IPv4 adresa" @@ -9915,7 +11159,7 @@ msgid "valid IPv6 CIDR" msgstr "platný IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "platná IPv6 adresa" @@ -9952,8 +11196,8 @@ msgstr "platný identifikátor UCI, název hostitele nebo IP adresa" msgid "valid address:port" msgstr "platná adresa:port" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "platné datum (RRRR-MM-DD)" @@ -9993,11 +11237,21 @@ msgstr "platná celočíselná hodnota" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "platná síť v notaci adresa/maska sítě" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "platná telefonní číslice (0-9, \"*\", \"#\", \"!\" or \".\")" @@ -10007,43 +11261,43 @@ msgid "valid port or port range (port1-port2)" msgstr "platný port nebo rozsah portů (port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "platná hodnota portu" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "platný čas (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "hodnota mezi %d a %d znaky" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "hodnota mezi %f a %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "hodnota větší nebo rovna %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "hodnota menší nebo rovna %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "hodnota s %d znaky" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "hodnota s alespoň %d znaky" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "hodnota s nejvýše %d znaky" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "slabé zabezpečení" diff --git a/package/luci/modules/luci-base/po/da/base.po b/package/luci/modules/luci-base/po/da/base.po index a2212c88eb..2c07045945 100644 --- a/package/luci/modules/luci-base/po/da/base.po +++ b/package/luci/modules/luci-base/po/da/base.po @@ -1,32 +1,48 @@ msgid "" msgstr "" -"PO-Revision-Date: 2022-11-25 14:34+0000\n" +"PO-Revision-Date: 2023-10-27 08:55+0000\n" "Last-Translator: drax red \n" -"Language-Team: Danish \n" "Language: da\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.2-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "ukendt (ikke kendt)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" tabel \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d ugyldigt(e) felt(er)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%dh siden" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%dm siden" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%ds siden" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s er umærket i flere VLANs!" @@ -51,10 +67,11 @@ msgstr "(tom)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(ingen interfaces tilknyttet)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d mere" @@ -64,19 +81,19 @@ msgid "-- Additional Field --" msgstr "-- Yderligere felt --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Vælg venligst --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- brugerdefineret --" @@ -102,7 +119,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = bruger ikke RSSI-tærskel, 1 = ændrer ikke driverens standardindstilling" @@ -116,13 +133,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "1 minuts belastning:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "1 flag" msgstr[1] "%d flag" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12t (12 timer - standard)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "15 minutters belastning:" @@ -137,12 +159,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3t (3 timer)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4 tegn hexadecimalt ID" @@ -155,44 +182,105 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "5 minutters belastning:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5m (5 minutter)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "6-oktet-identifikator som en hex-streng - ingen kolon" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7d (7 dage)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: Aktiver beacon-rapport via radiomålinger." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Aktiver naborapport via radiomålinger." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r hurtig overgang" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: BSS Max inaktiv. Enheder: sekunder." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: Basic Service Set (BSS) overgangsstyring." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Annoncering af lokal tidszone i management frames." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Proxy ARP gør det muligt for ikke-AP STA at forblive i " +"strømsparetilstand i længere tid." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Tidsannoncering i management frames." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Wireless Network Management (WNM) Dvaletilstand (udvidet " +"dvaletilstand for stationer)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Wireless Network Management (WNM) Dvaletilstand rettelser: " +"Forhindrer geninstallationsangreb." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w Association SA Query maksimal timeout" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" "802.11w Association SA-forespørgsel efter timeout for fornyet forespørgsel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w Management Frame Beskyttelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w maksimal timeout" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w genforsøg timeout" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-Netmaske" @@ -204,30 +292,46 @@ msgstr "LED Konfiguration" msgid "LED Name" msgstr "LED Navn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-Proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA Flag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA Hopgrænse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA Levetid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-tjeneste" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ matcher ethvert domæne. /example.com/ " +"returnerer NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# returnerer NULL-adresser (0.0.0.0 " +"og ::) for example.com og dets underdomæner." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -273,11 +377,23 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s ikke i sæt %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"En batman-adv node kan enten køre i servertilstand (deler sin " +"internetforbindelse med mesh) eller i klienttilstand (søger efter den bedst " +"egnede internetforbindelse i mesh) eller have gateway-understøttelsen slået " +"helt fra (som er standardindstillingen )." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Der findes allerede en konfiguration for enheden \"%s\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Der findes allerede en mappe med samme navn." @@ -285,25 +401,90 @@ msgstr "Der findes allerede en mappe med samme navn." msgid "A new login is required since the authentication session expired." msgstr "Der er behov for et nyt login, da godkendelsessessionen er udløbet." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Bilag A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Bilag B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (alle varianter) Bilag A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (alle varianter) Bilag A/L/M + VDSL2 Bilag A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (alle varianter) Bilag B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (alle varianter) Bilag B + VDSL2 Bilag A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (alle varianter) Bilag B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (alle varianter) Bilag B/J + VDSL2 Bilag A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (alle varianter) Bilag M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Bilag A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Bilag B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Bilag L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Bilag M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Bilag A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Bilag B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Bilag M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -336,29 +517,40 @@ msgstr "ARP-overvågning er ikke understøttet for den valgte politik!" msgid "ARP retry threshold" msgstr "ARP-tærskel for genforsøg" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "ARP trafik tabel \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"ARP, IPv4 og IPv6 (selv 802.1Q) med multicast-destinations-MAC-adresser " +"unicastes til STA MAC-adressen. Bemærk: Dette er ikke Directed Multicast " +"Service (DMS) i 802.11v. Bemærk: kan bryde modtagerens STA multicast-" +"forventninger." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (asynkron overførselstilstand)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM-broer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM Virtual Channel Identifier (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM Virtual Path Identifier (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -368,28 +560,24 @@ msgstr "" "Linux-netværks interfaces , der kan bruges sammen med DHCP eller PPP til at " "ringe ind på udbyderens netværk." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM-enhedsnummer" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C-systemleverandør-id" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Fraværende Interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Accepter kun DNS-forespørgsler fra værter, hvis adresse er i et lokalt " "subnet." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Accepter lokalt" @@ -398,7 +586,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Accepter pakke" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Accepter pakker med lokale kildeadresser" @@ -406,16 +594,25 @@ msgstr "Accepter pakker med lokale kildeadresser" msgid "Access Concentrator" msgstr "Adgangskoncentrator" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Access Point" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Adgangspunktsisolering" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Adgangsteknologier" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Handlinger" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Aktiv" @@ -453,8 +650,8 @@ msgstr "Aktive IPv6-regler" msgid "Active-Backup policy (active-backup, 1)" msgstr "Politik for aktiv sikkerhedskopiering (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-hoc" @@ -471,18 +668,18 @@ msgstr "Adaptiv load balancing af transmission (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Tilføj" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Tilføj ATM-bro" @@ -502,11 +699,11 @@ msgstr "Tilføj LED-handling" msgid "Add VLAN" msgstr "Tilføj VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Tilføj enhedskonfiguration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Tilføj enhedskonfiguration…" @@ -514,18 +711,18 @@ msgstr "Tilføj enhedskonfiguration…" msgid "Add instance" msgstr "Tilføj Instans" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Tilføj nøgle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "Tilføj lokalt domæne-suffiks til navne, der serveres fra hosts-filer." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Tilføj nyt interface..." @@ -533,6 +730,10 @@ msgstr "Tilføj nyt interface..." msgid "Add peer" msgstr "Tilføj peer" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "Tilføj statisk fremad og omvendt DNS-poster til denne vært." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Tilføj til sortliste" @@ -541,11 +742,11 @@ msgstr "Tilføj til sortliste" msgid "Add to Whitelist" msgstr "Tilføj til hvidliste" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Yderligere værtsfiler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Yderligere servere fil" @@ -562,7 +763,11 @@ msgstr "Yderligere servere fil" msgid "Address" msgstr "Adresse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "Adressefamilier af \"Relay from\" og \"Relay to adresse\" skal matche." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Adresse familie" @@ -575,7 +780,7 @@ msgstr "Adresseindstillingen er ugyldig" msgid "Address to access local relay bridge" msgstr "Adresse for at få adgang til lokal relæbro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Adresser" @@ -584,29 +789,29 @@ msgstr "Adresser" msgid "Administration" msgstr "Administration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Avancerede indstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Avancerede enhedsindstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Aldringstid" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "ACTATP (Aggregate Transmit Power)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Aggregerede meddelelser fra afsender" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -643,11 +848,11 @@ msgstr "Alias Interface" msgid "Alias of \"%s\"" msgstr "Alias for \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Alle servere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." @@ -655,7 +860,7 @@ msgstr "" "Tildel IP-adresser sekventielt, startende fra den lavest tilgængelige " "adresse." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Tildel IP'er sekventielt" @@ -663,11 +868,11 @@ msgstr "Tildel IP'er sekventielt" msgid "Allow SSH password authentication" msgstr "Tillad SSH adgangskodegodkendelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "Tillad AP-tilstand til at afbryde STA'er baseret på lav ACK-tilstand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Tillad alle undtagen angivet" @@ -675,15 +880,15 @@ msgstr "Tillad alle undtagen angivet" msgid "Allow full UCI access for legacy applications" msgstr "Tillad fuld UCI-adgang for ældre applikationer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Tillader gamle 802.11b-hastigheder" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Tillad kun anførte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Tillad localhost" @@ -706,19 +911,24 @@ msgid "Allow system feature probing" msgstr "Tillad undersøgelse af systemfunktioner" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Tillad brugeren root at logge ind med adgangskode" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Tilladte IP'er" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "Tilladt netværksteknologi" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "Tilladte IP-indstillinger er ugyldige" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Altid" @@ -730,13 +940,13 @@ msgstr "Altid slukket (kerne: ingen)" msgid "Always on (kernel: default-on)" msgstr "Altid tændt (kerne: standard tændt)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "Altid sende DHCP-indstillinger. Nogle gange er det nødvendigt, f.eks. med " "PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -744,10 +954,14 @@ msgstr "" "Brug altid 40 MHz-kanaler, selv om den sekundære kanal overlapper hinanden. " "Brug af denne indstilling er ikke i overensstemmelse med IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "Antallet af prober til detektion af dobbeltadresse, der skal sendes" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Antal sekunder at vente på, at modemmet bliver klar" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Der opstod en fejl under lagring af formularen:" @@ -756,72 +970,23 @@ msgstr "Der opstod en fejl under lagring af formularen:" msgid "An optional, short description for this device" msgstr "En valgfri, kort beskrivelse af denne enhed" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Bilag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Bilag A + L + M (alle)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Bilag A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Bilag A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Bilag A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Bilag A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Bilag B (alle)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Bilag B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Bilag B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Bilag B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Bilag J (alle)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Bilag L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Bilag M (alle)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Bilag M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Bilag M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"Annoncer NAT64-præfiks i RA-" +"meddelelser." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Annoncer denne enhed som IPv6 DNS-server." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -829,7 +994,7 @@ msgstr "" "Annoncer denne enhed som standardrouter, hvis der findes en lokal IPv6-" "standardrute." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -837,7 +1002,7 @@ msgstr "" "Annoncer denne enhed som standardrouter, hvis der er et offentligt IPv6-" "præfiks tilgængeligt, uanset om der findes en lokal standardrute." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -845,15 +1010,15 @@ msgstr "" "Annoncer denne enhed som standardrouter, uanset om der er et præfiks eller " "en standardrute." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Annoncerede DNS-domæner" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Annoncerede IPv6 DNS-servere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Anonym identitet" @@ -865,7 +1030,7 @@ msgstr "Anonymt Mount" msgid "Anonymous Swap" msgstr "Anonym Swap" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Enhver pakke" @@ -877,11 +1042,11 @@ msgstr "Enhver pakke" msgid "Any zone" msgstr "Enhver zone" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "Anvend DHCP-indstillinger på dette net. (Tomt = alle klienter)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "Anvend og behold indstillinger" @@ -889,40 +1054,44 @@ msgstr "Anvend og behold indstillinger" msgid "Apply backup?" msgstr "Anvend backup?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Anvendelse af anmodning mislykkedes med status %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Anvend ikke afkrydset" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "Anvend med tilbagevenden efter forbindelsestab" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Anvendelse af konfigurationsændringer... %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Arkitektur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Arp-scan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Tildele en del af en given længde af hvert offentligt IPv6-præfiks til dette " "interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "Tildel nye, freeform tags til dette indlæg." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -930,7 +1099,7 @@ msgstr "" "Tildel præfiksdele ved hjælp af dette hexadecimale subprefiks-id til dette " "interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Tilknyttede stationer" @@ -939,8 +1108,8 @@ msgstr "Tilknyttede stationer" msgid "Associations" msgstr "Foreninger" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" @@ -948,8 +1117,8 @@ msgstr "" "Mindst %h pr. %h, udbrud på %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -962,25 +1131,26 @@ msgid "Attempt to enable configured mount points for attached devices" msgstr "" "Forsøg på at aktivere konfigurerede monteringspunkter for tilsluttede enheder" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Auth gruppe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Godkendelse" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Godkendelsestype" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autoritativ" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Autorisation påkrævet" @@ -988,7 +1158,9 @@ msgstr "Autorisation påkrævet" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1006,7 +1178,7 @@ msgstr "Automatisk Homenet (HNCP)" msgid "Automatically check filesystem for errors before mounting" msgstr "Kontroller automatisk filsystemet for fejl før montering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1030,6 +1202,10 @@ msgstr "Automount filsystem" msgid "Automount Swap" msgstr "Automount Swap" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Tilgængelig" @@ -1048,11 +1224,15 @@ msgstr "Tilgængelig" msgid "Average:" msgstr "Gennemsnit:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Undgå bro Loops" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1060,15 +1240,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "BSS overgang" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Tilbage" @@ -1077,11 +1261,7 @@ msgstr "Tilbage" msgid "Back to Overview" msgstr "Tilbage til Oversigt" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Tilbage til konfiguration" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "Tilbage til peer-konfiguration" @@ -1094,16 +1274,15 @@ msgid "Backup / Flash Firmware" msgstr "Backup / Flash Firmware" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Liste over backup-filer" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Bånd" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Basisenhed" @@ -1111,12 +1290,42 @@ msgstr "Basisenhed" msgid "Base64-encoded public key of this interface for sharing." msgstr "Base64-kodet offentlig nøgle for dette interface til deling." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Batman-enhed" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Batman interface" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv har en indbygget lag 2-fragmentering for unicast-data, der " +"strømmer gennem nettet, hvilket gør det muligt at køre batman-adv over " +"grænseflader/forbindelser, der ikke tillader at øge MTU'en ud over Ethernet-" +"standardpakke-størrelsen på 1500 bytes. Når fragmenteringen er aktiveret, " +"vil batman-adv automatisk fragmentere for store pakker og defragmentere dem " +"i den anden ende. Som standard er fragmenteringen aktiveret og inaktiv, hvis " +"pakken passer, men det er muligt at deaktivere fragmenteringen helt." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Beacon-interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Beacon Rapport" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1130,7 +1339,7 @@ msgstr "" msgid "Bind NTP server" msgstr "Bind NTP server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "Bind dynamisk til interfaces i stedet for wildcard-adresser." @@ -1139,18 +1348,33 @@ msgstr "Bind dynamisk til interfaces i stedet for wildcard-adresser." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Bind interface" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "Bind tjeneste akter til et domænenavn: angiv placeringen af tjenester." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"Bind tjeneste akter til et domænenavn: Angiv placeringen af tjenester. Se RFC2782." + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1162,65 +1386,77 @@ msgstr "Bind tunnelen til dette interface (valgfrit)." msgid "Bitrate" msgstr "Bitrate" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Bonding Mode" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Bonding Politik" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "Både \"Relay from\" og \"Relay to adresse\" skal specificeres." + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Bro" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Bro (understøtter direkte kommunikation mellem MAC VLANs)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Bro VLAN-filtrering" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Bro enhed" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "Broportspecifikke indstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Broporte" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "Brotrafiktabel \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Nummer på broenhed" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Bring tom bro op" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "start op ved boot" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "start bro interface op, selv om der ikke er tilsluttet nogen porte" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "Broadcast" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Broadcast politik (broadcast, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Gennemse…" @@ -1228,16 +1464,40 @@ msgstr "Gennemse…" msgid "Buffered" msgstr "Buffered" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" +"CA-certifikat (PEM-kodet; Brug i stedet for systemdækkende lager til at " +"bekræfte gateway certifikatet." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "CA-certifikat; hvis det er tomt, vil det blive gemt efter den første " "forbindelse." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "CLAT-konfiguration mislykkedes" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "CNAME" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME eller fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (eksternt administreret interface)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "CPU-forbrug (%)" @@ -1252,18 +1512,25 @@ msgstr "Cachelagret" msgid "Call failed" msgstr "Opkald mislykkedes" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"Kan være nyttigt, hvis ISP har IPv6 navneservere, men ikke leverer IPv6 " +"routing." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Annuller" @@ -1271,32 +1538,32 @@ msgstr "Annuller" msgid "Cannot parse configuration: %s" msgstr "Kan ikke parse konfiguration: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "Fang indgående pakker adresseret til andre værter" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "Fang indgående pakker før enhver routingbeslutning" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "Fang indgående pakker, der sendes til det lokale system" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "Fang udgående pakker efter enhver routingbeslutning" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "Fang udgående pakker, der stammer fra det lokale system" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "Fang pakker direkte efter at NIC har modtaget dem" @@ -1305,24 +1572,32 @@ msgstr "Fang pakker direkte efter at NIC har modtaget dem" msgid "Category" msgstr "Kategori" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "Celle-id" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "Celle placering" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Certifikatbegrænsning (domæne)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Certifikatbegrænsning (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Certifikatbegrænsning (emne)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Certifikatbegrænsning (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1330,8 +1605,8 @@ msgstr "" "Understreng til certifikatbegrænsning - f.eks. /CN=wifi.mycompany.com
    Se `logread -f` under handshake for de faktiske værdier" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1339,8 +1614,8 @@ msgstr "" "Certifikatbegrænsning(er) i forhold til DNS SAN-værdier (hvis de er " "tilgængelige)
    eller Subject CN (nøjagtigt match)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1348,8 +1623,8 @@ msgstr "" "Certifikatbegrænsning(er) i forhold til DNS SAN-værdier (hvis de er " "tilgængelige)
    eller Subject CN (Suffiks match)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1363,16 +1638,16 @@ msgstr "" msgid "Chain" msgstr "Kæde" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "Kædekrog \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Ændringer" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Ændringerne er blevet tilbageført." @@ -1383,18 +1658,19 @@ msgstr "Ændrer administratoradgangskoden for adgang til enheden" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Kanal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Kanalanalyse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Kanalbredde" @@ -1402,7 +1678,7 @@ msgstr "Kanalbredde" msgid "Check filesystems before mount" msgstr "Kontroller filsystemer før montering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" "Markér denne indstilling for at slette de eksisterende netværk fra denne " @@ -1421,8 +1697,8 @@ msgstr "Kontrol af billede…" msgid "Choose mtdblock" msgstr "Vælg mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1434,7 +1710,7 @@ msgstr "" "eller udfyld feltet brugerdefineret for at definere en ny zone og " "knytte interface til den." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1442,7 +1718,7 @@ msgstr "" "Vælg det eller de netværk, du vil knytte til denne trådløse interface, eller " "udfyld feltet brugerdefineret for at definere et nyt netværk." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Cipher" @@ -1466,9 +1742,10 @@ msgstr "" "Klik på \"Save mtdblock\" for at downloade den angivne mtdblock-fil. " "(BEMÆRK: DENNE FUNKTION ER FOR PROFESSIONELLE! )" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Klient" @@ -1477,9 +1754,9 @@ msgstr "Klient" msgid "Client ID to send when requesting DHCP" msgstr "Klient-ID, der skal sendes ved anmodning om DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Luk" @@ -1496,20 +1773,20 @@ msgstr "" "Luk inaktiv forbindelse efter det angivne antal sekunder, brug 0 for at " "opretholde forbindelsen" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Luk liste..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Indsamler data..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "Collisioner set" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Kommando" @@ -1526,7 +1803,7 @@ msgstr "Kommandoen mislykkedes" msgid "Comment" msgstr "Kommentar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1549,29 +1826,28 @@ msgstr "Beregner den udgående checksum (valgfrit)." msgid "Config File" msgstr "Konfigurationsfil" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Konfiguration" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "Konfigurationseksport" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Konfigurationsændringer er anvendt." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Konfigurationsændringer er blevet rullet tilbage!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Konfiguration mislykkedes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1588,7 +1864,7 @@ msgstr "" "som basishastighed. Der tilbydes ikke understøttede hastigheder, der er " "lavere end den minimale basishastighed." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." @@ -1596,7 +1872,7 @@ msgstr "" "Konfigurerer standard-routerannonceringen i RA-meddelelser." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1604,17 +1880,17 @@ msgstr "" "Konfigurerer driftstilstanden for RA-tjenesten på denne interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "Konfigurerer driftstilstanden for DHCPv6-tjenesten på denne interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" "Konfigurerer driftstilstanden for NDP-proxytjenesten på denne interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Konfigurer…" @@ -1626,9 +1902,10 @@ msgstr "Bekræft afbrydelse af forbindelsen" msgid "Confirmation" msgstr "Bekræftelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Tilsluttet" @@ -1638,11 +1915,11 @@ msgstr "Tilsluttet" msgid "Connection attempt failed" msgstr "Forbindelsesforsøg mislykkedes" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "Forbindelsesforsøg mislykkedes." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "Slutpunkt for forbindelse" @@ -1654,7 +1931,7 @@ msgstr "Forbindelse afbrudt" msgid "Connections" msgstr "Forbindelser" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "Forbindelsesændring" @@ -1685,9 +1962,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Indholdet er blevet gemt." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1698,16 +1975,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "Fortsæt om %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "Fortsæt i opkaldskæden" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "Fortsæt med at behandle umatchede pakker" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1722,20 +1999,20 @@ msgstr "" msgid "Country" msgstr "Land" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Landekode" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Dækningscelletæthed" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Opret / Tildel firewall-zone" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Opret interface" @@ -1747,7 +2024,7 @@ msgstr "Kritisk" msgid "Cron Log Level" msgstr "Cron-logniveau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Nuværende effekt" @@ -1790,31 +2067,31 @@ msgstr "" "Tilpasser enhedens adfærd LEDs, " "hvis det er muligt." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "DAD sender" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE-klient" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE-port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAE-Secret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "DHCP-indstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP-server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP og DNS" @@ -1825,16 +2102,24 @@ msgstr "DHCP og DNS" msgid "DHCP client" msgstr "DHCP klient" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP-indstillinger" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" +"DHCPv4 leasetime anvendes som grænse og foretrukne levetid af " +"IPv6 præfiks." + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6 klient" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6-tjeneste" @@ -1846,19 +2131,19 @@ msgstr "DHCPv6-tjeneste" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "DNS-videresendelser" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "Port til DNS-forespørgsel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "DNS-søgningsdomæner" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "Port til DNS-server" @@ -1866,7 +2151,7 @@ msgstr "Port til DNS-server" msgid "DNS setting is invalid" msgstr "DNS indstillingen er ugyldig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "DNS vægt" @@ -1874,11 +2159,11 @@ msgstr "DNS vægt" msgid "DNS-Label / FQDN" msgstr "DNS-mærke / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "DNSSEC check usigneret" @@ -1890,39 +2175,47 @@ msgstr "DPD Idle Timeout" msgid "DS-Lite AFTR address" msgstr "DS-Lite AFTR-adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "DSL Status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "DSL-linjemodus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "DTIM interval" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Datahastighed" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Data modtaget" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Data Overført" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Debug" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Standard router" @@ -1930,7 +2223,7 @@ msgstr "Standard router" msgid "Default state" msgstr "Standardtilstand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1939,7 +2232,7 @@ msgstr "" "Definer yderligere DHCP-optioner, f.eks. \"6,192.168.2.1,192.168.2.2\", som annoncerer forskellige DNS-servere til klienterne." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" @@ -1947,7 +2240,7 @@ msgstr "" "Definerer en mapping af Linux-intern pakkeprioritet til VLAN-" "headerprioritet, men for udgående rammer" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" @@ -1955,49 +2248,50 @@ msgstr "" "Definerer en mapping af VLAN-headerprioritet til Linux-intern pakkeprioritet " "på indgående frames" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "Definerer en specifik MTU for denne rute" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "Delegere IPv6-præfikser" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Slet" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Slet nøgle" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Anmodning om sletning mislykkedes: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Slet dette netværk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Meddelelsesinterval for meddelelse om levering af trafikinformation" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Beskrivelse" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Fravælg" @@ -2005,11 +2299,11 @@ msgstr "Fravælg" msgid "Design" msgstr "Design" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "Udpeget master" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2044,9 +2338,9 @@ msgstr "Destination zone" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2056,36 +2350,40 @@ msgstr "Destination zone" msgid "Device" msgstr "Enhed" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Enhedskonfiguration" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "Enheds-id" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Enheden er ikke aktiv" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Enheden genstarter…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Enhedens navn" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Enheden administreres ikke af ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Enheden er ikke til stede" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Enhedstype" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Enheden er ikke tilgængelig!" @@ -2093,31 +2391,31 @@ msgstr "Enheden er ikke tilgængelig!" msgid "Device unreachable! Still waiting for device..." msgstr "Enheden er ikke tilgængelig! Venter stadig på enheden..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Enheder" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnostik" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Tast nummer" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Mappe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Deaktiver" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2134,20 +2432,24 @@ msgstr "Deaktivere DNS-opslag" msgid "Disable Encryption" msgstr "Deaktiver kryptering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Deaktivere opsamling af inaktivitet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Deaktivere dette netværk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2156,34 +2458,33 @@ msgstr "Deaktivere dette netværk" msgid "Disabled" msgstr "Deaktiveret" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "Deaktiveret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Fjern tilknytning ved lav anerkendelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" "Kassér upstream svar, der indeholder RFC1918-adresser." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Afbryd forbindelsen" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Afbrydelsesforsøg mislykkedes" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Afbrydelsesforsøg mislykkedes." @@ -2193,23 +2494,37 @@ msgstr "Diskplads" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Afvis" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Afstandsoptimering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Afstand til det fjerneste netværksmedlem i meter." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Distribueret ARP-tabel" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" +"Dnsmasq instance, som denne DHCP-værtssektion er bundet. Hvis det ikke er " +"angivet, gælder afsnittet for alle dnsmasq-instanser." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2217,7 +2532,7 @@ msgstr "" "Dnsmasq-instans, som denne opstartssektion er bundet til. Hvis den ikke er " "angivet, er sektionen gyldig for alle dnsmasq-instanser." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP-server og DNS-forwarder." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "Cache ikke negative svar, f.eks. for ikke-eksisterende domæner." @@ -2238,33 +2553,23 @@ msgstr "Cache ikke negative svar, f.eks. for ikke-eksisterende domæner." msgid "Do not create host route to peer (optional)." msgstr "Opret ikke værtsrute til peer (valgfrit)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "Videresend ikke DNS-forespørgsler uden prikker eller domænedele." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Videresend ikke forespørgsler, som ikke kan besvares af offentlige resolvere." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Videresend ikke reverse opslag for lokale netværk." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Lyt ikke på de angivne interfaces." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "Tilbyder ikke DHCPv6-tjeneste på dette interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Deltag ikke" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2276,7 +2581,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Send ikke et værtsnavn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2284,11 +2589,11 @@ msgstr "" "Send ingen RA-" "meddelelser på dette interface." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Ønsker du virkelig at slette \"%s\" ?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Ønsker du virkelig at slette følgende SSH-nøgle?" @@ -2296,11 +2601,11 @@ msgstr "Ønsker du virkelig at slette følgende SSH-nøgle?" msgid "Do you really want to erase all settings?" msgstr "Ønsker du virkelig at slette alle indstillinger?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Ønsker du virkelig at slette mappen \"%s\" rekursivt?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "Vil du erstatte den nuværende PSK?" @@ -2308,15 +2613,17 @@ msgstr "Vil du erstatte den nuværende PSK?" msgid "Do you want to replace the current keys?" msgstr "Vil du erstatte de nuværende nøgler?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Domæne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Påkrævet domæne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Domænehvidliste" @@ -2342,11 +2649,11 @@ msgstr "Download backup" msgid "Download mtdblock" msgstr "Download mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Nedstrøms SNR offset" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2362,16 +2669,60 @@ msgstr "Træk for at omarrangere" msgid "Drop Duplicate Frames" msgstr "Drop dublerede Frames" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"Drop alle gratuitous ARP frames, for eksempel hvis der er en kendt god ARP " +"proxy på netværket, og sådanne frames ikke skal bruges eller i tilfælde af " +"802.11, må ikke bruges til at forhindre angreb." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Drop alle uopfordrede naboannoncer, f.eks. hvis der er en kendt god NA-proxy " +"på netværket, og sådanne frames ikke behøver at blive brugt, eller i " +"tilfælde af 802.11, ikke må bruges for at forhindre angreb." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Drop gratuitous ARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "Drop lag 2 multicast frames der indeholder IPv4 unicast-pakker." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "Drop lag 2 multicast frames der indeholder IPv6 unicast-pakker." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Drop indlejret IPv4 unicast" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Drop indlejret IPv6 unicast" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Drop pakke" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "Drop umatchede pakker" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Drop uopfordret NA" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbear Instans" @@ -2389,20 +2740,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Dynamisk DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "Dynamisk Authorization Extension-klient." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "Dynamisk Authorization Extension port." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "Dynamisk Authorization Extension secret." @@ -2410,7 +2761,7 @@ msgstr "Dynamisk Authorization Extension secret." msgid "Dynamic tunnel" msgstr "Dynamisk tunnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2418,21 +2769,33 @@ msgstr "" "Dynamisk tildeling af DHCP-adresser til klienter. Hvis den er deaktiveret, " "vil kun klienter med statiske leases blive betjent." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "F.eks. br-vlan eller brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "F.eks. eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "EA-bits længde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAP-metode" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Hver STA er tildelt sit eget AP_VLAN interface." + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Rediger" @@ -2440,6 +2803,10 @@ msgstr "Rediger" msgid "Edit peer" msgstr "Rediger peer" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "Rediger statisk lease" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2448,11 +2815,11 @@ msgstr "" "Rediger de rå konfigurationsdata ovenfor for at rette eventuelle fejl, og " "tryk på \"Save\" for at genindlæse siden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Rediger dette netværk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Rediger trådløst netværk" @@ -2461,46 +2828,36 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "Effektiv rute MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Egress QoS-mapping" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "Egress enheds-id" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Egress enhedsnavn" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Egress tagget" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Egress utagget" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Nødsituation" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Aktiver" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" "Aktiver / deaktiver peer. Genstart wireguard interface for at anvende " "ændringerne." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2508,11 +2865,11 @@ msgstr "" "Aktiver IGMP " "snooping" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Aktiver STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "Aktiver SLAAC" @@ -2530,10 +2887,11 @@ msgstr "Aktiver dynamisk blanding af flows" msgid "Enable HE.net dynamic endpoint update" msgstr "Aktiver dynamisk opdatering af HE.net-slutpunktet" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Aktiver IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Aktiver IPv6-forhandling" @@ -2547,11 +2905,15 @@ msgstr "Aktiver IPv6-forhandling" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Aktiver IPv6-forhandling på PPP-forbindelsen" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "Aktiver IPv6 segment routing" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Aktiver Jumbo Frame passthrough" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "Aktiver MAC-adresselæring" @@ -2563,11 +2925,11 @@ msgstr "Aktiver NTP-klient" msgid "Enable Single DES" msgstr "Aktiver Single DES" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Aktiver TFTP-server" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Aktiver VLAN-filtrering" @@ -2575,7 +2937,7 @@ msgstr "Aktiver VLAN-filtrering" msgid "Enable VLAN functionality" msgstr "Aktiver VLAN-funktionalitet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Aktiver WPS-knappen, kræver WPA(2)-PSK/WPA3-SAE" @@ -2589,14 +2951,14 @@ msgstr "" "Protocol\">HTTP-anmodninger til HTTPS-porten." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" "Aktiver nedstrømsdelegering af IPv6-præfikser, der er tilgængelige på dette " "interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Aktiver modforanstaltninger til geninstallation af nøgler (KRACK)" @@ -2612,26 +2974,26 @@ msgstr "Aktiver spejling af indgående pakker" msgid "Enable mirroring of outgoing packets" msgstr "Aktiver spejling af udgående pakker" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "Aktiver multicast fast leave" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "Aktiver multicast-querier" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Aktiver understøttelse af multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Aktiver pakkestyring på tværs af alle CPU'er. Kan hjælpe eller hæmme " "netværkshastigheden." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Aktiver promiscuous tilstand" @@ -2653,11 +3015,11 @@ msgstr "Aktiver understøttelse af multicast-trafik (valgfrit)." msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Aktiver DF-flaget (Don't Fragment) i de indkapslende pakker." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "Aktiver den indbyggede TFTP-server med enkeltinstans." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Aktiver dette netværk" @@ -2666,21 +3028,24 @@ msgstr "Aktiver dette netværk" msgid "Enable tx checksum" msgstr "Aktiver tx-kontrolsum" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "Aktiver unicast-flooding" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" -msgstr "Aktiveret" +msgstr "Aktiver" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Aktiverer IGMP snooping på denne bro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2688,7 +3053,15 @@ msgstr "" "Gør det muligt at foretage hurtig roaming mellem adgangspunkter, der " "tilhører det samme mobilitetsområde" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" +"Muliggør mere effektiv, gruppebevidst multicast-videresendelsesinfrastruktur " +"i batman-adv." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Aktiverer Spanning Tree-protokollen på denne bro" @@ -2696,24 +3069,29 @@ msgstr "Aktiverer Spanning Tree-protokollen på denne bro" msgid "Encapsulation limit" msgstr "Indkapslingsgrænse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Indkapslingstilstand" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Kryptering" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Endpoint" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Slutpunkt vært" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Slutpunktsport" @@ -2721,23 +3099,23 @@ msgstr "Slutpunktsport" msgid "Endpoint setting is invalid" msgstr "Slutpunktindstillingen er ugyldig" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "Gennemtving IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "Gennemtving IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "Gennemtving IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "Gennemtving MLD version 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "Gennemtving MLD version 2" @@ -2766,10 +3144,6 @@ msgstr "Fejl" msgid "Error getting PublicKey" msgstr "Fejl ved hentning af Offentlig nøgle" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Fejlede sekunder (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2788,11 +3162,19 @@ msgstr "Hvert 30. sekund (langsom, 0)" msgid "Every second (fast, 1)" msgstr "Hvert sekund (hurtigt, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Udelad interfaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"Udførelse af forskellige netværkskommandoer for at kontrollere forbindelsen " +"og navneopløsningen til andre systemer." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2800,27 +3182,35 @@ msgstr "" "Undtag 127.0.0.0.0/8 og ::1 fra kontrol af " "rebinding, f.eks. for RBL-tjenester." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Eksisterende enhed" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Udvid værter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Forventet portnummer." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Forventer et hexadecimalt tildelingshint" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Forventer en gyldig IPv4-adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Forventer en gyldig IPv6-adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "Forventning af en gyldig MAC-adresse, valgfrit herunder wildcards" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Forventer to prioritetsværdier adskilt af et kolon" @@ -2829,11 +3219,11 @@ msgstr "Forventer to prioritetsværdier adskilt af et kolon" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Forventer: %s" @@ -2845,7 +3235,7 @@ msgstr "Forventer: ikke-tom værdi" msgid "Expires" msgstr "Udløber" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2855,11 +3245,11 @@ msgstr "" msgid "External" msgstr "Ekstern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Ekstern R0 Nøgleholderliste" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Ekstern R1 nøgleholderliste" @@ -2887,36 +3277,64 @@ msgstr "Ekstra pppd-indstillinger" msgid "Extra sstpc options" msgstr "Ekstra sstpc-indstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT over DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT over luften" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "FT-protokol" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "Mislykket årsag" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Det lykkedes ikke at ændre systemadgangskoden." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Konfiguration af modem mislykkedes" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" "Det lykkedes ikke at bekræfte anvendelsen inden for %ds, venter på rollback…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Kunne ikke oprette forbindelse" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Kunne ikke afbryde forbindelsen" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Fejl i udførelsen af \"/etc/init.d/%s %s %s\" handling: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Der kunne ikke hentes modemoplysninger" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Kunne ikke initialisere modem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Kunne ikke indstille driftstilstand" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Fil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2924,24 +3342,24 @@ msgstr "" "Fil, der viser upstream resolvere, valgfrit domænespecifikke, f.eks. " "server=1.2.3.4, server=/domain/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Filen er ikke tilgængelig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "Fil til lagring af DHCP-leasingoplysninger." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "Fil med upstream resolvers." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Filnavn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Filnavn på det boot image, der annonceres til klienterne." @@ -2950,14 +3368,22 @@ msgstr "Filnavn på det boot image, der annonceres til klienterne." msgid "Filesystem" msgstr "Filsystem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Filter IPv4 A Akter" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Filtrere IPv6 AAAA Akter" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Filtrer SRV/SOA-tjenesteopdagelse" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filter privat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filter ubrugelig" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Filtrering for alle slaver, ingen validering" @@ -2970,8 +3396,15 @@ msgstr "Filtrering for alle slaver, validering kun for aktiv slave" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "Filtrering for alle slaver, validering kun for backup-slaver" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" +"Filtrerer SRV/SOA-tjenesteopdagelse for at undgå at udløse opkald-on-demand-" +"links." + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Færdiggørelsen mislykkedes" @@ -2983,7 +3416,7 @@ msgstr "" "Find alle aktuelt tilsluttede filsystemer og swap-programmer og erstat " "konfigurationen med standardindstillinger baseret på det, der blev fundet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Find og deltag i netværket" @@ -2997,10 +3430,11 @@ msgid "Firewall" msgstr "Firewall" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Firewall-mærke" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Firewall-indstillinger" @@ -3008,19 +3442,19 @@ msgstr "Firewall-indstillinger" msgid "Firewall Status" msgstr "Firewall-status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "Firewall-mærke" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Firmware-fil" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Firmware-version" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Fast kildeport til udgående DNS-forespørgsler." @@ -3046,40 +3480,48 @@ msgstr "Flash-operationer" msgid "Flashing…" msgstr "Flashing…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "Følg IPv4 Lifetime" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Tving" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Tvinge 40 MHz-tilstand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Tving CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Tving DHCP på dette netværk, selvom en anden server er fundet." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "Tving IGMP-version" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "Tving MLD-version" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Tving TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Tving TKIP og CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "Tving broadcast DHCP-respons." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Tving link" @@ -3091,11 +3533,11 @@ msgstr "Tving opgradering" msgid "Force use of NAT-T" msgstr "Tving brug af NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Form token uoverensstemmelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA meddelelser mellem den " "udpegede master interface og downstream-interfaces." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3121,7 +3563,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Videresend DHCP-trafik" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3129,31 +3571,35 @@ msgstr "" "Videresend DHCPv6-meddelelser mellem den udpegede master interface og " "downstream-interfaces." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "Fecs (Forward Error Correction Seconds)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Videresend broadcast-trafik" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "Videresend Forsinkelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Videresend peer-trafik" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "Videresend multicast-pakker som unicast-pakker på denne enhed." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "Forward/reverse DNS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Videresendelsestilstand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Fragmentering" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Fragmenteringstærskel" @@ -3177,7 +3623,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Kun GPRS" @@ -3197,12 +3643,16 @@ msgstr "GRETAP-tunnel over IPv4" msgid "GRETAP tunnel over IPv6" msgstr "GRETAP-tunnel over IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Gateway" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Gateway-tilstand" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Gateway-porte" @@ -3212,23 +3662,23 @@ msgstr "Gateway-porte" msgid "Gateway address is invalid" msgstr "Gateway-adressen er ugyldig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Generelle indstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Generel opsætning" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Generelle enhedsindstillinger" @@ -3236,7 +3686,7 @@ msgstr "Generelle enhedsindstillinger" msgid "Generate Config" msgstr "Generere konfiguration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Generer PMK lokalt" @@ -3244,11 +3694,11 @@ msgstr "Generer PMK lokalt" msgid "Generate archive" msgstr "Generer arkiv" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "Generer konfiguration" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "Generer konfiguration…" @@ -3256,16 +3706,16 @@ msgstr "Generer konfiguration…" msgid "Generate new key pair" msgstr "Generer et nyt nøglepar" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "Generer en PresharedKey nøgle" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" "Genererer en konfiguration, der er egnet til import på en WireGuard peer" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "Genererer QR-kode…" @@ -3278,39 +3728,40 @@ msgstr "" msgid "Global Settings" msgstr "Globale indstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Globale netværksindstillinger" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "Gå til opgradering af firmware..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Gå til adgangskodekonfiguration..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Gå til den relevante konfigurationsside" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "Giver adgang til DHCP-konfiguration" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Giver adgang til visning af DHCP-status" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "Giv adgang til DSL-statusvisning" @@ -3322,6 +3773,10 @@ msgstr "Giv adgang til LuCI OpenConnect-procedurer" msgid "Grant access to LuCI Wireguard procedures" msgstr "Giv adgang til LuCI Wireguard-procedurer" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Giv adgang til LuCI openfortivpn-procedurer" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "Giv adgang til SSH-konfiguration" @@ -3358,7 +3813,7 @@ msgstr "Giv adgang til monteringskonfiguration" msgid "Grant access to network configuration" msgstr "Giv adgang til netværkskonfiguration" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Giv adgang til netværksdiagnosticeringsværktøjer" @@ -3366,6 +3821,10 @@ msgstr "Giv adgang til netværksdiagnosticeringsværktøjer" msgid "Grant access to network status information" msgstr "Giv adgang til netværksstatusoplysninger" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "Giv adgang til processtatus" @@ -3398,7 +3857,7 @@ msgstr "Giv adgang til uHTTPd-konfiguration" msgid "Grant access to wireless channel status" msgstr "Giv adgang til trådløs kanalstatus" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Giv adgang til trådløs statusvisning" @@ -3427,15 +3886,11 @@ msgstr "HTTP(S)-adgang" msgid "Hang Up" msgstr "Læg på" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Header Error Code Errors (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Hjerteslagsinterval (kerne: hjerteslag)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Hej interval" @@ -3447,7 +3902,7 @@ msgstr "" "Her kan du konfigurere de grundlæggende aspekter af din enhed som f.eks. " "værtsnavn eller tidszone." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Skjul ESSID" @@ -3456,17 +3911,25 @@ msgstr "Skjul ESSID" msgid "Hide empty chains" msgstr "Skjul tomme kæder" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "Høj" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "Ære gratuitous ARP" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "Hook: %h (%h), Prioritet: %d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Hop straf" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3476,7 +3939,7 @@ msgstr "Vært" msgid "Host expiry timeout" msgstr "Udløbstidspunkt for vært" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "Værten anmoder om dette filnavn fra opstartsserveren." @@ -3484,10 +3947,18 @@ msgstr "Værten anmoder om dette filnavn fra opstartsserveren." msgid "Host-Uniq tag content" msgstr "Host-Uniq tag indhold" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" +"Værtsspecifik lease tid, f.eks. 5m, 3t, 7d." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3497,11 +3968,11 @@ msgstr "Værtsnavn" msgid "Hostname to send when requesting DHCP" msgstr "Værtsnavn, der skal sendes, når der anmodes om DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Værtsnavne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3560,27 +4031,31 @@ msgstr "IEEE 802.3ad Dynamisk link aggregation (802.3ad, 4)" msgid "IKE DH Group" msgstr "IKE DH-gruppen" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "IMEI" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IP-adresser" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "IP-protokol" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "IP-sæt" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "IP-type" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" -msgstr "IP-adresse" +msgstr "IP Address" #: modules/luci-base/htdocs/luci-static/resources/network.js:10 #: modules/luci-compat/luasrc/model/network.lua:28 @@ -3592,7 +4067,7 @@ msgstr "IP-adressen er ugyldig" msgid "IP address is missing" msgstr "IP-adresse mangler" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3607,20 +4082,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "IP protokol" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "IP protokol" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "IP-sæt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "IP-sæt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "IP'er, der skal tilsidesættes med NXDOMAIN" @@ -3628,14 +4103,15 @@ msgstr "IP'er, der skal tilsidesættes med NXDOMAIN" msgid "IPsec XFRM" msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3651,7 +4127,7 @@ msgstr "IPv4-naboer" msgid "IPv4 Routing" msgstr "IPv4-routning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "IPv4-regler" @@ -3661,7 +4137,7 @@ msgstr "IPv4 Upstream" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3688,7 +4164,7 @@ msgstr "IPv4-netmaske" msgid "IPv4 network in address/netmask notation" msgstr "IPv4-netværk i adresse/netmaske-notation" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Kun IPv4" @@ -3701,11 +4177,11 @@ msgstr "IPv4-præfiks" msgid "IPv4 prefix length" msgstr "IPv4-præfiks længde" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "IPv4 trafik tabel \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3714,16 +4190,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-i-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (begge - standardindstillingen er IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "IPv4/IPv6 trafik tabel \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3734,7 +4214,8 @@ msgstr "IPv4/IPv6 trafik tabel \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3742,7 +4223,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6-firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "IPv6 MTU" @@ -3750,7 +4231,11 @@ msgstr "IPv6 MTU" msgid "IPv6 Neighbours" msgstr "IPv6-naboer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "IPv6 Prefix Lifetime" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "IPv6 RA-indstillinger" @@ -3758,15 +4243,15 @@ msgstr "IPv6 RA-indstillinger" msgid "IPv6 Routing" msgstr "IPv6-routning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "IPv6-regler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "IPv6-indstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6 ULA-præfiks" @@ -3780,12 +4265,12 @@ msgstr "IPv6 Upstream" msgid "IPv6 address" msgstr "IPv6-adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "IPv6-tildelingstip" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "IPv6-tildelingslængde" @@ -3797,11 +4282,11 @@ msgstr "IPv6 gateway" msgid "IPv6 network in address/netmask notation" msgstr "IPv6-netværk i adresse/netmaske-notation" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" -msgstr "Kun IPv6" +msgstr "Kun IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "IPv6-præference" @@ -3810,7 +4295,7 @@ msgstr "IPv6-præference" msgid "IPv6 prefix" msgstr "IPv6-præfiks" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "IPv6 præfiksfilter" @@ -3824,23 +4309,19 @@ msgstr "IPv6-præfiks længde" msgid "IPv6 routed prefix" msgstr "IPv6-rutet præfiks" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "IPv6 kilde routing" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "IPv6-suffiks" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "IPv6-suffiks (hex)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "IPv6-understøttelse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "IPv6 trafik tabel \"%h\"" @@ -3848,6 +4329,10 @@ msgstr "IPv6 trafik tabel \"%h\"" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "IPv6-Suffix (hex)" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3863,10 +4348,18 @@ msgstr "IPv6-over-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-over-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identitet" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" +"Hvis en vært matcher en post, der ikke kan bruges, fordi den angiver en " +"adresse på en anden undernet, er mærket kendt-andnet indstillet." + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Hvis markeret, er 1DES aktiveret" @@ -3880,7 +4373,7 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "Hvis afkrydsningsfeltet er markeret, deaktiveres kryptering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." @@ -3888,7 +4381,7 @@ msgstr "" "Hvis de er angivet, tildeles downstream-suvbets kun fra de angivne IPv6-" "præfiksklasser." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" "Hvis den er indstillet, bliver betydningen af matchmulighederne omvendt" @@ -3910,7 +4403,7 @@ msgstr "" "Hvis angivet, monteres enheden ved hjælp af partitionsetiketten i stedet for " "en fast enheds node" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " @@ -3921,14 +4414,16 @@ msgstr "" "inden for %d sekunder for at bekræfte indstillingerne, ellers vil " "ændringerne blive annulleret." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Hvis ikke markeret, er der ikke konfigureret nogen standardrute" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "Hvis ikke markeret, ignoreres de annoncerede DNS-serveradresser" @@ -3947,15 +4442,24 @@ msgstr "" "en meget langsommelig proces at bytte data, da swap-enheden ikke kan tilgås " "med de høje datarater i RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "Ignorer" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignorer /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignorer interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" +"Ignorer anmodninger fra ukendte maskiner ved hjælp af ! Kendte." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignorer resolv-fil" @@ -3967,25 +4471,25 @@ msgstr "Image" msgid "Image check failed:" msgstr "Image tjek mislykkedes:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "Importer som peer" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "Importer konfiguration" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "Importer konfiguration som peer…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "Importer indstillinger" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "Importeret peer-konfiguration" @@ -3998,7 +4502,29 @@ msgstr "" msgid "In" msgstr "I" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" +"I DHCPv4 er det muligt at inkludere mere end en mac adresse. Dette gør det " +"muligt for en IP-adresse at være forbundet med flere macaddrs, og dnsmasq " +"opgiver en DHCP lease til en af de macadders, når en anden spørger om en " +"lease. Det virker kun pålideligt, hvis kun en af macadders er aktiv til " +"enhver tid." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"I bridged LAN-opsætninger er det tilrådeligt at aktivere bridge loop " +"avoidance for at undgå broadcast loops, der kan få hele LAN'et til at gå i " +"stå." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -4007,7 +4533,7 @@ msgstr "" "blokeret. Klik på \"Fortsæt \"\" nedenfor for at vende tilbage til den " "foregående side." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "I sekunder" @@ -4039,7 +4565,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Indgående kontrolsum" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Indgående interface" @@ -4047,6 +4573,7 @@ msgstr "Indgående interface" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Indgående nøgle" @@ -4065,22 +4592,21 @@ msgstr "Info" msgid "Information" msgstr "Information" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "Ingress QoS-kortlægning" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "Ingress enheds-id" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "Ingress enhedsnavn" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Fejl ved initialisering" @@ -4092,31 +4618,41 @@ msgstr "Initscript" msgid "Initscripts" msgstr "Initscripts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Indre certifikatbegrænsning (domæne)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Indre certifikatbegrænsning (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Indre certifikatbegrænsning (emne)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Indre certifikatbegrænsning (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Installer protokoludvidelser..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Instans" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Instans \"%h\"" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Oplysninger om instans" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4128,6 +4664,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Utilstrækkelige tilladelser til at læse UCI-konfiguration." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "Integreret kredsløbskortidentifikator" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4135,7 +4675,7 @@ msgstr "Utilstrækkelige tilladelser til at læse UCI-konfiguration." msgid "Interface" msgstr "Interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "Interface \"%h\" er allerede markeret som udpeget master." @@ -4143,7 +4683,7 @@ msgstr "Interface \"%h\" er allerede markeret som udpeget master." msgid "Interface %q device auto-migrated from %q to %q." msgstr "Interface %q enhed migreret automatisk fra %q til %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Interface konfiguration" @@ -4174,11 +4714,11 @@ msgstr "Interface genopretter forbindelse..." msgid "Interface is shutting down..." msgstr "Interface lukker ned..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Interface starter..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Interface stopper..." @@ -4187,12 +4727,12 @@ msgid "Interface name" msgstr "Interface navn" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Interface ikke til stede eller ikke tilsluttet endnu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Interfaces" @@ -4201,15 +4741,19 @@ msgstr "Interfaces" msgid "Internal" msgstr "Intern" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Intern serverfejl" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "International mobilstation Udstyrsidentitet" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "International mobil Abonnentidentitet" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Interval for afsendelse af læringspakker" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4219,7 +4763,7 @@ msgstr "" "variere værdien kan en administrator justere antallet af IGMP-meddelelser i " "subnet; større værdier medfører, at IGMP-forespørgsler sendes sjældnere" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "Interval i sekunder for STP-hello-pakker" @@ -4229,8 +4773,9 @@ msgid "Invalid" msgstr "Ugyldig" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "Ugyldig APN angivet" @@ -4240,6 +4785,10 @@ msgstr "Ugyldig APN angivet" msgid "Invalid Base64 key string" msgstr "Ugyldig Base64-nøglestreng" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Ugyldig IPv6-adresse" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4262,7 +4811,7 @@ msgstr "Ugyldigt VLAN ID angivet! Kun unikke ID'er er tilladt" msgid "Invalid argument" msgstr "Ugyldigt argument" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4278,15 +4827,36 @@ msgstr "Ugyldig kommando" msgid "Invalid hexadecimal value" msgstr "Ugyldig hexadecimal værdi" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Ugyldigt værtsnavn eller IPv4-adresse" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Ugyldig port" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "Ugyldig server URL" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Ugyldigt brugernavn og/eller password! Prøv venligst igen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Inverter blinkende" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "Omvendt match" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "Er primært VLAN" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Isoler klienter" @@ -4299,25 +4869,25 @@ msgstr "" "Det ser ud til, at du forsøger at flashe et image, der ikke passer ind i " "flashhukommelsen, kontrollere venligst imagefilen!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "JavaScript påkrævet!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Deltag i netværk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Tilslut netværk: Trådløs scanning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Tilslutning til netværk: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Gå til regel" @@ -4325,24 +4895,28 @@ msgstr "Gå til regel" msgid "Keep settings and retain the current configuration" msgstr "Bevar indstillingerne og den aktuelle konfiguration" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "Keep-Alive" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Kernelog" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Kerneversion" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Nøgle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Nøgle #%d" @@ -4350,6 +4924,7 @@ msgstr "Nøgle #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Nøgle til indgående pakker (valgfrit)." @@ -4357,14 +4932,19 @@ msgstr "Nøgle til indgående pakker (valgfrit)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Nøgle til udgående pakker (valgfrit)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "Nøgle mangler" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Nøgle, der bruges til at signere netværkskonfiguration" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4409,7 +4989,7 @@ msgstr "LCP-echo interval" msgid "LED Configuration" msgstr "LED-konfiguration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4426,32 +5006,41 @@ msgstr "Sprog" msgid "Language and Style" msgstr "Sprog og stil" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" +"Større vægte (af samme prio) gives en forholdsmæssigt højere sandsynlighed " +"for at blive valgt." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "Sidste medlemsinterval" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Latency" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Seneste håndtryk" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" -msgstr "Blad" +msgstr "Leaf" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Lær" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "Lær ruter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Lease-fil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Lease tid" @@ -4475,7 +5064,7 @@ msgstr "Lad det være tomt for at autodetektere" msgid "Leave empty to use the current WAN address" msgstr "Lad være tom for at bruge den aktuelle WAN-adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4486,31 +5075,27 @@ msgstr "" "reduceret, hvis disse anvendes. Det anbefales, at 802.11b-hastigheder så " "vidt muligt ikke tillades." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "opdaget gamle regler" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Legend:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Grænse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Linjedæmpning (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "Linjetilstand" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "Linjetilstand" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "Linje oppetid" @@ -4531,16 +5116,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "Linklags header bits %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Liste over IP-adresser, der skal konverteres til NXDOMAIN-svar." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "Liste over IP-sæt, der skal udfyldes med de angivne domæne-IP'er." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4554,7 +5141,7 @@ msgstr "" "når der anmodes om PMK-R1-nøgle fra den R0KH, som STA'en brugte under den " "indledende mobilitetsdomæneassociation." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4572,23 +5159,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Liste over SSH-nøglefiler til auth" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Liste over domæner, som der skal tillades RFC1918-svar for." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Liste over domæner, der skal tvinges til en IP-adresse." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "Liste over upstream-resolvere at videresende forespørgsler til." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Lytteport" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Lytte interfaces" @@ -4596,7 +5180,7 @@ msgstr "Lytte interfaces" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "Lytter kun pÃ¥ det angivne interface eller, hvis ikke angivet, pÃ¥ alle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4608,7 +5192,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "ListenPort-indstillingen er ugyldig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Lytteport til indgÃ¥ende DNS-forespørgsler." @@ -4617,7 +5201,7 @@ msgstr "Lytteport til indgÃ¥ende DNS-forespørgsler." msgid "Load" msgstr "Læs" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Gennemsnitlig belastning" @@ -4625,27 +5209,28 @@ msgstr "Gennemsnitlig belastning" msgid "Load configuration…" msgstr "Indlæs konfiguration…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Indlæser data…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Indlæser mappeindhold…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Indlæser visning…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Lokal" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Lokal IP-adresse" @@ -4665,11 +5250,12 @@ msgstr "Lokal IP-adresse, der skal tildeles" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Lokal IPv4-adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Lokal IPv6 DNS-server" @@ -4685,44 +5271,70 @@ msgstr "Lokal IPv6-adresse" msgid "Local Startup" msgstr "Lokal opstart" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Lokal tid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "Lokal ULA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Lokalt domæne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "Lokalt domæne-suffiks tilføjes til DHCP-navne og poster i hosts-filen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Lokal server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Kun lokal betjening" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Lokal wireguard nøgle" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Lokaliser forespørgsler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "Lokalitetskode" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "LÃ¥s til BSSID" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Loghændelse \"%h...\"" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Login" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "For at logge ind…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Log ud" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Log output-niveau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Log forespørgsler" @@ -4750,37 +5362,28 @@ msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" "Logisk netværk, som tunnelen skal tilføjes til (overbrygges) (valgfrit)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Login" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Log ud" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "Løs filtrering" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Sekunder med tab af signal (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Laveste leased adresse som forskydning fra netværksadressen." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Lua-kompatibilitetstilstand aktiv" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC-adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "MAC-adressefilter" @@ -4788,16 +5391,15 @@ msgstr "MAC-adressefilter" msgid "MAC Address For The Actor" msgstr "MAC-adresse for aktøren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4806,11 +5408,15 @@ msgstr "MAC VLAN" msgid "MAC address" msgstr "MAC-adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "MAC-adresse(er)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC-Filter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "MAC-liste" @@ -4824,6 +5430,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "MAP-reglen er ugyldig" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "MBIM Cellular" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4845,15 +5455,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "MII-interval" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4863,7 +5477,7 @@ msgstr "" "kommandoer:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4872,65 +5486,69 @@ msgstr "" msgid "Manual" msgstr "Manuel" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "Fabrikant" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Master" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "Match Tag" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "Max RA-interval" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Max. opnÃ¥elig datahastighed (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "Max. DHCP-leases" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "Max. EDNS0-pakkestørrelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Maks. samtidige forespørgsler" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Maksimal alder" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Maksimalt tilladt lytteinterval" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Det maksimalt tilladte antal aktive DHCP-leases." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Det maksimalt tilladte antal samtidige DNS-forespørgsler." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "Maksimal tilladt størrelse af EDNS0 UDP-pakker." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Maksimalt antal sekunder, som modemet skal vente pÃ¥ at blive klar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Maksimalt antal leased adresser." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "Maksimal størrelse af snooping-tabellen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -4938,10 +5556,14 @@ msgstr "" "Maksimal tilladt tid mellem afsendelse af uopfordrede RA. Standardværdien er 600 sekunder." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Maksimal sendestyrke" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Kan forhindre VoIP eller andre tjenester i at fungere." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4968,7 +5590,7 @@ msgstr "Hukommelse" msgid "Memory usage (%)" msgstr "Hukommelsesforbrug (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -4976,10 +5598,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "Mesh ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Mesh Id" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Mesh Routing" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Indstillinger vedrørende mesh og routing" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Metode ikke fundet" @@ -4992,7 +5622,7 @@ msgstr "Metode til overvÃ¥gning af forbindelsen" msgid "Method to determine link status" msgstr "Metode til bestemmelse af forbindelsesstatus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -5003,11 +5633,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "Min RA interval" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Minimum ARP gyldighedstid" @@ -5015,7 +5645,7 @@ msgstr "Minimum ARP gyldighedstid" msgid "Minimum Number of Links" msgstr "Minimum antal links" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." @@ -5023,7 +5653,7 @@ msgstr "" "Minimum pÃ¥krævet tid i sekunder, før en ARP-post kan erstattes. Forhindrer " "ARP-cache-thashing." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -5039,35 +5669,49 @@ msgstr "SpejlovervÃ¥gningsport" msgid "Mirror source port" msgstr "Spejlkildeport" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "Mobil landekode" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Mobile data" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "Mobilnetværkskode" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "Mobil service" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Mobilitetsdomæne" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Mode" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Model" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Modem bearer teardown er i gang." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "Modem Info" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5075,43 +5719,36 @@ msgstr "" "Modemforbindelse er i gang. Vent venligst. Denne proces vil timeout efter 2 " "minutter." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Modem standard" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Modem-enhed" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Modemafbrydelse i gang. Vent venligst." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Forespørgsel om modemoplysninger mislykkedes" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Modem init timeout" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "Modem er deaktiveret." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "ModemManager" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "OvervÃ¥gning" @@ -5181,6 +5818,10 @@ msgstr "Flyt ned" msgid "Move up" msgstr "Flyt op" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Multi Til Unicast" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5188,19 +5829,23 @@ msgstr "Flyt op" msgid "Multicast" msgstr "Multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Multicast-tilstand" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Multicast-routing" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "Multicast til unicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS-ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "NAT handlingskæde \"%h\"" @@ -5212,12 +5857,16 @@ msgstr "NAT-T-tilstand" msgid "NAT64 Prefix" msgstr "NAT64 Præfiks" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "NAT64 Præfiks" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "NDP-Proxy-slave" @@ -5230,18 +5879,23 @@ msgid "NTP server candidates" msgstr "Kandidater til NTP-server" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Navn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Navn pÃ¥ det nye netværk" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Navn pÃ¥ tunnelenheden" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigation" @@ -5250,13 +5904,17 @@ msgstr "Navigation" msgid "Nebula Network" msgstr "Nebula Netværk" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Naborapport" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "Naboens cache gyldighed" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5265,32 +5923,36 @@ msgstr "Naboens cache gyldighed" msgid "Network" msgstr "Netværk" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Netværkskodning" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "Netværkstilstand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "Netværksregistrering" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "Netværks-SSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Netværksværktøjer" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "Netværksadresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Netværks boot image" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "Migration af konfigurationen af netværksbroen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Netværksenhed" @@ -5303,7 +5965,7 @@ msgstr "Aktivitet pÃ¥ netværksenhed (kerne: netdev)" msgid "Network device is not present" msgstr "Netværksenhed er ikke til stede" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "Netværksenhedstabel \"%h\"" @@ -5312,7 +5974,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "Netværksheader bits %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Migration af netværks ifname-konfiguration" @@ -5321,15 +5983,20 @@ msgstr "Migration af netværks ifname-konfiguration" msgid "Network interface" msgstr "Netværks interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "Netværks-ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Aldrig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Aldrig" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5337,11 +6004,11 @@ msgstr "" "Videresend aldrig matchende domæner og underdomæner, men kun fra DHCP- eller " "hosts-filer." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Der kan ikke oprettes et nyt interface for \"%s\": %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Nyt navn pÃ¥ interface…" @@ -5349,13 +6016,13 @@ msgstr "Nyt navn pÃ¥ interface…" msgid "Next »" msgstr "Næste »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Nej" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Ingen DHCP-server er konfigureret for dette interface" @@ -5363,7 +6030,7 @@ msgstr "Ingen DHCP-server er konfigureret for dette interface" msgid "No Data" msgstr "Ingen data" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Ingen kryptering" @@ -5379,9 +6046,17 @@ msgstr "Ingen NAT-T" msgid "No RX signal" msgstr "Intet RX-signal" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Ingen WireGuard interfaces konfigureret." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "Ingen tilladt konfiguration fundet." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5394,7 +6069,11 @@ msgstr "" msgid "No client associated" msgstr "Ingen tilknyttet klient" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Ingen kontrolenhed angivet" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "Ingen data" @@ -5403,8 +6082,8 @@ msgstr "Ingen data" msgid "No data received" msgstr "Ingen data modtaget" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "Ingen hÃ¥ndhævelse" @@ -5417,15 +6096,11 @@ msgstr "Ingen hÃ¥ndhævelse" msgid "No entries available" msgstr "Ingen tilgængelige poster" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Ingen poster i denne mappe" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Ingen filer fundet" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5441,7 +6116,7 @@ msgstr "" msgid "No host route" msgstr "Ingen værtsrute" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5462,30 +6137,39 @@ msgstr "Der er ikke flere slaver til rÃ¥dighed" msgid "No more slaves available, can not save interface" msgstr "Der er ikke flere slaver til rÃ¥dighed, kan ikke gemme interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Ingen negativ cache" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "Der er ikke indlæst noget nftables-regelsæt." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Ingen adgangskode angivet!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Ingen peers tilsluttet" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "Der er endnu ikke defineret nogen peers." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "Ingen foretrukne konfiguration fundet." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Der er endnu ingen offentlige nøgler til stede." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "Ingen regler i denne kæde" @@ -5499,7 +6183,8 @@ msgid "No validation or filtering" msgstr "Ingen validering eller filtrering" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Ingen zone tildelt" @@ -5511,37 +6196,40 @@ msgstr "Ingen zone tildelt" msgid "Noise" msgstr "Støj" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Støjmargin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Støjmargin" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Støj:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Ikke-forebyggende CRC-fejl (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Ikke-wildcard" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Ingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Blev ikke fundet" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Ikke medlem" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Ikke tilknyttet" @@ -5554,7 +6242,7 @@ msgstr "Ikke tilsluttet" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Ikke til stede" @@ -5566,7 +6254,7 @@ msgstr "Ikke startet ved boot" msgid "Not supported" msgstr "Understøttes ikke" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5574,6 +6262,15 @@ msgstr "" "Bemærk: Nogle trÃ¥dløse drivere understøtter ikke fuldt ud 802.11w. F.eks. " "mwlwifi kan have problemer" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Bemærk: Du har muligvis ogsÃ¥ brug for en DHCP-proxy (ikke tilgængelig i " +"øjeblikket), nÃ¥r du angiver en ikke-standard relæ til port (addr#port)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Noter" @@ -5582,7 +6279,7 @@ msgstr "Noter" msgid "Notice" msgstr "Varsel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5590,7 +6287,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "Antal IGMP-medlemskabsrapporter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "Antal cachede DNS-poster, 10000 er maksimum, 0 er ingen caching." @@ -5607,7 +6304,7 @@ msgid "Obfuscated Password" msgstr "Sløret adgangskode" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5618,6 +6315,7 @@ msgid "Obtain IPv6 address" msgstr "FÃ¥ IPv6-adresse" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Off" @@ -5626,6 +6324,14 @@ msgstr "Off" msgid "Off-State Delay" msgstr "Off-State forsinkelse" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"Off: vlanXXX, f.eks., vlan1. On: " +"vlan_tagged_interface.XXX, f.eks. eth0.1." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "On" @@ -5634,15 +6340,15 @@ msgstr "On" msgid "On-State Delay" msgstr "On-State Forsinkelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "On-link" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Der skal angives et værtsnavn eller MAC-adresse!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "En af følgende: %s" @@ -5660,7 +6366,11 @@ msgstr "En eller flere ugyldige/pÃ¥krævede værdier pÃ¥ fanen" msgid "One or more required fields have no value!" msgstr "Et eller flere obligatoriske felter har ingen værdi!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "Kun acceptere svar via" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" "Tillader kun kommunikation med ikke-isolerede broporte, nÃ¥r den er aktiveret" @@ -5672,25 +6382,24 @@ msgstr "" "Kun hvis den aktuelle aktive slave fejler, og den primære slave er oppe " "(fejl, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "Åbn oversigt over iptables-regler…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Åbn listen..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDPproxying." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5708,7 +6417,7 @@ msgstr "" "Opererer i relætilstand, hvis en udpeget master interface er " "konfigureret og aktiv, ellers falder tilbage til servertilstand." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." @@ -5716,12 +6425,24 @@ msgstr "" "Opererer i relay-tilstand, hvis der er et opstrøms IPv6-præfiks til " "stede, ellers deaktiveres tjenesten." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Driftsfrekvens" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "Operatør" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "Operatør kode" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "Operatør navn" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "Indstillingen \"%s\" indeholder en ugyldig inputværdi." @@ -5729,22 +6450,33 @@ msgstr "Indstillingen \"%s\" indeholder en ugyldig inputværdi." msgid "Option \"%s\" must not be empty." msgstr "Indstillingen \"%s\" mÃ¥ ikke være tom." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Indstillingen er ændret" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Indstillingen er fjernet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Valgfrit" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "Valgfri værtsnavn til at tildele" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Valgfri, noter i frit format om denne enhed" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" +"Valgfrit, i sekunder. Hvis indstillet til \"0\", forsøges der ikke at " +"genoprette forbindelsen." + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5753,7 +6485,7 @@ msgstr "" "Valgfrit. 32-bit mærke for udgÃ¥ende krypterede pakker. Indtast værdien i " "hexadecimal, begyndende med 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5765,7 +6497,7 @@ msgstr "" "delegerende server, skal suffikset (f.eks. \"::1\") bruges til at danne IPv6-" "adressen (\"a:b:c:d::1\") for interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5773,11 +6505,11 @@ msgstr "" "Valgfrit. Base64-kodet preshared nøgle. Tilføjer et ekstra lag af symmetrisk " "nøgle-kryptografi til post-kvantum-modstandsdygtighed." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Valgfrit. Opret ruter til tilladte IP'er for denne peer." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Valgfrit. Beskrivelse af peer." @@ -5785,13 +6517,13 @@ msgstr "Valgfrit. Beskrivelse af peer." msgid "Optional. Do not create host routes to peers." msgstr "Valgfrit. Der mÃ¥ ikke oprettes værtsruter til peers." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "Valgfrit. Vært for peer. Navne opløses, før interface oprettes." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5809,11 +6541,11 @@ msgstr "Valgfri. Maksimal transmissionsenhed for XFRM interface." msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Valgfrit. Maksimal transmissionsenhed for tunnel interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Valgfri. Peer-port." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5825,7 +6557,7 @@ msgstr "" "konfiguration eller QR-kode, hvis den er tilgængelig. Den kan fjernes, efter " "at konfigurationen er blevet eksporteret." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5841,7 +6573,7 @@ msgstr "Valgfrit. UDP-port, der bruges til udgÃ¥ende og indgÃ¥ende pakker." msgid "Options" msgstr "Indstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" for standardrute. 0.0.0.0.0.0 betyder \"adressen pÃ¥ det " "system, der kører dnsmasq\"." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "Indstillinger:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Ordinal: den laveste kommer først." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Ophavsmandsinterval" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "Andet:" @@ -5876,7 +6617,7 @@ msgstr "UdgÃ¥ende:" msgid "Outgoing checksum" msgstr "UdgÃ¥ende kontrolsum" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "UdgÃ¥ende interface" @@ -5884,6 +6625,7 @@ msgstr "UdgÃ¥ende interface" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "UdgÃ¥ende nøgle" @@ -5907,21 +6649,23 @@ msgstr "Udgangszone" msgid "Overlap" msgstr "Overlap" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "Ttilsidesætter IPv4-routingtabel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "Tilsidesætter IPv6-routingtabel" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5929,6 +6673,7 @@ msgstr "Tilsidesætter IPv6-routingtabel" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "Tilsidesæt MTU" @@ -5950,7 +6695,7 @@ msgstr "Tilsidesættelse af TOS" msgid "Override TTL" msgstr "Tilsidesæt TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -5966,7 +6711,7 @@ msgstr "Tilsidesæt standard interface navn" msgid "Override the gateway in DHCP responses" msgstr "Tilsidesæt gatewayen i DHCP-svar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -5982,7 +6727,7 @@ msgstr "Tilsidesætte den tabel, der anvendes til interne ruter" msgid "Overview" msgstr "Oversigt" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "Overskrive eksisterende fil \"%s\" ?" @@ -5991,17 +6736,30 @@ msgid "Overwrite the current settings with the imported configuration?" msgstr "" "Overskrive de aktuelle indstillinger med den importerede konfiguration?" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "Egne numre" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Ejer" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (begge)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -6013,8 +6771,9 @@ msgid "PAP/CHAP password" msgstr "PAP/CHAP adgangskode" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -6025,6 +6784,7 @@ msgstr "PAP/CHAP adgangskode" msgid "PAP/CHAP username" msgstr "PAP/CHAP brugernavn" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "PDP Type" @@ -6034,8 +6794,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "PIN" @@ -6045,7 +6806,7 @@ msgstr "PIN" msgid "PIN code rejected" msgstr "Pinkode afvist" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "PMK R1 Tryk" @@ -6086,28 +6847,37 @@ msgstr "PSID-offset" msgid "PSID-bits length" msgstr "PSID-bits længde" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM (pakkeoverførselstilstand)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "PXE/TFTP-indstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "Pakkeservicetilstand" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "Styring af pakker" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "Pakkemærke" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Pakkemodtagelsestid" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "Pakker" @@ -6116,23 +6886,30 @@ msgstr "Pakker" msgid "Packets To Transmit Before Moving To Next Slave" msgstr "Pakker, der skal sendes, før der flyttes til næste slave" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "En del af netværket:" +msgstr[1] "Del af netværk:" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Del af zone %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "Pass-through (spejler fysisk enhed til et enkelt MAC VLAN)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Adgangskode" @@ -6140,11 +6917,11 @@ msgstr "Adgangskode" msgid "Password authentication" msgstr "Godkendelse af adgangskode" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Adgangskode til den private nøgle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "Adgangskode til den indre private nøgle" @@ -6155,19 +6932,19 @@ msgstr "Adgangskode til den indre private nøgle" msgid "Password strength" msgstr "Adgangskodestyrke" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "Adgangskode2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "Indsæt eller træk SSH-nøglefilen…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "Indsæt eller træk WireGuard peer-konfiguration (wg0.conf) fil…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " @@ -6178,31 +6955,31 @@ msgstr "" "der gør det muligt for det pÃ¥gældende system at oprette forbindelse til det " "lokale WireGuard-interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "Indsæt eller træk den medfølgende WireGuard-konfigurationsfil…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Sti til CA-certifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Sti til klient-certifikatet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Sti til privat nøgle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Sti til det indre CA-certifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Sti til det indre klient-certifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Sti til den indre private nøgle" @@ -6224,11 +7001,19 @@ msgstr "Pause" msgid "Peak:" msgstr "Spids:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Peer" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Peer Detaljer" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Peer IP-adresse, der skal tildeles" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "Peer MAC-adresse" @@ -6237,11 +7022,11 @@ msgstr "Peer MAC-adresse" msgid "Peer address is missing" msgstr "Peer-adresse mangler" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Peer-enhedens navn" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Peer deaktiveret" @@ -6272,10 +7057,14 @@ msgstr "Udfør nulstilling" msgid "Permission denied" msgstr "Adgang nægtet" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Vedvarende Hold i live" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Vedvarende genforbindelsesinterval" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "Indstillingen PersistentKeepAlive er ugyldig" @@ -6284,13 +7073,13 @@ msgstr "Indstillingen PersistentKeepAlive er ugyldig" msgid "Phy Rate:" msgstr "Phy Rate:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Fysiske indstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6303,11 +7092,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pkts." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Indtast venligst dit brugernavn og din adgangskode." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Vælg venligst den fil, der skal uploades." @@ -6315,56 +7104,74 @@ msgstr "Vælg venligst den fil, der skal uploades." msgid "Policy" msgstr "Politik" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "Politik: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "Port er ikke en del af et netværk" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Port isolation" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "Port status" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Port status:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Potentiel negation af: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Strømstyringstilstand" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "ForudgÃ¥ende CRC-fejl (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "Strømtilstand" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Foretrækker LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Foretrækker UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "Forebyggende levetid for et præfiks." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "Programmering af netværksteknologi" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Præfiks Delegeret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "Præfiksundertrykker" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Preshared nøgle" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "Preshared nøgle i brug" @@ -6389,15 +7196,18 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Forhindrer klient-til-klient kommunikation" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"Forhindrer, at en trÃ¥dløs klient kan tale med en anden. Denne indstilling " +"pÃ¥virker kun pakker uden VLAN-tag (ikke-mærkede pakker)." + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Primær slave" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "Primært VLAN ID" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6410,29 +7220,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "Primær bliver aktiv slave, nÃ¥r den kommer op igen (altid, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Prioritet" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "Privat" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "Privat (forhindrer kommunikation mellem MAC VLANs)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Privat nøgle" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "Privat nøgle til stede" @@ -6450,8 +7262,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6463,7 +7275,7 @@ msgstr "Protokol" msgid "Provide NTP server" msgstr "Angiv NTP-server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6471,7 +7283,7 @@ msgstr "" "Angiv en DHCPv6-server pÃ¥ dette interface og svar pÃ¥ DHCPv6 opfordringer og " "anmodninger." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Forsyn nyt netværk" @@ -6483,25 +7295,36 @@ msgstr "" "Giv NTP-serveren til den valgte interface eller, hvis den ikke er " "specificeret, til alle interfaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Proxy Server" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Offentlig nøgle" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "Offentlig nøgle mangler" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "Offentlig nøgle: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6533,59 +7356,83 @@ msgstr "QMI-Cellulær" msgid "Quality" msgstr "Kvalitet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "Forespørg alle tilgængelige upstream-resolvere." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Forespørgselsinterval" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Svarinterval for forespørgsel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "R0 Nøglens levetid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "R1 nøgleholder" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "RADIUS Accounting Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Radius-Accounting-Hemmelighed" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "RADIUS Accounting Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Radius-godkendelse-port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Radius-godkendelse-Hemmelighed" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Radius-godkendelse-server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "RADIUS dynamisk VLAN tildeling" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "RADIUS pr. STA VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "Navneordning for RADIUS VLAN broen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "RADIUS VLAN navngivning" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "RADIUS VLAN Tagged Interface" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "RFC3947 NAT-T-tilstand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "RSN forhÃ¥ndsgodkendelse" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "RSSI-tærskel for tilmelding" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "RTS/CTS-tærskel" @@ -6598,10 +7445,18 @@ msgstr "RX" msgid "RX Rate" msgstr "RX-hastighed" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "RX-hastighed / TX-hastighed" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"RadioressourcemÃ¥ling - Sender beacons for at hjælpe med roaming. Ikke alle " +"klienter understøtter dette." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6613,11 +7468,11 @@ msgstr "" "RÃ¥ hex-kodede bytes. Lad den være tom, medmindre din internetudbyder kræver " "dette" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Læs /etc/ethers for at konfigurere DHCP-serveren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Skifter du virkelig protokol?" @@ -6625,11 +7480,11 @@ msgstr "Skifter du virkelig protokol?" msgid "Realtime Graphs" msgstr "Grafer i realtid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Frist for genforening" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Beskyttelse mod genindbinding" @@ -6653,11 +7508,39 @@ msgstr "Genstarter operativsystemet pÃ¥ din enhed" msgid "Receive" msgstr "Modtag" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "Modtag tabt" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "Modtag fejl" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Modtaget data" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "Modtagne bytes" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "Modtaget multicast" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "Modtagede pakker" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Anbefalet. IP-adresser for WireGuard-interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Gentilslut timeout" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Genforbind dette interface" @@ -6665,12 +7548,12 @@ msgstr "Genforbind dette interface" msgid "Redirect to HTTPS" msgstr "Omdiriger til HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "Omdiriger til lokal port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "Omdiriger til lokalt system" @@ -6679,31 +7562,39 @@ msgstr "Omdiriger til lokalt system" msgid "References" msgstr "Referencer" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Opdater kanaler" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Genopfriske" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "Registreringsstaten" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "Afvis IPv4-pakke med ICMP type %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "Afvis pakke med ICMP type %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "Afvis pakke med ICMPv6 type %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "Afvis pakke med TCP reset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" @@ -6712,6 +7603,8 @@ msgstr "" "lig med den angivne værdi" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Relæ" @@ -6721,6 +7614,11 @@ msgstr "Relæ" msgid "Relay Bridge" msgstr "Relæbroen" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"Relay DHCP anmoder andre steder. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Relæ mellem netværk" @@ -6730,6 +7628,14 @@ msgstr "Relæ mellem netværk" msgid "Relay bridge" msgstr "Relæbro" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "Relay fra" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "Relæ Til adresse" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6739,6 +7645,7 @@ msgstr "Fjern IPv4-adresse" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Fjern IPv4-adresse eller FQDN" @@ -6751,15 +7658,23 @@ msgstr "Fjern IPv6-adresse" msgid "Remote IPv6 address or FQDN" msgstr "Fjern-IPv6-adresse eller FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Fjern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "Fjern IPv4 adresser fra resultaterne og returner kun IPv6 adresser." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "Fjern IPv6 adresser fra resultaterne og returner kun IPv4 adresser." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "Fjern relaterede enhedsindstillinger fra konfigurationen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Erstat trÃ¥dløs konfiguration" @@ -6789,7 +7704,8 @@ msgstr "Kræv indgÃ¥ende kontrolsum (valgfrit)." msgid "Require incoming packets serialization (optional)." msgstr "Kræv serialisering af indgÃ¥ende pakker (valgfrit)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "PÃ¥krævet" @@ -6805,7 +7721,7 @@ msgstr "PÃ¥krævet. Base64-kodet privat nøgle for dette interface." msgid "Required. Path to the .yml config file for this interface." msgstr "PÃ¥krævet. Sti til .yml-konfigurationsfilen for dette interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "PÃ¥krævet. Offentlig nøgle til WireGuard-peeren." @@ -6817,67 +7733,75 @@ msgstr "PÃ¥krævet. Underliggende interface." msgid "Required. XFRM interface ID to be used for SA." msgstr "PÃ¥krævet. XFRM interface ID, der skal bruges til SA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" +"PÃ¥krævet: Afviser godkendelse, hvis RADIUS-serveren ikke leverer passende " +"VLAN attributter." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Kræver hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Kræver hostapd med understøttelse af EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Kræver hostapd med EAP-understøttelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Kræver hostapd med OWE-understøttelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Kræver hostapd med SAE-understøttelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Kræver hostapd med WEP-understøttelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Kræver wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Kræver wpa-supplicant med EAP Suite-B-understøttelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Kræver wpa-supplicant med EAP-understøttelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Kræver wpa-supplicant med OWE-understøttelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Kræver wpa-supplicant med SAE-understøttelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Kræver wpa-supplicant med WEP-understøttelse" @@ -6886,7 +7810,7 @@ msgid "Reselection policy for primary slave" msgstr "Politik for genvalg af primærslave" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6901,20 +7825,24 @@ msgstr "Nulstil tællere" msgid "Reset to defaults" msgstr "Nulstil til standardindstillingerne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Resolv- og værtsfiler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Resolv-fil" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Liste over domæner, der skal tvinges til en IP-adresse." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Ressourcen blev ikke fundet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Genstart" @@ -6923,7 +7851,7 @@ msgstr "Genstart" msgid "Restart Firewall" msgstr "Genstart Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Genstart radio interface" @@ -6935,7 +7863,7 @@ msgstr "Gendan" msgid "Restore backup" msgstr "Gendan backup" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -6943,80 +7871,95 @@ msgstr "" "Returnerer svar pÃ¥ DNS-forespørgsler, der matcher det subnet, hvorfra " "forespørgslen blev modtaget, hvis der er flere IP'er tilgængelige." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Vis/skjul adgangskode" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "Filter med omvendt sti" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Gendan" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Gendan ændringer" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "Anmodningen om gendannelse mislykkedes med statussen %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Gendanner konfiguration…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "Revision" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "Omskriv destination til %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "Omskriv destination til %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "Omskriv destination til %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "Omskriv destination til %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "Omskriv kilden til %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "Omskriv kilden til %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "Omskriv kilden til %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "Omskriv kilden til %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "Omskriv til egress enhedsadresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" +"Robust sikkerhedsnetværk (RSN): Tillad forudgÃ¥ende godkendelse af roaming " +"til WPA2-EAP-netværk (og annoncer det i WLAN-beacons). Fungerer kun, hvis " +"det angivne netværks interface er en bro. Forkorter den tidskritiske " +"tilknytningsproces." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Robusthed" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -7034,19 +7977,19 @@ msgstr "Rodforberedelse" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Round-Robin politik (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Rute tilladte IP'er" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "Rutehandlingskæde \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Rute type" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7066,6 +8009,10 @@ msgstr "Router adgangskode" msgid "Routing" msgstr "Routing" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Routing-algoritme" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7080,24 +8027,24 @@ msgstr "" msgid "Rule" msgstr "Regel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "Regel handlinger" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "Regelkommentar: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "Regel containerkæde \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "Regel matcher" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Regeltype" @@ -7117,11 +8064,24 @@ msgstr "Fejl ved kørsel" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "SIMs" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7139,15 +8099,15 @@ msgstr "SSH serverport" msgid "SSH username" msgstr "SSH brugernavn" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH-nøgler" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7164,7 +8124,7 @@ msgstr "SSTP-server" msgid "SWAP" msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7175,7 +8135,7 @@ msgid "Save" msgstr "Gem" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Gem og anvend" @@ -7192,7 +8152,7 @@ msgstr "Gem mtdblock" msgid "Save mtdblock contents" msgstr "Gem mtdblock-indhold" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Scan" @@ -7201,11 +8161,16 @@ msgstr "Scan" msgid "Scheduled Tasks" msgstr "Planlagte opgaver" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "Sektion %s er tom." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Afsnit tilføjet" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Afsnit fjernet" @@ -7223,9 +8188,9 @@ msgstr "" "mislykkes. Brug kun, hvis du er sikker pÃ¥, at firmwaren er korrekt og " "beregnet til din enhed!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Vælg fil…" @@ -7235,7 +8200,7 @@ msgstr "" "Vælger den hash-politik for transmission, der skal anvendes til udvælgelse " "af slave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7243,7 +8208,7 @@ msgstr "" "Send RA-" "meddelelser, der reklamerer for denne enhed som IPv6-router." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "Send ICMP-omdirigeringer" @@ -7264,11 +8229,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "Send værtsnavnet for denne enhed" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Server" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Serveradresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Servernavn" @@ -7293,17 +8262,21 @@ msgstr "Sessionen er udløbet" msgid "Set Static" msgstr "Angiv statisk" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "Angiv et alias for et værtsnavn." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "Sæt header-feltet %s til %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" "Indstil interface som ekstern NDP-Proxy-slave. Standardværdien er slÃ¥et fra." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7315,7 +8288,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "Angiv samme MAC-adresse til alle slaver" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7326,7 +8299,7 @@ msgstr "" "meddelelser. NÃ¥r den er aktiveret, udfører klienter automatisk konfiguration " "af iPv6-adresser uden tilstand." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7342,11 +8315,15 @@ msgstr "Angiv til den aktuelt aktive slave (aktiv, 1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "Angiv til den første slave, der tilføjes til forbindelsen (følg, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Konfigurer DHCP-server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Opsætning af ruter til proxied IPv6-naboer." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7354,33 +8331,39 @@ msgid "Setting PLMN failed" msgstr "Indstilling af PLMN mislykkedes" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "Indstilling af driftstilstand mislykkedes" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "Indstilling af den tilladte netværksteknologi." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "Indstilling af den foretrukne netværksteknologi." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Indstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "Opsætning af ruter til proxied IPv6-naboer." - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "Alvorligt fejlbehæftede sekunder (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" +msgstr "" +"Indstillinger til at hjælpe trÃ¥dløse klienter med at roame mellem flere " +"AP'er: 802.11r, 802.11k og 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "Short GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Kort præambel" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Vis den aktuelle backup-fil liste" @@ -7393,16 +8376,16 @@ msgstr "Vis tomme kæder" msgid "Show raw counters" msgstr "Vis rÃ¥ tællere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Lukning af dette interface" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7410,15 +8393,15 @@ msgstr "Lukning af dette interface" msgid "Signal" msgstr "Signal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Signal / støj" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Signaldæmpning (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Signalkvalitet" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Signalopdateringshastighed" @@ -7426,12 +8409,12 @@ msgstr "Signalopdateringshastighed" msgid "Signal:" msgstr "Signal:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Størrelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Størrelsen af DNS forespørgselscachen" @@ -7448,12 +8431,12 @@ msgstr "Spring over" msgid "Skip from backup files that are equal to those in /rom" msgstr "Spring over fra backup filer, der er lig med dem i /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "GÃ¥ til indhold" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "GÃ¥ til navigation" @@ -7471,14 +8454,10 @@ msgstr "Software-VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "Nogle felter er ugyldige, kan ikke gemme værdier!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Beklager, det objekt, du anmodede om, blev ikke fundet." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Beklager, serveren stødte pÃ¥ en uventet fejl." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7489,8 +8468,8 @@ msgstr "" "flashes manuelt. Se venligst wiki'en for enhedsspecifikke " "installationsinstruktioner." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7517,7 +8496,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "Kildeport" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7525,7 +8504,7 @@ msgstr "" "Særlige PXE " "opstartsindstillinger for Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7533,7 +8512,7 @@ msgstr "" "Angiver en fast liste over DNS-søgdomæner, der skal annonceres via DHCPv6. " "Hvis den ikke angives, annonceres den lokale enheds DNS-søgdomæne." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7544,7 +8523,7 @@ msgstr "" "DNS-server, medmindre indstillingen Lokal IPv6 DNS-server er " "deaktiveret." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7574,7 +8553,7 @@ msgstr "Angiver de IP-adresser, der skal bruges til ARP-overvÃ¥gning" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "Angiver MII-forbindelsesovervÃ¥gningsfrekvensen i millisekunder" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "Angiver den TOS-værdi, der skal matche i IP headers" @@ -7582,7 +8561,7 @@ msgstr "Angiver den TOS-værdi, der skal matche i IP headers" msgid "Specifies the aggregation selection logic to use" msgstr "Angiver den aggregeringsvalglogik, der skal bruges" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "Angiver det destinations subnet, der skal matche (CIDR-notation)" @@ -7590,7 +8569,7 @@ msgstr "Angiver det destinations subnet, der skal matche (CIDR-notation)" msgid "Specifies the directory the device is attached to" msgstr "Angiver den mappe, som enheden er knyttet til" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7600,7 +8579,7 @@ msgstr "" "meddelelser, f.eks. for at instruere klienterne om at anmode om yderligere " "oplysninger via stateful DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" @@ -7608,7 +8587,7 @@ msgstr "" "Specificerer fw-mærket og eventuelt dets maske for at matche, f.eks. 0xFF " "for at matche mærke 255 eller 0x0/0x1 for at matche enhver lige mærkeværdi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "Angiver navnet pÃ¥ det indgÃ¥ende logiske interface" @@ -7645,7 +8624,7 @@ msgstr "" "Specificerer det maksimale antal sekunder, hvorefter værter formodes at være " "døde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7668,7 +8647,7 @@ msgid "Specifies the mode to be used for this bonding interface" msgstr "" "Specificerer den tilstand, der skal anvendes for dette bonding interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7711,15 +8690,15 @@ msgstr "" "Specificerer antallet af sekunder mellem de Instanser, hvor bonding-driveren " "sender læringspakker til hver slaves peer-switch" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "Angiver rækkefølgen af IP-reglerne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "Angiver navnet pÃ¥ det udgÃ¥ende logiske interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7747,19 +8726,19 @@ msgstr "" "Specificerer genvalgspolitikken for den primære slave, nÃ¥r der opstÃ¥r fejl i " "den aktive slave eller gendannelse af den primære slave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "Angiver den rutemetrik, der skal bruges" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "Angiver den rutetype, der skal oprettes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "Angiver handlingen for reglens routing" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "Angiver det kilde subnet, der skal matche (CIDR-notation)" @@ -7783,7 +8762,7 @@ msgstr "" "Specificerer den tid i millisekunder, der skal gÃ¥, før en slave aktiveres " "efter en registrering af genoprettelse af en forbindelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7907,15 +8886,23 @@ msgstr "" "Angiv en anden MTU (Maximum Transmission Unit) end standardværdien (1280 " "bytes)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Angiv den hemmelige krypteringsnøgle her." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "Hastighed: %d Mibit/s, Duplex: %" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "Splitterfri ADSL (G.992.2) Bilag A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "Forældet nabo-cache-timeout" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Start" @@ -7928,16 +8915,16 @@ msgstr "Start WPS" msgid "Start priority" msgstr "Startprioritet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Start opdatering" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Starter anvend konfiguration…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Starter trÃ¥dløs scanning..." @@ -7946,6 +8933,10 @@ msgstr "Starter trÃ¥dløs scanning..." msgid "Startup" msgstr "Start op" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "State" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Statisk IPv4-ruter" @@ -7959,7 +8950,7 @@ msgstr "Statisk IPv6-ruter" msgid "Static Lease" msgstr "Statisk Lease" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Statiske Leases" @@ -7969,7 +8960,7 @@ msgstr "Statiske Leases" msgid "Static address" msgstr "Statisk adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7979,18 +8970,18 @@ msgstr "" "værtsnavne til DHCP-klienter. De er ogsÃ¥ nødvendige for ikke-dynamiske " "interface konfigurationer, hvor kun værter med en tilsvarende lease betjenes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Grænse for inaktivitet pÃ¥ stationen" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Stop" @@ -7999,8 +8990,8 @@ msgstr "Stop" msgid "Stop WPS" msgstr "Stop WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Stop opdatering" @@ -8008,11 +8999,11 @@ msgstr "Stop opdatering" msgid "Storage" msgstr "Lager" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "Streng filtrering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Streng orden" @@ -8021,15 +9012,15 @@ msgid "Strong" msgstr "Stærk" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Indsend" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Undertrykker logning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "Undertrykker logning af rutineoperationen for DHCP-protokollen." @@ -8062,7 +9053,7 @@ msgstr "Switch VLAN" msgid "Switch port" msgstr "Switch port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Skift protokol" @@ -8072,7 +9063,7 @@ msgstr "Skift protokol" msgid "Switch to CIDR list notation" msgstr "Skift til CIDR-liste notation" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Symbolsk link" @@ -8084,8 +9075,16 @@ msgstr "Synkroniser med NTP-server" msgid "Sync with browser" msgstr "Synkroniser med browser" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Syntaks: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Syntaks: _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -8109,9 +9108,9 @@ msgstr "Systemegenskaber" msgid "System log buffer size" msgstr "Størrelse af systemlogbuffer" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "Systemet kører i genoprettelsestilstand (initramfs)." @@ -8140,7 +9139,7 @@ msgstr "TCP-kildeport" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "TFTP-server rod" @@ -8153,26 +9152,37 @@ msgstr "TX" msgid "TX Rate" msgstr "TX-hastighed" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "TX-køens længde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tabel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "Tag" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Tagget" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "MÃ¥l" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "MÃ¥lplatform" @@ -8188,7 +9198,7 @@ msgstr "Midlertidig plads" msgid "Terminate" msgstr "Afslutte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8198,7 +9208,7 @@ msgstr "" "offentliggøres i RA-meddelelser. Minimum er 1280 bytes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." @@ -8206,7 +9216,7 @@ msgstr "" "Flaget Administreret adressekonfiguration (M) angiver, at IPv6-" "adresser er tilgængelige via DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -8214,7 +9224,7 @@ msgstr "" "Flaget Mobile IPv6 Home Agent (H) angiver, at enheden ogsÃ¥ fungerer " "som Mobile IPv6 Home Agent pÃ¥ dette link." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8234,7 +9244,11 @@ msgstr "" "Pakken qrencode er nødvendig for at generere et QR-kodebillede af " "konfigurationen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "DHCPv6-DUID (DHCP unik identifikator) for denne vært." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8250,18 +9264,26 @@ msgstr "" "Konfigurationen af HE.net-endpoint-opdateringen er ændret, du skal nu bruge " "det almindelige brugernavn i stedet for bruger-id'et!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "IP-adressen %h er allerede brugt af en anden statisk lease" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "IP-adressen er uden for et DHCP-adresseomrÃ¥de i en DHCP-pool" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "IP-adressen pÃ¥ opstartsserveren" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" +"Den IP-adresse, der skal bruges til denne vært, eller ignore for at " +"ignorere enhver DHCP-anmodning fra denne vært." + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "IPv4-adressen eller det fuldt kvalificerede domænenavn for fjernsiden." @@ -8269,6 +9291,7 @@ msgstr "IPv4-adressen eller det fuldt kvalificerede domænenavn for fjernsiden." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -8285,6 +9308,14 @@ msgid "" msgstr "" "IPv6-adressen eller det fuldt kvalificerede domænenavn for fjerntunnelenden." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" +"IPv6-interfaceidentifikatoren (adresse suffix) som hexadecimalnummer (max. 8 " +"chars)." + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8297,7 +9328,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "LED'en blinker med den indstillede tænd/sluk-frekvens" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "LED'en blinker for at simulere et faktisk hjerteslag." @@ -8315,7 +9346,7 @@ msgstr "LED'en er altid i standardtilstand slukket." msgid "The LED is always in default state on." msgstr "LED'en er altid i standardtilstand tændt." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" @@ -8323,15 +9354,19 @@ msgstr "" "MAC-adressen %h er allerede brugt af en anden statisk lease i samme DHCP-" "pulje" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "MTU'en mÃ¥ ikke overstige forældreenhedens MTU pÃ¥ %d bytes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "VLAN-id'et skal være unikt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "Algoritmen, der bruges til at opdage mesh-ruter" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8343,7 +9378,7 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "Konfigurationsfilen kunne ikke indlæses pÃ¥ grund af følgende fejl:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8351,7 +9386,7 @@ msgstr "" "Det korrekte SSID skal angives manuelt, nÃ¥r du tilmelder dig et skjult " "trÃ¥dløst netværk" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8378,12 +9413,12 @@ msgstr "" "Enhedsfilen for hukommelsen eller partitionen (f." "eks. /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "Enhedsnavnet \"%s\" er allerede optaget" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." @@ -8391,7 +9426,7 @@ msgstr "" "Den eksisterende netværkskonfiguration skal ændres, for at LuCI kan fungere " "korrekt." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8413,7 +9448,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Følgende regler er i øjeblikket aktive pÃ¥ dette system." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" "Frekvensen er direkte proportional med den gennemsnitlige CPU-belastning i 1 " @@ -8423,19 +9458,19 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "Gateway-adressen mÃ¥ ikke være en lokal IP-adresse" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" "Den genererede konfiguration kan importeres i et WireGuard-klientprogram for " "at oprette en forbindelse til denne enhed." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "Den angivne offentlige SSH-nøgle er allerede blevet tilføjet." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8443,15 +9478,35 @@ msgstr "" "Den givne offentlige SSH-nøgle er ugyldig. Angiv venligst korrekte " "offentlige RSA- eller ECDSA-nøgler." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "Hardwarens adresse(r) for denne post/host, adskilt af mellemrum." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"Indstillingen for hopstraf gør det muligt at ændre batman-adv's præference " +"for multihop-ruter i forhold til korte ruter. Værdien anvendes pÃ¥ TQ'en for " +"hver videresendt OGM, hvorved omkostningerne ved et ekstra hop (pakken skal " +"modtages og videresendes, hvilket koster sendetid)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "Værtsnavnet for opstartsserveren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "Interfacet kunne ikke findes" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Navnet pÃ¥ interface er allerede brugt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Navnet pÃ¥ interface er for langt" @@ -8474,6 +9529,7 @@ msgstr "Den lokale IPv4-adresse" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "Den lokale IPv4-adresse, som tunnelen oprettes over (valgfrit)." @@ -8488,7 +9544,7 @@ msgstr "Den lokale IPv4-netmaske" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "Den lokale IPv6-adresse, som tunnelen oprettes over (valgfrit)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8503,7 +9559,7 @@ msgstr "" "reduceret værdi resulterer i kortere tid til at opdage tabet af det sidste " "medlem af en gruppe" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8515,7 +9571,7 @@ msgstr "" "IGMP-meddelelsernes hyppighed i subnet; større værdier gør trafikken mindre " "hyppig, da værtssvarene spredes ud over et større interval" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8523,7 +9579,7 @@ msgstr "" "De maksimale hop, der skal offentliggøres i RA-meddelelser. Maksimum er 255 hop." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." @@ -8531,7 +9587,7 @@ msgstr "" "Netværksadgangen til denne enhed kan afbrydes ved at ændre indstillingerne " "for \"%h\" interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Netværksnavnet er allerede brugt" @@ -8552,7 +9608,7 @@ msgstr "" "forbindelse til det næste større netværk, f.eks. internettet, og andre porte " "til et lokalt netværk." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " @@ -8562,7 +9618,7 @@ msgstr "" "som peer skal oprette forbindelse til. Dette er normalt en statisk offentlig " "IP-adresse, et statisk værtsnavn eller et DDNS-domæne." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" "Svarintervallet for forespørgsel skal være lavere end værdien for " @@ -8577,7 +9633,7 @@ msgstr "Kommandoen til genstart mislykkedes med kode %d" msgid "The restore command failed with code %d" msgstr "Kommandoen til gendannelse mislykkedes med kode %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8587,15 +9643,15 @@ msgstr "" "pakketab pÃ¥ netværket. Hvis et netværk forventes at være tabsgivende, kan " "robusthedsværdien øges. IGMP er robust over for (Robusthed-1) pakketab" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" "RegelmÃ¥let er et spring til en anden regel, der er angivet ved dens " "prioritetsværdi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8605,11 +9661,11 @@ msgstr "" "til 65535 eller symbolalias, der er erklæret i /etc/iproute2/rt_tables. " "Særlige aliaser lokal (255), main (254) og standard (253) er ogsÃ¥ gyldige" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "Den valgte %s-modus er ikke kompatibel med %s-kryptering" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "Den indsendte sikkerhedstoken er ugyldigt eller allerede udløbet!" @@ -8649,6 +9705,18 @@ msgstr "Systemadgangskoden er blevet ændret med succes." msgid "The sysupgrade command failed with code %d" msgstr "Kommandoen sysupgrade mislykkedes med kode %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" +"Mærket konstruere filtre, som værtsdirektiver anvendes; mere end et tag kan " +"leveres, i dette tilfælde anmodningen skal matche alle af dem. Mærkede " +"direktiver anvendes til at foregribe dem. Bemærk, at en af mac, duid eller " +"værtsnavn stadig skal specificeres (kan være et wildcard)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8676,12 +9744,20 @@ msgstr "" "Den uploadede image fil indeholder ikke et understøttet format. Sørg for, at " "du vælger det generiske image format til din platform." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "Værdien tilsidesættes af konfigurationen. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "Værdien tilsidesættes af konfigurationen." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" +"Værdien angiver intervallet (millisekunder), hvormed batman-adv oversvømmer " +"netværket med sine protokoloplysninger." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8690,19 +9766,20 @@ msgstr "" "iptables- og nftables-regler, hvilket kan føre til ufuldstændig " "trafikfiltrering." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Der er ingen aktive leases" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Der er ingen ændringer at anvende" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8715,16 +9792,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "Denne IPv4-adresse pÃ¥ relayet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Denne godkendelsestype er ikke relevant for den valgte EAP-metode." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Dette ligner ikke en gyldig PEM-fil" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8742,6 +9819,23 @@ msgstr "" "Dette er enten \"Opdateringsnøgle\" konfigureret til tunnelen eller " "kontoadgangskoden, hvis der ikke er konfigureret nogen opdateringsnøgle" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Dette er batman-adv-enheden, som du vil linke den fysiske enhed fra oven " +"til. Hvis denne liste er tom, skal du først oprette en. Hvis du ønsker at " +"videresende mesh-trafik over en enhed pÃ¥ et kablet netværk, skal du vælge " +"den fra ovenstÃ¥ende Enhedsvælger. Hvis du vil tildele batman-adv-interfacet " +"til et Wi-fi mesh, skal du ikke vælge en enhed i Enhedsvælgeren, men gÃ¥ til " +"TrÃ¥dløse indstillinger og vælg dette interface som et netværk derfra." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8758,7 +9852,7 @@ msgstr "" "Dette er den lokale endepunktsadresse, der er tildelt af tunnelmægleren, og " "den ender normalt med ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "Dette er den eneste DHCP-server i det lokale netværk." @@ -8791,8 +9885,8 @@ msgstr "" "Denne liste giver et overblik over systemprocesser, der kører i øjeblikket, " "og deres status." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8809,31 +9903,39 @@ msgstr "Denne sektion indeholder endnu ingen værdier" msgid "Time Synchronization" msgstr "Tidssynkronisering" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Tids advertisement" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "Tid i millisekunder" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "Tid i sekunder til at bruge i lytte- og læretilstande" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Tidsinterval for genindtastning af GTK" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Tidszone" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "Timed-out" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "Timeout i sekunder" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "Timeout i sekunder for lærte MAC-adresser i videresendelsesdatabasen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "Timeout i sekunder indtil topologiopdateringer ved tab af forbindelse" @@ -8841,7 +9943,7 @@ msgstr "Timeout i sekunder indtil topologiopdateringer ved tab af forbindelse" msgid "Timezone" msgstr "Tidszone" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the konfigurationsimporteni stedet." -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "For at logge ind…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8866,7 +9964,7 @@ msgstr "" "backuparkiv her. For at nulstille firmwaren til dens oprindelige tilstand " "skal du klikke pÃ¥ \"Udfør nulstilling\" (kun muligt med squashfs-billeder)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Tone" @@ -8874,12 +9972,16 @@ msgstr "Tone" msgid "Total Available" msgstr "Tilgængeligt i alt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "SporingsomrÃ¥de kode" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8891,11 +9993,11 @@ msgstr "Trafik" msgid "Traffic Class" msgstr "Trafikklasse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "Trafikfilterkæde \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "Trafik matchet af regel: %.1000mPackets, %.1024mBytes" @@ -8912,6 +10014,26 @@ msgstr "Overførsel" msgid "Transmit Hash Policy" msgstr "Politik for overførsel af hash" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "Transmission droppet" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "Overførselsfejl" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Overførte data" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "Overførte bytes" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "Overførte pakker" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8950,7 +10072,7 @@ msgstr "Tunnel Interface" msgid "Tunnel Link" msgstr "Tunnelforbindelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Tunnel enhed" @@ -8959,13 +10081,13 @@ msgid "Tx-Power" msgstr "Tx-Power" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Type" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Tjenestetype" @@ -9014,7 +10136,7 @@ msgstr "Kan ikke bestemme ekstern IP-adresse" msgid "Unable to determine upstream interface" msgstr "Kan ikke bestemme upstream interface" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Kan ikke sendes" @@ -9065,19 +10187,31 @@ msgstr "Det er ikke muligt at genstarte firewall: %s" msgid "Unable to save contents: %s" msgstr "Kan ikke gemme indholdet: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Ikke-tilgængelige sekunder (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "Kan ikke indstille tilladt tilstandsliste." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "Kan ikke indstille foretrukne tilstand." + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "PIN-koden kunne ikke bekræftes" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Afkonfigurer" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Uventet svardataformat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -9095,7 +10229,7 @@ msgstr "" msgid "Unknown" msgstr "Ukendt" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Ukendt og ikke understøttet forbindelsesmetode." @@ -9119,11 +10253,11 @@ msgstr "Uadministreret" msgid "Unmount" msgstr "Unmount" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "unavngiven nøgle" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Ikke gemte ændringer" @@ -9137,15 +10271,25 @@ msgid "Unsupported MAP type" msgstr "Ikke understøttet MAP-type" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Ikke understøttet modem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Ikke understøttet protokol" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Ikke-understøttet protokoltype." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Utagget" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "Unavngivet peer" @@ -9157,7 +10301,7 @@ msgstr "Op" msgid "Up Delay" msgstr "Forsinkelse op" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Upload" @@ -9174,25 +10318,29 @@ msgstr "" msgid "Upload archive..." msgstr "Upload arkiv..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Upload fil" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Upload fil…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "Upload er blevet annulleret" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Upload-forespørgsel mislykkedes: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Uploader fil…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9202,7 +10350,7 @@ msgstr "" "tildelt et navn i formen wifinet#, og netværket genstartes for at " "anvende den opdaterede konfiguration." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -9210,7 +10358,7 @@ msgstr "" "NÃ¥r du trykker pÃ¥ \"Fortsæt\", opdateres brokonfigurationen, og netværket " "genstartes for at anvende den opdaterede konfiguration." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -9218,19 +10366,23 @@ msgstr "" "NÃ¥r du trykker pÃ¥ \"Fortsæt\", omdøbes ifname-indstillingerne, og netværket " "genstartes for at anvende den opdaterede konfiguration." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "Upstream-resolvere vil blive forespurgt i rækkefølgen af resolv-filen." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Oppetid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Brug /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Brug DHCP" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Brug DHCP-annoncerede servere" @@ -9239,13 +10391,18 @@ msgstr "Brug DHCP-annoncerede servere" msgid "Use DHCP gateway" msgstr "Brug DHCP-gateway" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Brug DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Brug DNS-servere, der annonceres af peer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Brug ISO/IEC 3166 alpha2-landekoder." @@ -9293,22 +10450,25 @@ msgstr "Brug som rodfilsystem (/)" msgid "Use broadcast flag" msgstr "Brug broadcast-flag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Brug indbygget IPv6-administration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Brug brugerdefinerede DNS-servere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Brug standardgateway" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Brug gateway-metrik" @@ -9334,15 +10494,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "Brug samme kilde og destination for hver forbindelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Brug systemcertifikater" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "Brug systemcertifikater til den indre tunnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9373,11 +10533,11 @@ msgstr "" msgid "Used" msgstr "Brugt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Brugt nøgleplads" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9385,59 +10545,61 @@ msgstr "" "Anvendes til to forskellige formÃ¥l: RADIUS NAS-ID og 802.11r R0KH-ID. Ikke " "nødvendigt med normal WPA(2)-PSK." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Brugergruppe" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Brugercertifikat (PEM kodet)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "Bruger-id" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Brugernøgle (PEM kodet)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Brugernavn" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "Brug flowtabel %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (Virtual Ethernet Port Aggregator)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "VLAN ID" @@ -9457,24 +10619,27 @@ msgstr "VPN Lokal adresse" msgid "VPN Local port" msgstr "VPN Lokal port" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "VPN Protokol" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPN Server" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "VPN-servercertifikatets SHA256-hash" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "VPN Server port" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "VPN Serverens certifikat SHA1 hash" @@ -9483,6 +10648,10 @@ msgstr "VPN Serverens certifikat SHA1 hash" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (og andre) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9496,7 +10665,7 @@ msgstr "VXLAN Netværksidentifikator" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9504,8 +10673,8 @@ msgstr "" "Validering af DNS svar og cache DNSSEC data, kræver, at DNSSEC understøttes " "af upstream." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9533,7 +10702,7 @@ msgstr "Leverandør" msgid "Vendor Class to send when requesting DHCP" msgstr "Leverandørklasse, der skal sendes ved anmodning om DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" "Verificere, at usignerede domænesvar virkelig kommer fra usignerede domæner." @@ -9542,12 +10711,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Verifikation af den uploadede image fil." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Meget høj" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Virtuel Ethernet" @@ -9555,34 +10724,46 @@ msgstr "Virtuel Ethernet" msgid "Virtual dynamic interface" msgstr "Virtuel dynamisk interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "WEP Åbent System" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "WEP Delt Nøgle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "WEP adgangssætning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "WLAN-roaming" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "WMM tilstand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "WNM dvaletilstand" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "WNM dvaletilstand rettelser" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "WPA adgangssætning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9611,7 +10792,19 @@ msgstr "Advarsel: Der er ikke gemte ændringer, som vil gå tabt ved genstart!" msgid "Weak" msgstr "Svag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Vægt" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" +"Når en vært matcher en post, er det specielle tag kendt " +"indstillet. Brug kendt til at matche alle kendte værter." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." @@ -9619,7 +10812,26 @@ msgstr "" "Når der delegeres præfikser til flere downstreams, tages interfaces med en " "højere præferenceværdi først i betragtning ved tildeling af subnets." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Når netværkskodning er aktiveret, øges WiFi-gennemstrømningen ved at " +"kombinere flere rammer til en enkelt ramme, hvilket reducerer den nødvendige " +"sendetid." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Når den distribuerede ARP-tabel er aktiveret, danner den en ARP-cache for " +"hele netværket, som hjælper klienter uden for netværket med at få ARP-svar " +"meget mere pålideligt og uden stor forsinkelse." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" @@ -9627,7 +10839,33 @@ msgstr "" "Når den er aktiveret, er gateway on-link, selvom gatewayen ikke matcher " "nogen interface præfiks" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Når det er aktiveret, tilføjes nye ARP-tabelposter fra modtagne gratuitous " +"APR-anmodninger eller svar, ellers kun eksisterende tabelposter opdateres, " +"men ingen nye værter er lært." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Når den er inverteret, lyser LED'en kontinuerligt og flimrer i stedet for at " +"den er slukket som standard og blinker ved systemaktivitet." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Når mesh kører over flere WiFi-interfaces pr. node, er batman-adv i stand " +"til at optimere trafikstrømmen for at opnå maksimal ydeevne." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9637,7 +10875,7 @@ msgstr "" "anvendes nedenstående R0/R1-nøgleindstillinger ikke. Deaktiver dette for at " "anvende R0- og R1-nøgleindstillingerne." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9645,7 +10883,7 @@ msgstr "" "Når QoS i Wi-Fi Multimedia-tilstand (WMM) er deaktiveret, kan klienterne " "være begrænset til 802.11a/802.11g-hastigheder." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9654,16 +10892,25 @@ msgstr "" "effektiviteten af sendetiden kan blive væsentligt reduceret." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Bredde" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "WireGuard-status" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "WireGuard peer er deaktiveret" @@ -9679,21 +10926,21 @@ msgid "Wireless Adapter" msgstr "Trådløs adapter" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Trådløst netværk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Trådløs oversigt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Trådløs sikkerhed" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Migration af trådløs konfiguration" @@ -9709,15 +10956,15 @@ msgstr "Trådløs er deaktiveret" msgid "Wireless is not associated" msgstr "Trådløs er ikke forbundet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Trådløst netværk er deaktiveret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Trådløst netværk er aktiveret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Skriv modtagne DNS-forespørgsler til syslog." @@ -9729,7 +10976,7 @@ msgstr "Skriv systemlog til fil" msgid "XOR policy (balance-xor, 2)" msgstr "XOR-politik (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9758,8 +11005,20 @@ msgstr "" "du deaktiverer vigtige init-scripts som \"network\", kan din enhed blive " "utilgængelig!
    " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Du kan tilføje flere akter for det samme mål." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Du kan tilføje flere akter for det samme domæne." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "Du kan tilføje flere unikke relæer til den samme lytteadresse." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9792,34 +11051,56 @@ msgstr "ZRam-indstillinger" msgid "ZRam Size" msgstr "ZRam Størrelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Bemærk: _http er " +"muligt, men ingen browsere understøtter SRV-poster.)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "enhver" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automatisk" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automatisk (deaktiveret)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automatisk (aktiveret)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "brokoblet" @@ -9876,25 +11157,30 @@ msgctxt "nft unit" msgid "day" msgstr "dag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "deaktiver" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "deaktiveret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "standard driver" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "standard driver (%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "f.eks.: --proxy 10.10.10.10.10" @@ -9903,14 +11189,23 @@ msgstr "f.eks.: --proxy 10.10.10.10.10" msgid "e.g: dump" msgstr "f.eks.: dump" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "aktiveret" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "hver %ds" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "udløbet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "tvunget" @@ -9920,22 +11215,22 @@ msgstr "tvunget" msgid "forward" msgstr "Videresend" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "fuld-duplex" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "halv-duplex" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "hexadecimal kodet værdi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "skjult" @@ -9944,9 +11239,9 @@ msgctxt "nft unit" msgid "hour" msgstr "time" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "hybridtilstand" @@ -9954,6 +11249,10 @@ msgstr "hybridtilstand" msgid "ignore" msgstr "ignorere" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "uendelig (lease udløber ikke)" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9968,11 +11267,19 @@ msgstr "nøgle mellem 8 og 63 tegn" msgid "key with either 5 or 13 characters" msgstr "nøgle med enten 5 eller 13 tegn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "kendt" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "kendt-othernet (på et andet subnet)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "administreret konfiguration (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "medium sikkerhed" @@ -9981,11 +11288,11 @@ msgctxt "nft unit" msgid "minute" msgstr "minut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minutter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "mobile hjem agent (H)" @@ -9997,18 +11304,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "nej" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "intet link" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "ingen tilsidesættelse" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "ikke-tom værdi" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "ingen" @@ -10019,20 +11334,20 @@ msgid "not present" msgstr "ikke til stede" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "off" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "på tilgængeligt præfiks" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "åbent netværk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "anden konfiguration (O)" @@ -10041,6 +11356,10 @@ msgstr "anden konfiguration (O)" msgid "output" msgstr "output" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "for over en dag siden" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -10058,23 +11377,34 @@ msgstr "positiv integer værdi" msgid "random" msgstr "tilfældig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "tilfældigt genereret" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" +"reducerer overhead ved at samle og aggregere afsendermeddelelser i en enkelt " +"pakke i stedet for mange små pakker" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "relætilstand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "routed" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "sek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "servertilstand" @@ -10082,7 +11412,7 @@ msgstr "servertilstand" msgid "sstpc Log-level" msgstr "sstpc Log-niveau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "stærk sikkerhed" @@ -10090,7 +11420,7 @@ msgstr "stærk sikkerhed" msgid "tagged" msgstr "tagged" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "tidsenheder (TUs / 1,024 ms) [1000-65535]" @@ -10104,25 +11434,27 @@ msgstr "" "eller HTTPS " "netværksadgang." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "unik værdi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "ukendt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "ukendt version" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "ubegrænset" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -10144,8 +11476,8 @@ msgid "untagged" msgstr "untagged" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "gyldig IP-adresse" @@ -10158,7 +11490,7 @@ msgid "valid IPv4 CIDR" msgstr "gyldig IPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "gyldig IPv4-adresse" @@ -10187,7 +11519,7 @@ msgid "valid IPv6 CIDR" msgstr "gyldig IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "gyldig IPv6-adresse" @@ -10224,8 +11556,8 @@ msgstr "gyldigt UCI-id, værtsnavn eller IP-adresseområde" msgid "valid address:port" msgstr "gyldig adresse:port" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "gyldig dato (YYYY-MM-DD)" @@ -10265,11 +11597,23 @@ msgstr "gyldig integer værdi" msgid "valid multicast MAC address" msgstr "gyldig multicast MAC-adresse" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"gyldigt netværksenhedsnavn mellem 1 og 15 tegn, der ikke indeholder \":\", " +"\"/\", \"%\" eller mellemrum" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "gyldigt netværksenhedsnavn, ikke \".\" eller \"...\"" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "gyldigt netværk i adresse/netmaske-notation" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "gyldigt telefonciffer (0-9, \"*\", \"#\", \"!\" eller \".\")" @@ -10279,43 +11623,43 @@ msgid "valid port or port range (port1-port2)" msgstr "gyldig port eller portområde (port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "gyldig portværdi" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "gyldig tid (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "værdi mellem %d og %d tegn" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "værdi mellem %f og %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "værdi større end eller lig med %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "værdi mindre end eller lig med %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "værdi med %d tegn" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "værdi med mindst %d tegn" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "værdi med højst %d tegn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "svag sikkerhed" diff --git a/package/luci/modules/luci-base/po/de/base.po b/package/luci/modules/luci-base/po/de/base.po index c7dd50cc6b..c26d910bc9 100644 --- a/package/luci/modules/luci-base/po/de/base.po +++ b/package/luci/modules/luci-base/po/de/base.po @@ -3,34 +3,50 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-26 17:57+0200\n" -"PO-Revision-Date: 2022-11-28 20:47+0000\n" -"Last-Translator: ssantos \n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" Tabelle \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d ungültige Felder" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d Stunden zuvor" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d Minuten zuvor" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d Sekunden zuvor" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s darf nicht ohne VLAN-Tag in mehreren VLAN-Gruppen vorkommen!" @@ -55,10 +71,11 @@ msgstr "(leer)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(keine Netzwerkadapter)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d weitere" @@ -68,19 +85,19 @@ msgid "-- Additional Field --" msgstr "-- Zusätzliches Feld --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Bitte auswählen --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- benutzerdefiniert --" @@ -106,7 +123,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = keinen Signal-Schwellwert benutzen, 1 = Treiber-Standard nicht ändern" @@ -120,12 +137,17 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Systemlast (1 Minute):" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "1 Flag" -msgstr[1] "" +msgstr[1] "%d Flags" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" @@ -141,12 +163,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "vierstellige hexadezimale ID" @@ -159,43 +186,104 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Systemlast (5 Minuten):" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "sechstellige hexadezimale ID (ohne Doppelpunkte)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: Beacon-Bericht über Funkmessungen aktivieren." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Nachbarmeldung über Funkmessungen aktivieren." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r: Schnelle Client-Übergabe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: Maximaler BSS Idle. Einheiten: Sekunden." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: Basic Service Set (BSS)-Übergangsverwaltung." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Ankündigung der lokalen Zeitzone in Verwaltungsrahmen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Proxy-ARP ermöglicht es Nicht-AP-StAs, länger im Energiesparmodus " +"zu bleiben." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Zeitankündigung in Verwaltungsframes." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Wireless Network Management (WNM) Schlafmodus (erweiterter " +"Schlafmodus für Stationen)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Wireless Network Management (WNM) Ruhemodus-Korrekturen: Verhindert " +"Angriffe durch Neuinstallation." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "Maximales Timeout für Quelladressprüfungen (SA Query)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "Wiederholungsintervall für Quelladressprüfungen (SA Query)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w: Schutz von Management-Frames aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w: Maximales Timeout" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w: Wiederholungsintervall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-Netzmaske" @@ -207,34 +295,50 @@ msgstr "LED Konfiguration" msgid "LED Name" msgstr "LED Name" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-Proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA Flags" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" -msgstr "RA Hop Limit" +msgstr "RA Hop-Limit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA Lifetime" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-Service" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ entspricht einer beliebigen Domain. /example.com/ liefert NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# liefert NULL Adressen (0.0.0.0 und " +"::) für example.com und seine Subdomains." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" -msgstr "%s/var> größer %s" +msgstr "%s ist größer als %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:85 msgctxt "nft relational \">=\" operator expression" @@ -276,11 +380,23 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s nicht im Set %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"Ein batman-adv Knoten kann entweder im Server-Modus (Teilen der " +"Internetverbindung mit dem Mesh), im Client-Modus (Suchen der geeignetsten " +"Internetverbindung im Mesh) oder mit deaktiviertem Gateway-Support " +"(Standardeinstellung) betrieben werden." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Es existiert bereits eine Konfiguration für den Netzwerkadapter \"%s\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Es existiert bereits ein Verzeichnis mit dem gleichen Namen." @@ -289,25 +405,90 @@ msgid "A new login is required since the authentication session expired." msgstr "" "Ein neuer Login ist erforderlich da die Benutzersitzung abgelaufen ist." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (alle Varianten) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (alle Varianten) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (alle Varianten) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (alle Varianten) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (alle Varianten) Annex B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (alle Varianten) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (alle Varianten) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annex L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -340,29 +521,40 @@ msgstr "ARP Überwachung wird für die ausgewählte Regel nicht unterstützt!" msgid "ARP retry threshold" msgstr "Grenzwert für ARP-Auflösungsversuche" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "ARP-Tabelle \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"ARP, IPv4 und IPv6 (auch 802.1Q) mit Multicast-Ziel-MACs werden als Unicast " +"an die STA-MAC-Adresse gesendet. Hinweis: Dies ist kein Directed Multicast " +"Service (DMS) in 802.11v. Hinweis: könnte nicht den Erwartungen des STA-" +"Multicast-Empfängers entsprechen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Asynchroner Transfer-Modus)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM Brücken" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM Virtual Channel Identifier (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM Virtual Path Identifier (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -372,28 +564,24 @@ msgstr "" "Linux Netzwerkadapter welche z.B. in Verbindung mit DHCP oder PPP genutzt " "werden können um sich in das Providernetzwerk einzuwählen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM Adapterindex" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "IPv4-Adresse" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Nicht vorhandener Adapter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "DNS-Dienste auf direkte lokale Subnetze beschränken um Missbrauch durch " "Dritte zu verhindern." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Lokale Quelle akzeptieren" @@ -402,24 +590,33 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Paket akzeptieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" -msgstr "Akzeptiere eingehende Pakete mit einer lokalen Quell-Adresse." +msgstr "Pakete mit lokalen Quelladressen akzeptieren" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 msgid "Access Concentrator" msgstr "Zugriffskonzentrator" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Zugangspunkt" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Access-Point-Isolation" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Zugangstechnologien" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Aktionen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Aktiv" @@ -457,8 +654,8 @@ msgstr "Aktive IPv6 Regeln" msgid "Active-Backup policy (active-backup, 1)" msgstr "Active-Backup-Richtlinie (Active-Backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -475,18 +672,18 @@ msgstr "Adaptiver Sendelastausgleich (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Hinzufügen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "ATM-Brücke hinzufügen" @@ -506,11 +703,11 @@ msgstr "LED-Aktion hinzufügen" msgid "Add VLAN" msgstr "VLAN hinzufügen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Konfiguration für Netzwerkadapter hinzufügen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Konfiguration für Netzwerkadapter hinzufügen…" @@ -518,18 +715,18 @@ msgstr "Konfiguration für Netzwerkadapter hinzufügen…" msgid "Add instance" msgstr "Instanz hinzufügen" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Schlüssel hinzufügen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." -msgstr "Lokalen Domainsuffx an Namen aus der Hosts-Datei anhängen" +msgstr "Lokalen Domänensuffix an Namen aus der Hosts-Datei anhängen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Neue Schnittstelle hinzufügen..." @@ -537,19 +734,23 @@ msgstr "Neue Schnittstelle hinzufügen..." msgid "Add peer" msgstr "Peer hinzufügen" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" -msgstr "Zur Blacklist hinzügen" +msgstr "Zur Blacklist hinzufügen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Whitelist" msgstr "Zur Whitelist hinzufügen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Zusätzliche Hosts-Dateien" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Zusätzliche Nameserver-Datei" @@ -566,7 +767,11 @@ msgstr "Zusätzliche Nameserver-Datei" msgid "Address" msgstr "Adresse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Adressfamilie" @@ -579,7 +784,7 @@ msgstr "Adressparameter ist ungültig" msgid "Address to access local relay bridge" msgstr "Adresse der lokalen Relay-Brücke" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Adressen" @@ -588,29 +793,29 @@ msgstr "Adressen" msgid "Administration" msgstr "Administration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Erweiterte Einstellungen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Erweiterte Adapteroptionen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Altersgrenze" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Vollständige Sendeleistung (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Originator-Nachrichten aggregieren" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -647,19 +852,19 @@ msgstr "Alias-Schnittstelle" msgid "Alias of \"%s\"" msgstr "Alias von \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Alle Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -"IP-Adressen sequenziell vergeben, beginnend mit der kleinsten verfügbaren " -"Adresse" +"IP-Adressen sequenziell zuweisen, beginnend mit der kleinsten verfügbaren " +"Adresse." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "IPs sequenziell vergeben" @@ -668,13 +873,13 @@ msgid "Allow SSH password authentication" msgstr "" "Erlaube SSH Passwort-Authentifizierung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" "Erlaube dem Access-Point die Trennung von Clients mit schlechter " "Signalqualität" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Alle außer gelistete erlauben" @@ -682,15 +887,15 @@ msgstr "Alle außer gelistete erlauben" msgid "Allow full UCI access for legacy applications" msgstr "Gewähre vollen UCI-Zugriff auf Legacy-Anwendungen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Veraltete 802.11b-Raten erlauben" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Nur gelistete erlauben" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Erlaube localhost" @@ -711,21 +916,26 @@ msgid "Allow system feature probing" msgstr "Systemfunktionsprüfung zulassen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" "Erlaubt es dem root Benutzer sich mit einem Passwort statt einem " "Zertifikat einzuloggen" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Erlaubte IP-Adressen" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "AllowedIPs Parameter ist ungültig" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Immer" @@ -737,11 +947,11 @@ msgstr "Immer aus (kernel: none)" msgid "Always on (kernel: default-on)" msgstr "Immer ein (kernel: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "Immer DHCP Optionen senden. Wird manchmal benötigt, z.B. mit PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -750,11 +960,13 @@ msgstr "" "benachbarten Funkzellen überlappt. Die Benutzung dieser Option ist eine " "Verletzung des IEEE 802.11n-2009 Standards!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" -msgstr "" -"Anzahl zu sendender DAD-" -"Anfragen" +msgstr "Anzahl der zu sendenden Duplicate Address Detection-Anfragen" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Wartezeit in Sekunden, bis das Modem bereit ist" #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" @@ -764,72 +976,23 @@ msgstr "Beim Speichern des Formulars ist ein Fehler aufgetreten:" msgid "An optional, short description for this device" msgstr "Kurze, optionale Beschreibung dieses Gerätes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Anhang" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annex A, L und M (alle)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Anhang A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Anhang A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Anhang A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Anhang A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Annex B (alle Arten)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Anhang B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Anhang B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Anhang B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Annex J (alle Arten)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Anhang L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Annex M (alle Arten)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Anhang M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Anhang M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"NAT64-Präfix in RA-Nachrichten " +"ankündigen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Dieses Gerät als IPv6-DNS-Server annoncieren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -837,7 +1000,7 @@ msgstr "" "Dieses Gerät als Default-Router annoncieren wenn eine lokale IPv6-Default-" "Route vorhanden ist." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -846,7 +1009,7 @@ msgstr "" "Präfix verfügbar ist, unabhängig von der Verfügbarkeit einer lokalen Default-" "Route." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -854,15 +1017,15 @@ msgstr "" "Dieses Gerät als Default-Router annoncieren, unabhängig davon, ob ein Präfix " "oder eine Default-Route verfügbar ist." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Angekündigte Suchdomains" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Annoncierte IPv6-DNS-Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Anonyme Identität" @@ -874,7 +1037,7 @@ msgstr "Automatische Mountpunkte" msgid "Anonymous Swap" msgstr "Automatische Swap-Aktivierung" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Jedes Paket" @@ -886,11 +1049,11 @@ msgstr "Jedes Paket" msgid "Any zone" msgstr "Beliebige Zone" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." -msgstr "DHCP Optionen auf dieses Netz anwenden. (Leer = alle clients)." +msgstr "DHCP Optionen auf dieses Netz anwenden. (leeres Feld = alle Clients)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "Anwenden und Einstellungen beibehalten" @@ -898,42 +1061,46 @@ msgstr "Anwenden und Einstellungen beibehalten" msgid "Apply backup?" msgstr "Backup anwenden?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" "Anforderung zur Anwendung der Änderungen mit Status %h " "fehlgeschlagen" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Ungeprüft übernehmen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "Anwenden, bei Verbindungsverlust zurückrollen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Warte auf das Anwenden der Konfiguration… %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Architektur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" -msgstr "Arp-scan" +msgstr "ARP-Scan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Legt die Größe der dieser Schnittstelle zugewiesenen Partitionen der " "öffentlichen IPv6-Präfixe fest" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -941,7 +1108,7 @@ msgstr "" "Der Schnittstelle zugewiesene Partitionen des Adressraums werden anhand " "dieser hexadezimalen ID gewählt." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Assoziierte Clients" @@ -950,8 +1117,8 @@ msgstr "Assoziierte Clients" msgid "Associations" msgstr "Assoziierungen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" @@ -959,8 +1126,8 @@ msgstr "" "Mindestens %h pro %h, erlaubte " "Überschreitung %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -974,25 +1141,26 @@ msgstr "" "Versuche die konfigurierten Mount-Punkte vorhandener Speichergeräte zu " "aktivieren" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Berechtigungsgruppe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Authentifizierung" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Authentifizierungstyp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Authoritativ" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Autorisierung benötigt" @@ -1000,7 +1168,9 @@ msgstr "Autorisierung benötigt" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1018,12 +1188,12 @@ msgstr "Automatisches Homenet-Protokoll (HNCP)" msgid "Automatically check filesystem for errors before mounting" msgstr "Dateisystem vor dem Einhängen automatisch auf Fehler prüfen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." msgstr "" -"Multiple Upstream-Schnittstellen automatisch durch quell-basiertes Policy-" +"Mehrere Upstream-Schnittstellen automatisch durch quell-basiertes Policy-" "Routing handhaben." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 @@ -1042,6 +1212,10 @@ msgstr "Dateisystem automatisch einhängen" msgid "Automount Swap" msgstr "SWAP automatisch aktivieren" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Verfügbar" @@ -1060,11 +1234,15 @@ msgstr "Verfügbar" msgid "Average:" msgstr "Durchschnitt:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Bridge-Schleifen vermeiden" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1072,15 +1250,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "BSS-Übergang" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Zurück" @@ -1089,11 +1271,7 @@ msgstr "Zurück" msgid "Back to Overview" msgstr "Zurück zur Übersicht" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Zurück zur Konfiguration" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "Zurück zur Konfiguration des Verbindungspartners" @@ -1106,16 +1284,15 @@ msgid "Backup / Flash Firmware" msgstr "Backup / Firmware Update" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Liste zu sichernder Dateien" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Frequenztyp" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Grundgerät" @@ -1123,12 +1300,44 @@ msgstr "Grundgerät" msgid "Base64-encoded public key of this interface for sharing." msgstr "Base64-kodierter öffentlicher Schlüssel dieses Interfaces zum Teilen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Batman-Gerätedatei" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Batman-Schnittstelle" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv beinhaltet Layer-2-Fragmentierung für Unicast-Datenströme durch " +"das Mesh und ermöglicht damit den Betrieb über Schnittstellen bzw. " +"Verbindungen deren MTU nicht über die Ethernet-Frame-Standardgröße von 1500 " +"Bytes hinaus erweitert werden kann. Wenn die Fragmentierung aktiviert ist " +"werden übergroße Pakete automatisch durch batman-adv fragmentiert und an der " +"Gegenstelle wieder zusammengesetzt. Standardmäßig ist der " +"Fragmentierungsmechanismus angeschaltet aber inaktiv wenn die transportieren " +"Pakete die MTU nicht überschreiten, kann jedoch hier komplett deaktiviert " +"werden." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Beacon-Intervall" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Beacon-Bericht" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1143,29 +1352,44 @@ msgstr "" msgid "Bind NTP server" msgstr "Schnittstelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." -msgstr "" -"Dynamisch an Netzwerkadapter binden statt die globale Standardadresse zu " -"benutzen (als Standard für Linux-Systeme empfohlen)" +msgstr "Dynamische Bindung an Schnittstellen anstelle von Platzhalteradressen." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "An Adapter binden" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" +"Binden von Dienst-Records an einen Domänennamen: angeben des Standorts der " +"Dienste." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"Binden der Dienst-Records an einen Domänennamen: angeben des Standorts der " +"Dienste. Siehe RFC2782." + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1177,93 +1401,129 @@ msgstr "Tunnelendpunkt an diese Schnittstelle binden (optional)." msgid "Bitrate" msgstr "Bitrate" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Bündelungsmodus" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Bonding-Methode" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" "Netzwerkbrücke (erlaubt direkte Kommunikation zwischen MAC-VLAN-" "Schnittstellen)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Netzwerkbrücken-VLAN-Filter" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Gerät der Netzwerkbrücke" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "Portspezifische Optionen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Brückenports" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "Bridge-Tabelle \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Geräteindex der Brücke" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Leere Brücke konfigurieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Während des Bootvorgangs starten" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" "Die Netzwerkbrücke konfigurieren und hochfahren, auch wenn keine " "Netzwerkadapter zugeordnet sind" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Broadcast-Richtlinie (broadcast, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Durchsuchen…" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:40 msgid "Buffered" -msgstr "Gepuffert" +msgstr "Pufferspeicher" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" +"CA-Zertifikat (PEM-kodiert; anstelle des systemweiten Speichers verwenden, " +"um das Gateway-Zertifikat zu überprüfen." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "CA-Zertifikat (wird beim ersten Verbindungsaufbau automatisch gespeichert " "wenn leer)." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "CLAT-Konfiguration fehlgeschlagen" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME oder fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (Extern verwaltete Schnittstelle)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "CPU-Nutzung (%)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:43 msgid "Cached" -msgstr "Im Cache" +msgstr "Zugriffsspeicher" #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:53 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:53 @@ -1271,18 +1531,25 @@ msgstr "Im Cache" msgid "Call failed" msgstr "Anruf fehlgeschlagen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"Kann nützlich sein, wenn der ISP IPv6-Nameserver hat, aber kein IPv6-Routing " +"anbietet." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Abbrechen" @@ -1290,32 +1557,32 @@ msgstr "Abbrechen" msgid "Cannot parse configuration: %s" msgstr "Die Konfiguration ist ungültig: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "Eingehende, an andere Hosts adressierte Pakete" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "Eingehende Pakete vor dem Netzwerkrouting" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "Eingehende, an das lokale System adressierte Pakete" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "Ausgehende Pakete nach dem Netzwerkrouting" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "Vom lokalen System ausgehende Pakete" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "Direkt nach dem Empfang durch die Netzwerkhardware" @@ -1324,24 +1591,32 @@ msgstr "Direkt nach dem Empfang durch die Netzwerkhardware" msgid "Category" msgstr "Kategorie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "Zellen-ID" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "Standort der Zelle" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Zertifikatsbeschränkung (Domain)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Zertifikatseinschränkung (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Zertifikatseinschränkung (Betreff)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Zertifikatseinschränkung (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1350,8 +1625,8 @@ msgstr "" "de
    Siehe `logread -f` während des Verbindungsaufbaus für tatsächliche " "Werte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1359,8 +1634,8 @@ msgstr "" "Zertifikatseinschränkungen der DNS-SAN-Werte (falls verfügbar)
    oder " "exakter Vergleich des Subject CN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1368,8 +1643,8 @@ msgstr "" "Zertifikatseinschränkungen der DNS-SAN-Werte (falls verfügbar)
    oder " "Suffix-Vergleich des Subject CN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1384,16 +1659,16 @@ msgstr "" msgid "Chain" msgstr "Kette" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" -msgstr "Chain-Hook \"%h\"" +msgstr "Hook \"%h\" der Kette" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Änderungen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Änderungen wurden verworfen." @@ -1404,18 +1679,19 @@ msgstr "Ändert das Administratorpasswort für den Zugriff auf dieses Gerät" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Kanal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Kanalanalyse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Kanalbreite" @@ -1423,7 +1699,7 @@ msgstr "Kanalbreite" msgid "Check filesystems before mount" msgstr "Dateisysteme prüfen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" "Diese Option setzen um existierende Netzwerke auf dem Radio zu löschen." @@ -1441,8 +1717,8 @@ msgstr "Image wird überprüft…" msgid "Choose mtdblock" msgstr "Wähle \"mtdblock\" Datei" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1454,7 +1730,7 @@ msgstr "" "oder das erzeugen Feld ausfüllen um eine neue Zone direkt anzulegen " "und zuzuweisen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1462,7 +1738,7 @@ msgstr "" "Wählt die Schnittstellen die diesem WLAN-Netzwerk zugeordnet werden. Das " "erstelle-Feld ausfüllen um eine neue Schnittstelle anzulegen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Verschlüsselungsalgorithmus" @@ -1487,9 +1763,10 @@ msgstr "" "herunterzuladen. (Hinweis: Diese Funktionalität ist nur für Experten " "gedacht!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Client" @@ -1498,9 +1775,9 @@ msgstr "Client" msgid "Client ID to send when requesting DHCP" msgstr "Zu sendende Client-ID bei DHCP Anfragen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Schließen" @@ -1517,20 +1794,20 @@ msgstr "" "Inaktive Verbindungen nach Ablauf dieser Zeit in Sekunden schließen (0 um " "die Verbindung immer aufrecht zu erhalten)" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Schließe Liste..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Sammle Daten..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Befehl" @@ -1547,7 +1824,7 @@ msgstr "Befehl fehlgeschlagen" msgid "Comment" msgstr "Kommentar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1564,35 +1841,34 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:108 msgid "Compute outgoing checksum (optional)." -msgstr "Prüfsummen für zu sendende Pakete berechnet (optional)" +msgstr "Berechnen der ausgehenden Prüfsumme (optional)." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Config File" -msgstr "" +msgstr "Konfig-Datei" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Konfiguration" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "Konfigurationsexport" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Die Konfiguration wurde angewendet." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Die Konfiguration wurde zurückgerollt!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Konfiguration fehlgeschlagen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1608,15 +1884,15 @@ msgstr "" "11 MBit/s. \"Sehr Hoch\" setzt die Basisdatenrate auf 24 MBit/s. Datenraten " "kleiner als die minimale Basisdatenrate werden nicht angeboten." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" "Konfiguriert die Default-Router-Ankündigung in RA-Nachrichten" +"Advertisement\">RA-Nachrichten." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1624,19 +1900,19 @@ msgstr "" "Konfiguriert den Betriebsmodus des RA-Dienstes an dieser Schnittstelle." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" "Konfiguriert den Betriebsmodus des DHCPv6-Dienstes an dieser Schnittstelle." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" "Konfiguriert den Betriebsmodus des NDP-Proxy-Dienstes an dieser " "Schnittstelle." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Konfigurieren…" @@ -1648,9 +1924,10 @@ msgstr "Verbindungstrennung bestätigen" msgid "Confirmation" msgstr "Bestätigung" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Verbunden" @@ -1660,11 +1937,11 @@ msgstr "Verbunden" msgid "Connection attempt failed" msgstr "Verbindungsversuch fehlgeschlagen" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." -msgstr "Verbindungsversuch gescheitert" +msgstr "Verbindungsversuch gescheitert." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "Verbindungsendpunkt" @@ -1676,7 +1953,7 @@ msgstr "Verbindung verloren" msgid "Connections" msgstr "Verbindungen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "Änderung der Netzwerkverbindung" @@ -1699,7 +1976,8 @@ msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:377 msgid "Consider the slave up when any ARP IP target is reachable (any, 0)" msgstr "" -"Follower als online markieren, wenn irgendein Typ von ARP IP erreichbar ist." +"Der Slave gilt als betriebsbereit, wenn ein beliebiges ARP-IP-Ziel " +"erreichbar ist (any, 0)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:18 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:368 @@ -1707,9 +1985,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Inhalte wurden gespeichert." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1720,16 +1998,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "Fortfahren in %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" -msgstr "In aufrufender Chain fortfahren" +msgstr "In aufrufender Kette fortfahren" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "Nicht betrachtete Pakete durchlassen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1744,20 +2022,20 @@ msgstr "" msgid "Country" msgstr "Land" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Ländercode" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Funkzellendichte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Firewallzone anlegen / zuweisen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Schnittstelle anlegen" @@ -1769,7 +2047,7 @@ msgstr "Kritisch" msgid "Cron Log Level" msgstr "Cron Protokoll-Level" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Aktuelle Sendeleistung" @@ -1813,31 +2091,31 @@ msgstr "" "Passt das Verhalten der Geräte-LEDs an - wenn dies möglich ist." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "DAD Anfragen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE-Client" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE-Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAE-Geheimnis" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "DHCP Optionen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP-Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP und DNS" @@ -1848,16 +2126,22 @@ msgstr "DHCP und DNS" msgid "DHCP client" msgstr "DHCP Client" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP-Optionen" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6 Client" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6-Dienst" @@ -1869,19 +2153,19 @@ msgstr "DHCPv6-Dienst" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "DNS-Weiterleitungen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNS Abfrageport" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "DNS-Suchdomänen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "DNS Serverport" @@ -1889,7 +2173,7 @@ msgstr "DNS Serverport" msgid "DNS setting is invalid" msgstr "DNS-Parameter ist ungültig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "DNS-Gewichtung" @@ -1897,11 +2181,11 @@ msgstr "DNS-Gewichtung" msgid "DNS-Label / FQDN" msgstr "DNS-Label / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "DNSSEC Signaturstatus prüfen" @@ -1913,39 +2197,47 @@ msgstr "DPD Inaktivitätstimeout" msgid "DS-Lite AFTR address" msgstr "DS-Lite AFTR-Adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "DSL-Status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "DSL Leitungsmodus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "DTIM-Intervall" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Datenrate" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Daten erhalten" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Daten gesendet" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Debuggen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Default-Router" @@ -1953,7 +2245,7 @@ msgstr "Default-Router" msgid "Default state" msgstr "Ausgangszustand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1962,65 +2254,66 @@ msgstr "" "Definiert zusätzliche DHCP-Optionen, z.B. \"6,192.168.2.1,192.168.2.2\" um einen anderen DNS-Server an Clients zu verteilen." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -"Definiert eine Übersetzung von Linux-internen Paket-Prioritäten auf VLAN-" -"Header-Prioritäten in ausgehenden Paketen." +"Definiert eine Zuordnung der Linux-internen Paketpriorität zur VLAN-Header-" +"Priorität, jedoch für ausgehende Frames" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -"Definiert eine Übersetzung von VLAN-Header-Prioritäten in eingehenden " -"Paketen auf Linux-interne Paket-Prioritäten." +"Definiert eine Zuordnung der VLAN-Header-Priorität zur Linux-internen " +"Paketpriorität bei eingehenden Frames" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "Definiert eine spezifische MTU für diese Route" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "IPv6-Präfix-Delegation" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Löschen" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Schlüssel löschen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Löschauftrag fehlgeschlagen: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Dieses Netzwerk löschen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "DTIM (Delivery Traffic Indication) Nachrichtenintervall" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Beschreibung" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Abwählen" @@ -2028,11 +2321,11 @@ msgstr "Abwählen" msgid "Design" msgstr "Design" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "Master-Schnittstelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2067,9 +2360,9 @@ msgstr "Ziel-Zone" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2079,36 +2372,40 @@ msgstr "Ziel-Zone" msgid "Device" msgstr "Gerät" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "WLAN-Adapterkonfiguration" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "Gerätekennung" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "WLAN-Adapter ist nicht aktiv" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "WLAN-Adapter startet neu…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Adaptername" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Gerät wird nicht vom ModemManager verwaltet." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Netzwerkadapter nicht vorhanden" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Adaptertyp" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Das Gerät ist nicht erreichbar!" @@ -2116,31 +2413,31 @@ msgstr "Das Gerät ist nicht erreichbar!" msgid "Device unreachable! Still waiting for device..." msgstr "Gerät nicht erreichbar! Warte immer noch..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Geräte" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnosen" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Einwahlnummer" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Verzeichnis" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Deaktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2157,81 +2454,98 @@ msgstr "DNS-Lookups deaktivieren" msgid "Disable Encryption" msgstr "Verschlüsselung deaktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Inaktivitäts-Proben deaktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Dieses Netzwerk deaktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:70 msgid "Disabled" -msgstr "Deaktiviert" +msgstr "deaktiviert" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "Deaktiviert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Trennung bei schlechtem Antwortverhalten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." -msgstr "Eingehende RFC1918-Antworten verwerfen." +msgstr "" +"Verwerfen von Upstream-Antworten, die RFC1918 Adressen " +"enthalten." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Verbindung trennen" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Verbindungstrennung fehlgeschlagen" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Trennungsversuch fehlgeschlagen." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:35 msgid "Disk space" -msgstr "Speicherplatz" +msgstr "Festspeicher" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Verwerfen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Distanzoptimierung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Distanz zum am weitesten entfernten Funkpartner in Metern." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Verteilte ARP-Tabelle" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2240,22 +2554,21 @@ msgstr "" "unspezifiziert, dann gilt diese Sektion für alle Instanzen." # Nur für NAT-Firewalls? -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" -"Dnsmasq ist ein kombinierter DHCP-Server und DNS-Forwarder für NAT " -"Router" +"Dnsmasq ist ein leichtgewichtiger DHCP Server und DNS Forwarder." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" "Negative Antworten nicht zwischenspeichern, z.B. bei nicht existierenden " -"Domains" +"Domänen." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 @@ -2265,36 +2578,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "Keine Hostroute zum Peer erstellen (optional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." -msgstr "" -"DNS-Anfragen ohne DNS-Name nicht weiterleiten" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Keine Anfragen weiterleiten welche nicht durch öffentliche Server " -"beantwortet werden können" +msgstr "Keine DNS-Anfragen ohne Punkte oder Domänenteile weiterleiten." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." -msgstr "Keine Rückwärtsauflösungen für lokale Netzwerke weiterleiten" +msgstr "Reverse-Lookups für lokale Netze nicht weiterleiten." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Verhindert das Binden an diese Netzwerkadapter." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "Keinen DHCPv6-Dienst an dieser Schnittstelle anbieten." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Nicht teilnehmen" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2306,7 +2606,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Keinen Hostnamen senden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2314,11 +2614,11 @@ msgstr "" "Keine RA-" "Nachrichten an diese Schnittstelle senden." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Soll \"%s\" wirklich gelöscht werden?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "" "Soll der untenstehende SSH-Schlüssel wirklich vom System entfernt werden?" @@ -2327,11 +2627,11 @@ msgstr "" msgid "Do you really want to erase all settings?" msgstr "Möchten Sie wirklich alle Einstellungen löschen?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Soll das Verzeichnis \"%s\" wirklich rekursiv gelöscht werden?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "Soll der derzeitige PSK-Schlüssel ersetzt werden?" @@ -2339,15 +2639,17 @@ msgstr "Soll der derzeitige PSK-Schlüssel ersetzt werden?" msgid "Do you want to replace the current keys?" msgstr "Soll das derzeitige Schlüsselpaar ersetzt werden?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" -msgstr "Domain" +msgstr "Domäne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Anfragen nur mit Domain" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Domain-Whitelist" @@ -2373,15 +2675,17 @@ msgstr "Backup herunterladen" msgid "Download mtdblock" msgstr "Mtdblock-Datei herunterladen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Downstream SNR-Offset" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." msgstr "" +"Ziehen Sie eine gültige *.conf-Datei nach unten oder fügen Sie sie " +"ein, um die lokale WireGuard-Schnittstelle zu konfigurieren." #: modules/luci-base/htdocs/luci-static/resources/form.js:2698 msgid "Drag to reorder" @@ -2391,16 +2695,66 @@ msgstr "Ziehen zur Neuanordnung" msgid "Drop Duplicate Frames" msgstr "Doppelte Frames verwerfen" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"Verwerfen aller gratuitous ARP-Frames, z. B. wenn ein bekannter guter ARP-" +"Proxy im Netz vorhanden ist und solche Frames nicht verwendet werden müssen " +"oder im Fall von 802.11 nicht verwendet werden dürfen, um Angriffe zu " +"verhindern." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Verwerfen aller unaufgeforderten neighbor advertisements, z. B. wenn ein " +"bekannter guter NA-Proxy im Netz vorhanden ist und solche Frames nicht " +"verwendet werden müssen oder im Falle von 802.11 nicht verwendet werden " +"dürfen, um Angriffe zu verhindern." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Gratuitous ARP verwerfen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" +"Verwerfen von Multicast-Rahmen der Schicht 2, die IPv4-Unicast-Pakete " +"enthalten." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" +"Verwerfen von Multicast-Rahmen der Schicht 2, die IPv6-Unicast-Pakete " +"enthalten." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Verwerfen verschachtelter IPv4-Unicast" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Verwerfen verschachtelter IPv6-Unicast" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Paket verwerfen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "Nicht betrachtete Pakete verwerfen" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Unaufgeforderte NA verwerfen" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbear Instanz" @@ -2419,20 +2773,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Dynamisches DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "Dynamic-Authorization-Extension-Client." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "Dynamic-Authorization-Extension-Port." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "Dynamic-Authorization-Extension-Secret." @@ -2440,7 +2794,7 @@ msgstr "Dynamic-Authorization-Extension-Secret." msgid "Dynamic tunnel" msgstr "Dynamischer Tunnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2448,21 +2802,33 @@ msgstr "" "DHCP Adressen dynamisch erzeugen. Wenn dies deaktiviert ist, werden nur " "Clients mit konfigurierten statischen Leases bedient." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Z.B. br-vlan oder brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Z.B. eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "EA-Bitlänge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAP-Methode" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Jedem STA wird eine eigene AP_VLAN-Schnittstelle zugewiesen." + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Bearbeiten" @@ -2470,6 +2836,10 @@ msgstr "Bearbeiten" msgid "Edit peer" msgstr "Verbindungspartner bearbeiten" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2478,11 +2848,11 @@ msgstr "" "Um die Syntaxfehler zu beheben, bitte die obige unformatierte Konfiguration " "anpassen und \"Speichern\" klicken um die Seite neu zu laden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Dieses Netzwerk bearbeiten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "WLAN-Netzwerk bearbeiten" @@ -2491,46 +2861,36 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "Effektive Routen-MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Ausgehende QoS-Übersetzung" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "Ausgehende Schnittstellen-ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Ausgehender Schnittstellenname" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "ausgehend mit VLAN-Tag" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "ausgehend ohne VLAN-Tag" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Notfall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" -msgstr "Aktivieren" +msgstr "aktivieren" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -"Gegestelle aktivieren/deaktivieren. Zum Anwenden Wireguard-Schnittstelle neu " -"starten." +"Gegenstelle aktivieren/deaktivieren. Zum Anwenden Wireguard-Schnittstelle " +"neu starten." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2538,11 +2898,11 @@ msgstr "" "IGMP-Erkennung " "aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "STP aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "SLAAC aktivieren" @@ -2560,10 +2920,11 @@ msgstr "Dynamisches Mischen von Flows aktivieren" msgid "Enable HE.net dynamic endpoint update" msgstr "Dynamisches HE.net IP-Adress-Update aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "IPv6 aktivieren" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "IPv6 anfordern" @@ -2577,11 +2938,15 @@ msgstr "IPv6 anfordern" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Aushandeln von IPv6-Adressen auf der PPP-Verbindung aktivieren" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "IPv6-Segment-Routing aktivieren" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Aktiviere Jumbo Frame Durchleitung" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "Lernen von MAC-Adressen aktivieren" @@ -2593,11 +2958,11 @@ msgstr "Aktiviere NTP-Client" msgid "Enable Single DES" msgstr "Single-DES aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "TFTP-Server aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "VLAN-Filterung aktivieren" @@ -2605,7 +2970,7 @@ msgstr "VLAN-Filterung aktivieren" msgid "Enable VLAN functionality" msgstr "VLAN-Funktionalität aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "WPS-via-Knopfdruck aktivieren, erfordert WPA(2)-PSK/WPA3-SAE" @@ -2619,14 +2984,14 @@ msgstr "" "Protocol\">HTTP Anfragen zum HTTPS Port." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" "Aktiviert die Delegation von IPv6-Präfixen an nachgelagerte Netzwerke auf " -"dieser Schnittstelle." +"dieser Schnittstelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Key Reinstallation (KRACK) Gegenmaßnahmen aktivieren" @@ -2642,26 +3007,26 @@ msgstr "Port-Mirroring für eingehende Pakete aktivieren" msgid "Enable mirroring of outgoing packets" msgstr "Port-Mirroring für ausgehende Pakete aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "Multicast-Fast-Leave aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "Multicast-Querier aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Multicast-Unterstützung aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Paket-Flusskontrolle über alle CPUs aktivieren. Kann Netzwerkdurchsatz " "positiv oder negativ beeinflussen." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Promiscuous-Modus aktivieren" @@ -2683,11 +3048,11 @@ msgstr "Multicast-Unterstützung aktivieren (optional)." msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Das DF-Bit (Nicht fragmentieren) auf gekapselten Paketen setzen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "Den eingebauten einzel-instanz TFTP Server aktivieren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Dieses Netzwerk aktivieren" @@ -2696,21 +3061,24 @@ msgstr "Dieses Netzwerk aktivieren" msgid "Enable tx checksum" msgstr "TX-Prüfsumme aktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "Unicast-Flooding aktivieren" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Aktiviert" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Aktiviert die automatische IGMP-Erkennung auf dieser Netzwerkbrücke" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2718,7 +3086,15 @@ msgstr "" "Aktiviert schnelles Roaming zwischen Access-Points des selben " "Mobilitätsbereiches" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" +"Aktiviert die effizientere, Multicast-Gruppen nutzende " +"Weiterleitungsinfrastruktur in batman-adv." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Aktiviert das Spanning Tree Protokoll auf dieser Netzwerkbrücke" @@ -2726,48 +3102,53 @@ msgstr "Aktiviert das Spanning Tree Protokoll auf dieser Netzwerkbrücke" msgid "Encapsulation limit" msgstr "A better translation would be \"Verschachtelungslimit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Kapselung" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Verschlüsselung" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Endpunkt" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Entfernter Server" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Entfernter Port" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:325 msgid "Endpoint setting is invalid" -msgstr "Endpunkt-Parameter ist ungültig." +msgstr "Endpunkt-Parameter ist ungültig" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "IGMPv1 erzwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "IGMPv2 erzwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "IGMPv3 erzwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "MDL Version 1 erzwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "MLD Version 2 erzwingen" @@ -2796,10 +3177,6 @@ msgstr "Fehler" msgid "Error getting PublicKey" msgstr "Fehler beim Abruf des öffentlichen Schlüssels" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Fehlersekunden (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2818,39 +3195,55 @@ msgstr "Alle 30 Sekunden (langsam, 0)" msgid "Every second (fast, 1)" msgstr "Jede Sekunde (schnell, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Netzwerkadapter ausschließen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"Ausführung verschiedener Netzwerkbefehle, um die Verbindung und " +"Namensauflösung auf andere Systeme zu überprüfen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -"Dies erlaubt DNS-Antworten im 127.0.0.0/8 Bereich der z.B. für RBL Dienste " -"genutzt wird" +"Ausnehmen von 127.0.0.0/8 und ::1 von Rebinding-" +"Prüfungen, z. für RBL-Dienste." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Existierender Netzwerkadapter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Hosts vervollständigen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Erwartete Portnummer." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Erwarte einen hexadezimalen Zuordnungshinweis" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Erwarte eine gültige IPv4-Adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Erwarte eine gültige IPv6-Adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Erwarte zwei durch Doppelpunkt getrennte Prioritätswerte" @@ -2859,11 +3252,11 @@ msgstr "Erwarte zwei durch Doppelpunkt getrennte Prioritätswerte" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Erwarte: %s" @@ -2875,7 +3268,7 @@ msgstr "Erwartet: nicht leerer Wert" msgid "Expires" msgstr "Verfällt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2886,11 +3279,11 @@ msgstr "" msgid "External" msgstr "Extern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Externe R0-Key-Holder-List" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Externe R1-Key-Holder-List" @@ -2918,81 +3311,114 @@ msgstr "Zusätzliche pppd-Optionen" msgid "Extra sstpc options" msgstr "Zusätzliche sstpc-Optionen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT-über-DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT-drahtlos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "FT Protokoll" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "Grund des Fehlschlags" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Das Systempasswort konnte nicht geändert werden." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Modem konnte nicht konfiguriert werden" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" "Konnte nicht innerhalb von %d Sekunden bestätigen, warte auf Zurückrollen " "der Änderungen…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Verbindung konnte nicht hergestellt werden" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Verbindung konnte nicht getrennt werden" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Fehler beim Ausführen der Aktion \"/etc/init.d/%s %s\": %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Modeminformationen konnten nicht abgerufen werden" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Modem konnte nicht initialisiert werden" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Betriebsmodus konnte nicht eingestellt werden" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Datei" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -"Diese Datei muss Zeilen in der Form server=/domain/1.2.3.4 oder " -"server=1.2.3.4 für domainspezifische oder volle Upstream-DNS-Server beinhalten." +"Datei, die Upstream-Resolver auflistet, optional domänenspezifisch, z. B. " +"server=1.2.3.4, server=/domäne/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Datei nicht verfügbar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." -msgstr "" -"Speicherort für vergebene DHCP-Adressen" +msgstr "Datei zum Speichern von DHCP-Lease-Informationen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." -msgstr "Lokale DNS-Datei" +msgstr "Datei mit Upstream-Resolvern." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Dateiname" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." -msgstr "Dateiname des Boot-Images welches den Clients mitgeteilt wird" +msgstr "Dateiname des Boot-Images, das Clients angekündigt wird." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:315 msgid "Filesystem" msgstr "Dateisystem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Filtern von IPv4-A-Einträgen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Filtern von IPv6-AAAA-Einträgen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "SRV/SOA-Service-Erkennung filtern" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Private Anfragen filtern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Windowsanfragen filtern" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Filterung für alle Slaves, keine Validierung" @@ -3005,8 +3431,15 @@ msgstr "Filterung für alle Slaves, Validierung nur für aktiven Slave" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "Filterung für alle Slaves, Validierung nur für Backup-Slaves" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" +"Filtert die Erkennung von SRV/SOA-Diensten, um die Auslösung von Dial-on-" +"Demand-Verbindungen zu vermeiden." + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Finalisierung fehlgeschlagen" @@ -3018,7 +3451,7 @@ msgstr "" "Findet alle angeschlossenen Dateisysteme und SWAP-Partitionen und generiert " "die Konfiguration mit passenden Standardwerten für alle gefundenen Geräte neu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Suchen und Verbinden von Netzwerken" @@ -3032,10 +3465,11 @@ msgid "Firewall" msgstr "Firewall" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Firewall Mark" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Firewall Einstellungen" @@ -3043,21 +3477,21 @@ msgstr "Firewall Einstellungen" msgid "Firewall Status" msgstr "Firewall-Status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "Firewall-Markierung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Firmware-Datei" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Firmware-Version" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." -msgstr "Fester Port für ausgehende DNS-Anfragen" +msgstr "Fester Quellport für ausgehende DNS-Abfragen." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:312 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:449 @@ -3081,42 +3515,50 @@ msgstr "Flash-Operationen" msgid "Flashing…" msgstr "Aktualisieren…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Start erzwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "40MHz-Modus forcieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "CCMP (AES) erzwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" "Aktiviere DHCP-Server für dieses Netzwerk, selbst wenn ein anderer aktiver " "Server erkannt wurde." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "IGMP-Version erzwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "MDL-Version erzwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Erzwinge TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Erzwinge TKIP und CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Erzwinge Verbindung" @@ -3128,11 +3570,11 @@ msgstr "Erzwinge Upgrade" msgid "Force use of NAT-T" msgstr "Benutzung von NAT-T erzwingen" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Abweichendes Formular-Token" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA-Nachrichten zwischen " "der Master-Schnittstellen und nachgelagerten Schnittstellen weiterleiten." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3158,7 +3600,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "DHCP Traffic weiterleiten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3166,32 +3608,36 @@ msgstr "" "DHCPv6-Nachrichten zwischen der Master-Schnittstelle und nachgelagerten " "Schnittstellen weiterleiten." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "Fehlerkorrektursekunden (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Broadcasts weiterleiten" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "Weiterleitungsverzögerung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Mesh-Nachbar-Traffic weiterleiten" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" "Multicast-Pakete als Unicast-Pakete auf diesem Netzwerkadapter weiterleiten." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Weiterleitungstyp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Fragmentierung" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Fragmentierungsschwelle" @@ -3215,7 +3661,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Nur GPRS" @@ -3235,12 +3681,16 @@ msgstr "GRETAP-Tunnel über IPv4" msgid "GRETAP tunnel over IPv6" msgstr "GRETAP-Tunnel über IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Gateway" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Gateway-Modus" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Gateway-Ports" @@ -3250,23 +3700,23 @@ msgstr "Gateway-Ports" msgid "Gateway address is invalid" msgstr "Gateway-Adresse ist ungültig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Allgemeine Einstellungen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Allgemeine Einstellungen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Allgemeine Adapteroptionen" @@ -3274,7 +3724,7 @@ msgstr "Allgemeine Adapteroptionen" msgid "Generate Config" msgstr "Konfiguration generieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "PMK lokal generieren" @@ -3282,11 +3732,11 @@ msgstr "PMK lokal generieren" msgid "Generate archive" msgstr "Sicherung erstellen" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "Konfiguration generieren" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "Konfiguration generieren…" @@ -3294,17 +3744,17 @@ msgstr "Konfiguration generieren…" msgid "Generate new key pair" msgstr "Neues Schlüsselpaar generieren" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "Neuen PSK-Schlüssel generieren" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" "Generiert eine Konfiguration geeignet für den Import bei einem WireGuard-" "Verbindungspartner" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "QR-Code generieren…" @@ -3318,69 +3768,74 @@ msgstr "" msgid "Global Settings" msgstr "Globale Einstellungen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Globale Netzwerkeinstellungen" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." -msgstr "Gehe zum Firmware Upgrade..." +msgstr "Gehe zum Firmware-Upgrade..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Zur Passwortkonfiguration..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Gehe zur entsprechenden Konfigurationsseite" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" -msgstr "Gewähre Zugriff auf die DHCP-Konfiguration" +msgstr "Zugriff auf die DHCP-Konfiguration gewähren" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" -msgstr "Gewähre Zugriff auf die DHCP-Statusanzeige" +msgstr "Zugriff auf die DHCP-Statusanzeige gewähren" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" -msgstr "Gewähre Zugriff auf die DSL-Statusanzeige" +msgstr "Zugriff auf die DSL-Statusanzeige gewähren" #: protocols/luci-proto-openconnect/root/usr/share/rpcd/acl.d/luci-openconnect.json:3 msgid "Grant access to LuCI OpenConnect procedures" -msgstr "Gewähre Zugriff auf LuCI-OpenConnect-Prozeduren" +msgstr "Zugriff auf LuCI-OpenConnect-Prozeduren gewähren" #: protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json:3 msgid "Grant access to LuCI Wireguard procedures" msgstr "Zugriff auf LuCI Wireguard-Verfahren gewähren" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Zugriff auf LuCI openfortivpn-Verfahren gewähren" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" -msgstr "Gewähre Zugriff auf die SSH-Konfiguration" +msgstr "Zugriff auf die SSH-Konfiguration gewähren" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:12 msgid "Grant access to basic LuCI procedures" -msgstr "Gewähre Zugriff auf LuCI-Prozeduren" +msgstr "Zugriff auf grundlegende LuCI-Prozeduren gewähren" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:79 msgid "Grant access to crontab configuration" -msgstr "Gewähre Zugriff auf die Crontab-Konfiguration" +msgstr "Zugriff auf die Crontab-Konfiguration gewähren" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:70 msgid "Grant access to firewall status" -msgstr "Gewähre Zugriff auf den Firewall-Status" +msgstr "Zugriff auf den Firewall-Status gewähren" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:132 msgid "Grant access to flash operations" -msgstr "Gewähre Zugriff auf die Firmwareverwaltung" +msgstr "Zugriff auf die Firmwareverwaltung gewähren" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:3 msgid "Grant access to main status display" @@ -3388,57 +3843,61 @@ msgstr "Zugriff zur Hauptstatusanzeige gewähren" #: protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json:3 msgid "Grant access to mmcli" -msgstr "Gewähre Zugriff auf mmcli" +msgstr "Zugriff auf mmcli gewähren" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:100 msgid "Grant access to mount configuration" -msgstr "Gewähre Zugriff auf die mount-Konfiguration" +msgstr "Zugriff auf die mount-Konfiguration gewähren" #: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:3 msgid "Grant access to network configuration" -msgstr "Gewähre Zugriff auf die Netzwerk-Konfiguration" +msgstr "Zugriff auf die Netzwerk-Konfiguration gewähren" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" -msgstr "Gewähre Zugriff auf die Netzwerk-Diagnosetools" +msgstr "Zugriff auf die Netzwerk-Diagnosetools gewähren" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:36 msgid "Grant access to network status information" -msgstr "Gewähre Zugriff auf die Netzwerkstatus-Informationen" +msgstr "Zugriff auf die Netzwerkstatus-Informationen gewähren" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" -msgstr "Gewähre Zugriff auf die Prozessübersicht" +msgstr "Zugriff auf die Prozessübersicht gewähren" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:3 msgid "Grant access to realtime statistics" -msgstr "Gewähre Zugriff auf d Echtzeitstatistiken" +msgstr "Zugriff auf Echtzeitstatistiken gewähren" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:47 msgid "Grant access to routing status" -msgstr "Zugriff auf Routing-Status erlauben" +msgstr "Zugriff auf Routing-Status gewähren" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:57 msgid "Grant access to startup configuration" -msgstr "Gewähre Zugriff auf die Startvorgangskonfiguration" +msgstr "Zugriff auf die Startvorgangskonfiguration gewähren" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:3 msgid "Grant access to system configuration" -msgstr "Gewähre Zugriff auf die Systemkonfiguration" +msgstr "Zugriff auf die Systemkonfiguration gewähren" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:30 msgid "Grant access to system logs" -msgstr "Gewähre Zugriff auf Systemlogs" +msgstr "Zugriff auf Systemprotokolle gewähren" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:43 msgid "Grant access to uHTTPd configuration" -msgstr "Zugriff auf uHTTPd Konfiguration gewähren" +msgstr "Zugriff auf uHTTPd-Konfiguration gewähren" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:61 msgid "Grant access to wireless channel status" -msgstr "Zugriff auf WiFi-Kanalstatus erlauben" +msgstr "Zugriff auf den WLAN-Kanalstatus gewähren" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Zugriff auf Wireless-Statusanzeige gewähren" @@ -3467,15 +3926,11 @@ msgstr "HTTP(S) Zugriff" msgid "Hang Up" msgstr "Auflegen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Anzahl Header-Error-Code-Fehler (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Heartbeat-Intervall (kernel: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Hello-Intervall" @@ -3487,7 +3942,7 @@ msgstr "" "An dieser Stelle können Grundeinstellungen des Systems wie Hostname oder " "Zeitzone vorgenommen werden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" "ESSID verstecken" @@ -3495,19 +3950,27 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:332 msgid "Hide empty chains" -msgstr "Leere Chains ausblenden" +msgstr "Leere Ketten ausblenden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "Hoch" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "Gratuitous ARP anerkennen" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "Hook: %h (%h), Priorität: %d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Hop-Penalty" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3517,7 +3980,7 @@ msgstr "Host" msgid "Host expiry timeout" msgstr "Host Verfallsdatum" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "Vom Boot-Server angeforderter Dateiname." @@ -3525,10 +3988,16 @@ msgstr "Vom Boot-Server angeforderter Dateiname." msgid "Host-Uniq tag content" msgstr "\"Host-Uniq\"-Bezeichner" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3538,11 +4007,11 @@ msgstr "Hostname" msgid "Hostname to send when requesting DHCP" msgstr "Zu sendender Hostname bei DHCP Anfragen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Rechnernamen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3571,12 +4040,12 @@ msgstr "Hybrid" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:49 msgctxt "nft icmp code" msgid "ICMP code" -msgstr "" +msgstr "ICMP-Code" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:50 msgctxt "nft icmp type" msgid "ICMP type" -msgstr "" +msgstr "ICMP-Typ" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:51 msgctxt "nft icmpv6 code" @@ -3601,23 +4070,27 @@ msgstr "IEEE 802.3ad Dynamic Link Zusammenfassung (802.3ad, 4)" msgid "IKE DH Group" msgstr "IKE-DH-Gruppe" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "IMEI" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IP-Adressen" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "IP-Protokoll" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "IP-Sets" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "IP-Typ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3633,32 +4106,35 @@ msgstr "IP-Adresse ist ungültig" msgid "IP address is missing" msgstr "IP-Adresse fehlt" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " "packets with matching destination IP." msgstr "" +"IP-Adressen, die innerhalb des Tunnels erlaubt sind. Die Gegenstelle " +"akzeptiert getunnelte Pakete mit Quell-IP-Adressen, die dieser Liste " +"entsprechen, und leitet Pakete mit passender Ziel-IP zurück." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 msgctxt "nft ip protocol" msgid "IP protocol" msgstr "IP-Protokoll" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "IP-Protokoll" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "IP-Sets" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "IP-Sets" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Ungültige \"NX-Domain\" Antworten ignorieren" @@ -3666,14 +4142,15 @@ msgstr "Ungültige \"NX-Domain\" Antworten ignorieren" msgid "IPsec XFRM" msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3689,7 +4166,7 @@ msgstr "IPv4-Nachbarn" msgid "IPv4 Routing" msgstr "IPv4-Routing" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "IPv4-Regeln" @@ -3699,7 +4176,7 @@ msgstr "IPv4-Upstream" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3726,9 +4203,9 @@ msgstr "IPv4 Netzmaske" msgid "IPv4 network in address/netmask notation" msgstr "IPv4-Netzwerk in Addresse/Netzmaske-Notation" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" -msgstr "Nur IPv4" +msgstr "nur IPv4" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:52 msgid "IPv4 prefix" @@ -3739,11 +4216,11 @@ msgstr "IPv4 Bereich" msgid "IPv4 prefix length" msgstr "Länge des IPv4-Präfix" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "IPv4-Tabelle \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3752,16 +4229,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-in-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (beide - standardmäßig IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "IPv4/IPv6-Tabelle \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3772,7 +4253,8 @@ msgstr "IPv4/IPv6-Tabelle \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3780,7 +4262,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6 Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "IPv6-MTU" @@ -3788,7 +4270,11 @@ msgstr "IPv6-MTU" msgid "IPv6 Neighbours" msgstr "IPv6 Nachbarn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "IPv6-RA-Einstellungen" @@ -3796,15 +4282,15 @@ msgstr "IPv6-RA-Einstellungen" msgid "IPv6 Routing" msgstr "IPv6-Routing" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "IPv6-Regeln" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "IPv6 Einstellungen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6 ULA-Präfix" @@ -3818,12 +4304,12 @@ msgstr "IPv6-Upstream" msgid "IPv6 address" msgstr "IPv6 Adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "IPv6 Zuweisungshinweis" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "IPv6 Zuweisungslänge" @@ -3835,11 +4321,11 @@ msgstr "IPv6 Gateway" msgid "IPv6 network in address/netmask notation" msgstr "IPv6-Netzwerk in Addresse/Netzmaske-Notation" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" -msgstr "Nur IPv6" +msgstr "nur IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "IPv6-Präferenz" @@ -3848,7 +4334,7 @@ msgstr "IPv6-Präferenz" msgid "IPv6 prefix" msgstr "IPv6-Präfix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "IPv6-Präfix-Filter" @@ -3862,24 +4348,19 @@ msgstr "Länge des IPv6-Präfix" msgid "IPv6 routed prefix" msgstr "Geroutetes IPv6-Präfix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "Quellbasiertes IPv6-Routing" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "IPv6 Endung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"IPv6-Suffix (hexadezimal)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "IPv6-Unterstützung" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "IPv6-Tabelle \"%h\"" @@ -3887,6 +4368,10 @@ msgstr "IPv6-Tabelle \"%h\"" msgid "IPv6-PD" msgstr "IPv6 Präfix-Delegation (PD)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3902,10 +4387,16 @@ msgstr "IPv6-über-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-über-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identität" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Aktiviert die Benutzung von 1DES, wenn ausgewählt" @@ -3920,7 +4411,7 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "Deaktiviert die Verschlüsselung, wenn ausgewählt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." @@ -3928,9 +4419,10 @@ msgstr "" "Wenn angegeben, dann werden Subnetze für nachgelagerte Netzwerke nur aus den " "genannten Präfix-Klassen alloziert." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" -msgstr "Invertiert die Bedeutung der Match-Optionen." +msgstr "" +"Wenn eingestellt, wird die Bedeutung der Übereinstimmungsoptionen invertiert" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 @@ -3949,7 +4441,7 @@ msgstr "" "Wenn angegeben, wird das Gerät nach anhand des Partitionslabels statt fester " "Gerätedatei gemounted" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " @@ -3960,14 +4452,16 @@ msgstr "" "Sekunden notwendig um die geänderten Einstellungen zu bestätigen. " "Andernfalls werden die Änderungen automatisch zurückgerollt." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Wenn deaktiviert, wird keine Default-Route gesetzt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "Falls deaktiviert werden die zugewiesenen DNS-Server ignoriert" @@ -3985,15 +4479,23 @@ msgstr "" "effektive Größe des Arbeitsspeichers zu erhöhen. Die Auslagerung der Daten " "ist natürlich bedeutend langsamer als direkte Arbeitsspeicherzugriffe." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignoriere /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Schnittstelle ignorieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Resolv-Datei ignorieren" @@ -4005,25 +4507,25 @@ msgstr "Abbild" msgid "Image check failed:" msgstr "Überprüfung der Abbilddatei fehlgeschlagen:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" -msgstr "" +msgstr "Als Peer importieren" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "Konfiguration importieren" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" -msgstr "" +msgstr "Konfiguration als Peer importieren…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "Einstellungen importieren" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "Importierte Verbindungspartner-Konfiguration" @@ -4037,7 +4539,24 @@ msgstr "" msgid "In" msgstr "Ein" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"In LAN-Umgebungen mit Bridges ist es empfehlenswert die Bridge-Loop-" +"Vermeidung zu aktivieren um Broadcast-Schleifen zu vermeiden welche das " +"Netzwerk stark beeinträchtigen können." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -4046,7 +4565,7 @@ msgstr "" "Request blockiert. Auf \"Weiter\" klicken um zur vorherigen Seite " "zurückzukehren." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "In Sekunden" @@ -4078,7 +4597,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Eingehende Prüfsumme" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Eingehende Schnittstelle" @@ -4086,6 +4605,7 @@ msgstr "Eingehende Schnittstelle" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Eingehender Schlüssel" @@ -4104,22 +4624,21 @@ msgstr "Info" msgid "Information" msgstr "Informationen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "Eingehende QoS-Übersetzung" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "Eingehende Schnittstellen-ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "Eingehender Schnittstellenname" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Initialisierung fehlgeschlagen" @@ -4131,31 +4650,41 @@ msgstr "Startscript" msgid "Initscripts" msgstr "Startscripte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Einschränkung für inneres Zertifikat (Domain)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Einschränkung für inneres Zertifikat (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Einschränkung für inneres Zertifikat (Subject)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Einschränkung für inneres Zertifikat (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Installiere Protokoll-Erweiterungen..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Instanz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Instanz \"%h\"" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Instanzdetails" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4167,6 +4696,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Ungenügende Berechtigungen um UCI-Konfiguration zu lesen." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "Kennung der integrierten Schaltkreiskarte" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4174,7 +4707,7 @@ msgstr "Ungenügende Berechtigungen um UCI-Konfiguration zu lesen." msgid "Interface" msgstr "Schnittstelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" "Die Schnittstelle \"%h\" ist bereits als Master-Schnittstelle markiert." @@ -4185,7 +4718,7 @@ msgstr "" "Der Netzwerkadapter der Schnittstelle %q wurde automatisch von %q auf %q " "geändert." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "WLAN-Netzwerkkonfiguration" @@ -4216,25 +4749,25 @@ msgstr "Schnittstelle verbindet neu..." msgid "Interface is shutting down..." msgstr "Schnittstelle fährt herunter..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Schnittstelle startet..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Schnittstelle stoppt..." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 msgid "Interface name" -msgstr "Adaptername" +msgstr "Schnittstellenname" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Schnittstelle existiert nicht oder ist nicht verbunden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Netzwerkschnittstellen" @@ -4243,26 +4776,30 @@ msgstr "Netzwerkschnittstellen" msgid "Internal" msgstr "Intern" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Interner Serverfehler" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "Internationale Identität der Mobilstationsausrüstung" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "Internationale Mobilfunk-Teilnehmeridentität" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Intervall für das Senden von Lernpaketen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" "Hundertstelsekunden-Intervall zwischen allgemeinen Multicast-Anfragen. Durch " -"die Variation dieses Parameters kann die Gesamtanzahl der IGMP-Nachrichten " -"in einem Subnetz beeinflusst werden. Größere Werte führen zu selteneren IGMP-" -"Query-Nachrichten." +"die Variation dieses Parameters kann die Anzahl der IGMP-Nachrichten in " +"einem Subnetz beeinflusst werden; größere Werte führen zu seltener " +"gesendeten IGMP-Queries" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "Intervall für STP-Hello-Pakete in Sekunden" @@ -4272,29 +4809,34 @@ msgid "Invalid" msgstr "Ungültige Eingabe" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" -msgstr "Ungültige APN angegeben" +msgstr "Ungültiger APN angegeben" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:37 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:40 msgid "Invalid Base64 key string" msgstr "Ungültige Base64-Zeichenkette" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Ungültige IPv6-Adresse" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" msgstr "" -"Ungültiger TOS-Wert, erwarte einen Wert zwischen 00 und FF oder \"inherit\"." +"Ungültiger TOS-Wert, erwartet wird ein Wert zwischen 00 und FF oder inherit" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:83 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:88 msgid "Invalid Traffic Class value, expected 00..FF or inherit" msgstr "" -"Ungültiger Traffic-Klassen-Wert, erwarte einen Wert zwischen 00 und FF oder " -"\"inherit\"." +"Ungültiger Traffic-Klassen-Wert, erwartet wird ein Wert zwischen 00 und FF " +"oder inherit" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:285 msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." @@ -4308,7 +4850,7 @@ msgstr "Ungültige VLAN-ID angegeben! Nur eindeutige IDs sind zulässig" msgid "Invalid argument" msgstr "Ungültiges Argument" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4324,16 +4866,37 @@ msgstr "Ungültiges Kommando" msgid "Invalid hexadecimal value" msgstr "Ungültiger Hexadezimalwert" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Ungültiger Hostname oder IPv4-Adresse" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Ungültiger Port" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "Ungültige Server-URL" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "" "Ungültiger Benutzername oder ungültiges Passwort! Bitte erneut versuchen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Blinken umkehren" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "Selektor invertieren" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "Ist primäres VLAN" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Clients isolieren" @@ -4346,25 +4909,25 @@ msgstr "" "Das verwendete Image scheint zu groß für den internen Flash-Speicher zu " "sein. Überprüfen Sie die Imagedatei!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "JavaScript benötigt!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Netzwerk beitreten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Netzwerk beitreten: Suche nach Netzwerken" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Trete Netzwerk %q bei" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Zu Regel springen" @@ -4372,24 +4935,28 @@ msgstr "Zu Regel springen" msgid "Keep settings and retain the current configuration" msgstr "Einstellungen beibehalten und die aktuelle Konfiguration sichern" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "Keep-Alive" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Kernelprotokoll" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Kernel-Version" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Schlüssel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Schlüssel Nr. %d" @@ -4397,6 +4964,7 @@ msgstr "Schlüssel Nr. %d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Schlüssel für eingehende Pakete (optional)." @@ -4404,14 +4972,19 @@ msgstr "Schlüssel für eingehende Pakete (optional)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Schlüssel für ausgehende Pakete (optional)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "Schlüssel fehlt" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Schlüssel zum Signieren der Netzwerkkonfiguration" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4456,7 +5029,7 @@ msgstr "LCP Echo Intervall" msgid "LED Configuration" msgstr "LED-Konfiguration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4473,32 +5046,41 @@ msgstr "Sprache" msgid "Language and Style" msgstr "Sprache und Aussehen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" +"Größere Gewichte (mit gleicher Prio) erhalten eine proportional höhere " +"Wahrscheinlichkeit, ausgewählt zu werden." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "Letzter-Teilnehmer-Intervall" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Latenz" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Letztes Handshake" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Zweigstelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Lernend" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "Routen lernen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Leasedatei" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Laufzeit" @@ -4522,7 +5104,7 @@ msgstr "Zur automatischen Erkennung leer lassen" msgid "Leave empty to use the current WAN address" msgstr "Leer lassen um die aktuelle WAN-Adresse zu verwenden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4533,31 +5115,27 @@ msgstr "" "802.11b-Raten verhindert die effiziente Ausnutzung des Funkspektrums. Es " "wird empfohlen, die veralteten Datenraten wo immer möglich zu deaktivieren." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "Alte Regeln erkannt" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Legende:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Limit" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Dämpfung (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" -msgstr "Verbindungsmodus" +msgstr "Leitungsmodus" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" -msgstr "Verbindungsstatus" +msgstr "Leitungszustand" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "Verbindungsdauer" @@ -4578,18 +5156,21 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "Link-Layer-Bits %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." -msgstr "Liste von Servern die falsche \"NX Domain\" Antworten liefern" +msgstr "" +"Liste der IP-Adressen, die in NXDOMAIN-Antworten umgewandelt werden sollen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" "Liste von IP-Sets welche mit den aufgelösten IPs der angegebenen Domains " "gefüllt werden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4604,7 +5185,7 @@ msgstr "" "werden kann, mit der sich der Client wärend der anfänglichen " "Mobilitätsdomänen-Assoziation verbunden hat." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4623,25 +5204,21 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Liste der SSH Schlüssel zur Authentifikation" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." -msgstr "Liste von Domains für welche RFC1918-Antworten erlaubt sind" +msgstr "Liste der Domänen, für die RFC1918-Antworten zugelassen werden sollen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Liste von erzwungenen Domain-IP-Adressen-Zuordnungen." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" -"Liste von DNS-Servern an welche " -"Requests weitergeleitet werden" +"Liste der Upstream-Resolver, an die Abfragen weitergeleitet werden sollen." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" -msgstr "Listening-Port" +msgstr "Listen-Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Aktive Adapter" @@ -4651,7 +5228,7 @@ msgstr "" "Nur auf die gegebene Schnittstelle reagieren, nutze alle wenn nicht " "spezifiziert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4662,16 +5239,16 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "ListenPort-Parameter ist ungültig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." -msgstr "Serverport für eingehende DNS Abfragen" +msgstr "Hörender Port für eingehende DNS-Abfragen." #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:130 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:54 msgid "Load" msgstr "Last" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Durchschnittslast" @@ -4679,27 +5256,28 @@ msgstr "Durchschnittslast" msgid "Load configuration…" msgstr "Konfiguration laden…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Lade Daten…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Lade Verzeichniseinträge…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Lade Seite…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Lokal" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Lokale IP-Adresse" @@ -4719,11 +5297,12 @@ msgstr "Lokale IP-Adresse" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Lokale IPv4-Adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Lokaler IPv6-DNS-Server" @@ -4739,46 +5318,72 @@ msgstr "Lokale IPv6-Adresse" msgid "Local Startup" msgstr "Lokales Startskript" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Ortszeit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "Lokales ULA-Präfix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Lokale Domain" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -"Lokaler Domain-Suffix welcher an DHCP Namen und Host-Datei Einträge " -"angehangen wird" +"Lokales Domänensuffix, das an DHCP-Namen und Hosts-Datei-Einträge angehängt " +"wird." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Lokaler Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Nur lokale Dienste" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Lokaler Wireguard-Schlüssel" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Lokalisiere Anfragen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "Ortsvorwahl" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Auf BSSID beschränken" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Protokollereignis \"%h...\"" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Anmelden" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Zum Login…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Abmelden" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Protokolllevel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Schreibe Abfragelog" @@ -4806,37 +5411,28 @@ msgstr "" "Logisches Netzwerk, zu dem der Tunnel hinzugefügt wird (überbrückt) " "(optional)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Anmelden" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Abmelden" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "Lockere Filterung" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Signalverlustsekunden (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Kleinste vergebene Adresse (Netzwerkadresse + x)." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Lua-Kompatibilitätsmodus aktiv" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC-Adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "MAC-Adressfilter" @@ -4844,16 +5440,15 @@ msgstr "MAC-Adressfilter" msgid "MAC Address For The Actor" msgstr "MAC-Adresse für den Actor" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC-VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4862,11 +5457,15 @@ msgstr "MAC-VLAN" msgid "MAC address" msgstr "MAC-Adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC-Filter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "MAC-Adressliste" @@ -4880,6 +5479,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "MAP-Regel ist ungültig" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "MBIM-Mobilfunk" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4901,15 +5504,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "MII Intervall" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4917,7 +5524,7 @@ msgid "" msgstr "Das Root-Dateisystem muss mit folgenden Kommandsos vorbereitet werden:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4926,69 +5533,73 @@ msgstr "Das Root-Dateisystem muss mit folgenden Kommandsos vorbereitet werden:" msgid "Manual" msgstr "Manuell" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "Hersteller" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Master" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "Maximales RA-Intervall" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Maximal erreichbare Datenrate (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Max. Anzahl von DHCP-Leases" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Max. Größe von EDNS0-Paketen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Max. Anzahl gleichzeitiger Abfragen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Maximales Alter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Maximal erlaubter Inaktivitätszeitraum" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." -msgstr "Maximal zulässige Anzahl von aktiven DHCP-Leases" +msgstr "Maximal zulässige Anzahl von aktiven DHCP-Leases." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." -msgstr "Maximal zulässige Anzahl an gleichzeitigen DNS-Anfragen" +msgstr "Maximal zulässige Anzahl an gleichzeitigen DNS-Abfragen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." -msgstr "Maximal zulässige Größe von EDNS.0 UDP Paketen" +msgstr "Maximal zulässige Größe von EDNS0 UDP Paketen." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Maximale Zeit die gewartet wird bis das Modem bereit ist (in Sekunden)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Maximal zulässige Anzahl von vergeben DHCP-Adressen." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "Maximale Größe der Lern-Tabelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -4997,10 +5608,14 @@ msgstr "" "Advertisement, ICMPv6 Type 134\">RA
    -Nachrichten. Standardwert sind " "600 Sekunden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Maximale Sendeleistung" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Kann verhindern, dass VoIP oder andere Dienste funktionieren." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -5021,13 +5636,13 @@ msgstr "Mittel" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:24 msgid "Memory" -msgstr "Speicher" +msgstr "Arbeitsspeicher" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:73 msgid "Memory usage (%)" msgstr "Speichernutzung (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -5035,10 +5650,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "Mesh-ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Mesh-ID" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Mesh-Routing" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Mesh- und Routing-spezifische Optionen" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Methode nicht gefunden" @@ -5051,7 +5674,7 @@ msgstr "Methode zur Verbindungsüberwachung" msgid "Method to determine link status" msgstr "Methode zur Bestimmung des Verbindungsstatus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -5062,11 +5685,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "Minimaler RA-Intervall" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Minimale ARP-Gültigkeitsdauer" @@ -5074,7 +5697,7 @@ msgstr "Minimale ARP-Gültigkeitsdauer" msgid "Minimum Number of Links" msgstr "Mindestanzahl von Links" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." @@ -5082,7 +5705,7 @@ msgstr "" "Minimale Gültigkeitsdauer, bevor ein ARP-Eintrag ersetzt werden darf. " "Verhindert eine Überlastung des ARP-Caches." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -5099,35 +5722,49 @@ msgstr "Spiegel-Monitor-Port" msgid "Mirror source port" msgstr "Spiegel-Quell-Port" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "Ländervorwahl für Mobilgeräte" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Mobilfunk Daten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "Code des Mobilfunknetzes" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "Mobiler Dienst" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Mobilitätsbereich" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Modus" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Modell" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Modemträger Teardown läuft." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "Modem-Informationen" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5135,43 +5772,36 @@ msgstr "" "Modemverbindung läuft. Bitte warten. Dieser Vorgang wird nach 2 Minuten " "unterbochen." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Modem-Grundeinstellung" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Modem-Gerätedatei" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Modemtrennung läuft. Bitte warten." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Modem-Informationsabfrage fehlgeschlagen" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Wartezeit für Modeminitialisierung" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "Modem ist deaktiviert." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "ModemManager" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" @@ -5241,6 +5871,10 @@ msgstr "Nach unten schieben" msgid "Move up" msgstr "Nach oben schieben" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Multi zu Unicast" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5248,21 +5882,25 @@ msgstr "Nach oben schieben" msgid "Multicast" msgstr "Multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Multicast-Modus" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Multicast-Routing" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "Multicast-zu-Unicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" -msgstr "NAT-Aktions-Chain \"%h\"" +msgstr "NAT-Aktions-Kette \"%h\"" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:87 msgid "NAT-T Mode" @@ -5272,12 +5910,16 @@ msgstr "NAT-T Modus" msgid "NAT64 Prefix" msgstr "NAT64-Präfix" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "NAT64-Präfix" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "NDP-Proxy-Nebenschnittstelle" @@ -5290,33 +5932,42 @@ msgid "NTP server candidates" msgstr "NTP Server Kandidaten" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Name" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Name des neuen Netzwerkes" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Name des Tunnelgeräts" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigation" #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:10 msgid "Nebula Network" -msgstr "" +msgstr "Nebula-Netzwerk" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Nachbarschaftsbericht" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "Neighbour-Cache-Gültigkeitsdauer" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5325,32 +5976,36 @@ msgstr "Neighbour-Cache-Gültigkeitsdauer" msgid "Network" msgstr "Netzwerk" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Netzwerkcodierung" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" -msgstr "" +msgstr "Netzwerkmodus" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "Netzwerkregistrierung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "Netzwerk-SSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Netzwerk-Werkzeuge" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "Netzwerkadresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Netzwerk-Boot-Image" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "Migration der Konfiguration von Netzwerkbrücken" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Netzwerkadapter" @@ -5363,7 +6018,7 @@ msgstr "Netzwerkadapteraktivität (Kernel: netdev)" msgid "Network device is not present" msgstr "Netzwerkadapter ist nicht vorhanden" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "Schnittstellentabelle \"%h\"" @@ -5372,7 +6027,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "Netzwerk-Header-Bits %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Migration der Konfiguration von Schnittstellennamen" @@ -5381,28 +6036,32 @@ msgstr "Migration der Konfiguration von Schnittstellennamen" msgid "Network interface" msgstr "Netzwerkschnittstelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "Netzwerk-ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Niemals" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Niemals" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -"Spezifiziert den lokalen Domainnamen. Anfragen für Hostnamen welche auf " -"diese Domain zutreffen werden nie weitergeleitet und ausschließlich aus DHCP-" -"Namen oder Hosts-Dateien aufgelöst" +"Übereinstimmende Domains und Subdomains niemals weiterleiten, nur aus DHCP- " +"oder Host-Dateien auflösen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Neue Schnittstelle \"%s\" kann nicht angelegt werden: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Name der neuen Schnittstelle…" @@ -5410,13 +6069,13 @@ msgstr "Name der neuen Schnittstelle…" msgid "Next »" msgstr "Weiter »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Nein" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Kein DHCP Server für diese Schnittstelle eingerichtet" @@ -5424,7 +6083,7 @@ msgstr "Kein DHCP Server für diese Schnittstelle eingerichtet" msgid "No Data" msgstr "Keine Daten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Keine Verschlüsselung" @@ -5440,23 +6099,35 @@ msgstr "Kein NAT-T" msgid "No RX signal" msgstr "Kein Signal empfangen" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Keine WireGuard-Schnittstellen konfiguriert." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " "mode should only be used to install a firmware upgrade" msgstr "" -"Einstellungsänderungen werden nicht gespeichert und verschwinden mit einem " -"Reboot. Dieser Modus sollte nur zum Installieren eines neuen Firmware-Images " -"genutzt werden." +"Änderungen an den Einstellungen werden nicht gespeichert und sind nach einem " +"Neustart verloren. Dieser Modus sollte nur verwendet werden, um ein Firmware-" +"Upgrade zu installieren" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:69 msgid "No client associated" msgstr "Keine Clients assoziiert" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Kein Steuergerät angegeben" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "Keine Daten" @@ -5465,8 +6136,8 @@ msgstr "Keine Daten" msgid "No data received" msgstr "Keine Daten empfangen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "Keine Erzwingung" @@ -5479,15 +6150,11 @@ msgstr "Keine Erzwingung" msgid "No entries available" msgstr "Keine Einträge vorhanden" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Keine Einträge in diesem Verzeichnis" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Keine Dateien gefunden" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5504,7 +6171,7 @@ msgstr "" msgid "No host route" msgstr "Keine Hostroute" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5527,33 +6194,42 @@ msgstr "" "Keine Slaves mehr verfügbar, Schnittstellenkonfiguration kann nicht " "gespeichert werden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Kein Negativ-Cache" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "Kein nftables-Regelwerk geladen." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Kein Passwort gesetzt!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Keine Peers verbunden" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "Noch keine Verbindungspartner definiert." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Bisher keine SSH-Schlüssel hinterlegt." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" -msgstr "Keine Regeln in dieser Chain." +msgstr "Keine Regeln in dieser Kette" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:91 msgid "No rules in this chain." @@ -5564,7 +6240,8 @@ msgid "No validation or filtering" msgstr "Keine Validierung oder Filterung" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Keine Zone zugewiesen" @@ -5576,37 +6253,40 @@ msgstr "Keine Zone zugewiesen" msgid "Noise" msgstr "Rauschen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Signal-Rausch-Abstand (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Rauschabstand" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Rauschen:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Nicht-präemptive CRC-Fehler (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "An Schnittstellen binden" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Keine" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Nicht Gefunden" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Kein Mitglied" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Nicht assoziiert" @@ -5619,7 +6299,7 @@ msgstr "Nicht verbunden" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Nicht vorhanden" @@ -5631,13 +6311,22 @@ msgstr "Beim Hochfahren nicht starten" msgid "Not supported" msgstr "Nicht unterstützt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" "Hinweis: Einige WLAN-Treiber unterstützen 802.11w nicht vollständig, z.B. " -"hat der \"mwlwifi\" Treiber bekannte Probleme." +"hat der \"mwlwifi\" Treiber bekannte Probleme" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Hinweis: Sie benötigen möglicherweise auch einen DHCP-Proxy (derzeit nicht " +"verfügbar), wenn Sie einen nicht standardmäßigen Relay-To-Port " +"angeben(addr#port)." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" @@ -5647,7 +6336,7 @@ msgstr "Notizen" msgid "Notice" msgstr "Notiz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "DNS-Auflösung" @@ -5655,11 +6344,11 @@ msgstr "DNS-Auflösung" msgid "Number of IGMP membership reports" msgstr "Anzahl der IGMP-Mitgliedschaftsberichte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "Anzahl der zwischengespeicherten DNS-Einträge. Maximum sind 10000 Einträge, " -"\"0\" deaktiviert die Zwischenspeicherung" +"\"0\" deaktiviert die Zwischenspeicherung." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:311 msgid "Number of peer notifications after failover event" @@ -5674,7 +6363,7 @@ msgid "Obfuscated Password" msgstr "Chiffriertes Passwort" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5685,6 +6374,7 @@ msgid "Obtain IPv6 address" msgstr "IPv6-Adresse beziehen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Aus" @@ -5693,6 +6383,14 @@ msgstr "Aus" msgid "Off-State Delay" msgstr "Verzögerung für Ausschalt-Zustand" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"Aus: vlanXXX, z. B. vlan1. Ein: " +"vlan_tagged_interface.XXX, z.B. eth0.1." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "An" @@ -5701,15 +6399,15 @@ msgstr "An" msgid "On-State Delay" msgstr "Verzögerung für Anschalt-Zustand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "Link-lokale Route" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Es muss entweder ein Hostname oder eine MAC-Adresse angegeben werden!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Eine der folgenden Möglichkeiten: %s" @@ -5727,7 +6425,11 @@ msgstr "Ein oder mehrere ungültige/benötigte Werte auf Registerkarte" msgid "One or more required fields have no value!" msgstr "Ein oder mehr benötigte Felder sind nicht ausgefüllt!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" "Wenn aktiviert, ist nur die Kommunikation mit nicht-isolierten Brücken-Ports " @@ -5740,25 +6442,24 @@ msgstr "" "Nur wenn der aktuell aktive Slave ausfällt und der primäre Slave aktiv ist " "(Fehler, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "Übersicht der iptables-Regeln öffnen…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Liste öffnen..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP-Proxy-Dienst deaktivieren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5776,7 +6477,7 @@ msgstr "" "Im Relay-Modus operieren wenn eine Master-Schnittstelle festgelegt " "und aktiv ist, andernfalls in den Server-Modus wechseln." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." @@ -5784,12 +6485,24 @@ msgstr "" "Im Relay-Modus operieren wenn ein öffentliches IPv6-Präfix " "vorhanden ist, andernfalls den Dienst deaktivieren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Betriebsfrequenz" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "Betreiber" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "Betreiber-Code" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "Betreibername" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "Eingabefeld \"%s\" enthält einen ungültigen Wert." @@ -5797,22 +6510,33 @@ msgstr "Eingabefeld \"%s\" enthält einen ungültigen Wert." msgid "Option \"%s\" must not be empty." msgstr "Eingabefeld \"%s\" darf nicht leer sein." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Option geändert" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Option entfernt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Optional" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Beliebige, optionale Notizen über dieses Gerät" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" +"Optional, in Sekunden. Bei einem Wert von '0' wird keine erneute Verbindung " +"versucht." + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5821,7 +6545,7 @@ msgstr "" "Optional. 32-Bit-Marke für ausgehende, verschlüsselte Pakete. Wert in " "hexadezimal mit führendem 0x angeben." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5833,7 +6557,7 @@ msgstr "" "Server empfangen wird, kombiniert das System das Suffix mit dem Präfix um " "eine lokale IPv6-Adresse (z.B. 'a:b:c:d::1') für die Schnittstelle zu formen." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5841,11 +6565,11 @@ msgstr "" "Optional. Base64-kodierter, vorhab ausgetauschter Schlüssel um eine weitere " "Ebene an symmetrischer Verschlüsselung für erhöhte Sicherheit hinzuzufügen." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Optional. Routen für erlaubte IP-Adressen erzeugen." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Optionale Beschreibung des entfernten VPN-Partners." @@ -5853,7 +6577,7 @@ msgstr "Optionale Beschreibung des entfernten VPN-Partners." msgid "Optional. Do not create host routes to peers." msgstr "Optional. Unterdrückt die Einrichtung von Host-Routen zu VPN-Nachbarn." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." @@ -5861,7 +6585,7 @@ msgstr "" "Optional. Hostname oder Adresse des Verbindungspartners. Namen werden vor " "dem Verbindungsaufbau aufgelöst." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5879,11 +6603,11 @@ msgstr "Optional. Maximale MTU der XFRM-Schnittstelle." msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Optional. Maximale MTU des Tunneladapters." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Optional. Port-Nummer des Verbindungspartners." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5895,7 +6619,7 @@ msgstr "" "Vorhandensein aber die Generierung einer Konfiguration oder eines QR-Codes. " "Kann entfernt werden nachdem die Konfiguration exportiert wurde." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5913,7 +6637,7 @@ msgstr "" msgid "Options" msgstr "Optionen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" für Default-Route. Der Wert 0.0.0.0 wird durch die IP-" "Adresse des dnsmasq-Servers ersetzt." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "Optionen:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Ordinal: der niedrigere Wert kommt zuerst." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Originator-Intervall" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "Andere:" @@ -5948,7 +6681,7 @@ msgstr "Ausgehend:" msgid "Outgoing checksum" msgstr "Ausgehende Prüfsumme" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "Ausgehende Schnittstelle" @@ -5956,6 +6689,7 @@ msgstr "Ausgehende Schnittstelle" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "Ausgehender Schlüssel" @@ -5979,21 +6713,23 @@ msgstr "Output-Zone" msgid "Overlap" msgstr "Überlappung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "IPv4-Routing-Tabelle festlegen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "IPv6-Routing-Tabelle festlegen" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -6001,6 +6737,7 @@ msgstr "IPv6-Routing-Tabelle festlegen" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "MTU-Wert überschreiben" @@ -6022,7 +6759,7 @@ msgstr "TOS-Wert überschreiben" msgid "Override TTL" msgstr "TTL-Wert überschreiben" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -6038,7 +6775,7 @@ msgstr "Überschreibt den Standard-Adapternamen mit dem angegebenem Wert" msgid "Override the gateway in DHCP responses" msgstr "Gateway-Adresse in DHCP-Antworten überschreiben" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -6054,7 +6791,7 @@ msgstr "Überschreibt die benutzte Tabelle für interne Routen" msgid "Overview" msgstr "Übersicht" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "Existierende Datei \"%s\" überschreiben?" @@ -6064,17 +6801,30 @@ msgstr "" "Die derzeitigen Einstellungen mit Werten aus der importierten Konfiguration " "überschreiben?" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "Eigene Zahlen" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Besitzer" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (beide)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -6086,8 +6836,9 @@ msgid "PAP/CHAP password" msgstr "PAP/CHAP Passwort" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -6098,6 +6849,7 @@ msgstr "PAP/CHAP Passwort" msgid "PAP/CHAP username" msgstr "PAP/CHAP Benutzername" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "PDP-Typ" @@ -6107,8 +6859,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "PIN" @@ -6118,7 +6871,7 @@ msgstr "PIN" msgid "PIN code rejected" msgstr "PIN-Code abgelehnt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "PMK R1 Push" @@ -6159,28 +6912,37 @@ msgstr "PSID-Offset" msgid "PSID-bits length" msgstr "PSID-Bitlänge" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM (Paket-Transfer-Modus)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "PXE/TFTP-Einstellungen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "Status des Paketdienstes" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "Paket-Flusskontrolle" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "Paket-Markierung" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Empfangszeit des Pakets" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "Pakete" @@ -6189,24 +6951,31 @@ msgstr "Pakete" msgid "Packets To Transmit Before Moving To Next Slave" msgstr "Zu sendende Pakete, bevor zum nächsten Slave übergegangen wird" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "" +msgstr[1] "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Teil von Zone %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "" "Pass-through (Physischen Netzwerkadapter auf einzelnes MAC-VLAN spiegeln)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Passwort" @@ -6214,11 +6983,11 @@ msgstr "Passwort" msgid "Password authentication" msgstr "Passwortanmeldung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Passwort des privaten Schlüssels" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "Password des inneren, privaten Schlüssels" @@ -6229,50 +6998,56 @@ msgstr "Password des inneren, privaten Schlüssels" msgid "Password strength" msgstr "Passwortstärke" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "Passwort Bestätigung" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "Schlüssel einfügen oder Schlüsseldatei hereinziehen…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" -msgstr "" +msgstr "WireGuard-Peerkonfigurationsdatei (wg0.conf) einfügen oder ziehen…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" +"Fügen Sie eine WireGuard-Konfiguration (üblicherweise wg0.conf) von " +"einem anderen System ein oder ziehen Sie sie nach unten, um einen passenden " +"Peer-Eintrag zu erstellen, der diesem System erlaubt, sich mit der lokalen " +"WireGuard-Schnittstelle zu verbinden." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" +"Fügen Sie die mitgelieferte WireGuard-Konfigurationsdatei ein oder ziehen " +"Sie sie…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Pfad zum CA-Zertifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Pfad zum Client-Zertifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Pfad zum Privaten Schlüssel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Pfad zum inneren CA-Zertifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Pfad zum inneren Client-Zertifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Pfad zum inneren, privaten Schlüssel" @@ -6294,11 +7069,19 @@ msgstr "Pausiert" msgid "Peak:" msgstr "Spitze:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Gegenstelle" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Peer-Details" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Entfernte IP-Adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "Linkpartner-MAC-Adresse" @@ -6307,11 +7090,11 @@ msgstr "Linkpartner-MAC-Adresse" msgid "Peer address is missing" msgstr "Entfernte IP-Adresse fehlt" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Linkpartner-Adaptername" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Verbindungspartner deaktiviert" @@ -6342,10 +7125,14 @@ msgstr "Reset durchführen" msgid "Permission denied" msgstr "Zugriff verweigert" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Persistentes Keep-Alive" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Intervall für dauerhafte Wiederherstellung der Verbindung" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "PersistentKeepAlive-Parameter ist ungültig" @@ -6354,13 +7141,13 @@ msgstr "PersistentKeepAlive-Parameter ist ungültig" msgid "Phy Rate:" msgstr "Phy-Rate:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Physische Einstellungen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6373,11 +7160,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pkte." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Bitte Benutzernamen und Passwort eingeben." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Bitte wählen Sie die hochzuladende Datei aus." @@ -6385,56 +7172,74 @@ msgstr "Bitte wählen Sie die hochzuladende Datei aus." msgid "Policy" msgstr "Standardregel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "Grundregel: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Port-Isolation" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Port-Status:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Mögliche Negation von: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Energiesparmodus" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Präemptive CRC-Fehler (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "Energie-Zustand" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "LTE bevorzugen" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "UMTS bevorzugen" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Delegiertes Präfix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "Präfix-Unterdrückung" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Gemeinsamer Schlüssel" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "PSK in Benutzung" @@ -6459,15 +7264,18 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Unterbindet Client-Client-Verkehr" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"Verhindert die Kommunikation von WiFi-Clients untereinander. Diese " +"Einstellung betrifft nur Pakete ohne VLAN-Tag." + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Primärer Slave" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "Primäre VLAN-ID" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6483,29 +7291,31 @@ msgstr "" "Der Primäre wird immer dann zum aktiven Slave, wenn er wieder hochfährt " "(immer 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Priorität" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "Privat" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "Privat (Kommunikation zwischen MAC-VLANs unterbinden)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" -msgstr "Privater Schlüssel" +msgstr "Private Key" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "Privater Schlüssel vorhanden" @@ -6523,8 +7333,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6536,7 +7346,7 @@ msgstr "Protokoll" msgid "Provide NTP server" msgstr "NTP-Server anbieten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6544,7 +7354,7 @@ msgstr "" "Einen DHCPv6-Server auf dieser Schnittstelle zur Verfügung stellen um DHCPv6-" "Anfragen zu beantworten." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Neues Netzwerk anbieten" @@ -6556,25 +7366,36 @@ msgstr "" "NTP-Dienst nur auf der ausgewählten Schnittstelle anbieten oder, wenn " "unspezifiziert, auf allen Schnittstellen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Proxyserver" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Öffentlicher Schlüssel" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "Öffentlicher Schlüssel Fehlt" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "Öffentlicher Schlüssel: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6584,9 +7405,9 @@ msgstr "" "Öffentliche Schlüssel erlauben eine passwortlose SSH-Anmeldung mit höherer " "Sicherheit im Vergleich zur Benutzung einfacher Passwörter. Um einen neuen " "Schlüssel auf dem Gerät zu hinterlegen, kann entweder eine OpenSSH-" -"kompatible öffentliche Schlüsselzeile in das Eingabefeld kopiert, oder eine " -"eine Schlüsseldatei mit der Endung .pub in das Eingabefeld " -"gezogen werden." +"kompatible öffentliche Schlüsselzeile in das Eingabefeld kopiert oder eine " +"Schlüsseldatei mit der Endung .pub in das Eingabefeld gezogen " +"werden." #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 msgid "Public prefix routed to this device for distribution to clients." @@ -6596,7 +7417,7 @@ msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:305 msgid "PublicKey setting is invalid" -msgstr "" +msgstr "Die PublicKey-Einstellung ist ungültig" #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:9 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:27 @@ -6607,61 +7428,83 @@ msgstr "QMI Cellular" msgid "Quality" msgstr "Qualität" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." -msgstr "" -"Alle verfügbaren übergeordneten DNS-Server abfragen" +msgstr "Abfragen aller verfügbaren Upstream-Resolver." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Abfrageintervall" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Abfrage-Antwortintervall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "R0-Schlüsselgültigkeit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "R1-Schlüsselinhaber" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "RADIUS Accounting Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Radius-Accounting-Geheimnis" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "RADIUS Accounting Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "RADIUS Authentication Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Radius-Authentifizierung-Geheimnis" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "RADIUS Authentication Server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "Dynamische RADIUS-VLAN-Zuweisung" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "RADIUS pro STA-VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "RADIUS-VLAN-Bridge-Namensschema" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "RADIUS-VLAN-Benennung" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "RADIUS-VLAN-getaggte Schnittstelle" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "RFC3947 \"NAT-T\"-Modus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "RSN-Preauth" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "RSSI-Schwellwert für Assoziationen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "RTS/CTS-Schwelle" @@ -6675,10 +7518,18 @@ msgstr "RX" msgid "RX Rate" msgstr "RX-Rate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "RX-Rate / TX-Rate" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"Radio Resource Measurement (Funkressourcenmessung) - Sendet Beacons zur " +"Unterstützung des Roamings. Nicht alle Clients unterstützen dies." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6690,13 +7541,12 @@ msgstr "" "Hexadezimal-kodierte Zeichensequenz. Nur angeben wenn der Internetanbieter " "einen bestimmten Wert erwartet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" -"Lese /etc/ethers um den DHCP-Server zu konfigurieren" +"Lesen Sie /etc/ethers, um den DHCP-Server zu konfigurieren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Protokoll wirklich wechseln?" @@ -6704,11 +7554,11 @@ msgstr "Protokoll wirklich wechseln?" msgid "Realtime Graphs" msgstr "Echtzeit-Diagramme" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Reassoziierungsfrist" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "DNS-Rebind-Schutz" @@ -6732,11 +7582,39 @@ msgstr "Startet das Betriebssystem des Routers neu" msgid "Receive" msgstr "Empfangen" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Empfangene Daten" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Empfohlen. IP-Adresse der WireGuard-Schnittstelle." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Zeitüberschreitung bei der Wiederherstellung der Verbindung" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Diese Schnittstelle neu verbinden" @@ -6744,12 +7622,12 @@ msgstr "Diese Schnittstelle neu verbinden" msgid "Redirect to HTTPS" msgstr "Umleiten auf HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "Auf lokalen Port %h umleiten" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "Auf lokales System umleiten" @@ -6758,31 +7636,39 @@ msgstr "Auf lokales System umleiten" msgid "References" msgstr "Verweise" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Kanäle aktualisieren" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Aktualisierend" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "Registrierungszustand" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "IPv4-Paket mit ICMP-Typ %h ablehnen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "Paket mit ICMP-Typ %h ablehnen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "IPv6-Paket mit ICMPv6-Typ %h ablehnen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "Paket mittels TCP-Reset ablehnen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" @@ -6791,15 +7677,23 @@ msgstr "" "angegebenem Wert ablehnen" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" -msgstr "Relay" +msgstr "Relais" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:157 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:36 msgid "Relay Bridge" msgstr "Relay-Brücke" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"DHCP-Anfragen andernorts weiterleiten. OK: v4↔v4, v6↔v6. Nicht OK: v4↔v6, " +"v6↔v4." + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Zwischen folgenden Netzwerken weiterleiten" @@ -6809,6 +7703,14 @@ msgstr "Zwischen folgenden Netzwerken weiterleiten" msgid "Relay bridge" msgstr "Relay-Brücke" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6818,6 +7720,7 @@ msgstr "Entfernte IPv4-Adresse" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Entfernte IPv4-Adresse oder Hostname" @@ -6830,15 +7733,27 @@ msgstr "Remote-IPv6-Adresse" msgid "Remote IPv6 address or FQDN" msgstr "Remote-IPv6-Adresse oder FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Entfernen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" +"Entfernen Sie IPv4-Adressen aus den Ergebnissen und geben Sie nur IPv6-" +"Adressen zurück." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" +"Entfernen Sie IPv6-Adressen aus den Ergebnissen und geben Sie nur IPv4-" +"Adressen zurück." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "Zugehörige Netzwerkadaptereinstellungen aus der Konfiguration löschen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "WLAN-Konfiguration ersetzen" @@ -6868,7 +7783,8 @@ msgstr "Eingehende Prüfsumme erforderlich (optional)." msgid "Require incoming packets serialization (optional)." msgstr "Serialisierung eingehender Pakete erforderlich (optional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Erforderlich" @@ -6884,8 +7800,9 @@ msgstr "Benötigt. Base64-kodierter privater Schlüssel für diese Schnittstelle #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Required. Path to the .yml config file for this interface." msgstr "" +"Erforderlich. Pfad zu der .yml-Konfigurationsdatei für diese Schnittstelle." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "Benötigt. Öffentlicher Schlüssel des WireGuard Verbindungspartners." @@ -6897,67 +7814,75 @@ msgstr "Benötigt. Zugrundeliegende Schnittstelle." msgid "Required. XFRM interface ID to be used for SA." msgstr "Benötigt. Für die SA genutzte XFRM-Schnittstellen-ID." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" +"Erforderlich: Lehnt die Authentifizierung ab, wenn der RADIUS-Server keine " +"geeigneten VLAN-Attribute bereitstellt." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Benötigt \"hostapd\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Benötigt hostapd mit EAP Suite-B-Unterstützung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Benötigt \"hostapd\" mit EAP-Support" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Benötigt \"hostapd\" mit OWE-Support" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Benötigt \"hostapd\" mit SAE-Support" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Benötigt Hostapd mit WEP-Unterstützung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Benötigt \"wpa-supplicant\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Benötigt wpa-supplicant mit EAP Suite-B-Unterstützung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Benötigt \"wpa-supplicant\" mit EAP-Support" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Benötigt \"wpa-supplicant\" mit OWE-Support" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Benötigt \"wpa-supplicant\" mit SAE-Support" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Benötigt wpa-Supplicant mit WEP-Unterstützung" @@ -6966,7 +7891,7 @@ msgid "Reselection policy for primary slave" msgstr "Neuauswahlrichtlinie für primären Slave" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6981,20 +7906,24 @@ msgstr "Zähler zurücksetzen" msgid "Reset to defaults" msgstr "Auslieferungszustand wiederherstellen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Resolv- und Hosts-Dateien" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Resolv-Datei" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Liste von erzwungenen Domain-IP-Adressen-Zuordnungen." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Resource nicht gefunden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Neustart" @@ -7003,7 +7932,7 @@ msgstr "Neustart" msgid "Restart Firewall" msgstr "Firewall neu starten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "WLAN-Adapter neu starten" @@ -7015,90 +7944,105 @@ msgstr "Wiederherstellen" msgid "Restore backup" msgstr "Sicherung wiederherstellen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -"Hostnamen je nach anfragendem Subnetz auflösen wenn mehrere IPs verfügbar " -"sind" +"Gibt Antworten auf DNS-Anfragen zurück, die mit dem Subnetz übereinstimmen, " +"von dem die Anfrage empfangen wurde, wenn mehrere IPs verfügbar sind." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Password anzeigen/verstecken" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "Reverse-Pfad-Filter" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Verwerfen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Änderungen verwerfen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "Anforderung zum Verwerfen mit Status %h fehlgeschlagen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Verwerfe Konfigurationsänderungen…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "Revision" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "Ziel-IP auf %h umschreiben" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "Ziel-IPv6 auf %h umschreiben" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "Ziel-IP auf %h, Port %h umschreiben" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Ziel-IPv6 auf %h, Port %h umschreiben" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "Quell-IP auf %h umschreiben" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "Quell-IPv6 auf %h umschreiben" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "Quell-IP auf %h, Port %h umschreiben" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" "Quell-IPv6 auf %h, Port %h umschreiben" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "Umschreiben auf ausgehende Schnittstellen-IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" +"Robustes Sicherheitsnetzwerk (RSN): Erlaubt Roaming-Preauth für WPA2-EAP-" +"Netzwerke (und kündigt es in WLAN-Beacons an). Funktioniert nur, wenn die " +"angegebene Netzwerkschnittstelle eine Bridge ist. Verkürzt den " +"zeitkritischen Reassoziationsprozess." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Robustheit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -7116,19 +8060,19 @@ msgstr "Wurzelverzeichnis erzeugen" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Round-Robin-Richtlinie (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Erlaubte IP-Adressen routen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" -msgstr "Routing-Chain \"%h\"" +msgstr "Routing-Kette \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Routen-Typ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7148,6 +8092,10 @@ msgstr "Routerpasswort" msgid "Routing" msgstr "Routing" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Routingalgorithmus" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7162,24 +8110,24 @@ msgstr "" msgid "Rule" msgstr "Regel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "Regel-Aktionen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "Kommentar: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" -msgstr "Regel-Chain \"%h\"" +msgstr "Regel-Kette \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "Selektoren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Regeltyp" @@ -7199,11 +8147,24 @@ msgstr "Laufzeitfehler" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "SIMs" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7221,15 +8182,15 @@ msgstr "SSH-Server-Port" msgid "SSH username" msgstr "SSH Benutzername" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH-Schlüssel" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7246,7 +8207,7 @@ msgstr "SSTP-Server" msgid "SWAP" msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7257,7 +8218,7 @@ msgid "Save" msgstr "Speichern" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Speichern & Anwenden" @@ -7274,7 +8235,7 @@ msgstr "Speichere mtdblock" msgid "Save mtdblock contents" msgstr "Inhalte von mtdblock-Partitionen speichern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Suche" @@ -7283,11 +8244,16 @@ msgstr "Suche" msgid "Scheduled Tasks" msgstr "Geplante Aufgaben" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "Abschnitt %s ist leer." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Sektion hinzugefügt" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Sektion entfernt" @@ -7305,9 +8271,9 @@ msgstr "" "wenn die Formatüberprüfung fehlschlägt. Diese Option nur benutzen wenn das " "Abbild korrekt und für dieses Gerät bestimmt ist!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Datei auswählen…" @@ -7317,7 +8283,7 @@ msgstr "" "Wählt die Sende-Hash-Richtlinie aus, die für die Slave-Auswahl verwendet " "werden soll" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7325,7 +8291,7 @@ msgstr "" "RA-Nachrichten " "senden um dieses Gerät als IPv6-Router zu annoncieren." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "ICMP-Umleitungen senden" @@ -7346,11 +8312,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "Den Hostnamen dieses Gerätes senden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Server" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Serveradresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Servername" @@ -7375,16 +8345,20 @@ msgstr "Sitzung abgelaufen" msgid "Set Static" msgstr "Statisch setzen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "Header-Feld %s auf %s setzen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "Als NDP-Proxy-Nebenschnittstelle setzen. Standardmäßig deaktiviert." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7397,18 +8371,18 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "Für alle Slaves dieselbe MAC-Adresse einstellen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -"Setzt den Marker für autonome Adresskonfiguration in den Präfix-Informations-" +"Setzt den Flag für autonome Adresskonfiguration in den Präfix-Informations-" "Optionen gesendeter RA-" "Nachrichten. Wenn diese Option aktiviert ist, werden IPv6-Clients " "zustandslose, autonome Adressen-Autokonfiguration durchführen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7423,14 +8397,19 @@ msgstr "Auf aktuell aktiven Slave setzen (aktiv, 1)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:307 msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -"Auf den ersten Slave setzen, der der Bindung hinzugefügt wurde (folgen Sie, " -"2)" +"Auf den ersten Slave setzen, der der Bindung hinzugefügt wurde (folgen, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "DHCP Server einrichten" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" +"Netzwerkrouten für IPv6-Nachbarn installieren, die durch den NDP-Proxy " +"behandelt werden." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7438,57 +8417,61 @@ msgid "Setting PLMN failed" msgstr "Setzen der PLMN fehlgeschlagen" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "Setzen des Betriebsmodus fehlgeschlagen" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Einstellungen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" -"Netzwerkrouten für IPv6-Nachbarn installieren, die durch den NDP-Proxy " -"behandelt werden." - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "schwerwiegende Fehlersekunden (SES)" +"Einstellungen zur Unterstützung von Wireless-Clients beim Roaming zwischen " +"mehreren APs: 802.11r, 802.11k und 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "kurzes Guardintervall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Kurze Präambel" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Zeige aktuelle Liste der gesicherten Dateien" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 msgid "Show empty chains" -msgstr "Leere Chains anzeigen" +msgstr "Leere Ketten anzeigen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:338 msgid "Show raw counters" msgstr "Unformatierte Zähler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Diese Schnittstelle herunterfahren" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7496,15 +8479,15 @@ msgstr "Diese Schnittstelle herunterfahren" msgid "Signal" msgstr "Signal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Signal / Rauschen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Signaldämpfung (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Signalqualität" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Signal-Wiederholfrequenz" @@ -7512,12 +8495,12 @@ msgstr "Signal-Wiederholfrequenz" msgid "Signal:" msgstr "Signal:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Größe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Größe des DNS-Caches" @@ -7534,12 +8517,12 @@ msgstr "Überspringen" msgid "Skip from backup files that are equal to those in /rom" msgstr "Mit dem ROM-Speicher identische Dateien nicht sichern" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Zum Inhalt springen" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Zur Navigation springen" @@ -7557,15 +8540,10 @@ msgstr "Software-VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "Einige Felder sind ungültig, kann das Formular nicht speichern!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Entschuldigung, das anfgeforderte Objekt wurde nicht gefunden." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" -"Entschuldigung, auf dem Server ist ein unerwarteter Fehler aufgetreten." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7576,8 +8554,8 @@ msgstr "" "geflasht werden. Weitere Informationen sowie gerätespezifische " "Installationsanleitungen entnehmen Sie bitte dem Wiki." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7604,7 +8582,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "Quell-Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7612,7 +8590,7 @@ msgstr "" "Spezielle PXE-Boot-" "Optionen für Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7620,7 +8598,7 @@ msgstr "" "Setzt eine statische Liste von DNS-Suchdomänen welche via DHCPv6 annonciert " "werden. Bei leerer Liste wird die lokale Suchdomäne des Gerätes annonciert." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7631,7 +8609,7 @@ msgstr "" "Server annoncieren, außer die Lokaler IPv6-DNS-Server-Option ist " "deaktiviert." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7662,7 +8640,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "Gibt die Häufigkeit der MII-Verbindungsüberwachung in Millisekunden an" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "Spezifiziert den zu selektierenden TOS-Wert in IP-Headern" @@ -7670,7 +8648,7 @@ msgstr "Spezifiziert den zu selektierenden TOS-Wert in IP-Headern" msgid "Specifies the aggregation selection logic to use" msgstr "Gibt die zu verwendende Aggregationsauswahllogik an" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "Spezifiziert das zu selektierende Ziel-Subnetz (CIDR-Notation)" @@ -7678,17 +8656,17 @@ msgstr "Spezifiziert das zu selektierende Ziel-Subnetz (CIDR-Notation)" msgid "Specifies the directory the device is attached to" msgstr "Nennt das Verzeichnis, an welches das Gerät angebunden ist" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" "Konfiguriert die in RA-" -"Nachrichten gesendeten Marker, z.B. um Clients anzuweisen, weitere " +"Nachrichten gesendeten Flags, z.B. um Clients anzuweisen, weitere " "Information mittels DHCPv6-Anfragen zu beziehen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" @@ -7697,7 +8675,7 @@ msgstr "" "z.B. 0xFF für Markierung 255 oder 0x0/0x1 um jede gerade Markierung zu " "erfassen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "Spezifiziert den eingehenden logischen Schnittstellenname" @@ -7733,7 +8711,7 @@ msgstr "" "Spezifiziert die maximale Anzahl an Sekunde nach denen Hoss als tot erachtet " "werden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7756,7 +8734,7 @@ msgid "Specifies the mode to be used for this bonding interface" msgstr "" "Gibt den Modus an, der für diese Bonding-Schnittstelle verwendet werden soll" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7799,15 +8777,15 @@ msgstr "" "Gibt die Anzahl der Sekunden zwischen Instanzen an, in denen der " "Bindungstreiber Lernpakete an jeden Peer-Switch des Slaves sendet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "Spezifiziert die Reihenfolge von IP-Regeln" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "Spezifiziert den ausgehenden logischen Schnittstellennamen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7834,19 +8812,19 @@ msgstr "" "Gibt die Neuauswahlrichtlinie für den primären Slave an, wenn ein Ausfall " "des aktiven Slaves oder eine Wiederherstellung des primären Slaves auftritt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "Spezifiziert die zu benutzende Routen-Metrik" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "Spezifiziert den Typ der zu erstellenden Route" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "Spezifiziert die Routing-Aktion dieser IP-Regel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "Spezifiziert das zu selektierende Quell-Subnetz (CIDR-Notation)" @@ -7870,7 +8848,7 @@ msgstr "" "Gibt die Zeit in Millisekunden an, die gewartet werden soll, bevor ein Slave " "nach einer Verbindungswiederherstellungserkennung aktiviert wird" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7940,10 +8918,9 @@ msgid "" "header inherits the value of the inner header) or an hexadecimal value " "00..FF (optional)." msgstr "" -"Konfiguriert einen festen TOS-Code. " -"Mögliche Werte sind inherit um den TOS-Code für den äußeren " -"Header aus dem gekapselten Paket-Header zu kopieren oder ein hexadezimaler " -"Wert im Bereich 00..FF." +"Geben Sie einen TOS (Type of Service) an. Kann inherit sein " +"(der äußere Header erbt den Wert des inneren Headers) oder ein hexadezimaler " +"Wert 00..FF (optional)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:74 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:74 @@ -7972,10 +8949,9 @@ msgid "" "inherits the value of the inner header) or an hexadecimal value 00.." "FF (optional)." msgstr "" -"Konfiguriert einen festen TOS-Code. " -"Mögliche Werte sind inherit um den TOS-Code für den äußeren " -"Header aus dem gekapselten Paket-Header zu kopieren oder ein hexadezimaler " -"Wert im Bereich 00..FF." +"Geben Sie eine Verkehrsklasse an. Kann inherit sein (der äußere " +"Header erbt den Wert des inneren Headers) oder ein hexadezimaler Wert " +"00..FF (optional)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 @@ -7996,15 +8972,23 @@ msgstr "" "Setzt eine spezifische MTU (Maximum Transmission Unit) abweichend von den " "standardmäßigen 1280 Bytes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Geben Sie hier den geheimen Netzwerkschlüssel an." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "ADSL ohne Splitter (G.992.2) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "Gültigkeitsdauer alter Neighbour-Cache-Einträge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Start" @@ -8017,16 +9001,16 @@ msgstr "WPS starten" msgid "Start priority" msgstr "Startpriorität" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Aktualisierungen aktivieren" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Starte Anwendung der Konfigurationsänderungen…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Starte WLAN Scan..." @@ -8035,6 +9019,10 @@ msgstr "Starte WLAN Scan..." msgid "Startup" msgstr "Systemstart" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Zustand" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Statische IPv4 Routen" @@ -8048,7 +9036,7 @@ msgstr "Statische IPv6 Routen" msgid "Static Lease" msgstr "Statische Reservierung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Statische Einträge" @@ -8058,7 +9046,7 @@ msgstr "Statische Einträge" msgid "Static address" msgstr "Statische Adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -8069,18 +9057,18 @@ msgstr "" "Schnittstellenkonfigurationen benötigt auf denen lediglich Hosts mit " "zugehörigem statischem Lease-Eintrag bedient werden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Client-Inaktivitäts-Limit" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Stopp" @@ -8089,20 +9077,20 @@ msgstr "Stopp" msgid "Stop WPS" msgstr "WPS stoppen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Aktualisierungen deaktivieren" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:24 msgid "Storage" -msgstr "Speicher" +msgstr "Datenspeicher" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "strikte Filterung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Strikte Reihenfolge" @@ -8111,18 +9099,18 @@ msgid "Strong" msgstr "Stark" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Absenden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Logeinträge unterdrücken" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" -"Logeinträge für erfolgreiche Operationen dieser Protokolle unterdrücken" +"Unterdrücken der Protokollierung des Routinebetriebs für das DHCP-Protokoll." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:46 msgid "Swap free" @@ -8153,7 +9141,7 @@ msgstr "Switch-VLAN" msgid "Switch port" msgstr "Switch-Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Wechsle Protokoll" @@ -8163,7 +9151,7 @@ msgstr "Wechsle Protokoll" msgid "Switch to CIDR list notation" msgstr "Auf CIDR-Listen-Notation wechseln" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Symbolischer Link" @@ -8175,8 +9163,16 @@ msgstr "Mit NTP-Server synchronisieren" msgid "Sync with browser" msgstr "Mit Browser synchronisieren" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Syntax: /fqdn[/fqdn…]/[IP-adr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Syntax: _dienst._proto.beispiel.de." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -8200,9 +9196,9 @@ msgstr "Systemeigenschaften" msgid "System log buffer size" msgstr "Größe des Systemprotokoll-Puffers" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "System läuft im Wiederherstellungsmodus (initramfs-Modus)." @@ -8231,7 +9227,7 @@ msgstr "TCP-Quell-Port" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "TFTP Wurzelverzeichnis" @@ -8245,26 +9241,37 @@ msgstr "TX" msgid "TX Rate" msgstr "TX-Rate" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "Sendewarteschlangenlänge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tabelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Markiert" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Ziel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "Platform" @@ -8280,7 +9287,7 @@ msgstr "Temporärer Speicher" msgid "Terminate" msgstr "Beenden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8290,7 +9297,7 @@ msgstr "" "RA-Nachrichten " "annonciert wird. Minimum ist 1280 Byte." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." @@ -8298,7 +9305,7 @@ msgstr "" "Das Flag für Gemanagte Addresskonfiguration (M) gibt an, dass IPv6-" "Adressen via DHCPv6 zur Verfügung gestellt werden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -8306,7 +9313,7 @@ msgstr "" "Das Flag für Mobile IPv6 Home Agent (H) gibt an, dass das Gerät auf " "dieser Schnittstelle als Mobile-IPv6-Home-Agent operiert." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8327,13 +9334,17 @@ msgstr "" "Das qrencode-Paket wird benötigt um einen QR-Code der Konfiguration " "zu generieren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" msgstr "" -"Die DNS-Server-Einträge in der lokalen resolv.conf Datei werden primär nach " -"der hier angegebenen Gewichtung sortiert." +"Die DNS-Server-Einträge in der lokalen resolv.conf werden vorrangig nach der " +"hier angegebenen Gewichtung sortiert" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:77 msgid "" @@ -8343,19 +9354,25 @@ msgstr "" "Die Updateprozedur für HE.net Tunnel-IP-Adrerssen hat sich geändert, statt " "der numerischen User-ID muss nun der normale Benutzername angegeben werden!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" "Die IP-Adresse %h wird bereits von einem anderem statischen Lease verwendet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "Die IP-Adresse liegt außerhalb jedes DHCP-Adressbereiches" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "Die IP-Adresse des Boot-Servers" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -8365,6 +9382,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -8384,6 +9402,12 @@ msgstr "" "Die IPv6-Adresse oder der vollständig qualifizierte Domänenname des Remote-" "Tunnel-Ends." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8394,9 +9418,9 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:7 msgid "The LED blinks with the configured on/off frequency" -msgstr "Die LED blinkt mit der konfigurierten an/aus Frequenz." +msgstr "Die LED blinkt mit der konfigurierten an/aus Frequenz" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "Die LED blinkt um einen System-Heartbeat abzubilden." @@ -8414,7 +9438,7 @@ msgstr "Der LED-Grundzustand ist immer aus." msgid "The LED is always in default state on." msgstr "Der LED-Grundzustand ist immer an." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" @@ -8422,16 +9446,20 @@ msgstr "" "Die MAC-Adresse %h wird bereits von einem anderen statischen Lease im selben " "DHCP-Pool verwendet" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" "Die MTU darf nicht die %d Byte MTU des übergeordneten Gerätes überschreiten" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "Die VLAN-ID muss eindeutig sein" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "Der Algorithmus der für die Erkundung von Mesh-Routen genutzt wird" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8445,7 +9473,7 @@ msgstr "" "Die Konfigurationsdatei konnte aufgrund der folgenden Fehler nicht geladen " "werden:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8453,7 +9481,7 @@ msgstr "" "Bei der Verbindung zu einem versteckten Netzwerk muss die korrekte SSID " "manuell angegeben werden" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8481,12 +9509,12 @@ msgstr "" "Die Gerätedatei des Speichers oder der Partition (z.B.: /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "Der Adaptername \"%s\" ist bereits vergeben" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." @@ -8494,7 +9522,7 @@ msgstr "" "Die existierende Netzwerkkonfiguration muss angepasst werden, damit LuCI " "korrekt funktioniert." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8517,7 +9545,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Die folgenden Regeln sind zur Zeit auf dem System aktiv." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" "Die Frequenz ist direkt proportional zur durchschnittlichen einminütigen CPU-" @@ -8527,19 +9555,19 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "Das Gateway darf keine lokale IP-Addresse des Routers sein" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" "Die generierte Konfiguration kann in eine WireGuard-Client-Applikation " "importiert werden um eine Verbindung zu diesem Gerät aufzubauen." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "Der angegebene öffentliche SSH-Schlüssel wurde bereits hinzugefügt." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8547,15 +9575,36 @@ msgstr "" "Der angegebene öffentliche SSH Schlüssel ist ungültig, bitte OpenSSH-" "kompatible öffentliche RSA oder ECDSA-Schlüssel verwenden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"Die Hop-Penalty erlaubt es die Präferenz von längeren Multi-Hop-Routen in " +"Relation zu kurzen Routen zu beeinflussen. Der Penalty-Wert wird auf den TQ-" +"Wert jeder weitergeleiteten Originator-Nachricht angewendet um die Kosten " +"eines weiteren Hops zu propagieren (Pakete müssen empfangen und " +"weitergesendet werden, was Funkspektrumszeit kostet)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "Der Hostname des Boot-Servers" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "Die Schnittstelle konnte nicht gefunden werden" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Der Schnittstellenname wird bereits verwendet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Der Schnittstellenname ist zu lang" @@ -8580,6 +9629,7 @@ msgstr "Die lokale IPv4-Adresse" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "Die lokale IPv4-Adresse über die der Tunnel aufgebaut wird (optional)." @@ -8594,7 +9644,7 @@ msgstr "Die lokale IPv4-Netzmaske" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "Die lokale IPv6-Adresse, über die der Tunnel erstellt wird (optional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8602,14 +9652,14 @@ msgid "" "\"leave latency\" of the network. A reduced value results in reduced time to " "detect the loss of the last member of a group" msgstr "" -"Die maximale Antwortzeit in Hundertstelsekunden welche in gruppenspezifische " -"Antworten zu Leave-Group-Nachrichten eingefügt wird. Dies ist also der " -"Zeitabstand zwischen gruppenspezifischen Anfrage-Nachrichten. Der Wert kann " -"verändert werden um die \"Verlassen-Latenz\" des Netzwerkes zu beeinflussen. " -"Ein reduzierter Wert resultiert in einer schnelleren Erkennung des Verlustes " -"des letzten Mitglieds einer Gruppe." +"Die maximale Antwortzeit in Hundertstelsekunden, welche in " +"gruppenspezifische Antworten zu Leave-Group-Nachrichten eingefügt wird. Dies " +"ist also der Zeitabstand zwischen gruppenspezifischen Anfrage-Nachrichten. " +"Der Wert kann verändert werden, um die \"leave-Latenz\" des Netzwerkes zu " +"beeinflussen. Ein reduzierter Wert resultiert in einer schnelleren Erkennung " +"des Verlustes des letzten Mitglieds einer Gruppe" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8620,9 +9670,9 @@ msgstr "" "periodische Abfragen eingefügt wird. Durch Variation dieses Wertes können " "die Lastspitzen von IGMP Nachrichten im Subnetz beeinflusst werden - größere " "Werte sorgen für kleinere Lastspitzen, da Host-Antworten über einen größeren " -"Zeitinterval verteilt gesendet werden." +"Zeitinterval verteilt gesendet werden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8631,7 +9681,7 @@ msgstr "" "Advertisement\">RA-Nachrichten annonciert werden. Maximum ist 255 " "Hops." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." @@ -8639,7 +9689,7 @@ msgstr "" "Der Netzwerkzugriff auf dieses Gerät könnte durch die geänderten " "Einstellungen der \"%h\" Schnittstelle unterbrochen werden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Der Netzwerkname wird bereits verwendet" @@ -8660,7 +9710,7 @@ msgstr "" "einen Uplink-Port für eine Verbindung zum nächst größeren Netzwerk wie dem " "Internet und andere Ports für ein lokales Netzwerk." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " @@ -8670,7 +9720,7 @@ msgstr "" "Gegenstelle verbinden soll. Das sollte üblicherweise eine öffentliche " "statische IP-Adresse, ein statischer Hostname oder eine DDNS-Domain sein." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" "Der Abfrage-Antwortintervall muss kleiner als der Abfrageintervall sein" @@ -8684,7 +9734,7 @@ msgstr "Der Neustartbefehl ist mit dem Code %d fehlgeschlagen" msgid "The restore command failed with code %d" msgstr "Der Wiederherstellungsbefehl ist mit dem Code %d fehlgeschlagen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8692,18 +9742,18 @@ msgid "" msgstr "" "Der Robustheitswert erlaubt die Anpassung an im Netzwerk zu erwartenden " "Paketverlust. Wenn ein Netzwerk sehr verlustbehaftet ist, kann der " -"Robustheitswert erhöht werden. IGMP ist bis zu Robustheitswert - 1 " -"Paketverlusten stabil." +"Robustheitswert erhöht werden. IGMP ist bis zu Robustheitswert - 1 " +"Paketverlusten stabil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" "Das Regelziel ist ein Sprung zu einer anderen durch den Prioritätswert " -"spezifizierten Regel." +"spezifizierten Regel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8714,13 +9764,13 @@ msgstr "" "deklarierter Name. Die speziellen Namen \"local\" (255), \"main\" (254) und " "\"default\" (253) sind auch möglich" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" "Der ausgewählte \"%s\" Betriebsmodus ist nicht kompatibel mit %s-" "Verschlüsselung" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" "Das mitgesendete Sicherheits-Token ist ungültig oder bereits abgelaufen!" @@ -8762,6 +9812,14 @@ msgstr "Das Systempasswort wurde erfolgreich geändert." msgid "The sysupgrade command failed with code %d" msgstr "Der Befehl sysupgrade ist mit dem Code %d fehlgeschlagen" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8791,12 +9849,20 @@ msgstr "" "Das hochgeladene Firmware-Image hat ein nicht unterstütztes Format. Stellen " "Sie sicher dass Sie das generische Format für Ihre Platform gewählt haben." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "Dieser Wert ist durch Konfiguration überschrieben. Originalwert: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "Dieser Wert ist durch Konfiguration überschrieben." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" +"Der Wert gibt den Zeitintervall in Millisekunden an, in dem batman-adv das " +"Netzwerk mit Protokollinformationen flutet." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8805,19 +9871,20 @@ msgstr "" "iptables und nftables-Regeln wird nicht empfohlen und könnte zur " "unvollständigen Filterung von Netzwerkverkehr führen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Es gibt keine aktiven Leases" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Es gibt keine anzuwendenden Änderungen" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8830,18 +9897,18 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "IPv4-Adresse des Relais" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" "Dieser Authentifizierungstyp ist nicht mit der ausgewählten EAP-Methode " "kombinierbar." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Dies scheint keine gültige PEM-Datei zu sein" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8861,6 +9928,24 @@ msgstr "" "wurde oder das normale Account-Passwort wenn kein separater Schlüssel " "gesetzt wurde" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Die batman-adv Gerätedatei identifiziert das Mesh an dass die oben gewählte " +"physische Schnittstelle gebunden werden soll. Wenn keine batman-adv Geräte " +"aufgeführt werden, muss zuerst ein batman-adv-Netzwerk erzeugt werden. Wenn " +"Mesh-Verkehr über eine kabelgebundene Schnittstelle fließen soll, dann diese " +"Schnittstelle in der obigen Geräteauswahl wählen. Für drahtlose " +"Schnittstellen die Geräteauswahl leer lassen und dieses logische Netzwerk " +"als Netzwerk in den Einstellungen der gewünschten WiFi-Schnittstelle wählen." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8877,11 +9962,9 @@ msgstr "" "Dies ist die lokale, vom Broker zugewiesene IPv6-Adresse, sie endet " "üblicherweise mit ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." -msgstr "" -"Dies ist der einzige DHCP-Server im lokalen Netzwerk" +msgstr "Dies ist der einzige DHCP-Server im lokalen Netz." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "This is the plain username for logging into the account" @@ -8914,8 +9997,8 @@ msgstr "" "Diese Tabelle gibt einen Überblick über die aktuell laufenden Systemprozesse " "und deren Status." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8932,35 +10015,43 @@ msgstr "Dieser Abschnitt enthält noch keine Werte" msgid "Time Synchronization" msgstr "Zeitsynchronisation" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Zeitankündigung" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "Zeit in Millisekunden" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" "Anzahl Sekunden, die in den STP Listening- und Learning-Zuständen verharrt " "wird" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Zeitintervall für die Neubestimmung des Gruppenschlüssels" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Zeitzone" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "Zeitüberschreitung" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "Gültigkeitsdauer in Sekunden" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" "Gültigkeitsdauer in Sekunden für gelernte MAC-Adressen in der " "Weiterleitungsdatenbank" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" "Gültigkeitsdauer in Sekunden bis zur Aktualisierung der Topologie bei " @@ -8970,7 +10061,7 @@ msgstr "" msgid "Timezone" msgstr "Zeitzone" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the Konfigurationsimport." -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Zum Login…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8996,20 +10083,24 @@ msgstr "" "Auslieferungszustand des Systems wieder her (nur möglich bei squashfs-" "Images)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Ton" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:35 msgid "Total Available" -msgstr "Gesamt verfügbar" +msgstr "Verfügbar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Routenverfolgung" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "Tracking-Vorwahl" + # Ich bin der Meinung Traffic versteht jeder! Wenn der Begriff "deutscher" sein soll, würde ich "Datenmenge" angeben. Aber "Verkehrs" passt nicht! #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 @@ -9022,11 +10113,11 @@ msgstr "Traffic" msgid "Traffic Class" msgstr "Traffic-Klasse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" -msgstr "Filter-Chain \"%h\"" +msgstr "Filter-Kette \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "Durch die Regel erfasster Verkehr: %.1000mPackets, %.1024mBytes" @@ -9043,6 +10134,26 @@ msgstr "Senden" msgid "Transmit Hash Policy" msgstr "Hash-Richtlinie übertragen" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Übertragene Daten" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -9081,7 +10192,7 @@ msgstr "Tunneladapter" msgid "Tunnel Link" msgstr "Basisschnittstelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Tunneladapter" @@ -9090,13 +10201,13 @@ msgid "Tx-Power" msgstr "Sendestärke" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Typ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Art des Dienstes" @@ -9145,7 +10256,7 @@ msgstr "Externe IP-Adresse konnte nicht bestimmt werden" msgid "Unable to determine upstream interface" msgstr "Upstream-Netzwerkadapter konnte nicht bestimmt werden" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Kann Anfrage nicht zustellen" @@ -9196,19 +10307,31 @@ msgstr "Neustart der Firewall nicht möglich" msgid "Unable to save contents: %s" msgstr "Inhalt kann nicht gespeichert werden: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Nicht verfügbare Sekunden (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "PIN kann nicht verifiziert werden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Dekonfigurieren" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Unerwartetes Antwortdatenformat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -9226,7 +10349,7 @@ msgstr "" msgid "Unknown" msgstr "Unbekannt" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Unbekannte und nicht unterstützte Verbindungsmethode." @@ -9250,11 +10373,11 @@ msgstr "Ignoriert" msgid "Unmount" msgstr "Aushängen" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Unbenannter Schlüssel" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Ungespeicherte Änderungen" @@ -9268,15 +10391,25 @@ msgid "Unsupported MAP type" msgstr "Nicht unterstützter MAP-Typ" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Nicht unterstütztes Modem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Nicht unterstütztes Protokoll" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Nicht unterstützter Protokolltyp." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Unmarkiert" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "Unbenannter Verbindungspartner" @@ -9288,7 +10421,7 @@ msgstr "Hoch" msgid "Up Delay" msgstr "Up Delay" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Hochladen" @@ -9305,25 +10438,29 @@ msgstr "" msgid "Upload archive..." msgstr "Backup wiederherstellen..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Datei hochladen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Datei hochladen…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "Hochladen wurde abgebrochen" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Upload-Anfrage fehlgeschlagen: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Datei wird hochgeladen…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9333,7 +10470,7 @@ msgstr "" "Konfiguration mit Namen in der Form wifinet# versehen und das " "Netzwerk wird neu gestartet um die geänderte Konfiguration anzuwenden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -9341,7 +10478,7 @@ msgstr "" "Beim Fortfahren wird die Konfiguration von Netzwerkbrücken angepasst und das " "Netzwerk neu gestartet um die Veränderungen anzuwenden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -9349,21 +10486,24 @@ msgstr "" "Beim Fortfahren werden \"ifname\"-Option umbenannt und das Netzwerk neu " "gestartet um die Veränderungen anzuwenden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" -"DNS-Server in der Reihenfolge der " -"Resolv-Datei abfragen" +"Upstream-Resolver werden in der Reihenfolge der Auflösungsdatei abgefragt." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Laufzeit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Verwende /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "DHCP verwenden" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "DHCP beworbene Server verwenden" @@ -9372,13 +10512,18 @@ msgstr "DHCP beworbene Server verwenden" msgid "Use DHCP gateway" msgstr "Benutze DHCP-Gateway" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "DHCPv6 verwenden" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Benutze die von der Gegenstelle zugewiesenen DNS-Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Muss ein ISO/IEC 3166 Länderkürzel sein." @@ -9427,22 +10572,25 @@ msgstr "Als Root-Dateisystem benutzen (/)" msgid "Use broadcast flag" msgstr "Benutze Broadcast-Flag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Eingebautes IPv6-Management nutzen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Benutze eigene DNS-Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Benutze Standard-Gateway" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Benutze Gateway-Metrik" @@ -9468,15 +10616,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "Gleiche Quelle, gleiches Ziel für jede Verbindung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Benutze System-Zertifikate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "Benutze Systemzertifikate für inneren Tunnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9507,11 +10655,11 @@ msgstr "" msgid "Used" msgstr "Belegt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Benutzer Schlüsselindex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9519,59 +10667,61 @@ msgstr "" "Wird für zwei verschiedene Zwecke verwendet: RADIUS NAS ID und 802.11r R0KH-" "ID. Nicht erforderlich mit normalem WPA(2)-PSK." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Benutzergruppe" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "PEM-kodiertes Benutzerzertifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "Benutzerkennung" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "PEM-kodierter Benutzerschlüssel" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Benutzername" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "Flow-Tabelle %h nutzen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (Virtueller Ethernet-Portaggregator)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "VLAN-ID" @@ -9591,24 +10741,27 @@ msgstr "Lokale VPN-Adresse" msgid "VPN Local port" msgstr "Lokaler VPN-Port" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "VPN-Protokoll" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPN-Server" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "SHA256-Hash des VPN-Serverzertifikats" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "VPN-Server Port" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "SHA1-Hash des VPN-Server-Zertifikates" @@ -9617,6 +10770,10 @@ msgstr "SHA1-Hash des VPN-Server-Zertifikates" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (VPN für CISCO 3000 und Ähnliche)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9630,16 +10787,16 @@ msgstr "VXLAN-Netzwerkkennung" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -"Setzt DNSSEC-Unterstützung im DNS-Zielserver vorraus; überprüft ob " -"unsignierte Antworten wirklich von unsignierten Domains kommen" +"DNS-Antworten validieren und DNSSEC-Daten zwischenspeichern; erfordert " +"Upstream, um DNSSEC zu unterstützen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9667,7 +10824,7 @@ msgstr "Hersteller" msgid "Vendor Class to send when requesting DHCP" msgstr "Bei DHCP-Anfragen gesendete Vendor-Klasse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" "Prüfen das nicht signierte Domain-Antworten tatsächlich von unsignierten " @@ -9677,12 +10834,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Überprüfen der hochgeladenen Firmware-Datei." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Sehr Hoch" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Virtuelles Ethernet" @@ -9690,34 +10847,46 @@ msgstr "Virtuelles Ethernet" msgid "Virtual dynamic interface" msgstr "Virtuelle dynamische Schnittstelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "WEP Open System" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "WEP Shared Key" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "WEP Schlüssel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "WLAN-Roaming" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "WMM Modus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "WNM-Schlafmodus" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "WNM-Schlafmodus-Korrekturen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "WPA Schlüssel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9748,7 +10917,17 @@ msgstr "" msgid "Weak" msgstr "Schwach" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Gewichtung" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." @@ -9757,7 +10936,25 @@ msgstr "" "werden Schnittstellen mit einem höheren Präferenzwert bei der Allokation von " "Subnetzen priorisiert." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Der WiFi-Durchsatz wird durch den Einsatz von Netzwerkcodierung erhöht in " +"dem mehrere Netzwerkpakete zu einzelnen WiFi-Paketen zusammengefasst werden " +"um Funkspektrumszeit durch die Reduktion von Transmissionen zu sparen." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Die verteile ARP-Tabelle bildet einen Mesh-weiten ARP-Cache welcher nicht-" +"Mesh-Clients eine schnellere und zuverlässigere ARP-Auflösung ermöglicht." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" @@ -9765,7 +10962,34 @@ msgstr "" "Markiert das Gateway als On-Link auch wenn es nicht in den Schnittstellen-" "Präfixbereich fällt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Wenn aktiviert, werden neue ARP-Tabelleneinträge aus empfangenen gratuitous " +"APR-Anfragen oder -Antworten hinzugefügt, andernfalls werden nur bereits " +"vorhandene Tabelleneinträge aktualisiert, aber keine neuen Hosts gelernt." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Im umgekehrten Zustand leuchtet die LED kontinuierlich und flackert, anstatt " +"dass sie standardmäßig ausgeschaltet ist und bei Systemaktivität blinkt." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Wenn das Mesh über mehrere WiFi-Schnittstellen pro Knoten betrieben wird, " +"kann batman-adv mittels Bonding Verkehrsströme optimieren um den Durchsatz " +"zu maximieren." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9775,7 +10999,7 @@ msgstr "" "generiert werden. Wenn diese Option aktiviert ist, werden die nachfolgenden " "R0/R1-Schlüsseloptionen nicht verwendet." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9783,25 +11007,34 @@ msgstr "" "Wenn WMM deaktiviert ist, " "könnten Clients auf 802.11a bzw. 802.11g-Raten limitiert werden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" "Wenn die ESSID versteckt ist, kann Client-Roaming behindert werden und sich " -"die Effizienz der Übertragungen im Funkspektrum signifikant reduzieren" +"die Effizienz der Übertragungen im Funkspektrum signifikant reduzieren." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Breite" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "WireGuard-Status" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" -msgstr "WireGuard VPN" +msgstr "WireGuard-VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "WireGuard-Verbindungspartner ist deaktiviert" @@ -9817,21 +11050,21 @@ msgid "Wireless Adapter" msgstr "WLAN-Gerät" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "WLAN-Netzwerk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "WLAN-Übersicht" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "WLAN-Verschlüsselung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "WLAN-Konfiguration migrieren" @@ -9847,17 +11080,17 @@ msgstr "WLAN ist deaktiviert" msgid "Wireless is not associated" msgstr "WLAN ist nicht assoziiert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Das WLAN-Netzwerk ist deaktiviert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Das WLAN-Netzwerk ist aktiviert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." -msgstr "Empfangene DNS-Anfragen in das Systemprotokoll schreiben" +msgstr "Empfangene DNS-Abfragen in das Systemprotokoll schreiben." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:181 msgid "Write system log to file" @@ -9867,7 +11100,7 @@ msgstr "Systemprotokoll in Datei schreiben" msgid "XOR policy (balance-xor, 2)" msgstr "XOR-Richtlinie (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9896,8 +11129,21 @@ msgstr "" ">Warnung: Wenn essentielle Startscripte wie \"network\" deaktiviert " "werden könnte das Gerät unerreichbar werden!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Sie können mehrere Datensätze für dasselbe Ziel hinzufügen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Sie können mehrere Einträge für dieselbe Domäne hinzufügen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" +"Sie können mehrere eindeutige Relay To für dieselbe Listen-Adr hinzufügen." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9932,34 +11178,56 @@ msgstr "ZRAM Einstellungen" msgid "ZRam Size" msgstr "ZRAM Größe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, ... . (Hinweis: _http ist " +"zwar möglich, aber kein Browser unterstützt SRV-Einträge)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "beliebig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" -msgstr "automatisch" +msgstr "Automatisch" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automatisch (deaktiviert)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automatisch (aktiviert)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "überbrückt" @@ -10016,25 +11284,30 @@ msgctxt "nft unit" msgid "day" msgstr "Tag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "deaktivieren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "deaktiviert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "Treiber-Standardwert" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "Standardwert des Treibers (%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "Beispiel: --proxy 10.10.10.10" @@ -10043,14 +11316,23 @@ msgstr "Beispiel: --proxy 10.10.10.10" msgid "e.g: dump" msgstr "z.B.: abwerfen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "aktiviert" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "alle %ds" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "abgelaufen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "erzwungen" @@ -10060,22 +11342,22 @@ msgstr "erzwungen" msgid "forward" msgstr "weitergeleitet" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "Voll-Duplex" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "Halb-Duplex" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "hexadezimal kodierten Wert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "versteckt" @@ -10084,9 +11366,9 @@ msgctxt "nft unit" msgid "hour" msgstr "Stunde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "hybrider Modus" @@ -10094,6 +11376,10 @@ msgstr "hybrider Modus" msgid "ignore" msgstr "ignorieren" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -10108,11 +11394,19 @@ msgstr "Schlüssel zwischen 8 und 63 Zeichen" msgid "key with either 5 or 13 characters" msgstr "Schlüssel mit exakt 5 oder 13 Zeichen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "gemanagte Konfiguration (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "mittlere Sicherheit" @@ -10121,11 +11415,11 @@ msgctxt "nft unit" msgid "minute" msgstr "Minute" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "Minuten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "Mobile-Home-Agent (H)" @@ -10137,18 +11431,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "nein" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "nicht verbunden" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "keine Überschreibung" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "nicht-leeren Wert" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "kein" @@ -10159,20 +11461,20 @@ msgid "not present" msgstr "nicht vorhanden" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "aus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "bei verfügbarem Präfix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "Offenes Netzwerk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "andere Konfiguration (O)" @@ -10181,6 +11483,10 @@ msgstr "andere Konfiguration (O)" msgid "output" msgstr "ausgehend" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "seit über einem Tag" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -10198,23 +11504,35 @@ msgstr "positive Ganzzahl" msgid "random" msgstr "zufällig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "zufällig erzeugt" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" +"Reduziert den Overhead durch Sammeln und Aggregieren von Originator-" +"Nachrichten in einzelnen Paketen statt dem Senden und Weiterleiten vieler " +"kleiner Pakete" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "Relay-Modus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "geroutet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "Sekunden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "Server-Modus" @@ -10222,7 +11540,7 @@ msgstr "Server-Modus" msgid "sstpc Log-level" msgstr "sstpc Log-Level" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "hohe Sicherheit" @@ -10230,7 +11548,7 @@ msgstr "hohe Sicherheit" msgid "tagged" msgstr "markiert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "Zeiteinheiten (TUs / 1024 ms) [1000-65535]" @@ -10244,25 +11562,27 @@ msgstr "" "HTTPS " "Netzwerkzugriff." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "eindeutigen Wert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "unbekannt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "Unbekannte Version" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "unlimitiert" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -10284,8 +11604,8 @@ msgid "untagged" msgstr "unmarkiert" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "gültige IP-Adresse" @@ -10298,7 +11618,7 @@ msgid "valid IPv4 CIDR" msgstr "gültige IPv4-CIDR-Notation" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "gültige IPv4-Adresse" @@ -10327,7 +11647,7 @@ msgid "valid IPv6 CIDR" msgstr "gültige iPv6-CIDR-Notation" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "gültige IPv6-Adresse" @@ -10364,8 +11684,8 @@ msgstr "gültigen UCI-Bezeichner, Hostnamen oder IP-Adresse" msgid "valid address:port" msgstr "gültige \"Adresse:Port\" Notation" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "gültiges Datum (JJJJ-MM-DD)" @@ -10405,11 +11725,23 @@ msgstr "gültige Ganzzahl" msgid "valid multicast MAC address" msgstr "gültige Multicast-MAC-Adresse" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"gültiger Netzgerätename zwischen 1 und 15 Zeichen, der weder \":\", \"/\", " +"\"%\", noch Leerzeichen enthält" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "gültiger Name des Netzwerkgeräts, nicht \".\" oder \"..\"" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "gültiges Netzwerk in \"Addresse/Netzmaske\" Notation" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "gültige Telefonnummernziffer (0-0, \"*\", \"#\", \"!\" oder \".\")" @@ -10419,43 +11751,43 @@ msgid "valid port or port range (port1-port2)" msgstr "gültigen Netzwerkport oder Port-Bereich (von-bis)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "gültigen Netzwerkport" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "gültige Zeit (SS:MM:ss)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "Wert zwischen %d und %d Zeichen" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "Wert zwischen %f und %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "Wert größer oder gleich %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "Wert kleiner oder gleich %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "Wert mit %d Zeichen" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "Wert mit mindestens %d Zeichen" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "Wert mit maximal %d Zeichen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "geringe Sicherheit" diff --git a/package/luci/modules/luci-base/po/el/base.po b/package/luci/modules/luci-base/po/el/base.po index 6056492245..c9dd652657 100644 --- a/package/luci/modules/luci-base/po/el/base.po +++ b/package/luci/modules/luci-base/po/el/base.po @@ -3,33 +3,49 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:40+0200\n" -"PO-Revision-Date: 2022-11-04 10:26+0000\n" -"Last-Translator: TakissX \n" -"Language-Team: Greek \n" +"PO-Revision-Date: 2023-09-18 15:45+0000\n" +"Last-Translator: David Rapaň \n" +"Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 5.0.2\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" πίνακας \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d μη έγκυρο/α πεδίο/α" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d ώρες πριν" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d λεπτά πριν" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d δευτερόλεπτα πριν" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s δεν έχει ετικέτα σε πολλαπλά VLANs!" @@ -54,10 +70,11 @@ msgstr "(κενό)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(χωρίς προσαρτημένες διεπαφές)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d ακόμη" @@ -67,19 +84,19 @@ msgid "-- Additional Field --" msgstr "-- Επιπλέον Πεδίο --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Παρακαλώ επιλέξτε --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- προσαρμοσμένο --" @@ -105,7 +122,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = μη χρήση ορίου RSSI, 1 = μη αλλαγή της προεπιλογής του προγράμματος " @@ -120,13 +137,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Φορτίο 1 λεπτού:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "1 τιμή" msgstr[1] "%d τιμές" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "Φορτίο 15 λεπτών:" @@ -141,12 +163,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "Δεκαεξαδικό αναγνωριστικό 4 χαρακτήρων" @@ -159,46 +186,101 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Φορτίο 5 λεπτών:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" "Αναγνωριστικό 6 οκτάδων ως δεκαεξαδική συμβολοσειρά - χωρίς άνω και κάτω " "τελείες" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r Γρήγορη μετάβαση" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w Association SA Μέγιστο χρονικό όριο ερωτήματος" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11w Association SA Λήξη χρόνου επανάληψης ερωτήματος" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w Προστασία πακέτων διαχείρισης" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "Μέγιστο χρονικό όριο 802,11 w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "Χρονικό όριο επανάληψης 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "Μάσκα IPv4" @@ -210,30 +292,44 @@ msgstr "Παραμετροποίηση LED Name" msgstr "Όνομα LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-Μεσολαβητής" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" -msgstr "RA Αναγνωριστικά" +msgstr "RA Αναγνωριστικά" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA Όριο Hop" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA Διάρκεια Ζωής" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-Υπηρεσία" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ ταιριάζει σε οποιονδήποτε τομέα. /example.com/ " +"επιστρέφει το NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -279,11 +375,24 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s δεν είναι στο σύνολο %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"Ένας κόμβος batman-adv μπορεί είτε να εκτελεστεί σε λειτουργία διακομιστή " +"(μοιράζεται τη σύνδεσή του στο Διαδίκτυο με το πλέγμα) είτε σε λειτουργία " +"πελάτη (αναζήτηση για την καταλληλότερη σύνδεση στο Διαδίκτυο στο πλέγμα) ή " +"με πλήρη απενεργοποίηση της υποστήριξης πύλης (η οποία είναι η προεπιλεγμένη " +"ρύθμιση)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Υπάρχει ήδη μια διαμόρφωση για τη συσκευή \"%s\"." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Ένας φάκελος με το ίδιο όνομα υπάρχει ήδη." @@ -291,25 +400,90 @@ msgstr "Ένας φάκελος με το ίδιο όνομα υπάρχει ή msgid "A new login is required since the authentication session expired." msgstr "Απαιτείται νέα σύνδεση καθώς η συνεδρία ελέγχου ταυτότητας έληξε." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -342,29 +516,36 @@ msgstr "Η παρακολούθηση ARP δεν υποστηρίζεται γι msgid "ARP retry threshold" msgstr "Όριο επαναδοκιμών ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "Πίνακας κίνησης ARP \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Λειτουργία ασύγχρονης μεταφοράς)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "Γέφυρες ΑΤΜ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM Εικονικό Κανάλι Αναγνωριστή (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM Εικονικό μονοπάτι Αναγνωριστή (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -374,28 +555,24 @@ msgstr "" "εικονικές διεπαφές δικτύου Linux, οι οποίες μπορούν να χρησιμοποιηθούν σε " "συνδυασμό με DHCP ή PPP για την κλήση προς τον παροχέα δικτύου." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Αριθμός συσκευής ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "Αναγνωριστικό προμηθευτή συστήματος ATU-C" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Απουσία διεπαφής" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Αποδεχτείτε ερωτήματα DNS μόνο από κεντρικούς υπολογιστές των οποίων η " "διεύθυνση βρίσκεται σε τοπικό υποδίκτυο." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Αποδοχή τοπικού" @@ -404,7 +581,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Αποδοχή πακέτου" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Αποδεχτείτε πακέτα με τοπικές διευθύνσεις πηγής" @@ -412,16 +589,25 @@ msgstr "Αποδεχτείτε πακέτα με τοπικές διευθύνσ msgid "Access Concentrator" msgstr "Συγκεντρωτής Πρόσβασης" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Σημείο Πρόσβασης" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Απομόνωση σημείου πρόσβασης" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Ενέργειες" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Ενεργό" @@ -459,8 +645,8 @@ msgstr "Ενεργοί κανόνες IPv6" msgid "Active-Backup policy (active-backup, 1)" msgstr "Πολιτική Active-Backup (ενεργό αντίγραφο ασφαλείας, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -477,18 +663,18 @@ msgstr "Προσαρμοστική εξισορρόπηση φορτίου με #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Προσθήκη" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Προσθήκη ATM Bridge" @@ -508,11 +694,11 @@ msgstr "Προσθήκη ενέργειας LED" msgid "Add VLAN" msgstr "Προσθήκη VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Προσθήκη διαμόρφωσης συσκευής" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Προσθήκη διαμόρφωσης συσκευής…" @@ -520,19 +706,19 @@ msgstr "Προσθήκη διαμόρφωσης συσκευής…" msgid "Add instance" msgstr "Προσθήκη περίπτωσης" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Προσθήκη κλειδιού" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" "Προσθήκη κατάληξης τοπικού τομέα για ονόματα εξυπηρετούμενα από αρχεία hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Προσθήκη νέας διεπαφής..." @@ -540,6 +726,10 @@ msgstr "Προσθήκη νέας διεπαφής..." msgid "Add peer" msgstr "Προσθήκη ομότιμου" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Προσθήκη στο Blacklist" @@ -548,11 +738,11 @@ msgstr "Προσθήκη στο Blacklist" msgid "Add to Whitelist" msgstr "Προσθήκη στο Whitelist" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Επιπλέον αρχεία Hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Πρόσθετο αρχείο διακομιστών" @@ -569,7 +759,11 @@ msgstr "Πρόσθετο αρχείο διακομιστών" msgid "Address" msgstr "Διεύθυνση" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Οικογένεια διευθύνσεων" @@ -582,7 +776,7 @@ msgstr "Η ρύθμιση διεύθυνσης δεν είναι έγκυρη" msgid "Address to access local relay bridge" msgstr "Διεύθυνση για πρόσβαση σε την τοπική γέφυρα αναμετάδοσης" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Διευθύνσεις" @@ -591,29 +785,29 @@ msgstr "Διευθύνσεις" msgid "Administration" msgstr "Διαχείριση" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Ρυθμίσεις για προχωρημένους" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Προηγμένες επιλογές συσκευής" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Χρόνος γήρανσης" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Συνολική ισχύς μετάδοσης (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Συγκεντρωτικά μηνύματα προέλευσης" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -650,11 +844,11 @@ msgstr "Διασύνδεση Alias" msgid "Alias of \"%s\"" msgstr "Ψευδώνυμο του \"%s\"," -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Όλοι οι διακομιστές" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." @@ -662,7 +856,7 @@ msgstr "" "Κατανομή διευθύνσεων IP διαδοχικά, ξεκινώντας από τη χαμηλότερη διαθέσιμη " "διεύθυνση." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Διαδοχική κατανομή ip" @@ -672,13 +866,13 @@ msgstr "" "Επιτρέπει την εξουσιοδότηση SSH με " "κωδικό πρόσβασης" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" "Επιτρέψτε στη λειτουργία AP να αποσυνδέει STA με βάση την κατάσταση χαμηλού " "ACK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Να επιτρέπονται όλες, εκτός από αυτές στη λίστα" @@ -686,15 +880,15 @@ msgstr "Να επιτρέπονται όλες, εκτός από αυτές σ msgid "Allow full UCI access for legacy applications" msgstr "Να επιτρέπει πλήρη πρόσβαση στο UCI για παλαιές εφαρμογές" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Να επιτρέπονται οι παλαιού τύπου συνδέσεις 802.11b" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Να επιτρέπονται μόνο αυτές στην λίστα" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Να επιτρέπεται το localhost" @@ -717,20 +911,25 @@ msgid "Allow system feature probing" msgstr "Να επιτρέπεται η ανίχνευση δυνατοτήτων συστήματος" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" "Να επιτρέπεται στον χρήστη root να συνδέετε με κωδικό πρόσβασης" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Επιτρεπόμενες IPs" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "Η ρύθμιση επιτρεπόμενων IPs δεν είναι έγκυρη" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Πάντα" @@ -742,13 +941,13 @@ msgstr "Πάντα απενεργοποιημένο (kernel: none)" msgid "Always on (kernel: default-on)" msgstr "Πάντα ενεργό (kernel: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "Να στέλνετε πάντα τις Επιλογές DHCP. Μερικές φορές χρειάζεται, με π.χ. " "PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -757,10 +956,14 @@ msgstr "" "επικαλύπτει. Η χρήση αυτής της επιλογής δεν συμμορφώνεται με το IEEE " "802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "Ποσότητα ανιχνευτών Ανίχνευσης Διπλότυπων Διευθύνσεων προς αποστολή" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Παρουσιάστηκε σφάλμα κατά την αποθήκευση της φόρμας:" @@ -769,72 +972,21 @@ msgstr "Παρουσιάστηκε σφάλμα κατά την αποθήκευ msgid "An optional, short description for this device" msgstr "Μια προαιρετική, σύντομη περιγραφή για αυτήν τη συσκευή" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annex A + L + M (όλα)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Annex A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Annex A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Annex A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Annex A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Annex B (όλα)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Annex B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Annex B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Annex B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Annex J (όλα)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Annex L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Annex M (όλα)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Annex M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Ανακοινώστε αυτήν τη συσκευή ως διακομιστή DNS IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -842,7 +994,7 @@ msgstr "" "Ανακοίνωση αυτής της συσκευής ως προεπιλεγμένου δρομολογητή εάν υπάρχει μια " "τοπική προεπιλεγμένη διαδρομή IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -851,7 +1003,7 @@ msgstr "" "διαθέσιμο ένα δημόσιο πρόθεμα IPv6, ανεξάρτητα από τη διαθεσιμότητα τοπικής " "προεπιλεγμένης διαδρομής." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -859,15 +1011,15 @@ msgstr "" "Ανακοινώστε αυτήν τη συσκευή ως προεπιλεγμένο δρομολογητή ανεξάρτητα από το " "εάν υπάρχει πρόθεμα ή προεπιλεγμένη διαδρομή." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Ανακοινώμενοι τομείς DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Ανακοινώμενοιι διακομιστές IPv6 DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Ανώνυμη Ταυτότητα" @@ -879,7 +1031,7 @@ msgstr "Ανώνυμο Mount" msgid "Anonymous Swap" msgstr "Ανώνυμο Swap" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Οποιοδήποτε πακέτο" @@ -891,12 +1043,12 @@ msgstr "Οποιοδήποτε πακέτο" msgid "Any zone" msgstr "Οιαδήποτε ζώνη" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" "Εφαρμόστε τις επιλογές DHCP σε αυτό το δίκτυο. (Άδειο = όλοι οι πελάτες)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "Εφαρμογή και διατήρηση ρυθμίσεων" @@ -904,44 +1056,48 @@ msgstr "Εφαρμογή και διατήρηση ρυθμίσεων" msgid "Apply backup?" msgstr "Εφαρμογή αντιγράφου ασφαλείας;" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Η εφαρμογή του αιτήματος απέτυχε με κατάσταση %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Εφαρμογή χωρίς επαλήθευση" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Αρχιτεκτονική" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Συνδεδεμένοι Σταθμοί" @@ -950,15 +1106,15 @@ msgstr "Συνδεδεμένοι Σταθμοί" msgid "Associations" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -968,25 +1124,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Εξουσιοδότηση" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Κύριος" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Απαιτείται Εξουσιοδότηση" @@ -994,7 +1151,9 @@ msgstr "Απαιτείται Εξουσιοδότηση" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1012,7 +1171,7 @@ msgstr "" msgid "Automatically check filesystem for errors before mounting" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1034,6 +1193,10 @@ msgstr "" msgid "Automount Swap" msgstr "" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Διαθέσιμο" @@ -1052,11 +1215,15 @@ msgstr "Διαθέσιμο" msgid "Average:" msgstr "Μέσος Όρος:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1064,15 +1231,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Πίσω" @@ -1081,11 +1252,7 @@ msgstr "Πίσω" msgid "Back to Overview" msgstr "Πίσω προς Επισκόπηση" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Πίσω προς παραμετροποίηση" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1098,16 +1265,15 @@ msgid "Backup / Flash Firmware" msgstr "Αντίγραφο ασφαλείας / Εγγραφή FLASH Υλικολογισμικό" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Λίστα αρχείων για αντίγραφο ασφαλείας" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1115,12 +1281,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1135,7 +1324,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1144,18 +1333,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1167,65 +1369,77 @@ msgstr "" msgid "Bitrate" msgstr "Ρυθμός bit" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Γέφυρα" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Αριθμός μονάδας γέφυρας" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Ανέβασμα κατά την εκκίνηση" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "" @@ -1233,14 +1447,36 @@ msgstr "" msgid "Buffered" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Χρήση CPU (%)" @@ -1255,18 +1491,23 @@ msgstr "" msgid "Call failed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Ακύρωση" @@ -1274,32 +1515,32 @@ msgstr "Ακύρωση" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1308,45 +1549,53 @@ msgstr "" msgid "Category" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1358,16 +1607,16 @@ msgstr "" msgid "Chain" msgstr "Αλυσίδα" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Αλλαγές" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "" @@ -1378,18 +1627,19 @@ msgstr "Αλλάζει τον κωδικό διαχειριστή για πρό #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Κανάλι" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "" @@ -1397,7 +1647,7 @@ msgstr "" msgid "Check filesystems before mount" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" @@ -1414,8 +1664,8 @@ msgstr "" msgid "Choose mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1427,13 +1677,13 @@ msgstr "" "από την συσχετισμένη ζώνη ή συμπληρώστε το δημιουργία πεδίο για να " "προσδιορίσετε μία νέα ζώνη και να προσαρτήσετε την διεπαφή σε αυτό." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "" @@ -1455,9 +1705,10 @@ msgid "" "FEATURE IS FOR PROFESSIONALS! )" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "πελάτης" @@ -1466,9 +1717,9 @@ msgstr "πελάτης" msgid "Client ID to send when requesting DHCP" msgstr "Αναγνωριστικό πελάτη που αποστέλλετε κατά την αίτηση DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "" @@ -1486,20 +1737,20 @@ msgstr "" "δευτερολέπτων, χρησιμοποιήστε 0 για να εξακολουθούν να υφίστανται επ' " "αόριστον" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Κλείσιμο λίστας..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Συλλογή δεδομένων..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Εντολή" @@ -1516,7 +1767,7 @@ msgstr "" msgid "Comment" msgstr "Σχόλιο" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1535,29 +1786,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Διαμόρφωση" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1567,28 +1817,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1600,9 +1850,10 @@ msgstr "" msgid "Confirmation" msgstr "Επιβεβαίωση" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Συνδεδεμένο" @@ -1612,11 +1863,11 @@ msgstr "Συνδεδεμένο" msgid "Connection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1628,7 +1879,7 @@ msgstr "" msgid "Connections" msgstr "Συνδέσεις" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1656,9 +1907,9 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1669,16 +1920,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1689,20 +1940,20 @@ msgstr "" msgid "Country" msgstr "Χώρα" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Κωδικός Χώρας" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Δημιουργία / Ανάθεση ζώνης τείχους προστασίας" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "" @@ -1714,7 +1965,7 @@ msgstr "Κρίσιμο" msgid "Cron Log Level" msgstr "Επίπεδο Καταγραφής Cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "" @@ -1755,31 +2006,31 @@ msgstr "" "Ρυθμίζει, αν είναι δυνατόν, την συμπεριφορά των LED της συσκευής." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Εξυπηρετητής DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP και DNS" @@ -1790,16 +2041,22 @@ msgstr "DHCP και DNS" msgid "DHCP client" msgstr "Πελάτης DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Επιλογές DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "" @@ -1811,19 +2068,19 @@ msgstr "" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Προωθήσεις DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "Θύρα ερωτημάτων DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "Θύρα εξυπηρετητή DNS" @@ -1831,7 +2088,7 @@ msgstr "Θύρα εξυπηρετητή 6,192.168.2.1,192.168.2.2
    \" which advertises different DNS " @@ -1904,61 +2169,62 @@ msgstr "" "Ορίστε επιπλέον επιλογές DHCP, που διαφημίζουν διαφορετικούς εξυπηρετητές " "DNS στους πελάτες, για παράδειγμα \"6,192.168.2.1,192.168.2.2\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Διαγραφή" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Διαγραφή αυτού του δικτύου" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Περιγραφή" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "" @@ -1966,11 +2232,11 @@ msgstr "" msgid "Design" msgstr "Εμφάνιση" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2005,9 +2271,9 @@ msgstr "Ζώνη προορισμού" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2017,36 +2283,40 @@ msgstr "Ζώνη προορισμού" msgid "Device" msgstr "Συσκευή" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Παραμετροποίηση Συσκευής" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Όνομα συσκευής" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "" @@ -2054,31 +2324,31 @@ msgstr "" msgid "Device unreachable! Still waiting for device..." msgstr "Αποτυχία σύνδεσης με συσκευή! Παραμονή για συσκευή..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Συσκευές" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Διαγνωστικά" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Φάκελος" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Απενεργοποίηση" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2095,20 +2365,24 @@ msgstr "" msgid "Disable Encryption" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2117,33 +2391,32 @@ msgstr "" msgid "Disabled" msgstr "Απενεργοποιημένο" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "Αγνόησε τις απαντήσεις ανοδικής ροής RFC1918." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" @@ -2153,29 +2426,41 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Βελτιστοποίηση Απόστασης" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Απόσταση σε μέτρα από το πιο απομακρυσμένο μέλος του δικτύου." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDNS για τείχη προστασίας NAT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" "Να μην αποθηκεύονται στη λανθάνουσα μνήμη οι αρνητικές απαντήσεις, π.χ. για " @@ -2200,36 +2485,25 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "Να μην προωθούνται ερωτήματα DNS " "χωρίς όνομα τομέα DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Να μην προωθούνται αιτήματα τα οποία δεν μπορούν να απαντηθούν από δημόσιους " -"εξυπηρετητές ονομάτων" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2239,17 +2513,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "" @@ -2257,11 +2531,11 @@ msgstr "" msgid "Do you really want to erase all settings?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2269,15 +2543,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Απαίτηση για όνομα τομέα" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Λευκή λίστα τομέων" @@ -2303,11 +2579,11 @@ msgstr "Κατέβασμα αντιγράφου ασφαλείας" msgid "Download mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2321,16 +2597,54 @@ msgstr "" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "" @@ -2349,20 +2663,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Δυναμικό DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2370,7 +2684,7 @@ msgstr "" msgid "Dynamic tunnel" msgstr "Δυναμικό τούνελ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2378,21 +2692,33 @@ msgstr "" "Δυναμική απόδοση DHCP διευθύνσεων στους πελάτες. Σε περίπτωση " "απενεργοποίησης, μόνο πελάτες με στατικα leases θα εξυπηρετούνται." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Μέθοδος EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Επεξεργασία" @@ -2400,17 +2726,21 @@ msgstr "Επεξεργασία" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Επεξεργασία αυτού του δικτύου" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "" @@ -2419,54 +2749,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Έκτακτη ανάγκη" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Ενεργοποίηση" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Ενεργοποίηση STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2484,10 +2804,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "Ενεργοποίηση ενημέρωσης δυναμικού τερματικού σημείου HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2501,11 +2822,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Ενεργοποίηση διαπραγμάτευσης IPv6 πάνω στη PPP ζεύξη" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Ενεργοποίηση διέλευσης Jumbo Frame" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2517,11 +2842,11 @@ msgstr "" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Ενεργοποίηση εξυπηρετητή TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2529,7 +2854,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "Ενεργοποίηση λειτουργίας VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "" @@ -2540,12 +2865,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "" @@ -2561,24 +2886,24 @@ msgstr "" msgid "Enable mirroring of outgoing packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2600,11 +2925,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "" @@ -2613,27 +2938,36 @@ msgstr "" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Ενεργοποιήθηκε" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "" @@ -2641,24 +2975,29 @@ msgstr "" msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Λειτουργία ενθυλάκωσης" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Κρυπτογράφηση" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Τελικό σημείο" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2666,23 +3005,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2711,10 +3050,6 @@ msgstr "Σφάλμα" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2733,11 +3068,17 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2745,27 +3086,35 @@ msgstr "" "Να επιτρέπονται απαντήσεις από ανώτερο επίπεδο εντός του εύρους 127.0.0.0/8, " "π.χ. για υπηρεσίες RBL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2774,11 +3123,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "" @@ -2790,7 +3139,7 @@ msgstr "" msgid "Expires" msgstr "Λήγει" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 #, fuzzy msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." @@ -2802,11 +3151,11 @@ msgstr "" msgid "External" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2834,60 +3183,88 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Αρχείο" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "αρχείο όπου θα αποθηκεύονται τα Leases του DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "τοπικό αρχείο DNS" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Όνομα αρχείου της εικόνας εκκίνησης που διαφημίζετε στους πελάτες" @@ -2896,14 +3273,22 @@ msgstr "Όνομα αρχείου της εικόνας εκκίνησης πο msgid "Filesystem" msgstr "Σύστημα Αρχείων" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Φιλτράρισμα ιδιωτικών" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Φιλτράρισμα άχρηστων" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "" @@ -2916,8 +3301,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2927,7 +3317,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Εύρεση και σύνδεση σε δίκτυο" @@ -2941,10 +3331,11 @@ msgid "Firewall" msgstr "Τείχος Προστασίας" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Σημάδι τείχους προστασίας" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Ρυθμίσεις Τείχους Προστασίας" @@ -2952,19 +3343,19 @@ msgstr "Ρυθμίσεις Τείχους Προστασίας" msgid "Firewall Status" msgstr "Κατάσταση Τείχους Προστασίας" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Έκδοση υλικολογισμικού" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2990,42 +3381,50 @@ msgstr "Λειτουργίες φλασάρισματος" msgid "Flashing…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Επιβολή" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Επιβολή CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" "Επιβολή DHCP σε αυτό το δίκτυο ακόμα κι αν έχει εντοπιστεί άλλος " "εξυπηρετητής." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Επιβολή TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Επιβολή TKIP και CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "" @@ -3037,11 +3436,11 @@ msgstr "" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3060,37 +3459,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Προώθηση κίνησης DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Προώθηση κίνησης broadcast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Μέθοδος προώθησης" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Όριο Κατακερµατισµού" @@ -3112,7 +3515,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "" @@ -3132,12 +3535,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Πύλη" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Θύρες πύλης" @@ -3147,23 +3554,23 @@ msgstr "Θύρες πύλης" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Γενικές ρυθμίσεις" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Γενικές ρυθμίσεις" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3171,7 +3578,7 @@ msgstr "" msgid "Generate Config" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3179,11 +3586,11 @@ msgstr "" msgid "Generate archive" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3191,15 +3598,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3211,39 +3618,40 @@ msgstr "" msgid "Global Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Μετάβαση στη σχετική σελίδα ρυθμίσεων" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Παραχωρήστε πρόσβαση στην οθόνη κατάστασης DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3255,6 +3663,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3291,7 +3703,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3299,6 +3711,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3331,7 +3747,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Παραχωρήστε πρόσβαση στην οθόνη ασύρματης κατάστασης" @@ -3360,15 +3776,11 @@ msgstr "" msgid "Hang Up" msgstr "Κρέμασμα" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3380,7 +3792,7 @@ msgstr "" "Εδώ μπορείτε να παραμετροποιήσετε βασικές πλευρές της συσκευής σας όπως το " "όνομα υπολογιστή ή τη ζώνη ώρας." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Κρυφό ESSID" @@ -3389,17 +3801,25 @@ msgstr "Κρυφό ESSID" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3409,7 +3829,7 @@ msgstr "" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3417,10 +3837,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3430,11 +3856,11 @@ msgstr "Hostname" msgid "Hostname to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Ονόματα Υπολογιστών" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3490,23 +3916,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3522,7 +3952,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3534,20 +3964,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Παράκαμψη Ψευδούς Τομέα NX" @@ -3555,14 +3985,15 @@ msgstr "Παράκαμψη Ψευδούς Τομέα NX" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3578,7 +4009,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3588,7 +4019,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3615,7 +4046,7 @@ msgstr "Μάσκα IPv4" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Μόνο IPv4" @@ -3628,11 +4059,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3641,16 +4072,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3661,7 +4096,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3669,7 +4105,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6 Τείχος Προστασίας" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3677,7 +4113,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3685,15 +4125,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3707,12 +4147,12 @@ msgstr "" msgid "IPv6 address" msgstr "Διεύθυνση IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3724,11 +4164,11 @@ msgstr "Πύλη IPv6" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Μόνο IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3737,7 +4177,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "Πρόθεμα IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3751,23 +4191,19 @@ msgstr "" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3775,6 +4211,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3790,10 +4230,16 @@ msgstr "" msgid "IPv6-over-IPv4 (6to4)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Ταυτότητα" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3806,13 +4252,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3833,21 +4279,23 @@ msgstr "" "Αν οριστεί, προσάρτησε τη συσκευή με βάση την ετικέτα της αντί για το " "καθορισμένο όνομα της" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3867,15 +4315,23 @@ msgstr "" "προσπελαστεί με τους υψηλούς ρυθμούς μεταφοράς δεδομένων που διαθέτει η " "RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Αγνόησε /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Αγνόησε διεπαφή" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Αγνόησε αρχείο resolve" @@ -3887,25 +4343,25 @@ msgstr "" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3917,13 +4373,27 @@ msgstr "" msgid "In" msgstr "Είσοδος" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3953,7 +4423,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3961,6 +4431,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3979,22 +4450,21 @@ msgstr "Πληροφορίες" msgid "Information" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -4006,31 +4476,41 @@ msgstr "Σενάριο εκκίνησης" msgid "Initscripts" msgstr "Σενάρια Εκκίνησης" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Εγκατάσταση επεκτάσεων πρωτοκόλλου..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4040,6 +4520,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4047,7 +4531,7 @@ msgstr "" msgid "Interface" msgstr "Διεπαφή" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -4055,7 +4539,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Παραμετροποίηση Διεπαφής" @@ -4086,11 +4570,11 @@ msgstr "Η διεπαφή επανασυνδέεται..." msgid "Interface is shutting down..." msgstr "Η διεπαφή απενεργοποιείται..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -4099,12 +4583,12 @@ msgid "Interface name" msgstr "Όνομα διεπαφής (Interface)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Η διεπαφή δεν υπάρχει ή δεν έχει συνδεθεί ακόμη." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Διεπαφές" @@ -4113,22 +4597,26 @@ msgstr "Διεπαφές" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4138,8 +4626,9 @@ msgid "Invalid" msgstr "Άκυρη τιμή εισόδου" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4149,6 +4638,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4171,7 +4664,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4185,15 +4678,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Άκυρο όνομα χρήστη και/ή κωδικός πρόσβασης! Παρακαλώ προσπαθήστε ξανά." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "" @@ -4207,25 +4721,25 @@ msgstr "" "Φαίνεται πως προσπαθείτε να φλασάρετε μια εικόνα που δεν χωράει στην μνήμη " "flash, παρακαλώ επιβεβαιώστε το αρχείο εικόνας!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "Απαιτείται JavaScript!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4233,24 +4747,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Καταγραφή Πυρήνα" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Έκδοση kernel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Κλειδί" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Κλειδί #%d" @@ -4258,6 +4776,7 @@ msgstr "Κλειδί #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4265,14 +4784,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4317,7 +4841,7 @@ msgstr "" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4334,32 +4858,39 @@ msgstr "Γλώσσα" msgid "Language and Style" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 -msgid "Last member interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +msgid "Last member interval" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Τελευταία Χειραψία" + #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Αρχείο Leases" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "" @@ -4383,38 +4914,34 @@ msgstr "Αφήστε το κενό για να γίνει αυτόματη αν msgid "Leave empty to use the current WAN address" msgstr "Αφήστε το κενό για να γίνει χρήση της τρέχουσας διεύθυνσης WAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Υπόμνημα:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Όριο" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4435,16 +4962,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4453,7 +4982,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4466,23 +4995,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Θύρα ακρόασης" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4490,7 +5016,7 @@ msgstr "" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4500,7 +5026,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "" @@ -4509,7 +5035,7 @@ msgstr "" msgid "Load" msgstr "Φόρτος" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Μέσος όρος φόρτου" @@ -4517,27 +5043,28 @@ msgstr "Μέσος όρος φόρτου" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4557,11 +5084,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Τοπική διεύθυνση IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4577,44 +5105,70 @@ msgstr "Τοπική διεύθυνση IPv6" msgid "Local Startup" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Τοπική ώρα" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Τοπικός εξυπηρετητής" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Τοπικά ερωτήματα" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Σύνδεση" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Αποσύνδεση" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Επίπεδο εξόδου αρχείων καταγραφής" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Καταγραφή ερωτημάτων" @@ -4638,25 +5192,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Σύνδεση" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Αποσύνδεση" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4664,11 +5209,11 @@ msgstr "" msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Φίλτρο MAC Διευθύνσεων" @@ -4676,16 +5221,15 @@ msgstr "Φίλτρο MAC Διευθύνσεων" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4694,11 +5238,15 @@ msgstr "" msgid "MAC address" msgstr "MAC-Διεύθυνση" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC-Φίλτρο" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Λίστα MAC" @@ -4712,6 +5260,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4733,15 +5285,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4749,7 +5305,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4758,79 +5314,87 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Μεγ. πλήθος DHCP leases" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Μεγ. μέγεθος πακέτου EDNS0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Μεγ. πλήθος ταυτόχρονων ερωτηματων" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Μέγιστος επιτρεπόμενος αριθμός ενεργών DHCP leases" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Μέγιστος επιτρεπόμενος αριθμός ταυτόχρονων ερωτημάτων DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "Μέγιστο επιτρεπόμενο μέγεθος EDNS.0 UDP πακέτων" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" "Μέγιστος αριθμός δευτερολέπτων αναμονής ώστε το modem να καταστεί έτοιμο" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Μέγιστος αριθμός διευθύνσεων lease." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4857,7 +5421,7 @@ msgstr "Μνήμη" msgid "Memory usage (%)" msgstr "Χρήση Μνήμης (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4865,10 +5429,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4881,7 +5453,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4892,11 +5464,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4904,13 +5476,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4924,77 +5496,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Λειτουργία" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Μοντέλο" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Συσκευή Modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Παρακολούθηση" @@ -5064,6 +5643,10 @@ msgstr "Μετακίνηση κάτω" msgid "Move up" msgstr "Μετακίνηση πάνω" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5071,19 +5654,23 @@ msgstr "Μετακίνηση πάνω" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5095,12 +5682,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5113,18 +5704,23 @@ msgid "NTP server candidates" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Ονομα" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Όνομα νέου δικτύου" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Πλοήγηση" @@ -5133,13 +5729,17 @@ msgstr "Πλοήγηση" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5148,32 +5748,36 @@ msgstr "" msgid "Network" msgstr "Δίκτυο" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Εργαλεία Δικτύου" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5186,7 +5790,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5195,7 +5799,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5204,25 +5808,31 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Ποτέ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Ποτέ" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5230,13 +5840,13 @@ msgstr "" msgid "Next »" msgstr "Επόμενο »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Δεν υπάρχει ρυθμισμένος DHCP εξυπηρετητής για αυτή τη διεπαφή" @@ -5244,7 +5854,7 @@ msgstr "Δεν υπάρχει ρυθμισμένος DHCP εξυπηρετητή msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5260,9 +5870,17 @@ msgstr "" msgid "No RX signal" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Δεν έχουν διαμορφωθεί διεπαφές WireGuard." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5273,7 +5891,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5282,8 +5904,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5296,15 +5918,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Δε βρέθηκαν αρχεία" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5318,7 +5936,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5339,30 +5957,40 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Δεν έχει οριστεί κωδικός πρόσβασης!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "Μη συνδεδεμένο" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5376,7 +6004,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Δεν έχει ανατεθεί ζώνη" @@ -5388,37 +6017,40 @@ msgstr "Δεν έχει ανατεθεί ζώνη" msgid "Noise" msgstr "Θόρυβος" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Θόρυβος:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Κανένα" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Φυσιολογικό" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "" @@ -5431,7 +6063,7 @@ msgstr "Μη συνδεδεμένο" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5443,12 +6075,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5457,7 +6095,7 @@ msgstr "" msgid "Notice" msgstr "Επισήμανση" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "" @@ -5465,7 +6103,7 @@ msgstr "" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5482,7 +6120,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5493,6 +6131,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "" @@ -5501,6 +6140,12 @@ msgstr "" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "" @@ -5509,15 +6154,15 @@ msgstr "" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5535,7 +6180,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "Ένα ή περισσότερα πεδία δεν περιέχουν τιμές!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5544,49 +6193,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5594,29 +6254,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Η επιλογή άλλαξε" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Η επιλογή αφαιρέθηκε" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5624,17 +6293,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5642,13 +6311,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5663,11 +6332,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5675,7 +6344,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5689,7 +6358,7 @@ msgstr "" msgid "Options" msgstr "Επιλογές" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Διαδρομή για Πιστοποιητικό CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Διαδρομή για Πιστοποιητικό-Πελάτη" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Διαδρομή για Ιδιωτικό Κλειδί" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -6059,11 +6773,19 @@ msgstr "" msgid "Peak:" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Κόμβος" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -6072,11 +6794,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6107,10 +6829,14 @@ msgstr "Διενέργεια αρχικοποίησης" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6119,13 +6845,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "" @@ -6138,11 +6864,11 @@ msgstr "" msgid "Pkts." msgstr "Πκτ." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Παρακαλώ εισάγετε όνομα χρήστη και κωδικό πρόσβασης." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6150,56 +6876,75 @@ msgstr "" msgid "Policy" msgstr "Πολιτική" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Θύρα" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Θύρα %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6223,13 +6968,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Αποτρέπει την επικοινωνία μεταξύ πελατών" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6242,29 +6988,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6282,8 +7030,8 @@ msgid "Prot." msgstr "Πρωτ." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6295,13 +7043,13 @@ msgstr "Πρωτόκολλο" msgid "Provide NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6311,25 +7059,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Ψευδό Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Δημόσιο κλειδί" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6354,59 +7113,83 @@ msgstr "" msgid "Quality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Όριο RTS/CTS" @@ -6419,10 +7202,16 @@ msgstr "RX" msgid "RX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6432,13 +7221,13 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" "Διάβασμα του /etc/ethers για την παραμετροποίηση του " "εξυπηρετητή DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Αλλαγή πρωτοκόλλου;" @@ -6446,11 +7235,11 @@ msgstr "Αλλαγή πρωτοκόλλου;" msgid "Realtime Graphs" msgstr "Γραφήματα πραγματικού χρόνου" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6474,11 +7263,40 @@ msgstr "Επανεκκίνηση του λειτουργικού συστήμα msgid "Receive" msgstr "Λήψη" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Λήψη" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Επανασύνδεση της διεπαφής" @@ -6486,12 +7304,12 @@ msgstr "Επανασύνδεση της διεπαφής" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6500,37 +7318,47 @@ msgstr "" msgid "References" msgstr "Αναφορές" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "" @@ -6540,6 +7368,10 @@ msgstr "" msgid "Relay Bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "" @@ -6549,6 +7381,14 @@ msgstr "" msgid "Relay bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6558,6 +7398,7 @@ msgstr "Απομακρυσμένη διεύθυνση IPv4" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6570,15 +7411,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Αφαίρεση" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Αντικατάσταση ρυθμίσεων ασύρματης σύνδεσης" @@ -6608,7 +7457,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6624,7 +7474,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6636,67 +7486,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6705,7 +7561,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6720,20 +7576,24 @@ msgstr "Αρχικοποίηση Μετρητών" msgid "Reset to defaults" msgstr "Αρχικοποίηση στις προεπιλεγμένες τιμές" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Αρχεία Resolv και Hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Αρχείο Resolve" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Επανεκκίνηση" @@ -6742,7 +7602,7 @@ msgstr "Επανεκκίνηση" msgid "Restart Firewall" msgstr "Επανεκκίνηση Τείχους Προστασίας" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6754,86 +7614,97 @@ msgstr "Επαναφορά Αντίγραφου Ασφαλείας" msgid "Restore backup" msgstr "Επαναφορά αντιγράφου ασφαλείας" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Αναίρεση" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6848,19 +7719,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6878,6 +7749,10 @@ msgstr "Κωδικός Πρόσβασης Δρομολογητή" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6892,24 +7767,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6929,11 +7804,24 @@ msgstr "" msgid "SHA256" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6951,15 +7839,15 @@ msgstr "" msgid "SSH username" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "Κλειδιά SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6976,7 +7864,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6987,7 +7875,7 @@ msgid "Save" msgstr "Αποθήκευση" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Αποθήκευση & Εφαρμογή" @@ -7004,7 +7892,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Σάρωση" @@ -7013,11 +7901,16 @@ msgstr "Σάρωση" msgid "Scheduled Tasks" msgstr "Προγραμματισμένες Εργασίες" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "" @@ -7032,9 +7925,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -7042,13 +7935,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -7067,11 +7960,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7096,16 +7993,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7115,14 +8016,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7136,11 +8037,15 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Ρύθμιση Εξυπηρετητή DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7148,20 +8053,25 @@ msgid "Setting PLMN failed" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Ρυθμίσεις" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7169,12 +8079,11 @@ msgstr "" msgid "Short GI" msgstr "Σύντομο GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "" @@ -7187,16 +8096,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Απενεργοποίηση αυτής της διεπαφής" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7204,15 +8113,15 @@ msgstr "Απενεργοποίηση αυτής της διεπαφής" msgid "Signal" msgstr "Σήμα" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7220,12 +8129,12 @@ msgstr "" msgid "Signal:" msgstr "Σήμα:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Μέγεθος" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7242,12 +8151,12 @@ msgstr "Παράκαμψη" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Παράκαμψη σε περιεχόμενο" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Παράκαμψη σε πλοήγηση" @@ -7265,14 +8174,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "Κάποια πεδία δεν είναι έγκυρα, δεν μπορούν να αποθηκευτούν οι τιμές!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7280,8 +8185,8 @@ msgid "" "instructions." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7308,26 +8213,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7352,7 +8257,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7360,7 +8265,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7368,20 +8273,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7409,7 +8314,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7426,7 +8331,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7457,15 +8362,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7487,19 +8392,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7519,7 +8424,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7614,15 +8519,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Ορίστε το κρυφό κλειδί κρυπτογράφησης." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Αρχή" @@ -7635,16 +8548,16 @@ msgstr "" msgid "Start priority" msgstr "Προτεραιότητα εκκίνησης" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7653,6 +8566,10 @@ msgstr "" msgid "Startup" msgstr "Εκκίνηση" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Στατικές Διαδρομές IPv4" @@ -7666,7 +8583,7 @@ msgstr "Στατικές Διαδρομές IPv6" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Στατικά Leases" @@ -7676,25 +8593,25 @@ msgstr "Στατικά Leases" msgid "Static address" msgstr "Στατική διεύθυνση" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Κατάσταση" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "" @@ -7703,8 +8620,8 @@ msgstr "" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7712,11 +8629,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Αυστηρή σειρά" @@ -7725,15 +8642,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Υποβολή" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7764,7 +8681,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "" @@ -7774,7 +8691,7 @@ msgstr "" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7786,8 +8703,16 @@ msgstr "" msgid "Sync with browser" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7811,9 +8736,9 @@ msgstr "Ιδιότητες Συστήματος" msgid "System log buffer size" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7842,7 +8767,7 @@ msgstr "" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "" @@ -7855,26 +8780,37 @@ msgstr "TX" msgid "TX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Πίνακας" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Στόχος" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7890,26 +8826,26 @@ msgstr "" msgid "Terminate" msgstr "Τερματισμός" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7925,7 +8861,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7937,18 +8877,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7956,6 +8902,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7970,6 +8917,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7980,7 +8933,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7997,21 +8950,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8023,13 +8980,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8049,18 +9006,18 @@ msgstr "" "Το αρχείο συσκευής της μνήμης ή του διαμέρισματος (π.χ. /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8077,7 +9034,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Οι παρακάτω κανόνες είναι αυτή τη στιγμή ενεργοί σε αυτό το σύστημα." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -8085,31 +9042,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8132,6 +9105,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8146,7 +9120,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8155,7 +9129,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8163,19 +9137,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8189,14 +9163,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8209,31 +9183,31 @@ msgstr "Η εντολή επανεκκίνησης απέτυχε με σφάλ msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8270,6 +9244,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8293,30 +9275,37 @@ msgstr "" "Η εικόνα που ανεβάσατε δεν περιέχει κάποια υποστηριζόμενη μορφή. Βεβαιωθείτε " "ότι επιλέξατε την γενική μορφή εικόνας για την πλατφόρμα σας." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8327,16 +9316,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8349,6 +9338,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8361,7 +9361,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "Αυτός είναι ο μόνος configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8465,7 +9469,7 @@ msgstr "" "κατάσταση, κάντε κλικ στο \"Εκτέλεσε επαναφορά\" (δυνατό μόνο σε squashfs " "εικόνες)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8473,12 +9477,16 @@ msgstr "" msgid "Total Available" msgstr "Διαθέσιμο Συνολικά" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8490,11 +9498,11 @@ msgstr "Κίνηση" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8511,6 +9519,27 @@ msgstr "Εκπομπή" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Κεραία Εκπομπής" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8549,7 +9578,7 @@ msgstr "Διεπαφή Τούνελ" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8558,13 +9587,13 @@ msgid "Tx-Power" msgstr "Ισχύς Εκπομπής" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Τύπος" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8613,7 +9642,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8664,19 +9693,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8690,7 +9731,7 @@ msgstr "" msgid "Unknown" msgstr "Άγνωστο" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8714,11 +9755,11 @@ msgstr "" msgid "Unmount" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Μη-αποθηκευμένες Αλλαγές" @@ -8732,15 +9773,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8752,7 +9803,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Μεταφόρτωση" @@ -8767,58 +9818,66 @@ msgstr "" msgid "Upload archive..." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "Οι DNS εξυπηρετητές θα " "ερωτηθούν με την σειρά εμφάνισης στο αρχείο resolvfile" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Χρόνος λειτουργίας" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Χρήση /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8827,13 +9886,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "Χρήση πύλης DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8879,22 +9943,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Χρήση προεπιλεγμένης πύλης" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "" @@ -8918,15 +9985,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8949,69 +10016,71 @@ msgstr "" msgid "Used" msgstr "Σε χρήση" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Χρησιμοποιούμενη Υποδοχή Κλειδιού" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Όνομα Χρήστη" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -9031,24 +10100,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Εξυπηρετητής VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -9057,6 +10129,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -9070,14 +10146,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9103,7 +10179,7 @@ msgstr "" msgid "Vendor Class to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9111,12 +10187,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9124,34 +10200,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Μοιραζόμενο κλειδί WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Κωδική φράση WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Υποστήριξη WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Κωδική φράση WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9178,48 +10266,99 @@ msgstr "Προσοχή: Οι μη αποθηκευμένες αλλαγές θα msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Κατάσταση του WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9235,21 +10374,21 @@ msgid "Wireless Adapter" msgstr "Ασύρματος Προσαρμογέας" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Ασύρματο Δίκτυο" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Επισκόπηση Ασύρματου Δικτύου" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Ασφάλεια Ασύρματου Δικτύου" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9265,15 +10404,15 @@ msgstr "Το ασύρματο δίκτυο είναι απενεργοποιημ msgid "Wireless is not associated" msgstr "Το ασύρματο δίκτυο μη συνδεδεμένο" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Το ασύρματο δίκτυο είναι ανενεργό" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Το ασύρματο δίκτυο είναι ενεργό" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Καταγραφή των ληφθέντων DNS αιτήσεων στο syslog" @@ -9285,7 +10424,7 @@ msgstr "" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9312,8 +10451,20 @@ msgstr "" ">Προειδοποίηση: Αν απενεργοποιήσετε απαραίτητα σενάρια εκκίνησης " "όπως το \"network\", η συσκευή σας μπορεί να καταστεί μη-προσβάσιμη!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9342,35 +10493,55 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "οποιαδήποτε" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "αυτόματα" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 #, fuzzy msgid "automatic" msgstr "στατικό" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "" @@ -9427,25 +10598,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "ανενεργό" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9454,14 +10630,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9471,22 +10656,22 @@ msgstr "" msgid "forward" msgstr "προώθηση" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "" @@ -9495,9 +10680,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9505,6 +10690,10 @@ msgstr "" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9519,11 +10708,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9532,11 +10729,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9548,18 +10745,26 @@ msgstr "" msgid "no" msgstr "όχι" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "κανένα" @@ -9570,20 +10775,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "κλειστό" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9592,6 +10797,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "πλέον της μιας ημέρας" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9609,23 +10818,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9633,7 +10851,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9641,7 +10859,7 @@ msgstr "" msgid "tagged" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9652,25 +10870,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "απεριόριστα" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9692,8 +10912,8 @@ msgid "untagged" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9706,7 +10926,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9735,7 +10955,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9772,8 +10992,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9813,11 +11033,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9827,43 +11057,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" diff --git a/package/luci/modules/luci-base/po/en/base.po b/package/luci/modules/luci-base/po/en/base.po index c2a063de5f..8e1a3ba4ca 100644 --- a/package/luci/modules/luci-base/po/en/base.po +++ b/package/luci/modules/luci-base/po/en/base.po @@ -3,34 +3,50 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:40+0200\n" -"PO-Revision-Date: 2022-07-03 10:25+0000\n" -"Last-Translator: Hannu Nyman \n" -"Language-Team: English \n" +"Language-Team: English \n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.16.2-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "" @@ -55,10 +71,11 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "" @@ -68,19 +85,19 @@ msgid "-- Additional Field --" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "" @@ -106,7 +123,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" @@ -119,13 +136,18 @@ msgstr "" msgid "1 Minute Load:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "" msgstr[1] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "" @@ -140,12 +162,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "" @@ -158,43 +185,98 @@ msgstr "" msgid "5 Minute Load:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "" @@ -206,30 +288,42 @@ msgstr "" msgid "LED Name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -275,11 +369,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "" @@ -287,25 +389,90 @@ msgstr "" msgid "A new login is required since the authentication session expired." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "" @@ -338,55 +505,58 @@ msgstr "" msgid "ARP retry threshold" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " "to dial into the provider network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "" @@ -395,7 +565,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -403,16 +573,25 @@ msgstr "" msgid "Access Concentrator" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "" @@ -450,8 +629,8 @@ msgstr "" msgid "Active-Backup policy (active-backup, 1)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "" @@ -468,18 +647,18 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "" @@ -499,11 +678,11 @@ msgstr "" msgid "Add VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "" @@ -511,18 +690,18 @@ msgstr "" msgid "Add instance" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "" @@ -530,6 +709,10 @@ msgstr "" msgid "Add peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "" @@ -538,11 +721,11 @@ msgstr "" msgid "Add to Whitelist" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "" @@ -557,9 +740,13 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:42 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:43 msgid "Address" +msgstr "Address" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -572,7 +759,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "" @@ -581,28 +768,28 @@ msgstr "" msgid "Administration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 @@ -637,17 +824,17 @@ msgstr "" msgid "Alias of \"%s\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "" @@ -655,11 +842,11 @@ msgstr "" msgid "Allow SSH password authentication" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "" @@ -667,15 +854,15 @@ msgstr "" msgid "Allow full UCI access for legacy applications" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "" @@ -696,19 +883,24 @@ msgid "Allow system feature probing" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "" @@ -720,20 +912,24 @@ msgstr "" msgid "Always on (kernel: default-on)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "" @@ -742,98 +938,47 @@ msgstr "" msgid "An optional, short description for this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "" @@ -845,7 +990,7 @@ msgstr "" msgid "Anonymous Swap" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -857,11 +1002,11 @@ msgstr "" msgid "Any zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -869,44 +1014,48 @@ msgstr "" msgid "Apply backup?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "" @@ -915,15 +1064,15 @@ msgstr "" msgid "Associations" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -933,25 +1082,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "" @@ -959,7 +1109,9 @@ msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -977,7 +1129,7 @@ msgstr "" msgid "Automatically check filesystem for errors before mounting" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -999,6 +1151,10 @@ msgstr "" msgid "Automount Swap" msgstr "" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "" @@ -1017,11 +1173,15 @@ msgstr "" msgid "Average:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "" @@ -1029,15 +1189,19 @@ msgstr "" msgid "BR / DMR / AFTR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "" @@ -1046,11 +1210,7 @@ msgstr "" msgid "Back to Overview" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1063,16 +1223,15 @@ msgid "Backup / Flash Firmware" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1080,12 +1239,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1096,7 +1278,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1105,18 +1287,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1128,65 +1323,77 @@ msgstr "" msgid "Bitrate" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "" @@ -1194,14 +1401,36 @@ msgstr "" msgid "Buffered" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "" @@ -1216,18 +1445,23 @@ msgstr "" msgid "Call failed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "" @@ -1235,32 +1469,32 @@ msgstr "" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1269,45 +1503,53 @@ msgstr "" msgid "Category" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1319,16 +1561,16 @@ msgstr "" msgid "Chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "" @@ -1339,18 +1581,19 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "" @@ -1358,7 +1601,7 @@ msgstr "" msgid "Check filesystems before mount" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" @@ -1375,8 +1618,8 @@ msgstr "" msgid "Choose mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1384,13 +1627,13 @@ msgid "" "interface to it." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "" @@ -1410,9 +1653,10 @@ msgid "" "FEATURE IS FOR PROFESSIONALS! )" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "" @@ -1421,9 +1665,9 @@ msgstr "" msgid "Client ID to send when requesting DHCP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "" @@ -1438,20 +1682,20 @@ msgid "" "persist connection" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "" @@ -1468,7 +1712,7 @@ msgstr "" msgid "Comment" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1487,29 +1731,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Configuration" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1519,28 +1762,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1552,9 +1795,10 @@ msgstr "" msgid "Confirmation" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "" @@ -1564,11 +1808,11 @@ msgstr "" msgid "Connection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1580,7 +1824,7 @@ msgstr "" msgid "Connections" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1608,9 +1852,9 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1621,16 +1865,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1641,20 +1885,20 @@ msgstr "" msgid "Country" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "" @@ -1666,7 +1910,7 @@ msgstr "" msgid "Cron Log Level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "" @@ -1705,31 +1949,31 @@ msgid "" "Diode\">LED
    s if possible." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "" @@ -1740,16 +1984,22 @@ msgstr "" msgid "DHCP client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "" @@ -1761,19 +2011,19 @@ msgstr "" msgid "DNS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" @@ -1781,7 +2031,7 @@ msgstr "" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1789,11 +2039,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1805,39 +2055,48 @@ msgstr "" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +#, fuzzy +msgid "Data Transmitted" +msgstr "Transmit Power" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1845,68 +2104,69 @@ msgstr "" msgid "Default state" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "" @@ -1914,11 +2174,11 @@ msgstr "" msgid "Design" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1953,9 +2213,9 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1965,36 +2225,40 @@ msgstr "" msgid "Device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "" @@ -2002,31 +2266,31 @@ msgstr "" msgid "Device unreachable! Still waiting for device..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2041,20 +2305,24 @@ msgstr "" msgid "Disable Encryption" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2063,33 +2331,32 @@ msgstr "" msgid "Disabled" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" @@ -2099,36 +2366,48 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" @@ -2140,32 +2419,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2175,17 +2445,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "" @@ -2193,11 +2463,11 @@ msgstr "" msgid "Do you really want to erase all settings?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2205,15 +2475,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "" @@ -2239,11 +2511,11 @@ msgstr "" msgid "Download mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2257,16 +2529,54 @@ msgstr "" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "" @@ -2282,19 +2592,19 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2302,27 +2612,39 @@ msgstr "" msgid "Dynamic tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "" @@ -2330,17 +2652,21 @@ msgstr "" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "" @@ -2349,54 +2675,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2414,10 +2730,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2431,11 +2748,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2447,11 +2768,11 @@ msgstr "" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2459,7 +2780,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "" @@ -2470,12 +2791,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "" @@ -2491,24 +2812,24 @@ msgstr "" msgid "Enable mirroring of outgoing packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2530,11 +2851,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "" @@ -2543,27 +2864,36 @@ msgstr "" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "" @@ -2571,24 +2901,29 @@ msgstr "" msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2596,23 +2931,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2641,10 +2976,6 @@ msgstr "" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2663,37 +2994,51 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2702,11 +3047,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "" @@ -2718,7 +3063,7 @@ msgstr "" msgid "Expires" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2727,11 +3072,11 @@ msgstr "" msgid "External" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2759,58 +3104,86 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "" @@ -2819,12 +3192,20 @@ msgstr "" msgid "Filesystem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 -msgid "Filter private" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 @@ -2839,8 +3220,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2850,7 +3236,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "" @@ -2864,10 +3250,11 @@ msgid "Firewall" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "" @@ -2875,19 +3262,19 @@ msgstr "" msgid "Firewall Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2913,40 +3300,48 @@ msgstr "" msgid "Flashing…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "" @@ -2958,11 +3353,11 @@ msgstr "" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -2981,37 +3376,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "" @@ -3033,7 +3432,7 @@ msgid "GHz" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "" @@ -3053,12 +3452,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "" @@ -3068,23 +3471,23 @@ msgstr "" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3092,7 +3495,7 @@ msgstr "" msgid "Generate Config" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3100,11 +3503,11 @@ msgstr "" msgid "Generate archive" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3112,15 +3515,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3132,39 +3535,40 @@ msgstr "" msgid "Global Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3176,6 +3580,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3212,7 +3620,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3220,6 +3628,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3252,7 +3664,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "" @@ -3281,15 +3693,11 @@ msgstr "" msgid "Hang Up" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3299,7 +3707,7 @@ msgid "" "the timezone." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" @@ -3308,17 +3716,25 @@ msgstr "" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3328,7 +3744,7 @@ msgstr "" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3336,10 +3752,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3349,11 +3771,11 @@ msgstr "" msgid "Hostname to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3409,23 +3831,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3441,7 +3867,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3453,20 +3879,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "" @@ -3474,14 +3900,15 @@ msgstr "" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "" @@ -3497,7 +3924,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3507,7 +3934,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3534,7 +3961,7 @@ msgstr "" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "" @@ -3547,11 +3974,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3560,16 +3987,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3580,7 +4011,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "" @@ -3588,7 +4020,7 @@ msgstr "" msgid "IPv6 Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3596,7 +4028,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3604,15 +4040,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3626,12 +4062,12 @@ msgstr "" msgid "IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3643,11 +4079,11 @@ msgstr "" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3656,7 +4092,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3670,23 +4106,19 @@ msgstr "" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3694,6 +4126,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3709,10 +4145,16 @@ msgstr "" msgid "IPv6-over-IPv4 (6to4)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3725,13 +4167,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3748,21 +4190,23 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3776,15 +4220,23 @@ msgid "" "datarates of the RAM." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "" @@ -3796,25 +4248,25 @@ msgstr "" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3826,13 +4278,27 @@ msgstr "" msgid "In" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3862,7 +4328,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3870,6 +4336,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3888,22 +4355,21 @@ msgstr "" msgid "Information" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3915,31 +4381,41 @@ msgstr "" msgid "Initscripts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -3949,6 +4425,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -3956,7 +4436,7 @@ msgstr "" msgid "Interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -3964,7 +4444,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "" @@ -3995,11 +4475,11 @@ msgstr "" msgid "Interface is shutting down..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -4008,12 +4488,12 @@ msgid "Interface name" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "" @@ -4022,22 +4502,26 @@ msgstr "" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4047,8 +4531,9 @@ msgid "Invalid" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4058,6 +4543,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4080,7 +4569,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4094,15 +4583,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "" @@ -4113,25 +4623,25 @@ msgid "" "flash memory, please verify the image file!" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4139,24 +4649,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "" @@ -4164,6 +4678,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4171,14 +4686,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4223,7 +4743,7 @@ msgstr "" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "" @@ -4240,32 +4760,39 @@ msgstr "" msgid "Language and Style" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "" @@ -4289,38 +4816,34 @@ msgstr "" msgid "Leave empty to use the current WAN address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4341,16 +4864,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4359,7 +4884,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4372,23 +4897,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4396,7 +4918,7 @@ msgstr "" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4406,7 +4928,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "" @@ -4415,7 +4937,7 @@ msgstr "" msgid "Load" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "" @@ -4423,27 +4945,28 @@ msgstr "" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4463,11 +4986,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4483,44 +5007,70 @@ msgstr "" msgid "Local Startup" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "" @@ -4544,25 +5094,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4570,11 +5111,11 @@ msgstr "" msgid "MAC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "" @@ -4582,16 +5123,15 @@ msgstr "" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4600,11 +5140,15 @@ msgstr "" msgid "MAC address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "" @@ -4618,6 +5162,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "" @@ -4639,15 +5187,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4655,7 +5207,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4664,74 +5216,82 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4758,7 +5318,7 @@ msgstr "" msgid "Memory usage (%)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4766,10 +5326,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4782,7 +5350,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4793,11 +5361,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4805,13 +5373,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4825,77 +5393,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "" @@ -4963,6 +5538,10 @@ msgstr "" msgid "Move up" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -4970,19 +5549,23 @@ msgstr "" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -4994,12 +5577,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5012,18 +5599,23 @@ msgid "NTP server candidates" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "" @@ -5032,13 +5624,17 @@ msgstr "" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5047,32 +5643,36 @@ msgstr "" msgid "Network" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5085,7 +5685,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5094,7 +5694,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5103,25 +5703,30 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 +msgid "Never" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" msgid "Never" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5129,13 +5734,13 @@ msgstr "" msgid "Next »" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "" @@ -5143,7 +5748,7 @@ msgstr "" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5159,9 +5764,17 @@ msgstr "" msgid "No RX signal" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5172,7 +5785,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5181,8 +5798,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5195,15 +5812,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5217,7 +5830,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5238,30 +5851,39 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5275,7 +5897,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "" @@ -5287,37 +5910,40 @@ msgstr "" msgid "Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "" @@ -5330,7 +5956,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5342,12 +5968,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5356,7 +5988,7 @@ msgstr "" msgid "Notice" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "" @@ -5364,7 +5996,7 @@ msgstr "" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5381,7 +6013,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5392,6 +6024,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "" @@ -5400,6 +6033,12 @@ msgstr "" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "" @@ -5408,15 +6047,15 @@ msgstr "" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5434,7 +6073,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5443,49 +6086,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5493,29 +6147,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5523,17 +6186,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5541,13 +6204,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5562,11 +6225,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5574,7 +6237,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5588,7 +6251,7 @@ msgstr "" msgid "Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -5958,11 +6666,19 @@ msgstr "" msgid "Peak:" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -5971,11 +6687,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6006,10 +6722,14 @@ msgstr "" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6018,13 +6738,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "" @@ -6037,11 +6757,11 @@ msgstr "" msgid "Pkts." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6049,56 +6769,74 @@ msgstr "" msgid "Policy" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6121,13 +6859,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6140,29 +6879,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6180,8 +6921,8 @@ msgid "Prot." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6193,13 +6934,13 @@ msgstr "" msgid "Provide NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6209,25 +6950,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6252,59 +7004,83 @@ msgstr "" msgid "Quality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "" @@ -6317,10 +7093,16 @@ msgstr "" msgid "RX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6330,11 +7112,11 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "" @@ -6342,11 +7124,11 @@ msgstr "" msgid "Realtime Graphs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6370,11 +7152,40 @@ msgstr "" msgid "Receive" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Receiver Antenna" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "" @@ -6382,12 +7193,12 @@ msgstr "" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6396,37 +7207,47 @@ msgstr "" msgid "References" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "" @@ -6436,6 +7257,10 @@ msgstr "" msgid "Relay Bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "" @@ -6445,6 +7270,14 @@ msgstr "" msgid "Relay bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6454,6 +7287,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6466,15 +7300,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "" @@ -6504,7 +7346,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6520,7 +7363,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6532,67 +7375,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6601,7 +7450,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6616,20 +7465,24 @@ msgstr "" msgid "Reset to defaults" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "" @@ -6638,7 +7491,7 @@ msgstr "" msgid "Restart Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6650,86 +7503,97 @@ msgstr "" msgid "Restore backup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6744,19 +7608,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6774,6 +7638,10 @@ msgstr "" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6786,24 +7654,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6823,11 +7691,24 @@ msgstr "" msgid "SHA256" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6845,15 +7726,15 @@ msgstr "" msgid "SSH username" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "" @@ -6870,7 +7751,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6881,7 +7762,7 @@ msgid "Save" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "" @@ -6898,7 +7779,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "" @@ -6907,11 +7788,16 @@ msgstr "" msgid "Scheduled Tasks" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "" @@ -6926,9 +7812,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -6936,13 +7822,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -6961,11 +7847,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Server" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -6990,16 +7880,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7009,14 +7903,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7030,32 +7924,41 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 msgid "Setting PLMN failed" msgstr "" -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 -msgid "Setting operation mode failed" +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 +msgid "Setting operation mode failed" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7063,12 +7966,11 @@ msgstr "" msgid "Short GI" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "" @@ -7081,16 +7983,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7098,15 +8000,15 @@ msgstr "" msgid "Signal" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7114,12 +8016,12 @@ msgstr "" msgid "Signal:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7136,12 +8038,12 @@ msgstr "" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "" @@ -7159,14 +8061,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7174,8 +8072,8 @@ msgid "" "instructions." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7202,26 +8100,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7246,7 +8144,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7254,7 +8152,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7262,20 +8160,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7303,7 +8201,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7320,7 +8218,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7351,15 +8249,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7381,19 +8279,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7413,7 +8311,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7508,15 +8406,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "" @@ -7529,16 +8435,16 @@ msgstr "" msgid "Start priority" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7547,6 +8453,10 @@ msgstr "" msgid "Startup" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "" @@ -7560,7 +8470,7 @@ msgstr "" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "" @@ -7570,25 +8480,25 @@ msgstr "" msgid "Static address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "" @@ -7597,8 +8507,8 @@ msgstr "" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7606,11 +8516,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "" @@ -7619,15 +8529,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7658,7 +8568,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "" @@ -7668,7 +8578,7 @@ msgstr "" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7680,8 +8590,16 @@ msgstr "" msgid "Sync with browser" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7705,9 +8623,9 @@ msgstr "" msgid "System log buffer size" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7736,7 +8654,7 @@ msgstr "" msgid "TCP:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "" @@ -7749,26 +8667,37 @@ msgstr "" msgid "TX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7784,26 +8713,26 @@ msgstr "" msgid "Terminate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7819,7 +8748,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7831,18 +8764,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7850,6 +8789,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7864,6 +8804,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7874,7 +8820,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7891,21 +8837,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -7915,13 +8865,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -7939,18 +8889,18 @@ msgid "" "
    /dev/sda1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -7967,7 +8917,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -7975,31 +8925,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8022,6 +8988,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8036,7 +9003,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8045,7 +9012,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8053,19 +9020,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8079,14 +9046,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8099,31 +9066,31 @@ msgstr "" msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8155,6 +9122,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8176,30 +9151,37 @@ msgid "" "you choose the generic image format for your platform." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8210,16 +9192,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8232,6 +9214,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8244,7 +9237,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" @@ -8272,8 +9265,8 @@ msgid "" "their status." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8288,31 +9281,39 @@ msgstr "" msgid "Time Synchronization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8320,17 +9321,13 @@ msgstr "" msgid "Timezone" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8338,7 +9335,7 @@ msgid "" "reset\" (only possible with squashfs images)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8346,12 +9343,16 @@ msgstr "" msgid "Total Available" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8363,11 +9364,11 @@ msgstr "" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8384,6 +9385,27 @@ msgstr "" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Transmitter Antenna" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8422,7 +9444,7 @@ msgstr "" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8431,13 +9453,13 @@ msgid "Tx-Power" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8486,7 +9508,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8537,19 +9559,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8563,7 +9597,7 @@ msgstr "" msgid "Unknown" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8587,11 +9621,11 @@ msgstr "" msgid "Unmount" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "" @@ -8605,15 +9639,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8625,7 +9669,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "" @@ -8640,56 +9684,64 @@ msgstr "" msgid "Upload archive..." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8698,13 +9750,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8750,22 +9807,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "" @@ -8789,15 +9849,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8820,69 +9880,71 @@ msgstr "" msgid "Used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -8902,24 +9964,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -8928,6 +9993,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -8941,14 +10010,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -8974,7 +10043,7 @@ msgstr "" msgid "Vendor Class to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -8982,12 +10051,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -8995,34 +10064,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9049,48 +10130,99 @@ msgstr "" msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9106,21 +10238,21 @@ msgid "Wireless Adapter" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9136,15 +10268,15 @@ msgstr "" msgid "Wireless is not associated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "" @@ -9156,7 +10288,7 @@ msgstr "" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9179,8 +10311,20 @@ msgid "" "scripts like \"network\", your device might become inaccessible!
    " msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9209,34 +10353,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "" @@ -9293,25 +10457,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9320,14 +10489,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9337,22 +10515,22 @@ msgstr "" msgid "forward" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "" @@ -9361,9 +10539,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9371,6 +10549,10 @@ msgstr "" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9385,11 +10567,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9398,11 +10588,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9414,18 +10604,26 @@ msgstr "" msgid "no" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "" @@ -9436,20 +10634,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9458,6 +10656,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9475,23 +10677,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9499,7 +10710,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9507,7 +10718,7 @@ msgstr "" msgid "tagged" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9518,25 +10729,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9558,8 +10771,8 @@ msgid "untagged" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9572,7 +10785,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9601,7 +10814,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9638,8 +10851,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9679,11 +10892,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9693,43 +10916,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" diff --git a/package/luci/modules/luci-base/po/es/base.po b/package/luci/modules/luci-base/po/es/base.po index 64c11be2f1..3c776331d3 100644 --- a/package/luci/modules/luci-base/po/es/base.po +++ b/package/luci/modules/luci-base/po/es/base.po @@ -3,35 +3,50 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:41+0200\n" -"PO-Revision-Date: 2022-11-22 20:44+0000\n" +"PO-Revision-Date: 2023-10-22 07:19+0000\n" "Last-Translator: Franco Castillo \n" -"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.1\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 -#, fuzzy +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "!known (desconocido)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" tabla \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d campo(s) inválido(s)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "hace %dh" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "hace %dm" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "hace %ds" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "¡%s está desetiquetado en varias VLAN!" @@ -56,11 +71,11 @@ msgstr "(vacío)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(sin interfaces conectadas)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 -#, fuzzy +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d más" @@ -70,19 +85,19 @@ msgid "-- Additional Field --" msgstr "-- campo adicional --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- por favor elija --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- personalizado --" @@ -108,7 +123,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = no usar umbral RSSI, 1 = no cambiar el valor predeterminado del " @@ -123,14 +138,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Carga a 1 minuto:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 -#, fuzzy +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "1 indicador" msgstr[1] "%d indicadores" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12h (12 horas - predeterminado)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "Carga a 15 minutos:" @@ -145,12 +164,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3h (3 horas)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "ID hexadecimal de 4 caracteres" @@ -163,79 +187,157 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Carga a 5 minutos:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5m (5 minutos)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "Identificador de 6 octetos como una cadena hexadecimal, sin dos puntos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7d (7 días)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "RRM 802.11k" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: activa el informe de baliza a través de mediciones de radio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" +"802.11k: habilita el informe de vecinos a través de mediciones de radio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "Transición rápida 802.11r" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: BSS Máx inactivo. Unidades: segundos." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" +"802.11v: gestión de transición del conjunto de servicios básicos (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Anuncio de zona horaria local en tramas de gestión." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Proxy ARP permite que STA que no sea AP permanezca en modo de " +"ahorro de energía durante más tiempo." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Anuncio de tiempo en tramas de gestión." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: modo de suspensión de gestión de red inalámbrica (WNM) (modo de " +"suspensión extendido para estaciones)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: correcciones del modo de suspensión de administración de red " +"inalámbrica (WNM): evita ataques de reinstalación." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "Consulta tiempo de espera máximo de Asociación SA de 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "Consulta tiempo de espera de reintento de Asociación SA de 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "Protección de marco de gestión de 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "Tiempo de espera máximo de 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "Tiempo de espera de reintento de 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "Máscara de red IPv4" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:58 msgid "LED Configuration" -msgstr "Configuración de LED" +msgstr "Configuración de LEDs" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:70 msgid "LED Name" msgstr "Nombre del LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "Proxy NDP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 -#, fuzzy +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" -msgstr "Indicador RA" +msgstr "Indicadores RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "Límite de saltos RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "Vida útil del RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "MTU RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "Servicio RA" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ coincide con cualquier dominio. /example.com/ " +"devuelve NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# devuelve direcciones NULL (0.0.0.0 " +"y ::) para example.com y sus subdominios." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -247,7 +349,6 @@ msgid "%s greater than or equal to %s" msgstr "%s mayor que o igual a %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:90 -#, fuzzy msgctxt "nft set match expression" msgid "%s in set %s" msgstr "%s en el conjunto %s" @@ -273,22 +374,32 @@ msgid "%s lower than or equal to %s" msgstr "%s menor que o igual a %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:84 -#, fuzzy msgctxt "nft relational \"!=\" operator expression" msgid "%s not %s" msgstr "%s no es %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:91 -#, fuzzy msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s no en el conjunto de %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"Un nodo batman-adv puede ejecutarse en modo servidor (compartiendo su " +"conexión a Internet con la malla) o en modo cliente (buscando la conexión a " +"Internet más adecuada en la malla) o con la compatibilidad con la puerta de " +"enlace desactivada por completo (que es la configuración predeterminada)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Ya existe una configuración para el dispositivo \"%s\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Ya existe un directorio con el mismo nombre." @@ -298,25 +409,90 @@ msgstr "" "Se requiere un nuevo inicio de sesión ya que la sesión de autenticación " "expiró." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Anexo A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Anexo B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (todas las variantes) Anexo A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (todas las variantes) Anexo A/L/M + VDSL2 Anexo A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (todas las variantes) Anexo B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (todas las variantes) Anexo B + VDSL2 Anexo A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (todas las variantes) Anexo B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (todas las variantes) Anexo B/J + VDSL2 Anexo A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (todas las variantes) Anexo M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Anexo A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Anexo B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Anexo L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Anexo M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Anexo A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Anexo B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Anexo M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -349,29 +525,40 @@ msgstr "¡El monitoreo ARP no es compatible con la política seleccionada!" msgid "ARP retry threshold" msgstr "Umbral de reintento ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "Tabla de tráfico ARP \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"ARP, IPv4 e IPv6 (incluso 802.1Q) con MAC de destino de multidifusión son de " +"unidifusión a la dirección MAC de STA. Nota: Esto no es un servicio de " +"multidifusión dirigido (DMS) en 802.11v. Nota: podría romper las " +"expectativas de multidifusión STA del receptor." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Modo de transferencia asíncrono)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "Puente ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "Identificador de canal virtual ATM (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "Identificador de ruta virtual ATM (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -381,28 +568,24 @@ msgstr "" "interfaces de red Linux virtuales que se pueden usar junto con DHCP o PPP " "para acceder a la red del proveedor." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Número de dispositivo ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ID del proveedor del sistema ATU-C" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Interfaz ausente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Aceptar consultas de DNS solo de hosts cuya dirección se encuentre en una " "subred local." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Aceptar local" @@ -411,7 +594,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Aceptar paquete" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Acepte paquetes con direcciones de origen local" @@ -419,16 +602,25 @@ msgstr "Acepte paquetes con direcciones de origen local" msgid "Access Concentrator" msgstr "Concentrador de acceso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Punto de acceso" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Aislamiento de punto de acceso" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Tecnologías de acceso" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Acciones" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Activo" @@ -466,8 +658,8 @@ msgstr "Reglas IPv6 activas" msgid "Active-Backup policy (active-backup, 1)" msgstr "Política de copia de seguridad activa (copia de seguridad activa, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -484,18 +676,18 @@ msgstr "Equilibrio de carga de transmisión adaptativa (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Añadir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Agregar puente ATM" @@ -515,11 +707,11 @@ msgstr "Añadir acción de LED" msgid "Add VLAN" msgstr "Añadir VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Agregar configuración de dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Agregar configuración de dispositivo…" @@ -527,20 +719,20 @@ msgstr "Agregar configuración de dispositivo…" msgid "Add instance" msgstr "Añadir instancia" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Añadir clave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" "Añadir el sufijo de dominio local a los nombres servidos desde el archivo de " -"hosts" +"hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Añadir nueva interfaz..." @@ -548,6 +740,10 @@ msgstr "Añadir nueva interfaz..." msgid "Add peer" msgstr "Añadir par" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "Agrega entradas DNS estáticas directas e inversas para este host." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Añadir a la lista negra" @@ -556,11 +752,11 @@ msgstr "Añadir a la lista negra" msgid "Add to Whitelist" msgstr "Añadir a la lista blanca" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Archivos de hosts adicionales" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Archivo de servidores adicionales" @@ -577,7 +773,13 @@ msgstr "Archivo de servidores adicionales" msgid "Address" msgstr "Dirección" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" +"Las familias de direcciones de \"Retransmisión desde\" y \"Retransmisión " +"hacia dirección\" deben coincidir." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Familia de direcciones" @@ -590,7 +792,7 @@ msgstr "La configuración de la dirección no es válida" msgid "Address to access local relay bridge" msgstr "Dirección para acceder al puente de relé local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Direcciones" @@ -599,29 +801,29 @@ msgstr "Direcciones" msgid "Administration" msgstr "Administración" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" -msgstr "Configuración avanzada" +msgstr "Ajustes avanzados" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Opciones de dispositivo avanzadas" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Tiempo de envejecimiento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Potencia de transmisión agregada (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Mensajes de originador agregados" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -658,11 +860,11 @@ msgstr "Apodo de interfaz" msgid "Alias of \"%s\"" msgstr "Apodo de \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Todos los servidores" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." @@ -670,7 +872,7 @@ msgstr "" "Asigna direcciones IP secuencialmente, comenzando desde la dirección más " "baja disponible." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Asignar IPs secuencialmente" @@ -680,12 +882,12 @@ msgstr "" "Permitir autenticación de contraseña via SSH" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" "Permite que el modo AP desconecte los clientes por una condición de ACK bajo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Permitir a todos excepto a los de la lista" @@ -693,15 +895,15 @@ msgstr "Permitir a todos excepto a los de la lista" msgid "Allow full UCI access for legacy applications" msgstr "Permitir acceso UCI completo para aplicaciones heredadas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Permitir tasas de 802.11b heredadas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Permitir a los pertenecientes en la lista" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Permitir host local" @@ -724,19 +926,24 @@ msgid "Allow system feature probing" msgstr "Permitir sondeo de funciones del sistema" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Permitir al usuario root conectar con contraseña" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "IPs permitidas" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "Tecnología de red permitida" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "La configuración AllowedIPs no válida" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Siempre" @@ -748,11 +955,11 @@ msgstr "Siempre apagado (kernel: ninguno)" msgid "Always on (kernel: default-on)" msgstr "Siempre encendido (kernel: predeterminado)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "Envía siempre las Opciones DHCP. A veces es necesario, eje. PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -760,10 +967,14 @@ msgstr "" "Usará siempre canales de 40MHz incluso si el canal secundario se superpone. " "¡El uso de esta opción no cumple con IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "Cantidad de sondas de detección de direcciones duplicadas para enviar" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Cantidad de segundos de espera para que el módem esté listo" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Se produjo un error al guardar el formulario:" @@ -772,72 +983,23 @@ msgstr "Se produjo un error al guardar el formulario:" msgid "An optional, short description for this device" msgstr "Una breve descripción opcional de este dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Anexo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Anexo A + L + M (todos)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Anexo A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Anexo A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Anexo A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Anexo A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Anexo B (todos)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Anexo B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Anexo B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Anexo B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Anexo J (todos)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Anexo L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Anexo M (todos)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Anexo M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Anexo M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"Anunciar el prefijo NAT64 en mensajes RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Anuncie este dispositivo como servidor DNS IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -845,7 +1007,7 @@ msgstr "" "Anuncie este dispositivo como enrutador predeterminado si hay una ruta " "predeterminada IPv6 local." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -854,7 +1016,7 @@ msgstr "" "IPv6 público disponible, independientemente de la disponibilidad de la ruta " "predeterminada local." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -862,15 +1024,15 @@ msgstr "" "Anuncie este dispositivo como enrutador predeterminado independientemente de " "si hay un prefijo o una ruta predeterminada." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Dominios DNS anunciados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Servidores DNS IPv6 anunciados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Identidad anónima" @@ -882,7 +1044,7 @@ msgstr "Monte anónimo" msgid "Anonymous Swap" msgstr "Intercambio anónimo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Cualquier paquete" @@ -894,11 +1056,11 @@ msgstr "Cualquier paquete" msgid "Any zone" msgstr "Cualquier zona" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "Aplica las Opciones DHCP a esta red. (Vacío = todos los clientes)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "Aplicar y mantener la configuración" @@ -906,40 +1068,44 @@ msgstr "Aplicar y mantener la configuración" msgid "Apply backup?" msgstr "¿Aplicar respaldo?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Solicitud de aplicar fallida con estado %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Aplicar sin restricción" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "Aplicar con revertir después de la pérdida de conectividad" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Esperando a que se aplique la configuración… %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Arquitectura" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Arp-scan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Asigna una parte de la longitud dada de cada prefijo IPv6 público a esta " "interfaz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "Asigne nuevas etiquetas de forma libre a esta entrada." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -947,7 +1113,7 @@ msgstr "" "Asigna partes de prefijo utilizando este ID de subprefijo hexadecimal para " "esta interfaz." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Dispositivos conectados" @@ -956,9 +1122,8 @@ msgstr "Dispositivos conectados" msgid "Associations" msgstr "Dispositivos" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 -#, fuzzy +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" @@ -966,9 +1131,8 @@ msgstr "" "Al menos %h por %h, ráfaga de %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 -#, fuzzy +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -982,25 +1146,26 @@ msgstr "" "Intentar activar los puntos de montaje configurados para los dispositivos " "conectados" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Grupo de autenticaciones" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Autenticación" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Tipo de autenticación" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autorizado" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Autorización requerida" @@ -1008,7 +1173,9 @@ msgstr "Autorización requerida" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1028,7 +1195,7 @@ msgstr "" "Comprobar automáticamente el sistema de archivos para detectar errores antes " "del montaje" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1052,6 +1219,10 @@ msgstr "Montar el sistema de archivos automáticamente" msgid "Automount Swap" msgstr "Montar intercambio automáticamente" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Disponible" @@ -1070,11 +1241,15 @@ msgstr "Disponible" msgid "Average:" msgstr "Media:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Evitar bucles de puente" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1082,15 +1257,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "Transición BSS" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Volver" @@ -1099,11 +1278,7 @@ msgstr "Volver" msgid "Back to Overview" msgstr "Volver al resumen" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Volver a la configuración" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "Volver a la configuración de pares" @@ -1116,16 +1291,15 @@ msgid "Backup / Flash Firmware" msgstr "Respaldo / Grabar firmware" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Copia de seguridad de la lista de archivos" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Banda" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Dispositivo base" @@ -1133,12 +1307,44 @@ msgstr "Dispositivo base" msgid "Base64-encoded public key of this interface for sharing." msgstr "Clave pública codificada en Base64 de esta interfaz para compartir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Dispositivo Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Interfaz Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +#, fuzzy +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv tiene una fragmentación de capa 2 integrada para datos de " +"unidifusión que fluyen a través de la malla, lo que permitirá ejecutar " +"batman-adv en interfaces/conexiones que no permiten aumentar la MTU más allá " +"del tamaño de paquete estándar de Ethernet de 1500 bytes. Cuando la " +"fragmentación está activada, batman-adv fragmentará automáticamente los " +"paquetes de gran tamaño y los desfragmentará en el otro extremo. Por " +"defecto, la fragmentación está activada y sin uso si el paquete se ajusta, " +"pero es posible desactivar la fragmentación por completo." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Intervalo de baliza" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Informe de baliza" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1150,11 +1356,10 @@ msgstr "" "el usuario." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:287 -#, fuzzy msgid "Bind NTP server" -msgstr "Vincular servidor NTP" +msgstr "Vincular a servidor NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "Enlaza dinámicamente a las interfaces en lugar de a la dirección comodín." @@ -1164,18 +1369,35 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Interfaz de enlace" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" +"Vincular registros de servicios a un nombre de dominio: especifique la " +"ubicación de los servicios." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"Vincular registros de servicios a un nombre de dominio: especifique la " +"ubicación de los servicios. Consulte RFC2782." + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1187,69 +1409,84 @@ msgstr "Enlazar el túnel a esta interfaz (opcional)." msgid "Bitrate" msgstr "Tasa de bits" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Modo de vinculación" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Política de vinculación" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" +"Se deben especificar tanto \"Retransmisión desde\" como \"Retransmisión " +"hacia dirección\"." + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Puente" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Puente (Soporta comunicación directa entre MAC VLANs)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Filtrado de VLAN del puente" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Dispositivo puente" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 #, fuzzy msgid "Bridge port specific options" msgstr "Opciones específicas del puerto de puente" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Puertos del puente" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 #, fuzzy msgid "Bridge traffic table \"%h\"" msgstr "Tabla de tráfico de puente \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 #, fuzzy msgid "Bridge unit number" msgstr "Número de unidad del puente" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 #, fuzzy msgid "Bring up empty bridge" msgstr "Levantar el puente vacío" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Iniciar en el arranque" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "Activar la interfaz de puente incluso si no hay puertos conectados" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +#, fuzzy +msgid "Broadcast" +msgstr "Difusión" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" -msgstr "Política de difusión (difusión, 3)" +msgstr "Política de difusión (transmisión, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Explorar…" @@ -1257,15 +1494,39 @@ msgstr "Explorar…" msgid "Buffered" msgstr "En búfer" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" +"Certificado de CA (codificado con PEM; utilícelo en lugar del almacén de " +"todo el sistema para verificar el certificado de la puerta de enlace." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "Certificado de CA; Si está vacío se guardará después de la primera conexión." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "Configuración CLAT fallida" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "CNAME" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME o fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (interfaz administrada externamente)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Uso de CPU (%)" @@ -1280,18 +1541,25 @@ msgstr "En caché" msgid "Call failed" msgstr "Llamada fallida" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"Puede ser útil si el ISP tiene servidores de nombres IPv6 pero no " +"proporciona enrutamiento IPv6." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Cancelar" @@ -1299,34 +1567,34 @@ msgstr "Cancelar" msgid "Cannot parse configuration: %s" msgstr "No se puede analizar la configuración: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "Captura paquetes entrantes dirigidos a otros hosts" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" "Capture los paquetes entrantes antes de cualquier decisión de enrutamiento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "Capturar paquetes entrantes enrutados al sistema local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" "Capture paquetes salientes después de cualquier decisión de enrutamiento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "Capture los paquetes salientes que se originan en el sistema local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "Capture paquetes directamente después de que la NIC los haya recibido" @@ -1335,24 +1603,32 @@ msgstr "Capture paquetes directamente después de que la NIC los haya recibido" msgid "Category" msgstr "Categoría" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "ID de celda" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "Ubicación de la celda" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Restricción de certificado (Dominio)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Restricción de certificado (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Restricción de certificado (Asunto)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Restricción de certificado (Comodín)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1361,8 +1637,8 @@ msgstr "" ">Consulte `logread -f` durante el protocolo de enlace para conocer los " "valores reales" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1370,8 +1646,8 @@ msgstr "" "Restricción(es) de certificado contra valores DNS SAN (si están " "disponibles)
    o Asunto CN (coincidencia exacta)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1379,8 +1655,8 @@ msgstr "" "Restricción(es) de certificado contra valores DNS SAN (si están " "disponibles)
    o Asunto CN (coincidencia de sufijo)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1395,17 +1671,17 @@ msgstr "" msgid "Chain" msgstr "Cadena" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 #, fuzzy msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "Gancho de cadena \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Cambios" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Se revirtieron los cambios." @@ -1416,18 +1692,19 @@ msgstr "Cambie la contraseña del administrador para acceder al dispositivo" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Canal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Análisis de canales" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Ancho de banda" @@ -1435,7 +1712,7 @@ msgstr "Ancho de banda" msgid "Check filesystems before mount" msgstr "Comprobar los sistemas de archivos antes de montar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "Marque esta opción para eliminar las redes existentes de esta radio." @@ -1452,8 +1729,8 @@ msgstr "Comprobando imagen…" msgid "Choose mtdblock" msgstr "Elegir mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1465,7 +1742,7 @@ msgstr "" "asociada o rellene el campo personalizado para definir una zona " "nueva a la que asignarla." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1473,7 +1750,7 @@ msgstr "" "Elija la red o redes a las que quiere unir esta interfaz Wi-Fi o rellene el " "campo personalizado para definir una red nueva." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Cifrado" @@ -1497,9 +1774,10 @@ msgstr "" "Haga clic en \"Guardar mtdblock\" para descargar el archivo mtdblock " "especificado. (NOTA: ¡ESTA FUNCIÓN ES PARA PROFESIONALES!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Cliente" @@ -1508,9 +1786,9 @@ msgstr "Cliente" msgid "Client ID to send when requesting DHCP" msgstr "ID de cliente que se enviará al solicitar DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Cerrar" @@ -1527,20 +1805,20 @@ msgstr "" "Cerrar las conexiones inactivas tras los segundos dados. Use 0 para una " "conexión permanente" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Cerrar lista..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Recolectando datos…" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "Colisiones vistas" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Comando" @@ -1557,7 +1835,7 @@ msgstr "Comando fallido" msgid "Comment" msgstr "Comentario" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1581,29 +1859,28 @@ msgstr "Calcular la suma de verificación saliente (opcional)." msgid "Config File" msgstr "Archivo de configuración" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Configuración" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "Exportación de la configuración" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Se ha aplicado la configuración." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "¡La configuración ha sido revertida!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Configuración fallida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1614,13 +1891,13 @@ msgid "" msgstr "" "Configura velocidades de datos según la densidad de la celda de cobertura. " "Normal configura las velocidades básicas a 6, 12, 24 Mbps si no se utilizan " -"las velocidades heredadas de 802.11b, sino a 5,5, 11 Mbps. Alto configura " +"las velocidades heredadas de 802.11b, sino a 5.5, 11 Mbps. Alto configura " "las velocidades básicas a 12, 24 Mbps si las velocidades de 802.11b " "heredadas no se utilizan más allá de la velocidad de 11 Mbps. Muy alto " "configura 24 Mbps como velocidad básica. No se ofrecen tarifas admitidas " "inferiores a la tarifa básica mínima." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." @@ -1628,7 +1905,7 @@ msgstr "" "Configura el anuncio de enrutador predeterminado en los mensajes RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1636,17 +1913,17 @@ msgstr "" "Configura el modo de operación del servicio RA en esta interfaz." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "Configura el modo de operación del servicio DHCPv6 en esta interfaz." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" "Configura el modo de operación del servicio de proxy NDP en esta interfaz." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Configurar…" @@ -1658,9 +1935,10 @@ msgstr "Confirmar desconexión" msgid "Confirmation" msgstr "Confirmación" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Conectado" @@ -1670,11 +1948,11 @@ msgstr "Conectado" msgid "Connection attempt failed" msgstr "Intento de conexión fallido" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "Intento de conexión fallido." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "Punto final de conexión" @@ -1686,7 +1964,7 @@ msgstr "Conexión perdida" msgid "Connections" msgstr "Conexiones" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "Cambio de conectividad" @@ -1720,9 +1998,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Se han guardado los contenidos." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1733,17 +2011,17 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "Continuar en %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 #, fuzzy msgid "Continue in calling chain" msgstr "Continuar en cadena de llamadas" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "Continuar procesando paquetes no coincidentes" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1758,20 +2036,20 @@ msgstr "" msgid "Country" msgstr "País" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Código de país" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Densidad celular de cobertura" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Crear / Asignar zona de cortafuegos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Crear interfaz" @@ -1783,7 +2061,7 @@ msgstr "Crítico" msgid "Cron Log Level" msgstr "Nivel de registro de cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Potencia actual" @@ -1827,32 +2105,32 @@ msgstr "" "Personaliza el comportamiento de los LEDs del dispositivo, si es posible." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 #, fuzzy msgid "DAD transmits" msgstr "DAD transmite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "Cliente DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "Puerto DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "Secreto DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "Opciones DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Servidor DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP y DNS" @@ -1863,16 +2141,24 @@ msgstr "DHCP y DNS" msgid "DHCP client" msgstr "Cliente DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Opciones de DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" +"El tiempo de asignación de DHCPv4 se utiliza como límite y vida " +"útil preferida del prefijo IPv6." + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "Cliente DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "Servicio DHCPv6" @@ -1884,19 +2170,19 @@ msgstr "Servicio DHCPv6" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Reenvíos de DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "Puerto de consultas DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "Dominios de búsqueda de DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "Puerto del servidor DNS" @@ -1904,7 +2190,7 @@ msgstr "Puerto del servidor DNS" msgid "DNS setting is invalid" msgstr "La configuración de DNS no es válida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "Peso de DNS" @@ -1912,11 +2198,11 @@ msgstr "Peso de DNS" msgid "DNS-Label / FQDN" msgstr "Etiqueta DNS / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "Comprobación DNSSEC sin firmar" @@ -1928,39 +2214,47 @@ msgstr "Tiempo de espera de inactividad de DPD" msgid "DS-Lite AFTR address" msgstr "Dirección DS-Lite AFTR" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "Estado DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "Modo de línea DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "Intervalo DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Velocidad de datos" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Datos recibidos" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Datos transmitidos" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Depurar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Enrutador predeterminado" @@ -1968,7 +2262,7 @@ msgstr "Enrutador predeterminado" msgid "Default state" msgstr "Estado predeterminado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1978,7 +2272,7 @@ msgstr "" "\"6,192.168.2.1,192.168.2.2\" que publica diferentes servidores " "DNS a los clientes." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" @@ -1986,7 +2280,7 @@ msgstr "" "Define una asignación de la prioridad de los paquetes internos de Linux a la " "prioridad del encabezado de la VLAN, pero para las tramas salientes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" @@ -1994,49 +2288,50 @@ msgstr "" "Define una asignación de la prioridad del encabezado de la VLAN a la " "prioridad del paquete interno de Linux en las tramas entrantes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "Defina una MTU específica para esta ruta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "Delegar prefijos de IPv6" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Eliminar" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Eliminar clave" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Error al eliminar la solicitud: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Eliminar esta red" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Intervalo de mensaje de indicación de tráfico de entrega" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Descripción" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Deseleccionar" @@ -2044,11 +2339,11 @@ msgstr "Deseleccionar" msgid "Design" msgstr "Diseño" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "Maestro designado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2083,9 +2378,9 @@ msgstr "Zona de destino" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2095,36 +2390,40 @@ msgstr "Zona de destino" msgid "Device" msgstr "Dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Configuración del dispositivo" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "Identificador de dispositivo" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "El dispositivo no está activo" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "El dispositivo se está reiniciando…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Nombre del dispositivo" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Dispositivo no administrado por ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Dispositivo no presente" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Tipo de dispositivo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Dispositivo inalcanzable!" @@ -2132,31 +2431,31 @@ msgstr "Dispositivo inalcanzable!" msgid "Device unreachable! Still waiting for device..." msgstr "¡Dispositivo inalcanzable! Todavía esperando al dispositivo..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Dispositivos" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnósticos" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Marcar el número" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Directorio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Desactivar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2173,20 +2472,24 @@ msgstr "Desactivar búsquedas de DNS" msgid "Disable Encryption" msgstr "Desactivar encriptación" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Desactivar sondeo de inactividad" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Desactivar esta red" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2195,16 +2498,16 @@ msgstr "Desactivar esta red" msgid "Disabled" msgstr "Desactivado" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "Desactivado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Desasociarse en un reconocimiento bajo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" @@ -2212,18 +2515,17 @@ msgstr "" "href=\"%s\">RFC1918." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Desconectar" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Intento de desconexión fallido" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Intento de desconexión fallido." @@ -2233,23 +2535,38 @@ msgstr "Espacio del disco" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Descartar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Optimización de distancia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Distancia en metros al miembro mas lejano de la red." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Tabla ARP distribuida" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +#, fuzzy +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" +"Instancia de Dnsmasq a la que está vinculada esta sección de host DHCP. Si " +"no se especifica, la sección es válida para todas las instancias de dnsmasq." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2257,7 +2574,7 @@ msgstr "" "Instancia de Dnsmasq a la que está vinculada esta sección de arranque. Si no " "se especifica, la sección es válida para todas las instancias de dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP ligero y un reenviador DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" "No almacene en caché las respuestas negativas, p. e. para dominios " @@ -2281,33 +2598,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "No crear una ruta de host al par (opcional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "No reenviar consultas de DNS sin puntos o partes de dominio." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"No reenviar consultas que no puedan ser respondidas por resolutores públicos." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." -msgstr "No reenviar búsquedas inversas para redes locales" +msgstr "No reenviar búsquedas inversas para redes locales." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "No escuchar en las interfaces especificadas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "No ofrezca el servicio DHCPv6 en esta interfaz." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "No participar" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2319,7 +2626,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "No enviar un nombre de host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2327,11 +2634,11 @@ msgstr "" "No envíe ningún mensaje RA en esta interfaz." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "¿Realmente quieres eliminar \"%s\" ?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "¿Realmente quiere eliminar la siguiente clave SSH?" @@ -2339,11 +2646,11 @@ msgstr "¿Realmente quiere eliminar la siguiente clave SSH?" msgid "Do you really want to erase all settings?" msgstr "¿Realmente quieres borrar todos las configuraciones?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "¿Realmente desea eliminar recursivamente el directorio \"%s\" ?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "¿Quieres reemplazar el PSK actual?" @@ -2351,15 +2658,17 @@ msgstr "¿Quieres reemplazar el PSK actual?" msgid "Do you want to replace the current keys?" msgstr "¿Quieres reemplazar las claves actuales?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Dominio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Requerir dominio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Lista blanca de dominios" @@ -2385,11 +2694,11 @@ msgstr "Descargar copia de seguridad" msgid "Download mtdblock" msgstr "Descargar mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Desplazamiento SNR en sentido descendente" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2405,16 +2714,64 @@ msgstr "Arrastrar para reordenar" msgid "Drop Duplicate Frames" msgstr "Soltar marcos duplicados" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"Descarte todas las tramas ARP gratuitas, por ejemplo, si hay un buen proxy " +"ARP conocido en la red y dichas tramas no necesitan usarse o, en el caso de " +"802.11, no deben usarse para evitar ataques." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Elimine todos los anuncios de vecinos no solicitados, por ejemplo, si hay un " +"buen proxy NA conocido en la red y no es necesario usar dichos marcos o, en " +"el caso de 802.11, no deben usarse para evitar ataques." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Descartar ARP gratuito" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" +"Descartar tramas de multidifusión de capa 2 que contengan paquetes de " +"unidifusión IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" +"Descartar tramas de multidifusión de capa 2 que contengan paquetes de " +"unidifusión IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Descartar la unidifusión de IPv4 anidada" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Descartar unidifusión IPv6 anidada" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Descartar paquete" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "Descartar paquetes no coincidentes" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Descartar NA no solicitado" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Instancia Dropbear" @@ -2432,22 +2789,22 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "DHCP dinámico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 #, fuzzy msgid "Dynamic Authorization Extension client." msgstr "Cliente de extensión de autorización dinámica." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 #, fuzzy msgid "Dynamic Authorization Extension port." msgstr "Puerto de extensión de autorización dinámica." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 #, fuzzy msgid "Dynamic Authorization Extension secret." msgstr "Secreto de extensión de autorización dinámica." @@ -2456,7 +2813,7 @@ msgstr "Secreto de extensión de autorización dinámica." msgid "Dynamic tunnel" msgstr "Túnel dinámico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2464,21 +2821,34 @@ msgstr "" "Reparte direcciones DHCP dinámicamente a los clientes. Si se desactiva, solo " "se dará a clientes con asignaciones estáticas." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +#, fuzzy +msgid "E.g. br-vlan or brvlan." +msgstr "P. e. br-vlan o brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "P. e. eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "Longitud de bits EA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Método EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "A cada STA se le asigna su propia interfaz AP_VLAN." + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Editar" @@ -2486,6 +2856,11 @@ msgstr "Editar" msgid "Edit peer" msgstr "Editar par" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +#, fuzzy +msgid "Edit static lease" +msgstr "Editar asignación estática" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2494,11 +2869,11 @@ msgstr "" "Edite los datos de configuración sin procesar anteriores para corregir " "cualquier error y presione \"Guardar\" para volver a cargar la página." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Editar esta red" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Editar red Wi-Fi" @@ -2507,46 +2882,36 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "Ruta efectiva MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Mapeo de QoS de salida" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "ID del dispositivo de salida" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Nombre del dispositivo de salida" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Salida etiquetada" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Salida sin etiquetar" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Emergencia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Activar" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" "Activar / Desactivar par. Reinicie la interfaz wireguard para aplicar los " "cambios." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2554,11 +2919,11 @@ msgstr "" "Activar IGMP " "Snooping" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Activar STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "Activar SLAAC" @@ -2576,10 +2941,11 @@ msgstr "Activar mezcla dinámica de flujos" msgid "Enable HE.net dynamic endpoint update" msgstr "Activar actualización dinámica de punto final HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Activar IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Activar negociación IPv6" @@ -2593,11 +2959,15 @@ msgstr "Activar negociación IPv6" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Activar negociación IPv6 en el enlace PPP" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "Activar el enrutamiento de segmentos IPv6" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Activar paso de tramas jumbo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "Activar el aprendizaje de direcciones MAC" @@ -2609,11 +2979,11 @@ msgstr "Activar cliente NTP" msgid "Enable Single DES" msgstr "Activar sólo DES" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Activar servidor TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Activar el filtrado de VLAN" @@ -2621,7 +2991,7 @@ msgstr "Activar el filtrado de VLAN" msgid "Enable VLAN functionality" msgstr "Activar funcionalidad VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Activar botón WPS, requiere WPA(2)-PSK/WPA3-SAE" @@ -2635,14 +3005,14 @@ msgstr "" "Transfer Protocol\">HTTP al puerto HTTPS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" "Activa la delegación descendente de prefijos IPv6 disponibles en esta " "interfaz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Activar las medidas correctivas de reinstalación de claves (KRACK)" @@ -2658,26 +3028,26 @@ msgstr "Activar la duplicación de paquetes entrantes" msgid "Enable mirroring of outgoing packets" msgstr "Activar la duplicación de paquetes salientes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "Activar la salida rápida de multidifusión" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "Activar interrogador de multidifusión" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Activar soporte de multidifusión" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Activa el direccionamiento de paquetes en todas las CPU. Puede ayudar o " "dificultar la velocidad de la red." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Activar modo promiscuo" @@ -2700,11 +3070,11 @@ msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" "Activar el indicador DF (No fragmentar) de los paquetes de encapsulación." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "Activa el servidor TFTP de instancia única integrado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Activar esta red" @@ -2713,21 +3083,24 @@ msgstr "Activar esta red" msgid "Enable tx checksum" msgstr "Activar suma de verificación tx" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "Activar inundación unidifusión" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Activado" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Activa IGMP Snooping en este puente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2735,7 +3108,15 @@ msgstr "" "Activa la itinerancia rápida entre los puntos de acceso que pertenecen al " "mismo dominio de movilidad" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" +"Activa una infraestructura de reenvío de multidifusión más eficiente y " +"consciente de los grupos en batman-adv." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Activa el protocolo Spanning Tree en este puente" @@ -2743,24 +3124,29 @@ msgstr "Activa el protocolo Spanning Tree en este puente" msgid "Encapsulation limit" msgstr "Límite de encapsulación" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Modo de encapsulado" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Encriptación" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Punto final" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Punto final de Host" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Punto final del puerto" @@ -2768,23 +3154,23 @@ msgstr "Punto final del puerto" msgid "Endpoint setting is invalid" msgstr "La configuración del punto final no es válida" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "Hacer cumplir IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "Hacer cumplir IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "Hacer cumplir IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "Hacer cumplir la versión 1 de MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "Hacer cumplir la versión 2 de MLD" @@ -2813,10 +3199,6 @@ msgstr "Error" msgid "Error getting PublicKey" msgstr "Error al obtener PublicKey" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Segundos errados (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2835,11 +3217,19 @@ msgstr "Cada 30 segundos (lento, 0)" msgid "Every second (fast, 1)" msgstr "Cada segundo (rápido, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Excluir interfaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"Ejecución de varios comandos de red para verificar la conexión y resolución " +"de nombres a otros sistemas." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2847,27 +3237,35 @@ msgstr "" "Exime a 127.0.0.0/8 y ::1 de volver a enlazar " "comprobaciones, p. e. para servicios RBL." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Dispositivo existente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Expandir hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Número de puerto esperado." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Esperando una pista de asignación hexadecimal" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Esperando una dirección IPv4 válida" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Esperando una dirección IPv6 válida" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "Esperando una dirección MAC válida, opcionalmente incluyendo comodines" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Esperando dos valores de prioridad separados por dos puntos" @@ -2876,11 +3274,11 @@ msgstr "Esperando dos valores de prioridad separados por dos puntos" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Esperando: %s" @@ -2892,7 +3290,7 @@ msgstr "Esperando: valor no vacío" msgid "Expires" msgstr "Expira" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2903,11 +3301,11 @@ msgstr "" msgid "External" msgstr "Externo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Lista de soporte de clave externa R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Lista de soporte de clave externa R1" @@ -2935,37 +3333,65 @@ msgstr "Opciones de pppd adicionales" msgid "Extra sstpc options" msgstr "Opciones de sstpc adicionales" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT sobre DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT sobre The Air" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "Protocolo FT" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "Motivo fallido" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Error al cambiar la contraseña del sistema." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "No se pudo configurar el módem" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" "Error al confirmar aplicar dentro de %ds. Esperando a que se reviertan los " "cambios…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Error al conectar" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "No se pudo desconectar" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Error al ejecutar la acción \"/etc/init.d/%s%s\": %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "No se pudo obtener la información del módem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "No se pudo inicializar el módem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "No se pudo establecer el modo de funcionamiento" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Archivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2974,40 +3400,49 @@ msgstr "" "del dominio, p. e. servidor=1.2.3.4, servidor=/" "dominio/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Archivo no accesible" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "Archivo para almacenar información de asignaciones de DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "Archivo con resolutores ascendentes." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Nombre de archivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Nombre del archivo de la imagen de inicio anunciada a los clientes." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:315 msgid "Filesystem" -msgstr "Sistema de archivos" +msgstr "sistema de archivos" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#, fuzzy +msgid "Filter IPv4 A records" +msgstr "Filtrar registros A IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Filtrar registros AAAA IPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Filtrar el descubrimiento de servicios SRV/SOA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filtro privado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filtro inútil" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Filtrado para todos los esclavos, sin validación" @@ -3022,8 +3457,16 @@ msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" "Filtrado para todos los esclavos, validación solo para esclavos de respaldo" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +#, fuzzy +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" +"Filtra el descubrimiento de servicios SRV/SOA para evitar la activación de " +"enlaces de marcación bajo demanda." + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "La finalización falló" @@ -3036,7 +3479,7 @@ msgstr "" "intercambie y reemplace la configuración con los valores predeterminados " "según lo que se detectó" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Encontrar y unirse a red" @@ -3050,10 +3493,11 @@ msgid "Firewall" msgstr "Cortafuegos" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Marca de Cortafuegos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Configuración del cortafuegos" @@ -3061,22 +3505,22 @@ msgstr "Configuración del cortafuegos" msgid "Firewall Status" msgstr "Estado del Cortafuegos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 #, fuzzy msgid "Firewall mark" msgstr "Marca de cortafuegos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Archivo de firmware" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Versión del firmware" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." -msgstr "Puerto origen fijo para peticiones de DNS salientes" +msgstr "Puerto origen fijo para peticiones de DNS salientes." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:312 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:449 @@ -3100,40 +3544,49 @@ msgstr "Operaciones de instalación" msgid "Flashing…" msgstr "Instalando…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "Seguir la vida útil de IPv4" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Forzar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Forzar modo 40MHz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Forzar CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Forzar DHCP en esta red incluso si se detecta otro servidor." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "Forzar versión IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "Forzar versión MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Forzar TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Forzar TKIP y CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +#, fuzzy +msgid "Force broadcast DHCP response." +msgstr "Forzar la respuesta de la difusión de DHCP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Forzar enlace" @@ -3145,12 +3598,11 @@ msgstr "Forzar actualización" msgid "Force use of NAT-T" msgstr "Forzar uso de NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "No coincide el token del formulario" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 -#, fuzzy +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NDP NS y mensajes \n" -"NA entre la " -"interfaz maestra designada y las interfaces posteriores." +"title=\"Neighbour Solicitation, Type 135\">NS
    y mensajes NA entre la interfaz " +"maestra designada y las interfaces posteriores." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3176,7 +3628,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Reenviar tráfico DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3184,41 +3636,46 @@ msgstr "" "Reenvíe mensajes DHCPv6 entre la interfaz maestra designada y las interfaces " "descendentes." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "Segundos de corrección de errores de reenvío (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Reenviar tráfico de difusión" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 #, fuzzy msgid "Forward delay" msgstr "Retraso de reenvío" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Reenviar tráfico de pares de malla" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" "Reenviar paquetes de multidifusión como paquetes de unidifusión en este " "dispositivo." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +#, fuzzy +msgid "Forward/reverse DNS" +msgstr "DNS directo/inverso" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Modo de reenvío" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Fragmentación" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Umbral de fragmentación" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:62 msgctxt "nft nat flag fully-random" msgid "Full port randomization" -msgstr "Aleatorización completa de de puertos" +msgstr "Aleatorización completa de puertos" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:214 msgid "" @@ -3235,7 +3692,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Sólo GPRS" @@ -3255,12 +3712,16 @@ msgstr "Túnel GRETAP sobre IPv4" msgid "GRETAP tunnel over IPv6" msgstr "Túnel GRETAP sobre IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Puerta de enlace" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Modo de puerta de enlace" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Puertos del gateway" @@ -3270,23 +3731,23 @@ msgstr "Puertos del gateway" msgid "Gateway address is invalid" msgstr "La dirección de la puerta de enlace no es válida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Configuración general" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Configuración general" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Opciones generales del dispositivo" @@ -3294,7 +3755,7 @@ msgstr "Opciones generales del dispositivo" msgid "Generate Config" msgstr "Generar Config" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Generar PMK localmente" @@ -3302,11 +3763,11 @@ msgstr "Generar PMK localmente" msgid "Generate archive" msgstr "Generar archivo" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "Generar configuración" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "Generar configuración…" @@ -3314,16 +3775,16 @@ msgstr "Generar configuración…" msgid "Generate new key pair" msgstr "Generar nuevo par de claves" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "Generar clave precompartida" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 #, fuzzy msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "Genera una configuración adecuada para importar en un par de WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "Generando código QR…" @@ -3337,39 +3798,40 @@ msgstr "" msgid "Global Settings" msgstr "Configuración global" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Opciones globales de red" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "Ir a actualización de firmware..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Ir a la configuración de la contraseña..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Ir a la página de configuración relevante" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "Conceder acceso a la configuración de DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Otorgar acceso a la pantalla de estado de DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "Conceder acceso a la pantalla de estado DSL" @@ -3381,6 +3843,11 @@ msgstr "Conceder acceso a los procedimientos de OpenConnect de LuCI" msgid "Grant access to LuCI Wireguard procedures" msgstr "Otorgar acceso a los procedimientos de Wireguard de LuCI" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +#, fuzzy +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Otorgar acceso a los procedimientos LuCI openfortivpn" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "Conceder acceso a la configuración de SSH" @@ -3417,7 +3884,7 @@ msgstr "Conceder acceso a la configuración de montaje" msgid "Grant access to network configuration" msgstr "Conceder acceso a la configuración de red" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Conceder acceso a las herramientas de diagnóstico de red" @@ -3425,6 +3892,10 @@ msgstr "Conceder acceso a las herramientas de diagnóstico de red" msgid "Grant access to network status information" msgstr "Conceder acceso a la información del estado de la red" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "Conceder acceso al estado del proceso" @@ -3457,7 +3928,7 @@ msgstr "Otorgar acceso a la configuración de uHTTPd" msgid "Grant access to wireless channel status" msgstr "Otorgar acceso al estado del canal inalámbrico" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Otorgar acceso a la pantalla de estado de Wi-Fi" @@ -3486,15 +3957,11 @@ msgstr "Acceso HTTP(S)" msgid "Hang Up" msgstr "Suspender" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Errores de código de error de encabezado (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Intervalo de latidos (kernel: latido)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Intervalo de contacto" @@ -3506,7 +3973,7 @@ msgstr "" "Aquí puede configurar los aspectos básicos de su dispositivo, como el nombre " "del host o la zona horaria." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Ocultar ESSID" @@ -3515,18 +3982,26 @@ msgstr "Ocultar ESSID" msgid "Hide empty chains" msgstr "Ocultar cadenas vacias" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "Alto" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "Honor ARP gratuito" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 #, fuzzy msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "Gancho: %h (%h), Prioridad: %d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Penalización de salto" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3536,7 +4011,7 @@ msgstr "Host" msgid "Host expiry timeout" msgstr "Tiempo de espera de expiración del host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 #, fuzzy msgid "Host requests this filename from the boot server." msgstr "El host solicita este nombre de archivo al servidor de arranque." @@ -3545,10 +4020,18 @@ msgstr "El host solicita este nombre de archivo al servidor de arranque." msgid "Host-Uniq tag content" msgstr "Contenido de la etiqueta Host-Uniq" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" +"Tiempo de asignación específico del host, p. e. 5m, 3h, 7d." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3558,11 +4041,11 @@ msgstr "Nombre de host" msgid "Hostname to send when requesting DHCP" msgstr "Nombre del host a enviar cuando se solicite una IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Nombres de host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3622,23 +4105,27 @@ msgstr "IEEE 802.3ad Agregación dinámica de enlace (802.3ad, 4)" msgid "IKE DH Group" msgstr "Grupo IKE DH" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "IMEI" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "Direcciones IP" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "Protocolo IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "Conjuntos de IP" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "Tipo de IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3654,7 +4141,7 @@ msgstr "La dirección IP no es válida" msgid "IP address is missing" msgstr "Falta la dirección IP" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3669,20 +4156,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "Protocolo IP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "Protocolo IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "Conjunto de IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "Conjuntos de IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "IPs a anular con NXDOMAIN" @@ -3690,14 +4177,15 @@ msgstr "IPs a anular con NXDOMAIN" msgid "IPsec XFRM" msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3713,7 +4201,7 @@ msgstr "Vecinos IPv4" msgid "IPv4 Routing" msgstr "Enrutamiento IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "Reglas de IPv4" @@ -3723,7 +4211,7 @@ msgstr "Conexión IPv4 ascendente" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3750,9 +4238,9 @@ msgstr "Máscara de red IPv4" msgid "IPv4 network in address/netmask notation" msgstr "Red IPv4 en notación de dirección / máscara de red" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" -msgstr "Sólo IPv4" +msgstr "Solo IPv4" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:52 msgid "IPv4 prefix" @@ -3763,11 +4251,11 @@ msgstr "Prefijo IPv4" msgid "IPv4 prefix length" msgstr "Longitud de prefijo IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "Tabla de tráfico IPv4 \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3776,16 +4264,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4 en IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (ambos: el valor predeterminado es IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "Tabla de tráfico IPv4/IPv6 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3796,7 +4288,8 @@ msgstr "Tabla de tráfico IPv4/IPv6 \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3804,7 +4297,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Cortafuegos IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "MTU IPv6" @@ -3812,7 +4305,11 @@ msgstr "MTU IPv6" msgid "IPv6 Neighbours" msgstr "Vecinos de IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "Vida útil del prefijo IPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "Configuración de RA de IPv6" @@ -3820,15 +4317,15 @@ msgstr "Configuración de RA de IPv6" msgid "IPv6 Routing" msgstr "Enrutamiento IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "Reglas de IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "Configuraciones IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "Prefijo ULA IPv6" @@ -3842,12 +4339,12 @@ msgstr "Conexión IPv6 ascendente" msgid "IPv6 address" msgstr "Dirección IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "Sugerencia de asignación de IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "Longitud de asignación de IPv6" @@ -3859,11 +4356,11 @@ msgstr "Puerta de enlace IPv6" msgid "IPv6 network in address/netmask notation" msgstr "Red IPv6 en notación de dirección / máscara de red" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" -msgstr "Sólo IPv6" +msgstr "Solo IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "Preferencia de IPv6" @@ -3872,7 +4369,7 @@ msgstr "Preferencia de IPv6" msgid "IPv6 prefix" msgstr "Prefijo IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "Filtro de prefijo IPv6" @@ -3886,24 +4383,20 @@ msgstr "Longitud de prefijo IPv6" msgid "IPv6 routed prefix" msgstr "Prefijo IPv6 enrutado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 #, fuzzy msgid "IPv6 source routing" msgstr "Enrutamiento de origen IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "Sufijo IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "Sufijo IPv6 (hex)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "Soporte IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "Tabla de tráfico IPv6 \"%h\"" @@ -3911,6 +4404,10 @@ msgstr "Tabla de tráfico IPv6 \"%h\"" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "Sufijo IPv6 (hexadecimal)" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3926,10 +4423,19 @@ msgstr "IPv6-sobre-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-sobre-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identidad" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" +"Si un host coincide con una entrada que no se puede usar porque especifica " +"una dirección en una subred diferente, se establece la etiqueta known-" +"othernet." + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Si está comprobado, 1DES está activado" @@ -3942,7 +4448,7 @@ msgstr "Si está marcado, agrega \"+ipv6\" a las opciones de pppd" msgid "If checked, encryption is disabled" msgstr "Si está marcado, la encriptación estará desactivada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." @@ -3950,7 +4456,7 @@ msgstr "" "Si se establece, las subredes descendentes solo se asignan a partir de las " "clases de prefijo IPv6 dadas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" "Si se establece, el significado de las opciones de coincidencia se invierte" @@ -3972,7 +4478,7 @@ msgstr "" "Montar el dispositivo por la etiqueta de la partición en vez de por el nodo " "fijo de dispositivo si se especifica" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " @@ -3983,14 +4489,16 @@ msgstr "" "confirmar la configuración; de lo contrario, se revertirán las " "modificaciones." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Si no está marcado, no se configurará ninguna ruta predeterminada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -4011,15 +4519,24 @@ msgstr "" "puede transferir volúmenes de información a alta velocidad tal y como hace " "la RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "Ignorar" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignorar /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Desactivar DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" +"Ignora las solicitudes de máquinas desconocidas usando !known." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignorar el archivo resolve" @@ -4031,25 +4548,25 @@ msgstr "Imagen" msgid "Image check failed:" msgstr "Verificación de imagen fallida:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "Importar como par" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "Importar configuración" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "Importar configuración como par…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "Importar ajustes" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "Configuración del par importada" @@ -4063,7 +4580,30 @@ msgstr "" msgid "In" msgstr "Entrada" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" +"En DHCPv4, es posible incluir más de una dirección mac. Esto permite asociar " +"una dirección IP con múltiples direcciones mac, y dnsmasq abandona una " +"asignación DHCP a una de las direcciones mac cuando otro solicita una " +"asignación. Solo funciona de manera confiable si solo una de las direcciones " +"mac está activa en cualquier momento." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +#, fuzzy +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"En las configuraciones de LAN en puente, es recomendable activar la " +"prevención de bucles de puente para evitar bucles de difusión que pueden " +"paralizar toda la LAN." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -4072,7 +4612,7 @@ msgstr "" "bloqueada. Haga clic en \"Continuar »\" a continuación para volver a la " "página anterior." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "En segundos" @@ -4104,7 +4644,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Suma de comprobación entrante" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Interfaz entrante" @@ -4112,6 +4652,7 @@ msgstr "Interfaz entrante" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Clave entrante" @@ -4130,22 +4671,21 @@ msgstr "Info" msgid "Information" msgstr "Información" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "Mapeo de QoS de entrada" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "ID de dispositivo de entrada" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "Nombre del dispositivo de entrada" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Fallo de inicialización" @@ -4157,31 +4697,43 @@ msgstr "Nombre del script de inicio" msgid "Initscripts" msgstr "Scripts de inicio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Restricción de certificado interno (Dominio)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Restricción de certificado interno (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Restricción de certificado interno (Asunto)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Restricción de certificado interno (Comodín)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Instalar extensiones de protocolo..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Instancia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +#, fuzzy +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Instancia" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +#, fuzzy +msgid "Instance Details" +msgstr "Instancia" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4193,6 +4745,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Permisos insuficientes para leer la configuración de UCI." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "Identificador de tarjeta de circuito integrado" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4200,7 +4756,7 @@ msgstr "Permisos insuficientes para leer la configuración de UCI." msgid "Interface" msgstr "Interfaz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "La interfaz \"%h\" ya está marcada como maestra designada." @@ -4208,7 +4764,7 @@ msgstr "La interfaz \"%h\" ya está marcada como maestra designada." msgid "Interface %q device auto-migrated from %q to %q." msgstr "La interfaz %q del dispositivo migra automáticamente de %q a %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Configuración de la interfaz" @@ -4239,11 +4795,11 @@ msgstr "Reconectando interfaz..." msgid "Interface is shutting down..." msgstr "Deteniendo interfaz..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "La interfaz se está iniciando..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "La interfaz se está deteniendo..." @@ -4252,12 +4808,12 @@ msgid "Interface name" msgstr "Nombre de la interfaz" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "La interfaz no existe o no está aún conectado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Interfaces" @@ -4266,15 +4822,19 @@ msgstr "Interfaces" msgid "Internal" msgstr "Interno" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Error interno del servidor" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "Identidad de equipo de estación móvil internacional" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "Identidad de suscriptor móvil internacional" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Intervalo para enviar paquetes de aprendizaje" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4285,7 +4845,7 @@ msgstr "" "en la subred; los valores más grandes hacen que las consultas IGMP se envíen " "con menos frecuencia" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "Intervalo en segundos para paquetes de saludo STP" @@ -4295,8 +4855,9 @@ msgid "Invalid" msgstr "Inválido" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "APN proporcionado inválido" @@ -4306,6 +4867,10 @@ msgstr "APN proporcionado inválido" msgid "Invalid Base64 key string" msgstr "Cadena de clave Base64 no válida" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Dirección IPv6 no válida" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4328,7 +4893,7 @@ msgstr "¡ID de VLAN no válido! Sólo se permiten IDs únicos" msgid "Invalid argument" msgstr "Argumento inválido" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4344,15 +4909,36 @@ msgstr "Comando inválido" msgid "Invalid hexadecimal value" msgstr "Valor hexadecimal inválido" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Nombre de host o dirección IPv4 no válidos" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Puerto no válido" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "URL del servidor no válida" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "¡Nombre de usuario y/o contraseña no válidos! Por favor reintente." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Invertir parpadeo" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "Invertir coincidencia" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "Es la VLAN principal" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Aislar clientes" @@ -4365,25 +4951,25 @@ msgstr "" "Parece que está intentando grabar una imagen de firmware mayor que la " "memoria flash de su equipo. ¡Por favor, verifique el archivo!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "¡Se necesita JavaScript!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Conectar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Conectarse a una red: Búsqueda de redes Wi-Fi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Conectarse a: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Saltar a la regla" @@ -4391,24 +4977,29 @@ msgstr "Saltar a la regla" msgid "Keep settings and retain the current configuration" msgstr "Mantener los ajustes y conservar la configuración actual" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +#, fuzzy +msgid "Keep-Alive" +msgstr "Mantener viva" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Registro del núcleo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Versión del núcleo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Clave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Clave #%d" @@ -4416,6 +5007,7 @@ msgstr "Clave #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Clave para paquetes entrantes (opcional)." @@ -4423,14 +5015,19 @@ msgstr "Clave para paquetes entrantes (opcional)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Clave para paquetes salientes (opcional)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "Falta la clave" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Clave utilizada para firmar la configuración de red" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4475,7 +5072,7 @@ msgstr "Intervalo de eco LCP" msgid "LED Configuration" msgstr "Configuración de LEDs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4492,32 +5089,41 @@ msgstr "Idioma" msgid "Language and Style" msgstr "Idioma y Estilo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" +"Los pesos más grandes (del mismo prio) tienen una probabilidad " +"proporcionalmente mayor de ser seleccionados." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "Intervalo del último miembro" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Latencia" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Último Handshake" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Hoja" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Aprender" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "Aprender rutas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Archivo de asignación" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Tiempo de asignación" @@ -4541,7 +5147,7 @@ msgstr "Deje vacío para autodetectar" msgid "Leave empty to use the current WAN address" msgstr "Deje vacío para usar la dirección WAN actual" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4552,33 +5158,30 @@ msgstr "" "tiempo en el aire puede reducirse significativamente cuando se utilizan. Se " "recomienda no permitir velocidades 802.11b siempre que sea posible." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "Reglas heredadas detectadas" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Registro de cambios:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Límite" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Atenuación de línea (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "Modo de línea" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "Estado de línea" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 +#, fuzzy msgid "Line Uptime" -msgstr "Tiempo de actividad de línea" +msgstr "Tiempo de actividad de la línea" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:125 msgid "Link Aggregation (Channel Bonding)" @@ -4597,17 +5200,20 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "Bits de encabezado de capa de enlace %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Lista de direcciones IP para convertir en respuestas NXDOMAIN." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -"Lista de conjuntos de IP para completar con las IP de dominio especificadas." +"Lista de conjuntos de IP para completar con las IP de los resultados de " +"búsqueda de DNS de los FQDN también especificados aquí." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4621,7 +5227,7 @@ msgstr "" "dirección MAC de destino cuando se solicita la clave PMK-R1 del R0KH que el " "STA usó durante la Asociación de dominio de movilidad inicial." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4640,23 +5246,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Lista de archivos de claves SSH para autenticación" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Lista de dominios para permitir respuestas RFC1918." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Lista de dominios para forzar a una dirección IP." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "Lista de resolutores ascendentes a los que reenviar consultas." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" -msgstr "Puerto de escucha" +msgstr "Puerto de Escucha" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Interfaces de escucha" @@ -4664,7 +5267,7 @@ msgstr "Interfaces de escucha" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "Escucha solo en la interfaz dada o, si no se especifica, en todas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4676,16 +5279,16 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "La configuración de ListenPort no es válida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." -msgstr "Puerto de escucha para consultas DNS entrantes" +msgstr "Puerto de escucha para consultas DNS entrantes." #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:130 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:54 msgid "Load" msgstr "Carga" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Carga media" @@ -4693,27 +5296,28 @@ msgstr "Carga media" msgid "Load configuration…" msgstr "Cargar configuración…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Cargando datos…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Cargando el contenido del directorio…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Cargando vista…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Local" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Dirección IP local" @@ -4733,11 +5337,12 @@ msgstr "Dirección IP local para asignar" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Dirección IPv4 local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Servidor DNS IPv6 local" @@ -4753,46 +5358,73 @@ msgstr "Dirección IPv6 local" msgid "Local Startup" msgstr "Arranque local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Hora local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "ULA local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Dominio local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "Sufijo de dominio local que se añade a los nombres de DHCP y a las entradas " -"del archivo de hosts" +"del archivo de hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Servidor local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Solo servicio local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Clave local de WireGuard" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Localizar consultas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +#, fuzzy +msgid "Location Area Code" +msgstr "Código de área de ubicación" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Bloquear a BSSID" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Registrar evento \"%h...\"" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Iniciar sesión" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Iniciar sesión…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Cerrar sesión" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Nivel de registro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Registrar consultas" @@ -4818,37 +5450,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "Red lógica a la que se agregará al túnel (puenteado) (opcional)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Iniciar sesión" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Cerrar sesión" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "Filtrado suelto" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Pérdida de segundos de señal (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Dirección asignada más baja como compensación de la dirección de red." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Modo de compatibilidad de Lua activo" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "Dirección MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Filtrar por dirección MAC" @@ -4856,16 +5479,15 @@ msgstr "Filtrar por dirección MAC" msgid "MAC Address For The Actor" msgstr "Dirección MAC para el actor" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4874,11 +5496,15 @@ msgstr "MAC VLAN" msgid "MAC address" msgstr "Dirección MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "Dirección(es) MAC" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Filtro por MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Lista de direcciones MAC" @@ -4892,6 +5518,11 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "La regla MAP no es válida" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +#, fuzzy +msgid "MBIM Cellular" +msgstr "MBIM móvil" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4913,15 +5544,19 @@ msgstr "Ioctls MII / ETHTOOL" msgid "MII Interval" msgstr "Intervalo MII" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4931,7 +5566,7 @@ msgstr "" "siguientes comandos:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4940,65 +5575,70 @@ msgstr "" msgid "Manual" msgstr "Manual" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "Fabricante" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "AP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +#, fuzzy +msgid "Match Tag" +msgstr "Etiqueta de coincidencia" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "Intervalo máximo de RA" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Max. velocidad de datos alcanzable (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "Máx. de asignaciones de DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "Máx. tamaño de paquete EDNS0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Máx. consultas simultáneas" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Período máximo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Intervalo de escucha máximo permitido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." -msgstr "Número máximo permitido de asignaciones DHCP activas" +msgstr "Número máximo permitido de asignaciones DHCP activas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Número máximo permitido de consultas de DNS simultáneas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "Tamaño máximo permitido de paquetes UDP EDNS0." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Segundos máximos de espera a que el módem esté activo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Número máximo de direcciones asignadas." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "Tamaño máximo de la tabla de snooping" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -5007,10 +5647,14 @@ msgstr "" "Advertisement, ICMPv6 Type 134\">RA
    no solicitado. El valor " "predeterminado es 600 segundos." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Potencia máxima de transmisión" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Puede impedir que VoIP u otros servicios funcionen." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -5037,7 +5681,7 @@ msgstr "Memoria" msgid "Memory usage (%)" msgstr "Uso de RAM (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Malla" @@ -5045,10 +5689,19 @@ msgstr "Malla" msgid "Mesh ID" msgstr "ID de malla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "ID de malla" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +#, fuzzy +msgid "Mesh Routing" +msgstr "Enrutamiento de malla" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Opciones relacionadas con la malla y el enrutamiento" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Método no encontrado" @@ -5061,7 +5714,7 @@ msgstr "Método de monitoreo de enlaces" msgid "Method to determine link status" msgstr "Método para determinar el estado del enlace" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -5072,11 +5725,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "Intervalo mínimo de RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Tiempo mínimo de validez de ARP" @@ -5084,7 +5737,7 @@ msgstr "Tiempo mínimo de validez de ARP" msgid "Minimum Number of Links" msgstr "Número mínimo de enlaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." @@ -5092,7 +5745,7 @@ msgstr "" "Tiempo mínimo requerido en segundos antes de que se pueda reemplazar una " "entrada ARP. Evita la destrucción de la caché de ARP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -5109,35 +5762,51 @@ msgstr "Puerto monitor de espejo" msgid "Mirror source port" msgstr "Puerto fuente de espejo" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +#, fuzzy +msgid "Mobile Country Code" +msgstr "Código de país móvil" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Datos móviles" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +#, fuzzy +msgid "Mobile Network Code" +msgstr "Código de red móvil" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "Servicio móvil" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Dominio de movilidad" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Modo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Modelo" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Desmontaje del portador del módem en progreso." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "Información del módem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5145,43 +5814,36 @@ msgstr "" "Conexión del módem en progreso. Por favor espere. Este proceso expirará " "después de 2 minutos." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Módem predeterminado" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Dispositivo de módem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Desconexión del módem en progreso. Por favor espere." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Error en la consulta de información del módem" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Espera de inicialización del Módem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "El módem está desactivado." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "ModemManager" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" @@ -5251,6 +5913,10 @@ msgstr "Mover hacia abajo" msgid "Move up" msgstr "Mover hacia arriba" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Multi a unidifusión" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5258,19 +5924,23 @@ msgstr "Mover hacia arriba" msgid "Multicast" msgstr "Multidifusión" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Modo de multidifusión" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Enrutamiento de multidifusión" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "Multidifusión a unidifusión" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "Cadena de acción NAT \"%h\"" @@ -5282,12 +5952,16 @@ msgstr "Modo NAT-T" msgid "NAT64 Prefix" msgstr "Prefijo NAT64" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "Prefijo NAT64" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "Esclavo de Proxy NDP" @@ -5300,18 +5974,23 @@ msgid "NTP server candidates" msgstr "Servidores NTP a consultar" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Nombre" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Nombre de la nueva red" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Nombre del dispositivo de túnel" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navegación" @@ -5321,13 +6000,17 @@ msgstr "Navegación" msgid "Nebula Network" msgstr "Red Nebula" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Informe de vecinos" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "Validez de la caché de vecinos" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5336,33 +6019,37 @@ msgstr "Validez de la caché de vecinos" msgid "Network" msgstr "Red" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Codificación de red" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "Modo de red" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "Registro de red" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "SSID de la red" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Utilidades de red" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "Dirección de red" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Imagen de arranque en red" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 #, fuzzy msgid "Network bridge configuration migration" msgstr "Migración de la configuración del puente de red" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Dispositivo de red" @@ -5375,7 +6062,7 @@ msgstr "Actividad del dispositivo de red (kernel: netdev)" msgid "Network device is not present" msgstr "El dispositivo de red no está presente" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "Tabla de dispositivos de red \"%h\"" @@ -5384,7 +6071,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "Bits de encabezado de red %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Migración de configuración de ifname de red" @@ -5393,27 +6080,33 @@ msgstr "Migración de configuración de ifname de red" msgid "Network interface" msgstr "Interfaz de red" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "ID de red" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Nunca" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Nunca" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -"Nunca reenviar dominios y subdominios coincidentes, resuelva solo desde DHCP " +"Nunca reenviar dominios y subdominios coincidentes, resolver sólo desde DHCP " "o archivos de hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "No se puede crear una nueva interfaz para \"%s\": %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Nuevo nombre de interfaz…" @@ -5421,13 +6114,13 @@ msgstr "Nuevo nombre de interfaz…" msgid "Next »" msgstr "Siguiente »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "No" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "No se ha configurado un servidor DHCP para esta interfaz" @@ -5435,7 +6128,7 @@ msgstr "No se ha configurado un servidor DHCP para esta interfaz" msgid "No Data" msgstr "Sin datos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Sin encriptación" @@ -5451,9 +6144,17 @@ msgstr "Sin NAT-T" msgid "No RX signal" msgstr "No hay señal RX" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "No se han configurado interfaces WireGuard." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "No se encontró ninguna configuración de modo permitido." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5467,7 +6168,11 @@ msgstr "" msgid "No client associated" msgstr "Ningún cliente asociado" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Ningún dispositivo de control especificado" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "Sin datos" @@ -5476,8 +6181,8 @@ msgstr "Sin datos" msgid "No data received" msgstr "Sin datos recibidos" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 #, fuzzy msgid "No enforcement" msgstr "Sin aplicación" @@ -5491,15 +6196,11 @@ msgstr "Sin aplicación" msgid "No entries available" msgstr "No hay entradas disponibles" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "No hay entradas en este directorio" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "No se han encontrado archivos" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 #, fuzzy msgid "" "No fixed interface listening port defined, peers might not be able to " @@ -5516,7 +6217,7 @@ msgstr "" msgid "No host route" msgstr "Sin ruta de host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5537,31 +6238,41 @@ msgstr "No hay más esclavos disponibles" msgid "No more slaves available, can not save interface" msgstr "No hay más esclavos disponibles, no se puede guardar la interfaz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Sin caché negativa" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 #, fuzzy msgid "No nftables ruleset loaded." msgstr "No se ha cargado ningún conjunto de reglas de nftables." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "¡Sin contraseña!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "No conectado" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "Aún no se han definido pares." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "No se encontró ninguna configuración de modo preferido." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "No hay claves públicas presentes todavía." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "No hay reglas en esta cadena" @@ -5575,7 +6286,8 @@ msgid "No validation or filtering" msgstr "Sin validación o filtrado" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Sin zona asignada" @@ -5587,37 +6299,40 @@ msgstr "Sin zona asignada" msgid "Noise" msgstr "Ruido" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Margen de ruido (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Margen de ruido" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Ruido:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Errores de CRC no preventivos (CRC P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Sin comodín" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Ninguno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "No encontrado" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "No miembro" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "No asociado" @@ -5630,7 +6345,7 @@ msgstr "No conectado" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "No presente" @@ -5642,7 +6357,7 @@ msgstr "No se inició en el arranque" msgid "Not supported" msgstr "No soportado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5650,6 +6365,16 @@ msgstr "" "Nota: algunos controladores inalámbricos no son totalmente compatibles con " "802.11w. P.ej. mwlwifi puede tener problemas" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#, fuzzy +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Nota: es posible que también necesite un proxy DHCP (actualmente no " +"disponible) al especificar un puerto de retransmisión a no estándar " +"(addr#port)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Notas" @@ -5658,7 +6383,7 @@ msgstr "Notas" msgid "Notice" msgstr "Aviso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "NSLookup" @@ -5666,7 +6391,7 @@ msgstr "NSLookup" msgid "Number of IGMP membership reports" msgstr "Número de informes de membresía IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "Número de entradas de DNS en caché, 10000 es el máximo, 0 es sin " @@ -5686,7 +6411,7 @@ msgid "Obfuscated Password" msgstr "Contraseña confusa" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5697,6 +6422,7 @@ msgid "Obtain IPv6 address" msgstr "Obtener dirección IPv6" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Apagado" @@ -5705,6 +6431,15 @@ msgstr "Apagado" msgid "Off-State Delay" msgstr "Retraso de desconexión" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +#, fuzzy +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"Apagado: vlanXXX, p. e. vlan1. Encendido: " +"vlan_tagged_interface.XXX, p .e. eth0.1." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Encendido" @@ -5713,16 +6448,16 @@ msgstr "Encendido" msgid "On-State Delay" msgstr "Retraso de activación" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 #, fuzzy msgid "On-link" msgstr "En enlace" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "¡Debe especificar al menos un nombre de host o dirección MAC!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "uno de los siguientes: %s" @@ -5740,7 +6475,11 @@ msgstr "Uno o más valores inválidos/requeridos en la pestaña" msgid "One or more required fields have no value!" msgstr "¡Campos vacíos!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "Solo aceptar respuestas vía" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" "Solo permita la comunicación con puertos del puente no aislados cuando esté " @@ -5753,26 +6492,25 @@ msgstr "" "Solo si el esclavo activo actual falla y el esclavo primario está activo " "(falla, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 #, fuzzy msgid "Open iptables rules overview…" msgstr "Abra la descripción general de las reglas de iptables…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Abrir lista..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5790,7 +6528,7 @@ msgstr "" "Opere en modo relé si una interfaz maestra designada está " "configurada y activa; de lo contrario, vuelva al modo servidor." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." @@ -5798,12 +6536,24 @@ msgstr "" "Opere en modo relé si hay un prefijo IPv6 ascendente; de lo " "contrario, desactive el servicio." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Frecuencia de operación" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "Operador" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "Código de operador" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "Nombre del operador" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "La opción \"%s\" contiene un valor de entrada no válido." @@ -5811,22 +6561,33 @@ msgstr "La opción \"%s\" contiene un valor de entrada no válido." msgid "Option \"%s\" must not be empty." msgstr "La opción \"%s\" no debe estar vacía." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Opción cambiada" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Opción eliminada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Opcional" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "Nombre de host opcional para asignar" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Notas opcionales de forma libre sobre este dispositivo" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" +"Opcional, en segundos. Si se establece en '0', no se intenta volver a " +"conectar." + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5835,7 +6596,7 @@ msgstr "" "Opcional. Marca de 32 bits para los paquetes cifrados salientes. Ingrese el " "valor en hexadecimal, comenzando con 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5847,7 +6608,7 @@ msgstr "" "servidor delegante, use el sufijo (como '::1') para formar la dirección IPv6 " "('a:b:c:d::1') para la interfaz." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5856,11 +6617,11 @@ msgstr "" "adicional de criptografía de clave simétrica para la resistencia post-" "cuántica." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Opcional. Crear rutas para IPs permitidas para este par." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Opcional. Descripción del par." @@ -5868,14 +6629,14 @@ msgstr "Opcional. Descripción del par." msgid "Optional. Do not create host routes to peers." msgstr "Opcional. No crea rutas de host para los pares." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" "Opcional. Host de pares. Los nombres se resuelven antes de abrir la interfaz." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5893,11 +6654,11 @@ msgstr "Opcional. Unidad máxima de transmisión de la interfaz XFRM." msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Opcional. Unidad máxima de transmisión de la interfaz del túnel." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Opcional. Puerto de pares." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 #, fuzzy msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " @@ -5910,7 +6671,7 @@ msgstr "" "código QR si está disponible. Se puede eliminar después de exportar la " "configuración." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5927,7 +6688,7 @@ msgstr "Opcional. Puerto UDP utilizado para paquetes salientes y entrantes." msgid "Options" msgstr "Opciones" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 #, fuzzy msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " @@ -5940,10 +6701,19 @@ msgstr "" "code>\" para la ruta predeterminada. 0.0.0.0 significa \"la " "dirección del sistema que ejecuta dnsmasq\"." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "Opciones:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Ordinal: el bajo va primero." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Intervalo de originador" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "Otros:" @@ -5963,7 +6733,7 @@ msgstr "Saliente:" msgid "Outgoing checksum" msgstr "Suma de comprobación saliente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "Interfaz saliente" @@ -5971,6 +6741,7 @@ msgstr "Interfaz saliente" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "Clave saliente" @@ -5994,21 +6765,23 @@ msgstr "Zona de salida" msgid "Overlap" msgstr "Superposición" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "Anular la tabla de enrutamiento IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "Anular la tabla de enrutamiento IPv6" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -6016,6 +6789,7 @@ msgstr "Anular la tabla de enrutamiento IPv6" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "Reemplazar MTU" @@ -6037,7 +6811,7 @@ msgstr "Reemplazar TOS" msgid "Override TTL" msgstr "Reemplazar TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -6053,7 +6827,7 @@ msgstr "Reemplaza el nombre predeterminado de la interfaz" msgid "Override the gateway in DHCP responses" msgstr "Reemplazar puerta de enlace en las respuestas DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -6069,7 +6843,7 @@ msgstr "Anular la tabla utilizada para rutas internas" msgid "Overview" msgstr "Visión general" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "Sobrescribir archivo \"%s\" existente?" @@ -6077,17 +6851,30 @@ msgstr "Sobrescribir archivo \"%s\" existente?" msgid "Overwrite the current settings with the imported configuration?" msgstr "¿Sobrescribir la configuración actual con la configuración importada?" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "Números propios" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Propietario" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (ambos)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -6099,8 +6886,9 @@ msgid "PAP/CHAP password" msgstr "Contraseña PAP/CHAP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -6111,6 +6899,7 @@ msgstr "Contraseña PAP/CHAP" msgid "PAP/CHAP username" msgstr "Nombre de usuario PAP/CHAP" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "Tipo de PDP" @@ -6120,8 +6909,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "PIN" @@ -6131,7 +6921,7 @@ msgstr "PIN" msgid "PIN code rejected" msgstr "Código PIN rechazado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "PMK R1 Push" @@ -6172,29 +6962,38 @@ msgstr "Desplazamiento PSID" msgid "PSID-bits length" msgstr "Longitud de PSID-bits" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM (Modo de transferencia de paquetes)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "Configuración de PXE/TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "Estado del servicio de paquetes" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" -msgstr "Dirección de paquetes" +msgstr "Direccionamiento de paquetes" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 #, fuzzy msgctxt "nft meta mark" msgid "Packet mark" msgstr "Marca de paquete" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Tiempo de recepción del paquete" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "Paquetes" @@ -6203,23 +7002,30 @@ msgstr "Paquetes" msgid "Packets To Transmit Before Moving To Next Slave" msgstr "Paquetes para transmitir antes de pasar al siguiente esclavo" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "Parte de la red:" +msgstr[1] "Parte de las redes:" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Parte de zona %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "Traspasar (Duplicar dispositivo físico a una sola MAC VLAN)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Contraseña" @@ -6227,11 +7033,11 @@ msgstr "Contraseña" msgid "Password authentication" msgstr "Autentificación de contraseña" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Contraseña de clave privada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "Contraseña de clave privada interna" @@ -6242,20 +7048,20 @@ msgstr "Contraseña de clave privada interna" msgid "Password strength" msgstr "Seguridad de la contraseña" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "Contraseña2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "Pegar o arrastrar archivo de clave SSH…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "" "Pegue o arrastre el archivo de configuración del par de WireGuard (wg0.conf)…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " @@ -6265,32 +7071,32 @@ msgstr "" "em>) desde otro sistema a continuación para crear una entrada equivalente " "que permita que ese sistema se conecte a la interfaz local de WireGuard." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" "Pegue o arrastre el archivo de configuración de WireGuard suministrado…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Ruta al certificado CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Ruta al certificado del cliente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Ruta a la Clave Privada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Ruta al certificado interno de CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Ruta al certificado del cliente interno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Ruta a la clave privada interna" @@ -6312,11 +7118,19 @@ msgstr "Pausado" msgid "Peak:" msgstr "Pico:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Par" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Detalles del par" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Dirección IP del par para asignar" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "Dirección MAC del par" @@ -6325,11 +7139,11 @@ msgstr "Dirección MAC del par" msgid "Peer address is missing" msgstr "Falta la dirección del par" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Nombre del dispositivo del par" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Par desactivado" @@ -6360,10 +7174,14 @@ msgstr "Realizar restablecimiento" msgid "Permission denied" msgstr "Permiso denegado" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Mantener conectado continuamente" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Intervalo de reconexión persistente" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "La configuración de PersistentKeepAlive no es válida" @@ -6372,13 +7190,13 @@ msgstr "La configuración de PersistentKeepAlive no es válida" msgid "Phy Rate:" msgstr "Ratio Phy:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Configuración física" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6391,11 +7209,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Paq." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Por favor, introduzca su nombre de usuario y contraseña." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Por favor, seleccione el archivo que desea cargar." @@ -6403,56 +7221,76 @@ msgstr "Por favor, seleccione el archivo que desea cargar." msgid "Policy" msgstr "Política" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "Política: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Puerto" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Puerto %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "El puerto no es parte de ninguna red" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Aislamiento de puertos" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +#, fuzzy +msgid "Port status" +msgstr "Estado del puerto" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Estado del puerto:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "negación potencial de: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Modo de administración de energía" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Errores preventivos de CRC (CRC P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "Estado de energía" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Preferir LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Preferir UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "Duración preferida para un prefijo." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "Tecnología de red preferida" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Prefijo delegado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "Supresor de prefijo" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Clave precompartida" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "Clave precompartida en uso" @@ -6477,15 +7315,19 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Impide la comunicación entre los clientes" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +#, fuzzy +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"Evita que un cliente inalámbrico hable con otro. Esta configuración solo " +"afecta a los paquetes sin ninguna etiqueta VLAN (paquetes sin etiquetar)." + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Esclavo primario" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "ID de VLAN primaria" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6500,29 +7342,31 @@ msgstr "" "El primario se convierte en esclavo activo cada vez que vuelve a subir " "(siempre, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Prioridad" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "Privado" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "Privado (evita la comunicación entre MAC VLANs)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Clave privada" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "Clave privada presente" @@ -6540,8 +7384,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6553,7 +7397,7 @@ msgstr "Protocolo" msgid "Provide NTP server" msgstr "Dar servicio NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6561,7 +7405,7 @@ msgstr "" "Proporcione un servidor DHCPv6 en esta interfaz y responda a las solicitudes " "de DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Introduzca una nueva red" @@ -6573,25 +7417,36 @@ msgstr "" "Proporcionar el servidor NTP a la interfaz seleccionada o, si no se " "especifica, a todas las interfaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Servidor proxy" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Clave pública" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "Falta la clave pública" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "Clave pública: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6623,59 +7478,87 @@ msgstr "QMI Celular" msgid "Quality" msgstr "Calidad" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "Consulta todos los resolutores ascendentes disponibles." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Intervalo de consulta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Intervalo de respuesta de consulta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "Tiempo de vida de la clave R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "Llavero R1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Puerto de contabilidad Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Secreto de contabilidad Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Servidor de contabilidad Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Puerto de autentificación Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Secreto de autentificación Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Servidor de autentificación Radius" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "Asignación de VLAN dinámica de RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +#, fuzzy +msgid "RADIUS Per STA VLAN" +msgstr "RADIUS Per STA VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +#, fuzzy +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "Esquema de nomenclatura del puente RADIUS VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "Nomenclatura de VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +#, fuzzy +msgid "RADIUS VLAN Tagged Interface" +msgstr "Interfaz etiquetada RADIUS VLAN" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "Modo NAT-T RFC3947" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +#, fuzzy +msgid "RSN Preauth" +msgstr "Autorización previa de RSN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "Umbral RSSI para unirse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Umbral RTS/CTS" @@ -6688,10 +7571,18 @@ msgstr "RX" msgid "RX Rate" msgstr "Tasa RX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "Tasa RX / TX" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"Medición de recursos de radio: envía balizas para ayudar en la itinerancia. " +"No todos los clientes admiten esto." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6703,11 +7594,11 @@ msgstr "" "Bytes en bruto codificados en hexadecimal. Deje en blanco a menos que su ISP " "lo requiera" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Leer /etc/ethers para configurar el servidor DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "¿Está seguro de querer cambiar el protocolo?" @@ -6715,11 +7606,11 @@ msgstr "¿Está seguro de querer cambiar el protocolo?" msgid "Realtime Graphs" msgstr "Gráficos en tiempo real" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Fecha límite de reasociación" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Protección contra reasociación" @@ -6743,11 +7634,42 @@ msgstr "Reiniciar el sistema operativo de su dispositivo" msgid "Receive" msgstr "Recibir" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +#, fuzzy +msgid "Receive dropped" +msgstr "Recibidos descartados" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +#, fuzzy +msgid "Receive errors" +msgstr "Recibidos con errores" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Recibir" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "Bytes recibidos" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "Multidifusión recibida" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "Paquetes recibidos" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Recomendado. Direcciones IP de la interfaz de WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Tiempo de espera de reconexión" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Reconectar esta interfaz" @@ -6755,12 +7677,12 @@ msgstr "Reconectar esta interfaz" msgid "Redirect to HTTPS" msgstr "Redirigir a HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "Redirigir al puerto local %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "Redirigir al sistema local" @@ -6769,32 +7691,40 @@ msgstr "Redirigir al sistema local" msgid "References" msgstr "Referencias" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Actualizar canales" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Refrescar" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "Estado de registro" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "Rechazar paquete IPv4 con ICMP tipo %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "Rechazar paquete con ICMP tipo %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "Rechazar paquete con ICMPv6 tipo %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 #, fuzzy msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "Rechazar paquete con restablecimiento de TCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" @@ -6803,6 +7733,8 @@ msgstr "" "o igual que el valor especificado" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Relé" @@ -6812,6 +7744,13 @@ msgstr "Relé" msgid "Relay Bridge" msgstr "Puente de relé" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +#, fuzzy +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"Retransmita las solicitudes de DHCP a otro lugar. Bien: v4<->v4, v6<->v6. No " +"está bien: v4<->v6, v6<->v4." + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Relé entre redes" @@ -6821,6 +7760,14 @@ msgstr "Relé entre redes" msgid "Relay bridge" msgstr "Puente de relé" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "Retransmisión desde" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "Retransmisión hacia dirección" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6830,6 +7777,7 @@ msgstr "Dirección IPv4 remota" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Dirección IPv4 remota o FQDN" @@ -6842,16 +7790,30 @@ msgstr "Dirección IPv6 remota" msgid "Remote IPv6 address or FQDN" msgstr "Dirección IPv6 remota o FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Eliminar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +#, fuzzy +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" +"Eliminar las direcciones IPv4 de los resultados y solo devuelva direcciones " +"IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +#, fuzzy +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" +"Eliminar las direcciones IPv6 de los resultados y solo devuelva direcciones " +"IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" "Eliminar la configuración del dispositivo relacionada de la configuración" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Cambiar la configuración Wi-Fi" @@ -6881,7 +7843,8 @@ msgstr "Requerir suma de comprobación entrante (opcional)." msgid "Require incoming packets serialization (optional)." msgstr "Requiere la serialización de paquetes entrantes (opcional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Requerido" @@ -6897,7 +7860,7 @@ msgstr "Requerido. Clave privada codificada en base64 para esta interfaz." msgid "Required. Path to the .yml config file for this interface." msgstr "Requerido. Ruta al archivo de configuración .yml para esta interfaz." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "Requerido. Clave pública del par de WireGuard." @@ -6909,67 +7872,75 @@ msgstr "Requerido. Interfaz subyacente." msgid "Required. XFRM interface ID to be used for SA." msgstr "Requerido. ID de interfaz XFRM que se usará para SA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" +"Obligatorio: rechaza la autenticación si el servidor RADIUS no proporciona " +"los atributos de VLAN adecuados." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Requiere hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Requiere hostapd con soporte EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Requiere hostapd con soporte EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Requiere hostapd con soporte OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Requiere hostapd con soporte SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Requiere hostapd con soporte WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Requiere wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Requiere wpa-supplicant con soporte EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Requiere wpa-supplicant con soporte EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Requiere wpa-supplicant con soporte OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Requiere wpa-supplicant con soporte SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Requiere wpa-supplicant con soporte WEP" @@ -6978,7 +7949,7 @@ msgid "Reselection policy for primary slave" msgstr "Política de reselección para esclavo primario" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6993,20 +7964,24 @@ msgstr "Reiniciar contadores" msgid "Reset to defaults" msgstr "Reiniciar a configuraciones predeterminadas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Archivos Resolv y Hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Archivo de resolución" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Lista de dominios para forzar a una dirección IP." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Recurso no encontrado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Reiniciar" @@ -7015,7 +7990,7 @@ msgstr "Reiniciar" msgid "Restart Firewall" msgstr "Reiniciar Cortafuegos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Reiniciar la interfaz de radio" @@ -7027,7 +8002,7 @@ msgstr "Restaurar" msgid "Restore backup" msgstr "Restaurar copia de seguridad" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -7035,86 +8010,101 @@ msgstr "" "Devuelve las respuestas a las consultas de DNS que coincidan con la subred " "desde la que se recibió la consulta si hay varias direcciones IP disponibles." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Revelar/ocultar contraseña" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "Filtro de ruta inversa" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Revertir" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Revertir cambios" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "Error al revertir la solicitud con el estado %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Revirtiendo configuración…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "Revisión" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 #, fuzzy msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "Reescribir destino a %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "Reescribir destino a %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 #, fuzzy msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "Reescribir destino a %h, puerto %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 #, fuzzy msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "Reescriba destino a %h, puerto %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 #, fuzzy msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "Reescribir origen a %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 #, fuzzy msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "Reescribir origen a %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 #, fuzzy msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "Reescribir origen a %h, puerto %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "Reescribir origen a %h, puerto %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "Reescribir en la dirección del dispositivo de salida" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" +"Red de seguridad robusta (RSN): permita la autenticación previa de roaming " +"para redes WPA2-EAP (y anúnciela en balizas WLAN). Solo funciona si la " +"interfaz de red especificada es un puente. Acorta el proceso de reasociación " +"de tiempo crítico." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Robustez" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -7132,20 +8122,20 @@ msgstr "Preparación de la raíz" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Política Round-Robin (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Ruta permitida IPs" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 #, fuzzy msgid "Route action chain \"%h\"" msgstr "Cadena de acción de ruta \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Tipo de ruta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7165,6 +8155,10 @@ msgstr "Contraseña del enrutador" msgid "Routing" msgstr "Enrutamiento" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Algoritmo de enrutamiento" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7179,24 +8173,24 @@ msgstr "" msgid "Rule" msgstr "Regla" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "Acciones de regla" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "Comentario de la regla: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "Cadena contenedora de reglas \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "Coincidencias de reglas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Tipo de regla" @@ -7216,11 +8210,24 @@ msgstr "Error de tiempo de ejecución" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "SIMs" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7238,15 +8245,15 @@ msgstr "Puerto del servidor SSH" msgid "SSH username" msgstr "Nombre de usuario SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "Claves SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7263,7 +8270,7 @@ msgstr "Servidor SSTP" msgid "SWAP" msgstr "INTERCAMBIO" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7274,7 +8281,7 @@ msgid "Save" msgstr "Guardar" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Guardar y Aplicar" @@ -7291,7 +8298,7 @@ msgstr "Guardar mtdblock" msgid "Save mtdblock contents" msgstr "Guardar contenidos mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Escanear" @@ -7300,11 +8307,16 @@ msgstr "Escanear" msgid "Scheduled Tasks" msgstr "Tareas programadas" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "La sección %s está vacía." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Sección añadida" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Sección removida" @@ -7322,9 +8334,9 @@ msgstr "" "la verificación del formato de la imagen. ¡Úselo solo si está seguro de que " "el firmware es correcto y está diseñado para su dispositivo!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Seleccionar archivo…" @@ -7334,7 +8346,7 @@ msgstr "" "Selecciona la política de hash de transmisión para usar en la selección de " "esclavos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7342,7 +8354,7 @@ msgstr "" "Envíe mensajes RA que anuncien este dispositivo como enrutador IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "Enviar redireccionamientos ICMP" @@ -7363,11 +8375,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "Enviar el nombre de host de este dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Servidor" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Dirección del servidor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Nombre del servidor" @@ -7392,18 +8408,22 @@ msgstr "Sesión expirada" msgid "Set Static" msgstr "Establecer estática" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "Establezca un alias para un nombre de host." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "Establezca el campo de encabezado %s en %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" "Configurar la interfaz como esclavo externo de Proxy NDP. El valor " "predeterminado es desactivado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7416,7 +8436,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "Establecer la misma dirección MAC para todos los esclavos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7427,7 +8447,7 @@ msgstr "" "Advertisement\">RA enviados. Cuando está activado, los clientes " "realizarán la configuración automática de direcciones IPv6 sin estado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7443,11 +8463,15 @@ msgstr "Establecer como esclavo actualmente activo (activo, 1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "Establecer como primer esclavo agregado al vínculo (seguir, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Configurar servidor DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Configurar rutas para vecinos IPv6 con proxy." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7455,33 +8479,39 @@ msgid "Setting PLMN failed" msgstr "La configuración de la PLMN falló" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "El modo de operación de ajuste falló" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "Configuración de la tecnología de red permitida." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "Configuración de la tecnología de red preferida." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Configuraciones" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "Configurar rutas para vecinos IPv6 con proxy." - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "Segundos con errores graves (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" +msgstr "" +"Configuraciones para ayudar a los clientes inalámbricos en itinerancia entre " +"varios puntos de acceso: 802.11r, 802.11k y 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" -msgstr "GI corto" +msgstr "IG corto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Preámbulo corto" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Mostrar la lista actual de archivos a respaldar" @@ -7494,16 +8524,16 @@ msgstr "Mostrar cadenas vacias" msgid "Show raw counters" msgstr "Mostrar contadores sin procesar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Apagar esta interfaz" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7511,15 +8541,15 @@ msgstr "Apagar esta interfaz" msgid "Signal" msgstr "Señal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Señal / Ruido" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Atenuación de señal (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Calidad de la señal" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Frecuencia de actualización de la señal" @@ -7527,12 +8557,12 @@ msgstr "Frecuencia de actualización de la señal" msgid "Signal:" msgstr "Señal:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Tamaño" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Tamaño de la caché de consultas de DNS" @@ -7550,12 +8580,12 @@ msgid "Skip from backup files that are equal to those in /rom" msgstr "" "Omitir archivos de la copia de seguridad que sean iguales a los de /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Saltar al contenido" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Saltar a navegación" @@ -7573,14 +8603,10 @@ msgstr "Software VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "Algunos campos son inválidos, ¡no se pueden guardar!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Objeto no encontrado." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "El servidor encontró un error inesperado." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7591,8 +8617,8 @@ msgstr "" "grabarse manualmente. Por favor, mire el wiki para instrucciones de " "instalación específicas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7620,7 +8646,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "Puerto de origen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7628,7 +8654,7 @@ msgstr "" "Opciones de arranque PXE especiales para Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7637,7 +8663,7 @@ msgstr "" "través de DHCPv6. Si no se especifica, se anunciará el dominio de búsqueda " "de DNS del dispositivo local." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7648,7 +8674,7 @@ msgstr "" "anunciará como servidor DNS IPv6 a menos que la opción Servidor DNS IPv6 " "local esté desactivada." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 #, fuzzy msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " @@ -7680,7 +8706,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "Especifica la frecuencia de monitoreo del enlace MII en milisegundos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 #, fuzzy msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7690,7 +8716,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "Especifica la lógica de selección de agregación a usar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #, fuzzy msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "Especifica la subred de destino para hacer coincidir (notación CIDR)" @@ -7699,7 +8725,7 @@ msgstr "Especifica la subred de destino para hacer coincidir (notación CIDR)" msgid "Specifies the directory the device is attached to" msgstr "Especifica el directorio al que está enlazado el dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 #, fuzzy msgid "" "Specifies the flags sent in RA " @@ -7710,7 +8736,7 @@ msgstr "" "Advertisement\">RA, por ejemplo, para indicar a los clientes que " "soliciten más información mediante DHCPv6 con estado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 #, fuzzy msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " @@ -7720,7 +8746,7 @@ msgstr "" "0xFF para hacer coincidir la marca 255 o 0x0/0x1 para hacer coincidir " "cualquier valor de marca par" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "Especifique el nombre de la interfaz lógica entrante" @@ -7757,7 +8783,7 @@ msgstr "" "Especifica la cantidad de segundos a transcurrir hasta suponer muerto un " "dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7779,7 +8805,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "Especifica el modo que se utilizará para esta interfaz de enlace" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7823,15 +8849,15 @@ msgstr "" "Especifica el número de segundos entre instancias en las que el controlador " "de enlace envía paquetes de aprendizaje a cada conmutador de pares esclavos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "Especifique el orden de las reglas de IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "Especifique el nombre de la interfaz lógica saliente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7860,19 +8886,19 @@ msgstr "" "Especifica la política de reselección para el esclavo primario cuando ocurre " "una falla del esclavo activo o la recuperación del esclavo primario" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "Especifique la métrica de ruta a usar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "Especifique el tipo de ruta que se creará" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "Especifique la acción de enrutamiento de destino de la regla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "Especifique la subred de origen para hacer coincidir (notación CIDR)" @@ -7896,7 +8922,7 @@ msgstr "" "Especifica el tiempo de espera en milisegundos antes de activar un esclavo " "después de una detección de recuperación de enlace" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -8019,15 +9045,23 @@ msgstr "" "Especifique una MTU (Unidad de transmisión máxima) distinta de la " "predeterminada (1280 bytes)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Especifique la clave de encriptación." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "Velocidad: %d Mibit/s, Dúplex: %s" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "ADSL sin divisor (G.992.2) Anexo A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "Tiempo de espera de caché de vecino obsoleto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Iniciar" @@ -8040,16 +9074,16 @@ msgstr "Iniciar WPS" msgid "Start priority" msgstr "Prioridad de inicio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Iniciar actualización" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Iniciando aplicar configuración…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Iniciando escaneo de Wi-Fi..." @@ -8058,6 +9092,10 @@ msgstr "Iniciando escaneo de Wi-Fi..." msgid "Startup" msgstr "Arranque" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Estado" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Rutas IPv4 estáticas" @@ -8071,7 +9109,7 @@ msgstr "Rutas IPv6 estáticas" msgid "Static Lease" msgstr "Asignación estática" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Asignaciones estáticas" @@ -8081,7 +9119,7 @@ msgstr "Asignaciones estáticas" msgid "Static address" msgstr "Dirección estática" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -8092,18 +9130,18 @@ msgstr "" "de interfaces no dinámicas en las que a cada dispositivo siempre se le " "quiere dar la misma dirección IP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Límite de inactividad de la estación" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Estado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Detener" @@ -8112,8 +9150,8 @@ msgstr "Detener" msgid "Stop WPS" msgstr "Detener WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Detener actualización" @@ -8121,11 +9159,11 @@ msgstr "Detener actualización" msgid "Storage" msgstr "Uso de almacenamiento" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "Filtrado estricto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Orden estricto" @@ -8134,15 +9172,15 @@ msgid "Strong" msgstr "Fuerte" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Enviar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Suprimir registro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "Suprime el registro de la operación de rutina para el protocolo DHCP." @@ -8175,7 +9213,7 @@ msgstr "Switch VLAN" msgid "Switch port" msgstr "Puerto del conmutador" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Intercambiar protocolo" @@ -8185,7 +9223,7 @@ msgstr "Intercambiar protocolo" msgid "Switch to CIDR list notation" msgstr "Cambiar a la notación de lista CIDR" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Enlace simbólico" @@ -8197,8 +9235,16 @@ msgstr "Sincronizar con el servidor NTP" msgid "Sync with browser" msgstr "Sincronizar con el navegador" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Sintaxis: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Sintaxis: _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -8222,9 +9268,9 @@ msgstr "Propiedades del sistema" msgid "System log buffer size" msgstr "Tamaño del buffer de registro del sistema" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "El sistema se ejecuta en modo de recuperación (initramfs)." @@ -8255,7 +9301,7 @@ msgstr "Puerto de origen TCP" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Raíz del servidor TFTP" @@ -8268,27 +9314,38 @@ msgstr "TX" msgid "TX Rate" msgstr "Tasa TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "Longitud de la cola de TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tabla" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "Etiqueta" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Etiquetado" + # Target = Meta --> Objetivo --> Destino? -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Objetivo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 #, fuzzy msgid "Target Platform" msgstr "Plataforma de destino" @@ -8305,7 +9362,7 @@ msgstr "Espacio temporal" msgid "Terminate" msgstr "Terminar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8315,7 +9372,7 @@ msgstr "" "los mensajes RA. El mínimo es 1280 bytes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 #, fuzzy msgid "" "The Managed address configuration (M) flag indicates that IPv6 " @@ -8324,7 +9381,7 @@ msgstr "" "La Configuración de dirección administrada (M) indica que las " "direcciones IPv6 están disponibles a través de DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 #, fuzzy msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " @@ -8333,7 +9390,7 @@ msgstr "" "El Agente doméstico IPv6 móvil (H) indica que el dispositivo " "también actúa como Mobile IPv6 home agent en este enlace." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8353,7 +9410,12 @@ msgstr "" "Se requiere el paquete qrencode para generar una imagen de código " "QR de la configuración." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +#, fuzzy +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "El DUID (identificador único de DHCP) DHCPv6 de este host." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8369,20 +9431,28 @@ msgstr "" "La configuración de actualización de punto final de HE.net cambió, ¡ahora " "debe usar el nombre de usuario simple en lugar de la ID de usuario!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" "La dirección IP %h ya está siendo utilizada por otra asignación estática" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" "La dirección IP está fuera de cualquier rango de direcciones del grupo DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "La dirección IP del servidor de arranque" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" +"La dirección IP que se utilizará para este host, o Ignorar para " +"ignorar cualquier solicitud DHCP de este host." + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "La dirección IPv4 o el nombre de dominio completo del extremo remoto." @@ -8390,6 +9460,7 @@ msgstr "La dirección IPv4 o el nombre de dominio completo del extremo remoto." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -8407,6 +9478,14 @@ msgid "" msgstr "" "La dirección IPv6 o el nombre de dominio completo del final del túnel remoto." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" +"El identificador de interfaz IPv6 (sufijo de dirección) como número " +"hexadecimal (máx. 8 caracteres)." + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8418,7 +9497,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "El LED parpadea con la frecuencia de encendido/apagado configurada" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "El LED parpadea para simular el latido del corazón." @@ -8437,7 +9516,7 @@ msgstr "El LED siempre está apagado por defecto." msgid "The LED is always in default state on." msgstr "El LED siempre está encendido en el estado predeterminado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" @@ -8445,15 +9524,19 @@ msgstr "" "La dirección MAC %h ya la usa otra asignación estática en el mismo grupo de " "DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "La MTU no debe exceder la MTU del dispositivo principal de %d bytes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "La ID de VLAN debe ser única" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "El algoritmo que se utiliza para descubrir rutas de malla" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8466,7 +9549,7 @@ msgid "The configuration file could not be loaded due to the following error:" msgstr "" "El archivo de configuración no se pudo cargar debido al siguiente error:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8474,7 +9557,7 @@ msgstr "" "El SSID correcto debe especificarse manualmente para conectarse a una red Wi-" "Fi oculta" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8501,12 +9584,12 @@ msgstr "" "El archivo de dispositivo de memoria o partición (e.j. /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "El nombre del dispositivo \"%s\" ya está en uso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." @@ -8514,7 +9597,7 @@ msgstr "" "Es necesario cambiar la configuración de red existente para que LuCI " "funcione correctamente." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8537,7 +9620,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Las siguientes reglas están actualmente activas en este sistema." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" "La frecuencia está en proporción directa con la carga promedio de CPU de 1 " @@ -8547,19 +9630,19 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "La dirección de la puerta de enlace no debe ser una dirección IP local" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" "La configuración generada se puede importar a una aplicación de cliente " "WireGuard para configurar una conexión hacia este dispositivo." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "La clave pública SSH dada ya se ha agregado." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8567,15 +9650,38 @@ msgstr "" "La clave pública SSH dada no es válida. Por favor, suministre las claves " "públicas RSA o ECDSA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" +"Las direcciones de hardware de esta entrada/host, separadas por espacios." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +#, fuzzy +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"La configuración de penalización de salto permite modificar la preferencia " +"de batman-adv para rutas de múltiples saltos frente a rutas cortas. El valor " +"se aplica al TQ de cada OGM reenviado, propagando así el costo de un salto " +"adicional (el paquete debe recibirse y retransmitirse, lo que cuesta tiempo " +"aire)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "El nombre de host del servidor de arranque" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "No se pudo encontrar la interfaz" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "El nombre de la interfaz ya está en uso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "El nombre de la interfaz es demasiado largo" @@ -8599,6 +9705,7 @@ msgstr "La dirección IPv4 local" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "La dirección IPv4 local sobre la que se crea el túnel (opcional)." @@ -8613,7 +9720,7 @@ msgstr "La máscara de red IPv4 local" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "La dirección IPv6 local sobre la cual se crea el túnel (opcional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8628,7 +9735,7 @@ msgstr "" "salida\" de la red. Un valor reducido resulta en un tiempo reducido para " "detectar la pérdida del último miembro de un grupo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8641,7 +9748,7 @@ msgstr "" "que el tráfico sea menos intenso, ya que las respuestas del host se " "distribuyen en un intervalo mayor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8649,7 +9756,7 @@ msgstr "" "El número máximo de saltos que se publicarán en los mensajes RA. El máximo es 255 saltos." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." @@ -8657,7 +9764,7 @@ msgstr "" "El acceso a la red de este dispositivo podría verse interrumpido al cambiar " "la configuración de la interfaz \"%h\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "El nombre de la red ya está en uso" @@ -8677,7 +9784,7 @@ msgstr "" "segmentos de red. Es común que exista un puerto por defecto para subida " "hacia una red mayor como internet y el resto se dediquen a la red local." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 #, fuzzy msgid "" "The public hostname or IP address of this system the peer should connect to. " @@ -8688,7 +9795,7 @@ msgstr "" "conectarse el par. Esto suele ser una dirección IP pública estática, un " "nombre de host estático o un dominio DDNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" "El intervalo de respuesta a la consulta debe ser menor que el valor del " @@ -8703,7 +9810,7 @@ msgstr "El comando de reinicio falló con el código %d" msgid "The restore command failed with code %d" msgstr "El comando de restauración falló con el código %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8713,15 +9820,15 @@ msgstr "" "red. Si se espera que una red tenga pérdidas, se puede aumentar el valor de " "robustez. IGMP es resistente a (Robustez-1) pérdidas de paquetes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" "El objetivo de la regla es un salto a otra regla especificada por su valor " "de prioridad" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8732,11 +9839,11 @@ msgstr "" "iproute2/rt_tables. Los alias especiales local (255), principal (254) y " "predeterminado (253) también son válidos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "El modo %s seleccionado es incompatible con la encriptación %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "¡El token de seguridad enviado no es válido o ya está vencido!" @@ -8776,6 +9883,19 @@ msgstr "La contraseña del sistema se ha cambiado correctamente." msgid "The sysupgrade command failed with code %d" msgstr "El comando sysupgrade falló con el código %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" +"La construcción de etiquetas filtra qué directivas de host se utilizan; se " +"puede proporcionar más de una etiqueta, en este caso la solicitud debe " +"coincidir con todas ellas. Las directivas etiquetadas se usan con " +"preferencia a las no etiquetadas. Tenga en cuenta que aún se debe " +"especificar una de mac, duid o nombre de host (puede ser un comodín)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8803,12 +9923,20 @@ msgstr "" "El archivo con la imagen de firmware subido no tiene un formato adecuado. " "Asegúrese de haber elegido la imagen correcta para su plataforma." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "El valor se reemplaza por la configuración. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "El valor se reemplaza por la configuración." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" +"El valor especifica el intervalo (milisegundos) en el que batman-adv inunda " +"la red con su información de protocolo." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8817,19 +9945,20 @@ msgstr "" "mezclar las reglas de iptables y nftables, ya que puede dar lugar a un " "filtrado de tráfico incompleto." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "No hay asignaciones activas" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "No hay cambios para aplicar" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8842,16 +9971,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "Dirección IPv4 del relé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Este tipo de autenticación no es aplicable al método EAP seleccionado." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Esto no parece un archivo PEM válido" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8870,6 +9999,25 @@ msgstr "" "contraseña de la cuenta si no se ha configurado ninguna clave de " "actualización" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +#, fuzzy +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Este es el dispositivo batman-adv al que desea vincular el dispositivo " +"físico desde arriba. Si esta lista está vacía, primero debe crear una. Si " +"desea enrutar el tráfico de malla a través de un dispositivo de red con " +"cable, selecciónelo en el selector de dispositivos anterior. Si desea " +"asignar la interfaz batman-adv a una malla Wi-Fi, no seleccione ningún " +"dispositivo en el selector de dispositivos, sino que vaya a la configuración " +"de la interfaz 802.11s y seleccione esta interfaz como una red desde allí." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8886,7 +10034,7 @@ msgstr "" "Esta es la dirección de punto final asignada por el broker del túnel, suele " "terminar con ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "Este es el único servidor DHCP en la red local." @@ -8918,8 +10066,8 @@ msgid "" "their status." msgstr "Procesos del sistema que se están ejecutando actualmente y su estado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8935,33 +10083,41 @@ msgstr "Esta sección aún no contiene valores" msgid "Time Synchronization" msgstr "Sincronización horaria" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Anuncio de tiempo" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "Tiempo en milisegundos" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "Tiempo en segundos para dedicarlo a escuchar y aprender" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Intervalo de tiempo para volver a introducir GTK" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Zona horaria" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "Desconectado" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "Tiempo de espera en segundos" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" "Tiempo de espera en segundos para las direcciones MAC aprendidas en la base " "de datos de reenvío" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" "Tiempo de espera en segundos hasta que la topología se actualice en caso de " @@ -8971,7 +10127,7 @@ msgstr "" msgid "Timezone" msgstr "Zona horaria" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the importación de " "configuración en su lugar." -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Iniciar sesión…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8997,7 +10149,7 @@ msgstr "" "a su estado inicial, haga clic en \"Realizar restablecimiento\" (sólo es " "posible con imágenes squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Tono" @@ -9005,12 +10157,16 @@ msgstr "Tono" msgid "Total Available" msgstr "Total disponible" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "Código de área de seguimiento" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -9022,11 +10178,11 @@ msgstr "Tráfico" msgid "Traffic Class" msgstr "Clase de tráfico" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "Cadena de filtro de tráfico \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "Tráfico emparejado por regla: %.1000mPackets, %.1024mBytes" @@ -9043,6 +10199,29 @@ msgstr "Transmitir" msgid "Transmit Hash Policy" msgstr "Política de transmisión de hash" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +#, fuzzy +msgid "Transmit dropped" +msgstr "Transmitidos descartados" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +#, fuzzy +msgid "Transmit errors" +msgstr "Transmitidos con errores" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Antena transmisora" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "Bytes transmitidos" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "Paquetes transmitidos" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -9081,7 +10260,7 @@ msgstr "Interfaz de túnel" msgid "Tunnel Link" msgstr "Enlace del túnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Dispositivo de túnel" @@ -9090,13 +10269,13 @@ msgid "Tx-Power" msgstr "Potencia-TX" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Tipo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Tipo de servicio" @@ -9145,7 +10324,7 @@ msgstr "No se puede determinar la dirección IP externa" msgid "Unable to determine upstream interface" msgstr "No se puede determinar la interfaz ascendente" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Imposible repartir" @@ -9196,19 +10375,32 @@ msgstr "No se puede reiniciar el cortafuegos: %s" msgid "Unable to save contents: %s" msgstr "No se puede guardar el contenido: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Segundos no disponibles (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "No se puede configurar la lista de modos permitidos." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "No se puede configurar el modo preferido." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "No se puede verificar el PIN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Desconfigurar" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +#, fuzzy +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Formato de datos de respuesta inesperado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -9226,7 +10418,7 @@ msgstr "" msgid "Unknown" msgstr "Desconocido" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Método de conexión desconocido y no compatible." @@ -9250,11 +10442,11 @@ msgstr "No administrado" msgid "Unmount" msgstr "Desmontar" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Clave sin nombre" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Cambios sin aplicar" @@ -9268,15 +10460,25 @@ msgid "Unsupported MAP type" msgstr "Tipo de MAP no soportado" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Módem no soportado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Protocolo no compatible" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Tipo de protocolo no soportado." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Sin etiquetar" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "Par sin título" @@ -9288,7 +10490,7 @@ msgstr "Arriba" msgid "Up Delay" msgstr "Retraso de subida" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Cargar" @@ -9305,25 +10507,29 @@ msgstr "" msgid "Upload archive..." msgstr "Subir archivo..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Subir archivo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Subir archivo…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "La carga ha sido cancelada" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Error al cargar la solicitud: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Cargando archivo…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9333,7 +10539,7 @@ msgstr "" "asignarán con un nombre en la forma wifinet# y la red se reiniciará " "para aplicar la configuración actualizada." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -9341,7 +10547,7 @@ msgstr "" "Al presionar \"Continuar\", la configuración de los puentes se actualizará y " "la red se reiniciará para aplicar la configuración actualizada." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -9349,20 +10555,24 @@ msgstr "" "Al presionar \"Continuar\", las opciones de ifname cambiarán de nombre y la " "red se reiniciará para aplicar la configuración actualizada." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "Los resolutores ascendentes se consultarán en el orden del archivo resolv." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Tiempo de actividad" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Usar /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Usar DHCP" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Usar servidores anunciados por DHCP" @@ -9371,14 +10581,19 @@ msgstr "Usar servidores anunciados por DHCP" msgid "Use DHCP gateway" msgstr "Usar puerta de enlace DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Usar DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 #, fuzzy msgid "Use DNS servers advertised by peer" msgstr "Usar servidores DNS anunciados por el par" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Usa códigos de país ISO/IEC 3166 alpha2." @@ -9426,22 +10641,25 @@ msgstr "Utilizar como sistema de archivos raíz (/)" msgid "Use broadcast flag" msgstr "Usar marca de difusión" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Utilizar la gestión integrada de IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Usar servidores DNS personalizados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Utilizar la puerta de enlace predeterminada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Usar métrica de puerta de enlace" @@ -9467,15 +10685,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "Utilice el mismo origen y destino para cada conexión" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Usar certificados del sistema" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "Usar certificados del sistema para túnel interno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9507,11 +10725,11 @@ msgstr "" msgid "Used" msgstr "Usado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Espacio de clave usado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9519,59 +10737,61 @@ msgstr "" "Se utiliza para dos propósitos diferentes: RADIUS NAS ID y 802.11r R0KH-ID. " "No es necesario con WPA(2)-PSK normal." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Grupo de usuario" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Certificado de usuario (Codificado PEM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "Identificador de usuario" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Clave de usuario (codificada PEM)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Nombre de usuario" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "Utilizar la tabla de flujo %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (agregador de puertos Ethernet virtual)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "ID de VLAN" @@ -9591,24 +10811,27 @@ msgstr "VPN dirección local" msgid "VPN Local port" msgstr "VPN puerto local" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "Protocolo VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Servidor VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "Hash SHA256 del certificado del servidor VPN" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Puerto del servidor VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "Hash SHA1 del certificado del servidor VPN" @@ -9617,6 +10840,10 @@ msgstr "Hash SHA1 del certificado del servidor VPN" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (y otros) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9630,16 +10857,16 @@ msgstr "Identificador de red VXLAN" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -"Requiere upstream soporta DNSSEC; Verifique que las respuestas de los " -"dominios no firmados realmente provengan de dominios no firmados" +"Valide las respuestas de DNS y almacene en caché los datos de DNSSEC, " +"requiere conexión ascendente para admitir DNSSEC." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9667,7 +10894,7 @@ msgstr "Proveedor" msgid "Vendor Class to send when requesting DHCP" msgstr "Clase de vendedor a enviar cuando solicite DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" "Verifique que las respuestas de dominio sin firmar realmente provengan de " @@ -9677,12 +10904,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Verificando el archivo de imagen cargado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Muy alto" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Ethernet virtual" @@ -9690,34 +10917,46 @@ msgstr "Ethernet virtual" msgid "Virtual dynamic interface" msgstr "Interfaz dinámica virtual" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "WEP (sistema abierto)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "WEP (clave compartida)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Contraseña WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "Itinerancia WLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Activar WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "Modo de suspensión WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "Correcciones del modo de suspensión de WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Contraseña WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9746,7 +10985,20 @@ msgstr "Advertencia: ¡Hay cambios no guardados que se perderán al reiniciar!" msgid "Weak" msgstr "Débil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Peso" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" +"Cuando un host coincide con una entrada, se establece la etiqueta especial " +"conocido. Utilice conocido para hacer coincidir todos los " +"hosts conocidos." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." @@ -9755,7 +11007,27 @@ msgstr "" "interfaces con un valor de preferencia más alto se consideran primero al " "asignar subredes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +#, fuzzy +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Cuando la codificación de red está activada, aumenta el rendimiento de Wi-Fi " +"al combinar varios cuadros en un solo, lo que reduce el tiempo de aire " +"necesario." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Cuando está activada, la tabla ARP distribuida forma una memoria caché ARP " +"en toda la malla que ayuda a los clientes que no son de malla a obtener " +"respuestas ARP de manera mucho más confiable y sin mucha demora." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 #, fuzzy msgid "" "When enabled, gateway is on-link even if the gateway does not match any " @@ -9764,7 +11036,37 @@ msgstr "" "Cuando está activado, la puerta de enlace está en enlace incluso si la " "puerta de enlace no coincide con ningún prefijo de interfaz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Cuando está activado, se agregan nuevas entradas de la tabla ARP a partir de " +"solicitudes o respuestas APR gratuitas recibidas; de lo contrario, solo se " +"actualizan las entradas de la tabla preexistentes, pero no se aprenden " +"nuevos hosts." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Cuando está invertido, el LED se enciende de forma continua y parpadea en " +"lugar de estar apagado de forma predeterminada y parpadear en la actividad " +"del sistema." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +#, fuzzy +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Cuando se ejecuta la malla en múltiples interfaces Wi-Fi por nodo, batman-" +"adv es capaz de optimizar el flujo de tráfico para obtener el máximo " +"rendimiento." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9774,7 +11076,7 @@ msgstr "" "está activada, las siguientes opciones de claves R0/R1 no se aplican. " "Desactive esto para usar las opciones de claves R0 y R1." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9782,7 +11084,7 @@ msgstr "" "Cuando la QoS del modo Wi-Fi Multimedia (WMM) está desactivada, los clientes " "pueden estar limitados a las tasas de 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9791,16 +11093,25 @@ msgstr "" "la eficiencia del tiempo en aire puede reducirse significativamente." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Ancho de banda" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Estado de WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "El par de WireGuard está desactivado" @@ -9816,21 +11127,21 @@ msgid "Wireless Adapter" msgstr "Adaptador Wi-Fi" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Red Wi-Fi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Vista general de Wi-Fi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Seguridad Wi-Fi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Migración de configuración Wi-Fi" @@ -9846,17 +11157,17 @@ msgstr "Red Wi-Fi desactivada" msgid "Wireless is not associated" msgstr "Red Wi-Fi no asociada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Red Wi-Fi desactivada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Red Wi-Fi activada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." -msgstr "Escribe las peticiones de DNS recibidas en el registro del sistema" +msgstr "Escribe las peticiones de DNS recibidas en el registro del sistema." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:181 msgid "Write system log to file" @@ -9866,7 +11177,7 @@ msgstr "Escribe el registro del sistema al archivo" msgid "XOR policy (balance-xor, 2)" msgstr "Política XOR (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9895,8 +11206,22 @@ msgstr "" "Advertencia: Si desactivas los scripts de inicio esenciales como " "\"network\", ¡Tu dispositivo podría volverse inaccesible!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Puede agregar varios registros para el mismo objetivo." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Puede agregar varios registros para el mismo dominio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" +"Puede agregar múltiples retransmisiones únicas a la misma dirección de " +"escucha." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9930,34 +11255,56 @@ msgstr "Configuración de ZRam" msgid "ZRam Size" msgstr "Tamaño de ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Nota: aunque _http " +"es posible, ningún navegador admite registros SRV.)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "cualquiera" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automático" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automático (desactivado)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automático (activado)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "puenteado" @@ -10014,25 +11361,30 @@ msgctxt "nft unit" msgid "day" msgstr "día" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "desactivar" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "desactivado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "predeterminado por el controlador" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "dirección predeterminada (%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "p. ej: --proxy 10.10.10.10" @@ -10041,14 +11393,23 @@ msgstr "p. ej: --proxy 10.10.10.10" msgid "e.g: dump" msgstr "p. ej: vertedero" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "activado" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "cada %ds" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "expirado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "forzado" @@ -10058,22 +11419,22 @@ msgstr "forzado" msgid "forward" msgstr "reenviar" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "full dúplex" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "half dúplex" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "valor codificado en hexadecimal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "oculto" @@ -10082,9 +11443,9 @@ msgctxt "nft unit" msgid "hour" msgstr "hora" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "modo híbrido" @@ -10092,6 +11453,10 @@ msgstr "modo híbrido" msgid "ignore" msgstr "ignorar" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "Infinito (la asignación no caduca)" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -10106,11 +11471,19 @@ msgstr "clave entre 8 y 63 caracteres" msgid "key with either 5 or 13 characters" msgstr "clave de 5 o 13 caracteres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "conocido" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "known-othernet (en una subred diferente)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "configuración administrada (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "seguridad media" @@ -10119,11 +11492,11 @@ msgctxt "nft unit" msgid "minute" msgstr "minuto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minutos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 #, fuzzy msgid "mobile home agent (H)" msgstr "agente de casas móviles (H)" @@ -10136,18 +11509,27 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "no" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "sin enlace" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +#, fuzzy +msgid "no override" +msgstr "sin anular" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "valor no vacío" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "ninguno" @@ -10158,21 +11540,21 @@ msgid "not present" msgstr "no presente" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "apagado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 #, fuzzy msgid "on available prefix" msgstr "en el prefijo disponible" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "red abierta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "otra configuración (O)" @@ -10181,6 +11563,10 @@ msgstr "otra configuración (O)" msgid "output" msgstr "salida" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "hace más de un día" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -10198,23 +11584,34 @@ msgstr "valor entero positivo" msgid "random" msgstr "aleatorio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "generada aleatoriamente" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" +"reduce la sobrecarga al recopilar y agregar mensajes de origen en un solo " +"paquete en lugar de muchos pequeños" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "modo relé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "enrutado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "seg" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "modo servidor" @@ -10222,7 +11619,7 @@ msgstr "modo servidor" msgid "sstpc Log-level" msgstr "nivel de registro sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "seguridad fuerte" @@ -10230,7 +11627,7 @@ msgstr "seguridad fuerte" msgid "tagged" msgstr "etiquetado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "unidades de tiempo (TUs / 1.024 ms) [1000-65535]" @@ -10244,25 +11641,27 @@ msgstr "" "Protocol\">HTTP
    o HTTPS." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "valor único" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "desconocido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "versión desconocida" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "ilimitado" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -10284,8 +11683,8 @@ msgid "untagged" msgstr "desetiquetado" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "dirección IP válida" @@ -10298,7 +11697,7 @@ msgid "valid IPv4 CIDR" msgstr "IPv4 válido CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "dirección IPv4 válida" @@ -10327,7 +11726,7 @@ msgid "valid IPv6 CIDR" msgstr "IPv6 válido CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "dirección IPv6 válida" @@ -10364,8 +11763,8 @@ msgstr "identificador UCI válido, nombre del host o dirección IP" msgid "valid address:port" msgstr "dirección válida: puerto" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "fecha válida (AAAA-MM-DD)" @@ -10405,11 +11804,23 @@ msgstr "valor entero valido" msgid "valid multicast MAC address" msgstr "dirección MAC de multidifusión válida" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"nombre de dispositivo de red válido entre 1 y 15 caracteres que no contenga " +"\":\", \"/\", \"%\" o espacios" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "nombre de dispositivo de red válido, no \".\" o \"..\"" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "red válida en notación de dirección/máscara de red" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "dígito de teléfono válido (0-9, \"*\", \"#\", \"!\" o \".\")" @@ -10419,43 +11830,43 @@ msgid "valid port or port range (port1-port2)" msgstr "puerto válido o rango de puertos (port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "valor de puerto válido" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "tiempo válido (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "valor entre %d y %d caracteres" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "valor entre %f y %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "valor mayor o igual a %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "valor menor o igual a %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "valor con %d caracteres" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "valor con al menos %d caracteres" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "valor con un máximo de %d caracteres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "seguridad débil" diff --git a/package/luci/modules/luci-base/po/fi/base.po b/package/luci/modules/luci-base/po/fi/base.po index ca75b8ae72..caad09d56f 100644 --- a/package/luci/modules/luci-base/po/fi/base.po +++ b/package/luci/modules/luci-base/po/fi/base.po @@ -1,32 +1,48 @@ msgid "" msgstr "" -"PO-Revision-Date: 2022-04-23 11:39+0000\n" +"PO-Revision-Date: 2023-10-18 05:43+0000\n" "Last-Translator: Jiri Grönroos \n" -"Language-Team: Finnish \n" "Language: fi\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12.1-dev\n" +"X-Generator: Weblate 5.1\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bitti" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d on virheellinen kenttä(t)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d h sitten" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d min sitten" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d s sitten" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s ei ole tägätty, vaikka se kuuluu useaan VLANiin!" @@ -51,32 +67,33 @@ msgstr "(tyhjä)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(ei sovittimia liitettynä)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" -msgstr "" +msgstr "+ %d lisää" #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:48 msgid "-- Additional Field --" msgstr "-- Lisäkenttä --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Valitse --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- mukautettu --" @@ -102,7 +119,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = ei käytetä RSSI-rajaa, 1 = ei muuteta ajurin vakiota" @@ -115,13 +132,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "1 minuutin kuorma:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "1 lippu" msgstr[1] "%d lippua" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12 h (12 tuntia - oletus)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "15 minuutin kuorma:" @@ -136,12 +158,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3 h (3 tuntia)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4-kirjaiminen heksadesimaalinen ID" @@ -154,43 +181,98 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "5 minuutin kuorma:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5 min (5 minuuttia)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "6 oktettia heksadesimaalimerkkijonona - ilman kaksoispisteitä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r nopea siirtyminen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w Liitoksen SA-kyselyn enimmäisaikakatkaisu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11w Liitoksen SA-kyselyn aikakatkaisu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w hallintakehyksen suojaus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w enimmäisaikakatkaisu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w uudelleenaikakatkaisu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr " ESSID " -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-verkkopeite" @@ -202,31 +284,43 @@ msgstr "LED-määritykset" msgid "LED Name" msgstr "LED-nimi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "" "NDP-välityspalvelin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA-liput" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA hyppyjen raja" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA-käyttöikä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-palvelu" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -272,11 +366,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Laitteen \"%s\" määritys on jo olemassa" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Samanniminen hakemisto on jo olemassa." @@ -284,25 +386,90 @@ msgstr "Samanniminen hakemisto on jo olemassa." msgid "A new login is required since the authentication session expired." msgstr "Istunnon päättymisen jälkeen tarvitaan uusi kirjautuminen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -335,29 +502,36 @@ msgstr "ARP-seurantaa ei tueta valitussa käytännössä!" msgid "ARP retry threshold" msgstr "ARP-uudelleenyrityskynnys" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "ARP-liikennetaulu \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Asynkroninen siirtotila)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM Sillat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM-näennäiskanavan tunnus (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM-näennäispolun tunnus (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -367,26 +541,22 @@ msgstr "" "Linux-sovittimiksi, joita voidaan käyttää yhdessä DHCP:n tai PPP:n kanssa " "yhdistämiseen palvelutarjoajan verkkoon." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM-laitteen numero" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C-järjestelmän toimittajan tunnus" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Puuttuva sovitin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "Rajoita DNS-palvelu aliverkkoihin joille tarjoamme DNS:ää." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Hyväksy paikallinen" @@ -395,7 +565,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Hyväksy paketti" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Hyväksy paketit, joilla on paikallinen lähdeosoite" @@ -403,16 +573,25 @@ msgstr "Hyväksy paketit, joilla on paikallinen lähdeosoite" msgid "Access Concentrator" msgstr "Pääsy keskitin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Tukiasema" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Toiminnot" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Aktiivinen" @@ -450,8 +629,8 @@ msgstr "Aktiiviset IPv6-säännöt" msgid "Active-Backup policy (active-backup, 1)" msgstr "Aktiivinen varmuuskopiointikäytäntö (aktiivinen varmuuskopiointi, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-hoc" @@ -468,18 +647,18 @@ msgstr "Mukautuva lähetyskuormantasaus (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Lisää" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Lisää ATM-silta" @@ -499,11 +678,11 @@ msgstr "Lisää LED-toiminto" msgid "Add VLAN" msgstr "Lisää VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Lisää laitemäärittely" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Lisää laitemäärittely…" @@ -511,20 +690,20 @@ msgstr "Lisää laitemäärittely…" msgid "Add instance" msgstr "Lisää esiintymä" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Lisää avain" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" "Lisää paikallisen verkkotunnuksen pääte nimiin, jotka tarjotaan hosts-" "tiedostoista" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Lisää uusi sovitin..." @@ -532,6 +711,10 @@ msgstr "Lisää uusi sovitin..." msgid "Add peer" msgstr "Lisää vertaiskone" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Lisää estolistalle" @@ -540,11 +723,11 @@ msgstr "Lisää estolistalle" msgid "Add to Whitelist" msgstr "Lisää sallittujen listalle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Hosts-tiedostot" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Lisäpalvelimien tiedosto" @@ -561,7 +744,11 @@ msgstr "Lisäpalvelimien tiedosto" msgid "Address" msgstr "Osoite" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Osoiteperhe" @@ -574,7 +761,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "Paikallisen välityssillan osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Osoitteet" @@ -583,29 +770,29 @@ msgstr "Osoitteet" msgid "Administration" msgstr "Hallinta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Lisäasetukset" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Edistyneet laiteasetukset" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Elinaika" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Yhteenlaskettu lähetysteho (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -642,18 +829,18 @@ msgstr "Sovittimen alias" msgid "Alias of \"%s\"" msgstr "Kohteen %s alias" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Kaikki palvelimet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" "Varaa IP-osoitteet alkaen pienimmästä käytettävissä olevasta osoitteesta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Jaa IP:t järjestyksessä" @@ -662,11 +849,11 @@ msgid "Allow SSH password authentication" msgstr "" "Salli SSH-kirjautuminen salasanalla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "Salli tukiaseman irrottaa asiakas alhaisen ACK-tilan perusteella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Salli kaikki paitsi luetellut" @@ -674,15 +861,15 @@ msgstr "Salli kaikki paitsi luetellut" msgid "Allow full UCI access for legacy applications" msgstr "Salli täysi UCI-yhteys vanhoille sovelluksille" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Salli vanhat 802.11b-nopeudet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Salli vain luetellut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Salli localhost" @@ -705,19 +892,24 @@ msgid "Allow system feature probing" msgstr "Salli järjestelmän ominaisuuksien testaus" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Salli root-käyttäjän kirjautua sisään salasanalla" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Sallitut IP:t" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Aina" @@ -729,11 +921,11 @@ msgstr "Aina pois päältä (ydin: ei mitään)" msgid "Always on (kernel: default-on)" msgstr "Aina päällä (ydin: oletus-päällä)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -741,10 +933,14 @@ msgstr "" "Käytä aina 40 MHz:n kanavia, vaikka toissijainen kanava olisi päällekkäinen. " "Tämän vaihtoehdon käyttäminen ei ole IEEE 802.11n-2009:n mukaista!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "Lähetettävien Duplicate Address Detection -selvitysten määrä" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Lomaketta tallennettaessa tapahtui virhe:" @@ -753,98 +949,47 @@ msgstr "Lomaketta tallennettaessa tapahtui virhe:" msgid "An optional, short description for this device" msgstr "Valinnainen, lyhyt laitteen kuvaus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annex A + L + M (kaikki)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Annex A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Annex A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Annex A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Annex A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Annex B (kaikki)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Annex B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Annex B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Annex B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Annex J (kaikki)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Annex L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Annex M (kaikki)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Annex M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Ilmoitetut DNS-toimialueet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Anonyymi identiteetti" @@ -856,7 +1001,7 @@ msgstr "Anonyymi liitos" msgid "Anonymous Swap" msgstr "Anonyymi vaihto" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Mikä tahansa paketti" @@ -868,52 +1013,56 @@ msgstr "Mikä tahansa paketti" msgid "Any zone" msgstr "Mikä tahansa vyöhyke" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" -msgstr "" +msgstr "Toteuta ja säilytä asetukset" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 msgid "Apply backup?" msgstr "Käytetääntkö varmuuskopiota?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Pyyntö epäonnistui, tila %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Käytä valitsematonta" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Otetaan käyttöön määritysmuutoksia... %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Arkkitehtuuri" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Määritä osa jokaisen julkisen IPv6-etuliitteen tietystä pituudesta tähän " "liittymään" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -921,7 +1070,7 @@ msgstr "" "Määritä etuliitteiden osat käyttämällä tätä heksadesimaalista " "alaliitetunnusta tälle sovittimelle." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Liittyneet asemat" @@ -930,15 +1079,15 @@ msgstr "Liittyneet asemat" msgid "Associations" msgstr "Liitokset" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -948,25 +1097,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "Yritä ottaa käyttöön laitteille määritetyt liityntäkohdat" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Auth-ryhmä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Todennus" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Todennuksen tyyppi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Määräävä" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Valtuutus vaaditaan" @@ -974,7 +1124,9 @@ msgstr "Valtuutus vaaditaan" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -993,7 +1145,7 @@ msgid "Automatically check filesystem for errors before mounting" msgstr "" "Tarkista tiedostojärjestelmän virheet automaattisesti ennen liittämistä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1015,6 +1167,10 @@ msgstr "Tiedostojärjestelmän automaattinen liittäminen" msgid "Automount Swap" msgstr "Liitä sivutusosio automaattisesti" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Saatavilla" @@ -1033,11 +1189,15 @@ msgstr "Saatavilla" msgid "Average:" msgstr "Keskiarvo:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1045,15 +1205,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Takaisin" @@ -1062,11 +1226,7 @@ msgstr "Takaisin" msgid "Back to Overview" msgstr "Takaisin yleiskatsaukseen" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Takaisin määritykseen" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1079,16 +1239,15 @@ msgid "Backup / Flash Firmware" msgstr "Varmuuskopioi / Kirjoita laiteohjelmisto" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Varmuuskopioitavat tiedostot" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Taajuusalue" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1096,12 +1255,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Merkkikehysten väli" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1116,7 +1298,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "Yhdistä dynaamisesti sovittimiin yleisosoitteen sijasta (suositellaan linux-" @@ -1127,18 +1309,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Yhdistä sovitin" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1150,65 +1345,77 @@ msgstr "Yhdistä tunneli tähän sovittimeen." msgid "Bitrate" msgstr "Bittinopeus" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Sidoskäytäntö" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Silta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Silta (Tue suoraa kommunikointia MAC VLAN:ien välillä)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Sillan VLAN-suodatus" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Siltalaite" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Siltayksikön numero" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Päälle käynnistettäessä" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Lähetyskäytäntö (lähetys, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Selaa…" @@ -1216,14 +1423,36 @@ msgstr "Selaa…" msgid "Buffered" msgstr "Puskuroitu" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "CA-varmenne; jos tyhjä, se tallennetaan ensimmäisen yhteyden jälkeen." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "CLAT-määritys epäonnistui" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "CNAME" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME tai fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Suorittimen käyttö (%)" @@ -1238,18 +1467,23 @@ msgstr "Välimuistissa" msgid "Call failed" msgstr "Kutsu epäonnistui" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Peruuta" @@ -1257,32 +1491,32 @@ msgstr "Peruuta" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1291,24 +1525,32 @@ msgstr "" msgid "Category" msgstr "Luokka" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Varmennerajoitus (verkkotunnus)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Varmennerajoitus (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Varmennerajoitus (Kohde)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Varmennerajoitus (jokerimerkki)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1316,8 +1558,8 @@ msgstr "" "Varmenteen rajoittaminen - esim. /CN=wifi.omayritys.com
    Katso " "todelliset arvot `logread -f`avulla yhteyden kättelyn aikana" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1325,8 +1567,8 @@ msgstr "" "Varmennerajoitukset DNS SAN -arvoihin (jos käytettävissä)
    tai kohteen " "CN (tarkka haku)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1334,8 +1576,8 @@ msgstr "" "Varmennerajoitukset DNS SAN -arvoihin (jos käytettävissä)
    tai kohteen " "CN (tarkka haku)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1349,16 +1591,16 @@ msgstr "" msgid "Chain" msgstr "Ketju" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Muutokset" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Muutokset on palautettu." @@ -1369,18 +1611,19 @@ msgstr "Muuttaa järjestelmänvalvojan salasanan" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Kanava" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Kanava-analyysi" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Kanavaleveys" @@ -1388,7 +1631,7 @@ msgstr "Kanavaleveys" msgid "Check filesystems before mount" msgstr "Tarkista tiedostojärjestelmät ennen liittämistä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" "Valitse tämä, jos haluat poistaa olemassa olevat verkot tästä radiosta." @@ -1406,8 +1649,8 @@ msgstr "Tarkistetaan kuvaa…" msgid "Choose mtdblock" msgstr "Valitse mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1419,7 +1662,7 @@ msgstr "" "mukautettu
    -kenttä määrittääksesi uuden vyöhykkeen ja liittääksesi " "sovittimen siihen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1427,7 +1670,7 @@ msgstr "" "Valitse verkko(t), jonka haluat liittää tähän langattomaan sovittimeen, tai " "määritä uusi verkko täyttämällä mukautettu-kenttä." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Salakirjoitustapa" @@ -1450,9 +1693,10 @@ msgstr "" "Lataa määritetty mtdblock-tiedosto valitsemalla Tallenna mtdblock. (HUOM: " "TÄMÄ OMINAISUUS ON AMMATTILAISILLE! )" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Asiakas" @@ -1461,9 +1705,9 @@ msgstr "Asiakas" msgid "Client ID to send when requesting DHCP" msgstr "Asiakastunnus, joka lähetetään DHCP: tä pyydettäessä" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Sulje" @@ -1480,20 +1724,20 @@ msgstr "" "Sulje passiivinen yhteys määritetyn ajan kuluttua, käytä 0 pysyvän yhteyden " "luomiseen" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Sulje luettelo ..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Kerätään tietoja…" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Komento" @@ -1510,7 +1754,7 @@ msgstr "Komento epäonnistui" msgid "Comment" msgstr "Kommentti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1534,29 +1778,28 @@ msgstr "Laske lähtevä tarkistussumma (valinnainen)." msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Kokoonpano" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Määritysmuutokset ovat käytössä." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Määritysmuutokset on peruttu!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Määritys epäonnistui" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1566,28 +1809,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Määritä…" @@ -1599,9 +1842,10 @@ msgstr "Vahvista irrottaminen" msgid "Confirmation" msgstr "Vahvistus" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Yhdistetty" @@ -1611,11 +1855,11 @@ msgstr "Yhdistetty" msgid "Connection attempt failed" msgstr "Yhteyden muodostaminen epäonnistui" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "Yhteyden muodostaminen epäonnistui." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1627,7 +1871,7 @@ msgstr "Yhteys katkennut" msgid "Connections" msgstr "Yhteydet" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1657,9 +1901,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Sisältö on tallennettu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1670,16 +1914,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1694,20 +1938,20 @@ msgstr "" msgid "Country" msgstr "Maa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Maatunnus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Kantavuusalueen solutiheys" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Luo / määritä palomuurivyöhyke" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Luo sovitin" @@ -1719,19 +1963,19 @@ msgstr "Kriittinen" msgid "Cron Log Level" msgstr "Cron-lokin taso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Nykyinen teho" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:28 msgctxt "nft meta hour" msgid "Current time" -msgstr "" +msgstr "Nykyinen aika" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:29 msgctxt "nft meta day" msgid "Current weekday" -msgstr "" +msgstr "Nykyinen viikonpäivä" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:573 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:575 @@ -1763,31 +2007,31 @@ msgstr "" "Mukauta LED-valojen " "toimintaa, jos mahdollista." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE-asiakas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE-portti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "Dae-salaisuus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "DHCP-asetukset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP-palvelin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP ja DNS" @@ -1798,16 +2042,22 @@ msgstr "DHCP ja DNS" msgid "DHCP client" msgstr "DHCP-asiakas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP-asetukset" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6-asiakas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6-palvelu" @@ -1819,29 +2069,29 @@ msgstr "DHCPv6-palvelu" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "DNS-edelleenvälitys" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "" "DNS-kyselyportti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "DNS-hakutoimialueet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" "DNS-palvelinportti" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:292 msgid "DNS setting is invalid" -msgstr "" +msgstr "DNS-asetus on virheellinen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "DNS-paino" @@ -1849,11 +2099,11 @@ msgstr "DNS-paino" msgid "DNS-Label / FQDN" msgstr "DNS-nimi / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "DNSSEC tarkista allekirjoittamaton" @@ -1865,39 +2115,47 @@ msgstr "DPD:n käyttämättömyysaikakatkaisu" msgid "DS-Lite AFTR address" msgstr "DS-Lite AFTR -osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "DSL-tila" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "DSL-linjatila" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "DTIM-aikaväli" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Tiedonsiirtonopeus" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Dataa vastaanotettu" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Dataa lähetetty" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Debug" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Oletusreititin" @@ -1905,7 +2163,7 @@ msgstr "Oletusreititin" msgid "Default state" msgstr "Oletustila" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1914,61 +2172,62 @@ msgstr "" "Määritä lisää DHCP-asetuksia, esimerkiksi \" 6,192.168.2.1, " "192.168.2.2 \", joka mainostaa erilaisia DNS-palvelimia asiakkaille." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Poista" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Poista avain" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Poistopyyntö epäonnistui: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Poista tämä verkko" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Delivery Traffic Indication Message aikaväli" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Kuvaus" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Poista valinta" @@ -1976,11 +2235,11 @@ msgstr "Poista valinta" msgid "Design" msgstr "Suunnittelu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2015,9 +2274,9 @@ msgstr "Kohdevyöhyke" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2027,36 +2286,40 @@ msgstr "Kohdevyöhyke" msgid "Device" msgstr "Laite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Laitteen määritys" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Laite ei ole aktiivinen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Laite käynnistyy uudelleen…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Laitenimi" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "ModemManager ei hallitse laitetta." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Laite ei ole läsnä" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Laitetyyppi" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Laitetta ei tavoiteta!" @@ -2064,31 +2327,31 @@ msgstr "Laitetta ei tavoiteta!" msgid "Device unreachable! Still waiting for device..." msgstr "Laitetta ei tavoiteta! Odotetaan edelleen laitetta..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Laitteet" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnostiikka" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Soita numeroon" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Hakemisto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Poista käytöstä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2105,20 +2368,24 @@ msgstr "Poista DNS-haku käytöstä" msgid "Disable Encryption" msgstr "Poista salaus käytöstä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Poista käyttämättömyyskyselyt käytöstä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Poista tämä verkko käytöstä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2127,33 +2394,32 @@ msgstr "Poista tämä verkko käytöstä" msgid "Disabled" msgstr "Pois käytöstä" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" -msgstr "" +msgstr "Poissa käytöstä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Poista heikon kuittauksen yhteydet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "Hylkää ulkoverkosta tulevat RFC1918-vastaukset." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Irroita" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Irrotusyritys epäonnistui" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Yhteyden katkaiseminen epäonnistui." @@ -2163,29 +2429,41 @@ msgstr "Levytila" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Hylkää" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Etäisyyden optimointi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Etäisyys kauimpaan verkon jäseneen metreinä." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP-palvelin ja DNS-välittäjä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" "Älä tallenna välimuistiin negatiivisia vastauksia, esim. olemattomien " @@ -2209,36 +2487,25 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "Älä luo reittiä kohteelle (valinnainen)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "Älä lähetä DNS-kyselyitä ilman " "DNS-verkkotunnusta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Älä välitä eteenpäin kyselyitä, joihin julkiset nimipalvelimet eivät voi " -"vastata" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Älä välitä käänteisiä hakuja paikallisille verkoille" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Estä näiden sovittimien kuuntelu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2248,17 +2515,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "Älä lähetä isäntänimeä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Haluatko todella poistaa '%s'?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Haluatko todella poistaa seuraavan SSH-avaimen?" @@ -2266,27 +2533,29 @@ msgstr "Haluatko todella poistaa seuraavan SSH-avaimen?" msgid "Do you really want to erase all settings?" msgstr "Haluatko todella poistaa kaikki asetukset?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Haluatko todella poistaa hakemiston '%s' alihakemistoineen?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:100 msgid "Do you want to replace the current keys?" -msgstr "" +msgstr "Haluatko korvata nykyiset avaimet?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Verkkotunnus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Vaadi verkkotunnus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Sallitut verkkotunnukset" @@ -2312,11 +2581,11 @@ msgstr "Lataa varmuuskopio" msgid "Download mtdblock" msgstr "Lataa mtd-osio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Alavirran SNR-siirtymä" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2330,16 +2599,54 @@ msgstr "Vedä järjestääksesi uudelleen" msgid "Drop Duplicate Frames" msgstr "Pudota päällekkäiset kehykset" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Pudota paketti" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbear-esiintymä" @@ -2357,21 +2664,21 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack-Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Dynaaminen DHCP " -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2379,7 +2686,7 @@ msgstr "" msgid "Dynamic tunnel" msgstr "Dynaaminen tunneli" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2387,21 +2694,33 @@ msgstr "" "Varaa DHCP-osoitteet dynaamisesti asiakkaille. Jos tämä on poistettu " "käytöstä, vain staattisemääritetyt asiakkaat näytetään." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Esim. br-vlan tai brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Esim. eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "EA-bittien pituus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAP-menetelmä" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Muokkaa" @@ -2409,6 +2728,10 @@ msgstr "Muokkaa" msgid "Edit peer" msgstr "Muokkaa vertaista" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2417,11 +2740,11 @@ msgstr "" "Voit muokata edellä olevia määrityksiä korjataksesi vrheen ja paina " "\"Tallenna\" ladataksesi sivu uudeleen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Muokkaa tätä verkkoa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Muokkaa langatonta verkkoa" @@ -2430,44 +2753,34 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Egress-laitenimi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Egress-tagattu" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Egress-tagaamaton" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Hätä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Ota käyttöön" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2475,11 +2788,11 @@ msgstr "" "Käytä IGMP " "nuuskimista" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Ota käyttöön STP " -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" "Ota SLAAC käyttöön" @@ -2498,10 +2811,11 @@ msgstr "Ota käyttöön tietocirtojen dynaaminen sekoittaminen" msgid "Enable HE.net dynamic endpoint update" msgstr "Ota HE.net dynaaminen päätepisteen päivitys käyttöön" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Käytä IPv6:tta" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Käytä IPv6-neuvottelua" @@ -2515,11 +2829,15 @@ msgstr "Käytä IPv6-neuvottelua" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Käytä IPv6-neuvottelua PPP-linkissä" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Käytä Jumbo Frame-läpivientiä" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2531,11 +2849,11 @@ msgstr "Ota NTP-asiakas käyttöön" msgid "Enable Single DES" msgstr "Ota käyttöön yksittäinen DES" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "TFTP-palvelin käytössä" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Käytä VLAN-suodatusta" @@ -2543,7 +2861,7 @@ msgstr "Käytä VLAN-suodatusta" msgid "Enable VLAN functionality" msgstr "VLAN-toiminnot käytössä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Ota WPS-painike käyttöön, vaatii WPA(2)-PSK/WPA3-SAE" @@ -2557,12 +2875,12 @@ msgstr "" "Protocol\">HTTP-pyynnöille HTTPS-porttiin." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Ota käyttöön avaimen uudelleenasennus (KRACK) -vastatoimet" @@ -2578,26 +2896,26 @@ msgstr "Ota saapuvien pakettien peilaus käyttöön" msgid "Enable mirroring of outgoing packets" msgstr "Ota käyttöön lähtevien pakettien peilaus" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Ota pakettiohjaus käyttöön kaikilla prosessoreilla. Voi parantaa tai " "heikentää verkon nopeutta." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2619,11 +2937,11 @@ msgstr "Lisää tuki multicast -liikenteelle (valinnainen)" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Ota käyttöön kapselointipakettien DF (Don't Fragment) -lippu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Käytä tätä verkkoa" @@ -2632,21 +2950,24 @@ msgstr "Käytä tätä verkkoa" msgid "Enable tx checksum" msgstr "Ota tx-tarkistussumma käyttöön" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Käytössä" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Ottaa IGMP:n nuuskimisen käyttöön tällä sillalla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2654,7 +2975,13 @@ msgstr "" "Mahdollistaa nopean verkkovierailun samaan Mobility Domain -alueeseen " "kuuluvien yhteyspisteiden välillä" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Ottaa käyttöön Spanning Tree Protokollan tällä sillalla" @@ -2662,24 +2989,29 @@ msgstr "Ottaa käyttöön Spanning Tree Protokollan tällä sillalla" msgid "Encapsulation limit" msgstr "Kapselointiraja" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Kapselointitila" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Salaus" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Päätepiste" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Päätepisteen palvelin" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Päätepisteen portti" @@ -2687,23 +3019,23 @@ msgstr "Päätepisteen portti" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "Pakota IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "Pakota IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "Pakota IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "Pakota MLD:n versio 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "Pakota MLD:n versio 2" @@ -2732,10 +3064,6 @@ msgstr "Virhe" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Virheelliset sekunnit (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2754,37 +3082,51 @@ msgstr "30 sekunnin välein (hidas, 0)" msgid "Every second (fast, 1)" msgstr "Joka sekunti (nopea, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Älä huomioi sovittimia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "Salli ylävirran vastaukset alueella 127.0.0.0/8, esim. RBL-palveluille" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Olemassa oleva laite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Laajenna palvelimet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Odottaa heksadesimaalista osoitusvihjettä" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Odotetaan kelvollista IPv4-osoitetta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Odotetaan kelvollista IPv6-osoitetta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2793,11 +3135,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Odotettiin: %s" @@ -2809,7 +3151,7 @@ msgstr "Odotus: arvon ei tule ole tyhjä" msgid "Expires" msgstr "Päättyy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2820,11 +3162,11 @@ msgstr "" msgid "External" msgstr "Ulkoinen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Ulkoinen R0-avainhaltijaluettelo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Ulkoinen R1-avainhaltijaluettelo" @@ -2852,37 +3194,65 @@ msgstr "Pppd-lisävalinnat" msgid "Extra sstpc options" msgstr "Sstpc-lisävalinnat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT over DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT over the Air" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "FT-protokolla" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Systeemin salasanan vaihto epäonnistui." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" "Tehtyjen muutosten onnistuminen ei varmistunut %d sekunnissa, joten " "aikaisemmat asetukset palautetaan…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Yhdistäminen epäonnistui" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Yhteyden katkaiseminen epäonnistui" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Komento \"/etc/init.d/%s %s\" epäonnistui: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Tiedosto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2891,28 +3261,28 @@ msgstr "" "\"server=1.2.3.4\" toimialuekohtaisissa tai muissa DNS palvelimessa." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Tiedostoa ei voida lukea" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "tiedosto, johon annetut DHCP -lainat tallennetaan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "" "paikallinen DNS-" "tiedosto" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Tiedostonimi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Asiakkaille mainostetun käynnistysnäköistiedoston tiedostonimi" @@ -2921,14 +3291,22 @@ msgstr "Asiakkaille mainostetun käynnistysnäköistiedoston tiedostonimi" msgid "Filesystem" msgstr "Tiedostojärjestelmä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Suodata IPv4:n A-tietueet" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Suodata IPv6:n AAAA-tietueet" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Suodata yksityinen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Suodata hyödytön" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Suodatus kaikille orjille, ei tarkistusta" @@ -2941,8 +3319,13 @@ msgstr "Suodatus kaikille orjille, tarkistus vain aktiiviselle orjalle" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "Suodatus kaikille orjille, tarkistus vain vara-orjille" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Viimeistely epäonnistui" @@ -2954,7 +3337,7 @@ msgstr "" "Etsi kaikki tällä hetkellä liitetyt tiedostojärjestelmät ja sivutusosiot ja " "korvaa määritykset oletusarvoilla havaittun perusteella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Etsi ja liity verkkoon" @@ -2968,10 +3351,11 @@ msgid "Firewall" msgstr "Palomuuri" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Palomuurimerkintä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Palomuurin asetukset" @@ -2979,19 +3363,19 @@ msgstr "Palomuurin asetukset" msgid "Firewall Status" msgstr "Palomuurin tila" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Laiteohjelmisto-tiedosto" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Laiteohjelmiston versio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Kiinteä lähdeportti lähteville DNS-kyselyille." @@ -3017,40 +3401,48 @@ msgstr "Flash-toiminnot" msgid "Flashing…" msgstr "Kirjoitetaan laiteohjelmistoa…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Pakota" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Pakota 40 MHz-moodi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Pakota CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Pakota DHCP tähän verkkoon, vaikka toinen palvelin olisi havaittu." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "Pakota IGMP-versio" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "Pakota MLD-versio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Pakota TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Pakota TKIP ja CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Pakota linkki" @@ -3062,11 +3454,11 @@ msgstr "Pakota päivitys" msgid "Force use of NAT-T" msgstr "Pakoita NAT-T käyttöön" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Lomakkeen tunnussanoman ristiriita" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3085,37 +3477,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "DHCP-liikenteen edelleen välittäminen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "Välitettävien virheenkorjaus sekunnit (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Välitä yhteislähetykset" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Välitä mesh peer liikennettä" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "Välitä multicast-paketit unicast-paketteina tällä laitteella." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Edelleenlähetystila" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Hajanaisuuskynnysarvo" @@ -3139,7 +3535,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Vain GPRS" @@ -3159,12 +3555,16 @@ msgstr "GRETAP-tunneli IPv4:n yli" msgid "GRETAP tunnel over IPv6" msgstr "GRETAP-tunneli IPv6:n yli" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Yhdyskäytävä" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Yhdyskäytävän portit" @@ -3174,23 +3574,23 @@ msgstr "Yhdyskäytävän portit" msgid "Gateway address is invalid" msgstr "Yhdyskäytävän osoite ei kelpaa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Yleiset asetukset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Yleiset asetukset" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Yleiset laiteasetukset" @@ -3198,7 +3598,7 @@ msgstr "Yleiset laiteasetukset" msgid "Generate Config" msgstr "Luo määritys" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Luo PMK paikallisesti" @@ -3206,29 +3606,29 @@ msgstr "Luo PMK paikallisesti" msgid "Generate archive" msgstr "Luo arkisto" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:109 msgid "Generate new key pair" -msgstr "" +msgstr "Luo uusi avainpari" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" -msgstr "" +msgstr "Luo esijaettu avain" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" -msgstr "" +msgstr "Luodaan QR-koodi…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:79 msgid "Given password confirmation did not match, password not changed!" @@ -3238,39 +3638,40 @@ msgstr "Koska salasanan tarkistus ei onnistunut, salasanaa ei muutettu!" msgid "Global Settings" msgstr "Yleiset asetukset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Yleiset verkkoasetukset" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "Siirry laiteohjelmiston päivitykseen..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Siirry salasanan määritykseen ..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Siirry vastaavalle asetussivulle" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "Anna pääsy DHCP-määrityksiin" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Salli pääsy DHCP-tilanäyttöön" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "Anna pääsy DSL-tilanäyttöön" @@ -3282,6 +3683,10 @@ msgstr "Anna pääsy LuCI OpenConnect -toimintoihin" msgid "Grant access to LuCI Wireguard procedures" msgstr "Anna pääsy LuCI Wireguard -toimintoihin" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "Anna pääsy SSH-määrityksiin" @@ -3318,7 +3723,7 @@ msgstr "Anna pääsy levyjen liitos-määrityksiin (mount)" msgid "Grant access to network configuration" msgstr "Anna pääsy verkkoasetuksiin" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Anna pääsy verkon diagnostiikkatyökaluihin" @@ -3326,6 +3731,10 @@ msgstr "Anna pääsy verkon diagnostiikkatyökaluihin" msgid "Grant access to network status information" msgstr "Anna pääsy verkon tilan tietoihin" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "Anna pääsy prosessien tilatietoihin" @@ -3358,7 +3767,7 @@ msgstr "Anna pääsy uHTTPd-kokoonpanoon" msgid "Grant access to wireless channel status" msgstr "Anna pääsy langattoman verkon kanavan tilaan" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Salli pääsy langattoman tilan näyttöön" @@ -3387,15 +3796,11 @@ msgstr "HTTP(S)-pääsy" msgid "Hang Up" msgstr "Katkaise" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Otsikon virhekoodit (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Sykeväli (ydin: syke)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3407,7 +3812,7 @@ msgstr "" "Täällä voit määrittää laitteen perusasiat, kuten laitenimen tai " "aikavyöhykkeen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Piilota ESSID" @@ -3416,17 +3821,25 @@ msgstr "Piilota ESSID" msgid "Hide empty chains" msgstr "Piilota tyhjät ketjut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "Korkea" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3436,7 +3849,7 @@ msgstr "Palvelin" msgid "Host expiry timeout" msgstr "Palvelimen vanhenemisaika" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "Isäntä pyytää tätä tiedostonimeä käynnistyspalvelimelta." @@ -3444,10 +3857,16 @@ msgstr "Isäntä pyytää tätä tiedostonimeä käynnistyspalvelimelta." msgid "Host-Uniq tag content" msgstr "Host-Uniq-tunnisteen sisältö" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3457,11 +3876,11 @@ msgstr "Laitenimi" msgid "Hostname to send when requesting DHCP" msgstr "Asiakastunnus, joka lähetetään DHCP:tä pyydettäessä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Isäntänimet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3487,12 +3906,12 @@ msgstr "Hybridi" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:49 msgctxt "nft icmp code" msgid "ICMP code" -msgstr "" +msgstr "ICMP-koodi" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:50 msgctxt "nft icmp type" msgid "ICMP type" -msgstr "" +msgstr "ICMP-tyyppi" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:51 msgctxt "nft icmpv6 code" @@ -3517,23 +3936,27 @@ msgstr "IEEE 802.3ad - dynaaminen linkin yhdistäminen (802.3ad, 4)" msgid "IKE DH Group" msgstr "IKE DH -ryhmä" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "IMEI" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IP-osoitteet" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "IP-protokolla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "IP-tyyppi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3549,7 +3972,7 @@ msgstr "IP-osoite on virheellinen" msgid "IP address is missing" msgstr "IP-osoite puuttuu" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3561,20 +3984,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "IP-protokolla" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "IP-protokolla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Väärän NX-alueen ohitus" @@ -3582,14 +4005,15 @@ msgstr "Väärän NX-alueen ohitus" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3605,7 +4029,7 @@ msgstr "IPv4-naapurit" msgid "IPv4 Routing" msgstr "IPv4-reititys" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "IPv4-säännöt" @@ -3615,7 +4039,7 @@ msgstr "IPv4-ylävirta" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3642,7 +4066,7 @@ msgstr "IPv4-verkkomaski" msgid "IPv4 network in address/netmask notation" msgstr "IPv4-verkko osoite/verkkopeittemerkittynä" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Vain IPv4" @@ -3655,11 +4079,11 @@ msgstr "IPv4-etuliite" msgid "IPv4 prefix length" msgstr "IPv4-etuliitteen pituus" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3668,16 +4092,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-in-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (molemmat - oletuksena IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3688,7 +4116,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3696,7 +4125,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6-palomuuri" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "IPv6 MTU" @@ -3704,7 +4133,11 @@ msgstr "IPv6 MTU" msgid "IPv6 Neighbours" msgstr "IPv6-naapurit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "IPv6-RA-asetukset" @@ -3712,15 +4145,15 @@ msgstr "IPv6-RA-asetukset" msgid "IPv6 Routing" msgstr "IPv6-reititys" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "IPv6-säännöt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "IPv6-asetukset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6-ULA-etuliite" @@ -3734,12 +4167,12 @@ msgstr "IPv6-ylävirta" msgid "IPv6 address" msgstr "IPv6-osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "IPv6-varausvihje" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "IPv6-varauksen pituus" @@ -3751,11 +4184,11 @@ msgstr "IPv6-yhdyskäytävä" msgid "IPv6 network in address/netmask notation" msgstr "IPv6-verkko osoite/verkkomaski merkittynä" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Vain IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "IPv6-ensisijaisuus" @@ -3764,7 +4197,7 @@ msgstr "IPv6-ensisijaisuus" msgid "IPv6 prefix" msgstr "IPv6-etuliite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "IPv6-etuliitesuodatin" @@ -3778,24 +4211,19 @@ msgstr "IPv6-etuliitteen pituus" msgid "IPv6 routed prefix" msgstr "IPv6-reititetty etuliite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "IPv6-lähdereititys" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "IPv6-pääte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -" IPv6-jälkiliite (heksa)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "IPv6-tuki" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3803,6 +4231,10 @@ msgstr "" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3818,10 +4250,16 @@ msgstr "IPv6-yli-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-yli-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identiteetti" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Jos valittuna, 1DES on käytössä" @@ -3834,13 +4272,13 @@ msgstr "Lisää \"+ipv6\" valinnan pppd sovelluksen valitsimiin" msgid "If checked, encryption is disabled" msgstr "Jos valittuna, salaus on pois käytöstä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3857,21 +4295,23 @@ msgid "" "device node" msgstr "Määritä laite osiotunnisteella kiinteän laitepolun sijasta" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Jos valitsematta, oletusreittiä ei ole määritetty" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "Jos valitsematta, mainostettuja DNS-palvelinosoitteita ei huomioida" @@ -3891,15 +4331,23 @@ msgstr "" "hidas prosessi, koska vaihtolaite ei toimi RAM-muistin nopeudella." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ohita /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Älä huomioi sovitinta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ohita resolv-tiedosto" @@ -3911,25 +4359,25 @@ msgstr "Levykuva" msgid "Image check failed:" msgstr "Levykuvan tarkistus epäonnistui:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" -msgstr "" +msgstr "Tuo asetukset" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3941,7 +4389,21 @@ msgstr "" msgid "In" msgstr "Sisään" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -3949,7 +4411,7 @@ msgstr "" "Järjestelmä suojaamiseksi luvattomalta käytöltä, pyyntösi on estetty. Palaa " "edelliselle sivulle napsauttamalla alla olevaa \"Jatka\" -painiketta." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3979,7 +4441,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Tuleva tarkistussumma" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Saapuva sovitin" @@ -3987,6 +4449,7 @@ msgstr "Saapuva sovitin" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Tuleva avain" @@ -4005,22 +4468,21 @@ msgstr "Tietoja" msgid "Information" msgstr "Tietoja" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "Ingress-laitteen id" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "Ingress-laitteen nimi" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Alustusvirhe" @@ -4032,31 +4494,43 @@ msgstr "Initscript" msgid "Initscripts" msgstr "Initscriptit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Sisäinen varmennerajoitus (verkkotunnus)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Sisäinen varmennerajoitus (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Sisäinen varmennerajoitus (Kohde)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Sisäinen varmennerajoitus (jokerimerkki)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Asenna protokollalaajennukset..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Instanssi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +#, fuzzy +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Instanssi" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +#, fuzzy +msgid "Instance Details" +msgstr "Instanssi" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4068,6 +4542,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Riittämättömät oikeudet lukea UCI-asetuksia." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4075,7 +4553,7 @@ msgstr "Riittämättömät oikeudet lukea UCI-asetuksia." msgid "Interface" msgstr "Sovitin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -4083,7 +4561,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "Sovitin %q -laite siirtyi automaattisesti kohdasta %q kohtaan %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Sovittimen määritys" @@ -4114,11 +4592,11 @@ msgstr "Sovitin yhdistää..." msgid "Interface is shutting down..." msgstr "Sovitin sulkeutuu..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Sovitin käynnistyy..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Sovitin pysähtyy..." @@ -4127,12 +4605,12 @@ msgid "Interface name" msgstr "Sovittimen nimi" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Sovitinta ei ole tai sitä ole yhdistetty." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Sovittimet" @@ -4141,22 +4619,26 @@ msgstr "Sovittimet" msgid "Internal" msgstr "Sisäinen" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Sisäinen palvelinvirhe" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Oppimispakettien lähetysväli" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4166,8 +4648,9 @@ msgid "Invalid" msgstr "Virheellinen" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "Annettu virheellinen APN" @@ -4177,6 +4660,10 @@ msgstr "Annettu virheellinen APN" msgid "Invalid Base64 key string" msgstr "Virheellinen Base64-merkkijono" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Virheellinen IPv6-osoite" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4202,7 +4689,7 @@ msgstr "" msgid "Invalid argument" msgstr "Virheellinen argumentti" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4216,15 +4703,36 @@ msgstr "Virheellinen komento" msgid "Invalid hexadecimal value" msgstr "Virheellinen heksadesimaaliarvo" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Virheellinen portti" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "Virheellinen palvelimen URL-osoite" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Virheellinen käyttäjätunnus tai salasana! Yritä uudelleen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Eristä asiakkaat" @@ -4237,25 +4745,25 @@ msgstr "" "Näyttää siltä, että yrität kirjoittaa levykuvaa, joka ei sovi flash-" "muistiin, tarkista levykuvatiedosto!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "JavaScript vaaditaan!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Liity verkkoon" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Liity verkkoon: Langattoman verkon etsintä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Liittyminen verkkoon: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Siirry sääntöön" @@ -4263,24 +4771,28 @@ msgstr "Siirry sääntöön" msgid "Keep settings and retain the current configuration" msgstr "Säilytä asetukset ja nykyinen kokoonpano" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Ytimen loki" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Ytimen versio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Avain" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Avain #%d" @@ -4288,6 +4800,7 @@ msgstr "Avain #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Avain tuleville paketeille." @@ -4295,14 +4808,19 @@ msgstr "Avain tuleville paketeille." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Avain lähteville paketeille." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4347,7 +4865,7 @@ msgstr "LCP-kaiun aikaväli" msgid "LED Configuration" msgstr "LED-määritys" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4364,32 +4882,39 @@ msgstr "Kieli" msgid "Language and Style" msgstr "Kieli ja tyyli" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Viive" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Viimeisin kättely" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Lehti" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Lainatiedosto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Laina-aika" @@ -4413,7 +4938,7 @@ msgstr "Automaattinen tunnistaminen jos tyhjä" msgid "Leave empty to use the current WAN address" msgstr "Jätä tyhjä käyttääksesi nykyistä WAN-osoitetta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4423,31 +4948,27 @@ msgstr "" "protokollan mukaisia siirtonopeuksia toimiakseen. Niiden käyttö heikentää " "tiedonsiirtotehoa huomattavasti eikä sitä suositella, jos vain mahdollista." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Tietoja:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Raja" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Linjan vaimennus (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "Linja-tila" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "Linjatila" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "Linjan käyttöaika" @@ -4468,17 +4989,19 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" "Luettelo palvelimista, jotka toimittavat vääriä NX-verkkotunnuksen tuloksia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4492,7 +5015,7 @@ msgstr "" "kohde-MAC-osoitteeseen, kun pmk-R1-avainta pyydetään R0KH-avaimesta, jota " "STA käytti alkuperäisen liikuvuusalueen aikana." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4511,25 +5034,22 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Luettelo autentikoinnin SSH-avaintiedostoista" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Luettelo verkkotunnuksista, joille sallitaan RFC1918-vastaukset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Lista verkkoalueista sekä käytettävistä IP-osoitteista." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" "Luettelo DNS -palvelimista, " "joille pyynnöt välitetään" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Kuunteluportti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Kuuntelevat sovittimet" @@ -4538,7 +5058,7 @@ msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" "Kuuntele vain määritetyissä sovittimissa tai kaikissa jos määrittelemättä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4548,7 +5068,7 @@ msgstr "Rajoita kuuntelu näihin sovittimiin ja sisäiseen sovittimeen." msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Saapuvien DNS-kyselyiden kuunteluportti" @@ -4557,7 +5077,7 @@ msgstr "Saapuvien DNS-kyselyiden kuunteluportti" msgid "Load" msgstr "Kuormitus" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Kuormituksen keskiarvo" @@ -4565,27 +5085,28 @@ msgstr "Kuormituksen keskiarvo" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Ladataan dataa…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Ladataan hakemiston sisältöä…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Ladataan näkymää…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Paikallinen" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Paikallinen IP-osoite" @@ -4605,11 +5126,12 @@ msgstr "Käytä seuraavaa paikallista IP-osoitetta" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Paikallinen IPv4-osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Paikallinen IPv6 DNS -palvelin" @@ -4625,45 +5147,71 @@ msgstr "Paikallinen IPv6-osoite" msgid "Local Startup" msgstr "Paikallinen käynnistys" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Paikallinen aika" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "Paikallinen ULA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Paikallinen verkkotunnus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "DHCP-nimiin ja hosts-tiedoston kohteisiin liitettävä paikallinen verkkotunnus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Paikallinen palvelin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Palvele vain paikallisesti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Lokalisoi kyselyt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Lukitse BSSID:hen" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Kirjaudu sisään" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Kirjautuminen…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Kirjaudu ulos" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Lokin tulostustaso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Lokikyselyt" @@ -4689,37 +5237,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "Looginen verkko, johon tunneli lisätään (sillataan) (valinnainen)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Kirjaudu sisään" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Kirjaudu ulos" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Signaalin menetys sekuntia (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Alin lainattu osoite verkko-osoitteesta laskettuna." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC-osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "MAC-osoitesuodatin" @@ -4727,16 +5266,15 @@ msgstr "MAC-osoitesuodatin" msgid "MAC Address For The Actor" msgstr "Toimijan MAC-osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4745,11 +5283,15 @@ msgstr "" msgid "MAC address" msgstr "MAC-osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC-suodatin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "MAC-luettelo" @@ -4763,6 +5305,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "MAP-sääntö on virheellinen" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4784,15 +5330,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "MII-väli" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4802,7 +5352,7 @@ msgstr "" "alla:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4811,78 +5361,86 @@ msgstr "" msgid "Manual" msgstr "Manuaalinen" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "Valmistaja" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Master" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Maks. Saavutettavissa oleva tiedonsiirtonopeus (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" " Max. DHCP laina" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" " Max. EDNS0 paketin koko" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr " Max. samanaikaiset kyselyt" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Enimmäisikä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Suurin sallittu kuunteluväli" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Aktiivisten DHCP-lainojen sallittu enimmäismäärä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Samanaikaisten DNS-kyselyiden suurin sallittu määrä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "EDNS.0 UDP -pakettien suurin sallittu koko" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Enimmäisaika sekunteina, jona odotetaan modeemin valmistumista" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Lainattujen osoitteiden enimmäismäärä." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Suurin lähetysteho" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4909,7 +5467,7 @@ msgstr "Muisti" msgid "Memory usage (%)" msgstr "Muistin käyttö (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -4917,10 +5475,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "Mesh ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Mesh ID" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Menetelmää ei löydy" @@ -4933,7 +5499,7 @@ msgstr "Linkkien seurantamenetelmä" msgid "Method to determine link status" msgstr "Linkin tilan määrittäminen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4944,11 +5510,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4956,13 +5522,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "Linkkien vähimmäismäärä" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4976,35 +5542,49 @@ msgstr "Peilauksen monitorointiportti" msgid "Mirror source port" msgstr "Peilauksen lähdeportti" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Mobiilidata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Liikkuvuusalue" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Tila" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Malli" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Modeemin yhteyden purkaminen käynnissä." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5012,43 +5592,36 @@ msgstr "" "Modeemiyhteyttä muodostetaan. Odota. Yritys aikakatkaistaan 2 minuutin " "kuluttua." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Modeemin oletus" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Modeemilaite" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Modeemiyhteyden katkaisu käynnissä. Odota." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Modeemitietojen kysely epäonnistui" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Modeemin aikakatkaisu" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "Modeemi on poistettu käytöstä." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "ModemManager" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Valvonta" @@ -5118,6 +5691,10 @@ msgstr "Siirrä alas" msgid "Move up" msgstr "Siirrä ylös" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5125,19 +5702,23 @@ msgstr "Siirrä ylös" msgid "Multicast" msgstr "Ryhmälähetys" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Ryhmälähetyksen reititys" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5149,12 +5730,16 @@ msgstr "NAT-T-tila" msgid "NAT64 Prefix" msgstr "NAT64-etuliite" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5167,18 +5752,23 @@ msgid "NTP server candidates" msgstr "NTP-palvelinehdokkaat" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Nimi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Uuden verkon nimi" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Siirtyminen" @@ -5187,13 +5777,17 @@ msgstr "Siirtyminen" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5202,32 +5796,36 @@ msgstr "" msgid "Network" msgstr "Verkko" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "Verkon SSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Verkon apuohjelmat" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "Verkon osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Verkon käynnistyskuva" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Verkkolaite" @@ -5240,7 +5838,7 @@ msgstr "Verkkolaitteiden toiminta (ydin: netdev)" msgid "Network device is not present" msgstr "Verkkolaitetta ei ole" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5249,7 +5847,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5258,15 +5856,20 @@ msgstr "" msgid "Network interface" msgstr "Sovitin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Ei ikinä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Ei koskaan" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5274,11 +5877,11 @@ msgstr "" "Paikallisen verkkotunnuksen määritys. Tätä verkkotunnusta vastaavia nimiä ei " "koskaan välitetä, ja ne ratkaistaan vain DHCP- tai isäntätiedostoista" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Uutta sovitinta \"%s\" ei voida luoda: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Uusi sovittimen nimi…" @@ -5286,13 +5889,13 @@ msgstr "Uusi sovittimen nimi…" msgid "Next »" msgstr "Seuraava »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Ei" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Tälle sovittimille ei ole määritetty DHCP-palvelinta" @@ -5300,7 +5903,7 @@ msgstr "Tälle sovittimille ei ole määritetty DHCP-palvelinta" msgid "No Data" msgstr "Ei tietoja" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Ei salausta" @@ -5316,9 +5919,17 @@ msgstr "Ei NAT-T:tä" msgid "No RX signal" msgstr "Ei RX-signaalia" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "WireGuard-sovittimia ei ole määritetty." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5329,7 +5940,11 @@ msgstr "" msgid "No client associated" msgstr "Ei asiakasta" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5338,8 +5953,8 @@ msgstr "" msgid "No data received" msgstr "Tietoja ei ole vastaanotettu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5352,15 +5967,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Tässä hakemistossa ei ole merkintöjä" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Tiedostoja ei löytynyt" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5374,7 +5985,7 @@ msgstr "" msgid "No host route" msgstr "Ei reittiä kohteelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5395,30 +6006,40 @@ msgstr "Enempää orjia ei ole saatavilla" msgid "No more slaves available, can not save interface" msgstr "Ei enempää orjia saatavilla, sovitinta ei voi tallentaa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Ei negatiivista välimuistia" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Salasanaa ei ole asetettu!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "Ei yhdistetty" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Julkisia avaimia ei ole vielä." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "Tässä ketjussa ei ole sääntöjä" @@ -5432,7 +6053,8 @@ msgid "No validation or filtering" msgstr "Ei tarkastusta tai suodatusta" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Vyöhykettä ei ole määritetty" @@ -5444,37 +6066,40 @@ msgstr "Vyöhykettä ei ole määritetty" msgid "Noise" msgstr "Kohina" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Kohinasuhde (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Kohina:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Keskeytyksettömät CRC-virheet (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Ei-yleismerkki" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Ei mikään" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normaali" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Ei löydy" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Liittymättä" @@ -5487,7 +6112,7 @@ msgstr "Ei yhdistetty" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "puuttuu" @@ -5499,7 +6124,7 @@ msgstr "Ei käynnistetty käynnistettäessä" msgid "Not supported" msgstr "Ei tuettu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5507,6 +6132,12 @@ msgstr "" "Huomautus: Jotkut langattomien verkkolaitteiden ajurit eivät täysin tue " "802.11w -standardia. Esim. mwlwifi -ajureilla voi esiintyä ongelmia" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Huomiot" @@ -5515,7 +6146,7 @@ msgstr "Huomiot" msgid "Notice" msgstr "Huomaa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5523,7 +6154,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "IGMP-jäsenraporttien määrä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "Välimuistissa olevien DNS-merkintöjen määrä (max on 10000, 0 poistaa " @@ -5542,7 +6173,7 @@ msgid "Obfuscated Password" msgstr "Häivytetty salasana" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5553,6 +6184,7 @@ msgid "Obtain IPv6 address" msgstr "Hae IPv6-osoite" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Pois" @@ -5561,6 +6193,12 @@ msgstr "Pois" msgid "Off-State Delay" msgstr "Alasmenon viive" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Päällä" @@ -5569,15 +6207,15 @@ msgstr "Päällä" msgid "On-State Delay" msgstr "Ylöstulon viive" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "Reitti aina ylhäällä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Palvelinnimi tai MAC-osoite on määritettävä!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Jokin seuraavista: %s" @@ -5595,7 +6233,11 @@ msgstr "Yksi tai useampi virheellinen / vaadittu arvo välilehdellä" msgid "One or more required fields have no value!" msgstr "Vähintään yhdellä pakollisella kentällä ei ole arvoa!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5606,49 +6248,60 @@ msgstr "" "Vain jos nykyinen aktiivinen orja epäonnistuu ja ensisijainen orja on päällä " "(vika, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Avaa lista..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Toimintataajuus" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "Vaihtoehto \"%s\" sisältää virheellisen arvon." @@ -5656,22 +6309,31 @@ msgstr "Vaihtoehto \"%s\" sisältää virheellisen arvon." msgid "Option \"%s\" must not be empty." msgstr "Vaihtoehto %s ei saa olla tyhjä." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Vaihtoehto muuttui" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Vaihtoehto poistettu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Valinnainen" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Valinnaiset, vapaamuotoiset huomiot tästä laitteesta" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5680,7 +6342,7 @@ msgstr "" "Valinnainen. Lähtevien salattujen pakettien 32-bittinen merkki. Anna arvo " "heksaina alkaen 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5692,7 +6354,7 @@ msgstr "" "delegoivalta palvelimelta, muodosta liite (kuten ':: 1') IPv6-osoitteen " "muodostamiseksi ('a:b:c:d::1 ') käyttöliittymälle." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5700,11 +6362,11 @@ msgstr "" "Valinnainen. Base64-koodattu esijaettu avain. Lisää ylimääräisen symmetrisen " "avaimen salauksen tason kvanttiresistenssiä varten." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Valinnainen. Luo reitit sallituille IP-reitit tälle vertaiskoneelle." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Valinnainen. Vertaiskoneen kuvaus." @@ -5712,7 +6374,7 @@ msgstr "Valinnainen. Vertaiskoneen kuvaus." msgid "Optional. Do not create host routes to peers." msgstr "Valinnainen. Älä luo isäntäreittejä vertaiskoneisiin." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." @@ -5720,7 +6382,7 @@ msgstr "" "Valinnainen. Vertaiskoneen isäntä. Nimet ratkaistaan ennen sovittimen " "aktivoimista." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5735,11 +6397,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Valinnainen. Tunnelisovittimen suurin siirtoyksikkö (MTU)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Valinnainen. Vertaiskoneen portti." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5747,7 +6409,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5763,7 +6425,7 @@ msgstr "Valinnainen. Lähtevien ja saapuvien pakettien UDP-portti." msgid "Options" msgstr "Valinnat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Polku CA-varmenteeseen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Polku asiakasvarmenteeseen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Polku yksityiseen avaimeen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Polku sisäiseen varmenteiden myöntäjän varmenteeseen (CA)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Polku sisäiseen asiakasvarmenteeseen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Polku sisäiseen yksityiseen avaimeen" @@ -6135,11 +6842,19 @@ msgstr "Keskeytetty" msgid "Peak:" msgstr "Huippu:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Vertaiskone" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Vertaiskoneelle määritettävä IP-osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "Vertaiskoneen MAC-osoite" @@ -6148,11 +6863,11 @@ msgstr "Vertaiskoneen MAC-osoite" msgid "Peer address is missing" msgstr "Vertaisosoite puuttuu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Vertaislaitteen nimi" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Vertainen poistettu käytöstä" @@ -6183,10 +6898,14 @@ msgstr "Suorita nollaus" msgid "Permission denied" msgstr "Lupa evätty" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Persistent Keep Alive" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6195,13 +6914,13 @@ msgstr "" msgid "Phy Rate:" msgstr "Fyys. nopeus:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Fyysiset asetukset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Latenssi" @@ -6214,11 +6933,11 @@ msgstr "Latenssi" msgid "Pkts." msgstr "Paket." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Anna käyttäjätunnus ja salasana." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Valitse ladattava tiedosto." @@ -6226,58 +6945,76 @@ msgstr "Valitse ladattava tiedosto." msgid "Policy" msgstr "Käytäntö" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "Käytäntö: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Portti" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Portti %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "Portti ei ole osa yhtäkään verkkoa" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Portin eristys" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "Portin tila" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Portin tila:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Mahdollinen kieltäytyminen:%s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Virranhallintatila" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Keskeyttävät CRC-virheet (CRC_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Mieluummin LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Mieluummin UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Delegoitu etuliite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Esijaettu avain" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" -msgstr "" +msgstr "Esijaettu avain käytössä" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:308 msgid "PresharedKey setting is invalid" @@ -6300,15 +7037,16 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Estää asiakaiden välisen viestinnän" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Ensisijainen orja" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "Ensisijainen VLAN:in ID" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6323,29 +7061,31 @@ msgstr "" "Ensisijainen tulee aktiiviseksi orjaksi heti palautuessaan käyttökelpoiseksi " "(aina, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Prioriteetti" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "Yksityinen (Estä kommunikointi MAC VLAN:ien välillä)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Yksityinen avain" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6363,8 +7103,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6376,13 +7116,13 @@ msgstr "Protokolla" msgid "Provide NTP server" msgstr "Tarjoa NTP-palvelin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Tarjoa uusi verkko" @@ -6392,25 +7132,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Välityspalvelin" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo-ad-hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Julkinen avain" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" -msgstr "" +msgstr "Julkinen avain puuttuu" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" -msgstr "" +msgstr "Julkinen avain: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6440,61 +7191,85 @@ msgstr "QMI Cellular" msgid "Quality" msgstr "Laatu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" "Käytä kaikkia määriteltyjäDNS -" "palvelimia kyselyihin" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "R0-avaimen ikä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "R1-avainhaltija" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "RADIUS-tilastoinnin portti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "RADIUS-tilastoinnin salaisuus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "RADIUS-tilastoinnin palvelin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "RADIUS-tunnistuksen portti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "RADIUS-tunnistuksen salaisuus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "RADIUS-tunnistuksen palvelin" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "RFC3947 NAT-T -tila" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "RSSI-liittymiskynnys" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "RTS/CTS-kynnysarvo" @@ -6507,10 +7282,16 @@ msgstr "RX" msgid "RX Rate" msgstr "RX-nopeus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "RX-nopeus / TX-nopeus" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6522,11 +7303,11 @@ msgstr "" "Raa'at heksakoodatut tavut. Jätä tyhjäksi, ellei palveluntarjoajasi vaadi " "tätä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Lue /etc/ethers määrittääksesi DHCP-palvelin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Haluatko varmasti vaihtaa protokollaa?" @@ -6534,11 +7315,11 @@ msgstr "Haluatko varmasti vaihtaa protokollaa?" msgid "Realtime Graphs" msgstr "Reaaliaikaiset kaaviot" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Uudelleenyhdistämisen määräaika" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Rebind-suoja" @@ -6562,11 +7343,40 @@ msgstr "Käynnistää laitteen käyttöjärjestelmän uudelleen" msgid "Receive" msgstr "Vastaanottaa" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Vastaanottaa" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Suositeltava. WireGuard-liitynnän IP-osoitteet." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Yhdistä tämä sovitin uudelleen" @@ -6574,12 +7384,12 @@ msgstr "Yhdistä tämä sovitin uudelleen" msgid "Redirect to HTTPS" msgstr "Uudelleenohjaa HTTPS:ään" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "Uudelleenohjaa paikalliseen porttiin %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "Uudelleenohjaa paikalliseen järjestelmään" @@ -6588,37 +7398,47 @@ msgstr "Uudelleenohjaa paikalliseen järjestelmään" msgid "References" msgstr "Viite" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Päivittää" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "Hylkää IPv4-paketti ICMP-tyypillä %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "Hylkää paketti ICMP-tyypillä %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "Hylkää paketti ICMPv6-tyypillä %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Välitys" @@ -6628,6 +7448,10 @@ msgstr "Välitys" msgid "Relay Bridge" msgstr "Välityssilta" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Välitä verkkojen välillä" @@ -6637,6 +7461,14 @@ msgstr "Välitä verkkojen välillä" msgid "Relay bridge" msgstr "Välityssilta" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6646,6 +7478,7 @@ msgstr "IPv4-etäosoite" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "IPv4-etäosoite tai FQDN" @@ -6658,15 +7491,23 @@ msgstr "IPv6-etäosoite" msgid "Remote IPv6 address or FQDN" msgstr "Etäpään IPv6-osoite tai FQDN-nimi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Poista" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Korvaa langattoman verkon määritys" @@ -6696,7 +7537,8 @@ msgstr "Vaadi tarkistussumma tulevalta liikenteeltä." msgid "Require incoming packets serialization (optional)." msgstr "Vaadi tulevien pakettien sarjoitus." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Vaaditaan" @@ -6713,7 +7555,7 @@ msgstr "Tarvitaan. Tämän liittymän Base64-koodattu yksityinen avain." msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6725,67 +7567,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Vaatii hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Vaatii hostapd EAP Suite-B -tuella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Vaatii hostapd-sovelluksen EAP-tuella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Vaatii hostapd-sovelluksen OWE-tuella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Vaatii hostapd-sovelluksen SAE-tuella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Vaatii hostapd:n WEP-tuella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Vaatii wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Vaatii wpa-supplicant EAP Suite-B -tuella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Vaatii wpa-supplicantin EAP-tuella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Vaatii wpa-supplicantin OWE-tuella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Vaatii wpa-supplicantin SAE-tuella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Vaatii wpa-supplicantin WEP-tuella" @@ -6794,7 +7642,7 @@ msgid "Reselection policy for primary slave" msgstr "Ensisijaisen orjan uudelleenvalintakäytäntö" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6809,20 +7657,24 @@ msgstr "Nollaa laskurit" msgid "Reset to defaults" msgstr "Palauta oletusasetuksiin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Resolv- ja Hosts-tiedostot" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Resolve-tiedosto" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Lista verkkoalueista sekä käytettävistä IP-osoitteista." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Resurssia ei löytynyt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Käynnistä uudelleen" @@ -6831,7 +7683,7 @@ msgstr "Käynnistä uudelleen" msgid "Restart Firewall" msgstr "Käynnistä palomuuri uudelleen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Käynnistä radioliityntä uudelleen" @@ -6843,7 +7695,7 @@ msgstr "Palauta" msgid "Restore backup" msgstr "Palauta varmuuskopio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -6851,80 +7703,91 @@ msgstr "" "Lokalisoi nimi pyynnön esittäneen aliverkon mukaan, jos käytettävissä on " "useita IP-osoitteita" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Paljasta/piilota salasana" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Palauta" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Palauta muutokset" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "Palautuspyyntö epäonnistui, tila %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Palautetaan määritystä…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6939,19 +7802,19 @@ msgstr "Juuren valmistelu" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Round-Robin -käytäntö (painotettu-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Reititä sallitut IP:t" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Reitin tyyppi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6969,6 +7832,10 @@ msgstr "Reitittimen salasana" msgid "Routing" msgstr "Reititys" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Reititysalgoritmi" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6983,24 +7850,24 @@ msgstr "" msgid "Rule" msgstr "Sääntö" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "Säännön toiminnot" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "Säännön kommentti: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Säännön tyyppi" @@ -7020,11 +7887,24 @@ msgstr "Suorituksenaikainen virhe" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7042,15 +7922,15 @@ msgstr "SSH-palvelimen portti" msgid "SSH username" msgstr "SSH-käyttäjätunnus" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH-avaimet" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7067,7 +7947,7 @@ msgstr "SSTP-palvelin" msgid "SWAP" msgstr "Välimuisti" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7078,7 +7958,7 @@ msgid "Save" msgstr "Tallenna" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Tallenna ja käytä" @@ -7095,7 +7975,7 @@ msgstr "Tallenna mtdblock" msgid "Save mtdblock contents" msgstr "Tallenna mtdblockin sisältö" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Etsi" @@ -7104,11 +7984,16 @@ msgstr "Etsi" msgid "Scheduled Tasks" msgstr "Ajoitetut tehtävät" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Osa lisätty" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Osa poistettu" @@ -7126,9 +8011,9 @@ msgstr "" "tarkistus epäonnistuu. Käytä tätä vain, jos olet varma, että laiteohjelmisto " "on oikea ja tarkoitettu laitteellesi!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Valitse tiedosto…" @@ -7136,7 +8021,7 @@ msgstr "Valitse tiedosto…" msgid "Selects the transmit hash policy to use for slave selection" msgstr "Valitsee orja-valinnassa käytettävän lähetyshajautuskäytännön" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7144,7 +8029,7 @@ msgstr "" "Lähetä RA-" "viestejä mainostaen tätä laitetta IPv6-reitittimenä." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "Lähetä ICMP-uudelleenohjauksia" @@ -7165,11 +8050,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "Lähetä tämän laitteen nimi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Palvelin" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Palvelimen osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Palvelimen nimi" @@ -7194,16 +8083,20 @@ msgstr "Istunto on vanhentunut" msgid "Set Static" msgstr "Aseta staattinen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7213,14 +8106,14 @@ msgstr "Määritä sovittimen ominaisuudet linkin tilasta riippumatta." msgid "Set same MAC Address to all slaves" msgstr "Aseta sama MAC-osoite kaikille orjille" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7234,11 +8127,15 @@ msgstr "Aseta aktiiviseen orjaan (aktiivinen, 1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "Aseta ensimmäiseen orjaan sidoksessa (seuraa, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Määritä DHCP-palvelin" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7246,33 +8143,37 @@ msgid "Setting PLMN failed" msgstr "PLMN:n asettaminen epäonnistui" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "Toimintatilan asettaminen epäonnistui" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Asetukset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "Severely Errored Seconds (SES)" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "Lyhyt GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Lyhyt johdanto-osa" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Näytä nykyinen varmuuskopiotiedostoluettelo" @@ -7285,16 +8186,16 @@ msgstr "Näytä tyhjät ketjut" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Sulje tämä sovitin" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7302,15 +8203,15 @@ msgstr "Sulje tämä sovitin" msgid "Signal" msgstr "Signaali" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Signaali / Kohina" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Signaalin vaimennus (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Signaalin laatu" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Signaalin virkistysnopeus" @@ -7318,12 +8219,12 @@ msgstr "Signaalin virkistysnopeus" msgid "Signal:" msgstr "Signaali:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Koko" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "DNS-kyselyvälimuistin koko" @@ -7340,12 +8241,12 @@ msgstr "Ohita" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Siirry sisältöön" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Siirry navigointiin" @@ -7363,14 +8264,10 @@ msgstr "Ohjelmisto-VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "Jotkin kentät eivät kelpaa, arvoja ei voi tallentaa!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Pahus, pyytämääsi objektia ei löytynyt." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Pahus, palvelin kohtasi odottamattoman virheen." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7380,8 +8277,8 @@ msgstr "" "Valitettavasti sysupgrade-tukea ei ole; uusi laiteohjelmiston kuva on " "asennetava käsin. Katso laitekohtaiset asennusohjeet wikistä." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7408,7 +8305,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "Lähdeportti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7416,20 +8313,20 @@ msgstr "" "Erikoiset PXE-" "käynnistysvalinnat Dnsmasqille." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7456,7 +8353,7 @@ msgstr "Määrittää IP-osoitteet, joita käytetään ARP-seurantaan" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "Määrittää ARP-linkin valvontatiheyden millisekunnina" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7464,7 +8361,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "Määrittää käytettävän yhdistelmän valintalogiikan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7472,20 +8369,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "Määrittää hakemiston, johon laite on liitetty" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7518,7 +8415,7 @@ msgid "" msgstr "" "Määrittää ajan sekunteina, joiden jälkeen isäntien oletetaan olevan kuolleita" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7540,7 +8437,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "Määrittää tilan, jota käytetään tähän sidontasovittimeen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7580,15 +8477,15 @@ msgstr "" "Määrittää sekunteina aikavälin, jolloin yhdistävä ohjain lähettää " "oppimispaketit jokaiselle slave-vertaiskytkimelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7614,19 +8511,19 @@ msgstr "" "Määrittää ensisijaisen orjan uudelleenvalintakäytännön, kun aktiivinen orja " "epäonnistuu tai ensisijainen orja palautetaan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "Määrittää luotavan reitin tyypin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7650,7 +8547,7 @@ msgstr "" "Määrittää millisekuntina odotettavan ajan linkin palautumisen havaitsemisen " "jälkeen ennen kuin orja otetaan käyttöön" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7765,15 +8662,23 @@ msgid "" "bytes)." msgstr "Määritä muu MTU (suurin siirtoyksikkö) kuin oletusarvo (1280 tavua)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Määritä salainen salausavain tähän." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Aloita" @@ -7786,16 +8691,16 @@ msgstr "Aloita WPS" msgid "Start priority" msgstr "Aloitusprioriteetti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Aloita päivitys" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Aloitetaan määrityksen käyttöönotto…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Aloitetaan langattoman verkon etsintä..." @@ -7804,6 +8709,10 @@ msgstr "Aloitetaan langattoman verkon etsintä..." msgid "Startup" msgstr "Käynnistys" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Pysyvät IPv4-reitit" @@ -7817,7 +8726,7 @@ msgstr "Pysyvät IPv6-reitit" msgid "Static Lease" msgstr "Pysyvä laina" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Pysyvät lainat" @@ -7827,7 +8736,7 @@ msgstr "Pysyvät lainat" msgid "Static address" msgstr "Staattinen osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7836,18 +8745,18 @@ msgstr "" "Staattisia lainoja käytetään kiinteiden IP-osoitteiden ja symbolisten nimien " "määrittämiseen DHCP-asiakkaille." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Aseman käyttämättömyysraja" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Tila" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Pysäytä" @@ -7856,8 +8765,8 @@ msgstr "Pysäytä" msgid "Stop WPS" msgstr "Lopeta WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Lopeta päivitys" @@ -7865,11 +8774,11 @@ msgstr "Lopeta päivitys" msgid "Storage" msgstr "Tallennustila" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "Tiukka suodatus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Tiukka järjestys" @@ -7878,15 +8787,15 @@ msgid "Strong" msgstr "Vahva" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Lähetä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Estä kirjaaminen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "Estä näiden protokollien rutiinitoimintojen kirjaaminen" @@ -7918,7 +8827,7 @@ msgstr "Kytkimen VLAN" msgid "Switch port" msgstr "Kytkimen portti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Kytkinprotokolla" @@ -7928,7 +8837,7 @@ msgstr "Kytkinprotokolla" msgid "Switch to CIDR list notation" msgstr "Vaihda CIDR-luettelomerkintään" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Symbolinen linkki" @@ -7940,8 +8849,16 @@ msgstr "Synkronoi NTP-palvelimen kanssa" msgid "Sync with browser" msgstr "Synkronoi selaimen kanssa" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7965,9 +8882,9 @@ msgstr "Järjestelmän ominaisuudet" msgid "System log buffer size" msgstr "Järjestelmälokin puskurin koko" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "Järjestelmä toimii palautustilassa (initramfs)." @@ -7996,7 +8913,7 @@ msgstr "TCP-lähdeportti" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "TFTP-palvelimen pääkansio" @@ -8009,26 +8926,37 @@ msgstr "TX" msgid "TX Rate" msgstr "TX-nopeus" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "TX-jonon pituus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Taulukko" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Kohde" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "Kohdealusta" @@ -8044,7 +8972,7 @@ msgstr "Väliaikainen tila" msgid "Terminate" msgstr "Lopeta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8054,19 +8982,19 @@ msgstr "" "julkaistava MTU. Pienin " "mahdollinen on 1280 tavua." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8082,7 +9010,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8096,18 +9028,24 @@ msgstr "" "HE.net-päätepisteen määritys on muuttunut, sinun on nyt käytettävä " "käyttäjätunnusta käyttäjä-ID:n sijaan!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "IP-osoite %h on jo toisen pysyvän lainan käytössä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "IP-osoite ei ole minkään DHCP-varannon osoitealueen sisällä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "Etäpään IPv4-osoite tai täysin kelvollinen verkkotunnus." @@ -8115,6 +9053,7 @@ msgstr "Etäpään IPv4-osoite tai täysin kelvollinen verkkotunnus." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "Tunnelin etäpään IPv4-osoite tai täysin pätevä verkkotunnus." @@ -8129,6 +9068,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "Etäpään IPv6 osoite tai sen täydellinen verkkonimi." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8141,7 +9086,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -8158,7 +9103,7 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" @@ -8166,15 +9111,19 @@ msgstr "" "MAC-osoite %h on jo käytössä toisessa staattisessa lainassa samassa DHCP-" "varannossa" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "VLAN:in ID:n tulee olla yksilöllinen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8186,7 +9135,7 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "Määritystiedostoa ei voitu ladata seuraavan virheen vuoksi:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8194,7 +9143,7 @@ msgstr "" "Oikea SSID täytyy määritellä käsin, kun liitytään piilotettuun langattomaan " "verkkoon" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8220,19 +9169,19 @@ msgstr "" "Laitetiedosto muistiin tai osioon ( esim. /dev/sda1 )" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "Laitenimi \"%s\" on jo käytössä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" "Olemassa olevaa verkkokokoonpanoa tulee muuttaa, jotta LuCI toimii oikein." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8253,7 +9202,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Seuraavat säännöt ovat tällä hetkellä käytössä tässä järjestelmässä." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -8261,17 +9210,17 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "Yhdyskäytävän osoite ei saa olla paikallinen IP-osoite" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "Annettu julkinen SSH-avain on jo lisätty." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8279,15 +9228,31 @@ msgstr "" "Annettu julkinen SSH-avain ei kelpaa. Anna kelvollinen julkinen RSA-, " "ED25519- tai ECDSA-avain." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "Sovitinta ei löytynyt" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Sovittimen nimi on jo käytössä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Sovittimen nimi on liian pitkä" @@ -8310,6 +9275,7 @@ msgstr "Paikallinen IPv4-osoite" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "Paikallinen IPv4-osoite, jolle tunneli luodaan (valinnainen)." @@ -8324,7 +9290,7 @@ msgstr "Paikallinen IPv4-verkkomaski" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "Paikallinen IPv6-osoite, jonka yli tunneli luodaan (valinnainen)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8333,7 +9299,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8341,7 +9307,7 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8349,13 +9315,13 @@ msgstr "" "RA-viesteissä julkaistava " "hyppyjen enimmäismäärä. Suurin mahdollinen on 255 hyppyä." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Verkon nimi on jo käytössä" @@ -8375,14 +9341,14 @@ msgstr "" "toisistaan. Usein määritetään yksi portti yhteyden suurempaan verkkoon, " "kuten Internet ja muut portit lähiverkoon." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8395,31 +9361,31 @@ msgstr "Uudelleenkäynnistyskomento epäonnistui, koodi %d" msgid "The restore command failed with code %d" msgstr "Palautuskomento epäonnistui koodilla %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "Valittu %s tila ei ole yhteensopiva salauksen %s kanssa" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "Lähetetty suojaustunnus on virheellinen tai vanhentunut!" @@ -8459,6 +9425,14 @@ msgstr "Järjestelmän salasana on vaihdettu onnistuneesti." msgid "The sysupgrade command failed with code %d" msgstr "Sysupgrade-komento epäonnistui koodilla %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8485,30 +9459,37 @@ msgstr "" "Ladattu tiedosto ei ole laitteesi tukemassa muodossa. Varmista, että käytät " "laitteeseesi soveltuvaa yleistä tiedostomuotoa." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "Arvo ohitetaan kokoonpanon toimesta. Alkuperäinen: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "Arvo ohitetaan kokoonpanon toimesta." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Aktiivisia lainoja ei ole" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Ei muutoksia käyttöönotettavaksi" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8521,16 +9502,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "Välittäjän IP-osoite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Tätä todennustyyppiä ei voida soveltaa valittuun EAP-menetelmään." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Tämä ei näytä kelvolliselta PEM-tiedostolta" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8548,6 +9529,17 @@ msgstr "" "Tämä on joko tunnelille määritetty Päivitysavain tai tilin salasana, jos " "päivitysavainta ei ole määritetty" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8565,7 +9557,7 @@ msgstr "" "Tämä on tunnelin välittäjän määrittämä paikallinen päätepisteosoite, joka " "päättyy yleensä ... :2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "Tämä on paikallisen verkon ainoa DHCP-palvelin." @@ -8597,8 +9589,8 @@ msgstr "" "Tässä luettelossa on yleiskatsaus käynnissä olevista järjestelmäprosesseista " "ja niiden tilasta." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8614,31 +9606,39 @@ msgstr "Tässä osassa ei ole vielä arvoja" msgid "Time Synchronization" msgstr "Ajan synkronointi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "Aika millisekunneissa" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Aikaväli GTK:n uusimiseen" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Aikavyöhyke" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "Aikaraja täyttyi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "Aikakatkaisu sekunneissa" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8646,17 +9646,13 @@ msgstr "" msgid "Timezone" msgstr "Aikavyöhyke" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Kirjautuminen…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8667,7 +9663,7 @@ msgstr "" "Voit palauttaa laiteohjelmiston alkuperäiseen tilaan napsauttamalla " "\"Suorita nollaus\" (mahdollista vain squashfs-kuvissa)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Sävy" @@ -8675,12 +9671,16 @@ msgstr "Sävy" msgid "Total Available" msgstr "Käytettävissä yhteensä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8692,11 +9692,11 @@ msgstr "Liikenne" msgid "Traffic Class" msgstr "Liikenneluokka" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8713,6 +9713,27 @@ msgstr "Lähetä" msgid "Transmit Hash Policy" msgstr "Lähetyksen hajautuskäytäntö" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Dataa lähetetty" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8751,7 +9772,7 @@ msgstr "Tunnelisovitin" msgid "Tunnel Link" msgstr "Tunnelin linkki" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Tunnelin laite" @@ -8760,13 +9781,13 @@ msgid "Tx-Power" msgstr "Tx-teho" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Tyyppi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Palvelun tyyppi" @@ -8815,13 +9836,13 @@ msgstr "Ulkoista IP-osoitetta ei voitu selvittää" msgid "Unable to determine upstream interface" msgstr "Ylävirran sovitinta ei voitu selvittää" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Ei voida lähettää" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:85 msgid "Unable to generate QR code: %s" -msgstr "" +msgstr "QR-koodia ei voi luoda: %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:9 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:15 @@ -8866,19 +9887,31 @@ msgstr "Palomuuria ei voi käynnistää uudelleen: %s" msgid "Unable to save contents: %s" msgstr "Sisältöä ei voi tallentaa: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Saavuttamattomissa (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "PIN-koodia ei voi vahvistaa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Odottamaton vastaustietojen muoto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8892,7 +9925,7 @@ msgstr "" msgid "Unknown" msgstr "Tuntematon" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Tuntematon ja ei-tuettu yhteysmenetelmä." @@ -8916,11 +9949,11 @@ msgstr "Hallitsematon" msgid "Unmount" msgstr "Irroita" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Nimeämätön avain" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Tallentamattomia muutoksia" @@ -8934,15 +9967,25 @@ msgid "Unsupported MAP type" msgstr "MAP-tyyppiä ei tueta" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Modeemia ei tueta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Protokollatyyppiä ei tueta." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8954,7 +9997,7 @@ msgstr "Ylhäällä" msgid "Up Delay" msgstr "Viivästys" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Lähetys" @@ -8971,25 +10014,29 @@ msgstr "" msgid "Upload archive..." msgstr "Lähetä arkisto..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Lähetä tiedosto" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Lähetä tiedosto…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Lähetyspyyntö epäonnistui:% s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Lähetetään tiedostoa…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -8999,33 +10046,37 @@ msgstr "" "muodossa wifinet# ja verkko käynnistetään uudelleen määrityksen " "käyttönottamiseksi." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" " DNS -palvelimet " "kysytään resolvfile-järjestyksessä" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Toiminta-aika" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Käytä /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Käytä DHCP:tä" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Käytä DHCP-mainostettuja palvelimia" @@ -9034,13 +10085,18 @@ msgstr "Käytä DHCP-mainostettuja palvelimia" msgid "Use DHCP gateway" msgstr "Käytä DHCP-yhdyskäytävää" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Käytä DHCPv6:tta" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Vertaiskoneen mainostamien DNS-palvelimien käyttäminen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Käytä ISO/IEC 3166 alpha2 -maakoodeja." @@ -9088,22 +10144,25 @@ msgstr "Käytä juuritiedostojärjestelmänä (/)" msgid "Use broadcast flag" msgstr "Käytä lähetyslippua" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Käytä sisäistä IPv6-hallintaa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Käytä mukautettuja DNS-palvelimia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Käytä oletusyhdyskäytävää" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Käytä yhdyskäytävän mittaria" @@ -9127,15 +10186,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "Käytä samaa lähdettä ja kohdetta jokaiselle yhteydelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Käytä järjestelmävarmenteita" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "Käytä järjestelmävarmenteita sisätunneliin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9166,11 +10225,11 @@ msgstr "" msgid "Used" msgstr "Käytetty" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Käytetty avainpaikka" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9178,59 +10237,61 @@ msgstr "" "Käytetään kahteen eri tarkoitukseen: RADIUS NAS ID ja 802.11r R0KH-ID. Ei " "tarvita normaalilla WPA(2)-PSK:lla." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Käyttäjäryhmä" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Käyttäjäsertifikaatti (PEM-koodattu)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "Käyttäjätunniste" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Käyttäjäavain (PEM-koodattu)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Käyttäjätunnus" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "VLAN:in ID" @@ -9250,24 +10311,27 @@ msgstr "VPN:n paikallinen osoite" msgid "VPN Local port" msgstr "VPN:n paikallinen portti" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "VPN-protokolla" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPN-palvelin" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "VPN-palvelimen varmenteen SHA256-tiiviste" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "VPN-palvelimen portti" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "VPN-palvelimen sertifikaatin SHA1-tarkiste" @@ -9276,6 +10340,10 @@ msgstr "VPN-palvelimen sertifikaatin SHA1-tarkiste" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (ja muut) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9289,7 +10357,7 @@ msgstr "VXLAN-verkon tunnus" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9297,8 +10365,8 @@ msgstr "" "Vaatii tukea DNSSEC prokollalle; vahvista että allekirjoittamattomat " "toimialuevastaukset todella tulevat allekirjoittamattomista toimialueista" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9326,7 +10394,7 @@ msgstr "Toimittaja" msgid "Vendor Class to send when requesting DHCP" msgstr "Toimittajaluokka, joka lähetetään DHCP-pyynnössä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9334,12 +10402,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Tarkistetaan ladattua tiedostoa." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Erittäin korkea" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9347,34 +10415,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "Virtuaalinen dynaaminen sovitin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "WEP Avoin järjestelmä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "WEP Jaettu avain" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "WEP-tunnuslause" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "WMM-tila" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "WPA-salasana" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9404,19 +10484,61 @@ msgstr "" msgid "Weak" msgstr "Heikko" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9426,7 +10548,7 @@ msgstr "" "avainasetuksia ei oteta käyttöön. Poista tämä käytöstä, jos haluat käyttää " "R0- ja R1-asetuksia." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9435,7 +10557,7 @@ msgstr "" "(QoS) on pois käytöstä, asiakaslaitteiden nopeudet voivat rajoittua " "802.11a/802.11g mukaisiin nopeuksiin." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9445,16 +10567,25 @@ msgstr "" "merkittävästi." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Leveys" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "WireGuardin tila" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9470,21 +10601,21 @@ msgid "Wireless Adapter" msgstr "Langaton sovitin" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Langaton verkko" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Langattoman yleiskatsaus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Langattoman suojaus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Langattoman verkon asetusten migraatio" @@ -9500,15 +10631,15 @@ msgstr "Langaton on poistettu käytöstä" msgid "Wireless is not associated" msgstr "Langaton liittymättä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Langaton verkko on poistettu käytöstä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Langaton verkko on käytössä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Kirjoita vastaanotetut DNS-pyynnöt syslogiin." @@ -9520,7 +10651,7 @@ msgstr "Kirjoita järjestelmäloki tiedostoon" msgid "XOR policy (balance-xor, 2)" msgstr "XOR-käytäntö (tasapaino-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9549,8 +10680,20 @@ msgstr "" " Varoitus: Jos poistat käytöstä välttämättömät aloituskomentosarjat, " "kuten \"verkko\", saatat kadottaa pääsyn laitteeseesi! " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9581,34 +10724,54 @@ msgstr "ZRam-asetukset" msgid "ZRam Size" msgstr "ZRam-koko" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "mikä tahansa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automaattinen" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automaattinen (ei käytössä)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automaattinen (käytössä)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "sillattu" @@ -9665,25 +10828,30 @@ msgctxt "nft unit" msgid "day" msgstr "päivä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "Poista käytöstä" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "pois käytöstä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "ohjaimen oletusasetus" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "esim: --proxy 10.10.10.10" @@ -9692,14 +10860,23 @@ msgstr "esim: --proxy 10.10.10.10" msgid "e.g: dump" msgstr "esim. dump" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "käytössä" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "vanhentunut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "pakotettu" @@ -9709,22 +10886,22 @@ msgstr "pakotettu" msgid "forward" msgstr "välitä" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "kaksisuuntainen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "yksisuuntainen" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "heksadesimaalinen koodattu arvo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "piilotettu" @@ -9733,9 +10910,9 @@ msgctxt "nft unit" msgid "hour" msgstr "tunti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "hybridi-tila" @@ -9743,6 +10920,10 @@ msgstr "hybridi-tila" msgid "ignore" msgstr "ohita" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9757,11 +10938,19 @@ msgstr "8 - 63 merkkiä pitkä avain" msgid "key with either 5 or 13 characters" msgstr "5 tai 13 merkkiä pitkä avain" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "keskitason turvallisuus" @@ -9770,11 +10959,11 @@ msgctxt "nft unit" msgid "minute" msgstr "minuutti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minuuttia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9786,18 +10975,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "ei" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "ei linkkiä" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "ei-tyhjä arvo" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "ei mitään" @@ -9808,20 +11005,20 @@ msgid "not present" msgstr "puuttuu" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "pois" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "avoin verkko" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9830,6 +11027,10 @@ msgstr "" msgid "output" msgstr "lähtö" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "yli päivä sitten" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9847,23 +11048,32 @@ msgstr "positiivinen kokonaisluku" msgid "random" msgstr "satunnainen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "välitystila" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "reititetty" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "sek." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "palvelintila" @@ -9871,7 +11081,7 @@ msgstr "palvelintila" msgid "sstpc Log-level" msgstr "sstpc-lokitaso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "vahva turvallisuus" @@ -9879,7 +11089,7 @@ msgstr "vahva turvallisuus" msgid "tagged" msgstr "merkitty" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "aikayksiköt (tus / 1.024 ms) [1000-65535]" @@ -9893,25 +11103,27 @@ msgstr "" "Protocol\">HTTP:llä
    tai HTTPS:llä." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "ainutlaatuinen arvo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "tuntematon" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "tuntematon versio" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "rajoittamaton" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9933,8 +11145,8 @@ msgid "untagged" msgstr "merkitön" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "kelvollinen IP-osoite" @@ -9947,7 +11159,7 @@ msgid "valid IPv4 CIDR" msgstr "kelvollinen IPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "kelvollinen IPv4-osoite" @@ -9976,7 +11188,7 @@ msgid "valid IPv6 CIDR" msgstr "kelvollinen IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "kelvollinen IPv6-osoite" @@ -10013,8 +11225,8 @@ msgstr "kelvollinen UCI-tunniste, isäntänimi tai IP-osoite" msgid "valid address:port" msgstr "kelvollinen osoite:portti" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "kelvollinen päivämäärä (VVVV-KK-PP)" @@ -10054,11 +11266,21 @@ msgstr "kelvollinen kokonaisluku" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "kelvollinen verkko osoite / verkkomaskin merkintä" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "kelvollinen puhelinnumero (0-9, \"*\", \"#\", \"!\" tai \".\")" @@ -10068,43 +11290,43 @@ msgid "valid port or port range (port1-port2)" msgstr "kelvollinen portti tai porttialue (portti1-portti2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "kelvollinen portin arvo" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "kelvollinen aika (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "arvo välillä %d - %d merkkiä" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "arvo välillä %f ja %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "suurempi tai yhtä suuri kuin %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "pienempi tai yhtä suuri kuin %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "arvo, jossa on %d merkkiä" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "arvo, jossa on vähintään %d merkkiä" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "arvo, jossa on enintään %d merkkiä" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "heikko turvallisuus" diff --git a/package/luci/modules/luci-base/po/fr/base.po b/package/luci/modules/luci-base/po/fr/base.po index 38df77803b..6be50757fb 100644 --- a/package/luci/modules/luci-base/po/fr/base.po +++ b/package/luci/modules/luci-base/po/fr/base.po @@ -3,34 +3,50 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:40+0200\n" -"PO-Revision-Date: 2022-07-31 13:17+0000\n" -"Last-Translator: Christophe Blancon \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "!known (inconnu)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" table \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d champs invalides" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%dh passée" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%dm passée" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%ds passée" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s est non-taggué dans plusieurs VLANs !" @@ -55,10 +71,11 @@ msgstr "(vide)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(pas d'interface connectée)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d plus" @@ -68,19 +85,19 @@ msgid "-- Additional Field --" msgstr "-- Champ Supplémentaire --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Veuillez choisir --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- personnalisé --" @@ -106,7 +123,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = ne pas utiliser le seuil RSSI, 1 = ne pas changer la valeur par défaut " @@ -121,13 +138,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Charge sur 1 minute :" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "1 drapeau" msgstr[1] "%d drapeaux" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12h (12 heures - par défaut)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "Charge sur 15 minutes :" @@ -142,12 +164,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3h ( 3 heures)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "Identifiant sur 4 caractères hexadécimaux" @@ -160,46 +187,108 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Charge sur 5 minutes :" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5m (5 minutes)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "Identifiant hexadécimal sur 6 octets (sans ':')" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7d (7 jours)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "RRM 802.11k" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k : Activation du rapport sur les balises via les mesures radio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k : Activer le rapport voisin par des mesures radio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "Transition rapide 802.11r" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v : BSS max inactif. Unités : secondes." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" +"802.11v : gestion de la transition de l'ensemble de services de base (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v : annonce du fuseau horaire local dans les trames de gestion." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v : Proxy ARP permet à la STA non-AP de rester en mode d'économie " +"d'énergie plus longtemps." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v : Annonce de temps dans les cadres de gestion." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v : mode veille de gestion de réseau sans fil (WNM) (mode veille " +"étendu pour les stations)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v : Correctifs du mode veille de la gestion de réseau sans fil (WNM) : " +"empêche les attaques de réinstallation." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "Délai maximum d'association pour 802.11w (SA Query)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" "Délai d'attente avant nouvelle tentative d'association (SA Query) pour " "802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "Protection des trames de management pour 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "Délai d’expiration maximal de 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "Délai d'attente avant nouvelle tentative pour 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "Masque réseau IPv4" @@ -212,32 +301,48 @@ msgstr "" msgid "LED Name" msgstr "Nom de la DEL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" -msgstr "Proxy NDP" +msgstr "NDP-Proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "Indicateurs RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "Limite de saut RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "Durée de vie RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" "Unité de Transmission Maximale (MTU) RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "Service RA" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ correspond à tout domaine. /example.com/ " +"returns NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# renvoie des adresses NULL (0.0.0.0 " +"et  : :) pour example.com et ses sous-domaines." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -283,11 +388,24 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s pas dans l’ensemble %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"Un nœud batman-adv peut fonctionner soit en mode serveur (partageant sa " +"connexion internet avec le réseau maillé), soit en mode client (recherchant " +"la connexion internet la plus appropriée dans le réseau maillé), soit en " +"ayant le support de la passerelle entièrement désactivé (ce qui est le " +"paramètre par défaut)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Une configuration pour l'appareil \"%s\" existe déjà" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Un dossier avec le même nom existe déjà." @@ -296,25 +414,90 @@ msgid "A new login is required since the authentication session expired." msgstr "" "Il est nécessaire de s'authentifier de nouveau car la session a expiré." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annexe A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annexe B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (toutes variantes) Annexes A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (toutes variantes) Annexes A/L/M + VDSL2 Annexes A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (toutes variantes) Annexes B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (toutes variantes) Annexes B + VDSL2 Annexes A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (toutes variantes) Annexes B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (toutes variantes) Annexes B/J + VDSL2 Annexes A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (toutes variantes) Annexe M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annexe A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annexe B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annexe L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annexe M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annexe A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annexe B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annexe M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -348,33 +531,40 @@ msgstr "" msgid "ARP retry threshold" msgstr "Niveau de ré-essai ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "Table de trafic ARP \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"ARP, IPv4 et IPv6 (même 802.1Q) avec destination multicast Les MAC sont " +"diffusés à l'adresse STA MAC. Note : Ce n'est pas le Service Multicast " +"Direct (DMS) en 802.11v. Note : peut briser les attentes de récepteur STA " +"multicast." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (mode de transfert asynchrone)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "Ponts ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" -msgstr "" -"Identifiant de canal virtuel (VCI) ATM" +msgstr "Identifiant de canal virtuel ATM (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" -msgstr "" -"Identifiant de chemin virtuel (VPI) ATM" +msgstr "Identificateur de chemin virtuel ATM (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -384,28 +574,24 @@ msgstr "" "des interfaces réseau virtuelles Linux qui peuvent être utilisées avec DHCP " "ou PPP pour se connecter au réseau du fournisseur d'accès." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Numéro de périphérique ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C System Vendor ID" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Interface manquante" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Limiter le service DNS aux interfaces des sous-réseaux sur lesquels nous " "desservons le DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Accepter source locale" @@ -414,7 +600,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Accepter le paquet" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Accepter des paquets entrants avec une adresse-source locale" @@ -422,16 +608,25 @@ msgstr "Accepter des paquets entrants avec une adresse-source locale" msgid "Access Concentrator" msgstr "Concentrateur d'accès" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Point d'accès" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Isolation des points d’accès" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Technologies d'accès" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Actions" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Actif" @@ -469,8 +664,8 @@ msgstr "Règles IPv6 actives" msgid "Active-Backup policy (active-backup, 1)" msgstr "Sauvegarde-active (sauvegarde active, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-hoc" @@ -487,18 +682,18 @@ msgstr "Équilibrage adaptatif de la charge de transmission (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Ajouter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Ajouter un pont ATM" @@ -518,11 +713,11 @@ msgstr "Ajouter une action de DEL" msgid "Add VLAN" msgstr "Ajouter un VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Ajouter une configuration d’appareil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Ajout d'une configuration d’appareil…" @@ -530,18 +725,18 @@ msgstr "Ajout d'une configuration d’appareil…" msgid "Add instance" msgstr "Ajouter une instance" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Ajouter une clé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "Ajouter un suffixe de domaine locale aux noms tirés du fichier hôtes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Ajout d'une nouvelle interface..." @@ -549,6 +744,10 @@ msgstr "Ajout d'une nouvelle interface..." msgid "Add peer" msgstr "Ajouter un pair" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Ajouter à la liste noire" @@ -557,11 +756,11 @@ msgstr "Ajouter à la liste noire" msgid "Add to Whitelist" msgstr "Ajouter à la liste blanche" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Fichiers hosts supplémentaires" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Fichier de serveurs additionnels" @@ -578,7 +777,11 @@ msgstr "Fichier de serveurs additionnels" msgid "Address" msgstr "Adresse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Famille d'adresses" @@ -591,7 +794,7 @@ msgstr "Le paramètre d’adresse n’est pas valide" msgid "Address to access local relay bridge" msgstr "Adresse pour accéder au pont-relais local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Adresses" @@ -600,29 +803,29 @@ msgstr "Adresses" msgid "Administration" msgstr "Administration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Paramètres avancés" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Options avancées de l’appareil" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "âge limite" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Puissance d'émission globale (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Agrégation des messages de l'expéditeur" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -659,11 +862,11 @@ msgstr "Alias de l'interface" msgid "Alias of \"%s\"" msgstr "Alias de \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Tous les serveurs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." @@ -671,7 +874,7 @@ msgstr "" "Allouer les adresses IP de manière séquentielle en commençant par les plus " "petites." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Allouer les IP de manière séquentielle" @@ -681,13 +884,13 @@ msgstr "" "Autoriser l'authentification SSH " "par mot de passe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" "Permet au Point d'Accès de déconnecter les clients qui ont une qualité de " "connexion trop faible" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Autoriser tout sauf ce qui est listé" @@ -695,15 +898,15 @@ msgstr "Autoriser tout sauf ce qui est listé" msgid "Allow full UCI access for legacy applications" msgstr "Permettre un accès Complet aux applications Tierces" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Autoriser les débits 802.11b obsolètes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Autoriser uniquement ce qui est listé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Autoriser l'hôte local" @@ -726,20 +929,25 @@ msgid "Allow system feature probing" msgstr "Autoriser la vérification des fonctionnalités du système" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" "Autoriser l'utilisateur root à se connecter avec un mot de passe" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "IP autorisées" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "Technologies réseau autorisées" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "Le paramètre IP autorisées n'est pas valide" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Toujours" @@ -751,13 +959,13 @@ msgstr "Toujours éteint (noyau : aucun)" msgid "Always on (kernel: default-on)" msgstr "Toujours actif (noyau : implicite-actif)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "Toujours envoyer les options DHCP. Parfois nécessaire, par exemple avec " "PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -766,11 +974,15 @@ msgstr "" "second canal. Utiliser cette option n'est pas conforme à la norme IEEE " "802.11n-2009 !" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" "Nombre de demandes de Détection d'Adresses Dupliquées (DAD) à transmettre" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Nombre de secondes à attendre pour que le modem soit prêt" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Une erreur s'est produite lors de l'enregistrement du formulaire :" @@ -779,72 +991,23 @@ msgstr "Une erreur s'est produite lors de l'enregistrement du formulaire :" msgid "An optional, short description for this device" msgstr "Une courte description, optionnelle, pour cet appareil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annexe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annexe A + L + M (toutes)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Annexe A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Annexe A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Annexe A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Annexe A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Annexe B (tout)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Annexe B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Annexe B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Annexe B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Annexe J (tout)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Annexe L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Annexe M (tout)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Annexe M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Annexe M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"Annoncer le préfixe NAT64 dans les messages RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Annoncer ce périphérique comme serveur DNS IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -852,7 +1015,7 @@ msgstr "" "Annoncer cet appareil comme routeur par défaut si une route IPv6 locale est " "présente." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -860,7 +1023,7 @@ msgstr "" "Annoncer cet appareil comme routeur par défaut si un préfixe IPv6 public est " "disponible, sans égard à la disponibilité d’une route locale par défaut." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -868,15 +1031,15 @@ msgstr "" "Annoncer cet appareil comme routeur par défaut indépendamment qu’un préfixe " "ou qu’une route par défaut soient éventuellement présents." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Domaines DNS annoncés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Serveurs DNS IPv6 annoncés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Identité anonyme" @@ -888,7 +1051,7 @@ msgstr "Montage anonyme" msgid "Anonymous Swap" msgstr "Échange anonyme" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Tout paquet" @@ -900,11 +1063,11 @@ msgstr "Tout paquet" msgid "Any zone" msgstr "N'importe quelle zone" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "Appliquer les options DHCP à ce réseau. (Vide = tous les clients)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "Appliquer et conserver les paramètres" @@ -912,40 +1075,44 @@ msgstr "Appliquer et conserver les paramètres" msgid "Apply backup?" msgstr "Appliquer la sauvegarde ?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "La demande a échoué avec le statut %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Appliquer sans vérification" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "Appliquer avec restauration après perte de connectivité" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Application des changements de configuration en cours... %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Architecture" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Balayage ARP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Attribuer une partie d'une longueur donnée de chaque préfixe IPv6 public à " "cette interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -953,7 +1120,7 @@ msgstr "" "Attribuez des parties de préfixe en utilisant cet ID de sous-préfixe " "hexadécimal pour cette interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Équipements connectés" @@ -962,8 +1129,8 @@ msgstr "Équipements connectés" msgid "Associations" msgstr "Les associations" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" @@ -971,8 +1138,8 @@ msgstr "" "Au moins %h par %h, rafale de %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -986,25 +1153,26 @@ msgstr "" "Tentative d'activation des points de montage configurés pour les appareils " "connectés" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Groupe d'authentification" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Authentification" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Type d'authentification" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autoritaire" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Autorisation requise" @@ -1012,7 +1180,9 @@ msgstr "Autorisation requise" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1031,7 +1201,7 @@ msgid "Automatically check filesystem for errors before mounting" msgstr "" "Vérifier automatiquement les erreurs du système de fichiers avant le montage" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1055,6 +1225,10 @@ msgstr "Système de fichiers Automount" msgid "Automount Swap" msgstr "Swap Automount" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Disponible" @@ -1073,11 +1247,15 @@ msgstr "Disponible" msgid "Average:" msgstr "Moyenne :" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Éviter les boucles de pont" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1085,15 +1263,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "Transition BSS" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Retour" @@ -1102,11 +1284,7 @@ msgstr "Retour" msgid "Back to Overview" msgstr "Retour à la vue générale" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Retour à la configuration" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "Retour à la configuration des pairs" @@ -1119,16 +1297,15 @@ msgid "Backup / Flash Firmware" msgstr "Sauvegarde / Mise à jour du micrologiciel" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Liste des fichiers de sauvegarde" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Bande" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Appareil de base" @@ -1136,12 +1313,43 @@ msgstr "Appareil de base" msgid "Base64-encoded public key of this interface for sharing." msgstr "Clé publique codée en base64 de cette interface pour le partage." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Dispositif Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Interface Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv dispose d'une fragmentation de couche 2 intégrée pour les données " +"de monodiffusion circulant dans le réseau maillé, ce qui permet d'exécuter " +"batman-adv sur des interfaces/connexions qui ne permettent pas d'augmenter " +"le MTU au-delà de la taille standard des paquets Ethernet de 1500 octets. " +"Lorsque la fragmentation est activée, batman-adv fragmente automatiquement " +"les paquets trop volumineux et les défragmente à l'autre extrémité. Par " +"défaut, la fragmentation est activée et inactive si le paquet tient, mais il " +"est possible de désactiver entièrement la fragmentation." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Intervalle entre les balises" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Rapport Beacon" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1155,7 +1363,7 @@ msgstr "" msgid "Bind NTP server" msgstr "Lier le serveur NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "Lier dynamiquement aux interfaces au lieu d’utiliser la méta-adresse " @@ -1166,18 +1374,35 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Lier à l’interface" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" +"Lier les enregistrements de service à un nom de domaine : spécifiez " +"l'emplacement des services." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"Lier les enregistrements de service à un nom de domaine : spécifiez " +"l'emplacement des services. Voir RFC2782." + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1189,66 +1414,78 @@ msgstr "Lier le tunnel à cette interface (facultatif)." msgid "Bitrate" msgstr "Débit" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Mode de liaison" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Politique de cautionnement" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Passerelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" "Passerelle (rend possible la communication directe entre interfaces MAC-VLAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Filtre de passerelle-VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" -msgstr "Passerelle" +msgstr "Pont matériel" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "Options spécifiques au port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Ports de la passerelle" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "Table de trafic du pont \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Numéro d'unité du pont" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Configurer un pont vide" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Activer au démarrage" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "Activer le pont même si des ports liés font défaut" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Politique de diffusion (diffusion, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Parcourir…" @@ -1256,16 +1493,40 @@ msgstr "Parcourir…" msgid "Buffered" msgstr "Mise en mémoire tampon" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" +"Certificat CA (encodé PEM ; à utiliser à la place de la mémoire système pour " +"vérifier le certificat de la passerelle." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "Certificat CA ; s'il est vide, il sera sauvegardé après la première " "connexion." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "La configuration de CLAT a échoué" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "CNAME" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME ou fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (interface gérée en externe)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Utilisation CPU (%)" @@ -1280,18 +1541,25 @@ msgstr "Mise en cache" msgid "Call failed" msgstr "L'appel a échoué" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"Peut être utile si le FAI a des serveurs de noms IPv6 mais ne fournit pas de " +"routage IPv6." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Annuler" @@ -1299,32 +1567,32 @@ msgstr "Annuler" msgid "Cannot parse configuration: %s" msgstr "Impossible d'analyser la configuration : %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "Capture des paquets entrants adressés à d'autres hôtes" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "Capture des paquets entrants avant toute décision de routage" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "Capture des paquets entrants acheminés vers le système local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "Capture des paquets sortants après toute décision de routage" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "Capture des paquets sortants provenant du système local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1334,24 +1602,32 @@ msgstr "" msgid "Category" msgstr "Catégorie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Contrainte du certificat (Domaine)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Contrainte de certificat (réseau de stockage SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Contrainte du certificat (Sujet)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Contrainte du certificat (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1359,8 +1635,8 @@ msgstr "" "Sous-chaîne de contrainte de certificat - par exemple /CN=wifi.mycompany." "com
    Voir `logread -f` pendant la négociation pour les valeurs réelles" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1368,8 +1644,8 @@ msgstr "" "Contrainte(s) du certificat par rapport aux valeurs DNS du SAN (si " "disponible)
    ou CN du sujet (correspondance exacte)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1377,8 +1653,8 @@ msgstr "" "Contrainte(s) du certificat par rapport aux valeurs DNS du SAN (si " "disponible)
    ou CN du sujet (correspondance exacte)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1393,16 +1669,16 @@ msgstr "" msgid "Chain" msgstr "Chaîne" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "Crochet de chaîne \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Changements" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Les modifications ont été annulées." @@ -1413,18 +1689,19 @@ msgstr "Change le mot de passe administrateur pour accéder à l'équipement" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Canal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Analyse des canaux" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Largeur du canal" @@ -1432,7 +1709,7 @@ msgstr "Largeur du canal" msgid "Check filesystems before mount" msgstr "Vérifier le système de fichiers avant le montage" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" "Cocher cette option pour supprimer les réseaux existants de cette interface " @@ -1451,8 +1728,8 @@ msgstr "Vérification de l'image…" msgid "Choose mtdblock" msgstr "Choisir le mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1464,7 +1741,7 @@ msgstr "" "zone associée, ou remplissez le champ créer pour définir une " "nouvelle zone et y inclure cette interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1473,7 +1750,7 @@ msgstr "" "sans-fil ou remplissez le champ créer pour définir un nouveau " "réseau." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Code de chiffrement" @@ -1497,9 +1774,10 @@ msgstr "" "Cliquer sur \"Save mtdblock\" pour télécharger le fichier mtdblock spécifié. " "(REMARQUE : CETTE RUBRIQUE EST DESTINÉE AUX PROFESSIONNELS ! )" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Client" @@ -1508,9 +1786,9 @@ msgstr "Client" msgid "Client ID to send when requesting DHCP" msgstr "Identifiant client à envoyer dans les requêtes DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Fermer" @@ -1527,20 +1805,20 @@ msgstr "" "Fermer une connexion inactive après le délai donné en secondes, mettre 0 " "pour garder les connexions" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Fermer la liste…" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Récupération des données…" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Commande" @@ -1557,7 +1835,7 @@ msgstr "Échec de la commande" msgid "Comment" msgstr "Commentaire" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1579,31 +1857,30 @@ msgstr "Calculer la somme de contrôle sortante (facultatif)." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Config File" -msgstr "" +msgstr "Fichier de configuration" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Configuration" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "Export de la configuration" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Les changements de configuration sont appliqués." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Les changements de configuration ont été annulés !" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Échec de la configuration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1620,7 +1897,7 @@ msgstr "" "débit de base à 24 Mbps. Les débits pris en charge inférieurs au débit de " "base minimum ne sont pas proposés." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." @@ -1628,7 +1905,7 @@ msgstr "" "Configure l'annonce de routeur par défaut dans les messages RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1636,18 +1913,18 @@ msgstr "" "Configure le mode de fonctionnement du service RA sur cette interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" "Configure le mode de fonctionnement du service DHCPv6 sur cette interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" "Configure le mode de fonctionnement du service proxy NDP sur cette interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Configuration…" @@ -1659,9 +1936,10 @@ msgstr "Confirmer la déconnexion" msgid "Confirmation" msgstr "Confirmation" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Connecté" @@ -1671,11 +1949,11 @@ msgstr "Connecté" msgid "Connection attempt failed" msgstr "Échec de la tentative de connexion" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "La tentative de connexion a échoué." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "Point de terminaison de la connexion" @@ -1687,7 +1965,7 @@ msgstr "Connexion perdue" msgid "Connections" msgstr "Connexions" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "Changement de connectivité" @@ -1717,11 +1995,11 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:368 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:55 msgid "Contents have been saved." -msgstr "Le contenu a été enregistré." +msgstr "Les contenus ont été enregistrés." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1732,16 +2010,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "Continuer dans %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "Continuer dans la chaîne d'appel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "Continuer à traiter les paquets non appariés" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1756,20 +2034,20 @@ msgstr "" msgid "Country" msgstr "Pays" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Code pays" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Densité cellulaire de couverture" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Créer / Assigner une zone du pare-feu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Créer une interface" @@ -1781,7 +2059,7 @@ msgstr "Critique" msgid "Cron Log Level" msgstr "Niveau de journalisation de Cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Puissance actuelle" @@ -1824,31 +2102,31 @@ msgstr "" "Permet de personnaliser le comportement des DELs lorsque le matériel le permet." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "Transmission de DAD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE-Client" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "Port DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "Secret DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" -msgstr "Options DHCP" +msgstr "DHCP Options" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Serveur DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP et DNS" @@ -1859,16 +2137,22 @@ msgstr "DHCP et DNS" msgid "DHCP client" msgstr "client DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" -msgstr "Options DHCP" +msgstr "DHCP-Options" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "Client DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "Service DHCPv6" @@ -1880,28 +2164,27 @@ msgstr "Service DHCPv6" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "transmissions DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" -msgstr "" -"Port des requêtes DNS" +msgstr "DNS requête port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "Domaines de recherche DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" -msgstr "Port du serveur DNS" +msgstr "Port du serveur DNS" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:292 msgid "DNS setting is invalid" msgstr "Le paramètre DNS n'est pas valide" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "Poids DNS" @@ -1909,11 +2192,11 @@ msgstr "Poids DNS" msgid "DNS-Label / FQDN" msgstr "Label DNS / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "Vérification DNSSEC non signée" @@ -1925,39 +2208,47 @@ msgstr "Délai d'inactivité DPD" msgid "DS-Lite AFTR address" msgstr "Adresse du DS-Lite AFTR" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "Statut DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "Mode ligne DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "Intervalle DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Débit de données" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Donnée reçue" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Données transmises" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Débogage" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Routeur par défaut" @@ -1965,7 +2256,7 @@ msgstr "Routeur par défaut" msgid "Default state" msgstr "État par défaut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1975,7 +2266,7 @@ msgstr "" "\"6,192.168.2.1,192.168.2.2\" qui publie différents serveurs " "DNS à ses clients." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" @@ -1983,7 +2274,7 @@ msgstr "" "Définit un mappage de la priorité des paquets internes Linux à la priorité " "de l'en-tête VLAN mais pour les trames sortantes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" @@ -1991,50 +2282,51 @@ msgstr "" "Définit une correspondance entre la priorité de l'en-tête du VLAN et la " "priorité des paquets internes de Linux sur les trames entrantes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" "Définit une Unité de Transfert Maximale (MTU) spécifique pour cette route" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "Déléguer les préfixes IPv6" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Effacer" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Touche de suppression" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Échec de la demande de suppression : %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Supprimer ce réseau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Intervalle entre les messages d'indication du trafic de livraison" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Description" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Désélectionner" @@ -2042,11 +2334,11 @@ msgstr "Désélectionner" msgid "Design" msgstr "Apparence" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "Maître désigné" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2081,9 +2373,9 @@ msgstr "Zone de destination" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2093,36 +2385,40 @@ msgstr "Zone de destination" msgid "Device" msgstr "Appareil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Configuration de l'appareil" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "L’appareil n’est pas actif" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "L'appareil redémarre…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Nom de l'appareil" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Périphérique non géré par ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Périphérique non présent" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Type de périphérique" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Appareil inaccessible !" @@ -2130,31 +2426,31 @@ msgstr "Appareil inaccessible !" msgid "Device unreachable! Still waiting for device..." msgstr "Appareil inaccessible ! Toujours en attente de l’appareil …" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Appareils" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnostiques" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Composer le numéro" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Répertoire" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Désactiver" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2171,20 +2467,24 @@ msgstr "Désactiver les requêtes DNS" msgid "Disable Encryption" msgstr "Désactiver le chiffrement" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Désactiver l'interrogation d'inactivité" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Désactiver ce réseau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2193,16 +2493,16 @@ msgstr "Désactiver ce réseau" msgid "Disabled" msgstr "Désactivé" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "Désactivé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" -msgstr "Désassossier sur la reconnaissance basse (Low Acknowledgement)" +msgstr "Désassocier sur la reconnaissance basse (Low Acknowledgement)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" @@ -2210,18 +2510,17 @@ msgstr "" "a>." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Déconnecter" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "La tentative de déconnexion a échoué" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "La tentative de déconnexion a échoué." @@ -2231,23 +2530,35 @@ msgstr "Espace disque" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Effacer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Optimisation de la distance" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Distance au membre du réseau le plus éloigné, en mètres." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Table ARP distribuée" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2255,7 +2566,7 @@ msgstr "" "Instance dnsmasq à laquelle cette section de démarrage est liée. Si non " "spécifié, la section est valable pour toutes les instances dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP léger et un redirecteurDNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" "Ne pas mettre en cache les réponses négatives, par ex. pour des domaines " @@ -2279,35 +2590,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "Ne pas créer de route hôte vers le pair (facultatif)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "Ne pas transmettre les requêtes DNS sans points ou parties de domaine." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Ne pas transmettre les requêtes qui ne peuvent être résolues par les " -"serveurs de noms publics." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." -msgstr "" -"Ne pas transmettre les requêtes de recherche inverse pour les réseaux locaux." +msgstr "Ne pas transmettre les requêtes inversées pour le réseaux local." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Empêcher l'écoute sur ces interfaces." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." -msgstr "Ne pas offrir de service DHCPv6 sur cet interface." +msgstr "Ne pas activer le service DHCPv6 sur cette interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Ne pas participer" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2319,7 +2618,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Ne pas envoyer de nom d’hôte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2327,11 +2626,11 @@ msgstr "" "Ne pas envoyer de messages RA sur cette interface." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Voulez-vous vraiment supprimer « %s » ?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Voulez-vous vraiment supprimer cette clé SSH ?" @@ -2339,11 +2638,11 @@ msgstr "Voulez-vous vraiment supprimer cette clé SSH ?" msgid "Do you really want to erase all settings?" msgstr "Voulez-vous vraiment effacer tous les paramètres ?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Voulez-vous vraiment supprimer récursivement le répertoire « %s » ?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "Voulez-vous remplacer le PSK actuel ?" @@ -2351,15 +2650,17 @@ msgstr "Voulez-vous remplacer le PSK actuel ?" msgid "Do you want to replace the current keys?" msgstr "Voulez-vous remplacer les clés actuelles ?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Domaine" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Domaine nécessaire" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Liste blanche de domaines" @@ -2385,11 +2686,11 @@ msgstr "Télécharger la sauvegarde" msgid "Download mtdblock" msgstr "Télécharger mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Décalage du Rapport signal - bruit descendant" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2405,16 +2706,64 @@ msgstr "Faites glisser pour réorganiser" msgid "Drop Duplicate Frames" msgstr "Omettre Trames Dupliquées" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"Laisser tomber tous les cadres ARP gratuit, par exemple s'il y a un bon " +"proxy ARP connu sur le réseau et ces trames ne doivent pas être utilisés ou " +"dans le cas de 802.11, ne doivent pas être utilisés pour prévenir les " +"attaques." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Supprimes toutes les annonces de voisinage non sollicitées, par exemple s'il " +"existe un bon proxy NA connu sur le réseau et que de telles trames ne " +"doivent pas être utilisées ou, dans le cas de la norme 802.11, ne doivent " +"pas être utilisées pour prévenir les attaques." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Supprime l'ARP gratuit" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" +"Détruire les trames multicast de couche 2 contenant des paquets unicast IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" +"Détruire les trames multicast de couche 2 contenant des paquets unicast IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Abandonner les monodiffusions IPv4 imbriquées" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Abandonner les monodiffusions IPv6 imbriquées" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Abandonner les paquets" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "Abandonner les paquets non appariés" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Abandonner les NA non sollicités" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Session Dropbear" @@ -2432,20 +2781,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Double-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "DHCP dynamique" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "Client d’extension d’autorisation dynamique." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "Port d'extension d'autorisation dynamique." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "Secret de l’extension d’autorisation dynamique." @@ -2453,7 +2802,7 @@ msgstr "Secret de l’extension d’autorisation dynamique." msgid "Dynamic tunnel" msgstr "Tunnel dynamique" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2461,21 +2810,33 @@ msgstr "" "Alloue dynamiquement des adresses pour les clients du DHCP. Si désactivé, " "seuls les clients ayant des baux statiques seront gérés." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Par exemple, br-vlan ou brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Example, eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "Longueur des bits de l'EA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" -msgstr "Méthode EAP" +msgstr "EAP-Method" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Chaque STA se voit attribuer sa propre interface AP_VLAN." #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Éditer" @@ -2483,6 +2844,10 @@ msgstr "Éditer" msgid "Edit peer" msgstr "Modifier le pair" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2491,11 +2856,11 @@ msgstr "" "Modifier les données de configuration brutes ci-dessus pour corriger toute " "erreur et cliquer sur \"Enregistrer\" pour recharger la page." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Éditer ce réseau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Editer un réseau sans fil" @@ -2504,46 +2869,36 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "Route effective MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Cartographie de la QoS de sortie" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "ID du dispositif de sortie" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Nom du dispositif de sortie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Sortie étiquetée" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Sortie non étiquetée" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Urgence" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" -msgstr "Activer" +msgstr "Active" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" "Activer / Désactiver l’homologue. Redémarrez l’interface wireguard pour " "appliquer les modifications." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2551,11 +2906,11 @@ msgstr "" "Activer l'IGMP " "snooping" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Activer le protocole STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "Activer SLAAC" @@ -2573,10 +2928,11 @@ msgstr "Activer le mélange dynamique des flux" msgid "Enable HE.net dynamic endpoint update" msgstr "Activer la mise à jour dynamique de l'extrémité du tunnel chez HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Activer IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Activer la négociation d'IPv6" @@ -2590,11 +2946,15 @@ msgstr "Activer la négociation d'IPv6" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Activer la négociation IPv6 sur le lien PPP" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "Activer le routage de segments IPv6" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Activer la circulation de très grandes trames (Jumbo)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "Activer l’apprentissage des adresses MAC" @@ -2606,11 +2966,11 @@ msgstr "Activer client NTP" msgid "Enable Single DES" msgstr "Activer le DES unique" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Activer le serveur TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Activer le filtrage VLAN" @@ -2618,7 +2978,7 @@ msgstr "Activer le filtrage VLAN" msgid "Enable VLAN functionality" msgstr "Acviter la gestion des VLANs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Activer le bouton poussoir WPS, nécessite WPA(2)-PSK/WPA3-SAE" @@ -2632,14 +2992,14 @@ msgstr "" "Transfer Protocol\">HTTP vers le port HTTPS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" "Activer la délégation en aval des préfixes IPv6 disponibles sur cette " "interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Activer les contre-mesures de réinstallation des clés (KRACK)" @@ -2655,26 +3015,26 @@ msgstr "Activer la mise en miroir des paquets entrants" msgid "Enable mirroring of outgoing packets" msgstr "Activer la mise en miroir des paquets sortants" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "Activer la multidiffusion à sortie rapide" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "Activer le requêteur de multidiffusion" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Activer le support multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Activez le pilotage des paquets sur tous les CPU. Peut aider ou entraver la " "vitesse du réseau." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Activer le mode promiscuité" @@ -2696,11 +3056,11 @@ msgstr "Activez la prise en charge du trafic multicast (facultatif)." msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Activez le drapeau DF (Don’t Fragment) des paquets encapsulants." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "Activez le serveur TFTP à instance unique intégré." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Activer ce réseau" @@ -2709,21 +3069,24 @@ msgstr "Activer ce réseau" msgid "Enable tx checksum" msgstr "Activer le checksum tx" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "Activer l’inondation unicast" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Activé" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Active l'IGMP snooping sur ce bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2731,34 +3094,45 @@ msgstr "" "Permet l’itinérance rapide entre les points d’accès qui appartiennent au " "même domaine de mobilité (Mobility Domain)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 -msgid "Enables the Spanning Tree Protocol on this bridge" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." msgstr "" -"Active le protocole STP sur ce " -"bridge" +"Permet une infrastructure de transfert de multidiffusion plus efficace et " +"plus adaptée aux groupes dans batman-adv." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 +msgid "Enables the Spanning Tree Protocol on this bridge" +msgstr "Active le protocole Spanning Tree sur ce pont" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:59 msgid "Encapsulation limit" msgstr "Limite d'encapsulation" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Mode encapsulé" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Chiffrement" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Point d'arrivée" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Hôte du point terminal" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Port du point terminal" @@ -2766,23 +3140,23 @@ msgstr "Port du point terminal" msgid "Endpoint setting is invalid" msgstr "Le paramètre de point de terminaison n'est pas valide" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "Appliquer IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "Appliquer IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "Appliquer IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "Appliquer MLD version 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "Appliquer MLD version 2" @@ -2811,10 +3185,6 @@ msgstr "Erreur" msgid "Error getting PublicKey" msgstr "Erreur lors de l’obtention de la clé publique" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Erreurs de secondes (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2833,11 +3203,19 @@ msgstr "Toutes les 30 secondes (slow, 0)" msgid "Every second (fast, 1)" msgstr "Chaque seconde (fast, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Exclure les interfaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"Exécution de commandes réseau pour vérifier la connexion et la résolution " +"des noms vers d'autres systèmes." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2845,27 +3223,35 @@ msgstr "" "Exempter 127.0.0.0/8 et ::1 des contrôles de " "réattribution de liens, par exemple pour les services RBL." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Périphérique existant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Étendre le nom d'hôte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Numéro de port espéré." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Un indice d'affectation hexadécimal est attendu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Attente d'une adresse IPv4 valide" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Attente d'une adresse IPv6 valide" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Attente de deux valeurs de priorité séparées par un signe deux-points" @@ -2874,11 +3260,11 @@ msgstr "Attente de deux valeurs de priorité séparées par un signe deux-points #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Attendu : %s" @@ -2890,7 +3276,7 @@ msgstr "Attente : valeur non vide" msgid "Expires" msgstr "Expire" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2901,11 +3287,11 @@ msgstr "" msgid "External" msgstr "Externe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Liste externe des détenteurs de clés R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Liste externe des détenteurs de clés R1" @@ -2933,37 +3319,65 @@ msgstr "Options pppd supplémentaires" msgid "Extra sstpc options" msgstr "Options sstpc supplémentaires" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT sur DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT Over the Air" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "Protocole FT" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Impossible de modifier le mot de passe du système." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Échec de la configuration du modem" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" "La demande n'a pas été confirmée dans les délais impartis (%ds), en attente " "d'un retour arrière…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Échec de la connexion" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Échec de la déconnexion" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Impossible d'exécuter l'action \"/etc/init.d/%s %s\" action : %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Impossible d’obtenir les informations du modem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Échec de l'initialisation du modem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Impossible de définir le mode de fonctionnement" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Fichier" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2972,26 +3386,24 @@ msgstr "" "domaine, par exemple server=1.2.3.4, server=/" "domain/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Fichier non accessible" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." -msgstr "" -"Fichier dans lequel les baux DHCP seront stockés." +msgstr "Fichier pour stocker les informations de bail DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "Fichier contenant les résolveurs en amont." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Nom de fichier" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Nom de fichier de l'image de démarrage publiée aux clients." @@ -3000,14 +3412,22 @@ msgstr "Nom de fichier de l'image de démarrage publiée aux clients." msgid "Filesystem" msgstr "Système de fichiers" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Filtrer les enregistrements A IPv4" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Filtrer les enregistrements AAAA IPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Filtrer la découverte des services SRV/SOA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filtrer les requêtes privées" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filtrer les requêtes inutiles" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Filtrage pour tous les esclaves, pas de validation" @@ -3023,8 +3443,15 @@ msgstr "" "Filtrage pour tous les esclaves, validation uniquement pour les esclaves de " "secours" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" +"Filtre la découverte des services SRV/SOA, afin d'éviter de déclencher des " +"liaisons à la demande." + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "La finalisation a échoué" @@ -3037,7 +3464,7 @@ msgstr "" "remplacer la configuration par des valeurs par défaut en fonction de ce qui " "a été détecté" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Cherche et rejoint un réseau" @@ -3051,10 +3478,11 @@ msgid "Firewall" msgstr "Pare-feu" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Marque du Pare-feu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Paramètres du pare-feu" @@ -3062,19 +3490,19 @@ msgstr "Paramètres du pare-feu" msgid "Firewall Status" msgstr "État du pare-feu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "Marque de pare-feu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Fichier de micrologiciel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Version du micrologiciel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Port source fixe pour les requêtes DNS sortantes." @@ -3100,40 +3528,48 @@ msgstr "Opérations d'écriture" msgid "Flashing…" msgstr "Écriture en cours…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Forcer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Forcer le mode 40 MHz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Forcer CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Force le DHCP sur ce réseau même si un autre serveur est détecté." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "Forcer la version IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "Forcer la version MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Forcer TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Forcer TKIP et CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Forcer le lien" @@ -3145,11 +3581,11 @@ msgstr "Forcer la mise à niveau" msgid "Force use of NAT-T" msgstr "Forcer l'utilisation de NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Non-correspondance des jetons de formulaire" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA entre l'interface " "maître désignée et les interfaces en aval." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3174,7 +3610,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Transmettre le trafic DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3182,33 +3618,37 @@ msgstr "" "Transférer les messages DHCPv6 entre l'interface maître désignée et les " "interfaces en aval." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "Forward Error Correction Secondes (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Transmettre le trafic de diffusion" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "Retardement de l'avance" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Trafic homologue de maillage vers l'avant" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" "Transférer les paquets multicast comme des paquets unicast sur ce " "périphérique." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Mode de transmission" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Fragmentation" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Seuil de fragmentation" @@ -3232,7 +3672,7 @@ msgid "GHz" msgstr "Ghz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "seulement GPRS" @@ -3252,12 +3692,16 @@ msgstr "Tunnel GRETAP sur IPv4" msgid "GRETAP tunnel over IPv6" msgstr "Tunnel GRETAP sur IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Passerelle" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Mode passerelle" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Autoriser la connexion aux ports forwardés" @@ -3267,23 +3711,23 @@ msgstr "Autoriser la connexion aux ports forwardés" msgid "Gateway address is invalid" msgstr "L'adresse de la passerelle n'est pas valide" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Paramètres généraux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Paramètres principaux" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Options générales du dispositif" @@ -3291,7 +3735,7 @@ msgstr "Options générales du dispositif" msgid "Generate Config" msgstr "Générer la configuration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Générer PMK localement" @@ -3299,11 +3743,11 @@ msgstr "Générer PMK localement" msgid "Generate archive" msgstr "Construire l'archive" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "Générer la configuration" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "Génération de la configuration…" @@ -3311,15 +3755,15 @@ msgstr "Génération de la configuration…" msgid "Generate new key pair" msgstr "Générer une nouvelle clé pour homologue" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "Générer une clé pré-partagée" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "Génère une configuration adaptée à l'importation sur un pair WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "Génération de code QR…" @@ -3333,39 +3777,40 @@ msgstr "" msgid "Global Settings" msgstr "Paramètres généraux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Options globales de réseau" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "Aller à la mise à niveau du firmware …" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Aller à la configuration du mot de passe…" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Aller à la page de configuration correspondante" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "Permettre l'accès à la configuration DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Permettre l'accès à l'affichage de l'état DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "Permettre l'accès à l'affichage de l'état DSL" @@ -3377,6 +3822,10 @@ msgstr "Permettre l'accès aux procédures LuCI OpenConnect" msgid "Grant access to LuCI Wireguard procedures" msgstr "Accorder l’accès aux procédures LuCI Wireguard" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Autoriser l'accès aux procédures LuCI openfortivpn" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "Permettre l'accès à la configuration SSH" @@ -3413,7 +3862,7 @@ msgstr "Permettre l'accès à la configuation de montage" msgid "Grant access to network configuration" msgstr "Permettre l'accès à la configuration réseau" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Permettre l'accès aux outils de diagnostic réseau" @@ -3421,6 +3870,10 @@ msgstr "Permettre l'accès aux outils de diagnostic réseau" msgid "Grant access to network status information" msgstr "Permettre l'accès aux détails de l'état du réseau" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "Permettre l'accès à l'état des processus" @@ -3453,7 +3906,7 @@ msgstr "Autoriser l'accès à la configuration de uHTTPd" msgid "Grant access to wireless channel status" msgstr "Accorder l’accès à l’état du canal sans fil" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Permettre l'accès du status WIFI" @@ -3482,15 +3935,11 @@ msgstr "Accès HTTP(S)" msgid "Hang Up" msgstr "Signal (HUP)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Erreurs de code d'erreur d'en-tête (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Intervalle battements du cœur (noyau : battement du cœur)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Intervalle de contact (Hello)" @@ -3502,7 +3951,7 @@ msgstr "" "Ici, vous pouvez configurer les aspects basiques de votre routeur comme son " "nom ou son fuseau horaire." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Cacher le ESSID" @@ -3511,17 +3960,25 @@ msgstr "Cacher le ESSID" msgid "Hide empty chains" msgstr "Cacher les chaînes vides" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "Haut" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "Honorer l'ARP gratuit" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "Crochet : %h (%h), Priorité : %d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Pénalité de saut" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3531,7 +3988,7 @@ msgstr "Hôte" msgid "Host expiry timeout" msgstr "Délai d'expiration pour les hôtes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "L’hôte demande ce nom de fichier au serveur d’amorçage." @@ -3539,10 +3996,16 @@ msgstr "L’hôte demande ce nom de fichier au serveur d’amorçage." msgid "Host-Uniq tag content" msgstr "Contenu du tag Host-Uniq" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3552,11 +4015,11 @@ msgstr "Nom d'hôte" msgid "Hostname to send when requesting DHCP" msgstr "Nom d'hôte à envoyer dans une requête DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Noms d'hôtes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3585,12 +4048,12 @@ msgstr "Hybride" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:49 msgctxt "nft icmp code" msgid "ICMP code" -msgstr "" +msgstr "Code ICMP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:50 msgctxt "nft icmp type" msgid "ICMP type" -msgstr "" +msgstr "Type ICMP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:51 msgctxt "nft icmpv6 code" @@ -3615,23 +4078,27 @@ msgstr "IEEE 802.3ad Agrégation de liens dynamiques (802.3ad, 4)" msgid "IKE DH Group" msgstr "Groupe IKE DH" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "Adresses IP" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "Protocole IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" -msgstr "Ensembles d’adresses IP" +msgstr "IP Sets" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "Type IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3647,32 +4114,35 @@ msgstr "L'adresse IP n'est pas valide" msgid "IP address is missing" msgstr "Adresse IP manquante" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " "packets with matching destination IP." msgstr "" +"Adresses IP autorisées à l’intérieur du tunnel. L’homologue acceptera les " +"paquets tunnelisés avec des adresses IP source correspondant à cette liste " +"et acheminera les paquets avec l’adresse IP de destination correspondante." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 msgctxt "nft ip protocol" msgid "IP protocol" msgstr "Protocole IP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "Protocole IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "Ensemble d’adresses IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "Ensembles d’adresses IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Contourne les « NX Domain » bogués" @@ -3680,14 +4150,15 @@ msgstr "Contourne les « NX Domain » bogués" msgid "IPsec XFRM" msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3703,7 +4174,7 @@ msgstr "Voisins IPv4" msgid "IPv4 Routing" msgstr "Routage IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "Règles IPv4" @@ -3713,7 +4184,7 @@ msgstr "IPv4 en amont" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3740,9 +4211,9 @@ msgstr "Masque-réseau IPv4" msgid "IPv4 network in address/netmask notation" msgstr "Réseau IPv4 au format adresse/masque réseau" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" -msgstr "IPv4 seulement" +msgstr "IPv4 uniquement" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:52 msgid "IPv4 prefix" @@ -3753,11 +4224,11 @@ msgstr "Préfixe IPv4" msgid "IPv4 prefix length" msgstr "longueur du préfixe IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "Table de trafic IPv4 \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3766,16 +4237,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4 en IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (les deux - par défaut IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "Table de trafic IPv4/IPv6 « %h »" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3786,7 +4261,8 @@ msgstr "Table de trafic IPv4/IPv6 « %h »" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3794,7 +4270,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Pare-feu IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "MTU IPv6" @@ -3802,7 +4278,11 @@ msgstr "MTU IPv6" msgid "IPv6 Neighbours" msgstr "Voisinage IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "Paramètres IPv6 RA" @@ -3810,15 +4290,15 @@ msgstr "Paramètres IPv6 RA" msgid "IPv6 Routing" msgstr "Routage IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "Règles IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "Paramètres IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "Préfixe ULA IPv6" @@ -3832,12 +4312,12 @@ msgstr "IPv6 amont" msgid "IPv6 address" msgstr "Adresse IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "Indice d'affectation IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "Longueur d'attribution IPv6" @@ -3849,11 +4329,11 @@ msgstr "Passerelle IPv6" msgid "IPv6 network in address/netmask notation" msgstr "Réseau IPv6 au format adresse/masque réseau" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" -msgstr "IPv6 seulement" +msgstr "IPv6 uniquement" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "Préférence IPv6" @@ -3862,7 +4342,7 @@ msgstr "Préférence IPv6" msgid "IPv6 prefix" msgstr "Préfixe IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "Filtre de préfixe IPv6" @@ -3876,25 +4356,19 @@ msgstr "longueur du préfixe IPv6" msgid "IPv6 routed prefix" msgstr "Préfixe IPv6 routé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "Routage source IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "Suffixe IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"Suffixe IPv6 (en " -"hexadécimal)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "Prise en charge d’IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "Table de trafic IPv6 \"%h\"" @@ -3902,6 +4376,10 @@ msgstr "Table de trafic IPv6 \"%h\"" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3917,10 +4395,16 @@ msgstr "IPv6 sur IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6 sur IPv4 (6 vers 4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identité" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "1DES est activé si cette case est cochée" @@ -3933,7 +4417,7 @@ msgstr "Si coché, ajoute \"+ ipv6\" aux options pppd" msgid "If checked, encryption is disabled" msgstr "Le chiffrement est désactivé si cette case est cochée" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." @@ -3941,7 +4425,7 @@ msgstr "" "S'il est défini, les sous-réseaux en aval sont uniquement alloués à partir " "des classes de préfixes IPv6 données." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" "S'il est défini, la signification des options de correspondance est inversée" @@ -3963,7 +4447,7 @@ msgstr "" "Monte le périphérique identifié par cette étiquette au lieu d'un nom de " "périphérique fixe" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " @@ -3973,14 +4457,16 @@ msgstr "" "manuelle à la nouvelle adresse IP
    est requise dans les %d secondes " "pour confirmer les paramètres, sinon les modifications seront annulées." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Aucune route par défaut ne sera configurée si cette case est décochée" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "Les serveurs DNS annoncés seront ignorés si cette case est décochée" @@ -4000,15 +4486,23 @@ msgstr "" "très lent car le périphérique d'échange n'est pas accessible avec les taux " "de données élevés de la RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignorer /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignorer l'interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignorer le fichier de résolution" @@ -4020,25 +4514,25 @@ msgstr "Image" msgid "Image check failed:" msgstr "La vérification de l'image a échoué :" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "Importer en tant qu’homologue" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "Importer la configuration" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" -msgstr "" +msgstr "Importer la configuration en tant que pair…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "Importation des paramètres" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "Configuration des pairs importée" @@ -4051,7 +4545,24 @@ msgstr "" msgid "In" msgstr "Entrée" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"Dans les configurations de réseaux locaux pontés, il est conseillé d'activer " +"la fonction de prévention des boucles de pont afin d'éviter les boucles de " +"diffusion qui peuvent paralyser l'ensemble du réseau local." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -4060,7 +4571,7 @@ msgstr "" "bloquée. Cliquez sur \"Continuer\" ci-dessous pour revenir à la page " "précédente." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "En secondes" @@ -4092,7 +4603,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Somme de contrôle entrante" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Interface entrante" @@ -4100,6 +4611,7 @@ msgstr "Interface entrante" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Clé entrante" @@ -4118,22 +4630,21 @@ msgstr "Infos" msgid "Information" msgstr "Information" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "Cartographie QoS de l'entrée" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "Identifiant du dispositif d'entrée" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "Nom du dispositif d'entrée" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Échec d'initialisation" @@ -4145,31 +4656,41 @@ msgstr "Script d'initialisation" msgid "Initscripts" msgstr "Scripts d'initialisation" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Contrainte du certificat interne (domaine)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Contrainte du certificat interne (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Contrainte du certificat interne (Sujet)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Contrainte du certificat interne (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Installation des extensions de protocole…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Occurrence" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Instance \"%h\"" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Détails de l'instance" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4181,6 +4702,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Autorisations insuffisantes pour lire la configuration de l'UCI." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4188,7 +4713,7 @@ msgstr "Autorisations insuffisantes pour lire la configuration de l'UCI." msgid "Interface" msgstr "Interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "L'interface \"%h\" est déjà marquée comme maître désigné." @@ -4196,7 +4721,7 @@ msgstr "L'interface \"%h\" est déjà marquée comme maître désigné." msgid "Interface %q device auto-migrated from %q to %q." msgstr "L'interface %q du périphérique a migré automatiquement de %q vers %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Configuration de l'interface" @@ -4227,11 +4752,11 @@ msgstr "L'interface se reconnecte…" msgid "Interface is shutting down..." msgstr "L'interface s'arrête…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "L'interface démarre..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "L’interface s’arrête..." @@ -4240,12 +4765,12 @@ msgid "Interface name" msgstr "Nom de l’interface" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "L'interface n'est pas présente ou pas encore connectée." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Interfaces" @@ -4254,15 +4779,19 @@ msgstr "Interfaces" msgid "Internal" msgstr "Interne" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Erreur Serveur Interne" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Intervalle d'envoi des paquets d'apprentissage" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4273,7 +4802,7 @@ msgstr "" "messages IGMP sur le sous-réseau ; des valeurs plus élevées font que les " "requêtes IGMP sont envoyées moins souvent" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "Intervalle en secondes pour les paquets STP hello" @@ -4283,8 +4812,9 @@ msgid "Invalid" msgstr "Erreur : donnée entrée invalide" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "L'APN fourni est invalide" @@ -4294,6 +4824,10 @@ msgstr "L'APN fourni est invalide" msgid "Invalid Base64 key string" msgstr "Chaîne de clé Base64 invalide" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Adresse IPv6 non valide" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4319,7 +4853,7 @@ msgstr "" msgid "Invalid argument" msgstr "Argument invalide" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4335,15 +4869,36 @@ msgstr "Commande invalide" msgid "Invalid hexadecimal value" msgstr "Valeur hexadécimale invalide" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Nom d’hôte ou adresse IPv4 non valide" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Port non valide" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "URL du serveur non valide" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Nom d'utilisateur et/ou mot de passe invalides ! Réessayez." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Inverser le clignotement" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "Inverser la correspondance" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "VLAN primaire" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Isoler les clients" @@ -4356,25 +4911,25 @@ msgstr "" "L'image que vous essayez de flasher est vraisemblablement trop grosse pour " "tenir dans la mémoire flash, merci de vérifier le fichier !" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "Nécessite JavaScript !" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Rejoindre un réseau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Rejoindre un réseau : recherche des réseaux sans-fil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Rejoindre le réseau : %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Passer à la règle" @@ -4382,24 +4937,28 @@ msgstr "Passer à la règle" msgid "Keep settings and retain the current configuration" msgstr "Garder les paramètres et conserver la configuration actuelle" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "Keep-Alive" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Journal du noyau" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Version du noyau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Clé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Clé n° %d" @@ -4407,6 +4966,7 @@ msgstr "Clé n° %d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Clé pour les paquets entrants (optionnel)." @@ -4414,14 +4974,19 @@ msgstr "Clé pour les paquets entrants (optionnel)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Clé pour les paquets sortants (optionnel)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "Clé manquante" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Clé utilisée pour signer la configuration réseau" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4466,7 +5031,7 @@ msgstr "Intervalle entre échos LCP" msgid "LED Configuration" msgstr "Configuration des DEL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4483,32 +5048,41 @@ msgstr "Langue" msgid "Language and Style" msgstr "Langue et apparence" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" +"Les poids plus grands (du même prio) ont une probabilité proportionnellement " +"plus élevée d’être sélectionnés." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "Intervalle du dernier membre" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Latence" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Dernière poignée de main" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Feuille" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Apprendre" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "Apprentissage des itinéraires" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Fichier de baux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Durée du bail" @@ -4532,7 +5106,7 @@ msgstr "Laisser vide pour l'auto-détection" msgid "Leave empty to use the current WAN address" msgstr "Laisser vide pour utiliser l'adresse WAN actuelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4543,31 +5117,27 @@ msgstr "" "considérablement réduite lorsque ces taux sont utilisés. Il est recommandé " "de ne pas autoriser les taux 802.11b lorsque cela est possible." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "Règles héritées détectées" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Légende :" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Limite" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Atténuation de la ligne (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "Mode ligne" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "État de la ligne" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "Temps de fonctionnement de la ligne" @@ -4588,18 +5158,20 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "Bits d'en-tête de la couche de liaison %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Liste des adresses IP à convertir en réponses NXDOMAIN." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" "Liste des ensembles d'adresses IP à remplir avec les adresses IP de domaine " "spécifiées." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4614,7 +5186,7 @@ msgstr "" "PMK-R1 du R0KH que le STA a utilisé lors de l'association initiale au " "domaine de mobilité." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4633,25 +5205,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Liste des fichiers de clés SSH pour l'authentification" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Liste des domaines où sont permises les réponses de type RFC1918." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Liste des domaines à forcer à une adresse IP." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." -msgstr "" -"Liste des serveurs auquels sont transmis les requêtes DNS." +msgstr "Liste des résolveurs en amont pour transmettre les requêtes." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Port d'écoute" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Interfaces d'écoute" @@ -4659,7 +5226,7 @@ msgstr "Interfaces d'écoute" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "Écouter seulement sur l'interface spécifié, sinon sur toutes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4669,7 +5236,7 @@ msgstr "Limiter l'écoute à ces interfaces, et le loopback." msgid "ListenPort setting is invalid" msgstr "Le paramètre du port d'écoute n’est pas valide" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Port d'écoute pour les requêtes DNS entrantes." @@ -4678,7 +5245,7 @@ msgstr "Port d'écoute pour les requêtes DNS entrantes." msgid "Load" msgstr "Charge" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Charge moyenne" @@ -4686,27 +5253,28 @@ msgstr "Charge moyenne" msgid "Load configuration…" msgstr "Chargement de la configuration…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Chargement des données…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Chargement du contenu des répertoires…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Chargement de la vue…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Local" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Adresse IP locale" @@ -4726,11 +5294,12 @@ msgstr "Adresse IP locale à attribuer" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Adresse IPv4 locale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Serveur DNS IPv6 local" @@ -4746,47 +5315,73 @@ msgstr "Adresse IPv6 locale" msgid "Local Startup" msgstr "Démarrage local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Heure locale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "ULA locale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Domaine local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "Suffixe du domaine local ajouté aux noms du serveur DHCP et du fichier Hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Serveur local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Service local uniquement" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Clé de protection locale" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Localiser les requêtes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Verrouiller sur BSSID" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 -msgid "Log output level" -msgstr "Niveau de journalisation" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Événement journal \"%h…\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 -msgid "Log queries" -msgstr "Journaliser les requêtes" +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Connexion" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Ouvrir une session…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Déconnexion" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 +msgid "Log output level" +msgstr "Niveau de journalisation" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 +msgid "Log queries" +msgstr "Journaliser les requêtes" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:123 msgid "Logging" @@ -4811,39 +5406,30 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "Réseau logique auquel le tunnel sera ajouté (ponté) (facultatif)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Connexion" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Déconnexion" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "Filtrage perdu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Perte de secondes de signal (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "" "Adresse allouée la plus basse, spécifiée par un décalage à partir de " "l'adresse réseau." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Mode de compatibilité Lua active" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "Adresse MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Filtrage par adresses MAC" @@ -4851,16 +5437,15 @@ msgstr "Filtrage par adresses MAC" msgid "MAC Address For The Actor" msgstr "Adresse MAC pour l'acteur" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "Adresse MAC du Réseau Virtuel (VLAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4869,11 +5454,15 @@ msgstr "Adresse MAC du Réseau Virtuel (VLAN)" msgid "MAC address" msgstr "Adresse MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Filtrage par adresses MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Liste des adresses MAC" @@ -4887,6 +5476,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "La règle MAP est invalide" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "MBIM Cellulaire" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4908,15 +5501,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "MII Intervalle" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4926,7 +5523,7 @@ msgstr "" "chose comme les commandes ci-dessous :" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4935,69 +5532,69 @@ msgstr "" msgid "Manual" msgstr "Manuel" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Maître" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "Intervalle maximal RA" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Débit de données max. atteignable (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" -msgstr "" -"Nombre maximal de baux DHCP" +msgstr "Baux DHCP max" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" -msgstr "" -"Taille maximale des paquets EDNS0" +msgstr "Taille max. du paquet EDNS0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Nombre maximal de requêtes concurrentes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Âge maximal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Intervalle d'écoute maximum autorisé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Nombre maximum de baux DHCP actifs." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Nombre maximum autorisé de requêtes DNS simultanées." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "Taille maximale autorisée des paquets UDP de l'EDNS0." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Délai d'attente maximum que le modem soit prêt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Nombre maximum d'adresses allouées." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "Taille maximale de la table de surveillance" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -5006,10 +5603,14 @@ msgstr "" "title=\"Annonce de routeur, ICMPv6 Type 134\">RA
    . La valeur par " "défaut est de 600 secondes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Puissance d'émission maximale" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Peut empêcher la VoIP ou d’autres services de fonctionner." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -5036,7 +5637,7 @@ msgstr "Mémoire" msgid "Memory usage (%)" msgstr "Utilisation Mémoire (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -5044,10 +5645,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "Mesh ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Mesh ID" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Routage maillé" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Options liées au maillage et au routage" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Méthode non trouvée" @@ -5060,7 +5669,7 @@ msgstr "Méthode de surveillance des liens" msgid "Method to determine link status" msgstr "Méthode de détermination du statut des liens" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -5071,11 +5680,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "Intervalle minimal RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Durée de validité minimale de l'ARP" @@ -5083,7 +5692,7 @@ msgstr "Durée de validité minimale de l'ARP" msgid "Minimum Number of Links" msgstr "Nombre Minimum de Liens" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." @@ -5091,7 +5700,7 @@ msgstr "" "Temps minimum requis en secondes avant qu'une entrée ARP puisse être " "remplacée. Empêche la destruction du cache ARP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -5108,35 +5717,49 @@ msgstr "Port miroir pour le monitorage" msgid "Mirror source port" msgstr "Port source pour le mirrorring" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Données mobiles" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Domaine de la mobilité" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Mode" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Modèle" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Démontage du support du modem en cours." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5144,43 +5767,36 @@ msgstr "" "Connexion du modem en cours. Veuillez patienter. Ce processus se terminera " "au bout de 2 minutes." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Modem par défaut" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Interface Modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Déconnexion du modem en cours. Veuillez patienter." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Échec de la requête d'informations sur le modem" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Délai max. d'initialisation du modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "Le Modem est désactivé." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "ModemManager" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" @@ -5250,6 +5866,10 @@ msgstr "Descendre" msgid "Move up" msgstr "Monter" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Multi vers Unicast" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5257,19 +5877,23 @@ msgstr "Monter" msgid "Multicast" msgstr "Multidiffusion" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Mode multidiffusion" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Routage multidiffusion" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "Multidiffusion vers monodiffusion" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "Chaîne d'action NAT \"%h\"" @@ -5281,12 +5905,16 @@ msgstr "Mode NAT-T" msgid "NAT64 Prefix" msgstr "Préfixe NAT64" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "NAT64 prefix" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "NDP-Proxy esclave" @@ -5299,33 +5927,42 @@ msgid "NTP server candidates" msgstr "Serveurs NTP candidats" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Nom" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Nom du nouveau réseau" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Nom du périphérique de tunnel" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigation" #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:10 msgid "Nebula Network" -msgstr "" +msgstr "Réseau Nebula" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Rapport de voisinage" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "Validité du cache voisin" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5334,32 +5971,36 @@ msgstr "Validité du cache voisin" msgid "Network" msgstr "Réseau" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Codage du réseau" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "Mode réseau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "SSID du réseau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Utilitaires réseau" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "Adresse du réseau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Image de démarrage réseau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "Migration de la configuration du pont réseau" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Périphérique réseau" @@ -5372,7 +6013,7 @@ msgstr "Activité des périphériques réseau (noyau : netdev)" msgid "Network device is not present" msgstr "Le dispositif de réseau n'est pas présent" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "Table des périphériques réseau \"%h\"" @@ -5381,7 +6022,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "Bits d'en-tête de réseau %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Migration de la configuration du réseau ifname" @@ -5390,15 +6031,20 @@ msgstr "Migration de la configuration du réseau ifname" msgid "Network interface" msgstr "Interface réseau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "Identité du réseau" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Jamais" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Jamais" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5407,11 +6053,11 @@ msgstr "" "jamais transmis à un résolveur DNS, ils seront résolus seulement à partir du " "serveur DHCP ou des fichiers « hosts »." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Impossible de créer une nouvelle interface pour \"%s\": %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Nom de la nouvelle interface …" @@ -5419,13 +6065,13 @@ msgstr "Nom de la nouvelle interface …" msgid "Next »" msgstr "Prochain »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Non" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Aucun serveur DHCP configuré sur cette interface" @@ -5433,7 +6079,7 @@ msgstr "Aucun serveur DHCP configuré sur cette interface" msgid "No Data" msgstr "Aucune donnée" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Pas de chiffrement" @@ -5449,9 +6095,17 @@ msgstr "Pas de NAT-T" msgid "No RX signal" msgstr "Pas de signal RX" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Aucune interface WireGuard configurée." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5465,7 +6119,11 @@ msgstr "" msgid "No client associated" msgstr "Aucun client associé" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Aucun controle materiel spécifié" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "Aucune donnée" @@ -5474,8 +6132,8 @@ msgstr "Aucune donnée" msgid "No data received" msgstr "Aucune donnée reçue" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "Aucune application" @@ -5488,15 +6146,11 @@ msgstr "Aucune application" msgid "No entries available" msgstr "Aucune entrée disponible" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Aucune entrée dans ce répertoire" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Aucun fichier trouvé" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5512,7 +6166,7 @@ msgstr "" msgid "No host route" msgstr "Pas d’itinéraire hôte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5533,30 +6187,39 @@ msgstr "Plus d'esclaves disponibles" msgid "No more slaves available, can not save interface" msgstr "Plus d'esclaves disponibles, ne peut pas sauver l'interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Pas de cache négatif" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "Aucun jeu de règles nftables n'est chargé." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Pas de mot de passe positionné !" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Aucun pair connecté" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "Aucun pair n'a encore été défini." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Aucune clé publique n’est présente pour le moment." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "Pas de règles dans cette chaîne" @@ -5570,7 +6233,8 @@ msgid "No validation or filtering" msgstr "Pas de validation ni de filtrage" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Aucune zone attribuée" @@ -5582,37 +6246,40 @@ msgstr "Aucune zone attribuée" msgid "Noise" msgstr "Bruit" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Rapport signal sur bruit (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Marge de bruit" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Bruit :" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Erreurs CRC non préemptives (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Non-wildcard" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Rien" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Pas trouvé" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Non Membre" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Pas associé" @@ -5625,7 +6292,7 @@ msgstr "Non connecté" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Non présent" @@ -5637,7 +6304,7 @@ msgstr "Non démarré au boot" msgid "Not supported" msgstr "Non pris en charge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5645,6 +6312,14 @@ msgstr "" "Note : Certains pilotes sans fil ne supportent pas complètement la norme " "802.11w. Par exemple, mwlwifi peut avoir des problèmes" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Note : vous pouvez avoir besoin d'un proxy DHCP ( indisponible) lorsque vous " +"spécifiez un port de relais non standard (addr#port)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Remarques" @@ -5653,7 +6328,7 @@ msgstr "Remarques" msgid "Notice" msgstr "Remarque" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5661,7 +6336,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "Nombre de rapports d'adhésion à l'IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "Nombre d'entrées DNS gardées en cache (maximum 10000 ; entrez \"0\" pour " @@ -5680,7 +6355,7 @@ msgid "Obfuscated Password" msgstr "Mot de passe obscurci" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5691,6 +6366,7 @@ msgid "Obtain IPv6 address" msgstr "Obtenir une adresse IPv6" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Éteint" @@ -5699,6 +6375,14 @@ msgstr "Éteint" msgid "Off-State Delay" msgstr "Durée éteinte" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"Éteint : vlanXXX, par exemple vlan1. Activé : " +"vlan_tagged_interface.XXX, par exemple eth0.1." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Allumé" @@ -5707,15 +6391,15 @@ msgstr "Allumé" msgid "On-State Delay" msgstr "Durée allumée" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "Route On-Link" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Il faut indiquer un nom d'hôte ou une adresse MAC !" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "L’un des éléments suivants : %s" @@ -5733,7 +6417,11 @@ msgstr "Une ou plusieurs valeurs invalides/requises sur onglet" msgid "One or more required fields have no value!" msgstr "Un ou plusieurs champs n'ont pas de valeur !" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" "Permet uniquement la communication avec les ports de pont non isolés " @@ -5746,25 +6434,24 @@ msgstr "" "Seulement si l'esclave actif actuel est défaillant et que l'esclave primaire " "est en marche (défaillance, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "Ouvrir l'aperçu des règles iptables…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Ouvrir la liste…" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5782,7 +6469,7 @@ msgstr "" "Fonctionne en mode relais si une interface maître désignée est " "configurée et active, sinon repasse en mode serveur ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." @@ -5790,12 +6477,24 @@ msgstr "" "Fonctionne en mode relais si un préfixe IPv6 amont est présent, " "sinon désactive le service." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Fréquence de fonctionnement" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "Option \"%s\" contient une valeur erronée." @@ -5803,22 +6502,33 @@ msgstr "Option \"%s\" contient une valeur erronée." msgid "Option \"%s\" must not be empty." msgstr "Option \"%s\" doit être vide." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Option modifiée" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Option retirée" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Facultatif" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Notes facultatives, en format libre, concernant cet appareil" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" +"Facultatif, en secondes. Si la valeur est '0', aucune reconnexion n'est " +"tentée." + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5827,7 +6537,7 @@ msgstr "" "Facultatif. 32 bits pour les paquets chiffrés sortants. Entrez la valeur en " "hexadécimal, en commençant par 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5839,7 +6549,7 @@ msgstr "" "d'un serveur délégant, utiliser le suffixe (comme '::1') pour former " "l'adresse IPv6 ('a:b:c:d::1') de l'interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5848,11 +6558,11 @@ msgstr "" "supplémentaire de cryptographie à clé symétrique pour la résistance post-" "quantique." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Facultatif. Créer des itinéraires pour les IP autorisés pour ce pair." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Facultatif. Description du pair." @@ -5860,7 +6570,7 @@ msgstr "Facultatif. Description du pair." msgid "Optional. Do not create host routes to peers." msgstr "Optionnel. Ne créez pas de routes hôtes vers des homologues." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." @@ -5868,7 +6578,7 @@ msgstr "" "Facultatif. Hôte du pair. Les noms sont résolus avant de mettre en place " "l'interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5886,11 +6596,11 @@ msgstr "Facultatif. Unité de transmission maximale de l'interface XFRM." msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Facultatif. Unité de transmission maximale de l'interface du tunnel." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Facultatif. Port de pair." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5902,7 +6612,7 @@ msgstr "" "ou un code QR si disponible. Elle peut être supprimée après l'exportation de " "la configuration." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5919,7 +6629,7 @@ msgstr "Facultatif. Port UDP utilisé pour les paquets sortants et entrants." msgid "Options" msgstr "Options" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.43,192.168.4.4\" pour la route par défaut. 0.0.0.0 signifie \"l'adresse du système qui exécute dnsmasq\"." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "Options :" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Ordinal : plus bas arrive en premier." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Intervalle d'origine" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "Autres :" @@ -5954,7 +6673,7 @@ msgstr "Sortant :" msgid "Outgoing checksum" msgstr "Somme de contrôle sortante" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "Interface sortante" @@ -5962,6 +6681,7 @@ msgstr "Interface sortante" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "Clé sortante" @@ -5985,21 +6705,23 @@ msgstr "Zone de sortie" msgid "Overlap" msgstr "Chevauchement" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "Remplacer la table de routage IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "Remplacer la table de routage IPv6" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -6007,6 +6729,7 @@ msgstr "Remplacer la table de routage IPv6" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "Modifier le MTU" @@ -6028,7 +6751,7 @@ msgstr "Remplacer TOS" msgid "Override TTL" msgstr "Remplacer TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -6044,7 +6767,7 @@ msgstr "Remplacer le nom de l’interface par défaut" msgid "Override the gateway in DHCP responses" msgstr "Modifier la passerelle dans les réponses DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -6058,9 +6781,9 @@ msgstr "Modifier la table utilisée pour les routes internes" #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:3 msgid "Overview" -msgstr "Aperçu" +msgstr "Vue d'ensemble" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "Remplacer le fichier existant \"%s\" ?" @@ -6068,17 +6791,30 @@ msgstr "Remplacer le fichier existant \"%s\" ?" msgid "Overwrite the current settings with the imported configuration?" msgstr "Remplacer les paramètres actuels par la configuration importée ?" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Utilisateur" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (les deux)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -6090,8 +6826,9 @@ msgid "PAP/CHAP password" msgstr "Mot de passe PAP/CHAP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -6102,6 +6839,7 @@ msgstr "Mot de passe PAP/CHAP" msgid "PAP/CHAP username" msgstr "Identifiant PAP/CHAP" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "Type de PDP" @@ -6111,8 +6849,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "code PIN" @@ -6122,7 +6861,7 @@ msgstr "code PIN" msgid "PIN code rejected" msgstr "Code PIN rejeté" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "Push PMK R1" @@ -6163,28 +6902,37 @@ msgstr "Décalage PSID" msgid "PSID-bits length" msgstr "Longueur des bits PSID" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM (Mode de transfert de paquets)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "Paramètres PXE/TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "Direction de paquets" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "Marque de paquet" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Temps de réception des paquets" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "Paquets" @@ -6193,24 +6941,31 @@ msgstr "Paquets" msgid "Packets To Transmit Before Moving To Next Slave" msgstr "Paquets à transmettre avant de passer au prochain esclave" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "" +msgstr[1] "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Fait partie de la zone %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "" "Pass-through (Mise en miroir du périphérique physique sur un seul VLAN MAC)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Mot de passe" @@ -6218,11 +6973,11 @@ msgstr "Mot de passe" msgid "Password authentication" msgstr "Authentification par mot de passe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Mot de passe de la clé privée" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "Mot de passe de la clé privée interne" @@ -6233,21 +6988,21 @@ msgstr "Mot de passe de la clé privée interne" msgid "Password strength" msgstr "Force du mot de passe" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "Password2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "Coller ou glisser le fichier clé SSH…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "" "Collez ou faites glisser le fichier de configuration des pairs WireGuard " "(wg0.conf)…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " @@ -6258,31 +7013,31 @@ msgstr "" "correspondante permettant à ce système de se connecter à l'interface " "WireGuard locale." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "Collez ou glissez le fichier de configuration WireGuard fourni…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Chemin du certificat CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Chemin du certificat client" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Chemin de la clé privée" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Chemin du certificat CA interne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Chemin du certificat client interne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Chemin d'accès à la clé privée interne" @@ -6304,11 +7059,19 @@ msgstr "En pause" msgid "Peak:" msgstr "Pic :" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Pair" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Peer Details" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Adresse IP du pair à attribuer" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "Adresse MAC de l'homologue" @@ -6317,11 +7080,11 @@ msgstr "Adresse MAC de l'homologue" msgid "Peer address is missing" msgstr "L'adresse du pair est manquante" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Nom du dispositif homologue" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Homologue désactivé" @@ -6352,10 +7115,14 @@ msgstr "Réinitialiser" msgid "Permission denied" msgstr "Permission refusée" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Maintien persistant" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Intervalle de reconnexion persistant" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "Le paramètre PersistentKeepAlive n'est pas valide" @@ -6364,13 +7131,13 @@ msgstr "Le paramètre PersistentKeepAlive n'est pas valide" msgid "Phy Rate:" msgstr "Débit physique :" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Paramètres physiques" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6383,11 +7150,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pqts." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Saisissez votre nom d'utilisateur et mot de passe." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Veuillez sélectionner le fichier à téléverser." @@ -6395,56 +7162,74 @@ msgstr "Veuillez sélectionner le fichier à téléverser." msgid "Policy" msgstr "Politique" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "Politique : %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Isolation des ports" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Statut du port :" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Négation potentielle de : %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Mode de gestion de l'énergie" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Erreurs CRC préventives (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Préférer LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Préférer l'UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Préfixe Délégué" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "Suppresseur de préfixe" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Clé pré-partagée" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "Clé pré-partagée en cours d’utilisation" @@ -6469,15 +7254,18 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Empêche la communication directe entre clients" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"Empêche un client sans fil de parler à un autre. Ce paramètre n'affecte que " +"les paquets sans balise VLAN (paquets non balisés)." + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Esclave primaire" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "Identité du VLAN principal" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6490,29 +7278,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "Le primaire devient un esclave actif dès qu'il revient (toujours, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Priorité" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "Privé" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "Privé (Empêche la communication entre les MAC VLAN)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" -msgstr "Clé privée" +msgstr "Clé Privée" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "Clé privée présente" @@ -6530,8 +7320,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6543,7 +7333,7 @@ msgstr "Protocole" msgid "Provide NTP server" msgstr "Fournir serveur NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6551,7 +7341,7 @@ msgstr "" "Fourni un serveur DHCPv6 sur cette interface et répond aux sollicitations et " "demandes DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Donner un nouveau réseau" @@ -6563,25 +7353,36 @@ msgstr "" "Fournir le serveur NTP à l'interface sélectionnée ou, si non spécifié, à " "toutes les interfaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Serveur Proxy" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Clé publique" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "La clé publique est manquante" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "Clé publique : %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6612,61 +7413,83 @@ msgstr "QMI Cellulaire" msgid "Quality" msgstr "Qualité" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." -msgstr "" -"Interroger tous les serveurs DNS disponibles en amont." +msgstr "Interrogez tous les résolveurs en amont disponibles." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Intervalle de requête" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Intervalle de réponse aux requêtes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "Durée de vie de la clé R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "Détenteur de la clé R1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Port de la comptabilisation Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Secret de la comptabilisation Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Serveur de la comptabilisation Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Port de l'authentification Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Secret de l'authentification Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Serveur de l'authentification Radius" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "RADIUS Attribution VLAN dynamique" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "RADIUS par VLAN STA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "RADIUS VLAN Schéma de Nommage du pont" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "RADIUS Nom VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "RADIUS VLAN Tagged Interface" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "Mode NAT-T RFC3947" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "Préauth RSN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "Seuil RSSI pour l’adhésion" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Seuil RTS/CTS" @@ -6679,10 +7502,18 @@ msgstr "Reçu" msgid "RX Rate" msgstr "Débit en réception" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "Taux RX / Taux TX" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"Mesure des ressources radio - Envoie des balises pour faciliter " +"l’itinérance. Tous les clients ne le prennent pas en charge." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6694,11 +7525,11 @@ msgstr "" "Octets bruts codés en hexadécimal. Laissez le champ vide, sauf si votre FAI " "l'exige" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Lisez /etc/ethers pour configurer le serveur DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Voulez-vous vraiment changer de protocole ?" @@ -6706,11 +7537,11 @@ msgstr "Voulez-vous vraiment changer de protocole ?" msgid "Realtime Graphs" msgstr "Graphiques temps-réel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Date limite de réassociation" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Protection contre l'attaque « rebind »" @@ -6734,11 +7565,39 @@ msgstr "Redémarrage du système d'exploitation de votre équipement" msgid "Receive" msgstr "Reçoit" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Données reçues" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Recommandé. Adresses IP de l'interface WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Délai de reconnexion" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Reconnecter cet interface" @@ -6746,12 +7605,12 @@ msgstr "Reconnecter cet interface" msgid "Redirect to HTTPS" msgstr "Rediriger vers HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "Redirection vers le port local %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "Redirection vers le système local" @@ -6760,31 +7619,39 @@ msgstr "Redirection vers le système local" msgid "References" msgstr "Références" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Actualiser les canaux" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Rafraîchissement" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "Rejeter le paquet IPv4 avec ICMP type %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "Rejeter le paquet avec ICMP type %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "Rejeter le paquet avec ICMPv6 type %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "Rejeter le paquet avec réinitialisation TCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" @@ -6793,6 +7660,8 @@ msgstr "" "ou égale à la valeur spécifiée" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Relais" @@ -6802,6 +7671,11 @@ msgstr "Relais" msgid "Relay Bridge" msgstr "Pont-relais" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"Relayer les requêtes DHCP ailleurs. OK : v4↔v4, v6↔v6. Pas OK : v4↔v6, v6↔v4." + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Relais entre réseaux" @@ -6811,6 +7685,14 @@ msgstr "Relais entre réseaux" msgid "Relay bridge" msgstr "Pont-relais" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6820,6 +7702,7 @@ msgstr "Adresse IPv4 distante" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Adresse IPv4 distante ou FQDN" @@ -6832,15 +7715,27 @@ msgstr "Adresse IPv6 distante" msgid "Remote IPv6 address or FQDN" msgstr "Adresse IPv6 distante ou FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Désinstaller" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" +"Supprimer les adresses IPv4 des résultats et ne renvoyer que les adresses " +"IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" +"Supprimer les adresses IPv6 des résultats et ne renvoyer que les adresses " +"IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "Supprimez de la configuration les paramètres des dispositifs associés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Remplacer la configuration sans-fil" @@ -6870,7 +7765,8 @@ msgstr "Exiger la somme de contrôle entrante (facultatif)." msgid "Require incoming packets serialization (optional)." msgstr "Exiger la sérialisation des paquets entrants (facultatif)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Obligatoire" @@ -6885,8 +7781,10 @@ msgstr "Obligatoire. Clé privée encodée en Base64 pour cette interface." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Required. Path to the .yml config file for this interface." msgstr "" +"Obligatoire. Chemin d'accès au fichier de configuration .yml pour cette " +"interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "Obligatoire. Clé publique de l’homologue WireGuard." @@ -6898,67 +7796,75 @@ msgstr "Obligatoire. Interface sous-jacente." msgid "Required. XFRM interface ID to be used for SA." msgstr "Obligatoire. Identité de l'interface XFRM à utiliser pour la SA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" +"Requis : Rejette l'authentification si le serveur RADIUS ne fournit pas les " +"attributs VLAN appropriés." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Nécessite hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Nécessite hostapd avec prise en charge d'EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Nécessite hostapd avec prise en charge EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Nécessite hostapd avec le support OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Nécessite hostapd avec prise en charge SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Nécessite hostapd avec prise en charge WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Requiert wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Requiert wpa-supplicant avec le support EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Requiert wpa-supplicant avec support EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Requiert wpa-supplicant avec support OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Requiert wpa-supplicant avec support SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Nécessite wpa-supplicant avec prise en charge WEP" @@ -6967,7 +7873,7 @@ msgid "Reselection policy for primary slave" msgstr "Reselection politique pour esclave primaire" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6982,20 +7888,24 @@ msgstr "Remise à zéro des compteurs" msgid "Reset to defaults" msgstr "Ré-initialisation" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Fichiers Resolv et Hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Fichier de résolution des noms" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Liste des domaines à forcer à une adresse IP." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Ressource non trouvée" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Redémarrer" @@ -7004,7 +7914,7 @@ msgstr "Redémarrer" msgid "Restart Firewall" msgstr "Redémarrer le pare-feu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Redémarrer l'interface radio" @@ -7016,7 +7926,7 @@ msgstr "Restaurer" msgid "Restore backup" msgstr "Restaurer une sauvegarde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -7024,84 +7934,99 @@ msgstr "" "Trouve le nom d'hôte suivant le sous-réseau d'où vient la requête si " "plusieurs adresses IPs sont possibles." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Montrer/cacher le mot de passe" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "Filtre de chemin inverse" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Annuler les modifications" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Annuler les modifications" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "La demande d'annulation a échoué, statut %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Annulation de la configuration…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "Réécrire la destination vers %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "Réécrire la destination vers %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Réécrire la destination vers %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Réécrire la destination vers %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "Réécriture de la source vers %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "Réécriture de la source vers %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" "Réécriture de la source vers %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" "Réécriture de la source vers %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "Réécrire vers l’adresse de l’appareil de sortie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" +"Réseau de sécurité robuste (RSN) : Autorise la préauthentification en " +"itinérance pour les réseaux WPA2-EAP (et l'annonce dans les balises WLAN). " +"Ne fonctionne que si l'interface réseau spécifiée est un pont. Raccourcit le " +"processus de réassociation qui prend du temps." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Robustesse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -7119,19 +8044,19 @@ msgstr "Préparation root" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Politique Round-Robin (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Route IP autorisées" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "Chaîne d'action de l'itinéraire \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Type d'itinéraire" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7151,6 +8076,10 @@ msgstr "Mot de passe du routeur" msgid "Routing" msgstr "Routage" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Algorithme de routage" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7165,24 +8094,24 @@ msgstr "" msgid "Rule" msgstr "Règle" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "Actions de la règle" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "Commentaire sur la règle : %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "Chaîne de conteneurs de règles \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "Correspondances de règles" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Type de règle" @@ -7203,11 +8132,24 @@ msgstr "Erreur d'exécution" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7225,15 +8167,15 @@ msgstr "Port du serveur SSH" msgid "SSH username" msgstr "Nom d'utilisateur SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "Clés SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7250,7 +8192,7 @@ msgstr "Serveur SSTP" msgid "SWAP" msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7261,7 +8203,7 @@ msgid "Save" msgstr "Sauvegarder" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Enregistrer et Appliquer" @@ -7278,7 +8220,7 @@ msgstr "Enregistrer mtdblock" msgid "Save mtdblock contents" msgstr "Enregistrer le contenu de mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Scan" @@ -7287,11 +8229,16 @@ msgstr "Scan" msgid "Scheduled Tasks" msgstr "Tâches Régulières" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Section ajoutée" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Section retirée" @@ -7309,9 +8256,9 @@ msgstr "" "vérification du format de l'image échoue. N'utilisez que si vous êtes sûr " "que le microprogramme est correct et destiné à votre appareil !" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Sélectionner un fichier…" @@ -7321,7 +8268,7 @@ msgstr "" "Sélectionne la politique de hachage de transmission à utiliser pour la " "sélection de l'esclave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7329,7 +8276,7 @@ msgstr "" "Envoyer des messages RA annonçant ce périphérique comme routeur IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "Envoyer des redirections ICMP" @@ -7350,11 +8297,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "Envoyer le nom d'hôte de cet appareil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Serveur" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Adresse du serveur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Nom du serveur" @@ -7379,17 +8330,21 @@ msgstr "La session a expiré" msgid "Set Static" msgstr "Définir statique" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "Définir le champ d'en-tête %s à %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" "Définit l'interface comme esclave externe NDP-Proxy. Désactivé par défaut." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7402,7 +8357,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "Définir la même adresse MAC à tous les esclaves" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7413,7 +8368,7 @@ msgstr "" "title=\"Annonce de routeur\">RA. Lorsqu'il est activé, les clients " "effectueront une autoconfiguration d'adresse IPv6 sans état." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7429,11 +8384,15 @@ msgstr "Définir sur l’esclave actuellement actif (actif, 1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "Fixe le premier esclave ajouté au lien (follow, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Configurer le serveur DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Configurez les itinéraires pour les proxysIPv6 voisins." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7441,33 +8400,39 @@ msgid "Setting PLMN failed" msgstr "Échec de la définition du PLMN" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "Échec de la définition du mode de fonctionnement" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Paramètres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "Configurez les itinéraires pour les proxysIPv6 voisins." - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "Secondes gravement erronées (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" +msgstr "" +"Paramètres pour aider les clients sans fil à se déplacer entre plusieurs " +"points d'accès : 802.11r, 802.11k et 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "IG court" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Préambule court" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Afficher la liste des fichiers de la sauvegarde actuelle" @@ -7480,16 +8445,16 @@ msgstr "Afficher les chaînes vides" msgid "Show raw counters" msgstr "Afficher les compteurs bruts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Arrêter cette interface" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7497,15 +8462,15 @@ msgstr "Arrêter cette interface" msgid "Signal" msgstr "Signal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Signal / bruit" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Atténuation du signal (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Taux de rafraîchissement du signal" @@ -7513,12 +8478,12 @@ msgstr "Taux de rafraîchissement du signal" msgid "Signal:" msgstr "Signal :" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Taille" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Taille du cache de requête DNS" @@ -7536,12 +8501,12 @@ msgid "Skip from backup files that are equal to those in /rom" msgstr "" "Ignorer les fichiers de sauvegarde qui sont égaux à ceux présents dans /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Passer au contenu" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Passer à la navigation" @@ -7559,14 +8524,10 @@ msgstr "VLAN logiciel" msgid "Some fields are invalid, cannot save values!" msgstr "Certains champs sont invalides, ne peut sauvegarder les valeurs !" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Désolé, l'objet que vous avez demandé n'as pas été trouvé." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Désolé, le serveur à rencontré une erreur inattendue." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7578,8 +8539,8 @@ msgstr "" "au wiki pour connaître les instructions d'installation spécifiques à votre " "matériel." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7606,7 +8567,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "Port source" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7614,7 +8575,7 @@ msgstr "" "Options de démarrage spéciales PXE pour Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7623,7 +8584,7 @@ msgstr "" "Si elle n'est pas spécifiée, le domaine de recherche DNS du périphérique " "local sera annoncé." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7634,7 +8595,7 @@ msgstr "" "serveur DNS IPv6, sauf si l'option Serveur Local DNS IPv6 est " "désactivée." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7664,7 +8625,7 @@ msgstr "Spécifie les adresses IP à utiliser pour la surveillance de l'ARP" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "Spécifie la fréquence de surveillance des liens MII en millisecondes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "Spécifie la valeur TOS à faire correspondre dans les en-têtes IP" @@ -7672,7 +8633,7 @@ msgstr "Spécifie la valeur TOS à faire correspondre dans les en-têtes IP" msgid "Specifies the aggregation selection logic to use" msgstr "Spécifie la logique de sélection d’agrégation à utiliser" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" "Spécifie le sous-réseau de destination à faire correspondre (notation CIDR)" @@ -7681,7 +8642,7 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "Indique le répertoire auquel le périphérique est rattaché" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7691,7 +8652,7 @@ msgstr "" "routeur\">RA, par exemple pour indiquer aux clients de demander des " "informations supplémentaires via l'état DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" @@ -7700,7 +8661,7 @@ msgstr "" "par exemple 0xFF pour correspondre à la marque 255 ou 0x0/0x1 pour " "correspondre à n’importe quelle valeur de marque paire" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "Spécifie le nom de l’interface logique entrante" @@ -7735,7 +8696,7 @@ msgid "" "dead" msgstr "Indique le délai après quoi les hôtes seront supposés disparus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7757,7 +8718,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "Précise le mode à utiliser pour cette interface de liaison" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7800,15 +8761,15 @@ msgstr "" "Spécifie le nombre de secondes entre les instances où le pilote de liaison " "envoie des paquets d’apprentissage à chaque commutateur homologue esclaves" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "Spécifie l'ordre des règles IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "Spécifie le nom de l'interface logique sortante" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7836,19 +8797,19 @@ msgstr "" "Spécifie la stratégie de resélection pour l'esclave princ. si défaillance de " "l'esclave actif ou de récupération de l'esclave principal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "Spécifie la mesure de l'itinéraire à utiliser" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "Spécifie le type d’itinéraire à créer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "Spécifie l'action de routage cible de la règle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "Spécifie le sous-réseau source à faire correspondre (notation CIDR)" @@ -7872,7 +8833,7 @@ msgstr "" "Spécifie le temps en millisecondes d’attendre avant d’activer un esclave " "après une détection de récupération de lien" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7996,15 +8957,23 @@ msgstr "" "Spécifiez une Unité de Transmission Maximale (MTU) autre que la valeur par " "défaut (1280 octets)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Spécifiez ici la clé secrète de chiffrage." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "Délai d’expiration du cache voisin obsolète" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Démarrer" @@ -8017,16 +8986,16 @@ msgstr "Démarrer WPS" msgid "Start priority" msgstr "Priorité de démarrage" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Lancer l'actualisation" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "La configuration de départ s'applique…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Démarrage de l'analyse sans fil ..." @@ -8035,6 +9004,10 @@ msgstr "Démarrage de l'analyse sans fil ..." msgid "Startup" msgstr "Démarrage" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Routes IPv4 statiques" @@ -8048,7 +9021,7 @@ msgstr "Routes IPv6 statiques" msgid "Static Lease" msgstr "Bail statique" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Baux Statiques" @@ -8058,7 +9031,7 @@ msgstr "Baux Statiques" msgid "Static address" msgstr "Adresse statique" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -8069,18 +9042,18 @@ msgstr "" "interfaces sans configuration dynamique où l'on fournit un bail aux seuls " "hôtes configurés." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Limite d'inactivité de la station" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "État" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Arrêter" @@ -8089,8 +9062,8 @@ msgstr "Arrêter" msgid "Stop WPS" msgstr "Arrêter WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Arrêter le rafraîchissement" @@ -8098,11 +9071,11 @@ msgstr "Arrêter le rafraîchissement" msgid "Storage" msgstr "Stockage" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "Filtrage strict" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Ordre strict" @@ -8111,15 +9084,15 @@ msgid "Strong" msgstr "Forte" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Soumettre" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Supprimer la journalisation" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" "Supprimer la journalisation du fonctionnement de routine pour le protocole " @@ -8154,7 +9127,7 @@ msgstr "Commutateur VLAN" msgid "Switch port" msgstr "Port du commutateur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Changer de protocole" @@ -8164,7 +9137,7 @@ msgstr "Changer de protocole" msgid "Switch to CIDR list notation" msgstr "Passer à la notation de liste CIDR" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Lien symbolique" @@ -8176,8 +9149,16 @@ msgstr "Synchroniser avec le serveur NTP" msgid "Sync with browser" msgstr "Synchroniser avec le navigateur" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Syntaxe : /fqdn[/fqdn...]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Syntaxe : _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -8201,9 +9182,9 @@ msgstr "Propriétés système" msgid "System log buffer size" msgstr "Taille du tampon du journal système" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "Le système fonctionne en mode de récupération (initramfs)." @@ -8232,7 +9213,7 @@ msgstr "Port source TCP" msgid "TCP:" msgstr "TCP :" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Racine du serveur TFTP" @@ -8245,26 +9226,37 @@ msgstr "Emission" msgid "TX Rate" msgstr "Débit en émission" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "Longueur de la file d'attente TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Table" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Tagué" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Cible" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "Plate-forme cible" @@ -8280,7 +9272,7 @@ msgstr "Espace temporaire" msgid "Terminate" msgstr "Éteindre" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8290,7 +9282,7 @@ msgstr "" "messages RA. Le " "minimum est de 1280 octets." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." @@ -8298,7 +9290,7 @@ msgstr "" "L’indicateur Configuration d’adresse gérée (M) indique que les " "adresses IPv6 sont disponibles via DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -8306,7 +9298,7 @@ msgstr "" "L'indicateur Mobile IPv6 Home Agent (H) indique que le dispositif " "fait également office d'agent d'origine Mobile IPv6 sur cette liaison." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8326,7 +9318,11 @@ msgstr "" "Le paquet qrencode est nécessaire pour générer une image de code QR " "de la configuration." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8343,18 +9339,24 @@ msgstr "" "vous devez maintenant utiliser le nom d'utilisateur brut au lieu de l'ID " "utilisateur!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "L'adresse IP %h est déjà utilisée par un autre bail statique" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "L’adresse IP est en dehors de toute plage d’adresses du pool DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "Adresse IP du serveur de démarrage" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -8363,6 +9365,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -8381,6 +9384,12 @@ msgstr "" "L'adresse IPv6 ou le nom de domaine entièrement qualifié de l'extrémité du " "tunnel distant." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8393,7 +9402,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "La LED clignote avec la fréquence d'allumage/extinction configurée" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "La LED clignote pour simuler un rythme cardiaque réel." @@ -8412,7 +9421,7 @@ msgstr "La LED est toujours désactivée par défaut." msgid "The LED is always in default state on." msgstr "La LED est toujours allumée par défaut." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" @@ -8420,15 +9429,19 @@ msgstr "" "L'adresse MAC %h est déjà utilisée par un autre bail statique dans le même " "pool DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "La MTU ne doit pas dépasser la MTU du périphérique parent de %d octets" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "L'Identité du VLAN doit être unique" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "Algorithme utilisé pour découvrir les itinéraires de maillage" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8442,7 +9455,7 @@ msgstr "" "Le fichier de configuration n'a pas pu être chargé en raison de l'erreur " "suivante:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8450,7 +9463,7 @@ msgstr "" "Le SSID correct doit être spécifié manuellement lors de la connexion à un " "réseau sans fil caché" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8477,12 +9490,12 @@ msgstr "" "Le fichier de périphérique de la mémoire ou de la partition (par exemple. /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "Le nom du périphérique «%s» est déjà pris" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." @@ -8490,7 +9503,7 @@ msgstr "" "La configuration réseau existante doit être modifiée pour que LuCI " "fonctionne correctement." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8513,7 +9526,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Les règles suivantes sont actuellement actives sur ce système." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" "La fréquence est directement proportionnelle à la charge moyenne du CPU sur " @@ -8523,19 +9536,19 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "L'adresse de passerelle ne doit pas être une adresse IP locale" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" "La configuration générée peut être importée dans une application cliente " "WireGuard pour configurer une connexion vers ce périphérique." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "La clé publique SSH donnée a déjà été ajoutée." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8543,15 +9556,36 @@ msgstr "" "La clé publique SSH donnée n'est pas valide. Veuillez fournir les clés " "publiques RSA ou ECDSA appropriées." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"Le réglage de pénalité de saut permet de modifier la préférence de batman-" +"adv pour les itinéraires multihop par rapport aux itinéraires courts. La " +"valeur est appliquée au TQ de chaque OGM transféré, propageant ainsi le coût " +"d’un saut supplémentaire (le paquet doit être reçu et retransmis, ce qui " +"coûte du temps d’antenne)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "Nom d’hôte du serveur d’amorçage" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "L'interface n'a pas pu être trouvée" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Le nom de l'interface est déjà utilisé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Le nom d'interface est trop long" @@ -8576,6 +9610,7 @@ msgstr "Adresse IPv4 locale" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "Adresse IPv4 locale sur laquelle le tunnel est créé (facultatif)." @@ -8590,7 +9625,7 @@ msgstr "Le masque de réseau IPv4 local" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "Adresse IPv6 locale sur laquelle le tunnel est créé (facultatif)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8605,7 +9640,7 @@ msgstr "" "latence de sortie » du réseau. Une valeur réduite entraîne une réduction du " "temps de détection de la perte du dernier membre d’un groupe" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8618,7 +9653,7 @@ msgstr "" "valeur est élevée, moins le trafic est intense, car les réponses des hôtes " "sont réparties sur un intervalle plus long" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8626,7 +9661,7 @@ msgstr "" "Nombre maximal de sauts à publier dans les messages RA. Le maximum est de 255 sauts." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." @@ -8634,7 +9669,7 @@ msgstr "" "L’accès réseau à cet appareil pourrait être interrompu en modifiant les " "paramètres de l’interface «%h»." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Le nom du réseau est déjà utilisé" @@ -8655,7 +9690,7 @@ msgstr "" "un port d'uplink pour une connexion vers un réseau plus vaste, comme " "internet et les autres ports sont réservés au réseau local." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " @@ -8665,7 +9700,7 @@ msgstr "" "connecter. Il s’agit généralement d’une adresse IP publique statique, d’un " "nom d’hôte statique ou d’un domaine DDNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" "L'intervalle de réponse à la requête doit être inférieur à la valeur de " @@ -8680,7 +9715,7 @@ msgstr "La commande de redémarrage a échoué avec le code %d" msgid "The restore command failed with code %d" msgstr "La commande de restauration a échoué avec le code %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8691,15 +9726,15 @@ msgstr "" "valeur de robustesse peut être augmentée. IGMP est robuste aux pertes de " "paquets (Robustness-1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" "La cible de la règle est un saut vers une autre règle spécifiée par sa " "valeur de priorité" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8710,11 +9745,11 @@ msgstr "" "iproute2/rt_tables. Les alias spéciaux local (255), main (254) et default " "(253) sont également valides" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "Le mode %s sélectionné n'est pas compatible avec le chiffrement %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "Le jeton de sécurité soumis n'est pas valide ou a expiré !" @@ -8755,6 +9790,14 @@ msgstr "Le mot de passe du système a été modifié avec succès." msgid "The sysupgrade command failed with code %d" msgstr "La commande sysupgrade a échoué avec le code %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8782,12 +9825,20 @@ msgstr "" "Le fichier d'image téléchargé ne contient pas de format pris en charge. " "Assurez-vous de choisir le format d'image générique pour votre plate-forme." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "Cette valeur est remplacée par la configuration." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" +"Cette valeur indique l'intervalle (en millisecondes) pendant lequel Batman " +"adv envoie ses informations de protocole au réseau." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8796,19 +9847,20 @@ msgstr "" "de règles iptables et nftables est déconseillé et peut entraîner un filtrage " "incomplet du trafic." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Aucun bail actif" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Il n'y a aucun changement à appliquer" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8821,18 +9873,18 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "L'adresse IPv4 du relais" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" "Ce type d'authentification n'est pas applicable à la méthode EAP " "sélectionnée." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Cela ne ressemble pas à un fichier PEM valide" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8851,6 +9903,25 @@ msgstr "" "Il s'agit soit de la \"clé de mise à jour\" configurée pour le tunnel, soit " "du mot de passe du compte si aucune clé de mise à jour n'a été configurée" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Il s'agit du périphérique batman-adv auquel vous voulez lier le périphérique " +"physique du dessus. Si cette liste est vide, vous devez d'abord en créer " +"une. Si vous souhaitez acheminer le trafic maillé sur un périphérique de " +"réseau câblé, veuillez le sélectionner dans le sélecteur de périphérique ci-" +"dessus. Si vous souhaitez affecter l'interface batman-adv à un maillage " +"WiFi, ne sélectionnez pas de périphérique dans le sélecteur de périphériques " +"mais allez plutôt dans les paramètres WiFi et sélectionnez cette interface " +"comme réseau." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8867,11 +9938,9 @@ msgstr "" "Il s'agit de l'adresse de l'extrémité locale attribuée par le fournisseur de " "tunnels, elle se termine habituellement avec ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." -msgstr "" -"C'est le seul serveur DHCP sur le réseau local." +msgstr "C'est le seul serveur DHCP du réseau local." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "This is the plain username for logging into the account" @@ -8904,8 +9973,8 @@ msgstr "" "Cette liste donne une vue d'ensemble des processus en cours d'exécution et " "leur statut." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8922,33 +9991,41 @@ msgstr "Cette section ne contient pas encore de valeur" msgid "Time Synchronization" msgstr "Synchronisation de l'heure" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Publicité temporelle" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "Temps en millisecondes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "Temps en secondes à passer dans les états d'écoute et d'apprentissage" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Intervalle de temps pour retaper GTK" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Fuseau horaire" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "Délai d’expiration" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "Délai d’expiration en secondes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" "Délai d’expiration en secondes pour les adresses MAC apprises dans la base " "de données de transfert" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" "Délai d’expiration en secondes avant la mise à jour de la topologie en cas " @@ -8958,7 +10035,7 @@ msgstr "" msgid "Timezone" msgstr "Fuseau horaire" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the ." -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Ouvrir une session…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8984,7 +10057,7 @@ msgstr "" "micrologiciel dans son état initial, cliquer sur \"Réinitialiser\" (possible " "seulement avec les images de type squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Ton" @@ -8992,12 +10065,16 @@ msgstr "Ton" msgid "Total Available" msgstr "Total disponible" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -9009,11 +10086,11 @@ msgstr "Trafic" msgid "Traffic Class" msgstr "Classe de trafic" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "Chaîne de filtrage du trafic \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "Trafic correspondant à la règle : %.1000mPackets, %.1024mBytes" @@ -9030,6 +10107,26 @@ msgstr "Transmettre" msgid "Transmit Hash Policy" msgstr "Transmettre la politique de hachage" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Données transmises" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -9068,7 +10165,7 @@ msgstr "Interface du tunnel" msgid "Tunnel Link" msgstr "Lien de tunnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Dispositif de tunnel" @@ -9077,13 +10174,13 @@ msgid "Tx-Power" msgstr "Puissance d'émission" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Type" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Type de service" @@ -9132,7 +10229,7 @@ msgstr "Impossible de déterminer l'adresse IP externe" msgid "Unable to determine upstream interface" msgstr "Impossible de déterminer l'interface en amont" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Impossible d'envoyer" @@ -9183,19 +10280,31 @@ msgstr "Impossible de redémarrer le pare-feu: %s" msgid "Unable to save contents: %s" msgstr "Impossible d'enregistrer le contenu : %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Secondes non disponibles (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "Incapable de vérifier PIN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Annuler la configuration" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Format de données de réponse inattendu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -9213,7 +10322,7 @@ msgstr "" msgid "Unknown" msgstr "Inconnue" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Méthode de connexion inconnue et non prise en charge." @@ -9237,11 +10346,11 @@ msgstr "non-géré" msgid "Unmount" msgstr "Démonter" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Clé sans nom" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Changements non appliqués" @@ -9255,15 +10364,25 @@ msgid "Unsupported MAP type" msgstr "Type de carte non pris en charge" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Modem non pris en charge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Protocole non pris en charge" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Type de protocole non pris en charge." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "non marqué" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "Homologue sans titre" @@ -9275,7 +10394,7 @@ msgstr "Haut" msgid "Up Delay" msgstr "Délai d'attente" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Téléverser" @@ -9292,25 +10411,29 @@ msgstr "" msgid "Upload archive..." msgstr "Envoi de l'archive…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Téléverser un fichier" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Téléversement du fichier…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "Le chargement a été annulé" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Échec de la demande de téléchargement: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Téléchargement du fichier…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9320,7 +10443,7 @@ msgstr "" "attribuées avec un nom sous la forme wifinet# et le réseau sera " "redémarré pour appliquer la configuration mise à jour." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -9328,7 +10451,7 @@ msgstr "" "En appuyant sur « Continuer », la configuration des ponts sera mise à jour " "et le réseau sera redémarré pour appliquer la configuration mise à jour." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -9336,21 +10459,23 @@ msgstr "" "En appuyant sur « Continuer », les options ifname seront renommées et le " "réseau sera redémarré pour appliquer la configuration mise à jour." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." -msgstr "" -"Les serveurs DNS seront interrogés " -"dans l'ordre du fichier de résolution." +msgstr "Les résolveurs en amont seront saisis dans l'ordre du fichier résolv." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Durée de fonctionnement" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Utilisez /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Utiliser DHCP" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Utiliser des serveurs annoncés DHCP" @@ -9359,13 +10484,18 @@ msgstr "Utiliser des serveurs annoncés DHCP" msgid "Use DHCP gateway" msgstr "Utiliser la passerelle DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Utiliser DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Utiliser les serveurs DNS publiés par le distant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Utiliser les codes-pays ISO/IEC 3166 alpha2." @@ -9414,22 +10544,25 @@ msgstr "Utiliser comme système de fichiers racine (/)" msgid "Use broadcast flag" msgstr "Utiliser une marque de diffusion" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Utilisez la gestion IPv6 intégrée" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Utiliser des serveurs DNS spécifiques" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Utiliser la passerelle par défaut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Utiliser la métrique de la passerelle" @@ -9455,15 +10588,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "Utiliser la même source et la même destination pour chaque connexion" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Utiliser des certificats système" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "Utiliser des certificats système pour le tunnel intérieur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9495,11 +10628,11 @@ msgstr "" msgid "Used" msgstr "Utilisé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Clé utilisée" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9507,59 +10640,61 @@ msgstr "" "Utilisé à deux fins différentes : RADIUS NAS ID et 802.11r R0KH-ID. Pas " "nécessaire avec le WPA(2)-PSK normal." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Groupe d’utilisateurs" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Certificat utilisateur (codé PEM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "Identifiant de l'utilisateur" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Clé utilisateur (codée PEM)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Nom d'utilisateur" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "Utiliser la table des débits %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (Agrégateur de port Ethernet virtuel)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "Réseau Virtuel VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "Réseau Virtuel VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "Identité du Réseau Virtuel VLAN" @@ -9579,24 +10714,27 @@ msgstr "Adresse locale VPN" msgid "VPN Local port" msgstr "Port local VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "Protocole VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Serveur VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "VPN Certificat de serveur SHA256 hash" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Port du serveur VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "Hachage SHA1 du certificat du serveur VPN" @@ -9605,6 +10743,10 @@ msgstr "Hachage SHA1 du certificat du serveur VPN" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (et autres) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9618,7 +10760,7 @@ msgstr "Identificateur réseau VXLAN" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9626,8 +10768,8 @@ msgstr "" "Nécessite un support DNSSEC en amont ; vérifie que les réponses des domaines " "non signés proviennent réellement de domaines non signés." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9655,7 +10797,7 @@ msgstr "Vendeur" msgid "Vendor Class to send when requesting DHCP" msgstr "Classe de fournisseur à envoyer dans les requêtes DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" "Vérifier que les réponses de domaines non signés proviennent réellement de " @@ -9665,12 +10807,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Vérification du fichier image téléchargé." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Très élevé" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Ethernet virtuel" @@ -9678,34 +10820,46 @@ msgstr "Ethernet virtuel" msgid "Virtual dynamic interface" msgstr "Interface dynamique virtuelle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "Système ouvert WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Clé partagée WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Mot de passe WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "Itinérance Wi-Fi" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Mode WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "WNM Mode veille" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "Correctifs du mode veille WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Mot de passe WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9736,7 +10890,17 @@ msgstr "" msgid "Weak" msgstr "Faible" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Weight" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." @@ -9745,7 +10909,25 @@ msgstr "" "interfaces ayant une valeur de préférence plus élevée sont considérées en " "premier lors de l'allocation des sous-réseaux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Lorsqu'il est activé, le codage réseau augmente le débit WiFi en combinant " +"plusieurs trames en une seule, réduisant ainsi le temps d’antenne nécessaire." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Lorsqu'elle est activée, la table ARP distribuée forme un cache ARP à " +"l'échelle du maillage qui aide les clients non maillés à obtenir des " +"réponses ARP de manière beaucoup plus fiable et sans délai." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" @@ -9753,7 +10935,35 @@ msgstr "" "Lorsqu'il est activé, la passerelle est en liaison même si la passerelle ne " "correspond à aucun préfixe d'interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Lorsque cette option est activée, de nouvelles entrées de la table ARP sont " +"ajoutées à partir des demandes ou des réponses APR gratuites reçues, sinon " +"seules les entrées préexistantes de la table sont mises à jour, mais aucun " +"nouvel hôte n'est appris." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Lorsqu'elle est inversée, la LED est continuellement allumée et clignote au " +"lieu d'être éteinte par défaut et de clignoter en cas d'activité du système." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Lors de l’exécution du maillage sur plusieurs interfaces WiFi par nœud, " +"batman-adv est capable d’optimiser le flux de trafic pour obtenir des " +"performances maximales." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9763,7 +10973,7 @@ msgstr "" "Lorsqu'elle est activée, les options des touches R0/R1 ci-dessous ne sont " "pas appliquées. Désactivez-le pour utiliser les options des touches R0 et R1." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9771,7 +10981,7 @@ msgstr "" "Lorsque la QoS en mode Wi-Fi Multimedia (WMM) est désactivée, les clients " "peuvent être limités aux débits 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9780,16 +10990,25 @@ msgstr "" "l'efficacité du temps de communication peut être considérablement réduite." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Largeur" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "État de WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "L’homologue WireGuard est désactivé" @@ -9805,21 +11024,21 @@ msgid "Wireless Adapter" msgstr "Module sans-fil" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Réseau sans-fil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Présentation des réseaux sans-fil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Sécurité des réseaux sans-fil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Migration de la configuration sans-fil" @@ -9835,15 +11054,15 @@ msgstr "Le Wi-Fi est désactivé" msgid "Wireless is not associated" msgstr "Le Wi-Fi est non associé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Le réseau Wi-Fi est désactivé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Le réseau Wi-Fi est activé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Écrire les requêtes DNS reçues dans syslog." @@ -9855,7 +11074,7 @@ msgstr "Écrire les log systèmes dans un fichier" msgid "XOR policy (balance-xor, 2)" msgstr "Stratégie XOR (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9884,8 +11103,21 @@ msgstr "" ">Attention : Si vous désactivez des scripts essentiels comme " "\"réseau\", votre équipement pourrait ne plus être accessible !" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Vous pouvez ajouter plusieurs enregistrements pour la même cible." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Vous pouvez ajouter plusieurs enregistrements pour le même domaine." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" +"Vous pouvez ajouter plusieurs Relais To uniques sur la même adresse d'écoute." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9920,34 +11152,57 @@ msgstr "Paramètres ZRam" msgid "ZRam Size" msgstr "Taille ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto : _tcp, _udp, _sctp, _quic, ... ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service : _sip, _ldap, _imap, _stun, _xmpp-client, ... . (Remarque : bien " +"que _http soit possible, aucun navigateur ne prend en charge les " +"enregistrements SRV.)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "tous" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automatique" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automatique (désactivé)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automatique (activé)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "ponté" @@ -10004,25 +11259,30 @@ msgctxt "nft unit" msgid "day" msgstr "jour" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "désactiver" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "désactivé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "pilote par défaut" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "pilote par défaut (%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "p. ex. : --proxy 10.10.10.10" @@ -10031,14 +11291,23 @@ msgstr "p. ex. : --proxy 10.10.10.10" msgid "e.g: dump" msgstr "par exemple : vidage" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "activée" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "chaque %ds" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "expiré" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "forcé" @@ -10048,22 +11317,22 @@ msgstr "forcé" msgid "forward" msgstr "relayage" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "full-duplex" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "semi-duplex" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "valeur codée hexadécimale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "caché" @@ -10072,9 +11341,9 @@ msgctxt "nft unit" msgid "hour" msgstr "heure" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "mode hybride" @@ -10082,6 +11351,10 @@ msgstr "mode hybride" msgid "ignore" msgstr "ignorer" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -10096,11 +11369,19 @@ msgstr "clé composée de 8 à 63 caractères" msgid "key with either 5 or 13 characters" msgstr "clé composée de 5 ou 13 caractères" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "configuration gérée (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "sécurité moyenne" @@ -10109,11 +11390,11 @@ msgctxt "nft unit" msgid "minute" msgstr "minute" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minutes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "agent mère mobile (H)" @@ -10125,18 +11406,26 @@ msgstr "netif_carrier_ok ()" msgid "no" msgstr "non" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "pas de lien" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "pas de surcharge" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "valeur non vide" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "aucun" @@ -10147,20 +11436,20 @@ msgid "not present" msgstr "pas présent" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "Arrêté" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "sur le préfixe disponible" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "réseau ouvert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "autre configuration (O)" @@ -10169,6 +11458,10 @@ msgstr "autre configuration (O)" msgid "output" msgstr "sortie" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "il y a plus d'un jour" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -10186,23 +11479,34 @@ msgstr "valeur entière positive" msgid "random" msgstr "aléatoire" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "généré aléatoirement" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" +"réduit la surcharge en collectant et en agrégeant les messages d’origine " +"dans un seul paquet plutôt que dans plusieurs petits" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "mode relais" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "routé" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "sec" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "mode serveur" @@ -10210,7 +11514,7 @@ msgstr "mode serveur" msgid "sstpc Log-level" msgstr "Niveau de journalisation sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "sécurité forte" @@ -10218,7 +11522,7 @@ msgstr "sécurité forte" msgid "tagged" msgstr "marqué" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "unités de temps (UT / 1,024 ms) [1000-65535]" @@ -10232,25 +11536,27 @@ msgstr "" "Protocol\">HTTP
    ou HTTPS." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "valeur unique" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "inconnu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "version inconnue" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" -msgstr "non limité" +msgstr "illimité" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -10272,8 +11578,8 @@ msgid "untagged" msgstr "non marqué" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "adresse IP valide" @@ -10286,7 +11592,7 @@ msgid "valid IPv4 CIDR" msgstr "CIDR IPv4 valide" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "adresse IPv4 valide" @@ -10315,7 +11621,7 @@ msgid "valid IPv6 CIDR" msgstr "CIDR IPv6 valide" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "adresse IPv6 valide" @@ -10352,8 +11658,8 @@ msgstr "identifiant UCI, nom d'hôte ou adresse IP valides" msgid "valid address:port" msgstr "adresse:port valide" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "date valide (AAAA-MM-JJ)" @@ -10393,11 +11699,23 @@ msgstr "valeur entière valide" msgid "valid multicast MAC address" msgstr "adresse MAC de multidiffusion valide" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"Nom de périphérique réseau valide entre 1 et 15 caractères ne contenant pas " +"« : », « / », « % » ou des espaces" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "Nom de périphérique réseau valide, pas « . » ou « .. »" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "réseau valide en notation adresse/masque de réseau" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "chiffre de téléphone valide (0-9, \"*\", \"#\", \"!\" ou \".\")" @@ -10407,43 +11725,43 @@ msgid "valid port or port range (port1-port2)" msgstr "port ou plage de ports valide (port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "valeur de port valide" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "heure valide (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "valeur entre %d et %d caractères" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "valeur entre %f et %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "valeur supérieure ou égale à %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "valeur inférieure ou égale à %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "valeur avec %d caractères" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "valeur avec au moins %d caractères" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "valeur avec au plus %d caractères" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "sécurité faible" diff --git a/package/luci/modules/luci-base/po/he/base.po b/package/luci/modules/luci-base/po/he/base.po index b92b9036ca..9ae60b53f2 100644 --- a/package/luci/modules/luci-base/po/he/base.po +++ b/package/luci/modules/luci-base/po/he/base.po @@ -1,34 +1,50 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-01-15 22:31+0000\n" +"PO-Revision-Date: 2023-09-18 21:37+0000\n" "Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 5.0.2\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f דציבל" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d סיביות" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d שדות שגויים" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "" @@ -53,10 +69,11 @@ msgstr "(ריק)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(לא צורף אף מנשק)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "" @@ -66,19 +83,19 @@ msgid "-- Additional Field --" msgstr "-- שדה נוסף --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- נא לבחור --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- מותאם אישית --" @@ -104,7 +121,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" @@ -117,13 +134,18 @@ msgstr "" msgid "1 Minute Load:" msgstr "עומס במשך דקה:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "" msgstr[1] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "עומס במשך רבע שעה:" @@ -138,12 +160,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "" @@ -156,43 +183,98 @@ msgstr "" msgid "5 Minute Load:" msgstr "עומס במשך 5 דקות:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "" @@ -204,30 +286,42 @@ msgstr "הגדרות LED" msgid "LED Name" msgstr "שם LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -273,11 +367,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "" @@ -285,25 +387,90 @@ msgstr "" msgid "A new login is required since the authentication session expired." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "" @@ -336,57 +503,59 @@ msgstr "" msgid "ARP retry threshold" msgstr "סף ניסיונות חוזרים של ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 #, fuzzy msgid "ATM Bridges" msgstr "גשרי ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM מזהה ערוץ וירטואלי (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 -#, fuzzy msgid "ATM Virtual Path Identifier (VPI)" -msgstr "מזהה נתיבים ווירטואליים של ATM (VPI)" +msgstr "מזהה נתיבים וירטואליים של ATM‏ (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " "to dial into the provider network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "מס' התקן של ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "" @@ -395,7 +564,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -404,16 +573,25 @@ msgstr "" msgid "Access Concentrator" msgstr "מרכז גישות" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "נקודת גישה" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "פעולות" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "" @@ -452,8 +630,8 @@ msgid "Active-Backup policy (active-backup, 1)" msgstr "" # צריך אימות של מישהו שמבין יותר במושגים האלו אם צריך בכלל לתרגם את זה או להשאיר כמו שזה -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 #, fuzzy msgid "Ad-Hoc" @@ -471,18 +649,18 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "הוסף" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "" @@ -502,11 +680,11 @@ msgstr "" msgid "Add VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "" @@ -514,18 +692,18 @@ msgstr "" msgid "Add instance" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "הוסף דומיין מקומי לשמות המוגשים מהקבצים של המארח" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "הוסף ממשק חדש..." @@ -533,6 +711,10 @@ msgstr "הוסף ממשק חדש..." msgid "Add peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "" @@ -541,11 +723,11 @@ msgstr "" msgid "Add to Whitelist" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "קבצי מארח נוספים" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "" @@ -562,7 +744,11 @@ msgstr "" msgid "Address" msgstr "כתובת" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -575,7 +761,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "" @@ -585,28 +771,28 @@ msgstr "" msgid "Administration" msgstr "מנהלה" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "הגדרות מתקדמות" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 @@ -642,17 +828,17 @@ msgstr "" msgid "Alias of \"%s\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "" @@ -660,11 +846,11 @@ msgstr "" msgid "Allow SSH password authentication" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 #, fuzzy msgid "Allow all except listed" msgstr "אפשר הכל חוץ מהרשומים" @@ -673,15 +859,15 @@ msgstr "אפשר הכל חוץ מהרשומים" msgid "Allow full UCI access for legacy applications" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "אפשר רשומים בלבד" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 #, fuzzy msgid "Allow localhost" msgstr "אפשר localhost" @@ -703,19 +889,24 @@ msgid "Allow system feature probing" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "כתובות IP מורשות" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "" @@ -727,20 +918,24 @@ msgstr "" msgid "Always on (kernel: default-on)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "" @@ -749,98 +944,47 @@ msgstr "" msgid "An optional, short description for this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "" @@ -852,7 +996,7 @@ msgstr "" msgid "Anonymous Swap" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -866,11 +1010,11 @@ msgstr "" msgid "Any zone" msgstr "כל תחום" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -878,44 +1022,48 @@ msgstr "" msgid "Apply backup?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "תחנות קשורות" @@ -924,15 +1072,15 @@ msgstr "תחנות קשורות" msgid "Associations" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -942,25 +1090,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "אימות" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "מוסמך" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "דרוש אימות" @@ -968,7 +1117,9 @@ msgstr "דרוש אימות" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -986,7 +1137,7 @@ msgstr "" msgid "Automatically check filesystem for errors before mounting" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1008,6 +1159,10 @@ msgstr "" msgid "Automount Swap" msgstr "" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "זמין" @@ -1026,11 +1181,15 @@ msgstr "זמין" msgid "Average:" msgstr "ממוצע:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "" @@ -1038,15 +1197,19 @@ msgstr "" msgid "BR / DMR / AFTR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "חזרה" @@ -1055,11 +1218,7 @@ msgstr "חזרה" msgid "Back to Overview" msgstr "חזרה לסקירה" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "חזרה להגדרות" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1072,16 +1231,15 @@ msgid "Backup / Flash Firmware" msgstr "גיבוי / קושחת פלאש" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "גיבוי רשימת קבצים" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1089,12 +1247,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1108,7 +1289,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1117,18 +1298,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1140,66 +1334,78 @@ msgstr "" msgid "Bitrate" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "גשר" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "מס' יח' גשר" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 #, fuzzy msgid "Bring up on boot" msgstr "הבא באיתחול" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "" @@ -1207,14 +1413,36 @@ msgstr "" msgid "Buffered" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "שימוש מעבד (%)" @@ -1229,18 +1457,23 @@ msgstr "" msgid "Call failed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "ביטול" @@ -1248,32 +1481,32 @@ msgstr "ביטול" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1282,45 +1515,53 @@ msgstr "" msgid "Category" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1332,16 +1573,16 @@ msgstr "" msgid "Chain" msgstr "שרשרת" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "שינויים" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "" @@ -1352,18 +1593,19 @@ msgstr "משנה את סיסמת המנהל לגישה למכשיר" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "ערוץ" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "" @@ -1371,7 +1613,7 @@ msgstr "" msgid "Check filesystems before mount" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" @@ -1388,8 +1630,8 @@ msgstr "" msgid "Choose mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1397,13 +1639,13 @@ msgid "" "interface to it." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "" @@ -1423,9 +1665,10 @@ msgid "" "FEATURE IS FOR PROFESSIONALS! )" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "" @@ -1434,9 +1677,9 @@ msgstr "" msgid "Client ID to send when requesting DHCP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "" @@ -1451,20 +1694,20 @@ msgid "" "persist connection" msgstr "סגור חיבורים לא פעילים אחרי מספר השניות שהוגדר, הזן 0 על-מנת לא לסגור" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "סגור רשימה..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "נאספים נתונים…" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "פקודה" @@ -1479,9 +1722,9 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:73 msgid "Comment" -msgstr "" +msgstr "תגובה" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1500,29 +1743,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "הגדרות" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1532,28 +1774,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1565,9 +1807,10 @@ msgstr "" msgid "Confirmation" msgstr "אישור" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "מחובר" @@ -1577,11 +1820,11 @@ msgstr "מחובר" msgid "Connection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1593,7 +1836,7 @@ msgstr "" msgid "Connections" msgstr "חיבורים" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1621,29 +1864,29 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" -msgstr "" +msgstr "המשך" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:97 msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1654,20 +1897,20 @@ msgstr "" msgid "Country" msgstr "מדינה" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "קוד מדינה" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "צור / הקצה תחום-חומת אש" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "" @@ -1679,7 +1922,7 @@ msgstr "קריטי" msgid "Cron Log Level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "" @@ -1720,31 +1963,31 @@ msgstr "" "מתאים את הגדרות ה-LED-ים במכשיר " "(אם אפשרי)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "שרת DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP ו- DNS" @@ -1755,16 +1998,22 @@ msgstr "DHCP ו- DNS" msgid "DHCP client" msgstr "לקוח DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "אפשרויות-DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "" @@ -1776,19 +2025,19 @@ msgstr "" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNS יציאת שאילתא" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "DNS יציאת שרת" @@ -1796,7 +2045,7 @@ msgstr "DNS יציאת שרת" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1804,11 +2053,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1820,39 +2069,47 @@ msgstr "" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "התקבלו נתונים" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "הועברו נתונים" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1860,7 +2117,7 @@ msgstr "" msgid "Default state" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1869,61 +2126,62 @@ msgstr "" "הגדר אפשרויות DHCP נוספות, למשל \"6,192.168.2.1,192.168.2.2\" " "אשר מציגות שרתי DNS שונים ללקוח" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "למחוק" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "מחק רשת זו" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "תיאור" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "" @@ -1931,11 +2189,11 @@ msgstr "" msgid "Design" msgstr "עיצוב" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1953,7 +2211,7 @@ msgstr "" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:48 msgid "Destination port" -msgstr "" +msgstr "פתחת היעד" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:46 msgctxt "nft ip dport" @@ -1963,16 +2221,16 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 msgid "Destination zone" -msgstr "" +msgstr "אזור היעד" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:67 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1982,36 +2240,40 @@ msgstr "" msgid "Device" msgstr "מכשיר" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "הגדרות מכשיר" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" -msgstr "" +msgstr "שם המכשיר" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "" @@ -2019,31 +2281,31 @@ msgstr "" msgid "Device unreachable! Still waiting for device..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "אבחון" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2058,20 +2320,24 @@ msgstr "" msgid "Disable Encryption" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2080,33 +2346,32 @@ msgstr "" msgid "Disabled" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" @@ -2116,36 +2381,48 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "התעלמות" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "מרחק לנק' הרשת הרחוקה ביותר במטרים" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" @@ -2157,32 +2434,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2192,17 +2460,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "" @@ -2210,11 +2478,11 @@ msgstr "" msgid "Do you really want to erase all settings?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2222,15 +2490,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "" @@ -2256,11 +2526,11 @@ msgstr "הורד גיבוי" msgid "Download mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2274,16 +2544,54 @@ msgstr "" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "" @@ -2301,19 +2609,19 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "DHCP דינאמי" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2321,27 +2629,39 @@ msgstr "" msgid "Dynamic tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "ערוך" @@ -2349,17 +2669,21 @@ msgstr "ערוך" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "ערוך רשת זו" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "" @@ -2368,54 +2692,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "מצב חרום" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" -msgstr "אפשר" +msgstr "הפעלה" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "אפשר STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2433,10 +2747,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2450,11 +2765,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2466,11 +2785,11 @@ msgstr "" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "אפשר שרת TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2478,7 +2797,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "אפשר תפקוד VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "" @@ -2489,12 +2808,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "" @@ -2510,24 +2829,24 @@ msgstr "" msgid "Enable mirroring of outgoing packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2549,11 +2868,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "" @@ -2562,27 +2881,36 @@ msgstr "" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "אפשר" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "" @@ -2590,24 +2918,29 @@ msgstr "" msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "הצפנה" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "נקודת קצה" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2615,23 +2948,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2660,10 +2993,6 @@ msgstr "שגיאה" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2682,37 +3011,51 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2721,11 +3064,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "" @@ -2737,7 +3080,7 @@ msgstr "" msgid "Expires" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2746,11 +3089,11 @@ msgstr "" msgid "External" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2778,58 +3121,86 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "" @@ -2838,12 +3209,20 @@ msgstr "" msgid "Filesystem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 -msgid "Filter private" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 @@ -2858,8 +3237,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2869,7 +3253,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "" @@ -2883,10 +3267,11 @@ msgid "Firewall" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "סימן חומת אש" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "" @@ -2894,19 +3279,19 @@ msgstr "" msgid "Firewall Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2932,40 +3317,48 @@ msgstr "" msgid "Flashing…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "" @@ -2977,11 +3370,11 @@ msgstr "" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3000,37 +3393,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "" @@ -3052,7 +3449,7 @@ msgid "GHz" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "" @@ -3072,12 +3469,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "" @@ -3087,23 +3488,23 @@ msgstr "" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3111,7 +3512,7 @@ msgstr "" msgid "Generate Config" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3119,11 +3520,11 @@ msgstr "" msgid "Generate archive" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3131,15 +3532,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3151,39 +3552,40 @@ msgstr "" msgid "Global Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3195,6 +3597,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3231,7 +3637,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3239,6 +3645,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3271,7 +3681,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "" @@ -3300,15 +3710,11 @@ msgstr "" msgid "Hang Up" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3318,7 +3724,7 @@ msgid "" "the timezone." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" @@ -3327,17 +3733,25 @@ msgstr "" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3347,7 +3761,7 @@ msgstr "" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3355,10 +3769,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3368,11 +3788,11 @@ msgstr "" msgid "Hostname to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3428,23 +3848,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3460,7 +3884,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3472,20 +3896,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "" @@ -3493,14 +3917,15 @@ msgstr "" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "" @@ -3516,7 +3941,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3526,7 +3951,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3553,7 +3978,7 @@ msgstr "" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "" @@ -3566,11 +3991,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3579,16 +4004,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3599,7 +4028,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "" @@ -3607,7 +4037,7 @@ msgstr "" msgid "IPv6 Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3615,7 +4045,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3623,15 +4057,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3645,12 +4079,12 @@ msgstr "" msgid "IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3662,11 +4096,11 @@ msgstr "" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3675,7 +4109,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3689,23 +4123,19 @@ msgstr "" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3713,6 +4143,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3728,10 +4162,16 @@ msgstr "" msgid "IPv6-over-IPv4 (6to4)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3744,13 +4184,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3767,21 +4207,23 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3795,15 +4237,23 @@ msgid "" "datarates of the RAM." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "" @@ -3815,25 +4265,25 @@ msgstr "" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3845,13 +4295,27 @@ msgstr "" msgid "In" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3881,7 +4345,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3889,6 +4353,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3907,22 +4372,21 @@ msgstr "" msgid "Information" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3934,31 +4398,41 @@ msgstr "" msgid "Initscripts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -3968,6 +4442,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -3975,7 +4453,7 @@ msgstr "" msgid "Interface" msgstr "מנשק" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -3983,7 +4461,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "" @@ -4014,11 +4492,11 @@ msgstr "" msgid "Interface is shutting down..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -4027,12 +4505,12 @@ msgid "Interface name" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "" @@ -4041,22 +4519,26 @@ msgstr "" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4066,8 +4548,9 @@ msgid "Invalid" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4077,6 +4560,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4099,7 +4586,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4113,15 +4600,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "שם משתמש ו/או סיסמה שגויים! אנא נסה שנית." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "" @@ -4132,25 +4640,25 @@ msgid "" "flash memory, please verify the image file!" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4158,24 +4666,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "" @@ -4183,6 +4695,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4190,14 +4703,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4242,7 +4760,7 @@ msgstr "" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "" @@ -4259,32 +4777,39 @@ msgstr "" msgid "Language and Style" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 -msgid "Last member interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +msgid "Last member interval" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "לחיצת יד אחרונה" + #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "" @@ -4308,38 +4833,34 @@ msgstr "" msgid "Leave empty to use the current WAN address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4360,16 +4881,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4378,7 +4901,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4391,23 +4914,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "פתחת האזנה" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4415,7 +4935,7 @@ msgstr "" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4425,7 +4945,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "" @@ -4434,7 +4954,7 @@ msgstr "" msgid "Load" msgstr "עומס" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "עומס ממוצע" @@ -4442,27 +4962,28 @@ msgstr "עומס ממוצע" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4482,11 +5003,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "כתובת IPv4 מקומית" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4502,44 +5024,70 @@ msgstr "כתובת IPv6 מקומית" msgid "Local Startup" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "שרת מקומי" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "" @@ -4563,25 +5111,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4589,11 +5128,11 @@ msgstr "" msgid "MAC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "" @@ -4601,16 +5140,15 @@ msgstr "" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4619,11 +5157,15 @@ msgstr "" msgid "MAC address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "" @@ -4637,6 +5179,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4658,15 +5204,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4674,7 +5224,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4683,74 +5233,82 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4777,7 +5335,7 @@ msgstr "" msgid "Memory usage (%)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4785,10 +5343,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4801,7 +5367,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4812,11 +5378,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4824,13 +5390,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4844,77 +5410,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "" @@ -4982,6 +5555,10 @@ msgstr "" msgid "Move up" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -4989,19 +5566,23 @@ msgstr "" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5013,12 +5594,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5031,18 +5616,23 @@ msgid "NTP server candidates" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "שם" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "" @@ -5051,13 +5641,17 @@ msgstr "" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5066,32 +5660,36 @@ msgstr "" msgid "Network" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5104,7 +5702,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5113,7 +5711,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5122,25 +5720,31 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "אף פעם" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "אף פעם" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5148,13 +5752,13 @@ msgstr "" msgid "Next »" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "" @@ -5162,7 +5766,7 @@ msgstr "" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5174,13 +5778,21 @@ msgstr "" msgid "No NAT-T" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 -msgid "No RX signal" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 +msgid "No RX signal" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5191,7 +5803,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5200,8 +5816,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5214,15 +5830,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5236,7 +5848,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5257,30 +5869,40 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "לא הוגדרה סיסמה!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "לא מחובר" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5294,7 +5916,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "" @@ -5306,37 +5929,40 @@ msgstr "" msgid "Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "" @@ -5349,7 +5975,7 @@ msgstr "לא מחובר" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5361,12 +5987,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5375,7 +6007,7 @@ msgstr "" msgid "Notice" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "" @@ -5383,7 +6015,7 @@ msgstr "" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5400,7 +6032,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5411,6 +6043,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "" @@ -5419,6 +6052,12 @@ msgstr "" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "" @@ -5427,15 +6066,15 @@ msgstr "" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5453,7 +6092,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5462,49 +6105,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5512,29 +6166,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5542,17 +6205,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5560,13 +6223,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5581,11 +6244,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5593,7 +6256,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5607,7 +6270,7 @@ msgstr "" msgid "Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "נתיב למפתח הפרטי" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -5977,11 +6685,19 @@ msgstr "" msgid "Peak:" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "עמית" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -5990,11 +6706,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6025,10 +6741,14 @@ msgstr "" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6037,13 +6757,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "" @@ -6056,68 +6776,86 @@ msgstr "" msgid "Pkts." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." -msgstr "אנא הזן את שם המשתמש והסיסמה שלך:" +msgstr "נא למלא את שם המשתמש והסיסמה שלך." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." -msgstr "" +msgstr "נא לבחור את הקובץ להעלאה." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Policy" -msgstr "" +msgstr "מדיניות" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" -msgstr "" +msgstr "מדיניות: %h‏ (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "פתחה" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "פתחה %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "פתחה אינה חלק מרשת כלשהי" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" -msgstr "" +msgstr "בידוד פתחות" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "מצב פתחה" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" -msgstr "" +msgstr "מצב פתחה:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" -msgstr "" +msgstr "ניגוד אפשרי מול: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "מצב צריכת חשמל" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" -msgstr "" +msgstr "להעדיף LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" +msgstr "להעדיף UMTS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "טכנולוגיית רשת מועדפת" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6140,13 +6878,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6159,29 +6898,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6199,8 +6940,8 @@ msgid "Prot." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6212,13 +6953,13 @@ msgstr "" msgid "Provide NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6228,25 +6969,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "מפתח ציבורי" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6271,59 +7023,83 @@ msgstr "" msgid "Quality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "" @@ -6336,10 +7112,16 @@ msgstr "" msgid "RX Rate" msgstr "קצב קליטה" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6349,11 +7131,11 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "" @@ -6361,11 +7143,11 @@ msgstr "" msgid "Realtime Graphs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6389,11 +7171,40 @@ msgstr "" msgid "Receive" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "התקבלו נתונים" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "" @@ -6401,12 +7212,12 @@ msgstr "" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6415,37 +7226,47 @@ msgstr "" msgid "References" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "" @@ -6455,6 +7276,10 @@ msgstr "" msgid "Relay Bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "" @@ -6464,6 +7289,14 @@ msgstr "" msgid "Relay bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6473,6 +7306,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6485,15 +7319,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "" @@ -6523,7 +7365,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6539,7 +7382,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6551,67 +7394,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6620,7 +7469,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6635,20 +7484,24 @@ msgstr "" msgid "Reset to defaults" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "" @@ -6657,7 +7510,7 @@ msgstr "" msgid "Restart Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6669,86 +7522,97 @@ msgstr "שחזור" msgid "Restore backup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6763,19 +7627,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6793,6 +7657,10 @@ msgstr "" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6805,24 +7673,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6842,11 +7710,24 @@ msgstr "" msgid "SHA256" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6864,15 +7745,15 @@ msgstr "" msgid "SSH username" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "" @@ -6889,7 +7770,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6900,7 +7781,7 @@ msgid "Save" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "" @@ -6917,7 +7798,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "" @@ -6926,11 +7807,16 @@ msgstr "" msgid "Scheduled Tasks" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "" @@ -6945,9 +7831,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -6955,13 +7841,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -6980,11 +7866,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7009,16 +7899,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7028,14 +7922,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7049,32 +7943,41 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 msgid "Setting PLMN failed" msgstr "" -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 -msgid "Setting operation mode failed" +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 +msgid "Setting operation mode failed" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7082,12 +7985,11 @@ msgstr "" msgid "Short GI" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "" @@ -7100,16 +8002,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7117,15 +8019,15 @@ msgstr "" msgid "Signal" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7133,12 +8035,12 @@ msgstr "" msgid "Signal:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7155,12 +8057,12 @@ msgstr "" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "דלג אל התוכן" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "דלג אל הניווט" @@ -7178,14 +8080,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "חלק מהשדות אינם תקינים, אין אפשרות לשמור את הערכים!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "סליחה, אך האובייקט שביקשת אינו נמצא." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "סליחה, השרת נתקל בשגיאה לא צפויה." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7193,10 +8091,10 @@ msgid "" "instructions." msgstr "" "סליחה, אין תמיכה בעדכון מערכת, ולכן קושחה חדשה חייבת להיצרב ידנית. אנא פנה " -"אל ה-wiki של OpenWrt עבור הוראות ספציפיות למכשיר שלך." +"אל ה-wiki של libreCMC עבור הוראות ספציפיות למכשיר שלך." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7223,26 +8121,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7267,7 +8165,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7275,7 +8173,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7283,20 +8181,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7324,7 +8222,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7341,7 +8239,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7372,15 +8270,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7402,19 +8300,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7434,7 +8332,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7529,15 +8427,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "" @@ -7550,16 +8456,16 @@ msgstr "" msgid "Start priority" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7568,6 +8474,10 @@ msgstr "" msgid "Startup" msgstr "אתחול" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "ניתובי IPv4 סטטיים" @@ -7581,7 +8491,7 @@ msgstr "ניתובי IPv6 סטטיים" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "הקצאות סטטיות" @@ -7591,7 +8501,7 @@ msgstr "הקצאות סטטיות" msgid "Static address" msgstr "כתובת סטטית" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7601,18 +8511,18 @@ msgstr "" "הן נחוצות גם עבור הגדרות ממשק שאינן דינאמיות, בהן מטופלות רק ישויות בעלות " "הקצאה מתאימה." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "מצב" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "עצור" @@ -7621,8 +8531,8 @@ msgstr "עצור" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7630,11 +8540,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "" @@ -7643,15 +8553,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "שלח" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7682,7 +8592,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "" @@ -7692,7 +8602,7 @@ msgstr "" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7704,8 +8614,16 @@ msgstr "" msgid "Sync with browser" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7729,9 +8647,9 @@ msgstr "" msgid "System log buffer size" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7760,7 +8678,7 @@ msgstr "" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "" @@ -7773,26 +8691,37 @@ msgstr "שידור" msgid "TX Rate" msgstr "קצב שידור" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "טבלה" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "יעד" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7808,26 +8737,26 @@ msgstr "" msgid "Terminate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7843,7 +8772,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7855,18 +8788,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7874,6 +8813,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7888,6 +8828,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7898,7 +8844,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7915,21 +8861,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -7939,13 +8889,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -7963,18 +8913,18 @@ msgid "" "
    /dev/sda1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -7991,7 +8941,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "החוקים הבאים מאופשרים כרגע במערכת זו." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -7999,31 +8949,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8046,6 +9012,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8060,7 +9027,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8069,7 +9036,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8077,19 +9044,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8103,14 +9070,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8123,31 +9090,31 @@ msgstr "" msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8179,6 +9146,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8200,30 +9175,37 @@ msgid "" "you choose the generic image format for your platform." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8234,16 +9216,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8256,6 +9238,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8268,7 +9261,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" @@ -8296,8 +9289,8 @@ msgid "" "their status." msgstr "רשימה זו מציגה סקירה של תהליכי המערכת הרצים כרגע ואת מצבם." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8312,31 +9305,39 @@ msgstr "סעיף זה לא מכיל ערכים עדיין" msgid "Time Synchronization" msgstr "סנכרון זמן" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8344,17 +9345,13 @@ msgstr "" msgid "Timezone" msgstr "אזור זמן" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8363,7 +9360,7 @@ msgid "" msgstr "" "על מנת לשחזר את קבצי ההגדרות, באפשרותך להעלות ארכיון גיבוי שנוצר לפני כן." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8371,12 +9368,16 @@ msgstr "" msgid "Total Available" msgstr "סה\"כ פנוי" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8388,11 +9389,11 @@ msgstr "תעבורה" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8409,6 +9410,27 @@ msgstr "שידור" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "אנטנת שידור" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8447,7 +9469,7 @@ msgstr "" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8456,13 +9478,13 @@ msgid "Tx-Power" msgstr "עוצמת שידור" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8511,7 +9533,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8562,19 +9584,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8588,7 +9622,7 @@ msgstr "" msgid "Unknown" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8612,11 +9646,11 @@ msgstr "" msgid "Unmount" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "" @@ -8630,15 +9664,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8650,7 +9694,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "" @@ -8665,56 +9709,64 @@ msgstr "" msgid "Upload archive..." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8723,13 +9775,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8775,22 +9832,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "השתמש בדגל broadcast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "השתמש בשרתי DNS מותאמים אישית" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "" @@ -8814,15 +9874,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8845,69 +9905,71 @@ msgstr "" msgid "Used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "שם משתמש" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -8927,24 +9989,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "שרת VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -8953,6 +10018,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -8966,14 +10035,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -8999,7 +10068,7 @@ msgstr "" msgid "Vendor Class to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9007,12 +10076,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9020,34 +10089,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "סיסמת WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "סיסמת WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9074,48 +10155,99 @@ msgstr "" msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "מצב WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9131,21 +10263,21 @@ msgid "Wireless Adapter" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9161,15 +10293,15 @@ msgstr "" msgid "Wireless is not associated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "רשת אלחוטית מנוטרלת" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "רשת אלחוטית מאופשרת" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "" @@ -9181,7 +10313,7 @@ msgstr "" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9204,8 +10336,20 @@ msgid "" "scripts like \"network\", your device might become inaccessible!
    " msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9234,34 +10378,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "כלשהו" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "אוטומטי" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "" @@ -9318,25 +10482,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "בטל" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9345,14 +10514,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9362,22 +10540,22 @@ msgstr "" msgid "forward" msgstr "קדימה" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "" @@ -9386,9 +10564,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9396,6 +10574,10 @@ msgstr "" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9410,11 +10592,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9423,11 +10613,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9439,18 +10629,26 @@ msgstr "" msgid "no" msgstr "לא" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "ללא" @@ -9461,20 +10659,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "כבוי" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9483,6 +10681,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "לפני למעלה מיום" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9500,23 +10702,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "מנותב" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9524,7 +10735,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9532,7 +10743,7 @@ msgstr "" msgid "tagged" msgstr "מתויג" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9543,25 +10754,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" -msgstr "" +msgstr "ערך יחודי" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" -msgstr "" +msgstr "לא ידוע" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "גרסה לא ידועה" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "ללא הגבלה" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9576,28 +10789,28 @@ msgstr "לא מוגדר" #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:71 msgid "unspecified -or- create:" -msgstr "לא מוגדר -או- יצר" +msgstr "לא מוגדר -או- ליצור:" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:352 msgid "untagged" msgstr "לא מתויג" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" -msgstr "" +msgstr "כתובת IP תקפה" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 msgid "valid IP address or prefix" -msgstr "" +msgstr "כתובת או קידומת IP תקפה" #: modules/luci-base/htdocs/luci-static/resources/validation.js:294 msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9626,7 +10839,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9663,8 +10876,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9704,11 +10917,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9718,43 +10941,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" diff --git a/package/luci/modules/luci-base/po/hi/base.po b/package/luci/modules/luci-base/po/hi/base.po index 9296856c51..6f5a182928 100644 --- a/package/luci/modules/luci-base/po/hi/base.po +++ b/package/luci/modules/luci-base/po/hi/base.po @@ -1,34 +1,50 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-04-07 16:52+0000\n" -"Last-Translator: Zeeshan Khan \n" -"Language-Team: Hindi \n" +"PO-Revision-Date: 2023-09-18 15:45+0000\n" +"Last-Translator: David Rapaň \n" +"Language-Team: Hindi \n" "Language: hi\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.0-dev\n" +"X-Generator: Weblate 5.0.2\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f डेसिबल" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d बिट" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d अमान्य क्षेत्र" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" -msgstr "%s विभिन्न वी.लैन में टैग नहीं किए गए" +msgstr "%s विभिन्न वी.लैन में टैग नहीं किए गए!" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:296 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:405 @@ -50,10 +66,11 @@ msgstr "(खाली)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(कोई इंटरफ़ेस संलग्न नहीं है)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "" @@ -63,19 +80,19 @@ msgid "-- Additional Field --" msgstr "अतिरिक्त अनुभाग" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "कृपया चुने" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "--अमानक--" @@ -101,7 +118,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = RSSI सीमा का उपयोग नहीं कर रहा है, 1 = ड्राइवर डिफ़ॉल्ट को न बदलें" @@ -114,13 +131,18 @@ msgstr "" msgid "1 Minute Load:" msgstr "1 मिनट का बोझ:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "" msgstr[1] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "15 मिनट का बोझ:" @@ -135,12 +157,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4-चरित्र हेक्साडेसिमल पहचान" @@ -153,43 +180,98 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "5 मिनट का बोझ:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "6-ओक्टेट पहचानकर्ता एक हेक्स स्ट्रिंग के रूप में - कोई कॉलन नहीं" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r तेज संक्र्रांति" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w संगति SA प्रश्नचिहन महत्तम काल समापन" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11w संगति SA प्रश्नचिहन पुन: प्रयास काल समापन" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w प्रबंध ढांचा सुरक्षा" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w महत्तम काल समापन" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11 पुन: प्रयास काल समापन" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-नेटवर्क मास्क" @@ -201,30 +283,42 @@ msgstr "" msgid "LED Name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -270,11 +364,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "समान नाम वाली एक निर्देशिका पहले से मौजूद है।" @@ -282,25 +384,90 @@ msgstr "समान नाम वाली एक निर्देशिक msgid "A new login is required since the authentication session expired." msgstr "प्रमाणीकरण सत्र समाप्त होने के बाद से एक नया लॉगिन आवश्यक है।" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -333,29 +500,36 @@ msgstr "" msgid "ARP retry threshold" msgstr "ARP पुन: प्रयास चौखट" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (अतुल्यकालिक अंतरण विधा)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM पुलों" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM वर्चुअल चैनल पहचानकर्ता (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM वर्चुअल पथ पहचानकर्ता (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -365,26 +539,22 @@ msgstr "" "AAL5 कनेक्शन में जो प्रदाता नेटवर्क में डायल करने के लिए DHCP या PPP के साथ संयोजन में " "उपयोग किया जा सकता है।" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM यंत्र अंक" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C सिस्टम विक्रेता पहचान (ID)" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "अनुपस्थित इंटरफ़ेस" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "" @@ -393,7 +563,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -401,16 +571,25 @@ msgstr "" msgid "Access Concentrator" msgstr "प्रवेश सांद्रक" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "प्रवेश स्थल" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "चाल-चलन" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "" @@ -448,8 +627,8 @@ msgstr "" msgid "Active-Backup policy (active-backup, 1)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "तदर्थ" @@ -466,18 +645,18 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "जोड़ना" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "ATM पुल जोड़ें" @@ -497,11 +676,11 @@ msgstr "LED क्रिया जोड़ें" msgid "Add VLAN" msgstr "VLAN जोड़ें" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "" @@ -509,18 +688,18 @@ msgstr "" msgid "Add instance" msgstr "दृष्टांत जोड़ें" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "चाबी जोड़ें" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "" @@ -528,6 +707,10 @@ msgstr "" msgid "Add peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "" @@ -536,11 +719,11 @@ msgstr "" msgid "Add to Whitelist" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "" @@ -557,7 +740,11 @@ msgstr "" msgid "Address" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -570,7 +757,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "" @@ -579,28 +766,28 @@ msgstr "" msgid "Administration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 @@ -635,17 +822,17 @@ msgstr "" msgid "Alias of \"%s\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "" @@ -653,11 +840,11 @@ msgstr "" msgid "Allow SSH password authentication" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "" @@ -665,15 +852,15 @@ msgstr "" msgid "Allow full UCI access for legacy applications" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "" @@ -694,19 +881,24 @@ msgid "Allow system feature probing" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "" @@ -718,20 +910,24 @@ msgstr "" msgid "Always on (kernel: default-on)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "" @@ -740,98 +936,47 @@ msgstr "" msgid "An optional, short description for this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "" @@ -843,7 +988,7 @@ msgstr "" msgid "Anonymous Swap" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -855,11 +1000,11 @@ msgstr "" msgid "Any zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -867,44 +1012,48 @@ msgstr "" msgid "Apply backup?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "" @@ -913,15 +1062,15 @@ msgstr "" msgid "Associations" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -931,25 +1080,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "" @@ -957,7 +1107,9 @@ msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -975,7 +1127,7 @@ msgstr "" msgid "Automatically check filesystem for errors before mounting" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -997,6 +1149,10 @@ msgstr "" msgid "Automount Swap" msgstr "" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "" @@ -1015,11 +1171,15 @@ msgstr "" msgid "Average:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1027,15 +1187,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "" @@ -1044,11 +1208,7 @@ msgstr "" msgid "Back to Overview" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1061,16 +1221,15 @@ msgid "Backup / Flash Firmware" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1078,12 +1237,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1094,7 +1276,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1103,18 +1285,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1126,65 +1321,77 @@ msgstr "" msgid "Bitrate" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "" @@ -1192,14 +1399,36 @@ msgstr "" msgid "Buffered" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "" @@ -1214,18 +1443,23 @@ msgstr "" msgid "Call failed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "" @@ -1233,32 +1467,32 @@ msgstr "" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1267,45 +1501,53 @@ msgstr "" msgid "Category" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1317,16 +1559,16 @@ msgstr "" msgid "Chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "" @@ -1337,18 +1579,19 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "" @@ -1356,7 +1599,7 @@ msgstr "" msgid "Check filesystems before mount" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" @@ -1373,8 +1616,8 @@ msgstr "" msgid "Choose mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1382,13 +1625,13 @@ msgid "" "interface to it." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "" @@ -1408,9 +1651,10 @@ msgid "" "FEATURE IS FOR PROFESSIONALS! )" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "" @@ -1419,9 +1663,9 @@ msgstr "" msgid "Client ID to send when requesting DHCP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "" @@ -1436,20 +1680,20 @@ msgid "" "persist connection" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "" @@ -1466,7 +1710,7 @@ msgstr "" msgid "Comment" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1485,29 +1729,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1517,28 +1760,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1550,9 +1793,10 @@ msgstr "" msgid "Confirmation" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "" @@ -1562,11 +1806,11 @@ msgstr "" msgid "Connection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1578,7 +1822,7 @@ msgstr "" msgid "Connections" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1606,9 +1850,9 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1619,16 +1863,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1639,20 +1883,20 @@ msgstr "" msgid "Country" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "" @@ -1664,7 +1908,7 @@ msgstr "" msgid "Cron Log Level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "" @@ -1703,31 +1947,31 @@ msgid "" "Diode\">LED
    s if possible." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "" @@ -1738,16 +1982,22 @@ msgstr "" msgid "DHCP client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "" @@ -1759,19 +2009,19 @@ msgstr "" msgid "DNS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" @@ -1779,7 +2029,7 @@ msgstr "" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1787,11 +2037,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1803,39 +2053,47 @@ msgstr "" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1843,68 +2101,69 @@ msgstr "" msgid "Default state" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "" @@ -1912,11 +2171,11 @@ msgstr "" msgid "Design" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1951,9 +2210,9 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1963,36 +2222,40 @@ msgstr "" msgid "Device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "" @@ -2000,31 +2263,31 @@ msgstr "" msgid "Device unreachable! Still waiting for device..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2039,20 +2302,24 @@ msgstr "" msgid "Disable Encryption" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2061,33 +2328,32 @@ msgstr "" msgid "Disabled" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" @@ -2097,36 +2363,48 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" @@ -2138,32 +2416,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2173,17 +2442,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "" @@ -2191,11 +2460,11 @@ msgstr "" msgid "Do you really want to erase all settings?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2203,15 +2472,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "" @@ -2237,11 +2508,11 @@ msgstr "" msgid "Download mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2255,16 +2526,54 @@ msgstr "" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "" @@ -2280,19 +2589,19 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2300,27 +2609,39 @@ msgstr "" msgid "Dynamic tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "" @@ -2328,17 +2649,21 @@ msgstr "" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "" @@ -2347,54 +2672,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2412,10 +2727,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2429,11 +2745,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2445,11 +2765,11 @@ msgstr "" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2457,7 +2777,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "" @@ -2468,12 +2788,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "" @@ -2489,24 +2809,24 @@ msgstr "" msgid "Enable mirroring of outgoing packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2528,11 +2848,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "" @@ -2541,27 +2861,36 @@ msgstr "" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "" @@ -2569,24 +2898,29 @@ msgstr "" msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2594,23 +2928,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2639,10 +2973,6 @@ msgstr "" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2661,37 +2991,51 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2700,11 +3044,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "" @@ -2716,7 +3060,7 @@ msgstr "" msgid "Expires" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2725,11 +3069,11 @@ msgstr "" msgid "External" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2757,58 +3101,86 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "" @@ -2817,12 +3189,20 @@ msgstr "" msgid "Filesystem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 -msgid "Filter private" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 @@ -2837,8 +3217,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2848,7 +3233,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "" @@ -2862,10 +3247,11 @@ msgid "Firewall" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "" @@ -2873,19 +3259,19 @@ msgstr "" msgid "Firewall Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2911,40 +3297,48 @@ msgstr "" msgid "Flashing…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "" @@ -2956,11 +3350,11 @@ msgstr "" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -2979,37 +3373,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "" @@ -3031,7 +3429,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "" @@ -3051,12 +3449,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "" @@ -3066,23 +3468,23 @@ msgstr "" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3090,7 +3492,7 @@ msgstr "" msgid "Generate Config" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3098,11 +3500,11 @@ msgstr "" msgid "Generate archive" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3110,15 +3512,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3130,39 +3532,40 @@ msgstr "" msgid "Global Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3174,6 +3577,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3210,7 +3617,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3218,6 +3625,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3250,7 +3661,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "" @@ -3279,15 +3690,11 @@ msgstr "" msgid "Hang Up" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3297,7 +3704,7 @@ msgid "" "the timezone." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" @@ -3306,17 +3713,25 @@ msgstr "" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3326,7 +3741,7 @@ msgstr "" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3334,10 +3749,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3347,11 +3768,11 @@ msgstr "" msgid "Hostname to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3407,23 +3828,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3439,7 +3864,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3451,20 +3876,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "" @@ -3472,14 +3897,15 @@ msgstr "" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3495,7 +3921,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3505,7 +3931,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3532,7 +3958,7 @@ msgstr "" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "" @@ -3545,11 +3971,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3558,16 +3984,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3578,7 +4008,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "" @@ -3586,7 +4017,7 @@ msgstr "" msgid "IPv6 Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3594,7 +4025,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3602,15 +4037,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3624,12 +4059,12 @@ msgstr "" msgid "IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3641,11 +4076,11 @@ msgstr "" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3654,7 +4089,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3668,23 +4103,19 @@ msgstr "" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3692,6 +4123,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3707,10 +4142,16 @@ msgstr "" msgid "IPv6-over-IPv4 (6to4)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3723,13 +4164,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3746,21 +4187,23 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3774,15 +4217,23 @@ msgid "" "datarates of the RAM." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "" @@ -3794,25 +4245,25 @@ msgstr "" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3824,13 +4275,27 @@ msgstr "" msgid "In" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3860,7 +4325,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3868,6 +4333,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3886,22 +4352,21 @@ msgstr "" msgid "Information" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3913,31 +4378,41 @@ msgstr "" msgid "Initscripts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -3947,6 +4422,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -3954,7 +4433,7 @@ msgstr "" msgid "Interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -3962,7 +4441,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "" @@ -3993,11 +4472,11 @@ msgstr "" msgid "Interface is shutting down..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -4006,12 +4485,12 @@ msgid "Interface name" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "" @@ -4020,22 +4499,26 @@ msgstr "" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4045,8 +4528,9 @@ msgid "Invalid" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4056,6 +4540,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4078,7 +4566,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4092,15 +4580,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "" @@ -4111,25 +4620,25 @@ msgid "" "flash memory, please verify the image file!" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4137,24 +4646,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "" @@ -4162,6 +4675,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4169,14 +4683,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4221,7 +4740,7 @@ msgstr "" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "" @@ -4238,32 +4757,39 @@ msgstr "" msgid "Language and Style" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "" @@ -4287,38 +4813,34 @@ msgstr "" msgid "Leave empty to use the current WAN address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4339,16 +4861,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4357,7 +4881,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4370,23 +4894,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4394,7 +4915,7 @@ msgstr "" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4404,7 +4925,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "" @@ -4413,7 +4934,7 @@ msgstr "" msgid "Load" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "" @@ -4421,27 +4942,28 @@ msgstr "" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4461,11 +4983,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4481,44 +5004,70 @@ msgstr "" msgid "Local Startup" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "" @@ -4542,25 +5091,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4568,11 +5108,11 @@ msgstr "" msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "" @@ -4580,16 +5120,15 @@ msgstr "" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4598,11 +5137,15 @@ msgstr "" msgid "MAC address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "" @@ -4616,6 +5159,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4637,15 +5184,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4653,7 +5204,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4662,74 +5213,82 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4756,7 +5315,7 @@ msgstr "" msgid "Memory usage (%)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4764,10 +5323,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4780,7 +5347,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4791,11 +5358,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4803,13 +5370,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4823,77 +5390,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "" @@ -4961,6 +5535,10 @@ msgstr "" msgid "Move up" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -4968,19 +5546,23 @@ msgstr "" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -4992,12 +5574,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5010,18 +5596,23 @@ msgid "NTP server candidates" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "" @@ -5030,13 +5621,17 @@ msgstr "" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5045,32 +5640,36 @@ msgstr "" msgid "Network" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5083,7 +5682,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5092,7 +5691,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5101,25 +5700,30 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5127,13 +5731,13 @@ msgstr "" msgid "Next »" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "" @@ -5141,7 +5745,7 @@ msgstr "" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5157,9 +5761,17 @@ msgstr "" msgid "No RX signal" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5170,7 +5782,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5179,8 +5795,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5193,15 +5809,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5215,7 +5827,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5236,30 +5848,39 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5273,7 +5894,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "" @@ -5285,37 +5907,40 @@ msgstr "" msgid "Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "" @@ -5328,7 +5953,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5340,12 +5965,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5354,7 +5985,7 @@ msgstr "" msgid "Notice" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "" @@ -5362,7 +5993,7 @@ msgstr "" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5379,7 +6010,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5390,6 +6021,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "" @@ -5398,6 +6030,12 @@ msgstr "" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "" @@ -5406,15 +6044,15 @@ msgstr "" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5432,7 +6070,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5441,49 +6083,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5491,29 +6144,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5521,17 +6183,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5539,13 +6201,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5560,11 +6222,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5572,7 +6234,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5586,7 +6248,7 @@ msgstr "" msgid "Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -5956,11 +6663,19 @@ msgstr "" msgid "Peak:" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -5969,11 +6684,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6004,10 +6719,14 @@ msgstr "" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6016,13 +6735,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "" @@ -6035,11 +6754,11 @@ msgstr "" msgid "Pkts." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6047,56 +6766,74 @@ msgstr "" msgid "Policy" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6119,13 +6856,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6138,29 +6876,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6178,8 +6918,8 @@ msgid "Prot." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6191,13 +6931,13 @@ msgstr "" msgid "Provide NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6207,25 +6947,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6250,59 +7001,83 @@ msgstr "" msgid "Quality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "" @@ -6315,10 +7090,16 @@ msgstr "" msgid "RX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6328,11 +7109,11 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "" @@ -6340,11 +7121,11 @@ msgstr "" msgid "Realtime Graphs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6368,11 +7149,39 @@ msgstr "" msgid "Receive" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "" @@ -6380,12 +7189,12 @@ msgstr "" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6394,37 +7203,47 @@ msgstr "" msgid "References" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "" @@ -6434,6 +7253,10 @@ msgstr "" msgid "Relay Bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "" @@ -6443,6 +7266,14 @@ msgstr "" msgid "Relay bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6452,6 +7283,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6464,15 +7296,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "" @@ -6502,7 +7342,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6518,7 +7359,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6530,67 +7371,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6599,7 +7446,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6614,20 +7461,24 @@ msgstr "" msgid "Reset to defaults" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "" @@ -6636,7 +7487,7 @@ msgstr "" msgid "Restart Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6648,86 +7499,97 @@ msgstr "" msgid "Restore backup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6742,19 +7604,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6772,6 +7634,10 @@ msgstr "" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6784,24 +7650,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6821,11 +7687,24 @@ msgstr "" msgid "SHA256" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6843,15 +7722,15 @@ msgstr "" msgid "SSH username" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6868,7 +7747,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6879,7 +7758,7 @@ msgid "Save" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "" @@ -6896,7 +7775,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "" @@ -6905,11 +7784,16 @@ msgstr "" msgid "Scheduled Tasks" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "" @@ -6924,9 +7808,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -6934,13 +7818,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -6959,11 +7843,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -6988,16 +7876,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7007,14 +7899,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7028,32 +7920,41 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 msgid "Setting PLMN failed" msgstr "" -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 -msgid "Setting operation mode failed" +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 +msgid "Setting operation mode failed" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7061,12 +7962,11 @@ msgstr "" msgid "Short GI" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "" @@ -7079,16 +7979,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7096,15 +7996,15 @@ msgstr "" msgid "Signal" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7112,12 +8012,12 @@ msgstr "" msgid "Signal:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7134,12 +8034,12 @@ msgstr "" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "" @@ -7157,14 +8057,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7172,8 +8068,8 @@ msgid "" "instructions." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7200,26 +8096,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7244,7 +8140,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7252,7 +8148,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7260,20 +8156,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7301,7 +8197,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7318,7 +8214,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7349,15 +8245,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7379,19 +8275,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7411,7 +8307,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7506,15 +8402,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "" @@ -7527,16 +8431,16 @@ msgstr "" msgid "Start priority" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7545,6 +8449,10 @@ msgstr "" msgid "Startup" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "" @@ -7558,7 +8466,7 @@ msgstr "" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "" @@ -7568,25 +8476,25 @@ msgstr "" msgid "Static address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "" @@ -7595,8 +8503,8 @@ msgstr "" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7604,11 +8512,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "" @@ -7617,15 +8525,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7656,7 +8564,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "" @@ -7666,7 +8574,7 @@ msgstr "" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7678,8 +8586,16 @@ msgstr "" msgid "Sync with browser" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7703,9 +8619,9 @@ msgstr "" msgid "System log buffer size" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7734,7 +8650,7 @@ msgstr "" msgid "TCP:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "" @@ -7747,26 +8663,37 @@ msgstr "" msgid "TX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7782,26 +8709,26 @@ msgstr "" msgid "Terminate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7817,7 +8744,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7829,18 +8760,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7848,6 +8785,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7862,6 +8800,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7872,7 +8816,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7889,21 +8833,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -7913,13 +8861,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -7937,18 +8885,18 @@ msgid "" "
    /dev/sda1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -7965,7 +8913,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -7973,31 +8921,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8020,6 +8984,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8034,7 +8999,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8043,7 +9008,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8051,19 +9016,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8077,14 +9042,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8097,31 +9062,31 @@ msgstr "" msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8153,6 +9118,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8174,30 +9147,37 @@ msgid "" "you choose the generic image format for your platform." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8208,16 +9188,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8230,6 +9210,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8242,7 +9233,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" @@ -8270,8 +9261,8 @@ msgid "" "their status." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8286,31 +9277,39 @@ msgstr "" msgid "Time Synchronization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8318,17 +9317,13 @@ msgstr "" msgid "Timezone" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8336,7 +9331,7 @@ msgid "" "reset\" (only possible with squashfs images)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8344,12 +9339,16 @@ msgstr "" msgid "Total Available" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8361,11 +9360,11 @@ msgstr "" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8382,6 +9381,26 @@ msgstr "" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8420,7 +9439,7 @@ msgstr "" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8429,13 +9448,13 @@ msgid "Tx-Power" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8484,7 +9503,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8535,19 +9554,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8561,7 +9592,7 @@ msgstr "" msgid "Unknown" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8585,11 +9616,11 @@ msgstr "" msgid "Unmount" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "" @@ -8603,15 +9634,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8623,7 +9664,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "" @@ -8638,56 +9679,64 @@ msgstr "" msgid "Upload archive..." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8696,13 +9745,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8748,22 +9802,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "" @@ -8787,15 +9844,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8818,69 +9875,71 @@ msgstr "" msgid "Used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -8900,24 +9959,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -8926,6 +9988,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -8939,14 +10005,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -8972,7 +10038,7 @@ msgstr "" msgid "Vendor Class to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -8980,12 +10046,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -8993,34 +10059,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9047,48 +10125,99 @@ msgstr "" msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9104,21 +10233,21 @@ msgid "Wireless Adapter" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9134,15 +10263,15 @@ msgstr "" msgid "Wireless is not associated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "" @@ -9154,7 +10283,7 @@ msgstr "" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9177,8 +10306,20 @@ msgid "" "scripts like \"network\", your device might become inaccessible!
    " msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9207,34 +10348,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "" @@ -9291,25 +10452,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9318,14 +10484,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9335,22 +10510,22 @@ msgstr "" msgid "forward" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "" @@ -9359,9 +10534,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9369,6 +10544,10 @@ msgstr "" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9383,11 +10562,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9396,11 +10583,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9412,18 +10599,26 @@ msgstr "" msgid "no" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "" @@ -9434,20 +10629,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9456,6 +10651,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9473,23 +10672,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9497,7 +10705,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9505,7 +10713,7 @@ msgstr "" msgid "tagged" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9516,25 +10724,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9556,8 +10766,8 @@ msgid "untagged" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9570,7 +10780,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9599,7 +10809,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9636,8 +10846,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9677,11 +10887,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9691,43 +10911,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" diff --git a/package/luci/modules/luci-base/po/hu/base.po b/package/luci/modules/luci-base/po/hu/base.po index 9899128719..2fa67d0664 100644 --- a/package/luci/modules/luci-base/po/hu/base.po +++ b/package/luci/modules/luci-base/po/hu/base.po @@ -1,34 +1,50 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2021-12-13 23:52+0000\n" -"Last-Translator: Josef Schlehofer \n" -"Language-Team: Hungarian \n" +"Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10-dev\n" +"X-Generator: Weblate 5.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d érvénytelen mező" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d órával ezelőtt" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d perccel ezelőtt" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d másodperccel ezelőtt" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "A(z) %s címkézetlen több VLAN-ban!" @@ -53,10 +69,11 @@ msgstr "(üres)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(nincs csatalkoztatott interfész)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "" @@ -66,19 +83,19 @@ msgid "-- Additional Field --" msgstr "-- További mező --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Kérem válasszon --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- egyéni --" @@ -104,7 +121,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = nem használ RSSI küszöbszintet, 1 = ne változtassa meg az " @@ -119,13 +136,18 @@ msgstr "" msgid "1 Minute Load:" msgstr "1 perces terhelés:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "" msgstr[1] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "15 perces terhelés:" @@ -140,12 +162,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4 karakteres hexadecimális azonosító" @@ -158,44 +185,99 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "5 perces terhelés:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" "6 oktettes azonosító hexadecimális karakterláncként – nincsenek kettőspontok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r gyors átmenet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w hozzárendelés SA-lekérdezésének legnagyobb időkorlátja" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11w hozzárendelés SA-lekérdezési újrapróbálás időkorlátja" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w kezelőkeret-védelem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w legnagyobb időkorlátja" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w újrapróbálás időkorlátja" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4 hálózati maszk" @@ -207,30 +289,42 @@ msgstr "LED beállítása" msgid "LED Name" msgstr "LED neve" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -276,11 +370,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Már létezik egy ilyen nevű könyvtár." @@ -288,25 +390,90 @@ msgstr "Már létezik egy ilyen nevű könyvtár." msgid "A new login is required since the authentication session expired." msgstr "Új bejelentkezés szükséges, mivel a hitelesítés munkamenete lejárt." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -339,29 +506,36 @@ msgstr "ARP monitorozás nem támogatott a választott szabályban!" msgid "ARP retry threshold" msgstr "ARP újrapróbálkozási küszöbszint" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (aszinkron átviteli mód)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM hidak" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM virtuális csatorna-azonosító (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM virtuálisútvonal-azonosító (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -371,28 +545,24 @@ msgstr "" "Linux hálózati csatolókként, amely DHCP-vel vagy PPP-vel együtt használható " "a szolgáltatói hálózatba történő betárcsázáshoz." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM eszközszám" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C rendszer gyártójának azonosítója" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Hiányzó csatoló" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "DNS-szolgáltatás korlátozása azokra az alhálózati csatolókra, amelyeken DNS-" "t szolgálunk ki." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Lokális hozzáférés" @@ -401,7 +571,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -409,16 +579,25 @@ msgstr "" msgid "Access Concentrator" msgstr "Elérési sűrítő" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Hozzáférési pont" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Műveletek" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Aktív" @@ -456,8 +635,8 @@ msgstr "" msgid "Active-Backup policy (active-backup, 1)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Eseti" @@ -474,18 +653,18 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Hozzáadás" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "ATM híd hozzáadása" @@ -505,11 +684,11 @@ msgstr "LED művelet hozzáadása" msgid "Add VLAN" msgstr "VLAN hozzáadása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Eszköz konfiguráció hozzáadása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "" @@ -517,18 +696,19 @@ msgstr "" msgid "Add instance" msgstr "Példány hozzáadása" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Kulcs hozzáadása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." -msgstr "Helyi tartományutótag hozzáadása a hosts fájlokból kiszolgált nevekhez" +msgstr "" +"Helyi tartományutótag hozzáadása a hosts fájlokból kiszolgált nevekhez." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Új csatoló hozzáadása…" @@ -536,6 +716,10 @@ msgstr "Új csatoló hozzáadása…" msgid "Add peer" msgstr "Partner hozzáadása" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Hozzáadás a feketelistához" @@ -544,11 +728,11 @@ msgstr "Hozzáadás a feketelistához" msgid "Add to Whitelist" msgstr "Hozzáadás a fehérlistához" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "További gépek fájljai" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "További kiszolgálók fájlja" @@ -565,7 +749,11 @@ msgstr "További kiszolgálók fájlja" msgid "Address" msgstr "Cím" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -578,7 +766,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "Cím a helyi átjátszóhíd eléréséhez" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Címek" @@ -587,29 +775,30 @@ msgstr "Címek" msgid "Administration" msgstr "Adminisztráció" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 +#, fuzzy msgid "Advanced Settings" msgstr "Haladó Beállítások" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Haladó eszköz beállítások" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Összesített átviteli teljesítmény (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -643,18 +832,18 @@ msgstr "Álnév csatoló" msgid "Alias of \"%s\"" msgstr "„%s” álneve" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Összes kiszolgáló" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -"IP-címek lefoglalása sorrendben, kezdve a legalacsonyabb elérhető címtől" +"IP-címek lefoglalása sorrendben, kezdve a legalacsonyabb elérhető címtől." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "IP lefoglalása egymás után" @@ -663,13 +852,13 @@ msgid "Allow SSH password authentication" msgstr "" "SSH jelszavas hitelesítés engedélyezése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" "AP mód engedélyezése az STA-k leválasztásához az alacsony ACK feltételek " "alapján" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Összes engedélyezése a felsoroltakon kívül" @@ -677,15 +866,15 @@ msgstr "Összes engedélyezése a felsoroltakon kívül" msgid "Allow full UCI access for legacy applications" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Örökölt 802.11b sebességek engedélyezése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Csak a felsoroltak engedélyezése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Localhost engedélyezése" @@ -707,20 +896,25 @@ msgid "Allow system feature probing" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" "Engedélyezés a root felhasználónak, hogy jelszóval jelentkezzen be" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Engedélyezett IP-k" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Mindig" @@ -732,11 +926,11 @@ msgstr "" msgid "Always on (kernel: default-on)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -745,10 +939,14 @@ msgstr "" "átfedi. Ennek a beállításnak a használata nem felel meg az IEEE 802.11n-2009 " "előírásainak!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "" @@ -757,98 +955,47 @@ msgstr "" msgid "An optional, short description for this device" msgstr "Opcionális, rövid leírása az eszköznek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Melléklet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "A + L + M melléklet (összes)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "A G.992.1 melléklet" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "A G.992.2 melléklet" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "A G.992.3 melléklet" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "A G.992.5 melléklet" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "B (összes) melléklet" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "B G.992.1 melléklet" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "B G.992.3 melléklet" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "B G.992.5 melléklet" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "J melléklet (összes)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "L G.992.3 POTS 1 melléklet" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "M melléklet (összes)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "M G.992.3 melléklet" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "M G.992.5 melléklet" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Bejelentett DNS-tartományok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Névtelen személyazonosság" @@ -860,7 +1007,7 @@ msgstr "Névtelen csatolás" msgid "Anonymous Swap" msgstr "Névtelen cserehely" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -872,11 +1019,11 @@ msgstr "" msgid "Any zone" msgstr "Bármely zóna" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -884,40 +1031,44 @@ msgstr "" msgid "Apply backup?" msgstr "Alkalmazza a biztonsági mentést?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "A kérés alkalmazása meghiúsult %h állapotkóddal" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Kijelöletlenek alkalmazása" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "A beállítások változtatásainak alkalmazása… %d mp" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Architektúra" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Minden egyes nyilvános IPv6-előtag megadott hosszú részének hozzárendelése " "ehhez a csatolóhoz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -925,7 +1076,7 @@ msgstr "" "A hexadecimális alelőtag-azonosító használatával történő előtagrészek " "hozzárendelése ehhez a csatolóhoz." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Hozzárendelt állomások" @@ -934,15 +1085,15 @@ msgstr "Hozzárendelt állomások" msgid "Associations" msgstr "Hozzárendelések" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -954,25 +1105,26 @@ msgstr "" "Kísérlet a csatlakoztatott eszközök beállított csatolási pontjainak " "engedélyezésére" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Hitelesítési csoport" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Hitelesítés" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Hitelesítés típusa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Hiteles" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Hitelesítés szükséges" @@ -980,7 +1132,9 @@ msgstr "Hitelesítés szükséges" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -998,7 +1152,7 @@ msgstr "Automatikus otthoni hálózat (HNCP)" msgid "Automatically check filesystem for errors before mounting" msgstr "Fájlrendszer hibáinak automatikus ellenőrzése a csatolás előtt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1020,6 +1174,10 @@ msgstr "Fájlrendszer automatikus csatolása" msgid "Automount Swap" msgstr "Cserehely automatikus csatolása" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Elérhető" @@ -1038,11 +1196,15 @@ msgstr "Elérhető" msgid "Average:" msgstr "Átlag:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1050,15 +1212,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Vissza" @@ -1067,11 +1233,7 @@ msgstr "Vissza" msgid "Back to Overview" msgstr "Vissza az áttekintőhöz" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Vissza a beállításokhoz" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1084,16 +1246,15 @@ msgid "Backup / Flash Firmware" msgstr "Biztonsági mentés vagy firmware beírása" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Biztonsági mentés fájllistája" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Sáv" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Alap eszköz" @@ -1101,12 +1262,35 @@ msgstr "Alap eszköz" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Alapjel időköze" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1121,29 +1305,42 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "Kötés dinamikusan a csatolókhoz a helyettesítő címek helyett (ajánlott Linux " -"alapértelmezettként)" +"alapértelmezettként)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Csatoló kötése" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1155,65 +1352,78 @@ msgstr "Az alagút kötése ehhez a csatolóhoz (elhagyható)." msgid "Bitrate" msgstr "Bitráta" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 +#, fuzzy msgid "Bridge" msgstr "Híd" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Híd eszköz" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Híd portok" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Hídegység száma" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Felhozás rendszerindításkor" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Tallózás…" @@ -1221,16 +1431,38 @@ msgstr "Tallózás…" msgid "Buffered" msgstr "Pufferelt" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "Hitelesítésszolgáltató tanúsítványa. Ha üres, akkor mentésre kerül az első " "kapcsolat után." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "A CLAT beállítása nem sikerült" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Processzorhasználat (%)" @@ -1245,18 +1477,23 @@ msgstr "Gyorsítótárazott" msgid "Call failed" msgstr "Hívás sikertelen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Mégse" @@ -1264,32 +1501,32 @@ msgstr "Mégse" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1298,24 +1535,32 @@ msgstr "" msgid "Category" msgstr "Kategória" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Tanúsítványkényszer (tartomány)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Tanúsítványkényszer (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Tanúsítványkényszer (tárgy)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Tanúsítványkényszer (altartományokra is kibővített)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1323,8 +1568,8 @@ msgstr "" "Tanúsítványkényszer részkarakterlánca – például /CN=wifi.mycompany.com
    A tényleges értékekért nézze meg a „logread -f” kimenetét a kézfogás során" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1332,8 +1577,8 @@ msgstr "" "Tanúsítványkényszerek a DNS SAN értékekkel (ha elérhető)
    vagy a tárgy " "CN-nel (pontos egyezés)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1341,8 +1586,8 @@ msgstr "" "Tanúsítványkényszerek a DNS SAN értékekkel (ha elérhető)
    vagy a tárgy " "CN-nel (utótag egyezés)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1356,16 +1601,16 @@ msgstr "" msgid "Chain" msgstr "Lánc" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Változtatások" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "A változtatások visszavonva." @@ -1376,18 +1621,19 @@ msgstr "Megváltoztatja az eszköz eléréséhez szükséges adminisztrátori je #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Csatorna" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Csatorna analizálás" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "" @@ -1395,7 +1641,7 @@ msgstr "" msgid "Check filesystems before mount" msgstr "Fájlrendszerek ellenőrzése csatolás előtt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" "Jelölje be ezt a lehetőséget a meglévő hálózatok törléséhez ebből a rádióból." @@ -1413,8 +1659,8 @@ msgstr "Lemezkép ellenőrzése…" msgid "Choose mtdblock" msgstr "Az mtdblock kiválasztása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1427,7 +1673,7 @@ msgstr "" "létrehozás mezőt új zóna meghatározásához, és csatlakoztassa a " "csatolót ahhoz." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1436,7 +1682,7 @@ msgstr "" "vezeték nélküli csatolóhoz, vagy töltse ki a létrehozás mezőt egy " "új hálózat meghatározásához." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Titkosító" @@ -1460,9 +1706,10 @@ msgstr "" "Kattintson az „Az mtdblock mentése” gombra egy meghatározott mtdblock fájl " "letöltéséhez. (MEGJEGYZÉS: EZ A FUNKCIÓ CSAK SZAKEMBEREKNEK VALÓ!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Ügyfél" @@ -1471,9 +1718,9 @@ msgstr "Ügyfél" msgid "Client ID to send when requesting DHCP" msgstr "DHCP kérésekor küldendő ügyfél-azonosító" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Bezár" @@ -1490,20 +1737,20 @@ msgstr "" "Inaktív kapcsolat lezárása a megadott másodpercek után, használjon 0-t " "állandó kapcsolathoz" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Lista bezárása…" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Adatok összegyűjtése…" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Parancs" @@ -1520,7 +1767,7 @@ msgstr "Parancs sikertelen" msgid "Comment" msgstr "Megjegyzés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1544,29 +1791,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Beállítás" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "A beállítás változtatásai alkalmazva." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "A beállítás változtatásai vissza lettek állítva!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Beállítás sikertelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1576,28 +1822,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Konfigurálás…" @@ -1609,9 +1855,10 @@ msgstr "Leválasztás megerősítése" msgid "Confirmation" msgstr "Megerősítés" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Csatlakoztatott" @@ -1621,11 +1868,11 @@ msgstr "Csatlakoztatott" msgid "Connection attempt failed" msgstr "Kapcsolódási kísérlet sikertelen" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "Csatlakozási próbálkozás sikertelen." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1637,7 +1884,7 @@ msgstr "A kapcsolat elveszett" msgid "Connections" msgstr "Kapcsolatok" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1665,9 +1912,9 @@ msgstr "" msgid "Contents have been saved." msgstr "A tartalom mentésre került." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1678,16 +1925,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1702,20 +1949,20 @@ msgstr "" msgid "Country" msgstr "Ország" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Országkód" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Tűzfalzóna létrehozása vagy hozzárendelése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Csatoló létrehozása" @@ -1727,7 +1974,7 @@ msgstr "Kritikus" msgid "Cron Log Level" msgstr "Cron naplózási szint" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Jelenlegi teljesítmény" @@ -1770,31 +2017,31 @@ msgstr "" "Az eszköz LED-jei működésének " "személyre szabása." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE-ügyfél" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE-port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAE-titok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP kiszolgáló" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP és DNS" @@ -1805,16 +2052,22 @@ msgstr "DHCP és DNS" msgid "DHCP client" msgstr "DHCP ügyfél" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP beállítások" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6 ügyfél" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6-szolgáltatás" @@ -1826,19 +2079,19 @@ msgstr "DHCPv6-szolgáltatás" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "DNS továbbítások" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNS lekérdezési port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "DNS-kiszolgáló portja" @@ -1846,7 +2099,7 @@ msgstr "DNS-kiszolgáló portja" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1854,11 +2107,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "DNS-címke / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "DNSSEC ellenőrzés előjel nélkül" @@ -1870,39 +2123,47 @@ msgstr "DPD üresjárat időkorlátja" msgid "DS-Lite AFTR address" msgstr "DS-Lite AFTR cím" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "DSL állapota" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "DSL vonalmód" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "DTIM időköze" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Adatsebesség" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Fogadott adat" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Átvitt adat" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Hibakeresés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Alapértelmezett router" @@ -1910,7 +2171,7 @@ msgstr "Alapértelmezett router" msgid "Default state" msgstr "Alapértelmezett állapot" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1920,61 +2181,62 @@ msgstr "" "„6,192.168.2.1,192.168.2.2”, amely különböző DNS-kiszolgálókat " "hirdet az ügyfelek részére." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Törlés" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Kulcs törlése" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Törlési kérés sikertelen: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Hálózat törlése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Kézbesítési forgalom jelző üzenet időköze" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Leírás" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Kijelölés megszüntetése" @@ -1982,11 +2244,11 @@ msgstr "Kijelölés megszüntetése" msgid "Design" msgstr "Megjelenés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2021,9 +2283,9 @@ msgstr "Célzóna" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2033,36 +2295,40 @@ msgstr "Célzóna" msgid "Device" msgstr "Eszköz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Eszköz beállításai" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Az eszköz nem aktív" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Az eszköz újraindul…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Eszköz név" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Az eszköz nincs menedzselve a ModemManager által." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Eszköz típus" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Az eszköz elérhetetlen!" @@ -2070,31 +2336,31 @@ msgstr "Az eszköz elérhetetlen!" msgid "Device unreachable! Still waiting for device..." msgstr "Eszköz elérhetetlen! Még mindig várok a készülékre..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Eszközök" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnosztika" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Szám tárcsázása" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Könyvtár" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Letiltás" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2111,20 +2377,24 @@ msgstr "DNS keresések letiltása" msgid "Disable Encryption" msgstr "Titkosítás letiltása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Inaktivitás lekérdezésének letiltása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Hálózat letiltása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2133,33 +2403,32 @@ msgstr "Hálózat letiltása" msgid "Disabled" msgstr "Letiltva" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Hozzárendelés megszüntetése alacsony nyugtázásnál" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." -msgstr "Külső RFC1918 válaszok elvetése." +msgstr "Külső RFC1918 válaszok elvetése." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Leválasztás" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Leválasztási kísérlet sikertelen" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Lecsatlakozás sikertelen." @@ -2169,29 +2438,41 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Eltüntetés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Távolság optimalizáció" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "A hálózat legtávolabbi tagjának távolsága méterben." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP-kiszolgáló és DNS-továbbító NAT " -"tűzfalak számára" +"tűzfalak számára." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" -"Ne gyorsítótárazza a negatív válaszokat, például nem létező tartományoknál" +"Ne gyorsítótárazza a negatív válaszokat, például nem létező tartományoknál." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 @@ -2215,36 +2496,25 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "Ne továbbítsa a DNS-kéréseket " -"DNS-név nélkül" +"DNS-név nélkül." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Ne továbbítsa azokat a kéréseket, amelyeket nem tudnak megválaszolni a " -"nyilvános névkiszolgálók" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." -msgstr "Ne továbbítson fordított keresési kéréseket a helyi hálózathoz" +msgstr "Ne továbbítson fordított keresési kéréseket a helyi hálózathoz." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Figyelés megakadályozása ezeken a csatolókon." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2254,17 +2524,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Valóban törölni szeretné ezt: „%s”?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Valóban törölni szeretné a következő SSH-kulcsot?" @@ -2272,11 +2542,11 @@ msgstr "Valóban törölni szeretné a következő SSH-kulcsot?" msgid "Do you really want to erase all settings?" msgstr "Valóban törölni szeretné az összes beállítást?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Valóban törölni szeretné rekurzívan a(z) „%s” könyvtárat?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2284,15 +2554,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Tartomány szükséges" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Tartomány fehérlista" @@ -2318,11 +2590,11 @@ msgstr "Biztonsági mentés letöltése" msgid "Download mtdblock" msgstr "Az mtdblock letöltése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Belső SNR eltolás" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2336,16 +2608,54 @@ msgstr "Húzza az átrendezéshez" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbear példány" @@ -2364,20 +2674,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Könnyű kettős protokollcsomag (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Dinamikus DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2385,7 +2695,7 @@ msgstr "" msgid "Dynamic tunnel" msgstr "Dinamikus alagút" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2393,21 +2703,33 @@ msgstr "" "DHCP címek dinamikus lefoglalása az ügyfeleknek. Ha le van tiltva, akkor " "csak a statikus bérletekkel rendelkező ügyfelek lesznek kiszolgálva." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "EA-bitek hossza" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAP módszer" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Szerkesztés" @@ -2415,6 +2737,10 @@ msgstr "Szerkesztés" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2423,11 +2749,11 @@ msgstr "" "Szerkessze a fenti nyers beállítási adatokat a hibák javításához, majd " "nyomja meg a „Mentés” gombot az oldal újratöltéséhez." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Hálózat szerkesztése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Vezeték nélküli hálózat szerkesztése" @@ -2436,44 +2762,34 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Vészhelyzet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Engedélyezés" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2481,11 +2797,11 @@ msgstr "" "IGMP szimatolás " "engedélyezése" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "STP engedélyezése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2503,10 +2819,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "HE.net dinamikus végpont frissítésének engedélyezése" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "IPv6 engedélyezése" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "IPv6 egyeztetés engedélyezése" @@ -2520,11 +2837,15 @@ msgstr "IPv6 egyeztetés engedélyezése" msgid "Enable IPv6 negotiation on the PPP link" msgstr "IPv6 egyeztetés engedélyezése a PPP kapcsolaton" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Óriás keretek átengedésének engedélyezése" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2536,11 +2857,11 @@ msgstr "NTP-ügyfél engedélyezése" msgid "Enable Single DES" msgstr "Egyszeres DES engedélyezése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "TFTP kiszolgáló engedélyezése" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2548,7 +2869,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "VLAN funkcionalitás engedélyezése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "WPS nyomógomb engedélyezése, WPA(2)-PSK/WPA3-SAE szükséges" @@ -2559,12 +2880,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Kulcs-újratelepítés (KRACK) ellenintézkedéseinek engedélyezése" @@ -2580,24 +2901,24 @@ msgstr "Bejövő csomagok tükrözésének engedélyezése" msgid "Enable mirroring of outgoing packets" msgstr "Kimenő csomagok tükrözésének engedélyezése" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2619,11 +2940,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "A beágyazott csomagok DF (ne tördeljen) jelzőjének engedélyezése." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "A hálózat engedélyezése" @@ -2632,21 +2953,24 @@ msgstr "A hálózat engedélyezése" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Engedélyezve" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "IGMP szaglászás engedélyezése ezen a hídon" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2654,7 +2978,13 @@ msgstr "" "Engedélyezi a gyors barangolást a hozzáférési pontok között, amelyek " "ugyanazon mobilitási tartományhoz tartoznak" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Engedélyezi a feszítőfa-protokollt ezen a hídon" @@ -2662,24 +2992,29 @@ msgstr "Engedélyezi a feszítőfa-protokollt ezen a hídon" msgid "Encapsulation limit" msgstr "Beágyazási korlát" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Beágyazási mód" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Titkosítás" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Végpont" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Végpont gépe" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Végpont portja" @@ -2687,23 +3022,23 @@ msgstr "Végpont portja" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2732,10 +3067,6 @@ msgstr "Hiba" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Hibás másodpercek (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2754,39 +3085,53 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Csatolók kizárása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" "Külső válaszok engedélyezése a 127.0.0.0/8-as tartományban, például RBL " -"szolgáltatások" +"szolgáltatások." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Létező eszköz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Gépek kinyitása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Hexadecimális hozzárendelési tipp várt" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2795,11 +3140,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Elvárás: %s" @@ -2811,7 +3156,7 @@ msgstr "" msgid "Expires" msgstr "Lejárat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "Bérelt címek lejárati ideje, legalább 2 perc (2m)." @@ -2820,11 +3165,11 @@ msgstr "Bérelt címek lejárati ideje, legalább 2 perc (2m)." msgid "External" msgstr "Külső" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Külső R0 kulcstartólista" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Külső R1 kulcstartólista" @@ -2852,37 +3197,65 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT DS fölött" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT a levegőn keresztül" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "FT protokoll" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Nem sikerült megváltoztatni a rendszer jelszavát." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" "Nem sikerült megerősíteni az alkalmazást %d másodpercen belül, várakozás a " "visszaállításra…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Nem sikerült végrehajtani az „/etc/init.d/%s %s” műveletet: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Fájl" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2891,42 +3264,50 @@ msgstr "" "vagy „server=1.2.3.4” a tartományra jellemző vagy teljesen külső DNS-kiszolgálókhoz." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "A fájl nem érhető el" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "a fájl, ahol a megadott DHCP bérletek tárolásra kerülnek" +"Protocol\">DHCP bérletek tárolásra kerülnek." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." -msgstr "helyi DNS-fájl" +msgstr "helyi DNS-fájl." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Fájlnév" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." -msgstr "Az ügyfeleknek meghirdetett rendszerindító lemezkép fájlneve" +msgstr "Az ügyfeleknek meghirdetett rendszerindító lemezkép fájlneve." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:315 msgid "Filesystem" msgstr "Fájlrendszer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Személyes szűrése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Használhatatlan szűrése" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "" @@ -2939,8 +3320,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Véglegesítés sikertelen" @@ -2952,7 +3338,7 @@ msgstr "" "Az összes jelenleg csatolt fájlrendszer és cserehely megkeresése, és a " "beállítások cseréje az alapértelmezettekkel az alapján, hogy mi lett észlelve" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Hálózatok keresése és csatlakozás" @@ -2966,10 +3352,11 @@ msgid "Firewall" msgstr "Tűzfal" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Tűzfal jelölés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Tűzfalbeállítások" @@ -2977,21 +3364,21 @@ msgstr "Tűzfalbeállítások" msgid "Firewall Status" msgstr "Tűzfal állapota" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Firmware fájl" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Firmware verzió" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." -msgstr "Rögzített forrásport a kimenő DNS-lekérdezéseknél" +msgstr "Rögzített forrásport a kimenő DNS-lekérdezéseknél." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:312 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:449 @@ -3015,42 +3402,50 @@ msgstr "Beírás műveletei" msgid "Flashing…" msgstr "Telepítés…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Kényszerítés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "40MHz-es mód kényszerítésre" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "CCMP (AES) kényszerítése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" "DHCP kényszerítése ezen a hálózaton, még akkor is ha másik kiszolgáló " "észlelhető." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "TKIP kényszerítése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "TKIP és CCMP (AES) kényszerítése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Kapcsolat kényszerítése" @@ -3062,11 +3457,11 @@ msgstr "Frissítés kényszerítése" msgid "Force use of NAT-T" msgstr "NAT-T használatának kényszerítése" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Űrlaptoken eltérés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3085,37 +3480,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "DHCP-forgalom továbbítása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "Továbbítási hiba javításának másodpercei (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Üzenetszórási forgalom továbbítása" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Hálópartner forgalmának továbbítása" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Továbbítási mód" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Töredezettség küszöbszintje" @@ -3139,7 +3538,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Csak GPRS" @@ -3159,12 +3558,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Átjáró" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Átjáró portok" @@ -3174,23 +3577,23 @@ msgstr "Átjáró portok" msgid "Gateway address is invalid" msgstr "Az átjáró címe érvénytelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Általános Beállítások" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Általános beállítás" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3198,7 +3601,7 @@ msgstr "" msgid "Generate Config" msgstr "Beállítás előállítása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "PMK előállítása helyileg" @@ -3206,11 +3609,11 @@ msgstr "PMK előállítása helyileg" msgid "Generate archive" msgstr "Archívum előállítása" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3218,15 +3621,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3239,39 +3642,40 @@ msgstr "" msgid "Global Settings" msgstr "Globális beállítások" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Globális hálózati beállítások" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Ugrás a jelszóbeállításhoz…" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Ugrás a megfelelő beállítási oldalhoz" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3283,6 +3687,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3319,7 +3727,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3327,6 +3735,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3359,7 +3771,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "" @@ -3388,15 +3800,11 @@ msgstr "" msgid "Hang Up" msgstr "Befejezés" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Fejléc hibakódhibák (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3408,7 +3816,7 @@ msgstr "" "Itt állíthatja be az eszköz alapvető tulajdonságait, mint például a gépnév " "vagy az időzóna." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "ESSID elrejtése" @@ -3417,17 +3825,25 @@ msgstr "ESSID elrejtése" msgid "Hide empty chains" msgstr "Üres láncok elrejtése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "Magas" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3437,7 +3853,7 @@ msgstr "Gép" msgid "Host expiry timeout" msgstr "Gép lejárati időkorlátja" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3445,10 +3861,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "Egyedi gépcímketartalom" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3458,11 +3880,11 @@ msgstr "Gépnév" msgid "Hostname to send when requesting DHCP" msgstr "DHCP kérésekor küldendő gépnév" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Gépnevek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3518,23 +3940,27 @@ msgstr "" msgid "IKE DH Group" msgstr "IKE DH csoport" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IP-címek" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "IP protokoll" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "IP típusa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3550,7 +3976,7 @@ msgstr "Az IP-cím érvénytelen" msgid "IP address is missing" msgstr "IP-cím hiányzik" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3562,20 +3988,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Hamis NX-tartomány felülbírálása" @@ -3583,14 +4009,15 @@ msgstr "Hamis NX-tartomány felülbírálása" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3606,7 +4033,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3616,7 +4043,7 @@ msgstr "Külső IPv4" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3643,7 +4070,7 @@ msgstr "IPv4 hálózati maszk" msgid "IPv4 network in address/netmask notation" msgstr "IPv4 hálózat cím/hálózati maszk jelölésben" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Csak IPv4" @@ -3656,11 +4083,11 @@ msgstr "IPv4-előtag" msgid "IPv4 prefix length" msgstr "IPv4-előtag hossza" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3669,16 +4096,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4 az IPv4-ben (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (mindkettő – alapértelmezetten IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3689,7 +4120,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3697,7 +4129,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6 tűzfal" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3705,7 +4137,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "IPv6 szomszédok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3713,15 +4149,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "IPv6 beállítások" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6 ULA-előtag" @@ -3735,12 +4171,12 @@ msgstr "Külső IPv6" msgid "IPv6 address" msgstr "IPv6-cím" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "IPv6 hozzárendelés segítsége" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "IPv6 hozzárendelés hossza" @@ -3752,11 +4188,11 @@ msgstr "IPv6-átjáró" msgid "IPv6 network in address/netmask notation" msgstr "IPv6 hálózat cím/hálózati maszk jelölésben" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Csak IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3765,7 +4201,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "IPv6-előtag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3779,23 +4215,19 @@ msgstr "IPv6-előtag hossza" msgid "IPv6 routed prefix" msgstr "IPv6-irányított előtag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "IPv6-utótag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "IPv6-utótag (hex)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "IPv6 támogatás" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3803,6 +4235,10 @@ msgstr "" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3818,10 +4254,16 @@ msgstr "IPv6 IPv4 felett (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6 IPv4 felett (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Személyazonosság" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Ha be van jelölve, akkor az 1DES engedélyezve van" @@ -3834,13 +4276,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "Ha be van jelölve, akkor a titkosítás le van tiltva" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3861,21 +4303,23 @@ msgstr "" "Ha meg van adva, akkor az eszköz a rögzített eszközcsomópont helyett " "partíciós címke alapján lesz csatolva" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Ha nincs bejelölve, akkor nincs alapértelmezett útvonal beállítva" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3897,15 +4341,23 @@ msgstr "" "cserehelyeszköz nem érhető el akkora adatsebességgel, mint a RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Az /etc/hosts mellőzése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Csatoló mellőzése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "A feloldási fájl figyelmen kívül hagyása" @@ -3917,25 +4369,25 @@ msgstr "Kép" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3947,7 +4399,21 @@ msgstr "" msgid "In" msgstr "Be" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -3956,7 +4422,7 @@ msgstr "" "kérése blokkolva lett. Kattintson a lenti „Folytatás »” gombra az előző " "oldalra történő visszatéréshez." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 #, fuzzy msgid "In seconds" msgstr "másodperc múlva" @@ -3987,7 +4453,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3995,6 +4461,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -4013,22 +4480,21 @@ msgstr "Információ" msgid "Information" msgstr "Információ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Előkészítési hiba" @@ -4040,31 +4506,41 @@ msgstr "Előkészítő parancsfájl" msgid "Initscripts" msgstr "Előkészítő parancsfájlok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Belső tanúsítványkényszer (tartomány)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Belső tanúsítványkényszer (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Belső tanúsítványkényszer (tárgy)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Belső tanúsítványkényszer (altartományokra is kibővített)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Protokollkiterjesztések telepítése…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4076,6 +4552,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4083,7 +4563,7 @@ msgstr "" msgid "Interface" msgstr "Csatoló" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -4091,7 +4571,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "A csatoló %q eszköze automatikusan költöztetve: %q → %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Csatoló beállításai" @@ -4122,11 +4602,11 @@ msgstr "Csatoló újrakapcsolódása…" msgid "Interface is shutting down..." msgstr "A csatoló leállítása…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Csatoló indítása…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "A csatoló leáll…" @@ -4135,12 +4615,12 @@ msgid "Interface name" msgstr "Csatoló neve" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "A csatoló nincs jelen vagy még nincs kapcsolódva." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Csatolók" @@ -4149,22 +4629,26 @@ msgstr "Csatolók" msgid "Internal" msgstr "Belső" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Belső kiszolgálóhiba" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4174,8 +4658,9 @@ msgid "Invalid" msgstr "Érvénytelen" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4185,6 +4670,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "Érvénytelen Base64 kulcs karakterlánc" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4211,7 +4700,7 @@ msgstr "" msgid "Invalid argument" msgstr "Érvénytelen argumentum" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4225,15 +4714,36 @@ msgstr "Érvénytelen parancs" msgid "Invalid hexadecimal value" msgstr "Érvénytelen hexadecimális érték" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Érvénytelen felhasználónév és/vagy jelszó! Próbálja újra." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Ügyfelek elszigetelése" @@ -4246,25 +4756,25 @@ msgstr "" "Úgy tűnik, hogy olyan képfájlt próbál beírni, amely nem fér bele a flash-" "memóriába. Ellenőrizze a képfájlt!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "JavaScript szükséges!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Csatlakozás a hálózathoz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Csatlakozás hálózathoz: vezeték nélküli keresés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Csatlakozás hálózathoz: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4272,24 +4782,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "Beállítások jelenlegi állapotának megtartása" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Kernel napló" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Kernel Verzió" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Kulcs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "%d. kulcs" @@ -4297,6 +4811,7 @@ msgstr "%d. kulcs" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4304,14 +4819,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4356,7 +4876,7 @@ msgstr "LCP visszhang időtartama" msgid "LED Configuration" msgstr "LED beállítás" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4373,34 +4893,41 @@ msgstr "Nyelv" msgid "Language and Style" msgstr "Nyelv és stílus" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Késleltetés" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Utolsó kapcsolatfelvétel" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Levél" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 #, fuzzy msgid "Learn" msgstr "Tanulás" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 #, fuzzy msgid "Learn routes" msgstr "Útvonalak tanulása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Bérletfájl" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Bérleti idő" @@ -4424,38 +4951,34 @@ msgstr "Automatikus felismeréshez hagyja üresen" msgid "Leave empty to use the current WAN address" msgstr "Hagyja üresen a jelenlegi WAN-cím használatához" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Jelmagyarázat:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Korlát" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Vonal csillapítása (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "Vonali mód" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "Vonal állapota" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "Vonal működési ideje" @@ -4476,16 +4999,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." -msgstr "Gépek listája, amelyek hamis NX-tartomány eredményeket szolgáltatnak" +msgstr "Gépek listája, amelyek hamis NX-tartomány eredményeket szolgáltatnak." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4499,7 +5024,7 @@ msgstr "" "leképezéséhez, ha PMK-R1 kulcsot kér attól az R0KH-tól, amelyet az STA " "használ a kezdeti mobilitási tartomány hozzárendelése közben." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4518,25 +5043,22 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "SSH kulcsfájlok listája a hitelesítéshez" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." -msgstr "Tartományok listája, amelyeknél az RFC1918 válaszok engedélyezettek" +msgstr "Tartományok listája, amelyeknél az RFC1918 válaszok engedélyezettek." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" "DNS-kiszolgálók listája, ahová a " -"kérések továbbításra kerülnek" +"kérések továbbításra kerülnek." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Fogadó port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Figyelési csatolók" @@ -4544,7 +5066,7 @@ msgstr "Figyelési csatolók" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "Figyelés csak a megadott csatolón, vagy az összesen, ha nincs megadva" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4554,16 +5076,16 @@ msgstr "Figyelés korlátozása ezekre a csatolókra és a visszacsatolásra." msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." -msgstr "Port figyelése a bejövő DNS-lekérdezésekhez" +msgstr "Port figyelése a bejövő DNS-lekérdezésekhez." #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:130 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:54 msgid "Load" msgstr "Terhelés" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Átlagos terhelés" @@ -4571,27 +5093,28 @@ msgstr "Átlagos terhelés" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Könyvtártartalmak betöltése…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Nézet betöltése…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Helyi" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Helyi IP cím" @@ -4611,11 +5134,12 @@ msgstr "Hozzárendelendő helyi IP-cím" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Helyi IPv4-cím" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Helyi IPv6 DNS szerver" @@ -4631,46 +5155,72 @@ msgstr "Helyi IPv6-cím" msgid "Local Startup" msgstr "Helyi indítás" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Helyi idő" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Helyi tartomány" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "A DHCP nevekhez és a hosts fájl bejegyzéseihez hozzáfűzött helyi " -"tartományutótagok" +"tartományutótagok." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Helyi kiszolgáló" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Csak helyi szolgáltatás" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Lekérdezések behatárolása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Zárolás a BSSID-hoz" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Bejelentkezés" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Bejelentkezéshez…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Kijelentkezés" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Napló kimeneti szintje" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Lekérdezések naplózása" @@ -4694,37 +5244,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Bejelentkezés" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Kijelentkezés" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Jel vesztésének másodpercei (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Legalacsonyabb bérelt cím a hálózati címtől való eltolásként." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC cím" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "MAC-cím szűrő" @@ -4732,16 +5273,15 @@ msgstr "MAC-cím szűrő" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4750,11 +5290,15 @@ msgstr "" msgid "MAC address" msgstr "MAC-cím" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC-szűrő" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "MAC-lista" @@ -4768,6 +5312,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "A MAP szabály érvénytelen" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4789,15 +5337,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4807,7 +5359,7 @@ msgstr "" "parancsokhoz hasonló valami használatával:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4816,78 +5368,86 @@ msgstr "" msgid "Manual" msgstr "Kézi" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Mester" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Legnagyobb elérhető adatsebesség (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Legnagyobb DHCP bérletek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Max. EDNS0 csomagméret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Legtöbb egyidejű lekérdezés" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Legnagyobb engedélyezett figyelési időköz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." -msgstr "Aktív DHCP bérletek legnagyobb megengedett száma" +msgstr "Aktív DHCP bérletek legnagyobb megengedett száma." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." -msgstr "Egyidejű DNS-lekérdezések legnagyobb megengedett száma" +msgstr "Egyidejű DNS-lekérdezések legnagyobb megengedett száma." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." -msgstr "EDNS.0 UDP csomagok legnagyobb megengedett mérete" +msgstr "EDNS.0 UDP csomagok legnagyobb megengedett mérete." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Legnagyobb várakozási idő a modem kész állapotára másodpercben" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Bérelt címek legnagyobb száma." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Legnagyobb átviteli teljesítmény" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4914,7 +5474,7 @@ msgstr "Memória" msgid "Memory usage (%)" msgstr "Memóriahasználat (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Háló" @@ -4922,10 +5482,18 @@ msgstr "Háló" msgid "Mesh ID" msgstr "Hálóazonosító" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Hálóazonosító" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Nem található módszer" @@ -4938,7 +5506,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4949,11 +5517,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Minimum ARP validálási idő" @@ -4961,13 +5529,13 @@ msgstr "Minimum ARP validálási idő" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4981,35 +5549,49 @@ msgstr "Megfigyelőport tükrözése" msgid "Mirror source port" msgstr "Forrásport tükrözése" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Mobil adat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Mobilitási tartomány" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Mód" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Modell" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 #, fuzzy msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " @@ -5017,43 +5599,36 @@ msgid "" msgstr "" "Modem csatlakoztatása folyamatban. Kérlek várj. 2 perc után időtúllépés." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Modem alapértelmezett" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Modemeszköz" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Modem lecsatlakoztatása folyamatban. Kérlek várj." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "A modem információinak lekérdezése nem sikerült" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Modem előkészítésének időkorlátja" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "Modem letiltva." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "Modemkezelő" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Megfigyelés" @@ -5123,6 +5698,10 @@ msgstr "Mozgatás le" msgid "Move up" msgstr "Mozgatás fel" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5130,19 +5709,23 @@ msgstr "Mozgatás fel" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS-azonosító" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5154,12 +5737,16 @@ msgstr "NAT-T mód" msgid "NAT64 Prefix" msgstr "NAT64-előtag" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5172,18 +5759,23 @@ msgid "NTP server candidates" msgstr "NTP-kiszolgáló jelöltek" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Név" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Az új hálózat neve" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigáció" @@ -5192,13 +5784,17 @@ msgstr "Navigáció" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5207,32 +5803,36 @@ msgstr "" msgid "Network" msgstr "Hálózat" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "Hálózati SSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Hálózati segédprogramok" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Hálózati rendszerindító lemezkép" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Hálózati eszköz" @@ -5245,7 +5845,7 @@ msgstr "Hálózati eszköz aktivitás (kernel: netdev)" msgid "Network device is not present" msgstr "A hálózati eszköz nincs jelen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5254,7 +5854,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5263,27 +5863,33 @@ msgstr "" msgid "Network interface" msgstr "Hálózati csatoló" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 +msgid "Never" +msgstr "Soha" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" msgid "Never" msgstr "Soha" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" "Helyi tartomány meghatározása. Az ezzel a tartománnyal egyező nevek soha sem " -"lesznek továbbítva és csak DHCP-n vagy host fájlok által kerülnek feloldásra" +"lesznek továbbítva és csak DHCP-n vagy host fájlok által kerülnek feloldásra." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Új csatolónév…" @@ -5291,13 +5897,13 @@ msgstr "Új csatolónév…" msgid "Next »" msgstr "Következő »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Nem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Nincs DHCP-kiszolgáló beállítva ehhez a csatolóhoz" @@ -5305,7 +5911,7 @@ msgstr "Nincs DHCP-kiszolgáló beállítva ehhez a csatolóhoz" msgid "No Data" msgstr "Nincs adat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Nincs titkosítás" @@ -5321,9 +5927,17 @@ msgstr "Nincs NAT-T" msgid "No RX signal" msgstr "Nincs RX jel" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5335,7 +5949,11 @@ msgstr "" msgid "No client associated" msgstr "Nincs kliens hozzárendelve" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5344,8 +5962,8 @@ msgstr "" msgid "No data received" msgstr "Nem érkezett adat" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5358,15 +5976,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Nincsenek bejegyzések ebben a könyvtárban" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Nem találhatók fájlok" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5380,7 +5994,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5401,30 +6015,40 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Nincs negatív gyorsítótár" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Nincs jelszó beállítva!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "Nincs csatlakoztatva" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Még nincsenek nyilvános kulcsok." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5439,7 +6063,8 @@ msgid "No validation or filtering" msgstr "Nincs hitelesítés vagy szűrés" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Nincs zóna hozzárendelve" @@ -5451,37 +6076,40 @@ msgstr "Nincs zóna hozzárendelve" msgid "Noise" msgstr "Zaj" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Zajszint (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Zaj:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Nem megelőző CRC-hibák (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Nincs helyettesítő karakter" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Nincs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normál" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Nem található" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Nincs hozzárendelve" @@ -5494,7 +6122,7 @@ msgstr "Nincs csatlakoztatva" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Nincs jelen" @@ -5506,7 +6134,7 @@ msgstr "Nincs elindítva rendszerindításkor" msgid "Not supported" msgstr "Nem támogatott" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 #, fuzzy msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " @@ -5515,6 +6143,12 @@ msgstr "" "Megjegyzés: néhány vezeték nélküli meghajtó nem támogatja a 802.11w " "szabványt. Például: mwlwifi problémát jelezhet" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Megjegyzések" @@ -5523,7 +6157,7 @@ msgstr "Megjegyzések" msgid "Notice" msgstr "Figyelmeztetés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5531,11 +6165,11 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "Gyorsítótárazott DNS-bejegyzések száma (legfeljebb 10000, 0 megadásakor " -"nincs gyorsítótárazás)" +"nincs gyorsítótárazás)." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:311 msgid "Number of peer notifications after failover event" @@ -5550,7 +6184,7 @@ msgid "Obfuscated Password" msgstr "Összekuszált jelszó" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5561,6 +6195,7 @@ msgid "Obtain IPv6 address" msgstr "IPv6-cím beszerzése" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Ki" @@ -5569,6 +6204,12 @@ msgstr "Ki" msgid "Off-State Delay" msgstr "Kikapcsolt állapot késleltetés" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Be" @@ -5577,15 +6218,15 @@ msgstr "Be" msgid "On-State Delay" msgstr "Állapotkori késleltetés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "Kapcsolatkori útválasztás" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "A gépnév vagy a MAC-cím egyikét meg kell adni!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "A következők egyike: %s" @@ -5603,7 +6244,11 @@ msgstr "Egy vagy több érvénytelen/szükséges érték a lapon" msgid "One or more required fields have no value!" msgstr "Egy vagy több kötelező mezőnek nincs értéke!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5612,49 +6257,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Lista megnyitása…" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Működési gyakoriság" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5662,22 +6318,31 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Beállítás megváltoztatva" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Beállítás eltávolítva" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Elhagyható" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5686,7 +6351,7 @@ msgstr "" "Elhagyható. 32 bites jel a kimenő titkosított csomagokhoz. Hexadecimálisan " "adja meg az értéket 0x karakterrel kezdve." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5698,7 +6363,7 @@ msgstr "" "delegált kiszolgálótól, akkor használja az utótagot (például „::1”) az IP-" "cím formázásához („a:b:c:d::1”) a csatolónál." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5706,13 +6371,13 @@ msgstr "" "Elhagyható. Base64 kódolású előre megosztott kulcs. Egy szimmetrikus kulcsú " "kriptográfia további rétegében adja hozzá a kvantum utáni ellenállósághoz." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" "Elhagyható. Útvonalak létrehozása az engedélyezett IP-khez ennél a " "partnernél." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Elhagyható. A partner leírása." @@ -5720,7 +6385,7 @@ msgstr "Elhagyható. A partner leírása." msgid "Optional. Do not create host routes to peers." msgstr "Elhagyható. Ne hozzon létre gépútvonalakat a partnerekhez." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." @@ -5728,7 +6393,7 @@ msgstr "" "Elhagyható. A partner gépe. A nevek a csatoló felhidazása előtt lesznek " "feloldva." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5743,11 +6408,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Elhagyható. Az alagút csatoló legnagyobb átviteli egysége." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Elhagyható. A partner portja." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5755,7 +6420,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5771,7 +6436,7 @@ msgstr "Elhagyható. A kimenő és bejövő csomagokhoz használt UDP port." msgid "Options" msgstr "Beállítások" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Útvonal a CA-tanúsítványhoz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Útvonal az ügyféltanúsítványhoz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Útvonal a személyes kulcshoz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Útvonal a belső CA-tanúsítványhoz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Útvonal a belső ügyféltanúsítványhoz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Útvonal a belső személyes kulcshoz" @@ -6145,11 +6855,19 @@ msgstr "Szüneteltetve" msgid "Peak:" msgstr "Csúcs:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Partner" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Hozzárendelendő partner IP-cím" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -6158,11 +6876,11 @@ msgstr "" msgid "Peer address is missing" msgstr "A partnercím hiányzik" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6193,10 +6911,14 @@ msgstr "Visszaállítás végrehajtása" msgid "Permission denied" msgstr "Hozzáférés megtagadva" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Állandó életben tartás" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6205,13 +6927,13 @@ msgstr "" msgid "Phy Rate:" msgstr "Phy sebesség:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Fizikai beállítások" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6224,11 +6946,11 @@ msgstr "Ping" msgid "Pkts." msgstr "csom." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Adja meg a felhasználónevét és a jelszavát." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Válassza ki a feltöltendő fájlt." @@ -6236,56 +6958,75 @@ msgstr "Válassza ki a feltöltendő fájlt." msgid "Policy" msgstr "Házirend" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Port izoláció" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Port állapota:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Lehetséges tagadása ennek: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Energiakezelési mód" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Megelőző CRC-hibák (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "LTE előnyben részesítése" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "UMTS előnyben részesítése" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Előtag delegálva" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Előre megosztott kulcs" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6310,13 +7051,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Megakadályozza az ügyfél-ügyfél közti kommunikációt" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6329,29 +7071,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Prioritás" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Személyes kulcs" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6369,8 +7113,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6382,13 +7126,13 @@ msgstr "Protokol" msgid "Provide NTP server" msgstr "NTP-kiszolgáló szolgáltatása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Új hálózat szolgáltatása" @@ -6398,25 +7142,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Áleseti (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Nyilvános kulcs" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6448,61 +7203,85 @@ msgstr "QMI sejtes" msgid "Quality" msgstr "Minőség" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" "Az összes elérhető külső DNS-" -"kiszolgáló lekérdezése" +"kiszolgáló lekérdezése." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "R0 kulcs élettartama" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "R1 kulcstartó" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Radius-Elszámolás-Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Radius-Elszámolás-Titok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Radius-Elszámolás-Kiszolgáló" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Radius-Hitelesítés-Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Radius-Hitelesítés-Titok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Radius-Hitelesítés-Kiszolgáló" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "RFC3947 NAT-T mód" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "RSSI küszöbszint a csatlakozáshoz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "RTS/CTS küszöbszint" @@ -6515,10 +7294,16 @@ msgstr "RX" msgid "RX Rate" msgstr "RX sebesség" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "RX-sebesség/TX-sebesség" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6530,13 +7315,13 @@ msgstr "" "Nyers hexadecimális kódolású bájtok. Hagyja üresen, hacsak az internet-" "szolgáltatója nem követelni meg" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" "Az /etc/ethers fájl olvasása a DHCP-kiszolgáló beállításához" +"Configuration Protocol\">DHCP
    -kiszolgáló beállításához." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Valóban protokollt cserél?" @@ -6544,11 +7329,11 @@ msgstr "Valóban protokollt cserél?" msgid "Realtime Graphs" msgstr "Valós idejű grafikonok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Újratársítás határideje" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Újrakötési védelem" @@ -6572,11 +7357,40 @@ msgstr "Újraindítja az eszköz operációs rendszerét" msgid "Receive" msgstr "Fogadás" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Fogadás" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Ajánlott. A WireGuard csatoló IP-címei." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Csatoló újrakapcsolódása" @@ -6584,12 +7398,12 @@ msgstr "Csatoló újrakapcsolódása" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6598,37 +7412,47 @@ msgstr "" msgid "References" msgstr "Hivatkozások" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Frissítés" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Átjátszás" @@ -6638,6 +7462,10 @@ msgstr "Átjátszás" msgid "Relay Bridge" msgstr "Átjátszó híd" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Átjátszás hálózatok között" @@ -6647,6 +7475,14 @@ msgstr "Átjátszás hálózatok között" msgid "Relay bridge" msgstr "Átjátszó híd" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6656,6 +7492,7 @@ msgstr "Távoli IPv4-cím" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Távoli IPv4-cím vagy FQDN" @@ -6668,15 +7505,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Eltávolítás" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Vezeték nélküli beállítások cseréje" @@ -6706,7 +7551,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Kötelező" @@ -6724,7 +7570,7 @@ msgstr "Kötelező. Base64 kódolású személyes kulcs ehhez a csatolóhoz." msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6736,67 +7582,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "A hostapd szükséges" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "EAP támogatással rendelkező hostapd szükséges" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "OWE támogatással rendelkező hostapd szükséges" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "SAE támogatással rendelkező hostapd szükséges" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "WPA-ügyfél szükséges" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "EAP támogatással rendelkező WPA-ügyfél szükséges" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "OWA támogatással rendelkező WPA-ügyfél szükséges" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "SAE támogatással rendelkező WPA-ügyfél szükséges" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6805,7 +7657,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6820,20 +7672,24 @@ msgstr "Számlálók nullázása" msgid "Reset to defaults" msgstr "Visszaállítás az alapértelmezettekre" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Resolv és hosts fájlok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Fájl feloldása" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Az erőforrás nem található" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Újraindítás" @@ -6842,7 +7698,7 @@ msgstr "Újraindítás" msgid "Restart Firewall" msgstr "Tűzfal újraindítása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Rádiócsatoló újraindítása" @@ -6854,88 +7710,99 @@ msgstr "Visszaállítás" msgid "Restore backup" msgstr "Biztonsági mentés visszaállítása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" "Gépnév behatárolása a lekérdező alhálózattól függően, ha több IP-cím is " -"elérhető" +"elérhető." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Jelszó felfedése/elrejtése" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Visszavonás" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Változtatások visszavonása" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "A kérés visszavonása meghiúsult %h állapotkóddal" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Beállítás visszaállítása…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6950,19 +7817,19 @@ msgstr "Gyökér előkészítés" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Engedélyezett IP-k irányítása" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Útvonal típusa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6980,6 +7847,10 @@ msgstr "Útválasztó jelszava" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6994,24 +7865,24 @@ msgstr "" msgid "Rule" msgstr "Szabály" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -7031,11 +7902,24 @@ msgstr "Futás idejű hiba" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7053,15 +7937,15 @@ msgstr "SSH-kiszolgáló portja" msgid "SSH username" msgstr "SSH felhasználónév" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH kulcsok" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7078,7 +7962,7 @@ msgstr "SSTP szerver" msgid "SWAP" msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7089,7 +7973,7 @@ msgid "Save" msgstr "Mentés" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Mentés és alkalmazás" @@ -7106,7 +7990,7 @@ msgstr "Az mtdblock mentése" msgid "Save mtdblock contents" msgstr "Az mtdblock tartalmának mentése" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Keresés" @@ -7115,11 +7999,16 @@ msgstr "Keresés" msgid "Scheduled Tasks" msgstr "Ütemezett feladatok" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Szakasz hozzáadva" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Szakasz eltávolítva" @@ -7137,9 +8026,9 @@ msgstr "" "akkor is ha a lemezképformátum ellenőrzése sikertelen. Csak akkor használja, " "ha biztos abban, hogy a firmware helyes és az Ön eszközéhez készült!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Fájl kiválasztása…" @@ -7147,13 +8036,13 @@ msgstr "Fájl kiválasztása…" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -7174,11 +8063,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7203,16 +8096,20 @@ msgstr "A munkamenet lejárt" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7225,14 +8122,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7246,11 +8143,15 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "DHCP-kiszolgáló beállítása" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7258,33 +8159,37 @@ msgid "Setting PLMN failed" msgstr "A PLMN beállítása nem sikerült" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "A műveleti mód beállítása nem sikerült" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" -msgstr "" +msgstr "Beállítások" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "Súlyosan hibás másodpercek (SES)" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "Rövid GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Rövid előszó" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Jelenlegi biztonsági mentés fájllista megjelenítése" @@ -7297,16 +8202,16 @@ msgstr "Üres láncok megjelenítése" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "A csatoló leállítása" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7314,15 +8219,15 @@ msgstr "A csatoló leállítása" msgid "Signal" msgstr "Jel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Jel/zaj" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Jel csillapítása (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 #, fuzzy msgid "Signal Refresh Rate" msgstr "Jel frissítési ráta" @@ -7331,12 +8236,12 @@ msgstr "Jel frissítési ráta" msgid "Signal:" msgstr "Jel:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Méret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "A DNS lekérdezési gyorsítótár mérete" @@ -7353,12 +8258,12 @@ msgstr "Kihagyás" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Ugrás a tartalomhoz" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Ugrás a navigációhoz" @@ -7376,14 +8281,10 @@ msgstr "Szoftveres VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "Néhány mező érvénytelen, nem lehet menteni az értékeket!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Elnézést, a kért objektum nem található." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Elnézést, a kiszolgáló váratlan hibát észlelt." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7394,8 +8295,8 @@ msgstr "" "lemezképet kézzel kell telepíteni. Nézze meg a wiki szócikket az eszközhöz " "tartozó telepítési utasításokért." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7423,26 +8324,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7467,7 +8368,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7475,7 +8376,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7483,20 +8384,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "Megadja azt a könyvtárat, amelyhez az eszköz csatlakoztatva van" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7528,7 +8429,7 @@ msgstr "" "Megadja a másodpercek legnagyobb számát, amely után a gép halottnak " "tekinthető" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7549,7 +8450,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7580,15 +8481,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7610,19 +8511,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7642,7 +8543,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7741,15 +8642,23 @@ msgstr "" "Egy MTU (Maximum Transmission Unit – legnagyobb átviteli egység) megadása az " "alapértelmezettől (1280 bájttól) eltérően." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Itt adja meg a titkos titkosító kulcsot." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Indítás" @@ -7762,16 +8671,16 @@ msgstr "WPS indítása" msgid "Start priority" msgstr "Indítási prioritás" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Frissítés indítása" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Beállítások alkalmazásának indítása…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Vezeték nélküli keresés indítása…" @@ -7780,6 +8689,10 @@ msgstr "Vezeték nélküli keresés indítása…" msgid "Startup" msgstr "Rendszerindítás" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Statikus IPv4 útvonalak" @@ -7793,7 +8706,7 @@ msgstr "Statikus IPv6-útvonalak" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Statikus bérletek" @@ -7803,7 +8716,7 @@ msgstr "Statikus bérletek" msgid "Static address" msgstr "Statikus cím" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7814,18 +8727,18 @@ msgstr "" "csatoló beállításoknál is szükségesek, ahol csak a megfelelő bérlettel " "rendelkező gépek kerülnek kiszolgálásra." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Állomás tétlenségi korlátja" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Állapot" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Megállítás" @@ -7834,8 +8747,8 @@ msgstr "Megállítás" msgid "Stop WPS" msgstr "WPS leállítása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Frissítés leállítása" @@ -7843,11 +8756,11 @@ msgstr "Frissítés leállítása" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Szigorú sorrend" @@ -7856,17 +8769,17 @@ msgid "Strong" msgstr "Erős" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Elküldés" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Naplózás elnyomása" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." -msgstr "Ezen protokollok rutinműveletei naplózásának elnyomása" +msgstr "Ezen protokollok rutinműveletei naplózásának elnyomása." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:46 msgid "Swap free" @@ -7897,7 +8810,7 @@ msgstr "Kapcsoló VLAN" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Protokoll váltása" @@ -7907,7 +8820,7 @@ msgstr "Protokoll váltása" msgid "Switch to CIDR list notation" msgstr "Váltás CIDR lista jelölésre" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Szimbolikus hivatkozás" @@ -7919,8 +8832,16 @@ msgstr "Szinkronizálás NTP-kiszolgálóval" msgid "Sync with browser" msgstr "Szinkronizálás a böngészővel" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7944,9 +8865,9 @@ msgstr "Rendszer tulajdonságai" msgid "System log buffer size" msgstr "Rendszernapló-puffer mérete" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7975,7 +8896,7 @@ msgstr "" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "TFTP-kiszolgáló gyökere" @@ -7988,26 +8909,37 @@ msgstr "TX" msgid "TX Rate" msgstr "TX sebesség" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tábla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Célplatform" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -8023,26 +8955,26 @@ msgstr "" msgid "Terminate" msgstr "Megszakítás" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8058,7 +8990,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8072,18 +9008,24 @@ msgstr "" "A HE.net végpont frissítési beállítása megváltozott, most az egyszerű " "felhasználónevet kell használnia a felhasználó-azonosító helyett!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -8091,6 +9033,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "A távoli alagútvég IPv4-címe vagy teljesen minősített tartományneve." @@ -8105,6 +9048,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8117,7 +9066,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -8134,22 +9083,26 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 #, fuzzy msgid "The VLAN ID must be unique" msgstr "A VLAN ID-nak egyedinek kell lennie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8161,13 +9114,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "A beállítófájlt nem sikerült betölteni a következő hiba miatt:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8195,18 +9148,18 @@ msgstr "" "A memória vagy partíció eszközfájlja (pl. " "/dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "A/az \"%s\" eszköznév már foglalt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8229,7 +9182,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Jelenleg a következő szabályok aktívak a rendszeren." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -8237,17 +9190,17 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "Az átjáró címe nem lehet helyi IP-cím" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "A megadott SSH nyilvános kulcs már hozzá lett adva." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8255,15 +9208,31 @@ msgstr "" "A megadott SSH nyilvános kulcs érvénytelen. Adjon meg megfelelő nyilvános " "RSA vagy ECDSA kulcsokat." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "A csatoló neve már használatban van" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "A csatoló neve túl hosszú" @@ -8287,6 +9256,7 @@ msgstr "Helyi IPv4 cím" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "A helyi IPv4-cím, amely fölött az alagút létrejön (elhagyható)." @@ -8301,7 +9271,7 @@ msgstr "Helyi IPv4 netmaszk" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8310,7 +9280,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8318,19 +9288,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "A hálózat neve már használatban van" @@ -8351,14 +9321,14 @@ msgstr "" "következő nagyobb hálózathoz (például az internethez) való kapcsolódásra és " "egyéb portok a helyi hálózathoz." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8371,31 +9341,31 @@ msgstr "Az újraindítási parancs sikertelen volt a következő kóddal %d" msgid "The restore command failed with code %d" msgstr "A visszaállítási parancs meghiúsult %d kóddal" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "A kiválasztott %s mód nem használható együtt %s titkosítással" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "A beküldött biztonsági token érvénytelen vagy már lejárt!" @@ -8435,6 +9405,14 @@ msgstr "A rendszerjelszó sikeresen megváltoztatva." msgid "The sysupgrade command failed with code %d" msgstr "A rendszerfrissítési parancs meghiúsult %d kóddal" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8463,31 +9441,38 @@ msgstr "" "A feltöltött lemezképfájl nem tartalmaz támogatott formátumot. Győződjön meg " "arról, hogy az általános lemezképformátumot választotta-e ki a platformjához." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 #, fuzzy -msgid "The value is overridden by configuration. Original: %s" -msgstr "Az érték felülírva a konfiguráció által. Eredeti: %s" +msgid "The value is overridden by configuration." +msgstr "Az érték felülírva a konfiguráció által." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Nincsenek aktív bérletek" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Nincsenek alkalmazandó változtatások" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8500,16 +9485,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "Az átjátszó IPv4-címe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Ez a hitelesítéstípus nem alkalmazható a kijelölt EAP módszerhez." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Ez nem tűnik érvényes PEM fájlnak" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8528,6 +9513,17 @@ msgstr "" "Ez vagy az alagúthoz beállított „Frissítési kulcs”, vagy a fiók jelszava, ha " "nem lett frissítési kulcs beállítva" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8544,11 +9540,11 @@ msgstr "" "Ez az alagút-közvetítő által hozzárendelt helyi végpont címe, amely " "általában így végződik: ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "Ez az egyetlen DHCP a helyi hálózatban" +"abbr> a helyi hálózatban." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "This is the plain username for logging into the account" @@ -8581,8 +9577,8 @@ msgstr "" "Ez a lista áttekintést ad a jelenleg futó rendszerfolyamatokról és azok " "állapotáról." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8592,6 +9588,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2280 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:172 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:32 +#, fuzzy msgid "This section contains no values yet" msgstr "Ez a szakasz még nem tartalmaz értékeket" @@ -8599,31 +9596,39 @@ msgstr "Ez a szakasz még nem tartalmaz értékeket" msgid "Time Synchronization" msgstr "Időszinkronizálás" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Időköz a GTK újrakulcsolásához" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "Időtúllépés" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8631,17 +9636,13 @@ msgstr "" msgid "Timezone" msgstr "Időzóna" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Bejelentkezéshez…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8653,7 +9654,7 @@ msgstr "" "visszaállításához kattintson a „Visszaállítás végrehajtása” gombra (csak " "squashfs lemezképekkel lehetséges)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Tónus" @@ -8661,12 +9662,16 @@ msgstr "Tónus" msgid "Total Available" msgstr "Összes elérhető" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8678,11 +9683,11 @@ msgstr "Forgalom" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8699,6 +9704,27 @@ msgstr "Átvitel" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Adó antenna" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8737,7 +9763,7 @@ msgstr "Alagút csatoló" msgid "Tunnel Link" msgstr "Alagút hivatkozás" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8746,13 +9772,13 @@ msgid "Tx-Power" msgstr "Adóteljesítmény" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Típus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8801,7 +9827,7 @@ msgstr "Nem lehet meghatározni a külső IP-címet" msgid "Unable to determine upstream interface" msgstr "Nem lehet meghatározni a külső csatolót" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Nem lehet elküldeni" @@ -8852,19 +9878,31 @@ msgstr "Nem lehet visszaállítani a tűzfalat: %s" msgid "Unable to save contents: %s" msgstr "Nem lehet elmenteni a tartalmat: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Elérhetetlen másodpercek (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Váratlan válaszadat-formátum" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8878,7 +9916,7 @@ msgstr "" msgid "Unknown" msgstr "Ismeretlen" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8902,11 +9940,11 @@ msgstr "Nem kezelt" msgid "Unmount" msgstr "Leválasztás" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Névtelen kulcs" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Mentetlen változtatások" @@ -8920,15 +9958,25 @@ msgid "Unsupported MAP type" msgstr "Nem támogatott MAP típus" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Nem támogatott modem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Nem támogatott protokolltípus." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8940,7 +9988,7 @@ msgstr "Fel" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Feltöltés" @@ -8957,25 +10005,29 @@ msgstr "" msgid "Upload archive..." msgstr "Archívum feltöltése…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Fájl feltöltése" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Fájl feltöltése…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Feltöltési kérés sikertelen: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Fájl feltöltése…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -8985,33 +10037,37 @@ msgstr "" "lesznek rendelve egy wifinet# formátumban lévő névhez, és a hálózat " "újra lesz indítva a frissített beállítások alkalmazásához." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "A DNS-kiszolgálók a feloldási " -"fájlban lévő sorrend alapján lesznek lekérdezve" +"fájlban lévő sorrend alapján lesznek lekérdezve." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Futási idő" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "/etc/ethers használata" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "DHCP által meghirdetett kiszolgálók használata" @@ -9020,13 +10076,18 @@ msgstr "DHCP által meghirdetett kiszolgálók használata" msgid "Use DHCP gateway" msgstr "DHCP-átjáró használata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "A partner által hirdetett DNS-kiszolgálók használata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "ISO/IEC 3166 alpha2 országkódok használata." @@ -9072,22 +10133,25 @@ msgstr "Használat gyökérfájlrendszerként (/)" msgid "Use broadcast flag" msgstr "Üzenetszórási jelző használata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Beépített IPv6-kezelés használata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Egyedi DNS-kiszolgálók használata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Alapértelmezett átjáró használata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Átjáró metrikájának használata" @@ -9111,15 +10175,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Rendszertanúsítványok használata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "Rendszertanúsítványok használata a belső alagútnál" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9148,11 +10212,11 @@ msgstr "" msgid "Used" msgstr "Használt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Használt kulcstárolóhely" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9160,59 +10224,61 @@ msgstr "" "Két különböző célra használják: RADIUS NAS-azonosító és 802.11r R0KH-" "azonosító. Nem szükséges normál WPA(2)-PSK esetén." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Felhasználói csoport" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Felhasználói tanúsítvány (PEM kódolású)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Felhasználói kulcs (PEM kódolású)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Felhasználónév" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -9232,24 +10298,27 @@ msgstr "VPN helyi cím" msgid "VPN Local port" msgstr "VPN helyi port" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "VPN Protokol" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPN-kiszolgáló" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "VPN-kiszolgáló portja" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "VPN-kiszolgáló tanúsítványának SHA1 kivonata" @@ -9258,6 +10327,10 @@ msgstr "VPN-kiszolgáló tanúsítványának SHA1 kivonata" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (és egyebek) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -9271,16 +10344,16 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" "Távoli támogatású DNSSEC szükséges. Ellenőrizze, hogy az aláíratlan " -"tartományválaszok valóban aláíratlan tartományokból jönnek-e" +"tartományválaszok valóban aláíratlan tartományokból jönnek-e." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9309,7 +10382,7 @@ msgstr "Gyártó" msgid "Vendor Class to send when requesting DHCP" msgstr "DHCP kérésekor küldendő gyártóosztály" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9317,12 +10390,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "A feltöltött képfájl ellenőrzése." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Nagyon magas" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Virtuális Hálózat" @@ -9330,34 +10403,46 @@ msgstr "Virtuális Hálózat" msgid "Virtual dynamic interface" msgstr "Virtuális dinamikus csatoló" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "WEP nyílt rendszer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "WEP megosztott kulcs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "WEP jelmondat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "WMM mód" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "WPA jelmondat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9388,19 +10473,61 @@ msgstr "" msgid "Weak" msgstr "Gyenge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9410,29 +10537,39 @@ msgstr "" "akkor a lenti R0/R1 kulcsbeállítások nincsenek alkalmazva. Tiltsa le ezt az " "R0 és az R1 kulcsbeállítások használatához." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Szélesség" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +#, fuzzy +msgid "WireGuard" +msgstr "WireGuard VPN" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "WireGuard állapot" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9448,21 +10585,21 @@ msgid "Wireless Adapter" msgstr "Vezeték nélküli adapter" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Vezeték nélküli hálózat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Vezeték nélküli áttekintő" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Vezeték nélküli biztonság" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Vezeték nélküli beállítások költöztetése" @@ -9478,17 +10615,17 @@ msgstr "A vezeték nélküli le van tiltva" msgid "Wireless is not associated" msgstr "Vezeték nélküli nincs hozzárendelve" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Vezeték nélküli hálózat letiltva" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Vezeték nélküli hálózat engedélyezve" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." -msgstr "Fogadott DNS-kérések írása a rendszernaplóba" +msgstr "Fogadott DNS-kérések írása a rendszernaplóba." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:181 msgid "Write system log to file" @@ -9498,7 +10635,7 @@ msgstr "Rendszernapló írása fájlba" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9529,8 +10666,20 @@ msgstr "" "előkészítő parancsfájlokat, mint például a „network” parancsfájlt, akkor az " "eszköz elérhetetlenné válhat!
    " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9561,34 +10710,54 @@ msgstr "ZRam beállítások" msgid "ZRam Size" msgstr "ZRam mérete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "bármely" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "automatikus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automatikus" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "áthidalt" @@ -9645,25 +10814,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "letiltás" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "letiltva" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "illesztőprogram alapértelmezettje" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9672,14 +10846,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "lejárt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9689,22 +10872,22 @@ msgstr "" msgid "forward" msgstr "továbbítás" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "teljes kétirányú" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "váltakozó kétirányú" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "hexadecimális kódolt érték" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "rejtett" @@ -9713,9 +10896,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "hibrid mód" @@ -9723,6 +10906,10 @@ msgstr "hibrid mód" msgid "ignore" msgstr "mellőzés" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9737,11 +10924,19 @@ msgstr "8 és 63 karakter közötti kulcs" msgid "key with either 5 or 13 characters" msgstr "kulcs 5 vagy 13 karakterrel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "közepes biztonság" @@ -9750,11 +10945,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "perc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9766,18 +10961,26 @@ msgstr "" msgid "no" msgstr "nem" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "nincs kapcsolat" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "nem üres érték" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "nincs" @@ -9788,20 +10991,20 @@ msgid "not present" msgstr "nincs jelen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "ki" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "nyitott hálózat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9810,6 +11013,10 @@ msgstr "" msgid "output" msgstr "kimenet" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "több mint egy nappal ezelőtt" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9827,23 +11034,32 @@ msgstr "pozitív egész szám érték" msgid "random" msgstr "véletlen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "átjátszás mód" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "irányított" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "mp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "kiszolgálómód" @@ -9851,7 +11067,7 @@ msgstr "kiszolgálómód" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "erős biztonság" @@ -9859,7 +11075,7 @@ msgstr "erős biztonság" msgid "tagged" msgstr "címkézett" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "időmértékegységek (IM / 1 024 ms) [1000-65535]" @@ -9870,25 +11086,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "egyedi érték" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "ismeretlen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "korlátlan" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9910,8 +11128,8 @@ msgid "untagged" msgstr "címkézetlen" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "érvényes IP-cím" @@ -9924,7 +11142,7 @@ msgid "valid IPv4 CIDR" msgstr "érvényes IPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "érvényes IPv4-cím" @@ -9953,7 +11171,7 @@ msgid "valid IPv6 CIDR" msgstr "érvényes IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "érvényes IPv6-cím" @@ -9990,8 +11208,8 @@ msgstr "érvényes UCI-azonosító, gépnév vagy IP-cím" msgid "valid address:port" msgstr "érvényes cím:port" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "érvényes dátum (YYYY-MM-DD)" @@ -10031,11 +11249,21 @@ msgstr "érvényes egész érték" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "érvényes hálózat cím/hálózati maszk jelölésben" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "érvényes telefonszám karakter (0-9, „*”, „#”, „!” vagy „.”)" @@ -10045,43 +11273,43 @@ msgid "valid port or port range (port1-port2)" msgstr "érvényes port vagy porttartomány (port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "érvényes portérték" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "érvényes idő (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "%d és %d karakter közötti érték" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "%f és %f közötti érték" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "az érték nagyobb vagy egyenlő mint %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "az érték kisebb vagy egyenlő mint %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "érték %d karakterrel" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "érték legalább %d karakterrel" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "érték legfeljebb %d karakterrel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "gyenge biztonság" diff --git a/package/luci/modules/luci-base/po/it/base.po b/package/luci/modules/luci-base/po/it/base.po index d6d3bf6dac..546d11b1b4 100644 --- a/package/luci/modules/luci-base/po/it/base.po +++ b/package/luci/modules/luci-base/po/it/base.po @@ -3,37 +3,53 @@ msgstr "" "Project-Id-Version: LuCI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:40+0200\n" -"PO-Revision-Date: 2022-11-09 19:39+0000\n" -"Last-Translator: casell \n" -"Language-Team: Italian \n" +"Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.1.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "!known (sconosciuto)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" -msgstr "" +msgstr "\"%h\" tabella \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d campo/i non valido/i" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%dore fa" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%dmin fa" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%dsec fa" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" -msgstr "%s non è taggato in VLAN multiple!" +msgstr "%s è senza tag in più VLAN!" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:296 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:405 @@ -55,32 +71,33 @@ msgstr "(vuoto)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(nessuna interfaccia collegata)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" -msgstr "" +msgstr "+ altri %d" #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:48 msgid "-- Additional Field --" -msgstr "-- Campo Aggiuntivo --" +msgstr "-- Campo aggiuntivo --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Scegli --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- personalizzato --" @@ -106,7 +123,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = non usare la soglia RSSI, 1 = non modificare l'impostazione predefinita " @@ -121,12 +138,17 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Carico in 1 minuto:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "1 flag" +msgstr[1] "%d flag" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12h (12 ore - predefinito)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" @@ -142,12 +164,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3h (3 ore)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "ID esadecimale di 4 caratteri" @@ -160,43 +187,105 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Carico in 5 minuti:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5m (5 minuti)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "stringa esadecimale di 6 byte (12 caratteri) - senza separatori" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7d (7 giorni)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: attiva la segnalazione dei beacon tramite le misure radio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: attiva la segnalazione dei vicini tramite le misure radio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" -msgstr "802.11r transizione BSS rapida (Fast Transition)" +msgstr "Trasmissione rapida 802.11r" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: max inattività BSS. Unità: secondi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: gestione della transizione del Basic Service Set (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: annuncio del fuso orario locale nei frame di gestione." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: l'ARP proxy consente agli STA non-AP di restare in risparmio " +"energetico più a lungo." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: annuncio dell'orario nei frame di gestione." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: modalità sleep di Wireless Network Management (WNM) (modalità sleep " +"estesa per le stazioni)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: correzioni alla modalità sleep della gestione della rete wireless " +"(WNM): previene gli attacchi di reinstallazione." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "Timeout massimo per Secure Association Query 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" -msgstr "Tempo di attesa per retry di Secure Association Query 802.11w" +msgstr "" +"Tempo di attesa per nuovo tentativo di Secure Association Query 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "Protezione frame di gestione 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "Timeout massimo 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" -msgstr "Tempo di attesa per retry 802.11w" +msgstr "Tempo di attesa per nuovo tentativo 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "" "Maschera di rete IPv4" @@ -213,107 +302,200 @@ msgstr "" "Nome del LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "Proxy NDP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "Flag RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "Limite degli hop RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "Durata RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" -msgstr "MTU RA" +msgstr "MTU RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "Servizio RA" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ corrisponde a qualsiasi dominio. /example.com/ " +"restituisce NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# restituisce indirizzi NULL (0.0.0.0 " +"e ::) per example.com e i suoi sottodomini." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" -msgstr "" +msgstr "%s maggiore di %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:85 msgctxt "nft relational \">=\" operator expression" msgid "%s greater than or equal to %s" -msgstr "" +msgstr "%s maggiore o uguale a %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:90 msgctxt "nft set match expression" msgid "%s in set %s" -msgstr "" +msgstr "%s nel set %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:83 msgctxt "nft relational \"==\" operator expression" msgid "%s is %s" -msgstr "" +msgstr "%s è %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:89 msgctxt "nft relational \"in\" operator expression" msgid "%s is one of %s" -msgstr "" +msgstr "%s è uno di %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:88 msgctxt "nft relational \"<\" operator expression" msgid "%s lower than %s" -msgstr "" +msgstr "%s inferiore a %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:86 msgctxt "nft relational \"<=\" operator expression" msgid "%s lower than or equal to %s" -msgstr "" +msgstr "%s inferiore o uguale a %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:84 msgctxt "nft relational \"!=\" operator expression" msgid "%s not %s" -msgstr "" +msgstr "%s non %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:91 msgctxt "nft not in set match expression" msgid "%s not in set %s" +msgstr "%s non nel set %s" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." msgstr "" +"Un nodo batman-adv può funzionare in modalità server (condividendo la sua " +"connessione a internet con la rete), in modalità client (cercando la " +"connessione a internet più adatta nella rete) o con il supporto del gateway " +"completamente disattivato (che è l'impostazione predefinita)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Esiste già una configurazione per il dispositivo \"%s\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." -msgstr "Esiste già una directory con lo stesso nome del file." +msgstr "Esiste già una cartella con lo stesso nome." #: modules/luci-base/htdocs/luci-static/resources/luci.js:2666 msgid "A new login is required since the authentication session expired." msgstr "" -"È necessario un nuovo login poiché la sessione di autenticazione è scaduta." +"È necessario un nuovo accesso poiché la sessione di autenticazione è scaduta." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (tutte le varianti) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (tutte le varianti) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (tutte le varianti) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (tutte le varianti) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (tutte le varianti) Annex B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (tutte le varianti) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (tutte le varianti) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annex L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -324,51 +506,62 @@ msgstr "ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:366 msgid "ARP IP Targets" -msgstr "" +msgstr "Destinazioni IP ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:358 msgid "ARP Interval" -msgstr "" +msgstr "Intervallo ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:382 msgid "ARP Validation" -msgstr "" +msgstr "Validazione ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:374 msgid "ARP mode to consider a slave as being up" -msgstr "" +msgstr "Modalità ARP per considerare attivo uno slave" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:79 msgid "ARP monitoring is not supported for the selected policy!" -msgstr "" +msgstr "Il monitoraggio ARP non è supportato per il criterio selezionato!" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 msgid "ARP retry threshold" -msgstr "Soglia di riprova ARP" +msgstr "Soglia di tentativi ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" +msgstr "Tabella di traffico ARP \"%h\"" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." msgstr "" +"ARP, IPv4 e IPv6 (anche 802.1Q) con MAC di destinazione multicast sono " +"unicast all'indirizzo MAC STA. Nota: questo non è il Directed Multicast " +"Service (DMS) di 802.11v. Nota: potrebbe infrangere le aspettative multicast " +"del ricevitore STA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" -msgstr "" +msgstr "ATM (Asynchronous Transfer Mode)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "Ponti ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "Identificatore Canale Virtuale ATM (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "Identificatore Percorso Virtuale ATM (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -378,37 +571,33 @@ msgstr "" "interfacce di rete virtuali Linux che possono essere usate insieme a DHCP o " "PPP per connettersi alla rete del provider." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Numero dispositivo ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Interfaccia assente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" -"Accetta query DNS solo da host il cui indirizzo si trova su una sottorete " -"locale." +"Accetta richieste DNS solo da host il cui indirizzo si trova in una " +"sottorete locale." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Accetta locale" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:95 msgctxt "nft accept action" msgid "Accept packet" -msgstr "" +msgstr "Accetta pacchetto" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Accetta pacchetti con indirizzo di origine locale" @@ -416,16 +605,25 @@ msgstr "Accetta pacchetti con indirizzo di origine locale" msgid "Access Concentrator" msgstr "Concentratore d'Accesso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" -msgstr "Punto di Accesso (AP)" +msgstr "Punto di accesso (AP)" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Isolamento del punto di accesso" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Tecnologie di accesso" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Azioni" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Attivo" @@ -449,7 +647,7 @@ msgstr "Instradamenti IPv4 attivi" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:258 msgid "Active IPv4 Rules" -msgstr "" +msgstr "Regole IPv4 attive" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:265 msgid "Active IPv6 Routes" @@ -457,44 +655,44 @@ msgstr "Instradamenti IPv6 attivi" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:268 msgid "Active IPv6 Rules" -msgstr "" +msgstr "Regole IPv6 attive" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:205 msgid "Active-Backup policy (active-backup, 1)" -msgstr "" +msgstr "Criterio di backup attivo (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:210 msgid "Adaptive load balancing (balance-alb, 6)" -msgstr "" +msgstr "Bilanciamento adattativo del carico (balance-alb, 6)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:209 msgid "Adaptive transmit load balancing (balance-tlb, 5)" -msgstr "" +msgstr "Bilanciamento adattativo del carico di trasmissione (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2233 #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Aggiungi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" -msgstr "" +msgstr "Aggiungi ponte ATM" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:92 msgid "Add IPv4 address…" @@ -512,11 +710,11 @@ msgstr "Aggiungi azione LED" msgid "Add VLAN" msgstr "Aggiungi VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Aggiungi configurazione dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Aggiungi configurazione dispositivo…" @@ -524,38 +722,42 @@ msgstr "Aggiungi configurazione dispositivo…" msgid "Add instance" msgstr "Aggiungi istanza" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Aggiungi chiave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." -msgstr "Aggiungi il suffisso di dominio locale ai nomi serviti dal file hosts." +msgstr "Aggiungi il suffisso di dominio locale ai nomi serviti dai file hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Aggiungi nuova interfaccia..." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:224 msgid "Add peer" -msgstr "" +msgstr "Aggiungi peer" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "Aggiungi voci DNS statiche di inoltro e inverse per questo host." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" -msgstr "Aggiungi alla Blacklist" +msgstr "Aggiungi alla lista nera" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Whitelist" -msgstr "Aggiungi alla Whitelist" +msgstr "Aggiungi alla lista bianca" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "File Hosts aggiuntivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "File server aggiuntivi" @@ -572,20 +774,26 @@ msgstr "File server aggiuntivi" msgid "Address" msgstr "Indirizzo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" +"Le famiglie di indirizzi \"Relay da\" e \"Relay a indirizzo\" devono " +"corrispondere." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" -msgstr "" +msgstr "Famiglia di indirizzi" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:284 msgid "Address setting is invalid" -msgstr "" +msgstr "L'impostazione dell'indirizzo non è valida" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 msgid "Address to access local relay bridge" -msgstr "Indirizzo per accedere al bridge locale di trasmissione" +msgstr "Indirizzo per accedere al ponte relay locale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Indirizzi" @@ -594,47 +802,51 @@ msgstr "Indirizzi" msgid "Administration" msgstr "Amministrazione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" -msgstr "Impostazioni Avanzate" +msgstr "Impostazioni avanzate" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" -msgstr "" +msgstr "Opzioni avanzate del dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" -msgstr "" +msgstr "Tempo di invecchiamento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Messaggi aggregati dell'originatore" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" -msgstr "" +msgstr "Logica di selezione dell'aggregazione" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:263 msgid "Aggregator: All slaves down or has no slaves (stable, 0)" -msgstr "" +msgstr "Aggregatore: tutti gli slave inattivi o non ha slave (stabile, 0)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:265 msgid "" "Aggregator: Chosen by the largest number of ports + slave added/removed or " "state changes (count, 2)" msgstr "" +"Aggregatore: scelto dal maggior numero di porte + slave aggiunti/rimossi o " +"cambiamenti di stato (conteggio, 2)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:264 msgid "Aggregator: Slave added/removed or state changes (bandwidth, 1)" msgstr "" +"Aggregatore: slave aggiunto/rimosso o modifiche di stato (larghezza di " +"banda, 1)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:192 msgid "Alert" @@ -644,27 +856,27 @@ msgstr "Allarme" #: modules/luci-compat/luasrc/model/network.lua:1417 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:62 msgid "Alias Interface" -msgstr "" +msgstr "Interfaccia di alias" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:146 msgid "Alias of \"%s\"" -msgstr "" +msgstr "Alias di \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Tutti i server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -"Assegna gli indirizzi IP consecutivamente, a partire dall'indirizzo più " -"basso disponibile." +"Assegna gli indirizzi IP in sequenza, a partire dall'indirizzo più basso " +"disponibile." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" -msgstr "Assegna IP consecutivi" +msgstr "Assegna gli IP in sequenza" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 msgid "Allow SSH password authentication" @@ -672,29 +884,29 @@ msgstr "" "Permetti autenticazione SSH tramite " "password" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" -"In modalità Punto di Accesso (AP) consenti la disconnessione dei client in " -"condizioni di acknowledgement scarso" +"Consenti alla modalità AP di disconnettere i client in base a una condizione " +"di ACK basso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" -msgstr "Consenti tutti tranne quelli nell'elenco" +msgstr "Consenti tutti tranne quelli elencati" #: modules/luci-compat/root/usr/share/rpcd/acl.d/luci-compat.json:3 msgid "Allow full UCI access for legacy applications" -msgstr "" +msgstr "Consenti l'accesso completo all'UCI per le applicazioni legacy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Consenti velocità 802.11b legacy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" -msgstr "Consenti solo quelli nell'elenco" +msgstr "Consenti solo quelli elencati" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Permetti localhost" @@ -705,7 +917,8 @@ msgstr "Permetti di riavviare il dispositivo" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Allow remote hosts to connect to local SSH forwarded ports" msgstr "" -"Permetti agli host remoti di connettersi alle porte SSH locali reindirizzate" +"Permetti agli host remoti di connettersi alle porte locali reindirizzate via " +"SSH" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 msgid "Allow root logins with password" @@ -713,24 +926,29 @@ msgstr "Permetti l'accesso a root con password" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:3 msgid "Allow system feature probing" -msgstr "" +msgstr "Permetti il rilevamento delle funzioni del sistema" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" -msgstr "Abilita l'accesso all'utente root via password" +msgid "Allow the root user to log in with password" +msgstr "Permetti all'utente root di accedere con la password" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "IP permessi" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "Tecnologia di rete consentita" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" -msgstr "" +msgstr "L'impostazione AllowedIPs non è valida" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" -msgstr "" +msgstr "Sempre" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:6 msgid "Always off (kernel: none)" @@ -740,11 +958,12 @@ msgstr "Sempre spento (kernel: none)" msgid "Always on (kernel: default-on)" msgstr "Sempre acceso (kernel: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" +"Invia sempre le Opzioni DHCP. A volte è necessario, ad es. con PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -752,125 +971,87 @@ msgstr "" "Usa sempre canali da 40MHz anche se il canale secondario si sovrappone. " "L’utilizzo di questa opzione non è conforme all’IEEE 802.11-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" -msgstr "Quantità di probe DAD (Duplicate Address Detection) da inviare" +msgstr "Quantità di sonde DAD (Duplicate Address Detection) da inviare" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Numero di secondi da attendere affinché il modem sia pronto" #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" -msgstr "Errore durante il salvataggio del form:" +msgstr "Errore durante il salvataggio del modulo:" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 msgid "An optional, short description for this device" msgstr "Una breve descrizione facoltativa per questo dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" +"Annuncia il prefisso NAT64 nei messaggi RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." -msgstr "" +msgstr "Annuncia questo dispositivo come server DNS IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" +"Annuncia questo dispositivo come router predefinito se è presente un " +"instradamento predefinito IPv6 locale." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" +"Annuncia questo dispositivo come router predefinito se è disponibile un " +"prefisso IPv6 pubblico, indipendentemente dalla disponibilità di un " +"instradamento predefinito locale." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" +"Annuncia questo dispositivo come router predefinito, indipendentemente dalla " +"presenza di un prefisso o di un instradamento predefinito." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" -msgstr "" +msgstr "Domini DNS annunciati" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" -msgstr "" +msgstr "Server DNS IPv6 annunciati" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" -msgstr "" +msgstr "Identità anonima" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 msgid "Anonymous Mount" -msgstr "" +msgstr "Mount anonimo" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 msgid "Anonymous Swap" -msgstr "" +msgstr "Swap anonima" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" -msgstr "" +msgstr "Qualsiasi pacchetto" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:84 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:174 @@ -879,56 +1060,64 @@ msgstr "" msgid "Any zone" msgstr "Qualsiasi zona" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." -msgstr "" +msgstr "Applica le Opzioni DHCP a questa rete. (Vuoto = tutti i client)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" -msgstr "" +msgstr "Applica e mantieni le impostazioni" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 msgid "Apply backup?" -msgstr "" +msgstr "Applicare il backup?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" -msgstr "" +msgstr "Richiesta di applicazione non riuscita con stato %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Applica senza controllo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" -msgstr "" +msgstr "Applica con ripristino dopo la perdita di connettività" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" -msgstr "Applicazione delle modifiche in corso… %ds" +msgstr "Applicazione delle modifiche… %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Architettura" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" -msgstr "" +msgstr "Arp-scan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" +"Assegna una parte della lunghezza data di ogni prefisso IPv6 pubblico a " +"questa interfaccia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "Assegna nuove etichette in forma libera a questa voce." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" +"Assegna le parti del prefisso usando questo ID di sottoprefisso esadecimale " +"per questa interfaccia." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Dispositivi collegati" @@ -937,51 +1126,60 @@ msgstr "Dispositivi collegati" msgid "Associations" msgstr "Collegati" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" +"Almeno %h per %h, burst di %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" msgstr "" +"Al massimo %h per %h, burst di %h" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 msgid "Attempt to enable configured mount points for attached devices" msgstr "" +"Tentativo di attivare i punti di montaggio configurati per i dispositivi " +"collegati" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" -msgstr "" +msgstr "Gruppo auth" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Autenticazione" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Tipo di autenticazione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autoritativo" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" -msgstr "Autorizzazione Richiesta" +msgstr "Autorizzazione richiesta" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1001,11 +1199,13 @@ msgstr "" "Controlla automaticamente la presenza di errori nel filesystem prima di " "montare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." msgstr "" +"Gestione automatica di più interfacce di uplink mediante criteri di " +"instradamento basati sull'origine." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 msgid "Automatically mount filesystems on hotplug" @@ -1017,15 +1217,19 @@ msgstr "Monta automaticamente lo swap in hotplug" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 msgid "Automount Filesystem" -msgstr "Automonta Filesystem" +msgstr "Automonta filesystem" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 msgid "Automount Swap" -msgstr "Automonta Swap" +msgstr "Automonta swap" + +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" -msgstr "Disponibile" +msgstr "Disponibili" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:270 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:280 @@ -1041,11 +1245,15 @@ msgstr "Disponibile" msgid "Average:" msgstr "Media:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Evita loop di ponti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1053,30 +1261,30 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "Transizione BSS" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Indietro" #: modules/luci-compat/luasrc/view/cbi/footer.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:48 msgid "Back to Overview" -msgstr "Ritorna alla Panoramica" +msgstr "Torna alla panoramica" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Torna alla configurazione" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" -msgstr "" +msgstr "Torna alla configurazione peer" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:391 msgid "Backup" @@ -1084,70 +1292,119 @@ msgstr "Backup" #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:128 msgid "Backup / Flash Firmware" -msgstr "Backup / Flash Firmware" +msgstr "Backup / Flash firmware" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Elenco dei file di backup" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" -msgstr "" +msgstr "Banda" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Dispositivo base" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 msgid "Base64-encoded public key of this interface for sharing." msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +"Chiave pubblica di questa interfaccia codificata in base64 per la " +"condivisione." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Dispositivo Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Interfaccia Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv ha una frammentazione di livello 2 integrata per i dati unicast " +"che fluiscono attraverso la rete, che consente di eseguire batman-adv su " +"interfacce/connessioni che non permettono di aumentare l'MTU oltre la " +"dimensione standard dei pacchetti Ethernet di 1500 byte. Quando la " +"frammentazione è attiva, batman-adv frammenta automaticamente i pacchetti " +"sovradimensionati e li ricompone all'altra estremità. In modo predefinito, " +"la frammentazione è attivata e inattiva se il pacchetto è adatto, ma si può " +"disattivare completamente." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" -msgstr "Intervallo Beacon" +msgstr "Intervallo beacon" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Resoconto beacon" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " "defined backup patterns." msgstr "" -"Di seguito è riportato l'elenco dei file sottoposti a backup. Esso è " -"composto da file di configurazione modificati contrassegnati da opkg, file " -"di base essenziali e schemi di backup definiti dall'utente." +"Di seguito l'elenco dei file sottoposti a backup. È composto da file di " +"configurazione modificati contrassegnati da opkg, file di base essenziali e " +"schemi di backup definiti dall'utente." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:287 msgid "Bind NTP server" -msgstr "" +msgstr "Vincola server NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." -msgstr "" +msgstr "Vincola dinamicamente alle interfacce anziché all'indirizzo jolly." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" +msgstr "Vincola interfaccia" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" +"Vincola i record di servizio a un nome di dominio: specifica la posizione " +"dei servizi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." msgstr "" +"Vincola i record di servizio a un nome di dominio: specifica la posizione " +"dei servizi. Vedere RFC2782." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." -msgstr "" +msgstr "Vincola il tunnel a questa interfaccia (facoltativo)." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 @@ -1155,65 +1412,77 @@ msgstr "" msgid "Bitrate" msgstr "Bitrate" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Modalità di vincolo" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" -msgstr "" +msgstr "Criterio di vincolo" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "Sia \"Relay da\" che \"Relay a indirizzo\" devono essere specificati." #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" -msgstr "" +msgstr "Bridge (supporta la comunicazione diretta tra MAC VLAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" -msgstr "" +msgstr "Filtraggio VLAN del bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Dispositivo bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" -msgstr "" +msgstr "Opzioni specifiche della porta bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Porte del bridge" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" -msgstr "" +msgstr "Tabella traffico bridge \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Numero unità bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Attiva bridge vuoto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Attiva all'avvio" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "Attiva l'interfaccia bridge anche se non sono collegate porte" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "Trasmissione" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" -msgstr "" +msgstr "Criterio di trasmissione (broadcast, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Sfoglia…" @@ -1221,13 +1490,37 @@ msgstr "Sfoglia…" msgid "Buffered" msgstr "In buffer" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 -msgid "CA certificate; if empty it will be saved after the first connection." +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." msgstr "" +"Certificato CA (codificato PEM); usalo al posto dell'archivio di sistema per " +"verificare il certificato del gateway." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 +msgid "CA certificate; if empty it will be saved after the first connection." +msgstr "Certificato CA; se vuoto verrà salvato dopo la prima connessione." + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" -msgstr "" +msgstr "Configurazione CLAT fallita" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "CNAME" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME o fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (Interfaccia gestita esternamente)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" @@ -1241,104 +1534,129 @@ msgstr "In cache" #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:53 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:21 msgid "Call failed" +msgstr "Chiamata fallita" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." msgstr "" +"Può essere utile se l'ISP dispone di server dei nomi IPv6 ma non fornisce " +"l'instradamento IPv6." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Annulla" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:347 msgid "Cannot parse configuration: %s" -msgstr "" +msgstr "Impossibile analizzare la configurazione: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" -msgstr "" +msgstr "Cattura i pacchetti in entrata indirizzati ad altri host" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" +"Cattura i pacchetti in entrata prima di qualsiasi decisione di instradamento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" -msgstr "" +msgstr "Cattura i pacchetti in entrata instradati al sistema locale" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" +"Cattura i pacchetti in uscita dopo qualsiasi decisione di instradamento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" -msgstr "" +msgstr "Cattura i pacchetti in uscita provenienti dal sistema locale" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" -msgstr "" +msgstr "Cattura i pacchetti subito dopo che la NIC li ha ricevuti" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:17 msgid "Category" msgstr "Categoria" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -msgid "Certificate constraint (Domain)" -msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "ID cella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "Posizione cella" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +msgid "Certificate constraint (Domain)" +msgstr "Vincolo del certificato (Dominio)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" -msgstr "" +msgstr "Vincolo del certificato (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" -msgstr "" +msgstr "Vincolo del certificato (Soggetto)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" -msgstr "" +msgstr "Vincolo del certificato (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" +"Sottostringa del vincolo del certificato - es. /CN=wifi.mycompany.com
    Vedere `logread -f` durante l'handshake per i valori effettivi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" +"Vincolo/i del certificato rispetto ai valori DNS SAN (se disponibili)
    o " +"Subject CN (corrispondenza esatta)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" +"Vincolo/i del certificato rispetto ai valori DNS SAN (se disponibili)
    o " +"Subject CN (corrispondenza del suffisso)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" msgstr "" +"Vincolo/i del certificato tramite i valori del Subject Alternate Name
    (attributi supportati: EMAIL, DNS, URI) - es. DNS:wifi.mycompany.com" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:57 @@ -1346,16 +1664,16 @@ msgstr "" msgid "Chain" msgstr "Catena" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" -msgstr "" +msgstr "Hook della catena \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Modifiche" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Le modifiche sono state annullate." @@ -1366,18 +1684,19 @@ msgstr "Cambia la password di amministratore per accedere al dispositivo" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Canale" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" -msgstr "Analisi dei canali WiFi" +msgstr "Analisi dei canali" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Larghezza del canale" @@ -1385,10 +1704,10 @@ msgstr "Larghezza del canale" msgid "Check filesystems before mount" msgstr "Controlla i filesystem prima di montare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" -"Seleziona questa opzione per cancellare le reti esistenti da questa radio." +"Seleziona questa opzione per eliminare le reti esistenti da questa radio." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:110 msgid "Checking archive…" @@ -1403,30 +1722,30 @@ msgstr "Controllo dell'immagine…" msgid "Choose mtdblock" msgstr "Seleziona mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " "fill out the custom field to define a new zone and attach the " "interface to it." msgstr "" -"Scegli la zona del firewall che si desidera assegnare a questa interfaccia. " -"Selezionare non specificato per rimuovere l'interfaccia dalla zona " -"associata o compilare il campo crea per definire una nuova zona e " -"collegare l'interfaccia ad esso." +"Scegli la zona del firewall che vuoi assegnare a questa interfaccia. " +"Seleziona non specificata per rimuovere l'interfaccia dalla zona " +"associata o compila il campo crea per definire una nuova zona e " +"collegare l'interfaccia ad essa." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" -"Scegliere la rete o le reti a cui vuoi collegare questa interfaccia wireless " -"o riempire il campo crea per definire una nuova rete." +"Scegli la/e rete/i a cui vuoi collegare questa interfaccia wireless o riempi " +"il campo crea per definire una nuova rete." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" -msgstr "Algoritmo cifratura" +msgstr "Cifrario" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:91 msgid "Cisco UDP encapsulation" @@ -1437,7 +1756,7 @@ msgid "" "Click \"Generate archive\" to download a tar archive of the current " "configuration files." msgstr "" -"Premi su \"Genera archivio\" per scaricare un archivio tar dei file di " +"Clicca \"Genera archivio\" per scaricare un archivio tar dei file di " "configurazione attuali." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:424 @@ -1445,23 +1764,24 @@ msgid "" "Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS " "FEATURE IS FOR PROFESSIONALS! )" msgstr "" -"Premi \"Salva mtdblock\" per avviare il download del file mtdblock " -"selezionato. (ATTENZIONE: QUESTA FUNZIONE È PER ESPERTI!)" +"Clicca \"Salva mtdblock\" per scaricare il file mtdblock selezionato. " +"(ATTENZIONE: QUESTA FUNZIONE È PER PROFESSIONISTI!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Client" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:37 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:33 msgid "Client ID to send when requesting DHCP" -msgstr "ID Cliente da inviare all'interno della richiesta DHCP" +msgstr "ID del client da inviare nella richiesta DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Chiudi" @@ -1478,19 +1798,19 @@ msgstr "" "Chiudi le connessioni inattive dopo un determinato numero di secondi, usa 0 " "per connessioni persistenti" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Chiudi elenco..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." -msgstr "Sto raccogliendo i dati..." +msgstr "Raccolta dei dati..." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "Collisioni viste" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" @@ -1498,7 +1818,7 @@ msgstr "Comando" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:401 msgid "Command OK" -msgstr "" +msgstr "Comando OK" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:33 msgid "Command failed" @@ -1508,7 +1828,7 @@ msgstr "Comando fallito" msgid "Comment" msgstr "Commento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1516,45 +1836,44 @@ msgid "" "negotiation especially in environments with heavy traffic load." msgstr "" "Complica gli attacchi per reinstallazione della chiave sul client " -"disabilitando la ritrasmissione dei frame EAPOL-Key utilizzati per " -"installare le chiavi. Questa soluzione alternativa potrebbe causare problemi " -"di interoperabilità e una ridotta robustezza della negoziazione delle " -"chiavi, soprattutto in ambienti con traffico pesante." +"disattivando la ritrasmissione dei frame EAPOL-Key usati per installare le " +"chiavi. Questo espediente potrebbe causare problemi di interoperabilità e " +"una ridotta robustezza della negoziazione delle chiavi, soprattutto in " +"ambienti con traffico elevato." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:106 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:108 msgid "Compute outgoing checksum (optional)." -msgstr "Calcolare il checksum in uscita (facoltativo)." +msgstr "Calcola il checksum in uscita (facoltativo)." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Config File" -msgstr "" +msgstr "File di configurazione" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Configurazione" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" -msgstr "" +msgstr "Esportazione della configurazione" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Modifiche alla configurazione applicate." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Le modifiche alla configurazione sono state annullate!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" -msgstr "Configurazione non riuscita" +msgstr "Configurazione fallita" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1563,23 +1882,23 @@ msgid "" "the basic rate. Supported rates lower than the minimum basic rate are not " "offered." msgstr "" -"Configura le velocità in base alla densità delle celle di copertura. Normale " -"configura le velocità di base a 6, 12, 24 Mbps se le velocità 802.11b legacy " -"non sono utilizzate, altrimenti a 5,5, 11 Mbps. Alta configura le velocità " -"di base a 12, 24 Mbps se le velocità 802.11b legacy non sono utilizzate, " -"altrimenti alla velocità di 11 Mbps. Molto Alta configura 24 Mbps come " -"velocità di base. Non sono offerte velocità supportate inferiori alle " -"velocità di base." +"Configura le velocità in base alla densità delle celle di copertura. " +"\"Normale\" configura le velocità di base a 6, 12, 24 Mbps se le velocità " +"802.11b legacy non sono usate, altrimenti a 5.5, 11 Mbps. \"Alta\" configura " +"le velocità di base a 12, 24 Mbps se le velocità 802.11b legacy non sono " +"usate, altrimenti a 11 Mbps. \"Molto alta\" configura 24 Mbps come velocità " +"di base. Non sono offerte velocità supportate inferiori alle velocità di " +"base." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -"Configura il router predefinito da annunciare nei messaggi RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1587,34 +1906,33 @@ msgstr "" "Configura la modalità operativa del servizio RA su questa interfaccia." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -"Configura la modalità di funzionamento del servizio DHCPv6 su questa " -"interfaccia." +"Configura la modalità operativa del servizio DHCPv6 su questa interfaccia." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -"Configura la modalità di funzionamento del servizio proxy NDP su questa " -"interfaccia." +"Configura la modalità operativa del servizio proxy NDP su questa interfaccia." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Configurare…" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:176 msgid "Confirm disconnect" -msgstr "" +msgstr "Conferma disconnessione" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:55 msgid "Confirmation" msgstr "Conferma" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Connesso" @@ -1622,15 +1940,15 @@ msgstr "Connesso" #: modules/luci-base/htdocs/luci-static/resources/network.js:9 #: modules/luci-compat/luasrc/model/network.lua:27 msgid "Connection attempt failed" -msgstr "Tentativo di connessione non riuscito" +msgstr "Tentativo di connessione fallito" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." -msgstr "Tentativo di connessione non riuscito." +msgstr "Tentativo di connessione fallito." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" -msgstr "" +msgstr "Endpoint della connessione" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:411 msgid "Connection lost" @@ -1640,27 +1958,31 @@ msgstr "Connessione persa" msgid "Connections" msgstr "Connessioni" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" -msgstr "" +msgstr "Cambio di connettività" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:31 msgctxt "nft ct state" msgid "Conntrack state" -msgstr "" +msgstr "Stato Conntrack" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:33 msgctxt "nft ct status" msgid "Conntrack status" -msgstr "" +msgstr "Stato Conntrack" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:378 msgid "Consider the slave up when all ARP IP targets are reachable (all, 1)" msgstr "" +"Considera attivo lo slave quando tutte le destinazioni IP ARP sono " +"raggiungibili (tutti, 1)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:377 msgid "Consider the slave up when any ARP IP target is reachable (any, 0)" msgstr "" +"Considerare attivo lo slave quando qualsiasi destinazione IP ARP è " +"raggiungibile (qualsiasi, 0)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:18 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:368 @@ -1668,9 +1990,9 @@ msgstr "" msgid "Contents have been saved." msgstr "I contenuti sono stati salvati." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1679,18 +2001,18 @@ msgstr "Continua" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:97 msgctxt "nft jump action" msgid "Continue in %h" -msgstr "" +msgstr "Continua in %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" -msgstr "" +msgstr "Continua a chiamare la catena" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" -msgstr "" +msgstr "Continuare l'elaborazione dei pacchetti non corrispondenti" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1705,22 +2027,22 @@ msgstr "" msgid "Country" msgstr "Nazione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" -msgstr "Codice Nazione" +msgstr "Codice nazione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Densità celle di copertura" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Crea / Assegna zona firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" -msgstr "" +msgstr "Crea interfaccia" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:191 msgid "Critical" @@ -1730,19 +2052,19 @@ msgstr "Critico" msgid "Cron Log Level" msgstr "Livello di log del Cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Potenza attuale" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:28 msgctxt "nft meta hour" msgid "Current time" -msgstr "" +msgstr "Ora attuale" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:29 msgctxt "nft meta day" msgid "Current weekday" -msgstr "" +msgstr "Giorno della settimana attuale" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:573 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:575 @@ -1751,7 +2073,7 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:82 #: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:83 msgid "Custom Interface" -msgstr "Interfaccia Personalizzata" +msgstr "Interfaccia personalizzata" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:410 msgid "" @@ -1759,7 +2081,7 @@ msgid "" "this, perform a factory-reset first." msgstr "" "I file personalizzati (certificati, script) potrebbero rimanere sul sistema. " -"Per evitarlo, esegui prima un reset di fabbrica." +"Per evitarlo, esegui prima un ripristino di fabbrica." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:6 msgid "Custom flash interval (kernel: timer)" @@ -1773,31 +2095,31 @@ msgstr "" "Personalizza la configurazione dei LED di sistema se possibile." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "Trasmissioni DAD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" -msgstr "" +msgstr "Client DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" -msgstr "" +msgstr "Porta DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" -msgstr "" +msgstr "Segreto DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" -msgstr "" +msgstr "Opzioni DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Server DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP e DNS" @@ -1808,18 +2130,26 @@ msgstr "DHCP e DNS" msgid "DHCP client" msgstr "Client DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Opzioni DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" +"Il leasetime DHCPv4 è usato come limite e tempo di vita " +"preferito del prefisso IPv6." + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "Client DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" -msgstr "" +msgstr "Servizio DHCPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:45 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:46 @@ -1829,91 +2159,99 @@ msgstr "" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Inoltri DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" -msgstr "Porta di richiesta DNS" +msgstr "Porta di interrogazione DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" -msgstr "" +msgstr "Domini di ricerca DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" -msgstr "Porta server DNS" +msgstr "Porta server DNS" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:292 msgid "DNS setting is invalid" -msgstr "" +msgstr "L'impostazione DNS non è valida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" -msgstr "" +msgstr "Peso DNS" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:33 msgid "DNS-Label / FQDN" -msgstr "" +msgstr "Etichetta DNS / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" -msgstr "" +msgstr "Controllo DNSSEC non firmato" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:99 msgid "DPD Idle Timeout" -msgstr "" +msgstr "Scadenza inattività DPD" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:41 msgid "DS-Lite AFTR address" -msgstr "" +msgstr "Indirizzo DS-Lite AFTR" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" -msgstr "" +msgstr "Stato DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" -msgstr "" +msgstr "Modalità linea DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "Intervallo DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" -msgstr "" +msgstr "Velocità dati" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Dati ricevuti" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Dati trasmessi" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Debug" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" -msgstr "" +msgstr "Router predefinito" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:12 msgid "Default state" msgstr "Stato predefinito" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1923,74 +2261,79 @@ msgstr "" "\"6,192.168.2.1,192.168.2.2\" fornisce differenti server DNS ai " "client." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" +"Definisce una mappatura della priorità interna dei pacchetti Linux alla " +"priorità dell'intestazione VLAN, ma per i frame in uscita" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" +"Definisce una mappatura della priorità dell'intestazione della VLAN alla " +"priorità interna dei pacchetti di Linux sui frame in entrata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" -msgstr "" +msgstr "Definisce un MTU specifico per questo instradamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" -msgstr "" +msgstr "Delega i prefissi IPv6" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Elimina" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" -msgstr "" +msgstr "Elimina chiave" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" -msgstr "" +msgstr "Richiesta di eliminazione fallita: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" -msgstr "Rimuovi questa rete" +msgstr "Elimina questa rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" "Intervallo del messaggio di indicazione del traffico di recapito (DTIM)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Descrizione" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" -msgstr "" +msgstr "Deseleziona" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:237 msgid "Design" msgstr "Tema" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" -msgstr "" +msgstr "Master designato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1999,12 +2342,12 @@ msgstr "Destinazione" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:44 msgctxt "nft ip daddr" msgid "Destination IP" -msgstr "" +msgstr "IP di destinazione" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:48 msgctxt "nft ip6 daddr" msgid "Destination IPv6" -msgstr "" +msgstr "IPv6 di destinazione" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:48 msgid "Destination port" @@ -2013,7 +2356,7 @@ msgstr "Porta di destinazione" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:46 msgctxt "nft ip dport" msgid "Destination port" -msgstr "" +msgstr "Porta di destinazione" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 @@ -2025,9 +2368,9 @@ msgstr "Zona di destinazione" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2037,165 +2380,189 @@ msgstr "Zona di destinazione" msgid "Device" msgstr "Dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Configurazione del dispositivo" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "Identificatore del dispositivo" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" -msgstr "" +msgstr "Il dispositivo non è attivo" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" -msgstr "" +msgstr "Il dispositivo si sta riavviando…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Nome dispositivo" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." -msgstr "" +msgstr "Dispositivo non gestito da ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" -msgstr "" +msgstr "Dispositivo non presente" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Tipo dispositivo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Dispositivo irraggiungibile!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:53 msgid "Device unreachable! Still waiting for device..." -msgstr "Dispositivo non raggiungibile! Ancora in attesa del dispositivo..." +msgstr "Dispositivo irraggiungibile! Ancora in attesa del dispositivo..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Dispositivi" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnostica" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" -msgstr "" +msgstr "Numero da comporre" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Directory" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" -msgstr "Disabilita" +msgstr "Disattiva" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." msgstr "" -"Disabilita DHCP " +"Disattiva DHCP " "per questa interfaccia." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:375 msgid "Disable DNS lookups" -msgstr "" +msgstr "Disattiva le ricerche DNS" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 msgid "Disable Encryption" -msgstr "Disabilita Crittografia" +msgstr "Disattiva crittografia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" -msgstr "Disabilita il polling di inattività" +msgstr "Disattiva il polling di inattività" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" -msgstr "" +msgstr "Disattiva questa rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:70 msgid "Disabled" -msgstr "Disabilitato" +msgstr "Disattivato" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" -msgstr "" +msgstr "Disattivato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" -msgstr "Disconnetti client in caso di Acknowledgement scarso" +msgstr "Disassocia in caso di basso livello di riconoscimento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." -msgstr "Scarta risposte RFC1918 upstream." +msgstr "" +"Scarta risposte upstream che contengono indirizzi RFC1918." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" -msgstr "" +msgstr "Disconnetti" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" -msgstr "" +msgstr "Tentativo di disconnessione fallito" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." -msgstr "" +msgstr "Tentativo di disconnessione fallito." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:35 msgid "Disk space" -msgstr "" +msgstr "Spazio su disco" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Chiudi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" -msgstr "Ottimizzazione Distanza" +msgstr "Ottimizzazione distanza" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." -msgstr "Distanza dal membro più lontano della rete in metri." +msgstr "Distanza dal membro della rete più lontano, in metri." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Tabella ARP distribuita" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" +"Istanza dnsmasq a cui questa sezione host DHCP è legata. Se non specificata, " +"la sezione è valida per tutte le istanze dnsmasq." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" +"Istanza dnsmasq a cui è legata questa sezione di avvio. Se non specificata, " +"la sezione è valida per tutte le istanze dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP leggero e un server d'inoltro DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" "Non memorizzare nella cache le risposte negative, ad es. per domini " @@ -2217,36 +2584,25 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:70 msgid "Do not create host route to peer (optional)." -msgstr "" +msgstr "Non creare un instradamento host verso il peer (facoltativo)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." -msgstr "Non inoltrare query DNS senza punti o parti di dominio." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Non inoltrare le richieste che non possono essere risolte dai name server " -"pubblici." +msgstr "Non inoltrare richieste DNS senza punti o parti di dominio." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Non inoltrare ricerche inverse per reti locali." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." -msgstr "" +msgstr "Non ascoltare le interfacce specificate." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" +msgstr "Non offrire il servizio DHCPv6 su questa interfaccia." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2258,7 +2614,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Non inviare un nome host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2266,39 +2622,41 @@ msgstr "" "Non inviare messaggi RA su questa interfaccia." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" -msgstr "" +msgstr "Vuoi davvero eliminare \"%s\" ?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" -msgstr "" +msgstr "Vuoi davvero eliminare la seguente chiave SSH?" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:94 msgid "Do you really want to erase all settings?" -msgstr "" +msgstr "Vuoi davvero cancellare tutte le impostazioni?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" -msgstr "" +msgstr "Vuoi davvero eliminare ricorsivamente la cartella \"%s\"?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" -msgstr "" +msgstr "Vuoi sostituire l'attuale PSK?" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:100 msgid "Do you want to replace the current keys?" -msgstr "" +msgstr "Vuoi sostituire le chiavi attuali?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" -msgstr "" +msgstr "Dominio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Dominio richiesto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Lista domini consentiti" @@ -2306,15 +2664,15 @@ msgstr "Lista domini consentiti" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 msgid "Don't Fragment" -msgstr "Non Frammentare" +msgstr "Non frammentare" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 msgid "Down" -msgstr "" +msgstr "Disconnesso" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:403 msgid "Down Delay" -msgstr "" +msgstr "Ritardo inattività" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:394 msgid "Download backup" @@ -2324,33 +2682,81 @@ msgstr "Scarica backup" msgid "Download mtdblock" msgstr "Scarica mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" -msgstr "" +msgstr "Offset SNR a valle" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." msgstr "" +"Trascina o incolla un file *.conf valido qui sotto per configurare " +"l'interfaccia WireGuard locale." #: modules/luci-base/htdocs/luci-static/resources/form.js:2698 msgid "Drag to reorder" -msgstr "Trascina per ordinare" +msgstr "Trascina per riordinare" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:342 msgid "Drop Duplicate Frames" +msgstr "Scarta frame doppi" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"Elimina tutti i frame ARP gratuiti, ad esempio se sulla rete è presente un " +"buon proxy ARP e tali frame non devono essere usati o, nel caso di 802.11, " +"non devono essere usati per prevenire gli attacchi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Elimina tutti gli annunci di vicini non richiesti, ad esempio se sulla rete " +"è presente un buon proxy NA e tali frame non devono essere usati o, nel caso " +"di 802.11, non devono essere usati per prevenire gli attacchi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Scarta ARP gratuiti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" +"Scarta i frame multicast di livello 2 contenenti pacchetti unicast IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." msgstr "" +"Scarta i frame multicast di livello 2 contenenti pacchetti unicast IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Scarta unicast IPv4 annidati" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Scarta unicast IPv6 annidati" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" -msgstr "" +msgstr "Scarta pacchetto" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" -msgstr "" +msgstr "Scarta pacchetti non corrispondenti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Scarta NA non richiesti" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" @@ -2361,156 +2767,169 @@ msgid "" "Dropbear offers SSH network shell access " "and an integrated SCP server" msgstr "" -"Dropbear offre accesso SSH e integra un " -"server SCP" +"Dropbear offre accesso SSH e un server " +"SCP integrato" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:14 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:11 msgid "Dual-Stack Lite (RFC6333)" -msgstr "" +msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "DHCP dinamico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." -msgstr "" +msgstr "Client Dynamic Authorization Extension." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." -msgstr "" +msgstr "Porta Dynamic Authorization Extension." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." -msgstr "" +msgstr "Segreto Dynamic Authorization Extension." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 msgid "Dynamic tunnel" -msgstr "" +msgstr "Tunnel dinamico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" -"Fornisci dinamicamente gli indirizzi DHCP ai client. Se disabilitato, solo i " +"Fornisci dinamicamente gli indirizzi DHCP ai client. Se disattivato, solo i " "client con un indirizzo statico saranno serviti." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Es. br-vlan o brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Es. eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" -msgstr "" +msgstr "Lunghezza dei bit EA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Metodo EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Ad ogni STA è assegnata la propria interfaccia AP_VLAN." + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Modifica" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:226 msgid "Edit peer" -msgstr "" +msgstr "Modifica peer" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "Modifica lease statico" #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" +"Modifica i dati di configurazione grezzi sopra per correggere eventuali " +"errori e clicca \"Salva\" per ricaricare la pagina." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Modifica questa rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Modifica rete wireless" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:65 msgctxt "nft rt mtu" msgid "Effective route MTU" -msgstr "" +msgstr "MTU dell'instradamento effettivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" -msgstr "" +msgstr "Mappatura QoS in uscita" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" -msgstr "" +msgstr "ID dispositivo in uscita" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" +msgstr "Nome dispositivo in uscita" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Emergenza" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" -msgstr "Abilita" +msgstr "Attiva" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" +"Attiva / Disattiva peer. Riavvia l'interfaccia wireguard per applicare le " +"modifiche." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" +"Attiva lo snooping IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" -msgstr "Abilita STP" +msgstr "Attiva STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" -msgstr "" +msgstr "Attiva SLAAC" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:369 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:375 msgid "Enable DNS lookups" -msgstr "" +msgstr "Attiva ricerche DNS" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:294 msgid "Enable Dynamic Shuffling Of Flows" -msgstr "" +msgstr "Attiva il mescolamento dinamico dei flussi" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 msgid "Enable HE.net dynamic endpoint update" -msgstr "Abilita aggiornamento dinamico endpoint HE.net" +msgstr "Attiva l'aggiornamento dell'endpoint dinamico HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" -msgstr "Abilita IPv6" +msgstr "Attiva IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" -msgstr "Abilita negoziazione IPv6" +msgstr "Attiva negoziazione IPv6" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 @@ -2519,39 +2938,43 @@ msgstr "Abilita negoziazione IPv6" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 msgid "Enable IPv6 negotiation on the PPP link" -msgstr "Abilita negoziazione IPv6 sul collegamento PPP" +msgstr "Attiva negoziazione IPv6 sul collegamento PPP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "Attiva instradamento di segmenti IPv6" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" -msgstr "Abilita passthrough Jumbo Frame" +msgstr "Attiva passthrough Jumbo Frame" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" -msgstr "" +msgstr "Attiva l'apprendimento di indirizzi MAC" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:257 msgid "Enable NTP client" -msgstr "Abilita client NTP" +msgstr "Attiva client NTP" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "Enable Single DES" -msgstr "Abilita DES Singolo" +msgstr "Attiva DES singolo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" -msgstr "Abilita server TFTP" +msgstr "Attiva server TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" -msgstr "" +msgstr "Attiva filtraggio VLAN" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:184 msgid "Enable VLAN functionality" -msgstr "Abilita funzionalità VLAN" +msgstr "Attiva funzionalità VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" -msgstr "Abilita pulsante WPS, richiede WPA(2)-PSK/WPA3-SAE" +msgstr "Attiva pulsante WPS, richiede WPA(2)-PSK/WPA3-SAE" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:14 msgid "" @@ -2559,97 +2982,104 @@ msgid "" "Protocol\">HTTP requests to HTTPS port." msgstr "" +"Attiva il reindirizzamento automatico delle richieste HTTP alla porta HTTPS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" +"Attiva la delega a valle dei prefissi IPv6 disponibili su questa interfaccia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" -msgstr "Abilita contromisure per reinstallazione della chiave (KRACK)" +msgstr "Attiva contromisure di reinstallazione della chiave (KRACK)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:189 msgid "Enable learning and aging" -msgstr "Attivare l'apprendimento e l'invecchiamento" +msgstr "Attiva l'apprendimento e l'invecchiamento" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:200 msgid "Enable mirroring of incoming packets" -msgstr "Abilita mirroring dei pacchetti in ingresso" +msgstr "Attiva mirroring dei pacchetti in ingresso" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:201 msgid "Enable mirroring of outgoing packets" -msgstr "Abilita mirroring dei pacchetti in uscita" +msgstr "Attiva mirroring dei pacchetti in uscita" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" -msgstr "" +msgstr "Attiva uscita rapida multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" -msgstr "" +msgstr "Attiva interrogatore multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" -msgstr "" +msgstr "Attiva supporto multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -"Abilita il packet steering su tutte le CPU. Può aiutare o peggiorare la " +"Attiva il packet steering su tutte le CPU. Può aiutare o ostacolare la " "velocità di rete." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" -msgstr "" +msgstr "Attiva la modalità promiscua" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:71 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:66 msgid "Enable rx checksum" -msgstr "" +msgstr "Attiva checksum rx" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:96 msgid "Enable support for multicast traffic (optional)." -msgstr "" +msgstr "Attiva il supporto per il traffico multicast (facoltativo)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:83 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." -msgstr "Abilita l'opzione DF (non Frammentare) dei pacchetti incapsulati." +msgstr "Attiva l'opzione DF (Non Frammentare) dei pacchetti incapsulati." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." -msgstr "" +msgstr "Attiva il server TFTP a istanza singola integrato." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" -msgstr "" +msgstr "Attiva questa rete" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:75 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:70 msgid "Enable tx checksum" -msgstr "" +msgstr "Attiva checksum tx" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" -msgstr "" +msgstr "Attiva il flooding unicast" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" -msgstr "Abilitato" +msgstr "Attivato" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" -msgstr "" +msgstr "Attiva lo snooping IGMP su questo bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2657,66 +3087,79 @@ msgstr "" "Consente il roaming veloce tra access point che appartengono allo stesso " "Mobility Domain" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" +"Attiva un'infrastruttura di inoltro multicast più efficiente e consapevole " +"dei gruppi in batman-adv." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" -msgstr "Abilita il protocollo di Spanning Tree su questo bridge" +msgstr "Attiva il protocollo di Spanning Tree su questo bridge" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:59 msgid "Encapsulation limit" -msgstr "" +msgstr "Limite di incapsulamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Modalità di incapsulamento" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Crittografia" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Punto finale" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" -msgstr "" +msgstr "Host del punto finale" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" -msgstr "" +msgstr "Porta del punto finale" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:325 msgid "Endpoint setting is invalid" -msgstr "" +msgstr "Impostazioni del punto finale non valide" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" -msgstr "" +msgstr "Applica IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" -msgstr "" +msgstr "Applica IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" -msgstr "" +msgstr "Applica IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" -msgstr "" +msgstr "Applica versione 1 di MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" -msgstr "" +msgstr "Applica versione 2 di MLD" #: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 msgid "Enter custom value" -msgstr "" +msgstr "Inserisci valore personalizzato" #: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 msgid "Enter custom values" -msgstr "" +msgstr "Inserisci valori personalizzati" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:97 msgid "Erasing..." @@ -2733,35 +3176,39 @@ msgstr "Errore" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:170 msgid "Error getting PublicKey" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" +msgstr "Errore ottenendo la chiave pubblica" #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" -msgstr "Scheda di Rete" +msgstr "Adattatore di rete" #: modules/luci-base/htdocs/luci-static/resources/network.js:2999 #: modules/luci-compat/luasrc/model/network.lua:1423 msgid "Ethernet Switch" -msgstr "Switch di Rete" +msgstr "Switch di rete" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:272 msgid "Every 30 seconds (slow, 0)" -msgstr "" +msgstr "Ogni 30 secondi (lento, 0)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:273 msgid "Every second (fast, 1)" -msgstr "" +msgstr "Ogni secondo (veloce, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Escludi interfacce" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"Esecuzione di vari comandi di rete per verificare la connessione e la " +"risoluzione dei nomi ad altri sistemi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2769,27 +3216,36 @@ msgstr "" "Esenta 127.0.0.0/8 e ::1 dai controlli di " "rebinding, ad esempio per i servizi RBL." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" -msgstr "" +msgstr "Dispositivo esistente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" -msgstr "Espandi gli hosts" +msgstr "Espandi gli host" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Numero di porta previsto." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" -msgstr "" +msgstr "Necessario un suggerimento di assegnazione esadecimale" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" -msgstr "Necessario indirizzo IPv4 valido" +msgstr "Necessario un indirizzo IPv4 valido" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" -msgstr "Necessario indirizzo IPv6 valido" +msgstr "Necessario un indirizzo IPv6 valido" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" +"Necessario un indirizzo MAC valido, facoltativamente con caratteri jolly" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Necessari due valori di priorità separati da due punti (:)" @@ -2798,11 +3254,11 @@ msgstr "Necessari due valori di priorità separati da due punti (:)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Necessario: %s" @@ -2814,7 +3270,7 @@ msgstr "Necessario: campo da compilare" msgid "Expires" msgstr "Scadenze" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2823,15 +3279,15 @@ msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:19 msgid "External" -msgstr "" +msgstr "Esterno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" -msgstr "" +msgstr "Elenco portachiavi esterno R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" -msgstr "" +msgstr "Elenco portachiavi esterno R1" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167 msgid "External system log server" @@ -2847,68 +3303,99 @@ msgstr "Protocollo server log di sistema esterno" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:79 msgid "Extra SSH command options" -msgstr "" +msgstr "Opzioni del comando SSH aggiuntive" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 msgid "Extra pppd options" -msgstr "" +msgstr "Opzioni pppd aggiuntive" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "Extra sstpc options" -msgstr "" +msgstr "Opzioni sstpc aggiuntive" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" -msgstr "" +msgstr "FT su DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" -msgstr "" +msgstr "FT over the Air" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "Protocollo FT" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "Motivo del fallimento" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." -msgstr "Impossibile modificare la password di sistema." +msgstr "Modifica della password di sistema fallita." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Configurazione del modem fallita" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" -msgstr "" +msgstr "Applicazione entro %ds fallita, in attesa di ripristino…" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Connessione fallita" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Disconnessione fallita" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" +msgstr "Esecuzione dell'azione \"/etc/init.d/%s %s\" fallita: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Impossibile ottenere informazioni sul modem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Inizializzazione del modem fallita" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Impostazione della modalità di funzionamento fallita" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "File" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" +"File che elenca i risolutori upstream, facoltativamente specifici per il " +"dominio, es. server=1.2.3.4, server=/dominio/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" -msgstr "" +msgstr "File non accessibile" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." -msgstr "File per memorizzare i contratti DHCP." +msgstr "File per memorizzare le informazioni dei lease DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." -msgstr "File con i name server upstream." +msgstr "File con i risolutori upstream." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Nome file" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Nome del file dell'immagine di avvio annunciato ai client." @@ -2917,40 +3404,57 @@ msgstr "Nome del file dell'immagine di avvio annunciato ai client." msgid "Filesystem" msgstr "Filesystem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Filtra i record A IPv4" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Filtra i record AAAA IPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Filtra la scoperta del servizio SRV/SOA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filtra privati" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filtra inutili" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" -msgstr "" +msgstr "Filtro per tutti gli slave, nessuna convalida" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:390 msgid "Filtering for all slaves, validation only for active slave" -msgstr "" +msgstr "Filtro per tutti gli slave, convalida solo per lo slave attivo" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:391 msgid "Filtering for all slaves, validation only for backup slaves" +msgstr "Filtro per tutti gli slave, convalida solo per gli slave di backup" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." msgstr "" +"Filtra la scoperta del servizio SRV/SOA, per evitare di attivare " +"collegamenti dial-on-demand." #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" -msgstr "" +msgstr "Finalizzazione fallita" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 msgid "" "Find all currently attached filesystems and swap and replace configuration " "with defaults based on what was detected" msgstr "" +"Trova tutti i filesystem e swap attualmente collegati e sostituisci la " +"configurazione con i valori predefiniti in base a ciò che è stato rilevato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" -msgstr "Trova e aggiungi una rete" +msgstr "Trova e unisciti alla rete" #: modules/luci-compat/luasrc/view/cbi/delegator.htm:9 msgid "Finish" @@ -2962,30 +3466,31 @@ msgid "Firewall" msgstr "Firewall" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Marcatore firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" -msgstr "Impostazioni Firewall" +msgstr "Impostazioni del firewall" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:326 msgid "Firewall Status" -msgstr "Stato del Firewall" +msgstr "Stato del firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" -msgstr "" +msgstr "Marcatore firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" -msgstr "" +msgstr "File del firmware" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" -msgstr "Versione del Firmware" +msgstr "Versione del firmware" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Porta di origine fissa per le richieste DNS in uscita." @@ -2996,7 +3501,7 @@ msgstr "Flash immagine..." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:308 msgid "Flash image?" -msgstr "" +msgstr "Eseguire il flash dell'immagine?" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:439 msgid "Flash new firmware image" @@ -3004,47 +3509,55 @@ msgstr "Flash immagine del nuovo firmware" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:384 msgid "Flash operations" -msgstr "Operazioni flash" +msgstr "Operazioni di flash" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:317 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:319 msgid "Flashing…" -msgstr "" +msgstr "Flash in corso…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "Segui il tempo di vita IPv4" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Forza" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" -msgstr "Forza 40MHz" +msgstr "Forza modalità 40MHz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Forza CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Forza DHCP su questa rete, anche se viene rilevato un altro server." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" -msgstr "" +msgstr "Forza versione IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" -msgstr "" +msgstr "Forza versione MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Forza TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Forza TKIP e CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "Imponi risposta DHCP di broadcast." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Forza collegamento" @@ -3056,11 +3569,11 @@ msgstr "Forza aggiornamento" msgid "Force use of NAT-T" msgstr "Forza uso del NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" -msgstr "" +msgstr "Il token del form non corrisponde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA tra l'interfaccia " "master designata e le interfacce downstream." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3085,50 +3598,59 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Inoltra il traffico DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" +"Inoltra i messaggi DHCPv6 tra l'interfaccia master designata e le interfacce " +"downstream." #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Inoltra il traffico broadcast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" -msgstr "" +msgstr "Ritardo di inoltro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" -msgstr "" +msgstr "Inoltra il traffico peer mesh" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" +"Inoltra i pacchetti multicast come pacchetti unicast su questo dispositivo." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "DNS di inoltro/inverso" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" -msgstr "Modalità di Inoltro" +msgstr "Modalità di inoltro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Frammentazione" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Soglia di frammentazione" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:62 msgctxt "nft nat flag fully-random" msgid "Full port randomization" -msgstr "" +msgstr "Porte totalmente casuali" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:214 msgid "" "Further information about WireGuard interfaces and peers at wireguard.com." msgstr "" +"Ulteriori informazioni sulle interfacce e sui peer di WireGuard " +"all'indirizzo wireguard.com." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 @@ -3137,96 +3659,101 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Solo GPRS" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:10 msgid "GRE tunnel over IPv4" -msgstr "" +msgstr "Tunnel GRE su IPv4" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:10 msgid "GRE tunnel over IPv6" -msgstr "" +msgstr "Tunnel GRE su IPv6" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:10 msgid "GRETAP tunnel over IPv4" -msgstr "" +msgstr "Tunnel GRETAP su IPv4" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:10 msgid "GRETAP tunnel over IPv6" -msgstr "" +msgstr "Tunnel GRETAP su IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Gateway" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Modalità gateway" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" -msgstr "Porte Gateway" +msgstr "Porte gateway" #: modules/luci-base/htdocs/luci-static/resources/network.js:11 #: modules/luci-compat/luasrc/model/network.lua:29 msgid "Gateway address is invalid" -msgstr "" +msgstr "L'indirizzo del gateway non è valido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" -msgstr "Impostazioni Generali" +msgstr "Impostazioni generali" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" -msgstr "Configurazione Generale" +msgstr "Configurazione generale" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Opzioni generali dispositivo" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 msgid "Generate Config" -msgstr "Genera Configurazione" +msgstr "Genera configurazione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" -msgstr "" +msgstr "Genera PMK in locale" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:396 msgid "Generate archive" msgstr "Genera archivio" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" -msgstr "" +msgstr "Genera configurazione" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" -msgstr "" +msgstr "Genera configurazione…" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:109 msgid "Generate new key pair" -msgstr "" +msgstr "Genera nuova coppia di chiavi" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" -msgstr "" +msgstr "Genera chiave precondivisa" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" +"Genera una configurazione adatta per l'importazione su un peer WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" -msgstr "" +msgstr "Generazione codice QR…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:79 msgid "Given password confirmation did not match, password not changed!" @@ -3236,137 +3763,146 @@ msgstr "La conferma della nuova password non corrisponde, modifica annullata!" msgid "Global Settings" msgstr "Impostazioni globali" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Opzioni di rete globali" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." -msgstr "" +msgstr "Vai all'aggiornamento del firmware..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Vai alla configurazione della password..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" -msgstr "Vai alla pagina di configurazione relativa" +msgstr "Vai alla pagina di configurazione pertinente" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" -msgstr "" +msgstr "Concedi l'accesso alla configurazione DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" -msgstr "Consentire la visualizzazione dello stato del DHCP" +msgstr "Concedi la visualizzazione dello stato del DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" -msgstr "" +msgstr "Concedi l'accesso alla visualizzazione dello stato DSL" #: protocols/luci-proto-openconnect/root/usr/share/rpcd/acl.d/luci-openconnect.json:3 msgid "Grant access to LuCI OpenConnect procedures" -msgstr "" +msgstr "Concedi l'accesso alle procedure OpenConnect di LuCI" #: protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json:3 msgid "Grant access to LuCI Wireguard procedures" -msgstr "" +msgstr "Concedi l'accesso alle procedure Wireguard di LuCI" + +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Concedi l'accesso alle procedure openfortivpn di LuCI" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" -msgstr "" +msgstr "Concedi l'accesso alla configurazione SSH" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:12 msgid "Grant access to basic LuCI procedures" -msgstr "" +msgstr "Concedi l'accesso alle procedure base di LuCI" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:79 msgid "Grant access to crontab configuration" -msgstr "" +msgstr "Concedi l'accesso alla configurazione di crontab" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:70 msgid "Grant access to firewall status" -msgstr "" +msgstr "Concedi l'accesso allo stato del firewall" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:132 msgid "Grant access to flash operations" -msgstr "" +msgstr "Concedi l'accesso alle operazioni di flash" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:3 msgid "Grant access to main status display" -msgstr "Consentire la visualizzazione dello stato generale" +msgstr "Concedi l'accesso alla visualizzazione dello stato principale" #: protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json:3 msgid "Grant access to mmcli" -msgstr "" +msgstr "Concedi l'accesso a mmcli" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:100 msgid "Grant access to mount configuration" -msgstr "" +msgstr "Concedi l'accesso alla configurazione del mount" #: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:3 msgid "Grant access to network configuration" -msgstr "" +msgstr "Concedi l'accesso alla configurazione di rete" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" -msgstr "" +msgstr "Concedi l'accesso agli strumenti di diagnostica di rete" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:36 msgid "Grant access to network status information" +msgstr "Concedi l'accesso alle informazioni sullo stato della rete" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" msgstr "" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" -msgstr "" +msgstr "Concedi l'accesso allo stato del processo" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:3 msgid "Grant access to realtime statistics" -msgstr "" +msgstr "Concedi l'accesso alle statistiche in tempo reale" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:47 msgid "Grant access to routing status" -msgstr "" +msgstr "Concedi l'accesso allo stato di instradamento" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:57 msgid "Grant access to startup configuration" -msgstr "" +msgstr "Concedi l'accesso alla configurazione di avvio" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:3 msgid "Grant access to system configuration" -msgstr "" +msgstr "Concedi l'accesso alla configurazione del sistema" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:30 msgid "Grant access to system logs" -msgstr "" +msgstr "Concedi l'accesso ai log di sistema" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:43 msgid "Grant access to uHTTPd configuration" -msgstr "" +msgstr "Concedi l'accesso alla configurazione uHTTPd" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:61 msgid "Grant access to wireless channel status" -msgstr "Consentire l'accesso allo stato del canale wireless" +msgstr "Concedi l'accesso allo stato del canale wireless" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" -msgstr "Consentire la visualizzazione dello stato del wireless" +msgstr "Concedi l'accesso alla visualizzazione dello stato wireless" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66 msgid "Group Password" -msgstr "" +msgstr "Password del gruppo" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:22 msgid "Guest" -msgstr "" +msgstr "Ospite" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 msgid "HE.net password" @@ -3374,28 +3910,24 @@ msgstr "Password HE.net" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "HE.net username" -msgstr "" +msgstr "Nome utente HE.net" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:64 msgid "HTTP(S) Access" -msgstr "" +msgstr "Accesso HTTP(S)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:46 msgid "Hang Up" msgstr "Disconnetti (SIGHUP)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Pulsazione (kernel: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" -msgstr "" +msgstr "Intervallo di saluto" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:114 msgid "" @@ -3405,26 +3937,34 @@ msgstr "" "Qui puoi configurare gli aspetti base del tuo dispositivo come il nome host " "o il fuso orario." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Nascondi ESSID" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:332 msgid "Hide empty chains" -msgstr "" +msgstr "Nascondi le catene vuote" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "Alta" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "Onora ARP gratuito" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" -msgstr "" +msgstr "Hook: %h (%h), Priorità: %d" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Penalità hop" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3432,20 +3972,28 @@ msgstr "Host" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 msgid "Host expiry timeout" -msgstr "Timeout scadenza Host" +msgstr "Tempo di scadenza host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." -msgstr "" +msgstr "L'host richiede questo nome file al server di avvio." #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 msgid "Host-Uniq tag content" +msgstr "Contenuto dell'etichetta Host-Uniq" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." msgstr "" +"Tempo di lease specifico per host, es. 5m, 3h, " +"7d." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3453,30 +4001,33 @@ msgstr "Nome host" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:22 msgid "Hostname to send when requesting DHCP" -msgstr "Nome host da inviare al momento della richiesta DHCP" +msgstr "Nome host da inviare quando si richiede DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Nomi host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " "useful to rebind an FQDN." msgstr "" +"I nomi host vengono usati per associare un nome di dominio a un indirizzo " +"IP. Questa impostazione è ridondante per i nomi host già configurati con " +"lease statici, ma può essere utile per riassociare un FQDN." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:19 msgid "How long (in milliseconds) the LED should be off" -msgstr "" +msgstr "Per quanto tempo (in millisecondi) il LED deve rimanere spento" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:13 msgid "How long (in milliseconds) the LED should be on" -msgstr "" +msgstr "Per quanto tempo (in millisecondi) il LED deve rimanere acceso" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 msgid "Human-readable counters" -msgstr "" +msgstr "Contatori leggibili dall'uomo" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:24 msgid "Hybrid" @@ -3485,53 +4036,57 @@ msgstr "Ibrido" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:49 msgctxt "nft icmp code" msgid "ICMP code" -msgstr "" +msgstr "Codice ICMP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:50 msgctxt "nft icmp type" msgid "ICMP type" -msgstr "" +msgstr "Tipo ICMP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:51 msgctxt "nft icmpv6 code" msgid "ICMPv6 code" -msgstr "" +msgstr "Codice ICMPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:52 msgctxt "nft icmpv6 type" msgid "ICMPv6 type" -msgstr "" +msgstr "Tipo ICMPv6" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 msgid "ID used to uniquely identify the VXLAN" -msgstr "" +msgstr "ID usato per identificare in modo univoco la VXLAN" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:208 msgid "IEEE 802.3ad Dynamic link aggregation (802.3ad, 4)" -msgstr "" +msgstr "Aggregazione dinamica dei collegamenti IEEE 802.3ad (802.3ad, 4)" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:75 msgid "IKE DH Group" -msgstr "" +msgstr "Gruppo DH IKE" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "IMEI" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "Indirizzi IP" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" -msgstr "" +msgstr "Protocollo IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" -msgstr "" +msgstr "Set di IP" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" -msgstr "" +msgstr "Tipo IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3540,54 +4095,59 @@ msgstr "Indirizzo IP" #: modules/luci-base/htdocs/luci-static/resources/network.js:10 #: modules/luci-compat/luasrc/model/network.lua:28 msgid "IP address is invalid" -msgstr "" +msgstr "L'indirizzo IP non è valido" #: modules/luci-base/htdocs/luci-static/resources/network.js:13 #: modules/luci-compat/luasrc/model/network.lua:31 msgid "IP address is missing" -msgstr "" +msgstr "Indirizzo IP mancante" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " "packets with matching destination IP." msgstr "" +"Indirizzi IP consentiti all'interno del tunnel. Il peer accetterà i " +"pacchetti in tunnel con gli indirizzi IP di origine che corrispondono a " +"questo elenco e reindirizzerà i pacchetti con gli IP di destinazione " +"corrispondenti." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 msgctxt "nft ip protocol" msgid "IP protocol" -msgstr "" +msgstr "Protocollo IP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" -msgstr "" +msgstr "Protocollo IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" -msgstr "" +msgstr "Set di IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" -msgstr "" +msgstr "Set di IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" -msgstr "Ignora Dominio Bogus NX" +msgstr "IP da sovrascrivere con NXDOMAIN" #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:9 msgid "IPsec XFRM" -msgstr "" +msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3601,27 +4161,27 @@ msgstr "Indirizzi locali dei client IPv4 vicini" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:251 msgid "IPv4 Routing" -msgstr "" +msgstr "Instradamento IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" -msgstr "" +msgstr "Regole IPv4" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 msgid "IPv4 Upstream" -msgstr "" +msgstr "Upstream IPv4" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" -msgstr "Indirizzi IPv4" +msgstr "Indirizzo IPv4" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:29 msgid "IPv4 assignment length" -msgstr "" +msgstr "Lunghezza assegnazione IPv4" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:181 msgid "IPv4 broadcast" @@ -3638,9 +4198,9 @@ msgstr "Maschera di rete IPv4" #: modules/luci-base/htdocs/luci-static/resources/validation.js:305 msgid "IPv4 network in address/netmask notation" -msgstr "" +msgstr "Rete IPv4 in notazione indirizzo/maschera di rete" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Solo IPv4" @@ -3653,29 +4213,33 @@ msgstr "Prefisso IPv4" msgid "IPv4 prefix length" msgstr "Lunghezza prefisso IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" -msgstr "" +msgstr "Tabella traffico IPv4 \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" -msgstr "" +msgstr "IPv4+IPv6" #: modules/luci-compat/luasrc/model/network/proto_ipip.lua:9 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:10 msgid "IPv4-in-IPv4 (RFC2003)" -msgstr "" +msgstr "IPv4-in-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" -msgstr "" +msgstr "IPv4/IPv6 (entrambi - IPv4 predefinito)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" -msgstr "" +msgstr "Tabella traffico IPv4/IPv6 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3686,7 +4250,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3694,52 +4259,56 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Firewall IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" -msgstr "" +msgstr "MTU IPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:262 msgid "IPv6 Neighbours" msgstr "Indirizzi locali dei client IPv6 vicini" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "Tempo di vita prefisso IPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" -msgstr "" +msgstr "Impostazioni RA IPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:261 msgid "IPv6 Routing" -msgstr "" +msgstr "Instradamento IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" -msgstr "" +msgstr "Regole IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "Impostazioni IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "Prefisso IPv6 ULA" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 msgid "IPv6 Upstream" -msgstr "" +msgstr "Upstream IPv6" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:183 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:58 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:135 msgid "IPv6 address" -msgstr "Indirizzi IPv6" +msgstr "Indirizzo IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" -msgstr "" +msgstr "Suggerimento di assegnazione IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" -msgstr "" +msgstr "Lunghezza assegnazione IPv6" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:188 msgid "IPv6 gateway" @@ -3747,24 +4316,24 @@ msgstr "Gateway IPv6" #: modules/luci-base/htdocs/luci-static/resources/validation.js:310 msgid "IPv6 network in address/netmask notation" -msgstr "" +msgstr "Rete IPv6 in notazione indirizzo/maschera di rete" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Solo IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" -msgstr "" +msgstr "Preferenza IPv6" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "IPv6 prefix" msgstr "Prefisso IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" -msgstr "" +msgstr "Filtro prefisso IPv6" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 @@ -3774,33 +4343,31 @@ msgstr "Lunghezza prefisso IPv6" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 msgid "IPv6 routed prefix" -msgstr "" +msgstr "Prefisso instradato IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" -msgstr "" +msgstr "Instradamento di origine IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "Suffisso IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"Suffisso IPv6 " -"(esadecimale)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" -msgstr "" +msgstr "Supporto IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" -msgstr "" +msgstr "Tabella traffico IPv6 \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:101 msgid "IPv6-PD" -msgstr "" +msgstr "IPv6-PD" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "Suffisso IPv6 (hex)" #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 @@ -3817,31 +4384,43 @@ msgstr "IPv6-su-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-su-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identità" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" +"Se un host corrisponde a una voce che non può essere usata perché specifica " +"un indirizzo su una sottorete diversa, viene impostata l'etichetta known-" +"othernet." + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" -msgstr "Se selezionata, 1DES è abilitata" +msgstr "Se selezionata, 1DES è attivata" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "If checked, adds \"+ipv6\" to the pppd options" -msgstr "" +msgstr "Se selezionata, aggiunge \"+ipv6\" alle opzioni pppd" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 msgid "If checked, encryption is disabled" -msgstr "Se selezionata, la crittografia è disabilitata" +msgstr "Se selezionata, la crittografia è disattivata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" +"Se impostato, le sottoreti downstream vengono allocate solo dalle classi di " +"prefisso IPv6 specificate." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" +"Se impostato, il significato delle opzioni di corrispondenza è invertito" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 @@ -3860,25 +4439,30 @@ msgstr "" "Se specificato, montare il dispositivo dall'etichetta della partizione " "invece che dal nodo del dispositivo fisso" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" +"Se l'indirizzo IP usato per accedere a LuCI cambia, è necessaria una " +"riconnessione manuale al nuovo IP entro %d secondi per " +"confermare le impostazioni, altrimenti le modifiche verranno annullate." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Se deselezionata, non è configurato alcun percorso predefinito" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" -"Se deselezionata, gli indirizzi ai server DNS annunciati saranno ignorati" +"Se deselezionata, gli indirizzi dei server DNS annunciati saranno ignorati" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 msgid "" @@ -3889,21 +4473,29 @@ msgid "" "datarates of the RAM." msgstr "" "Se la tua memoria è insufficiente i dati non usati possono venire " -"temporaneamente spostati in un'area di swap risultando in un più grande " -"quantitativo di RAM usabile. " -"Sappi che spostare dati in swap è un processo molto lento e che il " -"dispositivo di swap non può essere acceduto alle alte velocità della RAM." +"temporaneamente spostati in un'area di swap, ottenendo una maggiore quantità " +"di RAM utilizzabile. Sappi che " +"spostare dati in swap è un processo molto lento e che non si può accedere al " +"dispositivo di swap con l'alta velocità della RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "Ignora" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignora /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignora interfaccia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "Ignora richieste da macchine sconosciute usando !known." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignora il file resolv" @@ -3915,45 +4507,70 @@ msgstr "Immagine" msgid "Image check failed:" msgstr "Controllo dell'immagine fallito:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" -msgstr "" +msgstr "Importa come peer" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" -msgstr "" +msgstr "Importa configurazione" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" -msgstr "" +msgstr "Importa configurazione come peer…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" -msgstr "" +msgstr "Importa impostazioni" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" -msgstr "" +msgstr "Configurazione peer importata" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 msgid "Imports settings from an existing WireGuard configuration file" msgstr "" +"Importa le impostazioni da un file di configurazione WireGuard esistente" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:68 msgid "In" msgstr "In" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" +"In DHCPv4, è possibile includere più di un indirizzo MAC. Ciò permette ad un " +"indirizzo IP di essere associato a più macaddrs, e dnsmasq abbandona un " +"lease DHCP a uno dei macaddrs quando un altro chiede un lease. Funziona in " +"modo affidabile solo se uno solo dei macaddrs è attivo in qualsiasi momento." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"Nelle configurazioni LAN con bridge è consigliabile attivare l'elusione del " +"loop bridge per evitare loop di trasmissione che possono portare all'arresto " +"dell'intera LAN." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" +"Al fine di impedire l'accesso non autorizzato al sistema, la tua richiesta è " +"stata bloccata. Clicca \"Continua »\" di seguito per tornare alla pagina " +"precedente." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" -msgstr "" +msgstr "In secondi" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:156 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 @@ -3981,52 +4598,52 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:107 msgid "Incoming checksum" -msgstr "" +msgstr "Checksum in entrata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" -msgstr "" +msgstr "Interfaccia in entrata" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" -msgstr "" +msgstr "Chiave in entrata" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:107 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:104 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:109 msgid "Incoming serialization" -msgstr "" +msgstr "Serializzazione in entrata" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:187 msgid "Info" -msgstr "Informazioni" +msgstr "Info" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 msgid "Information" msgstr "Informazioni" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" -msgstr "" +msgstr "Mappatura QoS in entrata" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" -msgstr "" +msgstr "ID dispositivo di ingresso" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" -msgstr "" +msgstr "Nome dispositivo di ingresso" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" -msgstr "" +msgstr "Errore di inizializzazione" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:77 msgid "Initscript" @@ -4036,39 +4653,55 @@ msgstr "Script di avvio" msgid "Initscripts" msgstr "Script di avvio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" -msgstr "" +msgstr "Vincolo certificato interno (Dominio)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" -msgstr "" +msgstr "Vincolo certificato interno (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" -msgstr "" +msgstr "Vincolo certificato interno (Soggetto)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" -msgstr "" +msgstr "Vincolo certificato interno (carattere jolly)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Installa le estensioni del protocollo..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" -msgstr "" +msgstr "Istanza" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Istanza \"%h\"" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Dettagli dell'istanza" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." msgstr "" +"Invece di collegarti a qualsiasi rete con un SSID corrispondente, connettiti " +"solo al BSSID %h." #: modules/luci-compat/luasrc/view/cbi/map.htm:43 msgid "Insufficient permissions to read UCI configuration." -msgstr "" +msgstr "Autorizzazioni insufficienti per leggere la configurazione UCI." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "Identificatore della scheda a circuito integrato" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 @@ -4077,34 +4710,34 @@ msgstr "" msgid "Interface" msgstr "Interfaccia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." -msgstr "" +msgstr "L'interfaccia \"%h\" è già contrassegnata come master designato." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:62 msgid "Interface %q device auto-migrated from %q to %q." -msgstr "" +msgstr "Interfaccia %q del dispositivo migrata automaticamente da %q a %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" -msgstr "Configurazione Interfaccia" +msgstr "Configurazione interfaccia" #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:39 msgid "Interface ID" -msgstr "" +msgstr "ID interfaccia" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:151 msgid "Interface has %d pending changes" -msgstr "" +msgstr "L'interfaccia ha %d modifiche in sospeso" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:92 msgid "Interface is disabled" -msgstr "" +msgstr "L'interfaccia è disattivata" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:65 msgid "Interface is marked for deletion" -msgstr "" +msgstr "L'interfaccia è contrassegnata per l'eliminazione" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:210 msgid "Interface is reconnecting..." @@ -4114,27 +4747,27 @@ msgstr "L'interfaccia si sta ricollegando..." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:204 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:210 msgid "Interface is shutting down..." -msgstr "L'intefaccia si sta spegnendo..." +msgstr "L'interfaccia si sta spegnendo..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." -msgstr "" +msgstr "L'interfaccia si sta avviando..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." -msgstr "" +msgstr "L'interfaccia si sta fermando..." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 msgid "Interface name" msgstr "Nome interfaccia" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Interfaccia non presente o non ancora connessa." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Interfacce" @@ -4143,51 +4776,65 @@ msgstr "Interfacce" msgid "Internal" msgstr "Interno" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Errore del Server Interno" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "International Mobile Station Equipment Identity" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "International Mobile Subscriber Identity" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" -msgstr "" +msgstr "Intervallo per l'invio di pacchetti di apprendimento" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" +"Intervallo in centisecondi tra richieste generali multicast. Variando il " +"valore, un amministratore può ottimizzare il numero di messaggi IGMP sulla " +"sottorete; valori maggiori fanno sì che le richieste IGMP vengano inviate " +"meno spesso" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" -msgstr "" +msgstr "Intervallo in secondi per i pacchetti di saluto STP" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:192 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:42 msgid "Invalid" -msgstr "Valore immesso non valido" +msgstr "Non valido" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" -msgstr "" +msgstr "APN fornito non valido" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:37 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:40 msgid "Invalid Base64 key string" -msgstr "" +msgstr "Stringa chiave Base64 non valida" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Indirizzo IPv6 non valido" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" -msgstr "" +msgstr "Valore TOS non valido, previsto 00..FF o ereditato" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:83 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:88 msgid "Invalid Traffic Class value, expected 00..FF or inherit" msgstr "" +"Valore della classe di traffico non valido, previsto 00..FF o ereditato" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:285 msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." @@ -4195,38 +4842,61 @@ msgstr "ID VLAN non valido! Solo gli ID compresi tra %d e %d sono consentiti." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:294 msgid "Invalid VLAN ID given! Only unique IDs are allowed" -msgstr "ID VLAN non valido! Solo gli ID unici sono consentiti" +msgstr "ID VLAN non valido! Solo gli ID univoci sono consentiti" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:403 msgid "Invalid argument" -msgstr "" +msgstr "Argomento non valido" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." msgstr "" +"Lista portatore non valida. Forse sono stati creati troppi portatori. Questo " +"protocollo supporta uno e un solo portatore." #: modules/luci-base/htdocs/luci-static/resources/rpc.js:402 msgid "Invalid command" -msgstr "" +msgstr "Comando non valido" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:205 msgid "Invalid hexadecimal value" -msgstr "" +msgstr "Valore esadecimale non valido" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Nome host o indirizzo IPv4 non valido" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Porta non valida" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "URL del server non valido" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." -msgstr "Username e/o password non validi! Per favore riprova." +msgstr "Nome utente e/o password non validi! Per favore riprova." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Inverti pulsazione" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" -msgstr "" +msgstr "Inverti corrispondenza" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "È la VLAN primaria" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" -msgstr "Isola i Client" +msgstr "Isola i client" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:236 msgid "" @@ -4236,50 +4906,54 @@ msgstr "" "Sembra tu stia provando a scrivere un'immagine più grande delle dimensioni " "della memoria flash, per favore controlla il file!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "JavaScript necessario!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" -msgstr "Aggiungi Rete" +msgstr "Unisciti alla rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" -msgstr "Aggiunta rete: rilevamento wireless" +msgstr "Entrata in rete: scansione wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" -msgstr "" +msgstr "Entrata in rete: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" -msgstr "" +msgstr "Vai alla regola" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:228 msgid "Keep settings and retain the current configuration" -msgstr "Mantieni le impostazioni e conserva la configurazione corrente" +msgstr "Mantieni le impostazioni e conserva la configurazione attuale" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "Keep-Alive" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" -msgstr "Registro del Kernel" +msgstr "Registro del kernel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" -msgstr "Versione del Kernel" +msgstr "Versione del kernel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Chiave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Chiave #%d" @@ -4287,25 +4961,31 @@ msgstr "Chiave #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." -msgstr "" +msgstr "Chiave per i pacchetti in entrata (facoltativa)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:96 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." -msgstr "" +msgstr "Chiave per i pacchetti in uscita (facoltativa)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" -msgstr "" +msgstr "Chiave mancante" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Chiave usata per firmare la configurazione di rete" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" -msgstr "" +msgstr "KiB" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:54 msgid "Kill" @@ -4322,7 +5002,7 @@ msgstr "Server L2TP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:269 msgid "LACPDU Packets" -msgstr "" +msgstr "Pacchetti LACPDU" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:130 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:102 @@ -4346,7 +5026,7 @@ msgstr "Intervallo echo LCP" msgid "LED Configuration" msgstr "Configurazione LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4361,34 +5041,43 @@ msgstr "Lingua" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:125 msgid "Language and Style" -msgstr "Lingua e Stile" +msgstr "Lingua e stile" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 -msgid "Last member interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." msgstr "" +"A pesi maggiori (della stessa prio) viene assegnata una probabilità " +"proporzionalmente maggiore di essere selezionati." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +msgid "Last member interval" +msgstr "Intervallo dell'ultimo membro" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Ultimo handshake" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" -msgstr "" +msgstr "Foglia" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" -msgstr "" +msgstr "Apprendi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" -msgstr "" +msgstr "Apprendi i percorsi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "File di lease" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Tempo di lease" @@ -4412,52 +5101,48 @@ msgstr "Lascia vuoto per l'autorilevamento" msgid "Leave empty to use the current WAN address" msgstr "Lascia vuoto per usare l'indirizzo WAN attuale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -"Alcuni dispositivi legacy o con un cattivo comportamento possono richiedere " -"velocità 802.11b legacy per interoperare correttamente. In questi casi " -"l'efficienza del tempo di trasmissione potrebbe essere ridotta. Si consiglia " -"di non consentire velocità 802.11b ove possibile." +"Alcuni dispositivi obsoleti o che si comportano male possono richiedere " +"vecchie velocità 802.11b per interoperare. In questi casi l'efficienza del " +"tempo di trasmissione potrebbe essere ridotta. Si consiglia di non " +"consentire velocità 802.11b ove possibile." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" -msgstr "" +msgstr "Regole obsolete rilevate" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Legenda:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Limite" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" -msgstr "" +msgstr "Modalità della linea" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" -msgstr "" +msgstr "Stato della linea" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" -msgstr "" +msgstr "Tempo di attività della linea" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:125 msgid "Link Aggregation (Channel Bonding)" -msgstr "" +msgstr "Aggregazione di collegamenti (Channel Bonding)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:349 msgid "Link Monitoring" -msgstr "" +msgstr "Monitoraggio dei collegamenti" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:24 msgid "Link On" @@ -4466,18 +5151,22 @@ msgstr "Connessione stabilita" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:77 msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" -msgstr "" +msgstr "Bit di intestazione del livello di collegamento %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Elenco di indirizzi IP da convertire in risposte NXDOMAIN." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" +"Elenco di set di IP da popolare con gli IP dei risultati della ricerca DNS " +"degli FQDN specificati anche qui." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4485,8 +5174,13 @@ msgid "" "from the R0KH that the STA used during the Initial Mobility Domain " "Association." msgstr "" +"Elenco di R0KH nello stesso dominio di mobilità.
    Formato: indirizzo " +"MAC, identificatore NAS, chiave a 128 bit come stringa esadecimale.
    Questo elenco viene usato per mappare R0KH-ID (identificatore NAS) a un " +"indirizzo MAC di destinazione quando si richiede la chiave PMK-R1 dall'R0KH " +"che la STA ha usato durante l'associazione del dominio di mobilità iniziale." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4494,46 +5188,51 @@ msgid "" "R0KH. This is also the list of authorized R1KHs in the MD that can request " "PMK-R1 keys." msgstr "" +"Elenco di R1KH nello stesso dominio di mobilità.
    Formato: indirizzo " +"MAC, R1KH-ID come 6 ottetti con due punti (:), chiave a 128 bit come stringa " +"esadecimale.
    Questo elenco viene usato per mappare R1KH-ID a un " +"indirizzo MAC di destinazione quando si invia la chiave PMK-R1 da R0KH. È " +"anche l'elenco degli R1KH autorizzati nel MD che possono richiedere le " +"chiavi PMK-R1." #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:82 msgid "List of SSH key files for auth" -msgstr "" +msgstr "Elenco dei file chiave SSH per autenticazione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Elenco di domini per cui consentire risposte RFC1918." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Elenco di domini da forzare a un indirizzo IP." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "Elenco di name server a cui inoltrare le richieste." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Porta in ascolto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" -msgstr "" +msgstr "Interfacce di ascolto" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 msgid "Listen only on the given interface or, if unspecified, on all" -msgstr "Ascolta solo sull'interfaccia data o, se non specificato, su tutte" +msgstr "Ascolta solo sull'interfaccia indicata o, se non specificata, su tutte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." msgstr "" +"Ascolta solo sulle interfacce specificate e loopback se non escluso in modo " +"esplicito." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:299 msgid "ListenPort setting is invalid" -msgstr "" +msgstr "L'impostazione ListenPort non è valida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Porta di ascolto per le richieste DNS in entrata." @@ -4542,46 +5241,47 @@ msgstr "Porta di ascolto per le richieste DNS in entrata." msgid "Load" msgstr "Carico" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" -msgstr "Carico Medio" +msgstr "Carico medio" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:189 msgid "Load configuration…" -msgstr "" +msgstr "Carica configurazione…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" -msgstr "" +msgstr "Caricamento dati…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" -msgstr "" +msgstr "Caricamento del contenuto della cartella…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Caricamento pagina…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" -msgstr "" +msgstr "Locale" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" -msgstr "" +msgstr "Indirizzo IP locale" #: modules/luci-base/htdocs/luci-static/resources/network.js:12 #: modules/luci-compat/luasrc/model/network.lua:30 msgid "Local IP address is invalid" -msgstr "" +msgstr "L'indirizzo IP locale non è valido" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:86 msgid "Local IP address to assign" -msgstr "" +msgstr "Indirizzo IP locale da assegnare" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 @@ -4590,11 +5290,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Indirizzo IPv4 locale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Server DNS IPv6 locale" @@ -4608,49 +5309,75 @@ msgstr "Indirizzo IPv6 locale" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:115 msgid "Local Startup" -msgstr "Avvio Locale" +msgstr "Avvio locale" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Data/ora locale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" -msgstr "" +msgstr "ULA locale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Dominio locale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "Suffisso di dominio locale aggiunto ai nomi DHCP e voci del file hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Server locale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Solo servizio locale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Chiave WireGuard locale" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Localizza richieste" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "Prefisso località" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" -msgstr "" +msgstr "Blocca al BSSID" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Registra evento \"%h…\"" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Accedi" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Vai all'accesso…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Esci" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Livello di dettaglio registro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" -msgstr "Logga richieste" +msgstr "Registra richieste" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:123 msgid "Logging" @@ -4658,7 +5385,7 @@ msgstr "Registrazione (log)" #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:23 msgid "Logging in…" -msgstr "" +msgstr "Registrazione in…" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 @@ -4666,60 +5393,52 @@ msgid "" "Logical network from which to select the local endpoint if local IPv6 " "address is empty and no WAN IPv6 is available (optional)." msgstr "" +"Rete logica da cui selezionare il punto finale locale se l'indirizzo IPv6 " +"locale è vuoto e non è disponibile alcun IPv6 WAN (facoltativo)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 msgid "Logical network to which the tunnel will be added (bridged) (optional)." -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Login" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Esci" +msgstr "Rete logica a cui verrà aggiunto il tunnel (con bridge) (facoltativo)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" -msgstr "" +msgstr "Filtraggio debole" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." -msgstr "" +msgstr "Indirizzo in lease più basso come offset dall'indirizzo di rete." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Modalità di compatibilità Lua attiva" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "Indirizzo MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Filtro indirizzo MAC" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:253 msgid "MAC Address For The Actor" -msgstr "" +msgstr "Indirizzo MAC per l'attore" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" -msgstr "" +msgstr "VLAN MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4728,23 +5447,31 @@ msgstr "" msgid "MAC address" msgstr "Indirizzo MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "Indirizzo/i MAC" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Filtro MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Lista MAC" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:16 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:13 msgid "MAP / LW4over6" -msgstr "" +msgstr "MAP / LW4over6" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:62 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:7 msgid "MAP rule is invalid" -msgstr "" +msgstr "La regola MAP non è valida" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "MBIM cellulare" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" @@ -4757,33 +5484,39 @@ msgstr "MHz" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:354 msgid "MII" -msgstr "" +msgstr "MII" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:422 msgid "MII / ETHTOOL ioctls" -msgstr "" +msgstr "MII / ETHTOOL ioctls" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:395 msgid "MII Interval" -msgstr "" +msgstr "Intervallo MII" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " "below:" msgstr "" +"Assicurati di clonare il filesystem di root usando qualcosa come i seguenti " +"comandi:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4792,69 +5525,69 @@ msgstr "" msgid "Manual" msgstr "Manuale" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "Fabbricante" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" -msgstr "" +msgstr "Master" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "Tag corrispondente" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "Intervallo massimo RA" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" -msgstr "" -"Max. lease DHCP" +msgstr "Max lease DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" -msgstr "" -"Max. dimensione pacchetti EDNS0" +msgstr "Max dim. pacchetto EDNS0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" -msgstr "Numero max. richieste simultanee" +msgstr "Max richieste simultanee" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" -msgstr "" +msgstr "Età massima" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Massimo intervallo di ascolto consentito" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." -msgstr "" +msgstr "Numero massimo consentito di lease DHCP attivi." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." -msgstr "" +msgstr "Numero massimo consentito di richieste DNS simultanee." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." -msgstr "" +msgstr "Dimensione massima consentita dei pacchetti UDP EDNS0." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" -msgstr "" +msgstr "Numero massimo di secondi di attesa affinché il modem sia pronto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Numero massimo indirizzi prenotabili." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" -msgstr "" +msgstr "Dimensione massima della tabella di snooping" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -4863,10 +5596,14 @@ msgstr "" "Advertisement, ICMPv6 Type 134\">RA
    non richiesti. Il valore " "predefinito è 600 secondi." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Potenza di trasmissione massima" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Potrebbe impedire il funzionamento del VoIP o di altri servizi." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4883,7 +5620,7 @@ msgstr "Mbit/s" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 msgid "Medium" -msgstr "" +msgstr "Medio" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:24 msgid "Memory" @@ -4891,33 +5628,41 @@ msgstr "Memoria RAM" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:73 msgid "Memory usage (%)" -msgstr "Uso Memoria (%)" +msgstr "Uso memoria (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" -msgstr "" +msgstr "Mesh" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 msgid "Mesh ID" -msgstr "" +msgstr "ID mesh" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" -msgstr "" +msgstr "ID mesh" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Instradamento mesh" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Opzioni relative a mesh e instradamento" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" -msgstr "" +msgstr "Metodo non trovato" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:350 msgid "Method of link monitoring" -msgstr "" +msgstr "Metodo di monitoraggio dei collegamenti" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:419 msgid "Method to determine link status" -msgstr "" +msgstr "Metodo per determinare lo stato del collegamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4926,27 +5671,29 @@ msgstr "Metrica" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:70 msgctxt "nft unit" msgid "MiB" -msgstr "" +msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "Intervallo minimo RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" -msgstr "" +msgstr "Tempo minimo di validità ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:237 msgid "Minimum Number of Links" -msgstr "" +msgstr "Numero minimo di collegamenti" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" +"Tempo minimo richiesto in secondi prima che una voce ARP possa essere " +"sostituita. Impedisce il thrashing della cache ARP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4957,111 +5704,120 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:204 msgid "Mirror monitor port" -msgstr "" +msgstr "Porta di monitoraggio mirror" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:203 msgid "Mirror source port" -msgstr "" +msgstr "Porta sorgente mirror" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "Prefisso internazionale mobile" #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" -msgstr "" +msgstr "Dati mobili" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "Codice di rete mobile" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "Servizio mobile" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" -msgstr "" +msgstr "Dominio di mobilità" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Modalità" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Modello" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "Informazioni modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" +"Connessione modem in corso. Attendere prego. Questo processo scadrà dopo 2 " +"minuti." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" -msgstr "" +msgstr "Impostazione predefinita del modem" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Dispositivo modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" -msgstr "" +msgstr "Richiesta di informazioni sul modem fallita" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" -msgstr "" +msgstr "Scadenza di inizializzazione del modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" -msgstr "" +msgstr "ModemManager" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 msgid "More Characters" -msgstr "" +msgstr "Altri caratteri" #: modules/luci-base/htdocs/luci-static/resources/form.js:2581 msgid "More…" -msgstr "" +msgstr "Altro…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:192 msgid "Mount Point" -msgstr "Punto di Mount" +msgstr "Punto di mount" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:144 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:102 msgid "Mount Points" -msgstr "Punti di Mount" +msgstr "Punti di mount" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:229 msgid "Mount Points - Mount Entry" -msgstr "Punti di Mount - Voce di Mount" +msgstr "Punti di mount - Voce di mount" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:341 msgid "Mount Points - Swap Entry" -msgstr "Punti di Mount - Voce Swap" +msgstr "Punti di mount - Voce swap" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 msgid "" @@ -5069,15 +5825,15 @@ msgid "" "filesystem" msgstr "" "I punti di mount definiscono in quale punto un dispositivo di memoria verrà " -"attaccato al tuo filesystem" +"collegato al filesystem" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 msgid "Mount attached devices" -msgstr "" +msgstr "Monta i dispositivi collegati" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 msgid "Mount filesystems not specifically configured" -msgstr "" +msgstr "Monta filesystem non specificatamente configurati" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:332 msgid "Mount options" @@ -5093,92 +5849,113 @@ msgstr "Monta swap non configurato specificatamente" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:223 msgid "Mounted file systems" -msgstr "File system montati" +msgstr "Filesystem montati" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 msgid "Move down" -msgstr "Muovi giù" +msgstr "Sposta in giù" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 msgid "Move up" -msgstr "Muovi su" +msgstr "Sposta in su" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Multi a unicast" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:96 msgid "Multicast" -msgstr "" +msgstr "Multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Modalità multicast" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" -msgstr "" +msgstr "Instradamento multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" -msgstr "" +msgstr "Multicast a unicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" -msgstr "ID della NAS" +msgstr "ID NAS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" -msgstr "" +msgstr "Catena d'azione NAT \"%h\"" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:87 msgid "NAT-T Mode" -msgstr "" +msgstr "Modalità NAT-T" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 msgid "NAT64 Prefix" -msgstr "" +msgstr "Prefisso NAT64" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "Prefisso NAT64" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" -msgstr "" +msgstr "Slave proxy NDP" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:72 msgid "NT Domain" -msgstr "" +msgstr "Dominio NT" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:300 msgid "NTP server candidates" msgstr "Candidati server NTP" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Nome" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Nome della nuova rete" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Nome del dispositivo tunnel" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigazione" #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:10 msgid "Nebula Network" -msgstr "" +msgstr "Rete Nebula" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Resoconto dei vicini" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" -msgstr "" +msgstr "Validità della cache dei vicini" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5187,32 +5964,36 @@ msgstr "" msgid "Network" msgstr "Rete" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Codifica della rete" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" -msgstr "" +msgstr "Modalità di rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" -msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "Registrazione della rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Utilità di Rete" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" +msgstr "SSID di rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" -msgstr "" +msgstr "Indirizzo di rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Immagine di avvio di rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "Migrazione della configurazione bridge di rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Dispositivo di rete" @@ -5225,108 +6006,128 @@ msgstr "Attività dispositivo di rete (kernel: netdev)" msgid "Network device is not present" msgstr "Il dispositivo di rete non è presente" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" -msgstr "" +msgstr "Tabella dispositivi di rete \"%h\"" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:78 msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" -msgstr "" +msgstr "Bit di intestazione di rete %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Migrazione della configurazione ifname di rete" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 msgid "Network interface" -msgstr "" +msgstr "Interfaccia di rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" -msgstr "" +msgstr "ID di rete" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Mai" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Mai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -"Non inoltrare mai domini e sottodomini corrispondenti, risolvere solo da " -"DHCP o file hosts." +"Non inoltrare mai domini e sottodomini corrispondenti, risolvi solo da DHCP " +"o file hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" -msgstr "" +msgstr "Impossibile creare la nuova interfaccia per \"%s\": %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" -msgstr "" +msgstr "Nuovo nome interfaccia…" #: modules/luci-compat/luasrc/view/cbi/delegator.htm:11 msgid "Next »" msgstr "Prossimo »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "No" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" -msgstr "Nessun Server DHCP configurato per questa interfaccia" +msgstr "Nessun server DHCP configurato per questa interfaccia" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:202 msgid "No Data" msgstr "Nessun dato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Nessuna crittografia" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:185 msgid "No Host Routes" -msgstr "" +msgstr "Nessun percorso host" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:89 msgid "No NAT-T" -msgstr "" +msgstr "Nessun NAT-T" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 msgid "No RX signal" -msgstr "" +msgstr "Nessun segnale RX" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Nessuna interfaccia WireGuard configurata." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "Nessuna configurazione di modalità consentita trovata." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " "mode should only be used to install a firmware upgrade" msgstr "" +"Nessuna modifica alle impostazioni verrà memorizzata e verrà persa dopo il " +"riavvio. Questa modalità deve essere usata solo per installare un " +"aggiornamento del firmware" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:69 msgid "No client associated" msgstr "Nessun client associato" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Nessun dispositivo di controllo specificato" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" -msgstr "" +msgstr "Nessun dato" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:406 msgid "No data received" msgstr "Nessun dato ricevuto" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" -msgstr "" +msgstr "Nessuna forzatura" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:229 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:232 @@ -5335,21 +6136,19 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:241 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:244 msgid "No entries available" -msgstr "" +msgstr "Nessuna voce disponibile" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" -msgstr "" +msgstr "Nessuna voce in questa directory" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Nessun file trovato" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" msgstr "" +"Nessuna porta di ascolto fissa dell'interfaccia definita, i peer potrebbero " +"non essere in grado di avviare connessioni a questa istanza WireGuard!" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 @@ -5357,9 +6156,9 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:70 msgid "No host route" -msgstr "" +msgstr "Nessun percorso host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5369,44 +6168,54 @@ msgstr "Nessuna informazione disponibile" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:63 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:8 msgid "No matching prefix delegation" -msgstr "Nessun prefisso delegato compatibile" +msgstr "Nessuna delega del prefisso corrispondente" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:142 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:145 msgid "No more slaves available" -msgstr "" +msgstr "Non ci sono più slave disponibili" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:189 msgid "No more slaves available, can not save interface" msgstr "" +"Non ci sono più slave disponibili, non è possibile salvare l'interfaccia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Nessuna cache negativa" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." -msgstr "" +msgstr "Nessun set di regole nftables caricato." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Nessuna password immessa!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Nessun peer connesso" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." -msgstr "" +msgstr "Ancora nessun peer definito." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "Nessuna configurazione di modalità preferita trovata." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." -msgstr "Non sono ancora presenti chiavi pubbliche." +msgstr "Ancora nessuna chiave pubblica presente." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" -msgstr "" +msgstr "Nessuna regola in questa catena" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:91 msgid "No rules in this chain." @@ -5414,10 +6223,11 @@ msgstr "Nessuna regola in questa catena." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:385 msgid "No validation or filtering" -msgstr "" +msgstr "Nessuna convalida o filtro" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Nessuna zona assegnata" @@ -5429,36 +6239,39 @@ msgstr "Nessuna zona assegnata" msgid "Noise" msgstr "Rumore" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Margine di Rumore (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Margine di rumore" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Rumore:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" -msgstr "" +msgstr "Non jolly" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Nessuno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normale" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" -msgstr "Non Trovato" +msgstr "Non trovato" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Non membro" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" @@ -5472,25 +6285,34 @@ msgstr "Non connesso" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" -msgstr "" +msgstr "Non presente" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 msgid "Not started on boot" -msgstr "" +msgstr "Non eseguito all'avvio" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:409 msgid "Not supported" -msgstr "" +msgstr "Non supportato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" -"Nota: alcuni driver wireless non supportano completamente 802.11w. Ad " -"esempio, mwlwifi potrebbe avere problemi" +"Nota: alcuni driver wireless non supportano completamente 802.11w. Es. " +"mwlwifi potrebbe avere problemi" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Nota: potrebbe essere necessario anche un proxy DHCP (attualmente non " +"disponibile) quando si specifica una porta \"Inoltra a\" non standard " +"(addr#port)." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" @@ -5500,32 +6322,32 @@ msgstr "Note" msgid "Notice" msgstr "Avviso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" -msgstr "" +msgstr "Nslookup" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:333 msgid "Number of IGMP membership reports" -msgstr "" +msgstr "Numero di report di appartenenza IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." -msgstr "" +msgstr "Numero di voci DNS in cache, 10000 è il massimo, 0 è nessuna cache." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:311 msgid "Number of peer notifications after failover event" -msgstr "" +msgstr "Numero di notifiche peer dopo l'evento di failover" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:69 msgid "Obfuscated Group Password" -msgstr "" +msgstr "Password di gruppo offuscata" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:61 msgid "Obfuscated Password" -msgstr "" +msgstr "Password offuscata" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5533,36 +6355,45 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 msgid "Obtain IPv6 address" -msgstr "" +msgstr "Ottieni indirizzo IPv6" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" -msgstr "" +msgstr "Off" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:18 msgid "Off-State Delay" +msgstr "Ritardo di disconnessione" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." msgstr "" +"Off: vlanXXX, ad es., vlan1. On: " +"vlan_tagged_interface.XXX, ad es. eth0.1." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" -msgstr "" +msgstr "On" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:12 msgid "On-State Delay" -msgstr "" +msgstr "Ritardo di attivazione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" -msgstr "" +msgstr "On-link" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Devi specificare almeno il nome host o l'indirizzo MAC!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" -msgstr "" +msgstr "Uno dei seguenti: %s" #: modules/luci-compat/luasrc/view/cbi/nullsection.htm:17 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:22 @@ -5571,181 +6402,250 @@ msgstr "Uno o più campi contengono valori non validi!" #: modules/luci-compat/luasrc/view/cbi/map.htm:32 msgid "One or more invalid/required values on tab" -msgstr "" +msgstr "Uno o più valori non validi/obbligatori nella scheda" #: modules/luci-compat/luasrc/view/cbi/nullsection.htm:19 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:24 msgid "One or more required fields have no value!" msgstr "Uno o più campi obbligatori sono vuoti!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "Accetta solo risposte via" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" +"Consenti la comunicazione solo con porte bridge non isolate se attivato" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:231 msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" +"Solo se lo slave attivo attuale fallisce e lo slave primario è attivo " +"(failure, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" -msgstr "" +msgstr "Apri panoramica regole iptables…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Apri lista..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" -msgstr "" +msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" -msgstr "" +msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -"Opera in modalità relay se un'interfaccia master designata è " -"configurata e attiva, altrimenti disabilita il proxy modalità relay
    se un'interfaccia master designata è " +"configurata e attiva, altrimenti disattiva il proxy NDP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" +"Opera in modalità relay se un'interfaccia master designata è " +"configurata e attiva, altrimenti ripiega in modalità server." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" +"Opera in modalità relay se è presente un prefisso IPv6 upstream, " +"altrimenti disattiva il servizio." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" -msgstr "Frequenza" +msgstr "Frequenza operativa" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "Operatore" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "Codice operatore" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "Nome operatore" #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." -msgstr "" +msgstr "L'opzione \"%s\" contiene un valore di input non valido." #: modules/luci-base/htdocs/luci-static/resources/form.js:2021 msgid "Option \"%s\" must not be empty." -msgstr "" +msgstr "L'opzione \"%s\" non deve essere vuota." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Opzione cambiata" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" -msgstr "Opzione cancellata" +msgstr "Opzione rimossa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" -msgstr "" +msgstr "Facoltativo" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "Nome host facoltativo da assegnare" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" -msgstr "Facoltativo, note in forma libera su questo dispositivo" +msgstr "Facoltativo, note in formato libero su questo dispositivo" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" +"Facoltativo, in secondi. Se impostato a '0', non viene tentata alcuna " +"riconnessione." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" +"Facoltativo. Contrassegno a 32 bit per i pacchetti crittografati in uscita. " +"Immetti il valore in esadecimale, iniziando con 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " "server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') " "for the interface." msgstr "" +"Facoltativo. Valori consentiti: 'eui64', 'random', valore fisso come '::1' o " +"'::1:2'. Quando il prefisso IPv6 (come 'a:b:c:d::') viene ricevuto da un " +"server delegante, usa il suffisso (come '::1') per formare l'indirizzo IPv6 " +"('a:b:c:d: :1') per l'interfaccia." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" +"Facoltativo. Chiave precondivisa con codifica Base64. Aggiunge un ulteriore " +"livello di crittografia a chiave simmetrica per la resistenza post-" +"quantistica." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." -msgstr "" +msgstr "Facoltativo. Crea instradamenti per gli IP consentiti per questo peer." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." -msgstr "" +msgstr "Facoltativo. Descrizione del peer." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:185 msgid "Optional. Do not create host routes to peers." -msgstr "" +msgstr "Facoltativo. Non creare percorsi host verso i peer." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" +"Facoltativo. Host del peer. I nomi vengono risolti prima di aprire " +"l'interfaccia." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " "routes through the tunnel." msgstr "" +"Facoltativo. Indirizzi IP e prefissi che questo peer può usare all'interno " +"del tunnel. Di solito gli indirizzi IP del tunnel del peer e le reti che il " +"peer instrada attraverso il tunnel." #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "Optional. Maximum Transmission Unit of the XFRM interface." msgstr "" +"Facoltativo. Unità massima di trasmissione (MTU) dell'interfaccia XFRM." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" +"Facoltativo. Unità massima di trasmissione (MTU) dell'interfaccia del tunnel." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." -msgstr "" +msgstr "Facoltativo. Porta del peer." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " "code if available. It can be removed after the configuration has been " "exported." msgstr "" +"Facoltativo. Chiave privata del peer WireGuard. La chiave non è necessaria " +"per stabilire una connessione ma consente di generare una configurazione " +"peer o un codice QR, se disponibile. Può essere rimossa dopo che la " +"configurazione è stata esportata." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." msgstr "" +"Facoltativo. Secondi tra i messaggi Keep Alive. Il valore predefinito è 0 " +"(disattivato). Il valore consigliato se questo dispositivo è protetto da un " +"NAT è 25." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 msgid "Optional. UDP port used for outgoing and incoming packets." -msgstr "" +msgstr "Facoltativo. Porta UDP usata per i pacchetti in uscita e in entrata." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:72 msgid "Options" msgstr "Opzioni" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" for default route. 0.0.0.0 means \"the address of the " "system running dnsmasq\"." msgstr "" +"Opzioni per l'ID di rete. (Nota: richiede anche l'ID di rete.) Ad es. " +"\"42,192.168.1.4\" per server NTP, \"3,192.168.4.4\" per percorso predefinito. 0.0.0.0 significa " +"\"l'indirizzo del sistema che esegue dnsmasq\"." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" -msgstr "" +msgstr "Opzioni:" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Ordinale: prima il più basso." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Intervallo dell'originatore" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" @@ -5764,54 +6664,57 @@ msgstr "In uscita:" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:108 msgid "Outgoing checksum" -msgstr "" +msgstr "Checksum in uscita" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" -msgstr "" +msgstr "Interfaccia in uscita" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:96 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" -msgstr "" +msgstr "Chiave in uscita" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:108 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110 msgid "Outgoing serialization" -msgstr "" +msgstr "Serializzazione in uscita" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:50 msgid "Output Interface" -msgstr "" +msgstr "Interfaccia di output" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 msgid "Output zone" -msgstr "" +msgstr "Zona di output" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:16 msgid "Overlap" -msgstr "" +msgstr "Sovrapposizione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" -msgstr "" +msgstr "Sostituisci la tabella di instradamento IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" -msgstr "" +msgstr "Sostituisci la tabella di instradamento IPv6" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5819,6 +6722,7 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "Sovrascrivi MTU" @@ -5840,55 +6744,70 @@ msgstr "Sovrascrivi TOS" msgid "Override TTL" msgstr "Sovrascrivi TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" msgstr "" +"Sostituisci l'indirizzo MAC predefinito: l'intervallo di indirizzi " +"utilizzabili potrebbe essere limitato dal driver" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 msgid "Override default interface name" -msgstr "Sovrascrivi nome interfaccia di default" +msgstr "Sovrascrivi nome interfaccia predefinita" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 msgid "Override the gateway in DHCP responses" msgstr "Sovrascrivi il gateway nelle risposte DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." msgstr "" -"Sovrascrivi la netmask data ai clienti. Normalmente è calcolata dalla subnet " -"servita." +"Sovrascrivi la maschera di rete inviata ai client. Normalmente è calcolata " +"dalla sottorete servita." #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 msgid "Override the table used for internal routes" -msgstr "Sovrascrivi la tabella usata per le route interne" +msgstr "Sovrascrivi la tabella usata per gli instradamenti interni" #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:3 msgid "Overview" msgstr "Riepilogo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" -msgstr "" +msgstr "Sovrascrivere il file esistente \"%s\"?" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:355 msgid "Overwrite the current settings with the imported configuration?" -msgstr "" +msgstr "Sovrascrivere le impostazioni attuali con la configurazione importata?" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "Numeri propri" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Proprietario" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" -msgstr "" +msgstr "PAP/CHAP (entrambi)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -5897,11 +6816,12 @@ msgstr "" #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:94 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:46 msgid "PAP/CHAP password" -msgstr "" +msgstr "Password PAP/CHAP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -5910,36 +6830,38 @@ msgstr "" #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:89 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:44 msgid "PAP/CHAP username" -msgstr "" +msgstr "Nome utente PAP/CHAP" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" -msgstr "" +msgstr "Tipo PDP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:69 msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" -msgstr "" +msgstr "PIN" #: modules/luci-base/htdocs/luci-static/resources/network.js:21 #: modules/luci-compat/luasrc/model/network.lua:39 msgid "PIN code rejected" -msgstr "" +msgstr "Codice PIN rifiutato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" -msgstr "" +msgstr "PMK R1 Push" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:13 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:43 msgid "PPP" -msgstr "" +msgstr "PPP" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:58 msgid "PPPoA Encapsulation" @@ -5963,37 +6885,46 @@ msgstr "PPPoSSH" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:15 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:28 msgid "PPtP" -msgstr "" +msgstr "PPtP" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:73 msgid "PSID offset" -msgstr "" +msgstr "Offset PSID" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:70 msgid "PSID-bits length" -msgstr "" +msgstr "Lunghezza dei bit PSID" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" -msgstr "" +msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" -msgstr "" +msgstr "PTM/EFM (Modalità Trasferimento Pacchetti)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" -msgstr "" +msgstr "Impostazioni PXE/TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "Stato del servizio dei pacchetti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "Packet Steering" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" -msgstr "" +msgstr "Marchio del pacchetto" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Tempo di ricezione del pacchetto" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" @@ -6001,93 +6932,105 @@ msgstr "Pacchetti" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:277 msgid "Packets To Transmit Before Moving To Next Slave" -msgstr "" +msgstr "Pacchetti da trasmettere prima di passare allo slave successivo" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "Parte della rete:" +msgstr[1] "Parte delle reti:" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Parte della zona %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" -msgstr "" +msgstr "Pass-through (mirror del dispositivo fisico su una singola MAC VLAN)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Password" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 msgid "Password authentication" -msgstr "Password di authenticazione" +msgstr "Autenticazione con password" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Password della chiave privata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" -msgstr "" +msgstr "Password della chiave privata interna" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 msgid "Password strength" -msgstr "" +msgstr "Complessità della password" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" -msgstr "" +msgstr "Password2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "Incolla o trascina il file della chiave SSH…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "" +"Incolla o trascina il file di configurazione peer di WireGuard (wg0.conf)…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" +"Incolla o trascina una configurazione di WireGuard (solitamente wg0." +"conf) da un altro sistema qua sotto per creare una voce peer " +"corrispondente che consenta a quel sistema di connettersi all'interfaccia " +"WireGuard locale." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" -msgstr "" +msgstr "Incolla o trascina il file di configurazione di WireGuard fornito…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Percorso del certificato CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" -msgstr "" +msgstr "Percorso del certificato client" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Percorso della chiave privata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" -msgstr "" +msgstr "Percorso del certificato CA interno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" -msgstr "" +msgstr "Percorso del certificato client interno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" -msgstr "" +msgstr "Percorso della chiave privata interna" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2727 msgid "Paused" @@ -6107,26 +7050,34 @@ msgstr "In pausa" msgid "Peak:" msgstr "Picco:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Peer" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Dettagli peer" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" -msgstr "" +msgstr "Indirizzo IP del peer da assegnare" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" -msgstr "" +msgstr "Indirizzo MAC del peer" #: modules/luci-base/htdocs/luci-static/resources/network.js:14 #: modules/luci-compat/luasrc/model/network.lua:32 msgid "Peer address is missing" -msgstr "" +msgstr "Manca l'indirizzo del peer" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" -msgstr "" +msgstr "Nome del dispositivo peer" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" -msgstr "" +msgstr "Peer disattivato" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:214 msgid "Peers" @@ -6134,14 +7085,14 @@ msgstr "Peer" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:80 msgid "Perfect Forward Secrecy" -msgstr "" +msgstr "Perfect Forward Secrecy" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:108 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110 msgid "Perform outgoing packets serialization (optional)." -msgstr "" +msgstr "Esegui la serializzazione dei pacchetti in uscita (facoltativo)." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:34 msgid "Perform reboot" @@ -6149,33 +7100,37 @@ msgstr "Esegui un riavvio" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:406 msgid "Perform reset" -msgstr "Esegui ripristino" +msgstr "Esegui un ripristino" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:407 msgid "Permission denied" -msgstr "" +msgstr "Permesso negato" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" -msgstr "" +msgstr "Keep Alive persistente" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Intervallo di riconnessione persistente" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" -msgstr "" +msgstr "L'impostazione PersistentKeepAlive non è valida" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:290 msgid "Phy Rate:" -msgstr "" +msgstr "Velocità phy:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" -msgstr "Impostazioni Fisiche" +msgstr "Impostazioni fisiche" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" -msgstr "" +msgstr "Ping" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:50 @@ -6184,76 +7139,94 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:138 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:64 msgid "Pkts." -msgstr "" +msgstr "Pacc." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." -msgstr "Per favore inserisci il tuo username e la password." +msgstr "Per favore inserisci nome utente e password." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." -msgstr "Selezionare il file da caricare." +msgstr "Seleziona il file da caricare." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Policy" msgstr "Politica" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" -msgstr "" +msgstr "Politica: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Porta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Porta %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "La porta non fa parte di alcuna rete" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" -msgstr "" +msgstr "Isolamento della porta" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "Stato della porta" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" -msgstr "Status porta:" +msgstr "Stato della porta:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" +msgstr "Negazione potenziale di: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "Stato di alimentazione" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" -msgstr "" +msgstr "Preferisci LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" -msgstr "" +msgstr "Preferisci UMTS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "Tempo di vita preferito per un prefisso." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "Tecnologia di rete preferita" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" -msgstr "" +msgstr "Prefisso delegato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" -msgstr "" +msgstr "Soppressore prefisso" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" -msgstr "" +msgstr "Chiave pre-condivisa" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" -msgstr "" +msgstr "Chiave pre-condivisa in uso" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:308 msgid "PresharedKey setting is invalid" -msgstr "" +msgstr "L'impostazione PresharedKey non è valida" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:130 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:102 @@ -6265,59 +7238,71 @@ msgid "" "Presume peer to be dead after given amount of LCP echo failures, use 0 to " "ignore failures" msgstr "" +"Presumi che il peer sia inattivo dopo un determinato numero di fallimenti di " +"echo LCP, usa 0 per ignorare i fallimenti" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Prevents client-to-client communication" -msgstr "Impedisci la comunicazione fra Client" +msgstr "Impedisce la comunicazione fra client" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" +"Impedisce a un client wireless di comunicare con un altro. Questa " +"impostazione influisce solo sui pacchetti senza alcun tag VLAN (pacchetti " +"senza tag)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" +msgstr "Slave primario" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " "better than current slave (better, 1)" msgstr "" +"Il primario diventa lo slave attivo quando torna in funzione se la velocità " +"e il duplex sono migliori dello slave attuale (migliore, 1)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:229 msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" +"Il primario diventa uno slave attivo ogni volta che torna in linea (sempre, " +"0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" -msgstr "" +msgstr "Priorità" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" -msgstr "" +msgstr "Privato" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" -msgstr "" +msgstr "Privato (impedisce la comunicazione tra MAC VLAN)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" -msgstr "" +msgstr "Chiave Privata" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" -msgstr "" +msgstr "Chiave privata presente" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:296 msgid "PrivateKey setting is missing or invalid" -msgstr "" +msgstr "L'impostazione PrivateKey è mancante o non valida" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:64 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:93 @@ -6329,8 +7314,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6342,13 +7327,15 @@ msgstr "Protocollo" msgid "Provide NTP server" msgstr "Fornisci server NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" +"Fornisci un server DHCPv6 su questa interfaccia e rispondi alle " +"sollecitazioni e richieste DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Fornisci nuova rete" @@ -6357,26 +7344,39 @@ msgid "" "Provide the NTP server to the selected interface or, if unspecified, to all " "interfaces" msgstr "" +"Fornisci il server NTP all'interfaccia selezionata o, se non specificato, a " +"tutte le interfacce" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Server proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Chiave pubblica" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" -msgstr "" +msgstr "Manca la chiave pubblica" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" -msgstr "" +msgstr "Chiave pubblica: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6385,121 +7385,157 @@ msgid "" msgstr "" "Le chiavi pubbliche consentono accessi SSH senza password con una maggiore " "sicurezza rispetto all'uso di semplici password. Per caricare una nuova " -"chiave sul dispositivo, incollare una stringa di chiave pubblica compatibile " -"con OpenSSH o trascinare un file .pub nel campo di input." +"chiave sul dispositivo, incolla una stringa di chiave pubblica compatibile " +"con OpenSSH o trascina un file .pub nel campo di input." #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 msgid "Public prefix routed to this device for distribution to clients." msgstr "" +"Prefisso pubblico instradato a questo dispositivo per la distribuzione ai " +"client." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:305 msgid "PublicKey setting is invalid" -msgstr "" +msgstr "L'impostazione PublicKey non è valida" #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:9 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:27 msgid "QMI Cellular" -msgstr "" +msgstr "QMI cellulare" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 msgid "Quality" msgstr "Qualità" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." -msgstr "" +msgstr "Interroga tutti i risolutori upstream disponibili." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" -msgstr "" +msgstr "Intervallo di interrogazione" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" -msgstr "" +msgstr "Intervallo di risposta alla richiesta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" -msgstr "" +msgstr "Durata chiave R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" -msgstr "" +msgstr "Portachiavi R1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" -msgstr "" +msgstr "Porta di contabilità RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" -msgstr "" +msgstr "Segreto di contabilità RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" -msgstr "" +msgstr "Server di contabilità RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" -msgstr "" +msgstr "Porta di autenticazione RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" -msgstr "" +msgstr "Segreto di autenticazione RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" -msgstr "" +msgstr "Server di autenticazione RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "Assegnazione VLAN dinamica RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "RADIUS per STA VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "Schema di denominazione del bridge VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "Denominazione VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "Interfaccia con tag VLAN RADIUS" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" -msgstr "" +msgstr "Modalità NAT-T RFC3947" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "Pre-autenticazione RSN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" -msgstr "" +msgstr "Soglia RSSI per l'adesione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Soglia RTS/CTS" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:84 msgid "RX" -msgstr "" +msgstr "RX" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:236 msgid "RX Rate" msgstr "Velocità RX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" +msgstr "Velocità RX / Velocità TX" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." msgstr "" +"Misurazione delle risorse radio: invia beacon per assistere il roaming. Non " +"tutti i client lo supportano." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" -msgstr "" +msgstr "Mappatura casuale della porta di origine" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" +"Byte grezzi codificati in esadecimale. Lascia vuoto a meno che il tuo ISP " +"non lo richieda" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Leggi /etc/ethers per configurare il server DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Cambiare veramente il protocollo?" #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:118 msgid "Realtime Graphs" -msgstr "Grafici in Tempo Reale" +msgstr "Grafici in tempo reale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" -msgstr "" +msgstr "Scadenza riassociazione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Protezione rebind" @@ -6521,82 +7557,135 @@ msgstr "Riavvia il sistema operativo del tuo dispositivo" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:26 msgid "Receive" -msgstr "Ricezione" +msgstr "Ricevi" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "Ricevi scartati (drop)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "Ricevi errori" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Dati ricevuti" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "Byte ricevuti" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "Multicast ricevuti" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "Pacchetti ricevuti" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." -msgstr "" +msgstr "Consigliato. Indirizzi IP dell'interfaccia WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Scadenza riconnessione" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" -msgstr "Ricollega questa interfaccia" +msgstr "Riconnetti questa interfaccia" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:14 msgid "Redirect to HTTPS" -msgstr "" +msgstr "Reindirizza a HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" -msgstr "" +msgstr "Reindirizza alla porta locale %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" -msgstr "" +msgstr "Reindirizza al sistema locale" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:57 msgid "References" msgstr "Riferimenti" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Aggiorna canali" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" -msgstr "Auto-aggiornamento" +msgstr "Aggiornamento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "Stato di registrazione" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" -msgstr "" +msgstr "Rifiuta pacchetto IPv4 con tipo ICMP %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" -msgstr "" +msgstr "Rifiuta pacchetto con tipo ICMP %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" -msgstr "" +msgstr "Rifiuta pacchetto con tipo ICMPv6 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" -msgstr "" +msgstr "Rifiuta pacchetto con TCP reset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" +"Rifiuta le decisioni di instradamento con una lunghezza del prefisso " +"inferiore o uguale al valore specificato" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" -msgstr "" +msgstr "Relay" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:157 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:36 msgid "Relay Bridge" +msgstr "Bridge del relay" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." msgstr "" +"Inoltra le richieste DHCP altrove. OK: v4↔v4, v6↔v6. Non OK: v4↔v6, v6↔v4." #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" -msgstr "" +msgstr "Relay tra reti" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:12 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:64 msgid "Relay bridge" -msgstr "" +msgstr "Bridge del relay" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "Relay da" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "Relay a indirizzo" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 @@ -6607,6 +7696,7 @@ msgstr "Indirizzo IPv4 remoto" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Indirizzo IPv4 remoto o FQDN" @@ -6619,142 +7709,162 @@ msgstr "Indirizzo IPv6 remoto" msgid "Remote IPv6 address or FQDN" msgstr "Indirizzo IPv6 remoto o FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Rimuovi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" +"Rimuovi gli indirizzi IPv4 dai risultati e restituisci solo indirizzi IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" +"Rimuovi gli indirizzi IPv6 dai risultati e restituisci solo indirizzi IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" -msgstr "Rimuovere dalla configurazione le impostazioni relative al dispositivo" +msgstr "Rimuovi dalla configurazione le impostazioni relative al dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Sostituisci configurazione wireless" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:17 msgid "Request IPv6-address" -msgstr "Richiede indirizzo-IPv6" +msgstr "Richiedi indirizzo-IPv6" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:23 msgid "Request IPv6-prefix of length" -msgstr "Richiede prefisso-IPv6 di lunghezza" +msgstr "Richiedi prefisso-IPv6 di lunghezza" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:408 msgid "Request timeout" -msgstr "Timeout della richiesta" +msgstr "Scadenza della richiesta" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:100 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:105 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:107 msgid "Require incoming checksum (optional)." -msgstr "" +msgstr "Richiedi checksum in entrata (facoltativo)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:107 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:104 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:109 msgid "Require incoming packets serialization (optional)." -msgstr "" +msgstr "Richiedi la serializzazione dei pacchetti in entrata (facoltativo)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Necessario" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" -msgstr "Necessario per alcuni ISP, ad esempio Charter con DOCSIS 3" +msgstr "Necessario per alcuni ISP, ad es. Charter con DOCSIS 3" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 msgid "Required. Base64-encoded private key for this interface." -msgstr "" +msgstr "Necessario. Chiave privata con codifica Base64 per questa interfaccia." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Required. Path to the .yml config file for this interface." msgstr "" +"Necessario. Percorso del file di configurazione .yml per questa interfaccia." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." -msgstr "" +msgstr "Necessario. Chiave pubblica del peer WireGuard." #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:42 msgid "Required. Underlying interface." -msgstr "" +msgstr "Necessario. Interfaccia sottostante." #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:39 msgid "Required. XFRM interface ID to be used for SA." +msgstr "Necessario. ID interfaccia XFRM da usare per SA." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." msgstr "" +"Necessario: rifiuta l'autenticazione se il server RADIUS non fornisce gli " +"attributi VLAN appropriati." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Richiede hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Richiede hostapd con supporto EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Richiede hostapd con supporto EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Richiede hostapd con supporto OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Richiede hostapd con supporto SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Richiede hostapd con supporto WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Richiede wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Richiede wpa-supplicant con supporto EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Richiede wpa-supplicant con supporto EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Richiede wpa-supplicant con supporto OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Richiede wpa-supplicant con supporto SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Richiede wpa-supplicant con supporto WEP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:226 msgid "Reselection policy for primary slave" -msgstr "" +msgstr "Criterio di ri-selezione per lo slave principale" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6769,20 +7879,24 @@ msgstr "Azzera Contatori" msgid "Reset to defaults" msgstr "Azzera a default" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "File resolv e hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "File resolv" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Elenco di domini da forzare a un indirizzo IP." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Risorsa non trovata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Riavvia" @@ -6791,7 +7905,7 @@ msgstr "Riavvia" msgid "Restart Firewall" msgstr "Riavvia Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Riavviare l'interfaccia radio" @@ -6803,7 +7917,7 @@ msgstr "Ripristina" msgid "Restore backup" msgstr "Ripristina backup" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -6811,107 +7925,127 @@ msgstr "" "Restituisce le risposte alle risoluzione DNS corrispondenti alla sottorete " "da cui è stata ricevuta nel caso siano disponibili più IP." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Rivela/nascondi password" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" -msgstr "" +msgstr "Filtro percorso inverso" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Ripristina" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Annulla modifiche" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" -msgstr "" +msgstr "Richiesta di annullamento fallita con stato %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Ripristino della configurazione…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "Revisione" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" -msgstr "" +msgstr "Riscrivi la destinazione in %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" -msgstr "" +msgstr "Riscrivi la destinazione in %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" +"Riscrivi la destinazione in %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" +"Riscrivi la destinazione in %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" -msgstr "" +msgstr "Riscrivi l'origine in %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" -msgstr "" +msgstr "Riscrivi l'origine in %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" -msgstr "" +msgstr "Riscrivi l'origine in %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" -msgstr "" +msgstr "Riscrivi l'origine in %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" +msgstr "Riscrivi all'indirizzo del dispositivo in uscita" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." msgstr "" +"Sicurezza di rete robusta (RSN): consenti la preautenticazione in roaming " +"per le reti WPA2-EAP (e annunciala in beacon WLAN). Funziona solo se " +"l'interfaccia di rete specificata è un bridge. Accorcia il processo di " +"riassociazione, critico in termini di tempo." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" -msgstr "" +msgstr "Robustezza" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " "TFTP server root." msgstr "" +"Cartella di root per i file serviti via TFTP. Attiva server TFTP e " +"Root server TFTP attivano il server TFTP e servono i file da " +"Root server TFTP." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:298 msgid "Root preparation" -msgstr "" +msgstr "Preparazione della root" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:204 msgid "Round-Robin policy (balance-rr, 0)" -msgstr "" +msgstr "Criterio round-robin (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" -msgstr "" +msgstr "Rotta di IP autorizzati" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" -msgstr "" +msgstr "Catena d'azione del percorso \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" -msgstr "" +msgstr "Tipo di instradamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6923,14 +8057,18 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:26 msgid "Router Password" -msgstr "" +msgstr "Password del router" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:50 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:248 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:15 msgid "Routing" -msgstr "" +msgstr "Instradamento" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Algoritmo di instradamento" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" @@ -6944,28 +8082,28 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:198 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:224 msgid "Rule" -msgstr "" +msgstr "Regola" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" -msgstr "" +msgstr "Azioni della regola" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" -msgstr "" +msgstr "Commento della regola: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" -msgstr "" +msgstr "Catena contenitore \"%h\" della regola" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" -msgstr "" +msgstr "Corrispondenze della regola" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" -msgstr "" +msgstr "Tipo di regola" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:336 msgid "Run a filesystem check before mounting the device" @@ -6977,17 +8115,30 @@ msgstr "Esegui controllo del filesystem" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2360 msgid "Runtime error" -msgstr "" +msgstr "Errore di esecuzione" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:224 msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "SIM" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7005,15 +8156,15 @@ msgstr "Porta del server SSH" msgid "SSH username" msgstr "Nome utente SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "Chiavi SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7028,9 +8179,9 @@ msgstr "Server SSTP" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 msgid "SWAP" -msgstr "" +msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7041,14 +8192,14 @@ msgid "Save" msgstr "Salva" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Salva & Applica" #: modules/luci-base/htdocs/luci-static/resources/form.js:607 msgid "Save error" -msgstr "" +msgstr "Salva errore" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:434 msgid "Save mtdblock" @@ -7058,20 +8209,25 @@ msgstr "Salva mtdblock" msgid "Save mtdblock contents" msgstr "Salva contenuto mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" -msgstr "" +msgstr "Scansiona" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:28 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:90 msgid "Scheduled Tasks" msgstr "Operazioni programmate" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "La sezione %s è vuota." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Sezione aggiunta" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Sezione rimossa" @@ -7089,17 +8245,19 @@ msgstr "" "controllo del formato fallisce. Usare solo se sicuri che il firmware sia " "corretto e pensato per il tuo dispositivo!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Seleziona file…" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:320 msgid "Selects the transmit hash policy to use for slave selection" msgstr "" +"Seleziona il criterio di trasmissione hash da usare per la selezione dello " +"slave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7107,9 +8265,9 @@ msgstr "" "Invia messaggi RA che annunciano questo dispositivo come router IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" -msgstr "Inviare reindirizzamenti ICMP" +msgstr "Invia reindirizzamenti ICMP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:143 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 @@ -7121,18 +8279,24 @@ msgid "" "Send LCP echo requests at the given interval in seconds, only effective in " "conjunction with failure threshold" msgstr "" +"Invia richieste di echo LCP a un determinato intervallo in secondi, efficace " +"solo in combinazione con la soglia di errore" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:24 msgid "Send the hostname of this device" -msgstr "Inviare il nome host di questo dispositivo" +msgstr "Invia il nome host di questo dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Server" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" -msgstr "" +msgstr "Indirizzo del server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" -msgstr "" +msgstr "Nome del server" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 msgid "Service Name" @@ -7140,7 +8304,7 @@ msgstr "Nome del servizio" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:88 msgid "Service Type" -msgstr "" +msgstr "Tipo di servizio" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:36 msgid "Services" @@ -7153,113 +8317,134 @@ msgstr "Sessione scaduta" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:126 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:175 msgid "Set Static" -msgstr "" +msgstr "Imposta statico" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "Imposta un alias per un nome host." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" -msgstr "" +msgstr "Imposta il campo di intestazione %s su %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" +"Imposta l'interfaccia come slave esterno NDP-Proxy. L'impostazione " +"predefinita è disattivata." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." msgstr "" +"Imposta le proprietà dell'interfaccia indipendentemente dal vettore di " +"collegamento (se impostato, gli eventi di rilevamento del vettore non " +"richiamano i gestori hotplug)." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:302 msgid "Set same MAC Address to all slaves" -msgstr "" +msgstr "Imposta lo stesso indirizzo MAC per tutti gli slave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -"Impostare il flag di configurazione autonoma dell'indirizzo nelle \"Prefix " +"Imposta il flag di configurazione autonoma dell'indirizzo nelle \"Prefix " "Information Option (PIO)\" dei messaggi RA inviati. Se abilitato, i client eseguiranno " +"Advertisement\">RA inviati. Se attivo, i client eseguiranno " "l'autoconfigurazione dell'indirizzo IPv6 senza stato (stateless)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." msgstr "" +"Imposta questa interfaccia come master per l'inoltro RA e DHCPv6 e per il " +"proxy NDP." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:306 msgid "Set to currently active slave (active, 1)" -msgstr "" +msgstr "Imposta sullo slave attualmente attivo (attivo, 1)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:307 msgid "Set to first slave added to the bond (follow, 2)" -msgstr "" +msgstr "Imposta sul primo slave aggiunto al legame (segui, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Configura server DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Imposta gli instradamenti per i vicini IPv6 con proxy." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 msgid "Setting PLMN failed" -msgstr "" +msgstr "Impostazione PLMN fallita" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" -msgstr "" +msgstr "Impostazione della modalità operativa fallita" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "Impostazione della tecnologia di rete consentita." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "Impostazione della tecnologia di rete preferita." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Impostazioni" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "Secondi con errori gravi (SES)" +"Impostazioni per assistere i client wireless nel roaming tra più AP: " +"802.11r, 802.11k e 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" -msgstr "Short GI" +msgstr "GI breve" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Preambolo breve" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Mostra l'elenco dei file sottoposti a backup" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 msgid "Show empty chains" -msgstr "" +msgstr "Mostra catene vuote" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:338 msgid "Show raw counters" msgstr "Mostra contatori grezzi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Spegni questa interfaccia" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7267,15 +8452,15 @@ msgstr "Spegni questa interfaccia" msgid "Signal" msgstr "Segnale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Segnale / Rumore" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Attenuazione del segnale (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Qualità del segnale" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Frequenza di aggiornamento del segnale" @@ -7283,14 +8468,14 @@ msgstr "Frequenza di aggiornamento del segnale" msgid "Signal:" msgstr "Segnale:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Dimensione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" -msgstr "Dimensione della cache delle query DNS" +msgstr "Dimensione della cache delle richieste DNS" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:208 msgid "Size of the ZRam device in megabytes" @@ -7305,19 +8490,19 @@ msgstr "Salta" msgid "Skip from backup files that are equal to those in /rom" msgstr "Escludi dal backup i file uguali a quelli in /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" -msgstr "Salta a contenuto" +msgstr "Vai al contenuto" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" -msgstr "Salta a navigazione" +msgstr "Vai alla navigazione" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:180 msgid "Slave Interfaces" -msgstr "" +msgstr "Interfacce slave" #: modules/luci-base/htdocs/luci-static/resources/network.js:3002 #: modules/luci-compat/luasrc/model/network.lua:1428 @@ -7328,13 +8513,9 @@ msgstr "VLAN software" msgid "Some fields are invalid, cannot save values!" msgstr "Alcuni campi non sono validi, non è possibile salvare i valori!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." -msgstr "Siamo spiacenti, l'oggetto che hai richiesto non è stato trovato." - -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Spiacente, il server ha rilevato un errore imprevisto." +msgstr "Spiacenti, l'oggetto che hai richiesto non è stato trovato." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" @@ -7343,12 +8524,11 @@ msgid "" "instructions." msgstr "" "Spiacenti, non è presente alcun supporto sysupgrade, una nuova immagine " -"firmware deve essere memorizzata (Flash) manualmente. Si prega di fare " -"riferimento al wiki per le istruzioni di installazione di dispositivi " -"specifici." +"firmware deve essere installata (flash) manualmente. Consulta il wiki per " +"istruzioni di installazione specifiche del dispositivo." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7358,30 +8538,32 @@ msgstr "Origine" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:43 msgctxt "nft ip saddr" msgid "Source IP" -msgstr "" +msgstr "IP di origine" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:47 msgctxt "nft ip6 saddr" msgid "Source IPv6" -msgstr "" +msgstr "IPv6 di origine" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 msgid "Source interface" -msgstr "Interfaccia sorgente" +msgstr "Interfaccia di origine" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:45 msgctxt "nft ip sport" msgid "Source port" -msgstr "" +msgstr "Porta di origine" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" +"Opzioni di avvio PXE " +"speciali per Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7390,7 +8572,7 @@ msgstr "" "DHCPv6. Se non specificato, verrà annunciato il dominio di ricerca DNS del " "dispositivo locale." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7399,50 +8581,58 @@ msgstr "" "Specifica un elenco statico di indirizzi server DNS IPv6 da annunciare " "tramite DHCPv6. Se non specificato, il dispositivo locale si annuncerà come " "server DNS IPv6 a meno che l'opzione Server DNS IPv6 locale sia " -"disabilitata." +"disattivata." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " "corresponding range" msgstr "" +"Specifica un singolo UID o un intervallo di UID da corrispondere, ad es. " +"1000 per corrispondere al relativo UID o 1000-1005 per corrispondere in modo " +"inclusivo tutti gli UID all'interno del relativo intervallo" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:343 msgid "" "Specifies that duplicate frames (received on inactive ports) should be " "dropped or delivered" msgstr "" +"Specifica che i frame duplicati (ricevuti su porte inattive) devono essere " +"eliminati o consegnati" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:359 msgid "Specifies the ARP link monitoring frequency in milliseconds" msgstr "" +"Specifica la frequenza di monitoraggio del collegamento ARP in millisecondi" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:367 msgid "Specifies the IP addresses to use for ARP monitoring" -msgstr "" +msgstr "Specifica gli indirizzi IP da usare per il monitoraggio ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:396 msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" +"Specifica la frequenza di monitoraggio del collegamento MII in millisecondi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" -msgstr "" +msgstr "Specifica il valore TOS da confrontare nelle intestazioni IP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:261 msgid "Specifies the aggregation selection logic to use" -msgstr "" +msgstr "Specifica la logica di selezione dell'aggregazione da usare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" +"Specifica la sottorete di destinazione a cui corrispondere (notazione CIDR)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 msgid "Specifies the directory the device is attached to" -msgstr "Specifica la cartella a cui è collegato il dispositivo in" +msgstr "Specifica la cartella a cui è collegato il dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7452,27 +8642,35 @@ msgstr "" "Advertisement\">RA, ad esempio per indicare ai client di richiedere " "ulteriori informazioni tramite DHCPv6 con stato (stateful)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" +"Specifica il fwmark e facoltativamente la sua maschera da corrispondere, ad " +"es. 0xFF per corrispondere il segno 255 o 0x0/0x1 per qualsiasi valore di " +"segno pari" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" -msgstr "" +msgstr "Specifica il nome dell'interfaccia logica in entrata" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 msgid "" "Specifies the logical interface name of the parent (or master) interface " "this route belongs to" msgstr "" +"Specifica il nome dell'interfaccia logica dell'interfaccia padre (o master) " +"a cui appartiene questo instradamento" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:254 msgid "" "Specifies the mac-address for the actor in protocol packet exchanges " "(LACPDUs). If empty, masters' mac address defaults to system default" msgstr "" +"Specifica l'indirizzo MAC per l'attore negli scambi di pacchetti di " +"protocollo (LACPDU). Se vuoto, l'indirizzo MAC del master viene impostato " +"come predefinito di sistema" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 msgid "" @@ -7480,7 +8678,7 @@ msgid "" "to be dead" msgstr "" "Consente di specificare la quantità massima di richieste ARP fallite prima " -"di presumere che l'host sia morto" +"di presumere che l'host sia inattivo" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 msgid "" @@ -7488,9 +8686,9 @@ msgid "" "dead" msgstr "" "Specifica la numero massimo di secondi dopo i quali si presume che gli host " -"non siano raggiungibili" +"siano inattivi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7506,112 +8704,137 @@ msgid "" "Specifies the minimum number of links that must be active before asserting " "carrier" msgstr "" +"Specifica il numero minimo di collegamenti che devono essere attivi prima di " +"asserire il vettore" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:202 msgid "Specifies the mode to be used for this bonding interface" -msgstr "" +msgstr "Specifica la modalità da usare per questa interfaccia bonding" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " "0.0.0.0 no gateway will be specified for the route" msgstr "" +"Specifica il gateway di rete. Se omesso, viene preso il gateway " +"dell'interfaccia padre, se presente, altrimenti crea un instradamento di " +"ambito di collegamento. Se impostato a 0.0.0.0 non verrà specificato alcun " +"gateway per l'instradamento" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:334 msgid "" "Specifies the number of IGMP membership reports to be issued after a " "failover event in 200ms intervals" msgstr "" +"Specifica il numero di resoconti di appartenenza IGMP da emettere dopo un " +"evento di failover in intervalli di 200 ms" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:278 msgid "" "Specifies the number of packets to transmit through a slave before moving to " "the next one" msgstr "" +"Specifica il numero di pacchetti da trasmettere attraverso uno slave prima " +"di passare a quello successivo" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:312 msgid "" "Specifies the number of peer notifications (gratuitous ARPs and unsolicited " "IPv6 Neighbor Advertisements) to be issued after a failover event" msgstr "" +"Specifica il numero di notifiche peer (ARP gratuiti e annunci IPv6 vicini " +"non richiesti) da emettere dopo un evento di failover" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:286 msgid "" "Specifies the number of seconds between instances where the bonding driver " "sends learning packets to each slaves peer switch" msgstr "" +"Specifica il numero di secondi tra le istanze in cui il driver di bonding " +"invia pacchetti di apprendimento a ogni switch peer slave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" -msgstr "" +msgstr "Specifica l'ordine delle regole IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" -msgstr "" +msgstr "Specifica il nome dell'interfaccia logica in uscita" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" msgstr "" +"Specifica l'indirizzo di origine preferito durante l'invio a punti finali " +"coperti dalla destinazione" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:375 msgid "Specifies the quantity of ARP IP targets that must be reachable" msgstr "" +"Specifica la quantità di destinazioni IP ARP che devono essere raggiungibili" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:270 msgid "" "Specifies the rate in which the link partner will be asked to transmit " "LACPDU packets" msgstr "" +"Specifica la frequenza con cui al partner di collegamento verrà chiesto di " +"trasmettere i pacchetti LACPDU" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:227 msgid "" "Specifies the reselection policy for the primary slave when failure of the " "active slave or recovery of the primary slave occurs" msgstr "" +"Specifica il criterio di riselezione per lo slave primario quando si " +"verifica un errore dello slave attivo o il ripristino dello slave primario" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" -msgstr "" +msgstr "Specifica la metrica di instradamento da usare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" -msgstr "" +msgstr "Specifica il tipo di instradamento da creare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" -msgstr "" +msgstr "Specifica l'azione di instradamento della destinazione della regola" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" -msgstr "" +msgstr "Specifica la sottorete di origine a cui corrispondere (notazione CIDR)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:246 msgid "Specifies the system priority" -msgstr "" +msgstr "Specifica la priorità del sistema" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:404 msgid "" "Specifies the time in milliseconds to wait before disabling a slave after a " "link failure detection" msgstr "" +"Specifica il tempo di attesa in millisecondi prima di disattivare uno slave " +"dopo il rilevamento di un errore di collegamento" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:412 msgid "" "Specifies the time in milliseconds to wait before enabling a slave after a " "link recovery detection" msgstr "" +"Specifica il tempo di attesa in millisecondi prima di attivare uno slave " +"dopo il rilevamento del ripristino del collegamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " "wireless settings." msgstr "" "Indica le porte cablate da collegare a questo bridge. Per collegare reti " -"wireless, scegliere l'interfaccia associata come rete nelle impostazioni " +"wireless, scegli l'interfaccia associata come rete nelle impostazioni " "wireless." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:383 @@ -7619,40 +8842,50 @@ msgid "" "Specifies whether ARP probes and replies should be validated or non-ARP " "traffic should be filtered for link monitoring" msgstr "" +"Specifica se le sonde e le risposte ARP devono essere convalidate o se il " +"traffico non ARP deve essere filtrato per il monitoraggio dei collegamenti" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:303 msgid "" "Specifies whether active-backup mode should set all slaves to the same MAC " "address at enslavement" msgstr "" +"Specifica se la modalità di backup attivo deve impostare tutti gli slave " +"sullo stesso indirizzo MAC al momento dell'asservimento" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:420 msgid "" "Specifies whether or not miimon should use MII or ETHTOOL ioctls vs. " "netif_carrier_ok()" msgstr "" +"Specifica se miimon deve usare o meno gli ioctl MII o ETHTOOL invece di " +"netif_carrier_ok()" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:295 msgid "" "Specifies whether to shuffle active flows across slaves based on the load" -msgstr "" +msgstr "Specifica se mescolare i flussi attivi tra gli slave in base al carico" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:181 msgid "" "Specifies which slave interfaces should be attached to this bonding interface" msgstr "" +"Specifica quali interfacce slave devono essere collegate a questa " +"interfaccia bonding" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:214 msgid "" "Specifies which slave is the primary device. It will always be the active " "slave while it is available" msgstr "" +"Specifica quale slave è il dispositivo principale. Sarà sempre lo slave " +"attivo mentre è disponibile" #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:62 msgid "Specify a TOS (Type of Service)." -msgstr "" +msgstr "Specifica un TOS (Tipo di servizio)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:74 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:79 @@ -7662,6 +8895,9 @@ msgid "" "header inherits the value of the inner header) or an hexadecimal value " "00..FF (optional)." msgstr "" +"Specifica un TOS (Tipo di servizio). Può essere eredita " +"(l'intestazione esterna eredita il valore dell'intestazione interna) o un " +"valore esadecimale 00..FF (opzionale)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:74 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:74 @@ -7670,6 +8906,8 @@ msgid "" "Specify a TTL (Time to Live) for the encapsulating packet other than the " "default (64) (optional)." msgstr "" +"Specifica un TTL (Time to Live) per il pacchetto di incapsulamento diverso " +"da quello predefinito (64) (facoltativo)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 @@ -7679,6 +8917,8 @@ msgid "" "Specify a TTL (Time to Live) for the encapsulating packet other than the " "default (64)." msgstr "" +"Specifica un TTL (Time to Live) per il pacchetto di incapsulamento diverso " +"da quello predefinito (64)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84 msgid "" @@ -7686,6 +8926,9 @@ msgid "" "inherits the value of the inner header) or an hexadecimal value 00.." "FF (optional)." msgstr "" +"Specifica una classe di traffico. Può essere eredita " +"(l'intestazione esterna eredita il valore dell'intestazione interna) o un " +"valore esadecimale 00..FF (facoltativo)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 @@ -7695,22 +8938,34 @@ msgid "" "Specify an MTU (Maximum Transmission Unit) other than the default (1280 " "bytes) (optional)." msgstr "" +"Specifica un MTU (Unità massima di trasmissione) diverso da quello " +"predefinito (1280 byte) (facoltativo)." #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 msgid "" "Specify an MTU (Maximum Transmission Unit) other than the default (1280 " "bytes)." msgstr "" +"Specifica un MTU (Unità massima di trasmissione) diverso da quello " +"predefinito (1280 byte)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." -msgstr "Specificare la chiave di cifratura qui." +msgstr "Specifica la chiave di crittografia segreta qui." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "Velocità: %d Mibit/s, Duplex: %" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "ADSL senza splitter (G.992.2) Allegato A" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" -msgstr "" +msgstr "Scadenza della cache dei vicini obsoleti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Avvia" @@ -7723,16 +8978,16 @@ msgstr "Avvia WPS" msgid "Start priority" msgstr "Priorità di avvio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Avvia aggiornamento" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Inizializzazione configurazione…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Avvio scansione wireless..." @@ -7741,98 +8996,102 @@ msgstr "Avvio scansione wireless..." msgid "Startup" msgstr "Avvio" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Stato" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" -msgstr "Instradamento statico IPv4" +msgstr "Instradamenti IPv4 statici" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv6 Routes" -msgstr "Instradamento statico IPv6" +msgstr "Instradamenti IPv6 statici" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:91 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:138 msgid "Static Lease" -msgstr "Contratto Statico" +msgstr "Lease statico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" -msgstr "Contratti Statici" +msgstr "Lease statici" #: modules/luci-base/htdocs/luci-static/resources/network.js:2090 #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:172 #: modules/luci-compat/luasrc/model/network.lua:967 msgid "Static address" -msgstr "Indirizzo Statico" +msgstr "Indirizzo statico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -"I contratti statici vengono utilizzati per assegnare indirizzi IP fissi e " -"nomi host simbolici ai client DHCP. Essi sono necessari anche per interfacce " -"di configurazione non dinamici, dove solo gli host col contratto " -"corrispondente vengono serviti." +"I lease statici vengono usati per assegnare indirizzi IP fissi e nomi host " +"simbolici ai client DHCP. Sono necessari anche per configurazioni di " +"interfacce non dinamiche, dove solo gli host con il lease corrispondente " +"vengono serviti." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Limite di inattività dei client" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Stato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" -msgstr "Arresta" +msgstr "Ferma" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:135 msgid "Stop WPS" msgstr "Interrompi WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Interrompi aggiornamento" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:24 msgid "Storage" -msgstr "" +msgstr "Archiviazione" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" -msgstr "" +msgstr "Filtraggio rigoroso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" -msgstr "Ordine stretto" +msgstr "Ordine rigoroso" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 msgid "Strong" msgstr "Forte" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Invia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" -msgstr "Interrompere logging" +msgstr "Interrompi logging" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" "Interrompere il logging delle operazioni di routine per il protocollo DHCP." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:46 msgid "Swap free" -msgstr "" +msgstr "Swap libero" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:3 @@ -7841,23 +9100,25 @@ msgstr "Switch" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:172 msgid "Switch %q" -msgstr "" +msgstr "Switch %q" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:150 msgid "" "Switch %q has an unknown topology - the VLAN settings might not be accurate." msgstr "" +"Lo switch %q ha una topologia sconosciuta: le impostazioni VLAN potrebbero " +"non essere accurate." #: modules/luci-base/htdocs/luci-static/resources/network.js:3002 #: modules/luci-compat/luasrc/model/network.lua:1426 msgid "Switch VLAN" -msgstr "" +msgstr "VLAN switch" #: modules/luci-base/htdocs/luci-static/resources/network.js:2999 msgid "Switch port" -msgstr "" +msgstr "Porta switch" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Cambia protocollo" @@ -7865,11 +9126,11 @@ msgstr "Cambia protocollo" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:104 #: modules/luci-compat/luasrc/view/cbi/ipaddr.htm:26 msgid "Switch to CIDR list notation" -msgstr "" +msgstr "Passa alla notazione dell'elenco CIDR" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" -msgstr "" +msgstr "Collegamento simbolico" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:89 msgid "Sync with NTP-Server" @@ -7879,18 +9140,26 @@ msgstr "Sincronizza con il server NTP" msgid "Sync with browser" msgstr "Sincronizza con il browser" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Sintassi: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Sintassi: _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" -msgstr "SIstema" +msgstr "Sistema" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:25 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:63 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:75 msgid "System Log" -msgstr "Registro di Sistema" +msgstr "Registro di sistema" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:245 msgid "System Priority" @@ -7898,15 +9167,15 @@ msgstr "Priorità di sistema" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:118 msgid "System Properties" -msgstr "Proprietà di Sistema" +msgstr "Proprietà di sistema" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:162 msgid "System log buffer size" msgstr "Dimensione buffer log di sistema" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "Sistema in esecuzione in modalità di ripristino (initramfs)." @@ -7914,30 +9183,30 @@ msgstr "Sistema in esecuzione in modalità di ripristino (initramfs)." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:67 msgctxt "nft tcp option maxseg size" msgid "TCP MSS" -msgstr "" +msgstr "MSS TCP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:54 msgctxt "nft tcp dport" msgid "TCP destination port" -msgstr "" +msgstr "Porta di destinazione TCP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:57 msgctxt "nft tcp flags" msgid "TCP flags" -msgstr "" +msgstr "Flag TCP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:53 msgctxt "nft tcp sport" msgid "TCP source port" -msgstr "" +msgstr "Porta di origine TCP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:338 msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" -msgstr "Server TFTP principale" +msgstr "Root del server TFTP" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:50 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:85 @@ -7948,28 +9217,39 @@ msgstr "TX" msgid "TX Rate" msgstr "Velocità TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "Lunghezza coda TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tabella" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "Etichetta" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Etichettata" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Destinazione" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" -msgstr "Target/Piattaforma" +msgstr "Piattaforma di destinazione" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:103 msgid "Target network" @@ -7977,13 +9257,13 @@ msgstr "Rete di destinazione" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:36 msgid "Temp space" -msgstr "" +msgstr "Spazio temporaneo" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:50 msgid "Terminate" -msgstr "Chiudi" +msgstr "Termina" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -7993,7 +9273,7 @@ msgstr "" "messaggi RA. Il " "minimo è 1280 byte." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." @@ -8001,7 +9281,7 @@ msgstr "" "Il flag Configurazione indirizzo gestito (M) indica che gli " "indirizzi IPv6 sono disponibili tramite DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -8009,23 +9289,31 @@ msgstr "" "Il flag Mobile IPv6 Home Agent (H) indica che il dispositivo agisce " "anche come agente domestico IPv6 mobile su questo collegamento." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." msgstr "" +"Il flag Altra configurazione (O) indica che altre informazioni, " +"come i server DNS, sono disponibili tramite DHCPv6." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:84 msgid "The block mount command failed with code %d" -msgstr "" +msgstr "Il comando block mount è fallito con codice %d" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:80 msgid "" "The qrencode package is required for generating an QR code image of " "the configuration." msgstr "" +"Il pacchetto qrencode è necessario per generare un'immagine del " +"codice QR della configurazione." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "Il DHCPv6-DUID (identificatore univoco DHCP) di questo host." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8038,86 +9326,117 @@ msgid "" "The HE.net endpoint update configuration changed, you must now use the plain " "username instead of the user ID!" msgstr "" +"La configurazione dell'aggiornamento dell'endpoint HE.net è cambiata, ora " +"devi usare il nome utente invece dell'ID utente!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" -msgstr "" +msgstr "L'indirizzo IP %h è già usato da un altro lease statico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" "L'indirizzo IP è al di fuori di qualsiasi intervallo di indirizzi del pool " "DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" +msgstr "L'indirizzo IP del server di avvio" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." msgstr "" +"L'indirizzo IP da usare per questo host, o ignora per ignorare " +"qualsiasi richiesta DHCP da questo host." #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" +"L'indirizzo IPv4 o il nome di dominio completo del punto finale remoto." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +"L'indirizzo IPv4 o il nome di dominio completo del tunnel finale remoto." #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 msgid "The IPv6 address or the fully-qualified domain name of the remote end." msgstr "" +"L'indirizzo IPv6 o il nome di dominio completo del punto finale remoto." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +"L'indirizzo IPv6 o il nome di dominio completo del tunnel finale remoto." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" +"L'identificatore di interfaccia IPv6 (suffisso indirizzo) come numero " +"esadecimale (max 8 caratteri)." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" "The IPv6 prefix assigned to the provider, usually ends with ::" msgstr "" -"Il prefisso IPv6 assegnati dal provider, si conclude di solito con ::::" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:7 msgid "The LED blinks with the configured on/off frequency" -msgstr "" +msgstr "Il LED lampeggia con la frequenza di on/off configurata" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." -msgstr "" +msgstr "Il LED lampeggia per simulare il battito cardiaco del dispositivo." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:8 msgid "" "The LED flashes with link status and activity on the configured interface." msgstr "" +"Il LED lampeggia con lo stato e l'attività del collegamento sull'interfaccia " +"configurata." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:7 msgid "The LED is always in default state off." -msgstr "" +msgstr "Il LED è sempre spento in modo predefinito." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:6 msgid "The LED is always in default state on." -msgstr "" +msgstr "Il LED è sempre acceso in modo predefinito." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" +"L'indirizzo MAC %h è già usato da un altro lease statico nello stesso pool " +"DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" -msgstr "" +msgstr "L'MTU non deve superare l'MTU del dispositivo padre di %d byte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "L'ID VLAN deve essere univoco" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "L'algoritmo usato per scoprire gli instradamenti mesh" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8130,7 +9449,7 @@ msgid "The configuration file could not be loaded due to the following error:" msgstr "" "Impossibile caricare il file di configurazione a causa del seguente errore:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8138,7 +9457,7 @@ msgstr "" "L'SSID corretto deve essere specificato manualmente quando si accede a una " "rete wireless nascosta" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8149,13 +9468,13 @@ msgid "" "state." msgstr "" "Impossibile raggiungere il dispositivo entro %d secondi dall'applicazione " -"delle modifiche in sospeso, il che ha causato il rollback della " -"configurazione per motivi di sicurezza. Se si ritiene che le modifiche alla " -"configurazione siano comunque corrette, selezionare applica configurazione " -"senza controllo. In alternativa, è possibile ignorare questo avviso e " -"rivedere le modifiche prima di tentare di applicare di nuovo oppure " -"annullare tutte le modifiche in sospeso per mantenere lo stato di " -"configurazione attualmente funzionante." +"delle modifiche in sospeso, il che ha causato il ripristino della " +"configurazione per motivi di sicurezza. Se ritieni che le modifiche alla " +"configurazione siano comunque corrette, applica la configurazione senza " +"controllo. In alternativa, puoi ignorare questo avviso e rivedere le " +"modifiche prima di tentare di applicarle di nuovo oppure annulla tutte le " +"modifiche in sospeso per mantenere lo stato di configurazione attualmente " +"funzionante." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:281 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:393 @@ -8164,14 +9483,14 @@ msgid "" " /dev/sda1)" msgstr "" "Il file del dispositivo di memoria o della partizione (e.s. /dev/sda1)" +"esempio\">es. /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" -msgstr "Il nome dispositivo \"%s\" è già stato preso" +msgstr "Il nome del dispositivo \"%s\" è già in uso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." @@ -8179,7 +9498,7 @@ msgstr "" "L'attuale configurazione di rete deve essere modificata affinché LuCI " "funzioni correttamente." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8195,50 +9514,75 @@ msgid "" msgstr "" "L'immagine flash è stata caricata. Di seguito sono elencati il checksum e la " "dimensione del file, confrontali con il file originale per garantire " -"l'integrità dei dati.
    Fare clic su 'Continua' per avviare la " -"procedura di flash." +"l'integrità dei dati.
    Clicca 'Continua' per avviare la procedura di " +"flash." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:249 msgid "The following rules are currently active on this system." msgstr "Le seguenti regole sono al momento attive su questo sistema." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" +"La frequenza è direttamente proporzionale al carico medio della CPU di 1 " +"minuto." #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:154 msgid "The gateway address must not be a local IP address" -msgstr "" +msgstr "L'indirizzo del gateway non deve essere un indirizzo IP locale" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" +"La configurazione generata può essere importata in un'applicazione client " +"WireGuard per impostare una connessione verso questo dispositivo." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "La chiave pubblica SSH fornita è già stata aggiunta." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -"La chiave pubblica SSH fornita non è valida. Fornire chiavi pubbliche RSA o " +"La chiave pubblica SSH fornita non è valida. Fornisci chiavi pubbliche RSA o " "ECDSA appropriate." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 -msgid "The hostname of the boot server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "Indirizzo/i hardware di questa voce/host, separati da spazi." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" msgstr "" +"L'impostazione della penalità di hop consente di modificare la preferenza di " +"batman-adv per i percorsi multihop rispetto ai percorsi brevi. Il valore " +"viene applicato al TQ di ciascun OGM inoltrato, propagando così il costo di " +"un hop extra (il pacchetto deve essere ricevuto e ritrasmesso, il che costa " +"tempo di trasmissione)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 +msgid "The hostname of the boot server" +msgstr "Il nome host del server di avvio" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "L'interfaccia non è stata trovata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" -msgstr "" +msgstr "Il nome dell'interfaccia è già in uso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" -msgstr "" +msgstr "Il nome dell'interfaccia è troppo lungo" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 @@ -8246,34 +9590,37 @@ msgid "" "The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " "addresses." msgstr "" +"La lunghezza del prefisso IPv4 in bit, il resto viene usato negli indirizzi " +"IPv6." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 msgid "The length of the IPv6 prefix in bits" -msgstr "" +msgstr "La lunghezza del prefisso IPv6 in bit" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:165 msgid "The local IPv4 address" -msgstr "" +msgstr "L'indirizzo IPv4 locale" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." -msgstr "" +msgstr "L'indirizzo IPv4 locale su cui viene creato il tunnel (facoltativo)." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:171 msgid "The local IPv4 netmask" -msgstr "" +msgstr "La maschera di rete IPv4 locale" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:53 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 msgid "The local IPv6 address over which the tunnel is created (optional)." -msgstr "" +msgstr "L'indirizzo IPv6 locale su cui viene creato il tunnel (facoltativo)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8281,16 +9628,27 @@ msgid "" "\"leave latency\" of the network. A reduced value results in reduced time to " "detect the loss of the last member of a group" msgstr "" +"Il tempo di risposta massimo in centisecondi inserito nelle query specifiche " +"del gruppo inviate in risposta ai messaggi di abbandono del gruppo. È anche " +"l'intervallo di tempo tra i messaggi di richiesta specifici del gruppo. " +"Questo valore può essere regolato per modificare la \"latenza di abbandono\" " +"della rete. Un valore ridotto si traduce in un tempo ridotto per rilevare la " +"perdita dell'ultimo membro di un gruppo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " "IGMP messages on the subnet; larger values make the traffic less bursty, as " "host responses are spread out over a larger interval" msgstr "" +"Il tempo di risposta massimo in centisecondi inserito nelle query generali " +"periodiche. Variando il valore, l'amministratore può regolare l'intensità " +"dei messaggi IGMP sulla sottorete: valori maggiori rendono il traffico meno " +"intenso, poiché le risposte degli host sono distribuite su un intervallo più " +"ampio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8298,15 +9656,17 @@ msgstr "" "Il numero di hop massimi da pubblicare nei messaggi RA. Il massimo è 255 hop." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" +"L'accesso di rete a questo dispositivo potrebbe essere interrotto " +"modificando le impostazioni dell'interfaccia \"%h\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" -msgstr "" +msgstr "Il nome della rete è già in uso" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 msgid "" @@ -8321,63 +9681,80 @@ msgstr "" "VLAN in cui " "i computer possono comunicare direttamente tra loro. Le VLAN sono spesso usate per " -"separare segmenti di rete differenti. Spesso c'è di default una porta Uplink " -"per una connessione alla rete più ampia come internet e altre porte per una " -"rete locale." +"separare segmenti di rete differenti. Spesso c'è in modo predefinito una " +"porta Uplink per una connessione alla rete più ampia, come internet e altre " +"porte per una rete locale." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" +"Il nome host pubblico o l'indirizzo IP di questo sistema a cui il peer deve " +"connettersi. Di solito è un indirizzo IP pubblico statico, un nome host " +"statico o un dominio DDNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" +"L'intervallo di risposta alla query deve essere inferiore al valore " +"dell'intervallo di query" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:158 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:42 msgid "The reboot command failed with code %d" -msgstr "Il comando di riavvio non è riuscito con il codice %d" +msgstr "Il comando di riavvio è fallito con codice %d" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:147 msgid "The restore command failed with code %d" -msgstr "Il comando di ripristino non è riuscito con il codice %d" +msgstr "Il comando di ripristino è fallito con codice %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" +"Il valore di robustezza consente di regolare la perdita di pacchetti " +"prevista sulla rete. Se si prevede che la rete sia soggetta a perdite, il " +"valore di robustezza può essere aumentato. IGMP è robusto (Robustezza-1) " +"alle perdite di pacchetti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" +"La destinazione della regola è un salto a un'altra regola specificata dal " +"relativo valore di priorità" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" +"La destinazione della regola è un ID di ricerca della tabella: un indice " +"numerico della tabella compreso tra 0 e 65535 o un alias di simbolo " +"dichiarato in /etc/iproute2/rt_tables. Sono validi anche alias speciali " +"locali (255), principali (254) e predefiniti (253)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "La modalità %s selezionata non è compatibile con la crittografia %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" -msgstr "" +msgstr "Il token di sicurezza inviato non è valido o è già scaduto!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:98 msgid "" "The system is erasing the configuration partition now and will reboot itself " "when finished." msgstr "" +"Il sistema sta ora cancellando la partizione di configurazione e si " +"riavvierà automaticamente al termine." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:320 msgid "" @@ -8387,7 +9764,7 @@ msgid "" "settings." msgstr "" "Il sistema sta scrivendo sulla memoria flash.
    NON SPEGNERE IL " -"DISPOSITIVO!
    Attendere alcuni minuti prima di provare a ricollegarsi. " +"DISPOSITIVO!
    Attendi alcuni minuti prima di provare a ricollegarti. " "Potrebbe essere necessario rinnovare l'indirizzo del computer per " "raggiungere nuovamente il dispositivo, a seconda delle impostazioni." @@ -8396,14 +9773,30 @@ msgid "" "The system is rebooting now. If the restored configuration changed the " "current LAN IP address, you might need to reconnect manually." msgstr "" +"Il sistema si sta riavviando. Se la configurazione ripristinata ha " +"modificato l'indirizzo IP attuale della LAN, potrebbe essere necessario " +"riconnettersi manualmente." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:85 msgid "The system password has been successfully changed." -msgstr "" +msgstr "La password di sistema è stata modificata correttamente." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:345 msgid "The sysupgrade command failed with code %d" -msgstr "Il comando sysupgrade non è riuscito con il codice %d" +msgstr "Il comando sysupgrade è fallito con codice %d" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" +"Il costrutto tag filtra le direttive dell'host utilizzate; è possibile " +"fornire più di un tag, in questo caso la richiesta deve corrispondere a " +"tutti. Le direttive taggate sono usate di preferenza rispetto a quelle non " +"taggate. Si noti che è necessario specificare uno tra mac, duid o hostname " +"(può essere un carattere jolly)." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" @@ -8412,8 +9805,8 @@ msgid "" "\"Cancel\" to abort the operation." msgstr "" "L'archivio di backup caricato sembra essere valido e contiene i file " -"elencati di seguito. Premere \"Continua\" per ripristinare il backup e " -"riavviare o \"Annulla\" per interrompere l'operazione." +"elencati di seguito. Premi \"Continua\" per ripristinare il backup e " +"riavviare, o \"Annulla\" per interrompere l'operazione." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:115 msgid "The uploaded backup archive is not readable" @@ -8422,6 +9815,7 @@ msgstr "L'archivio di backup caricato non è leggibile" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:249 msgid "The uploaded firmware does not allow keeping current configuration." msgstr "" +"Il firmware caricato non consente di mantenere la configurazione attuale." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:244 msgid "" @@ -8431,56 +9825,71 @@ msgstr "" "Il file immagine caricato non contiene un formato supportato. Assicurati di " "aver scelto il formato immagine generico per la tua piattaforma." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "Il valore è sovrascritto dalla configurazione." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" +"Il valore specifica l'intervallo (millisecondi) in cui batman-adv inonda la " +"rete con le sue informazioni di protocollo." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" +"Nel sistema sono presenti regole di iptables obsolete. La combinazione di " +"regole iptables e nftables è sconsigliata e può portare a un filtraggio " +"incompleto del traffico." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Non ci sono lease attivi" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Non ci sono modifiche da applicare" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " "protect the web interface." msgstr "" +"Non c'è alcuna password impostata su questo router. Configura una password " +"di root per proteggere l'interfaccia web." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 msgid "This IPv4 address of the relay" -msgstr "" +msgstr "Questo indirizzo IPv4 del relay" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" +"Questo tipo di autenticazione non è applicabile al metodo EAP selezionato." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" -msgstr "" +msgstr "Questo non sembra un file PEM valido" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " "configurations are automatically preserved." msgstr "" -"Questo è un elenco di glob pattern della shell per elencare file e percorsi " +"Questo è un elenco di modelli glob della shell per elencare file e percorsi " "da includere durante sysupgrade. I file modificati in /etc/config/ e alcune " "altre configurazioni vengono automaticamente conservati." @@ -8489,6 +9898,27 @@ msgid "" "This is either the \"Update Key\" configured for the tunnel or the account " "password if no update key has been configured" msgstr "" +"Si tratta della \"chiave di aggiornamento\" configurata per il tunnel o " +"della password dell'account se non è stata configurata alcuna chiave di " +"aggiornamento" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Questo è il dispositivo batman-adv a cui vuoi collegare il dispositivo " +"fisico di cui sopra. Se questo elenco è vuoto, è necessario crearne uno. Se " +"vuoi instradare il traffico mesh su un dispositivo di rete cablata, sceglilo " +"dal selettore dei dispositivi sopra. Se vuoi assegnare l'interfaccia batman-" +"adv a una rete Wi-Fi, non scegliere un dispositivo nel selettore dei " +"dispositivi, ma vai alle impostazioni wireless e seleziona questa " +"interfaccia come rete." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" @@ -8503,44 +9933,51 @@ msgid "" "This is the local endpoint address assigned by the tunnel broker, it usually " "ends with ...:2/64" msgstr "" +"Questo è l'indirizzo del punto finale locale assegnato dal broker del " +"tunnel, di solito termina con ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "Questo è l’unico server DHCP nella rete locale." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "This is the plain username for logging into the account" -msgstr "" +msgstr "Questo è il semplice nome utente per accedere all'account" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 msgid "" "This is the prefix routed to you by the tunnel broker for use by clients" msgstr "" +"Questo è il prefisso instradato all'utente dal broker del tunnel per " +"l'utilizzo da parte dei client" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:29 msgid "This is the system crontab in which scheduled tasks can be defined." msgstr "" -"Questa è la crontab del sistema nella quale possono essere definiti le " +"Questo è il crontab di sistema nel quale possono essere definite le " "operazioni da programmare." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 msgid "" "This is usually the address of the nearest PoP operated by the tunnel broker" msgstr "" +"Di solito è l'indirizzo del PoP più vicino gestito dal broker del tunnel" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:65 msgid "" "This list gives an overview over currently running system processes and " "their status." msgstr "" -"Questa lista da un riassunto dei processi correntemente attivi e del loro " -"stato." +"Questo elenco offre una panoramica sui processi di sistema attualmente in " +"esecuzione e sul loro stato." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" +"Questa opzione non può essere utilizzata perché il pacchetto ca-bundle non è " +"installato." #: modules/luci-base/htdocs/luci-static/resources/form.js:2280 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:172 @@ -8550,50 +9987,61 @@ msgstr "Questa sezione non contiene ancora valori" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:124 msgid "Time Synchronization" -msgstr "Sincronizzazione Orario" +msgstr "Sincronizzazione dell'ora" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Annuncio dell'ora" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" -msgstr "" +msgstr "Tempo in millisecondi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" -msgstr "" +msgstr "Tempo in secondi da trascorrere negli stati di ascolto e apprendimento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Intervallo di tempo per il rekeying GTK" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Fuso orario" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" -msgstr "" +msgstr "Scaduto" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" -msgstr "" +msgstr "Scadenza in secondi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" +"Scadenza in secondi per gli indirizzi MAC appresi nel database di inoltro" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" +"Scadenza in secondi fino agli aggiornamenti della topologia in caso di " +"perdita di collegamento" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:145 msgid "Timezone" msgstr "Fuso orario" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Vai al login…" +"Per configurare completamente l'interfaccia WireGuard locale da un file di " +"configurazione esistente (ad es. fornito dal provider), utilizza invece " +"l'importazione della " +"configurazione." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" @@ -8601,23 +10049,28 @@ msgid "" "archive here. To reset the firmware to its initial state, click \"Perform " "reset\" (only possible with squashfs images)." msgstr "" -"Per ripristinare i file configurazione, puoi inviare un archivio di backup " -"generato precedentemente qui. Per ripristinare il firmware al suo stato " -"iniziale premi \"Esegui ripristino\" (solo per firmware basati su squashfs)." +"Per ripristinare i file di configurazione, puoi caricare un archivio di " +"backup generato precedentemente qui. Per ripristinare il firmware al suo " +"stato iniziale premi \"Esegui ripristino\" (solo per firmware basati su " +"squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" -msgstr "" +msgstr "Tono" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:35 msgid "Total Available" msgstr "Totale disponibile" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" -msgstr "" +msgstr "Traceroute" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "Codice area di tracciamento" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 @@ -8628,20 +10081,20 @@ msgstr "Traffico" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:79 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84 msgid "Traffic Class" -msgstr "" +msgstr "Classe di traffico" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" -msgstr "" +msgstr "Catena di filtro del traffico \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" -msgstr "" +msgstr "Traffico corrispondente alla regola: %.1000mPackets, %.1024mBytes" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:387 msgid "Transfer" -msgstr "" +msgstr "Trasferimento" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:25 msgid "Transmit" @@ -8649,22 +10102,42 @@ msgstr "Trasmissione" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:319 msgid "Transmit Hash Policy" -msgstr "" +msgstr "Politica di trasmissione hash" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "Trasmissione interrotta" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "Errori di trasmissione" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Dati trasmessi" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "Byte trasmessi" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "Pacchetti trasmessi" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" -msgstr "" +msgstr "Bit di intestazione del trasporto %d-%d" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:59 msgctxt "nft th dport" msgid "Transport header destination port" -msgstr "" +msgstr "Porta di destinazione dell'intestazione del trasporto" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:58 msgctxt "nft th sport" msgid "Transport header source port" -msgstr "" +msgstr "Porta di origine dell'intestazione del trasporto" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:75 msgid "Trigger" @@ -8676,147 +10149,159 @@ msgstr "Modalità di attivazione" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:69 msgid "Tunnel ID" -msgstr "" +msgstr "ID tunnel" #: modules/luci-base/htdocs/luci-static/resources/network.js:3005 #: modules/luci-compat/luasrc/model/network.lua:1431 msgid "Tunnel Interface" -msgstr "" +msgstr "Interfaccia tunnel" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:44 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:55 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:76 msgid "Tunnel Link" -msgstr "" +msgstr "Collegamento tunnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" -msgstr "" +msgstr "Dispositivo tunnel" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 msgid "Tx-Power" -msgstr "" +msgstr "Potenza-Tx" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Tipo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" -msgstr "" +msgstr "Tipo di servizio" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:56 msgctxt "nft udp dport" msgid "UDP destination port" -msgstr "" +msgstr "Porta di destinazione UDP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:55 msgctxt "nft udp sport" msgid "UDP source port" -msgstr "" +msgstr "Porta di origine UDP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:328 msgid "UDP:" -msgstr "" +msgstr "UDP:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:91 msgid "UMTS only" -msgstr "" +msgstr "Solo UMTS" #: modules/luci-compat/luasrc/model/network/proto_3g.lua:10 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:43 msgid "UMTS/GPRS/EV-DO" -msgstr "" +msgstr "UMTS/GPRS/EV-DO" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 msgid "UUID" -msgstr "" +msgstr "UUID" #: modules/luci-base/htdocs/luci-static/resources/network.js:16 #: modules/luci-base/htdocs/luci-static/resources/network.js:17 #: modules/luci-compat/luasrc/model/network.lua:34 #: modules/luci-compat/luasrc/model/network.lua:35 msgid "Unable to determine device name" -msgstr "" +msgstr "Impossibile determinare il nome del dispositivo" #: modules/luci-base/htdocs/luci-static/resources/network.js:18 #: modules/luci-compat/luasrc/model/network.lua:36 msgid "Unable to determine external IP address" -msgstr "" +msgstr "Impossibile determinare l'indirizzo IP esterno" #: modules/luci-base/htdocs/luci-static/resources/network.js:19 #: modules/luci-compat/luasrc/model/network.lua:37 msgid "Unable to determine upstream interface" -msgstr "" +msgstr "Impossibile determinare l'interfaccia upstream" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" -msgstr "" +msgstr "Impossibile spedire" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:85 msgid "Unable to generate QR code: %s" -msgstr "" +msgstr "Impossibile generare il codice QR: %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:9 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:15 msgid "Unable to load log data:" -msgstr "" +msgstr "Impossibile caricare i dati di registro:" #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:54 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:54 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:22 msgid "Unable to obtain client ID" -msgstr "" +msgstr "Impossibile ottenere l'ID client" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:221 msgid "Unable to obtain mount information" -msgstr "" +msgstr "Impossibile ottenere informazioni sul montaggio" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:307 msgid "Unable to reset ip6tables counters: %s" -msgstr "" +msgstr "Impossibile reimpostare i contatori di ip6tables: %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:305 msgid "Unable to reset iptables counters: %s" -msgstr "" +msgstr "Impossibile reimpostare i contatori di iptables: %s" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:61 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:7 msgid "Unable to resolve AFTR host name" -msgstr "" +msgstr "Impossibile risolvere il nome host AFTR" #: modules/luci-base/htdocs/luci-static/resources/network.js:20 #: modules/luci-compat/luasrc/model/network.lua:38 msgid "Unable to resolve peer host name" -msgstr "" +msgstr "Impossibile risolvere il nome host del peer" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:313 msgid "Unable to restart firewall: %s" -msgstr "" +msgstr "Impossibile riavviare il firewall: %s" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:370 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:57 msgid "Unable to save contents: %s" -msgstr "" +msgstr "Impossibile salvare i contenuti: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "Impossibile impostare l'elenco di modalità consentite." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "Impossibile impostare la modalità preferita." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "Impossibile verificare il PIN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" -msgstr "" +msgstr "Deconfigura" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" -msgstr "" +msgstr "Formato dei dati di risposta non previsto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8835,18 +10320,18 @@ msgstr "" msgid "Unknown" msgstr "Sconosciuto" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." -msgstr "" +msgstr "Metodo di connessione sconosciuto e non supportato." #: modules/luci-base/htdocs/luci-static/resources/network.js:2401 #: modules/luci-compat/luasrc/model/network.lua:1138 msgid "Unknown error (%s)" -msgstr "" +msgstr "Errore sconosciuto (%s)" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:412 msgid "Unknown error code" -msgstr "" +msgstr "Codice di errore sconosciuto" #: modules/luci-base/htdocs/luci-static/resources/network.js:2089 #: modules/luci-base/htdocs/luci-static/resources/protocol/none.js:6 @@ -8859,45 +10344,55 @@ msgstr "Non gestito" msgid "Unmount" msgstr "Smonta" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" -msgstr "" +msgstr "Chiave senza nome" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Modifiche non salvate" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:410 msgid "Unspecified error" -msgstr "" +msgstr "Errore non specificato" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:64 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:9 msgid "Unsupported MAP type" -msgstr "" +msgstr "Tipo di MAP non supportato" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" -msgstr "" +msgstr "Modem non supportato" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Protocollo non supportato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." -msgstr "Tipo protocollo non supportato." +msgstr "Tipo di protocollo non supportato." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Non etichettato" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" -msgstr "" +msgstr "Peer senza titolo" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 msgid "Up" -msgstr "" +msgstr "In funzione" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:411 msgid "Up Delay" -msgstr "" +msgstr "Ritardo attivazione" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Carica" @@ -8914,25 +10409,29 @@ msgstr "" msgid "Upload archive..." msgstr "Carica archivio..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" -msgstr "" +msgstr "Carica file" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" -msgstr "" +msgstr "Carica file…" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "Il caricamento è stato annullato" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" -msgstr "Caricamento non riuscito: %s" +msgstr "Richiesta di caricamento fallita: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Caricamento file…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -8942,7 +10441,7 @@ msgstr "" "un nome nella forma wifinet# e la rete verrà riavviata per " "applicare la nuova configurazione." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -8950,7 +10449,7 @@ msgstr "" "Premendo \"Continua\", la configurazione del/dei bridge verrà aggiornata e " "la rete verrà riavviata per applicare la nuova configurazione." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -8958,36 +10457,45 @@ msgstr "" "Premendo \"Continua\", le opzioni ifname saranno rinominate e la rete sarà " "riavviata per applicare la nuova configurazione." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "I name server DNS verranno " "interrogati nell'ordine del file resolv." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" -msgstr "Uptime" +msgstr "Tempo di attività" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Usa /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Usa DHCP" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" -msgstr "Utilizza server suggeriti dal DHCP" +msgstr "Usa server suggeriti dal DHCP" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 msgid "Use DHCP gateway" -msgstr "Usa il DHCP del gateway" +msgstr "Usa il gateway del DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Usa DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Usa i server DNS annunciati dal peer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Usa i codici delle nazioni ISO/IEC 3166 alpha2." @@ -9009,78 +10517,85 @@ msgstr "Usa TTL nel tunnel dell'interfaccia" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:322 msgid "Use XOR of hardware MAC addresses (layer2)" -msgstr "" +msgstr "Usa XOR degli indirizzi MAC hardware (livello 2)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:323 msgid "Use XOR of hardware MAC addresses and IP addresses (layer2+3)" -msgstr "" +msgstr "Usa XOR di indirizzi MAC hardware e indirizzi IP (livelli2+3)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:325 msgid "" "Use XOR of hardware MAC addresses and IP addresses, rely on skb_flow_dissect " "(encap2+3)" msgstr "" +"Usa XOR di indirizzi MAC hardware e indirizzi IP, affidati a " +"skb_flow_dissect (encap2+3)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:295 msgid "Use as external overlay (/overlay)" -msgstr "" +msgstr "Usa come sovrapposizione esterna (/overlay)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:294 msgid "Use as root filesystem (/)" -msgstr "" +msgstr "Usa come filesystem di root (/)" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 msgid "Use broadcast flag" msgstr "Usa flag broadcast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" -msgstr "" +msgstr "Usa la gestione IPv6 integrata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Usa server DNS personalizzati" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Usa il gateway predefinito" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Usa la metrica del gateway" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 msgid "Use legacy MAP" -msgstr "" +msgstr "Usa MAP obsoleto" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 msgid "" "Use legacy MAP interface identifier format (draft-ietf-softwire-map-00) " "instead of RFC7597" msgstr "" +"Usa il formato dell'identificatore di interfaccia MAP obsoleto (draft-ietf-" +"softwire-map-00) anziché RFC7597" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 msgid "Use routing table" -msgstr "Utilizzare tabella di instradamento" +msgstr "Usa la tabella di instradamento" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:63 msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" -msgstr "" +msgstr "Usa la stessa origine e destinazione per ogni connessione" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" -msgstr "" +msgstr "Usa i certificati di sistema" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" -msgstr "" +msgstr "Usa i certificati di sistema per il tunnel interno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9088,96 +10603,102 @@ msgid "" "the requesting host. The optional Lease time can be used to set non-" "standard host-specific lease time, e.g. 12h, 3d or infinite." msgstr "" -"Utilizzare il pulsante Aggiungi per aggiungere una nuova voce di " -"contratto. L'Indirizzo-MAC identifica l'host, l'Indirizzo-IPv4 specifica l'indirizzo fisso da utilizzare e il Nome host è " -"assegnato come nome simbolico alla richiesta dell'host. L'opzionale " -"tempo di Contratto può essere usato per impostare un tempo di " -"contratto non-standard a uno specifico host, p.e. 12h, 3d o infinito." +"Usa il pulsante Aggiungi per aggiungere una nuova voce di lease. " +"L'Indirizzo-MAC identifica l'host, l'Indirizzo-IPv4 " +"specifica l'indirizzo fisso da usare e il Nome host è assegnato " +"come nome simbolico all'host richiedente. Il Tempo di lease " +"facoltativo può essere usato per impostare un tempo di lease non-standard a " +"uno specifico host, ad es. 12h, 3d o infinito." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:324 msgid "Use upper layer protocol information (layer3+4)" -msgstr "" +msgstr "Usa le informazioni del protocollo di livello superiore (livelli3+4)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:326 msgid "" "Use upper layer protocol information, rely on skb_flow_dissect (encap3+4)" msgstr "" +"Usa le informazioni del protocollo di livello superiore, affidati a " +"skb_flow_dissect (encap3+4)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:36 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:194 msgid "Used" msgstr "Usata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" -msgstr "Slot Chiave Usata" +msgstr "Slot chiave usato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" +"Usato per due scopi diversi: ID NAS RADIUS e 802.11r R0KH-ID. Non è " +"necessario con il normale WPA(2)-PSK." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" -msgstr "" +msgstr "Gruppo utente" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" -msgstr "" +msgstr "Certificato utente (codificato PEM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" -msgstr "" +msgstr "Identificatore utente" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" -msgstr "" +msgstr "Chiave utente (codificata PEM)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Nome utente" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" -msgstr "" +msgstr "Utilizza tabella di flusso %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" -msgstr "" +msgstr "VEPA (Aggregatore di Porte Ethernet Virtuali)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" -msgstr "" +msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" -msgstr "" +msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" -msgstr "" +msgstr "ID VLAN" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:173 msgid "VLANs on %q" -msgstr "LAN virtuali (VLANs) su %q" +msgstr "VLAN su %q" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:54 msgid "VPN" @@ -9185,133 +10706,158 @@ msgstr "VPN" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:42 msgid "VPN Local address" -msgstr "" +msgstr "Indirizzo locale VPN" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:46 msgid "VPN Local port" -msgstr "" +msgstr "Porta locale VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" -msgstr "" +msgstr "Protocollo VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Server VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "Hash SHA256 del certificato del server VPN" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" -msgstr "" +msgstr "Porta server VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" -msgstr "" +msgstr "Hash SHA1 del certificato del server VPN" #: modules/luci-compat/luasrc/model/network/proto_vpnc.lua:9 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:9 msgid "VPNC (CISCO 3000 (and others) VPN)" -msgstr "" +msgstr "VPNC (CISCO 3000 (e altri) VPN)" + +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" -msgstr "" +msgstr "VXLAN (RFC7348)" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 msgid "VXLAN network identifier" -msgstr "" +msgstr "Identificatore di rete VXLAN" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:10 msgid "VXLANv6 (RFC7348)" -msgstr "" +msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" +"Convalida risposte DNS e metti in cache i dati DNSSEC, richiede il supporto " +"di DNSSEC a monte." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" msgstr "" +"Convalida il certificato del server usando il bundle CA di sistema integrato," +"
    richiede il pacchetto \"ca-bundle\"" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:388 msgid "Validation for all slaves" -msgstr "" +msgstr "Validazione per tutti gli slave" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:386 msgid "Validation only for active slave" -msgstr "" +msgstr "Validazione solo per lo slave attivo" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:387 msgid "Validation only for backup slaves" -msgstr "" +msgstr "Validazione solo per gli slave di backup" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:73 msgid "Vendor" -msgstr "" +msgstr "Produttore" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:40 msgid "Vendor Class to send when requesting DHCP" -msgstr "Classe del Produttore da 'inviare al momento della richiesta DHCP" +msgstr "Classe del produttore da inviare al momento della richiesta DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" +"Verifica se le risposte di dominio non firmate provengono davvero da domini " +"non firmati." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:196 msgid "Verifying the uploaded image file." msgstr "Verifica del file immagine caricato." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" -msgstr "Molto Alta" +msgstr "Molto alta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" -msgstr "" +msgstr "Ethernet virtuale" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:60 msgid "Virtual dynamic interface" -msgstr "" +msgstr "Interfaccia dinamica virtuale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" -msgstr "Sistema Aperto WEP" +msgstr "Sistema aperto WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" -msgstr "Chiave Condivisa WEP" +msgstr "Chiave condivisa WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" -msgstr "frase di accesso WEP" +msgstr "Password WEP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "Roaming WLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Modalità WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "Modalità riposo WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "Correzioni modalità riposo WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" -msgstr "frase di accesso WPA" +msgstr "Password WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9321,7 +10867,7 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:153 msgid "WPS status" -msgstr "" +msgstr "Stato WPS" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:47 msgid "Waiting for device..." @@ -9335,41 +10881,107 @@ msgstr "Avviso" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:26 msgid "Warning: There are unsaved changes that will get lost on reboot!" msgstr "" -"ATTENZIONE: sono presenti modifiche non salvate che andranno perse al " +"Attenzione: sono presenti modifiche non salvate che andranno perse al " "riavvio!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 msgid "Weak" +msgstr "Debole" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Peso" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." msgstr "" +"Quando un host corrisponde a una voce, viene impostata l'etichetta speciale " +"known. Usa known per abbinare tutti gli host conosciuti." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" +"Quando si delegano prefissi a più downstream, vengono considerate prima le " +"interfacce con un valore di preferenza superiore quando si assegnano " +"sottoreti." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Quando il codice della rete attiva aumenta la capacità effettiva del WiFi " +"combinando più frame in uno unico, riducendo così il tempo necessario in " +"aria." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Quando attivo, la tabella ARP distribuita forma una cache ARP a livello di " +"mesh che aiuta i client non-mesh a ottenere risposte ARP molto più " +"affidabili e senza grossi ritardi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" +"Quando attivo, il gateway è on-link anche se non corrisponde ad alcun " +"prefisso dell'interfaccia" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Quando attivo, vengono aggiunte nuove voci della tabella ARP da richieste o " +"risposte gratuite, altrimenti vengono aggiornate solo le voci delle tabelle " +"preesistenti, ma non vengono appresi nuovi host." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Quando invertito, il LED è sempre acceso e sfarfalla, invece di essere " +"spento in modo predefinito e lampeggiante sull'attività di sistema." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Quando la rete è attiva su più interfacce WiFi per nodo, batman-adv è in " +"grado di ottimizzare il flusso del traffico per ottenere le massime " +"prestazioni." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" +"Quando si usa una PSK, la PMK può essere generata automaticamente. Quando " +"attivo, le opzioni di chiave R0/R1 qui sotto non sono applicate. Disattivalo " +"per usare le opzioni di chiave R0 e R1." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -"Se la modalità Wi-Fi Multimedia (WMM) QoS è disabilitata, i client " -"potrebbero essere limitati a velocità 802.11a/802.11g." +"Se la modalità Wi-Fi Multimedia (WMM) QoS è disattivata, i client potrebbero " +"essere limitati a velocità 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9378,18 +10990,27 @@ msgstr "" "l'efficienza del tempo di trasmissione potrebbe essere ridotta." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" -msgstr "" +msgstr "Larghezza" + +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Stato di WireGuard" #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" -msgstr "" +msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" -msgstr "" +msgstr "Il peer WireGuard è disattivato" #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:17 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:10 @@ -9403,21 +11024,21 @@ msgid "Wireless Adapter" msgstr "Dispositivo wireless" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Rete wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Panoramica wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Sicurezza wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Migrazione della configurazione wireless" @@ -9431,43 +11052,45 @@ msgstr "La rete wireless è disattivata" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:152 msgid "Wireless is not associated" -msgstr "La rete wireless è non associata" +msgstr "La rete wireless non è associata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "La rete wireless è disattivata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "La rete wireless è attivata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." -msgstr "Scrivere le richieste DNS ricevute nel syslog." +msgstr "Scrivi le richieste DNS ricevute nel syslog." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:181 msgid "Write system log to file" -msgstr "Scrivi registro di sistema su file" +msgstr "Scrivi il log di sistema su file" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:206 msgid "XOR policy (balance-xor, 2)" -msgstr "" +msgstr "Criterio XOR (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" -msgstr "Si" +msgstr "Sì" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:305 msgid "Yes (none, 0)" -msgstr "" +msgstr "Sì (nessuno, 0)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:177 msgid "" "You appear to be currently connected to the device via the \"%h\" interface. " "Do you really want to shut down the interface?" msgstr "" +"Sembri attualmente connesso al dispositivo tramite l'interfaccia \"%h\". " +"Vuoi davvero spegnere l'interfaccia?" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:112 msgid "" @@ -9475,14 +11098,27 @@ msgid "" "after a device reboot.
    Warning: If you disable essential init " "scripts like \"network\", your device might become inaccessible!" msgstr "" -"Qui è possibile abilitare o disabilitare gli script di inizializzazione " -"installati. Le modifiche verranno applicate dopo il riavvio del dispositivo. " -"
    Attenzione: se disabiliti script di inizializzazione " -"essenziali come \"network\", il tuo dispositivo potrebbe diventare " -"inaccessibile! " +"Qui è possibile attivare o disattivare gli script di inizializzazione " +"installati. Le modifiche verranno applicate dopo il riavvio del dispositivo." +"
    Attenzione: se disattivi script di inizializzazione essenziali " +"come \"network\", il tuo dispositivo potrebbe diventare inaccessibile!" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Puoi aggiungere più record per la stessa destinazione." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Puoi aggiungere più record per lo stesso dominio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" +"Puoi aggiungere più \"Relay To\" univoci sullo stesso indirizzo di ascolto." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9495,54 +11131,80 @@ msgid "" "You must select a primary interface which is included in selected slave " "interfaces!" msgstr "" +"Devi selezionare un'interfaccia primaria inclusa nelle interfacce slave " +"selezionate!" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:98 msgid "" "You must select at least one ARP IP target if ARP monitoring is selected!" msgstr "" +"Devi selezionare almeno una destinazione IP ARP se viene selezionato il " +"monitoraggio ARP!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:213 msgid "ZRam Compression Algorithm" -msgstr "" +msgstr "Algoritmo di compressione ZRam" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:206 msgid "ZRam Settings" -msgstr "" +msgstr "Impostazioni ZRam" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:208 msgid "ZRam Size" +msgstr "Dimensione ZRam" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Nota: anche se _http " +"è possibile, nessun browser supporta i record SRV.)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "qualsiasi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" -msgstr "" +msgstr "automatico" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automatico (disattivato)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automatico (attivato)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" -msgstr "" +msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" -msgstr "ponte" +msgstr "in bridge" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:146 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:406 @@ -9550,7 +11212,7 @@ msgstr "ponte" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:99 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:31 msgid "create" -msgstr "" +msgstr "crea" #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:69 msgid "create:" @@ -9595,45 +11257,59 @@ msgstr "dBm" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:73 msgctxt "nft unit" msgid "day" -msgstr "" +msgstr "giorno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" -msgstr "disabilita" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +msgstr "disattiva" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" -msgstr "disabilitato" +msgstr "disattivato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" -msgstr "definito dal driver" +msgstr "predefinito del driver" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "predefinito del driver (%s)" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" -msgstr "" +msgstr "ad es. : --proxy 10.10.10.10" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 msgid "e.g: dump" -msgstr "" +msgstr "ad es. : dump" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "attivato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "ogni %ds" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "scaduto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" -msgstr "" +msgstr "forzato" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:85 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:196 @@ -9641,179 +11317,214 @@ msgstr "" msgid "forward" msgstr "inoltro" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "full-duplex" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "half-duplex" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "valore in codifica esadecimale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "nascosto" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:74 msgctxt "nft unit" msgid "hour" -msgstr "" +msgstr "ora" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" -msgstr "modo ibrido" +msgstr "modalità ibrida" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:63 msgid "ignore" -msgstr "" +msgstr "ignora" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "infinito (il lease non scade)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 msgid "input" -msgstr "ingresso" +msgstr "input" #: modules/luci-base/htdocs/luci-static/resources/validation.js:410 msgid "key between 8 and 63 characters" -msgstr "" +msgstr "chiave tra 8 e 63 caratteri" #: modules/luci-base/htdocs/luci-static/resources/validation.js:422 msgid "key with either 5 or 13 characters" -msgstr "" +msgstr "chiave con 5 o 13 caratteri" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "conosciuto/i" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "known-othernet (in sottorete diversa)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" -msgstr "" +msgstr "configurazione gestita (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" -msgstr "" +msgstr "sicurezza media" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:75 msgctxt "nft unit" msgid "minute" -msgstr "" +msgstr "minuto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minuti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" -msgstr "" +msgstr "agente home mobile (H)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:423 msgid "netif_carrier_ok()" -msgstr "" +msgstr "netif_carrier_ok()" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 msgid "no" msgstr "no" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" -msgstr "Nessun collegamento" +msgstr "nessun collegamento" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "nessun override" #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "campo da compilare" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" -msgstr "nessuna" +msgstr "nessuno" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:41 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:69 msgid "not present" -msgstr "" +msgstr "non presente" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "spento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" -msgstr "" +msgstr "su prefisso disponibile" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" -msgstr "" +msgstr "rete aperta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" -msgstr "" +msgstr "altra configurazione (O)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 msgid "output" -msgstr "" +msgstr "output" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "più di un giorno fa" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" -msgstr "" +msgstr "pacchetti" #: modules/luci-base/htdocs/luci-static/resources/validation.js:252 msgid "positive decimal value" -msgstr "" +msgstr "valore decimale positivo" #: modules/luci-base/htdocs/luci-static/resources/validation.js:244 msgid "positive integer value" -msgstr "" +msgstr "valore intero positivo" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:178 msgid "random" +msgstr "casuale" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "generato casualmente" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" msgstr "" +"riduce l'overhead raccogliendo e aggregando i messaggi di origine in un " +"singolo pacchetto piuttosto che in molti piccoli" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" -msgstr "" +msgstr "modalità relay" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "instradato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" -msgstr "" +msgstr "sec" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" -msgstr "" +msgstr "modalità server" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:54 msgid "sstpc Log-level" -msgstr "" +msgstr "livello di log sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" -msgstr "" +msgstr "sicurezza robusta" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:354 msgid "tagged" msgstr "etichettato" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" -msgstr "" +msgstr "unità di tempo (UT / 1.024 ms) [1000-65535]" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 msgid "" @@ -9821,26 +11532,31 @@ msgid "" "HTTPS network " "access." msgstr "" +"uHTTPd offre accesso alla rete in HTTP o HTTPS." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" -msgstr "" +msgstr "valore unico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "sconosciuto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "versione sconosciuta" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "illimitato" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9862,8 +11578,8 @@ msgid "untagged" msgstr "non etichettato" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "indirizzo IP valido" @@ -9873,10 +11589,10 @@ msgstr "indirizzo IP o prefisso valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:294 msgid "valid IPv4 CIDR" -msgstr "" +msgstr "CIDR IPv4 valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "indirizzo IPv4 valido" @@ -9886,82 +11602,82 @@ msgstr "indirizzo IPv4 o rete valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:389 msgid "valid IPv4 address:port" -msgstr "" +msgstr "indirizzo:porta IPv4 validi" #: modules/luci-base/htdocs/luci-static/resources/validation.js:328 msgid "valid IPv4 network" -msgstr "" +msgstr "rete IPv4 valida" #: modules/luci-base/htdocs/luci-static/resources/validation.js:288 msgid "valid IPv4 or IPv6 CIDR" -msgstr "" +msgstr "CIDR IPv4 o IPv6 valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:278 msgid "valid IPv4 prefix value (0-32)" -msgstr "" +msgstr "valore prefisso IPv4 valido (0-32)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:300 msgid "valid IPv6 CIDR" -msgstr "" +msgstr "CIDR IPv6 valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" -msgstr "" +msgstr "indirizzo IPv6 valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 msgid "valid IPv6 address or prefix" -msgstr "" +msgstr "indirizzo IPv6 o prefisso valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:318 msgid "valid IPv6 host id" -msgstr "" +msgstr "ID host IPv6 valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:333 msgid "valid IPv6 network" -msgstr "" +msgstr "rete IPv6 valida" #: modules/luci-base/htdocs/luci-static/resources/validation.js:283 msgid "valid IPv6 prefix value (0-128)" -msgstr "" +msgstr "valore prefisso IPv6 valido (0-128)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:355 msgid "valid MAC address" -msgstr "" +msgstr "indirizzo MAC valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:426 msgid "valid UCI identifier" -msgstr "" +msgstr "identificatore UCI valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:377 msgid "valid UCI identifier, hostname or IP address range" -msgstr "identificatore UCI valido, nome host o intervallo di indirizzi IP" +msgstr "identificatore UCI, nome host o intervallo di indirizzi IP validi" #: modules/luci-base/htdocs/luci-static/resources/validation.js:398 #: modules/luci-base/htdocs/luci-static/resources/validation.js:401 msgid "valid address:port" -msgstr "" +msgstr "indirizzo:porta validi" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" -msgstr "" +msgstr "data valida (YYYY-MM-DD)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:248 msgid "valid decimal value" -msgstr "" +msgstr "valore decimale valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:420 msgid "valid hexadecimal WEP key" -msgstr "" +msgstr "chiave WEP esadecimale valida" #: modules/luci-base/htdocs/luci-static/resources/validation.js:408 msgid "valid hexadecimal WPA key" -msgstr "" +msgstr "chiave WPA esadecimale valida" #: modules/luci-base/htdocs/luci-static/resources/validation.js:383 msgid "valid host:port" -msgstr "" +msgstr "host:porta validi" #: modules/luci-base/htdocs/luci-static/resources/validation.js:370 #: modules/luci-base/htdocs/luci-static/resources/validation.js:372 @@ -9977,70 +11693,82 @@ msgstr "nome host o indirizzo IP valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:240 msgid "valid integer value" -msgstr "" +msgstr "valore intero valido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:355 msgid "valid multicast MAC address" +msgstr "indirizzo MAC multicast valido" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" msgstr "" +"nome del dispositivo di rete valido tra 1 e 15 caratteri non contenenti \":" +"\", \"/\", \"%\" o spazi" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "nome del dispositivo di rete valido, non \".\" o \"..\"" #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" -msgstr "" +msgstr "rete valida in notazione indirizzo/maschera" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" -msgstr "" +msgstr "cifra telefonica valida (0-9, \"*\", \"#\", \"!\" o \".\")" #: modules/luci-base/htdocs/luci-static/resources/validation.js:346 #: modules/luci-base/htdocs/luci-static/resources/validation.js:349 msgid "valid port or port range (port1-port2)" -msgstr "" +msgstr "porta o gruppo di porte validi (porta1-porta2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" -msgstr "" +msgstr "valore della porta valido" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" -msgstr "" +msgstr "orario valido (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" -msgstr "" +msgstr "valore tra %d e %d caratteri" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "valore compreso tra %f e %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "valore maggiore o uguale a %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "valore minore o uguale a %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "valore di %d caratteri" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "valore di almeno %d caratteri" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" -msgstr "valore di al più %d caratteri" +msgstr "valore di massimo %d caratteri" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "sicurezza debole" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:72 msgctxt "nft unit" msgid "week" -msgstr "" +msgstr "settimana" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 msgid "yes" diff --git a/package/luci/modules/luci-base/po/ja/base.po b/package/luci/modules/luci-base/po/ja/base.po index c59061cf52..172327c222 100644 --- a/package/luci/modules/luci-base/po/ja/base.po +++ b/package/luci/modules/luci-base/po/ja/base.po @@ -3,34 +3,50 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:40+0200\n" -"PO-Revision-Date: 2022-11-23 11:35+0000\n" -"Last-Translator: INAGAKI Hiroshi \n" -"Language-Team: Japanese \n" +"Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 4.18.1\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" テーブル \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d ビット" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "無効な入力欄: %d個" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d時間前" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d分前" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d秒前" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%sは複数のVLANでタグなしに設定されています!" @@ -55,10 +71,11 @@ msgstr "(空)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(インターフェースが接続されていません)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "" @@ -68,19 +85,19 @@ msgid "-- Additional Field --" msgstr "-- 追加項目 --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- 選択してください --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- カスタム --" @@ -106,7 +123,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0: RSSIしきい値を使用しない、1: ドライバーのデフォルトを使用" @@ -119,12 +136,17 @@ msgstr "1" msgid "1 Minute Load:" msgstr "過去1分間の負荷:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "過去15分間の負荷:" @@ -139,12 +161,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4文字の16進数ID" @@ -157,43 +184,98 @@ msgstr "464XLAT(CLAT)" msgid "5 Minute Load:" msgstr "過去5分間の負荷:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "16進数6オクテットの識別子(コロンを含まない)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r高速ローミング" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11wアソシエーションSAクエリの最大タイムアウト" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11wアソシエーションSAクエリの再試行タイムアウト" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w管理フレーム保護" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w最大タイムアウト" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w再試行タイムアウト" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-ネットマスク" @@ -205,30 +287,46 @@ msgstr "LED設定" msgid "LED Name" msgstr "LED名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP プロキシ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA フラグ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA ホップ リミット" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ は全てのドメインに一致します。 IPアドレスが空の /" +"example.com/ は NXDOMAIN を返します。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# は example.com とそのサブドメインに対して NULL ア" +"ドレス (0.0.0.0 及び ::) を返します。" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -274,11 +372,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "デバイス \"%s\" の設定は既に存在しています" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "同じ名前のディレクトリがすでに存在します。" @@ -286,25 +392,90 @@ msgstr "同じ名前のディレクトリがすでに存在します。" msgid "A new login is required since the authentication session expired." msgstr "認証セッションの期限が切れたため、再ログインが必要です。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -337,29 +508,36 @@ msgstr "選択したポリシーではARPモニタリングはサポートされ msgid "ARP retry threshold" msgstr "ARP再試行しきい値" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM(非同期転送モード)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATMブリッジ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM仮想チャネル識別子(VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM仮想パス識別子(VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -369,27 +547,23 @@ msgstr "" "インターフェイスとして公開し、DHCPまたはPPPと組み合わせて使用し、プロバイダー" "ネットワークにダイヤルできます。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATMデバイス番号" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-CシステムベンダーID" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "存在しないインターフェース" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "DNSサービスを、現在DNSを提供しているサブネットインターフェースに限定します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "ローカルを許可" @@ -398,7 +572,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "送信元がローカルアドレスであるパケットを許可します" @@ -406,16 +580,25 @@ msgstr "送信元がローカルアドレスであるパケットを許可しま msgid "Access Concentrator" msgstr "アクセスコンセントレータ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "アクセスポイント" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "操作" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "アクティブ" @@ -453,8 +636,8 @@ msgstr "アクティブな IPv6 ルール" msgid "Active-Backup policy (active-backup, 1)" msgstr "アクティブ-バックアップポリシー(active-backup、1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "アドホック" @@ -471,18 +654,18 @@ msgstr "アダプティブな送信負荷分散(balance-tlb、5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "追加" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "ATMブリッジを追加" @@ -502,11 +685,11 @@ msgstr "LEDの動作を追加" msgid "Add VLAN" msgstr "VLANを追加" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "デバイス設定を追加" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "デバイス設定を追加…" @@ -514,18 +697,18 @@ msgstr "デバイス設定を追加…" msgid "Add instance" msgstr "インスタンスを追加" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "公開鍵を追加" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "hostsファイルから提供される名前にローカルドメインサフィックスを追加" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "インターフェースを新規作成..." @@ -533,6 +716,10 @@ msgstr "インターフェースを新規作成..." msgid "Add peer" msgstr "ピアを追加" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "ブラックリストに追加" @@ -541,11 +728,11 @@ msgstr "ブラックリストに追加" msgid "Add to Whitelist" msgstr "ホワイトリストに追加" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "追加のホストファイル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "追加のサーバーファイル" @@ -562,7 +749,11 @@ msgstr "追加のサーバーファイル" msgid "Address" msgstr "アドレス" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -575,7 +766,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "ローカル リレーブリッジにアクセスするためのアドレス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "アドレス一覧" @@ -584,29 +775,29 @@ msgstr "アドレス一覧" msgid "Administration" msgstr "管理" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "詳細設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "デバイスの詳細オプション" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "エージング時間" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "総送信電力(ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -643,17 +834,17 @@ msgstr "エイリアスインターフェース" msgid "Alias of \"%s\"" msgstr "\"%s\"のエイリアス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "すべてのサーバー" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "利用可能な最小IPアドレスから順番に割り当てる" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "順次IP割り当て" @@ -661,11 +852,11 @@ msgstr "順次IP割り当て" msgid "Allow SSH password authentication" msgstr "SSHパスワード認証を許可" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "APモードで、低ACK状態のSTAの切断を許可" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "リスト内以外のすべてを許可" @@ -673,15 +864,15 @@ msgstr "リスト内以外のすべてを許可" msgid "Allow full UCI access for legacy applications" msgstr "レガシーアプリケーションにUCIのフルアクセスを許可" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "レガシー802.11bレートを許可" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "リスト内のみアクセスを許可" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "ローカルホストを許可" @@ -702,19 +893,24 @@ msgid "Allow system feature probing" msgstr "システム機能の調査を許可" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "パスワードでの root 権限へのログインを許可します" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "許可されたIP" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "常に" @@ -726,11 +922,11 @@ msgstr "常にオフ(kernel: none)" msgid "Always on (kernel: default-on)" msgstr "常にオン(kernel: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -738,10 +934,14 @@ msgstr "" "セカンダリチャンネルの重複にかかわらず、常に40MHzチャンネルを使用します。この" "オプションは、IEEE 802.11n-2009に準拠しません!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "送信に用いる重複アドレス検出(DAD)の数です" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "フォームの保存中にエラーが発生しました:" @@ -750,72 +950,21 @@ msgstr "フォームの保存中にエラーが発生しました:" msgid "An optional, short description for this device" msgstr "このデバイスの短い説明(オプション)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annex A + L + M(すべて)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Annex A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Annex A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Annex A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Annex A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Annex B(すべて)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Annex B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Annex B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Annex B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Annex J(すべて)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Annex L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Annex M(すべて)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Annex M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "このデバイスを IPv6 DNS サーバーとしてアナウンスします。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -823,7 +972,7 @@ msgstr "" "ローカルの IPv6 デフォルトルートが存在する場合、このデバイスをデフォルト ルー" "ターとしてアナウンスします" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -832,7 +981,7 @@ msgstr "" "トの利用可否にかかわらずこのデバイスをデフォルト ルーターとしてアナウンスしま" "す" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -840,15 +989,15 @@ msgstr "" "プレフィックスまたはデフォルトルートが存在するかどうかにかかわらず、このデバ" "イスをデフォルト ルーターとしてアナウンスします" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "アナウンスされたDNSドメイン" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "アナウンスされる IPv6 DNS サーバー" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "匿名アイデンティティ" @@ -860,7 +1009,7 @@ msgstr "匿名マウント" msgid "Anonymous Swap" msgstr "匿名スワップ" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -872,11 +1021,11 @@ msgstr "" msgid "Any zone" msgstr "すべてのゾーン" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -884,40 +1033,44 @@ msgstr "" msgid "Apply backup?" msgstr "バックアップを適用しますか?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "適用のリクエストに失敗しました ステータスコード:%h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "チェックなしの適用" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "設定を適用中… 残り最大%d秒" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "アーキテクチャ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "パブリックIPv6プレフィックスのうち、指定されたプレフィックス長の一部をこのイ" "ンターフェースに割り当てる" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -925,7 +1078,7 @@ msgstr "" "このサブプレフィックスID(16進数)を使用するプレフィックス領域を、このイン" "ターフェースに割り当てます。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "接続済み端末" @@ -934,15 +1087,15 @@ msgstr "接続済み端末" msgid "Associations" msgstr "接続数" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -952,25 +1105,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "接続済みデバイスに対して構成済みのマウントポイントを有効化" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "認証グループ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "認証" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "認証タイプ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "権威" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "ログイン" @@ -978,7 +1132,9 @@ msgstr "ログイン" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -996,7 +1152,7 @@ msgstr "自動ホームネット(HNCP)" msgid "Automatically check filesystem for errors before mounting" msgstr "マウントする前にファイルシステムのエラーを自動的にチェック" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1018,6 +1174,10 @@ msgstr "ファイルシステムを自動的にマウント" msgid "Automount Swap" msgstr "スワップを自動的にマウント" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "利用可能" @@ -1036,11 +1196,15 @@ msgstr "利用可能" msgid "Average:" msgstr "平均:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1048,15 +1212,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "" @@ -1065,11 +1233,7 @@ msgstr "" msgid "Back to Overview" msgstr "概要へ戻る" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "設定へ戻る" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1082,16 +1246,15 @@ msgid "Backup / Flash Firmware" msgstr "バックアップ/フラッシュ" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "バックアップファイルリスト" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "バンド" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "ベース デバイス" @@ -1099,12 +1262,35 @@ msgstr "ベース デバイス" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "ビーコン間隔" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1118,7 +1304,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "ワイルドカードアドレスよりもインターフェースへ動的にバインド(Linuxのデフォル" @@ -1129,18 +1315,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "インターフェースをバインド" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1152,65 +1351,77 @@ msgstr "トンネルをこのインターフェースにバインド(オプシ msgid "Bitrate" msgstr "ビットレート" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "ボンディングポリシー" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "ブリッジ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "ブリッジ(MAC ベース VLAN間の直接通信をサポート)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "ブリッジ VLAN フィルタリング" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "ブリッジ デバイス" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "ブリッジ ポート用オプション" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "ブリッジ ポート" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "ブリッジユニット番号" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "空のブリッジを起動" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "ブート時に起動" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "ポートがアタッチされていなくてもブリッジ インターフェースを起動します" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "ブロードキャストポリシー(broadcast、3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "参照…" @@ -1218,14 +1429,36 @@ msgstr "参照…" msgid "Buffered" msgstr "バッファ済み" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "CA証明書(空白の場合、最初の接続後に保存されます。)" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "CLATの構成に失敗しました" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "CPU使用率(%)" @@ -1240,18 +1473,23 @@ msgstr "キャッシュ済" msgid "Call failed" msgstr "呼び出しに失敗しました" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "キャンセル" @@ -1259,32 +1497,32 @@ msgstr "キャンセル" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1293,24 +1531,32 @@ msgstr "" msgid "Category" msgstr "カテゴリー" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "証明書制限(ドメイン)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "証明書制限(SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "証明書制限(サブジェクト)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "証明書制限(ワイルドカード)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1318,8 +1564,8 @@ msgstr "" "証明書制限の一部(例: /CN=wifi.mycompany.com)
    実際の値については、ハン" "ドシェイク中に`logread -f`で確認してください" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1327,8 +1573,8 @@ msgstr "" "DNS SAN値に対する証明書の制限(使用可能な場合)
    またはサブジェクトCN(完" "全一致)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1336,8 +1582,8 @@ msgstr "" "DNS SAN値に対する証明書の制限(使用可能な場合)
    またはサブジェクトCN(サ" "フィックス一致)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1351,16 +1597,16 @@ msgstr "" msgid "Chain" msgstr "チェイン" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "変更" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "変更は取り消されました。" @@ -1371,18 +1617,19 @@ msgstr "デバイスにアクセスするための管理者パスワードを変 #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "チャンネル" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "チャネル分析" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "チャネル幅" @@ -1390,7 +1637,7 @@ msgstr "チャネル幅" msgid "Check filesystems before mount" msgstr "マウント前にファイルシステムをチェック" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" "この無線から既存のネットワークを削除する場合、このオプションを有効にしてくだ" @@ -1409,8 +1656,8 @@ msgstr "イメージのチェック中…" msgid "Choose mtdblock" msgstr "mtdblockを選択" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1422,7 +1669,7 @@ msgstr "" "ム
    フィールドにゾーン名を入力すると、新しくゾーンを作成し、このインター" "フェースを追加します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1430,7 +1677,7 @@ msgstr "" "この無線インターフェースを追加するネットワークを選択してください。カスタ" "ムフィールドにネットワーク名を入力すると新規ネットワークを作成します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "暗号" @@ -1454,9 +1701,10 @@ msgstr "" "\"mtdblockを保存\"をクリックすると、指定したmtdblockファイルをダウンロードし" "ます。(注意: この機能はプロ向けです!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "クライアント" @@ -1465,9 +1713,9 @@ msgstr "クライアント" msgid "Client ID to send when requesting DHCP" msgstr "DHCPリクエスト時に送信するクライアントID" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "閉じる" @@ -1484,20 +1732,20 @@ msgstr "" "設定した秒数後に、非アクティブな接続を閉じます。0を設定した場合、接続を維持し" "ます" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "リストを閉じる..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "データを収集中..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "コマンド" @@ -1514,7 +1762,7 @@ msgstr "コマンド実行失敗" msgid "Comment" msgstr "コメント" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1537,29 +1785,28 @@ msgstr "送信チェックサムを計算します(オプション)。" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "設定" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "設定が適用されました。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "設定がロールバックされました!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "設定に失敗しました" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 #, fuzzy msgid "" "Configures data rates based on the coverage cell density. Normal configures " @@ -1576,7 +1823,7 @@ msgstr "" "レートを24Mbpsに設定します。サポートされているレートが最小の基本レートよりも" "低い場合は提供されません。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." @@ -1584,7 +1831,7 @@ msgstr "" "RA メッセージ内の既定のルーター広" "告を設定します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1592,16 +1839,16 @@ msgstr "" "このデバイスにおける RA サービス" "の動作モードを設定します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "このデバイスにおける DHCPv6 サービスの動作モードを設定します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "このデバイスにおける NDP プロキシーサービスの動作モードを設定します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "設定…" @@ -1613,9 +1860,10 @@ msgstr "切断の確認" msgid "Confirmation" msgstr "確認" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "接続中" @@ -1625,11 +1873,11 @@ msgstr "接続中" msgid "Connection attempt failed" msgstr "接続の試行に失敗しました" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "接続の試行に失敗しました。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1641,7 +1889,7 @@ msgstr "接続が失われました" msgid "Connections" msgstr "接続数" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1669,9 +1917,9 @@ msgstr "任意のARP IPターゲットが到達可能な場合に、スレーブ msgid "Contents have been saved." msgstr "内容が保存されました。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1682,16 +1930,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1705,20 +1953,20 @@ msgstr "" msgid "Country" msgstr "国" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "国コード" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "通信エリアの密度" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "ファイアウォールゾーンの作成または割り当て" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "インターフェースを作成" @@ -1730,7 +1978,7 @@ msgstr "重大" msgid "Cron Log Level" msgstr "Cronログレベル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "現在の出力" @@ -1773,31 +2021,31 @@ msgstr "" "デバイスのLEDの動作をカスタマイズ" "します(デバイスが対応している場合)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAEクライアント" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAEポート" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAEシークレット" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCPサーバー" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCPおよびDNS" @@ -1808,16 +2056,22 @@ msgstr "DHCPおよびDNS" msgid "DHCP client" msgstr "DHCPクライアント" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCPオプション" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6クライアント" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6-サービス" @@ -1829,19 +2083,19 @@ msgstr "DHCPv6-サービス" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "DNSフォワーディング" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNS クエリポート" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "DNS 検索ドメイン" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "DNS サーバーポート" @@ -1849,7 +2103,7 @@ msgstr "DNS サーバーポート" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "DNS ウェイト" @@ -1857,11 +2111,11 @@ msgstr "DNS ウェイト" msgid "DNS-Label / FQDN" msgstr "DNS-ラベル / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "DNSSEC未署名チェック" @@ -1873,39 +2127,47 @@ msgstr "DPDアイドルタイムアウト" msgid "DS-Lite AFTR address" msgstr "DS-Lite AFTRアドレス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "DSLステータス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "DSL回線モード" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "DTIM間隔" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "データレート" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "受信済みデータ" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "送信済みデータ" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "デバッグ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1913,7 +2175,7 @@ msgstr "" msgid "Default state" msgstr "デフォルト状態" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1922,7 +2184,7 @@ msgstr "" "追加のDHCPオプションを設定します(例: クライアントに指定のDNSサーバーを通知す" "るには、\"6,192.168.2.1,192.168.2.2\"と設定します)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" @@ -1930,7 +2192,7 @@ msgstr "" "Linux 内部パケット優先度から VLAN ヘッダー優先度フィールドへのマッピングを定" "義します(送信フレーム用)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" @@ -1938,49 +2200,50 @@ msgstr "" "VLAN ヘッダー優先度フィールドから Linux 内部パケット優先度へのマッピングを定" "義します(受信フレーム用)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "IPv6 プレフィックスの委任" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "削除" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "鍵を削除" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "削除の要求に失敗しました: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "このネットワークを削除" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Delivery Traffic Indication Message(DTIM)間隔" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "説明" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "選択を解除" @@ -1988,11 +2251,11 @@ msgstr "選択を解除" msgid "Design" msgstr "デザイン" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2027,9 +2290,9 @@ msgstr "宛先ゾーン" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2039,36 +2302,40 @@ msgstr "宛先ゾーン" msgid "Device" msgstr "デバイス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "デバイス設定" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "デバイスはアクティブではありません" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "デバイスを再起動中…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "デバイス名" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "モデムマネージャーはデバイスを管理していません。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "デバイスが存在しません" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "デバイス タイプ" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "デバイスにアクセスできません!" @@ -2076,31 +2343,31 @@ msgstr "デバイスにアクセスできません!" msgid "Device unreachable! Still waiting for device..." msgstr "デバイスにアクセスできません!まだデバイスを待っています..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "デバイス" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "診断" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "ダイヤル番号" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "ディレクトリ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "無効" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2117,20 +2384,24 @@ msgstr "DNS逆引きを無効化" msgid "Disable Encryption" msgstr "暗号化を無効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "非アクティブ状態のポーリングを無効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "このネットワークを無効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2139,34 +2410,33 @@ msgstr "このネットワークを無効化" msgid "Disabled" msgstr "無効" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "無効" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 #, fuzzy msgid "Disassociate On Low Acknowledgement" msgstr "確認応答が不安定な場合、接続解除" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "アップストリームのRFC1918応答を破棄します。" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "切断" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "切断の試行に失敗しました" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "切断の試行に失敗しました。" @@ -2176,29 +2446,41 @@ msgstr "ディスク領域" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "閉じる" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "距離最適化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "一番遠い端末との距離(メートル単位)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDNSフォワーダーの両" "方を提供します" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "無効な応答をキャッシュしない(存在しないドメインからの応答など)" @@ -2221,34 +2503,25 @@ msgstr "無効な応答をキャッシュしない(存在しないドメイン msgid "Do not create host route to peer (optional)." msgstr "ピアへのホストルートを作成しない(オプション)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "DNS 名の無い DNS リクエストを転送しない" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "パブリックDNSサーバーが応答できないリクエストを転送しない" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "ローカルネットワークへの逆引きを転送しない" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "これらのインターフェースでのリッスンを停止します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "このデバイスで DHCPv6 サービスを提供しません" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "不参加" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2258,7 +2531,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "ホスト名を送信しない" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2266,11 +2539,11 @@ msgstr "" "このインターフェースでは RA メッセージを送信しません" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "本当に\"%s\"を削除しますか?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "本当に以下のSSH公開鍵を削除しますか?" @@ -2278,11 +2551,11 @@ msgstr "本当に以下のSSH公開鍵を削除しますか?" msgid "Do you really want to erase all settings?" msgstr "本当にすべての設定を消去しますか?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "本当にディレクトリ\"%s\"を再帰的に削除しますか?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2290,15 +2563,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "ドメイン必須" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "ドメインホワイトリスト" @@ -2324,11 +2599,11 @@ msgstr "バックアップをダウンロード" msgid "Download mtdblock" msgstr "mtdblockをダウンロード" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "下りSNRオフセット" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2342,16 +2617,54 @@ msgstr "ドラッグして並び替え" msgid "Drop Duplicate Frames" msgstr "重複フレームをドロップ" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbearインスタンス" @@ -2369,19 +2682,19 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "動的DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2389,7 +2702,7 @@ msgstr "" msgid "Dynamic tunnel" msgstr "動的トンネル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2397,21 +2710,33 @@ msgstr "" "クライアントに対して動的にDHCPアドレスを割り振ります。無効化した場合、固定IP" "アドレスが設定されたクライアントのみ接続できます。" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "EAビット長" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAPメソッド" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "編集" @@ -2419,6 +2744,10 @@ msgstr "編集" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2427,11 +2756,11 @@ msgstr "" "上記の設定データを編集してエラーを修正し、\"保存\"ボタンを押してページを再読" "み込みしてください。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "このネットワークを編集" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "無線ネットワークを編集" @@ -2440,44 +2769,34 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Egress QoS マッピング" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Egress タグ付き" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Egress タグ無し" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "緊急" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "有効化" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2485,11 +2804,11 @@ msgstr "" "IGMPスヌーピングを" "有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "STPを有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2507,10 +2826,11 @@ msgstr "フローの動的シャッフルを有効化" msgid "Enable HE.net dynamic endpoint update" msgstr "HE.netの動的エンドポイント更新を有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "IPv6 を有効化" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "IPv6ネゴシエーションを有効化" @@ -2524,11 +2844,15 @@ msgstr "IPv6ネゴシエーションを有効化" msgid "Enable IPv6 negotiation on the PPP link" msgstr "PPPリンクのIPv6ネゴシエーションを有効化" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "ジャンボフレームパススルーを有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "MAC アドレス学習を有効化" @@ -2540,11 +2864,11 @@ msgstr "NTPクライアントを有効化" msgid "Enable Single DES" msgstr "シングルDESを有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "TFTPサーバーを有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "VLAN フィルタリングを有効化" @@ -2552,7 +2876,7 @@ msgstr "VLAN フィルタリングを有効化" msgid "Enable VLAN functionality" msgstr "VLAN機能を有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "WPSプッシュボタンを有効にします。WPA(2)-PSK/WPA3-SAEが必要です" @@ -2566,14 +2890,14 @@ msgstr "" "title=\"Hypertext Transfer Protocol Secure\">HTTPS ポートへの自動リダ" "イレクトを有効にします。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" "このデバイスで利用可能な IPv6 プレフィックスのダウンストリーム委任を有効にし" "ます" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Key Reinstallation(KRACK)対策を有効化" @@ -2590,26 +2914,26 @@ msgstr "受信パケットのミラーリングを有効化" msgid "Enable mirroring of outgoing packets" msgstr "送信パケットのミラーリングを有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "マルチキャスト高速脱退を有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "マルチキャスト クエリアーを有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "マルチキャスト サポートを有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "すべてのCPUでパケットステアリングを有効にします。 ネットワーク速度を向上また" "は低下させることがあります。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "プロミスキャス モードを有効化" @@ -2631,11 +2955,11 @@ msgstr "マルチキャストトラフィックのサポートを有効化(オ msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "カプセル化されたパケットの DF(Don't Fragment)フラグを有効にします。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "ビルトインの単一インスタンス TFTP サーバーを有効化します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "このネットワークを有効化" @@ -2644,27 +2968,36 @@ msgstr "このネットワークを有効化" msgid "Enable tx checksum" msgstr "txチェックサムを有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "ユニキャスト フラッディングを有効化" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "有効" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "このブリッジのIGMPスヌーピングを有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "同じモビリティドメインを持つアクセスポイント間の高速ローミングを有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "このブリッジのスパニングツリープロトコル(STP)を有効化" @@ -2672,24 +3005,29 @@ msgstr "このブリッジのスパニングツリープロトコル(STP)を msgid "Encapsulation limit" msgstr "カプセル化限度" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "カプセル化モード" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "暗号化" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "エンドポイント" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "エンドポイントホスト" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "エンドポイントポート" @@ -2697,23 +3035,23 @@ msgstr "エンドポイントポート" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "IGMPv1 を強制" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "IGMPv2 を強制" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "IGMPv3 を強制" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "MLD バージョン1を強制" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "MLD バージョン2を強制" @@ -2742,10 +3080,6 @@ msgstr "エラー" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "エラー秒数(ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2764,11 +3098,17 @@ msgstr "30秒ごと(slow、0)" msgid "Every second (fast, 1)" msgstr "毎秒(fast、1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "除外するインターフェース" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2776,28 +3116,36 @@ msgstr "" "RBLサービスなどで使用される、上位サーバーからの特定範囲内(127.0.0.0/8)の応" "答を許可" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "存在するデバイス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "拡張ホスト" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 #, fuzzy msgid "Expecting a hexadecimal assignment hint" msgstr "16進数の割り当てヒントである必要があります" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "コロンで区切られた2つの優先度の値である必要があります" @@ -2806,11 +3154,11 @@ msgstr "コロンで区切られた2つの優先度の値である必要があ #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "%sである必要があります" @@ -2822,7 +3170,7 @@ msgstr "空ではない値である必要があります" msgid "Expires" msgstr "期限切れ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "リース期間は、最短で2分です(2m)。" @@ -2831,11 +3179,11 @@ msgstr "リース期間は、最短で2分です(2m)。" msgid "External" msgstr "外部" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "外部R0キーホルダーリスト" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "外部R1キーホルダーリスト" @@ -2863,35 +3211,63 @@ msgstr "追加のpppdオプション" msgid "Extra sstpc options" msgstr "追加のsstpcオプション" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT over DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT over the Air" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "FTプロトコル" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "システムパスワードの変更に失敗しました。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "%d秒以内に適用できませんでした。ロールバック中です…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "\"/etc/init.d/%s %s\"の実行に失敗しました: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "ファイル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 #, fuzzy msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " @@ -2901,26 +3277,26 @@ msgstr "" "title=\"Domain Name System\">DNS
    サーバーを指定するための、'server=/" "domain/1.2.3.4'や'server=1.2.3.4'といった行が含まれることがあります。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "ファイルにアクセスできません" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "DHCPリースが記録さ" "れるファイル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "ローカルDNSファイル" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "ファイル名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "クライアントに通知するブートイメージのファイル名" @@ -2929,15 +3305,22 @@ msgstr "クライアントに通知するブートイメージのファイル名 msgid "Filesystem" msgstr "ファイルシステム" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "プライベートフィルター" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -#, fuzzy -msgid "Filter useless" -msgstr "不要パケットフィルター" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "すべてのスレーブをフィルタリング(検証なし)" @@ -2950,8 +3333,13 @@ msgstr "すべてのスレーブをフィルタリング(アクティブなス msgid "Filtering for all slaves, validation only for backup slaves" msgstr "すべてのスレーブをフィルタリング(バックアップスレーブのみ検証)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "ファイナライズに失敗しました" @@ -2963,7 +3351,7 @@ msgstr "" "現在接続されているすべてのファイルシステムとスワップを検索し、検索結果に基づ" "いてデフォルト設定に置き換える" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "ネットワークの検索と参加" @@ -2977,10 +3365,11 @@ msgid "Firewall" msgstr "ファイアウォール" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "ファイアウォールマーク" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "ファイアウォール設定" @@ -2988,19 +3377,19 @@ msgstr "ファイアウォール設定" msgid "Firewall Status" msgstr "ファイアウォールステータス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "ファームウェアファイル" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "ファームウェア バージョン" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "DNSクエリを送信する送信元ポートを固定" @@ -3026,42 +3415,50 @@ msgstr "フラッシュ操作" msgid "Flashing…" msgstr "フラッシュ中…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "強制" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "強制40MHzモード" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "強制CCMP(AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" "別のDHCPサーバーが検出された場合でも、このネットワークのDHCPサーバー機能を強" "制します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "IGMP バージョンの強制" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "MLD バージョンの強制" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "強制TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "強制TKIP及びCCMP(AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "強制リンク" @@ -3073,11 +3470,11 @@ msgstr "強制アップグレード" msgid "Force use of NAT-T" msgstr "NAT-Tを強制的に使用" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "フォームトークンの不一致" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3099,7 +3496,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "DHCPトラフィックを転送" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3107,33 +3504,37 @@ msgstr "" "マスターとして指定されたインターフェースとダウンストリーム インターフェースと" "の間で DHCPv6 メッセージを転送します" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "前方誤り訂正秒(FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "ブロードキャストトラフィックを転送" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "転送遅延" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "メッシュピアトラフィックを転送" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" "このデバイス上では、マルチキャスト パケットをユニキャスト パケットとして転送" "します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "転送モード" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "フラグメンテーションしきい値" @@ -3157,7 +3558,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "GPRSのみ" @@ -3177,12 +3578,16 @@ msgstr "IPv4上のGRETAPトンネル" msgid "GRETAP tunnel over IPv6" msgstr "IPv6上のGRETAPトンネル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "ゲートウェイ" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "ゲートウェイポート" @@ -3192,23 +3597,23 @@ msgstr "ゲートウェイポート" msgid "Gateway address is invalid" msgstr "無効なゲートウェイアドレス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "一般設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "一般設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "デバイスの一般オプション" @@ -3216,7 +3621,7 @@ msgstr "デバイスの一般オプション" msgid "Generate Config" msgstr "設定を生成" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "ローカルでPMKを生成" @@ -3224,11 +3629,11 @@ msgstr "ローカルでPMKを生成" msgid "Generate archive" msgstr "アーカイブを生成" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3236,15 +3641,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3258,39 +3663,40 @@ msgstr "" msgid "Global Settings" msgstr "全体設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "グローバルネットワークオプション" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "ファームウェアのアップグレードへ移動..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "パスワード設定へ移動..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "関連する設定ページへ移動" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "DHCP設定へのアクセスを許可" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "DHCPステータス表示へのアクセスを許可" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "DSLステータス表示へのアクセスを許可" @@ -3302,6 +3708,10 @@ msgstr "LuCI OpenConnectプロシージャへのアクセスを許可" msgid "Grant access to LuCI Wireguard procedures" msgstr "LuCI Wireguardプロシージャへのアクセスを許可" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "SSH設定へのアクセスを許可" @@ -3338,7 +3748,7 @@ msgstr "マウント設定へのアクセスを許可" msgid "Grant access to network configuration" msgstr "ネットワーク設定へのアクセスを許可" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "ネットワーク診断ツールへのアクセスを許可" @@ -3346,6 +3756,10 @@ msgstr "ネットワーク診断ツールへのアクセスを許可" msgid "Grant access to network status information" msgstr "ネットワークステータス情報へのアクセスを許可" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "プロセスステータスへのアクセスを許可" @@ -3378,7 +3792,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "無線ステータス表示へのアクセスを許可" @@ -3407,15 +3821,11 @@ msgstr "HTTP(S) アクセス" msgid "Hang Up" msgstr "ハングアップ" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "ヘッダーエラーコードエラー(HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "ハートビート(kernel: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "ハロー間隔" @@ -3427,7 +3837,7 @@ msgstr "" "ここではホスト名やタイムゾーンなどのデバイスの基本的な設定をすることができま" "す。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "ESSIDを非表示" @@ -3436,17 +3846,25 @@ msgstr "ESSIDを非表示 msgid "Hide empty chains" msgstr "空のチェインを非表示" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "高" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3456,7 +3874,7 @@ msgstr "ホスト" msgid "Host expiry timeout" msgstr "ホスト有効期限タイムアウト" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3464,10 +3882,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "Host-Uniqタグコンテンツ" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3477,11 +3901,11 @@ msgstr "ホスト名" msgid "Hostname to send when requesting DHCP" msgstr "DHCPリクエスト時に送信するホスト名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "ホスト名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3537,23 +3961,27 @@ msgstr "IEEE 802.3adダイナミックリンクアグリゲーション(802.3a msgid "IKE DH Group" msgstr "IKE DHグループ" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IPアドレス" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "IPプロトコル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "IPの種類" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3569,7 +3997,7 @@ msgstr "無効なIPアドレスです" msgid "IP address is missing" msgstr "IPアドレスがありません" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3581,20 +4009,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "本物でないNXドメインを上書き" @@ -3602,14 +4030,15 @@ msgstr "本物でないNXドメインを上書き" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3625,7 +4054,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "IPv4 ルーティング" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "IPv4 ルール" @@ -3635,7 +4064,7 @@ msgstr "IPv4アップストリーム" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3662,7 +4091,7 @@ msgstr "IPv4ネットマスク" msgid "IPv4 network in address/netmask notation" msgstr "IPv4ネットワーク(アドレス/ネットマスク表記)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "IPv4のみ" @@ -3675,11 +4104,11 @@ msgstr "IPv4プレフィックス" msgid "IPv4 prefix length" msgstr "IPv4プレフィックス長" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3688,16 +4117,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-in-IPv4(RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6(両方 - デフォルトはIPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3708,7 +4141,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3716,7 +4150,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6ファイアウォール" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3724,7 +4158,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "IPv6隣接装置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "IPv6 RA 設定" @@ -3732,15 +4170,15 @@ msgstr "IPv6 RA 設定" msgid "IPv6 Routing" msgstr "IPv6 ルーティング" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "IPv6 ルール" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "IPv6設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6 ULAプレフィックス" @@ -3754,12 +4192,12 @@ msgstr "IPv6アップストリーム" msgid "IPv6 address" msgstr "IPv6アドレス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "IPv6割り当てヒント" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "IPv6割り当て長" @@ -3771,11 +4209,11 @@ msgstr "IPv6ゲートウェイ" msgid "IPv6 network in address/netmask notation" msgstr "IPv6ネットワーク(アドレス/ネットマスク表記)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "IPv6のみ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3784,7 +4222,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "IPv6 プレフィックス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3798,25 +4236,19 @@ msgstr "IPv6プレフィックス長" msgid "IPv6 routed prefix" msgstr "IPv6ルートプレフィックス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "IPv6サフィックス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"IPv6-サフィックス(16進" -"数)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "IPv6サポート" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3824,6 +4256,10 @@ msgstr "" msgid "IPv6-PD" msgstr "IPv6 PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3839,10 +4275,16 @@ msgstr "IPv6-over-IPv4(6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-over-IPv4(6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "識別子" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "チェックを付けると、1DESが有効になります" @@ -3855,13 +4297,13 @@ msgstr "チェックを付けると、pppdオプションに\"+ipv6\"が追加 msgid "If checked, encryption is disabled" msgstr "チェックを付けると、暗号化が無効になります" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3879,21 +4321,23 @@ msgid "" msgstr "" "固定のデバイスノード名のかわりに、パーティションラベルを使用してマウント" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "チェックが付いていない場合、デフォルトルートは構成されません" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "チェックが付いていない場合、通知されたDNSサーバーアドレスを無視します" @@ -3911,15 +4355,23 @@ msgstr "" "ことができます。ただし、スワップデバイスはRAMに比べてとても遅いことに注意してください。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "/etc/hostsを無視" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "インターフェースを無視" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "リゾルバファイルを無視" @@ -3931,25 +4383,25 @@ msgstr "イメージ" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3961,7 +4413,21 @@ msgstr "" msgid "In" msgstr "イン" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -3969,7 +4435,7 @@ msgstr "" "システムへの不正アクセスを防ぐために、リクエストはブロックされました。下の" "\"続行\"をクリックして、前のページに戻ります。" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -4001,7 +4467,7 @@ msgstr "" msgid "Incoming checksum" msgstr "受信チェックサム" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -4009,6 +4475,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "受信キー" @@ -4027,22 +4494,21 @@ msgstr "情報" msgid "Information" msgstr "情報" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "Ingress QoS マッピング" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "初期化失敗" @@ -4054,31 +4520,41 @@ msgstr "起動スクリプト" msgid "Initscripts" msgstr "起動スクリプト" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "内部証明書制約(ドメイン)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "内部証明書制約(SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "内部証明書制約(件名)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "内部証明書制約(ワイルドカード)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "プロトコル拡張機能をインストール..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4090,6 +4566,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "UCI設定を読み取るための権限がありません。" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4097,7 +4577,7 @@ msgstr "UCI設定を読み取るための権限がありません。" msgid "Interface" msgstr "インターフェース" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -4105,7 +4585,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "インターフェース%qデバイスは、%qから%qへ自動的に移行されました。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "インターフェース設定" @@ -4136,25 +4616,25 @@ msgstr "インターフェースが再接続中..." msgid "Interface is shutting down..." msgstr "インターフェースをシャットダウン中..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "インターフェースを開始中..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "インターフェースを停止中..." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 msgid "Interface name" -msgstr "インターフェース名" +msgstr "インターフェイス名" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "インターフェースが存在しないか、接続されていません。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "インターフェース" @@ -4163,22 +4643,26 @@ msgstr "インターフェース" msgid "Internal" msgstr "内部" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "内部サーバーエラー" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "学習パケット送信間隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "STP ハロー パケットの間隔(秒)" @@ -4188,8 +4672,9 @@ msgid "Invalid" msgstr "無効" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4199,6 +4684,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "無効なBase64キー文字列" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4221,7 +4710,7 @@ msgstr "無効なVLAN IDです!重複しないIDを入力してください" msgid "Invalid argument" msgstr "無効な引数" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4237,17 +4726,38 @@ msgstr "無効なコマンド" msgid "Invalid hexadecimal value" msgstr "無効な16進数" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "" "ユーザー名とパスワードのどちらかもしくは両方が間違っています!もう一度入力し" "てください。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "クライアント間の分離" @@ -4260,25 +4770,25 @@ msgstr "" "フラッシュしようとしたイメージファイルはこのフラッシュメモリー向けではありま" "せん。イメージファイルを確認してください!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "JavaScriptが必要です!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "ネットワークに接続" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "ネットワークに接続: 無線スキャン" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "ネットワークに接続中: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4286,24 +4796,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "現在の設定を残す" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "カーネルログ" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "カーネル バージョン" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "キー" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "キー#%d" @@ -4311,6 +4825,7 @@ msgstr "キー#%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "受信パケットのキー(オプション)。" @@ -4318,14 +4833,19 @@ msgstr "受信パケットのキー(オプション)。" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "送信パケットのキー(オプション)。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4370,7 +4890,7 @@ msgstr "LCP echo送信間隔" msgid "LED Configuration" msgstr "LED設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4387,32 +4907,39 @@ msgstr "言語" msgid "Language and Style" msgstr "言語とスタイル" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "遅延" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "最新のハンドシェイク" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Leaf" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "学習" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "リースファイル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "リース期間" @@ -4436,7 +4963,7 @@ msgstr "空欄の場合、自動的に検出" msgid "Leave empty to use the current WAN address" msgstr "空欄の場合、現在のWANアドレスを使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4447,31 +4974,27 @@ msgstr "" "する可能性があります。 可能な限り 802.11b レートを許可しないことをお勧めしま" "す。" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "レガシー ルールを検出" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "凡例:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "制限" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "回線減衰(LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "回線モード" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "回線状態" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "回線稼働時間" @@ -4492,16 +5015,20 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "NXドメインの嘘の結果を提供するホストのリスト" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" +"ここで指定されたFQDNのDNSルックアップ結果のIPを投入するIPsetのリストも指定す" +"る。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4514,7 +5041,7 @@ msgstr "" "ドメインアソシエーションでSTAが使用したR0KHからPMK-R1キーを要求する際に、" "R0KH-ID(NAS識別子)を宛先MACアドレスにマッピングするために使用されます。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4532,25 +5059,22 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "認証用SSHキーファイルのリスト" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "RFC1918の応答を許可するドメインのリスト" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "これはIPアドレスに強制的に設定するドメインのリスト。" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" "リクエストを転送するDNSサーバーのリ" "スト" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "リッスンポート" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "リッスンインターフェース" @@ -4560,7 +5084,7 @@ msgstr "" "指定されたインターフェースでのみリッスンを行います。設定しない場合はすべて対" "象" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4570,7 +5094,7 @@ msgstr "リッスンをこれらのインターフェースとループバック msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "受信DNSクエリをリッスンするポート" @@ -4579,7 +5103,7 @@ msgstr "受信DNSクエリをリッスンするポート" msgid "Load" msgstr "負荷" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "システム平均負荷" @@ -4587,27 +5111,28 @@ msgstr "システム平均負荷" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "ディレクトリの内容を読み込み中…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "画面表示を読み込み中…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "ローカル" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "ローカルIPアドレス" @@ -4627,11 +5152,12 @@ msgstr "割り当てるローカル IPアドレス" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "ローカルIPv4アドレス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "ローカル IPv6 DNS サーバー" @@ -4647,44 +5173,70 @@ msgstr "ローカルIPv6アドレス" msgid "Local Startup" msgstr "ローカルスタートアップ" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "時刻" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "ローカル ULA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "ローカルドメイン" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "DHCP名とhostsファイルの項目に追加される、ローカルドメインサフィックス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "ローカルサーバー" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "ローカルサービスのみ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "クエリをローカライズ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "BSSIDにロック" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "ログイン" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "ログイン…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "ログアウト" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "ログ出力レベル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "ログクエリ" @@ -4710,38 +5262,29 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "トンネルが追加される(ブリッジされる)論理ネットワーク(オプション)。" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "ログイン" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "ログアウト" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "緩いフィルタリング" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "信号損失秒数(LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "" "これはネットワークアドレスをオフセットとした、最小のリースアドレスです。" +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC アドレス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "MACアドレスフィルタ" @@ -4750,16 +5293,15 @@ msgstr "MACアドレスフィルタ" msgid "MAC Address For The Actor" msgstr "アクターのMACアドレス" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC ベース VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4768,11 +5310,15 @@ msgstr "MAC ベース VLAN" msgid "MAC address" msgstr "MAC アドレス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MACフィルタ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "MACリスト" @@ -4786,6 +5332,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "無効なMAPルールです" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4807,15 +5357,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "MII間隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4824,7 +5378,7 @@ msgstr "" "次のようなコマンドを使用して、ルートファイルシステムを複製してください:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4833,77 +5387,85 @@ msgstr "" msgid "Manual" msgstr "手動" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "マスター" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "到達可能な最大データレート(ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "最大DHCP割り当て数" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "最大EDNS0" "パケットサイズ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "最大並列処理クエリ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "許容される最大リッスン間隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "許容される最大DHCP割り当て数" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "許容される最大の並列DNSクエリ数" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "許容される最大EDNS.0 UDPパケットサイズ" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "モデムの準備が完了するまでの最大の待ち時間(秒)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "リースされるアドレスの最大数です。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "スヌーピング テーブルの最大サイズ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "最大送信出力" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4930,7 +5492,7 @@ msgstr "メモリ" msgid "Memory usage (%)" msgstr "メモリ使用率(%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "メッシュ" @@ -4938,10 +5500,18 @@ msgstr "メッシュ" msgid "Mesh ID" msgstr "メッシュID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "メッシュID" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "メソッドが見つかりません" @@ -4954,7 +5524,7 @@ msgstr "リンクを監視する方法" msgid "Method to determine link status" msgstr "リンクの状態を確認する方法" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4965,11 +5535,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4977,13 +5547,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "最小のリンク数" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4997,36 +5567,49 @@ msgstr "ミラー監視ポート" msgid "Mirror source port" msgstr "ミラー元ポート" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "モバイルデータ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "モビリティドメイン" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "モード" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "モデル" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -#, fuzzy -msgid "Modem bearer teardown in progress." -msgstr "モデムベアラを終了中です。" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5034,43 +5617,36 @@ msgstr "" "モデム接続中です。しばらくお待ちください。この処理は2分後にタイムアウトしま" "す。" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "モデムデフォルト" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "モデムデバイス" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "モデム切断中です。しばらくお待ちください。" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "モデム情報の問い合わせに失敗しました" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "モデム初期化タイムアウト" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "モデムは無効です。" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "モデムマネージャー" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "モニター" @@ -5140,6 +5716,10 @@ msgstr "下へ移動" msgid "Move up" msgstr "上へ移動" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5147,19 +5727,23 @@ msgstr "上へ移動" msgid "Multicast" msgstr "マルチキャスト" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "マルチキャスト ルーティング" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5171,12 +5755,16 @@ msgstr "NAT-Tモード" msgid "NAT64 Prefix" msgstr "NAT64プレフィックス" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5189,18 +5777,23 @@ msgid "NTP server candidates" msgstr "NTPサーバー候補" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "名前" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "新規ネットワークの名前" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "ナビゲーション" @@ -5209,13 +5802,17 @@ msgstr "ナビゲーション" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5224,32 +5821,36 @@ msgstr "" msgid "Network" msgstr "ネットワーク" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "ネットワークSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "ネットワークユーティリティ" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "ネットワークブートイメージ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "ネットワークデバイス" @@ -5262,7 +5863,7 @@ msgstr "ネットワークデバイスアクティビティ(kernel: netdev)" msgid "Network device is not present" msgstr "ネットワークデバイスが存在しません" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5271,7 +5872,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5280,15 +5881,21 @@ msgstr "" msgid "Network interface" msgstr "ネットワークインターフェース" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "なし" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "なし" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5296,11 +5903,11 @@ msgstr "" "ローカルドメインの定義です。この名前に一致するドメインは転送が行われず、 DHCP" "または hostsファイルのみで解決されます" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "\"%s\"の新規インターフェースを作成できません: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "新規インターフェース名…" @@ -5308,13 +5915,13 @@ msgstr "新規インターフェース名…" msgid "Next »" msgstr "次 »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "いいえ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "このインターフェースにはDHCPサーバーが設定されていません" @@ -5322,7 +5929,7 @@ msgstr "このインターフェースにはDHCPサーバーが設定されて msgid "No Data" msgstr "データなし" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "暗号化なし" @@ -5338,9 +5945,17 @@ msgstr "NAT-Tを使用しない" msgid "No RX signal" msgstr "RX信号なし" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5353,7 +5968,11 @@ msgstr "" msgid "No client associated" msgstr "接続済みクライアントなし" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5362,8 +5981,8 @@ msgstr "" msgid "No data received" msgstr "受信済みデータなし" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "強制しない" @@ -5376,15 +5995,11 @@ msgstr "強制しない" msgid "No entries available" msgstr "利用可能な項目はありません" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "このディレクトリ内にエントリーがありません" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "ファイルが見つかりません" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5398,7 +6013,7 @@ msgstr "" msgid "No host route" msgstr "ホストルートなし" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5420,30 +6035,40 @@ msgstr "これ以上利用可能なスレーブがありません" msgid "No more slaves available, can not save interface" msgstr "これ以上利用可能なスレーブがないため、インターフェースを保存できません" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "ネガティブキャッシュなし" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "パスワードが設定されていません!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "未接続" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "まだ公開鍵はありません。" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5457,7 +6082,8 @@ msgid "No validation or filtering" msgstr "検証またはフィルタリングなし" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "割り当てられたゾーンがありません" @@ -5469,37 +6095,40 @@ msgstr "割り当てられたゾーンがありません" msgid "Noise" msgstr "ノイズ" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "ノイズマージン(SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "ノイズ:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "非プリエンプティブCRCエラー(CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "非ワイルドカード" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "なし" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "標準" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "見つかりません" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "接続されていません" @@ -5512,7 +6141,7 @@ msgstr "未接続" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "存在しません" @@ -5524,7 +6153,7 @@ msgstr "ブート時に開始されていません" msgid "Not supported" msgstr "サポートされていません" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5532,6 +6161,12 @@ msgstr "" "注:一部のワイヤレス ドライバーは、802.11w を完全にはサポートしていません。 " "例えば、 mwlwifi に問題がある可能性があります" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "備考" @@ -5540,7 +6175,7 @@ msgstr "備考" msgid "Notice" msgstr "注意" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5548,7 +6183,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "IGMPメンバーシップレポートの数" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "キャッシュされるDNSエントリーの数(最大10000件、0の場合キャッシュしない)" @@ -5566,7 +6201,7 @@ msgid "Obfuscated Password" msgstr "難読化されたパスワード" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5577,6 +6212,7 @@ msgid "Obtain IPv6 address" msgstr "IPv6アドレス取得" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "オフ" @@ -5585,6 +6221,12 @@ msgstr "オフ" msgid "Off-State Delay" msgstr "消灯時間" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "オン" @@ -5593,15 +6235,15 @@ msgstr "オン" msgid "On-State Delay" msgstr "点灯時間" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "On-Linkルート" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "ホスト名またはMACアドレスを指定してください!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "次のうちいずれか1つ: %s" @@ -5619,7 +6261,11 @@ msgstr "タブに1つ以上の無効/必須の値があります" msgid "One or more required fields have no value!" msgstr "1つ以上のフィールドに値が設定されていません!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "有効な場合、分離されていないブリッジ ポートでの通信のみ許可します" @@ -5630,49 +6276,60 @@ msgstr "" "現在アクティブなスレーブが失敗し、プライマリスレーブが起動している場合のみ" "(failure、2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "iptables ルールの概要を開く…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "リストを開く..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect(CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "動作周波数" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "オプション\"%s\"に無効な入力値が含まれています。" @@ -5680,22 +6337,31 @@ msgstr "オプション\"%s\"に無効な入力値が含まれています。" msgid "Option \"%s\" must not be empty." msgstr "オプション\"%s\"を設定してください。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "変更されるオプション" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "削除されるオプション" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "オプション" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "このデバイスについての備考(オプション)" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5704,7 +6370,7 @@ msgstr "" "暗号化された送信パケットの32ビットマークです。0xから始まる16進数" "を入力してください(オプション)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5716,7 +6382,7 @@ msgstr "" "(例: '::1')を指定します(オプション) 。使用できる値: 'eui64','random'また" "は'::1'や'::1:2'のような固定値。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 #, fuzzy msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " @@ -5725,11 +6391,11 @@ msgstr "" "Base64でエンコードされた事前共有キーです。ポスト量子レジスタンスのため、対称" "鍵暗号の追加層を追加します(オプション)。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "このピアの許可されたIPのルートを作成します(オプション)。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "ピアの説明(オプション)。" @@ -5737,7 +6403,7 @@ msgstr "ピアの説明(オプション)。" msgid "Optional. Do not create host routes to peers." msgstr "ピアへのホストルートを作成しない(オプション)。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." @@ -5745,7 +6411,7 @@ msgstr "" "ピアのホストです。名前はインターフェースの起動前に解決されます(オプショ" "ン)。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5760,11 +6426,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "トンネルインターフェースのMaximum Transmission Unit(オプション)。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "ピアのポート(オプション)。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5772,7 +6438,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 #, fuzzy msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " @@ -5789,7 +6455,7 @@ msgstr "送信パケットと受信パケットに使用されるUDPポート( msgid "Options" msgstr "オプション" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "CA証明書のパス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "クライアント証明書のパス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "秘密鍵のパス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "内部CA証明書のパス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "内部クライアント証明書のパス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "内部秘密鍵のパス" @@ -6161,11 +6871,19 @@ msgstr "一時停止中" msgid "Peak:" msgstr "ピーク:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "ピア" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "割り当てるピアIPアドレス" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "ピアの MAC アドレス" @@ -6174,11 +6892,11 @@ msgstr "ピアの MAC アドレス" msgid "Peer address is missing" msgstr "ピアアドレスがありません" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "ピアのデバイス名" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6209,10 +6927,14 @@ msgstr "初期化する" msgid "Permission denied" msgstr "アクセス許可が拒否されました" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "永続的なキープアライブ" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6221,13 +6943,13 @@ msgstr "" msgid "Phy Rate:" msgstr "物理レート:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "デバイス設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6240,11 +6962,11 @@ msgstr "Ping" msgid "Pkts." msgstr "パケット" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "ユーザー名とパスワードを入力してください。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "アップロードするファイルを選択してください。" @@ -6252,57 +6974,76 @@ msgstr "アップロードするファイルを選択してください。" msgid "Policy" msgstr "ポリシー" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "ポート" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "ポート %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "ポート分離" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "ポートステータス:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 #, fuzzy msgid "Potential negation of: %s" msgstr "存在しない可能性があります: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "電力管理モード" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "プリエンプティブCRCエラー(CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "LTEを優先" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "UMTSを優先" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "委任されたプレフィックス(PD)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "事前共有鍵" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6327,15 +7068,16 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "クライアント同士の通信を制限" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "プライマリスレーブ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "プライマリー VLAN ID" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6349,29 +7091,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "プライマリが復旧するとアクティブスレーブになります(always、0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "優先度" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "プライベート(MAC ベース VLAN間の通信を防ぐ)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "秘密鍵" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6389,8 +7133,8 @@ msgid "Prot." msgstr "プロトコル" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6402,7 +7146,7 @@ msgstr "プロトコル" msgid "Provide NTP server" msgstr "NTPサーバーを有効化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6410,7 +7154,7 @@ msgstr "" "このインターフェースで DHCPv6 サーバーを提供し、 DHCPv6 の要請やリクエストに" "応答します" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "新しいネットワークを設定" @@ -6420,25 +7164,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "擬似アドホック(ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "公開鍵" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6469,61 +7224,85 @@ msgstr "QMIセルラー" msgid "Quality" msgstr "品質" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" "利用可能なすべての上位DNSサーバに問" "い合わせる" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "クエリー間隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "クエリー レスポンス間隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "R0キー有効期限" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "R1キーホルダー" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Radiusアカウンティング-ポート" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Radiusアカウンティング-秘密鍵" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Radiusアカウンティング-サーバー" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Radius認証-ポート" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Radius認証-秘密鍵" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Radius認証-サーバー" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "RFC3947 NAT-Tモード" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "ネットワークに接続するためのRSSIしきい値" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "RTS/CTSしきい値" @@ -6536,10 +7315,16 @@ msgstr "RX" msgid "RX Rate" msgstr "受信レート" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "受信レート/送信レート" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6551,13 +7336,13 @@ msgstr "" "16進数でエンコードされた、生のバイト値です。 ISPがこれを要求しない場合、空欄" "にしてください" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" "/etc/ethersを元にDHCPサーバーを設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "本当にプロトコルを変更しますか?" @@ -6565,11 +7350,11 @@ msgstr "本当にプロトコルを変更しますか?" msgid "Realtime Graphs" msgstr "リアルタイムグラフ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "再接続制限時間" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "DNSリバインディング保護" @@ -6593,11 +7378,40 @@ msgstr "デバイスのオペレーティングシステムを再起動" msgid "Receive" msgstr "受信" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "受信" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "WireGuardインターフェースのIPアドレスです(推奨)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "このインターフェースを再接続" @@ -6605,12 +7419,12 @@ msgstr "このインターフェースを再接続" msgid "Redirect to HTTPS" msgstr "HTTPS へのリダイレクト" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6619,37 +7433,47 @@ msgstr "" msgid "References" msgstr "参照" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "更新中" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "リレー" @@ -6659,6 +7483,10 @@ msgstr "リレー" msgid "Relay Bridge" msgstr "リレーブリッジ" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "ネットワーク間のリレー" @@ -6668,6 +7496,14 @@ msgstr "ネットワーク間のリレー" msgid "Relay bridge" msgstr "リレーブリッジ" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6677,6 +7513,7 @@ msgstr "リモートIPv4アドレス" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "リモートIPv4アドレスまたはFQDN" @@ -6689,15 +7526,23 @@ msgstr "リモートIPv6アドレス" msgid "Remote IPv6 address or FQDN" msgstr "リモートIPv6アドレスまたはFQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "削除" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "関連するデバイス構成を設定から削除します" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "無線設定を置換" @@ -6727,7 +7572,8 @@ msgstr "受信チェックサムを要求(オプション)。" msgid "Require incoming packets serialization (optional)." msgstr "受信パケットのシリアル化を要求(オプション)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "必須" @@ -6743,7 +7589,7 @@ msgstr "このインターフェースに使用するBase64エンコードの秘 msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6755,67 +7601,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "hostapdが必要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "EAP Suite-Bをサポートするhostapdが必要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "EAPをサポートするhostapdが必要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "OWEをサポートするhostapdが必要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "SAEをサポートするhostapdが必要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "WEPをサポートするhostapdが必要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "wpa-supplicantが必要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "EAP Suite-Bをサポートするwpa-supplicantが必要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "EAPをサポートするwpa-supplicantが必要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "OWEをサポートするwpa-supplicantが必要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "SAEをサポートするwpa-supplicantが必要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "WEPをサポートするwpa-supplicantが必要" @@ -6825,7 +7677,7 @@ msgid "Reselection policy for primary slave" msgstr "プライマリスレーブの再選択ポリシー" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6840,20 +7692,24 @@ msgstr "カウンターをリセット" msgid "Reset to defaults" msgstr "初期化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "リゾルバとホストファイル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "リゾルバファイル" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "これはIPアドレスに強制的に設定するドメインのリスト。" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "リソースが見つかりません" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "再起動" @@ -6862,7 +7718,7 @@ msgstr "再起動" msgid "Restart Firewall" msgstr "ファイアウォールを再起動" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "無線インターフェースを再起動" @@ -6874,7 +7730,7 @@ msgstr "復元" msgid "Restore backup" msgstr "バックアップを復元" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -6882,80 +7738,91 @@ msgstr "" "複数のIPが利用可能な場合、リクエスト中のサブネットによってホスト名をローカラ" "イズ" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "パスワードを表示/隠す" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "戻り経路フィルター" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "元に戻す" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "変更の取り消し" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "取り消しのリクエストに失敗しました ステータスコード:%h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "設定を元に戻しています…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "堅牢性" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6970,19 +7837,19 @@ msgstr "ルートの準備" msgid "Round-Robin policy (balance-rr, 0)" msgstr "ラウンドロビンポリシー(balance-rr、0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "許可されたIPのルート" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "ルートタイプ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7000,6 +7867,10 @@ msgstr "ルーターパスワード" msgid "Routing" msgstr "ルーティング" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7014,24 +7885,24 @@ msgstr "" msgid "Rule" msgstr "ルール" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -7051,11 +7922,24 @@ msgstr "ランタイムエラー" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7073,15 +7957,15 @@ msgstr "SSHサーバーポート" msgid "SSH username" msgstr "SSHユーザー名" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH-キー" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7098,7 +7982,7 @@ msgstr "SSTPサーバー" msgid "SWAP" msgstr "スワップ" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7109,7 +7993,7 @@ msgid "Save" msgstr "保存" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "保存&適用" @@ -7126,7 +8010,7 @@ msgstr "mtdblockを保存" msgid "Save mtdblock contents" msgstr "mtdblockの内容を保存" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "スキャン" @@ -7135,11 +8019,16 @@ msgstr "スキャン" msgid "Scheduled Tasks" msgstr "スケジュールタスク" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "追加されるセクション" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "削除されるセクション" @@ -7157,9 +8046,9 @@ msgstr "" "を選択してください。正しいファームウェアであること、デバイスに適したものであ" "ることが確かな場合のみ使用してください!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "ファイルを選択…" @@ -7167,7 +8056,7 @@ msgstr "ファイルを選択…" msgid "Selects the transmit hash policy to use for slave selection" msgstr "スレーブ選択時に使用する送信ハッシュポリシーを選択" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7175,7 +8064,7 @@ msgstr "" "このデバイスを IPv6 ルーターとして広告する RA メッセージを送信します" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "ICMP リダイレクトを送信" @@ -7196,11 +8085,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "このデバイスのホスト名を送信" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7225,16 +8118,20 @@ msgstr "セッション期限切れ" msgid "Set Static" msgstr "静的に設定" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7246,14 +8143,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "すべてのスレーブに同じMACアドレスを設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7268,11 +8165,15 @@ msgstr "現在アクティブなスレーブに設定(active、1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "bondに追加された最初のスレーブに設定(follow、2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "DHCPサーバーをセットアップ" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7280,33 +8181,37 @@ msgid "Setting PLMN failed" msgstr "PLMNの設定に失敗しました" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "操作モードの設定に失敗しました" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "重大エラー秒数(SES)" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "ショートGI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "ショートプリアンブル" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "現在のバックアップファイルリストを表示" @@ -7319,16 +8224,16 @@ msgstr "空のチェインを表示" msgid "Show raw counters" msgstr "生のカウンターを表示" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "このインターフェースをシャットダウン" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7336,15 +8241,15 @@ msgstr "このインターフェースをシャットダウン" msgid "Signal" msgstr "信号強度" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "信号強度 / ノイズ" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "信号減衰(SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "信号のリフレッシュ レート" @@ -7352,12 +8257,12 @@ msgstr "信号のリフレッシュ レート" msgid "Signal:" msgstr "信号:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "サイズ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "DNSクエリキャッシュのサイズ" @@ -7374,12 +8279,12 @@ msgstr "スキップ" msgid "Skip from backup files that are equal to those in /rom" msgstr "/rom 内のデフォルトから未変更のファイルはバックアップをスキップ" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "コンテンツへ移動" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "ナビゲーションへ移動" @@ -7397,15 +8302,11 @@ msgstr "ソフトウェア VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "フィールドに無効な値が設定されているため、保存できません!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "" "申し訳ありませんが、リクエストされたオブジェクトは見つかりませんでした。" -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "申し訳ありませんが、サーバーに予期しないエラーが発生しました。" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7416,8 +8317,8 @@ msgstr "" "は手動で行う必要があります。このデバイスへのインストール方法については、wiki" "を参照してください。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7444,19 +8345,19 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7466,7 +8367,7 @@ msgstr "" "す。未指定である場合、ローカル IPv6 DNS サーバーオプションが無効でな" "い限り、デバイスは自身を IPv6 DNS サーバーとしてアナウンスします。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7492,7 +8393,7 @@ msgstr "ARPモニタリングに使用するIPアドレスを指定" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "MIIリンクのモニタリング頻度をミリ秒単位で指定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7500,7 +8401,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "使用するアグリゲーション選択ロジックを指定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7508,20 +8409,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "デバイスが接続するディレクトリを指定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7552,7 +8453,7 @@ msgid "" "dead" msgstr "ホストが停止しているとみなされるまでの最大秒数を指定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7572,7 +8473,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "このボンディングインターフェースに使用するモードを指定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7611,15 +8512,15 @@ msgstr "" "ボンディングドライバが各スレーブピアスイッチにラーニングパケットを送信するイ" "ンスタンス間の秒数を指定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7645,19 +8546,19 @@ msgstr "" "アクティブなスレーブの障害またはプライマリスレーブのリカバリが発生した際の、" "プライマリスレーブの再選択ポリシーを指定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7677,7 +8578,7 @@ msgid "" "link recovery detection" msgstr "リンク回復検出後にスレーブを有効にするまでの待機時間をミリ秒単位で指定" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7797,15 +8698,23 @@ msgid "" "bytes)." msgstr "デフォルト(1280バイト)以外のMTU(最大伝送単位)を指定します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "ここで秘密暗号鍵を指定します。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "開始" @@ -7818,16 +8727,16 @@ msgstr "WPS開始" msgid "Start priority" msgstr "開始優先順位" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "更新開始" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "設定の適用を開始しています…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "無線のスキャンを開始しています..." @@ -7836,6 +8745,10 @@ msgstr "無線のスキャンを開始しています..." msgid "Startup" msgstr "スタートアップ" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "IPv4静的ルーティング" @@ -7849,7 +8762,7 @@ msgstr "IPv6静的ルーティング" msgid "Static Lease" msgstr "静的リース" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "静的リース" @@ -7859,7 +8772,7 @@ msgstr "静的リース" msgid "Static address" msgstr "静的アドレス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7869,18 +8782,18 @@ msgstr "" "スト名をアサインします。また、クライアントは対応するリースを使用するホストが" "その1台のみで、かつ静的なインターフェース設定にする必要があります。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "非アクティブなステーションの制限" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "ステータス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "停止" @@ -7889,8 +8802,8 @@ msgstr "停止" msgid "Stop WPS" msgstr "WPS停止" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "更新停止" @@ -7898,11 +8811,11 @@ msgstr "更新停止" msgid "Storage" msgstr "ストレージ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "厳密なフィルタリング" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "問い合わせの制限" @@ -7911,15 +8824,15 @@ msgid "Strong" msgstr "å¼·" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "送信" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "ログの抑制" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "これらのプロトコルの、ルーチン操作のログを抑制" @@ -7952,7 +8865,7 @@ msgstr "スイッチVLAN" msgid "Switch port" msgstr "スイッチ ポート" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "プロトコルを切り替える" @@ -7962,7 +8875,7 @@ msgstr "プロトコルを切り替える" msgid "Switch to CIDR list notation" msgstr "CIDRリスト表記へ切り替える" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "シンボリックリンク" @@ -7974,8 +8887,16 @@ msgstr "NTPサーバーと同期" msgid "Sync with browser" msgstr "ブラウザと同期" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "文法: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "文法: _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7999,9 +8920,9 @@ msgstr "システムプロパティ" msgid "System log buffer size" msgstr "システムログバッファサイズ" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "システムはリカバリー (initramfs) モードで実行中です。" @@ -8030,7 +8951,7 @@ msgstr "" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "TFTPサーバールート" @@ -8043,26 +8964,37 @@ msgstr "TX" msgid "TX Rate" msgstr "送信レート" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "テーブル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "ターゲット" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "ターゲット プラットフォーム" @@ -8078,26 +9010,26 @@ msgstr "一時領域" msgid "Terminate" msgstr "停止" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8113,7 +9045,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8128,18 +9064,24 @@ msgstr "" "HE.netのエンドポイント更新構成を変更した場合、ユーザーIDの代わりに通常のユー" "ザー名を使用する必要があります!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "リモートエンドのIPv4アドレスまたは完全修飾ドメイン名です。" @@ -8147,6 +9089,7 @@ msgstr "リモートエンドのIPv4アドレスまたは完全修飾ドメイ #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "リモートトンネルエンドのIPv4アドレスまたは完全修飾ドメイン名です。" @@ -8161,6 +9104,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "リモートトンネルエンドのIPv6アドレスまたは完全修飾ドメイン名です。" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8173,7 +9122,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "LED は設定されたオン/オフ間隔に基づいて点滅します。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "LED は心拍を再現するように点滅します。" @@ -8192,21 +9141,25 @@ msgstr "LED はデフォルトの状態で常にオフです。" msgid "The LED is always in default state on." msgstr "LED はデフォルトの状態で常にオンです。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "VLAN ID はユニークでなければなりません" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8218,7 +9171,7 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "設定ファイルは次のエラーにより読み込めませんでした:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8226,7 +9179,7 @@ msgstr "" "非表示の無線ネットワークに接続する場合、正しいSSIDを手動で指定する必要があり" "ます" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8251,18 +9204,18 @@ msgstr "" "デバイスファイルまたはパーティション(例 " "/dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "デバイス名 \"%s\" は既に使用されています" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8282,7 +9235,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "このシステムでは、現在以下のルールが有効です。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "点滅周期は1分間の平均 CPU 負荷を表します。" @@ -8290,32 +9243,48 @@ msgstr "点滅周期は1分間の平均 CPU 負荷を表します。" msgid "The gateway address must not be a local IP address" msgstr "ゲートウェイアドレスは非ローカルIPアドレスでなければなりません" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "入力されたSSH公開鍵はすでに追加されています。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" "指定されたSSH公開鍵は無効です。正しいRSAまたはECDSA鍵を指定してください。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "インターフェース名はすでに使用されています" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "インターフェース名が長すぎます" @@ -8339,6 +9308,7 @@ msgstr "ローカルIPv4アドレス" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "トンネルが作成されるローカルIPv4アドレス(オプション)。" @@ -8353,7 +9323,7 @@ msgstr "ローカルIPv4ネットマスク" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "トンネルが作成されるローカルIPv6アドレス(オプション)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8362,7 +9332,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8370,19 +9340,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "ネットワーク名はすでに使用されています" @@ -8402,14 +9372,14 @@ msgstr "" "トワークへの接続に使用するアップリンクポートと、ローカルネットワーク用のその" "他のポートが存在します。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" "クエリー レスポンス間隔は、クエリー間隔の値よりも小さくなければなりません" @@ -8423,31 +9393,31 @@ msgstr "rebootコマンドが失敗しました(コード: %d)" msgid "The restore command failed with code %d" msgstr "restoreコマンドが失敗しました(コード: %d)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "選択された%sモードは、%s暗号化と互換性がありません" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "送信されたセキュリティトークンは無効または期限切れです!" @@ -8485,6 +9455,14 @@ msgstr "システムパスワードの変更に成功しました。" msgid "The sysupgrade command failed with code %d" msgstr "sysupgradeコマンドが失敗しました(コード: %d)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8512,12 +9490,18 @@ msgstr "" "ません。このプラットフォームの通常のイメージフォーマットかどうか、確認してく" "ださい。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "設定値によりオーバーライドされます。元の値: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "設定値によりオーバーライドされます。" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8526,19 +9510,20 @@ msgstr "" "ルールの混用は、不完全なトラフィックフィルタリングを引き起こす恐れがあり、推" "奨されません。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "アクティブなリースはありません" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "適用する変更はありません" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8551,16 +9536,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "リレーのIPv4アドレス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "この認証タイプは、選択されたEAP方式に適用できません。" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "これは有効なPEMファイルではないようです" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8578,6 +9563,17 @@ msgstr "" "これはトンネルに対して設定された\"更新キー\"か、更新キーが設定されていない場" "合はアカウントパスワードのどちらかです" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8594,7 +9590,7 @@ msgstr "" "これはトンネルブローカーによって割り当てられた、ローカルエンドポイントアドレ" "スです。通常、最後が...:2/64で終わります" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "これはローカルネットワーク内で1つだけのconfiguration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "ログイン…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8700,7 +9700,7 @@ msgstr "" "ださい。ファームウェアを初期状態にリセットする場合、\"初期化する\"をクリック" "してください(squashfsイメージでのみ初期化可能)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "トーン" @@ -8708,12 +9708,16 @@ msgstr "トーン" msgid "Total Available" msgstr "利用可能な合計" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "トレースルート" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8725,11 +9729,11 @@ msgstr "トラフィック" msgid "Traffic Class" msgstr "トラフィッククラス" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "トラフィックフィルター チェーン \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8746,6 +9750,27 @@ msgstr "送信" msgid "Transmit Hash Policy" msgstr "送信ハッシュポリシー" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "送信済みデータ" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8784,7 +9809,7 @@ msgstr "トンネルインターフェース" msgid "Tunnel Link" msgstr "トンネルリンク" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "トンネル デバイス" @@ -8793,13 +9818,13 @@ msgid "Tx-Power" msgstr "送信出力" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "タイプ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8848,7 +9873,7 @@ msgstr "外部IPアドレスを確定できません" msgid "Unable to determine upstream interface" msgstr "アップストリーム インターフェースを確定できません" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "ディスパッチできません" @@ -8899,19 +9924,31 @@ msgstr "ファイアウォールを再起動できません: %s" msgid "Unable to save contents: %s" msgstr "内容を保存できません: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "使用不可秒数(UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "設定解除" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "予期しない応答データ形式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8925,7 +9962,7 @@ msgstr "" msgid "Unknown" msgstr "不明" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "不明およびサポートされていない接続方法です。" @@ -8949,11 +9986,11 @@ msgstr "アンマネージド" msgid "Unmount" msgstr "アンマウント" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "名前がない鍵" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "保存されていない変更" @@ -8967,15 +10004,25 @@ msgid "Unsupported MAP type" msgstr "サポートされていないMAPタイプ" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "サポートされていないモデム" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "サポートされていないプロトコルタイプです。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8987,7 +10034,7 @@ msgstr "上へ" msgid "Up Delay" msgstr "上り遅延" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "アップロード" @@ -9004,25 +10051,29 @@ msgstr "" msgid "Upload archive..." msgstr "アーカイブをアップロード..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "ファイルをアップロード" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "ファイルをアップロード…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "アップロードのリクエストに失敗: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "ファイルをアップロード中…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9031,33 +10082,37 @@ msgstr "" "\"続行\"をクリックすると匿名の\"wifi-iface\"セクションにwifinet#形式" "の名前が割り当てられ、設定を適用するためにネットワークは再起動されます。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "リゾルバファイルの順番にDNSサーバー" "に問い合わせる" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "稼働時間" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "/etc/ethersを使用" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "DHCPから通知されたサーバを使用" @@ -9066,13 +10121,18 @@ msgstr "DHCPから通知されたサーバを使用" msgid "Use DHCP gateway" msgstr "DHCPゲートウェイを使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "ピアから通知されたDNSサーバーを使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "ISO/IEC 3166 alpha2の国コードを使用します。" @@ -9120,22 +10180,25 @@ msgstr "ルートファイルシステムとして使用(/)" msgid "Use broadcast flag" msgstr "ブロードキャストフラグを使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "ビルトインIPv6管理を使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "カスタムDNSサーバーを使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "デフォルトゲートウェイを使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "ゲートウェイメトリックを使用" @@ -9161,15 +10224,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "システム証明書を使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "内部トンネルにシステム証明書を使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9197,11 +10260,11 @@ msgstr "skb_flow_dissectに依存する上位層プロトコル情報を使用 msgid "Used" msgstr "使用中" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "使用するキースロット" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9209,59 +10272,61 @@ msgstr "" "RADIUS NAS IDと802.11r R0KH-IDの2つの異なる目的のために使用中です。通常のWPA" "(2)-PSKは必要ありません。" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "ユーザーグループ" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "ユーザー証明書(PEMエンコード)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "ユーザー鍵(PEMエンコード)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "ユーザー名" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC多重化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -9281,24 +10346,27 @@ msgstr "VPNローカルアドレス" msgid "VPN Local port" msgstr "VPNローカルポート" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "VPNプロトコル" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPNサーバー" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "VPNサーバーポート" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "VPNサーバー証明書 SHA1ハッシュ" @@ -9307,6 +10375,10 @@ msgstr "VPNサーバー証明書 SHA1ハッシュ" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC(CISCO 3000(またはその他の)VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN(RFC7348)" @@ -9320,7 +10392,7 @@ msgstr "VXLANネットワーク識別子" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6(RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9328,8 +10400,8 @@ msgstr "" "未署名のドメインレスポンスが、本当にその未署名のドメインから来たものであるか" "検証します。上位サーバがDNSSECをサポートしている必要があります" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9357,7 +10429,7 @@ msgstr "ベンダー" msgid "Vendor Class to send when requesting DHCP" msgstr "DHCPリクエスト時に送信するベンダークラス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9365,12 +10437,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "アップロードされたイメージファイルを検証中です。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "非常に高い" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9378,34 +10450,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "仮想ダイナミックインターフェース" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "WEPオープンシステム" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "WEP共有キー" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "WEP暗号フレーズ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "WMMモード" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "WPA暗号フレーズ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9435,19 +10519,61 @@ msgstr "警告: 再起動で失われる、保留中の設定があります!" msgid "Weak" msgstr "弱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9457,7 +10583,7 @@ msgstr "" "以下のR0/R1キーオプションは適用されません。R0とR1キーのオプションを使用するに" "は、これを無効にしてください。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9465,7 +10591,7 @@ msgstr "" "Wi-Fiマルチメディア(WMM)モードのQoSが無効になっている場合、クライアントは" "802.11a /802.11gレートに制限される場合があります。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9474,16 +10600,25 @@ msgstr "" "に低下する可能性があります。" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "帯域幅" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "WireGuard ステータス" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9499,21 +10634,21 @@ msgid "Wireless Adapter" msgstr "無線アダプタ" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "無線ネットワーク" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "無線デバイス一覧" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "無線セキュリティ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "無線設定を移行" @@ -9529,15 +10664,15 @@ msgstr "無線機能は無効" msgid "Wireless is not associated" msgstr "無線機器はまだ接続されていません" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "無線ネットワークは無効" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "無線ネットワークは有効" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "受信したDNSリクエストをsyslogへ記録" @@ -9549,7 +10684,7 @@ msgstr "システムログをファイルに書き込む" msgid "XOR policy (balance-xor, 2)" msgstr "XORポリシー(balance-xor、2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9577,8 +10712,20 @@ msgstr "" "変更は再起動後に適用されます。
    警告: \"network\"などの重要なスク" "リプトを無効にするとデバイスにアクセスできなくなることがあります!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9611,34 +10758,54 @@ msgstr "ZRam設定" msgid "ZRam Size" msgstr "ZRamサイズ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "すべて" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "自動" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "自動" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "ブリッジ" @@ -9695,25 +10862,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "無効" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "無効" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "ドライバーデフォルト" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "例: --proxy 10.10.10.10" @@ -9722,14 +10894,23 @@ msgstr "例: --proxy 10.10.10.10" msgid "e.g: dump" msgstr "例: dump" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "期限切れ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "強制" @@ -9739,22 +10920,22 @@ msgstr "強制" msgid "forward" msgstr "転送" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "全二重" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "半二重" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "エンコードされた値(16進数)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "(非表示)" @@ -9763,9 +10944,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "ハイブリッドモード" @@ -9773,6 +10954,10 @@ msgstr "ハイブリッドモード" msgid "ignore" msgstr "無視" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9787,11 +10972,19 @@ msgstr "8文字以上63文字以下のキー" msgid "key with either 5 or 13 characters" msgstr "5文字または13文字のキー" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "セキュリティ: 中" @@ -9800,11 +10993,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "分" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9816,18 +11009,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "いいえ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "リンクなし" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "空でない値" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "なし" @@ -9838,20 +11039,20 @@ msgid "not present" msgstr "存在しません" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "オフ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "利用可能なプレフィックス" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "オープンネットワーク" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9860,6 +11061,10 @@ msgstr "" msgid "output" msgstr "出力" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "1日以上前" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9877,23 +11082,32 @@ msgstr "正の整数値" msgid "random" msgstr "ランダム" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "リレーモード" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "ルート" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "秒" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "サーバーモード" @@ -9901,7 +11115,7 @@ msgstr "サーバーモード" msgid "sstpc Log-level" msgstr "sstpcログレベル" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "セキュリティ: 強" @@ -9909,7 +11123,7 @@ msgstr "セキュリティ: 強" msgid "tagged" msgstr "タグ付き" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "時間単位(TUs/1.024ミリ秒)[1000-65535]" @@ -9923,25 +11137,27 @@ msgstr "" "HTTPS ネットワーク" "アクセスを提供します。" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "固有の値" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "不明" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "無制限" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9963,8 +11179,8 @@ msgid "untagged" msgstr "タグなし" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "有効なIPアドレス" @@ -9977,7 +11193,7 @@ msgid "valid IPv4 CIDR" msgstr "有効なIPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "有効なIPv4アドレス" @@ -10006,7 +11222,7 @@ msgid "valid IPv6 CIDR" msgstr "有効なIPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "有効なIPv6アドレス" @@ -10043,8 +11259,8 @@ msgstr "有効なUCI識別子、ホスト名またはIPアドレス" msgid "valid address:port" msgstr "有効なアドレス:ポート" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "有効な日付(YYYY-MM-DD)" @@ -10084,11 +11300,21 @@ msgstr "有効な整数値" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "有効なネットワーク(アドレス/ネットマスク表記)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "有効な電話番号(0-9、\"*\"、\"#\"、\"!\"、\".\")" @@ -10098,43 +11324,43 @@ msgid "valid port or port range (port1-port2)" msgstr "有効なポートまたはポート範囲(port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "有効なポート番号" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "有効な時刻(HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "%d文字以上%d文字以下の値" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "%fと%fの間の値" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "%f以上の値" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "%f以下の値" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "%d文字の値" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "%d文字以上の値" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "最大%d文字の値" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "セキュリティ: 弱" diff --git a/package/luci/modules/luci-base/po/ko/base.po b/package/luci/modules/luci-base/po/ko/base.po index 845c66d90a..33cf3d5faf 100644 --- a/package/luci/modules/luci-base/po/ko/base.po +++ b/package/luci/modules/luci-base/po/ko/base.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2009-06-10 03:40+0200\n" "PO-Revision-Date: 2022-10-29 20:58+0000\n" "Last-Translator: orangepizza \n" -"Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" @@ -14,23 +14,39 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;\n" "X-Generator: Weblate 4.14.2-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" table \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f 데시벨" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d 비트" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d 잘못된 부분(들)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d시간 전" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d분 전" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d초 전" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s 는 여러 VLAN에서 태그가 지정되지 않았습니다!" @@ -55,10 +71,11 @@ msgstr "(비어 있음)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(연결된 인터페이스 없음)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ 추가 항목 %d 개" @@ -68,19 +85,19 @@ msgid "-- Additional Field --" msgstr "-- 추가 설정 --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- 선택하세요 --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- 사용자 지정 --" @@ -106,7 +123,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = RSSI 임계값을 사용하지 않음, 1 = 드라이버 기본값 사용" @@ -119,13 +136,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "1분간 부하:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "플래그 1개" msgstr[1] "플래그 %d개" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "15분간 부하:" @@ -140,12 +162,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4자리 16진수 ID" @@ -158,43 +185,98 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "5분간 부하:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "6-옥텟 식별자를 콜론 없이 16진수 문자열로써 사용" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r 고속 로밍(트랜지션)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w Association SA 쿼리 최대 대기 시간" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11w Association SA 쿼리 재시도 최대 대기 시간" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w 관리 프레임 보호" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w 최대 대기 시간" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w 재시도 대기 시간" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-넷마스크" @@ -206,30 +288,46 @@ msgstr "LED 구성" msgid "LED Name" msgstr "LED 이름" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-프록시" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA 홉 제한" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA 수명" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-서비스" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ /example.com/와 일치하는 모든 도메인은 NXDOMAIN" +"을 반환합니다." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# 는 example.com과 그 서브도메인에 대해 NULL 주소 " +"(0.0.0.0 와 ::)를 반환합니다." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -276,11 +374,23 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s 가 집합 %s에 없음" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +#, fuzzy +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"batman-adv 노드는 서버 모드(메시와 인터넷 연결 공유) 또는 클라이언트 모드(메" +"시에서 가장 적합한 인터넷 연결 검색)에서 실행하거나 게이트웨이 지원을 완전히 " +"해제(기본 설정)할 수 있습니다." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "디바이스 \"%s\"의 설정이 이미 존재합니다." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "이미 같은 이름의 디렉터리가 존재합니다." @@ -288,25 +398,90 @@ msgstr "이미 같은 이름의 디렉터리가 존재합니다." msgid "A new login is required since the authentication session expired." msgstr "인증 세션이 만료되어 새 로그인이 필요합니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -339,29 +514,39 @@ msgstr "선택된 정책은 ARP 모니터링을 지원하지 않습니다!" msgid "ARP retry threshold" msgstr "ARP 재시도 임계값" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "ARP 트래픽 테이블 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"멀티캐스트 목적지 MAC을 가진 ARP, IPv4 및 IPv6(802.1Q 포함)을 STA MAC 주소로 " +"유니캐스트합니다. 참고: 이것은 802.11v의 DMS(직접 멀티캐스트 서비스)가 아닙니" +"다. 참고: 수신자의 STA 멀티캐스트 기대치를 위반할 수 있습니다." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (비동기 전송 모드)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM 브릿지" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM 가상 채널 식별자 (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM 가상 경로 식별자 (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -370,27 +555,23 @@ msgstr "" "ATM 브리지는 AAL5 연결에서 캡슐화된 이더넷을 DHCP 또는 PPP와 함께 사용하여 공" "급자 네트워크에 연결할 수 있는 가상 Linux 네트워크 인터페이스로 표시합니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM 디바이스 번호" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C 시스템 벤더 ID" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "인터페이스 없음" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "DNS 를 제공하기로한 subnet 인터페이스들에 대해서만 DNS 서비스를 제공합니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "로컬 허용" @@ -399,7 +580,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "패킷 허용" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "로컬 소스 주소가 있는 패킷 허용" @@ -408,16 +589,25 @@ msgstr "로컬 소스 주소가 있는 패킷 허용" msgid "Access Concentrator" msgstr "Concentrator 접근" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "액세스 포인트 (AP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "액세스 포인트 격리" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "관리 도구" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "활성화" @@ -455,8 +645,8 @@ msgstr "활성 IPv6 규칙" msgid "Active-Backup policy (active-backup, 1)" msgstr "활성화된 백업 정책 (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "애드혹" @@ -473,18 +663,18 @@ msgstr "적응형 송신 부하 분산 (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "추가" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "ATM 브릿지 추가" @@ -504,11 +694,11 @@ msgstr "LED 액션 추가" msgid "Add VLAN" msgstr "VLAN 추가" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "디바이스 설정 추가" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "디바이스 설정 추가…" @@ -516,18 +706,18 @@ msgstr "디바이스 설정 추가…" msgid "Add instance" msgstr "인스턴스 추가" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "키 추가" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "hosts에 등록된 호스트명에 로컬 도메인 접미사를 추가합니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "새로운 인터페이스 추가..." @@ -535,6 +725,10 @@ msgstr "새로운 인터페이스 추가..." msgid "Add peer" msgstr "피어 추가" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "블랙리스트에 추가" @@ -543,11 +737,11 @@ msgstr "블랙리스트에 추가" msgid "Add to Whitelist" msgstr "화이트리스트에 추가" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "추가적인 Hosts 파일들" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "추가적인 서버 파일" @@ -564,7 +758,11 @@ msgstr "추가적인 서버 파일" msgid "Address" msgstr "주소" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -577,7 +775,7 @@ msgstr "주소 설정이 유효하지 않음" msgid "Address to access local relay bridge" msgstr "로컬 릴레이 브릿지에 액세스하는 주소" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "주소" @@ -586,29 +784,29 @@ msgstr "주소" msgid "Administration" msgstr "관리" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "고급 설정" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "고급 장치 옵션들" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "전송 전력 집계 (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "발신자 메시지 집계" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -643,17 +841,17 @@ msgstr "별칭 인터페이스" msgid "Alias of \"%s\"" msgstr "\"%s\"의 별칭" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "모든 서버" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "이용 가능한 가장 낮은 주소부터 순차적으로 IP 주소를 할당합니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "순차적으로 IP 할당" @@ -661,11 +859,11 @@ msgstr "순차적으로 IP 할당" msgid "Allow SSH password authentication" msgstr "SSH 암호 인증을 허용합니다" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "낮은 ACK 조건을 기준으로 AP 모드에서 STA의 연결을 끊을 수 있습니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "목록의 주소 외 모두 허용" @@ -673,15 +871,15 @@ msgstr "목록의 주소 외 모두 허용" msgid "Allow full UCI access for legacy applications" msgstr "이전 애플리케이션을 위해 완전한 UCI 접근 허용" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "이전 802.11b 비율 허용" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "목록의 주소만 허용" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "localhost 허용" @@ -702,19 +900,24 @@ msgid "Allow system feature probing" msgstr "시스템 기능 프로빙 허용" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "암호를 이용한 root 사용자 접근을 허용합니다" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "허용된 IP" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "AllowedIPs 설정이 잘못됨" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "항상" @@ -726,13 +929,13 @@ msgstr "항상 끄기 (kernel: none)" msgid "Always on (kernel: default-on)" msgstr "항상 켜기 (kernel: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "항상 DHCP 옵션을 전송합니다. 떄로 PXELinux와 같은 특정 경우에 필요할 수 있습" "니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -740,11 +943,16 @@ msgstr "" "두 번째 채널과 겹쳐도 항상 40MHz 채널을 사용합니다. 이 옵션은 IEEE " "802.11n-2009 표준을 준수하지 않습니다!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 #, fuzzy msgid "Amount of Duplicate Address Detection probes to send" msgstr "전송할 중복 주소 감지 프로브의 양" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +#, fuzzy +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "모뎀이 준비될 때까지 대기하는 시간(초)" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "양식을 저장하는 동안 오류가 발생했습니다:" @@ -754,79 +962,28 @@ msgstr "양식을 저장하는 동안 오류가 발생했습니다:" msgid "An optional, short description for this device" msgstr "이 장치에 대한 간단한 설명(선택 사항)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "이 장치를 IPv6 DNS 서버로 알림." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 #, fuzzy msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "로컬 IPv6 기본 경로가 있는 경우 이 디바이스를 기본 라우터로 알립니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 #, fuzzy msgid "" "Announce this device as default router if a public IPv6 prefix is available, " @@ -835,7 +992,7 @@ msgstr "" "로컬 기본 경로 가용성에 관계없이 공용 IPv6 접두사를 사용할 수 있는 경우 이 디" "바이스를 기본 라우터로 알립니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 #, fuzzy msgid "" "Announce this device as default router regardless of whether a prefix or " @@ -844,15 +1001,15 @@ msgstr "" "접두사 또는 기본 경로가 있는지 여부에 관계없이 이 장치를 기본 라우터로 알립니" "다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "알려진 DNS 도메인" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "알려진 IPv6 DNS 서버" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "익명 신분" @@ -865,7 +1022,7 @@ msgstr "익명 마운트" msgid "Anonymous Swap" msgstr "익명 스왑" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "모든 패킷" @@ -877,12 +1034,12 @@ msgstr "모든 패킷" msgid "Any zone" msgstr "모든 영역" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" "이 네트워크에 DHCP 옵션을 적용합니다. (비어 있는 경우 모든 클라이언트)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "적용 및 설정 유지" @@ -891,44 +1048,48 @@ msgstr "적용 및 설정 유지" msgid "Apply backup?" msgstr "백업을 적용하시겠습니까?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "적용 요청 실패: 응답 코드 %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "아키텍처" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 #, fuzzy msgid "Associated Stations" @@ -938,15 +1099,15 @@ msgstr "연결된 스테이션" msgid "Associations" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -956,25 +1117,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "연결된 장치에 대해 설정된 마운트 연결 시도" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "인증이 필요합니다" @@ -982,7 +1144,9 @@ msgstr "인증이 필요합니다" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1000,7 +1164,7 @@ msgstr "" msgid "Automatically check filesystem for errors before mounting" msgstr "파일 시스템을 마운트하기 전에 자동으로 오류 확인" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1022,6 +1186,10 @@ msgstr "파일 시스템 자동 마운트" msgid "Automount Swap" msgstr "" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "사용 가능" @@ -1040,11 +1208,15 @@ msgstr "사용 가능" msgid "Average:" msgstr "평균:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1052,15 +1224,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "뒤로" @@ -1069,11 +1245,7 @@ msgstr "뒤로" msgid "Back to Overview" msgstr "개요로 이동" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "설정으로 돌아가기" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1086,16 +1258,15 @@ msgid "Backup / Flash Firmware" msgstr "펌웨어 백업 / 플래시" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1103,12 +1274,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "비컨 간격" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1122,7 +1316,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1131,18 +1325,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1154,65 +1361,77 @@ msgstr "" msgid "Bitrate" msgstr "비트레이트" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "부팅시 활성화" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "" @@ -1220,14 +1439,36 @@ msgstr "" msgid "Buffered" msgstr "버퍼된 양" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "CPU 사용량 (%)" @@ -1242,18 +1483,23 @@ msgstr "캐시 된 양" msgid "Call failed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "취소" @@ -1261,32 +1507,32 @@ msgstr "취소" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1295,45 +1541,53 @@ msgstr "" msgid "Category" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1345,16 +1599,16 @@ msgstr "" msgid "Chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "변경 사항" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "" @@ -1365,18 +1619,19 @@ msgstr "장비 접근을 위한 관리자 암호를 변경합니다" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "채널" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "채널 분석" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "채널 폭" @@ -1384,7 +1639,7 @@ msgstr "채널 폭" msgid "Check filesystems before mount" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" @@ -1401,8 +1656,8 @@ msgstr "" msgid "Choose mtdblock" msgstr "mtdblock 선택" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1414,7 +1669,7 @@ msgstr "" "운 zone 을 정의하고 인터페이스 연결을 원한다면 create 항목을 입력하" "세요." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1422,7 +1677,7 @@ msgstr "" "이 무선 인터페이스와 연결하고자 하는 네트워크를 선택하세요. 또는 새로운 네트" "워크를 정의하기 위해 사용자 지정 필드에 입력하세요." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "" @@ -1446,9 +1701,10 @@ msgstr "" "지정된 mtdblock 파일을 다운로드하려면 \"mtdblock 저장\"을 클릭하세요. (참고: " "이 기능은 전문가를 위한 것입니다!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "" @@ -1457,9 +1713,9 @@ msgstr "" msgid "Client ID to send when requesting DHCP" msgstr "DHCP 요청 시 전송할 클라이언트 ID" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "" @@ -1474,20 +1730,20 @@ msgid "" "persist connection" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "목록 닫기..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "데이터 수집 중..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "명령어" @@ -1504,7 +1760,7 @@ msgstr "" msgid "Comment" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1523,29 +1779,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "설정" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1555,28 +1810,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "이 인터페이스의 DHCPv6 작동 모드를 설정합니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1588,9 +1843,10 @@ msgstr "연결 해제 확인" msgid "Confirmation" msgstr "다시 확인" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "연결 시간" @@ -1600,11 +1856,11 @@ msgstr "연결 시간" msgid "Connection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1616,7 +1872,7 @@ msgstr "" msgid "Connections" msgstr "연결" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1644,9 +1900,9 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1657,16 +1913,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1677,20 +1933,20 @@ msgstr "" msgid "Country" msgstr "국가" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "국가 코드" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Firewall-zone 생성 / 할당" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "" @@ -1702,7 +1958,7 @@ msgstr "" msgid "Cron Log Level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "" @@ -1745,31 +2001,31 @@ msgstr "" "가능하다면 LED 의 동작을 직접 지" "정 할 수 있습니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "DHCP 옵션" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP 서버" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP 및 DNS" @@ -1780,16 +2036,22 @@ msgstr "DHCP 및 DNS" msgid "DHCP client" msgstr "DHCP 클라이언트" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP 옵션" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6 클라이언트" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6 서비스" @@ -1801,19 +2063,19 @@ msgstr "DHCPv6 서비스" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNS 쿼리 포트" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "DNS 서버 포트" @@ -1821,7 +2083,7 @@ msgstr "DNS 서버 포트" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1829,11 +2091,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1845,39 +2107,47 @@ msgstr "" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "DTIM 간격" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "받은 데이터" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "보낸 데이터" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1885,7 +2155,7 @@ msgstr "" msgid "Default state" msgstr "기본 상태" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1895,61 +2165,62 @@ msgstr "" "\"6,192.168.2.1,192.168.2.2\"는 클라이언트에게 다른 DNS 서버를 " "설정하도록 권고할 수 있습니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "삭제" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "키 제거" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "이 네트워크를 삭제합니다" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "설명" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "" @@ -1957,11 +2228,11 @@ msgstr "" msgid "Design" msgstr "테마" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1996,9 +2267,9 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2008,36 +2279,40 @@ msgstr "" msgid "Device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "장치 설정" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "" @@ -2045,31 +2320,31 @@ msgstr "" msgid "Device unreachable! Still waiting for device..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "장치" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "진단" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "비활성화" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2086,20 +2361,24 @@ msgstr "" msgid "Disable Encryption" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2108,33 +2387,32 @@ msgstr "" msgid "Disabled" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "낮은 ACK에서 연결 해제" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "연결 해제" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" @@ -2144,29 +2422,41 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "닫기" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP 서버와 " "DNS 포워딩 기능을 제공합니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" @@ -2188,32 +2478,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "이 인터페이스에서 DHCPv6 서비스를 제공하지 않습니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2223,17 +2504,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "" @@ -2241,11 +2522,11 @@ msgstr "" msgid "Do you really want to erase all settings?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2253,15 +2534,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "" @@ -2287,11 +2570,11 @@ msgstr "백업 다운로드" msgid "Download mtdblock" msgstr "mtdblock 다운로드" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2305,16 +2588,54 @@ msgstr "" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbear 설정" @@ -2332,19 +2653,19 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "동적 DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2352,7 +2673,7 @@ msgstr "" msgid "Dynamic tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2360,21 +2681,33 @@ msgstr "" "동적으로 DHCP 주소를 클라이언트에 할당합니다. 비활성화 시, 고정 임대가 설정" "된 클라이언트에게만 주소가 제공됩니다." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "수정" @@ -2382,17 +2715,21 @@ msgstr "수정" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "이 네트워크를 수정합니다" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "" @@ -2401,54 +2738,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "활성화" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "STP 활성화" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "SLAAC 활성화" @@ -2466,10 +2793,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2483,11 +2811,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2499,11 +2831,11 @@ msgstr "NTP 클라이언트 활성화" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "TFTP 서버 활성화" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2511,7 +2843,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "VLAN 기능 활성화" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "" @@ -2525,12 +2857,12 @@ msgstr "" "title=\"Hypertext Transfer Protocol Secure\">HTTPS 포트로의 자동 리디" "렉션을 활성화합니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "키 재설치 공격 (KRACK) 대응 활성화" @@ -2546,24 +2878,24 @@ msgstr "" msgid "Enable mirroring of outgoing packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2585,11 +2917,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "" @@ -2598,27 +2930,36 @@ msgstr "" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "활성화" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "이 bridge 에 Spanning Tree Protocol 활성화합니다" @@ -2626,24 +2967,29 @@ msgstr "이 bridge 에 Spanning Tree Protocol 활성화합니다" msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "암호화" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2651,23 +2997,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2696,10 +3042,6 @@ msgstr "" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2718,11 +3060,17 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2730,27 +3078,35 @@ msgstr "" "리바인딩 확인에 127.0.0.0/8 및 ::1 범위 내 IP를 제" "외합니다. (예: RBL 서비스)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2759,11 +3115,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "" @@ -2775,7 +3131,7 @@ msgstr "" msgid "Expires" msgstr "만료 시간" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "임대한 주소의 유효 시간. 최소값은 2 분 (2m) 입니다." @@ -2784,11 +3140,11 @@ msgstr "임대한 주소의 유효 시간. 최소값은 2 분 (2m) msgid "External" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2816,60 +3172,88 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "DHCP 임대 할당 정" "보를 저장할 파일." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "" @@ -2878,12 +3262,20 @@ msgstr "" msgid "Filesystem" msgstr "파일 시스템" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 -msgid "Filter private" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 @@ -2898,8 +3290,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2911,7 +3308,7 @@ msgstr "" "현재 연결된 모든 파일 시스템 및 스왑을 찾고 감지된 내용에 따라 설정을 기본값" "으로 교체합니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "네트워크 검색 및 연결합니다" @@ -2925,10 +3322,11 @@ msgid "Firewall" msgstr "방화벽" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "방화벽 설정" @@ -2936,19 +3334,19 @@ msgstr "방화벽 설정" msgid "Firewall Status" msgstr "방화벽 상태" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "펌웨어 파일" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "펌웨어 버전" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2974,40 +3372,48 @@ msgstr "플래시 작업" msgid "Flashing…" msgstr "플래시 중…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "강제하기" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "강제 40MHz 모드" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "다른 DHCP 서버가 탐지되더라도 이 네트워크에 DHCP를 강제합니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "" @@ -3019,11 +3425,11 @@ msgstr "" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3042,37 +3448,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "" @@ -3094,7 +3504,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "" @@ -3114,12 +3524,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "게이트웨이 포트 허용" @@ -3129,23 +3543,23 @@ msgstr "게이트웨이 포트 허용" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "기본 설정" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "기본 설정" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3153,7 +3567,7 @@ msgstr "" msgid "Generate Config" msgstr "설정 생성" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3161,11 +3575,11 @@ msgstr "" msgid "Generate archive" msgstr "아카이브 생성" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3173,15 +3587,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3193,39 +3607,40 @@ msgstr "" msgid "Global Settings" msgstr "전역 설정" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "전역 네트워크 옵션" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "암호 설정으로 이동..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "DHCP 구성에 관한 접근 권한 부여" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "DHCP 상태 표시에 관한 접근 권한 부여" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "DSL 상태 표시에 관한 접근 권한 부여" @@ -3237,6 +3652,10 @@ msgstr "LuCI OpenConnect 절차에 관한 접근 권한 부여" msgid "Grant access to LuCI Wireguard procedures" msgstr "LuCI Wireguard 절차에 관한 접근 권한 부여" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "SSH 구성에 관한 접근 권한 부여" @@ -3273,7 +3692,7 @@ msgstr "마운트 구성에 관한 접근 권한 부여" msgid "Grant access to network configuration" msgstr "네트워크 구성에 관한 접근 권한 부여" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "네트워크 분석 도구들에 관한 접근 권한 부여" @@ -3281,6 +3700,10 @@ msgstr "네트워크 분석 도구들에 관한 접근 권한 부여" msgid "Grant access to network status information" msgstr "네트워크 상태 정보 확인에 관한 접근 권한 부여" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "프로세스 상태 확인에 관한 접근 권한 부여" @@ -3313,7 +3736,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "무선 상태 표시에 관한 접근 권한 부여" @@ -3342,15 +3765,11 @@ msgstr "" msgid "Hang Up" msgstr "중단" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Header Error Code Errors (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "하트비트 간격 (kernel: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3361,7 +3780,7 @@ msgid "" msgstr "" "여기서 호스트 이름이나 시간대와 같은 기본적인 장비 설정을 할 수 있습니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "ESSID 숨기기" @@ -3370,17 +3789,25 @@ msgstr "ESSID 숨기기" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3390,7 +3817,7 @@ msgstr "호스트" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3398,10 +3825,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3411,11 +3844,11 @@ msgstr "호스트 이름" msgid "Hostname to send when requesting DHCP" msgstr "DHCP 요청시 전달할 호스트이름" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "호스트 이름" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3471,23 +3904,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3503,7 +3940,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3515,20 +3952,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "" @@ -3536,14 +3973,15 @@ msgstr "" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3559,7 +3997,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "IPv4 라우팅" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3570,7 +4008,7 @@ msgstr "IPv4 업스트림" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3597,7 +4035,7 @@ msgstr "" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "" @@ -3610,11 +4048,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3623,16 +4061,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3643,7 +4085,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3651,7 +4094,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6 방화벽" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3659,7 +4102,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "IPv6 Neighbour 들" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3667,15 +4114,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "IPv6 라우팅" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "IPv6 설정" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3689,12 +4136,12 @@ msgstr "" msgid "IPv6 address" msgstr "IPv6-주소" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3706,11 +4153,11 @@ msgstr "" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3719,7 +4166,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3733,24 +4180,19 @@ msgstr "" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"IPv6-접미사 (16진수)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3758,6 +4200,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3773,10 +4219,16 @@ msgstr "" msgid "IPv6-over-IPv4 (6to4)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3789,13 +4241,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3812,21 +4264,23 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "체크하지 않을 경우, 기본 route 가 설정되지 않습니다" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "체크하지 않을 경우, 사용하도록 권장된 DNS 주소는 무시됩니다" @@ -3840,15 +4294,23 @@ msgid "" "datarates of the RAM." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "/etc/hosts 파일 무시" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "인터페이스 무시" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "resolve 파일 무시" @@ -3860,25 +4322,25 @@ msgstr "이미지" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3890,13 +4352,27 @@ msgstr "" msgid "In" msgstr "In" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3926,7 +4402,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3934,6 +4410,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3952,22 +4429,21 @@ msgstr "" msgid "Information" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3979,31 +4455,41 @@ msgstr "" msgid "Initscripts" msgstr "Initscript 들" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4013,6 +4499,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4020,7 +4510,7 @@ msgstr "" msgid "Interface" msgstr "인터페이스" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -4028,7 +4518,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "인터페이스 설정" @@ -4059,11 +4549,11 @@ msgstr "" msgid "Interface is shutting down..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -4072,12 +4562,12 @@ msgid "Interface name" msgstr "인터페이스 이름" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "인터페이스" @@ -4086,22 +4576,26 @@ msgstr "인터페이스" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4111,8 +4605,9 @@ msgid "Invalid" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4122,6 +4617,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4144,7 +4643,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4158,15 +4657,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "클라이언트 격리" @@ -4177,25 +4697,25 @@ msgid "" "flash memory, please verify the image file!" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "네트워크 연결" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "네트워크 연결: 무선 스캔 결과" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "네트워크 연결중: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4203,25 +4723,29 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "커널 로그" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 #, fuzzy msgid "Kernel Version" msgstr "커널 버전" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "키" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "" @@ -4229,6 +4753,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4236,14 +4761,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4288,7 +4818,7 @@ msgstr "" msgid "LED Configuration" msgstr "LED 설정" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "" @@ -4305,32 +4835,39 @@ msgstr "언어" msgid "Language and Style" msgstr "언어와 스타일" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 -msgid "Last member interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +msgid "Last member interval" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "마지막 핸드셰이크" + #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "임대 시간" @@ -4354,38 +4891,34 @@ msgstr "" msgid "Leave empty to use the current WAN address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "제한" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "회선 가동 시간" @@ -4406,16 +4939,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4424,7 +4959,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4437,23 +4972,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "접근 포트" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4462,7 +4994,7 @@ msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" "지정한 인터페이스에만 리스닝 하며 미 지정시 모든 인터페이스에 적용됩니다" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4472,7 +5004,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "" @@ -4481,7 +5013,7 @@ msgstr "" msgid "Load" msgstr "부하" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "부하 평균" @@ -4489,27 +5021,28 @@ msgstr "부하 평균" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4529,11 +5062,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4549,44 +5083,70 @@ msgstr "" msgid "Local Startup" msgstr "로컬 시작 프로그램" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "지역 시간" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "로그인" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "로그아웃" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "출력할 로그 레벨" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "" @@ -4610,25 +5170,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "로그인" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "로그아웃" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4636,11 +5187,11 @@ msgstr "" msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "MAC 주소 필터" @@ -4648,16 +5199,15 @@ msgstr "MAC 주소 필터" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4666,11 +5216,15 @@ msgstr "" msgid "MAC address" msgstr "MAC 주소" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC-필터" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "" @@ -4684,6 +5238,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4705,15 +5263,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4721,7 +5283,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4730,78 +5292,86 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "최대 DHCP 임대 수" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "최대 EDNS0 패킷 크기" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "최대 동시 처리 쿼리 수" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "최대 허용 Listen 간격" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "최대 허용 활성 DHCP 임대 개수" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "최대 허용 동시 DNS 쿼리 수" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "최대 허용 EDNS.0 UDP 패킷 크기" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "임대될 수 있는 주소의 최대 개수입니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "최대 스누핑 테이블 크기" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "최대 송신 출력" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4828,7 +5398,7 @@ msgstr "메모리" msgid "Memory usage (%)" msgstr "메모리 사용량 (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4836,10 +5406,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4852,7 +5430,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4863,11 +5441,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4875,13 +5453,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4895,77 +5473,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "모드" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "모델" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "모뎀의 연결을 해제하고 있습니다. 잠시만 기다려주세요." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "" @@ -5033,6 +5618,10 @@ msgstr "" msgid "Move up" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5040,19 +5629,23 @@ msgstr "" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "멀티캐스트 라우팅" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5064,12 +5657,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5082,18 +5679,23 @@ msgid "NTP server candidates" msgstr "NTP 서버 목록" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "이름" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "" @@ -5102,13 +5704,17 @@ msgstr "" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5117,32 +5723,36 @@ msgstr "" msgid "Network" msgstr "네트워크" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "네트워크 유틸리티" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "네트워크 boot 이미지" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5155,7 +5765,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5164,7 +5774,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5173,25 +5783,31 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "안함" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "안함" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5199,13 +5815,13 @@ msgstr "" msgid "Next »" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "" @@ -5213,7 +5829,7 @@ msgstr "" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5229,9 +5845,17 @@ msgstr "" msgid "No RX signal" msgstr "RX 신호 없음" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5242,7 +5866,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5251,8 +5879,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5265,15 +5893,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5287,7 +5911,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5308,30 +5932,40 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "암호 설정을 해주세요!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "연결되지 않음" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "현재 공개 키가 없습니다." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5345,7 +5979,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "" @@ -5357,37 +5992,40 @@ msgstr "" msgid "Noise" msgstr "노이즈" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "" @@ -5400,7 +6038,7 @@ msgstr "연결되지 않음" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5412,12 +6050,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5426,7 +6070,7 @@ msgstr "" msgid "Notice" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "" @@ -5434,7 +6078,7 @@ msgstr "" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5451,7 +6095,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5462,6 +6106,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "" @@ -5470,6 +6115,12 @@ msgstr "" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "" @@ -5478,15 +6129,15 @@ msgstr "" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5504,7 +6155,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5513,49 +6168,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "목록 열람..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "동작 주파수" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5563,29 +6229,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "변경된 option" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "삭제된 option" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5593,17 +6268,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5611,13 +6286,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5632,11 +6307,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5644,7 +6319,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5658,7 +6333,7 @@ msgstr "" msgid "Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -6032,11 +6752,19 @@ msgstr "갱신 일시 중지" msgid "Peak:" msgstr "최고치:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -6045,11 +6773,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6080,10 +6808,14 @@ msgstr "초기화 하기" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6092,13 +6824,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Physical 설정" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "" @@ -6111,11 +6843,11 @@ msgstr "" msgid "Pkts." msgstr "Pkts." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "사용자이름과 암호를 입력해 주세요." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6123,56 +6855,75 @@ msgstr "" msgid "Policy" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "포트" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "포트" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "포트 상태:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6195,13 +6946,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "클라이언트 간의 통신을 방지합니다." -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6214,29 +6966,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6254,8 +7008,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6268,13 +7022,13 @@ msgstr "프로토콜" msgid "Provide NTP server" msgstr "NTP 서버 제공" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "새로운 네트워크를 추가합니다" @@ -6284,25 +7038,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "공개 키" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6331,59 +7096,83 @@ msgstr "" msgid "Quality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "" @@ -6396,10 +7185,16 @@ msgstr "" msgid "RX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6409,13 +7204,13 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" "/etc/ethers 파일을 읽어 DHCP-서버를 설정합니다" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "정말 프로토콜 변경을 원하세요?" @@ -6423,11 +7218,11 @@ msgstr "정말 프로토콜 변경을 원하세요?" msgid "Realtime Graphs" msgstr "실시간 그래프" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6451,11 +7246,40 @@ msgstr "장치의 운영체제를 재부팅합니다" msgid "Receive" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "받은 데이터" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "이 인터페이스를 재연결합니다" @@ -6463,12 +7287,12 @@ msgstr "이 인터페이스를 재연결합니다" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6477,37 +7301,47 @@ msgstr "" msgid "References" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "갱신 중" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "" @@ -6517,6 +7351,10 @@ msgstr "" msgid "Relay Bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "" @@ -6526,6 +7364,14 @@ msgstr "" msgid "Relay bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6535,6 +7381,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6547,15 +7394,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "제거" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "" @@ -6585,7 +7440,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6601,7 +7457,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6613,67 +7469,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6682,7 +7544,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6697,20 +7559,24 @@ msgstr "집계 초기화" msgid "Reset to defaults" msgstr "기본값으로 초기화" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Resolv 와 Hosts 파일" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Resolve 파일" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "리소스 찾을 수 없음" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "재시작" @@ -6719,7 +7585,7 @@ msgstr "재시작" msgid "Restart Firewall" msgstr "방화벽 재시작" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "라디오 인터페이스 재시작" @@ -6731,86 +7597,97 @@ msgstr "복구" msgid "Restore backup" msgstr "백업 복구" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "암호 보이기/숨기기" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "변경 취소" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "변경사항 되돌리기" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "설정 되돌리는 중…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6825,19 +7702,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "라운드 로빈 정책 (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6855,6 +7732,10 @@ msgstr "라우터 암호" msgid "Routing" msgstr "라우팅" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "라우팅 알고리즘" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6869,24 +7750,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6907,11 +7788,24 @@ msgstr "런타임 오류" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6929,7 +7823,7 @@ msgstr "SSH 서버 포트" msgid "SSH username" msgstr "SSH 사용자 이름" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 #, fuzzy msgid "SSH-Keys" @@ -6937,8 +7831,8 @@ msgstr "SSH-Keys" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6956,7 +7850,7 @@ msgstr "SSTP 서버" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6967,7 +7861,7 @@ msgid "Save" msgstr "저장" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "저장 & 적용" @@ -6984,7 +7878,7 @@ msgstr "mtdblock 저장" msgid "Save mtdblock contents" msgstr "mtdblock 내용 저장" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "스캔" @@ -6993,11 +7887,16 @@ msgstr "스캔" msgid "Scheduled Tasks" msgstr "작업 관리" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "추가된 section" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "섹션 삭제됨" @@ -7014,9 +7913,9 @@ msgstr "" "이미지 포맷 확인에 실패해도 이미지를 플래시 하려면 \"강제 업그레이드\"를 선택" "하세요. 펌웨어에 문제가 없고 기기에 맞다는 확신이 있을 때만 사용하세요!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "파일 선택…" @@ -7024,13 +7923,13 @@ msgstr "파일 선택…" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -7049,11 +7948,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7078,16 +7981,20 @@ msgstr "세션 만료됨" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7097,14 +8004,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7118,11 +8025,15 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "DHCP 서버 구성" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7130,20 +8041,25 @@ msgid "Setting PLMN failed" msgstr "PLMN 설정 실패" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 -msgid "Settings" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 +msgid "Settings" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7151,12 +8067,11 @@ msgstr "" msgid "Short GI" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "현재 백업 파일 목록 보기" @@ -7169,16 +8084,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "이 인터페이스 정지" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7186,15 +8101,15 @@ msgstr "이 인터페이스 정지" msgid "Signal" msgstr "신호" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "신호 / 노이즈" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "신호 감쇠 (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "신호 갱신율" @@ -7202,12 +8117,12 @@ msgstr "신호 갱신율" msgid "Signal:" msgstr "신호:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "크기" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "DNS 쿼리 캐시 크기" @@ -7224,12 +8139,12 @@ msgstr "건너뛰기" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "" @@ -7247,14 +8162,10 @@ msgstr "소프트웨어 VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "일부 필드가 올바르지 않아, 값을 저장할 수 없습니다!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "죄송합니다, 요청하신 객체를 찾을 수 없습니다." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "죄송합니다, 서버가 예상치 못한 오류에 걸렸습니다." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7262,10 +8173,10 @@ msgid "" "instructions." msgstr "" "죄송합니다. 현재 sysupgrade 를 지원하지 않습니다. 새 펌웨어 이미지를 수동으" -"로 플래시해야 합니다. 장치별 설치 지침은 OpenWrt 위키를 참조하세요." +"로 플래시해야 합니다. 장치별 설치 지침은 libreCMC 위키를 참조하세요." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7292,26 +8203,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7336,7 +8247,7 @@ msgstr "ARP 모니터링에 사용할 IP주소 지정" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7344,7 +8255,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7352,20 +8263,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "디바이스가 연결된 디렉터리 지정" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7393,7 +8304,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7412,7 +8323,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7443,15 +8354,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7473,19 +8384,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7505,7 +8416,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7600,15 +8511,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "시작" @@ -7621,16 +8540,16 @@ msgstr "" msgid "Start priority" msgstr "시작 우선순위" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "새로고침 시작" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "구성 적용 시작하는 중…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "무선 스캔 시작하는 중..." @@ -7639,6 +8558,10 @@ msgstr "무선 스캔 시작하는 중..." msgid "Startup" msgstr "시작 프로그램" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "정적 IPv4 라우트" @@ -7652,7 +8575,7 @@ msgstr "정적 IPv6 라우트" msgid "Static Lease" msgstr "고정 임대" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "정적 임대" @@ -7662,7 +8585,7 @@ msgstr "정적 임대" msgid "Static address" msgstr "정적 주소" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7672,18 +8595,18 @@ msgstr "" "용됩니다. 이 기능은 지정된 host 에 대해서만 주소 임대를 하도록 하는 non-" "dynamic 인터페이스 설정에도 요구됩니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "상태" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "정지" @@ -7692,8 +8615,8 @@ msgstr "정지" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "새로고침 정지" @@ -7701,11 +8624,11 @@ msgstr "새로고침 정지" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Strict order" @@ -7714,15 +8637,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "제출하기" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7755,7 +8678,7 @@ msgstr "스위치 VLAN" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "프로토콜 변경" @@ -7765,7 +8688,7 @@ msgstr "프로토콜 변경" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "심볼릭 링크" @@ -7777,8 +8700,16 @@ msgstr "" msgid "Sync with browser" msgstr "브라우저 시간대로 동기화" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7802,9 +8733,9 @@ msgstr "시스템 정보" msgid "System log buffer size" msgstr "시스템 로그 버퍼 크기" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7833,7 +8764,7 @@ msgstr "" msgid "TCP:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "TFTP 서버 root" @@ -7846,26 +8777,37 @@ msgstr "TX" msgid "TX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "대상 플랫폼" @@ -7881,26 +8823,26 @@ msgstr "" msgid "Terminate" msgstr "종료" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7916,7 +8858,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7928,18 +8874,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7947,6 +8899,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7961,6 +8914,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7971,7 +8930,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7988,21 +8947,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8014,13 +8977,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "다음과 같은 오류 때문에 구성 파일을 불러오지 못했습니다:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8040,18 +9003,18 @@ msgstr "" "메모리 또는 파티션의 디바이스 파일 (예시: /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8072,7 +9035,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "다음의 규칙들이 현재 이 시스템에 적용 중입니다." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -8080,32 +9043,48 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "게이트웨이 주소는 절대로 로컬 IP 주소면 안됩니다" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "제출하신 SSH 공개키는 이미 추가되어 있습니다." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" "제출하신 SSH 키는 올바르지 않습니다. 올바른 RSA 또는 ECDSA 키를 제출해주세요." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "이미 사용된 인터페이스 이름입니다" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "인터페이스 이름이 너무 깁니다" @@ -8128,6 +9107,7 @@ msgstr "로컬 IPv4 주소" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 #, fuzzy msgid "The local IPv4 address over which the tunnel is created (optional)." @@ -8144,7 +9124,7 @@ msgstr "로컬 IPv4 넷마스크" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "터널이 생성되는 로컬 IPv6 주소 (선택사항)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8153,7 +9133,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8161,19 +9141,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "네트워크 이름이 이미 사용 중입니다" @@ -8192,14 +9172,14 @@ msgstr "" "segment 들을 분리하는데 사용되기도 합니다. 한 개의 uplink 포트가 인터넷에 연" "결되어 있고 나머지 포트들은 local 네트워크로 연결되는 구성에 자주 사용됩니다." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8212,31 +9192,31 @@ msgstr "재시작 명령이 %d 인수로 인해 실패했습니다" msgid "The restore command failed with code %d" msgstr "복구 명령이 %d 인수로 인해 실패했습니다" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "선택된 %s 모드는 %s 암호화 방식과 호환되지 않습니다" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "전송된 보안 토큰이 잘못되었거나 이미 만료되었습니다!" @@ -8274,6 +9254,14 @@ msgstr "시스템 암호가 성공적으로 변경 되었습니다." msgid "The sysupgrade command failed with code %d" msgstr "복구 명령이 %d 인수로 인해 실패했습니다" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8301,31 +9289,38 @@ msgstr "" "업로드 된 이미지 파일은 지원 하지 않는 포맷입니다. 플랫폼에 대한 일반 이미지 " "형식을 선택해야 합니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 #, fuzzy msgid "There are no active leases" msgstr "활성화 되어 있는 임대 없음" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "변경된 사항이 없습니다" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8338,16 +9333,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8363,6 +9358,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8377,7 +9383,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" @@ -8406,8 +9412,8 @@ msgid "" msgstr "" "이 목록은 현재 실행중인 시스템 프로세스와 해당 상태에 대한 개요를 보여줍니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8422,31 +9428,39 @@ msgstr "이 항목에 입력된 값이 없습니다" msgid "Time Synchronization" msgstr "시간 동기화" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "시간 초과" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8454,17 +9468,13 @@ msgstr "" msgid "Timezone" msgstr "시간대" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8475,7 +9485,7 @@ msgstr "" "할 수 있습니다. 펌웨어의 초기 설정 초기화를 원하시다면, \"초기화 하기\" 를 클" "릭하세요. (squashfs 이미지들만 가능)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8483,12 +9493,16 @@ msgstr "" msgid "Total Available" msgstr "총 이용 가능한 양" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8500,11 +9514,11 @@ msgstr "트래픽" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8521,6 +9535,27 @@ msgstr "" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "보낸 데이터" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8559,7 +9594,7 @@ msgstr "" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8568,13 +9603,13 @@ msgid "Tx-Power" msgstr "송신 출력" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "유형" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8623,7 +9658,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8674,19 +9709,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8700,7 +9747,7 @@ msgstr "" msgid "Unknown" msgstr "알수없음" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8724,11 +9771,11 @@ msgstr "" msgid "Unmount" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "적용 안된 변경 사항" @@ -8742,15 +9789,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8762,7 +9819,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "" @@ -8779,58 +9836,66 @@ msgstr "" msgid "Upload archive..." msgstr "아카이브 업로드..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "DNS 서버들이 resolvfile의 순서에 따" "라 쿼리됩니다" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "가동 시간" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "/etc/ethers 사용" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "DHCP advertised된 서버 사용" @@ -8839,13 +9904,18 @@ msgstr "DHCP advertised된 서버 사용" msgid "Use DHCP gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Peer 가 권장한 DNS 서버 사용" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "ISO/IEC 3166 alpha2 국가 코드를 사용합니다." @@ -8891,22 +9961,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "Broadcast flag 사용" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "자체 내장 IPv6-관리 기능 사용" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "임의의 DNS 서버 사용" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Default gateway 사용" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Gateway metric 사용" @@ -8930,15 +10003,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8966,69 +10039,71 @@ msgstr "" msgid "Used" msgstr "사용된" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "사용자이름" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -9048,24 +10123,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -9074,6 +10152,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -9087,14 +10169,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9120,7 +10202,7 @@ msgstr "" msgid "Vendor Class to send when requesting DHCP" msgstr "DHCP 요청시 전송할 Vendor Class" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9128,12 +10210,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9141,34 +10223,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "WMM 모드" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9195,26 +10289,68 @@ msgstr "" msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9222,7 +10358,7 @@ msgstr "" "Wi-Fi 멀티미디어(WMM) 모드 QoS를 비활성화할 경우, 클라이언트의 링크 속도가 " "802.11a/802.11g 수준으로 제한될 수 있습니다." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9231,16 +10367,26 @@ msgstr "" "히 저하될 수 있습니다." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "대역폭" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +#, fuzzy +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "WireGuard 상태" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9256,21 +10402,21 @@ msgid "Wireless Adapter" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "무선 네트워크" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "무선 개요" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "무선 보안" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9286,15 +10432,15 @@ msgstr "무선이 비활성화되어" msgid "Wireless is not associated" msgstr "무선이 연결되어 있지 않습니다" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "무선 네트워크가 꺼져 있음" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "무선 네트워크가 켜져 있음" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "받은 DNS 요청 내용을 systlog 에 기록합니다" @@ -9306,7 +10452,7 @@ msgstr "시스템 로그 출력 파일 경로" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9333,8 +10479,20 @@ msgstr "" "와 같은 중요 init script 를 비활성화 할 경우, 장치에 접속을 못하실 수 있습니" "다!
    " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9363,34 +10521,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "자동" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "자동" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "" @@ -9447,25 +10625,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "드라이버 기본값" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9474,14 +10657,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "만료됨" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9491,22 +10683,22 @@ msgstr "" msgid "forward" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "" @@ -9515,9 +10707,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9525,6 +10717,10 @@ msgstr "" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9539,11 +10735,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9552,11 +10756,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9568,18 +10772,26 @@ msgstr "" msgid "no" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "link 없음" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "없음" @@ -9590,21 +10802,21 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 #, fuzzy msgid "off" msgstr "꺼짐" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "개방 네트워크" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9613,6 +10825,10 @@ msgstr "" msgid "output" msgstr "출력" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "며칠 전" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9630,23 +10846,32 @@ msgstr "양수 값" msgid "random" msgstr "랜덤" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "릴레이 모드" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "라우트 됨" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "sec" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "서버 모드" @@ -9654,7 +10879,7 @@ msgstr "서버 모드" msgid "sstpc Log-level" msgstr "sstpc 로그 레벨" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "높은 보안성" @@ -9663,7 +10888,7 @@ msgstr "높은 보안성" msgid "tagged" msgstr "태그 됨" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "time units (TUs / 1.024 ms) [1000-65535]" @@ -9674,25 +10899,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "유니크 값" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "알 수 없는" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "무제한" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9714,8 +10941,8 @@ msgid "untagged" msgstr "태그 되지 않음" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "유효한 IP 주소" @@ -9728,7 +10955,7 @@ msgid "valid IPv4 CIDR" msgstr "유효한 IPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "유효한 IPv4 주소" @@ -9758,7 +10985,7 @@ msgid "valid IPv6 CIDR" msgstr "유효한 IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "유효한 IPv6 주소" @@ -9797,8 +11024,8 @@ msgstr "유효한 UCI 식별자, 호스트이름 또는 IP 주소" msgid "valid address:port" msgstr "유효한 address:port" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "유효한 일자 (YYYY-MM-DD)" @@ -9838,11 +11065,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9852,43 +11089,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "보안 취약" diff --git a/package/luci/modules/luci-base/po/lt/base.po b/package/luci/modules/luci-base/po/lt/base.po new file mode 100644 index 0000000000..dd6978668a --- /dev/null +++ b/package/luci/modules/luci-base/po/lt/base.po @@ -0,0 +1,11086 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-10-30 06:43+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.2-dev\n" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "!žinoma (nežinoma)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 +msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" +msgid "\"%h\" table \"%h\"" +msgstr "\"%h\" sąrašas \"%h\"" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 +msgid "%.1f dB" +msgstr "%.1f dB" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 +msgid "%d Bit" +msgstr "%d Bit'as" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 +msgid "%d invalid field(s)" +msgstr "%d netinkamas/-i įvedimas/-ai" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "prieš %dh" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "prieš %dm" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "prieš %ds" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 +msgid "%s is untagged in multiple VLANs!" +msgstr "%s yra nepažymėti keliuose „VLAN'uose“!" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:296 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:405 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:272 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:309 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:327 +msgid "(%d minute window, %d second interval)" +msgstr "(%d minutės langas, %d sekundės intervalas)" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:118 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:124 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:259 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:283 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:88 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:91 +msgid "(empty)" +msgstr "(tuščia)" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 +#: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 +msgid "(no interfaces attached)" +msgstr "(nėra prijungta sąsajų ir sietuvų)" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 +msgctxt "Label indicating further amount of allowed ips" +msgid "+ %d more" +msgstr "+ %d daugiau" + +#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:48 +msgid "-- Additional Field --" +msgstr "-- Papildomas Laukas --" + +#: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 +#: modules/luci-compat/luasrc/view/cbi/header.htm:8 +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 +msgid "-- Please choose --" +msgstr "-- Prašome pasirinkti --" + +#: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 +#: modules/luci-compat/luasrc/view/cbi/header.htm:9 +msgid "-- custom --" +msgstr "-- pasirinktinis --" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:271 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:380 +msgid "-- match by label --" +msgstr "-- Suderinti pagal etiketę --" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:257 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:363 +msgid "-- match by uuid --" +msgstr "-- Suderinti pagal „uuid“ --" + +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:27 +#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:44 +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:23 +msgid "-- please select --" +msgstr "-- Prašome pažymėti --" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:55 +msgctxt "sstp log level value" +msgid "0" +msgstr "0" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +msgid "0 = not using RSSI threshold, 1 = do not change driver default" +msgstr "0 = nenaudojama „RSSI“ lenksčio, 1 = Nepakeiskite numatytą tvarkyklę" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:56 +msgctxt "sstp log level value" +msgid "1" +msgstr "1" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:233 +msgid "1 Minute Load:" +msgstr "1 minutes apkrovą:" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 +msgctxt "nft amount of flags" +msgid "1 flag" +msgid_plural "%d flags" +msgstr[0] "Viena (1) vėliava" +msgstr[1] "Kelios vėliavos" +msgstr[2] "%d vėliavos" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12val. (12 valandų formatas – numatytas)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 +msgid "15 Minute Load:" +msgstr "15 minučių apkrovą:" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:57 +msgctxt "sstp log level value" +msgid "2" +msgstr "2" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:58 +msgctxt "sstp log level value" +msgid "3" +msgstr "3" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3val. (3 valandos)" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 +msgctxt "sstp log level value" +msgid "4" +msgstr "4" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 +msgid "4-character hexadecimal ID" +msgstr "4 simbolių šešioliktainis ID" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:18 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:11 +msgid "464XLAT (CLAT)" +msgstr "„464XLAT (CLAT)“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:243 +msgid "5 Minute Load:" +msgstr "5 minučių apkrovą:" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5min. (5-ios minutės)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 +msgid "6-octet identifier as a hex string - no colons" +msgstr "6 oktetų identifikatorius kaip šešioliktainė eilutė – be dvitaškių" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7d. (7-ios dienos)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "„802.11k RRM“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "„802.11k“: Įgalinti signalo ataskaitą naudojant radijo matavimus." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "„802.11k“: įgalinti kaimyno ataskaitą radijo matavimais." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 +msgid "802.11r Fast Transition" +msgstr "„802.11r“ Greitas keitimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "„802.11v“: „BSS“ maks. tuščioji eiga. Vienetai: sekundės." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"„802.11v“: Belaidžio tinklo valdymo (WNM) miego režimas (išplėstinis stočių " +"miego režimas)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 +msgid "802.11w Association SA Query maximum timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 +msgid "802.11w Association SA Query retry timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 +msgid "802.11w Management Frame Protection" +msgstr "„802.11w“ valdymo kadrų apsauga" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 +msgid "802.11w maximum timeout" +msgstr "„802.11w“ maksimalus laukimo laikas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 +msgid "802.11w retry timeout" +msgstr "„802.11w“ pakartojimo laukimo laikas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 +msgid "BSSID" +msgstr "„BSSID“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 +msgid "ESSID" +msgstr "„ESSID“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 +msgid "IPv4-Netmask" +msgstr "„IPv4“-Tinklo kaukė" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:58 +msgid "LED Configuration" +msgstr "„LED“ Konfigūracija" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:70 +msgid "LED Name" +msgstr "„LED“ Pavadinimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 +msgid "NDP-Proxy" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 +msgid "RA Flags" +msgstr "„RA“ Vėliavos" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +msgid "RA Hop Limit" +msgstr "„RA“ Šuolių limitas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +msgid "RA Lifetime" +msgstr "„RA“ Gyvavimo trukmė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 +msgid "RA MTU" +msgstr "„RA“ „MTU“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 +msgid "RA-Service" +msgstr "„RA“-Tarnyba" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ atitinka bet kurį domeną. /example.com/ " +"grąžina „NXDOMAIN“." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# pateikia „NULL“ adresus (0.0.0.0 ir " +"::), pvz., „example.com“ ir jo subdomenus." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 +msgctxt "nft relational \">\" operator expression" +msgid "%s greater than %s" +msgstr "%s daugiau nei %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:85 +msgctxt "nft relational \">=\" operator expression" +msgid "%s greater than or equal to %s" +msgstr "%s daugiau nei, arba lygus %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:90 +msgctxt "nft set match expression" +msgid "%s in set %s" +msgstr "%s rinkinyje %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:83 +msgctxt "nft relational \"==\" operator expression" +msgid "%s is %s" +msgstr "%s yra %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:89 +msgctxt "nft relational \"in\" operator expression" +msgid "%s is one of %s" +msgstr "%s yra vienas iš %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:88 +msgctxt "nft relational \"<\" operator expression" +msgid "%s lower than %s" +msgstr "%s mažiau nei %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:86 +msgctxt "nft relational \"<=\" operator expression" +msgid "%s lower than or equal to %s" +msgstr "%s mažiau nei, arba lygus %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:84 +msgctxt "nft relational \"!=\" operator expression" +msgid "%s not %s" +msgstr "%s nėra %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:91 +msgctxt "nft not in set match expression" +msgid "%s not in set %s" +msgstr "%s nėra rinkinyje %s" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 +msgid "A configuration for the device \"%s\" already exists" +msgstr "Įrenginio „%s“ konfigūracija jau egzistuoja" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 +msgid "A directory with the same name already exists." +msgstr "Tokio paties pavadinimo katalogas jau egzistuoja." + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2666 +msgid "A new login is required since the authentication session expired." +msgstr "Reikalingas naujas prisijungimas, nes autentifikavimo sesija baigėsi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +msgid "A43C + J43 + A43" +msgstr "„A43C + J43 + A43“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +msgid "A43C + J43 + A43 + V43" +msgstr "„A43C + J43 + A43 + V43“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 +msgid "ADSL" +msgstr "„ADSL“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "„ADSL (G.992.1) Annex A“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "„ADSL (G.992.1) Annex B“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "„ADSL (visi variantai) Annex A/L/M“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "„ADSL (visi variantai) Annex A/L/M + VDSL2 Annex A/B/C“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "„ADSL (visi variantai) Annex B“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "„ADSL (visi variantai) Annex B + VDSL2 Annex A/B/C“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "„ADSL (visi variantai) Annex B/J“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "„ADSL (visi variantai) Annex B/J + VDSL2 Annex A/B/C“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "„ADSL (visi variantai) Annex M“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "„ADSL2 (G.992.3) Annex A“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "„ADSL2 (G.992.3) Annex B“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "„ADSL2 (G.992.3) Annex L“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "„ADSL2 (G.992.3) Annex M“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "„ADSL2+ (G.992.5) Annex A“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "„ADSL2+ (G.992.5) Annex B“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "„ADSL2+ (G.992.5) Annex M“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 +msgid "ANSI T1.413" +msgstr "„ANSI T1.413“" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 +msgid "APN" +msgstr "„APN“" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:353 +msgid "ARP" +msgstr "„ARP“" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:366 +msgid "ARP IP Targets" +msgstr "„ARP IP Taikiniai“" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:358 +msgid "ARP Interval" +msgstr "„ARP“ intervalas" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:382 +msgid "ARP Validation" +msgstr "„ARP“ Patikrinimas" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:374 +#, fuzzy +msgid "ARP mode to consider a slave as being up" +msgstr "„ARP“ režimas, kuriuo valdomasis kompiuteris laikomas veikiančiu" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:79 +msgid "ARP monitoring is not supported for the selected policy!" +msgstr "„ARP“ stebėjimas nepalaikomas pasirinktoje politikoje!" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 +msgid "ARP retry threshold" +msgstr "„ARP“ pakartojimo slenkstis" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 +msgid "ARP traffic table \"%h\"" +msgstr "„ARP“ srauto lentelė „%h“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 +msgid "ATM (Asynchronous Transfer Mode)" +msgstr "„ATM“ (Asinchroninis perdavimas režimas)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 +msgid "ATM Bridges" +msgstr "„ATM“ Tiltai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 +msgid "ATM Virtual Channel Identifier (VCI)" +msgstr "„ATM“ virtualaus kanalo identifikatorius („VCI“)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 +msgid "ATM Virtual Path Identifier (VPI)" +msgstr "„ATM“ virtualaus kelio identifikatorius („VPI“)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 +msgid "" +"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " +"Linux network interfaces which can be used in conjunction with DHCP or PPP " +"to dial into the provider network." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 +msgid "ATM device number" +msgstr "„ATM“ įrenginio numeris" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 +msgid "Absent Interface" +msgstr "Nėra sąsajos" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 +msgid "Accept DNS queries only from hosts whose address is on a local subnet." +msgstr "" +"Priimti „DNS“ užklausas tik iš pagrindinių kompiuterių, kurių adresas yra " +"vietiniame potinklyje." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 +msgid "Accept local" +msgstr "Priimti vietini" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:95 +msgctxt "nft accept action" +msgid "Accept packet" +msgstr "Priimti paketą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 +msgid "Accept packets with local source addresses" +msgstr "Priimti paketus su vietiniais šaltinio adresais" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 +msgid "Access Concentrator" +msgstr "Prieigos telktuvas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +msgid "Access Point" +msgstr "Prieigos taškas" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Prieigos taško izoliavimas" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Prieigos technologijos" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 +msgid "Actions" +msgstr "Veiksmai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 +msgid "Active" +msgstr "Aktyvu" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:81 +msgid "Active Connections" +msgstr "Aktyvūs prisijungimai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:35 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:182 +msgid "Active DHCP Leases" +msgstr "Aktyvūs „DHCP Leases“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:54 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:184 +msgid "Active DHCPv6 Leases" +msgstr "Aktyvūs „DHCPv6 Leases“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:255 +msgid "Active IPv4 Routes" +msgstr "Aktyvūs „IPv4“ maršrutai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:258 +msgid "Active IPv4 Rules" +msgstr "Aktyvūs „IPv4“ taisyklės" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:265 +msgid "Active IPv6 Routes" +msgstr "Aktyvūs „IPv6“ maršrutai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:268 +msgid "Active IPv6 Rules" +msgstr "Aktyvūs „IPv6“ taisyklės" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:205 +msgid "Active-Backup policy (active-backup, 1)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 +msgid "Ad-Hoc" +msgstr "„Ad-Hoc“" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:210 +msgid "Adaptive load balancing (balance-alb, 6)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:209 +msgid "Adaptive transmit load balancing (balance-tlb, 5)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2233 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2236 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2249 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2257 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 +#: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 +#: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 +#: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 +#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 +msgid "Add" +msgstr "Pridėti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 +msgid "Add ATM Bridge" +msgstr "Pridėti „ATM Bridge“" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:92 +msgid "Add IPv4 address…" +msgstr "Pridėti „IPv4“ adresą…" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:185 +msgid "Add IPv6 address…" +msgstr "Pridėti „IPv6“ adresą…" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:65 +msgid "Add LED action" +msgstr "Pridėti „LED“ (Lemputės) veiksmą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:221 +msgid "Add VLAN" +msgstr "Pridėti „VLAN“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 +msgid "Add device configuration" +msgstr "Pridėti įrenginio konfigūravimą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 +msgid "Add device configuration…" +msgstr "Pridėti įrenginio konfigūravimą…" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:15 +msgid "Add instance" +msgstr "Pridėti egzempliorių" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 +msgid "Add key" +msgstr "Pridėti raktą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 +msgid "Add local domain suffix to names served from hosts files." +msgstr "" +"Pridėti vietinio domeno-srities priesagą į vardus, pateikiamų iš skleidėjo/p." +"k – vedėjo failų." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 +msgid "Add new interface..." +msgstr "Pridėti naują sąsają ir/arba sietuvą..." + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:224 +msgid "Add peer" +msgstr "Pridėti lygiarangį" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" +"Pridėti statinius persiuntimo ir atvirkštinio „DNS“ įrašus šiam skleidėjui/p." +"k – vedėjui." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 +msgid "Add to Blacklist" +msgstr "Pridėti į juodąjį sąrašą" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 +msgid "Add to Whitelist" +msgstr "Pridėti į baltąjį sąrašą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 +msgid "Additional hosts files" +msgstr "Papildomi skleidėjo/p.k – vedėjo/-ų failai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 +msgid "Additional servers file" +msgstr "Papildomas serverių failas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:34 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:35 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:36 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:37 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:38 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:39 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:40 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:41 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:42 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:43 +msgid "Address" +msgstr "Adresas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 +msgctxt "nft meta nfproto" +msgid "Address family" +msgstr "Adreso šeima" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:284 +msgid "Address setting is invalid" +msgstr "Adreso nustatymas yra neteisingas" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +msgid "Address to access local relay bridge" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 +msgid "Addresses" +msgstr "Adresai" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:3 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:15 +msgid "Administration" +msgstr "Administravimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 +msgid "Advanced Settings" +msgstr "Pažangūs nustatymai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 +msgid "Advanced device options" +msgstr "Pažangūs įrenginio parinktys" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 +msgid "Ageing time" +msgstr "Senėjimo laikas" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Agreguoti siuntėjo pranešimus" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 +msgid "Aggregation Selection Logic" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:263 +msgid "Aggregator: All slaves down or has no slaves (stable, 0)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:265 +msgid "" +"Aggregator: Chosen by the largest number of ports + slave added/removed or " +"state changes (count, 2)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:264 +msgid "Aggregator: Slave added/removed or state changes (bandwidth, 1)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:192 +msgid "Alert" +msgstr "Įspėti" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2989 +#: modules/luci-compat/luasrc/model/network.lua:1417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:62 +msgid "Alias Interface" +msgstr "Slapyvardžio Sąveiką" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:146 +msgid "Alias of \"%s\"" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +msgid "All servers" +msgstr "Visi serveriai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 +msgid "" +"Allocate IP addresses sequentially, starting from the lowest available " +"address." +msgstr "" +"Paskirstyti IP adresus nuosekliai, pradedant nuo žemiausio galimo adreso." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +msgid "Allocate IPs sequentially" +msgstr "Paskirstyti „IP“ nuosekliai" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 +msgid "Allow SSH password authentication" +msgstr "" +"Leisti „SSH“ slaptažodžio autentifikavimą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 +msgid "Allow AP mode to disconnect STAs based on low ACK condition" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +msgid "Allow all except listed" +msgstr "Leisti visus, išskyrus išvardytus" + +#: modules/luci-compat/root/usr/share/rpcd/acl.d/luci-compat.json:3 +msgid "Allow full UCI access for legacy applications" +msgstr "Leisti pasenusiom aplikacijoms naudoti/-s visą „UCI“ prieigą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 +msgid "Allow legacy 802.11b rates" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 +msgid "Allow listed only" +msgstr "Leisti tik išvardytus" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 +msgid "Allow localhost" +msgstr "Leisti „localhost“" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:179 +msgid "Allow rebooting the device" +msgstr "Leisti iš naujo paleisti įrenginį" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 +msgid "Allow remote hosts to connect to local SSH forwarded ports" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 +msgid "Allow root logins with password" +msgstr "" + +#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:3 +msgid "Allow system feature probing" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 +msgid "Allow the root user to log in with password" +msgstr "Leisti „root“ vartotojui prisijungti naudojant slaptažodį" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +msgid "Allowed IPs" +msgstr "Leidžiami „IP“ (dgs.)" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "Leidžiama/-os tinklo technologija/-os" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 +msgid "AllowedIPs setting is invalid" +msgstr "„LeidžiamiIPs“ nustatymas yra netinkamas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 +msgid "Always" +msgstr "Visada" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:6 +msgid "Always off (kernel: none)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:5 +msgid "Always on (kernel: default-on)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 +msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 +msgid "" +"Always use 40MHz channels even if the secondary channel overlaps. Using this " +"option does not comply with IEEE 802.11n-2009!" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 +msgid "Amount of Duplicate Address Detection probes to send" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:608 +msgid "An error occurred while saving the form:" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 +msgid "An optional, short description for this device" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 +msgid "Annex" +msgstr "Aneksija" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 +msgid "Announce this device as IPv6 DNS server." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 +msgid "" +"Announce this device as default router if a local IPv6 default route is " +"present." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 +msgid "" +"Announce this device as default router if a public IPv6 prefix is available, " +"regardless of local default route availability." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 +msgid "" +"Announce this device as default router regardless of whether a prefix or " +"default route is present." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 +msgid "Announced DNS domains" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 +msgid "Announced IPv6 DNS servers" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +msgid "Anonymous Identity" +msgstr "Anonimiška tapatybė" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 +msgid "Anonymous Mount" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 +msgid "Anonymous Swap" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 +msgctxt "nft match any traffic" +msgid "Any packet" +msgstr "Bet koks paketas" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:84 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:174 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:196 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:60 +msgid "Any zone" +msgstr "Bet kokia zona" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 +msgid "Apply DHCP Options to this net. (Empty = all clients)." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 +msgid "Apply and keep settings" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 +msgid "Apply backup?" +msgstr "Įgalinti atkūrimą?" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 +msgid "Apply request failed with status %h" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 +msgid "Apply unchecked" +msgstr "Įgalinti nepažymėtus" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 +msgid "Apply with revert after connectivity loss" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 +msgid "Applying configuration changes… %ds" +msgstr "Įgalinami konfigūracijos pakeitimai... %ds" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +msgid "Architecture" +msgstr "Architektūra" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 +msgid "Arp-scan" +msgstr "„Arp-skenavimas“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 +msgid "" +"Assign a part of given length of every public IPv6-prefix to this interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 +msgid "" +"Assign prefix parts using this hexadecimal subprefix ID for this interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 +msgid "Associated Stations" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:151 +msgid "Associations" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 +msgid "" +"At least %h per %h, burst of %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 +msgid "" +"At most %h per %h, burst of %h" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 +msgid "Attempt to enable configured mount points for attached devices" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 +msgid "Auth Group" +msgstr "Autentifikavimo grupė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 +msgid "Authentication" +msgstr "Autentifikavimas" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 +msgid "Authentication Type" +msgstr "Autentifikavimo tipas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +msgid "Authoritative" +msgstr "Autoritetas" + +#: modules/luci-base/ucode/template/sysauth.ut:17 +#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 +msgid "Authorization Required" +msgstr "Autoritetas reikalingas" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:56 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:69 +msgid "Automatic" +msgstr "Automatinis" + +#: modules/luci-compat/luasrc/model/network/proto_hnet.lua:7 +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:7 +msgid "Automatic Homenet (HNCP)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 +msgid "Automatically check filesystem for errors before mounting" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 +msgid "" +"Automatically handle multiple uplink interfaces using source-based policy " +"routing." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 +msgid "Automatically mount filesystems on hotplug" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 +msgid "Automatically mount swap on hotplug" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 +msgid "Automount Filesystem" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 +msgid "Automount Swap" +msgstr "" + +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "„Avahi IPv4LL“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 +msgid "Available" +msgstr "Pasiekiamas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:270 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:280 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:331 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:341 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:351 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:236 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:246 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:256 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:265 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:275 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:293 +msgid "Average:" +msgstr "Vidurkis:" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 +msgid "B43 + B43C" +msgstr "„B43 + B43C“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +msgid "B43 + B43C + V43" +msgstr "„B43 + B43C + V43“" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:48 +msgid "BR / DMR / AFTR" +msgstr "„BR / DMR / AFTR“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "„BSS“ perėjimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 +msgid "BSSID" +msgstr "„BSSID“" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 +msgid "Back" +msgstr "Atgal" + +#: modules/luci-compat/luasrc/view/cbi/footer.htm:14 +#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:48 +msgid "Back to Overview" +msgstr "Atgal į apžiūrą" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 +msgid "Back to peer configuration" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:391 +msgid "Backup" +msgstr "Atkūrimas/Sukurti atsarginę kopiją" + +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:128 +msgid "Backup / Flash Firmware" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 +msgid "Backup file list" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 +msgid "Band" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 +msgid "Base device" +msgstr "Pagrindo įrenginys" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 +msgid "Base64-encoded public key of this interface for sharing." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "„Batman“ įrenginys" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "„Batman“ sąsajas ir/arba sietuvas" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 +msgid "Beacon Interval" +msgstr "Švyturio intervalas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 +msgid "" +"Below is the determined list of files to backup. It consists of changed " +"configuration files marked by opkg, essential base files and the user " +"defined backup patterns." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:287 +msgid "Bind NTP server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 +msgid "Bind dynamically to interfaces rather than wildcard address." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 +msgid "Bind interface" +msgstr "Pririšti sąsają/-as ir/arba sietuvą/-us" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 +msgid "Bind the tunnel to this interface (optional)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:171 +msgid "Bitrate" +msgstr "Pralaidumas (bitų)" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Pririšimo režimas" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 +msgid "Bonding Policy" +msgstr "Pririšimo politika" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2995 +#: modules/luci-compat/luasrc/model/network.lua:1421 +msgid "Bridge" +msgstr "„Bridge/Tinklo Tiltas“ – Jungimas/-iamasis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 +msgctxt "MACVLAN mode" +msgid "Bridge (Support direct communication between MAC VLANs)" +msgstr "Jungimas (Palaiko tiesioginę komunikaciją tarp „MAC VLAN'ų“)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 +msgid "Bridge VLAN filtering" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +msgid "Bridge device" +msgstr "Jungimo įrenginys" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 +msgid "Bridge port specific options" +msgstr "Jungimo prievado tiksliniai pasirinkimai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +msgid "Bridge ports" +msgstr "Jungimo prievadai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 +msgid "Bridge traffic table \"%h\"" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 +msgid "Bridge unit number" +msgstr "Jungimo vieneto numeris" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 +msgid "Bring up empty bridge" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 +msgid "Bring up on boot" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 +msgid "Bring up the bridge interface even if no ports are attached" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 +msgid "Broadcast policy (broadcast, 3)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 +msgid "Browse…" +msgstr "Naršyti…" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:40 +msgid "Buffered" +msgstr "" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 +msgid "CA certificate; if empty it will be saved after the first connection." +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "„CHAP“" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 +msgid "CLAT configuration failed" +msgstr "„CLAT“ konfigūracija nepavyko" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "„CNAME“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "„CNAME“ arba „fqdn“" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 +msgid "CPU usage (%)" +msgstr "„CPU“ vartojimas/naudojimas (%)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:43 +msgid "Cached" +msgstr "Talpykloje" + +#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:53 +#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:53 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:21 +msgid "Call failed" +msgstr "Skambinimas nepavyko" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 +#: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 +#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 +msgid "Cancel" +msgstr "Atšaukti" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:347 +msgid "Cannot parse configuration: %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 +msgctxt "Chain hook: forward" +msgid "Capture incoming packets addressed to other hosts" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 +msgctxt "Chain hook: prerouting" +msgid "Capture incoming packets before any routing decision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 +msgctxt "Chain hook: input" +msgid "Capture incoming packets routed to the local system" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 +msgctxt "Chain hook: postrouting" +msgid "Capture outgoing packets after any routing decision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 +msgctxt "Chain hook: output" +msgid "Capture outgoing packets originating from the local system" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 +msgctxt "Chain hook: ingress" +msgid "Capture packets directly after the NIC received them" +msgstr "" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:17 +msgid "Category" +msgstr "Kategorija" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "„Cell ID“" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +msgid "Certificate constraint (Domain)" +msgstr "Sertifikato suvaržymas (Domenas-Sritis)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +msgid "Certificate constraint (SAN)" +msgstr "Sertifikato suvaržymas („SAN“)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +msgid "Certificate constraint (Subject)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +msgid "Certificate constraint (Wildcard)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 +msgid "" +"Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " +"`logread -f` during handshake for actual values" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +msgid "" +"Certificate constraint(s) against DNS SAN values (if available)
    or " +"Subject CN (exact match)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 +msgid "" +"Certificate constraint(s) against DNS SAN values (if available)
    or " +"Subject CN (suffix match)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 +msgid "" +"Certificate constraint(s) via Subject Alternate Name values
    (supported " +"attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:212 +msgid "Chain" +msgstr "Grandinė" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 +msgctxt "Yet unknown nftables chain hook" +msgid "Chain hook \"%h\"" +msgstr "Grandinės pririšimas \"%h\"" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 +msgid "Changes" +msgstr "Pakeitimai" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 +msgid "Changes have been reverted." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 +msgid "Changes the administrator password for accessing the device" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 +msgid "Channel" +msgstr "Kanalas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 +msgid "Channel Analysis" +msgstr "Kanalų analizė" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 +msgid "Channel Width" +msgstr "Kanalo plotis" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 +msgid "Check filesystems before mount" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 +msgid "Check this option to delete the existing networks from this radio." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:110 +msgid "Checking archive…" +msgstr "Tikrinamas archyvas…" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:193 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:195 +msgid "Checking image…" +msgstr "Tikrinama laikmena…" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:427 +msgid "Choose mtdblock" +msgstr "Pasirinkti „mtdblock“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 +msgid "" +"Choose the firewall zone you want to assign to this interface. Select " +"unspecified to remove the interface from the associated zone or " +"fill out the custom field to define a new zone and attach the " +"interface to it." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +msgid "" +"Choose the network(s) you want to attach to this wireless interface or fill " +"out the custom field to define a new network." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 +msgid "Cipher" +msgstr "Šifras" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:91 +msgid "Cisco UDP encapsulation" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:391 +msgid "" +"Click \"Generate archive\" to download a tar archive of the current " +"configuration files." +msgstr "" +"Spauskite – „Sugeneruoti archyvą“, kad atsisiųstumėte „*.tar“ failo archyvą " +"dabartinės konfigūracijos. Šį „libreCMC“ ir įvairius „LuCI“ komponentų " +"vertimus į lietuvių kalbą išvertė Džiugas Januševičius (Virš 30 tūks. " +"žodžių)." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:424 +msgid "" +"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS " +"FEATURE IS FOR PROFESSIONALS! )" +msgstr "" +"Spauskite – „Išsaugoti „mtdblock““, kad atsisiųstumėte specifikuotą " +"„mtdblock“ failą. (Pastaba: Ši funkcija tik profesionalams!)" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 +msgid "Client" +msgstr "Klientas" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:37 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:33 +msgid "Client ID to send when requesting DHCP" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 +msgid "Close" +msgstr "Uždaryti" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:156 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:114 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:92 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:101 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:124 +msgid "" +"Close inactive connection after the given amount of seconds, use 0 to " +"persist connection" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 +msgid "Collecting data..." +msgstr "Renkama informacija (data)..." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 +msgid "Command" +msgstr "Komanda" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:401 +msgid "Command OK" +msgstr "Komanda – Gerai" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:33 +msgid "Command failed" +msgstr "Komanda nesėkminga" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:73 +msgid "Comment" +msgstr "Komentuoti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 +msgid "" +"Complicates key reinstallation attacks on the client side by disabling " +"retransmission of EAPOL-Key frames that are used to install keys. This " +"workaround might cause interoperability issues and reduced robustness of key " +"negotiation especially in environments with heavy traffic load." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:101 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:106 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:103 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:108 +msgid "Compute outgoing checksum (optional)." +msgstr "" + +#: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 +msgid "Config File" +msgstr "Konfigūracijos failas" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 +msgid "Configuration" +msgstr "Konfigūravimas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 +msgid "Configuration Export" +msgstr "Konfigūravimo eksportas" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 +msgid "Configuration changes applied." +msgstr "Konfigūravimo pakeitimai įgalinti." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 +msgid "Configuration changes have been rolled back!" +msgstr "" +"Konfigūravimo pakeitimai buvo atšaukti ir sugrąžinti į pradinę būsena " +"(Anuliuoti)!" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 +msgid "Configuration failed" +msgstr "Konfigūravimas nepavyko" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +msgid "" +"Configures data rates based on the coverage cell density. Normal configures " +"basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " +"5.5, 11 Mbps. High configures basic rates to 12, 24 Mbps if legacy 802.11b " +"rates are not used else to the 11 Mbps rate. Very High configures 24 Mbps as " +"the basic rate. Supported rates lower than the minimum basic rate are not " +"offered." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 +msgid "" +"Configures the default router advertisement in RA messages." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 +msgid "" +"Configures the operation mode of the RA service on this interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 +msgid "Configures the operation mode of the DHCPv6 service on this interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +msgid "" +"Configures the operation mode of the NDP proxy service on this interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 +msgid "Configure…" +msgstr "Konfigūruoti…" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:176 +msgid "Confirm disconnect" +msgstr "Patvirtinti atjungimą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:55 +msgid "Confirmation" +msgstr "Patvirtinimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 +msgid "Connected" +msgstr "Prisijungta" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:9 +#: modules/luci-compat/luasrc/model/network.lua:27 +msgid "Connection attempt failed" +msgstr "Bandymas prisijungti nepavyko" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 +msgid "Connection attempt failed." +msgstr "Bandymas prisijungti nepavyko." + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 +msgid "Connection endpoint" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:411 +msgid "Connection lost" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:160 +msgid "Connections" +msgstr "Prisijungimai" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 +msgid "Connectivity change" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:31 +msgctxt "nft ct state" +msgid "Conntrack state" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:33 +msgctxt "nft ct status" +msgid "Conntrack status" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:378 +msgid "Consider the slave up when all ARP IP targets are reachable (all, 1)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:377 +msgid "Consider the slave up when any ARP IP target is reachable (any, 0)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:18 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:368 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:55 +msgid "Contents have been saved." +msgstr "Turinys buvo išsaugotas." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 +msgid "Continue" +msgstr "Tęsti" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:97 +msgctxt "nft jump action" +msgid "Continue in %h" +msgstr "Tęsti po %h" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 +msgid "Continue in calling chain" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +msgctxt "Chain policy: accept" +msgid "Continue processing unmatched packets" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 +msgid "" +"Could not regain access to the device after applying the configuration " +"changes. You might need to reconnect if you modified network related " +"settings such as the IP address or wireless security credentials." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:189 +msgid "Country" +msgstr "Šalis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +msgid "Country Code" +msgstr "Šalies kodas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +msgid "Coverage cell density" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 +msgid "Create / Assign firewall-zone" +msgstr "Sukurti / Priskirti užkardos-zoną" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 +msgid "Create interface" +msgstr "Sukurti sąsają ir/arba sietuvą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:191 +msgid "Critical" +msgstr "Kritinė/-is" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:195 +msgid "Cron Log Level" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 +msgid "Current power" +msgstr "Dabartinė galia" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:28 +msgctxt "nft meta hour" +msgid "Current time" +msgstr "Dabartinis laikas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:29 +msgctxt "nft meta day" +msgid "Current weekday" +msgstr "Dabartinė savaitės diena" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:573 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:575 +#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:51 +#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:53 +#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:82 +#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:83 +msgid "Custom Interface" +msgstr "Pasirinktinė/-is sąsają ir/arba sietuvas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:410 +msgid "" +"Custom files (certificates, scripts) may remain on the system. To prevent " +"this, perform a factory-reset first." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:6 +msgid "Custom flash interval (kernel: timer)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:59 +msgid "" +"Customizes the behaviour of the device LEDs if possible." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 +msgid "DAD transmits" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 +msgid "DAE-Client" +msgstr "„DAE-Klientas“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 +msgid "DAE-Port" +msgstr "„DAE-Prievadas“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 +msgid "DAE-Secret" +msgstr "„DAE-Paslaptis“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 +msgid "DHCP Options" +msgstr "„DHCP“ nustatymai/pasirinkimai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 +msgid "DHCP Server" +msgstr "„DHCP“ serveris" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 +msgid "DHCP and DNS" +msgstr "„DHCP“ ir „DNS“" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2091 +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:16 +#: modules/luci-compat/luasrc/model/network.lua:969 +msgid "DHCP client" +msgstr "„DHCP“ klientas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +msgid "DHCP-Options" +msgstr "„DHCP“-Nustatymai/pasirinkimai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 +msgid "DHCPv6 client" +msgstr "„DHCPv6“ klientas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 +msgid "DHCPv6-Service" +msgstr "„DHCPv6“-Tarnyba" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:45 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:46 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:48 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:49 +msgid "DNS" +msgstr "„DNS“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 +msgid "DNS forwardings" +msgstr "„DNS“ perleidimai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +msgid "DNS query port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 +msgid "DNS search domains" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +msgid "DNS server port" +msgstr "„DNS“ serverio prievadas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:292 +msgid "DNS setting is invalid" +msgstr "„DNS“ nustatymas yra negalimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 +msgid "DNS weight" +msgstr "„DNS“ svoris" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:33 +msgid "DNS-Label / FQDN" +msgstr "„DNS-Žymė“ / „FQDN“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 +msgid "DNSSEC" +msgstr "„DNSSEC“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 +msgid "DNSSEC check unsigned" +msgstr "„DNSSEC“ patikrinimas nepasirašytas" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:99 +msgid "DPD Idle Timeout" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:41 +msgid "DS-Lite AFTR address" +msgstr "„DS-Lite AFTR“ adresas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 +msgid "DSL" +msgstr "„DSL“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +msgid "DSL Status" +msgstr "„DSL“ būsena" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 +msgid "DSL line mode" +msgstr "„DSL“ linijos režimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 +msgid "DTIM Interval" +msgstr "„DTIM“ intervalas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 +msgid "DUID" +msgstr "„DUID“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 +msgid "Data Rate" +msgstr "Duomenų dažnis" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Gauta duomenų" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Duomenų nusiųsta" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 +msgid "Debug" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 +msgid "Default router" +msgstr "Numatytas maršrutizatorius" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:12 +msgid "Default state" +msgstr "Numatyta būsena" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +msgid "" +"Define additional DHCP options, for example " +"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " +"servers to clients." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 +msgid "" +"Defines a mapping of Linux internal packet priority to VLAN header priority " +"but for outgoing frames" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 +msgid "" +"Defines a mapping of VLAN header priority to the Linux internal packet " +"priority on incoming frames" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 +msgid "Defines a specific MTU for this route" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 +msgid "Delegate IPv6 prefixes" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2310 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2740 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 +#: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 +#: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 +msgid "Delete" +msgstr "Ištrinti" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 +msgid "Delete key" +msgstr "Ištrinti raktą" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 +msgid "Delete request failed: %s" +msgstr "Ištrinimo prašymas nepavyko: %s" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 +msgid "Delete this network" +msgstr "Ištrinti šį tinklą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 +msgid "Delivery Traffic Indication Message Interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 +msgid "Description" +msgstr "Aprašymas" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 +msgid "Deselect" +msgstr "Atžymėti" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:237 +msgid "Design" +msgstr "Dizainas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 +msgid "Designated master" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 +msgid "Destination" +msgstr "Paskirties/Kelionės tikslo vieta" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:44 +msgctxt "nft ip daddr" +msgid "Destination IP" +msgstr "Paskirties/Kelionės tikslo „IP“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:48 +msgctxt "nft ip6 daddr" +msgid "Destination IPv6" +msgstr "Paskirties/Kelionės tikslo „IPv6“" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:48 +msgid "Destination port" +msgstr "Paskirties/Kelionės tikslo prievadas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:46 +msgctxt "nft ip dport" +msgid "Destination port" +msgstr "Galutinio tikslo/įrenginio prievadas" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 +msgid "Destination zone" +msgstr "Paskirties/Kelionės tikslo zona" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:67 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:281 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:357 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:393 +msgid "Device" +msgstr "Įrenginys" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 +msgid "Device Configuration" +msgstr "Įrenginio konfigūracija" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 +msgid "Device is not active" +msgstr "Įrenginys nėra aktyvus" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 +msgid "Device is restarting…" +msgstr "Įrenginys pasileidžia iš naujo…" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 +msgid "Device name" +msgstr "Įrenginio vardas" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 +msgid "Device not managed by ModemManager." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 +msgid "Device not present" +msgstr "Įrenginys nėra pasiekiamas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 +msgid "Device type" +msgstr "Įrenginio tipas" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 +msgid "Device unreachable!" +msgstr "Įrenginys nepasiekiamas!" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:53 +msgid "Device unreachable! Still waiting for device..." +msgstr "Įrenginys nepasiekiamas! Vis dar laukiama įrenginio..." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 +msgid "Devices" +msgstr "Įrenginiai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 +msgid "Diagnostics" +msgstr "Diagnostika" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 +msgid "Dial number" +msgstr "Surinkti numerį" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 +msgid "Directory" +msgstr "Katalogas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 +msgid "Disable" +msgstr "Išjungti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +msgid "" +"Disable DHCP for " +"this interface." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:375 +msgid "Disable DNS lookups" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 +msgid "Disable Encryption" +msgstr "Išjungti šifravimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 +msgid "Disable Inactivity Polling" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 +msgid "Disable this network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:57 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:70 +msgid "Disabled" +msgstr "Išjungtas/-i" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +msgctxt "Label indicating that WireGuard peer is disabled" +msgid "Disabled" +msgstr "Išjungtas/-i" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 +msgid "Disassociate On Low Acknowledgement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 +msgid "" +"Discard upstream responses containing RFC1918 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 +msgid "Disconnect" +msgstr "Atsijungti" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 +msgid "Disconnection attempt failed" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 +msgid "Disconnection attempt failed." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:35 +msgid "Disk space" +msgstr "Disko talpa" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:611 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3022 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 +msgid "Dismiss" +msgstr "Nepaisyti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +msgid "Distance Optimization" +msgstr "Atstumo optimizacija" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +msgid "Distance to farthest network member in meters." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 +msgid "" +"Dnsmasq instance to which this boot section is bound. If unspecified, the " +"section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 +msgid "" +"Dnsmasq is a lightweight DHCP server and DNS forwarder." +msgstr "" +"„Dnsmasq“ yra lengvai vežamas „DHCP“ serveris ir „DNS“ persiuntėjas..." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 +msgid "Do not cache negative replies, e.g. for non-existent domains." +msgstr "" +"Nesaugoti talpykloje neigiamų atsakų, pvz: neegzistuojantys domenai-sritys." + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:88 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:70 +msgid "Do not create host route to peer (optional)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +msgid "Do not forward DNS queries without dots or domain parts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +msgid "Do not forward reverse lookups for local networks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 +msgid "Do not listen on the specified interfaces." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +msgid "Do not offer DHCPv6 service on this interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 +msgid "" +"Do not proxy any NDP " +"packets." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:25 +msgid "Do not send a hostname" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 +msgid "" +"Do not send any RA messages on this interface." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 +msgid "Do you really want to delete \"%s\" ?" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 +msgid "Do you really want to delete the following SSH key?" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:94 +msgid "Do you really want to erase all settings?" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 +msgid "Do you really want to recursively delete the directory \"%s\" ?" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 +msgid "Do you want to replace the current PSK?" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:100 +msgid "Do you want to replace the current keys?" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 +msgid "Domain" +msgstr "Domenas-Sritis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +msgid "Domain required" +msgstr "Reikalingas domenas-sritis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 +msgid "Domain whitelist" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:83 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 +msgid "Don't Fragment" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 +msgid "Down" +msgstr "Žemyn" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:403 +msgid "Down Delay" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:394 +msgid "Download backup" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:432 +msgid "Download mtdblock" +msgstr "Atsisiųsti „mtdblock“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 +msgid "Downstream SNR offset" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 +msgid "" +"Drag or paste a valid *.conf file below to configure the local " +"WireGuard interface." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2698 +msgid "Drag to reorder" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:342 +msgid "Drop Duplicate Frames" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 +msgctxt "nft drop action" +msgid "Drop packet" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 +msgctxt "Chain policy: drop" +msgid "Drop unmatched packets" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 +msgid "Dropbear Instance" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 +msgid "" +"Dropbear offers SSH network shell access " +"and an integrated SCP server" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:14 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:11 +msgid "Dual-Stack Lite (RFC6333)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 +msgid "Dynamic DHCP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 +msgid "Dynamic Authorization Extension client." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 +msgid "Dynamic Authorization Extension port." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 +msgid "Dynamic Authorization Extension secret." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 +msgid "Dynamic tunnel" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 +msgid "" +"Dynamically allocate DHCP addresses for clients. If disabled, only clients " +"having static leases will be served." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Pvz: br-vlan arba brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Pvz: „eth01“, „eth2“" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 +msgid "EA-bits length" +msgstr "„EA-bit'ų“ ilgis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +msgid "EAP-Method" +msgstr "„EAP-Metodas“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2718 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2721 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 +msgid "Edit" +msgstr "Redaguoti" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:226 +msgid "Edit peer" +msgstr "Redaguoti lygiarangį" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/error.htm:13 +msgid "" +"Edit the raw configuration data above to fix any error and hit \"Save\" to " +"reload the page." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 +msgid "Edit this network" +msgstr "Redaguoti šį tinklą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 +msgid "Edit wireless network" +msgstr "Redaguoti šį belaidį tinklą" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:65 +msgctxt "nft rt mtu" +msgid "Effective route MTU" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 +msgid "Egress QoS mapping" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +msgctxt "nft meta oif" +msgid "Egress device id" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +msgctxt "nft meta oifname" +msgid "Egress device name" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 +msgid "Emergency" +msgstr "Kritinė situacija" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 +msgid "Enable" +msgstr "Įjungti" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 +msgid "Enable / Disable peer. Restart wireguard interface to apply changes." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 +msgid "" +"Enable IGMP " +"snooping" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 +msgid "Enable STP" +msgstr "Įjungti „STP“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +msgid "Enable SLAAC" +msgstr "Įjungti „SLAAC“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:369 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:375 +msgid "Enable DNS lookups" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:294 +msgid "Enable Dynamic Shuffling Of Flows" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 +msgid "Enable HE.net dynamic endpoint update" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 +msgid "Enable IPv6" +msgstr "Įgalinti „IPv6“" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 +msgid "Enable IPv6 negotiation" +msgstr "" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:54 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 +msgid "Enable IPv6 negotiation on the PPP link" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 +msgid "Enable Jumbo Frame passthrough" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 +msgid "Enable MAC address learning" +msgstr "Įgalinti „MAC“ adreso mokymą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:257 +msgid "Enable NTP client" +msgstr "Įjungti „NTP“ klientą" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 +msgid "Enable Single DES" +msgstr "Įjungti vienetinį „DES“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 +msgid "Enable TFTP server" +msgstr "Įjungti „TFTP“ serverį" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 +msgid "Enable VLAN filtering" +msgstr "Įjungti „VLAN“ filtravimą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:184 +msgid "Enable VLAN functionality" +msgstr "Įjungti/Įgalinti „VLAN“ funkcija/veiksmumą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 +msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" +msgstr "Įjungti „WPS“ mygtuko paspaudimą, reikalaują „WPA(2)-PSK“/„WPA3-SAE“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:14 +msgid "" +"Enable automatic redirection of HTTP requests to HTTPS port." +msgstr "" +"Įgalinti automatinį persiuntimą „HTTP“ užklausas į „HTTPS“ prievadą." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 +msgid "" +"Enable downstream delegation of IPv6 prefixes available on this interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 +msgid "Enable key reinstallation (KRACK) countermeasures" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:189 +msgid "Enable learning and aging" +msgstr "Įjungti pamokymą ir senstelėjimą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:200 +msgid "Enable mirroring of incoming packets" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:201 +msgid "Enable mirroring of outgoing packets" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 +msgid "Enable multicast fast leave" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 +msgid "Enable multicast querier" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 +msgid "Enable multicast support" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 +msgid "" +"Enable packet steering across all CPUs. May help or hinder network speed." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 +msgid "Enable promiscuous mode" +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:71 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:66 +msgid "Enable rx checksum" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:96 +msgid "Enable support for multicast traffic (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:83 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 +msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 +msgid "Enable the built-in single-instance TFTP server." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 +msgid "Enable this network" +msgstr "Įjungti šį tinklą" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:75 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:70 +msgid "Enable tx checksum" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 +msgid "Enable unicast flooding" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 +msgid "Enabled" +msgstr "Įjungta" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 +msgid "Enables IGMP snooping on this bridge" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 +msgid "" +"Enables fast roaming among access points that belong to the same Mobility " +"Domain" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 +msgid "Enables the Spanning Tree Protocol on this bridge" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:59 +msgid "Encapsulation limit" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 +msgid "Encapsulation mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 +msgid "Encryption" +msgstr "Šifravimas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Galutinis taškas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 +msgid "Endpoint Host" +msgstr "Galūtinio taško p.k – vedėjas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 +msgid "Endpoint Port" +msgstr "Galūtinio taško prievadas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:325 +msgid "Endpoint setting is invalid" +msgstr "Galūtinio taško nustatymas yra negalimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 +msgid "Enforce IGMPv1" +msgstr "Įsteigti „IGMPv1“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 +msgid "Enforce IGMPv2" +msgstr "Įsteigti „IGMPv2“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 +msgid "Enforce IGMPv3" +msgstr "Įsteigti „IGMPv3“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 +msgid "Enforce MLD version 1" +msgstr "Įsteigti „MLD versija 1“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 +msgid "Enforce MLD version 2" +msgstr "Įsteigti „MLD versija 2“" + +#: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 +msgid "Enter custom value" +msgstr "Įvesti pasirinktinę reikšmę" + +#: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 +msgid "Enter custom values" +msgstr "Įvesti pasirinktines reikšmes" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:97 +msgid "Erasing..." +msgstr "Šalinama..." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:105 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:107 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:190 +msgid "Error" +msgstr "Klaida" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:170 +msgid "Error getting PublicKey" +msgstr "Klaida gaunant „Viešasis Raktas“" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3008 +#: modules/luci-compat/luasrc/model/network.lua:1433 +msgid "Ethernet Adapter" +msgstr "Eterneto tinklo plokštė" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2999 +#: modules/luci-compat/luasrc/model/network.lua:1423 +msgid "Ethernet Switch" +msgstr "Eterneto tinklo komutatorius" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:272 +msgid "Every 30 seconds (slow, 0)" +msgstr "Kas trisdešimt (30) sekundžių (lėtai, 0)" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:273 +msgid "Every second (fast, 1)" +msgstr "Kas sekundę (greitai, 1)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +msgid "Exclude interfaces" +msgstr "Neįtraukti sąsajų ir sietuvų" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 +msgid "" +"Exempt 127.0.0.0/8 and ::1 from rebinding checks, " +"e.g. for RBL services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 +msgid "Existing device" +msgstr "Egzistuojantis įrenginys" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 +msgid "Expand hosts" +msgstr "Papildyti skleidėjų/p.k – vedėjų" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Tikėtinas prievado skaičius." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 +msgid "Expecting a hexadecimal assignment hint" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 +msgid "Expecting a valid IPv4 address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 +msgid "Expecting a valid IPv6 address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 +msgid "Expecting two priority values separated by a colon" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2269 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 +msgid "Expecting: %s" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:50 +msgid "Expecting: non-empty value" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:50 +msgid "Expires" +msgstr "Baigia galioti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 +msgid "" +"Expiry time of leased addresses, minimum is 2 minutes (2m)." +msgstr "" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:19 +msgid "External" +msgstr "Išorinis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 +msgid "External R0 Key Holder List" +msgstr "Išorinio „R0“ rakto laikytojo sąrašas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 +msgid "External R1 Key Holder List" +msgstr "Išorinio „R1“ rakto laikytojo sąrašas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167 +msgid "External system log server" +msgstr "Išorinės sistemos žurnalo serveris" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:172 +msgid "External system log server port" +msgstr "Išorinės sistemos žurnalo serverio prievadas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:177 +msgid "External system log server protocol" +msgstr "Išorinės sistemos žurnalo serverio protokolas" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:79 +msgid "Extra SSH command options" +msgstr "Papildomi „SSH“ komandos pasirinkimai" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 +msgid "Extra pppd options" +msgstr "Papildomi „pppd“ pasirinkimai" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 +msgid "Extra sstpc options" +msgstr "Papildomi „sstpc“ pasirinkimai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 +msgid "FT over DS" +msgstr "„FT per DS“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 +msgid "FT over the Air" +msgstr "„FT per orą“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 +msgid "FT protocol" +msgstr "„FT“ protokolas" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "Priežastis, kodėl nepavyko" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 +msgid "Failed to change the system password." +msgstr "Nepavyko pakeisti sistemos slaptažodžio." + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Nepavyko konfigūruoti modemą" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 +msgid "Failed to confirm apply within %ds, waiting for rollback…" +msgstr "" +"Nepavyko patvirtinti įgalimą vidun/per %ds, laukiama, kol bus sugrąžintą…" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Nepavyko prisijungti" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Nepavyko atsijungti" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 +msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" +msgstr "Nepavyko vykdyti „/etc/init.d/%s %s“ veiksmą: %s" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Nepavyko gauti modemo informacijos" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Nepavyko paleisti modemo" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Nepavyko nustatyti operavimo režimo" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 +msgid "File" +msgstr "Failas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 +msgid "" +"File listing upstream resolvers, optionally domain-specific, e.g. " +"server=1.2.3.4, server=/domain/1.2.3.4." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 +msgid "File not accessible" +msgstr "Failas nepasiekiamas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 +msgid "File to store DHCP lease information." +msgstr "Failas, skirtas laikyti „DHCP“ nuomos informaciją." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +msgid "File with upstream resolvers." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 +msgid "Filename" +msgstr "Failo pavadinimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 +msgid "Filename of the boot image advertised to clients." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:315 +msgid "Filesystem" +msgstr "Failų sistema" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Filtruoti „IPv4 A“ įrašus" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Filtruoti „IPv6 AAAA“ įrašus" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Filtruoti „SRV/SOA“ tarnybos atradimą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" +msgstr "Filtruoti privatūs" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 +msgid "Filtering for all slaves, no validation" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:390 +msgid "Filtering for all slaves, validation only for active slave" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:391 +msgid "Filtering for all slaves, validation only for backup slaves" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 +msgid "Finalizing failed" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 +msgid "" +"Find all currently attached filesystems and swap and replace configuration " +"with defaults based on what was detected" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 +msgid "Find and join network" +msgstr "Surasti ir prisijungti prie tinklo" + +#: modules/luci-compat/luasrc/view/cbi/delegator.htm:9 +msgid "Finish" +msgstr "Baigti" + +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:27 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:43 +msgid "Firewall" +msgstr "Užkarda" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +msgid "Firewall Mark" +msgstr "Užkardos Žymė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 +msgid "Firewall Settings" +msgstr "Užkardos nustatymai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:326 +msgid "Firewall Status" +msgstr "Užkardos būklė/būsena" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 +msgid "Firewall mark" +msgstr "Užkardos žymė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 +msgid "Firmware File" +msgstr "Programinės įrangos failas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +msgid "Firmware Version" +msgstr "Programinės įrangos versija" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 +msgid "Fixed source port for outbound DNS queries." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:312 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:449 +msgid "Flash image..." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:308 +msgid "Flash image?" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:439 +msgid "Flash new firmware image" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:384 +msgid "Flash operations" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:317 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:319 +msgid "Flashing…" +msgstr "Įrašoma laikmeną…" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 +msgid "Force" +msgstr "Priversti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 +msgid "Force 40MHz mode" +msgstr "Priversti 40Mhz režimą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +msgid "Force CCMP (AES)" +msgstr "Priversti „CCMP („AES“)“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 +msgid "Force DHCP on this network even if another server is detected." +msgstr "" +"Priversti „DHCP“ naudojimą šiame tinkle, net jeigu kitas serveris yra " +"aptiktas." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 +msgid "Force IGMP version" +msgstr "Priversti „IGMP“ versiją" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 +msgid "Force MLD version" +msgstr "Priversti „MLD“ versiją" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 +msgid "Force TKIP" +msgstr "Priversti „TKIP“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 +msgid "Force TKIP and CCMP (AES)" +msgstr "Priversti „TKIP“ ir „CCMP („AES“)“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "Priversti, kad „DHCP“ transliuotu atsaką." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 +msgid "Force link" +msgstr "Priversti pririšimą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:281 +msgid "Force upgrade" +msgstr "Priversti aukštutinį atnaujinimą" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:90 +msgid "Force use of NAT-T" +msgstr "Priversti „NAT-T“ naudojimą" + +#: modules/luci-base/ucode/template/csrftoken.ut:8 +msgid "Form token mismatch" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 +msgid "" +"Forward NDP NS and NA messages between the " +"designated master interface and downstream interfaces." +msgstr "" +"Persiųsti „NDP“ „NS“ ir „NA“ pranešimus tarp " +"nustatytos aukštumos sąsajos ir/arba sietuvų, bei atsiuntimo srautu." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 +msgid "" +"Forward RA " +"messages received on the designated master interface to downstream " +"interfaces." +msgstr "" +"Persiųsti „RA“ " +"gautus pranešimus nustatytame aukštumos sąsajos ir/arba sietuvų, bei " +"atsiuntimo srautu." + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:164 +msgid "Forward DHCP traffic" +msgstr "Persiųsti „DHCP“ srautą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 +msgid "" +"Forward DHCPv6 messages between the designated master interface and " +"downstream interfaces." +msgstr "" +"Persiųsti „DHCPv6“ pranešimus tarp nustatytų aukštumos sąsajos ir/arba " +"sietuvų, bei atsiuntimo srautų." + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 +msgid "Forward broadcast traffic" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 +msgid "Forward delay" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +msgid "Forward mesh peer traffic" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 +msgid "Forward multicast packets as unicast packets on this device." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 +msgid "Forwarding mode" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Fragmentavimas/-cija" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +msgid "Fragmentation Threshold" +msgstr "Fragmentacijos/-vimo slenkstis" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:62 +msgctxt "nft nat flag fully-random" +msgid "Full port randomization" +msgstr "Viso/Pilno prievado atsitiktinių imčių nustatymas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:214 +msgid "" +"Further information about WireGuard interfaces and peers at wireguard.com." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 +msgid "GHz" +msgstr "GHz" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 +msgid "GPRS only" +msgstr "Tik „GPRS“" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:10 +msgid "GRE tunnel over IPv4" +msgstr "„GRE“ tunelis per „IPv4“" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:10 +msgid "GRE tunnel over IPv6" +msgstr "„GRE“ tunelis per „IPv6“" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:10 +msgid "GRETAP tunnel over IPv4" +msgstr "„GRETAP“ tunelis per „IPv4“" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:10 +msgid "GRETAP tunnel over IPv6" +msgstr "„GRETAP“ tunelis per „IPv6“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 +msgid "Gateway" +msgstr "Tinklo tarpuvartė" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Tinklo tarpuvartės režimas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 +msgid "Gateway Ports" +msgstr "Tinklo tarpuvartės prievadai" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:11 +#: modules/luci-compat/luasrc/model/network.lua:29 +msgid "Gateway address is invalid" +msgstr "Tinklo tarpuvartės adresas yra negalimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 +msgid "General Settings" +msgstr "Bendri nustatymai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 +msgid "General Setup" +msgstr "Bendra sąranka" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 +msgid "General device options" +msgstr "Bendri įrenginio pasirinkimai" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 +msgid "Generate Config" +msgstr "Sukurti konfigūravimą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +msgid "Generate PMK locally" +msgstr "Sukurti vietinį „PMK“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:396 +msgid "Generate archive" +msgstr "Sukurti archyvą" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 +msgid "Generate configuration" +msgstr "Sukurti konfigūraciją" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 +msgid "Generate configuration…" +msgstr "Sukurti konfigūraciją…" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:109 +msgid "Generate new key pair" +msgstr "Sukurti naują raktų porą" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 +msgid "Generate preshared key" +msgstr "Sukurti „jau bendrintą“ raktą" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 +msgid "Generates a configuration suitable for import on a WireGuard peer" +msgstr "Sukuria konfigūracija tinkama importuoti į „WireGuard“ lygiarangį" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 +msgid "Generating QR code…" +msgstr "Sukuriamas „QR kodas“…" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:79 +msgid "Given password confirmation did not match, password not changed!" +msgstr "Duotas slaptažodžio patvirtinimas, nesutapo, slaptažodis nepakeistas!" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:146 +msgid "Global Settings" +msgstr "Pagrindiniai/Vieši nustatymai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 +msgid "Global network options" +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 +msgid "Go to firmware upgrade..." +msgstr "Eiti į programinės įrangos aukštutinį atnaujinimą..." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 +msgid "Go to password configuration..." +msgstr "Eiti į slaptažodžio konfigūravimą..." + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2640 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 +#: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 +msgid "Go to relevant configuration page" +msgstr "Eiti į atitinkamą konfigūracijos puslapį" + +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 +msgid "Grant access to DHCP configuration" +msgstr "Duoti prieigą prie „DHCP“ konfigūracijos" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 +msgid "Grant access to DHCP status display" +msgstr "Duoti/Suteikti prieigą prie „DHCP“ būsenos rodymo" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 +msgid "Grant access to DSL status display" +msgstr "Duoti prieigą prie „DSL“ būsenos rodymo" + +#: protocols/luci-proto-openconnect/root/usr/share/rpcd/acl.d/luci-openconnect.json:3 +msgid "Grant access to LuCI OpenConnect procedures" +msgstr "Duoti prieigą prie „LuCI OpenConnect procedures“" + +#: protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json:3 +msgid "Grant access to LuCI Wireguard procedures" +msgstr "Duoti prieigą prie „LuCI Wireguard procedures“" + +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Duoti prieigą prie „LuCI openfortivpn procedures“" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 +msgid "Grant access to SSH configuration" +msgstr "Duoti prieigą prie „SSH“ konfigūracijos" + +#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:12 +msgid "Grant access to basic LuCI procedures" +msgstr "Duoti prieigą prie paprastų „LuCI procedures“" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:79 +msgid "Grant access to crontab configuration" +msgstr "Duoti prieigą prie „crontab“ konfigūracijos" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:70 +msgid "Grant access to firewall status" +msgstr "Duoti prieigą prie užkardos būsenos" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:132 +msgid "Grant access to flash operations" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:3 +msgid "Grant access to main status display" +msgstr "Duoti/Suteikti prieigą pagrindiniui statuso rodymui" + +#: protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json:3 +msgid "Grant access to mmcli" +msgstr "Duoti prieigą prie „mmcli“" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:100 +msgid "Grant access to mount configuration" +msgstr "" + +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:3 +msgid "Grant access to network configuration" +msgstr "Duoti prieigą prie tinklo konfigūracijos" + +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 +msgid "Grant access to network diagnostic tools" +msgstr "Duoti prieigą prie tinklo diagnostinių įrankių" + +#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:36 +msgid "Grant access to network status information" +msgstr "Duoti prieigą prie tinklo būklės ir būsenos informacijos" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 +msgid "Grant access to process status" +msgstr "Duoti prieigą prie proceso būsenos" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:3 +msgid "Grant access to realtime statistics" +msgstr "Duoti prieigą prie realaus laiko statistikos" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:47 +msgid "Grant access to routing status" +msgstr "Duoti prieigą prie kelvados būklės ir būsenos" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:57 +msgid "Grant access to startup configuration" +msgstr "Duoti prieigą prie paleidimo konfigūracijos" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:3 +msgid "Grant access to system configuration" +msgstr "Duoti prieigą prie sistemos konfigūracijos" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:30 +msgid "Grant access to system logs" +msgstr "Duoti prieigą prie sistemos žurnalų" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:43 +msgid "Grant access to uHTTPd configuration" +msgstr "Duoti prieigą prie „uHTTPd“ konfigūracijos" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:61 +msgid "Grant access to wireless channel status" +msgstr "Duoti prieigą prie belaidžių kanalų būsenos ir būklės" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 +msgid "Grant access to wireless status display" +msgstr "Duoti/Suteikti prieigą į belaidžio statuso rodymą" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66 +msgid "Group Password" +msgstr "Grupės slaptažodis" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:22 +msgid "Guest" +msgstr "Svečias" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 +msgid "HE.net password" +msgstr "„HE.net“ slaptažodis" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 +msgid "HE.net username" +msgstr "„HE.net“ slapyvardis/vartotojo vardas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:64 +msgid "HTTP(S) Access" +msgstr "„HTTP(S)“ Prieiga/Prieinamumas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:46 +msgid "Hang Up" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +msgid "Heartbeat interval (kernel: heartbeat)" +msgstr "Širdies dūžio intervalas („kernel: heartbeat“)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 +msgid "Hello interval" +msgstr "„Labas“ intervalas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:114 +msgid "" +"Here you can configure the basic aspects of your device like its hostname or " +"the timezone." +msgstr "" +"Čia galite konfigūruoti paprastus įrenginio nuožiūras kaip jo pavadinimą ir " +"laiko zoną." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 +msgid "Hide ESSID" +msgstr "Slėpti „ESSID“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:332 +msgid "Hide empty chains" +msgstr "Slėpti tuščias grandines" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +msgid "High" +msgstr "Aukštas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "Gerbti „neatlyginamą/be pagrindo – ARP“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 +msgctxt "Chain hook description" +msgid "Hook: %h (%h), Priority: %d" +msgstr "Pririšti: %h (%h), Prioritetas: %d" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Peršokimo nuobauda" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 +msgid "Host" +msgstr "Skleidėjas/P.k – vedėjas" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 +msgid "Host expiry timeout" +msgstr "Skleidėjo/P.k – vedėjo atjungimo laikas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 +msgid "Host requests this filename from the boot server." +msgstr "" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 +msgid "Host-Uniq tag content" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 +msgid "Hostname" +msgstr "Įrenginio pavadinimas" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:22 +msgid "Hostname to send when requesting DHCP" +msgstr "Kokį įrenginio pavadinimą siųsti, kai prašoma „DHCP“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 +msgid "Hostnames" +msgstr "Įrenginio pavadinimai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 +msgid "" +"Hostnames are used to bind a domain name to an IP address. This setting is " +"redundant for hostnames already configured with static leases, but it can be " +"useful to rebind an FQDN." +msgstr "" +"Įrenginio pavadinimas yra naudojami pririšti domeno-srities vardą prie „IP“ " +"adreso. Šis nustatymas yra beprasmis, jeigu jo pavadinimai jau yra " +"nustatyti, bet gali būti naudingas perrišant „FQDN“." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:19 +msgid "How long (in milliseconds) the LED should be off" +msgstr "Kokios trukmės (milisekundėmis) „LED“ lemputė turėtų būti išjungta" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:13 +msgid "How long (in milliseconds) the LED should be on" +msgstr "Kokios trukmės (milisekundėmis) „LED“ lemputė turėtų būti įjungta" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 +msgid "Human-readable counters" +msgstr "Žmogui perskaitomi rodikliai" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:24 +msgid "Hybrid" +msgstr "Hibridas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:49 +msgctxt "nft icmp code" +msgid "ICMP code" +msgstr "„ICMP“ kodas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:50 +msgctxt "nft icmp type" +msgid "ICMP type" +msgstr "„ICMP“ tipas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:51 +msgctxt "nft icmpv6 code" +msgid "ICMPv6 code" +msgstr "„ICMPv6“ kodas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:52 +msgctxt "nft icmpv6 type" +msgid "ICMPv6 type" +msgstr "„ICMPv6“ tipas" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 +msgid "ID used to uniquely identify the VXLAN" +msgstr "ID yra naudojamas unikaliai identifikuoti „VXLAN“" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:208 +msgid "IEEE 802.3ad Dynamic link aggregation (802.3ad, 4)" +msgstr "Dinaminis sujungimo agregatorius „IEEE 802.3ad (802.3ad, 4)“" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:75 +msgid "IKE DH Group" +msgstr "„IKE DH Group“" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "„IMEI“" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 +msgid "IP Addresses" +msgstr "„IP“ adresai" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +msgid "IP Protocol" +msgstr "„IP“ protokolas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +msgid "IP Sets" +msgstr "„IP“ rinkiniai" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +msgid "IP Type" +msgstr "„IP“ tipas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 +msgid "IP address" +msgstr "„IP“ adresas" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:10 +#: modules/luci-compat/luasrc/model/network.lua:28 +msgid "IP address is invalid" +msgstr "„IP“ adresas yra neteisingas/netinkamas" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:13 +#: modules/luci-compat/luasrc/model/network.lua:31 +msgid "IP address is missing" +msgstr "Nėra „IP“ adreso" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +msgid "" +"IP addresses that are allowed inside the tunnel. The peer will accept " +"tunnelled packets with source IP addresses matching this list and route back " +"packets with matching destination IP." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 +msgctxt "nft ip protocol" +msgid "IP protocol" +msgstr "„IP“ protokolas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 +msgctxt "nft meta l4proto" +msgid "IP protocol" +msgstr "„IP“ protokolas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 +msgid "IP set" +msgstr "„IP“ rinkinys" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +msgid "IP sets" +msgstr "„IP“ rinkiniai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +msgid "IPs to override with NXDOMAIN" +msgstr "Perrašyti/Perkeisti „IP's“ (Dgs.) su „NXDOMAIN“" + +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:9 +msgid "IPsec XFRM" +msgstr "„IPsec XFRM“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +msgid "IPv4" +msgstr "„IPv4“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:351 +msgid "IPv4 Firewall" +msgstr "„IPv4“ užkarda" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:252 +msgid "IPv4 Neighbours" +msgstr "„IPv4 kaimynai“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:251 +msgid "IPv4 Routing" +msgstr "„IPv4“ maršrutizavimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 +msgid "IPv4 Rules" +msgstr "„IPv4“ taisyklės" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 +msgid "IPv4 Upstream" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 +msgid "IPv4 address" +msgstr "„IPv4“ adresas" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:29 +msgid "IPv4 assignment length" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:181 +msgid "IPv4 broadcast" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:180 +msgid "IPv4 gateway" +msgstr "„IPv4“ tinklo tarpuvartė" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:179 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:170 +msgid "IPv4 netmask" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:305 +msgid "IPv4 network in address/netmask notation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 +msgid "IPv4 only" +msgstr "Tik „IPv4“" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:52 +msgid "IPv4 prefix" +msgstr "„IPv4“ prielinksnis" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 +msgid "IPv4 prefix length" +msgstr "„IPv4“ prielinksnio ilgis" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 +msgid "IPv4 traffic table \"%h\"" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 +msgid "IPv4+IPv6" +msgstr "„IPv4+IPv6“" + +#: modules/luci-compat/luasrc/model/network/proto_ipip.lua:9 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:10 +msgid "IPv4-in-IPv4 (RFC2003)" +msgstr "„IPv4-in-IPv4 (RFC2003)“" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "„IPv4/IPv6“" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 +msgid "IPv4/IPv6 (both - defaults to IPv4)" +msgstr "„IPv4/IPv6 (abu - numatyti į „IPv4“)“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 +msgid "IPv4/IPv6 traffic table \"%h\"" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:94 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:95 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:96 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 +msgid "IPv6" +msgstr "„IPv6“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:354 +msgid "IPv6 Firewall" +msgstr "„IPv6“ užkarda" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 +msgid "IPv6 MTU" +msgstr "„IPv6 MTU“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:262 +msgid "IPv6 Neighbours" +msgstr "„IPv6 kaimynai“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 +msgid "IPv6 RA Settings" +msgstr "„IPv6 RA“ nustatymai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:261 +msgid "IPv6 Routing" +msgstr "„IPv6“ maršrutizavimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 +msgid "IPv6 Rules" +msgstr "„IPv6“ taisyklės" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 +msgid "IPv6 Settings" +msgstr "„IPv6“ nustatymai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 +msgid "IPv6 ULA-Prefix" +msgstr "„IPv6 ULA“ prielinksnis" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 +msgid "IPv6 Upstream" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:135 +msgid "IPv6 address" +msgstr "„IPv6“ adresas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 +msgid "IPv6 assignment hint" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 +msgid "IPv6 assignment length" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:188 +msgid "IPv6 gateway" +msgstr "„IPv6“ tinklo tarpuvartė" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:310 +msgid "IPv6 network in address/netmask notation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 +msgid "IPv6 only" +msgstr "Tik „IPv6“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 +msgid "IPv6 preference" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 +msgid "IPv6 prefix" +msgstr "„IPv6“ prielinksnis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 +msgid "IPv6 prefix filter" +msgstr "„IPv6“ prielinksnio filtras" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 +msgid "IPv6 prefix length" +msgstr "„IPv6“ prielinksnio ilgis" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 +msgid "IPv6 routed prefix" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 +msgid "IPv6 source routing" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 +msgid "IPv6 suffix" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 +msgid "IPv6 support" +msgstr "„IPv6“ palaikymas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 +msgid "IPv6 traffic table \"%h\"" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:101 +msgid "IPv6-PD" +msgstr "„IPv6-PD“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 +msgid "IPv6-in-IPv4 (RFC4213)" +msgstr "„IPv6-in-IPv4 (RFC4213)“" + +#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:17 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:9 +msgid "IPv6-over-IPv4 (6rd)" +msgstr "„IPv6-over-IPv4 (6rd)“" + +#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:15 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:9 +msgid "IPv6-over-IPv4 (6to4)" +msgstr "„IPv6-over-IPv4 (6to4)“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 +msgid "Identity" +msgstr "Tapatybė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 +msgid "If checked, 1DES is enabled" +msgstr "Jei pažymėtą, „1DES“ yra įjungtas" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 +msgid "If checked, adds \"+ipv6\" to the pppd options" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 +msgid "If checked, encryption is disabled" +msgstr "Jeigu pažymėtą, šifravimas bus/yra atjungtas/neįjungtas/neįgalintas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 +msgid "" +"If set, downstream subnets are only allocated from the given IPv6 prefix " +"classes." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 +msgid "If set, the meaning of the match options is inverted" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 +msgid "" +"If specified, mount the device by its UUID instead of a fixed device node" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:377 +msgid "" +"If specified, mount the device by the partition label instead of a fixed " +"device node" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 +msgid "" +"If the IP address used to access LuCI changes, a manual reconnect to " +"the new IP is required within %d seconds to confirm the settings, " +"otherwise modifications will be reverted." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 +msgid "If unchecked, no default route is configured" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 +msgid "If unchecked, the advertised DNS server addresses are ignored" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 +msgid "" +"If your physical memory is insufficient unused data can be temporarily " +"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a " +"very slow process as the swap-device cannot be accessed with the high " +"datarates of the RAM." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "Ignoruoti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +msgid "Ignore /etc/hosts" +msgstr "Ignoruoti /etc/hosts" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +msgid "Ignore interface" +msgstr "Ignoruoti sąsaja ir/arba sietuvą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +msgid "Ignore resolv file" +msgstr "Ignoruoti „resolv“ failą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:447 +msgid "Image" +msgstr "Laikmena" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:273 +msgid "Image check failed:" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 +msgid "Import as peer" +msgstr "Importuoti kaip lygiarangis" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 +msgid "Import configuration" +msgstr "Importuoti konfigūracija" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 +msgid "Import configuration as peer…" +msgstr "Importuoti konfigūracija kaip lygiarangis…" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 +msgid "Import settings" +msgstr "Importuoti nustatymus" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 +msgid "Imported peer configuration" +msgstr "Importuoti lygiarangio konfigūracija" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 +msgid "Imports settings from an existing WireGuard configuration file" +msgstr "" +"Importuoja nustatymus iš egzistuojančio „WireGuard“ konfigūracijos failo" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:68 +msgid "In" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 +msgid "" +"In order to prevent unauthorized access to the system, your request has been " +"blocked. Click \"Continue »\" below to return to the previous page." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 +msgid "In seconds" +msgstr "Sekundėmis" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:156 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:114 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:92 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:101 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:124 +msgid "Inactivity timeout" +msgstr "Neaktyvumo užklausos laikas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:267 +msgid "Inbound:" +msgstr "Įeinantis:" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:262 +msgid "" +"Include in backup a list of current installed packages at /etc/backup/" +"installed_packages.txt" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:100 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:105 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:102 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:107 +msgid "Incoming checksum" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 +msgid "Incoming interface" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 +msgid "Incoming key" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:102 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:107 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:104 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:109 +msgid "Incoming serialization" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:187 +msgid "Info" +msgstr "Info" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 +msgid "Information" +msgstr "Informacija" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 +msgid "Ingress QoS mapping" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +msgctxt "nft meta iif" +msgid "Ingress device id" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 +msgctxt "nft meta iifname" +msgid "Ingress device name" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 +msgid "Initialization failure" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:77 +msgid "Initscript" +msgstr "„Initscript“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:111 +msgid "Initscripts" +msgstr "„Initscripts“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +msgid "Inner certificate constraint (Domain)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 +msgid "Inner certificate constraint (SAN)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 +msgid "Inner certificate constraint (Subject)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 +msgid "Inner certificate constraint (Wildcard)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 +msgid "Install protocol extensions..." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 +msgid "Instance" +msgstr "Egzempliorius" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 +msgid "" +"Instead of joining any network with a matching SSID, only connect to the " +"BSSID %h." +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/map.htm:43 +msgid "Insufficient permissions to read UCI configuration." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 +msgid "Interface" +msgstr "Sąsaja ir Sietuvas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 +msgid "Interface \"%h\" is already marked as designated master." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:62 +msgid "Interface %q device auto-migrated from %q to %q." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 +msgid "Interface Configuration" +msgstr "" + +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:39 +msgid "Interface ID" +msgstr "Sąsajos ir Sietuvo ID" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:151 +msgid "Interface has %d pending changes" +msgstr "Sąsaja ir/arba Sietuvas turi %d laukiamus pakeitimus" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:92 +msgid "Interface is disabled" +msgstr "Sąsaja ir/arba Sietuvas yra išjungtas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:65 +msgid "Interface is marked for deletion" +msgstr "Sąsaja ir/arba Sietuvas yra pažymėtas ištrynimui" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:210 +msgid "Interface is reconnecting..." +msgstr "Sąsaja ir/arba Sietuvas persijungia..." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:194 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:204 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:210 +msgid "Interface is shutting down..." +msgstr "Sąsaja ir/arba Sietuvas išsijungia..." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 +msgid "Interface is starting..." +msgstr "Sąsaja ir/arba Sietuvas pasileidžia..." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 +msgid "Interface is stopping..." +msgstr "Sąsaja ir/arba Sietuvas sustoja..." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 +msgid "Interface name" +msgstr "Sąsajos ir/arba Sietuvo pavadinimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 +msgid "Interface not present or not connected yet." +msgstr "Sąsaja ir/arba Sietuvas nėra pasiekiamas arba nėra prijungtas." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 +msgid "Interfaces" +msgstr "Sąsajos ir Sietuvai" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:20 +msgid "Internal" +msgstr "Vidinis" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 +msgid "Interval For Sending Learning Packets" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 +msgid "" +"Interval in centiseconds between multicast general queries. By varying the " +"value, an administrator may tune the number of IGMP messages on the subnet; " +"larger values cause IGMP Queries to be sent less often" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 +msgid "Interval in seconds for STP hello packets" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:192 +#: modules/luci-compat/luasrc/view/cbi/tsection.htm:42 +msgid "Invalid" +msgstr "Negalimas" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 +msgid "Invalid APN provided" +msgstr "Negalimas pateiktas „APN“" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:40 +msgid "Invalid Base64 key string" +msgstr "Negalimas „Base64“ rakto įvestis" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Negalimas „IPv6“ adresas" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 +msgid "Invalid TOS value, expected 00..FF or inherit" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:83 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:88 +msgid "Invalid Traffic Class value, expected 00..FF or inherit" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:285 +msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:294 +msgid "Invalid VLAN ID given! Only unique IDs are allowed" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:403 +msgid "Invalid argument" +msgstr "Negalimas argumentas" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 +msgid "" +"Invalid bearer list. Possibly too many bearers created. This protocol " +"supports one and only one bearer." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:402 +msgid "Invalid command" +msgstr "Negalima komanda" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:205 +msgid "Invalid hexadecimal value" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Negalimas įrenginio pavadinimas arba „IPv4“ adresas" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Negalimas prievadas" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "Negalimas serverio „URL“" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 +msgid "Invalid username and/or password! Please try again." +msgstr "" +"Neteisingas vartotojo vardas ir/arba slaptažodis! Prašome pamėginti dar " +"kartą." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 +msgid "Invert match" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "Yra pagrindinis „VLAN“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 +msgid "Isolate Clients" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:236 +msgid "" +"It appears that you are trying to flash an image that does not fit into the " +"flash memory, please verify the image file!" +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 +msgid "JavaScript required!" +msgstr "Reikalingas „JavaScript“!" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 +msgid "Join Network" +msgstr "Prisijungti prie tinklo" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 +msgid "Join Network: Wireless Scan" +msgstr "Prisijungti prie tinklo: Belaidis skenavimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 +msgid "Joining Network: %q" +msgstr "Prisijungiamas prie tinklo: %q" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 +msgid "Jump to rule" +msgstr "Eiti prie taisyklės" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:228 +msgid "Keep settings and retain the current configuration" +msgstr "Laikyti nustatymus ir dabartinį konfigūravimą" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "„Laikyti-gyvą“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 +msgid "Kernel Log" +msgstr "„Kernel“ žurnalas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +msgid "Kernel Version" +msgstr "„Kernel“ versija" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 +msgid "Key" +msgstr "Raktas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 +msgid "Key #%d" +msgstr "Raktas #%d" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 +msgid "Key for incoming packets (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:96 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 +msgid "Key for outgoing packets (optional)." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +msgctxt "Label indicating that WireGuard peer lacks public key" +msgid "Key missing" +msgstr "" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 +msgctxt "nft unit" +msgid "KiB" +msgstr "KiB" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:54 +msgid "Kill" +msgstr "Nužudyti" + +#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:21 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:10 +msgid "L2TP" +msgstr "„L2TP“" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:40 +msgid "L2TP Server" +msgstr "„L2TP“ serveris" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:269 +msgid "LACPDU Packets" +msgstr "„LACPDU“ paketai" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:130 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:102 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:88 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:62 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:75 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:98 +msgid "LCP echo failure threshold" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:143 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:101 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:75 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:88 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:111 +msgid "LCP echo interval" +msgstr "" + +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:115 +msgid "LED Configuration" +msgstr "„LED“ (Lemputės) Konfigūracija" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 +msgid "LLC" +msgstr "„LLC“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:377 +msgid "Label" +msgstr "Etiketė" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:225 +msgid "Language" +msgstr "Kalba" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:125 +msgid "Language and Style" +msgstr "Kalba ir stilius" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +msgid "Last member interval" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 +msgid "Leaf" +msgstr "„Lapas“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 +msgid "Learn" +msgstr "Sužinoti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Learn routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 +msgid "Lease file" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 +msgid "Lease time" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:41 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:90 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:137 +msgid "Lease time remaining" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 +msgid "Leave empty to autodetect" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:40 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:45 +msgid "Leave empty to use the current WAN address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 +msgid "" +"Legacy or badly behaving devices may require legacy 802.11b rates to " +"interoperate. Airtime efficiency may be significantly reduced where these " +"are used. It is recommended to not allow 802.11b rates where possible." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 +msgid "Legacy rules detected" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 +msgid "Legend:" +msgstr "Legenda (už.):" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +msgid "Limit" +msgstr "Limitas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 +msgid "Line Mode" +msgstr "Linijos režimas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 +msgid "Line State" +msgstr "Linijos būsena" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 +msgid "Line Uptime" +msgstr "Linijos aktyvumo laikas" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:125 +msgid "Link Aggregation (Channel Bonding)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:349 +msgid "Link Monitoring" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:24 +msgid "Link On" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:77 +msgctxt "nft @ll,off,len" +msgid "Link layer header bits %d-%d" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +msgid "List of IP addresses to convert into NXDOMAIN responses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 +msgid "" +"List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" +"Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " +"(NAS Identifier) to a destination MAC address when requesting PMK-R1 key " +"from the R0KH that the STA used during the Initial Mobility Domain " +"Association." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 +msgid "" +"List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " +"as 6 octets with colons,128-bit key as hex string.
    This list is used " +"to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the " +"R0KH. This is also the list of authorized R1KHs in the MD that can request " +"PMK-R1 keys." +msgstr "" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:82 +msgid "List of SSH key files for auth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 +msgid "List of domains to allow RFC1918 responses for." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 +msgid "List of upstream resolvers to forward queries to." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 +msgid "Listen Port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 +msgid "Listen interfaces" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 +msgid "Listen only on the given interface or, if unspecified, on all" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +msgid "" +"Listen only on the specified interfaces, and loopback if not excluded " +"explicitly." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:299 +msgid "ListenPort setting is invalid" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +msgid "Listening port for inbound DNS queries." +msgstr "" + +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:130 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:54 +msgid "Load" +msgstr "Įkelti/Krauti" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 +msgid "Load Average" +msgstr "Įkėlimo/Krovimo vidurkis" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:189 +msgid "Load configuration…" +msgstr "Įkelti konfigūracija…" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 +msgid "Loading data…" +msgstr "Kraunama duomenis…" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 +msgid "Loading directory contents…" +msgstr "Kraunama vietovės turinį…" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 +msgid "Loading view…" +msgstr "Kraunamas vaizdas…" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 +msgid "Local" +msgstr "Vietinis" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 +msgid "Local IP address" +msgstr "Vietinis „IP“ adresas" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:12 +#: modules/luci-compat/luasrc/model/network.lua:30 +msgid "Local IP address is invalid" +msgstr "Vietinis „IP“ adresas yra negalimas" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:86 +msgid "Local IP address to assign" +msgstr "Prisegti vietini „IP“ adresą" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:40 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 +msgid "Local IPv4 address" +msgstr "Vietinis „IPv4“ adresas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +msgid "Local IPv6 DNS server" +msgstr "Vietinis „IPv6 DNS“ serveris" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:53 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:54 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:45 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 +msgid "Local IPv6 address" +msgstr "Vietinis „IPv6“ adresas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:115 +msgid "Local Startup" +msgstr "Vietinis paleidimas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 +msgid "Local Time" +msgstr "Vietinis laikas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 +msgid "Local ULA" +msgstr "Vietinis „ULA“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 +msgid "Local domain" +msgstr "Vietinis domenas-sritis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +msgid "Local domain suffix appended to DHCP names and hosts file entries." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +msgid "Local server" +msgstr "Vietinis serveris" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 +msgid "Local service only" +msgstr "Tik vietinė tarnyba" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Vietinis „wireguard“ raktas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 +msgid "Localise queries" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 +msgid "Lock to BSSID" +msgstr "Užrakinti prie „BSSID“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Žurnalo įvykis „%h...“" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Prisijungti" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Prisijungti…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Atsijungti" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 +msgid "Log output level" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 +msgid "Log queries" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:123 +msgid "Logging" +msgstr "Žurnalininimas" + +#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:23 +msgid "Logging in…" +msgstr "Prisijungiama…" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 +msgid "" +"Logical network from which to select the local endpoint if local IPv6 " +"address is empty and no WAN IPv6 is available (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 +msgid "Logical network to which the tunnel will be added (bridged) (optional)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +msgid "Loose filtering" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 +msgid "MAC" +msgstr "„MAC“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 +msgid "MAC Address" +msgstr "„MAC“ adresas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 +msgid "MAC Address Filter" +msgstr "„MAC“ adreso filtras" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:253 +msgid "MAC Address For The Actor" +msgstr "„MAC“ adresas „For The Actor“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 +msgid "MAC VLAN" +msgstr "„MAC VLAN“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:179 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:205 +msgid "MAC address" +msgstr "„MAC“ adresas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "„MAC“ adresas/-ai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +msgid "MAC-Filter" +msgstr "„MAC-Filtras“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 +msgid "MAC-List" +msgstr "„MAC-Sąrašas“" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:16 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:13 +msgid "MAP / LW4over6" +msgstr "„MAP / LW4over6“" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:62 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:7 +msgid "MAP rule is invalid" +msgstr "„MAP“ taisyklė yra negalima" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "„MBIM Mobilusis“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 +msgid "MD5" +msgstr "„MD5“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:28 +msgid "MHz" +msgstr "MHz" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:354 +msgid "MII" +msgstr "„MII“" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:422 +msgid "MII / ETHTOOL ioctls" +msgstr "„MII / ETHTOOL ioctls“" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:395 +msgid "MII Interval" +msgstr "„MII“ Intervalas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 +msgid "MTU" +msgstr "„MTU“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "„MX“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 +msgid "" +"Make sure to clone the root filesystem using something like the commands " +"below:" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:58 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:71 +msgid "Manual" +msgstr "Rankinis" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "Gamintojas" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 +msgid "Master" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" +msgstr "Maksimalus „RA“ intervalas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 +msgid "Max. DHCP leases" +msgstr "Maks. „DHCP leases“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 +msgid "Max. EDNS0 packet size" +msgstr "Maks. „EDNS0“ paketo dydis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 +msgid "Max. concurrent queries" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +msgid "Maximum age" +msgstr "Maksimalus amžius" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 +msgid "Maximum allowed Listen Interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 +msgid "Maximum allowed number of active DHCP leases." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 +msgid "Maximum allowed number of concurrent DNS queries." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 +msgid "Maximum allowed size of EDNS0 UDP packets." +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 +msgid "Maximum amount of seconds to wait for the modem to become ready" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +msgid "Maximum number of leased addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 +msgid "Maximum snooping table size" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "" +"Maximum time allowed between sending unsolicited RA. Default is 600 seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 +msgid "Maximum transmit power" +msgstr "Maksimalus energijos perdavimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Gali sustabdyti „VoIP“ ar kitas tarnybas nuo veikimo." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:28 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:171 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:323 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:324 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:325 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:329 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:330 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:331 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 +msgid "Medium" +msgstr "Vidutinis" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:24 +msgid "Memory" +msgstr "Atmintis" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:73 +msgid "Memory usage (%)" +msgstr "Atminties naudojimas (%)" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 +msgid "Mesh" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 +msgid "Mesh ID" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 +msgid "Mesh Id" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 +msgid "Method not found" +msgstr "Būdas nerastas" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:350 +msgid "Method of link monitoring" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:419 +msgid "Method to determine link status" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 +msgid "Metric" +msgstr "Metrinė" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:70 +msgctxt "nft unit" +msgid "MiB" +msgstr "MiB" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 +msgid "Min RA interval" +msgstr "Minimalus „RA“ intervalas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 +msgid "Minimum ARP validity time" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:237 +msgid "Minimum Number of Links" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 +msgid "" +"Minimum required time in seconds before an ARP entry may be replaced. " +"Prevents ARP cache thrashing." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 +msgid "" +"Minimum time allowed between sending unsolicited RA. Default is 200 seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:204 +msgid "Mirror monitor port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:203 +msgid "Mirror source port" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "Mobilus šalies kodas" + +#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 +msgid "Mobile Data" +msgstr "Mobilusis ryšys" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "Mobilausk tinklo kodas" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "Mobiliojo ryšio paslauga" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 +msgid "Mobility Domain" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 +msgid "Mode" +msgstr "Režimas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 +msgid "Model" +msgstr "Modelis" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "Modemo informacija" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 +msgid "" +"Modem connection in progress. Please wait. This process will timeout after 2 " +"minutes." +msgstr "" +"Modemas jungiasi. Prašome palaukti. Šis procesas pabaigs užklausos laiką po " +"dviejų (2) minučių." + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 +msgid "Modem default" +msgstr "Modemo numatytas" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 +msgid "Modem device" +msgstr "Modemo įrenginys" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 +msgid "Modem information query failed" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 +msgid "Modem init timeout" +msgstr "Modemo „init“ užklausos laikas" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 +msgid "ModemManager" +msgstr "„Modemo Tvarkytuvas“" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 +msgid "Monitor" +msgstr "Monitorius" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 +msgid "More Characters" +msgstr "Daugiau charakterių" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2581 +msgid "More…" +msgstr "Daugiau…" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:192 +msgid "Mount Point" +msgstr "Prijungimo taškas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:144 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:102 +msgid "Mount Points" +msgstr "Prijungimo taškai" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:229 +msgid "Mount Points - Mount Entry" +msgstr "Prijungimo taškai – Prijungimo įvadas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:341 +msgid "Mount Points - Swap Entry" +msgstr "Prijungimo taškai – Sukeitimo įvadas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 +msgid "" +"Mount Points define at which point a memory device will be attached to the " +"filesystem" +msgstr "" +"Prijungimo taškai nustato, į kurį atminties įrenginį bus prijungta failų " +"sistema" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 +msgid "Mount attached devices" +msgstr "Prijungti įrenginiai" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 +msgid "Mount filesystems not specifically configured" +msgstr "Prijungimo failų sistemos nėra specifiškai konfigūruotos" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:332 +msgid "Mount options" +msgstr "Prijungimo pasirinkimai" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 +msgid "Mount point" +msgstr "Prijungimo taškas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 +msgid "Mount swap not specifically configured" +msgstr "Prijungimo sukeitimas nėra specifiškai konfigūruotos" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:223 +msgid "Mounted file systems" +msgstr "Prijungtos failų sistemos" + +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 +msgid "Move down" +msgstr "Judinti žemyn" + +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 +msgid "Move up" +msgstr "Judinti aukštyn" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:96 +msgid "Multicast" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 +msgid "Multicast routing" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 +msgid "Multicast to unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 +msgid "NAS ID" +msgstr "„NAS ID“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 +msgid "NAT action chain \"%h\"" +msgstr "„NAT“ veiksmo grandinė \"%h\"" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:87 +msgid "NAT-T Mode" +msgstr "„NAT-T“ režimas" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 +msgid "NAT64 Prefix" +msgstr "„NAT64“ Prielinksnis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "„NAT64“ prielinksnis" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 +msgid "NCM" +msgstr "„NCM“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 +msgid "NDP-Proxy slave" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:72 +msgid "NT Domain" +msgstr "„NT“ domenas-sritis" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:300 +msgid "NTP server candidates" +msgstr "„NTP“ serverio kandidatai" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2618 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 +msgid "Name" +msgstr "Vardas/Pavadinimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 +msgid "Name of the new network" +msgstr "Naujo tinklo pavadinimas" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Tunelio įrenginio pavadinimas" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 +msgid "Navigation" +msgstr "Navigacija" + +#: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:10 +msgid "Nebula Network" +msgstr "„Nebula“ tinklas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Kaimynų apžvalga" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 +msgid "Neighbour cache validity" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:186 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:212 +msgid "Network" +msgstr "Tinklas" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Tinklo kodavimas" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 +msgid "Network Mode" +msgstr "Tinklo režimas" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "Tinklo registravimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" +msgstr "Tinklo „SSID“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 +msgid "Network address" +msgstr "Tinklo adresas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 +msgid "Network boot image" +msgstr "Tinklo įjungimo failas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 +msgid "Network bridge configuration migration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 +msgid "Network device" +msgstr "Tinklo įrenginys" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:7 +msgid "Network device activity (kernel: netdev)" +msgstr "Tinklo įrenginio aktyvumas („kernel: netdev“)" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:15 +#: modules/luci-compat/luasrc/model/network.lua:33 +msgid "Network device is not present" +msgstr "Tinklo įrenginys nėra pasiekiamas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 +msgid "Network device table \"%h\"" +msgstr "Tinklo įrenginio lentelė „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:78 +msgctxt "nft @nh,off,len" +msgid "Network header bits %d-%d" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 +msgid "Network ifname configuration migration" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 +msgid "Network interface" +msgstr "Tinklo sąsaja ir sietuvai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 +msgid "Network-ID" +msgstr "Tinklo-ID" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 +msgid "Never" +msgstr "Niekada" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Niekada" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +msgid "" +"Never forward matching domains and subdomains, resolve from DHCP or hosts " +"files only." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 +msgid "New interface for \"%s\" can not be created: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 +msgid "New interface name…" +msgstr "Naujas sąsajos ir sietuvo pavadinimas…" + +#: modules/luci-compat/luasrc/view/cbi/delegator.htm:11 +msgid "Next »" +msgstr "Tolyn »" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 +msgid "No" +msgstr "Ne" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 +msgid "No DHCP Server configured for this interface" +msgstr "Nėra „DHCP“ serverio konfigūravimo šiai sąsajai ir/ar sietuvui" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:202 +msgid "No Data" +msgstr "Nėra duomenų" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 +msgid "No Encryption" +msgstr "Nėra šifravimo" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:185 +msgid "No Host Routes" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:89 +msgid "No NAT-T" +msgstr "Nėra „NAT-T“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 +msgid "No RX signal" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 +msgid "" +"No changes to settings will be stored and are lost after rebooting. This " +"mode should only be used to install a firmware upgrade" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:69 +msgid "No client associated" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 +msgctxt "empty table placeholder" +msgid "No data" +msgstr "Nėra duomenų" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:406 +msgid "No data received" +msgstr "Duomenų negauta" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 +msgid "No enforcement" +msgstr "Jokio įgalinimo" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:229 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:232 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:235 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:238 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:241 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:244 +msgid "No entries available" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 +msgid "No entries in this directory" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 +msgid "" +"No fixed interface listening port defined, peers might not be able to " +"initiate connections to this WireGuard instance!" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:88 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:70 +msgid "No host route" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 +msgid "No information available" +msgstr "Nėra informacijos" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:63 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:8 +msgid "No matching prefix delegation" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:142 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:145 +msgid "No more slaves available" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:189 +msgid "No more slaves available, can not save interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +msgid "No negative cache" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 +msgid "No nftables ruleset loaded." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 +msgid "No password set!" +msgstr "Nėra nustatyto slaptažodžio!" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 +msgid "No peers defined yet." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +msgid "No public keys present yet." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 +msgctxt "nft chain is empty" +msgid "No rules in this chain" +msgstr "Nėra taisyklių šioje grandinėje" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:91 +msgid "No rules in this chain." +msgstr "Nėra taisyklių šioje grandinėje." + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:385 +msgid "No validation or filtering" +msgstr "Nėra patikrinimo ar filtravimo" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 +msgid "No zone assigned" +msgstr "Nepriskirta jokia zona" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:58 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:84 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:187 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:279 +msgid "Noise" +msgstr "Triukšmas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Triukšmo riba" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 +msgid "Noise:" +msgstr "Triukšmas:" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 +msgid "Non-wildcard" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 +msgid "None" +msgstr "Joks" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 +msgid "Normal" +msgstr "Normaliai" + +#: modules/luci-base/ucode/template/error404.ut:9 +msgid "Not Found" +msgstr "Nerasta" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Ne narys" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 +msgid "Not associated" +msgstr "Nėra susietas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 +msgid "Not connected" +msgstr "Neprisijungta" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 +msgid "Not present" +msgstr "Nėra" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 +msgid "Not started on boot" +msgstr "Nepradėtas įkrovos metu" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:409 +msgid "Not supported" +msgstr "Nepalaikomas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 +msgid "" +"Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " +"have problems" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 +msgid "Notes" +msgstr "Pastabos" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:188 +msgid "Notice" +msgstr "Pranešimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 +msgid "Nslookup" +msgstr "„Nslookup“" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:333 +msgid "Number of IGMP membership reports" +msgstr "„IGMP“ narystės ataskaitų skaičius" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 +msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:311 +msgid "Number of peer notifications after failover event" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:69 +msgid "Obfuscated Group Password" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:61 +msgid "Obfuscated Password" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:54 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 +msgid "Obtain IPv6 address" +msgstr "Gauti „IPv6“ adresą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 +msgid "Off" +msgstr "Išjungta" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:18 +msgid "Off-State Delay" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"Išjungtas: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +msgid "On" +msgstr "Įjungta" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:12 +msgid "On-State Delay" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 +msgid "On-link" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 +msgid "One of hostname or MAC address must be specified!" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 +msgid "One of the following: %s" +msgstr "Vienas iš šių dalykų: „%s“" + +#: modules/luci-compat/luasrc/view/cbi/nullsection.htm:17 +#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:22 +msgid "One or more fields contain invalid values!" +msgstr "Viename ar daugiau laukų yra negaliojančių reikšmių!" + +#: modules/luci-compat/luasrc/view/cbi/map.htm:32 +msgid "One or more invalid/required values on tab" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/nullsection.htm:19 +#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:24 +msgid "One or more required fields have no value!" +msgstr "Viename ar daugiau privalomų laukų neturi reikšmės!" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 +msgid "Only allow communication with non-isolated bridge ports when enabled" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:231 +msgid "" +"Only if current active slave fails and the primary slave is up (failure, 2)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 +msgid "Open iptables rules overview…" +msgstr "Atidaryti „iptables“ taisyklių apibendrinimą…" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 +msgid "Open list..." +msgstr "Atidaryti sąrašą..." + +#: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 +msgid "OpenConnect (CISCO AnyConnect)" +msgstr "„OpenConnect (CISCO AnyConnect)“" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 +msgid "OpenFortivpn" +msgstr "„OpenFortivpn“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 +msgid "" +"Operate in relay mode if a designated master interface is " +"configured and active, otherwise disable NDP proxying." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 +msgid "" +"Operate in relay mode if a designated master interface is " +"configured and active, otherwise fall back to server mode." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 +msgid "" +"Operate in relay mode if an upstream IPv6 prefix is present, " +"otherwise disable service." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 +msgid "Operating frequency" +msgstr "Operuojantis dažnis" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "Operatorius" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "Operatoriaus kodas" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "Operatorio pavadinimas" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2006 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 +msgid "Option \"%s\" contains an invalid input value." +msgstr "Parametre „%s“ yra negaliojanti įvesties reikšmė." + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2021 +msgid "Option \"%s\" must not be empty." +msgstr "Parametras „%s“ negali būti tuščias." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 +msgid "Option changed" +msgstr "Parametras pakeistas" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 +msgid "Option removed" +msgstr "Parametras pašalintas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 +msgid "Optional" +msgstr "Pasirenkamas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "Priskirti pasirinktinį įrenginio pavadinimą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 +msgid "Optional, free-form notes about this device" +msgstr "" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +msgid "" +"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " +"starting with 0x." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 +msgid "" +"Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " +"'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " +"server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') " +"for the interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 +msgid "" +"Optional. Base64-encoded preshared key. Adds in an additional layer of " +"symmetric-key cryptography for post-quantum resistance." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 +msgid "Optional. Create routes for Allowed IPs for this peer." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +msgid "Optional. Description of peer." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:185 +msgid "Optional. Do not create host routes to peers." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 +msgid "" +"Optional. Host of peer. Names are resolved prior to bringing up the " +"interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +msgid "" +"Optional. IP addresses and prefixes that this peer is allowed to use inside " +"the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " +"routes through the tunnel." +msgstr "" + +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 +msgid "Optional. Maximum Transmission Unit of the XFRM interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 +msgid "Optional. Maximum Transmission Unit of tunnel interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 +msgid "Optional. Port of peer." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 +msgid "" +"Optional. Private key of the WireGuard peer. The key is not required for " +"establishing a connection but allows generating a peer configuration or QR " +"code if available. It can be removed after the configuration has been " +"exported." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 +msgid "" +"Optional. Seconds between keep alive messages. Default is 0 (disabled). " +"Recommended value if this device is behind a NAT is 25." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +msgid "Optional. UDP port used for outgoing and incoming packets." +msgstr "" +"Pasirinktinai. „UDP“ prievadas, naudojamas išeinantiems ir įeinantiems " +"paketams." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:72 +msgid "Options" +msgstr "Parametrai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 +msgid "" +"Options for the Network-ID. (Note: needs also Network-ID.) E.g. " +"\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" for default route. 0.0.0.0 means \"the address of the " +"system running dnsmasq\"." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 +msgid "Options:" +msgstr "Parametrai:" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Pradininko intervalas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 +msgid "Other:" +msgstr "Kiti:" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:69 +msgid "Out" +msgstr "Iš" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:277 +msgid "Outbound:" +msgstr "išsiunčiamas:" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:101 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:106 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:103 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:108 +msgid "Outgoing checksum" +msgstr "Išsiunčiama kontrolinė suma" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 +msgid "Outgoing interface" +msgstr "Išsiunčiama sąsaja" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:96 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 +msgid "Outgoing key" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:103 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:108 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110 +msgid "Outgoing serialization" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:50 +msgid "Output Interface" +msgstr "Išvesties sąsaja" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 +msgid "Output zone" +msgstr "Išvesties zona" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:16 +msgid "Overlap" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 +msgid "Override IPv4 routing table" +msgstr "Perkeisti „IPv4“ maršrutizavimo lentelę" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 +msgid "Override IPv6 routing table" +msgstr "Perkeisti „IPv6“ maršrutizavimo lentelę" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:96 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 +msgid "Override MTU" +msgstr "Perkeisti „MTU“" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:79 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:62 +msgid "Override TOS" +msgstr "Perkeisti „TOS“" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:69 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:79 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:62 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:57 +msgid "Override TTL" +msgstr "Perkeisti „TTL“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +msgid "" +"Override default MAC address - the range of usable addresses might be " +"limited by the driver" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 +msgid "Override default interface name" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 +msgid "Override the gateway in DHCP responses" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 +msgid "" +"Override the netmask sent to clients. Normally it is calculated from the " +"subnet that is served." +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 +msgid "Override the table used for internal routes" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:3 +msgid "Overview" +msgstr "Apžiūra" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 +msgid "Overwrite existing file \"%s\" ?" +msgstr "Perrašyti egzistuojantį failą „%s“?" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:355 +msgid "Overwrite the current settings with the imported configuration?" +msgstr "Perrašyti dabartinius nustatymus su importuotą konfigūraciją?" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "Savi numeriai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 +msgid "Owner" +msgstr "Savininkas" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "„PAP“" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "„PAP/CHAP“" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 +msgid "PAP/CHAP (both)" +msgstr "„PAP/CHAP“ (abu)" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:44 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:63 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:94 +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:46 +msgid "PAP/CHAP password" +msgstr "„PAP/CHAP“ slaptažodis" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:42 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:61 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:89 +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:44 +msgid "PAP/CHAP username" +msgstr "„PAP/CHAP“ slapyvardis/vartotojo vardas" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 +msgid "PDP Type" +msgstr "„PDP“ tipas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:69 +msgid "PID" +msgstr "„PID“" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 +msgid "PIN" +msgstr "„PIN“" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:21 +#: modules/luci-compat/luasrc/model/network.lua:39 +msgid "PIN code rejected" +msgstr "„PIN“ kodas atmestas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 +msgid "PMK R1 Push" +msgstr "„PMK R1 Push“" + +#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:13 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:43 +msgid "PPP" +msgstr "„PPP“" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:58 +msgid "PPPoA Encapsulation" +msgstr "„PPPoA“ Inkapsuliavimas" + +#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:19 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:28 +msgid "PPPoATM" +msgstr "„PPPoATM“" + +#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:17 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:28 +msgid "PPPoE" +msgstr "„PPPoE“" + +#: modules/luci-compat/luasrc/model/network/proto_pppossh.lua:9 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:28 +msgid "PPPoSSH" +msgstr "„PPPoSSH“" + +#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:15 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:28 +msgid "PPtP" +msgstr "„PPtP“" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:73 +msgid "PSID offset" +msgstr "„PSID“ poslinkis" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:70 +msgid "PSID-bits length" +msgstr "„PSID“ bitų ilgis" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 +msgctxt "Label indicating that WireGuard peer uses a PSK" +msgid "PSK" +msgstr "„PSK“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 +msgid "PTM/EFM (Packet Transfer Mode)" +msgstr "„PTM/EFM“ (Paketų perdavimo režimas)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +msgid "PXE/TFTP Settings" +msgstr "„PXE/TFTP“ Nustatymai" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "Paketų aptarnavimo būseną" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 +msgid "Packet Steering" +msgstr "Paketų valdymo komanda" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 +msgctxt "nft meta mark" +msgid "Packet mark" +msgstr "Paketų žymė" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Paketų gavimo laikas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 +msgid "Packets" +msgstr "Paketai" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:277 +msgid "Packets To Transmit Before Moving To Next Slave" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "Tinklo dalis:" +msgstr[1] "Kelių tinklų dalis:" +msgstr[2] "Daugumos tinklų dalis:" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 +msgid "Part of zone %q" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 +msgctxt "MACVLAN mode" +msgid "Pass-through (Mirror physical device to single MAC VLAN)" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 +msgid "Password" +msgstr "Slaptažodis" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 +msgid "Password authentication" +msgstr "Slaptažodžio autentifikavimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 +msgid "Password of Private Key" +msgstr "Privataus rakto slaptažodis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 +msgid "Password of inner Private Key" +msgstr "Privataus vidinio rakto slaptažodis" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 +msgid "Password strength" +msgstr "Slaptažodžio stiprumas" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 +msgid "Password2" +msgstr "Slaptažodis2" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 +msgid "Paste or drag SSH key file…" +msgstr "Įklijuoti arba nutempti „SSH“ rakto failą…" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 +msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" +msgstr "" +"Įklijuokite arba vilkite „WireGuard“ lygiavertės konfigūracijos („wg0.conf“) " +"failą…" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +msgid "" +"Paste or drag a WireGuard configuration (commonly wg0.conf) from " +"another system below to create a matching peer entry allowing that system to " +"connect to the local WireGuard interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 +msgid "Paste or drag supplied WireGuard configuration file…" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +msgid "Path to CA-Certificate" +msgstr "Kelias į „CA-Sertifikatas“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 +msgid "Path to Client-Certificate" +msgstr "Kelias į „Kliento-Sertifikatas“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 +msgid "Path to Private Key" +msgstr "Kelias į privatų raktą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 +msgid "Path to inner CA-Certificate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 +msgid "Path to inner Client-Certificate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 +msgid "Path to inner Private Key" +msgstr "Kelias į vidinį privatų raktą" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2727 +msgid "Paused" +msgstr "Pristabdytas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:273 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:283 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:334 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:344 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:354 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:239 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:249 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:259 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:268 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:278 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:296 +msgid "Peak:" +msgstr "Pikas:" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Lygiarangis" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 +msgid "Peer IP address to assign" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 +msgid "Peer MAC address" +msgstr "Lygiarangio „MAC“ adresas" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:14 +#: modules/luci-compat/luasrc/model/network.lua:32 +msgid "Peer address is missing" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 +msgid "Peer device name" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 +msgid "Peer disabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:214 +msgid "Peers" +msgstr "Lygiarangiai" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:80 +msgid "Perfect Forward Secrecy" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:103 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:108 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110 +msgid "Perform outgoing packets serialization (optional)." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:34 +msgid "Perform reboot" +msgstr "Atlikti perkrovimą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:406 +msgid "Perform reset" +msgstr "Atlikti atstatymą" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:407 +msgid "Permission denied" +msgstr "Prieigą uždrausta/atmesta" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 +msgid "Persistent Keep Alive" +msgstr "" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 +msgid "PersistentKeepAlive setting is invalid" +msgstr "„PersistentKeepAlive“ nustatymas yra netinkamas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:290 +msgid "Phy Rate:" +msgstr "Fizinis rodiklis:" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 +msgid "Physical Settings" +msgstr "Fiziniai nustatymai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 +msgid "Ping" +msgstr "Ryšio atsakas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:50 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:84 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:85 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:138 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:64 +msgid "Pkts." +msgstr "Pkt." + +#: modules/luci-base/ucode/template/sysauth.ut:19 +msgid "Please enter your username and password." +msgstr "Prašome įvesti savo slapyvardį/vartotojo vardą ir slaptažodį." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 +msgid "Please select the file to upload." +msgstr "Pasirinkite failą, kurį norite įkelti." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 +msgid "Policy" +msgstr "Politika" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 +msgctxt "Chain hook policy" +msgid "Policy: %h (%h)" +msgstr "Politika: %h (%h)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 +msgid "Port" +msgstr "Prievadas („Port'as“)" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Prievado „%d“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "Prievadas nėra jokio tinklo dalis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 +msgid "Port isolation" +msgstr "Prievado izoliavimas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "Prievado būklė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 +msgid "Port status:" +msgstr "Prievado būklė:" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 +msgid "Potential negation of: %s" +msgstr "Galimas sutarimas: %s" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "Energijos būsena" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +msgid "Prefer LTE" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +msgid "Prefer UMTS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "Pageidautiną tinklo technologija" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 +msgid "Prefix Delegated" +msgstr "Priešdėlis deleguotas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 +msgid "Prefix suppressor" +msgstr "Priešdėlio slopintuvas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 +msgid "Preshared Key" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 +msgid "Preshared key in use" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:308 +msgid "PresharedKey setting is invalid" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:130 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:102 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:88 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:62 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:75 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:98 +msgid "" +"Presume peer to be dead after given amount of LCP echo failures, use 0 to " +"ignore failures" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 +msgid "Prevents client-to-client communication" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 +msgid "" +"Primary becomes active slave when it comes back up if speed and duplex " +"better than current slave (better, 1)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:229 +msgid "Primary becomes active slave whenever it comes back up (always, 0)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 +msgid "Priority" +msgstr "Prioritetas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 +msgctxt "Label indicating that WireGuard peer private key is stored" +msgid "Private" +msgstr "Privatus" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 +msgctxt "MACVLAN mode" +msgid "Private (Prevent communication between MAC VLANs)" +msgstr "Privatus (Neleidžia komunikacijos tarp „MAC VLAN'ų“)" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 +msgid "Private Key" +msgstr "Privatus raktas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 +msgid "Private key present" +msgstr "Privatus raktas įgalintas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:296 +msgid "PrivateKey setting is missing or invalid" +msgstr "Privataus rakto nustatymas nerandamas arba netinkamas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:64 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:93 +msgid "Processes" +msgstr "Procesai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:67 +msgid "Prot." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:217 +msgid "Protocol" +msgstr "Protokolas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:282 +msgid "Provide NTP server" +msgstr "Teikti „NTP“ serverį" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 +msgid "" +"Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " +"and requests." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 +msgid "Provide new network" +msgstr "Pateikti naują tinklą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:288 +msgid "" +"Provide the NTP server to the selected interface or, if unspecified, to all " +"interfaces" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Įgaliotasis serveris" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "„ProxyARP“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 +msgid "Pseudo Ad-Hoc (ahdemo)" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 +msgid "Public Key" +msgstr "Viešasis raktas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 +msgid "Public key is missing" +msgstr "Viešasis raktas nerandamas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 +msgctxt "Tooltip displaying full WireGuard peer public key" +msgid "Public key: %h" +msgstr "Viešasis raktas: %h" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 +msgid "" +"Public keys allow for the passwordless SSH logins with a higher security " +"compared to the use of plain passwords. In order to upload a new key to the " +"device, paste an OpenSSH compatible public key line or drag a .pub file into the input field." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 +msgid "Public prefix routed to this device for distribution to clients." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:305 +msgid "PublicKey setting is invalid" +msgstr "Viešojo rakto nustatymas yra neteisingas" + +#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:9 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:27 +msgid "QMI Cellular" +msgstr "„QMI“ mobilusis" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 +msgid "Quality" +msgstr "Kokybė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 +msgid "Query all available upstream resolvers." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 +msgid "Query interval" +msgstr "Užklausos intervalas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 +msgid "Query response interval" +msgstr "Užklausos atsakos intervalas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 +msgid "R0 Key Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 +msgid "R1 Key Holder" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 +msgid "RADIUS Accounting Port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 +msgid "RADIUS Accounting Secret" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 +msgid "RADIUS Accounting Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 +msgid "RADIUS Authentication Port" +msgstr "„RADIUS“ atpažinimo prievadas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 +msgid "RADIUS Authentication Secret" +msgstr "„RADIUS“ autentifikavimo paslaptis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 +msgid "RADIUS Authentication Server" +msgstr "„RADIUS“ autentifikavimo serveris" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "„RADIUS VLAN įvardijimas“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 +msgid "RFC3947 NAT-T mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +msgid "RSSI threshold for joining" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 +msgid "RTS/CTS Threshold" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:84 +msgid "RX" +msgstr "Atsiųsta/Gauta reaktyviai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:236 +msgid "RX Rate" +msgstr "Atsiųsta/Gauta reaktyviai greitis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 +msgid "RX Rate / TX Rate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 +msgctxt "nft nat flag random" +msgid "Randomize source port mapping" +msgstr "" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 +msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 +msgid "Read /etc/ethers to configure the DHCP server." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 +msgid "Really switch protocol?" +msgstr "Tikrai perjungtį protokolą?" + +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:118 +msgid "Realtime Graphs" +msgstr "Realaus laiko grafikai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +msgid "Reassociation Deadline" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +msgid "Rebind protection" +msgstr "Perrišti apsaugą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:20 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:140 +msgid "Reboot" +msgstr "Paleisti iš naujo" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:153 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:162 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:46 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:51 +msgid "Rebooting…" +msgstr "Paleidžiama iš naujo…" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:21 +msgid "Reboots the operating system of your device" +msgstr "Paleidžia iš naujo Jūsų įrenginio operacinę sistemą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:26 +msgid "Receive" +msgstr "Gauti" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "Gavimas atmestas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "Gauti klaidas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Gauti duomenys" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "Gauti bytus" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "Gauti daugiadresiniai transliavimai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "Gauti paketai" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 +msgid "Recommended. IP addresses of the WireGuard interface." +msgstr "Rekomenduojamas. „WireGuard“ sąsajos IP adresai." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Iš naujo prisijungti laukimo laikas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 +msgid "Reconnect this interface" +msgstr "Iš naujo prijungti šią sąsają" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:14 +msgid "Redirect to HTTPS" +msgstr "Peradresuoti į „HTTPS“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 +msgctxt "nft redirect to port" +msgid "Redirect to local port %h" +msgstr "Peradresuoti į vietinią prievadą „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +msgctxt "nft redirect" +msgid "Redirect to local system" +msgstr "Peradresuoti į vietinią sistemą" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:57 +msgid "References" +msgstr "Išnašos" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Įkelti iš naujo kanalus" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 +msgid "Refreshing" +msgstr "Įkeliama iš naujo" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "Registracijos būseną" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +msgctxt "nft reject with icmp type" +msgid "Reject IPv4 packet with ICMP type %h" +msgstr "Atmesti „IPv4“ paketą su „ICMP type %h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 +msgctxt "nft reject with icmpx type" +msgid "Reject packet with ICMP type %h" +msgstr "Atmesti paketą su „ICMP type %h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +msgctxt "nft reject with icmpv6 type" +msgid "Reject packet with ICMPv6 type %h" +msgstr "Atmesti paketą su „ICMPv6 type %h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +msgctxt "nft reject with tcp reset" +msgid "Reject packet with TCP reset" +msgstr "Atmesti paketą su „TCP reset“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 +msgid "" +"Reject routing decisions that have a prefix length less than or equal to the " +"specified value" +msgstr "" +"Atmesti maršrutizavimo sprendimus, kurių prefikso ilgis yra mažesnis arba " +"lygus nurodytai vertei" + +#: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 +msgid "Relay" +msgstr "Retransliuoti" + +#: modules/luci-compat/luasrc/model/network/proto_relay.lua:157 +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:36 +msgid "Relay Bridge" +msgstr "Retransliavimo tiltas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"Retransliuoti „DHCP“ prašymus kitur. OK: „v4↔v4“, „v6↔v6“. Ne OK: „v4↔v6“, " +"„v6↔v4“." + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 +msgid "Relay between networks" +msgstr "Retransliuoti tarp tinklų" + +#: modules/luci-compat/luasrc/model/network/proto_relay.lua:12 +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:64 +msgid "Relay bridge" +msgstr "Retransliavimo tiltas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 +msgid "Remote IPv4 address" +msgstr "Nuotolinis „IPv4“ adresas" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 +msgid "Remote IPv4 address or FQDN" +msgstr "Nuotolinis „IPv4“ adresas arba „FQDN“" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 +msgid "Remote IPv6 address" +msgstr "Nuotolinis „IPv6“ adresas" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 +msgid "Remote IPv6 address or FQDN" +msgstr "Nuotolinis „IPv6“ adresas arba „FQDN“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 +msgid "Remove" +msgstr "Pašalinti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "Pašalinti „IPv4“ adresus iš rezultatų ir grąžinti tik „IPv6“ adresus." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "Pašalinti „IPv6“ adresus iš rezultatų ir grąžinti tik „IPv4“ adresus." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 +msgid "Remove related device settings from the configuration" +msgstr "Pašalinti susijusio įrenginio nustatymus iš konfigūracijos" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 +msgid "Replace wireless configuration" +msgstr "Pakeisti belaidžio konfigūravimą" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:17 +msgid "Request IPv6-address" +msgstr "Prašyti „IPv6“ adreso" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:23 +msgid "Request IPv6-prefix of length" +msgstr "Prašyti „IPv6“ priešdėlio ilgį" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:408 +msgid "Request timeout" +msgstr "Prašyti laukimo laiko" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:100 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:105 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:102 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:107 +msgid "Require incoming checksum (optional)." +msgstr "Prašyti ateinančios kontrolinės patikros sumos (pasirenkamas)." + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:102 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:107 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:104 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:109 +msgid "Require incoming packets serialization (optional)." +msgstr "Prašyti ateinančių paketų serializavimo (pasirenkamas)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 +msgid "Required" +msgstr "Reikalaujama/Privaloma" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 +msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" +msgstr "Reikalingas tam tikriems „ISP“ (dgs.), pvz. chartija su „DOCSIS 3“" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 +msgid "Required. Base64-encoded private key for this interface." +msgstr "Reikalaujama. „Base64“ užkoduotas privatus raktas šiai sąsajai." + +#: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 +msgid "Required. Path to the .yml config file for this interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +msgid "Required. Public key of the WireGuard peer." +msgstr "" + +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:42 +msgid "Required. Underlying interface." +msgstr "Reikalingas/privalomas. Pagrindinė sąsaja." + +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:39 +msgid "Required. XFRM interface ID to be used for SA." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +msgid "Requires hostapd" +msgstr "Reikalauja „hostapd“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 +msgid "Requires hostapd with EAP Suite-B support" +msgstr "Reikalauja „hostapd“ su „EAP Suite-B“ palaikymu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +msgid "Requires hostapd with EAP support" +msgstr "Reikalauja „hostapd“ su „EAP“ palaikymu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 +msgid "Requires hostapd with OWE support" +msgstr "Reikalauja „hostapd“ su „OWE“ palaikymu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +msgid "Requires hostapd with SAE support" +msgstr "Reikalauja „hostapd“ su „SAE“ palaikymu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +msgid "Requires hostapd with WEP support" +msgstr "Reikalauja „hostapd“ su „WEP“ palaikymu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 +msgid "Requires wpa-supplicant" +msgstr "Reikalauja „wpa-supplicant“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 +msgid "Requires wpa-supplicant with EAP Suite-B support" +msgstr "Reikalauja „wpa-supplicant“ su „EAP Suite-B“ palaikymu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +msgid "Requires wpa-supplicant with EAP support" +msgstr "Reikalauja „wpa-supplicant“ su „EAP“ palaikymu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 +msgid "Requires wpa-supplicant with OWE support" +msgstr "Reikalauja „wpa-supplicant“ su „OWE“ palaikymu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 +msgid "Requires wpa-supplicant with SAE support" +msgstr "Reikalauja „wpa-supplicant“ su „SAE“ palaikymu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 +msgid "Requires wpa-supplicant with WEP support" +msgstr "Reikalauja „wpa-supplicant“ su „WEP“ palaikymu" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:226 +msgid "Reselection policy for primary slave" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 +#: modules/luci-base/ucode/template/sysauth.ut:39 +#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 +#: modules/luci-compat/luasrc/view/cbi/footer.htm:30 +#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 +msgid "Reset" +msgstr "Atkurti/Grąžinimas į pradinę padėti/būsena/Atstatymas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:343 +msgid "Reset Counters" +msgstr "Atstatyti rodiklius" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:404 +msgid "Reset to defaults" +msgstr "Grąžinimas į pradinę padėti/būsena/Atstatymas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 +msgid "Resolv and Hosts Files" +msgstr "„Resolv“ ir „Hosts“ failai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +msgid "Resolv file" +msgstr "„Resolv“ failas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Išspręsti nurodytus „FQDN“ į „IP“." + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 +msgid "Resource not found" +msgstr "Išteklis nerastas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 +msgid "Restart" +msgstr "Paleisti iš naujo" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:348 +msgid "Restart Firewall" +msgstr "Paleisti iš naujo užkardą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 +msgid "Restart radio interface" +msgstr "Paleisti iš naujo radijo imtuvą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 +msgid "Restore" +msgstr "Atkurti" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:410 +msgid "Restore backup" +msgstr "Atkurti atsarginę kopiją" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +msgid "" +"Return answers to DNS queries matching the subnet from which the query was " +"received if multiple IPs are available." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 +msgid "Reveal/hide password" +msgstr "Atskleisti/Paslėpti slaptažodį" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +msgid "Reverse path filter" +msgstr "Apversti kelio filtrą" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 +msgid "Revert" +msgstr "Anuliuoti" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 +msgid "Revert changes" +msgstr "Paskelbti pakeitimus negaliojančius (Pakeitimų anuliavimas)" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 +msgid "Revert request failed with status %h" +msgstr "Anuliavimo prašymas nepavyko su kodu %h" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 +msgid "Reverting configuration…" +msgstr "Visi pakeitimai grįžtą į pradinę konfigūravimą (Anuliuojama)…" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "Revizija" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +msgctxt "nft dnat ip to addr" +msgid "Rewrite destination to %h" +msgstr "Perrašyti kelionės tikslą į „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +msgctxt "nft dnat ip6 to addr" +msgid "Rewrite destination to %h" +msgstr "Perrašyti kelionės tikslą į „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 +msgctxt "nft dnat ip to addr:port" +msgid "Rewrite destination to %h, port %h" +msgstr "" +"Perrašyti kelionės tikslą į „%h“, prievadu „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 +msgctxt "nft dnat ip6 to addr:port" +msgid "Rewrite destination to %h, port %h" +msgstr "" +"Perrašyti kelionės tikslą į „%h“, prievadu „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +msgctxt "nft snat ip to addr" +msgid "Rewrite source to %h" +msgstr "Perrašyti šaltinį į „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +msgctxt "nft snat ip6 to addr" +msgid "Rewrite source to %h" +msgstr "Perrašyti šaltinį į „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 +msgctxt "nft snat ip to addr:port" +msgid "Rewrite source to %h, port %h" +msgstr "" +"Perrašyti šaltinį į „%h“, prievadu „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 +msgctxt "nft snat ip6 to addr:port" +msgid "Rewrite source to %h, port %h" +msgstr "" +"Perrašyti šaltinį į „%h“, prievadu „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 +msgid "Rewrite to egress device address" +msgstr "Perrašyti į išeinančio įrenginio adresą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 +msgid "Robustness" +msgstr "Patvarumas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 +msgid "" +"Root directory for files served via TFTP. Enable TFTP server and " +"TFTP server root turn on the TFTP server and serve files from " +"TFTP server root." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:298 +msgid "Root preparation" +msgstr "Šaknies paruošimas" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:204 +msgid "Round-Robin policy (balance-rr, 0)" +msgstr "„Round-Robin“ politika („balance-rr, 0“)" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 +msgid "Route Allowed IPs" +msgstr "Maršruto leidžiami „IP“ (dgs.)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 +msgid "Route action chain \"%h\"" +msgstr "Maršuto veiksmo grandinė „%h“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 +msgid "Route type" +msgstr "Maršruto tipas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +msgid "" +"Router Lifetime published in RA messages. Maximum is 9000 seconds." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:26 +msgid "Router Password" +msgstr "Maršrutizatoriaus slaptažodis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:50 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:248 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:15 +msgid "Routing" +msgstr "Kelvada" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Kelvados algoritmas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 +msgid "" +"Routing defines over which interface and gateway a certain host or network " +"can be reached." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:218 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:198 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:224 +msgid "Rule" +msgstr "Taisyklė" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 +msgid "Rule actions" +msgstr "Taisyklės veiksmai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 +msgctxt "nft comment" +msgid "Rule comment: %s" +msgstr "Taisyklės komentaras: %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +msgid "Rule container chain \"%h\"" +msgstr "Taisyklės konteinerio grandinė „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 +msgid "Rule matches" +msgstr "Taisyklės atitikmenys" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 +msgid "Rule type" +msgstr "Taisyklės tipas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:336 +msgid "Run a filesystem check before mounting the device" +msgstr "Paleisti failų sistemos patikrą prieš montuojant įrenginį" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:336 +msgid "Run filesystem check" +msgstr "Paleisti failų sistemos patikrą" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2360 +msgid "Runtime error" +msgstr "Paleidimo klaida" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:224 +msgid "SHA256" +msgstr "„SHA256“" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "SIM (dgs.)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 +msgid "SNR" +msgstr "„SNR“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "„SRV“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 +msgid "SSH Access" +msgstr "„SSH“ Prieigą" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:70 +msgid "SSH server address" +msgstr "„SSH“ serverio adresas" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:74 +msgid "SSH server port" +msgstr "„SSH“ serverio prievadas" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:58 +msgid "SSH username" +msgstr "„SSH“ slapyvardis/vartotojo vardas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 +msgid "SSH-Keys" +msgstr "„SSH-Raktai“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 +msgid "SSID" +msgstr "„SSID“" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:9 +msgid "SSTP" +msgstr "„SSTP“" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:41 +msgid "SSTP Server" +msgstr "„SSTP“ Serveris" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 +msgid "SWAP" +msgstr "„SWAP“" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 +#: modules/luci-compat/luasrc/view/cbi/error.htm:17 +#: modules/luci-compat/luasrc/view/cbi/footer.htm:26 +#: modules/luci-compat/luasrc/view/cbi/header.htm:20 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:463 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:123 +msgid "Save" +msgstr "Išsaugoti" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 +#: modules/luci-compat/luasrc/view/cbi/footer.htm:22 +msgid "Save & Apply" +msgstr "Išsaugoti ir Įgalinti" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:607 +msgid "Save error" +msgstr "Išsaugojimo klaida" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:434 +msgid "Save mtdblock" +msgstr "Išsaugoti „mtdblock“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:424 +msgid "Save mtdblock contents" +msgstr "Įrašyti „mtdblock“ turinius" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 +msgid "Scan" +msgstr "Skenuoti" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:28 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:90 +msgid "Scheduled Tasks" +msgstr "Suplanuotos užduotys" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "Sekciją „%s“ yra tuščią." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 +msgid "Section added" +msgstr "Sekciją pridėtą" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 +msgid "Section removed" +msgstr "Sekciją pašalintą" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:332 +msgid "See \"mount\" manpage for details" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:283 +msgid "" +"Select 'Force upgrade' to flash the image even if the image format check " +"fails. Use only if you are sure that the firmware is correct and meant for " +"your device!" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 +msgid "Select file…" +msgstr "Pasirinkti failą…" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:320 +msgid "Selects the transmit hash policy to use for slave selection" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 +msgid "" +"Send RA " +"messages advertising this device as IPv6 router." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 +msgid "Send ICMP redirects" +msgstr "Siųsti „ICMP“ peradresavimus" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:143 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:101 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:75 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:88 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:111 +msgid "" +"Send LCP echo requests at the given interval in seconds, only effective in " +"conjunction with failure threshold" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:24 +msgid "Send the hostname of this device" +msgstr "Siųsti šio įrenginio pavadinimą" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Serveris" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 +msgid "Server address" +msgstr "Serverio adresas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 +msgid "Server name" +msgstr "Serverio pavadinimas" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 +msgid "Service Name" +msgstr "Tarnybos pavadinimas" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:88 +msgid "Service Type" +msgstr "Tarnybos tipas" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:36 +msgid "Services" +msgstr "Tarnybos" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2664 +msgid "Session expired" +msgstr "Sesiją pasibaigę" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:175 +msgid "Set Static" +msgstr "Nustatyti statinį" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 +msgctxt "nft mangle" +msgid "Set header field %s to %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 +msgid "Set interface as NDP-Proxy external slave. Default is off." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 +msgid "" +"Set interface properties regardless of the link carrier (If set, carrier " +"sense events do not invoke hotplug handlers)." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:302 +msgid "Set same MAC Address to all slaves" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 +msgid "" +"Set the autonomous address-configuration flag in the prefix information " +"options of sent RA messages. " +"When enabled, clients will perform stateless IPv6 address autoconfiguration." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 +msgid "" +"Set this interface as master for RA and DHCPv6 relaying as well as NDP " +"proxying." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:306 +msgid "Set to currently active slave (active, 1)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:307 +msgid "Set to first slave added to the bond (follow, 2)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +msgid "Set up DHCP Server" +msgstr "Nustatyti „DHCP“ serverį" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Nustatyti maršrutus įgalinčioms „IPv6 kaimynams“." + +#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 +#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 +msgid "Setting PLMN failed" +msgstr "Nustatyti „PLMN“ nepavyko" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 +msgid "Setting operation mode failed" +msgstr "Nustatyti operacijos režimą nepavyko" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "Nustatyti leidžiamas tinklo technologijas." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "Nustatyti pageidautiną tinklo technologiją." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 +msgid "Settings" +msgstr "Nustatymai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 +msgid "Short GI" +msgstr "Trumpasis „GI“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 +msgid "Short Preamble" +msgstr "Trumpa įžanga" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 +msgid "Show current backup file list" +msgstr "Rodyti dabartinį atsarginių failų sąrašą" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 +msgid "Show empty chains" +msgstr "Rodyti tuščias grandinės" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:338 +msgid "Show raw counters" +msgstr "Rodyti neapdorotus skaitiklius" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 +msgid "Shutdown this interface" +msgstr "Išjungti šią sąsają" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:284 +msgid "Signal" +msgstr "Signalas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 +msgid "Signal / Noise" +msgstr "Signalas / Triukšmas" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Signalo kokybė" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 +msgid "Signal Refresh Rate" +msgstr "Signalo atnaujinimo dažnis" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:262 +msgid "Signal:" +msgstr "Signalas:" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 +msgid "Size" +msgstr "Dydis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 +msgid "Size of DNS query cache" +msgstr "„DNS“ užklausų talpyklos dydis" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:208 +msgid "Size of the ZRam device in megabytes" +msgstr "„ZRam“ įrenginio dydis megabaitais" + +#: modules/luci-compat/luasrc/view/cbi/footer.htm:18 +#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:57 +msgid "Skip" +msgstr "Praleisti" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:257 +msgid "Skip from backup files that are equal to those in /rom" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 +msgid "Skip to content" +msgstr "Praleisti į turinį" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 +msgid "Skip to navigation" +msgstr "Praleisti į navigacija" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:180 +msgid "Slave Interfaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3002 +#: modules/luci-compat/luasrc/model/network.lua:1428 +msgid "Software VLAN" +msgstr "Programinės įrangos „VLAN“" + +#: modules/luci-compat/luasrc/view/cbi/header.htm:5 +msgid "Some fields are invalid, cannot save values!" +msgstr "Kai kurie laukai yra neteisingi, negalime įrašyti reikšmių!" + +#: modules/luci-base/ucode/template/error404.ut:10 +msgid "Sorry, the object you requested was not found." +msgstr "Atsiprašome, jūsų prašomas objektas nerastas." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 +msgid "" +"Sorry, there is no sysupgrade support present; a new firmware image must be " +"flashed manually. Please refer to the wiki for device specific install " +"instructions." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 +msgid "Source" +msgstr "Šaltinis" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:43 +msgctxt "nft ip saddr" +msgid "Source IP" +msgstr "Šaltinio „IP“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:47 +msgctxt "nft ip6 saddr" +msgid "Source IPv6" +msgstr "Šaltinio „IPv6“" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 +msgid "Source interface" +msgstr "Šaltinio sąsaja ir/arba Sietuvas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:45 +msgctxt "nft ip sport" +msgid "Source port" +msgstr "Šaltinio prievadas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 +msgid "" +"Special PXE boot " +"options for Dnsmasq." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 +msgid "" +"Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " +"unspecified, the local device DNS search domain will be announced." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 +msgid "" +"Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " +"If left unspecified, the device will announce itself as IPv6 DNS server " +"unless the Local IPv6 DNS server option is disabled." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 +msgid "" +"Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " +"corresponding UID or 1000-1005 to inclusively match all UIDs within the " +"corresponding range" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:343 +msgid "" +"Specifies that duplicate frames (received on inactive ports) should be " +"dropped or delivered" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:359 +msgid "Specifies the ARP link monitoring frequency in milliseconds" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:367 +msgid "Specifies the IP addresses to use for ARP monitoring" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:396 +msgid "Specifies the MII link monitoring frequency in milliseconds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 +msgid "Specifies the TOS value to match in IP headers" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:261 +msgid "Specifies the aggregation selection logic to use" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 +msgid "Specifies the destination subnet to match (CIDR notation)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 +msgid "Specifies the directory the device is attached to" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +msgid "" +"Specifies the flags sent in RA " +"messages, for example to instruct clients to request further information via " +"stateful DHCPv6." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 +msgid "" +"Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " +"mark 255 or 0x0/0x1 to match any even mark value" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 +msgid "Specifies the incoming logical interface name" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 +msgid "" +"Specifies the logical interface name of the parent (or master) interface " +"this route belongs to" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:254 +msgid "" +"Specifies the mac-address for the actor in protocol packet exchanges " +"(LACPDUs). If empty, masters' mac address defaults to system default" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 +msgid "" +"Specifies the maximum amount of failed ARP requests until hosts are presumed " +"to be dead" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 +msgid "" +"Specifies the maximum amount of seconds after which hosts are presumed to be " +"dead" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 +msgid "" +"Specifies the maximum transmit power the wireless radio may use. Depending " +"on regulatory requirements and wireless usage, the actual transmit power may " +"be reduced by the driver." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:238 +msgid "" +"Specifies the minimum number of links that must be active before asserting " +"carrier" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:202 +msgid "Specifies the mode to be used for this bonding interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 +msgid "" +"Specifies the network gateway. If omitted, the gateway from the parent " +"interface is taken if any, otherwise creates a link scope route. If set to " +"0.0.0.0 no gateway will be specified for the route" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:334 +msgid "" +"Specifies the number of IGMP membership reports to be issued after a " +"failover event in 200ms intervals" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:278 +msgid "" +"Specifies the number of packets to transmit through a slave before moving to " +"the next one" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:312 +msgid "" +"Specifies the number of peer notifications (gratuitous ARPs and unsolicited " +"IPv6 Neighbor Advertisements) to be issued after a failover event" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:286 +msgid "" +"Specifies the number of seconds between instances where the bonding driver " +"sends learning packets to each slaves peer switch" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 +msgid "Specifies the ordering of the IP rules" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 +msgid "Specifies the outgoing logical interface name" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +msgid "" +"Specifies the preferred source address when sending to destinations covered " +"by the target" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:375 +msgid "Specifies the quantity of ARP IP targets that must be reachable" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:270 +msgid "" +"Specifies the rate in which the link partner will be asked to transmit " +"LACPDU packets" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:227 +msgid "" +"Specifies the reselection policy for the primary slave when failure of the " +"active slave or recovery of the primary slave occurs" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 +msgid "Specifies the route metric to use" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 +msgid "Specifies the route type to be created" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 +msgid "Specifies the rule target routing action" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 +msgid "Specifies the source subnet to match (CIDR notation)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:246 +msgid "Specifies the system priority" +msgstr "Nurodo sistemos prioritetą" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:404 +msgid "" +"Specifies the time in milliseconds to wait before disabling a slave after a " +"link failure detection" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:412 +msgid "" +"Specifies the time in milliseconds to wait before enabling a slave after a " +"link recovery detection" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 +msgid "" +"Specifies the wired ports to attach to this bridge. In order to attach " +"wireless networks, choose the associated interface as network in the " +"wireless settings." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:383 +msgid "" +"Specifies whether ARP probes and replies should be validated or non-ARP " +"traffic should be filtered for link monitoring" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:303 +msgid "" +"Specifies whether active-backup mode should set all slaves to the same MAC " +"address at enslavement" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:420 +msgid "" +"Specifies whether or not miimon should use MII or ETHTOOL ioctls vs. " +"netif_carrier_ok()" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:295 +msgid "" +"Specifies whether to shuffle active flows across slaves based on the load" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:181 +msgid "" +"Specifies which slave interfaces should be attached to this bonding interface" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:214 +msgid "" +"Specifies which slave is the primary device. It will always be the active " +"slave while it is available" +msgstr "" + +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:62 +msgid "Specify a TOS (Type of Service)." +msgstr "Nurodyti „TOS“ („Type of Service“)." + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:79 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:79 +msgid "" +"Specify a TOS (Type of Service). Can be inherit (the outer " +"header inherits the value of the inner header) or an hexadecimal value " +"00..FF (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:79 +msgid "" +"Specify a TTL (Time to Live) for the encapsulating packet other than the " +"default (64) (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:69 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:62 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:57 +msgid "" +"Specify a TTL (Time to Live) for the encapsulating packet other than the " +"default (64)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84 +msgid "" +"Specify a Traffic Class. Can be inherit (the outer header " +"inherits the value of the inner header) or an hexadecimal value 00.." +"FF (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 +msgid "" +"Specify an MTU (Maximum Transmission Unit) other than the default (1280 " +"bytes) (optional)." +msgstr "" + +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 +msgid "" +"Specify an MTU (Maximum Transmission Unit) other than the default (1280 " +"bytes)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 +msgid "Specify the secret encryption key here." +msgstr "Nurodyti slaptąjį šifravimo raktą čia." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 +msgid "Stale neighbour cache timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 +msgid "Start" +msgstr "Pradėti" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:140 +msgid "Start WPS" +msgstr "Pradėti „WPS“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:76 +msgid "Start priority" +msgstr "Pradėti pirmenybė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 +#, fuzzy +msgid "Start refresh" +msgstr "Pradėti įkelimą iš naujo" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 +msgid "Starting configuration apply…" +msgstr "Pradėdamas konfigūracijos taikymas…" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 +msgid "Starting wireless scan..." +msgstr "Pradėdamas belaidžio skenavimas..." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:109 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:78 +msgid "Startup" +msgstr "Paleidimas" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Būklė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 +msgid "Static IPv4 Routes" +msgstr "Statiniai „IPv4“ maršrutai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 +msgid "Static IPv6 Routes" +msgstr "Statiniai „IPv6“ maršrutai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:91 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:138 +msgid "Static Lease" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +msgid "Static Leases" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2090 +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:172 +#: modules/luci-compat/luasrc/model/network.lua:967 +msgid "Static address" +msgstr "Statinis adresas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 +msgid "" +"Static leases are used to assign fixed IP addresses and symbolic hostnames " +"to DHCP clients. They are also required for non-dynamic interface " +"configurations where only hosts with a corresponding lease are served." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "Station inactivity limit" +msgstr "Stoties neaktyvumo limitas" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 +msgid "Status" +msgstr "Būklė/Būsena" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 +msgid "Stop" +msgstr "Stop" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:135 +msgid "Stop WPS" +msgstr "Sustabdyti „WPS“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 +msgid "Stop refresh" +msgstr "Sustabdyti įkelimą iš naujo" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:24 +msgid "Storage" +msgstr "Vietovė/Talpa" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 +msgid "Strict filtering" +msgstr "Griežtas filtravimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 +msgid "Strict order" +msgstr "Griežtas įsakymas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 +msgid "Strong" +msgstr "Stiprus" + +#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 +msgid "Submit" +msgstr "Pateikti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 +msgid "Suppress logging" +msgstr "Sumenkinti žurnalymą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 +msgid "Suppress logging of the routine operation for the DHCP protocol." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:46 +msgid "Swap free" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:3 +msgid "Switch" +msgstr "Perjungti/Komutatorius" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:172 +msgid "Switch %q" +msgstr "Perjungti „%q“ (Komutatoriaus „%q“)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:150 +msgid "" +"Switch %q has an unknown topology - the VLAN settings might not be accurate." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3002 +#: modules/luci-compat/luasrc/model/network.lua:1426 +msgid "Switch VLAN" +msgstr "Perjungti „VLAN“ (Komutatoriaus „VLAN“)" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2999 +msgid "Switch port" +msgstr "Perjungti prievadą (Komutatoriaus prievadas)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 +msgid "Switch protocol" +msgstr "Perjungti protokolą (Komutatoriaus protokolas)" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:103 +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:104 +#: modules/luci-compat/luasrc/view/cbi/ipaddr.htm:26 +msgid "Switch to CIDR list notation" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 +msgid "Symbolic link" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:89 +msgid "Sync with NTP-Server" +msgstr "Sinchronizuoti su „NTP“ serveriu" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:81 +msgid "Sync with browser" +msgstr "Sinchronizuoti su naršyklę" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 +msgid "System" +msgstr "Sistema" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:25 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:63 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:75 +msgid "System Log" +msgstr "Sistemos žurnalas" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:245 +msgid "System Priority" +msgstr "Sistemos prioritetas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:118 +msgid "System Properties" +msgstr "Sistemos ypatybės" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:162 +msgid "System log buffer size" +msgstr "Sistemos žurnalo buferio dydis" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 +msgid "System running in recovery (initramfs) mode." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:67 +msgctxt "nft tcp option maxseg size" +msgid "TCP MSS" +msgstr "„TCP MSS“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:54 +msgctxt "nft tcp dport" +msgid "TCP destination port" +msgstr "„TCP“ paskirties prievadas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:57 +msgctxt "nft tcp flags" +msgid "TCP flags" +msgstr "„TCP“ žymės/vėliavos" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:53 +msgctxt "nft tcp sport" +msgid "TCP source port" +msgstr "„TCP“ šaltinio prievadas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:338 +msgid "TCP:" +msgstr "„TCP“:" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 +msgid "TFTP server root" +msgstr "„TFTP“ serverio šaknis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:50 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:85 +msgid "TX" +msgstr "Nusiųsta reaktyviai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:236 +msgid "TX Rate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 +msgid "TX queue length" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 +msgid "Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "Žymė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Pažymėta" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 +msgid "Target" +msgstr "Taikinys" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +msgid "Target Platform" +msgstr "Taikomoji platformą" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:103 +msgid "Target network" +msgstr "Taikomasis tinklas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:36 +msgid "Temp space" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:50 +msgid "Terminate" +msgstr "Nutraukti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 +msgid "" +"The MTU to be published in " +"RA messages. " +"Minimum is 1280 bytes." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 +msgid "" +"The Managed address configuration (M) flag indicates that IPv6 " +"addresses are available via DHCPv6." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 +msgid "" +"The Mobile IPv6 Home Agent (H) flag indicates that the device is " +"also acting as Mobile IPv6 home agent on this link." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 +msgid "" +"The Other configuration (O) flag indicates that other information, " +"such as DNS servers, is available via DHCPv6." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:84 +msgid "The block mount command failed with code %d" +msgstr "„block mount“ komanda nepavyko su kodu %d" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:80 +msgid "" +"The qrencode package is required for generating an QR code image of " +"the configuration." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 +msgid "" +"The DNS server entries in the local resolv.conf are primarily sorted by the " +"weight specified here" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:77 +msgid "" +"The HE.net endpoint update configuration changed, you must now use the plain " +"username instead of the user ID!" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 +msgid "The IP address %h is already used by another static lease" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 +msgid "The IP address is outside of any DHCP pool address range" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 +msgid "The IP address of the boot server" +msgstr "Pajungimo serverio „IP“ adresas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 +msgid "The IPv4 address or the fully-qualified domain name of the remote end." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 +msgid "" +"The IPv4 address or the fully-qualified domain name of the remote tunnel end." +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 +msgid "The IPv6 address or the fully-qualified domain name of the remote end." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 +msgid "" +"The IPv6 address or the fully-qualified domain name of the remote tunnel end." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 +msgid "" +"The IPv6 prefix assigned to the provider, usually ends with ::" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:7 +msgid "The LED blinks with the configured on/off frequency" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +msgid "The LED flashes to simulate actual heart beat." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:8 +msgid "" +"The LED flashes with link status and activity on the configured interface." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:7 +msgid "The LED is always in default state off." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:6 +msgid "The LED is always in default state on." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 +msgid "" +"The MAC address %h is already used by another static lease in the same DHCP " +"pool" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 +msgid "The MTU must not exceed the parent device MTU of %d bytes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 +msgid "The VLAN ID must be unique" +msgstr "„VLAN ID“ turi būti unikalūs" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 +msgid "" +"The allowed characters are: A-Z, a-z, 0-9 and _" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/error.htm:6 +msgid "The configuration file could not be loaded due to the following error:" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "" +"The correct SSID must be manually specified when joining a hidden wireless " +"network" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 +msgid "" +"The device could not be reached within %d seconds after applying the pending " +"changes, which caused the configuration to be rolled back for safety " +"reasons. If you believe that the configuration changes are correct " +"nonetheless, perform an unchecked configuration apply. Alternatively, you " +"can dismiss this warning and edit changes before attempting to apply again, " +"or revert all pending changes to keep the currently working configuration " +"state." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:281 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:393 +msgid "" +"The device file of the memory or partition (e.g." +" /dev/sda1)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +msgid "The device name \"%s\" is already taken" +msgstr "Įrenginio pavadinimas „%s“ yra jau panaudotas kažkur kitur" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 +msgid "" +"The existing network configuration needs to be changed for LuCI to function " +"properly." +msgstr "" +"Dabartinė tinklo konfigūracija turi būti pakeista, kad „LuCI“ veiktų " +"teisingai." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 +msgid "" +"The existing wireless configuration needs to be changed for LuCI to function " +"properly." +msgstr "" +"Dabartinė belaidžio tinklo konfigūracija turi būti pakeista, kad „LuCI“ " +"veiktų teisingai." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:220 +msgid "" +"The flash image was uploaded. Below is the checksum and file size listed, " +"compare them with the original file to ensure data integrity.
    Click " +"'Continue' below to start the flash procedure." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:249 +msgid "The following rules are currently active on this system." +msgstr "Šioje sistemoje šiuo metu galioja šios taisyklės." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 +msgid "The frequency is in direct proportion to 1-minute average CPU load." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:154 +msgid "The gateway address must not be a local IP address" +msgstr "Tinklo sietuvo adresas neturi būti vietinis IP adresas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 +msgid "" +"The generated configuration can be imported into a WireGuard client " +"application to set up a connection towards this device." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +msgid "The given SSH public key has already been added." +msgstr "Pateiktas „SSH“ viešasis raktas jau buvo pridėtas." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 +msgid "" +"The given SSH public key is invalid. Please supply proper public RSA, " +"ED25519 or ECDSA keys." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 +msgid "The hostname of the boot server" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "Sąsają nebuvo rasta" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 +msgid "The interface name is already used" +msgstr "Sąsajos pavadinimas jau yra naudojamas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 +msgid "The interface name is too long" +msgstr "Sąsajos pavadinimas yra per ilgas" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 +msgid "" +"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " +"addresses." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 +msgid "The length of the IPv6 prefix in bits" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:165 +msgid "The local IPv4 address" +msgstr "Vietinis „IPv4“ adresas" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 +msgid "The local IPv4 address over which the tunnel is created (optional)." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:171 +msgid "The local IPv4 netmask" +msgstr "Vietinio „IPv4“ tinklo kaukė" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:53 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 +msgid "The local IPv6 address over which the tunnel is created (optional)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +msgid "" +"The max response time in centiseconds inserted into group-specific queries " +"sent in response to leave group messages. It is also the amount of time " +"between group-specific query messages. This value may be tuned to modify the " +"\"leave latency\" of the network. A reduced value results in reduced time to " +"detect the loss of the last member of a group" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 +msgid "" +"The max response time in centiseconds inserted into the periodic general " +"queries. By varying the value, an administrator may tune the burstiness of " +"IGMP messages on the subnet; larger values make the traffic less bursty, as " +"host responses are spread out over a larger interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +msgid "" +"The maximum hops to be published in RA messages. Maximum is 255 hops." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 +msgid "" +"The network access to this device could be interrupted by changing settings " +"of the \"%h\" interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 +msgid "The network name is already used" +msgstr "Tinklo pavadinimas jau yra naudojamas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 +msgid "" +"The network ports on this device can be combined to several VLANs in which computers can " +"communicate directly with each other. VLANs are often used to separate different network " +"segments. Often there is by default one Uplink port for a connection to the " +"next greater network like the internet and other ports for a local network." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 +msgid "" +"The public hostname or IP address of this system the peer should connect to. " +"This usually is a static public IP address, a static hostname or a DDNS " +"domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 +msgid "The query response interval must be lower than the query interval value" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:158 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:42 +msgid "The reboot command failed with code %d" +msgstr "Paleidimo iš naujo komanda nepavyko su kodu %d" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:147 +msgid "The restore command failed with code %d" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 +msgid "" +"The robustness value allows tuning for the expected packet loss on the " +"network. If a network is expected to be lossy, the robustness value may be " +"increased. IGMP is robust to (Robustness-1) packet losses" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 +msgid "" +"The rule target is a jump to another rule specified by its priority value" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 +msgid "" +"The rule target is a table lookup ID: a numeric table index ranging from 0 " +"to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " +"aliases local (255), main (254) and default (253) are also valid" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 +msgid "The selected %s mode is incompatible with %s encryption" +msgstr "Pasirinktas „%s“ režimas yra nesuderinamas su „%s“ šifravimu" + +#: modules/luci-base/ucode/template/csrftoken.ut:11 +msgid "The submitted security token is invalid or already expired!" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:98 +msgid "" +"The system is erasing the configuration partition now and will reboot itself " +"when finished." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:320 +msgid "" +"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " +"few minutes before you try to reconnect. It might be necessary to renew the " +"address of your computer to reach the device again, depending on your " +"settings." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:163 +msgid "" +"The system is rebooting now. If the restored configuration changed the " +"current LAN IP address, you might need to reconnect manually." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:85 +msgid "The system password has been successfully changed." +msgstr "Sistemos slaptažodis sėkmingai pakeistas." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:345 +msgid "The sysupgrade command failed with code %d" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 +msgid "" +"The uploaded backup archive appears to be valid and contains the files " +"listed below. Press \"Continue\" to restore the backup and reboot, or " +"\"Cancel\" to abort the operation." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:115 +msgid "The uploaded backup archive is not readable" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:249 +msgid "The uploaded firmware does not allow keeping current configuration." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:244 +msgid "" +"The uploaded image file does not contain a supported format. Make sure that " +"you choose the generic image format for your platform." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 +msgid "" +"There are legacy iptables rules present on the system. Mixing iptables and " +"nftables rules is discouraged and may lead to incomplete traffic filtering." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 +msgid "There are no active leases" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 +msgid "There are no changes to apply" +msgstr "Nėra pakeitimų kurių galima įgalinti" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 +msgid "" +"There is no password set on this router. Please configure a root password to " +"protect the web interface." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 +msgid "This IPv4 address of the relay" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 +msgid "This authentication type is not applicable to the selected EAP method." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 +msgid "This does not look like a valid PEM file" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 +msgid "" +"This is a list of shell glob patterns for matching files and directories to " +"include during sysupgrade. Modified files in /etc/config/ and certain other " +"configurations are automatically preserved." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 +msgid "" +"This is either the \"Update Key\" configured for the tunnel or the account " +"password if no update key has been configured" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 +msgid "" +"This is the content of /etc/rc.local. Insert your own commands here (in " +"front of 'exit 0') to execute them at the end of the boot process." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:54 +msgid "" +"This is the local endpoint address assigned by the tunnel broker, it usually " +"ends with ...:2/64" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +msgid "This is the only DHCP server in the local network." +msgstr "Tai yra vienintelis „DHCP“ serveris vietiniame tinkle." + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 +msgid "This is the plain username for logging into the account" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 +msgid "" +"This is the prefix routed to you by the tunnel broker for use by clients" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:29 +msgid "This is the system crontab in which scheduled tasks can be defined." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 +msgid "" +"This is usually the address of the nearest PoP operated by the tunnel broker" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:65 +msgid "" +"This list gives an overview over currently running system processes and " +"their status." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 +msgid "" +"This option cannot be used because the ca-bundle package is not installed." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2280 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:172 +#: modules/luci-compat/luasrc/view/cbi/tsection.htm:32 +msgid "This section contains no values yet" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:124 +msgid "Time Synchronization" +msgstr "Laiko sinchronizavimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Laiko skelbimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 +msgid "Time in milliseconds" +msgstr "Laikas milisekundėmis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 +msgid "Time in seconds to spend in listening and learning states" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 +msgid "Time interval for rekeying GTK" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Laiko juostą" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 +msgid "Timed-out" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 +msgid "Timeout in seconds" +msgstr "Laukimo laikas sekundėmis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 +msgid "Timeout in seconds for learned MAC addresses in the forwarding database" +msgstr "" +"Laukimo laikas sekundėmis iÅ¡moktiems „MAC“ adresams persiuntimo duomenų " +"bazėje" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +msgid "Timeout in seconds until topology updates on link loss" +msgstr "Laukimo laikas sekundėmis kol topologiją atsinaujiną praradus ryšį" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:145 +msgid "Timezone" +msgstr "Laiko juosta" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 +msgid "" +"To fully configure the local WireGuard interface from an existing (e.g. " +"provider supplied) configuration file, use the configuration import instead." +msgstr "" +"Norėdami visiÅ¡kai sukonfigÅ«ruoti vietinę „WireGuard“ sąsają iÅ¡ esamo (pvz., " +"tiekėjo pateikto) konfigÅ«racijos failo, naudokite „“ konfigÅ«racijos importavimą „“." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 +msgid "" +"To restore configuration files, you can upload a previously generated backup " +"archive here. To reset the firmware to its initial state, click \"Perform " +"reset\" (only possible with squashfs images)." +msgstr "" +"Kad atkurtumėte konfigÅ«racijos failus, jÅ«s galite čia įkelti seniau " +"sugeneruotą atkÅ«rimo archyvą. Norėdami atkurti programine įrangą į numatytą, " +"spauskite – „Atlikti perkrovimą į gamyklinius parametrus“ (galimas tik su " +"„squashfs images“)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +msgid "Tone" +msgstr "Tonas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:35 +msgid "Total Available" +msgstr "IÅ¡ viso pasiekiama" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 +msgid "Traceroute" +msgstr "„Traceroute“" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "Sekimo srities kodas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 +msgid "Traffic" +msgstr "Eismas" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:79 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84 +msgid "Traffic Class" +msgstr "Eismo klasė" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 +msgid "Traffic filter chain \"%h\"" +msgstr "Eismo filtro grandinė „%h“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 +msgctxt "nft counter" +msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" +msgstr "Eismas sulygintas pagal taisyklę: %.1000mPaketai, %.1024Megabaitai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:387 +msgid "Transfer" +msgstr "Perduoti" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:25 +msgid "Transmit" +msgstr "Siųsti" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:319 +msgid "Transmit Hash Policy" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "Siuntimas nutrauktas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "Siuntimo klaidos" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "IÅ¡siųsti duomenys" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "IÅ¡siųsti baitai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "IÅ¡siųsti paketai" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 +msgctxt "nft @th,off,len" +msgid "Transport header bits %d-%d" +msgstr "Transporto antraÅ¡tės bitai „%d-%d“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:59 +msgctxt "nft th dport" +msgid "Transport header destination port" +msgstr "Transporto antraÅ¡tės paskirties vietos prievadas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:58 +msgctxt "nft th sport" +msgid "Transport header source port" +msgstr "Transporto antraÅ¡tės Å¡altinio prievadas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:75 +msgid "Trigger" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:20 +msgid "Trigger Mode" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:69 +msgid "Tunnel ID" +msgstr "Tunelio „ID“" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3005 +#: modules/luci-compat/luasrc/model/network.lua:1431 +msgid "Tunnel Interface" +msgstr "Tunelio sąsają" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:44 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:55 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:76 +msgid "Tunnel Link" +msgstr "Tunelio nuoroda" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 +msgid "Tunnel device" +msgstr "Tunelio įrenginys" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 +msgid "Tx-Power" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 +msgid "Type" +msgstr "Tipas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 +msgid "Type of service" +msgstr "Tarnybos tipas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:56 +msgctxt "nft udp dport" +msgid "UDP destination port" +msgstr "„UDP“ paskirties vietos prievadas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:55 +msgctxt "nft udp sport" +msgid "UDP source port" +msgstr "„UDP“ Å¡altinio prievadas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:328 +msgid "UDP:" +msgstr "„UDP“:" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:91 +msgid "UMTS only" +msgstr "Tik „UMTS“" + +#: modules/luci-compat/luasrc/model/network/proto_3g.lua:10 +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:43 +msgid "UMTS/GPRS/EV-DO" +msgstr "„UMTS/GPRS/EV-DO“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 +msgid "UUID" +msgstr "„UUID“" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:16 +#: modules/luci-base/htdocs/luci-static/resources/network.js:17 +#: modules/luci-compat/luasrc/model/network.lua:34 +#: modules/luci-compat/luasrc/model/network.lua:35 +msgid "Unable to determine device name" +msgstr "Nepavyksta nustatyti įrenginio pavadinimo" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:18 +#: modules/luci-compat/luasrc/model/network.lua:36 +msgid "Unable to determine external IP address" +msgstr "Nepapvyksta nustatyti iÅ¡orinio „IP“ adreso" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:19 +#: modules/luci-compat/luasrc/model/network.lua:37 +msgid "Unable to determine upstream interface" +msgstr "" + +#: modules/luci-base/ucode/template/error404.ut:12 +msgid "Unable to dispatch" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:85 +msgid "Unable to generate QR code: %s" +msgstr "Nepavyko sukurti „QR-kodo“: %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:9 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:15 +msgid "Unable to load log data:" +msgstr "Nepavyko pakrauti žurnalo duomenų:" + +#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:54 +#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:54 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:22 +msgid "Unable to obtain client ID" +msgstr "Nepavyko gauti kliento „ID“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:221 +msgid "Unable to obtain mount information" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:307 +msgid "Unable to reset ip6tables counters: %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:305 +msgid "Unable to reset iptables counters: %s" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:61 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:7 +msgid "Unable to resolve AFTR host name" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:20 +#: modules/luci-compat/luasrc/model/network.lua:38 +msgid "Unable to resolve peer host name" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:313 +msgid "Unable to restart firewall: %s" +msgstr "Nepavyko paleisti iÅ¡ naujo užkardos: %s" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:22 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:370 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:57 +msgid "Unable to save contents: %s" +msgstr "Nepavyko iÅ¡saugoti turinį: %s" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "Nepavyko nustatyti leidžiamo režimo sąraÅ¡o." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "Nepavyko nustatyti pageidaujamą režimą." + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "Nepavyko patvirtinti „PIN-kodo“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 +msgid "Unconfigure" +msgstr "AtkonfigÅ«ruoti" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "„Unet“" + +#: modules/luci-base/htdocs/luci-static/resources/fs.js:102 +msgid "Unexpected reply data format" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 +msgid "" +"Unique Local Address - in the range fc00::/7. Typically only " +"within the ‘local’ half fd00::/8. ULA for IPv6 is " +"analogous to IPv4 private network addressing. This prefix is randomly " +"generated at first install." +msgstr "" +"Unikalus vietinis adresas – diapazone „fc00::/7“. Paprastai tik " +"„‘“ vietinėje „’“ pusė „fd00::/8“. „IPv6 ULA“ yra " +"analogiÅ¡ka „IPv4“ privataus tinklo adresavimui. Å is prieÅ¡dėlis " +"sugeneruojamas atsitiktinai pirmą kartą įdiegiant." + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2092 +#: modules/luci-compat/luasrc/model/network.lua:971 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:17 +msgid "Unknown" +msgstr "Nežinomas" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 +msgid "Unknown and unsupported connection method." +msgstr "Nežinomas ir nepalaikomas prisijungimo bÅ«das." + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2401 +#: modules/luci-compat/luasrc/model/network.lua:1138 +msgid "Unknown error (%s)" +msgstr "Nežinoma klaida (%s)" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:412 +msgid "Unknown error code" +msgstr "Nežinomos klaidos kodas" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2089 +#: modules/luci-base/htdocs/luci-static/resources/protocol/none.js:6 +#: modules/luci-compat/luasrc/model/network.lua:965 +msgid "Unmanaged" +msgstr "Netvarkomas/-a/-i" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:195 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:217 +msgid "Unmount" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 +msgid "Unnamed key" +msgstr "Nepavadintas raktas" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 +msgid "Unsaved Changes" +msgstr "NeiÅ¡saugoti pakeitimai" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:410 +msgid "Unspecified error" +msgstr "Nenustatyta klaida" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:64 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:9 +msgid "Unsupported MAP type" +msgstr "Nepalaikomas „MAP“ tipas" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +msgid "Unsupported modem" +msgstr "Nepalaikomas modemas" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Nepalaikomas protokolas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 +msgid "Unsupported protocol type." +msgstr "Nepalaikomas protokolo tipas." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Nepažymėtas" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 +msgid "Untitled peer" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 +msgid "Up" +msgstr "VirÅ¡un" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:411 +msgid "Up Delay" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 +msgid "Upload" +msgstr "Ä®kelti" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:441 +msgid "" +"Upload a sysupgrade-compatible image here to replace the running firmware." +msgstr "" +"Ä®kelti su „sysupgrade“ suderinama laikmeną, kad pakeistumėte veikiančią " +"programinę aparatinę įrangą." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:138 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:169 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:412 +msgid "Upload archive..." +msgstr "Ä®kelti archyvą..." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 +msgid "Upload file" +msgstr "Ä®kelti failą" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 +msgid "Upload file…" +msgstr "Ä®kelti failą…" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "Ä®kėlimas buvo atÅ¡auktas" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 +msgid "Upload request failed: %s" +msgstr "Ä®kėlimo praÅ¡ymas nesėkmingas: %s" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 +msgid "Uploading file…" +msgstr "Ä®kėliamas failas…" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 +msgid "" +"Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " +"assigned with a name in the form wifinet# and the network will be " +"restarted to apply the updated configuration." +msgstr "" +"Paspaudus „Tęsti“, anoniminiams „wifi-iface“ skyriams bus suteiktas " +"„wifinet#“ formos pavadinimas ir tinklas bus paleistas iÅ¡ naujo, " +"kad bÅ«tų pritaikyta atnaujinta konfigÅ«racija." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 +msgid "" +"Upon pressing \"Continue\", bridges configuration will be updated and the " +"network will be restarted to apply the updated configuration." +msgstr "" +"Paspaudus „Tęsti“, bus atnaujinta tiltų konfigÅ«racija ir tinklas bus " +"paleistas iÅ¡ naujo, kad bÅ«tų pritaikyta atnaujinta konfigÅ«racija." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 +msgid "" +"Upon pressing \"Continue\", ifname options will get renamed and the network " +"will be restarted to apply the updated configuration." +msgstr "" +"Paspaudus „Tęsti-, „ifname“ parinktys bus pervadintos ir tinklas bus " +"paleistas iÅ¡ naujo, kad bÅ«tų pritaikyta atnaujinta konfigÅ«racija." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 +msgid "Upstream resolvers will be queried in the order of the resolv file." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +msgid "Uptime" +msgstr "Aktyvumo laikas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 +msgid "Use /etc/ethers" +msgstr "Naudoti „/etc/ethers“" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Naudoti „DHCP“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 +msgid "Use DHCP advertised servers" +msgstr "Naudoti „DHCP“ reklamuojamus serverius" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 +msgid "Use DHCP gateway" +msgstr "Naudoti „DHCP“ tinklo tarpuvartę" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Naudoti „DHCPv6“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 +msgid "Use DNS servers advertised by peer" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 +msgid "Use ISO/IEC 3166 alpha2 country codes." +msgstr "Naudoti „ISO/IEC 3166 alpha2“ Å¡alies kodus." + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:48 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:89 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:69 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:53 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:67 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:84 +msgid "Use MTU on tunnel interface" +msgstr "Naudoti „MTU“ ant tunelio sąsajos" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:85 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:65 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:49 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:80 +msgid "Use TTL on tunnel interface" +msgstr "Naudoti „TTL“ ant tunelio sąsajos" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:322 +msgid "Use XOR of hardware MAC addresses (layer2)" +msgstr "Naudoti „XOR“ techninės įrangos „MAC“ adresus („layer2“)" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:323 +msgid "Use XOR of hardware MAC addresses and IP addresses (layer2+3)" +msgstr "" +"Naudoti „XOR“ techninės įrangos „MAC“ adresus ir „IP“ adresus („layer2+3“)" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:325 +msgid "" +"Use XOR of hardware MAC addresses and IP addresses, rely on skb_flow_dissect " +"(encap2+3)" +msgstr "" +"Naudoti „XOR“ techninės įrangos „MAC“ adresus ir „IP“ adresus, pasikliauti " +"ant „skb_flow_dissect (encap2+3)“" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:295 +msgid "Use as external overlay (/overlay)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:294 +msgid "Use as root filesystem (/)" +msgstr "Naudoti kaip „root“ failų sistemą (/)" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 +msgid "Use broadcast flag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 +msgid "Use builtin IPv6-management" +msgstr "Naudoti įtaisytą „IPv6“ tvarkymą" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 +msgid "Use custom DNS servers" +msgstr "Naudoti tinkintą „DNS“ serverį" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 +msgid "Use default gateway" +msgstr "Naudoti numatytąjį tinklo tarpuvartę" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 +msgid "Use gateway metric" +msgstr "Naudoti tinklo tarpuvartės metrika" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 +msgid "Use legacy MAP" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 +msgid "" +"Use legacy MAP interface identifier format (draft-ietf-softwire-map-00) " +"instead of RFC7597" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 +msgid "Use routing table" +msgstr "Naudoti kelvado lentelę" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:63 +msgctxt "nft nat flag persistent" +msgid "Use same source and destination for each connection" +msgstr "Naudoti tą patį Å¡altinį ir paskirties vietą kiekvienam ryÅ¡iui" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +msgid "Use system certificates" +msgstr "Naudoti sistemos sertifikatus" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 +msgid "Use system certificates for inner-tunnel" +msgstr "Naudoti sistemos sertifikatus vidiniam tuneliui" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 +msgid "" +"Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " +"address to use, and the Hostname is assigned as a symbolic name to " +"the requesting host. The optional Lease time can be used to set non-" +"standard host-specific lease time, e.g. 12h, 3d or infinite." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:324 +msgid "Use upper layer protocol information (layer3+4)" +msgstr "Naudoti virÅ¡utinio sluoksnio protokolo informaciją („layer3-4“)" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:326 +msgid "" +"Use upper layer protocol information, rely on skb_flow_dissect (encap3+4)" +msgstr "" +"Naudoti virÅ¡utinio sluoksnio protokolo informaciją, pasikliauti ant " +"„skb_flow_dissect (encap3+4)“" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:36 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:194 +msgid "Used" +msgstr "Naudotas/-a" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 +msgid "Used Key Slot" +msgstr "Naudotas rakto lizdas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 +msgid "" +"Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " +"needed with normal WPA(2)-PSK." +msgstr "" +"Naudojamas dviems skirtingams tikslams: „RADIUS NAS ID“ ir „802.11r R0KH-" +"ID“. Nereikalingas su normaliu „WPA(2)-PSK“." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 +msgid "User Group" +msgstr "Vartotojų grupė" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 +msgid "User certificate (PEM encoded)" +msgstr "Vartotojo sertifikatas („PEM“ užkoduotas/-a)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 +msgid "User identifier" +msgstr "Vartotojo identifikatorius" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 +msgid "User key (PEM encoded)" +msgstr "Vartotojo raktas („PEM“ užkoduotas/-a)" + +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 +msgid "Username" +msgstr "Slapyvardis/Vartotojo vardas" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 +msgid "Utilize flow table %h" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 +msgid "VC-Mux" +msgstr "„VC-Mux“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 +msgid "VDSL" +msgstr "„VDSL“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 +msgctxt "MACVLAN mode" +msgid "VEPA (Virtual Ethernet Port Aggregator)" +msgstr "„VEPA“ (Virtualus eterneto prievado agregatorius)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 +msgid "VLAN (802.1ad)" +msgstr "„VLAN (802.1ad)“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 +msgid "VLAN (802.1q)" +msgstr "„VLAN (802.1q)“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 +msgid "VLAN ID" +msgstr "„VLAN ID“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:173 +msgid "VLANs on %q" +msgstr "„VLAN'ai“ ant %q" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:54 +msgid "VPN" +msgstr "„VPN“" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:42 +msgid "VPN Local address" +msgstr "Vietinis „VPN“ adresas" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:46 +msgid "VPN Local port" +msgstr "Vietinis „VPN“ prievadas" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 +msgid "VPN Protocol" +msgstr "„VPN“ protokolas" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 +msgid "VPN Server" +msgstr "„VPN“ serveris" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "„VPN“ serverio sertifikato „SHA256“ maiÅ¡a" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 +msgid "VPN Server port" +msgstr "„VPN“ serverio prievadas" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +msgid "VPN Server's certificate SHA1 hash" +msgstr "„VPN“ serverio sertifikato „SHA1“ maiÅ¡a" + +#: modules/luci-compat/luasrc/model/network/proto_vpnc.lua:9 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:9 +msgid "VPNC (CISCO 3000 (and others) VPN)" +msgstr "„VPNC“ („CISCO 3000 (ir kiti) VPN“)" + +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "„VTI“" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 +msgid "VXLAN (RFC7348)" +msgstr "„VXLAN (RFC7348)“" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 +msgid "VXLAN network identifier" +msgstr "„VXLAN“ tinklo identifikatorius" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:10 +msgid "VXLANv6 (RFC7348)" +msgstr "„VXLANv6 (RFC7348)“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +msgid "" +"Validate DNS replies and cache DNSSEC data, requires upstream to support " +"DNSSEC." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 +msgid "" +"Validate server certificate using built-in system CA bundle,
    requires " +"the \"ca-bundle\" package" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:388 +msgid "Validation for all slaves" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:386 +msgid "Validation only for active slave" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:387 +msgid "Validation only for backup slaves" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:73 +msgid "Vendor" +msgstr "Tiekėjas" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:40 +msgid "Vendor Class to send when requesting DHCP" +msgstr "Tiekėjo klasė, kurią reikia siųsti prašant „DHCP“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 +msgid "Verify unsigned domain responses really come from unsigned domains." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:196 +msgid "Verifying the uploaded image file." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 +msgid "Very High" +msgstr "Labai aukštas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 +msgid "Virtual Ethernet" +msgstr "Virtualus „Ethernet'as“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:60 +msgid "Virtual dynamic interface" +msgstr "Virtuali dinaminė sąsaja" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +msgid "WDS" +msgstr "„WDS“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 +msgid "WEP Open System" +msgstr "„WEP“ atviroji sistema" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 +msgid "WEP Shared Key" +msgstr "„WEP“ bendrinamas raktas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 +msgid "WEP passphrase" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 +msgid "WMM Mode" +msgstr "„WMM“ režimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "„WNM“ miego režimas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 +msgid "WPA passphrase" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 +msgid "" +"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " +"and ad-hoc mode) to be installed." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:153 +msgid "WPS status" +msgstr "„WPS“ būsena" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:47 +msgid "Waiting for device..." +msgstr "Laukiama įrenginio..." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:189 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:199 +msgid "Warning" +msgstr "Įspėjimas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:26 +msgid "Warning: There are unsaved changes that will get lost on reboot!" +msgstr "Ispėjimas: Yra neišsaugotų pakeitimų, kurie bus prarasti perkraunant!" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 +msgid "Weak" +msgstr "Silpnas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Svoris" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 +msgid "" +"When delegating prefixes to multiple downstreams, interfaces with a higher " +"preference value are considered first when allocating subnets." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 +msgid "" +"When enabled, gateway is on-link even if the gateway does not match any " +"interface prefix" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Kai apverstas, šviesos diodas („LED“) nuolat šviečia ir mirksi, o ne pagal " +"numatytuosius nustatymus išjungtas ir mirksi sistemos veiklos metu." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +msgid "" +"When using a PSK, the PMK can be automatically generated. When enabled, the " +"R0/R1 key options below are not applied. Disable this to use the R0 and R1 " +"key options." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 +msgid "" +"Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " +"802.11a/802.11g rates." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 +msgid "" +"Where the ESSID is hidden, clients may fail to roam and airtime efficiency " +"may be significantly reduced." +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 +msgid "Width" +msgstr "Plotis" + +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "„WireGuard“" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "„WireGuard“ būsena" + +#: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 +msgid "WireGuard VPN" +msgstr "„WireGuard VPN“" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 +msgid "WireGuard peer is disabled" +msgstr "„WireGuard“ lygiarangis yra išjungtas" + +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:10 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:148 +msgid "Wireless" +msgstr "Belaidis" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2992 +#: modules/luci-compat/luasrc/model/network.lua:1419 +msgid "Wireless Adapter" +msgstr "Belaidis adapteris" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2971 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 +#: modules/luci-compat/luasrc/model/network.lua:1405 +#: modules/luci-compat/luasrc/model/network.lua:1868 +msgid "Wireless Network" +msgstr "Belaidis Tinklas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 +msgid "Wireless Overview" +msgstr "Belaidžio apžiūra" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 +msgid "Wireless Security" +msgstr "Belaidis saugumas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 +msgid "Wireless configuration migration" +msgstr "Belaidžio ryšio konfigūracijos migracija" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:152 +msgid "Wireless is disabled" +msgstr "Belaidis ryšys yra atjungtas/drausties būsenoje" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:152 +msgid "Wireless is not associated" +msgstr "Belaidis ryšys nėra susietas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 +msgid "Wireless network is disabled" +msgstr "Belaidis tinklas yra išjungtas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 +msgid "Wireless network is enabled" +msgstr "Belaidis tinklas yra įjungtas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 +msgid "Write received DNS queries to syslog." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:181 +msgid "Write system log to file" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:206 +msgid "XOR policy (balance-xor, 2)" +msgstr "„XOR“ politika („xor balansas, 2“)" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 +msgid "Yes" +msgstr "Taip" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:305 +msgid "Yes (none, 0)" +msgstr "Taip (nieko, 0)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:177 +msgid "" +"You appear to be currently connected to the device via the \"%h\" interface. " +"Do you really want to shut down the interface?" +msgstr "" +"Atrodo, kad šiuo metu esate prisijungę prie įrenginio per „%h“ sąsają ir/" +"arba sietuvą. Ar tikrai norite išjungti sąsają ir/arba sietuvą?" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:112 +msgid "" +"You can enable or disable installed init scripts here. Changes will applied " +"after a device reboot.
    Warning: If you disable essential init " +"scripts like \"network\", your device might become inaccessible!" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 +msgid "" +"You must enable JavaScript in your browser or LuCI will not work properly." +msgstr "" +"Savo naršyklėje turite įjungti „JavaScript“, kitaip „LuCI“ neveiks tinkamai." + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:117 +msgid "" +"You must select a primary interface which is included in selected slave " +"interfaces!" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:98 +msgid "" +"You must select at least one ARP IP target if ARP monitoring is selected!" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:213 +msgid "ZRam Compression Algorithm" +msgstr "„ZRam“ glaudinimo algoritmas" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:206 +msgid "ZRam Settings" +msgstr "„ZRam“ nustatymai" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:208 +msgid "ZRam Size" +msgstr "„ZRam“ dydis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "„_proto: _tcp, _udp, _sctp, _quic, …“." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_tarnyba: „_sip, _ldap, _imap, _stun, _xmpp-client, …“ . (Pastaba: nors " +"„_http“ yra įmanomas, nė viena naršyklė nepalaikys „SRV“ įrašo.)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 +msgid "any" +msgstr "bet koks" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 +msgid "auto" +msgstr "automatiškai" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 +msgid "automatic" +msgstr "automatinis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automatinis (atjungtas)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automatinis (įjungtas)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 +msgid "baseT" +msgstr "„baseT“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 +msgid "bridged" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:146 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:406 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:35 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:99 +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:31 +msgid "create" +msgstr "sukurti" + +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:69 +msgid "create:" +msgstr "sukurti:" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:55 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:58 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:62 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:83 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:84 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:187 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:41 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:276 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:279 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:283 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:284 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:263 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:266 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:269 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:273 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:276 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:279 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:305 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:306 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:307 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:311 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:312 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:313 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:315 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:316 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:317 +msgid "dBm" +msgstr "dBm" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:73 +msgctxt "nft unit" +msgid "day" +msgstr "diena" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 +msgid "disable" +msgstr "išjungti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 +msgid "disabled" +msgstr "išjungtas/-i" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 +msgid "driver default" +msgstr "tvarkyklės numatytas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "tvarkyklės numatytas („%s“)" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 +msgid "e.g: --proxy 10.10.10.10" +msgstr "pvz: „--proxy 10.10.10.10“" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 +msgid "e.g: dump" +msgstr "pvz: „dump“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "įjungtas/-i" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "kiekvienas „%ds“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 +msgid "expired" +msgstr "nebegaliojantis/-i" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 +msgid "forced" +msgstr "priverstas" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:85 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:196 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:61 +msgid "forward" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 +msgid "full-duplex" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 +msgid "half-duplex" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 +msgid "hexadecimal encoded value" +msgstr "šešioliktainė užkoduota vertė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 +msgid "hidden" +msgstr "paslėpta/-as" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:74 +msgctxt "nft unit" +msgid "hour" +msgstr "valanda" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +msgid "hybrid mode" +msgstr "hibridinis režimas" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:63 +msgid "ignore" +msgstr "ignoruoti" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 +msgid "input" +msgstr "įvestis" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:410 +msgid "key between 8 and 63 characters" +msgstr "raktas tarp 8 ir 63 rašmenų" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:422 +msgid "key with either 5 or 13 characters" +msgstr "raktas su 5-iais arba 13-a rašmenų" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "žinomas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 +msgid "managed config (M)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 +msgid "medium security" +msgstr "vidutinė apsauga" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:75 +msgctxt "nft unit" +msgid "minute" +msgstr "minutė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 +msgid "minutes" +msgstr "minutės" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 +msgid "mobile home agent (H)" +msgstr "mobilus namų agentas (H)" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:423 +msgid "netif_carrier_ok()" +msgstr "„netif_carrier_ok()“" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +msgid "no" +msgstr "ne" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 +msgid "no link" +msgstr "nėra nuorodos/sujungimo" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2269 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:59 +msgid "non-empty value" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "none" +msgstr "joks" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:41 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:55 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:69 +msgid "not present" +msgstr "nėra" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +msgid "off" +msgstr "išjungta" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +msgid "on available prefix" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 +msgid "open network" +msgstr "atviras tinklas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 +msgid "other config (O)" +msgstr "kiti konfigūravimai (O)" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 +msgid "output" +msgstr "išvestis" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "prieš daugiau nei dieną" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 +msgctxt "nft unit" +msgid "packets" +msgstr "paketai" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:252 +msgid "positive decimal value" +msgstr "teigiama dešimtainė vertė" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:244 +msgid "positive integer value" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:178 +msgid "random" +msgstr "atsitiktinis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "atsitiktinai sukurtas" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 +msgid "relay mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 +msgid "routed" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 +msgid "sec" +msgstr "sek." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 +msgid "server mode" +msgstr "serverio režimas" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:54 +msgid "sstpc Log-level" +msgstr "„sstpc“ žurnalo lygis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +msgid "strong security" +msgstr "stipri apsauga" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:354 +msgid "tagged" +msgstr "pažymėtas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +msgid "time units (TUs / 1.024 ms) [1000-65535]" +msgstr "laiko vienetai („TUs“ / 1.024 ms) [1000-65535]" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 +msgid "" +"uHTTPd offers HTTP or " +"HTTPS network " +"access." +msgstr "" +"„uHTTPd“ suteikia „HTTP“ " +"arba „HTTPS“ " +"tinklo prieigą." + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 +msgid "unique value" +msgstr "unikali vertė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 +msgid "unknown" +msgstr "nežinoma" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "nežinoma versija" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 +msgid "unlimited" +msgstr "neribotas" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:397 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:433 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:470 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:566 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:53 +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:38 +msgid "unspecified" +msgstr "nenustatyta/-s/-i" + +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:71 +msgid "unspecified -or- create:" +msgstr "nenustatyta/-s/-i -arba- sukurti:" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:352 +msgid "untagged" +msgstr "nepažymėtas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +msgid "valid IP address" +msgstr "tinkamas „IP“ adresas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:257 +msgid "valid IP address or prefix" +msgstr "tinkamas „IP“ adresas ar prielinksnis" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:294 +msgid "valid IPv4 CIDR" +msgstr "tinkamas „IPv4 CIDR“" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +msgid "valid IPv4 address" +msgstr "tinkamas „IPv4“ adresas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:265 +msgid "valid IPv4 address or network" +msgstr "tinkamas „IPv4“ adresas ar tinklas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:389 +msgid "valid IPv4 address:port" +msgstr "tinkamas „IPv4“ adresas:prievadas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:328 +msgid "valid IPv4 network" +msgstr "tinkamas „IPv4“ tinklas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:288 +msgid "valid IPv4 or IPv6 CIDR" +msgstr "tinkamas „IPv4“ ar „IPv6“ „CIRD“" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:278 +msgid "valid IPv4 prefix value (0-32)" +msgstr "tinkama „IPv4“ prielinksnio reikšmė (0-32)" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:300 +msgid "valid IPv6 CIDR" +msgstr "tinkamas „IPv6 CIDR“" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +msgid "valid IPv6 address" +msgstr "tinkamas „IPv6“ adresas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:273 +msgid "valid IPv6 address or prefix" +msgstr "tinkamas „IPv6“ adresas ar prielinksnis" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:318 +msgid "valid IPv6 host id" +msgstr "tinkamas „IPv6 skleidėjo/p.k – vedėjo id“" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:333 +msgid "valid IPv6 network" +msgstr "tinkamas „IPv6“ tinklas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:283 +msgid "valid IPv6 prefix value (0-128)" +msgstr "tinkama „IPv6“ prielinksnio reikšmė (0-128)" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:355 +msgid "valid MAC address" +msgstr "tinkamas „MAC“ adresas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:426 +msgid "valid UCI identifier" +msgstr "tinkamas „UCI“ identifikatorius" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:377 +msgid "valid UCI identifier, hostname or IP address range" +msgstr "" +"tinkamas „UCI“ identifikatorius, įrenginio pavadinimas ar „IP“ adreso rėžis" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:398 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:401 +msgid "valid address:port" +msgstr "tinkamas adresas:prievadas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 +msgid "valid date (YYYY-MM-DD)" +msgstr "tinkama data (MMMM-MM-DD)" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:248 +msgid "valid decimal value" +msgstr "tinkama dešimtainės reikšmė" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:420 +msgid "valid hexadecimal WEP key" +msgstr "tinkamas šešioliktainis „WEP“ raktas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:408 +msgid "valid hexadecimal WPA key" +msgstr "tinkamas šešioliktainis „WPA“ raktas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:383 +msgid "valid host:port" +msgstr "tinkamas skleidėjo/p.k – vedėjo:prievadas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:370 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 +msgid "valid hostname" +msgstr "tinkamas įrenginio pavadinimas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:360 +msgid "valid hostname or IP address" +msgstr "tinkamas įrenginio pavadinimas ar „IP“ adresas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:240 +msgid "valid integer value" +msgstr "tinkamas sveikojo skaičiaus reikšmė" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:355 +msgid "valid multicast MAC address" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"tinkamas tinklo įrenginio pavadinimas tarp 1 ir 15 simbolių, kuriame nėra " +"„:“, „/“, „%“ ar tarpų" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "tinkamas tinklo įrenginio pavadinimas, ne „.“ ar „..“" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:323 +msgid "valid network in address/netmask notation" +msgstr "tinkamas tinklas adrese/tinklo kaukės užrašas" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 +msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" +msgstr "tinkami telefono skaitmenys (0-9, „*“, „#“, „!“ ar „.“)" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:346 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:349 +msgid "valid port or port range (port1-port2)" +msgstr "tinkamas prievadas ar prievado rėžis (prievadas1–prievadas2)" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 +msgid "valid port value" +msgstr "tinkama prievado reikšmė" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 +msgid "valid time (HH:MM:SS)" +msgstr "tinkamas laikas (VV:MM:SS)" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 +msgid "value between %d and %d characters" +msgstr "reikšmė tarp %d ir %d simbolių" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 +msgid "value between %f and %f" +msgstr "reikšmė tarp %f ir %f" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +msgid "value greater or equal to %f" +msgstr "reikšmė, kuri didesnė arba lygi: %f" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 +msgid "value smaller or equal to %f" +msgstr "reikšmė, kuri mažesnė arba lygi: %f" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 +msgid "value with %d characters" +msgstr "reikšmė su %d simboliais" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 +msgid "value with at least %d characters" +msgstr "reikšmė, kurioje yra bent %d simbolių" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 +msgid "value with at most %d characters" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 +msgid "weak security" +msgstr "silpna apsauga" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:72 +msgctxt "nft unit" +msgid "week" +msgstr "savaitė" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +msgid "yes" +msgstr "Taip" + +#: modules/luci-compat/luasrc/view/cbi/delegator.htm:20 +msgid "« Back" +msgstr "🡐 Atgal" diff --git a/package/luci/modules/luci-base/po/mr/base.po b/package/luci/modules/luci-base/po/mr/base.po index b27a83605f..3b4f48ec4d 100644 --- a/package/luci/modules/luci-base/po/mr/base.po +++ b/package/luci/modules/luci-base/po/mr/base.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "PO-Revision-Date: 2020-10-15 00:31+0000\n" "Last-Translator: Prachi Joshi \n" -"Language-Team: Marathi \n" "Language: mr\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -10,23 +10,39 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.3-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "" @@ -51,10 +67,11 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "" @@ -64,19 +81,19 @@ msgid "-- Additional Field --" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "" @@ -102,7 +119,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" @@ -115,13 +132,18 @@ msgstr "" msgid "1 Minute Load:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "" msgstr[1] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "" @@ -136,12 +158,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "" @@ -154,43 +181,98 @@ msgstr "" msgid "5 Minute Load:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "" @@ -202,30 +284,42 @@ msgstr "" msgid "LED Name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -271,11 +365,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "" @@ -283,25 +385,90 @@ msgstr "" msgid "A new login is required since the authentication session expired." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -334,55 +501,58 @@ msgstr "" msgid "ARP retry threshold" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " "to dial into the provider network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "" @@ -391,7 +561,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -399,16 +569,25 @@ msgstr "" msgid "Access Concentrator" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "क्रिया" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "" @@ -446,8 +625,8 @@ msgstr "" msgid "Active-Backup policy (active-backup, 1)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -464,18 +643,18 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "" @@ -495,11 +674,11 @@ msgstr "" msgid "Add VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "" @@ -507,18 +686,18 @@ msgstr "" msgid "Add instance" msgstr "उदाहरण जोडा" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "" @@ -526,6 +705,10 @@ msgstr "" msgid "Add peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "" @@ -534,11 +717,11 @@ msgstr "" msgid "Add to Whitelist" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "" @@ -555,7 +738,11 @@ msgstr "" msgid "Address" msgstr "पत्ता" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -568,7 +755,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "" @@ -577,28 +764,28 @@ msgstr "" msgid "Administration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "प्रगत सेटिंग्ज" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 @@ -633,17 +820,17 @@ msgstr "" msgid "Alias of \"%s\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "" @@ -651,11 +838,11 @@ msgstr "" msgid "Allow SSH password authentication" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "" @@ -663,15 +850,15 @@ msgstr "" msgid "Allow full UCI access for legacy applications" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "" @@ -692,19 +879,24 @@ msgid "Allow system feature probing" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "" @@ -716,20 +908,24 @@ msgstr "" msgid "Always on (kernel: default-on)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "" @@ -738,98 +934,47 @@ msgstr "" msgid "An optional, short description for this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "" @@ -841,7 +986,7 @@ msgstr "" msgid "Anonymous Swap" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -853,11 +998,11 @@ msgstr "" msgid "Any zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -865,44 +1010,48 @@ msgstr "" msgid "Apply backup?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "" @@ -911,15 +1060,15 @@ msgstr "" msgid "Associations" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -929,25 +1078,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "" @@ -955,7 +1105,9 @@ msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -973,7 +1125,7 @@ msgstr "" msgid "Automatically check filesystem for errors before mounting" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -995,6 +1147,10 @@ msgstr "" msgid "Automount Swap" msgstr "" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "" @@ -1013,11 +1169,15 @@ msgstr "" msgid "Average:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1025,15 +1185,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "" @@ -1042,11 +1206,7 @@ msgstr "" msgid "Back to Overview" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1059,16 +1219,15 @@ msgid "Backup / Flash Firmware" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1076,12 +1235,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1092,7 +1274,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1101,18 +1283,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1124,65 +1319,77 @@ msgstr "" msgid "Bitrate" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "ब्रिज" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "" @@ -1190,14 +1397,36 @@ msgstr "" msgid "Buffered" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "" @@ -1212,18 +1441,23 @@ msgstr "" msgid "Call failed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "रद्द करा" @@ -1231,32 +1465,32 @@ msgstr "रद्द करा" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1265,45 +1499,53 @@ msgstr "" msgid "Category" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1315,16 +1557,16 @@ msgstr "" msgid "Chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "" @@ -1335,18 +1577,19 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "" @@ -1354,7 +1597,7 @@ msgstr "" msgid "Check filesystems before mount" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" @@ -1371,8 +1614,8 @@ msgstr "" msgid "Choose mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1380,13 +1623,13 @@ msgid "" "interface to it." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "" @@ -1406,9 +1649,10 @@ msgid "" "FEATURE IS FOR PROFESSIONALS! )" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "" @@ -1417,9 +1661,9 @@ msgstr "" msgid "Client ID to send when requesting DHCP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "" @@ -1434,20 +1678,20 @@ msgid "" "persist connection" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "डेटा संकलित करीत आहे ..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "कमांड" @@ -1464,7 +1708,7 @@ msgstr "कमांड अयशस्वी" msgid "Comment" msgstr "टिप्पणी" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1483,29 +1727,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "कॉन्फिगरेशन" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1515,28 +1758,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1548,9 +1791,10 @@ msgstr "" msgid "Confirmation" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "" @@ -1560,11 +1804,11 @@ msgstr "" msgid "Connection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1576,7 +1820,7 @@ msgstr "" msgid "Connections" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1604,9 +1848,9 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1617,16 +1861,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1637,20 +1881,20 @@ msgstr "" msgid "Country" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "" @@ -1662,7 +1906,7 @@ msgstr "" msgid "Cron Log Level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "" @@ -1701,31 +1945,31 @@ msgid "" "Diode\">LED
    s if possible." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "डीएचसीपी आणि डीएनएस" @@ -1736,16 +1980,22 @@ msgstr "डीएचसीपी आणि डीएनएस" msgid "DHCP client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "" @@ -1757,19 +2007,19 @@ msgstr "" msgid "DNS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" @@ -1777,7 +2027,7 @@ msgstr "" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1785,11 +2035,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1801,39 +2051,47 @@ msgstr "" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1841,68 +2099,69 @@ msgstr "" msgid "Default state" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "हटवा" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "वर्णन" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "" @@ -1910,11 +2169,11 @@ msgstr "" msgid "Design" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1949,9 +2208,9 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1961,36 +2220,40 @@ msgstr "" msgid "Device" msgstr "डिव्हाइस" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "" @@ -1998,31 +2261,31 @@ msgstr "" msgid "Device unreachable! Still waiting for device..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "अक्षम करा" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2037,20 +2300,24 @@ msgstr "" msgid "Disable Encryption" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2059,33 +2326,32 @@ msgstr "" msgid "Disabled" msgstr "अक्षम" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" @@ -2095,36 +2361,48 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "डिसमिस करा" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" @@ -2136,32 +2414,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2171,17 +2440,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "" @@ -2189,11 +2458,11 @@ msgstr "" msgid "Do you really want to erase all settings?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2201,15 +2470,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "" @@ -2235,11 +2506,11 @@ msgstr "" msgid "Download mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2253,16 +2524,54 @@ msgstr "" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "" @@ -2278,19 +2587,19 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2298,27 +2607,39 @@ msgstr "" msgid "Dynamic tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "" @@ -2326,17 +2647,21 @@ msgstr "" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "" @@ -2345,54 +2670,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "सक्षम करा" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2410,10 +2725,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2427,11 +2743,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2443,11 +2763,11 @@ msgstr "" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2455,7 +2775,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "" @@ -2466,12 +2786,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "" @@ -2487,24 +2807,24 @@ msgstr "" msgid "Enable mirroring of outgoing packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2526,11 +2846,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "" @@ -2539,27 +2859,36 @@ msgstr "" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "सक्षम केले" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "" @@ -2567,24 +2896,29 @@ msgstr "" msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2592,23 +2926,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2637,10 +2971,6 @@ msgstr "" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2659,37 +2989,51 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2698,11 +3042,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "" @@ -2714,7 +3058,7 @@ msgstr "" msgid "Expires" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2723,11 +3067,11 @@ msgstr "" msgid "External" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2755,58 +3099,86 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "" @@ -2815,12 +3187,20 @@ msgstr "" msgid "Filesystem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 -msgid "Filter private" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 @@ -2835,8 +3215,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2846,7 +3231,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "" @@ -2860,10 +3245,11 @@ msgid "Firewall" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "" @@ -2871,19 +3257,19 @@ msgstr "" msgid "Firewall Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2909,40 +3295,48 @@ msgstr "" msgid "Flashing…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "" @@ -2954,11 +3348,11 @@ msgstr "" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -2977,37 +3371,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "" @@ -3029,7 +3427,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "" @@ -3049,12 +3447,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "" @@ -3064,23 +3466,23 @@ msgstr "" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "सामान्य सेटिंग्ज" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "सामान्य सेटअप" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3088,7 +3490,7 @@ msgstr "" msgid "Generate Config" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3096,11 +3498,11 @@ msgstr "" msgid "Generate archive" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3108,15 +3510,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3128,39 +3530,40 @@ msgstr "" msgid "Global Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3172,6 +3575,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3208,7 +3615,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3216,6 +3623,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3248,7 +3659,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "" @@ -3277,15 +3688,11 @@ msgstr "" msgid "Hang Up" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3295,7 +3702,7 @@ msgid "" "the timezone." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" @@ -3304,17 +3711,25 @@ msgstr "" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3324,7 +3739,7 @@ msgstr "" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3332,10 +3747,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3345,11 +3766,11 @@ msgstr "होस्टनाव" msgid "Hostname to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3405,23 +3826,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3437,7 +3862,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3449,20 +3874,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "" @@ -3470,14 +3895,15 @@ msgstr "" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3493,7 +3919,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3503,7 +3929,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3530,7 +3956,7 @@ msgstr "" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "केवळ IPv4" @@ -3543,11 +3969,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3556,16 +3982,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3576,7 +4006,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "" @@ -3584,7 +4015,7 @@ msgstr "" msgid "IPv6 Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3592,7 +4023,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3600,15 +4035,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3622,12 +4057,12 @@ msgstr "" msgid "IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3639,11 +4074,11 @@ msgstr "" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "केवळ IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3652,7 +4087,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3666,23 +4101,19 @@ msgstr "" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3690,6 +4121,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3705,10 +4140,16 @@ msgstr "" msgid "IPv6-over-IPv4 (6to4)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3721,13 +4162,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3744,21 +4185,23 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3772,15 +4215,23 @@ msgid "" "datarates of the RAM." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "" @@ -3792,25 +4243,25 @@ msgstr "" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3822,13 +4273,27 @@ msgstr "" msgid "In" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3858,7 +4323,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3866,6 +4331,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3884,22 +4350,21 @@ msgstr "" msgid "Information" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3911,31 +4376,41 @@ msgstr "" msgid "Initscripts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -3945,6 +4420,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -3952,7 +4431,7 @@ msgstr "" msgid "Interface" msgstr "इंटरफेस" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -3960,7 +4439,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "" @@ -3991,11 +4470,11 @@ msgstr "" msgid "Interface is shutting down..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -4004,12 +4483,12 @@ msgid "Interface name" msgstr "इंटरफेस नाव" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "इंटरफेसेस" @@ -4018,22 +4497,26 @@ msgstr "इंटरफेसेस" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4043,8 +4526,9 @@ msgid "Invalid" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4054,6 +4538,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4076,7 +4564,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4090,15 +4578,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "" @@ -4109,25 +4618,25 @@ msgid "" "flash memory, please verify the image file!" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4135,24 +4644,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "" @@ -4160,6 +4673,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4167,14 +4681,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4219,7 +4738,7 @@ msgstr "" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "" @@ -4236,32 +4755,39 @@ msgstr "" msgid "Language and Style" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "" @@ -4285,38 +4811,34 @@ msgstr "" msgid "Leave empty to use the current WAN address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4337,16 +4859,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4355,7 +4879,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4368,23 +4892,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4392,7 +4913,7 @@ msgstr "" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4402,7 +4923,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "" @@ -4411,7 +4932,7 @@ msgstr "" msgid "Load" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "" @@ -4419,27 +4940,28 @@ msgstr "" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4459,11 +4981,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4479,44 +5002,70 @@ msgstr "" msgid "Local Startup" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "" @@ -4540,25 +5089,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4566,11 +5106,11 @@ msgstr "" msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "" @@ -4578,16 +5118,15 @@ msgstr "" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4596,11 +5135,15 @@ msgstr "" msgid "MAC address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "" @@ -4614,6 +5157,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4635,15 +5182,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4651,7 +5202,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4660,74 +5211,82 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4754,7 +5313,7 @@ msgstr "" msgid "Memory usage (%)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4762,10 +5321,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4778,7 +5345,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4789,11 +5356,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4801,13 +5368,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4821,77 +5388,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "मोड" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "मॉडेल" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "" @@ -4959,6 +5533,10 @@ msgstr "" msgid "Move up" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -4966,19 +5544,23 @@ msgstr "" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -4990,12 +5572,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5008,18 +5594,23 @@ msgid "NTP server candidates" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "नाव" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "" @@ -5028,13 +5619,17 @@ msgstr "" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5043,32 +5638,36 @@ msgstr "" msgid "Network" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5081,7 +5680,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5090,7 +5689,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5099,25 +5698,30 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5125,13 +5729,13 @@ msgstr "" msgid "Next »" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "नाही" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "" @@ -5139,7 +5743,7 @@ msgstr "" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5155,9 +5759,17 @@ msgstr "" msgid "No RX signal" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5168,7 +5780,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5177,8 +5793,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5191,15 +5807,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5213,7 +5825,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5234,30 +5846,39 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5271,7 +5892,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "" @@ -5283,37 +5905,40 @@ msgstr "" msgid "Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "एकही नाही" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "" @@ -5326,7 +5951,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5338,12 +5963,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5352,7 +5983,7 @@ msgstr "" msgid "Notice" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "" @@ -5360,7 +5991,7 @@ msgstr "" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5377,7 +6008,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5388,6 +6019,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "बंद" @@ -5396,6 +6028,12 @@ msgstr "बंद" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "" @@ -5404,15 +6042,15 @@ msgstr "" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5430,7 +6068,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5439,49 +6081,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5489,29 +6142,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5519,17 +6181,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5537,13 +6199,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5558,11 +6220,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5570,7 +6232,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5584,7 +6246,7 @@ msgstr "" msgid "Options" msgstr "पर्याय" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -5954,11 +6661,19 @@ msgstr "" msgid "Peak:" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -5967,11 +6682,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6002,10 +6717,14 @@ msgstr "" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6014,13 +6733,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "" @@ -6033,11 +6752,11 @@ msgstr "" msgid "Pkts." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6045,56 +6764,75 @@ msgstr "" msgid "Policy" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "पोर्ट" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "पोर्ट" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6117,13 +6855,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6136,29 +6875,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6176,8 +6917,8 @@ msgid "Prot." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6189,13 +6930,13 @@ msgstr "प्रोटोकॉल" msgid "Provide NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6205,25 +6946,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6248,59 +7000,83 @@ msgstr "" msgid "Quality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "" @@ -6313,10 +7089,16 @@ msgstr "" msgid "RX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6326,11 +7108,11 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "" @@ -6338,11 +7120,11 @@ msgstr "" msgid "Realtime Graphs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6366,11 +7148,39 @@ msgstr "" msgid "Receive" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "" @@ -6378,12 +7188,12 @@ msgstr "" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6392,37 +7202,47 @@ msgstr "" msgid "References" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "" @@ -6432,6 +7252,10 @@ msgstr "" msgid "Relay Bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "" @@ -6441,6 +7265,14 @@ msgstr "" msgid "Relay bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6450,6 +7282,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6462,15 +7295,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "" @@ -6500,7 +7341,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6516,7 +7358,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6528,67 +7370,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6597,7 +7445,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6612,20 +7460,24 @@ msgstr "" msgid "Reset to defaults" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "" @@ -6634,7 +7486,7 @@ msgstr "" msgid "Restart Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6646,86 +7498,97 @@ msgstr "" msgid "Restore backup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6740,19 +7603,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6770,6 +7633,10 @@ msgstr "" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6782,24 +7649,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6819,11 +7686,24 @@ msgstr "" msgid "SHA256" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6841,15 +7721,15 @@ msgstr "" msgid "SSH username" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6866,7 +7746,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6877,7 +7757,7 @@ msgid "Save" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "" @@ -6894,7 +7774,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "" @@ -6903,11 +7783,16 @@ msgstr "" msgid "Scheduled Tasks" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "" @@ -6922,9 +7807,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -6932,13 +7817,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -6957,11 +7842,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -6986,16 +7875,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7005,14 +7898,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7026,32 +7919,41 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 msgid "Setting PLMN failed" msgstr "" -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 -msgid "Setting operation mode failed" +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 +msgid "Setting operation mode failed" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7059,12 +7961,11 @@ msgstr "" msgid "Short GI" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "" @@ -7077,16 +7978,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7094,15 +7995,15 @@ msgstr "" msgid "Signal" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7110,12 +8011,12 @@ msgstr "" msgid "Signal:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7132,12 +8033,12 @@ msgstr "" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "" @@ -7155,14 +8056,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7170,8 +8067,8 @@ msgid "" "instructions." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7198,26 +8095,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7242,7 +8139,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7250,7 +8147,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7258,20 +8155,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7299,7 +8196,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7316,7 +8213,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7347,15 +8244,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7377,19 +8274,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7409,7 +8306,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7504,15 +8401,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "प्रारंभ करा" @@ -7525,16 +8430,16 @@ msgstr "" msgid "Start priority" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7543,6 +8448,10 @@ msgstr "" msgid "Startup" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "" @@ -7556,7 +8465,7 @@ msgstr "" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "" @@ -7566,25 +8475,25 @@ msgstr "" msgid "Static address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "स्थिती" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "थांबा" @@ -7593,8 +8502,8 @@ msgstr "थांबा" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7602,11 +8511,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "" @@ -7615,15 +8524,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7654,7 +8563,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "" @@ -7664,7 +8573,7 @@ msgstr "" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7676,8 +8585,16 @@ msgstr "" msgid "Sync with browser" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7701,9 +8618,9 @@ msgstr "" msgid "System log buffer size" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7732,7 +8649,7 @@ msgstr "" msgid "TCP:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "" @@ -7745,26 +8662,37 @@ msgstr "" msgid "TX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "लक्ष्य" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7780,26 +8708,26 @@ msgstr "" msgid "Terminate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7815,7 +8743,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7827,18 +8759,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7846,6 +8784,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7860,6 +8799,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7870,7 +8815,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7887,21 +8832,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -7911,13 +8860,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -7935,18 +8884,18 @@ msgid "" "
    /dev/sda1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -7963,7 +8912,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -7971,31 +8920,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8018,6 +8983,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8032,7 +8998,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8041,7 +9007,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8049,19 +9015,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8075,14 +9041,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8095,31 +9061,31 @@ msgstr "" msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8151,6 +9117,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8172,30 +9146,37 @@ msgid "" "you choose the generic image format for your platform." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8206,16 +9187,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8228,6 +9209,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8240,7 +9232,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" @@ -8268,8 +9260,8 @@ msgid "" "their status." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8284,31 +9276,39 @@ msgstr "" msgid "Time Synchronization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8316,17 +9316,13 @@ msgstr "" msgid "Timezone" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8334,7 +9330,7 @@ msgid "" "reset\" (only possible with squashfs images)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8342,12 +9338,16 @@ msgstr "" msgid "Total Available" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8359,11 +9359,11 @@ msgstr "" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8380,6 +9380,26 @@ msgstr "" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8418,7 +9438,7 @@ msgstr "" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8427,13 +9447,13 @@ msgid "Tx-Power" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "प्रकार" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8482,7 +9502,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8533,19 +9553,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8559,7 +9591,7 @@ msgstr "" msgid "Unknown" msgstr "अज्ञात" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8583,11 +9615,11 @@ msgstr "" msgid "Unmount" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "" @@ -8601,15 +9633,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8621,7 +9663,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "" @@ -8636,56 +9678,64 @@ msgstr "" msgid "Upload archive..." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8694,13 +9744,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8746,22 +9801,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "" @@ -8785,15 +9843,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8816,69 +9874,71 @@ msgstr "" msgid "Used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "वापरकर्तानाव" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -8898,24 +9958,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -8924,6 +9987,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -8937,14 +10004,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -8970,7 +10037,7 @@ msgstr "" msgid "Vendor Class to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -8978,12 +10045,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -8991,34 +10058,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9045,48 +10124,99 @@ msgstr "चेतावणी: जतन न केलेले बदल आह msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9102,21 +10232,21 @@ msgid "Wireless Adapter" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9132,15 +10262,15 @@ msgstr "" msgid "Wireless is not associated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "" @@ -9152,7 +10282,7 @@ msgstr "" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9175,8 +10305,20 @@ msgid "" "scripts like \"network\", your device might become inaccessible!
    " msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9205,34 +10347,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "" @@ -9289,25 +10451,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9316,14 +10483,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9333,22 +10509,22 @@ msgstr "" msgid "forward" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "" @@ -9357,9 +10533,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9367,6 +10543,10 @@ msgstr "" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9381,11 +10561,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9394,11 +10582,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9410,18 +10598,26 @@ msgstr "" msgid "no" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "" @@ -9432,20 +10628,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9454,6 +10650,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9471,23 +10671,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9495,7 +10704,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9503,7 +10712,7 @@ msgstr "" msgid "tagged" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9514,25 +10723,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9554,8 +10765,8 @@ msgid "untagged" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9568,7 +10779,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9597,7 +10808,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9634,8 +10845,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9675,11 +10886,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9689,43 +10910,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" diff --git a/package/luci/modules/luci-base/po/ms/base.po b/package/luci/modules/luci-base/po/ms/base.po index 7107250fcc..31fd241625 100644 --- a/package/luci/modules/luci-base/po/ms/base.po +++ b/package/luci/modules/luci-base/po/ms/base.po @@ -5,7 +5,7 @@ msgstr "" "POT-Creation-Date: 2010-05-07 17:57+1000\n" "PO-Revision-Date: 2020-01-14 15:21+0000\n" "Last-Translator: Franco Castillo \n" -"Language-Team: Malay \n" +"Language-Team: Malay \n" "Language: ms\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -13,23 +13,39 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 3.11-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "" @@ -54,10 +70,11 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(tiada interface dipasang)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "" @@ -67,19 +84,19 @@ msgid "-- Additional Field --" msgstr "-- Gelanggang Tambahan --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Sila pilih --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- memperibadi --" @@ -105,7 +122,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" @@ -118,12 +135,17 @@ msgstr "" msgid "1 Minute Load:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "" @@ -138,12 +160,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "" @@ -156,44 +183,99 @@ msgstr "" msgid "5 Minute Load:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-Netmask" @@ -205,30 +287,42 @@ msgstr "Konfigurasi lampu LED" msgid "LED Name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -274,11 +368,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "" @@ -286,25 +388,90 @@ msgstr "" msgid "A new login is required since the authentication session expired." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -337,55 +504,58 @@ msgstr "" msgid "ARP retry threshold" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " "to dial into the provider network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "" @@ -394,7 +564,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -402,16 +572,25 @@ msgstr "" msgid "Access Concentrator" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Pusat akses" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Aksi" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "" @@ -449,8 +628,8 @@ msgstr "" msgid "Active-Backup policy (active-backup, 1)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -467,18 +646,18 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Tambah" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "" @@ -498,11 +677,11 @@ msgstr "" msgid "Add VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "" @@ -510,18 +689,18 @@ msgstr "" msgid "Add instance" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "" @@ -529,6 +708,10 @@ msgstr "" msgid "Add peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "" @@ -537,11 +720,11 @@ msgstr "" msgid "Add to Whitelist" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "" @@ -558,7 +741,11 @@ msgstr "" msgid "Address" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -571,7 +758,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "" @@ -580,28 +767,28 @@ msgstr "" msgid "Administration" msgstr "Pentadbiran" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Tetapan Lanjutan" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 @@ -636,17 +823,17 @@ msgstr "" msgid "Alias of \"%s\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "" @@ -654,11 +841,11 @@ msgstr "" msgid "Allow SSH password authentication" msgstr "Membenarkan pengesahan kata laluan SSH" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Izinkan semua kecualian yang disenaraikan" @@ -666,15 +853,15 @@ msgstr "Izinkan semua kecualian yang disenaraikan" msgid "Allow full UCI access for legacy applications" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Izinkan senarai saja" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "" @@ -695,19 +882,24 @@ msgid "Allow system feature probing" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "" @@ -719,20 +911,24 @@ msgstr "" msgid "Always on (kernel: default-on)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "" @@ -741,98 +937,47 @@ msgstr "" msgid "An optional, short description for this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "" @@ -844,7 +989,7 @@ msgstr "" msgid "Anonymous Swap" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -856,11 +1001,11 @@ msgstr "" msgid "Any zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -868,44 +1013,48 @@ msgstr "" msgid "Apply backup?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Associated Stesen" @@ -914,15 +1063,15 @@ msgstr "Associated Stesen" msgid "Associations" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -932,25 +1081,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Authentifizierung" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Pengesahan" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Otorisasi Diperlukan" @@ -958,7 +1108,9 @@ msgstr "Otorisasi Diperlukan" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -976,7 +1128,7 @@ msgstr "" msgid "Automatically check filesystem for errors before mounting" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -998,6 +1150,10 @@ msgstr "" msgid "Automount Swap" msgstr "" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Boleh didapati" @@ -1016,11 +1172,15 @@ msgstr "Boleh didapati" msgid "Average:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1028,15 +1188,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "" @@ -1045,11 +1209,7 @@ msgstr "" msgid "Back to Overview" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1062,16 +1222,15 @@ msgid "Backup / Flash Firmware" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1079,12 +1238,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1095,7 +1277,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1104,18 +1286,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1127,65 +1322,77 @@ msgstr "" msgid "Bitrate" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "" @@ -1193,14 +1400,36 @@ msgstr "" msgid "Buffered" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Penggunaan CPU (%)" @@ -1215,18 +1444,23 @@ msgstr "" msgid "Call failed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Batal" @@ -1234,32 +1468,32 @@ msgstr "Batal" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1268,45 +1502,53 @@ msgstr "" msgid "Category" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1318,16 +1560,16 @@ msgstr "" msgid "Chain" msgstr "Rantai" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Laman" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "" @@ -1338,18 +1580,19 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Saluran" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "" @@ -1357,7 +1600,7 @@ msgstr "" msgid "Check filesystems before mount" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" @@ -1374,8 +1617,8 @@ msgstr "" msgid "Choose mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1383,13 +1626,13 @@ msgid "" "interface to it." msgstr "Pilih zon firewall yang anda ingin tetapkan untuk antar muka ini." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "" @@ -1409,9 +1652,10 @@ msgid "" "FEATURE IS FOR PROFESSIONALS! )" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Pelanggan" @@ -1420,9 +1664,9 @@ msgstr "Pelanggan" msgid "Client ID to send when requesting DHCP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "" @@ -1437,20 +1681,20 @@ msgid "" "persist connection" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Mengumpul data..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Perintah" @@ -1467,7 +1711,7 @@ msgstr "" msgid "Comment" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1486,29 +1730,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Konfigurasi" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1518,28 +1761,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1551,9 +1794,10 @@ msgstr "" msgid "Confirmation" msgstr "Pengesahan" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "" @@ -1563,11 +1807,11 @@ msgstr "" msgid "Connection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1579,7 +1823,7 @@ msgstr "" msgid "Connections" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1607,9 +1851,9 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1620,16 +1864,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1640,20 +1884,20 @@ msgstr "" msgid "Country" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Kod negara" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Buat / Menetapkan dinding api-zon" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "" @@ -1665,7 +1909,7 @@ msgstr "" msgid "Cron Log Level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "" @@ -1704,31 +1948,31 @@ msgid "" "Diode\">LED
    s if possible." msgstr "Mengkustomisasi perilaku peranti LED jika mungkin." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "" @@ -1739,16 +1983,22 @@ msgstr "" msgid "DHCP client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP-Pilihan" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "" @@ -1760,19 +2010,19 @@ msgstr "" msgid "DNS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" @@ -1780,7 +2030,7 @@ msgstr "" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1788,11 +2038,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1804,39 +2054,49 @@ msgstr "" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +#, fuzzy +msgid "Data Received" +msgstr "Menerima" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +#, fuzzy +msgid "Data Transmitted" +msgstr "Pancar" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1844,68 +2104,69 @@ msgstr "" msgid "Default state" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Padam" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Keterangan" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "" @@ -1913,11 +2174,11 @@ msgstr "" msgid "Design" msgstr "Disain" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1952,9 +2213,9 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1964,36 +2225,40 @@ msgstr "" msgid "Device" msgstr "Alat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "" @@ -2001,31 +2266,31 @@ msgstr "" msgid "Device unreachable! Still waiting for device..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2040,20 +2305,24 @@ msgstr "" msgid "Disable Encryption" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2062,33 +2331,32 @@ msgstr "" msgid "Disabled" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" @@ -2098,30 +2366,42 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Jarak Optimasi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Jarak ke rangkaian terjauh ahli dalam meter." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" # Nur für NAT-Firewalls? -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS-Forwarder untuk NAT " "firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" @@ -2144,32 +2424,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "Jangan hantar permintaan DNS tanpa nama DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2179,17 +2450,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "" @@ -2197,11 +2468,11 @@ msgstr "" msgid "Do you really want to erase all settings?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2209,15 +2480,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Domain diperlukan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "" @@ -2243,11 +2516,11 @@ msgstr "" msgid "Download mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2261,16 +2534,54 @@ msgstr "" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "" @@ -2287,19 +2598,19 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "Dinamik DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2307,27 +2618,39 @@ msgstr "" msgid "Dynamic tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAP-Kaedah" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Sunting" @@ -2335,17 +2658,21 @@ msgstr "Sunting" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "" @@ -2354,54 +2681,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Mengaktifkan STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2419,10 +2736,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2436,11 +2754,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2452,11 +2774,11 @@ msgstr "" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2464,7 +2786,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "" @@ -2475,12 +2797,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "" @@ -2496,24 +2818,24 @@ msgstr "" msgid "Enable mirroring of outgoing packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2535,11 +2857,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "" @@ -2548,27 +2870,36 @@ msgstr "" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Aktifkan spanning Tree Protokol di jambatan ini" @@ -2576,24 +2907,29 @@ msgstr "Aktifkan spanning Tree Protokol di jambatan ini" msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Enkripsi" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2601,23 +2937,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2646,10 +2982,6 @@ msgstr "Kesalahan" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2668,37 +3000,51 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2707,11 +3053,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "" @@ -2723,7 +3069,7 @@ msgstr "" msgid "Expires" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2732,11 +3078,11 @@ msgstr "" msgid "External" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2764,58 +3110,86 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "fail dimana DHCP-sewa akan disimpan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "Fail DNS tempatan" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "" @@ -2824,14 +3198,22 @@ msgstr "" msgid "Filesystem" msgstr "Fail Sistem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Penapis swasta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Penapis tak berguna" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "" @@ -2844,8 +3226,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2855,7 +3242,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "" @@ -2869,10 +3256,11 @@ msgid "Firewall" msgstr "Firewall" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Tetapan Firewall" @@ -2880,19 +3268,19 @@ msgstr "Tetapan Firewall" msgid "Firewall Status" msgstr "Status Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2918,40 +3306,48 @@ msgstr "" msgid "Flashing…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Paksa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "" @@ -2963,11 +3359,11 @@ msgstr "" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -2986,37 +3382,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Fragmentasi Ambang" @@ -3038,7 +3438,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "" @@ -3058,12 +3458,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "" @@ -3073,23 +3477,23 @@ msgstr "" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Setup Umum" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3097,7 +3501,7 @@ msgstr "" msgid "Generate Config" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3105,11 +3509,11 @@ msgstr "" msgid "Generate archive" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3117,15 +3521,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3137,39 +3541,40 @@ msgstr "" msgid "Global Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Menuju ke halaman konfigurasi yang relevan" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3181,6 +3586,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3217,7 +3626,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3225,6 +3634,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3257,7 +3670,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "" @@ -3286,15 +3699,11 @@ msgstr "" msgid "Hang Up" msgstr "Menutup" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3306,7 +3715,7 @@ msgstr "" "Di sini anda boleh mengkonfigurasi aspek asas peranti anda seperti nama host " "atau zon." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Menyembunyikan ESSID" @@ -3315,17 +3724,25 @@ msgstr "Menyembunyikan ESSID" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3335,7 +3752,7 @@ msgstr "" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3343,10 +3760,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3356,11 +3779,11 @@ msgstr "Nama Host" msgid "Hostname to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Nama Host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3416,23 +3839,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3448,7 +3875,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3460,20 +3887,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "" @@ -3481,14 +3908,15 @@ msgstr "" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3504,7 +3932,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3514,7 +3942,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3541,7 +3969,7 @@ msgstr "" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "" @@ -3554,11 +3982,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3567,16 +3995,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3587,7 +4019,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "Konfigurasi IPv6" @@ -3595,7 +4028,7 @@ msgstr "Konfigurasi IPv6" msgid "IPv6 Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3603,7 +4036,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3611,15 +4048,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3633,12 +4070,12 @@ msgstr "" msgid "IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3650,11 +4087,11 @@ msgstr "" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3663,7 +4100,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3677,23 +4114,19 @@ msgstr "" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3701,6 +4134,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3716,10 +4153,16 @@ msgstr "" msgid "IPv6-over-IPv4 (6to4)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identiti" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3732,13 +4175,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3755,21 +4198,23 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3788,15 +4233,23 @@ msgstr "" "sangat lambat kerana peranti-penukar tidak boleh diakses dengan datarates " "yang tinggi pada RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Mengabaikan /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Abaikan antara muka" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Abaikan fail yang selesai" @@ -3808,25 +4261,25 @@ msgstr "" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3838,13 +4291,27 @@ msgstr "" msgid "In" msgstr "Masuk" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3874,7 +4341,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3882,6 +4349,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3900,22 +4368,21 @@ msgstr "" msgid "Information" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3927,31 +4394,41 @@ msgstr "" msgid "Initscripts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -3961,6 +4438,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -3968,7 +4449,7 @@ msgstr "" msgid "Interface" msgstr "Interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -3976,7 +4457,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "" @@ -4007,11 +4488,11 @@ msgstr "" msgid "Interface is shutting down..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -4020,12 +4501,12 @@ msgid "Interface name" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Interface" @@ -4034,22 +4515,26 @@ msgstr "Interface" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4059,8 +4544,9 @@ msgid "Invalid" msgstr "Tak Sah" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4070,6 +4556,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4092,7 +4582,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4106,15 +4596,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Username dan / atau password tak sah! Sila cuba lagi." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "" @@ -4128,26 +4639,26 @@ msgstr "" "Tampak bahawa anda cuba untuk flash fail gambar yang tidak sesuai dengan " "memori flash, sila buat pengesahan pada fail gambar!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 #, fuzzy msgid "Join Network" msgstr "Gabung Rangkaian" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4155,24 +4666,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Log Kernel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Kunci" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "" @@ -4180,6 +4695,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4187,14 +4703,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4239,7 +4760,7 @@ msgstr "" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "" @@ -4256,32 +4777,39 @@ msgstr "Bahasa" msgid "Language and Style" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Sewa fail" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "" @@ -4305,38 +4833,34 @@ msgstr "" msgid "Leave empty to use the current WAN address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Batas" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4357,16 +4881,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4375,7 +4901,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4388,23 +4914,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4412,7 +4935,7 @@ msgstr "" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4422,7 +4945,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "" @@ -4431,7 +4954,7 @@ msgstr "" msgid "Load" msgstr "Load" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "" @@ -4439,27 +4962,28 @@ msgstr "" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4479,11 +5003,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4499,44 +5024,70 @@ msgstr "" msgid "Local Startup" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Masa Tempatan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Soalan tempatan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Login" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Logout" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Log soalan" @@ -4560,25 +5111,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Login" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Logout" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4586,11 +5128,11 @@ msgstr "" msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Penapis alamat MAC" @@ -4598,16 +5140,15 @@ msgstr "Penapis alamat MAC" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4616,11 +5157,15 @@ msgstr "" msgid "MAC address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Penapis MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Senarai MAC" @@ -4634,6 +5179,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4655,15 +5204,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4671,7 +5224,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4680,74 +5233,82 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4774,7 +5335,7 @@ msgstr "Memori" msgid "Memory usage (%)" msgstr "Penggunaan Memori (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4782,10 +5343,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4798,7 +5367,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4809,11 +5378,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4821,13 +5390,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4841,77 +5410,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Mode" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Alat modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" @@ -4981,6 +5557,10 @@ msgstr "" msgid "Move up" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -4988,19 +5568,23 @@ msgstr "" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5012,12 +5596,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5030,18 +5618,23 @@ msgid "NTP server candidates" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Nama" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Nama rangkaian baru" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigation" @@ -5050,13 +5643,17 @@ msgstr "Navigation" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5065,32 +5662,36 @@ msgstr "" msgid "Network" msgstr "Rangkaian" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5103,7 +5704,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5112,7 +5713,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5121,25 +5722,31 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Kembali" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5147,13 +5754,13 @@ msgstr "" msgid "Next »" msgstr "Kemudian »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "" @@ -5161,7 +5768,7 @@ msgstr "" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5177,9 +5784,17 @@ msgstr "" msgid "No RX signal" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5190,7 +5805,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5199,8 +5818,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5213,15 +5832,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5235,7 +5850,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5256,30 +5871,39 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5293,7 +5917,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "" @@ -5305,37 +5930,40 @@ msgstr "" msgid "Noise" msgstr "Kebisingan" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "" @@ -5348,7 +5976,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5360,12 +5988,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5374,7 +6008,7 @@ msgstr "" msgid "Notice" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "" @@ -5382,7 +6016,7 @@ msgstr "" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5399,7 +6033,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5410,6 +6044,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "" @@ -5418,6 +6053,12 @@ msgstr "" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "" @@ -5426,15 +6067,15 @@ msgstr "" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5452,7 +6093,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5461,49 +6106,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5511,29 +6167,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5541,17 +6206,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5559,13 +6224,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5580,11 +6245,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5592,7 +6257,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5606,7 +6271,7 @@ msgstr "" msgid "Options" msgstr "Pilihan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Path ke CA-Sijil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Path ke Kunci Swasta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -5976,11 +6685,19 @@ msgstr "" msgid "Peak:" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -5989,11 +6706,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6024,10 +6741,14 @@ msgstr "" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6036,13 +6757,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Tetapan Fizikal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "" @@ -6055,11 +6776,11 @@ msgstr "" msgid "Pkts." msgstr "Pkts." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Sila masukkan username dan kata laluan anda." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6067,56 +6788,75 @@ msgstr "" msgid "Policy" msgstr "Dasar" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6139,13 +6879,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Mencegah komunikasi sesama Pelanggan" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6158,29 +6899,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6198,8 +6941,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6211,13 +6954,13 @@ msgstr "Protokol" msgid "Provide NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6227,25 +6970,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6270,59 +7024,83 @@ msgstr "" msgid "Quality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "RTS/CTS-Ambang" @@ -6336,10 +7114,16 @@ msgstr "RX" msgid "RX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6349,11 +7133,11 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Baca /etc/ethers untuk mengkonfigurasikan DHCP-Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "" @@ -6361,11 +7145,11 @@ msgstr "" msgid "Realtime Graphs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6389,11 +7173,40 @@ msgstr "Reboot sistem operasi peranti anda" msgid "Receive" msgstr "Menerima" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Menerima" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "" @@ -6401,12 +7214,12 @@ msgstr "" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6415,37 +7228,47 @@ msgstr "" msgid "References" msgstr "Rujukan" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "" @@ -6455,6 +7278,10 @@ msgstr "" msgid "Relay Bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "" @@ -6464,6 +7291,14 @@ msgstr "" msgid "Relay bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6473,6 +7308,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6485,15 +7321,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Menghapuskan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "" @@ -6523,7 +7367,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6539,7 +7384,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6551,67 +7396,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6620,7 +7471,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6635,20 +7486,24 @@ msgstr "Reset Loket" msgid "Reset to defaults" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "" @@ -6657,7 +7512,7 @@ msgstr "" msgid "Restart Firewall" msgstr "Restart Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6669,86 +7524,97 @@ msgstr "Mengembalikan" msgid "Restore backup" msgstr "Kembalikan sandaran" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Kembali" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6763,19 +7629,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6793,6 +7659,10 @@ msgstr "" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6807,24 +7677,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6844,11 +7714,24 @@ msgstr "" msgid "SHA256" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6866,15 +7749,15 @@ msgstr "" msgid "SSH username" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6891,7 +7774,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6902,7 +7785,7 @@ msgid "Save" msgstr "Simpan" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Simpan & Melaksanakan" @@ -6919,7 +7802,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Scan" @@ -6928,11 +7811,16 @@ msgstr "Scan" msgid "Scheduled Tasks" msgstr "Tugas Jadual" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "" @@ -6947,9 +7835,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -6957,13 +7845,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -6982,11 +7870,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7011,16 +7903,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7030,14 +7926,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7051,11 +7947,15 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7063,20 +7963,25 @@ msgid "Setting PLMN failed" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 -msgid "Settings" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 +msgid "Settings" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7084,12 +7989,11 @@ msgstr "" msgid "Short GI" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "" @@ -7102,16 +8006,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7119,15 +8023,15 @@ msgstr "" msgid "Signal" msgstr "Isyarat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7135,12 +8039,12 @@ msgstr "" msgid "Signal:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Saiz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7157,12 +8061,12 @@ msgstr "Skip" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Skip ke kadar" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Skip ke navigation" @@ -7180,14 +8084,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7195,8 +8095,8 @@ msgid "" "instructions." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7223,26 +8123,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7267,7 +8167,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7275,7 +8175,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7283,20 +8183,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7324,7 +8224,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7341,7 +8241,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7372,15 +8272,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7402,19 +8302,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7434,7 +8334,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7529,15 +8429,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Mula" @@ -7550,16 +8458,16 @@ msgstr "" msgid "Start priority" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7568,6 +8476,10 @@ msgstr "" msgid "Startup" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Laluan IPv4 Statik" @@ -7581,7 +8493,7 @@ msgstr "Laluan IPv6 Statik" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Statische Einträge" @@ -7591,25 +8503,25 @@ msgstr "Statische Einträge" msgid "Static address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "" @@ -7618,8 +8530,8 @@ msgstr "" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7627,11 +8539,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Order Ketat" @@ -7640,15 +8552,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Menyerahkan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7679,7 +8591,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "" @@ -7689,7 +8601,7 @@ msgstr "" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7701,8 +8613,16 @@ msgstr "" msgid "Sync with browser" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7726,9 +8646,9 @@ msgstr "" msgid "System log buffer size" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7757,7 +8677,7 @@ msgstr "" msgid "TCP:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "" @@ -7771,26 +8691,37 @@ msgstr "TX" msgid "TX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Meja" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Sasaran" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7806,26 +8737,26 @@ msgstr "" msgid "Terminate" msgstr "Menamatkan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7841,7 +8772,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7853,18 +8788,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7872,6 +8813,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7886,6 +8828,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7896,7 +8844,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7913,21 +8861,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -7939,13 +8891,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -7963,18 +8915,18 @@ msgid "" " /dev/sda1)" msgstr "Fail peranti memori atau partisyen, (contohnya: /dev/sda)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -7991,7 +8943,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Peraturan berikut sedang aktif pada sistem ini." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -7999,31 +8951,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8046,6 +9014,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8060,7 +9029,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8069,7 +9038,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8077,19 +9046,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8103,14 +9072,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8123,31 +9092,31 @@ msgstr "" msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8184,6 +9153,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8207,30 +9184,37 @@ msgstr "" "Format Fail gambar yang diupload tidak disokongkan. Pastikan anda memilih " "fail format gambar yang generik untuk platform anda." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8241,16 +9225,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8263,6 +9247,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8275,7 +9270,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "Ini adalah DHCP hanya dalam rangkaian tempatan." @@ -8307,8 +9302,8 @@ msgstr "" "Senarai ini memberikan gambaran lebih pada proses sistem yang sedang " "berjalan dan statusnya." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8323,31 +9318,39 @@ msgstr "Bahagian ini belum mengandungi nilai-nilai lagi" msgid "Time Synchronization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8355,17 +9358,13 @@ msgstr "" msgid "Timezone" msgstr "Zon masa" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8373,7 +9372,7 @@ msgid "" "reset\" (only possible with squashfs images)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8381,12 +9380,16 @@ msgstr "" msgid "Total Available" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8398,11 +9401,11 @@ msgstr "Lalu lintas" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8419,6 +9422,27 @@ msgstr "Pancar" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Antena Pemancar" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8457,7 +9481,7 @@ msgstr "" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8466,13 +9490,13 @@ msgid "Tx-Power" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Jenis" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8521,7 +9545,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8572,19 +9596,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8598,7 +9634,7 @@ msgstr "" msgid "Unknown" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8622,11 +9658,11 @@ msgstr "" msgid "Unmount" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Perubahan yang belum disimpan" @@ -8640,15 +9676,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8660,7 +9706,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "" @@ -8675,56 +9721,64 @@ msgstr "" msgid "Upload archive..." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Masa Aktif" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Guna /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8733,13 +9787,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8785,22 +9844,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "" @@ -8824,15 +9886,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8855,69 +9917,71 @@ msgstr "" msgid "Used" msgstr "Diguna" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Username" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -8937,24 +10001,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -8963,6 +10030,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -8976,14 +10047,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9009,7 +10080,7 @@ msgstr "" msgid "Vendor Class to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9017,12 +10088,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9030,34 +10101,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "WMM Mod" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9086,48 +10169,100 @@ msgstr "" msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +#, fuzzy +msgid "WireGuard Status" +msgstr "Status Firewall" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9143,21 +10278,21 @@ msgid "Wireless Adapter" msgstr "Adapter Wayarles" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Rangkaian Wayarles" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Gambaran keseluruhan Wayarles" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Keselamatan WLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9173,15 +10308,15 @@ msgstr "" msgid "Wireless is not associated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "" @@ -9193,7 +10328,7 @@ msgstr "" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9216,8 +10351,20 @@ msgid "" "scripts like \"network\", your device might become inaccessible!
    " msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9246,34 +10393,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automatik" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "" @@ -9330,25 +10497,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "mematikan" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9357,14 +10529,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9374,22 +10555,22 @@ msgstr "" msgid "forward" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "" @@ -9398,9 +10579,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9408,6 +10589,10 @@ msgstr "" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9422,11 +10607,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9435,11 +10628,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9451,18 +10644,26 @@ msgstr "" msgid "no" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "tidak ada" @@ -9473,20 +10674,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9495,6 +10696,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9512,23 +10717,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9536,7 +10750,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9544,7 +10758,7 @@ msgstr "" msgid "tagged" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9555,25 +10769,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9595,8 +10811,8 @@ msgid "untagged" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9609,7 +10825,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9638,7 +10854,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9675,8 +10891,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9716,11 +10932,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9730,43 +10956,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" diff --git a/package/luci/modules/luci-base/po/nb_NO/base.po b/package/luci/modules/luci-base/po/nb_NO/base.po index 413f83d106..21c85b1d27 100644 --- a/package/luci/modules/luci-base/po/nb_NO/base.po +++ b/package/luci/modules/luci-base/po/nb_NO/base.po @@ -1,32 +1,48 @@ msgid "" msgstr "" -"PO-Revision-Date: 2022-11-08 00:12+0000\n" +"PO-Revision-Date: 2023-10-10 20:50+0000\n" "Last-Translator: Allan Nordhøy \n" -"Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2\n" +"X-Generator: Weblate 5.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d ugyldig(e) felt(er)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "" @@ -51,10 +67,11 @@ msgstr "(tom)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(ingen grensesnitt tilknyttet)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d til" @@ -64,19 +81,19 @@ msgid "-- Additional Field --" msgstr "-- Tilleggsfelt --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Vennligst velg --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- egendefinert --" @@ -102,7 +119,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" @@ -115,13 +132,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "1 minutts belastning:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "" msgstr[1] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "15 minutters belastning:" @@ -136,12 +158,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "" @@ -154,43 +181,98 @@ msgstr "" msgid "5 Minute Load:" msgstr "5 minutters belastning:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "Maksimalt tidsavbrudd for 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "Tidsavbrudd for nytt forsøk for 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-Nettmaske" @@ -202,30 +284,42 @@ msgstr "LED Konfigurasjon" msgid "LED Name" msgstr "LED Navn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-mellomtjener" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA-flagg" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA-hoppgrense" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA-levetid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA-MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-tjeneste" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -271,11 +365,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Et oppsett for enheten «%s» finnes allerede" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "En mappe med samme navn finnes allerede." @@ -283,25 +385,90 @@ msgstr "En mappe med samme navn finnes allerede." msgid "A new login is required since the authentication session expired." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -334,33 +501,40 @@ msgstr "" msgid "ARP retry threshold" msgstr "APR terskel for nytt forsøk" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "ARP-trafikktabell «%h»" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM Broer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "" "ATM Virtuell kanal " "identifikator (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "" "ATM Virtuell plasserings " "identifikator (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -370,26 +544,22 @@ msgstr "" "nettverk grensesnitt, dette kan brukes sammen med DHCP eller PPP for å koble " "seg mot en leverandørs nettverk." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM enhetsnummer" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "" @@ -398,7 +568,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -406,16 +576,25 @@ msgstr "" msgid "Access Concentrator" msgstr "Tilgangskonsentrator" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Aksesspunkt" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Handlinger" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 #, fuzzy msgid "Active" msgstr "Aktiv" @@ -454,8 +633,8 @@ msgstr "Aktive IPv6-regler" msgid "Active-Backup policy (active-backup, 1)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc (Uavhengig)" @@ -472,18 +651,18 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Legg til" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "" @@ -503,11 +682,11 @@ msgstr "Legg til LED-handling" msgid "Add VLAN" msgstr "Legg til VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Legg til enhetsoppsett …" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Legg til enhetsoppsett …" @@ -515,18 +694,18 @@ msgstr "Legg til enhetsoppsett …" msgid "Add instance" msgstr "Legg til instans" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Legg til nøkkel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "Legg det lokale domenesuffikset til navn utgitt fra vertsfiler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Legg til grensesnitt..." @@ -534,6 +713,10 @@ msgstr "Legg til grensesnitt..." msgid "Add peer" msgstr "Legg itl likemann" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Legg til i svarteliste" @@ -542,11 +725,11 @@ msgstr "Legg til i svarteliste" msgid "Add to Whitelist" msgstr "Legg til i hvitliste" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Tilleggs vertsfiler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "" @@ -563,7 +746,11 @@ msgstr "" msgid "Address" msgstr "Adresse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -576,7 +763,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "Adresse for tilgang til lokal relébro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Adresser" @@ -585,28 +772,28 @@ msgstr "Adresser" msgid "Administration" msgstr "Administrasjon" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Avanserte innstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Avanserte enhetsvalg" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Aldringstid" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 @@ -641,17 +828,17 @@ msgstr "" msgid "Alias of \"%s\"" msgstr "Alias for «%s»" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Alle tjenere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "Tildel IP-adresser sekvensielt, fra lavest tilgjengelige adresse." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Tildel IP sekvensielt" @@ -659,11 +846,11 @@ msgstr "Tildel IP sekvensielt" msgid "Allow SSH password authentication" msgstr "Tillat SSH passord godkjenning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "Tillat AP-modus å koble fra STA-er basert på lav ACK-tilstand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Tillat alle unntatt oppførte" @@ -671,15 +858,15 @@ msgstr "Tillat alle unntatt oppførte" msgid "Allow full UCI access for legacy applications" msgstr "Tillat full UCI-tilgang for foreldede programmer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Tillat foreldede 802.11b-hastigheter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Tillat kun oppførte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Tillat lokalvert" @@ -700,19 +887,24 @@ msgid "Allow system feature probing" msgstr "Tillat sondering av systemfunksjoner" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Tillat bruker root å logge inn med passord" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Tillatte IP-er" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Alltid" @@ -726,12 +918,12 @@ msgstr "Alltid av (kjerne: ingen)" msgid "Always on (kernel: default-on)" msgstr "Alltid på (kjerne: forvalgt på)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "Alltid send DPCP-innstillinger. Trengs noen ganger med f.eks. PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -739,11 +931,15 @@ msgstr "" "Alltid bruk 40 MHz-kanaler selv om sekundær kanal overlapper. Bruk av dette " "valget overholder ikke IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 #, fuzzy msgid "Amount of Duplicate Address Detection probes to send" msgstr "Mengde dupliserte adresseoppdagelsesprober å sende" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Kunne ikke lagre skjemaet:" @@ -752,98 +948,47 @@ msgstr "Kunne ikke lagre skjemaet:" msgid "An optional, short description for this device" msgstr "Valgfri kort beskrivelse av denne enheten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Kunngjorte DNS-domener" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Kunngjorte IPv6-DNS-tjenere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "" @@ -856,7 +1001,7 @@ msgstr "Anonym montering" msgid "Anonymous Swap" msgstr "Anonym sidevekslingsfil" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -868,11 +1013,11 @@ msgstr "" msgid "Any zone" msgstr "Alle soner" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -880,45 +1025,49 @@ msgstr "" msgid "Apply backup?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Arkitektur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 #, fuzzy msgid "Arp-scan" msgstr "ARP-skanning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Tilkoblede Klienter" @@ -927,15 +1076,15 @@ msgstr "Tilkoblede Klienter" msgid "Associations" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -945,25 +1094,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Godkjenning" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autoritativ" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Autorisasjon er nødvendig" @@ -971,7 +1121,9 @@ msgstr "Autorisasjon er nødvendig" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -989,7 +1141,7 @@ msgstr "Automatisk Homenet-protokoll (HNCP)" msgid "Automatically check filesystem for errors before mounting" msgstr "Sjekk filsystem automatisk før montering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1011,6 +1163,10 @@ msgstr "Automatisk montering av filsystem" msgid "Automount Swap" msgstr "Automatisk montering av sidevekslingsfil" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Tilgjengelig" @@ -1029,11 +1185,15 @@ msgstr "Tilgjengelig" msgid "Average:" msgstr "Gjennomsnitt:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1041,15 +1201,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Tilbake" @@ -1058,11 +1222,7 @@ msgstr "Tilbake" msgid "Back to Overview" msgstr "Tilbake til oversikt" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Tilbake til konfigurasjon" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1075,16 +1235,15 @@ msgid "Backup / Flash Firmware" msgstr "Sikkerhetskopiering/Firmware oppgradering" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Sikkerhetskopier filliste" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Baseenhet" @@ -1092,12 +1251,35 @@ msgstr "Baseenhet" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1111,7 +1293,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1120,18 +1302,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Forbindelsesgrensesnitt" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1143,65 +1338,77 @@ msgstr "" msgid "Bitrate" msgstr "Bitrate" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Forbindelsespraksis" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Bro" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Bro (støtter direkte kommunikasjon mellom forskjellige MAC-VLAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Broenhet" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Bro enhetsnummer" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Slå på ved oppstart" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "" @@ -1209,14 +1416,36 @@ msgstr "" msgid "Buffered" msgstr "Bufret" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "CPU forbruk (%)" @@ -1231,18 +1460,23 @@ msgstr "" msgid "Call failed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Avbryt" @@ -1250,32 +1484,32 @@ msgstr "Avbryt" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1284,45 +1518,53 @@ msgstr "" msgid "Category" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1335,16 +1577,16 @@ msgstr "" msgid "Chain" msgstr "Kjede" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Endringer" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "" @@ -1355,18 +1597,19 @@ msgstr "Endrer administrator passordet for tilgang til enheten" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Kanal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Kanalanalyse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Kanalbredde" @@ -1374,7 +1617,7 @@ msgstr "Kanalbredde" msgid "Check filesystems before mount" msgstr "Sjekk filsystemer før montering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" @@ -1392,8 +1635,8 @@ msgstr "Sjekker avtrykk …" msgid "Choose mtdblock" msgstr "Velg mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1405,7 +1648,7 @@ msgstr "" "Eller fyll ut Opprett feltet for å definere en ny sone og tilknytte " "grensesnittet til det." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1413,7 +1656,7 @@ msgstr "" "Velg det eller de nettverk du vil legge til dette trådløse grensesnittet, " "eller fyll ut Opprett feltet for å definere et nytt nettverk." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Krypteringsmetode" @@ -1437,9 +1680,10 @@ msgstr "" "Klikk «Lagre mtdblock» for å laste ned angitt mtdblock-fil. (Merk: Denne " "funksjonen er for proffer!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Klient" @@ -1448,9 +1692,9 @@ msgstr "Klient" msgid "Client ID to send when requesting DHCP" msgstr "Klient ID som sendes ved DHCP spørring" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Lukk" @@ -1467,20 +1711,20 @@ msgstr "" "Lukk inaktiver tilkoblinger etter angitt antall sekunder, bruk 0 for en " "kontinuerlig tilkobling" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Lukk liste..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Samler inn data…" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Kommando" @@ -1497,7 +1741,7 @@ msgstr "Kommando mislyktes" msgid "Comment" msgstr "Kommentar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1516,29 +1760,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Oppsett" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" -msgstr "Oppsettsendringer har blitt tilbakestilt." +msgstr "Oppsettsendringer har blitt tilbakestilt!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Oppsett mislyktes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1548,28 +1791,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1581,9 +1824,10 @@ msgstr "" msgid "Confirmation" msgstr "Bekreftelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Tilkoblet" @@ -1593,11 +1837,11 @@ msgstr "Tilkoblet" msgid "Connection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1609,7 +1853,7 @@ msgstr "Forbindelsen ble brutt" msgid "Connections" msgstr "Tilkoblinger" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1637,9 +1881,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Innholdet har blitt lagret." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1650,16 +1894,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1670,20 +1914,20 @@ msgstr "" msgid "Country" msgstr "Land" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Landskode" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Opprett/Tildel brannmur sone" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Opprett grensesnitt" @@ -1695,7 +1939,7 @@ msgstr "Kritisk" msgid "Cron Log Level" msgstr "Cron logg nivå" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Nåværende sendeeffekt" @@ -1736,32 +1980,32 @@ msgstr "" "Tilpasser oppførselen til enhetens LEDs om mulig." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 #, fuzzy msgid "DAD transmits" msgstr "DAD-sender" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE-klient" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE-port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAE-tjener" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "DHCP-innstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP og DNS" @@ -1772,16 +2016,22 @@ msgstr "DHCP og DNS" msgid "DHCP client" msgstr "DHCP klient" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP-Alternativer" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6-klient" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6-tjeneste" @@ -1793,19 +2043,19 @@ msgstr "DHCPv6-tjeneste" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "DNS videresendinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNS spørre port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "DNS-søkedomener" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "DNS server port" @@ -1813,7 +2063,7 @@ msgstr "DNS server port" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "DNS-vekting" @@ -1821,11 +2071,11 @@ msgstr "DNS-vekting" msgid "DNS-Label / FQDN" msgstr "DNS-etikett/FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1837,39 +2087,49 @@ msgstr "Lediggangstidsavbrudd for DPD" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "DSL-status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "DTIM-intervall" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Datahastighet" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +#, fuzzy +msgid "Data Received" +msgstr "Motta" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +#, fuzzy +msgid "Data Transmitted" +msgstr "Sende" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Feilsøking" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Forvalgt ruter" @@ -1877,7 +2137,7 @@ msgstr "Forvalgt ruter" msgid "Default state" msgstr "Standard tilstand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1886,61 +2146,62 @@ msgstr "" "Definer flere DHCP-valg, f.eks. \"192.168.2.1,192.168.2.2\" som " "annonserer forskjellige DNS-tjenere til klientene." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Slett" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Slettingsforespørsel mislyktes: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Fjern dette nettverket" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Beskrivelse" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Fravelg" @@ -1948,11 +2209,11 @@ msgstr "Fravelg" msgid "Design" msgstr "Design" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1987,9 +2248,9 @@ msgstr "Målsone" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1999,36 +2260,40 @@ msgstr "Målsone" msgid "Device" msgstr "Enhet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Enhet Konfigurasjon" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Enheten er ikke aktiv" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Enheten starter på ny …" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Enhetsnavn" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Enheten håndteres ikke av ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Enheten er ikke tilstede" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Enhetstype" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Enheten er ikke tilgjengelig!" @@ -2036,31 +2301,31 @@ msgstr "Enheten er ikke tilgjengelig!" msgid "Device unreachable! Still waiting for device..." msgstr "Enheten er utilgjengelig!Venter fremdeles på enhet …" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Enheter" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Nettverksdiagnostikk" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Katalog" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Skru av" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2077,20 +2342,24 @@ msgstr "" msgid "Disable Encryption" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2099,34 +2368,33 @@ msgstr "" msgid "Disabled" msgstr "Avskrudd" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "Forkast oppstrøms RFC1918 svar." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Koble fra" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 #, fuzzy msgid "Disconnection attempt failed" msgstr "Kunne ikke koble fra" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 #, fuzzy msgid "Disconnection attempt failed." msgstr "Kunne ikke koble fra." @@ -2137,29 +2405,41 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" -msgstr "" +msgstr "Avslå" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Avstand Optimalisering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Avstand i meter til det medlem av nettverket som er lengst unna." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSHDCP-tjener og DNS-videresender." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "Ikke cache negative svar, f.eks for ikke eksisterende domener" @@ -2180,36 +2460,25 @@ msgstr "Ikke cache negative svar, f.eks for ikke eksisterende domener" msgid "Do not create host route to peer (optional)." msgstr "Kunne ikke opprette vertsrute til likemann (valgfritt)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "Ikke videresend DNS-Forespørsler " "uten DNS-Navn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Ikke videresend forespørsler som ikke kan besvares med offentlige " -"navneservere" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Ikke videresend reverserte oppslag for lokale nettverk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Ikke lytt til de angitte grensesnittene." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "Ikke tilby DHCPv6-tjeneste på dette grensesnittet." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Ikke delta" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2221,7 +2490,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Ikke send et vertsnavn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2229,11 +2498,11 @@ msgstr "" "Ikke send noen RA-meldinger på dette grensesnittet." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Slett «%s»?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Slett følgende SSH-nøkkel?" @@ -2241,11 +2510,11 @@ msgstr "Slett følgende SSH-nøkkel?" msgid "Do you really want to erase all settings?" msgstr "Slett alle innstillinger?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Slett mappen «%s», undermapper og innhold?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2253,15 +2522,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Domene" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Domene kreves" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Domene hviteliste" @@ -2287,11 +2558,11 @@ msgstr "Last ned sikkerhetskopi" msgid "Download mtdblock" msgstr "Last ned mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2305,16 +2576,54 @@ msgstr "Dra for å endre rekkefølge" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbear Instans" @@ -2332,20 +2641,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Dynamisk DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2353,7 +2662,7 @@ msgstr "" msgid "Dynamic tunnel" msgstr "Dynamisk tunnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2361,39 +2670,55 @@ msgstr "" "Dynamisk tildeling av DHCP adresser til klienter. Om deaktivert, kan en kun " "bruke klienter med statisk leie." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAP-metode" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" -msgstr "Endre" +msgstr "Rediger" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:226 msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" -msgstr "Endre dette nettverket" +msgstr "Rediger dette nettverket" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "" @@ -2402,54 +2727,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Krisesituasjon" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Skru på" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Aktiver STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2467,10 +2782,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "Aktiver HE,net dynamisk endepunkt oppdatering" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2484,11 +2800,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Aktiver IPv6 på PPP lenke" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Aktiver Jumbo Frames gjennomgang" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2500,11 +2820,11 @@ msgstr "Aktiver NTP klient" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Aktiver TFTP server" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2512,7 +2832,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "Aktiver VLAN funksjonalitet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "" @@ -2523,12 +2843,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "" @@ -2544,24 +2864,24 @@ msgstr "" msgid "Enable mirroring of outgoing packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2583,11 +2903,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "" @@ -2596,27 +2916,36 @@ msgstr "" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" -msgstr "Påskrudd" +msgstr "Aktivert" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Aktiverer Spanning Tree Protocol på denne broen" @@ -2624,24 +2953,30 @@ msgstr "Aktiverer Spanning Tree Protocol på denne broen" msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Innkapsling modus" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Kryptering" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +#, fuzzy +msgid "Endpoint" +msgstr "Monterings punkt" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2649,23 +2984,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2694,10 +3029,6 @@ msgstr "Feil" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2716,11 +3047,17 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 #, fuzzy msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " @@ -2729,27 +3066,35 @@ msgstr "" "Utelat 127.0.0.0/8 og ::1 fra " "gjentilknyttingssjekker, f.eks. for RBL-tjenester" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Eksisterende enhet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Utvid vertsliste" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2758,11 +3103,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Forventer: %s" @@ -2774,7 +3119,7 @@ msgstr "Forventer: ikke-tom verdi" msgid "Expires" msgstr "Utgår" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 #, fuzzy msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." @@ -2784,11 +3129,11 @@ msgstr "Utløpstid på leide adresser, minimum er 2 minutter (2m)." msgid "External" msgstr "Ekstern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Ekstern R0-nøkkelholderliste" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Ekstern R1-nøkkelholderliste" @@ -2817,60 +3162,88 @@ msgstr "Ekstra PPPD-innstillinger" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT over DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Klarte ikke å endre systempassordet." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Fil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "filen der gitt DHCP-leier vil bli lagret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "lokal DNS-fil" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Filnavn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Filnavn fra boot image annonsert til klienter" @@ -2879,14 +3252,22 @@ msgstr "Filnavn fra boot image annonsert til klienter" msgid "Filesystem" msgstr "Filsystem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filtrer private" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filtrer ubrukelige" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "" @@ -2899,8 +3280,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2910,7 +3296,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Finn og koble til nettverk" @@ -2924,10 +3310,11 @@ msgid "Firewall" msgstr "Brannmur" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Brannmur Innstillinger" @@ -2935,19 +3322,19 @@ msgstr "Brannmur Innstillinger" msgid "Firewall Status" msgstr "Brannmur Status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Fastvareversjon" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Fast kilde port for utgående DNS-spørringer" @@ -2973,41 +3360,49 @@ msgstr "Flash operasjoner" msgid "Flashing…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Bruk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Bruk CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" "Bruk DHCP i dette nettverket, selv om en annen DHCP server er oppdaget." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Bruk TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Bruk TKIP og CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "" @@ -3019,11 +3414,11 @@ msgstr "" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3042,37 +3437,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Videresend DHCP trafikk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Videresend kringkastingstrafikk" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Videresending modus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Fragmenterings Terskel" @@ -3094,7 +3493,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Kun GPRS" @@ -3114,11 +3513,15 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" -msgstr "Gateway" +msgstr "Portner" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" @@ -3129,23 +3532,23 @@ msgstr "Gateway porter" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Generelle innstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Generelt Oppsett" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3153,7 +3556,7 @@ msgstr "" msgid "Generate Config" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3161,11 +3564,11 @@ msgstr "" msgid "Generate archive" msgstr "Opprett arkiv" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3173,15 +3576,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3193,39 +3596,40 @@ msgstr "Det oppgitte passordet var ikke korrekt, passord ble ikke endret!" msgid "Global Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Gå til passord konfigurasjon..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Gå til relevant konfigurasjonen side" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Innvilg tilgang til DHCP-statusskjerm" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3237,6 +3641,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3273,7 +3681,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3281,6 +3689,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3313,7 +3725,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Innvilg tilgang til trådløs statusskjerm" @@ -3342,17 +3754,13 @@ msgstr "" msgid "Hang Up" msgstr "Slå av" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" -msgstr "" +msgstr "Hallo-intervall" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:114 msgid "" @@ -3362,7 +3770,7 @@ msgstr "" "Her kan du konfigurere grunnleggende aspekter av enheten som f.eks. dens " "vertsnavn eller tidssone." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Skjul ESSID" @@ -3371,27 +3779,35 @@ msgstr "Skjul ESSID" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" -msgstr "" +msgstr "Vert" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 msgid "Host expiry timeout" msgstr "Verts utløpstid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3399,10 +3815,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3412,11 +3834,11 @@ msgstr "Vertsnavn" msgid "Hostname to send when requesting DHCP" msgstr "Vertsnavn som sendes ved DHCP forespørsel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Vertsnavn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3472,23 +3894,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" -msgstr "" +msgstr "IP-adresser" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3504,7 +3930,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3516,20 +3942,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Overstyr falske NX Domener" @@ -3537,14 +3963,15 @@ msgstr "Overstyr falske NX Domener" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3560,7 +3987,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3570,7 +3997,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3597,7 +4024,7 @@ msgstr "IPv4 nettmaske" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Kun IPv4" @@ -3610,11 +4037,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "IPv4 prefikslengde" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3623,16 +4050,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3643,7 +4074,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3651,7 +4083,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6 Brannmur" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3659,7 +4091,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3667,15 +4103,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3689,12 +4125,12 @@ msgstr "" msgid "IPv6 address" msgstr "IPv6 adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3706,11 +4142,11 @@ msgstr "IPv6 gateway" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Kun IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3719,7 +4155,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "IPv6-prefiks" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3733,23 +4169,19 @@ msgstr "IPv6 prefikslengde" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3757,6 +4189,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3772,10 +4208,16 @@ msgstr "IPv6-over-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-over-IPv4 (6til4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identitet" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3788,13 +4230,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3811,21 +4253,23 @@ msgid "" "device node" msgstr "Hvis oppgitt vil denne enheten bli montert utfra dens Volumnavn" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Dersom ikke avmerket blir ingen standard rute konfigurert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "Dersom ikke avmerket blir de annonserte DNS server adresser ignorert" @@ -3843,15 +4287,23 @@ msgstr "" "title=\"Random Access Memory\">RAM. Vær oppmerksom på at bruk av swap " "er mye langsommere en RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignorer grensesnitt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignorer oppslagsfil" @@ -3863,25 +4315,25 @@ msgstr "Firmware" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3893,13 +4345,27 @@ msgstr "" msgid "In" msgstr "i" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3929,7 +4395,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3937,6 +4403,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3955,22 +4422,21 @@ msgstr "Info" msgid "Information" msgstr "Info" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3982,31 +4448,41 @@ msgstr "Oppstartskript" msgid "Initscripts" msgstr "Oppstartsskript" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Installer protokoll utvidelser..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4016,6 +4492,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4023,7 +4503,7 @@ msgstr "" msgid "Interface" msgstr "Grensesnitt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -4031,7 +4511,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Grensesnitt Konfigurasjon" @@ -4062,25 +4542,25 @@ msgstr "Grensesnittet kobler til igjen..." msgid "Interface is shutting down..." msgstr "Grensesnittet slår seg av..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 msgid "Interface name" -msgstr "" +msgstr "Grensesnitt navn" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Grensesnittet er ikke tilgjengelig eller er ikke tilknyttet." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Grensesnitt" @@ -4089,22 +4569,26 @@ msgstr "Grensesnitt" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Intern server feil" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4114,8 +4598,9 @@ msgid "Invalid" msgstr "Ugyldig" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4125,6 +4610,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4147,7 +4636,7 @@ msgstr "Ugyldig VLAN-ID angitt! Bare unike ID-er tillates" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4161,15 +4650,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Ugyldig brukernavn og/eller passord! Vennligst prøv igjen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "" @@ -4183,25 +4693,25 @@ msgstr "" "Det virker som du prøver å flashe med en firmware som ikke passer inn i " "flash-minnet, vennligst kontroller firmware filen!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "JavaScript kreves!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Koble til nettverket" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Koble til nettverk: Trådløs Skanning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4209,24 +4719,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Kjerne Logg" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Kjerneversjon" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Nøkkel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Nøkkel #%d" @@ -4234,6 +4748,7 @@ msgstr "Nøkkel #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4241,14 +4756,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4293,7 +4813,7 @@ msgstr "LCP ekko intervall" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4310,32 +4830,39 @@ msgstr "Språk" msgid "Language and Style" msgstr "Språk og Utseende" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Leie-fil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "" @@ -4359,38 +4886,34 @@ msgstr "La stå tomt for automatisk oppdagelse" msgid "Leave empty to use the current WAN address" msgstr "La stå tomt for å bruke gjeldene WAN adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Forklaring:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Grense" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4411,16 +4934,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Liste over verter som returneren falske NX domene resultater" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4429,7 +4954,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4442,25 +4967,22 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Liste over domener hvor en tillater RFC1918 svar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" "Liste med DNS servere som " "forespørsler blir videresendt til" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Lytteport" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4469,7 +4991,7 @@ msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" "Lytt kun på det angitte grensesnitt, om ingen er angitt lyttes det på alle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4479,7 +5001,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Lytte-port for innkommende DNS-spørring" @@ -4488,7 +5010,7 @@ msgstr "Lytte-port for innkommende DNS-spørring" msgid "Load" msgstr "Last" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Belastning Gjennomsnitt" @@ -4496,27 +5018,28 @@ msgstr "Belastning Gjennomsnitt" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4536,11 +5059,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Lokal IPv4 adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4556,44 +5080,70 @@ msgstr "Lokal IPv6 adresse" msgid "Local Startup" msgstr "Lokal Oppstart" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Lokal tid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Lokalt domene" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "Lokalt domenesuffiks lagt til DHCP navn og vertsfil oppføringer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Lokal server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Lokalisere søk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Logg inn" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Logg ut" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Logg nivå" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Logg spørringer" @@ -4617,37 +5167,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Logg inn" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Logg ut" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Laveste leide adresse, forskjøvet fra nettverks adressen." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" -msgstr "" +msgstr "MAC-adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "MAC addresse Filter" @@ -4655,16 +5196,15 @@ msgstr "MAC addresse Filter" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4673,11 +5213,15 @@ msgstr "" msgid "MAC address" msgstr "MAC-Adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC-Filter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "MAC-Liste" @@ -4691,6 +5235,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4712,15 +5260,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4728,7 +5280,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4737,78 +5289,86 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Maksimalt antall DHCP-tildelninger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Maks. EDNS0 pakke størrelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Maks. samtidige spørringer" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Maksimalt antall aktive DHCP leieavtaler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Maksimalt antall samtidige DNS spørringer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "Maksimal tillatt størrelse på EDNS.0 UDP-pakker" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Maksimalt antall sekunder å vente på at modemet skal bli klart" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Maksimalt antall utleide adresser." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4835,7 +5395,7 @@ msgstr "Minne" msgid "Memory usage (%)" msgstr "Minne forbruk (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4843,10 +5403,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4859,7 +5427,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4870,11 +5438,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4882,13 +5450,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4902,77 +5470,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Modus" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Modell" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Modem initiering tidsavbrudd" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" @@ -5042,6 +5617,10 @@ msgstr "Flytt ned" msgid "Move up" msgstr "Flytt opp" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5049,19 +5628,23 @@ msgstr "Flytt opp" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5073,12 +5656,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5091,18 +5678,23 @@ msgid "NTP server candidates" msgstr "NTP server kandidater" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Navn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Navnet til det nye nettverket" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigasjon" @@ -5111,13 +5703,17 @@ msgstr "Navigasjon" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5126,32 +5722,36 @@ msgstr "" msgid "Network" msgstr "Nettverk" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Nettverks Verktøy" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" -msgstr "" +msgstr "Nettverksadresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Nettverks boot image" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5164,7 +5764,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5173,7 +5773,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5182,15 +5782,21 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" -msgstr "" +msgstr "Aldri" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Tilbakestill" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 #, fuzzy msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " @@ -5199,11 +5805,11 @@ msgstr "" "Lokalt domene spesifikasjon. Navn som passer dette domenet blir aldri " "videresendt, de blir kun løst av DHCP eller vertsfiler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5211,21 +5817,21 @@ msgstr "" msgid "Next »" msgstr "Neste »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Ingen DHCP server er konfigurert for dette grensesnittet" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:202 msgid "No Data" -msgstr "" +msgstr "Ingen data" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5237,13 +5843,21 @@ msgstr "" msgid "No NAT-T" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 -msgid "No RX signal" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 +msgid "No RX signal" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5254,7 +5868,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5263,8 +5881,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5277,15 +5895,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Ingen filer funnet" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5299,7 +5913,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5320,30 +5934,40 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Ingen negative cache" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Ruteren er ikke passordbeskyttet!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "Ikke tilkoblet" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5357,7 +5981,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Ingen sone tilknyttet" @@ -5369,37 +5994,40 @@ msgstr "Ingen sone tilknyttet" msgid "Noise" msgstr "Støy" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Støy:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Ingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Ikke funnet" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Ikke tilknyttet" @@ -5412,7 +6040,7 @@ msgstr "Ikke tilkoblet" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5424,12 +6052,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5438,7 +6072,7 @@ msgstr "" msgid "Notice" msgstr "Merk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5446,7 +6080,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5463,7 +6097,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5474,6 +6108,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "" @@ -5482,6 +6117,12 @@ msgstr "" msgid "Off-State Delay" msgstr "Forsinkelse ved tilstand Av" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "" @@ -5490,15 +6131,15 @@ msgstr "" msgid "On-State Delay" msgstr "Forsinkelse ved tilstand -På-" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Enten Vertsnavn eller Mac-adresse må oppgis!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5516,7 +6157,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "Ett eller flere obligatoriske felter har ingen verdi!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5525,49 +6170,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Åpne liste..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5575,29 +6231,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Innstilling endret" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Innstilling fjernet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5605,17 +6270,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5623,13 +6288,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5644,11 +6309,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5656,7 +6321,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5670,7 +6335,7 @@ msgstr "" msgid "Options" msgstr "Alternativer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Sti til CA-sertifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Sti til klient-sertifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Sti til privatnøkkel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -6042,11 +6752,19 @@ msgstr "" msgid "Peak:" msgstr "Maksimalt:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -6055,11 +6773,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6090,10 +6808,14 @@ msgstr "Foreta nullstilling" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6102,13 +6824,13 @@ msgstr "" msgid "Phy Rate:" msgstr "Phy Hastighet:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Fysiske Innstillinger" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6121,11 +6843,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pakker." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Skriv inn ditt brukernavn og passord." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6133,56 +6855,75 @@ msgstr "" msgid "Policy" msgstr "Policy" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Port status:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6207,13 +6948,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Hindrer klient-til-klient kommunikasjon" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6226,29 +6968,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6266,8 +7010,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6279,13 +7023,13 @@ msgstr "Protokoll" msgid "Provide NTP server" msgstr "Funger som NTP Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Lag nytt nettverk" @@ -6295,25 +7039,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6338,59 +7093,83 @@ msgstr "" msgid "Quality" msgstr "Kvalitet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "RADIUS Accounting Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "RADIUS Accounting Secret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "RADIUS Accounting Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "RADIUS Authentication Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "RADIUS Authentication Secret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "RADIUS Authentication Server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "RTS/CTS Terskel" @@ -6403,10 +7182,16 @@ msgstr "RX" msgid "RX Rate" msgstr "RX Rate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6416,11 +7201,11 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Les /etc/ethers for Ã¥ sette opp DHCP-tjeneren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Vil du endre protokoll?" @@ -6428,11 +7213,11 @@ msgstr "Vil du endre protokoll?" msgid "Realtime Graphs" msgstr "Grafer i sanntid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Binde beskyttelse" @@ -6456,11 +7241,40 @@ msgstr "Omstarter operativsystemet pÃ¥ enheten" msgid "Receive" msgstr "Motta" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Motta" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Koble til igjen" @@ -6468,12 +7282,12 @@ msgstr "Koble til igjen" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6482,37 +7296,47 @@ msgstr "" msgid "References" msgstr "Referanser" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Relay" @@ -6522,6 +7346,10 @@ msgstr "Relay" msgid "Relay Bridge" msgstr "Relay bro" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Relay mellom nettverk" @@ -6531,6 +7359,14 @@ msgstr "Relay mellom nettverk" msgid "Relay bridge" msgstr "Relay bro" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6540,6 +7376,7 @@ msgstr "Ekstern IPv4 adresse" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6552,15 +7389,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Fjern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Erstatt trÃ¥dløs konfigurasjon" @@ -6590,7 +7435,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6606,7 +7452,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6618,67 +7464,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6687,7 +7539,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6702,20 +7554,24 @@ msgstr "Nullstill Tellere" msgid "Reset to defaults" msgstr "Nullstill til standard innstilling" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Oppslag og Vertsfiler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Oppslagsfil" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Omstart" @@ -6724,7 +7580,7 @@ msgstr "Omstart" msgid "Restart Firewall" msgstr "Omstart Brannmur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6736,7 +7592,7 @@ msgstr "Gjenoppretting" msgid "Restore backup" msgstr "Gjenopprett sikkerhetskopi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -6744,80 +7600,91 @@ msgstr "" "Lokaliser vertsnavn avhengig av subnett hvis flere IP-adresser er " "tilgjengelig" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Vis/Skjul passord" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Tilbakestill" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6832,19 +7699,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6862,6 +7729,10 @@ msgstr "Ruter Passord" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6876,24 +7747,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6913,11 +7784,24 @@ msgstr "" msgid "SHA256" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6935,15 +7819,15 @@ msgstr "" msgid "SSH username" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH-Nøkler" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6960,7 +7844,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6971,7 +7855,7 @@ msgid "Save" msgstr "Lagre" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Lagre & Aktiver" @@ -6988,7 +7872,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Skann" @@ -6997,11 +7881,16 @@ msgstr "Skann" msgid "Scheduled Tasks" msgstr "Planlagte Oppgaver" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Seksjon lagt til" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Seksjon fjernet" @@ -7016,9 +7905,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -7026,13 +7915,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -7053,11 +7942,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7082,16 +7975,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7101,14 +7998,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7122,32 +8019,41 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Oppsett DHCP server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 msgid "Setting PLMN failed" msgstr "" -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 -msgid "Setting operation mode failed" +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 +msgid "Setting operation mode failed" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7155,12 +8061,11 @@ msgstr "" msgid "Short GI" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Vis gjeldende liste med sikkerhetskopifiler" @@ -7173,16 +8078,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "SlÃ¥ av dette grensesnittet" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7190,15 +8095,15 @@ msgstr "SlÃ¥ av dette grensesnittet" msgid "Signal" msgstr "Signal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7206,12 +8111,12 @@ msgstr "" msgid "Signal:" msgstr "Signal:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Størrelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7228,12 +8133,12 @@ msgstr "GÃ¥ videre" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "GÃ¥ til innhold" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "GÃ¥ til navigasjon" @@ -7251,14 +8156,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "Noen felt er ugyldige, kan ikke lagre verdier!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Beklager, objektet du spurte om ble ikke funnet." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Beklager, det oppstod en uventet feil pÃ¥ serveren." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7269,8 +8170,8 @@ msgstr "" "flashes manuelt. Viser til wiki for installering av firmare pÃ¥ forskjellige " "enheter." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7297,26 +8198,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7341,7 +8242,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7349,7 +8250,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7357,20 +8258,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "Hvor lagrings enheten blir tilsluttet filsystemet (f.eks. /mnt/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7399,7 +8300,7 @@ msgid "" "dead" msgstr "Angir maksimalt antall sekunder før verter ansees som frakoblet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7416,7 +8317,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7447,15 +8348,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7477,19 +8378,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7509,7 +8410,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7604,15 +8505,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Angi krypteringsnøkkelen her." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Start" @@ -7625,16 +8534,16 @@ msgstr "" msgid "Start priority" msgstr "Start prioritet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7643,6 +8552,10 @@ msgstr "" msgid "Startup" msgstr "Oppstart" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Statiske IPv4 Ruter" @@ -7656,7 +8569,7 @@ msgstr "Statiske IPv6 Ruter" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Statiske Leier" @@ -7666,7 +8579,7 @@ msgstr "Statiske Leier" msgid "Static address" msgstr "Statisk adresse" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7676,18 +8589,18 @@ msgstr "" "vertsnavn til DHCP klienter. Dette er nødvendig om grensesnittet ikke er " "dynamisk konfigurert og kun klienter med dhcp leieavtale fÃ¥r IP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Stopp" @@ -7696,8 +8609,8 @@ msgstr "Stopp" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7705,11 +8618,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Streng overholdelse" @@ -7718,15 +8631,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Send inn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7757,7 +8670,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Svitsj protokoll" @@ -7767,7 +8680,7 @@ msgstr "Svitsj protokoll" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7779,8 +8692,16 @@ msgstr "" msgid "Sync with browser" msgstr "Synkroniser med nettleser" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7804,9 +8725,9 @@ msgstr "System Egenskaper" msgid "System log buffer size" msgstr "System logg buffer størrelse" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7835,7 +8756,7 @@ msgstr "" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "TFTP server roten" @@ -7848,26 +8769,37 @@ msgstr "TX" msgid "TX Rate" msgstr "TX rate" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tabell" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "MÃ¥l" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7883,26 +8815,26 @@ msgstr "" msgid "Terminate" msgstr "Avslutte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7918,7 +8850,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7930,18 +8866,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7949,6 +8891,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7963,6 +8906,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7974,7 +8923,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7991,21 +8940,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8017,13 +8970,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8043,18 +8996,18 @@ msgstr "" "Filenheten til partisjonen eller minnet (f.eks." " /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8071,7 +9024,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Følgende regler er aktiver pÃ¥ systemet." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -8079,31 +9032,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8126,6 +9095,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8140,7 +9110,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8149,7 +9119,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8157,19 +9127,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8189,14 +9159,14 @@ msgstr "" "Uplink port for tilkobling til større nettverk som internett og andre porter " "til lokalt nettverk." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8209,31 +9179,31 @@ msgstr "" msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8271,6 +9241,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8294,30 +9272,37 @@ msgstr "" "Den opplastede programvaren er av et format som ikke støttes. Sørg for at du " "velger det generelle firmware-bildet for din plattform." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8330,16 +9315,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "Dette IPv4 adressen til relayet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8355,6 +9340,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8371,7 +9367,7 @@ msgstr "" "Dette er den lokale endepunkt adressen som ble tildelt av tunnel 'broker', " "adressen ender vanligvis med ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "Dette er den eneste configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8472,7 +9472,7 @@ msgstr "" "tilstand, klikker du pÃ¥ \"Utfør nullstilling\" (kun mulig pÃ¥ squashfs " "firmwarer)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8480,12 +9480,16 @@ msgstr "" msgid "Total Available" msgstr "Totalt Tilgjengelig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8497,11 +9501,11 @@ msgstr "Trafikk" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8518,6 +9522,27 @@ msgstr "Sende" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Sende Antenne" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8556,7 +9581,7 @@ msgstr "Tunnel grensesnitt" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8565,13 +9590,13 @@ msgid "Tx-Power" msgstr "Tx-Styrke" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Type" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8620,7 +9645,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Kan ikke sende" @@ -8671,19 +9696,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8697,7 +9734,7 @@ msgstr "" msgid "Unknown" msgstr "Ukjent" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8721,11 +9758,11 @@ msgstr "UhÃ¥ndtert" msgid "Unmount" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Ulagrede Endringer" @@ -8739,15 +9776,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Protokoll type er ikke støttet." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8759,7 +9806,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 #, fuzzy msgid "Upload" msgstr "Last opp" @@ -8775,58 +9822,66 @@ msgstr "" msgid "Upload archive..." msgstr "Last opp arkiv..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "DNS servere skal følge rekkefølgen " "i oppslagsfilen ved spørringer" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Oppetid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Bruk /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8835,13 +9890,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "Bruk DHCP gateway" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Bruk DNS servere annonsert av peer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Bruk ISO/IEC 3166 alpha2 landskoder." @@ -8887,22 +9947,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "Bruk kringkasting flagg" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Bruk egendefinerte DNS servere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Bruk standard gateway" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Bruk gateway metrikk" @@ -8926,15 +9989,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 #, fuzzy msgid "" "Use the Add Button to add a new lease entry. The MAC address%h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -9046,24 +10111,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPN server" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -9072,6 +10140,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -9085,14 +10157,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9118,7 +10190,7 @@ msgstr "" msgid "Vendor Class to send when requesting DHCP" msgstr "Leverandør klasse som sendes ved DHCP spørring" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9126,12 +10198,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9139,34 +10211,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "WEP åpent system" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "WEP delt nøkkel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "WEP passord" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "WMM Modus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "WPA passord" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9195,48 +10279,100 @@ msgstr "" msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +#, fuzzy +msgid "WireGuard Status" +msgstr "Brannmur Status" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9253,21 +10389,21 @@ msgid "Wireless Adapter" msgstr "Trådløs Tilslutning" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Trådløst Nettverk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Trådløs Oversikt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Trådløs Sikkerhet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9283,15 +10419,15 @@ msgstr "Trådløs er deaktiver" msgid "Wireless is not associated" msgstr "Trådløs er ikke tilknyttet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Trådløst nettverk er deaktivert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Trådløst nettverk er aktivert" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Skriv mottatte DNS forespørsler til syslog" @@ -9303,7 +10439,7 @@ msgstr "" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9330,8 +10466,20 @@ msgstr "" "deaktiverer nødvendige init skript som f.eks. \"nettverk\", kan enheten bli " "utilgjengelig! " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9362,34 +10510,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "enhver" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "brokoblet" @@ -9446,25 +10614,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "Deaktiver" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9473,14 +10646,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "utgått" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9490,22 +10672,22 @@ msgstr "" msgid "forward" msgstr "videresend" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "full-dupleks" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "halv-dupleks" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "skjult" @@ -9514,9 +10696,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9524,6 +10706,10 @@ msgstr "" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9538,11 +10724,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9551,11 +10745,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9567,18 +10761,26 @@ msgstr "" msgid "no" msgstr "nei" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "ingen forbindelse" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 #, fuzzy msgid "none" msgstr "ingen" @@ -9590,20 +10792,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "av" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9612,6 +10814,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9629,23 +10835,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "rutet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9653,7 +10868,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9661,7 +10876,7 @@ msgstr "" msgid "tagged" msgstr "tagget" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9672,25 +10887,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "ukjent" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "ubegrenset" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9712,8 +10929,8 @@ msgid "untagged" msgstr "utagget" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9726,7 +10943,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9755,7 +10972,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9792,8 +11009,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9833,11 +11050,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9847,43 +11074,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" diff --git a/package/luci/modules/luci-base/po/nl/base.po b/package/luci/modules/luci-base/po/nl/base.po index 71b93ae735..e7abc4903c 100644 --- a/package/luci/modules/luci-base/po/nl/base.po +++ b/package/luci/modules/luci-base/po/nl/base.po @@ -1,31 +1,47 @@ msgid "" msgstr "" -"PO-Revision-Date: 2022-11-04 10:26+0000\n" -"Last-Translator: fodiator \n" -"Language-Team: Dutch \n" +"PO-Revision-Date: 2023-10-08 08:51+0000\n" +"Last-Translator: Fabrice Delahaij \n" +"Language-Team: Dutch \n" "Language: nl\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 5.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" -msgstr "" +msgstr "\"%h\" tabel \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d ongeldige velden" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%dh geleden" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%dm geleden" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%ds geleden" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s mag niet zonder tag in meerdere VLANs voorkomen!" @@ -50,32 +66,33 @@ msgstr "(leeg)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(geen gekoppelde interfaces)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" -msgstr "" +msgstr "+ %d meer" #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:48 msgid "-- Additional Field --" msgstr "-- Extra Veld --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Maak een keuze --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- aangepast --" @@ -101,7 +118,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = geen signaaldrempelwaarde gebruiken, 1 = standaardwaarde van driver niet " @@ -116,12 +133,17 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Systeembelasting (1 minuut):" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "1 vlag" +msgstr[1] "%d vlaggen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" @@ -137,12 +159,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4-teken hexadecimaal ID" @@ -155,43 +182,104 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Systeembelasting (5 minuten):" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "6-octet ID als hex tekenreeks - zonder dubbele punten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: bakenrapportage inschakelen via radiometingen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: burenrapportage inschakelen via radiometingen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r Snelle overgang" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: BSS Max inactief. Eenheden: seconden." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: Basic Service Set (BSS) transitiebeheer." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Lokale tijdzone-advertentie in beheerframes." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Proxy ARP stelt niet-AP STA in staat om langer in de " +"energiebesparende modus te blijven." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Tijdadvertentie in beheerframes." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Wireless Network Management (WNM) Slaapstand (verlengde slaapstand " +"voor stations)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Voorkomt " +"herinstallatie-aanvallen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w Association SA Query maximale time-out" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11w Associatie SA Vraag herproberen time-out" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" -msgstr "" +msgstr "802.11w Management Frame Bescherming" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w maximale time-out" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w herproberen time-out" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-Netwerkmasker" @@ -203,80 +291,108 @@ msgstr "LED Configuratie" msgid "LED Name" msgstr "LED Naam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" -msgstr "" +msgstr "NDP-Proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" -msgstr "" +msgstr "RA Vlaggen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" -msgstr "" +msgstr "RA hop limiet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" -msgstr "" +msgstr "RA Levenslang" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" -msgstr "" +msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" +msgstr "RA-Service" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ komt overeen met elk domein. /example.com/ " +"retourneert NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." msgstr "" +"/example.com/# retourneert NULL-adressen (0.0.0.0 " +"en ::) voor example.com en zijn subdomeinen." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" -msgstr "" +msgstr "%s groter dan %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:85 msgctxt "nft relational \">=\" operator expression" msgid "%s greater than or equal to %s" -msgstr "" +msgstr "%s groter dan of gelijk aan %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:90 msgctxt "nft set match expression" msgid "%s in set %s" -msgstr "" +msgstr "%s in set %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:83 msgctxt "nft relational \"==\" operator expression" msgid "%s is %s" -msgstr "" +msgstr "%s is %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:89 msgctxt "nft relational \"in\" operator expression" msgid "%s is one of %s" -msgstr "" +msgstr "%s is een van %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:88 msgctxt "nft relational \"<\" operator expression" msgid "%s lower than %s" -msgstr "" +msgstr "%s lager dan %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:86 msgctxt "nft relational \"<=\" operator expression" msgid "%s lower than or equal to %s" -msgstr "" +msgstr "%s lager dan of gelijk aan %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:84 msgctxt "nft relational \"!=\" operator expression" msgid "%s not %s" -msgstr "" +msgstr "%s niet %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:91 msgctxt "nft not in set match expression" msgid "%s not in set %s" +msgstr "%s niet in set %s" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." msgstr "" +"Een batman-adv-node kan in servermodus draaien (zijn internetverbinding " +"delen met de mesh) of in clientmodus (zoeken naar de meest geschikte " +"internetverbinding in de mesh) of de gateway-ondersteuning volledig " +"uitschakelen (wat de standaardinstelling is )." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" -msgstr "" +msgstr "Er bestaat al een configuratie voor het apparaat \"%s\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Er bestaat al een map met deze naam." @@ -284,25 +400,90 @@ msgstr "Er bestaat al een map met deze naam." msgid "A new login is required since the authentication session expired." msgstr "Er moet opnieuw worden ingelogd omdat de sessie is verlopen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -336,29 +517,40 @@ msgstr "" msgid "ARP retry threshold" msgstr "Drempelwaarde voor hernieuwde ARP-pogingen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" +msgstr "ARP-verkeerstabel \"%h\"" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." msgstr "" +"ARP, IPv4 en IPv6 (zelfs 802.1Q) met multicast-bestemmings-MAC's zijn " +"unicast naar het STA MAC-adres. Opmerking: dit is geen Directed Multicast " +"Service (DMS) in 802.11v. Opmerking: kan de STA multicast-verwachtingen van " +"de ontvanger overtreden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Asynchronous Transfer Mode)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM Bruggen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM Virtual Circuit Identifier (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" -msgstr "ATM Virtual Path Identifier (VPI)" +msgstr "ATM Virtueel Pad Identificeer (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -368,52 +560,59 @@ msgstr "" "virtuele Linux netwerkinterfaces welke met DHCP of PPP gebruikt kunnen " "worden om in het netwerk van de provider in te bellen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM apparaatnummer" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C Systeemleverancier-ID" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Geen interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" +"Accepteer alleen DNS-query's van hosts waarvan het adres zich op een lokaal " +"subnet bevindt." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" -msgstr "" +msgstr "Accepteer lokaal" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:95 msgctxt "nft accept action" msgid "Accept packet" -msgstr "" +msgstr "Accepteer pakket" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" -msgstr "" +msgstr "Accepteer pakketten met lokale bronadressen" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 msgid "Access Concentrator" msgstr "Toegang Concentrator" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Toegangspunt" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Isolatie van toegangspunten" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Acties" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Actief" @@ -437,7 +636,7 @@ msgstr "Actieve IPv4 Routes" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:258 msgid "Active IPv4 Rules" -msgstr "" +msgstr "Actieve IPv4-regels" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:265 msgid "Active IPv6 Routes" @@ -445,14 +644,14 @@ msgstr "Actieve IPv6 Routes" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:268 msgid "Active IPv6 Rules" -msgstr "" +msgstr "Actieve IPv6-regels" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:205 msgid "Active-Backup policy (active-backup, 1)" msgstr "Actieve-Backup instelling (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hocmodus" @@ -469,82 +668,87 @@ msgstr "Adaptieve verzendlastbalancering (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Toevoegen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" -msgstr "ATM brug toevoegen" +msgstr "Voeg ATM brug toevoegen toe" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:92 msgid "Add IPv4 address…" -msgstr "IPv4-adres toevoegen…" +msgstr "Voeg IPv4-adres toe…" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:185 msgid "Add IPv6 address…" -msgstr "IPv6-adres toevoegen…" +msgstr "Voeg IPv6-adres toe…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:65 msgid "Add LED action" -msgstr "LED-actie toevoegen" +msgstr "Voeg LED-actie toe" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:221 msgid "Add VLAN" -msgstr "VLAN toevoegen" +msgstr "Voeg VLAN toe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" -msgstr "" +msgstr "Voeg apparaat configuratie toe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" -msgstr "" +msgstr "Voeg apparaat configuratie toe…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:15 msgid "Add instance" msgstr "Instantie toevoegen" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" -msgstr "Sleutel toevoegen" +msgstr "Voeg Sleutel toe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" -"Lokaal-domeinachtervoegsel toevoegen aan uit hostsfiles geserveerde namen" +"Voeg een lokaal domeinachtervoegsel toe aan namen die worden geleverd vanuit " +"hosts-bestanden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." -msgstr "Nieuwe interface toevoegen..." +msgstr "Voeg nieuwe interface toe..." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:224 msgid "Add peer" -msgstr "Peer toevoegen" +msgstr "Voeg peer toe" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" -msgstr "" +msgstr "Voeg aan zwarte lijst toe" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Whitelist" -msgstr "" +msgstr "Voeg aan witte lijst toe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Aanvullende Hostsbestanden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Aanvullende-serversbestand" @@ -561,20 +765,24 @@ msgstr "Aanvullende-serversbestand" msgid "Address" msgstr "Adres" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" -msgstr "" +msgstr "Adres familie" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:284 msgid "Address setting is invalid" -msgstr "" +msgstr "Adresinstelling is ongeldig" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 msgid "Address to access local relay bridge" msgstr "Adres van lokale relay-brug" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Adressen" @@ -583,29 +791,29 @@ msgstr "Adressen" msgid "Administration" msgstr "Administratie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Geavanceerde instellingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" -msgstr "" +msgstr "Geavanceerde apparaat opties" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" -msgstr "" +msgstr "Verouderingstijd" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Geaggregeerd verzendvermogen (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Geaggregeerde Originator-berichten" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -614,16 +822,20 @@ msgstr "Aggregatie Selectie Logica" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:263 msgid "Aggregator: All slaves down or has no slaves (stable, 0)" msgstr "" +"Aggregator: alle slaven uitgeschakeld of heeft geen slaven (stabiel, 0)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:265 msgid "" "Aggregator: Chosen by the largest number of ports + slave added/removed or " "state changes (count, 2)" msgstr "" +"Aggregator: Gekozen door het grootste aantal poorten + slave toegevoegd/" +"verwijderd of statuswijzigingen (aantal, 2)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:264 msgid "Aggregator: Slave added/removed or state changes (bandwidth, 1)" msgstr "" +"Aggregator: Slave toegevoegd/verwijderd of statuswijzigingen (bandbreedte, 1)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:192 msgid "Alert" @@ -639,18 +851,19 @@ msgstr "Alias Interface" msgid "Alias of \"%s\"" msgstr "Alias van \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Alle servers" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -"IP-adressen op volgorde toewijzen, beginnend bij het laagst beschikbare adres" +"Wijs IP-adressen achtereenvolgens toe, te beginnen met het laagst " +"beschikbare adres." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "IP-adressen sequentieel toewijzen" @@ -659,11 +872,11 @@ msgid "Allow SSH password authentication" msgstr "" "SSH wachtwoordauthenticatie toestaan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "AP toestaan verbindingen met lage signaalkwaliteit te verbreken" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Alles behalve vermelde toestaan" @@ -671,15 +884,15 @@ msgstr "Alles behalve vermelde toestaan" msgid "Allow full UCI access for legacy applications" msgstr "Volledige UCI toegang voor verouderde applicaties toestaan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Verouderde 802.11b-snelheden toestaan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Alleen vermelde toestaan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Localhost toestaan" @@ -695,28 +908,33 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 msgid "Allow root logins with password" -msgstr "Root-logins met wachtwoord toestaan" +msgstr "Root-gebruikers met wachtwoord toestaan" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:3 msgid "Allow system feature probing" -msgstr "" +msgstr "Sta onderzoek van systeemfuncties toe" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "rootgebruiker toestaan zonder wachtwoord in te loggen" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Toegestane IP-adressen" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" -msgstr "" +msgstr "De instelling AllowedIPs is ongeldig" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" -msgstr "" +msgstr "Altijd" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:6 msgid "Always off (kernel: none)" @@ -726,19 +944,25 @@ msgstr "Altijd uit (kernel: geen)" msgid "Always on (kernel: default-on)" msgstr "Altijd aan (kernel: altijd-aan)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." -msgstr "" +msgstr "Stuur altijd DHCP-opties. Soms nodig, met b.v. PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" +"Gebruik altijd 40MHz-kanalen, zelfs als het secundaire kanaal overlapt. Het " +"gebruik van deze optie voldoet niet aan IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" -msgstr "" +msgstr "Aantal duplicaatadresdetectiesondes om te verzenden" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Aantal seconden dat moet worden gewacht totdat de modem gereed is" #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" @@ -746,100 +970,56 @@ msgstr "Er is een fout opgetreden bij het opslaan van het formulier:" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 msgid "An optional, short description for this device" -msgstr "" +msgstr "Een optionele, korte beschrijving voor dit apparaat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" +msgstr "Bijlage" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." -msgstr "" +msgstr "Kondig dit apparaat aan als IPv6 DNS-server." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" +"Kondig dit apparaat aan als standaardrouter als er een lokale IPv6-" +"standaardroute aanwezig is." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" +"Kondig dit apparaat aan als standaardrouter als er een openbaar IPv6-" +"voorvoegsel beschikbaar is, ongeacht de beschikbaarheid van de lokale " +"standaardroute." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" +"Kondig dit apparaat aan als standaardrouter, ongeacht of er een prefix of " +"standaardroute aanwezig is." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Aangekondigde DNS domeinen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" -msgstr "" +msgstr "Aangekondigde IPv6 DNS-servers" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Anonieme identiteit" @@ -851,113 +1031,128 @@ msgstr "Anoniem Monteren" msgid "Anonymous Swap" msgstr "Anoniem Verwisselen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" -msgstr "" +msgstr "Elk pakket" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:84 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:174 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:196 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:60 msgid "Any zone" -msgstr "" +msgstr "Elke zone" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." -msgstr "" +msgstr "Pas DHCP-opties toe op dit net. (Leeg = alle klanten)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" -msgstr "" +msgstr "Instellingen toepassen en behouden" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 msgid "Apply backup?" msgstr "Backup toepassen?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Aanvraag is mislukt met status %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" -msgstr "" +msgstr "Niet aangevinkt toepassen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" -msgstr "" +msgstr "Toepassen met herstel na verbindingsverlies" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" -msgstr "" +msgstr "Configuratiewijzigingen toepassen... %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Architectuur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" -msgstr "" +msgstr "Arp-scan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" +"Wijs een deel van een bepaalde lengte van elke publieke IPv6-prefix toe aan " +"deze interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" +"Wijs prefix-onderdelen toe met behulp van deze hexadecimale subprefix-ID " +"voor deze interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" -msgstr "" +msgstr "Bijbehorende stations" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:151 msgid "Associations" msgstr "Associaties" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" +"Minstens %h per %h, burst van %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" msgstr "" +"Maximaal %h per %h, burst van %h" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 msgid "Attempt to enable configured mount points for attached devices" msgstr "" +"Poging om geconfigureerde koppelpunten voor aangesloten apparaten in te " +"schakelen" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" -msgstr "Auth Groep" +msgstr "Authenticatie Groep" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Authenticatie" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" -msgstr "" +msgstr "Authenticatie Type" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autoritatieve" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Autorisatie Vereist" @@ -965,7 +1160,9 @@ msgstr "Autorisatie Vereist" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -977,33 +1174,40 @@ msgstr "Automatisch" #: modules/luci-compat/luasrc/model/network/proto_hnet.lua:7 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:7 msgid "Automatic Homenet (HNCP)" -msgstr "" +msgstr "Automatisch Homenet (HNCP)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 msgid "Automatically check filesystem for errors before mounting" msgstr "" +"Controleer het bestandssysteem automatisch op fouten voordat u aankoppelt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." msgstr "" +"Verwerk automatisch meerdere uplink-interfaces met behulp van op de bron " +"gebaseerde beleidsroutering." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 msgid "Automatically mount filesystems on hotplug" -msgstr "" +msgstr "Koppel bestandssystemen automatisch op hotplug" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 msgid "Automatically mount swap on hotplug" -msgstr "" +msgstr "Zet swap automatisch aan op hotplug" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 msgid "Automount Filesystem" -msgstr "" +msgstr "Automount bestandssysteem" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 msgid "Automount Swap" -msgstr "" +msgstr "Automount-wissel" + +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" @@ -1023,43 +1227,46 @@ msgstr "Beschikbaar" msgid "Average:" msgstr "Gemiddelde:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Vermijd bruglussen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" -msgstr "" +msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" -msgstr "" +msgstr "B43 + B43C + V43" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:48 msgid "BR / DMR / AFTR" -msgstr "" +msgstr "BR / DMR / AFTR" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "BSS-overgang" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 -#, fuzzy msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" -msgstr "" +msgstr "Terug" #: modules/luci-compat/luasrc/view/cbi/footer.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:48 msgid "Back to Overview" msgstr "Terug naar het overzicht" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Terug naar de configuratie" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" -msgstr "" +msgstr "Terug naar peer-configuratie" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:391 msgid "Backup" @@ -1070,64 +1277,114 @@ msgid "Backup / Flash Firmware" msgstr "Backup / Flash Firmware" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" -msgstr "" +msgstr "Backup bestanden lijst" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" -msgstr "" +msgstr "Band" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" -msgstr "" +msgstr "Basisapparaat" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 msgid "Base64-encoded public key of this interface for sharing." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +msgstr "Base64-gecodeerde openbare sleutel van deze interface om te delen." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Batman-apparaat" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Batman-interface" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv heeft een ingebouwde laag 2-fragmentatie voor unicast-gegevens " +"die door de mesh stromen, waardoor batman-adv kan worden uitgevoerd via " +"interfaces / verbindingen die het niet mogelijk maken om de MTU te vergroten " +"tot boven de standaard Ethernet-pakketgrootte van 1500 bytes. Wanneer de " +"fragmentatie is ingeschakeld, zal batman-adv automatisch te grote pakketten " +"fragmenteren en ze aan de andere kant defragmenteren. Standaard is " +"fragmentatie ingeschakeld en inactief als het pakket past, maar het is " +"mogelijk om de fragmentatie volledig te deactiveren." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" -msgstr "" +msgstr "Beacon Interval" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Baken rapport" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " "defined backup patterns." msgstr "" +"Hieronder vindt u de bepaalde lijst met bestanden waarvan u een back-up wilt " +"maken. Het bestaat uit gewijzigde configuratiebestanden gemarkeerd door " +"opkg, essentiële basisbestanden en de door de gebruiker gedefinieerde back-" +"uppatronen." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:287 msgid "Bind NTP server" -msgstr "" +msgstr "NTP-server binden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." -msgstr "" +msgstr "Dynamisch binden aan interfaces in plaats van een wildcardadres." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" +msgstr "Bind-interface" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" +"Servicerecords binden aan een domeinnaam: geef de locatie van services op." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." msgstr "" +"Servicerecords binden aan een domeinnaam: geef de locatie van services op. " +"Zie RFC2782." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." -msgstr "" +msgstr "Bind de tunnel aan deze interface (optioneel)." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 @@ -1135,8 +1392,16 @@ msgstr "" msgid "Bitrate" msgstr "Bitrate" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Verbindingsmodus" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" +msgstr "Bonding beleid" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 @@ -1144,293 +1409,360 @@ msgstr "" msgid "Bridge" msgstr "Brug" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" -msgstr "" +msgstr "Brug (Steun directe communicatie tussen MAC VLANs)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" -msgstr "" +msgstr "Bridge VLAN-filtering" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" -msgstr "" +msgstr "Brug apparaat" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" -msgstr "" +msgstr "Specifieke opties voor de brugpoort" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" -msgstr "" +msgstr "Brugpoorten" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" -msgstr "" +msgstr "Brug verkeerstabel \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" -msgstr "" +msgstr "Nummer brugeenheid" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" -msgstr "" +msgstr "Breng lege brug naar boven" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" -msgstr "" +msgstr "Breng op bij het opstarten" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +"Breng de bridge-interface op, zelfs als er geen poorten zijn aangesloten" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" -msgstr "" +msgstr "Broadcast beleid (broadcast , 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" -msgstr "" +msgstr "Bladeren…" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:40 msgid "Buffered" +msgstr "Gebufferd" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." msgstr "" +"CA-certificaat (PEM-gecodeerd; Gebruik in plaats van systeemwijde opslag om " +"het gateway-certificaat te verifiëren." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +"CA-certificaat; indien leeg, wordt het na de eerste verbinding opgeslagen." + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" +msgstr "CLAT configuratie mislukt" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME of fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (Extern beheerde interface)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "CPU gebruik (%)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:43 msgid "Cached" -msgstr "Cached" +msgstr "Gecached" #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:53 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:53 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:21 msgid "Call failed" +msgstr "Oproep mislukt" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." msgstr "" +"Kan handig zijn als de internetprovider IPv6-naamservers heeft, maar geen " +"IPv6-routering biedt." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" -msgstr "Afbreken" +msgstr "Annuleren" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:347 msgid "Cannot parse configuration: %s" -msgstr "" +msgstr "Kan configuratie niet passeren: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" -msgstr "" +msgstr "Binnenkomende pakketten gericht aan andere hosts vastleggen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" -msgstr "" +msgstr "Inkomende pakketten vastleggen vóór een routeringsbeslissing" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" +"Binnenkomende pakketten vastleggen die naar het lokale systeem worden geleid" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" -msgstr "" +msgstr "Uitgaande pakketten vastleggen na een routeringsbeslissing" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" -msgstr "" +msgstr "Uitgaande pakketten van het lokale systeem vastleggen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" -msgstr "" +msgstr "Pakketten vastleggen direct nadat de NIC ze heeft ontvangen" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:17 msgid "Category" msgstr "Categorie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -msgid "Certificate constraint (Domain)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -msgid "Certificate constraint (SAN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +msgid "Certificate constraint (Domain)" +msgstr "Certificaatbeperking (Domein)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +msgid "Certificate constraint (SAN)" +msgstr "Certificaatbeperking (SAN)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" -msgstr "" +msgstr "Certificaatbeperking (Onderwerp)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" -msgstr "" +msgstr "Certificaatbeperking (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" +"Certificaatbeperking subtekenreeks - bijv. /CN=wifi.mycompany.com
    Zie " +"`logread -f` tijdens de handshake voor de werkelijke waarden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" +"Certificaatbeperking(en) voor DNS SAN-waarden (indien beschikbaar)
    of " +"Onderwerp CN (exacte overeenkomst)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" +"Certificaatbeperking(en) voor DNS SAN-waarden (indien beschikbaar)
    of " +"Onderwerp CN (overeenkomst met achtervoegsels)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" msgstr "" +"Certificaatbeperking(en) via alternatieve naamwaarden voor onderwerp
    (ondersteunde kenmerken: E-MAIL, DNS, URI) - bijv. DNS:wifi.mijnbedrijf.com" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:212 msgid "Chain" -msgstr "" +msgstr "Reeks" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" -msgstr "" +msgstr "Reeks haak \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Veranderingen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Wijzigingen zijn teruggedraaid." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 msgid "Changes the administrator password for accessing the device" -msgstr "" +msgstr "Wijzigt het beheerderswachtwoord voor toegang tot het apparaat" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Kanaal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" -msgstr "" +msgstr "Kanaal analyse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" -msgstr "" +msgstr "Kanaalbreedte" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 msgid "Check filesystems before mount" -msgstr "" +msgstr "Controleer bestandssystemen voordat u gaat mounten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" +"Vink deze optie aan om de bestaande netwerken van deze radio te verwijderen." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:110 msgid "Checking archive…" -msgstr "" +msgstr "Archief controleren…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:193 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:195 msgid "Checking image…" -msgstr "" +msgstr "Afbeelding controleren…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:427 msgid "Choose mtdblock" -msgstr "" +msgstr "Kies mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " "fill out the custom field to define a new zone and attach the " "interface to it." msgstr "" +"Kies de firewallzone die u aan deze interface wilt toewijzen. Selecteer " +"unspecified om de interface uit de gekoppelde zone te verwijderen " +"of vul het veld custom in om een nieuwe zone te definiëren en de " +"interface eraan te koppelen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" +"Kies het (de) netwerk(en) die u aan deze draadloze interface wilt koppelen " +"of vul het veld custom in om een nieuw netwerk te definiëren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" -msgstr "" +msgstr "Cipher" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:91 msgid "Cisco UDP encapsulation" -msgstr "" +msgstr "Cisco UDP-inkapseling" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:391 msgid "" "Click \"Generate archive\" to download a tar archive of the current " "configuration files." msgstr "" +"Klik op \"Archief genereren\" om een tar-archief van de huidige " +"configuratiebestanden te downloaden." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:424 msgid "" "Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS " "FEATURE IS FOR PROFESSIONALS! )" msgstr "" +"Klik op \"Bewaar mtdblock\" om het gespecificeerde mtdblock-bestand te " +"downloaden. (OPMERKING: DEZE FUNCTIE IS VOOR PROFESSIONALS! )" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" -msgstr "" +msgstr "Cliënt" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:37 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:33 msgid "Client ID to send when requesting DHCP" -msgstr "" +msgstr "Client-ID om te verzenden bij het aanvragen van DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Sluiten" @@ -1444,79 +1776,85 @@ msgid "" "Close inactive connection after the given amount of seconds, use 0 to " "persist connection" msgstr "" - -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "" +"Sluit de inactieve verbinding na het opgegeven aantal seconden, gebruik 0 om " +"de verbinding voort te zetten" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." +msgstr "Gegevens verzamelen..." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" -msgstr "" +msgstr "Commando" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:401 msgid "Command OK" -msgstr "" +msgstr "Commando OK" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:33 msgid "Command failed" -msgstr "" +msgstr "Commando mislukt" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:73 msgid "Comment" -msgstr "" +msgstr "Opmerking" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " "workaround might cause interoperability issues and reduced robustness of key " "negotiation especially in environments with heavy traffic load." msgstr "" +"Compliceert aanvallen op het opnieuw installeren van sleutels aan de " +"clientzijde door het opnieuw verzenden van EAPOL-sleutelframes die worden " +"gebruikt om sleutels te installeren, uit te schakelen. Deze tijdelijke " +"oplossing kan interoperabiliteitsproblemen veroorzaken en de robuustheid van " +"sleutelonderhandeling verminderen, vooral in omgevingen met veel verkeer." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:106 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:108 msgid "Compute outgoing checksum (optional)." -msgstr "" +msgstr "Bereken uitgaande checksum (optioneel)." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Config File" -msgstr "" +msgstr "Configuratiebestand" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Configuratie" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" -msgstr "" +msgstr "Configuratie Export" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Configuratiewijzigingen toegepast." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Configuratiewijzigingen zijn teruggedraaid!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Configuratie mislukt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1525,43 +1863,56 @@ msgid "" "the basic rate. Supported rates lower than the minimum basic rate are not " "offered." msgstr "" +"Configureert gegevenssnelheden gebaseerd op de dekking van de celdichtheid. " +"Normaal configureert basissnelheden op 6, 12, 24 Mbps als de oude 802.11b-" +"snelheden niet worden gebruikt, anders op 5,5, 11 Mbps. Hoog configureert de " +"basissnelheden op 12, 24 Mbps als de oude 802.11b-snelheden niet worden " +"gebruikt en anders op 11 Mbps. Very High configureert 24 Mbps als " +"basissnelheid. Ondersteunde snelheden lager dan de minimale basissnelheid " +"worden niet aangeboden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" +"Configureert de standaard routeradvertentie in RA berichten." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" +"Configureert de werkingsmodus van de RA dienst op deze interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." -msgstr "" +msgstr "Configureert de werkingsmodus van de DHCPv6-dienst op deze interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" +"Configureert de werkingsmodus van de NDP-proxydienst op deze interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Configureer…" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:176 msgid "Confirm disconnect" -msgstr "" +msgstr "Bevestig de verbinding verbreken" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:55 msgid "Confirmation" -msgstr "" +msgstr "Conformeren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Verbonden" @@ -1569,55 +1920,56 @@ msgstr "Verbonden" #: modules/luci-base/htdocs/luci-static/resources/network.js:9 #: modules/luci-compat/luasrc/model/network.lua:27 msgid "Connection attempt failed" -msgstr "" +msgstr "Verbindingspoging mislukt" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." -msgstr "" +msgstr "Verbindingspoging mislukt." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" -msgstr "" +msgstr "Verbinding eindpunt" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:411 msgid "Connection lost" -msgstr "" +msgstr "Verbinding verbroken" #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:160 msgid "Connections" -msgstr "" +msgstr "Verbindingen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" -msgstr "" +msgstr "Connectiviteitsverandering" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:31 msgctxt "nft ct state" msgid "Conntrack state" -msgstr "" +msgstr "Conntrack staat" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:33 msgctxt "nft ct status" msgid "Conntrack status" -msgstr "" +msgstr "Conntrack-status" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:378 msgid "Consider the slave up when all ARP IP targets are reachable (all, 1)" msgstr "" +"Beschouw de slave up wanneer alle ARP IP-doelen bereikbaar zijn (alle, 1)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:377 msgid "Consider the slave up when any ARP IP target is reachable (any, 0)" -msgstr "" +msgstr "Beschouw de slave up wanneer een ARP IP-doel bereikbaar is (elke, 0)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:18 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:368 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:55 msgid "Contents have been saved." -msgstr "" +msgstr "De inhoud is opgeslagen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1626,66 +1978,70 @@ msgstr "Doorgaan" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:97 msgctxt "nft jump action" msgid "Continue in %h" -msgstr "" +msgstr "Ga verder in %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" -msgstr "" +msgstr "Doorgaan in bel reeksen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" -msgstr "" +msgstr "Ga door met het verwerken van onbereikbare pakketten" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " "settings such as the IP address or wireless security credentials." msgstr "" +"Kan geen toegang meer krijgen tot het apparaat na het toepassen van de " +"configuratiewijzigingen. Mogelijk moet u opnieuw verbinding maken als u " +"netwerkgerelateerde instellingen hebt gewijzigd, zoals het IP-adres of de " +"referenties voor draadloze beveiliging." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:189 msgid "Country" msgstr "Land" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" -msgstr "" +msgstr "Land Code" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" -msgstr "" +msgstr "Dekking celdichtheid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" -msgstr "" +msgstr "Firewall-zone maken / toewijzen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" -msgstr "" +msgstr "Interface maken" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:191 msgid "Critical" -msgstr "" +msgstr "Kritisch" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:195 msgid "Cron Log Level" -msgstr "" +msgstr "Cron-logboekniveau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" -msgstr "" +msgstr "Huidig vermogen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:28 msgctxt "nft meta hour" msgid "Current time" -msgstr "" +msgstr "Huidige tijd" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:29 msgctxt "nft meta day" msgid "Current weekday" -msgstr "" +msgstr "Huidige weekdag" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:573 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:575 @@ -1694,71 +2050,81 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:82 #: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:83 msgid "Custom Interface" -msgstr "" +msgstr "Aangepaste interface" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:410 msgid "" "Custom files (certificates, scripts) may remain on the system. To prevent " "this, perform a factory-reset first." msgstr "" +"Aangepaste bestanden (certificaten, scripts) kunnen op het systeem blijven " +"staan. Om dit te voorkomen, voert u eerst een fabrieksreset uit." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:6 msgid "Custom flash interval (kernel: timer)" -msgstr "" +msgstr "Aangepast flitsinterval (kernel: timer)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:59 msgid "" "Customizes the behaviour of the device LEDs if possible." msgstr "" +"Past indien mogelijk het gedrag van de LEDs van het apparaat aan." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" -msgstr "" +msgstr "DAD zendt uit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" -msgstr "" +msgstr "DAE-Client" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE-Poort" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" -msgstr "" +msgstr "DAE-Geheim" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" -msgstr "" +msgstr "DHCP-opties" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" -msgstr "" +msgstr "DHCP-server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" -msgstr "" +msgstr "DHCP en DNS" #: modules/luci-base/htdocs/luci-static/resources/network.js:2091 #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:16 #: modules/luci-compat/luasrc/model/network.lua:969 msgid "DHCP client" -msgstr "" +msgstr "DHCP-client" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" +msgstr "DHCP-opties" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" -msgstr "" +msgstr "DHCPv6-client" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" -msgstr "" +msgstr "DHCPv6-Service" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:45 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:46 @@ -1766,203 +2132,218 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:48 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:49 msgid "DNS" -msgstr "" +msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" -msgstr "" +msgstr "DNS forwardings" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" -msgstr "DNS verzoekpoort" +msgstr "DNS verzoekpoort" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" -msgstr "" +msgstr "DNS-zoekdomeinen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" -msgstr "DNS serverpoort" +msgstr "DNS serverpoort" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:292 msgid "DNS setting is invalid" -msgstr "" +msgstr "DNS-instelling is ongeldig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" -msgstr "" +msgstr "DNS-gewicht" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:33 msgid "DNS-Label / FQDN" -msgstr "" +msgstr "DNS-Label / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" -msgstr "" +msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" -msgstr "" +msgstr "DNSSEC-controle niet ondertekend" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:99 msgid "DPD Idle Timeout" -msgstr "" +msgstr "DPD Idle Time-out" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:41 msgid "DS-Lite AFTR address" -msgstr "" +msgstr "DS-Lite AFTR adres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" -msgstr "" +msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" -msgstr "" +msgstr "DSL-status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" -msgstr "" +msgstr "DSL-lijnmodus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" -msgstr "" +msgstr "DTIM Interval" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" -msgstr "" +msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" -msgstr "" +msgstr "Datasnelheid" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Ontvangen gegevens" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Verzonden gegevens" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" -msgstr "" +msgstr "Debuggen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" -msgstr "" +msgstr "Standaard router" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:12 msgid "Default state" -msgstr "" +msgstr "Standaard staat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" +"Definieer extra DHCP-opties, bijvoorbeeld \"6,192.168.2.1,192.168.2.2\" die verschillende DNS-servers adverteert aan cliënten." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" +"Definieert een toewijzing van Linux interne pakketprioriteit aan VLAN-" +"headerprioriteit, maar voor uitgaande frames" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" +"Definieert een toewijzing van VLAN-headerprioriteit aan de Linux interne " +"pakketprioriteit op inkomende frames" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" -msgstr "" +msgstr "Definieert een specifieke MTU voor deze route" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" -msgstr "" +msgstr "IPv6-prefixen delegeren" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Verwijderen" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Verwijder toets" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" -msgstr "" +msgstr "Verwijderverzoek mislukt: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" -msgstr "" +msgstr "Verwijder dit netwerk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" -msgstr "" +msgstr "Bezorgverkeer Indicatie Bericht Interval" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" -msgstr "Omschrijving" +msgstr "Beschrijving" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" -msgstr "" +msgstr "Deselecteer" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:237 msgid "Design" -msgstr "" +msgstr "Ontwerp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" -msgstr "" +msgstr "Aangewezen meester" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" -msgstr "" +msgstr "Bestemming" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:44 msgctxt "nft ip daddr" msgid "Destination IP" -msgstr "" +msgstr "Bestemming IP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:48 msgctxt "nft ip6 daddr" msgid "Destination IPv6" -msgstr "" +msgstr "Bestemming IPv6" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:48 msgid "Destination port" -msgstr "" +msgstr "Bestemmingspoort" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:46 msgctxt "nft ip dport" msgid "Destination port" -msgstr "" +msgstr "Bestemmingspoort" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 msgid "Destination zone" -msgstr "" +msgstr "Bestemmingszone" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:67 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1970,174 +2351,203 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:357 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:393 msgid "Device" -msgstr "" +msgstr "Apparaat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" +msgstr "Apparaatconfiguratie" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" -msgstr "" +msgstr "Apparaat is niet actief" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" -msgstr "" +msgstr "Apparaat herstart…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" -msgstr "" +msgstr "Naam apparaat" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." -msgstr "" +msgstr "Apparaat niet beheerd door ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" -msgstr "" +msgstr "Apparaat niet aanwezig" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" -msgstr "" +msgstr "Type apparaat" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" -msgstr "" +msgstr "Apparaat onbereikbaar!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:53 msgid "Device unreachable! Still waiting for device..." -msgstr "" +msgstr "Toestel onbereikbaar! Wacht nog steeds op apparaat..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Apparaten" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" -msgstr "" +msgstr "Diagnostiek" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" -msgstr "" +msgstr "Kies nummer" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" -msgstr "" +msgstr "Map" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" -msgstr "" +msgstr "Uitschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." msgstr "" +"Schakel DHCP uit " +"voor deze interface." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:375 msgid "Disable DNS lookups" -msgstr "" +msgstr "DNS-lookups uitschakelen" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 msgid "Disable Encryption" -msgstr "" +msgstr "Encryptie uitschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" -msgstr "" +msgstr "Inactiviteitspolling uitschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" -msgstr "" +msgstr "Dit netwerk uitschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:70 msgid "Disabled" -msgstr "" +msgstr "Uitgeschakeld" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" -msgstr "" +msgstr "Uitgeschakeld" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" -msgstr "" +msgstr "Disassocieer bij lage erkenning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" +"Negeer upstream-antwoorden die RFC1918-adressen bevatten." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" -msgstr "" +msgstr "Ontkoppelen" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" -msgstr "" +msgstr "Verbindingspoging mislukt" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." -msgstr "" +msgstr "Verbindingspoging mislukt." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:35 msgid "Disk space" -msgstr "" +msgstr "Schijfruimte" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" -msgstr "" +msgstr "Afwijzen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" -msgstr "" +msgstr "Afstand optimalisatie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." +msgstr "Afstand tot verste netwerklid in meters." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Gedistribueerde ARP-tabel" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" +"Dnsmasq-instantie waaraan deze opstartsectie is gebonden. Indien niet " +"gespecificeerd, is de sectie geldig voor alle dnsmasq-instanties." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" +"Dnsmasq is een lichtgewicht DHCP server en DNS forwarder." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" +"Bewaar negatieve antwoorden niet in de cache, b.v. voor niet-bestaande " +"domeinen." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 @@ -2145,196 +2555,263 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:70 msgid "Do not create host route to peer (optional)." -msgstr "" +msgstr "Maak geen hostroute naar peer (optioneel)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" +msgstr "Stuur geen DNS-query's door zonder punten of domeinonderdelen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." -msgstr "" +msgstr "Stuur reverse lookups niet door voor lokale netwerken." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." -msgstr "" +msgstr "Luister niet op de gespecificeerde interfaces." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." -msgstr "" +msgstr "Bied geen DHCPv6-service aan op deze interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." msgstr "" +"Proxy geen NDP-pakketten." #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:25 msgid "Do not send a hostname" -msgstr "" +msgstr "Stuur geen hostnaam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" +"Stuur geen RA-" +"berichten via deze interface." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" -msgstr "" +msgstr "Wil je echt \"%s\" verwijderen?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" -msgstr "" +msgstr "Wilt u echt de volgende SSH-sleutel verwijderen?" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:94 msgid "Do you really want to erase all settings?" -msgstr "" +msgstr "Wil je echt alle instellingen wissen?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" -msgstr "" +msgstr "Wilt u echt recursief de map \"%s\" verwijderen?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" -msgstr "" +msgstr "Wilt u de huidige PSK vervangen?" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:100 msgid "Do you want to replace the current keys?" -msgstr "" +msgstr "Wilt u de huidige sleutels vervangen?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" -msgstr "" +msgstr "Domein" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" -msgstr "" +msgstr "Domein vereist" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" -msgstr "" +msgstr "Domein witte lijst" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:83 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 msgid "Don't Fragment" -msgstr "" +msgstr "Niet fragmenteren" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 msgid "Down" -msgstr "" +msgstr "Omlaag" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:403 msgid "Down Delay" -msgstr "" +msgstr "Neerwaartse vertraging" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:394 msgid "Download backup" -msgstr "" +msgstr "Back-up downloaden" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:432 msgid "Download mtdblock" -msgstr "" +msgstr "Mtdblock downloaden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" -msgstr "" +msgstr "Downstream SNR offset" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." msgstr "" +"Sleep of plak hieronder een geldig *.conf-bestand om de lokale " +"WireGuard-interface te configureren." #: modules/luci-base/htdocs/luci-static/resources/form.js:2698 msgid "Drag to reorder" -msgstr "" +msgstr "Slepen om te herschikken" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:342 msgid "Drop Duplicate Frames" +msgstr "Dubbele frames laten vallen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." msgstr "" +"Laat alle gratis ARP-frames vallen, bijvoorbeeld als er een bekende goede " +"ARP-proxy op het netwerk is en dergelijke frames niet hoeven te worden " +"gebruikt of, in het geval van 802.11, niet mogen worden gebruikt om " +"aanvallen te voorkomen." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 -msgctxt "nft drop action" -msgid "Drop packet" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." msgstr "" +"Verwijder alle ongevraagde advertenties van buren, bijvoorbeeld als er een " +"bekende goede NA-proxy op het netwerk is en dergelijke frames niet hoeven te " +"worden gebruikt of, in het geval van 802.11, niet mogen worden gebruikt om " +"aanvallen te voorkomen." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Laat gratuite ARP vallen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" +"Laat laag 2 multicast frames die IPv4 unicast pakketten bevatten vallen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" +"Laat laag 2 multicast frames die IPv6 unicast pakketten bevatten vallen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Laat geneste IPv4 unicast vallen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Laat geneste IPv6 unicast vallen" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 +msgctxt "nft drop action" +msgid "Drop packet" +msgstr "Laat packet vallen" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" -msgstr "" +msgstr "Laat ongeëvenaarde pakketten vallen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Laat ongevraagd NA vallen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" -msgstr "" +msgstr "Dropbear-instantie" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 msgid "" "Dropbear offers SSH network shell access " "and an integrated SCP server" msgstr "" +"Dropbear biedt SSH netwerk shell toegang " +"en een geïntegreerde SCP server" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:14 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:11 msgid "Dual-Stack Lite (RFC6333)" -msgstr "" +msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" +"Dynamisch DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." -msgstr "" +msgstr "Dynamische Authorization Extension-client." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." -msgstr "" +msgstr "Dynamische Authorization Extension-poort." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." -msgstr "" +msgstr "Dynamische Authorization Extension geheim." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 msgid "Dynamic tunnel" -msgstr "" +msgstr "Dynamische tunnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" +"Dynamisch toewijzen van DHCP-adressen voor cliënten. Indien uitgeschakeld, " +"worden alleen cliënten met statische leases bediend." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Bijv. br-vlan of brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Bijv. eth0, eth1" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" -msgstr "" +msgstr "EA-bits lengte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" -msgstr "" +msgstr "EAP-Methode" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Elke STA krijgt een eigen AP_VLAN interface toegewezen." #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" -msgstr "" +msgstr "Bewerk" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:226 msgid "Edit peer" +msgstr "Peer bewerken" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" msgstr "" #: modules/luci-compat/luasrc/view/cbi/error.htm:13 @@ -2342,92 +2819,89 @@ msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" +"Bewerk de onbewerkte configuratiegegevens hierboven om eventuele fouten op " +"te lossen en druk op \"Opslaan\" om de pagina opnieuw te laden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" -msgstr "" +msgstr "Dit netwerk bewerken" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" -msgstr "" +msgstr "Draadloos netwerk bewerken" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:65 msgctxt "nft rt mtu" msgid "Effective route MTU" -msgstr "" +msgstr "Effectieve route MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" -msgstr "" +msgstr "Uitgaande QoS-mapping" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" -msgstr "" +msgstr "Uitgaand apparaat id" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" +msgstr "Naam uitgaand apparaat" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" -msgstr "" +msgstr "Noodgeval" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" -msgstr "" +msgstr "Activeren" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" +"Peer in- / uitschakelen. Start de wireguard-interface opnieuw om wijzigingen " +"toe te passen." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" +"IGMP snooping " +"inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" -msgstr "" +msgstr "STP inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" -msgstr "" +msgstr "SLAAC inschakelen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:369 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:375 msgid "Enable DNS lookups" -msgstr "" +msgstr "DNS-lookups inschakelen" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:294 msgid "Enable Dynamic Shuffling Of Flows" -msgstr "" +msgstr "Dynamische shuffle van stromen inschakelen" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 msgid "Enable HE.net dynamic endpoint update" -msgstr "" +msgstr "HE.net dynamische eindpuntupdate inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" -msgstr "" +msgstr "IPv6 inschakelen" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" -msgstr "" +msgstr "IPv6-onderhandeling inschakelen" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 @@ -2436,39 +2910,43 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 msgid "Enable IPv6 negotiation on the PPP link" -msgstr "" +msgstr "IPv6-onderhandeling op de PPP-verbinding inschakelen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "IPv6-segmentroutering inschakelen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" -msgstr "" +msgstr "Jumbo Frame passthrough inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" -msgstr "" +msgstr "MAC-adres leren inschakelen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:257 msgid "Enable NTP client" -msgstr "" +msgstr "NTP-client inschakelen" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "Enable Single DES" -msgstr "" +msgstr "Enkele DES inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" -msgstr "" +msgstr "TFTP-server inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" -msgstr "" +msgstr "VLAN-filtering inschakelen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:184 msgid "Enable VLAN functionality" -msgstr "" +msgstr "VLAN-functionaliteit inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" -msgstr "" +msgstr "WPS-drukknop inschakelen, vereist WPA(2)-PSK/WPA3-SAE" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:14 msgid "" @@ -2476,164 +2954,189 @@ msgid "" "Protocol\">HTTP requests to HTTPS port." msgstr "" +"Automatische omleiding van HTTP verzoeken naar HTTPS poort inschakelen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" +"Downstream-delegatie van IPv6-voorvoegsels inschakelen die beschikbaar zijn " +"op deze interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" -msgstr "" +msgstr "Tegenmaatregelen tegen sleutelherinstallatie (KRACK) inschakelen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:189 msgid "Enable learning and aging" -msgstr "" +msgstr "Leren en ouder inschakelen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:200 msgid "Enable mirroring of incoming packets" -msgstr "" +msgstr "Mirroring van inkomende pakketten inschakelen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:201 msgid "Enable mirroring of outgoing packets" -msgstr "" +msgstr "Mirroring van uitgaande pakketten inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" -msgstr "" +msgstr "Multicast-snel verlaten inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" -msgstr "" +msgstr "Multicast-querier inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" -msgstr "" +msgstr "Multicast-ondersteuning inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" +"Pakketsturing over alle CPU's inschakelen. Kan de netwerksnelheid helpen of " +"belemmeren." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" -msgstr "" +msgstr "Promiscue modus inschakelen" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:71 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:66 msgid "Enable rx checksum" -msgstr "" +msgstr "Rx-controlesom inschakelen" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:96 msgid "Enable support for multicast traffic (optional)." -msgstr "" +msgstr "Ondersteuning voor multicast-verkeer inschakelen (optioneel)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:83 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." -msgstr "" +msgstr "De DF (Don't Fragment) vlag van de inkapselende pakketten inschakelen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." -msgstr "" +msgstr "De ingebouwde single-instance TFTP-server inschakelen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" -msgstr "" +msgstr "Dit netwerk inschakelen" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:75 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:70 msgid "Enable tx checksum" -msgstr "" +msgstr "Tx-controlesom inschakelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" -msgstr "" +msgstr "Unicast-flooding inschakelen" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" -msgstr "Geactiveerd" +msgstr "Ingeschakeld" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" -msgstr "" +msgstr "Schakelt IGMP-snooping op deze brug" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" +"Schakelt snelle roaming mogelijk tussen toegangspunten die tot hetzelfde " +"Mobiliteitsdomein behoren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 -msgid "Enables the Spanning Tree Protocol on this bridge" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." msgstr "" +"Schakelt een efficiëntere, groepsbewuste infrastructuur voor multicast " +"forwarding mogelijk in batman-adv." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 +msgid "Enables the Spanning Tree Protocol on this bridge" +msgstr "Schakelt het Spanning Tree Protocol op deze brug" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:59 msgid "Encapsulation limit" -msgstr "" +msgstr "Inkapselingslimiet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" -msgstr "" +msgstr "Inkapselingsmodus" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" -msgstr "" +msgstr "Versleuteling" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Eindpunt" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" -msgstr "" +msgstr "Eindpunt Host" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" -msgstr "" +msgstr "Eindpunt Poort" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:325 msgid "Endpoint setting is invalid" -msgstr "" +msgstr "Eindpuntinstelling is ongeldig" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" -msgstr "" +msgstr "IGMPv1 afdwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" -msgstr "" +msgstr "IGMPv2 afdwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" -msgstr "" +msgstr "IGMPv3 afdwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" -msgstr "" +msgstr "MLD versie 1 afdwingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" -msgstr "" +msgstr "MLD versie 2 afdwingen" #: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 msgid "Enter custom value" -msgstr "" +msgstr "Voer aangepaste waarde in" #: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 msgid "Enter custom values" -msgstr "" +msgstr "Voer aangepaste waarden in" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:97 msgid "Erasing..." -msgstr "" +msgstr "Wissen..." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:103 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:104 @@ -2642,943 +3145,1074 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:107 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:190 msgid "Error" -msgstr "" +msgstr "Fout" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:170 msgid "Error getting PublicKey" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" +msgstr "Fout bij ophalen PublicKey" #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" -msgstr "" +msgstr "Ethernet-adapter" #: modules/luci-base/htdocs/luci-static/resources/network.js:2999 #: modules/luci-compat/luasrc/model/network.lua:1423 msgid "Ethernet Switch" -msgstr "" +msgstr "Ethernet-switch" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:272 msgid "Every 30 seconds (slow, 0)" -msgstr "" +msgstr "Elke 30 seconden (langzaam, 0)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:273 msgid "Every second (fast, 1)" -msgstr "" +msgstr "Elke seconde (snel, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" +msgstr "Interfaces uitsluiten" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." msgstr "" +"Uitvoering van verschillende netwerkopdrachten om de verbinding en " +"naamomzetting naar andere systemen te controleren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -"DNS-antwoorden in het 127.0.0.0/8 bereik toestaan, bijvoorbeeld voor " -"blokkeerlijstdiensten" +"Stel 127.0.0.0/8 en ::1 vrij van " +"herbindingscontroles, b.v. voor RBL-diensten." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" -msgstr "" +msgstr "Bestaand apparaat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" -msgstr "" +msgstr "Hosts uitbreiden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Verwacht poortnummer." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" -msgstr "" +msgstr "Verwacht een hexadecimale toewijzingstip" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" -msgstr "" +msgstr "Verwacht een geldig IPv4-adres" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" +msgstr "Verwacht een geldig IPv6-adres" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" -msgstr "" +msgstr "Verwacht twee prioriteitswaarden gescheiden door een dubbele punt" #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:64 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" -msgstr "" +msgstr "Verwacht: %s" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:50 msgid "Expecting: non-empty value" -msgstr "" +msgstr "Verwachting: niet-lege waarde" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:50 msgid "Expires" -msgstr "" +msgstr "Verloopt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" +"Vervaltijd van gehuurde adressen, minimaal 2 minuten (2m)." #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:19 msgid "External" -msgstr "" +msgstr "Extern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" -msgstr "" +msgstr "Lijst met externe R0-sleutelhouders" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" -msgstr "" +msgstr "Lijst met externe R1-sleutelhouders" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167 msgid "External system log server" -msgstr "" +msgstr "Externe systeemlogserver" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:172 msgid "External system log server port" -msgstr "" +msgstr "Externe poort voor systeemlogserver" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:177 msgid "External system log server protocol" -msgstr "" +msgstr "Extern systeemlogserverprotocol" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:79 msgid "Extra SSH command options" -msgstr "" +msgstr "Extra SSH-opdrachtopties" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 msgid "Extra pppd options" -msgstr "" +msgstr "Extra pppd-opties" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "Extra sstpc options" -msgstr "" +msgstr "Extra sstpc-opties" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" -msgstr "" +msgstr "FT over DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" -msgstr "" +msgstr "FT via de ether" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" +msgstr "FT-protocol" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." -msgstr "" +msgstr "Kan het systeemwachtwoord niet wijzigen." + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Kan modem niet configureren" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +"Kan de toepassing niet bevestigen binnen %ds, wachtend op terugdraaien…" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Kan geen verbinding maken" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Kan de verbinding niet verbreken" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" +msgstr "Kan de actie \"/etc/init.d/%s\" niet uitvoeren: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Kan modeminformatie niet ophalen" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Kan modem niet initialiseren" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Kan de bedrijfsmodus niet instellen" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" -msgstr "" +msgstr "Bestand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" +"Bestandslijst upstream resolvers, optioneel domeinspecifiek, bijvoorbeeld " +"server=1.2.3.4, server=/domain/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" -msgstr "" +msgstr "Bestand niet toegankelijk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." -msgstr "" +msgstr "Bestand om DHCP-leasegegevens op te slaan." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." -msgstr "" +msgstr "Bestand met upstream resolvers." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" -msgstr "" +msgstr "Bestandsnaam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "" +"Bestandsnaam van het boot image dat aan de cliënten wordt geadverteerd." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:315 msgid "Filesystem" -msgstr "" +msgstr "Bestandssysteem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 -msgid "Filter private" -msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "IPv4 A-records filteren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "IPv6 AAAA-records filteren" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Filter SRV/SOA-servicedetectie" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" +msgstr "Filter privé" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" -msgstr "" +msgstr "Filteren voor alle slaves, geen validatie" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:390 msgid "Filtering for all slaves, validation only for active slave" -msgstr "" +msgstr "Filteren voor alle slaves, validatie alleen voor actieve slave" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:391 msgid "Filtering for all slaves, validation only for backup slaves" +msgstr "Filteren voor alle slaves, validatie alleen voor back-up slaves" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." msgstr "" +"Filtert SRV/SOA-servicedetectie om te voorkomen dat dial-on-demand-" +"koppelingen worden geactiveerd." #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" -msgstr "" +msgstr "Afronden mislukt" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 msgid "" "Find all currently attached filesystems and swap and replace configuration " "with defaults based on what was detected" msgstr "" +"Zoek alle momenteel aangesloten bestandssystemen en swap en vervang de " +"configuratie door standaardwaarden op basis van wat werd gedetecteerd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" -msgstr "" +msgstr "Zoek en word lid van het netwerk" #: modules/luci-compat/luasrc/view/cbi/delegator.htm:9 msgid "Finish" -msgstr "" +msgstr "Finish" #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:27 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:43 msgid "Firewall" -msgstr "" +msgstr "Firewall" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" -msgstr "" +msgstr "Firewall-markering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" -msgstr "" +msgstr "Firewall-instellingen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:326 msgid "Firewall Status" -msgstr "" +msgstr "Firewall-status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" -msgstr "" +msgstr "Firewall-markering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" -msgstr "" +msgstr "Firmware-bestand" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" -msgstr "" +msgstr "Firmware Versie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." -msgstr "" +msgstr "Vaste bronpoort voor uitgaande DNS-query's." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:312 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:449 msgid "Flash image..." -msgstr "" +msgstr "Flash image..." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:308 msgid "Flash image?" -msgstr "" +msgstr "Flash image?" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:439 msgid "Flash new firmware image" -msgstr "" +msgstr "Flash nieuwe firmware-image" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:384 msgid "Flash operations" -msgstr "" +msgstr "Flash operaties" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:317 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:319 msgid "Flashing…" +msgstr "Knipperen…" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" -msgstr "" +msgstr "Forceer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" -msgstr "" +msgstr "Forceer 40MHz-modus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" -msgstr "" +msgstr "Forceer CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" +"Forceer DHCP op dit netwerk, zelfs als er een andere server wordt " +"gedetecteerd." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" -msgstr "" +msgstr "Forceer IGMP-versie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" -msgstr "" +msgstr "Forceer MLD-versie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" -msgstr "" +msgstr "Forceer TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" +msgstr "Forceer TKIP en CCMP (AES)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" -msgstr "" +msgstr "Forceer koppeling" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:281 msgid "Force upgrade" -msgstr "" +msgstr "Upgrade afdwingen" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:90 msgid "Force use of NAT-T" -msgstr "" +msgstr "Forceer gebruik van NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" -msgstr "" +msgstr "Formuliertoken komt niet overeen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA messages between the " "designated master interface and downstream interfaces." msgstr "" +"Forward NDP NS en NA berichten tussen de " +"aangewezen masterinterface en downstream interfaces." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " "interfaces." msgstr "" +"Forward RA " +"berichten ontvangen op de aangewezen master interface door naar downstream " +"interfaces." #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:164 msgid "Forward DHCP traffic" -msgstr "" +msgstr "Forward DHCP-verkeer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" +"Forward DHCPV6 berichten tussen de ontworpen meester interface en stroom " +"interfaces." #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" -msgstr "" +msgstr "Forward broadcast verkeer" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" -msgstr "" +msgstr "Forward vertraging" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" -msgstr "" +msgstr "Forward mesh peer-verkeer" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" +"Forward multicast-pakketten door als unicast-pakketten op dit apparaat." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 -msgid "Forwarding mode" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 +msgid "Forwarding mode" +msgstr "Forward modus" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Fragmentatie" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" -msgstr "" +msgstr "Fragmentatiedrempel" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:62 msgctxt "nft nat flag fully-random" msgid "Full port randomization" -msgstr "" +msgstr "Volledige poort randomisatie" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:214 msgid "" "Further information about WireGuard interfaces and peers at wireguard.com." msgstr "" +"Meer informatie over WireGuard interfaces en peers op wireguard.com." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "GHz" -msgstr "" +msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" -msgstr "" +msgstr "Alleen GPRS" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:10 msgid "GRE tunnel over IPv4" -msgstr "" +msgstr "GRE-tunnel over IPv4" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:10 msgid "GRE tunnel over IPv6" -msgstr "" +msgstr "GRE-tunnel over IPv6" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:10 msgid "GRETAP tunnel over IPv4" -msgstr "" +msgstr "GRETAP-tunnel over IPv4" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:10 msgid "GRETAP tunnel over IPv6" -msgstr "" +msgstr "GRETAP-tunnel over IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" -msgstr "" +msgstr "Gateway" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Gateway-modus" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" -msgstr "" +msgstr "Gateway-poorten" #: modules/luci-base/htdocs/luci-static/resources/network.js:11 #: modules/luci-compat/luasrc/model/network.lua:29 msgid "Gateway address is invalid" -msgstr "" +msgstr "Gateway-adres is ongeldig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Algemene instellingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" -msgstr "" +msgstr "Algemene instellingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" -msgstr "" +msgstr "Algemene apparaatopties" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 msgid "Generate Config" -msgstr "" +msgstr "Configuratie genereren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" -msgstr "" +msgstr "Lokaal PMK genereren" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:396 msgid "Generate archive" -msgstr "" +msgstr "Archief genereren" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" -msgstr "" +msgstr "Genereer configuratie" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" -msgstr "" +msgstr "Configuratie genereren…" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:109 msgid "Generate new key pair" -msgstr "" +msgstr "Genereer een nieuw sleutelpaar" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" -msgstr "" +msgstr "Vooraf gedeelde sleutel genereren" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" +"Genereert een configuratie die geschikt is voor import op een WireGuard peer" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" -msgstr "" +msgstr "QR-code genereren…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:79 msgid "Given password confirmation did not match, password not changed!" msgstr "" +"Gegeven wachtwoordbevestiging kwam niet overeen, wachtwoord niet gewijzigd!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:146 msgid "Global Settings" -msgstr "" +msgstr "Algemene instellingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" -msgstr "" +msgstr "Wereldwijde netwerkopties" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." -msgstr "" +msgstr "Ga naar firmware-upgrade..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." -msgstr "" +msgstr "Ga naar wachtwoordconfiguratie..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" -msgstr "" +msgstr "Ga naar de relevante configuratiepagina" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" -msgstr "" +msgstr "Toegang verlenen tot DHCP-configuratie" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" -msgstr "" +msgstr "Toegang verlenen tot weergave van DHCP-status" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" -msgstr "" +msgstr "Toegang verlenen tot DSL-statusweergave" #: protocols/luci-proto-openconnect/root/usr/share/rpcd/acl.d/luci-openconnect.json:3 msgid "Grant access to LuCI OpenConnect procedures" -msgstr "" +msgstr "Toegang verlenen tot LuCI OpenConnect-procedures" #: protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json:3 msgid "Grant access to LuCI Wireguard procedures" -msgstr "" +msgstr "Toegang verlenen tot LuCI Wireguard-procedures" + +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Toegang verlenen tot LuCI openfortivpn procedures" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" -msgstr "" +msgstr "Toegang verlenen tot SSH-configuratie" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:12 msgid "Grant access to basic LuCI procedures" -msgstr "" +msgstr "Toegang verlenen tot basis LuCI-procedures" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:79 msgid "Grant access to crontab configuration" -msgstr "" +msgstr "Toegang verlenen tot crontab-configuratie" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:70 msgid "Grant access to firewall status" -msgstr "" +msgstr "Toegang verlenen tot de firewallstatus" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:132 msgid "Grant access to flash operations" -msgstr "" +msgstr "Toegang verlenen tot flashoperaties" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:3 msgid "Grant access to main status display" -msgstr "" +msgstr "Toegang verlenen tot hoofdstatusweergave" #: protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json:3 msgid "Grant access to mmcli" -msgstr "" +msgstr "Toegang verlenen tot mmcli" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:100 msgid "Grant access to mount configuration" -msgstr "" +msgstr "Toegang verlenen tot mount-configuratie" #: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:3 msgid "Grant access to network configuration" -msgstr "" +msgstr "Toegang verlenen tot netwerkconfiguratie" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" -msgstr "" +msgstr "Toegang verlenen tot hulpprogramma's voor netwerkdiagnose" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:36 msgid "Grant access to network status information" +msgstr "Toegang verlenen tot informatie over de netwerkstatus" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" msgstr "" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" -msgstr "" +msgstr "Toegang verlenen tot de processtatus" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:3 msgid "Grant access to realtime statistics" -msgstr "" +msgstr "Toegang verlenen tot realtime statistieken" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:47 msgid "Grant access to routing status" -msgstr "" +msgstr "Toegang verlenen tot routeringsstatus" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:57 msgid "Grant access to startup configuration" -msgstr "" +msgstr "Toegang verlenen tot opstartconfiguratie" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:3 msgid "Grant access to system configuration" -msgstr "" +msgstr "Toegang verlenen tot systeemconfiguratie" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:30 msgid "Grant access to system logs" -msgstr "" +msgstr "Toegang verlenen tot systeemlogboeken" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:43 msgid "Grant access to uHTTPd configuration" -msgstr "" +msgstr "Toegang verlenen tot uHTTPd-configuratie" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:61 msgid "Grant access to wireless channel status" -msgstr "" +msgstr "Toegang verlenen tot draadloze kanaalstatus" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" -msgstr "" +msgstr "Toegang verlenen tot weergave van draadloze status" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66 msgid "Group Password" -msgstr "" +msgstr "Groepswachtwoord" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:22 msgid "Guest" -msgstr "" +msgstr "Gast" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 msgid "HE.net password" -msgstr "" +msgstr "HE.net wachtwoord" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "HE.net username" -msgstr "" +msgstr "HE.net gebruikersnaam" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:64 msgid "HTTP(S) Access" -msgstr "" +msgstr "HTTP(S)-toegang" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:46 msgid "Hang Up" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" +msgstr "Ophangen" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" -msgstr "" +msgstr "Hartslaginterval (kernel: hartslag)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" -msgstr "" +msgstr "Hallo interval" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:114 msgid "" "Here you can configure the basic aspects of your device like its hostname or " "the timezone." msgstr "" +"Hier kunt u de basisaspecten van uw apparaat configureren, zoals de hostnaam " +"of de tijdzone." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" -msgstr "" +msgstr "Verberg ESSID" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:332 msgid "Hide empty chains" -msgstr "" +msgstr "Verberg lege reeks" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" -msgstr "" +msgstr "Hoog" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "Eer gratis ARP" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" -msgstr "" +msgstr "Haak: %h (%h), Prioriteit: %d" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Hop Penalty" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" -msgstr "" +msgstr "Host" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 msgid "Host expiry timeout" -msgstr "" +msgstr "Host verloopt time-out" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." -msgstr "" +msgstr "Host vraagt deze bestandsnaam aan bij de opstartserver." #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 msgid "Host-Uniq tag content" +msgstr "Host-Uniq tag inhoud" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" -msgstr "" +msgstr "Host naam" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:22 msgid "Hostname to send when requesting DHCP" -msgstr "" +msgstr "Hostnaam die moet worden verzonden bij het aanvragen van DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" -msgstr "" +msgstr "Hostnamen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " "useful to rebind an FQDN." msgstr "" +"Hostnamen worden gebruikt om een domeinnaam aan een IP-adres te binden. Deze " +"instelling is overbodig voor hostnamen die al zijn geconfigureerd met " +"statische leases, maar het kan handig zijn om een FQDN opnieuw te binden." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:19 msgid "How long (in milliseconds) the LED should be off" -msgstr "" +msgstr "Hoe lang (in milliseconden) de LED uit moet zijn" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:13 msgid "How long (in milliseconds) the LED should be on" -msgstr "" +msgstr "Hoe lang (in milliseconden) de LED moet branden" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 msgid "Human-readable counters" -msgstr "" +msgstr "Voor mensen leesbare tellers" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:24 msgid "Hybrid" -msgstr "" +msgstr "Hybride" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:49 msgctxt "nft icmp code" msgid "ICMP code" -msgstr "" +msgstr "ICMP-code" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:50 msgctxt "nft icmp type" msgid "ICMP type" -msgstr "" +msgstr "ICMP-type" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:51 msgctxt "nft icmpv6 code" msgid "ICMPv6 code" -msgstr "" +msgstr "ICMPv6-code" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:52 msgctxt "nft icmpv6 type" msgid "ICMPv6 type" -msgstr "" +msgstr "ICMPv6-type" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 msgid "ID used to uniquely identify the VXLAN" -msgstr "" +msgstr "ID gebruikt om de VXLAN uniek te identificeren" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:208 msgid "IEEE 802.3ad Dynamic link aggregation (802.3ad, 4)" -msgstr "" +msgstr "IEEE 802.3ad Dynamische linkaggregatie (802.3ad, 4)" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:75 msgid "IKE DH Group" +msgstr "IKE DH Groep" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" -msgstr "" +msgstr "IP-adressen" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" -msgstr "" +msgstr "IP-protocol" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" -msgstr "" +msgstr "IP-sets" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" -msgstr "" +msgstr "IP-type" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" -msgstr "" +msgstr "IP adres" #: modules/luci-base/htdocs/luci-static/resources/network.js:10 #: modules/luci-compat/luasrc/model/network.lua:28 msgid "IP address is invalid" -msgstr "" +msgstr "IP-adres is ongeldig" #: modules/luci-base/htdocs/luci-static/resources/network.js:13 #: modules/luci-compat/luasrc/model/network.lua:31 msgid "IP address is missing" -msgstr "" +msgstr "IP-adres ontbreekt" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " "packets with matching destination IP." msgstr "" +"IP-adressen die zijn toegestaan in de tunnel. De peer accepteert getunnelde " +"pakketten met bron-IP-adressen die aan deze lijst voldoen en routeert " +"pakketten met overeenkomende bestemmings-IP terug." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 msgctxt "nft ip protocol" msgid "IP protocol" -msgstr "" +msgstr "IP-protocol" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" -msgstr "" +msgstr "IP-protocol" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" -msgstr "" +msgstr "IP-set" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" -msgstr "" +msgstr "IP-sets" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" -msgstr "" +msgstr "IP's om te overschrijven met NXDOMAIN" #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:9 msgid "IPsec XFRM" -msgstr "" +msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" -msgstr "" +msgstr "IPv4" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:351 msgid "IPv4 Firewall" -msgstr "" +msgstr "IPv4-firewall" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:252 msgid "IPv4 Neighbours" -msgstr "" +msgstr "IPv4-buren" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:251 msgid "IPv4 Routing" -msgstr "" +msgstr "IPv4-routering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" -msgstr "" +msgstr "IPv4-regels" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 msgid "IPv4 Upstream" -msgstr "" +msgstr "IPv4 Upstream" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" -msgstr "" +msgstr "IPv4-adres" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:29 msgid "IPv4 assignment length" -msgstr "" +msgstr "IPv4-toewijzingslengte" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:181 msgid "IPv4 broadcast" -msgstr "" +msgstr "IPv4 broadcast" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:180 msgid "IPv4 gateway" -msgstr "" +msgstr "IPv4 gateway" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:179 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:170 msgid "IPv4 netmask" -msgstr "" +msgstr "IPv4 netmask" #: modules/luci-base/htdocs/luci-static/resources/validation.js:305 msgid "IPv4 network in address/netmask notation" -msgstr "" +msgstr "IPv4-netwerk in adres-/netmaskernotatie" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" -msgstr "" +msgstr "Alleen IPv4" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:52 msgid "IPv4 prefix" -msgstr "" +msgstr "IPv4 prefix" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 msgid "IPv4 prefix length" -msgstr "" +msgstr "IPv4-prefixlengte" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" -msgstr "" +msgstr "IPv4-verkeerstabel \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" -msgstr "" +msgstr "IPv4+IPv6" #: modules/luci-compat/luasrc/model/network/proto_ipip.lua:9 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:10 msgid "IPv4-in-IPv4 (RFC2003)" -msgstr "" +msgstr "IPv4-in-IPv4 (RFC2003)" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" -msgstr "" +msgstr "IPv4/IPv6 (beide - standaard ingesteld op IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" -msgstr "" +msgstr "IPv4/IPv6-verkeerstabel \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3589,167 +4223,182 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" -msgstr "" +msgstr "IPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:354 msgid "IPv6 Firewall" -msgstr "" +msgstr "IPv6 Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" -msgstr "" +msgstr "IPv6 MTU" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:262 msgid "IPv6 Neighbours" +msgstr "IPv6-buren" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" -msgstr "" +msgstr "IPv6 RA-instellingen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:261 msgid "IPv6 Routing" -msgstr "" +msgstr "IPv6-routering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" -msgstr "" +msgstr "IPv6-regels" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" -msgstr "" +msgstr "IPv6-instellingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" -msgstr "" +msgstr "IPv6 ULA-Prefix" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 msgid "IPv6 Upstream" -msgstr "" +msgstr "IPv6 Upstream" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:183 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:58 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:135 msgid "IPv6 address" -msgstr "" +msgstr "IPv6-adres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" -msgstr "" +msgstr "IPv6 toewijzing hint" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" -msgstr "" +msgstr "IPv6-toewijzingslengte" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:188 msgid "IPv6 gateway" -msgstr "" +msgstr "IPv6-gateway" #: modules/luci-base/htdocs/luci-static/resources/validation.js:310 msgid "IPv6 network in address/netmask notation" -msgstr "" +msgstr "IPv6-netwerk in adres-/netmaskernotatie" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" -msgstr "" +msgstr "Alleen IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" -msgstr "" +msgstr "IPv6-voorkeur" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "IPv6 prefix" -msgstr "" +msgstr "IPv6 prefix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" -msgstr "" +msgstr "IPv6 prefix filter" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 msgid "IPv6 prefix length" -msgstr "" +msgstr "IPv6-prefixlengte" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 msgid "IPv6 routed prefix" -msgstr "" +msgstr "IPv6 gerouteerde prefix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" -msgstr "" +msgstr "IPv6-bronroutering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"IPv6-Achtervoegsel (hex)" +msgstr "IPv6 suffix" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" -msgstr "" +msgstr "IPv6-ondersteuning" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" -msgstr "" +msgstr "IPv6-verkeerstabel \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:101 msgid "IPv6-PD" +msgstr "IPv6-PD" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" -msgstr "" +msgstr "IPv6-in-IPv4 (RFC4213)" #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:17 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:9 msgid "IPv6-over-IPv4 (6rd)" -msgstr "" +msgstr "IPv6-over-IPv4 (6rd)" #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:15 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:9 msgid "IPv6-over-IPv4 (6to4)" -msgstr "" +msgstr "IPv6-over-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" +msgstr "Identiteit" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." msgstr "" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" -msgstr "" +msgstr "Indien aangevinkt, is 1DES ingeschakeld" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "If checked, adds \"+ipv6\" to the pppd options" -msgstr "" +msgstr "Indien aangevinkt, voegt \"+ipv6\" toe aan de pppd-opties" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 msgid "If checked, encryption is disabled" -msgstr "" +msgstr "Indien aangevinkt, is versleuteling uitgeschakeld" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" +"Indien ingesteld, worden downstream-subnetten alleen toegewezen uit de " +"gegeven IPv6-prefix klassen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" +"Indien ingesteld, wordt de betekenis van de overeenkomstopties omgekeerd" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 msgid "" "If specified, mount the device by its UUID instead of a fixed device node" msgstr "" +"Indien opgegeven, koppelt u het apparaat via de UUID in plaats van een vast " +"apparaatknooppunt" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:268 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:377 @@ -3757,25 +4406,34 @@ msgid "" "If specified, mount the device by the partition label instead of a fixed " "device node" msgstr "" +"Indien opgegeven, koppelt u het apparaat aan de hand van het partitielabel " +"in plaats van een vast apparaatknooppunt" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" +"Als het IP-adres dat wordt gebruikt om toegang te krijgen tot LuCI " +"verandert, is een handmatige herverbinding met het nieuwe IP vereist binnen %d seconden om de instellingen te bevestigen, anders " +"worden wijzigingen teruggedraaid." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" -msgstr "" +msgstr "Indien niet aangevinkt, is er geen standaardroute geconfigureerd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" +"Indien niet aangevinkt, worden de geadverteerde DNS-serveradressen genegeerd" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 msgid "" @@ -3785,66 +4443,100 @@ msgid "" "very slow process as the swap-device cannot be accessed with the high " "datarates of the RAM." msgstr "" +"Als uw fysieke geheugen onvoldoende is, kunnen ongebruikte gegevens " +"tijdelijk worden verwisseld naar een swap-apparaat, wat resulteert in een " +"grotere hoeveelheid bruikbare RAM. Houd er rekening mee dat het verwisselen van gegevens een zeer " +"langzaam proces is, omdat het swap-apparaat niet toegankelijk is met de hoge " +"gegevenssnelheden van de RAM ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 -msgid "Ignore /etc/hosts" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +msgid "Ignore /etc/hosts" +msgstr "Negeer /etc/hosts" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" +msgstr "Negeer interface" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" -msgstr "" +msgstr "Negeer het resolv-bestand" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:447 msgid "Image" -msgstr "" +msgstr "Afbeelding" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:273 msgid "Image check failed:" -msgstr "" +msgstr "Beeldcontrole mislukt:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" -msgstr "" +msgstr "Importeren als peer" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" -msgstr "" +msgstr "Configuratie importeren" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" -msgstr "" +msgstr "Configuratie importeren als peer…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" -msgstr "" +msgstr "Instellingen importeren" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" -msgstr "" +msgstr "Geïmporteerde peer-configuratie" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 msgid "Imports settings from an existing WireGuard configuration file" -msgstr "" +msgstr "Importeert instellingen uit een bestaand WireGuard-configuratiebestand" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:68 msgid "In" +msgstr "In" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." msgstr "" +"In gebridgede LAN-opstellingen is het raadzaam om de bruglusvermijding in te " +"schakelen om broadcastlussen te vermijden die het hele LAN tot stilstand " +"kunnen brengen." -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" +"Om onbevoegde toegang tot het systeem te voorkomen, is uw verzoek " +"geblokkeerd. Klik hieronder op \"Doorgaan »\" om terug te keren naar de " +"vorige pagina." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" -msgstr "" +msgstr "In seconden" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:156 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 @@ -3853,110 +4545,128 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:101 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:124 msgid "Inactivity timeout" -msgstr "" +msgstr "Time-out bij inactiviteit" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:267 msgid "Inbound:" -msgstr "" +msgstr "Inkomend:" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:262 msgid "" "Include in backup a list of current installed packages at /etc/backup/" "installed_packages.txt" msgstr "" +"Neem in de back-up een lijst op met de huidige geïnstalleerde pakketten op /" +"etc/backup/installed_packages.txt" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:100 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:105 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:107 msgid "Incoming checksum" -msgstr "" +msgstr "Inkomende controlesom" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" -msgstr "" +msgstr "Inkomende interface" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" -msgstr "" +msgstr "Inkomende sleutel" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:107 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:104 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:109 msgid "Incoming serialization" -msgstr "" +msgstr "Inkomende serialisatie" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:187 msgid "Info" -msgstr "" +msgstr "Info" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 msgid "Information" msgstr "Informatie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" -msgstr "" +msgstr "Ingaande QoS-mapping" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" -msgstr "" +msgstr "Ingangsapparaat id" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" -msgstr "" +msgstr "Ingangsapparaat naam" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" -msgstr "" +msgstr "Initialisatie mislukt" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:77 msgid "Initscript" -msgstr "" +msgstr "Initscript" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:111 msgid "Initscripts" -msgstr "" +msgstr "Initscripten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" -msgstr "" +msgstr "Innerlijke certificaatbeperking (domein)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" -msgstr "" +msgstr "Innerlijke certificaatbeperking (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" -msgstr "" +msgstr "Innerlijke certificaatbeperking (Onderwerp)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" -msgstr "" +msgstr "Innerlijke certificaatbeperking (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." -msgstr "" +msgstr "Protocoluitbreidingen installeren..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" -msgstr "" +msgstr "Voorbeeld" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Instantie \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Instantie details" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." msgstr "" +"In plaats van verbinding te maken met een netwerk met een overeenkomende " +"SSID, maakt u alleen verbinding met de BSSID %h." #: modules/luci-compat/luasrc/view/cbi/map.htm:43 msgid "Insufficient permissions to read UCI configuration." +msgstr "Onvoldoende machtigingen om UCI-configuratie te lezen." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 @@ -3964,252 +4674,301 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 msgid "Interface" -msgstr "" +msgstr "Interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." -msgstr "" +msgstr "Interface \"%h\" is al gemarkeerd als aangewezen master." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:62 msgid "Interface %q device auto-migrated from %q to %q." -msgstr "" +msgstr "Interface %q apparaat automatisch gemigreerd van %q naar %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" -msgstr "" +msgstr "Interface configuratie" #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:39 msgid "Interface ID" -msgstr "" +msgstr "Interface-ID" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:151 msgid "Interface has %d pending changes" -msgstr "" +msgstr "Interface heeft %d wijzigingen in behandeling" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:92 msgid "Interface is disabled" -msgstr "" +msgstr "Interface is uitgeschakeld" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:65 msgid "Interface is marked for deletion" -msgstr "" +msgstr "Interface is gemarkeerd voor verwijdering" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:210 msgid "Interface is reconnecting..." -msgstr "" +msgstr "Interface is opnieuw verbinden..." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:194 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:204 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:210 msgid "Interface is shutting down..." -msgstr "" +msgstr "Interface wordt afgesloten..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." -msgstr "" +msgstr "Interface start..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." -msgstr "" +msgstr "Interface stopt..." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 msgid "Interface name" -msgstr "" +msgstr "Interface naam" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." -msgstr "" +msgstr "Interface niet aanwezig of nog niet aangesloten." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" -msgstr "" +msgstr "Interfaces" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:20 msgid "Internal" +msgstr "Intern" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" -msgstr "" +msgstr "Interval voor het verzenden van leerpakketten" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" +"Interval in centiseconden tussen algemene multicast-query's. Door de waarde " +"te variëren, kan een beheerder het aantal IGMP-berichten op het subnet " +"afstemmen. grotere waarden zorgen ervoor dat IGMP-query's minder vaak worden " +"verzonden" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" -msgstr "" +msgstr "Interval in seconden voor STP hello-pakketten" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:192 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:42 msgid "Invalid" -msgstr "" +msgstr "Ongeldig" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" -msgstr "" +msgstr "Ongeldige APN verstrekt" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:37 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:40 msgid "Invalid Base64 key string" -msgstr "" +msgstr "Ongeldige Base64-sleutelreeks" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Ongeldig IPv6-adres" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" -msgstr "" +msgstr "Ongeldige TOS-waarde, verwachte 00..FF of overnemen" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:83 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:88 msgid "Invalid Traffic Class value, expected 00..FF or inherit" -msgstr "" +msgstr "Ongeldige waarde voor verkeersklasse, verwacht 00..FF of overnemen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:285 msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." msgstr "" +"Ongeldige VLAN ID gegeven! Alleen ID's tussen %d en %d zijn toegestaan." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:294 msgid "Invalid VLAN ID given! Only unique IDs are allowed" -msgstr "" +msgstr "Ongeldige VLAN ID gegeven! Alleen unieke ID's zijn toegestaan" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:403 msgid "Invalid argument" -msgstr "" +msgstr "Ongeldig argument" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." msgstr "" +"Ongeldige dragerslijst. Mogelijk zijn er te veel dragers gemaakt. Dit " +"protocol ondersteunt één en slechts één drager." #: modules/luci-base/htdocs/luci-static/resources/rpc.js:402 msgid "Invalid command" -msgstr "" +msgstr "Ongeldig commando" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:205 msgid "Invalid hexadecimal value" -msgstr "" +msgstr "Ongeldige hexadecimale waarde" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Ongeldige hostnaam of IPv4-adres" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Ongeldige poort" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "Ongeldige server-URL" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." -msgstr "" +msgstr "Ongeldige gebruikersnaam en/of wachtwoord! Probeer het opnieuw." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Omgekeerd knipperen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" -msgstr "" +msgstr "Overeenkomst omkeren" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "Is primair VLAN" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" -msgstr "" +msgstr "Isoleer klanten" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:236 msgid "" "It appears that you are trying to flash an image that does not fit into the " "flash memory, please verify the image file!" msgstr "" +"Het lijkt erop dat u een image probeert te flashen die niet in het flash " +"geheugen past, controleer het image bestand!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" -msgstr "" +msgstr "JavaScript vereist!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" -msgstr "" +msgstr "Word lid van netwerk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" -msgstr "" +msgstr "Word lid van netwerk: draadloos scannen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" -msgstr "" +msgstr "Lid worden van netwerk: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" -msgstr "" +msgstr "Ga naar regel" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:228 msgid "Keep settings and retain the current configuration" -msgstr "" +msgstr "Instellingen behouden en de huidige configuratie behouden" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "In leven houden (Keep-Alive)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" -msgstr "" +msgstr "Kernel-logboek" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" -msgstr "" +msgstr "Kernel Versie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" -msgstr "" +msgstr "Sleutel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" -msgstr "" +msgstr "Sleutel #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." -msgstr "" +msgstr "Sleutel voor inkomende pakketten (optioneel)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:96 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." -msgstr "" +msgstr "Sleutel voor uitgaande pakketten (optioneel)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" -msgstr "" +msgstr "Sleutel ontbreekt" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Sleutel gebruikt om netwerkconfiguratie te ondertekenen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" -msgstr "" +msgstr "KiB" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:54 msgid "Kill" -msgstr "" +msgstr "verbannen" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:21 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:10 msgid "L2TP" -msgstr "" +msgstr "L2TP" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:40 msgid "L2TP Server" -msgstr "" +msgstr "L2TP-server" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:269 msgid "LACPDU Packets" -msgstr "" +msgstr "LACPDU-pakketten" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:130 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:102 @@ -4218,7 +4977,7 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:75 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:98 msgid "LCP echo failure threshold" -msgstr "" +msgstr "LCP-echofoutdrempel" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:143 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 @@ -4227,140 +4986,153 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:88 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:111 msgid "LCP echo interval" -msgstr "" +msgstr "LCP echo interval" #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:115 msgid "LED Configuration" -msgstr "" +msgstr "LED-configuratie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" -msgstr "" +msgstr "LLC" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:268 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:377 msgid "Label" -msgstr "" +msgstr "Label" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:225 msgid "Language" -msgstr "" +msgstr "Taal" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:125 msgid "Language and Style" +msgstr "Taal en stijl" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." msgstr "" +"Grotere gewichten (van dezelfde prio) krijgen een verhoudingsgewijs grotere " +"kans om geselecteerd te worden." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" -msgstr "" +msgstr "Interval laatste lid" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Laatste handdruk" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" -msgstr "" +msgstr "Blad" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" -msgstr "" +msgstr "Leren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" -msgstr "" +msgstr "Leer routes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" -msgstr "" +msgstr "Lease bestand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" -msgstr "" +msgstr "Lease tijd" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:41 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:60 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:90 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:137 msgid "Lease time remaining" -msgstr "" +msgstr "Resterende leasetijd" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 msgid "Leave empty to autodetect" -msgstr "" +msgstr "Leeg laten om automatisch te detecteren" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:40 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:45 msgid "Leave empty to use the current WAN address" -msgstr "" +msgstr "Leeg laten om het huidige WAN-adres te gebruiken" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" +"Voor verouderde of zich slecht gedragende apparaten kunnen verouderde " +"802.11b-snelheden nodig zijn om te kunnen samenwerken. Waar deze worden " +"gebruikt, kan de airtime-efficiëntie aanzienlijk afnemen. Aanbevolen wordt " +"waar mogelijk geen 802.11b-snelheden toe te staan." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" -msgstr "" +msgstr "Verouderde regels gedetecteerd" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" -msgstr "" +msgstr "Legende:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" +msgstr "Limiet" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" -msgstr "" +msgstr "Lijnmodus" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" -msgstr "" +msgstr "Lijn staat" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" -msgstr "" +msgstr "Line-uptime" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:125 msgid "Link Aggregation (Channel Bonding)" -msgstr "" +msgstr "Link Aggregation (Channel Bonding)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:349 msgid "Link Monitoring" -msgstr "" +msgstr "Linkbewaking" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:24 msgid "Link On" -msgstr "" +msgstr "Link op" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:77 msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" -msgstr "" +msgstr "Headerbits van de linklaag %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." -msgstr "" +msgstr "Lijst met IP-adressen die moeten worden omgezet in NXDOMAIN-reacties." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" +"Lijst van IP-reeksen die moeten worden gevuld met de IP's van DNS-" +"opzoekresultaten van de FQDN's die ook hier zijn gespecificeerd." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4368,8 +5140,13 @@ msgid "" "from the R0KH that the STA used during the Initial Mobility Domain " "Association." msgstr "" +"Lijst van R0KH's in hetzelfde Mobiliteitsdomein.
    Formaat: MAC-adres, " +"NAS-Identifier, 128-bit sleutel als hex-string.
    Deze lijst wordt " +"gebruikt om de R0KH-ID (NAS-Identifier) aan een bestemmings-MAC-adres toe te " +"wijzen bij het aanvragen van de PMK-R1-sleutel van de R0KH die de STA heeft " +"gebruikt tijdens de initiële associatie met het mobiliteitsdomein." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4377,94 +5154,102 @@ msgid "" "R0KH. This is also the list of authorized R1KHs in the MD that can request " "PMK-R1 keys." msgstr "" +"Lijst van R1KH's in hetzelfde Mobiliteitsdomein.
    Formaat: MAC-adres, " +"R1KH-ID als 6 octetten met dubbele punten, 128-bit sleutel als hex-string. " +"
    Deze lijst wordt gebruikt om R1KH-ID aan een bestemmings MAC-adres te " +"koppelen bij het verzenden van PMK-R1-sleutel van de R0KH. Dit is ook de " +"lijst van geautoriseerde R1KH's in de MD die PMK-R1-sleutels kunnen " +"aanvragen." #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:82 msgid "List of SSH key files for auth" -msgstr "" +msgstr "Lijst met SSH-sleutelbestanden voor authenticatie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" +msgstr "Lijst met domeinen waarvoor RFC1918-reacties moeten worden toegestaan." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." -msgstr "" +msgstr "Lijst met upstream-resolvers om query's naar fordward." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" -msgstr "" +msgstr "Luisterpoort" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" -msgstr "" +msgstr "Luister interfaces" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" +"Luister alleen op de gegeven interface of, indien niet gespecificeerd, op " +"alle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." msgstr "" +"Luister alleen op de gespecificeerde interfaces, en loopback indien niet " +"expliciet uitgesloten." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:299 msgid "ListenPort setting is invalid" -msgstr "" +msgstr "Luisterpoort-instelling is ongeldig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." -msgstr "" +msgstr "Luisterpoort voor inkomende DNS-query's." #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:130 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:54 msgid "Load" -msgstr "" +msgstr "Lading" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" -msgstr "" +msgstr "Gemiddelde laden" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:189 msgid "Load configuration…" -msgstr "" +msgstr "Configuratie laden…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" -msgstr "" +msgstr "Data laden…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" -msgstr "" +msgstr "Mapinhoud laden…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" -msgstr "" +msgstr "Weergave laden…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" -msgstr "" +msgstr "Lokaal" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" -msgstr "" +msgstr "Lokaal IP-adres" #: modules/luci-base/htdocs/luci-static/resources/network.js:12 #: modules/luci-compat/luasrc/model/network.lua:30 msgid "Local IP address is invalid" -msgstr "" +msgstr "Lokaal IP-adres is ongeldig" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:86 msgid "Local IP address to assign" -msgstr "" +msgstr "Lokaal IP-adres om toe te wijzen" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 @@ -4473,13 +5258,14 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" -msgstr "" +msgstr "Lokaal IPv4-adres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" -msgstr "" +msgstr "Lokale IPv6 DNS-server" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:53 @@ -4487,60 +5273,86 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:45 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 msgid "Local IPv6 address" -msgstr "" +msgstr "Lokaal IPv6-adres" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:115 msgid "Local Startup" -msgstr "" +msgstr "Lokaal opstart" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" -msgstr "" +msgstr "Lokale tijd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" -msgstr "" +msgstr "Lokale ULA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" -msgstr "" +msgstr "Lokaal domein" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." -msgstr "" +msgstr "Lokaal domeinsuffix toegevoegd aan DHCP namen en hosts file entries." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" -msgstr "" +msgstr "Lokale server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" -msgstr "" +msgstr "Alleen lokale service" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Lokale wireguard-sleutel" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" +msgstr "Query's lokaliseren" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" -msgstr "" +msgstr "Vergrendelen op BSSID" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Loggebeurtenis \"%h…\"" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Inloggen" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Inloggen…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Uitloggen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" -msgstr "" +msgstr "Uitvoerniveau voor logboeken" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" -msgstr "" +msgstr "Query's logboek" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:123 msgid "Logging" -msgstr "" +msgstr "Logboekregistratie" #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:23 msgid "Logging in…" -msgstr "" +msgstr "Inloggen…" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 @@ -4548,203 +5360,217 @@ msgid "" "Logical network from which to select the local endpoint if local IPv6 " "address is empty and no WAN IPv6 is available (optional)." msgstr "" +"Logisch netwerk van waaruit het lokale eindpunt moet worden geselecteerd als " +"het lokale IPv6-adres leeg is en er geen WAN IPv6 beschikbaar is (optioneel)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" +"Logisch netwerk waaraan de tunnel wordt toegevoegd (overbrugd) (optioneel)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "" +msgstr "Losse filtering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." -msgstr "" +msgstr "Laagste gehuurde adres als offset van het netwerkadres." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Lua-compatibiliteitsmodus actief" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" -msgstr "" +msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" -msgstr "" +msgstr "MAC-adres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" -msgstr "" +msgstr "MAC-adresfilter" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:253 msgid "MAC Address For The Actor" -msgstr "" +msgstr "MAC-adres voor de acteur" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" -msgstr "" +msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:179 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:205 msgid "MAC address" +msgstr "MAC-adres" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" -msgstr "" +msgstr "MAC-filter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" -msgstr "" +msgstr "MAC-Lijst" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:16 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:13 msgid "MAP / LW4over6" -msgstr "" +msgstr "KAART / LW4over6" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:62 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:7 msgid "MAP rule is invalid" -msgstr "" +msgstr "MAP-regel is ongeldig" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "MBIM mobiel" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" -msgstr "" +msgstr "MD5" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:28 msgid "MHz" -msgstr "" +msgstr "MHz" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:354 msgid "MII" -msgstr "" +msgstr "MII" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:422 msgid "MII / ETHTOOL ioctls" -msgstr "" +msgstr "MII / ETHTOOL ioctls" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:395 msgid "MII Interval" -msgstr "" +msgstr "MII-interval" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" -msgstr "" +msgstr "MTU" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " "below:" msgstr "" +"Zorg ervoor dat u het rootbestandssysteem kloont met zoiets als de " +"onderstaande opdrachten:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:58 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:71 msgid "Manual" +msgstr "Handmatig" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" -msgstr "" +msgstr "Meester" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" +msgstr "Max RA interval" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" -msgstr "" -"Max. DHCP toewijzingen" +msgstr "Max. DHCP toewijzingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" -msgstr "" -"Max. EDNS0 packetgrootte" +msgstr "Max. EDNS0 pakketgrootte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" -msgstr "Max. gelijktijdige verzoeken" +msgstr "Max. gelijktijdige verzoeken" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" -msgstr "" +msgstr "Maximum leeftijd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" -msgstr "" +msgstr "Maximaal toegestaan luisterinterval" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." -msgstr "" +msgstr "Maximaal toegestaan aantal actieve DHCP-leases." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." -msgstr "" +msgstr "Maximaal toegestaan aantal gelijktijdige DNS-query's." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." -msgstr "" +msgstr "Maximaal toegestane grootte van EDNS0 UDP-pakketten." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" -msgstr "" +msgstr "Maximum aantal seconden om te wachten tot de modem klaar is" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." -msgstr "" +msgstr "Maximum aantal gehuurde adressen." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" -msgstr "" +msgstr "Maximale grootte van de snuffeltafel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" +"Maximale toegestane tijd tussen het verzenden van ongevraagde RA. Standaard is 600 " +"seconden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" -msgstr "" +msgstr "Maximaal zendvermogen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Kan voorkomen dat VoIP of andere services werken." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 @@ -4758,447 +5584,516 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:330 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:331 msgid "Mbit/s" -msgstr "" +msgstr "Mbit/s" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 msgid "Medium" -msgstr "" +msgstr "Medium" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:24 msgid "Memory" -msgstr "" +msgstr "Geheugen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:73 msgid "Memory usage (%)" -msgstr "" +msgstr "Geheugengebruik (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" -msgstr "" +msgstr "Mesh" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 msgid "Mesh ID" -msgstr "" +msgstr "Mesh-ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" -msgstr "" +msgstr "Mesh-ID" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Mesh Routing" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Mesh- en routeringsgerelateerde opties" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" -msgstr "" +msgstr "Methode niet gevonden" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:350 msgid "Method of link monitoring" -msgstr "" +msgstr "Methode van linkbewaking" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:419 msgid "Method to determine link status" -msgstr "" +msgstr "Methode om de linkstatus te bepalen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" -msgstr "" +msgstr "Metrisch" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:70 msgctxt "nft unit" msgid "MiB" -msgstr "" +msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" -msgstr "" +msgstr "Min RA interval" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" -msgstr "" +msgstr "Minimum ARP-geldigheidstijd" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:237 msgid "Minimum Number of Links" -msgstr "" +msgstr "Minimum aantal links" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" +"Minimum vereiste tijd in seconden voordat een ARP-vermelding kan worden " +"vervangen. Voorkomt ARP cache thrashing." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." msgstr "" +"Minimum toegestane tijd tussen het verzenden van ongevraagde RA. Standaard is 200 " +"seconden." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:204 msgid "Mirror monitor port" -msgstr "" +msgstr "Spiegel monitor poort" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:203 msgid "Mirror source port" +msgstr "Spiegel bronpoort" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" +msgstr "Mobiele data" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 -msgid "Mobility Domain" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 +msgid "Mobility Domain" +msgstr "Mobiliteitsdomein" + #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" -msgstr "" +msgstr "Modus" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" -msgstr "" +msgstr "Model" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." -msgstr "" +msgstr "Modemverbinding bezig. Even geduld aub. Dit proces stopt na 2 minuten." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" -msgstr "" +msgstr "Modem standaard" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" +msgstr "Modem apparaat" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" -msgstr "" +msgstr "Het opvragen van modemgegevens is mislukt" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" +msgstr "Modem init time-out" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" -msgstr "" +msgstr "ModemManager" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" -msgstr "" +msgstr "Monitor" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 msgid "More Characters" -msgstr "" +msgstr "Meer karakters" #: modules/luci-base/htdocs/luci-static/resources/form.js:2581 msgid "More…" -msgstr "" +msgstr "Meer…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:192 msgid "Mount Point" -msgstr "" +msgstr "Koppelen punt" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:144 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:102 msgid "Mount Points" -msgstr "" +msgstr "Mount punten" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:229 msgid "Mount Points - Mount Entry" -msgstr "" +msgstr "Mount-punten - Mount-invoer" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:341 msgid "Mount Points - Swap Entry" -msgstr "" +msgstr "Mount-punten - Swap-invoer" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 msgid "" "Mount Points define at which point a memory device will be attached to the " "filesystem" msgstr "" +"Mount punten definiëren op welk punt een geheugenapparaat aan het " +"bestandssysteem wordt gekoppeld" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 msgid "Mount attached devices" -msgstr "" +msgstr "Bevestig aangesloten apparaten" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 msgid "Mount filesystems not specifically configured" -msgstr "" +msgstr "Mount bestandssystemen die niet specifiek zijn geconfigureerd" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:332 msgid "Mount options" -msgstr "" +msgstr "Mount opties" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 msgid "Mount point" -msgstr "" +msgstr "Mount punt" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 msgid "Mount swap not specifically configured" -msgstr "" +msgstr "Mount swap niet specifiek geconfigureerd" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:223 msgid "Mounted file systems" -msgstr "" +msgstr "Aangekoppelde bestandssystemen" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 msgid "Move down" -msgstr "" +msgstr "Naar beneden" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 msgid "Move up" -msgstr "" +msgstr "Naar boven" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Multi naar Unicast" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:96 msgid "Multicast" -msgstr "" +msgstr "Multicast" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Multicast-modus" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" -msgstr "" +msgstr "Multicast-routering" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" -msgstr "" +msgstr "Multicast naar unicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" -msgstr "" +msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" -msgstr "" +msgstr "NAT-actieketen \"%h\"" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:87 msgid "NAT-T Mode" -msgstr "" +msgstr "NAT-T modus" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 msgid "NAT64 Prefix" +msgstr "NAT64 Prefix" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" -msgstr "" +msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" -msgstr "" +msgstr "NDP-Proxy slaaf" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:72 msgid "NT Domain" -msgstr "" +msgstr "NT-domein" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:300 msgid "NTP server candidates" -msgstr "" +msgstr "NTP-server kandidaten" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Naam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" -msgstr "" +msgstr "Naam van het nieuwe netwerk" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Naam van het tunnelapparaat" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" -msgstr "" +msgstr "Navigatie" #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:10 msgid "Nebula Network" -msgstr "" +msgstr "Nebula Netwerk" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Burenrapport" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" -msgstr "" +msgstr "Geldigheid van buurcache" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:186 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:212 msgid "Network" -msgstr "" +msgstr "Netwerk" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Netwerkcodering" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" -msgstr "" +msgstr "Netwerkmodus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" +msgstr "Netwerk SSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" -msgstr "" +msgstr "Netwerkadres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" -msgstr "" +msgstr "Netwerk opstart image" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" -msgstr "" +msgstr "Migratie van netwerkbrugconfiguratie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" -msgstr "" +msgstr "Netwerkapparaat" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:7 msgid "Network device activity (kernel: netdev)" -msgstr "" +msgstr "Netwerkapparaatactiviteit (kernel: netdev)" #: modules/luci-base/htdocs/luci-static/resources/network.js:15 #: modules/luci-compat/luasrc/model/network.lua:33 msgid "Network device is not present" -msgstr "" +msgstr "Netwerkapparaat is niet aanwezig" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" -msgstr "" +msgstr "Netwerkapparaattabel \"%h\"" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:78 msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" -msgstr "" +msgstr "Netwerk header bits %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" -msgstr "" +msgstr "Migratie van netwerk-ifname-configuratie" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 msgid "Network interface" -msgstr "" +msgstr "Netwerkinterface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" -msgstr "" +msgstr "Netwerk-ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" -msgstr "" +msgstr "Nooit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Nooit" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" +"Nooit overeenkomende domeinen en subdomeinen forward, alleen oplossen via " +"DHCP of hosts-bestanden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" -msgstr "" +msgstr "Nieuwe interface voor \"%s\" kan niet worden gemaakt: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" -msgstr "" +msgstr "Nieuwe interfacenaam…" #: modules/luci-compat/luasrc/view/cbi/delegator.htm:11 msgid "Next »" -msgstr "" +msgstr "Volgende »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" -msgstr "" +msgstr "Nee" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" -msgstr "" +msgstr "Geen DHCP-server geconfigureerd voor deze interface" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:202 msgid "No Data" -msgstr "" +msgstr "Geen gegevens" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" -msgstr "" +msgstr "Geen versleuteling" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:185 msgid "No Host Routes" -msgstr "" +msgstr "Geen hostroutes" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:89 msgid "No NAT-T" -msgstr "" +msgstr "Geen NAT-T" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 msgid "No RX signal" +msgstr "Geen RX-signaal" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Geen WireGuard interfaces geconfigureerd." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " "mode should only be used to install a firmware upgrade" msgstr "" +"Er worden geen wijzigingen in de instellingen opgeslagen en gaan verloren na " +"het opnieuw opstarten. Deze modus mag alleen worden gebruikt om een firmware-" +"upgrade te installeren" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:69 msgid "No client associated" -msgstr "" +msgstr "Geen klant gekoppeld" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Geen bedieningsapparaat opgegeven" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" -msgstr "" +msgstr "Geen gegevens" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:406 msgid "No data received" -msgstr "" +msgstr "Geen gegevens ontvangen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" -msgstr "" +msgstr "Geen handhaving" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:229 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:232 @@ -5207,21 +6102,19 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:241 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:244 msgid "No entries available" -msgstr "" +msgstr "Geen inzendingen beschikbaar" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" -msgstr "" - -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "" +msgstr "Geen vermeldingen in deze map" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" msgstr "" +"Geen vaste interface-luisterpoort gedefinieerd, peers kunnen mogelijk geen " +"verbindingen tot stand brengen met deze WireGuard-instantie!" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 @@ -5229,69 +6122,79 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:70 msgid "No host route" -msgstr "" +msgstr "Geen hostroute" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 msgid "No information available" -msgstr "" +msgstr "Geen informatie beschikbaar" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:63 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:8 msgid "No matching prefix delegation" -msgstr "" +msgstr "Geen overeenkomende prefix delegatie" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:142 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:145 msgid "No more slaves available" -msgstr "" +msgstr "Geen slaven meer beschikbaar" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:189 msgid "No more slaves available, can not save interface" -msgstr "" +msgstr "Geen slaves meer beschikbaar, kan interface niet opslaan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" -msgstr "" +msgstr "Geen negatieve cache" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." -msgstr "" +msgstr "Geen nftables-regelset geladen." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" -msgstr "" +msgstr "Geen wachtwoord ingesteld!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Geen peers verbonden" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." +msgstr "Er zijn nog geen peers gedefinieerd." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." -msgstr "" +msgstr "Er zijn nog geen publieke sleutels aanwezig." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" -msgstr "" +msgstr "Geen regels in deze reeksen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:91 msgid "No rules in this chain." -msgstr "" +msgstr "Geen regels in deze reeksen." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:385 msgid "No validation or filtering" -msgstr "" +msgstr "Geen validatie of filtering" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" -msgstr "" +msgstr "Geen zone toegewezen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:58 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:84 @@ -5299,103 +6202,118 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:279 msgid "Noise" -msgstr "" +msgstr "Ruis" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Geluidsmarge" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" -msgstr "" +msgstr "Ruis:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" -msgstr "" +msgstr "Niet-wildcard" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" -msgstr "" +msgstr "Geen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" -msgstr "" +msgstr "Normaal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" -msgstr "" +msgstr "Niet gevonden" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Geen lid" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" -msgstr "" +msgstr "Niet geassocieerd" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 msgid "Not connected" -msgstr "" +msgstr "Geen verbinding" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" -msgstr "" +msgstr "Niet aanwezig" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 msgid "Not started on boot" -msgstr "" +msgstr "Niet gestart bij het opstarten" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:409 msgid "Not supported" -msgstr "" +msgstr "Niet ondersteund" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +"Opmerking: sommige draadloze stuurprogramma's ondersteunen 802.11w niet " +"volledig. Bijv. mwlwifi kan problemen hebben" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Opmerking: mogelijk hebt u ook een DHCP-proxy nodig (momenteel niet " +"beschikbaar) wanneer u een niet-standaard Relay To-poort " +"opgeeft(addr#port)." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" -msgstr "" +msgstr "Notities" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:188 msgid "Notice" -msgstr "" +msgstr "Kennisgeving" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" -msgstr "" +msgstr "Nslookup" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:333 msgid "Number of IGMP membership reports" -msgstr "" +msgstr "Aantal IGMP-lidmaatschapsrapporten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" +"Aantal DNS-vermeldingen in de cache, 10000 is maximaal, 0 is geen caching." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:311 msgid "Number of peer notifications after failover event" -msgstr "" +msgstr "Aantal peermeldingen na failovergebeurtenis" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:69 msgid "Obfuscated Group Password" -msgstr "" +msgstr "Verduisterd groepswachtwoord" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:61 msgid "Obfuscated Password" -msgstr "" +msgstr "Verduisterd wachtwoord" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5403,282 +6321,366 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 msgid "Obtain IPv6 address" -msgstr "" +msgstr "IPv6-adres verkrijgen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" -msgstr "" +msgstr "Uit" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:18 msgid "Off-State Delay" +msgstr "Off-State vertraging" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." msgstr "" +"Uit: vlanXXX, bijv. vlan1. Aan: " +"vlan_tagged_interface.XXX, bijv. eth0.1." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" -msgstr "" +msgstr "Op" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:12 msgid "On-State Delay" -msgstr "" +msgstr "On-State vertraging" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" -msgstr "" +msgstr "On-link" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" -msgstr "" +msgstr "Een van de hostnaam of MAC-adres moet worden opgegeven!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" -msgstr "" +msgstr "Een van de volgende: %s" #: modules/luci-compat/luasrc/view/cbi/nullsection.htm:17 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:22 msgid "One or more fields contain invalid values!" -msgstr "" +msgstr "Een of meer velden bevatten ongeldige waarden!" #: modules/luci-compat/luasrc/view/cbi/map.htm:32 msgid "One or more invalid/required values on tab" -msgstr "" +msgstr "Een of meer ongeldige/vereiste waarden op tabblad" #: modules/luci-compat/luasrc/view/cbi/nullsection.htm:19 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:24 msgid "One or more required fields have no value!" +msgstr "Een of meer verplichte velden hebben geen waarde!" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" +"Sta alleen communicatie toe met niet-geïsoleerde brugpoorten indien " +"ingeschakeld" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:231 msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" +"Alleen als de huidige actieve slave uitvalt en de primaire slave actief is " +"(storing, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" -msgstr "" +msgstr "Open iptables regels overzicht…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." -msgstr "" +msgstr "Lijst openen..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" -msgstr "" +msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" -msgstr "" +msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" +"Werk in relay-modus als een aangewezen hoofdinterface is " +"geconfigureerd en actief is, schakel anders NDP-proxying uit." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" +"Werk in relay-modus als een aangewezen hoofdinterface is " +"geconfigureerd en actief is, anders valt u terug naar -servermodus." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" +"Werk in relay-modus als er een upstream IPv6-voorvoegsel aanwezig " +"is, anders schakelt u de service uit." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" +msgstr "Opererende frequentie" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." -msgstr "" +msgstr "Optie \"%s\" bevat een ongeldige invoerwaarde." #: modules/luci-base/htdocs/luci-static/resources/form.js:2021 msgid "Option \"%s\" must not be empty." -msgstr "" +msgstr "Optie \"%s\" mag niet leeg zijn." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" -msgstr "" +msgstr "Optie gewijzigd" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" -msgstr "" +msgstr "Optie verwijderd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" +msgstr "Optioneel" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" +msgstr "Optioneel, vrije notities over dit apparaat" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." msgstr "" +"Optioneel, in enkele seconden. Als dit is ingesteld op '0', wordt er geen " +"poging gedaan om opnieuw verbinding te maken." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" +"Optioneel. 32-bits markering voor uitgaande versleutelde pakketten. Voer de " +"waarde in hex in, beginnend met 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " "server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') " "for the interface." msgstr "" +"Optioneel. Toegestane waarden: 'eui64', 'willekeurig', vaste waarde zoals " +"'::1' of '::1:2'. Wanneer het IPv6-voorvoegsel (zoals 'a:b:c:d::') wordt " +"ontvangen van een delegerende server, gebruikt u het achtervoegsel (zoals " +"'::1') om het IPv6-adres te vormen ('a:b:c:d: :1') voor de interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" +"Optioneel. Base64-gecodeerde vooraf gedeelde sleutel. Voegt een extra laag " +"cryptografie met symmetrische sleutels toe voor post-kwantumweerstand." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." -msgstr "" +msgstr "Optioneel. Maak routes voor Toegestane IP's voor deze peer." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." -msgstr "" +msgstr "Optioneel. Beschrijving van peer." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:185 msgid "Optional. Do not create host routes to peers." -msgstr "" +msgstr "Optioneel. Maak geen hostroutes naar peers." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" +"Optioneel. Host van peer. Namen worden opgelost voordat de interface wordt " +"opgestart." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " "routes through the tunnel." msgstr "" +"Optioneel. IP-adressen en prefixen die deze peer binnen de tunnel mag " +"gebruiken. Gewoonlijk de IP-adressen van de tunnel van de peer en de " +"netwerken die de peer door de tunnel leidt." #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "Optional. Maximum Transmission Unit of the XFRM interface." -msgstr "" +msgstr "Optioneel. Maximale transmissie-eenheid van de XFRM-interface." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 msgid "Optional. Maximum Transmission Unit of tunnel interface." -msgstr "" +msgstr "Optioneel. Maximale transmissie-eenheid van tunnelinterface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." -msgstr "" +msgstr "Optioneel. Poort van peer." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " "code if available. It can be removed after the configuration has been " "exported." msgstr "" +"Optioneel. Privésleutel van de WireGuard-peer. De sleutel is niet vereist om " +"een verbinding tot stand te brengen, maar maakt het genereren van een peer-" +"configuratie of QR-code mogelijk, indien beschikbaar. Het kan worden " +"verwijderd nadat de configuratie is geëxporteerd." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." msgstr "" +"Optioneel. Seconden tussen keep-alive-berichten. Standaard is 0 " +"(uitgeschakeld). Aanbevolen waarde als dit apparaat achter een NAT zit, is " +"25." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 msgid "Optional. UDP port used for outgoing and incoming packets." msgstr "" +"Optioneel. UDP-poort die wordt gebruikt voor uitgaande en inkomende " +"pakketten." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:72 msgid "Options" -msgstr "" +msgstr "Opties" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" for default route. 0.0.0.0 means \"the address of the " "system running dnsmasq\"." msgstr "" +"Opties voor de netwerk-ID. (Opmerking: heeft ook netwerk-ID nodig.) Bijv. " +"\"42,192.168.1.4\" voor NTP-server, \"3,192.168.4.4\" voor standaardroute. 0.0.0.0 betekent \"het adres van " +"het systeem waarop dnsmasq draait\"." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" -msgstr "" +msgstr "Opties:" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Ordinaal: lager komt eerst." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Originator Interval" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" -msgstr "" +msgstr "Ander:" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:69 msgid "Out" -msgstr "" +msgstr "Uit" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:277 msgid "Outbound:" -msgstr "" +msgstr "Uitgaande:" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:106 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:108 msgid "Outgoing checksum" -msgstr "" +msgstr "Uitgaande controlesom" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" -msgstr "" +msgstr "Uitgaande interface" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:96 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" -msgstr "" +msgstr "Uitgaande sleutel" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:108 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110 msgid "Outgoing serialization" -msgstr "" +msgstr "Uitgaande serialisatie" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:50 msgid "Output Interface" -msgstr "" +msgstr "Uitvoerinterface" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 msgid "Output zone" -msgstr "" +msgstr "Uitgangszone" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:16 msgid "Overlap" -msgstr "" +msgstr "Overlappen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" -msgstr "" +msgstr "IPv4-routingtabel overschrijven" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" -msgstr "" +msgstr "IPv6-routingtabel overschrijven" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5686,8 +6688,9 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" -msgstr "" +msgstr "MTU overschrijven" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:74 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:79 @@ -5695,7 +6698,7 @@ msgstr "" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:62 msgid "Override TOS" -msgstr "" +msgstr "TOS overschrijven" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:74 @@ -5705,55 +6708,73 @@ msgstr "" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:62 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:57 msgid "Override TTL" -msgstr "" +msgstr "TTL overschrijven" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" msgstr "" +"Standaard MAC-adres overschrijven - het bereik van bruikbare adressen kan " +"worden beperkt door het stuurprogramma" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 msgid "Override default interface name" -msgstr "" +msgstr "Standaard interface naam overschrijven" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 msgid "Override the gateway in DHCP responses" -msgstr "" +msgstr "De gateway overschrijven in DHCP-responsen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." msgstr "" +"Overschrijf het netmasker dat naar clients is verzonden. Normaal gesproken " +"wordt het berekend op basis van het subnet dat wordt bediend." #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 msgid "Override the table used for internal routes" -msgstr "" +msgstr "De tabel overschrijven die wordt gebruikt voor interne routes" #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:3 msgid "Overview" msgstr "Overzicht" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" -msgstr "" +msgstr "Bestaand bestand \"%s\" overschrijven?" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:355 msgid "Overwrite the current settings with the imported configuration?" msgstr "" +"De huidige instellingen overschrijven met de geïmporteerde configuratie?" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" -msgstr "" +msgstr "Eigenaar" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" -msgstr "" +msgstr "PAP/CHAP (beide)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -5762,11 +6783,12 @@ msgstr "" #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:94 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:46 msgid "PAP/CHAP password" -msgstr "" +msgstr "PAP/CHAP-wachtwoord" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -5775,188 +6797,210 @@ msgstr "" #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:89 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:44 msgid "PAP/CHAP username" -msgstr "" +msgstr "PAP/CHAP gebruikersnaam" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" -msgstr "" +msgstr "PDP-type" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:69 msgid "PID" -msgstr "" +msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" -msgstr "" +msgstr "PIN" #: modules/luci-base/htdocs/luci-static/resources/network.js:21 #: modules/luci-compat/luasrc/model/network.lua:39 msgid "PIN code rejected" -msgstr "" +msgstr "Pincode geweigerd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" -msgstr "" +msgstr "PMK R1 Push" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:13 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:43 msgid "PPP" -msgstr "" +msgstr "PPP" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:58 msgid "PPPoA Encapsulation" -msgstr "" +msgstr "PPPoA-inkapseling" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:19 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:28 msgid "PPPoATM" -msgstr "" +msgstr "PPPoATM" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:17 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:28 msgid "PPPoE" -msgstr "" +msgstr "PPPoE" #: modules/luci-compat/luasrc/model/network/proto_pppossh.lua:9 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:28 msgid "PPPoSSH" -msgstr "" +msgstr "PPPoSSH" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:15 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:28 msgid "PPtP" -msgstr "" +msgstr "PPtP" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:73 msgid "PSID offset" -msgstr "" +msgstr "PSID-verschuiving" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:70 msgid "PSID-bits length" -msgstr "" +msgstr "PSID-bits lengte" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" -msgstr "" +msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" -msgstr "" +msgstr "PTM/EFM (pakketoverdrachtsmodus)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" +msgstr "PXE/TFTP-instellingen" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" -msgstr "" +msgstr "Pakket sturen" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" -msgstr "" +msgstr "Pakketmarkering" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Pakket ontvangt tijd" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" -msgstr "" +msgstr "Pakketten" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:277 msgid "Packets To Transmit Before Moving To Next Slave" msgstr "" +"Pakketten die moeten worden verzonden voordat u naar de volgende slave gaat" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "" +msgstr[1] "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" -msgstr "" +msgstr "Deel van zone %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" -msgstr "" +msgstr "Pass-through (fysiek apparaat spiegelen aan één MAC VLAN)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" -msgstr "" +msgstr "Wachtwoord" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 msgid "Password authentication" -msgstr "" +msgstr "Wachtwoord authenticatie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" -msgstr "" +msgstr "Wachtwoord van privésleutel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" -msgstr "" +msgstr "Wachtwoord van innerlijke privésleutel" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 msgid "Password strength" -msgstr "" +msgstr "Wachtwoordsterkte" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" -msgstr "" +msgstr "Wachtwoord2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" -msgstr "" +msgstr "Plak of sleep het SSH-sleutelbestand …" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" -msgstr "" +msgstr "Plak of sleep WireGuard-peerconfiguratiebestand (wg0.conf)…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" +"Plak of sleep een WireGuard-configuratie (gewoonlijk wg0.conf) van " +"een ander systeem hieronder om een overeenkomende peer-invoer te maken, " +"zodat dat systeem verbinding kan maken met de lokale WireGuard-interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" -msgstr "" +msgstr "Plak of sleep het meegeleverde WireGuard-configuratiebestand…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" -msgstr "" +msgstr "Pad naar CA-certificaat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" -msgstr "" +msgstr "Pad naar cliënt-certificaat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" -msgstr "" +msgstr "Pad naar privésleutel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" -msgstr "" +msgstr "Pad naar binnenste CA-Certificaat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" -msgstr "" +msgstr "Pad naar binnenste Client-Certificaat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" -msgstr "" +msgstr "Pad naar innerlijke privésleutel" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2727 msgid "Paused" -msgstr "" +msgstr "Gepauzeerd" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:273 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:283 @@ -5970,77 +7014,89 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:278 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:296 msgid "Peak:" -msgstr "" +msgstr "Piek:" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Peer" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Peer Details" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" -msgstr "" +msgstr "Peer IP-adres om toe te wijzen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" -msgstr "" +msgstr "Peer MAC-adres" #: modules/luci-base/htdocs/luci-static/resources/network.js:14 #: modules/luci-compat/luasrc/model/network.lua:32 msgid "Peer address is missing" -msgstr "" +msgstr "Peer adres ontbreekt" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" -msgstr "" +msgstr "Naam peer-apparaat" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" -msgstr "" +msgstr "Peer uitgeschakeld" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:214 msgid "Peers" -msgstr "" +msgstr "Peers" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:80 msgid "Perfect Forward Secrecy" -msgstr "" +msgstr "Perfecte forward geheimhouding" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:108 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110 msgid "Perform outgoing packets serialization (optional)." -msgstr "" +msgstr "Uitvoeren van serialisatie van uitgaande pakketten (optioneel)." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:34 msgid "Perform reboot" -msgstr "" +msgstr "Herstart uitvoeren" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:406 msgid "Perform reset" -msgstr "" +msgstr "Resetten uitvoeren" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:407 msgid "Permission denied" -msgstr "" +msgstr "Toestemming geweigerd" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" -msgstr "" +msgstr "Blijvend in leven houden" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Aanhoudend interval voor opnieuw verbinden" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" -msgstr "" +msgstr "Instelling PersistentKeepAlive is ongeldig" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:290 msgid "Phy Rate:" -msgstr "" +msgstr "Phy Rate:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" -msgstr "" +msgstr "Fysieke instellingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" -msgstr "" +msgstr "Ping" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:50 @@ -6049,76 +7105,94 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:138 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:64 msgid "Pkts." -msgstr "" +msgstr "Pkts." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." -msgstr "" +msgstr "Voer uw gebruikersnaam en wachtwoord in." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." -msgstr "" +msgstr "Selecteer het bestand om te uploaden." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Policy" -msgstr "" +msgstr "Beleid" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" -msgstr "" +msgstr "Beleid: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Poort" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Poort %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "Poort maakt geen deel uit van een netwerk" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" +msgstr "Poort isolatie" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" -msgstr "" +msgstr "Poortstatus:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" +msgstr "Potentiële ontkenning van: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" -msgstr "" +msgstr "Voorkeur voor LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" +msgstr "Voorkeur voor UMTS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "Gewenste netwerktechnologie" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" -msgstr "" +msgstr "Prefix gedelegeerd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" -msgstr "" +msgstr "Prefix onderdrukker" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" -msgstr "" +msgstr "Vooraf gedeelde sleutel" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" -msgstr "" +msgstr "Vooraf gedeelde sleutel in gebruik" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:308 msgid "PresharedKey setting is invalid" -msgstr "" +msgstr "PresharedKey-instelling is ongeldig" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:130 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:102 @@ -6130,761 +7204,943 @@ msgid "" "Presume peer to be dead after given amount of LCP echo failures, use 0 to " "ignore failures" msgstr "" +"Veronderstel dat peer dood is na een bepaald aantal LCP-echostoringen, " +"gebruik 0 om storingen te negeren" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Prevents client-to-client communication" +msgstr "Voorkomt client-to-client communicatie" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" +"Voorkomt dat de ene draadloze client met de andere communiceert. Deze " +"instelling is alleen van invloed op pakketten zonder enige VLAN-tag " +"(ongetagde pakketten)." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "" +msgstr "Primaire Slave" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " "better than current slave (better, 1)" msgstr "" +"Primair wordt actieve slave wanneer het terugkomt als snelheid en duplex " +"beter zijn dan de huidige slave (beter, 1)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:229 msgid "Primary becomes active slave whenever it comes back up (always, 0)" -msgstr "" +msgstr "Primair wordt actieve slaaf wanneer het weer opkomt (altijd, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" -msgstr "" +msgstr "Prioriteit" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" -msgstr "" +msgstr "Privé" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" -msgstr "" +msgstr "Privé (communicatie tussen MAC VLAN's voorkomen)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" -msgstr "" +msgstr "Privé sleutel" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" -msgstr "" +msgstr "Privé sleutel aanwezig" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:296 msgid "PrivateKey setting is missing or invalid" -msgstr "" +msgstr "Privé sleutel-instelling ontbreekt of is ongeldig" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:64 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:93 msgid "Processes" -msgstr "" +msgstr "Processen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:67 msgid "Prot." -msgstr "" +msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:217 msgid "Protocol" -msgstr "" +msgstr "Protocol" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:282 msgid "Provide NTP server" -msgstr "" +msgstr "Provider NTP server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" +"Zorg voor een DHCPv6-server op deze interface en beantwoord DHCPv6-aanvragen " +"en -verzoeken." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" -msgstr "" +msgstr "Provider nieuw netwerk" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:288 msgid "" "Provide the NTP server to the selected interface or, if unspecified, to all " "interfaces" msgstr "" +"Geef de NTP-server aan de geselecteerde interface of, indien niet " +"gespecificeerd, aan alle interfaces" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Proxyserver" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" -msgstr "" +msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" -msgstr "" +msgstr "Openbare sleutel" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" -msgstr "" +msgstr "Openbare sleutel ontbreekt" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" -msgstr "" +msgstr "Openbare sleutel: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " "device, paste an OpenSSH compatible public key line or drag a .pub file into the input field." msgstr "" +"Openbare sleutels zorgen voor wachtwoordloze SSH-aanmeldingen met een hogere " +"beveiliging in vergelijking met het gebruik van gewone wachtwoorden. Om een " +"nieuwe sleutel naar het apparaat te uploaden, plakt u een OpenSSH-" +"compatibele openbare sleutelregel of sleept u een .pub-bestand " +"naar het invoerveld." #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 msgid "Public prefix routed to this device for distribution to clients." msgstr "" +"Openbaar prefix gerouteerd naar dit apparaat voor distributie naar clients." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:305 msgid "PublicKey setting is invalid" -msgstr "" +msgstr "Openbare sleutel-instelling is ongeldig" #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:9 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:27 msgid "QMI Cellular" -msgstr "" +msgstr "QMI Cellular" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 msgid "Quality" -msgstr "" +msgstr "Kwaliteit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." -msgstr "" +msgstr "Vraag alle beschikbare upstream-resolvers." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" -msgstr "" +msgstr "Query-interval" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" -msgstr "" +msgstr "Query-antwoordinterval" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" -msgstr "" +msgstr "R0 Sleutellevensduur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" -msgstr "" +msgstr "R1 Sleutelhouder" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" -msgstr "" +msgstr "RADIUS Accounting-poort" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" -msgstr "" +msgstr "RADIUS Accounting Geheim" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" -msgstr "" +msgstr "RADIUS Accounting Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" -msgstr "" +msgstr "RADIUS-authenticatiepoort" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" -msgstr "" +msgstr "RADIUS-authenticatiegeheim" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" -msgstr "" +msgstr "RADIUS-authenticatieserver" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "RADIUS Dynamic VLAN-toewijzing" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "RADIUS Per STA VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "RADIUS VLAN-brugnaam schema" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "RADIUS VLAN-naamgeving" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "RADIUS VLAN-gelabelde interface" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" -msgstr "" +msgstr "RFC3947 NAT-T-modus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "RSN Preauth" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" -msgstr "" +msgstr "RSSI-drempel voor deelname" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" -msgstr "" +msgstr "RTS/CTS-drempel" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:84 msgid "RX" -msgstr "" +msgstr "RX" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:236 msgid "RX Rate" -msgstr "" +msgstr "RX Rate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" +msgstr "RX Rate / TX Rate" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." msgstr "" +"Radiobronmeting - Verzendt bakens om roaming te ondersteunen. Niet alle " +"klanten ondersteunen dit." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" -msgstr "" +msgstr "Willekeurige toewijzing van bronpoorten" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" -msgstr "" +msgstr "Ruwe hex-gecodeerde bytes. Laat leeg tenzij uw ISP dit vereist" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." -msgstr "" +msgstr "Lees /etc/ethers om de DHCP-server te configureren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" -msgstr "" +msgstr "Echt van protocol wisselen?" #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:118 msgid "Realtime Graphs" -msgstr "" +msgstr "Realtime grafieken" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" -msgstr "" +msgstr "Deadline voor herkoppeling" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" -msgstr "" +msgstr "Herbind bescherming" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:20 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:140 msgid "Reboot" -msgstr "" +msgstr "Opnieuw opstarten" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:153 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:162 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:46 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:51 msgid "Rebooting…" -msgstr "" +msgstr "Opnieuw opstarten…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:21 msgid "Reboots the operating system of your device" -msgstr "" +msgstr "Start het besturingssysteem van uw apparaat opnieuw op" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:26 msgid "Receive" +msgstr "Ontvangen" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Ontvangen data" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." -msgstr "" +msgstr "Aanbevolen. IP-adressen van de WireGuard-interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Time-out opnieuw verbinden" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" -msgstr "" +msgstr "Sluit deze interface opnieuw aan" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:14 msgid "Redirect to HTTPS" -msgstr "" +msgstr "Omleiden naar HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" -msgstr "" +msgstr "Omleiden naar lokale poort %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" -msgstr "" +msgstr "Omleiden naar lokaal systeem" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:57 msgid "References" -msgstr "" +msgstr "Referenties" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Kanalen vernieuwen" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" +msgstr "Vernieuwen" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" -msgstr "" +msgstr "Weiger IPv4-pakket met ICMP-type %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" -msgstr "" +msgstr "Weiger pakket met ICMP-type %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" -msgstr "" +msgstr "Weiger pakket met ICMPv6 type %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" -msgstr "" +msgstr "Weiger pakket met TCP-reset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" +"Weiger routeringsbeslissingen met een prefixlengte die kleiner is dan of " +"gelijk is aan de opgegeven waarde" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" -msgstr "" +msgstr "Relais" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:157 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:36 msgid "Relay Bridge" +msgstr "Relais brug" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." msgstr "" +"DHCP-verzoeken elders doorgeven. Oké: v4↔v4, v6↔v6. Niet OK: v4↔v6, v6↔v4." #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" -msgstr "" +msgstr "Relais tussen netwerken" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:12 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:64 msgid "Relay bridge" +msgstr "Relais brug" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "Remote IPv4 address" -msgstr "" +msgstr "Afstand IPv4-adres" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" -msgstr "" +msgstr "Extern IPv4-adres of FQDN" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 msgid "Remote IPv6 address" -msgstr "" +msgstr "Afstand IPv6-adres" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 msgid "Remote IPv6 address or FQDN" -msgstr "" +msgstr "Extern IPv6-adres of FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" +msgstr "Verwijder" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." msgstr "" +"Verwijder IPv4-adressen uit de resultaten en retourneer alleen IPv6-adressen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 -msgid "Remove related device settings from the configuration" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." msgstr "" +"Verwijder IPv6-adressen uit de resultaten en retourneer alleen IPv4-adressen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 +msgid "Remove related device settings from the configuration" +msgstr "Gerelateerde apparaatinstellingen uit de configuratie verwijderen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" -msgstr "" +msgstr "Draadloze configuratie vervangen" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:17 msgid "Request IPv6-address" -msgstr "" +msgstr "IPv6-adres aanvragen" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:23 msgid "Request IPv6-prefix of length" -msgstr "" +msgstr "Verzoek om IPv6-prefix van lengte" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:408 msgid "Request timeout" -msgstr "" +msgstr "Verzoek time-out" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:100 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:105 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:107 msgid "Require incoming checksum (optional)." -msgstr "" +msgstr "Inkomende controlesom vereisen (optioneel)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:107 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:104 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:109 msgid "Require incoming packets serialization (optional)." -msgstr "" +msgstr "Serialisatie van binnenkomende pakketten vereisen (optioneel)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" -msgstr "" +msgstr "Vereist" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" -msgstr "" +msgstr "Vereist voor bepaalde ISP's, bijv. Charter met DOCSIS 3" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 msgid "Required. Base64-encoded private key for this interface." -msgstr "" +msgstr "Vereist. Base64-gecodeerde persoonlijke sleutel voor deze interface." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Required. Path to the .yml config file for this interface." -msgstr "" +msgstr "Vereist. Pad naar het .yml-configuratiebestand voor deze interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." -msgstr "" +msgstr "Vereist. Openbare sleutel van de WireGuard peer." #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:42 msgid "Required. Underlying interface." -msgstr "" +msgstr "Vereist. Onderliggende interface." #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:39 msgid "Required. XFRM interface ID to be used for SA." +msgstr "Vereist. XFRM-interface-ID die moet worden gebruikt voor SA." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." msgstr "" +"Vereist: Weigert auth als de RADIUS-server niet de juiste VLAN-attributen " +"verstrekt." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" -msgstr "" +msgstr "Vereist hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" -msgstr "" +msgstr "Vereist hostapd met EAP Suite-B-ondersteuning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" -msgstr "" +msgstr "Vereist hostapd met EAP-ondersteuning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" -msgstr "" +msgstr "Vereist hostapd met OWE-ondersteuning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" -msgstr "" +msgstr "Vereist hostapd met SAE-ondersteuning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" -msgstr "" +msgstr "Vereist hostapd met WEP-ondersteuning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" -msgstr "" +msgstr "Vereist wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" -msgstr "" +msgstr "Vereist wpa-supplicant met EAP Suite-B-ondersteuning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" -msgstr "" +msgstr "Vereist wpa-supplicant met EAP-ondersteuning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" -msgstr "" +msgstr "Vereist wpa-supplicant met OWE-ondersteuning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" -msgstr "" +msgstr "Vereist wpa-supplicant met SAE-ondersteuning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" -msgstr "" +msgstr "Vereist wpa-supplicant met WEP-ondersteuning" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:226 msgid "Reselection policy for primary slave" -msgstr "" +msgstr "Herselectiebeleid voor primaire slave" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 msgid "Reset" -msgstr "" +msgstr "Reset" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:343 msgid "Reset Counters" -msgstr "" +msgstr "Tellers resetten" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:404 msgid "Reset to defaults" -msgstr "" +msgstr "Resetten naar standaardwaarden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" -msgstr "" +msgstr "Bestanden oplossen en hosten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" -msgstr "" +msgstr "Bestand oplossen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Los gespecificeerde FQDN's op naar een IP." #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" -msgstr "" +msgstr "Bron niet gevonden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Herstart" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:348 msgid "Restart Firewall" -msgstr "" +msgstr "Firewall opnieuw opstarten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" -msgstr "" +msgstr "Herstart radio-interface" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "Restore" -msgstr "" +msgstr "Herstel" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:410 msgid "Restore backup" -msgstr "" +msgstr "Back-up terugzetten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" +"Retourneert antwoorden op DNS-query's die overeenkomen met het subnet " +"waarvan de query is ontvangen als er meerdere IP's beschikbaar zijn." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" -msgstr "" +msgstr "Wachtwoord onthullen/verbergen" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" -msgstr "" +msgstr "Omgekeerd padfilter" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" -msgstr "" +msgstr "Terugkeren" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" -msgstr "" +msgstr "Wijzigingen terugdraaien" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" -msgstr "" +msgstr "Aanvraag terugzetten mislukt met status %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" +msgstr "Configuratie terugdraaien…" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" -msgstr "" +msgstr "Bestemming herschrijven naar %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" -msgstr "" +msgstr "Bestemming herschrijven naar %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" +"Bestemming herschrijven naar %h, poort %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" +"Bestemming herschrijven naar %h, poort %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" -msgstr "" +msgstr "Bron herschrijven naar %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" -msgstr "" +msgstr "Bron herschrijven naar %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" -msgstr "" +msgstr "Bron herschrijven naar %h, poort %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" -msgstr "" +msgstr "Bron herschrijven naar %h, poort %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" +msgstr "Herschrijven naar uitgaand apparaatadres" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." msgstr "" +"Robust Security Network (RSN): Sta roaming preauth toe voor WPA2-EAP-" +"netwerken (en adverteer het in WLAN-beacons). Werkt alleen als de opgegeven " +"netwerkinterface een brug is. Verkort het tijdkritische reassociatieproces." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" -msgstr "" +msgstr "Robuustheid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " "TFTP server root." msgstr "" +"Hoofddirectory voor bestanden die via TFTP worden aangeboden. Activeer " +"TFTP-server en TFTP-server root schakelen de TFTP-server in en " +"dienen bestanden van TFTP-server root." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:298 msgid "Root preparation" -msgstr "" +msgstr "Root voorbereiding" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:204 msgid "Round-Robin policy (balance-rr, 0)" -msgstr "" +msgstr "Round-Robin-beleid (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" -msgstr "" +msgstr "Toegestane IP's routeren" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" -msgstr "" +msgstr "Route actie reeksen \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" -msgstr "" +msgstr "Routetype" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." msgstr "" +"Router Lifetime gepubliceerd in RA-berichten. Maximaal is 9000 seconden." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:26 msgid "Router Password" -msgstr "" +msgstr "Router wachtwoord" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:50 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:248 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:15 msgid "Routing" -msgstr "" +msgstr "Routing" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Routeringsalgoritme" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " "can be reached." msgstr "" +"Routing definieert via welke interface en gateway een bepaalde host of " +"netwerk kan worden bereikt." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:218 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:198 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:224 msgid "Rule" -msgstr "" +msgstr "Regel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" -msgstr "" +msgstr "Regel acties" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" -msgstr "" +msgstr "Regelcommentaar: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" -msgstr "" +msgstr "Regel container reeksen \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" -msgstr "" +msgstr "Regel overeenkomsten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" -msgstr "" +msgstr "Type regel" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:336 msgid "Run a filesystem check before mounting the device" -msgstr "" +msgstr "Voer een bestandssysteemcontrole uit voordat u het apparaat aankoppelt" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:336 msgid "Run filesystem check" -msgstr "" +msgstr "Voer een bestandssysteemcontrole uit" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2360 msgid "Runtime error" -msgstr "" +msgstr "Runtime-fout" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:224 msgid "SHA256" +msgstr "SHA256" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" -msgstr "" +msgstr "SNR" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" -msgstr "" +msgstr "SSH-toegang" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:70 msgid "SSH server address" -msgstr "" +msgstr "SSH-serveradres" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:74 msgid "SSH server port" -msgstr "" +msgstr "SSH-serverpoort" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:58 msgid "SSH username" -msgstr "" +msgstr "SSH-gebruikersnaam" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" -msgstr "" +msgstr "SSH-sleutels" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" -msgstr "" +msgstr "SSID" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:9 msgid "SSTP" -msgstr "" +msgstr "SSTP" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:41 msgid "SSTP Server" -msgstr "" +msgstr "SSTP-server" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 msgid "SWAP" -msgstr "" +msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6895,43 +8151,48 @@ msgid "Save" msgstr "Opslaan" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" -msgstr "" +msgstr "Opslaan en toepassen" #: modules/luci-base/htdocs/luci-static/resources/form.js:607 msgid "Save error" -msgstr "" +msgstr "Fout opslaan" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:434 msgid "Save mtdblock" -msgstr "" +msgstr "Bewaar mtdblock" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:424 msgid "Save mtdblock contents" -msgstr "" +msgstr "Inhoud van mtdblock opslaan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" -msgstr "" +msgstr "Scan" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:28 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:90 msgid "Scheduled Tasks" +msgstr "Geplande taken" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" -msgstr "" +msgstr "Sectie toegevoegd" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" -msgstr "" +msgstr "Sectie verwijderd" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:332 msgid "See \"mount\" manpage for details" -msgstr "" +msgstr "Zie \"mount\" manpage voor details" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:283 msgid "" @@ -6939,26 +8200,33 @@ msgid "" "fails. Use only if you are sure that the firmware is correct and meant for " "your device!" msgstr "" +"Selecteer 'Forceer upgrade' om de image te flashen, zelfs als de image " +"format controle mislukt. Gebruik dit alleen als u zeker weet dat de firmware " +"correct is en bedoeld voor uw apparaat!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" -msgstr "" +msgstr "Selecteer bestand…" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:320 msgid "Selects the transmit hash policy to use for slave selection" msgstr "" +"Selecteert het hash-beleid voor verzending dat moet worden gebruikt voor " +"slave-selectie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" +"Verzend RA-" +"berichten waarin dit apparaat wordt geadverteerd als IPv6-router." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" -msgstr "" +msgstr "ICMP-omleidingen verzenden" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:143 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 @@ -6970,216 +8238,241 @@ msgid "" "Send LCP echo requests at the given interval in seconds, only effective in " "conjunction with failure threshold" msgstr "" +"Verzend LCP-echoverzoeken met het opgegeven interval in seconden, alleen " +"effectief in combinatie met de foutdrempel" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:24 msgid "Send the hostname of this device" -msgstr "" +msgstr "Stuur de hostnaam van dit apparaat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Server" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" -msgstr "" +msgstr "Server adres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" -msgstr "" +msgstr "Servernaam" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 msgid "Service Name" -msgstr "" +msgstr "Servicenaam" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:88 msgid "Service Type" -msgstr "" +msgstr "Service Type" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:36 msgid "Services" -msgstr "" +msgstr "Diensten" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2664 msgid "Session expired" -msgstr "" +msgstr "Sessie verlopen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:126 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:175 msgid "Set Static" +msgstr "Statisch instellen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" -msgstr "" +msgstr "Stel headerveld %s in op %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" +"Stel interface in als NDP-Proxy externe slave. Standaard is uitgeschakeld." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." msgstr "" +"Stel interface-eigenschappen in, ongeacht de link-carrier (indien ingesteld, " +"roepen carrier-sense-gebeurtenissen geen hotplug-handlers aan)." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:302 msgid "Set same MAC Address to all slaves" -msgstr "" +msgstr "Stel hetzelfde MAC-adres in voor alle slaves" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" +"Stel de autonome adresconfiguratievlag in de prefix-informatie-opties van " +"verzonden RA-berichten in. " +"Indien ingeschakeld, zullen clients stateless IPv6-adresautoconfiguratie " +"uitvoeren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." msgstr "" +"Stel deze interface in als master voor RA- en DHCPv6-relaying en voor NDP-" +"proxying." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:306 msgid "Set to currently active slave (active, 1)" -msgstr "" +msgstr "Ingesteld op momenteel actieve slave (actief, 1)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:307 msgid "Set to first slave added to the bond (follow, 2)" -msgstr "" +msgstr "Ingesteld op eerste slaaf toegevoegd aan de binding (volgen, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" -msgstr "" +msgstr "DHCP-server instellen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Routes instellen voor proxy IPv6-buren." #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 msgid "Setting PLMN failed" -msgstr "" +msgstr "Instellen PLMN is mislukt" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" -msgstr "" +msgstr "Instelling bedrijfsmodus mislukt" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 -msgid "Settings" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 +msgid "Settings" +msgstr "Instellingen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" +"Instellingen om draadloze clients te helpen bij het roamen tussen meerdere " +"AP's: 802.11r, 802.11k en 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "Korte Bewakings Interval" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" -msgstr "" +msgstr "korte introductie" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" -msgstr "" +msgstr "Toon huidige back-upbestandslijst" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 msgid "Show empty chains" -msgstr "" +msgstr "Toon lege reeks" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:338 msgid "Show raw counters" -msgstr "" +msgstr "Toon onbewerkte tellers" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" -msgstr "" +msgstr "Sluit deze interface af" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:284 msgid "Signal" -msgstr "" +msgstr "Signaal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" -msgstr "" +msgstr "Signaal / Ruis" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" -msgstr "" +msgstr "Signaalverversingssnelheid" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:262 msgid "Signal:" -msgstr "" +msgstr "Signaal:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" -msgstr "" +msgstr "Grootte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" -msgstr "" +msgstr "Grootte van DNS-querycache" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:208 msgid "Size of the ZRam device in megabytes" -msgstr "" +msgstr "Grootte van het ZRam-apparaat in megabytes" #: modules/luci-compat/luasrc/view/cbi/footer.htm:18 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:57 msgid "Skip" -msgstr "" +msgstr "Overslaan" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:257 msgid "Skip from backup files that are equal to those in /rom" -msgstr "" +msgstr "Back-upbestanden overslaan die gelijk zijn aan die in /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" -msgstr "" +msgstr "Ga naar inhoud" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" -msgstr "" +msgstr "Ga naar navigatie" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:180 msgid "Slave Interfaces" -msgstr "" +msgstr "Slave-interfaces" #: modules/luci-base/htdocs/luci-static/resources/network.js:3002 #: modules/luci-compat/luasrc/model/network.lua:1428 msgid "Software VLAN" -msgstr "" +msgstr "Software VLAN" #: modules/luci-compat/luasrc/view/cbi/header.htm:5 msgid "Some fields are invalid, cannot save values!" -msgstr "" +msgstr "Sommige velden zijn ongeldig, kunnen geen waarden opslaan!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." -msgstr "" - -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" +msgstr "Sorry, het object dat je hebt aangevraagd, is niet gevonden." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" @@ -7187,292 +8480,371 @@ msgid "" "flashed manually. Please refer to the wiki for device specific install " "instructions." msgstr "" +"Sorry, er is geen sysupgrade-ondersteuning aanwezig; een nieuwe firmware-" +"image moet handmatig worden geflasht. Raadpleeg de wiki voor " +"apparaatspecifieke installatie-instructies." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 msgid "Source" -msgstr "" +msgstr "Bron" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:43 msgctxt "nft ip saddr" msgid "Source IP" -msgstr "" +msgstr "Bron IP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:47 msgctxt "nft ip6 saddr" msgid "Source IPv6" -msgstr "" +msgstr "Bron IPv6" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 msgid "Source interface" -msgstr "" +msgstr "Broninterface" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:45 msgctxt "nft ip sport" msgid "Source port" -msgstr "" +msgstr "Bronpoort" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" +"Speciale PXE " +"opstartopties voor Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" +"Specificeert een vaste lijst met DNS-zoekdomeinen om aan te kondigen via " +"DHCPv6. Als dit niet wordt opgegeven, wordt het DNS-zoekdomein van het " +"lokale apparaat aangekondigd." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" +"Specificeert een vaste lijst met IPv6 DNS-serveradressen om aan te kondigen " +"via DHCPv6. Als dit niet wordt opgegeven, kondigt het apparaat zichzelf aan " +"als IPv6 DNS-server, tenzij de optie Lokale IPv6 DNS-server is " +"uitgeschakeld." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " "corresponding range" msgstr "" +"Specificeert een individuele UID of reeks UID's die overeenkomen, b.v. 1000 " +"om overeen te komen met de corresponderende UID of 1000-1005 om alle UID's " +"binnen het overeenkomstige bereik te matchen" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:343 msgid "" "Specifies that duplicate frames (received on inactive ports) should be " "dropped or delivered" msgstr "" +"Specificeert dat dubbele frames (ontvangen op inactieve poorten) moeten " +"worden verwijderd of afgeleverd" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:359 msgid "Specifies the ARP link monitoring frequency in milliseconds" -msgstr "" +msgstr "Specificeert de bewakingsfrequentie van de ARP-link in milliseconden" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:367 msgid "Specifies the IP addresses to use for ARP monitoring" msgstr "" +"Specificeert de IP-adressen die moeten worden gebruikt voor ARP-bewaking" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:396 msgid "Specifies the MII link monitoring frequency in milliseconds" -msgstr "" +msgstr "Specificeert de bewakingsfrequentie van de MII-link in milliseconden" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" -msgstr "" +msgstr "Specificeert de TOS-waarde die moet overeenkomen in IP-headers" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:261 msgid "Specifies the aggregation selection logic to use" msgstr "" +"Specificeert de logica voor aggregatieselectie die moet worden gebruikt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" +"Specificeert het bestemmingssubnet dat moet overeenkomen (CIDR-notatie)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 msgid "Specifies the directory the device is attached to" -msgstr "" +msgstr "Specificeert de map waaraan het apparaat is gekoppeld" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" +"Specificeert de vlaggen die worden verzonden in RA-berichten, bijvoorbeeld om clients te instrueren " +"om meer informatie op te vragen via stateful DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" +"Specificeert de fwmark en optioneel het bijpassende masker, b.v. 0xFF om " +"overeen te komen met teken 255 of 0x0/0x1 om overeen te komen met elke even " +"tekenwaarde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" -msgstr "" +msgstr "Specificeert de naam van de inkomende logische interface" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 msgid "" "Specifies the logical interface name of the parent (or master) interface " "this route belongs to" msgstr "" +"Specificeert de logische interfacenaam van de bovenliggende (of master) " +"interface waartoe deze route behoort" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:254 msgid "" "Specifies the mac-address for the actor in protocol packet exchanges " "(LACPDUs). If empty, masters' mac address defaults to system default" msgstr "" +"Specificeert het mac-adres voor de actor in protocolpakketuitwisselingen " +"(LACPDU's). Indien leeg, wordt het mac-adres van de master standaard " +"ingesteld op systeemstandaard" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 msgid "" "Specifies the maximum amount of failed ARP requests until hosts are presumed " "to be dead" msgstr "" +"Specificeert het maximale aantal mislukte ARP-verzoeken totdat wordt " +"aangenomen dat hosts dood zijn" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 msgid "" "Specifies the maximum amount of seconds after which hosts are presumed to be " "dead" msgstr "" +"Specificeert het maximale aantal seconden waarna hosts geacht worden dood te " +"zijn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " "be reduced by the driver." msgstr "" +"Specificeert het maximale zendvermogen dat de draadloze radio mag gebruiken. " +"Afhankelijk van wettelijke vereisten en draadloos gebruik, kan het " +"daadwerkelijke zendvermogen worden verminderd door de bestuurder." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:238 msgid "" "Specifies the minimum number of links that must be active before asserting " "carrier" msgstr "" +"Specificeert het minimum aantal links dat actief moet zijn voordat de " +"carrier wordt bevestigd" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:202 msgid "Specifies the mode to be used for this bonding interface" msgstr "" +"Specificeert de modus die moet worden gebruikt voor deze verbindingsinterface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " "0.0.0.0 no gateway will be specified for the route" msgstr "" +"Specificeert de netwerkgateway. Indien weggelaten, wordt de gateway van de " +"bovenliggende interface gebruikt, anders wordt een koppelingsbereikroute " +"gemaakt. Indien ingesteld op 0.0.0.0 wordt er geen gateway opgegeven voor de " +"route" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:334 msgid "" "Specifies the number of IGMP membership reports to be issued after a " "failover event in 200ms intervals" msgstr "" +"Specificeert het aantal IGMP-lidmaatschapsrapporten dat moet worden " +"uitgegeven na een failover-gebeurtenis met intervallen van 200 ms" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:278 msgid "" "Specifies the number of packets to transmit through a slave before moving to " "the next one" msgstr "" +"Specificeert het aantal pakketten dat via een slave moet worden verzonden " +"voordat naar de volgende wordt gegaan" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:312 msgid "" "Specifies the number of peer notifications (gratuitous ARPs and unsolicited " "IPv6 Neighbor Advertisements) to be issued after a failover event" msgstr "" +"Specificeert het aantal peer-meldingen (onnodige ARP's en ongevraagde IPv6 " +"Neighbor Advertisements) die moeten worden uitgegeven na een failover-" +"gebeurtenis" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:286 msgid "" "Specifies the number of seconds between instances where the bonding driver " "sends learning packets to each slaves peer switch" msgstr "" +"Specificeert het aantal seconden tussen momenten waarop de bonding-driver " +"leerpakketten naar elke slave-peer-switch stuurt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" -msgstr "" +msgstr "Specificeert de volgorde van de IP-regels" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" -msgstr "" +msgstr "Specificeert de naam van de uitgaande logische interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" msgstr "" +"Specificeert het geprefereerde bronadres bij verzending naar bestemmingen " +"die onder het doel vallen" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:375 msgid "Specifies the quantity of ARP IP targets that must be reachable" -msgstr "" +msgstr "Specificeert het aantal ARP IP-doelen dat bereikbaar moet zijn" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:270 msgid "" "Specifies the rate in which the link partner will be asked to transmit " "LACPDU packets" msgstr "" +"Specificeert de snelheid waarmee de linkpartner wordt gevraagd om LACPDU-" +"pakketten te verzenden" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:227 msgid "" "Specifies the reselection policy for the primary slave when failure of the " "active slave or recovery of the primary slave occurs" msgstr "" +"Specificeert het herselectiebeleid voor de primaire slave wanneer de actieve " +"slave uitvalt of de primaire slave wordt hersteld" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" -msgstr "" +msgstr "Specificeert de te gebruiken routemetriek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" -msgstr "" +msgstr "Specificeert het routetype dat moet worden gemaakt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" -msgstr "" +msgstr "Specificeert de routeringsactie voor het regeldoel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" -msgstr "" +msgstr "Specificeert het bronsubnet dat moet overeenkomen (CIDR-notatie)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:246 msgid "Specifies the system priority" -msgstr "" +msgstr "Specificeert de systeemprioriteit" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:404 msgid "" "Specifies the time in milliseconds to wait before disabling a slave after a " "link failure detection" msgstr "" +"Specificeert de tijd in milliseconden die moet worden gewacht voordat een " +"slave wordt uitgeschakeld na detectie van een verbindingsfout" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:412 msgid "" "Specifies the time in milliseconds to wait before enabling a slave after a " "link recovery detection" msgstr "" +"Specificeert de tijd in milliseconden die moet worden gewacht voordat een " +"slave wordt ingeschakeld na detectie van linkherstel" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " "wireless settings." msgstr "" +"Specificeert de bekabelde poorten die op deze bridge moeten worden " +"aangesloten. Om draadloze netwerken aan te sluiten, kiest u de bijbehorende " +"interface als netwerk in de draadloze instellingen." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:383 msgid "" "Specifies whether ARP probes and replies should be validated or non-ARP " "traffic should be filtered for link monitoring" msgstr "" +"Specificeert of ARP-tests en -antwoorden moeten worden gevalideerd of niet-" +"ARP-verkeer moet worden gefilterd voor linkbewaking" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:303 msgid "" "Specifies whether active-backup mode should set all slaves to the same MAC " "address at enslavement" msgstr "" +"Specificeert of de actieve back-upmodus alle slaves moet instellen op " +"hetzelfde MAC-adres bij slavernij" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:420 msgid "" "Specifies whether or not miimon should use MII or ETHTOOL ioctls vs. " "netif_carrier_ok()" msgstr "" +"Specificeert of miimon al dan niet MII of ETHTOOL ioctls moet gebruiken vs. " +"netif_carrier_ok()" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:295 msgid "" "Specifies whether to shuffle active flows across slaves based on the load" msgstr "" +"Specificeert of actieve stromen over slaves moeten worden geschud op basis " +"van de belasting" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:181 msgid "" "Specifies which slave interfaces should be attached to this bonding interface" msgstr "" +"Geeft aan welke slave-interfaces aan deze bonding-interface moeten worden " +"gekoppeld" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:214 msgid "" "Specifies which slave is the primary device. It will always be the active " "slave while it is available" msgstr "" +"Specificeert welke slave het primaire apparaat is. Het zal altijd de actieve " +"slaaf zijn zolang deze beschikbaar is" #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:62 msgid "Specify a TOS (Type of Service)." -msgstr "" +msgstr "Geef een TOS (Type service) op." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:74 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:79 @@ -7482,6 +8854,9 @@ msgid "" "header inherits the value of the inner header) or an hexadecimal value " "00..FF (optional)." msgstr "" +"Geef een TOS (Type service) op. Kan erven zijn (de buitenste " +"koptekst erft de waarde van de binnenste koptekst) of een hexadecimale " +"waarde 00..FF (optioneel)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:74 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:74 @@ -7490,6 +8865,8 @@ msgid "" "Specify a TTL (Time to Live) for the encapsulating packet other than the " "default (64) (optional)." msgstr "" +"Geef een andere TTL (Time to Live) op voor het inkapselende pakket dan de " +"standaardwaarde (64) (optioneel)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 @@ -7499,6 +8876,8 @@ msgid "" "Specify a TTL (Time to Live) for the encapsulating packet other than the " "default (64)." msgstr "" +"Geef een andere TTL (Time to Live) op voor het inkapselende pakket dan de " +"standaardwaarde (64)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84 msgid "" @@ -7506,6 +8885,9 @@ msgid "" "inherits the value of the inner header) or an hexadecimal value 00.." "FF (optional)." msgstr "" +"Geef een verkeersklasse op. Kan erven zijn (de buitenste " +"koptekst erft de waarde van de binnenste koptekst) of een hexadecimale " +"waarde 00..FF (optioneel)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 @@ -7515,427 +8897,523 @@ msgid "" "Specify an MTU (Maximum Transmission Unit) other than the default (1280 " "bytes) (optional)." msgstr "" +"Geef een andere MTU (Maximum Transmission Unit) op dan de standaardwaarde " +"(1280 bytes) (optioneel)." #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 msgid "" "Specify an MTU (Maximum Transmission Unit) other than the default (1280 " "bytes)." msgstr "" +"Geef een andere MTU (Maximum Transmission Unit) op dan de standaardwaarde " +"(1280 bytes)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." +msgstr "Geef hier de geheime coderingssleutel op." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 -msgid "Stale neighbour cache timeout" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 +msgid "Stale neighbour cache timeout" +msgstr "Verouderde cache time-out" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" -msgstr "" +msgstr "Start" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:140 msgid "Start WPS" -msgstr "" +msgstr "Start WPS" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:76 msgid "Start priority" -msgstr "" +msgstr "Start prioriteit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" -msgstr "" +msgstr "Start verversen" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" -msgstr "" +msgstr "Configuratie starten is van toepassing…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." -msgstr "" +msgstr "Draadloze scan starten..." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:109 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:78 msgid "Startup" +msgstr "Opstarten" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" -msgstr "" +msgstr "Statische IPv4-routes" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv6 Routes" -msgstr "" +msgstr "Statische IPv6-routes" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:91 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:138 msgid "Static Lease" -msgstr "" +msgstr "Statische lease" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" -msgstr "" +msgstr "Statische leases" #: modules/luci-base/htdocs/luci-static/resources/network.js:2090 #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:172 #: modules/luci-compat/luasrc/model/network.lua:967 msgid "Static address" -msgstr "" +msgstr "Statisch adres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" +"Statische leases worden gebruikt om vaste IP-adressen en symbolische " +"hostnamen toe te wijzen aan DHCP-clients. Ze zijn ook vereist voor niet-" +"dynamische interfaceconfiguraties waarbij alleen hosts met een " +"overeenkomstige lease worden bediend." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" -msgstr "" +msgstr "Limiet voor inactiviteit van stations" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" -msgstr "" +msgstr "Status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" -msgstr "" +msgstr "Stop" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:135 msgid "Stop WPS" -msgstr "" +msgstr "Stop WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" -msgstr "" +msgstr "Stop verversen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:24 msgid "Storage" -msgstr "" +msgstr "Opslag" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" -msgstr "" +msgstr "Strenge filtering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" -msgstr "" +msgstr "Strikte orde" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 msgid "Strong" -msgstr "" +msgstr "Sterk" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" -msgstr "" +msgstr "Opslaan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" -msgstr "" +msgstr "Logboek onderdrukken" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." -msgstr "" +msgstr "Onderdruk het loggen van de routinehandeling voor het DHCP-protocol." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:46 msgid "Swap free" -msgstr "" +msgstr "Gratis ruilen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:3 msgid "Switch" -msgstr "" +msgstr "Switch" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:172 msgid "Switch %q" -msgstr "" +msgstr "Switch %q" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:150 msgid "" "Switch %q has an unknown topology - the VLAN settings might not be accurate." msgstr "" +"Switch %q heeft een onbekende topologie - de VLAN-instellingen zijn mogelijk " +"niet nauwkeurig." #: modules/luci-base/htdocs/luci-static/resources/network.js:3002 #: modules/luci-compat/luasrc/model/network.lua:1426 msgid "Switch VLAN" -msgstr "" +msgstr "Switch VLAN" #: modules/luci-base/htdocs/luci-static/resources/network.js:2999 msgid "Switch port" -msgstr "" +msgstr "Switch-poort" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" -msgstr "" +msgstr "Switch protocol" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:103 #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:104 #: modules/luci-compat/luasrc/view/cbi/ipaddr.htm:26 msgid "Switch to CIDR list notation" -msgstr "" +msgstr "Overschakelen naar CIDR-lijstnotatie" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" -msgstr "" +msgstr "Symbolische link" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:89 msgid "Sync with NTP-Server" -msgstr "" +msgstr "Synchroniseer met NTP-server" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:81 msgid "Sync with browser" -msgstr "" +msgstr "Synchroniseren met browser" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Syntaxis: /fqdn[/fqdn...] /[iPaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Syntaxis: _service._proto.example.com." #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" -msgstr "" +msgstr "Systeem" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:25 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:63 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:75 msgid "System Log" -msgstr "" +msgstr "Systeemlogboek" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:245 msgid "System Priority" -msgstr "" +msgstr "Systeem Prioriteit" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:118 msgid "System Properties" -msgstr "" +msgstr "Systeemeigenschappen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:162 msgid "System log buffer size" -msgstr "" +msgstr "Buffergrootte systeemlogboek" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." -msgstr "" +msgstr "Systeem draait in herstel (initramfs) modus." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:67 msgctxt "nft tcp option maxseg size" msgid "TCP MSS" -msgstr "" +msgstr "TCP MSS" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:54 msgctxt "nft tcp dport" msgid "TCP destination port" -msgstr "" +msgstr "TCP-bestemmingspoort" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:57 msgctxt "nft tcp flags" msgid "TCP flags" -msgstr "" +msgstr "TCP-vlaggen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:53 msgctxt "nft tcp sport" msgid "TCP source port" -msgstr "" +msgstr "TCP-bronpoort" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:338 msgid "TCP:" -msgstr "" +msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" -msgstr "" +msgstr "TFTP server root" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:50 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:85 msgid "TX" -msgstr "" +msgstr "TX" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:236 msgid "TX Rate" -msgstr "" +msgstr "TX Rate" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" -msgstr "" +msgstr "Lengte van de TX-wachtrij" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" +msgstr "Tafel" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Getagd" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" -msgstr "" +msgstr "Doel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" -msgstr "" +msgstr "Doelplatform" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:103 msgid "Target network" -msgstr "" +msgstr "Doelnetwerk" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:36 msgid "Temp space" -msgstr "" +msgstr "Tijdelijke ruimte" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:50 msgid "Terminate" -msgstr "" +msgstr "Beëindigen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" +"De MTU die moet worden " +"gepubliceerd in RA-berichten. Het minimum is 1280 bytes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" +"De vlag Managed address configuration (M) geeft aan dat IPv6-" +"adressen beschikbaar zijn via DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" +"De vlag Mobile IPv6 Home Agent (H) geeft aan dat het apparaat ook " +"fungeert als Mobile IPv6 home agent op deze link." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." msgstr "" +"De vlag Other configuration (O) geeft aan dat andere informatie, " +"zoals DNS-servers, beschikbaar is via DHCPv6." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:84 msgid "The block mount command failed with code %d" -msgstr "" +msgstr "De opdracht block mount is mislukt met code %d" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:80 msgid "" "The qrencode package is required for generating an QR code image of " "the configuration." msgstr "" +"Het pakket qrencode is vereist voor het genereren van een QR-" +"codeafbeelding van de configuratie." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" msgstr "" +"De DNS-serveritems in het lokale resolv.conf worden voornamelijk gesorteerd " +"op het hier opgegeven gewicht" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:77 msgid "" "The HE.net endpoint update configuration changed, you must now use the plain " "username instead of the user ID!" msgstr "" +"De updateconfiguratie van het HE.net-eindpunt is gewijzigd, u moet nu de " +"gewone gebruikersnaam gebruiken in plaats van de gebruikers-ID!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" -msgstr "" +msgstr "Het IP-adres %h wordt al gebruikt door een andere statische lease" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" -msgstr "" +msgstr "Het IP-adres valt buiten het adresbereik van een DHCP-pool" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" +msgstr "Het IP-adres van de opstartserver" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." msgstr "" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" +"Het IPv4-adres of de volledig gekwalificeerde domeinnaam van het externe " +"uiteinde." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +"Het IPv4-adres of de volledig gekwalificeerde domeinnaam van het externe " +"tunneleinde." #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 msgid "The IPv6 address or the fully-qualified domain name of the remote end." msgstr "" +"Het IPv6-adres of de volledig gekwalificeerde domeinnaam van het externe " +"uiteinde." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +"Het IPv6-adres of de volledig gekwalificeerde domeinnaam van het externe " +"tunneleinde." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" "The IPv6 prefix assigned to the provider, usually ends with ::" msgstr "" +"De IPv6 prefix die aan de provider is toegewezen, meestal eindigend op " +"::" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:7 msgid "The LED blinks with the configured on/off frequency" -msgstr "" +msgstr "De LED knippert met de ingestelde aan/uit-frequentie" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." -msgstr "" +msgstr "De LED knippert om de werkelijke hartslag te simuleren." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:8 msgid "" "The LED flashes with link status and activity on the configured interface." msgstr "" +"De LED knippert met linkstatus en activiteit op de geconfigureerde interface." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:7 msgid "The LED is always in default state off." -msgstr "" +msgstr "De LED is altijd standaard uitgeschakeld." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:6 msgid "The LED is always in default state on." -msgstr "" +msgstr "De LED staat altijd standaard aan." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" +"Het MAC-adres %h wordt al gebruikt door een andere statische lease in " +"dezelfde DHCP-pool" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" +"De MTU mag de MTU van het ouderapparaat van %d bytes niet overschrijden" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" -msgstr "" +msgstr "De VLAN-ID moet uniek zijn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "Het algoritme dat wordt gebruikt om mesh-routes te ontdekken" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" msgstr "" +"De toegestane karakters zijn: A-Z, a-z, 0-9 en _" #: modules/luci-compat/luasrc/view/cbi/error.htm:6 msgid "The configuration file could not be loaded due to the following error:" msgstr "" +"Het configuratiebestand kon niet worden geladen vanwege de volgende fout:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" +"De juiste SSID moet handmatig worden opgegeven wanneer u verbinding maakt " +"met een verborgen draadloos netwerk" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -7945,6 +9423,14 @@ msgid "" "or revert all pending changes to keep the currently working configuration " "state." msgstr "" +"Het apparaat kon niet worden bereikt binnen %d seconden na het aanbrengen " +"van de wijzigingen die in behandeling waren, waardoor de configuratie om " +"veiligheidsredenen werd teruggedraaid. Als u denkt dat de " +"configuratiewijzigingen desondanks correct zijn, voert u een " +"ongecontroleerde configuratietoepassing uit. U kunt deze waarschuwing ook " +"negeren en wijzigingen bewerken voordat u opnieuw probeert toe te passen, of " +"u kunt alle in behandeling zijnde wijzigingen ongedaan maken om de momenteel " +"werkende configuratiestatus te behouden." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:281 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:393 @@ -7952,23 +9438,29 @@ msgid "" "The device file of the memory or partition (e.g." " /dev/sda1)" msgstr "" +"Het apparaatbestand van het geheugen of de partitie (bijv. /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" -msgstr "" +msgstr "De apparaatnaam \"%s\" is al in gebruik" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" +"De bestaande netwerkconfiguratie moet worden gewijzigd om LuCI goed te laten " +"functioneren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." msgstr "" +"De bestaande draadloze configuratie moet worden gewijzigd om LuCI goed te " +"laten functioneren." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:220 msgid "" @@ -7976,46 +9468,77 @@ msgid "" "compare them with the original file to ensure data integrity.
    Click " "'Continue' below to start the flash procedure." msgstr "" +"De flash image is geupload. Hieronder staan de checksum en de " +"bestandsgrootte vermeld, vergelijk deze met het originele bestand om de " +"integriteit van de gegevens te waarborgen.
    Klik hieronder op " +"'Doorgaan' om de flashprocedure te starten." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:249 msgid "The following rules are currently active on this system." -msgstr "" +msgstr "De volgende regels zijn momenteel actief op dit systeem." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" +"De frequentie is recht evenredig met de gemiddelde CPU-belasting van 1 " +"minuut." #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:154 msgid "The gateway address must not be a local IP address" -msgstr "" +msgstr "Het gatewayadres mag geen lokaal IP-adres zijn" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" +"De gegenereerde configuratie kan worden geïmporteerd in een WireGuard-" +"clienttoepassing om een verbinding met dit apparaat tot stand te brengen." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." -msgstr "" +msgstr "De opgegeven openbare SSH-sleutel is al toegevoegd." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" +"De opgegeven openbare SSH-sleutel is ongeldig. Geef de juiste openbare RSA-, " +"ED25519- of ECDSA-sleutels op." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 -msgid "The hostname of the boot server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 -msgid "The interface name is already used" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" msgstr "" +"De hop penalty-instelling maakt het mogelijk om de voorkeur van batman-adv " +"voor multihop-routes versus korte routes te wijzigen. De waarde wordt " +"toegepast op de TQ van elke doorgestuurde OGM, waardoor de kosten van een " +"extra hop worden doorgegeven (het pakket moet worden ontvangen en opnieuw " +"verzonden, wat zendtijd kost)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 +msgid "The hostname of the boot server" +msgstr "De hostnaam van de opstartserver" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "De interface kon niet worden gevonden" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 +msgid "The interface name is already used" +msgstr "De interfacenaam wordt al gebruikt" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" -msgstr "" +msgstr "De interfacenaam is te lang" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 @@ -8023,34 +9546,37 @@ msgid "" "The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " "addresses." msgstr "" +"De lengte van het IPv4-prefix in bits, de rest wordt gebruikt in de IPv6-" +"adressen." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 msgid "The length of the IPv6 prefix in bits" -msgstr "" +msgstr "De lengte van het IPv6 prefix in bits" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:165 msgid "The local IPv4 address" -msgstr "" +msgstr "Het lokale IPv4-adres" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." -msgstr "" +msgstr "Het lokale IPv4-adres waarover de tunnel wordt gemaakt (optioneel)." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:171 msgid "The local IPv4 netmask" -msgstr "" +msgstr "Het lokale IPv4-netmasker" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:53 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 msgid "The local IPv6 address over which the tunnel is created (optional)." -msgstr "" +msgstr "Het lokale IPv6-adres waarover de tunnel wordt gemaakt (optioneel)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8058,30 +9584,45 @@ msgid "" "\"leave latency\" of the network. A reduced value results in reduced time to " "detect the loss of the last member of a group" msgstr "" +"De maximale reactietijd in centiseconden die is ingevoegd in " +"groepsspecifieke query's die zijn verzonden als reactie op het achterlaten " +"van groepsberichten. Het is ook de hoeveelheid tijd tussen groepsspecifieke " +"queryberichten. Deze waarde kan worden afgestemd om de \"leave latency\" van " +"het netwerk te wijzigen. Een verlaagde waarde resulteert in een kortere tijd " +"om het verlies van het laatste lid van een groep te detecteren" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " "IGMP messages on the subnet; larger values make the traffic less bursty, as " "host responses are spread out over a larger interval" msgstr "" +"De maximale reactietijd in centiseconden die is ingevoegd in de periodieke " +"algemene vragen. Door de waarde te variëren, kan een beheerder de burstiness " +"van IGMP-berichten op het subnet afstemmen; grotere waarden maken het " +"verkeer minder burstachtig, omdat hostantwoorden over een groter interval " +"worden verspreid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" +"Het maximale aantal hops dat moet worden gepubliceerd in RA-berichten. Maximaal is 255 hops." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" +"De netwerktoegang tot dit apparaat kan worden onderbroken door de " +"instellingen van de \"%h\"-interface te wijzigen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" -msgstr "" +msgstr "De netwerknaam wordt al gebruikt" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 msgid "" @@ -8092,60 +9633,82 @@ msgid "" "segments. Often there is by default one Uplink port for a connection to the " "next greater network like the internet and other ports for a local network." msgstr "" +"De netwerkpoorten op dit apparaat kunnen worden gecombineerd tot meerdere " +"VLANs waarin computers " +"rechtstreeks met elkaar kunnen communiceren. VLAN's worden vaak gebruikt om verschillende " +"netwerksegmenten van elkaar te scheiden. Vaak is er standaard één Uplink-" +"poort voor een verbinding met het volgende grotere netwerk zoals internet en " +"andere poorten voor een lokaal netwerk." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" +"De openbare hostnaam of het IP-adres van dit systeem waarmee de peer " +"verbinding moet maken. Dit is meestal een statisch openbaar IP-adres, een " +"statische hostnaam of een DDNS-domein." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" -msgstr "" +msgstr "Het query-antwoordinterval moet lager zijn dan de query-intervalwaarde" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:158 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:42 msgid "The reboot command failed with code %d" -msgstr "" +msgstr "Het reboot commando is mislukt met code %d" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:147 msgid "The restore command failed with code %d" -msgstr "" +msgstr "De herstelopdracht is mislukt met code %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" +"De robuustheidswaarde maakt afstemming mogelijk voor het verwachte " +"pakketverlies op het netwerk. Als verwacht wordt dat een netwerk " +"verliesgevend is, kan de robuustheidswaarde worden verhoogd. IGMP is robuust " +"tegen (Robustness-1) pakketverliezen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" +"Het regeldoel is een sprong naar een andere regel die wordt gespecificeerd " +"door zijn prioriteitswaarde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" +"Het doel van de regel is een tabel-opzoek-ID: een numerieke tabelindex " +"variërend van 0 tot 65535 of een symboolalias gedeclareerd in /etc/iproute2/" +"rt_tables. Speciale aliassen local (255), main (254) en default (253) zijn " +"ook geldig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" -msgstr "" +msgstr "De geselecteerde %s-modus is niet compatibel met %s-codering" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" -msgstr "" +msgstr "Het ingediende beveiligingstoken is ongeldig of al verlopen!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:98 msgid "" "The system is erasing the configuration partition now and will reboot itself " "when finished." msgstr "" +"Het systeem is nu de configuratiepartitie aan het wissen en zal zichzelf " +"opnieuw opstarten als het klaar is." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:320 msgid "" @@ -8154,19 +9717,34 @@ msgid "" "address of your computer to reach the device again, depending on your " "settings." msgstr "" +"Het systeem knippert nu.
    SCHAKEL HET APPARAAT NIET UIT!
    Wacht " +"een paar minuten voordat u opnieuw verbinding probeert te maken. Afhankelijk " +"van uw instellingen kan het nodig zijn om het adres van uw computer te " +"vernieuwen om het apparaat weer te kunnen bereiken." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:163 msgid "" "The system is rebooting now. If the restored configuration changed the " "current LAN IP address, you might need to reconnect manually." msgstr "" +"Het systeem wordt nu opnieuw opgestart. Als de herstelde configuratie het " +"huidige LAN IP-adres heeft gewijzigd, moet u mogelijk handmatig opnieuw " +"verbinding maken." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:85 msgid "The system password has been successfully changed." -msgstr "" +msgstr "Het systeemwachtwoord is succesvol gewijzigd." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:345 msgid "The sysupgrade command failed with code %d" +msgstr "De opdracht sysupgrade is mislukt met code %d" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 @@ -8175,175 +9753,242 @@ msgid "" "listed below. Press \"Continue\" to restore the backup and reboot, or " "\"Cancel\" to abort the operation." msgstr "" +"Het geüploade back-uparchief lijkt geldig te zijn en bevat de onderstaande " +"bestanden. Druk op \"Doorgaan\" om de back-up te herstellen en opnieuw op te " +"starten, of op \"Annuleren\" om de bewerking af te breken." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:115 msgid "The uploaded backup archive is not readable" -msgstr "" +msgstr "Het geüploade back-uparchief is niet leesbaar" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:249 msgid "The uploaded firmware does not allow keeping current configuration." msgstr "" +"De geüploade firmware maakt het niet mogelijk om de huidige configuratie te " +"behouden." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:244 msgid "" "The uploaded image file does not contain a supported format. Make sure that " "you choose the generic image format for your platform." msgstr "" +"Het geüploade image bestand bevat geen ondersteund formaat. Zorg ervoor dat " +"u het algemene image formaat voor uw platform kiest." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "De waarde wordt overschreven door de configuratie." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" +"De waarde specificeert het interval (milliseconden) waarin batman-adv het " +"netwerk overspoelt met zijn protocolinformatie." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" +"Er zijn verouderde iptables-regels aanwezig op het systeem. Het combineren " +"van iptables- en nftables-regels wordt afgeraden en kan leiden tot " +"onvolledige verkeersfiltering." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" -msgstr "" +msgstr "Er zijn geen actieve huurcontracten" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" -msgstr "" +msgstr "Er zijn geen wijzigingen toe te passen" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " "protect the web interface." msgstr "" +"Er is geen wachtwoord ingesteld op deze router. Stel een root-wachtwoord in " +"om de webinterface te beschermen." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 msgid "This IPv4 address of the relay" -msgstr "" +msgstr "Dit IPv4-adres van het relais" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" +"Dit verificatietype is niet van toepassing op de geselecteerde EAP-methode." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" -msgstr "" +msgstr "Dit ziet er niet uit als een geldig PEM-bestand" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " "configurations are automatically preserved." msgstr "" +"Dit is een lijst met shell-globpatronen voor overeenkomende bestanden en " +"mappen die moeten worden opgenomen tijdens sysupgrade. Gewijzigde bestanden " +"in /etc/config/ en bepaalde andere configuraties worden automatisch behouden." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 msgid "" "This is either the \"Update Key\" configured for the tunnel or the account " "password if no update key has been configured" msgstr "" +"Dit is de \"Update Key\" die is geconfigureerd voor de tunnel of het " +"accountwachtwoord als er geen updatesleutel is geconfigureerd" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Dit is het batman-adv-apparaat waar je het fysieke apparaat van bovenaf aan " +"wilt koppelen. Als deze lijst leeg is, moet u er eerst een maken. Als u mesh-" +"verkeer via een bekabeld netwerkapparaat wilt routeren, selecteert u dit in " +"de bovenstaande apparaatkiezer. Als je de batman-adv-interface wilt " +"toewijzen aan een wifi-mesh, selecteer dan geen apparaat in de " +"apparaatkiezer, maar ga naar de draadloze instellingen en selecteer van " +"daaruit deze interface als een netwerk." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " "front of 'exit 0') to execute them at the end of the boot process." msgstr "" +"Dit is de inhoud van /etc/rc.local. Voeg hier uw eigen commando's in (voor " +"'exit 0') om ze aan het einde van het opstartproces uit te voeren." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:54 msgid "" "This is the local endpoint address assigned by the tunnel broker, it usually " "ends with ...:2/64" msgstr "" +"Dit is het lokale eindpuntadres dat is toegewezen door de tunnelmakelaar, " +"het eindigt meestal op ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." -msgstr "" +msgstr "Dit is de enige DHCP-server in het lokale netwerk." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "This is the plain username for logging into the account" -msgstr "" +msgstr "Dit is de gewone gebruikersnaam om in te loggen op het account" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 msgid "" "This is the prefix routed to you by the tunnel broker for use by clients" msgstr "" +"Dit is de prefix die door de tunnelmakelaar naar u wordt gerouteerd voor " +"gebruik door cliënten" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:29 msgid "This is the system crontab in which scheduled tasks can be defined." msgstr "" +"Dit is de systeem crontab waarin geplande taken kunnen worden gedefinieerd." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 msgid "" "This is usually the address of the nearest PoP operated by the tunnel broker" msgstr "" +"Dit is meestal het adres van de dichtstbijzijnde PoP die wordt beheerd door " +"de tunnelmakelaar" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:65 msgid "" "This list gives an overview over currently running system processes and " "their status." msgstr "" +"Deze lijst geeft een overzicht van momenteel lopende systeemprocessen en hun " +"status." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" +"Deze optie kan niet worden gebruikt omdat het ca-bundelpakket niet is " +"geïnstalleerd." #: modules/luci-base/htdocs/luci-static/resources/form.js:2280 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:172 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:32 msgid "This section contains no values yet" -msgstr "" +msgstr "Deze sectie bevat nog geen waarden" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:124 msgid "Time Synchronization" -msgstr "" +msgstr "Tijdsynchronisatie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Tijd advertentie" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" -msgstr "" +msgstr "Tijd in milliseconden" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" -msgstr "" +msgstr "Tijd in seconden om te luisteren en te leren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" -msgstr "" +msgstr "Tijdsinterval voor het opnieuw versleutelen van GTK" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Tijdzone" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" -msgstr "" +msgstr "Time-out" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" -msgstr "" +msgstr "Time-out in seconden" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" +"Time-out in seconden voor geleerde MAC-adressen in de doorstuurdatabase" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" -msgstr "" +msgstr "Time-out in seconden tot topologie-updates bij verlies van link" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:145 msgid "Timezone" -msgstr "" +msgstr "Tijdzone" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" +"Gebruik in plaats daarvan de configuratie-import om de lokale WireGuard-interface " +"volledig te configureren vanuit een bestaand (bijv. door de provider " +"geleverd) configuratiebestand." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" @@ -8351,378 +9996,455 @@ msgid "" "archive here. To reset the firmware to its initial state, click \"Perform " "reset\" (only possible with squashfs images)." msgstr "" +"Om configuratiebestanden te herstellen, kunt u hier een eerder gegenereerd " +"back-uparchief uploaden. Om de firmware terug te zetten naar de " +"oorspronkelijke staat, klikt u op \"Reset uitvoeren\" (alleen mogelijk met " +"squashfs-afbeeldingen)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" -msgstr "" +msgstr "Toon" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:35 msgid "Total Available" -msgstr "" +msgstr "Totaal beschikbaar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" +msgstr "Traceroute" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 msgid "Traffic" -msgstr "" +msgstr "Verkeer" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:79 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84 msgid "Traffic Class" -msgstr "" +msgstr "Verkeersklasse" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" -msgstr "" +msgstr "Verkeersfilter reeksen \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" -msgstr "" +msgstr "Verkeer komt overeen met regel: %.1000mPackets, %.1024mBytes" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:387 msgid "Transfer" -msgstr "" +msgstr "Overdracht" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:25 msgid "Transmit" -msgstr "" +msgstr "Zenden" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:319 msgid "Transmit Hash Policy" +msgstr "Hash-beleid verzenden" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Verzonden gegevens" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" -msgstr "" +msgstr "Transport header bits %d-%d" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:59 msgctxt "nft th dport" msgid "Transport header destination port" -msgstr "" +msgstr "Transport header bestemmingspoort" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:58 msgctxt "nft th sport" msgid "Transport header source port" -msgstr "" +msgstr "Transport header bronpoort" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:75 msgid "Trigger" -msgstr "" +msgstr "Trekker" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:20 msgid "Trigger Mode" -msgstr "" +msgstr "Trigger-modus" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:69 msgid "Tunnel ID" -msgstr "" +msgstr "Tunnel ID" #: modules/luci-base/htdocs/luci-static/resources/network.js:3005 #: modules/luci-compat/luasrc/model/network.lua:1431 msgid "Tunnel Interface" -msgstr "" +msgstr "Tunnelinterface" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:44 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:55 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:76 msgid "Tunnel Link" -msgstr "" +msgstr "Tunnelverbinding" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" -msgstr "" +msgstr "Tunnel apparaat" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 msgid "Tx-Power" -msgstr "" +msgstr "Tx-vermogen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" -msgstr "" +msgstr "Type" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" -msgstr "" +msgstr "Soort dienst" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:56 msgctxt "nft udp dport" msgid "UDP destination port" -msgstr "" +msgstr "UDP-bestemmingspoort" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:55 msgctxt "nft udp sport" msgid "UDP source port" -msgstr "" +msgstr "UDP-bronpoort" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:328 msgid "UDP:" -msgstr "" +msgstr "UDP:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:91 msgid "UMTS only" -msgstr "" +msgstr "Alleen UMTS" #: modules/luci-compat/luasrc/model/network/proto_3g.lua:10 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:43 msgid "UMTS/GPRS/EV-DO" -msgstr "" +msgstr "UMTS/GPRS/EV-DO" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 msgid "UUID" -msgstr "" +msgstr "UUID" #: modules/luci-base/htdocs/luci-static/resources/network.js:16 #: modules/luci-base/htdocs/luci-static/resources/network.js:17 #: modules/luci-compat/luasrc/model/network.lua:34 #: modules/luci-compat/luasrc/model/network.lua:35 msgid "Unable to determine device name" -msgstr "" +msgstr "Kan apparaatnaam niet bepalen" #: modules/luci-base/htdocs/luci-static/resources/network.js:18 #: modules/luci-compat/luasrc/model/network.lua:36 msgid "Unable to determine external IP address" -msgstr "" +msgstr "Kan extern IP-adres niet bepalen" #: modules/luci-base/htdocs/luci-static/resources/network.js:19 #: modules/luci-compat/luasrc/model/network.lua:37 msgid "Unable to determine upstream interface" -msgstr "" +msgstr "Kan de upstream-interface niet bepalen" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" -msgstr "" +msgstr "Kan niet verzenden" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:85 msgid "Unable to generate QR code: %s" -msgstr "" +msgstr "Kan geen QR-code genereren: %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:9 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:15 msgid "Unable to load log data:" -msgstr "" +msgstr "Kan loggegevens niet laden:" #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:54 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:54 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:22 msgid "Unable to obtain client ID" -msgstr "" +msgstr "Kan client-id niet verkrijgen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:221 msgid "Unable to obtain mount information" -msgstr "" +msgstr "Kan geen mount-informatie verkrijgen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:307 msgid "Unable to reset ip6tables counters: %s" -msgstr "" +msgstr "Kan ip6tables-tellers niet resetten: %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:305 msgid "Unable to reset iptables counters: %s" -msgstr "" +msgstr "Kan iptables-tellers niet resetten: %s" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:61 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:7 msgid "Unable to resolve AFTR host name" -msgstr "" +msgstr "Kan AFTR hostnaam niet oplossen" #: modules/luci-base/htdocs/luci-static/resources/network.js:20 #: modules/luci-compat/luasrc/model/network.lua:38 msgid "Unable to resolve peer host name" -msgstr "" +msgstr "Kan peer hostnaam niet oplossen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:313 msgid "Unable to restart firewall: %s" -msgstr "" +msgstr "Kan firewall niet herstarten: %s" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:370 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:57 msgid "Unable to save contents: %s" +msgstr "Kan inhoud niet opslaan: %s" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "Kan pincode niet verifiëren" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" -msgstr "" +msgstr "Deconfigureer" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" -msgstr "" +msgstr "Onverwacht antwoord data formaat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " "analogous to IPv4 private network addressing. This prefix is randomly " "generated at first install." msgstr "" +"Uniek lokaal adres - in het bereik fc00::/7. Gewoonlijk alleen " +"binnen de ‘lokale’ halve fd00::/8. ULA voor IPv6 is " +"analoog aan adressering van IPv4-private netwerken. Dit voorvoegsel wordt " +"willekeurig gegenereerd bij de eerste installatie." #: modules/luci-base/htdocs/luci-static/resources/network.js:2092 #: modules/luci-compat/luasrc/model/network.lua:971 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:17 msgid "Unknown" -msgstr "" +msgstr "Onbekend" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." -msgstr "" +msgstr "Onbekende en niet-ondersteunde verbindingsmethode." #: modules/luci-base/htdocs/luci-static/resources/network.js:2401 #: modules/luci-compat/luasrc/model/network.lua:1138 msgid "Unknown error (%s)" -msgstr "" +msgstr "Onbekende fout (%s)" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:412 msgid "Unknown error code" -msgstr "" +msgstr "Onbekende foutcode" #: modules/luci-base/htdocs/luci-static/resources/network.js:2089 #: modules/luci-base/htdocs/luci-static/resources/protocol/none.js:6 #: modules/luci-compat/luasrc/model/network.lua:965 msgid "Unmanaged" -msgstr "" +msgstr "Onbeheerd" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:195 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:217 msgid "Unmount" -msgstr "" +msgstr "Ontkoppelen" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" -msgstr "" +msgstr "Naamloze sleutel" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" -msgstr "" +msgstr "Niet-opgeslagen wijzigingen" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:410 msgid "Unspecified error" -msgstr "" +msgstr "Ongespecificeerde fout" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:64 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:9 msgid "Unsupported MAP type" -msgstr "" +msgstr "Niet-ondersteund MAP-type" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" -msgstr "" +msgstr "Niet-ondersteunde modem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Niet-ondersteund protocol" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." -msgstr "" +msgstr "Niet-ondersteund protocoltype." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Niet getagd" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" -msgstr "" +msgstr "Naamloze peer" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 msgid "Up" -msgstr "" +msgstr "Omhoog" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:411 msgid "Up Delay" -msgstr "" +msgstr "Op vertraging" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" -msgstr "" +msgstr "Uploaden" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:441 msgid "" "Upload a sysupgrade-compatible image here to replace the running firmware." msgstr "" +"Upload hier een sysupgrade-compatibele image om de huidige firmware te " +"vervangen." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:138 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:169 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:412 msgid "Upload archive..." -msgstr "" +msgstr "Archief uploaden..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" -msgstr "" +msgstr "Bestand uploaden" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" -msgstr "" +msgstr "Bestand uploaden…" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "Upload is geannuleerd" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" -msgstr "" +msgstr "Uploadverzoek mislukt: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" -msgstr "" +msgstr "Bestand uploaden…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" +"Door op \"Doorgaan\" te drukken, worden anonieme \"wifi-iface\"-secties " +"toegewezen met een naam in de vorm wifinet# en wordt het netwerk " +"opnieuw opgestart om de bijgewerkte configuratie toe te passen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" +"Wanneer u op \"Doorgaan\" drukt, wordt de configuratie van bruggen " +"bijgewerkt en wordt het netwerk opnieuw opgestart om de bijgewerkte " +"configuratie toe te passen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" +"Als u op \"Doorgaan\" drukt, krijgen de ifname-opties een nieuwe naam en " +"wordt het netwerk opnieuw opgestart om de bijgewerkte configuratie toe te " +"passen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" -"DNS servers worden geraadpleegd in " -"volgorde van het resolvbestand" +"Upstream resolvers worden bevraagd in de volgorde van het resolv-bestand." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" -msgstr "" +msgstr "Bedrijfstijd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" -msgstr "" +msgstr "Gebruik /etc/ethers" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Gebruik DHCP" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" -msgstr "" +msgstr "Gebruik DHCP geadverteerde servers" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 msgid "Use DHCP gateway" -msgstr "" +msgstr "Gebruik de DHCP-gateway" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Gebruik DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" -msgstr "" +msgstr "Gebruik DNS-servers geadverteerd door peer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." -msgstr "" +msgstr "Gebruik ISO/IEC 3166 alpha2 landencodes." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:48 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:89 @@ -8731,89 +10453,96 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:67 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:84 msgid "Use MTU on tunnel interface" -msgstr "" +msgstr "Gebruik MTU op tunnelinterface" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:85 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:65 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:49 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:80 msgid "Use TTL on tunnel interface" -msgstr "" +msgstr "Gebruik TTL op tunnelinterface" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:322 msgid "Use XOR of hardware MAC addresses (layer2)" -msgstr "" +msgstr "Gebruik XOR van hardware MAC-adressen (laag2)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:323 msgid "Use XOR of hardware MAC addresses and IP addresses (layer2+3)" -msgstr "" +msgstr "Gebruik XOR van hardware MAC-adressen en IP-adressen (layer2+3)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:325 msgid "" "Use XOR of hardware MAC addresses and IP addresses, rely on skb_flow_dissect " "(encap2+3)" msgstr "" +"Gebruik XOR van hardware MAC-adressen en IP-adressen, vertrouw op " +"skb_flow_dissect (encap2+3)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:295 msgid "Use as external overlay (/overlay)" -msgstr "" +msgstr "Gebruik als externe overlay (/overlay)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:294 msgid "Use as root filesystem (/)" -msgstr "" +msgstr "Gebruik als rootbestandssysteem (/)" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 msgid "Use broadcast flag" -msgstr "" +msgstr "Gebruik broadcast-vlag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" -msgstr "" +msgstr "Gebruik ingebouwd IPv6-beheer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" -msgstr "" +msgstr "Aangepaste DNS-servers gebruiken" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" -msgstr "" +msgstr "Gebruik de standaardgateway" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" -msgstr "" +msgstr "Gebruik gateway-metriek" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 msgid "Use legacy MAP" -msgstr "" +msgstr "Gebruik legacy MAP" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 msgid "" "Use legacy MAP interface identifier format (draft-ietf-softwire-map-00) " "instead of RFC7597" msgstr "" +"Gebruik verouderd MAP-interface-identificatieformaat (draft-ietf-softwire-" +"map-00) in plaats van RFC7597" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 msgid "Use routing table" -msgstr "" +msgstr "Gebruik routeringstabel" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:63 msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" -msgstr "" +msgstr "Gebruik dezelfde bron en bestemming voor elke verbinding" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" -msgstr "" +msgstr "Gebruik systeemcertificaten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" -msgstr "" +msgstr "Gebruik systeemcertificaten voor binnentunnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8821,90 +10550,102 @@ msgid "" "the requesting host. The optional Lease time can be used to set non-" "standard host-specific lease time, e.g. 12h, 3d or infinite." msgstr "" +"Gebruik de knop Toevoegen om een nieuw lease-item toe te voegen. " +"Het MAC-adres identificeert de host, het IPv4-adres " +"specificeert het te gebruiken vaste adres en de Hostnaam wordt " +"toegewezen als een symbolische naam aan de aanvragende host. De optionele " +"Leasetijd kan worden gebruikt om niet-standaard hostspecifieke " +"leasetijd in te stellen, b.v. 12u, 3d of oneindig." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:324 msgid "Use upper layer protocol information (layer3+4)" -msgstr "" +msgstr "Gebruik protocolinformatie van de bovenste laag (layer3+4)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:326 msgid "" "Use upper layer protocol information, rely on skb_flow_dissect (encap3+4)" msgstr "" +"Gebruik protocolinformatie van de bovenste laag, vertrouw op " +"skb_flow_dissect (encap3+4)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:36 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:194 msgid "Used" -msgstr "" +msgstr "Gebruikt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" -msgstr "" +msgstr "Gebruikte sleutelsleuf" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" +"Gebruikt voor twee verschillende doeleinden: RADIUS NAS ID en 802.11r R0KH-" +"ID. Niet nodig met normale WPA(2)-PSK." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" -msgstr "" +msgstr "Gebruikersgroep" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" -msgstr "" +msgstr "Gebruikerscertificaat (PEM-gecodeerd)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" -msgstr "" +msgstr "Gebruikersnaam" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" -msgstr "" +msgstr "Gebruikerssleutel (PEM-gecodeerd)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" -msgstr "" +msgstr "Gebruikersnaam" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" -msgstr "" +msgstr "Gebruik flowtabel %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" -msgstr "" +msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" -msgstr "" +msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" -msgstr "" +msgstr "VEPA (Virtual Ethernet Poort Aggregator)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" -msgstr "" +msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" -msgstr "" +msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" -msgstr "" +msgstr "VLAN-ID" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:173 msgid "VLANs on %q" -msgstr "" +msgstr "VLAN's op %q" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:54 msgid "VPN" @@ -8912,281 +10653,389 @@ msgstr "VPN" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:42 msgid "VPN Local address" -msgstr "" +msgstr "VPN Lokaal adres" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:46 msgid "VPN Local port" -msgstr "" +msgstr "VPN Lokale poort" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" -msgstr "" +msgstr "VPN-protocol" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" -msgstr "" +msgstr "VPN-server" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "De SHA256-hash van het VPN-servercertificaat" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" -msgstr "" +msgstr "VPN-serverpoort" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" -msgstr "" +msgstr "VPN Server certificaat SHA1 hash" #: modules/luci-compat/luasrc/model/network/proto_vpnc.lua:9 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:9 msgid "VPNC (CISCO 3000 (and others) VPN)" -msgstr "" +msgstr "VPNC (CISCO 3000 (en anderen) VPN)" + +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" -msgstr "" +msgstr "VXLAN (RFC7348)" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 msgid "VXLAN network identifier" -msgstr "" +msgstr "VXLAN-netwerkidentificatie" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:10 msgid "VXLANv6 (RFC7348)" -msgstr "" +msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" +"Valideer DNS-antwoorden en cache DNSSEC-gegevens, vereist upstream om DNSSEC " +"te ondersteunen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" msgstr "" +"Valideer het servercertificaat met behulp van de ingebouwde systeem-CA-" +"bundel,
    vereist het \"ca-bundel\"-pakket" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:388 msgid "Validation for all slaves" -msgstr "" +msgstr "Validatie voor alle slaven" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:386 msgid "Validation only for active slave" -msgstr "" +msgstr "Validatie alleen voor actieve slave" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:387 msgid "Validation only for backup slaves" -msgstr "" +msgstr "Validatie alleen voor back-upslaves" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:73 msgid "Vendor" -msgstr "" +msgstr "Leverancier" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:40 msgid "Vendor Class to send when requesting DHCP" msgstr "" +"Leveranciersklasse die moet worden verzonden bij het aanvragen van DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" +"Controleer of reacties op niet-ondertekende domeinen echt afkomstig zijn van " +"niet-ondertekende domeinen." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:196 msgid "Verifying the uploaded image file." -msgstr "" +msgstr "Het geüploade afbeeldingsbestand verifiëren." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" -msgstr "" +msgstr "Zeer hoog" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" -msgstr "" +msgstr "Virtueel Ethernet" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:60 msgid "Virtual dynamic interface" -msgstr "" +msgstr "Virtuele dynamische interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" -msgstr "" +msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" -msgstr "" +msgstr "WEP Open Systeem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" -msgstr "" +msgstr "Gedeelde WEP-sleutel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" -msgstr "" +msgstr "WEP-wachtwoordzin" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "WLAN-roaming" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" -msgstr "" +msgstr "WMM-modus" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "WNM-slaapstand" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "WNM slaapstand opgelost" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" -msgstr "" +msgstr "WPA-wachtwoordzin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." msgstr "" +"Voor WPA-Encryptie moet wpa_supplicant (voor clientmodus) of hostapd (voor " +"AP- en ad-hocmodus) zijn geïnstalleerd." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:153 msgid "WPS status" -msgstr "" +msgstr "WPS-status" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:47 msgid "Waiting for device..." -msgstr "" +msgstr "Wachten op apparaat..." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:189 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:199 msgid "Warning" -msgstr "" +msgstr "Waarschuwing" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:26 msgid "Warning: There are unsaved changes that will get lost on reboot!" msgstr "" +"Waarschuwing: Er zijn niet opgeslagen wijzigingen die verloren gaan bij het " +"opnieuw opstarten!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 msgid "Weak" +msgstr "Zwak" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Gewicht" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" +"Bij het delegeren van prefixen aan meerdere downstreams worden interfaces " +"met een hogere voorkeurswaarde het eerst in aanmerking genomen bij de " +"toewijzing van subnetten." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Indien ingeschakeld, verhoogt netwerkcodering de wifi-doorvoer door meerdere " +"frames te combineren tot één frame, waardoor de benodigde zendtijd wordt " +"verminderd." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Indien ingeschakeld, vormt de gedistribueerde ARP-tabel een mesh-brede ARP-" +"cache die niet-mesh-clients helpt om ARP-antwoorden veel betrouwbaarder en " +"zonder veel vertraging te ontvangen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" +"Indien ingeschakeld, is de gateway on-link, zelfs als de gateway niet " +"overeenkomt met een interfaceprefix" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Indien ingeschakeld, worden nieuwe ARP-tabelitems toegevoegd van ontvangen " +"onnodige APR-verzoeken of -antwoorden, anders worden alleen reeds bestaande " +"tabelitems bijgewerkt, maar worden er geen nieuwe hosts geleerd." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Wanneer omgekeerd, brandt de LED continu en flikkert in plaats van dat deze " +"standaard uit is en knippert bij systeemactiviteit." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Wanneer de mesh over meerdere wifi-interfaces per node loopt, kan batman-adv " +"de verkeersstroom optimaliseren om maximale prestaties te behalen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" +"Bij gebruik van een PSK kan de PMK automatisch worden gegenereerd. Indien " +"ingeschakeld, worden de R0/R1-sleutelopties hieronder niet toegepast. " +"Schakel dit uit om de toetsopties R0 en R1 te gebruiken." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" +"Waar Wi-Fi Multimedia (WMM) Mode QoS is uitgeschakeld, kunnen clients " +"beperkt zijn tot 802.11a/802.11g-snelheden." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" +"Als de ESSID verborgen is, kunnen clients mogelijk niet roamen en kan de " +"efficiëntie van de zendtijd aanzienlijk worden verminderd." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" -msgstr "" +msgstr "Breedte" + +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "WireGuard-status" #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" -msgstr "" +msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" -msgstr "" +msgstr "WireGuard peer is uitgeschakeld" #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:17 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:10 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:148 msgid "Wireless" -msgstr "" +msgstr "Draadloos" #: modules/luci-base/htdocs/luci-static/resources/network.js:2992 #: modules/luci-compat/luasrc/model/network.lua:1419 msgid "Wireless Adapter" -msgstr "" +msgstr "Draadloze adapter" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" -msgstr "" +msgstr "Draadloos netwerk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" -msgstr "" +msgstr "Draadloos overzicht" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" -msgstr "" +msgstr "Draadloze beveiliging" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" -msgstr "" +msgstr "Migratie van draadloze configuratie" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:153 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:152 msgid "Wireless is disabled" -msgstr "" +msgstr "Draadloos is uitgeschakeld" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:153 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:152 msgid "Wireless is not associated" -msgstr "" +msgstr "Draadloos is niet gekoppeld" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" -msgstr "" +msgstr "Draadloos netwerk is uitgeschakeld" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" -msgstr "" +msgstr "Draadloos netwerk is ingeschakeld" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." -msgstr "" +msgstr "Schrijf ontvangen DNS-query's naar syslog." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:181 msgid "Write system log to file" -msgstr "" +msgstr "Systeemlogboek naar bestand schrijven" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:206 msgid "XOR policy (balance-xor, 2)" -msgstr "" +msgstr "XOR-beleid (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" -msgstr "" +msgstr "Ja" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:305 msgid "Yes (none, 0)" -msgstr "" +msgstr "Ja (geen, 0)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:177 msgid "" "You appear to be currently connected to the device via the \"%h\" interface. " "Do you really want to shut down the interface?" msgstr "" +"Het lijkt erop dat u momenteel verbonden bent met het apparaat via de \"%h\"-" +"interface. Wilt u de interface echt afsluiten?" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:112 msgid "" @@ -9194,67 +11043,110 @@ msgid "" "after a device reboot.
    Warning: If you disable essential init " "scripts like \"network\", your device might become inaccessible!" msgstr "" +"U kunt geïnstalleerde init-scripts hier in- of uitschakelen. Wijzigingen " +"worden toegepast nadat het apparaat opnieuw is opgestart.
    Waarschuwing: als u essentiële init-scripts zoals \"netwerk\" " +"uitschakelt, kan uw apparaat ontoegankelijk worden!" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "U kunt meerdere records voor hetzelfde doel toevoegen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "U kunt meerdere records voor hetzelfde domein toevoegen." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "U kunt meerdere unieke Relay To op hetzelfde luisteradres toevoegen." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." msgstr "" +"U moet JavaScript in uw browser inschakelen, anders werkt LuCI niet correct." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:117 msgid "" "You must select a primary interface which is included in selected slave " "interfaces!" msgstr "" +"U moet een primaire interface selecteren die is opgenomen in de " +"geselecteerde slave-interfaces!" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:98 msgid "" "You must select at least one ARP IP target if ARP monitoring is selected!" msgstr "" +"U moet ten minste één ARP IP-doel selecteren als ARP-bewaking is " +"geselecteerd!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:213 msgid "ZRam Compression Algorithm" -msgstr "" +msgstr "ZRam-compressie-algoritme" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:206 msgid "ZRam Settings" -msgstr "" +msgstr "ZRam-instellingen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:208 msgid "ZRam Size" +msgstr "ZRam Grootte" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, ... ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Opmerking: hoewel " +"_http mogelijk is, ondersteunen geen browsers SRV-records.)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" -msgstr "" +msgstr "elke" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" -msgstr "" +msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" -msgstr "" +msgstr "automatisch" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automatisch (uitgeschakeld)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automatisch (ingeschakeld)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" -msgstr "" +msgstr "basisT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" -msgstr "" +msgstr "overbrugd" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:146 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:406 @@ -9262,11 +11154,11 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:99 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:31 msgid "create" -msgstr "" +msgstr "maak" #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:69 msgid "create:" -msgstr "" +msgstr "maken:" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:55 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 @@ -9302,230 +11194,279 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:316 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:317 msgid "dBm" -msgstr "" +msgstr "dBm" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:73 msgctxt "nft unit" msgid "day" -msgstr "" +msgstr "dag" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +msgstr "uitschakelen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" -msgstr "" +msgstr "uitgeschakeld" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" +msgstr "standaard stuurprogramma" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" msgstr "" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" -msgstr "" +msgstr "bijv.: --proxy 10.10.10.10" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 msgid "e.g: dump" -msgstr "" +msgstr "bijv.: dump" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "Ingeschakeld" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "elke %ds" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" -msgstr "" +msgstr "verlopen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" -msgstr "" +msgstr "gedwongen" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:85 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:196 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:61 msgid "forward" -msgstr "" +msgstr "forward" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" -msgstr "" +msgstr "full-duplex" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" -msgstr "" +msgstr "half-duplex" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" -msgstr "" +msgstr "hexadecimale gecodeerde waarde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" -msgstr "" +msgstr "verborgen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:74 msgctxt "nft unit" msgid "hour" -msgstr "" +msgstr "uur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" -msgstr "" +msgstr "hybride modus" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:63 msgid "ignore" +msgstr "negeren" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 msgid "input" -msgstr "" +msgstr "invoer" #: modules/luci-base/htdocs/luci-static/resources/validation.js:410 msgid "key between 8 and 63 characters" -msgstr "" +msgstr "toets tussen 8 en 63 tekens" #: modules/luci-base/htdocs/luci-static/resources/validation.js:422 msgid "key with either 5 or 13 characters" +msgstr "toets met 5 of 13 tekens" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 -msgid "managed config (M)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 +msgid "managed config (M)" +msgstr "beheerde configuratie (M)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" -msgstr "" +msgstr "gemiddelde beveiliging" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:75 msgctxt "nft unit" msgid "minute" -msgstr "" +msgstr "minuut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" -msgstr "" +msgstr "minuten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" -msgstr "" +msgstr "mobiele huisagent (H)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:423 msgid "netif_carrier_ok()" -msgstr "" +msgstr "netif_carrier_ok()" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 msgid "no" -msgstr "" +msgstr "nee" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" +msgstr "geen link" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" -msgstr "" +msgstr "niet-lege waarde" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" -msgstr "" +msgstr "geen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:41 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:69 msgid "not present" -msgstr "" +msgstr "niet aanwezig" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" -msgstr "" +msgstr "uit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" -msgstr "" +msgstr "op beschikbaar prefix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" -msgstr "" +msgstr "open netwerk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" -msgstr "" +msgstr "andere configuratie (O)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 msgid "output" -msgstr "" +msgstr "uitgang" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "meer dan een dag geleden" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" -msgstr "" +msgstr "pakketten" #: modules/luci-base/htdocs/luci-static/resources/validation.js:252 msgid "positive decimal value" -msgstr "" +msgstr "positieve decimale waarde" #: modules/luci-base/htdocs/luci-static/resources/validation.js:244 msgid "positive integer value" -msgstr "" +msgstr "positieve gehele waarde" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:178 msgid "random" +msgstr "willekeurig" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 -msgid "relay mode" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" msgstr "" +"vermindert overhead door afzenderberichten te verzamelen en samen te voegen " +"in een enkel pakket in plaats van vele kleine" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 +msgid "relay mode" +msgstr "relais modus" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" -msgstr "" +msgstr "gerouteerd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" -msgstr "" +msgstr "sec" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" -msgstr "" +msgstr "servermodus" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:54 msgid "sstpc Log-level" -msgstr "" +msgstr "sstpc Log-niveau" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" -msgstr "" +msgstr "sterke beveiliging" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:354 msgid "tagged" -msgstr "" +msgstr "getagd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" -msgstr "" +msgstr "tijdseenheden (TUs / 1.024 ms) [1000-65535]" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 msgid "" @@ -9533,26 +11474,31 @@ msgid "" "HTTPS network " "access." msgstr "" +"uHTTPd biedt HTTP of " +"HTTPS " +"netwerktoegang." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" -msgstr "" +msgstr "unieke waarde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" -msgstr "" +msgstr "onbekend" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "onbekende versie" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" -msgstr "" +msgstr "onbeperkt" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9563,117 +11509,117 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:53 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:38 msgid "unspecified" -msgstr "" +msgstr "niet gespecificeerd" #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:71 msgid "unspecified -or- create:" -msgstr "" +msgstr "niet gespecificeerd -of- creëren:" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:352 msgid "untagged" -msgstr "" +msgstr "niet getagd" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" -msgstr "" +msgstr "geldig IP-adres" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 msgid "valid IP address or prefix" -msgstr "" +msgstr "geldig IP-adres of prefix" #: modules/luci-base/htdocs/luci-static/resources/validation.js:294 msgid "valid IPv4 CIDR" -msgstr "" +msgstr "geldige IPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" -msgstr "" +msgstr "geldig IPv4-adres" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 msgid "valid IPv4 address or network" -msgstr "" +msgstr "geldig IPv4-adres of netwerk" #: modules/luci-base/htdocs/luci-static/resources/validation.js:389 msgid "valid IPv4 address:port" -msgstr "" +msgstr "geldig IPv4-adres:poort" #: modules/luci-base/htdocs/luci-static/resources/validation.js:328 msgid "valid IPv4 network" -msgstr "" +msgstr "geldig IPv4-netwerk" #: modules/luci-base/htdocs/luci-static/resources/validation.js:288 msgid "valid IPv4 or IPv6 CIDR" -msgstr "" +msgstr "geldige IPv4 of IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:278 msgid "valid IPv4 prefix value (0-32)" -msgstr "" +msgstr "geldige IPv4 prefix-waarde (0-32)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:300 msgid "valid IPv6 CIDR" -msgstr "" +msgstr "geldige IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" -msgstr "" +msgstr "geldig IPv6-adres" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 msgid "valid IPv6 address or prefix" -msgstr "" +msgstr "geldig IPv6-adres of prefix" #: modules/luci-base/htdocs/luci-static/resources/validation.js:318 msgid "valid IPv6 host id" -msgstr "" +msgstr "geldige IPv6-host-id" #: modules/luci-base/htdocs/luci-static/resources/validation.js:333 msgid "valid IPv6 network" -msgstr "" +msgstr "geldig IPv6-netwerk" #: modules/luci-base/htdocs/luci-static/resources/validation.js:283 msgid "valid IPv6 prefix value (0-128)" -msgstr "" +msgstr "geldige IPv6 prefix-waarde (0-128)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:355 msgid "valid MAC address" -msgstr "" +msgstr "geldig MAC-adres" #: modules/luci-base/htdocs/luci-static/resources/validation.js:426 msgid "valid UCI identifier" -msgstr "" +msgstr "geldige UCI-identificatiecode" #: modules/luci-base/htdocs/luci-static/resources/validation.js:377 msgid "valid UCI identifier, hostname or IP address range" -msgstr "" +msgstr "geldige UCI-identificatie, hostnaam of IP-adresbereik" #: modules/luci-base/htdocs/luci-static/resources/validation.js:398 #: modules/luci-base/htdocs/luci-static/resources/validation.js:401 msgid "valid address:port" -msgstr "" +msgstr "geldig adres:poort" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" -msgstr "" +msgstr "geldige datum (JJJJ-MM-DD)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:248 msgid "valid decimal value" -msgstr "" +msgstr "geldige decimale waarde" #: modules/luci-base/htdocs/luci-static/resources/validation.js:420 msgid "valid hexadecimal WEP key" -msgstr "" +msgstr "geldige hexadecimale WEP-sleutel" #: modules/luci-base/htdocs/luci-static/resources/validation.js:408 msgid "valid hexadecimal WPA key" -msgstr "" +msgstr "geldige hexadecimale WPA-sleutel" #: modules/luci-base/htdocs/luci-static/resources/validation.js:383 msgid "valid host:port" -msgstr "" +msgstr "geldige host:poort" #: modules/luci-base/htdocs/luci-static/resources/validation.js:370 #: modules/luci-base/htdocs/luci-static/resources/validation.js:372 @@ -9681,82 +11627,94 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 msgid "valid hostname" -msgstr "" +msgstr "geldige hostnaam" #: modules/luci-base/htdocs/luci-static/resources/validation.js:360 msgid "valid hostname or IP address" -msgstr "" +msgstr "geldige hostnaam of IP-adres" #: modules/luci-base/htdocs/luci-static/resources/validation.js:240 msgid "valid integer value" -msgstr "" +msgstr "geldig geheel getal" #: modules/luci-base/htdocs/luci-static/resources/validation.js:355 msgid "valid multicast MAC address" +msgstr "geldig multicast MAC-adres" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" msgstr "" +"geldige netwerkapparaatnaam tussen 1 en 15 tekens zonder \":\", \"/\", \"%\" " +"of spaties" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "geldige netwerkapparaatnaam, niet \".\" of \"..\"" #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" -msgstr "" +msgstr "geldig netwerk in adres-/netmaskernotatie" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" -msgstr "" +msgstr "geldig telefoonnummer (0-9, \"*\", \"#\", \"!\" of \".\")" #: modules/luci-base/htdocs/luci-static/resources/validation.js:346 #: modules/luci-base/htdocs/luci-static/resources/validation.js:349 msgid "valid port or port range (port1-port2)" -msgstr "" +msgstr "geldige poort of poortbereik (poort1-poort2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" -msgstr "" +msgstr "geldige poortwaarde" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" -msgstr "" +msgstr "geldige tijd (UU:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" -msgstr "" +msgstr "waarde tussen %d en %d karakters" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" -msgstr "" +msgstr "waarde tussen %f en %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" -msgstr "" +msgstr "waarde groter of gelijk aan %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" -msgstr "" +msgstr "waarde kleiner of gelijk aan %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" -msgstr "" +msgstr "waarde met %d tekens" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" -msgstr "" +msgstr "waarde met ten minste %d tekens" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" -msgstr "" +msgstr "waarde met max %d karakters" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" -msgstr "" +msgstr "zwakke beveiliging" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:72 msgctxt "nft unit" msgid "week" -msgstr "" +msgstr "week" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 msgid "yes" -msgstr "" +msgstr "ja" #: modules/luci-compat/luasrc/view/cbi/delegator.htm:20 msgid "« Back" diff --git a/package/luci/modules/luci-base/po/pl/base.po b/package/luci/modules/luci-base/po/pl/base.po index e9bb951f72..bfede67845 100644 --- a/package/luci/modules/luci-base/po/pl/base.po +++ b/package/luci/modules/luci-base/po/pl/base.po @@ -3,9 +3,9 @@ msgstr "" "Project-Id-Version: LuCI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-04-20 09:40+0200\n" -"PO-Revision-Date: 2022-12-01 10:17+0000\n" +"PO-Revision-Date: 2023-10-25 20:42+0000\n" "Last-Translator: Matthaiks \n" -"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -13,25 +13,41 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.1.1\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "!known (nieznany)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" tabela \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d nieprawidłowe pole(-a)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d godzin temu" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%dm temu" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "$d sekund temu" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s jest nieotagowany w wielu grupach VLAN!" @@ -56,10 +72,11 @@ msgstr "(pusty)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(brak podłączonych interfejsów)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d więcej" @@ -69,19 +86,19 @@ msgid "-- Additional Field --" msgstr "-- Dodatkowe pole --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Proszę wybrać --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- własne --" @@ -107,7 +124,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = nie używa progu RSSI, 1 = nie zmienia domyślnego sterownika" @@ -120,7 +137,7 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Obciążenie 1 min:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" @@ -128,6 +145,11 @@ msgstr[0] "1 flaga" msgstr[1] "%d flagi" msgstr[2] "%d flag" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12h (12 godzin – domyślnie)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "Obciążenie 15 min:" @@ -142,12 +164,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3h (3 godziny)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4-znakowy identyfikator szesnastkowy" @@ -160,43 +187,104 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Obciążenie 5 min:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5m (5 minut)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" -msgstr "Identyfikator 6-oktetowy jako ciąg szesnastkowy - bez dwukropków" +msgstr "Identyfikator 6-oktetowy jako ciąg szesnastkowy – bez dwukropków" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7d (7 dni)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "RRM 802.11k" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: Włącz raport ramki beacon za pomocą pomiarów radiowych." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Włącz raport o sąsiadach za pomocą pomiarów radiowych." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" -msgstr "802.11r Szybkie przejście" +msgstr "802.11r: Szybkie przejście" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: Maksymalna bezczynność BSS. Jednostki: sekundy." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: Zarządzanie przenoszeniem podstawowego zestawu usług (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Ogłoszenie lokalnej strefy czasowej w ramkach zarządzania." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Proxy ARP umożliwia dłuższe działanie STA innych niż AP w trybie " +"oszczędzania energii." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Ogłoszenie czasu w ramkach zarządzających." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Tryb uśpienia Wireless Network Management (WNM) (rozszerzony tryb " +"uśpienia dla stacji)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Poprawki trybu uśpienia Wireless Network Management (WNM): " +"Zapobiega atakom związanym z ponowną instalacją." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" -msgstr "802.11w Association SA Zapytanie o maksymalny limit prób" +msgstr "Maksymalny limit czasu powiązania (SA Query) 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" -msgstr "802.11w Association SA Zapytanie o ponawianie limitu prób" +msgstr "Interwał ponawiania prób powiązania (SA Query) 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" -msgstr "802.11w Zarządzanie ochroną ramek" +msgstr "Ochrona ramek zarządzania 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" -msgstr "802.11w Maksymalny czas oczekiwania" +msgstr "Maksymalny limit czasu 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" -msgstr "802.11w Interwał ponawiania prób" +msgstr "Interwał ponawiania prób 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "Maska sieci IPv4" @@ -208,30 +296,46 @@ msgstr "Konfiguracja diod LED" msgid "LED Name" msgstr "Nazwa diody LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "Proxy NDP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "Flagi RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "Limit skoków RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "Żywotność RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "MTU RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "Usługa RA" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ pasuje do dowolnej domeny. /example.com/ " +"zwraca NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# zwraca adresy NULL (0.0.0.0 i " +"::) dla example.com i jego poddomen." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -245,7 +349,7 @@ msgstr "%s większe lub równe %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:90 msgctxt "nft set match expression" msgid "%s in set %s" -msgstr "%s w zbiorze %s" +msgstr "%s w zestawie %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:83 msgctxt "nft relational \"==\" operator expression" @@ -275,13 +379,25 @@ msgstr "%s nie %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:91 msgctxt "nft not in set match expression" msgid "%s not in set %s" -msgstr "%s nie w zbiorze %s" +msgstr "%s nie w zestawie %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"Węzeł batman-adv może działać w trybie serwera (udostępniając swoje " +"połączenie internetowe sieci mesh) lub w trybie klienta (wyszukując " +"najbardziej odpowiednie połączenie internetowe w sieci mesh) albo mając " +"całkowicie wyłączoną obsługę bramy (co jest ustawieniem domyślnym)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Konfiguracja dla urządzenia \"%s\" już istnieje" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Katalog o tej samej nazwie już istnieje." @@ -290,25 +406,90 @@ msgid "A new login is required since the authentication session expired." msgstr "" "Wymagane jest ponowne zalogowanie, ponieważ sesja uwierzytelniania wygasła." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (wszystkie warianty) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (wszystkie warianty) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (wszystkie warianty) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (wszystkie warianty) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (wszystkie warianty) Annex B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (wszystkie warianty) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (wszystkie warianty) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annex L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -319,7 +500,7 @@ msgstr "ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:366 msgid "ARP IP Targets" -msgstr "Obiekty ARP IP" +msgstr "Cele IP ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:358 msgid "ARP Interval" @@ -341,31 +522,42 @@ msgstr "Monitorowanie ARP nie jest obsługiwane dla wybranych zasad!" msgid "ARP retry threshold" msgstr "Próg powtórzeń ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "Tabela ruchu ARP \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"ARP, IPv4 i IPv6 (nawet 802.1Q) z docelowymi adresami MAC multiemisji są " +"emitowane pojedynczo na adres MAC STA. Uwaga: nie jest to Directed Multicast " +"Service (DMS) w 802.11v. Uwaga: może przerwać oczekiwania multiemisji " +"odbiornika STA." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (tryb transferu asynchronicznego)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "Mosty ATM" # Nie wiem czy to powinno się tłumaczyć wg. mnie lepiej zostawić po angielsku -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "Identyfikator kanału wirtualnego ATM (VCI)" # j.w. -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "Identyfikator ścieżki wirtualnej ATM (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -375,28 +567,24 @@ msgstr "" "wirtualne interfejsy sieciowe systemu Linux, które mogą być używane w " "połączeniu z protokołem DHCP lub PPP w celu polączenia się z siecią dostawcy." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Numer urządzenia ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ID dostawcy systemu ATU-C" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Nieaktywny interfejs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Akceptuj zapytania DNS tylko od hostów, których adres znajduje się w " "lokalnej podsieci." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Zaakceptuj lokalne" @@ -405,7 +593,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Akceptuj pakiet" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Akceptuj pakiety z lokalnym adresem źródłowym" @@ -414,16 +602,25 @@ msgstr "Akceptuj pakiety z lokalnym adresem źródłowym" msgid "Access Concentrator" msgstr "Koncentrator dostępowy (ATM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Punkt dostępowy" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Izolacja punktu dostępowego" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Technologie dostępu" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Akcje" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Aktywny" @@ -461,8 +658,8 @@ msgstr "Aktywne reguły IPv6" msgid "Active-Backup policy (active-backup, 1)" msgstr "Zasady Active-Backup (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -479,18 +676,18 @@ msgstr "Adaptacyjne równoważenie obciążenia transmisji (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Dodaj" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Dodaj most ATM" @@ -510,11 +707,11 @@ msgstr "Dodaj akcję LED" msgid "Add VLAN" msgstr "Dodaj VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Dodaj konfigurację urządzenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Dodaj konfigurację urządzenia…" @@ -522,18 +719,18 @@ msgstr "Dodaj konfigurację urządzenia…" msgid "Add instance" msgstr "Dodaj instancję" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Dodaj klucz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "Dodaj lokalny sufiks domeny do nazw urządzeń z pliku hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Dodaj nowy interfejs..." @@ -541,6 +738,10 @@ msgstr "Dodaj nowy interfejs..." msgid "Add peer" msgstr "Dodaj peera" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "Dodaj statyczne wpisy DNS do przodu i wstecznego dla tego hosta." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Dodaj do czarnej listy" @@ -549,11 +750,11 @@ msgstr "Dodaj do czarnej listy" msgid "Add to Whitelist" msgstr "Dodaj do białej listy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Dodatkowe pliki hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Dodatkowe pliki serwera" @@ -570,7 +771,12 @@ msgstr "Dodatkowe pliki serwera" msgid "Address" msgstr "Adres" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" +"Rodziny adresów „Przekazuj z” i „Przekazuj do adresu” muszą być zgodne." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Rodzina adresów" @@ -584,7 +790,7 @@ msgstr "Ustawienie adresu jest nieprawidłowe" msgid "Address to access local relay bridge" msgstr "Adres dostępowy do \"relay bridge\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Adresy" @@ -593,29 +799,29 @@ msgstr "Adresy" msgid "Administration" msgstr "Zarządzanie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Ustawienia zaawansowane" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Zaawansowane opcje urządzenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Czas starzenia" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Agregacja siły transmisji (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Agregacja komunikatów inicjatora" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -654,11 +860,11 @@ msgstr "Alias interfejsu" msgid "Alias of \"%s\"" msgstr "Alias \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Wszystkie serwery" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." @@ -666,7 +872,7 @@ msgstr "" "Przydziel sekwencyjnie adresy IP, zaczynając od najmniejszego dostępnego " "adresu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Przydzielaj adresy IP po kolei" @@ -675,11 +881,11 @@ msgid "Allow SSH password authentication" msgstr "" "Zezwól SSH na uwierzytelnianie hasłem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "Zezwól, aby tryb AP rozłączał urządzenia przy niskim stanie ACK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Zezwól wszystkim oprócz wymienionych" @@ -687,15 +893,15 @@ msgstr "Zezwól wszystkim oprócz wymienionych" msgid "Allow full UCI access for legacy applications" msgstr "Zezwalaj na pełny dostęp do UCI dla starszych aplikacji" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Zezwól na starsze wersje 802.11b" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Zezwól tylko wymienionym" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Zezwól na localhost" @@ -717,19 +923,24 @@ msgid "Allow system feature probing" msgstr "Zezwalaj na sondowanie funkcji systemu" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Zezwól użytkownikowi root na logowanie się przy pomocy hasła" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" -msgstr "Dozwolone IP" +msgstr "Dozwolone adresy IP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "Dozwolona technologia sieciowa" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "Ustawienie dozwolonych adresów IP jest nieprawidłowe" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Zawsze" @@ -741,22 +952,26 @@ msgstr "Zawsze wyłączony (kernel: brak)" msgid "Always on (kernel: default-on)" msgstr "Zawsze włączony (kernel: domyślnie włączone)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "Zawsze wysyłaj opcje DHCP. Czasami potrzebne, np. z PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" -"Używaj 40MHz, nawet jeśli kanały nachodzą na siebie. Opcja nie jest zgodna z " -"IEEE 802.11n-2009!" +"Zawsze używaj 40 MHz, nawet jeśli kanały nachodzą na siebie. Opcja nie jest " +"zgodna z IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "Liczba próbek do wysłania w celu wykrywania zduplikowanych adresów" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Liczba sekund oczekiwania na gotowość modemu" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Wystąpił błąd podczas zapisywania formularza:" @@ -765,72 +980,23 @@ msgstr "Wystąpił błąd podczas zapisywania formularza:" msgid "An optional, short description for this device" msgstr "Opcjonalny, krótki opis tego urządzenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annex A + L + M (wszystkie)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Annex A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Annex A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Annex A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Annex A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Annex B (wszystkie)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Annex B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Annex B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Annex B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Annex J (wszystkie)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Annex L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Annex M (wszystkie)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Annex M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"Ogłaszaj prefiks NAT64 w komunikatach RA ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Ogłaszaj to urządzenie jako serwer DNS IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -838,7 +1004,7 @@ msgstr "" "Ogłaszaj to urządzenie jako router domyślny, jeśli istnieje lokalna trasa " "domyślna IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -846,7 +1012,7 @@ msgstr "" "Ogłaszaj to urządzenie jako router domyślny, jeśli dostępny jest publiczny " "prefiks IPv6, niezależnie od dostępności lokalnej trasy domyślnej." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -854,15 +1020,15 @@ msgstr "" "Ogłaszaj to urządzenie jako router domyślny, niezależnie od tego, czy " "istnieje prefiks, czy trasa domyślna." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Ogłoszone domeny DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Ogłoszone serwery DNS IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Tożsamość anonimowa" @@ -874,7 +1040,7 @@ msgstr "Anonimowe montowanie" msgid "Anonymous Swap" msgstr "Anonimowy swap" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Każdy pakiet" @@ -886,11 +1052,11 @@ msgstr "Każdy pakiet" msgid "Any zone" msgstr "Dowolna strefa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "Zastosuj opcje DHCP do tej sieci. (Puste = wszystkie klienty)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "Zastosuj i zachowaj ustawienia" @@ -898,48 +1064,52 @@ msgstr "Zastosuj i zachowaj ustawienia" msgid "Apply backup?" msgstr "Czy zastosować kopię zapasową?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Żądanie zatwierdzenia nie powiodło się ze statusem %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Zastosuj zmiany" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "Zastosuj z przywróceniem po utracie łączności" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Wprowadzanie zmian w konfiguracji… %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Architektura" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Arp-scan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Przypisz część danej długości każdego publicznego prefiksu IPv6 do tego " "interfejsu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "Przypisz nowe, dowolne tagi do tego wpisu." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -"Przypisz cześć prefiksu za pomocą szesnastkowego ID subprefiksu dla tego " -"interfejsu." +"Przypisz części prefiksu za pomocą tego szesnastkowego identyfikatora " +"subprefiksu dla tego interfejsu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Połączone urządzenia" @@ -948,8 +1118,8 @@ msgstr "Połączone urządzenia" msgid "Associations" msgstr "Połączone" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" @@ -957,8 +1127,8 @@ msgstr "" "Co najmniej %h na %h, seria %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -971,25 +1141,26 @@ msgid "Attempt to enable configured mount points for attached devices" msgstr "" "Próba włączenia skonfigurowanych punktów montowania dla podłączonych urządzeń" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Grupa autoryzacji" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Uwierzytelnienie" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Typ uwierzytelniania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autorytatywny" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Wymagana autoryzacja" @@ -997,7 +1168,9 @@ msgstr "Wymagana autoryzacja" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1016,7 +1189,7 @@ msgid "Automatically check filesystem for errors before mounting" msgstr "" "Automatycznie sprawdzaj system plików pod kątem błędów przed zamontowaniem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1040,6 +1213,10 @@ msgstr "Automatycznie montuj system plików" msgid "Automount Swap" msgstr "Automatycznie montuj swap" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Dostępne" @@ -1058,11 +1235,15 @@ msgstr "Dostępne" msgid "Average:" msgstr "Średnia:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Unikaj pętli mostowych" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1070,15 +1251,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR/DMR/AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "Przejście BSS" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Wróć" @@ -1087,11 +1272,7 @@ msgstr "Wróć" msgid "Back to Overview" msgstr "Wróć do przeglądu" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Wróć do konfiguracji" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "Powrót do konfiguracji peerów" @@ -1104,16 +1285,15 @@ msgid "Backup / Flash Firmware" msgstr "Kopia zapasowa / Aktualizacja firmware" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Lista plików kopii zapasowej" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Częstotliwość" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Urządzenie bazowe" @@ -1121,12 +1301,43 @@ msgstr "Urządzenie bazowe" msgid "Base64-encoded public key of this interface for sharing." msgstr "Klucz publiczny tego interfejsu zakodowany w Base64 do udostępniania." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Urządzenie Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Interfejs Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv ma wbudowaną fragmentację warstwy 2 dla danych unicastowych " +"przepływających przez sieć, co pozwala na uruchomienie batman-adv na " +"interfejsach/połączeniach, które nie pozwalają na zwiększenie MTU poza " +"standardowy rozmiar pakietu Ethernet 1500 bajtów. Gdy fragmentacja jest " +"włączona, batman-adv będzie automatycznie fragmentował zbyt duże pakiety i " +"defragmentował je na drugim końcu. Domyślnie fragmentacja jest włączona i " +"nieaktywna, jeśli pakiet się zmieści, ale możliwe jest całkowite wyłączenie " +"fragmentacji." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Interwał ramki (beacon)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Raport ramki beacon" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1140,7 +1351,7 @@ msgstr "" msgid "Bind NTP server" msgstr "Powiąż serwer NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "Dynamiczne powiązanie z interfejsami, a nie z adresami zastępczymi." @@ -1149,18 +1360,33 @@ msgstr "Dynamiczne powiązanie z interfejsami, a nie z adresami zastępczymi." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Interfejs wiązań" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "Powiąż rekordy usług z nazwą domeny: określ lokalizację usług." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"Powiąż rekordy usług z nazwą domeny: określ lokalizację usług. Zobacz RFC2782." + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1172,65 +1398,77 @@ msgstr "Połącz tunel z tym interfejsem (opcjonalnie)." msgid "Bitrate" msgstr "Szybkość transmisji" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Tryb wiązania" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Polityka wiązania" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "Należy określić zarówno „Przekazuj z”, jak i „Przekazuj do adresu”." + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Most" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Most (Wsparcie komunikacji bezpośredniej pomiędzy MAC VLAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" -msgstr "Filtrowanie mostka VLAN" +msgstr "Filtrowanie mostu VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Urządzenie mostu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" -msgstr "Opcje specjalne portu mostka" +msgstr "Opcje specjalne portu mostu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" -msgstr "Porty mostka" +msgstr "Porty mostu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "Tabela ruchu mostowego \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Numer mostu (urządzenia)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Uruchom pusty most" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Podnieś przy starcie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "Uruchom interfejs mostu bez ustawionych portów" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "Rozsyłanie" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Polityka nadawania (transmisja, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Przeglądaj…" @@ -1238,15 +1476,39 @@ msgstr "Przeglądaj…" msgid "Buffered" msgstr "Buforowana" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" +"Certyfikat CA (kodowany w formacie PEM); użyj zamiast magazynu " +"ogólnosystemowego do weryfikowania certyfikatu bramy." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "CA certificate; jeśli jest pusta, zostanie zapisana po pierwszym połączeniu." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "CLAT konfiguracja nie powiodła się" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "CNAME" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME lub fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (zewnętrznie zarządzany interfejs)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Użycie CPU" @@ -1261,18 +1523,25 @@ msgstr "Podręczna" msgid "Call failed" msgstr "Połączenie nieudane" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"Może być przydatne, jeśli ISP ma serwery nazw IPv6, ale nie zapewnia " +"trasowania IPv6." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Anuluj" @@ -1280,34 +1549,34 @@ msgstr "Anuluj" msgid "Cannot parse configuration: %s" msgstr "Nie można przetworzyć konfiguracji: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "Przechwytuj pakiety przychodzące adresowane do innych hostów" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" "Przechwytuj pakiety przychodzące przed podjęciem jakiejkolwiek decyzji o " "trasowaniu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "Przechwytuj pakiety przychodzące kierowane do systemu lokalnego" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "Przechwytuj pakiety wychodzące po każdej decyzji o trasowaniu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "Przechwytuj pakiety wychodzące z systemu lokalnego" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "Przechwytuj pakiety bezpośrednio po ich odebraniu przez kartę sieciową" @@ -1316,24 +1585,32 @@ msgstr "Przechwytuj pakiety bezpośrednio po ich odebraniu przez kartę sieciow msgid "Category" msgstr "Kategoria" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "Identyfikator komórki" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "Lokalizacja komórki" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Ograniczenie certyfikatu (domena)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Ograniczenie certyfikatu (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Ograniczenie certyfikatu (temat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Ograniczenie certyfikatu (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1341,8 +1618,8 @@ msgstr "" "Certyfikat ograniczenia podciągów - np. /CN=wifi.mycompany.com
    Zobacz " "`logread -f` podczas uzgadniania wartości rzeczywistych" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1350,8 +1627,8 @@ msgstr "" "Ograniczenie(-a) certyfikatu w stosunku do wartości DNS SAN (jeśli " "dostępne)
    lub Subject CN (dokładne dopasowanie)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1359,8 +1636,8 @@ msgstr "" "Ograniczenie(-a) certyfikatu w odniesieniu do wartości DNS SAN (jeśli " "dostępne)
    lub Subject CN (dopasowanie przyrostka)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1374,16 +1651,16 @@ msgstr "" msgid "Chain" msgstr "Łańcuch" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "Hak łańcuchowy \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Zmiany" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Zmiany zostały cofnięte." @@ -1394,18 +1671,19 @@ msgstr "Zmienia hasło administratora umożliwiające dostęp do urządzenia" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Kanał" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Analiza kanałów" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Szerokość kanału" @@ -1413,7 +1691,7 @@ msgstr "Szerokość kanału" msgid "Check filesystems before mount" msgstr "Sprawdź system plików przed zamontowaniem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "Zaznacz opcję, jeśli chcesz usunąć istniejące sieci z tego radia." @@ -1430,8 +1708,8 @@ msgstr "Sprawdzanie obrazu…" msgid "Choose mtdblock" msgstr "Wybierz mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1439,11 +1717,11 @@ msgid "" "interface to it." msgstr "" "Wybierz strefę zapory sieciowej, którą chcesz przypisać do tego interfejsu. " -"Wybierz nieokreślone, aby usunąć interfejs z przypisanej strefy lub " -"wybierz pole własne, aby zdefiniować nową strefę i przypisać ją do " -"interfejsu." +"Wybierz nieokreślone, aby usunąć interfejs z przypisanej strefy, " +"lub wypełnij pole własne, aby zdefiniować nową strefę i przypisać " +"ją do interfejsu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1451,7 +1729,7 @@ msgstr "" "Wybierz sieć/sieci, które chcesz przyłączyć do tego interfejsu " "bezprzewodowego, lub wypełnij pole własne, aby utworzyć nową sieć." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Szyfr" @@ -1475,9 +1753,10 @@ msgstr "" "Kliknij \"Zapisz mtdblock\", aby pobrać określony plik mtdblock. (UWAGA: " "FUNKCJA DLA PROFESJONALISTÓW!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Klient" @@ -1486,9 +1765,9 @@ msgstr "Klient" msgid "Client ID to send when requesting DHCP" msgstr "Nazwa (ID) klienta do wysłania podczas negocjacji DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Zamknij" @@ -1505,23 +1784,23 @@ msgstr "" "Zamknij nieaktywne połączenia po określonym czasie podanym w sekundach, " "wpisz 0, aby uzyskać stałe połączenie" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Zamknij listę..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Trwa zbieranie danych..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "Widziane kolizje" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" -msgstr "Polecenie" +msgstr "Komenda" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:401 msgid "Command OK" @@ -1529,13 +1808,13 @@ msgstr "Polecenie OK" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:33 msgid "Command failed" -msgstr "Błędne polecenie" +msgstr "Błędna komenda" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:73 msgid "Comment" msgstr "Komentarz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1559,29 +1838,28 @@ msgstr "Obliczanie sumy kontrolnej wychodzącej (opcjonalnie)." msgid "Config File" msgstr "Plik konfiguracyjny" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Konfiguracja" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "Eksport konfiguracji" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Konfiguracja została zastosowana." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Konfiguracja została wycofana!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Konfiguracja nieudana" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1598,7 +1876,7 @@ msgstr "" "Bardzo wysoka: konfiguruje 24 Mbps jako szybkość podstawową. Obsługiwane " "szybkości niższe niż minimalna podstawowa nie są oferowane." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." @@ -1606,7 +1884,7 @@ msgstr "" "Konfiguruje rozgłaszanie routera domyślnego w komunikatach RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1614,16 +1892,16 @@ msgstr "" "Konfiguruje tryb pracy usługi RA " "na tym interfejsie." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "Konfiguruje tryb pracy usługi DHCPv6 na tym interfejsie." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "Konfiguruje tryb pracy usługi proxy NDP na tym interfejsie." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Konfigurowanie…" @@ -1635,9 +1913,10 @@ msgstr "Potwierdź rozłączenie" msgid "Confirmation" msgstr "Powtórz hasło" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Połączony" @@ -1647,11 +1926,11 @@ msgstr "Połączony" msgid "Connection attempt failed" msgstr "Próba połączenia nieudana" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "Próba połączenia nieudana." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "Punkt końcowy połączenia" @@ -1663,7 +1942,7 @@ msgstr "Utrata połączenia" msgid "Connections" msgstr "Połączenia" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "Zmiana łączności" @@ -1680,11 +1959,11 @@ msgstr "Status conntrack" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:378 msgid "Consider the slave up when all ARP IP targets are reachable (all, 1)" msgstr "" -"Rozważ niewolnika, gdy wszystkie cele ARP IP są osiągalne (wszystkie, 1)" +"Rozważ niewolnika, gdy wszystkie cele IP ARP są osiągalne (wszystkie, 1)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:377 msgid "Consider the slave up when any ARP IP target is reachable (any, 0)" -msgstr "Rozważ niewolnika, gdy dowolny cel ARP IP jest osiągalny (dowolny, 0)" +msgstr "Rozważ niewolnika, gdy dowolny cel IP ARP jest osiągalny (dowolny, 0)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:18 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:368 @@ -1692,9 +1971,9 @@ msgstr "Rozważ niewolnika, gdy dowolny cel ARP IP jest osiągalny (dowolny, 0)" msgid "Contents have been saved." msgstr "Zawartość została zapisana." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1705,16 +1984,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "Kontynuuj w %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "Kontynuuj w łańcuchu wywoływania" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "Kontynuuj przetwarzanie niedopasowanych pakietów" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1729,20 +2008,20 @@ msgstr "" msgid "Country" msgstr "Kraj" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Kod kraju" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Gęstość komórek pokrycia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Utwórz/Przypisz strefę zapory sieciowej" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Stwórz interfejs" @@ -1754,7 +2033,7 @@ msgstr "Krytyczny" msgid "Cron Log Level" msgstr "Poziom logowania cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Aktualna moc nadawania" @@ -1797,31 +2076,31 @@ msgstr "" "Dostosowuje zachowanie diod LED " "urządzenia, jeśli to możliwe." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "Przekazywanie DAD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "Klient DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "Port DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "Sekret DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "Opcje DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Serwer DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP i DNS" @@ -1832,16 +2111,24 @@ msgstr "DHCP i DNS" msgid "DHCP client" msgstr "Klient DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Opcje DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" +"leasetime DHCPv4 jest używany jako limit i preferowana " +"żywotność prefiksu IPv6." + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "Klient DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "Usługa DHCPv6" @@ -1853,19 +2140,19 @@ msgstr "Usługa DHCPv6" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Przekazywania DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "Port wywołania DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "Domeny wyszukiwania DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "Port serwera DNS" @@ -1873,7 +2160,7 @@ msgstr "Port serwera DNS" msgid "DNS setting is invalid" msgstr "Ustawienie DNS jest nieprawidłowe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "Ważność DNS" @@ -1881,11 +2168,11 @@ msgstr "Ważność DNS" msgid "DNS-Label / FQDN" msgstr "DNS-Label/FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "Sprawdzanie DNSSEC bez podpisu" @@ -1897,39 +2184,47 @@ msgstr "Czas bezczynności DPD" msgid "DS-Lite AFTR address" msgstr "Adres AFTR DS-Lite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "Status DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "Tryb linii DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "Interwał DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Szybkość przesyłania danych" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Otrzymane dane" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Przesyłane dane" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Debugowanie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Router domyślny" @@ -1937,7 +2232,7 @@ msgstr "Router domyślny" msgid "Default state" msgstr "Stan domyślny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1946,7 +2241,7 @@ msgstr "" "Zdefiniuj dodatkowe opcje DHCP, np. \"6,192.168.2.1,192.168.2.2\", które rozgłaszają różne serwery DNS klientom." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" @@ -1954,7 +2249,7 @@ msgstr "" "Definiuje mapowanie wewnętrznego priorytetu pakietu systemu Linux do " "priorytetu nagłówka sieci VLAN, ale dla ramek wychodzących" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" @@ -1962,49 +2257,50 @@ msgstr "" "Definiuje mapowanie priorytetu nagłówka VLAN na wewnętrzny priorytet " "pakietów Linuksa w ramkach przychodzących" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "Definiuje określoną jednostkę MTU dla tej trasy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "Delegowanie prefiksów IPv6" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Usuń" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Usuń klucz" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Zalecane kasowanie nieudane: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Usuń tą sieć" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" -msgstr "Interwał komunikatu o wskazaniu dostawy ruchu" +msgstr "Interwał Delivery Traffic Indication Message (DTIM)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Opis" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Odznacz" @@ -2012,11 +2308,11 @@ msgstr "Odznacz" msgid "Design" msgstr "Motyw" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "Wyznaczony nadrzędny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2051,9 +2347,9 @@ msgstr "Strefa docelowa" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2063,36 +2359,40 @@ msgstr "Strefa docelowa" msgid "Device" msgstr "Urządzenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Konfiguracja urządzenia" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "Identyfikator urządzenia" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Urządzenie nieaktywne" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Urządzenie jest restartowane…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Nazwa urządzenia" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Urządzenie nie jest zarządzane przez ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Urządzenie nie obecne" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Typ urządzenia" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Urządzenie nieosiągalne!" @@ -2100,31 +2400,31 @@ msgstr "Urządzenie nieosiągalne!" msgid "Device unreachable! Still waiting for device..." msgstr "Urządzenie nieosiągalne! Wciąż czekam na urządzenie..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Urządzenia" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnostyka" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Numer do wybrania" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Katalog" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Wyłącz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2141,20 +2441,24 @@ msgstr "Wyłącz wyszukiwanie DNS (lookup)" msgid "Disable Encryption" msgstr "Wyłącz szyfrowanie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Wyłącz badanie nieaktywności" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Wyłącz tę sieć" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2163,34 +2467,33 @@ msgstr "Wyłącz tę sieć" msgid "Disabled" msgstr "Wyłączone" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "Wyłączony" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Rozłączaj przy niskim stanie ramek ACK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" "Odrzuć odpowiedzi nadrzędne zawierające adresy RFC1918." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Rozłącz" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Próba rozłączenia nie powiodła się" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Próba rozłączenia nie powiodła się." @@ -2200,31 +2503,45 @@ msgstr "Miejsce na dysku" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Odrzuć" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Optymalizacja odległości" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Odległość do najdalej oddalonego użytkownika sieci w metrach." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Rozproszona tablica ARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" +"Instancja Dnsmasq, z którą powiązana jest ta sekcja hosta DHCP. Jeśli nie " +"określono, ta sekcja dotyczy wszystkich instancji Dnsmasq." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" "Instancja Dnsmasq, z którą powiązana jest ta sekcja startowa. Jeśli nie " -"określono, sekcja obowiązuje dla wszystkich instancji dnsmasq." +"określono, ta sekcja dotyczy wszystkich instancji Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP i serwer przekazujący (forwarder) DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "Nie buforuj odpowiedzi negatywnych, np. dla nieistniejących domen." @@ -2246,34 +2563,23 @@ msgstr "Nie buforuj odpowiedzi negatywnych, np. dla nieistniejących domen." msgid "Do not create host route to peer (optional)." msgstr "Nie twórz trasy hosta do peera (opcjonalnie)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "Nie przekazuj dalej zapytań DNS bez kropek lub części domeny." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Nie przekazuj zapytań, które nie mogą być zrealizowane przez publiczne " -"resolwery." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Nie przekazuj wyszukiwań wstecznych (lookups) do sieci lokalnych." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Zapobiegaj nasłuchiwaniu na tych interfejsach." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "Nie oferuj usługi DHCPv6 na tym interfejsie." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Nie uczestniczy" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2285,7 +2591,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Nie wysyłaj nazwy hosta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2293,11 +2599,11 @@ msgstr "" "Nie wysyłaj żadnych komunikatów RA na tym interfejsie." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Czy jesteś pewien, że chcesz usunąć \"%s\" ?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Czy na pewno chcesz usunąć następujący klucz SSH?" @@ -2305,13 +2611,13 @@ msgstr "Czy na pewno chcesz usunąć następujący klucz SSH?" msgid "Do you really want to erase all settings?" msgstr "Czy jesteś pewny, że naprawdę chcesz skasować wszystkie ustawienia?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "" "Czy jesteś pewien, że chcesz skasować katalog \"%s\" ze wszystkimi jego " "podkatalogami?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "Czy chcesz zastąpić obecny PSK?" @@ -2319,15 +2625,17 @@ msgstr "Czy chcesz zastąpić obecny PSK?" msgid "Do you want to replace the current keys?" msgstr "Czy chcesz zastąpić obecne klucze?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Domena" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Wymagana domena" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Białe listy (dozwolone domeny)" @@ -2353,11 +2661,11 @@ msgstr "Pobierz kopię zapasową" msgid "Download mtdblock" msgstr "Pobierz mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Kompensacja transmisji SNR" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2373,16 +2681,64 @@ msgstr "Przeciągnij, aby zmienić kolejność" msgid "Drop Duplicate Frames" msgstr "Porzuć zduplikowane ramki" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"Porzucaj wszystkie nieodpłatne ramki ARP, na przykład jeśli w sieci jest " +"znane dobre proxy ARP i takie ramki nie muszą być używane lub w przypadku " +"802.11 nie mogą być używane, aby zapobiec atakom." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Porzucaj wszystkie niechciane ogłaszanie sąsiadów, na przykład jeśli w sieci " +"jest znane dobre proxy NA i takie ramki nie muszą być używane lub w " +"przypadku 802.11 nie mogą być używane, aby zapobiec atakom." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Porzucaj nieodpłatne ARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" +"Porzucaj ramki multiemisji warstwy 2 zawierające pakiety emisji pojedynczej " +"IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" +"Porzucaj ramki multiemisji warstwy 2 zawierające pakiety emisji pojedynczej " +"IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Porzucaj zagnieżdżoną emisję pojedynczą IPv4" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Porzucaj zagnieżdżoną emisję pojedynczą IPv6" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Porzucaj pakiet" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "Porzucaj niedopasowane pakiety" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Porzucaj niezamówione NA" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Usługa Dropbear" @@ -2401,20 +2757,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "DHCP dynamiczne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "Klient rozszerzenia dynamicznego uwierzytelniania (DAE)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "Port rozszerzenia dynamicznego uwierzytelniania (DAE)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "Sekret rozszerzenia dynamicznego uwierzytelniania (DAE)." @@ -2422,7 +2778,7 @@ msgstr "Sekret rozszerzenia dynamicznego uwierzytelniania (DAE)." msgid "Dynamic tunnel" msgstr "Tunel dynamiczny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2430,21 +2786,33 @@ msgstr "" "Dynamicznie przydzielaj adresy DHCP klientom. Jeśli wyłączone, tylko klienty " "posiadające statyczne dzierżawy będą obsłużone." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Np. br-vlan lub brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Np. eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "Długość EA-bits" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Metoda protokołu rozszerzonego uwierzytelniania (EAP)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Każda STA ma przypisany własny interfejs AP_VLAN." + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Edytuj" @@ -2452,6 +2820,10 @@ msgstr "Edytuj" msgid "Edit peer" msgstr "Edytuj peera" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "Edytuj dzierżawę statyczną" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2460,11 +2832,11 @@ msgstr "" "Edytuj powyższe nieprzetworzone dane konfiguracyjne, aby naprawić błąd, i " "naciśnij „Zapisz”, aby ponownie załadować stronę." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Edytuj tę sieć" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Edytuj ustawienia sieci bezprzewodowych" @@ -2473,45 +2845,35 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "MTU efektywnej trasy" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Mapowanie wyjścia QoS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "Identyfikator urządzenia wyjściowego" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Nazwa urządzenia wyjściowego" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Wyjście otagowane" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Wyjście nieotagowane" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Ratunkowy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Włącz" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" "Włącz / Wyłącz peera. Zrestartuj interfejs Wireguard, aby zastosować zmiany." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2519,11 +2881,11 @@ msgstr "" "Włącz nasłuchiwanie IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Włącz STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "Włącz SLAAC" @@ -2541,10 +2903,11 @@ msgstr "Włącz dynamiczne tasowanie przepływów" msgid "Enable HE.net dynamic endpoint update" msgstr "Włącz dynamiczną aktualizację punktu końcowego sieci HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Włącz IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Włącz negocjację IPv6" @@ -2558,11 +2921,15 @@ msgstr "Włącz negocjację IPv6" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Włącz negocjację IPv6 na łączu PPP" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "Włącz trasowanie segmentowe IPv6" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Włącz przechodzenie ramek Jumbo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "Włącz uczenie MAC adresów" @@ -2574,11 +2941,11 @@ msgstr "Włącz klienta NTP" msgid "Enable Single DES" msgstr "Zezwól na Single DES" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Włącz serwer TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Włącz filtrowanie VLAN" @@ -2586,7 +2953,7 @@ msgstr "Włącz filtrowanie VLAN" msgid "Enable VLAN functionality" msgstr "Włącz funkcjonalność VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Włącz przycisk WPS, wymaga WPA2-PSK/WPA3-SAE" @@ -2600,14 +2967,14 @@ msgstr "" "Protocol\">HTTP na port HTTPS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" "Włącz delegowanie niższego szczebla dla prefiksów IPv6 dostępnych na tym " "interfejsie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Włącz środki zaradcze dotyczące ponownej instalacji kluczy (KRACK)" @@ -2623,26 +2990,26 @@ msgstr "Włącz tworzenie kopii pakietów przychodzących" msgid "Enable mirroring of outgoing packets" msgstr "Włącz tworzenie kopii pakietów wychodzących" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "Włącz szybkie wyjście grupowe" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "Włącz grupowe zapytania" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Włącz multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Włącz sterowanie pakietami na wszystkich procesorach. Może pomóc lub " "ograniczyć prędkość sieci." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Włącz tryb promiscuous" @@ -2664,11 +3031,11 @@ msgstr "Włącz wsparcie dla ruchu multicast (opcjonalne)." msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Włącz flagę DF (Nie fragmentuj) pakietów szyfrujących." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "Włącz wbudowany jednoinstancyjny serwer TFTP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Włącz tą sieć" @@ -2677,29 +3044,40 @@ msgstr "Włącz tą sieć" msgid "Enable tx checksum" msgstr "Włącz sumę kontrolną tx" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "Włącz unicast flooding" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Włączone" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Włącz nasłuchiwanie IGMP na tym moście" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" "Aktywuje szybki roaming pomiędzy punktami dostępowymi, które należą do tej " -"samej domeny" +"samej domeny mobilnej" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" +"Umożliwia bardziej wydajną, świadomą grupowo infrastrukturę przekazywania " +"multicast w batman-adv." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "" "Włącz protokół STP na tym " @@ -2709,24 +3087,29 @@ msgstr "" msgid "Encapsulation limit" msgstr "Ograniczenie enkapsulacji" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Sposób enkapsulacji" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Szyfrowanie" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Punkt końcowy" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Końcowy host" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Końcowy port" @@ -2734,23 +3117,23 @@ msgstr "Końcowy port" msgid "Endpoint setting is invalid" msgstr "Ustawienie punktu końcowego jest nieprawidłowe" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "Egzekwuj IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" -msgstr "Ezekwuj IGMPv2" +msgstr "Egzekwuj IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "Egzekwuj IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "Egzekwuj MLD version 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "Egzekwuj MLD version 2" @@ -2779,19 +3162,15 @@ msgstr "Błąd" msgid "Error getting PublicKey" msgstr "Błąd uzyskiwania klucza publicznego" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Ilość błędów (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" -msgstr "Karta Ethernet" +msgstr "Karta ethernetowa" #: modules/luci-base/htdocs/luci-static/resources/network.js:2999 #: modules/luci-compat/luasrc/model/network.lua:1423 msgid "Ethernet Switch" -msgstr "Switch Ethernet" +msgstr "Przełącznik ethernetowy" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:272 msgid "Every 30 seconds (slow, 0)" @@ -2801,11 +3180,19 @@ msgstr "Co 30 sekund (powoli, 0)" msgid "Every second (fast, 1)" msgstr "Co sekundę (szybko, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Wyklucz interfejsy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"Wykonywanie różnych poleceń sieciowych w celu sprawdzenia połączenia i " +"rozwiązywania nazw do innych systemów." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2813,27 +3200,37 @@ msgstr "" "Zwolnij 127.0.0.0/8 i ::1 z kontroli ponownego " "wiązania, np. usług RBL." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Istniejące urządzenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Rozwiń hosty" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Oczekiwany numer portu." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Oczekiwanie na przydział w systemie szesnastkowym" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Wymagany poprawny adres IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Wymagany poprawny adres IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" +"Oczekiwanie prawidłowego adresu MAC, opcjonalnie zawierającego symbole " +"wieloznaczne" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Wymagane dwie wartości oddzielone dwukropkiem" @@ -2842,11 +3239,11 @@ msgstr "Wymagane dwie wartości oddzielone dwukropkiem" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Zaleca się użyć: %s" @@ -2858,7 +3255,7 @@ msgstr "Oczekiwanie: niepusta wartość" msgid "Expires" msgstr "Wygasa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2868,13 +3265,13 @@ msgstr "" msgid "External" msgstr "Zewnętrzne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" -msgstr "Zewnętrzny Klucz R0 listy właścicieli" +msgstr "Zewnętrzna lista posiadaczy kluczy R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" -msgstr "Zewnętrzny Klucz R1 listy właścicieli" +msgstr "Zewnętrzna lista posiadaczy kluczy R1" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167 msgid "External system log server" @@ -2900,35 +3297,63 @@ msgstr "Dodatkowe opcje pppd" msgid "Extra sstpc options" msgstr "Dodatkowe opcje sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" -msgstr "FT over DS" +msgstr "FT Over-the-DS (OTD)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" -msgstr "FT over the Air" +msgstr "FT Over-the-Air (OTA)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "Protokół FT" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "Powód niepowodzenia" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Zmiana hasła systemowego nieudana." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Nie udało się skonfigurować modemu" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "Nie udało się zatwierdzić w ciągu %ds, czekam na wycofanie…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Nie udało się połączyć" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Nie udało się rozłączyć" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Nie można wykonać \"/etc/init.d/%s %s\" akcja: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Nie udało się uzyskać informacji o modemie" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Nie udało się zainicjować modemu" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Nie udało się ustawić trybu pracy" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Plik" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2936,24 +3361,24 @@ msgstr "" "Lista plików źródłowych resolwerów, opcjonalnie specyficznych dla domeny, " "np. server=1.2.3.4, server=/domain/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Plik niedostępny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "Plik do przechowywania informacji o dzierżawie DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "Plik ze źródłowymi resolwerami." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Nazwa pliku" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Rozgłaszana nazwa pliku obrazu startowego do klientów." @@ -2962,14 +3387,22 @@ msgstr "Rozgłaszana nazwa pliku obrazu startowego do klientów." msgid "Filesystem" msgstr "System plików" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Filtruj rekordy A IPv4" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Filtruj rekordy AAAA IPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Filtruj wykrywanie usług SRV/SOA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filtruj prywatne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filtruj bezużyteczne" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Filtrowanie dla wszystkich niewolników, bez sprawdzania poprawności" @@ -2986,8 +3419,15 @@ msgstr "" "Filtrowanie dla wszystkich niewolników, sprawdzanie poprawności tylko dla " "serwerów podrzędnych kopii zapasowych" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" +"Filtruje wykrywanie usług SRV/SOA, aby uniknąć wyzwalania łączy dial-on-" +"demand." + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Finalizacja nie powiodła się" @@ -2999,7 +3439,7 @@ msgstr "" "Znajdź wszystkie aktualnie podłączone systemy plików oraz swap i zamień " "konfigurację na domyślne na podstawie tego, co zostało wykryte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Znajdź i podłącz się do sieci" @@ -3013,10 +3453,11 @@ msgid "Firewall" msgstr "Zapora sieciowa" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Znacznik zapory sieciowej" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Ustawienia zapory sieciowej" @@ -3024,19 +3465,19 @@ msgstr "Ustawienia zapory sieciowej" msgid "Firewall Status" msgstr "Status zapory sieciowej" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "Znacznik zapory" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Plik firmware" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Wersja firmware" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Stały port źródłowy dla wychodzących zapytań DNS." @@ -3062,42 +3503,50 @@ msgstr "Operacje aktualizacji" msgid "Flashing…" msgstr "Trwa wgrywanie obrazu…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "Śledź żywotność IPv4" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Wymuś" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" -msgstr "Wymuś tryb 40MHz" +msgstr "Wymuś tryb 40 MHz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Wymuś CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" "Wymuś uruchomienie serwera DHCP w tej sieci, nawet jeśli zostanie wykryty " "inny serwer." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "Wymuś wersję IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "Wymuś wersję MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Wymuś TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Wymuś TKIP i CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "Wymuś rozsyłanie odpowiedzi DHCP." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Wymuś połączenie" @@ -3109,11 +3558,11 @@ msgstr "Wymuś uaktualnienie" msgid "Force use of NAT-T" msgstr "Wymuś użycie NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Niepoprawna forma tokenu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA między wyznaczonym " "interfejsem głównym a interfejsami podrzędnymi." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3139,7 +3588,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Przekazuj ruch DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3147,31 +3596,35 @@ msgstr "" "Przekazuj komunikaty DHCPv6 między wyznaczonym interfejsem głównym a " "interfejsami podrzędnymi." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "Sekundy przekazywania korekty błędów (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Przekazuj nadawany ruch" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "Opóźnienie przekazywania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Przekazuj ruch w sieci mesh" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "Przekazuj pakiety multicast jako unicast na tym urządzeniu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "DNS do przodu i wsteczny" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Tryb przekazywania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Fragmentacja" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Próg fragmentacji" @@ -3195,7 +3648,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Tylko GPRS" @@ -3215,12 +3668,16 @@ msgstr "Tunel GRETAP przez IPv4" msgid "GRETAP tunnel over IPv6" msgstr "Tunel GRETAP przez IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Brama" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Tryb bramy" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Porty bramy" @@ -3230,23 +3687,23 @@ msgstr "Porty bramy" msgid "Gateway address is invalid" msgstr "Adres bramy jest nieprawidłowy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Ustawienia główne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Ustawienia ogólne" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Opcje ogólne" @@ -3254,7 +3711,7 @@ msgstr "Opcje ogólne" msgid "Generate Config" msgstr "Wygeneruj konfigurację" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Wygeneruj PMK lokalnie" @@ -3262,11 +3719,11 @@ msgstr "Wygeneruj PMK lokalnie" msgid "Generate archive" msgstr "Twórz archiwum" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "Wygeneruj konfigurację" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "Wygeneruj konfigurację…" @@ -3274,15 +3731,15 @@ msgstr "Wygeneruj konfigurację…" msgid "Generate new key pair" msgstr "Wygeneruj nową parę kluczy" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "Wygeneruj klucz współdzielony" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "Generuje konfigurację odpowiednią do importu na peerze WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "Generowanie kodu QR…" @@ -3294,39 +3751,40 @@ msgstr "Hasło nie zostało zmienione, wpisane hasła są nieprawidłowe!" msgid "Global Settings" msgstr "Ustawienia globalne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Globalne opcje sieciowe" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "Przejdź do aktualizacji firmware..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Przejdź do konfiguracji hasła..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Przejdź do powiązanych ustawień" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "Udziel dostępu do konfiguracji DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Udziel dostępu do wyświetlania statusu DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "Udziel dostępu do wyświetlania statusu DSL" @@ -3338,6 +3796,10 @@ msgstr "Udziel dostępu do procedur LuCI OpenConnect" msgid "Grant access to LuCI Wireguard procedures" msgstr "Udziel dostępu LuCI do procedur Wireguard" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Przyznaj dostęp do procedur openfortivpn LuCI" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "Udziel dostępu do konfiguracji SSH" @@ -3374,7 +3836,7 @@ msgstr "Udziel dostępu do konfiguracji montowania" msgid "Grant access to network configuration" msgstr "Udziel dostępu do konfiguracji sieci" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Udziel dostępu do narzędzi diagnostyki sieci" @@ -3382,6 +3844,10 @@ msgstr "Udziel dostępu do narzędzi diagnostyki sieci" msgid "Grant access to network status information" msgstr "Udziel dostępu do informacji o stanie sieci" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "Udziel dostępu do statusu procesów" @@ -3414,7 +3880,7 @@ msgstr "Przyznaj dostęp do konfiguracji uHTTPd" msgid "Grant access to wireless channel status" msgstr "Udziel dostępu do statusu kanału sieci bezprzewodowej" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Udziel dostępu do wyświetlania statusu sieci bezprzewodowej" @@ -3443,15 +3909,11 @@ msgstr "Dostęp HTTP(S)" msgid "Hang Up" msgstr "Rozłącz" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Błędy kodu nagłówka (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Interwał pulsu (kernel: puls)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Czas wysyłania pakietów Hello" @@ -3463,7 +3925,7 @@ msgstr "" "Tutaj możesz skonfigurować podstawowe ustawienia urządzenia, np. nazwę hosta " "lub strefę czasową." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" "Ukryj ESSID%h
    (%h), Priority: %d" msgstr "Hak: %h (%h), Priorytet: %d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Kara przeskoku" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3494,18 +3964,26 @@ msgstr "Host" msgid "Host expiry timeout" msgstr "Czas wygasania hosta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "Host żąda tej nazwy pliku z serwera startowego." #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 msgid "Host-Uniq tag content" -msgstr "Zawartość znacznika Host-Uniq" +msgstr "Zawartość znacznika Host‑Uniq" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" +"Specyficzny czas dzierżawy hosta, np. 5m, 3h, " +"7d." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3515,11 +3993,11 @@ msgstr "Nazwa hosta" msgid "Hostname to send when requesting DHCP" msgstr "Nazwa hosta wysyłana podczas negocjacji DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Nazwy hostów" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3578,23 +4056,27 @@ msgstr "IEEE 802.3ad Dynamiczna agregacja łączy (802.3ad, 4)" msgid "IKE DH Group" msgstr "Grupa IKE DH" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "Numer IMEI" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "Adres IP" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "Protokół IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "Zestawy IP" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "Typ IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3610,7 +4092,7 @@ msgstr "Nieprawidłowy adres IP" msgid "IP address is missing" msgstr "Brakuje adresu IP" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3625,20 +4107,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "Protokół IP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "Protokół IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "Zestaw IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "Zestawy IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Podrobione statystyki NXDOMAIN" @@ -3646,14 +4128,15 @@ msgstr "Podrobione statystyki NXDOMAIN" msgid "IPsec XFRM" msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3669,7 +4152,7 @@ msgstr "Sąsiedztwo IPv4" msgid "IPv4 Routing" msgstr "Trasowanie IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "Reguły IPv4" @@ -3679,7 +4162,7 @@ msgstr "Połączenie IPv4" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3706,42 +4189,46 @@ msgstr "Maska IPv4" msgid "IPv4 network in address/netmask notation" msgstr "Zapis adresu/maski w sieci IPv4" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Tylko IPv4" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:52 msgid "IPv4 prefix" -msgstr "Prefix IPv4" +msgstr "Prefiks IPv4" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 msgid "IPv4 prefix length" msgstr "Długość prefiksu IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "Tabela ruchu IPv4 \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" #: modules/luci-compat/luasrc/model/network/proto_ipip.lua:9 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:10 msgid "IPv4-in-IPv4 (RFC2003)" -msgstr "IPv4-in-IPv4 (RFC2003)" +msgstr "IPv4-w-IPv4 (RFC2003)" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (oba - domyślnie IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "Tabela ruchu IPv4/IPv6 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3752,7 +4239,8 @@ msgstr "Tabela ruchu IPv4/IPv6 \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3760,15 +4248,19 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Zapora sieciowa IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" -msgstr "IPv6 MTU" +msgstr "MTU IPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:262 msgid "IPv6 Neighbours" msgstr "Sąsiedztwo IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "Żywotność prefiksu IPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "Ustawienia RA IPv6" @@ -3776,17 +4268,17 @@ msgstr "Ustawienia RA IPv6" msgid "IPv6 Routing" msgstr "Trasowanie IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "Reguły IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "Ustawienia IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" -msgstr "IPv6 Prefiks-ULA" +msgstr "Prefiks ULA IPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 msgid "IPv6 Upstream" @@ -3798,12 +4290,12 @@ msgstr "Połączenie IPv6" msgid "IPv6 address" msgstr "Adres IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "Wskazówka przypisania IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "Długość przydziału IPv6" @@ -3815,11 +4307,11 @@ msgstr "Brama IPv6" msgid "IPv6 network in address/netmask notation" msgstr "Zapis adresu/maski w sieci IPv6" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Tylko IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "Preferencje IPv6" @@ -3828,7 +4320,7 @@ msgstr "Preferencje IPv6" msgid "IPv6 prefix" msgstr "Prefiks IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "Filtr prefiksu IPv6" @@ -3842,23 +4334,19 @@ msgstr "Długość prefiksu IPv6" msgid "IPv6 routed prefix" msgstr "Kierowany prefiks IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "Trasowanie źródłowe IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "Sufiks IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "Sufiks IPv6(hex)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "Obsługa IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "Tabela ruchu IPv6 \"%h\"" @@ -3866,6 +4354,10 @@ msgstr "Tabela ruchu IPv6 \"%h\"" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "Sufiks IPv6 (szesnastkowy)" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3882,10 +4374,18 @@ msgstr "IPv6-przez-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-przez-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Tożsamość" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" +"Jeśli host pasuje do wpisu, którego nie można użyć, ponieważ określa adres w " +"innej podsieci, ustawiany jest tag known-othernet." + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Jeśli zaznaczone, 1DES jest włączony" @@ -3898,7 +4398,7 @@ msgstr "Jeśli zaznaczone, dodaje \"+ ipv6\" do opcji pppd" msgid "If checked, encryption is disabled" msgstr "Jeśli zaznaczone, szyfrowanie jest wyłączone" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." @@ -3906,7 +4406,7 @@ msgstr "" "Jeżeli jest ustawione, to podsieci niższego rzędu są przydzielane tylko z " "podanych klas prefiksów IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "Jeżeli jest ustawione, znaczenie opcji dopasowania jest odwrócone" @@ -3915,8 +4415,8 @@ msgstr "Jeżeli jest ustawione, znaczenie opcji dopasowania jest odwrócone" msgid "" "If specified, mount the device by its UUID instead of a fixed device node" msgstr "" -"Jeśli podano, zainstaluj urządzenie poprzez jego UUID zamiast ustalonego węzła urządzenia" +"Jeśli określono, zamontuj urządzenie według jego UUID zamiast ustalonego " +"węzła urządzenia" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:268 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:377 @@ -3924,10 +4424,10 @@ msgid "" "If specified, mount the device by the partition label instead of a fixed " "device node" msgstr "" -"Jeśli podano, zainstaluj urządzenie poprzez nazwę partycji zamiast ustalonego węzła urządzenia" +"Jeśli określono, zamontuj urządzenie według etykiety partycji zamiast " +"ustalonego węzła urządzenia" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " @@ -3938,14 +4438,16 @@ msgstr "" "w ciągu %d sekund w celu potwierdzenia ustawień, w przeciwnym razie " "modyfikacje zostaną cofnięte." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Jeśli odznaczone, nie ma zdefiniowanej domyślnej trasy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "Jeśli odznaczone, rozgłoszane adresy serwerów DNS są ignorowane" @@ -3958,21 +4460,30 @@ msgid "" "very slow process as the swap-device cannot be accessed with the high " "datarates of the RAM." msgstr "" -"Jeśli ilość Twojej pamięci fizycznej jest niewystarczająca, nieużywane " -"miejsce na dysku może być tymczasowo wykorzystane na plik wymiany. W " -"rezultacie większa ilość pamięci RAM będzie dostępna. Uwaga - plik wymiany jest dużo wolniejszy niż pamięć " -"RAM." +"Jeśli pamięć fizyczna urządzenia jest niewystarczająca, nieużywaną " +"przestrzeń można tymczasowo zamienić na urządzenie wymiany, co zwiększy " +"ilość użytecznej pamięci RAM. " +"Należy pamiętać, że wymiana danych jest bardzo powolnym procesem, ponieważ " +"urządzenie wymiany nie jest w stanie uzyskać szybkości transmisji danych na " +"poziomie pamięci RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "Ignoruj" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignoruj /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignoruj interfejs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "Ignoruj żądania z nieznanych maszyn za pomocą tagu !known." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignoruj plik resolv" @@ -3984,25 +4495,25 @@ msgstr "Obraz" msgid "Image check failed:" msgstr "Sprawdzanie obrazu nie powiodło się:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "Importuj jako peer" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "Importuj konfigurację" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "Importuj konfigurację jako peer…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "Importuj ustawienia" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "Zaimportowana konfiguracja peera" @@ -4014,7 +4525,29 @@ msgstr "Importuje ustawienia z istniejącego pliku konfiguracyjnego WireGuard" msgid "In" msgstr "W" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" +"W DHCPv4 możliwe jest uwzględnienie więcej niż jednego adresu MAC. Pozwala " +"to na powiązanie adresu IP z wieloma adresami MAC, a Dnsmasq porzuca " +"dzierżawę DHCP na rzecz jednego z adresów MAC, gdy inny prosi o dzierżawę. " +"Działa niezawodnie tylko wtedy, gdy tylko jeden z adresów MAC jest aktywny w " +"dowolnym momencie." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"W zmostkowanych konfiguracjach sieci LAN zaleca się włączenie funkcji " +"unikania pętli mostowych w celu uniknięcia pętli rozgłoszeniowych, które " +"mogą doprowadzić do zatrzymania całej sieci LAN." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -4023,7 +4556,7 @@ msgstr "" "zablokowane. Kliknij \"Kontynuuj»\" poniżej, aby powrócić do poprzedniej " "strony." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "W sekundach" @@ -4055,7 +4588,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Przychodząca suma kontrolna" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Interfejs przychodzący" @@ -4063,6 +4596,7 @@ msgstr "Interfejs przychodzący" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Klucz przychodzący" @@ -4081,22 +4615,21 @@ msgstr "Informacja" msgid "Information" msgstr "Informacje" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "Mapowanie QoS przychodzących" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "Identyfikator urządzenia wejściowego" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "Nazwa urządzenia wejściowego" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Błąd inicjalizacji" @@ -4108,31 +4641,41 @@ msgstr "Skrypt startowy" msgid "Initscripts" msgstr "Skrypty startowe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Ograniczenie certyfikatu wewnętrznego (domena)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Ograniczenie certyfikatu wewnętrznego (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Ograniczenie wewnętrznego certyfikatu (temat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Ograniczenie wewnętrznego certyfikatu (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Instaluj rozszerzenia protokołów..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Instancja" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Instancja \"%h\"" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Szczegóły instancji" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4144,6 +4687,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Niewystarczające uprawnienia do odczytu konfiguracji UCI." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "Integrated Circuit Card Identifier (ICCID)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4151,7 +4698,7 @@ msgstr "Niewystarczające uprawnienia do odczytu konfiguracji UCI." msgid "Interface" msgstr "Interfejs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "Interfejs \"%h\" jest już oznaczony jako wyznaczony nadrzędny." @@ -4159,7 +4706,7 @@ msgstr "Interfejs \"%h\" jest już oznaczony jako wyznaczony nadrzędny." msgid "Interface %q device auto-migrated from %q to %q." msgstr "Interfejs %q urządzenia przeniesiony automatycznie z %q do %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Konfiguracja interfejsu" @@ -4190,11 +4737,11 @@ msgstr "Ponowne łączenie interfejsu..." msgid "Interface is shutting down..." msgstr "Interfejs jest wyłączany..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Interfejs uruchamia się..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Interfejs zatrzymuje się..." @@ -4203,12 +4750,12 @@ msgid "Interface name" msgstr "Nazwa interfejsu" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Interfejs nie istnieje lub nie jest jeszcze podłączony." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Interfejsy" @@ -4217,15 +4764,19 @@ msgstr "Interfejsy" msgid "Internal" msgstr "Wewnętrzny" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Wewnętrzny błąd serwera" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "International Mobile Equipment Identity (IMEI)" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "International Mobile Subscriber Identity (IMSI)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Interwał wysyłania pakietów edukacyjnych" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4236,7 +4787,7 @@ msgstr "" "komunikatów IGMP w podsieci; większe wartości powodują, że zapytania IGMP są " "wysyłane rzadziej" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "Interwał w sekundach dla pakietów STP hello" @@ -4246,8 +4797,9 @@ msgid "Invalid" msgstr "Niewłaściwy" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "Podano nieprawidłowy APN" @@ -4257,6 +4809,10 @@ msgstr "Podano nieprawidłowy APN" msgid "Invalid Base64 key string" msgstr "Nieprawidłowy ciąg klucza Base64" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Nieprawidłowy adres IPv6" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4279,7 +4835,7 @@ msgstr "Podano niewłaściwy ID VLAN! Dozwolone są tylko unikalne ID" msgid "Invalid argument" msgstr "Błędny argument" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4295,18 +4851,39 @@ msgstr "Nieprawidłowe polecenie" msgid "Invalid hexadecimal value" msgstr "Nieprawidłowa wartość szesnastkowa" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Nieprawidłowa nazwa hosta lub adres IPv4" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Nieprawidłowy port" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "Nieprawidłowy adres URL serwera" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Niewłaściwy login i/lub hasło! Spróbuj ponownie." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Odwrócone miganie" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "Odwróć dopasowanie" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "Jest podstawową siecią VLAN" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" -msgstr "Izoluj klientów" +msgstr "Izoluj klienty" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:236 msgid "" @@ -4316,25 +4893,25 @@ msgstr "" "Wygląda na to, że próbujesz wgrać obraz, który nie mieści się w pamięci " "flash, sprawdź plik obrazu!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "JavaScript jest wymagany!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Połącz z siecią" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Przyłącz do sieci: Skanuj sieci WiFi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Przyłączanie do sieci: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Przejdź do reguły" @@ -4342,24 +4919,28 @@ msgstr "Przejdź do reguły" msgid "Keep settings and retain the current configuration" msgstr "Zachowaj ustawienia i bieżącą konfigurację" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "Utrzymanie aktywności (Keep-Alive)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Dziennik kernela" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Wersja kernela" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Klucz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Klucz #%d" @@ -4367,6 +4948,7 @@ msgstr "Klucz #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Klucz do pakietów przychodzących (opcjonalnie)." @@ -4374,14 +4956,19 @@ msgstr "Klucz do pakietów przychodzących (opcjonalnie)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Klucz do pakietów wychodzących (opcjonalnie)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "Brak klucza" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Klucz używany do podpisywania konfiguracji sieci" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4426,7 +5013,7 @@ msgstr "Interwał echa LCP" msgid "LED Configuration" msgstr "Konfiguracja LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4443,32 +5030,41 @@ msgstr "Język" msgid "Language and Style" msgstr "Wygląd i język" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" +"Większe ważności (tego samego priorytetu) mają proporcjonalnie większe " +"prawdopodobieństwo wyboru." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "Interwał ostatniego użytkownika" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Opoźnienie" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Ostatni handshake" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Karta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Ucz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "Poznaj trasy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Plik dzierżawy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Czas dzierżawy" @@ -4492,7 +5088,7 @@ msgstr "Pozostaw puste, aby automatycznie wykryć" msgid "Leave empty to use the current WAN address" msgstr "Pozostaw puste, aby użyć bieżącego adresu WAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4503,31 +5099,27 @@ msgstr "" "gdy jest stosowane to ustawienie. Zaleca się, aby w miarę możliwości nie " "zezwalać na szybkości 802.11b." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "Wykryto starsze reguły" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Legenda:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Limit" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Tłumienie linii (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "Tryb linii" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "Stan linii" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "Czas działania linii" @@ -4548,17 +5140,20 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "Bity nagłówka warstwy łącza %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Lista adresów IP do konwersji na odpowiedzi NXDOMAIN." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -"Lista zestawów adresów IP do wypełnienia określonymi adresami IP domeny." +"Lista zestawów adresów IP, które mają być wypełnione adresami IP wyników DNS " +"lookup dla FQDN określonych tutaj." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4566,13 +5161,13 @@ msgid "" "from the R0KH that the STA used during the Initial Mobility Domain " "Association." msgstr "" -"Lista R0KHs w tej samej Domenie Mobilnej.
    Format: Adres-MAC," -"Identyfikator-NAS,128-bitowy klucz jako ciąg szesnastkowy.
    Tej listy " -"używa się do mapowania R0KH-ID (Identyfikator NAS) do docelowego adresu MAC " -"przy żądaniu klucza PMK-R1 z R0KH, którego STA używał podczas Initial " -"Mobility Domain Association." +"Lista R0KH w tej samej domenie mobilnej.
    Format: adres MAC, " +"identyfikator NAS, klucz 128-bitowy jako ciąg szesnastkowy.
    Ta lista " +"jest używana do mapowania R0KH-ID (identyfikator NAS) na docelowy adres MAC " +"podczas żądania klucza PMK-R1 od R0KH, którego STA użyła podczas " +"początkowego powiązania domeny mobilnej." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4580,42 +5175,40 @@ msgid "" "R0KH. This is also the list of authorized R1KHs in the MD that can request " "PMK-R1 keys." msgstr "" -"Lista R1KHs w tej samej Domenie Mobilnej.
    Format: Adres-MAC,R1KH-ID " -"jako 6 oktetów z dwukropkami,128-bitowy klucz jako ciąg szesnastkowy.
    Tej listy używa się do mapowania R1KH-ID na docelowy adres MAC podczas " +"Lista R1KH w tej samej domenie mobilnej.
    Format: adres MAC, R1KH-ID " +"jako 6 oktetów z dwukropkami, klucz 128-bitowy jako ciąg szesnastkowy.
    Ta lista jest używana do mapowania R1KH-ID na docelowy adres MAC podczas " "wysyłania klucza PMK-R1 z R0KH. Jest to również lista autoryzowanych R1KH w " -"MD, które mogą zażądać kluczy PMK-R1." +"domenie mobilnej, które mogą żądać kluczy PMK-R1." #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:82 msgid "List of SSH key files for auth" msgstr "Lista kluczy SSH do autoryzacji" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Lista domen zezwalających na odpowiedzi RFC1918." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Lista wymuszonych domen na adres IP." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "Lista źródłowych resolwerów, do których będą przekazywane zapytania." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Port nasłuchiwania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Nasłuchuj interfejsy" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -"Słuchaj tylko na podanym interfejsie lub, jeśli nie określono, na wszystkich" +"Nasłuchuj tylko na podanym interfejsie lub, jeśli nie określono, na " +"wszystkich" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4625,7 +5218,7 @@ msgstr "Ogranicz nasłuchiwanie do tych interfesjów oraz pętli zwrotnej." msgid "ListenPort setting is invalid" msgstr "Ustawienie portu nasłuchiwania jest nieprawidłowe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Port nasłuchu dla przychodzących zapytań DNS." @@ -4634,7 +5227,7 @@ msgstr "Port nasłuchu dla przychodzących zapytań DNS." msgid "Load" msgstr "Obciążenie" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Średnie obciążenie" @@ -4642,27 +5235,28 @@ msgstr "Średnie obciążenie" msgid "Load configuration…" msgstr "Wczytaj konfigurację…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Ładowanie danych…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Ładowanie zawartości katalogu.…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Ładowanie widoku…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Lokalny" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Lokalny adres IP" @@ -4682,11 +5276,12 @@ msgstr "Lokalny adres IP do przypisania" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Lokalny adres IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Lokalny serwer DNS IPv6" @@ -4702,45 +5297,71 @@ msgstr "Lokalny adres IPv6" msgid "Local Startup" msgstr "Lokalny autostart" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Czas lokalny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "Lokalny ULA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Domena lokalna" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "Przyrostek (sufiks) domeny przyłączany do nazw DHCP i wpisów w pliku hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Serwer lokalny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Tylko usługa lokalna" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Lokalny klucz Wireguard" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Zapytania lokalizujące" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "Numer kierunkowy lokalizacji" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Zablokuj na BSSID" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Zdarzenie logowania \"%h…\"" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Zaloguj" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Zaloguj się…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Wyloguj" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Poziom logowania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Loguj zapytania" @@ -4767,37 +5388,28 @@ msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" "Sieć logiczna, do której tunel zostanie dodany (zmostkowy) (opcjonalnie)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Zaloguj" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Wyloguj" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "Luźne filtrowanie" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Utrata sygnału (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Najniższy wydzierżawiony adres jako offset dla adresu sieci." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Aktywny tryb zgodności Lua" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "Adres MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Filtrowanie adresów MAC" @@ -4805,16 +5417,15 @@ msgstr "Filtrowanie adresów MAC" msgid "MAC Address For The Actor" msgstr "Adres MAC dla aktora" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4823,11 +5434,15 @@ msgstr "MAC VLAN" msgid "MAC address" msgstr "Adres MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "Adres(y) MAC" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Filtrowanie MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Lista MAC" @@ -4841,6 +5456,10 @@ msgstr "MAP/LW4over6" msgid "MAP rule is invalid" msgstr "Reguła MAP jest nieprawidłowa" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "Komórkowy MBIM" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4862,15 +5481,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "Interwał MII" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4880,7 +5503,7 @@ msgstr "" "do poleceń poniżej:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4889,81 +5512,89 @@ msgstr "" msgid "Manual" msgstr "Ręczne" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "Producent" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Główny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "Tag dopasowania" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "Maksymalny odstęp czasu RA" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Maksymalna osiągalna przepustowość danych (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" -"Maks. dzierżaw DHCP" +"Maks. dzierżaw DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Maks. rozmiar pakietu EDNS0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" -msgstr "Maks. jednoczesnych zapytań" +msgstr "Maks. jednoczesnych zapytań" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Maksymalny wiek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Maksymalny dozwolony odstęp czasu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Maksymalna dozwolona liczba aktywnych dzierżaw DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Maksymalna dozwolona liczba jednoczesnych zapytań DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." -msgstr "Maksymalny dozwolony rozmiar pakietów EDNS.0 UDP." +msgstr "Maksymalny dozwolony rozmiar pakietów UDP EDNS0." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Maksymalny czas podany w sekundach do pełnej gotowości modemu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Maksymalna liczba dzierżawionych adresów." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "Maksymalny rozmiar tabeli podsłuchiwania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -"Maksymalny dozwolony czas pomiędzy wysyłaniem nieproszonego RA. Wartość domyślna " "to 600 sekund." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Maksymalna moc nadawania" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Może uniemożliwić działanie VoIP lub innych usług." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4990,7 +5621,7 @@ msgstr "Pamięć" msgid "Memory usage (%)" msgstr "Użycie RAM" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -4998,10 +5629,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "Mesh ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Mesh Id" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Trasowanie sieci mesh" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Opcje związane z siecią mesh i trasowaniem" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Nie znaleziono metody" @@ -5014,7 +5653,7 @@ msgstr "Metoda monitorowania łącza" msgid "Method to determine link status" msgstr "Metoda określania statusu łącza" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -5025,11 +5664,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "Minimalny odstęp czasu RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Minimalny czas ważności ARP" @@ -5037,7 +5676,7 @@ msgstr "Minimalny czas ważności ARP" msgid "Minimum Number of Links" msgstr "Minimalna liczba połączeń" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." @@ -5045,12 +5684,12 @@ msgstr "" "Minimalny wymagany czas w sekundach zanim wpis ARP może zostać zastąpiony. " "Zapobiega przeciążeniu pamięci podręcznej ARP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." msgstr "" -"Minimalny dozwolony czas pomiędzy wysyłaniem nieproszonego RA. Wartość domyślna " "to 200 sekund." @@ -5062,35 +5701,49 @@ msgstr "Kopia monitorowanego portu" msgid "Mirror source port" msgstr "Kopia portu źródłowego" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "Kod kraju telefonu komórkowego" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Dane mobilne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "Kod sieci komórkowej" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "Usługa mobilna" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Domena mobilna" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Tryb" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Model" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Trwa niszczenie nosiciela modemu." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "Informacje o modemie" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5098,43 +5751,36 @@ msgstr "" "Połączenie modemowe w toku. Proszę zaczekać. Ten proces zostanie przerwany " "po 2 minutach." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Domyślny modem" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Urządzenie modemowe" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Rozłączenie modemu w toku. Proszę zaczekać." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Zapytanie dotyczące modemu nie powiodło się" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Limit czasu inicjacji modemu" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "Modem jest wyłączony." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "Menedżer modemu" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" @@ -5204,6 +5850,10 @@ msgstr "Przesuń w dół" msgid "Move up" msgstr "Przesuń w górę" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Multi do unicastu" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5211,19 +5861,23 @@ msgstr "Przesuń w górę" msgid "Multicast" msgstr "Multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Tryb multicast" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Trasowanie multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "Multicast do unicastu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" -msgstr "NAS ID" +msgstr "Identyfikator NAS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "Łańcuch działań NAT \"%h\"" @@ -5233,14 +5887,18 @@ msgstr "Tryb NAT-T" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 msgid "NAT64 Prefix" -msgstr "Prefix NAT64" +msgstr "Prefiks NAT64" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "Prefiks NAT64" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "Podrzędne NDP-Proxy" @@ -5253,18 +5911,23 @@ msgid "NTP server candidates" msgstr "Lista serwerów NTP" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Nazwa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Nazwa nowej sieci" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Nazwa urządzenia tunelowego" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Nawigacja" @@ -5273,13 +5936,17 @@ msgstr "Nawigacja" msgid "Nebula Network" msgstr "Sieć Nebula" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Raport o sąsiadach" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "Ważność pamięci podręcznej sąsiada" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5288,32 +5955,36 @@ msgstr "Ważność pamięci podręcznej sąsiada" msgid "Network" msgstr "Sieć" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Kodowanie sieciowe" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "Tryb sieci" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "Rejestracja sieciowa" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "Sieć SSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Narzędzia sieciowe" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "Adres sieci" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Sieciowy obraz startowy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "Migracja konfiguracji mostu sieciowego" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Urządzenie sieciowe" @@ -5326,7 +5997,7 @@ msgstr "Aktywność urządzenia sieciowego (kernel: netdev)" msgid "Network device is not present" msgstr "Urządzenie sieciowe nie jest obecne" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "Tabela urządzeń sieciowych \"%h\"" @@ -5335,7 +6006,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "Bity nagłówka sieci %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Migracja konfiguracji sieciowej ifname" @@ -5344,15 +6015,20 @@ msgstr "Migracja konfiguracji sieciowej ifname" msgid "Network interface" msgstr "Interfejs sieciowy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "Identyfikator sieci" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Nigdy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Nigdy" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5360,11 +6036,11 @@ msgstr "" "Nigdy nie przesyłaj dalej pasujących domen i poddomen, rozwiązuj tylko z " "DHCP lub plików hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Nowy interfejs \"%s\" nie może być utworzony: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Nazwa nowego interfejsu…" @@ -5372,13 +6048,13 @@ msgstr "Nazwa nowego interfejsu…" msgid "Next »" msgstr "Następna »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Nie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Brak skonfigurowanego serwera DHCP dla tego interfejsu" @@ -5386,7 +6062,7 @@ msgstr "Brak skonfigurowanego serwera DHCP dla tego interfejsu" msgid "No Data" msgstr "Brak danych" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Brak szyfrowania" @@ -5402,9 +6078,17 @@ msgstr "Bez NAT-T" msgid "No RX signal" msgstr "Brak sygnału RX" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Brak skonfigurowanych interfejsów WireGuard." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "Nie znaleziono konfiguracji dozwolonego trybu." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5418,7 +6102,11 @@ msgstr "" msgid "No client associated" msgstr "Brak powiązanego klienta" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Nie określono urządzenia sterującego" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "Brak danych" @@ -5427,10 +6115,10 @@ msgstr "Brak danych" msgid "No data received" msgstr "Nie otrzymano danych" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" -msgstr "Nie egzekwuj" +msgstr "Brak egzekwowania" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:229 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:232 @@ -5441,15 +6129,11 @@ msgstr "Nie egzekwuj" msgid "No entries available" msgstr "Brak wpisów" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Brak wpisów w tym katalogu" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Nie znaleziono plików" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5465,7 +6149,7 @@ msgstr "" msgid "No host route" msgstr "Brak trasy hosta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5486,30 +6170,39 @@ msgstr "Brak dostępnych niewolników" msgid "No more slaves available, can not save interface" msgstr "Brak dostępnych niewolników, nie można zapisać interfejsu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Wyłącz buforowanie negatywnych odpowiedzi" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "Nie załadowano zestawu reguł nftables." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Nie ustawiono hasła!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Nie podłączono peerów" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "Nie zdefiniowano jeszcze peerów." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "Nie znaleziono konfiguracji preferowanego trybu." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Nie istnieją jeszcze klucze publiczne." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "Brak reguł w tym łańcuchu" @@ -5523,7 +6216,8 @@ msgid "No validation or filtering" msgstr "Brak walidacji lub filtrowania" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Brak przypisanej strefy" @@ -5535,50 +6229,53 @@ msgstr "Brak przypisanej strefy" msgid "Noise" msgstr "Szum" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Margines szumów (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Margines hałasu" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Szum:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Nieprzewidziane błedy CRC (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Bez symboli wieloznacznych" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Brak" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normalny" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Nie znaleziono" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Nie jest członkiem" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" -msgstr "Nie powiązany" +msgstr "Niepowiązany" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 msgid "Not connected" -msgstr "Nie podłączony" +msgstr "Niepodłączony" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Nieobecny" @@ -5588,16 +6285,25 @@ msgstr "Nie uruchomiono przy starcie" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:409 msgid "Not supported" -msgstr "Nie wspierane" +msgstr "Nieobsługiwane" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" -"Uwaga: Niektóre sterowniki nie obsługują w pełni standardu 802.11w. Np. " +"Uwaga: niektóre sterowniki nie obsługują w pełni standardu 802.11w, np. " "mwlwifi może mieć problemy" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Uwaga: możesz również potrzebować serwera proxy DHCP (obecnie niedostępnego) " +"podczas określania niestandardowego portu „Przekazuj do” (addr#port)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Uwagi" @@ -5606,7 +6312,7 @@ msgstr "Uwagi" msgid "Notice" msgstr "Spostrzeżenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5614,7 +6320,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "Liczba raportów członkowskich IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "Liczba buforowanych wpisów DNS (maksymalnie 10000, 0 oznacza brak pamięci " @@ -5633,7 +6339,7 @@ msgid "Obfuscated Password" msgstr "Ukryte hasło" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5644,6 +6350,7 @@ msgid "Obtain IPv6 address" msgstr "Uzyskaj adres IPv6" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Wyłączone" @@ -5652,6 +6359,14 @@ msgstr "Wyłączone" msgid "Off-State Delay" msgstr "Zwłoka wyłączenia" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"Wyłączone: vlanXXX, np. vlan1. Włączone: " +"vlan_tagged_interface.XXX, np. eth0.1." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Włączone" @@ -5660,15 +6375,15 @@ msgstr "Włączone" msgid "On-State Delay" msgstr "Zwłoka połączenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "Trasa łącza" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Nazwa hosta lub adres MAC musi być podany!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Jedno z poniższych: %s" @@ -5686,7 +6401,11 @@ msgstr "Jedna lub więcej niepoprawnych/wymaganych wartości na zakładce" msgid "One or more required fields have no value!" msgstr "Jedno lub więcej pól nie posiada wpisanych wartości!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "Akceptuj odpowiedzi tylko za pośrednictwem" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" "Zezwalaj na komunikację z portami mostów nieizolowanych tylko wtedy, gdy są " @@ -5699,25 +6418,24 @@ msgstr "" "Tylko jeśli aktualny aktywny niewolnik ulegnie awarii, a podstawowy " "niewolnik jest włączony (awaria, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "Otwórz przegląd reguł iptables…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Otwórz listę..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5736,7 +6454,7 @@ msgstr "" "jest skonfigurowany i aktywny, w przeciwnym razie powróć do trybu " "serwera." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." @@ -5744,12 +6462,24 @@ msgstr "" "Działaj w trybie przekaźnika, jeśli źródłowy prefiks IPv6 jest " "obecny, w przeciwnym razie wyłącz usługę." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Częstotliwość" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "Operator" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "Kod operatora" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "Nazwa operatora" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "Opcja \"%s\" zawiera nieważną wartość wejściową." @@ -5757,22 +6487,33 @@ msgstr "Opcja \"%s\" zawiera nieważną wartość wejściową." msgid "Option \"%s\" must not be empty." msgstr "Opcja \"%s\" nie może być pusta." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" -msgstr "Wartość zmieniona" +msgstr "Zmieniono opcję" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" -msgstr "Usunięto wartość" +msgstr "Usunięto opcję" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Opcjonalne" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "Opcjonalna nazwa hosta do przypisania" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Opcjonalne, dowolne uwagi dotyczące tego urządzenia" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" +"Opcjonalne, w sekundach. Jeśli ustawiono na \"0\", nie jest podejmowana " +"próba ponownego połączenia." + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5781,7 +6522,7 @@ msgstr "" "Opcjonalnie. 32-bitowy znak dla wychodzących zaszyfrowanych pakietów. Wpisz " "wartość w hex, zaczynając od 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5793,34 +6534,35 @@ msgstr "" "odbierany z serwera delegującego, użyj sufiksa (takiego jak '::1'), aby " "utworzyć adres IPv6 ('a:b:c:d::1') dla tego interfejsu." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -"Opcjonalnie. Base64-zakodowany klucz współdzielony. Dodaje dodatkową warstwę " -"symetrycznej kryptografii klucza dla uzyskania odporności po kwantowej." +"Opcjonalne. Zakodowany w formacie Base64 klucz współdzielony. Dodaje " +"dodatkową warstwę symetrycznej kryptografii klucza dla uzyskania odporności " +"postkwantowej." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Opcjonalny. Tworzenie tras dozwolonych adresów IP dla tego peera." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." -msgstr "Opcjonalny. Opis peera." +msgstr "Opcjonalne. Opis peera." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:185 msgid "Optional. Do not create host routes to peers." msgstr "Opcjonalnie. Nie twórz tras hosta do peerów." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" "Opcjonalnie. Host z peerem. Nazwy są ustalane przed wywołaniem interfejsu." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5838,11 +6580,11 @@ msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" "Opcjonalne. Maksymalna jednostka transmisji (MTU) interfejsu tunelowego." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Opcjonalny. Port dla peera." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5854,7 +6596,7 @@ msgstr "" "kodu QR, jeśli jest dostępny. Można go usunąć po wyeksportowaniu " "konfiguracji." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5866,13 +6608,13 @@ msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 msgid "Optional. UDP port used for outgoing and incoming packets." msgstr "" -"Opcjonalny. Port UDP używany dla pakietów wychodzących i przychodzących." +"Opcjonalne. Port UDP używany dla pakietów wychodzących i przychodzących." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:72 msgid "Options" msgstr "Opcje" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" dla domyślnego trasowania. 0.0.0.0 oznacza \"adres " "systemu z uruchomionym dnsmasq\"." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "Opcje:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Porządkowa: niższa wartość jest pierwsza." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Interwał inicjatora" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "Inne:" @@ -5907,7 +6658,7 @@ msgstr "Wychodzący:" msgid "Outgoing checksum" msgstr "Wychodząca suma kontrolna" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "Interfejs wychodzący" @@ -5915,6 +6666,7 @@ msgstr "Interfejs wychodzący" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "Klucz wychodzący" @@ -5938,21 +6690,23 @@ msgstr "Strefa wyjściowa" msgid "Overlap" msgstr "Nakładanie się" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" -msgstr "Zastąp tablicę routingu IPv4" +msgstr "Zastąp tablicę trasowania IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" -msgstr "Zastąp tablicę routingu IPv6" +msgstr "Zastąp tablicę trasowania IPv6" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5960,6 +6714,7 @@ msgstr "Zastąp tablicę routingu IPv6" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "Nadpisz MTU" @@ -5981,12 +6736,12 @@ msgstr "Nadpisz TOS" msgid "Override TTL" msgstr "Nadpisz TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" msgstr "" -"Zastąp domyślny adres MAC - zakres możliwych do wykorzystania adresów może " +"Zastąp domyślny adres MAC – zakres możliwych do wykorzystania adresów może " "być ograniczony przez sterownik" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 @@ -5997,7 +6752,7 @@ msgstr "Nadpisz domyślną nazwę interfejsu" msgid "Override the gateway in DHCP responses" msgstr "Nadpisz adres bramy w odpowiedziach DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -6013,7 +6768,7 @@ msgstr "Zastąp tabelę używaną do tras wewnętrznych" msgid "Overview" msgstr "Przegląd" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "Nadpisać istniejący plik \"%s\" ?" @@ -6021,17 +6776,30 @@ msgstr "Nadpisać istniejący plik \"%s\" ?" msgid "Overwrite the current settings with the imported configuration?" msgstr "Zastąpić bieżące ustawienia zaimportowaną konfiguracją?" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "Własne numery" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Właściciel" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (oba)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -6043,8 +6811,9 @@ msgid "PAP/CHAP password" msgstr "Hasło PAP/CHAP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -6055,6 +6824,7 @@ msgstr "Hasło PAP/CHAP" msgid "PAP/CHAP username" msgstr "Nazwa użytkownika PAP/CHAP" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "Rodzaj PDP" @@ -6064,8 +6834,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "PIN" @@ -6075,9 +6846,9 @@ msgstr "PIN" msgid "PIN code rejected" msgstr "Kod PIN został odrzucony" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" -msgstr "PMK R1 Push" +msgstr "Wypychaj PMK R1" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:13 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:43 @@ -6116,28 +6887,37 @@ msgstr "Przesunięcie PSID" msgid "PSID-bits length" msgstr "Długość bitów PSID" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM (tryb transferu pakietów)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "Ustawienia PXE/TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "Stan usługi pakietowej" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "Sterowanie pakietami" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "Znacznik pakietu" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Czas odbioru pakietu" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "Pakiety" @@ -6147,24 +6927,32 @@ msgid "Packets To Transmit Before Moving To Next Slave" msgstr "" "Pakiety do przesłania przed przejściem do następnego urządzenia podrzędnego" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "Część sieci:" +msgstr[1] "Część sieci:" +msgstr[2] "Część sieci:" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Część strefy %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "" "Pass-through (kopia lustrzana urządzenia fizycznego do pojedynczego MAC VLAN)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Hasło" @@ -6172,11 +6960,11 @@ msgstr "Hasło" msgid "Password authentication" msgstr "Uwierzytelnianie hasłem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Hasło klucza prywatnego" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "Wewnętrzne hasło klucza prywatnego" @@ -6187,19 +6975,19 @@ msgstr "Wewnętrzne hasło klucza prywatnego" msgid "Password strength" msgstr "Siła hasła" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "Hasło2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "Wklej lub przeciągnij plik klucza SSH…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "Wklej lub przeciągnij plik konfiguracji peera WireGuard (wg0.conf)…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " @@ -6209,31 +6997,31 @@ msgstr "" "em>) z innego systemu, aby utworzyć pasujący wpis peera, umożliwiając temu " "systemowi połączenie się z lokalnym interfejsem WireGuard." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "Wklej lub przeciągnij dostarczony plik konfiguracyjny WireGuard…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Ścieżka do certyfikatu CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Ścieżka do certyfikatu klienta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Ścieżka do klucza prywatnego" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Ścieżka do wewnętrznego certyfikatu CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" -msgstr "Ścieżka do wewnętrznego certyfikatu Klienta" +msgstr "Ścieżka do wewnętrznego certyfikatu klienta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Ścieżka do wewnętrznego klucza prywatnego" @@ -6255,24 +7043,32 @@ msgstr "Wstrzymano" msgid "Peak:" msgstr "Szczyt:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Peer" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Szczegóły peera" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Adres IP peera do przydzielenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" -msgstr "MAC adres peera" +msgstr "Adres MAC peera" #: modules/luci-base/htdocs/luci-static/resources/network.js:14 #: modules/luci-compat/luasrc/model/network.lua:32 msgid "Peer address is missing" msgstr "Brakuje adresu peera" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Nazwa urządzenia peera" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Peer wyłączony" @@ -6303,10 +7099,14 @@ msgstr "Wykonaj reset" msgid "Permission denied" msgstr "Odmowa zezwolenia" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Trwale trzymaj przy życiu" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Trwały interwał ponownego łączenia" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "Ustawienie trwałego trzymania przy życiu jest nieprawidłowe" @@ -6315,13 +7115,13 @@ msgstr "Ustawienie trwałego trzymania przy życiu jest nieprawidłowe" msgid "Phy Rate:" msgstr "Szybkość Phy:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Ustawienia sprzętowe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6334,11 +7134,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pktw." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Proszę wprowadzić swoją nazwę użytkownika i hasło." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Wybierz plik do przesłania." @@ -6346,56 +7146,74 @@ msgstr "Wybierz plik do przesłania." msgid "Policy" msgstr "Polityka" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "Polityka: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "Port nie jest częścią żadnej sieci" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Izolacja portów" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "Status portów" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Status portu:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Potencjalne odrzucenie: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Tryb zarządzania energią" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Przewidziane błedy CRC (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "Stan zasilania" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Preferuj LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Preferuj UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "Preferowana żywotność prefiksu." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "Preferowana technologia sieciowa" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Prefiks przekazany" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "Tłumik prefiksu" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Klucz współdzielony" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "Klucz współdzielony w użyciu" @@ -6420,15 +7238,19 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Zapobiega komunikacji między klientem a klientem" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"Uniemożliwia komunikowanie się jednego klienta bezprzewodowego z drugim. To " +"ustawienie dotyczy tylko pakietów bez żadnego tagu VLAN (pakietów " +"nieotagowanych)." + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Główny niewolnik" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "Główny VLAN ID" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6442,29 +7264,31 @@ msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" "Główny staje się aktywnym niewolnikiem za każdym razem, gdy wróci (zawsze 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Priorytet" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "Prywatny" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" -msgstr "Prywatne (Zapobiega komunikacji pomiędzy MAC VLANami)" +msgstr "Prywatne (zapobiegaj komunikacji między sieciami MAC VLAN)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Klucz prywatny" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "Klucz prywatny obecny" @@ -6482,8 +7306,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6495,7 +7319,7 @@ msgstr "Protokół" msgid "Provide NTP server" msgstr "Włącz serwer NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6503,7 +7327,7 @@ msgstr "" "Zapewnij serwer DHCPv6 na tym interfejsie i odpowiadaj na zapytania i " "żądania DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Utwórz nową sieć" @@ -6515,35 +7339,47 @@ msgstr "" "Zapewnij serwer NTP wybranemu interfejsowi lub, jeśli nie jest określony, " "wszystkim interfejsom" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Serwer proxy" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "Proxy ARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Klucz publiczny" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "Brak klucza publicznego" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "Klucz publiczny: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " "device, paste an OpenSSH compatible public key line or drag a .pub file into the input field." msgstr "" -"Klucze publiczne pozwalają na logowanie bez haseł SSH z wyższymi " -"zabezpieczeniami w porównaniu do zwykłych haseł. Aby przesłać nowy klucz do " -"urządzenia, wklej klucz publiczny zgodny z OpenSSH lub przeciągnij plik " -".pub do pola wejściowego." +"Klucze publiczne pozwalają na bezhasłowe logowanie przez SSH o wyższym " +"poziomie bezpieczeństwa w porównaniu do stosowania zwykłych haseł. Aby " +"przesłać nowy klucz do urządzenia, należy wkleić kompatybilny z OpenSSH " +"wiersz klucza publicznego lub przeciągnąć plik .pub do pola " +"wejściowego." #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 msgid "Public prefix routed to this device for distribution to clients." @@ -6564,59 +7400,83 @@ msgstr "Komórkowy QMI" msgid "Quality" msgstr "Jakość" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "Zapytaj o wszystkie dostępne źródłowe resolwery." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Interwał zapytania" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Interwał odpowiedzi na zapytanie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "Å»ywotność klucza R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" -msgstr "Uchwyt klucza R1" +msgstr "Posiadacz klucza R1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" -msgstr "Port Radius-Accounting" +msgstr "Port rozliczeniowy RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" -msgstr "Sekret Radius-Accounting" +msgstr "Sekret rozliczeniowy RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" -msgstr "Serwer Radius-Accounting" +msgstr "Serwer rozliczeniowy RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" -msgstr "Port Radius-Authentication" +msgstr "Port uwierzytelniania RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" -msgstr "Sekret Radius-Authentication" +msgstr "Sekret uwierzytelniania RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" -msgstr "Serwer Radius-Authentication" +msgstr "Serwer uwierzytelniania RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "Dynamiczne przypisywanie VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "Na STA VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "Schemat nazewnictwa mostów VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "Nazewnictwo VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "Interfejs tagowany VLAN RADIUS" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "Tryb RFC3947 NAT-T" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "Preautoryzacja RSN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "Próg RSSI dla połączeń" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Próg RTS/CTS" @@ -6629,10 +7489,18 @@ msgstr "RX" msgid "RX Rate" msgstr "Szybkość RX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "Szybkość: RX/TX" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"Pomiar zasobów radiowych - Wysyła sygnały nawigacyjne w celu ułatwienia " +"roamingu. Nie wszyskie klienty to obsługują." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6644,12 +7512,12 @@ msgstr "" "Surowe bajty kodowane szesnastkowo. Pozostaw puste, chyba że wymaga tego " "dostawca internetowy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" "Przejrzyj plik /etc/ethers, aby skonfigurować serwer DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Naprawdę zmienić protokół?" @@ -6657,11 +7525,11 @@ msgstr "Naprawdę zmienić protokół?" msgid "Realtime Graphs" msgstr "Wykresy rzeczywiste" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Termin reasocjacji" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Przypisz ochronę" @@ -6685,11 +7553,39 @@ msgstr "Uruchamia ponownie system operacyjny urządzenia" msgid "Receive" msgstr "Odebrane" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "Porzucenia odbioru" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "Błędy odbioru" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Odebrane dane" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "Odebrane bajty" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "Odebrany multicast" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "Odebrane pakiety" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Zalecane. Adresy IP interfejsu WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Limit czasu ponownego połączenia" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Połącz ponownie ten interfejs" @@ -6697,12 +7593,12 @@ msgstr "Połącz ponownie ten interfejs" msgid "Redirect to HTTPS" msgstr "Przekierowanie na HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "Przekierowanie na port lokalny %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "Przekierowanie do systemu lokalnego" @@ -6711,31 +7607,39 @@ msgstr "Przekierowanie do systemu lokalnego" msgid "References" msgstr "Referencje" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Odśwież kanały" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Odświeżanie" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "Stan rejestracji" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "Odrzucaj pakiet IPv4 z ICMP typu %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "Odrzucaj pakiet z ICMP typu %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "Odrzucaj pakiet z ICMPv6 typu %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "Odrzucaj pakiet z funkcją TCP reset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" @@ -6744,6 +7648,8 @@ msgstr "" "mniejsza lub równa określonej wartości" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Przekaźnik" @@ -6753,6 +7659,11 @@ msgstr "Przekaźnik" msgid "Relay Bridge" msgstr "Most przekaźnikowy" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"Przekazuj żądania DHCP gdzie indziej. OK: v4↔v4, v6↔v6. Nie OK: v4↔v6, v6↔v4." + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Przekaźnik pomiędzy sieciami" @@ -6762,6 +7673,14 @@ msgstr "Przekaźnik pomiędzy sieciami" msgid "Relay bridge" msgstr "Most przekaźnikowy" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "Przekazuj z" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "Przekazuj do adresu" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6771,6 +7690,7 @@ msgstr "Zdalny adres IPv4" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Zdalny adres IPv4 lub FQDN" @@ -6783,15 +7703,23 @@ msgstr "Zdalny adres IPv6" msgid "Remote IPv6 address or FQDN" msgstr "Zdalny adres IPv6 lub FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Usuń" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "Usuń z wyników adresy IPv4 i zwróć tylko adresy IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "Usuń z wyników adresy IPv6 i zwróć tylko adresy IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "Usuń powiązane ustawienia urządzenia z konfiguracji" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Zamień konfigurację Wi-Fi" @@ -6821,7 +7749,8 @@ msgstr "Wymagaj przychodzącej sumy kontrolnej (opcjonalnie)." msgid "Require incoming packets serialization (optional)." msgstr "Wymagaj serializacji pakietów przychodzących (opcjonalnie)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Wymagane" @@ -6838,7 +7767,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "Wymagane. Ścieżka do pliku konfiguracyjnego .yml dla tego interfejsu." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "Wymagane. Klucz publiczny peera WireGuard." @@ -6850,67 +7779,75 @@ msgstr "Wymagane. Podstawowy interfejs." msgid "Required. XFRM interface ID to be used for SA." msgstr "Wymagane. Identyfikator interfejsu XFRM, który ma być użyty dla SA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" +"Wymagane: odrzuca uwierzytelnianie, jeśli serwer RADIUS nie zapewnia " +"odpowiednich atrybutów sieci VLAN." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Wymaga hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Wymaga hostapd z obsługą EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Wymaga hostapd z obsługą EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Wymaga hostapd z obsługą OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Wymaga hostapd z obsługą SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Wymaga hostapd z obsługą WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Wymaga wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Wymaga wpa-supplicant z obsługą EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Wymaga wpa-supplicant z obsługą EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Wymaga wpa-supplicant z obsługą OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Wymaga wpa-supplicant z obsługą SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Wymaga wpa-supplicant z obsługą WEP" @@ -6919,7 +7856,7 @@ msgid "Reselection policy for primary slave" msgstr "Polityka reelekcji głównego niewolnika" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6934,20 +7871,24 @@ msgstr "Wyczyść liczniki" msgid "Reset to defaults" msgstr "Resetuj do ustawień domyślnych" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Pliki resolv i hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Plik resolv" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Lista wymuszonych domen na adres IP." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Nie znaleziono zasobu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Restartuj" @@ -6956,7 +7897,7 @@ msgstr "Restartuj" msgid "Restart Firewall" msgstr "Restartuj zaporę" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Restartuj interfejs radiowy" @@ -6968,7 +7909,7 @@ msgstr "Przywróć" msgid "Restore backup" msgstr "Przywróć kopię zapasową" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -6976,84 +7917,99 @@ msgstr "" "Zwróć odpowiedzi na zapytania DNS pasujące do podsieci, z której otrzymano " "zapytanie, jeśli dostępnych jest wiele adresów IP." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Pokaż/Ukryj hasło" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "Filtr ścieżki powrotnej" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Przywróć" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Przywróć zmiany" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "Żądanie powrotu nie powiodło się ze statusem %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Przywracanie konfiguracji…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "Rewizja" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "Przepisuj miejsce docelowe na %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "Przepisuj miejsce docelowe na %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Przepisuj miejsce docelowe na %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Przepisuj miejsce docelowe na %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "Przepisuj miejsce źródłowe na %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "Przepisuj miejsce źródłowe na %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" "Przepisuj miejsce źródłowe na %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" "Przepisuj miejsce źródłowe na %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "Przepisuj na adres urządzenia wyjściowego" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" +"Robust Security Network (RSN): Zezwalaj na preautoryzację roamingu dla sieci " +"WPA2-EAP (oraz anonsuj to w sygnałach nawigacyjnych WLAN). Działa tylko " +"wtedy, gdy określony interfejs sieciowy jest mostem. Skraca krytyczny " +"czasowo proces ponownej asocjacji." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Wytrzymałość" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -7071,19 +8027,19 @@ msgstr "Przygotowanie Roota" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Polityka Round-Robin (bilans-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" -msgstr "Trasuj dozwolone IPs" +msgstr "Trasuj dozwolone adresy IP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "Trasuj łańcuch działań \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Typ trasy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7104,6 +8060,10 @@ msgstr "Hasło routera" msgid "Routing" msgstr "Trasowanie" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Algorytm trasowania" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7118,31 +8078,30 @@ msgstr "" msgid "Rule" msgstr "Reguła" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "Działania reguł" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "Komentarz do reguły: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "Łańcuch kontenerów reguł \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "Dopasowania reguł" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Typ reguły" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:336 msgid "Run a filesystem check before mounting the device" -msgstr "" -"Sprawdź czy system plików nie zawiera błędów przed zamontowaniem urządzenia" +msgstr "Uruchom sprawdzanie systemu plików przed zamontowaniem urządzenia" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:336 msgid "Run filesystem check" @@ -7156,11 +8115,24 @@ msgstr "Błąd wykonania" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "Karta SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "Karty SIM" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7178,15 +8150,15 @@ msgstr "Port serwera SSH" msgid "SSH username" msgstr "Nazwa użytkownika SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "Klucze SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7203,7 +8175,7 @@ msgstr "Serwer SSTP" msgid "SWAP" msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7214,7 +8186,7 @@ msgid "Save" msgstr "Zapisz" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Zapisz i zastosuj" @@ -7231,7 +8203,7 @@ msgstr "Zapisz mtdblock" msgid "Save mtdblock contents" msgstr "Zapisz zawartość mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Skanuj" @@ -7240,17 +8212,22 @@ msgstr "Skanuj" msgid "Scheduled Tasks" msgstr "Zaplanowane zadania" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "Sekcja %s jest pusta." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Dodano sekcję" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Usunięto sekcję" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:332 msgid "See \"mount\" manpage for details" -msgstr "Aby poznać szczegóły przeczytaj stronę instrukcji \"mount\"" +msgstr "Przeczytaj podręcznik \"mount\", aby uzyskać szczegółowe informacje" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:283 msgid "" @@ -7262,9 +8239,9 @@ msgstr "" "formatu obrazu nie powiodło się. Używaj tylko wtedy, gdy masz pewność że " "firmware jest poprawny i przeznaczony do Twojego urządzenia!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Wybierz plik…" @@ -7274,7 +8251,7 @@ msgstr "" "Wybiera zasady mieszania transmisji, które mają być używane do wyboru " "urządzeń podrzędnych" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7282,7 +8259,7 @@ msgstr "" "Wysyłaj komunikaty RA rozgłaszające to urządzenie jako router IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "Wysyłaj przekierowania ICMP" @@ -7296,18 +8273,22 @@ msgid "" "Send LCP echo requests at the given interval in seconds, only effective in " "conjunction with failure threshold" msgstr "" -"Wysyłaj żądania echa LCP w określonym przedziale czasowym, efektywne tylko " -"wtedy gdy jest ustawiony próg błedu LCP" +"Wysyłaj żądania echa LCP w określonych odstępach czasu w sekundach, " +"skuteczne tylko w połączeniu z progiem błędu" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:24 msgid "Send the hostname of this device" msgstr "Wysyłaj nazwę hosta tego urządzenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Serwer" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Adres serwera" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Nazwa serwera" @@ -7332,17 +8313,21 @@ msgstr "Sesja wygasła" msgid "Set Static" msgstr "Ustaw statycznie" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "Ustaw alias nazwy hosta." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "Ustaw pole nagłówka %s na %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" "Ustaw interfejs jako zewnętrzny podrzędny NDP-Proxy. Domyślnie wyłączone." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7354,7 +8339,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "Ustaw ten sam adres MAC dla wszystkich urządzeń podrzędnych" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7365,7 +8350,7 @@ msgstr "" "abbr>. Gdy jest włączona, klienty będą wykonywać bezstanową autokonfigurację " "adresów IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7381,11 +8366,15 @@ msgstr "Ustaw na aktualnego aktywnego niewolnika (aktywny, 1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "Ustaw na pierwszego niewolnika dodanego do wiązania (wykonaj 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Ustawienia serwera DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Ustawienie tras dla sąsiadów IPv6 z proxy." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7393,33 +8382,39 @@ msgid "Setting PLMN failed" msgstr "Ustawienie PLMN nie powiodło się" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "Ustawienie trybu nie powiodło się" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "Ustawianie dozwolonej technologii sieciowej." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "Ustawianie preferowanej technologii sieciowej." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Ustawienia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "Ustawienie tras dla sąsiadów IPv6 z proxy." - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "Ilość poważnych błedów (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" +msgstr "" +"Ustawienia pomagające klientom bezprzewodowym w roamingu między wieloma " +"punktami dostępowymi: 802.11r, 802.11k i 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "Krótki GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Krótki wstęp" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Pokaż aktualną listę plików kopii zapasowej" @@ -7432,16 +8427,16 @@ msgstr "Pokaż puste łańcuchy" msgid "Show raw counters" msgstr "Pokaż surowe liczniki" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Wyłącz ten interfejs" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7449,15 +8444,15 @@ msgstr "Wyłącz ten interfejs" msgid "Signal" msgstr "Sygnał" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Sygnał/Szum" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Tłumienie sygnału (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Jakość sygnału" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Częstotliwość odświeżania sygnału" @@ -7465,12 +8460,12 @@ msgstr "Częstotliwość odświeżania sygnału" msgid "Signal:" msgstr "Sygnał:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Rozmiar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Rozmiar pamięci podręcznej zapytań DNS" @@ -7487,12 +8482,12 @@ msgstr "Pomiń" msgid "Skip from backup files that are equal to those in /rom" msgstr "Pomiń pliki kopii zapasowej, które są równe plikom w /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Pomiń do zawartości" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Pomiń do nawigacji" @@ -7510,14 +8505,10 @@ msgstr "Programowy VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "Wartości pewnych pól są niewłaściwe, nie mogę ich zachować!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Przepraszamy, ale żądany obiekt nie został znaleziony." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Przepraszamy, ale serwer napotkał nieoczekiwany błąd." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7528,8 +8519,8 @@ msgstr "" "być wgrany ręcznie. Sprawdź stronę wiki, aby uzyskać instrukcję dla danego " "urządzenia." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7544,7 +8535,7 @@ msgstr "Źródłowy adres IP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:47 msgctxt "nft ip6 saddr" msgid "Source IPv6" -msgstr "Źródłowy IPv6" +msgstr "Źródłowy adres IPv6" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 @@ -7556,7 +8547,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "Źródłowy port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7564,7 +8555,7 @@ msgstr "" "Specjalne opcje startowe PXE dla Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7573,7 +8564,7 @@ msgstr "" "protokół DHCPv6. Jeśli nie zostanie określona, zostanie ogłoszona domena " "wyszukiwania DNS urządzenia lokalnego." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7584,7 +8575,7 @@ msgstr "" "jako serwer DNS IPv6, chyba że opcja Lokalny serwer DNS IPv6 jest " "wyłączona." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7614,7 +8605,7 @@ msgstr "Określa adresy IP używane do monitorowania ARP" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "Określa częstotliwość monitorowania łącza MII w milisekundach" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "Określa wartość TOS do dopasowania w nagłówkach IP" @@ -7622,15 +8613,15 @@ msgstr "Określa wartość TOS do dopasowania w nagłówkach IP" msgid "Specifies the aggregation selection logic to use" msgstr "Określa logikę wyboru agregacji, która ma być używana" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "Określa docelową podsieć do dopasowania (notacja CIDR)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 msgid "Specifies the directory the device is attached to" -msgstr "Podaje katalog do którego jest podłączone urządzenie" +msgstr "Określa katalog, do którego podłączone jest urządzenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7640,7 +8631,7 @@ msgstr "" "Advertisement\">RA, na przykład w celu poinstruowania klientów, aby " "zażądali dalszych informacji za pośrednictwem stanowego DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" @@ -7649,7 +8640,7 @@ msgstr "" "dopasować znacznik 255 lub 0x0/0x1, aby dopasować dowolną parzystą wartość " "znacznika" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "Określa nazwę przychodzącego interfejsu logicznego" @@ -7684,7 +8675,7 @@ msgid "" msgstr "" "Określa maksymalną liczbę sekund, po których uznaje się, że hosty są martwe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7706,7 +8697,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "Określa tryb, który ma być używany dla tego interfejsu wiązania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7738,8 +8729,8 @@ msgid "" "Specifies the number of peer notifications (gratuitous ARPs and unsolicited " "IPv6 Neighbor Advertisements) to be issued after a failover event" msgstr "" -"Określa liczbę powiadomień równorzędnych (nieodpłatne ARP i niechciane " -"reklamy sąsiedzkie IPv6), które mają być wysyłane po zdarzeniu przełączenia " +"Określa liczbę powiadomień równorzędnych (nieodpłatne ARP i niezamówione " +"ogłaszanie sąsiadów IPv6), które mają być wysyłane po zdarzeniu przełączenia " "awaryjnego" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:286 @@ -7750,15 +8741,15 @@ msgstr "" "Określa liczbę sekund między instancjami, w których sterownik łączenia " "wysyła pakiety uczenia się do każdego przełącznika równorzędnego niewolnika" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "Określa kolejność reguł IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "Określa nazwę wychodzącego interfejsu logicznego" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7768,7 +8759,7 @@ msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:375 msgid "Specifies the quantity of ARP IP targets that must be reachable" -msgstr "Określa liczbę docelowych adresów IP ARP, które muszą być osiągalne" +msgstr "Określa liczbę celów IP ARP, które muszą być osiągalne" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:270 msgid "" @@ -7787,19 +8778,19 @@ msgstr "" "wystąpi awaria aktywnego urządzenia podrzędnego lub odtwarzanie podstawowego " "urządzenia podrzędnego" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "Określa metrykę trasy do użycia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "Określa typ trasy do utworzenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "Określa akcję trasowania celu reguły" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "Określa podsieć źródłową do dopasowania (notacja CIDR)" @@ -7823,7 +8814,7 @@ msgstr "" "Określa czas w milisekundach oczekiwania przed włączeniem urządzenia " "podrzędnego po wykryciu odzyskiwania łącza" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7946,15 +8937,23 @@ msgid "" msgstr "" "Określ MTU (maksymalną jednostkę transmisji) inną niż domyślna (1280 bajtów)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Określ tajny klucz szyfrowania." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "Szybkość: %d Mibit/s, Dupleks: %s" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "ADSL bez rozgałęźnika (G.992.2) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "Limit czasu pamięci podręcznej sąsiada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Uruchom" @@ -7967,16 +8966,16 @@ msgstr "Uruchom WPS" msgid "Start priority" msgstr "Priorytet uruchamiania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Rozpocznij odświeżanie" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Zatwierdzanie konfiguracji…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Rozpoczynanie skanowania..." @@ -7985,6 +8984,10 @@ msgstr "Rozpoczynanie skanowania..." msgid "Startup" msgstr "Autostart" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Stan" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Statyczne trasy IPv4" @@ -7998,7 +9001,7 @@ msgstr "Statyczne trasy IPv6" msgid "Static Lease" msgstr "Dzierżawa statyczna" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Dzierżawy statyczne" @@ -8008,7 +9011,7 @@ msgstr "Dzierżawy statyczne" msgid "Static address" msgstr "Stały adres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -8019,18 +9022,18 @@ msgstr "" "niedynamicznych konfiguracji interfejsu, gdzie obsługiwane są tylko hosty z " "odpowiednim dzierżawami." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Granica bezczynności stacji" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Zatrzymaj" @@ -8039,8 +9042,8 @@ msgstr "Zatrzymaj" msgid "Stop WPS" msgstr "Zatrzymaj WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Zatrzymaj odświeżanie" @@ -8048,11 +9051,11 @@ msgstr "Zatrzymaj odświeżanie" msgid "Storage" msgstr "Wykorzystanie pamięci masowej" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "Filtrowanie ścisłe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Zachowaj kolejność" @@ -8061,15 +9064,15 @@ msgid "Strong" msgstr "Silne" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Prześlij" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Pomiń rejestrowanie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "Pomiń rejestrowanie rutynowych operacji dla protokołu DHCP." @@ -8101,7 +9104,7 @@ msgstr "Przełącznik VLAN" msgid "Switch port" msgstr "Port przełącznika" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Protokół przełącznika" @@ -8111,7 +9114,7 @@ msgstr "Protokół przełącznika" msgid "Switch to CIDR list notation" msgstr "Przejdź do notacji listy CIDR" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Dowiązanie symboliczne" @@ -8123,8 +9126,16 @@ msgstr "Synchronizuj z serwerem NTP" msgid "Sync with browser" msgstr "Synchronizuj z przeglądarką" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Składnia: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Składnia: _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -8149,9 +9160,9 @@ msgstr "Właściwości systemu" msgid "System log buffer size" msgstr "Rozmiar bufora dziennika systemowego" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "System działa w trybie odzyskiwania (initramfs)." @@ -8180,7 +9191,7 @@ msgstr "Źródłowy port TCP" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Katalog główny serwera TFTP" @@ -8193,26 +9204,37 @@ msgstr "TX" msgid "TX Rate" msgstr "Szybkość TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "Długość kolejki TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tablica" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "Tag" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Tagowane" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Cel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "Platforma docelowa" @@ -8228,7 +9250,7 @@ msgstr "Miejsce tymczasowe" msgid "Terminate" msgstr "Zakończ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8238,7 +9260,7 @@ msgstr "" "opublikowana w komunikatach RA. Minimalna wartość to 1280 bajtów." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." @@ -8246,7 +9268,7 @@ msgstr "" "Flaga Zarządzana konfiguracja adresów (M) wskazuje, że adresy IPv6 " "są dostępne poprzez DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -8254,7 +9276,7 @@ msgstr "" "Flaga Agent domowy Mobile IPv6 (H) wskazuje, że urządzenie działa " "również jako Agent domowy Mobile IPv6 na tym łączu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8274,7 +9296,11 @@ msgstr "" "Pakiet qrencode jest wymagany do wygenerowania obrazu kodu QR " "konfiguracji." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "DHCPv6-DUID (unikatowy identyfikator DHCP) tego hosta." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8290,18 +9316,26 @@ msgstr "" "Konfiguracja aktualizacji punktu końcowego HE.net uległa zmianie, musisz " "teraz użyć zwykłej nazwy użytkownika zamiast ID użytkownika!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "Adres IP %h jest już używany przez inną statyczną dzierżawę" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "Adres IP jest poza zakresem adresów puli DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "Adres IP serwera startowego" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" +"Adres IP, który ma być używany dla tego hosta, lub ignoruj, aby " +"zignorować wszelkie żądania DHCP z tego hosta." + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "Adres IPv4 lub w pełni kwalifikowana nazwa domeny zdalnego końca." @@ -8309,6 +9343,7 @@ msgstr "Adres IPv4 lub w pełni kwalifikowana nazwa domeny zdalnego końca." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -8325,6 +9360,14 @@ msgid "" msgstr "" "Adres IPv6 lub w pełni kwalifikowana nazwa domeny końca tunelu zdalnego." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" +"Identyfikator interfejsu IPv6 (sufiks adresu) jako liczba szesnastkowa " +"(maks. 8 znaków)." + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8336,7 +9379,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "Dioda LED miga ze skonfigurowaną częstotliwością włączania/wyłączania" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "Dioda LED miga, symulując rzeczywiste bicie serca." @@ -8355,7 +9398,7 @@ msgstr "Dioda LED jest zawsze domyślnie wyłączona." msgid "The LED is always in default state on." msgstr "Dioda LED jest zawsze domyślnie włączona." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" @@ -8363,15 +9406,19 @@ msgstr "" "Adres MAC %h jest już używany przez inną dzierżawę statyczną w tej samej " "puli DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "MTU nie może przekroczyć %d bajtów MTU urządzenia nadrzędnego" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "Identyfikator VLAN musi być unikalny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "Algorytm, który jest używany do wykrywania tras w sieci mesh" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8384,7 +9431,7 @@ msgid "The configuration file could not be loaded due to the following error:" msgstr "" "Plik konfiguracyjny nie mógł zostać załadowany z powodu następującego błędu:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8392,7 +9439,7 @@ msgstr "" "Podczas łączenia z ukrytą siecią bezprzewodową należy ręcznie określić " "prawidłowy identyfikator SSID" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8419,19 +9466,19 @@ msgstr "" "Plik urządzenia - pamięci lub partycji (np. /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "Nazwa urządzenia \"%s\" jest już zajęta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" "Aby LuCI działał prawidłowo, należy zmienić istniejącą konfigurację sieci." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8453,7 +9500,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Następujące zasady są obecnie aktywne w tym systemie." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" "Częstotliwość jest wprost proporcjonalna do 1-minutowego średniego " @@ -8463,19 +9510,19 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "Adres bramki nie może być lokalnym adresem IP" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" "Wygenerowaną konfigurację można zaimportować do aplikacji klienckiej " "WireGuard w celu nawiązania połączenia z tym urządzeniem." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "Podany klucz publiczny SSH został już dodany." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8483,15 +9530,36 @@ msgstr "" "Podany klucz publiczny SSH jest nieprawidłowy. Podaj odpowiedni publiczny " "RSA lub klucze ECDSA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "Adresy sprzętowe tego wpisu/hosta, oddzielone spacjami." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"Ustawienie kary przeskoku pozwala modyfikować preferencje batman-adv dla " +"tras z wieloma przeskokami w porównaniu z trasami krótkimi. Wartość jest " +"stosowana do TQ każdego przekazanego OGM, tym samym propagując koszt " +"dodatkowego przeskoku (pakiet musi zostać odebrany i ponownie przesłany, co " +"kosztuje czas emisji)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "Nazwa hosta serwera startowego" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "Nie można znaleźć interfejsu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Nazwa interfejsu jest już w użyciu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Nazwa interfejsu jest zbyt długa" @@ -8515,6 +9583,7 @@ msgstr "Lokalny adres IPv4" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "Lokalny adres IPv4, na którym tworzony jest tunel (opcjonalnie)." @@ -8529,7 +9598,7 @@ msgstr "Lokalna maska dla IPv4" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "Lokalny adres IPv6, na którym tworzony jest tunel (opcjonalnie)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8544,7 +9613,7 @@ msgstr "" "\"opóźnienia opuszczenia\" sieci. Zmniejszona wartość powoduje skrócenie " "czasu wykrywania utraty ostatniego członka grupy" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8557,7 +9626,7 @@ msgstr "" "jest mniej gwałtowny, ponieważ odpowiedzi hostów są rozłożone w większym " "odstępie czasu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8566,7 +9635,7 @@ msgstr "" "title=\"Router Advertisement\">RA. Maksymalna wartość to 255 " "przeskoków." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." @@ -8574,7 +9643,7 @@ msgstr "" "Dostęp sieciowy do tego urządzenia może zostać przerwany przez zmianę " "ustawień interfejsu \"%h\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Nazwa sieci jest już w użyciu" @@ -8594,7 +9663,7 @@ msgstr "" "służy do połączenia z inną większą siecią, taką jak Internet i innymi " "portami sieci lokalnej." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " @@ -8604,7 +9673,7 @@ msgstr "" "Zazwyczaj jest to statyczny publiczny adres IP, statyczna nazwa hosta lub " "domena DDNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" "Interwał odpowiedzi na zapytanie musi być mniejszy niż wartość interwału " @@ -8619,7 +9688,7 @@ msgstr "Polecenie restartu nie powiodło się z kodem %d" msgid "The restore command failed with code %d" msgstr "Polecenie przywracania nie powiodło się z kodem %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8629,14 +9698,14 @@ msgstr "" "sieci. Jeśli oczekuje się, że sieć będzie stratna, wartość niezawodności " "może zostać zwiększona. IGMP jest odporny na straty pakietów (Robustness-1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" "Cel reguły to skok do innej reguły określonej przez jej wartość priorytetu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8647,11 +9716,11 @@ msgstr "" "rt_tables. Ważne są również specjalne aliasy: lokalny (255), główny (254) i " "domyślny (253)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "Wybrany tryb %s jest niekompatybilny z szyfrowaniem %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "Zgłoszony token bezpieczeństwa jest nieważny lub wygasł!" @@ -8689,6 +9758,19 @@ msgstr "Hasło systemowe zostało pomyślnie zmienione." msgid "The sysupgrade command failed with code %d" msgstr "Polecenie sysupgrade nie powiodło się z kodem %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" +"Konstrukcja tagu filtruje używane dyrektywy hosta; można podać więcej niż " +"jeden tag, w takim przypadku żądanie musi pasować do wszystkich. Dyrektywy " +"tagowane są używane zamiast nieotagowanych. Pamiętaj, że wciąż trzeba podać " +"jedną z wartości: MAC, DUID lub nazwę hosta (może to być symbol " +"wieloznaczny)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8715,12 +9797,20 @@ msgstr "" "Przesłany plik obrazu nie zawiera obsługiwanego formatu. Upewnij się, że " "wybrałeś odpowiedni format obrazu dla danej platformy." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "Wartość jest zastępowana przez konfigurację. Oryginał: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "Wartość jest zastępowana przez konfigurację." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" +"Wartość określa interwał (w milisekundach), w którym batman-adv zalewa sieć " +"informacjami o protokole." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8728,41 +9818,42 @@ msgstr "" "W systemie są obecne starsze reguły iptables. Mieszanie reguł iptables i " "nftables jest odradzane i może prowadzić do niekompletnego filtrowania ruchu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Nie ma aktywnych dzierżaw" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Nie ma żadnych zmian do zastosowania" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " "protect the web interface." msgstr "" -"Na tym routerze nie ma ustawionego hasła. Proszę skonfigurować hasło roota, " -"aby chronić interfejs www." +"Na tym routerze nie ma ustawionego hasła. Skonfiguruj hasło roota, aby " +"chronić interfejs WWW." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 msgid "This IPv4 address of the relay" msgstr "Ten adres IPv4 przekaźnika" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Ten typ uwierzytelniania nie ma zastosowania do wybranej metody EAP." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Nie wygląda to na ważny plik PEM" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8781,6 +9872,24 @@ msgstr "" "Jest to albo \"Update Key\" skonfigurowany dla tunelu, albo hasło do konta, " "jeśli nie skonfigurowano żadnego klucza aktualizacyjnego" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Jest to urządzenie batman-adv, do którego chcesz podłączyć urządzenie " +"fizyczne z listy powyżej. Jeśli ta lista jest pusta, należy ją najpierw " +"utworzyć. Jeśli chcesz kierować ruch sieciowy przez urządzenie sieci " +"przewodowej, wybierz je z powyższego selektora urządzeń. Jeśli chcesz " +"przypisać interfejs batman-adv do sieci Wi-Fi mesh, nie wybieraj urządzenia " +"w selektorze urządzeń, ale przejdź do ustawień sieci bezprzewodowej i " +"wybierz stamtąd ten interfejs jako sieć." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8798,7 +9907,7 @@ msgstr "" "kończący się z ...:2/64" # w tłumaczeniu pojawiła się spacja po DHCP co powoduje niepoprawne wyświetlanie się strony z lang PL -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "To jest jedyny serwer DHCP w sieci lokalnej." @@ -8832,8 +9941,8 @@ msgstr "" "Poniższa lista przedstawia aktualnie uruchomione procesy systemowe i ich " "status." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8849,33 +9958,41 @@ msgstr "Ta sekcja nie zawiera jeszcze żadnych wartości" msgid "Time Synchronization" msgstr "Synchronizacja czasu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Ogłoszenie czasu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "Czas w milisekundach" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "Czas w sekundach przeznaczony na słuchanie i uczenie się" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Odstęp czasowy dla wznowienia kluczy GTK" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Strefa czasowa" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "Przekroczono limit czasu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "Limit czasu w sekundach" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" "Limit czasu w sekundach dla poznanych adresów MAC w przekazującej bazie " "danych" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "Limit czasu w sekundach do aktualizacji topologii po utracie łącza" @@ -8883,7 +10000,7 @@ msgstr "Limit czasu w sekundach do aktualizacji topologii po utracie łącza" msgid "Timezone" msgstr "Strefa czasowa" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the importu konfiguracji." -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Zaloguj się…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8908,7 +10021,7 @@ msgstr "" "utworzoną kopię zapasową. Aby przywrócić ustawienia domyślne, wciśnij " "\"Wykonaj reset\" (możliwe tylko w przypadku obrazu squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Ton" @@ -8916,12 +10029,16 @@ msgstr "Ton" msgid "Total Available" msgstr "Łącznie dostępna" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Śledzenie trasy" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "Kod obszaru śledzenia" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8933,11 +10050,11 @@ msgstr "Ruch" msgid "Traffic Class" msgstr "Klasa ruchu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "Łańcuch filtra ruchu \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "Ruch dopasowany przez regułę: %.1000mPakietów, %.1024mBajtów" @@ -8954,6 +10071,26 @@ msgstr "Nadawanie" msgid "Transmit Hash Policy" msgstr "Zasady przesyłania skrótów" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "Porzucenia przesyłania" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "Błędy przesyłania" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Przesłane dane" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "Przesłane bajty" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "Przesłane pakiety" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8992,7 +10129,7 @@ msgstr "Interfejs tunelu" msgid "Tunnel Link" msgstr "Połączenie tunelu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Tunel urządzenia" @@ -9001,13 +10138,13 @@ msgid "Tx-Power" msgstr "Moc nadawania" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Typ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Typ usługi" @@ -9056,7 +10193,7 @@ msgstr "Nie można ustalić zewnętrznego adresu IP" msgid "Unable to determine upstream interface" msgstr "Nie można określić interfejsu źródłowego" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Nie można wysłać" @@ -9107,19 +10244,31 @@ msgstr "Nie można zrestartować zapory sieciowej: %s" msgid "Unable to save contents: %s" msgstr "Nie można zapisać zawartości: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Czas niedostępnośći (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "Nie można ustawić listy dozwolonych trybów." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "Nie można ustawić preferowanego trybu." + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "Nie można zweryfikować kodu PIN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Dekonfiguruj" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Nieprzewidziany format danych odpowiedzi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -9137,7 +10286,7 @@ msgstr "" msgid "Unknown" msgstr "Nieznany" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Nieznana i nieobsługiwana metoda połączenia." @@ -9161,11 +10310,11 @@ msgstr "Niezarządzany" msgid "Unmount" msgstr "Odmontuj" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Klucz bez nazwy" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Niezapisane zmiany" @@ -9179,15 +10328,25 @@ msgid "Unsupported MAP type" msgstr "Nieobsługiwany typ MAP" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Nieobsługiwany modem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Nieobsługiwany protokół" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Nieobsługiwany typ protokołu." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Nieotagowane" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "Peer bez tytułu" @@ -9199,7 +10358,7 @@ msgstr "Góra" msgid "Up Delay" msgstr "Opóźnienie w górę" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Wysyłanie" @@ -9214,25 +10373,29 @@ msgstr "Prześlij obraz zgodny z sysupgrade, aby zastąpić obecny firmware." msgid "Upload archive..." msgstr "Załaduj archiwum..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Prześlij plik" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Prześlij plik…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "Przesyłanie zostało anulowane" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Przesyłanie nie powiodło się: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Przesyłanie pliku…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9242,7 +10405,7 @@ msgstr "" "nazwę w postaci wifinet# i sieć zostanie ponownie uruchomiona w " "celu zastosowania zmienionej konfiguracji." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -9250,7 +10413,7 @@ msgstr "" "Po naciśnięciu \"Kontynuuj\", konfiguracja mostów zostanie zaktualizowana, a " "sieć zostanie zrestartowana, aby zastosować zaktualizowaną konfigurację." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -9259,20 +10422,24 @@ msgstr "" "a sieć zostanie ponownie uruchomiona w celu zastosowania zaktualizowanej " "konfiguracji." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "Odpytywania źródłowych resolwerów będą odbywać się w kolejności pliku resolv." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Czas pracy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Użyj /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Użyj DHCP" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Użyj dedykowanych serwerów DHCP" @@ -9281,13 +10448,18 @@ msgstr "Użyj dedykowanych serwerów DHCP" msgid "Use DHCP gateway" msgstr "Użyj bramy DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Użyj DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Użyj serwerów DNS rozgłaszanych przez peera" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Użyj kodów kraju ISO/IEC 3166 alpha2." @@ -9335,22 +10507,25 @@ msgstr "Użyj jako systemu plików root (/)" msgid "Use broadcast flag" msgstr "Użyj flagi rozgłaszania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Skorzystaj z wbudowanego zarządzania protokołem IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Użyj własnych serwerów DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Użyj domyślnej bramy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Użyj metryki bramy" @@ -9369,7 +10544,7 @@ msgstr "" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 msgid "Use routing table" -msgstr "Użyj tabeli trasowania" +msgstr "Użyj tablicy trasowania" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:63 msgctxt "nft nat flag persistent" @@ -9377,15 +10552,15 @@ msgid "Use same source and destination for each connection" msgstr "" "Użyj tego samego miejsca źródłowego i docelowego dla każdego połączenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Użyj certyfikatów systemowych" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "Użyj certyfikatów systemowych dla tunelu wewnętrznego" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9394,11 +10569,11 @@ msgid "" "standard host-specific lease time, e.g. 12h, 3d or infinite." msgstr "" "Użyj przycisku Dodaj, aby dodać nowy wpis dzierżawy. Adres MAC identyfikuje hosta, Adres IPv4 określa, którego stałego adresu " -"użyć, natomiast Nazwa hosta jest przypisana jako symboliczna nazwa " -"do określonego hosta. Opcjonalne Czas trwania dzierżawy może być " -"użyty do ustawienia niestandardowego, specyficznego dla hosta czasu " -"dzierżawy, np. 12h, 3d lub infinite (nieskończony)." +"em> identyfikuje hosta, Adres IPv4 określa stały adres do użycia, " +"natomiast Nazwa hosta jest przypisana jako symboliczna nazwa do " +"określonego hosta. Opcjonalne Czas dzierżawy może być użyty do " +"ustawienia niestandardowego, specyficznego dla hosta czasu dzierżawy, np. " +"12h, 3d lub infinite." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:324 msgid "Use upper layer protocol information (layer3+4)" @@ -9417,71 +10592,73 @@ msgstr "" msgid "Used" msgstr "W użyciu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Użyte gniazdo klucza" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -"Używany do dwóch celów: RADIUS NAS ID i 802.11r R0KH-ID. Nie wymagany w " -"przypadku WPA2-PSK." +"Używany do dwóch różnych celów: RADIUS NAS-ID i 802.11r R0KH-ID. Nie jest " +"potrzebny w przypadku zwykłego WPA(2)-PSK." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Grupa użytkownika" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Certyfikat użytkownika (zakodowany PEM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "Identyfikator użytkownika" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Klucz użytkownika (zakodowany PEM)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Nazwa użytkownika" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "Wykorzystaj tabelę przepływów %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (agregator wirtualnych portów Ethernet)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "VLAN ID" @@ -9501,24 +10678,27 @@ msgstr "Adres lokalny VPN" msgid "VPN Local port" msgstr "Port lokalny VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "Protokół VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Serwer VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "Skrót SHA256 certyfikatu serwera VPN" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Port serwera VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "Hash SHA1 certyfikatu serwera VPN" @@ -9527,6 +10707,10 @@ msgstr "Hash SHA1 certyfikatu serwera VPN" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (i inne) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9540,7 +10724,7 @@ msgstr "Identyfikator sieci VXLAN" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9548,8 +10732,8 @@ msgstr "" "Wymagane wsparcie dla DNSSEC; sprawdza niepodpisane odpowiedzi, czy pochodzą " "z niepodpisanych domen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9577,7 +10761,7 @@ msgstr "Producent" msgid "Vendor Class to send when requesting DHCP" msgstr "Klasa producenta do wysłania podczas żądania DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" "Sprawdź, czy odpowiedzi z niepodpisanych domen naprawdę pochodzą z " @@ -9587,12 +10771,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Weryfikowanie przesłanego pliku obrazu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Bardzo wysoki" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Wirtualny Ethernet" @@ -9600,34 +10784,46 @@ msgstr "Wirtualny Ethernet" msgid "Virtual dynamic interface" msgstr "Wirtualny interfejs dynamiczny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "Otwarty system WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Współdzielony klucz WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Hasło WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "Roaming WLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Tryb WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "Tryb uśpienia WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "Poprawki trybu uśpienia WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Hasło WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9658,7 +10854,19 @@ msgstr "" msgid "Weak" msgstr "Słabe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Ważność" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" +"Gdy host pasuje do wpisu, ustawiany jest specjalny tag known. Użyj " +"tagu known, aby dopasować wszystkie znane hosty." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." @@ -9667,7 +10875,25 @@ msgstr "" "wyższą wartością preferencji są brane pod uwagę w pierwszej kolejności " "podczas alokacji podsieci." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Po włączeniu kodowania sieciowego zwiększa się przepustowość sieci Wi-Fi " +"poprzez łączenie wielu ramek w jedną ramkę, co zmniejsza potrzebną emisję." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Po włączeniu tej funkcji rozproszona tablica ARP tworzy pamięć podręczną ARP " +"obejmującą całą sieć, dzięki czemu klienty spoza sieci mogą otrzymywać " +"odpowiedzi ARP znacznie pewniej i bez większych opóźnień." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" @@ -9675,17 +10901,44 @@ msgstr "" "Po włączeniu tej funkcji brama jest włączona, nawet jeśli nie pasuje do " "żadnego prefiksu interfejsu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Gdy jest włączone, nowe wpisy w tablicy ARP są dodawane z otrzymanych " +"nieodpłatnych żądań lub odpowiedzi APR, w przeciwnym razie tylko istniejące " +"wpisy są aktualizowane, ale nie są poznawane nowe hosty." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Po odwróceniu dioda LED świeci się w sposób ciągły i migocze, zamiast " +"domyślnie być wyłączoną i migotać przy aktywności systemu." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Podczas korzystania z sieci mesh przez wiele interfejsów Wi-Fi na węzeł " +"batman-adv jest w stanie zoptymalizować przepływ ruchu w celu uzyskania " +"maksymalnej wydajności." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -"W przypadku korzystania z PSK, PMK może być generowany automatycznie. Po " -"włączeniu, poniższe opcje klawiszy R0/R1 nie są stosowane. Wyłącz to, aby " -"użyć opcji klawiszy R0 i R1." +"Podczas korzystania z PSK PMK może być generowany automatycznie. Po " +"włączeniu poniższe opcje kluczy R0/R1 nie są stosowane. Wyłącz tę opcję, aby " +"korzystać z opcji kluczy R0 i R1." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9693,7 +10946,7 @@ msgstr "" "Gdy funkcja QoS w trybie Wi-Fi Multimedia (WMM) jest wyłączona, klienty mogą " "być ograniczone do szybkości 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9702,16 +10955,25 @@ msgstr "" "wykorzystania emsji może zostać znacznie zmniejszona." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Szerokość" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Status WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "Peer WireGuard jest wyłączony" @@ -9727,21 +10989,21 @@ msgid "Wireless Adapter" msgstr "Adapter bezprzewodowy" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Sieć bezprzewodowa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Przegląd stanu sieci bezprzewodowych" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Zabezpieczenia sieci bezprzewodowych" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Migracja konfiguracji bezprzewodowej" @@ -9757,15 +11019,15 @@ msgstr "Sieć bezprzewodowa jest wyłączona" msgid "Wireless is not associated" msgstr "Sieć bezprzewodowa nie jest podłączona" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Sieć bezprzewodowa jest wyłączona" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Sieć bezprzewodowa jest włączona" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Zapisz otrzymane zapytania DNS do dziennika systemowego." @@ -9777,7 +11039,7 @@ msgstr "Zapisz dziennik systemowy do pliku" msgid "XOR policy (balance-xor, 2)" msgstr "Zasady XOR (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9785,7 +11047,7 @@ msgstr "Tak" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:305 msgid "Yes (none, 0)" -msgstr "Tak (Nie 0)" +msgstr "Tak (brak, 0)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:177 msgid "" @@ -9806,8 +11068,22 @@ msgstr "" "Jeśli wyłączysz podstawowe skrypty typu \"network\", urządzenie może stać " "się nieosiągalne!
    " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Możesz dodać wiele rekordów dla tego samego celu." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Możesz dodać wiele rekordów dla tej samej domeny." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" +"Możesz dodać wiele unikalnych „Przekazuj do” do tego samego „Nasłuchiwanego " +"adresu”." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9827,7 +11103,7 @@ msgstr "" msgid "" "You must select at least one ARP IP target if ARP monitoring is selected!" msgstr "" -"Musisz wybrać co najmniej jeden cel ARP IP, jeśli wybrano monitorowanie ARP!" +"Musisz wybrać co najmniej jeden cel IP ARP, jeśli wybrano monitorowanie ARP!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:213 msgid "ZRam Compression Algorithm" @@ -9841,34 +11117,56 @@ msgstr "Ustawienia ZRam" msgid "ZRam Size" msgstr "Rozmiar ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Uwaga: chociaż _http " +"jest możliwe, żadna przeglądarka nie obsługuje rekordów SRV.)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "dowolny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" -msgstr "automatyczny" +msgstr "automatyczne" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automatyczny (wyłączony)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automatyczny (włączony)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "zmostkowany" @@ -9925,25 +11223,30 @@ msgctxt "nft unit" msgid "day" msgstr "dzień" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "wyłącz" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "wyłączony" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "domyślna sterownika" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "domyślny sterownika (%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "np.: --proxy 10.10.10.10" @@ -9952,14 +11255,23 @@ msgstr "np.: --proxy 10.10.10.10" msgid "e.g: dump" msgstr "np: dump" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "włączony" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "co %ds" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "nieważny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "wymuszony" @@ -9969,22 +11281,22 @@ msgstr "wymuszony" msgid "forward" msgstr "przekazuj" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "pełny-duplex" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "pół-duplex" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "wartość zakodowana szesnastkowo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "ukryty" @@ -9993,9 +11305,9 @@ msgctxt "nft unit" msgid "hour" msgstr "godzina" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "tryb hybrydowy" @@ -10003,6 +11315,10 @@ msgstr "tryb hybrydowy" msgid "ignore" msgstr "ignoruj" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "infinite (dzierżawa nie wygasa)" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -10017,11 +11333,19 @@ msgstr "klucza od 8 do 63 znaków" msgid "key with either 5 or 13 characters" msgstr "klucz z 5 lub 13 znakami" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "known (znany)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "known-othernet (znany w innej podsieci)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "konfiguracja zarządzana (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "średnie bezpieczeństwo" @@ -10030,11 +11354,11 @@ msgctxt "nft unit" msgid "minute" msgstr "minuta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minuty" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "agent domowy mobile (H)" @@ -10047,18 +11371,26 @@ msgid "no" msgstr "nie" # skorzystałem z niemieckiego tłumaczenia -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" -msgstr "niepowiązane" +msgstr "bez łącza" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "bez zastępowania" #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "niepustą wartość" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "brak" @@ -10069,20 +11401,20 @@ msgid "not present" msgstr "nieobecny" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "wyłączone" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "na dostępnym prefiksie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "sieć otwarta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "inna konfiguracja (O)" @@ -10091,6 +11423,10 @@ msgstr "inna konfiguracja (O)" msgid "output" msgstr "wyjście" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "ponad dzień temu" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -10108,23 +11444,34 @@ msgstr "dodatnia wartość całkowita" msgid "random" msgstr "losowy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "generowany losowo" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" +"zmniejsza narzut poprzez zbieranie i agregowanie komunikatów inicjatora w " +"jednym pakiecie, a nie w wielu małych" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "tryb przekaźnika" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "kierowane" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "sek." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "tryb serwera" @@ -10132,7 +11479,7 @@ msgstr "tryb serwera" msgid "sstpc Log-level" msgstr "Poziom dziennika sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "wysokie bezpieczeństwo" @@ -10140,9 +11487,9 @@ msgstr "wysokie bezpieczeństwo" msgid "tagged" msgstr "otagowane" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" -msgstr "jednostki czasu (TUs / 1.024 ms) [1000-65535]" +msgstr "jednostki czasu (JC / 1,024 ms) [1000-65535]" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 msgid "" @@ -10154,25 +11501,27 @@ msgstr "" "Protocol\">HTTP
    lub HTTPS." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "unikalna wartość" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "nieznane" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "wersja nieznana" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "nielimitowane" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -10194,21 +11543,21 @@ msgid "untagged" msgstr "nieotagowane" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "prawidłowy adres IP" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 msgid "valid IP address or prefix" -msgstr "prawidłowy adres IP lub prefix" +msgstr "prawidłowy adres IP lub prefiks" #: modules/luci-base/htdocs/luci-static/resources/validation.js:294 msgid "valid IPv4 CIDR" msgstr "prawidłowy CIDR IPv4" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "prawidłowy adres IPv4" @@ -10237,7 +11586,7 @@ msgid "valid IPv6 CIDR" msgstr "prawidłowy protokół IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "prawidłowy adres IPv6" @@ -10274,8 +11623,8 @@ msgstr "prawidłowy identyfikator UCI, nazwa hosta lub zakres adresów IP" msgid "valid address:port" msgstr "prawidłowy adres:port" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "prawidłowa data (RRRR-MM-DD)" @@ -10315,14 +11664,25 @@ msgstr "prawidłowa wartość całkowita" msgid "valid multicast MAC address" msgstr "prawidłowy adres MAC multicast" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"prawidłowa nazwa urządzenia sieciowego od 1 do 15 znaków, niezawierająca " +"„:”, „/”, „%” ani spacji" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "prawidłowa nazwa urządzenia sieciowego, nie „.” lub „..”" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "prawidłowa sieć w zapisie adresu/maski sieci" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" -msgstr "" -"prawidłowa wartość numeru telefonu (0-9, \"*\", \"#\", \"!\" lub \".\")" +msgstr "prawidłowa wartość numeru telefonu (0-9, „*”, „#”, „!” lub „.”)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:346 #: modules/luci-base/htdocs/luci-static/resources/validation.js:349 @@ -10330,43 +11690,43 @@ msgid "valid port or port range (port1-port2)" msgstr "prawidłowy port lub zakres portów (PORT1-PORT2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "prawidłowa wartość portu" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "prawidłowy czas (GG:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "wartość pomiędzy %d i %d znaków" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "wartość pomiędzy %f a %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "wartość większą lub równą %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "wartość mniejszą lub równą %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "wartość z %d znakami" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "o wartości co najmniej %d znaków" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "o wartości nie większej niż %d znaków" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "słabe bezpieczeństwo" diff --git a/package/luci/modules/luci-base/po/pt/base.po b/package/luci/modules/luci-base/po/pt/base.po index e39e76e122..b6639c9e72 100644 --- a/package/luci/modules/luci-base/po/pt/base.po +++ b/package/luci/modules/luci-base/po/pt/base.po @@ -3,34 +3,51 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-26 19:03+0200\n" -"PO-Revision-Date: 2022-11-30 16:44+0000\n" -"Last-Translator: Gonçalo Pereira \n" -"Language-Team: Portuguese \n" +"Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "!known (desconhecido)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" tabela \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d campo(s) inválido(s)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%dh atrás" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%dm atrás" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%ds atrás" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s não tem etiqueta em várias VLANs!" @@ -55,10 +72,11 @@ msgstr "(vazio)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(sem interfaces ligadas)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d mais" @@ -68,19 +86,19 @@ msgid "-- Additional Field --" msgstr "-- Campo Adicional --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Por favor escolha --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- personalizado --" @@ -106,7 +124,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = não utilizar o limiar RSSI, 1 = não alterar a predefinição do driver" @@ -120,13 +138,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Carga de 1 Minuto:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "1 sinalizador" msgstr[1] "%d sinalizadores" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "Carga de 15 minutos:" @@ -141,12 +164,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "ID hexadecimal de 4 caracteres" @@ -159,46 +187,107 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Carga 5 Minutos:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" "Identificador de 6 octetos como uma cadeia hexadecimal - sem dois pontos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: ative o relatório de beacon por meio de medições de rádio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Ativa o relatório vizinho através das medições do rádio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r Fast Transition (Transição Rápida)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: Ociosidade MAX do BSS. Unidades: segundos." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: gestão de transição do conjunto dos serviços básicos (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Anúncio do fuso horário local em quadros de gestão." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: O proxy ARP permite que o AP não STA permaneça em economia de " +"energia por mais tempo." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Anúncio de tempo em quadros de gestão." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Modo de espera do gestão de rede sem fio (WNM) (modo de espera " +"estendido para as estações)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Correções do modo de suspensão do gestão de rede sem fio (WNM): " +"previne ataques de reinstalação." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "Tempo limite máximo da consulta da Associação SA do 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "Tempo limite da tentativa de consulta da Associação SA do 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w Management Frame Protection (Proteção do Quadro de Gestão)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "Limite máximo do 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "Tempo limite da tentativa consecutiva do 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "" "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "" "Máscara de rede IPv4" @@ -211,30 +300,46 @@ msgstr "Configuração do LED" msgid "LED Name" msgstr "Nome do LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-Proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA Flags" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA Limite do salto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA Tempo de vida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-Serviço" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ corresponde a qualquer domínio. /example.com/ " +"retorna NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# retorna endereços nulos (0.0.0.0 e " +"::) para example.com e os seus subdomínios." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -280,11 +385,23 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s não está no conjunto %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"Um nó batman-adv pode ser executado no modo servidor (partilhando a sua " +"ligação à Internet com a rede) ou no modo cliente (onde é procurada a " +"conexão de internet mais conveniente na rede) ou ter o suporte por gateway " +"totalmente desativado (que é a configuração padrão)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Uma configuração para o aparelho \"%s\" já existe" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Já existe um diretório com o mesmo nome." @@ -292,25 +409,90 @@ msgstr "Já existe um diretório com o mesmo nome." msgid "A new login is required since the authentication session expired." msgstr "Um novo login é necessário visto que a sessão de autenticação expirou." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (todas as variantes) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (todas as variantes) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (todas as variantes) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (todas as variantes) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (todas as variantes) Annex B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (todas as variantes) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (todas as variantes) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annex L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -343,29 +525,39 @@ msgstr "O monitoramento ARP não é compatível com a política selecionada!" msgid "ARP retry threshold" msgstr "Limiar de tentativas ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "Tabela de tráfego ARP \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"ARP, IPv4 e IPv6 (mesmo 802.1Q) com MACs de destino multicast são unicast " +"para o endereço MAC STA. Nota: Este não é o Directed Multicast Service (DMS) " +"em 802.11v. Nota: pode quebrar as expectativas de multicast STA do recetor." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Asynchronous Transfer Mode)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "Pontes ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "Identificador Canais Virtuais ATM (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "Identificador de Caminho Virtual ATM (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -375,28 +567,24 @@ msgstr "" "interface de Rede Virtual Linux que pode ser usada em conjugação com o DHCP " "ou PPP para marcar para a rede ISP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Número do aparelho ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ID do vendedor de sistema ATU-C" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Interface ausente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Limitar o serviço DNS para subredes das interfaces nas quais está a ser " "servido DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Aceitar local" @@ -405,7 +593,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Aceitar o pacote" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Aceite pacotes com endereços de fontes locais" @@ -413,16 +601,25 @@ msgstr "Aceite pacotes com endereços de fontes locais" msgid "Access Concentrator" msgstr "Concentrador de Acesso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Ponto de Acesso" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Isolamento do Access Point" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Tecnologias de acesso" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Ações" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Ativo" @@ -462,8 +659,8 @@ msgstr "" msgid "Active-Backup policy (active-backup, 1)" msgstr "Política de Backup Ativo (backup ativo, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -480,18 +677,18 @@ msgstr "Balanceamento adaptativo da carga de transmissão (balanço-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Adicionar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Adicionar Ponte ATM" @@ -511,11 +708,11 @@ msgstr "Adicionar ação LED" msgid "Add VLAN" msgstr "Adicionar VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Adicione a configuração de um aparelho" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Adicione a configuração de um aparelho…" @@ -523,19 +720,19 @@ msgstr "Adicione a configuração de um aparelho…" msgid "Add instance" msgstr "Adicionar instância" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Adicionar chave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" "Adicionar um sufixo de domínio local aos nomes servidos dos ficheiros hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Adicionar uma nova interface..." @@ -543,6 +740,10 @@ msgstr "Adicionar uma nova interface..." msgid "Add peer" msgstr "Adicionar par" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Adicionar à lista negra" @@ -551,11 +752,11 @@ msgstr "Adicionar à lista negra" msgid "Add to Whitelist" msgstr "Adicionar à lista branca" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Ficheiro Hosts adicional" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Ficheiro servers adicional" @@ -572,7 +773,11 @@ msgstr "Ficheiro servers adicional" msgid "Address" msgstr "Endereço" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Família de endereços" @@ -585,7 +790,7 @@ msgstr "A configuração de endereço não é válida" msgid "Address to access local relay bridge" msgstr "Endereço para acesso à ponte de retransmissão local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Endereços" @@ -594,31 +799,29 @@ msgstr "Endereços" msgid "Administration" msgstr "Gestão" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Definições Avançadas" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Opções avançadas do aparelho" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Tempo de envelhecimento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "" -"Potência de Transmissão Agregada (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Mensagens agregadas do originador" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -657,11 +860,11 @@ msgstr "Interface Adicional" msgid "Alias of \"%s\"" msgstr "Interface adicional de \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Todos os Servidores" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." @@ -669,7 +872,7 @@ msgstr "" "Alocar endereços IP sequencialmente, a partir do endereço mais baixo " "disponível." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Alocar endereços IP sequencialmente" @@ -679,11 +882,11 @@ msgstr "" "Permitir autenticação SSH por palavra-" "passe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "Permitir que o modo AP deconecte STAs com base na baixa receção de ACK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Permitir todos, excepto os listados" @@ -691,15 +894,15 @@ msgstr "Permitir todos, excepto os listados" msgid "Allow full UCI access for legacy applications" msgstr "Conceder acesso UCI total a aplicações herdadas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Permitir taxas antigas 802.11b" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Permitir somente os listados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Permitir localhost" @@ -721,19 +924,24 @@ msgid "Allow system feature probing" msgstr "Permitir a sondagem de características do sistema" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Permitir que o utilizador root faça login com password" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Endereços IP autorizados" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "A configuração de IPs permitidos é inválida" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Sempre" @@ -745,12 +953,12 @@ msgstr "Sempre desligado (kernel: nenhum)" msgid "Always on (kernel: default-on)" msgstr "Sempre ligado (kernel: ligado por predefinição)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "Enviar sempre DHCP Options. Por vezes é necessário, por exemplo com PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -758,12 +966,16 @@ msgstr "" "Usar sempre canais de 40Mhz mesmo se o canal secundário estiver sobreposto. " "O uso desta opção não cumpre com o IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" "Averigue a quantidade de detecções dos endereços em duplicata que serão " "emitidos" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Quantidade de segundos para esperar que o modem esteja pronto" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Ocorreu um erro ao gravar o formulário:" @@ -772,72 +984,23 @@ msgstr "Ocorreu um erro ao gravar o formulário:" msgid "An optional, short description for this device" msgstr "Uma descrição opcional e curta para este aparelho" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Anexo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Anexos A + L + M (todo)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Anexo A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Anexo A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Anexo A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Anexo A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Anexo B (todo)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Anexo B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Anexo B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Anexo B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Anexo J (todo)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Anexo L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Anexo M (todo)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Anexo M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Anexo M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"Anunciar o prefixo NAT64 nas mensagens RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Anunciar este aparelho como um servidor de DNS IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -845,7 +1008,7 @@ msgstr "" "Anunciar este aparelho como roteador padrão se uma rota local IPv6 padrão " "estiver presente." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -854,7 +1017,7 @@ msgstr "" "estiver disponível, independentemente da disponibilidade de uma rota padrão " "local." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -862,15 +1025,15 @@ msgstr "" "Anuncie este aparelho como roteador padrão, independentemente da presença de " "um prefixo ou rota padrão." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Domínios DNS anunciados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Servidores de DNS IPv6 anunciados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Identidade Anónima" @@ -882,7 +1045,7 @@ msgstr "Montagem Anónima" msgid "Anonymous Swap" msgstr "Swap Anónimo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Qualquer pacote" @@ -894,11 +1057,11 @@ msgstr "Qualquer pacote" msgid "Any zone" msgstr "Qualquer zona" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "Aplicar as opções de DHCP a esta rede. (Vazio = todos os clientes)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "Aplicar e manter configurações" @@ -906,40 +1069,44 @@ msgstr "Aplicar e manter configurações" msgid "Apply backup?" msgstr "Aplicar backup?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Pedido para aplicar falhou com o estado %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Aplicar desmarcado" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "Aplicar com reversão após perda de ligação" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Aplicando alterações de configuração... %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Arquitectura" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Varredura de ARP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Atribua uma parte do comprimento dado de cada prefixo IPv6 público para esta " "interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -947,7 +1114,7 @@ msgstr "" "Atribua partes do prefixo usando este ID hexadecimal do sub prefixo para " "esta interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Estações Associadas" @@ -956,8 +1123,8 @@ msgstr "Estações Associadas" msgid "Associations" msgstr "Associações" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" @@ -965,8 +1132,8 @@ msgstr "" "Pelo menos %h por %h, com uma rajada de " "%h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -978,25 +1145,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "Tentar ativar pontos de montagem configurados para aparelhos ligados" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Grupo de Autenticação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Autenticação" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Tipo de Autenticação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autoritário" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Autorização Requerida" @@ -1004,7 +1172,9 @@ msgstr "Autorização Requerida" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1026,7 +1196,7 @@ msgstr "" "Verificar automaticamente o sistema de ficheiros por erros antes da montagem " "do aparelho" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1050,6 +1220,10 @@ msgstr "Montar automaticamente os Sistemas de Ficheiros" msgid "Automount Swap" msgstr "Montar automaticamente o Swap" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Disponível" @@ -1068,11 +1242,15 @@ msgstr "Disponível" msgid "Average:" msgstr "Média:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Evite os loops da ponte" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1080,15 +1258,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "Transição do BSS" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Voltar" @@ -1097,13 +1279,9 @@ msgstr "Voltar" msgid "Back to Overview" msgstr "Voltar à Visão Global" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Voltar à configuração" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" -msgstr "" +msgstr "Retorna à configuração de pares" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:391 msgid "Backup" @@ -1114,16 +1292,15 @@ msgid "Backup / Flash Firmware" msgstr "Backup / Flash Firmware" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Lista de ficheiros para backup" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Banda" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Aparelho base" @@ -1132,12 +1309,43 @@ msgid "Base64-encoded public key of this interface for sharing." msgstr "" "Chave pública codificada base64 desta interface para o compartilhamento." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Dispositivo Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Interface Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"O batman-adv tem uma camada 2 de fragmentação incorporada, para dados de " +"unicast que fluem através do mesh que permitirá executar o batman-adv nas " +"interfaces/conexões que não permitem aumentar o MTU além do tamanho padrão " +"do pacote Ethernet de 1500 bytes. Quando a fragmentação estiver ativada, o " +"batman-adv irá fragmentar automaticamente os pacotes com tamanho excessivo e " +"irá desfragmentá-los na outra extremidade. É predefinido que a fragmentação " +"esteja ativada e seja inativada se o pacote couber, porém, é possível " +"desativar totalmente a fragmentação." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Intervalo do quadro de monitorização (Beacon)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Relatório do sinal" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1151,7 +1359,7 @@ msgstr "" msgid "Bind NTP server" msgstr "Vincular servidor NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "Ligar dinamicamente a interfaces ao invés de endereços wildcard." @@ -1160,18 +1368,35 @@ msgstr "Ligar dinamicamente a interfaces ao invés de endereços wildcard." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Ligar à interface" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" +"Vincula os registos do serviço a um nome de domínio: especifique o local dos " +"serviços." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"Vincula os registos do serviço a um nome de domínio: especifique o local dos " +"serviços. Consulte RFC2782." + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1183,65 +1408,77 @@ msgstr "Ligar o túnel a esta interface (opcional)." msgid "Bitrate" msgstr "Taxa de bits" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Modo de ligação" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Política do Vínculo" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Ponte (suporte à comunicação direta entre o MAC das VLANs)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Filtragem da ponte VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Aparelho ponte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "Opções específicas da porta da ponte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Portas da ponte" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "Tabela de tráfego da ponte \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Número de unidade da bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Suba uma ponte vazia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Ativar com o arranque" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "Suba a interface da ponte ainda que não haja portas anexadas" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Política de divulgação (transmissão, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Navegar…" @@ -1249,15 +1486,39 @@ msgstr "Navegar…" msgid "Buffered" msgstr "Buffered" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" +"Certificado CA (codificado por PEM; use em vez do armazenamento em todo o " +"sistema para aferir o certificado do gateway." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "Certificado da CA; se em branco, será salvo depois da primeira ligação." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "Configuração CLAT falhou" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME ou fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (interface gerida externamente)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Uso do CPU (%)" @@ -1272,51 +1533,58 @@ msgstr "Em cache" msgid "Call failed" msgstr "A chamada falhou" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"Pode ser útil caso o provedor tenha servidores de nomes IPv6, mas não " +"forneça o roteamento IPv6." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Cancelar" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:347 msgid "Cannot parse configuration: %s" -msgstr "" +msgstr "Não foi possível analisar a configuração: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" -msgstr "" +msgstr "Fazer a captura dos pacotes da entrada endereçados a outros hosts" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "Capturar pacotes recebidos antes de qualquer decisão de roteamento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "Capturar pacotes de entrada roteados ao sistema local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "Capturar pacotes de saída após qualquer decisão de roteamento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "Capturar pacotes de saída provenientes do sistema local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "Capturar pacotes diretamente após o NIC recebê-los" @@ -1325,24 +1593,32 @@ msgstr "Capturar pacotes diretamente após o NIC recebê-los" msgid "Category" msgstr "Categoria" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "ID da célula" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "Localização da célula" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Restrição de certificado (Domínio)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Restrição de certificado (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Restrição de certificado (Assunto)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Restrição de certificado (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1350,8 +1626,8 @@ msgstr "" "Subcadeia de restrição de certificado - por exemplo, /CN=wifi.minhaempresa." "pt
    Veja `logread -f` durante o handshake para valores reais" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1359,8 +1635,8 @@ msgstr "" "Restrição/ões do certificado contra os valores SAN de DNS (se " "disponível)
    ou Assunto CN (correspondência exacta)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1368,8 +1644,8 @@ msgstr "" "Restrição/ões do certificado contra os valores SAN de DNS (se " "disponível)
    ou Assunto CN (correspondência de sufixos)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1384,16 +1660,16 @@ msgstr "" msgid "Chain" msgstr "Cadeia" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "Gancho de corrente \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Alterações" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "As alterações foram revertidas." @@ -1404,18 +1680,19 @@ msgstr "Altera a palavra-passe de administrador para acesso ao aparelho" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Canal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Análise dos canais" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Largura do canal" @@ -1423,7 +1700,7 @@ msgstr "Largura do canal" msgid "Check filesystems before mount" msgstr "Verificar o sistema de ficheiros antes da montagem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "Marque esta opção para remover as redes existentes neste rádio." @@ -1440,8 +1717,8 @@ msgstr "A verificar a imagem…" msgid "Choose mtdblock" msgstr "Escolha o bloco mtd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1453,7 +1730,7 @@ msgstr "" "coloque em branco o campo criar para definir a nova zona e ligá-la " "a interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1461,7 +1738,7 @@ msgstr "" "Escolha a(s) rede(s) à(s) qual(is) deseja ligar esta interface wireless ou " "preencha o campo criar para definir a nova rede." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Cifra" @@ -1485,9 +1762,10 @@ msgstr "" "Clique em \"Gravar o bloco mtd\" para descarregar o ficheiro do bloco mtd " "especificado. (NOTA: ESTE RECURSO É PARA PROFISSIONAIS!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Cliente" @@ -1496,9 +1774,9 @@ msgstr "Cliente" msgid "Client ID to send when requesting DHCP" msgstr "ID de cliente a enviar para pedidos de DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Fechar" @@ -1515,20 +1793,20 @@ msgstr "" "Fechar ligação inativa após um dado tempo em segundos, use 0 para manter a " "ligação" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Fechar lista..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "A recolher dados..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Comando" @@ -1545,7 +1823,7 @@ msgstr "O comando falhou" msgid "Comment" msgstr "Comentário" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1567,31 +1845,30 @@ msgstr "Cálculo do checksum de saída (opcional)." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Config File" -msgstr "" +msgstr "Ficheiro de configuração" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Configuração" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" -msgstr "" +msgstr "Exportação de configuração" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "A configuração foi aplicada." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "A configuração foi revertida!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "A configuração falhou" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1607,7 +1884,7 @@ msgstr "" "Muito Alto configura 24 Mbps como a taxa básica. As taxas suportadas " "inferiores à taxa básica mínima não são oferecidas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." @@ -1615,7 +1892,7 @@ msgstr "" "Configura anúncios de roteador padrão por mensagens de RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1623,16 +1900,16 @@ msgstr "" "Configura o modo de operação do serviço de RA nesta interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "Configura o modo de operação do serviço DHCPv6 nesta interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "Configura o modo de operação do serviço proxy do NDP nesta interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Configurar…" @@ -1644,9 +1921,10 @@ msgstr "Confirme a desconexão" msgid "Confirmation" msgstr "Confirmação" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Ligado" @@ -1656,13 +1934,13 @@ msgstr "Ligado" msgid "Connection attempt failed" msgstr "A tentativa de ligação falhou" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "A tentativa de ligação falhou." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" -msgstr "" +msgstr "Ponto final da conexão" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:411 msgid "Connection lost" @@ -1672,9 +1950,9 @@ msgstr "Ligação perdida" msgid "Connections" msgstr "Ligações" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" -msgstr "" +msgstr "Alteração de conectividade" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:31 msgctxt "nft ct state" @@ -1704,9 +1982,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Os conteúdos foram gravados." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1717,16 +1995,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "Continuar em %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "Continuar na cadeia de chamadas" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "Continuar a processar pacotes inigualáveis" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1741,20 +2019,20 @@ msgstr "" msgid "Country" msgstr "País" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Código do País" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Densidade da célula de cobertura" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Criar / Atribuir a uma zona de firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Criar interface" @@ -1766,19 +2044,19 @@ msgstr "Critico" msgid "Cron Log Level" msgstr "Nível de Log do Cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Energia atual" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:28 msgctxt "nft meta hour" msgid "Current time" -msgstr "" +msgstr "Hora atual" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:29 msgctxt "nft meta day" msgid "Current weekday" -msgstr "" +msgstr "Dia da semana atual" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:573 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:575 @@ -1809,31 +2087,31 @@ msgstr "" "Personaliza o comportamento dos LEDs, se possível." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "Transmissões DAD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "Cliente DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "Porta DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "Segredo DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "Opções do DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Servidor DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP e DNS" @@ -1844,16 +2122,22 @@ msgstr "DHCP e DNS" msgid "DHCP client" msgstr "Cliente DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Opções DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "Cliente DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "Serviço DHCPv6" @@ -1865,29 +2149,29 @@ msgstr "Serviço DHCPv6" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Encaminhamentos DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "" "Porta de consulta do DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "Domínios de pesquisa do DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" "Porta do servidor DNS" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:292 msgid "DNS setting is invalid" -msgstr "" +msgstr "A configuração do DNS é inválido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "Peso do DNS" @@ -1895,11 +2179,11 @@ msgstr "Peso do DNS" msgid "DNS-Label / FQDN" msgstr "Rótulo DNS / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "Verificar DNSSEC sem assinatura" @@ -1911,39 +2195,47 @@ msgstr "Tempo de expiração para ociosidade do DPD" msgid "DS-Lite AFTR address" msgstr "Endereço DS-Lite AFTR" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "Estado da DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "Modo de linha DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "Intervalo DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Taxa de Dados" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Dados Recebidos" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Dados Transmitidos" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Depuração" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Roteador padrão" @@ -1951,7 +2243,7 @@ msgstr "Roteador padrão" msgid "Default state" msgstr "Estado predefinido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1961,7 +2253,7 @@ msgstr "" "\"6,192.168.2.1,192.168.2.2\" informa os clientes de diferentes " "servidores DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" @@ -1969,7 +2261,7 @@ msgstr "" "Define um mapeamento da prioridade do pacote interno do Linux para a " "prioridade do cabeçalho VLAN, apenas para os frames de saída" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" @@ -1977,49 +2269,50 @@ msgstr "" "Define um mapeamento da prioridade do pacote interno do Linux para a " "prioridade do cabeçalho VLAN, apenas para os frames de entrada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "Define uma MTU específica para esta rota" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "Delegue prefixos IPv6" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Apagar" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Apagar chave" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Pedido de apagar falhou: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Apagar esta rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Intervalo da Mensagem Indicativa de Envio de Tráfego (DTIM)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Descrição" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Desmarcar" @@ -2027,11 +2320,11 @@ msgstr "Desmarcar" msgid "Design" msgstr "Tema" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "Mestre designado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2066,9 +2359,9 @@ msgstr "Zona de destino" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2078,36 +2371,40 @@ msgstr "Zona de destino" msgid "Device" msgstr "Aparelho" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Configuração do Aparelho" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "Identificador do aparelho" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "O aparelho não está ativo" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "O aparelho está a reiniciar…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Nome do aparelho" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Aparelho não gerido pelo ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "O aparelho não está presente" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Tipo do aparelho" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Aparelho não alcançável!" @@ -2115,31 +2412,31 @@ msgstr "Aparelho não alcançável!" msgid "Device unreachable! Still waiting for device..." msgstr "O aparelho está fora de alcance! Ainda à espera do aparelho..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Dispositivos" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnósticos" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Número de discagem" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Diretório" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Desativar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2156,20 +2453,24 @@ msgstr "Desativar pesquisas de DNS" msgid "Disable Encryption" msgstr "Desativar encriptação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Desactivar a Polling de Inactividade" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Desativar esta rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2178,16 +2479,16 @@ msgstr "Desativar esta rede" msgid "Disabled" msgstr "Desativado" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" -msgstr "" +msgstr "Desativado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Desassociar quando tiver baixa confirmação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" @@ -2195,18 +2496,17 @@ msgstr "" "href=\"%s\">RFC1918." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Desconectar" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "A tentativa de desconexão falhou" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "A tentativa de desconexão falhou." @@ -2216,23 +2516,35 @@ msgstr "Espaço no disco" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Dispensar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Otimização de Distância" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Distância para o host da rede mais distante em metros." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Tabela ARP distribuída" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2240,7 +2552,7 @@ msgstr "" "A instância do Dnsmasq à qual esta secção de inicialização está ligada. Se " "não for especificado, a secção é válida para todas as instâncias dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP e encaminhador de DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "Não por respostas negativas em cache, p.e. para domínios inexistentes." @@ -2262,34 +2574,23 @@ msgstr "Não por respostas negativas em cache, p.e. para domínios inexistentes. msgid "Do not create host route to peer (optional)." msgstr "Não crie a rota do host para o peer (opcional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "Não encaminhar consultas DNS sem pontos ou partes de domínio." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Não encaminhar pedidos que não possam ser respondidos por servidores " -"públicos de nomes." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Não encaminhar buscas reversas para redes locais." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Evite escutar nestas Interfaces." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "Não oferecer o serviço DHCPv6 nesta interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Não participar" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2301,7 +2602,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Não envie um nome de host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2309,11 +2610,11 @@ msgstr "" "Não enviar nenhuma mensagem de RA nesta interface." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Quer mesmo apagar \"%s\"?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Deseja mesmo apagar a seguinte chave SSH?" @@ -2321,27 +2622,29 @@ msgstr "Deseja mesmo apagar a seguinte chave SSH?" msgid "Do you really want to erase all settings?" msgstr "Quer mesmo apagar todas as configurações?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Deseja mesmo apagar recursivamente o diretório \"%s\"?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" -msgstr "" +msgstr "Deseja substituir o PSK atual?" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:100 msgid "Do you want to replace the current keys?" -msgstr "" +msgstr "Deseja substituir as chaves atuais?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Domínio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Domínio requerido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Lista Branca do Domínio" @@ -2365,17 +2668,19 @@ msgstr "Transferir backup" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:432 msgid "Download mtdblock" -msgstr "Transferir o bloco mtd" +msgstr "Descarregar o bloco mtd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Deslocamento do SNR a jusante" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." msgstr "" +"Arraste ou cole um ficheiro válido *.conf abaixo para configurar a " +"interface local do WireGuard." #: modules/luci-base/htdocs/luci-static/resources/form.js:2698 msgid "Drag to reorder" @@ -2385,16 +2690,62 @@ msgstr "Arraste para reordenar" msgid "Drop Duplicate Frames" msgstr "Descartar Quadros Duplicados" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"Eliminar todos os quadros ARP gratuitos, por exemplo, caso haja um proxy ARP " +"bom, conhecido na rede, onde estes quadros não precisem ser usados ou, no " +"caso do 802.11, não devam ser usados para evitar ataques." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Dexar cair todos os anúncios de vizinhos não solicitados, por exemplo, se " +"houver um bom proxy NA conhecido na rede e tais quadros não precisem ser " +"usados ou, no caso de 802.11, não devam ser usados para evitar ataques." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Deixar cair ARP gratuito" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" +"Deixar cair os quadros multicast da camada 2 contendo pacotes unicast IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" +"Deixar cair os quadros multicast da camada 2 contendo pacotes unicast IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Deixar cair unicast IPv4 aninhado" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Deixar cair unicast IPv6 aninhado" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Abandonar o pacote" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "Abandonar pacotes inigualáveis" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Daixar cair NA não solicitado" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Instância do Dropbear" @@ -2413,20 +2764,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "DHCP Dinâmico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "Cliente de extensão de autorização dinâmica." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "Porta de extensão de autorização dinâmica." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "Segredo da extensão de autorização dinâmica." @@ -2434,7 +2785,7 @@ msgstr "Segredo da extensão de autorização dinâmica." msgid "Dynamic tunnel" msgstr "Túnel dinâmico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2442,21 +2793,33 @@ msgstr "" "Alocar dinamicamente endereços DHCP para clientes. Se desativado, apenas " "clientes com reservas estáticas serão servidos." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Por exemplo, br-vlan ou brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Por exemplo, eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "Comprimento dos bits EA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Método EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Cada STA recebe a própria interface de AP_VLAN." + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Editar" @@ -2464,6 +2827,10 @@ msgstr "Editar" msgid "Edit peer" msgstr "Editar o par" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2472,11 +2839,11 @@ msgstr "" "Edite os dados de configuração brutos acima para corrigir qualquer erro e " "selecione em \"Gravar\" para recarregar a página." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Editar esta rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Editar rede wireless" @@ -2485,46 +2852,36 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "MTU efetiva da rota" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Mapeamento do egresso QoS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" -msgstr "" +msgstr "ID do aparelho Egress" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Nome do aparelho de saída" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Egresso marcado" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Egresso desmarcado" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Emergência" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Ativar" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" "Ativar / desativar par. Reinicie a interface wireguard para aplicar as " "alterações." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2532,11 +2889,11 @@ msgstr "" "Ativar a monitorização do IGMP (Snooping)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Ativar o STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "Ativar SLAAC" @@ -2554,10 +2911,11 @@ msgstr "Ativar o Embaralhamento Dinâmico do Flows" msgid "Enable HE.net dynamic endpoint update" msgstr "Ativar a atualização dinâmica do endpoint HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Ativar o IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Ativar a negociação de IPv6" @@ -2571,11 +2929,15 @@ msgstr "Ativar a negociação de IPv6" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Ativar a negociação IPv6 no link PPP" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "Ativa o roteamento do segmento IPv6" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Ativar a passagem de Jumbo Frames" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "Ative a aprendizagem de endereço MAC" @@ -2587,11 +2949,11 @@ msgstr "Ativar o cliente NTP" msgid "Enable Single DES" msgstr "Ativar DES Único" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Ativar o servidor TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Ative a filtragem VLAN" @@ -2599,7 +2961,7 @@ msgstr "Ative a filtragem VLAN" msgid "Enable VLAN functionality" msgstr "Ativar a funcionalidade VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Ativar o botão WPS. requer WPA(2)-PSK/WPA3-SAE" @@ -2613,12 +2975,12 @@ msgstr "" "Transfer Protocol\">HTTP à porta HTTPS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "Ative a delegação de prefixos IPv6 disponíveis nesta interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Ativar contramedidas contra o ataque de reinstalação de chave (KRACK)" @@ -2634,26 +2996,26 @@ msgstr "Ativar espelhamento dos pacotes de entrada" msgid "Enable mirroring of outgoing packets" msgstr "Ativar espelhamento dos pacotes de saída" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "Ative a saída rápida do multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "Ative o consultor multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Ative o suporte ao multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Ativar a direção de pacotes em todas as CPUs. Pode ajudar ou dificultar a " "velocidade da rede." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Ative o modo promíscuo" @@ -2675,11 +3037,11 @@ msgstr "Ativar suporte para tráfego de multicast (opcional)." msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Ativa o campo DF (Não Fragmentar) dos pacotes encapsulados." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "Ativar o servidor integrado de instância única de TFTP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Ativar esta rede" @@ -2688,23 +3050,26 @@ msgstr "Ativar esta rede" msgid "Enable tx checksum" msgstr "Ativar o checksum no tx" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "Ative a inundação unicast" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Ativado" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" "Ativar a monitorização do IGMP (Snooping) nesta bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2712,7 +3077,15 @@ msgstr "" "Ativa a troca rápida entre pontos de acesso que pertencem ao mesmo Domínio " "de Mobilidade" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" +"Permite uma infraestrutura de encaminhamento multicast mais eficiente e " +"consciente do grupo do batman-adv." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Ativa o Spanning Tree nesta bridge" @@ -2720,48 +3093,53 @@ msgstr "Ativa o Spanning Tree nesta bridge" msgid "Encapsulation limit" msgstr "Limite de encapsulamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Modo de encapsulamento" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Encriptação" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Ponto final" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Host Terminal" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Porta do Terminal" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:325 msgid "Endpoint setting is invalid" -msgstr "" +msgstr "O ponto final da configuração é inválido" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "Imponha o IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "Imponha o IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "Imponha o IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "Imponha o MLD versão 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "Imponha o MLD versão 2" @@ -2790,10 +3168,6 @@ msgstr "Erro" msgid "Error getting PublicKey" msgstr "Erro ao obter a PublicKey" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Segundos com erro (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2812,11 +3186,19 @@ msgstr "A cada 30 segundos (lento, 0)" msgid "Every second (fast, 1)" msgstr "A cada segundo (rápido, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Excluir interfaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"A execução de vários comandos de rede para verificar a conexão e a resolução " +"dos nomes com os outros sistemas." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2824,27 +3206,35 @@ msgstr "" "Isentar 127.0.0.0/8 e :: 1 de verificações de " "religação, p.e. para serviços RBL." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Aparelho existente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Expandir hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Era esperado o número da porta." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "À espera de uma dica de atribuição hexadecimal" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Na expectativa de um endereço IPv4 válido" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Na expectativa de um endereço IPv6 válido" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Na expectativa de dois valores prioritários separados por dois pontos" @@ -2853,11 +3243,11 @@ msgstr "Na expectativa de dois valores prioritários separados por dois pontos" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Esperando: %s" @@ -2869,7 +3259,7 @@ msgstr "Esperando: um valor não vazio" msgid "Expires" msgstr "Expira" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2879,11 +3269,11 @@ msgstr "" msgid "External" msgstr "Externo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Lista dos Detentor de Chave R0 Externo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Lista dos Detentor de Chave R1 Externo" @@ -2911,37 +3301,65 @@ msgstr "Opções adicionais do pppd" msgid "Extra sstpc options" msgstr "Opções extras do sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT over DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT over the Air" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "Protocolo FT" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "Motivo da falha" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Falha ao alterar a palavra-passe do sistema." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Houve uma falha ao configurar o modem" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" "Não foi possível confirmar a aplicação das configurações dentro de %ds, " "aguardando a reversão destas…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Houve uma falha na conexão" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Houve uma falha ao desconectar" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Falha ao executar \"/etc/init.d/%s %s\" ação: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Houve uma falha ao obter as informações do modem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Houve uma falha ao inicializar o modem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Houve uma falha ao definir o modo de operação" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Ficheiro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2950,24 +3368,24 @@ msgstr "" "do domínio, por exemplo server=1.2.3.4, server=/" "domínio/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Ficheiro não acessível" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "Ficheiro para armazenar informações de concessão de DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "Ficheiro com os resolvedores upstream." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Nome do ficheiro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Nome do ficheiro da imagem de inicialização anunciada aos clientes." @@ -2976,14 +3394,22 @@ msgstr "Nome do ficheiro da imagem de inicialização anunciada aos clientes." msgid "Filesystem" msgstr "Sistema de ficheiros" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Filtrar os registos IPv4 A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Filtrar os registos IPv6 AAAA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Filtre a descoberta do serviço SRV/SOA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filtrar endereços privados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filtrar inúteis" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Filtragem para todos os escravos, sem validação" @@ -2999,8 +3425,15 @@ msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" "Filtragem para todos os escravos, validação apenas para os escravos de backup" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" +"Filtra a descoberta do serviço SRV/SOA, visa evitar o acionamento de " +"ligações dial-on-demand." + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "A finalização falhou" @@ -3013,7 +3446,7 @@ msgstr "" "substitua a configuração com valores predefinidos baseados no que foi " "detetado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Procurar e ligar a uma rede" @@ -3027,10 +3460,11 @@ msgid "Firewall" msgstr "Firewall" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Marca da Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Definições da Firewall" @@ -3038,19 +3472,19 @@ msgstr "Definições da Firewall" msgid "Firewall Status" msgstr "Estado da Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "Marca do firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Ficheiro de Firmware" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Versão do firmware" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Porta de origem fixa para consultas de DNS de saída." @@ -3076,40 +3510,48 @@ msgstr "Operações na memória flash" msgid "Flashing…" msgstr "A fazer o Flash…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Forçar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Forçar o modo 40MHz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Forçar CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Forçar DHCP nesta rede mesmo que outro servidor seja detetado." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "Imponha a versão do IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "Imponha a versão do MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Forçar TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Forçar TKIP e CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Forçar o link" @@ -3121,11 +3563,11 @@ msgstr "Forçar a atualização" msgid "Force use of NAT-T" msgstr "Forçar o uso do NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Chave electrónica do formulário não corresponde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA entre a interface " "principal que foi designada e as interfaces \"downstream\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3151,7 +3593,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Encaminhar tráfego DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3159,33 +3601,35 @@ msgstr "" "Encaminhe as mensagens DHCPv6 entre a interface principal e as interfaces " "\"downstream\"." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" -"Encaminhar segundos da correção de erros ( FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Encaminhar tráfego de broadcast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "Atraso do encaminhamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Encaminhar o tráfego do parceiro da mesh" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "Encaminhe neste aparelho os pacotes multicast como pacotes unicast." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Modo de encaminhamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Fragmentação" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Limiar de Fragmentação" @@ -3209,7 +3653,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Só GPRS" @@ -3229,12 +3673,16 @@ msgstr "Túnel GRETAP sobre IPv4" msgid "GRETAP tunnel over IPv6" msgstr "Túnel GRETAP sobre IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Gateway" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Modo gateway" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Portas de gateway" @@ -3244,23 +3692,23 @@ msgstr "Portas de gateway" msgid "Gateway address is invalid" msgstr "O endereço do gateway é inválido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Configurações gerais" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Configuração Geral" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Opções gerais do aparelho" @@ -3268,7 +3716,7 @@ msgstr "Opções gerais do aparelho" msgid "Generate Config" msgstr "Gerar Configuração" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Gerar a PMK localmente" @@ -3276,29 +3724,29 @@ msgstr "Gerar a PMK localmente" msgid "Generate archive" msgstr "Gerar arquivo" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" -msgstr "" +msgstr "Gera a configuração" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" -msgstr "" +msgstr "Gera a configuração…" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:109 msgid "Generate new key pair" -msgstr "" +msgstr "Gera um novo par de chaves" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" -msgstr "" +msgstr "Gera uma chave pré-compartilhada" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" -msgstr "" +msgstr "Gera uma configuração adequada para a importação num peer do WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" -msgstr "" +msgstr "Gerando o código QR…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:79 msgid "Given password confirmation did not match, password not changed!" @@ -3309,39 +3757,40 @@ msgstr "" msgid "Global Settings" msgstr "Configurações Globais" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Opções de rede globais" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "Ir à atualização do firmware..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Ir para a configuração da palavra-passe…" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Ir para a página respetiva de configuração" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "Conceder acesso à configuração do DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Conceder acesso à visualização do estado do DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "Conceder acesso à visualização do estado de DSL" @@ -3353,6 +3802,10 @@ msgstr "Conceder acesso aos procedimentos do LuCI OpenConnect" msgid "Grant access to LuCI Wireguard procedures" msgstr "Conceder acesso aos procedimentos da LuCI Wireguard" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Conceda acesso aos procedimentos do LuCI openfortivpn" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "Conceder acesso à configuração do SSH" @@ -3389,7 +3842,7 @@ msgstr "Conceder acesso à configuração de montagem" msgid "Grant access to network configuration" msgstr "Conceder acesso à configuração da rede" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Conceder acesso a ferramentas de diagnóstico de rede" @@ -3397,6 +3850,10 @@ msgstr "Conceder acesso a ferramentas de diagnóstico de rede" msgid "Grant access to network status information" msgstr "Conceder acesso às informações do estado da rede" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "Conceder acesso ao estado de processos" @@ -3429,7 +3886,7 @@ msgstr "Conceda acesso à configuração uHTTPd" msgid "Grant access to wireless channel status" msgstr "Conceda acesso à condição geral do canal sem fio" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Conceder acesso à visualização do estado do wireless" @@ -3458,17 +3915,11 @@ msgstr "Acesso HTTP(s)" msgid "Hang Up" msgstr "Desligar" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" -"Erros de Código de Erro de Cabeçalho (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Intervalo de heartbeat (kernel: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Intervalo da saudação (Hello)" @@ -3480,7 +3931,7 @@ msgstr "" "Aqui pode configurar os aspectos básicos do seu aparelho como o nome do host " "ou o fuso horário." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" "Ocultar %h
    (%h), Priority: %d" msgstr "Gancho: %h (%h), Prioridade: %d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Penalidade do salto" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3511,7 +3970,7 @@ msgstr "Host" msgid "Host expiry timeout" msgstr "Tempo limite de expiração de equipamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "O host solicita este nome de ficheiro no servidor de inicialização." @@ -3519,10 +3978,16 @@ msgstr "O host solicita este nome de ficheiro no servidor de inicialização." msgid "Host-Uniq tag content" msgstr "Conteúdo da etiqueta Host-Uniq" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3532,11 +3997,11 @@ msgstr "Nome do Host" msgid "Hostname to send when requesting DHCP" msgstr "Nome do Host a enviar quando houver um pedido DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Endereços de Hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3565,12 +4030,12 @@ msgstr "Híbrido" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:49 msgctxt "nft icmp code" msgid "ICMP code" -msgstr "" +msgstr "Código ICMP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:50 msgctxt "nft icmp type" msgid "ICMP type" -msgstr "" +msgstr "Tipo ICMP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:51 msgctxt "nft icmpv6 code" @@ -3595,23 +4060,27 @@ msgstr "Agregação de link dinâmico IEEE 802.3ad (802.3ad, 4)" msgid "IKE DH Group" msgstr "Grupo DH do IKE" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "IMEI" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "Endereços IP" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "Protocolo IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "Conjuntos de IP" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "Tipo de IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3627,32 +4096,35 @@ msgstr "O endereço IP é inválido" msgid "IP address is missing" msgstr "O endereço IP está ausente" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " "packets with matching destination IP." msgstr "" +"Endereços IP permitidos dentro do túnel. O par aceitará pacotes no túnel com " +"endereços IP de origem correspondentes a esta lista e roteará de volta os " +"pacotes com IP de destino correspondente." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 msgctxt "nft ip protocol" msgid "IP protocol" msgstr "Protocolo IP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "Protocolo IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "conjunto de IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "Conjuntos IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Substituir Domínios NX Falsos" @@ -3660,14 +4132,15 @@ msgstr "Substituir Domínios NX Falsos" msgid "IPsec XFRM" msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3683,7 +4156,7 @@ msgstr "Vizinhos IPv4" msgid "IPv4 Routing" msgstr "Roteamento IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "Regras IPv4" @@ -3693,7 +4166,7 @@ msgstr "IPv4 Superior" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3720,7 +4193,7 @@ msgstr "Máscara IPv4" msgid "IPv4 network in address/netmask notation" msgstr "Rede IPv4 em notação endereço/máscara de rede" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Apenas IPv4" @@ -3733,11 +4206,11 @@ msgstr "Prefixo IPv4" msgid "IPv4 prefix length" msgstr "Comprimento do prefixo IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "Tabela de tráfego IPv4 \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3746,16 +4219,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-in-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (ambos - predefinição é IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "Tabela de tráfego IPv4/IPv6 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3766,7 +4243,8 @@ msgstr "Tabela de tráfego IPv4/IPv6 \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3774,7 +4252,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Firewall IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "MTU IPv6" @@ -3782,7 +4260,11 @@ msgstr "MTU IPv6" msgid "IPv6 Neighbours" msgstr "Vizinhos IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "Configurações do IPv6 RA" @@ -3790,15 +4272,15 @@ msgstr "Configurações do IPv6 RA" msgid "IPv6 Routing" msgstr "Roteamento IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "Regras IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "Configurações IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "Prefixo ULA IPv6" @@ -3812,12 +4294,12 @@ msgstr "IPv6 Superior" msgid "IPv6 address" msgstr "Endereço IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "Sugestão de atribuição IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "Tamanho da atribuição IPv6" @@ -3829,11 +4311,11 @@ msgstr "Gateway IPv6" msgid "IPv6 network in address/netmask notation" msgstr "Rede IPv6 em notação endereço/máscara de rede" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Apenas IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "Preferência do IPv6" @@ -3842,7 +4324,7 @@ msgstr "Preferência do IPv6" msgid "IPv6 prefix" msgstr "Prefixo IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "Filtro do prefixo IPv6" @@ -3856,24 +4338,19 @@ msgstr "Comprimento do prefixo IPv6" msgid "IPv6 routed prefix" msgstr "Prefixo roteado IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "Roteamento com origem IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "Sufixo IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"Sufixo (hex) IPv6" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "Suporte de IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "Tabela de tráfego IPv6 \"%h\"" @@ -3881,6 +4358,10 @@ msgstr "Tabela de tráfego IPv6 \"%h\"" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3896,10 +4377,16 @@ msgstr "IPv6-sobre-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-sobre-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identidade" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Se marcado, 1DES será ativada" @@ -3912,7 +4399,7 @@ msgstr "Se marcado, adiciona o \"+ipv6\" nas opções do pppd" msgid "If checked, encryption is disabled" msgstr "Se marcado, a encriptação será desativada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." @@ -3920,9 +4407,9 @@ msgstr "" "Se definido, as sub-redes só são alocadas a partir das classes informadas do " "prefixo IPv6 ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" -msgstr "" +msgstr "Se definido, o sentido das opções de correspondência é invertido" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 @@ -3941,21 +4428,26 @@ msgstr "" "Se especificado, monta o aparelho pela etiqueta da partição ao invés de um " "nó de aparelho fixo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" +"Se o endereço IP usado para acessar o LuCI for alterado, uma reconexão " +"manual ao novo IP será necessária em %d segundos para " +"confirmar as configurações, caso contrário, as alterações serão revertidas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Se desmarcado, não é configurada uma rota pré-definida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "Se desmarcado, os endereços de servidor DNS anunciados são ignorados" @@ -3975,15 +4467,23 @@ msgstr "" "lento, pois o aparelho swap não pode ser acedido com a alta taxa de dados da " "memória RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignorar /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignorar interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignorar o ficheiro resolv.conf" @@ -3995,37 +4495,55 @@ msgstr "Imagem" msgid "Image check failed:" msgstr "A verificação da imagem falhou:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" -msgstr "" +msgstr "Importe como par" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" -msgstr "" +msgstr "Importa a configuração" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" -msgstr "" +msgstr "Importa a configuração como par…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" -msgstr "" +msgstr "Importa as configurações" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" -msgstr "" +msgstr "A configuração dos pares foi importada" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 msgid "Imports settings from an existing WireGuard configuration file" msgstr "" +"Importa as configurações de um ficheiro de configuração WireGuard existente" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:68 msgid "In" msgstr "Entrada" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"Nas configurações LAN em ponte é aconselhável ativar a prevenção do loop da " +"ponte, visando evitar os loops de transmissão que podem levar toda a LAN a " +"uma paralisação." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -4033,7 +4551,7 @@ msgstr "" "Para prevenir acesso não autorizado ao sistema, so seu pedido foi bloqueado. " "Selecione \"Continuar »\" para voltar à página anterior." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "Em segundos" @@ -4065,7 +4583,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Checksum da entrada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Interface de entrada" @@ -4073,6 +4591,7 @@ msgstr "Interface de entrada" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Chave da entrada" @@ -4091,22 +4610,21 @@ msgstr "Info" msgid "Information" msgstr "Informação" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "Mapeamento do ingresso QoS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" -msgstr "" +msgstr "Identificação do aparelho de entrada" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" -msgstr "" +msgstr "Nome do aparelho de entrada" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Falha no arranque" @@ -4118,31 +4636,41 @@ msgstr "Script de arranque" msgid "Initscripts" msgstr "Scripts de arranque" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Restrição de certificado interno (Domínio)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Restrição de certificado interno (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Restrição do certificado interno (Assunto)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Restrição de certificado interno (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Instalar extensões do protocolo..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Instância" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Instância \"%h\"" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Detalhes da instância" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4154,6 +4682,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Permissões insuficientes para ler a configuração UCI." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "Identificador do cartão com circuito integrado" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4161,7 +4693,7 @@ msgstr "Permissões insuficientes para ler a configuração UCI." msgid "Interface" msgstr "Interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "A interface \"%h\" já está marcada como mestre designado." @@ -4169,7 +4701,7 @@ msgstr "A interface \"%h\" já está marcada como mestre designado." msgid "Interface %q device auto-migrated from %q to %q." msgstr "O aparelho da interface %q foi migrada automaticamente de %q para &q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Configuração da Interface" @@ -4200,11 +4732,11 @@ msgstr "A interface está a religar..." msgid "Interface is shutting down..." msgstr "A interface está a desligar..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "A interface está a iniciar..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "A interface está a parar..." @@ -4213,12 +4745,12 @@ msgid "Interface name" msgstr "Nome da interface" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Interface não presente ou ainda não ligada." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Interfaces" @@ -4227,15 +4759,19 @@ msgstr "Interfaces" msgid "Internal" msgstr "Interno" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Erro Interno do Servidor" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "Identidade internacional do equipamento da estação móvel" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "Identidade internacional do assinante móvel" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Intervalo para o Envio dos Pacotes de Aprendizagem" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4246,7 +4782,7 @@ msgstr "" "mensagens IGMP na sub-rede; os valores maiores fazem com que as consultas ao " "IGMP sejam enviadas com menos frequência" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "O intervalo em segundos para os pacotes de saudação do STP" @@ -4256,8 +4792,9 @@ msgid "Invalid" msgstr "Inválido" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "Fornecido um APN inválido" @@ -4267,6 +4804,10 @@ msgstr "Fornecido um APN inválido" msgid "Invalid Base64 key string" msgstr "Cadeia de caracteres Base64 inválida" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Endereço IPv6 inválido" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4290,7 +4831,7 @@ msgstr "O ID de VLAN fornecido é inválido! Só IDs únicos são permitidos" msgid "Invalid argument" msgstr "Argumento inválido" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4306,15 +4847,36 @@ msgstr "Comando inválido" msgid "Invalid hexadecimal value" msgstr "Valor hexadecimal inválido" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Nome de host ou endereço IPv4 inválido" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Porta inválida" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "URL do servidor inválida" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Username e/ou password inválidos! Por favor, tente novamente." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Inverte a piscagem" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "Inverta a correspondência" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "É a VLAN primária" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Isolar Clientes" @@ -4327,25 +4889,25 @@ msgstr "" "A imagem que está a tentar carregar aparenta não caber na flash do " "equipamento, por favor verifique o ficheiro da imagem!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "É necessário JavaScript!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Associar à Rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Associar à Rede: Procurar Redes Wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "A associar à rede: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Ir à regra" @@ -4353,24 +4915,28 @@ msgstr "Ir à regra" msgid "Keep settings and retain the current configuration" msgstr "Manter as definições e manter a configuração atual" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "Manter vivo" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Logs da Kernel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Versão da Kernel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Chave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Chave #%d" @@ -4378,6 +4944,7 @@ msgstr "Chave #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Chave para os pacotes da entrada (opcional)." @@ -4385,18 +4952,23 @@ msgstr "Chave para os pacotes da entrada (opcional)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Chave para os pacotes da saída (optional)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" -msgstr "" +msgstr "Chave faltando" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Chave usada para assinar a configuração da rede" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" -msgstr "" +msgstr "KiB" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:54 msgid "Kill" @@ -4437,7 +5009,7 @@ msgstr "Intervalo de echo LCP" msgid "LED Configuration" msgstr "Configuração de LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4454,32 +5026,41 @@ msgstr "Idioma" msgid "Language and Style" msgstr "Língua e Tema" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" +"Pesos maiores (do mesmo prio) recebem uma probabilidade proporcionalmente " +"maior de serem selecionados." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "O intervalo do último membro" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Latência" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Último Aperto de Mão" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Folha" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Aprenda" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "Aprender rotas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Ficheiro de concessões" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Tempo de concessão" @@ -4503,7 +5084,7 @@ msgstr "Deixar em branco para auto-detecção" msgid "Leave empty to use the current WAN address" msgstr "Deixar em branco para usar o endereço WAN actual" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4514,31 +5095,27 @@ msgstr "" "significativamente reduzida quando estes são utilizados. É recomendado não " "permitir as taxas 802.11b sempre que possível." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" -msgstr "" +msgstr "Foram detectadas regras legadas" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Legenda:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Limite" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Atenuação de Linha (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "Modo da Linha" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "Estado da Linha" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "Tempo de Ativo da Linha" @@ -4557,19 +5134,21 @@ msgstr "Link Ativo" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:77 msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" -msgstr "" +msgstr "Bits do cabeçalho da camada do enlace %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Lista de endereços IP a serem convertidos em respostas NXDOMAIN." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" "Lista os conjuntos dos IPs para preencher os IPs com domínios especificados." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4583,7 +5162,7 @@ msgstr "" "um endereço MAC de destino ao solicitar a chave PMK-R1 a partir do R0KH que " "o STA usado durante a Associação de Domínio de Mobilidade Inicial." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4601,23 +5180,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Lista de ficheiros de chaves SSH para autenticação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Lista de domínios para quais permitir respostas de RFC1918." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Lista de domínios a forçar para um endereço IP." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "Lista de resolvedores upstream a quem encaminhar as consultas." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Porta de escuta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Interfaces de Escuta" @@ -4626,7 +5202,7 @@ msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" "Escutar apenas na interface fornecida ou, se não especificada, em todas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4634,9 +5210,9 @@ msgstr "Escutar apenas nestas interfaces, e na loopback." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:299 msgid "ListenPort setting is invalid" -msgstr "" +msgstr "A configuração ListenPort está inválida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Porta de escuta para a entrada de consultas DNS." @@ -4645,35 +5221,36 @@ msgstr "Porta de escuta para a entrada de consultas DNS." msgid "Load" msgstr "Carga" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Carga Média" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:189 msgid "Load configuration…" -msgstr "" +msgstr "Carrega a configuração…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "A carregar dados…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Carregando o conteúdo do diretório…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Carregando visualização…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Local" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Endereço IP local" @@ -4693,11 +5270,12 @@ msgstr "Endereço IP local para atribuir" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Endereço IPv4 Local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Servidor de DNS IPv6 local" @@ -4713,45 +5291,71 @@ msgstr "Endereço IPv6 Local" msgid "Local Startup" msgstr "Arranque Local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Hora Local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "ULA local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Domínio local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "Sufixo de domínio local anexado a nomes de DHCP e entradas no ficheiro hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Servidor local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Somente Serviço Local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Chave wireguard local" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Localizar consultas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "Código de área do local" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Bloqueio para BSSID" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Registo do incidente \"%h…\"" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Login" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Para fazer login…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Sair" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Nível de output do log" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Registo das consultas" @@ -4777,39 +5381,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "Rede lógica onde o túnel será adicionado (bridged) (opcional)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Login" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Sair" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "Filtragem livre" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "" -"Segundos de Perda de Sinal (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "O endereço mais baixo concedido como deslocamento do endereço da rede." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Modo de compatibilidade lua ativo" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "Endereço MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Filtro de Endereço-MAC" @@ -4817,16 +5410,15 @@ msgstr "Filtro de Endereço-MAC" msgid "MAC Address For The Actor" msgstr "Endereço MAC Para o Ator" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "VLAN MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4835,11 +5427,15 @@ msgstr "VLAN MAC" msgid "MAC address" msgstr "Endereço MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Filtro-MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Lista-MAC" @@ -4853,6 +5449,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "A regra MAC é inválida" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "Celular MBIM" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4874,15 +5474,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "Intervalo MII" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4892,7 +5496,7 @@ msgstr "" "abaixo:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4901,73 +5505,75 @@ msgstr "" msgid "Manual" msgstr "Manual" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "Fabricante" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Mestre" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "Intervalo máximo RA" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "" -"Taxa de Dados Atingível Máxima (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Max. de concessõesDHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Tamanho max. do pacote EDNS0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Max. de consultas concorrentes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Idade máxima" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Intervalo de Escuta máximo permitido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Quantidade máxima permitida de concessões DHCP ativas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Quantidade máxima permitida de consultas simultâneas de DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "Tamanho máximo permitido dos pacotes UDP EDNS0." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" "Quantidade máxima de segundos a esperar pelo modem para se tronar pronto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Quantidade máxima de endereços concessionados." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "Tamanho máximo da tabela de monitoramento (snooping)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -4976,10 +5582,14 @@ msgstr "" "ICMPv6 Type 134\">RA não solicitados. O tempo predefinido é de 600 " "segundos." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Potência máxima de transmissão" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Pode impedir o funcionamento do VoIP ou de outros serviços." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -5006,7 +5616,7 @@ msgstr "Memória" msgid "Memory usage (%)" msgstr "Uso de memória (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -5014,10 +5624,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "ID de Mesh" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Id de Mesh" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Roteamento mesh" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Opções relacionadas ao mesh e ao roteamento" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Método não encontrado" @@ -5030,7 +5648,7 @@ msgstr "Método de monitoramento de enlace" msgid "Method to determine link status" msgstr "Método para determinar a condição do enlace" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -5039,13 +5657,13 @@ msgstr "Métrica" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:70 msgctxt "nft unit" msgid "MiB" -msgstr "" +msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "Intervalo mínimo RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Tempo de validade mínima do ARP" @@ -5053,7 +5671,7 @@ msgstr "Tempo de validade mínima do ARP" msgid "Minimum Number of Links" msgstr "Quantidade Mínima de Enlaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." @@ -5061,7 +5679,7 @@ msgstr "" "O tempo mínimo necessário em segundos antes que uma entrada ARP possa ser " "substituída. Impede que o cache ARP seja descarado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -5078,35 +5696,49 @@ msgstr "Porta de monitoramento do espelho" msgid "Mirror source port" msgstr "Porta de origem do espelho" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "Código do país do telemóvel" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Dados Móveis" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "Código da rede móvel" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "Serviço móvel" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Domínio da Mobilidade" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Modo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Modelo" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Desligamento do portador do modem em andamento." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "Informações sobre o modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5114,43 +5746,36 @@ msgstr "" "Conexão do modem em andamento. Por favor, espere. Este processo atingirá o " "tempo limite depois de 2 minutos." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Predefinição do modem" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Aparelho do modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Desconexão do modem em andamento. Por favor, espere." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "A consulta das informações do modem falhou" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Estouro de tempo da iniciação do modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "O modem está desativado." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "ModemManager" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" @@ -5220,6 +5845,10 @@ msgstr "Mover para baixo" msgid "Move up" msgstr "Mover para cima" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Multi para Unicast" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5227,21 +5856,25 @@ msgstr "Mover para cima" msgid "Multicast" msgstr "Multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Modo multicast" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Roteamento multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "Multicast para unicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" -msgstr "" +msgstr "Cadeia de ação NAT \"%h\"" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:87 msgid "NAT-T Mode" @@ -5251,12 +5884,16 @@ msgstr "Modo NAT-T" msgid "NAT64 Prefix" msgstr "Prefixo NAT64" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "Prefixo NAT64" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "NDP-Proxy escravo" @@ -5269,33 +5906,42 @@ msgid "NTP server candidates" msgstr "Candidatos a servidor NTP" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Nome" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Nome da nova rede" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Nome do túnel do aparelho" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navegação" #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:10 msgid "Nebula Network" -msgstr "" +msgstr "Rede Nebulosa" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Relatório da vizinhança" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "Validade do cache vizinho" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5304,32 +5950,36 @@ msgstr "Validade do cache vizinho" msgid "Network" msgstr "Rede" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Codificação da rede" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" -msgstr "" +msgstr "Modo de rede" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "Registo da rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "SSID de rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Ferramentas de Rede" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" -msgstr "" +msgstr "Endereço de rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Imagem de arranque via rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "Migração da configuração da ponte de rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Aparelho de rede" @@ -5342,16 +5992,16 @@ msgstr "Atividade do aparelho de rede (kernel: netdev)" msgid "Network device is not present" msgstr "O aparelho de rede não está presente" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" -msgstr "" +msgstr "Tabela dos aparelhos de rede \"%h\"" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:78 msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" -msgstr "" +msgstr "Bits do cabeçalho da rede %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Migração da configuração do ifname da rede" @@ -5360,15 +6010,20 @@ msgstr "Migração da configuração do ifname da rede" msgid "Network interface" msgstr "Interfaces de rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "ID da rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Nunca" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Nunca" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5376,11 +6031,11 @@ msgstr "" "Nunca encaminhar domínios e subdomínios que correspondem, resolver apenas a " "partir de DHCP ou de ficheiros hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Nova interface para \"%s\" não pode ser criada: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Novo nome de interface…" @@ -5388,13 +6043,13 @@ msgstr "Novo nome de interface…" msgid "Next »" msgstr "Seguinte »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Não" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Sem Servidor DHCP configurado nesta interface" @@ -5402,7 +6057,7 @@ msgstr "Sem Servidor DHCP configurado nesta interface" msgid "No Data" msgstr "Sem dados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Sem criptografia" @@ -5418,9 +6073,17 @@ msgstr "Sem NAT-T" msgid "No RX signal" msgstr "Sem sinal RX" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Nenhuma interface WireGuard foi configurada." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5434,17 +6097,21 @@ msgstr "" msgid "No client associated" msgstr "Nenhum cliente associado" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Nenhum aparelho de controle foi especificado" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" -msgstr "" +msgstr "Sem dados" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:406 msgid "No data received" msgstr "Nenhuns dados recebidos" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "Sem imposição" @@ -5457,19 +6124,17 @@ msgstr "Sem imposição" msgid "No entries available" msgstr "Não há entradas disponíveis" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Não há entradas neste diretório" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Não foram encontrados ficheiros" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" msgstr "" +"Nenhuma porta fixa de escuta da interface foi definida, os pares podem não " +"conseguir iniciar as conexões com esta instância do WireGuard!" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 @@ -5479,7 +6144,7 @@ msgstr "" msgid "No host route" msgstr "Nenhuma rota para o host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5500,33 +6165,42 @@ msgstr "Não há mais escravos disponíveis" msgid "No more slaves available, can not save interface" msgstr "Não há mais escravos disponíveis, não é possível gravar a interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Sem cache negativa" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." -msgstr "" +msgstr "Nenhuma regra nftables foi carregada." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Sem password definida!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Nenhum par conectado" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." +msgstr "Não há pares definidos ainda." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Ainda não há chaves públicas presentes." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" -msgstr "" +msgstr "Não há regras nesta cadeia" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:91 msgid "No rules in this chain." @@ -5537,7 +6211,8 @@ msgid "No validation or filtering" msgstr "Sem validação ou filtragem" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Sem zona atribuída" @@ -5549,39 +6224,40 @@ msgstr "Sem zona atribuída" msgid "Noise" msgstr "Ruído" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Margem de Ruído (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Margem de ruído" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Ruído:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" -"Erros CRC Não PreemptivosCRC_P" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Sem caracter curinga" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Nenhum" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Não encontrado" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Não membro" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Não associado" @@ -5594,7 +6270,7 @@ msgstr "Não ligado" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Não presente" @@ -5606,7 +6282,7 @@ msgstr "Não iniciado na inicialização" msgid "Not supported" msgstr "Não suportado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5614,6 +6290,14 @@ msgstr "" "Nota: Alguns drivers wireless não são totalmente compatíveis com 802.11w. " "Por exemplo. o mwlwifi pode ter problemas" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Observação: também pode precisar de um proxy DHCP (atualmente indisponível) " +"ao definir uma porta de distribuição não padrão (addr#port)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Anotações" @@ -5622,7 +6306,7 @@ msgstr "Anotações" msgid "Notice" msgstr "Aviso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5630,7 +6314,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "Quantidade de relatórios associados ao IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "Quantidade das entradas DNS em cache, 10000 é o máximo, 0 desativa o cache." @@ -5648,7 +6332,7 @@ msgid "Obfuscated Password" msgstr "Palavra-passe Ofuscada" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5659,6 +6343,7 @@ msgid "Obtain IPv6 address" msgstr "Obter Endereço IPv6" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Desligado" @@ -5667,6 +6352,14 @@ msgstr "Desligado" msgid "Off-State Delay" msgstr "Atraso do Off-State" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"Desativado: vlanXXX, por exemplo, vlan1. Ativado: " +"vlan_tagged_interface.XXX, por exemplo, eth0.1." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Ligado" @@ -5675,15 +6368,15 @@ msgstr "Ligado" msgid "On-State Delay" msgstr "Atraso do On-State" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "Rota On-Link" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Um nome de host ou endereço MAC deve ser especificado!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Uma das seguintes: %s" @@ -5701,7 +6394,11 @@ msgstr "Um ou mais valores inválidos/obrigatórios na guia" msgid "One or more required fields have no value!" msgstr "Um ou mais campos obrigatórios não têm valores!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" "Quando ativada, permita apenas a comunicação com as portas não isoladas da " @@ -5714,25 +6411,24 @@ msgstr "" "Somente caso o escravo ativo atual falhe e o escravo primário esteja ativo " "(falha, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" -msgstr "" +msgstr "Abrir a visão geral das regras do iptables…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Abrir lista..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5750,7 +6446,7 @@ msgstr "" "Operar no modo de relé se uma interface master designada estiver " "configurada e ativa, caso contrário, recuar para o modo de servidor." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." @@ -5758,12 +6454,24 @@ msgstr "" "Operar no modo relé se um prefixo IPv6 upstream estiver presente, " "caso contrário desativar o serviço." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Frequência de Operação" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "Operador" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "Código do operador" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "Nome do operador" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "A opção \"%s\" contém um valor de entrada inválido." @@ -5771,22 +6479,33 @@ msgstr "A opção \"%s\" contém um valor de entrada inválido." msgid "Option \"%s\" must not be empty." msgstr "A opção \"%s\" não deve estar vazia." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Opção alterada" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Opção removida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Opcional" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Opcional, anotações diversas sobre este aparelho" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" +"Em segundo, opcional. Caso seja definido como '0', nenhuma tentativa de " +"reconexão será feita." + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5795,7 +6514,7 @@ msgstr "" "Opcional. Marca 32 bits dos pacotes cifrados que estão saindo. Entre valores " "em hexadecimal, começando com 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5807,7 +6526,7 @@ msgstr "" "um servidor, use este sufixo (como '::1') para formar o endereço IPv6 ('a:b:" "c:d::1') para esta interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5815,11 +6534,11 @@ msgstr "" "Opcional. Adiciona uma camada extra de cifragem simétrica para resistência " "pós quântica." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Opcional. Cria rotas para endereços IP Autorizados para este parceiro." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Opcional. Descrição do parceiro." @@ -5827,7 +6546,7 @@ msgstr "Opcional. Descrição do parceiro." msgid "Optional. Do not create host routes to peers." msgstr "Opcional. Não criar rotas de acolhimento para os seus pares." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." @@ -5835,7 +6554,7 @@ msgstr "" "Opcional. Equipamento do parceiro. Nomes serão resolvido antes de levantar a " "interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5853,19 +6572,23 @@ msgstr "Opcional. Unidade máxima de transmissão da interface XFRM." msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Opcional. Unidade Máxima de Transmissão da interface do túnel." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Opcional. Porta do parceiro." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " "code if available. It can be removed after the configuration has been " "exported." msgstr "" +"Opcional. Chave privada dos pares do WireGuard. A chave não é obrigatória " +"para se estabelecer uma conexão, porém permite gerar uma configuração dos " +"pares ou o código QR, caso esteja disponível. Ele pode ser removido após a " +"exportação da configuração." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5882,7 +6605,7 @@ msgstr "Opcional. Porta UDP usada para pacotes saintes ou entrantes." msgid "Options" msgstr "Opções" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" para a rota padrão. 0.0.0.0.0 significa \"o endereço do " "sistema que executa dnsmasq\"." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "Opções:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Ordinal: o menor vem primeiro." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Intervalo do originador" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "Outro:" @@ -5917,7 +6649,7 @@ msgstr "Saída:" msgid "Outgoing checksum" msgstr "Checksum de saída" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "Interface de saída" @@ -5925,6 +6657,7 @@ msgstr "Interface de saída" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "Chave de Saída" @@ -5948,21 +6681,23 @@ msgstr "Zona de saída" msgid "Overlap" msgstr "Sobreposição" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "Substitua a tabela de roteamento IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "Substitua a tabela de roteamento IPv6" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5970,6 +6705,7 @@ msgstr "Substitua a tabela de roteamento IPv6" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "" "Sobrescrever o wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" +"Cole ou arraste uma configuração do WireGuard (geralmente wg0.conf) " +"de um outro sistema abaixo para criar uma entrada correspondente do par, " +"permitindo que o sistema se conecte à interface local do WireGuard." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" -msgstr "" +msgstr "Cole ou arraste o ficheiro fornecido da configuração WireGuard…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Caminho para o certificado da AC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Caminho para o Certificado do Cliente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Caminho para a Chave Privada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Caminho para o certificado AC interno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Caminho para o Certificado do Cliente interno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Caminho para a Chave Privada interna" @@ -6261,11 +7036,19 @@ msgstr "Pausado" msgid "Peak:" msgstr "Pico:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Par" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Detalhes do par" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Endereço IP do parceiro para atribuir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "Endereço MAC dos pares" @@ -6274,11 +7057,11 @@ msgstr "Endereço MAC dos pares" msgid "Peer address is missing" msgstr "O endereço do parceiro está ausente" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Nome do aparelho dos pares" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Par desativado" @@ -6309,25 +7092,29 @@ msgstr "Executar reset" msgid "Permission denied" msgstr "Permissão negada" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Manutenção da Conexão Persistente" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Intervalo de reconexão persistente" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" -msgstr "" +msgstr "A configuração PersistentKeepAlive está inválida" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:290 msgid "Phy Rate:" msgstr "Taxa física:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Definições Físicas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6340,11 +7127,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pcts." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Insira o seu username e password." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Por favor selecione o ficheiro para upload." @@ -6352,63 +7139,80 @@ msgstr "Por favor selecione o ficheiro para upload." msgid "Policy" msgstr "Política" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" -msgstr "" +msgstr "Política: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Porta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Porta %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Isolamento da porta" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Estado da porta:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Negação potencial de: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Modo de Gestão de Energia" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "" -"Erros CRC PreemptivosCRCP_P" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "Condição da energia" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Preferir LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Preferir UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Prefixo Delegado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "Supressor de prefixos" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Chave Compartilhada" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" -msgstr "" +msgstr "Chave pré-compartilhada em uso" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:308 msgid "PresharedKey setting is invalid" -msgstr "" +msgstr "A configuração da chave pré-compartilhada está inválida" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:130 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:102 @@ -6427,15 +7231,18 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Impede a comunicação cliente-a-cliente" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"Impede que um cliente sem fio converse com outro. Esta configuração afeta " +"apenas os pacotes sem qualquer tag VLAN (pacotes não marcados)." + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Escravo Primário" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "ID primária da VLAN" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6448,35 +7255,37 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "O primário torna-se um escravo ativo sempre que retornar (sempre, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Prioridade" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" -msgstr "" +msgstr "Privado" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "Privado (Impede a comunicação entre o MAC das VLANs)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Chave Privada" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" -msgstr "" +msgstr "Chave privada presente" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:296 msgid "PrivateKey setting is missing or invalid" -msgstr "" +msgstr "A configuração da chave privada está faltando ou está inválida" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:64 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:93 @@ -6488,8 +7297,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6501,7 +7310,7 @@ msgstr "Protocolo" msgid "Provide NTP server" msgstr "Fornecer serviço NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6509,7 +7318,7 @@ msgstr "" "Fornecer um servidor de DHCPv6 nesta interface e responder às solicitações e " "requerimentos do DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Prover nova rede" @@ -6518,26 +7327,39 @@ msgid "" "Provide the NTP server to the selected interface or, if unspecified, to all " "interfaces" msgstr "" +"Forneça um servidor NTP à interface selecionada ou, se não for definido, a " +"todas as interfaces" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Servidor proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Ad-Hoc Falso (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Chave Pública" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" -msgstr "" +msgstr "Falta a chave pública" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" -msgstr "" +msgstr "Chave pública: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6556,7 +7378,7 @@ msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:305 msgid "PublicKey setting is invalid" -msgstr "" +msgstr "A configuração PublicKey é inválida" #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:9 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:27 @@ -6567,59 +7389,83 @@ msgstr "Celular QMI" msgid "Quality" msgstr "Qualidade" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "Consultar todos os resolvedores disponíveis upstream." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Intervalo da consulta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Intervalo de resposta à consulta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "Validade da Chave R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "Detentor da Chave R1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Porta-Conta-Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Segredo-Conta-Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Servidor-Conta-Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Porta-Autenticação-Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Segredo-Autenticação-Radius" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Servidor-Autenticação-Radius" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "Atribuição dinâmica de VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "RADIUS por STA VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "Esquema de nomenclatura de pontes VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "Nomenclatura de VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "Interface com marcações de RADIUS VLAN" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "Modo NAT-T (RFC3947)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "Pré-autenticação RSN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "Limiar de RSSI para a adesão" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Limiar RTS/CTS" @@ -6632,14 +7478,22 @@ msgstr "RX" msgid "RX Rate" msgstr "Taxa RX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "Taxa RX / Taxa TX" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"Medição dos recursos do rádio - Envia sinais para auxiliar o roaming. Nem " +"todos os clientes são compatíveis." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" -msgstr "" +msgstr "Aleatorize o mapeamento da porta de origem" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" @@ -6647,11 +7501,11 @@ msgstr "" "Bytes brutos codificados em hexadecimal. Deixe vazio a não ser que seu " "provedor requeira isso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Ler /etc/ethers para configurar o servidor DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Deseja mesmo trocar o protocolo?" @@ -6659,11 +7513,11 @@ msgstr "Deseja mesmo trocar o protocolo?" msgid "Realtime Graphs" msgstr "Gráficos em Tempo Real" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Limite para Reassociação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Religar protecção" @@ -6687,11 +7541,39 @@ msgstr "Reinicia o seu aparelho" msgid "Receive" msgstr "Receber" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Dados recebidos" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Recomendado. Endereços IP da interface do WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Tempo limite da reconexão" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Reconetar esta interface" @@ -6699,51 +7581,63 @@ msgstr "Reconetar esta interface" msgid "Redirect to HTTPS" msgstr "Redireciona para HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" -msgstr "" +msgstr "Faça o redirecionamento à porta local %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" -msgstr "" +msgstr "Faça o redirecionamento ao sistema local" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:57 msgid "References" msgstr "Referências" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Atualiza os canais" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Atualizando" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "Estado do registo" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" -msgstr "" +msgstr "Rejeite o pacote IPv4 com o ICMP tipo %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" -msgstr "" +msgstr "Rejeite o pacote com o ICMP tipo %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" -msgstr "" +msgstr "Rejeite o pacote com o ICMPv6 tipo %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" -msgstr "" +msgstr "Rejeite o pacote com TCP reset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" +"Rejeita as decisões de roteamento que tenham um comprimento de prefixo menor " +"ou igual ao valor especificado" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Retransmissor" @@ -6753,6 +7647,12 @@ msgstr "Retransmissor" msgid "Relay Bridge" msgstr "Ponte de Relé" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"Retransmita as solicitações DHCP em outro lugar. OK: v4 v4↔, v6 v6↔. Não " +"está OK: v4 v6, v6↔v4↔." + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Encaminha o tráfego entre as redes" @@ -6762,6 +7662,14 @@ msgstr "Encaminha o tráfego entre as redes" msgid "Relay bridge" msgstr "Ponte de relé" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6771,6 +7679,7 @@ msgstr "Endereço IPv4 remoto" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Endereço IPv4 remoto ou FQDN" @@ -6783,15 +7692,25 @@ msgstr "Endereço IPV6 remoto" msgid "Remote IPv6 address or FQDN" msgstr "Endereço IPv6 remoto ou FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Remover" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" +"Remova os endereços IPv4 dos resultados e retorne apenas endereços IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" +"Remova os endereços IPv6 dos resultados e retorne apenas endereços IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "Remover configurações de aparelhos relacionados da configuração" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Substituir configuração wireless" @@ -6821,7 +7740,8 @@ msgstr "Exigir o checkum na entrada (opcional)." msgid "Require incoming packets serialization (optional)." msgstr "Exigir a serialização dos pacotes na entrada (opcional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Necessário" @@ -6836,10 +7756,11 @@ msgstr "Obrigatório. Chave privada codificada em Base64 para esta interface." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Required. Path to the .yml config file for this interface." msgstr "" +"Obrigatório. O caminho ao ficheiro de configuração .yml desta interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." -msgstr "" +msgstr "Obrigatório. Chave pública do par WireGuard." #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:42 msgid "Required. Underlying interface." @@ -6849,67 +7770,75 @@ msgstr "Obrigatório. Interface subjacente." msgid "Required. XFRM interface ID to be used for SA." msgstr "Obrigatório. ID da interface XFRM a ser usado para SA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" +"Necessário: Rejeita a autenticação se o servidor RADIUS não fornecer os " +"atributos de VLAN apropriados." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Requer hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Requer hostapd com suporte ao EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Requer hostapd com suporte de EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Requer hostapd com suporte de OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Requer hostapd com suporte de SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Requer hostapd com suporte WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Requer wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Requer wpa-supplocant com suporte do EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Requer wpa-supplicant com suporte de EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Requer wpa-supplicant com suporte de OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Requer wpa-supplicant com suporte de SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Requer wpa-supplicant com suporte WEP" @@ -6918,7 +7847,7 @@ msgid "Reselection policy for primary slave" msgstr "Política de nova seleção para o escravo primário" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6933,20 +7862,24 @@ msgstr "Limpar contadores" msgid "Reset to defaults" msgstr "Redefinir para os valores predefinidos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Ficheiros Resolv e Hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Resolver ficheiro" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Lista de domínios a forçar para um endereço IP." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Recurso não encontrado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Reiniciar" @@ -6955,7 +7888,7 @@ msgstr "Reiniciar" msgid "Restart Firewall" msgstr "Reiniciar Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Reinicie a interface do rádio" @@ -6967,7 +7900,7 @@ msgstr "Restauração" msgid "Restore backup" msgstr "Restaurar backup" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -6975,81 +7908,98 @@ msgstr "" "Retornar respostas às consultas de DNS que correspondam à sub-rede da qual a " "consulta foi recebida se vários IPs estiverem disponíveis." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Revelar/ocultar a palavra-passe" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "Filtro de caminho reverso" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Reverter" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Reverter as mudanças" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" "O pedido para reverter as configurações falhou com o estado %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Revertendo configurações…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "Revisão" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" -msgstr "" +msgstr "Substitua o destino para %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" -msgstr "" +msgstr "Substitua o destino para %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" +"Substitua o destino para %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" +"Substitua o destino para %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" -msgstr "" +msgstr "Substitua a origem para %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" -msgstr "" +msgstr "Substitua a origem para %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" -msgstr "" +msgstr "Substitua a origem para %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" -msgstr "" +msgstr "Substitua a origem para %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" +msgstr "Substitua com o endereço do aparelho de saída" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." msgstr "" +"Rede de segurança robusta (RSN): Permite a pré-autenticação do roaming para " +"redes WPA2-EAP (e as anuncia nos beacons WLAN). Só funciona se a interface " +"de rede especificada for uma ponte. Encurta o tempo do crítico processo de " +"reassociação." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Robustez" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -7067,19 +8017,19 @@ msgstr "Prepação da raiz (/)" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Política Round-Robin (balanço-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Roteie Andereços IP Autorizados" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" -msgstr "" +msgstr "Cadeia de ação rota \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Tipo de rota" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7099,6 +8049,10 @@ msgstr "Password do Router" msgid "Routing" msgstr "Roteamento" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Algoritmo de roteamento" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7113,24 +8067,24 @@ msgstr "" msgid "Rule" msgstr "Regra" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" -msgstr "" +msgstr "Ações da regra" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" -msgstr "" +msgstr "Comentário da regra: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" -msgstr "" +msgstr "Regra da cadeia de contentores \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" -msgstr "" +msgstr "Correspondências das regras" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Tipo da regra" @@ -7151,11 +8105,24 @@ msgstr "Erro de tempo de execução" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "SIMs" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7173,15 +8140,15 @@ msgstr "Porta do servidor SSH" msgid "SSH username" msgstr "Utilizador do SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "Chaves-SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7198,7 +8165,7 @@ msgstr "Servidor SSTP" msgid "SWAP" msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7209,7 +8176,7 @@ msgid "Save" msgstr "Guardar" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Gravar & Aplicar" @@ -7226,7 +8193,7 @@ msgstr "Gravar o bloco mtd" msgid "Save mtdblock contents" msgstr "Gravar o conteúdo do bloco mtd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Procurar" @@ -7235,11 +8202,16 @@ msgstr "Procurar" msgid "Scheduled Tasks" msgstr "Tarefas Agendadas" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "A secção %s está vazia." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Secção adicionada" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Secção removida" @@ -7257,9 +8229,9 @@ msgstr "" "do formato da imagem falhar. Use somente se você estiver confiante que a " "firmware está correta e é destinada para seu aparelho!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Selecione o ficheiro.…" @@ -7269,7 +8241,7 @@ msgstr "" "Seleciona a política de transmissão do hash para utilizar com a seleção dos " "escravos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7277,7 +8249,7 @@ msgstr "" "Enviar mensagens de RA publicitando este aparelho como um roteador de IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "Envie os redirecionamentos do ICMP" @@ -7298,11 +8270,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "Envie o nome do host deste aparelho" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Servidor" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Endereço do servidor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Nome do servidor" @@ -7327,18 +8303,22 @@ msgstr "A sessão expirou" msgid "Set Static" msgstr "Define como estático" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" -msgstr "" +msgstr "Defina o campo do cabeçalho %s para %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" "Define a interface como ser um escravo NDP-Proxy externo. A predefinição é " "estar desligado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7351,7 +8331,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "Defina o mesmo endereço MAC para todos os escravos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7362,7 +8342,7 @@ msgstr "" "Advertisement\">RA
    enviadas. Quando ativado, os clientes irão " "realizar a autoconfiguração de endereços IPv6 sem estado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7378,11 +8358,15 @@ msgstr "Definido como um escravo atualmente ativo (ativo, 1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "Definido como o primeiro escravo adicionado ao vínculo (seguir, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Configurar Servidor DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Configuração de rotas para vizinhos de IPv6 que fazem proxy." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7392,35 +8376,39 @@ msgstr "" "falhou" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "A configuração do modo de operação falhou" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Definições" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "Configuração de rotas para vizinhos de IPv6 que fazem proxy." - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" -"Segundos com erro severos (SES)" +"Configurações para auxiliar os clientes sem fio com o roaming entre vários " +"APs: 802.11r, 802.11k e 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "Intervalo de guarda curto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Preâmbulo curto" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Mostrar lista ficheiros para backup" @@ -7433,16 +8421,16 @@ msgstr "Mostrar correntes vazias" msgid "Show raw counters" msgstr "Mostrar contadores em bruto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Desligar esta interface" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7450,15 +8438,15 @@ msgstr "Desligar esta interface" msgid "Signal" msgstr "Sinal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Sinal / Ruído" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Atenuação do Sinal (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Qualidade do sinal" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Taxa de atualização do sinal" @@ -7466,12 +8454,12 @@ msgstr "Taxa de atualização do sinal" msgid "Signal:" msgstr "Sinal:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Tamanho" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Tamanho do cache de consultas DNS" @@ -7488,12 +8476,12 @@ msgstr "Saltar" msgid "Skip from backup files that are equal to those in /rom" msgstr "Ignore os ficheiros de backup que sejam iguais aos ficheiros em /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Ir para o conteúdo" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Ir para a navegação" @@ -7511,14 +8499,10 @@ msgstr "VLAN em Software" msgid "Some fields are invalid, cannot save values!" msgstr "Alguns campos são inválidos, não é possível gravar valores!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Lamento, o objecto que pediu não foi encontrado." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Lamento, o servidor encontrou um erro inesperado." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7529,8 +8513,8 @@ msgstr "" "firmware deve ser gravada manualmente. Por favor, consulte a wiki para " "instruções específicas da instalação deste aparelho." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7540,12 +8524,12 @@ msgstr "Origem" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:43 msgctxt "nft ip saddr" msgid "Source IP" -msgstr "" +msgstr "IP de origem" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:47 msgctxt "nft ip6 saddr" msgid "Source IPv6" -msgstr "" +msgstr "Origem IPv6" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 @@ -7555,9 +8539,9 @@ msgstr "Interface de origem" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:45 msgctxt "nft ip sport" msgid "Source port" -msgstr "" +msgstr "Porta de origem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7565,7 +8549,7 @@ msgstr "" "Opções de inicialização especiais PXE para o Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7574,7 +8558,7 @@ msgstr "" "Se não for especificado, o domínio de pesquisa DNS do aparelho local será " "anunciado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7585,12 +8569,16 @@ msgstr "" "servidor DNS IPv6, a menos que a opção Servidor de DNS IPv6 local " "esteja desativada." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " "corresponding range" msgstr "" +"Especifica um UID individual ou uma gama de UIDs para que haja " +"correspondência, por exemplo, 1000 para condizer com a UID correspondente ou " +"1000-1005 para coincidir inclusive com todas as UDs dentro de um determinado " +"intervalo" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:343 msgid "" @@ -7615,23 +8603,23 @@ msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" "Especifica a frequência de monitoramento do enlace MII em milissegundos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" -msgstr "" +msgstr "Especifica o valor TOS para corresponder nos cabeçalhos IP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:261 msgid "Specifies the aggregation selection logic to use" msgstr "Especifica a lógica de seleção da agregação que será utilizada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" -msgstr "" +msgstr "Especifica a sub-rede de destino que será correspondida (notação CIDR)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 msgid "Specifies the directory the device is attached to" msgstr "Especifica o diretório que o aparelho está conectado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7641,21 +8629,26 @@ msgstr "" "do roteador\">RA, por exemplo, para instruir os clientes que " "solicitem mais informações através do estado do DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" +"Especifica o fwmark e, opcionalmente, a máscara coincidente, por exemplo, " +"0xFF que corresponda a marca 255 ou 0x0/0x1 para coincidir com qualquer " +"valor marcado como par" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" -msgstr "" +msgstr "Especifica o nome da interface lógica de entrada" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 msgid "" "Specifies the logical interface name of the parent (or master) interface " "this route belongs to" msgstr "" +"Especifica o nome da interface lógica da interface principal (ou mestre) à " +"qual esta rota pertence" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:254 msgid "" @@ -7682,7 +8675,7 @@ msgstr "" "Especifica a quantidade máxima de segundos antes de considerar que um " "equipamento está morto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7704,12 +8697,15 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "Especifica o modo de ligação que será utilizado por esta interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " "0.0.0.0 no gateway will be specified for the route" msgstr "" +"Especifica o gateway da rede. Se for omitido, o gateway da interface " +"principal é usado, caso contrário, cria uma rota de escopo do enlace. Se " +"definido como 0.0.0.0, nenhum gateway será especificado à rota" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:334 msgid "" @@ -7745,19 +8741,21 @@ msgstr "" "ligação envia os pacotes de aprendizado para cada comutador dos pares " "escravos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" -msgstr "" +msgstr "Especifica a ordem das regras de IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" -msgstr "" +msgstr "Especifica o nome da interface lógica de saída" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" msgstr "" +"Especifica o endereço preferencial de origem ao enviar aos destinos cobertos " +"pelo alvo" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:375 msgid "Specifies the quantity of ARP IP targets that must be reachable" @@ -7780,21 +8778,21 @@ msgstr "" "Determina a política da nova seleção para o escravo primário quando ocorre " "uma falha do escravo ativo ou durante a recuperação do escravo primário" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" -msgstr "" +msgstr "Especifica a métrica da rota que será usada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" -msgstr "" +msgstr "Especifica o tipo de rota que será criado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" -msgstr "" +msgstr "Especifica a ação de roteamento de destino de regra" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" -msgstr "" +msgstr "Especifica a sub-rede de origem para ser correspondida (notação CIDR)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:246 msgid "Specifies the system priority" @@ -7816,7 +8814,7 @@ msgstr "" "Determina o tempo em milissegundos da espera antes que um escravo seja " "ativado após a detecção de recuperação do enlace" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7940,15 +8938,23 @@ msgstr "" "Especifica a unidade máxima de transmissão (MTU) ao invés do valor predefinido (1280 bytes)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Especifique a chave de cifragem secreta aqui." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "Splitterless ADSL (G.992.2) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "Obsolescência do tempo limite do cache vizinho" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Iniciar" @@ -7961,16 +8967,16 @@ msgstr "Iniciar WPS" msgid "Start priority" msgstr "Prioridade de inicialização" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Iniciar atualização" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Iniciando a aplicação da configuração…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Iniciando a varredura da rede wireless..." @@ -7979,6 +8985,10 @@ msgstr "Iniciando a varredura da rede wireless..." msgid "Startup" msgstr "Iniciação" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Estado" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Rotas Estáticas IPv4" @@ -7992,7 +9002,7 @@ msgstr "Rotas Estáticas IPv6" msgid "Static Lease" msgstr "Concessão estática" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Atribuições Estáticas" @@ -8002,7 +9012,7 @@ msgstr "Atribuições Estáticas" msgid "Static address" msgstr "Endereço estático" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -8013,18 +9023,18 @@ msgstr "" "configurações não dinâmicas onde um computador com a alocação correspondente " "é provido." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Limite de inatividade da estação" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Estado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Parar" @@ -8033,8 +9043,8 @@ msgstr "Parar" msgid "Stop WPS" msgstr "Parar o WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Parar a atualização" @@ -8042,11 +9052,11 @@ msgstr "Parar a atualização" msgid "Storage" msgstr "Uso do armazenamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "Filtragem rigorosa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Ordem exacta" @@ -8055,15 +9065,15 @@ msgid "Strong" msgstr "Forte" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Submeter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Suprimir registros (log)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "Suprimir registos (log) de operações rotineiras do protocolo DHCP." @@ -8096,7 +9106,7 @@ msgstr "Mudar VLAN" msgid "Switch port" msgstr "Porta do switch" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Trocar o protocolo" @@ -8106,7 +9116,7 @@ msgstr "Trocar o protocolo" msgid "Switch to CIDR list notation" msgstr "Mudar para a notação CIDR de listas" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Ligação simbólica" @@ -8118,8 +9128,16 @@ msgstr "Sincronizar com o servidor NTP" msgid "Sync with browser" msgstr "Sincronizar com o browser" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Sintaxe: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Sintaxe: _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -8143,9 +9161,9 @@ msgstr "Propriedades do Sistema" msgid "System log buffer size" msgstr "Tamanho do buffer de registro do sistema" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "Sistema em execução no modo de recuperação (initramfs)." @@ -8153,28 +9171,28 @@ msgstr "Sistema em execução no modo de recuperação (initramfs)." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:67 msgctxt "nft tcp option maxseg size" msgid "TCP MSS" -msgstr "" +msgstr "TCP MSS" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:54 msgctxt "nft tcp dport" msgid "TCP destination port" -msgstr "" +msgstr "Porta de destino TCP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:57 msgctxt "nft tcp flags" msgid "TCP flags" -msgstr "" +msgstr "Sinalizadores TCP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:53 msgctxt "nft tcp sport" msgid "TCP source port" -msgstr "" +msgstr "Porta de origem TCP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:338 msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Raíz do servidor TFTP" @@ -8187,26 +9205,37 @@ msgstr "TX" msgid "TX Rate" msgstr "Taxa de TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "Comprimento da fila TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tabela" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Marcado" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Destino" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "Plataforma alvo" @@ -8222,7 +9251,7 @@ msgstr "Espaço temporário" msgid "Terminate" msgstr "Terminar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8232,7 +9261,7 @@ msgstr "" "nas mensagens do RA. O mínimo são 1280 bytes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." @@ -8240,7 +9269,7 @@ msgstr "" "A configuração do endereço gerenciado o (M) indica que os endereços " "IPv6 estão disponíveis via DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -8248,7 +9277,7 @@ msgstr "" "O Agente doméstico móvel IPv6 (H) indica que o aparelho também está " "agindo como um agente doméstico móvel IPv6 nesta ligação." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8265,8 +9294,14 @@ msgid "" "The qrencode package is required for generating an QR code image of " "the configuration." msgstr "" +"É preciso instalar o pacote qrencode para gerar uma imagem de " +"código QR da configuração." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8282,18 +9317,24 @@ msgstr "" "A configuração da atualização de pontas HE.net mudou. Você deve agora usar o " "nome do utilizador ao invés do identificador do utilizador!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "O endereço IP %h já é utilizado por outra concessão estática" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "O endereço IP está fora de qualquer faixa de endereços do DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "O endereço IP do servidor de inicialização" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "O endereço IPV4 remoto ou o seu FQDN." @@ -8301,6 +9342,7 @@ msgstr "O endereço IPV4 remoto ou o seu FQDN." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "O endereço IPv4 ou o nome completo (FQDN) da ponta remota do túnel." @@ -8317,6 +9359,12 @@ msgstr "" "O endereço IPv6 ou o FQDN (nome de domínio totalmente qualificado) da " "extremidade do túnel remoto." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8329,7 +9377,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "O LED pisca com a frequência configurada de ligar/desligar" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "O LED pisca para simular o batimento cardíaco real." @@ -8347,7 +9395,7 @@ msgstr "O LED está sempre no estado padrão desligado." msgid "The LED is always in default state on." msgstr "O LED está sempre no estado padrão ligado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" @@ -8355,15 +9403,19 @@ msgstr "" "O endereço MAC %h já está sendo usado por outra concessão estática na mesma " "faixa do DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "O MTU não deve exceder o MTU do aparelho de origem com %d bytes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "A ID da VLAN deve ser única" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "O algoritmo que é utilizado para descobrir rotas mesh" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8376,7 +9428,7 @@ msgid "The configuration file could not be loaded due to the following error:" msgstr "" "O ficheiros de configuração não pode ser carregado devido ao seguinte erro:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8384,7 +9436,7 @@ msgstr "" "O SSID correto deve ser manualmente especificado quando entrar numa rede sem " "fios oculta" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8411,12 +9463,12 @@ msgstr "" "O ficheiro do aparelho de memória ou da partição (ex. /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "O nome do aparelho \"%s\" já está em uso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." @@ -8424,7 +9476,7 @@ msgstr "" "A configuração existente da rede precisa ser alterada para que o LuCI " "funcione corretamente." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8447,7 +9499,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "As seguintes regras estão actualmente acivas neste sistema." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" "A frequência está na proporção direta de 1 minuto de carga média da CPU." @@ -8456,17 +9508,19 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "O endereço do gateway não deve ser um endereço IP local" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" +"A configuração gerada pode ser importada para uma aplicação cliente " +"WireGuard para configurar uma conexão neste aparelho." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "A chave pública SSH dada já foi adicionada." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8474,15 +9528,35 @@ msgstr "" "A chave pública SSH dada é inválida. Por favor, forneça chaves RSA ou ECDSA " "públicas adequadas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"A configuração de penalidade do salto permite modificar a preferência do " +"batman-adv para as rotas multihop versus rotas curtas. O valor é aplicado ao " +"TQ de cada OGM encaminhado, propagando assim o custo de um salto extra (o " +"pacote deve ser recebido e retransmitido, o que custa tempo de antena)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "O nome do host do servidor de inicialização" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "A interface não pôde ser encontrada" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "O nome da interface já está a ser usado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "O nome da interface é muito longo" @@ -8506,6 +9580,7 @@ msgstr "O endereço IPv4 local" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "O endereço IPv4 local sobre o qual o túnel será criado (opcional)." @@ -8520,7 +9595,7 @@ msgstr "A máscara de rede do IPv4 local" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "O endereço IPv6 local sobre o qual o túnel será criado (opcional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8535,7 +9610,7 @@ msgstr "" "saída\" da rede. Um valor reduzido resulta num menor tempo para detetar a " "perda do último membro de um grupo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8548,7 +9623,7 @@ msgstr "" "menor, uma vez que as respostas do host são espalhadas através de intervalo " "maior" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8556,13 +9631,15 @@ msgstr "" "A quantidade máxima de saltos que serão publicados nas mensagens do RA. O máximo são 255 saltos." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" +"O acesso à rede neste aparelho pode ser interrompido ao alterar as " +"configurações da interface \"%h\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "O nome da rede já está a ser usado" @@ -8583,14 +9660,17 @@ msgstr "" "ascendente para uma ligação para a rede acima como a Internet ou outras " "portas de uma rede local." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" +"O nome de host público ou o endereço IP deste sistema onde o peer deve se " +"conectar. Geralmente é um endereço IP público estático, um nome de host " +"estático ou um domínio DDNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" "O intervalo de resposta da consulta deve ser menor que o valor do intervalo " @@ -8605,7 +9685,7 @@ msgstr "O comando reboot falhou com o código %d" msgid "The restore command failed with code %d" msgstr "O comando restore falhou com o código %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8615,24 +9695,30 @@ msgstr "" "Caso seja previsto que uma rede tenha perdas, o valor de robustez pode ser " "aumentado. O IGMP é robusto para perdas de pacotes (Robustness-1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" +"O destino da regra é um salto para outra regra especificada pelo seu valor " +"prioritário" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" +"O alvo da regra é um ID de pesquisa da tabela: um índice da tabela numérica " +"que varia entre 0 até 65535 ou um símbolo alias declarados em /etc/iproute2/" +"rt_tables. Pseudônimos locais especiais (255), principal (254) e padrão " +"(253) também são válidos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "O modo %s selecionado é incompatível com a criptografia %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "A chave eletrônica enviada é inválida ou já expirou!" @@ -8672,6 +9758,14 @@ msgstr "A palavra-passe do sistema foi modificada com êxito." msgid "The sysupgrade command failed with code %d" msgstr "O comando sysupgrade falhou com o código %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8698,30 +9792,42 @@ msgstr "" "A imagem carregada não contém um formato suportado. Confirme que escolhe uma " "imagem genérica para a sua plataforma." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "O valor é substituído pela configuração. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "O valor é substituído pela configuração." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" +"O valor determina o intervalo (em milissegundos) onde o batman-adv inunda a " +"rede com as suas informações de protocolo." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" +"Existem regras legadas do iptables presentes no sistema. A mistura das " +"regras do iptables com o nftables é desencorajada e pode levar a uma " +"incompleta filtragem de tráfego." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Não há arrendamentos ativos" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Não há alterações a serem aplicadas" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8734,16 +9840,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "Este endereço IPv4 do repassar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Este tipo de autenticação não é aplicável ao método EAP selecionado." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Isto não parece ser um ficheiro PEM válido" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8762,6 +9868,24 @@ msgstr "" "Isto é a \"Update Key\" configurada para o túnel ou a palavra-passe da conta " "se não tem uma \"Update Keu\" configurada" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Este é o aparelho batman-adv ao qual deseja vincular o aparelho físico de " +"cima. Caso esta lista esteja vazia, precisará criar uma primeiro. Caso " +"queira rotear o tráfego mesh num aparelho de rede com fio, selecione-o no " +"seletor de aparelhos acima. Caso queira atribuir a interface batman-adv a " +"uma mesh Wi-fi, não selecione um aparelho no seletor de aparelhos, mas vá " +"para as configurações sem fio e selecione essa interface como uma rede a " +"partir daí." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8778,7 +9902,7 @@ msgstr "" "Este é o endereço da ponta local designado pelo agente de túnel. normalmente " "ele termina com ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "Este é o único servidor DHCP na rede local." @@ -8811,8 +9935,8 @@ msgid "" msgstr "" "Esta lista fornece uma visão geral sobre os processos em execução no sistema." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8828,33 +9952,41 @@ msgstr "Esta secção ainda não contém valores" msgid "Time Synchronization" msgstr "Sincronização Horária" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Tempo do anúncio" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "O tempo em milissegundos" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "Tempo em segundos para gastar na condição de escuta e aprendizagem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Intervalo de tempo para rekeying GTK" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Fuso horário" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "Tempo esgotado" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "Tempo limite em segundos" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" "Tempo limite em segundos para os endereços MAC aprendidos no banco de dados " "do encaminhamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" "O tempo limite em segundos até que a topologia faça a atualização da perda " @@ -8864,16 +9996,16 @@ msgstr "" msgid "Timezone" msgstr "Fuso Horário" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Para fazer login…" +"Para configurar totalmente a interface local do WireGuard a partir de um " +"ficheiro de configuração já existente (por exemplo, fornecido pelo " +"provedor), use a importação da configuração ." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" @@ -8885,7 +10017,7 @@ msgstr "" "de backup gerado anteriormente. Para voltar as definições originais do " "firmware, clique \" Repor (só possível com imagens squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Tom" @@ -8893,12 +10025,16 @@ msgstr "Tom" msgid "Total Available" msgstr "Total Disponível" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "Código de rasteamento da área" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8910,14 +10046,14 @@ msgstr "Tráfego" msgid "Traffic Class" msgstr "Classe de tráfego" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" -msgstr "" +msgstr "Cadeia do filtro de tráfego \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" -msgstr "" +msgstr "Tráfego correspondente à regra: %.1000mPacotes, %.1024mBytes" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:387 msgid "Transfer" @@ -8931,20 +10067,40 @@ msgstr "Transmitir" msgid "Transmit Hash Policy" msgstr "Política de Transmissão do Hash" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Dados transmitidos" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" -msgstr "" +msgstr "Bits do cabeçalho de transporte %d-%d" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:59 msgctxt "nft th dport" msgid "Transport header destination port" -msgstr "" +msgstr "Porta de destino do cabeçalho de transporte" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:58 msgctxt "nft th sport" msgid "Transport header source port" -msgstr "" +msgstr "Porta de origem do cabeçalho de transporte" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:75 msgid "Trigger" @@ -8969,7 +10125,7 @@ msgstr "Interface de Túnel" msgid "Tunnel Link" msgstr "Enlace do túnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Aparelho de túnel" @@ -8978,25 +10134,25 @@ msgid "Tx-Power" msgstr "Potência de Tx" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Tipo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Tipo do serviço" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:56 msgctxt "nft udp dport" msgid "UDP destination port" -msgstr "" +msgstr "Porto de destino UDP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:55 msgctxt "nft udp sport" msgid "UDP source port" -msgstr "" +msgstr "Porta de origem UDP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:328 msgid "UDP:" @@ -9033,13 +10189,13 @@ msgstr "Não foi possível determinar o endereço IP externo" msgid "Unable to determine upstream interface" msgstr "Não foi possível determinar a interface com a rede externa" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Não é possível a expedição" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:85 msgid "Unable to generate QR code: %s" -msgstr "" +msgstr "Não foi possível gerar o código QR: %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:9 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:15 @@ -9084,21 +10240,31 @@ msgstr "Incapaz de reiniciar o firewall: %s" msgid "Unable to save contents: %s" msgstr "Incapaz de gravar conteúdos: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." msgstr "" -"Segundos de indisponibilidade (UAS)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "Não foi possível verificar o PIN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Desconfigurar" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Formato de dados de resposta inesperado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -9116,7 +10282,7 @@ msgstr "" msgid "Unknown" msgstr "Desconhecido" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Método de ligação desconhecido e sem suporte." @@ -9140,11 +10306,11 @@ msgstr "Não gerido" msgid "Unmount" msgstr "Desmontar" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Chave sem nome" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Alterações não Guardadas" @@ -9160,17 +10326,27 @@ msgstr "" "Port\">MAP não suportado" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Modem não suportado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Protocolo não suportado" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Tipo de protocolo não suportado." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Não marcado" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" -msgstr "" +msgstr "Par sem título" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 msgid "Up" @@ -9180,7 +10356,7 @@ msgstr "Acima" msgid "Up Delay" msgstr "Atraso de Envio" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Enviar" @@ -9197,25 +10373,29 @@ msgstr "" msgid "Upload archive..." msgstr "Enviar arquivo..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Enviar ficheiro" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Enviar ficheiro…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "O envio foi cancelado" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Pedido de envio falhou: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Enviando o ficheiro…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9225,7 +10405,7 @@ msgstr "" "com um nome na forma wifinet# e a rede será reiniciada para aplicar " "a configuração atualizada." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -9233,7 +10413,7 @@ msgstr "" "Ao pressionar \"Continuar\", a configuração das pontes será atualizada e a " "rede será reiniciada para aplicar a atualização da configuração." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -9241,20 +10421,24 @@ msgstr "" "Ao pressionar \"Continuar\", as opções ifname serão renomeadas e a rede será " "reiniciada para aplicar a atualização da configuração." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "Os resolvedores upstream serão consultados na ordem do ficheiro resolv." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Tempo de atividade" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Usar /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Utilizar DHCP" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Usar servidores DHCP anunciados" @@ -9263,13 +10447,18 @@ msgstr "Usar servidores DHCP anunciados" msgid "Use DHCP gateway" msgstr "Usar a gateway do DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Utilizar DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Usar os servidores DNS fornecidos pelo parceiro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Usar códigos de países ISO/IEC 3166 alpha2." @@ -9319,22 +10508,25 @@ msgstr "Usar como o sistema de ficheiros raiz (/)" msgid "Use broadcast flag" msgstr "Use a marcação de broadcast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Use o gestão do IPv6 embarcado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Usar servidores DNS personalizados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Usar gateway pre-definida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Use a métrica do roteador" @@ -9358,17 +10550,17 @@ msgstr "Usar tabela de roteamento" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:63 msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" -msgstr "" +msgstr "Use a mesma origem e o mesmo destino em cada conexão" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Usar certificados de sistema" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "Usar certificados de sistema para o túnel interno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9399,11 +10591,11 @@ msgstr "" msgid "Used" msgstr "Usado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Posição da Chave Usada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9411,59 +10603,61 @@ msgstr "" "Utilizado para dois fins diferentes: RADIUS NAS ID e 802.11r R0KH-ID. Não é " "necessário com WPA(2)-PSK normal." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Grupo do Utilizador" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Certificado do utilizador (codificado em formato PEM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" -msgstr "" +msgstr "Identificador do utilizador" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Chave do utilizador (codificada em formato PEM)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Nome do utilizador" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" -msgstr "" +msgstr "Utilize a tabela de fluxo %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (Agregador Virtual das Portas Ethernet)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "ID da VLAN" @@ -9483,24 +10677,27 @@ msgstr "Endereço Local da VPN" msgid "VPN Local port" msgstr "Porta Local da VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "Protocolo de VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Servidor VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "Hash do certificado VPN Server SHA256" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Porta do Servidor VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "Resumo digital SHA1 do certificado do servidor VPN" @@ -9509,6 +10706,10 @@ msgstr "Resumo digital SHA1 do certificado do servidor VPN" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (VPN do CISCO 3000 (e outros))" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9522,7 +10723,7 @@ msgstr "Identificador de rede VXLAN" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9530,8 +10731,8 @@ msgstr "" "Validar respostas do DNS e o cache de dados DNSSEC, requer upstream para " "suportar DNSSEC." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9559,7 +10760,7 @@ msgstr "Fabricante" msgid "Vendor Class to send when requesting DHCP" msgstr "Classe do fabricante para enviar quando requisitar o DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" "Verifique se as respostas dos domínios não assinados vêm realmente de " @@ -9569,12 +10770,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Verificando o ficheiro de imagem enviado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Muito alto" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Ethernet virtual" @@ -9582,34 +10783,46 @@ msgstr "Ethernet virtual" msgid "Virtual dynamic interface" msgstr "Interface virtual dinâmica" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "Sistema Aberto WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Chave partilhada WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Palavra-Passe WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "Roaming WLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Modo WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "Modo de suspensão do WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "Correções do modo de suspensão do WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Palavra-Passe WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9639,7 +10852,17 @@ msgstr "" msgid "Weak" msgstr "Fraco" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Peso" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." @@ -9647,13 +10870,61 @@ msgstr "" "Ao delegar diversos prefixos, as interfaces com um valor de preferência mais " "alta são as primeiras que são consideradas durante a alocação das sub-redes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Quando for ativado, a codificação da rede aumenta a saída WiFi através da " +"combinação de vários quadros num único quadro, reduzindo assim o tempo " +"necessário." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Quando for ativado, a tabela ARP forma uma ampla rede mesh distribuída da " +"cache ARP que auxilia os clientes fora do mesh a obter respostas ARP com " +"muito mais confiabilidade e sem muito atraso." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" +"Quando ativado, o gateway vai estar ligado ainda que o gateway não " +"corresponda a nenhum prefixo da interface" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Quando ativado, as novas entradas da tabela ARP são adicionadas a partir das " +"solicitações ou das respostas gratuitas de APR que forem recebidas, caso " +"contrário, apenas as entradas preexistentes da tabela serão atualizadas, mas " +"nenhum novo host será recebido." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Quando invertido, o LED fica continuamente aceso e pisca em vez de estar " +"desligado por padrão e continua piscando durante a atividade do sistema." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Ao executar a rede mesh em várias interfaces WiFi por nó, o batman-adv é " +"capaz de otimizar o fluxo de tráfego para obter o máximo de desempenho." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9663,7 +10934,7 @@ msgstr "" "as opções de tecla R0/R1 abaixo não são aplicadas. Desativar para usar as " "opções das teclas R0 e R1." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9671,7 +10942,7 @@ msgstr "" "Quando o modo QoS Multimídia Wi-Fi (WMM) estiver desativado, os clientes " "podem ser limitados a taxas do 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9680,18 +10951,27 @@ msgstr "" "a eficiência do tempo de conexão pode ser significativamente reduzida." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Largura" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Estado do WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "VPN WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" -msgstr "" +msgstr "O par do WireGuard está desativado" #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:17 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:10 @@ -9705,21 +10985,21 @@ msgid "Wireless Adapter" msgstr "Adaptador Wireless" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Rede Wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Vista Global Wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Segurança Wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Migração da configuração wrieless" @@ -9735,15 +11015,15 @@ msgstr "Wireless desativada" msgid "Wireless is not associated" msgstr "Wireless não associada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Wireless está desativado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "A rede wireless está ativada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Escrever as consultas DNS recebidas no syslog." @@ -9755,7 +11035,7 @@ msgstr "Escrever registro do sistema (log) no ficheiro" msgid "XOR policy (balance-xor, 2)" msgstr "Política XOR (balanço-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9785,8 +11065,20 @@ msgstr "" "como por exemplo \"rede/network\", o aparelho poderá tornar-se inacessível!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Pode adicionar vários registos ao mesmo destino." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Pode adicionar vários registos ao mesmo domínio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "Pode adicionar distribuições únicas no mesmo endereço de escuta." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9821,34 +11113,56 @@ msgstr "Configurações do ZRam" msgid "ZRam Size" msgstr "Tamanho do ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Observação: embora o " +"_http seja possível, nenhum navegador suporta registos SRV.)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "qualquer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "automático" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automático" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automático (desativado)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automático (ativado)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "em ponte" @@ -9903,27 +11217,32 @@ msgstr "dBm" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:73 msgctxt "nft unit" msgid "day" -msgstr "" +msgstr "dia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "desativar" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "desativado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "predefinição do driver" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "padrão do driver (%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "p. ex.: --proxy 10.10.10.10.10" @@ -9932,14 +11251,23 @@ msgstr "p. ex.: --proxy 10.10.10.10.10" msgid "e.g: dump" msgstr "p.ex.: despejo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "ativado" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "a cada %ds" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "expirou" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "imposto" @@ -9949,33 +11277,33 @@ msgstr "imposto" msgid "forward" msgstr "encaminhar" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "duplex completo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "meio duplex" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "valor codificado hexadecimal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "escondido" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:74 msgctxt "nft unit" msgid "hour" -msgstr "" +msgstr "hora" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "modo híbrido" @@ -9983,6 +11311,10 @@ msgstr "modo híbrido" msgid "ignore" msgstr "ignorar" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9997,24 +11329,32 @@ msgstr "chave entre 8 e 63 caracteres" msgid "key with either 5 or 13 characters" msgstr "chave com 5 ou 13 caracteres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "configuração gerenciada (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "segurança média" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:75 msgctxt "nft unit" msgid "minute" -msgstr "" +msgstr "minuto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minutos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "agente doméstico móvel (H)" @@ -10026,18 +11366,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "não" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "sem link" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "sem substituição" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "valor não vazio" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "nenhum" @@ -10048,20 +11396,20 @@ msgid "not present" msgstr "não presente" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "desligado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "no prefixo disponível" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "rede aberta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "outra configuração (O)" @@ -10070,10 +11418,14 @@ msgstr "outra configuração (O)" msgid "output" msgstr "saída" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "mais de um dia atrás" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" -msgstr "" +msgstr "pacotes" #: modules/luci-base/htdocs/luci-static/resources/validation.js:252 msgid "positive decimal value" @@ -10087,23 +11439,34 @@ msgstr "valor inteiro positivo" msgid "random" msgstr "aleatório" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "gerado aleatoriamente" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" +"reduz a sobrecarga coletando e agregando mensagens originais num único " +"pacote em vez de diversas outras pequenas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "modo retransmissor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "roteado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "seg" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "modo servidor" @@ -10111,7 +11474,7 @@ msgstr "modo servidor" msgid "sstpc Log-level" msgstr "Nível do registro log sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "segurança forte" @@ -10119,7 +11482,7 @@ msgstr "segurança forte" msgid "tagged" msgstr "etiquetado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "unidades de tempo (TUs / 1.024 ms) [1000-65535]" @@ -10133,25 +11496,27 @@ msgstr "" "Protocol\">HTTP
    ou HTTPS." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "valor único" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "desconhecido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "versão desconhecida" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "ilimitado" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -10173,8 +11538,8 @@ msgid "untagged" msgstr "não etiquetado" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "endereço IP válido" @@ -10187,7 +11552,7 @@ msgid "valid IPv4 CIDR" msgstr "CIDR IPv4 válido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "endereço IPv4 válido" @@ -10216,7 +11581,7 @@ msgid "valid IPv6 CIDR" msgstr "CIDR IPv6 válido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "endereço IPv6 válido" @@ -10253,8 +11618,8 @@ msgstr "identificador UCI, nome de host ou endereço IP válido" msgid "valid address:port" msgstr "endereço:porto válido" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "data válida (AAAAA-MM-DD)" @@ -10294,11 +11659,23 @@ msgstr "valor inteiro válido" msgid "valid multicast MAC address" msgstr "endereço MAC multicast válido" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"nome de aparelho de rede válido entre 1 e 15 caracteres não contendo \":\", " +"\"/\", \"%\" ou espaços" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "nome do aparelho de rede válido, não \".\" ou \"..\"" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "rede válida em notação de endereço/máscara de rede" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "dígito válido do telefone (0-9, \"*\", \"#\", \"!\" ou \".\")" @@ -10308,50 +11685,50 @@ msgid "valid port or port range (port1-port2)" msgstr "porta ou intervalo de portas válido (porta1-porta2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "valor de porta válido" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "tempo válido (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "valor entre caracteres %d e %d" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "valor entre %f e %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "valor maior ou igual a %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "valor menor ou igual a %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "valor com caracteres %d" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "valor com pelo menos %d caracteres" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "valor com o máximo de %d caracteres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "segurança fraca" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:72 msgctxt "nft unit" msgid "week" -msgstr "" +msgstr "semana" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 msgid "yes" diff --git a/package/luci/modules/luci-base/po/pt_BR/base.po b/package/luci/modules/luci-base/po/pt_BR/base.po index 3792a20dbc..134203a5c0 100644 --- a/package/luci/modules/luci-base/po/pt_BR/base.po +++ b/package/luci/modules/luci-base/po/pt_BR/base.po @@ -3,34 +3,50 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:41+0200\n" -"PO-Revision-Date: 2022-11-23 11:36+0000\n" +"PO-Revision-Date: 2023-08-08 18:51+0000\n" "Last-Translator: Wellington Terumi Uemura \n" "Language-Team: Portuguese (Brazil) \n" +"librecmc/luci/pt_BR/>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.0-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" tabela \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d campo(s) inválido(s)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d horas atrás" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d meses atrás" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d segundos atrás" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s está sem etiqueta em múltiplas VLANs!" @@ -55,10 +71,11 @@ msgstr "(vazio)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(nenhuma interface conectada)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d mais" @@ -68,19 +85,19 @@ msgid "-- Additional Field --" msgstr "-- Campo Adicional --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Por favor, escolha --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- personalizado --" @@ -93,9 +110,7 @@ msgstr "-- casar por rótulo --" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:257 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:363 msgid "-- match by uuid --" -msgstr "" -"-- casar por UUID --" +msgstr "-- correspondência por uuid --" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:27 #: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:44 @@ -108,7 +123,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = não usando limiar de RSSI, 1 = não alterar padrão do driver" @@ -121,13 +136,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Carga 1 Minuto:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "1 sinalizador" msgstr[1] "%d sinalizadores" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "Carga 15 Minutos:" @@ -142,12 +162,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "Identificador hexadecimal de 4 caracteres" @@ -160,47 +185,109 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Carga 5 Minutos:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" "Identificador de 6 octetos como uma cadeia hexadecimal - sem dois pontos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: Ativa o relatório do sinal através das medições do rádio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Ativa o relatório vizinho através das medições do rádio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "Transição Rápida 802.11r" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: Ociosidade MAX do BSS. Unidades: segundos." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" +"802.11v: gerenciamento de transição do conjunto dos serviços básicos (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Anúncio do fuso horário local em quadros de gerenciamento." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: O proxy ARP permite que o AP não STA permaneça em economia de " +"energia por mais tempo." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Anúncio de tempo em quadros de gerenciamento." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Modo de espera do gerenciamento de rede sem fio (WNM) (modo de " +"espera estendido para as estações)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Correções do modo de suspensão do gerenciamento de rede sem fio " +"(WNM): previne ataques de reinstalação." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "Tempo de expiração máximo da consulta da Associação SA do 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" "Tempo de expiração de tentativa de consulta da Associação SA do 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "Proteção do Quadro de Gerenciamento do 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "Estouro de tempo máximo do 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "Estouro de tempo da nova tentativa do 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "" "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "" "Máscara de rede IPv4" @@ -213,30 +300,46 @@ msgstr "Configuração do LED" msgid "LED Name" msgstr "Nome do LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-Proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA Flags" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA Limite do salto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA Tempo de vida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-Serviço" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ corresponde a qualquer domínio. /example.com/ " +"retorna NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# retorna endereços NULL (0.0.0.0 e " +"::) para example.com e os seus subdomínios." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -282,11 +385,23 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s não está no conjunto %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"Um nó batman-adv pode funcionar em modo servidor (compartilhando a sua " +"ligação à Internet com mesh) ou em modo cliente (procurando a ligação à " +"Internet mais adequada no mesh) ou tendo o suporte de gateway totalmente " +"desligado (que é a configuração padrão)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Uma configuração para o dispositivo \"%s\" já existe" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Um diretório com o mesmo nome já existe." @@ -294,30 +409,93 @@ msgstr "Um diretório com o mesmo nome já existe." msgid "A new login is required since the authentication session expired." msgstr "Uma nova autenticação é necessária já que a sessão expirou." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" -msgstr "" -"ADSL" +msgstr "ADSL" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (todas as variantes) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (todas as variantes) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (todas as variantes) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (todas as variantes) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (todas as variantes) Annex B/J" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (todas as variantes) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (todas as variantes) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annex L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" -msgstr "APN" +msgstr "APN" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:353 msgid "ARP" @@ -345,37 +523,42 @@ msgstr "O monitoramento ARP não é compatível com a política selecionada!" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 msgid "ARP retry threshold" -msgstr "" -"Limite de retentativas do ARP" +msgstr "Limite de repetição ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "Tabela de tráfego ARP \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"ARP, IPv4 e IPv6 (até mesmo 802.1Q) com os MACs do destino multicast em " +"unicast para o endereço MAC STA. Nota: Este não é o Directed Multicast " +"Service (DMS) em 802.11v. Nota: pode quebrar as expectativas de multicast " +"STA do receptor." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Modo de Transferência Assíncrona)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "Ponte ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" -msgstr "" -"Identificador de Canal Virtual ATM (VCI)" +msgstr "Identificador de Canal Virtual ATM (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" -msgstr "" -"Identificador de Caminho Virtual ATM (VPI)" +msgstr "Identificador de caminho virtual ATM (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -385,28 +568,24 @@ msgstr "" "rede virutais no Linux. Estas podem ser usadas em conjunto com o DHCP ou PPP " "para discar em um provedor de rede." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Número do dispositivo ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "Identificador de" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Interface ausente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Limite o serviço DNS para subredes das interfaces nas quais estamos servindo " "DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Aceitar local" @@ -415,7 +594,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Aceitar o pacote" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Aceite pacotes com endereços de fontes locais" @@ -423,16 +602,25 @@ msgstr "Aceite pacotes com endereços de fontes locais" msgid "Access Concentrator" msgstr "Concentrador de Acesso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Ponto de Acceso (AP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Isolamento do ponto de acesso" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Tecnologias de acesso" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Ações" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Ativo" @@ -456,8 +644,7 @@ msgstr "Rotas IPv4 ativas" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:258 msgid "Active IPv4 Rules" -msgstr "" -"Ative as regras IPv4" +msgstr "Regras IPv4 ativas" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:265 msgid "Active IPv6 Routes" @@ -465,15 +652,14 @@ msgstr "Rotas IPv6 ativas" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:268 msgid "Active IPv6 Rules" -msgstr "" -"Ative as regras IPv6" +msgstr "Regras de IPv6 ativas" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:205 msgid "Active-Backup policy (active-backup, 1)" msgstr "Política de Backup Ativo (backup ativo, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -490,18 +676,18 @@ msgstr "Balanceamento adaptativo da carga de transmissão (balanço-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Adicionar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Adicionar ponte ATM" @@ -521,11 +707,11 @@ msgstr "Adicionar ação de LED" msgid "Add VLAN" msgstr "Adicionar VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Adicione a configuração de um dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Adicione a configuração de um dispositivo…" @@ -533,18 +719,18 @@ msgstr "Adicione a configuração de um dispositivo…" msgid "Add instance" msgstr "Adicione uma instância" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Adicione uma chave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "Adiciona um sufixo de domínio local para equipamentos conhecidos." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Adiciona uma nova interface..." @@ -552,6 +738,10 @@ msgstr "Adiciona uma nova interface..." msgid "Add peer" msgstr "Adicionar parceiro" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Adicionar à lista negra" @@ -560,11 +750,11 @@ msgstr "Adicionar à lista negra" msgid "Add to Whitelist" msgstr "Adicionar à lista branca" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Arquivos adicionais de equipamentos conhecidos (hosts)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Arquivo de servidores adicionais" @@ -581,7 +771,11 @@ msgstr "Arquivo de servidores adicionais" msgid "Address" msgstr "Endereço" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Família de endereços" @@ -594,7 +788,7 @@ msgstr "A definição do endereço é inválido" msgid "Address to access local relay bridge" msgstr "Endereço para acessar a ponte por retransmissão local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Endereços" @@ -603,31 +797,29 @@ msgstr "Endereços" msgid "Administration" msgstr "Administração" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" -msgstr "Configurações Avançadas" +msgstr "Configurações avançadas" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Opções avançadas do dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Tempo de envelhecimento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "" -"Potência de Transmissão Agregada (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Mensagens agregadas do originador" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -666,11 +858,11 @@ msgstr "Interface Adicional" msgid "Alias of \"%s\"" msgstr "Interface adicional de \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Todos os Servidores" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." @@ -678,7 +870,7 @@ msgstr "" "Aloque endereços IP sequencialmente, iniciando a partir do endereço mais " "baixo disponível." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Alocar endereços IP sequencialmente" @@ -687,13 +879,13 @@ msgid "Allow SSH password authentication" msgstr "" "Permitir autenticação SSH por senha" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" "Permitir, em modo AP, a desconexão de estações baseada na baixa qualidade " "das confirmações (ACK)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Permitir todos, exceto os listados" @@ -701,15 +893,15 @@ msgstr "Permitir todos, exceto os listados" msgid "Allow full UCI access for legacy applications" msgstr "Conceda acesso total à UCI para aplicativos herdados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Permitir taxas legadas do 802.11b" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Permitir somente os listados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Permitir computador local" @@ -732,19 +924,24 @@ msgid "Allow system feature probing" msgstr "Permitir detecção dos recursos do sistema" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Permite que o usuário root se autentique utilizando senha" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Endereços IP autorizados" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "A definição dos IPs permitidos é inválido" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Sempre" @@ -756,12 +953,12 @@ msgstr "Sempre desligado (kernel: nenhum)" msgid "Always on (kernel: default-on)" msgstr "Sempre ligado (kernel: padrão)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "Sempre envie opções DHCP. Às vezes necessário com, por exemplo, PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -769,12 +966,16 @@ msgstr "" "Permitir o uso de canais 40Mhz mesmo se o canal secundário estiver " "sobreposto. Esta opção não está de acordo com IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" "Averigue a quantidade de detecções dos endereços em duplicata que serão " "emitidos" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Quantidade de segundos de espera até que o modem esteja pronto" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Ocorreu um erro ao salvar o formulário:" @@ -783,72 +984,23 @@ msgstr "Ocorreu um erro ao salvar o formulário:" msgid "An optional, short description for this device" msgstr "Uma descrição opcional e curta para este dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Anexo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Anexos A + L + M (todo)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Anexo A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Anexo A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Anexo A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Anexo A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Anexo B (todo)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Anexo B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Anexo B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Anexo B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Anexo J (todo)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Anexo L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Anexo M (todo)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Anexo M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Anexo M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"Anuncie o prefixo NAT64 nas mensagens RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Anuncie este dispositivo como um servidor de DNS IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -856,7 +1008,7 @@ msgstr "" "Anuncie este dispositivo como roteador padrão caso uma rota padrão IPv6 " "local esteja presente." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -864,7 +1016,7 @@ msgstr "" "Anuncie este dispositivo como roteador padrão caso um prefixo IPv6 público " "esteja disponível, independentemente da disponibilidade da rota local padrão." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -872,15 +1024,15 @@ msgstr "" "Anuncie este dispositivo como um roteador padrão, independentemente da " "presença de um prefixo ou de uma rota padrão." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Domínios DNS anunciados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Servidores DNS IPv6 anunciados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Identidade Anônima" @@ -892,7 +1044,7 @@ msgstr "Montagem Anônima" msgid "Anonymous Swap" msgstr "Espaço de Troca (swap) Anônimo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Qualquer pacote" @@ -904,11 +1056,11 @@ msgstr "Qualquer pacote" msgid "Any zone" msgstr "Qualquer zona" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "Aplique as opções DHCP nesta rede. (Vazio = todos os clientes)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "Aplica e mantém as configurações" @@ -916,40 +1068,44 @@ msgstr "Aplica e mantém as configurações" msgid "Apply backup?" msgstr "Aplicar cópia de segurança?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Pedido para aplicar falhou com o estado %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Aplicar sem verificação" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "Aplica e reverte após a perda de conectividade" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Aplicando as alterações na configuração... %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Arquitetura" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Varredura arp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Atribua uma parte do comprimento de cada prefixo IPv6 público para esta " "interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -957,7 +1113,7 @@ msgstr "" "Atribua partes do prefixo usando este identificador hexadecimal do " "subprefixo para esta interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Estações associadas" @@ -966,8 +1122,8 @@ msgstr "Estações associadas" msgid "Associations" msgstr "Associações" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" @@ -975,8 +1131,8 @@ msgstr "" "Pelo menos %h por %h, estouro de " "%h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -989,25 +1145,26 @@ msgid "Attempt to enable configured mount points for attached devices" msgstr "" "Tentar habilitar pontos de montagem configurados para dispositivos anexados" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Grupo de Autenticação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Autenticação" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Tipo de Autenticação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autoritário" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Autenticação Obrigatória" @@ -1015,7 +1172,9 @@ msgstr "Autenticação Obrigatória" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1027,9 +1186,7 @@ msgstr "Automático" #: modules/luci-compat/luasrc/model/network/proto_hnet.lua:7 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:7 msgid "Automatic Homenet (HNCP)" -msgstr "" -"Rede Doméstica Automática (HNCP)" +msgstr "Homenet automático (HNCP)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 msgid "Automatically check filesystem for errors before mounting" @@ -1037,7 +1194,7 @@ msgstr "" "Execute automaticamente a verificação do sistema de arquivos antes da " "montagem do dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1061,6 +1218,10 @@ msgstr "Montagem Automática de Sistema de Arquivo" msgid "Automount Swap" msgstr "Montagem Automática do Espaço de Troca (swap)" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Disponível" @@ -1079,11 +1240,15 @@ msgstr "Disponível" msgid "Average:" msgstr "Média:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Evite os loops da ponte" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1091,15 +1256,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "Transição do BSS" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Voltar" @@ -1108,11 +1277,7 @@ msgstr "Voltar" msgid "Back to Overview" msgstr "Voltar para Visão Geral" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Voltar para configuração" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "Retorna à configuração de pares" @@ -1125,16 +1290,15 @@ msgid "Backup / Flash Firmware" msgstr "Cópia de Segurança / Gravar Firmware" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Lista de arquivos para a cópia de segurança" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Banda" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Dispositivo base" @@ -1143,12 +1307,43 @@ msgid "Base64-encoded public key of this interface for sharing." msgstr "" "Chave pública desta interface codificada em base64 para compartilhamento." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Dispositivo Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Interface Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"O batman-adv tem uma camada 2 de fragmentação incorporada, para dados de " +"unicast que fluem através do mesh que permitirá executar o batman-adv nas " +"interfaces/conexões que não permitem aumentar o MTU além do tamanho padrão " +"do pacote Ethernet de 1500 bytes. Quando a fragmentação estiver ativada, o " +"batman-adv irá fragmentar automaticamente os pacotes com tamanho excessivo e " +"irá desfragmentá-los na outra extremidade. É predefinido que a fragmentação " +"esteja ativada e seja inativada se o pacote couber, porém, é possível " +"desativar totalmente a fragmentação." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Intervalo do quadro de monitoramento (Beacon)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Relatório do sinal" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1162,7 +1357,7 @@ msgstr "" msgid "Bind NTP server" msgstr "Servidor NTP Bind" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "Vincula dinamicamente nas interfaces em vez do endereço curinga (recomendado " @@ -1173,18 +1368,35 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Interface Vinculada" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" +"Vincula os registros do serviço a um nome de domínio: especifique o local " +"dos serviços." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"Vincula os registros do serviço a um nome de domínio: especifique o local " +"dos serviços. Consulte RFC2782." + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1196,65 +1408,77 @@ msgstr "Vincule o túnel a esta interface (opcional)." msgid "Bitrate" msgstr "Taxa de bits" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Modo de ligação" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Política do vínculo" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Ponte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Ponte (suporte à comunicação direta entre o MAC das VLANs)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Filtragem da ponte VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Dispositivo ponte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "Opções específicas da porta da ponte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Portas da ponte" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "Tabela de tráfego da ponte \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Número da unidade da ponte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Suba uma ponte vazia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Suba na iniciação" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "Suba a interface da ponte ainda que não haja portas anexadas" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Política de transmissão (transmissão, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Explorar…" @@ -1262,15 +1486,39 @@ msgstr "Explorar…" msgid "Buffered" msgstr "Em buffer" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" +"Certificado CA (codificado por PEM; use em vez do armazenamento em todo o " +"sistema para aferir o certificado do gateway." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "Certificado da AC; se em branco, será salvo depois da primeira conexão." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "Configuração CLAT falhou" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME ou fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (Interface gerenciada externamente)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Uso da CPU (%)" @@ -1285,18 +1533,25 @@ msgstr "Em cache" msgid "Call failed" msgstr "A chamada falhou" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"Pode ser útil caso o provedor tenha servidores de nomes IPv6, mas não " +"forneça o roteamento IPv6." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Cancelar" @@ -1304,36 +1559,36 @@ msgstr "Cancelar" msgid "Cannot parse configuration: %s" msgstr "Não foi possível analisar a configuração: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "Fazer a captura dos pacotes da entrada endereçados a outros hosts" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" "Fazer a captura dos pacotes recebidos antes de qualquer decisão de roteamento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" "Fazer a captura dos pacotes da entrada que forem encaminhados para o sistema " "local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" "Faça a captura dos pacotes da saída após qualquer decisão de roteamento" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "Faça a captura dos pacotes da saída provenientes do sistema local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "Faça a captura dos pacotes diretamente após o NIC tê-los recebido" @@ -1342,24 +1597,32 @@ msgstr "Faça a captura dos pacotes diretamente após o NIC tê-los recebido" msgid "Category" msgstr "Categoria" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "ID da célula" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "Localização da célula" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Restrição por certificado (Domínio)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Restrição por certificado (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Restrição por certificado (Assunto)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Restrição por certificado (Asterisco)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1368,8 +1631,8 @@ msgstr "" "CN=wifi.mycompany.com
    Veja `logread -f` durante o handshake para " "encontrar os valores atuais" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1377,8 +1640,8 @@ msgstr "" "Restrições por certificado(s) contra valores DNS SAN (se disponível)
    ou " "Assunto CN (correspondência exata)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1386,8 +1649,8 @@ msgstr "" "Restrições por certificado(s) contra valores DNS SAN (se disponível)
    ou " "Assunto CN (correspondente ao sufixo)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1402,16 +1665,16 @@ msgstr "" msgid "Chain" msgstr "Corrente" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "Gancho da corrente \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Alterações" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "As alterações foram revertidas." @@ -1422,18 +1685,19 @@ msgstr "Muda a senha do administrador para acessar este dispositivo" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Canal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Análise dos canais" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Largura do canal" @@ -1442,7 +1706,7 @@ msgid "Check filesystems before mount" msgstr "" "Execute a verificação do sistema de arquivos antes da montagem do dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "Marque esta opção para remover as redes existentes neste rádio." @@ -1459,8 +1723,8 @@ msgstr "Verificando imagem…" msgid "Choose mtdblock" msgstr "Escolha o bloco mtd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1472,7 +1736,7 @@ msgstr "" "associada ou preencha o campo criar para definir uma nova zona e " "associar a interface a ela." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1480,7 +1744,7 @@ msgstr "" "Escolha a rede (s) que deseja anexar a este interface wireless ou preencha o " " criar campo para definir uma nova rede." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Cifra" @@ -1504,9 +1768,10 @@ msgstr "" "Clique em \"Salvar o bloco mtd\" para baixar o arquivo do bloco mtd " "especificado. (NOTA: ESTE RECURSO É PARA PROFISSIONAIS!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Cliente" @@ -1516,9 +1781,9 @@ msgid "Client ID to send when requesting DHCP" msgstr "" "Identificador do cliente enviando quando a requisição do DHCP é realizada" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Fechar" @@ -1535,20 +1800,20 @@ msgstr "" "Feche as conexões inativas após uma dada quantidade de segundos. Use 0 para " "manter as conexões" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Fechar a lista..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Coletando dados..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Comando" @@ -1565,7 +1830,7 @@ msgstr "O comando falhou" msgid "Comment" msgstr "Comentário" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1589,29 +1854,28 @@ msgstr "Cálculo do checksum de saída (opcional)." msgid "Config File" msgstr "Arquivo de configuração" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Configuração" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "Exportação de configuração" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "A configuração foi aplicada." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "A configuração foi revertida!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "A configuração falhou" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1627,7 +1891,7 @@ msgstr "" "11 Mbps. Muito Alta configura 24 Mbps como a taxa básica. As taxas " "suportadas inferiores à taxa mínima básica não são oferecidas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." @@ -1635,7 +1899,7 @@ msgstr "" "Configura o anúncio padrão do roteador nas mensagens do RA ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1643,16 +1907,16 @@ msgstr "" "Configura o modo de operação do serviço do RA nesta interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "Configura o modo de operação do serviço DHCPv6 nesta interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "Configura o modo de operação do serviço proxy NDP nesta interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Configurar…" @@ -1664,9 +1928,10 @@ msgstr "Confirmar desconexão" msgid "Confirmation" msgstr "Confirmação" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Conectado" @@ -1676,11 +1941,11 @@ msgstr "Conectado" msgid "Connection attempt failed" msgstr "A tentativa de conexão falhou" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "A tentativa de conexão falhou." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "Ponto final da conexão" @@ -1692,7 +1957,7 @@ msgstr "Conexão perdida" msgid "Connections" msgstr "Conexões" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "Alteração de conectividade" @@ -1724,9 +1989,9 @@ msgstr "" msgid "Contents have been saved." msgstr "O conteúdo foi salvo." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1737,16 +2002,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "Continue em %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "Continua na cadeia de chamadas" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "Continuar processando pacotes sem comparação" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1761,20 +2026,20 @@ msgstr "" msgid "Country" msgstr "País" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Código do País" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Densidade da célula de cobertura" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Crie / Atribua a uma zona de firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Crie uma interface" @@ -1786,7 +2051,7 @@ msgstr "Crítico" msgid "Cron Log Level" msgstr "Nível do registro cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Potência atual" @@ -1829,31 +2094,31 @@ msgstr "" "Se possível, personaliza o comportamento dos LEDs." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "Transmissões DAD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "Cliente DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "Porta DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "Segredo DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "Opções do DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Servidor DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP e DNS" @@ -1864,16 +2129,22 @@ msgstr "DHCP e DNS" msgid "DHCP client" msgstr "Cliente DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Opções do DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "Cliente DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "Serviço DHCPv6" @@ -1885,29 +2156,27 @@ msgstr "Serviço DHCPv6" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Encaminhamentos do DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" -msgstr "" -"Porta de consulta DNS" +msgstr "Porta de consulta no DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "Domínios de pesquisa do DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" -msgstr "" -"Porta do servidor DNS" +msgstr "Porta do servidor DNS" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:292 msgid "DNS setting is invalid" msgstr "A configuração do DNS é inválido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "Peso do DNS" @@ -1915,11 +2184,11 @@ msgstr "Peso do DNS" msgid "DNS-Label / FQDN" msgstr "Rótulo DNS / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "Verificar DNSSEC sem assinatura" @@ -1931,41 +2200,47 @@ msgstr "Tempo de expiração para ociosidade do DPD" msgid "DS-Lite AFTR address" msgstr "Endereço DS-Lite AFTR" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "Estado da DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "Modo de linha DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" -msgstr "" -"Intervalo DTIM" +msgstr "Intervalo DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Taxa de Dados" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Dados Recebidos" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Dados Enviados" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Depuração" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Roteador padrão" @@ -1973,7 +2248,7 @@ msgstr "Roteador padrão" msgid "Default state" msgstr "Estado padrão" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1983,7 +2258,7 @@ msgstr "" "\"6,192.168.2.1,192.168.2.2\" que anuncia diferentes servidores " "DNS para os clientes." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" @@ -1991,7 +2266,7 @@ msgstr "" "Define um mapeamento da prioridade do pacote interno do Linux para a " "prioridade do cabeçalho VLAN, apenas para os frames de saída" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" @@ -1999,49 +2274,50 @@ msgstr "" "Define um mapeamento da prioridade do pacote interno do Linux para a " "prioridade do cabeçalho VLAN, apenas para os frames de entrada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "Define um MTU específico para esta rota" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "Delegue prefixos IPv6" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Apagar" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Apagar chave" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Solicitação para apagar falhou: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Apagar esta rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Intervalo da Mensagem Indicativa de Envio de Tráfego" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Descrição" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Remover seleção" @@ -2049,11 +2325,11 @@ msgstr "Remover seleção" msgid "Design" msgstr "Tema" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "Mestre designado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2088,9 +2364,9 @@ msgstr "Zona de destino" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2100,36 +2376,40 @@ msgstr "Zona de destino" msgid "Device" msgstr "Dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Configuração do Dispositivo" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "Identificador do dispositivo" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "O dispositivo não está ativo" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "O dispositivo está reiniciando…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Nome do dispositivo" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Dispositivo não gerenciado pelo ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "O dispositivo não está presente" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Tipo do dispositivo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Dispositivo não alcançável!" @@ -2138,31 +2418,31 @@ msgid "Device unreachable! Still waiting for device..." msgstr "" "O dispositivo está fora de alcance! Ainda aguardando pelo dispositivo..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Dispositivos" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnóstico" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Número de discagem" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Diretório" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Desativar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2179,20 +2459,24 @@ msgstr "Desabilitar pesquisas de DNS" msgid "Disable Encryption" msgstr "Desabilitar Cifragem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Desative a sondagem de inatividade" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Desabilitar esta rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2201,16 +2485,16 @@ msgstr "Desabilitar esta rede" msgid "Disabled" msgstr "Desativado" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "Desativado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Desassocie quando houver baixa confirmação de recebimento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" @@ -2218,18 +2502,17 @@ msgstr "" "href=\"%s\">RFC1918." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Desconectar" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "A tentativa de desconexão falhou" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "A tentativa de desconexão falhou." @@ -2239,23 +2522,35 @@ msgstr "Espaço no disco" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Dispensar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Otimização de Distância" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Distância para o computador mais distante da rede (em metros)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Tabela ARP distribuída" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2264,7 +2559,7 @@ msgstr "" "Caso não seja especificado, a seção é válida para todas as instâncias do " "dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP e o encaminhador para o DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" "Não mantenha em cache qualquer retorno negativo como domínios inexistentes " @@ -2288,34 +2583,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "Não crie a rota do host para o peer (opcional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "Não encaminhe as consultas DNS sem os pontos ou as partes do domínio." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Não encaminhe as requisições que não possam ser respondidas pelos servidores " -"públicos de nomes." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Não encaminhe buscas pelo endereço reverso para as redes locais." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Evite escutar nestas Interfaces." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "Não ofereça o serviço DHCPv6 nesta interface." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Não participar" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2327,7 +2611,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Não envie um nome de host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2335,11 +2619,11 @@ msgstr "" "Não envie nenhuma mensagem de RA nesta interface." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Você realmente deseja apagar \"%s\" ?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Você realmente deseja apagar a seguinte chave SSH?" @@ -2347,11 +2631,11 @@ msgstr "Você realmente deseja apagar a seguinte chave SSH?" msgid "Do you really want to erase all settings?" msgstr "Você realmente deseja apagar todas as configurações?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Você realmente deseja apagar recursivamente o diretório \"%s\" ?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "Deseja substituir o PSK atual?" @@ -2359,15 +2643,17 @@ msgstr "Deseja substituir o PSK atual?" msgid "Do you want to replace the current keys?" msgstr "Deseja substituir as chaves atuais?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Domínio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Requerer domínio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Lista branca de domínios" @@ -2393,13 +2679,11 @@ msgstr "Baixar a cópia de segurança" msgid "Download mtdblock" msgstr "Baixar o bloco mtd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" -msgstr "" -"Deslocamento SNR do sinal recebido" +msgstr "Compensação SNR do downstream" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2415,16 +2699,62 @@ msgstr "Arraste para reordenar" msgid "Drop Duplicate Frames" msgstr "Derrubar os Quadros Duplicados" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"Elimine todos os quadros ARP gratuitos, por exemplo, caso haja um proxy ARP " +"bom, conhecido na rede, onde estes quadros não precisem ser usados ou, no " +"caso do 802.11, não devam ser usados para evitar ataques." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Derrube todos os anúncios de vizinhos não solicitados, por exemplo, se " +"houver um bom proxy NA conhecido na rede e tais quadros não precisem ser " +"usados ou, no caso de 802.11, não devam ser usados para evitar ataques." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Derrubar ARP gratuito" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" +"Derruba os quadros multicast da camada 2 contendo pacotes unicast IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" +"Derruba os quadros multicast da camada 2 contendo pacotes unicast IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Derruba unicast IPv4 aninhado" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Derruba unicast IPv6 aninhado" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Derrubar o pacote" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "Faz o descarte dos pacotes incompatíveis" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Derruba NA não solicitado" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbear" @@ -2443,21 +2773,21 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Duas Pilhas Leve (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "DHCP " "Dinâmico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "Cliente da extensão de autorização dinâmica." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "Porta da extensão da autorização dinâmica." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "Segredo da extensão de autorização dinâmica." @@ -2465,7 +2795,7 @@ msgstr "Segredo da extensão de autorização dinâmica." msgid "Dynamic tunnel" msgstr "Túnel dinâmico" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2473,21 +2803,33 @@ msgstr "" "Aloca dinamicamente os endereços do DHCP para os clientes. Se desabilitado, " "somente os clientes com atribuições estáticas serão servidos." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Por exemplo, br-vlan ou brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Por exemplo, eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "Comprimento dos bits EA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Método EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Cada STA recebe a sua própria interface AP_VLAN." + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Editar" @@ -2495,6 +2837,10 @@ msgstr "Editar" msgid "Edit peer" msgstr "Edite o par" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2503,11 +2849,11 @@ msgstr "" "Edite os dados de configuração brutos abaixo para arrumar qualquer erro e " "clique em \"Salvar\" para recarregar a página." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Editar esta rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Editar rede sem fio" @@ -2516,46 +2862,36 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "Rota MTU efetiva" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Mapeamento do egresso QoS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "ID do dispositivo Egress" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Nome do dispositivo de saída" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Egresso marcado" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Egresso desmarcado" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Emergência" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Ativar" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" "Ativa / Desativa o par. Reinicie a interface do wireguard para aplicar " "alterações." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2563,11 +2899,11 @@ msgstr "" "Ativar o monitoramento do IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Ativar STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "Ative o SLAAC" @@ -2585,10 +2921,11 @@ msgstr "Ativar o Embaralhamento Dinâmico do Flows" msgid "Enable HE.net dynamic endpoint update" msgstr "Ativar a atualização de ponto final dinâmico HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Ative o IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Ative a negociação IPv6" @@ -2602,27 +2939,31 @@ msgstr "Ative a negociação IPv6" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Ative a negociação IPv6 no enlace PPP" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "Ativa o roteamento do segmento IPv6" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Ative o encaminhamento de quadros jumbos (Jumbo Frames)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "Ative a aprendizagem de endereço MAC" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:257 msgid "Enable NTP client" -msgstr "Ative o cliente NTP" +msgstr "Ativar cliente NTP" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "Enable Single DES" msgstr "Ative o DES Simples" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Ative o servidor TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Ative a filtragem VLAN" @@ -2630,7 +2971,7 @@ msgstr "Ative a filtragem VLAN" msgid "Enable VLAN functionality" msgstr "Ative a funcionalidade VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Ative o botão WPS. requer WPA(2)-PSK/WPA3-SAE" @@ -2644,12 +2985,12 @@ msgstr "" "Transfer Protocol\">HTTP para a porta HTTPS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "Ative a delegação de prefixos IPv6 disponíveis nesta interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "" "Ative as contramedidas contra o ataque de reinstalação da chave (KRACK)" @@ -2666,26 +3007,26 @@ msgstr "Ative o espelhamento dos pacotes da entrada" msgid "Enable mirroring of outgoing packets" msgstr "Ative o espelhamento dos pacotes da saída" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "Ative a saída rápida do multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "Ative o consultor multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Ative o suporte ao multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Ative a orientação dos pacotes para todas as CPUs. Pode ajudar ou atrapalhar " "a velocidade da rede." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Ative o modo promíscuo" @@ -2707,11 +3048,11 @@ msgstr "Ative o suporte para o tráfego multicast (opcional)." msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Ative o campo DF (Não Fragmentar) dos pacotes encapsulados." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "Ative o servidor TFTP integrado com única instância." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Ative esta rede" @@ -2720,21 +3061,24 @@ msgstr "Ative esta rede" msgid "Enable tx checksum" msgstr "Ative o checksum no tx" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "Ative a inundação unicast" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Ativado" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Ativar o monitoramento IGMP nesta ponte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2742,7 +3086,15 @@ msgstr "" "Ativa a troca rápida entre pontos de acesso que pertencem ao mesmo Domínio " "de Mobilidade" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" +"Permite uma infraestrutura de encaminhamento multicast mais eficiente e " +"consciente do grupo do batman-adv." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Ativa o protocolo STP nesta ponte" @@ -2750,24 +3102,29 @@ msgstr "Ativa o protocolo STP nesta ponte" msgid "Encapsulation limit" msgstr "Limite do encapsulamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Modo do encapsulamento" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Criptografia" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Extremidade" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Equipamento do ponto final" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Porta do ponto final" @@ -2775,23 +3132,23 @@ msgstr "Porta do ponto final" msgid "Endpoint setting is invalid" msgstr "O ponto final da configuração é inválido" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "Imponha o IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "Imponha o IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "Imponha o IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "Imponha o MLD versão 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "Imponha o MLD versão 2" @@ -2820,10 +3177,6 @@ msgstr "Erro" msgid "Error getting PublicKey" msgstr "Houve um erro ao obter a PublicKey" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Segundos com erro (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2842,11 +3195,19 @@ msgstr "A cada 30 segundos (lento, 0)" msgid "Every second (fast, 1)" msgstr "A cada segundo (rápido, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Excluir interfaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"A execução de vários comandos de rede para verificar a conexão e a resolução " +"dos nomes com os outros sistemas." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2854,27 +3215,35 @@ msgstr "" "Exclua o endereço 127.0.0.0/8 e ::1 das " "verificações de reconexão como serviços RBL por exemplo." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Dispositivo existente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Expandir arquivos de equipamentos conhecidos (hosts)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Era esperado o número da porta." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Esperando uma sugestão hexadecimal da atribuição" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Na expectativa de um endereço IPv4 válido" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Na expectativa de um endereço IPv6 válido" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Na expectativa de dois valores prioritários separados por dois pontos" @@ -2883,11 +3252,11 @@ msgstr "Na expectativa de dois valores prioritários separados por dois pontos" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Esperando: %s" @@ -2899,7 +3268,7 @@ msgstr "Esperando: um valor não vazio" msgid "Expires" msgstr "Expira" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2910,11 +3279,11 @@ msgstr "" msgid "External" msgstr "Externo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Lista dos Detentor de Chave R0 Externa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Lista dos Detentor de Chave R1 Externa" @@ -2942,38 +3311,65 @@ msgstr "Opções extras do pppd" msgid "Extra sstpc options" msgstr "Opções extras do sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT sobre DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" -msgstr "FT pelo ar" +msgstr "FT pelo ar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" -msgstr "" -"Protocolo de FT" +msgstr "Protocolo FT" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "Motivo da falha" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Falha ao alterar a senha do sistema." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Houve uma falha ao configurar o modem" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" "A confirmação das alterações na configuração não foram confirmadas em %d " "segundos. Aguardando a reversão da configuração…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Houve uma falha na conexão" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Houve uma falha ao desconectar" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Falha ao executar a ação \"/etc/init.d/%s %s\": %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Houve uma falha ao obter as informações do modem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Houve uma falha ao inicializar o modem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Houve uma falha ao definir o modo de operação" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Arquivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2982,40 +3378,48 @@ msgstr "" "do domínio, como server=1.2.3.4, server=/domain/1.2.3.4 por exemplo." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Arquivo não associado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "O arquivo para armazenar as informações da locação do DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "Arquivo com os resolvedores upstream." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Nome do arquivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Nome do arquivo da imagem de boot que é anunciada aos clientes." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:315 msgid "Filesystem" -msgstr "Sistema de arquivo" +msgstr "Arquivo de sistema" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Filtrar os registros IPv4 A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Filtrar os registros IPv6 AAAA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Filtre a descoberta do serviço SRV/SOA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filtrar endereços privados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filtrar consultas inúteis" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Filtragem para todos os escravos, sem validação" @@ -3031,8 +3435,15 @@ msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" "Filtragem para todos os escravos, validação apenas para os escravos de backup" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" +"Filtra a descoberta do serviço SRV/SOA, visa evitar o acionamento de links " +"dial-on-demand." + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "A finalização falhou" @@ -3045,7 +3456,7 @@ msgstr "" "conectados e substitua a configuração com valores padrão baseados no que foi " "detectado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Procurar e conectar à rede" @@ -3059,10 +3470,11 @@ msgid "Firewall" msgstr "Firewall" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Marca do firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Configurações do firewall" @@ -3070,19 +3482,19 @@ msgstr "Configurações do firewall" msgid "Firewall Status" msgstr "Condição do firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "Marca do firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Arquivo do firmware" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Versão do firmware" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Porta fixa da origem para a saída das consultas DNS." @@ -3108,40 +3520,48 @@ msgstr "Operações na memória flash" msgid "Flashing…" msgstr "Instalando…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Impor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Impor o modo 40MHz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Impor CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Impor o DHCP nesta rede ainda que outro servidor seja detectado." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "Imponha a versão do IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "Imponha a versão do MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Impor TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Impor TKIP e CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Impor o enlace" @@ -3153,11 +3573,11 @@ msgstr "Atualização forçada" msgid "Force use of NAT-T" msgstr "Impor o uso de NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Chave eletrônica do formulário não casa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA entre a interface " "principal que foi designada e as interfaces \"downstream\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3183,7 +3603,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Encaminhar tráfego DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3191,33 +3611,35 @@ msgstr "" "Encaminhe as mensagens DHCPv6 entre a interface principal e as interfaces " "\"downstream\"." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" -"Segundos a frente de correção de erros ( FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Encaminhar tráfego broadcast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "Atraso do encaminhamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Encaminhar o tráfego do parceiro da malha" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "Encaminhe neste dispositivo os pacotes multicast como pacotes unicast." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Modo de encaminhamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Fragmentação" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Limiar de Fragmentação" @@ -3241,7 +3663,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Somente GPRS" @@ -3261,12 +3683,16 @@ msgstr "Túnel GRETAP sobre IPv4" msgid "GRETAP tunnel over IPv6" msgstr "Túnel GRETAP sobre IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Roteador" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Modo gateway" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Acesso remoto a portas encaminhadas" @@ -3276,23 +3702,23 @@ msgstr "Acesso remoto a portas encaminhadas" msgid "Gateway address is invalid" msgstr "O endereço do roteador padrão é inválido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Configurações gerais" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Configurações Gerais" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Opções gerais do dispositivo" @@ -3300,21 +3726,19 @@ msgstr "Opções gerais do dispositivo" msgid "Generate Config" msgstr "Gerar Configuração" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" -msgstr "" -"Gerar a PMK localmente" +msgstr "Gerar PMK localmente" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:396 msgid "Generate archive" msgstr "Gerar arquivo" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "Gera a configuração" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "Gera a configuração…" @@ -3322,15 +3746,15 @@ msgstr "Gera a configuração…" msgid "Generate new key pair" msgstr "Gera um novo par de chaves" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "Gera uma chave pré-compartilhada" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "Gera uma configuração adequada para a importação num peer do WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "Gerando o código QR…" @@ -3342,39 +3766,40 @@ msgstr "A senha de confirmação informada não casa. Senha não alterada!" msgid "Global Settings" msgstr "Configurações Globais" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Opção global de rede" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "Ir para a atualização do firmware..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Ir para a configuração de senha..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Ir para a página de configuração pertinente" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "Conceda acesso à configuração do DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Conceda acesso à visualização da condição do DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "Conceda acesso à visualização da condição do DSL" @@ -3386,6 +3811,10 @@ msgstr "Conceda acesso aos procedimentos LuCI OpenConnect" msgid "Grant access to LuCI Wireguard procedures" msgstr "Conceda acesso aos procedimentos da LuCI Wireguard" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Conceda acesso aos procedimentos do LuCI openfortivpn" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "Conceda acesso à configuração do SSH" @@ -3422,7 +3851,7 @@ msgstr "Conceda acesso à configuração de montagem" msgid "Grant access to network configuration" msgstr "Conceda acesso à configuração da rede" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Conceda acesso a ferramentas de diagnóstico de rede" @@ -3430,6 +3859,10 @@ msgstr "Conceda acesso a ferramentas de diagnóstico de rede" msgid "Grant access to network status information" msgstr "Conceda acesso às informações da condição da rede" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "Conceda acesso às condições do processo" @@ -3462,7 +3895,7 @@ msgstr "Conceda acesso à configuração uHTTPd" msgid "Grant access to wireless channel status" msgstr "Conceda acesso à condição geral do canal sem fio" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Conceda acesso à visualização da condição do wireless" @@ -3491,17 +3924,11 @@ msgstr "Acesso HTTP(s)" msgid "Hang Up" msgstr "Suspender" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" -"Erros de Código de Erro de Cabeçalho (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Intervalo de heartbeat (kernel: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Intervalo da saudação (Hello)" @@ -3513,7 +3940,7 @@ msgstr "" "Aqui você pode configurar os aspectos básicos do seu equipamento, como o " "nome do equipamento ou o fuso horário." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" "Ocultar %h
    (%h), Priority: %d" msgstr "Gancho: %h (%h), Prioridade: %d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Penalidade do salto" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3544,7 +3979,7 @@ msgstr "Host" msgid "Host expiry timeout" msgstr "Tempo limite de expiração de equipamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "O Host solicita este nome de arquivo no servidor de inicialização." @@ -3552,10 +3987,16 @@ msgstr "O Host solicita este nome de arquivo no servidor de inicialização." msgid "Host-Uniq tag content" msgstr "Conteúdo da etiqueta única do equipamento" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3565,11 +4006,11 @@ msgstr "Nome do equipamento" msgid "Hostname to send when requesting DHCP" msgstr "Nome do equipamento enviado quando requisitar DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Nome dos equipamentos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3628,23 +4069,27 @@ msgstr "Agregação de link dinâmico IEEE 802.3ad (802.3ad, 4)" msgid "IKE DH Group" msgstr "Grupo IKE DH" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "IMEI" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "Endereços IP" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "Protocolo IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" -msgstr "Conjuntos IP" +msgstr "Conjuntos de IP" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "Tipo de IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3660,7 +4105,7 @@ msgstr "O endereço IP é inválido" msgid "IP address is missing" msgstr "O endereço IP está ausente" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3675,20 +4120,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "Protocolo IP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "Protocolo IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "conjunto IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "Conjuntos IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Substitua por um domínio NX falso" @@ -3696,14 +4141,15 @@ msgstr "Substitua por um domínio NX falso" msgid "IPsec XFRM" msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3719,7 +4165,7 @@ msgstr "Vizinhos IPv4" msgid "IPv4 Routing" msgstr "Roteamento IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "Regras IPv4" @@ -3729,7 +4175,7 @@ msgstr "Conexão do enlace IPv4" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3756,9 +4202,9 @@ msgstr "Máscara de rede IPv4" msgid "IPv4 network in address/netmask notation" msgstr "Rede IPv4 na notação de endereço/máscara de rede" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" -msgstr "Somente IPv4" +msgstr "Apenas IPv4" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:52 msgid "IPv4 prefix" @@ -3769,11 +4215,11 @@ msgstr "Prefixo IPv4" msgid "IPv4 prefix length" msgstr "Tamanho do prefixo IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "Tabela de tráfego IPv4 \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3782,16 +4228,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4 e IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (ambos - padrão é IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "Tabela de tráfego IPv4/IPv6 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3802,7 +4252,8 @@ msgstr "Tabela de tráfego IPv4/IPv6 \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3810,7 +4261,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Firewall para IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "MTU IPv6" @@ -3818,7 +4269,11 @@ msgstr "MTU IPv6" msgid "IPv6 Neighbours" msgstr "Vizinhos IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "Configurações do IPv6 RA" @@ -3826,19 +4281,17 @@ msgstr "Configurações do IPv6 RA" msgid "IPv6 Routing" msgstr "Roteamento IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "Regras IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "Configurações IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" -msgstr "" -"Prefixo ULA " -"IPv6" +msgstr "Prefixo IPv6 ULA" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 msgid "IPv6 Upstream" @@ -3850,12 +4303,12 @@ msgstr "Conexão do enlace IPv6" msgid "IPv6 address" msgstr "Endereço IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "Sugestão de atribuição IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "Tamanho da atribuição IPv6" @@ -3867,11 +4320,11 @@ msgstr "Roteador padrão do IPv6" msgid "IPv6 network in address/netmask notation" msgstr "Rede IPv6 na notação de endereço/máscara de rede" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" -msgstr "Somente IPv6" +msgstr "Apenas IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "Preferência do IPv6" @@ -3880,7 +4333,7 @@ msgstr "Preferência do IPv6" msgid "IPv6 prefix" msgstr "Prefixo IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "Filtro do prefixo IPv6" @@ -3894,25 +4347,19 @@ msgstr "Tamanho Prefixo IPv6" msgid "IPv6 routed prefix" msgstr "Prefixo roteável IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "Roteamento com origem IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "Sufixo IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"IPv6-Suffix (hex)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "Suporte ao IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "Tabela de tráfego IPv6 \"%h\"" @@ -3920,6 +4367,10 @@ msgstr "Tabela de tráfego IPv6 \"%h\"" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3935,10 +4386,16 @@ msgstr "IPv6-sobre-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-sobre-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identidade" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Se marcado, a cifragem 1DES será habilitada" @@ -3951,7 +4408,7 @@ msgstr "Se marcado, adiciona o \"+ipv6\" nas opções do pppd" msgid "If checked, encryption is disabled" msgstr "Se marcado, a cifragem estará desabilitada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." @@ -3959,7 +4416,7 @@ msgstr "" "Se definido, as sub-redes só são alocadas a partir das classes informadas do " "prefixo IPv6 ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "Se definido, o sentido das opções de correspondência é invertido" @@ -3980,7 +4437,7 @@ msgstr "" "Se especificado, monta o dispositivo pela etiqueta da partiçãoo ao invés de " "um nó de dispositivo fixo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " @@ -3990,14 +4447,16 @@ msgstr "" "manual ao novo IP será necessária em %d segundos para " "confirmar as configurações, caso contrário, as alterações serão revertidas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Se desmarcado, nenhuma rota padrão será configurada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -4019,15 +4478,23 @@ msgstr "" "de transferência tão altas com a memória RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignorar /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignorar interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignorar o arquivo de resolução de nomes (resolv.conf)" @@ -4039,25 +4506,25 @@ msgstr "Imagem" msgid "Image check failed:" msgstr "A verificação da imagem falhou:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "Importe como par" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "Importa a configuração" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "Importa a configuração como par…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "Importa as configurações" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "A configuração dos pares foi importada" @@ -4070,7 +4537,24 @@ msgstr "" msgid "In" msgstr "Entrada" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"Nas configurações LAN em ponte é aconselhável ativar a prevenção do loop da " +"ponte, visando evitar os loops de transmissão que podem levar toda a LAN a " +"uma paralisação." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -4078,7 +4562,7 @@ msgstr "" "Para prevenir acesso não autorizado neste sistema, sua requisição foi " "bloqueada. Clique abaixo em \"Continuar »\" para retornar à página anterior." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "Em segundos" @@ -4110,7 +4594,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Checksum da entrada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Interface de entrada" @@ -4118,6 +4602,7 @@ msgstr "Interface de entrada" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Chave da entrada" @@ -4136,22 +4621,21 @@ msgstr "Informação" msgid "Information" msgstr "Informações" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "Mapeamento do ingresso QoS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "Identificação do dispositivo de entrada" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "Nome do dispositivo de entrada" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Falha na iniciação" @@ -4163,31 +4647,41 @@ msgstr "Script de iniciação" msgid "Initscripts" msgstr "Scripts de iniciação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Restrição de certificado interno (Domínio)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Restrição de certificado interno (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Restrição de certificado interno (Assunto)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Restrição de certificado interno (Asterisco)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Instalar extensões de protocolo..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Instância" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Instância \"%h\"" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Detalhes da instância" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4199,6 +4693,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Permissões insuficientes para ler a configuração UCI." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "Identificador do cartão com circuito integrado" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4206,15 +4704,16 @@ msgstr "Permissões insuficientes para ler a configuração UCI." msgid "Interface" msgstr "Interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "A interface \"%h\" já está marcada como mestre designado." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:62 msgid "Interface %q device auto-migrated from %q to %q." -msgstr "Dispositivo da interface %q foi migrada automaticamente de %q para &q." +msgstr "" +"O dispositivo %q da interface foi migrado automaticamente de %q para %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Configuração da Interface" @@ -4245,11 +4744,11 @@ msgstr "A interface está reconectando..." msgid "Interface is shutting down..." msgstr "A interface está desligando..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Interface está iniciando..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Interface está parando..." @@ -4258,12 +4757,12 @@ msgid "Interface name" msgstr "Nome da Interface" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "A interface não está presente ou não está conectada ainda." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Interfaces" @@ -4272,15 +4771,19 @@ msgstr "Interfaces" msgid "Internal" msgstr "Interno" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Erro Interno no Servidor" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "Identidade internacional do equipamento da estação móvel" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "Identidade internacional do assinante móvel" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Intervalo para o Envio dos Pacotes de Aprendizagem" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4291,7 +4794,7 @@ msgstr "" "mensagens IGMP na sub-rede; os valores maiores fazem com que as consultas ao " "IGMP sejam enviadas com menos frequência" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "O intervalo em segundos para os pacotes de saudação do STP" @@ -4301,8 +4804,9 @@ msgid "Invalid" msgstr "Valor inválido" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "Foi fornecido um APN inválido" @@ -4312,6 +4816,10 @@ msgstr "Foi fornecido um APN inválido" msgid "Invalid Base64 key string" msgstr "String de chave Base64 inválida" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Endereço IPv6 inválido" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4338,7 +4846,7 @@ msgstr "" msgid "Invalid argument" msgstr "Argumento inválido" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4354,15 +4862,36 @@ msgstr "Comando inválido" msgid "Invalid hexadecimal value" msgstr "Valor hexadecimal inválido" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Nome de host ou endereço IPv4 válido" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Porta inválida" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "URL do servidor inválida" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Usuário e/ou senha inválida! Por favor, tente novamente." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Inverte a piscagem" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "Inverta a correspondência" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "É a VLAN primária" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Isolar Clientes" @@ -4375,25 +4904,25 @@ msgstr "" "A imagem que está a tentar carregar aparenta nao caber na flash do " "equipamento. Por favor verifique o arquivo da imagem!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "É necessário JavaScript!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Conectar à Rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Conectar à Rede: Busca por Rede Sem Fio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Juntando-se à rede %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Ir para a regra" @@ -4401,24 +4930,28 @@ msgstr "Ir para a regra" msgid "Keep settings and retain the current configuration" msgstr "Mantenha as configurações e preserve a configuração atual" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "Manter vivo" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Registro do kernel" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Versão do kernel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Chave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Chave #%d" @@ -4426,6 +4959,7 @@ msgstr "Chave #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Chave para os pacotes da entrada (opcional)." @@ -4433,14 +4967,19 @@ msgstr "Chave para os pacotes da entrada (opcional)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Chave para os pacotes da saída (optional)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "Chave faltando" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Chave usada para assinar a configuração da rede" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4485,7 +5024,7 @@ msgstr "Intervalo do eco do LCP" msgid "LED Configuration" msgstr "Configuração do LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4502,32 +5041,41 @@ msgstr "Idioma" msgid "Language and Style" msgstr "Idioma e Estilo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" +"Pesos maiores (do mesmo prio) recebem uma probabilidade proporcionalmente " +"maior de serem selecionados." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "O intervalo do último membro" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Latência" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Última Negociação" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Folha" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Aprenda" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "Aprenda as rotas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Arquivo de atribuições" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Tempo de concessão" @@ -4551,7 +5099,7 @@ msgstr "Deixe vazio para detectar automaticamente" msgid "Leave empty to use the current WAN address" msgstr "Deixe vazio para usar o endereço WAN atual" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4562,33 +5110,29 @@ msgstr "" "significativamente reduzida quando estes são usados. Evite a utilização do " "802,11b sempre que possível." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "Foram detectadas regras legadas" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Legenda:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Limite" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Atenuação de Linha (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" -msgstr "Modo da Linha" +msgstr "Modo da linha" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" -msgstr "Estado da Linha" +msgstr "Estado da linha" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" -msgstr "Tempo de Atividade da Linha" +msgstr "Tempo de atividade da linha" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:125 msgid "Link Aggregation (Channel Bonding)" @@ -4607,17 +5151,19 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "Bits do cabeçalho da camada do enlace %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Lista dos endereços IP que serão convertidos em respostas NXDOMAIN." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" "Lista os conjuntos dos IPs para preencher os IPs com domínios especificados." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4631,7 +5177,7 @@ msgstr "" "um endereço MAC de destino ao solicitar a chave PMK-R1 a partir do R0KH que " "o STA usado durante a Associação de Domínio de Mobilidade Inicial." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4649,24 +5195,21 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Lista de arquivos de chaves SSH para autenticação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Lista dos domínios com permissão para respostas RFC1918." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Lista dos domínios que serão impostos num endereço IP." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" "Lista de resolvedores upstream para onde as consultas serão encaminhadas." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Porta de escuta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Interfaces de escuta" @@ -4675,7 +5218,7 @@ msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" "Escuta apenas na interface especificada. Se não especificado, escuta em todas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4685,7 +5228,7 @@ msgstr "Escute somente nestas interfaces e na interface local (loopback)." msgid "ListenPort setting is invalid" msgstr "A configuração ListenPort está inválida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Porta de escuta para o recebimento das consultas do DNS." @@ -4694,7 +5237,7 @@ msgstr "Porta de escuta para o recebimento das consultas do DNS." msgid "Load" msgstr "Carga" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Carga média" @@ -4702,27 +5245,28 @@ msgstr "Carga média" msgid "Load configuration…" msgstr "Carrega a configuração…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Carregando os dados…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Carregando conteúdo do diretório…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Carregando a visualização…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Local" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Endereço IP local" @@ -4742,11 +5286,12 @@ msgstr "Endereço IP local para atribuir" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Endereço IPv4 local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Servidor DNS IPv6 local" @@ -4762,46 +5307,72 @@ msgstr "Endereço IPv6 local" msgid "Local Startup" msgstr "Iniciação local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Hora local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "ULA local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Domínio local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "O sufixo do domínio local anexado aos nomes DHCP e as entradas dos arquivos " "hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Servidor local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Somente o serviço local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Chave wireguard local" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Localizar consultas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "Código de área do local" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Bloqueio para BSSID" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 -msgid "Log output level" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Registro do incidente \"%h…\"" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Entrar" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Para fazer login…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Sair" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 +msgid "Log output level" msgstr "Nível de detalhamento de saída dos registros" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Registar as consultas" @@ -4827,39 +5398,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "Rede lógica onde o túnel será adicionado (bridged) (opcional)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Entrar" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Sair" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "Filtragem livre" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "" -"Segundos de Perda de Sinal (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "O endereço mais baixo concedido como deslocamento do endereço da rede." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Modo de compatibilidade lua ativo" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "Endereço MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Filtro de Endereço MAC" @@ -4867,16 +5427,15 @@ msgstr "Filtro de Endereço MAC" msgid "MAC Address For The Actor" msgstr "Endereço MAC Para o Ator" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "VLAN MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4885,11 +5444,15 @@ msgstr "VLAN MAC" msgid "MAC address" msgstr "Endereço MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Filtro de MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Lista de MAC" @@ -4903,6 +5466,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "A regra MAC é inválida" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "Celular MBIM" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4924,15 +5491,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "Intervalo MII" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4942,7 +5513,7 @@ msgstr "" "abaixo:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4951,71 +5522,69 @@ msgstr "" msgid "Manual" msgstr "Manual" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "Fabricante" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Mestre" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "Intervalo máximo RA" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "" -"Taxa de Dados Atingível Máxima (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" -msgstr "" -"Numero máximo de concessões DHCP" +msgstr "Máximas concessões do DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" -msgstr "" -"Tamanho máximo do pacote do EDNS0" +msgstr "Tamanho máximo do pacote EDNS0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Número máximo de consultas concorrentes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Idade máxima" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Intervalo máximo permitido de escuta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "A quantidade máxima permitida para as alocações ativas do DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "A quantidade máxima permitida de consultas concorrentes do DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "O tamanho máximo permitido dos pacotes UDP EDNS.0." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Tempo máximo, em segundos, para esperar que o modem fique pronto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Número máximo de endereços atribuídos." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "Tamanho máximo da tabela de monitoramento (snooping)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -5024,10 +5593,14 @@ msgstr "" "title=\"Anúncio do roteador, ICMPv6 Tipo 134\">RA. O tempo " "predefinido é de 600 segundos." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Potência máxima de transmissão" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Pode impedir o funcionamento do VoIP ou de outros serviços." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -5054,7 +5627,7 @@ msgstr "Memória" msgid "Memory usage (%)" msgstr "Uso da memória (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -5062,10 +5635,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "ID de Mesh" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Identificador da Malha" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Roteamento mesh" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Opções relacionadas ao mesh e ao roteamento" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Método não encontrado" @@ -5078,7 +5659,7 @@ msgstr "Método de monitoramento de enlace" msgid "Method to determine link status" msgstr "Método para determinar a condição do enlace" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -5089,11 +5670,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "Intervalo mínimo RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Tempo de validade mínima do ARP" @@ -5101,7 +5682,7 @@ msgstr "Tempo de validade mínima do ARP" msgid "Minimum Number of Links" msgstr "Quantidade Mínima de Enlaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." @@ -5109,7 +5690,7 @@ msgstr "" "O tempo mínimo necessário em segundos antes que uma entrada ARP possa ser " "substituída. Impede que o cache ARP seja descarado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -5126,35 +5707,49 @@ msgstr "Porta de monitoramento do espelho" msgid "Mirror source port" msgstr "Porta de origem do espelho" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "Código do país do celular" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Dados móveis" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "Código da rede móvel" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "Serviço móvel" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Domínio da Mobilidade" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Modo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Modelo" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Destruição do portador do modem em andamento." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "Informações sobre o modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5162,43 +5757,36 @@ msgstr "" "Conexão do modem em andamento. Aguarde. Este processo terminará após 2 " "minutos." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Padrão do modem" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Dispositivo do Modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Desconexão do modem em andamento. Aguarde." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "A consulta das informações do modem falhou" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Estouro de tempo da iniciação do modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "O modem está desativado." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "ModemManager" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" @@ -5268,6 +5856,10 @@ msgstr "Mover para baixo" msgid "Move up" msgstr "Mover para cima" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Multi para Unicast" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5275,19 +5867,23 @@ msgstr "Mover para cima" msgid "Multicast" msgstr "Multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Modo multicast" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Roteamento multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "Multicast para unicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "Cadeia de ação NAT \"%h\"" @@ -5299,12 +5895,16 @@ msgstr "Modo NAT-T" msgid "NAT64 Prefix" msgstr "Prefixo NAT64" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "Prefixo NAT64" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "NDP-Proxy escravo" @@ -5317,18 +5917,23 @@ msgid "NTP server candidates" msgstr "Candidatos a servidor NTP" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Nome" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Nome da nova rede" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Nome do túnel do dispositivo" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navegação" @@ -5337,13 +5942,17 @@ msgstr "Navegação" msgid "Nebula Network" msgstr "Rede Nebulosa" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Relatório da vizinhança" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "Validade do cache vizinho" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5352,32 +5961,36 @@ msgstr "Validade do cache vizinho" msgid "Network" msgstr "Rede" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Codificação da rede" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "Modo de rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "Registro da rede" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "Rede SSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Utilitários de Rede" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "Endereço de rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Imagem de boot pela rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "Migração da configuração da ponte de rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Dispositivo de rede" @@ -5390,7 +6003,7 @@ msgstr "Atividade do dispositivo de rede (kernel: netdev)" msgid "Network device is not present" msgstr "O dispositivo de rede não está presente" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "Tabela dos dispositivos de rede \"%h\"" @@ -5399,7 +6012,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "Bits do cabeçalho da rede %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Migração da configuração do ifname da rede" @@ -5408,15 +6021,20 @@ msgstr "Migração da configuração do ifname da rede" msgid "Network interface" msgstr "Interfaces de rede" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "Network-ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Nunca" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Nunca" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5424,11 +6042,11 @@ msgstr "" "Nunca encaminhe os domínios e os subdomínios coincidentes, resolva apenas a " "partir do DHCP ou apenas dos arquivos hospedados." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Uma nova interface para \"%s\" não pode ser criada: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Nome de nova interface…" @@ -5436,13 +6054,13 @@ msgstr "Nome de nova interface…" msgid "Next »" msgstr "Próximo »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Não" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Nenhum Servidor DHCP configurado para esta interface" @@ -5450,7 +6068,7 @@ msgstr "Nenhum Servidor DHCP configurado para esta interface" msgid "No Data" msgstr "Sem dados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Sem criptografia" @@ -5466,9 +6084,17 @@ msgstr "Sem NAT-T" msgid "No RX signal" msgstr "Sem sinal RX" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Nenhuma interface WireGuard foi configurada." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5482,7 +6108,11 @@ msgstr "" msgid "No client associated" msgstr "Não há nenhum cliente associado" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Nenhum dispositivo de controle foi especificado" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "Sem dados" @@ -5491,8 +6121,8 @@ msgstr "Sem dados" msgid "No data received" msgstr "Nenhum dado recebido" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "Sem imposição" @@ -5505,15 +6135,11 @@ msgstr "Sem imposição" msgid "No entries available" msgstr "Não há entradas disponíveis" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Nenhuma entrada neste diretório" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Nenhum arquivo encontrado" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5529,7 +6155,7 @@ msgstr "" msgid "No host route" msgstr "Nenhuma rota para o host" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5550,30 +6176,39 @@ msgstr "Não há mais escravos disponíveis" msgid "No more slaves available, can not save interface" msgstr "Não há mais escravos disponíveis, não é possível salvar a interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Nenhum cache negativo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "Nenhuma regra nftables foi carregada." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Nenhuma senha definida!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Nenhum par conectado" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "Não há pares definidos ainda." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Nenhuma chave pública presente ainda." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "Não há regras nesta cadeia" @@ -5587,7 +6222,8 @@ msgid "No validation or filtering" msgstr "Sem validação ou filtragem" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Nenhuma zona definida" @@ -5599,41 +6235,40 @@ msgstr "Nenhuma zona definida" msgid "Noise" msgstr "Ruído" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "" -"Margem de Ruído (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Margem de ruído" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Ruído:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" -"Erros CRC Não PreemptivosCRC_P" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Sem caracter curinga" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Nenhum" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Não Encontrado" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Não membro" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Não conectado" @@ -5646,7 +6281,7 @@ msgstr "Não conectado" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Não presente" @@ -5658,7 +6293,7 @@ msgstr "Não iniciado na inicialização" msgid "Not supported" msgstr "Sem suporte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5666,6 +6301,15 @@ msgstr "" "Nota: Alguns drivers sem fio não são totalmente compatíveis com 802.11w. O " "mwlwifi pode ter problemas por exemplo" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Observação: você também pode precisar de um proxy DHCP (atualmente " +"indisponível) ao definir uma porta de distribuição não padrão " +"(addr#port)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Anotações" @@ -5674,7 +6318,7 @@ msgstr "Anotações" msgid "Notice" msgstr "Aviso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5682,7 +6326,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "Quantidade de relatórios associados ao IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "A quantidade das entradas DNS em cache, 10000 é o máximo, 0 desativa o cache." @@ -5700,7 +6344,7 @@ msgid "Obfuscated Password" msgstr "Senha Ofuscada" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5711,6 +6355,7 @@ msgid "Obtain IPv6 address" msgstr "Obter Endereço IPv6" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Desligado" @@ -5719,6 +6364,14 @@ msgstr "Desligado" msgid "Off-State Delay" msgstr "Atraso no estado de desligado" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"Desligado: vlanXXX, por ex. vlan1. Em: " +"vlan_tagged_interface.XXX, por ex. eth0.1." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Ligado" @@ -5727,16 +6380,16 @@ msgstr "Ligado" msgid "On-State Delay" msgstr "Atraso no estado de conexões" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "Rota em enlace" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "" "É necessário especificar ao menos um nome de equipamento ou endereço MAC!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Um dos seguintes: %s" @@ -5754,7 +6407,11 @@ msgstr "Um ou mais valores inválidos/obrigatórios na aba" msgid "One or more required fields have no value!" msgstr "Um ou mais campos obrigatórios não tem valor!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" "Quando ativada, permita apenas a comunicação com as portas não isoladas da " @@ -5767,25 +6424,24 @@ msgstr "" "Somente caso o escravo ativo atual falhe e o escravo primário esteja ativo " "(falha, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "Abrir a visão geral das regras do iptables…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Abrir lista..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5803,7 +6459,7 @@ msgstr "" "Opere no modo de distribuição caso uma interface master esteja " "configurada e ativa, caso contrário, recue para o modo servidor." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." @@ -5811,12 +6467,24 @@ msgstr "" "Opere no modo distribuição, caso um prefixo \"IPv6 upstream\" " "esteja presente, caso contrário, desative o serviço." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Frequência de Operação" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "Operador" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "Código do operador" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "Nome do operador" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "A opção \"%s\" contém um valor inválido de entrada." @@ -5824,22 +6492,33 @@ msgstr "A opção \"%s\" contém um valor inválido de entrada." msgid "Option \"%s\" must not be empty." msgstr "A opção \"%s\" não deve estar vazia." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Opção alterada" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Opção removida" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Opcional" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Opcional, anotações diversas sobre este dispositivo" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" +"Em segundo, opcional. Caso seja definido como '0', nenhuma tentativa de " +"reconexão será feita." + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5848,7 +6527,7 @@ msgstr "" "Opcional. Marca 32 bits dos pacotes cifrados que estão saindo. Entre valores " "em hexadecimal, começando com 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5860,7 +6539,7 @@ msgstr "" "um servidor, use este sufixo (como '::1') para formar o endereço IPv6 ('a:b:" "c:d::1') para esta interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5868,11 +6547,11 @@ msgstr "" "Opcional. Chave pré-compartilhada codificada com base64. Adiciona uma camada " "adicional de criptografia da chave simétrica para resistência pós-quântica." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Opcional. Cria rotas para endereços IP Autorizados para este parceiro." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Opcional. Descrição do parceiro." @@ -5880,7 +6559,7 @@ msgstr "Opcional. Descrição do parceiro." msgid "Optional. Do not create host routes to peers." msgstr "Opcional. Não crie rotas de hospedagem para seus pares." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." @@ -5888,7 +6567,7 @@ msgstr "" "Opcional. Equipamento do parceiro. Nomes serão resolvido antes de levantar a " "interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5906,11 +6585,11 @@ msgstr "Opcional. Unidade máxima de transmissão da interface XFRM." msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Opcional. Unidade Máxima de Transmissão da interface do túnel." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Opcional. Porta do parceiro." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5922,7 +6601,7 @@ msgstr "" "pares ou o código QR, caso esteja disponível. Ele pode ser removido após a " "exportação da configuração." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5939,7 +6618,7 @@ msgstr "Opcional. Porta UDP usada para pacotes saintes ou entrantes." msgid "Options" msgstr "Opções" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" para a rota padrão. 0.0.0.0 significa " "\"o endereço do sistema executando o dnsmasq\"." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "Opções:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Ordinal: o menor vem primeiro." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Intervalo do originador" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "Outro:" @@ -5974,7 +6662,7 @@ msgstr "Saindo:" msgid "Outgoing checksum" msgstr "Checksum de Saída" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "Interface de saída" @@ -5982,6 +6670,7 @@ msgstr "Interface de saída" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "Chave de Saída" @@ -6005,21 +6694,23 @@ msgstr "Zona de saída" msgid "Overlap" msgstr "Sobreposição" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "Substitua a tabela de roteamento IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "Substitua a tabela de roteamento IPv6" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -6027,10 +6718,9 @@ msgstr "Substitua a tabela de roteamento IPv6" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" -msgstr "" -"Sobrescrever o MTU" +msgstr "Substituir o MTU" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:74 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:79 @@ -6050,7 +6740,7 @@ msgstr "Sobrescrever o TOS" msgid "Override TTL" msgstr "Sobrescrever o TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -6066,7 +6756,7 @@ msgstr "Sobrescrever o nome da nova interface" msgid "Override the gateway in DHCP responses" msgstr "Sobrescrever o roteador padrão nas respostas do DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -6083,7 +6773,7 @@ msgstr "Sobrescrever a tabela usada para as rotas internas" msgid "Overview" msgstr "Visão geral" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "Sobrescrever o arquivo existente \"%s\" ?" @@ -6092,17 +6782,30 @@ msgid "Overwrite the current settings with the imported configuration?" msgstr "" "Substituir as configurações atuais com a configuração que foi importada?" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "Números próprios" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Dono" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (ambos)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -6114,8 +6817,9 @@ msgid "PAP/CHAP password" msgstr "Senha do PAP/CHAP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -6126,6 +6830,7 @@ msgstr "Senha do PAP/CHAP" msgid "PAP/CHAP username" msgstr "Usuário do PAP/CHAP" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "Tipo de PDP" @@ -6135,8 +6840,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "PIN" @@ -6146,7 +6852,7 @@ msgstr "PIN" msgid "PIN code rejected" msgstr "Código PIN rejeitado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "PMK R1 Push" @@ -6187,28 +6893,37 @@ msgstr "Deslocamento PSID" msgid "PSID-bits length" msgstr "Comprimento dos bits PSID" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM (Modo de transferência dos pacotes)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "Configurações PXE/TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "Estado do serviço de pacotes" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "Desviando pacotes" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "Marcação do pacote" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Tempo de recebimento dos pacotes" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "Pacotes" @@ -6217,23 +6932,30 @@ msgstr "Pacotes" msgid "Packets To Transmit Before Moving To Next Slave" msgstr "Pacotes que serão transmitidos antes de passar para o próximo escravo" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "" +msgstr[1] "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Parte da zona %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "Passagem direta (Dispositivo físico espelhado para um único MAC VLAN)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Senha" @@ -6241,11 +6963,11 @@ msgstr "Senha" msgid "Password authentication" msgstr "Autenticação por senha" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Senha da chave privada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "Senha interna da chave privada" @@ -6256,20 +6978,20 @@ msgstr "Senha interna da chave privada" msgid "Password strength" msgstr "Força da senha" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "Senha2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "Colar ou arrastar arquivo chave SSH…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "" "Cole ou arraste o arquivo de configuração do par (wg0.conf) do WireGuard…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " @@ -6279,31 +7001,31 @@ msgstr "" "de um outro sistema abaixo para criar uma entrada correspondente do par, " "permitindo que o sistema se conecte à interface local do WireGuard." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "Cole ou arraste o arquivo fornecido da configuração WireGuard…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Caminho para o certificado CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Caminho para o certificado do cliente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Caminho para a chave privada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Caminho interno para o certificado CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Caminho interno para o certificado do cliente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Caminho interno para a chave privada" @@ -6325,11 +7047,19 @@ msgstr "Pausado" msgid "Peak:" msgstr "Pico:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Parceiro" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Detalhes do par" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Endereço IP do parceiro para atribuir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "Endereço MAC dos pares" @@ -6338,11 +7068,11 @@ msgstr "Endereço MAC dos pares" msgid "Peer address is missing" msgstr "O endereço do parceiro está ausente" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Nome do dispositivo dos pares" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Par desativado" @@ -6373,10 +7103,14 @@ msgstr "Restaure as configurações iniciais" msgid "Permission denied" msgstr "Permissão negada" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Manutenção da Conexão Persistente" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Intervalo de reconexão persistente" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "A configuração PersistentKeepAlive está inválida" @@ -6385,13 +7119,13 @@ msgstr "A configuração PersistentKeepAlive está inválida" msgid "Phy Rate:" msgstr "Taxa física:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Configurações Físicas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6404,11 +7138,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pcts." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Entre com o nome do seu usuário e a senha." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Por favor, selecione o arquivo para enviar." @@ -6416,57 +7150,74 @@ msgstr "Por favor, selecione o arquivo para enviar." msgid "Policy" msgstr "Política" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "Política: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Porta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Porta %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Isolamento da porta" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Status da porta:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Negação potencial de: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Modo de Gerenciamento de Energia" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "" -"Erros CRC PreemptivosCRCP_P" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "Condição da energia" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Preferir LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Preferir UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Prefixo Delegado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "Supressor de prefixos" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Chave pré-compartilhada" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "Chave pré-compartilhada em uso" @@ -6491,15 +7242,18 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Impede a comunicação de cliente para cliente" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"Impede que um cliente sem fio converse com outro. Esta configuração afeta " +"apenas os pacotes sem qualquer tag VLAN (pacotes não marcados)." + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Escravo Primário" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "ID primária da VLAN" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6512,29 +7266,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "O primário se torna um escravo ativo sempre que retornar (sempre, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Prioridade" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "Privado" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "Privado (Impede a comunicação entre o MAC das VLANs)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" -msgstr "Chave Privada" +msgstr "Chave privada" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "Chave privada presente" @@ -6552,8 +7308,8 @@ msgid "Prot." msgstr "Protocolo" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6563,9 +7319,9 @@ msgstr "Protocolo" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:282 msgid "Provide NTP server" -msgstr "Fornecer serviço NTP" +msgstr "Fornecer um servidor NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6573,7 +7329,7 @@ msgstr "" "Forneça um servidor DHCPv6 nesta interface e também responda às solicitações " "e pedidos deste protocolo." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Prover nova rede" @@ -6585,25 +7341,36 @@ msgstr "" "Forneça um servidor NTP à interface selecionada ou, se não for definido, a " "todas as interfaces" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Servidor de proxy" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Ad-Hoc falso (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Chave Pública" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "Falta a chave pública" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "Chave pública: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6634,61 +7401,83 @@ msgstr "Celular QMI" msgid "Quality" msgstr "Qualidade" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." -msgstr "" -"Consulte todos os servidores DNS " -"disponíveis." +msgstr "Consulte todos os resolvedores disponíveis." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Intervalo da consulta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Intervalo de resposta à consulta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "Validade da Chave R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "Detentor da Chave R1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Porta de contabilidade do RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Segredo da contabilidade do RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Servidor da contabilidade do RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Porta de autenticação do RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Segredo da autenticação do RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Servidor da autenticação do RADIUS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "Atribuição dinâmica da VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "RADIUS via VLAN STA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "Esquema de nomenclatura da ponte VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "Nomeação da VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "Interface com tags VLAN RADIUS" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "Modo NAT-T (RFC3947)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "Pré-autenticação RSN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "Limite de RSSI para a adesão" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Limiar RTS/CTS" @@ -6701,10 +7490,18 @@ msgstr "RX" msgid "RX Rate" msgstr "Taxa de RX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "Taxa de RX / Taxa de TX" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"Medição dos recursos do rádio - Envia sinais para auxiliar o roaming. Nem " +"todos os clientes são compatíveis." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6716,11 +7513,11 @@ msgstr "" "Bytes brutos codificados em hexadecimal. Deixe vazio a não ser que seu " "provedor requeira isso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Leia o /etc/ethers para configurar o servidor DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Realmente trocar o protocolo?" @@ -6728,11 +7525,11 @@ msgstr "Realmente trocar o protocolo?" msgid "Realtime Graphs" msgstr "Gráficos em Tempo Real" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Limite para Reassociação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Proteção contra \"Rebind\"" @@ -6756,11 +7553,39 @@ msgstr "Reinicia o sistema operacional do seu dispositivo" msgid "Receive" msgstr "Receber" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Dados recebidos" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Recomendado. Endereços IP da interface do WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Tempo limite da reconexão" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Reconectar esta interface" @@ -6768,12 +7593,12 @@ msgstr "Reconectar esta interface" msgid "Redirect to HTTPS" msgstr "Redireciona para HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "Faça o redirecionamento para a porta local %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "Faça o redirecionamento para o sistema local" @@ -6782,31 +7607,39 @@ msgstr "Faça o redirecionamento para o sistema local" msgid "References" msgstr "Referências" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Atualiza os canais" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Atualizando" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "Estado do registro" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "Rejeite o pacote IPv4 com o ICMP tipo %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "Rejeite o pacote com o ICMP tipo %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "Rejeite o pacote com o ICMPv6 tipo %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "Rejeite o pacote com TCP reset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" @@ -6815,6 +7648,8 @@ msgstr "" "ou igual ao valor especificado" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Retransmissor" @@ -6824,6 +7659,12 @@ msgstr "Retransmissor" msgid "Relay Bridge" msgstr "Ponte por Retransmissão" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"Retransmita as solicitações DHCP em outro lugar. OK: v4 v4↔, v6 v6↔. Não " +"está OK: v4 v6, v6↔v4↔." + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Encaminha o tráfego entre as redes" @@ -6833,6 +7674,14 @@ msgstr "Encaminha o tráfego entre as redes" msgid "Relay bridge" msgstr "Ponte por retransmissão" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6842,6 +7691,7 @@ msgstr "Endereço IPv4 remoto" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Endereço IPv4 remoto ou FQDN" @@ -6854,15 +7704,25 @@ msgstr "Endereço IPV6 remoto" msgid "Remote IPv6 address or FQDN" msgstr "Endereço IPv6 remoto ou FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Remover" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" +"Remova os endereços IPv4 dos resultados e retorne apenas endereços IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" +"Remova os endereços IPv6 dos resultados e retorne apenas endereços IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "Remova as configurações do dispositivo relacionados à configuração" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Substituir a configuração da rede sem fio" @@ -6892,7 +7752,8 @@ msgstr "Exigir o checkum na entrada (opcional)." msgid "Require incoming packets serialization (optional)." msgstr "Exigir a serialização dos pacotes na entrada (opcional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Necessário" @@ -6910,7 +7771,7 @@ msgid "Required. Path to the .yml config file for this interface." msgstr "" "Obrigatório. O caminho para o arquivo de configuração .yml desta interface." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "Obrigatório. Chave pública do par WireGuard." @@ -6922,67 +7783,75 @@ msgstr "Obrigatório. Interface subjacente." msgid "Required. XFRM interface ID to be used for SA." msgstr "Obrigatório. ID da interface XFRM que será usado para SA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" +"Obrigatório: Rejeita a autenticação caso o servidor RADIUS não forneça os " +"atributos apropriados da VLAN." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Requer hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Requer um hostapd com suporte ao EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Requer hostapd com suporte EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Requer hostapd com suporte OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Requer hostapd com suporte a SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Requer hostapd com suporte WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Requer wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Requer um wpa-supplicant com suporte ao EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Requer wpa-supplicant com suporte EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Requer wpa-supplicant com suporte OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Requer wpa-supplicant com suporte SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Requer wpa-supplicant com suporte WEP" @@ -6991,7 +7860,7 @@ msgid "Reselection policy for primary slave" msgstr "Política de nova seleção para o escravo primário" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -7006,20 +7875,24 @@ msgstr "Reinicie os contadores" msgid "Reset to defaults" msgstr "Redefina para os valores padrão" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Arquivos resolv e hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Arquivo resolv" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Lista dos domínios que serão impostos num endereço IP." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Recurso não encontrado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Reiniciar" @@ -7028,7 +7901,7 @@ msgstr "Reiniciar" msgid "Restart Firewall" msgstr "Reinicie o firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Reinicie a interface do rádio" @@ -7040,7 +7913,7 @@ msgstr "Restauração" msgid "Restore backup" msgstr "Restaure uma cópia de segurança" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -7048,83 +7921,98 @@ msgstr "" "Retorne as respostas às consultas DNS que coincidam com à sub-rede da qual a " "consulta foi recebida caso vários IPs estejam disponíveis." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Revele/oculte a senha" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "Filtro de caminho reverso" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Reverta" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Reverta as alterações" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" "O pedido para reverter as configurações falhou com o estado %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Revertendo configurações…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "Revisão" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "Substitua o destino para %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "Substitua o destino para %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Substitua o destino para %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Substitua o destino para %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "Substitua a origem para %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "Substitua a origem para %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "Substitua a origem para %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "Substitua a origem para %h, porta %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "Substitua para o endereço do dispositivo de saída" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" +"Rede de segurança robusta (RSN): Permite a pré-autenticação do roaming para " +"redes WPA2-EAP (e as anuncia nos beacons WLAN). Só funciona se a interface " +"de rede especificada for uma ponte. Encurta o tempo do crítico processo de " +"reassociação." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Robustez" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -7142,19 +8030,19 @@ msgstr "Prepação da raiz (/)" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Política Round-Robin (balanço-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Roteie Andereços IP Autorizados" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "Cadeia de ação rota \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Tipo de rota" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7175,6 +8063,10 @@ msgstr "Senha do Roteador" msgid "Routing" msgstr "Roteamento" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Algoritmo de roteamento" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7189,24 +8081,24 @@ msgstr "" msgid "Rule" msgstr "Regra" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "Ações da regra" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "Comentário da regra: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "Regra da cadeia de contêineres \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "Correspondências das regras" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Tipo da regra" @@ -7227,11 +8119,24 @@ msgstr "Erro de execução" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "SIMs" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7249,15 +8154,15 @@ msgstr "Porta do servidor SSH" msgid "SSH username" msgstr "Usuário do SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "Chaves SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7274,7 +8179,7 @@ msgstr "Servidor SSTP" msgid "SWAP" msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7285,7 +8190,7 @@ msgid "Save" msgstr "Salvar" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Salvar & Aplicar" @@ -7302,7 +8207,7 @@ msgstr "Salve o bloco mtd" msgid "Save mtdblock contents" msgstr "Salve o conteúdo do bloco mtd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Procurar" @@ -7311,11 +8216,16 @@ msgstr "Procurar" msgid "Scheduled Tasks" msgstr "Tarefas Agendadas" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "A seção %s está vazia." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Seção adicionada" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Seção removida" @@ -7333,9 +8243,9 @@ msgstr "" "do formato da imagem falhe. Use somente caso tenha certeza que o firmware " "está correto e é compatível com o seu dispositivo!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Selecione o arquivo…" @@ -7345,7 +8255,7 @@ msgstr "" "Seleciona a política de transmissão do hash para utilizar com a seleção dos " "escravos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7353,7 +8263,7 @@ msgstr "" "Envie mensagens do RA anunciando este dispositivo como sendo um roteador IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "Envie os redirecionamentos do ICMP" @@ -7374,11 +8284,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "Envie o nome de host deste dispositivo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Servidor" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Endereço do servidor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Nome do servidor" @@ -7403,18 +8317,22 @@ msgstr "Sessão expirada" msgid "Set Static" msgstr "Define como estático" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "Defina o campo do cabeçalho %s para %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" "Define a interface como sendo um escravo NDP-Proxy externo. A predefinição é " "estar desligado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7427,7 +8345,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "Defina o mesmo endereço MAC para todos os escravos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7438,7 +8356,7 @@ msgstr "" "roteador\">RA. Quando ativo, os clientes executarão a configuração " "automática de endereço IPv6 sem estado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7454,49 +8372,55 @@ msgstr "Definido como um escravo atualmente ativo (ativo, 1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "Definido como o primeiro escravo adicionado ao vínculo (seguir, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Configurar Servidor DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Rotas de configuração para vizinhos IPv6 que tiverem proxy." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 msgid "Setting PLMN failed" -msgstr "" -"A configuração da PLNM " -"falhou" +msgstr "A configuração do PLMN falhou" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "A configuração do modo de operação falhou" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Configurações" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "Rotas de configuração para vizinhos IPv6 que tiverem proxy." - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" -"Segundos com erro severos (SES)" +"Configurações para auxiliar os clientes sem fio com o roaming entre vários " +"APs: 802.11r, 802.11k e 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "GI curto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Preâmbulo curto" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Mostra a lista atual de arquivos para a cópia de segurança" @@ -7509,16 +8433,16 @@ msgstr "Mostrar as correntes vazias" msgid "Show raw counters" msgstr "Mostrar contadores brutos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Desligar esta interface" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7526,15 +8450,15 @@ msgstr "Desligar esta interface" msgid "Signal" msgstr "Sinal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Sinal / Ruído" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Atenuação do Sinal (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Qualidade do sinal" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Taxa de atualização do sinal" @@ -7542,12 +8466,12 @@ msgstr "Taxa de atualização do sinal" msgid "Signal:" msgstr "Sinal:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Tamanho" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Tamanho do cache de consultas DNS" @@ -7564,12 +8488,12 @@ msgstr "Pular" msgid "Skip from backup files that are equal to those in /rom" msgstr "Ignore os arquivos de backup que sejam iguais aos arquivos em /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Pular para o conteúdo" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Pular para a navegação" @@ -7587,14 +8511,10 @@ msgstr "VLAN em Software" msgid "Some fields are invalid, cannot save values!" msgstr "Alguns campos estão inválidos e os valores não podem ser salvos!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Desculpe o objeto solicitado não foi encontrado." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Desculpe, o servidor encontrou um erro inesperado." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7605,8 +8525,8 @@ msgstr "" "firmware deve ser gravada manualmente. Por favor, consulte a wiki para " "instruções específicas da instalação deste dispositivo." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7633,7 +8553,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "Porta de origem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7641,7 +8561,7 @@ msgstr "" "Opções especiais de inicialização PXE para o Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7650,7 +8570,7 @@ msgstr "" "DHCPv6. Se não for definido, o domínio de pesquisa DNS do dispositivo local " "será anunciado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7661,7 +8581,7 @@ msgstr "" "servidor DNS IPv6, a menos que a opção Local IPv6 DNS seja " "desativada." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7695,7 +8615,7 @@ msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" "Especifica a frequência de monitoramento do enlace MII em milissegundos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "Especifica o valor TOS para corresponder nos cabeçalhos IP" @@ -7703,7 +8623,7 @@ msgstr "Especifica o valor TOS para corresponder nos cabeçalhos IP" msgid "Specifies the aggregation selection logic to use" msgstr "Especifica a lógica de seleção da agregação que será utilizada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "Especifica a sub-rede de destino que será correspondida (notação CIDR)" @@ -7711,7 +8631,7 @@ msgstr "Especifica a sub-rede de destino que será correspondida (notação CIDR msgid "Specifies the directory the device is attached to" msgstr "Especifica o diretório que o dispositivo está conectado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7721,7 +8641,7 @@ msgstr "" "do roteador\">RA, por exemplo, para instruir os clientes que " "solicitem mais informações através do estado do DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" @@ -7730,7 +8650,7 @@ msgstr "" "0xFF que corresponda a marca 255 ou 0x0/0x1 para coincidir com qualquer " "valor marcado como par" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "Especifica o nome da interface lógica de entrada" @@ -7767,7 +8687,7 @@ msgstr "" "Especifica a quantidade máxima de segundos antes de considerar que um " "equipamento está morto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7789,7 +8709,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "Especifica o modo de ligação que será utilizado por esta interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7833,15 +8753,15 @@ msgstr "" "ligação envia os pacotes de aprendizado para cada comutador dos pares " "escravos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "Especifica a ordem das regras de IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "Especifica o nome da interface lógica de saída" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7870,19 +8790,19 @@ msgstr "" "Determina a política da nova seleção para o escravo primário quando ocorre " "uma falha do escravo ativo ou durante a recuperação do escravo primário" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "Especifica a métrica da rota que será usada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "Especifica o tipo de rota que será criado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "Especifica a ação de roteamento de destino de regra" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "Especifica a sub-rede de origem para ser correspondida (notação CIDR)" @@ -7906,7 +8826,7 @@ msgstr "" "Determina o tempo em milissegundos da espera antes que um escravo seja " "ativado após a detecção de recuperação do enlace" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7998,8 +8918,8 @@ msgid "" "Specify a TTL (Time to Live) for the encapsulating packet other than the " "default (64)." msgstr "" -"Especifica o tempo de vida (TTL) para os " -"pacotes encapsulados ao invés do padrão (64)." +"Especifique um TTL (tempo de vida) diferente para o pacote de encapsulamento " +"do padrão (64)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84 msgid "" @@ -8027,18 +8947,26 @@ msgid "" "Specify an MTU (Maximum Transmission Unit) other than the default (1280 " "bytes)." msgstr "" -"Especifica a unidade máxima de transmissão (MTU) ao invés do valor padrão (1280 bytes)." +"Especifique uma MTU (unidade máxima de transmissão) diferente da padrão " +"(1280 bytes)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Especifique a chave de cifragem secreta aqui." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "Splitterless ADSL (G.992.2) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "Obsolescência do tempo limite do cache vizinho" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Início" @@ -8051,16 +8979,16 @@ msgstr "Iniciar o WPS" msgid "Start priority" msgstr "Prioridade de iniciação" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Iniciar atualização" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Iniciando a aplicação da configuração…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Iniciando o escaneamento da rede sem fio..." @@ -8069,6 +8997,10 @@ msgstr "Iniciando o escaneamento da rede sem fio..." msgid "Startup" msgstr "Iniciação" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Estado" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Rotas Estáticas IPv4" @@ -8082,7 +9014,7 @@ msgstr "Rotas Estáticas IPv6" msgid "Static Lease" msgstr "Alocação estática" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Alocações Estáticas" @@ -8092,7 +9024,7 @@ msgstr "Alocações Estáticas" msgid "Static address" msgstr "Endereço Estático" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -8103,18 +9035,18 @@ msgstr "" "configurações não dinâmicas onde um computador com uma alocação estática for " "disponibilizada." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Limite de inatividade da estação" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" -msgstr "Condição Geral" +msgstr "Condição geral" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Parar" @@ -8123,8 +9055,8 @@ msgstr "Parar" msgid "Stop WPS" msgstr "Pare o WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Parar atualização" @@ -8132,11 +9064,11 @@ msgstr "Parar atualização" msgid "Storage" msgstr "Uso do armazenamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "Filtragem rigorosa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Ordem Exata" @@ -8145,15 +9077,15 @@ msgid "Strong" msgstr "Forte" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Enviar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Suprimir registros (log)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "Suprima dos registros (log) as operações rotineiras do protocolo DHCP." @@ -8186,7 +9118,7 @@ msgstr "Switch VLAN" msgid "Switch port" msgstr "Porta do switch" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Trocar o protocolo" @@ -8196,7 +9128,7 @@ msgstr "Trocar o protocolo" msgid "Switch to CIDR list notation" msgstr "Alternar para a notação da lista CIDR" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Link simbólico" @@ -8208,8 +9140,16 @@ msgstr "Sincronize com o servidor NTP" msgid "Sync with browser" msgstr "Sincronize com o navegador" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Sintaxe: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Sintaxe: _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -8233,9 +9173,9 @@ msgstr "Propriedades do Sistema" msgid "System log buffer size" msgstr "Tamanho do buffer de registro do sistema" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "Sistema funcionando em modo de recuperação (initramfs)." @@ -8264,7 +9204,7 @@ msgstr "Porta de origem TCP" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Raiz do servidor TFTP" @@ -8277,26 +9217,37 @@ msgstr "TX" msgid "TX Rate" msgstr "Taxa de TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "Comprimento da fila TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tabela" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Marcado" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Destino" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "Plataforma alvo" @@ -8312,7 +9263,7 @@ msgstr "Espaço temporário" msgid "Terminate" msgstr "Terminar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8322,7 +9273,7 @@ msgstr "" "nas mensagens do RA. O mínimo são 1280 bytes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." @@ -8330,7 +9281,7 @@ msgstr "" "A configuração do endereço gerenciado o (M) indica que os endereços " "IPv6 estão disponíveis via DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -8338,7 +9289,7 @@ msgstr "" "O Agente doméstico móvel IPv6 (H) indica que o dispositivo também " "está agindo como um agente doméstico móvel IPv6 neste link." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8358,7 +9309,11 @@ msgstr "" "É preciso instalar o pacote qrencode para gerar uma imagem de " "código QR da configuração." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8374,18 +9329,24 @@ msgstr "" "A configuração da atualização de pontas HE.net mudou. Você deve agora usar o " "nome do usuário ao invés do identificador do usuário!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "O endereço IP %h já é utilizado por outra concessão estática" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "O endereço IP está fora de qualquer faixa de endereços do DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "O endereço IP do servidor de inicialização" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "O endereço IPV4 remoto ou o seu FQDN." @@ -8393,6 +9354,7 @@ msgstr "O endereço IPV4 remoto ou o seu FQDN." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "O endereço IPv4 ou o nome completo (FQDN) da ponta remota do túnel." @@ -8409,6 +9371,12 @@ msgstr "" "O endereço IPv6 ou o FQDN (nome de domínio totalmente qualificado) da " "extremidade do túnel remoto." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8420,7 +9388,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "O LED pisca com a frequência configurada de ligado/desligado" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "O LED pisca para simular o batimento cardíaco real." @@ -8438,7 +9406,7 @@ msgstr "O padrão do LED é estar sempre desligado." msgid "The LED is always in default state on." msgstr "O estado padrão do LED está sempre ligado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" @@ -8446,15 +9414,19 @@ msgstr "" "O endereço MAC %h já está sendo usado por outra concessão estática na mesma " "faixa do DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "O MTU não deve exceder o MTU do dispositivo de origem com %d bytes" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "A ID da VLAN deve ser única" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "O algoritmo que é utilizado para descobrir rotas mesh" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8467,7 +9439,7 @@ msgid "The configuration file could not be loaded due to the following error:" msgstr "" "O arquivo de configuração não pode ser carregado devido ao seguinte erro:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8475,7 +9447,7 @@ msgstr "" "O SSID correto deve ser definido manualmente ao se conectar em uma rede " "oculta sem fio" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8502,12 +9474,12 @@ msgstr "" "O arquivo do dispositivo de armazenamento ou da partição (ex: /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "O nome do dispositivo \"%s\" já está em uso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." @@ -8515,7 +9487,7 @@ msgstr "" "A configuração existente da rede precisa ser alterada para que o LuCI " "funcione corretamente." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8538,7 +9510,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "As seguintes regras estão atualmente ativas neste sistema." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" "A frequência está na proporção direta de 1 minuto de carga média da CPU." @@ -8547,19 +9519,19 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "O endereço do gateway não deve ser um endereço de IP local" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" "A configuração gerada pode ser importada para um aplicativo cliente " "WireGuard para configurar uma conexão neste dispositivo." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "A chave pública SSH fornecida já foi adicionada." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8567,15 +9539,35 @@ msgstr "" "A chave pública SSH fornecida é inválida. Por favor, forneça as chaves " "públicas RSA ou ECDSA válidas." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"A configuração de penalidade do salto permite modificar a preferência do " +"batman-adv para as rotas multihop versus rotas curtas. O valor é aplicado ao " +"TQ de cada OGM encaminhado, propagando assim o custo de um salto extra (o " +"pacote deve ser recebido e retransmitido, o que custa tempo de antena)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "O nome do host do servidor de inicialização" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "A interface não pôde ser encontrada" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "O nome da interface já está em uso" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "O nome da interface é muito longo" @@ -8599,6 +9591,7 @@ msgstr "O endereço IPv4 local" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "O endereço IPv4 local sobre o qual o túnel será criado (opcional)." @@ -8613,7 +9606,7 @@ msgstr "A máscara de rede do IPv4 local" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "O endereço IPv6 local sobre o qual o túnel será criado (opcional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8628,7 +9621,7 @@ msgstr "" "saída\" da rede. Um valor reduzido resulta em um menor tempo para detectar a " "perda do último membro de um grupo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8641,7 +9634,7 @@ msgstr "" "menor, uma vez que as respostas do host são espalhadas através de intervalo " "maior" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8649,7 +9642,7 @@ msgstr "" "A quantidade máxima de saltos que serão publicados nas mensagens do RA. O máximo são 255 saltos." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." @@ -8657,7 +9650,7 @@ msgstr "" "O acesso à rede neste dispositivo pode ser interrompido ao alterar as " "configurações da interface \"%h\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "O nome da rede já está sendo usada" @@ -8677,7 +9670,7 @@ msgstr "" "segmentos de rede. Em geral, existe uma porta para o enlace superior " "(uplink) e as demais portas são utilizadas para a rede local." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " @@ -8687,7 +9680,7 @@ msgstr "" "conectar. Geralmente é um endereço IP público estático, um nome de host " "estático ou um domínio DDNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" "O intervalo de resposta da consulta deve ser menor que o valor do intervalo " @@ -8702,7 +9695,7 @@ msgstr "O comando de reinicialização falhou com o código %d" msgid "The restore command failed with code %d" msgstr "O comando de restauração falhou com o código %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8712,15 +9705,15 @@ msgstr "" "Caso seja previsto que uma rede tenha perdas, o valor de robustez pode ser " "aumentado. O IGMP é robusto para perdas de pacotes (Robustness-1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" "O destino da regra é um salto para outra regra especificada pelo seu valor " "prioritário" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8731,11 +9724,11 @@ msgstr "" "rt_tables. Pseudônimos locais especiais (255), principal (254) e padrão " "(253) também são válidos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "O modo %s selecionado é incompatível com a criptografia %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "A chave eletrônica enviada é inválida ou já expirou!" @@ -8776,6 +9769,14 @@ msgstr "A senha do sistema foi alterada com sucesso." msgid "The sysupgrade command failed with code %d" msgstr "O comando sysupgrade falhou com o código %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8802,12 +9803,20 @@ msgstr "" "A imagem carregada não contém um formato suportado. Confirme que você " "escolheu uma imagem para a sua plataforma." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "O valor é substituído pela configuração. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "O valor é substituído pela configuração." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" +"O valor determina o intervalo (em milissegundos) onde o batman-adv inunda a " +"rede com as suas informações de protocolo." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8816,19 +9825,20 @@ msgstr "" "regras do iptables com o nftables é desencorajada e pode levar a uma " "incompleta filtragem de tráfego." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Não há concessões de IP ativas no momento" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Não há alterações a serem aplicadas" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8841,16 +9851,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "Este endereço IPv4 do repassar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Este tipo de autenticação não é aplicável ao método EAP selecionado." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Isso não se parece com um arquivo PEM válido" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8869,6 +9879,24 @@ msgstr "" "Isto é a \"Update Key\" configurada para o túnel ou a senha da cpnta se não " "tem uma \"Update Keu\" configurada" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Este é o dispositivo batman-adv ao qual você deseja vincular o dispositivo " +"físico de cima. Caso esta lista esteja vazia, você precisará criar uma " +"primeiro. Caso queira rotear o tráfego mesh num dispositivo de rede com fio, " +"selecione-o no seletor de dispositivos acima. Caso queira atribuir a " +"interface batman-adv a uma mesh Wi-fi, não selecione um dispositivo no " +"seletor de dispositivos, mas vá para as configurações sem fio e selecione " +"essa interface como uma rede a partir daí." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8886,7 +9914,7 @@ msgstr "" "Este é o endereço da ponta local designado pelo agente de túnel. normalmente " "ele termina com ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "Este é o único servidor DHCP na rede local." @@ -8909,8 +9937,7 @@ msgstr "Este é o sistema de agendamento de tarefas." msgid "" "This is usually the address of the nearest PoP operated by the tunnel broker" msgstr "" -"Este é normalmente o endereço do PoP mais próximo operado pelo agente de túnel" +"Geralmente, é o endereço do PoP mais próximo operado pelo agente do túnel" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:65 msgid "" @@ -8919,8 +9946,8 @@ msgid "" msgstr "" "Esta lista fornece uma visão geral sobre os processos em execução no sistema." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8936,33 +9963,41 @@ msgstr "Esta seção ainda não possui nenhum valor" msgid "Time Synchronization" msgstr "Sincronização de horário" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Tempo do anúncio" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "O tempo em milissegundos" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "Tempo em segundos para gastar na condição de escuta e aprendizagem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Intervalo de tempo para refazer o GTK" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Fuso horário" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "Tempo esgotado" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "Tempo limite em segundos" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" "Tempo limite em segundos para os endereços MAC aprendidos no banco de dados " "do encaminhamento" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" "O tempo limite em segundos até que a topologia faça a atualização da perda " @@ -8972,7 +10007,7 @@ msgstr "" msgid "Timezone" msgstr "Fuso horário" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the ." -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Para fazer login…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8998,7 +10029,7 @@ msgstr "" "clique em \"Restaurar as configurações iniciais\" (somente possível para " "imagens do tipo squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Tom" @@ -9006,12 +10037,16 @@ msgstr "Tom" msgid "Total Available" msgstr "Total disponível" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "Código de rastreamento da área" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -9023,11 +10058,11 @@ msgstr "Tráfego" msgid "Traffic Class" msgstr "Classe de tráfego" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "Cadeia do filtro de tráfego \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "Tráfego correspondente à regra: %.1000mPacotes, %.1024mBytes" @@ -9044,6 +10079,26 @@ msgstr "Transmitir" msgid "Transmit Hash Policy" msgstr "Política de transmissão do hash" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Dados transmitidos" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -9082,7 +10137,7 @@ msgstr "Interface de Tunelamento" msgid "Tunnel Link" msgstr "Enlace do túnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Dispositivo de túnel" @@ -9091,13 +10146,13 @@ msgid "Tx-Power" msgstr "Potência de transmissão" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Tipo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Tipo do serviço" @@ -9146,7 +10201,7 @@ msgstr "Não foi possível determinar o endereço IP externo" msgid "Unable to determine upstream interface" msgstr "Não foi possível determinar a interface com a rede externa" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Não é possível a expedição" @@ -9197,21 +10252,31 @@ msgstr "Não foi possível reiniciar o firewall: % s" msgid "Unable to save contents: %s" msgstr "Não foi possível salvar os conteúdos: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." msgstr "" -"Segundos de indisponibilidade (UAS)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "Não foi possível verificar o PIN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Desconfigurar" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Formato da resposta dos dados foi inesperado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -9229,7 +10294,7 @@ msgstr "" msgid "Unknown" msgstr "Desconhecido" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Método de conexão desconhecido e sem suporte." @@ -9253,11 +10318,11 @@ msgstr "Não gerenciado" msgid "Unmount" msgstr "Desmontar" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Chave sem nome" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Alterações Não Salvas" @@ -9268,20 +10333,28 @@ msgstr "Erro não especificado" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:64 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:9 msgid "Unsupported MAP type" -msgstr "" -"Tipo de MAP não suportado" +msgstr "Tipo MAP não suportado" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Modem não suportado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Protocolo não suportado" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Tipo de protocolo não suportado." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Não marcado" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "Par sem título" @@ -9293,7 +10366,7 @@ msgstr "Acima" msgid "Up Delay" msgstr "Atraso de Envio" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Envio" @@ -9310,25 +10383,29 @@ msgstr "" msgid "Upload archive..." msgstr "Enviar arquivo..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Enviar arquivo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Enviar arquivo…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "O upload foi cancelado" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "A Solicitação de envio falhou: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Enviando o arquivo…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9338,7 +10415,7 @@ msgstr "" "atribuídas com um nome na forma wifinet# e a rede será reiniciada " "para aplicar as novas configurações." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -9346,7 +10423,7 @@ msgstr "" "Ao pressionar \"Continuar\", a configuração das pontes será atualizada e a " "rede será reiniciada para aplicar a atualização da configuração." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -9354,21 +10431,25 @@ msgstr "" "Ao pressionar \"Continuar\", as opções ifname serão renomeadas e a rede será " "reiniciada para aplicar a atualização da configuração." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "Os resolvedores upstream serão consultados na ordem que estiverem no arquivo " "resolv." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Tempo de atividade" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Usar /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Usar o DHCP" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Use servidores anunciados pelo DHCP" @@ -9377,13 +10458,18 @@ msgstr "Use servidores anunciados pelo DHCP" msgid "Use DHCP gateway" msgstr "Use o roteador do DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Usar o DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Use os servidores DNS anunciados pelo parceiro" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Usar códigos de países ISO/IEC 3166 alpha2." @@ -9394,9 +10480,7 @@ msgstr "Usar códigos de países ISO/IEC 3166 alpha2." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:67 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:84 msgid "Use MTU on tunnel interface" -msgstr "" -"Use o MTU na interface do túnel" +msgstr "Usar o MTU na interface do túnel" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:85 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:65 @@ -9433,22 +10517,25 @@ msgstr "Usar como o sistema de arquivos raiz (/)" msgid "Use broadcast flag" msgstr "Use a marcação de broadcast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Use o gerenciamento do IPv6 embarcado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Use servidores DNS personalizados" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Use o roteador padrão" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Use a métrica do roteador" @@ -9474,15 +10561,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "Use a mesma origem e o mesmo destino em cada conexão" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Utilize os certificados do sistema" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "Utilizar certificados de sistema para túnel interno" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9513,11 +10600,11 @@ msgstr "" msgid "Used" msgstr "Usado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Posição da Chave Usada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9525,59 +10612,61 @@ msgstr "" "Usado para dois propósitos diferentes: RADIUS NAS ID e 802.11r R0KH-ID. Não " "é necessário com o WPA(2)-PSK normal." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Grupo do Usuário" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Certificado do usuário (codificado em formato PEM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "Identificador do usuário" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Chave do usuário (codificada em formato PEM)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Nome do usuário" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "Utilize a tabela de fluxo %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (Agregador Virtual das Portas Ethernet)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "ID da VLAN" @@ -9597,24 +10686,27 @@ msgstr "Endereço Local da VPN" msgid "VPN Local port" msgstr "Porta Local da VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "Protocolo VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Servidor VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "Hash do certificado VPN Server SHA256" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Porta do Servidor VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "Resumo digital SHA1 do certificado do servidor VPN" @@ -9623,6 +10715,10 @@ msgstr "Resumo digital SHA1 do certificado do servidor VPN" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (VPN do CISCO 3000 (e outros))" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9636,7 +10732,7 @@ msgstr "Identificador de rede VXLAN" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9644,8 +10740,8 @@ msgstr "" "Valide as respostas do DNS e o cache de dados DNSSEC, requer upstream para o " "suporte ao DNSSEC." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9673,7 +10769,7 @@ msgstr "Fabricante" msgid "Vendor Class to send when requesting DHCP" msgstr "Classe do fabricante para enviar quando requisitar o DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" "Verifique se as respostas dos domínios não assinados vêm realmente de " @@ -9683,12 +10779,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Verificando o arquivo de imagem enviado." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Muito alta" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Ethernet virtual" @@ -9696,34 +10792,46 @@ msgstr "Ethernet virtual" msgid "Virtual dynamic interface" msgstr "Interface virtual dinâmica" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "Sistema aberto WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Chave compartilhada WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Senha WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "Roaming WLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Modo WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "Modo de suspensão do WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "Correções do modo de suspensão do WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Senha WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9754,7 +10862,17 @@ msgstr "" msgid "Weak" msgstr "Fraco" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Peso" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." @@ -9762,7 +10880,26 @@ msgstr "" "Ao delegar diversos prefixos, as interfaces com um valor de preferência mais " "alta são as primeiras que são consideradas durante a alocação das sub-redes." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Quando for ativado, a codificação da rede aumenta a saída WiFi através da " +"combinação de vários quadros num único quadro, reduzindo assim o tempo " +"necessário." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Quando for ativado, a tabela ARP forma uma ampla rede mesh distribuída da " +"cache ARP que auxilia os clientes fora do mesh a obter respostas ARP com " +"muito mais confiabilidade e sem muito atraso." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" @@ -9770,7 +10907,34 @@ msgstr "" "Quando ativado, o gateway vai estar ligado ainda que o gateway não " "corresponda a nenhum prefixo da interface" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Quando ativado, as novas entradas da tabela ARP são adicionadas a partir das " +"solicitações ou das respostas gratuitas de APR que forem recebidas, caso " +"contrário, apenas as entradas preexistentes da tabela serão atualizadas, mas " +"nenhum novo host será recebido." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Quando invertido, o LED fica continuamente aceso e pisca em vez de estar " +"desligado por padrão e continua piscando durante a atividade do sistema." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Ao executar a rede mesh em várias interfaces WiFi por nó, o batman-adv é " +"capaz de otimizar o fluxo de tráfego para obter o máximo de desempenho." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9780,7 +10944,7 @@ msgstr "" "as opções de tecla R0/R1 abaixo não são aplicadas. Desativar para usar as " "opções das teclas R0 e R1." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9788,7 +10952,7 @@ msgstr "" "Quando o modo QoS Multimídia Wi-Fi (WMM) estiver desativado os clientes " "podem ser limitados a taxas do 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9797,16 +10961,25 @@ msgstr "" "a eficiência do tempo de conexão pode ser significativamente reduzida." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Largura" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Condição Geral do WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "VPN WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "O par do WireGuard está desativado" @@ -9822,21 +10995,21 @@ msgid "Wireless Adapter" msgstr "Dispositivo de Rede sem Fio" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Rede sem Fio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Visão Geral da Rede sem Fio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Segurança da Rede sem Fio" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Migração da configuração da rede sem fio" @@ -9852,15 +11025,15 @@ msgstr "Rede sem fio está desabilitada" msgid "Wireless is not associated" msgstr "Rede sem fio está não conectada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "A rede sem fio está desabilitada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "A rede sem fio está habilitada" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Salve as consultas recebidas do DNS no syslog." @@ -9872,7 +11045,7 @@ msgstr "Escrever registro do sistema (log) no arquivo" msgid "XOR policy (balance-xor, 2)" msgstr "Política XOR (balanço-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9902,8 +11075,20 @@ msgstr "" "por exemplo \"rede/network\", o dispositivo poderá ficar inacessível!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Você pode adicionar vários registros para o mesmo destino." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Você pode adicionar vários registros para o mesmo domínio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "Você pode adicionar distribuições únicas no mesmo endereço de escuta." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9938,34 +11123,56 @@ msgstr "Configurações ZRam" msgid "ZRam Size" msgstr "Tamanho ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Observação: embora o " +"_http seja possível, nenhum navegador suporta registros SRV.)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "qualquer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "automático" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automático" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automático (desativado)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automático (ativado)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "em ponte" @@ -10022,25 +11229,30 @@ msgctxt "nft unit" msgid "day" msgstr "dia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "desativar" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "desativado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "padrão do driver" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "padrão do driver (%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "por exemplo: --proxy 10.10.10.10.10" @@ -10049,14 +11261,23 @@ msgstr "por exemplo: --proxy 10.10.10.10.10" msgid "e.g: dump" msgstr "por exemplo: despejo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "ativado" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "a cada %ds" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "expirado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "imposto" @@ -10066,22 +11287,22 @@ msgstr "imposto" msgid "forward" msgstr "encaminhar" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "full-duplex" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "half-duplex" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "valor codificado hexadecimal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "oculto" @@ -10090,9 +11311,9 @@ msgctxt "nft unit" msgid "hour" msgstr "hora" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "modo híbrido" @@ -10100,6 +11321,10 @@ msgstr "modo híbrido" msgid "ignore" msgstr "Ignorar" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -10114,11 +11339,19 @@ msgstr "chave entre 8 e 63 caracteres" msgid "key with either 5 or 13 characters" msgstr "chave com 5 ou 13 caracteres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "configuração gerenciada (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "segurança média" @@ -10127,11 +11360,11 @@ msgctxt "nft unit" msgid "minute" msgstr "minuto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minutos" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "agente doméstico móvel (H)" @@ -10144,18 +11377,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "não" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "sem link" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "sem substituição" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "valor não vazio" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "nenhum" @@ -10166,20 +11407,20 @@ msgid "not present" msgstr "não presente" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "desligado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "no prefixo disponível" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "rede aberta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "outra configuração (O)" @@ -10188,6 +11429,10 @@ msgstr "outra configuração (O)" msgid "output" msgstr "saída" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "mais de um dia atrás" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -10205,23 +11450,34 @@ msgstr "valor inteiro positivo" msgid "random" msgstr "aleatório" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "gerado aleatoriamente" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" +"reduz a sobrecarga coletando e agregando mensagens originais num único " +"pacote em vez de diversas outras pequenas" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "modo retransmissor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "roteado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "seg" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "modo servidor" @@ -10229,7 +11485,7 @@ msgstr "modo servidor" msgid "sstpc Log-level" msgstr "Nível do registro log sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "Segurança Forte" @@ -10237,7 +11493,7 @@ msgstr "Segurança Forte" msgid "tagged" msgstr "marcado" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "unidades de tempo (TUs / 1.024 ms) [1000-65535]" @@ -10251,25 +11507,27 @@ msgstr "" "Protocol\">HTTP
    ou HTTPS." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "valor único" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "desconhecido" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "versão desconhecida" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "ilimitado" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -10291,8 +11549,8 @@ msgid "untagged" msgstr "não marc" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "endereço IP válido" @@ -10305,7 +11563,7 @@ msgid "valid IPv4 CIDR" msgstr "CIDR IPv4 válido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "endereço IPv4 válido" @@ -10334,7 +11592,7 @@ msgid "valid IPv6 CIDR" msgstr "CIDR IPv6 válido" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "endereço IPv6 válido" @@ -10371,8 +11629,8 @@ msgstr "identificador UCI, nome de host ou endereço IP válido" msgid "valid address:port" msgstr "endereço:porta válida" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "data válida (AAAA-MM-DD)" @@ -10412,11 +11670,23 @@ msgstr "valor inteiro válido" msgid "valid multicast MAC address" msgstr "endereço MAC multicast válido" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"um nome válido para o dispositivo de rede deve ter entre 1 e 15 caracteres, " +"excluindo caracteres \":\", \"/\", \"%\" ou espaços" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "um nome válido do dispositivo de rede, sem \".\" ou \"..\"" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "rede válida na notação de endereço / máscara de rede" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "dígito de telefone válido (0-9, \"*\", \"#\", \"!\" ou \".\")" @@ -10426,43 +11696,43 @@ msgid "valid port or port range (port1-port2)" msgstr "Porta ou intervalo de portas válida (port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "valor de porta válida" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "hora válida (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "valor entre caracteres %d e %d" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "valor entre %f e %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "valor maior ou igual a %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "valor menor ou igual a %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "valor com caracteres %d" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "valor com pelo menos %d caracteres" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "valor com até %d caracteres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "segurança fraca" diff --git a/package/luci/modules/luci-base/po/ro/base.po b/package/luci/modules/luci-base/po/ro/base.po index 313f6b61a4..b5739726c9 100644 --- a/package/luci/modules/luci-base/po/ro/base.po +++ b/package/luci/modules/luci-base/po/ro/base.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-11-17 11:47+0000\n" +"PO-Revision-Date: 2023-09-02 13:20+0000\n" "Last-Translator: Simona Iacob \n" -"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" @@ -11,25 +11,41 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "!cunoscut (necunoscut)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" tabel \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d câmp(uri) nevalid(e)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%dh în urmă" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%dm în urmă" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%ds în urmă" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s nu este etichetat în mai multe VLAN-uri!" @@ -54,10 +70,11 @@ msgstr "(gol)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(nici o interfață atașată)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d mai mult" @@ -67,19 +84,19 @@ msgid "-- Additional Field --" msgstr "-- Câmp suplimentar --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Vă rugăm să alegeți --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- personalizat --" @@ -105,7 +122,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = nu se utilizează pragul RSSI, 1 = nu se modifică valoarea implicită a " @@ -120,7 +137,7 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Încărcarea în ultimul minut:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" @@ -128,6 +145,11 @@ msgstr[0] "indicator" msgstr[1] "indicatoare" msgstr[2] "indicatori" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12h (12 ore - implicit)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "Încărcarea în ultimele 15 minute:" @@ -142,12 +164,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3h (3 ore)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "ID-ul hexazecimal de 4 caractere" @@ -160,45 +187,106 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Încărcarea în ultimele 5 minute:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5m (5 minute)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" "Identificator de 6 octeți sub formă de șir hexazecimal - fără două puncte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7d (7 zile)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: Activați raportarea balizelor prin măsurători radio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Activează raportarea vecinilor prin măsurători radio." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r Tranziție Rapidă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: BSS Max Idle. Unități: secunde." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: gestionarea tranziției la setul de servicii de bază (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: anunțarea fusului orar local în cadrele de gestionare." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Proxy ARP permite STA non-AP să rămână mai mult timp în regim de " +"economisire a energiei." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Anunțarea timpului în cadrele de gestionare." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (mod de veghe extins " +"pentru stații)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Managementul rețelei fără fir (WNM) Modul de veghe Fixuri: " +"Împiedică atacurile de reinstalare." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w Timp maxim de expirare pentru interogarea asocierii securizate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" "802.11w Timp maxim de reîncercare pentru interogarea asocierii securizate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w Protecție Frame-uri de Management" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w timp de expirare maxim" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w timp de expirare pentru reîncercare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "Masca de rețea IPv4" @@ -210,30 +298,46 @@ msgstr "Configurare LED" msgid "LED Name" msgstr "NumeLED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "Proxy-NDP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA Indicatori" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA Limita de salt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA Durata de viață" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "Serviciu-RA" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ se potrivește cu orice domeniu. /example.com/ " +"returnează NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# returnează adrese NULL (0.0.0.0 and " +"::) pentru example.com și subdomeniile sale." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -279,11 +383,23 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s nu este în setul %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"Un nod batman-adv poate funcționa fie în modul server (partajându-și " +"conexiunea la internet cu plasa), fie în modul client (căutând cea mai " +"potrivită conexiune la internet în plasă) sau având suportul pentru gateway " +"dezactivat complet (care este setarea implicită)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "O configurație pentru dispozitivul \"%s\" deja există" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Un director cu acelaşi nume există deja." @@ -292,25 +408,90 @@ msgid "A new login is required since the authentication session expired." msgstr "" "O nouă logare este necesară deoarece sesiunea de autentificare a expirat." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Anexa A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Anexa B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (toate variantele) Anexa A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (toate variantele) Anexa A/L/M + VDSL2 Anexa A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (toate variantele) Anexa B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (toate variantele) Anexa B + VDSL2 Anexa A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (toate variantele) Anexa B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (toate variantele) Anexa B/J + VDSL2 Anexa A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (toate variantele) Anexa M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Anexă A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Anexa B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Anexa L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Anexa M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Anexa A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Anexa B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Anexa M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -343,29 +524,40 @@ msgstr "Monitorizarea ARP nu este acceptată pentru politica selectată!" msgid "ARP retry threshold" msgstr "prag de reîncercare ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "Tabelul de trafic ARP \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"ARP, IPv4 și IPv6 (chiar și 802.1Q) cu MAC-uri de destinație multicast sunt " +"unicast la adresa MAC STA. Notă: Acesta nu este serviciul de Multicast " +"direcționat (DMS) din 802.11v. Notă: ar putea încălca așteptările de " +"multicast ale STA receptorului." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Mod de Transfer Asincron)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "Punți ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM Indentificator Canal Virtual (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM Indentificator Cale Virtual(VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -375,28 +567,24 @@ msgstr "" "virtuale de rețea Linux care pot fi utilizate în asociere cu DHCP sau PPP " "pentru a forma în rețeaua furnizorului." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Număr echipament ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ID-ul furnizorului sistemului ATU-C" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Interfață Absentă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Acceptați interogări DNS numai de la gazde a căror adresă se află într-o " "subrețea locală." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Acceptați local" @@ -405,7 +593,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Acceptă pachetul" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Acceptați pachete cu adrese din surse locale" @@ -413,16 +601,25 @@ msgstr "Acceptați pachete cu adrese din surse locale" msgid "Access Concentrator" msgstr "Concentrator de Access" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Punct de Acces" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Izolarea punctului de acces" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Tehnologii de acces" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Acțiuni" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Activ" @@ -460,8 +657,8 @@ msgstr "Reguli IPv6 active" msgid "Active-Backup policy (active-backup, 1)" msgstr "Politica Active-Backup (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -478,18 +675,18 @@ msgstr "Echilibrarea adaptivă a sarcinii de transmisie (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Adăugați" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Adăugați punte ATM" @@ -509,11 +706,11 @@ msgstr "Adăugați acțiunea LED" msgid "Add VLAN" msgstr "Adăugați VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Adăugați configurația dispozitivului" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Adăugați configurația dispozitivului…" @@ -521,19 +718,19 @@ msgstr "Adăugați configurația dispozitivului…" msgid "Add instance" msgstr "Adăugați o instanță" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Adăugați cheia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" "Adăugați sufixul domeniului local la numele servite din fișierele hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Adăugați o interfață nouă..." @@ -541,6 +738,10 @@ msgstr "Adăugați o interfață nouă..." msgid "Add peer" msgstr "Adăugați un omolog" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "Adăugați intrări DNS forward și reverse statice pentru această gazdă." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Adăugați pe lista neagră" @@ -549,11 +750,11 @@ msgstr "Adăugați pe lista neagră" msgid "Add to Whitelist" msgstr "Adăugați la lista albă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Fișiere de tip hosts adiționale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Fișier suplimentar pentru servere" @@ -570,7 +771,11 @@ msgstr "Fișier suplimentar pentru servere" msgid "Address" msgstr "Adresă" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Familie de adrese" @@ -583,7 +788,7 @@ msgstr "Setarea adresei nu este valabilă" msgid "Address to access local relay bridge" msgstr "Adresa de acces punte locala repetor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Adrese" @@ -592,29 +797,29 @@ msgstr "Adrese" msgid "Administration" msgstr "Administrare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Setări avansate" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Opțiuni avansate ale dispozitivului" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Timp de învechire" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Puterea de transmisie agregată (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Agregarea mesajelor inițiatorului" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -653,11 +858,11 @@ msgstr "Alias Interfață" msgid "Alias of \"%s\"" msgstr "Alias al lui \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Toate serverele" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." @@ -665,7 +870,7 @@ msgstr "" "Alocați adresele IP în mod secvențial, începând cu cea mai mică adresă " "disponibilă." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Alocă IP-urile secvențial" @@ -674,12 +879,12 @@ msgid "Allow SSH password authentication" msgstr "" "Permite autentificarea prin parola a SSH" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" "Permiteți modului AP să deconecteze STA-urile pe baza stării ACK scăzute" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Permiteți toate, cu excepția celor enumerate" @@ -687,15 +892,15 @@ msgstr "Permiteți toate, cu excepția celor enumerate" msgid "Allow full UCI access for legacy applications" msgstr "Permiteți accesul complet la UCI pentru aplicațiile vechi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Permiteți rate de transfer învechite 802.11b" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Permiteți doar din listă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Permiteți localhost" @@ -716,19 +921,24 @@ msgid "Allow system feature probing" msgstr "Permiteți sondarea caracteristicilor sistemului" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Permiteți utilizatorului root să se conecteze cu parolă" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "IP-uri permise" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "Tehnologie de rețea permisă" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "Setarea AllowedIPs nu este validă" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Întotdeauna" @@ -740,13 +950,13 @@ msgstr "Întotdeauna oprit (kernel: niciunul)" msgid "Always on (kernel: default-on)" msgstr "Întotdeauna activat (kernel: implicit activat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "Trimiteți întotdeauna opțiunile DHCP. Uneori ele sunt necesare, de exemplu, " "cu PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -755,11 +965,15 @@ msgstr "" "suprapune. Utilizarea acestei opțiuni nu este conformă cu standardul IEEE " "802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" "Cantitatea de sonde de detectare a adreselor duplicate care trebuie trimise" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Numărul de secunde de așteptare pentru ca modemul să fie pregătit" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "A apărut o eroare în timpul salvării formularului:" @@ -768,72 +982,23 @@ msgstr "A apărut o eroare în timpul salvării formularului:" msgid "An optional, short description for this device" msgstr "O scurtă descriere opțională pentru acest dispozitiv" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" -msgstr "Anexa" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Anexa A + L + M (toate)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Anexa A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Anexa A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Anexa A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Anexa A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Anexa B (toate)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Anexa B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Anexa B G.992.3" +msgstr "Anexă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Anexa B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Anexa J (toate)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Anexa L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Anexa M (toate)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Anexa M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Anexa M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"Anunță prefixul NAT64 în mesajele RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Anunțați acest dispozitiv ca server DNS IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -841,7 +1006,7 @@ msgstr "" "Anunțați acest dispozitiv ca ruter implicit dacă este prezentă o rută " "implicită IPv6 locală." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -849,7 +1014,7 @@ msgstr "" "Anunțați acest dispozitiv ca ruter implicit dacă este disponibil un prefix " "IPv6 public, indiferent de disponibilitatea rutei implicite locale." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -857,15 +1022,15 @@ msgstr "" "Anunțați acest dispozitiv ca ruter implicit, indiferent dacă este prezent un " "prefix sau o rută implicită." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Domenii DNS anunțate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Servere DNS IPv6 anunțate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Identitate anonimă" @@ -877,7 +1042,7 @@ msgstr "Montează Anonim" msgid "Anonymous Swap" msgstr "Swap anonim" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Orice pachet" @@ -889,11 +1054,11 @@ msgstr "Orice pachet" msgid "Any zone" msgstr "Orice zonă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "Aplicați opțiunile DHCP la această rețea. (Gol = toți clienții)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "Aplicați și păstrați setările" @@ -901,40 +1066,44 @@ msgstr "Aplicați și păstrați setările" msgid "Apply backup?" msgstr "Aplicați backup?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Solicitarea de aplicare a eșuat cu statusul %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Aplicați nebifate" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "Aplicați cu revenire după pierderea conectivității" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Se aplică schimbările configurării… %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Arhitectură" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Scanare-Arp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Atribuie acestei interfețe o parte din lungimea dată a fiecărui prefix IPv6 " "public la această interfață" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "Atribuiți etichete noi, de formă liberă, acestei intrări." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -942,7 +1111,7 @@ msgstr "" "Atribuiți părți de prefix utilizând acest ID de subprefix hexazecimal pentru " "această interfață." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Stații asociate" @@ -951,8 +1120,8 @@ msgstr "Stații asociate" msgid "Associations" msgstr "Asocieri" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" @@ -960,8 +1129,8 @@ msgstr "" "Cel puțin %h pe %h, explozie de " "%h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -975,25 +1144,26 @@ msgstr "" "Încercarea de a activa punctele de montare configurate pentru dispozitivele " "atașate" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Grup de autentificare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Autentificare" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Tipul Autentificării" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autoritar" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Autorizație Necesară" @@ -1001,7 +1171,9 @@ msgstr "Autorizație Necesară" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1019,7 +1191,7 @@ msgstr "Homenet automat (HNCP)" msgid "Automatically check filesystem for errors before mounting" msgstr "Verificați automat sistemul de fișiere pentru erori înainte de montare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1043,6 +1215,10 @@ msgstr "Montează automat sistemul de fișiere" msgid "Automount Swap" msgstr "Montează automat Swap-ul" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Disponibile" @@ -1061,11 +1237,15 @@ msgstr "Disponibile" msgid "Average:" msgstr "In medie:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Evitați buclele de pod" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1073,15 +1253,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "Tranziție BSS" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Inapoi" @@ -1090,11 +1274,7 @@ msgstr "Inapoi" msgid "Back to Overview" msgstr "Înapoi la Prezentare generală" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Înapoi la configurare" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "Înapoi la configurația peer" @@ -1107,16 +1287,15 @@ msgid "Backup / Flash Firmware" msgstr "Salvați / Scrieți Firmware" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Salvează lista de fișiere" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Bandă" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Dispozitiv de bază" @@ -1125,12 +1304,43 @@ msgid "Base64-encoded public key of this interface for sharing." msgstr "" "Cheia publică codificată în Base64 a acestei interfețe pentru partajare." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Dispozitivul Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Interfața Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv are încorporată o fragmentare de nivel 2 pentru datele unicast " +"care circulă prin plasă, ceea ce va permite rularea batman-adv pe interfețe/" +"conexiuni care nu permit creșterea MTU dincolo de dimensiunea standard a " +"pachetelor Ethernet de 1500 de octeți. Atunci când fragmentarea este " +"activată, batman-adv va fragmenta automat pachetele de dimensiuni prea mari " +"și le va defragmenta la celălalt capăt. În mod implicit, fragmentarea este " +"activată și inactivată dacă pachetul se potrivește, dar este posibilă " +"dezactivarea completă a fragmentării." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Interval de semnalizare" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Raportul Beacon" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1144,7 +1354,7 @@ msgstr "" msgid "Bind NTP server" msgstr "Legătura serverului NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "Se leagă în mod dinamic la interfețe mai degrabă decât la adrese wildcard." @@ -1154,18 +1364,35 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Legați interfața" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" +"Legați înregistrările de servicii la un nume de domeniu: specificați locația " +"serviciilor." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"Legarea înregistrărilor de servicii la un nume de domeniu: specificați " +"locația serviciilor. A se vedea RFC2782." + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1175,67 +1402,79 @@ msgstr "Legați tunelul la această interfață (opțional)." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:171 msgid "Bitrate" -msgstr "Rata de biți" +msgstr "Viteză de transfer" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Modul de lipire" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Politica de legături" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Punte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Punte (Suportă comunicarea directă între MAC VLAN-uri)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Filtrarea VLAN a punții" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Dispozitiv punte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "Opțiuni specifice portului de punte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Porturile punții" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "Tabel de trafic punte \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Numărul unității de punte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Activați puntea goală" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Activați la pornire" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "Activați interfața de punte chiar dacă nu sunt atașate porturi" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "Difuzare" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Politica de difuzare (difuzarea, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Răsfoiți…" @@ -1243,15 +1482,39 @@ msgstr "Răsfoiți…" msgid "Buffered" msgstr "Tamponat" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" +"Certificat CA (codat PEM; se utilizează în loc de stocarea la nivel de " +"sistem pentru a verifica certificatul gateway-ului." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "Certificat CA; dacă este gol, acesta va fi salvat după prima conexiune." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "Configurarea CLAT a eșuat" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "CNUME" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME sau fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (interfață gestionată din exterior)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Utilizarea procesorului (%)" @@ -1266,18 +1529,25 @@ msgstr "În cache" msgid "Call failed" msgstr "Apel eșuat" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"Poate fi util în cazul în care ISP are nameservere IPv6, dar nu oferă rutare " +"IPv6." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Anulare" @@ -1285,32 +1555,32 @@ msgstr "Anulare" msgid "Cannot parse configuration: %s" msgstr "Nu se poate analiza configurația: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "Capturați pachetele primite adresate altor gazde" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "Capturați pachetele primite înainte de orice decizie de rutare" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "Capturați pachetele primite direcționate către sistemul local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "Capturați pachetele de ieșire după orice decizie de rutare" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "Capturați pachetele de ieșire care provin din sistemul local" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "Capturați pachetele direct după ce NIC le-a primit" @@ -1319,24 +1589,32 @@ msgstr "Capturați pachetele direct după ce NIC le-a primit" msgid "Category" msgstr "Categorie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "ID-ul celulei" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "Locația celulei" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Constrângere de certificat (Domeniu)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Constrângere de certificare (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Constrângere de certificat (Subiect)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Certificatul de constrângere (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1344,8 +1622,8 @@ msgstr "" "Certificate constraint substring - de exemplu /CN=wifi.mycompany.com
    Vezi `logread -f` în timpul handshake pentru valorile reale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1353,8 +1631,8 @@ msgstr "" "Constrângerea (constrângerile) certificatului față de valorile DNS SAN (dacă " "sunt disponibile)
    sau Subject CN (potrivire exactă)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1362,8 +1640,8 @@ msgstr "" "Constrângerea (constrângerile) certificatului față de valorile DNS SAN (dacă " "sunt disponibile)
    sau Subject CN (potrivire sufix)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1377,16 +1655,16 @@ msgstr "" msgid "Chain" msgstr "Legătură" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "Cârlig în lanț \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Modificări" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Modificările au fost anulate." @@ -1397,18 +1675,19 @@ msgstr "Schimbă parola de administrator pentru accesarea dispozitivului" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Canal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Analizarea canalelor" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Lățimea canalului" @@ -1416,7 +1695,7 @@ msgstr "Lățimea canalului" msgid "Check filesystems before mount" msgstr "Verificați sistemele de fișiere înainte de montare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" "Bifați această opțiune pentru a șterge rețelele existente din acest radio." @@ -1434,8 +1713,8 @@ msgstr "Se verifică imaginea…" msgid "Choose mtdblock" msgstr "Alegeți mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1447,7 +1726,7 @@ msgstr "" "sau completați câmpul personalizat pentru a defini o nouă zonă și a " "atașa interfața la aceasta." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1456,7 +1735,7 @@ msgstr "" "interfață fără fir sau completați câmpul personalizat pentru a " "defini o nouă rețea." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Cifru" @@ -1480,9 +1759,10 @@ msgstr "" "Faceți clic pe \"Salvați mtdblock\" pentru a descărca fișierul mtdblock " "specificat. (NOTĂ: ACEASTĂ CARACTERISTICĂ ESTE PENTRU PROFESIONIȘTI! )" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Client" @@ -1491,9 +1771,9 @@ msgstr "Client" msgid "Client ID to send when requesting DHCP" msgstr "ID-ul de client care se trimite la solicitarea DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Închideți" @@ -1510,20 +1790,20 @@ msgstr "" "Închideți conexiunea inactivă după un număr de secunde dat, utilizați 0 " "pentru a menține conexiunea" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Închideți lista..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Colectare date..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "Coliziuni observate" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Comandă" @@ -1540,7 +1820,7 @@ msgstr "Comandă eşuată" msgid "Comment" msgstr "Comentariu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1564,29 +1844,28 @@ msgstr "Calculați suma de control de ieșire (opțional)." msgid "Config File" msgstr "Fișier de configurare" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Configurație" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "Exportul configurației" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Modificările de configurare aplicate." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Schimbările asupra configurării au fost anulate!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Configurarea a eșuat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1603,7 +1882,7 @@ msgstr "" "Mbps ca rată de bază. Nu sunt oferite rate suportate mai mici decât rata de " "bază minimă." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." @@ -1611,7 +1890,7 @@ msgstr "" "Configurează anunțul implicit al routerului în mesajele RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1619,19 +1898,19 @@ msgstr "" "Configurează modul de funcționare a serviciului RA pe această interfață." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" "Configurează modul de funcționare al serviciului DHCPv6 pe această interfață." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" "Configurează modul de funcționare a serviciului proxy NDP pe această " "interfață." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Configurați…" @@ -1643,9 +1922,10 @@ msgstr "Confirmați deconectarea" msgid "Confirmation" msgstr "Confirmare" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Conectat" @@ -1655,11 +1935,11 @@ msgstr "Conectat" msgid "Connection attempt failed" msgstr "Încercarea de conectare a eșuat" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "Încercarea de conectare a eșuat." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "Punct final de conexiune" @@ -1671,7 +1951,7 @@ msgstr "Conexiunea s-a pierdut" msgid "Connections" msgstr "Conexiuni" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "Modificarea conectivității" @@ -1703,9 +1983,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Conţinutul a fost salvat." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1716,16 +1996,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "Continuați în %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "Continuați apelarea legăturii" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "Continuați procesarea pachetelor nepotrivite" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1739,20 +2019,20 @@ msgstr "" msgid "Country" msgstr "Țară" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Codul țării" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Densitatea celulelor de acoperire" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Creați / Atribuiți o zonă de firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Creați interfața" @@ -1764,7 +2044,7 @@ msgstr "Critic" msgid "Cron Log Level" msgstr "Nivelul jurnalului Cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Puterea actuală" @@ -1807,31 +2087,31 @@ msgstr "" "Personalizați, dacă este posibil, comportamentul -LED-urilor dispozitivului." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "DAD transmite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "Client-DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "Portul-DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "Secretul-DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "Opțiuni DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Server DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP și DNS" @@ -1842,16 +2122,22 @@ msgstr "DHCP și DNS" msgid "DHCP client" msgstr "Client DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Opțiuni-DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "Client DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "Serviciul DHCPv6" @@ -1863,19 +2149,19 @@ msgstr "Serviciul DHCPv6" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Redirecționări DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "Port de interogare DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "Domenii de căutare DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "Portul serverului DNS" @@ -1883,7 +2169,7 @@ msgstr "Portul serverului DNS" msgid "DNS setting is invalid" msgstr "Setarea DNS nu este valabilă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "Pondere DNS" @@ -1891,11 +2177,11 @@ msgstr "Pondere DNS" msgid "DNS-Label / FQDN" msgstr "Etichetă DNS / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "Verificare DNSSEC nesemnată" @@ -1907,39 +2193,47 @@ msgstr "Timpul de așteptare DPD Idle" msgid "DS-Lite AFTR address" msgstr "Adresa DS-Lite AFTR" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "Starea DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "Mod linie DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "Interval DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Rata de date" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Date primite" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Date transmise" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Depanare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Router implicit" @@ -1947,7 +2241,7 @@ msgstr "Router implicit" msgid "Default state" msgstr "Stare implicită" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1957,7 +2251,7 @@ msgstr "" "\"6,192.168.2.1,192.168.2.2\", care anunță diferite servere DNS " "pentru clienți." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" @@ -1965,7 +2259,7 @@ msgstr "" "Definește o cartografiere a priorității pachetelor interne Linux la " "prioritatea antetului VLAN, dar pentru cadrele de ieșire" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" @@ -1973,49 +2267,50 @@ msgstr "" "Definește o corespondență între prioritatea antetului VLAN și prioritatea " "pachetului intern Linux pe cadrele primite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "Definește un MTU specific pentru această rută" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "Delegați prefixele IPv6" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Ștergeți" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Ștergeți cheia" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Cererea de ștergere a eșuat: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Ștergeți această rețea" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Intervalul mesajului de indicare a traficului de livrare" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Descriere" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Deselectați" @@ -2023,11 +2318,11 @@ msgstr "Deselectați" msgid "Design" msgstr "Design" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "Desemnat principal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2062,9 +2357,9 @@ msgstr "Zonă de destinație" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2074,36 +2369,40 @@ msgstr "Zonă de destinație" msgid "Device" msgstr "Dispozitiv" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Configurarea dispozitivului" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "Identificatorul dispozitivului" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Dispozitivul nu este activ" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Se repornește dispozitivul…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Numele dispozitivului" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Dispozitivul nu este gestionat de ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Dispozitivul nu este prezent" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Tipul dispozitivului" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Dispozitiv inaccesibil!" @@ -2111,31 +2410,31 @@ msgstr "Dispozitiv inaccesibil!" msgid "Device unreachable! Still waiting for device..." msgstr "Nu se poate contacta dispozitivul! Se așteaptă dispozitivul..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Dispozitive" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnosticare" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Formați numărul" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Director" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Dezactivați" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2152,20 +2451,24 @@ msgstr "Dezactivați căutările DNS" msgid "Disable Encryption" msgstr "Dezactivați Criptarea" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Dezactivați verificarea inactivității" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Dezactivați această rețea" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2174,16 +2477,16 @@ msgstr "Dezactivați această rețea" msgid "Disabled" msgstr "Dezactivat" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "Dezactivat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Dezasociere la recunoaștere scăzută" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" @@ -2191,18 +2494,17 @@ msgstr "" "href=\"%s\">RFC1918." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Deconectați" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Încercarea de deconectare a eșuat" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Încercarea de deconectare a eșuat." @@ -2212,23 +2514,35 @@ msgstr "Spațiu pe disc" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Închideți" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Optimizarea distanței" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Distanța până la cel mai îndepărtat membru al rețelei, în metri." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Tabel ARP distribuit" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2236,7 +2550,7 @@ msgstr "" "Instanța Dnsmasq la care este legată această secțiune de pornire. Dacă nu " "este specificat, secțiunea este valabilă pentru toate instanțele dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP și DNS " "redirecționator." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" "Nu puneți în cache răspunsurile negative, de exemplu pentru domenii " @@ -2260,33 +2574,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "Nu creați o rută gazdă către partener (opțional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "Nu transmiteți interogări DNS fără puncte sau părți de domeniu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Nu transmiteți interogări la care nu pot răspunde rezolvatorii publici." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Nu redirecționați căutările inverse pentru rețelele locale." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Nu ascultați pe interfețele specificate." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "Nu oferiți serviciul DHCPv6 pe această interfață." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Nu participați" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2298,7 +2602,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Nu trimiteți un nume de gazdă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2306,11 +2610,11 @@ msgstr "" "Nu trimiteți niciun mesaj RA pe această interfață." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Sigur doriți să ștergeți \"%s\" ?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Sigur doriți să ștergeți această cheie SSH?" @@ -2318,11 +2622,11 @@ msgstr "Sigur doriți să ștergeți această cheie SSH?" msgid "Do you really want to erase all settings?" msgstr "Sigur doriți să ștergeți toate setările?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Sigur doriți să ștergeți recursiv directorul \"%s\" ?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "Doriți să înlocuiți PSK-ul actual?" @@ -2330,15 +2634,17 @@ msgstr "Doriți să înlocuiți PSK-ul actual?" msgid "Do you want to replace the current keys?" msgstr "Doriți să înlocuiți cheile actuale?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Domeniu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Domeniul este necesar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Lista albă de domenii" @@ -2364,11 +2670,11 @@ msgstr "Descărcați backup-ul" msgid "Download mtdblock" msgstr "Descărcați mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Decalaj SNR în flux" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2384,16 +2690,61 @@ msgstr "Trageți pentru a reordona" msgid "Drop Duplicate Frames" msgstr "Renunțați la cadrele duplicate" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"Renunțați la toate cadrele ARP gratuite, de exemplu în cazul în care există " +"un proxy ARP bun cunoscut în rețea și astfel de cadre nu trebuie utilizate " +"sau, în cazul 802.11, nu trebuie utilizate pentru a preveni atacurile." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Renunțați la toate anunțurile nesolicitate ale vecinilor, de exemplu, dacă " +"există un proxy NA bun cunoscut în rețea și astfel de cadre nu trebuie să " +"fie utilizate sau, în cazul 802.11, nu trebuie să fie utilizate pentru a " +"preveni atacurile." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Aruncă ARP gratuit" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "Aruncă cadrele multicast de nivel 2 care conțin pachete unicast IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "Aruncă cadrele multicast de nivel 2 care conțin pachete unicast IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Renunță la unicast IPv4 imbricate" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Renunță la unicast IPv4 îmbinat" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Aruncă pachetul" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "Aruncă pachetele nepotrivite" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Aruncă NA nesolicitat" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Instanța Dropbear" @@ -2411,20 +2762,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "DHCP Dinamic" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "Client Extensie Autorizare Dinamică." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "Port Extensie Autorizare Dinamică." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "Secret Extensie Autorizare Dinamică." @@ -2432,7 +2783,7 @@ msgstr "Secret Extensie Autorizare Dinamică." msgid "Dynamic tunnel" msgstr "Tunel dinamic" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2440,21 +2791,33 @@ msgstr "" "Alocați în mod dinamic adrese DHCP pentru clienți. Dacă este dezactivată, " "vor fi deserviți numai clienții care au închirieri statice." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "E.g. br-vlan or brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "E.g. eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "Lungimea EA-bits" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Metoda-EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Fiecărui STA i se atribuie propria interfață AP_VLAN." + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Editați" @@ -2462,6 +2825,10 @@ msgstr "Editați" msgid "Edit peer" msgstr "Editați peer" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2470,11 +2837,11 @@ msgstr "" "Editați datele de configurare brute de mai sus pentru a remedia orice eroare " "și apăsați \"Salvați\" pentru a reîncărca pagina." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Editați această rețea" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Editați rețeaua wireless" @@ -2483,46 +2850,36 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "Ruta efectivă MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Maparea QoS de ieșire" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "ID-ul dispozitivului de ieșire" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Numele dispozitivului de ieșire" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Etichetate de ieșire" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Neetichetate de ieșire" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Urgență" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" -msgstr "Activați" +msgstr "Activează" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" "Activează / Dezactivează omologul. Reporniți interfața wireguard pentru a " "aplica modificările." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2530,11 +2887,11 @@ msgstr "" "Activați IGMP " "snooping" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Activeaza STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "Activați SLAAC" @@ -2552,10 +2909,11 @@ msgstr "Activați amestecarea dinamică a fluxurilor" msgid "Enable HE.net dynamic endpoint update" msgstr "Activați actualizarea dinamică a punctelor finale HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Activați IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Activați negocierea IPv6" @@ -2569,11 +2927,15 @@ msgstr "Activați negocierea IPv6" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Activați negocierea IPv6 pe legătura PPP" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "Activați rutarea segmentului IPv6" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Activați Jumbo Frame passthrough" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "Activați învățarea adresei MAC" @@ -2585,11 +2947,11 @@ msgstr "Activați clientul NTP" msgid "Enable Single DES" msgstr "Activează DES unic" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Activați serverul TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Activați filtrarea VLAN" @@ -2597,7 +2959,7 @@ msgstr "Activați filtrarea VLAN" msgid "Enable VLAN functionality" msgstr "Activați funcționalitatea VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Activează butonul WPS al router-ului, necesită WPA(2)-PSK/WPA3-SAE" @@ -2611,14 +2973,14 @@ msgstr "" "Transfer Protocol\">HTTP către portul HTTPS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" "Activează delegarea fluxului intern a prefixelor IPv6 disponibile pe această " "interfață" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Activarea contramăsurilor de reinstalare a cheilor (KRACK)" @@ -2634,26 +2996,26 @@ msgstr "Activați oglindirea pachetelor primite" msgid "Enable mirroring of outgoing packets" msgstr "Activați oglindirea pachetelor de ieșire" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "Activează plecarea rapidă multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "Activare multicast querier" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Activați suportul multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Activați direcționarea pachetelor pe toate unitățile centrale de procesare. " "Poate ajuta sau îngreuna viteza rețelei." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Activați modul promiscuu" @@ -2675,11 +3037,11 @@ msgstr "Activați suportul pentru traficul multicast (opțional)." msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Activați indicatorul DF (Don't Fragment) al pachetelor încapsulate." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "Activați serverul TFTP încorporat într-o singură instanță." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Activați această rețea" @@ -2688,21 +3050,24 @@ msgstr "Activați această rețea" msgid "Enable tx checksum" msgstr "Activați suma de control tx" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "Activați inundarea unicast" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" -msgstr "Activat" +msgstr "activat" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Activează IGMP snooping pe acest pod" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2710,7 +3075,15 @@ msgstr "" "Permite roaming-ul rapid între punctele de acces care aparțin aceluiași " "domeniu de mobilitate" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" +"Permite o infrastructură de expediere multicast mai eficientă și mai " +"conștientă de grup în batman-adv." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Activează protocolul Spanning Tree pe acest pod" @@ -2718,24 +3091,29 @@ msgstr "Activează protocolul Spanning Tree pe acest pod" msgid "Encapsulation limit" msgstr "Limita încapsulării" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Modul de incapsulare" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Criptare" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Punct final" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Gazdă Endpoint" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Port Endpoint" @@ -2743,23 +3121,23 @@ msgstr "Port Endpoint" msgid "Endpoint setting is invalid" msgstr "Setarea punctului final nu este valabilă" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "Impune IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "Impune IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "Impune IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "Impune MLD versiunea 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "Impune MLD versiunea 2" @@ -2788,10 +3166,6 @@ msgstr "Eroare" msgid "Error getting PublicKey" msgstr "Eroare la obținerea PublicKey" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Secunde eronate (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2810,11 +3184,19 @@ msgstr "La fiecare 30 de secunde (lent, 0)" msgid "Every second (fast, 1)" msgstr "La fiecare secundă (rapid, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Excludeți interfețele" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"Executarea diverselor comenzi de rețea pentru a verifica conexiunea și " +"rezoluția numelui la alte sisteme." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2822,27 +3204,35 @@ msgstr "" "Scutiți 127.0.0.0/8 și ::1 de la verificările de " "relegare, de ex. pentru serviciile RBL." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Dispozitiv existent" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Extindeți gazdele" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Numărul de port așteptat." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Așteptând un indiciu de atribuire hexazecimală" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Așteptarea unei adrese IPv4 valide" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Așteptarea unei adrese IPv6 valide" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Așteptarea a două valori de prioritate separate prin două puncte" @@ -2851,11 +3241,11 @@ msgstr "Așteptarea a două valori de prioritate separate prin două puncte" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Se așteaptă: %s" @@ -2867,7 +3257,7 @@ msgstr "Se așteaptă: valoare nevidă" msgid "Expires" msgstr "Expiră" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2878,11 +3268,11 @@ msgstr "" msgid "External" msgstr "Extern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Lista de suporturi de chei externe R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Lista de suporturi de chei R1 externe" @@ -2910,35 +3300,63 @@ msgstr "Opțiuni suplimentare pppd" msgid "Extra sstpc options" msgstr "Opțiuni suplimentare sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT peste DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT pe calea aerului" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "Protocolul FT" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Nu s-a reușit schimbarea parolei sistemului." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Nu s-a reușit configurarea modemului" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "Nu a reușit să confirme aplicarea în %ds, așteptând rollback…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Nu a reușit să se conecteze" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Nu s-a reușit deconectarea" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Nu a reușit să execute acțiunea \"/etc/init.d/%s %s\": %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Nu a reușit să obțină informații despre modem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Nu s-a reușit inițializarea modemului" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Nu s-a reușit setarea modului de operare" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Fișier" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2946,40 +3364,48 @@ msgstr "" "Fișier care enumeră rezolvatorii din amonte, opțional specific domeniului, " "de exemplu server=1.2.3.4, server=/domain/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Fișierul nu este accesibil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "Fișier în care se stochează informațiile de închiriere DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "Fișier cu rezolvatori din amonte." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Numele fișierului" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Numele de fișier al imaginii de pornire anunțate clienților." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:315 msgid "Filesystem" -msgstr "Sistemul de fișiere" +msgstr "Sistem de fișiere" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Filtrarea înregistrărilor IPv4 A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Filtrarea înregistrărilor IPv6 AAAA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Filtrarea descoperirii serviciilor SRV/SOA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filtrați privatele" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filtrați nefolosite" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Filtrare pentru toate secundare, fără validare" @@ -2993,8 +3419,15 @@ msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" "Filtrare pentru toate scundare, validare numai pentru secundare de rezervă" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" +"Filtrează descoperirea serviciilor SRV/SOA, pentru a evita declanșarea " +"legăturilor dial-on-demand." + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Finalizarea a eșuat" @@ -3006,7 +3439,7 @@ msgstr "" "Găsiți toate sistemele de fișiere și swap atașate în prezent și înlocuiți " "configurația cu cea implicită pe baza a ceea ce a fost detectat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Găsiți și alăturați-vă rețelei" @@ -3020,10 +3453,11 @@ msgid "Firewall" msgstr "Firewall" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Marca Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Setările firewall-ului" @@ -3031,19 +3465,19 @@ msgstr "Setările firewall-ului" msgid "Firewall Status" msgstr "Starea Firewall-ului" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "Marca Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Fișier firmware" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Versiunea Firmware-ului" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Port sursă fix pentru interogările DNS de ieșire." @@ -3069,40 +3503,48 @@ msgstr "Operațiuni de scriere" msgid "Flashing…" msgstr "Scriere…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Forțați" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Forțați modul 40MHz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Forțați CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Forțați DHCP în această rețea chiar dacă este detectat un alt server." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "Forțați versiunea IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "Forțați versiunea MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Forțați TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Forțați TKIP și CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Forțați legătura" @@ -3114,11 +3556,11 @@ msgstr "Forțați upgrade-ul" msgid "Force use of NAT-T" msgstr "Forțați utilizarea NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Necorespundere între simboluri de formular" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA între interfața " "principală desemnată și interfețele din aval." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3144,7 +3586,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Redirecționarea traficului DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3152,32 +3594,36 @@ msgstr "" "Redirecționează mesajele DHCPv6 între interfața principală desemnată și " "interfețele din downstream." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "Secunde de corecție a erorilor înainte (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Redirecționarea traficului de difuzare" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "Întârziere redirecționare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Redirecționarea traficului între omologi de plasă" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" "Redirecționează pachetele multicast ca pachete unicast pe acest dispozitiv." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Mod de redirecționare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Fragmentare" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Pragul de fragmentare" @@ -3201,7 +3647,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Doar GPRS" @@ -3221,12 +3667,16 @@ msgstr "Tunel GRETAP pe IPv4" msgid "GRETAP tunnel over IPv6" msgstr "Tunel GRETAP peste IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Poartă de acces" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Modul Gateway" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Porturile porții de acces" @@ -3236,23 +3686,23 @@ msgstr "Porturile porții de acces" msgid "Gateway address is invalid" msgstr "Adresa porții de acces este nevalidă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Setări generale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Configurare generală" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Opțiuni generale ale dispozitivului" @@ -3260,7 +3710,7 @@ msgstr "Opțiuni generale ale dispozitivului" msgid "Generate Config" msgstr "Generare configurare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Generarea locală a PMK" @@ -3268,11 +3718,11 @@ msgstr "Generarea locală a PMK" msgid "Generate archive" msgstr "Generați arhivă" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "Generarea configurației" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "Generarea configurației…" @@ -3280,16 +3730,16 @@ msgstr "Generarea configurației…" msgid "Generate new key pair" msgstr "Generarea unei noi perechi de chei" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "Generarea unei chei prestabilite" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" "Generează o configurație potrivită pentru a fi importată pe un peer WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "Generarea de coduri QR…" @@ -3303,39 +3753,40 @@ msgstr "" msgid "Global Settings" msgstr "Setări generale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Opțiuni de rețea globală" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "Mergeți la actualizarea firmware-ului..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Mergeți la configurarea parolei..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Mergeți la pagina de configurare relevantă" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "Acordați acces la configurația DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Acordați acces la afișarea stării DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "Acordați acces la afișarea stării DSL" @@ -3347,6 +3798,10 @@ msgstr "Acordați acces la procedurile LuCI OpenConnect" msgid "Grant access to LuCI Wireguard procedures" msgstr "Acordați acces la procedurile LuCI Wireguard" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Acordarea accesului la procedurile LuCI openfortivpn" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "Acordați acces la configurația SSH" @@ -3383,7 +3838,7 @@ msgstr "Acordați acces la configurația de montare" msgid "Grant access to network configuration" msgstr "Acordați acces la configurația rețelei" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Acordați acces la instrumentele de diagnosticare a rețelei" @@ -3391,6 +3846,10 @@ msgstr "Acordați acces la instrumentele de diagnosticare a rețelei" msgid "Grant access to network status information" msgstr "Acordați acces la informațiile despre starea rețelei" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "Acordați acces la starea procesului" @@ -3423,7 +3882,7 @@ msgstr "Acordați acces la configurația uHTTPd" msgid "Grant access to wireless channel status" msgstr "Acordați acces la starea canalului wireless" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Acordați acces la afișarea stării wireless" @@ -3452,15 +3911,11 @@ msgstr "Acces HTTP(S)" msgid "Hang Up" msgstr "Închideți" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Erori de cod de eroare de antet (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Intervalul de bătaie a inimii (kernel: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Interval de bună ziua" @@ -3472,7 +3927,7 @@ msgstr "" "Aici puteți configura aspectele de bază ale dispozitivului dumneavoastră, " "cum ar fi numele de gazdă sau fusul orar." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Ascunde ESSID" @@ -3481,17 +3936,25 @@ msgstr "Ascunde ESSID" msgid "Hide empty chains" msgstr "Ascundeți legăturile goale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "Mare" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "Onor gratuit ARP" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "Cârlig: %h (%h), Prioritate: %d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Penalitate pentru Hop" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3501,7 +3964,7 @@ msgstr "Gazdă" msgid "Host expiry timeout" msgstr "Timpul de expirare a gazdei" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "Gazda solicită acest nume de fișier de la serverul de pornire." @@ -3509,10 +3972,16 @@ msgstr "Gazda solicită acest nume de fișier de la serverul de pornire." msgid "Host-Uniq tag content" msgstr "Conținutul etichetei Host-Uniq" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3522,11 +3991,11 @@ msgstr "Numele gazdei ( hostname )" msgid "Hostname to send when requesting DHCP" msgstr "Numele gazdei care trebuie trimis atunci când se solicită DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Numele gazdelor (hostnames)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3586,23 +4055,27 @@ msgstr "IEEE 802.3ad Agregarea dinamică a legăturilor (802.3ad, 4)" msgid "IKE DH Group" msgstr "Grupul IKE DH" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "Adrese IP" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "Protocolul IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "Seturi IP" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "Tip IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3618,32 +4091,35 @@ msgstr "Adresa IP este invalidă" msgid "IP address is missing" msgstr "Adresa IP lipsește" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " "packets with matching destination IP." msgstr "" +"Adresele IP care sunt permise în interiorul tunelului. Omologul va accepta " +"pachetele prin tunel cu adrese IP sursă care corespund acestei liste și va " +"redirecționa pachetele cu adrese IP de destinație corespunzătoare." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 msgctxt "nft ip protocol" msgid "IP protocol" msgstr "Protocolul IP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "Protocolul IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "Set IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "Seturi IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Bogus NX Domain Override" @@ -3651,14 +4127,15 @@ msgstr "Bogus NX Domain Override" msgid "IPsec XFRM" msgstr "IP sec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3674,7 +4151,7 @@ msgstr "Vecini IPv4" msgid "IPv4 Routing" msgstr "Rutarea IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "Reguli IPv4" @@ -3684,7 +4161,7 @@ msgstr "Conexiune IPv4 externă" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3711,7 +4188,7 @@ msgstr "Masca de rețea IPv4" msgid "IPv4 network in address/netmask notation" msgstr "Rețea IPv4 în notație adresă/mască de rețea" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Doar IPv4" @@ -3724,11 +4201,11 @@ msgstr "Prefix IPv4" msgid "IPv4 prefix length" msgstr "Lungime prefix IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "Tabelul de trafic IPv4 \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3737,16 +4214,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-în-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (ambele - valoarea implicită este IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "Tabelul de trafic IPv4/IPv6 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3757,7 +4238,8 @@ msgstr "Tabelul de trafic IPv4/IPv6 \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3765,7 +4247,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Firewall IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "IPv6 MTU" @@ -3773,7 +4255,11 @@ msgstr "IPv6 MTU" msgid "IPv6 Neighbours" msgstr "Vecini IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "Setări IPv6 RA" @@ -3781,15 +4267,15 @@ msgstr "Setări IPv6 RA" msgid "IPv6 Routing" msgstr "Rutarea IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "Rutarea IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "Setări IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6 ULA-Prefixul" @@ -3803,12 +4289,12 @@ msgstr "Conexiune IPv6 externă" msgid "IPv6 address" msgstr "Adresa IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "Indicație de atribuire IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "Lungimea alocării IPv6" @@ -3820,11 +4306,11 @@ msgstr "Poartă de acces IPv6" msgid "IPv6 network in address/netmask notation" msgstr "Rețeaua IPv6 în notație adresă/mască de rețea" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Doar IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "Preferința IPv6" @@ -3833,7 +4319,7 @@ msgstr "Preferința IPv6" msgid "IPv6 prefix" msgstr "Prefix IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "Filtru de prefix IPv6" @@ -3847,23 +4333,19 @@ msgstr "Lungimea prefixului IPv6" msgid "IPv6 routed prefix" msgstr "Prefix rutat IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "Rutarea la sursă IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "Sufixul IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "Sufixul IPv6 (hexagonal)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "Suport IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "Tabelul de trafic IPv6 \"%h\"" @@ -3871,6 +4353,10 @@ msgstr "Tabelul de trafic IPv6 \"%h\"" msgid "IPv6-PD" msgstr "Delegarea prefixului IPv6" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3886,10 +4372,16 @@ msgstr "IPv6-prin-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-prin-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identitate" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Dacă este bifat, 1DES este activat" @@ -3902,7 +4394,7 @@ msgstr "Dacă este bifat, adaugă \"+ipv6\" la opțiunile pppd" msgid "If checked, encryption is disabled" msgstr "Dacă este bifat, criptarea este dezactivată" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." @@ -3910,7 +4402,7 @@ msgstr "" "Dacă este setat, subrețelele din aval sunt alocate numai din clasele de " "prefixe IPv6 date." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "Dacă este setată, semnificația opțiunilor de potrivire este inversată" @@ -3931,7 +4423,7 @@ msgstr "" "Dacă este specificat, montați dispozitivul după UUID-ul său în loc de un nod " "de dispozitiv fix" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " @@ -3941,14 +4433,16 @@ msgstr "" "reconectare manuală la noul IP în termen de %d secunde " "pentru a confirma setările, în caz contrar modificările vor fi anulate." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Dacă nu este bifat, nu este configurată nicio rută implicită" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "Dacă nu este bifat, adresele de server DNS anunțate sunt ignorate" @@ -3968,15 +4462,23 @@ msgstr "" "deoarece dispozitivul swap nu poate fi accesat cu vitezele mari de date ale " "RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignorați /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignorați interfața" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignoră fișierul resolv" @@ -3988,25 +4490,25 @@ msgstr "Imagine" msgid "Image check failed:" msgstr "Verificarea imaginii a eșuat:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "Importă ca peer" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "Configurație de import" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "Importați configurația ca peer…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "Setări de import" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "Configurație omologă importată" @@ -4018,7 +4520,24 @@ msgstr "Importă setările dintr-un fișier de configurare WireGuard existent" msgid "In" msgstr "În" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"În configurațiile LAN cu bridge este recomandabil să se activeze funcția de " +"evitare a buclelor de bridge pentru a evita buclele de difuzare care pot " +"bloca întreaga rețea LAN." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -4027,7 +4546,7 @@ msgstr "" "blocată. Faceți clic pe \"Continuați »\" de mai jos pentru a reveni la " "pagina anterioară." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "În secunde" @@ -4059,7 +4578,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Suma de control de intrare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Interfață de intrare" @@ -4067,6 +4586,7 @@ msgstr "Interfață de intrare" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Cheia de intrare" @@ -4085,22 +4605,21 @@ msgstr "Informații" msgid "Information" msgstr "Informație" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "Maparea QoS de intrare" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "ID-ul dispozitivului de intrare" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "Numele dispozitivului de intrare" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Inițializare eșuată" @@ -4112,31 +4631,41 @@ msgstr "Script de inițializare" msgid "Initscripts" msgstr "Script-uri de inițializare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Constrângerea certificatului interior (Domeniu)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Constrângerea certificatului interior (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Constrângerea certificatului intern (Subiect)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Constrângerea certificatului interior (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Instalați extensiile de protocol..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Instanța" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Instanța \"%h\"" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Detalii despre instanță" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4148,6 +4677,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Permisiuni insuficiente pentru a citi configurația UCI." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4155,7 +4688,7 @@ msgstr "Permisiuni insuficiente pentru a citi configurația UCI." msgid "Interface" msgstr "Interfață" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "Interfața \"%h\" este deja marcată ca principală." @@ -4163,7 +4696,7 @@ msgstr "Interfața \"%h\" este deja marcată ca principală." msgid "Interface %q device auto-migrated from %q to %q." msgstr "Dispozitivul interfeței %q a migrat automat de la %q la %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Configurarea interfeței" @@ -4194,11 +4727,11 @@ msgstr "Interfața se reconectează..." msgid "Interface is shutting down..." msgstr "Se închide interfața..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Se pornește interfața..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Se oprește interfața..." @@ -4207,12 +4740,12 @@ msgid "Interface name" msgstr "Numele interfeței" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Interfața nu este prezentă sau nu este încă conectată." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Interfețe" @@ -4221,15 +4754,19 @@ msgstr "Interfețe" msgid "Internal" msgstr "Internă" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Eroare internă de server" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Interval pentru trimiterea pachetelor de învățare" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4239,7 +4776,7 @@ msgstr "" "acestei valori, un administrator poate regla numărul de mesaje IGMP din " "subrețea; valorile mai mari determină trimiterea mai rar a interogărilor IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "Interval în secunde pentru pachetele de salut STP" @@ -4249,8 +4786,9 @@ msgid "Invalid" msgstr "Nu este valid" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "APN nevalabil furnizat" @@ -4260,6 +4798,10 @@ msgstr "APN nevalabil furnizat" msgid "Invalid Base64 key string" msgstr "Șir de chei Base64 nevalabil" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Adresă IPv6 invalidă" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4282,7 +4824,7 @@ msgstr "ID-ul VLAN invalid dat! Sunt permise numai ID-uri unice" msgid "Invalid argument" msgstr "Argument nevalabil" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4298,16 +4840,37 @@ msgstr "Comandă invalidă" msgid "Invalid hexadecimal value" msgstr "Valoare hexazecimală invalidă" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Nume de gazdă sau adresă IPv4 invalidă" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Port invalid" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "URL server invalid" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "" "Numele de utilizator și/sau parola nevalide! Vă rugăm să încercați din nou." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Inversarea clipirii" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "Potrivire inversă" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "Este VLAN primar" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Izolați clienții" @@ -4320,25 +4883,25 @@ msgstr "" "Se pare că încercați să scrieți o imagine care nu se încadrează în memoria " "flash, vă rugăm să verificați fișierul imagine!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "JavaScript este necesar!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Alăturați-vă rețelei" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Alăturați-vă rețelei: Scanare wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Conectarea la rețea: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Salt la regulă" @@ -4346,24 +4909,28 @@ msgstr "Salt la regulă" msgid "Keep settings and retain the current configuration" msgstr "Păstrați setările și păstrați configurația curentă" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "Păstrați-viața" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Jurnalul Kernel-ului" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Versiunea Kernel-ului" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Cheie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Cheia #%d" @@ -4371,6 +4938,7 @@ msgstr "Cheia #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Cheia pentru pachetele primite (opțional)." @@ -4378,14 +4946,19 @@ msgstr "Cheia pentru pachetele primite (opțional)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Cheia pentru pachetele de ieșire (opțional)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "Cheia lipsă" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Cheia utilizată pentru a semna configurația rețelei" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4430,7 +5003,7 @@ msgstr "Intervalul de ecou LCP" msgid "LED Configuration" msgstr "Configurarea LED-urilor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4447,32 +5020,41 @@ msgstr "Limba" msgid "Language and Style" msgstr "Limba și stilul interfeței" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" +"Ponderile mai mari (cu același prio) au o probabilitate proporțional mai " +"mare de a fi selectate." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "Intervalul ultimului membru" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Latență" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Cea mai recentă strângere de mână" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Frunză" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Învățați" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "Învățați rutele" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Fișier de închiriere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Timp de închiriere" @@ -4496,7 +5078,7 @@ msgstr "Lăsați gol pentru autodetecție" msgid "Leave empty to use the current WAN address" msgstr "Lăsați gol pentru a utiliza adresa WAN curentă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4507,33 +5089,29 @@ msgstr "" "fi semnificativ redusă în cazul în care sunt utilizate aceste dispozitive. " "Se recomandă să nu se permită ratele 802.11b atunci când este posibil." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "Reguli anterioare detectate" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Legendă:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Limită" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Atenuarea liniei (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" -msgstr "Mod linie" +msgstr "Modul linie" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" -msgstr "Stare de linie" +msgstr "Starea liniei" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" -msgstr "Timpul de funcționare a liniei" +msgstr "Timp de funcționare a liniei" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:125 msgid "Link Aggregation (Channel Bonding)" @@ -4552,18 +5130,20 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "Biți de antet de nivel de legătură %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Lista de adrese IP care trebuie convertite în răspunsuri NXDOMAIN." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" "Listă de seturi IP care trebuie completate cu IP-urile de domeniu " "specificate." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4578,7 +5158,7 @@ msgstr "" "R1 de la R0KH pe care STA a utilizat-o în timpul asocierii inițiale a " "domeniului de mobilitate." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4597,23 +5177,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Lista de fișiere de chei SSH pentru autentificare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Lista domeniilor pentru care se permit răspunsurile RFC1918." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Lista domeniilor care trebuie forțate la o adresă IP." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "Lista de rezolvatori din upstream către care se transmit interogările." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Port de ascultare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Interfețe de ascultare" @@ -4623,7 +5200,7 @@ msgstr "" "Ascultă numai pe interfața dată sau, dacă nu este specificat, pe toate " "interfețele" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4635,7 +5212,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "Setarea ListenPort nu este validă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Port de ascultare pentru interogările DNS de intrare." @@ -4644,7 +5221,7 @@ msgstr "Port de ascultare pentru interogările DNS de intrare." msgid "Load" msgstr "Încărcare" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Încărcare medie" @@ -4652,27 +5229,28 @@ msgstr "Încărcare medie" msgid "Load configuration…" msgstr "Încărcați configurația…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Încărcare date…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Încărcarea conținutului directorului…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Se încarcă vizualizarea…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Locală" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Adresa IP locală" @@ -4692,11 +5270,12 @@ msgstr "Adresa IP locală de atribuit" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Adresa IPv4 locală" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Server DNS IPv6 local" @@ -4712,46 +5291,72 @@ msgstr "Adresa IPv6 locală" msgid "Local Startup" msgstr "Pornire locală" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Ora locală" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "ULA locală" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Domeniu local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "Sufixul domeniului local adăugat la numele DHCP și la intrările din fișierul " "hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Server local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Doar serviciu local" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Cheie locală wireguard" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Localizați interogările" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Blocare la BSSID" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Eveniment de jurnal \"%h. . .\"" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Autentificare" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Mergeți la autentificare…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Deconectare" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Nivelul de ieșire a jurnalului" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Scrieți in jurnal interogările" @@ -4778,37 +5383,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "Rețeaua logică la care va fi adăugat tunelul (punte) (opțional)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Autentificare" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Deconectare" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "Filtrare liberă" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Secunde de pierdere a semnalului (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Cea mai joasă adresă închiriată ca decalaj față de adresa de rețea." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Modul de compatibilitate Lua activ" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "Adresa MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Filtru de adrese MAC" @@ -4816,16 +5412,15 @@ msgstr "Filtru de adrese MAC" msgid "MAC Address For The Actor" msgstr "Adresa MAC pentru actor" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4834,11 +5429,15 @@ msgstr "MAC VLAN" msgid "MAC address" msgstr "Adresa MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Filtru-MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Listă-MAC" @@ -4852,6 +5451,10 @@ msgstr "MAP / LW4peste6" msgid "MAP rule is invalid" msgstr "Regula MAP nu este valabilă" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "MBIM Cellular" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4873,15 +5476,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "Intervalul MII" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4891,7 +5498,7 @@ msgstr "" "comenzilor de mai jos:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4900,66 +5507,70 @@ msgstr "" msgid "Manual" msgstr "Manual" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Principal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "Intervalul maxim RA" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Max. Rata de date realizabilă (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "Max. Închirieri DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "Dimensiunea maximă a pachetului EDNS0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Numărul maxim de interogări simultane" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Vârsta maximă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Intervalul de ascultare maxim permis" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Numărul maxim permis de închirieri DHCP active." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Numărul maxim de interogări DNS simultane." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "Dimensiunea maximă permisă a pachetelor UDP EDNS0." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" "Numărul maxim de secunde de așteptare pentru ca modemul să fie pregătit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Numărul maxim de adrese închiriate." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "Dimensiunea maximă a tabelului de snooping" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -4967,10 +5578,14 @@ msgstr "" "Timpul maxim permis între trimiterea de RA. Valoarea implicită este de 600 de secunde." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Putere maximă de transmisie" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Poate împiedica funcționarea serviciilor VoIP sau a altor servicii." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4997,7 +5612,7 @@ msgstr "Memorie" msgid "Memory usage (%)" msgstr "Memorie utilizată (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Plasă" @@ -5005,10 +5620,18 @@ msgstr "Plasă" msgid "Mesh ID" msgstr "ID-ul plasei" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "ID-ul plasei" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Rutere de tip mesh" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Opțiuni legate de rețea și de rutare" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Metoda nu a fost găsită" @@ -5021,7 +5644,7 @@ msgstr "Metoda de monitorizare a legăturii" msgid "Method to determine link status" msgstr "Metoda de determinare a stării legăturii" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -5032,11 +5655,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "Minim RA interval" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Timpul minim de valabilitate ARP" @@ -5044,7 +5667,7 @@ msgstr "Timpul minim de valabilitate ARP" msgid "Minimum Number of Links" msgstr "Numărul minim de legături" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." @@ -5052,7 +5675,7 @@ msgstr "" "Timpul minim necesar în secunde înainte ca o intrare ARP să poată fi " "înlocuită. Împiedică distrugerea cache-ului ARP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -5068,35 +5691,49 @@ msgstr "Portul monitorului oglindă" msgid "Mirror source port" msgstr "Port sursă oglindă" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "Cod țară mobil" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Date mobile" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "Codul rețelei mobile" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "Serviciul mobil" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Domeniul de mobilitate" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Mod" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Model" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Demontarea suportului modemului este în curs." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "Informații despre modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5104,43 +5741,36 @@ msgstr "" "Conexiunea modemului este în curs de realizare. Vă rugăm așteptați. Acest " "proces se va încheia după 2 minute." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Modem implicit" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Dispozitiv modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Deconectarea modemului este în curs. Vă rugăm așteptați." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Interogarea informațiilor privind modemul a eșuat" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Timp de așteptare pentru inițializarea modemului" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "Modemul este dezactivat." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "ManagerModem" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" @@ -5211,6 +5841,10 @@ msgstr "Mutarea în jos" msgid "Move up" msgstr "Mutarea în sus" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "De la Multi la Unicast" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5218,19 +5852,23 @@ msgstr "Mutarea în sus" msgid "Multicast" msgstr "Difuzare multiplă" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Modul Multicast" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Rutarea multicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "Multicast către unicast" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "Lanțul de acțiuni NAT \"%h\"" @@ -5242,12 +5880,16 @@ msgstr "NAT-T Mod" msgid "NAT64 Prefix" msgstr "Prefixul NAT64" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "Prefix NAT64" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "Proxy-NDP secundar" @@ -5260,18 +5902,23 @@ msgid "NTP server candidates" msgstr "Serverele NTP candidate" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Nume" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Numele noii rețele" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Numele dispozitivului de tunel" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigare" @@ -5280,13 +5927,17 @@ msgstr "Navigare" msgid "Nebula Network" msgstr "Rețeaua Nebula" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Raport de vecinătate" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "Valabilitatea cache-ului de vecinătate" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5295,32 +5946,36 @@ msgstr "Valabilitatea cache-ului de vecinătate" msgid "Network" msgstr "Rețea" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Codificarea rețelei" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "Mod Rețea" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "Înregistrarea rețelei" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "SSID-ul de rețea" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Utilitare de rețea" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "Adresa de rețea" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Imagine de pornire în rețea" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "Migrarea configurației punților de rețea" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Dispozitiv de rețea" @@ -5333,7 +5988,7 @@ msgstr "Activitatea dispozitivului de rețea (kernel: netdev)" msgid "Network device is not present" msgstr "Dispozitivul de rețea nu este prezent" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "Tabelul dispozitivelor de rețea \"%h\"" @@ -5342,7 +5997,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "Biti de antet de rețea %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Migrarea configurației rețelei ifname" @@ -5351,15 +6006,20 @@ msgstr "Migrarea configurației rețelei ifname" msgid "Network interface" msgstr "Interfață de rețea" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "ID-ul rețelei" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Niciodată" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Niciodată" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5367,11 +6027,11 @@ msgstr "" "Nu redirecționați niciodată domeniile și subdomeniile care corespund, " "rezolvați numai din DHCP sau din fișierele hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Nu se poate crea o nouă interfață pentru \"%s\": %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Nume nou interfață…" @@ -5379,13 +6039,13 @@ msgstr "Nume nou interfață…" msgid "Next »" msgstr "Următoarea »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Nu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Nici un server DHCP configurat pentru această interfață" @@ -5393,7 +6053,7 @@ msgstr "Nici un server DHCP configurat pentru această interfață" msgid "No Data" msgstr "Nu există date" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Fără criptare" @@ -5409,9 +6069,17 @@ msgstr "Fără NAT-T" msgid "No RX signal" msgstr "Fără recepție semnal (RX)" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Nu sunt configurate interfețe WireGuard." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5425,7 +6093,11 @@ msgstr "" msgid "No client associated" msgstr "Niciun client asociat" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Niciun dispozitiv de control specificat" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "Nu există date" @@ -5434,8 +6106,8 @@ msgstr "Nu există date" msgid "No data received" msgstr "Nu s-au primit date" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "Nu se impune" @@ -5448,15 +6120,11 @@ msgstr "Nu se impune" msgid "No entries available" msgstr "Fără intrări disponibile" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Fără intrări în acest director" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Nu s-au găsit fișiere" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5472,7 +6140,7 @@ msgstr "" msgid "No host route" msgstr "Fără rută gazdă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5493,30 +6161,39 @@ msgstr "Nu mai sunt secundari disponibili" msgid "No more slaves available, can not save interface" msgstr "Nu mai sunt secundare disponibile, nu se poate salva interfața" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Fără memorie cache negativă" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "Nu s-a încărcat niciun set de reguli nftables." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Nu este setată nicio parolă!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Nu sunt conectați omologi" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "Încă nu sunt definiți peers." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Fără chei publice prezente încă." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "Nu există reguli în acestă legătură" @@ -5530,7 +6207,8 @@ msgid "No validation or filtering" msgstr "Nu există validare sau filtrare" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Nici o zonă atribuită" @@ -5542,37 +6220,40 @@ msgstr "Nici o zonă atribuită" msgid "Noise" msgstr "Zgomot" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Marja de zgomot (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Marja de zgomot" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Zgomot:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Erori CRC non-preemptive (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Fără-wildcard" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Nici unul" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Nu a fost găsit" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Nu este membru" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Nu este asociat" @@ -5585,7 +6266,7 @@ msgstr "Nu este conectat" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Nu este prezent" @@ -5597,7 +6278,7 @@ msgstr "Nu a început la pornire" msgid "Not supported" msgstr "Neacceptat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5605,6 +6286,15 @@ msgstr "" "Notă: Unele drivere wireless nu acceptă în totalitate 802.11w. De exemplu, " "este posibil ca mwlwifi să aibă probleme" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Notă: este posibil să aveți nevoie și de un DHCP Proxy (momentan " +"indisponibil) atunci când specificați un port Relay To non-standard " +"(addr#port)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Note" @@ -5613,7 +6303,7 @@ msgstr "Note" msgid "Notice" msgstr "Aviz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Căutare DNS" @@ -5621,7 +6311,7 @@ msgstr "Căutare DNS" msgid "Number of IGMP membership reports" msgstr "Numărul de rapoarte de apartenență IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "Numărul de intrări DNS stocate în memoria cache, 10000 este maxim, 0 " @@ -5640,7 +6330,7 @@ msgid "Obfuscated Password" msgstr "Parolă obscurizată" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5651,6 +6341,7 @@ msgid "Obtain IPv6 address" msgstr "Obținerea adresei IPv6" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Oprit" @@ -5659,6 +6350,14 @@ msgstr "Oprit" msgid "Off-State Delay" msgstr "Întârziere off-state" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"Închideți: vlanXXX, e.g., vlan1. Deschideți: " +"vlan_tagged_interface.XXX, e.g. eth0.1." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Pornit" @@ -5667,15 +6366,15 @@ msgstr "Pornit" msgid "On-State Delay" msgstr "Întârziere în stare activă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "Pornit de pe link" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Trebuie specificat unul dintre numele de gazdă sau adresa MAC!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Unul dintre următoarele: %s" @@ -5693,7 +6392,11 @@ msgstr "Una sau mai multe valori invalide/necesare pe filă" msgid "One or more required fields have no value!" msgstr "Unul sau mai multe câmpuri obligatorii nu au nicio valoare!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" "Permite comunicarea cu porturile de punte neizolate numai atunci când este " @@ -5706,25 +6409,24 @@ msgstr "" "Numai în cazul în care secundarul activ curent eșuează și secundul principal " "este activ (eșec, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "Deschideți prezentarea generală a regulilor iptables…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Deschideți lista..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "Conectare Deschisă (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "FortiOpenvpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5742,7 +6444,7 @@ msgstr "" "Funcționează în modul releu dacă o interfață principală desemnată " "este configurată și activă, în caz contrar revine la modul server." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." @@ -5750,12 +6452,24 @@ msgstr "" "Funcționează în modul relay dacă este prezent un prefix IPv6 în " "amonte, altfel dezactivează serviciul." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Frecvență de operare" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "Opțiunea \"%s\" conține o valoare de intrare invalidă." @@ -5763,22 +6477,32 @@ msgstr "Opțiunea \"%s\" conține o valoare de intrare invalidă." msgid "Option \"%s\" must not be empty." msgstr "Opțiunea \"%s\" nu trebuie să fie goală." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Opțiune modificată" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Opțiune eliminată" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Opțional" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Note opționale, în formă liberă, despre acest dispozitiv" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" +"Opțional, în secunde. Dacă este setat la \"0\", nu se încearcă reconectarea." + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5787,7 +6511,7 @@ msgstr "" "Opțional. Marca de 32 de biți pentru pachetele criptate de ieșire. " "Introduceți valoarea în hexazecimal, începând cu 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5799,7 +6523,7 @@ msgstr "" "este primit de la un server delegant, se utilizează sufixul (cum ar fi " "\"::1\") pentru a forma adresa IPv6 (\"a:b:c:d::1\") pentru interfață." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5808,11 +6532,11 @@ msgstr "" "suplimentar de criptografie cu cheie simetrică pentru rezistență post-" "cuantice." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Opțional. Creează rute pentru IP-uri permise pentru acest peer." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Opțional. Descriere a partenerului." @@ -5820,7 +6544,7 @@ msgstr "Opțional. Descriere a partenerului." msgid "Optional. Do not create host routes to peers." msgstr "Opțional. Nu creați rute gazdă către parteneri." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." @@ -5828,7 +6552,7 @@ msgstr "" "Opțional. Gazda omologului. Numele sunt rezolvate înainte de a aduce " "interfața." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5846,11 +6570,11 @@ msgstr "Opțional. Unitatea maximă de transmisie a interfeței XFRM." msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Opțional. Unitatea maximă de transmisie a interfeței de tunel." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Opțional. Portul partenerului." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5862,7 +6586,7 @@ msgstr "" "peer sau a unui cod QR, dacă este disponibilă. Ea poate fi eliminată după ce " "configurația a fost exportată." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5879,7 +6603,7 @@ msgstr "Opțional. Port UDP utilizat pentru pachetele de ieșire și de intrare. msgid "Options" msgstr "Opțiuni" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" pentru ruta implicită. 0.0.0.0.0 înseamnă \"adresa " "sistemului care rulează dnsmasq\"." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "Opțiuni:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Ordinal: cel mai mic este primul." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Intervalul de origine" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "Altele:" @@ -5914,7 +6647,7 @@ msgstr "Ieşire:" msgid "Outgoing checksum" msgstr "Suma de control ieșită" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "Interfață de ieșire" @@ -5922,6 +6655,7 @@ msgstr "Interfață de ieșire" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "Cheie de ieșire" @@ -5945,21 +6679,23 @@ msgstr "Zona de ieșire" msgid "Overlap" msgstr "Suprapunere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "Suprascrie tabelul de rutare IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "Suprascrie tabelul de rutare IPv6" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5967,6 +6703,7 @@ msgstr "Suprascrie tabelul de rutare IPv6" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "Suprascrieți MTU" @@ -5988,7 +6725,7 @@ msgstr "Anulare TOS" msgid "Override TTL" msgstr "Anulare TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -6004,7 +6741,7 @@ msgstr "Suprascrieți numele implicit al interfeței" msgid "Override the gateway in DHCP responses" msgstr "Suprascrieți poarta de acces în răspunsurile DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -6020,7 +6757,7 @@ msgstr "Suprascrieți tabelul utilizat pentru rutele interne" msgid "Overview" msgstr "Prezentare generală" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "Suprascrieți fișierul existent \"%s\" ?" @@ -6028,17 +6765,30 @@ msgstr "Suprascrieți fișierul existent \"%s\" ?" msgid "Overwrite the current settings with the imported configuration?" msgstr "Suprascrieți setările curente cu configurația importată?" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Proprietar" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (ambele)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -6050,8 +6800,9 @@ msgid "PAP/CHAP password" msgstr "Parola PAP/CHAP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -6062,6 +6813,7 @@ msgstr "Parola PAP/CHAP" msgid "PAP/CHAP username" msgstr "Nume de utilizator PAP/CHAP" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "Tip PDP" @@ -6071,8 +6823,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "PIN" @@ -6082,7 +6835,7 @@ msgstr "PIN" msgid "PIN code rejected" msgstr "Cod PIN respins" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "PMK R1 Împingeți" @@ -6123,28 +6876,37 @@ msgstr "Decalaj PSID" msgid "PSID-bits length" msgstr "PSID-bits lungime" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM (Modul de transfer al pachetelor)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "Setări PXE/TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "Direcționarea pachetelor" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "Marca pachetului" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Timpul de primire a pachetului" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "Pachete" @@ -6153,23 +6915,31 @@ msgstr "Pachete" msgid "Packets To Transmit Before Moving To Next Slave" msgstr "Pachete de transmis înainte de a trece la următorul secundar" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Parte din zonă %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "Pass-through (dispozitiv fizic în oglindă pentru un singur MAC VLAN)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Parolă" @@ -6177,11 +6947,11 @@ msgstr "Parolă" msgid "Password authentication" msgstr "Autentificare prin parolă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Parola cheii private" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "Parola cheii private interioare" @@ -6192,19 +6962,19 @@ msgstr "Parola cheii private interioare" msgid "Password strength" msgstr "Puterea parolei" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "Parola2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "Lipiți sau trageți fișierul cu cheia SSH…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "Lipiți sau trageți fișierul de configurare peer WireGuard (wg0.conf)…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " @@ -6215,31 +6985,31 @@ msgstr "" "care să permită sistemului respectiv să se conecteze la interfața WireGuard " "locală." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "Lipiți sau trageți fișierul de configurare WireGuard furnizat…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Calea către certificatul CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Cale de acces la certificatul clientului" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Calea către cheia privată" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Cale de acces la certificatul CA intern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Calea de acces la certificatul intern" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Cale către cheia privată interioară" @@ -6261,11 +7031,19 @@ msgstr "Întrerupt" msgid "Peak:" msgstr "Maxim:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Omologi" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Detalii de Peer" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Adresa IP a omologului care urmează să fie atribuită" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "Adresa MAC a colegului" @@ -6274,11 +7052,11 @@ msgstr "Adresa MAC a colegului" msgid "Peer address is missing" msgstr "Adresa MAC a partenerului" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Numele dispozitivului partener" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Partener dezactivat" @@ -6309,10 +7087,14 @@ msgstr "Efectuați resetarea" msgid "Permission denied" msgstr "Permisiune refuzată" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Persistentă Keep Alive" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Interval de reconectare persistentă" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "Setarea PersistentKeepAlive nu este valabilă" @@ -6321,13 +7103,13 @@ msgstr "Setarea PersistentKeepAlive nu este valabilă" msgid "Phy Rate:" msgstr "Rata fizică:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Setări fizice" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6340,11 +7122,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pachete." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Vă rugăm să introduceți numele de utilizator și parola." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Vă rugăm să selectați fișierul de încărcat." @@ -6352,56 +7134,74 @@ msgstr "Vă rugăm să selectați fișierul de încărcat." msgid "Policy" msgstr "Politica" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "Politica: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Izolarea portului" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Starea portului:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Negație potențială a: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Modul de gestionare a energiei" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Erori CRC preemptive (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "Putere de stat" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Preferați LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Preferați UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Prefix Delegat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "Prefix supresor" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Cheie predistribuită" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "Cheie de partajare în uz" @@ -6426,15 +7226,18 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Împiedică comunicarea între clienți" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"Împiedică un client fără fir să vorbească cu altul. Această setare afectează " +"numai pachetele fără etichetă VLAN (pachete neetichetate)." + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Secundară Principală" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "ID VLAN principal" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6449,29 +7252,31 @@ msgstr "" "Principala devine secundară activă ori de câte ori revine în funcțiune " "(întotdeauna, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Prioritate" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "Privat" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "Privat (Împiedică comunicarea între VLAN-urile MAC)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" -msgstr "Cheie privată" +msgstr "Cheia privată" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "Cheia privată prezentă" @@ -6489,8 +7294,8 @@ msgid "Prot." msgstr "Protocol." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6502,7 +7307,7 @@ msgstr "Protocol" msgid "Provide NTP server" msgstr "Furnizați server NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6510,7 +7315,7 @@ msgstr "" "Furnizați un server DHCPv6 pe această interfață și răspundeți la " "solicitările și cererile DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Furnizați o nouă rețea" @@ -6522,25 +7327,36 @@ msgstr "" "Furnizează serverul NTP pentru interfața selectată sau, dacă nu este " "specificat, pentru toate interfețele" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Server Proxy" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Pseudo Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Cheia publică" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "Cheia publică lipsește" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "Cheia publică: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6571,59 +7387,83 @@ msgstr "QMI Celular" msgid "Quality" msgstr "Calitate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "Interoghează toți rezolvatorii din amonte disponibili." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Interval de interogare" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Intervalul de răspuns la interogare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "R0 Durata de viață a cheii" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "R1 Titularul cheii" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Radius-Contabilitate-Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Radius-Contabilitate-Secret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Radius-Contabilitate-Server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Radius-Autentificare-Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Radius-Autentificare-Secret" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Radius-Autentificare-Server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "Atribuirea dinamică a VLAN-urilor RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "RADIUS Pe STA VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "Schema de denumire a punților RADIUS VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "Denumirea VLAN-urilor RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "Interfața RADIUS VLAN etichetată RADIUS" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "Modul RFC3947 NAT-T" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "Preautentificare RSN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "Pragul RSSI pentru aderare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Pragul RTS/CTS" @@ -6636,10 +7476,18 @@ msgstr "RX" msgid "RX Rate" msgstr "Rată de recepție" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "Rată de recepție / Rată de transmisie" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"Măsurarea resurselor radio - trimite semnale de avertizare pentru a ajuta la " +"roaming. Nu toți clienții acceptă acest lucru." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6651,11 +7499,11 @@ msgstr "" "Octeți brute codificați în format hexazecimal. Lăsați gol, cu excepția " "cazului în care ISP-ul dumneavoastră solicită acest lucru" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Citiți /etc/ethers pentru a configura serverul DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Sigur doriți să schimbați protocolul?" @@ -6663,11 +7511,11 @@ msgstr "Sigur doriți să schimbați protocolul?" msgid "Realtime Graphs" msgstr "Grafice în timp real" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Termenul limită pentru reasociere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Protecție de relegare" @@ -6691,11 +7539,39 @@ msgstr "Repornește sistemul de operare al dispozitivului dumneavoastră" msgid "Receive" msgstr "Se primește" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Date primite" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Recomandat. Adresele IP ale interfeței WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Pauză de reconectare" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Reconectați această interfață" @@ -6703,12 +7579,12 @@ msgstr "Reconectați această interfață" msgid "Redirect to HTTPS" msgstr "Redirecționați către HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "Redirecționare către portul local %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "Redirecționare către sistemul local" @@ -6717,31 +7593,39 @@ msgstr "Redirecționare către sistemul local" msgid "References" msgstr "Referințe" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Reîmprospătare canale" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Împrospătare" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "Înregistrare Stat" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "Respinge pachetul IPv4 cu ICMP tip %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "Respingeți pachetul cu ICMP tip %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "Respingeți pachetul cu ICMPv6 tip %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "Respingeți pachetul cu TCP reset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" @@ -6750,6 +7634,8 @@ msgstr "" "egală cu valoarea specificată" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Releu" @@ -6759,6 +7645,12 @@ msgstr "Releu" msgid "Relay Bridge" msgstr "Releu punte" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"Redistribuiți cererile DHCP în altă parte. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, " +"v6↔v4." + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Releu între rețele" @@ -6768,6 +7660,14 @@ msgstr "Releu între rețele" msgid "Relay bridge" msgstr "Releu punte" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6777,6 +7677,7 @@ msgstr "Adresa IPv4 de la distanță" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Adresa IPv4 la distanță sau FQDN" @@ -6789,15 +7690,23 @@ msgstr "Adresa IPv6 la distanță" msgid "Remote IPv6 address or FQDN" msgstr "Adresa IPv6 la distanță sau FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Eliminați" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "Eliminați adresele IPv4 din rezultate și returnați numai adrese IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "Eliminați adresele IPv6 din rezultate și returnați numai adrese IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "Îndepărtarea din configurație a setărilor dispozitivelor aferente" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Înlocuiți configurația wireless" @@ -6827,7 +7736,8 @@ msgstr "Solicită suma de control de intrare (opțional)." msgid "Require incoming packets serialization (optional)." msgstr "Solicită serializarea pachetelor primite (opțional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Necesar" @@ -6848,7 +7758,7 @@ msgstr "" "Este necesar. Calea către fișierul de configurare .yml pentru această " "interfață." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "Este necesar. Cheia publică a omologului WireGuard." @@ -6861,67 +7771,75 @@ msgid "Required. XFRM interface ID to be used for SA." msgstr "" "Este necesar. ID-ul interfeței XFRM care urmează să fie utilizat pentru SA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" +"Este necesar: Respinge autentificarea dacă serverul RADIUS nu furnizează " +"atributele VLAN corespunzătoare." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Necesită hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Necesită hostapd cu suport EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Necesită hostapd cu suport EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Necesită hostapd cu suport OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Necesită hostapd cu suport SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Necesită hostapd cu suport WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Necesită wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Necesită wpa-supplicant cu suport EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Necesită wpa-supplicant cu suport EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Necesită wpa-supplicant cu suport OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Necesită wpa-supplicant cu suport SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Necesită wpa-supplicant cu suport WEP" @@ -6930,7 +7848,7 @@ msgid "Reselection policy for primary slave" msgstr "Politica de realegere pentru secundara principală" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6945,20 +7863,24 @@ msgstr "Resetați Contoarele" msgid "Reset to defaults" msgstr "Resetați la valorile implicite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Fișierele de rezolvare și host-uri DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Fișierul de rezolvare" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Lista domeniilor care trebuie forțate la o adresă IP." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Resursa nu a fost găsită" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Reporniți" @@ -6967,7 +7889,7 @@ msgstr "Reporniți" msgid "Restart Firewall" msgstr "Reporniți Firewall-ul" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Reporniți interfața radio" @@ -6979,7 +7901,7 @@ msgstr "Restaurează" msgid "Restore backup" msgstr "Restaurați o copie de rezervă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -6987,82 +7909,97 @@ msgstr "" "Returnează răspunsuri la interogările DNS care corespund subrețelei din care " "a fost primită interogarea, dacă sunt disponibile mai multe IP-uri." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Arată / ascunde parola" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "Filtru de cale inversă" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Reveniți" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Restabilește la schimbările anterioare" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "Cererea de revenire a eșuat cu statusul %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Refacerea configurației…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "Revizuire" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "Rescrieți destinația în %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "Rescrieți destinația în %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Rescrieți destinația în %h, portul %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Rescrieți destinația în %h, portul %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "Rescrieți sursa în %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "Rescrieți sursa în %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "Rescrieți sursa în %h, portul %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "Rescrieți sursa în %h, portul %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "Rescriere la adresa dispozitivului de ieșire" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" +"Rețeaua de securitate robustă (RSN): Permiteți pre-autentificarea în roaming " +"pentru rețelele WPA2-EAP (și anunțați-o în balizele WLAN). Funcționează " +"numai dacă interfața de rețea specificată este o punte. Scurtează procesul " +"de reasociere, care necesită timp." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Robustețe" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -7080,19 +8017,19 @@ msgstr "Root preparare" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Politica Round-Robin (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Rutarea IP-urilor permise" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "Lanțul de acțiuni de rută \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Tipul de rută" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7112,6 +8049,10 @@ msgstr "Parola routerului" msgid "Routing" msgstr "Rutarea" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Algoritm de rutare" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7126,24 +8067,24 @@ msgstr "" msgid "Rule" msgstr "Regula" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "Acțiunile de regulii" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "Comentariul regulii: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "Regulă container legătură\"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "Regula se potrivește" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Tipul de regulă" @@ -7165,11 +8106,24 @@ msgstr "Eroare de execuție" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "SIMs" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7187,15 +8141,15 @@ msgstr "Portul serverului SSH" msgid "SSH username" msgstr "Nume de utilizator SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "Chei SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7212,7 +8166,7 @@ msgstr "Serverul SSTP" msgid "SWAP" msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7223,7 +8177,7 @@ msgid "Save" msgstr "Salvați" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Salvați și aplicați" @@ -7240,7 +8194,7 @@ msgstr "Salvați mtdblock" msgid "Save mtdblock contents" msgstr "Salvați conținutul mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Scanați" @@ -7249,11 +8203,16 @@ msgstr "Scanați" msgid "Scheduled Tasks" msgstr "Operațiuni programate" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "Secțiunea %s este goală." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Secțiune adăugată" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Secțiune eliminată" @@ -7271,9 +8230,9 @@ msgstr "" "verificarea formatului imaginii nu reușește. Utilizați numai dacă sunteți " "sigur că firmware-ul este corect și destinat dispozitivului dvs.!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Selectează fișier…" @@ -7283,7 +8242,7 @@ msgstr "" "Selectează politica de hașurare a transmiterii care urmează să fie utilizată " "pentru selectarea secundarelor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7291,7 +8250,7 @@ msgstr "" "Trimite mesaje RA care anunță acest dispozitiv ca router IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "Trimiteți redirecționări ICMP" @@ -7312,11 +8271,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "Trimiteți numele de gazdă al acestui dispozitiv" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Serverul" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Adresa serverului" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Nume server" @@ -7341,18 +8304,22 @@ msgstr "Sesiunea a expirat" msgid "Set Static" msgstr "Setați Static" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "Setați câmpul de antet %s la %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" "Setați interfața ca secundară externă NDP-Proxy. Valoarea implicită este " "dezactivată." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7365,7 +8332,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "Setați aceeași adresă MAC pentru toți secundarii" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7376,7 +8343,7 @@ msgstr "" "Advertisement\">RA trimise. Atunci când este activat, clienții vor " "efectua autoconfigurarea adreselor IPv6 fără stare." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7392,11 +8359,15 @@ msgstr "Setat la secundara activă în prezent (activ, 1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "Setați la primul secundar adăugat la legătură (urmați, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Setați serverul DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Configurarea rutelor pentru vecinii IPv6 proxi." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7404,33 +8375,39 @@ msgid "Setting PLMN failed" msgstr "Setarea PLMN a eșuat" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "A eșuat setarea modului de funcționare" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Setări" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "Configurarea rutelor pentru vecinii IPv6 proxi." - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "Secunde cu erori grave (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" +msgstr "" +"Setări pentru asistarea clienților wireless în roaming între mai multe AP-" +"uri: 802.11r, 802.11k și 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "IG scurt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Expunere Scurtă" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Afișați lista curentă de fișiere de rezervă" @@ -7443,16 +8420,16 @@ msgstr "Afișați legăturile goale" msgid "Show raw counters" msgstr "Afișați contoare brute" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Închideți această interfață" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7460,15 +8437,15 @@ msgstr "Închideți această interfață" msgid "Signal" msgstr "Semnal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Semnal / Zgomot" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Atenuarea semnalului (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Calitatea semnalului" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Rata de reîmprospătare a semnalului" @@ -7476,12 +8453,12 @@ msgstr "Rata de reîmprospătare a semnalului" msgid "Signal:" msgstr "Semnal:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Mărime" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Dimensiunea cache-ului de interogare DNS" @@ -7498,12 +8475,12 @@ msgstr "Sari" msgid "Skip from backup files that are equal to those in /rom" msgstr "Omiteți din fișierele de rezervă care sunt egale cu cele din /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Sari la conținut" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Sari la navigare" @@ -7521,14 +8498,10 @@ msgstr "VLAN software" msgid "Some fields are invalid, cannot save values!" msgstr "Unele câmpuri sunt invalide, nu se pot salva valorile!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Ne pare rău, obiectul pe care l-ați solicitat nu a fost găsit." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Ne pare rău, serverul a întâmpinat o eroare neașteptată." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7539,8 +8512,8 @@ msgstr "" "trebuie să fie actualizată manual. Vă rugăm să consultați wiki pentru " "instrucțiuni de instalare specifice dispozitivului." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7567,7 +8540,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "Portul sursă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7575,7 +8548,7 @@ msgstr "" "Opțiuni speciale de pornire PXE pentru Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7584,7 +8557,7 @@ msgstr "" "DHCPv6. Dacă nu este specificat, se va anunța domeniul de căutare DNS al " "dispozitivului local." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7595,7 +8568,7 @@ msgstr "" "server DNS IPv6, cu excepția cazului în care opțiunea Server DNS IPv6 " "local este dezactivată." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7627,7 +8600,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "Specifică frecvența de monitorizare a legăturii MII în milisecunde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "Specifică valoarea TOS pentru a se potrivi în antetele IP" @@ -7635,7 +8608,7 @@ msgstr "Specifică valoarea TOS pentru a se potrivi în antetele IP" msgid "Specifies the aggregation selection logic to use" msgstr "Specifică logica de selecție a agregării care trebuie utilizată" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" "Specifică sub-rețeaua de destinație care trebuie să corespundă (notație CIDR)" @@ -7644,7 +8617,7 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "Specifică directorul la care este atașat dispozitivul" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7654,7 +8627,7 @@ msgstr "" "Advertisement\">RA
    , de exemplu pentru a instrui clienții să solicite " "informații suplimentare prin DHCPv6 cu stare." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" @@ -7663,7 +8636,7 @@ msgstr "" "exemplu, 0xFF pentru a se potrivi cu marca 255 sau 0x0/0x1 pentru a se " "potrivi cu orice valoare pară a mărcii" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "Specifică numele interfeței logice de intrare" @@ -7700,7 +8673,7 @@ msgstr "" "Specifică numărul maxim de cereri ARP eșuate până când se presupune că " "gazdele sunt moarte" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7724,7 +8697,7 @@ msgstr "" "Specifică modul care urmează să fie utilizat pentru această interfață de " "bonding" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7768,15 +8741,15 @@ msgstr "" "Specifică numărul de secunde dintre instanțele în care driverul de bonding " "trimite pachete de învățare către fiecare comutator pereche de secundare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "Specifică ordonarea regulilor IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "Specifică numele interfeței logice de ieșire" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7804,19 +8777,19 @@ msgstr "" "Specifică politica de reselecție pentru secundara principală atunci când are " "loc o defecțiune a secundarei active sau o recuperare a secundarei principale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "Specifică metrica de rută care trebuie utilizată" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "Specifică tipul de rută care trebuie creat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "Specifică acțiunea de rutare țintă a regulii" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "Specifică sub-rețeaua sursă care trebuie să corespundă (notație CIDR)" @@ -7840,7 +8813,7 @@ msgstr "" "Specifică timpul în milisecunde care trebuie așteptat înainte de a activa o " "secundară după o detectare a recuperării legăturii" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7964,15 +8937,23 @@ msgstr "" "Specificați o unitate MTU (Maximum Transmission Unit) diferită de cea " "implicită (1280 octeți)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Specificați aici cheia secretă de criptare." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "ADSL fără splitter (G.992.2) Anexă A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "Timpul de expirare a memoriei cache a vecinilor învechite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Porniți" @@ -7985,16 +8966,16 @@ msgstr "Porniți WPS" msgid "Start priority" msgstr "Prioritatea de pornire" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Porniți reîmprospătarea" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Se aplică configurația de pornire…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Se pornește scanarea wireless..." @@ -8003,6 +8984,10 @@ msgstr "Se pornește scanarea wireless..." msgid "Startup" msgstr "Pornire" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Stat" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Rute statice IPv4" @@ -8016,7 +9001,7 @@ msgstr "Rute statice IPv6" msgid "Static Lease" msgstr "Închiriere statică" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Închirieri Statice" @@ -8026,7 +9011,7 @@ msgstr "Închirieri Statice" msgid "Static address" msgstr "Adresă statică" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -8037,28 +9022,28 @@ msgstr "" "configurațiile de interfață non-dinamică în care sunt servite doar gazdele " "cu un contract de închiriere corespunzător." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Limita de inactivitate a stației" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Stare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" -msgstr "Opriți" +msgstr "Stop" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:135 msgid "Stop WPS" msgstr "Opriți WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Opriți reîmprospătarea" @@ -8066,11 +9051,11 @@ msgstr "Opriți reîmprospătarea" msgid "Storage" msgstr "Stocare" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "Filtrare strictă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Ordine strictă" @@ -8079,15 +9064,15 @@ msgid "Strong" msgstr "Puternică" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Trimiteți" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Suprimați înregistrarea in jurnal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" "Suprimați înregistrarea în jurnal a operațiunii de rutină pentru protocolul " @@ -8122,7 +9107,7 @@ msgstr "Comutator VLAN" msgid "Switch port" msgstr "Port de comutare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Schimbă protocolul" @@ -8132,7 +9117,7 @@ msgstr "Schimbă protocolul" msgid "Switch to CIDR list notation" msgstr "Treceți la notarea listei CIDR" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Legătură simbolică" @@ -8144,8 +9129,16 @@ msgstr "Sincronizați cu serverul NTP" msgid "Sync with browser" msgstr "Sincronizați cu browserul" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Sintaxa: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Sintaxa: _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -8169,9 +9162,9 @@ msgstr "Proprietăți sistem" msgid "System log buffer size" msgstr "Dimensiunea tamponului de jurnal de sistem" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "Sistemul rulează în modul de recuperare (initramfs)." @@ -8200,7 +9193,7 @@ msgstr "Portul sursă TCP" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Rădăcina serverului TFTP" @@ -8213,26 +9206,37 @@ msgstr "TX" msgid "TX Rate" msgstr "Rată de transmise" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "Lungimea cozii TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tabelul" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Etichetat" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Țintă" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "Platformă țintă" @@ -8248,7 +9252,7 @@ msgstr "Spațiu temporar" msgid "Terminate" msgstr "Terminați" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8258,7 +9262,7 @@ msgstr "" "în mesajele RA. " "Valoarea minimă este de 1280 octeți." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." @@ -8266,7 +9270,7 @@ msgstr "" "Indicatorul Configurare Gestionată a adreselor (G) indică faptul că " "adresele IPv6 sunt disponibile prin DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -8274,7 +9278,7 @@ msgstr "" "Indicatorul Agent de Casă Mobil (C) indică faptul că dispozitivul " "acționează și ca agent de casă Mobil IPv6 pe această legătură." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8294,7 +9298,11 @@ msgstr "" "Pachetul qrencode este necesar pentru a genera o imagine QR code a " "configurației." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8311,18 +9319,24 @@ msgstr "" "trebuie să folosiți numele de utilizator simplu în loc de ID-ul de " "utilizator!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "Adresa IP %h este deja folosită de o altă închiriere statică" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "Adresa IP se află în afara oricărui interval de adrese de grup DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "Adresa IP a serverului de pornire" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -8332,6 +9346,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -8352,6 +9367,12 @@ msgstr "" "Adresa IPv6 sau numele de domeniu complet calificat al capătului de tunel la " "distanță." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8363,7 +9384,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "LED-ul clipește cu frecvența de pornire/oprire configurată" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "LED-ul clipește pentru a simula bătăile reale ale inimii." @@ -8381,7 +9402,7 @@ msgstr "LED-ul se află întotdeauna în starea implicită oprit." msgid "The LED is always in default state on." msgstr "LED-ul se află întotdeauna în starea implicită pornit." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" @@ -8389,16 +9410,20 @@ msgstr "" "Adresa MAC %h este deja utilizată de un alt contract de închiriere statică " "din același grup DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" "MTU nu trebuie să depășească MTU-ul dispozitivului părinte de %d octeți" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "ID-ul VLAN trebuie să fie unic" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "Algoritmul care este utilizat pentru a descoperi rutele de rețea" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8411,7 +9436,7 @@ msgid "The configuration file could not be loaded due to the following error:" msgstr "" "Fișierul de configurare nu a putut fi încărcat din cauza următoarei erori:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8419,7 +9444,7 @@ msgstr "" "SSID-ul corect trebuie specificat manual atunci când vă alăturați unei " "rețele fără fir ascunse" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8446,12 +9471,12 @@ msgstr "" "Fișierul de dispozitiv al memoriei sau partiției (de exemplu /dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "Numele dispozitivului \"%s\" este deja luat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." @@ -8459,7 +9484,7 @@ msgstr "" "Configurația de rețea existentă trebuie modificată pentru ca LuCI să " "funcționeze corect." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8482,7 +9507,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Următoarele reguli sunt în prezent active pe acest sistem." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" "Frecvența este direct proporțională cu sarcina medie de 1 minut a " @@ -8492,19 +9517,19 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "Adresa porții de acces nu trebuie să fie o adresă IP locală" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" "Configurația generată poate fi importată într-o aplicație client WireGuard " "pentru a stabili o conexiune cu acest dispozitiv." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "Cheia publică SSH dată a fost deja adăugată." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8512,15 +9537,36 @@ msgstr "" "Cheia publică SSH furnizată nu este valabilă. Vă rugăm să furnizați chei " "publice RSA sau ECDSA corespunzătoare." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"Reglajul de penalizare a salturilor permite modificarea preferinței lui " +"batman-adv pentru rutele cu mai multe salturi față de rutele scurte. " +"Valoarea se aplică la TQ al fiecărui OGM transmis, propagând astfel costul " +"unui salt suplimentar (pachetul trebuie să fie primit și retransmis, ceea ce " +"costă timp de emisie)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "Numele de gazdă al serverului de boot-are" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "Interfața nu a putut fi găsită" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Numele interfeței este deja folosit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Numele interfeței este prea lung" @@ -8544,6 +9590,7 @@ msgstr "Adresa IPv4 locală" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "Adresa IPv4 locală pe care se creează tunelul (opțional)." @@ -8558,7 +9605,7 @@ msgstr "Masca de rețea IPv4 locală" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "Adresa IPv6 locală pe care se creează tunelul (opțional)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8573,7 +9620,7 @@ msgstr "" "a rețelei. O valoare redusă are ca rezultat reducerea timpului de detectare " "a pierderii ultimului membru al unui grup" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8586,7 +9633,7 @@ msgstr "" "traficul mai puțin exploziv, deoarece răspunsurile gazdelor sunt distribuite " "pe un interval mai mare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8594,7 +9641,7 @@ msgstr "" "Numărul maxim de salturi care urmează să fie publicate în mesajele RA. Maximul este de 255 de salturi." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." @@ -8602,7 +9649,7 @@ msgstr "" "Accesul în rețea la acest dispozitiv ar putea fi întrerupt prin modificarea " "setărilor interfeței \"%h\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Numele rețelei este deja folosit" @@ -8623,7 +9670,7 @@ msgstr "" "conexiune la o rețea mai mare, cum ar fi internetul, și alte porturi pentru " "o rețea locală." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " @@ -8633,7 +9680,7 @@ msgstr "" "conecteze omologul. Aceasta este de obicei o adresă IP publică statică, un " "nume de gazdă statică sau un domeniu DDNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" "Intervalul de răspuns la interogare trebuie să fie mai mic decât valoarea " @@ -8648,7 +9695,7 @@ msgstr "Comanda de repornire a eșuat cu codul %d" msgid "The restore command failed with code %d" msgstr "Comanda de restaurare a eșuat cu codul %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8659,15 +9706,15 @@ msgstr "" "pierderi, valoarea robusteții poate fi mărită. IGMP este robust la " "(Robustness-1) pierderi de pachete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" "Ținta regulii este un salt către o altă regulă specificată prin valoarea " "priorității sale" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8678,11 +9725,11 @@ msgstr "" "rt_tables. Aliasurile speciale locale (255), principale (254) și implicite " "(253) sunt, de asemenea, valabile" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "Modul %s selectat este incompatibil cu criptarea %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "Tokenul de securitate trimis este nevalid sau a expirat deja!" @@ -8723,6 +9770,14 @@ msgstr "Parola sistemului a fost schimbată cu succes." msgid "The sysupgrade command failed with code %d" msgstr "Comanda sysupgrade a eșuat cu codul %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8749,12 +9804,20 @@ msgstr "" "Fișierul de imagine încărcat nu conține un format acceptat. Asigurați-vă că " "ați ales formatul de imagine generic pentru platforma dvs." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "Valoarea este suprascrisă de configurare. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "Valoarea este suprascrisă de configurare." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" +"Valoarea specifică intervalul (milisecunde) în care batman-adv inundă " +"rețeaua cu informațiile sale de protocol." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8763,19 +9826,20 @@ msgstr "" "regulilor iptables și nftables este descurajată și poate duce la o filtrare " "incompletă a traficului." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Nu există închirieri active" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Nu există modificări de aplicat" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8788,16 +9852,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "Această adresă IPv4 a releului" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Acest tip de autentificare nu se aplică la metoda EAP selectată." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Acesta nu pare a fi un fișier PEM valid" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8816,6 +9880,24 @@ msgstr "" "Aceasta este fie \"Cheia de actualizare\" configurată pentru tunel, fie " "parola contului, dacă nu a fost configurată nicio cheie de actualizare" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Acesta este dispozitivul batman-adv la care doriți să conectați dispozitivul " +"fizic de mai sus. Dacă această listă este goală, atunci trebuie să creați " +"mai întâi una. Dacă doriți să direcționați traficul mesh peste un dispozitiv " +"de rețea cu fir, atunci selectați-l din selectorul Dispozitiv de mai sus. " +"Dacă doriți să atribuiți interfața batman-adv la o rețea Wi-fi mesh, atunci " +"nu selectați un Dispozitiv în selectorul de Dispozitive, ci mai degrabă " +"mergeți la setări Wireless și selectați de acolo această interfață ca rețea." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8832,7 +9914,7 @@ msgstr "" "Aceasta este adresa locală a punctului final atribuită de către brokerul de " "tunel, de obicei se termină cu ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "Acesta este singurul server DHCP din rețeaua locală." @@ -8867,8 +9949,8 @@ msgstr "" "Această listă oferă o imagine de ansamblu asupra proceselor de sistem care " "rulează în prezent și starea acestora." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8885,33 +9967,41 @@ msgstr "Această secțiune nu conține încă nicio valoare" msgid "Time Synchronization" msgstr "Sincronizarea Timpului" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Avertisment timp" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "Timp în milisecunde" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "Timp în secunde pentru a petrece în stări de ascultare și învățare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Intervalul de timp pentru reintroducerea cheii GTK" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Fus orar" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "Expirat" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "Expirare în secunde" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" "Timeout în secunde pentru adresele MAC învățate în baza de date de " "redirecționare" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" "Timeout în secunde până la actualizarea topologiei în cazul pierderii " @@ -8921,7 +10011,7 @@ msgstr "" msgid "Timezone" msgstr "Fusul orar" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the în schimb importarea configurației." -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Mergeți la autentificare…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8946,7 +10032,7 @@ msgstr "" "rezervă generată anterior. Pentru a reseta firmware-ul la starea inițială, " "faceți clic pe „Efectuați resetarea” (posibil numai cu imaginile squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Tonalitate" @@ -8954,12 +10040,16 @@ msgstr "Tonalitate" msgid "Total Available" msgstr "Total disponibil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Urmărire traseu" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "Codul zonei de localizare" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8971,11 +10061,11 @@ msgstr "Trafic" msgid "Traffic Class" msgstr "Clasa de trafic" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "Filtrare trafic legătură \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "Traficul potrivit cu regula: %.1000mPackets, %.1024mBytes" @@ -8992,6 +10082,26 @@ msgstr "Se transmite" msgid "Transmit Hash Policy" msgstr "Politica de transmitere a hașurilor" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Date transmise" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -9030,7 +10140,7 @@ msgstr "Interfață de tunel" msgid "Tunnel Link" msgstr "Tunel de legătură" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Dispozitiv de tunel" @@ -9039,13 +10149,13 @@ msgid "Tx-Power" msgstr "Puterea transmisiei" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Tip" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Tipul serviciului" @@ -9094,7 +10204,7 @@ msgstr "Nu se poate determina adresa IP externă" msgid "Unable to determine upstream interface" msgstr "Nu se poate determina interfața în flux ascendent" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Imposibilitatea de a expedia" @@ -9145,19 +10255,31 @@ msgstr "Nu se poate reporni firewall-ul: %s" msgid "Unable to save contents: %s" msgstr "Nu se poate salva conținutul: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Secunde indisponibile (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "Nu se poate verifica PIN-ul" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Neconfigurați" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Format neașteptat al datelor de răspuns" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -9175,7 +10297,7 @@ msgstr "" msgid "Unknown" msgstr "Necunoscut" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Metodă de conectare necunoscută și neacceptată." @@ -9199,11 +10321,11 @@ msgstr "Neadministrate" msgid "Unmount" msgstr "Demontează" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Cheie fără nume" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Modificări nesalvate" @@ -9217,15 +10339,25 @@ msgid "Unsupported MAP type" msgstr "Tip MAP neacceptat" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Modem neacceptat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Protocol neacceptat" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Tipul de protocol nesuportat." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Neetichetat" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "Fără titlu omolog" @@ -9237,7 +10369,7 @@ msgstr "Sus" msgid "Up Delay" msgstr "Până la întârziere" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Încărcați" @@ -9254,25 +10386,29 @@ msgstr "" msgid "Upload archive..." msgstr "Încărcați arhiva..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Încărcați fișierul" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Încărcați fișierul…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "Încărcarea a fost anulată" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Solicitarea de încărcare a eșuat: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Se încarcă fișierul…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9282,7 +10418,7 @@ msgstr "" "se va atribui un nume de forma wifinet#, iar rețeaua va fi " "repornită pentru a aplica configurația actualizată." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -9291,7 +10427,7 @@ msgstr "" "actualizată, iar rețeaua va fi repornită pentru a aplica configurația " "actualizată." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -9299,20 +10435,24 @@ msgstr "" "La apăsarea \"Continuați\", opțiunile ifname vor fi redenumite și rețeaua va " "fi repornită pentru a aplica configurația actualizată." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "Rezolutorii din upstream vor fi interogați în ordinea din fișierul resolv." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Timp de funcționare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Folosește /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Utilizați DHCP" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Utilizați serverele DHCP anunțate" @@ -9321,13 +10461,18 @@ msgstr "Utilizați serverele DHCP anunțate" msgid "Use DHCP gateway" msgstr "Utilizați poarta de acces a DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Utilizați DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Utilizați serverele DNS anunțate de către partenerul de rețea" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Folosește codurile de țară ISO/IEC 3166 alpha2." @@ -9375,22 +10520,25 @@ msgstr "Utilizați ca sistem de fișiere rădăcină (/)" msgid "Use broadcast flag" msgstr "Utilizați indicatorul de difuzare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Utilizați managementul IPv6 încorporat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Utilizați servere DNS personalizate" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Utilizați poarta de acces implicită" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Utilizați metrica porții de acces" @@ -9416,15 +10564,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "Utilizați aceeași sursă și destinație pentru fiecare conexiune" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Utilizați certificatele de sistem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "Utilizați certificate de sistem pentru tunelul interior" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9455,11 +10603,11 @@ msgstr "" msgid "Used" msgstr "Folosit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Slot de cheie folosit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9467,59 +10615,61 @@ msgstr "" "Se utilizează în două scopuri diferite: RADIUS NAS ID și 802.11r R0KH-ID. Nu " "este necesar cu WPA(2)-PSK normal." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Grup de utilizatori" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Certificat de utilizator (codificat PEM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "Identificatorul utilizatorului" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Cheie utilizator (codare PEM)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Nume Utilizator" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "Utilizați tabelul de flux %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux (Multiplexarea circuitelor virtuale)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (Agregator virtual de porturi Ethernet)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "ID VLAN" @@ -9539,24 +10689,27 @@ msgstr "Adresă locală VPN" msgid "VPN Local port" msgstr "Port local VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "Protocol VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Server VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "Hash SHA256 al certificatului serverului VPN" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Portul serverului VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "Certificatul serverului VPN hash SHA1" @@ -9565,6 +10718,10 @@ msgstr "Certificatul serverului VPN hash SHA1" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (și altele) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9578,7 +10735,7 @@ msgstr "Identificatorul rețelei VXLAN" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9586,8 +10743,8 @@ msgstr "" "Validează răspunsurile DNS și stochează datele DNSSEC în memoria cache; este " "necesar ca în amonte să fie acceptat DNSSEC." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9615,7 +10772,7 @@ msgstr "Furnizor" msgid "Vendor Class to send when requesting DHCP" msgstr "Clasa furnizorului care trebuie trimisă la solicitarea DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" "Verificați dacă răspunsurile din domenii nesemnate provin într-adevăr din " @@ -9625,12 +10782,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Se verifică fișierul imagine încărcat." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Foarte mare" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Ethernet virtual" @@ -9638,34 +10795,46 @@ msgstr "Ethernet virtual" msgid "Virtual dynamic interface" msgstr "Interfață dinamică virtuală" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "Sistem deschis WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Cheie partajată WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Parola WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "Roaming WLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Mod WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "Modul de repaus WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "Remedieri ale modului de repaus WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Fraza de acces WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9695,7 +10864,17 @@ msgstr "" msgid "Weak" msgstr "Slabă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Greutate" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." @@ -9704,7 +10883,26 @@ msgstr "" "cu o valoare de preferință mai mare sunt luate în considerare mai întâi la " "alocarea subrețelelor." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Atunci când este activată, codificarea rețelei crește debitul WiFi prin " +"combinarea mai multor cadre într-un singur cadru, reducând astfel timpul de " +"emisie necesar." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Atunci când este activat, tabelul ARP distribuit formează o memorie cache " +"ARP la nivel de plasă care ajută clienții care nu fac parte din plasă să " +"primească răspunsuri ARP mult mai fiabile și fără întârzieri prea mari." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" @@ -9712,7 +10910,34 @@ msgstr "" "Atunci când este activată, gateway-ul este pe legătură chiar dacă gateway-ul " "nu se potrivește cu niciun prefix de interfață" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Atunci când este activată, se adaugă noi intrări în tabela ARP din cererile " +"sau răspunsurile gratuite APR primite, în caz contrar, se actualizează numai " +"intrările preexistente din tabel, dar nu sunt învățate noi gazde." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Atunci când este inversat, LED-ul este aprins continuu și pâlpâie, în loc să " +"fie oprit în mod implicit și să clipească la activitatea sistemului." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Atunci când se execută mesh-ul pe mai multe interfețe WiFi pe nod, batman-" +"adv este capabil să optimizeze fluxul de trafic pentru a obține performanțe " +"maxime." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9722,7 +10947,7 @@ msgstr "" "este activată, opțiunile de cheie R0/R1 de mai jos nu se aplică. Dezactivați " "acest lucru pentru a utiliza opțiunile de cheie R0 și R1." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9730,7 +10955,7 @@ msgstr "" "În cazul în care modul Wi-Fi Multimedia (WMM) QoS este dezactivat, clienții " "pot fi limitați la ratele 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9739,16 +10964,25 @@ msgstr "" "să se deplaseze, iar eficiența timpului de antenă să fie redusă semnificativ." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Lățime" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Starea WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "VPN WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "Partenerul WireGuard este dezactivat" @@ -9764,21 +10998,21 @@ msgid "Wireless Adapter" msgstr "Adaptor wireless" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Rețea wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Sumarul wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Securitate wireless" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Migrarea configurației wireless" @@ -9792,17 +11026,17 @@ msgstr "Wireless-ul este dezactivat" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:152 msgid "Wireless is not associated" -msgstr "Wireless-ul este ne-asociat" +msgstr "Wireless-ul este neasociat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Rețeaua wireless este dezactivată" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Rețeaua wireless este activată" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Scrieți interogările DNS primite in syslog." @@ -9814,7 +11048,7 @@ msgstr "Scrieți jurnalul de sistem într-un fișier" msgid "XOR policy (balance-xor, 2)" msgstr "Politica XOR (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9843,8 +11077,21 @@ msgstr "" "dezactivați scripturi init esențiale, cum ar fi \"network\", dispozitivul " "dvs. ar putea deveni inaccesibil!
    " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Puteți adăuga mai multe înregistrări pentru aceeași țintă." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Puteți adăuga mai multe înregistrări pentru același domeniu." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" +"Puteți adăuga mai multe relee unice Relay To pe aceeași adresă de ascultare." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9879,34 +11126,56 @@ msgstr "Setări ZRam" msgid "ZRam Size" msgstr "Dimensiunea ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Notă: în timp ce " +"_http este posibil, niciun browser nu suportă înregistrările SRV.)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "oricare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automat" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automat (dezactivat)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "automat (activat)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "bazăT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "cu punte" @@ -9963,25 +11232,30 @@ msgctxt "nft unit" msgid "day" msgstr "zi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "Dezactivat" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "dezactivat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "driver implicit" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "driver implicit (%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "de exemplu: --proxy 10.10.10.10" @@ -9990,14 +11264,23 @@ msgstr "de exemplu: --proxy 10.10.10.10" msgid "e.g: dump" msgstr "de exemplu: dump" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "activat" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "la fiecare %ds" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "a expirat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "forțat" @@ -10007,22 +11290,22 @@ msgstr "forțat" msgid "forward" msgstr "redirecționare" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "full-duplex (ambele direcții)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "half-duplex (o singură direcție)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "valoare codificată în hexazecimal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "ascuns" @@ -10031,9 +11314,9 @@ msgctxt "nft unit" msgid "hour" msgstr "ora" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "mod hibrid" @@ -10041,6 +11324,10 @@ msgstr "mod hibrid" msgid "ignore" msgstr "ignorați" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -10055,11 +11342,19 @@ msgstr "cheie între 8 și 63 de caractere" msgid "key with either 5 or 13 characters" msgstr "cheie cu 5 sau 13 caractere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "configurație gestionată (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "securitate medie" @@ -10068,11 +11363,11 @@ msgctxt "nft unit" msgid "minute" msgstr "minut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minute" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "agent pentru case mobile (H)" @@ -10084,18 +11379,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "nu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "fără legătură" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "fără suprascriere" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "valoare nevidă" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "niciunul" @@ -10106,20 +11409,20 @@ msgid "not present" msgstr "nu este prezent" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "oprit" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "cu privire la prefixul disponibil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "rețea deschisă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "altă configurație (O)" @@ -10128,6 +11431,10 @@ msgstr "altă configurație (O)" msgid "output" msgstr "ieșire" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "cu peste o zi în urmă" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -10145,23 +11452,35 @@ msgstr "valoare întreagă pozitivă" msgid "random" msgstr "aleatoriu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "generate aleatoriu" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" +"reduce cheltuielile generale prin colectarea și agregarea mesajelor " +"inițiatorului într-un singur pachet, mai degrabă decât în mai multe pachete " +"mici" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "mod releu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "rutat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "secundă" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "mod server" @@ -10169,7 +11488,7 @@ msgstr "mod server" msgid "sstpc Log-level" msgstr "sstpc Nivel de jurnal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "securitate puternică" @@ -10177,7 +11496,7 @@ msgstr "securitate puternică" msgid "tagged" msgstr "etichetat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "unități de timp (TUs / 1.024 ms) [1000-65535]" @@ -10191,25 +11510,27 @@ msgstr "" "HTTPS acces la " "rețea." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "valoare unică" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "necunoscut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "versiune necunoscută" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "nelimitat" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -10231,8 +11552,8 @@ msgid "untagged" msgstr "neetichetat" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "adresă IP validă" @@ -10245,7 +11566,7 @@ msgid "valid IPv4 CIDR" msgstr "IPv4 CIDR valid" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "adresă IPv4 validă" @@ -10274,7 +11595,7 @@ msgid "valid IPv6 CIDR" msgstr "IPv6 CIDR valid" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "adresă IPv6 validă" @@ -10311,8 +11632,8 @@ msgstr "identificator UCI valabil, nume de gazdă sau interval de adrese IP" msgid "valid address:port" msgstr "adresă validă:port" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "data valabilă (AAAA-LL-ZZ)" @@ -10352,11 +11673,23 @@ msgstr "valoare întreagă validă" msgid "valid multicast MAC address" msgstr "Adresă MAC multicast validă" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"nume de dispozitiv de rețea valabil între 1 și 15 caractere care nu conține " +"\":\", \"/\", \"%\" sau spații" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "nume valid al dispozitivului de rețea, nu \"..\" sau \"...\"" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" -msgstr "rețea validă în notație adresă/mască de rețea" +msgstr "adresă rețea validă/notație mască de rețea" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "cifră de telefon validă (0-9, \"*\", \"#\", \"!\" sau \".\")" @@ -10366,43 +11699,43 @@ msgid "valid port or port range (port1-port2)" msgstr "port sau interval de porturi valide (port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "valoarea validă a portului" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "timp valabil (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "valoare între %d și %d caractere" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "valoare cuprinsă între %f și %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "valoare mai mare sau egală cu %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "valoare mai mică sau egală cu %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "valoare cu %d caractere" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "valoare cu cel puțin %d caractere" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "valoare cu cel mult %d caractere" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "securitate slabă" diff --git a/package/luci/modules/luci-base/po/ru/base.po b/package/luci/modules/luci-base/po/ru/base.po index ac34ac5933..c312cadf68 100644 --- a/package/luci/modules/luci-base/po/ru/base.po +++ b/package/luci/modules/luci-base/po/ru/base.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: LuCI: base\n" "POT-Creation-Date: 2010-05-09 01:01+0300\n" -"PO-Revision-Date: 2022-11-25 14:34+0000\n" -"Last-Translator: AHOHNMYC \n" -"Language-Team: Russian \n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -12,27 +12,43 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.1\n" "Project-Info: Это технический перевод, не дословный. Главное-удобный русский " "интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "!known (не известно)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" таблица \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f дБ" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d бит" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d неверных полей" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d ч. назад" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d мин. назад" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d сек. назад" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s не тегирован в нескольких VLAN-ах!" @@ -57,10 +73,11 @@ msgstr "(пусто)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(нет связанных интерфейсов)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ еще %d" @@ -70,19 +87,19 @@ msgid "-- Additional Field --" msgstr "-- Дополнительно --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" -msgstr "-- Сделайте выбор --" +msgstr "-- Выберите --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- пользовательский --" @@ -101,14 +118,14 @@ msgstr "-- проверка по uuid --" #: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:44 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:23 msgid "-- please select --" -msgstr "-- сделайте выбор --" +msgstr "-- выберите --" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:55 msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = не использовать порог RSSI, 1 = не изменять значение драйвера по " @@ -123,7 +140,7 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Нагрузка за 1 минуту:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" @@ -131,6 +148,11 @@ msgstr[0] "1 флаг" msgstr[1] "%d флага" msgstr[2] "%d флагов" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12h (12 часов - по умолчанию)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "Нагрузка за 15 минут:" @@ -145,12 +167,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3h (3 часа)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4-символьный шестнадцатеричный ID" @@ -163,44 +190,105 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Нагрузка за 5 минут:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5m (5 минут)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" "6-октетный идентификатор в виде шестнадцатеричной строки - без двоеточий" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7d (7 дней)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: Включить отчет о маяках через радиоизмерения." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Включить отчет о соседях через радиоизмерения." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r Быстрый Роуминг" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: BSS Max Idle. Единицы измерения: секунды." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: Управление переходом Basic Service Set (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Объявление местного часового пояса в управляющих кадрах." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Proxy ARP позволяет не AP STA дольше находиться в режиме " +"энергосбережения." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Объявление времени в управляющих кадрах." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Режим сна (расширенный режим сна для станций) управления " +"беспроводной сетью (WNM)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Исправления режима сна управления беспроводной сетью (WNM): " +"предотвращает атаки переустановки." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w Association SA Query максимальное время ожидания" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11w время ожидания повтора Association SA Query" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "Защита кадров управления 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w максимальное время ожидания" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w время ожидания повтора" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-маска сети" @@ -212,32 +300,48 @@ msgstr "Настройка LED инд msgid "LED Name" msgstr "Имя LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-Proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA флаги" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" "Ограничение прыжков для RA " "сообщений" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "Время жизни RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "Служба RA" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ соответствует любому домену. /example.com/ " +"возвращает NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# возвращает NULL адреса (0.0.0.0 и " +"::) для example.com и его поддоменов." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -283,11 +387,23 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s не соответствует %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"Узел batman-adv может работать либо в режиме сервера (разделяя свое интернет-" +"соединение с mesh), либо в режиме клиента (поиск наиболее подходящего " +"интернет-соединения в mesh), либо с полностью отключенной поддержкой шлюза " +"(что является настройкой по умолчанию)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Конфигурация для устройства «%s» уже существует" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Директория с таким же именем уже существует." @@ -295,25 +411,90 @@ msgstr "Директория с таким же именем уже сущест msgid "A new login is required since the authentication session expired." msgstr "Необходима авторизация." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (все варианты) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (все варианты) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (все варианты) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (все варианты) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (все варианты) Annex B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (все варианты) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (все варианты) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annex L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -347,29 +528,40 @@ msgstr "Мониторинг ARP не поддерживается для выб msgid "ARP retry threshold" msgstr "Порог повтора ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "Таблица ARP трафика «%h»" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"ARP, IPv4 и IPv6 (даже 802.1Q) с многоадресными (multicast) MAC-адресами " +"назначения передаются одноадресно (unicast) на MAC-адрес STA. Примечание: " +"это не Directed Multicast Service (DMS) в 802.11v. Примечание: может " +"нарушить ожидаемые многоадресные рассылки приемника STA." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (режим асинхронной передачи)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM мосты" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM идентификатор виртуального канала (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM идентификатор виртуального пути (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -379,26 +571,22 @@ msgstr "" "как виртуальные сетевые интерфейсы Linux, которые могут использоваться " "совместно с DHCP или PPP для набора номера в сети провайдера." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM номер устройства" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C идентификатор производителя" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Отсутствующий интерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "Ограничение сервиса DNS, для подсетей интерфейса использующего DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Принимать локальные данные" @@ -407,7 +595,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Принять пакет" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Принимать пакеты с локальными адресами источника" @@ -415,18 +603,27 @@ msgstr "Принимать пакеты с локальными адресами msgid "Access Concentrator" msgstr "Концентратор доступа" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Точка доступа" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Изоляция точки доступа" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Технологии доступа" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Действия" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" -msgstr "Активный" +msgstr "Активно" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:81 msgid "Active Connections" @@ -462,8 +659,8 @@ msgstr "Активные IPv6 правила" msgid "Active-Backup policy (active-backup, 1)" msgstr "Политика активного резервирования (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -480,18 +677,18 @@ msgstr "Адаптивная балансировка нагрузки пере #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Добавить" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Добавить ATM мост" @@ -511,11 +708,11 @@ msgstr "Добавить действие LED" msgid "Add VLAN" msgstr "Добавить VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Добавление конфигурации устройства" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Добавить конфигурацию устройства…" @@ -523,19 +720,19 @@ msgstr "Добавить конфигурацию устройства…" msgid "Add instance" msgstr "Добавить экземпляр" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Добавить ключ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" "Добавить локальный суффикс домена для имен из файла hosts (/etc/hosts)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Добавить новый интерфейс..." @@ -543,6 +740,10 @@ msgstr "Добавить новый интерфейс..." msgid "Add peer" msgstr "Добавить узел (peer)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "Добавьте статические записи прямого и обратного DNS для этого узла." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Добавить в черный список" @@ -551,11 +752,11 @@ msgstr "Добавить в черный список" msgid "Add to Whitelist" msgstr "Добавить в белый список" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Дополнительный hosts файл" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Дополнительный файл серверов" @@ -572,7 +773,13 @@ msgstr "Дополнительный файл серверов" msgid "Address" msgstr "Адрес" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" +"Семейства адресов \"Сообщение из\" и \"Сообщение для адреса\" должны " +"совпадать." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Тип адреса" @@ -585,7 +792,7 @@ msgstr "Неверная настройка параметра Address" msgid "Address to access local relay bridge" msgstr "Адрес для доступа к локальному мосту-ретранслятору" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Адреса" @@ -594,29 +801,29 @@ msgstr "Адреса" msgid "Administration" msgstr "Администрирование" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" -msgstr "Дополнительные настройки" +msgstr "Расширенные настройки" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Дополнительные опции устройства" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Время устаревания" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Общая мощность передачи (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Агрегировать сообщения отправителей" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -654,18 +861,18 @@ msgstr "Псевдоним" msgid "Alias of \"%s\"" msgstr "Псевдоним интерфейса \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Все серверы" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" "Выделять IP-адреса последовательно, начинать с меньшего доступного адреса." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Выделять IP-адреса последовательно" @@ -675,13 +882,13 @@ msgstr "" "Разрешить SSH аутентификацию с помощью " "пароля" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" "Разрешить режиму AP отключение абонентов на основании низкого уровня " "подтверждения (Acknowledge) успешности получения TCP-сегментов" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Разрешить все, кроме перечисленных" @@ -689,15 +896,15 @@ msgstr "Разрешить все, кроме перечисленных" msgid "Allow full UCI access for legacy applications" msgstr "Предоставить полный доступ к UCI для устаревших приложений" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Разрешить стандарт 802.11b" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Разрешить только перечисленные" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Разрешить localhost" @@ -719,20 +926,25 @@ msgid "Allow system feature probing" msgstr "Разрешить опробование возможностей системы" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" "Разрешить пользователю root входить в систему с помощью пароля" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Разрешенные IP-адреса" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "Разрешенные сетевые технологии" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "Неверная настройка параметра AllowedIPs" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Всегда" @@ -744,13 +956,13 @@ msgstr "Всегда выключен (kernel: none)" msgid "Always on (kernel: default-on)" msgstr "Всегда включен (kernel: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "Всегда отправлять опции DHCP. Это требуется в некоторых случаях, например, " "для PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -758,10 +970,14 @@ msgstr "" "Использовать каналы 40 МГц, даже если вторичный канал перекрывается, вопреки " "стандарту IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "Количество отправляемых проб обнаружения дубликатов адресов (DAD)" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Количество секунд для ожидания готовности модема" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "При сохранении формы произошла ошибка:" @@ -770,72 +986,23 @@ msgstr "При сохранении формы произошла ошибка:" msgid "An optional, short description for this device" msgstr "Необязательное, краткое описание для этого устройства" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annex A + L + M (все)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Annex A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Annex A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Annex A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Annex A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Annex B (все)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Annex B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Annex B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Annex B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Annex J (все)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Annex L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Annex M (все)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Annex M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"Объявление префикса NAT64 в сообщениях RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Объявлять это устройство в качестве IPv6 DNS-сервера." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -843,7 +1010,7 @@ msgstr "" "Объявлять это устройство маршрутизатором по умолчанию, если существует " "локальный маршрут IPv6 по умолчанию." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -852,7 +1019,7 @@ msgstr "" "публичный префикс IPv6, независимо от наличия локального маршрута по " "умолчанию." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -860,15 +1027,15 @@ msgstr "" "Объявлять это устройство маршрутизатором по умолчанию независимо от наличия " "префикса или маршрута по умолчанию." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Объявить DNS домены" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Объявляемые DNS-серверы IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Анонимная идентификация" @@ -880,7 +1047,7 @@ msgstr "Неизвестный раздел" msgid "Anonymous Swap" msgstr "Неизвестный swap" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Любой пакет" @@ -892,11 +1059,11 @@ msgstr "Любой пакет" msgid "Any zone" msgstr "Любая зона" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "Применить опции DHCP к этой сети (пусто = все клиенты)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "Применить и сохранить настройки" @@ -904,39 +1071,43 @@ msgstr "Применить и сохранить настройки" msgid "Apply backup?" msgstr "Восстановить резервную копию?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Ошибка %h запроса на применение" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Применить без проверки" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "Применить с восстановлением при потере соединения" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Применение изменений... %d сек" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Архитектура" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Arp-скан" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Задайте часть данной длины, каждому публичному IPv6-префиксу этого интерфейса" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "Присвоить этой записи новые, произвольные теги." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -944,7 +1115,7 @@ msgstr "" "Назначьте префикс части, используя этот шестнадцатеричный ID вложенного " "исправления для этого интерфейса." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Подключенные клиенты" @@ -953,8 +1124,8 @@ msgstr "Подключенные клиенты" msgid "Associations" msgstr "Клиентов" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" @@ -962,8 +1133,8 @@ msgstr "" "Не менее %h за %h, барст %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -977,25 +1148,26 @@ msgstr "" "Пытаться включить сконфигурированные точки монтирования для подключенных " "устройств" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Группа аутентификации" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Аутентификация" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Тип аутентификации" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Основной" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Веб-интерфейс" @@ -1003,7 +1175,9 @@ msgstr "Веб-интерфейс" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1023,7 +1197,7 @@ msgstr "" "Автоматическая проверка файловой системы раздела на ошибки, перед " "монтированием" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1049,6 +1223,10 @@ msgstr "Hotplug раздела" msgid "Automount Swap" msgstr "Hotplug раздела подкачки" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Доступно" @@ -1067,11 +1245,15 @@ msgstr "Доступно" msgid "Average:" msgstr "Средняя:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Избегать мостовых петель" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1079,15 +1261,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "BSS переход" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Назад" @@ -1096,11 +1282,7 @@ msgstr "Назад" msgid "Back to Overview" msgstr "Назад к обзору" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Назад к настройкам" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "Вернуться к конфигурации узла" @@ -1113,16 +1295,15 @@ msgid "Backup / Flash Firmware" msgstr "Восстановление / Обновление" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Список файлов для резервного копирования" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Диапазон" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Базовое устройство" @@ -1130,12 +1311,43 @@ msgstr "Базовое устройство" msgid "Base64-encoded public key of this interface for sharing." msgstr "Открытый ключ этого интерфейса в кодировке Base64." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Устройство Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Интерфейс Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv имеет встроенную фрагментацию второго уровня для одноадресных " +"(unicast) данных, проходящих через mesh, что позволяет использовать batman-" +"adv через интерфейсы/соединения, которые не позволяют увеличить MTU сверх " +"стандартного размера пакета Ethernet в 1500 байт. Когда фрагментация " +"включена, batman-adv будет автоматически фрагментировать пакеты слишком " +"большого размера и дефрагментировать их на другом конце. По умолчанию " +"фрагментация включена, но неактивна, если пакет подходит, но можно полностью " +"отключить фрагментацию." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Интервал рассылки пакетов Beacon" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Отчет о маяках" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1149,7 +1361,7 @@ msgstr "" msgid "Bind NTP server" msgstr "Привязать NTP-сервер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "Привязывать динамически к интерфейсам, а не по шаблону адреса (рекомендуется " @@ -1160,18 +1372,34 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Открытый интерфейс" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" +"Привязка записей служб к доменному имени: определение местоположения служб." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"Привязка записей служб к доменному имени: определение местоположения служб. " +"См. RFC2782." + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1183,65 +1411,78 @@ msgstr "Открытый туннель для этого интерфейса ( msgid "Bitrate" msgstr "Битрейт" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Режим бондинга" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Политика объединения" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" +"Должны быть указаны оба адреса \"Сообщение из\" и \"Сообщение для адреса\"." + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Мост" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Мост (поддержка прямой связи между MAC VLAN'ми)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Фильтрация VLAN моста" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Мост" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "Специальные опции портов моста" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Порты моста" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "Таблица трафика моста «%h»" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Номер моста" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Активировать пустой мост" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Запустить при загрузке" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "Активировать интерфейс моста даже если в нём нет портов" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "Broadcast" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Широковещательная политика (broadcast, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Обзор…" @@ -1249,15 +1490,39 @@ msgstr "Обзор…" msgid "Buffered" msgstr "Буфер" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" +"CA сертификат (в PEM-кодировке; используется вместо общесистемного хранилища " +"для проверки сертификата шлюза)." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "CA сертификат; если отсутствует, будет сохранен после первого соединения." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "Ошибка конфигурации CLAT" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "CNAME" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME или fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (интерфейс с внешним управлением)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Использование ЦП (%)" @@ -1272,18 +1537,25 @@ msgstr "Кеш" msgid "Call failed" msgstr "Ошибка вызова" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"Может быть полезно, когда провайдер имеет IPv6 серверы имён, но не " +"предоставляет IPv6 маршрутизацию." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Отмена" @@ -1291,32 +1563,32 @@ msgstr "Отмена" msgid "Cannot parse configuration: %s" msgstr "Не удалось обработать конфигурацию: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "Перехватывать входящие пакеты, адресованные другим хостам" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "Перехватывать входящие пакеты до принятия решения о маршрутизации" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "Перехватывать входящие пакеты, маршрутизируемые на локальную систему" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "Перехватывать исходящие пакеты после принятия решения о маршрутизации" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "Перехватывать исходящие пакеты исходящие от локальной системы" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "Перехватывать пакеты сразу, как только сетевой адаптер их получит" @@ -1325,24 +1597,32 @@ msgstr "Перехватывать пакеты сразу, как только msgid "Category" msgstr "Категория" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "Cell ID" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "Cell Location" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Ограничение сертификата (Domain)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Ограничение сертификата (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Ограничение сертификата (Subject)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Ограничение сертификата (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1351,8 +1631,8 @@ msgstr "" ">См. вывод `logread -f` при рукопожатии (handshake) для получения актуальных " "значений" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1360,8 +1640,8 @@ msgstr "" "Ограничение(я) сертификата по значениям DNS SAN (если доступно)
    или " "Subject CN (точное совпадение)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1369,8 +1649,8 @@ msgstr "" "Ограничение(я) сертификата по значениям DNS SAN (если доступно)
    или " "Subject CN (совпадение суффикса)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1384,16 +1664,16 @@ msgstr "" msgid "Chain" msgstr "Цепочка" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "Хук цепочки ‎«%h»" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Изменения" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Изменения отменены." @@ -1404,18 +1684,19 @@ msgstr "Изменить пароль администратора для дос #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Канал" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Анализ каналов" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Ширина канала" @@ -1423,7 +1704,7 @@ msgstr "Ширина канала" msgid "Check filesystems before mount" msgstr "Проверка файловых систем перед монтированием" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" "Проверьте эту опцию, чтобы удалить существующие сети беспроводного " @@ -1442,8 +1723,8 @@ msgstr "Проверка образа…" msgid "Choose mtdblock" msgstr "Выберите MTD раздел" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1455,7 +1736,7 @@ msgstr "" "заполните поле 'создать', чтобы определить новую зону и прикрепить " "к ней этот интерфейс." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1464,7 +1745,7 @@ msgstr "" "беспроводной сети или заполните поле создать, чтобы создать новый " "интерфейс." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Алгоритм шифрования" @@ -1488,9 +1769,10 @@ msgstr "" "Нажмите \"Сохранить MTD раздел\", чтобы скачать образ выбранного MTD раздела " "(ВНИМАНИЕ: ТОЛЬКО ДЛЯ ОПЫТНЫХ ПОЛЬЗОВАТЕЛЕЙ)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Клиент" @@ -1499,9 +1781,9 @@ msgstr "Клиент" msgid "Client ID to send when requesting DHCP" msgstr "ID клиента при DHCP-запросе" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Закрыть" @@ -1518,20 +1800,20 @@ msgstr "" "Завершать неактивное соединение после заданного интервала (сек.), " "используйте значение 0 для удержания неактивного соединения" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Закрыть список..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Сбор данных..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "Наблюдаемые коллизии" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Команда" @@ -1542,13 +1824,13 @@ msgstr "Успешное выполнение" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:33 msgid "Command failed" -msgstr "Ошибка команды" +msgstr "Команда выполнена НЕ успешно" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:73 msgid "Comment" msgstr "Комментарий" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1571,29 +1853,28 @@ msgstr "Вычислять исходящую контрольную сумму msgid "Config File" msgstr "Конфигурационный файл" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Конфигурация" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "Экспорт конфигурации" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Конфигурация применена." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Конфигурация возвращена назад!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Ошибка конфигурации" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1611,7 +1892,7 @@ msgstr "" "устанавливается на 24 Мбит/с. Поддерживаемые скорости ниже минимальной " "базовой скорости не применяются." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." @@ -1619,7 +1900,7 @@ msgstr "" "Конфигурирует объявление маршрутизатора по умолчанию в сообщениях RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1627,16 +1908,16 @@ msgstr "" "Конфигурирует режим работы службы RA на данном интерфейсе." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "Конфигурирует режим работы службы DHCPv6 на этом интерфейсе." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "Конфигурирует режим работы службы NDP прокси на этом интерфейсе." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Настроить…" @@ -1648,9 +1929,10 @@ msgstr "Подтверждение отключения" msgid "Confirmation" msgstr "Подтверждение пароля" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Подключен" @@ -1660,11 +1942,11 @@ msgstr "Подключен" msgid "Connection attempt failed" msgstr "Ошибка попытки соединения" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "Ошибка попытки соединения." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "Конечный узел для подключения" @@ -1676,7 +1958,7 @@ msgstr "Подключение потеряно" msgid "Connections" msgstr "Соединения" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "Изменение подключения" @@ -1708,9 +1990,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Содержимое сохранено." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1721,16 +2003,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "Продолжить в %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "Продолжить вызывающую цепочку" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "Продолжать обработку несопоставленных пакетов" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1744,20 +2026,20 @@ msgstr "" msgid "Country" msgstr "Страна" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Код страны" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Плотность точек покрытия" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Создать / назначить зону межсетевого экрана" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Создать интерфейс" @@ -1769,7 +2051,7 @@ msgstr "Критическая ситуация" msgid "Cron Log Level" msgstr "Запись событий cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Текущая мощность" @@ -1811,31 +2093,31 @@ msgid "" msgstr "" "Настройка поведения светодиодной индикации устройства, если это возможно." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "DAD отправки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE-клиент" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE-порт" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAE-секрет" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "Опции DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP-сервер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP и DNS" @@ -1846,16 +2128,24 @@ msgstr "DHCP и DNS" msgid "DHCP client" msgstr "DHCP-клиент" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP настройки" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" +"DHCPv4 время аренды используется в качестве предельного и " +"предпочтительного времени жизни префикса IPv6." + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6 клиент" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6 сервис" @@ -1867,19 +2157,19 @@ msgstr "DHCPv6 сервис" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Перенаправление запросов DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNS порт запроса" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "Домены поиска DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "DNS порт сервера" @@ -1887,7 +2177,7 @@ msgstr "DNS по msgid "DNS setting is invalid" msgstr "Неверная настройка параметра DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "Вес DNS" @@ -1895,11 +2185,11 @@ msgstr "Вес DNS" msgid "DNS-Label / FQDN" msgstr "DNS-имя / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "DNSSEC проверка без знака" @@ -1911,39 +2201,47 @@ msgstr "DPD время простоя" msgid "DS-Lite AFTR address" msgstr "DS-Lite AFTR-адрес" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "Состояние DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "DSL линейный режим" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "Интервал DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Скорость передачи данных" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Полученные данные" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Переданные данные" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Отладка" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Маршрутизатор по умолчанию" @@ -1951,7 +2249,7 @@ msgstr "Маршрутизатор по умолчанию" msgid "Default state" msgstr "Начальное состояние" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1961,7 +2259,7 @@ msgstr "" "\"6,192.168.2.1,192.168.2.2\", чтобы известить клиентов о DNS-" "серверах." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" @@ -1969,7 +2267,7 @@ msgstr "" "Определяет соответствие внутреннего приоритета пакета Linux приоритету " "заголовка VLAN, но только для исходящих кадров" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" @@ -1977,49 +2275,50 @@ msgstr "" "Определяет соответствие приоритета заголовка VLAN внутреннему приоритету " "пакета Linux для входящих кадров" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "Определяет специальный MTU для этого маршрута" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "Делегировать IPv6 префиксы" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Удалить" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Удалить ключ" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Ошибка запроса на удаление: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Удалить эту сеть" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Интервал сообщений, регламентирующий доставку трафика" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Описание" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Отменить выбор" @@ -2027,11 +2326,11 @@ msgstr "Отменить выбор" msgid "Design" msgstr "Тема оформления" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "Назначенный мастер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2066,9 +2365,9 @@ msgstr "Зона назначения" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2078,36 +2377,40 @@ msgstr "Зона назначения" msgid "Device" msgstr "Устройство" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Настройка устройства" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "Идентификатор устройства" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Устройство не активно" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Устройство перезапускается…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Имя устройства" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Устройство не управляется ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Устройство отсутствует" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Тип устройства" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Устройство недоступно!" @@ -2115,31 +2418,31 @@ msgstr "Устройство недоступно!" msgid "Device unreachable! Still waiting for device..." msgstr "Устройство недоступно! Ожидание устройства..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Устройства" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Диагностика" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Dial номер" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Папка" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Отключить" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2156,20 +2459,24 @@ msgstr "Отключить DNS-запросы" msgid "Disable Encryption" msgstr "Отключить шифрование" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Отключить отслеживание неактивности клиентов" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Отключить данную сеть" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2178,16 +2485,16 @@ msgstr "Отключить данную сеть" msgid "Disabled" msgstr "Отключено" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "Отключено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Не ассоциировать при низком подтверждении" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" @@ -2195,18 +2502,17 @@ msgstr "" "href=\"%s\">RFC1918." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Отключить" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Ошибка попытки отключения" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Ошибка попытки отключения." @@ -2216,23 +2522,37 @@ msgstr "Дисковое пространство" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Закрыть" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Оптимизация расстояния" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Расстояние до самого удалённого сетевого узла в метрах." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Распределенная таблица ARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" +"Экземпляр Dnsmasq, к которому привязан данный раздел DHCP-хоста. Если не " +"указано, то раздел действителен для всех экземпляров dnsmasq." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2240,7 +2560,7 @@ msgstr "" "Экземпляр dnsmasq, к которому привязан данный раздел загрузки. Если не " "указано, раздел действителен для всех экземпляров dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSNAT." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "Не кешировать отрицательные ответы, в т.ч. для несуществующих доменов." @@ -2263,36 +2583,25 @@ msgstr "Не кешировать отрицательные ответы, в т msgid "Do not create host route to peer (optional)." msgstr "Не создавать маршрут к узлу (опционально)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "Не перенаправлять DNS-запросы " "без DNS-имени." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Не перенаправлять запросы, которые не могут быть обработаны публичными DNS-" -"серверами." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Не перенаправлять обратные DNS-запросы для локальных сетей." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Запретить прослушивание этих интерфейсов." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "Не предоставлять службу DHCPv6 на этом интерфейсе." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Не участвует" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2304,7 +2613,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Не отправлять имя устройства" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2312,11 +2621,11 @@ msgstr "" "Не отправлять никаких сообщений RA на этом интерфейсе." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Подтверждаете удаление «%s»?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Вы действительно хотите удалить следующий SSH ключ?" @@ -2324,11 +2633,11 @@ msgstr "Вы действительно хотите удалить следую msgid "Do you really want to erase all settings?" msgstr "Вы действительно хотите стереть все настройки?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Вы действительно хотите рекурсивно удалить директорию «%s»?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "Вы хотите заменить текущий PSK?" @@ -2336,15 +2645,17 @@ msgstr "Вы хотите заменить текущий PSK?" msgid "Do you want to replace the current keys?" msgstr "Вы хотите заменить текущие ключи?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Домен" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Требуется домен" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Белый список доменов" @@ -2370,11 +2681,11 @@ msgstr "Загрузить резервную копию" msgid "Download mtdblock" msgstr "Скачать MTD раздел" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "SNR offset внутренней сети" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2390,16 +2701,62 @@ msgstr "Перетащите, чтобы изменить порядок" msgid "Drop Duplicate Frames" msgstr "Отбрасывать дубликаты кадров" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"Отбрасывать все добровольные (gratuitous) ARP-кадры, например, если в сети " +"есть известный хороший ARP-прокси, и такие кадры не должны использоваться " +"или, в случае 802.11, не должны использоваться для предотвращения атак." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Отбрасывать все незапрашиваемые объявления соседей, например, если в сети " +"есть известный хороший NA-прокси, и такие кадры не должны использоваться " +"или, в случае 802.11, не должны использоваться для предотвращения атак." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Отбрасывать добровольные (gratuitous) ARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" +"Отбрасывать multicast-кадры 2-го уровня, содержащие unicast-пакеты IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" +"Отбрасывать multicast-кадры 2-го уровня, содержащие unicast-пакеты IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Отбрасывать вложенные IPv4 unicast" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Отбрасывать вложенные IPv6 unicast" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Отбросить пакет" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "Отбрасывать несопоставленные пакеты" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Отбрасывать нежелательные NA" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Экземпляр Dropbear" @@ -2417,20 +2774,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Двойной Стек, Облегченный (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Динамический DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "Клиент расширения динамической авторизации (DAE)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "Порт расширения динамической авторизации (DAE)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "Секрет расширения динамической авторизации (DAE)." @@ -2438,7 +2795,7 @@ msgstr "Секрет расширения динамической автори msgid "Dynamic tunnel" msgstr "Динамический туннель" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2446,21 +2803,33 @@ msgstr "" "Динамически выделять DHCP-адреса клиентам. Если выключено, то будут " "обслужены только клиенты с постоянно арендованными адресами." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Например, br-vlan или brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Например, eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "EA-bits длина" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Метод EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Каждому STA назначается собственный интерфейс AP_VLAN." + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Изменить" @@ -2468,6 +2837,10 @@ msgstr "Изменить" msgid "Edit peer" msgstr "Редактирование узла" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "Редактирование статической аренды" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2476,11 +2849,11 @@ msgstr "" "Изменить данные конфигурации raw выше, чтобы исправить любую ошибку и " "нажмите 'Сохранить', чтобы перезагрузить страницу." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Изменить эту сеть" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Редактировать беспроводную сеть" @@ -2489,46 +2862,36 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "Эффективный MTU маршрута" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Соответствие исходящего QoS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "Идентификатор исходящего устройства" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Имя исходящего устройства" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Тегирован исходящий" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Не тегирован исходящий" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Чрезвычайная ситуация" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Включить" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" "Включить/выключить узел. Перезапустите интерфейс WireGuard, чтобы применить " "изменения." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2536,11 +2899,11 @@ msgstr "" "Включить IGMP " "snooping" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Включить STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "Включить SLAAC" @@ -2558,10 +2921,11 @@ msgstr "Включить динамическую перестановку по msgid "Enable HE.net dynamic endpoint update" msgstr "Включить динамическое обновление оконечной точки HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Включить IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Включить IPv6 negotiation" @@ -2575,11 +2939,15 @@ msgstr "Включить IPv6 negotiation" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Включить IPv6-согласование на PPP-соединении" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "Включить маршрутизацию IPv6 сегмента" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Пропускать Jumbo-кадры" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "Включить изучение MAC адресов" @@ -2591,11 +2959,11 @@ msgstr "Включить NTP-клиент" msgid "Enable Single DES" msgstr "Включить Single DES" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Включить TFTP-сервер" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Включить фильтрацию VLAN" @@ -2603,7 +2971,7 @@ msgstr "Включить фильтрацию VLAN" msgid "Enable VLAN functionality" msgstr "Включить поддержку VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Включить WPS при нажатии на кнопку, в режиме WPA(2)-PSK/WPA3-SAE" @@ -2617,14 +2985,14 @@ msgstr "" "abbr> на порт HTTPS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" "Включить нисходящее делегирование префиксов IPv6, доступных на этом " "интерфейсе" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Включить защиту от атаки KRACK" @@ -2640,26 +3008,26 @@ msgstr "Включить отражение входящих пакетов" msgid "Enable mirroring of outgoing packets" msgstr "Включить отражение исходящих пакетов" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "Включить мультикаст fast leave" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "Включить мультикаст querier" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Включить поддержку мультикаста" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Включить управление пакетами (packet steering) для всех CPU. Может как " "помочь так и замедлить скорость сети (в зависимости от устройства)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Включить неразборчивый (promiscuous) режим" @@ -2681,11 +3049,11 @@ msgstr "Включить поддержку мультикаст трафика msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Включите флаг DF (не Фрагментировать) инкапсулирующих пакетов." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "Включить встроенный одноэкземплярный сервер TFTP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Включить данную сеть" @@ -2694,21 +3062,24 @@ msgstr "Включить данную сеть" msgid "Enable tx checksum" msgstr "Включить контрольную сумму на отправке" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "Включить юникаст-флудинг (unicast flooding)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" -msgstr "Включено" +msgstr "Включен" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Включает IGMP snooping на данном мосту" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2716,7 +3087,15 @@ msgstr "" "Включить быстрый роуминг между точками доступа, принадлежащими к тому же " "домену мобильности" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" +"Включает в batman-adv более эффективную группо-ориентированную " +"инфраструктуру пересылки многоадресной рассылки." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Включает Spanning Tree Protocol на этом мосту" @@ -2724,24 +3103,29 @@ msgstr "Включает Spanning Tree Protocol на этом мосту" msgid "Encapsulation limit" msgstr "Предел инкапсуляции" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Режим инкапсуляции" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Шифрование" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Конечная точка" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Конечный узел" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Порт конечного узла" @@ -2749,23 +3133,23 @@ msgstr "Порт конечного узла" msgid "Endpoint setting is invalid" msgstr "Неверная настройка параметра Endpoint" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "Принудительно использовать IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "Принудительно использовать IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "Принудительно использовать IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "Принудительно использовать MLD версии 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "Принудительно использовать MLD версии 2" @@ -2794,10 +3178,6 @@ msgstr "Ошибка" msgid "Error getting PublicKey" msgstr "Ошибка получения публичного ключа" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Ошибочные секунды (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2816,11 +3196,19 @@ msgstr "Каждые 30 секунд (slow, 0)" msgid "Every second (fast, 1)" msgstr "Каждую секунду (fast, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Исключить интерфейсы" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"Выполнение различных сетевых команд для проверки соединения и разрешения " +"имен с другими системами." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2828,27 +3216,37 @@ msgstr "" "Разрешить ответы внешней сети в диапазоне 127.0.0.0/8 и " "::1. Например, для RBL-сервисов." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Существующее устройство" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Расширять имена узлов" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Ожидается номер порта." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Ожидается шестнадцатеричное значение подсказки присвоения" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Ожидается правильный IPv4-адрес" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Ожидается правильный IPv6-адрес" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" +"Ожидание действительного MAC-адреса, опционально включающего подстановочные " +"знаки" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Ожидается два значение приоритета, разделённые двоеточием" @@ -2857,11 +3255,11 @@ msgstr "Ожидается два значение приоритета, раз #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Ожидается: %s" @@ -2873,7 +3271,7 @@ msgstr "Ожидается: непустое значение" msgid "Expires" msgstr "Истекает" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2884,13 +3282,13 @@ msgstr "" msgid "External" msgstr "Внешний" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Внешний R0 Key Holder List" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" -msgstr "Внешний R0 Key Holder List" +msgstr "Внешний R1 Key Holder List" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167 msgid "External system log server" @@ -2916,35 +3314,63 @@ msgstr "Дополнительные опции pppd" msgid "Extra sstpc options" msgstr "Дополнительные опции sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT над DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT над the Air" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "FT протокол" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "Причина отказа" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Не удалось изменить системный пароль." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Не удалось сконфигурировать модем" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "Не удалось подтвердить применение в течении %d сек., ожидание отката…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Не удалось подключиться" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Не удалось отключиться" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Не удалось выполнить действие «/etc/init.d/%s %s»: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Не удалось получить информацию о модеме" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Не удалось инициализировать модем" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Не удалось установить режим работы" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Файл" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2952,26 +3378,26 @@ msgstr "" "Этот файл может содержать такие строки, как server=1.2.3.4 или " "server=/domain/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Файл не доступен" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "Файл, где хранятся арендованные DHCP-адреса." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "Локальный DNS-файл." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Имя файла" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "Имя загрузочного образа, извещаемого клиентам." @@ -2980,14 +3406,22 @@ msgstr "Имя загрузочного образа, извещаемого к msgid "Filesystem" msgstr "Файловая система" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Фильтровать IPv4 A записи" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Фильтровать IPv6 AAAA записи" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Фильтрация обнаружения служб SRV/SOA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Фильтровать частные" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Фильтровать бесполезные" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Фильтрация для всех ведомых, без проверки" @@ -3000,8 +3434,15 @@ msgstr "Фильтрация для всех ведомых, проверка т msgid "Filtering for all slaves, validation only for backup slaves" msgstr "Фильтрация для всех ведомых, проверка только для резервных ведомых" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" +"Фильтрует обнаружение служб SRV/SOA, чтобы избежать запуска соединений по " +"требованию." + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Ошибка финализации" @@ -3014,7 +3455,7 @@ msgstr "" "информацию об обнаруженных разделах, т.е. выполнить команду 'block detect > /" "etc/config/fstab'" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Найти и присоединиться к сети" @@ -3028,10 +3469,11 @@ msgid "Firewall" msgstr "Межсетевой экран" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Метка межсетевого экрана" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Настройки межсетевого экрана" @@ -3039,19 +3481,19 @@ msgstr "Настройки межсетевого экрана" msgid "Firewall Status" msgstr "Состояние межсетевого экрана" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "Метка межсетевого экрана" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Файл прошивки" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Версия прошивки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Фиксированный порт для исходящих DNS-запросов." @@ -3077,40 +3519,48 @@ msgstr "Операции с прошивкой" msgid "Flashing…" msgstr "Прошивка…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "Соблюдать время жизни IPv4" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Принудительно (Force)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Принудительно использовать режим 40 МГц" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Назначить CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Запускать DHCP в этой сети, даже если в ней найден другой DHCP сервер." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "Применяемая версия IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "Применяемая версия MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Назначить TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Назначить TKIP и CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "Принудительная трансляция ответа DHCP." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Принудительное подключение (Force link)" @@ -3122,11 +3572,11 @@ msgstr "Принудительная прошивка" msgid "Force use of NAT-T" msgstr "Принудительно использовать NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Несоответствие маркеров формы" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA сообщения между " "назначенным мастер интерфейсом и downstream интерфейсами." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3152,7 +3602,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Перенаправлять трафик DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3160,31 +3610,35 @@ msgstr "" "Пересылать сообщения DHCPv6 между назначенным мастер интерфейсом и " "downstream интерфейсами." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "Секунды прямой коррекции ошибок (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Перенаправлять широковещательный трафик" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "Задержка перенаправления" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Перенаправлять запросы трафика Mesh" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "Пересылать мультикаст пакеты в виде юникаст пакетов на это устройство." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "Прямой/обратный DNS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Режим перенаправления" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Фрагментация" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Порог фрагментации" @@ -3208,7 +3662,7 @@ msgid "GHz" msgstr "ГГц" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Только GPRS" @@ -3228,12 +3682,16 @@ msgstr "GRETAP туннель через IPv4" msgid "GRETAP tunnel over IPv6" msgstr "GRETAP туннель через IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Шлюз" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Режим шлюза" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Порты шлюза" @@ -3243,23 +3701,23 @@ msgstr "Порты шлюза" msgid "Gateway address is invalid" msgstr "Неверный адрес шлюза" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" -msgstr "Общие настройки" +msgstr "Основные настройки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Основные настройки" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Общие опции устройства" @@ -3267,7 +3725,7 @@ msgstr "Общие опции устройства" msgid "Generate Config" msgstr "Создать config" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Создать PMK локально" @@ -3275,11 +3733,11 @@ msgstr "Создать PMK локально" msgid "Generate archive" msgstr "Создать архив" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "Сгенерировать конфигурацию" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "Генерация конфигурации…" @@ -3287,15 +3745,15 @@ msgstr "Генерация конфигурации…" msgid "Generate new key pair" msgstr "Сгенерировать новую пару ключей" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "Сгенерировать предварительный ключ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "Создает конфигурацию, подходящую для импорта на узле WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "Генерация QR-кода…" @@ -3305,41 +3763,42 @@ msgstr "Введённые пароли не совпадают, пароль н #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:146 msgid "Global Settings" -msgstr "Основные настройки" +msgstr "Общие настройки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Основные настройки сети" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "Перейти к обновлению прошивки..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Перейти к настройке пароля..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Перейти к странице настройки" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "Предоставить доступ к конфигурации DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Предоставить доступ к просмотру состояния DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "Предоставить доступ к просмотру состояния DSL" @@ -3351,6 +3810,10 @@ msgstr "Предоставить доступ к LuCI процедурам OpenC msgid "Grant access to LuCI Wireguard procedures" msgstr "Предоставить доступ к LuCI WireGuard процедурам" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Предоставить доступ к процедурам LuCI openfortivpn" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "Предоставить доступ к конфигурации SSH" @@ -3387,7 +3850,7 @@ msgstr "Предоставить доступ к конфигурации точ msgid "Grant access to network configuration" msgstr "Предоставить доступ к конфигурации сети" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Предоставить доступ к сетевым диагностическим утилитам" @@ -3395,6 +3858,10 @@ msgstr "Предоставить доступ к сетевым диагност msgid "Grant access to network status information" msgstr "Предоставить доступ к информации о состоянии сети" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "Предоставить доступ к состоянию процессов" @@ -3427,7 +3894,7 @@ msgstr "Разрешить настраивать uHTTPd" msgid "Grant access to wireless channel status" msgstr "Предоставить доступ к состоянию беспроводных каналов" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Предоставить доступ к просмотру состояния беспроводных сетей" @@ -3456,15 +3923,11 @@ msgstr "Доступ по HTTP(S)" msgid "Hang Up" msgstr "Перезапустить" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Ошибки контроля ошибок заголовка (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Интервал сердцебиения (kernel: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Интервал приветствия" @@ -3476,7 +3939,7 @@ msgstr "" "Настройка основных параметров вашего устройства, таких как имя или часовой " "пояс." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Скрыть ESSID" @@ -3485,17 +3948,25 @@ msgstr "Скрыть %h
    (%h), Priority: %d" msgstr "Хук: %h (%h), приоритет: %d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Штраф за прыжок (hop penalty)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3505,7 +3976,7 @@ msgstr "Устройство" msgid "Host expiry timeout" msgstr "Время ожидания хоста" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "Хост запрашивает указанный файл с сервера загрузки." @@ -3513,24 +3984,32 @@ msgstr "Хост запрашивает указанный файл с серв msgid "Host-Uniq tag content" msgstr "Содержимое Host-Uniq тега" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" +"Время аренды для конкретного хоста, например 5m, 3h, 7d." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" -msgstr "Имя" +msgstr "Имя хоста" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:22 msgid "Hostname to send when requesting DHCP" msgstr "Имя хоста в DHCP-запросах" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Имена устройств" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3589,23 +4068,27 @@ msgstr "Динамическая агрегация каналов IEEE 802.3ad msgid "IKE DH Group" msgstr "IKE DH группа" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "IMEI" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IP-адреса" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "IP-протокол" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" -msgstr "Списки IP" +msgstr "Наборы IP-адресов" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "Тип IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3621,7 +4104,7 @@ msgstr "Неверный IP-адрес" msgid "IP address is missing" msgstr "IP-адрес не указан" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3636,20 +4119,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "IP-протокол" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "IP-протокол" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "Список IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "Списки IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Переопределение поддельного NX-домена" @@ -3657,14 +4140,15 @@ msgstr "Переопределение поддельного NX-домена" msgid "IPsec XFRM" msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3680,7 +4164,7 @@ msgstr "Соседи IPv4" msgid "IPv4 Routing" msgstr "IPv4 маршрутизация" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "Правила IPv4" @@ -3690,7 +4174,7 @@ msgstr "Подключение IPv4 (upstream)" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3717,7 +4201,7 @@ msgstr "Маска сети IPv4" msgid "IPv4 network in address/netmask notation" msgstr "Сеть IPv4 в формате адрес/маска подсети" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Только IPv4" @@ -3730,11 +4214,11 @@ msgstr "IPv4 префикс" msgid "IPv4 prefix length" msgstr "Длина префикса IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "Таблица IPv4 трафика «%h»" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3743,16 +4227,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-в-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (оба, по умолчанию IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "Таблица IPv4/IPv6 трафика «%h»" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3763,7 +4251,8 @@ msgstr "Таблица IPv4/IPv6 трафика «%h»" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3771,7 +4260,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Межсетевой экран IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "IPv6 MTU" @@ -3779,7 +4268,11 @@ msgstr "IPv6 MTU" msgid "IPv6 Neighbours" msgstr "IPv6 соседи (neighbours)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "Время жизни префикса IPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "Настройки IPv6 RA" @@ -3787,15 +4280,15 @@ msgstr "Настройки IPv6 RA" msgid "IPv6 Routing" msgstr "IPv6 маршрутизация" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "Правила IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "Настройки IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6 ULA-префикс" @@ -3809,12 +4302,12 @@ msgstr "Подключение IPv6 (upstream)" msgid "IPv6 address" msgstr "IPv6-адрес" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "IPv6 подсказка присвоения" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "IPv6 назначение длины" @@ -3826,11 +4319,11 @@ msgstr "IPv6-адрес шлюза" msgid "IPv6 network in address/netmask notation" msgstr "Сеть IPv6 в формате адрес/маска подсети" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Только IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "IPv6 привелегии" @@ -3839,7 +4332,7 @@ msgstr "IPv6 привелегии" msgid "IPv6 prefix" msgstr "Префикс IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "Фильтр IPv6 префикса" @@ -3853,23 +4346,19 @@ msgstr "Длина префикса IPv6" msgid "IPv6 routed prefix" msgstr "IPv6 направление префикса" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "Явная маршрутизация IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "IPv6 суффикс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "Суффикс IPv6 (hex)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "Поддержка IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "Таблица IPv6 трафика «%h»" @@ -3877,6 +4366,10 @@ msgstr "Таблица IPv6 трафика «%h»" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "IPv6-Суффикс (hex)" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3892,10 +4385,19 @@ msgstr "IPv6 через IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6 через IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Идентификация EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" +"Если хост встречает запись, которую нельзя использовать, поскольку она " +"указывает адрес в другой подсети, то устанавливается метка known-" +"othernet." + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Если выбрано, то 1DES включено" @@ -3908,7 +4410,7 @@ msgstr "Если включено, к опциям pppd добавляется msgid "If checked, encryption is disabled" msgstr "Если выбрано, то шифрование выключено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." @@ -3916,7 +4418,7 @@ msgstr "" "Если установлено, нисходящие подсети выделяются только из заданных классов " "префиксов IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "Если установлено, значение параметров соответствия инвертируется" @@ -3937,7 +4439,7 @@ msgstr "" "Если выбрано, монтировать устройство используя название его раздела, а не " "фиксированный файл устройства" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " @@ -3948,14 +4450,16 @@ msgstr "" "использованием нового IP-адреса
    для подтверждения настроек, в " "противном случае изменения будут автоматически отменены." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Если не выбрано, то маршрут по умолчанию не настраивается" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "Если не выбрано, то извещаемые адреса DNS серверов игнорируются" @@ -3975,15 +4479,23 @@ msgstr "" "устройство, на котором располагается раздел подкачки, работает гораздо " "медленнее, чем RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "Игнорировать" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Игнорировать /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Игнорировать интерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "Игнорировать запросы от неизвестных машин с помощью !known." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Игнорировать файл resolv" @@ -3995,25 +4507,25 @@ msgstr "Образ" msgid "Image check failed:" msgstr "Ошибка проверки образа:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "Импортировать как узел" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "Импорт конфигурации" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "Импортировать конфигурацию как узел…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "Импорт настроек" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "Импортированная конфигурация узла" @@ -4025,7 +4537,29 @@ msgstr "Импортирует настройки из существующег msgid "In" msgstr "В" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" +"В DHCPv4 можно включить более одного mac-адреса. Это позволяет связать IP-" +"адрес с несколькими mac-адресами, и dnsmasq отказывается от аренды DHCP-" +"адреса для одного из mac-адресов, когда другой запрашивает аренду. Это " +"работает надежно только в том случае, если в любой момент времени активен " +"только один из mac-адресов." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"В локальных сетях с мостами рекомендуется включить функцию предотвращения " +"мостовых петель, чтобы избежать широковещательных петель, которые могут " +"привести к нарушению работы всей локальной сети." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -4034,7 +4568,7 @@ msgstr "" "заблокирован. Нажмите кнопку 'Продолжить' ниже, чтобы вернуться на " "предыдущую страницу." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "В секундах" @@ -4066,7 +4600,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Входящая контрольная сумма" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Входящий интерфейс" @@ -4074,6 +4608,7 @@ msgstr "Входящий интерфейс" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Входящий ключ" @@ -4092,22 +4627,21 @@ msgstr "Информация" msgid "Information" msgstr "Информация" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "Сопоставление входящего QoS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "Идентификатор входящего устройства" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "Имя входящего устройства" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Ошибка инициализации" @@ -4119,31 +4653,41 @@ msgstr "Скрипт инициализации" msgid "Initscripts" msgstr "Скрипты инициализации" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Внутреннее ограничение сертификата (Domain)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Внутреннее ограничение сертификата (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Внутреннее ограничение сертификата (Subject)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Внутреннее ограничение сертификата (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Установить расширения протокола..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Экземпляр" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Экземпляр «%h»" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Сведения об экземпляре" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4155,6 +4699,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Недостаточно разрешений для чтения UCI конфигурации." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "Идентификатор карты интегральной микросхемы" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4162,7 +4710,7 @@ msgstr "Недостаточно разрешений для чтения UCI к msgid "Interface" msgstr "Интерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "Интерфейс «%h» уже отмечен как назначенный мастер." @@ -4170,7 +4718,7 @@ msgstr "Интерфейс «%h» уже отмечен как назначен msgid "Interface %q device auto-migrated from %q to %q." msgstr "Интерфейс %q устройство авт.перемещается из %q в %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Настройка сети" @@ -4201,11 +4749,11 @@ msgstr "Интерфейс переподключается..." msgid "Interface is shutting down..." msgstr "Интерфейс отключается..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Интерфейс запускается..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Интерфейс останавливается..." @@ -4214,12 +4762,12 @@ msgid "Interface name" msgstr "Имя интерфейса" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Интерфейс не существует или пока не подключен." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Интерфейсы" @@ -4228,15 +4776,19 @@ msgstr "Интерфейсы" msgid "Internal" msgstr "Внутренний" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Внутренняя ошибка сервера" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "Международная идентификация оборудования мобильных станций" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "Международный идентификатор абонента мобильной связи" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Интервал отправки обучающих (learning) пакетов" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4246,7 +4798,7 @@ msgstr "" "значение, администратор может настроить количество IGMP-сообщений в подсети; " "большие значения приводят к тому, что IGMP-запросы отправляются реже" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "Интервал в секундах для STP пакетов «Hello»" @@ -4256,8 +4808,9 @@ msgid "Invalid" msgstr "Неверно" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "Предоставлен неверный APN" @@ -4267,6 +4820,10 @@ msgstr "Предоставлен неверный APN" msgid "Invalid Base64 key string" msgstr "Неверная строка Base64 ключа" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Неверный IPv6-адрес" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4294,7 +4851,7 @@ msgstr "Указан неверный VLAN ID! Доступны только у msgid "Invalid argument" msgstr "Неверный аргумент" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4310,15 +4867,36 @@ msgstr "Неверная команда" msgid "Invalid hexadecimal value" msgstr "Неверное шестнадцатеричное значение" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Неверное имя хоста или IPv4-адрес" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Неверный порт" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "Неверный URL сервера" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Неверный логин и/или пароль! Попробуйте снова." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Инвертировать мигание" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "Инвертировать совпадение" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "Является основным VLAN" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Изолировать клиентов" @@ -4331,25 +4909,25 @@ msgstr "" "Оказалось, что вы пытаетесь прошить устройство прошивкой, которая по размеру " "не помещается в чип флэш-памяти, проверьте ваш файл прошивки!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "Требуется JavaScript!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Подключение к сети" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Найденные точки доступа Wi-Fi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Подключение к сети: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Перейти к правилу" @@ -4357,24 +4935,28 @@ msgstr "Перейти к правилу" msgid "Keep settings and retain the current configuration" msgstr "Сохранить настройки и оставить текущую конфигурацию" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "Keep-Alive" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Журнал ядра" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Версия ядра" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Пароль (ключ)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Ключ №%d" @@ -4382,6 +4964,7 @@ msgstr "Ключ №%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Ключ для входящих пакетов (опционально)." @@ -4389,14 +4972,19 @@ msgstr "Ключ для входящих пакетов (опционально) #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Ключ для исходящих пакетов (опционально)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "Отсутствует ключ" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Ключ, используемый для подписи конфигурации сети" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4441,7 +5029,7 @@ msgstr "Интервал эхо-запросов LCP" msgid "LED Configuration" msgstr "Индикаторы" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4458,32 +5046,41 @@ msgstr "Язык" msgid "Language and Style" msgstr "Язык и тема" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" +"Большие веса (с одинаковым приоритетом) имеют пропорционально большую " +"вероятность быть выбранными." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "Интервал последнего членства" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Задержка" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Последнее «рукопожатие» (handshake)" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Лист" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Обучение" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "Изучать маршруты" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Файл аренд" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Срок аренды адреса" @@ -4507,7 +5104,7 @@ msgstr "Оставьте поле пустым для автоопределен msgid "Leave empty to use the current WAN address" msgstr "Оставьте пустым для использования текущего адреса WAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4516,33 +5113,29 @@ msgstr "" "Стандарт 802.11b может понадобиться для работы с устаревшими устройствами. " "Включайте его только при необходимости." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "Обнаружены устаревшие правила" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "События:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Предел" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Затухание линии (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "Режим линии" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" -msgstr "Состояние Линии" +msgstr "Состояние линии" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" -msgstr "Время бесперебойной работы линии" +msgstr "Время подключения к линии" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:125 msgid "Link Aggregation (Channel Bonding)" @@ -4561,17 +5154,20 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "Биты заголовка канального уровня %d–%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Список IP адресов, поставляющих поддельные результаты домена NX." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -"Список наборов IP-адресов для заполнения указанными IP-адресами доменов." +"Список IPsetов для заполнения IP-адресами результатов DNS-поиска FQDN, также " +"указанных здесь." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4585,7 +5181,7 @@ msgstr "" "PMK-R1 из R0KH , который использовался STA во время начальной ассоциации " "доменов Mobility." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4603,25 +5199,22 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Список файлов ключей SSH для авторизации" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Список доменов, для которых разрешены ответы RFC1918." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Список доменов для принудительного преобразования в IP-адрес." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" "Список DNS-серверов для " "перенаправления запросов." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Порт для входящих соединений" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Интерфейс для входящих соединений" @@ -4631,7 +5224,7 @@ msgstr "" "Принимать подключения только на указанном интерфейсе или, если интерфейс не " "задан, на всех интерфейсах" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4641,7 +5234,7 @@ msgstr "Ограничьте прослушивание этих интерфе msgid "ListenPort setting is invalid" msgstr "Неверная настройка параметра ListenPort" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Порт для входящих DNS-запросов." @@ -4650,7 +5243,7 @@ msgstr "Порт для входящих DNS-запросов." msgid "Load" msgstr "Нагрузка" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Нагрузка (1, 5, 15м)" @@ -4658,27 +5251,28 @@ msgstr "Нагрузка (1, 5, 15м)" msgid "Load configuration…" msgstr "Загрузка конфигурации…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Загрузка данных…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Загрузка содержимого директории…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Загрузка страницы…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Локальный" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Локальный IP-адрес" @@ -4698,11 +5292,12 @@ msgstr "Присвоение локального IP-адреса" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Локальный IPv4-адрес" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Локальный IPv6 DNS-сервер" @@ -4718,46 +5313,72 @@ msgstr "Локальный IPv6-адрес" msgid "Local Startup" msgstr "Запуск пакетов и служб пользователя, при включении устройства" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Время" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "Локальный ULA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Локальный домен" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "Суффикс локального домена, который будет добавлен к DHCP-именам и записи " "файла hosts (/etc/hosts)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Локальный сервер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Только локальный DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Локальный ключ WireGuard" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Локализовывать запросы" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "Код зоны расположения" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Подключаться к BSSID" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Журналировать событие «%h...»" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Войти" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Войти…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Выйти" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Запись событий" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Запись запросов" @@ -4784,37 +5405,28 @@ msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" "Логическая сеть, к которой будет добавлен туннель (мост) (опционально)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Войти" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Выйти" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "Слабая фильтрация" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Потеря сигнала в секундах (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Минимальный адрес аренды." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Режим совместимости с Lua активен" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC-адрес" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Фильтр MAC-адресов" @@ -4822,16 +5434,15 @@ msgstr "Фильтр MAC-адресов" msgid "MAC Address For The Actor" msgstr "MAC-адрес для актора" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4840,11 +5451,15 @@ msgstr "MAC VLAN" msgid "MAC address" msgstr "MAC-адрес" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "MAC-адрес(а)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC-фильтр" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Список MAC" @@ -4858,6 +5473,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "Неверное MAP правило" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "Сотовая связь MBIM" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4879,15 +5498,19 @@ msgstr "MII / ioctl вызовы ETHTOOL" msgid "MII Interval" msgstr "MII интервал" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4897,7 +5520,7 @@ msgstr "" "используйте команды приведенные ниже:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4906,72 +5529,76 @@ msgstr "" msgid "Manual" msgstr "Вручную" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "Производитель" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Мастер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "Матч-тег" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "" "Максимальный интервал RA " "сообщений" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Макс. достижимая скорость передачи данных (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Макс. кол-во аренд DHCP аренды" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Макс.EDNS0 размер пакета" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "" "Макс. кол-во одновременных запросов" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Максимальный возраст" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Максимально разрешенное значение интервала прослушивания клиента" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Максимальное количество активных арендованных DHCP-адресов." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Максимально допустимое количество одновременных DNS-запросов." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "Максимально допустимый размер UDP пакетов EDNS0." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Максимальное время ожидания готовности модема (секунды)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Максимальное количество арендованных адресов." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "Максимальный размер таблицы слежения" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -4980,10 +5607,14 @@ msgstr "" "title=\"Router Advertisement, ICMPv6 Type 134\">RA
    . По умолчанию 600 " "секунд." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Максимальная мощность передачи" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Может препятствовать работе VoIP или других служб." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -5010,7 +5641,7 @@ msgstr "Оперативная память (RAM)" msgid "Memory usage (%)" msgstr "Использование памяти (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -5018,10 +5649,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "Mesh ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Mesh ID" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Маршрутизация Mesh" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Опции, связанные с Mesh и маршрутизацией" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Метод не найден" @@ -5034,7 +5673,7 @@ msgstr "Метод мониторинга соединений" msgid "Method to determine link status" msgstr "Метод определения состояния соединений" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -5045,12 +5684,12 @@ msgctxt "nft unit" msgid "MiB" msgstr "МиБ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" "Минимальный интервал RA сообщений" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Минимальный срок действия ARP" @@ -5058,7 +5697,7 @@ msgstr "Минимальный срок действия ARP" msgid "Minimum Number of Links" msgstr "Минимальное количество соединений" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." @@ -5066,7 +5705,7 @@ msgstr "" "Минимальное требуемое время в секундах, прежде чем запись ARP может быть " "заменена. Предотвращает атаку ARP-кэша." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -5083,35 +5722,49 @@ msgstr "Зеркальный порт наблюдения" msgid "Mirror source port" msgstr "Зеркальный исходящий порт" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "Мобильный код страны" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Мобильные данные" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "Мобильный код сети" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "Мобильный сервис" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Мобильный домен" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Режим" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Модель" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Отключение канала модема в процессе." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "Информация о модеме" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5119,43 +5772,36 @@ msgstr "" "Подключение модема в процессе. Пожалуйста, подождите. Этот процесс " "завершится по таймауту через 2 минуты." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Настройки модема по умолчанию" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Модем" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Отсоединение модема в процессе. Пожалуйста, подождите." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Ошибка запроса информации о модеме" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Время ожидания инициализации модема" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "Модем отключен." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "Менеджер модема" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Монитор" @@ -5225,6 +5871,10 @@ msgstr "Переместить вниз" msgid "Move up" msgstr "Переместить вверх" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Multicast в Unicast" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5232,19 +5882,23 @@ msgstr "Переместить вверх" msgid "Multicast" msgstr "Мультикаст" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Многоадресный (multicast) режим" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Многоадресная (multicast) маршрутизация" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "Мультикаст в юникаст" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "Цепочка действий NAT «%h»‎" @@ -5256,12 +5910,16 @@ msgstr "NAT-T режим" msgid "NAT64 Prefix" msgstr "NAT64 префикс" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "Префикс NAT64" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "Ведомый NDP-Proxy" @@ -5274,18 +5932,23 @@ msgid "NTP server candidates" msgstr "Список NTP-серверов" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Название" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Имя новой сети" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Имя туннельного устройства" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Навигация" @@ -5294,13 +5957,17 @@ msgstr "Навигация" msgid "Nebula Network" msgstr "Сеть Nebula" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Отчет о соседях" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "Действительность кэша соседей" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5309,32 +5976,36 @@ msgstr "Действительность кэша соседей" msgid "Network" msgstr "Сеть" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Кодирование сети" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "Режим сети" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "Регистрация сети" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "SSID сети" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Сетевые утилиты" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "Сетевой адрес" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Образ системы для сетевой загрузки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "Миграция конфигурации сетевого моста" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Сетевое устройство" @@ -5347,7 +6018,7 @@ msgstr "Активность сетевого устройства (kernel: netd msgid "Network device is not present" msgstr "Нет сетевого устройства" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "Таблица сетевого устройства «%h»‎" @@ -5356,7 +6027,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "Биты заголовка сетевого уровня %d–%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Миграция конфигурации сетевых интерфейсов" @@ -5365,15 +6036,20 @@ msgstr "Миграция конфигурации сетевых интерфе msgid "Network interface" msgstr "Сетевой интерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "Network-ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Никогда" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Никогда" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5382,11 +6058,11 @@ msgstr "" "передаются. И разрешаются только из файла DHCP (/etc/config/dhcp) или файла " "hosts (/etc/hosts)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Новый интерфейс для «%s» не может быть создан: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Новое имя интерфейса…" @@ -5394,13 +6070,13 @@ msgstr "Новое имя интерфейса…" msgid "Next »" msgstr "Следующий »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Нет" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "DHCP-сервер не настроен для этого интерфейса" @@ -5408,7 +6084,7 @@ msgstr "DHCP-сервер не настроен для этого интерфе msgid "No Data" msgstr "Нет данных" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Без шифрования" @@ -5424,9 +6100,17 @@ msgstr "Без NAT-T" msgid "No RX signal" msgstr "Rx сигнал отсутствует" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Интерфейсы WireGuard не настроены." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "Конфигурация разрешенного режима не найдена." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5439,7 +6123,11 @@ msgstr "" msgid "No client associated" msgstr "Нет связанных клиентов" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Устройство управления не указано" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "Нет данных" @@ -5448,8 +6136,8 @@ msgstr "Нет данных" msgid "No data received" msgstr "Данные не получены" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "Любая" @@ -5462,15 +6150,11 @@ msgstr "Любая" msgid "No entries available" msgstr "Нет доступных записей" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Нет элементов в этом каталоге" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Файлы не найдены" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5487,7 +6171,7 @@ msgstr "" msgid "No host route" msgstr "Нет маршрута" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5508,30 +6192,39 @@ msgstr "Больше нет доступных ведомых интерфейс msgid "No more slaves available, can not save interface" msgstr "Больше нет доступных ведомых, сохранить интерфейс невозможно" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Отключить кэш отрицательных ответов" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "Не загружен набор правил nftables." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Пароль не установлен!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Нет подключенных узлов" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "Пока нет сконфигурированных узлов." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "Конфигурация предпочтительного режима не найдена." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Нет публичных ключей." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "Нет правил в цепочке" @@ -5545,7 +6238,8 @@ msgid "No validation or filtering" msgstr "Без проверки или фильтрации" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Зона не присвоена" @@ -5557,37 +6251,40 @@ msgstr "Зона не присвоена" msgid "Noise" msgstr "Шум" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Соотношение сигнал/шум (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Шумовой порог" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Шум:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Ошибки без предварительного CRC (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Не использовать wildcard" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Ничего" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Нормально" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Не найдено" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Не является членом" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Не ассоциировано" @@ -5600,7 +6297,7 @@ msgstr "Не подключен" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Не существует" @@ -5612,7 +6309,7 @@ msgstr "Не запускается при загрузке" msgid "Not supported" msgstr "Не поддерживается" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5620,15 +6317,24 @@ msgstr "" "Примечание: Некоторые драйверы Wi-Fi не полностью поддерживают 802.11w. " "Например, mwlwifi может иметь проблемы" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Примечание: при указании нестандартного порта передачи (addr#port) вам также может понадобиться DHCP прокси (в настоящее время " +"недоступен)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Примечания" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:188 msgid "Notice" -msgstr "Сообщение" +msgstr "Уведомление" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "DNS-запрос" @@ -5636,7 +6342,7 @@ msgstr "DNS-запрос" msgid "Number of IGMP membership reports" msgstr "Количество отчётов о членстве IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "Количество кэшированных DNS записей (максимум — 10000, 0 — отключить " @@ -5655,7 +6361,7 @@ msgid "Obfuscated Password" msgstr "Запутанный пароль" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5666,31 +6372,40 @@ msgid "Obtain IPv6 address" msgstr "Получение IPv6-адреса" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" -msgstr "Выключено" +msgstr "Выключена" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:18 msgid "Off-State Delay" msgstr "Задержка выключенного состояния" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"Выключено: vlanXXX, например, vlan1. Включено: " +"vlan_tagged_interface.XXX, например, eth0.1." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" -msgstr "Включено" +msgstr "Включена" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:12 msgid "On-State Delay" msgstr "Задержка включенного состояния" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "On-link маршрут" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Должен быть указан либо MAC-адрес, либо имя хоста!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Одно из: %s" @@ -5708,7 +6423,11 @@ msgstr "Одно или несколько недопустимых / обяза msgid "One or more required fields have no value!" msgstr "Одно или несколько обязательных полей не заполнены!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "Принимать ответы только через" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" "Разрешать связь с неизолированными мостовыми портами только при включенной " @@ -5721,25 +6440,24 @@ msgstr "" "Только в том случае, если текущий активный ведомый выходит из строя и " "первичный ведомый работает (failure, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "Открыть обзор правил iptables…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Открыть список..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP проксирование." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5757,7 +6475,7 @@ msgstr "" "Работать в режиме ретрансляции, если назначенный мастер интерфейс " "настроен и активен, в противном случае переключится в режим сервера." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." @@ -5765,12 +6483,24 @@ msgstr "" "Работать в режиме ретрансляции, если присутствует upstream IPv6 " "префикс, в противном случае отключить службу." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Настройка частоты" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "Оператор" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "Код оператора" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "Имя оператора" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "Опция \"%s\" содержит недопустимое значение." @@ -5778,22 +6508,33 @@ msgstr "Опция \"%s\" содержит недопустимое значен msgid "Option \"%s\" must not be empty." msgstr "Опция \"%s\" не должна быть пустой." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Опция изменена" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Опция удалена" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Необязательно" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "Необязательное имя хоста для назначения" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Необязательные, произвольные заметки об этом устройстве" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" +"Опционально, в секундах. Если установлено значение '0', попытка " +"восстановления соединения не предпринимается." + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5802,7 +6543,7 @@ msgstr "" "Необязательно. 32-разрядная метка для исходящих зашифрованных пакетов. " "Введите значение в шестнадцатеричной форме, начиная с 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5814,7 +6555,7 @@ msgstr "" "d::'), используйте суффикс на вроде ('::1') для этого IPv6 адреса ('a:b:c:" "d::1') для этого интерфейса." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5822,12 +6563,12 @@ msgstr "" "Необязательно. Base64-шифрованный общий ключ. Добавляет дополнительный слой " "криптографии с симметричным ключом для постквантовой устойчивости." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" "Необязательно. Создавать маршруты для разрешенных IP адресов для этого узла." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Необязательно. Описание узла." @@ -5835,14 +6576,14 @@ msgstr "Необязательно. Описание узла." msgid "Optional. Do not create host routes to peers." msgstr "Необязательно. Не создавать маршруты к узлам." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" "Необязательно. Имя хоста узла. Имена разрешаются до появления интерфейса." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5860,11 +6601,11 @@ msgstr "Необязательно. MTU XFRM интерфейса." msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Необязательно. MTU туннельного интерфейса." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Необязательно. Порт узла." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5875,7 +6616,7 @@ msgstr "" "установления соединения, но позволяет сгенерировать конфигурацию узла или QR-" "код, если он доступен. Он может быть удален после экспорта конфигурации." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5891,9 +6632,9 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:72 msgid "Options" -msgstr "Опции" +msgstr "Настройки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.40.0.0.0 означает «адрес системы, на " "которой запущен dnsmasq»." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "Опции:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "По порядку: меньший идет первым." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Интервал отправителя" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "Другие:" @@ -5928,7 +6678,7 @@ msgstr "Исходящий:" msgid "Outgoing checksum" msgstr "Исходящая контрольная сумма" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "Исходящий интерфейс" @@ -5936,6 +6686,7 @@ msgstr "Исходящий интерфейс" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "Исходящий ключ" @@ -5959,21 +6710,23 @@ msgstr "Исходящая зона" msgid "Overlap" msgstr "Перекрытие" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "Переопределить таблицу маршрутизации IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "Переопределить таблицу маршрутизации IPv6" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5981,6 +6734,7 @@ msgstr "Переопределить таблицу маршрутизации I #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "Назначить MTU" @@ -6002,7 +6756,7 @@ msgstr "Отвергать TOS" msgid "Override TTL" msgstr "Отвергать TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -6018,7 +6772,7 @@ msgstr "Назначить имя интерфейса по умолчанию" msgid "Override the gateway in DHCP responses" msgstr "Назначить шлюз в ответах DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -6034,7 +6788,7 @@ msgstr "Назначить таблицу внутренних маршруто msgid "Overview" msgstr "Обзор" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "Перезаписать существующий файл «%s»?" @@ -6042,17 +6796,30 @@ msgstr "Перезаписать существующий файл «%s»?" msgid "Overwrite the current settings with the imported configuration?" msgstr "Переписать текущие настройки импортированной конфигурацией?" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "Собственные номера" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Владелец" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (оба)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -6064,8 +6831,9 @@ msgid "PAP/CHAP password" msgstr "Пароль PAP/CHAP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -6076,6 +6844,7 @@ msgstr "Пароль PAP/CHAP" msgid "PAP/CHAP username" msgstr "Имя пользователя PAP/CHAP" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "Тип PDP" @@ -6085,8 +6854,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "PIN" @@ -6096,7 +6866,7 @@ msgstr "PIN" msgid "PIN code rejected" msgstr "PIN код отвергнут" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "Продвигать PMK R1" @@ -6137,28 +6907,37 @@ msgstr "PSID смещение" msgid "PSID-bits length" msgstr "PSID длина в битах" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM (Режим передачи пакетов)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "Настройки PXE/TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "Состояние пакетной службы" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "Управление пакетами (packet steering)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "Метка пакета" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Время приёма пакета" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "Пакеты" @@ -6167,23 +6946,31 @@ msgstr "Пакеты" msgid "Packets To Transmit Before Moving To Next Slave" msgstr "Количество пакетов перед переходом на следующий ведомый" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "Часть сети:" +msgstr[1] "Части сети:" +msgstr[2] "Частей сети:" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Часть зоны %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "Pass-through (зеркалирование физического устройства в один MAC VLAN)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Пароль" @@ -6191,11 +6978,11 @@ msgstr "Пароль" msgid "Password authentication" msgstr "С помощью пароля" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Пароль к Приватному ключу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "Пароль к внутреннему Приватному ключу" @@ -6206,19 +6993,19 @@ msgstr "Пароль к внутреннему Приватному ключу" msgid "Password strength" msgstr "Сложность пароля" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "Пароль2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "Перетащите файл SSH ключа или вставьте содержимое…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "Вставьте или перетащите файл конфигурации узлов WireGuard (wg0.conf)…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " @@ -6228,31 +7015,31 @@ msgstr "" "другой системы ниже, чтобы создать соответствующую запись узла, позволяющую " "этой системе подключиться к локальному интерфейсу WireGuard." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "Вставьте или перетащите имеющийся файл конфигурации WireGuard…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" -msgstr "Путь к CA-сертификату" +msgstr "Путь к сертификату CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Путь к client-сертификату" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Путь к Приватному ключу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Путь к внутренним CA-сертификатам" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Путь к внутренним Client-сертификатам" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Путь к внутреннему Приватному ключу" @@ -6274,11 +7061,19 @@ msgstr "Приостановлено" msgid "Peak:" msgstr "Пиковая:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Узел" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Сведения об узле" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "IP-адрес узла для назначения" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "MAC-адрес узла" @@ -6287,11 +7082,11 @@ msgstr "MAC-адрес узла" msgid "Peer address is missing" msgstr "Отсутствует адрес узла" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Имя устройства узла" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Узел отключен" @@ -6322,10 +7117,14 @@ msgstr "Выполнить сброс" msgid "Permission denied" msgstr "Доступ запрещён" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Постоянно держать включенным" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Постоянный интервал переподключения" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "Неверная настройка параметра PersistentKeepAlive" @@ -6334,13 +7133,13 @@ msgstr "Неверная настройка параметра PersistentKeepAli msgid "Phy Rate:" msgstr "Скорость:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Настройки канала" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Пинг-запрос" @@ -6353,11 +7152,11 @@ msgstr "Пинг-запрос" msgid "Pkts." msgstr "пакетов" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Пожалуйста, введите имя пользователя и пароль." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Пожалуйста, выберите файл для загрузки." @@ -6365,56 +7164,74 @@ msgstr "Пожалуйста, выберите файл для загрузки. msgid "Policy" msgstr "Политика" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "Политика: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Порт" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Порт %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "Порт не является частью какой-либо сети" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Изоляция порта" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "Состояние порта" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Состояние порта:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Потенциальное отрицание: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Режим управления питанием" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Предварительные ошибки CRC (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "Состояние питания" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Предпочитать LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Предпочитать UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "Предпочтительное время жизни префикса." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "Предпочтительная сетевая технология" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Делегированный префикс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "Подавитель префикса" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Предварительный ключ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "Предварительный ключ используется" @@ -6439,15 +7256,18 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Не позволяет клиентам обмениваться друг с другом информацией" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"Запрещает одному беспроводному клиенту общаться с другим. Эта настройка " +"влияет только на пакеты без VLAN тегов (нетегированные пакеты)." + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Первичный ведомый интерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "Первичный VLAN ID" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6462,29 +7282,31 @@ msgstr "" "Первичный становится активным ведомым всякий раз, когда он восстанавливается " "(always, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Приоритет" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "Private" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "Частный (предотвращение связи между MAC VLAN'ми)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Приватный ключ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "Приватный ключ присутствует" @@ -6502,8 +7324,8 @@ msgid "Prot." msgstr "Прот." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6515,7 +7337,7 @@ msgstr "Протокол" msgid "Provide NTP server" msgstr "Включить NTP-сервер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6523,7 +7345,7 @@ msgstr "" "Предоставлять сервер DHCPv6 на этом интерфейсе и отвечать на объявления и " "запросы DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Предоставлять новую сеть" @@ -6535,25 +7357,36 @@ msgstr "" "Включить NTP-сервер на выбранном интерфейсе, или, если не определено, на " "всех интерфейсах" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Прокси сервер" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Псевдо Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Публичный ключ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "Отсутвует публичный ключ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "Публичный ключ: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6584,61 +7417,85 @@ msgstr "QMI модем" msgid "Quality" msgstr "Качество" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" "Опрашивать все имеющиеся внешние DNS-серверы." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Интервал запроса" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Интервал ответа на запрос" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "R0 Key время жизни" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "Держатель ключа R1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Порт Radius-Accounting" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Секрет Radius-Accounting" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Сервер Radius-Accounting" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Порт Radius-Authentication" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Секрет Radius-Authentication" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Сервер Radius-Authentication" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "RADIUS Динамическое VLAN назначение" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "RADIUS на STA VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "RADIUS VLAN схема именования мостов" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "Именование RADIUS VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "Тегированный интерфейс RADIUS VLAN" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "RFC3947 NAT-T режим" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "Предварительная аутентификация RSN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "Порог RSSI для присоединения" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Порог RTS/CTS" @@ -6651,10 +7508,18 @@ msgstr "Получено (RX)" msgid "RX Rate" msgstr "Скорость приёма" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "Скорость приёма / отправки" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"Измерение радиоресурсов — посылает маячки для помощи в роуминге. Не все " +"клиенты поддерживают эту функцию." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6666,11 +7531,11 @@ msgstr "" "Строка в шестнадцатеричном коде. Оставьте пустой, если ваш провайдер не " "требует этого" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Читать /etc/ethers для настройки DHCP сервера." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Вы действительно хотите изменить протокол?" @@ -6678,11 +7543,11 @@ msgstr "Вы действительно хотите изменить прото msgid "Realtime Graphs" msgstr "Мониторинг" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Срок реассоциации" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Защита от DNS Rebinding" @@ -6707,11 +7572,39 @@ msgstr "" msgid "Receive" msgstr "Приём" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "Прием прекращен" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "Ошибки приема" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Принятые данные" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "Полученные байты" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "Полученная многоадресная рассылка" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "Полученные пакеты" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Рекомендуемый. IP адреса интерфейса WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Таймаут переподключения" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Переподключить этот интерфейс" @@ -6719,12 +7612,12 @@ msgstr "Переподключить этот интерфейс" msgid "Redirect to HTTPS" msgstr "Перенаправлять на HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "Переадресация на локальный порт %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "Переадресовать на локальную систему" @@ -6733,31 +7626,39 @@ msgstr "Переадресовать на локальную систему" msgid "References" msgstr "Ссылки" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Обновить каналы" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Обновляется" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "Состояние регистрации" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "Отклонить IPv4 пакет с ICMP-типом %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "Отклонить пакет с ICMP-типом %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "Отклонить IPv6 пакет с ICMPv6-типом %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "Отклонить пакет с TCP-reset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" @@ -6766,6 +7667,8 @@ msgstr "" "указанному значению" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Ретранслятор" @@ -6775,6 +7678,11 @@ msgstr "Ретранслятор" msgid "Relay Bridge" msgstr "Мост-Ретранслятор" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"Передача запросов DHCP в другие места. OK: v4↔v4, v6↔v6. Не OK: v4↔v6, v6↔v4." + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Ретранслятор между сетями" @@ -6784,6 +7692,14 @@ msgstr "Ретранслятор между сетями" msgid "Relay bridge" msgstr "Мост-ретранслятор" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "Сообщение из" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "Сообщение для адреса" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6793,6 +7709,7 @@ msgstr "Удалённый IPv4-адрес" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Удалённый IPv4-адрес или FQDN" @@ -6805,15 +7722,23 @@ msgstr "Удалённый IPv6-адрес" msgid "Remote IPv6 address or FQDN" msgstr "Удаленный IPv6-адрес или FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Удалить" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "Удалить адреса IPv4 из результатов и возвращать только адреса IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "Удалить адреса IPv6 из результатов и возвращать только адреса IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "Удалить связанные параметры устройства из конфигурации" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Заменить настройку беспроводного соединения" @@ -6843,7 +7768,8 @@ msgstr "Требуется входящая контрольная сумма ( msgid "Require incoming packets serialization (optional)." msgstr "Требуется сериализация входящих пакетов (опционально)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Обязательно" @@ -6860,7 +7786,7 @@ msgstr "Обязательно. Приватный ключ в кодировк msgid "Required. Path to the .yml config file for this interface." msgstr "Обязательно. Путь к файлу конфигурации .yml для этого интерфейса." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "Обязательно. Публичный ключ WireGuard узла." @@ -6874,67 +7800,75 @@ msgstr "" "Обязательно. Идентификатор интерфейса XFRM, который будет использоваться для " "SA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" +"Обязательно: отклоняет аутентификацию, если сервер RADIUS не предоставляет " +"соответствующие атрибуты VLAN." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Требуется hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Требуется hostapd с поддержкой EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Требуется hostapd с поддержкой EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Требуется hostapd с поддержкой OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Требуется hostapd с поддержкой SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Требуется hostapd с поддержкой WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Требуется wpa-supplicant" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Требуется wpa-supplicant с поддержкой EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Требуется wpa-supplicant с поддержкой EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Требуется wpa-supplicant с поддержкой OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Требуется wpa-supplicant с поддержкой SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Требуется wpa-supplicant с поддержкой WEP" @@ -6943,7 +7877,7 @@ msgid "Reselection policy for primary slave" msgstr "Политика переизбрания для первичного ведомого" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6958,20 +7892,24 @@ msgstr "Сбросить счётчики" msgid "Reset to defaults" msgstr "Сбросить на значения по умолчанию" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Файлы resolv и hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Файл resolv" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Список доменов для принудительного преобразования в IP-адрес." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Ресурс не найден" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Перезапустить" @@ -6980,7 +7918,7 @@ msgstr "Перезапустить" msgid "Restart Firewall" msgstr "Перезапустить межсетевой экран" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Перезапустить радио-интерфейс" @@ -6992,7 +7930,7 @@ msgstr "Восстановить" msgid "Restore backup" msgstr "Восстановить резервную копию" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -7000,84 +7938,99 @@ msgstr "" "Локализировать имя хоста в зависимости от запрашиваемой подсети, если " "доступно несколько IP-адресов." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Показать/скрыть пароль" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "Фильтр обратного пути" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Вернуть" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Вернуть изменения" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "Ошибка %h отмены конфигурации" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Отмена конфигурации…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "Ревизия" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "Переписать адрес назначения на %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "Переписать адрес назначения на %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Переписать адрес назначения на %h, порт %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Переписать адрес назначения на %h, порт %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "Переписать адрес источника на %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "Переписать адрес источника на %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" "Переписать адрес источника на %h, порт %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" "Переписать адрес источника на %h, порт %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "Переписать адрес исходящего устройства" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" +"Robust Security Network (RSN): Разрешить предварительную аутентификацию в " +"роуминге для сетей WPA2-EAP (и объявлять его в маяках WLAN). Работает только " +"в том случае, если указанный сетевой интерфейс является мостом. Сокращает " +"критичный по времени процесс повторной ассоциации." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Надёжность" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -7095,19 +8048,19 @@ msgstr "Подготовка корневой директории" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Политика round-robin (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Маршрутизировать разрешенные IP-адреса" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "Цепочка действий маршрута «%h»" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Тип маршрута" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7128,6 +8081,10 @@ msgstr "Пароль маршрутизатора" msgid "Routing" msgstr "Маршрутизация" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Алгоритм маршрутизации" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7142,24 +8099,24 @@ msgstr "" msgid "Rule" msgstr "Правило" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "Действия правила" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "Комментарий правила: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "Цепочка правил контейнера «%h»" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "Сопоставления правила" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Тип правила" @@ -7179,11 +8136,24 @@ msgstr "Ошибка исполнения" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "SIMs" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7201,15 +8171,15 @@ msgstr "Порт сервера SSH" msgid "SSH username" msgstr "SSH логин" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH ключи" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7226,7 +8196,7 @@ msgstr "Сервер SSTP" msgid "SWAP" msgstr "Разделы подкачки (swap)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7237,7 +8207,7 @@ msgid "Save" msgstr "Сохранить" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Применить" @@ -7254,7 +8224,7 @@ msgstr "Сохранить MTD раздел" msgid "Save mtdblock contents" msgstr "Сохранить содержимое MTD раздела" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Поиск" @@ -7263,11 +8233,16 @@ msgstr "Поиск" msgid "Scheduled Tasks" msgstr "Планировщик" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "Раздел %s пуст." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Раздел добавлен" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Раздел удалён" @@ -7285,9 +8260,9 @@ msgstr "" "формата завершается с ошибкой. Используйте эту опцию только если уверены, " "что файл образа корректный и предназначен именно для данного устройства!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Выбрать файл…" @@ -7295,7 +8270,7 @@ msgstr "Выбрать файл…" msgid "Selects the transmit hash policy to use for slave selection" msgstr "Определяет хэш политику передачи пакетов через объединенные интерфейсы" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7303,7 +8278,7 @@ msgstr "" "Отправлять RA " "сообщения, объявляющие это устройство маршрутизатором IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "Отправлять ICMP перенаправления" @@ -7324,11 +8299,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "Отправлять имя хоста этого устройства" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Сервер" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Адрес сервера" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Имя сервера" @@ -7353,16 +8332,20 @@ msgstr "Сессия истекла" msgid "Set Static" msgstr "Присвоить IP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "Установка псевдонима для имени хоста." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "Установить поле заголовка %s в %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "Назначить интерфейс внешним ведомым NDP-Proxy. По умолчанию выключено." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7375,7 +8358,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "Установить один и тот же MAC-адрес для всех ведомых интерфейсов" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7386,7 +8369,7 @@ msgstr "" "abbr>. Если флаг включен, клиенты будут выполнять автоконфигурацию адресов " "IPv6 без учёта состояния." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7404,11 +8387,15 @@ msgstr "" "Установить на первом ведомом интерфейсе, добавленном в объединение (follow, " "2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Настроить сервер DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Настройка маршрутов для проксированных соседей IPv6." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7416,33 +8403,39 @@ msgid "Setting PLMN failed" msgstr "Ошибка установки PLMN" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "Ошибка установки режима работы" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "Установка разрешенной сетевой технологии." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "Установка предпочтительной сетевой технологии." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Настройки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "Настройка маршрутов для проксированных соседей IPv6." - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "Число секунд с многочисленными ошибками (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" +msgstr "" +"Настройки для помощи беспроводным клиентам в роуминге между несколькими " +"точками доступа: 802.11r, 802.11k и 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "Короткий GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Короткая преамбула" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Показать текущий список файлов резервной копии" @@ -7455,16 +8448,16 @@ msgstr "Показать пустые цепочки" msgid "Show raw counters" msgstr "«Сырые» (raw) счётчики" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Выключить этот интерфейс" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7472,15 +8465,15 @@ msgstr "Выключить этот интерфейс" msgid "Signal" msgstr "Сигнал" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Сигнал / шум" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Затухание сигнала (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Качество сигнала" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Частота обновления сигнала" @@ -7488,12 +8481,12 @@ msgstr "Частота обновления сигнала" msgid "Signal:" msgstr "Сигнал:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Размер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Размер кэша DNS запроса" @@ -7510,12 +8503,12 @@ msgstr "Пропустить" msgid "Skip from backup files that are equal to those in /rom" msgstr "Исключить из резервной копии файлы, совпадающие с файлами в /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Перейти к содержимому" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Перейти к навигации" @@ -7533,14 +8526,10 @@ msgstr "Программное обеспечение VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "Некоторые значения полей недопустимы, невозможно сохранить информацию!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Извините, запрошенный объект не был найден." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Извините, сервер столкнулся с неожиданной ошибкой." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7551,8 +8540,8 @@ msgstr "" "должна быть установлена вручную. Обратитесь к wiki для получения конкретных " "инструкций для вашего устройства." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7579,7 +8568,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "Порт источника" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7587,7 +8576,7 @@ msgstr "" "Специальные PXE опции " "загрузки для dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7596,7 +8585,7 @@ msgstr "" "DHCPv6. Если не указано, будет объявлен домен поиска DNS локального " "устройства." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7606,7 +8595,7 @@ msgstr "" "через DHCPv6. Если не указано, устройство будет объявлять себя в качестве " "IPv6 DNS-сервера, если не отключена опция Локальный IPv6 DNS-сервер." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7636,7 +8625,7 @@ msgstr "Определяет IP-адреса, которые будут испо msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "Определяет частоту MII мониторинга соединения в миллисекундах" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "Определяет значение TOS для сопоставления в IP-заголовках" @@ -7644,7 +8633,7 @@ msgstr "Определяет значение TOS для сопоставлен msgid "Specifies the aggregation selection logic to use" msgstr "Определяет используемую логику выбора для агрегации" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "Определяет подсеть назначения для соответствия (CIDR-нотация)" @@ -7652,7 +8641,7 @@ msgstr "Определяет подсеть назначения для соот msgid "Specifies the directory the device is attached to" msgstr "Папка, к которой монтируется раздел устройства" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7662,7 +8651,7 @@ msgstr "" "Advertisement\">RA, например, для указания клиентам запрашивать " "дополнительную информацию через stateful DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" @@ -7671,7 +8660,7 @@ msgstr "" "для соответствия метке 255 или 0x0/0x1 для соответствия любому четному " "значению метки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "Определяет имя входящего логического интерфейса" @@ -7707,7 +8696,7 @@ msgid "" msgstr "" "Максимальное количество секунд, после которого узлы считаются отключёнными" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7732,7 +8721,7 @@ msgstr "" "Определяет режим, который будет использоваться для этого интерфейса " "объединения" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7775,15 +8764,15 @@ msgstr "" "Определяет количество секунд между моментами, когда драйвер объединения " "посылает обучающие пакеты на каждый пир ведомого устройства" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "Определяет порядок следования IP-правил" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "Определяет имя исходящего логического интерфейса" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7813,19 +8802,19 @@ msgstr "" "Определяет политику повторного выбора для первичного ведомого, когда " "происходит сбой активного ведомого или восстановление первичного ведомого" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "Определяет метрику маршрута для использования" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "Определяет тип маршрута, который необходимо создать" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "Определяет целевое действие маршрутизации для правила" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "Определяет подсеть источника для сопоставления (CIDR-нотация)" @@ -7849,7 +8838,7 @@ msgstr "" "Определяет время в миллисекундах для ожидания перед включением ведомого " "после обнаружения восстановления соединения" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7974,15 +8963,23 @@ msgstr "" "Укажите MTU (Максимальный Объем Данных), отличный от стандартного (1280 " "байт)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Укажите закрытый ключ." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "Скорость: %d Mibit/s, Дуплекс: %s" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "Splitterless ADSL (G.992.2) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "Таймаут кэша просроченных соседей" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Запустить" @@ -7995,16 +8992,16 @@ msgstr "Запустить WPS" msgid "Start priority" msgstr "Приоритет" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Запустить обновление" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Применение конфигурации…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Начато сканирование беспроводных сетей..." @@ -8013,6 +9010,10 @@ msgstr "Начато сканирование беспроводных сете msgid "Startup" msgstr "Автозапуск" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Состояние" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Статические маршруты IPv4" @@ -8026,7 +9027,7 @@ msgstr "Статические маршруты IPv6" msgid "Static Lease" msgstr "Бессрочная аренда" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Постоянные аренды" @@ -8036,7 +9037,7 @@ msgstr "Постоянные аренды" msgid "Static address" msgstr "Статический адрес" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -8046,18 +9047,18 @@ msgstr "" "имён DHCP-клиентам. Постоянная аренда также необходима для статических " "интерфейсов, в которых обслуживаются только клиенты с присвоенными адресами." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Максимально допустимое время бездействия клиента" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Состояние" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Остановить" @@ -8066,8 +9067,8 @@ msgstr "Остановить" msgid "Stop WPS" msgstr "Остановить WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Остановить обновление" @@ -8075,11 +9076,11 @@ msgstr "Остановить обновление" msgid "Storage" msgstr "Хранилище" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "Строгая фильтрация" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Строгий порядок" @@ -8088,15 +9089,15 @@ msgid "Strong" msgstr "Сильная" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Применить" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Подавить логирование" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "Подавить логирование стандартной работы этих протоколов." @@ -8129,7 +9130,7 @@ msgstr "Изменить VLAN" msgid "Switch port" msgstr "Порт коммутатора" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Изменить протокол" @@ -8139,7 +9140,7 @@ msgstr "Изменить протокол" msgid "Switch to CIDR list notation" msgstr "Переключить в формат CIDR" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Символическая ссылка" @@ -8151,8 +9152,16 @@ msgstr "Синхрон. по NTP" msgid "Sync with browser" msgstr "Скопир. из браузера" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Синтаксис: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Синтаксис: _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -8176,9 +9185,9 @@ msgstr "Свойства системы" msgid "System log buffer size" msgstr "Размер системного журнала" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "Система работает в режиме восстановления (initramfs)." @@ -8207,7 +9216,7 @@ msgstr "TCP-порт источника" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "TFTP сервер root" @@ -8220,26 +9229,37 @@ msgstr "Передано (TX)" msgid "TX Rate" msgstr "Cкорость передачи" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "Длина очереди Tx" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Таблица" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "Тег" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Тегирован" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" -msgstr "Назначение" +msgstr "Приоритет" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "Целевая платформа" @@ -8255,7 +9275,7 @@ msgstr "Пространство temp" msgid "Terminate" msgstr "Завершить" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8265,7 +9285,7 @@ msgstr "" "сообщениях RA. " "Минимальное значение составляет 1280 байт." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." @@ -8273,7 +9293,7 @@ msgstr "" "Флаг Managed address configuration (M) означает, что IPv6 адреса " "доступны через DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -8281,7 +9301,7 @@ msgstr "" "Флаг Mobile IPv6 Home Agent (H) означает, что устройство также " "выступает в качестве домашнего мобильного агента IPv6 на этом соединении." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8301,7 +9321,11 @@ msgstr "" "Для генерации изображения QR-кода конфигурации необходим пакет qrencode." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "DHCPv6-DUID (уникальный идентификатор DHCP) данного хоста." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8317,18 +9341,26 @@ msgstr "" "HE.net конфигурация обновления конечной точки изменена, теперь вы должны " "использовать простое имя пользователя вместо ID пользователя!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "IP-адрес %h уже используется в другой постоянной аренде" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "IP-адрес находится вне диапазона пула адресов DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "IP-адрес сервера загрузки" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" +"IP-адрес, который будет использоваться для данного узла, или ignore " +"для игнорирования любых DHCP-запросов от этого узла." + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "IPv4-адрес или полное доменное имя удаленного узла." @@ -8336,6 +9368,7 @@ msgstr "IPv4-адрес или полное доменное имя удален #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "IPv4-адрес или полное доменное имя удаленного конца туннеля." @@ -8350,6 +9383,14 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "IPv6 адрес или полное доменное имя удаленного узла туннеля." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" +"Идентификатор интерфейса IPv6 (суффикс адреса) в виде шестнадцатеричного " +"числа (не более 8 символов)." + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8361,7 +9402,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "Светодиод мигает с настроенной частотой включения/выключения" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "Светодиод мигает, имитируя реальное сердцебиение." @@ -8380,22 +9421,26 @@ msgstr "Светодиод всегда находится в выключенн msgid "The LED is always in default state on." msgstr "Светодиод всегда находится во включённом состоянии." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" "MAC-адрес %h уже используется другой постоянной арендой в том же пуле DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "MTU не должно превышать MTU родительского устройства, равное %d байт" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "VLAN ID должен быть уникальным" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "Алгоритм, который используется для обнаружения маршрутов mesh" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8407,7 +9452,7 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "Не удалось загрузить config файл из-за следующей ошибки:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8415,7 +9460,7 @@ msgstr "" "При подключении к скрытой беспроводной сети необходимо вручную указать " "правильный SSID" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8441,12 +9486,12 @@ msgstr "" "Устройство или раздел (напр. /dev/" "sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "Имя устройства «%s» уже занято" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." @@ -8454,7 +9499,7 @@ msgstr "" "Для правильной работы LuCI необходимо изменить существующую конфигурацию " "сети." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8476,7 +9521,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "На данном устройстве активны следующие правила." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "Частота прямо пропорциональна 1-минутной средней загрузке процессора." @@ -8484,34 +9529,55 @@ msgstr "Частота прямо пропорциональна 1-минутн msgid "The gateway address must not be a local IP address" msgstr "Адрес шлюза не должен быть локальным IP-адресом" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" "Сгенерированная конфигурация может быть импортирована в клиентское " "приложение WireGuard для установки соединения с этим устройством." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "Указанный публичный SSH ключ уже добавлен." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" "Указанный публичный SSH ключ неверный. Укажите правильный RSA или ECDSA ключ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "Аппаратный адрес(а) данной записи/хоста, разделенные пробелами." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"Настройка штрафа за прыжки позволяет изменить предпочтение batman-adv в " +"пользу многохоповых маршрутов по сравнению с короткими. Значение применяется " +"к TQ каждого пересылаемого OGM, тем самым увеличивая стоимость " +"дополнительного перехода (пакет должен быть получен и повторно передан, что " +"требует затрат эфирного времени)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "Имя хоста сервера загрузки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "Не удалось найти интерфейс" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Имя интерфейса уже используется" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Имя интерфейса слишком длинное" @@ -8535,6 +9601,7 @@ msgstr "Локальный IPv4-адрес" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "Локальный адрес IPv4, по которому создается туннель (необязательно)." @@ -8549,7 +9616,7 @@ msgstr "Локальная маска сети IPv4" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "Локальный IPv6-адрес, через который создается туннель (необязательно)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8563,7 +9630,7 @@ msgstr "" "«задержки выхода» в сети. Уменьшение значения приводит к сокращению времени " "на обнаружение потери последнего члена группы" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8575,7 +9642,7 @@ msgstr "" "сообщений в подсети; большие значения делают трафик менее всплесковым, так " "как ответы хоста распределяются на больший промежуток времени" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8584,7 +9651,7 @@ msgstr "" "Advertisement\">RA сообщениях. Максимальное значение составляет 255 " "прыжков." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." @@ -8592,7 +9659,7 @@ msgstr "" "Сетевой доступ к этому устройству может быть нарушен при изменении настроек " "интерфейса «%h»." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Имя сети уже используется" @@ -8613,7 +9680,7 @@ msgstr "" "внешней сети, например к Интернету и другие порты предназначенные для " "внутренней — локальной сети." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " @@ -8623,7 +9690,7 @@ msgstr "" "узел. Обычно это статический публичный IP-адрес, статическое имя хоста или " "имя домена DDNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" "Интервал ответа на запрос должен быть меньше значения интервала запроса" @@ -8637,7 +9704,7 @@ msgstr "Команда reboot завершилась с кодом ошибки msgid "The restore command failed with code %d" msgstr "Команда restore завершилась с кодом ошибки %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8647,15 +9714,15 @@ msgstr "" "Если в сети ожидаются потери, значение надежности может быть увеличено. IGMP " "устойчив к (надежность – 1) потерям пакетов" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" "Целью правила является переход к другому правилу, определенному значением " "его приоритета" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8666,11 +9733,11 @@ msgstr "" "iproute2/rt_tables. Специальные псевдонимы local (255), main (254) и default " "(253) также допустимы" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "Выбранный режим %s несовместим с шифрованием %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "Представленный маркер безопасности недействителен или уже истек!" @@ -8708,6 +9775,19 @@ msgstr "Пароль администратора успешно изменен. msgid "The sysupgrade command failed with code %d" msgstr "Команда sysupgrade завершилась с кодом ошибки %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" +"Конструкция тега определяет, какие директивы хоста используются; можно " +"указать более одного тега, в этом случае запрос должен соответствовать им " +"всем. Директивы с метками используются предпочтительнее, чем директивы без " +"меток. Обратите внимание, что при этом необходимо указать один из mac, duid " +"или hostname (может быть подстановочным знаком)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8734,12 +9814,20 @@ msgstr "" "Загруженный файл прошивки не поддерживается. Проверьте, что вы загрузили " "подходящую прошивку для чипа вашего устройства." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "Значение переопределено конфигурацией. Оригинал: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "Значение переопределено конфигурацией." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" +"Значение определяет интервал (миллисекунды), через который batman-adv " +"передает в сеть информацию о протоколе." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8748,19 +9836,20 @@ msgstr "" "iptables и nftables не рекомендуется и может привести к неполной фильтрации " "трафика." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Нет активных арендованных адресов" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Нет изменений для применения" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8773,16 +9862,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "IPv4-адрес ретранслятора" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Этот тип аутентификации не применим к выбранному методу EAP." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Это не похоже на корректный PEM файл" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8801,6 +9890,24 @@ msgstr "" "Это либо \"Update Key\", настроенный для туннеля, либо пароль учетной " "записи, если ключ обновления не был настроен" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Это устройство batman-adv, к которому вы хотите привязать физическое " +"устройство указанное выше. Если этот список пуст, то вам нужно сначала " +"создать его. Если вы хотите направить трафик mesh через проводное сетевое " +"устройство, выберите его в вышеуказанном списке устройств. Если вы хотите " +"назначить интерфейс batman-adv для Wi-fi mesh, то не выбирайте устройство в " +"списке, а перейдите в настройки беспроводной сети и выберите этот интерфейс " +"в качестве сети." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8817,7 +9924,7 @@ msgstr "" "Это локальный адрес, назначенный туннельным брокером, обычно заканчивается " "на ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "Это единственный DHCPимпорт " "конфигурации." -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Войти…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8927,7 +10038,7 @@ msgstr "" "
    Чтобы восстановить настройки из ранее созданной резервной копии, " "нажмите \"Выбрать архив\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Тон" @@ -8935,12 +10046,16 @@ msgstr "Тон" msgid "Total Available" msgstr "Свободно" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Трассировка" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "Код зоны отслеживания" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8952,11 +10067,11 @@ msgstr "Трафик" msgid "Traffic Class" msgstr "Класс трафика (TC)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "Цепочка фильтра трафика «%h»" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "Трафик, сопоставленный правилом: %.1000mпакетов, %.1024mБ" @@ -8973,6 +10088,26 @@ msgstr "Передача" msgid "Transmit Hash Policy" msgstr "Хэш политика передачи пакетов" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "Передача прекращена" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "Ошибки передачи" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Переданные данные" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "Переданные байты" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "Переданные пакеты" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -9011,7 +10146,7 @@ msgstr "Туннель" msgid "Tunnel Link" msgstr "Ссылка на туннель" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Туннель" @@ -9020,13 +10155,13 @@ msgid "Tx-Power" msgstr "Мощность передатчика" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Тип" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Тип сервиса" @@ -9075,7 +10210,7 @@ msgstr "Невозможно определить внешний IP-адрес" msgid "Unable to determine upstream interface" msgstr "Невозможно определить основной (upstream) интерфейс" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Невозможно обработать запрос для" @@ -9126,19 +10261,31 @@ msgstr "Невозможно перезапустить межсетевой э msgid "Unable to save contents: %s" msgstr "Невозможно сохранить содержимое: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Секунды неготовности (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "Невозможно установить список разрешенных режимов." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "Невозможно установить предпочтительный режим." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "Не удается проверить PIN-код" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Сброс" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Не ожидаемый формат данных ответа" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -9154,9 +10301,9 @@ msgstr "" #: modules/luci-compat/luasrc/model/network.lua:971 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:17 msgid "Unknown" -msgstr "Неизвестно" +msgstr "Неизвестный" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Неизвестный и неподдерживаемый метод подключения." @@ -9180,11 +10327,11 @@ msgstr "Неуправляемый" msgid "Unmount" msgstr "Отмонтировать" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Ключ без имени" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Не принятые изменения" @@ -9198,15 +10345,25 @@ msgid "Unsupported MAP type" msgstr "Не поддерживаемый тип MAP" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Не поддерживаемый модем" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Не поддерживаемый протокол" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Не поддерживаемый тип протокола." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Не тегирован" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "Узел без имени" @@ -9218,7 +10375,7 @@ msgstr "Вверх" msgid "Up Delay" msgstr "Задержка включения интерфейса" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Загрузить" @@ -9234,25 +10391,29 @@ msgstr "" msgid "Upload archive..." msgstr "Загрузить архив..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Загрузка файла" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Загрузка файла…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "Загрузка отменена" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Ошибка запроса на загрузку: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Загрузка файла…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9262,7 +10423,7 @@ msgstr "" "назначены имена в виде wifinet# и сеть будет перезапущена для " "применения обновлённой конфигурации." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -9270,7 +10431,7 @@ msgstr "" "После нажатия кнопки «Продолжить» конфигурация мостов будет обновлена, и " "сеть будет перезапущена для применения обновленной конфигурации." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -9278,21 +10439,25 @@ msgstr "" "После нажатия кнопки «Продолжить» опции ifname будут переименованы, и сеть " "будет перезапущена для применения обновленной конфигурации." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "DNS сервера будут опрошены в " "порядке, определенном в resolvfile файле." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Время работы" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Использовать /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Использовать DHCP" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Использовать серверы, объявленные через DHCP" @@ -9301,13 +10466,18 @@ msgstr "Использовать серверы, объявленные чере msgid "Use DHCP gateway" msgstr "Использовать шлюз DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Использовать DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Использовать объявляемые узлом DNS сервера" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Использовать коды стран ISO/IEC 3166 alpha2." @@ -9355,22 +10525,25 @@ msgstr "Использовать как корень (/)" msgid "Use broadcast flag" msgstr "Использовать широковещательный флаг" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Использовать встроенный IPv6-менеджмент" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Использовать собственные DNS сервера" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Использовать шлюз по умолчанию" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Использовать метрику шлюза" @@ -9397,16 +10570,16 @@ msgid "Use same source and destination for each connection" msgstr "" "Использовать один и тот же источник и назначения для каждого соединения" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Использовать системные сертификаты" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" "Использовать системные сертификаты для внутреннего туннеля (inner-tunnel)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9437,11 +10610,11 @@ msgstr "" msgid "Used" msgstr "Занято" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Используемый слот ключа" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9449,59 +10622,61 @@ msgstr "" "Используется для двух различных целей: RADIUS NAS ID и 802.11r R0KH-ID. Не " "требуется при использовании обычного WPA(2)-PSK." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Группа пользователя" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Сертификат пользователя (PEM encoded)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "Идентификатор пользователя" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Ключ пользователя (PEM encoded)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Имя пользователя" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "Использовать flow-таблицу %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (Virtual Ethernet Port Aggregator)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "VLAN ID" @@ -9521,24 +10696,27 @@ msgstr "Локальный адрес VPN" msgid "VPN Local port" msgstr "Локальный порт VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "протокол VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Сервер VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "SHA256 хэш сертификата VPN-сервера" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Порт VPN сервера" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "Сертификат SHA1 hash VPN сервера" @@ -9547,6 +10725,10 @@ msgstr "Сертификат SHA1 hash VPN сервера" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (и другие) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9560,7 +10742,7 @@ msgstr "Сетевой идентификатор VXLAN" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9568,8 +10750,8 @@ msgstr "" "Требуется поддержка внешней сетью DNSSEC; убедитесь, что ответы не " "подписанного домена действительно поступают от не подписанных доменов." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9598,7 +10780,7 @@ msgid "Vendor Class to send when requesting DHCP" msgstr "" "Класс производителя (Vendor class), который отправлять при DHCP-запросах" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" "Проверять, действительно ли ответы от неподписанных доменов приходят от " @@ -9608,12 +10790,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Проверка загруженного файла образа." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Очень высокая" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Виртуальный Ethernet" @@ -9621,34 +10803,46 @@ msgstr "Виртуальный Ethernet" msgid "Virtual dynamic interface" msgstr "Виртуальный динамический интерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "Открытая система WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Общий ключ WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Пароль WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "WLAN роуминг" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Режим WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "Режим сна WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "Исправление режима сна WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Пароль WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9679,7 +10873,19 @@ msgstr "" msgid "Weak" msgstr "Слабая" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Вес" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" +"Если хост совпадает с записью, то устанавливается специальный тег known. Используйте known для соответствия всем известным хостам." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." @@ -9688,7 +10894,26 @@ msgstr "" "более высоким значением привилегий учитываются в первую очередь при " "распределении подсетей." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"При включении сетевого кодирования увеличивается пропускная способность WiFi " +"за счет объединения нескольких кадров в один кадр, что сокращает необходимое " +"эфирное время." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Когда эта функция включена, распределенная ARP-таблица формирует ARP-кэш " +"всей сети, который помогает клиентам, не входящим в сеть, получать ARP-" +"ответы гораздо надежнее и без особых задержек." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" @@ -9696,7 +10921,34 @@ msgstr "" "Если включено, шлюз становится on-link, даже если адрес шлюза не " "соответствует какому-либо префиксу интерфейса" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Если включено, новые записи ARP-таблицы добавляются из полученных " +"добровольных APR-запросов или ответов, в противном случае обновляются только " +"ранее существовавшие записи таблицы, но новые хосты не изучаются." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"При инвертировании светодиод постоянно горит и мерцает, вместо того чтобы " +"быть выключенным по умолчанию и мигать при активности системы." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"При работе mesh через несколько интерфейсов WiFi, batman-adv на каждом узле " +"способен оптимизировать поток трафика для достижения максимальной " +"производительности." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9706,7 +10958,7 @@ msgstr "" "включено, опции ключей R0/R1, расположенные ниже, не применяются. Для " "использования опций ключей R0/R1 отключите данную опцию." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9714,7 +10966,7 @@ msgstr "" "Там, где отключен QoS режима Wi-Fi Multimedia (WMM), клиенты могут быть " "ограничены скоростью 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9723,16 +10975,25 @@ msgstr "" "эфирного времени может быть значительно снижена." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Ширина" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Состояние WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "Узел WireGuard отключён" @@ -9748,21 +11009,21 @@ msgid "Wireless Adapter" msgstr "Беспроводной адаптер" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Беспроводная сеть" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Список беспроводных сетей" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Защита беспроводной сети" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Миграция беспроводной конфигурации" @@ -9778,15 +11039,15 @@ msgstr "Беспроводная сеть отключена" msgid "Wireless is not associated" msgstr "Беспроводная сеть не связана" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Беспроводная сеть отключена" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Беспроводная сеть включена" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Записывать полученные DNS-запросы в системный журнал." @@ -9798,7 +11059,7 @@ msgstr "Записывать системные события в файл" msgid "XOR policy (balance-xor, 2)" msgstr "Политика XOR (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9827,8 +11088,22 @@ msgstr "" ">Внимание: если вы выключите один из основных скриптов инициализации " "(например \"network\"), ваше устройство может оказаться недоступным!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Вы можете добавить несколько записей для одной и той же цели." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Вы можете добавить несколько записей для одного и того же домена." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" +"Вы можете добавить несколько уникальных адресов передачи для одного и того " +"же адреса прослушивания." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9863,34 +11138,56 @@ msgstr "Настройки ZRam" msgid "ZRam Size" msgstr "Размер ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Примечание: хотя " +"_http возможен, ни один браузер не поддерживает SRV-записи)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "любой" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "авто" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "автоматически" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "автоматически (отключено)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "автоматически (включено)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "соед. мостом" @@ -9947,25 +11244,30 @@ msgctxt "nft unit" msgid "day" msgstr "день" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "отключить" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "отключено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "по умолчанию драйвера" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "драйвер по умолчанию (%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "например: --proxy 10.10.10.10" @@ -9974,14 +11276,23 @@ msgstr "например: --proxy 10.10.10.10" msgid "e.g: dump" msgstr "например: dump" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "включено" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "каждые %dс" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "истекло" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "принудительно" @@ -9991,22 +11302,22 @@ msgstr "принудительно" msgid "forward" msgstr "перенаправить" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "полный дуплекс" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "полудуплекс" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "значение в шестнадцатеричном представлении" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "скрытый" @@ -10015,9 +11326,9 @@ msgctxt "nft unit" msgid "hour" msgstr "час" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "гибридный режим" @@ -10025,6 +11336,10 @@ msgstr "гибридный режим" msgid "ignore" msgstr "игнорировать" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "бессрочный (срок аренды не истекает)" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -10039,11 +11354,19 @@ msgstr "ключ длиной от 8 до 63 символов" msgid "key with either 5 or 13 characters" msgstr "ключ длиной 5 или 13 символов" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "известный" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "known-othernet (в другой подсети)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "managed config (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "средний уровень" @@ -10052,11 +11375,11 @@ msgctxt "nft unit" msgid "minute" msgstr "минута" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "минут(ы)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "mobile home agent (H)" @@ -10068,18 +11391,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "нет" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "нет соединения" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "нет переопределения" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "не пустое значение" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "ничего" @@ -10090,20 +11421,20 @@ msgid "not present" msgstr "не существует" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" -msgstr "выключено" +msgstr "выкл" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "по доступному префиксу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "открытая сеть" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "other config (O)" @@ -10112,6 +11443,10 @@ msgstr "other config (O)" msgid "output" msgstr "вывод" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "более суток назад" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -10129,23 +11464,34 @@ msgstr "положительное целое число" msgid "random" msgstr "случайно" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "случайно сгенерированный" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" +"снижает накладные расходы, собирая и агрегируя сообщения отправителей в один " +"пакет, а не во множество маленьких пакетов" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "режим передачи" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "маршрутизируемый" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "секунды" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "режим сервера" @@ -10153,7 +11499,7 @@ msgstr "режим сервера" msgid "sstpc Log-level" msgstr "Уровень журналирования sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "высокий уровень" @@ -10161,7 +11507,7 @@ msgstr "высокий уровень" msgid "tagged" msgstr "с тегом" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "единицы измерения времени (TUs / 1.024 ms) [1000-65535]" @@ -10175,25 +11521,27 @@ msgstr "" "Protocol\">HTTP
    или HTTPS." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "уникальное значение" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "неизвестный" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "неизвестная версия" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "без ограничений" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -10215,8 +11563,8 @@ msgid "untagged" msgstr "без тега" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "верный IP-адрес" @@ -10229,7 +11577,7 @@ msgid "valid IPv4 CIDR" msgstr "верная IPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "верный IPv4 адрес" @@ -10258,7 +11606,7 @@ msgid "valid IPv6 CIDR" msgstr "верная IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "верный IPv6 адрес" @@ -10295,8 +11643,8 @@ msgstr "верный UCI идентификатор, имя хоста или IP msgid "valid address:port" msgstr "верный адрес:порт" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "верная дата (ГГГГ-ММ-ДД)" @@ -10336,11 +11684,23 @@ msgstr "верное целое число" msgid "valid multicast MAC address" msgstr "верный мультикаст MAC-адрес" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"допустимое имя сетевого устройства от 1 до 15 символов, не содержащее \":\", " +"\"/\", \"%\" или пробелов" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "корректное имя сетевого устройства, \".\" и \"..\" не подойдут" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "верная сеть в формате адрес/маска подсети" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "верный символ номера телефона (0-9, \"*\", \"#\", \"!\" or \".\")" @@ -10350,43 +11710,43 @@ msgid "valid port or port range (port1-port2)" msgstr "верный порт или диапазон портов (порт1-порт2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "верное значение порта" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "верное время (ЧЧ:ММ:СС)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "значение длиной от %d до %d символов" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "значение в диапазоне от %f до %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "значение больше или равное %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "значение меньше или равное %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "значение с %d символами" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "значение длиной %d или менее символов" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "значение длиной %d или более символов" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "низкий уровень" diff --git a/package/luci/modules/luci-base/po/sk/base.po b/package/luci/modules/luci-base/po/sk/base.po index cf668badf3..cdbf686d8f 100644 --- a/package/luci/modules/luci-base/po/sk/base.po +++ b/package/luci/modules/luci-base/po/sk/base.po @@ -1,34 +1,53 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-10-30 16:50+0000\n" +"PO-Revision-Date: 2023-10-05 19:12+0000\n" "Last-Translator: MaycoH \n" -"Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 5.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bitový" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "Neplatné polia: %d" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +#, fuzzy +msgid "%dh ago" +msgstr "Pred %dh" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +#, fuzzy +msgid "%dm ago" +msgstr "Pred %dm" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +#, fuzzy +msgid "%ds ago" +msgstr "Pred %ds" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s nie je označený vo viacerých sieťach VLAN!" @@ -53,32 +72,34 @@ msgstr "(prázdne)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(žiadne pričlenené zariadenia)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 +#, fuzzy msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" -msgstr "" +msgstr "+ %d ďalších" #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:48 msgid "-- Additional Field --" msgstr "-- Dodatočné pole --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Prosím, vyberte --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- vlastné --" @@ -102,9 +123,9 @@ msgstr "-- Prosím, vyberte --" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:55 msgctxt "sstp log level value" msgid "0" -msgstr "" +msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0=nepoužíva RSSI prahovú hodnotu, 1=nemení počiatočné nastavenia ovládača" @@ -112,13 +133,13 @@ msgstr "" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:56 msgctxt "sstp log level value" msgid "1" -msgstr "" +msgstr "1" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:233 msgid "1 Minute Load:" msgstr "1 minúta zaťaženia:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" @@ -126,6 +147,11 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12h (12 hodín - predvolené)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "15 minút zaťaženia:" @@ -133,68 +159,136 @@ msgstr "15 minút zaťaženia:" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:57 msgctxt "sstp log level value" msgid "2" -msgstr "" +msgstr "2" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:58 msgctxt "sstp log level value" msgid "3" -msgstr "" +msgstr "3" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3h (3 hodiny)" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" -msgstr "" +msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4-hexadecimálna hodnota znaku" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:11 msgid "464XLAT (CLAT)" -msgstr "" +msgstr "464XLAT (CLAT)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:243 msgid "5 Minute Load:" msgstr "5 minút zaťaženia:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5m (5 minút)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "6-identifikátor oktetu ako hexadecimálny reťazec - bez dvojbodiek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7d (7 dní)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +#, fuzzy +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: Povoliť hlásenie beaconov prostredníctvom rádiových meraní." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +#, fuzzy +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Povoliť hlásenie susedov prostredníctvom rádiových meraní." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" -msgstr "802.11r Rýchly Prechod" +msgstr "802.11r Fast Transition" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: BSS Max Idle. Jednotky: sekundy." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Ohlasovanie miestneho časového pásma v riadiacich rámcoch." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#, fuzzy +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Proxy ARP umožňuje non-AP STA zostať v úspornom režime dlhšie." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Ohlasovanie času v riadiacich rámcoch." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Režim spánku Wireless Network Management (WNM) (rozšírený režim " +"spánku pre stanice)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Opravy režimu spánku Wireless Network Management (WNM): Zabraňuje " +"reinštalačným útokom" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w Priradenie SA dotazovania maximálny čas platnosti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11w Priradenie SA dotazovania - čas vypršania nového dotazovania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w Ochrana Riadiaceho Rámca" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w maximálny čas vypršania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w časový limit nového pokusu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "" "IPv4-Sieťová maska" @@ -207,39 +301,51 @@ msgstr "Konfigurácia LED" msgid "LED Name" msgstr "Názov LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" -msgstr "" +msgstr "Životnosť RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" -msgstr "" +msgstr "%s väčšie ako %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:85 msgctxt "nft relational \">=\" operator expression" msgid "%s greater than or equal to %s" -msgstr "" +msgstr "%s väčšie alebo rovné ako %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:90 msgctxt "nft set match expression" @@ -257,14 +363,15 @@ msgid "%s is one of %s" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:88 +#, fuzzy msgctxt "nft relational \"<\" operator expression" msgid "%s lower than %s" -msgstr "" +msgstr "%s menšie ako %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:86 msgctxt "nft relational \"<=\" operator expression" msgid "%s lower than or equal to %s" -msgstr "" +msgstr "%s menšie alebo rovné ako %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:84 msgctxt "nft relational \"!=\" operator expression" @@ -276,11 +383,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 -msgid "A configuration for the device \"%s\" already exists" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 +msgid "A configuration for the device \"%s\" already exists" +msgstr "Konfigurácia pre zariadenie \"%s\" už existuje" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Adresár s rovnakým názvom už existuje." @@ -289,25 +404,90 @@ msgid "A new login is required since the authentication session expired." msgstr "" "Vyžaduje sa nové prihlásenie, pretože overenie totožnosti relácie vypršalo." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (všetky varianty) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (všetky varianty) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (všetky varianty) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (všetky varianty) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (všetky varianty) Annex B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (všetky varianty) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (všetky varianty) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annex L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -318,15 +498,15 @@ msgstr "ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:366 msgid "ARP IP Targets" -msgstr "" +msgstr "Ciele ARP IP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:358 msgid "ARP Interval" -msgstr "" +msgstr "Interval ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:382 msgid "ARP Validation" -msgstr "" +msgstr "Overenie ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:374 msgid "ARP mode to consider a slave as being up" @@ -334,70 +514,77 @@ msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:79 msgid "ARP monitoring is not supported for the selected policy!" -msgstr "" +msgstr "Monitorovanie ARP nie je podporované pre vybratú politiku!" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 msgid "ARP retry threshold" -msgstr "" +msgstr "Prah opakovania ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"ARP, IPv4 a IPv6 (aj 802.1Q) s multicast cieľovými MAC sú unicast na STA MAC " +"adresu. Poznámka: Toto nie je služba Directed Multicast Service (DMS) v " +"802.11v. Poznámka: môže narušiť očakávania STA prijímača týkajúce sa " +"multicastového vysielania." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Asynchrónny režim prenosu)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "Mosty ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " "to dial into the provider network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Číslo zariadenia ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Chýbajúce rozhranie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "Obmedzenie služby DNS rozhraniam podsietí, ktorým sa poskytuje DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:95 msgctxt "nft accept action" msgid "Accept packet" -msgstr "" +msgstr "Prijať paket" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -405,18 +592,27 @@ msgstr "" msgid "Access Concentrator" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Prístupový bod" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Izolácia prístupového bodu" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Prístupové technológie" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Akcie" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" -msgstr "" +msgstr "Aktívny" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:81 msgid "Active Connections" @@ -434,54 +630,56 @@ msgstr "Aktívne DHCPv6 prenájmy" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:255 msgid "Active IPv4 Routes" -msgstr "" +msgstr "Aktívne IPv4 trasy" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:258 msgid "Active IPv4 Rules" -msgstr "" +msgstr "Aktívne IPv4 pravidlá" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:265 msgid "Active IPv6 Routes" -msgstr "" +msgstr "Aktívne IPv6 trasy" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:268 msgid "Active IPv6 Rules" -msgstr "" +msgstr "Aktívne IPv6 pravidlá" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:205 +#, fuzzy msgid "Active-Backup policy (active-backup, 1)" -msgstr "" +msgstr "Politika Aktívny-Záložný (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:210 msgid "Adaptive load balancing (balance-alb, 6)" -msgstr "" +msgstr "Adaptívne vyrovnávanie záťaže (balance-alb, 6)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:209 +#, fuzzy msgid "Adaptive transmit load balancing (balance-tlb, 5)" -msgstr "" +msgstr "Adaptívne vyrovnávanie záťaže odosielania (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2233 #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Pridať" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Pridať premostenie ATM" @@ -501,30 +699,30 @@ msgstr "Pridať akciu LED" msgid "Add VLAN" msgstr "Pridať VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" -msgstr "" +msgstr "Pridať konfiguráciu zariadenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" -msgstr "" +msgstr "Pridať konfiguráciu zariadenia…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:15 msgid "Add instance" msgstr "Pridať inštanciu" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Pridať kľúč" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." -msgstr "" +msgstr "Pridať príponu lokálnej domény k menám poskytovaným zo súborov hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Pridať nové rozhranie..." @@ -532,19 +730,23 @@ msgstr "Pridať nové rozhranie..." msgid "Add peer" msgstr "Pridať účastníka" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" -msgstr "" +msgstr "Pridať na čierny zoznam" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Whitelist" -msgstr "" +msgstr "Pridať na biely zoznam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" -msgstr "" +msgstr "Ďalšie súbory hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Súbor s dodatočnými servermi" @@ -561,10 +763,14 @@ msgstr "Súbor s dodatočnými servermi" msgid "Address" msgstr "Adresa" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" -msgstr "" +msgstr "Rodina adries" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:284 msgid "Address setting is invalid" @@ -574,37 +780,37 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" -msgstr "" +msgstr "Adresy" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:3 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:15 msgid "Administration" msgstr "Administrácia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Pokročilé nastavenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" -msgstr "" +msgstr "Pokročilé nastavenia zariadenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 @@ -639,94 +845,107 @@ msgstr "Prezývka rozhrania" msgid "Alias of \"%s\"" msgstr "Prezývka pre „%s“" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Všetky servery" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." -msgstr "" +msgstr "Postupné prideľovanie IP adries, počnúc najnižšou dostupnou adresou." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" -msgstr "" +msgstr "Postupné prideľovanie IP adries" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 msgid "Allow SSH password authentication" -msgstr "" +msgstr "Povoliť SSH overenie heslom" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" -msgstr "" +msgstr "Povoliť AP režimu odpojiť STA na základe nízkeho počtu správ ACK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Povoliť všetky mimo zoznamu" #: modules/luci-compat/root/usr/share/rpcd/acl.d/luci-compat.json:3 msgid "Allow full UCI access for legacy applications" -msgstr "" +msgstr "Povoliť úplný prístup k UCI pre staršie aplikácie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Umožniť zastaralé rýchlosti 802.11b" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Povoliť iba zo zoznamu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" -msgstr "" +msgstr "Povoliť localhost" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:179 msgid "Allow rebooting the device" -msgstr "" +msgstr "Povoliť reštartovanie zariadenia" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Allow remote hosts to connect to local SSH forwarded ports" msgstr "" +"Povoliť vzdialeným hostiteľom pripojenie k miestnym portom presmerovaným " +"pomocou SSH" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 msgid "Allow root logins with password" -msgstr "" +msgstr "Povoliť prihlásenie ako root pomocou hesla" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:3 msgid "Allow system feature probing" -msgstr "" +msgstr "Povoliť skúmanie funkcií systému" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" -msgstr "" +#, fuzzy +msgid "Allow the root user to log in with password" +msgstr "Povoliť užívateľovi root prihlásenie pomocou hesla" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Povolené IP adresy" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" -msgstr "" +msgstr "Vždy" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:6 +#, fuzzy msgid "Always off (kernel: none)" -msgstr "" +msgstr "Vždy vypnuté (kernel: none)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:5 +#, fuzzy msgid "Always on (kernel: default-on)" -msgstr "" +msgstr "Vždy zapnuté (kernel: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 +#, fuzzy msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" +"Vždy posielať možnosti DHCP. Niekedy je to potrebné, napr. v systéme " +"PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -734,125 +953,89 @@ msgstr "" "Vždy použiť kanály so šírkou 40MHz, aj keď sa druhý kanál prekrýva. Použitie " "tejto voľby je v rozpore so štandardom IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +#, fuzzy +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Počet sekúnd čakania, kým bude modem pripravený" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 +#, fuzzy msgid "An error occurred while saving the form:" -msgstr "" +msgstr "Pri ukladaní formulára došlo k chybe:" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 msgid "An optional, short description for this device" -msgstr "" +msgstr "Voliteľný, krátky popis tohto zariadenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" -msgstr "" +msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" +"Ohlasovať NAT64 predponu v RA " +"správach." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" +"Oznámiť toto zariadenie ako predvolený smerovač, ak je k dispozícii verejná " +"predpona IPv6, bez ohľadu na dostupnosť lokálnej predvolenej trasy." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 +#, fuzzy msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" +"Oznámiť toto zariadenie ako predvolený smerovač bez ohľadu na to, či je " +"prítomná predpona alebo predvolená trasa." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" -msgstr "" +msgstr "Oznámené DNS domény" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Anonymná identita" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 +#, fuzzy msgid "Anonymous Mount" -msgstr "" +msgstr "Anonymné pripojenie" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 +#, fuzzy msgid "Anonymous Swap" -msgstr "" +msgstr "Anonymný Swap" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" -msgstr "" +msgstr "Akýkoľvek paket" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:84 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:174 @@ -861,56 +1044,65 @@ msgstr "" msgid "Any zone" msgstr "Akákoľvek zóna" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 +#, fuzzy msgid "Apply DHCP Options to this net. (Empty = all clients)." -msgstr "" +msgstr "Použiť možnosti DHCP na túto sieť. (Prázdne = všetci klienti)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" -msgstr "" +msgstr "Použiť a zachovať nastavenia" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 msgid "Apply backup?" msgstr "Použiť zálohu?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 +#, fuzzy msgid "Apply request failed with status %h" -msgstr "" +msgstr "Vykonanie požiadavky zlyhalo so stavom %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Použiť bez kontroly" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" -msgstr "" +msgstr "Použiť s vrátením po strate pripojenia" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Aplikujú sa zmeny konfigurácie… %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Architektúra" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" +"Priradiť časť danej dĺžky každej verejnej IPv6 predpony tomuto rozhraniu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" +"Priradiť časti predpony pomocou tejto hexadecimálnej ID podpredpony pre toto " +"rozhranie." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Priradené stanice" @@ -919,15 +1111,15 @@ msgstr "Priradené stanice" msgid "Associations" msgstr "Priradenia" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -938,25 +1130,26 @@ msgid "Attempt to enable configured mount points for attached devices" msgstr "" "Pokus o povolenie nastavených bodov pripojenia pre pričlenené zariadenia" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" -msgstr "" +msgstr "Autorizačná skupina" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Overenie totožnosti" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Typ overenia totožnosti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Autoritatívny" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Vyžaduje sa overenie totožnosti" @@ -964,7 +1157,9 @@ msgstr "Vyžaduje sa overenie totožnosti" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -979,34 +1174,43 @@ msgid "Automatic Homenet (HNCP)" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 +#, fuzzy msgid "Automatically check filesystem for errors before mounting" -msgstr "" +msgstr "Automaticky skontrolovať súborový systém na chyby pred pripojením" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 +#, fuzzy msgid "Automatically mount filesystems on hotplug" -msgstr "" +msgstr "Automaticky pripojiť súborové systémy pri pripojení za behu" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 +#, fuzzy msgid "Automatically mount swap on hotplug" -msgstr "" +msgstr "Automaticky pripojiť Swap pri pripojení za behu" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 +#, fuzzy msgid "Automount Filesystem" -msgstr "" +msgstr "Automaticky pripojiť súborový systém" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 +#, fuzzy msgid "Automount Swap" -msgstr "" +msgstr "Automaticky pripojiť Swap" + +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" -msgstr "Dostupný" +msgstr "Dostupné" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:270 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:280 @@ -1022,11 +1226,15 @@ msgstr "Dostupný" msgid "Average:" msgstr "Priemer:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1034,28 +1242,28 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" -msgstr "" +msgstr "Späť" #: modules/luci-compat/luasrc/view/cbi/footer.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:48 msgid "Back to Overview" msgstr "Späť na prehľad" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Späť na konfiguráciu" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1068,40 +1276,67 @@ msgid "Backup / Flash Firmware" msgstr "Zálohovať / nahrať firmvér" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" -msgstr "" +msgstr "Zoznam zálohovaných súborov" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Pásmo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" -msgstr "" +msgstr "Základné zariadenie" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +#, fuzzy +msgid "Beacon Report" +msgstr "Hlásenie beaconov" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 +#, fuzzy msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " "defined backup patterns." msgstr "" +"Nižšie je uvedený zoznam súborov na zálohovanie. Pozostáva zo zmenených " +"konfiguračných súborov označených opkg, základných súborov a používateľom " +"definovaných vzorov zálohovania." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:287 msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1110,18 +1345,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Previazať rozhranie" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1133,65 +1381,82 @@ msgstr "" msgid "Bitrate" msgstr "Bitová rýchlosť" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Premostenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 +#, fuzzy msgid "Bridge VLAN filtering" -msgstr "" +msgstr "Filtrovanie VLAN mostu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#, fuzzy msgid "Bridge device" -msgstr "" +msgstr "Zariadenie mostu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" -msgstr "" +msgstr "Možnosti špecifické pre mostový port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#, fuzzy msgid "Bridge ports" -msgstr "" +msgstr "Porty mostu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 +#, fuzzy msgid "Bring up empty bridge" -msgstr "" +msgstr "Zaviesť prázdny most" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Zaviesť po spustení" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 +#, fuzzy msgid "Bring up the bridge interface even if no ports are attached" +msgstr "Zaviesť rozhranie mostu, aj keď nie sú pripojené žiadne porty" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Prehliadať…" @@ -1199,14 +1464,36 @@ msgstr "Prehliadať…" msgid "Buffered" msgstr "V zásobníku" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Využitie CPU (%)" @@ -1221,18 +1508,23 @@ msgstr "Vo vyrovnávacej pamäti" msgid "Call failed" msgstr "Volanie zlyhalo" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Zrušiť" @@ -1240,32 +1532,32 @@ msgstr "Zrušiť" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1274,45 +1566,53 @@ msgstr "" msgid "Category" msgstr "Kategória" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1324,16 +1624,16 @@ msgstr "" msgid "Chain" msgstr "Reťaz" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Zmeny" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Zmeny boli vrátené späť." @@ -1344,18 +1644,19 @@ msgstr "Zmení heslo správcu pre prístup k zariadeniu" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Kanál" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Analýza kanálov" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Šírka kanála" @@ -1363,9 +1664,9 @@ msgstr "Šírka kanála" msgid "Check filesystems before mount" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." -msgstr "" +msgstr "Začiarknutím tejto možnosti odstránite existujúce siete z tohto rádia." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:110 msgid "Checking archive…" @@ -1380,8 +1681,8 @@ msgstr "Kontroluje sa obraz…" msgid "Choose mtdblock" msgstr "Zvoľte mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1392,13 +1693,16 @@ msgstr "" "neurčené pre odstránenie rozhrania z pridruženej zóny alebo vyberte " "pole vlastné pre definíciu novej zóny a pričleňte k nej rozhranie." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#, fuzzy msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" +"Vyberte sieť(e), ktoré chcete pripojiť k tomuto bezdrôtovému rozhraniu, " +"alebo vyplňte pole vlastné a definujte novú sieť." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Šifra" @@ -1422,9 +1726,10 @@ msgstr "" "Kliknutím na „Uložiť mtdblock“ stiahnete určený súbor mtdblock. (POZNÁMKA: " "TÁTO FUNKCIA JE PRE ODBORNÍKOV!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Klient" @@ -1433,9 +1738,9 @@ msgstr "Klient" msgid "Client ID to send when requesting DHCP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Zavrieť" @@ -1450,20 +1755,21 @@ msgid "" "persist connection" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Zavrieť zoznam..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Zbieram dáta..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +#, fuzzy +msgid "Collisions seen" +msgstr "Zistené kolízie" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Príkaz" @@ -1480,13 +1786,17 @@ msgstr "Príkaz zlyhal" msgid "Comment" msgstr "Komentár" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " "workaround might cause interoperability issues and reduced robustness of key " "negotiation especially in environments with heavy traffic load." msgstr "" +"Komplikuje útoky na reinštaláciu kľúčov na strane klienta tým, že zakazuje " +"retransmisiu rámcov EAPOL-Key, ktoré sa používajú na inštaláciu kľúčov. Toto " +"riešenie môže spôsobiť problémy s interoperabilitou a zníženú robustnosť " +"vyjednávania kľúčov, najmä v prostrediach s veľkým prevádzkovým zaťažením." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:106 @@ -1497,31 +1807,30 @@ msgstr "" #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Config File" -msgstr "" +msgstr "Konfiguračný súbor" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Konfigurácia" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" -msgstr "" +msgstr "Export konfigurácie" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Zmeny konfigurácie boli použité." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Zmeny konfigurácie boli vrátené späť!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Konfigurácia zlyhala" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1530,29 +1839,35 @@ msgid "" "the basic rate. Supported rates lower than the minimum basic rate are not " "offered." msgstr "" +"Konfiguruje prenosové rýchlosti na základe hustoty pokrytia buniek. Normálna " +"konfiguruje základné rýchlosti na 6, 12, 24 Mbps, ak sa nepoužívajú staršie " +"rýchlosti 802.11b, inak na 5,5, 11 Mbps. Vysoká konfiguruje základné " +"rýchlosti na 12, 24 Mbps, ak sa nepoužívajú staršie rýchlosti 802.11b, inak " +"na rýchlosť 11 Mbps. Veľmi vysoká konfiguruje ako základnú rýchlosť 24 Mbps. " +"Podporované rýchlosti nižšie ako minimálna základná rýchlosť nie sú ponúkané." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Nastaviť…" @@ -1564,9 +1879,10 @@ msgstr "" msgid "Confirmation" msgstr "Potvrdenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Pripojené" @@ -1576,11 +1892,11 @@ msgstr "Pripojené" msgid "Connection attempt failed" msgstr "Pokus o pripojenie zlyhal" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." -msgstr "" +msgstr "Pokus o pripojenie zlyhal." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1592,7 +1908,7 @@ msgstr "Pripojenie stratené" msgid "Connections" msgstr "Pripojenia" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1620,9 +1936,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Obsah bol uložený." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1633,40 +1949,43 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " "settings such as the IP address or wireless security credentials." msgstr "" +"Po použití zmien konfigurácie sa nepodarilo získať prístup k zariadeniu. " +"Možno sa budete musieť znova pripojiť, ak ste zmenili nastavenia súvisiace " +"so sieťou, ako je adresa IP alebo poverenia zabezpečenia bezdrôtovej siete." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:189 msgid "Country" msgstr "Krajina" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Kód krajiny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" -msgstr "" +msgstr "Hustota pokrytia buniek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Vytvoriť / priradiť zónu brány firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Vytvoriť rozhranie" @@ -1678,7 +1997,7 @@ msgstr "" msgid "Cron Log Level" msgstr "Úroveň Cron záznamu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Aktuálny výkon" @@ -1711,8 +2030,9 @@ msgstr "" "tlačidla Vykonať obnovenie." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:6 +#, fuzzy msgid "Custom flash interval (kernel: timer)" -msgstr "" +msgstr "Vlastný interval blikania (kernel: timer)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:59 msgid "" @@ -1722,31 +2042,31 @@ msgstr "" "Umožní prispôsobiť správanie LED " "diód zariadenia, ak je to možné." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" -msgstr "" +msgstr "Možnosti DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Server DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP a DNS" @@ -1757,16 +2077,22 @@ msgstr "DHCP a DNS" msgid "DHCP client" msgstr "Klient DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Voľby DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "Klient DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "Služba DHCPv6" @@ -1778,19 +2104,19 @@ msgstr "Služba DHCPv6" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Presmerovania DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" -msgstr "DNS dotaz na port" +msgstr "Port dotazu DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" -msgstr "" +msgstr "DNS vyhľadávacie domény" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "Port DNS servera" @@ -1798,19 +2124,19 @@ msgstr "Port DNS servera" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" -msgstr "" +msgstr "Váha DNS" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:33 msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1822,39 +2148,47 @@ msgstr "" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "Stav DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "Režim linky DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "Interval DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Prenosová rýchlosť" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Prijaté dáta" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Odoslané dáta" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Ladenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1862,68 +2196,72 @@ msgstr "" msgid "Default state" msgstr "Predvolený stav" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#, fuzzy msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" +"Definujte ďalšie možnosti DHCP, napríklad \"6,192.168.2.1,192.168.2.2\", ktorý klientom inzeruje rôzne servery DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" -msgstr "" +msgstr "Delegovať predpony IPv6" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Odstrániť" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Odstrániť kľúč" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Požiadavka na odstránenie zlyhala: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Odstrániť sieť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Popis" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Zrušiť výber" @@ -1931,11 +2269,11 @@ msgstr "Zrušiť výber" msgid "Design" msgstr "Vzhľad" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1970,9 +2308,9 @@ msgstr "Cieľová zóna" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1982,36 +2320,40 @@ msgstr "Cieľová zóna" msgid "Device" msgstr "Zariadenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Konfigurácia zariadenia" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Zariadenie nie je aktívne" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Zariadenie sa reštartuje…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" -msgstr "" +msgstr "Názov zariadenia" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" -msgstr "" +msgstr "Typ zariadenia" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Zariadenie neprístupné!" @@ -2019,35 +2361,37 @@ msgstr "Zariadenie neprístupné!" msgid "Device unreachable! Still waiting for device..." msgstr "Zariadenie nie je dosiahnuteľné! Na zariadenie sa stále čaká..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" -msgstr "" +msgstr "Zariadenia" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnostika" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Adresár" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Zakázať" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." msgstr "" +"Zakázať DHCP pre " +"toto rozhranie." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:375 @@ -2058,20 +2402,25 @@ msgstr "" msgid "Disable Encryption" msgstr "Zakázať šifrovanie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 +#, fuzzy msgid "Disable Inactivity Polling" -msgstr "" +msgstr "Zakázať dotazovanie na nečinnosť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Zakázať túto sieť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2080,72 +2429,88 @@ msgstr "Zakázať túto sieť" msgid "Disabled" msgstr "Zakázané" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" -msgstr "" +msgstr "Zakázané" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Odpojiť" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Pokus o odpojenie zlyhal" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:35 msgid "Disk space" -msgstr "" +msgstr "Diskové miesto" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Zahodiť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Optimalizácia vzdialenosti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Vzdialenosť v metroch k najvzdialenejšiemu členovi siete." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 +#, fuzzy msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" +"Inštancia Dnsmasq, ku ktorej je táto zavádzacia sekcia viazaná. Ak nie je " +"zadaná, sekcia je platná pre všetky inštancie dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" +"Dnsmasq je ľahký DHCP server a DNS forwarder." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" @@ -2157,32 +2522,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" +msgstr "Nepreposielať DNS požiadavky bez bodiek alebo častí domény." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Zabránenie načúvaniu na týchto rozhraniach." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2192,17 +2548,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Naozaj chcete odstrániť „%s“?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Naozaj chcete odstrániť nasledovný kľúč SSH?" @@ -2210,11 +2566,11 @@ msgstr "Naozaj chcete odstrániť nasledovný kľúč SSH?" msgid "Do you really want to erase all settings?" msgstr "Naozaj chcete vymazať všetky nastavenia?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Naozaj chcete rekurzívne odstrániť adresár „%s“?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2222,17 +2578,19 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Vyžaduje sa doména" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" -msgstr "Biela listina domén" +msgstr "Biely zoznam domén" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:83 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 @@ -2256,11 +2614,11 @@ msgstr "Stiahnuť zálohu" msgid "Download mtdblock" msgstr "Stiahnuť mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2274,16 +2632,58 @@ msgstr "" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +#, fuzzy +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "Zahodiť multicast rámce 2. vrstvy obsahujúce IPv4 unicast pakety." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +#, fuzzy +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "Zahodiť multicast rámce 2. vrstvy obsahujúce IPv6 unicast pakety." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +#, fuzzy +msgid "Drop nested IPv4 unicast" +msgstr "Zahodiť vnorené IPv4 unicast" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +#, fuzzy +msgid "Drop nested IPv6 unicast" +msgstr "Zahodiť vnorené IPv6 unicast" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "" @@ -2293,25 +2693,28 @@ msgid "" "Dropbear offers SSH network shell access " "and an integrated SCP server" msgstr "" +"Dropbear poskytuje SSH sieťový prístup a " +"integrovaný SCP server" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:14 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:11 msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" +"Dynamický DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2319,27 +2722,42 @@ msgstr "" msgid "Dynamic tunnel" msgstr "Dynamický tunel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 +#, fuzzy msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" +"Dynamické prideľovanie adries DHCP klientom. Ak je táto voľba zakázaná, budú " +"obslúžení len klienti so statickými prenájmami." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "Dĺžka bitov EA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Spôsob EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Upraviť" @@ -2347,17 +2765,21 @@ msgstr "Upraviť" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Upraviť túto sieť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Úprava bezdrôtovej siete" @@ -2366,44 +2788,34 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" -msgstr "Zapnúť" +msgstr "Povoliť" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2411,11 +2823,11 @@ msgstr "" "Povoliť IGMP " "špehovanie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Povoliť STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2433,10 +2845,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" -msgstr "" +msgstr "Povoliť IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2450,11 +2863,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2466,19 +2883,19 @@ msgstr "Povoliť klienta NTP" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Povoliť server TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" -msgstr "" +msgstr "Povoliť filtrovanie VLAN" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:184 msgid "Enable VLAN functionality" msgstr "Povoliť funkciu VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Povoliť tlačidlo WPS, vyžaduje WPA(2)-PSK/WPA3-SAE" @@ -2488,15 +2905,18 @@ msgid "" "Protocol\">HTTP requests to HTTPS port." msgstr "" +"Povoliť automatické presmerovanie požiadaviek HTTP na port HTTPS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" -msgstr "" +msgstr "Povoliť delegovanie nadol IPv6 predpôn dostupných na tomto rozhraní" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" -msgstr "" +msgstr "Povoliť protiopatrenia proti reinštalácii kľúča (KRACK)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:189 msgid "Enable learning and aging" @@ -2510,26 +2930,29 @@ msgstr "" msgid "Enable mirroring of outgoing packets" msgstr "Povoliť zrkadlenie odchádzajúcich paketov" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 +#, fuzzy msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" +"Povoliť riadenie paketov naprieč všetkými CPU. Môže pomôcť alebo znížiť " +"rýchlosť siete." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" -msgstr "" +msgstr "Povoliť promiskuitný režim" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:71 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:66 @@ -2549,11 +2972,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Povoliť túto sieť" @@ -2562,52 +2985,69 @@ msgstr "Povoliť túto sieť" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 +#, fuzzy msgid "Enable unicast flooding" -msgstr "" +msgstr "Povoliť unicast flooding" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Zapnuté" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" +"Umožňuje rýchly roaming medzi prístupovými bodmi, ktoré patria do rovnakej " +"domény mobility" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 -msgid "Enables the Spanning Tree Protocol on this bridge" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 +msgid "Enables the Spanning Tree Protocol on this bridge" +msgstr "Povolí Spanning Tree Protocol na tomto moste" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:59 msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Šifrovanie" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Koncový bod" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2615,23 +3055,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2660,10 +3100,6 @@ msgstr "Chyba" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2682,37 +3118,53 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Vylúčiť rozhrania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"Vykonávanie rôznych sieťových príkazov na kontrolu pripojenia a preklad " +"názvov do iných systémov." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" -msgstr "" +msgstr "Existujúce zariadenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2721,11 +3173,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Očakáva sa: %s" @@ -2735,22 +3187,24 @@ msgstr "Očakáva sa: nejaká hodnota" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:50 msgid "Expires" -msgstr "" +msgstr "Vyprší" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 +#, fuzzy msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" +"Čas expirácie prenajatých adries, minimum sú 2 minúty (2m)." #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:19 msgid "External" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2768,7 +3222,7 @@ msgstr "Protokol externého servera systémového denníka" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:79 msgid "Extra SSH command options" -msgstr "" +msgstr "Ďalšie možnosti príkazového riadku SSH" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 msgid "Extra pppd options" @@ -2778,74 +3232,110 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" "Zlyhalo potvrdenie aplikovania nastavení v čase %ds, čaká sa na návrat " "konfigurácie…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Súbor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Súbor nie je prístupný" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Názov súboru" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." -msgstr "Názov súboru obrazu zavedenia oznámeného klientom." +msgstr "Názov súboru zavádzacieho obrazu oznámeného klientom." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:315 msgid "Filesystem" msgstr "Súborový systém" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 -msgid "Filter private" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 @@ -2860,8 +3350,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Dokončovanie zlyhalo" @@ -2871,7 +3366,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Nájsť a pripojiť sa k sieti" @@ -2885,10 +3380,11 @@ msgid "Firewall" msgstr "Brána Firewall" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Nastavenia brány Firewall" @@ -2896,21 +3392,21 @@ msgstr "Nastavenia brány Firewall" msgid "Firewall Status" msgstr "Stav brány Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Súbor firmvéru" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Verzia firmvéru" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." -msgstr "" +msgstr "Pevný zdrojový port pre odchádzajúce DNS požiadavky." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:312 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:449 @@ -2934,40 +3430,48 @@ msgstr "Operácie nahrávania" msgid "Flashing…" msgstr "Nahráva sa…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Vynútiť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Vynútiť 40MHz režim" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Vynútiť CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Vynútiť server DHCP pre túto sieť, aj keď je rozpoznaný iný server." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Vynútiť TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Vynútiť TKIP a CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Vynútené spojenie" @@ -2979,11 +3483,11 @@ msgstr "Vynútiť aktualizáciu" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3002,37 +3506,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." +msgstr "Preposielať multicast pakety ako unicast pakety na tomto zariadení." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Režim presmerovania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Prah fragmentácie" @@ -3054,7 +3562,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Iba GPRS" @@ -3074,12 +3582,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Brána" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Porty brány" @@ -3089,31 +3601,31 @@ msgstr "Porty brány" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Všeobecné nastavenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Všeobecné nastavenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" -msgstr "" +msgstr "Všeobecné nastavenia zariadenia" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 msgid "Generate Config" msgstr "Vygenerovať nastavenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3121,11 +3633,11 @@ msgstr "" msgid "Generate archive" msgstr "Generovať archív" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3133,15 +3645,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3153,39 +3665,40 @@ msgstr "" msgid "Global Settings" msgstr "Globálne nastavenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Globálne voľby siete" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Prejsť na konfiguráciu hesla..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Prejsť na príslušnú stránku konfigurácie" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" -msgstr "" +msgstr "Udeliť prístup k zobrazeniu stavu DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3197,9 +3710,13 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" -msgstr "" +msgstr "Povoliť prístup ku konfigurácii SSH" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:12 msgid "Grant access to basic LuCI procedures" @@ -3218,8 +3735,9 @@ msgid "Grant access to flash operations" msgstr "" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:3 +#, fuzzy msgid "Grant access to main status display" -msgstr "" +msgstr "Udeliť prístup k zobrazeniu hlavného stavu" #: protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json:3 msgid "Grant access to mmcli" @@ -3233,7 +3751,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3241,6 +3759,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3273,9 +3795,9 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" -msgstr "" +msgstr "Udeliť prístup k zobrazeniu stavu bezdrôtovej siete" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66 msgid "Group Password" @@ -3296,21 +3818,18 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:64 msgid "HTTP(S) Access" -msgstr "" +msgstr "Prístup HTTP(S)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:46 msgid "Hang Up" msgstr "Zložiť" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#, fuzzy msgid "Heartbeat interval (kernel: heartbeat)" -msgstr "" +msgstr "Interval pulzu (kernel: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3322,7 +3841,7 @@ msgstr "" "Tu môžete nastaviť základné parametre vášho zariadenia, ako je názov " "hostiteľa alebo časová zóna." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" "Skryť ESSID" @@ -3332,17 +3851,25 @@ msgstr "" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" +msgstr "Vysoká" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3352,18 +3879,25 @@ msgstr "Hostiteľ" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 +#, fuzzy msgid "Host requests this filename from the boot server." -msgstr "" +msgstr "Hostiteľ požaduje tento názov súboru zo zavádzacieho servera." #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3373,11 +3907,11 @@ msgstr "Názov hostiteľa" msgid "Hostname to send when requesting DHCP" msgstr "Názov hostiteľa na odoslanie pri požadovaní servera DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Názvy hostiteľov" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3386,11 +3920,11 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:19 msgid "How long (in milliseconds) the LED should be off" -msgstr "" +msgstr "Ako dlho (v milisekundách) má byť LED vypnutá" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:13 msgid "How long (in milliseconds) the LED should be on" -msgstr "" +msgstr "Ako dlho (v milisekundách) má byť LED zapnutá" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 msgid "Human-readable counters" @@ -3422,34 +3956,39 @@ msgstr "" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 +#, fuzzy msgid "ID used to uniquely identify the VXLAN" -msgstr "" +msgstr "ID používané na jednoznačnú identifikáciu VXLAN" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:208 msgid "IEEE 802.3ad Dynamic link aggregation (802.3ad, 4)" -msgstr "" +msgstr "IEEE 802.3ad Dynamická agregácia liniek (802.3ad, 4)" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:75 msgid "IKE DH Group" msgstr "Skupina IKE DH" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "IMEI" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "Adresy IP" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "Protokol IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" -msgstr "" +msgstr "IP sety" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "Typ IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3465,7 +4004,7 @@ msgstr "Adresa IP je neplatná" msgid "IP address is missing" msgstr "Chýba adresa IP" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3477,20 +4016,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "" @@ -3498,14 +4037,15 @@ msgstr "" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3515,15 +4055,15 @@ msgstr "Brána Firewall IPv4" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:252 msgid "IPv4 Neighbours" -msgstr "" +msgstr "IPv4 susedia" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:251 msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" -msgstr "" +msgstr "Pravidlá IPv4" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 #, fuzzy @@ -3532,7 +4072,7 @@ msgstr "IPv4 prúd" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3559,7 +4099,7 @@ msgstr "Maska siete IPv4" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Iba IPv4" @@ -3572,11 +4112,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3585,16 +4125,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" -msgstr "" +msgstr "IPv4/IPv6 (oboje - predvolene IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3605,7 +4149,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3613,7 +4158,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Brána Firewall IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3621,7 +4166,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "IPv6 susedia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3629,15 +4178,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" -msgstr "" +msgstr "Pravidlá IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3651,14 +4200,15 @@ msgstr "" msgid "IPv6 address" msgstr "Adresa IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 +#, fuzzy msgid "IPv6 assignment length" -msgstr "" +msgstr "Dĺžka priradenia IPv6" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:188 msgid "IPv6 gateway" @@ -3668,22 +4218,22 @@ msgstr "Brána IPv6" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Iba IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" -msgstr "" +msgstr "Preferencia IPv6" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "IPv6 prefix" -msgstr "" +msgstr "IPv6 prefix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" -msgstr "" +msgstr "Filter prefixov IPv6" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 @@ -3692,27 +4242,24 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 +#, fuzzy msgid "IPv6 routed prefix" -msgstr "" +msgstr "Smerovaný prefix IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 +#, fuzzy msgid "IPv6 suffix" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"IPv6-Prípona (hex)" +msgstr "Prípona IPv6" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3720,6 +4267,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3735,10 +4286,16 @@ msgstr "" msgid "IPv6-over-IPv4 (6to4)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identita" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3751,13 +4308,16 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "Ak je zaškrtnuté, šifrovanie bude zakázané" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 +#, fuzzy msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" +"Ak je nastavené, podriadené podsiete sa prideľujú len z daných tried " +"prefixov IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3774,24 +4334,33 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 +#, fuzzy msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" +"Ak sa zmení IP adresa používaná na prístup k LuCI, je potrebné " +"manuálne opätovné pripojenie k novej IP do %d sekúnd pre " +"potvrdenie nastavení, inak budú zmeny vrátené späť." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 +#, fuzzy msgid "If unchecked, no default route is configured" msgstr "" +"Ak nie je začiarknuté, nie je nakonfigurovaný žiadny predvolený smerovací " +"záznam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" -msgstr "" +msgstr "Ak nie je začiarknuté, oznámené adresy serverov DNS budú ignorované" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 msgid "" @@ -3802,15 +4371,23 @@ msgid "" "datarates of the RAM." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignorovať súbor /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignorovať rozhranie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "" @@ -3822,25 +4399,25 @@ msgstr "Obraz" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3852,13 +4429,27 @@ msgstr "" msgid "In" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3888,7 +4479,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3896,6 +4487,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3908,28 +4500,27 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:187 msgid "Info" -msgstr "Informácie" +msgstr "Informácia" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 msgid "Information" msgstr "Informácie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3941,31 +4532,41 @@ msgstr "Inicializačný skript" msgid "Initscripts" msgstr "Inicializačné skripty" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Inštalovať rozšírenia protokolu..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" +msgstr "Inštancia" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Inštancia \"%h\"" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -3975,6 +4576,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -3982,7 +4587,7 @@ msgstr "" msgid "Interface" msgstr "Rozhranie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -3990,7 +4595,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Konfigurácia rozhrania" @@ -4021,11 +4626,11 @@ msgstr "Rozhranie sa opätovne pripája..." msgid "Interface is shutting down..." msgstr "Rozhranie sa vypína..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Spúšťa sa rozhranie..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Zastavuje sa rozhranie..." @@ -4034,12 +4639,12 @@ msgid "Interface name" msgstr "Názov rozhrania" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Rozhranie nie je prítomné alebo ešte pripojené." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Rozhranie" @@ -4048,22 +4653,26 @@ msgstr "Rozhranie" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Interná chyba serveru" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4073,8 +4682,9 @@ msgid "Invalid" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4084,6 +4694,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4106,7 +4720,7 @@ msgstr "" msgid "Invalid argument" msgstr "Neplatný parameter" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4120,15 +4734,37 @@ msgstr "Neplatný príkaz" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 +#, fuzzy msgid "Invalid username and/or password! Please try again." +msgstr "Neplatné používateľské meno a/alebo heslo! Prosím skúste to znova." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Izolovať klientov" @@ -4141,25 +4777,25 @@ msgstr "" "Zdá sa, že sa pokúšate nahrať obraz, ktorý sa nezmestí do pamäte flash. " "Prosím, overte súbor obrazu!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "Vyžaduje sa JavaScript!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Pripojiť sa k sieti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Pripojiť sa k sieti: Prehľadanie bezdrôtovej siete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" -msgstr "Pripája sa k sieti: %q" +msgstr "Pripojenie k sieti: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4167,24 +4803,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "Ponechať nastavenia a nestratiť aktuálnu konfiguráciu" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Záznam jadra" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Verzia jadra" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Kľúč" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Kľúč #%d" @@ -4192,6 +4832,7 @@ msgstr "Kľúč #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4199,14 +4840,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4251,7 +4897,7 @@ msgstr "" msgid "LED Configuration" msgstr "Konfigurácia LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4268,32 +4914,39 @@ msgstr "Jazyk" msgid "Language and Style" msgstr "Jazyk a štýl" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Oneskorenie" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Čas prenájmu" @@ -4315,40 +4968,39 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:45 msgid "Leave empty to use the current WAN address" -msgstr "" +msgstr "Ak chcete použiť aktuálnu adresu WAN, nechajte prázdne" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" +"Staršie alebo zle sa správajúce zariadenia môžu vyžadovať staršie rýchlosti " +"802.11b. V prípade ich použitia sa môže výrazne znížiť efektivita využitia " +"vysielacieho času. Ak je to možné, odporúča sa nepovoľovať rýchlosti 802.11b." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Legenda:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Obmedzenie" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "Režim linky" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "Stav linky" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "Doba pripojenia linky" @@ -4369,16 +5021,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4387,7 +5041,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4398,27 +5052,24 @@ msgstr "" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:82 msgid "List of SSH key files for auth" -msgstr "" +msgstr "Zoznam súborov s kľúčmi SSH pre autentifikáciu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" "Zoznam nadriadených serverov DNS, " "ktorým sa majú presmerovať požiadavky." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Načúvací port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Načúvacie rozhrania" @@ -4427,7 +5078,7 @@ msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" "Načúvať iba na zadaných rozhraniach, alebo na všetkých, ak nie sú určené" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4437,16 +5088,17 @@ msgstr "Obmedzenie načúvanie na tieto rozhrania a slučku." msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#, fuzzy msgid "Listening port for inbound DNS queries." -msgstr "" +msgstr "Port pre prichádzajúce DNS požiadavky." #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:130 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:54 msgid "Load" msgstr "Zaťaženie" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Priemerné zaťaženie" @@ -4454,27 +5106,28 @@ msgstr "Priemerné zaťaženie" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Načítavam údaje…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Načítava sa obsah priečinka…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Načítava sa zobrazenie…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Miestna adresa IP" @@ -4494,13 +5147,15 @@ msgstr "Miestna adresa IP na priradenie" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Miestna adresa IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#, fuzzy msgid "Local IPv6 DNS server" -msgstr "" +msgstr "Lokálny IPv6 DNS server" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:53 @@ -4514,44 +5169,70 @@ msgstr "Miestna adresa IPv6" msgid "Local Startup" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Miestny čas" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Miestna doména" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Miestny server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Iba miestna služba" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Lokalizovať požiadavky" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Prihlásiť sa" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Na prihlásenie…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Odhlásiť sa" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Úroveň výstupného záznamu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "" @@ -4560,8 +5241,9 @@ msgid "Logging" msgstr "Zaznamenávanie" #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:23 +#, fuzzy msgid "Logging in…" -msgstr "" +msgstr "Prihlasovanie…" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 @@ -4575,25 +5257,17 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Prihlásiť sa" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Odhlásiť sa" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Sekundy straty signálu (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#, fuzzy msgid "Lowest leased address as offset from the network address." +msgstr "Najnižšia prenajatá adresa ako ofset zo sieťovej adresy." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4601,11 +5275,12 @@ msgstr "" msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 +#, fuzzy msgid "MAC Address" -msgstr "" +msgstr "Adresa MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Filter MAC adries" @@ -4613,16 +5288,15 @@ msgstr "Filter MAC adries" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4631,11 +5305,15 @@ msgstr "" msgid "MAC address" msgstr "Adresa MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Filter adries MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Zoznam adries MAC" @@ -4649,6 +5327,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "Pravidlo MAP je neplatné" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4670,15 +5352,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4686,7 +5372,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4695,78 +5381,86 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Max. počet DHCP prenájmov" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" -"Max. veľkosť paketu EDNS0" +"Max. veľkosť EDNS0 paketu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Max. počet súbežných dotazov" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Maximálny povolený interval načúvania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." -msgstr "" +msgstr "Maximálny povolený počet aktívnych DHCP prenájmov." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." -msgstr "" +msgstr "Maximálny povolený počet súbežných požiadaviek DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." -msgstr "" +msgstr "Maximálny počet prenajatých adries." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Maximálny vysielací výkon" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Môže brániť fungovaniu VoIP alebo iných služieb." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4793,7 +5487,7 @@ msgstr "Pamäť" msgid "Memory usage (%)" msgstr "Využitie pamäte (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4801,10 +5495,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Spôsob sa nenašiel" @@ -4817,7 +5519,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4828,11 +5530,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4840,13 +5542,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4860,77 +5562,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Mobilné dáta" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Režim" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Model" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "" @@ -4998,6 +5707,10 @@ msgstr "" msgid "Move up" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5005,19 +5718,23 @@ msgstr "" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5029,12 +5746,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5047,18 +5768,23 @@ msgid "NTP server candidates" msgstr "Kandidáti serverov NTP" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Názov" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Názov novej siete" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigácia" @@ -5067,13 +5793,17 @@ msgstr "Navigácia" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Hlásenie susedov" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5082,45 +5812,50 @@ msgstr "" msgid "Network" msgstr "Sieť" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Sieťové nástroje" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Obraz sieťového zavedenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" -msgstr "" +msgstr "Sieťové zariadenie" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:7 +#, fuzzy msgid "Network device activity (kernel: netdev)" -msgstr "" +msgstr "Aktivita sieťového zariadenia (kernel: netdev)" #: modules/luci-base/htdocs/luci-static/resources/network.js:15 #: modules/luci-compat/luasrc/model/network.lua:33 msgid "Network device is not present" msgstr "Sieťové zariadenie nie je prítomné" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5129,7 +5864,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5138,25 +5873,33 @@ msgstr "" msgid "Network interface" msgstr "Sieťové rozhranie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 +#, fuzzy msgid "Network-ID" -msgstr "" +msgstr "Network-ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Nikdy" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" +"Nikdy nepresmerovávať zodpovedajúce domény a subdomény, prevádzať iba podľa " +"DHCP alebo súborov hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Nedá sa vytvoriť nové rozhranie „%s“: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Názov nového rozhrania…" @@ -5164,13 +5907,13 @@ msgstr "Názov nového rozhrania…" msgid "Next »" msgstr "Ďalej »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Nie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Pre toto rozhranie nie je nastavený server DHCP" @@ -5178,7 +5921,7 @@ msgstr "Pre toto rozhranie nie je nastavený server DHCP" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Žiadne šifrovanie" @@ -5194,20 +5937,34 @@ msgstr "Bez NAT-T" msgid "No RX signal" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " "mode should only be used to install a firmware upgrade" msgstr "" +"Žiadne zmeny nastavení sa neuložia a po reštarte sa stratia. Tento režim by " +"sa mal používať len na inštaláciu aktualizácie firmvéru" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:69 msgid "No client associated" msgstr "Nie je priradený žiadny klient" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5216,8 +5973,8 @@ msgstr "" msgid "No data received" msgstr "Neboli prijaté žiadne údaje" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5230,15 +5987,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "V tomto adresári nie sú žiadne položky" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Nenašli sa žiadne súbory" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5252,7 +6005,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5273,30 +6026,40 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Nie je nastavené heslo!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "Nepripojené" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5310,7 +6073,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Žiadna priradená zóna" @@ -5322,37 +6086,40 @@ msgstr "Žiadna priradená zóna" msgid "Noise" msgstr "Šum" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Šum:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Žiadny" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" -msgstr "" +msgstr "Normálna" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Nenájdené" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "" @@ -5365,9 +6132,10 @@ msgstr "Nepripojené" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 +#, fuzzy msgid "Not present" -msgstr "" +msgstr "Neprítomné" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 msgid "Not started on boot" @@ -5377,29 +6145,36 @@ msgstr "Nespustené po zavedení" msgid "Not supported" msgstr "Nepodporované" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" -msgstr "" +msgstr "Poznámky" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:188 msgid "Notice" -msgstr "" +msgstr "Oznámenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:333 +#, fuzzy msgid "Number of IGMP membership reports" -msgstr "" +msgstr "Počet hlásení o členstve v IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5416,7 +6191,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5427,6 +6202,7 @@ msgid "Obtain IPv6 address" msgstr "Získať adresu IPv6" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Vypnuté" @@ -5435,6 +6211,12 @@ msgstr "Vypnuté" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Zapnuté" @@ -5443,15 +6225,15 @@ msgstr "Zapnuté" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" -msgstr "" +msgstr "Musí byť zadaný názov hostiteľa alebo adresa MAC!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Jeden z nasledovných: %s" @@ -5469,7 +6251,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5478,49 +6264,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Otvoriť zoznam..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Pracovná frekvencia" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5528,20 +6325,29 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Voľba zmenená" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Voľba odstránená" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Voliteľné" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" +msgstr "Voliteľné, voľne formulované poznámky o tomto zariadení" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 @@ -5550,25 +6356,29 @@ msgid "" "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " "server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') " "for the interface." msgstr "" +"Voliteľné. Prípustné hodnoty: \"eui64\", \"random\", pevná hodnota ako " +"\"::1\" alebo \"::1:2\". Keď je prefix IPv6 (napríklad 'a:b:c:d::') prijatý " +"od delegujúceho servera, použite príponu (napríklad '::1') na vytvorenie " +"adresy IPv6 ('a:b:c:d::1') pre rozhranie." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Voliteľné. Popis účastníka." @@ -5576,13 +6386,13 @@ msgstr "Voliteľné. Popis účastníka." msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5597,11 +6407,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Voliteľné. Port účastníka." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5609,7 +6419,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5623,18 +6433,32 @@ msgstr "" msgid "Options" msgstr "Voľby" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 +#, fuzzy msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" for default route. 0.0.0.0 means \"the address of the " "system running dnsmasq\"." msgstr "" +"Možnosti pre Network-ID. (Poznámka: potrebuje aj Network-ID.) Napr. " +"\"42,192.168.1.4\" pre NTP server, \"3,192.168.4.4\" pre predvolenú trasu. 0.0.0.0 znamená \"adresu systému, " +"na ktorom beží dnsmasq\"." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "" @@ -5654,7 +6478,7 @@ msgstr "Výstupný:" msgid "Outgoing checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "" @@ -5662,6 +6486,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "" @@ -5685,21 +6510,25 @@ msgstr "Výstupná zóna" msgid "Overlap" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 +#, fuzzy msgid "Override IPv4 routing table" -msgstr "" +msgstr "Prepísať smerovaciu tabuľku IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 +#, fuzzy msgid "Override IPv6 routing table" -msgstr "" +msgstr "Prepísať smerovaciu tabuľku IPv6" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5707,6 +6536,7 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "Prepísať MTU" @@ -5728,7 +6558,7 @@ msgstr "" msgid "Override TTL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -5736,17 +6566,20 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 msgid "Override default interface name" -msgstr "" +msgstr "Prepísať predvolený názov rozhrania" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 msgid "Override the gateway in DHCP responses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 +#, fuzzy msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." msgstr "" +"Prepísať sieťovú masku odosielanú klientom. Normálne sa vypočítava z " +"podsiete, ktorá je obsluhovaná." #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 msgid "Override the table used for internal routes" @@ -5756,7 +6589,7 @@ msgstr "" msgid "Overview" msgstr "Prehľad" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "" @@ -5764,17 +6597,30 @@ msgstr "" msgid "Overwrite the current settings with the imported configuration?" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Vlastník" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (oba)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -5786,8 +6632,9 @@ msgid "PAP/CHAP password" msgstr "Heslo PAP/CHAP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -5798,6 +6645,7 @@ msgstr "Heslo PAP/CHAP" msgid "PAP/CHAP username" msgstr "Používateľské meno PAP/CHAP" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "Typ PDP" @@ -5807,8 +6655,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "PIN" @@ -5818,7 +6667,7 @@ msgstr "PIN" msgid "PIN code rejected" msgstr "Kód PIN bol zamietnutý" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "" @@ -5859,28 +6708,37 @@ msgstr "" msgid "PSID-bits length" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 -msgid "Packet Steering" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 +msgid "Packet Steering" +msgstr "Riadenie paketov" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "Pakety" @@ -5889,23 +6747,31 @@ msgstr "Pakety" msgid "Packets To Transmit Before Moving To Next Slave" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "Súčasť siete:" +msgstr[1] "Súčasť sietí:" +msgstr[2] "Súčasť sietí:" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Časť zóny %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Heslo" @@ -5913,11 +6779,11 @@ msgstr "Heslo" msgid "Password authentication" msgstr "Heslo pre overenie totožnosti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Heslo súkromného kľúča" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "Heslo vnútorného súkromného kľúča" @@ -5928,50 +6794,50 @@ msgstr "Heslo vnútorného súkromného kľúča" msgid "Password strength" msgstr "Sila hesla" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "Vložte alebo pretiahnite súbor kľúča SSH…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Cesta k súkromnému kľúču" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -5993,11 +6859,20 @@ msgstr "Pozastavené" msgid "Peak:" msgstr "Špička:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +#, fuzzy +msgid "Peer" +msgstr "Účastníci" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Adresa IP účastníka, ktorá sa má priradiť" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -6006,11 +6881,11 @@ msgstr "" msgid "Peer address is missing" msgstr "Chýba adresa účastníka" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6041,10 +6916,14 @@ msgstr "Vykonať obnovenie" msgid "Permission denied" msgstr "Prístup zamietnutý" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6053,13 +6932,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Fyzické nastavenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6072,11 +6951,11 @@ msgstr "Ping" msgid "Pkts." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Prosím, zadajte vaše používateľské meno a heslo." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Prosím, vyberte súbor na odovzdanie." @@ -6084,56 +6963,74 @@ msgstr "Prosím, vyberte súbor na odovzdanie." msgid "Policy" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "Stav portov" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Stav portu:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Režim správy napájania" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Uprednostniť LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Predzdieľaný kľúč" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6156,13 +7053,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Zabráni komunikácii medzi klientmi" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6175,29 +7073,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Súkromný kľúč" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6215,8 +7115,8 @@ msgid "Prot." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6228,13 +7128,13 @@ msgstr "Protokol" msgid "Provide NTP server" msgstr "Poskytnúť server NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6244,35 +7144,51 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Verejný kľúč" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " "device, paste an OpenSSH compatible public key line or drag a .pub file into the input field." msgstr "" +"Verejné kľúče umožňujú prihlásenie SSH bez hesla s vyššou bezpečnosťou v " +"porovnaní s použitím obyčajných hesiel. Ak chcete do zariadenia nahrať nový " +"kľúč, vložte riadok verejného kľúča kompatibilného s OpenSSH alebo presuňte " +"súbor .pub do vstupného poľa." #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 +#, fuzzy msgid "Public prefix routed to this device for distribution to clients." -msgstr "" +msgstr "Verejný prefix smerovaný do tohto zariadenia pre distribúciu klientom." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:305 msgid "PublicKey setting is invalid" @@ -6287,59 +7203,83 @@ msgstr "" msgid "Quality" msgstr "Kvalita" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Prah RTS/CTS" @@ -6352,10 +7292,18 @@ msgstr "Prijímanie" msgid "RX Rate" msgstr "Rýchlosť prijímania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "Rýchl. prijímania /odosielania" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"Meranie rádiových zdrojov – odosiela signály na uľahčenie roamingu. Nie " +"všetci klienti to podporujú." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6365,13 +7313,12 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 +#, fuzzy msgid "Read /etc/ethers to configure the DHCP server." -msgstr "" -"prečítajte si /etc/ethers na nastavenie servera DHCP." +msgstr "Prečítajte si /etc/ethers pre nastavenie servera DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Skutočne sa má prepnúť protokol?" @@ -6379,11 +7326,11 @@ msgstr "Skutočne sa má prepnúť protokol?" msgid "Realtime Graphs" msgstr "Grafy v reálnom čase" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6407,24 +7354,53 @@ msgstr "Vykoná reštart operačného systému vášho zariadenia" msgid "Receive" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "Zahodené prijaté" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +#, fuzzy +msgid "Receive errors" +msgstr "Chyby prijatia" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "Prijaté bajty" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "Prijaté multicast" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "Prijaté pakety" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Opätovne pripojiť toto rozhranie" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:14 msgid "Redirect to HTTPS" -msgstr "" +msgstr "Presmerovať na HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6433,37 +7409,47 @@ msgstr "" msgid "References" msgstr "Referencie" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Obnoviť kanály" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Obnovovanie" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "" @@ -6473,6 +7459,10 @@ msgstr "" msgid "Relay Bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "" @@ -6482,6 +7472,14 @@ msgstr "" msgid "Relay bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6491,6 +7489,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6503,17 +7502,25 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Odstrániť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" -msgstr "" +msgstr "Nahradiť bezdrôtovú konfiguráciu" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:17 msgid "Request IPv6-address" @@ -6541,7 +7548,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Vyžadované" @@ -6557,7 +7565,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6569,67 +7577,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Vyžaduje balík wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6638,7 +7652,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6653,20 +7667,24 @@ msgstr "" msgid "Reset to defaults" msgstr "Obnoviť na predvolené hodnoty" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Súbory Resolv a Hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Prostriedok sa nenašiel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Reštartovať" @@ -6675,7 +7693,7 @@ msgstr "Reštartovať" msgid "Restart Firewall" msgstr "Reštartovať bránu Firewall" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Reštartovať rádiové rozhranie" @@ -6687,86 +7705,97 @@ msgstr "Obnoviť" msgid "Restore backup" msgstr "Obnoviť zo zálohy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Odkryť/skryť heslo" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Vrátiť späť" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Vrátiť zmeny" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Vracia sa späť konfigurácia…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6781,19 +7810,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Typ smerovania" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6811,6 +7840,10 @@ msgstr "Heslo smerovača" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6825,24 +7858,24 @@ msgstr "" msgid "Rule" msgstr "Pravidlo" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6862,11 +7895,24 @@ msgstr "" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6884,22 +7930,22 @@ msgstr "Port servera SSH" msgid "SSH username" msgstr "Meno používateľa SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "Kľúče SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:9 msgid "SSTP" -msgstr "" +msgstr "SSTP" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:41 msgid "SSTP Server" @@ -6909,7 +7955,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6920,7 +7966,7 @@ msgid "Save" msgstr "Uložiť" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Uložiť a použiť" @@ -6937,7 +7983,7 @@ msgstr "Uložiť mtdblock" msgid "Save mtdblock contents" msgstr "Uložiť obsah mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Prehľadať" @@ -6946,11 +7992,16 @@ msgstr "Prehľadať" msgid "Scheduled Tasks" msgstr "Naplánované úlohy" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Sekcia pridaná" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Sekcia odstránená" @@ -6964,10 +8015,13 @@ msgid "" "fails. Use only if you are sure that the firmware is correct and meant for " "your device!" msgstr "" +"Vyberte „Vynútiť aktualizáciu“, ak chcete nahrať firmvér, aj keď kontrola " +"formátu obrazu zlyhá. Používajte iba vtedy, ak ste si istí, že firmvér je " +"správny a určený pre vaše zariadenie!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Vybrať súbor…" @@ -6975,13 +8029,13 @@ msgstr "Vybrať súbor…" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -7000,13 +8054,17 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Server" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" -msgstr "" +msgstr "Adresa servera" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" -msgstr "" +msgstr "Názov servera" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 msgid "Service Name" @@ -7029,33 +8087,41 @@ msgstr "Relácia vypršala" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 +#, fuzzy msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." msgstr "" +"Nastaviť vlastnosti rozhrania bez ohľadu na stav linky (ak je nastavené, " +"udalosti zmeny stavu linky nevyvolajú obsluhu zmeny pripojenia (hotplug " +"handlers)." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:302 msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7069,11 +8135,15 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Nastavenie servera DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7081,35 +8151,41 @@ msgid "Setting PLMN failed" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 -msgid "Settings" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 +msgid "Settings" +msgstr "Nastavenia" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" +"Nastavenia pre asistenciu bezdrôtovým klientom pri roamingu medzi viacerými " +"AP: 802.11r, 802.11k a 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" -msgstr "" +msgstr "Zobraziť aktuálny zoznam zálohovaných súborov" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 msgid "Show empty chains" @@ -7120,16 +8196,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Vypnúť toto rozhranie" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7137,15 +8213,15 @@ msgstr "Vypnúť toto rozhranie" msgid "Signal" msgstr "Signál" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Signál / Šum" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7153,12 +8229,12 @@ msgstr "" msgid "Signal:" msgstr "Signál:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Veľkosť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7175,12 +8251,12 @@ msgstr "Preskočiť" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Preskočiť na obsah" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Preskočiť na navigáciu" @@ -7198,14 +8274,10 @@ msgstr "Softvérová VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "Niektoré polia sú neplatné. Nedajú sa uložiť hodnoty!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Prepáčte, objekt, ktorý ste požadovali sa nenašiel." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Prepáčte, serve narazil na neočakávanú chybu." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7213,8 +8285,8 @@ msgid "" "instructions." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7241,26 +8313,33 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" +"Určuje pevný zoznam vyhľadávacích domén DNS, ktoré sa majú oznámiť " +"prostredníctvom DHCPv6. Ak sa neurčí, oznámi sa vyhľadávacia doména DNS " +"miestneho zariadenia." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 +#, fuzzy msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" +"Určuje pevný zoznam adries IPv6 DNS serverov, ktoré sa majú oznamovať cez " +"DHCPv6. Ak nie je zadané, zariadenie sa ohlási ako IPv6 DNS server, pokiaľ " +"nie je zakázaná možnosť Lokálny IPv6 DNS server." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7285,7 +8364,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7293,7 +8372,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7301,20 +8380,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "Určuje adresár, ku ktorému bude pričlenené zariadenie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7342,7 +8421,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7362,7 +8441,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7393,15 +8472,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7423,19 +8502,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7455,12 +8534,16 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 +#, fuzzy msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " "wireless settings." msgstr "" +"Určuje káblové porty, ktoré sa majú pripojiť k tomuto mostu. Ak chcete " +"pripojiť bezdrôtové siete, v nastaveniach bezdrôtovej siete vyberte " +"príslušné rozhranie ako sieť." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:383 msgid "" @@ -7550,37 +8633,45 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Tu určte kľúč s tajným šifrovaním." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "Rýchlosť: %d Mibit/s, Duplex: %s" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" -msgstr "Spustiť" +msgstr "Štart" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:140 msgid "Start WPS" -msgstr "" +msgstr "Spustiť WPS" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:76 msgid "Start priority" msgstr "Počiatočná priorita" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Spustiť obnovu" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Spúšťa sa aplikovanie konfigurácie…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Spúšťa sa prehľadávanie bezdrôtových sietí..." @@ -7589,6 +8680,10 @@ msgstr "Spúšťa sa prehľadávanie bezdrôtových sietí..." msgid "Startup" msgstr "Po spustení" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Statické IPv4 smerovania" @@ -7600,9 +8695,9 @@ msgstr "Statické IPv6 smerovania" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:91 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:138 msgid "Static Lease" -msgstr "" +msgstr "Statický prenájom" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Statické prenájmy" @@ -7612,47 +8707,52 @@ msgstr "Statické prenájmy" msgid "Static address" msgstr "Pevná adresa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 +#, fuzzy msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" +"Statické prenájmy sa používajú na prideľovanie pevných IP adries a " +"symbolických názvov hostiteľov DHCP klientom. Sú tiež vyžadované pre " +"nedynamické konfigurácie rozhraní, kde sú obsluhovaní iba klienti s " +"príslušným prenájmom." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Limit nečinnosti stanice" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Stav" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Zastaviť" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:135 msgid "Stop WPS" -msgstr "" +msgstr "Zastaviť WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Zastaviť obnovu" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:24 msgid "Storage" -msgstr "" +msgstr "Úložisko" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "" @@ -7661,17 +8761,17 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Odoslať" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" -msgstr "" +msgstr "Potlačiť zaznamenávanie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." -msgstr "" +msgstr "Potlačiť protokolovanie rutinnej prevádzky pre protokol DHCP." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:46 msgid "Swap free" @@ -7700,7 +8800,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Prepnúť protokol" @@ -7710,7 +8810,7 @@ msgstr "Prepnúť protokol" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Symbolický odkaz" @@ -7722,8 +8822,16 @@ msgstr "Synch. so serverom NTP" msgid "Sync with browser" msgstr "Synch. s prehliadačom" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7747,9 +8855,9 @@ msgstr "Vlastnosti systému" msgid "System log buffer size" msgstr "Veľkosť vyrovnávacej pamäte systémového denníka" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7778,7 +8886,7 @@ msgstr "" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Koreňový priečinok servera TFTP" @@ -7791,61 +8899,73 @@ msgstr "Odosielanie" msgid "TX Rate" msgstr "Rýchlosť odosielania" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" -msgstr "" +msgstr "Dĺžka fronty TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tabuľka" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Cieľ" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" -msgstr "" +msgstr "Cieľová platforma" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:103 msgid "Target network" msgstr "Cieľová sieť" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:36 +#, fuzzy msgid "Temp space" -msgstr "" +msgstr "Dočasné miesto" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:50 msgid "Terminate" msgstr "Vypovedať" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7861,11 +8981,18 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 +#, fuzzy msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" msgstr "" +"Záznamy serverov DNS v lokálnom resolv.conf sú primárne zoradené podľa váhy " +"zadanej tu" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:77 msgid "" @@ -7873,18 +9000,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" -msgstr "" +msgstr "IP adresu %h už používa iný statický prenájom" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7892,6 +9025,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7906,6 +9040,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7916,9 +9056,9 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." -msgstr "" +msgstr "LED dióda bliká, aby simulovala skutočný tlkot srdca." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:8 msgid "" @@ -7933,21 +9073,26 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 +#, fuzzy msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" -msgstr "" +msgstr "MAC adresu %h už používa iný statický prenájom v rovnakom DHCP poole" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -7959,13 +9104,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "Konfiguračný súbor sa nepodarilo načítať, kvôli nasledovnej chybe:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -7975,6 +9120,12 @@ msgid "" "or revert all pending changes to keep the currently working configuration " "state." msgstr "" +"Zariadenie nebolo možné dosiahnuť do %d sekúnd po aplikovaní čakajúcich " +"zmien, čo spôsobilo, že konfigurácia bola z bezpečnostných dôvodov vrátená " +"späť. Ak sa domnievate, že zmeny konfigurácie sú napriek tomu správne, " +"aplikujte konfiguráciu bez kontroly. Prípadne môžete toto upozornenie zrušiť " +"a upraviť zmeny pred pokusom o opätovné aplikovanie alebo vrátiť všetky " +"čakajúce zmeny, aby ste zachovali aktuálne fungujúci stav konfigurácie." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:281 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:393 @@ -7983,18 +9134,19 @@ msgid "" "
    /dev/sda1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#, fuzzy msgid "The device name \"%s\" is already taken" -msgstr "" +msgstr "Názov zariadenia \"%s\" sa už používa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8015,7 +9167,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "V tomto systéme sú momentálne aktívne nasledujúce pravidlá." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -8023,17 +9175,17 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "Adresa brány nemôže byť miestna adresa IP" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "Poskytnutý verejný kľúč SSH bol už pridaný." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8041,15 +9193,32 @@ msgstr "" "Poskytnutý verejný kľúč SSH nie je platný. Prosím, poskytnite správne " "verejné kľúče RSA alebo ECDSA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 -msgid "The hostname of the boot server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 +#, fuzzy +msgid "The hostname of the boot server" +msgstr "Názov hostiteľa boot servera" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "Rozhranie sa nepodarilo nájsť" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Názov rozhrania sa už používa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Názov rozhrania je príliš dlhý" @@ -8072,6 +9241,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8086,7 +9256,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8095,7 +9265,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8103,19 +9273,21 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" +"Sieťový prístup k tomuto zariadeniu by mohol byť prerušený zmenou nastavení " +"rozhrania \"%h\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Názov siete sa už používa" @@ -8129,14 +9301,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8149,39 +9321,40 @@ msgstr "Príkaz reštartovať zlyhal s kódom %d" msgid "The restore command failed with code %d" msgstr "Príkaz obnovenia zlyhal s kódom %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "Vybraný režim %s nie je kompatibilný so šifrovaním %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" -msgstr "" +msgstr "Zadaný bezpečnostný token je neplatný alebo jeho platnosť už vypršala!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:98 msgid "" "The system is erasing the configuration partition now and will reboot itself " "when finished." msgstr "" +"Systém teraz vymazáva konfiguračný oddiel a po dokončení sa sám reštartuje." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:320 msgid "" @@ -8209,12 +9382,23 @@ msgstr "Systémové heslo bolo úspešne zmenené." msgid "The sysupgrade command failed with code %d" msgstr "Príkaz sysupgrade zlyhal s kódom %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " "listed below. Press \"Continue\" to restore the backup and reboot, or " "\"Cancel\" to abort the operation." msgstr "" +"Nahraný záložný archív sa zdá byť platný a obsahuje súbory uvedené nižšie. " +"Stlačením tlačidla \"Pokračovať\" obnovíte zálohu a reštartujete počítač, " +"alebo stlačením tlačidla \"Zrušiť\" operáciu prerušíte." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:115 msgid "The uploaded backup archive is not readable" @@ -8230,30 +9414,38 @@ msgid "" "you choose the generic image format for your platform." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 +#, fuzzy msgid "There are no active leases" -msgstr "" +msgstr "Nie sú žiadne aktívne prenájmy" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Nie sú žiadne zmeny na aplikovanie" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8266,22 +9458,26 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" "Tento typ overenia totožnosti nie je použiteľný pre vybraný spôsob EAP." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 +#, fuzzy msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " "configurations are automatically preserved." msgstr "" +"Toto je zoznam globálnych vzorov shellu pre hľadanie súborov a adresárov, " +"ktoré sa majú zahrnúť počas sysupgrade. Zmenené súbory v /etc/config/ a " +"niektoré ďalšie konfigurácie sú automaticky zachované." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 msgid "" @@ -8289,6 +9485,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8303,7 +9510,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "Toto je jediný server configuration import
    instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Na prihlásenie…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8405,7 +9617,7 @@ msgstr "" "tlačidlo „VykonaÅ¥ obnovenie“ (to je možné iba pri obrázkoch vo formáte " "squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8413,12 +9625,16 @@ msgstr "" msgid "Total Available" msgstr "Celková dostupná" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8430,11 +9646,11 @@ msgstr "Prenos" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8451,6 +9667,26 @@ msgstr "" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "Zahodené odoslané" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "Chyby odoslania" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "Odoslané bajty" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "Odoslané pakety" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8489,22 +9725,22 @@ msgstr "Rozhranie tunela" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 msgid "Tx-Power" -msgstr "" +msgstr "Vysielací výkon" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Typ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8553,7 +9789,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8604,25 +9840,41 @@ msgstr "Nie je možné reÅ¡tartovaÅ¥ bránu firewall: %s" msgid "Unable to save contents: %s" msgstr "Nie je možné uložiÅ¥ obsah: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " "analogous to IPv4 private network addressing. This prefix is randomly " "generated at first install." msgstr "" +"Unikátna lokálna adresa - v rozsahu fc00::/7. Zvyčajne len v " +"rámci ‘lokálnej’ polovice fd00::/8. ULA pre IPv6 je obdobou " +"adresovania privátnej siete IPv4. Tento prefix je pri prvej inÅ¡talácii " +"náhodne vygenerovaný." #: modules/luci-base/htdocs/luci-static/resources/network.js:2092 #: modules/luci-compat/luasrc/model/network.lua:971 @@ -8630,7 +9882,7 @@ msgstr "" msgid "Unknown" msgstr "Neznáme" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8654,11 +9906,11 @@ msgstr "Nespravované" msgid "Unmount" msgstr "OdpojiÅ¥" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Kľúč bez názvu" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Neuložené zmeny" @@ -8672,15 +9924,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Nepodporovaný modem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Nepodporovaný typ protokolu." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8692,7 +9954,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "OdovzdaÅ¥" @@ -8709,58 +9971,66 @@ msgstr "" msgid "Upload archive..." msgstr "OdovzdaÅ¥ archív..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "OdovzdaÅ¥ súbor" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "OdovzdaÅ¥ súbor…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Požiadavka na odovzdanie zlyhala: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Odovzdáva sa súbor…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" -"DNS servery budú dotazované v " +"DNS servery budú dotazované v " "poradí uvedenom v súbore resolv." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Doba spustenia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "PoužiÅ¥ súbor /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "PoužiÅ¥ servery inzerované DHCP" @@ -8769,13 +10039,18 @@ msgstr "PoužiÅ¥ servery inzerované DHCP" msgid "Use DHCP gateway" msgstr "PoužiÅ¥ bránu DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8821,22 +10096,26 @@ msgstr "" msgid "Use broadcast flag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "PoužiÅ¥ zabudovanú správu IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "PoužiÅ¥ vlastné servery DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 +#, fuzzy msgid "Use default gateway" -msgstr "" +msgstr "PoužiÅ¥ predvolenú bránu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "PoužiÅ¥ metriku brány" @@ -8860,15 +10139,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8876,6 +10155,12 @@ msgid "" "the requesting host. The optional Lease time can be used to set non-" "standard host-specific lease time, e.g. 12h, 3d or infinite." msgstr "" +"Pomocou tlačidla PridaÅ¥ pridajte nový záznam o prenájme (lease). " +"Adresa MAC identifikuje klienta, adresa IPv4 určuje pevnú " +"adresu, ktorá sa má použiÅ¥, a Názov hostiteľa je pridelený ako " +"symbolický názov požadujúcemu hostiteľovi. Voliteľný Čas prenájmu " +"sa dá použiÅ¥ na nastavenie neÅ¡tandardného času prenájmu Å¡pecifického pre " +"hostiteľa, napr. 12h, 3d alebo infinite (nekonečno)." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:324 msgid "Use upper layer protocol information (layer3+4)" @@ -8891,69 +10176,73 @@ msgstr "" msgid "Used" msgstr "Využitá" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" +"Používané pre dva rôzne účely: RADIUS NAS ID a 802.11r R0KH-ID. Nie je " +"potrebné pri normálnom WPA(2)-PSK." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Používateľské meno" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -8973,24 +10262,27 @@ msgstr "Miestna adresa siete VPN" msgid "VPN Local port" msgstr "Miestny port siete VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Server VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Port servera VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -8999,6 +10291,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -9012,14 +10308,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9045,7 +10341,7 @@ msgstr "Dodávateľ" msgid "Vendor Class to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9053,12 +10349,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Overuje sa odovzdaný súbor obrazu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" -msgstr "" +msgstr "Veľmi vysoká" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9066,34 +10362,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "Virtuálne dynamické rozhranie" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Zdieľaný kľúč WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Heslo WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Režim WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "Režim spánku WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "Opravy režimu spánku WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Heslo WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9101,7 +10409,7 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:153 msgid "WPS status" -msgstr "" +msgstr "Stav WPS" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:47 msgid "Waiting for device..." @@ -9120,48 +10428,110 @@ msgstr "Varovanie: Existujú neuložené zmeny, ktoré sa pri reštarte stratia! msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 +#, fuzzy msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" +"Pri delegovaní prefixov do viacerých downstreamov sa pri prideľovaní " +"podsietí najprv zohľadnia rozhrania s vyššou hodnotou preferencie." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" +"Pri použití PSK môže byť PMK generovaný automaticky. Keď je aktivované, " +"nižšie uvedené možnosti kľúča R0/R1 sa nepoužijú. Ak chcete použiť možnosti " +"kľúčov R0 a R1, zakážte túto možnosť." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" +"Ak je režim Wi-Fi Multimedia (WMM) QoS zakázaný, klienti môžu byť obmedzení " +"na rýchlosti 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" +"Ak je ESSID skryté, roaming klientov môže zlyhať a efektívnosť využitia " +"vysielacieho času sa môže výrazne znížiť." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Šírka" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +#, fuzzy +msgid "WireGuard Status" +msgstr "Stav WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9177,21 +10547,21 @@ msgid "Wireless Adapter" msgstr "Bezdrôtový adaptér" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Bezdrôtová sieť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Prehľad bezdrôtových sietí" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Zabezpečenie bezdrôtovej siete" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Migrácia bezdrôtovej konfigurácie" @@ -9207,17 +10577,17 @@ msgstr "Bezdrôtová sieť je zakázaná" msgid "Wireless is not associated" msgstr "Bezdrôtová sieť nie je priradená" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Bezdrôtová sieť je zakázaná" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Bezdrôtová sieť je povolená" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." -msgstr "" +msgstr "Zapisovať prijaté DNS požiadavky do syslogu." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:181 msgid "Write system log to file" @@ -9227,7 +10597,7 @@ msgstr "Zapísať systémový denník do súboru" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9254,8 +10624,20 @@ msgstr "" "základné iniciačné skripty, napríklad „sieť“, vaše zariadenie by sa mohlo " "stať neprístupným!
    " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9284,34 +10666,55 @@ msgstr "Nastavenia ZRam" msgid "ZRam Size" msgstr "Veľkosť ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "automaticky (zakázané)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +#, fuzzy +msgid "automatic (enabled)" +msgstr "automaticky (povolené)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "" @@ -9368,24 +10771,29 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "zakázaný" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" -msgstr "" +msgstr "zakázané" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" -msgstr "Predvolené ovládačom" +msgstr "predvolené ovládačom" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "predvolené ovládačom (%s)" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" @@ -9395,14 +10803,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "povolené" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9412,22 +10829,22 @@ msgstr "" msgid "forward" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "" @@ -9436,9 +10853,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "hybridný režim" @@ -9446,6 +10863,10 @@ msgstr "hybridný režim" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9460,11 +10881,19 @@ msgstr "kľúč v rozpätí 8 a 63 znakov" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "stredné zabezpečenie" @@ -9473,11 +10902,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9487,20 +10916,28 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 msgid "no" -msgstr "" +msgstr "nie" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "bez linky" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "nejaká hodnota" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "žiadne" @@ -9511,20 +10948,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "vypnuté" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "otvorená sieť" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9533,6 +10970,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9550,23 +10991,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "náhodne generované" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "smerované" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "sek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9574,7 +11024,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "silné zabezpečenie" @@ -9582,36 +11032,42 @@ msgstr "silné zabezpečenie" msgid "tagged" msgstr "označené" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 +#, fuzzy msgid "" "uHTTPd offers HTTP or " "HTTPS network " "access." msgstr "" +"uHTTPd ponúka sieťový prístup HTTP alebo HTTPS." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "jedinečná hodnota" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "neznámy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "neobmedzené" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9633,8 +11089,8 @@ msgid "untagged" msgstr "neoznačené" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9647,7 +11103,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9676,7 +11132,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9713,8 +11169,8 @@ msgstr "" msgid "valid address:port" msgstr "platná adresa:port" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9754,11 +11210,25 @@ msgstr "platná celá hodnota" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#, fuzzy +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"platný názov sieťového zariadenia medzi 1 a 15 znakov, ktorý neobsahuje \":" +"\", \"/\", \"%\" alebo medzery" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +#, fuzzy +msgid "valid network device name, not \".\" or \"..\"" +msgstr "platný názov sieťového zariadenia, nie \".\" alebo \"..\"" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "platná sieť v anotácii adresa/sieťová maska" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "platné telefónne číslo (0-9, \"*\", \"#\", \"!\" or \".\")" @@ -9768,43 +11238,43 @@ msgid "valid port or port range (port1-port2)" msgstr "platný port alebo rozsah portov (port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "platná hodnota portu" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "platný čas (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "hodnota v rozpätí %d a %d znakov" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "hodnota v rozpätí %f a %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "hodnota väčšia alebo rovná %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "hodnota menšia alebo rovná %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "hodnota s počtom znakov: %d" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "hodnota aspoň s počtom znakov: %d" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "hodnota s maximálnym počtom znakov: %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "slabé zabezpečenie" diff --git a/package/luci/modules/luci-base/po/sv/base.po b/package/luci/modules/luci-base/po/sv/base.po index e8ecf242b4..44543d4dba 100644 --- a/package/luci/modules/luci-base/po/sv/base.po +++ b/package/luci/modules/luci-base/po/sv/base.po @@ -1,34 +1,50 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-12-04 12:08+0000\n" +"PO-Revision-Date: 2023-10-02 03:20+0000\n" "Last-Translator: Kristoffer Grundström \n" -"Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" tabell \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d ogiltiga fält(en)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%dt sedan" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%dm sedan" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%ds sedan" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s är inte taggad i flera VLAN!" @@ -53,10 +69,11 @@ msgstr "(tomt)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(inga gränssnitt har bifogats)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d mer" @@ -66,19 +83,19 @@ msgid "-- Additional Field --" msgstr "-- Ytterligare fält --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Vänligen välj --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- anpassad --" @@ -104,7 +121,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = använder inte RSSI-tröskel, 1 = ändra inte drivrutinens standard" @@ -117,13 +134,18 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Belastning senaste minuten:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "1 flagga" msgstr[1] "%d flaggor" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "Belastning senaste 15 minutrarna:" @@ -138,12 +160,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "fyrställigt hexadecimalt ID" @@ -156,45 +183,100 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Belastning senaste 5 minuterna:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "treställig hexadecimal sträng utan kolon" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r Snabb övergång" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "Max tidsfrist för svar på 802.11w uppkopplingsbegäran (SA Query)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" "802.11w Association SA Query retry timeout (tidsåtgång för förnyad sökning)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w Management ramskydd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w maximal timeout" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w tidsgräns för förnyat försök" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" # I don't think "Gateway" is commonly translated. -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-nätmask" @@ -206,30 +288,44 @@ msgstr "LED-konfiguration" msgid "LED Name" msgstr "LEDNamn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA-flaggor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA Hoppgräns" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA Livstid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-tjänst" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/matchar någon domän. exempel.com/återger " +"NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -276,11 +372,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "En konfiguration för enheten \"%s\" finns redan" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "En katalog med samma namn finns redan." @@ -288,25 +392,90 @@ msgstr "En katalog med samma namn finns redan." msgid "A new login is required since the authentication session expired." msgstr "En ny inloggning krävs då autentiseringssessionen har upphört." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -340,57 +509,60 @@ msgstr "ARP-övervakning stöds inte för den valda policyn!" msgid "ARP retry threshold" msgstr "ARP-tröskel för nya försök" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "Trafik-tabell \"%h\" för ARP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Asynkronymt överföringsläge)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM-bryggor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " "to dial into the provider network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM enhetsnummer" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Frånvarande gränssnitt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Acceptera DNS-förfrågningar endast från värdar vars adress är i ett lokalt " "undernät." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Acceptera lokal" @@ -399,7 +571,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Acceptera paket" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Acceptera paket med lokala källadresser" @@ -407,16 +579,25 @@ msgstr "Acceptera paket med lokala källadresser" msgid "Access Concentrator" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Accesspunkt" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Åtgärder" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Aktiv" @@ -454,8 +635,8 @@ msgstr "Aktiva IPv6-regler" msgid "Active-Backup policy (active-backup, 1)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -472,18 +653,18 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Lägg till" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Lägg till ATM-brygga" @@ -503,11 +684,11 @@ msgstr "Lägg till LED-åtgärd" msgid "Add VLAN" msgstr "Lägg till VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Lägg till enhetskonfiguration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Lägg till enhetskonfiguration…" @@ -515,18 +696,18 @@ msgstr "Lägg till enhetskonfiguration…" msgid "Add instance" msgstr "Lägg till instans" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Lägg till nyckel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "Lägg till lokala domänsuffix i namn från host-filer." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Lägg till ett nytt gränssnitt..." @@ -534,6 +715,10 @@ msgstr "Lägg till ett nytt gränssnitt..." msgid "Add peer" msgstr "Lägg till en jämlike" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Lägg till i Blockeringslistan" @@ -542,11 +727,11 @@ msgstr "Lägg till i Blockeringslistan" msgid "Add to Whitelist" msgstr "Lägg till i Vitlista" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Ytterligare värdfiler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Ytterligare server-filer" @@ -563,7 +748,11 @@ msgstr "Ytterligare server-filer" msgid "Address" msgstr "Adress" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Adressfamilj" @@ -576,7 +765,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "Adress för att komma åt lokal reläbrygga" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Adresser" @@ -585,28 +774,28 @@ msgstr "Adresser" msgid "Administration" msgstr "Administration" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Avancerade inställningar" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Avancerade enhetsalternativ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 @@ -641,18 +830,18 @@ msgstr "Alias-gränssnitt" msgid "Alias of \"%s\"" msgstr "Alias för \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Alla Servrar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" "Allokera IP-adresser sekventiellt med start från den lägsta möjliga adressen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Allokera IP sekventiellt" @@ -660,11 +849,11 @@ msgstr "Allokera IP sekventiellt" msgid "Allow SSH password authentication" msgstr "Tillåt SSH lösenordsautentisering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Tillåt alla utom listade" @@ -672,15 +861,15 @@ msgstr "Tillåt alla utom listade" msgid "Allow full UCI access for legacy applications" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Tillåt enbart listade" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Tillåt localhost" @@ -703,19 +892,24 @@ msgid "Allow system feature probing" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Tillåt root-användaren att logga in med lösenord" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "Tillåtna IP-adresser" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Alltid" @@ -727,13 +921,13 @@ msgstr "Alltid av (kärna: ingen)" msgid "Always on (kernel: default-on)" msgstr "Alltid på (kärna: standard-på)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "Skicka alltid DHCP-alternativ. Ibland så behövs det med till exempel " "PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -741,10 +935,14 @@ msgstr "" "Använd alltid 40 MHz-kanaler även om den sekundära kanalen överlappar. Att " "använda detta alternativ överensstämmer inte med IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Ett fel inträffade när formuläret skulle sparas:" @@ -753,72 +951,21 @@ msgstr "Ett fel inträffade när formuläret skulle sparas:" msgid "An optional, short description for this device" msgstr "En valfri, kort beskrivning för den här enheten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Tillbyggnad" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Tillbyggnad A + L +M (alla)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Tillbyggnad A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Tillbyggnad A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Tillbyggnad A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Tillbyggnad A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Tillbyggnad B (alla)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Tillbyggnad B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Tillbyggnad B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Tillbyggnad B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Tillbyggnad J (alla)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Tillbyggnad L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Tillbyggnad M (alla)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Tillbyggnad M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Tillbyggnad M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Tillkännage den här enheten som en IPv6 DNS-server." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -826,7 +973,7 @@ msgstr "" "Tillkännage den här enheten som en standard-router om en lokal standard-rutt " "för IPv6 är närvarande." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -834,21 +981,21 @@ msgstr "" "Tillkännage den här enheten som en standard-router om en publik IPv6-prefix " "är tillgänglig oavsett tillgänglighet för standardrutt." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Tillkännagivna DNS-domäner" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Tillkännagivna IPv6 DNS-servrar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Anonym identitet" @@ -860,7 +1007,7 @@ msgstr "Anonym montering" msgid "Anonymous Swap" msgstr "Anonym Swap" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -872,11 +1019,11 @@ msgstr "" msgid "Any zone" msgstr "Någon zon" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "Verkställ DHCP-alternativ till det här nätet. (Tom = alla klienter)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -884,46 +1031,50 @@ msgstr "" msgid "Apply backup?" msgstr "Verkställ säkerhetskopia?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Verkställer ändringar i konfigurationen... %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Arkitektur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Tilldela en del av en given längd av varje offentligt IPv6-prefix till det " "här gränssnittet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Associerade stationer" @@ -932,15 +1083,15 @@ msgstr "Associerade stationer" msgid "Associations" msgstr "Associationer" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -951,25 +1102,26 @@ msgid "Attempt to enable configured mount points for attached devices" msgstr "" "Försök att aktivera konfigurerade monteringspunkter för anslutna enheter" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Autentiseringsgrupp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Autentisering" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Typ av autentisering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Auktoritär" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Tillstånd krävs" @@ -977,7 +1129,9 @@ msgstr "Tillstånd krävs" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -995,7 +1149,7 @@ msgstr "Automatiskt hemnet (HNCP)" msgid "Automatically check filesystem for errors before mounting" msgstr "Kolla efter fel i filsystemet automatiskt innan det monteras" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1017,6 +1171,10 @@ msgstr "Monstera filsystem automatiskt" msgid "Automount Swap" msgstr "Montera Swap automatiskt" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Tillgänglig" @@ -1035,11 +1193,15 @@ msgstr "Tillgänglig" msgid "Average:" msgstr "Snitt:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1047,15 +1209,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Bakåt" @@ -1064,11 +1230,7 @@ msgstr "Bakåt" msgid "Back to Overview" msgstr "Backa till Överblick" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Backa till konfiguration" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1081,16 +1243,15 @@ msgid "Backup / Flash Firmware" msgstr "Säkerhetskopiera / Flasha inre mjukvara" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Säkerhetskopiera fillista" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Band" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Basenhet" @@ -1098,12 +1259,35 @@ msgstr "Basenhet" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1114,7 +1298,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1123,18 +1307,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Bind gränssnitt" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1146,65 +1343,77 @@ msgstr "Bind tunneln till det här gränssnittet (valfritt)." msgid "Bitrate" msgstr "Bithastighet" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Brygga" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Brygga (Stötta direktkommunikation mellan MAC-VLAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "VLAN-filtrering för brygga" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Bryggenhet" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "Port-specifika alternativ för brygga" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Portar för brygga" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Enhetsnummer för brygga" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Slå på vid uppstart" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Bläddra…" @@ -1212,15 +1421,37 @@ msgstr "Bläddra…" msgid "Buffered" msgstr "Buffrad" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "CA-certifikat; om tom så kommer den att sparas efter första anslutningen." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "CLAT konfiguration misslyckades" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "CPU-användning (%)" @@ -1235,18 +1466,23 @@ msgstr "" msgid "Call failed" msgstr "Anrop misslyckades" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Avbryt" @@ -1254,32 +1490,32 @@ msgstr "Avbryt" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1288,45 +1524,53 @@ msgstr "" msgid "Category" msgstr "Kategori" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1338,16 +1582,16 @@ msgstr "" msgid "Chain" msgstr "Kedja" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Ändringar" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Ändringar har återställts." @@ -1358,18 +1602,19 @@ msgstr "Ändrar administratörens lösenord för att få tillgång till enheten" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Kanal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "" @@ -1377,7 +1622,7 @@ msgstr "" msgid "Check filesystems before mount" msgstr "Kontrollera filsystemen innan de monteras" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" "Bocka för det här alternativet för att ta bort befintliga nätverk från den " @@ -1396,8 +1641,8 @@ msgstr "" msgid "Choose mtdblock" msgstr "Välj mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1405,13 +1650,13 @@ msgid "" "interface to it." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Chiffer" @@ -1431,9 +1676,10 @@ msgid "" "FEATURE IS FOR PROFESSIONALS! )" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Klient" @@ -1442,9 +1688,9 @@ msgstr "Klient" msgid "Client ID to send when requesting DHCP" msgstr "Klient-ID att skicka vid DHCP-förfrågning" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Stäng" @@ -1459,20 +1705,20 @@ msgid "" "persist connection" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Stäng ner lista..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Samlar in data..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Kommando" @@ -1489,7 +1735,7 @@ msgstr "Kommandot misslyckades" msgid "Comment" msgstr "Kommentera" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1508,29 +1754,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Konfiguration" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Konfigurationsändringar sparade." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Konfigurationsändringar har återställts!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Konfiguration misslyckades" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1540,28 +1785,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1573,9 +1818,10 @@ msgstr "" msgid "Confirmation" msgstr "Bekräftelse" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Ansluten" @@ -1585,11 +1831,11 @@ msgstr "Ansluten" msgid "Connection attempt failed" msgstr "Anslutningsförsök misslyckades" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1601,7 +1847,7 @@ msgstr "Anslutning förlorad" msgid "Connections" msgstr "Anslutningar" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1629,9 +1875,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Innehåll har sparats." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1642,16 +1888,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1662,20 +1908,20 @@ msgstr "" msgid "Country" msgstr "Land" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Landskod" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "" @@ -1687,7 +1933,7 @@ msgstr "Kritisk" msgid "Cron Log Level" msgstr "Loggnivå för Cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "" @@ -1726,31 +1972,31 @@ msgid "" "Diode\">LED
    s if possible." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE-klient" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE-port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAE-nyckel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP-server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP och DNS" @@ -1761,16 +2007,22 @@ msgstr "DHCP och DNS" msgid "DHCP client" msgstr "DHCP-klient" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP-alternativ" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6-klient" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6-tjänst" @@ -1782,19 +2034,19 @@ msgstr "DHCPv6-tjänst" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNSförfrågningsport" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "DNSserver-port" @@ -1802,7 +2054,7 @@ msgstr "DNSserver-port" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1810,11 +2062,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1826,39 +2078,47 @@ msgstr "" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "DSL-status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Datahastighet" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Mottagen data" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Överförd data" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Felsökning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1866,68 +2126,69 @@ msgstr "" msgid "Default state" msgstr "Standardläge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" -msgstr "Radera" +msgstr "Ta bort" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Radera nyckel" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Ta bort det här nätverket" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Beskrivning" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Avmarkera" @@ -1935,11 +2196,11 @@ msgstr "Avmarkera" msgid "Design" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1974,9 +2235,9 @@ msgstr "Destinationens zon" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1986,36 +2247,40 @@ msgstr "Destinationens zon" msgid "Device" msgstr "Enhet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Enhetskonfiguration" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Enheten är ej aktiv" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Enheten startas om…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Enheten kan inte nås!" @@ -2023,31 +2288,31 @@ msgstr "Enheten kan inte nås!" msgid "Device unreachable! Still waiting for device..." msgstr "Enheten kan inte nås! Väntar fortfarande på enheten…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Enheter" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Diagnostik" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Slå nummer" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Mapp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" -msgstr "Inaktivera" +msgstr "Stäng av" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2064,55 +2329,58 @@ msgstr "Inaktivera DNS-uppslag" msgid "Disable Encryption" msgstr "Inaktivera kryptering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Inaktivera det här nätverket" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:70 msgid "Disabled" -msgstr "Avaktiverad" +msgstr "Avstängd" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Avbryt anslutning" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" @@ -2122,36 +2390,48 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Avfärda" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Avståndsoptimering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Avstånd till nätverksmedlemmen längst bort i metrar." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "Cachea inte negativa svar, t.ex för icke-existerade domäner." @@ -2163,36 +2443,25 @@ msgstr "Cachea inte negativa svar, t.ex för icke-existerade domäner." msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "Vidarebefordra inte DNS-" "förfrågningar utan DNS-namn." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Vidarebefordra inte förfrågningar som inte kan ta emot svar från publika " -"namnservrar." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Förhindra lyssning på dessa gränssnitt." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2202,17 +2471,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Vill du verkligen radera \"%s\" ?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Vill du verkligen ta bort följande SSH-nyckel?" @@ -2220,11 +2489,11 @@ msgstr "Vill du verkligen ta bort följande SSH-nyckel?" msgid "Do you really want to erase all settings?" msgstr "Vill du verkligen radera alla inställningar?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2232,15 +2501,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Domän krävs" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Vitlista för domäner" @@ -2266,11 +2537,11 @@ msgstr "Ladda ner säkerhetskopia" msgid "Download mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2284,16 +2555,54 @@ msgstr "Dra för att sortera om" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbear-instans" @@ -2309,20 +2618,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Dynamisk DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2330,27 +2639,39 @@ msgstr "" msgid "Dynamic tunnel" msgstr "Dynamisk tunnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAP-metod" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Redigera" @@ -2358,17 +2679,21 @@ msgstr "Redigera" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Redigera det här nätverket" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Redigera trådlöst nätverk" @@ -2377,54 +2702,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Nödsituation" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Aktivera" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Aktivera STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2442,10 +2757,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Aktivera IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2459,11 +2775,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2475,11 +2795,11 @@ msgstr "Aktivera NTP-klient" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Aktivera TFTP-server" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2487,7 +2807,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "Aktivera VLAN-funktionalitet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Aktivera WPS-tryckknapp, kräver WPA(2)-PSK/WPA3-SAE" @@ -2498,12 +2818,12 @@ msgid "" "Secure\">HTTPS port." msgstr "Avvisa uppströmssvar som innehåller RFC1918-adresser." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Aktivera motåtgärder för ominstallation av nyckel (KRACK)" @@ -2519,24 +2839,24 @@ msgstr "Aktivera spegling av inkommande paket" msgid "Enable mirroring of outgoing packets" msgstr "Aktivera spegling av utgående paket" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2558,11 +2878,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Aktivera det här nätverket" @@ -2571,27 +2891,36 @@ msgstr "Aktivera det här nätverket" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Aktiverad" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "" @@ -2599,24 +2928,29 @@ msgstr "" msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Kryptering" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Slutpunkt" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2624,23 +2958,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2669,10 +3003,6 @@ msgstr "Fel" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2691,37 +3021,51 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Inkludera inte dessa gränssnitt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Expandera värdar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2730,11 +3074,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Förväntade: %s" @@ -2746,7 +3090,7 @@ msgstr "" msgid "Expires" msgstr "Löper ut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2755,11 +3099,11 @@ msgstr "" msgid "External" msgstr "Externt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2787,58 +3131,86 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Byte av systemlösenord misslyckades." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Fil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Fil ej nåbar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "lokal DNS-fil." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Filnamn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "" @@ -2847,14 +3219,22 @@ msgstr "" msgid "Filesystem" msgstr "Filsystem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filtrera privata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Filtrera icke-användbara" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "" @@ -2867,8 +3247,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2878,7 +3263,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Hitta och anslut till nätverk" @@ -2892,10 +3277,11 @@ msgid "Firewall" msgstr "Brandvägg" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Brandväggsmarkering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Inställningar för brandvägg" @@ -2903,19 +3289,19 @@ msgstr "Inställningar för brandvägg" msgid "Firewall Status" msgstr "Status för brandvägg" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Fil för inbyggd programvara" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Firmware Version" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2941,40 +3327,48 @@ msgstr "" msgid "Flashing…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Tvinga" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Tvinga 40MHz-läge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Tvinga CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Tvinga DHCP på det här nätverket även om en annan server är upptäckt." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Tvinga TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Tvinga TKIP och CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Tvinga länk" @@ -2986,11 +3380,11 @@ msgstr "Tvinga uppgradering" msgid "Force use of NAT-T" msgstr "Tvinga användning av NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -3009,37 +3403,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Vidarebefordra DHCP-trafik" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " -"downstream interfaces." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" +"downstream interfaces." msgstr "" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Vidarebefordringsläge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "" @@ -3061,7 +3459,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Endast GPRS" @@ -3081,12 +3479,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Gateway" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Gateway-portar" @@ -3096,23 +3498,23 @@ msgstr "Gateway-portar" msgid "Gateway address is invalid" msgstr "Ogiltig Gateway-adress" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Generella inställningar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Allmän inställning" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3120,7 +3522,7 @@ msgstr "" msgid "Generate Config" msgstr "Generera konfig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3128,11 +3530,11 @@ msgstr "" msgid "Generate archive" msgstr "Generera arkiv" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3140,15 +3542,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3160,39 +3562,40 @@ msgstr "Angiven lösenordsbekräftelse matchade inte, lösenordet ändrades inte msgid "Global Settings" msgstr "Globala inställningar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Globala nätverksalternativ" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Gå till lösenordskonfiguration..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Gå till relevant konfigurationssida" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Ge åtkomst till DHCP-statusvisning" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3204,6 +3607,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3240,7 +3647,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3248,6 +3655,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3280,7 +3691,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "" @@ -3309,15 +3720,11 @@ msgstr "" msgid "Hang Up" msgstr "Lägg på" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3329,7 +3736,7 @@ msgstr "" "Här kan du konfigurera grundläggande enhetsinställningar, så som värdnamn " "eller tidszon." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Göm ESSID" @@ -3338,17 +3745,25 @@ msgstr "Göm ESSID" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3358,7 +3773,7 @@ msgstr "Värd" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3366,10 +3781,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3379,11 +3800,11 @@ msgstr "Värdnamn" msgid "Hostname to send when requesting DHCP" msgstr "Värdnamn att skicka vid DHCP-förfrågningar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Värdnamn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3439,23 +3860,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IP-adresser" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3471,7 +3896,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3483,20 +3908,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "" @@ -3504,14 +3929,15 @@ msgstr "" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3527,7 +3953,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3537,7 +3963,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3564,7 +3990,7 @@ msgstr "IPv4-nätmask" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Endast IPv4" @@ -3577,11 +4003,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3590,16 +4016,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-i-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3610,7 +4040,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3618,7 +4049,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6-brandvägg" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3626,7 +4057,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "IPV6-grannar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3634,15 +4069,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "IPv6-inställningar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3656,12 +4091,12 @@ msgstr "" msgid "IPv6 address" msgstr "IPv6-adress" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3673,11 +4108,11 @@ msgstr "IPv6-gateway" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Endast IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3686,7 +4121,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3700,23 +4135,19 @@ msgstr "" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "IPv6Suffix (hex)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3724,6 +4155,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3739,10 +4174,16 @@ msgstr "IPv6-över-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-över-IPv4 (6till4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Identitet" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3755,13 +4196,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3778,21 +4219,23 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3806,15 +4249,23 @@ msgid "" "datarates of the RAM." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ignorera /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ignorera gränssnitt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ignorera resolv-fil" @@ -3826,25 +4277,25 @@ msgstr "Image" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3856,13 +4307,27 @@ msgstr "" msgid "In" msgstr "I" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3892,7 +4357,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3900,6 +4365,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3918,22 +4384,21 @@ msgstr "Info" msgid "Information" msgstr "Information" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3945,31 +4410,41 @@ msgstr "Initskript" msgid "Initscripts" msgstr "Initskripten" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Installera protokoll-förlängningar..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -3979,6 +4454,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -3986,7 +4465,7 @@ msgstr "" msgid "Interface" msgstr "Gränssnitt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -3994,7 +4473,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Konfiguration av gränssnitt" @@ -4025,11 +4504,11 @@ msgstr "Gränssnittet återansluter..." msgid "Interface is shutting down..." msgstr "Gränssnittet stänger ner..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -4038,12 +4517,12 @@ msgid "Interface name" msgstr "Gränssnittets namn" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Gränssnittet är inte närvarande eller är inte anslutet än." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Gränssnitt" @@ -4052,22 +4531,26 @@ msgstr "Gränssnitt" msgid "Internal" msgstr "Internt" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Internt server-fel" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4077,8 +4560,9 @@ msgid "Invalid" msgstr "Ogiltig" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4088,6 +4572,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4110,7 +4598,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4124,15 +4612,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Ogiltigt användarnamn och/eller lösenord! Vänligen försök igen." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Isolera klienter" @@ -4143,25 +4652,25 @@ msgid "" "flash memory, please verify the image file!" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "JavaScript krävs!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Anslut till nätverk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Anslut till nätverk: Trådlös skanning" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Ansluter till nätverk: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4169,24 +4678,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "Behåll inställningarna och behåll den nuvarande konfigurationen" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Kernel-logg" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Kernel-version" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Nyckel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Nyckel #%d" @@ -4194,6 +4707,7 @@ msgstr "Nyckel #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4201,14 +4715,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4253,7 +4772,7 @@ msgstr "" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4270,32 +4789,39 @@ msgstr "Språk" msgid "Language and Style" msgstr "Språk och Stil" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Latens" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Senaste handskakning" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Löv" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Kontraktsfil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Kontraktstid" @@ -4319,38 +4845,34 @@ msgstr "Lämna tom för att upptäcka automatiskt" msgid "Leave empty to use the current WAN address" msgstr "Lämna tom för att använda den nuvarande WAN-adressen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Begränsa" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4371,16 +4893,20 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" +"Lista på IP-set:er som fyllas med IP:erna av resultaten av DNS-uppslag för " +"de FQDN:er som också anges här." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4389,7 +4915,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4402,23 +4928,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Lista över SSH-nyckelfiler för auth" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Lyssningsport" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4427,7 +4950,7 @@ msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" "Lyssna endast på det angivna gränssnittet eller, om o-specificerat på alla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4437,7 +4960,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Lyssningsportar för ankommande DNS-förfrågningar." @@ -4446,7 +4969,7 @@ msgstr "Lyssningsportar för ankommande DNS-förfrågningar." msgid "Load" msgstr "Last" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Snitt-belastning" @@ -4454,27 +4977,28 @@ msgstr "Snitt-belastning" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4494,11 +5018,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Lokal IPv4-adress" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4514,44 +5039,70 @@ msgstr "Lokal IPv6-adress" msgid "Local Startup" msgstr "Lokal uppstart" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Lokal tid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Lokal domän" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Lokal server" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Enbart lokal tjänst" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Lokalisera förfrågningar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Logga in" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Logga ut" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "" @@ -4575,25 +5126,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Logga in" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Logga ut" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4601,11 +5143,11 @@ msgstr "" msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" -msgstr "" +msgstr "MAC-address" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Filter för MAC-adress" @@ -4613,16 +5155,15 @@ msgstr "Filter för MAC-adress" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4631,11 +5172,15 @@ msgstr "MAC VLAN" msgid "MAC address" msgstr "MAC-adress" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC-filter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "MAC-lista" @@ -4649,6 +5194,10 @@ msgstr "MAP / LW4över6" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4670,15 +5219,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4686,7 +5239,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4695,76 +5248,84 @@ msgstr "" msgid "Manual" msgstr "Manuell" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Mästare" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Max.EDNS0paketstorlek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4791,7 +5352,7 @@ msgstr "Minne" msgid "Memory usage (%)" msgstr "Minnesanvändning (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4799,10 +5360,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4815,7 +5384,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4826,11 +5395,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4838,13 +5407,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4858,77 +5427,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Läge" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Modell" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Modem-enhet" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Övervaka" @@ -4996,6 +5572,10 @@ msgstr "Flytta ner" msgid "Move up" msgstr "Flytta upp" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5003,19 +5583,23 @@ msgstr "Flytta upp" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS-ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -5027,12 +5611,16 @@ msgstr "NAT-T-läge" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -5045,18 +5633,23 @@ msgid "NTP server candidates" msgstr "NTP-serverkandidater" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Namn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Namnet på det nya nätverket" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigering" @@ -5065,13 +5658,17 @@ msgstr "Navigering" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5080,32 +5677,36 @@ msgstr "" msgid "Network" msgstr "Nätverk" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Nätverksverktyg" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Uppstartsbild för nätverket" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5118,7 +5719,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5127,7 +5728,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5136,25 +5737,31 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 +msgid "Never" +msgstr "Aldrig" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" msgid "Never" msgstr "Aldrig" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5162,13 +5769,13 @@ msgstr "" msgid "Next »" msgstr "Nästa »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Nej" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Det finns ingen DHCP-server inställd för det här gränssnittet" @@ -5176,7 +5783,7 @@ msgstr "Det finns ingen DHCP-server inställd för det här gränssnittet" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5192,9 +5799,17 @@ msgstr "Ingen NAT-T" msgid "No RX signal" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5205,7 +5820,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5214,8 +5833,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5228,15 +5847,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Inga filer hittades" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5250,7 +5865,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5271,30 +5886,40 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Ingen negativ cache" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Inget lösenord inställt!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "Inte ansluten" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5308,7 +5933,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "" @@ -5320,37 +5946,40 @@ msgstr "" msgid "Noise" msgstr "Buller" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Buller:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Ingen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Hittades inte" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Inte associerad" @@ -5363,7 +5992,7 @@ msgstr "Inte ansluten" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5375,12 +6004,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5389,7 +6024,7 @@ msgstr "" msgid "Notice" msgstr "Avisering" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5397,7 +6032,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5414,7 +6049,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5425,6 +6060,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Av" @@ -5433,23 +6069,29 @@ msgstr "Av" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" -msgstr "" +msgstr "På" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:12 msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "En utav värdnamn eller MAC-adress måste anges!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5467,7 +6109,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "En eller fler fält som krävs har inget värde!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5476,49 +6122,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Öppna lista..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5526,29 +6183,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Alternativet ändrades" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Alternativet togs bort" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Valfri" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5556,17 +6222,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5574,13 +6240,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5595,11 +6261,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5607,7 +6273,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5621,7 +6287,7 @@ msgstr "" msgid "Options" msgstr "Alternativ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Genväg till CA-certifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Genväg till klient-certifikat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Genväg till privat nyckel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Genväg till det inre CA-certifikatet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Genväg till det inre klient-certifikatet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Genväg till den inre privata nyckeln" @@ -5991,11 +6702,19 @@ msgstr "" msgid "Peak:" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Jämlike" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -6004,11 +6723,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -6039,10 +6758,14 @@ msgstr "Utför återställning" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6051,13 +6774,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Fysiska inställningar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6070,11 +6793,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pkt." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Vänligen ange ditt användarnamn och lösenord." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6082,56 +6805,75 @@ msgstr "" msgid "Policy" msgstr "Villkor" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Port" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Port-status:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Föredra LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Föredra UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6154,13 +6896,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Förhindrar kommunikation klient-till-klient" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6173,29 +6916,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" -msgstr "" +msgstr "Prioritet" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Privat nyckel" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6213,8 +6958,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6226,13 +6971,13 @@ msgstr "Protokoll" msgid "Provide NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6242,25 +6987,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Publik nyckel" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6285,59 +7041,83 @@ msgstr "QMI-telefoni" msgid "Quality" msgstr "Kvalité" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "" @@ -6350,10 +7130,16 @@ msgstr "RT" msgid "RX Rate" msgstr "RX-hastighet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6363,11 +7149,11 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "Läs /etc/ethers för att ställa in DHCP-servern." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Verkligen byta protokoll?" @@ -6375,11 +7161,11 @@ msgstr "Verkligen byta protokoll?" msgid "Realtime Graphs" msgstr "Realtidsgrafer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6403,11 +7189,40 @@ msgstr "Startar om din enhets operativsystem" msgid "Receive" msgstr "Ta emot" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Ta emot" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Rekommenderad. WireGuard-gränssnittets IP-adresser." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Återanslut det här gränssnittet" @@ -6415,12 +7230,12 @@ msgstr "Återanslut det här gränssnittet" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6429,37 +7244,47 @@ msgstr "" msgid "References" msgstr "Referens" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Relä" @@ -6469,6 +7294,10 @@ msgstr "Relä" msgid "Relay Bridge" msgstr "Relä-brygga" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Relä mellan nätverk" @@ -6478,6 +7307,14 @@ msgstr "Relä mellan nätverk" msgid "Relay bridge" msgstr "Relä-brygga" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6487,6 +7324,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6499,15 +7337,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Ta bort" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Ersätt trådlös konfiguration" @@ -6537,7 +7383,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Nödvändig" @@ -6553,7 +7400,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6565,67 +7412,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6634,7 +7487,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6649,20 +7502,24 @@ msgstr "Återställ räknare" msgid "Reset to defaults" msgstr "Återställ till standard" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Resolv och Värd-filer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Resolv-fil" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Starta om" @@ -6671,7 +7528,7 @@ msgstr "Starta om" msgid "Restart Firewall" msgstr "Starta om brandvägg" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6683,86 +7540,97 @@ msgstr "Återställ" msgid "Restore backup" msgstr "Återställ säkerhetskopian" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Visa/dölj lösenordet" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Återgå" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6777,19 +7645,19 @@ msgstr "Root-förberedelse" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Typ av rutt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6807,6 +7675,10 @@ msgstr "Router-lösenord" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6819,24 +7691,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6856,11 +7728,24 @@ msgstr "" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6878,15 +7763,15 @@ msgstr "SSH-serverns port" msgid "SSH username" msgstr "Användarnamn för SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH-nycklar" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6903,7 +7788,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6914,7 +7799,7 @@ msgid "Save" msgstr "Spara" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Spara och Verkställ" @@ -6931,7 +7816,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Skanna" @@ -6940,11 +7825,16 @@ msgstr "Skanna" msgid "Scheduled Tasks" msgstr "Schemalagda uppgifter" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Sektionen lades till" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Sektionen togs bort" @@ -6959,9 +7849,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -6969,13 +7859,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -6994,11 +7884,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Server-adress" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -7023,16 +7917,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7042,14 +7940,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7063,11 +7961,15 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Ställ in DHCP-server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7075,20 +7977,25 @@ msgid "Setting PLMN failed" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Inställningar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7096,12 +8003,11 @@ msgstr "" msgid "Short GI" msgstr "Kort GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "" @@ -7114,16 +8020,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Stäng ner det här gränssnittet" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7131,15 +8037,15 @@ msgstr "Stäng ner det här gränssnittet" msgid "Signal" msgstr "Signal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7147,12 +8053,12 @@ msgstr "" msgid "Signal:" msgstr "Signal:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Storlek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7169,12 +8075,12 @@ msgstr "Hoppa över" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Hoppa över till innehåll" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Hoppa över till navigering" @@ -7192,14 +8098,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "Några fält är ogiltiga, kan inte spara värden!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Tyvärr, objektet som du frågade efter kunde inte hittas." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Tyvärr, servern stötte på ett oväntat fel." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7207,8 +8109,8 @@ msgid "" "instructions." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7235,26 +8137,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7279,7 +8181,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7287,7 +8189,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7295,20 +8197,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7336,7 +8238,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7353,7 +8255,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7384,15 +8286,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7414,19 +8316,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7446,7 +8348,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7541,15 +8443,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Ange den hemliga krypteringsnyckeln här." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Starta" @@ -7562,16 +8472,16 @@ msgstr "" msgid "Start priority" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7580,6 +8490,10 @@ msgstr "" msgid "Startup" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Status" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Statiska IPv4-rutter" @@ -7593,7 +8507,7 @@ msgstr "Statiska IPv6-rutter" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "" @@ -7603,25 +8517,25 @@ msgstr "" msgid "Static address" msgstr "Statiska adresser" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Status" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Stopp" @@ -7630,8 +8544,8 @@ msgstr "Stopp" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7639,11 +8553,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Strikt sortering" @@ -7652,15 +8566,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Skicka" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7691,7 +8605,7 @@ msgstr "Byt VLAN" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Byt protokoll" @@ -7701,7 +8615,7 @@ msgstr "Byt protokoll" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7713,8 +8627,16 @@ msgstr "" msgid "Sync with browser" msgstr "Synkronisera med webbläsare" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7738,9 +8660,9 @@ msgstr "Systemets egenskaper" msgid "System log buffer size" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7769,7 +8691,7 @@ msgstr "" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Root för TFTP-server" @@ -7782,26 +8704,37 @@ msgstr "TX" msgid "TX Rate" msgstr "TX-hastighet" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tabell" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Mål" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7817,26 +8750,26 @@ msgstr "" msgid "Terminate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7852,7 +8785,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7864,18 +8801,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7883,6 +8826,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7897,6 +8841,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7907,7 +8857,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7924,21 +8874,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -7948,13 +8902,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -7972,18 +8926,18 @@ msgid "" "
    /dev/sda1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8000,7 +8954,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -8008,31 +8962,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8055,6 +9025,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8069,7 +9040,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8078,7 +9049,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8086,19 +9057,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8112,14 +9083,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8132,31 +9103,31 @@ msgstr "Omstartskommandot misslyckades med kod %d" msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8188,6 +9159,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8209,30 +9188,37 @@ msgid "" "you choose the generic image format for your platform." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8245,16 +9231,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8267,6 +9253,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8279,7 +9276,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" @@ -8307,8 +9304,8 @@ msgid "" "their status." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8323,31 +9320,39 @@ msgstr "Den här sektionen innehÃ¥ller inga värden ännu" msgid "Time Synchronization" msgstr "Synkronisering av tid" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8355,17 +9360,13 @@ msgstr "" msgid "Timezone" msgstr "Tidszon" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8375,7 +9376,7 @@ msgstr "" "För att Ã¥terställa konfigurationsfiler sÃ¥ kan du ladda upp ett tidigare " "genererat säkerhetskopierings arkiv här." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Ton" @@ -8383,12 +9384,16 @@ msgstr "Ton" msgid "Total Available" msgstr "Totalt tillgängligt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8400,11 +9405,11 @@ msgstr "Trafik" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8421,6 +9426,27 @@ msgstr "Överför" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Överförd data" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8459,7 +9485,7 @@ msgstr "Tunnelgränssnitt" msgid "Tunnel Link" msgstr "Tunnel-länk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8468,13 +9494,13 @@ msgid "Tx-Power" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Typ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8523,7 +9549,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Det gÃ¥r inte att skicka" @@ -8574,19 +9600,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Otillgängliga Sekunder (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8600,7 +9638,7 @@ msgstr "" msgid "Unknown" msgstr "Okänd" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8624,11 +9662,11 @@ msgstr "" msgid "Unmount" msgstr "Avmontera" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Osparade ändringar" @@ -8642,15 +9680,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Protokolltypen stöds inte." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8662,7 +9710,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Ladda upp" @@ -8677,56 +9725,64 @@ msgstr "" msgid "Upload archive..." msgstr "Ladda upp arkiv..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Upptid" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Använd /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8735,13 +9791,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "Använd DHCP-gateway" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8787,22 +9848,25 @@ msgstr "Använd som root-filsystem (/)" msgid "Use broadcast flag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Använd anpassade DNS-servrar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Använd standard-gateway" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "" @@ -8826,15 +9890,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8857,69 +9921,71 @@ msgstr "" msgid "Used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Användarcertifikat (PEM-krypterad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Användarnyckel (PEM-krypterad)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Användarnamn" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -8939,24 +10005,27 @@ msgstr "Lokal adress för VPN" msgid "VPN Local port" msgstr "Lokal port för VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPN-server" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Port för VPN-server" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -8965,6 +10034,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -8978,14 +10051,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9011,7 +10084,7 @@ msgstr "Tillverkare" msgid "Vendor Class to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -9019,12 +10092,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -9032,34 +10105,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "Öppet System WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "WEP-lösenordsfras" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "WMM-läge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "WPA-lösenordsfras" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9087,48 +10172,99 @@ msgstr "" msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Bredd" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Status för WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9144,21 +10280,21 @@ msgid "Wireless Adapter" msgstr "Trådlös adapter" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Trådlöst nätverk" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Trådlös överblick" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Trådlös säkerhet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9174,15 +10310,15 @@ msgstr "Trådlöst är avstängt" msgid "Wireless is not associated" msgstr "Trådlöst är inte associerat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Trådlöst nätverk är avstängt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Trådlöst nätverk är aktiverat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Skriv mottagna DNS-förfrågningar till syslogg." @@ -9194,7 +10330,7 @@ msgstr "Skriv systemlogg till fil" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9217,8 +10353,20 @@ msgid "" "scripts like \"network\", your device might become inaccessible!
    " msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9249,34 +10397,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "något" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "auto" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "automatisk" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "bryggad" @@ -9333,25 +10501,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "inaktivera" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "avstängd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9360,14 +10533,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "slutade gälla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9377,22 +10559,22 @@ msgstr "" msgid "forward" msgstr "vidarebefordra" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "full-duplex" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "halv-duplex" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "gömd" @@ -9401,9 +10583,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "hybrid-läge" @@ -9411,6 +10593,10 @@ msgstr "hybrid-läge" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9425,11 +10611,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9438,11 +10632,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "minuter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9454,18 +10648,26 @@ msgstr "" msgid "no" msgstr "nej" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "ingen länk" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "inga" @@ -9476,20 +10678,20 @@ msgid "not present" msgstr "inte tillgängligt" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "av" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9498,6 +10700,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "över en dag sedan" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9515,23 +10721,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "relä-läge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "server-läge" @@ -9539,7 +10754,7 @@ msgstr "server-läge" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9547,7 +10762,7 @@ msgstr "" msgid "tagged" msgstr "taggad" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9558,25 +10773,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "okänd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "obegränsad" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9598,8 +10815,8 @@ msgid "untagged" msgstr "otaggat" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9612,7 +10829,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9641,7 +10858,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9678,8 +10895,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9719,11 +10936,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9733,50 +10960,50 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:72 msgctxt "nft unit" msgid "week" -msgstr "" +msgstr "vecka" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 msgid "yes" diff --git a/package/luci/modules/luci-base/po/templates/base.pot b/package/luci/modules/luci-base/po/templates/base.pot index ffcf3d46bd..efb1d7a360 100644 --- a/package/luci/modules/luci-base/po/templates/base.pot +++ b/package/luci/modules/luci-base/po/templates/base.pot @@ -1,23 +1,39 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "" @@ -42,10 +58,11 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "" @@ -55,19 +72,19 @@ msgid "-- Additional Field --" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "" @@ -93,7 +110,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" @@ -106,13 +123,18 @@ msgstr "" msgid "1 Minute Load:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "" msgstr[1] "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "" @@ -127,12 +149,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "" @@ -145,43 +172,98 @@ msgstr "" msgid "5 Minute Load:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "" @@ -193,30 +275,42 @@ msgstr "" msgid "LED Name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -262,11 +356,19 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "" @@ -274,25 +376,90 @@ msgstr "" msgid "A new login is required since the authentication session expired." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "" @@ -325,55 +492,58 @@ msgstr "" msgid "ARP retry threshold" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " "to dial into the provider network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "" @@ -382,7 +552,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "" @@ -390,16 +560,25 @@ msgstr "" msgid "Access Concentrator" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "" @@ -437,8 +616,8 @@ msgstr "" msgid "Active-Backup policy (active-backup, 1)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "" @@ -455,18 +634,18 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "" @@ -486,11 +665,11 @@ msgstr "" msgid "Add VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "" @@ -498,18 +677,18 @@ msgstr "" msgid "Add instance" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "" @@ -517,6 +696,10 @@ msgstr "" msgid "Add peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "" @@ -525,11 +708,11 @@ msgstr "" msgid "Add to Whitelist" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "" @@ -546,7 +729,11 @@ msgstr "" msgid "Address" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "" @@ -559,7 +746,7 @@ msgstr "" msgid "Address to access local relay bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "" @@ -568,28 +755,28 @@ msgstr "" msgid "Administration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 @@ -624,17 +811,17 @@ msgstr "" msgid "Alias of \"%s\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "" @@ -642,11 +829,11 @@ msgstr "" msgid "Allow SSH password authentication" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "" @@ -654,15 +841,15 @@ msgstr "" msgid "Allow full UCI access for legacy applications" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "" @@ -683,19 +870,24 @@ msgid "Allow system feature probing" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "" @@ -707,20 +899,24 @@ msgstr "" msgid "Always on (kernel: default-on)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "" @@ -729,98 +925,47 @@ msgstr "" msgid "An optional, short description for this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "" @@ -832,7 +977,7 @@ msgstr "" msgid "Anonymous Swap" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "" @@ -844,11 +989,11 @@ msgstr "" msgid "Any zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "" @@ -856,44 +1001,48 @@ msgstr "" msgid "Apply backup?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "" @@ -902,15 +1051,15 @@ msgstr "" msgid "Associations" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -920,25 +1069,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "" @@ -946,7 +1096,9 @@ msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -964,7 +1116,7 @@ msgstr "" msgid "Automatically check filesystem for errors before mounting" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -986,6 +1138,10 @@ msgstr "" msgid "Automount Swap" msgstr "" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "" @@ -1004,11 +1160,15 @@ msgstr "" msgid "Average:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "" @@ -1016,15 +1176,19 @@ msgstr "" msgid "BR / DMR / AFTR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "" @@ -1033,11 +1197,7 @@ msgstr "" msgid "Back to Overview" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "" @@ -1050,16 +1210,15 @@ msgid "Backup / Flash Firmware" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "" @@ -1067,12 +1226,35 @@ msgstr "" msgid "Base64-encoded public key of this interface for sharing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1083,7 +1265,7 @@ msgstr "" msgid "Bind NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" @@ -1092,18 +1274,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1115,65 +1310,77 @@ msgstr "" msgid "Bitrate" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "" @@ -1181,14 +1388,36 @@ msgstr "" msgid "Buffered" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "" @@ -1203,18 +1432,23 @@ msgstr "" msgid "Call failed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "" @@ -1222,32 +1456,32 @@ msgstr "" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1256,45 +1490,53 @@ msgstr "" msgid "Category" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1306,16 +1548,16 @@ msgstr "" msgid "Chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "" @@ -1326,18 +1568,19 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "" @@ -1345,7 +1588,7 @@ msgstr "" msgid "Check filesystems before mount" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "" @@ -1362,8 +1605,8 @@ msgstr "" msgid "Choose mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1371,13 +1614,13 @@ msgid "" "interface to it." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "" @@ -1397,9 +1640,10 @@ msgid "" "FEATURE IS FOR PROFESSIONALS! )" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "" @@ -1408,9 +1652,9 @@ msgstr "" msgid "Client ID to send when requesting DHCP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "" @@ -1425,20 +1669,20 @@ msgid "" "persist connection" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "" @@ -1455,7 +1699,7 @@ msgstr "" msgid "Comment" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1474,29 +1718,28 @@ msgstr "" msgid "Config File" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1506,28 +1749,28 @@ msgid "" "offered." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "" @@ -1539,9 +1782,10 @@ msgstr "" msgid "Confirmation" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "" @@ -1551,11 +1795,11 @@ msgstr "" msgid "Connection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "" @@ -1567,7 +1811,7 @@ msgstr "" msgid "Connections" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "" @@ -1595,9 +1839,9 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1608,16 +1852,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1628,20 +1872,20 @@ msgstr "" msgid "Country" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "" @@ -1653,7 +1897,7 @@ msgstr "" msgid "Cron Log Level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "" @@ -1692,31 +1936,31 @@ msgid "" "Diode\">LED
    s if possible." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "" @@ -1727,16 +1971,22 @@ msgstr "" msgid "DHCP client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "" @@ -1748,19 +1998,19 @@ msgstr "" msgid "DNS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" @@ -1768,7 +2018,7 @@ msgstr "" msgid "DNS setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "" @@ -1776,11 +2026,11 @@ msgstr "" msgid "DNS-Label / FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "" @@ -1792,39 +2042,47 @@ msgstr "" msgid "DS-Lite AFTR address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "" @@ -1832,68 +2090,69 @@ msgstr "" msgid "Default state" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "" @@ -1901,11 +2160,11 @@ msgstr "" msgid "Design" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1940,9 +2199,9 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -1952,36 +2211,40 @@ msgstr "" msgid "Device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "" @@ -1989,31 +2252,31 @@ msgstr "" msgid "Device unreachable! Still waiting for device..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2028,20 +2291,24 @@ msgstr "" msgid "Disable Encryption" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2050,33 +2317,32 @@ msgstr "" msgid "Disabled" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "" @@ -2086,36 +2352,48 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" @@ -2127,32 +2405,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2162,17 +2431,17 @@ msgstr "" msgid "Do not send a hostname" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "" @@ -2180,11 +2449,11 @@ msgstr "" msgid "Do you really want to erase all settings?" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" @@ -2192,15 +2461,17 @@ msgstr "" msgid "Do you want to replace the current keys?" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "" @@ -2226,11 +2497,11 @@ msgstr "" msgid "Download mtdblock" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2244,16 +2515,54 @@ msgstr "" msgid "Drop Duplicate Frames" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "" @@ -2269,19 +2578,19 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "" @@ -2289,27 +2598,39 @@ msgstr "" msgid "Dynamic tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "" @@ -2317,17 +2638,21 @@ msgstr "" msgid "Edit peer" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "" @@ -2336,54 +2661,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" @@ -2401,10 +2716,11 @@ msgstr "" msgid "Enable HE.net dynamic endpoint update" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "" @@ -2418,11 +2734,15 @@ msgstr "" msgid "Enable IPv6 negotiation on the PPP link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "" @@ -2434,11 +2754,11 @@ msgstr "" msgid "Enable Single DES" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "" @@ -2446,7 +2766,7 @@ msgstr "" msgid "Enable VLAN functionality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "" @@ -2457,12 +2777,12 @@ msgid "" "Secure\">HTTPS port." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "" @@ -2478,24 +2798,24 @@ msgstr "" msgid "Enable mirroring of outgoing packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "" @@ -2517,11 +2837,11 @@ msgstr "" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "" @@ -2530,27 +2850,36 @@ msgstr "" msgid "Enable tx checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "" @@ -2558,24 +2887,29 @@ msgstr "" msgid "Encapsulation limit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "" @@ -2583,23 +2917,23 @@ msgstr "" msgid "Endpoint setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "" @@ -2628,10 +2962,6 @@ msgstr "" msgid "Error getting PublicKey" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2650,37 +2980,51 @@ msgstr "" msgid "Every second (fast, 1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "" @@ -2689,11 +3033,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "" @@ -2705,7 +3049,7 @@ msgstr "" msgid "Expires" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2714,11 +3058,11 @@ msgstr "" msgid "External" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "" @@ -2746,58 +3090,86 @@ msgstr "" msgid "Extra sstpc options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "" @@ -2806,12 +3178,20 @@ msgstr "" msgid "Filesystem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 -msgid "Filter private" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 @@ -2826,8 +3206,13 @@ msgstr "" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "" @@ -2837,7 +3222,7 @@ msgid "" "with defaults based on what was detected" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "" @@ -2851,10 +3236,11 @@ msgid "Firewall" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "" @@ -2862,19 +3248,19 @@ msgstr "" msgid "Firewall Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "" @@ -2900,40 +3286,48 @@ msgstr "" msgid "Flashing…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "" @@ -2945,11 +3339,11 @@ msgstr "" msgid "Force use of NAT-T" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and RA " "messages received on the designated master interface to downstream " @@ -2968,37 +3362,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "" @@ -3020,7 +3418,7 @@ msgid "GHz" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "" @@ -3040,12 +3438,16 @@ msgstr "" msgid "GRETAP tunnel over IPv6" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "" @@ -3055,23 +3457,23 @@ msgstr "" msgid "Gateway address is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "" @@ -3079,7 +3481,7 @@ msgstr "" msgid "Generate Config" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "" @@ -3087,11 +3489,11 @@ msgstr "" msgid "Generate archive" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3099,15 +3501,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3119,39 +3521,40 @@ msgstr "" msgid "Global Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "" @@ -3163,6 +3566,10 @@ msgstr "" msgid "Grant access to LuCI Wireguard procedures" msgstr "" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "" @@ -3199,7 +3606,7 @@ msgstr "" msgid "Grant access to network configuration" msgstr "" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "" @@ -3207,6 +3614,10 @@ msgstr "" msgid "Grant access to network status information" msgstr "" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "" @@ -3239,7 +3650,7 @@ msgstr "" msgid "Grant access to wireless channel status" msgstr "" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "" @@ -3268,15 +3679,11 @@ msgstr "" msgid "Hang Up" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "" @@ -3286,7 +3693,7 @@ msgid "" "the timezone." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" @@ -3295,17 +3702,25 @@ msgstr "" msgid "Hide empty chains" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3315,7 +3730,7 @@ msgstr "" msgid "Host expiry timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "" @@ -3323,10 +3738,16 @@ msgstr "" msgid "Host-Uniq tag content" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3336,11 +3757,11 @@ msgstr "" msgid "Hostname to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3396,23 +3817,27 @@ msgstr "" msgid "IKE DH Group" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3428,7 +3853,7 @@ msgstr "" msgid "IP address is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3440,20 +3865,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "" @@ -3461,14 +3886,15 @@ msgstr "" msgid "IPsec XFRM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "" @@ -3484,7 +3910,7 @@ msgstr "" msgid "IPv4 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "" @@ -3494,7 +3920,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3521,7 +3947,7 @@ msgstr "" msgid "IPv4 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "" @@ -3534,11 +3960,11 @@ msgstr "" msgid "IPv4 prefix length" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "" @@ -3547,16 +3973,20 @@ msgstr "" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3567,7 +3997,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "" @@ -3575,7 +4006,7 @@ msgstr "" msgid "IPv6 Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "" @@ -3583,7 +4014,11 @@ msgstr "" msgid "IPv6 Neighbours" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "" @@ -3591,15 +4026,15 @@ msgstr "" msgid "IPv6 Routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" @@ -3613,12 +4048,12 @@ msgstr "" msgid "IPv6 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "" @@ -3630,11 +4065,11 @@ msgstr "" msgid "IPv6 network in address/netmask notation" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "" @@ -3643,7 +4078,7 @@ msgstr "" msgid "IPv6 prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "" @@ -3657,23 +4092,19 @@ msgstr "" msgid "IPv6 routed prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "" @@ -3681,6 +4112,10 @@ msgstr "" msgid "IPv6-PD" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3696,10 +4131,16 @@ msgstr "" msgid "IPv6-over-IPv4 (6to4)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "" @@ -3712,13 +4153,13 @@ msgstr "" msgid "If checked, encryption is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "" @@ -3735,21 +4176,23 @@ msgid "" "device node" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3763,15 +4206,23 @@ msgid "" "datarates of the RAM." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "" @@ -3783,25 +4234,25 @@ msgstr "" msgid "Image check failed:" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "" @@ -3813,13 +4264,27 @@ msgstr "" msgid "In" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "" @@ -3849,7 +4314,7 @@ msgstr "" msgid "Incoming checksum" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "" @@ -3857,6 +4322,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "" @@ -3875,22 +4341,21 @@ msgstr "" msgid "Information" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "" @@ -3902,31 +4367,41 @@ msgstr "" msgid "Initscripts" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -3936,6 +4411,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -3943,7 +4422,7 @@ msgstr "" msgid "Interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "" @@ -3951,7 +4430,7 @@ msgstr "" msgid "Interface %q device auto-migrated from %q to %q." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "" @@ -3982,11 +4461,11 @@ msgstr "" msgid "Interface is shutting down..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "" @@ -3995,12 +4474,12 @@ msgid "Interface name" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "" @@ -4009,22 +4488,26 @@ msgstr "" msgid "Internal" msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "" @@ -4034,8 +4517,9 @@ msgid "Invalid" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "" @@ -4045,6 +4529,10 @@ msgstr "" msgid "Invalid Base64 key string" msgstr "" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4067,7 +4555,7 @@ msgstr "" msgid "Invalid argument" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4081,15 +4569,36 @@ msgstr "" msgid "Invalid hexadecimal value" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "" @@ -4100,25 +4609,25 @@ msgid "" "flash memory, please verify the image file!" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "" @@ -4126,24 +4635,28 @@ msgstr "" msgid "Keep settings and retain the current configuration" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "" @@ -4151,6 +4664,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "" @@ -4158,14 +4672,19 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4210,7 +4729,7 @@ msgstr "" msgid "LED Configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "" @@ -4227,32 +4746,39 @@ msgstr "" msgid "Language and Style" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" msgstr "" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "" @@ -4276,38 +4802,34 @@ msgstr "" msgid "Leave empty to use the current WAN address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "" @@ -4328,16 +4850,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4346,7 +4870,7 @@ msgid "" "Association." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4359,23 +4883,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "" @@ -4383,7 +4904,7 @@ msgstr "" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4393,7 +4914,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "" @@ -4402,7 +4923,7 @@ msgstr "" msgid "Load" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "" @@ -4410,27 +4931,28 @@ msgstr "" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "" @@ -4450,11 +4972,12 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "" @@ -4470,44 +4993,70 @@ msgstr "" msgid "Local Startup" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "" @@ -4531,25 +5080,16 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 -msgid "Lowest leased address as offset from the network address." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 @@ -4557,11 +5097,11 @@ msgstr "" msgid "MAC" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "" @@ -4569,16 +5109,15 @@ msgstr "" msgid "MAC Address For The Actor" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4587,11 +5126,15 @@ msgstr "" msgid "MAC address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "" @@ -4605,6 +5148,10 @@ msgstr "" msgid "MAP rule is invalid" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "" @@ -4626,15 +5173,19 @@ msgstr "" msgid "MII Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4642,7 +5193,7 @@ msgid "" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4651,74 +5202,82 @@ msgstr "" msgid "Manual" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 -msgid "Max RA interval" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4745,7 +5304,7 @@ msgstr "" msgid "Memory usage (%)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "" @@ -4753,10 +5312,18 @@ msgstr "" msgid "Mesh ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "" @@ -4769,7 +5336,7 @@ msgstr "" msgid "Method to determine link status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4780,11 +5347,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "" @@ -4792,13 +5359,13 @@ msgstr "" msgid "Minimum Number of Links" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4812,77 +5379,84 @@ msgstr "" msgid "Mirror source port" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "" @@ -4950,6 +5524,10 @@ msgstr "" msgid "Move up" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -4957,19 +5535,23 @@ msgstr "" msgid "Multicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "" @@ -4981,12 +5563,16 @@ msgstr "" msgid "NAT64 Prefix" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "" @@ -4999,18 +5585,23 @@ msgid "NTP server candidates" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "" @@ -5019,13 +5610,17 @@ msgstr "" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5034,32 +5629,36 @@ msgstr "" msgid "Network" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "" @@ -5072,7 +5671,7 @@ msgstr "" msgid "Network device is not present" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "" @@ -5081,7 +5680,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "" @@ -5090,25 +5689,30 @@ msgstr "" msgid "Network interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "" @@ -5116,13 +5720,13 @@ msgstr "" msgid "Next »" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "" @@ -5130,7 +5734,7 @@ msgstr "" msgid "No Data" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "" @@ -5146,9 +5750,17 @@ msgstr "" msgid "No RX signal" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5159,7 +5771,11 @@ msgstr "" msgid "No client associated" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "" @@ -5168,8 +5784,8 @@ msgstr "" msgid "No data received" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "" @@ -5182,15 +5798,11 @@ msgstr "" msgid "No entries available" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5204,7 +5816,7 @@ msgstr "" msgid "No host route" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5225,30 +5837,39 @@ msgstr "" msgid "No more slaves available, can not save interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "" @@ -5262,7 +5883,8 @@ msgid "No validation or filtering" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "" @@ -5274,37 +5896,40 @@ msgstr "" msgid "Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "" @@ -5317,7 +5942,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "" @@ -5329,12 +5954,18 @@ msgstr "" msgid "Not supported" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "" @@ -5343,7 +5974,7 @@ msgstr "" msgid "Notice" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "" @@ -5351,7 +5982,7 @@ msgstr "" msgid "Number of IGMP membership reports" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" @@ -5368,7 +5999,7 @@ msgid "Obfuscated Password" msgstr "" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5379,6 +6010,7 @@ msgid "Obtain IPv6 address" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "" @@ -5387,6 +6019,12 @@ msgstr "" msgid "Off-State Delay" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "" @@ -5395,15 +6033,15 @@ msgstr "" msgid "On-State Delay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "" @@ -5421,7 +6059,11 @@ msgstr "" msgid "One or more required fields have no value!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" @@ -5430,49 +6072,60 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "" @@ -5480,29 +6133,38 @@ msgstr "" msgid "Option \"%s\" must not be empty." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5510,17 +6172,17 @@ msgid "" "for the interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "" @@ -5528,13 +6190,13 @@ msgstr "" msgid "Optional. Do not create host routes to peers." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5549,11 +6211,11 @@ msgstr "" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5561,7 +6223,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5575,7 +6237,7 @@ msgstr "" msgid "Options" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4wg0.conf
    ) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "" @@ -5945,11 +6652,19 @@ msgstr "" msgid "Peak:" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "" @@ -5958,11 +6673,11 @@ msgstr "" msgid "Peer address is missing" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "" @@ -5993,10 +6708,14 @@ msgstr "" msgid "Permission denied" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6005,13 +6724,13 @@ msgstr "" msgid "Phy Rate:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "" @@ -6024,11 +6743,11 @@ msgstr "" msgid "Pkts." msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "" @@ -6036,56 +6755,74 @@ msgstr "" msgid "Policy" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6108,13 +6845,14 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 @@ -6127,29 +6865,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6167,8 +6907,8 @@ msgid "Prot." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6180,13 +6920,13 @@ msgstr "" msgid "Provide NTP server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "" @@ -6196,25 +6936,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6239,59 +6990,83 @@ msgstr "" msgid "Quality" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "" @@ -6304,10 +7079,16 @@ msgstr "" msgid "RX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6317,11 +7098,11 @@ msgstr "" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "" @@ -6329,11 +7110,11 @@ msgstr "" msgid "Realtime Graphs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "" @@ -6357,11 +7138,39 @@ msgstr "" msgid "Receive" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "" @@ -6369,12 +7178,12 @@ msgstr "" msgid "Redirect to HTTPS" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "" @@ -6383,37 +7192,47 @@ msgstr "" msgid "References" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "" @@ -6423,6 +7242,10 @@ msgstr "" msgid "Relay Bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "" @@ -6432,6 +7255,14 @@ msgstr "" msgid "Relay bridge" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6441,6 +7272,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "" @@ -6453,15 +7285,23 @@ msgstr "" msgid "Remote IPv6 address or FQDN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "" @@ -6491,7 +7331,8 @@ msgstr "" msgid "Require incoming packets serialization (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "" @@ -6507,7 +7348,7 @@ msgstr "" msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6519,67 +7360,73 @@ msgstr "" msgid "Required. XFRM interface ID to be used for SA." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "" @@ -6588,7 +7435,7 @@ msgid "Reselection policy for primary slave" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6603,20 +7450,24 @@ msgstr "" msgid "Reset to defaults" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "" @@ -6625,7 +7476,7 @@ msgstr "" msgid "Restart Firewall" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "" @@ -6637,86 +7488,97 @@ msgstr "" msgid "Restore backup" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6731,19 +7593,19 @@ msgstr "" msgid "Round-Robin policy (balance-rr, 0)" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6761,6 +7623,10 @@ msgstr "" msgid "Routing" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6773,24 +7639,24 @@ msgstr "" msgid "Rule" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "" @@ -6810,11 +7676,24 @@ msgstr "" msgid "SHA256" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6832,15 +7711,15 @@ msgstr "" msgid "SSH username" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "" @@ -6857,7 +7736,7 @@ msgstr "" msgid "SWAP" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -6868,7 +7747,7 @@ msgid "Save" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "" @@ -6885,7 +7764,7 @@ msgstr "" msgid "Save mtdblock contents" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "" @@ -6894,11 +7773,16 @@ msgstr "" msgid "Scheduled Tasks" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "" @@ -6913,9 +7797,9 @@ msgid "" "your device!" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "" @@ -6923,13 +7807,13 @@ msgstr "" msgid "Selects the transmit hash policy to use for slave selection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "" @@ -6948,11 +7832,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "" @@ -6977,16 +7865,20 @@ msgstr "" msgid "Set Static" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -6996,14 +7888,14 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7017,32 +7909,41 @@ msgstr "" msgid "Set to first slave added to the bond (follow, 2)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 msgid "Setting PLMN failed" msgstr "" -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 -msgid "Setting operation mode failed" +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 +msgid "Setting operation mode failed" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 @@ -7050,12 +7951,11 @@ msgstr "" msgid "Short GI" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "" @@ -7068,16 +7968,16 @@ msgstr "" msgid "Show raw counters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7085,15 +7985,15 @@ msgstr "" msgid "Signal" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "" @@ -7101,12 +8001,12 @@ msgstr "" msgid "Signal:" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "" @@ -7123,12 +8023,12 @@ msgstr "" msgid "Skip from backup files that are equal to those in /rom" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "" @@ -7146,14 +8046,10 @@ msgstr "" msgid "Some fields are invalid, cannot save values!" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7161,8 +8057,8 @@ msgid "" "instructions." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7189,26 +8085,26 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7233,7 +8129,7 @@ msgstr "" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "" @@ -7241,7 +8137,7 @@ msgstr "" msgid "Specifies the aggregation selection logic to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "" @@ -7249,20 +8145,20 @@ msgstr "" msgid "Specifies the directory the device is attached to" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "" @@ -7290,7 +8186,7 @@ msgid "" "dead" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7307,7 +8203,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7338,15 +8234,15 @@ msgid "" "sends learning packets to each slaves peer switch" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7368,19 +8264,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "" @@ -7400,7 +8296,7 @@ msgid "" "link recovery detection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7495,15 +8391,23 @@ msgid "" "bytes)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "" @@ -7516,16 +8420,16 @@ msgstr "" msgid "Start priority" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "" @@ -7534,6 +8438,10 @@ msgstr "" msgid "Startup" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "" @@ -7547,7 +8455,7 @@ msgstr "" msgid "Static Lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "" @@ -7557,25 +8465,25 @@ msgstr "" msgid "Static address" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "" @@ -7584,8 +8492,8 @@ msgstr "" msgid "Stop WPS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "" @@ -7593,11 +8501,11 @@ msgstr "" msgid "Storage" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "" @@ -7606,15 +8514,15 @@ msgid "Strong" msgstr "" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "" @@ -7645,7 +8553,7 @@ msgstr "" msgid "Switch port" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "" @@ -7655,7 +8563,7 @@ msgstr "" msgid "Switch to CIDR list notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "" @@ -7667,8 +8575,16 @@ msgstr "" msgid "Sync with browser" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7692,9 +8608,9 @@ msgstr "" msgid "System log buffer size" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "" @@ -7723,7 +8639,7 @@ msgstr "" msgid "TCP:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "" @@ -7736,26 +8652,37 @@ msgstr "" msgid "TX Rate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "" @@ -7771,26 +8698,26 @@ msgstr "" msgid "Terminate" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7806,7 +8733,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7818,18 +8749,24 @@ msgid "" "username instead of the user ID!" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "" @@ -7837,6 +8774,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "" @@ -7851,6 +8789,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -7861,7 +8805,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "" @@ -7878,21 +8822,25 @@ msgstr "" msgid "The LED is always in default state on." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -7902,13 +8850,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -7926,18 +8874,18 @@ msgid "" "
    /dev/sda1)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -7954,7 +8902,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "" @@ -7962,31 +8910,47 @@ msgstr "" msgid "The gateway address must not be a local IP address" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "" @@ -8009,6 +8973,7 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "" @@ -8023,7 +8988,7 @@ msgstr "" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8032,7 +8997,7 @@ msgid "" "detect the loss of the last member of a group" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8040,19 +9005,19 @@ msgid "" "host responses are spread out over a larger interval" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "" @@ -8066,14 +9031,14 @@ msgid "" "next greater network like the internet and other ports for a local network." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" @@ -8086,31 +9051,31 @@ msgstr "" msgid "The restore command failed with code %d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "" @@ -8142,6 +9107,14 @@ msgstr "" msgid "The sysupgrade command failed with code %d" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8163,30 +9136,37 @@ msgid "" "you choose the generic image format for your platform." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8197,16 +9177,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8219,6 +9199,17 @@ msgid "" "password if no update key has been configured" msgstr "" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8231,7 +9222,7 @@ msgid "" "ends with ...:2/64" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" @@ -8259,8 +9250,8 @@ msgid "" "their status." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "" @@ -8275,31 +9266,39 @@ msgstr "" msgid "Time Synchronization" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" @@ -8307,17 +9306,13 @@ msgstr "" msgid "Timezone" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8325,7 +9320,7 @@ msgid "" "reset\" (only possible with squashfs images)." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "" @@ -8333,12 +9328,16 @@ msgstr "" msgid "Total Available" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8350,11 +9349,11 @@ msgstr "" msgid "Traffic Class" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "" @@ -8371,6 +9370,26 @@ msgstr "" msgid "Transmit Hash Policy" msgstr "" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8409,7 +9428,7 @@ msgstr "" msgid "Tunnel Link" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "" @@ -8418,13 +9437,13 @@ msgid "Tx-Power" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "" @@ -8473,7 +9492,7 @@ msgstr "" msgid "Unable to determine upstream interface" msgstr "" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "" @@ -8524,19 +9543,31 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8550,7 +9581,7 @@ msgstr "" msgid "Unknown" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "" @@ -8574,11 +9605,11 @@ msgstr "" msgid "Unmount" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "" @@ -8592,15 +9623,25 @@ msgid "Unsupported MAP type" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -8612,7 +9653,7 @@ msgstr "" msgid "Up Delay" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "" @@ -8627,56 +9668,64 @@ msgstr "" msgid "Upload archive..." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "" @@ -8685,13 +9734,18 @@ msgstr "" msgid "Use DHCP gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "" @@ -8737,22 +9791,25 @@ msgstr "" msgid "Use broadcast flag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "" @@ -8776,15 +9833,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -8807,69 +9864,71 @@ msgstr "" msgid "Used" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "" @@ -8889,24 +9948,27 @@ msgstr "" msgid "VPN Local port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "" @@ -8915,6 +9977,10 @@ msgstr "" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "" @@ -8928,14 +9994,14 @@ msgstr "" msgid "VXLANv6 (RFC7348)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -8961,7 +10027,7 @@ msgstr "" msgid "Vendor Class to send when requesting DHCP" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" @@ -8969,12 +10035,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "" @@ -8982,34 +10048,46 @@ msgstr "" msgid "Virtual dynamic interface" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9036,48 +10114,99 @@ msgstr "" msgid "Weak" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9093,21 +10222,21 @@ msgid "Wireless Adapter" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "" @@ -9123,15 +10252,15 @@ msgstr "" msgid "Wireless is not associated" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "" @@ -9143,7 +10272,7 @@ msgstr "" msgid "XOR policy (balance-xor, 2)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9166,8 +10295,20 @@ msgid "" "scripts like \"network\", your device might become inaccessible!
    " msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9196,34 +10337,54 @@ msgstr "" msgid "ZRam Size" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "" @@ -9280,25 +10441,30 @@ msgctxt "nft unit" msgid "day" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "" @@ -9307,14 +10473,23 @@ msgstr "" msgid "e.g: dump" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "" @@ -9324,22 +10499,22 @@ msgstr "" msgid "forward" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "" @@ -9348,9 +10523,9 @@ msgctxt "nft unit" msgid "hour" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "" @@ -9358,6 +10533,10 @@ msgstr "" msgid "ignore" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9372,11 +10551,19 @@ msgstr "" msgid "key with either 5 or 13 characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "" @@ -9385,11 +10572,11 @@ msgctxt "nft unit" msgid "minute" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "" @@ -9401,18 +10588,26 @@ msgstr "" msgid "no" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "" @@ -9423,20 +10618,20 @@ msgid "not present" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "" @@ -9445,6 +10640,10 @@ msgstr "" msgid "output" msgstr "" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9462,23 +10661,32 @@ msgstr "" msgid "random" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "" @@ -9486,7 +10694,7 @@ msgstr "" msgid "sstpc Log-level" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "" @@ -9494,7 +10702,7 @@ msgstr "" msgid "tagged" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "" @@ -9505,25 +10713,27 @@ msgid "" "access." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9545,8 +10755,8 @@ msgid "untagged" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "" @@ -9559,7 +10769,7 @@ msgid "valid IPv4 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "" @@ -9588,7 +10798,7 @@ msgid "valid IPv6 CIDR" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "" @@ -9625,8 +10835,8 @@ msgstr "" msgid "valid address:port" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "" @@ -9666,11 +10876,21 @@ msgstr "" msgid "valid multicast MAC address" msgstr "" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "" @@ -9680,43 +10900,43 @@ msgid "valid port or port range (port1-port2)" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "" diff --git a/package/luci/modules/luci-base/po/tr/base.po b/package/luci/modules/luci-base/po/tr/base.po index e20cdfd18c..ffd4d69b07 100644 --- a/package/luci/modules/luci-base/po/tr/base.po +++ b/package/luci/modules/luci-base/po/tr/base.po @@ -2,34 +2,50 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-10-28 15:05+0000\n" -"Last-Translator: Oğuz Ersen \n" -"Language-Team: Turkish \n" +"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 5.2-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "!bilinen (bilinmeyen)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" table \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d geçersiz alan(lar)" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d sa önce" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d dak önce" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d sn önce" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s birçok VLAN'da etiketsiz!" @@ -54,10 +70,11 @@ msgstr "(boş)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(arayüz eklenmedi)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ %d daha" @@ -67,19 +84,19 @@ msgid "-- Additional Field --" msgstr "-- Ek Alan--" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Lütfen seçin --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- özel --" @@ -105,7 +122,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = RSSI eşiği kullanma 1 = sürücü varsayılanını değiştirme" @@ -118,12 +135,17 @@ msgstr "1" msgid "1 Minute Load:" msgstr "1 Dakikalık Yük:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "%d işaret" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12 saat (12 saat - varsayılan)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "15 Dakikalık Yük:" @@ -138,12 +160,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3 saat (3 saat)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4 karakterli onaltılık kimlik" @@ -156,43 +183,104 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "5 Dakikalık Yük:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5m (5 dakika)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "6-oktet tanımlayıcı heksadesimal değer olarak - iki nokta üst üste yok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7 gün (7 gün)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: Radyo ölçümleri aracılığıyla işaret raporunu etkinleştir." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Radyo ölçümleri aracılığıyla komşu raporunu etkinleştir." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r Hızlı Geçiş" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: BSS Maksimum Boşta Bekleme. Birim: saniye." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: Temel Hizmet Seti (BSS) geçiş yönetimi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Yönetim çerçevelerinde Yerel Saat Dilimi Bildirisi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Proxy ARP, AP olmayan STA'nın daha uzun süre güç tasarrufunda " +"kalmasını sağlar." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Yönetim çerçevelerinde Zaman Bildirimi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Kablosuz Ağ Yönetimi (WNM) Uyku Modu (istasyonlar için " +"genişletilmiş uyku modu)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Kablosuz Ağ Yönetimi (WNM) Uyku Modu Düzeltmeleri: Yeniden yükleme " +"saldırılarını önler." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w Bağlantı SA Sorgu maksimum zaman aşımı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11w Bağlantı SA Sorgusu yeniden deneme zaman aşımı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w Yönetim Çerçevesi Koruması" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w maksimum zaman aşımı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w yeniden deneme zaman aşımı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-Ağ maskesi" @@ -204,30 +292,46 @@ msgstr "LED Yapılandırma" msgid "LED Name" msgstr "LED Adı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-Proxy'si" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA Bayrakları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA Atlama Sınırı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA Ömrü" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-Servisi" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ herhangi bir alanla eşleşir. /example.com/, " +"NXDOMAIN değerini döndürür." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/#, example.com ve alt alanları için NULL adresleri " +"(0.0.0.0 ve ::) döndürür." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -273,11 +377,23 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s %s kümesinde değil" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"Bir batman-adv düğümü, sunucu modunda (internet bağlantısını ağ ile " +"paylaşarak) veya istemci modunda (ağ içinde en uygun internet bağlantısını " +"ararken) veya ağ geçidi desteğinin tamamen kapatılmasıyla (varsayılan ayar " +"budur) çalışabilir." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "\"%s\" cihazı için bir yapılandırma zaten var" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Aynı isim ile bir dizin zaten bulunuyor." @@ -286,25 +402,90 @@ msgid "A new login is required since the authentication session expired." msgstr "" "Kimlik doğrulama oturumu sona erdiğinden dolayı yeni bir oturum açma gerekli." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (tüm varyantlar) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (tüm varyantlar) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (tüm varyantlar) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (tüm varyantlar) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (tüm varyantlar) Annex B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (tüm varyantlar) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (tüm varyantlar) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annex L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -337,29 +518,40 @@ msgstr "Seçilen poliçede ARP izlemesi desteklenmiyor!" msgid "ARP retry threshold" msgstr "ARP yenileme aralığı" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "ARP trafik tablosu \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"Çok noktaya yayın hedef MAC'leri ile ARP, IPv4 ve IPv6 (hatta 802.1Q), STA " +"MAC adresine tek yayındır. Not: Bu, 802.11v'deki Yönlendirilmiş Çok Noktaya " +"Yayın Hizmeti (DMS) değildir. Not: alıcının STA çok noktaya yayın " +"beklentilerini bozabilir." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (Eşzamansız Aktarım Modu)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM Köprüleri" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM Sanal Kanal Tanımlayıcı (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM Sanal Yol Tanımlayıcı (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -369,27 +561,23 @@ msgstr "" "bağlanmak için DHCP veya PPP ile birlikte kullanılabilen sanal Linux ağ " "arayüzleri olarak gösterir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM cihaz numarası" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C Sistem Satıcısı Kimliği" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Eksik Arayüz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "DNS hizmetini, DNS hizmeti verdiğimiz alt ağ arabirimleriyle sınırlayın." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Yerelden gelenleri kabul et" @@ -398,7 +586,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Paketi kabul et" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Yerel adreslerden gelen paketleri kabul et" @@ -406,16 +594,25 @@ msgstr "Yerel adreslerden gelen paketleri kabul et" msgid "Access Concentrator" msgstr "Erişim Çoğullayıcı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Erişim Noktası" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Erişim Noktası İzolasyonu" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Erişim Teknolojileri" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Eylemler" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Etkin" @@ -453,8 +650,8 @@ msgstr "Aktif IPv6 Kurallar" msgid "Active-Backup policy (active-backup, 1)" msgstr "Etkin-Yedekleme politikası (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -471,18 +668,18 @@ msgstr "Uyarlanabilir iletim yükü dengeleme (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Ekle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "ATM Köprüsü Ekle" @@ -502,11 +699,11 @@ msgstr "LED eylemi ekle" msgid "Add VLAN" msgstr "VLAN ekle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Cihaz yapılandırması ekle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Cihaz yapılandırması ekle…" @@ -514,18 +711,18 @@ msgstr "Cihaz yapılandırması ekle…" msgid "Add instance" msgstr "Örnek ekle" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Anahtar ekle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "Host dosyalarından sunulan adlara yerel etki alanı son eki ekle." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Yeni arabirim ekle..." @@ -533,6 +730,10 @@ msgstr "Yeni arabirim ekle..." msgid "Add peer" msgstr "Eş ekle" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "Bu ana bilgisayar için statik ileri ve geri DNS girişlerini ekle." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Kara Listeye Ekle" @@ -541,11 +742,11 @@ msgstr "Kara Listeye Ekle" msgid "Add to Whitelist" msgstr "Beyaz Listeye Ekle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Ek Hosts dosyaları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Ek sunucular dosyası" @@ -562,7 +763,11 @@ msgstr "Ek sunucular dosyası" msgid "Address" msgstr "Adres" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "\"Aktarma kaynağı\" ve \"Aktarma adresi\" adres aileleri eşleşmelidir." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Adres ailesi" @@ -575,7 +780,7 @@ msgstr "Adres ayarı geçersiz" msgid "Address to access local relay bridge" msgstr "Yerel aktarma köprüsüne erişim adresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Adresler" @@ -584,29 +789,29 @@ msgstr "Adresler" msgid "Administration" msgstr "Yönetim" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Gelişmiş Ayarlar" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Gelişmiş cihaz seçenekleri" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Yaşlanma süresi" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Toplam İletim Gücü (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Gönderen Mesajlarını Birleştir" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -644,18 +849,18 @@ msgstr "Takma Ad Arayüzü" msgid "Alias of \"%s\"" msgstr "\"%s\" lakabı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Tüm Sunucular" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "" "Kullanılabilir en düşük adresten başlayarak IP adreslerini sırayla tahsis et." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Sırayla IP tahsis et" @@ -665,12 +870,12 @@ msgid "Allow SSH password authentication" msgstr "" "SSH parola kimlik doğrulamasına izin ver" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" "Düşük ACK durumuna göre AP modunun STA'ların bağlantısını kesmesine izin ver" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Listelenenlerin haricindekilere izin ver" @@ -678,15 +883,15 @@ msgstr "Listelenenlerin haricindekilere izin ver" msgid "Allow full UCI access for legacy applications" msgstr "Eski uygulamalar için tam UCI erişimine izin ver" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Eski 802.11b hızlarına izin ver" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Yanlızca listelenenlere izin ver" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Yerel ağa izin ver" @@ -709,19 +914,24 @@ msgid "Allow system feature probing" msgstr "Sistemin özellik araştırmasına izin ver" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "root kullanıcısının parolayla oturum açmasına izin ver" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "İzin verilen IP adresleri" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "İzin verilen ağ teknolojisi" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "AllowedIPs ayarı geçersiz" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Her zaman" @@ -733,12 +943,12 @@ msgstr "Her zaman kapalı (çekirdek: yok)" msgid "Always on (kernel: default-on)" msgstr "Her zaman açık (çekirdek: varsayılan-açık)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "Her zaman DHCP Seçeneklerini gönderin. Bazen gerekebilir, örn. PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -746,10 +956,14 @@ msgstr "" "İkincil kanal çakışsa bile her zaman 40MHz kanalları kullanın. Bu seçeneğin " "kullanılması IEEE 802.11n-2009 ile uyumlu değildir!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "Gönderilecek Yinelenen Adres Algılama problarının miktarı" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Modemin hazır olması için beklenecek saniye" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Formu kaydederken bir hata oluştu:" @@ -758,72 +972,23 @@ msgstr "Formu kaydederken bir hata oluştu:" msgid "An optional, short description for this device" msgstr "Bu cihaz için isteğe bağlı, kısa bir açıklama" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annex A + L + M (hepsi)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Annex A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Annex A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Annex A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Annex A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Annex B (hepsi)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Annex B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Annex B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Annex B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Annex J (hepsi)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Annex L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Annex M (hepsi)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Annex M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"RA mesajlarında NAT64 önekini " +"duyur." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Bu cihazı IPv6 DNS sunucusu olarak duyur." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." @@ -831,7 +996,7 @@ msgstr "" "Yerel bir IPv6 varsayılan yolu varsa, bu aygıtı varsayılan yönlendirici " "olarak duyur." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -839,7 +1004,7 @@ msgstr "" "Yerel varsayılan rota kullanılabilirliğinden bağımsız olarak, genel bir IPv6 " "öneki varsa bu cihazı varsayılan yönlendirici olarak duyur." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -847,15 +1012,15 @@ msgstr "" "Bir önek veya varsayılan yol olup olmadığına bakılmaksızın bu cihazı " "varsayılan yönlendirici olarak duyur." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "İlan edilen DNS alanları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Duyurulan IPv6 DNS sunucuları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Anonim Kimlik" @@ -867,7 +1032,7 @@ msgstr "Anonim Bağlama" msgid "Anonymous Swap" msgstr "Anonim Takas" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Herhangi bir paket" @@ -879,11 +1044,11 @@ msgstr "Herhangi bir paket" msgid "Any zone" msgstr "Herhangi bir bölge" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "Bu ağa DHCP Seçeneklerini uygulayın. (Boş = tüm istemciler)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "Ayarları uygula ve sakla" @@ -891,39 +1056,43 @@ msgstr "Ayarları uygula ve sakla" msgid "Apply backup?" msgstr "Yedek uygulansın mı?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Başvuru isteği %h durumuyla başarısız oldu" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Kontrolsuz olarak uygula" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "Bağlantı kaybından sonra geri al ile uygula" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Yapılandırma değişiklikleri uygulanıyor… %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Mimari" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Arp taraması" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Bu arabirime her genel IPv6 önekinin belirli uzunlukta bir bölümünü atayın" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "Bu girişe yeni, serbest biçimli etiketler atayın." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -931,7 +1100,7 @@ msgstr "" "Bu arabirim için bu onaltılık alt önek kimliğini kullanarak önek parçalarını " "atayın." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "İlişkili istasyonlar" @@ -940,8 +1109,8 @@ msgstr "İlişkili istasyonlar" msgid "Associations" msgstr "Bağlar" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" @@ -949,8 +1118,8 @@ msgstr "" "%h başına en az %h, %h " "çoğuşma" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -964,25 +1133,26 @@ msgstr "" "Bağlı cihazlar için yapılandırılmış bağlantı noktalarını etkinleştirmeye " "çalış" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Kimlik Doğrulama Grubu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Kimlik Doğrulama" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Kimlik doğrulama türü" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Yetkili" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "İzin Gerekli" @@ -990,7 +1160,9 @@ msgstr "İzin Gerekli" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1009,7 +1181,7 @@ msgid "Automatically check filesystem for errors before mounting" msgstr "" "Bağlamadan önce dosya sistemindeki hataları otomatik olarak kontrol edin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1033,6 +1205,10 @@ msgstr "Dosya Sistemini Otomatik Bağla" msgid "Automount Swap" msgstr "Takası Otomatik Bağla" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Kullanılabilir" @@ -1051,11 +1227,15 @@ msgstr "Kullanılabilir" msgid "Average:" msgstr "Ortalama:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Köprü Döngülerinden Kaçın" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1063,15 +1243,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "BSS Geçişi" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Geri" @@ -1080,11 +1264,7 @@ msgstr "Geri" msgid "Back to Overview" msgstr "Genel Bakışa dön" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Yapılandırmaya dön" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "Eş yapılandırmasına geri dön" @@ -1097,16 +1277,15 @@ msgid "Backup / Flash Firmware" msgstr "Yedekleme/Sistem Yazılımı Yükleme" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Yedek dosya listesi" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Bant" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Temel cihaz" @@ -1114,12 +1293,43 @@ msgstr "Temel cihaz" msgid "Base64-encoded public key of this interface for sharing." msgstr "Paylaşım için bu arayüzün Base64 ile kodlanmış genel anahtarı." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Batman Cihazı" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Batman Arayüzü" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv, ağ üzerinden akan tek noktaya yayın verileri için yerleşik bir " +"katman 2 parçalanmasına sahiptir ve bu, MTU'yu 1500 baytlık standart " +"Ethernet paket boyutunun ötesine yükseltmeye izin vermeyen arabirimler / " +"bağlantılar üzerinden batman-adv'yi çalıştırmaya izin verir. Parçalanma " +"etkinleştirildiğinde, batman-adv, büyük boyutlu paketleri otomatik olarak " +"parçalara ayıracak ve diğer uçta birleştirecektir. Varsayılan olarak " +"parçalanma etkindir, paket uyuyorsa etkin değildir ancak parçalamayı tamamen " +"devre dışı bırakmak mümkündür." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "İşaret Aralığı" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "İşaret Raporu" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1133,7 +1343,7 @@ msgstr "" msgid "Bind NTP server" msgstr "NTP sunucusu bağla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "Joker karakter adresi yerine arayüzlere dinamik olarak bağlan." @@ -1142,18 +1352,33 @@ msgstr "Joker karakter adresi yerine arayüzlere dinamik olarak bağlan." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Arabirimi bağla" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "Hizmet kayıtlarını bir alan adına bağla: hizmetlerin yerini belirtin." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"Hizmet kayıtlarını bir alan adına bağla: hizmetlerin yerini belirtin. RFC2782'ye bakın." + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1165,65 +1390,77 @@ msgstr "Tüneli bu arabirime bağla (isteğe bağlı)." msgid "Bitrate" msgstr "Bit hızı" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Bağlama Modu" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Bağlama Politikası" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "Hem \"Röleden\" hem de \"Röleden adrese\" belirtilmelidir." + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Köprü" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Köprü (MAC VLAN'lar arasında doğrudan iletişimi destekler)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Köprü VLAN filtreleme" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Köprü cihazı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "Köprü bağlantı noktasına özel seçenekler" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Köprü bağlantı noktaları" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "Köprü trafik tablosu \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Köprü birimi numarası" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Boş köprüyü getir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Önyükleme esnasında çalıştır" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "Bağlantı noktası bağlı olmasa bile köprü arayüzünü açın" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "Yayın" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Yayın politikası (broadcast, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Araştır…" @@ -1231,14 +1468,38 @@ msgstr "Araştır…" msgid "Buffered" msgstr "Tamponlanmış" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" +"CA sertifikası (PEM kodlamalı; Ağ geçidi sertifikasını doğrulamak için " +"sistem genelinde depolama yerine kullanın." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "CA sertifikası; boşsa, ilk bağlantıdan sonra kaydedilecektir." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "CLAT yapılandırması başarısız oldu" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "CNAME" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME veya fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (Harici olarak yönetilen arayüz)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "CPU kullanımı (%)" @@ -1253,18 +1514,25 @@ msgstr "Önbelleğe alınan" msgid "Call failed" msgstr "Çağrı başarısız" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"ISP'nin IPv6 ad sunucuları varsa ancak IPv6 yönlendirmesi sağlamıyorsa " +"yararlı olabilir." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "İptal" @@ -1272,32 +1540,32 @@ msgstr "İptal" msgid "Cannot parse configuration: %s" msgstr "Yapılandırma ayrıştırılamıyor: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "Diğer ana bilgisayarlara gönderilen gelen paketleri yakala" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "Herhangi bir yönlendirme kararından önce gelen paketleri yakala" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "Yerel sisteme yönlendirilen gelen paketleri yakala" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "Herhangi bir yönlendirme kararından sonra giden paketleri yakala" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "Yerel sistemden kaynaklanan giden paketleri yakala" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "NIC onları aldıktan hemen sonra paketleri yakala" @@ -1306,24 +1574,32 @@ msgstr "NIC onları aldıktan hemen sonra paketleri yakala" msgid "Category" msgstr "Kategori" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "Hücre Kimliği" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "Hücre Konumu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Sertifika kısıtlaması (Alan)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Sertifika kısıtlaması (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Sertifika kısıtlaması (Konu)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Sertifika kısıtlaması (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1331,8 +1607,8 @@ msgstr "" "Sertifika kısıtlaması alt dizesi - ör. /CN=wifi.mycompany.com
    Gerçek " "değerler için el sıkışma sırasında \"logread -f\" bölümüne bakın" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1340,8 +1616,8 @@ msgstr "" "DNS SAN değerlerine (varsa)
    veya Konu CN'ye (tam eşleşmeye) karşı " "sertifika kısıtlamaları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1349,8 +1625,8 @@ msgstr "" "DNS SAN değerlerine (varsa)
    veya Subject CN'ye (sonek eşleşmesine) " "karşı sertifika kısıtlamaları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1364,16 +1640,16 @@ msgstr "" msgid "Chain" msgstr "Zincir" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "Zincir kancası \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Değişiklikler" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Değişiklikler geri alındı." @@ -1384,18 +1660,19 @@ msgstr "Cihaza erişim için yönetici şifresini değiştirir" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Kanal" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Kablosuz Kanal Analizi" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Kanal genişliği" @@ -1403,7 +1680,7 @@ msgstr "Kanal genişliği" msgid "Check filesystems before mount" msgstr "Bağlamadan önce dosya sistemlerini kontrol edin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "Mevcut ağları bu kablosuzdan silmek için bu seçeneği işaretleyin." @@ -1420,8 +1697,8 @@ msgstr "Görüntü kontrol ediliyor…" msgid "Choose mtdblock" msgstr "Mtdblock seçin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1433,7 +1710,7 @@ msgstr "" "veya yeni bir bölge tanımlamak ve arayüzü buna eklemek için özel " "alanı doldurun." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1441,7 +1718,7 @@ msgstr "" "Bu kablosuz arayüze eklemek istediğiniz ağları seçin veya yeni bir ağ " "tanımlamak için özel alanı doldurun." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Şifre" @@ -1465,9 +1742,10 @@ msgstr "" "Belirtilen mtdblock dosyasını indirmek için \"mtdblock'u kaydet\" e " "tıklayın. (NOT: BU ÖZELLİK PROFESYONELLER İÇİNDİR!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "İstemci" @@ -1476,9 +1754,9 @@ msgstr "İstemci" msgid "Client ID to send when requesting DHCP" msgstr "DHCP istendiğinde gönderilecek İstemci Kimliği" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Kapat" @@ -1495,20 +1773,20 @@ msgstr "" "Belirli bir saniye süresinden sonra etkin olmayan bağlantıyı kapatın, " "bağlantıyı sürdürmek için 0'ı kullanın" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Listeyi kapat..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Veriler toplanıyor..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "Çarpışmalar görüldü" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Komut" @@ -1523,9 +1801,9 @@ msgstr "Komut başarısız oldu" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:73 msgid "Comment" -msgstr "Açıklama" +msgstr "Yorum" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1549,29 +1827,28 @@ msgstr "Giden sağlama toplamını hesaplayın (isteğe bağlı)." msgid "Config File" msgstr "Yapılandırma dosyası" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Yapılandırma" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "Yapılandırmayı Dışa Aktarma" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Yapılandırma değişiklikleri uygulandı." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Yapılandırma değişiklikleri geri alındı!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Yapılandırma başarısız oldu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1587,7 +1864,7 @@ msgstr "" "Yüksek, temel hız olarak 24 Mbps'yi yapılandırır. Minimum temel orandan daha " "düşük desteklenen oranlar sunulmaz." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." @@ -1595,7 +1872,7 @@ msgstr "" "RA mesajlarında varsayılan " "yönlendirici reklamını yapılandırır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1603,16 +1880,16 @@ msgstr "" "Bu arayüzde RA hizmetinin " "çalışma modunu yapılandırır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "Bu arabirimde DHCPv6 hizmetinin çalışma modunu yapılandırır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "Bu arabirimde NDP proxy hizmetinin çalışma modunu yapılandırır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Yapılandır…" @@ -1624,9 +1901,10 @@ msgstr "Bağlantı kesmeyi onaylayın" msgid "Confirmation" msgstr "Onayla" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Bağlandı" @@ -1636,11 +1914,11 @@ msgstr "Bağlandı" msgid "Connection attempt failed" msgstr "Bağlantı denemesi başarısız oldu" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "Bağlantı denemesi başarısız oldu." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "Bağlantı uç noktası" @@ -1652,7 +1930,7 @@ msgstr "Bağlantı koptu" msgid "Connections" msgstr "Bağlantılar" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "Bağlantı değişikliği" @@ -1683,9 +1961,9 @@ msgstr "" msgid "Contents have been saved." msgstr "İçerik kaydedildi." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1696,16 +1974,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "%h içinden devam et" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "Çağrı zincirine devam et" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "Eşleşmeyen paketleri işlemeye devam et" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1719,20 +1997,20 @@ msgstr "" msgid "Country" msgstr "Ülke" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Ülke Kodu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Kapsama hücresi yoğunluğu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Güvenlik duvarı bölgesi oluştur / ata" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Arayüz oluştur" @@ -1744,7 +2022,7 @@ msgstr "Kritik" msgid "Cron Log Level" msgstr "Cron Günlük Düzeyi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Mevcut güç" @@ -1787,31 +2065,31 @@ msgstr "" "Mümkünse, cihazın LED lerinin " "davranışını özelleştirir." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "DAD iletimleri" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE İstemcisi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE-Bağlantı Noktası" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAE-Gizli kelime" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "DHCP Seçenekleri" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP Sunucusu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP ve DNS" @@ -1822,16 +2100,24 @@ msgstr "DHCP ve DNS" msgid "DHCP client" msgstr "DHCP istemcisi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP-Seçenekleri" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" +"DHCPv4 leasetime, IPv6 önekinin limiti ve tercih edilen ömrü " +"olarak kullanılır." + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6 istemcisi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6 Hizmeti" @@ -1843,19 +2129,19 @@ msgstr "DHCPv6 Hizmeti" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "DNS iletimleri" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNS sorgusu bağlantı noktası" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "DNS arama alanları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" "DNS sunucusu bağlantı noktası" @@ -1864,7 +2150,7 @@ msgstr "" msgid "DNS setting is invalid" msgstr "DNS ayarı geçersiz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "DNS ağırlığı" @@ -1872,11 +2158,11 @@ msgstr "DNS ağırlığı" msgid "DNS-Label / FQDN" msgstr "DNS Etiketi / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "DNSSEC kontrolü imzalanmamış" @@ -1888,39 +2174,47 @@ msgstr "DPD Boşta Kalma Zaman Aşımı" msgid "DS-Lite AFTR address" msgstr "DS-Lite AFTR adresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "DSL Durumu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "DSL hat modu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "DTIM Aralığı" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Veri hızı" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Alınan Veriler" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "İletilen Veriler" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Hata ayıklama" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Varsayılan yönlendirici" @@ -1928,7 +2222,7 @@ msgstr "Varsayılan yönlendirici" msgid "Default state" msgstr "Varsayılan durum" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1937,7 +2231,7 @@ msgstr "" "Ek DHCP seçeneklerini tanımlayın, örneğin istemcilere farklı DNS " "sunucularını tanıtın \"6,192.168.2.1,192.168.2.2\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" @@ -1945,7 +2239,7 @@ msgstr "" "Linux dahili paket önceliğinin, giden çerçeveler için VLAN başlık önceliğine " "eşlenmesini tanımlar" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" @@ -1953,49 +2247,50 @@ msgstr "" "Gelen çerçevelerde VLAN başlık önceliğinin Linux dahili paket önceliğine " "eşlenmesini tanımlar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "Bu rota için belirli bir MTU tanımlar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "IPv6 öneklerini temsil et" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Sil" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Anahtarı sil" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Silme isteği başarısız oldu: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Bu ağı sil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Teslimat Trafiği Gösterge Mesaj Aralığı" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Açıklama" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Seçimi kaldır" @@ -2003,11 +2298,11 @@ msgstr "Seçimi kaldır" msgid "Design" msgstr "Tasarım" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "Belirlenmiş asıl" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2042,9 +2337,9 @@ msgstr "Hedef bölge" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2054,36 +2349,40 @@ msgstr "Hedef bölge" msgid "Device" msgstr "Cihaz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Cihaz Yapılandırması" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "Cihaz Tanımlayıcı" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Cihaz aktif değil" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Cihaz yeniden başlatılıyor…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Cihaz adı" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Cihaz, ModemManager tarafından yönetilmiyor." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Cihaz mevcut değil" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Cihaz tipi" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Cihaza ulaşılamıyor!" @@ -2091,31 +2390,31 @@ msgstr "Cihaza ulaşılamıyor!" msgid "Device unreachable! Still waiting for device..." msgstr "Cihaza ulaşılamıyor! Hâlâ cihaz bekleniyor ..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Aygıtlar" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Tanılama" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Arama numarası" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Dizin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Devre dışı bırak" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2132,20 +2431,24 @@ msgstr "DNS sorgularını devre dışı bırakın" msgid "Disable Encryption" msgstr "Şifrelemeyi Devre Dışı Bırak" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Hareketsizlik Yoklamasını Devre Dışı Bırak" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Bu ağı devre dışı bırak" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2154,34 +2457,33 @@ msgstr "Bu ağı devre dışı bırak" msgid "Disabled" msgstr "Devre dışı" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "Etkisizleştirilmiş" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Düşük Onayda İlişkilendirmeyi Kes" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" "RFC1918 adreslerini içeren yukarı akış yanıtlarını yoksay." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Bağlantıyı kes" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Bağlantı kesme girişimi başarısız oldu" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Bağlantı kesme girişimi başarısız oldu." @@ -2191,23 +2493,37 @@ msgstr "Disk alanı" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Kapat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Mesafe Optimizasyonu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Metre cinsinden en uzak ağ üyesine olan mesafe." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Dağıtılmış ARP Tablosu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" +"Bu DHCP ana bilgisayar bölümünün bağlı olduğu Dnsmasq örneği. " +"Belirtilmemişse bölüm tüm dnsmasq örnekleri için geçerlidir." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2215,7 +2531,7 @@ msgstr "" "Bu önyükleme bölümünün bağlı olduğu dnsmasq örneği. Belirtilmemişse, bölüm " "tüm dnsmasq örnekleri için geçerlidir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS sunucusu ve DNS " "yönlendiricisidir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" "Olumsuz yanıtları önbelleğe alma, ör. mevcut olmayan etki alanları için." @@ -2238,32 +2554,23 @@ msgstr "" msgid "Do not create host route to peer (optional)." msgstr "Eşe ana bilgisayar yolu oluşturmayın (isteğe bağlı)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "DNS sorgularını noktalar veya etki alanı bölümleri olmadan iletme." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "Genel ad sunucuları tarafından yanıtlanamayan istekleri iletme." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "Yerel ağlar için geriye doğru aramaları iletme." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Bu arayüzlerde dinlemeyi önle." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "Bu arayüzde DHCPv6 hizmeti sunma." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Katılma" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2275,7 +2582,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Bir ana bilgisayar adı göndermeyin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2283,11 +2590,11 @@ msgstr "" "Bu arayüzde herhangi bir RA mesajı gönderme." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "\"%s\" yi gerçekten silmek istiyor musunuz?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Aşağıdaki SSH anahtarını gerçekten silmek istiyor musunuz?" @@ -2295,11 +2602,11 @@ msgstr "Aşağıdaki SSH anahtarını gerçekten silmek istiyor musunuz?" msgid "Do you really want to erase all settings?" msgstr "Tüm ayarları gerçekten silmek istiyor musunuz?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "\"%s\" dizinini gerçekten yinelemeli olarak silmek istiyor musunuz?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "Mevcut şifreyi (PSK) değiştirmek istiyor musunuz?" @@ -2307,15 +2614,17 @@ msgstr "Mevcut şifreyi (PSK) değiştirmek istiyor musunuz?" msgid "Do you want to replace the current keys?" msgstr "Mevcut anahtarları değiştirmek istiyor musunuz?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Alan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Alan gerekli" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Alan beyaz listesi" @@ -2341,11 +2650,11 @@ msgstr "Yedeği indir" msgid "Download mtdblock" msgstr "Mtdblock'u indir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Aşağı akış SNR ofseti" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2361,16 +2670,64 @@ msgstr "Yeniden sıralamak için sürükleyin" msgid "Drop Duplicate Frames" msgstr "Yinelenen Çerçeveleri Bırak" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"Tüm gereksiz ARP çerçevelerini bırak; örneğin, ağda bilinen iyi bir ARP " +"proxy'si varsa ve bu tür çerçevelerin kullanılması gerekmiyorsa veya 802.11 " +"durumunda, saldırıları önlemek için kullanılmamalıdır." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Tüm istenmeyen komşu duyurularını bırak; örneğin ağda bilinen iyi bir NA " +"proxy varsa ve bu tür çerçevelerin kullanılması gerekmiyorsa veya 802.11 " +"durumunda saldırıları önlemek için kullanılmamalıdır." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Karşılıksız ARP'yi bırak" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" +"IPv4 tek noktaya yayın paketlerini içeren katman 2 çok noktaya yayın " +"çerçevelerini bırak." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" +"IPv6 tek noktaya yayın paketlerini içeren katman 2 çok noktaya yayın " +"çerçevelerini bırak." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Yuvalanmış IPv4 tek noktaya yayınını bırak" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Yuvalanmış IPv6 tek noktaya yayınını bırak" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Paketi bırak" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "Eşleşmeyen paketleri bırak" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Talep edilmemiş NA'yı bırak" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbear Örneği" @@ -2388,20 +2745,20 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Dinamik DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "Dinamik Yetkilendirme Uzantısı istemcisi." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "Dinamik Yetkilendirme Uzantısı bağlantı noktası." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "Dinamik Yetkilendirme Uzantısı gizli anahtarı." @@ -2409,7 +2766,7 @@ msgstr "Dinamik Yetkilendirme Uzantısı gizli anahtarı." msgid "Dynamic tunnel" msgstr "Dinamik tünel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2417,21 +2774,33 @@ msgstr "" "İstemciler için dinamik olarak DHCP adresleri tahsis edin. Devre dışı " "bırakılırsa, yalnızca statik kiralamaya sahip istemcilere hizmet verilir." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Örneğin. br-vlan veya brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Örneğin. eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "EA bit uzunluğu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAP Yöntemi" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Her STA'ya kendi AP_VLAN arayüzü atanır." + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Düzenle" @@ -2439,6 +2808,10 @@ msgstr "Düzenle" msgid "Edit peer" msgstr "Eşi düzenle" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "Statik kiralamayı düzenle" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2447,11 +2820,11 @@ msgstr "" "Herhangi bir hatayı düzeltmek için yukarıdaki ham yapılandırma verilerini " "düzenleyin ve sayfayı yeniden yüklemek için \"Kaydet\" i tıklayın." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Bu ağı düzenleyin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Kablosuz ağı düzenleyin" @@ -2460,46 +2833,36 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "Etkili rota MTU'su" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Çıkış QoS eşlemesi" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "Çıkış cihazı kimliği" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Çıkış cihazı adı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Çıkış etiketlendi" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Çıkış etiketi kaldırıldı" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Acil Durum" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Etkinleştir" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" "Eşi Etkinleştir / Devre Dışı Bırak. Değişiklikleri uygulamak için wireguard " "arayüzünü yeniden başlatın." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2507,11 +2870,11 @@ msgstr "" "IGMP gözetlemesini " "etkinleştirin" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "STP'yi etkinleştir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" "SLAAC 'ı etkinleştir" @@ -2530,10 +2893,11 @@ msgstr "Akışların Dinamik Karıştırılmasını Etkinleştir" msgid "Enable HE.net dynamic endpoint update" msgstr "HE.net dinamik uç nokta güncellemesini etkinleştirin" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "IPv6'yı etkinleştir" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "IPv6 anlaşmasını etkinleştir" @@ -2547,11 +2911,15 @@ msgstr "IPv6 anlaşmasını etkinleştir" msgid "Enable IPv6 negotiation on the PPP link" msgstr "PPP bağlantısında IPv6 anlaşmasını etkinleştirin" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "IPv6 segment yönlendirmesini etkinleştir" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Jumbo Çerçeve geçişini etkinleştir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "MAC adresi öğrenmeyi etkinleştirin" @@ -2563,11 +2931,11 @@ msgstr "NTP istemcisini etkinleştir" msgid "Enable Single DES" msgstr "Tek DES'i Etkinleştir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "TFTP sunucusunu etkinleştir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "VLAN filtrelemeyi etkinleştir" @@ -2575,7 +2943,7 @@ msgstr "VLAN filtrelemeyi etkinleştir" msgid "Enable VLAN functionality" msgstr "VLAN işlevselliğini etkinleştirin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "WPS düğmesini etkinleştirin, WPA(2)-PSK/WPA3-SAE gerektirir" @@ -2589,13 +2957,13 @@ msgstr "" "title=\"Hypertext Transfer Protocol Secure\">HTTPS bağlantı noktasına " "otomatik olarak yeniden yönlendirilmesini etkinleştirin." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" "Bu arabirimde bulunan IPv6 öneklerinin aşağı akış yetkisini etkinleştirin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Anahtar yeniden yüklemeye (KRACK) karşı önlemleri etkinleştirin" @@ -2611,26 +2979,26 @@ msgstr "Gelen paketlerin yansıtılmasını etkinleştir" msgid "Enable mirroring of outgoing packets" msgstr "Giden paketlerin yansıtılmasını etkinleştir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "Çok noktaya yayın hızlı ayrılmayı etkinleştir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "Çok noktaya yayın sorgulayıcısını etkinleştir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Çoklu yayın desteğini etkinleştirin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Tüm CPU'larda paket yönlendirmeyi etkinleştirin. Ağ hızını arttırabilir veya " "aksine yavaşlatabilir." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Karışık modu etkinleştir" @@ -2652,11 +3020,11 @@ msgstr "Çok noktaya yayın trafiği desteğini etkinleştirin (isteğe bağlı) msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Kapsüllenen paketlerin DF (Parçalama) bayrağını etkinleştirin." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "Yerleşik tek örnekli TFTP sunucusunu etkinleştirin." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Bu ağı etkinleştirin" @@ -2665,21 +3033,24 @@ msgstr "Bu ağı etkinleştirin" msgid "Enable tx checksum" msgstr "TX sağlama toplamını etkinleştir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "Tek noktaya yayın taşmasını etkinleştir" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" -msgstr "Etkin" +msgstr "Etkinleştirilmiş" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Bu köprüde IGMP gözetlemesini etkinleştirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2687,7 +3058,15 @@ msgstr "" "Aynı Mobilite Etki Alanına ait erişim noktaları arasında hızlı dolaşımı " "etkinleştirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" +"batman-adv'de daha verimli, grup farkındalıklı çok noktaya yayın yönlendirme " +"altyapısı sağlar." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Bu köprüde Yayılan Ağaç Protokolünü etkinleştirir" @@ -2695,24 +3074,29 @@ msgstr "Bu köprüde Yayılan Ağaç Protokolünü etkinleştirir" msgid "Encapsulation limit" msgstr "Kapsülleme sınırı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Encapsulation modu" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Şifreleme" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Bitiş Noktası" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Uç Nokta Ana Bilgisayarı" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Uç Nokta Bağlantı Noktası" @@ -2720,23 +3104,23 @@ msgstr "Uç Nokta Bağlantı Noktası" msgid "Endpoint setting is invalid" msgstr "Uç nokta ayarı geçersiz" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "IGMPv1'i zorunlu kılın" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "IGMPv2'yi zorunlu kılın" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "IGMPv3'ü zorunlu kılın" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "MLD sürüm 1'i zorunlu kılın" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "MLD sürüm 2'yi zorunlu kılın" @@ -2765,10 +3149,6 @@ msgstr "Hata" msgid "Error getting PublicKey" msgstr "PublicKey alınırken hata oluştu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Hatalı saniye (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2787,11 +3167,19 @@ msgstr "30 saniyede bir (yavaş, 0)" msgid "Every second (fast, 1)" msgstr "Her saniye (hızlı, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Arayüzleri hariç tut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" +"Diğer sistemlere bağlantıyı ve ad çözümlemesini kontrol etmek için çeşitli " +"ağ komutlarının yürütülmesi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2799,27 +3187,37 @@ msgstr "" "127.0.0.0/8 ve ::1 ögelerini yeniden bağlama " "denetimlerinden hariç tut, örn. RBL hizmetleri için." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Mevcut cihaz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Ana bilgisayarları genişlet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Beklenen bağlantı noktası numarası." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Onaltılık bir atama ipucu bekleniyor" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Geçerli bir IPv4 adresi bekleniyor" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Geçerli bir IPv6 adresi bekleniyor" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" +"İsteğe bağlı olarak joker karakterler de dahil olmak üzere geçerli bir MAC " +"adresi bekleniyor" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "İki nokta üst üste ile ayrılmış iki öncelik değeri bekleniyor" @@ -2828,11 +3226,11 @@ msgstr "İki nokta üst üste ile ayrılmış iki öncelik değeri bekleniyor" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Beklenen: %s" @@ -2844,7 +3242,7 @@ msgstr "Beklenen: boş olmayan değer" msgid "Expires" msgstr "Bitiş zamanı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "" @@ -2855,11 +3253,11 @@ msgstr "" msgid "External" msgstr "Harici" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Harici R0 Anahtar Tutucu Listesi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Harici R1 Anahtar Tutucu Listesi" @@ -2887,35 +3285,63 @@ msgstr "Ekstra pppd seçenekleri" msgid "Extra sstpc options" msgstr "Ekstra sstpc seçenekleri" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "DS üzerinden FT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "Air üzerinden FT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "FT protokolü" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "Başarısız Sebep" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Sistem şifresi değiştirilemedi." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Modem yapılandırılamadı" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "%ds içinde ayarlar uygulanamadı, geri alma bekleniyor…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Bağlanmada hata meydana geldi" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Bağlantıyı kesmede hata meydana geldi" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "\"/etc/init.d/%s %s\" eylemi yürütülemedi: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Modem bilgileri alınamadı" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Modem başlatılamadı" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Çalışma modu ayarlanamadı" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Dosya" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2924,24 +3350,24 @@ msgstr "" "listeleyen dosya, ör. server=1.2.3.4, server=/" "domain/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Dosyaya erişilemiyor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "DHCP kiralama bilgilerinin saklanacağı dosya." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "Yukarı akış çözümleyicilerinin olduğu dosya." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Dosya adı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "İstemcilere tanıtılan önyükleme kalıbının dosya adı." @@ -2950,14 +3376,22 @@ msgstr "İstemcilere tanıtılan önyükleme kalıbının dosya adı." msgid "Filesystem" msgstr "Dosya sistemi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "IPv4 A kayıtlarını filtrele" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "IPv6 AAAA kayıtlarını filtrele" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "SRV/SOA hizmet keşfini filtrele" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Özelleri filtrele" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Faydasızları filtrele" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Tüm bağımlı birimler için filtreleme, doğrulama yok" @@ -2970,8 +3404,15 @@ msgstr "Tüm bağımlılar için filtreleme, sadece aktif bağımlı için doğr msgid "Filtering for all slaves, validation only for backup slaves" msgstr "Tüm bağımlılar için filtreleme, sadece yedek bağımlılar için doğrulama" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" +"İsteğe bağlı arama bağlantılarının tetiklenmesini önlemek için SRV/SOA " +"hizmet keşfini filtreler." + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Sonlandırma başarısız oldu" @@ -2983,7 +3424,7 @@ msgstr "" "Şu anda bağlı olan tüm dosya sistemlerini bulun ve tespit edilenlere göre " "yapılandırmayı varsayılanlarla değiştirin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Ağ bul ve katıl" @@ -2997,10 +3438,11 @@ msgid "Firewall" msgstr "Güvenlik Duvarı" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Güvenlik Duvarı İşareti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Güvenlik Duvarı Ayarları" @@ -3008,19 +3450,19 @@ msgstr "Güvenlik Duvarı Ayarları" msgid "Firewall Status" msgstr "Güvenlik Duvarı Durumu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "Güvenlik duvarı işareti" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Sistem Yazılımı Dosyası" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Sistem Yazılımı Sürümü" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Giden DNS sorguları için sabit kaynak bağlantı noktası." @@ -3046,40 +3488,48 @@ msgstr "Cihaza sistem yazılımı yükleme/yedekleme işlemleri" msgid "Flashing…" msgstr "Yazılıyor…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "IPv4 Ömrünü Takip Et" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Zorla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "40 MHz modunu zorla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "CCMP (AES)'i zorla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Başka bir sunucu algılansa bile bu ağda DHCP'yi zorlayın." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "IGMP sürümünü zorla" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "MLD sürümünü zorla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "TKIP'i zorla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "TKIP ve CCMP(AES)'i zorla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "Yayın DHCP yanıtını zorla." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Bağlantıyı zorla" @@ -3091,11 +3541,11 @@ msgstr "Zorla yükseltme" msgid "Force use of NAT-T" msgstr "NAT-T'yi kullanmaya zorla" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Form belirteci uyuşmazlığı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA belirlenmiş ana arayüz " "ve aşağı akış arayüzleri arasındaki mesajları ilet." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3120,7 +3570,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "DHCP trafiğini yönlendir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3128,33 +3578,37 @@ msgstr "" "DHCPv6 mesajlarını belirlenen ana arabirim ve aşağı akış arabirimleri " "arasında ilet." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "İleri Hata Düzeltme Saniyelesi (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Yayın trafiğini yönlendir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "Yönlendirme gecikmesi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Mesh eş trafiğini yönlendir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" "Bu cihazda çok noktaya yayın paketlerini tek noktaya yayın paketleri olarak " "yönlendirin." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "İleri/geri DNS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Yönlendirme modu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Parçalanma" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Parçalanma Eşiği" @@ -3178,7 +3632,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Yalnızca GPRS" @@ -3198,12 +3652,16 @@ msgstr "IPv4 üzerinden GRETAP tüneli" msgid "GRETAP tunnel over IPv6" msgstr "IPv6 üzerinden GRETAP tüneli" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Ağ Geçidi" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Ağ Geçidi Modu" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Ağ Geçidi Bağlantı Noktaları" @@ -3213,23 +3671,23 @@ msgstr "Ağ Geçidi Bağlantı Noktaları" msgid "Gateway address is invalid" msgstr "Ağ geçidi adresi geçersiz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Genel Ayarlar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Genel Kurulum" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Genel cihaz seçenekleri" @@ -3237,7 +3695,7 @@ msgstr "Genel cihaz seçenekleri" msgid "Generate Config" msgstr "Yapılandırma Oluştur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Yerel olarak PMK oluştur" @@ -3245,11 +3703,11 @@ msgstr "Yerel olarak PMK oluştur" msgid "Generate archive" msgstr "Arşiv oluştur" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "Yapılandırma oluştur" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "Yapılandırma oluştur…" @@ -3257,15 +3715,15 @@ msgstr "Yapılandırma oluştur…" msgid "Generate new key pair" msgstr "Yeni anahtar çifti oluştur" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "Önceden paylaşılan anahtar oluştur" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "Bir WireGuard eşine içe aktarma için uygun bir yapılandırma oluşturur" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "QR kodu oluşturuluyor…" @@ -3277,39 +3735,40 @@ msgstr "Verilen şifre onayı eşleşmedi, şifre değişmedi!" msgid "Global Settings" msgstr "Genel Ayarlar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Genel ağ seçenekleri" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "Ürün yazılımı yükseltmesine git..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Parola yapılandırmasına git..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "İlgili yapılandırma sayfasına git" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "DHCP yapılandırmasına erişim izni verin" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "DHCP durum ekranına erişim izni verin" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "DSL durum ekranına erişim izni verin" @@ -3321,6 +3780,10 @@ msgstr "LuCI OpenConnect prosedürlerine erişim izni verin" msgid "Grant access to LuCI Wireguard procedures" msgstr "LuCI Wireguard prosedürlerine erişim izni verin" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "LuCI openfortivpn prosedürlerine Yetki ver" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "SSH yapılandırmasına erişim izni verin" @@ -3357,7 +3820,7 @@ msgstr "Bağlama yapılandırmasına erişim izni verin" msgid "Grant access to network configuration" msgstr "Ağ yapılandırmasına erişim izni verin" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Ağ teşhis araçlarına erişim izni verin" @@ -3365,6 +3828,10 @@ msgstr "Ağ teşhis araçlarına erişim izni verin" msgid "Grant access to network status information" msgstr "Ağ durumu bilgilerine erişim izni verin" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "İşlem durumuna erişim izni verin" @@ -3397,7 +3864,7 @@ msgstr "uHTTPd yapılandırmasına erişim izni verin" msgid "Grant access to wireless channel status" msgstr "Kablosuz kanal durumuna erişim izni verin" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Kablosuz durum ekranına erişim izni verin" @@ -3426,15 +3893,11 @@ msgstr "HTTP(lere) Erişim" msgid "Hang Up" msgstr "Kapat" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Üstbilgi Hata Kodu Hataları (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Heartbeat aralığı (kernel: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Merhaba aralığı" @@ -3446,7 +3909,7 @@ msgstr "" "Burada, cihazınızın ana bilgisayar adı veya saat dilimi gibi temel " "özelliklerini yapılandırabilirsiniz." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "ESSID'yi gizle" @@ -3455,17 +3918,25 @@ msgstr "ESSID'yi gizle" msgid "Hide empty chains" msgstr "Boş zincirleri gizle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "Yüksek" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "Karşılıksız ARP'yi karşıla" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "Kanca: %h (%h), Öncelik: %d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Atlama karşılığı" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3475,7 +3946,7 @@ msgstr "Ana bilgisayar" msgid "Host expiry timeout" msgstr "Ana bilgisayar süre sonu zaman aşımı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "Ana makine, bu dosya adını önyükleme sunucusundan ister." @@ -3483,10 +3954,18 @@ msgstr "Ana makine, bu dosya adını önyükleme sunucusundan ister." msgid "Host-Uniq tag content" msgstr "Host-Uniq etiket içeriği" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" +"Ana bilgisayara özel kiralama süresi, ör. 5m, 3h, " +"7d." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3496,11 +3975,11 @@ msgstr "Sunucu adı" msgid "Hostname to send when requesting DHCP" msgstr "DHCP istendiğinde gönderilecek ana bilgisayar adı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Ana bilgisayar adları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3560,23 +4039,27 @@ msgstr "IEEE 802.3ad Dinamik bağlantı toplama (802.3ad, 4)" msgid "IKE DH Group" msgstr "IKE DH Grubu" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "IMEI" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IP Adresleri" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "IP Protokolü" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" -msgstr "IP Kümeleri" +msgstr "IP Setleri" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "IP Türü" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3592,32 +4075,35 @@ msgstr "IP adresi geçersiz" msgid "IP address is missing" msgstr "IP adresi eksik" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " "packets with matching destination IP." msgstr "" +"Tünelin içinde izin verilen IP adresleri. Eş, bu listeyle eşleşen kaynak IP " +"adreslerine sahip tünellenmiş paketleri kabul edecek ve eşleşen hedef IP'ye " +"sahip paketleri geri yönlendirecektir." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 msgctxt "nft ip protocol" msgid "IP protocol" msgstr "IP protokolü" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "IP protokolü" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "IP kümesi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "IP kümeleri" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Sahte NX Etki Alanını Geçersiz Kılma" @@ -3625,14 +4111,15 @@ msgstr "Sahte NX Etki Alanını Geçersiz Kılma" msgid "IPsec XFRM" msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3648,7 +4135,7 @@ msgstr "IPv4 Komşuları" msgid "IPv4 Routing" msgstr "IPv4 Yönlendirme" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "IPv4 Kuralları" @@ -3658,7 +4145,7 @@ msgstr "IPv4 Yukarı Akış" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3685,7 +4172,7 @@ msgstr "IPv4 ağ maskesi" msgid "IPv4 network in address/netmask notation" msgstr "Adres/ağ maskesi gösteriminde IPv4 ağı" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Yalnızca IPv4" @@ -3698,11 +4185,11 @@ msgstr "IPv4 ön eki" msgid "IPv4 prefix length" msgstr "IPv4 önek uzunluğu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "IPv4 trafik tablosu \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3711,16 +4198,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-in-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (her ikisi - varsayılan olarak IPv4'tür)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "IPv4/IPv6 trafik tablosu \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3731,7 +4222,8 @@ msgstr "IPv4/IPv6 trafik tablosu \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3739,7 +4231,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6 Güvenlik Duvarı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "IPv6 MTU" @@ -3747,7 +4239,11 @@ msgstr "IPv6 MTU" msgid "IPv6 Neighbours" msgstr "IPv6 Komşuları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "IPv6 Önek Ömrü" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "IPv6 RA Ayarları" @@ -3755,15 +4251,15 @@ msgstr "IPv6 RA Ayarları" msgid "IPv6 Routing" msgstr "IPv6 Yönlendirme" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "IPv6 Kuralları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "IPv6 Ayarları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6 ULA-Öneki" @@ -3777,12 +4273,12 @@ msgstr "IPv6 Yukarı Akım" msgid "IPv6 address" msgstr "IPv6 adresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "IPv6 atama ipucu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "IPv6 atama uzunluğu" @@ -3794,11 +4290,11 @@ msgstr "IPv6 ağ geçidi" msgid "IPv6 network in address/netmask notation" msgstr "Adres/ağ maskesi gösteriminde IPv6 ağı" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Yalnızca IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "IPv6 tercihi" @@ -3807,7 +4303,7 @@ msgstr "IPv6 tercihi" msgid "IPv6 prefix" msgstr "IPv6 ön eki" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "IPv6 önek filtresi" @@ -3821,24 +4317,19 @@ msgstr "IPv6 önek uzunluğu" msgid "IPv6 routed prefix" msgstr "IPv6 yönlendirilmiş önek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "IPv6 kaynak yönlendirmesi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "IPv6 son eki" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"IPv6-Son ek (onaltılık)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "IPv6 desteği" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "IPv6 trafik tablosu \"%h\"" @@ -3846,6 +4337,10 @@ msgstr "IPv6 trafik tablosu \"%h\"" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "IPv6-Sonek (onaltılık)" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3861,10 +4356,19 @@ msgstr "IPv6-over-IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-over-IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Kimlik" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" +"Bir ana bilgisayar, farklı bir alt ağdaki adresi belirttiği için " +"kullanılamayan bir girişle eşleşirse known-othernet etiketi " +"ayarlanır." + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "İşaretlenirse, 1DES etkinleştirilir" @@ -3877,7 +4381,7 @@ msgstr "İşaretlenirse, pppd seçeneklerine \"+ipv6\" ekler" msgid "If checked, encryption is disabled" msgstr "İşaretlenirse, şifreleme devre dışı bırakılır" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." @@ -3885,7 +4389,7 @@ msgstr "" "Ayarlanırsa, aşağı akış alt ağları yalnızca belirli IPv6 önek sınıflarından " "ayrılır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "Ayarlanırsa, eşleşme seçeneklerinin anlamı ters çevrilir" @@ -3905,7 +4409,7 @@ msgstr "" "Belirtilmişse, cihazı sabit bir cihaz düğümü yerine bölüm etiketi ile " "bağlayın" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " @@ -3915,14 +4419,16 @@ msgstr "" "%d saniye içinde yeni IP'ye manuel olarak yeniden bağlanma " "gerekir, aksi takdirde değişiklikler geri alınır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "İşaretli değilse, hiçbir varsayılan yol yapılandırılmaz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3943,15 +4449,25 @@ msgstr "" "değerleri ile erişilemediğinden, verilerin değiş tokuşunun çok yavaş bir " "süreç olduğunu unutmayın." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "Yoksay" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "/etc/hosts'u göz ardı et" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Arayüzü yoksay" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" +"!known kullanarak bilinmeyen makinelerden gelen istekleri göz ardı " +"et." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Dosyayı çözümlemeyi göz ardı et" @@ -3963,25 +4479,25 @@ msgstr "İmaj" msgid "Image check failed:" msgstr "İmaj denetimi başarısız oldu:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "Eş olarak içe aktar" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "Yapılandırmayı içe aktar" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "Yapılandırmayı eş olarak içe aktar…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "Ayarları içe aktar" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "İçe aktarılan eş yapılandırması" @@ -3993,7 +4509,29 @@ msgstr "Ayarları mevcut bir WireGuard yapılandırma dosyasından içe aktarır msgid "In" msgstr "İçinde" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" +"DHCPv4'te birden fazla mac adresi eklemek mümkündür. Bu, bir IP adresinin " +"birden fazla macaddr ile ilişkilendirilmesine olanak tanır ve dnsmasq, bir " +"diğeri kira istediğinde macaddr'lardan birine verilen DHCP kiralamasından " +"vazgeçer. Yalnızca herhangi bir zamanda macaddr'lardan yalnızca birinin " +"aktif olması durumunda güvenilir bir şekilde çalışır." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"Köprülü LAN kurulumlarında, tüm LAN'ı durma noktasına getirebilecek yayın " +"döngülerinden kaçınmak için köprü döngüsünden kaçınmanın etkinleştirilmesi " +"tavsiye edilir." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -4001,7 +4539,7 @@ msgstr "" "Sisteme yetkisiz erişimi önlemek amacıyla talebiniz bloke edilmiştir. Bir " "önceki sayfaya dönmek için aşağıdaki \"Devam» \"ı tıklayın." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "Saniye içinde" @@ -4033,7 +4571,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Gelen sağlama toplamı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Gelen arayüz" @@ -4041,6 +4579,7 @@ msgstr "Gelen arayüz" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Gelen anahtar" @@ -4059,22 +4598,21 @@ msgstr "Bilgi" msgid "Information" msgstr "Bilgi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "Giriş QoS eşleme" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "Giriş cihazı kimliği" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "Giriş cihazı adı" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Başlatma hatası" @@ -4086,31 +4624,41 @@ msgstr "Başlatma komut dosyası" msgid "Initscripts" msgstr "Başlatma komut dosyaları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "İç sertifika kısıtlaması (Etki Alanı)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "İç sertifika kısıtlaması (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "İç sertifika kısıtlaması (Konu)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "İç sertifika kısıtlaması (Joker karakter)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Protokol uzantılarını yükle..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Örnek" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Örnek \"%h\"" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Örnek Ayrıntıları" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4122,6 +4670,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "UCI yapılandırmasını okumak için yetersiz izin." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "Entegre Devre Kartı Tanımlayıcısı" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4129,7 +4681,7 @@ msgstr "UCI yapılandırmasını okumak için yetersiz izin." msgid "Interface" msgstr "Arayüz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "\"%h\" arabirimi zaten atanmış asıl olarak işaretlendi." @@ -4137,7 +4689,7 @@ msgstr "\"%h\" arabirimi zaten atanmış asıl olarak işaretlendi." msgid "Interface %q device auto-migrated from %q to %q." msgstr "Arabirim %q cihazı %q'dan %q'ya otomatik olarak taşındı." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Arayüz Yapılandırması" @@ -4168,11 +4720,11 @@ msgstr "Arayüz yeniden bağlanıyor..." msgid "Interface is shutting down..." msgstr "Arayüz kapatılıyor..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Arayüz başatılıyor..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Arayüz durduruluyor..." @@ -4181,12 +4733,12 @@ msgid "Interface name" msgstr "Arayüz adı" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Arayüz mevcut değil veya henüz bağlı değil." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Arayüzler" @@ -4195,15 +4747,19 @@ msgstr "Arayüzler" msgid "Internal" msgstr "İç" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "İç Sunucu Hatası" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "Uluslararası Mobil İstasyon Ekipman Kimliği" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "Uluslararası Mobil Abone Kimliği" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Öğrenme Paketlerini Gönderme Aralığı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4214,7 +4770,7 @@ msgstr "" "ayarlayabilir; daha büyük değerler IGMP Sorgularının daha az gönderilmesine " "neden olur" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "STP merhaba paketleri için saniye cinsinden aralık" @@ -4224,8 +4780,9 @@ msgid "Invalid" msgstr "Geçersiz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "Geçersiz APN sağlandı" @@ -4235,6 +4792,10 @@ msgstr "Geçersiz APN sağlandı" msgid "Invalid Base64 key string" msgstr "Geçersiz Base64 anahtar dizesi" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Geçersiz IPv6 adresi" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4260,7 +4821,7 @@ msgstr "" msgid "Invalid argument" msgstr "Geçersiz argüman" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4276,15 +4837,36 @@ msgstr "Geçersiz komut" msgid "Invalid hexadecimal value" msgstr "Geçersiz onaltılık değer" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Geçersiz ana bilgisayar adı veya IPv4 adresi" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Geçersiz bağlantı noktası" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "Geçersiz sunucu URL'si" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Geçersiz kullanıcı adı ve/veya şifre! Lütfen tekrar deneyin." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Yanıp sönmeyi ters çevir" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "Eşleşmeyi ters çevir" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "Birincil VLAN" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "İstemcileri İzole Et" @@ -4297,25 +4879,25 @@ msgstr "" "Flash belleğe sığmayan bir görüntüyü flaş etmeye çalıştığınız anlaşılıyor, " "lütfen görüntü dosyasını doğrulayın!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "JavaScript gerekli!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Ağa Katıl" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Ağa Katıl: Kablosuz Tarama" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Ağa Katılıyor: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Kurala git" @@ -4323,24 +4905,28 @@ msgstr "Kurala git" msgid "Keep settings and retain the current configuration" msgstr "Ayarları koruyun ve mevcut yapılandırmayı koruyun" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "Canlı Tut" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Çekirdek Günlüğü" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Çekirdek Sürümü" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Anahtar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Anahtar #%d" @@ -4348,6 +4934,7 @@ msgstr "Anahtar #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Gelen paketler için anahtar (isteğe bağlı)." @@ -4355,14 +4942,19 @@ msgstr "Gelen paketler için anahtar (isteğe bağlı)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Giden paketler için anahtar (isteğe bağlı)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "Anahtar eksik" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Ağ yapılandırmasını imzalamak için kullanılan anahtar" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4407,7 +4999,7 @@ msgstr "LCP yankı aralığı" msgid "LED Configuration" msgstr "LED Yapılandırması" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4424,32 +5016,41 @@ msgstr "Dil" msgid "Language and Style" msgstr "Dil ve Stil" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" +"Daha büyük ağırlıklara (aynı prio'nun) orantılı olarak daha yüksek seçilme " +"olasılığı verilir." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "Son üye aralığı" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Gecikme" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Son El Sıkışma" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Yaprak" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Öğren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "Rotaları öğren" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Leasefile" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Kira süresi" @@ -4473,7 +5074,7 @@ msgstr "Otomatik algılanması için boş bırakın" msgid "Leave empty to use the current WAN address" msgstr "Mevcut WAN adresini kullanmak için boş bırakın" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4484,31 +5085,27 @@ msgstr "" "ölçüde azalabilir. Mümkün olduğunda 802.11b hızlarına izin verilmemesi " "önerilir." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "Eski kurallar algılandı" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Lejant:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Sınır" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Hat Zayıflaması (LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "Hat Modu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "Hat Durumu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "Hat Çalışma Süresi" @@ -4529,16 +5126,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "Bağlantı katmanı başlık bitleri %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "NXDOMAIN yanıtlarına dönüştürülecek IP adresleri listesi." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "Belirtilen etki alanı IP'leriyle doldurulacak IP kümelerinin listesi." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4552,7 +5151,7 @@ msgstr "" "R0KH'den PMK-R1 anahtarı talep edilirken R0KH-ID'yi (NAS ID) hedef MAC " "adresine eşlemek için kullanılır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4570,23 +5169,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Kimlik doğrulama için SSH anahtar dosyalarının listesi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "RFC1918 yanıtlarına izin verilecek etki alanlarının listesi." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Bir IP adresine zorlanacak etki alanlarının listesi." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "Sorguların iletileceği yukarı akış çözümleyicilerinin listesi." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "Bağlantı Noktasını Dinle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Arayüzleri Dinle" @@ -4594,7 +5190,7 @@ msgstr "Arayüzleri Dinle" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "Yalnızca verilen arayüzde dinle veya belirtilmemişse tümünde dinle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4604,7 +5200,7 @@ msgstr "Bu arayüzleri dinlemeyi ve geri dönüşü sınırlayın." msgid "ListenPort setting is invalid" msgstr "ListenPort ayarı geçersiz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Gelen DNS sorguları için dinleme bağlantı noktası." @@ -4613,7 +5209,7 @@ msgstr "Gelen DNS sorguları için dinleme bağlantı noktası." msgid "Load" msgstr "Yük" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Ortalama Yük" @@ -4621,27 +5217,28 @@ msgstr "Ortalama Yük" msgid "Load configuration…" msgstr "Yapılandırma Yükle…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Veri yükleniyor…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Dizin içeriği yükleniyor…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Görünüm yükleniyor…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Yerel" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Yerel IP adresi" @@ -4661,11 +5258,12 @@ msgstr "Atanacak yerel IP adresi" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Yerel IPv4 adresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Yerel IPv6 DNS sunucusu" @@ -4681,45 +5279,71 @@ msgstr "Yerel IPv6 adresi" msgid "Local Startup" msgstr "Yerel Başlatma" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Yerel Zaman" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "Yerel ULA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Yerel alan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "DHCP adlarına ve ana dosya girişlerine eklenen yerel etki alanı son eki." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Yerel sunucu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Yalnızca Yerel Hizmet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Yerel wireguard anahtarı" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Sorguları yerelleştir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "Konum Alan Kodu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "BSSID'ye Kilitlen" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "\"%h...\" olayını günlüğe kaydet" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Oturum Aç" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Giriş yap…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Oturumu Kapat" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Günlük çıktı seviyesi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Sorguları günlüğe ekle" @@ -4745,37 +5369,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "Tünelin ekleneceği mantıksal ağ (köprülü) (isteğe bağlı)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Oturum Aç" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Oturumu Kapat" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "Gevşek filtreleme" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Sinyal Saniye Kaybı (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Ağ adresinden ofset olarak en düşük kiralanan adres." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Lua uyumluluk modu etkin" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC Adresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "MAC Adresi Filtresi" @@ -4783,16 +5398,15 @@ msgstr "MAC Adresi Filtresi" msgid "MAC Address For The Actor" msgstr "Aktör İçin MAC Adresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4801,11 +5415,15 @@ msgstr "MAC VLAN" msgid "MAC address" msgstr "Mac Adresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "MAC adres(ler)i" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC Filtresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "MAC Listesi" @@ -4819,6 +5437,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "MAP kuralı geçersiz" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "MBIM Hücresel" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4840,15 +5462,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "MII Aralığı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4858,7 +5484,7 @@ msgstr "" "klonladığınızdan emin olun:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4867,69 +5493,73 @@ msgstr "" msgid "Manual" msgstr "Manuel" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "Üretici firma" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "Ana" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "Eşleşme Etiketi" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "Maks RA aralığı" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Maks. Ulaşılabilir Veri Hızı (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Maks. DHCP kiraları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Maks. EDNS0 paket boyutu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Maks. eşzamanlı sorgu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Maksimum yaş" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Ä°zin verilen maksimum Dinleme Aralığı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Ä°zin verilen en fazla etkin DHCP kira sayısı." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Ä°zin verilen en fazla eşzamanlı DNS sorgu sayısı." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "EDNS.0 UDP paketlerinin izin verilen azami boyutu." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Modemin hazır hale gelmesi için beklenecek maksimum saniye" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Maksimum kiralanan adres sayısı." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "Maksimum gözetleme tablosu boyutu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -4937,10 +5567,14 @@ msgstr "" "Ä°stenmeyen RA " "gönderme arasında izin verilen maksimum süre. Varsayılan 600 saniyedir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Maksimum iletim gücü" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "VoIP veya diğer hizmetlerin çalışmasını engelleyebilir." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4967,7 +5601,7 @@ msgstr "Bellek" msgid "Memory usage (%)" msgstr "Bellek kullanımı (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -4975,10 +5609,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "Mesh kimliği" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Mesh kimliği" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Mesh Yönlendirme" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Mesh ve yönlendirme ile ilgili seçenekler" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Yöntem bulunamadı" @@ -4991,7 +5633,7 @@ msgstr "Bağlantı izleme yöntemi" msgid "Method to determine link status" msgstr "Bağlantı durumunu belirleme yöntemi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -5002,11 +5644,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "Min RA aralığı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Minimum ARP geçerlilik süresi" @@ -5014,7 +5656,7 @@ msgstr "Minimum ARP geçerlilik süresi" msgid "Minimum Number of Links" msgstr "Minimum Bağlantı Sayısı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." @@ -5022,7 +5664,7 @@ msgstr "" "Bir ARP girişinin değiştirilebilmesi için saniye cinsinden gereken minimum " "süre. ARP önbelleğinin atılmasını önler." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -5038,35 +5680,49 @@ msgstr "Ä°zleme bağlantı noktasını yansıt" msgid "Mirror source port" msgstr "Kaynak bağlantı noktasını yansıt" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "Mobil Ülke Kodu" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Mobil veri" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "Mobil Ağ Kodu" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "Mobil Servis" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Mobilite Etki Alanı" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Mod" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Model" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Modem taşıyıcısı sökülüyor." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "Modem Bilgileri" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5074,43 +5730,36 @@ msgstr "" "Modem bağlantısı devam ediyor. Lütfen bekleyin. Bu işlem 2 dakika sonra " "zaman aşımına uğrayacaktır." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Modem varsayılanı" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Modem cihazı" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Modem bağlantısı kesiliyor. Lütfen bekleyin." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Modem bilgisi sorgusu başarısız oldu" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Modem başlatma zaman aşımı" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "Modem devre dışı bırakıldı." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "ModemManager" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Ä°zle" @@ -5180,6 +5829,10 @@ msgstr "Aşağı in" msgid "Move up" msgstr "Yukarı taşı" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Çok Noktadan Tek Noktaya" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5187,19 +5840,23 @@ msgstr "Yukarı taşı" msgid "Multicast" msgstr "Çok noktaya yayın" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Çok noktaya yayın modu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Çok noktaya yayın yönlendirme" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "Çoklu yayından tek noktaya yayın" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "NAT eylem zinciri \"%h\"" @@ -5211,12 +5868,16 @@ msgstr "NAT-T Modu" msgid "NAT64 Prefix" msgstr "NAT64 Öneki" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "NAT64 öneki" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "NDP-Proxy bağımlı" @@ -5229,18 +5890,23 @@ msgid "NTP server candidates" msgstr "NTP sunucusu adayları" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Ad" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Yeni ağın adı" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Tünel cihazının adı" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Navigasyon" @@ -5249,13 +5915,17 @@ msgstr "Navigasyon" msgid "Nebula Network" msgstr "Nebula Ağı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Komşu Raporu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "Komşu önbellek geçerliliği" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5264,32 +5934,36 @@ msgstr "Komşu önbellek geçerliliği" msgid "Network" msgstr "Ağ" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Ağ Kodlama" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "Ağ Modu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "Ağ Kaydı" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "Ağ SSID'si" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Ağ Yardımcı Programları" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "Ağ adresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Ağ önyükleme görüntüsü" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "Ağ köprüsü yapılandırma geçişi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Ağ cihazı" @@ -5302,7 +5976,7 @@ msgstr "Ağ cihazı etkinliği (kernel: netdev)" msgid "Network device is not present" msgstr "Ağ cihazı mevcut değil" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "Ağ cihazı tablosu \"%h\"" @@ -5311,7 +5985,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "Ağ başlık bitleri %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Ağ ifname yapılandırması birleştirme" @@ -5320,15 +5994,20 @@ msgstr "Ağ ifname yapılandırması birleştirme" msgid "Network interface" msgstr "Ağ arayüzü" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "Ağ kimliği" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Asla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Hiçbir zaman" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5336,11 +6015,11 @@ msgstr "" "Eşleşen etki alanlarını ve alt etki alanlarını asla iletme, yalnızca " "DHCP'den veya hosts dosyalarından çözümle." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "\"%s\" için yeni arayüz oluşturulamıyor: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Yeni arayüz adı…" @@ -5348,13 +6027,13 @@ msgstr "Yeni arayüz adı…" msgid "Next »" msgstr "Sonraki »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Hayır" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Bu arayüz için DHCP Sunucusu yapılandırılmamış" @@ -5362,7 +6041,7 @@ msgstr "Bu arayüz için DHCP Sunucusu yapılandırılmamış" msgid "No Data" msgstr "Veri Yok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Şifreleme Yok" @@ -5378,9 +6057,17 @@ msgstr "NAT-T yok" msgid "No RX signal" msgstr "RX sinyali yok" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Yapılandırılmış bir WireGuard arabirimi yok." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "Ä°zin verilen mod yapılandırması bulunamadı." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5394,7 +6081,11 @@ msgstr "" msgid "No client associated" msgstr "Hiçbir istemci ilişkilendirilmedi" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Kontrol cihazı belirtilmedi" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "Veri yok" @@ -5403,8 +6094,8 @@ msgstr "Veri yok" msgid "No data received" msgstr "Veri alınmadı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "Uygulama yok" @@ -5417,15 +6108,11 @@ msgstr "Uygulama yok" msgid "No entries available" msgstr "Kullanılabilir girdi yok" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Bu dizinde giriş yok" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Dosya bulunamadı" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5441,7 +6128,7 @@ msgstr "" msgid "No host route" msgstr "Ana makine yolu yok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5462,30 +6149,39 @@ msgstr "Başka bağımlı yok" msgid "No more slaves available, can not save interface" msgstr "Daha fazla bağımlı yok, arayüz kaydedilemiyor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Negatif önbellek yok" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "Yüklü nftables kural kümesi yok." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Şifre belirlenmedi!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Bağlı eş yok" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "Henüz tanımlanmış bir eş yok." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "Tercih edilen mod yapılandırması bulunamadı." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Henüz genel anahtar yok." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "Bu zincirde kural yok" @@ -5499,7 +6195,8 @@ msgid "No validation or filtering" msgstr "Doğrulama veya filtreleme yok" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Bölge atanmadı" @@ -5511,37 +6208,40 @@ msgstr "Bölge atanmadı" msgid "Noise" msgstr "Gürültü" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Gürültü Marjı (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Gürültü Marjı" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Gürültü:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Önleyici Olmayan CRC hataları (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Joker karakter içermeyen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Yok" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Normal" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Bulunamadı" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Üye değil" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Ä°lişkili değil" @@ -5554,7 +6254,7 @@ msgstr "Bağlı değil" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Mevcut değil" @@ -5566,7 +6266,7 @@ msgstr "Önyüklemede başlamadı" msgid "Not supported" msgstr "Desteklenmiyor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5574,6 +6274,15 @@ msgstr "" "Not: Bazı kablosuz sürücüler 802.11w'yi tam olarak desteklemez. Örneğin " "mwlwifi'nin sorunları olabilir" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Not: standart olmayan bir Aktarma Bağlantı Noktası (addr#port) " +"belirtirken bir DHCP Proxy'sine de (şu anda mevcut değil) ihtiyacınız " +"olabilir." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Notlar" @@ -5582,7 +6291,7 @@ msgstr "Notlar" msgid "Notice" msgstr "Uyarı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5590,7 +6299,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "IGMP üyelik raporlarının sayısı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "Önbelleğe alınan DNS girdilerinin sayısı (en fazla 10000, 0 ise önbelleğe " @@ -5609,7 +6318,7 @@ msgid "Obfuscated Password" msgstr "Gizlenmiş Parola" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5620,6 +6329,7 @@ msgid "Obtain IPv6 address" msgstr "IPv6 Adresini Al" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Kapalı" @@ -5628,6 +6338,14 @@ msgstr "Kapalı" msgid "Off-State Delay" msgstr "Durum Dışı Gecikme" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"Kapalı: vlanXXX, ör. vlan1. Açık: " +"vlan_tagged_interface.XXX, ör. eth0.1." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Açık" @@ -5636,15 +6354,15 @@ msgstr "Açık" msgid "On-State Delay" msgstr "Durum Gecikmesi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "Bağlantı rotası" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Ana bilgisayar adı veya mac adreslerinden biri belirtilmelidir!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Şunlardan biri: %s" @@ -5662,7 +6380,11 @@ msgstr "Sekmede bir veya daha fazla geçersiz/gerekli değer" msgid "One or more required fields have no value!" msgstr "Bir veya daha fazla zorunlu alanda değer bulunamadı!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "Yalnızca şunun aracılığıyla yanıtları kabul et" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" "Yalnızca etkinleştirildiğinde izole olmayan köprü bağlantı noktalarıyla " @@ -5675,25 +6397,24 @@ msgstr "" "Sadece mevcut aktif bağımlı arızalanırsa ve birincil bağımlı aktif ise " "(failure, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "iptables kurallarına genel bakışı aç…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Listeyi aç..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxy'sini devre dışı bırak." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5711,7 +6432,7 @@ msgstr "" "Belirlenmiş bir asıl arabirim yapılandırılmış ve etkinse röle modunda çalıştırın, aksi takdirde sunucu moduna geri dön." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." @@ -5719,12 +6440,24 @@ msgstr "" "Bir yukarı akış IPv6 öneki varsa röle modunda çalıştırın, aksi " "takdirde hizmeti devre dışı bırak." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Çalışma frekansı" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "Operatör" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "Operatör kodu" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "Operatör Adı" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "\"%s\" seçeneği geçersiz bir giriş değeri içeriyor." @@ -5732,22 +6465,33 @@ msgstr "\"%s\" seçeneği geçersiz bir giriş değeri içeriyor." msgid "Option \"%s\" must not be empty." msgstr "\"%s\" seçeneği boş olmamalıdır." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Seçenek değişti" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Seçenek kaldırıldı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Ä°steğe bağlı" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "Atanacak isteğe bağlı ana bilgisayar adı" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Bu cihaz hakkında isteğe bağlı notlar" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" +"Ä°steğe bağlı, saniye olarak . '0' olarak ayarlanırsa, yeniden bağlanma " +"denenmez." + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5756,7 +6500,7 @@ msgstr "" "Ä°steğe bağlı. Giden şifreli paketler için 32 bit işaret. 0x ile " "başlayarak değeri onaltılık olarak girin." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5768,7 +6512,7 @@ msgstr "" "alındığında, IPv6 adresini oluşturmak için soneki arayüz için ('::1' gibi) " "kullanın ('a:b:c:d::1')." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5776,11 +6520,11 @@ msgstr "" "Ä°steğe bağlı. Base64 kodlu önceden paylaşılmış anahtar. Kuantum sonrası " "direnç için ek bir simetrik anahtar şifreleme katmanı ekler." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Ä°steğe bağlı. Bu eş için Ä°zin Verilen IP'ler için yollar oluşturun." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Ä°steğe bağlı. Eşin tanımı." @@ -5788,13 +6532,13 @@ msgstr "Ä°steğe bağlı. Eşin tanımı." msgid "Optional. Do not create host routes to peers." msgstr "Ä°steğe bağlı. Eşlere ana bilgisayar yolları oluşturmayın." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "Ä°steğe bağlı. Eşin sunucusu. Arayüzü açmadan önce isimler çözümlenir." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5812,11 +6556,11 @@ msgstr "Ä°steğe bağlı. XFRM arayüzünün Maksimum Transmission Birimi." msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Ä°steğe bağlı. Tünel arayüzünün Maksimum Ä°letim Birimi." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Ä°steğe bağlı. Eşin bağlantı noktası." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5827,7 +6571,7 @@ msgstr "" "gerekli değildir, ancak bir eş yapılandırma veya varsa QR kodu oluşturmaya " "izin verir. Yapılandırma dışa aktarıldıktan sonra kaldırılabilir." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5844,7 +6588,7 @@ msgstr "" msgid "Options" msgstr "Seçenekler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.43,192.168.4.4\". 0.0.0.0, \"dnsmasq " "çalıştıran sistemin adresi\" anlamına gelir." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "Seçenekler:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Sıra: düşük önce gelir." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Oluşturucu Aralığı" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "Diğer:" @@ -5879,7 +6632,7 @@ msgstr "Giden:" msgid "Outgoing checksum" msgstr "Giden sağlama toplamı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "Giden arayüz" @@ -5887,6 +6640,7 @@ msgstr "Giden arayüz" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "Giden anahtarı" @@ -5910,21 +6664,23 @@ msgstr "Çıkış bölgesi" msgid "Overlap" msgstr "Üst üste gelen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "IPv4 yönlendirme tablosunu geçersiz kıl" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "IPv6 yönlendirme tablosunu geçersiz kıl" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5932,6 +6688,7 @@ msgstr "IPv6 yönlendirme tablosunu geçersiz kıl" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "MTU'yu geçersiz kıl" @@ -5953,7 +6710,7 @@ msgstr "TOS'u geçersiz kıl" msgid "Override TTL" msgstr "TTL'yi geçersiz kıl" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -5969,7 +6726,7 @@ msgstr "Varsayılan arayüz adını geçersiz kıl" msgid "Override the gateway in DHCP responses" msgstr "DHCP yanıtlarında ağ geçidini geçersiz kılın" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -5985,7 +6742,7 @@ msgstr "Dahili yollar için kullanılan tabloyu geçersiz kılın" msgid "Overview" msgstr "Genel bakış" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "Mevcut dosyanın \"%s\" üzerine yaz\" ?" @@ -5993,17 +6750,30 @@ msgstr "Mevcut dosyanın \"%s\" üzerine yaz\" ?" msgid "Overwrite the current settings with the imported configuration?" msgstr "İçe aktarılan yapılandırmayla mevcut ayarların üzerine yazılsın mı?" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "Kendi Numaraları" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Sahip" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (her ikisi de)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -6015,8 +6785,9 @@ msgid "PAP/CHAP password" msgstr "PAP / CHAP şifresi" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -6027,6 +6798,7 @@ msgstr "PAP / CHAP şifresi" msgid "PAP/CHAP username" msgstr "PAP / CHAP kullanıcı adı" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "PDP Türü" @@ -6036,8 +6808,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "PIN" @@ -6047,7 +6820,7 @@ msgstr "PIN" msgid "PIN code rejected" msgstr "PIN kodu reddedildi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "PMK R1 Push" @@ -6088,28 +6861,37 @@ msgstr "PSID ofseti" msgid "PSID-bits length" msgstr "PSID bit uzunluğu" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM / EFM (Paket Aktarım Modu)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "PXE/TFTP Ayarları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "Paket Hizmet Durumu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "Paket Yönlendirme" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "Paket işareti" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Paket alma süresi" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "Paketler" @@ -6118,23 +6900,29 @@ msgstr "Paketler" msgid "Packets To Transmit Before Moving To Next Slave" msgstr "Sonraki Bağımlıya Geçmeden Önce Ä°letilecek Paketler" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "Ağ(lar)ın bir parçası:" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "%q bölgesinin parçası" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "Geçiş (Fiziksel cihazı tek bir MAC VLAN'a yansıtın)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Parola" @@ -6142,11 +6930,11 @@ msgstr "Parola" msgid "Password authentication" msgstr "Parola kimlik doğrulaması" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Özel Anahtar Şifresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "İç Gizli Anahtarın şifresi" @@ -6157,20 +6945,20 @@ msgstr "İç Gizli Anahtarın şifresi" msgid "Password strength" msgstr "Şifre güvenlik seviyesi" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "Şifre2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "SSH anahtar dosyasını yapıştırın veya sürükleyin…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "" "WireGuard eş yapılandırma (wg0.conf) dosyasını yapıştırın veya sürükleyin…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " @@ -6180,31 +6968,31 @@ msgstr "" "wg0.conf) yapıştırın veya sürükleyin ve bu sistemin yerel WireGuard " "arayüzüne bağlanmasına izin veren eşleşen bir eş girişi oluşturun." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "Sağlanan WireGuard yapılandırma dosyasını yapıştırın veya sürükleyin…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "CA-Sertifikası'nın Yolu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Ä°stemci Sertifikası'nın Yolu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Özel anahtar'ın Yolu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "İç CA-Sertifikası'nın Yolu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "İç Ä°stemci Sertifikası'nın Yolu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "İç Özel anahtar'ın Yolu" @@ -6226,11 +7014,19 @@ msgstr "Duraklatıldı" msgid "Peak:" msgstr "Zirve:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Eş" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Eş Ayrıntıları" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Atanacak eş IP adresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "Eş MAC adresi" @@ -6239,11 +7035,11 @@ msgstr "Eş MAC adresi" msgid "Peer address is missing" msgstr "Eş adresi eksik" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Eş cihaz adı" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Eş devre dışı" @@ -6274,10 +7070,14 @@ msgstr "Sistem Sıfırlaması gerçekleştir" msgid "Permission denied" msgstr "Ä°zin reddedildi" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Devamlı Canlı Tut" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Kalıcı yeniden bağlanma aralığı" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "PersistentKeepAlive ayarı geçersiz" @@ -6286,13 +7086,13 @@ msgstr "PersistentKeepAlive ayarı geçersiz" msgid "Phy Rate:" msgstr "Fiziksel Katman Oranı:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Fiziksel Ayarlar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6305,11 +7105,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pktler." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Lütfen kullanıcı adınızı ve şifrenizi giriniz." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Lütfen yüklenecek dosyayı seçin." @@ -6317,56 +7117,74 @@ msgstr "Lütfen yüklenecek dosyayı seçin." msgid "Policy" msgstr "Politika" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "Politika: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Bağlantı noktası" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Bağlantı noktası %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "Bağlantı noktası herhangi bir ağın parçası değil" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Bağlantı noktası izolasyonu" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "Bağlantı noktası durumu" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Bağlantı noktası durumu:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Olası olumsuzluk: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Güç Yönetimi Modu" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Önleyici CRC hataları (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "Güç Durumu" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "LTE'yi tercih et" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "UMTS'yi tercih et" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "Bir önek için tercih edilen ömür." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "Tercih edilen ağ teknolojisi" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Önek Delege Edildi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "Ön ek bastırıcı" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Ön Paylaşımlı Anahtar" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "Önceden paylaşılan anahtar kullanımda" @@ -6391,15 +7209,19 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Ä°stemciden müşteriye iletişimi engeller" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"Bir kablosuz istemcinin diğeriyle konuşmasını engeller. Bu ayar yalnızca " +"herhangi bir VLAN etiketi olmayan paketleri (etiketlenmemiş paketler) " +"etkiler." + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Birincil Bağımlı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "Birincil VLAN Kimliği" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6410,29 +7232,31 @@ msgstr "Hız ve dubleks, mevcut bağımlıdan daha iyi ise (daha iyi, 1)" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "Birincil, her geri geldiğinde aktif ikincil hale gelir (her zaman, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Öncelik" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "Özel" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "Özel (MAC VLAN'lar arasındaki iletişimi engelle)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Özel anahtar" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "Özel anahtar mevcut" @@ -6450,8 +7274,8 @@ msgid "Prot." msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6463,7 +7287,7 @@ msgstr "Protokol" msgid "Provide NTP server" msgstr "NTP sunucusunu sağla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6471,7 +7295,7 @@ msgstr "" "Bu arabirimde bir DHCPv6 sunucusu sağla ve DHCPv6 taleplerine ve isteklerine " "yanıt ver." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Yeni ağ sağlayın" @@ -6482,25 +7306,36 @@ msgid "" msgstr "" "NTP sunucusunu seçilen arayüze veya belirtilmemişse tüm arayüzlere sağla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Proxy sunucusu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Sahte Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Genel anahtar" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "Ortak anahtar eksik" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "Ortak anahtar: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6529,59 +7364,83 @@ msgstr "QMI Hücresel" msgid "Quality" msgstr "Kalite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "Kullanılabilir tüm yukarı akış çözümleyicilerini sorgula." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Sorgu aralığı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Sorgu yanıt aralığı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "R0 Anahtar Ömrü" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "R1 Anahtar Tutucu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Radius-Accounting-Bağlantı Noktası" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Radius-Accounting-Sırrı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Radius-Accounting-Sunucusu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Radius-Kimlik Doğrulama-Bağlantı Noktası" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Radius-Kimlik Doğrulama-Sırrı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Radius-Kimlik Doğrulama-Sunucusu" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "RADIUS Dinamik VLAN Ataması" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "STA VLAN Başına RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "RADIUS VLAN Köprü Adlandırma Düzeni" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "RADIUS VLAN Adlandırma" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "RADIUS VLAN Etiketli Arayüz" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "RFC3947 NAT-T modu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "RSN Ön Yetkilendirme" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "Katılmak için RSSI eşiği" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "RTS/CTS Eşiği" @@ -6594,10 +7453,18 @@ msgstr "RX" msgid "RX Rate" msgstr "RX Oranı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "RX Oranı / TX Oranı" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"Radyo Kaynağı Ölçümü - Dolaşıma yardımcı olmak için işaretler gönderir. Tüm " +"istemciler bunu desteklemez." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6607,12 +7474,12 @@ msgstr "Kaynak bağlantı noktası eşlemesini rastgeleleştir" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "Ham onaltılı kodlanmış baytlar. ISS'niz gerektirmedikçe boş bırakın" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" "DHCP sunucusunu yapılandırmak için /etc/ethers bölümünü okuyun." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Gerçekten protokol değiştirilsin mi?" @@ -6620,11 +7487,11 @@ msgstr "Gerçekten protokol değiştirilsin mi?" msgid "Realtime Graphs" msgstr "Gerçek Zamanlı Grafikler" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Yeniden Ä°lişkilendirme Son Tarihi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Yeniden bağlama koruması" @@ -6648,11 +7515,39 @@ msgstr "Cihazınızın işletim sistemini yeniden başlatır" msgid "Receive" msgstr "Al" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "Alma işlemi düştü" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "Alım hataları" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Alınan veri" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "Alınan baytlar" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "Alınan çoklu yayın" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "Alınan Paketler" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Önerilen. WireGuard arayüzünün IP adresleri." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Yeniden Bağlanma Zaman Aşımı" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Bu arayüzü yeniden bağlayın" @@ -6660,12 +7555,12 @@ msgstr "Bu arayüzü yeniden bağlayın" msgid "Redirect to HTTPS" msgstr "HTTPS'ye yönlendir" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "%h yerel bağlantı noktası'na yönlendir" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "Yerel sisteme yönlendir" @@ -6674,31 +7569,39 @@ msgstr "Yerel sisteme yönlendir" msgid "References" msgstr "Referanslar" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Kanalları Yenile" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Yenileniyor" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "Kayıt Durumu" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "ICMP türü %h ile IPv4 paketini reddet" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "ICMP türü %h olan paketi reddet" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "ICMPv6 türü %h olan paketi reddet" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "TCP sıfırlama ile paketi reddet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" @@ -6707,6 +7610,8 @@ msgstr "" "yönlendirme kararlarını reddet" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Röle" @@ -6716,6 +7621,12 @@ msgstr "Röle" msgid "Relay Bridge" msgstr "Röle Köprüsü" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"DHCP isteklerini başka bir yere iletin. Tamam: v4↔v4, v6↔v6. Tamam değil: " +"v4↔v6, v6↔v4." + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Ağlar arası röle" @@ -6725,6 +7636,14 @@ msgstr "Ağlar arası röle" msgid "Relay bridge" msgstr "Röle köprüsü" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "Buradan rölele" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "Şu adrese rölele" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6734,6 +7653,7 @@ msgstr "Uzak IPv4 adresi" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Uzak IPv4 adresi veya FQDN" @@ -6746,15 +7666,25 @@ msgstr "Uzak IPv6 adresi" msgid "Remote IPv6 address or FQDN" msgstr "Uzak IPv6 adresi veya FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Kaldır" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" +"Sonuçlardan IPv4 adreslerini kaldırın ve yalnızca IPv6 adreslerini döndür." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" +"Sonuçlardan IPv6 adreslerini kaldırın ve yalnızca IPv4 adreslerini döndür." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "Ä°lgili cihaz ayarlarını yapılandırmadan kaldır" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Kablosuz yapılandırmayı değiştirin" @@ -6784,7 +7714,8 @@ msgstr "Gelen sağlama toplamı gerektir (isteğe bağlı)." msgid "Require incoming packets serialization (optional)." msgstr "Gelen paketlerin serileştirilmesini gerektir (isteğe bağlı)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Gereklidir" @@ -6800,7 +7731,7 @@ msgstr "Gereklidir. Bu arabirim için Base64 ile kodlanmış özel anahtar." msgid "Required. Path to the .yml config file for this interface." msgstr "Gerekli. Bu arabirim için .yml yapılandırma dosyasının yolu." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "Gerekli. WireGuard eşinin ortak anahtarı." @@ -6812,67 +7743,75 @@ msgstr "Gerekli. Temel arayüz." msgid "Required. XFRM interface ID to be used for SA." msgstr "Gerekli. SA için kullanılacak XFRM arabirim kimliği." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" +"Gerekli: RADIUS sunucusu uygun VLAN niteliklerini sağlamıyorsa kimlik " +"doğrulamayı reddeder." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Hostapd gerektirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "EAP Suite-B destekli hostapd gerektirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "EAP destekli hostapd gerektirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "OWE destekli hostapd gerektirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "SAE destekli hostapd gerektirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "WEP destekli hostapd gerektirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "wpa-supplicant gerektirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "EAP Suite-B desteğine sahip wpa-supplicant gerektirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "EAP destekli wpa-supplicant gerektirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "OWE destekli wpa-supplicant gerektirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "SAE destekli wpa-supplicant gerektirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "WEP destekli wpa-supplicant gerektirir" @@ -6881,7 +7820,7 @@ msgid "Reselection policy for primary slave" msgstr "Birincil bağımlı için yeniden seçim politikası" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6896,20 +7835,24 @@ msgstr "Sayaçları Sıfırla" msgid "Reset to defaults" msgstr "Varsayılanlara dön" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Resolv ve Hosts Dosyaları" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Çözme dosyası" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Bir IP adresine zorlanacak etki alanlarının listesi." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Kaynak bulunamadı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Yeniden başlat" @@ -6918,7 +7861,7 @@ msgstr "Yeniden başlat" msgid "Restart Firewall" msgstr "Güvenlik Duvarını Yeniden Başlat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Kablosuz arayüzü yeniden başlat" @@ -6930,7 +7873,7 @@ msgstr "Geri yükle" msgid "Restore backup" msgstr "Yedeklemeyi geri yükle" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -6938,88 +7881,103 @@ msgstr "" "Birden çok IP varsa, sorgunun alındığı alt ağla eşleşen DNS sorgularına " "yanıtları döndür." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Şifreyi göster/gizle" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "Ters yol filtresi" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Geri döndür" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Değişiklikleri geri al" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "Geri döndürme isteği %h durumuyla başarısız oldu" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Yapılandırma geri döndürülüyor…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "Revizyon" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "Hedefi %h olarak yeniden yaz" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "Hedefi %h olarak yeniden yaz" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Hedefi %h olarak yeniden yaz, bağlantı noktası %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Hedefi %h olarak yeniden yaz, bağlantı noktası %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "Kaynağı %h olarak yeniden yaz" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "Kaynağı %h olarak yeniden yaz" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" "Kaynağı %h olarak yeniden yazın, bağlantı noktası " "%h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" "Kaynağı %h olarak yeniden yaz, bağlantı noktası %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "Çıkış cihazı adresine yeniden yaz" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" +"Sağlam Güvenlik Ağı (RSN): WPA2-EAP ağları için dolaşım ön yetkilendirmesine " +"izin verin (ve bunu WLAN işaretlerinde tanıtın). Yalnızca belirtilen ağ " +"arabirimi bir köprü ise çalışır. Zaman açısından kritik yeniden " +"ilişkilendirme sürecini kısaltır." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Sağlamlık" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -7037,19 +7995,19 @@ msgstr "Kök hazırlığı" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Round-Robin politikası (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Ä°zin Verilen IP'leri Yönlendir" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "Eylem zincirini \"%h\" yönlendir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Yönlendirme Tipi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7069,6 +8027,10 @@ msgstr "Yönlendirici Şifresi" msgid "Routing" msgstr "Yönlendirme" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Yönlendirme Algoritması" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7083,24 +8045,24 @@ msgstr "" msgid "Rule" msgstr "Kural" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "Kural eylemleri" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "Kural yorumu: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "Kural kapsayıcı zinciri \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "Kural eşleşmeleri" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Kural türü" @@ -7120,11 +8082,24 @@ msgstr "Çalışma hatası" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "SIM'ler" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7142,15 +8117,15 @@ msgstr "SSH sunucusu bağlantı noktası" msgid "SSH username" msgstr "SSH kullanıcı adı" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH-Anahtarları" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7167,7 +8142,7 @@ msgstr "SSTP Sunucusu" msgid "SWAP" msgstr "TAKAS" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7178,7 +8153,7 @@ msgid "Save" msgstr "Kaydet" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Kaydet & Uygula" @@ -7195,7 +8170,7 @@ msgstr "Mtdblock'u kaydet" msgid "Save mtdblock contents" msgstr "Mtdblock içeriğini kaydet" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Tara" @@ -7204,11 +8179,16 @@ msgstr "Tara" msgid "Scheduled Tasks" msgstr "Zamanlanmış Görevler" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "%s bölümü boş." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Bölüm eklendi" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Bölüm kaldırıldı" @@ -7226,9 +8206,9 @@ msgstr "" "zorla' seçeneğini seçin. Yalnızca donanım yazılımının doğru olduğundan ve " "cihazınız için tasarlandığından eminseniz kullanın!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Dosya Seç…" @@ -7236,7 +8216,7 @@ msgstr "Dosya Seç…" msgid "Selects the transmit hash policy to use for slave selection" msgstr "Bağımlı seçimi için kullanılacak gönderim hash politikasını seçer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7244,7 +8224,7 @@ msgstr "" "Bu cihazı IPv6 yönlendiricisi olarak tanıtan RA iletileri gönder." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "ICMP yönlendirmeleri gönder" @@ -7265,11 +8245,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "Bu cihazın ana bilgisayar adını gönder" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Sunucu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Sunucu adresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Sunucu adı" @@ -7294,17 +8278,21 @@ msgstr "Oturum süresi doldu" msgid "Set Static" msgstr "Sabit Olarak Ayarla" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "Ana bilgisayar adı için bir takma ad ayarlayın." + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "%s Başlık alanını %s olarak ayarla" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" "Arayüzü NDP-Proxy harici bağımlı olarak ayarlayın. Varsayılan kapalıdır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7317,7 +8305,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "Tüm bağımlılara aynı MAC Adresini ayarlayın" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7328,7 +8316,7 @@ msgstr "" "Etkinleştirildiğinde, istemciler durumsuz IPv6 adresi otomatik " "yapılandırması gerçekleştirir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7344,11 +8332,15 @@ msgstr "Şu anda aktif olan bağımlı olarak ayarlayın (aktif, 1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "Bağa eklenen ilk bağımlı öğeyi ayarla (takip et, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "DHCP Sunucusunu Kur" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Proxy'li IPv6 komşuları için kurulum yolları." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7356,33 +8348,39 @@ msgid "Setting PLMN failed" msgstr "PLMN ayarı başarısız oldu" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "İşlem modunu ayarlama başarısız oldu" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "Ä°zin verilen ağ teknolojisini ayarlama." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "Tercih edilen ağ teknolojisini ayarlama." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Ayarlar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "Proxy'li IPv6 komşuları için kurulum yolları." - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "Ciddi Şekilde Hatalı Saniyeler (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" +msgstr "" +"Birden fazla AP arasında dolaşımda kablosuz istemcilere yardımcı olmaya " +"yönelik ayarlar: 802.11r, 802.11k ve 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "Kısa GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Kısa Başlangıç" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Mevcut yedekleme dosyası listesini göster" @@ -7395,16 +8393,16 @@ msgstr "Boş zincirleri göster" msgid "Show raw counters" msgstr "Ham sayaçları göster" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Bu arayüzü kapat" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7412,15 +8410,15 @@ msgstr "Bu arayüzü kapat" msgid "Signal" msgstr "Sinyal" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Sinyal / Gürültü" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Sinyal Zayıflaması (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "Sinyal Kalitesi" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Sinyal Yenileme Hızı" @@ -7428,12 +8426,12 @@ msgstr "Sinyal Yenileme Hızı" msgid "Signal:" msgstr "Sinyal:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Boyut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "DNS sorgu önbelleğinin boyutu" @@ -7450,12 +8448,12 @@ msgstr "Atla" msgid "Skip from backup files that are equal to those in /rom" msgstr "Yedekleme dosyalarından /rom'dakilerle aynı olanlarını atla" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "İçeriğe geç" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Gezintiye atla" @@ -7473,14 +8471,10 @@ msgstr "Yazılımsal VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "Bazı alanlar geçersizdir, değerler kaydedilemez!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "Üzgünüz, istediğiniz nesne bulunamadı." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Üzgünüz, sunucu beklenmedik bir hatayla karşılaştı." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7491,8 +8485,8 @@ msgstr "" "manuel olarak flaşlanmalıdır. Cihaza özel kurulum talimatları için lütfen " "wiki'ye bakın." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7519,7 +8513,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "Kaynak bağlantı noktası" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7527,7 +8521,7 @@ msgstr "" "Dnsmasq için özel PXE " "önyükleme seçenekleri." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7536,7 +8530,7 @@ msgstr "" "listesini belirtir. Belirtilmezse, yerel cihaz DNS arama etki alanı " "duyurulur." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7547,7 +8541,7 @@ msgstr "" "devre dışı bırakılmadığı sürece cihaz kendisini IPv6 DNS sunucusu olarak " "duyurur." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7577,7 +8571,7 @@ msgstr "ARP izleme için kullanılacak IP adreslerini belirtir" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "Milisaniye cinsinden MII bağlantı izleme frekansını belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "IP başlıklarında eşleşecek TOS değerini belirtir" @@ -7585,7 +8579,7 @@ msgstr "IP başlıklarında eşleşecek TOS değerini belirtir" msgid "Specifies the aggregation selection logic to use" msgstr "Kullanılacak toplama seçim mantığını belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "Eşleşecek hedef alt ağı belirtir (CIDR gösterimi)" @@ -7593,7 +8587,7 @@ msgstr "Eşleşecek hedef alt ağı belirtir (CIDR gösterimi)" msgid "Specifies the directory the device is attached to" msgstr "Aygıtın eklendiği dizini belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7603,7 +8597,7 @@ msgstr "" "işaretleri belirtir, örneğin istemcilere durum bilgisi olan DHCPv6 " "aracılığıyla daha fazla bilgi isteme talimatı vermek için." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" @@ -7612,7 +8606,7 @@ msgstr "" "255 işaretiyle eşleşecek veya herhangi bir çift işaret değeriyle eşleşecek " "0x0/0x1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "Gelen mantıksal arabirim adını belirtir" @@ -7649,7 +8643,7 @@ msgstr "" "Ana bilgisayarların öldüğünün varsayılacağı maksimum saniye miktarını " "belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7671,7 +8665,7 @@ msgstr "" msgid "Specifies the mode to be used for this bonding interface" msgstr "Bu bağlama arayüzü için kullanılacak modu belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7713,15 +8707,15 @@ msgstr "" "Bağlama sürücüsünün her bir bağımlı eş anahtarına öğrenme paketleri " "gönderdiği örnekler arasındaki saniye sayısını belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "IP kurallarının sırasını belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "Dışarı giden mantıksal arabirim adını belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7748,19 +8742,19 @@ msgstr "" "Etkin ikincil öğenin arızalanması veya birincil ikincil öğenin kurtarılması " "meydana geldiğinde birincil bağımlı için yeniden seçim politikasını belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "Kullanılacak rota metriğini belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "Oluşturulacak rota türünü belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "Kural hedefi yönlendirme eylemini belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "Eşleşecek kaynak alt ağı belirtir (CIDR gösterimi)" @@ -7784,7 +8778,7 @@ msgstr "" "Bir bağlantı kurtarma algılamasından sonra bir bağımlı birimi " "etkinleştirmeden önce beklenecek süreyi milisaniye cinsinden belirtir" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7906,15 +8900,23 @@ msgid "" msgstr "" "Varsayılan (1280 bayt) dışında bir MTU (Maksimum Ä°letim Birimi) belirtin." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Gizli şifreleme anahtarını burada belirtin." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "Hız: %d Mibit/s, Çift Yönlü: %s" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "Bölücüsüz ADSL (G.992.2) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "Eski komşu önbellek zaman aşımı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Başlat" @@ -7927,16 +8929,16 @@ msgstr "WPS'yi başlat" msgid "Start priority" msgstr "Başlatma önceliği" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Yenilemeye başla" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Yapılandırma uygulanıyor…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Kablosuz tarama başlatılıyor..." @@ -7945,6 +8947,10 @@ msgstr "Kablosuz tarama başlatılıyor..." msgid "Startup" msgstr "Başlatma" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "Durum" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Statik IPv4 Yolları" @@ -7958,7 +8964,7 @@ msgstr "Statik IPv6 Yolları" msgid "Static Lease" msgstr "Statik Kira" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Statik Kiralar" @@ -7968,7 +8974,7 @@ msgstr "Statik Kiralar" msgid "Static address" msgstr "Statik adres" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7979,18 +8985,18 @@ msgstr "" "kiraya sahip ana bilgisayarların sunulduğu dinamik olmayan arabirim " "yapılandırmaları için de gereklidir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Ä°stasyon dugunluk limiti" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Durum" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Durdur" @@ -7999,8 +9005,8 @@ msgstr "Durdur" msgid "Stop WPS" msgstr "WPS'yi durdur" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Yenilemeyi durdur" @@ -8008,11 +9014,11 @@ msgstr "Yenilemeyi durdur" msgid "Storage" msgstr "Depolama" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "Sıkı Filtreleme" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Katı düzen" @@ -8021,15 +9027,15 @@ msgid "Strong" msgstr "Kuvvetli" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Gönder" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Günlük kaydını bastır" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "DHCP protokolü için rutin işlemin günlüğe kaydedilmesini engelle." @@ -8062,7 +9068,7 @@ msgstr "Ağ anahtarı VLAN" msgid "Switch port" msgstr "Ağ anahtarı Bağlantı noktası" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Ağ anahtarı protokolü" @@ -8072,7 +9078,7 @@ msgstr "Ağ anahtarı protokolü" msgid "Switch to CIDR list notation" msgstr "CIDR listesi gösterimine geç" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Sembolik bağlantı" @@ -8084,8 +9090,16 @@ msgstr "NTP Sunucusu ile Senkronize Et" msgid "Sync with browser" msgstr "Tarayıcı ile senkronize et" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Sözdizimi: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Sözdizimi: _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -8109,9 +9123,9 @@ msgstr "Sistem özellikleri" msgid "System log buffer size" msgstr "Sistem günlüğü arabellek boyutu" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "Kurtarma (initramfs) modunda çalışan sistem." @@ -8140,7 +9154,7 @@ msgstr "TCP kaynak bağlantı noktası" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "TFTP sunucusu kökü" @@ -8153,26 +9167,37 @@ msgstr "TX" msgid "TX Rate" msgstr "TX Oranı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "TX sıra uzunluğu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Tablo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "Etiket" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Etiketlendi" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Hedef" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "Hedef Platform" @@ -8188,7 +9213,7 @@ msgstr "Geçici alan" msgid "Terminate" msgstr "Sonlandır" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8198,7 +9223,7 @@ msgstr "" "yayınlanacak MTU. Minimum " "1280 bayttır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." @@ -8206,7 +9231,7 @@ msgstr "" "Yönetilen adres yapılandırması (M) bayrağı, IPv6 adreslerinin " "DHCPv6 aracılığıyla kullanılabildiğini gösterir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -8214,7 +9239,7 @@ msgstr "" "Mobil IPv6 Ana Aracısı (H) işareti, cihazın bu bağlantıda Mobil " "IPv6 ana aracısı olarak da hareket ettiğini gösterir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8234,7 +9259,11 @@ msgstr "" "Yapılandırmanın QR kod görüntüsünü oluşturmak için qrencode paketi " "gereklidir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "Bu ana bilgisayarın DHCPv6-DUID'si (DHCP benzersiz tanımlayıcısı)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8250,18 +9279,26 @@ msgstr "" "HE.net uç nokta güncelleme yapılandırması değişti, şimdi kullanıcı kimliği " "yerine düz kullanıcı adını kullanmalısınız!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "%h IP adresi zaten başka bir statik kiralama tarafından kullanılıyor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "IP adresi, herhangi bir DHCP havuzu adres aralığının dışında" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "Önyükleme sunucusunun IP adresi" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" +"Bu ana bilgisayar için kullanılacak IP adresi veya bu ana bilgisayardan " +"gelen herhangi bir DHCP isteğini yoksaymak için yoksay." + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "IPv4 adresi veya uzak ucun tam nitelikli etki alanı adı." @@ -8269,6 +9306,7 @@ msgstr "IPv4 adresi veya uzak ucun tam nitelikli etki alanı adı." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "IPv4 adresi veya uzak tünelin sonunun tam nitelikli etki alanı adı." @@ -8283,6 +9321,14 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "IPv6 adresi veya uzak tünelin sonunun tam nitelikli etki alanı adı." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" +"Onaltılık sayı (maks. 8 karakter) olarak IPv6 arayüz tanımlayıcısı (adres " +"son eki)." + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8293,7 +9339,7 @@ msgstr "Sağlayıcıya atanan IPv6 öneki genellikle :: ile biter" msgid "The LED blinks with the configured on/off frequency" msgstr "LED, yapılandırılan açma/kapama sıklığıyla yanıp söner" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "LED, gerçek kalp atışını taklit etmek için yanıp söner." @@ -8312,7 +9358,7 @@ msgstr "LED, her zaman öntanımlı durumda kapalıdır." msgid "The LED is always in default state on." msgstr "LED, her zaman öntanımlı durumda açıktır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" @@ -8320,15 +9366,19 @@ msgstr "" "%h MAC adresi, aynı DHCP havuzunda başka bir statik kiralama tarafından " "zaten kullanılıyor" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "MTU, %d baytlık ana aygıt MTU'sunu aşmamalıdır" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "VLAN kimliği benzersiz olmalıdır" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "Mesh yollarını keşfetmek için kullanılan algoritma" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8340,14 +9390,14 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "Aşağıdaki hata nedeniyle yapılandırma dosyası yüklenemedi:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" "Gizli bir kablosuz ağa katılırken doğru SSID manuel olarak belirtilmelidir" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8374,12 +9424,12 @@ msgstr "" "Belleğin veya bölümün aygıt dosyası (örn. " "/dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "Cihaz adı \"%s\" zaten alınmış" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." @@ -8387,7 +9437,7 @@ msgstr "" "LuCI'nin düzgün çalışması için mevcut ağ yapılandırmasının değiştirilmesi " "gerekir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8410,7 +9460,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Aşağıdaki kurallar bu sistemde şu anda etkin durumdadır." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "Sıklık, 1 dakikalık ortalama CPU yüküyle doğru orantılıdır." @@ -8418,19 +9468,19 @@ msgstr "Sıklık, 1 dakikalık ortalama CPU yüküyle doğru orantılıdır." msgid "The gateway address must not be a local IP address" msgstr "Ağ geçidi adresi yerel bir IP adresi olmamalıdır" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" "Oluşturulan konfigürasyon, bu cihaza bir bağlantı kurmak için bir WireGuard " "istemci uygulamasına aktarılabilir." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "Verilen SSH genel anahtarı zaten eklenmiştir." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8438,15 +9488,35 @@ msgstr "" "Verilen SSH genel anahtarı geçersiz. Lütfen uygun genel RSA veya ECDSA " "anahtarlarını sağlayın." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "Bu girdinin/ana bilgisayarın boşluklarla ayrılmış donanım adres(ler)i." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"Atlama cezası ayarı, batman-adv'nin kısa rotalara karşı çoklu atlama " +"rotaları tercihini değiştirmeye izin verir. Değer, iletilen her OGM'nin " +"TQ'suna uygulanır, böylece ekstra bir atlamanın maliyetini yayar (paketin " +"alınması ve yeniden iletilmesi gerekir, bu da yayın süresine mal olur)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "Önyükleme sunucusunun ana makine adı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "Arayüz bulunamadı" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Arayüz adı zaten kullanılıyor" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Arayüz adı çok uzun" @@ -8470,6 +9540,7 @@ msgstr "Yerel IPv4 adresi" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "Tünelin oluşturulduğu yerel IPv4 adresi (isteğe bağlı)." @@ -8484,7 +9555,7 @@ msgstr "Yerel IPv4 ağ maskesi" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "Tünelin oluşturulduğu yerel IPv6 adresi (isteğe bağlı)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8498,7 +9569,7 @@ msgstr "" "değiştirmek için ayarlanabilir. Daha düşük bir değer, bir grubun son " "üyesinin kaybını tespit etmek için daha az zamanla sonuçlanır" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8510,7 +9581,7 @@ msgstr "" "patlamasını ayarlayabilir; Daha büyük değerler, ana bilgisayar yanıtları " "daha geniş bir aralığa yayıldığından trafiği daha az yoğun hale getirir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8518,7 +9589,7 @@ msgstr "" "RA mesajlarında yayınlanacak " "maksimum atlama sayısı. Maksimum 255 atlamadır." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." @@ -8526,7 +9597,7 @@ msgstr "" "Bu cihaza ağ erişimi, \"%h\" arabiriminin ayarları değiştirilerek " "kesilebilir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Ağ adı zaten kullanılıyor" @@ -8546,7 +9617,7 @@ msgstr "" "kullanılır. Genellikle, internet ve yerel ağ için diğer portlar gibi bir " "sonraki büyük ağa bağlantı için varsayılan olarak bir Uplink portu vardır." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " @@ -8556,7 +9627,7 @@ msgstr "" "Bu genellikle statik bir genel IP adresi, statik bir ana bilgisayar adı veya " "bir DDNS etki alanıdır." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "Sorgu yanıt aralığı, sorgu aralığı değerinden düşük olmalıdır" @@ -8569,7 +9640,7 @@ msgstr "Yeniden başlatma komutu %d koduyla başarısız oldu" msgid "The restore command failed with code %d" msgstr "Geri yükleme komutu %d koduyla başarısız oldu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8579,13 +9650,13 @@ msgstr "" "verir. Bir ağın kayıplı olması bekleniyorsa, sağlamlık değeri artırılabilir. " "IGMP, (Sağlamlık-1) paket kayıplarına karşı dayanıklıdır" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "Kural hedefi, öncelik değeriyle belirtilen başka bir kurala atlamadır" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8596,11 +9667,11 @@ msgstr "" "sembol takma adı. Yerel (255), ana (254) ve varsayılan (253) özel takma " "adlar da geçerlidir" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "Seçilen %s modu, %s şifrelemesiyle uyumlu değil" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "Gönderilen güvenlik jetonu geçersiz veya süresi zaten dolmuş!" @@ -8641,6 +9712,19 @@ msgstr "Sistem şifresi başarıyla değiştirildi." msgid "The sysupgrade command failed with code %d" msgstr "Sysupgrade komutu %d koduyla başarısız oldu" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" +"Hangi ana makine direktiflerinin kullanıldığı etiket yapısı filtreleri; " +"birden fazla etiket sağlanabilir, bu durumda talebin hepsiyle eşleşmesi " +"gerekir. Etiketli yönergeler, etiketsiz olanlara tercih edilir. Mac, duid " +"veya ana bilgisayar adından birinin hala belirtilmesi gerektiğini unutmayın " +"(joker karakter olabilir)." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8668,12 +9752,20 @@ msgstr "" "Yüklenen aygıt yazılımı desteklenen bir format içermiyor. Platformunuz için " "genel yazılım formatını seçtiğinizden emin olun." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "Değer, konfigürasyon tarafından geçersiz kılınır. Orijinali: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "Değer, konfigürasyon tarafından geçersiz kılınır." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" +"Değer, batman-adv'nin protokol bilgileriyle ağı doldurduğu aralığı " +"(milisaniye) belirtir." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8682,19 +9774,20 @@ msgstr "" "kurallarının karıştırılması önerilmez ve eksik trafik filtrelemesine neden " "olabilir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Aktif kira yok" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Uygulanabilecek değişiklik yok" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8707,16 +9800,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "Yönlendiricinin IPv4 adresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Bu kimlik doğrulama türü, seçilen EAP yöntemi için geçerli değildir." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Bu geçerli bir PEM dosyası gibi görünmüyor" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8734,6 +9827,23 @@ msgstr "" "Bu, tünel için yapılandırılan \"Güncelleme Anahtarıdır\" veya hiçbir " "güncelleme anahtarı yapılandırılmamışsa hesap parolasıdır" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Bu, fiziksel Cihazı yukarıdan bağlamak istediğiniz batman-adv cihazıdır. Bu " +"liste boşsa, önce bir tane oluşturmanız gerekir. Mesh trafiğini kablolu bir " +"ağ cihazı üzerinden yönlendirmek istiyorsanız, lütfen yukarıdaki Cihaz " +"seçiciden seçin. Batman-adv arayüzünü bir Wi-fi ağına atamak istiyorsanız, " +"Cihaz seçicide bir Cihaz seçmeyin, bunun yerine Kablosuz ayarlarına gidin ve " +"oradan bir ağ olarak bu arabirimi seçin." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8750,7 +9860,7 @@ msgstr "" "Bu, tünel aracısı tarafından atanan yerel uç nokta adresidir ve genellikle " "...:2/64 ile biter" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "Bu, yerel ağdaki tek DHCP sunucusudur." @@ -8784,8 +9894,8 @@ msgstr "" "Bu liste, halihazırda çalışan sistem süreçleri ve durumlarına genel bir " "bakış sağlar." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "Ca-bundle paketi kurulu olmadığı için bu seçenek kullanılamaz." @@ -8800,33 +9910,41 @@ msgstr "Bu bölüm henüz herhangi bir değer içermiyor" msgid "Time Synchronization" msgstr "Zaman Senkronizasyonu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Zaman ilanı" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "Milisaniye cinsinden süre" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "Dinleme ve öğrenme durumlarında harcanacak saniye cinsinden süre" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "GTK'yı yeniden anahtarlamak için zaman aralığı" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Saat dilimi" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "Zaman aşımına uğradı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "Saniye cinsinden zaman aşımı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" "Yönlendirme veritabanındaki öğrenilen MAC adresleri için saniye cinsinden " "zaman aşımı" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "" "Bağlantı kaybında topoloji güncellemelerine kadar olabilecek saniye " @@ -8836,7 +9954,7 @@ msgstr "" msgid "Timezone" msgstr "Saat dilimi" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the yapılandırma içe aktarımını kullanın." -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Giriş yap…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8862,7 +9976,7 @@ msgstr "" "başlangıç durumuna döndürmek için \"Sistem Sıfırlaması gerçekleştir\" " "seçeneğini tıklayın (yalnızca squashfs imajı ile mümkündür)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Ton" @@ -8870,12 +9984,16 @@ msgstr "Ton" msgid "Total Available" msgstr "Toplam Mevcut" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "Takip Alan Kodu" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8887,11 +10005,11 @@ msgstr "Trafik" msgid "Traffic Class" msgstr "Trafik Sınıfı" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "Trafik filtre zinciri \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "Kurala göre eşleşen trafik: %.1000mPackets, %.1024mBytes" @@ -8908,6 +10026,26 @@ msgstr "Ä°let" msgid "Transmit Hash Policy" msgstr "Karma Politikasını Ä°let" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "Ä°letim kesildi" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "Ä°letim hataları" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Ä°letilen Veriler" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "Ä°letilen baytlar" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "Ä°letilen paketler" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8946,7 +10084,7 @@ msgstr "Tünel Arayüzü" msgid "Tunnel Link" msgstr "Tünel Bağlantısı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Tünel cihazı" @@ -8955,13 +10093,13 @@ msgid "Tx-Power" msgstr "Tx-Gücü" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Tür" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Hizmet türü" @@ -9010,7 +10148,7 @@ msgstr "Harici IP adresi belirlenemiyor" msgid "Unable to determine upstream interface" msgstr "Yukarı akış arayüzü belirlenemiyor" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Gönderilemiyor" @@ -9061,19 +10199,31 @@ msgstr "Güvenlik duvarı yeniden başlatılamıyor: %s" msgid "Unable to save contents: %s" msgstr "İçerik kaydedilemiyor: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Kullanılamayan Saniyeler (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "Ä°zin verilen mod listesi ayarlanamıyor." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "Tercih edilen mod ayarlanamıyor." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "PIN doğrulanamadı" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Yapılandırmayı kaldır" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Beklenmeyen yanıt veri biçimi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -9091,7 +10241,7 @@ msgstr "" msgid "Unknown" msgstr "Bilinmiyor" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Bilinmeyen ve desteklenmeyen bağlantı yöntemi." @@ -9115,11 +10265,11 @@ msgstr "Yönetilmeyen" msgid "Unmount" msgstr "Kaldır" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Adsız anahtar" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Kaydedilmemiş Değişiklikler" @@ -9133,15 +10283,25 @@ msgid "Unsupported MAP type" msgstr "Desteklenmeyen MAP türü" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Desteklenmeyen modem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Desteklenmeyen protokol" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Desteklenmeyen protokol türü." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Etiketsiz" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "Adsız eş" @@ -9153,7 +10313,7 @@ msgstr "Aktif" msgid "Up Delay" msgstr "Yukarı Gecikme" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Yükle" @@ -9170,25 +10330,29 @@ msgstr "" msgid "Upload archive..." msgstr "Arşiv yükle..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Dosya yükle" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Dosya yükle…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "Yükleme iptal edildi" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Yükleme isteği başarısız oldu: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Dosya yükleniyor…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9198,7 +10362,7 @@ msgstr "" "wifinet# biçiminde bir ad atanacak ve ağ, güncellenmiş " "yapılandırmayı uygulamak için yeniden başlatılacaktır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -9206,7 +10370,7 @@ msgstr "" "\"Devam\" düğmesine basıldığında, köprü yapılandırması güncellenecek ve " "güncellenen yapılandırmayı uygulamak için ağ yeniden başlatılacak." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -9214,20 +10378,24 @@ msgstr "" "\"Devam\" düğmesine basıldığında, ifname seçenekleri yeniden adlandırılacak " "ve güncellenmiş yapılandırmayı uygulamak için ağ yeniden başlatılacaktır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "Yukarı akış çözümleyicileri, resolv dosyasındaki sıraya göre sorgulanacaktır." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Çalışma süresi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "/etc/ethers kullanın" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "DHCP'yi kullan" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "DHCP duyurusu yapılan sunucuları kullan" @@ -9236,13 +10404,18 @@ msgstr "DHCP duyurusu yapılan sunucuları kullan" msgid "Use DHCP gateway" msgstr "DHCP ağ geçidini kullan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "DHCPv6'yı kullan" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Eş tarafından duyurulan DNS sunucularını kullanın" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "ISO/IEC 3166 alpha2 ülke kodlarını kullan." @@ -9290,22 +10463,25 @@ msgstr "Kök dosya sistemi olarak kullan (/)" msgid "Use broadcast flag" msgstr "Yayın işaretini kullan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Yerleşik IPv6 yönetimini kullanın" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Özel DNS sunucularını kullan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Varsayılan ağ geçidini kullan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Ağ geçidi metriğini kullan" @@ -9331,15 +10507,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "Her bağlantı için aynı kaynağı ve hedefi kullan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Sistem sertifikalarını kullan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "İç tünel için sistem sertifikalarını kullan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9370,11 +10546,11 @@ msgstr "" msgid "Used" msgstr "Kullanılmış" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Kullanılan Anahtar Yuvası" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9382,59 +10558,61 @@ msgstr "" "Ä°ki farklı amaç için kullanılır: RADIUS NAS ID ve 802.11r R0KH-ID. Normal " "WPA (2) -PSK ile gerekli değildir." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Kullanıcı grubu" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Kullanıcı sertifikası (PEM kodlu)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "Kullanıcı tanımlayıcısı" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Kullanıcı anahtarı (PEM kodlu)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Kullanıcı adı" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "%h akış tablosundan yararlan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (Sanal Ethernet Bağlantı Noktası Toplayıcı)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "VLAN Kimliği" @@ -9454,24 +10632,27 @@ msgstr "VPN Yerel adresi" msgid "VPN Local port" msgstr "VPN Yerel bağlantı noktası" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "VPN Protokolü" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPN Sunucusu" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "VPN Sunucu sertifikasının SHA256 karması" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "VPN Sunucusu bağlantı noktası" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "VPN Sunucusunun sertifikası SHA1 karması" @@ -9480,6 +10661,10 @@ msgstr "VPN Sunucusunun sertifikası SHA1 karması" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (ve diğerleri) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9493,7 +10678,7 @@ msgstr "VXLAN ağ tanımlayıcısı" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9501,8 +10686,8 @@ msgstr "" "DNS yanıtlarını doğrula ve DNSSEC verilerini önbelleğe al, yukarı akışın " "DNSSEC'yi desteklemesini gerektirir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9530,7 +10715,7 @@ msgstr "Satıcı" msgid "Vendor Class to send when requesting DHCP" msgstr "DHCP istendiğinde gönderilecek Satıcı Sınıfı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" "İşaretsiz alan adlarının yanıtlarının gerçekten işaretsiz alan adlarından " @@ -9540,12 +10725,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Yüklenen görüntü dosyasını doğrulama." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Çok yüksek" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Sanal Ethernet" @@ -9553,34 +10738,46 @@ msgstr "Sanal Ethernet" msgid "Virtual dynamic interface" msgstr "Sanal dinamik arayüz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "WEP Açık Sistem" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "WEP Paylaşılan Anahtar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "WEP parolası" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "WLAN dolaşımı" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "WMM Modu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "WNM Uyku Modu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "WNM Uyku Modu Düzeltmeleri" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "WPA parolası" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9610,7 +10807,20 @@ msgstr "" msgid "Weak" msgstr "Güçsüz" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Ağırlık" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" +"Bir ana bilgisayar bir girişle eşleştiğinde bilinen özel etiketi " +"ayarlanır. Bilinen tüm ana bilgisayarları eşleştirmek için bilinen " +"seçeneğini kullanın." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." @@ -9618,7 +10828,25 @@ msgstr "" "Ön ekleri birden çok aşağı akışa devrederken, alt ağları tahsis ederken ilk " "olarak daha yüksek tercih değerine sahip arabirimler dikkate alınır." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Ağ kodlaması etkinleştirildiğinde, birden çok çerçeveyi tek bir çerçevede " +"birleştirerek WiFi verimini artırır, böylece gereken yayın süresini azaltır." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Dağıtılmış ARP tablosu etkinleştirildiğinde, ağ tabanlı olmayan istemcilerin " +"ARP yanıtlarını çok daha güvenilir ve fazla gecikme olmadan almasına " +"yardımcı olan ağ çapında bir ARP önbelleği oluşturur." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" @@ -9626,7 +10854,35 @@ msgstr "" "Etkinleştirildiğinde, ağ geçidi herhangi bir arabirim önekiyle eşleşmese " "bile ağ geçidi bağlantıdadır" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Etkinleştirildiğinde, alınan karşılıksız APR isteklerinden veya " +"yanıtlarından yeni ARP tablosu girişleri eklenir, aksi takdirde yalnızca " +"önceden var olan tablo girişleri güncellenir, ancak yeni ana bilgisayarlar " +"öğrenilmez." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Ters çevrildiğinde, LED varsayılan olarak kapalı ve sistem etkinliğinde " +"yanıp sönmek yerine sürekli yanar ve titreşir." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Ağ, düğüm başına birden çok WiFi arabirimi üzerinden çalıştırıldığında, " +"batman-adv, maksimum performans elde etmek için trafik akışını optimize " +"edebilir." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9636,7 +10892,7 @@ msgstr "" "Etkinleştirildiğinde, aşağıdaki R0 / R1 anahtarı seçenekleri uygulanmaz. R0 " "ve R1 anahtarı seçeneklerini kullanmak için bunu devre dışı bırakın." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9644,7 +10900,7 @@ msgstr "" "Wi-Fi Multimedya (WMM) Modu QoS'nin devre dışı bırakıldığı yerlerde, " "istemciler 802.11a / 802.11g hızlarıyla sınırlandırılabilir." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9653,16 +10909,25 @@ msgstr "" "yayın süresi verimliliği önemli ölçüde azalabilir." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Genişlik" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "WireGuard Durumu" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "WireGuard eşi devre dışı" @@ -9678,21 +10943,21 @@ msgid "Wireless Adapter" msgstr "Kablosuz Adaptör" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Kablosuz ağ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Kablosuza Genel Bakış" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Kablosuz Güvenliği" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Kablosuz yapılandırma geçişi" @@ -9708,15 +10973,15 @@ msgstr "Kablosuz devre dışı" msgid "Wireless is not associated" msgstr "Kablosuz ilişkili değil" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Kablosuz ağ devre dışı bırakıldı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Kablosuz ağ etkinleştirildi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Alınan DNS sorgularını sistem günlüğüne yaz." @@ -9728,7 +10993,7 @@ msgstr "Sistem günlüğünü dosyaya yaz" msgid "XOR policy (balance-xor, 2)" msgstr "XOR politikası (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9758,8 +11023,21 @@ msgstr "" "dosyalarını devre dışı bırakırsanız, cihazınız erişilemez hale gelebilir!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Aynı Hedef için birden fazla kayıt ekleyebilirsiniz." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Aynı alan adı için birden fazla kayıt ekleyebilirsiniz." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" +"Aynı Dinleme adresine birden fazla benzersiz Aktarma Hedefi ekleyebilirsiniz." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9790,34 +11068,56 @@ msgstr "ZRam Ayarları" msgid "ZRam Size" msgstr "ZRam Boyutu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … .(Not: http mümkün olsa " +"da, hiçbir tarayıcı SRV kayıtlarını desteklemez.)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "herhangi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "otomatik" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "otomatik" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "otomatik (devre dışı)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "otomatik (etkin)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "köprülü" @@ -9874,25 +11174,30 @@ msgctxt "nft unit" msgid "day" msgstr "gün" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "devre dışı bırak" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "devre dışı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "sürücü varsayılanı" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "sürücü varsayılanı (%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "örn: --proxy 10.10.10.10" @@ -9901,14 +11206,23 @@ msgstr "örn: --proxy 10.10.10.10" msgid "e.g: dump" msgstr "örn: dump" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "etkinleştirildi" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "her %ds'de bir" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "süresi doldu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "zorunlu" @@ -9918,22 +11232,22 @@ msgstr "zorunlu" msgid "forward" msgstr "ileri" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "Tam dubleks" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "Yarı dubleks" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "onaltılık kodlanmış değer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "gizli" @@ -9942,9 +11256,9 @@ msgctxt "nft unit" msgid "hour" msgstr "saat" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "hibrit mod" @@ -9952,6 +11266,10 @@ msgstr "hibrit mod" msgid "ignore" msgstr "göz ardı et" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "sonsuz (kira süresi dolmaz)" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9966,11 +11284,19 @@ msgstr "8 ile 63 karakter arasında anahtar" msgid "key with either 5 or 13 characters" msgstr "5 veya 13 karakterli anahtar" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "bilinen" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "bilinen-diğer ağ (farklı alt ağda)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "yönetilen yapılandırma (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "orta güvenlik" @@ -9979,11 +11305,11 @@ msgctxt "nft unit" msgid "minute" msgstr "dakika" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "dakika" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "mobil ev aracısı (H)" @@ -9995,18 +11321,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "hayır" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "bağlantı yok" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "geçersiz kılma yok" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "boş olmayan değer" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "hiçbiri" @@ -10017,20 +11351,20 @@ msgid "not present" msgstr "mevcut değil" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "kapalı" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "mevcut önek üzerinde" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "açık ağ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "diğer yapılandırma (O)" @@ -10039,6 +11373,10 @@ msgstr "diğer yapılandırma (O)" msgid "output" msgstr "çıktı" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "bir günden daha önce" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -10056,23 +11394,34 @@ msgstr "pozitif tamsayı değeri" msgid "random" msgstr "rastgele" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "rastgele oluşturulmuş" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" +"gönderen mesajları çok sayıda küçük mesaj yerine tek bir pakette toplayarak " +"ve bir araya getirerek ek yükü azaltır" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "anahtarlama modu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "yönlendirildi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "san" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "sunucu modu" @@ -10080,7 +11429,7 @@ msgstr "sunucu modu" msgid "sstpc Log-level" msgstr "sstpc Günlük düzeyi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "güçlü güvenlik" @@ -10088,7 +11437,7 @@ msgstr "güçlü güvenlik" msgid "tagged" msgstr "etiketlendi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "zaman birimleri (TUs / 1.024 ms) [1000-65535]" @@ -10101,25 +11450,27 @@ msgstr "" "uHTTPd, HTTP veya HTTPS ağ erişimi sunar." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "eşsiz değer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "bilinmeyen" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "bilinmeyen sürüm" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "sınırsız" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -10141,8 +11492,8 @@ msgid "untagged" msgstr "etiketsiz" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "geçerli IP adresi" @@ -10155,7 +11506,7 @@ msgid "valid IPv4 CIDR" msgstr "geçerli IPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "geçerli IPv4 adresi" @@ -10184,7 +11535,7 @@ msgid "valid IPv6 CIDR" msgstr "geçerli IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "geçerli IPv6 adresi" @@ -10221,8 +11572,8 @@ msgstr "geçerli UCI tanımlayıcısı, ana bilgisayar adı veya IP adresi" msgid "valid address:port" msgstr "geçerli adres:bağlantı noktası" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "geçerli tarih (YYYY-AA-GG)" @@ -10262,11 +11613,23 @@ msgstr "geçerli tamsayı değeri" msgid "valid multicast MAC address" msgstr "geçerli çok noktaya yayın MAC adresi" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" +"\":\", \"/\", \"%\" veya boşluk içermeyen, 1 ila 15 karakter arasında " +"geçerli ağ cihazı adı" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "geçerli ağ cihazı adı, \".\" veya \"..\" değil" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "adres/ağ maskesi gösteriminde geçerli ağ" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "geçerli telefon rakamı (0-9, \"*\", \"#\", \"!\" veya \".\")" @@ -10276,43 +11639,43 @@ msgid "valid port or port range (port1-port2)" msgstr "geçerli bağlantı noktası veya bağlantı noktası aralığı (port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "geçerli bağlantı noktası değeri" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "geçerli zaman (SA:DA:SN)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "%d ile %d karakter arasındaki değer" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "%f ile %f arasındaki değer" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "%f den büyük veya eşit değer" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "%f den küçük veya eşit değer" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "%d karakterli değer" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "en az %d karakter içeren değer" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "en fazla %d karakter içeren değer" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "zayıf güvenlik" diff --git a/package/luci/modules/luci-base/po/uk/base.po b/package/luci/modules/luci-base/po/uk/base.po index 8e228951bf..929ff257af 100644 --- a/package/luci/modules/luci-base/po/uk/base.po +++ b/package/luci/modules/luci-base/po/uk/base.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2022-11-28 20:47+0000\n" -"Last-Translator: Arkadii Yakovets \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -11,25 +11,41 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.0-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" таблиця \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f дБ" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d біт" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d неприпустимі поля" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%dг тому" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%dхв тому" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%dс тому" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s є непозначеним у декількох VLAN!" @@ -54,10 +70,11 @@ msgstr "(пусто)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(нема приєднаних інтерфейсів)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ на %d більше" @@ -67,19 +84,19 @@ msgid "-- Additional Field --" msgstr "-- Додаткові поля --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Оберіть --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- нетипово --" @@ -105,7 +122,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "" "0 = не використовувати поріг RSSI, 1 = не змінюваим типові значення драйвера" @@ -119,7 +136,7 @@ msgstr "1" msgid "1 Minute Load:" msgstr "Навантаження за 1 хвилину:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" @@ -127,6 +144,11 @@ msgstr[0] "1 флаг" msgstr[1] "%d флага" msgstr[2] "%d флагів" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "Навантаження за 15 хвилин:" @@ -141,12 +163,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4-симв. шістнадцятковий ID" @@ -159,48 +186,115 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "Навантаження за 5 хвилин:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "" "6-октетний ідентифікатор у вигляді шістнадцяткового рядка – без двокрапок" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: Увімкнути звіт про маяк за допомогою радіовимірювань." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" +"802.11k: Увімкнути повідомлення про сусідів за допомогою радіовимірювань." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "Швидкий перехід 802.11r" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +#, fuzzy +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: Максимальний період бездіяльності BSS. Одиниці: секунди." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: керування переходом базового набору послуг (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#, fuzzy +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Оголошення місцевого часового поясу в кадрах керування." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#, fuzzy +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Проксі-ARP дозволяє не-AP STA, довше залишатися в режимі " +"енергозбереження." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: оголошення часу в кадрах керування." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +#, fuzzy +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: режим сну керування бездротовою мережею (Wireless Network " +"Management (WNM)) (розширений режим сну для станцій)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +#, fuzzy +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Виправлення режиму сну керування бездротовою мережею (Wireless " +"Network Management (WNM)): запобігає атакам повторної інсталяції." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "Максимальний тайм-аут запиту асоціації 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "Тайм-аут повторювання запиту асоціації 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "Захист кадрів управління 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "Максимальний тайм-аут 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "Тайм-аут повторювання 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "" "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-маски мережі" @@ -213,32 +307,48 @@ msgstr "" msgid "LED Name" msgstr "Назва LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP-Proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA флаги" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "" "Обмеження стрибків для RA " "повідомлень" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "Час життя RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA-Служба" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ відповідає будь-якому домену. /example.com/ " +"повертає NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# повертає NULL адреси (0.0.0.0 і " +"::) для example.com і його субдоменів." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -284,11 +394,23 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s не відповідає %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"Вузол batman-adv може працювати або в режимі сервера (ділитися своїм " +"підключенням до Інтернету з mesh), або в режимі клієнта (пошук найбільш " +"підходящого підключення до Інтернету в mesh), або p повністю вимкненою " +"підтримкою шлюзу (що є налаштуванням за умовчаванням)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "Конфігурація для пристрою \"%s\" вже існує" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "Каталог з такою ж назвою вже існує." @@ -297,25 +419,90 @@ msgid "A new login is required since the authentication session expired." msgstr "" "Оскільки сеанс автентифікації закінчився, потрібен новий вхід у систему." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (усі варіанти) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (усі варіанти) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (усі варіанти) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (усі варіанти) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (усі варіанти) Annex B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (усі варіанти) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (усі варіанти) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annex L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "" @@ -349,35 +536,46 @@ msgstr "Моніторинг ARP не підтримується для обра msgid "ARP retry threshold" msgstr "Поріг повторювання ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "Таблиця ARP трафіку «%h»" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"ARP, IPv4 і IPv6 (навіть 802.1Q) з MAC-адресами призначення багатоадресної " +"адреси одноадресно передаються на MAC-адресу STA. Примітка: це не Directed " +"Multicast Service (DMS) у 802.11v. Примітка: може порушити очікування " +"багатоадресної розсилки STA приймача." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "" "ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM-мости" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "" "Ідентифікатор віртуального каналу ATM (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "" "Ідентифікатор віртуального шляху ATM (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -387,27 +585,23 @@ msgstr "" "віртуальні мережеві інтерфейси Linux, котрі можуть використовуватися в " "поєднанні з DHCP або PPP для підключення до мережі провайдера." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Номер ATM-пристрою" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "Ідентифікатор постачальника системи ATU-C" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Відсутній інтерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Обмежувати службу DNS інтерфейсами підмереж, на яких ми обслуговуємо DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "Прийняти локальні дані" @@ -416,7 +610,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "Приймати пакет" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "Приймати пакети з локальними адресами джерела" @@ -424,16 +618,25 @@ msgstr "Приймати пакети з локальними адресами msgid "Access Concentrator" msgstr "Концентратор доступу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Точка доступу" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Ізоляція точки доступу" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "Технології доступу" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "Дії" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "Активний" @@ -471,8 +674,8 @@ msgstr "Активні IPv6 правила" msgid "Active-Backup policy (active-backup, 1)" msgstr "Політика активного резервного копіювання (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" @@ -489,18 +692,18 @@ msgstr "Адаптивне балансування навантаження п #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Додати" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Додати ATM-міст" @@ -520,11 +723,11 @@ msgstr "Додати дію LED" msgid "Add VLAN" msgstr "Додати VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "Додавання конфігурації пристрою" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "Додати конфігурацію пристрою…" @@ -532,18 +735,18 @@ msgstr "Додати конфігурацію пристрою…" msgid "Add instance" msgstr "Додати реалізацію" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Додати ключ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." -msgstr "Додавати суфікс локального домену до імен, отриманих із файлів hosts" +msgstr "Додавати суфікс локального домену до імен, отриманих із файлів hosts." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Додати новий інтерфейс..." @@ -551,6 +754,10 @@ msgstr "Додати новий інтерфейс..." msgid "Add peer" msgstr "Додати вузол" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "Додати до чорного списку" @@ -559,11 +766,11 @@ msgstr "Додати до чорного списку" msgid "Add to Whitelist" msgstr "Додати до білого списку" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Додаткові файли hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Додаткові файли servers" @@ -580,20 +787,24 @@ msgstr "Додаткові файли servers" msgid "Address" msgstr "Адреса" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "Тип адреси" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:284 msgid "Address setting is invalid" -msgstr "" +msgstr "Налаштування адреси неправильне" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 msgid "Address to access local relay bridge" msgstr "Адреса для доступу до мосту локального ретранслятора" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "Адреси" @@ -602,29 +813,29 @@ msgstr "Адреси" msgid "Administration" msgstr "Адміністрування" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Додаткові налаштування" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "Додаткові параметри пристрою" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "Час старіння" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Сукупна потужність передавача (ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Складати повідомлення відправників" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -660,17 +871,17 @@ msgstr "Інтерфейс псевдоніма" msgid "Alias of \"%s\"" msgstr "Псевдонім \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Усі сервери" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." -msgstr "Виділяти IP-адреси послідовно, починаючи з найнижчої доступної адреси" +msgstr "Виділяти IP-адреси послідовно, починаючи з найнижчої доступної адреси." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Виділяти IP послідовно" @@ -680,30 +891,30 @@ msgstr "" "Дозволити SSH-" "автентифікацію за допомогою пароля" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "" "Дозволити режиму AP відключення абонентів на підставі низького рівня ACK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Дозволити всі, крім зазначених" #: modules/luci-compat/root/usr/share/rpcd/acl.d/luci-compat.json:3 msgid "Allow full UCI access for legacy applications" -msgstr "Дозволити повний доступ до UCI для застарілих програм" +msgstr "Дозволити повний доступ до UCI для застарілих застосунків" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Дозволяти застарілі швидк. 802.11b" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Дозволити тільки зазначені" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Дозволити локальний вузол" @@ -726,19 +937,24 @@ msgid "Allow system feature probing" msgstr "Дозволити зондування функцій системи" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Дозволити користувачеві root вхід до системи з паролем" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" -msgstr "Дозволено IP-адреси" +msgstr "Дозволені IP-адреси" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" -msgstr "" +msgstr "Параметр AllowedIPs недійсний" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "Завжди" @@ -750,12 +966,12 @@ msgstr "Завжди вимкнено (ядро: none)" msgid "Always on (kernel: default-on)" msgstr "Завжди ввімкнено (ядро: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" "Завжди надсилайте параметри DHCP. Іноді це необхідно, напр. для PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -764,10 +980,14 @@ msgstr "" "перекривається. Використання цієї опції не відповідає стандарту IEEE " "802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "Кількість зондів виявлення повторюваних адрес для надсилання" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Час очікування готовності модему (секунд)" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "Сталася помилка під час збереження форми:" @@ -776,80 +996,32 @@ msgstr "Сталася помилка під час збереження фор msgid "An optional, short description for this device" msgstr "Необов'язковий, короткий опис для цього пристрою" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annex A + L + M (всі)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Annex A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Annex A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Annex A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Annex A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Annex B (всі)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Annex B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Annex B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Annex B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Annex J (всі)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Annex L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Annex M (всі)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Annex M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#, fuzzy +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"Оголосити префікс NAT64 у повідомленнях RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "Оголосити цей пристрій як DNS-сервер IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" -"Оголосити цей пристрій маршрутизатором за промовчанням, якщо присутній " -"локальний маршрут IPv6 за промовчанням." +"Оголошувати цей пристрій як маршрутизатор за замовчуванням, якщо присутній " +"локальний IPv6 маршрут за замовчуванням." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -858,7 +1030,7 @@ msgstr "" "загальнодоступний префікс IPv6, незалежно від доступності локального " "маршруту за промовчанням." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." @@ -866,15 +1038,15 @@ msgstr "" "Оголосити цей пристрій маршрутизатором за промовчанням незалежно від того, " "чи існують префікс або маршрут за промовчанням." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Оголошено DNS-домени" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "Анонсовані IPv6 DNS-сервери" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "Анонімна ідентифікація" @@ -886,7 +1058,7 @@ msgstr "Анонімне монтування" msgid "Anonymous Swap" msgstr "Анонімний своп" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "Будь-який пакет" @@ -898,53 +1070,57 @@ msgstr "Будь-який пакет" msgid "Any zone" msgstr "Будь-яка зона" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "" "Застосувати параметри DHCP до цієї мережі. (якщо порожньо = усі клієнти)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" -msgstr "" +msgstr "Застосувати та зберегти налаштування" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 msgid "Apply backup?" msgstr "Застосувати резервну копію?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Сталася помилка запиту на застосування зі статусом %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Застосувати без перевірки" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" -msgstr "" +msgstr "Застосувати з поверненням після втрати з’єднання" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Очікування на застосування конфігурації… %d c" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Архітектура" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Arp-скан" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" "Призначати частину заданої довжини до кожного публічного IPv6-префікса цього " "інтерфейсу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." @@ -952,7 +1128,7 @@ msgstr "" "Призначати для цього інтерфейсу частину префікса, використовуючи цей " "шістнадцятковий ID субпрефікса." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Пов'язані станції" @@ -961,8 +1137,8 @@ msgstr "Пов'язані станції" msgid "Associations" msgstr "Асоціації" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" @@ -970,8 +1146,8 @@ msgstr "" "Не менше %h на %h, імпульс %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -984,25 +1160,26 @@ msgid "Attempt to enable configured mount points for attached devices" msgstr "" "Спроба ввімкнення налаштованих точок монтування для приєднаних пристроїв" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Група автентифікації" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Автентифікація" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "Тип автентифікації" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Надійний" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Потрібна авторизація" @@ -1010,7 +1187,9 @@ msgstr "Потрібна авторизація" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -1029,7 +1208,7 @@ msgid "Automatically check filesystem for errors before mounting" msgstr "" "Автоматично перевіряти файлову систему на наявність помилок перед монтуванням" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1053,6 +1232,10 @@ msgstr "Автомонтування ФС" msgid "Automount Swap" msgstr "Автомонтування своп" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Доступно" @@ -1071,11 +1254,15 @@ msgstr "Доступно" msgid "Average:" msgstr "Середнє значення:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Уникати мостових петель" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1083,15 +1270,20 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +#, fuzzy +msgid "BSS Transition" +msgstr "Перехід BSS" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "Назад" @@ -1100,13 +1292,9 @@ msgstr "Назад" msgid "Back to Overview" msgstr "Повернутися до переліку" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Повернутися до конфігурування" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" -msgstr "" +msgstr "Повернутися до конфігурації вузлів" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:391 msgid "Backup" @@ -1117,16 +1305,15 @@ msgid "Backup / Flash Firmware" msgstr "Рез. копіювання / Перепрош." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Список файлів резервних копій" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Діапазон" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "Базовий пристрій" @@ -1136,12 +1323,35 @@ msgstr "" "Відкритий ключ цього інтерфейсу з кодуванням Base64 для спільного " "використання." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Пристрій Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Інтерфейс Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Інтервал маяка" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1153,9 +1363,9 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:287 msgid "Bind NTP server" -msgstr "" +msgstr "Прив’язати NTP-сервер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "Прив'язувати динамічно до інтерфейсів, а не за шаблоном адреси (типово для " @@ -1166,18 +1376,31 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Прив'язка інтерфейсу" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1189,65 +1412,77 @@ msgstr "Прив'язка тунелю до цього інтерфейсу (з msgid "Bitrate" msgstr "Бітрейт" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "Політика зв'язування" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "Міст" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "Міст (Підтримка прямого зв'язку між MAC VLAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "Фільтрування VLAN моста" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "Пристрій моста" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "Специфічні параметри порту моста" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "Порти моста" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "Таблиця трафіку мосту \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Номер моста" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "Піднімати порожній міст" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Піднімати при завантаженні" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "Піднімати інтерфейс моста, навіть якщо жоден порт не підключено" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "Політика широкомовності (broadcast, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "Огляд…" @@ -1255,15 +1490,37 @@ msgstr "Огляд…" msgid "Buffered" msgstr "Буферизовано" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "" "Сертифікат CA; якщо порожньо, його буде збережено після першого підключення." +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "Помилка конфігурації CLAT" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME або fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Завантаження ЦП, %" @@ -1278,18 +1535,25 @@ msgstr "Кешовано" msgid "Call failed" msgstr "Не вдалося здійснити виклик" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"Може бути корисним, якщо ISP має сервери імен IPv6, але не надає IPv6 " +"маршрутизації." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "Скасувати" @@ -1297,32 +1561,32 @@ msgstr "Скасувати" msgid "Cannot parse configuration: %s" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "Перехоплювати вхідні пакети, адресовані іншим хостам" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "Перехоплювати вхідні пакети до рішенням щодо маршрутизації" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "Перехоплювати вхідні пакети, що направлені в локальну систему" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "Перехоплювати вихідні пакети після рішення щодо маршрутизації" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "Перехоплення вихідних пакетів, що надходять з локальної системи" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "" @@ -1333,24 +1597,32 @@ msgstr "" msgid "Category" msgstr "Категорія" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "Обмеження сертифіката (Домен)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "Обмеження сертифіката (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "Обмеження сертифіката (Суб'єкт)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "Обмеження сертифіката (Шаблон)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1358,8 +1630,8 @@ msgstr "" "Підрядок обмеження сертифіката (наприклад, /CN=wifi.mycompany.com).
    Див. `logread-f` під час рукостискання для отримання фактичних значень" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" @@ -1367,8 +1639,8 @@ msgstr "" "Обмеження сертифікатів щодо значень DNS SAN (якщо вони доступні)
    або " "CN суб'єкта (точний збіг)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" @@ -1376,8 +1648,8 @@ msgstr "" "Обмеження сертифікатів за значеннями DNS SAN (якщо вони доступні)
    або " "CN суб'єкта (збіг суфікса)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1391,16 +1663,16 @@ msgstr "" msgid "Chain" msgstr "Ланцюжок" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "Хук ланцюга \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Зміни" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "Зміни було скасовано." @@ -1411,18 +1683,19 @@ msgstr "Зміна пароля адміністратора для доступ #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Канал" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "Аналіз каналів" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "Ширина каналу" @@ -1430,7 +1703,7 @@ msgstr "Ширина каналу" msgid "Check filesystems before mount" msgstr "Перевірити файлову систему перед монтуванням" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "Позначте цей параметр, щоб видалити існуючі мережі з цього радіо." @@ -1447,8 +1720,8 @@ msgstr "Перевірка образу…" msgid "Choose mtdblock" msgstr "Виберіть mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1460,7 +1733,7 @@ msgstr "" "заповніть поле нетипово, щоб визначити нову зону і прикріпити до " "неї інтерфейс." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1468,7 +1741,7 @@ msgstr "" "Оберіть мережі, які ви хочете прикріпити до цього бездротового інтерфейсу " "або заповніть поле нетипово, щоб визначити нову мережу." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "Шифр" @@ -1492,9 +1765,10 @@ msgstr "" "Натисніть \"Зберегти mtdblock\", щоб завантажити вказаний файл mtdblock. " "(ПРИМІТКА: ЦЕ ФУНКЦІЯ ДЛЯ ПРОФЕСІОНАЛІВ!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "Клієнт" @@ -1503,9 +1777,9 @@ msgstr "Клієнт" msgid "Client ID to send when requesting DHCP" msgstr "Ідентифікатор клієнта для відправки при запиті DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Закрити" @@ -1522,20 +1796,20 @@ msgstr "" "Закривати неактивні з'єднання після вказаного інтервалу часу (секунди). Для " "утримання неактивних з'єднань використовуйте 0" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Згорнути список..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Збирання даних..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Команда" @@ -1552,7 +1826,7 @@ msgstr "Не вдалося виконати команду" msgid "Comment" msgstr "Примітка" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1573,31 +1847,30 @@ msgstr "Обчислити вихідну контрольну суму (нео #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Config File" -msgstr "" +msgstr "Файл конфігурації" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Конфігурація" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" -msgstr "" +msgstr "Експорт конфігурації" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "Зміни конфігурації застосовано." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Зміни конфігурації було скасовано!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Помилка конфігурації" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1615,7 +1888,7 @@ msgstr "" "Підтримувані швидкості нижчі від мінімальної базової швидкості не " "пропонуються." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." @@ -1623,7 +1896,7 @@ msgstr "" "Налаштовує оголошення маршрутизатора за промовчанням у повідомленнях RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." @@ -1631,16 +1904,16 @@ msgstr "" "Налаштовує режим роботи служби RA на цьому інтерфейсі." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "Налаштовує режим роботи служби DHCPv6 на цьому інтерфейсі." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "Налаштовує режим роботи проксі-сервісу NDP на цьому інтерфейсі." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "Налаштувати…" @@ -1652,9 +1925,10 @@ msgstr "Підтвердіть від'єднання" msgid "Confirmation" msgstr "Підтвердження" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Підключений" @@ -1664,13 +1938,13 @@ msgstr "Підключений" msgid "Connection attempt failed" msgstr "Невдала спроба підключення" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "Спроба підключення зазнала невдачі." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" -msgstr "" +msgstr "Кінцева точка підключення" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:411 msgid "Connection lost" @@ -1680,9 +1954,9 @@ msgstr "З'єднання втрачено" msgid "Connections" msgstr "Підключення" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" -msgstr "" +msgstr "Зміна підключення" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:31 msgctxt "nft ct state" @@ -1709,9 +1983,9 @@ msgstr "" msgid "Contents have been saved." msgstr "Вміст збережено." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1722,16 +1996,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "Продовжити в %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "Продовжити в ланцюжку викликів" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "Продовжити обробку невідповідних пакетів" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1746,20 +2020,20 @@ msgstr "" msgid "Country" msgstr "Країна" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Код країни" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "Щільність елементів покриття" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Створити / Визначити зону брандмауера" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Створити інтерфейс" @@ -1771,19 +2045,19 @@ msgstr "Критична ситуація" msgid "Cron Log Level" msgstr "Рівень виведення інформації Cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Поточна" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:28 msgctxt "nft meta hour" msgid "Current time" -msgstr "" +msgstr "Поточний час" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:29 msgctxt "nft meta day" msgid "Current weekday" -msgstr "" +msgstr "Поточний день тижня" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:573 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:575 @@ -1800,8 +2074,7 @@ msgid "" "this, perform a factory-reset first." msgstr "" "Користувацькі файли (сертифікати, скрипти) можуть залишитися в системі. Щоб " -"запобігти цьому, спочатку виконайте відновлення мікропрограми до її " -"початкового стану." +"запобігти цьому, спочатку виконайте скидання до заводських налаштувань." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:6 msgid "Custom flash interval (kernel: timer)" @@ -1815,31 +2088,31 @@ msgstr "" "Налаштування поведінки LED, якщо це можливо." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "DAD передає" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "Клієнт DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "Порт DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "Секрет DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "Параметри DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Сервер DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP та DNS" @@ -1850,16 +2123,22 @@ msgstr "DHCP та DNS" msgid "DHCP client" msgstr "Клієнт DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Параметри DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "Клієнт DHCPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "Служба DHCPv6" @@ -1871,21 +2150,21 @@ msgstr "Служба DHCPv6" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "Переспрямовування запитів DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "" "Порт DNS-" "запиту" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "Домени пошуку DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" "Порт DNS-" @@ -1893,9 +2172,9 @@ msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:292 msgid "DNS setting is invalid" -msgstr "" +msgstr "Налаштування DNS недійсне" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "Вага DNS" @@ -1903,11 +2182,11 @@ msgstr "Вага DNS" msgid "DNS-Label / FQDN" msgstr "DNS-мітка / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "Перевірка непідписаного DNSSEC" @@ -1919,41 +2198,49 @@ msgstr "Тайм-аут простою DPD" msgid "DS-Lite AFTR address" msgstr "AFTR-адреса DS-Lite" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "Стан DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "Режим лінії DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "" "Інтервал DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Швидк. передавання" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Отримані дані" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Передані дані" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "Зневаджування" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "Маршрутизатор за промовчанням" @@ -1961,7 +2248,7 @@ msgstr "Маршрутизатор за промовчанням" msgid "Default state" msgstr "Типовий стан" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1971,7 +2258,7 @@ msgstr "" "\"6,192.168.2.1,192.168.2.2\", щоб оголошувати різні DNS-" "сервери для клієнтів." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" @@ -1979,7 +2266,7 @@ msgstr "" "Визначає відповідність внутрішнього пріоритету пакета Linux з пріоритетом " "заголовка VLAN, але для вихідних кадрів" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" @@ -1987,49 +2274,50 @@ msgstr "" "Визначає відповідність пріоритету заголовка VLAN на внутрішньому пріоритету " "пакета Linux у вхідних кадрах" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "Визначає конкретний MTU для цього маршруту" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "Делегувати префікси IPv6" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "Видалити" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Видалити ключ" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Помилка запиту на видалення: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Видалити цю мережу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Інтервал повідомлень індикації доправлення трафіку" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Опис" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Скасувати вибір" @@ -2037,11 +2325,11 @@ msgstr "Скасувати вибір" msgid "Design" msgstr "Стиль" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "Призначений майстер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -2076,9 +2364,9 @@ msgstr "Зона призначення" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2088,68 +2376,72 @@ msgstr "Зона призначення" msgid "Device" msgstr "Пристрій" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Конфігурація пристрою" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "Пристрій не є активним" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "Пристрій перезавантажується…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "Назва пристрою" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "Пристрій не керується ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "Пристрій відсутній" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "Тип пристрою" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "Пристрій недосяжний!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:53 msgid "Device unreachable! Still waiting for device..." -msgstr "Пристрій недосяжний! Досі чекаємо на пристрій..." +msgstr "Пристрій недоступний! Чекаю на доступність пристрою..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "Пристрої" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "Діагностика" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Набір номера" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "Каталог" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Вимкнути" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2166,20 +2458,24 @@ msgstr "Вимкнути DNS-запити" msgid "Disable Encryption" msgstr "Вимкнути шифрування" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Вимкнути опитування неактивності" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Вимкнути цю мережу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2188,16 +2484,16 @@ msgstr "Вимкнути цю мережу" msgid "Disabled" msgstr "Вимкнено" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" -msgstr "" +msgstr "Вимкнено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Роз'єднувати за низького підтвердження" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "" @@ -2205,18 +2501,17 @@ msgstr "" "href=\"%s\">RFC1918." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Від'єднати" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Спроба від'єднання не вдалася" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "Спроба відключення зазнала невдачі." @@ -2226,23 +2521,35 @@ msgstr "Дисковий простір" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Закрити" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Оптимізація за відстанню" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "Відстань до найвіддаленішого вузла мережі в метрах." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Розподілена таблиця ARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2250,7 +2557,7 @@ msgstr "" "Екземпляр Dnsmasq, до якого прив'язаний даний завантажувальний розділ. Якщо " "не вказано, розділ дійсний для усіх екземплярів Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSNAT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "Не кешувати негативні відповіді, наприклад, за неіснуючих доменів" @@ -2274,39 +2581,28 @@ msgstr "Не кешувати негативні відповіді, напри msgid "Do not create host route to peer (optional)." msgstr "Не створювати маршрут до вузла (необов'язково)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "Не переспрямовувати DNS-запити без DNS-імені" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "" -"Не переспрямовувати запити, які не може бути оброблено відкритими серверами " -"імен" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "" "Не переспрямовувати зворотні DNS-запити для локальних мереж" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "Перешкоджати прослуховуванню цих інтерфейсів." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "Не надавати службу DHCPv6 на цьому інтерфейсі." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "Не бере участі" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2318,7 +2614,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "Не надсилати ім'я вузла" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2326,11 +2622,11 @@ msgstr "" "Не відправляти жодних RA повідомлень на цьому інтерфейсі." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Справді видалити \"%s\"?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Справді видалити такий SSH ключ?" @@ -2338,27 +2634,29 @@ msgstr "Справді видалити такий SSH ключ?" msgid "Do you really want to erase all settings?" msgstr "Справді стерти всі налаштування?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Справді рекурсивно видалити каталог \"%s\"?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:100 msgid "Do you want to replace the current keys?" -msgstr "" +msgstr "Бажаєте замінити поточні ключі?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "Домен" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Потрібен домен" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "\"Білий список\" доменів" @@ -2384,15 +2682,17 @@ msgstr "Завантажити резервну копію" msgid "Download mtdblock" msgstr "Завантажити mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "Низхідний зсув SNR" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." msgstr "" +"Перетягніть або вставте нижче дійсний файл *.conf, щоб налаштувати " +"локальний інтерфейс WireGuard." #: modules/luci-base/htdocs/luci-static/resources/form.js:2698 msgid "Drag to reorder" @@ -2402,16 +2702,54 @@ msgstr "Перетягніть, щоб змінити порядок" msgid "Drop Duplicate Frames" msgstr "Видалити повторювані кадри" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "Відкинути пакет" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "Відкидати невідповідні пакети" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Реалізація Dropbear" @@ -2429,21 +2767,21 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Динамічний DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "Клієнт розширеної динамічної авторизації." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "Порт розширеної динамічної авторизації." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 #, fuzzy msgid "Dynamic Authorization Extension secret." msgstr "Секрет розширеної динамічної авторизації." @@ -2452,7 +2790,7 @@ msgstr "Секрет розширеної динамічної авториза msgid "Dynamic tunnel" msgstr "Динамічний тунель" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." @@ -2460,21 +2798,33 @@ msgstr "" "Динамічне виділення DHCP-адрес для клієнтів. Якщо вимкнути, будуть " "обслуговуватися тільки клієнти, які мають статичні оренди." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "Довжина EA-бітів" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "Метод EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "Редагувати" @@ -2482,6 +2832,10 @@ msgstr "Редагувати" msgid "Edit peer" msgstr "Редагування вузла" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " @@ -2490,11 +2844,11 @@ msgstr "" "Щоб виправити якусь помилку, відредагуйте вихідні дані конфігурації вище і " "натисніть \"Зберегти\", щоб перезавантажити сторінку." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Редагувати цю мережу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Редагування бездротової мережі" @@ -2503,46 +2857,36 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "Ефективний MTU маршрута" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "Відображення виходу QoS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" -msgstr "" +msgstr "Ідентифікатор висхідного пристрою" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "Ім'я висхідного пристрою" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "Вихід позначено" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "Вихід непозначено" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Надзвичайна ситуація" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "Увімкнути" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" "Увімкнути / вимкнути вузол. Перезапустіть інтерфейс WireGuard для " "застосування змін." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2550,11 +2894,11 @@ msgstr "" "Увімкнути відстеження IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Увімкнути STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "Увімкнути SLAAC" @@ -2572,10 +2916,11 @@ msgstr "Увімкнути динамічне перемішування пот msgid "Enable HE.net dynamic endpoint update" msgstr "Увімкнути динамічне оновлення кінцевого вузла HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "Увімкнути IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Увімкнути узгодження IPv6" @@ -2589,11 +2934,15 @@ msgstr "Увімкнути узгодження IPv6" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Увімкнути узгодження IPv6 для PPP-з'єднань" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Пропускати Jumbo-фрейми" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "Увімкнути вивчення MAC-адрес" @@ -2605,11 +2954,11 @@ msgstr "Увімкнути клієнта NTP" msgid "Enable Single DES" msgstr "Увімкнути Single DES" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Увімкнути TFTP-сервер" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "Увімкнути фільтрування VLAN" @@ -2617,7 +2966,7 @@ msgstr "Увімкнути фільтрування VLAN" msgid "Enable VLAN functionality" msgstr "Увімкнути підтримку VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Увімкнути кнопку WPS, потребує WPA(2)-PSK/WPA3-SAE" @@ -2631,12 +2980,12 @@ msgstr "" "Protocol\">HTTP запитів до HTTPS порту." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "Увімкнути делегування префіксів IPv6, доступних на цьому інтерфейсі" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Увімкнути протидію
    перевстановленню ключів (KRACK)" @@ -2652,26 +3001,26 @@ msgstr "Увімкнути віддзеркалення вхідних паке msgid "Enable mirroring of outgoing packets" msgstr "Увімкнути віддзеркалення вихідних пакетів" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "Увімкнути швидкий вихід із багатоадресного режиму" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "Увімкнути багатоадресний запитувач" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "Увімкнути підтримку багатоадресних трансляцій" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" "Увімкнути керування пакетами для всіх ЦП. Може покращити або погіршити " "швидкість мережі." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "Увімкнути нерозбірливий (promiscuous) режим" @@ -2693,11 +3042,11 @@ msgstr "Увімкнути підтримку багатоадресного т msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "Увімкнути прапорець DF (Don't Fragment) для інкапсульованих пакетів." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "Увімкнути вбудований одноекземплярний TFTP-сервер." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Увімкнути цю мережу" @@ -2706,21 +3055,24 @@ msgstr "Увімкнути цю мережу" msgid "Enable tx checksum" msgstr "Увімкнути контрольну суму передавання" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "Увімкнути одноадресне затоплення (flooding)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "Увімкнено" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Вмикає відстеження IGMP на цьому мосту" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" @@ -2728,7 +3080,13 @@ msgstr "" "Вмикає швидкий роумінг між точками доступу, що належать до одного і того ж " "домену мобільності" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "" "Вмикає STP на цьому мосту" @@ -2737,48 +3095,53 @@ msgstr "" msgid "Encapsulation limit" msgstr "Межа інкапсуляції" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Режим інкапсуляції" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Шифрування" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Кінцева точка" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "Кінцевий вузол" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "Порт кінцевого вузла" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:325 msgid "Endpoint setting is invalid" -msgstr "" +msgstr "Налаштування кінцевої точки недійсне" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "Примусово IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "Примусово IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "Примусово IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "Примусово MLD версії 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "Примусово MLD версії 2" @@ -2807,10 +3170,6 @@ msgstr "Помилка" msgid "Error getting PublicKey" msgstr "Помилка отримання публічного ключа" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "Секунд з помилками (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2829,11 +3188,17 @@ msgstr "Кожні 30 секунд (slow, 0)" msgid "Every second (fast, 1)" msgstr "Щосекунди (fast, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "Виключити інтерфейси" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2841,27 +3206,35 @@ msgstr "" "Дозволити висхідні відповіді від клієнта на сервер у діапазоні " "127.0.0.0/8 та ::1, до прикладу, для RBL-послуг" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "Існуючий пристрій" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Розширення вузлів" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Очікується шістнадцятковий натяк призначення" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "Очікується дійсна IPv4-адреса" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "Очікується дійсна IPv6-адреса" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "Очікується два значення пріоритету, розділені двокрапкою" @@ -2870,11 +3243,11 @@ msgstr "Очікується два значення пріоритету, ро #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "Очікується: %s" @@ -2886,7 +3259,7 @@ msgstr "Очікується: непорожнє значення" msgid "Expires" msgstr "Збігає за" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "Термін оренди адрес, мінімум 2 хвилини (2m)." @@ -2895,11 +3268,11 @@ msgstr "Термін оренди адрес, мінімум 2 хвилини (< msgid "External" msgstr "Зовнішнє" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Зовнішній список власників ключів R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Зовнішній список власників ключів R1" @@ -2927,35 +3300,63 @@ msgstr "Додаткові параметри pppd" msgid "Extra sstpc options" msgstr "Додаткові параметри sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT через DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT через повітря" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "Протокол FT" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "Не вдалося змінити системний пароль." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Не вдалося налаштувати модем" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "Не вдалося підтвердити застосування на протязі %d с, очікуємо відкату…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Не вдалося підключитися" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Не вдалося від’єднатися" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Не вдалося виконати дію \"/etc/init.d/%s %s\": %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Не вдалося отримати інформацію про модем" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Не вдалося ініціалізувати модем" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Не вдалося встановити режим роботи" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "Файл" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2964,28 +3365,28 @@ msgstr "" "server=1.2.3.4 для домен-орієнтованих або повних висхідних " "DNS-серверів." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Файл недоступний" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "Файл, де зберігаються видані DHCP-оренди" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "" "Локальний DNS-файл" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "Ім'я файлу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "І'мя завантажувального образу, що оголошується клієнтам" @@ -2994,14 +3395,22 @@ msgstr "І'мя завантажувального образу, що оголо msgid "Filesystem" msgstr "Файлова система" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Фільтрувати приватні" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Фільтрувати непридатні" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "Фільтрування для всіх ведених, без перевірки" @@ -3014,8 +3423,13 @@ msgstr "Фільтрування для всіх ведених, перевір msgid "Filtering for all slaves, validation only for backup slaves" msgstr "Фільтрування для всіх ведених, перевірка тільки для резервних ведених" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Завершення не вдалося" @@ -3027,7 +3441,7 @@ msgstr "" "Знайти всі файлові системи та свопи, які наразі приєднано і замінити " "конфігурацію типовою на підставі того, що було виявлено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Знайти мережу й приєднатися" @@ -3041,10 +3455,11 @@ msgid "Firewall" msgstr "Брандмауер" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Позначка брандмауера" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Налаштування брандмауера" @@ -3052,19 +3467,19 @@ msgstr "Налаштування брандмауера" msgid "Firewall Status" msgstr "Стан брандмауера" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "Позначка мережевого екрана" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" -msgstr "Файл мікропрограми" +msgstr "Файл прошивки" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "Версія прошивки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "Фіксований порт для вихідних DNS-запитів" @@ -3079,7 +3494,7 @@ msgstr "Прошити образ?" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:439 msgid "Flash new firmware image" -msgstr "Прошити новий образ мікропрограми" +msgstr "Прошити новий образ прошивки" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:384 msgid "Flash operations" @@ -3090,40 +3505,48 @@ msgstr "Операції прошивання" msgid "Flashing…" msgstr "Прошиваємо…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Примусово" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Примусово режим '40MHz'" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Примусово CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "Примусово DHCP у цій мережі, навіть якщо виявлено інший сервер." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "Примусова версія IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "Примусова версія MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Примусово TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Примусово TKIP та CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Примусове з'єднання" @@ -3135,11 +3558,11 @@ msgstr "Примусове оновлення" msgid "Force use of NAT-T" msgstr "Примусово використовувати NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Неузгодженість маркера форми" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA повідомлення між " "призначеним майстер-інтерфейсом та downstream інтерфейсами." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3165,7 +3588,7 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "Переспрямовувати DHCP-трафік" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." @@ -3173,32 +3596,36 @@ msgstr "" "Пересилати повідомлення DHCPv6 між призначеним майстер-інтерфейсом та " "downstream інтерфейсами." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "Секунди прямого коригування помилок (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Переспрямовувати широкомовний трафік" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "Затримка перенаправлення" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Переспрямовувати одноранговий трафік" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" "Пересилати мультикаст пакети у вигляді юнікаст пакетів на цьому пристрої." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Режим переспрямовування" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Фрагментація" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Поріг фрагментації" @@ -3222,7 +3649,7 @@ msgid "GHz" msgstr "Ггц" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Тільки GPRS" @@ -3242,12 +3669,16 @@ msgstr "Тунель GRETAP через IPv4" msgid "GRETAP tunnel over IPv6" msgstr "Тунель GRETAP через IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "Шлюз" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Режим шлюзу" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "Порти шлюзу" @@ -3257,23 +3688,23 @@ msgstr "Порти шлюзу" msgid "Gateway address is invalid" msgstr "Неприпустима адреса шлюзу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "Загальні налаштування" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Загальні налаштування" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "Загальні параметри пристрою" @@ -3281,7 +3712,7 @@ msgstr "Загальні параметри пристрою" msgid "Generate Config" msgstr "Cтворити конфігурацію" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Згенерувати PMK локально" @@ -3289,11 +3720,11 @@ msgstr "Згенерувати PMK локально" msgid "Generate archive" msgstr "Cтворити архів" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "" @@ -3301,15 +3732,15 @@ msgstr "" msgid "Generate new key pair" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "" @@ -3321,39 +3752,40 @@ msgstr "Оскільки пароль і підтвердження не спі msgid "Global Settings" msgstr "Загальні параметри" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Глобальні параметри мережі" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "Перейти до оновлення прошивки..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Перейти до конфігурування пароля..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "Перейти до відповідної сторінки конфігурування" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "Надати доступ до конфігурування DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "Надання доступу до відображення стану DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "Надати доступ до відображення статусу DSL" @@ -3365,6 +3797,10 @@ msgstr "Надати доступ до процедур LuCI OpenConnect" msgid "Grant access to LuCI Wireguard procedures" msgstr "Надати доступ до процедур LuCI Wireguard" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Надати доступ до процедур LuCI openfortivpn" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "Надати доступ до конфігурування SSH" @@ -3401,7 +3837,7 @@ msgstr "Надати доступ до конфігурування монтув msgid "Grant access to network configuration" msgstr "Надати доступ до конфігурування мережі" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "Надати доступ до інструментів діагностування мережі" @@ -3409,6 +3845,10 @@ msgstr "Надати доступ до інструментів діагност msgid "Grant access to network status information" msgstr "Надати доступ до інформації про стан мережі" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "Надати доступ до статусу процесу" @@ -3441,7 +3881,7 @@ msgstr "Дозволити налаштування uHTTPd" msgid "Grant access to wireless channel status" msgstr "Надати доступ до стану бездротового каналу" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "Надати доступ до відображення статусу бездротових мереж" @@ -3470,17 +3910,11 @@ msgstr "Доступ по HTTP(S)" msgid "Hang Up" msgstr "Призупинити" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "" -"Помилки коду помилок заголовка (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "Інтервал пульсації (ядро: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Інтервал привітання" @@ -3492,7 +3926,7 @@ msgstr "" "Тут ви можете налаштувати основні параметри вигляду вашого пристрою, такі як " "назва (ім'я) вузла або часовий пояс." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "" "Приховати %h
    (%h), Priority: %d" msgstr "Хук: %h (%h), пріоритет: %d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3523,7 +3965,7 @@ msgstr "Вузол" msgid "Host expiry timeout" msgstr "Тайм-аут вузла" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "Хост запитує цей файл з сервера завантаження." @@ -3531,10 +3973,16 @@ msgstr "Хост запитує цей файл з сервера заванта msgid "Host-Uniq tag content" msgstr "Зміст тегу Host-Uniq" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3544,11 +3992,11 @@ msgstr "Ім'я хоста" msgid "Hostname to send when requesting DHCP" msgstr "Ім'я вузла для надсилання при запиті DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Імена вузлів" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3578,12 +4026,12 @@ msgstr "Гібрид" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:49 msgctxt "nft icmp code" msgid "ICMP code" -msgstr "" +msgstr "Код ICMP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:50 msgctxt "nft icmp type" msgid "ICMP type" -msgstr "" +msgstr "Тип ICMP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:51 msgctxt "nft icmpv6 code" @@ -3608,23 +4056,27 @@ msgstr "Динамічне агрегування посилань IEEE 802.3ad msgid "IKE DH Group" msgstr "Група IKE DH" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IP-адреси" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "IP-протокол" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "Списки IP" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "Тип IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3640,32 +4092,35 @@ msgstr "Неприпустима IP-адреса" msgid "IP address is missing" msgstr "Відсутня IP-адреса" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " "packets with matching destination IP." msgstr "" +"IP-адреси, дозволені всередині тунелю. Вузол прийматиме тунельовані пакети з " +"IP-адресами джерела, які відповідають цьому списку, і направлятиме назад " +"пакети з відповідними IP-адресами призначення." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 msgctxt "nft ip protocol" msgid "IP protocol" msgstr "IP-протокол" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "IP-протокол" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "Список IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "Списки IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Відкидати підробки NX-домену" @@ -3673,14 +4128,15 @@ msgstr "Відкидати підробки NX-домену" msgid "IPsec XFRM" msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3696,7 +4152,7 @@ msgstr "Сусіди IPv4" msgid "IPv4 Routing" msgstr "IPv4 маршрутизація" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "Правила IPv4" @@ -3706,7 +4162,7 @@ msgstr "З'єднання IPv4 (upstream)" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3733,7 +4189,7 @@ msgstr "Маска мережі IPv4" msgid "IPv4 network in address/netmask notation" msgstr "Мережа IPv4 у позначенні адреси / мережевої маски" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "Лише IPv4" @@ -3746,11 +4202,11 @@ msgstr "Префікс IPv4" msgid "IPv4 prefix length" msgstr "Довжина префікса IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "Таблиця IPv4 трафіка «%h»" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3759,16 +4215,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4 у IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (обидва - типово для IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "Таблиця IPv4/IPv6 трафіка \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3779,7 +4239,8 @@ msgstr "Таблиця IPv4/IPv6 трафіка \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3787,7 +4248,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Брандмауер IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "IPv6 MTU" @@ -3795,7 +4256,11 @@ msgstr "IPv6 MTU" msgid "IPv6 Neighbours" msgstr "Сусіди IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "Налаштування IPv6 RA" @@ -3803,15 +4268,15 @@ msgstr "Налаштування IPv6 RA" msgid "IPv6 Routing" msgstr "IPv6 маршрутизація" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "Правила IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "Налаштування IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "" "ULA-" @@ -3827,12 +4292,12 @@ msgstr "З'єднання IPv6 (upstream)" msgid "IPv6 address" msgstr "Адреса IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "Натяк призначення IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "Довжина призначення IPv6" @@ -3844,11 +4309,11 @@ msgstr "Шлюз IPv6" msgid "IPv6 network in address/netmask notation" msgstr "Мережа IPv6 у позначенні адреси / мережевої маски" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "Лише IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 #, fuzzy msgid "IPv6 preference" msgstr "IPv6 привілеї" @@ -3858,7 +4323,7 @@ msgstr "IPv6 привілеї" msgid "IPv6 prefix" msgstr "Префікс IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "Фільтр IPv6 префікса" @@ -3872,24 +4337,20 @@ msgstr "Довжина префікса IPv6" msgid "IPv6 routed prefix" msgstr "Надісланий префікс IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 #, fuzzy msgid "IPv6 source routing" msgstr "Явна маршрутизація IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "Суфікс IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "IPv6-суфікс (hex)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "Підтримка IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "Таблиця IPv4/IPv6 трафіка «%h»" @@ -3897,6 +4358,10 @@ msgstr "Таблиця IPv4/IPv6 трафіка «%h»" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3912,10 +4377,16 @@ msgstr "IPv6 через IPv4 (6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6 через IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Ідентифікація EAP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Якщо позначено, 1DES увімкнено" @@ -3928,7 +4399,7 @@ msgstr "Якщо позначено, до опцій pppd додається \"+ msgid "If checked, encryption is disabled" msgstr "Якщо позначено, шифрування вимкнено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." @@ -3936,7 +4407,7 @@ msgstr "" "Якщо встановлено, downstream підмережі виділяються лише з заданих класів " "префікса IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "Якщо встановлено, значення параметрів відповідності інвертуються" @@ -3957,21 +4428,26 @@ msgstr "" "Якщо обрано, монтувати пристрій за міткою його розділу замість фіксованого " "вузла пристрою" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" +"Якщо IP-адреса, яка використовується для доступу до LuCI, змінюється, " +"потрібно ручне повторне підключення до нової IP протягом %d " +"секунд для підтвердження налаштувань, інакше зміни буде скасовано." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "Якщо не позначено, типовий маршрут не налаштовано" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "Якщо не позначено, оголошувані адреси DNS-серверів ігноруються" @@ -3991,15 +4467,23 @@ msgstr "" "своп-пристрої не можуть бути доступні з такою високою швидкістю, як RAM." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Ігнорувати /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Ігнорувати интерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Ігнорувати файли resolv" @@ -4011,37 +4495,51 @@ msgstr "Образ" msgid "Image check failed:" msgstr "Помилка перевірки образу:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" -msgstr "" +msgstr "Імпортувати як вузол" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" -msgstr "" +msgstr "Імпорт конфігурації" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" -msgstr "" +msgstr "Імпортувати конфігурацію як вузол…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" -msgstr "" +msgstr "Імпорт налаштувань" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" -msgstr "" +msgstr "Імпортована конфігурація вузла" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 msgid "Imports settings from an existing WireGuard configuration file" -msgstr "" +msgstr "Імпортує налаштування з наявного файлу конфігурації WireGuard" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:68 msgid "In" msgstr "Вх." -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -4050,7 +4548,7 @@ msgstr "" "заблоковано. Натисніть «Продовжити» нижче, щоб повернутися до попередньої " "сторінки." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "В секундах" @@ -4082,7 +4580,7 @@ msgstr "" msgid "Incoming checksum" msgstr "Вхідна контрольна сума" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "Вхідний інтерфейс" @@ -4090,6 +4588,7 @@ msgstr "Вхідний інтерфейс" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "Вхідний ключ" @@ -4108,23 +4607,22 @@ msgstr "Інформація" msgid "Information" msgstr "Інформація" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 #, fuzzy msgid "Ingress QoS mapping" msgstr "Відображення входу QoS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "Ідентифікатор вхідного пристрою" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "Іменем вхідного пристрою" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Помилка ініціалізації" @@ -4136,31 +4634,43 @@ msgstr "Скрипт ініціалізації" msgid "Initscripts" msgstr "Скрипти ініціалізації" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "Внутрішнє обмеження сертифіката (Домен)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "Внутрішнє обмеження сертифіката (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "Внутрішнє обмеження сертифіката (Суб'єкт)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "Внутрішнє обмеження сертифіката (Шаблон)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Інсталяція розширень протоколу..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "Екземпляр" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +#, fuzzy +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Екземпляр" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +#, fuzzy +msgid "Instance Details" +msgstr "Екземпляр" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4172,6 +4682,10 @@ msgstr "" msgid "Insufficient permissions to read UCI configuration." msgstr "Бракує дозволів для читання конфігурації UCI." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4179,7 +4693,7 @@ msgstr "Бракує дозволів для читання конфігурац msgid "Interface" msgstr "Інтерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "Інтерфейс \"%h\" наразі позначений як призначений майстер." @@ -4187,7 +4701,7 @@ msgstr "Інтерфейс \"%h\" наразі позначений як при msgid "Interface %q device auto-migrated from %q to %q." msgstr "Пристрій інтерфейсу %q автоматичного мігрував із %q на %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Конфігурація інтерфейсу" @@ -4218,11 +4732,11 @@ msgstr "Перепідключення інтерфейсу…" msgid "Interface is shutting down..." msgstr "Інтерфейс завершує роботу…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Інтерфейс запускається…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Інтерфейс зупиняється…" @@ -4231,12 +4745,12 @@ msgid "Interface name" msgstr "Назва інтерфейсу" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "Інтерфейс відсутній або його ще не підключено." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Інтерфейси" @@ -4245,15 +4759,19 @@ msgstr "Інтерфейси" msgid "Internal" msgstr "Внутрішній" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Внутрішня помилка сервера" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "Інтервал відсилання навчальних (learning) пакетів" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4264,7 +4782,7 @@ msgstr "" "підмережі; більші значення призводять до того, що IGMP-запити надсилаються " "рідше" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "Інтервал в секундах для STP пакетів «Hello»" @@ -4274,8 +4792,9 @@ msgid "Invalid" msgstr "Неприпустимо" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "Надано недійсний APN" @@ -4285,6 +4804,10 @@ msgstr "Надано недійсний APN" msgid "Invalid Base64 key string" msgstr "Неприпустимий рядок ключа Base64" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4314,7 +4837,7 @@ msgstr "" msgid "Invalid argument" msgstr "Неприпустимий аргумент" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4330,15 +4853,36 @@ msgstr "Неприпустима команда" msgid "Invalid hexadecimal value" msgstr "Неприпустиме шістнадцяткове значення" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "Неприпустиме ім'я користувача та/або пароль! Спробуйте ще раз." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "Інвертувати збіг" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Ізолювати клієнтів" @@ -4351,25 +4895,25 @@ msgstr "" "Схоже, що ви намагаєтеся прошити образ, який не вміщається до флеш-пам'яті! " "Перевірте файл образу!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "Потрібен JavaScript!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Підключитися до мережі" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Підключення до мережі: Сканування бездротових мереж" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Приєднання до мережі: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "Перейти до правила" @@ -4377,24 +4921,28 @@ msgstr "Перейти до правила" msgid "Keep settings and retain the current configuration" msgstr "Зберегти налаштування та поточну конфігурацію" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Журнал ядра" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "Версія ядра" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "Ключ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Ключ #%d" @@ -4402,6 +4950,7 @@ msgstr "Ключ #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "Ключ для вхідних пакетів (необов’язково)." @@ -4409,14 +4958,19 @@ msgstr "Ключ для вхідних пакетів (необов’язков #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "Ключ для вихідних пакетів (необов’язково)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4461,7 +5015,7 @@ msgstr "Інтервал ехо-запитів LCP" msgid "LED Configuration" msgstr "Конфігурація LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4478,32 +5032,39 @@ msgstr "Мова" msgid "Language and Style" msgstr "Мова та стиль" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "Інтервал останнього членства" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Затримка" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Останнє рукостискання" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "Лист" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "Вивчення" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "Вивчати маршрути" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Файл оренд" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Час оренди" @@ -4527,7 +5088,7 @@ msgstr "Залиште поле порожнім для автовизначен msgid "Leave empty to use the current WAN address" msgstr "Залиште порожнім, щоб використовувати поточну адресу WAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4538,31 +5099,27 @@ msgstr "" "ефективність ефірного часу може значно зменшитися. Рекомендується не " "дозволяти швидкості 802.11b, де це можливо." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "Легенда:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "Межа" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "Затухання лінії" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "Режим лінії" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "Стан лінії" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "Час безперервної роботи лінії" @@ -4583,16 +5140,20 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "Список доменів, які підтримують результати підробки NX-доменів" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." -msgstr "Список IP-наборів для заповнення вказаними IP-адресами доменів." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." +msgstr "" +"Перелік IPsetів для заповнення IP-адресами результатів DNS-пошуку FQDN, які " +"також вказані тут." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4608,7 +5169,7 @@ msgstr "" "ключа R0\">R0KH
    , як станції, що була використана під час початкової " "асоціації домену мобільності." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4630,25 +5191,22 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "Список файлів SSH-ключів для авторизації" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "Список доменів, для яких дозволено RFC1918-відповіді" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "Список доменів для примусового перетворення у IP-адреси." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "" "Список DNS-серверів для " "переспрямовування запитів" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" -msgstr "Порти прослуховування" +msgstr "Порт для прослуховування" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Інтерфейси прослуховування" @@ -4658,7 +5216,7 @@ msgstr "" "Прослуховувати тільки на цьому інтерфейсі, якщо невизначено – на " "всіх" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4669,7 +5227,7 @@ msgstr "" msgid "ListenPort setting is invalid" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "Порт прослуховування для вхідних DNS-запитів." @@ -4678,7 +5236,7 @@ msgstr "Порт прослуховування для вхідних DNS-зап msgid "Load" msgstr "Навантаження" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Середнє навантаження" @@ -4686,27 +5244,28 @@ msgstr "Середнє навантаження" msgid "Load configuration…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "Завантаження даних…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "Завантаження вмісту каталогу…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "Завантаження подання…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "Локальний" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "Локальна IP-адреса" @@ -4726,11 +5285,12 @@ msgstr "Локальна IP-адреса для призначення" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Локальна адреса IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "Локальний IPv6 DNS-сервер" @@ -4746,46 +5306,72 @@ msgstr "Локальна адреса IPv6" msgid "Local Startup" msgstr "Локальний запуск" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Місцевий час" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "Локальний ULA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Локальний домен" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "" "Суфікс локального домену додається до DHCP-імен вузлів та записів з файлу " "hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "Локальний сервер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Тільки локальна служба" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Локалізувати запити" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "Зблокувати з BSSID" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Увійти" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "До входу…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Вийти" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Рівень виведення інформаціі до журналу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Журнал запитів" @@ -4811,39 +5397,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "Логічна мережа, до якої буде додано тунель (міст) (необов'язково)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Увійти" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Вийти" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "Слабка фільтрація" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "" -"Втрата сигналу в секундах (LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "Найнижча орендована адреса." +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC-адреса" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Фільтр MAC-адрес" @@ -4851,16 +5426,15 @@ msgstr "Фільтр MAC-адрес" msgid "MAC Address For The Actor" msgstr "MAC-адреса для актора" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4869,11 +5443,15 @@ msgstr "MAC VLAN" msgid "MAC address" msgstr "MAC-адреса" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC-фільтр" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "MAC-список" @@ -4887,6 +5465,10 @@ msgstr "MAP / LW4over6" msgid "MAP rule is invalid" msgstr "Неприпустиме правило MAP" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4908,15 +5490,19 @@ msgstr "MII / ioctl-виклики ETHTOOL" msgid "MII Interval" msgstr "Інтервал MII" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4926,7 +5512,7 @@ msgstr "" "команди:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4935,73 +5521,77 @@ msgstr "" msgid "Manual" msgstr "Вручну" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 #, fuzzy msgid "Master" msgstr "Керований" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "" "Максимальний інтервал RA " "повідомлень" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Макс. досяжна швидкість передачі даних (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Макс. оренд DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "Макс. розмір пакета EDNS0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Макс. одночасних запитів" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "Максимальний вік" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Максимальний дозволений інтервал прослуховування" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "Максимально допустима кількість активних оренд DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "Максимально допустима кількість одночасних DNS-запитів" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "Максимально допустимий розмір UDP-пакетів EDNS.0" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Максимальний час очікування готовності модему (секунд)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "Максимальна кількість орендованих адрес." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "Максимальний розмір таблиці стеження" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -5010,10 +5600,14 @@ msgstr "" "title=\"Router Advertisement, ICMPv6 Type 134\">RA. За промовчанням - " "600 секунд." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Максимальна потужність" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -5040,7 +5634,7 @@ msgstr "Пам'ять" msgid "Memory usage (%)" msgstr "Використання пам'яті, %" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -5048,10 +5642,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "Mesh ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Mesh Id" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "Метод не знайдено" @@ -5064,7 +5666,7 @@ msgstr "Метод моніторингу з'єднань" msgid "Method to determine link status" msgstr "Метод визначення стану з'єднань" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -5075,13 +5677,13 @@ msgctxt "nft unit" msgid "MiB" msgstr "МіБ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" "Мінімальний інтервал RA " "повідомлень" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "Мінімальний час дії ARP" @@ -5089,7 +5691,7 @@ msgstr "Мінімальний час дії ARP" msgid "Minimum Number of Links" msgstr "Мінімальна кількість з'єднань" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." @@ -5097,7 +5699,7 @@ msgstr "" "Мінімальний необхідний час в секундах перш ніж запис ARP може замінитися. " "Запобігає атаці ARP-кешу." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -5114,35 +5716,49 @@ msgstr "Дзеркало порту диспетчера" msgid "Mirror source port" msgstr "Дзеркало вихідного порту" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "Мобільні дані" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Домен мобільності" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Режим" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "Модель" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "Триває злам носія модема." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." @@ -5150,43 +5766,36 @@ msgstr "" "Модем з'єднується. Зачекайте, будь-ласка. Цей процес завершиться за тайм-" "аутом через 2 хвилини." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Типові налаштування модема" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Модем" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "Триває відключення модему. Будь ласка, зачекайте." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Помилка запиту інформації про модем" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Тайм-аут ініціалізації модему" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "Модем вимкнено." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "Менеджер модему" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Диспетчер" @@ -5256,6 +5865,10 @@ msgstr "Вниз" msgid "Move up" msgstr "Вгору" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5263,19 +5876,23 @@ msgstr "Вгору" msgid "Multicast" msgstr "Мультикаст" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "Багатоадресна (multicast) маршрутизація" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "Мультикаст в юнікаст" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "Ідентифікатор NAS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "Ланцюг дій NAT \"%h\"" @@ -5287,12 +5904,16 @@ msgstr "Режим NAT-T" msgid "NAT64 Prefix" msgstr "Префікс NAT64" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "Ведений NDP-Proxy" @@ -5305,18 +5926,23 @@ msgid "NTP server candidates" msgstr "Сервери NTP – кандидати для синхронізації" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Назва" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "Назва нової мережі" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Навігація" @@ -5325,13 +5951,17 @@ msgstr "Навігація" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "Дійсність кешу сусідів" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5340,32 +5970,36 @@ msgstr "Дійсність кешу сусідів" msgid "Network" msgstr "Мережа" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "Мережевий SSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Мережеві утиліти" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "Мережева адреса" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Образ для мережевого завантаження" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "Міграція конфігурації мережевого мосту" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "Мережевий пристрій" @@ -5378,7 +6012,7 @@ msgstr "Активність мережевого пристрою (ядро: ne msgid "Network device is not present" msgstr "Мережевий пристрій відсутній" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "Таблиця мережевого пристрою \"%h\"" @@ -5387,7 +6021,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "Міграція конфігурації мережевих інтерфейсів" @@ -5396,15 +6030,21 @@ msgstr "Міграція конфігурації мережевих інтер msgid "Network interface" msgstr "Мережевий інтерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "Network-ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "Ніколи" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Ніколи" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." @@ -5413,11 +6053,11 @@ msgstr "" "не пересилаються і вирізняються тільки з файлу DHCP (/etc/config/dhcp) або " "файлу hosts (/etc/hosts)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "Створити новий інтерфейс для \"%s\" неможливо: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "Нова назва інтерфейсу…" @@ -5425,13 +6065,13 @@ msgstr "Нова назва інтерфейсу…" msgid "Next »" msgstr "Наступний »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Немає" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Немає DHCP-сервера, налаштованого для цього інтерфейсу" @@ -5439,7 +6079,7 @@ msgstr "Немає DHCP-сервера, налаштованого для цьо msgid "No Data" msgstr "Немає даних" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Без шифрування" @@ -5455,9 +6095,17 @@ msgstr "Немає NAT-T" msgid "No RX signal" msgstr "Сигналу RX немає" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Інтерфейси WireGuard не налаштовано." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5470,7 +6118,11 @@ msgstr "" msgid "No client associated" msgstr "Не пов’язано жодного клієнта" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "Немає даних" @@ -5479,8 +6131,8 @@ msgstr "Немає даних" msgid "No data received" msgstr "Жодних даних не отримано" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 #, fuzzy msgid "No enforcement" msgstr "Без примусовості" @@ -5494,15 +6146,11 @@ msgstr "Без примусовості" msgid "No entries available" msgstr "Немає доступних записів" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "У цьому каталозі немає записів" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Файли не знайдено" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5516,7 +6164,7 @@ msgstr "" msgid "No host route" msgstr "Відсутній хост-маршрут" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5537,30 +6185,40 @@ msgstr "Більше немає доступних ведених" msgid "No more slaves available, can not save interface" msgstr "Більше немає доступних ведених, не вдається зберегти інтерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Ніяких негативних кешувань" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Пароль не встановлено!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "Не підключено" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "Відкритих ключів поки що немає." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "Немає правил у цьому ланцюжку" @@ -5574,7 +6232,8 @@ msgid "No validation or filtering" msgstr "Немає перевірки або фільтрування" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "Зону не призначено" @@ -5586,37 +6245,40 @@ msgstr "Зону не призначено" msgid "Noise" msgstr "Шум" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Співвідношення сигнал/шум" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Шум:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Не запобіжні помилки CRC (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "Без шаблону заміни" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "Жоден" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Нормальна" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Не знайдено" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "Не пов'язано" @@ -5629,7 +6291,7 @@ msgstr "Не підключено" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Не існує" @@ -5641,7 +6303,7 @@ msgstr "Не запущено під час завантаження" msgid "Not supported" msgstr "Не підтримується" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" @@ -5649,6 +6311,12 @@ msgstr "" "Примітка: Деякі драйвери безпроводової мережі не повністю підтримують " "802.11w. Наприклад, mwlwifi може мати проблеми" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "Замітки" @@ -5657,7 +6325,7 @@ msgstr "Замітки" msgid "Notice" msgstr "Зауваження" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "DNS-запит" @@ -5665,7 +6333,7 @@ msgstr "DNS-запит" msgid "Number of IGMP membership reports" msgstr "Кількість звітів про членство в IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "Кількість кешованих записів DNS (макс. – 10000, 0 – без кешування)" @@ -5682,7 +6350,7 @@ msgid "Obfuscated Password" msgstr "Заплутаний пароль" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5693,6 +6361,7 @@ msgid "Obtain IPv6 address" msgstr "Отримати IPv6-адресу" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "Вимк." @@ -5701,6 +6370,12 @@ msgstr "Вимк." msgid "Off-State Delay" msgstr "Затримка Off-State" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "Увімк." @@ -5709,15 +6384,15 @@ msgstr "Увімк." msgid "On-State Delay" msgstr "Затримка On-State" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "Маршрут On-Link" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "Має бути зазначено одне з двох – ім'я вузла або МАС-адреса!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Одне з нижченаведеного: %s" @@ -5735,7 +6410,11 @@ msgstr "Одне або декілька неприпустимих/обов'я msgid "One or more required fields have no value!" msgstr "Одне або декілька обов'язкових полів не мають значень!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" "Якщо увімкнено, дозволяти зв'язок лише з неізольованими мостовими портами" @@ -5747,25 +6426,24 @@ msgstr "" "Тільки якщо поточний активний ведений виходить з ладу і первинний ведений " "працює (failure, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Відкрити список..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP проксіювання." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5783,7 +6461,7 @@ msgstr "" "Працювати в режимі режимі реле якщо майстер-інтерфейс налаштований " "та активний, інакше переключиться в режим сервера." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." @@ -5791,12 +6469,24 @@ msgstr "" "Працювати в режимі реле за наявності upstream IPv6-префікса, інакше " "вимкнути службу." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Робоча частота" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "Параметр \"%s\" містить неприпустиме значення введення." @@ -5804,22 +6494,31 @@ msgstr "Параметр \"%s\" містить неприпустиме знач msgid "Option \"%s\" must not be empty." msgstr "Параметр \"%s\" не може бути порожнім." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Опцію змінено" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Опцію видалено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "Необов'язково" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "Необов'язкові нотатки у довільній формі щодо цього пристрою" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5828,7 +6527,7 @@ msgstr "" "Необов'язково. 32-бітна позначка для вихідних зашифрованих пакетів. Введіть " "значення в шістнадцятковому форматі, починаючи з 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5840,7 +6539,7 @@ msgstr "" "отримано від сервера делегування, для формування IPv6-адреси інтерфейсу " "(наприклад, 'a:b:c:d::1') використовуйте суфікс ('::1')." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5849,11 +6548,11 @@ msgstr "" "Додавання додатково рівня шифрування із симетричним ключем для пост-" "квантової стійкості." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "Необов'язково. Створити для цього вузла маршрути для дозволених IP." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "Необов'язково. Опис вузла." @@ -5861,13 +6560,13 @@ msgstr "Необов'язково. Опис вузла." msgid "Optional. Do not create host routes to peers." msgstr "Необов'язково. Не створювати хост-маршрути для вузлів." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "Необов'язково. Хост вузла. Імена буде виділено до підняття інтерфейсу." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5887,11 +6586,11 @@ msgstr "" "Необов'язково. MTU тунельного інтерфейсу." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "Необов'язково. Порт вузла." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5899,7 +6598,7 @@ msgid "" "exported." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5918,7 +6617,7 @@ msgstr "" msgid "Options" msgstr "Опції" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" для маршруту за промовчанням. 0.0.0.0 означає «адресу " "системи, на якій працює dnsmasq»." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "Параметри:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "Інше:" @@ -5953,7 +6661,7 @@ msgstr "Вихідна шв.:" msgid "Outgoing checksum" msgstr "Вихідна контрольна сума" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "Висхідний інтерфейс" @@ -5961,6 +6669,7 @@ msgstr "Висхідний інтерфейс" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "Вихідний ключ" @@ -5984,21 +6693,23 @@ msgstr "Вихідна зона" msgid "Overlap" msgstr "Перекриття" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "Перевизначити таблицю маршрутизації IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "Перевизначити таблицю маршрутизації IPv6" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -6006,6 +6717,7 @@ msgstr "Перевизначити таблицю маршрутизації IPv #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "Перевизначити MTU" @@ -6027,7 +6739,7 @@ msgstr "Перевизначити TOS" msgid "Override TTL" msgstr "Перевизначити TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -6041,7 +6753,7 @@ msgstr "Перевизначення типової назви інтерфей msgid "Override the gateway in DHCP responses" msgstr "Перевизначення шлюзу у відповідях DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -6058,7 +6770,7 @@ msgstr "" msgid "Overview" msgstr "Огляд" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "Перезаписати існуючий файл \"%s\"?" @@ -6066,17 +6778,30 @@ msgstr "Перезаписати існуючий файл \"%s\"?" msgid "Overwrite the current settings with the imported configuration?" msgstr "" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Власник" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (обидва)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -6088,8 +6813,9 @@ msgid "PAP/CHAP password" msgstr "Пароль PAP/CHAP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -6100,6 +6826,7 @@ msgstr "Пароль PAP/CHAP" msgid "PAP/CHAP username" msgstr "Ім'я користувача PAP/CHAP" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "Тип PDP" @@ -6109,8 +6836,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "" @@ -6122,7 +6850,7 @@ msgstr "" msgid "PIN code rejected" msgstr "PIN-код відхилено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "Проштовхуваня PMK R1" @@ -6163,28 +6891,37 @@ msgstr "Зсув PSID" msgid "PSID-bits length" msgstr "Довжина PSID у бітах" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM (Режим передачі пакетів)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "Параметри PXE/TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "Керування пакетами" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "Позначка пакета" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "Пакети" @@ -6194,24 +6931,32 @@ msgid "Packets To Transmit Before Moving To Next Slave" msgstr "" "Кількість пакетів для передавання перед переходом до наступного веденого" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Частина зони %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "" "Pass-through (дзеркальне відображення фізичного пристрою у один MAC VLAN)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "Пароль" @@ -6219,11 +6964,11 @@ msgstr "Пароль" msgid "Password authentication" msgstr "Автентифікація за паролем" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "Пароль закритого ключа" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "Пароль внутрішнього закритого ключа" @@ -6234,50 +6979,50 @@ msgstr "Пароль внутрішнього закритого ключа" msgid "Password strength" msgstr "Надійність пароля" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "Пароль2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "Вставте або перетягніть файл SSH-ключа…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "Шлях до сертифіката CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "Шлях до сертифіката клієнта" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "Шлях до закритого ключа" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Шлях до внутрішнього сертифіката CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Шлях до внутрішнього сертифіката клієнта" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Шлях до внутрішнього закритого ключа" @@ -6299,11 +7044,19 @@ msgstr "Призупинено" msgid "Peak:" msgstr "Пік:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Вузол" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Запит IP-адреси призначення" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "MAC-адреса вузла" @@ -6312,11 +7065,11 @@ msgstr "MAC-адреса вузла" msgid "Peer address is missing" msgstr "Відсутня адреса вузла" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "Назва пристрою вузла" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "Вузол вимкнено" @@ -6347,10 +7100,14 @@ msgstr "Виконати відновлення" msgid "Permission denied" msgstr "Дозволу не надано" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Завжди тримати ввімкненим" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "" @@ -6359,13 +7116,13 @@ msgstr "" msgid "Phy Rate:" msgstr "Фізична швидкість:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Фізичні параметри" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ехо-запит" @@ -6378,11 +7135,11 @@ msgstr "Ехо-запит" msgid "Pkts." msgstr "пакетів" -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "Введіть ім'я користувача і пароль." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "Виберіть файл для відвантаження." @@ -6390,56 +7147,75 @@ msgstr "Виберіть файл для відвантаження." msgid "Policy" msgstr "Політика" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "Політика: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "Порт" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Порт %s" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "Ізоляція порту" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Стан порту:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Потенційне заперечення: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Режим керування живленням" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Попереджувати помилки CRC (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Переважно LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Переважно UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Делеговано префікс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "Придушувач префікса" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Заздалегідь установлений спільний ключ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "" @@ -6464,15 +7240,16 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Перешкоджати спілкуванню клієнт-клієнт" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "Первинний ведений" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "Первинний VLAN ID" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6487,29 +7264,31 @@ msgstr "" "Первинний стає активним веденим всякий раз, коли він відновлюється (always, " "0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "Пріоритет" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "Приватний (заборонити зв'язок між MAC VLAN-ами)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "Приватний ключ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "" @@ -6527,8 +7306,8 @@ msgid "Prot." msgstr "Прот." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6540,7 +7319,7 @@ msgstr "Протокол" msgid "Provide NTP server" msgstr "Забезпечувати сервер NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." @@ -6548,7 +7327,7 @@ msgstr "" "Надавати сервер DHCPv6 на цьому інтерфейсі та відповідати на прохання та " "запити DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Укажіть нову мережу" @@ -6558,25 +7337,36 @@ msgid "" "interfaces" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Проксі сервер" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Псевдо Ad-Hoc (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Відкритий ключ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6605,61 +7395,85 @@ msgstr "Стільниковий QMI" msgid "Quality" msgstr "Якість" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" "Запит усіх наявних висхідних DNS-серверів" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "Інтервал запиту" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "Інтервал відповіді на запит" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "Тривалість життя ключа R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "Власник ключа R1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Порт Radius-Accounting" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Секрет Radius-Accounting" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Сервер Radius-Accounting" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Порт Radius-Authentication" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Секрет Radius-Authentication" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Сервер Radius-Authentication" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "Режим RFC3947 NAT-T" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "Поріг RSSI для приєднання" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Поріг RTS/CTS" @@ -6672,10 +7486,16 @@ msgstr "Одержано" msgid "RX Rate" msgstr "Швидкість приймання" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "Швидкість прийм./перед." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 #, fuzzy msgctxt "nft nat flag random" @@ -6688,14 +7508,14 @@ msgstr "" "Необроблені байти в шістнадцятковому кодуванні. Залиште порожнім, якщо ваш " "інтернет-провайдер не вимагає цього." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "" "Читати /etc/ethers для налаштування DHCP-сервера" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Дійсно змінити протокол?" @@ -6703,11 +7523,11 @@ msgstr "Дійсно змінити протокол?" msgid "Realtime Graphs" msgstr "Графіки у реальному часі" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Кінцевий термін реассоціації" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Захист від переприв'язки" @@ -6731,11 +7551,40 @@ msgstr "Перезавантажити операційну систему ва msgid "Receive" msgstr "Приймання" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "Приймання" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "Рекомендовано. IP-адреси інтерфейсу WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Перепідключити цей інтерфейс" @@ -6743,12 +7592,12 @@ msgstr "Перепідключити цей інтерфейс" msgid "Redirect to HTTPS" msgstr "Переспрямовувати на HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "Переспрямовувати на локальний порт %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "Переспрямовувати до локальної системи" @@ -6757,31 +7606,39 @@ msgstr "Переспрямовувати до локальної системи" msgid "References" msgstr "Посилання" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "Поновлюється" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "Відхилити пакет IPv4 з ICMP-типом %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "Відхилити пакет із ICMP-типом %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "Відхилити пакет із ICMPv6-типом %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "Відхилити пакет із TCP-reset" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" @@ -6790,6 +7647,8 @@ msgstr "" "дорівнює вказаному значенню" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Ретранслятор" @@ -6799,6 +7658,10 @@ msgstr "Ретранслятор" msgid "Relay Bridge" msgstr "Міст-ретранслятор" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Міжмережевий ретранслятор" @@ -6808,6 +7671,14 @@ msgstr "Міжмережевий ретранслятор" msgid "Relay bridge" msgstr "Міст-ретранслятор" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6817,6 +7688,7 @@ msgstr "Віддалена адреса IPv4" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Віддалена адреса IPv4 або FQDN" @@ -6829,15 +7701,23 @@ msgstr "Віддалена адреса IPv6" msgid "Remote IPv6 address or FQDN" msgstr "Віддалена адреса IPv6 або FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "Видалити" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "Видалити пов’язані налаштування пристрою з конфігурації" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Замінити конфігурацію бездротової мережі" @@ -6867,7 +7747,8 @@ msgstr "Вимагати вхідної контрольної суми (нео msgid "Require incoming packets serialization (optional)." msgstr "Вимагати серіалізації вхідних пакетів (необов’язково)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Вимагається" @@ -6883,7 +7764,7 @@ msgstr "Вимагається. Base64-кодований закритий кл msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "" @@ -6896,67 +7777,73 @@ msgid "Required. XFRM interface ID to be used for SA." msgstr "" "Необхідно. Ідентифікатор інтерфейсу XFRM, який буде використовуватися для SA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Потребує hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "Потребує hostapd з підтримкою EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Потребує hostapd з підтримкою EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Потребує hostapd з підтримкою OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Потребує hostapd з підтримкою SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "Потрібен hostapd з підтримкою WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Потребує wpa-суплікатора" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "Потребує wpa-суплікатора з підтримкою EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Потребує wpa-суплікатора з підтримкою EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Потребує wpa-суплікатора з підтримкою OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Потребує wpa-суплікатора з підтримкою SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "Потребує wpa-суплікатора з підтримкою WEP" @@ -6965,7 +7852,7 @@ msgid "Reselection policy for primary slave" msgstr "Політика повторного вибору первинного веденого" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6980,20 +7867,24 @@ msgstr "Скинути лічильники" msgid "Reset to defaults" msgstr "Відновити початковий стан" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Файли resolv і hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Файл resolv" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Список доменів для примусового перетворення у IP-адреси." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Ресурс не знайдено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "Перезапустити" @@ -7002,7 +7893,7 @@ msgstr "Перезапустити" msgid "Restart Firewall" msgstr "Перезавантажити брандмауер" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Перезавантажити радіоінтерфейс" @@ -7014,7 +7905,7 @@ msgstr "Відновлення" msgid "Restore backup" msgstr "Відновити з резервної копії" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." @@ -7022,86 +7913,97 @@ msgstr "" "Локалізувати ім'я хоста залежно від запитуючої підмережі, якщо доступно " "кілька IP-адрес" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "Показати/приховати пароль" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "Фільтр зворотного шляху" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Скасувати" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Скасувати зміни" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "Помилка запиту на скасування зі статусом %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Відкат конфігурації…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "Переписати адресу призначення на %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "Переписати адресу призначення на %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Переписати адресу призначення на %h, порт %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "" "Переписати адресу призначення на %h, порт %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "Переписати адресу джерела на %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "Переписати адресу джерела на %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" "Переписати адресу джерела на %h, порт %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "" "Переписати адресу джерела на %h, порт %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "Перезаписати адресу висхідного пристрою" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "Надійність" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -7119,19 +8021,19 @@ msgstr "Підготовка Root" msgid "Round-Robin policy (balance-rr, 0)" msgstr "Політика round-robin (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Маршрутизація дозволених IP-адрес" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "Ланцюжок дій маршруту \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Тип маршруту" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -7152,6 +8054,10 @@ msgstr "Пароль маршрутизатора" msgid "Routing" msgstr "Маршрутизація" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -7166,24 +8072,24 @@ msgstr "" msgid "Rule" msgstr "Правило" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "Дії для правил" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "Коментар до правила: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "Ланцюжок правил контейнера \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "Відповідність правил" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "Тип правила" @@ -7203,11 +8109,24 @@ msgstr "Помилка виконання" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "SNR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -7225,15 +8144,15 @@ msgstr "Порт сервера SSH" msgid "SSH username" msgstr "Ім'я користувача SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH-ключі" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -7250,7 +8169,7 @@ msgstr "Сервер SSTP" msgid "SWAP" msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7261,7 +8180,7 @@ msgid "Save" msgstr "Зберегти" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "Зберегти і застосувати" @@ -7278,7 +8197,7 @@ msgstr "Зберегти mtdblock" msgid "Save mtdblock contents" msgstr "Зберегти вміст mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "Сканувати" @@ -7287,11 +8206,16 @@ msgstr "Сканувати" msgid "Scheduled Tasks" msgstr "Заплановані завдання" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Секцію додано" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Секцію видалено" @@ -7307,11 +8231,11 @@ msgid "" msgstr "" "Щоб прошити образ, навіть якщо не вдалося виконати перевірку його формату, " "виберіть \"Примусове оновлення\". Використовуйте тільки якщо ви впевнені, що " -"мікропрограма є правильною і призначена для вашого пристрою!" +"прошивка є правильною і призначена для вашого пристрою!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "Виберіть файл…" @@ -7319,7 +8243,7 @@ msgstr "Виберіть файл…" msgid "Selects the transmit hash policy to use for slave selection" msgstr "Вибір політики гешування передавання для вибору веденого" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7327,7 +8251,7 @@ msgstr "" "Надсилати RA " "повідомлення, що оголошують цей пристрій маршрутизатором IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "Надсилати ICMP перенаправлення" @@ -7348,11 +8272,15 @@ msgstr "" msgid "Send the hostname of this device" msgstr "Надіслати ім’я хосту цього пристрою" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "Адреса сервера" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "Ім'я сервера" @@ -7377,19 +8305,23 @@ msgstr "Час сеансу минув" msgid "Set Static" msgstr "Встановити статичним" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 #, fuzzy msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "Встановити поле заголовка %s у %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 #, fuzzy msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "" "Встановити інтерфейс зовнішнім веденим NDP-проксі. За промовчанням вимкнено." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7401,7 +8333,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "Встановити однакову MAC-адресу для всіх ведених" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7412,7 +8344,7 @@ msgstr "" "abbr>. Якщо ввімкнено, клієнти виконуватимуть автоматичне налаштування IPv6-" "адреси без урахування стану." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7428,11 +8360,15 @@ msgstr "Встановити для поточного активного вед msgid "Set to first slave added to the bond (follow, 2)" msgstr "Встановити для першого веденого, доданого до в'язанки (follow, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Налаштування DHCP-сервера" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Налаштування маршрутів для проксі-сусідів IPv6." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7440,35 +8376,37 @@ msgid "Setting PLMN failed" msgstr "Не вдалося налаштувати PLMN" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "Не вдалося налаштувати режим роботи" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "Налаштування" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "Налаштування маршрутів для проксі-сусідів IPv6." - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" -"Секунди з великою кількістю помилок (SES)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "Короткий GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Коротка преамбула" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Показати поточний список файлів резервного копіювання" @@ -7481,16 +8419,16 @@ msgstr "Показати порожні ланцюжки" msgid "Show raw counters" msgstr "Показати необроблені (raw) лічильники" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Вимкнути цей інтерфейс" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7498,15 +8436,15 @@ msgstr "Вимкнути цей інтерфейс" msgid "Signal" msgstr "Сигнал" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Сигнал / шум" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Затухання сигналу (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "Частота оновлення сигналу" @@ -7514,12 +8452,12 @@ msgstr "Частота оновлення сигналу" msgid "Signal:" msgstr "Сигнал:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "Розмір" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Розмір кешу запитів DNS" @@ -7536,12 +8474,12 @@ msgstr "Пропустити" msgid "Skip from backup files that are equal to those in /rom" msgstr "Пропускати з резервної копії файли, які співпадають з файлами в /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Перейти до вмісту" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Перейти до навігації" @@ -7553,32 +8491,28 @@ msgstr "Ведені інтерфейси" #: modules/luci-base/htdocs/luci-static/resources/network.js:3002 #: modules/luci-compat/luasrc/model/network.lua:1428 msgid "Software VLAN" -msgstr "Програмово реалізований VLAN" +msgstr "Програмне забезпечення VLAN" #: modules/luci-compat/luasrc/view/cbi/header.htm:5 msgid "Some fields are invalid, cannot save values!" msgstr "Деякі поля є неприпустимими, неможливо зберегти значення!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "На жаль, об'єкт, який ви просили, не знайдено." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "На жаль, на сервері сталася неочікувана помилка." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " "flashed manually. Please refer to the wiki for device specific install " "instructions." msgstr "" -"На жаль, оновлення системи не підтримується. Новий образ мікропрограми слід " +"На жаль, оновлення системи не підтримується. Новий образ прошивки слід " "прошити вручну. Зверніться до Wiki за інструкцією з інсталяції для " "конкретного пристрою." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7605,7 +8539,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "Порт джерела" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7613,7 +8547,7 @@ msgstr "" "Спеціальні параметри завантаження PXE для Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7621,7 +8555,7 @@ msgstr "" "Визначає фіксований список пошукових доменів DNS для оголошення через " "DHCPv6. Якщо не вказано, буде оголошено домен пошуку DNS локального пристрою." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7631,7 +8565,7 @@ msgstr "" "через DHCPv6. Якщо не вказано, пристрій оголошуватиме себе як IPv6 DNS-" "сервер, якщо параметр Локальний IPv6 DNS-сервер не вимкнено." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7661,7 +8595,7 @@ msgstr "Визначає IP-адреси, які використовуютьс msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "Визначає частоту моніторингу з'єднань MII у мілісекундах" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "Вказує значення TOS для відповідності в заголовках IP" @@ -7669,7 +8603,7 @@ msgstr "Вказує значення TOS для відповідності в msgid "Specifies the aggregation selection logic to use" msgstr "Визначає логіку вибору агрегації для використання" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "Вказує цільову підмережу для відповідності (CIDR-нотація)" @@ -7677,7 +8611,7 @@ msgstr "Вказує цільову підмережу для відповідн msgid "Specifies the directory the device is attached to" msgstr "Визначає каталог, до якого приєднано пристрій" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7687,7 +8621,7 @@ msgstr "" "Advertisement\">RA, до прикладу, для вказання клієнтам запитувати " "додаткову інформацію через DHCPv6 із збереженням стану (stateful)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" @@ -7696,7 +8630,7 @@ msgstr "" "відповідності позначці 255 або 0x0/0x1 для відповідності будь-якому парному " "значенню позначки" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "Вказує ім’я вхідного логічного інтерфейсу" @@ -7734,7 +8668,7 @@ msgstr "" "Визначає максимальний час (секунди), після якого вважається, що вузли " "\"мертві\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7757,7 +8691,7 @@ msgid "Specifies the mode to be used for this bonding interface" msgstr "" "Визначає режим, який буде використовуватися для цього інтерфейсу зв'язування" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #, fuzzy msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " @@ -7804,15 +8738,15 @@ msgstr "" "Вказує кількість секунд між моментами, коли драйвер зв’язування надсилає " "навчальні пакети кожному піру веденого пристрою" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "Вказує порядок правил IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "Вказує ім’я вихідного логічного інтерфейсу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7841,20 +8775,20 @@ msgstr "" "відбувається збій активного веденого пристрою або відновлення основного " "веденого" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "Визначає метрику маршруту для використання" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "Визначає тип маршруту, який необхідно створити" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 #, fuzzy msgid "Specifies the rule target routing action" msgstr "Визначає дію для правила цільової маршрутизації" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "Вказує вихідну підмережу для відповідності (CIDR-нотація)" @@ -7878,7 +8812,7 @@ msgstr "" "Вказує час очікування в мілісекундах перед увімкненням веденого пристрою " "після виявлення відновлення зв’язку" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -8004,15 +8938,23 @@ msgstr "" "Вкажіть MTU, відмінний від типового (1280 байт)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "Вкажіть тут секретний ключ шифрування." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "Тайм-аут кешу застарілих сусідів" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "Запустити" @@ -8025,16 +8967,16 @@ msgstr "Запустити WPS" msgid "Start priority" msgstr "Стартовий пріоритет" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "Запустити оновлення" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "Розпочато застосування конфігурації…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Розпочато сканування бездротових мереж..." @@ -8043,6 +8985,10 @@ msgstr "Розпочато сканування бездротових мере msgid "Startup" msgstr "Запуск" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Статичні маршрути IPv4" @@ -8056,7 +9002,7 @@ msgstr "Статичні маршрути IPv6" msgid "Static Lease" msgstr "Статична оренда" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Статичні оренди" @@ -8066,7 +9012,7 @@ msgstr "Статичні оренди" msgid "Static address" msgstr "Статична адреса" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -8077,18 +9023,18 @@ msgstr "" "конфігурацій інтерфейсів, коли обслуговуються тільки вузли з відповідною " "орендою." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Обмеження бездіяльності станції" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Стан" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Зупинити" @@ -8097,8 +9043,8 @@ msgstr "Зупинити" msgid "Stop WPS" msgstr "Зупинити WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "Зупинити оновлення" @@ -8106,11 +9052,11 @@ msgstr "Зупинити оновлення" msgid "Storage" msgstr "Сховище" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "Сувора фільтрація" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Строгий порядок" @@ -8119,15 +9065,15 @@ msgid "Strong" msgstr "Висока" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "Надіслати" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Блокувати журналювання" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "Блокувати ведення журналу звичайної роботи цих протоколів" @@ -8160,7 +9106,7 @@ msgstr "VLAN комутатора" msgid "Switch port" msgstr "Порт комутатора" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Протокол комутатора" @@ -8170,7 +9116,7 @@ msgstr "Протокол комутатора" msgid "Switch to CIDR list notation" msgstr "Перейти до позначення списку CIDR" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Символічне посилання" @@ -8182,8 +9128,16 @@ msgstr "Синхронізувати з NTP-сервером" msgid "Sync with browser" msgstr "Синхронізувати з браузером" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -8207,9 +9161,9 @@ msgstr "Властивості системи" msgid "System log buffer size" msgstr "Розмір буфера системного журналу" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "Система працює в режимі відновлення (initramfs)." @@ -8238,7 +9192,7 @@ msgstr "TCP-порт джерела" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Корінь TFTP-сервера" @@ -8251,26 +9205,37 @@ msgstr "Передано" msgid "TX Rate" msgstr "Швидкість передавання" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "Довжина черги TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Таблиця" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Ціль" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "Цільова платформа" @@ -8287,7 +9252,7 @@ msgstr "Простір temp" msgid "Terminate" msgstr "Завершити" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -8297,7 +9262,7 @@ msgstr "" "повідомленнях RA. Мінімальне значення 1280 байт." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." @@ -8305,7 +9270,7 @@ msgstr "" "Флаг Managed address configuration (M) вказує, що адреси IPv6 " "доступні через DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -8313,7 +9278,7 @@ msgstr "" "Флаг Mobile IPv6 Home Agent (H) вказує, що пристрій також діє в " "якості мобільного домашнього агента IPv6 на цьому з'єднанні." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -8331,7 +9296,11 @@ msgid "" "the configuration." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8347,18 +9316,24 @@ msgstr "" "Конфігурацію оновлення кінцевого вузла HE.net змінено, тепер потрібно " "використовувати звичайне ім'я користувача замість ідентифікатора користувача!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "IP-адреса %h уже використовується іншою статичною орендою" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "IP-адреса знаходиться поза межами пулу адрес DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "IP-адреса сервера завантаження" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "Адреса IPv4 або повне доменне ім’я віддаленого вузла." @@ -8366,6 +9341,7 @@ msgstr "Адреса IPv4 або повне доменне ім’я відда #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "Адреса IPv4 або повне доменне ім'я віддаленого кінця тунелю." @@ -8380,6 +9356,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "Адреса IPv6 або повне доменне ім'я віддаленого кінця тунелю." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8392,7 +9374,7 @@ msgstr "" msgid "The LED blinks with the configured on/off frequency" msgstr "Світлодіод блимає з налаштованою частотою увімкнення/вимкнення" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 #, fuzzy msgid "The LED flashes to simulate actual heart beat." msgstr "Світлодіод блимає, імітуючи реальне серцебиття." @@ -8412,22 +9394,26 @@ msgstr "Світлодіод завжди вимкнений." msgid "The LED is always in default state on." msgstr "Світлодіод завжди увімкнений." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" "MAC-адреса %h уже використовується іншою статичною орендою в тому ж пулі DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "MTU не повинен перевищувати MTU батьківського пристрою в %d байтів" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "VLAN ID має бути унікальним" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8439,7 +9425,7 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "Файл конфігурації не вдалося завантажити через таку помилку:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" @@ -8447,7 +9433,7 @@ msgstr "" "Під час приєднання до прихованої бездротової мережі потрібно вручну вказати " "правильний SSID" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8473,19 +9459,19 @@ msgstr "" "Файл пристрою пам'яті або розділу (напр. " "/dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "Ім'я пристрою «%s» вже зайнято" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "" "Для належної роботи LuCI необхідно змінити існуючу конфігурацію мережі." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8507,7 +9493,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "Наразі в цій системі активні такі правила." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "Частота прямо пропорційна середньому завантаженню ЦП за 1 хвилину." @@ -8515,17 +9501,17 @@ msgstr "Частота прямо пропорційна середньому з msgid "The gateway address must not be a local IP address" msgstr "Адреса шлюзу не повинна бути локальною IP-адресою" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "Наданий відкритий SSH-ключ вже було додано." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8533,15 +9519,31 @@ msgstr "" "Наданий відкритий SSH-ключ є недійсним. Надавайте належні відкриті ключі RSA " "або ECDSA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "Ім'я хоста сервера завантаження" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Назва інтерфейсу вже використовується" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Назва інтерфейсу занадто довга" @@ -8564,6 +9566,7 @@ msgstr "Локальна адреса IPv4" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "Локальна адреса IPv4, за якою створюється тунель (необов'язково)." @@ -8578,7 +9581,7 @@ msgstr "Локальна мережева маска IPv4" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "Локальна адреса IPv6, через яку створюється тунель (необов’язково)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8592,7 +9595,7 @@ msgstr "" "\"затримку виходу\" мережі. Зменшене значення призводить до скорочення часу " "на виявлення втрати останнього члена групи" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8604,7 +9607,7 @@ msgstr "" "передачі повідомлень IGMP у підмережі; більші значення роблять трафік менш " "інтенсивним, оскільки відповіді хоста розподіляються на більший інтервал" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8613,13 +9616,13 @@ msgstr "" "title=\"Router Advertisement\">RA. Максимальне значення – 255 " "стрибків." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Назва мережі вже використовується" @@ -8641,14 +9644,14 @@ msgstr "" "з'єднання з більшою мережею, такою наприклад, як Інтернет, а інші порти — " "для локальної мережі." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" "Інтервал відповіді на запит має бути нижчим за значення інтервалу запиту" @@ -8656,13 +9659,13 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:158 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:42 msgid "The reboot command failed with code %d" -msgstr "Команда reboot завершилася невдало з кодом %d" +msgstr "Команда перезавантаження завершилася невдачею з кодом %d" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:147 msgid "The restore command failed with code %d" msgstr "Команда restore завершилася невдало з кодом %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8672,15 +9675,15 @@ msgstr "" "Якщо очікуються втрати в мережі, значення надійності може бути збільшено. " "IGMP стійкий до втрат пакетів (надійність-1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" "Ціль правила — перехід до іншого правила, визначеного значенням його " "пріоритету" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8690,11 +9693,11 @@ msgstr "" "до 65535 або символьний псевдонім, оголошений у /etc/iproute2/rt_tables. " "Також дійсні спеціальні псевдоніми local (255), main (254) і default (253)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "Обраний режим %s несумісний із шифруванням %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "Поданий маркер безпеки недійсний або вже збіг!" @@ -8734,6 +9737,14 @@ msgstr "Системний пароль успішно змінено." msgid "The sysupgrade command failed with code %d" msgstr "Команда sysupgrade завершилася невдало з кодом %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8750,7 +9761,7 @@ msgstr "Відвантажений архів резервної копії не #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:249 msgid "The uploaded firmware does not allow keeping current configuration." -msgstr "Відвантажена мікропрограма не дозволить зберегти поточну конфігурацію." +msgstr "Відвантажена прошивка не дозволить зберегти поточну конфігурацію." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:244 msgid "" @@ -8760,30 +9771,37 @@ msgstr "" "Відвантажений файл образу не містить підтримуваний формат. Переконайтеся, що " "ви вибираєте універсальний формат образу для вашої платформи." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "Значення перевизначено конфігурацією. Оригінал: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "Значення перевизначено конфігурацією." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Немає жодних активних оренд" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Немає жодних змін до застосування" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8796,16 +9814,16 @@ msgstr "" msgid "This IPv4 address of the relay" msgstr "Це IPv4-адреса ретранслятора" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "Цей тип автентифікації не застосовується до вибраного методу EAP." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Це не схоже на дійсний файл PEM" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8823,6 +9841,17 @@ msgstr "" "Це або \"Update Key\", сконфігурований для тунелю, або пароль облікового " "запису, якщо ключ оновлення не налаштовано" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8839,7 +9868,7 @@ msgstr "" "Це локальна адреса кінцевого вузла, яку присвоєно тунельним брокером, вона " "зазвичай закінчується на …:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "Тільки для configuration import instead." msgstr "" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "До входу…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " "archive here. To reset the firmware to its initial state, click \"Perform " "reset\" (only possible with squashfs images)." msgstr "" -"Щоб відновити файли конфігурації, ви можете відвантажити раніше створений " -"архів резервної копії. Для відновлення мікропрограми до її початкового стану " +"Щоб відновити файли конфігурації, ви можете завантажити раніше створений " +"архів резервної копії. Для відновлення прошивки до її початкового стану " "натисніть кнопку \"Виконати відновлення\" (можливо тільки з образами " "SquashFS)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Тоновий" @@ -8957,12 +9990,16 @@ msgstr "Тоновий" msgid "Total Available" msgstr "Усього доступно" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Трасування" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8974,11 +10011,11 @@ msgstr "Трафік" msgid "Traffic Class" msgstr "Клас трафіку" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "Ланцюг фільтра трафіку \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 #, fuzzy msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" @@ -8996,6 +10033,27 @@ msgstr "Передавання" msgid "Transmit Hash Policy" msgstr "Політика передачі хешу" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "Передані дані" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -9034,7 +10092,7 @@ msgstr "Інтерфейс тунелю" msgid "Tunnel Link" msgstr "Посилання тунелю" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "Тунель" @@ -9043,13 +10101,13 @@ msgid "Tx-Power" msgstr "Потужність передавача" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "Тип" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "Тип послуги" @@ -9098,7 +10156,7 @@ msgstr "Не вдалося визначити зовнішню ІР-адрес msgid "Unable to determine upstream interface" msgstr "Не вдалося визначити висхідний інтерфейс" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Не вдалося опрацювати запит" @@ -9149,19 +10207,31 @@ msgstr "Не вдалося перезапустити брандмауер: %s" msgid "Unable to save contents: %s" msgstr "Не вдалося зберегти вміст: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "Недоступні секунди (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "Скасувати налаштування" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Несподіваний формат даних відповіді" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 #, fuzzy msgid "" "Unique Local Address - in the range fc00::/7. Typically only " @@ -9180,7 +10250,7 @@ msgstr "" msgid "Unknown" msgstr "Невідомо" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "Невідомий і непідтримуваний спосіб підключення." @@ -9204,11 +10274,11 @@ msgstr "Некерований" msgid "Unmount" msgstr "Демонтувати" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Ключ без назви" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Незбережені зміни" @@ -9222,15 +10292,25 @@ msgid "Unsupported MAP type" msgstr "Непідтримуваний тип MAP" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Непідтримуваний модем" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "Непідтримуваний тип протоколу." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "" @@ -9242,7 +10322,7 @@ msgstr "Вгору" msgid "Up Delay" msgstr "Затримка підняття" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Завантажити" @@ -9250,8 +10330,7 @@ msgstr "Завантажити" msgid "" "Upload a sysupgrade-compatible image here to replace the running firmware." msgstr "" -"Відвантажте тут sysupgrade-сумісний образ, щоб замінити працюючу " -"мікропрограму." +"Завантажити тут sysupgrade-сумісний образ, щоб замінити працюючу прошивку." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:138 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:169 @@ -9259,25 +10338,29 @@ msgstr "" msgid "Upload archive..." msgstr "Відвантажити архів…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Відвантажити файл" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "Відвантажити файл…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Не вдалося виконати запит на відвантаження: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "Відвантаження файлу…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -9287,7 +10370,7 @@ msgstr "" "призначені назви у формі wifinet#, і мережу буде перезапущено для " "застосування оновленої конфігурації." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." @@ -9295,7 +10378,7 @@ msgstr "" "Після натискання «Продовжити» конфігурація мостів буде оновлена, а мережа " "перезапуститься, щоб застосувати оновлену конфігурацію." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." @@ -9303,21 +10386,25 @@ msgstr "" "Після натискання «Продовжити», параметри ifname будуть перейменовані, а " "мережа перезапуститься, щоб застосувати оновлену конфігурацію." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "DNS сервери буде опитано в " "порядку, визначеному файлом resolvfile" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "Час безвідмовної роботи" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Використовувати /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Використовувати сервери, оголошені DHCP" @@ -9326,13 +10413,18 @@ msgstr "Використовувати сервери, оголошені DHCP" msgid "Use DHCP gateway" msgstr "Використовувати DHCP-шлюз" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Використовувати DNS-сервери, оголошувані вузлом" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "Використовуйте коди країн згідно ISO/IEC 3166 alpha2." @@ -9380,22 +10472,25 @@ msgstr "Використовувати як кореневу файлову си msgid "Use broadcast flag" msgstr "Використовувати прапорець широкомовності" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Використовувати вбудоване керування IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Використовувати особливі DNS-сервери" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "Використовувати типовий шлюз" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Використовувати метрику шлюзу" @@ -9421,15 +10516,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "Використовувати те саме джерело та призначення для кожного з’єднання" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "Використовувати системні сертифікати" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "Використовувати системні сертифікати для внутрішнього тунелю" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9461,11 +10556,11 @@ msgstr "" msgid "Used" msgstr "Використано" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Використовується слот ключа" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9474,59 +10569,61 @@ msgstr "" "title=\"ідентифікатор власника ключа R0\">R0KH-ID
    . Не потрібно зі " "звичайним WPA(2)-PSK." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "Користувацька група" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Сертифікат користувача (PEM-кодований)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "Ідентифікатор користувача" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Ключ користувача (PEM-кодований)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "Ім'я користувача" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "Використовувати flow-таблицю %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (Virtual Ethernet Port Aggregator)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "VLAN ID" @@ -9546,24 +10643,27 @@ msgstr "Локальна адреса VPN" msgid "VPN Local port" msgstr "Локальний порт VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "VPN-протокол" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPN-сервер" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Порт VPN-сервера" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "SHA1-геш сертифіката VPN-сервера" @@ -9572,6 +10672,10 @@ msgstr "SHA1-геш сертифіката VPN-сервера" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (та інш.) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9585,7 +10689,7 @@ msgstr "Мережевий ідентифікатор VXLAN" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." @@ -9593,8 +10697,8 @@ msgstr "" "Потребує підтримки висхідною мережею DNSSEC; переконайтеся, що відповіді " "непідписаного домену дійсно походять із непідписаних доменів" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9622,7 +10726,7 @@ msgstr "Постачальник" msgid "Vendor Class to send when requesting DHCP" msgstr "Клас постачальника для відправки при запиті DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" "Перевіряти, чи справді відповіді непідписаного домену надходять від " @@ -9632,12 +10736,12 @@ msgstr "" msgid "Verifying the uploaded image file." msgstr "Перевірка відвантаженого файлу образу." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "Дуже висока" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "Віртуальний Ethernet" @@ -9645,34 +10749,46 @@ msgstr "Віртуальний Ethernet" msgid "Virtual dynamic interface" msgstr "Віртуальний динамічний інтерфейс" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "Відкрита система WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Спільний ключ WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Парольна фраза WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Режим WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Парольна фраза WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9702,7 +10818,17 @@ msgstr "" msgid "Weak" msgstr "Слабка" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 #, fuzzy msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " @@ -9711,7 +10837,20 @@ msgstr "" "При делегуванні префіксів кільком низхідним потокам інтерфейси з більшим " "значенням привілею розглядаються першими під час розподілу підмереж." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" @@ -9719,7 +10858,26 @@ msgstr "" "Якщо увімкнено, шлюз стає on-link, навіть якщо адреса шлюза не відповідає " "жодному префіксу інтерфейсу" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9729,7 +10887,7 @@ msgstr "" "параметри ключів R0/R1 нижче не застосовуються. Щоб використовувати " "параметри ключів R0 та R1, вимкніть цю функцію." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9737,7 +10895,7 @@ msgstr "" "Там, де вимкнено режим Wi-Fi мультимедіа (WMM) QoS, клієнти можуть бути " "обмежені швидкостями 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9746,16 +10904,25 @@ msgstr "" "ефірного часу може значно зменшитися." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Ширина" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Стан WireGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "" @@ -9771,21 +10938,21 @@ msgid "Wireless Adapter" msgstr "Бездротовий адаптер" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Бездротова мережа" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Огляд бездротових мереж" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Безпека бездротової мережі" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Перенесення конфігурації бездротових мереж" @@ -9801,15 +10968,15 @@ msgstr "Бездротову мережу вимкнено" msgid "Wireless is not associated" msgstr "Бездротову мережу не пов'язано" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Бездротову мережу вимкнено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Бездротову мережу ввімкнено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "Записувати отримані DNS-запити до системного журналу" @@ -9821,7 +10988,7 @@ msgstr "Записувати cистемний журнал до файлу" msgid "XOR policy (balance-xor, 2)" msgstr "Політика XOR (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9850,8 +11017,20 @@ msgstr "" "Якщо ви вимкнете основний скрипт ініціалізації (наприклад \"network\"), " "пристрій може стати недоступним!
    " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9887,34 +11066,54 @@ msgstr "Налаштування ZRam" msgid "ZRam Size" msgstr "Розмір ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "будь-який" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "авто" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "автоматично" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "з'єд. мостом" @@ -9971,25 +11170,30 @@ msgctxt "nft unit" msgid "day" msgstr "день" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "вимкнено" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "вимкнено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "типово для драйвера" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "напр.: --proxy 10.10.10.10" @@ -9998,14 +11202,23 @@ msgstr "напр.: --proxy 10.10.10.10" msgid "e.g: dump" msgstr "напр.: падіння" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "минув" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "примусово" @@ -10015,22 +11228,22 @@ msgstr "примусово" msgid "forward" msgstr "переспрямувати" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "повний дуплекс" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "напівдуплекс" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "шістнадцяткове кодоване значення" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "приховано" @@ -10039,9 +11252,9 @@ msgctxt "nft unit" msgid "hour" msgstr "година" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "гібридний режим" @@ -10049,6 +11262,10 @@ msgstr "гібридний режим" msgid "ignore" msgstr "ігнорувати" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -10063,11 +11280,19 @@ msgstr "ключ від 8 до 63 символів" msgid "key with either 5 or 13 characters" msgstr "ключ із 5 або 13 символів" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "managed config (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "середній рівень безпеки" @@ -10076,11 +11301,11 @@ msgctxt "nft unit" msgid "minute" msgstr "хвилина" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "хв." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "mobile home agent (H)" @@ -10092,18 +11317,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "Ні" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "нема з'єднання" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "непусте значення" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "нічого" @@ -10114,20 +11347,20 @@ msgid "not present" msgstr "не присутній" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "вимкнено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "за доступним префіксом" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "відкрита мережа" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "other config (O)" @@ -10136,6 +11369,10 @@ msgstr "other config (O)" msgid "output" msgstr "вихід" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "більше доби тому" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -10153,23 +11390,32 @@ msgstr "додатне ціле значення" msgid "random" msgstr "випадковий" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "режим реле" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "спрямовано" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "с" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "режим сервера" @@ -10177,7 +11423,7 @@ msgstr "режим сервера" msgid "sstpc Log-level" msgstr "Рівень журналу sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "високий рівень безпеки" @@ -10185,7 +11431,7 @@ msgstr "високий рівень безпеки" msgid "tagged" msgstr "позначено" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "одиниці часу (TUs / 1.024 ms) [1000-65535]" @@ -10199,25 +11445,27 @@ msgstr "" "Protocol\">HTTP
    або HTTPS." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "унікальне значення" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "невідомо" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "необмежено" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -10239,8 +11487,8 @@ msgid "untagged" msgstr "непозначено" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "дійсна IP-адреса" @@ -10253,7 +11501,7 @@ msgid "valid IPv4 CIDR" msgstr "дійсна IPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "дійсна IPv4-адреса" @@ -10282,7 +11530,7 @@ msgid "valid IPv6 CIDR" msgstr "дійсна IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "дійсна IPv6-адреса" @@ -10319,8 +11567,8 @@ msgstr "дійсний UCI-ідентифікатор, ім'я хоста або msgid "valid address:port" msgstr "дійсна адреса:порт" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "дійсна дата (РРРР-ММ-ДД)" @@ -10360,11 +11608,21 @@ msgstr "дійсне ціле значення" msgid "valid multicast MAC address" msgstr "дійсна мультикаст MAC-адреса" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "дійсна мережа в записі адреса/маска мережі" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "дійсний символ номера телефону (0-9, \"*\", \"#\", \"!\" or \".\")" @@ -10374,43 +11632,43 @@ msgid "valid port or port range (port1-port2)" msgstr "дійсний порт або діапазон портів (порт1-порт2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "дійсне значення порту" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "дійсний час (ГГ:ХХ:СС)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "значення від %d до %d символів" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "значення від %f до %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "значення, що більше або дорівнює %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "значення, що менше або дорівнює %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "значення з %d симв." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "значення з принаймні %d символів" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "значення з не більше %d символів" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "слабкий рівень безпеки" diff --git a/package/luci/modules/luci-base/po/ur/base.po b/package/luci/modules/luci-base/po/ur/base.po new file mode 100644 index 0000000000..c34a7506c5 --- /dev/null +++ b/package/luci/modules/luci-base/po/ur/base.po @@ -0,0 +1,10964 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-07-24 14:21+0000\n" +"Last-Translator: Usama Khursheed \n" +"Language-Team: Urdu \n" +"Language: ur\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14-dev\n" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 +msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" +msgid "\"%h\" table \"%h\"" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 +msgid "%.1f dB" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 +msgid "%d Bit" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 +msgid "%d invalid field(s)" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 +msgid "%s is untagged in multiple VLANs!" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:296 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:405 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:272 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:309 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:327 +msgid "(%d minute window, %d second interval)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:118 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:124 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:259 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:283 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:88 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:91 +msgid "(empty)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 +#: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 +msgid "(no interfaces attached)" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 +msgctxt "Label indicating further amount of allowed ips" +msgid "+ %d more" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:48 +msgid "-- Additional Field --" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 +#: modules/luci-compat/luasrc/view/cbi/header.htm:8 +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 +msgid "-- Please choose --" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 +#: modules/luci-compat/luasrc/view/cbi/header.htm:9 +msgid "-- custom --" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:271 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:380 +msgid "-- match by label --" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:257 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:363 +msgid "-- match by uuid --" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:27 +#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:44 +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:23 +msgid "-- please select --" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:55 +msgctxt "sstp log level value" +msgid "0" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +msgid "0 = not using RSSI threshold, 1 = do not change driver default" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:56 +msgctxt "sstp log level value" +msgid "1" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:233 +msgid "1 Minute Load:" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 +msgctxt "nft amount of flags" +msgid "1 flag" +msgid_plural "%d flags" +msgstr[0] "" +msgstr[1] "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 +msgid "15 Minute Load:" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:57 +msgctxt "sstp log level value" +msgid "2" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:58 +msgctxt "sstp log level value" +msgid "3" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 +msgctxt "sstp log level value" +msgid "4" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 +msgid "4-character hexadecimal ID" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:18 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:11 +msgid "464XLAT (CLAT)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:243 +msgid "5 Minute Load:" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 +msgid "6-octet identifier as a hex string - no colons" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 +msgid "802.11r Fast Transition" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 +msgid "802.11w Association SA Query maximum timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 +msgid "802.11w Association SA Query retry timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 +msgid "802.11w Management Frame Protection" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 +msgid "802.11w maximum timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 +msgid "802.11w retry timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 +msgid "BSSID" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 +msgid "ESSID" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 +msgid "IPv4-Netmask" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:58 +msgid "LED Configuration" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:70 +msgid "LED Name" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 +msgid "NDP-Proxy" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 +msgid "RA Flags" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +msgid "RA Hop Limit" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +msgid "RA Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 +msgid "RA MTU" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 +msgid "RA-Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 +msgctxt "nft relational \">\" operator expression" +msgid "%s greater than %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:85 +msgctxt "nft relational \">=\" operator expression" +msgid "%s greater than or equal to %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:90 +msgctxt "nft set match expression" +msgid "%s in set %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:83 +msgctxt "nft relational \"==\" operator expression" +msgid "%s is %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:89 +msgctxt "nft relational \"in\" operator expression" +msgid "%s is one of %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:88 +msgctxt "nft relational \"<\" operator expression" +msgid "%s lower than %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:86 +msgctxt "nft relational \"<=\" operator expression" +msgid "%s lower than or equal to %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:84 +msgctxt "nft relational \"!=\" operator expression" +msgid "%s not %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:91 +msgctxt "nft not in set match expression" +msgid "%s not in set %s" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 +msgid "A configuration for the device \"%s\" already exists" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 +msgid "A directory with the same name already exists." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2666 +msgid "A new login is required since the authentication session expired." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +msgid "A43C + J43 + A43" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +msgid "A43C + J43 + A43 + V43" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 +msgid "ADSL" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 +msgid "ANSI T1.413" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 +msgid "APN" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:353 +msgid "ARP" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:366 +msgid "ARP IP Targets" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:358 +msgid "ARP Interval" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:382 +msgid "ARP Validation" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:374 +msgid "ARP mode to consider a slave as being up" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:79 +msgid "ARP monitoring is not supported for the selected policy!" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 +msgid "ARP retry threshold" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 +msgid "ARP traffic table \"%h\"" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 +msgid "ATM (Asynchronous Transfer Mode)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 +msgid "ATM Bridges" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 +msgid "ATM Virtual Channel Identifier (VCI)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 +msgid "ATM Virtual Path Identifier (VPI)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 +msgid "" +"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " +"Linux network interfaces which can be used in conjunction with DHCP or PPP " +"to dial into the provider network." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 +msgid "ATM device number" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 +msgid "Absent Interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 +msgid "Accept DNS queries only from hosts whose address is on a local subnet." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 +msgid "Accept local" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:95 +msgctxt "nft accept action" +msgid "Accept packet" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 +msgid "Accept packets with local source addresses" +msgstr "" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 +msgid "Access Concentrator" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +msgid "Access Point" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 +msgid "Actions" +msgstr "اعمال" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 +msgid "Active" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:81 +msgid "Active Connections" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:35 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:182 +msgid "Active DHCP Leases" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:54 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:184 +msgid "Active DHCPv6 Leases" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:255 +msgid "Active IPv4 Routes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:258 +msgid "Active IPv4 Rules" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:265 +msgid "Active IPv6 Routes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:268 +msgid "Active IPv6 Rules" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:205 +msgid "Active-Backup policy (active-backup, 1)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 +msgid "Ad-Hoc" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:210 +msgid "Adaptive load balancing (balance-alb, 6)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:209 +msgid "Adaptive transmit load balancing (balance-tlb, 5)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2233 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2236 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2249 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2257 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 +#: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 +#: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 +#: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 +#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 +msgid "Add" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 +msgid "Add ATM Bridge" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:92 +msgid "Add IPv4 address…" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:185 +msgid "Add IPv6 address…" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:65 +msgid "Add LED action" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:221 +msgid "Add VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 +msgid "Add device configuration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 +msgid "Add device configuration…" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:15 +msgid "Add instance" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 +msgid "Add key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 +msgid "Add local domain suffix to names served from hosts files." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 +msgid "Add new interface..." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:224 +msgid "Add peer" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 +msgid "Add to Blacklist" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 +msgid "Add to Whitelist" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 +msgid "Additional hosts files" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 +msgid "Additional servers file" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:34 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:35 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:36 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:37 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:38 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:39 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:40 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:41 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:42 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:43 +msgid "Address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 +msgctxt "nft meta nfproto" +msgid "Address family" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:284 +msgid "Address setting is invalid" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +msgid "Address to access local relay bridge" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 +msgid "Addresses" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:3 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:15 +msgid "Administration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 +msgid "Advanced Settings" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 +msgid "Advanced device options" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 +msgid "Ageing time" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 +msgid "Aggregation Selection Logic" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:263 +msgid "Aggregator: All slaves down or has no slaves (stable, 0)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:265 +msgid "" +"Aggregator: Chosen by the largest number of ports + slave added/removed or " +"state changes (count, 2)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:264 +msgid "Aggregator: Slave added/removed or state changes (bandwidth, 1)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:192 +msgid "Alert" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2989 +#: modules/luci-compat/luasrc/model/network.lua:1417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:62 +msgid "Alias Interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:146 +msgid "Alias of \"%s\"" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +msgid "All servers" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 +msgid "" +"Allocate IP addresses sequentially, starting from the lowest available " +"address." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +msgid "Allocate IPs sequentially" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 +msgid "Allow SSH password authentication" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 +msgid "Allow AP mode to disconnect STAs based on low ACK condition" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +msgid "Allow all except listed" +msgstr "" + +#: modules/luci-compat/root/usr/share/rpcd/acl.d/luci-compat.json:3 +msgid "Allow full UCI access for legacy applications" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 +msgid "Allow legacy 802.11b rates" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 +msgid "Allow listed only" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 +msgid "Allow localhost" +msgstr "" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:179 +msgid "Allow rebooting the device" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 +msgid "Allow remote hosts to connect to local SSH forwarded ports" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 +msgid "Allow root logins with password" +msgstr "" + +#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:3 +msgid "Allow system feature probing" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 +msgid "Allow the root user to log in with password" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +msgid "Allowed IPs" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 +msgid "AllowedIPs setting is invalid" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 +msgid "Always" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:6 +msgid "Always off (kernel: none)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:5 +msgid "Always on (kernel: default-on)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 +msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 +msgid "" +"Always use 40MHz channels even if the secondary channel overlaps. Using this " +"option does not comply with IEEE 802.11n-2009!" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 +msgid "Amount of Duplicate Address Detection probes to send" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:608 +msgid "An error occurred while saving the form:" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 +msgid "An optional, short description for this device" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 +msgid "Annex" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 +msgid "Announce this device as IPv6 DNS server." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 +msgid "" +"Announce this device as default router if a local IPv6 default route is " +"present." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 +msgid "" +"Announce this device as default router if a public IPv6 prefix is available, " +"regardless of local default route availability." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 +msgid "" +"Announce this device as default router regardless of whether a prefix or " +"default route is present." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 +msgid "Announced DNS domains" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 +msgid "Announced IPv6 DNS servers" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +msgid "Anonymous Identity" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 +msgid "Anonymous Mount" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 +msgid "Anonymous Swap" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 +msgctxt "nft match any traffic" +msgid "Any packet" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:84 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:174 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:196 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:60 +msgid "Any zone" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 +msgid "Apply DHCP Options to this net. (Empty = all clients)." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 +msgid "Apply and keep settings" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 +msgid "Apply backup?" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 +msgid "Apply request failed with status %h" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 +msgid "Apply unchecked" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 +msgid "Apply with revert after connectivity loss" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 +msgid "Applying configuration changes… %ds" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +msgid "Architecture" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 +msgid "Arp-scan" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 +msgid "" +"Assign a part of given length of every public IPv6-prefix to this interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 +msgid "" +"Assign prefix parts using this hexadecimal subprefix ID for this interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 +msgid "Associated Stations" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:151 +msgid "Associations" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 +msgid "" +"At least %h per %h, burst of %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 +msgid "" +"At most %h per %h, burst of %h" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 +msgid "Attempt to enable configured mount points for attached devices" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 +msgid "Auth Group" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 +msgid "Authentication" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 +msgid "Authentication Type" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +msgid "Authoritative" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:17 +#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 +msgid "Authorization Required" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:56 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:69 +msgid "Automatic" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_hnet.lua:7 +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:7 +msgid "Automatic Homenet (HNCP)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 +msgid "Automatically check filesystem for errors before mounting" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 +msgid "" +"Automatically handle multiple uplink interfaces using source-based policy " +"routing." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 +msgid "Automatically mount filesystems on hotplug" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 +msgid "Automatically mount swap on hotplug" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 +msgid "Automount Filesystem" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 +msgid "Automount Swap" +msgstr "" + +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 +msgid "Available" +msgstr "موجود" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:270 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:280 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:331 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:341 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:351 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:236 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:246 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:256 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:265 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:275 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:293 +msgid "Average:" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 +msgid "B43 + B43C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +msgid "B43 + B43C + V43" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:48 +msgid "BR / DMR / AFTR" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 +msgid "BSSID" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 +msgid "Back" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/footer.htm:14 +#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:48 +msgid "Back to Overview" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 +msgid "Back to peer configuration" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:391 +msgid "Backup" +msgstr "" + +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:128 +msgid "Backup / Flash Firmware" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 +msgid "Backup file list" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 +msgid "Band" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 +msgid "Base device" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 +msgid "Base64-encoded public key of this interface for sharing." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 +msgid "Beacon Interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 +msgid "" +"Below is the determined list of files to backup. It consists of changed " +"configuration files marked by opkg, essential base files and the user " +"defined backup patterns." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:287 +msgid "Bind NTP server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 +msgid "Bind dynamically to interfaces rather than wildcard address." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 +msgid "Bind interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 +msgid "Bind the tunnel to this interface (optional)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:171 +msgid "Bitrate" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 +msgid "Bonding Policy" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2995 +#: modules/luci-compat/luasrc/model/network.lua:1421 +msgid "Bridge" +msgstr "پل (بریج)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 +msgctxt "MACVLAN mode" +msgid "Bridge (Support direct communication between MAC VLANs)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 +msgid "Bridge VLAN filtering" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +msgid "Bridge device" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 +msgid "Bridge port specific options" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +msgid "Bridge ports" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 +msgid "Bridge traffic table \"%h\"" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 +msgid "Bridge unit number" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 +msgid "Bring up empty bridge" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 +msgid "Bring up on boot" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 +msgid "Bring up the bridge interface even if no ports are attached" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 +msgid "Broadcast policy (broadcast, 3)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 +msgid "Browse…" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:40 +msgid "Buffered" +msgstr "" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 +msgid "CA certificate; if empty it will be saved after the first connection." +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 +msgid "CLAT configuration failed" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 +msgid "CPU usage (%)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:43 +msgid "Cached" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:53 +#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:53 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:21 +msgid "Call failed" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 +#: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 +#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 +msgid "Cancel" +msgstr "کینسل" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:347 +msgid "Cannot parse configuration: %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 +msgctxt "Chain hook: forward" +msgid "Capture incoming packets addressed to other hosts" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 +msgctxt "Chain hook: prerouting" +msgid "Capture incoming packets before any routing decision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 +msgctxt "Chain hook: input" +msgid "Capture incoming packets routed to the local system" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 +msgctxt "Chain hook: postrouting" +msgid "Capture outgoing packets after any routing decision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 +msgctxt "Chain hook: output" +msgid "Capture outgoing packets originating from the local system" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 +msgctxt "Chain hook: ingress" +msgid "Capture packets directly after the NIC received them" +msgstr "" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:17 +msgid "Category" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +msgid "Certificate constraint (Domain)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +msgid "Certificate constraint (SAN)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +msgid "Certificate constraint (Subject)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +msgid "Certificate constraint (Wildcard)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 +msgid "" +"Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " +"`logread -f` during handshake for actual values" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +msgid "" +"Certificate constraint(s) against DNS SAN values (if available)
    or " +"Subject CN (exact match)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 +msgid "" +"Certificate constraint(s) against DNS SAN values (if available)
    or " +"Subject CN (suffix match)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 +msgid "" +"Certificate constraint(s) via Subject Alternate Name values
    (supported " +"attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:212 +msgid "Chain" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 +msgctxt "Yet unknown nftables chain hook" +msgid "Chain hook \"%h\"" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 +msgid "Changes" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 +msgid "Changes have been reverted." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 +msgid "Changes the administrator password for accessing the device" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 +msgid "Channel" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 +msgid "Channel Analysis" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 +msgid "Channel Width" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 +msgid "Check filesystems before mount" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 +msgid "Check this option to delete the existing networks from this radio." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:110 +msgid "Checking archive…" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:193 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:195 +msgid "Checking image…" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:427 +msgid "Choose mtdblock" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 +msgid "" +"Choose the firewall zone you want to assign to this interface. Select " +"unspecified to remove the interface from the associated zone or " +"fill out the custom field to define a new zone and attach the " +"interface to it." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +msgid "" +"Choose the network(s) you want to attach to this wireless interface or fill " +"out the custom field to define a new network." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 +msgid "Cipher" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:91 +msgid "Cisco UDP encapsulation" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:391 +msgid "" +"Click \"Generate archive\" to download a tar archive of the current " +"configuration files." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:424 +msgid "" +"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS " +"FEATURE IS FOR PROFESSIONALS! )" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 +msgid "Client" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:37 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:33 +msgid "Client ID to send when requesting DHCP" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 +msgid "Close" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:156 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:114 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:92 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:101 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:124 +msgid "" +"Close inactive connection after the given amount of seconds, use 0 to " +"persist connection" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 +msgid "Collecting data..." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 +msgid "Command" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:401 +msgid "Command OK" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:33 +msgid "Command failed" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:73 +msgid "Comment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 +msgid "" +"Complicates key reinstallation attacks on the client side by disabling " +"retransmission of EAPOL-Key frames that are used to install keys. This " +"workaround might cause interoperability issues and reduced robustness of key " +"negotiation especially in environments with heavy traffic load." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:101 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:106 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:103 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:108 +msgid "Compute outgoing checksum (optional)." +msgstr "" + +#: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 +msgid "Config File" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 +msgid "Configuration" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 +msgid "Configuration Export" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 +msgid "Configuration changes applied." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 +msgid "Configuration changes have been rolled back!" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 +msgid "Configuration failed" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +msgid "" +"Configures data rates based on the coverage cell density. Normal configures " +"basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " +"5.5, 11 Mbps. High configures basic rates to 12, 24 Mbps if legacy 802.11b " +"rates are not used else to the 11 Mbps rate. Very High configures 24 Mbps as " +"the basic rate. Supported rates lower than the minimum basic rate are not " +"offered." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 +msgid "" +"Configures the default router advertisement in RA messages." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 +msgid "" +"Configures the operation mode of the RA service on this interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 +msgid "Configures the operation mode of the DHCPv6 service on this interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +msgid "" +"Configures the operation mode of the NDP proxy service on this interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 +msgid "Configure…" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:176 +msgid "Confirm disconnect" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:55 +msgid "Confirmation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 +msgid "Connected" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:9 +#: modules/luci-compat/luasrc/model/network.lua:27 +msgid "Connection attempt failed" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 +msgid "Connection attempt failed." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 +msgid "Connection endpoint" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:411 +msgid "Connection lost" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:160 +msgid "Connections" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 +msgid "Connectivity change" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:31 +msgctxt "nft ct state" +msgid "Conntrack state" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:33 +msgctxt "nft ct status" +msgid "Conntrack status" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:378 +msgid "Consider the slave up when all ARP IP targets are reachable (all, 1)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:377 +msgid "Consider the slave up when any ARP IP target is reachable (any, 0)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:18 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:368 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:55 +msgid "Contents have been saved." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 +msgid "Continue" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:97 +msgctxt "nft jump action" +msgid "Continue in %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 +msgid "Continue in calling chain" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +msgctxt "Chain policy: accept" +msgid "Continue processing unmatched packets" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 +msgid "" +"Could not regain access to the device after applying the configuration " +"changes. You might need to reconnect if you modified network related " +"settings such as the IP address or wireless security credentials." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:189 +msgid "Country" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +msgid "Country Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +msgid "Coverage cell density" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 +msgid "Create / Assign firewall-zone" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 +msgid "Create interface" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:191 +msgid "Critical" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:195 +msgid "Cron Log Level" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 +msgid "Current power" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:28 +msgctxt "nft meta hour" +msgid "Current time" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:29 +msgctxt "nft meta day" +msgid "Current weekday" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:573 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:575 +#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:51 +#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:53 +#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:82 +#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:83 +msgid "Custom Interface" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:410 +msgid "" +"Custom files (certificates, scripts) may remain on the system. To prevent " +"this, perform a factory-reset first." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:6 +msgid "Custom flash interval (kernel: timer)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:59 +msgid "" +"Customizes the behaviour of the device LEDs if possible." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 +msgid "DAD transmits" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 +msgid "DAE-Client" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 +msgid "DAE-Port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 +msgid "DAE-Secret" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 +msgid "DHCP Options" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 +msgid "DHCP Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 +msgid "DHCP and DNS" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2091 +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:16 +#: modules/luci-compat/luasrc/model/network.lua:969 +msgid "DHCP client" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +msgid "DHCP-Options" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 +msgid "DHCPv6 client" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 +msgid "DHCPv6-Service" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:45 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:46 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:48 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:49 +msgid "DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 +msgid "DNS forwardings" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +msgid "DNS query port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 +msgid "DNS search domains" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +msgid "DNS server port" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:292 +msgid "DNS setting is invalid" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 +msgid "DNS weight" +msgstr "" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:33 +msgid "DNS-Label / FQDN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 +msgid "DNSSEC" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 +msgid "DNSSEC check unsigned" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:99 +msgid "DPD Idle Timeout" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:41 +msgid "DS-Lite AFTR address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 +msgid "DSL" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +msgid "DSL Status" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 +msgid "DSL line mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 +msgid "DTIM Interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 +msgid "DUID" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 +msgid "Data Rate" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 +msgid "Debug" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 +msgid "Default router" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:12 +msgid "Default state" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +msgid "" +"Define additional DHCP options, for example " +"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " +"servers to clients." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 +msgid "" +"Defines a mapping of Linux internal packet priority to VLAN header priority " +"but for outgoing frames" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 +msgid "" +"Defines a mapping of VLAN header priority to the Linux internal packet " +"priority on incoming frames" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 +msgid "Defines a specific MTU for this route" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 +msgid "Delegate IPv6 prefixes" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2310 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2740 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 +#: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 +#: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 +msgid "Delete" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 +msgid "Delete key" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 +msgid "Delete request failed: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 +msgid "Delete this network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 +msgid "Delivery Traffic Indication Message Interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 +msgid "Description" +msgstr "تفصیل" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 +msgid "Deselect" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:237 +msgid "Design" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 +msgid "Designated master" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 +msgid "Destination" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:44 +msgctxt "nft ip daddr" +msgid "Destination IP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:48 +msgctxt "nft ip6 daddr" +msgid "Destination IPv6" +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:48 +msgid "Destination port" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:46 +msgctxt "nft ip dport" +msgid "Destination port" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 +msgid "Destination zone" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:67 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:281 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:357 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:393 +msgid "Device" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 +msgid "Device Configuration" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 +msgid "Device is not active" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 +msgid "Device is restarting…" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 +msgid "Device name" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 +msgid "Device not managed by ModemManager." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 +msgid "Device not present" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 +msgid "Device type" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 +msgid "Device unreachable!" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:53 +msgid "Device unreachable! Still waiting for device..." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 +msgid "Devices" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 +msgid "Diagnostics" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 +msgid "Dial number" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 +msgid "Directory" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 +msgid "Disable" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +msgid "" +"Disable DHCP for " +"this interface." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:375 +msgid "Disable DNS lookups" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 +msgid "Disable Encryption" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 +msgid "Disable Inactivity Polling" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 +msgid "Disable this network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:57 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:70 +msgid "Disabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +msgctxt "Label indicating that WireGuard peer is disabled" +msgid "Disabled" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 +msgid "Disassociate On Low Acknowledgement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 +msgid "" +"Discard upstream responses containing RFC1918 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 +msgid "Disconnect" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 +msgid "Disconnection attempt failed" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 +msgid "Disconnection attempt failed." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:35 +msgid "Disk space" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:611 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3022 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 +msgid "Dismiss" +msgstr "مسترد کریں" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +msgid "Distance Optimization" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +msgid "Distance to farthest network member in meters." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 +msgid "" +"Dnsmasq instance to which this boot section is bound. If unspecified, the " +"section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 +msgid "" +"Dnsmasq is a lightweight DHCP server and DNS forwarder." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 +msgid "Do not cache negative replies, e.g. for non-existent domains." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:88 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:70 +msgid "Do not create host route to peer (optional)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +msgid "Do not forward DNS queries without dots or domain parts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +msgid "Do not forward reverse lookups for local networks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 +msgid "Do not listen on the specified interfaces." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +msgid "Do not offer DHCPv6 service on this interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 +msgid "" +"Do not proxy any NDP " +"packets." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:25 +msgid "Do not send a hostname" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 +msgid "" +"Do not send any RA messages on this interface." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 +msgid "Do you really want to delete \"%s\" ?" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 +msgid "Do you really want to delete the following SSH key?" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:94 +msgid "Do you really want to erase all settings?" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 +msgid "Do you really want to recursively delete the directory \"%s\" ?" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 +msgid "Do you want to replace the current PSK?" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:100 +msgid "Do you want to replace the current keys?" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 +msgid "Domain" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +msgid "Domain required" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 +msgid "Domain whitelist" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:83 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 +msgid "Don't Fragment" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 +msgid "Down" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:403 +msgid "Down Delay" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:394 +msgid "Download backup" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:432 +msgid "Download mtdblock" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 +msgid "Downstream SNR offset" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 +msgid "" +"Drag or paste a valid *.conf file below to configure the local " +"WireGuard interface." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2698 +msgid "Drag to reorder" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:342 +msgid "Drop Duplicate Frames" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 +msgctxt "nft drop action" +msgid "Drop packet" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 +msgctxt "Chain policy: drop" +msgid "Drop unmatched packets" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 +msgid "Dropbear Instance" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 +msgid "" +"Dropbear offers SSH network shell access " +"and an integrated SCP server" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:14 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:11 +msgid "Dual-Stack Lite (RFC6333)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 +msgid "Dynamic DHCP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 +msgid "Dynamic Authorization Extension client." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 +msgid "Dynamic Authorization Extension port." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 +msgid "Dynamic Authorization Extension secret." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 +msgid "Dynamic tunnel" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 +msgid "" +"Dynamically allocate DHCP addresses for clients. If disabled, only clients " +"having static leases will be served." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 +msgid "EA-bits length" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +msgid "EAP-Method" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2718 +#: modules/luci-base/htdocs/luci-static/resources/form.js:2721 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 +msgid "Edit" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:226 +msgid "Edit peer" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/error.htm:13 +msgid "" +"Edit the raw configuration data above to fix any error and hit \"Save\" to " +"reload the page." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 +msgid "Edit this network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 +msgid "Edit wireless network" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:65 +msgctxt "nft rt mtu" +msgid "Effective route MTU" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 +msgid "Egress QoS mapping" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +msgctxt "nft meta oif" +msgid "Egress device id" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +msgctxt "nft meta oifname" +msgid "Egress device name" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 +msgid "Emergency" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 +msgid "Enable" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 +msgid "Enable / Disable peer. Restart wireguard interface to apply changes." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 +msgid "" +"Enable IGMP " +"snooping" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 +msgid "Enable STP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +msgid "Enable SLAAC" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:369 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:375 +msgid "Enable DNS lookups" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:294 +msgid "Enable Dynamic Shuffling Of Flows" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 +msgid "Enable HE.net dynamic endpoint update" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 +msgid "Enable IPv6" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 +msgid "Enable IPv6 negotiation" +msgstr "" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:54 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 +msgid "Enable IPv6 negotiation on the PPP link" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 +msgid "Enable Jumbo Frame passthrough" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 +msgid "Enable MAC address learning" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:257 +msgid "Enable NTP client" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 +msgid "Enable Single DES" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 +msgid "Enable TFTP server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 +msgid "Enable VLAN filtering" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:184 +msgid "Enable VLAN functionality" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 +msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:14 +msgid "" +"Enable automatic redirection of HTTP requests to HTTPS port." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 +msgid "" +"Enable downstream delegation of IPv6 prefixes available on this interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 +msgid "Enable key reinstallation (KRACK) countermeasures" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:189 +msgid "Enable learning and aging" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:200 +msgid "Enable mirroring of incoming packets" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:201 +msgid "Enable mirroring of outgoing packets" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 +msgid "Enable multicast fast leave" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 +msgid "Enable multicast querier" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 +msgid "Enable multicast support" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 +msgid "" +"Enable packet steering across all CPUs. May help or hinder network speed." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 +msgid "Enable promiscuous mode" +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:71 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:66 +msgid "Enable rx checksum" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:96 +msgid "Enable support for multicast traffic (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:83 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 +msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 +msgid "Enable the built-in single-instance TFTP server." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 +msgid "Enable this network" +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:75 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:70 +msgid "Enable tx checksum" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 +msgid "Enable unicast flooding" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 +msgid "Enabled" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 +msgid "Enables IGMP snooping on this bridge" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 +msgid "" +"Enables fast roaming among access points that belong to the same Mobility " +"Domain" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 +msgid "Enables the Spanning Tree Protocol on this bridge" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:59 +msgid "Encapsulation limit" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 +msgid "Encapsulation mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 +msgid "Encryption" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 +msgid "Endpoint Host" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 +msgid "Endpoint Port" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:325 +msgid "Endpoint setting is invalid" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 +msgid "Enforce IGMPv1" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 +msgid "Enforce IGMPv2" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 +msgid "Enforce IGMPv3" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 +msgid "Enforce MLD version 1" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 +msgid "Enforce MLD version 2" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 +msgid "Enter custom value" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 +msgid "Enter custom values" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:97 +msgid "Erasing..." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:105 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:107 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:190 +msgid "Error" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:170 +msgid "Error getting PublicKey" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3008 +#: modules/luci-compat/luasrc/model/network.lua:1433 +msgid "Ethernet Adapter" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2999 +#: modules/luci-compat/luasrc/model/network.lua:1423 +msgid "Ethernet Switch" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:272 +msgid "Every 30 seconds (slow, 0)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:273 +msgid "Every second (fast, 1)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +msgid "Exclude interfaces" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 +msgid "" +"Exempt 127.0.0.0/8 and ::1 from rebinding checks, " +"e.g. for RBL services." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 +msgid "Existing device" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 +msgid "Expand hosts" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 +msgid "Expecting a hexadecimal assignment hint" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 +msgid "Expecting a valid IPv4 address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 +msgid "Expecting a valid IPv6 address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 +msgid "Expecting two priority values separated by a colon" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2269 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 +msgid "Expecting: %s" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:50 +msgid "Expecting: non-empty value" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:50 +msgid "Expires" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 +msgid "" +"Expiry time of leased addresses, minimum is 2 minutes (2m)." +msgstr "" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:19 +msgid "External" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 +msgid "External R0 Key Holder List" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 +msgid "External R1 Key Holder List" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167 +msgid "External system log server" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:172 +msgid "External system log server port" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:177 +msgid "External system log server protocol" +msgstr "" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:79 +msgid "Extra SSH command options" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 +msgid "Extra pppd options" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 +msgid "Extra sstpc options" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 +msgid "FT over DS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 +msgid "FT over the Air" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 +msgid "FT protocol" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 +msgid "Failed to change the system password." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 +msgid "Failed to confirm apply within %ds, waiting for rollback…" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 +msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 +msgid "File" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 +msgid "" +"File listing upstream resolvers, optionally domain-specific, e.g. " +"server=1.2.3.4, server=/domain/1.2.3.4." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 +msgid "File not accessible" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 +msgid "File to store DHCP lease information." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +msgid "File with upstream resolvers." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 +msgid "Filename" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 +msgid "Filename of the boot image advertised to clients." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:315 +msgid "Filesystem" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 +msgid "Filter private" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 +msgid "Filtering for all slaves, no validation" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:390 +msgid "Filtering for all slaves, validation only for active slave" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:391 +msgid "Filtering for all slaves, validation only for backup slaves" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 +msgid "Finalizing failed" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 +msgid "" +"Find all currently attached filesystems and swap and replace configuration " +"with defaults based on what was detected" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 +msgid "Find and join network" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/delegator.htm:9 +msgid "Finish" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:27 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:43 +msgid "Firewall" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +msgid "Firewall Mark" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 +msgid "Firewall Settings" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:326 +msgid "Firewall Status" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 +msgid "Firewall mark" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 +msgid "Firmware File" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +msgid "Firmware Version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 +msgid "Fixed source port for outbound DNS queries." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:312 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:449 +msgid "Flash image..." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:308 +msgid "Flash image?" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:439 +msgid "Flash new firmware image" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:384 +msgid "Flash operations" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:317 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:319 +msgid "Flashing…" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 +msgid "Force" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 +msgid "Force 40MHz mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +msgid "Force CCMP (AES)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 +msgid "Force DHCP on this network even if another server is detected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 +msgid "Force IGMP version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 +msgid "Force MLD version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 +msgid "Force TKIP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 +msgid "Force TKIP and CCMP (AES)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 +msgid "Force link" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:281 +msgid "Force upgrade" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:90 +msgid "Force use of NAT-T" +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:8 +msgid "Form token mismatch" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 +msgid "" +"Forward NDP NS and NA messages between the " +"designated master interface and downstream interfaces." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 +msgid "" +"Forward RA " +"messages received on the designated master interface to downstream " +"interfaces." +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:164 +msgid "Forward DHCP traffic" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 +msgid "" +"Forward DHCPv6 messages between the designated master interface and " +"downstream interfaces." +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 +msgid "Forward broadcast traffic" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 +msgid "Forward delay" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +msgid "Forward mesh peer traffic" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 +msgid "Forward multicast packets as unicast packets on this device." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 +msgid "Forwarding mode" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +msgid "Fragmentation Threshold" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:62 +msgctxt "nft nat flag fully-random" +msgid "Full port randomization" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:214 +msgid "" +"Further information about WireGuard interfaces and peers at wireguard.com." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 +msgid "GHz" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 +msgid "GPRS only" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:10 +msgid "GRE tunnel over IPv4" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:10 +msgid "GRE tunnel over IPv6" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:10 +msgid "GRETAP tunnel over IPv4" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:10 +msgid "GRETAP tunnel over IPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 +msgid "Gateway" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 +msgid "Gateway Ports" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:11 +#: modules/luci-compat/luasrc/model/network.lua:29 +msgid "Gateway address is invalid" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 +msgid "General Settings" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 +msgid "General Setup" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 +msgid "General device options" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 +msgid "Generate Config" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +msgid "Generate PMK locally" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:396 +msgid "Generate archive" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 +msgid "Generate configuration" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 +msgid "Generate configuration…" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:109 +msgid "Generate new key pair" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 +msgid "Generate preshared key" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 +msgid "Generates a configuration suitable for import on a WireGuard peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 +msgid "Generating QR code…" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:79 +msgid "Given password confirmation did not match, password not changed!" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:146 +msgid "Global Settings" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 +msgid "Global network options" +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 +msgid "Go to firmware upgrade..." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 +msgid "Go to password configuration..." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2640 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 +#: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 +msgid "Go to relevant configuration page" +msgstr "" + +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 +msgid "Grant access to DHCP configuration" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 +msgid "Grant access to DHCP status display" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 +msgid "Grant access to DSL status display" +msgstr "" + +#: protocols/luci-proto-openconnect/root/usr/share/rpcd/acl.d/luci-openconnect.json:3 +msgid "Grant access to LuCI OpenConnect procedures" +msgstr "" + +#: protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json:3 +msgid "Grant access to LuCI Wireguard procedures" +msgstr "" + +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 +msgid "Grant access to SSH configuration" +msgstr "" + +#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:12 +msgid "Grant access to basic LuCI procedures" +msgstr "" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:79 +msgid "Grant access to crontab configuration" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:70 +msgid "Grant access to firewall status" +msgstr "" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:132 +msgid "Grant access to flash operations" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:3 +msgid "Grant access to main status display" +msgstr "" + +#: protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json:3 +msgid "Grant access to mmcli" +msgstr "" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:100 +msgid "Grant access to mount configuration" +msgstr "" + +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:3 +msgid "Grant access to network configuration" +msgstr "" + +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 +msgid "Grant access to network diagnostic tools" +msgstr "" + +#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:36 +msgid "Grant access to network status information" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 +msgid "Grant access to process status" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:3 +msgid "Grant access to realtime statistics" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:47 +msgid "Grant access to routing status" +msgstr "" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:57 +msgid "Grant access to startup configuration" +msgstr "" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:3 +msgid "Grant access to system configuration" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:30 +msgid "Grant access to system logs" +msgstr "" + +#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:43 +msgid "Grant access to uHTTPd configuration" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:61 +msgid "Grant access to wireless channel status" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 +msgid "Grant access to wireless status display" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66 +msgid "Group Password" +msgstr "" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:22 +msgid "Guest" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 +msgid "HE.net password" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 +msgid "HE.net username" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:64 +msgid "HTTP(S) Access" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:46 +msgid "Hang Up" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +msgid "Heartbeat interval (kernel: heartbeat)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 +msgid "Hello interval" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:114 +msgid "" +"Here you can configure the basic aspects of your device like its hostname or " +"the timezone." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 +msgid "Hide ESSID" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:332 +msgid "Hide empty chains" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +msgid "High" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 +msgctxt "Chain hook description" +msgid "Hook: %h (%h), Priority: %d" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 +msgid "Host" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 +msgid "Host expiry timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 +msgid "Host requests this filename from the boot server." +msgstr "" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 +msgid "Host-Uniq tag content" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 +msgid "Hostname" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:22 +msgid "Hostname to send when requesting DHCP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 +msgid "Hostnames" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 +msgid "" +"Hostnames are used to bind a domain name to an IP address. This setting is " +"redundant for hostnames already configured with static leases, but it can be " +"useful to rebind an FQDN." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:19 +msgid "How long (in milliseconds) the LED should be off" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:13 +msgid "How long (in milliseconds) the LED should be on" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 +msgid "Human-readable counters" +msgstr "" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:24 +msgid "Hybrid" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:49 +msgctxt "nft icmp code" +msgid "ICMP code" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:50 +msgctxt "nft icmp type" +msgid "ICMP type" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:51 +msgctxt "nft icmpv6 code" +msgid "ICMPv6 code" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:52 +msgctxt "nft icmpv6 type" +msgid "ICMPv6 type" +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 +msgid "ID used to uniquely identify the VXLAN" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:208 +msgid "IEEE 802.3ad Dynamic link aggregation (802.3ad, 4)" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:75 +msgid "IKE DH Group" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 +msgid "IP Addresses" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +msgid "IP Protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +msgid "IP Sets" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +msgid "IP Type" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 +msgid "IP address" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:10 +#: modules/luci-compat/luasrc/model/network.lua:28 +msgid "IP address is invalid" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:13 +#: modules/luci-compat/luasrc/model/network.lua:31 +msgid "IP address is missing" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +msgid "" +"IP addresses that are allowed inside the tunnel. The peer will accept " +"tunnelled packets with source IP addresses matching this list and route back " +"packets with matching destination IP." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 +msgctxt "nft ip protocol" +msgid "IP protocol" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 +msgctxt "nft meta l4proto" +msgid "IP protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 +msgid "IP set" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +msgid "IP sets" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +msgid "IPs to override with NXDOMAIN" +msgstr "" + +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:9 +msgid "IPsec XFRM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +msgid "IPv4" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:351 +msgid "IPv4 Firewall" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:252 +msgid "IPv4 Neighbours" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:251 +msgid "IPv4 Routing" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 +msgid "IPv4 Rules" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 +msgid "IPv4 Upstream" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 +msgid "IPv4 address" +msgstr "" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:29 +msgid "IPv4 assignment length" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:181 +msgid "IPv4 broadcast" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:180 +msgid "IPv4 gateway" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:179 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:170 +msgid "IPv4 netmask" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:305 +msgid "IPv4 network in address/netmask notation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 +msgid "IPv4 only" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:52 +msgid "IPv4 prefix" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 +msgid "IPv4 prefix length" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 +msgid "IPv4 traffic table \"%h\"" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 +msgid "IPv4+IPv6" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ipip.lua:9 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:10 +msgid "IPv4-in-IPv4 (RFC2003)" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 +msgid "IPv4/IPv6 (both - defaults to IPv4)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 +msgid "IPv4/IPv6 traffic table \"%h\"" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:94 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:95 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:96 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 +msgid "IPv6" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:354 +msgid "IPv6 Firewall" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 +msgid "IPv6 MTU" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:262 +msgid "IPv6 Neighbours" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 +msgid "IPv6 RA Settings" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:261 +msgid "IPv6 Routing" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 +msgid "IPv6 Rules" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 +msgid "IPv6 Settings" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 +msgid "IPv6 ULA-Prefix" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 +msgid "IPv6 Upstream" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:135 +msgid "IPv6 address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 +msgid "IPv6 assignment hint" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 +msgid "IPv6 assignment length" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:188 +msgid "IPv6 gateway" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:310 +msgid "IPv6 network in address/netmask notation" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 +msgid "IPv6 only" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 +msgid "IPv6 preference" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 +msgid "IPv6 prefix" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 +msgid "IPv6 prefix filter" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 +msgid "IPv6 prefix length" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 +msgid "IPv6 routed prefix" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 +msgid "IPv6 source routing" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 +msgid "IPv6 suffix" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 +msgid "IPv6 support" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 +msgid "IPv6 traffic table \"%h\"" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:101 +msgid "IPv6-PD" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 +msgid "IPv6-in-IPv4 (RFC4213)" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:17 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:9 +msgid "IPv6-over-IPv4 (6rd)" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:15 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:9 +msgid "IPv6-over-IPv4 (6to4)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 +msgid "Identity" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 +msgid "If checked, 1DES is enabled" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 +msgid "If checked, adds \"+ipv6\" to the pppd options" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 +msgid "If checked, encryption is disabled" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 +msgid "" +"If set, downstream subnets are only allocated from the given IPv6 prefix " +"classes." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 +msgid "If set, the meaning of the match options is inverted" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 +msgid "" +"If specified, mount the device by its UUID instead of a fixed device node" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:377 +msgid "" +"If specified, mount the device by the partition label instead of a fixed " +"device node" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 +msgid "" +"If the IP address used to access LuCI changes, a manual reconnect to " +"the new IP is required within %d seconds to confirm the settings, " +"otherwise modifications will be reverted." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 +msgid "If unchecked, no default route is configured" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 +msgid "If unchecked, the advertised DNS server addresses are ignored" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 +msgid "" +"If your physical memory is insufficient unused data can be temporarily " +"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a " +"very slow process as the swap-device cannot be accessed with the high " +"datarates of the RAM." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +msgid "Ignore /etc/hosts" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +msgid "Ignore interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +msgid "Ignore resolv file" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:447 +msgid "Image" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:273 +msgid "Image check failed:" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 +msgid "Import as peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 +msgid "Import configuration" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 +msgid "Import configuration as peer…" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 +msgid "Import settings" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 +msgid "Imported peer configuration" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 +msgid "Imports settings from an existing WireGuard configuration file" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:68 +msgid "In" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 +msgid "" +"In order to prevent unauthorized access to the system, your request has been " +"blocked. Click \"Continue »\" below to return to the previous page." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 +msgid "In seconds" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:156 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:114 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:92 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:101 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:124 +msgid "Inactivity timeout" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:267 +msgid "Inbound:" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:262 +msgid "" +"Include in backup a list of current installed packages at /etc/backup/" +"installed_packages.txt" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:100 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:105 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:102 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:107 +msgid "Incoming checksum" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 +msgid "Incoming interface" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 +msgid "Incoming key" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:102 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:107 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:104 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:109 +msgid "Incoming serialization" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:187 +msgid "Info" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 +msgid "Information" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 +msgid "Ingress QoS mapping" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +msgctxt "nft meta iif" +msgid "Ingress device id" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 +msgctxt "nft meta iifname" +msgid "Ingress device name" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 +msgid "Initialization failure" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:77 +msgid "Initscript" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:111 +msgid "Initscripts" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +msgid "Inner certificate constraint (Domain)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 +msgid "Inner certificate constraint (SAN)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 +msgid "Inner certificate constraint (Subject)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 +msgid "Inner certificate constraint (Wildcard)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 +msgid "Install protocol extensions..." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 +msgid "Instance" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 +msgid "" +"Instead of joining any network with a matching SSID, only connect to the " +"BSSID %h." +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/map.htm:43 +msgid "Insufficient permissions to read UCI configuration." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 +msgid "Interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 +msgid "Interface \"%h\" is already marked as designated master." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:62 +msgid "Interface %q device auto-migrated from %q to %q." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 +msgid "Interface Configuration" +msgstr "" + +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:39 +msgid "Interface ID" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:151 +msgid "Interface has %d pending changes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:92 +msgid "Interface is disabled" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:65 +msgid "Interface is marked for deletion" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:210 +msgid "Interface is reconnecting..." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:194 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:204 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:210 +msgid "Interface is shutting down..." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 +msgid "Interface is starting..." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 +msgid "Interface is stopping..." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 +msgid "Interface name" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 +msgid "Interface not present or not connected yet." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 +msgid "Interfaces" +msgstr "" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:20 +msgid "Internal" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 +msgid "Interval For Sending Learning Packets" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 +msgid "" +"Interval in centiseconds between multicast general queries. By varying the " +"value, an administrator may tune the number of IGMP messages on the subnet; " +"larger values cause IGMP Queries to be sent less often" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 +msgid "Interval in seconds for STP hello packets" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:192 +#: modules/luci-compat/luasrc/view/cbi/tsection.htm:42 +msgid "Invalid" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 +msgid "Invalid APN provided" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:40 +msgid "Invalid Base64 key string" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 +msgid "Invalid TOS value, expected 00..FF or inherit" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:83 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:88 +msgid "Invalid Traffic Class value, expected 00..FF or inherit" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:285 +msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:294 +msgid "Invalid VLAN ID given! Only unique IDs are allowed" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:403 +msgid "Invalid argument" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 +msgid "" +"Invalid bearer list. Possibly too many bearers created. This protocol " +"supports one and only one bearer." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:402 +msgid "Invalid command" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:205 +msgid "Invalid hexadecimal value" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 +msgid "Invalid username and/or password! Please try again." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 +msgid "Invert match" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 +msgid "Isolate Clients" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:236 +msgid "" +"It appears that you are trying to flash an image that does not fit into the " +"flash memory, please verify the image file!" +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 +msgid "JavaScript required!" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 +msgid "Join Network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 +msgid "Join Network: Wireless Scan" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 +msgid "Joining Network: %q" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 +msgid "Jump to rule" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:228 +msgid "Keep settings and retain the current configuration" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 +msgid "Kernel Log" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +msgid "Kernel Version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 +msgid "Key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 +msgid "Key #%d" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 +msgid "Key for incoming packets (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:96 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 +msgid "Key for outgoing packets (optional)." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +msgctxt "Label indicating that WireGuard peer lacks public key" +msgid "Key missing" +msgstr "" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 +msgctxt "nft unit" +msgid "KiB" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:54 +msgid "Kill" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:21 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:10 +msgid "L2TP" +msgstr "" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:40 +msgid "L2TP Server" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:269 +msgid "LACPDU Packets" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:130 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:102 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:88 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:62 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:75 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:98 +msgid "LCP echo failure threshold" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:143 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:101 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:75 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:88 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:111 +msgid "LCP echo interval" +msgstr "" + +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:115 +msgid "LED Configuration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 +msgid "LLC" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:377 +msgid "Label" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:225 +msgid "Language" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:125 +msgid "Language and Style" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +msgid "Last member interval" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "" + +#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 +msgid "Leaf" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 +msgid "Learn" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Learn routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 +msgid "Lease file" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 +msgid "Lease time" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:41 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:90 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:137 +msgid "Lease time remaining" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 +msgid "Leave empty to autodetect" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:40 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:45 +msgid "Leave empty to use the current WAN address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 +msgid "" +"Legacy or badly behaving devices may require legacy 802.11b rates to " +"interoperate. Airtime efficiency may be significantly reduced where these " +"are used. It is recommended to not allow 802.11b rates where possible." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 +msgid "Legacy rules detected" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 +msgid "Legend:" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +msgid "Limit" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 +msgid "Line Mode" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 +msgid "Line State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 +msgid "Line Uptime" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:125 +msgid "Link Aggregation (Channel Bonding)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:349 +msgid "Link Monitoring" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:24 +msgid "Link On" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:77 +msgctxt "nft @ll,off,len" +msgid "Link layer header bits %d-%d" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +msgid "List of IP addresses to convert into NXDOMAIN responses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 +msgid "" +"List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" +"Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " +"(NAS Identifier) to a destination MAC address when requesting PMK-R1 key " +"from the R0KH that the STA used during the Initial Mobility Domain " +"Association." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 +msgid "" +"List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " +"as 6 octets with colons,128-bit key as hex string.
    This list is used " +"to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the " +"R0KH. This is also the list of authorized R1KHs in the MD that can request " +"PMK-R1 keys." +msgstr "" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:82 +msgid "List of SSH key files for auth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 +msgid "List of domains to allow RFC1918 responses for." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 +msgid "List of upstream resolvers to forward queries to." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 +msgid "Listen Port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 +msgid "Listen interfaces" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 +msgid "Listen only on the given interface or, if unspecified, on all" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +msgid "" +"Listen only on the specified interfaces, and loopback if not excluded " +"explicitly." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:299 +msgid "ListenPort setting is invalid" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +msgid "Listening port for inbound DNS queries." +msgstr "" + +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:130 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:54 +msgid "Load" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 +msgid "Load Average" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:189 +msgid "Load configuration…" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 +msgid "Loading data…" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 +msgid "Loading directory contents…" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 +msgid "Loading view…" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 +msgid "Local" +msgstr "" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 +msgid "Local IP address" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:12 +#: modules/luci-compat/luasrc/model/network.lua:30 +msgid "Local IP address is invalid" +msgstr "" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:86 +msgid "Local IP address to assign" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:40 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 +msgid "Local IPv4 address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +msgid "Local IPv6 DNS server" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:53 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:54 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:45 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 +msgid "Local IPv6 address" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:115 +msgid "Local Startup" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 +msgid "Local Time" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 +msgid "Local ULA" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 +msgid "Local domain" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +msgid "Local domain suffix appended to DHCP names and hosts file entries." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +msgid "Local server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 +msgid "Local service only" +msgstr "" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 +msgid "Localise queries" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 +msgid "Lock to BSSID" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 +msgid "Log output level" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 +msgid "Log queries" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:123 +msgid "Logging" +msgstr "" + +#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:23 +msgid "Logging in…" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 +msgid "" +"Logical network from which to select the local endpoint if local IPv6 " +"address is empty and no WAN IPv6 is available (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 +msgid "Logical network to which the tunnel will be added (bridged) (optional)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +msgid "Loose filtering" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +msgid "Lowest leased address as offset from the network address." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 +msgid "MAC" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 +msgid "MAC Address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 +msgid "MAC Address Filter" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:253 +msgid "MAC Address For The Actor" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 +msgid "MAC VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:179 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:205 +msgid "MAC address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +msgid "MAC-Filter" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 +msgid "MAC-List" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:16 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:13 +msgid "MAP / LW4over6" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:62 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:7 +msgid "MAP rule is invalid" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 +#, fuzzy +msgid "MD5" +msgstr "MD5" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:28 +msgid "MHz" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:354 +msgid "MII" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:422 +msgid "MII / ETHTOOL ioctls" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:395 +msgid "MII Interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 +msgid "MTU" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 +msgid "" +"Make sure to clone the root filesystem using something like the commands " +"below:" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:58 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:71 +msgid "Manual" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 +msgid "Master" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "Max RA interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 +msgid "Max. DHCP leases" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 +msgid "Max. EDNS0 packet size" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 +msgid "Max. concurrent queries" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +msgid "Maximum age" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 +msgid "Maximum allowed Listen Interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 +msgid "Maximum allowed number of active DHCP leases." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 +msgid "Maximum allowed number of concurrent DNS queries." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 +msgid "Maximum allowed size of EDNS0 UDP packets." +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 +msgid "Maximum amount of seconds to wait for the modem to become ready" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +msgid "Maximum number of leased addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 +msgid "Maximum snooping table size" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 +msgid "" +"Maximum time allowed between sending unsolicited RA. Default is 600 seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 +msgid "Maximum transmit power" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:28 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:171 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:323 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:324 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:325 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:329 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:330 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:331 +msgid "Mbit/s" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 +msgid "Medium" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:24 +msgid "Memory" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:73 +msgid "Memory usage (%)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 +msgid "Mesh" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 +msgid "Mesh ID" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 +msgid "Mesh Id" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 +msgid "Method not found" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:350 +msgid "Method of link monitoring" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:419 +msgid "Method to determine link status" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 +msgid "Metric" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:70 +msgctxt "nft unit" +msgid "MiB" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 +msgid "Min RA interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 +msgid "Minimum ARP validity time" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:237 +msgid "Minimum Number of Links" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 +msgid "" +"Minimum required time in seconds before an ARP entry may be replaced. " +"Prevents ARP cache thrashing." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 +msgid "" +"Minimum time allowed between sending unsolicited RA. Default is 200 seconds." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:204 +msgid "Mirror monitor port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:203 +msgid "Mirror source port" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 +msgid "Mobile Data" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 +msgid "Mobility Domain" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 +msgid "Mode" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 +msgid "Model" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 +msgid "" +"Modem connection in progress. Please wait. This process will timeout after 2 " +"minutes." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 +msgid "Modem default" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 +msgid "Modem device" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 +msgid "Modem information query failed" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 +msgid "Modem init timeout" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 +msgid "ModemManager" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 +msgid "Monitor" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 +msgid "More Characters" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2581 +msgid "More…" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:192 +msgid "Mount Point" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:144 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:102 +msgid "Mount Points" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:229 +msgid "Mount Points - Mount Entry" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:341 +msgid "Mount Points - Swap Entry" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 +msgid "" +"Mount Points define at which point a memory device will be attached to the " +"filesystem" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 +msgid "Mount attached devices" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 +msgid "Mount filesystems not specifically configured" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:332 +msgid "Mount options" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 +msgid "Mount point" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 +msgid "Mount swap not specifically configured" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:223 +msgid "Mounted file systems" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 +msgid "Move down" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 +msgid "Move up" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:96 +msgid "Multicast" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 +msgid "Multicast routing" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 +msgid "Multicast to unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 +msgid "NAS ID" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 +msgid "NAT action chain \"%h\"" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:87 +msgid "NAT-T Mode" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 +msgid "NAT64 Prefix" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 +msgid "NCM" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 +msgid "NDP-Proxy slave" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:72 +msgid "NT Domain" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:300 +msgid "NTP server candidates" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2618 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 +msgid "Name" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 +msgid "Name of the new network" +msgstr "" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 +msgid "Navigation" +msgstr "" + +#: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:10 +msgid "Nebula Network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 +msgid "Neighbour cache validity" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:186 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:212 +msgid "Network" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 +msgid "Network Mode" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 +msgid "Network address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 +msgid "Network boot image" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 +msgid "Network bridge configuration migration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 +msgid "Network device" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:7 +msgid "Network device activity (kernel: netdev)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:15 +#: modules/luci-compat/luasrc/model/network.lua:33 +msgid "Network device is not present" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 +msgid "Network device table \"%h\"" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:78 +msgctxt "nft @nh,off,len" +msgid "Network header bits %d-%d" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 +msgid "Network ifname configuration migration" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 +msgid "Network interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 +msgid "Network-ID" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 +msgid "Never" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +msgid "" +"Never forward matching domains and subdomains, resolve from DHCP or hosts " +"files only." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 +msgid "New interface for \"%s\" can not be created: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 +msgid "New interface name…" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/delegator.htm:11 +msgid "Next »" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 +msgid "No" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 +msgid "No DHCP Server configured for this interface" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:202 +msgid "No Data" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 +msgid "No Encryption" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:185 +msgid "No Host Routes" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:89 +msgid "No NAT-T" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 +msgid "No RX signal" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 +msgid "" +"No changes to settings will be stored and are lost after rebooting. This " +"mode should only be used to install a firmware upgrade" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:69 +msgid "No client associated" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 +msgctxt "empty table placeholder" +msgid "No data" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:406 +msgid "No data received" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 +msgid "No enforcement" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:229 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:232 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:235 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:238 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:241 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:244 +msgid "No entries available" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 +msgid "No entries in this directory" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 +msgid "" +"No fixed interface listening port defined, peers might not be able to " +"initiate connections to this WireGuard instance!" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:88 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:70 +msgid "No host route" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 +msgid "No information available" +msgstr "کوئی معلومات دستیاب نہیں" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:63 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:8 +msgid "No matching prefix delegation" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:142 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:145 +msgid "No more slaves available" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:189 +msgid "No more slaves available, can not save interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +msgid "No negative cache" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 +msgid "No nftables ruleset loaded." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 +msgid "No password set!" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 +msgid "No peers defined yet." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +msgid "No public keys present yet." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 +msgctxt "nft chain is empty" +msgid "No rules in this chain" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:91 +msgid "No rules in this chain." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:385 +msgid "No validation or filtering" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 +msgid "No zone assigned" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:58 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:84 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:187 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:279 +msgid "Noise" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 +msgid "Noise:" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 +msgid "Non-wildcard" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 +msgid "None" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 +msgid "Normal" +msgstr "" + +#: modules/luci-base/ucode/template/error404.ut:9 +msgid "Not Found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 +msgid "Not associated" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 +msgid "Not connected" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 +msgid "Not present" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 +msgid "Not started on boot" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:409 +msgid "Not supported" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 +msgid "" +"Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " +"have problems" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 +msgid "Notes" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:188 +msgid "Notice" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 +msgid "Nslookup" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:333 +msgid "Number of IGMP membership reports" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 +msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:311 +msgid "Number of peer notifications after failover event" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:69 +msgid "Obfuscated Group Password" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:61 +msgid "Obfuscated Password" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:54 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 +msgid "Obtain IPv6 address" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 +msgid "Off" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:18 +msgid "Off-State Delay" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +msgid "On" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:12 +msgid "On-State Delay" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 +msgid "On-link" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 +msgid "One of hostname or MAC address must be specified!" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 +msgid "One of the following: %s" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/nullsection.htm:17 +#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:22 +msgid "One or more fields contain invalid values!" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/map.htm:32 +msgid "One or more invalid/required values on tab" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/nullsection.htm:19 +#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:24 +msgid "One or more required fields have no value!" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 +msgid "Only allow communication with non-isolated bridge ports when enabled" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:231 +msgid "" +"Only if current active slave fails and the primary slave is up (failure, 2)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 +msgid "Open iptables rules overview…" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 +msgid "Open list..." +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 +msgid "OpenConnect (CISCO AnyConnect)" +msgstr "" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 +msgid "OpenFortivpn" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 +msgid "" +"Operate in relay mode if a designated master interface is " +"configured and active, otherwise disable NDP proxying." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 +msgid "" +"Operate in relay mode if a designated master interface is " +"configured and active, otherwise fall back to server mode." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 +msgid "" +"Operate in relay mode if an upstream IPv6 prefix is present, " +"otherwise disable service." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 +msgid "Operating frequency" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2006 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 +msgid "Option \"%s\" contains an invalid input value." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2021 +msgid "Option \"%s\" must not be empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 +msgid "Option changed" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 +msgid "Option removed" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 +msgid "Optional" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 +msgid "Optional, free-form notes about this device" +msgstr "" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +msgid "" +"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " +"starting with 0x." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 +msgid "" +"Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " +"'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " +"server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') " +"for the interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 +msgid "" +"Optional. Base64-encoded preshared key. Adds in an additional layer of " +"symmetric-key cryptography for post-quantum resistance." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 +msgid "Optional. Create routes for Allowed IPs for this peer." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +msgid "Optional. Description of peer." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:185 +msgid "Optional. Do not create host routes to peers." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 +msgid "" +"Optional. Host of peer. Names are resolved prior to bringing up the " +"interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +msgid "" +"Optional. IP addresses and prefixes that this peer is allowed to use inside " +"the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " +"routes through the tunnel." +msgstr "" + +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 +msgid "Optional. Maximum Transmission Unit of the XFRM interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 +msgid "Optional. Maximum Transmission Unit of tunnel interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 +msgid "Optional. Port of peer." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 +msgid "" +"Optional. Private key of the WireGuard peer. The key is not required for " +"establishing a connection but allows generating a peer configuration or QR " +"code if available. It can be removed after the configuration has been " +"exported." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 +msgid "" +"Optional. Seconds between keep alive messages. Default is 0 (disabled). " +"Recommended value if this device is behind a NAT is 25." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +msgid "Optional. UDP port used for outgoing and incoming packets." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:72 +msgid "Options" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 +msgid "" +"Options for the Network-ID. (Note: needs also Network-ID.) E.g. " +"\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" for default route. 0.0.0.0 means \"the address of the " +"system running dnsmasq\"." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 +msgid "Options:" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 +msgid "Other:" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:69 +msgid "Out" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:277 +msgid "Outbound:" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:101 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:106 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:103 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:108 +msgid "Outgoing checksum" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 +msgid "Outgoing interface" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:96 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 +msgid "Outgoing key" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:103 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:108 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110 +msgid "Outgoing serialization" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:50 +msgid "Output Interface" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 +msgid "Output zone" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:16 +msgid "Overlap" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 +msgid "Override IPv4 routing table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 +msgid "Override IPv6 routing table" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:96 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 +msgid "Override MTU" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:79 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:62 +msgid "Override TOS" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:69 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:79 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:62 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:57 +msgid "Override TTL" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +msgid "" +"Override default MAC address - the range of usable addresses might be " +"limited by the driver" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 +msgid "Override default interface name" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 +msgid "Override the gateway in DHCP responses" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 +msgid "" +"Override the netmask sent to clients. Normally it is calculated from the " +"subnet that is served." +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 +msgid "Override the table used for internal routes" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:3 +msgid "Overview" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 +msgid "Overwrite existing file \"%s\" ?" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:355 +msgid "Overwrite the current settings with the imported configuration?" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 +msgid "Owner" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 +msgid "PAP/CHAP (both)" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:44 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:63 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:94 +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:46 +msgid "PAP/CHAP password" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:42 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:61 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:89 +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:44 +msgid "PAP/CHAP username" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 +msgid "PDP Type" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:69 +msgid "PID" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 +msgid "PIN" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:21 +#: modules/luci-compat/luasrc/model/network.lua:39 +msgid "PIN code rejected" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 +msgid "PMK R1 Push" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:13 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:43 +msgid "PPP" +msgstr "" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:58 +msgid "PPPoA Encapsulation" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:19 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:28 +msgid "PPPoATM" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:17 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:28 +msgid "PPPoE" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_pppossh.lua:9 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:28 +msgid "PPPoSSH" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:15 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:28 +msgid "PPtP" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:73 +msgid "PSID offset" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:70 +msgid "PSID-bits length" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 +msgctxt "Label indicating that WireGuard peer uses a PSK" +msgid "PSK" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 +msgid "PTM/EFM (Packet Transfer Mode)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +msgid "PXE/TFTP Settings" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 +msgid "Packet Steering" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 +msgctxt "nft meta mark" +msgid "Packet mark" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 +msgid "Packets" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:277 +msgid "Packets To Transmit Before Moving To Next Slave" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "" +msgstr[1] "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 +msgid "Part of zone %q" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 +msgctxt "MACVLAN mode" +msgid "Pass-through (Mirror physical device to single MAC VLAN)" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 +msgid "Password" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 +msgid "Password authentication" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 +msgid "Password of Private Key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 +msgid "Password of inner Private Key" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 +msgid "Password strength" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 +msgid "Password2" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 +msgid "Paste or drag SSH key file…" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 +msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +msgid "" +"Paste or drag a WireGuard configuration (commonly wg0.conf) from " +"another system below to create a matching peer entry allowing that system to " +"connect to the local WireGuard interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 +msgid "Paste or drag supplied WireGuard configuration file…" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +msgid "Path to CA-Certificate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 +msgid "Path to Client-Certificate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 +msgid "Path to Private Key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 +msgid "Path to inner CA-Certificate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 +msgid "Path to inner Client-Certificate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 +msgid "Path to inner Private Key" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2727 +msgid "Paused" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:273 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:283 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:334 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:344 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:354 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:239 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:249 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:259 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:268 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:278 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:296 +msgid "Peak:" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 +msgid "Peer IP address to assign" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 +msgid "Peer MAC address" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:14 +#: modules/luci-compat/luasrc/model/network.lua:32 +msgid "Peer address is missing" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 +msgid "Peer device name" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 +msgid "Peer disabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:214 +msgid "Peers" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:80 +msgid "Perfect Forward Secrecy" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:103 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:108 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110 +msgid "Perform outgoing packets serialization (optional)." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:34 +msgid "Perform reboot" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:406 +msgid "Perform reset" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:407 +msgid "Permission denied" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 +msgid "Persistent Keep Alive" +msgstr "" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 +msgid "PersistentKeepAlive setting is invalid" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:290 +msgid "Phy Rate:" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 +msgid "Physical Settings" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 +msgid "Ping" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:50 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:84 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:85 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:138 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:64 +msgid "Pkts." +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:19 +msgid "Please enter your username and password." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 +msgid "Please select the file to upload." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 +msgid "Policy" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 +msgctxt "Chain hook policy" +msgid "Policy: %h (%h)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 +msgid "Port" +msgstr "پورٹ" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 +msgid "Port isolation" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 +msgid "Port status:" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 +msgid "Potential negation of: %s" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +msgid "Prefer LTE" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +msgid "Prefer UMTS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 +msgid "Prefix Delegated" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 +msgid "Prefix suppressor" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 +msgid "Preshared Key" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 +msgid "Preshared key in use" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:308 +msgid "PresharedKey setting is invalid" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:130 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:102 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:88 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:62 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:75 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:98 +msgid "" +"Presume peer to be dead after given amount of LCP echo failures, use 0 to " +"ignore failures" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 +msgid "Prevents client-to-client communication" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 +msgid "" +"Primary becomes active slave when it comes back up if speed and duplex " +"better than current slave (better, 1)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:229 +msgid "Primary becomes active slave whenever it comes back up (always, 0)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 +msgid "Priority" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 +msgctxt "Label indicating that WireGuard peer private key is stored" +msgid "Private" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 +msgctxt "MACVLAN mode" +msgid "Private (Prevent communication between MAC VLANs)" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 +msgid "Private Key" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 +msgid "Private key present" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:296 +msgid "PrivateKey setting is missing or invalid" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:64 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:93 +msgid "Processes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:67 +msgid "Prot." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:217 +msgid "Protocol" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:282 +msgid "Provide NTP server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 +msgid "" +"Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " +"and requests." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 +msgid "Provide new network" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:288 +msgid "" +"Provide the NTP server to the selected interface or, if unspecified, to all " +"interfaces" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 +msgid "Pseudo Ad-Hoc (ahdemo)" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 +msgid "Public Key" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 +msgid "Public key is missing" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 +msgctxt "Tooltip displaying full WireGuard peer public key" +msgid "Public key: %h" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 +msgid "" +"Public keys allow for the passwordless SSH logins with a higher security " +"compared to the use of plain passwords. In order to upload a new key to the " +"device, paste an OpenSSH compatible public key line or drag a .pub file into the input field." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 +msgid "Public prefix routed to this device for distribution to clients." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:305 +msgid "PublicKey setting is invalid" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:9 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:27 +msgid "QMI Cellular" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 +msgid "Quality" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 +msgid "Query all available upstream resolvers." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 +msgid "Query interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 +msgid "Query response interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 +msgid "R0 Key Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 +msgid "R1 Key Holder" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 +msgid "RADIUS Accounting Port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 +msgid "RADIUS Accounting Secret" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 +msgid "RADIUS Accounting Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 +msgid "RADIUS Authentication Port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 +msgid "RADIUS Authentication Secret" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 +msgid "RADIUS Authentication Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 +msgid "RFC3947 NAT-T mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +msgid "RSSI threshold for joining" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 +msgid "RTS/CTS Threshold" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:84 +msgid "RX" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:236 +msgid "RX Rate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 +msgid "RX Rate / TX Rate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 +msgctxt "nft nat flag random" +msgid "Randomize source port mapping" +msgstr "" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 +msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 +msgid "Read /etc/ethers to configure the DHCP server." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 +msgid "Really switch protocol?" +msgstr "" + +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:118 +msgid "Realtime Graphs" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +msgid "Reassociation Deadline" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +msgid "Rebind protection" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:20 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:140 +msgid "Reboot" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:153 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:162 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:46 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:51 +msgid "Rebooting…" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:21 +msgid "Reboots the operating system of your device" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:26 +msgid "Receive" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 +msgid "Recommended. IP addresses of the WireGuard interface." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 +msgid "Reconnect this interface" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:14 +msgid "Redirect to HTTPS" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 +msgctxt "nft redirect to port" +msgid "Redirect to local port %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +msgctxt "nft redirect" +msgid "Redirect to local system" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:57 +msgid "References" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 +msgid "Refreshing" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +msgctxt "nft reject with icmp type" +msgid "Reject IPv4 packet with ICMP type %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 +msgctxt "nft reject with icmpx type" +msgid "Reject packet with ICMP type %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +msgctxt "nft reject with icmpv6 type" +msgid "Reject packet with ICMPv6 type %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +msgctxt "nft reject with tcp reset" +msgid "Reject packet with TCP reset" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 +msgid "" +"Reject routing decisions that have a prefix length less than or equal to the " +"specified value" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 +msgid "Relay" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_relay.lua:157 +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:36 +msgid "Relay Bridge" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 +msgid "Relay between networks" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_relay.lua:12 +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:64 +msgid "Relay bridge" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 +msgid "Remote IPv4 address" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 +msgid "Remote IPv4 address or FQDN" +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 +msgid "Remote IPv6 address" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 +msgid "Remote IPv6 address or FQDN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 +msgid "Remove" +msgstr "ہٹا دیا" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 +msgid "Remove related device settings from the configuration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 +msgid "Replace wireless configuration" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:17 +msgid "Request IPv6-address" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:23 +msgid "Request IPv6-prefix of length" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:408 +msgid "Request timeout" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:100 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:105 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:102 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:107 +msgid "Require incoming checksum (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:102 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:107 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:104 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:109 +msgid "Require incoming packets serialization (optional)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 +msgid "Required" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 +msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 +msgid "Required. Base64-encoded private key for this interface." +msgstr "" + +#: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 +msgid "Required. Path to the .yml config file for this interface." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +msgid "Required. Public key of the WireGuard peer." +msgstr "" + +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:42 +msgid "Required. Underlying interface." +msgstr "" + +#: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:39 +msgid "Required. XFRM interface ID to be used for SA." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +msgid "Requires hostapd" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 +msgid "Requires hostapd with EAP Suite-B support" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +msgid "Requires hostapd with EAP support" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 +msgid "Requires hostapd with OWE support" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +msgid "Requires hostapd with SAE support" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +msgid "Requires hostapd with WEP support" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 +msgid "Requires wpa-supplicant" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 +msgid "Requires wpa-supplicant with EAP Suite-B support" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +msgid "Requires wpa-supplicant with EAP support" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 +msgid "Requires wpa-supplicant with OWE support" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 +msgid "Requires wpa-supplicant with SAE support" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 +msgid "Requires wpa-supplicant with WEP support" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:226 +msgid "Reselection policy for primary slave" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 +#: modules/luci-base/ucode/template/sysauth.ut:39 +#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 +#: modules/luci-compat/luasrc/view/cbi/footer.htm:30 +#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 +msgid "Reset" +msgstr "دوبارہ ترتیب دیں" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:343 +msgid "Reset Counters" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:404 +msgid "Reset to defaults" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 +msgid "Resolv and Hosts Files" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +msgid "Resolv file" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 +msgid "Resource not found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 +msgid "Restart" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:348 +msgid "Restart Firewall" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 +msgid "Restart radio interface" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 +msgid "Restore" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:410 +msgid "Restore backup" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +msgid "" +"Return answers to DNS queries matching the subnet from which the query was " +"received if multiple IPs are available." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 +msgid "Reveal/hide password" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +msgid "Reverse path filter" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 +msgid "Revert" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 +msgid "Revert changes" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 +msgid "Revert request failed with status %h" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 +msgid "Reverting configuration…" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +msgctxt "nft dnat ip to addr" +msgid "Rewrite destination to %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +msgctxt "nft dnat ip6 to addr" +msgid "Rewrite destination to %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 +msgctxt "nft dnat ip to addr:port" +msgid "Rewrite destination to %h, port %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 +msgctxt "nft dnat ip6 to addr:port" +msgid "Rewrite destination to %h, port %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +msgctxt "nft snat ip to addr" +msgid "Rewrite source to %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +msgctxt "nft snat ip6 to addr" +msgid "Rewrite source to %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 +msgctxt "nft snat ip to addr:port" +msgid "Rewrite source to %h, port %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 +msgctxt "nft snat ip6 to addr:port" +msgid "Rewrite source to %h, port %h" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 +msgid "Rewrite to egress device address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 +msgid "Robustness" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 +msgid "" +"Root directory for files served via TFTP. Enable TFTP server and " +"TFTP server root turn on the TFTP server and serve files from " +"TFTP server root." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:298 +msgid "Root preparation" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:204 +msgid "Round-Robin policy (balance-rr, 0)" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 +msgid "Route Allowed IPs" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 +msgid "Route action chain \"%h\"" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 +msgid "Route type" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +msgid "" +"Router Lifetime published in RA messages. Maximum is 9000 seconds." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:26 +msgid "Router Password" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:50 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:248 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:15 +msgid "Routing" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 +msgid "" +"Routing defines over which interface and gateway a certain host or network " +"can be reached." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:218 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:198 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:224 +msgid "Rule" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 +msgid "Rule actions" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 +msgctxt "nft comment" +msgid "Rule comment: %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +msgid "Rule container chain \"%h\"" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 +msgid "Rule matches" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 +msgid "Rule type" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:336 +msgid "Run a filesystem check before mounting the device" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:336 +msgid "Run filesystem check" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2360 +msgid "Runtime error" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:224 +#, fuzzy +msgid "SHA256" +msgstr "SHA256" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 +msgid "SNR" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 +msgid "SSH Access" +msgstr "" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:70 +msgid "SSH server address" +msgstr "" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:74 +msgid "SSH server port" +msgstr "" + +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:58 +msgid "SSH username" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 +msgid "SSH-Keys" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 +msgid "SSID" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:9 +msgid "SSTP" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:41 +msgid "SSTP Server" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 +msgid "SWAP" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 +#: modules/luci-compat/luasrc/view/cbi/error.htm:17 +#: modules/luci-compat/luasrc/view/cbi/footer.htm:26 +#: modules/luci-compat/luasrc/view/cbi/header.htm:20 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:463 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:123 +msgid "Save" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 +#: modules/luci-compat/luasrc/view/cbi/footer.htm:22 +msgid "Save & Apply" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:607 +msgid "Save error" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:434 +msgid "Save mtdblock" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:424 +msgid "Save mtdblock contents" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 +msgid "Scan" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:28 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:90 +msgid "Scheduled Tasks" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 +msgid "Section added" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 +msgid "Section removed" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:332 +msgid "See \"mount\" manpage for details" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:283 +msgid "" +"Select 'Force upgrade' to flash the image even if the image format check " +"fails. Use only if you are sure that the firmware is correct and meant for " +"your device!" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 +msgid "Select file…" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:320 +msgid "Selects the transmit hash policy to use for slave selection" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 +msgid "" +"Send RA " +"messages advertising this device as IPv6 router." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 +msgid "Send ICMP redirects" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:143 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:101 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:75 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:88 +#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:111 +msgid "" +"Send LCP echo requests at the given interval in seconds, only effective in " +"conjunction with failure threshold" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:24 +msgid "Send the hostname of this device" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 +msgid "Server address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 +msgid "Server name" +msgstr "" + +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 +msgid "Service Name" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:88 +msgid "Service Type" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:36 +msgid "Services" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2664 +msgid "Session expired" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:175 +msgid "Set Static" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 +msgctxt "nft mangle" +msgid "Set header field %s to %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 +msgid "Set interface as NDP-Proxy external slave. Default is off." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 +msgid "" +"Set interface properties regardless of the link carrier (If set, carrier " +"sense events do not invoke hotplug handlers)." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:302 +msgid "Set same MAC Address to all slaves" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 +msgid "" +"Set the autonomous address-configuration flag in the prefix information " +"options of sent RA messages. " +"When enabled, clients will perform stateless IPv6 address autoconfiguration." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 +msgid "" +"Set this interface as master for RA and DHCPv6 relaying as well as NDP " +"proxying." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:306 +msgid "Set to currently active slave (active, 1)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:307 +msgid "Set to first slave added to the bond (follow, 2)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +msgid "Set up DHCP Server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 +#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 +msgid "Setting PLMN failed" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 +msgid "Setting operation mode failed" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 +msgid "Settings" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 +msgid "Short GI" +msgstr "شارٹ گارڈ انٹرویل" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 +msgid "Short Preamble" +msgstr "شورٹ Preamble" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 +msgid "Show current backup file list" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:293 +msgid "Show empty chains" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:338 +msgid "Show raw counters" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 +msgid "Shutdown this interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:284 +msgid "Signal" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 +msgid "Signal / Noise" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 +msgid "Signal Refresh Rate" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:262 +msgid "Signal:" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 +msgid "Size" +msgstr "سائز" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 +msgid "Size of DNS query cache" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:208 +msgid "Size of the ZRam device in megabytes" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/footer.htm:18 +#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:57 +msgid "Skip" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:257 +msgid "Skip from backup files that are equal to those in /rom" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 +msgid "Skip to content" +msgstr "" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 +msgid "Skip to navigation" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:180 +msgid "Slave Interfaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3002 +#: modules/luci-compat/luasrc/model/network.lua:1428 +msgid "Software VLAN" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/header.htm:5 +msgid "Some fields are invalid, cannot save values!" +msgstr "" + +#: modules/luci-base/ucode/template/error404.ut:10 +msgid "Sorry, the object you requested was not found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 +msgid "" +"Sorry, there is no sysupgrade support present; a new firmware image must be " +"flashed manually. Please refer to the wiki for device specific install " +"instructions." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 +msgid "Source" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:43 +msgctxt "nft ip saddr" +msgid "Source IP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:47 +msgctxt "nft ip6 saddr" +msgid "Source IPv6" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 +msgid "Source interface" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:45 +msgctxt "nft ip sport" +msgid "Source port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 +msgid "" +"Special PXE boot " +"options for Dnsmasq." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 +msgid "" +"Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " +"unspecified, the local device DNS search domain will be announced." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 +msgid "" +"Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " +"If left unspecified, the device will announce itself as IPv6 DNS server " +"unless the Local IPv6 DNS server option is disabled." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 +msgid "" +"Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " +"corresponding UID or 1000-1005 to inclusively match all UIDs within the " +"corresponding range" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:343 +msgid "" +"Specifies that duplicate frames (received on inactive ports) should be " +"dropped or delivered" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:359 +msgid "Specifies the ARP link monitoring frequency in milliseconds" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:367 +msgid "Specifies the IP addresses to use for ARP monitoring" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:396 +msgid "Specifies the MII link monitoring frequency in milliseconds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 +msgid "Specifies the TOS value to match in IP headers" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:261 +msgid "Specifies the aggregation selection logic to use" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 +msgid "Specifies the destination subnet to match (CIDR notation)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 +msgid "Specifies the directory the device is attached to" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +msgid "" +"Specifies the flags sent in RA " +"messages, for example to instruct clients to request further information via " +"stateful DHCPv6." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 +msgid "" +"Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " +"mark 255 or 0x0/0x1 to match any even mark value" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 +msgid "Specifies the incoming logical interface name" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 +msgid "" +"Specifies the logical interface name of the parent (or master) interface " +"this route belongs to" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:254 +msgid "" +"Specifies the mac-address for the actor in protocol packet exchanges " +"(LACPDUs). If empty, masters' mac address defaults to system default" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 +msgid "" +"Specifies the maximum amount of failed ARP requests until hosts are presumed " +"to be dead" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 +msgid "" +"Specifies the maximum amount of seconds after which hosts are presumed to be " +"dead" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 +msgid "" +"Specifies the maximum transmit power the wireless radio may use. Depending " +"on regulatory requirements and wireless usage, the actual transmit power may " +"be reduced by the driver." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:238 +msgid "" +"Specifies the minimum number of links that must be active before asserting " +"carrier" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:202 +msgid "Specifies the mode to be used for this bonding interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 +msgid "" +"Specifies the network gateway. If omitted, the gateway from the parent " +"interface is taken if any, otherwise creates a link scope route. If set to " +"0.0.0.0 no gateway will be specified for the route" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:334 +msgid "" +"Specifies the number of IGMP membership reports to be issued after a " +"failover event in 200ms intervals" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:278 +msgid "" +"Specifies the number of packets to transmit through a slave before moving to " +"the next one" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:312 +msgid "" +"Specifies the number of peer notifications (gratuitous ARPs and unsolicited " +"IPv6 Neighbor Advertisements) to be issued after a failover event" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:286 +msgid "" +"Specifies the number of seconds between instances where the bonding driver " +"sends learning packets to each slaves peer switch" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 +msgid "Specifies the ordering of the IP rules" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 +msgid "Specifies the outgoing logical interface name" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +msgid "" +"Specifies the preferred source address when sending to destinations covered " +"by the target" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:375 +msgid "Specifies the quantity of ARP IP targets that must be reachable" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:270 +msgid "" +"Specifies the rate in which the link partner will be asked to transmit " +"LACPDU packets" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:227 +msgid "" +"Specifies the reselection policy for the primary slave when failure of the " +"active slave or recovery of the primary slave occurs" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 +msgid "Specifies the route metric to use" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 +msgid "Specifies the route type to be created" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 +msgid "Specifies the rule target routing action" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 +msgid "Specifies the source subnet to match (CIDR notation)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:246 +msgid "Specifies the system priority" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:404 +msgid "" +"Specifies the time in milliseconds to wait before disabling a slave after a " +"link failure detection" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:412 +msgid "" +"Specifies the time in milliseconds to wait before enabling a slave after a " +"link recovery detection" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 +msgid "" +"Specifies the wired ports to attach to this bridge. In order to attach " +"wireless networks, choose the associated interface as network in the " +"wireless settings." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:383 +msgid "" +"Specifies whether ARP probes and replies should be validated or non-ARP " +"traffic should be filtered for link monitoring" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:303 +msgid "" +"Specifies whether active-backup mode should set all slaves to the same MAC " +"address at enslavement" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:420 +msgid "" +"Specifies whether or not miimon should use MII or ETHTOOL ioctls vs. " +"netif_carrier_ok()" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:295 +msgid "" +"Specifies whether to shuffle active flows across slaves based on the load" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:181 +msgid "" +"Specifies which slave interfaces should be attached to this bonding interface" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:214 +msgid "" +"Specifies which slave is the primary device. It will always be the active " +"slave while it is available" +msgstr "" + +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:62 +msgid "Specify a TOS (Type of Service)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:79 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:79 +msgid "" +"Specify a TOS (Type of Service). Can be inherit (the outer " +"header inherits the value of the inner header) or an hexadecimal value " +"00..FF (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:74 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:79 +msgid "" +"Specify a TTL (Time to Live) for the encapsulating packet other than the " +"default (64) (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:69 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:62 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:57 +msgid "" +"Specify a TTL (Time to Live) for the encapsulating packet other than the " +"default (64)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84 +msgid "" +"Specify a Traffic Class. Can be inherit (the outer header " +"inherits the value of the inner header) or an hexadecimal value 00.." +"FF (optional)." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 +msgid "" +"Specify an MTU (Maximum Transmission Unit) other than the default (1280 " +"bytes) (optional)." +msgstr "" + +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 +msgid "" +"Specify an MTU (Maximum Transmission Unit) other than the default (1280 " +"bytes)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 +msgid "Specify the secret encryption key here." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 +msgid "Stale neighbour cache timeout" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 +msgid "Start" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:140 +msgid "Start WPS" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:76 +msgid "Start priority" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 +msgid "Start refresh" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 +msgid "Starting configuration apply…" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 +msgid "Starting wireless scan..." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:109 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:78 +msgid "Startup" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 +msgid "Static IPv4 Routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 +msgid "Static IPv6 Routes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:91 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:138 +msgid "Static Lease" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +msgid "Static Leases" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2090 +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:172 +#: modules/luci-compat/luasrc/model/network.lua:967 +msgid "Static address" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 +msgid "" +"Static leases are used to assign fixed IP addresses and symbolic hostnames " +"to DHCP clients. They are also required for non-dynamic interface " +"configurations where only hosts with a corresponding lease are served." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "Station inactivity limit" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 +msgid "Status" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 +msgid "Stop" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:135 +msgid "Stop WPS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 +msgid "Stop refresh" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:24 +msgid "Storage" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 +msgid "Strict filtering" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 +msgid "Strict order" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 +msgid "Strong" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 +msgid "Submit" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 +msgid "Suppress logging" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 +msgid "Suppress logging of the routine operation for the DHCP protocol." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:46 +msgid "Swap free" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:3 +msgid "Switch" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:172 +msgid "Switch %q" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:150 +msgid "" +"Switch %q has an unknown topology - the VLAN settings might not be accurate." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3002 +#: modules/luci-compat/luasrc/model/network.lua:1426 +msgid "Switch VLAN" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2999 +msgid "Switch port" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 +msgid "Switch protocol" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:103 +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:104 +#: modules/luci-compat/luasrc/view/cbi/ipaddr.htm:26 +msgid "Switch to CIDR list notation" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 +msgid "Symbolic link" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:89 +msgid "Sync with NTP-Server" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:81 +msgid "Sync with browser" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 +#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 +msgid "System" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:25 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:63 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:75 +msgid "System Log" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:245 +msgid "System Priority" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:118 +msgid "System Properties" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:162 +msgid "System log buffer size" +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 +msgid "System running in recovery (initramfs) mode." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:67 +msgctxt "nft tcp option maxseg size" +msgid "TCP MSS" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:54 +msgctxt "nft tcp dport" +msgid "TCP destination port" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:57 +msgctxt "nft tcp flags" +msgid "TCP flags" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:53 +msgctxt "nft tcp sport" +msgid "TCP source port" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:338 +msgid "TCP:" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 +msgid "TFTP server root" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:50 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:85 +msgid "TX" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:236 +msgid "TX Rate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 +msgid "TX queue length" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 +msgid "Table" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 +msgid "Target" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +msgid "Target Platform" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:103 +msgid "Target network" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:36 +msgid "Temp space" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:50 +msgid "Terminate" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 +msgid "" +"The MTU to be published in " +"RA messages. " +"Minimum is 1280 bytes." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 +msgid "" +"The Managed address configuration (M) flag indicates that IPv6 " +"addresses are available via DHCPv6." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 +msgid "" +"The Mobile IPv6 Home Agent (H) flag indicates that the device is " +"also acting as Mobile IPv6 home agent on this link." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 +msgid "" +"The Other configuration (O) flag indicates that other information, " +"such as DNS servers, is available via DHCPv6." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:84 +msgid "The block mount command failed with code %d" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:80 +msgid "" +"The qrencode package is required for generating an QR code image of " +"the configuration." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 +msgid "" +"The DNS server entries in the local resolv.conf are primarily sorted by the " +"weight specified here" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:77 +msgid "" +"The HE.net endpoint update configuration changed, you must now use the plain " +"username instead of the user ID!" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 +msgid "The IP address %h is already used by another static lease" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 +msgid "The IP address is outside of any DHCP pool address range" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 +msgid "The IP address of the boot server" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 +msgid "The IPv4 address or the fully-qualified domain name of the remote end." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 +msgid "" +"The IPv4 address or the fully-qualified domain name of the remote tunnel end." +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 +msgid "The IPv6 address or the fully-qualified domain name of the remote end." +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 +msgid "" +"The IPv6 address or the fully-qualified domain name of the remote tunnel end." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 +msgid "" +"The IPv6 prefix assigned to the provider, usually ends with ::" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:7 +msgid "The LED blinks with the configured on/off frequency" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +msgid "The LED flashes to simulate actual heart beat." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:8 +msgid "" +"The LED flashes with link status and activity on the configured interface." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:7 +msgid "The LED is always in default state off." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:6 +msgid "The LED is always in default state on." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 +msgid "" +"The MAC address %h is already used by another static lease in the same DHCP " +"pool" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 +msgid "The MTU must not exceed the parent device MTU of %d bytes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 +msgid "The VLAN ID must be unique" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 +msgid "" +"The allowed characters are: A-Z, a-z, 0-9 and _" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/error.htm:6 +msgid "The configuration file could not be loaded due to the following error:" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "" +"The correct SSID must be manually specified when joining a hidden wireless " +"network" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 +msgid "" +"The device could not be reached within %d seconds after applying the pending " +"changes, which caused the configuration to be rolled back for safety " +"reasons. If you believe that the configuration changes are correct " +"nonetheless, perform an unchecked configuration apply. Alternatively, you " +"can dismiss this warning and edit changes before attempting to apply again, " +"or revert all pending changes to keep the currently working configuration " +"state." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:281 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:393 +msgid "" +"The device file of the memory or partition (e.g." +" /dev/sda1)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +msgid "The device name \"%s\" is already taken" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 +msgid "" +"The existing network configuration needs to be changed for LuCI to function " +"properly." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 +msgid "" +"The existing wireless configuration needs to be changed for LuCI to function " +"properly." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:220 +msgid "" +"The flash image was uploaded. Below is the checksum and file size listed, " +"compare them with the original file to ensure data integrity.
    Click " +"'Continue' below to start the flash procedure." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:249 +msgid "The following rules are currently active on this system." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 +msgid "The frequency is in direct proportion to 1-minute average CPU load." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:154 +msgid "The gateway address must not be a local IP address" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 +msgid "" +"The generated configuration can be imported into a WireGuard client " +"application to set up a connection towards this device." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +msgid "The given SSH public key has already been added." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 +msgid "" +"The given SSH public key is invalid. Please supply proper public RSA, " +"ED25519 or ECDSA keys." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 +msgid "The hostname of the boot server" +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 +msgid "The interface name is already used" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 +msgid "The interface name is too long" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 +msgid "" +"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " +"addresses." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 +msgid "The length of the IPv6 prefix in bits" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:165 +msgid "The local IPv4 address" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 +#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 +msgid "The local IPv4 address over which the tunnel is created (optional)." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:171 +msgid "The local IPv4 netmask" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:53 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 +msgid "The local IPv6 address over which the tunnel is created (optional)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +msgid "" +"The max response time in centiseconds inserted into group-specific queries " +"sent in response to leave group messages. It is also the amount of time " +"between group-specific query messages. This value may be tuned to modify the " +"\"leave latency\" of the network. A reduced value results in reduced time to " +"detect the loss of the last member of a group" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 +msgid "" +"The max response time in centiseconds inserted into the periodic general " +"queries. By varying the value, an administrator may tune the burstiness of " +"IGMP messages on the subnet; larger values make the traffic less bursty, as " +"host responses are spread out over a larger interval" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +msgid "" +"The maximum hops to be published in RA messages. Maximum is 255 hops." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 +msgid "" +"The network access to this device could be interrupted by changing settings " +"of the \"%h\" interface." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 +msgid "The network name is already used" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 +msgid "" +"The network ports on this device can be combined to several VLANs in which computers can " +"communicate directly with each other. VLANs are often used to separate different network " +"segments. Often there is by default one Uplink port for a connection to the " +"next greater network like the internet and other ports for a local network." +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 +msgid "" +"The public hostname or IP address of this system the peer should connect to. " +"This usually is a static public IP address, a static hostname or a DDNS " +"domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 +msgid "The query response interval must be lower than the query interval value" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:158 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:42 +msgid "The reboot command failed with code %d" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:147 +msgid "The restore command failed with code %d" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 +msgid "" +"The robustness value allows tuning for the expected packet loss on the " +"network. If a network is expected to be lossy, the robustness value may be " +"increased. IGMP is robust to (Robustness-1) packet losses" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 +msgid "" +"The rule target is a jump to another rule specified by its priority value" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 +msgid "" +"The rule target is a table lookup ID: a numeric table index ranging from 0 " +"to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " +"aliases local (255), main (254) and default (253) are also valid" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 +msgid "The selected %s mode is incompatible with %s encryption" +msgstr "" + +#: modules/luci-base/ucode/template/csrftoken.ut:11 +msgid "The submitted security token is invalid or already expired!" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:98 +msgid "" +"The system is erasing the configuration partition now and will reboot itself " +"when finished." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:320 +msgid "" +"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " +"few minutes before you try to reconnect. It might be necessary to renew the " +"address of your computer to reach the device again, depending on your " +"settings." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:163 +msgid "" +"The system is rebooting now. If the restored configuration changed the " +"current LAN IP address, you might need to reconnect manually." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:85 +msgid "The system password has been successfully changed." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:345 +msgid "The sysupgrade command failed with code %d" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 +msgid "" +"The uploaded backup archive appears to be valid and contains the files " +"listed below. Press \"Continue\" to restore the backup and reboot, or " +"\"Cancel\" to abort the operation." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:115 +msgid "The uploaded backup archive is not readable" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:249 +msgid "The uploaded firmware does not allow keeping current configuration." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:244 +msgid "" +"The uploaded image file does not contain a supported format. Make sure that " +"you choose the generic image format for your platform." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 +msgid "" +"There are legacy iptables rules present on the system. Mixing iptables and " +"nftables rules is discouraged and may lead to incomplete traffic filtering." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 +msgid "There are no active leases" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 +msgid "There are no changes to apply" +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 +msgid "" +"There is no password set on this router. Please configure a root password to " +"protect the web interface." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 +msgid "This IPv4 address of the relay" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 +msgid "This authentication type is not applicable to the selected EAP method." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 +msgid "This does not look like a valid PEM file" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 +msgid "" +"This is a list of shell glob patterns for matching files and directories to " +"include during sysupgrade. Modified files in /etc/config/ and certain other " +"configurations are automatically preserved." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 +msgid "" +"This is either the \"Update Key\" configured for the tunnel or the account " +"password if no update key has been configured" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 +msgid "" +"This is the content of /etc/rc.local. Insert your own commands here (in " +"front of 'exit 0') to execute them at the end of the boot process." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:54 +msgid "" +"This is the local endpoint address assigned by the tunnel broker, it usually " +"ends with ...:2/64" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +msgid "This is the only DHCP server in the local network." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 +msgid "This is the plain username for logging into the account" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 +msgid "" +"This is the prefix routed to you by the tunnel broker for use by clients" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:29 +msgid "This is the system crontab in which scheduled tasks can be defined." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 +msgid "" +"This is usually the address of the nearest PoP operated by the tunnel broker" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:65 +msgid "" +"This list gives an overview over currently running system processes and " +"their status." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 +msgid "" +"This option cannot be used because the ca-bundle package is not installed." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2280 +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:172 +#: modules/luci-compat/luasrc/view/cbi/tsection.htm:32 +msgid "This section contains no values yet" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:124 +msgid "Time Synchronization" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 +msgid "Time in milliseconds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 +msgid "Time in seconds to spend in listening and learning states" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 +msgid "Time interval for rekeying GTK" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 +msgid "Timed-out" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 +msgid "Timeout in seconds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 +msgid "Timeout in seconds for learned MAC addresses in the forwarding database" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +msgid "Timeout in seconds until topology updates on link loss" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:145 +msgid "Timezone" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 +msgid "" +"To fully configure the local WireGuard interface from an existing (e.g. " +"provider supplied) configuration file, use the configuration import instead." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 +msgid "" +"To restore configuration files, you can upload a previously generated backup " +"archive here. To reset the firmware to its initial state, click \"Perform " +"reset\" (only possible with squashfs images)." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +msgid "Tone" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:35 +msgid "Total Available" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 +msgid "Traceroute" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 +msgid "Traffic" +msgstr "" + +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:79 +#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84 +msgid "Traffic Class" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 +msgid "Traffic filter chain \"%h\"" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 +msgctxt "nft counter" +msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:387 +msgid "Transfer" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:25 +msgid "Transmit" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:319 +msgid "Transmit Hash Policy" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 +msgctxt "nft @th,off,len" +msgid "Transport header bits %d-%d" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:59 +msgctxt "nft th dport" +msgid "Transport header destination port" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:58 +msgctxt "nft th sport" +msgid "Transport header source port" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:75 +msgid "Trigger" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:20 +msgid "Trigger Mode" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:69 +msgid "Tunnel ID" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3005 +#: modules/luci-compat/luasrc/model/network.lua:1431 +msgid "Tunnel Interface" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:44 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:55 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:76 +msgid "Tunnel Link" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 +msgid "Tunnel device" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 +msgid "Tx-Power" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 +msgid "Type" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 +msgid "Type of service" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:56 +msgctxt "nft udp dport" +msgid "UDP destination port" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:55 +msgctxt "nft udp sport" +msgid "UDP source port" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:328 +msgid "UDP:" +msgstr "" + +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:91 +msgid "UMTS only" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_3g.lua:10 +#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:43 +msgid "UMTS/GPRS/EV-DO" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 +msgid "UUID" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:16 +#: modules/luci-base/htdocs/luci-static/resources/network.js:17 +#: modules/luci-compat/luasrc/model/network.lua:34 +#: modules/luci-compat/luasrc/model/network.lua:35 +msgid "Unable to determine device name" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:18 +#: modules/luci-compat/luasrc/model/network.lua:36 +msgid "Unable to determine external IP address" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:19 +#: modules/luci-compat/luasrc/model/network.lua:37 +msgid "Unable to determine upstream interface" +msgstr "" + +#: modules/luci-base/ucode/template/error404.ut:12 +msgid "Unable to dispatch" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:85 +msgid "Unable to generate QR code: %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:9 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:15 +msgid "Unable to load log data:" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:54 +#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:54 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:22 +msgid "Unable to obtain client ID" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:221 +msgid "Unable to obtain mount information" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:307 +msgid "Unable to reset ip6tables counters: %s" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:305 +msgid "Unable to reset iptables counters: %s" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:61 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:7 +msgid "Unable to resolve AFTR host name" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:20 +#: modules/luci-compat/luasrc/model/network.lua:38 +msgid "Unable to resolve peer host name" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:313 +msgid "Unable to restart firewall: %s" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:22 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:370 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:57 +msgid "Unable to save contents: %s" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 +msgid "Unconfigure" +msgstr "" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/fs.js:102 +msgid "Unexpected reply data format" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 +msgid "" +"Unique Local Address - in the range fc00::/7. Typically only " +"within the ‘local’ half fd00::/8. ULA for IPv6 is " +"analogous to IPv4 private network addressing. This prefix is randomly " +"generated at first install." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2092 +#: modules/luci-compat/luasrc/model/network.lua:971 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:17 +msgid "Unknown" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 +msgid "Unknown and unsupported connection method." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2401 +#: modules/luci-compat/luasrc/model/network.lua:1138 +msgid "Unknown error (%s)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:412 +msgid "Unknown error code" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2089 +#: modules/luci-base/htdocs/luci-static/resources/protocol/none.js:6 +#: modules/luci-compat/luasrc/model/network.lua:965 +msgid "Unmanaged" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:195 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:217 +msgid "Unmount" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 +msgid "Unnamed key" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 +msgid "Unsaved Changes" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/rpc.js:410 +msgid "Unspecified error" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:64 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:9 +msgid "Unsupported MAP type" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +msgid "Unsupported modem" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 +msgid "Unsupported protocol type." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 +msgid "Untitled peer" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 +msgid "Up" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:411 +msgid "Up Delay" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 +msgid "Upload" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:441 +msgid "" +"Upload a sysupgrade-compatible image here to replace the running firmware." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:138 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:169 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:412 +msgid "Upload archive..." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 +msgid "Upload file" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 +msgid "Upload file…" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 +msgid "Upload request failed: %s" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 +msgid "Uploading file…" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 +msgid "" +"Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " +"assigned with a name in the form wifinet# and the network will be " +"restarted to apply the updated configuration." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 +msgid "" +"Upon pressing \"Continue\", bridges configuration will be updated and the " +"network will be restarted to apply the updated configuration." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 +msgid "" +"Upon pressing \"Continue\", ifname options will get renamed and the network " +"will be restarted to apply the updated configuration." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 +msgid "Upstream resolvers will be queried in the order of the resolv file." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +msgid "Uptime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 +msgid "Use /etc/ethers" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 +msgid "Use DHCP advertised servers" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 +msgid "Use DHCP gateway" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 +msgid "Use DNS servers advertised by peer" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 +msgid "Use ISO/IEC 3166 alpha2 country codes." +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:48 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:89 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:69 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:53 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:67 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:84 +msgid "Use MTU on tunnel interface" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:85 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:65 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:49 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:80 +msgid "Use TTL on tunnel interface" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:322 +msgid "Use XOR of hardware MAC addresses (layer2)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:323 +msgid "Use XOR of hardware MAC addresses and IP addresses (layer2+3)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:325 +msgid "" +"Use XOR of hardware MAC addresses and IP addresses, rely on skb_flow_dissect " +"(encap2+3)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:295 +msgid "Use as external overlay (/overlay)" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:294 +msgid "Use as root filesystem (/)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 +msgid "Use broadcast flag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 +msgid "Use builtin IPv6-management" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 +msgid "Use custom DNS servers" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 +msgid "Use default gateway" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 +#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 +msgid "Use gateway metric" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 +msgid "Use legacy MAP" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 +msgid "" +"Use legacy MAP interface identifier format (draft-ietf-softwire-map-00) " +"instead of RFC7597" +msgstr "" + +#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 +msgid "Use routing table" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:63 +msgctxt "nft nat flag persistent" +msgid "Use same source and destination for each connection" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +msgid "Use system certificates" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 +msgid "Use system certificates for inner-tunnel" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 +msgid "" +"Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " +"address to use, and the Hostname is assigned as a symbolic name to " +"the requesting host. The optional Lease time can be used to set non-" +"standard host-specific lease time, e.g. 12h, 3d or infinite." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:324 +msgid "Use upper layer protocol information (layer3+4)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:326 +msgid "" +"Use upper layer protocol information, rely on skb_flow_dissect (encap3+4)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:36 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:194 +msgid "Used" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 +msgid "Used Key Slot" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 +msgid "" +"Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " +"needed with normal WPA(2)-PSK." +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 +msgid "User Group" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 +msgid "User certificate (PEM encoded)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 +msgid "User identifier" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 +msgid "User key (PEM encoded)" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 +msgid "Username" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 +msgid "Utilize flow table %h" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 +msgid "VC-Mux" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 +msgid "VDSL" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 +msgctxt "MACVLAN mode" +msgid "VEPA (Virtual Ethernet Port Aggregator)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 +msgid "VLAN (802.1ad)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 +msgid "VLAN (802.1q)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 +msgid "VLAN ID" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:173 +msgid "VLANs on %q" +msgstr "" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:54 +msgid "VPN" +msgstr "وی پی ان" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:42 +msgid "VPN Local address" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:46 +msgid "VPN Local port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 +msgid "VPN Protocol" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 +msgid "VPN Server" +msgstr "" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 +msgid "VPN Server port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +msgid "VPN Server's certificate SHA1 hash" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_vpnc.lua:9 +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:9 +msgid "VPNC (CISCO 3000 (and others) VPN)" +msgstr "" + +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 +msgid "VXLAN (RFC7348)" +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 +msgid "VXLAN network identifier" +msgstr "" + +#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:10 +msgid "VXLANv6 (RFC7348)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +msgid "" +"Validate DNS replies and cache DNSSEC data, requires upstream to support " +"DNSSEC." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 +msgid "" +"Validate server certificate using built-in system CA bundle,
    requires " +"the \"ca-bundle\" package" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:388 +msgid "Validation for all slaves" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:386 +msgid "Validation only for active slave" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:387 +msgid "Validation only for backup slaves" +msgstr "" + +#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:73 +msgid "Vendor" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:40 +msgid "Vendor Class to send when requesting DHCP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 +msgid "Verify unsigned domain responses really come from unsigned domains." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:196 +msgid "Verifying the uploaded image file." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 +msgid "Very High" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 +msgid "Virtual Ethernet" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:60 +msgid "Virtual dynamic interface" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +msgid "WDS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 +msgid "WEP Open System" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 +msgid "WEP Shared Key" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 +msgid "WEP passphrase" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 +msgid "WMM Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 +msgid "WPA passphrase" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 +msgid "" +"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " +"and ad-hoc mode) to be installed." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:153 +msgid "WPS status" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:47 +msgid "Waiting for device..." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:189 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:199 +msgid "Warning" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:26 +msgid "Warning: There are unsaved changes that will get lost on reboot!" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 +msgid "Weak" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 +msgid "" +"When delegating prefixes to multiple downstreams, interfaces with a higher " +"preference value are considered first when allocating subnets." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 +msgid "" +"When enabled, gateway is on-link even if the gateway does not match any " +"interface prefix" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +msgid "" +"When using a PSK, the PMK can be automatically generated. When enabled, the " +"R0/R1 key options below are not applied. Disable this to use the R0 and R1 " +"key options." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 +msgid "" +"Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " +"802.11a/802.11g rates." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 +msgid "" +"Where the ESSID is hidden, clients may fail to roam and airtime efficiency " +"may be significantly reduced." +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 +msgid "Width" +msgstr "" + +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "" + +#: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 +msgid "WireGuard VPN" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 +msgid "WireGuard peer is disabled" +msgstr "" + +#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:10 +#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:148 +msgid "Wireless" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2992 +#: modules/luci-compat/luasrc/model/network.lua:1419 +msgid "Wireless Adapter" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:2971 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 +#: modules/luci-compat/luasrc/model/network.lua:1405 +#: modules/luci-compat/luasrc/model/network.lua:1868 +msgid "Wireless Network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 +msgid "Wireless Overview" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 +msgid "Wireless Security" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 +msgid "Wireless configuration migration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:152 +msgid "Wireless is disabled" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:152 +msgid "Wireless is not associated" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 +msgid "Wireless network is disabled" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 +msgid "Wireless network is enabled" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 +msgid "Write received DNS queries to syslog." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:181 +msgid "Write system log to file" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:206 +msgid "XOR policy (balance-xor, 2)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 +msgid "Yes" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:305 +msgid "Yes (none, 0)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:177 +msgid "" +"You appear to be currently connected to the device via the \"%h\" interface. " +"Do you really want to shut down the interface?" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:112 +msgid "" +"You can enable or disable installed init scripts here. Changes will applied " +"after a device reboot.
    Warning: If you disable essential init " +"scripts like \"network\", your device might become inaccessible!" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 +#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 +msgid "" +"You must enable JavaScript in your browser or LuCI will not work properly." +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:117 +msgid "" +"You must select a primary interface which is included in selected slave " +"interfaces!" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:98 +msgid "" +"You must select at least one ARP IP target if ARP monitoring is selected!" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:213 +msgid "ZRam Compression Algorithm" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:206 +msgid "ZRam Settings" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:208 +msgid "ZRam Size" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 +msgid "any" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 +#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 +msgid "auto" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 +msgid "automatic" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 +msgid "baseT" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 +msgid "bridged" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:146 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:406 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:35 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:99 +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:31 +msgid "create" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:69 +msgid "create:" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:55 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:58 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:62 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:83 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:84 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:187 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:41 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:276 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:279 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:283 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:284 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:263 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:266 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:269 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:273 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:276 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:279 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:305 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:306 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:307 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:311 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:312 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:313 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:315 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:316 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:317 +msgid "dBm" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:73 +msgctxt "nft unit" +msgid "day" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 +msgid "disable" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 +msgid "disabled" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 +msgid "driver default" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 +msgid "e.g: --proxy 10.10.10.10" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 +msgid "e.g: dump" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 +msgid "expired" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 +msgid "forced" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:85 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:196 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:61 +msgid "forward" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 +msgid "full-duplex" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 +msgid "half-duplex" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 +msgid "hexadecimal encoded value" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 +msgid "hidden" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:74 +msgctxt "nft unit" +msgid "hour" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +msgid "hybrid mode" +msgstr "" + +#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:63 +msgid "ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 +msgid "input" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:410 +msgid "key between 8 and 63 characters" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:422 +msgid "key with either 5 or 13 characters" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 +msgid "managed config (M)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 +msgid "medium security" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:75 +msgctxt "nft unit" +msgid "minute" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 +msgid "minutes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 +msgid "mobile home agent (H)" +msgstr "" + +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:423 +msgid "netif_carrier_ok()" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +msgid "no" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 +msgid "no link" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:2269 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:59 +msgid "non-empty value" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "none" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:41 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:55 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:69 +msgid "not present" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +msgid "off" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +msgid "on available prefix" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 +msgid "open network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 +msgid "other config (O)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 +msgid "output" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 +msgctxt "nft unit" +msgid "packets" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:252 +msgid "positive decimal value" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:244 +msgid "positive integer value" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:178 +msgid "random" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 +msgid "relay mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 +msgid "routed" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 +msgid "sec" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 +msgid "server mode" +msgstr "" + +#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:54 +msgid "sstpc Log-level" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +msgid "strong security" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:354 +msgid "tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +msgid "time units (TUs / 1.024 ms) [1000-65535]" +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 +msgid "" +"uHTTPd offers HTTP or " +"HTTPS network " +"access." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 +msgid "unique value" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 +msgid "unknown" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 +msgid "unlimited" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:397 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:433 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:470 +#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:566 +#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:53 +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:38 +msgid "unspecified" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:71 +msgid "unspecified -or- create:" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:352 +msgid "untagged" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +msgid "valid IP address" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:257 +msgid "valid IP address or prefix" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:294 +msgid "valid IPv4 CIDR" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +msgid "valid IPv4 address" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:265 +msgid "valid IPv4 address or network" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:389 +msgid "valid IPv4 address:port" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:328 +msgid "valid IPv4 network" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:288 +msgid "valid IPv4 or IPv6 CIDR" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:278 +msgid "valid IPv4 prefix value (0-32)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:300 +msgid "valid IPv6 CIDR" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +msgid "valid IPv6 address" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:273 +msgid "valid IPv6 address or prefix" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:318 +msgid "valid IPv6 host id" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:333 +msgid "valid IPv6 network" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:283 +msgid "valid IPv6 prefix value (0-128)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:355 +msgid "valid MAC address" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:426 +msgid "valid UCI identifier" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:377 +msgid "valid UCI identifier, hostname or IP address range" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:398 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:401 +msgid "valid address:port" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 +msgid "valid date (YYYY-MM-DD)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:248 +msgid "valid decimal value" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:420 +msgid "valid hexadecimal WEP key" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:408 +msgid "valid hexadecimal WPA key" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:383 +msgid "valid host:port" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:370 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 +msgid "valid hostname" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:360 +msgid "valid hostname or IP address" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:240 +msgid "valid integer value" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:355 +msgid "valid multicast MAC address" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:323 +msgid "valid network in address/netmask notation" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 +msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:346 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:349 +msgid "valid port or port range (port1-port2)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 +msgid "valid port value" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 +msgid "valid time (HH:MM:SS)" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 +msgid "value between %d and %d characters" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 +msgid "value between %f and %f" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +msgid "value greater or equal to %f" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 +msgid "value smaller or equal to %f" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 +msgid "value with %d characters" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 +msgid "value with at least %d characters" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 +msgid "value with at most %d characters" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 +msgid "weak security" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:72 +msgctxt "nft unit" +msgid "week" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +msgid "yes" +msgstr "" + +#: modules/luci-compat/luasrc/view/cbi/delegator.htm:20 +msgid "« Back" +msgstr "" diff --git a/package/luci/modules/luci-base/po/vi/base.po b/package/luci/modules/luci-base/po/vi/base.po index d484023cc0..5aabac2526 100644 --- a/package/luci/modules/luci-base/po/vi/base.po +++ b/package/luci/modules/luci-base/po/vi/base.po @@ -3,35 +3,50 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-08-16 06:59+0200\n" -"PO-Revision-Date: 2021-12-13 23:52+0000\n" -"Last-Translator: Josef Schlehofer \n" -"Language-Team: Vietnamese \n" +"Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.10-dev\n" +"X-Generator: Weblate 5.1-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" -msgstr "" +msgstr "\"%h\" bảng \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" -msgstr "" +msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 -#, fuzzy +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d trường không hợp lệ" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d giờ trước" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d phút trước" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d giây trước" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s không được kết nối với nhiều VLANs!" @@ -42,7 +57,7 @@ msgstr "%s không được kết nối với nhiều VLANs!" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:309 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:327 msgid "(%d minute window, %d second interval)" -msgstr "" +msgstr "(%d phút đầu, %d giây kế tiếp)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:118 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:124 @@ -56,32 +71,33 @@ msgstr "(Rỗng)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(chưa được kết nối với giao diện mạng)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" -msgstr "" +msgstr "+ %d nhiều hơn" #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:48 msgid "-- Additional Field --" msgstr "---Mục bổ sung---" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- Hãy chọn --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "--tùy chỉnh--" @@ -105,26 +121,31 @@ msgstr "-- xin hãy chọn --" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:55 msgctxt "sstp log level value" msgid "0" -msgstr "" +msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = không dùng ngưỡng RSSI, 1 = không thay đổi driver mặc định" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:56 msgctxt "sstp log level value" msgid "1" -msgstr "" +msgstr "1" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:233 msgid "1 Minute Load:" msgstr "tải 1 phút:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" -msgstr[0] "" +msgstr[0] "%d cờ" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" @@ -133,25 +154,29 @@ msgstr "tải 15 phút:" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:57 msgctxt "sstp log level value" msgid "2" -msgstr "" +msgstr "2" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:58 msgctxt "sstp log level value" msgid "3" +msgstr "3" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" msgstr "" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" -msgstr "" +msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4 ký tự ID thập lục phân" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:11 -#, fuzzy msgid "464XLAT (CLAT)" msgstr "464XLAT (CLAT)" @@ -159,43 +184,104 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "tải 5 phút:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "Định danh bằng 6 số bát phân dạng chuỗi thập lục phân - không phẩy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: Bật báo cáo beacon qua đo lường sóng vô tuyến." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: Bật báo cáo hàng xóm qua đo lường sóng vô tuyến." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r truyền nhanh" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: Tĩnh lặng tối đa của BSS. Đơn vị: giây." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: Quản lý chuyển tiếp Basic Service Set (BSS)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: Quảng cáo múi giờ địa phương trong các khung quản lý." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "" +"802.11v: Proxy ARP cho phép STA không phải là AP tiếp tục ở chế độ tiết kiệm " +"năng lượng lâu hơn." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: Quảng cáo thời gian trong các khung quản lý." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "" +"802.11v: Chế độ ngủ Wireless Network Management (WNM) (chế độ ngủ mở rộng " +"cho các trạm)." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "" +"802.11v: Sửa lỗi chế độ ngủ Wireless Network Management (WNM): Ngăn chặn " +"cuộc tấn công cài đặt lại." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "thời gian chờ truy vấn SA tối đa chuẩn 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "thời gian chờ thử lại truy vấn SA chuẩn 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "Bảo vệ khung quản lý (MFP) 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "thời gian chờ tối đa chuẩn 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "thời gian thử lại chuẩn 802.11w" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-Netmask" @@ -207,106 +293,200 @@ msgstr "LED Configuration" msgid "LED Name" msgstr "LED Name" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" -msgstr "" +msgstr "NDP-Proxy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" -msgstr "" +msgstr "RA Cờ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" -msgstr "" +msgstr "RA Giới hạn Bước nhảy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" -msgstr "" +msgstr "RA Thời hạn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" -msgstr "" +msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" +msgstr "RA-Dịch vụ" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ phù hợp với bất kỳ tên miền nào. /example.com/ " +"trả về NXDOMAIN." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." msgstr "" +"/example.com/# trả về địa chỉ NULL (0.0.0.0 và " +"::) cho example.com và các tên miền con của nó." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" -msgstr "" +msgstr "%s lớn hơn %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:85 msgctxt "nft relational \">=\" operator expression" msgid "%s greater than or equal to %s" -msgstr "" +msgstr "%s lớn hơn hoặc bằng %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:90 msgctxt "nft set match expression" msgid "%s in set %s" -msgstr "" +msgstr "%s thuộc tập hợp %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:83 msgctxt "nft relational \"==\" operator expression" msgid "%s is %s" -msgstr "" +msgstr "%s là %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:89 msgctxt "nft relational \"in\" operator expression" msgid "%s is one of %s" msgstr "" +"%s là một trong các giá trị trong tập hợp %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:88 msgctxt "nft relational \"<\" operator expression" msgid "%s lower than %s" -msgstr "" +msgstr "%s nhỏ hơn %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:86 msgctxt "nft relational \"<=\" operator expression" msgid "%s lower than or equal to %s" -msgstr "" +msgstr "%s nhỏ hơn hoặc bằng %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:84 msgctxt "nft relational \"!=\" operator expression" msgid "%s not %s" -msgstr "" +msgstr "%s không phải là %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:91 msgctxt "nft not in set match expression" msgid "%s not in set %s" +msgstr "%s không thuộc tập hợp %s" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." msgstr "" +"Một nút batman-adv có thể hoạt động ở chế độ máy chủ (chia sẻ kết nối " +"internet với mạng lưới) hoặc ở chế độ máy khách (tìm kiếm kết nối internet " +"phù hợp nhất trong mạng lưới) hoặc tắt hoàn toàn chế độ hỗ trợ cổng mạng " +"(đây là thiết lập mặc định)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" -msgstr "" +msgstr "Đã tồn tại một cấu hình cho thiết bị \"%s\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." -msgstr "thư mục có tên này đã tồn tại" +msgstr "thư mục có tên này đã tồn tại." #: modules/luci-base/htdocs/luci-static/resources/luci.js:2666 msgid "A new login is required since the authentication session expired." -msgstr "Cần đăng nhận lại vì phiên xác thực cũ đã hết hạn" +msgstr "Cần đăng nhận lại vì phiên xác thực cũ đã hết hạn." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" -msgstr "" +msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" -msgstr "" +msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (tất cả các biến thể) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (tất cả các biến thể) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (tất cả các biến thể) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (tất cả các biến thể) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (tất cả các biến thể) Annex B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (tất cả các biến thể) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (tất cả các biến thể) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -317,51 +497,62 @@ msgstr "ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:366 msgid "ARP IP Targets" -msgstr "" +msgstr "Mục tiêu ARP IP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:358 msgid "ARP Interval" -msgstr "" +msgstr "Khoảng thời gian ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:382 msgid "ARP Validation" -msgstr "" +msgstr "Xác nhận ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:374 msgid "ARP mode to consider a slave as being up" -msgstr "" +msgstr "Chế độ ARP để xem một slave như đang hoạt động" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:79 msgid "ARP monitoring is not supported for the selected policy!" -msgstr "" +msgstr "Không hỗ trợ giám sát ARP cho chính sách được chọn!" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 msgid "ARP retry threshold" -msgstr "" +msgstr "Ngưỡng thử lại ARP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" +msgstr "Bảng lưu lượng ARP \"%h\"" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." msgstr "" +"ARP, IPv4 và IPv6 (thậm chí 802.1Q) với MAC đích đa phát đều được gửi dạng " +"unicast đến địa chỉ MAC của STA. Lưu ý: Đây không phải là Dịch vụ Đa phát " +"Định hướng (DMS) trong 802.11v. Lưu ý: có thể làm hỏng kỳ vọng đa phát STA " +"của thiết bị nhận." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "Chế độ truyền đồng bộ(ATM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" -msgstr "" +msgstr "Cầu ATM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "Kênh định danh ảo chế độ ATM (VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "Đường dẫn định danh ảo chế độ ATM (VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -369,58 +560,63 @@ msgid "" msgstr "" "cầu ATM đưa ra đóng gói của ethernet trong kết nối AAL5 dưới dạng dao " "diệnmạng Linux ảo, có thể kết nối với DHCP hoặc PPP để liên lại nhà cung cấp " -"mạng" +"mạng." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "Số hiệu thiết bị ATM" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "Hệ thống cung cấp ID ATU-C" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "Giao diện vắng mặt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "" "Giới hạn dịch vụ DNS đối với các giao diện mạng con mà chúng tôi đang phục " "vụ DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" -msgstr "" +msgstr "Chấp nhận cục bộ" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:95 msgctxt "nft accept action" msgid "Accept packet" -msgstr "" +msgstr "Chấp nhận gói tin" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" -msgstr "" +msgstr "Chấp nhận các gói tin có địa chỉ nguồn cục bộ" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 msgid "Access Concentrator" msgstr "Truy cập tập trung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "Điểm truy cập" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "Cô lập điểm truy cập" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" -msgstr "Hành động" +msgstr "hành động" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" -msgstr "" +msgstr "Kích hoạt" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:81 msgid "Active Connections" @@ -444,7 +640,7 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:258 msgid "Active IPv4 Rules" -msgstr "" +msgstr "Luật IPv4 hoạt động" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:265 msgid "Active IPv6 Routes" @@ -452,52 +648,52 @@ msgstr "Active IPv6 Routes" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:268 msgid "Active IPv6 Rules" -msgstr "" +msgstr "Luật IPv6 hoạt động" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:205 msgid "Active-Backup policy (active-backup, 1)" -msgstr "" +msgstr "Chính sách Active-Backup (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "Ad-Hoc" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:210 msgid "Adaptive load balancing (balance-alb, 6)" -msgstr "" +msgstr "Cân bằng tải linh hoạt (balance-alb, 6)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:209 msgid "Adaptive transmit load balancing (balance-tlb, 5)" -msgstr "" +msgstr "Cân bằng tải truyền linh hoạt (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2233 #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" msgstr "Thêm vào" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "Thêm cầu ATM" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:92 msgid "Add IPv4 address…" -msgstr "Thêm địa chỉ IPv4" +msgstr "Thêm địa chỉ IPv4…" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:185 msgid "Add IPv6 address…" -msgstr "Thêm địa chủ IPv6" +msgstr "Thêm địa chủ IPv6…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:65 msgid "Add LED action" @@ -507,30 +703,30 @@ msgstr "Thêm hành động cho LED" msgid "Add VLAN" msgstr "thêm VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" -msgstr "" +msgstr "Thêm cấu hình thiết bị" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" -msgstr "" +msgstr "Thêm cấu hình thiết bị…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:15 msgid "Add instance" -msgstr "Thêm ví dụ" +msgstr "Thêm phiên bản" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "Thêm khóa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." -msgstr "Thêm hậu tố tên miền cục bộ vào tên được phân phát từ tệp máy chủ" +msgstr "Thêm hậu tố tên miền cục bộ vào tên được phân phát từ tệp máy chủ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "Thêm giao diện mới..." @@ -538,19 +734,23 @@ msgstr "Thêm giao diện mới..." msgid "Add peer" msgstr "Thêm cặp" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" -msgstr "" +msgstr "Thêm vào danh sách đen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Whitelist" -msgstr "" +msgstr "Thêm vào danh sách trắng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "Tập tin máy chủ(host) bổ sung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "Tập tin máy chủ(server) bổ sung" @@ -567,69 +767,75 @@ msgstr "Tập tin máy chủ(server) bổ sung" msgid "Address" msgstr "Địa chỉ" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" -msgstr "" +msgstr "Họ địa chỉ" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:284 msgid "Address setting is invalid" -msgstr "" +msgstr "Cài đặt địa chỉ không hợp lệ" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 msgid "Address to access local relay bridge" msgstr "Địa chỉ truy cập cầu chuyển tiếp địa phương" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" -msgstr "" +msgstr "Địa chỉ" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:3 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:15 msgid "Administration" msgstr "Quản trị" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "Cài đặt nâng cao" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" -msgstr "" +msgstr "Tùy chọn nâng cao thiết bị" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" -msgstr "" +msgstr "Thời gian tuổi" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "Năng lượng truyền tổng hợp(ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "Tổng hợp thông điệp nguồn" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" -msgstr "" +msgstr "Logic chọn tổng hợp" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:263 msgid "Aggregator: All slaves down or has no slaves (stable, 0)" -msgstr "" +msgstr "Bộ tổng hợp: Tất cả slave tắt hoặc không có slave (ổn định, 0)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:265 msgid "" "Aggregator: Chosen by the largest number of ports + slave added/removed or " "state changes (count, 2)" msgstr "" +"Bộ tổng hợp: Được chọn bởi số lượng cổng lớn nhất + slave được thêm/xóa hoặc " +"thay đổi trạng thái (đếm, 2)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:264 msgid "Aggregator: Slave added/removed or state changes (bandwidth, 1)" -msgstr "" +msgstr "Bộ gom: Thêm/loại bỏ slave hoặc thay đổi trạng thái (băng thông, 1)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:192 msgid "Alert" @@ -645,17 +851,17 @@ msgstr "Giao diện bí danh" msgid "Alias of \"%s\"" msgstr "bí danh của \"%s\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "Tất cả máy chủ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." -msgstr "Phân bổ địa chỉ IP theo tuần tự, bắt đầu từ địa chỉ có sẵn thấp nhất" +msgstr "Phân bổ địa chỉ IP theo tuần tự, bắt đầu từ địa chỉ có sẵn thấp nhất." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "Phân bổ tuần tự địa chủ IP" @@ -663,33 +869,33 @@ msgstr "Phân bổ tuần tự địa chủ IP" msgid "Allow SSH password authentication" msgstr "Cho phép SSH xác thực mật mã" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "Cho phép chế độ AP ngắt kết nối dựa theo điều khiện ACK thấp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "Cho phép tất cả trừ danh sách liệt kê" #: modules/luci-compat/root/usr/share/rpcd/acl.d/luci-compat.json:3 msgid "Allow full UCI access for legacy applications" -msgstr "" +msgstr "Cho phép truy cập UCI đầy đủ cho các ứng dụng cũ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "Cho phép kế thừ tốc độ 802.11b" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "Chỉ cho phép danh sách liệt kê" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "Cho phép máy chủ cục bộ" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:179 msgid "Allow rebooting the device" -msgstr "" +msgstr "Cho phép khởi động lại thiết bị" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Allow remote hosts to connect to local SSH forwarded ports" @@ -701,226 +907,197 @@ msgstr "Cho phép root đăng nhập với mật khẩu" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:3 msgid "Allow system feature probing" -msgstr "" +msgstr "Cho phép dò tìm tính năng hệ thống" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "Cho phép người dùng root đăng nhập với mật khẩu" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "cho phép IPs" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" -msgstr "" +msgstr "Thiết lập AllowedIPs không hợp lệ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" -msgstr "" +msgstr "Luôn luôn" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:6 msgid "Always off (kernel: none)" -msgstr "" +msgstr "Luôn luôn tắt (kernel: none)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:5 msgid "Always on (kernel: default-on)" -msgstr "" +msgstr "Luôn luôn bật (kernel: default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "" +"Luôn luôn gửi tùy chọn DHCP. Đôi khi cần thiết, ví dụ như với PXELinux." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" "Luôn sử dụng các kênh 40 MHz ngay cả khi kênh thứ cấp chồng lấp. Sử dụng tùy " -"chọn này không tuân thủ theo chuẩn 802.11n-2009" +"chọn này không tuân thủ theo chuẩn 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" -msgstr "" +msgstr "Số lượng yêu cầu phát hiện địa chỉ trùng lặp để gửi đi" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "Số giây chờ đợi để chờ modem sẵn sàng" #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" -msgstr "" +msgstr "Đã xảy ra lỗi khi lưu biểu mẫu:" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 msgid "An optional, short description for this device" -msgstr "" +msgstr "Một mô tả tùy chọn và ngắn gọn cho thiết bị này" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "" +msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." msgstr "" +"Thông báo tiền tố NAT64 trong thông báo RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." -msgstr "" +msgstr "Thông báo thiết bị này làm máy chủ DNS IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "" +"Thông báo thiết bị này làm bộ định tuyến mặc định nếu có tuyến mặc định IPv6 " +"cục bộ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." msgstr "" +"Thông báo thiết bị này làm bộ định tuyến mặc định nếu có tiền tố IPv6 công " +"cộng có sẵn, bất kể sự có sẵn của tuyến mặc định cục bộ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "" +"Thông báo thiết bị này làm bộ định tuyến mặc định bất kể có tiền tố hay " +"tuyến mặc định hiện tại." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "Thông báo tên miền DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" -msgstr "" +msgstr "Các máy chủ DNS IPv6 được thông báo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" -msgstr "Ẩn danh tính" +msgstr "Danh tính ẩn danh" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 msgid "Anonymous Mount" -msgstr "" +msgstr "Gắn kết ẩn danh" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 msgid "Anonymous Swap" -msgstr "" +msgstr "Swap ẩn danh" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" -msgstr "" +msgstr "Bất kỳ gói tin nào" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:84 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:174 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:196 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:60 msgid "Any zone" -msgstr "" +msgstr "Bất kỳ khu vực nào" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." -msgstr "" +msgstr "Áp dụng tùy chọn DHCP cho mạng này. (Trống = tất cả các máy khách)." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" -msgstr "" +msgstr "Áp dụng và giữ các thiết lập" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 msgid "Apply backup?" msgstr "Chấp nhận sao lưu?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "Áp dụng yêu cầu không thành công với trạng thái %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "Áp dụng không kiểm tra" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" -msgstr "" +msgstr "Áp dụng với việc hoàn nguyên sau khi mất kết nối" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "Đợi cấu hình được áp dụng... %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "Kiến trúc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" -msgstr "" +msgstr "Arp-scan" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "" -"Chỉ định một phần độ dài nhất định của mỗi tiền tố địa chỉ IPv6 công khai " +"Chỉ định một phần độ dài nhất định của mỗi tiền tố địa chỉ IPv6 công khai " "cho giao diện này" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "" "Chỉ định các phần tiền tố bằng tiền tố thức cấp ID dạng thập lục phân cho " -"giao diện này" +"giao diện này." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "Trạm liên kết" @@ -929,44 +1106,49 @@ msgstr "Trạm liên kết" msgid "Associations" msgstr "Liên kết" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" +"Ít nhất %h mỗi %h, xuất hiện dữ dội " +"%h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" msgstr "" +"Tối đa %h mỗi %h, xuất hiện dữ dội " +"%h" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 msgid "Attempt to enable configured mount points for attached devices" msgstr "" "Cố gắng kích hoạt các điểm gắn kết được cấu hình cho các thiết bị đính kèm" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "Nhóm xác thực" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "Xác thực" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" -msgstr "Kiểu xác thực" +msgstr "Loại xác thực" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "Xác thực" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "Yêu cầu ủy quyền" @@ -974,7 +1156,9 @@ msgstr "Yêu cầu ủy quyền" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -986,17 +1170,19 @@ msgstr "Thự động" #: modules/luci-compat/luasrc/model/network/proto_hnet.lua:7 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:7 msgid "Automatic Homenet (HNCP)" -msgstr "" +msgstr "Homenet tự động (HNCP)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 msgid "Automatically check filesystem for errors before mounting" msgstr "Tự động kiểm tra lỗi hệ thống tập tin trước khi cài đặt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." msgstr "" +"Tự động xử lý nhiều giao diện uplink bằng cách sử dụng định tuyến chính sách " +"dựa trên nguồn." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 msgid "Automatically mount filesystems on hotplug" @@ -1014,6 +1200,10 @@ msgstr "Tự động gắn kết tập tin hệ thống" msgid "Automount Swap" msgstr "Tự động gắn kết phân vùng Swao" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "Sẵn có" @@ -1030,13 +1220,17 @@ msgstr "Sẵn có" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:275 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:293 msgid "Average:" -msgstr "" +msgstr "Trung bình:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "Tránh vòng lặp cầu" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1044,30 +1238,30 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "Chuyển tiếp BSS" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" -msgstr "" +msgstr "Quay lại" #: modules/luci-compat/luasrc/view/cbi/footer.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:48 msgid "Back to Overview" msgstr "Quay lại phần tổng quan" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "Quay lại phần cài đặt" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" -msgstr "" +msgstr "Quay lại cấu hình điểm kết nối" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:391 msgid "Backup" @@ -1078,29 +1272,58 @@ msgid "Backup / Flash Firmware" msgstr "Sao lưu / cập nhật phần mềm" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "Danh sách tập tin sau lưu" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "Cấm" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" -msgstr "" +msgstr "Thiết bị gốc" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 msgid "Base64-encoded public key of this interface for sharing." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +msgstr "Khóa công khai của giao diện này được mã hóa dạng Base64 để chia sẻ." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Thiết bị Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Giao diện Batman" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv có chức năng phân mảnh tầng 2 tích hợp để dữ liệu unicast chảy " +"qua lưới mạng, cho phép chạy batman-adv trên các giao diện / kết nối không " +"cho phép tăng MTU vượt quá kích thước gói Ethernet tiêu chuẩn là 1500 byte. " +"Khi phân mảnh được kích hoạt, batman-adv sẽ tự động phân mảnh các gói quá " +"kích thước và ghép chúng ở đầu kia. Mặc định, phân mảnh được kích hoạt và " +"không hoạt động nếu gói vừa vặn, nhưng có thể hoàn toàn vô hiệu hóa phân " +"mảnh." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "Chu kỳ Beacon" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "Báo cáo Beacon" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1108,35 +1331,51 @@ msgid "" msgstr "" "Dưới đây là danh sách xác định các tập tin để sao lưu. Nó bao gồm các thay " "đổi tập tin cấu hình được đánh dấu bởi opkg, tập tin cơ sở thiết yếu và các " -"mẫu sao lưu của người dùng đá được xác định" +"mẫu sao lưu của người dùng đá được xác định." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:287 msgid "Bind NTP server" -msgstr "" +msgstr "Ràng buộc máy chủ NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "" "Liên kết linh hoạt với các giao diện thay vì địa chỉ ký tự đại diện(được " -"khuyến nghị làm mặc định của linux) " +"khuyến nghị làm mặc định của linux)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "Liên kết với giao diện" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "" +"Ràng buộc các bản ghi dịch vụ với tên miền: chỉ định vị trí của dịch vụ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"Ràng buộc các bản ghi dịch vụ với tên miền: chỉ định vị trí của dịch vụ. Xem " +"RFC2782." + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1146,89 +1385,125 @@ msgstr "Liên kết đường hầm dữ liệu với giao diện này (tùy ch #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:171 msgid "Bitrate" -msgstr "tốc độ (bit)" +msgstr "Bitrate" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "Chế độ kết nối" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" +msgstr "Chính sách kết nối" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" -msgstr "Cầu nối" +msgstr "Bridge" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" -msgstr "" +msgstr "Cầu (Hỗ trợ giao tiếp trực tiếp giữa các MAC VLAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" -msgstr "" +msgstr "Lọc VLAN của cầu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" -msgstr "" +msgstr "Thiết bị cầu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" -msgstr "" +msgstr "Tùy chọn cổng cầu cụ thể" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" -msgstr "" +msgstr "Các cổng cầu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" -msgstr "" +msgstr "Bảng giao thông cầu \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "Số cầu nối" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" -msgstr "" +msgstr "Kích hoạt cầu rỗng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "Áp dụng khi khởi động" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" +msgstr "Kích hoạt giao diện cầu ngay cả khi không có cổng nào được kết nối" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" -msgstr "" +msgstr "Chính sách phát sóng (phát sóng, 3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" -msgstr "Duyệt..." +msgstr "Duyệt qua…" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:40 msgid "Buffered" msgstr "Đệm" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "" +"Chứng chỉ CA (mã hóa PEM; Sử dụng thay thế cho hệ thống lưu trữ toàn cầu để " +"xác minh chứng chỉ cổng vào." + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." -msgstr "Chứng chỉ CA; nếu trống sẽ được lưu sau kết nối đầu tiên" +msgstr "Chứng chỉ CA; nếu trống sẽ được lưu sau kết nối đầu tiên." + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "Cài đặt CLAT thất bại" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME hoặc fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI (Giao diện quản lý bên ngoài)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "Sử dụng CPU (%)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:43 msgid "Cached" -msgstr "" +msgstr "Đã lưu cache" #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:53 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:53 @@ -1236,121 +1511,144 @@ msgstr "" msgid "Call failed" msgstr "Liên lạc thất bại" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "" +"Có thể hữu ích nếu nhà cung cấp dịch vụ Internet (ISP) có máy chủ tên miền " +"IPv6 nhưng không cung cấp định tuyến IPv6." + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" -msgstr "Hủy bỏ" +msgstr "Hủy lệnh" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:347 msgid "Cannot parse configuration: %s" -msgstr "" +msgstr "Không thể phân tích cấu hình: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" -msgstr "" +msgstr "Bắt gói tin đến từ các máy khác" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" -msgstr "" +msgstr "Bắt gói tin đến trước bất kỳ quyết định định tuyến nào" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" -msgstr "" +msgstr "Bắt gói tin đến được định tuyến đến hệ thống cục bộ" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" -msgstr "" +msgstr "Bắt gói tin đi ra sau bất kỳ quyết định định tuyến nào" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" -msgstr "" +msgstr "Bắt gói tin đi ra gốc từ hệ thống cục bộ" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" -msgstr "" +msgstr "Bắt gói tin trực tiếp sau khi NIC nhận chúng" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:17 msgid "Category" msgstr "Đề mục" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -msgid "Certificate constraint (Domain)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -msgid "Certificate constraint (SAN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +msgid "Certificate constraint (Domain)" +msgstr "Ràng buộc chứng chỉ (Miền)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +msgid "Certificate constraint (SAN)" +msgstr "Ràng buộc chứng chỉ (SAN)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" -msgstr "" +msgstr "Ràng buộc chứng chỉ (Chủ đề)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" -msgstr "" +msgstr "Ràng buộc chứng chỉ (Ký tự đại diện)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" msgstr "" +"Xâu con ràng buộc chứng chỉ - Ví dụ: /CN=wifi.mycompany.com
    Xem " +"`logread -f` trong quá trình bắt tay cho các giá trị thực tế" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "" +"Ràng buộc chứng chỉ đối với giá trị DNS SAN (nếu có)
    hoặc CN Chủ đề " +"(khớp chính xác)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "" +"Ràng buộc chứng chỉ đối với giá trị DNS SAN (nếu có)
    hoặc CN Chủ đề " +"(khớp hậu tố)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" msgstr "" +"Ràng buộc chứng chỉ thông qua giá trị Tên thay thế Chủ đề
    (các thuộc " +"tính được hỗ trợ: EMAIL, DNS, URI) - Ví dụ: DNS:wifi.mycompany.com" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:212 msgid "Chain" -msgstr "chuỗi" +msgstr "Dây" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" -msgstr "" +msgstr "Móc chuỗi \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "Thay đổi" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." -msgstr "Những thay đổi đã được phục hồi" +msgstr "Những thay đổi đã được phục hồi." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 msgid "Changes the administrator password for accessing the device" @@ -1359,62 +1657,66 @@ msgstr "Thay đổi mật khẩu quản trị viên truy cập thiết bị" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "Kênh" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" -msgstr "" +msgstr "Phân tích Kênh" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" -msgstr "" +msgstr "Độ rộng Kênh" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 msgid "Check filesystems before mount" msgstr "Kiểm tra hệ thống tập tin trước khi gắn kết" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." -msgstr "Kiểm tra tùy chọn này để xóa các mạng hiện có khỏi đài này" +msgstr "Kiểm tra tùy chọn này để xóa các mạng hiện có khỏi đài này." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:110 msgid "Checking archive…" -msgstr "Đang kiểm tra kho lưu trữ ..." +msgstr "Đang kiểm tra kho lưu trữ…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:193 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:195 msgid "Checking image…" -msgstr "Kiểm tra tập tin ảnh ..." +msgstr "Kiểm tra tập tin ảnh…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:427 msgid "Choose mtdblock" msgstr "chọn khối mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " "fill out the custom field to define a new zone and attach the " "interface to it." -msgstr "Giao diện này chưa thuộc về bất kỳ firewall zone nào." +msgstr "" +"Chọn vùng tường lửa mà bạn muốn gán cho giao diện này. Chọn không xác " +"định để xóa giao diện khỏi vùng được liên kết hoặc điền vào trường " +"tùy chỉnh để xác định vùng mới và đính kèm giao diện vào vùng đó." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "" "Chọn mạng bạn muốn đính kèm vào giao diện không dây này hoặc điền vàotrường " -"create để xác định một mạng mới" +"create để xác định một mạng mới." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" -msgstr "Mật mã" +msgstr "Cipher" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:91 msgid "Cisco UDP encapsulation" @@ -1424,7 +1726,7 @@ msgstr "Đóng gói dạng Cisco UDP" msgid "" "Click \"Generate archive\" to download a tar archive of the current " "configuration files." -msgstr "Nhấn \"Tạo bản lưu trữ\" Để tải xuống tập tin cấu hình hiện giờ " +msgstr "Nhấn \"Tạo bản lưu trữ\" Để tải xuống tập tin cấu hình hiện giờ." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:424 msgid "" @@ -1434,20 +1736,21 @@ msgstr "" "Nhấp \"chọn khối mtdblock\" để tải xuống tập tin mtdblock. (Chú ý: tính năng " "này chỉ nên dành cho chuyên gia" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" -msgstr "Khách hàng" +msgstr "Máy Khách" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:37 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:33 msgid "Client ID to send when requesting DHCP" msgstr "ID máy khách gửi khi yêu cầu DHCP" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "Đóng" @@ -1464,20 +1767,20 @@ msgstr "" "Đóng kết nối không hoạt động sau lượng thời gian đã cho, sử dụng 0 để luôn " "duy trì kết nối" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "Danh sách đã đóng ..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "Đang lấy dữ liệu..." +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "Lệnh" @@ -1494,7 +1797,7 @@ msgstr "Lệnh thất bại" msgid "Comment" msgstr "Bình luận" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1511,35 +1814,34 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:108 msgid "Compute outgoing checksum (optional)." -msgstr "" +msgstr "Tính toán checksum đầu ra (tùy chọn)." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Config File" -msgstr "" +msgstr "Tệp cấu hình" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "Cấu hình" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" -msgstr "" +msgstr "Xuất Cấu hình" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." -msgstr "Cấu hình đã được áp dụng" +msgstr "Cấu hình đã được áp dụng." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "Cấu hình đã được hoàn lại!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "Cấu hình thất bại" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1548,31 +1850,41 @@ msgid "" "the basic rate. Supported rates lower than the minimum basic rate are not " "offered." msgstr "" +"Cấu hình tốc độ dữ liệu dựa trên mật độ ô phủ của cell. Chế độ bình thường " +"cấu hình tốc độ cơ bản là 6, 12, 24 Mbps nếu không sử dụng tốc độ 802.11b cổ " +"điển, ngược lại sẽ là 5,5, 11 Mbps. Chế độ cao cấu hình tốc độ cơ bản là 12, " +"24 Mbps nếu không sử dụng tốc độ 802.11b cổ điển, ngược lại sẽ là tốc độ 11 " +"Mbps. Chế độ Rất cao cấu hình tốc độ cơ bản là 24 Mbps. Tốc độ hỗ trợ thấp " +"hơn tốc độ cơ bản tối thiểu sẽ không được cung cấp." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" +"Cấu hình thông báo bộ định tuyến mặc định trong các tin nhắn RA." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" +"Cấu hình chế độ hoạt động của dịch vụ RA trên giao diện này." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." -msgstr "" +msgstr "Cấu hình chế độ hoạt động của dịch vụ DHCPv6 trên giao diện này." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." -msgstr "" +msgstr "Cấu hình chế độ hoạt động của dịch vụ proxy NDP trên giao diện này." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" -msgstr "" +msgstr "Cấu hình…" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:176 msgid "Confirm disconnect" @@ -1582,9 +1894,10 @@ msgstr "Xác nhận hủy kết nối" msgid "Confirmation" msgstr "Xác nhận" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "Đã kết nối" @@ -1594,13 +1907,13 @@ msgstr "Đã kết nối" msgid "Connection attempt failed" msgstr "Kết nối thất bại" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." -msgstr "" +msgstr "Kết nối không thành công." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" -msgstr "" +msgstr "Điểm cuối kết nối" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:411 msgid "Connection lost" @@ -1610,37 +1923,41 @@ msgstr "Mất kết nối" msgid "Connections" msgstr "Kết nối" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" -msgstr "" +msgstr "Thay đổi kết nối" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:31 msgctxt "nft ct state" msgid "Conntrack state" -msgstr "" +msgstr "Trạng thái Conntrack" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:33 msgctxt "nft ct status" msgid "Conntrack status" -msgstr "" +msgstr "Tình trạng Conntrack" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:378 msgid "Consider the slave up when all ARP IP targets are reachable (all, 1)" msgstr "" +"Xem như slave đã kích hoạt khi tất cả các địa chỉ mục tiêu IP ARP có thể " +"truy cập (tất cả, 1)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:377 msgid "Consider the slave up when any ARP IP target is reachable (any, 0)" msgstr "" +"Xem như slave đã kích hoạt khi bất kỳ địa chỉ mục tiêu IP ARP nào có thể " +"truy cập (bất kỳ, 0)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:18 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:368 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:55 msgid "Contents have been saved." -msgstr "Nội dung đã được lưu" +msgstr "Nội dung đã được lưu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1649,18 +1966,18 @@ msgstr "Tiếp tục" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:97 msgctxt "nft jump action" msgid "Continue in %h" -msgstr "" +msgstr "Tiếp tục trong %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" -msgstr "" +msgstr "Tiếp tục trong chuỗi gọi" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" -msgstr "" +msgstr "Tiếp tục xử lý các gói tin không khớp" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1674,20 +1991,20 @@ msgstr "" msgid "Country" msgstr "Quốc gia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "Mã quốc gia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" -msgstr "" +msgstr "Mật độ ô phủ của cell" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "Tạo/ gán firewall-zone" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "Tạo giao diện kết nối" @@ -1699,19 +2016,19 @@ msgstr "Quan trọng" msgid "Cron Log Level" msgstr "Cấp độ lưu nhật ký Cron" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "Năng lượng truyền hiện tại" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:28 msgctxt "nft meta hour" msgid "Current time" -msgstr "" +msgstr "Thời gian hiện tại" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:29 msgctxt "nft meta day" msgid "Current weekday" -msgstr "" +msgstr "Ngày trong tuần hiện tại" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:573 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:575 @@ -1732,7 +2049,7 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:6 msgid "Custom flash interval (kernel: timer)" -msgstr "" +msgstr "Khoảng thời gian nháy tùy chỉnh (kernel: timer)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:59 msgid "" @@ -1742,31 +2059,31 @@ msgstr "" "Tùy chỉnh chế độ của thiết bị LEDs nếu có thể." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" -msgstr "" +msgstr "DAD truyền" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "Máy khách DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "Cổng DAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAE-bí mật" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" -msgstr "" +msgstr "Tùy chọn DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "Máy chủ DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP và DNS" @@ -1777,16 +2094,22 @@ msgstr "DHCP và DNS" msgid "DHCP client" msgstr "Máy khách DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "Tùy chọn DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "Máy khách DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "Dịch vụ DHCPv6" @@ -1796,21 +2119,21 @@ msgstr "Dịch vụ DHCPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:48 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:49 msgid "DNS" -msgstr "" +msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" -msgstr "" +msgstr "Chuyển tiếp DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNS query port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" -msgstr "" +msgstr "Miền tìm kiếm DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "" "DNS " @@ -1818,21 +2141,21 @@ msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:292 msgid "DNS setting is invalid" -msgstr "" +msgstr "Thiết lập DNS không hợp lệ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" -msgstr "" +msgstr "Trọng số DNS" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:33 msgid "DNS-Label / FQDN" -msgstr "" +msgstr "DNS-Label / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" -msgstr "" +msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "kiểm tra không dấu DNSSEC" @@ -1844,108 +2167,124 @@ msgstr "Thời gian chờ rỗi DPD" msgid "DS-Lite AFTR address" msgstr "Địa chỉ DS_-Lite AFTR" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "Trạng thái DSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "Chế độ DSL Line" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "Chu kỳ DTIM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "Tốc độ dữ liệu" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "Đã nhận dữ liệu" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "Dữ liệu đã được truyền tải" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" -msgstr "Kiểm lỗi" +msgstr "Debug" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" -msgstr "" +msgstr "Bộ định tuyến mặc định" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:12 msgid "Default state" msgstr "Trạng thái mặc định" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " "servers to clients." msgstr "" +"Xác định các tùy chọn DHCP bổ sung, ví dụ như " +"\"6,192.168.2.1,192.168.2.2\" để quảng bá các máy chủ DNS khác " +"nhau đến các máy khách." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "" +"Xác định một ánh xạ từ ưu tiên gói tin nội bộ Linux sang ưu tiên tiêu đề " +"VLAN nhưng dành cho các khung gửi đi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "" +"Xác định một ánh xạ từ ưu tiên tiêu đề VLAN sang ưu tiên gói tin nội bộ " +"Linux trên các khung gửi đến" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" -msgstr "" +msgstr "Xác định một MTU cụ thể cho tuyến đường này" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" -msgstr "" +msgstr "Uỷ nhiệm các tiền tố IPv6" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" -msgstr "Xóa" +msgstr "Xoá" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "Xóa chìa khóa" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "Yêu cầu xóa thất bại: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "Xóa mạng này" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "Chu kỳ thông báo chỉ thị lưu thông" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "Mô tả" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "Bỏ chọn" @@ -1953,11 +2292,11 @@ msgstr "Bỏ chọn" msgid "Design" msgstr "Thiết kế" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" -msgstr "" +msgstr "Master đã chỉ định" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1966,35 +2305,35 @@ msgstr "Điểm đến" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:44 msgctxt "nft ip daddr" msgid "Destination IP" -msgstr "" +msgstr "IP đích" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:48 msgctxt "nft ip6 daddr" msgid "Destination IPv6" -msgstr "" +msgstr "IPv6 đích" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:48 msgid "Destination port" -msgstr "" +msgstr "Cổng đích" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:46 msgctxt "nft ip dport" msgid "Destination port" -msgstr "" +msgstr "Cổng đến" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 msgid "Destination zone" -msgstr "Vùng đích" +msgstr "Vùng điểm đến" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:67 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2002,70 +2341,74 @@ msgstr "Vùng đích" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:357 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:393 msgid "Device" -msgstr "Công cụ" +msgstr "Thiết bị" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "Cài đặt thiết bị" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "thiết bị chưa được kích hoạt" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" -msgstr "Khởi động lại thiết bị ..." +msgstr "Khởi động lại thiết bị…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" -msgstr "" +msgstr "Tên thiết bị" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." -msgstr "" +msgstr "Thiết bị không được quản lý bởi ModemManager." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" -msgstr "" +msgstr "Thiết bị không có mặt" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" -msgstr "" +msgstr "Loại thiết bị" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" -msgstr "Thiết bị không thể truy cập! " +msgstr "Thiết bị không thể truy cập!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:53 msgid "Device unreachable! Still waiting for device..." -msgstr "Thiết bị không thể truy cập! Chờ thiết bị..." +msgstr "Thiết bị không thể kết nối! Vẫn đang chờ đợi thiết bị..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" -msgstr "" +msgstr "Các thiết bị" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" -msgstr "Phân tích" +msgstr "Chẩn đoán" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "Quay số" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" -msgstr "Danh mục" +msgstr "Thư mục" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "Vô hiệu hóa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2076,107 +2419,123 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:375 msgid "Disable DNS lookups" -msgstr "" +msgstr "Vô hiệu hóa tìm kiếm DNS" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 msgid "Disable Encryption" msgstr "Vô hiệu hóa mã hóa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "Vô hiệu hóa thăm dò tín hiệu không hoạt động" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "Vô hiệu hóa mạng này" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:70 msgid "Disabled" -msgstr "Vô hiệu hóa" +msgstr "Vô hiệu hoá" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" -msgstr "" +msgstr "Đã vô hiệu hoá" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "Hủy liên kết với xác nhận mức thấp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." -msgstr "Hủy phản hồi ngược RFC1918." +msgstr "Hủy các phản hồi ngược dòng chứa địa chỉ RFC1918." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "Ngắt kết nối" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "Kết nối thất bại" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." -msgstr "" +msgstr "Cố gắng ngắt kết nối không thành công." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:35 msgid "Disk space" -msgstr "" +msgstr "Dung lượng đĩa" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "Bỏ qua" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "Khoảng cách tối ưu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." -msgstr "Khoảng cách tới thành viên xa nhất trong mạng lưới tính bằng mét" +msgstr "Khoảng cách tới thành viên xa nhất trong mạng lưới tính bằng mét." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "Bảng ARP phân tán" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." msgstr "" +"Phiên bản Dnsmasq mà phần khởi động này được ràng buộc. Nếu không xác định, " +"phần này có hiệu lực cho tất cả các phiên bản Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNS forwarder." msgstr "" -"Dnsmasq là một phối hợp DHCP-Server and DNS-Forwarder for NAT " -"firewalls" +"Dnsmasq là một máy chủ DHCP nhẹ và trình chuyển tiếp DNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "" -"Không lưu trữ các phản hồi tiêu cực (ví dụ: các tên miền không tồn tại)" +"Không lưu trữ các phản hồi tiêu cực (ví dụ: các tên miền không tồn tại)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 @@ -2184,56 +2543,51 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:70 msgid "Do not create host route to peer (optional)." -msgstr "" +msgstr "Không tạo tuyến đường chủ đến ngang hàng (tùy chọn)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "Don&#39;t chuyển tiếp DNS-Yêu " -"cầu không cần DNS-Tên" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "Không chuyển tiếp yêu cầu mà máy chủ tên công cộng không thể trả lời" +"cầu không cần DNS-Tên." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." -msgstr "Không chuyển tiếp tra cứu ngược cho các mạng cục bộ" +msgstr "Không chuyển tiếp tra cứu ngược cho các mạng cục bộ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." -msgstr "Ngăn thực hiện nghe tại giao diện mạng này" +msgstr "Ngăn thực hiện nghe tại giao diện mạng này." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "" +msgstr "Không cung cấp dịch vụ DHCPv6 trên giao diện này." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." msgstr "" +"Không proxy bất kỳ gói tin NDP nào." #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:25 msgid "Do not send a hostname" -msgstr "" +msgstr "Không gửi tên máy chủ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." msgstr "" +"Không gửi bất kỳ thông báo RA nào trên giao diện này." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "Bạn thật sự muốn xóa \"%s\" ?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "Bạn thật sự muốn xóa khóa SSH này?" @@ -2241,27 +2595,29 @@ msgstr "Bạn thật sự muốn xóa khóa SSH này?" msgid "Do you really want to erase all settings?" msgstr "Bạn có thật sự muốn xóa tất cả cài đặt này?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "Bạn thật sự muốn xóa toàn bộ thư mục \"%s\" ?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" -msgstr "" +msgstr "Bạn có muốn thay thế PSK hiện tại không?" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:100 msgid "Do you want to replace the current keys?" -msgstr "" +msgstr "Bạn có muốn thay thế các khóa hiện tại không?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" -msgstr "" +msgstr "Tên Miền" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "Tên miền yêu cầu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "Danh sách tên miền được chấp nhận" @@ -2277,7 +2633,7 @@ msgstr "Xuống" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:403 msgid "Down Delay" -msgstr "" +msgstr "Độ trễ xuống" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:394 msgid "Download backup" @@ -2287,15 +2643,17 @@ msgstr "Tải xuống bản sao lưu" msgid "Download mtdblock" msgstr "Tải xuống mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" -msgstr "" +msgstr "Khoảng cách SNR hạ lưu" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." msgstr "" +"Kéo hoặc dán tệp *.conf hợp lệ bên dưới để định cấu hình giao diện " +"WireGuard cục bộ." #: modules/luci-base/htdocs/luci-static/resources/form.js:2698 msgid "Drag to reorder" @@ -2303,21 +2661,66 @@ msgstr "Kéo để tổ chức lại" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:342 msgid "Drop Duplicate Frames" +msgstr "Hủy các khung trùng lặp" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." msgstr "" +"Hủy tất cả các khung ARP vô tác dụng, ví dụ: nếu có một proxy ARP tốt được " +"biết đến trên mạng và các khung như vậy không cần được sử dụng hoặc trong " +"trường hợp 802.11, không được sử dụng để ngăn chặn các cuộc tấn công." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"Loại bỏ tất cả các thông báo hàng xóm không được yêu cầu, ví dụ nếu có một " +"proxy NA tốt đã biết trên mạng và các khung như vậy không cần được sử dụng " +"hoặc trong trường hợp 802.11, không được sử dụng để ngăn chặn các cuộc tấn " +"công." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "Loại bỏ ARP không cần thiết" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "Loại bỏ các khung đa phát layer 2 chứa gói tin unicast IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "Loại bỏ các khung đa phát layer 2 chứa gói tin unicast IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "Loại bỏ gói tin unicast IPv4 lồng nhau" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "Loại bỏ gói tin unicast IPv6 lồng nhau" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" -msgstr "" +msgstr "Loại bỏ gói tin" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" -msgstr "" +msgstr "Loại bỏ các gói tin không khớp" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "Loại bỏ NA không được yêu cầu" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" -msgstr "" +msgstr "Phiên bản Dropbear" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 msgid "" @@ -2330,57 +2733,73 @@ msgstr "" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:14 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:11 msgid "Dual-Stack Lite (RFC6333)" -msgstr "" +msgstr "Dual-Stack Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "" "Dynamic DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." -msgstr "" +msgstr "Mở rộng ủy quyền động - khách hàng." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." -msgstr "" +msgstr "Cổng mở rộng ủy quyền động." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." -msgstr "" +msgstr "Mật khẩu bí mật cho Cổng mở rộng ủy quyền động." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 msgid "Dynamic tunnel" msgstr "Đường hầm động" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" "Tự động phân bổ địa chỉ DHCP cho máy khách. Nếu bị vô hiệu hóa, chỉ những " -"máy khách có xin địa chỉ IP tĩnh sẽ được phục vụ" +"máy khách có xin địa chỉ IP tĩnh sẽ được phục vụ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "Ví dụ: br-vlan hoặc brvlan." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "Ví dụ: eth0, eth1" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "Độ dài EA-bits" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAP-Method" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "Mỗi STA được gán một giao diện AP_VLAN riêng của nó." + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" -msgstr "Chỉnh sửa" +msgstr "Chỉnh Sửa" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:226 msgid "Edit peer" +msgstr "Chỉnh sửa ngang hàng" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" msgstr "" #: modules/luci-compat/luasrc/view/cbi/error.htm:13 @@ -2391,57 +2810,48 @@ msgstr "" "Chỉnh sửa dữ liệu cấu hình thô ở trên để khắc phục mọi lỗi và nhấn \" Lưu " "\"để tải lại trang." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "Chỉnh sửa mạng này" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "Chỉnh sửa mạng không dây" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:65 msgctxt "nft rt mtu" msgid "Effective route MTU" -msgstr "" +msgstr "MTU tuyến đường hiệu quả" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" -msgstr "" +msgstr "Ánh xạ QoS ra" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" -msgstr "" +msgstr "ID thiết bị ra" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "" +msgstr "Tên thiết bị ra" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "Khẩn cấp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" -msgstr "Kích hoạt" +msgstr "Bật lên" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "" +"Bật / Tắt ngang hàng. Khởi động lại giao diện wireguard để áp dụng thay đổi." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" @@ -2449,32 +2859,34 @@ msgstr "" "Kích hoạt IGMP " "được phép quan sát" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "Kích hoạt STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "" +"Bật SLAAC" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:369 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:375 msgid "Enable DNS lookups" -msgstr "" +msgstr "Bật tìm kiếm DNS" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:294 msgid "Enable Dynamic Shuffling Of Flows" -msgstr "" +msgstr "Bật xáo trộn động của luồng dữ liệu" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 msgid "Enable HE.net dynamic endpoint update" msgstr "Kích hoạt cập nhật động những trang có đuôi HE.net" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" -msgstr "" +msgstr "Bật IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "Kích hoạt IPv6" @@ -2488,13 +2900,17 @@ msgstr "Kích hoạt IPv6" msgid "Enable IPv6 negotiation on the PPP link" msgstr "Kích hoạt IPv6 cho kết nối PPP" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "Bật định tuyến phân đoạn IPv6" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "Cho phép khung Jumbo Frame qua" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" -msgstr "" +msgstr "Bật học địa chỉ MAC" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:257 msgid "Enable NTP client" @@ -2504,19 +2920,19 @@ msgstr "Kích hoạt máy chủ NTP" msgid "Enable Single DES" msgstr "Kích hoạt DES đơn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "Kích hoạt máy chủ TFTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" -msgstr "" +msgstr "Bật bộ lọc VLAN" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:184 msgid "Enable VLAN functionality" msgstr "Kích hoạt chức năng VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "Kích hoạt nút nhấn WPS, yêu cầu WPA(2)-PSK/WPA3-SAE" @@ -2526,13 +2942,17 @@ msgid "" "Protocol\">HTTP requests to HTTPS port." msgstr "" +"Bật chuyển hướng tự động yêu cầu HTTP sang cổng HTTPS." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "" +"Bật ủy quyền xuống hạ tầng của các tiền tố IPv6 có sẵn trên giao diện này" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "Kích hoạt các biện pháp đối phó cài đặt lại khóa (KRACK)" @@ -2548,80 +2968,93 @@ msgstr "Kích hoạt phản chiếu các gói tin đến" msgid "Enable mirroring of outgoing packets" msgstr "Kích hoạt phản chiếu các gói tin đi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" -msgstr "" +msgstr "Bật rời khỏi đa phát nhanh" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" -msgstr "" +msgstr "Bật multicast querier" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" -msgstr "" +msgstr "Bật hỗ trợ đa phát" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "" +"Kích hoạt chuyển gói tin trên tất cả các CPU. Có thể giúp hoặc cản trở tốc " +"độ mạng." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" -msgstr "" +msgstr "Kích hoạt chế độ promiscuous" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:71 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:66 msgid "Enable rx checksum" -msgstr "" +msgstr "Kích hoạt kiểm tra tổng kiểm tra nhận (rx)" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:96 msgid "Enable support for multicast traffic (optional)." -msgstr "" +msgstr "Kích hoạt hỗ trợ cho lưu lượng multicast (tùy chọn)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:83 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:88 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." -msgstr "Kích hoạt cờ không phân mảnh cho các gói tin đã được đóng gói" +msgstr "Kích hoạt cờ không phân mảnh cho các gói tin đã được đóng gói." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." -msgstr "" +msgstr "Kích hoạt máy chủ TFTP tích hợp duy nhất." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "Kích hoạt mạng này" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:75 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:70 msgid "Enable tx checksum" -msgstr "" +msgstr "Kích hoạt kiểm tra tổng kiểm tra gửi (tx)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" -msgstr "" +msgstr "Kích hoạt tràn unicast" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" -msgstr "Bật" +msgstr "Kích Hoạt" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "Cho phép IGMP theo dõi cầu tin này" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" "Cho phép chuyển vùng nhanh giữa các điểm truy cập thuộc cùng một miền di động" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "" +"Kích hoạt cơ sở hạ tầng chuyển tiếp multicast nhóm hiệu quả hơn trong batman-" +"adv." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "Kích hoạt Spanning Tree Protocol trên cầu nối này" @@ -2629,50 +3062,55 @@ msgstr "Kích hoạt Spanning Tree Protocol trên cầu nối này" msgid "Encapsulation limit" msgstr "Giới hạn đóng gói tin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "Chế độ đóng gói" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "Mã hóa" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "Điểm cuối" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" -msgstr "" +msgstr "Máy chủ điểm cuối" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" -msgstr "" +msgstr "Cổng điểm cuối" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:325 msgid "Endpoint setting is invalid" -msgstr "" +msgstr "Cài đặt điểm cuối không hợp lệ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" -msgstr "" +msgstr "Bắt tuân thủ IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" -msgstr "" +msgstr "Bắt tuân thủ IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" -msgstr "" +msgstr "Bắt tuân thủ IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" -msgstr "" +msgstr "Bắt tuân thủ phiên bản MLD 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" -msgstr "" +msgstr "Bắt tuân thủ phiên bản MLD 2" #: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 msgid "Enter custom value" @@ -2697,11 +3135,7 @@ msgstr "Lỗi" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:170 msgid "Error getting PublicKey" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "" +msgstr "Lỗi khi nhận PublicKey" #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 @@ -2715,81 +3149,99 @@ msgstr "Bộ chuyển đảo ethernet" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:272 msgid "Every 30 seconds (slow, 0)" -msgstr "" +msgstr "Mỗi 30 giây (chậm, 0)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:273 msgid "Every second (fast, 1)" -msgstr "" +msgstr "Mỗi giây (nhanh, 1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" +msgstr "Loại trừ giao diện" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." msgstr "" +"Thực thi các lệnh mạng khác nhau để kiểm tra kết nối và giải quyết tên đến " +"các hệ thống khác." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." -msgstr "Cho phép phản hồi ngược trong dải IP 127.0.0.0/8 cho dịch vụ RBL" +msgstr "" +"Miễn cho 127.0.0.0/8 và ::1 kiểm tra ràng buộc " +"lại, ví dụ: cho các dịch vụ RBL." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" -msgstr "" +msgstr "Thiết bị hiện có" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "Mở rộng máy chủ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "Số cổng được mong đợi." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "Cần một gợi ý gán thập lục phân" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" -msgstr "" +msgstr "Đang mong đợi một địa chỉ IPv4 hợp lệ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" +msgstr "Đang mong đợi một địa chỉ IPv6 hợp lệ" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" -msgstr "" +msgstr "Đang mong đợi hai giá trị ưu tiên phân cách bằng dấu hai chấm" #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:64 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" -msgstr "Mong đợi: %s" +msgstr "Đang chờ: %s" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:50 msgid "Expecting: non-empty value" -msgstr "" +msgstr "Đang mong đợi: giá trị không rỗng" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:50 msgid "Expires" msgstr "Hết hạn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." -msgstr "Thời gian mượn địa chỉ sắp hết, tối đa 2 phút nữa (2m)" +msgstr "Thời gian mượn địa chỉ sắp hết, tối đa 2 phút nữa (2m)." #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:19 msgid "External" msgstr "Bên ngoài" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "Danh sách chủ sở hữu khóa R0 bên ngoài" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "Danh sách chủ sở hữu khóa R1 bên ngoài" @@ -2811,99 +3263,141 @@ msgstr "Tùy chỉnh lệnh SSH bổ sung" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 msgid "Extra pppd options" -msgstr "" +msgstr "Tùy chọn pppd bổ sung" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "Extra sstpc options" -msgstr "" +msgstr "Tùy chọn sstpc bổ sung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT qua DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" -msgstr "" +msgstr "FT qua không gian" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "Giao thức FT" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." -msgstr "Đổi mật khẩu hệ thống thất bại" +msgstr "Đổi mật khẩu hệ thống thất bại." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "Không thể cấu hình modem" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" -msgstr "Thất bại khi xác thực áp dụng %ds, đợi làm lại..." +msgstr "Không thể xác nhận áp dụng trong %ds, đang chờ quay lại…" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "Không kết nối được" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "Không thể ngắt kết nối" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "Thất bại khi thực thi \"/etc/init.d/%s %s\" hành động: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "Không thể lấy thông tin modem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "Không thể khởi tạo modem" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "Không thể đặt chế độ hoạt động" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" -msgstr "Tệp tin" +msgstr "Tệp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." msgstr "" -"Tệp này có thể chứa các dòng như 'máy chủ = /tền miền/1.2.3.4' hoặc 'máy " -"chủ=1.2.3.4' cho các máy chủ DNS . " +"Tệp liệt kê các trình phân giải ngược dòng, tùy chọn dành riêng cho miền, ví " +"dụ: server=1.2.3.4, server=/domain/1.2.3.4." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "Tệp tin không thể truy cập" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "" "Tập tin được cho DHCP-leases sẽ được lưu trữ" +"abbr>-leases sẽ được lưu trữ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." -msgstr "Tập tin DNS địa phương" +msgstr "Tập tin DNS địa phương." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" -msgstr "Tên tệp" +msgstr "Tên tệp tin" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." -msgstr "Tên tệp của tập tin ảnh khởi động được thông báo cho máy khách" +msgstr "Tên tệp của tập tin ảnh khởi động được thông báo cho máy khách." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:315 msgid "Filesystem" -msgstr "Tập tin hệ thống" +msgstr "Hệ thống tệp tin" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "Lọc bản ghi IPv4 A" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "Lọc bản ghi IPv6 AAAA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "Lọc khám phá dịch vụ SRV/SOA" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "Filter private" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "Lọc không hữu dụng" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" -msgstr "" +msgstr "Lọc cho tất cả các slave, không có xác thực" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:390 msgid "Filtering for all slaves, validation only for active slave" -msgstr "" +msgstr "Lọc cho tất cả các slave, chỉ xác thực cho slave đang hoạt động" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:391 msgid "Filtering for all slaves, validation only for backup slaves" +msgstr "Lọc cho tất cả các slaves, chỉ xác minh cho slaves dự phòng" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." msgstr "" +"Lọc khám phá dịch vụ SRV/SOA, để tránh kích hoạt các liên kết đòi hỏi kết " +"nối tức thì." #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "Cố gắng hoàn thành thất bại" @@ -2915,7 +3409,7 @@ msgstr "" "Tìm tất cả các tập tin hệ thống hiện được đính kèm và trao đổi và thay thế " "cấu hình bằng mặc định dựa trên những gì được phát hiện" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "Tìm và hòa mạng" @@ -2929,10 +3423,11 @@ msgid "Firewall" msgstr "Tường lửa" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "Dấu tường lửa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "Cấu hình tường lửa" @@ -2940,21 +3435,21 @@ msgstr "Cấu hình tường lửa" msgid "Firewall Status" msgstr "Trạng thái tường lửa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" -msgstr "" +msgstr "Đánh dấu tường lửa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "Tập tin phần mềm" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" -msgstr "Phiên bản phần mềm" +msgstr "Phiên bản firmware" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." -msgstr "Đã sửa cổng nguồn cho các truy vấn DNS" +msgstr "Đã sửa cổng nguồn cho các truy vấn DNS." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:312 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:449 @@ -2976,43 +3471,51 @@ msgstr "Hoạt động nạp phần mềm" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:317 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:319 msgid "Flashing…" -msgstr "Đang nạp..." +msgstr "Đang nạp vào…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "Bắt buộc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "Bắt buộc áp dụng chế độ 40MHZ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "Bắt buộc chế độ CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "" -"Buộc sử dụng DHCP trên mạng này ngay cả khi máy chủ khác được phát hiện" +"Buộc sử dụng DHCP trên mạng này ngay cả khi máy chủ khác được phát hiện." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" -msgstr "" +msgstr "Bắt buộc phiên bản IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" -msgstr "" +msgstr "Bắt buộc phiên bản MLD" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "Buộc TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "Buộc TKIP và CCMP (AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "Buộc liên kết" @@ -3024,67 +3527,81 @@ msgstr "Buộc cập nhật" msgid "Force use of NAT-T" msgstr "Buộc dùng NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "Mẫu mã thông báo không khớp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NA messages between the " "designated master interface and downstream interfaces." msgstr "" +"Chuyển tiếp các tin nhắn NDP NS và NA giữa giao diện chính " +"xác của master và các giao diện hạ lưu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " "interfaces." msgstr "" +"Chuyển tiếp các tin nhắn RA nhận được trên giao diện chính xác của master đến các giao " +"diện hạ lưu." #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:164 msgid "Forward DHCP traffic" msgstr "Chuyển tiếp lưu lượng DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" +"Chuyển tiếp các tin nhắn DHCPv6 giữa giao diện chính xác của master và các " +"giao diện hạ lưu." #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "Chuyển tiếp phát sóng" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" -msgstr "" +msgstr "Độ trễ chuyển tiếp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "Chuyển tiếp lưu lượng mạng (mesh) ngang hàng" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "" +"Chuyển tiếp các gói tin đa phát như các gói tin đơn phát trên thiết bị này." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "Chế độ chuyển tếp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "Phân mảnh" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "Ngưỡng cửa Phân đoạn" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:62 msgctxt "nft nat flag fully-random" msgid "Full port randomization" -msgstr "" +msgstr "Ngẫu nhiên cổng đầy đủ" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:214 msgid "" @@ -3101,31 +3618,35 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "Chỉ dùng GPRS" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:10 msgid "GRE tunnel over IPv4" -msgstr "" +msgstr "Đường hầm GRE qua IPv4" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:10 msgid "GRE tunnel over IPv6" -msgstr "" +msgstr "Đường hầm GRE qua IPv6" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:10 msgid "GRETAP tunnel over IPv4" -msgstr "" +msgstr "Đường hầm GRETAP qua IPv4" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:10 msgid "GRETAP tunnel over IPv6" -msgstr "" +msgstr "Đường hầm GRETAP qua IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" -msgstr "" +msgstr "Cổng ra" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "Chế độ Gateway" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" @@ -3136,31 +3657,31 @@ msgstr "Cổng Gateway" msgid "Gateway address is invalid" msgstr "Địa chỉ Gateway không hợp lệ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" -msgstr "Tùy chỉnh chung" +msgstr "Các cài đặt chung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "Cài đặt chung" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" -msgstr "" +msgstr "Tùy chọn thiết bị chung" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 msgid "Generate Config" msgstr "Cấu hình chung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "Tạo PMK cục bộ" @@ -3168,29 +3689,29 @@ msgstr "Tạo PMK cục bộ" msgid "Generate archive" msgstr "Tạo bản lưu trữ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" -msgstr "" +msgstr "Tạo cấu hình" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" -msgstr "" +msgstr "Tạo cấu hình…" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:109 msgid "Generate new key pair" -msgstr "" +msgstr "Tạo cặp khóa mới" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" -msgstr "" +msgstr "Tạo khóa chia sẻ trước" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" -msgstr "" +msgstr "Tạo một cấu hình phù hợp để nhập vào một WireGuard peer" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" -msgstr "" +msgstr "Đang tạo mã QR…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:79 msgid "Given password confirmation did not match, password not changed!" @@ -3198,131 +3719,140 @@ msgstr "Phát hiện mật khẩu không khớp, mật khẩu không thay đổi #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:146 msgid "Global Settings" -msgstr "Cài đặt toàn cục" +msgstr "Cài đặt chung" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "Tùy chọn mạng toàn cầu" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." -msgstr "" +msgstr "Chuyển đến nâng cấp firmware..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "Tới trang cài đặt mật khẩu..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" -msgstr "Đi tới trang cấu hình thích hợp" +msgstr "Chuyển đến trang cấu hình liên quan" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" -msgstr "" +msgstr "Cấp quyền truy cập vào cấu hình DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" -msgstr "" +msgstr "Cấp quyền truy cập vào màn hình trạng thái DHCP" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" -msgstr "" +msgstr "Cấp quyền truy cập hiển thị trạng thái DSL" #: protocols/luci-proto-openconnect/root/usr/share/rpcd/acl.d/luci-openconnect.json:3 msgid "Grant access to LuCI OpenConnect procedures" -msgstr "" +msgstr "Cấp quyền truy cập vào các thủ tục LuCI OpenConnect" #: protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json:3 msgid "Grant access to LuCI Wireguard procedures" -msgstr "" +msgstr "Cấp quyền truy cập vào các thủ tục LuCI Wireguard" + +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "Cấp quyền truy cập vào các thủ tục LuCI openfortivpn" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" -msgstr "" +msgstr "Cấp quyền truy cập vào cấu hình SSH" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:12 msgid "Grant access to basic LuCI procedures" -msgstr "" +msgstr "Cấp quyền truy cập vào các thủ tục LuCI cơ bản" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:79 msgid "Grant access to crontab configuration" -msgstr "" +msgstr "Cấp quyền truy cập vào cấu hình crontab" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:70 msgid "Grant access to firewall status" -msgstr "" +msgstr "Cấp quyền truy cập vào trạng thái tường lửa" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:132 msgid "Grant access to flash operations" -msgstr "" +msgstr "Cấp quyền truy cập vào hoạt động flash" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:3 msgid "Grant access to main status display" -msgstr "" +msgstr "Cấp quyền truy cập vào màn hình trạng thái chính" #: protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json:3 msgid "Grant access to mmcli" -msgstr "" +msgstr "Cấp quyền truy cập vào mmcli" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:100 msgid "Grant access to mount configuration" -msgstr "" +msgstr "Cấp quyền truy cập vào cấu hình mount" #: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:3 msgid "Grant access to network configuration" -msgstr "" +msgstr "Cấp quyền truy cập vào cấu hình mạng" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" -msgstr "" +msgstr "Cấp quyền truy cập vào công cụ chẩn đoán mạng" #: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:36 msgid "Grant access to network status information" +msgstr "Cấp quyền truy cập vào thông tin trạng thái mạng" + +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" msgstr "" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" -msgstr "" +msgstr "Cấp quyền truy cập vào trạng thái tiến trình" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:3 msgid "Grant access to realtime statistics" -msgstr "" +msgstr "Cấp quyền truy cập vào thống kê thời gian thực" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:47 msgid "Grant access to routing status" -msgstr "" +msgstr "Cấp quyền truy cập vào trạng thái định tuyến" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:57 msgid "Grant access to startup configuration" -msgstr "" +msgstr "Cấp quyền truy cập vào cấu hình khởi động" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:3 msgid "Grant access to system configuration" -msgstr "" +msgstr "Cấp quyền truy cập vào cấu hình hệ thống" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:30 msgid "Grant access to system logs" -msgstr "" +msgstr "Cấp quyền truy cập vào nhật ký hệ thống" #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:43 msgid "Grant access to uHTTPd configuration" -msgstr "" +msgstr "Cấp quyền truy cập vào cấu hình uHTTPd" #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:61 msgid "Grant access to wireless channel status" -msgstr "" +msgstr "Cấp quyền truy cập vào trạng thái kênh không dây" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" -msgstr "" +msgstr "Cấp quyền truy cập vào hiển thị trạng thái không dây" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66 msgid "Group Password" @@ -3334,32 +3864,28 @@ msgstr "Máy khách" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 msgid "HE.net password" -msgstr "" +msgstr "Mật khẩu HE.net" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "HE.net username" -msgstr "" +msgstr "Tên người dùng HE.net" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:9 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:64 msgid "HTTP(S) Access" -msgstr "" +msgstr "Truy cập HTTP(S)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:46 msgid "Hang Up" msgstr "Hang Up" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "Lỗi mã tiêu đề (HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" -msgstr "" +msgstr "Khoảng thời gian nhịp tim (kernel: nhịp tim)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" -msgstr "" +msgstr "Khoảng thời gian Hello" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:114 msgid "" @@ -3369,7 +3895,7 @@ msgstr "" "Ở đây bạn có thể cấu hình những đặc tính cơ bản của thiết bị như tên máy chủ " "hoặc múi giờ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "Giấu ESSID" @@ -3378,69 +3904,86 @@ msgstr "Giấu ESSID%h
    (%h), Priority: %d" -msgstr "" +msgstr "Hook: %h (%h), Ưu tiên: %d" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "Hình phạt Hops" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" -msgstr "Máy chủ" +msgstr "Host" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 msgid "Host expiry timeout" -msgstr "" +msgstr "Thời gian chờ hết hạn máy chủ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." -msgstr "" +msgstr "Máy chủ yêu cầu tên tệp này từ máy chủ khởi động." #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 msgid "Host-Uniq tag content" msgstr "Nội dung thẻ Host-Uniq" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" -msgstr "Tên host" +msgstr "Tên máy chủ (hostname)" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:22 msgid "Hostname to send when requesting DHCP" msgstr "Tên máy chủ khi yêu cầu DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "Tên máy chủ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " "useful to rebind an FQDN." msgstr "" +"Tên máy chủ được sử dụng để liên kết tên miền với địa chỉ IP. Thiết lập này " +"không cần thiết đối với các tên máy chủ đã được cấu hình với thuê bao tĩnh, " +"nhưng nó có thể hữu ích để ràng buộc lại một FQDN." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:19 msgid "How long (in milliseconds) the LED should be off" -msgstr "" +msgstr "Thời gian (tính bằng mili giây) LED nên tắt" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:13 msgid "How long (in milliseconds) the LED should be on" -msgstr "" +msgstr "Thời gian (tính bằng mili giây) LED nên bật" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 msgid "Human-readable counters" -msgstr "" +msgstr "Công cụ đếm dễ đọc" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:24 msgid "Hybrid" @@ -3449,53 +3992,57 @@ msgstr "Chế độ lai" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:49 msgctxt "nft icmp code" msgid "ICMP code" -msgstr "" +msgstr "Mã ICMP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:50 msgctxt "nft icmp type" msgid "ICMP type" -msgstr "" +msgstr "Loại ICMP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:51 msgctxt "nft icmpv6 code" msgid "ICMPv6 code" -msgstr "" +msgstr "Mã ICMPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:52 msgctxt "nft icmpv6 type" msgid "ICMPv6 type" -msgstr "" +msgstr "Loại ICMPv6" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 msgid "ID used to uniquely identify the VXLAN" -msgstr "" +msgstr "ID được sử dụng để xác định duy nhất VXLAN" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:208 msgid "IEEE 802.3ad Dynamic link aggregation (802.3ad, 4)" -msgstr "" +msgstr "Tổng hợp liên kết động IEEE 802.3ad (802.3ad, 4)" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:75 msgid "IKE DH Group" msgstr "Nhóm IKE DH" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "Địa chỉ IP" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "Giao thức IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" -msgstr "" +msgstr "Các bộ IP" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" -msgstr "" +msgstr "Loại IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3511,47 +4058,51 @@ msgstr "Địa chỉ IP không hợp lệ" msgid "IP address is missing" msgstr "Mất địa chỉ IP" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " "packets with matching destination IP." msgstr "" +"Các địa chỉ IP được phép trong đường hầm. Đối tác sẽ chấp nhận các gói tin " +"được gửi qua đường hầm có địa chỉ IP nguồn khớp với danh sách này và định " +"tuyến lại các gói tin có đích đến khớp với địa chỉ IP." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 msgctxt "nft ip protocol" msgid "IP protocol" -msgstr "" +msgstr "Giao thức IP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" -msgstr "" +msgstr "Giao thức IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" -msgstr "" +msgstr "Tập hợp IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" -msgstr "" +msgstr "Tập hợp IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "Ghi đè tên miền Bogus NX" #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:9 msgid "IPsec XFRM" -msgstr "" +msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3561,23 +4112,23 @@ msgstr "Tường lửa địa chỉ IPv4" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:252 msgid "IPv4 Neighbours" -msgstr "" +msgstr "Hàng xóm IPv4" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:251 msgid "IPv4 Routing" -msgstr "" +msgstr "Định tuyến IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" -msgstr "" +msgstr "Quy tắc IPv4" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 msgid "IPv4 Upstream" -msgstr "" +msgstr "Đường truyền phía trên IPv4" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3593,53 +4144,57 @@ msgstr "Quảng bá IPv4" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:180 msgid "IPv4 gateway" -msgstr "" +msgstr "Cổng IPv4" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:179 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:170 msgid "IPv4 netmask" -msgstr "" +msgstr "Mặt nạ mạng IPv4" #: modules/luci-base/htdocs/luci-static/resources/validation.js:305 msgid "IPv4 network in address/netmask notation" -msgstr "" +msgstr "Mạng IPv4 theo ghi chú địa chỉ/mặt nạ mạng" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" -msgstr "" +msgstr "Chỉ IPv4" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:52 msgid "IPv4 prefix" -msgstr "" +msgstr "Tiền tố IPv4" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 msgid "IPv4 prefix length" -msgstr "" +msgstr "Độ dài tiền tố IPv4" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" -msgstr "" +msgstr "Bảng giao thông IPv4 \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" -msgstr "" +msgstr "IPv4+IPv6" #: modules/luci-compat/luasrc/model/network/proto_ipip.lua:9 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:10 msgid "IPv4-in-IPv4 (RFC2003)" -msgstr "" +msgstr "IPv4 trong IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" -msgstr "" +msgstr "IPv4/IPv6 (cả hai - mặc định là IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" -msgstr "" +msgstr "Bảng giao thông IPv4/IPv6 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3650,7 +4205,8 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3658,37 +4214,41 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "Tường lửa IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" -msgstr "" +msgstr "MTU IPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:262 msgid "IPv6 Neighbours" +msgstr "Hàng xóm IPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" -msgstr "" +msgstr "Cài đặt RA IPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:261 msgid "IPv6 Routing" -msgstr "" +msgstr "Định tuyến IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" -msgstr "" +msgstr "Quy tắc IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "Cài đặt IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" -msgstr "" +msgstr "Tiền tố ULA IPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 msgid "IPv6 Upstream" -msgstr "" +msgstr "Đường truyền phía trên IPv6" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:183 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:58 @@ -3696,39 +4256,39 @@ msgstr "" msgid "IPv6 address" msgstr "Địa chỉ IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "Gơi ý gán IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "Độ dài gán IPv6" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:188 msgid "IPv6 gateway" -msgstr "" +msgstr "Cổng IPv6" #: modules/luci-base/htdocs/luci-static/resources/validation.js:310 msgid "IPv6 network in address/netmask notation" -msgstr "" +msgstr "Mạng IPv6 theo ghi chú địa chỉ/mặt nạ mạng" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" -msgstr "" +msgstr "Chỉ IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" -msgstr "" +msgstr "Ưu tiên IPv6" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "IPv6 prefix" -msgstr "" +msgstr "IPv6 prefix" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" -msgstr "" +msgstr "Bộ lọc tiền tố IPv6" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 @@ -3738,73 +4298,80 @@ msgstr "Độ dài IPv6 prefix" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 msgid "IPv6 routed prefix" -msgstr "" +msgstr "Tiền tố định tuyến IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" -msgstr "" +msgstr "Định tuyến nguồn IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 -msgid "IPv6 suffix" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"IPv6-Suffix (hex)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 +msgid "IPv6 suffix" +msgstr "Hậu tố IPv6" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" -msgstr "" +msgstr "Hỗ trợ IPv6" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" -msgstr "" +msgstr "Bảng giao thông IPv6 \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:101 msgid "IPv6-PD" +msgstr "IPv6-PD" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" msgstr "" #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" -msgstr "" +msgstr "IPv6 trong IPv4 (RFC4213)" #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:17 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:9 msgid "IPv6-over-IPv4 (6rd)" -msgstr "" +msgstr "IPv6 qua IPv4 (6rd)" #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:15 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:9 msgid "IPv6-over-IPv4 (6to4)" -msgstr "" +msgstr "IPv6 qua IPv4 (6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "Nhận dạng" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "Nếu chọn, kích hoạt 1DES" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "If checked, adds \"+ipv6\" to the pppd options" -msgstr "" +msgstr "Nếu được chọn, thêm \"+ipv6\" vào các tùy chọn pppd" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 msgid "If checked, encryption is disabled" msgstr "Nếu chọn, vô hiệu hóa chế độ mã hóa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "" +"Nếu được thiết lập, các mạng con phía dưới chỉ được phân bổ từ các lớp tiền " +"tố IPv6 đã cho." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" -msgstr "" +msgstr "Nếu được thiết lập, ý nghĩa của các tùy chọn khớp sẽ bị đảo ngược" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 @@ -3821,22 +4388,27 @@ msgid "" msgstr "" "Nếu được chỉ định, gắn thiết bị theo nhãn phân vùng thay vì nốt cố định" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " "otherwise modifications will be reverted." msgstr "" +"Nếu địa chỉ IP được sử dụng để truy cập LuCI thay đổi, cần kết nối " +"lại thủ công với địa chỉ IP mới trong vòng %d giây để xác nhận các " +"thiết lập, nếu không, các sửa đổi sẽ bị hoàn lại." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "" "Nếu không được chỉ định, không có tuyến mạng mặc định nào được cấu hình" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "" @@ -3854,59 +4426,83 @@ msgstr "" "một thiết bị swap để tạo ra nhiều khoảng trống hơn trong RAM. Hãy nhận biết rằng swapping dữ " "liệu là một quá trình rất chậm vì một thiết bị swap không thể được truy cập " -"với datarates cao hơn của RAM." +"với datarates cao hơn của RAM." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "Lờ đi /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "Lờ đi giao diện" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "Lờ đi tập tin resolve" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:447 msgid "Image" -msgstr "tập tin ảnh" +msgstr "Hình ảnh" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:273 msgid "Image check failed:" -msgstr "" +msgstr "Kiểm tra hình ảnh không thành công:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" -msgstr "" +msgstr "Nhập dưới dạng ngang hàng" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" -msgstr "" +msgstr "Nhập cấu hình" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" -msgstr "" +msgstr "Nhập cấu hình dưới dạng đồng đẳng…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" -msgstr "" +msgstr "Nhập cài đặt" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" -msgstr "" +msgstr "Cấu hình đồng đẳng đã được nhập" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 msgid "Imports settings from an existing WireGuard configuration file" -msgstr "" +msgstr "Nhập cài đặt từ tệp cấu hình WireGuard hiện có" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:68 msgid "In" msgstr "Trong" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"Trong cấu hình LAN khung, nên bật chế độ tránh vòng lặp cầu để tránh các " +"vòng lặp phát sóng có thể làm đứng cả mạng LAN." + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -3914,9 +4510,9 @@ msgstr "" "Để ngăn chặn truy cập trái phép vào hệ thống, yêu cầu của bạn đã bị chặn. " "Nhấp vào \" Tiếp tục »\" bên dưới để quay lại trang trước." -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" -msgstr "" +msgstr "Theo giây" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:156 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 @@ -3929,38 +4525,41 @@ msgstr "Vô hiệu hóa đếm ngược" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:267 msgid "Inbound:" -msgstr "" +msgstr "Đầu vào:" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:262 msgid "" "Include in backup a list of current installed packages at /etc/backup/" "installed_packages.txt" msgstr "" +"Bao gồm trong bản sao lưu một danh sách các gói đã cài đặt hiện tại tại /etc/" +"backup/installed_packages.txt" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:100 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:105 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:107 msgid "Incoming checksum" -msgstr "" +msgstr "Kiểm tra tổng đầu vào" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" -msgstr "" +msgstr "Giao diện đầu vào" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" -msgstr "" +msgstr "Khóa đầu vào" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:107 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:104 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:109 msgid "Incoming serialization" -msgstr "" +msgstr "Đầu vào tuần tự hóa" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:187 msgid "Info" @@ -3968,24 +4567,23 @@ msgstr "Thông tin" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 msgid "Information" -msgstr "Thông tin" +msgstr "Thông Tin" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" -msgstr "" +msgstr "Ánh xạ QoS đầu vào" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" -msgstr "" +msgstr "ID thiết bị đầu vào" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" -msgstr "" +msgstr "Tên thiết bị đầu vào" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "Khởi tạo thất bại" @@ -3997,38 +4595,54 @@ msgstr "Kịch bản khởi tạo" msgid "Initscripts" msgstr "Nhiều kịch bản khởi tạo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" -msgstr "" +msgstr "Ràng buộc chứng chỉ nội (Miền)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" -msgstr "" +msgstr "Ràng buộc chứng chỉ nội (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" -msgstr "" +msgstr "Ràng buộc chứng chỉ nội (Chủ đề)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" -msgstr "" +msgstr "Ràng buộc chứng chỉ nội (Wildcard)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "Đang cài đặt bản mở rộng cho giao thức..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" -msgstr "" +msgstr "Phiên bản" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "Phiên bản \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "Chi tiết Phiên bản" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." msgstr "" +"Thay vì kết nối với bất kỳ mạng nào có SSID phù hợp, chỉ kết nối với BSSID " +"%h." #: modules/luci-compat/luasrc/view/cbi/map.htm:43 msgid "Insufficient permissions to read UCI configuration." +msgstr "Không đủ quyền để đọc cấu hình UCI." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 @@ -4036,23 +4650,23 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 msgid "Interface" -msgstr "Giao diện " +msgstr "Giao diện" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." -msgstr "" +msgstr "Giao diện \"%h\" đã được đánh dấu làm chủ sở hữu." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:62 msgid "Interface %q device auto-migrated from %q to %q." msgstr "Giao diện %q thiết bị tự động di chuyển từ %q sang %q." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "Cấu hình giao diện mạng" #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:39 msgid "Interface ID" -msgstr "" +msgstr "ID giao diện" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:151 @@ -4061,7 +4675,7 @@ msgstr "Giao diện có %d thay đổi đang chờ xử lý" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:92 msgid "Interface is disabled" -msgstr "" +msgstr "Giao diện đã bị tắt" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:65 msgid "Interface is marked for deletion" @@ -4077,51 +4691,59 @@ msgstr "Giao diện mạng đang được kết nối lại..." msgid "Interface is shutting down..." msgstr "Giao diện mạng đang được tắt..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "Giao diện mạng đang khởi động..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "Giao diện mạng đang dừng..." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 msgid "Interface name" -msgstr "Tên giao diện mạng" +msgstr "Tên giao diện" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." -msgstr "Giao diện mạng chưa có hoặc chưa được kết nối" +msgstr "Giao diện mạng chưa có hoặc chưa được kết nối." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "Giao diện" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:20 msgid "Internal" -msgstr "Nội" +msgstr "Nội bộ" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Lỗi máy chủ nội" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" -msgstr "" +msgstr "Khoảng thời gian gửi gói học" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " "larger values cause IGMP Queries to be sent less often" msgstr "" +"Khoảng thời gian theo đơn vị centiseconds giữa các truy vấn đa địa chỉ " +"chung. Bằng cách thay đổi giá trị này, người quản trị có thể điều chỉnh số " +"lượng thông báo IGMP trên mạng con; giá trị lớn sẽ làm giảm tần suất gửi " +"truy vấn IGMP.." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" -msgstr "" +msgstr "Khoảng thời gian theo giây cho các gói tin chào STP" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:192 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:42 @@ -4129,30 +4751,35 @@ msgid "Invalid" msgstr "Giá trị nhập vào không hợp lí" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" -msgstr "" +msgstr "APN không hợp lệ được cung cấp" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:37 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:40 msgid "Invalid Base64 key string" msgstr "Giá trị khóa Base64 không thích hợp" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "Địa chỉ IPv6 không hợp lệ" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" -msgstr "" +msgstr "Giá trị TOS không hợp lệ, dự kiến là 00..FF hoặc inherit" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:83 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:88 msgid "Invalid Traffic Class value, expected 00..FF or inherit" -msgstr "" +msgstr "Giá trị Lớp lưu lượng không hợp lệ, yêu cầu 00..FF hoặc kế thừa" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:285 msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." -msgstr "Địa chỉ ID Vlan không hợp lệ ! Chỉ cho phép ID giữa %d và %d" +msgstr "Địa chỉ ID Vlan không hợp lệ ! Chỉ cho phép ID giữa %d và %d." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:294 msgid "Invalid VLAN ID given! Only unique IDs are allowed" @@ -4162,13 +4789,15 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:403 msgid "Invalid argument" -msgstr "" +msgstr "Đối số không hợp lệ" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." msgstr "" +"Danh sách bearer không hợp lệ. Có thể đã tạo quá nhiều bearers. Giao thức " +"này chỉ hỗ trợ một bearer duy nhất." #: modules/luci-base/htdocs/luci-static/resources/rpc.js:402 msgid "Invalid command" @@ -4178,21 +4807,41 @@ msgstr "Lệnh ko hợp lệ" msgid "Invalid hexadecimal value" msgstr "Giá trị không hợp lệ" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "Tên máy chủ hoặc địa chỉ IPv4 không hợp lệ" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "Cổng không hợp lệ" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "URL máy chủ không hợp lệ" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." -msgstr "Tên và mật mã không đúng. Xin thử lại " +msgstr "Tên và mật mã không đúng. Xin thử lại." + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "Đảo ngược nhấp nháy" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" -msgstr "" +msgstr "Đảo ngược khớp" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "Là VLAN chính" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "Cô lập máy khách" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:236 -#, fuzzy msgid "" "It appears that you are trying to flash an image that does not fit into the " "flash memory, please verify the image file!" @@ -4200,50 +4849,54 @@ msgstr "" "Dường như bạn cố gắng flash một hình ảnh không phù hợp với bộ nhớ flash, xin " "vui lòng xác minh các tập tin hình ảnh!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" -msgstr "Yêu cầu JavaScript" +msgstr "Yêu cầu JavaScript!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "Hòa mạng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "Hòa mạng: Quét mạng wifi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "Hòa mạng: %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" -msgstr "" +msgstr "Nhảy đến quy tắc" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:228 msgid "Keep settings and retain the current configuration" -msgstr "Giữ cài đặt và cấu hình hiện tại" +msgstr "Giữ nguyên cài đặt và giữ nguyên cấu hình hiện tại" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "Giữ kết nối" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "Nhật ký lõi" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" -msgstr "Phiên bản lõi" +msgstr "Phiên bản Kernel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" -msgstr "Phím " +msgstr "Key" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "Phím %d" @@ -4251,42 +4904,48 @@ msgstr "Phím %d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." -msgstr "" +msgstr "Khóa cho các gói tin đến (tùy chọn)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:96 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." -msgstr "" +msgstr "Khóa cho các gói tin đi (tùy chọn)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" -msgstr "" +msgstr "Thiếu khóa" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "Khóa được sử dụng để ký cấu hình mạng" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" -msgstr "" +msgstr "KiB" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:54 msgid "Kill" -msgstr "Hủy" +msgstr "Kết thúc" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:21 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:10 msgid "L2TP" -msgstr "" +msgstr "L2TP" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:40 msgid "L2TP Server" -msgstr "" +msgstr "Máy chủ L2TP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:269 msgid "LACPDU Packets" -msgstr "" +msgstr "Gói tin LACPDU" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:130 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:102 @@ -4308,11 +4967,11 @@ msgstr "Chu kỳ lấy LCP" #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:115 msgid "LED Configuration" -msgstr "" +msgstr "Cấu hình đèn LED" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" -msgstr "" +msgstr "LLC" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:268 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:377 @@ -4327,32 +4986,39 @@ msgstr "Ngôn ngữ" msgid "Language and Style" msgstr "Ngôn ngữ và phong cách" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "Các trọng số lớn hơn (cùng prio) sẽ có xác suất cao hơn được chọn." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" -msgstr "" +msgstr "Khoảng thời gian thành viên cuối cùng" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "Độ trễ" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "Giao tác mới nhất" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" -msgstr "" +msgstr "Lá" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" -msgstr "" +msgstr "Học" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" -msgstr "" +msgstr "Học các tuyến đường" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "Leasefile" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "Thời gian được cấp một địa chỉ IP" @@ -4376,48 +5042,47 @@ msgstr "Để trống để tự động phát hiện" msgid "Leave empty to use the current WAN address" msgstr "Để trống để sử dụng địa chỉ WAN hiện tại" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " "are used. It is recommended to not allow 802.11b rates where possible." msgstr "" +"Thiết bị cũ hoặc hoạt động kém có thể yêu cầu tốc độ 802.11b cũ để tương " +"thích. Hiệu suất sử dụng thời gian không gian có thể giảm đáng kể khi sử " +"dụng chúng. Đề nghị không cho phép tốc độ 802.11b nếu có thể." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" -msgstr "" +msgstr "Phát hiện các quy tắc cũ" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" -msgstr "" +msgstr "Chú giải:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" -msgstr "Giới hạn " - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "" +msgstr "Giới hạn" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" -msgstr "" +msgstr "Chế độ Line" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" -msgstr "" +msgstr "Trạng thái Line" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" -msgstr "" +msgstr "Thời gian hoạt động của Line" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:125 msgid "Link Aggregation (Channel Bonding)" -msgstr "" +msgstr "Gom nhóm liên kết (Liên kết kênh)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:349 msgid "Link Monitoring" -msgstr "" +msgstr "Giám sát liên kết" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:24 msgid "Link On" @@ -4426,18 +5091,22 @@ msgstr "Link On" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:77 msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" -msgstr "" +msgstr "Các bit tiêu đề lớp liên kết %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." -msgstr "Danh sách các máy chủ cung cấp kết quả tên miền NX không có thật" +msgstr "Danh sách các máy chủ cung cấp kết quả tên miền NX không có thật." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "" +"Danh sách các bộ IP để điền vào các IP của kết quả tra cứu DNS của các FQDN " +"cũng được chỉ định ở đây." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4449,9 +5118,9 @@ msgstr "" "chỉ MAC, Mã định danh NAS, khóa 128 bit dưới dạng chuỗi hex.
    Danh " "sách này được sử dụng để ánh xạ R0KH-ID (Định danh NAS) một địa chỉ MAC đích " "khi yêu cầu khóa PMK-R1 từ R0KH mà STA đã sử dụng trong Hiệp hội tên miền di " -"động ban đầu. " +"động ban đầu." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4463,29 +5132,26 @@ msgstr "" "chỉ MAC, R1KH-ID là 6 số bát phân với dấu hai chấm, khóa 128 bit dưới dạng " "chuỗi thập lục phân.
    Danh sách này được sử dụng để ánh xạ R1KH-ID đến " "địa chỉ MAC đích khi gửi khóa PMK-R1 từ R0KH. Đây cũng là danh sách các R1KH " -"được ủy quyền trong MD có thể yêu cầu các khóa PMK-R1. " +"được ủy quyền trong MD có thể yêu cầu các khóa PMK-R1." #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:82 msgid "List of SSH key files for auth" msgstr "Danh sách tập tin khóa SSH để xác thực" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." -msgstr "Danh sách tên miền chấp nhận phản hồi RFC1918" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "" +msgstr "Danh sách tên miền chấp nhận phản hồi RFC1918." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." -msgstr "" +msgstr "Danh sách các trình giải quyết upstream để chuyển tiếp các truy vấn." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" -msgstr "Lắng nghe cổng" +msgstr "Listen Port" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "Lắng nghe giao diện mạng" @@ -4493,56 +5159,59 @@ msgstr "Lắng nghe giao diện mạng" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "Chỉ nghe giao diện mạng đã cho (nếu không xác định sẽ nghe tất cả)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." msgstr "" +"Chỉ lắng nghe trên các giao diện được chỉ định và loopback nếu không được " +"loại trừ rõ ràng." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:299 msgid "ListenPort setting is invalid" -msgstr "" +msgstr "Cài đặt ListenPort không hợp lệ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." -msgstr "Cổng để nghe cho các truy vấn DNS gửi đến" +msgstr "Cổng để nghe cho các truy vấn DNS gửi đến." #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:130 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:54 msgid "Load" -msgstr "Tải " +msgstr "Tải" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "Tải trung bình" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:189 msgid "Load configuration…" -msgstr "" +msgstr "Tải cấu hình…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" -msgstr "" +msgstr "Đang tải dữ liệu…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" -msgstr "Đang tải nội dung thư mục..." +msgstr "Đang tải nội dung thư mục…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" -msgstr "Tải cảnh..." +msgstr "Loading view…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" -msgstr "" +msgstr "Địa phương" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" -msgstr "" +msgstr "Địa chỉ IP cục bộ" #: modules/luci-base/htdocs/luci-static/resources/network.js:12 #: modules/luci-compat/luasrc/model/network.lua:30 @@ -4560,13 +5229,14 @@ msgstr "Địa chỉ IP cục bộ để gán" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "Địa chỉ IPv4 cục bộ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" -msgstr "" +msgstr "Máy chủ DNS IPv6 cục bộ" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:53 @@ -4580,54 +5250,80 @@ msgstr "Địa chỉ IPv6 cục bộ" msgid "Local Startup" msgstr "Khởi động cục bộ với hệ thống" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "Giờ địa phương" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" -msgstr "" +msgstr "ULA cục bộ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "Tên miền cục bộ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." -msgstr "Hậu tố tên miền cục bộ gắn vào tên DHCP và các mục tập tin từ máy chủ" +msgstr "Hậu tố tên miền cục bộ gắn vào tên DHCP và các mục tập tin từ máy chủ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "máy chủ cục bộ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "Chỉ dùng dịch vụ cục bộ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "Khóa WireGuard cục bộ" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "Tra vấn địa phương" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 -msgid "Lock to BSSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" msgstr "" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 +msgid "Lock to BSSID" +msgstr "Khóa vào BSSID" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "Nhật ký sự kiện \"%h…\"" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "Đăng nhập" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "Đến phần đăng nhập…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "Thoát ra" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "Cấp độ lưu nhật ký cho đầu ra" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "Bản ghi tra vấn" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:123 msgid "Logging" -msgstr "Lưu nhật ký" +msgstr "Ghi nhật ký" #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:23 msgid "Logging in…" -msgstr "" +msgstr "Đang đăng nhập…" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 @@ -4635,60 +5331,52 @@ msgid "" "Logical network from which to select the local endpoint if local IPv6 " "address is empty and no WAN IPv6 is available (optional)." msgstr "" +"Mạng logic từ đó chọn điểm cuối cục bộ nếu địa chỉ IPv6 cục bộ trống và " +"không có WAN IPv6 có sẵn (tùy chọn)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 msgid "Logical network to which the tunnel will be added (bridged) (optional)." -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "Đăng nhập " - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Thoát ra" +msgstr "Mạng logic mà đường hầm sẽ được thêm vào (cầu nối) (tùy chọn)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "Mất tín hiệu (LOSS)" +msgstr "Lọc lỏng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." -msgstr "Địa chỉ thuê thấp nhất dưới dạng bù từ địa chỉ mạng" +msgstr "Địa chỉ thuê thấp nhất dưới dạng bù từ địa chỉ mạng." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Chế độ tương thích Lua đang hoạt động" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" -msgstr "" +msgstr "Địa chỉ MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "Lọc địa chỉ MAC" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:253 msgid "MAC Address For The Actor" -msgstr "" +msgstr "Địa chỉ MAC cho diễn viên" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" -msgstr "" +msgstr "VLAN MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4697,24 +5385,32 @@ msgstr "" msgid "MAC address" msgstr "Địa chỉ MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "Lọc MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "Danh sách MAC" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:16 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:13 msgid "MAP / LW4over6" -msgstr "" +msgstr "MAP / LW4over6" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:62 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:7 msgid "MAP rule is invalid" msgstr "Luật MAP không hợp lệ" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "Di động MBIM" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4726,35 +5422,39 @@ msgstr "MHz" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:354 msgid "MII" -msgstr "" +msgstr "MII" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:422 msgid "MII / ETHTOOL ioctls" -msgstr "" +msgstr "MII / ETHTOOL ioctls" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:395 msgid "MII Interval" -msgstr "" +msgstr "Khoảng thời gian MII" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " "below:" msgstr "" "Đảm bảo sao chép hệ thống tập tin gốc bằng cách sử dụng một số cách như các " -"lệnh bên dưới" +"lệnh bên dưới:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4763,78 +5463,90 @@ msgstr "" msgid "Manual" msgstr "Bằng tay" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" +msgstr "Chủ" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "" +"Khoảng thời gian tối đa của RA" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "Tối đa tốc độ dữ liệu đạt được (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "Max. DHCP leases" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" -"Max. Max. EDNS0 packet size" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "Max. concurrent queries" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" -msgstr "" +msgstr "Tuổi tối đa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "Chu kỳ nghe tối đa cho phép" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." -msgstr "Số lượng tối đa máy mượn địa chỉ từ DHCP đang hoạt động" +msgstr "Số lượng tối đa máy mượn địa chỉ từ DHCP đang hoạt động." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." -msgstr "Số lượng truy vấn DNS đồng thời tối đa được phép" +msgstr "Số lượng truy vấn DNS đồng thời tối đa được phép." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." -msgstr "Kích thước tối đa được phép của gói UDP EDNS.0" +msgstr "Kích thước tối đa được phép của gói UDP EDNS.0." #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "Thời gian (giây) tối đa để chờ modem sẵn sàng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." -msgstr "Số lượng máy xin địa chỉ IP truy cập tối đa" +msgstr "Số lượng máy xin địa chỉ IP truy cập tối đa." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" -msgstr "" +msgstr "Kích thước bảng theo dõi tối đa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." msgstr "" +"Thời gian tối đa được phép giữa các lần gửi RA không yêu cầu. Giá trị mặc định " +"là 600 giây." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "Năng lượng truyền tối đa" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "Có thể làm ngăn chặn VoIP hoặc các dịch vụ khác hoạt động." + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4847,11 +5559,11 @@ msgstr "Năng lượng truyền tối đa" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:330 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:331 msgid "Mbit/s" -msgstr "" +msgstr "Mbit/s" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 msgid "Medium" -msgstr "" +msgstr "Trung bình" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:24 msgid "Memory" @@ -4861,17 +5573,25 @@ msgstr "Bộ nhớ" msgid "Memory usage (%)" msgstr "Bộ nhớ sử dụng (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" -msgstr "" +msgstr "Mạng lưới" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 msgid "Mesh ID" -msgstr "" +msgstr "ID Mạng lưới" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" -msgstr "" +msgstr "ID Mạng lưới" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Định tuyến Mạng lưới" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Tùy chọn liên quan đến Mạng lưới và định tuyến" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" @@ -4879,13 +5599,13 @@ msgstr "Không thể tìm được phương pháp này" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:350 msgid "Method of link monitoring" -msgstr "" +msgstr "Phương pháp giám sát liên kết" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:419 msgid "Method to determine link status" -msgstr "" +msgstr "Phương pháp xác định trạng thái liên kết" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4894,31 +5614,37 @@ msgstr "Metric" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:70 msgctxt "nft unit" msgid "MiB" -msgstr "" +msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "" +"Khoảng thời gian tối thiểu của RA" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" -msgstr "" +msgstr "Thời gian hợp lệ ARP tối thiểu" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:237 msgid "Minimum Number of Links" -msgstr "" +msgstr "Số Liên kết Tối thiểu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "" +"Thời gian tối thiểu yêu cầu trong giây trước khi một mục ARP có thể được " +"thay thế. Ngăn chặn lặp lại bộ nhớ cache ARP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." msgstr "" +"Thời gian tối thiểu được phép giữa các lần gửi RA không yêu cầu. Giá trị mặc định " +"là 200 giây." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:204 msgid "Mirror monitor port" @@ -4928,77 +5654,85 @@ msgstr "Nhân bản cổng màn hình quan sát (monitor)" msgid "Mirror source port" msgstr "Nhân bản cổng nguồn" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" +msgstr "Dữ liệu Di động" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "Tên miền di động" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "Chế độ" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" -msgstr "Mô hình" +msgstr "Model" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "" +"Đang kết nối modem. Vui lòng đợi. Quá trình này sẽ hết thời gian sau 2 phút." -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "Mô hình mặc định" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "Thiết bị modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "Truy vấn thông tin modem không thành công" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "Hết thời gian khởi động modem" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" -msgstr "" +msgstr "Quản lý Modem" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "Monitor" @@ -5008,11 +5742,11 @@ msgstr "Thêm đặc điểm" #: modules/luci-base/htdocs/luci-static/resources/form.js:2581 msgid "More…" -msgstr "thêm ..." +msgstr "Thêm…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:192 msgid "Mount Point" -msgstr "Lắp điểm" +msgstr "Điểm Mount" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:144 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 @@ -5038,23 +5772,23 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 msgid "Mount attached devices" -msgstr "" +msgstr "Gắn kết thiết bị đã kết nối" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 msgid "Mount filesystems not specifically configured" -msgstr "" +msgstr "Gắn kết hệ thống tập tin chưa được cấu hình cụ thể" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:332 msgid "Mount options" -msgstr "" +msgstr "Tùy chọn gắn kết" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 msgid "Mount point" -msgstr "" +msgstr "Điểm gắn kết" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 msgid "Mount swap not specifically configured" -msgstr "" +msgstr "Gắn kết swap chưa được cấu hình cụ thể" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:223 msgid "Mounted file systems" @@ -5062,201 +5796,231 @@ msgstr "Lắp tập tin hệ thống" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 msgid "Move down" -msgstr "" +msgstr "Di chuyển xuống" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 msgid "Move up" -msgstr "" +msgstr "Di chuyển lên" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "Đa điểm đến một điểm" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:96 msgid "Multicast" -msgstr "" +msgstr "Đa điểm" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "Chế độ đa điểm" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" -msgstr "" +msgstr "Định tuyến đa điểm" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" -msgstr "" +msgstr "Đa điểm đến đơn điểm" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" -msgstr "" +msgstr "Chuỗi hành động NAT \"%h\"" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:87 msgid "NAT-T Mode" -msgstr "" +msgstr "Chế độ NAT-T" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 msgid "NAT64 Prefix" -msgstr "" +msgstr "Tiền tố NAT64" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "Tiền tố NAT64" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" -msgstr "" +msgstr "Slave NDP-Proxy" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:72 msgid "NT Domain" -msgstr "" +msgstr "Miền NT" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:300 msgid "NTP server candidates" -msgstr "" +msgstr "Ứng cử viên máy chủ NTP" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "Tên" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" -msgstr "" +msgstr "Tên của mạng mới" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "Tên của thiết bị đường hầm" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "Điều hướng" #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:10 msgid "Nebula Network" -msgstr "" +msgstr "Mạng Nebula" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "Báo cáo hàng xóm" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" -msgstr "" +msgstr "Độ hợp lệ của bộ nhớ cache hàng xóm" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:186 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:212 msgid "Network" -msgstr "Mạng " +msgstr "Mạng" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "Mã hóa mạng" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" -msgstr "" +msgstr "Chế độ mạng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 -msgid "Network SSID" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "Tiện ích mạng" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 +msgid "Network SSID" +msgstr "SSID mạng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" -msgstr "" +msgstr "Địa chỉ mạng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "Tập tin ảnh khởi động mạng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" -msgstr "" +msgstr "Di chuyển cấu hình cầu mạng" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" -msgstr "" +msgstr "Thiết bị mạng" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:7 msgid "Network device activity (kernel: netdev)" -msgstr "" +msgstr "Hoạt động của thiết bị mạng (nhân: netdev)" #: modules/luci-base/htdocs/luci-static/resources/network.js:15 #: modules/luci-compat/luasrc/model/network.lua:33 msgid "Network device is not present" msgstr "Thiết bị mạng không có" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" -msgstr "" +msgstr "Bảng thiết bị mạng \"%h\"" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:78 msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" -msgstr "" +msgstr "Bit tiêu đề mạng %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" -msgstr "" +msgstr "Di chuyển cấu hình ifname mạng" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 msgid "Network interface" -msgstr "" +msgstr "Giao diện mạng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" -msgstr "" +msgstr "ID mạng" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" -msgstr "" +msgstr "Không bao giờ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "Không bao giờ" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "" "Đặc tả miền cục bộ. Tên phù hợp với miền này không bao giờ được chuyển tiếp " -"và chỉ được giải quyết từ DHCP hoặc tập tin từ máy chủ" +"và chỉ được giải quyết từ DHCP hoặc tập tin từ máy chủ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" -msgstr "" +msgstr "Không thể tạo giao diện mới cho \"%s\": %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" -msgstr "Tên giao diện mạng mới..." +msgstr "Tên giao diện mạng mới…" #: modules/luci-compat/luasrc/view/cbi/delegator.htm:11 msgid "Next »" msgstr "Tiếp »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "Không" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "Không có máy chủ DHCP nào được cấu hình cho giao diện mạng này" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:202 msgid "No Data" -msgstr "" +msgstr "Không có dữ liệu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "Không mã hóa" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:185 msgid "No Host Routes" -msgstr "" +msgstr "Không có đường đi máy chủ" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:89 msgid "No NAT-T" @@ -5264,34 +6028,48 @@ msgstr "Không NAT-T" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 msgid "No RX signal" +msgstr "Không có tín hiệu RX" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "Không có giao diện WireGuard được cấu hình." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." msgstr "" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " "mode should only be used to install a firmware upgrade" msgstr "" +"Không có thay đổi cấu hình sẽ được lưu và sẽ bị mất sau khi khởi động lại. " +"Chế độ này chỉ nên được sử dụng để cài đặt bản nâng cấp firmware" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:69 msgid "No client associated" -msgstr "" +msgstr "Không có khách hàng kết nối" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "Không chỉ định thiết bị kiểm soát" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" -msgstr "" +msgstr "Không có dữ liệu" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:406 msgid "No data received" msgstr "Không có data nhận được" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" -msgstr "" +msgstr "Không áp dụng" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:229 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:232 @@ -5300,21 +6078,19 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:241 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:244 msgid "No entries available" -msgstr "" +msgstr "Không có mục nào" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "Không có gì trong đường dẫn này" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Không tìm thấy tập tin" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" msgstr "" +"Không định nghĩa cổng lắng nghe giao diện cố định, các peer có thể không thể " +"khởi tạo kết nối tới phiên bản WireGuard này!" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 @@ -5322,14 +6098,14 @@ msgstr "" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:70 msgid "No host route" -msgstr "" +msgstr "Không có định tuyến máy chủ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 msgid "No information available" -msgstr "Không có thông tin" +msgstr "Không có thông tin có sẵn" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:63 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:8 @@ -5339,52 +6115,62 @@ msgstr "Không có tiền tố ủy quyền phù hợp" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:142 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:145 msgid "No more slaves available" -msgstr "" +msgstr "Không còn slave nào khả dụng" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:189 msgid "No more slaves available, can not save interface" -msgstr "" +msgstr "Không còn slave nào khả dụng, không thể lưu giao diện" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "Không có bộ đệm âm" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." -msgstr "" +msgstr "Không tải được tập luật nftables." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "Chưa được cài đặt mật khẩu!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "Chưa được kết nối" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." +msgstr "Chưa xác định peer nào." + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." msgstr "" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." -msgstr "Không có khóa công khai" +msgstr "Không có khóa công khai." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" -msgstr "" +msgstr "Không có luật nào trong chuỗi này" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:91 msgid "No rules in this chain." -msgstr "Không có quy luật trong chuỗi này" +msgstr "Không có quy luật trong chuỗi này." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:385 msgid "No validation or filtering" -msgstr "" +msgstr "Không có kiểm tra hoặc lọc" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" -msgstr "Không có vùng nào được gán" +msgstr "Không có vùng nào được gán" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:58 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:84 @@ -5394,50 +6180,53 @@ msgstr "Không có vùng nào được gán" msgid "Noise" msgstr "Nhiễu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "Tỉ lệ cường độ nhiễu (SRN)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "Mức nhiễu" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "Nhiễu:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "Lỗi CRC không tiền phát sinh (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" -msgstr "" +msgstr "Không dùng dấu sao" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" -msgstr "Không" +msgstr "Không có" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "Thường" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "Không tìm thấy" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "Không là thành viên" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" -msgstr "" +msgstr "Chưa được liên kết" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 msgid "Not connected" -msgstr "Chưa được kết nối" +msgstr "Không kết nối" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "Không có" @@ -5449,37 +6238,47 @@ msgstr "Chưa bắt đầu khi khởi động" msgid "Not supported" msgstr "Không được hỗ trợ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" +"Ghi chú: Một số driver không hỗ trợ đầy đủ 802.11w. Ví dụ: mwlwifi có thể " +"gặp vấn đề" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"Ghi chú: Bạn cũng có thể cần một DHCP Proxy (hiện không khả dụng) khi chỉ " +"định một cổng Relay To không chuẩn (addr#port)." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" -msgstr "" +msgstr "Ghi chú" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:188 msgid "Notice" -msgstr "Chú ý" +msgstr "Lưu ý" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" -msgstr "" +msgstr "Nslookup" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:333 msgid "Number of IGMP membership reports" -msgstr "" +msgstr "Số lượng báo cáo thành viên IGMP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "" "Số lượng mục DNS được lưu trong bộ nhớ cache (tối đa là 10000, 0 là không " -"lưu trong bộ nhớ cache)" +"lưu trong bộ nhớ cache)." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:311 msgid "Number of peer notifications after failover event" -msgstr "" +msgstr "Số lượng thông báo peer sau sự kiện chuyển đổi sang chế độ dự phòng" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:69 msgid "Obfuscated Group Password" @@ -5490,7 +6289,7 @@ msgid "Obfuscated Password" msgstr "Mật khẩu bị xáo trộn" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5501,31 +6300,40 @@ msgid "Obtain IPv6 address" msgstr "Nhận được địa chỉ IPv6" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" -msgstr "" +msgstr "Tắt" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:18 msgid "Off-State Delay" +msgstr "Độ trễ trạng thái tắt" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." msgstr "" +"Tắt: vlanXXX, ví dụ: vlan1. Bật: " +"vlan_tagged_interface.XXX, ví dụ: eth0.1." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" -msgstr "" +msgstr "Bật" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:12 msgid "On-State Delay" -msgstr "" +msgstr "Độ trễ trạng thái bật" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" -msgstr "" +msgstr "Trên liên kết" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" -msgstr "Một trong những tên máy chủ hoặc địa chỉ mac phải được chỉ định" +msgstr "Một trong những tên máy chủ hoặc địa chỉ mac phải được chỉ định!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "Một trong những điều sau đây: %s" @@ -5543,80 +6351,115 @@ msgstr "Một hoặc nhiều giá trị không hợp lệ/bắt buộc trên tab msgid "One or more required fields have no value!" msgstr "Một hoặc nhiều trường bắt buộc không có giá trị!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "" +"Chỉ cho phép giao tiếp với các cổng bridge không bị cô lập khi được bật" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:231 msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "" +"Chỉ khi slave hoạt động hiện tại bị lỗi và slave chính hoạt động (lỗi, 2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" -msgstr "" +msgstr "Xem tổng quan quy tắc iptables…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "Đang mở danh sách ..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" -msgstr "" +msgstr "OpenConnect (CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" -msgstr "" +msgstr "OpenFortivpn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable NDP proxying." msgstr "" +"Hoạt động ở chế độ relay nếu giao diện master được chỉ định được " +"cấu hình và hoạt động, nếu không, tắt chức năng proxy NDP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." msgstr "" +"Hoạt động ở chế độ relay nếu giao diện master được chỉ định được " +"cấu hình và hoạt động, nếu không, chuyển về chế độ server." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "" +"Hoạt động ở chế độ relay nếu có tiền tố IPv6 ở phía trên, nếu " +"không, tắt dịch vụ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "Tần số hoạt động" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." -msgstr "" +msgstr "Tùy chọn \"%s\" chứa một giá trị đầu vào không hợp lệ." #: modules/luci-base/htdocs/luci-static/resources/form.js:2021 msgid "Option \"%s\" must not be empty." -msgstr "" +msgstr "Tùy chọn \"%s\" không được để trống." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "Thay đổi tùy chỉnh" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "Xóa tùy chỉnh" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" -msgstr "Tùy chỉnh" +msgstr "Tùy chọn" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" +msgstr "Tùy chọn, ghi chú tự do về thiết bị này" + +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." msgstr "" +"Tùy chọn, tính bằng giây. Nếu đặt thành '0', không có việc kết nối lại được " +"thực hiện." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" @@ -5626,7 +6469,7 @@ msgstr "" "Không bắt buộc. Đánh dấu 32 bit cho các gói được mã hóa đi. Nhập giá trị ở " "dạng hex, bắt đầu bằng 0x." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5636,9 +6479,9 @@ msgstr "" "Không bắt buộc. Các giá trị được phép: 'eui64', 'ngẫu nhiên', giá trị cố " "định như '::1' hoặc '::1:2'. Khi nhận được tiền tố IPv6 (như 'a:b:c:d::') từ " "một máy chủ ủy nhiệm, sử dụng hậu tố (như '::1') để tạo địa chỉ IPv6 ('a:b:c:" -"d::1') cho giao diện. " +"d::1') cho giao diện." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5646,55 +6489,61 @@ msgstr "" "Không bắt buộc. Khóa mã hóa Base64 được chia sẻ từ trước. Thêm vào một lớp " "mã hóa khóa đối xứng bổ sung cho tính kháng sau khi được lượng tử." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "" -"Không bắt buộc. Tạo tuyến đường cho \"IP được phép\" cho mạng ngang hàng này" +"Không bắt buộc. Tạo tuyến đường cho \"IP được phép\" cho mạng ngang hàng này." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." -msgstr "Không bắt buộc. Mô tả mạng ngang hàng" +msgstr "Không bắt buộc. Mô tả mạng ngang hàng." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:185 msgid "Optional. Do not create host routes to peers." -msgstr "" +msgstr "Tùy chọn. Không tạo các tuyến đường mục tiêu đến các peer." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "" "Không bắt buộc. Máy chủ của mạng ngang hàng. Tên được giải quyết trước khi " -"đưa lên giao diện mạng. " +"đưa lên giao diện mạng." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " "routes through the tunnel." msgstr "" +"Tùy chọn. Địa chỉ IP và tiền tố mà peer này được phép sử dụng bên trong " +"đường hầm. Thông thường là các địa chỉ IP đường hầm của peer và các mạng mà " +"peer đi qua đường hầm." #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "Optional. Maximum Transmission Unit of the XFRM interface." -msgstr "" +msgstr "Tùy chọn. Đơn vị truyền tải tối đa (MTU) của giao diện XFRM." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "Không bắt buộc. Đơn vị truyền tối đa của giao diện đường hầm mạng." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." -msgstr "Không bắt buộc. Cổng sử dụng cho mạng ngang hàng" +msgstr "Không bắt buộc. Cổng sử dụng cho mạng ngang hàng." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " "code if available. It can be removed after the configuration has been " "exported." msgstr "" +"Tùy chọn. Khóa riêng tư của peer WireGuard. Khóa không được yêu cầu để thiết " +"lập kết nối nhưng cho phép tạo cấu hình peer hoặc mã QR nếu có sẵn. Nó có " +"thể được xóa sau khi cấu hình đã được xuất." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5704,23 +6553,36 @@ msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 msgid "Optional. UDP port used for outgoing and incoming packets." -msgstr "Không bắt buộc. Cổng UDP được sử dụng cho các gói đi và đến" +msgstr "Không bắt buộc. Cổng UDP được sử dụng cho các gói đi và đến." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:72 msgid "Options" -msgstr "Lựa chọn " +msgstr "Tuỳ chọn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4\" for default route. 0.0.0.0 means \"the address of the " "system running dnsmasq\"." msgstr "" +"Tùy chọn cho Network-ID. (Ghi chú: cần có cả Network-ID.) Ví dụ " +"\"42,192.168.1.4\" cho máy chủ NTP, \"3,192.168.4.4\" cho đường mặc định. 0.0.0.0 có nghĩa là \"địa chỉ của " +"hệ thống chạy dnsmasq\"." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" -msgstr "" +msgstr "Tùy chọn:" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "Số thứ tự: số nhỏ được đặt trước." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "Khoảng thời gian của người gửi" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" @@ -5739,25 +6601,26 @@ msgstr "Ngoài ràng buộc:" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:108 msgid "Outgoing checksum" -msgstr "" +msgstr "Kiểm tra tổng kiểm tra gửi đi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" -msgstr "" +msgstr "Giao diện gửi đi" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:96 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" -msgstr "" +msgstr "Khóa gửi đi" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:103 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:108 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110 msgid "Outgoing serialization" -msgstr "" +msgstr "Truyền thông gửi đi" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:50 msgid "Output Interface" @@ -5770,23 +6633,25 @@ msgstr "Vùng đầu ra" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:16 msgid "Overlap" -msgstr "" +msgstr "Trùng lắp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" -msgstr "" +msgstr "Ghi đè bảng định tuyến IPv4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" -msgstr "" +msgstr "Ghi đè bảng định tuyến IPv6" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5794,6 +6659,7 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "Ghi đè MTU" @@ -5815,11 +6681,13 @@ msgstr "Ghi đè TOS" msgid "Override TTL" msgstr "Ghi đè TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" msgstr "" +"Ghi đè địa chỉ MAC mặc định - phạm vi địa chỉ có thể sử dụng có thể bị hạn " +"chế bởi trình điều khiển" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1153 msgid "Override default interface name" @@ -5829,7 +6697,7 @@ msgstr "Ghi đè tên giao diện mạng mặc định" msgid "Override the gateway in DHCP responses" msgstr "Ghi đè cổng khi phản hồi DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -5845,25 +6713,38 @@ msgstr "Ghi đè bảng được sử dụng cho định tuyến nội bộ" msgid "Overview" msgstr "Tổng quan" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "Ghi đè tệp đã tồn tại \"%s\" ?" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:355 msgid "Overwrite the current settings with the imported configuration?" +msgstr "Ghi đè lên các cài đặt hiện tại bằng cấu hình đã nhập?" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "Chủ sở hữu" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" -msgstr "" +msgstr "PAP/CHAP (cả hai)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -5875,8 +6756,9 @@ msgid "PAP/CHAP password" msgstr "Mật khẩu PAP/CHAP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -5887,27 +6769,29 @@ msgstr "Mật khẩu PAP/CHAP" msgid "PAP/CHAP username" msgstr "Tên đăng nhập PAP?CHAP" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" -msgstr "" +msgstr "Loại PDP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:69 msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" -msgstr "" +msgstr "PIN" #: modules/luci-base/htdocs/luci-static/resources/network.js:21 #: modules/luci-compat/luasrc/model/network.lua:39 msgid "PIN code rejected" -msgstr "Mã PIN bị từ chối " +msgstr "Mã PIN bị từ chối" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "Đẩy PMK R1" @@ -5938,7 +6822,7 @@ msgstr "PPPoSSH" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:15 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:28 msgid "PPtP" -msgstr "" +msgstr "PPtP" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:73 msgid "PSID offset" @@ -5948,27 +6832,36 @@ msgstr "Bù PSID" msgid "PSID-bits length" msgstr "Độ dài(bit) PSID" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" -msgstr "" +msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM (Chế độ chuyển gói)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" +msgstr "Cài đặt PXE/TFTP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" -msgstr "" +msgstr "Định tuyến gói tin" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" -msgstr "" +msgstr "Đánh dấu gói tin" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "Thời gian nhận gói tin" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" @@ -5976,37 +6869,43 @@ msgstr "Gói tin" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:277 msgid "Packets To Transmit Before Moving To Next Slave" -msgstr "" +msgstr "Số gói tin truyền trước khi chuyển sang Slave tiếp theo" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "Phần của vùng %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" -msgstr "" +msgstr "Chuyển tiếp (Sao chép thiết bị vật lý thành một MAC VLAN duy nhất)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" -msgstr "Mật mã" +msgstr "Mật khẩu" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 msgid "Password authentication" msgstr "Xác thực mật mã" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" -msgstr "Mật mã của Khóa riêng tư" +msgstr "Mật khẩu của Khóa Riêng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "Mật mã của khóa riêng tư bên trong" @@ -6017,56 +6916,59 @@ msgstr "Mật mã của khóa riêng tư bên trong" msgid "Password strength" msgstr "Độ mạnh mật mã" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "Mật mã 2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" -msgstr "Dán hoặc thả tệp khóa SSH..." +msgstr "Dán hoặc thả tệp khóa SSH…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" -msgstr "" +msgstr "Dán hoặc kéo thả tệp cấu hình đồng nghiệp WireGuard (wg0.conf)…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " "connect to the local WireGuard interface." msgstr "" +"Dán hoặc kéo thả cấu hình WireGuard (thông thường wg0.conf) từ một " +"hệ thống khác phía dưới để tạo một mục đồng nghiệp phù hợp cho phép hệ thống " +"đó kết nối với giao diện WireGuard cục bộ." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" -msgstr "" +msgstr "Dán hoặc kéo thả tệp cấu hình WireGuard đã cung cấp…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" -msgstr "Đường dẫn tới nhà cung cấp chứng chỉ(CA)" +msgstr "Đường dẫn đến Chứng chỉ CA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" -msgstr "Đường dẫn tới chứng chỉ của máy khách" +msgstr "Đường dẫn đến Chứng chỉ Khách hàng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" -msgstr "Đường dẫn tới khoá riêng tư" +msgstr "Đường dẫn đến khóa riêng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "Đường dẫn tới nhà cung cấp chứng chỉ nội bộ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "Đường dẫn tới chứng chỉ nội bộ của máy khách" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "Đường dẫn tới khoá riêng tư nội bộ" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2727 msgid "Paused" -msgstr "" +msgstr "Tạm dừng" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:273 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:283 @@ -6080,32 +6982,40 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:278 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:296 msgid "Peak:" -msgstr "Đỉnh" +msgstr "Peak:" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "Thiết bị mạng ngang hàng" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "Chi tiết Đồng nghiệp" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "Địa chỉ IP thiết bị mạng ngang hàng để gắn kết" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" -msgstr "" +msgstr "Địa chỉ MAC của Đồng nghiệp" #: modules/luci-base/htdocs/luci-static/resources/network.js:14 #: modules/luci-compat/luasrc/model/network.lua:32 msgid "Peer address is missing" msgstr "Địa chỉ thiết bị mạng ngang hàng bị mất" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" -msgstr "" +msgstr "Tên thiết bị Đồng nghiệp" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" -msgstr "" +msgstr "Đồng nghiệp bị vô hiệu hóa" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:214 msgid "Peers" -msgstr "Thiết bị mạng ngang hàng" +msgstr "Peers" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:80 msgid "Perfect Forward Secrecy" @@ -6116,7 +7026,7 @@ msgstr "Bí mật chuyển tiếp hoàn hảo" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110 msgid "Perform outgoing packets serialization (optional)." -msgstr "" +msgstr "Thực hiện tuần tự hóa các gói tin gửi đi (tùy chọn)." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:34 msgid "Perform reboot" @@ -6130,27 +7040,31 @@ msgstr "Thực hiện khởi động lại" msgid "Permission denied" msgstr "Bạn không có quyền làm" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "Giữ liên tục" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "Khoảng thời gian kết nối lại liên tục" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" -msgstr "" +msgstr "Cài đặt PersistentKeepAlive không hợp lệ" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:290 msgid "Phy Rate:" -msgstr "Tốc độ Phy" +msgstr "Phy Rate:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "Cài đặt căn bản" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" -msgstr "" +msgstr "Ping" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:50 @@ -6159,76 +7073,94 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:138 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:64 msgid "Pkts." -msgstr "" +msgstr "Pkts." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." -msgstr "Nhập tên và mật mã" +msgstr "Nhập tên và mật mã." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." -msgstr "" +msgstr "Vui lòng chọn tệp để tải lên." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Policy" msgstr "Chính sách" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" -msgstr "" +msgstr "Chính sách: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" -msgstr "Cửa " +msgstr "Cổng" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "Cổng %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" +msgstr "Cô lập cổng" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "Trạng thái cổng:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "Phủ định tiềm năng của: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "Chế độ kiểm soát năng lượng" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "Lỗi CRC ưu tiên (CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "Ưu tiên LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "Ưu tiên UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "Tiền tố được ủy quyền" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" -msgstr "" +msgstr "Giảm thiểu tiền tố" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "Khóa đã được chia sẻ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" -msgstr "" +msgstr "Sử dụng khóa chia sẻ trước" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:308 msgid "PresharedKey setting is invalid" -msgstr "" +msgstr "Cài đặt PresharedKey không hợp lệ" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:130 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:102 @@ -6247,54 +7179,64 @@ msgstr "" msgid "Prevents client-to-client communication" msgstr "Ngăn chặn giao tiếp giữa client-và-client" -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 -msgid "Primary Slave" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." msgstr "" +"Ngăn không cho một khách hàng không dây nói chuyện với khách hàng khác. Cài " +"đặt này chỉ ảnh hưởng đến các gói tin không có thẻ VLAN nào (gói tin không " +"được gắn thẻ)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "" +#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 +msgid "Primary Slave" +msgstr "Bộ Slave chính" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " "better than current slave (better, 1)" msgstr "" +"Bộ Slave chính trở thành bộ Slave hoạt động khi nó khởi động lại nếu tốc độ " +"và duplex tốt hơn bộ Slave hiện tại (tốt hơn, 1)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:229 msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "" +"Bộ Slave chính trở thành bộ Slave hoạt động mỗi khi nó khởi động lại (luôn " +"luôn, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" -msgstr "" +msgstr "Ưu tiên" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" -msgstr "" +msgstr "Riêng tư" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" -msgstr "" +msgstr "Riêng tư (Ngăn không cho việc giao tiếp giữa các MAC VLAN)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" -msgstr "Khóa riêng tư" +msgstr "Khóa riêng" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" -msgstr "" +msgstr "Hiện tại có khóa riêng tư" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:296 msgid "PrivateKey setting is missing or invalid" -msgstr "" +msgstr "Cài đặt PrivateKey không tồn tại hoặc không hợp lệ" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:64 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:93 @@ -6303,11 +7245,11 @@ msgstr "Tiến trình" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:67 msgid "Prot." -msgstr "Giao thức" +msgstr "Prot." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6319,13 +7261,15 @@ msgstr "Giao thức" msgid "Provide NTP server" msgstr "Cung cấp máy chủ NTP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" +"Cung cấp một máy chủ DHCPv6 trên giao diện này và phản hồi các yêu cầu và đề " +"nghị DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "Cung cấp mạng mới" @@ -6334,26 +7278,39 @@ msgid "" "Provide the NTP server to the selected interface or, if unspecified, to all " "interfaces" msgstr "" +"Cung cấp máy chủ NTP cho giao diện được chọn hoặc, nếu không xác định, cho " +"tất cả các giao diện" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "Máy chủ Proxy" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "ProxyARP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "Mạng Ad-Hoc giả (ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "Khóa công khai" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" -msgstr "" +msgstr "Không có khóa công khai" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" -msgstr "" +msgstr "Khóa công khai: %h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6363,81 +7320,105 @@ msgstr "" "Khóa công khai cho phép đăng nhập SSH không mật khẩu với độ bảo mật cao hơn " "so với việc sử dụng mật khẩu đơn giản. Để tải lên khóa mới cho thiết bị, hãy " "dán một dòng khóa công khai tương thích với OpenSSH hoặc kéo tập tin *." -"pub vào trường đầu vào. " +"pub vào trường đầu vào." #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:192 msgid "Public prefix routed to this device for distribution to clients." msgstr "" -"Tiền tố công khai được chuyển đến thiết bị này để phân phối cho máy khách" +"Tiền tố công khai được chuyển đến thiết bị này để phân phối cho máy khách." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:305 msgid "PublicKey setting is invalid" -msgstr "" +msgstr "Cài đặt PublicKey không hợp lệ" #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:9 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:27 msgid "QMI Cellular" -msgstr "" +msgstr "QMI Cellular" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 msgid "Quality" msgstr "Chất lượng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" "Truy vấn tất cả dòng dữ liệu có thể có qua máy chủ DNS" +"phân giải tên miền\">DNS
    ." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" -msgstr "" +msgstr "Khoảng thời gian truy vấn" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" -msgstr "" +msgstr "Khoảng thời gian phản hồi truy vấn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "Thời hạn khóa R0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "Thiết bị giữ khóa R1" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" -msgstr "" +msgstr "Cổng kế toán RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" -msgstr "" +msgstr "Mật khẩu kế toán RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" -msgstr "" +msgstr "Máy chủ kế toán RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" -msgstr "" +msgstr "Cổng xác thực RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" -msgstr "" +msgstr "Mật khẩu xác thực RADIUS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" -msgstr "" +msgstr "Máy chủ xác thực RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "Phân chuyển động VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "VLAN Per STA RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "Sơ đồ đặt tên cầu VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "Đặt tên VLAN RADIUS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "Giao diện gắn thẻ VLAN RADIUS" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "Chế độ RFC3947 NAT-T" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "RSN Preauth" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "Ngưỡng RSSI có thể tham gia" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "Ngưỡng RTS/CTS" @@ -6450,14 +7431,22 @@ msgstr "RX" msgid "RX Rate" msgstr "Tốc độ dữ liệu nhận" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "Tốc độ dữ liệu nhận/truyền" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" +"Đo lường tài nguyên sóng radio - Gửi tín hiệu báo hiệu để hỗ trợ di chuyển. " +"Không phải tất cả các thiết bị khách hỗ trợ tính năng này." + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" -msgstr "" +msgstr "Ngẫu nhiên hóa ánh xạ cổng nguồn" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:88 msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" @@ -6465,13 +7454,11 @@ msgstr "" "Dữ liệu thô được mã hóa thập lục phân (byte). Để trống trừ khi ISP của bạn " "yêu cầu điều này" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." -msgstr "" -"Đọc /etc/ethers để định cấu hình DHCP-Server" +msgstr "Đọc /etc/ethers để định cấu hình máy chủ DHCP." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "Bạn thật sự muốn đổi giao thức?" @@ -6479,11 +7466,11 @@ msgstr "Bạn thật sự muốn đổi giao thức?" msgid "Realtime Graphs" msgstr "Biểu đồ thời gian thực" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "Hạn chót tái tổ chức" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "Bảo vệ tái kết nối" @@ -6497,7 +7484,7 @@ msgstr "Khởi động lại" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:46 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:51 msgid "Rebooting…" -msgstr "Đang khởi động lại..." +msgstr "Đang khởi động lại…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:21 msgid "Reboots the operating system of your device" @@ -6507,63 +7494,103 @@ msgstr "Khởi động lại hệ điều hành của công cụ" msgid "Receive" msgstr "Nhận" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "Nhận dữ liệu" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." -msgstr "Khuyến khích. Địa chỉ IP của giao diện mạng WireGuard" +msgstr "Khuyến khích. Địa chỉ IP của giao diện mạng WireGuard." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "Hết thời gian kết nối lại" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "Tái kết nối giao diện mạng này" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:14 msgid "Redirect to HTTPS" -msgstr "" +msgstr "Chuyển hướng đến HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" -msgstr "" +msgstr "Chuyển hướng đến cổng cục bộ %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" -msgstr "" +msgstr "Chuyển hướng đến hệ thống cục bộ" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:57 msgid "References" msgstr "Tham khảo" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "Làm mới các kênh" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" +msgstr "Đang làm mới" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" -msgstr "" +msgstr "Từ chối gói IPv4 với loại ICMP %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" -msgstr "" +msgstr "Từ chối gói tin với loại ICMP %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" -msgstr "" +msgstr "Từ chối gói tin với loại ICMPv6 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" -msgstr "" +msgstr "Từ chối gói tin với đặt lại TCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "" +"Từ chối quyết định định tuyến có độ dài tiền tố nhỏ hơn hoặc bằng giá trị đã " +"chỉ định" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "Phục thuộc" @@ -6573,6 +7600,12 @@ msgstr "Phục thuộc" msgid "Relay Bridge" msgstr "Cầu nối phụ thuộc" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" +"Chuyển tiếp yêu cầu DHCP đến nơi khác. OK: v4↔v4, v6↔v6. Không OK: v4↔v6, " +"v6↔v4." + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "Phụ thuộc giữa hai kết nối" @@ -6582,6 +7615,14 @@ msgstr "Phụ thuộc giữa hai kết nối" msgid "Relay bridge" msgstr "Cầu nối phụ thuộc" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6591,27 +7632,36 @@ msgstr "Địa chỉ IPv4 từ xa" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "Địa chỉ IPv4 từ xa hoặc FQDN" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 msgid "Remote IPv6 address" -msgstr "" +msgstr "Địa chỉ IPv6 từ xa" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 msgid "Remote IPv6 address or FQDN" -msgstr "" +msgstr "Địa chỉ IPv6 từ xa hoặc FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" -msgstr "Loại bỏ" +msgstr "Xóa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "Loại bỏ địa chỉ IPv4 khỏi kết quả và chỉ trả về địa chỉ IPv6." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "Loại bỏ địa chỉ IPv6 khỏi kết quả và chỉ trả về địa chỉ IPv4." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" -msgstr "" +msgstr "Xóa các thiết lập thiết bị liên quan khỏi cấu hình" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "Thay thế cấu hình mạng không dây" @@ -6632,16 +7682,17 @@ msgstr "Hết thời gian yêu cầu" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:107 msgid "Require incoming checksum (optional)." -msgstr "" +msgstr "Yêu cầu kiểm tra hợp lệ đến (tùy chọn)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:102 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:107 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:104 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:109 msgid "Require incoming packets serialization (optional)." -msgstr "" +msgstr "Yêu cầu chuỗi hóa gói tin đến (tùy chọn)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "Bắt buộc" @@ -6651,94 +7702,102 @@ msgstr "Cần thiết cho một số ISP nhất định, ví dụ: Điều lệ #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 msgid "Required. Base64-encoded private key for this interface." -msgstr "Bắt buộc. Khóa riêng tư được mã hóa Base64 cho giao diện này" +msgstr "Bắt buộc. Khóa riêng tư được mã hóa Base64 cho giao diện này." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Required. Path to the .yml config file for this interface." -msgstr "" +msgstr "Bắt buộc. Đường dẫn đến tệp cấu hình .yml cho giao diện này." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." -msgstr "" +msgstr "Bắt buộc. Khóa công khai của đối tác WireGuard." #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:42 msgid "Required. Underlying interface." -msgstr "" +msgstr "Bắt buộc. Giao diện cơ bản." #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:39 msgid "Required. XFRM interface ID to be used for SA." +msgstr "Bắt buộc. ID giao diện XFRM được sử dụng cho SA." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." msgstr "" +"Bắt buộc: Từ chối xác thực nếu máy chủ RADIUS không cung cấp các thuộc tính " +"VLAN phù hợp." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "Yêu cầu hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" -msgstr "" +msgstr "Yêu cầu hostapd hỗ trợ EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "Yêu cầu hostapd với hỗ trợ từ EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "Yêu cầu hostapd với hỗ trợ từ OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "Yêu cầu hostapd với hỗ trợ từ SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" -msgstr "" +msgstr "Yêu cầu hostapd hỗ trợ WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "Yêu cầu wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" -msgstr "" +msgstr "Yêu cầu wpa-supplicant hỗ trợ EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "Yêu cầu wpa-supplicant với EAP hỗ trợ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "Yêu cầu wpa-supplicant với OWE hỗ trợ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "Yêu cầu wpa-supplicant với SAE hỗ trợ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" -msgstr "" +msgstr "Yêu cầu wpa-supplicant hỗ trợ WEP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:226 msgid "Reselection policy for primary slave" -msgstr "" +msgstr "Chính sách lựa chọn lại cho slave chính" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6753,152 +7812,177 @@ msgstr "Khởi động lại bộ đếm" msgid "Reset to defaults" msgstr "Phục hồi về mặc định" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "Tập tin Resolv và Hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "Tập tin Resolv" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "Giải quyết FQDNs được chỉ định thành một địa chỉ IP." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "Không tìm được nguồn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" -msgstr "Khởi động lại" +msgstr "Khởi Động Lại" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:348 msgid "Restart Firewall" msgstr "Khởi động lại tường lửa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "Khởi động lại giao diện mạng không dây" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "Restore" -msgstr "Phục hồi" +msgstr "Khôi phục" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:410 msgid "Restore backup" msgstr "Phục hồi backup" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" -"Cục bộ hóa tên máy chủ tùy thuộc vào mạng con yêu cầu nếu có sẵn nhiều IP" +"Cục bộ hóa tên máy chủ tùy thuộc vào mạng con yêu cầu nếu có sẵn nhiều IP." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" -msgstr "Hiển thị/ẩn mật khẩu" +msgstr "Hiện/ẩn mật khẩu" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" -msgstr "" +msgstr "Bộ lọc đường dẫn ngược" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "Hoàn nguyên" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "Hoàn nguyên thay đổi" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "Yêu cầu hoàn nguyên không thành công với trạng thái %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "Đang hoàn nguyên cấu hình .." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" -msgstr "" +msgstr "Chuyển đổi đích thành %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" -msgstr "" +msgstr "Rewrite destination to %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" -msgstr "" +msgstr "Chuyển đổi đích thành %h, cổng %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" -msgstr "" +msgstr "Rewrite destination to %h, port %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" -msgstr "" +msgstr "Viết lại nguồn thành %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" -msgstr "" +msgstr "Chuyển đổi nguồn thành %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" -msgstr "" +msgstr "Chuyển đổi nguồn thành %h, cổng %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" -msgstr "" +msgstr "Viết lại nguồn đến %h, cổng %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" +msgstr "Chuyển đổi thành địa chỉ thiết bị egress" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." msgstr "" +"Mạng Bảo mật Mạnh mẽ (RSN): Cho phép roaming preauth cho các mạng WPA2-EAP " +"(và quảng cáo nó trong WLAN beacons). Chỉ hoạt động nếu giao diện mạng được " +"chỉ định là một bridge. Rút ngắn quá trình tái kết nối quan trọng về thời " +"gian." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" -msgstr "" +msgstr "Khả năng chống chịu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " "TFTP server root." msgstr "" +"Thư mục gốc cho các tệp được phục vụ qua TFTP. Bật máy chủ TFTP và " +"Gốc máy chủ TFTP bật máy chủ TFTP và phục vụ tệp từ Gốc máy chủ " +"TFTP." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:298 msgid "Root preparation" -msgstr "" +msgstr "Chuẩn bị gốc" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:204 msgid "Round-Robin policy (balance-rr, 0)" -msgstr "" +msgstr "Chính sách Round-Robin (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "Định tuyến cho các IP được cho phép" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" -msgstr "" +msgstr "Chuỗi hành động tuyến \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "Kiểu định tuyến" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." msgstr "" +"Thời gian hoạt động của Router được công bố trong các thông điệp RA. Tối đa là 9000 " +"giây." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:26 @@ -6910,7 +7994,11 @@ msgstr "Mật khẩu bộ định tuyến" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:248 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:15 msgid "Routing" -msgstr "" +msgstr "Định tuyến" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "Thuật toán định tuyến" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" @@ -6924,28 +8012,28 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:198 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:224 msgid "Rule" -msgstr "Luật" +msgstr "Quy tắc" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" -msgstr "" +msgstr "Hành động quy tắc" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" -msgstr "" +msgstr "Chú thích quy tắc: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" -msgstr "" +msgstr "Chuỗi tập quy tắc con \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" -msgstr "" +msgstr "Điều kiện quy tắc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" -msgstr "" +msgstr "Loại quy tắc" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:336 msgid "Run a filesystem check before mounting the device" @@ -6961,12 +8049,25 @@ msgstr "Lỗi" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:224 msgid "SHA256" +msgstr "SHA256" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" -msgstr "" +msgstr "SNR" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 @@ -6985,32 +8086,32 @@ msgstr "Cổng máy chủ SSH" msgid "SSH username" msgstr "Tên người dùng SSH" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" -msgstr "" +msgstr "Khóa SSH" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:9 msgid "SSTP" -msgstr "" +msgstr "SSTP" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:41 msgid "SSTP Server" -msgstr "" +msgstr "Máy chủ SSTP" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 msgid "SWAP" -msgstr "" +msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7021,14 +8122,14 @@ msgid "Save" msgstr "Lưu" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" -msgstr "Lưu & áp dụng " +msgstr "Lưu & áp dụng" #: modules/luci-base/htdocs/luci-static/resources/form.js:607 msgid "Save error" -msgstr "" +msgstr "Lỗi khi lưu" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:434 msgid "Save mtdblock" @@ -7038,7 +8139,7 @@ msgstr "Lưu mtdblock" msgid "Save mtdblock contents" msgstr "Lưu nội dung mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "quét" @@ -7047,11 +8148,16 @@ msgstr "quét" msgid "Scheduled Tasks" msgstr "Nhiệm vụ theo lịch trình" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "Thêm mục" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "Xóa mục" @@ -7065,29 +8171,31 @@ msgid "" "fails. Use only if you are sure that the firmware is correct and meant for " "your device!" msgstr "" -"chọn 'Buộc nâng cấp' để nạp ảnh phần mềm bỏ qua việc kiểm tra định dạng ảnh " +"Chọn 'Buộc nâng cấp' để nạp ảnh phần mềm bỏ qua việc kiểm tra định dạng ảnh " "phần mềm không thành công. Chỉ chọn nếu bạn có thể chắc chắc rằng phần mềm " -"này tương thích với thiết bị của bạn" +"này tương thích với thiết bị của bạn!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" -msgstr "Chọn tệp" +msgstr "Chọn tệp…" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:320 msgid "Selects the transmit hash policy to use for slave selection" -msgstr "" +msgstr "Chọn chính sách băm truyền để sử dụng cho việc chọn slave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." msgstr "" +"Gửi thông điệp RA quảng bá thiết bị này làm bộ định tuyến IPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" -msgstr "" +msgstr "Gửi chuyển hướng ICMP" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:143 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 @@ -7099,18 +8207,24 @@ msgid "" "Send LCP echo requests at the given interval in seconds, only effective in " "conjunction with failure threshold" msgstr "" +"Gửi yêu cầu ping LCP theo khoảng thời gian cho trước tính bằng giây, chỉ có " +"hiệu lực khi kết hợp với ngưỡng lỗi" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:24 msgid "Send the hostname of this device" -msgstr "" +msgstr "Gửi tên máy chủ của thiết bị này" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "Máy Chủ" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" -msgstr "" +msgstr "Địa chỉ máy chủ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" -msgstr "" +msgstr "Tên máy chủ" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 msgid "Service Name" @@ -7122,7 +8236,7 @@ msgstr "Kiểu dịch vụ" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:36 msgid "Services" -msgstr "Dịch vụ " +msgstr "Các dịch vụ" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2664 msgid "Session expired" @@ -7131,18 +8245,22 @@ msgstr "Phiên hết hạn" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:126 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:175 msgid "Set Static" +msgstr "Thiết lập Tĩnh" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" -msgstr "" +msgstr "Thiết lập trường tiêu đề %s thành %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." -msgstr "" +msgstr "Đặt giao diện làm slave bên ngoài NDP-Proxy. Mặc định là tắt." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7153,34 +8271,43 @@ msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:302 msgid "Set same MAC Address to all slaves" -msgstr "" +msgstr "Đặt địa chỉ MAC giống nhau cho tất cả slave" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " "When enabled, clients will perform stateless IPv6 address autoconfiguration." msgstr "" +"Đặt cờ cấu hình địa chỉ tự động trong tùy chọn thông tin tiền tố của thông " +"điệp RA được gửi đi. Khi kích " +"hoạt, các client sẽ thực hiện cấu hình địa chỉ IPv6 không trạng thái tự động." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." msgstr "" +"Đặt giao diện này làm master cho việc chuyển tiếp RA và DHCPv6 cũng như " +"proxy NDP." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:306 msgid "Set to currently active slave (active, 1)" -msgstr "" +msgstr "Đặt thành slave hiện tại hoạt động (active, 1)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:307 msgid "Set to first slave added to the bond (follow, 2)" -msgstr "" +msgstr "Đặt thành slave đầu tiên được thêm vào kết nối (follow, 2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "Cài đặt máy chủ DHCP" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "Thiết lập các tuyến đường cho hàng xóm IPv6 qua proxy." + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7188,33 +8315,39 @@ msgid "Setting PLMN failed" msgstr "Cài đặt PLMN không thành công" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "Cài đặt chế độ hoạt động không thành công" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 -msgid "Settings" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." msgstr "" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 +msgid "Settings" +msgstr "Cài đặt" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" msgstr "" +"Cài đặt hỗ trợ cho các client không dây khi di chuyển giữa nhiều điểm truy " +"cập AP: 802.11r, 802.11k và 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" -msgstr "" +msgstr "Short GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" -msgstr "" +msgstr "Tiền tố ngắn" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "Hiển thị danh sách tập tin lưu trữ" @@ -7225,18 +8358,18 @@ msgstr "Hiển thị chuỗi trống" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:338 msgid "Show raw counters" -msgstr "" +msgstr "Hiển thị bộ đếm gốc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "Tắt giao diện mạng này" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7244,28 +8377,28 @@ msgstr "Tắt giao diện mạng này" msgid "Signal" msgstr "Tín hiệu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "Tín hiệu / Nhiễu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "Độ suy hao tín hiệu (SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" -msgstr "" +msgstr "Tốc độ làm mới tín hiệu" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:262 msgid "Signal:" msgstr "Tín hiệu:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" -msgstr "Dung lượng " +msgstr "Dung lượng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "Dung lượng của bộ nhớ tạm truy vấn DNS" @@ -7280,21 +8413,21 @@ msgstr "Chuyển" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:257 msgid "Skip from backup files that are equal to those in /rom" -msgstr "" +msgstr "Bỏ qua các tệp sao lưu giống với tệp trong /rom" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "Nhảy tới nội dung" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "Chuyển đến mục định hướng" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:180 msgid "Slave Interfaces" -msgstr "" +msgstr "Giao diện slave" #: modules/luci-base/htdocs/luci-static/resources/network.js:3002 #: modules/luci-compat/luasrc/model/network.lua:1428 @@ -7305,13 +8438,9 @@ msgstr "VLAN phần mềm" msgid "Some fields are invalid, cannot save values!" msgstr "Có trường không hợp lệ, không thể lưu giá trị!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." -msgstr "Xin lỗi, không thể tìm được đối tượng bạn yêu cầu" - -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "Xin lỗi, máy chủ đã gặp lỗi không mong muốn" +msgstr "Xin lỗi, không thể tìm được đối tượng bạn yêu cầu." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" @@ -7323,8 +8452,8 @@ msgstr "" "phần mềm mới phải được nạp thủ công. Vui lòng tham khảo wiki để biết hướng " "dẫn cài đặt cụ thể của thiết bị." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7334,111 +8463,134 @@ msgstr "Nguồn" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:43 msgctxt "nft ip saddr" msgid "Source IP" -msgstr "" +msgstr "IP nguồn" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:47 msgctxt "nft ip6 saddr" msgid "Source IPv6" -msgstr "" +msgstr "IPv6 nguồn" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57 msgid "Source interface" -msgstr "" +msgstr "Giao diện nguồn" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:45 msgctxt "nft ip sport" msgid "Source port" -msgstr "" +msgstr "Cổng nguồn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." msgstr "" +"Các tùy chọn khởi động đặc biệt PXE cho Dnsmasq." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." msgstr "" +"Chỉ định một danh sách cố định các miền tìm kiếm DNS để thông báo thông qua " +"DHCPv6. Nếu không chỉ định, miền tìm kiếm DNS của thiết bị cục bộ sẽ được " +"thông báo." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " "unless the Local IPv6 DNS server option is disabled." msgstr "" +"Chỉ định một danh sách cố định các địa chỉ máy chủ DNS IPv6 để thông báo " +"thông qua DHCPv6. Nếu không chỉ định, thiết bị sẽ thông báo nó là máy chủ " +"DNS IPv6 trừ khi tùy chọn Máy chủ DNS IPv6 cục bộ bị vô hiệu hóa." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " "corresponding range" msgstr "" +"Chỉ định một UID cá nhân hoặc dải UID để phù hợp, ví dụ: 1000 để phù hợp với " +"UID tương ứng hoặc 1000-1005 để phù hợp bao gồm tất cả các UID trong phạm vi " +"tương ứng" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:343 msgid "" "Specifies that duplicate frames (received on inactive ports) should be " "dropped or delivered" msgstr "" +"Chỉ định rằng các khung trùng lặp (nhận được trên các cổng không hoạt động) " +"nên bị loại bỏ hoặc được gửi đi" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:359 msgid "Specifies the ARP link monitoring frequency in milliseconds" -msgstr "" +msgstr "Chỉ định tần suất giám sát liên kết ARP theo đơn vị mili giây" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:367 msgid "Specifies the IP addresses to use for ARP monitoring" -msgstr "" +msgstr "Chỉ định các địa chỉ IP để sử dụng cho việc giám sát ARP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:396 msgid "Specifies the MII link monitoring frequency in milliseconds" -msgstr "" +msgstr "Chỉ định tần suất giám sát liên kết MII theo đơn vị mili giây" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" -msgstr "" +msgstr "Chỉ định giá trị TOS để phù hợp trong tiêu đề IP" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:261 msgid "Specifies the aggregation selection logic to use" -msgstr "" +msgstr "Chỉ định logic lựa chọn tổng hợp để sử dụng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" -msgstr "" +msgstr "Chỉ định mạng con đích để phù hợp (ký hiệu CIDR)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 msgid "Specifies the directory the device is attached to" msgstr "Chỉ định thư mục mà thiết bị được đính kèm" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " "stateful DHCPv6." msgstr "" +"Chỉ định các cờ được gửi trong các tin nhắn RA, ví dụ để chỉ dẫn cho các máy khách yêu cầu thông " +"tin thêm thông qua stateful DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" msgstr "" +"Chỉ định fwmark và tùy chọn mặt nạ của nó để phù hợp, ví dụ 0xFF để phù hợp " +"với đánh dấu 255 hoặc 0x0/0x1 để phù hợp với bất kỳ giá trị đánh dấu chẵn nào" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" -msgstr "" +msgstr "Chỉ định tên giao diện logic đầu vào" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 msgid "" "Specifies the logical interface name of the parent (or master) interface " "this route belongs to" msgstr "" +"Chỉ định tên giao diện logic của giao diện cha (hoặc giao diện chủ) mà tuyến " +"đường này thuộc về" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:254 msgid "" "Specifies the mac-address for the actor in protocol packet exchanges " "(LACPDUs). If empty, masters' mac address defaults to system default" msgstr "" +"Chỉ định địa chỉ mac cho người tham gia trong giao tiếp gói giao thức " +"(LACPDUs). Nếu trống, địa chỉ mac của các máy chủ mặc định sẽ là mặc định hệ " +"thống" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 msgid "" @@ -7456,7 +8608,7 @@ msgstr "" "Chỉ định thời gian(giây) tối đa mà sau đó máy chủ được cho là đã không hoạt " "động" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7471,144 +8623,178 @@ msgid "" "Specifies the minimum number of links that must be active before asserting " "carrier" msgstr "" +"Chỉ định số lượng liên kết tối thiểu phải hoạt động trước khi xác định mạng " +"vận chuyển" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:202 msgid "Specifies the mode to be used for this bonding interface" -msgstr "" +msgstr "Chỉ định chế độ được sử dụng cho giao diện liên kết này" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " "0.0.0.0 no gateway will be specified for the route" msgstr "" +"Chỉ định cổng mạng. Nếu bỏ qua, cổng từ giao diện cha sẽ được lấy nếu có, " +"nếu không sẽ tạo một tuyến phạm vi liên kết. Nếu đặt thành 0.0.0.0, không có " +"cổng mạng được chỉ định cho tuyến đường" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:334 msgid "" "Specifies the number of IGMP membership reports to be issued after a " "failover event in 200ms intervals" msgstr "" +"Chỉ định số báo cáo thành viên IGMP được phát ra sau một sự kiện chuyển giao " +"trong khoảng thời gian 200ms" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:278 msgid "" "Specifies the number of packets to transmit through a slave before moving to " "the next one" msgstr "" +"Chỉ định số gói tin để truyền qua một slave trước khi chuyển sang slave tiếp " +"theo" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:312 msgid "" "Specifies the number of peer notifications (gratuitous ARPs and unsolicited " "IPv6 Neighbor Advertisements) to be issued after a failover event" msgstr "" +"Chỉ định số thông báo đồng nghiệp (gratuitous ARP và unsolicited IPv6 " +"Neighbor Advertisements) được phát ra sau một sự kiện chuyển giao" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:286 msgid "" "Specifies the number of seconds between instances where the bonding driver " "sends learning packets to each slaves peer switch" msgstr "" +"Chỉ định số giây giữa các trường hợp mà trình điều khiển liên kết gửi các " +"gói học đến từng công tắc ngang hàng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" -msgstr "" +msgstr "Chỉ định thứ tự các quy tắc IP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" -msgstr "" +msgstr "Chỉ định tên giao diện logic đầu ra" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" msgstr "" +"Chỉ định địa chỉ nguồn ưu tiên khi gửi đến các điểm đến được bao phủ bởi mục " +"tiêu" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:375 msgid "Specifies the quantity of ARP IP targets that must be reachable" -msgstr "" +msgstr "Chỉ định số lượng mục tiêu IP ARP phải có thể đạt được" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:270 msgid "" "Specifies the rate in which the link partner will be asked to transmit " "LACPDU packets" msgstr "" +"Chỉ định tốc độ mà đối tác liên kết sẽ được yêu cầu truyền các gói tin LACPDU" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:227 msgid "" "Specifies the reselection policy for the primary slave when failure of the " "active slave or recovery of the primary slave occurs" msgstr "" +"Chỉ định chính sách chọn lại cho slave chính khi xảy ra sự cố với slave hoạt " +"động hoặc phục hồi của slave chính" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" -msgstr "" +msgstr "Chỉ định số liệu đo lường tuyến đường để sử dụng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" -msgstr "" +msgstr "Chỉ định loại tuyến đường được tạo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" -msgstr "" +msgstr "Chỉ định hành động định tuyến mục tiêu của quy tắc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" -msgstr "" +msgstr "Chỉ định mạng con nguồn phù hợp (ghi chú CIDR)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:246 msgid "Specifies the system priority" -msgstr "" +msgstr "Chỉ định ưu tiên hệ thống" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:404 msgid "" "Specifies the time in milliseconds to wait before disabling a slave after a " "link failure detection" msgstr "" +"Chỉ định thời gian tính bằng mili giây để chờ trước khi tắt slave sau khi " +"phát hiện lỗi liên kết" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:412 msgid "" "Specifies the time in milliseconds to wait before enabling a slave after a " "link recovery detection" msgstr "" +"Chỉ định thời gian tính bằng mili giây để chờ trước khi bật slave sau khi " +"phát hiện phục hồi liên kết" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " "wireless settings." msgstr "" +"Chỉ định các cổng có dây để gắn vào cầu này. Để gắn kết các mạng không dây, " +"hãy chọn giao diện liên quan như mạng trong các thiết lập không dây." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:383 msgid "" "Specifies whether ARP probes and replies should be validated or non-ARP " "traffic should be filtered for link monitoring" msgstr "" +"Chỉ định liệu các ARP probes và replies có nên được xác nhận hay không hoặc " +"liệu nên lọc lưu lượng không phải ARP để giám sát kết nối" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:303 msgid "" "Specifies whether active-backup mode should set all slaves to the same MAC " "address at enslavement" msgstr "" +"Chỉ định liệu chế độ active-backup có nên đặt tất cả các slave với cùng địa " +"chỉ MAC khi bị chế độ nô lệ" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:420 msgid "" "Specifies whether or not miimon should use MII or ETHTOOL ioctls vs. " "netif_carrier_ok()" msgstr "" +"Chỉ định liệu miimon có nên sử dụng MII hoặc ETHTOOL ioctls so với " +"netif_carrier_ok()" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:295 msgid "" "Specifies whether to shuffle active flows across slaves based on the load" msgstr "" +"Chỉ định liệu có nên phân bố các luồng hoạt động qua các slave dựa trên tải" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:181 msgid "" "Specifies which slave interfaces should be attached to this bonding interface" msgstr "" +"Chỉ định các giao diện slave nào nên được gắn vào giao diện bonding này" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:214 msgid "" "Specifies which slave is the primary device. It will always be the active " "slave while it is available" msgstr "" +"Chỉ định slave nào là thiết bị chính. Nó sẽ luôn là slave hoạt động khi nó " +"khả dụng" #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 @@ -7624,6 +8810,9 @@ msgid "" "header inherits the value of the inner header) or an hexadecimal value " "00..FF (optional)." msgstr "" +"Chỉ định một TOS (Type of Service). Có thể là inherit (header " +"bên ngoài thừa hưởng giá trị của header bên trong) hoặc một giá trị hệ thập " +"lục phân 00..FF (tùy chọn)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:74 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:74 @@ -7632,6 +8821,8 @@ msgid "" "Specify a TTL (Time to Live) for the encapsulating packet other than the " "default (64) (optional)." msgstr "" +"Chỉ định TTL (Time to Live) cho gói tin đóng gói ngoại trừ giá trị mặc định " +"(64) (tùy chọn)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 @@ -7640,7 +8831,7 @@ msgstr "" msgid "" "Specify a TTL (Time to Live) for the encapsulating packet other than the " "default (64)." -msgstr "Chỉ định một Thời gian sống(TTL) cho gói tin khác với mặc định(64). " +msgstr "Chỉ định một Thời gian sống(TTL) cho gói tin khác với mặc định(64)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84 msgid "" @@ -7648,6 +8839,9 @@ msgid "" "inherits the value of the inner header) or an hexadecimal value 00.." "FF (optional)." msgstr "" +"Chỉ định một Traffic Class. Có thể là inherit (header bên ngoài " +"thừa hưởng giá trị của header bên trong) hoặc một giá trị hệ thập lục phân " +"00..FF (tùy chọn)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 @@ -7657,44 +8851,54 @@ msgid "" "Specify an MTU (Maximum Transmission Unit) other than the default (1280 " "bytes) (optional)." msgstr "" +"Chỉ định MTU (Maximum Transmission Unit) khác giá trị mặc định (1280 byte) " +"(tùy chọn)." #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 msgid "" "Specify an MTU (Maximum Transmission Unit) other than the default (1280 " "bytes)." -msgstr "Chỉ định một đơn vị truyền tối đa(MTU) khác với mặc định (1280 byte)" +msgstr "Chỉ định một đơn vị truyền tối đa(MTU) khác với mặc định (1280 byte)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." -msgstr "Chỉ định khóa mã hóa bí mật ở đây" +msgstr "Chỉ định khóa mã hóa bí mật ở đây." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 -msgid "Stale neighbour cache timeout" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 +msgid "Stale neighbour cache timeout" +msgstr "Thời gian chờ hết hạn bộ nhớ cache của hàng xóm" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" -msgstr "Bắt đầu " +msgstr "Bắt đầu" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:140 msgid "Start WPS" -msgstr "" +msgstr "Bắt đầu WPS" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:76 msgid "Start priority" msgstr "Bắt đầu ưu tiên" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" -msgstr "" +msgstr "Bắt đầu làm mới" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" -msgstr "Đang áp dụng cáu hình ..." +msgstr "Đang áp dụng cáu hình…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "Bắt đầu quét mạng ..." @@ -7703,6 +8907,10 @@ msgstr "Bắt đầu quét mạng ..." msgid "Startup" msgstr "Khởi động" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "Định tuyến tĩnh IPv4" @@ -7714,9 +8922,9 @@ msgstr "Định tuyến tĩnh IPv6" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:91 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:138 msgid "Static Lease" -msgstr "" +msgstr "Cho thuê tĩnh" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "Thống kê địa chỉ đã cấp phát" @@ -7726,7 +8934,7 @@ msgstr "Thống kê địa chỉ đã cấp phát" msgid "Static address" msgstr "Địa chỉ tĩnh" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7737,40 +8945,40 @@ msgstr "" "các cấu hình giao diện mạng không động trong đó chỉ các máy chủ được chỉ " "định cấp phát tương ứng được phục vụ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "Giới hạn không hoạt động của máy trạm" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "Trạng thái" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "Dừng" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:135 msgid "Stop WPS" -msgstr "" +msgstr "Dừng WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" -msgstr "" +msgstr "Dừng làm mới" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:24 msgid "Storage" -msgstr "" +msgstr "Lưu trữ" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" -msgstr "" +msgstr "Lọc nghiêm ngặt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "Yêu cầu nghiêm ngặt" @@ -7779,21 +8987,21 @@ msgid "Strong" msgstr "Mạnh" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" -msgstr "Trình " +msgstr "Trình" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "Dừng lưu nhật ký" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." -msgstr "Bỏ lưu nhật ký hoạt động định tuyến của các giao thức này" +msgstr "Bỏ lưu nhật ký hoạt động định tuyến của các giao thức này." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:46 msgid "Swap free" -msgstr "" +msgstr "Số lượng Swap không sử dụng" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:3 @@ -7809,7 +9017,7 @@ msgid "" "Switch %q has an unknown topology - the VLAN settings might not be accurate." msgstr "" "chuyển đổi %q có cấu trúc liên kết không xác định - cài đặt Vlan có thể " -"không chính xác " +"không chính xác" #: modules/luci-base/htdocs/luci-static/resources/network.js:3002 #: modules/luci-compat/luasrc/model/network.lua:1426 @@ -7818,9 +9026,9 @@ msgstr "Đổi VLAN" #: modules/luci-base/htdocs/luci-static/resources/network.js:2999 msgid "Switch port" -msgstr "" +msgstr "Cổng Switch" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "Đổi giao thức" @@ -7830,7 +9038,7 @@ msgstr "Đổi giao thức" msgid "Switch to CIDR list notation" msgstr "Chuyển sang ký hiệu danh sách CIDR" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "Đường dẫn tham chiếu" @@ -7842,8 +9050,16 @@ msgstr "Đồng bộ với máy chủ NTP" msgid "Sync with browser" msgstr "Đồng bộ với trình duyệt web" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "Cú pháp: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "Cú pháp: _service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7857,7 +9073,7 @@ msgstr "Nhật ký hệ thống" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:245 msgid "System Priority" -msgstr "" +msgstr "Ưu tiên Hệ thống" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:118 msgid "System Properties" @@ -7867,38 +9083,38 @@ msgstr "Thuộc tính hệ thống" msgid "System log buffer size" msgstr "Kích cỡ bộ đệm nhật ký hệ thống" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." -msgstr "" +msgstr "Hệ thống đang chạy ở chế độ khôi phục (initramfs)." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:67 msgctxt "nft tcp option maxseg size" msgid "TCP MSS" -msgstr "" +msgstr "TCP MSS" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:54 msgctxt "nft tcp dport" msgid "TCP destination port" -msgstr "" +msgstr "Cổng đích TCP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:57 msgctxt "nft tcp flags" msgid "TCP flags" -msgstr "" +msgstr "Cờ TCP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:53 msgctxt "nft tcp sport" msgid "TCP source port" -msgstr "" +msgstr "Cổng nguồn TCP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:338 msgid "TCP:" -msgstr "" +msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "Máy chủ gốc TFTP" @@ -7911,28 +9127,39 @@ msgstr "TX" msgid "TX Rate" msgstr "Tốc độ truyền" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" -msgstr "" +msgstr "Độ dài hàng đợi TX" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "Bảng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "Đã gắn thẻ" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "Mục tiêu" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" -msgstr "" +msgstr "Nền tảng mục tiêu" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:103 msgid "Target network" @@ -7940,36 +9167,45 @@ msgstr "Mạng đích" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/25_storage.js:36 msgid "Temp space" -msgstr "" +msgstr "Không gian tạm" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:50 msgid "Terminate" msgstr "Kết thúc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " "Minimum is 1280 bytes." msgstr "" +"MTU sẽ được công bố trong " +"các thông điệp RA. Tối thiểu là 1280 byte." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "" +"Cờ Cấu hình địa chỉ quản lý (M) cho biết rằng địa chỉ IPv6 có sẵn " +"thông qua DHCPv6." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." msgstr "" +"Cờ Mobile IPv6 Home Agent (H) cho biết rằng thiết bị cũng hoạt động " +"như một Mobile IPv6 home agent trên liên kết này." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." msgstr "" +"Cờ Cấu hình khác (O) cho biết rằng thông tin khác, chẳng hạn như " +"máy chủ DNS, có sẵn thông qua DHCPv6." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:84 msgid "The block mount command failed with code %d" @@ -7979,13 +9215,19 @@ msgstr "Lệnh gắn kết khối không thành công với mã lỗi % msgid "" "The qrencode package is required for generating an QR code image of " "the configuration." +msgstr "Gói qrencode được yêu cầu để tạo hình ảnh mã QR của cấu hình." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" msgstr "" +"Các mục máy chủ DNS trong tệp resolv.conf cục bộ được sắp xếp chủ yếu theo " +"trọng số được chỉ định ở đây" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:77 msgid "" @@ -7993,39 +9235,52 @@ msgid "" "username instead of the user ID!" msgstr "" "Cấu hình cập nhật điểm cuối HE.net đã thay đổi, bây giờ bạn có thể sử dụng " -"tên người dùng đơn giản thay vì ID người dùng" +"tên người dùng đơn giản thay vì ID người dùng!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" -msgstr "" +msgstr "Địa chỉ IP %h đã được sử dụng bởi một giao kết tĩnh khác" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" -msgstr "" +msgstr "Địa chỉ IP nằm ngoài phạm vi địa chỉ trong bể DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" +msgstr "Địa chỉ IP của máy chủ khởi động" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." msgstr "" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." -msgstr "" +msgstr "Địa chỉ IPv4 hoặc tên miền đầy đủ của đầu cuối từ xa." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "Địa chỉ IPv4 hoặc tên miền đủ điều kiện của đầu kia đường hầm dữ liệu." #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 msgid "The IPv6 address or the fully-qualified domain name of the remote end." -msgstr "" +msgstr "Địa chỉ IPv6 hoặc tên miền đầy đủ của đầu cuối từ xa." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." +msgstr "Địa chỉ IPv6 hoặc tên miền đầy đủ của đầu cuối đường hầm từ xa." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 @@ -8033,59 +9288,71 @@ msgstr "" msgid "" "The IPv6 prefix assigned to the provider, usually ends with ::" msgstr "" +"Tiền tố IPv6 được gán cho nhà cung cấp, thường kết thúc bằng ::" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:7 msgid "The LED blinks with the configured on/off frequency" -msgstr "" +msgstr "Đèn LED nhấp nháy với tần số được cấu hình bật/tắt" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." -msgstr "" +msgstr "Đèn LED nhấp nháy để mô phỏng nhịp tim thực tế." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:8 msgid "" "The LED flashes with link status and activity on the configured interface." msgstr "" +"Đèn LED nhấp nháy với trạng thái liên kết và hoạt động trên giao diện được " +"cấu hình." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:7 msgid "The LED is always in default state off." -msgstr "" +msgstr "Đèn LED luôn ở trạng thái mặc định tắt." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:6 msgid "The LED is always in default state on." -msgstr "" +msgstr "Đèn LED luôn ở trạng thái mặc định bật." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "" +"Địa chỉ MAC %h đã được sử dụng bởi một bản gán tĩnh khác trong cùng một nhóm " +"DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" -msgstr "" +msgstr "MTU không được vượt quá MTU của thiết bị chính cha với %d byte" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" -msgstr "" +msgstr "ID VLAN phải là duy nhất" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "Thuật toán được sử dụng để khám phá các tuyến đường lưới" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" msgstr "" +"Các ký tự được cho phép là: A-Z, a-z, 0-9 và _" #: modules/luci-compat/luasrc/view/cbi/error.htm:6 msgid "The configuration file could not be loaded due to the following error:" -msgstr "" +msgstr "Không thể tải tệp cấu hình do lỗi sau:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "" +"SSID chính xác phải được chỉ định thủ công khi tham gia mạng không dây ẩn" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8095,6 +9362,12 @@ msgid "" "or revert all pending changes to keep the currently working configuration " "state." msgstr "" +"Không thể kết nối với thiết bị trong vòng %d giây sau khi áp dụng các thay " +"đổi đang chờ, điều này đã làm cuộn lại cấu hình vì lý do an toàn. Nếu bạn " +"tin rằng các thay đổi cấu hình vẫn là chính xác, hãy thực hiện áp dụng cấu " +"hình không kiểm tra. Hoặc, bạn có thể bỏ qua cảnh báo này và chỉnh sửa các " +"thay đổi trước khi cố gắng áp dụng lại, hoặc hoàn tác tất cả các thay đổi " +"đang chờ để giữ trạng thái cấu hình đang hoạt động hiện tại." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:281 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:393 @@ -8105,23 +9378,23 @@ msgstr "" "Tập tin công cụ của bộ nhớ hoặc phân vùng (e.g. " "/dev/sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" -msgstr "" +msgstr "Tên thiết bị \"%s\" đã được sử dụng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." -msgstr "" +msgstr "Cấu hình mạng hiện tại cần được thay đổi để LuCI hoạt động đúng cách." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." msgstr "" -"Cấu hình không dây hiện tại cần được thay đổi để LuCI hoạt động bình thường" +"Cấu hình không dây hiện tại cần được thay đổi để LuCI hoạt động bình thường." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:220 msgid "" @@ -8135,27 +9408,29 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:249 msgid "The following rules are currently active on this system." -msgstr "Các quy tắc sau hiện đang hoạt động trên hệ thống" +msgstr "Các quy tắc sau hiện đang hoạt động trên hệ thống." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." -msgstr "" +msgstr "Tần số tỉ lệ thuận trực tiếp với tải trung bình CPU trong 1 phút." #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:154 msgid "The gateway address must not be a local IP address" msgstr "Địa chỉ gateway không được là địa chỉ IP cục bộ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "" +"Cấu hình được tạo có thể được nhập vào ứng dụng khách WireGuard để thiết lập " +"kết nối với thiết bị này." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." -msgstr "Khóa công khai SSH đã cho đã được thêm" +msgstr "Khóa công khai SSH đã cho đã được thêm." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." @@ -8163,15 +9438,36 @@ msgstr "" "Khóa công khai SSH đã cho không hợp lệ. Vui lòng cung cấp khóa RSA hoặc " "ECDSA công khai thích hợp." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 -msgid "The hostname of the boot server" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" msgstr "" +"Thiết lập hình phạt nhảy cho phép chỉnh sửa sự ưu tiên của batman-adv đối " +"với các tuyến đường multihop so với các tuyến đường ngắn. Giá trị này được " +"áp dụng cho TQ của mỗi gói tin OGM được chuyển tiếp, từ đó lan truyền chi " +"phí của một nhảy thêm (gói tin phải được nhận và chuyển tiếp lại mất thời " +"gian phát sóng)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 +msgid "The hostname of the boot server" +msgstr "Tên máy chủ khởi động" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "Không tìm thấy giao diện" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "Giao diện mạng đã đang sử dụng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "Tên giao diện mạng này quá dài" @@ -8182,7 +9478,7 @@ msgid "" "addresses." msgstr "" "Độ dài của địa chỉ IPv4 prefix (bit), phần còn lại được sử dụng trong các " -"địa chỉ IPv6" +"địa chỉ IPv6." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 @@ -8191,26 +9487,27 @@ msgstr "Độ dài của địa chỉ IPv6 prefix (bit)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:165 msgid "The local IPv4 address" -msgstr "" +msgstr "Địa chỉ IPv4 cục bộ" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." -msgstr "Địa chỉ IPv4 cục bộ mà đường hầm dữ liệu được tạo (tùy chọn)" +msgstr "Địa chỉ IPv4 cục bộ mà đường hầm dữ liệu được tạo (tùy chọn)." #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:171 msgid "The local IPv4 netmask" -msgstr "" +msgstr "Mặt nạ mạng IPv4 cục bộ" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:53 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 msgid "The local IPv6 address over which the tunnel is created (optional)." -msgstr "" +msgstr "Địa chỉ IPv6 cục bộ qua đó đường hầm được tạo ra (tùy chọn)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8218,33 +9515,47 @@ msgid "" "\"leave latency\" of the network. A reduced value results in reduced time to " "detect the loss of the last member of a group" msgstr "" +"Thời gian phản hồi tối đa tính bằng trăm mili giây được chèn vào các truy " +"vấn cụ thể cho từng nhóm được gửi như phản hồi cho các tin nhắn rời khỏi " +"nhóm. Đây cũng là khoảng thời gian giữa các truy vấn cụ thể cho từng nhóm. " +"Giá trị này có thể được điều chỉnh để thay đổi \"độ trễ rời khỏi\" của mạng. " +"Giá trị giảm sẽ dẫn đến thời gian giảm để phát hiện sự mất mát của thành " +"viên cuối cùng trong nhóm" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " "IGMP messages on the subnet; larger values make the traffic less bursty, as " "host responses are spread out over a larger interval" msgstr "" +"Thời gian phản hồi tối đa tính bằng trăm mili giây được chèn vào các truy " +"vấn chung định kỳ. Bằng cách thay đổi giá trị, quản trị viên có thể điều " +"chỉnh tính lắp đặt của các thông điệp IGMP trên mạng con; giá trị lớn làm " +"cho lưu lượng ít bùng nổ hơn, vì các phản hồi từ máy chủ được phân bố trong " +"một khoảng thời gian lớn hơn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." msgstr "" +"Số lượng nhảy tối đa được công bố trong các thông điệp RA. Tối đa là 255 nhảy." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "" +"Truy cập mạng tới thiết bị này có thể bị gián đoạn bằng cách thay đổi các " +"cài đặt của giao diện \"%h\"." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "Tên mạng đã được sử dụng" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 -#, fuzzy msgid "" "The network ports on this device can be combined to several VLANs in which computers can " @@ -8253,58 +9564,71 @@ msgid "" "segments. Often there is by default one Uplink port for a connection to the " "next greater network like the internet and other ports for a local network." msgstr "" -"Các cổng mạng trên thiết bị này có thể được kết hợp với một số Vlans trong đó các máy tính có thể giao " -"tiếp trực tiếp với nhau. Vlan s " -"thường được sử dụng để phân tách các phân đoạn mạng khác nhau. Thường sẽ có " -"một cổng Uplink mặc định để kết nối với mạng lớn hơn tiếp theo như internet " -"và các cổng khác cho mạng cục bộ." +"Các cổng mạng trên thiết bị này có thể được kết hợp thành một số VLAN trong đó các máy tính có thể giao tiếp " +"trực tiếp với nhau. VLAN thường được " +"sử dụng để phân tách các phân đoạn mạng khác nhau. Theo mặc định, thường có " +"một cổng Uplink để kết nối với mạng lớn hơn tiếp theo như internet và các " +"cổng khác cho mạng cục bộ." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " "domain." msgstr "" +"Tên máy chủ công cộng hoặc địa chỉ IP công cộng của hệ thống này mà đồng " +"đẳng nên kết nối tới. Thông thường đây là một địa chỉ IP công cộng tĩnh, một " +"tên máy chủ tĩnh hoặc một miền DDNS." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "" +"Khoảng thời gian phản hồi truy vấn phải nhỏ hơn giá trị khoảng thời gian " +"truy vấn" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:158 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:42 msgid "The reboot command failed with code %d" -msgstr "Lệnh khởi động lại không thành công với mã lỗi %d" +msgstr "Lệnh khởi động lại (reboot) không thành công, mã lỗi: %d" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:147 msgid "The restore command failed with code %d" msgstr "Lệnh khôi phục không thành công với mã lỗi %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " "increased. IGMP is robust to (Robustness-1) packet losses" msgstr "" +"Giá trị độ bền cho phép điều chỉnh cho việc mất mát gói tin dự kiến trên " +"mạng. Nếu mạng được dự đoán có khả năng mất gói tin, giá trị độ bền có thể " +"được tăng lên. IGMP có độ bền đối với (độ bền - 1) gói tin bị mất" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "" +"Mục tiêu quy tắc là một lời nhảy tới một quy tắc khác được chỉ định bởi giá " +"trị ưu tiên của nó" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " "aliases local (255), main (254) and default (253) are also valid" msgstr "" +"Mục tiêu quy tắc là một ID tra cứu bảng: một chỉ mục bảng số từ 0 đến 65535 " +"hoặc định danh ký hiệu được khai báo trong /etc/iproute2/rt_tables. Các định " +"danh đặc biệt local (255), main (254) và default (253) cũng hợp lệ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "Chế độ %s được chọn không tương thích với mã hóa %s" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "Mã thông báo bảo mật đã gửi không hợp lệ hoặc đã hết hạn!" @@ -8317,7 +9641,6 @@ msgstr "" "tất." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:320 -#, fuzzy msgid "" "The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " "few minutes before you try to reconnect. It might be necessary to renew the " @@ -8326,7 +9649,7 @@ msgid "" msgstr "" "Hệ thống bây giờ đang nạp.
    KHÔNG NGẮT NGUỒN THIẾT BỊ!
    Chờ một " "vài phút cho tới khi kết nối lại. Có thể cần phải làm mới địa chỉ của máy " -"tính để kết nối tới thiết bị một lần nữa, phụ thuộc vào cài đặt của bạn. " +"tính để kết nối tới thiết bị một lần nữa, phụ thuộc vào cài đặt của bạn." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:163 msgid "" @@ -8338,12 +9661,20 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:85 msgid "The system password has been successfully changed." -msgstr "Mật khẩu hệ thống đã được thay đổi thành công" +msgstr "Mật khẩu hệ thống đã được thay đổi thành công." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:345 msgid "The sysupgrade command failed with code %d" msgstr "Lệnh nâng cấp hệ thống không thành công với mã lỗi %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8370,30 +9701,42 @@ msgstr "" "Tập tin đang tải hình ảnh không bao gồm một hổ trợ format. Bảo đảm rằng bạn " "chọn một image format tổng quát cho platform." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "Giá trị này bị ghi đè bởi cấu hình." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." msgstr "" +"Giá trị này chỉ định khoảng thời gian (mili giây) trong đó batman-adv lụt " +"mạng với thông tin giao thức của nó." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." msgstr "" +"Trên hệ thống hiện có các luật iptables kế thừa. Sá»± kết hợp giữa luật " +"iptables và luật nftables không được khuyến khích và có thể dẫn đến việc lọc " +"lÆ°u lượng không hoàn chỉnh." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "Không có máy được cấp IP nào hoạt động" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "Không có thay đổi nào để áp dụng" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8404,18 +9747,18 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 msgid "This IPv4 address of the relay" -msgstr "" +msgstr "Đây là địa chỉ IPv4 của relay" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." -msgstr "Loại xác thá»±c này không áp dụng cho phÆ°Æ¡ng pháp EAP đã chọn" +msgstr "Loại xác thá»±c này không áp dụng cho phÆ°Æ¡ng pháp EAP đã chọn." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "Tập tin không giống nhÆ° một tệp PEM hợp lệ" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8423,7 +9766,7 @@ msgid "" msgstr "" "Đây là danh sách các mẫu lệnh toàn cục cho các tệp và thÆ° mục phù hợp để đưa " "vào trong quá trình nâng cấp hệ thống. Các tệp đã sá»­a đổi trong /etc/config/ " -"và một số cấu hình khác được tá»± động giữ nguyên" +"và một số cấu hình khác được tá»± động giữ nguyên." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 msgid "" @@ -8433,13 +9776,30 @@ msgstr "" "Đây có thẻ là \"Khóa cập nhật\" được cấu hình cho đường hầm dữ liệu hoặc mật " "khẩu nếu không có khóa cập nhật nào được cấu hình" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"Đây là thiết bị batman-adv mà bạn muốn liên kết với Thiết bị vật lý ở trên. " +"Nếu danh sách này trống, bạn cần tạo một danh sách trước. Nếu bạn muốn định " +"tuyến lÆ°u lượng mạng lưới qua một thiết bị mạng có dây, vui lòng chọn nó từ " +"trình chọn Thiết bị ở trên. Nếu bạn muốn gán giao diện batman-adv cho một " +"mạng Wi-fi, thì đừng chọn Thiết bị trong trình chọn Thiết bị mà hãy vào cài " +"đặt Wi-Fi và chọn Giao diện này làm mạng từ đó." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " "front of 'exit 0') to execute them at the end of the boot process." msgstr "" "Đây là nội dung của /etc/rc.local. Chèn các lệnh của riêng bạn vào đây " -"(trước 'exit 0) để thá»±c thi chúng ở cuối quá trình khởi động" +"(trước 'exit 0) để thá»±c thi chúng ở cuối quá trình khởi động." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:54 msgid "" @@ -8449,11 +9809,11 @@ msgstr "" "Đây là địa chỉ điểm cuối cục bộ được chỉ định bởi tunnel broker, nó thường " "kết thúc bằng ...:2/64" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "Đây là DHCP duy " -"nhất trong mạng địa phÆ°Æ¡ng. " +"nhất trong mạng địa phÆ°Æ¡ng." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "This is the plain username for logging into the account" @@ -8463,6 +9823,8 @@ msgstr "Đây là tên người dùng đơn giản để đăng nhập vào tài msgid "" "This is the prefix routed to you by the tunnel broker for use by clients" msgstr "" +"Đây là tiền tố được định tuyến đến bạn bởi người môi giới tunnel để sá»­ dụng " +"bởi các khách hàng" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:29 msgid "This is the system crontab in which scheduled tasks can be defined." @@ -8472,6 +9834,7 @@ msgstr "Đây là system crontab mà scheduled tasks có thể bị định ngh msgid "" "This is usually the address of the nearest PoP operated by the tunnel broker" msgstr "" +"Đây thường là địa chỉ của trạm PoP gần nhất do người môi giới tunnel vận hành" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:65 msgid "" @@ -8481,64 +9844,73 @@ msgstr "" "Danh sách này đưa ra một tầm nhìn tổng quát về tiến trình hệ thống đang chạy " "và tình trạng của chúng." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." -msgstr "" +msgstr "Không thể sá»­ dụng tùy chọn này vì gói ca-bundle chÆ°a được cài đặt." #: modules/luci-base/htdocs/luci-static/resources/form.js:2280 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:172 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:32 msgid "This section contains no values yet" -msgstr "Phần này chÆ°a có giá trị nào" +msgstr "Phần này chÆ°a chứa giá trị nào" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:124 msgid "Time Synchronization" msgstr "Đồng bộ thời gian" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "Quảng cáo thời gian" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" -msgstr "" +msgstr "Thời gian tính bằng mili giây" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" -msgstr "" +msgstr "Thời gian tính bằng giây để ở trạng thái lắng nghe và học hỏi" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "Chu kỳ tạo lại mật khẩu mới GTK" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "Múi giờ" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" -msgstr "" +msgstr "Hết thời gian" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" -msgstr "" +msgstr "Hết thời gian tính bằng giây" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "" +"Hết thời gian tính bằng giây cho địa chỉ MAC đã học trong cÆ¡ sở dữ liệu " +"chuyển tiếp" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" -msgstr "" +msgstr "Hết thời gian tính bằng giây cho cập nhật mô hình trên sá»± mất kết nối" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:145 msgid "Timezone" -msgstr "Múi giờ " +msgstr "Múi giờ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the configuration import instead." msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "Đến phần đăng nhập" +"Để cấu hình đầy đủ giao diện WireGuard cục bộ từ tệp cấu hình hiện có (ví " +"dụ: tệp cấu hình được cung cấp bởi nhà cung cấp), hãy sá»­ dụng nhập cấu hình thay cho nó." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" @@ -8551,39 +9923,43 @@ msgstr "" "nhấp vào \"Thá»±c hiện đặt lại\" (chỉ có thể thá»±c hiện với tập tin ảnh kiểu " "squashfs)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" -msgstr "" +msgstr "Âm sắc" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:35 msgid "Total Available" msgstr "Tất cả có sẵn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Theo dấu định tuyến" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 msgid "Traffic" -msgstr "" +msgstr "LÆ°u lượng" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:79 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84 msgid "Traffic Class" -msgstr "" +msgstr "Lớp LÆ°u lượng" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" -msgstr "" +msgstr "Dây chuyền bộ lọc lÆ°u lượng \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" -msgstr "" +msgstr "LÆ°u lượng phù hợp với quy tắc: %.1000mGói tin, %.1024mByte" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:387 msgid "Transfer" @@ -8595,22 +9971,42 @@ msgstr "Transmit" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:319 msgid "Transmit Hash Policy" +msgstr "Chính sách Băm Truyền" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "Máy phát Antenna" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" -msgstr "" +msgstr "Các bit tiêu đề vận chuyển %d-%d" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:59 msgctxt "nft th dport" msgid "Transport header destination port" -msgstr "" +msgstr "Cổng đích tiêu đề vận chuyển" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:58 msgctxt "nft th sport" msgid "Transport header source port" -msgstr "" +msgstr "Cổng nguồn tiêu đề vận chuyển" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:75 msgid "Trigger" @@ -8635,38 +10031,38 @@ msgstr "Giao diện đường hầm dữ liệu" msgid "Tunnel Link" msgstr "Liên kết đường hầm dữ liệu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" -msgstr "" +msgstr "Thiết bị đường hầm" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 msgid "Tx-Power" msgstr "Năng lượng truyền" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" -msgstr "Loại " +msgstr "Loại" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" -msgstr "" +msgstr "Loại dịch vụ" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:56 msgctxt "nft udp dport" msgid "UDP destination port" -msgstr "" +msgstr "Cổng đích UDP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:55 msgctxt "nft udp sport" msgid "UDP source port" -msgstr "" +msgstr "Cổng nguồn UDP" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:328 msgid "UDP:" -msgstr "" +msgstr "UDP:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:91 msgid "UMTS only" @@ -8675,12 +10071,12 @@ msgstr "Chỉ UMTS" #: modules/luci-compat/luasrc/model/network/proto_3g.lua:10 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:43 msgid "UMTS/GPRS/EV-DO" -msgstr "" +msgstr "UMTS/GPRS/EV-DO" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:255 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:361 msgid "UUID" -msgstr "" +msgstr "UUID" #: modules/luci-base/htdocs/luci-static/resources/network.js:16 #: modules/luci-base/htdocs/luci-static/resources/network.js:17 @@ -8699,18 +10095,18 @@ msgstr "Không thể xác định địa chỉ IP ngoại" msgid "Unable to determine upstream interface" msgstr "Không thể xác định dòng dữ liệu giao diện mạng" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "Không thể gá»­i" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:85 msgid "Unable to generate QR code: %s" -msgstr "" +msgstr "Không thể tạo mã QR: %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:9 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:15 msgid "Unable to load log data:" -msgstr "" +msgstr "Không thể tải dữ liệu nhật ký:" #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:54 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:54 @@ -8724,11 +10120,11 @@ msgstr "Không thể có được thông tin gắn kết" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:307 msgid "Unable to reset ip6tables counters: %s" -msgstr "" +msgstr "Không thể đặt lại bộ đếm ip6tables: %s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:305 msgid "Unable to reset iptables counters: %s" -msgstr "" +msgstr "Không thể đặt lại bộ đếm iptables: %s" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:61 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:7 @@ -8742,7 +10138,7 @@ msgstr "Không thể giải quyết tên máy chủ ngang hàng" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:313 msgid "Unable to restart firewall: %s" -msgstr "" +msgstr "Không thể khởi động lại tường lá»­a: %s" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:370 @@ -8750,25 +10146,41 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "Không thể lÆ°u nội dung: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 -msgid "Unconfigure" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." msgstr "" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "Không thể xác minh PIN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 +msgid "Unconfigure" +msgstr "Hủy cấu hình" + +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "Định dạng dữ liệu trả lời bất ngờ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " "analogous to IPv4 private network addressing. This prefix is randomly " "generated at first install." msgstr "" +"Địa chỉ cục bộ duy nhất - trong phạm vi fc00::/7. Thông thường " +"chỉ trong phạm vi ‘cục bộ’ một ná»­a fd00::/8. ULA " +"cho IPv6 tÆ°Æ¡ng tá»± nhÆ° địa chỉ mạng riêng IPv4. Tiền tố này được tạo ngẫu " +"nhiên khi cài đặt lần đầu." #: modules/luci-base/htdocs/luci-static/resources/network.js:2092 #: modules/luci-compat/luasrc/model/network.lua:971 @@ -8776,9 +10188,9 @@ msgstr "" msgid "Unknown" msgstr "Không xác định" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." -msgstr "" +msgstr "PhÆ°Æ¡ng thức kết nối không rõ và không được hỗ trợ." #: modules/luci-base/htdocs/luci-static/resources/network.js:2401 #: modules/luci-compat/luasrc/model/network.lua:1138 @@ -8800,11 +10212,11 @@ msgstr "Hủy quản lý" msgid "Unmount" msgstr "Hủy gắn kết" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "Khóa không tên" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "Thay đổi không lÆ°u" @@ -8818,17 +10230,27 @@ msgid "Unsupported MAP type" msgstr "Không hỗ trợ giao thức MAP" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "Thiết bị không được hỗ trợ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "Giao thức không được hỗ trợ" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." -msgstr "Giao thức này không được hỗ trợ" +msgstr "Giao thức này không được hỗ trợ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "Không đánh thẻ" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" -msgstr "" +msgstr "Người đồng nghiệp chÆ°a có tiêu đề" #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 msgid "Up" @@ -8836,9 +10258,9 @@ msgstr "Lên" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:411 msgid "Up Delay" -msgstr "" +msgstr "Độ trễ tăng" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "Tải lên" @@ -8855,60 +10277,72 @@ msgstr "" msgid "Upload archive..." msgstr "Tải dữ liệu lên ..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "Tải tập tin lên" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" -msgstr "Đang tải tin lên ..." +msgstr "Tải tệp lên…" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "Đã hủy tải lên" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "Yêu cầu tải thất bại: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" -msgstr "Đang tải tin lên ..." +msgstr "Đang tải tệp lên …" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " "restarted to apply the updated configuration." msgstr "" "Khi nhấn \"Tiếp tục\",các phần \"wifi-iface\" ẩn danh sẽ được gán tên dưới " -"dạng wifinet# và mạng sẽ được khởi động lại để áp dụng cấu hình mới" +"dạng wifinet# và mạng sẽ được khởi động lại để áp dụng cấu hình mới." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "" +"Khi nhấn \"Tiếp tục\", cấu hình cầu sẽ được cập nhật và mạng sẽ được khởi " +"động lại để áp dụng cấu hình đã cập nhật." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" +"Khi nhấn \"Tiếp tục\", tùy chọn ifname sẽ được đổi tên và mạng sẽ được khởi " +"động lại để áp dụng cấu hình đã cập nhật." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "DNS máy chủ sẽ được truy " -"vấn theo thứ tá»± của resolvfile" +"vấn theo thứ tá»± của resolvfile." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" -msgstr "Uptime" +msgstr "Thời gian hoạt động" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "Dùng /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "Sá»­ dụng DHCP" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "Dùng máy chủ quảng bá HDCP" @@ -8917,15 +10351,20 @@ msgstr "Dùng máy chủ quảng bá HDCP" msgid "Use DHCP gateway" msgstr "Dùng DHCP gateway" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "Sá»­ dụng DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "Sá»­ dụng máy chủ DNS được quảng cáo bởi máy ngang cấp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." -msgstr "Sá»­ dụng mã quốc gia ISO / IEC 3166 alpha2" +msgstr "Sá»­ dụng mã quốc gia ISO / IEC 3166 alpha2." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:48 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:89 @@ -8945,17 +10384,19 @@ msgstr "Sá»­ dụng TTL trên giao diện đường hầm dữ liệu" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:322 msgid "Use XOR of hardware MAC addresses (layer2)" -msgstr "" +msgstr "Sá»­ dụng XOR của địa chỉ MAC phần cứng (layer2)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:323 msgid "Use XOR of hardware MAC addresses and IP addresses (layer2+3)" -msgstr "" +msgstr "Sá»­ dụng XOR của địa chỉ MAC phần cứng và địa chỉ IP (layer2+3)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:325 msgid "" "Use XOR of hardware MAC addresses and IP addresses, rely on skb_flow_dissect " "(encap2+3)" msgstr "" +"Sá»­ dụng XOR của địa chỉ MAC phần cứng và địa chỉ IP, dá»±a vào " +"skb_flow_dissect (encap2+3)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:295 msgid "Use as external overlay (/overlay)" @@ -8969,35 +10410,40 @@ msgstr "Sá»­ dụng nhÆ° thÆ° mục hệ thống gốc" msgid "Use broadcast flag" msgstr "Sá»­ dụng cờ quảng bá" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "Sá»­ dụng trình quản lý IPv6 đã được tích hợp và hệ thống" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "Sá»­ dụng máy chủ DNS tá»± tạo" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" -msgstr "" +msgstr "Sá»­ dụng cổng mặc định" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "Sá»­ dụng gateway metric" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 msgid "Use legacy MAP" -msgstr "" +msgstr "Sá»­ dụng MAP cÅ©" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 msgid "" "Use legacy MAP interface identifier format (draft-ietf-softwire-map-00) " "instead of RFC7597" msgstr "" +"Sá»­ dụng định dạng chứng chỉ MAP cÅ© cho nhận dạng giao diện (dá»± thảo-ietf-" +"softwire-map-00) thay vì RFC7597" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 msgid "Use routing table" @@ -9006,17 +10452,17 @@ msgstr "Sá»­ dụng bảng định tuyến" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:63 msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" -msgstr "" +msgstr "Sá»­ dụng cùng nguồn và đích cho mỗi kết nối" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" -msgstr "" +msgstr "Sá»­ dụng chứng chỉ hệ thống" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" -msgstr "" +msgstr "Sá»­ dụng chứng chỉ hệ thống cho inner-tunnel" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9032,89 +10478,93 @@ msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:324 msgid "Use upper layer protocol information (layer3+4)" -msgstr "" +msgstr "Sá»­ dụng thông tin giao thức lớp trên (layer3+4)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:326 msgid "" "Use upper layer protocol information, rely on skb_flow_dissect (encap3+4)" msgstr "" +"Sá»­ dụng thông tin giao thức tầng trên, phụ thuộc vào skb_flow_dissect " +"(encap3+4)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:36 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:194 msgid "Used" msgstr "Đã sá»­ dụng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "Khay khóa đã được sá»­ dụng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "" "Được sá»­ dụng cho hai mục đích khác nhau: RADIUS NAS ID và 802.11r R0KH-ID. " -"Không cần thiết với mật khẩu WPA(2)-PSK thường" +"Không cần thiết với mật khẩu WPA(2)-PSK thường." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" -msgstr "" +msgstr "Nhóm người dùng" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "Chứng chỉ người dùng (mã hóa PEM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" -msgstr "" +msgstr "Nhận dạng người dùng" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "Khóa người dùng (mã hóa PEM)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" -msgstr "Tên người dùng " +msgstr "Tên người dùng" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" -msgstr "" +msgstr "Sá»­ dụng bảng luồng %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" -msgstr "" +msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" -msgstr "" +msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" -msgstr "" +msgstr "VEPA (Bộ tổng hợp Cổng Ethernet Ảo)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" -msgstr "" +msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" -msgstr "" +msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" -msgstr "" +msgstr "ID VLAN" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:173 msgid "VLANs on %q" -msgstr "" +msgstr "Các VLAN trên %q" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:54 msgid "VPN" @@ -9128,24 +10578,27 @@ msgstr "Địa chỉ cục bộ VPN" msgid "VPN Local port" msgstr "Cổng cục bộ VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" -msgstr "" +msgstr "Giao thức VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "Máy chủ VPN" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "Băm SHA256 của chứng chỉ máy chủ VPN" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "Cổng máy chủ VPM" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "Chứng chỉ của máy chủ VPN được băm theo thuật toán SHA1" @@ -9154,45 +10607,51 @@ msgstr "Chứng chỉ của máy chủ VPN được băm theo thuật toán SHA1 msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (và một số khác) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" -msgstr "" +msgstr "VXLAN (RFC7348)" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 msgid "VXLAN network identifier" -msgstr "" +msgstr "Bộ nhận dạng mạng VXLAN" #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:10 msgid "VXLANv6 (RFC7348)" -msgstr "" +msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "" "Yêu cầu upstream hỗ trợ DNSSEC; xác minh phản hồi tên miền chÆ°a được ký thá»±c " -"sá»± đến từ nó" +"sá»± đến từ nó." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" msgstr "" +"Xác thực chứng chỉ máy chủ bằng gói system CA bundle tích hợp sẵn,
    yêu " +"cầu gói \"ca-bundle\"" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:388 msgid "Validation for all slaves" -msgstr "" +msgstr "Xác thực cho tất cả slaves" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:386 msgid "Validation only for active slave" -msgstr "" +msgstr "Chỉ xác thực cho active slave" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:387 msgid "Validation only for backup slaves" -msgstr "" +msgstr "Chỉ xác thực cho các backup slaves" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:73 msgid "Vendor" @@ -9202,55 +10661,69 @@ msgstr "Máy cung cấp" msgid "Vendor Class to send when requesting DHCP" msgstr "Lớp máy cung cấp để gửi khi yêu cầu DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "" +"Xác minh các phản hồi tên miền không được ký hiệu thực sự đến từ các tên " +"miền không được ký hiệu." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:196 msgid "Verifying the uploaded image file." msgstr "Xác minh tập tin ảnh được tải lên." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" -msgstr "" +msgstr "Rất cao" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" -msgstr "" +msgstr "Ethernet ảo" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:60 msgid "Virtual dynamic interface" msgstr "Giao diện mạng ảo động" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "Hệ thống mở WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "Khóa dùng chung WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "Mật khẩu WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "Roaming WLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "Chế độ WMM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "Chế độ ngủ WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "Sửa lỗi chế độ ngủ WNM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "Mật khẩu WPA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9260,11 +10733,11 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:153 msgid "WPS status" -msgstr "" +msgstr "Trạng thái WPS" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:47 msgid "Waiting for device..." -msgstr "Đợi thiết bị..." +msgstr "Đang đợi thiết bị..." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:189 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:199 @@ -9279,19 +10752,78 @@ msgstr "Cảnh báo: Những thay đổi chưa được lưu sẽ bị xóa khi msgid "Weak" msgstr "Yếu" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "Trọng số" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" +"Khi ủy quyền tiền tố cho nhiều đường dưới, các giao diện có giá trị ưu tiên " +"cao hơn được xem xét trước khi phân bổ các mạng con." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"Khi bật, mã hóa mạng tăng khả năng thông qua WiFi bằng cách kết hợp nhiều " +"khung thành một khung duy nhất, từ đó giảm thời gian truyền không khí cần " +"thiết." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"Khi bật, bảng ARP phân tán tạo thành một bộ nhớ cache ARP toàn mạng lưới, " +"giúp các máy khách không thuộc lưới lấy các phản hồi ARP đáng tin cậy hơn và " +"không có nhiều độ trễ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "" +"Khi bật, cổng là kết nối trực tiếp ngay cả khi cổng không phù hợp với bất kỳ " +"tiền tố giao diện nào" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"Khi bật, các mục bảng ARP mới được thêm từ các yêu cầu hoặc trả lời APR miễn " +"phí đã nhận, nếu không chỉ các mục bảng hiện có được cập nhật, nhưng không " +"học được máy chủ mới." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "" +"Khi bị đảo ngược, đèn LED sẽ sáng liên tục và nhấp nháy thay vì tắt mặc định " +"và nhấp nháy khi hoạt động hệ thống." + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"Khi chạy mesh qua nhiều giao diện WiFi trên mỗi nút, batman-adv có khả năng " +"tối ưu hóa luồng lưu lượng để đạt hiệu suất tối đa." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9299,33 +10831,46 @@ msgid "" msgstr "" "Khi sử dụng PSK, PMK có thể được tạo tự động. Khi được bật, các tùy chọn " "phím R0/R1 bên dưới không được áp dụng. Vô hiệu hóa để sử dụng các tùy chọn " -"phím R0 và R1" +"phím R0 và R1." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" +"Khi vô hiệu hóa chế độ Wi-Fi Multimedia (WMM) QoS, khách hàng có thể bị giới " +"hạn ở tốc độ 802.11a/802.11g." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "" +"Khi ESSID bị ẩn, khách hàng có thể gặp sự cố khi di chuyển và hiệu suất sử " +"dụng không gian truyền tải có thể giảm đáng kể." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "Độ dài" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "Trạng thái của WideGuard" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" -msgstr "" +msgstr "Mạng riêng ảo WireGuard" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" -msgstr "" +msgstr "Ngang hàng WireGuard đã bị vô hiệu hóa" #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:17 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:10 @@ -9339,21 +10884,21 @@ msgid "Wireless Adapter" msgstr "Bộ tương hợp không dây" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "Mạng không dây" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "Tổng quan không dây" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "Bảo mật không dây" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "Di chuyển cấu hình không dây" @@ -9369,17 +10914,17 @@ msgstr "Thiết bị không dây đang bị vô hiệu hóa" msgid "Wireless is not associated" msgstr "Chưa được gắn với thiết bị không dây" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "Mạng không dây bị vô hiệu hóa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "Mạng không dây được kích hoạt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." -msgstr "Viết yêu cầu DNS nhận được vào nhật ký hệ thống" +msgstr "Viết yêu cầu DNS nhận được vào nhật ký hệ thống." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:181 msgid "Write system log to file" @@ -9387,9 +10932,9 @@ msgstr "Viết nhật ký hệ thống vào một tệp" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:206 msgid "XOR policy (balance-xor, 2)" -msgstr "" +msgstr "Chính sách XOR (cân bằng xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9397,7 +10942,7 @@ msgstr "Có" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:305 msgid "Yes (none, 0)" -msgstr "" +msgstr "Có (không, 0)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:177 msgid "" @@ -9418,8 +10963,20 @@ msgstr "" "bạn vô hiệu hoá kịch bản khởi động thiết yếu như &quot;network&" "quot;, công cụ của bạn chó thể trở nên không truy cập được
    " -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "Bạn có thể thêm nhiều bản ghi cho cùng mục tiêu." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "Bạn có thể thêm nhiều bản ghi cho cùng miền." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "Bạn có thể thêm nhiều Relay To duy nhất trên cùng địa chỉ Nghe." + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9431,12 +10988,12 @@ msgstr "" msgid "" "You must select a primary interface which is included in selected slave " "interfaces!" -msgstr "" +msgstr "Bạn phải chọn một giao diện chính có trong các giao diện con đã chọn!" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:98 msgid "" "You must select at least one ARP IP target if ARP monitoring is selected!" -msgstr "" +msgstr "Bạn phải chọn ít nhất một mục tiêu IP ARP nếu đã chọn giám sát ARP!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:213 msgid "ZRam Compression Algorithm" @@ -9450,37 +11007,58 @@ msgstr "Thiết đặt ZRam" msgid "ZRam Size" msgstr "Kích cỡ ZRam" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Lưu ý: Trong khi " +"_http có thể, không có trình duyệt nào hỗ trợ bản ghi SRV.)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" -msgstr "Bất kể" +msgstr "Bất kì" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "tự động" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 -#, fuzzy +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" -msgstr "thống kê" +msgstr "Tự động hóa" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "tự động (vô hiệu hóa)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "tự động (đã kích hoạt)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" -msgstr "" +msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" -msgstr "" +msgstr "cầu nối" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:146 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:406 @@ -9533,45 +11111,59 @@ msgstr "dBm" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:73 msgctxt "nft unit" msgid "day" -msgstr "" +msgstr "ngày" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "Vô hiệu hóa" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" -msgstr "Vô hiệu hóa" +msgstr "Đã vô hiệu hóa" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "Bộ điều khiển mặc didinhj" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "Driver mặc định (%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" -msgstr "" +msgstr "ví dụ: --proxy 10.10.10.10" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:68 msgid "e.g: dump" -msgstr "" +msgstr "ví dụ: dump" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "đã kích hoạt" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "mỗi %ds" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "Hết hạn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" -msgstr "" +msgstr "ép buộc" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:85 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:196 @@ -9579,33 +11171,33 @@ msgstr "" msgid "forward" msgstr "Chuyển tiếp" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" -msgstr "" +msgstr "toàn phạm vi" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" -msgstr "" +msgstr "bán phạm vi" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "Giá trị mã hóa thập lục phân" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" -msgstr "" +msgstr "ẩn" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:74 msgctxt "nft unit" msgid "hour" -msgstr "" +msgstr "giờ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "Chế độ lai" @@ -9613,11 +11205,15 @@ msgstr "Chế độ lai" msgid "ignore" msgstr "Từ chối" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 msgid "input" -msgstr "" +msgstr "đầu vào" #: modules/luci-base/htdocs/luci-static/resources/validation.js:410 msgid "key between 8 and 63 characters" @@ -9627,47 +11223,63 @@ msgstr "Mật khẩu từ 8 đến 63 ký tự" msgid "key with either 5 or 13 characters" msgstr "Mật khẩu có 5 hoặc 13 ký tự" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 -msgid "managed config (M)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 +msgid "managed config (M)" +msgstr "cấu hình quản lý (M)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "Độ mạnh vừa phải" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:75 msgctxt "nft unit" msgid "minute" -msgstr "" +msgstr "phút" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" -msgstr "Phút" +msgstr "phút" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" -msgstr "" +msgstr "thiết bị di động chủ (H)" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:423 msgid "netif_carrier_ok()" -msgstr "" +msgstr "netif_carrier_ok()" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 msgid "no" msgstr "Không" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "Không có liên kết" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "không ghi đè" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "Giá trị không rỗng" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "không" @@ -9678,36 +11290,40 @@ msgid "not present" msgstr "Không có sẵn" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" -msgstr "Tắt" +msgstr "tắt" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" -msgstr "" +msgstr "trên tiền tố có sẵn" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "Mở mạng" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" -msgstr "" +msgstr "cấu hình khác (O)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 msgid "output" -msgstr "" +msgstr "đầu ra" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "hơn một ngày trước" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" -msgstr "" +msgstr "gói tin" #: modules/luci-base/htdocs/luci-static/resources/validation.js:252 msgid "positive decimal value" -msgstr "" +msgstr "giá trị thập phân dương" #: modules/luci-base/htdocs/luci-static/resources/validation.js:244 msgid "positive integer value" @@ -9717,31 +11333,42 @@ msgstr "Giá trị thập phân dương" msgid "random" msgstr "Ngẫu nhiên" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 -msgid "relay mode" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "Đã tạo ngẫu nhiên" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" msgstr "" +"giảm thiểu overhead bằng cách thu thập và tổng hợp các thông điệp gốc trong " +"một gói tin duy nhất thay vì nhiều gói nhỏ" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 +msgid "relay mode" +msgstr "chế độ chuyển tiếp" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "Định tuyến" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "Giây" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "Chế độ máy chủ" #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:54 msgid "sstpc Log-level" -msgstr "" +msgstr "mức độ ghi nhật ký sstpc" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "Mật khẩu mạnh" @@ -9749,7 +11376,7 @@ msgstr "Mật khẩu mạnh" msgid "tagged" msgstr "Đã được gắn thẻ" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "đơn bị thời gian (TÚ / 1.024 ms) [1000-65535]" @@ -9759,26 +11386,31 @@ msgid "" "HTTPS network " "access." msgstr "" +"uHTTPd cung cấp truy cập mạng HTTP hoặc HTTPS." -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "Giá trị độc nhất" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "Không xác định" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "phiên bản không xác định" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" -msgstr "Không giới hạn" +msgstr "không giới hạn" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9789,19 +11421,19 @@ msgstr "Không giới hạn" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:53 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:38 msgid "unspecified" -msgstr "Không được phân loại" +msgstr "không xác định" #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:71 msgid "unspecified -or- create:" -msgstr "Chưa được phân loại hoặc tạo" +msgstr "Chưa được phân loại hoặc tạo:" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:352 msgid "untagged" msgstr "Chưa được gắn thẻ" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "Địa chỉ IP hợp lệ" @@ -9814,7 +11446,7 @@ msgid "valid IPv4 CIDR" msgstr "IPv4 CIDR hợp lệ" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "Địa chỉ IPv4 hợp lệ" @@ -9843,7 +11475,7 @@ msgid "valid IPv6 CIDR" msgstr "IPv6 CIDR hợp lệ" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "Địa chỉ IPv6 hợp lệ" @@ -9880,8 +11512,8 @@ msgstr "Định danh UCI, tên máy chủ hoặc địa chỉ IP hợp lệ" msgid "valid address:port" msgstr "Địa-chỉ:cổng hợp lệ" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "Ngày hợp lệ (YYYY-MM-DD)" @@ -9919,13 +11551,25 @@ msgstr "Giá trị nguyên hợp lệ" #: modules/luci-base/htdocs/luci-static/resources/validation.js:355 msgid "valid multicast MAC address" +msgstr "địa chỉ MAC đa điểm hợp lệ" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" msgstr "" +"tên thiết bị mạng hợp lệ từ 1 đến 15 ký tự không chứa \":\", \"/\", \"%\" " +"hoặc khoảng trắng" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "tên thiết bị mạng hợp lệ, không phải là \".\" hoặc \"..\"" #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "Mạng trong địa chỉ/netmask hợp lệ" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "Số điện thoại hợp lệ (0-9, \"*\", \"#\", \"!\" or \".\")" @@ -9935,54 +11579,54 @@ msgid "valid port or port range (port1-port2)" msgstr "Cổng hoặc tầm cổng hợp lệ (Cổng 1- Cổng 2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "Giá trị cổng hợp lệ" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "Thời gian hợp lệ (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" -msgstr "" +msgstr "giá trị từ %d đến %d ký tự" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "Giá trị giữa %f và %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "Giá trị lớn hơn hoặc bằng %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "Giá trị nhỏ hơn hoặc bằng %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "giá trị với %d ký tự" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "giá trị với ít nhất %d ký tự" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "giá trị với tối đa %d ký tự" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "Mật khẩu yếu" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:72 msgctxt "nft unit" msgid "week" -msgstr "" +msgstr "tuần" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 msgid "yes" -msgstr "Có" +msgstr "có" #: modules/luci-compat/luasrc/view/cbi/delegator.htm:20 msgid "« Back" diff --git a/package/luci/modules/luci-base/po/zh_Hans/base.po b/package/luci/modules/luci-base/po/zh_Hans/base.po index 83f02be557..eb3d371ba9 100644 --- a/package/luci/modules/luci-base/po/zh_Hans/base.po +++ b/package/luci/modules/luci-base/po/zh_Hans/base.po @@ -4,33 +4,49 @@ # msgid "" msgstr "" -"PO-Revision-Date: 2022-11-23 11:36+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2023-10-27 22:04+0000\n" +"Last-Translator: Zheng Qian \n" "Language-Team: Chinese (Simplified) \n" +"librecmc/luci/zh_Hans/>\n" "Language: zh_Hans\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.2-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "!known(未知)" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" 表 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f dB" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d Bit" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d 个无效字段" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d小时前" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d分钟前" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d秒前" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s 在多个 VLAN 中均未标记!" @@ -55,10 +71,11 @@ msgstr "(空)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(没有接口连接)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ 另外 %d" @@ -68,19 +85,19 @@ msgid "-- Additional Field --" msgstr "-- 更多选项 --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- 请选择 --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- 自定义 --" @@ -106,7 +123,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = 不使用 RSSI 阈值,1 = 驱动默认值" @@ -119,12 +136,17 @@ msgstr "1" msgid "1 Minute Load:" msgstr "1 分钟负载:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "%d 个标记" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "12h(12 小时 - 默认)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "15 分钟负载:" @@ -139,12 +161,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "3h(3 小时)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4 字符的十六进制 ID" @@ -157,43 +184,98 @@ msgstr "464XLAT(CLAT)" msgid "5 Minute Load:" msgstr "5 分钟负载:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "5m(5 分钟)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "十六进制表示的 6 字节标识符,无冒号分隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "7d(7 天)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k: 通过无线电测量启用信标报告。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k: 通过无线电测量启用邻居报告。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r 快速切换" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v: BSS 最长空闲时间。 单位:秒。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v: 基础服务集合(BSS)过渡管理。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v: 管理帧中的本地时区公告。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "802.11v: 代理 ARP 允许非 AP STA 在 power-save 中停留更长时间。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v: 管理帧中的时间公告。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "802.11v: 无线网络管理(WNM)休眠模式(站点扩展休眠模式)。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "802.11v: 无线网络管理(WNM)睡眠模式修复:防止重装攻击。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w 关联 SA 查询最大超时" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11w 关联 SA 查询重试超时" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w 管理帧保护" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w 最大超时" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w 重试超时" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "BSSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "ESSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4 子网掩码" @@ -205,30 +287,45 @@ msgstr "LED 配置" msgid "LED Name" msgstr "LED 名称" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP 代理" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA 标记" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA 跳数限制" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA 生命周期" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA 服务" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ 匹配任何域名。/example.com/ 返回 NXDOMAIN。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# 对 example.com 及其子域名返回无效地址 " +"(0.0.0.0 和 ::) 。" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" @@ -274,11 +371,22 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s 不在 %s 集合中" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"batman-adv 节点可以运行于在服务器模式(与 Mesh 共享其 Internet 连接)或客户端" +"模式(在 Mesh 中搜索最合适的 Internet 连接)或完全关闭网关支持(这是默认设" +"置)。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "设备 “%s” 的配置已存在" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "已存在同名的目录。" @@ -286,25 +394,90 @@ msgstr "已存在同名的目录。" msgid "A new login is required since the authentication session expired." msgstr "由于身份验证会话已过期,需要重新登录。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "ADSL (G.992.1) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "ADSL (G.992.1) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "ADSL (所有变体) Annex A/L/M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "ADSL (所有变体) Annex A/L/M + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "ADSL (所有变体) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "ADSL (所有变体) Annex B + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "ADSL (所有变体) Annex B/J" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "ADSL (所有变体) Annex B/J + VDSL2 Annex A/B/C" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "ADSL (所有变体) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "ADSL2 (G.992.3) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "ADSL2 (G.992.3) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "ADSL2 (G.992.3) Annex L" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "ADSL2 (G.992.3) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "ADSL2+ (G.992.5) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "ADSL2+ (G.992.5) Annex B" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "ADSL2+ (G.992.5) Annex M" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -337,29 +510,39 @@ msgstr "ARP 监控不被当前策略支持!" msgid "ARP retry threshold" msgstr "ARP 重试阈值" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "ARP 流量表 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"带组播目的地 MAC 的ARP、IPv4 和 IPv6(甚至 802.1Q)是对 STA MAC 地址的单播。" +"注意:这不是 802.11v 中的定向多播服务(DMS)。注意:可能会破坏接收端 STA 多播" +"预期。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM(异步传输模式)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM 网桥" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM 虚拟通道标识(VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM 虚拟路径标识(VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -368,26 +551,22 @@ msgstr "" "ATM 桥是以 AAL5 协议封装以太网的虚拟 Linux 网桥,可与 DHCP 或 PPP 一同使用来" "连接到运营商网络。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM 设备号码" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C 系统供应商 ID" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "接口缺失" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "仅在网卡所属的子网中提供 DNS 服务。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "接受本地连接" @@ -396,7 +575,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "接受数据包" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "接受具有本地源地址的数据包" @@ -404,16 +583,25 @@ msgstr "接受具有本地源地址的数据包" msgid "Access Concentrator" msgstr "接入集中器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "接入点 AP" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "接入点隔离" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "访问技术" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "操作" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "活跃" @@ -451,8 +639,8 @@ msgstr "活跃的 IPv6 规则" msgid "Active-Backup policy (active-backup, 1)" msgstr "活动备份策略(active-backup,1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "点对点 Ad-Hoc" @@ -469,18 +657,18 @@ msgstr "自适应传输负载均衡(balance-tlb,5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" -msgstr "新增" +msgstr "添加" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "添加 ATM 网桥" @@ -500,11 +688,11 @@ msgstr "添加 LED 事件" msgid "Add VLAN" msgstr "添加 VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "添加设备配置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "添加设备配置…" @@ -512,18 +700,18 @@ msgstr "添加设备配置…" msgid "Add instance" msgstr "添加实例" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "添加密钥" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "添加本地域名后缀到 HOSTS 文件中的域名。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "添加新接口…" @@ -531,6 +719,10 @@ msgstr "添加新接口…" msgid "Add peer" msgstr "添加对端" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "为此主机添加静态转发和反向 DNS 条目。" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "添加到黑名单" @@ -539,11 +731,11 @@ msgstr "添加到黑名单" msgid "Add to Whitelist" msgstr "添加到白名单" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "额外的 HOSTS 文件" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "额外的 SERVERS 文件" @@ -560,7 +752,11 @@ msgstr "额外的 SERVERS 文件" msgid "Address" msgstr "地址" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "“中继来源”和“中继目标地址”的地址族必须相匹配。" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "地址族" @@ -573,7 +769,7 @@ msgstr "地址设置无效" msgid "Address to access local relay bridge" msgstr "接入本地中继桥的地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "地址" @@ -582,29 +778,29 @@ msgstr "地址" msgid "Administration" msgstr "管理权" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "高级设置" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "高级设备选项" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "老化时间" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "总发射功率(ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "聚合发起者消息" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -644,17 +840,17 @@ msgstr "接口别名" msgid "Alias of \"%s\"" msgstr "“%s”的别名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "所有服务器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "从最低可用地址开始顺序分配 IP 地址。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "顺序分配 IP" @@ -662,11 +858,11 @@ msgstr "顺序分配 IP" msgid "Allow SSH password authentication" msgstr "允许 SSH 密码验证" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "允许 AP 模式时在低 ACK 应答的情况下断开无线终端" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "仅允许列表外" @@ -674,15 +870,15 @@ msgstr "仅允许列表外" msgid "Allow full UCI access for legacy applications" msgstr "对于旧版应用,允许完全的 UCI 访问权限" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "允许使用旧的 802.11b 速率" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "仅允许列表内" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "允许本机" @@ -703,19 +899,24 @@ msgid "Allow system feature probing" msgstr "允许系统功能探测" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "允许 root 用户凭密码登录" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "允许的 IP" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "允许的网络技术" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "AllowedIPs 设置无效" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "始终" @@ -727,21 +928,25 @@ msgstr "始终关闭(kernel:none)" msgid "Always on (kernel: default-on)" msgstr "始终开启(kernel:default-on)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "始终发送 DHCP 选项。 有时需要,例如 PXELinux。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" "即使辅助信道重叠,也始终使用 40MHz 信道。使用此选项不符合 IEEE 802.11n-2009!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "要发送的重复地址检测探针数量" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "等待调制解调器准备就绪的秒数" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "保存表单时出错:" @@ -750,78 +955,29 @@ msgstr "保存表单时出错:" msgid "An optional, short description for this device" msgstr "此设备的可选简短描述" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "Annex" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "Annex A + L + M(全部)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "Annex A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "Annex A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "Annex A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "Annex A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "Annex B(全部)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "Annex B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "Annex B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "Annex B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "Annex J(全部)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "Annex L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "Annex M(全部)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "Annex M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "Annex M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" +"在 RA(Router Advertisement)消息" +"中宣布 NAT64 前缀。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "通告该设备为 IPv6 DNS 服务器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "如果存在本地 IPv6 默认路由,则通告此设备为默认路由器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -829,21 +985,21 @@ msgstr "" "如果公共 IPv6 前缀可用,则通告此设备为默认路由器,而不考虑本地默认路由的可用" "性。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "通告该设备为默认路由器,不管是否有前缀或默认路由。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "通告的 DNS 域名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "通告的 IPv6 DNS 服务器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "匿名身份" @@ -855,7 +1011,7 @@ msgstr "自动挂载未配置的磁盘分区" msgid "Anonymous Swap" msgstr "自动挂载未配置的 Swap 分区" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "任意数据包" @@ -867,11 +1023,11 @@ msgstr "任意数据包" msgid "Any zone" msgstr "任意区域" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "将 DHCP 选项应用到此网络。(Empty = 所有客户端)。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "应用并保留设置" @@ -879,44 +1035,48 @@ msgstr "应用并保留设置" msgid "Apply backup?" msgstr "应用备份?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "应用请求失败,状态 %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "强制应用" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "连接丢失后应用还原" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "正在等待配置被应用… %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "架构" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Arp 扫描" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "将每个公共 IPv6 前缀的给定长度部分分配给此接口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "给此条目分配新的、自由形态的标签。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "将此十六进制子 ID 前缀分配给此接口。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "已连接站点" @@ -925,16 +1085,16 @@ msgstr "已连接站点" msgid "Associations" msgstr "关联数" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" "至少 %h 每 %h, %h 突发" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -945,25 +1105,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "尝试为连接的设备启用已配置的挂载点" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "认证组" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "身份验证" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "身份验证类型" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "唯一授权" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "需要授权" @@ -971,7 +1132,9 @@ msgstr "需要授权" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -989,7 +1152,7 @@ msgstr "自动家庭网络(HNCP)" msgid "Automatically check filesystem for errors before mounting" msgstr "在挂载前自动检查文件系统错误" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1011,6 +1174,10 @@ msgstr "自动挂载磁盘" msgid "Automount Swap" msgstr "自动挂载交换分区" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "可用" @@ -1029,11 +1196,15 @@ msgstr "可用" msgid "Average:" msgstr "平均:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "避免网桥回环" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1041,15 +1212,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "BSS 过渡" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "返回" @@ -1058,11 +1233,7 @@ msgstr "返回" msgid "Back to Overview" msgstr "返回至概览" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "返回至配置" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "返回 peer 配置" @@ -1075,16 +1246,15 @@ msgid "Backup / Flash Firmware" msgstr "备份与升级" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "文件备份列表" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "带宽" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "基设备" @@ -1092,12 +1262,39 @@ msgstr "基设备" msgid "Base64-encoded public key of this interface for sharing." msgstr "此接口用于共享的 Base64 编码的公钥。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Batman 设备" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Batman 接口" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv 内置 2 层分段,用于流经网格的单播数据,这允许在不允许将 MTU 增加到" +"超过 1500 字节的标准以太网数据包大小的接口/连接上运行 batman-adv。启用分段" +"后,batman-adv 将自动对过大数据包进行分段并在另一端对它们去分段。 该功能默认" +"处于启用状态,但如数据包大小适合则该功能不活跃,但不可以完全停用该功能。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "信标间隔" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "信标报告" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1110,7 +1307,7 @@ msgstr "" msgid "Bind NTP server" msgstr "绑定 NTP 服务器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "动态绑定到接口而不是通配符地址。" @@ -1119,18 +1316,31 @@ msgstr "动态绑定到接口而不是通配符地址。" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "绑定接口" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "绑定服务记录到域名:指定服务的位置。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "绑定服务记录到域名:指定服务的位置。见 RFC2782。" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1140,67 +1350,79 @@ msgstr "将隧道绑定到此接口(可选)。" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:171 msgid "Bitrate" -msgstr "速率" +msgstr "比特率" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "绑定模式" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "绑定策略" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "“中继来源”和“中继目标地址”都需要指定。" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "桥接" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "桥接(允许 MAC VLAN 间直接通信)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "网桥 VLAN 过滤" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "网桥设备" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "网桥端口特定选项" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "网桥端口" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" msgstr "网桥流量表 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "桥接号" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "允许启动空网桥" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "开机自动运行" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "即使没有接口附加到网桥,也启动它" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "广播" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "广播策略(broadcast,3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "浏览…" @@ -1208,14 +1430,36 @@ msgstr "浏览…" msgid "Buffered" msgstr "已缓冲" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "CA 证书(PEM 编码;而不是使用系统范围的存储来验证网关证书。" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "CA 证书,如果留空,则证书将在第一次连接后被保存。" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "CHAP" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "CLAT 配置失败" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "CNAME" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "CNAME 或 fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "CNI(外部管理的接口)" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "CPU 使用率(%)" @@ -1230,18 +1474,23 @@ msgstr "已缓存" msgid "Call failed" msgstr "调用失败" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "如果你的 ISP 有 IPv6 名称服务器但不提供 IPv6 路由,本选项可能会有用。" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "取消" @@ -1249,32 +1498,32 @@ msgstr "取消" msgid "Cannot parse configuration: %s" msgstr "无法解析配置:%s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "捕获发送到其他主机的传入数据包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "在任何路由决策前捕获传入数据包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "捕获路由到本地系统的传入数据包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "在任何路由决策后捕获传出数据包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "捕获源自本地系统的传出数据包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "在 NIC 接收到数据包后直接捕获它们" @@ -1283,24 +1532,32 @@ msgstr "在 NIC 接收到数据包后直接捕获它们" msgid "Category" msgstr "分类" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "蜂窝网络 ID" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "蜂窝网络位置" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "证书约束(域)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "证书约束(SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "证书约束(主题)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "证书约束(通配符)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1308,22 +1565,22 @@ msgstr "" "证书约束子字符串 - 例如:/CN=wifi.mycompany.com
    请参阅握手期间“logread -" "f”的实际值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "针对 DNS SAN 值(如果可用)的证书约束
    或主题 CN(严格匹配)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "针对 DNS SAN 值(如果可用)的证书约束
    或主题 CN(后缀匹配)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1337,16 +1594,16 @@ msgstr "" msgid "Chain" msgstr "链" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "链钩 \"%h\"" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "更改数" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "更改已恢复。" @@ -1357,18 +1614,19 @@ msgstr "更改访问设备的管理员密码" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "信道" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "信道分析" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "信道宽度" @@ -1376,7 +1634,7 @@ msgstr "信道宽度" msgid "Check filesystems before mount" msgstr "在挂载前检查文件系统" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "选中此选项以从无线中删除现有网络。" @@ -1393,8 +1651,8 @@ msgstr "正在检查镜像…" msgid "Choose mtdblock" msgstr "选择 mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1404,13 +1662,13 @@ msgstr "" "为此接口分配所属的防火墙区域,选择未指定可将该接口移出已关联的区域," "或者填写创建栏来创建一个新的区域,并将当前接口与之建立关联。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." msgstr "选择指派到此无线接口的网络,或者填写创建栏来新建网络。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "算法" @@ -1432,9 +1690,10 @@ msgstr "" "点击“保存 mtdblock”以下载指定的 mtdblock 分区文件。(注意:此功能适用于专业人" "士!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "客户端" @@ -1443,9 +1702,9 @@ msgstr "客户端" msgid "Client ID to send when requesting DHCP" msgstr "请求 DHCP 时发送的客户端 ID" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "关闭" @@ -1460,20 +1719,20 @@ msgid "" "persist connection" msgstr "在给定时间(秒)后关闭非活动链接,0 为保持连接" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "关闭列表…" - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "正在收集数据…" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "发现冲突" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "命令" @@ -1488,9 +1747,9 @@ msgstr "命令执行失败" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:73 msgid "Comment" -msgstr "备注" +msgstr "注释" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1512,29 +1771,28 @@ msgstr "计算传出校验和(可选)。" msgid "Config File" msgstr "配置文件" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "配置" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "配置文件导出" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "配置已应用。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "配置已回滚!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "配置失败" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1549,28 +1807,28 @@ msgstr "" "Mbps 速率。Very High(非常高):配置 24 Mbps 为基础速率,不提供低于最低基础速" "率的支持速率。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "配置 RA 消息中的默认路由器通告。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "配置此接口上 RA 服务的操作模式。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "配置此接口上 DHCPv6 服务的操作模式。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "配置此接口上 NDP 代理服务的操作模式。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "配置…" @@ -1582,9 +1840,10 @@ msgstr "确认断开连接" msgid "Confirmation" msgstr "确认密码" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "已连接" @@ -1594,11 +1853,11 @@ msgstr "已连接" msgid "Connection attempt failed" msgstr "尝试连接失败" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "尝试连接失败。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "连接端点" @@ -1610,7 +1869,7 @@ msgstr "失去连接" msgid "Connections" msgstr "连接" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "连接更改" @@ -1638,9 +1897,9 @@ msgstr "当任一 ARP IP 目标可达时认为从属设备在线(any,0)" msgid "Contents have been saved." msgstr "内容已保存。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1651,16 +1910,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "在 %h 继续" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" -msgstr "在呼叫链中继续" +msgstr "在原链中继续" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "继续处理不匹配的数据包" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1673,20 +1932,20 @@ msgstr "" msgid "Country" msgstr "国家" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "国家代码" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "无线信号覆盖密度" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "创建/分配防火墙区域" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "创建接口" @@ -1698,7 +1957,7 @@ msgstr "致命错误" msgid "Cron Log Level" msgstr "Cron 日志级别" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "当前功率" @@ -1738,31 +1997,31 @@ msgid "" "Diode\">LED
    s if possible." msgstr "自定义此设备的 LED 行为。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "DAD 传输" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE 客户端" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE 端口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAE 密文" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "DHCP 选项" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP 服务器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP/DNS" @@ -1773,16 +2032,22 @@ msgstr "DHCP/DNS" msgid "DHCP client" msgstr "DHCP 客户端" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP 选项" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "DHCPv4 租约 被用作 IPv6 前缀的限制和首选有效期。" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6 客户端" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6 服务" @@ -1794,27 +2059,27 @@ msgstr "DHCPv6 服务" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "DNS 转发" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" -msgstr "DNS 查询端口" +msgstr "DNS 查询端口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "DNS 搜索域名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" -msgstr "DNS 服务器端口" +msgstr "DNS 服务器端口" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:292 msgid "DNS setting is invalid" msgstr "DNS 设置无效" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "DNS 权重" @@ -1822,11 +2087,11 @@ msgstr "DNS 权重" msgid "DNS-Label / FQDN" msgstr "DNS-标签/FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "DNSSEC 检查未签名" @@ -1838,39 +2103,47 @@ msgstr "DPD 空闲超时" msgid "DS-Lite AFTR address" msgstr "DS-Lite AFTR 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" msgstr "DSL" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" msgstr "DSL 状态" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "DSL 线路模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "DTIM 间隔" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "数据速率" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "已接收" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "已发送" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "调试" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "默认路由器" @@ -1878,7 +2151,7 @@ msgstr "默认路由器" msgid "Default state" msgstr "默认状态" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1887,61 +2160,62 @@ msgstr "" "设置 DHCP 的附加选项,例如设定“6,192.168.2.1,192.168.2.2”表示通" "告不同的 DNS 服务器给客户端。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "定义用于传出帧的 Linux 内部数据包优先级到 VLAN 标头优先级的映射" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "定义在传入帧上 VLAN 标头优先级到 Linux 内部数据包优先级的映射" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "为此路由定义一个特定的 MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "委托 IPv6 前缀" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "删除" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "删除密钥" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "删除请求失败:%s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "删除此网络" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "发送流量指示消息间隔" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "描述" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "取消" @@ -1949,11 +2223,11 @@ msgstr "取消" msgid "Design" msgstr "主题" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "指定的主接口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1988,9 +2262,9 @@ msgstr "目标区域" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2000,36 +2274,40 @@ msgstr "目标区域" msgid "Device" msgstr "设备" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "设备配置" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "设备识别符" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "设备未激活" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "设备正在重启…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "设备名" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "设备不受 ModemManager 管理。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "设备不存在" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "设备类型" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "无法连接到设备!" @@ -2037,31 +2315,31 @@ msgstr "无法连接到设备!" msgid "Device unreachable! Still waiting for device..." msgstr "设备无法访问。仍在等待设备……" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "设备" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "网络诊断" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "拨号号码" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "目录" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "禁用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2076,20 +2354,24 @@ msgstr "禁用 DNS 查找" msgid "Disable Encryption" msgstr "禁用加密" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "禁用不活动轮询" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "禁用此网络" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2098,33 +2380,32 @@ msgstr "禁用此网络" msgid "Disabled" msgstr "已禁用" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "已禁用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "在低 Ack 应答时断开连接" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "丢弃包含 RFC1918 地址的上游响应。" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "断开" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "尝试断开连接失败" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "尝试断开连接失败。" @@ -2134,23 +2415,37 @@ msgstr "磁盘空间" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "关闭" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "距离优化" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "最远网络用户的距离(米)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "分布式 ARP 表" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" +"此 DHCP 主机部分所绑定的 Dnsmasq 实例。如未指定,此部分对所有 dnsmasq 实例均" +"有效。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2158,7 +2453,7 @@ msgstr "" "此引导部分绑定到的 Dnsmasq 实例。 如果未指定,该部分对所有 dnsmasq 实例都有" "效。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP服务器和DNS 转发器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "不缓存无用的回应,例如:不存在的域名。" @@ -2179,32 +2474,23 @@ msgstr "不缓存无用的回应,例如:不存在的域名。" msgid "Do not create host route to peer (optional)." msgstr "不创建到对端的主机路由(可选)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "不转发没有点或域名部分的 DNS 查询。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "不转发公共域名服务器无法回应的请求。" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "不转发本地网络的反向查询。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "不监听这些接口。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "不在此接口上提供 DHCPv6 服务。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "不参与" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2214,7 +2500,7 @@ msgstr "不代理任何 NDP 数据包 msgid "Do not send a hostname" msgstr "不发送主机名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2222,11 +2508,11 @@ msgstr "" "不在此接口上发送任何 RA 消" "息。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "您确定要删除“%s”吗?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "您确定要删除以下 SSH 密钥吗?" @@ -2234,11 +2520,11 @@ msgstr "您确定要删除以下 SSH 密钥吗?" msgid "Do you really want to erase all settings?" msgstr "您确定要清除所有设置吗?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "您确定要删除目录“%s”吗?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "是否要替换当前的 PSK?" @@ -2246,15 +2532,17 @@ msgstr "是否要替换当前的 PSK?" msgid "Do you want to replace the current keys?" msgstr "是否要替换当前密钥?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "域名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "忽略空域名解析" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "域名白名单" @@ -2280,11 +2568,11 @@ msgstr "下载备份" msgid "Download mtdblock" msgstr "下载 mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "下游 SNR 偏移" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2298,16 +2586,58 @@ msgstr "拖动以重排" msgid "Drop Duplicate Frames" msgstr "丢弃重复帧" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" +"丢弃所有不必要的 ARP 帧,如果网络上有一个已知的好的ARP代理并且这样的帧无需使" +"用或者就 802.11 而言,不准使用这样的帧以防止攻击。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" +"丢弃所有不请自来的邻居广播,如果网络上有已知的好的 NA 代理并且这样的帧无需使" +"用或者就 802.11 而言不准使用它们以防止攻击。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "丢弃不必要的 ARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "丢弃包含 IPv4 单播数据包的 layer 2多播帧。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "丢弃包含 IPv6 单播数据包的 layer 2多播帧。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "丢弃嵌套的 IPv4 单播" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "丢弃嵌套的 IPv6 单播" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "丢弃数据包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "丢弃不匹配的数据包" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "丢弃不请自来的 NA" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbear 实例" @@ -2325,19 +2655,19 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "轻型双栈(RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "动态 DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "动态授权扩展客户端。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "动态授权扩展端口。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "动态授权扩展 secret。" @@ -2345,28 +2675,40 @@ msgstr "动态授权扩展 secret。" msgid "Dynamic tunnel" msgstr "动态隧道" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "" "为所有客户端提供 DHCP 服务。如果禁用,将只对具有静态租约的客户端提供服务。" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "如 br-vlan 或 brvlan。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "如,eth0, eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "EA-bits 长度" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "EAP 类型" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "每个 STA 被分配了自己的 AP_VLAN 接口。" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "编辑" @@ -2374,17 +2716,21 @@ msgstr "编辑" msgid "Edit peer" msgstr "编辑对端" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "编辑静态租约" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "编辑上方的原始配置数据来修复错误,点击“保存”按钮以重新载入此页面。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "编辑此网络" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "编辑无线网络" @@ -2393,54 +2739,44 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "有效的路由 MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "出口 QoS 映射" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "出口设备 ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "出口设备的名称" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "已标记的出口" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "未标记的出口" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "紧急" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "启用" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "启用/禁用对端。重启 Wireguard 端口应用更改。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "启用 IGMP 嗅探" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "启用 STP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "启用 SLAAC" @@ -2458,10 +2794,11 @@ msgstr "启用流的动态调整" msgid "Enable HE.net dynamic endpoint update" msgstr "启用 HE.net 动态终端更新" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "启用 IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "启用 IPv6 协商" @@ -2475,11 +2812,15 @@ msgstr "启用 IPv6 协商" msgid "Enable IPv6 negotiation on the PPP link" msgstr "在 PPP 链路上启用 IPv6 协商" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "启用 IPv6 段路由" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "启用巨型帧透传" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "启用 MAC 地址学习" @@ -2491,11 +2832,11 @@ msgstr "启用 NTP 客户端" msgid "Enable Single DES" msgstr "启用单个 DES" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "启用 TFTP 服务器" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "启用 VLAN 过滤" @@ -2503,7 +2844,7 @@ msgstr "启用 VLAN 过滤" msgid "Enable VLAN functionality" msgstr "启用 VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "启用 WPS 一键加密按钮,需要 WPA(2)-PSK/WPA3-SAE" @@ -2516,12 +2857,12 @@ msgstr "" "允许自动将HTTP请求重定向至" "HTTPS端口。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "启用此接口上可用的 IPv6 前缀的下游委托" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "启用密钥重新安装(KRACK)对策" @@ -2537,24 +2878,24 @@ msgstr "启用流入数据包镜像" msgid "Enable mirroring of outgoing packets" msgstr "启用流出数据包镜像" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "启用多播快速离开" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "启用多播查询器" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "启用多播支持" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "启用所有 CPU 的数据包控制。可能有助于或阻碍网络速度。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "启用混杂模式" @@ -2576,11 +2917,11 @@ msgstr "启用多播传输支持(可选)。" msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "启用后报文的 DF(禁止分片)标志。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "启用内置的单实例 TFTP 服务器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "启用此网络" @@ -2589,27 +2930,36 @@ msgstr "启用此网络" msgid "Enable tx checksum" msgstr "启用 Tx 校验" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "启用单播泛洪" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" -msgstr "已启用" +msgstr "启用" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "在此网桥上启用 IGMP 窥探" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "启用属于同一移动域接入点之间的快速漫游" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "在 batman-adv 中启用更高效、分组感知的多播转发基础架构。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "在此网桥上启用生成树协议" @@ -2617,24 +2967,29 @@ msgstr "在此网桥上启用生成树协议" msgid "Encapsulation limit" msgstr "封装限制" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "封装模式" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "加密" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "传输端点" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "端点主机" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "端点端口" @@ -2642,23 +2997,23 @@ msgstr "端点端口" msgid "Endpoint setting is invalid" msgstr "端点设置无效" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "强制 IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "强制 IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "强制 IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "强制 MLD 版本 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "强制 MLD 版本 2" @@ -2687,10 +3042,6 @@ msgstr "错误" msgid "Error getting PublicKey" msgstr "获取公钥时出错" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "错误秒数(ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2709,11 +3060,17 @@ msgstr "每 30 秒(slow,0)" msgid "Every second (fast, 1)" msgstr "每秒(fast,1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "排除接口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "执行各种网络命令以检查到其他系统的连接和名称解析。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2721,27 +3078,35 @@ msgstr "" "将 127.0.0.0/8和::1排除在重新绑定检查外,比如实时黑" "名单列表服务。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "现有设备" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "扩展 HOSTS 文件中的主机后缀" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "预期的端口号。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "请输入一个十六进制值" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "请输入有效的 IPv4 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "请输入有效的 IPv6 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "预期的是一个有效的 MAC 地址,可以包括通配符" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "请输入用冒号分隔的两个优先级" @@ -2750,11 +3115,11 @@ msgstr "请输入用冒号分隔的两个优先级" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "请输入:%s" @@ -2766,7 +3131,7 @@ msgstr "请输入非空值" msgid "Expires" msgstr "到期时间" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "租约地址的有效期,最短 2 分钟(2m)。" @@ -2775,13 +3140,13 @@ msgstr "租约地址的有效期,最短 2 分钟(2m)。" msgid "External" msgstr "外部" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" -msgstr "外部 R0KH 列表" +msgstr "外部 R0 密钥持有者列表" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" -msgstr "外部 R1KH 列表" +msgstr "外部 R1 密钥持有者列表" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167 msgid "External system log server" @@ -2807,35 +3172,63 @@ msgstr "额外的 pppd 选项" msgid "Extra sstpc options" msgstr "额外的 sstpc 选项" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT over DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT over the Air" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "FT 协议" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "失败原因" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "更改系统密码失败。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "配置调制解调器失败" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "在 %d 秒内确认应用失败,等待回滚…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "连接失败" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "断开连接失败" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "执行“/etc/init.d/%s %s”失败:%s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "获取调制解调器信息失败" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "初始化调制解调器失败" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "设置操作模式失败" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "文件" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2843,24 +3236,24 @@ msgstr "" "列出上游解析器的文件,可以特定于域名,比如 server=1.2.3.4," "server=/domain/1.2.3.4。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "文件无法访问" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "存储 DHCP 租约信息的文件。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "上游解析器文件。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "文件名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "向客户端发布的引导映像文件名。" @@ -2869,14 +3262,22 @@ msgstr "向客户端发布的引导映像文件名。" msgid "Filesystem" msgstr "文件系统" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "过滤 IPv4 A 记录" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "过滤 IPv6 AAAA 记录" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "过滤 SRV/SOA 服务发现" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "过滤本地包" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "过滤无用包" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "筛选所有从属设备,不进行验证" @@ -2889,8 +3290,13 @@ msgstr "筛选所有从属设备,仅验证活动的从属设备" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "筛选所有从属设备,仅验证备份的从属设备" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "过滤 SRV/SOA 服务发现避免触发按需拨号(dial-on-demand)链接。" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "最终确认失败" @@ -2901,7 +3307,7 @@ msgid "" msgstr "" "查找当前系统上的所有文件系统和交换分区,并根据查找结果生成并替换现有配置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "搜索并加入网络" @@ -2915,10 +3321,11 @@ msgid "Firewall" msgstr "防火墙" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "防火墙标识" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "防火墙设置" @@ -2926,19 +3333,19 @@ msgstr "防火墙设置" msgid "Firewall Status" msgstr "防火墙状态" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "防火墙标志" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "固件文件" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "固件版本" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "出站 DNS 查询的固定源端口。" @@ -2964,40 +3371,48 @@ msgstr "刷写操作" msgid "Flashing…" msgstr "正在刷写…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "遵守 IPv4 有效期" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "强制" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "强制 40MHz 模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "强制 CCMP(AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "即使检测到另一台服务器,也要强制使用此网络上的 DHCP。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "强制 IGMP 版本" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "强制 MLD 版本" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "强制 TKIP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "强制 TKIP 和 CCMP(AES)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "强制广播 DHCP 响应。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "强制链路" @@ -3009,11 +3424,11 @@ msgstr "强制升级" msgid "Force use of NAT-T" msgstr "强制使用 NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "表单令牌不匹配" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NS 和 NA 消息。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3037,37 +3452,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "转发 DHCP 数据包" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "在指定的主接口和下游接口之间转发 DHCPv6 消息。" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "前向纠错秒数(FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "转发广播数据包" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "转发延迟" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "转发 mesh 节点数据包" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "在此设备上将多播数据包转发为单播数据包。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "转发/反向 DNS" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "转发模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "分段" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "分片阈值" @@ -3091,7 +3510,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "仅 GPRS" @@ -3111,12 +3530,16 @@ msgstr "承载于 IPv4 上的 GRETAP 通道" msgid "GRETAP tunnel over IPv6" msgstr "承载于 IPv6 上的 GRETAP 通道" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "网关" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "网关模式" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "网关端口" @@ -3126,23 +3549,23 @@ msgstr "网关端口" msgid "Gateway address is invalid" msgstr "网关地址无效" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "常规设置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "常规设置" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "常规设备选项" @@ -3150,7 +3573,7 @@ msgstr "常规设备选项" msgid "Generate Config" msgstr "生成配置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "本地生成 PMK" @@ -3158,11 +3581,11 @@ msgstr "本地生成 PMK" msgid "Generate archive" msgstr "生成备份" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "生成配置" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "生成配置…" @@ -3170,15 +3593,15 @@ msgstr "生成配置…" msgid "Generate new key pair" msgstr "生成新的密钥对" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "生成预共享密钥" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "生成适合在 WireGuard 对端上导入的配置" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "正在生成二维码…" @@ -3190,39 +3613,40 @@ msgstr "由于密码验证不匹配,密码没有更改!" msgid "Global Settings" msgstr "全局设置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "全局网络选项" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "转到固件升级…" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "跳转到密码配置页…" #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "进入相关配置页面" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "授予访问 DHCP 配置的权限" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "授予访问 DHCP 状态展示的权限" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "授予访问 DSL 状态显示的权限" @@ -3234,6 +3658,10 @@ msgstr "授予访问 LuCI OpenConnect 程序的权限" msgid "Grant access to LuCI Wireguard procedures" msgstr "授予访问 LuCI Wireguard 程序的权限" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "授予对 LuCI openfortivpn 手续的访问权限" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "授予访问 SSH 配置的权限" @@ -3270,7 +3698,7 @@ msgstr "授予访问挂载配置的权限" msgid "Grant access to network configuration" msgstr "授予访问网络配置的权限" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "授予使用网络诊断工具的权限" @@ -3278,6 +3706,10 @@ msgstr "授予使用网络诊断工具的权限" msgid "Grant access to network status information" msgstr "授予查看网络状态信息的权限" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "授予查看进程状态信息的权限" @@ -3310,7 +3742,7 @@ msgstr "授予对 uHTTPd 配置的访问权限" msgid "Grant access to wireless channel status" msgstr "授予无线信道状态权限" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "授予访问无线状态展示的权限" @@ -3339,15 +3771,11 @@ msgstr "HTTP(S) 访问" msgid "Hang Up" msgstr "挂起" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "请求头错误代码错误(HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "间歇闪烁(kernel:heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Hello 间隔" @@ -3357,7 +3785,7 @@ msgid "" "the timezone." msgstr "此处配置设备的基础信息,如主机名称或时区。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "隐藏 ESSID" @@ -3366,17 +3794,25 @@ msgstr "隐藏 ESSID" msgid "Hide empty chains" msgstr "隐藏空链" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "高" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "遵循非必要的 ARP" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "钩子:%h(%h),优先级:%d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "跳跃惩罚" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3386,7 +3822,7 @@ msgstr "主机" msgid "Host expiry timeout" msgstr "主机到期超时" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "主机从引导服务器请求此文件名。" @@ -3394,10 +3830,17 @@ msgstr "主机从引导服务器请求此文件名。" msgid "Host-Uniq tag content" msgstr "Host-Uniq 标签内容" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" +"特定于主机的租约时间,如 5m, 3h, 7d。" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3407,11 +3850,11 @@ msgstr "主机名" msgid "Hostname to send when requesting DHCP" msgstr "请求 DHCP 时发送的主机名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "主机名映射" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3469,23 +3912,27 @@ msgstr "IEEE 802.3ad 动态链路聚合(802.3ad,4)" msgid "IKE DH Group" msgstr "IKE DH 组" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "IMEI" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IP 地址" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "IP 协议" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" -msgstr "IP 集" +msgstr "IP 集合" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "IP 类型" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3501,7 +3948,7 @@ msgstr "IP 地址无效" msgid "IP address is missing" msgstr "IP 地址缺失" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " @@ -3515,20 +3962,20 @@ msgctxt "nft ip protocol" msgid "IP protocol" msgstr "IP 协议" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "IP 协议" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "IP 集" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "IP 集" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "忽略虚假空域名解析" @@ -3536,14 +3983,15 @@ msgstr "忽略虚假空域名解析" msgid "IPsec XFRM" msgstr "IPsec XFRM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4" @@ -3559,7 +4007,7 @@ msgstr "IPv4 邻居" msgid "IPv4 Routing" msgstr "IPv4 路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "IPv4 规则" @@ -3569,7 +4017,7 @@ msgstr "IPv4 上游" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3596,7 +4044,7 @@ msgstr "IPv4 子网掩码" msgid "IPv4 network in address/netmask notation" msgstr "地址/网络掩码表示法中的 IPv4 网络" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "仅 IPv4" @@ -3609,11 +4057,11 @@ msgstr "IPv4 地址前缀" msgid "IPv4 prefix length" msgstr "IPv4 地址前缀长度" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "IPv4 流量表 \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3622,16 +4070,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-in-IPv4(RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "IPv4/IPv6" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6(双栈 - 默认 IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "IPv4/IPv6 流量表 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3642,7 +4094,8 @@ msgstr "IPv4/IPv6 流量表 \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3650,7 +4103,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6 防火墙" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "IPv6 MTU" @@ -3658,7 +4111,11 @@ msgstr "IPv6 MTU" msgid "IPv6 Neighbours" msgstr "IPv6 邻居" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "IPv6 前缀有效期" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "IPv6 RA 设置" @@ -3666,15 +4123,15 @@ msgstr "IPv6 RA 设置" msgid "IPv6 Routing" msgstr "IPv6 路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "IPv6 规则" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "IPv6 设置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6 ULA 前缀" @@ -3688,12 +4145,12 @@ msgstr "IPv6 上游" msgid "IPv6 address" msgstr "IPv6 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "IPv6 分配提示" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "IPv6 分配长度" @@ -3705,20 +4162,20 @@ msgstr "IPv6 网关" msgid "IPv6 network in address/netmask notation" msgstr "地址/网络掩码表示法中的 IPv6 网络" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "仅 IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" -msgstr "IPv6 首选项" +msgstr "IPv6 优先级" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "IPv6 prefix" msgstr "IPv6 前缀" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "IPv6 前缀过滤器" @@ -3732,23 +4189,19 @@ msgstr "IPv6 地址前缀长度" msgid "IPv6 routed prefix" msgstr "IPv6 路由前缀" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "IPv6 源路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "IPv6 后缀" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "IPv6 后缀(十六进制)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "IPv6 支持" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "IPv6 流量表 \"%h\"" @@ -3756,6 +4209,10 @@ msgstr "IPv6 流量表 \"%h\"" msgid "IPv6-PD" msgstr "IPv6-PD" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "IPv6 后缀(16 进制)" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3771,10 +4228,18 @@ msgstr "IPv6-over-IPv4(6rd)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6-over-IPv4(6to4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "鉴权" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" +"如果主机匹配一个因为指定了不同子网上的同一个地址而无法使用的条目,那么会设置" +"标签known-othernet。" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "如果选中,则启用 1DES" @@ -3787,13 +4252,13 @@ msgstr "如果选中,则添加“+ipv6”至 pppd 选项" msgid "If checked, encryption is disabled" msgstr "如果选中,则禁用加密" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "如果设置,则仅从给定的 IPv6 前缀类别中分配下游子网。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "设置后,匹配选项的含义将颠倒" @@ -3810,7 +4275,7 @@ msgid "" "device node" msgstr "如果指定,则通过分区卷标而不是固定的设备文件来挂载设备" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " @@ -3819,14 +4284,16 @@ msgstr "" "如此 IP 地址用于访问 LuCI 更改,需在 %d 秒内手动重连到新 IP" "确认设置,否则修改将被还原。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "留空则不配置默认路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "留空则忽略所通告的 DNS 服务器地址" @@ -3843,15 +4310,23 @@ msgstr "" "title=\"随机存取存储器\">RAM。请注意:数据交换的过程会非常慢,因为交换" "设备无法像 RAM 那样的高速地访问。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "忽略" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "忽略 /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "忽略此接口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "使用 !known来忽略来自未知机器的请求。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "忽略解析文件" @@ -3863,25 +4338,25 @@ msgstr "镜像" msgid "Image check failed:" msgstr "镜像检查失败了:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "导入为 peer" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "导入配置文件" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "将配置导入为对端…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "导入设置" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "导入对端配置" @@ -3893,7 +4368,26 @@ msgstr "从现有的 WireGuard 配置文件导入设置" msgid "In" msgstr "入口" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" +"DHCPv4 中可以包括一个以上的 mac 地址。这允许同一 IP 地址与多个 mac 地址相关" +"联,当另一个 mac 地址请求租约时,dnsmasq 可放弃和其中一个 mac 地址的 DHCP 租" +"约。只有其中一个 mac 地址随时处于活跃状态,这个功能才会稳定工作。" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"在桥接 LAN 设置中,建议启用桥接环路避免功能,以避免可导致整个 LAN 停止的广播" +"环路。" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." @@ -3901,7 +4395,7 @@ msgstr "" "为了防止未经授权访问系统,您的请求已被阻止。点击下面的 “继续 »” 来返回上一" "页。" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "秒数" @@ -3931,7 +4425,7 @@ msgstr "将当前安装的包列表备份在 /etc/backup/installed_packages.txt" msgid "Incoming checksum" msgstr "传入校验和" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "传入接口" @@ -3939,6 +4433,7 @@ msgstr "传入接口" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "传入密钥" @@ -3957,22 +4452,21 @@ msgstr "信息" msgid "Information" msgstr "信息" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "入口 QoS 映射" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "入口设备 id" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "入口设备名" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "初始化失败" @@ -3984,31 +4478,41 @@ msgstr "启动脚本" msgid "Initscripts" msgstr "启动脚本" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "内部证书约束(域)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "内部证书约束(SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "内部证书约束(主题)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "内部证书约束(通配符)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "安装扩展协议…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "实例" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "实例 \"%h\"" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "实例详情" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4018,6 +4522,10 @@ msgstr "仅连接到 BSSID 为 %h 的网络,而不是其它 SSID msgid "Insufficient permissions to read UCI configuration." msgstr "权限不足,无法读取 UCI 配置。" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "集成电路卡识别符" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4025,7 +4533,7 @@ msgstr "权限不足,无法读取 UCI 配置。" msgid "Interface" msgstr "接口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "接口“%h”已被标记为指定的主接口。" @@ -4033,7 +4541,7 @@ msgstr "接口“%h”已被标记为指定的主接口。" msgid "Interface %q device auto-migrated from %q to %q." msgstr "接口设备 %q 从 %q 自动迁移到了 %q。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "接口配置" @@ -4064,11 +4572,11 @@ msgstr "正在重新连接接口…" msgid "Interface is shutting down..." msgstr "正在关闭接口..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "正在启动接口…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "正在停止接口…" @@ -4077,12 +4585,12 @@ msgid "Interface name" msgstr "接口名称" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "接口不存在或未连接。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "接口" @@ -4091,15 +4599,19 @@ msgstr "接口" msgid "Internal" msgstr "内部" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "内部服务器错误" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "国际移动台设备识别码" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "国际移动订户识别码" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "学习包发送间隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4108,7 +4620,7 @@ msgstr "" "组播常规查询之间的时间间隔(以毫秒为单位)。通过更改该值,管理员可以调整子网" "中 IGMP 消息的数量。 数值越大,IGMP 查询的发送频率越低" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "STP hello 数据包的时间间隔(以秒为单位)" @@ -4118,8 +4630,9 @@ msgid "Invalid" msgstr "无效" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "提供的 APN 无效" @@ -4129,6 +4642,10 @@ msgstr "提供的 APN 无效" msgid "Invalid Base64 key string" msgstr "无效的 Base64 密钥" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "无效的 IPv6 地址" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4151,7 +4668,7 @@ msgstr "无效的 VLAN ID!只允许唯一的 ID" msgid "Invalid argument" msgstr "无效参数" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4165,15 +4682,36 @@ msgstr "无效命令" msgid "Invalid hexadecimal value" msgstr "无效 16 进制值" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "无效的主机名或 IPv4 地址" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "无效的端口" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "无效的服务器 URL" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "无效的用户名和/或密码!请重试。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "反转闪烁" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "反向匹配" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "是主 VLAN" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "隔离客户端" @@ -4184,25 +4722,25 @@ msgid "" "flash memory, please verify the image file!" msgstr "您尝试刷写的固件与此设备不兼容,请检查固件文件!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "需要 JavaScript!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "加入网络" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "加入网络:搜索无线" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "正在加入网络:%q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "跳至规则" @@ -4210,24 +4748,28 @@ msgstr "跳至规则" msgid "Keep settings and retain the current configuration" msgstr "保留当前配置" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "保活" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "内核日志" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "内核版本" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "密钥" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "密钥 #%d" @@ -4235,6 +4777,7 @@ msgstr "密钥 #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "入站包密钥(可选)。" @@ -4242,14 +4785,19 @@ msgstr "入站包密钥(可选)。" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "出站包密钥(可选)。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "密钥缺失" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "用来签署网络配置的密钥" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4294,7 +4842,7 @@ msgstr "LCP 响应间隔" msgid "LED Configuration" msgstr "LED 配置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC" @@ -4311,32 +4859,39 @@ msgstr "语言" msgid "Language and Style" msgstr "语言和界面" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "较大的权重(相同的优先级下)被赋予相应较高的被选中概率。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "最后成员间隔" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "延迟" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "上次握手" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" -msgstr "叶节点" +msgstr "Leaf" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "学习" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "学习路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "租约文件" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "租期" @@ -4360,7 +4915,7 @@ msgstr "留空则自动探测" msgid "Leave empty to use the current WAN address" msgstr "留空则使用当前 WAN 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4369,31 +4924,27 @@ msgstr "" "过时或性能欠佳的设备可能需要旧的 802.11b 速率才能互联。在使用这些速率的情况" "下,信道占用效率可能会显著降低。建议尽可能不使用 802.11b 速率。" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "检测到旧版规则" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "图例:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "客户数" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "线路衰减(LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "线路模式" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "线路状态" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" msgstr "线路运行时间" @@ -4414,16 +4965,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "链路层报头位 %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "要转换成 NXDOMAIN 响应的 IP 地址列表。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "要用指定域 IP 填充的 IP 集列表。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4435,7 +4988,7 @@ msgstr "" "进制字符串)。
    在从初始移动域关联期间使用的 R0KH 中请求 PMK-R1 密钥时," "该列表用于将 R0KH-ID(NAS 标识符)映射到目标 MAC 地址。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4452,23 +5005,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "用于认证的 SSH 密钥文件列表" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "允许 RFC1918 响应的域名列表。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "此列表将域名强制指向某个 IP 地址。" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "查询将被转发到的上游解析器的列表。" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "监听端口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "监听接口" @@ -4476,7 +5026,7 @@ msgstr "监听接口" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "仅监听指定的接口,未指定则监听全部" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4486,7 +5036,7 @@ msgstr "仅监听这些接口和环回接口。" msgid "ListenPort setting is invalid" msgstr "ListenPort 设置无效" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "入站 DNS 查询的侦听端口。" @@ -4495,7 +5045,7 @@ msgstr "入站 DNS 查询的侦听端口。" msgid "Load" msgstr "负载" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "平均负载" @@ -4503,27 +5053,28 @@ msgstr "平均负载" msgid "Load configuration…" msgstr "加载配置…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "加载数据中…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "正在载入目录内容…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "正在载入视图…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "本地" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "本地 IP 地址" @@ -4543,11 +5094,12 @@ msgstr "要分配的本地 IP 地址" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "本机 IPv4 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "本地 IPV6 DNS 服务器" @@ -4563,44 +5115,70 @@ msgstr "本机 IPv6 地址" msgid "Local Startup" msgstr "本地启动脚本" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "本地时间" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "本地 ULA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "本地域名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "附加到 DHCP 名称和主机文件条目的本地域后缀。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "本地服务器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "仅本地服务" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "本地 wireguard 密钥" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "本地化查询" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "位置区域码" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "锁定到 BSSID" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "记录事件 \"%h…\"" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "登录" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "去登录…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "退出" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "日志记录等级" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "记录查询日志" @@ -4626,37 +5204,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "隧道将要被添加(桥接)到的逻辑网络(可选)。" -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "登录" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "退出" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "宽松过滤" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "信号丢失秒数(LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "网络地址的起始分配基址。" +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "Lua 兼容模式活跃" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "MAC 地址过滤" @@ -4664,16 +5233,15 @@ msgstr "MAC 地址过滤" msgid "MAC Address For The Actor" msgstr "这个 Actor 的 MAC 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4682,11 +5250,15 @@ msgstr "MAC VLAN" msgid "MAC address" msgstr "MAC 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "MAC 地址" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC 过滤" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "MAC 列表" @@ -4700,6 +5272,10 @@ msgstr "MAP / LW4over6配置" msgid "MAP rule is invalid" msgstr "MAP 规则无效" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "MBIM 蜂窝网络" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4721,15 +5297,19 @@ msgstr "MII / ETHTOOL ioctls" msgid "MII Interval" msgstr "MII 间隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "MX" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4737,7 +5317,7 @@ msgid "" msgstr "确保使用以下命令来复制根文件系统:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4746,69 +5326,69 @@ msgstr "确保使用以下命令来复制根文件系统:" msgid "Manual" msgstr "手动" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "制造商" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "主设备" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "匹配标签" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "最长 RA 间隔" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "最大可达数据速率(ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" -msgstr "" -"最大 DHCP 租约数量" +msgstr "最大 DHCP 租期" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" -msgstr "" -"最大 EDNS0 数据包大小" +msgstr "最大 EDNS0 数据包大小" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" -msgstr "最大并发查询数" +msgstr "最大并发查询数" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "最大年龄" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "允许的最大监听间隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "允许的最大 DHCP 租约数。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "允许的最大并发 DNS 查询数。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "EDNS0 UDP 数据包的最大允许大小。" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "调制解调器就绪的最大等待时间(秒)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "最大地址分配数量。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "最大侦听表大小" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -4816,10 +5396,14 @@ msgstr "" "发送主动 RA 允许的最长时间" "间隔。默认为 600 秒。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "最大传输功率" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "可能造成 VoIP 或其他服务无法运作。" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4846,7 +5430,7 @@ msgstr "内存" msgid "Memory usage (%)" msgstr "内存使用率(%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "Mesh" @@ -4854,10 +5438,18 @@ msgstr "Mesh" msgid "Mesh ID" msgstr "Mesh ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "Mesh ID" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "Mesh 路由" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "Mesh 和路由相关选项" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "方法未找到" @@ -4870,7 +5462,7 @@ msgstr "链路监测方式" msgid "Method to determine link status" msgstr "确定链路状态的方式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4881,11 +5473,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "最短 RA 间隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "最小 ARP 有效时间" @@ -4893,13 +5485,13 @@ msgstr "最小 ARP 有效时间" msgid "Minimum Number of Links" msgstr "最小链接数" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "替换 ARP 条目所需的最短时间(以秒为单位)。防止 ARP 缓存崩溃。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4915,77 +5507,84 @@ msgstr "数据包镜像监听端口" msgid "Mirror source port" msgstr "数据包镜像源端口" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "移动国家码" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "移动数据" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "移动网络码" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "移动设备" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "移动域" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "模式" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "型号" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "正在拆卸调制解调器载体。" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "调制解调器信息" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "正在建立调制解调器连接,请稍等。2 分钟内未建立连接则超时。" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "调制解调器默认" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "调制解调器设备" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "正在断开调制解调器连接,请稍等。" - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "调制解调器信息查询失败" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "调制解调器初始化超时" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "调制解调器已禁用。" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "调制解调器管理器" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "监听" @@ -5053,6 +5652,10 @@ msgstr "下移" msgid "Move up" msgstr "上移" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "多播到单播" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5060,19 +5663,23 @@ msgstr "上移" msgid "Multicast" msgstr "多播" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "多播模式" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "多播路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "多播到单播" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "NAS ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "NAT 动作链 \"%h\"" @@ -5084,12 +5691,16 @@ msgstr "NAT-T 模式" msgid "NAT64 Prefix" msgstr "NAT64 前缀" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "NAT64 前缀" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "NDP 代理从属设备" @@ -5102,18 +5713,23 @@ msgid "NTP server candidates" msgstr "候选 NTP 服务器" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "名称" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "新网络的名称" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "隧道设备名" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "导航" @@ -5122,13 +5738,17 @@ msgstr "导航" msgid "Nebula Network" msgstr "Nebula 网络" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "邻居报告" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "邻近缓存有效性" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5137,32 +5757,36 @@ msgstr "邻近缓存有效性" msgid "Network" msgstr "网络" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "网络编码" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "网络模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "网络注册" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "网络 SSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "网络工具" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "网络地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "网络启动镜像" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "网桥配置迁移" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "网络设备" @@ -5175,7 +5799,7 @@ msgstr "网络设备活动(kernel:netdev)" msgid "Network device is not present" msgstr "网络设备不存在" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "网络设备表 \"%h\"" @@ -5184,7 +5808,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "网络标头位 %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "网络 ifname 配置迁移" @@ -5193,25 +5817,30 @@ msgstr "网络 ifname 配置迁移" msgid "Network interface" msgstr "网络接口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "网络 ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "永不" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "永不" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "不转发匹配的域和子域,只从 DHCP 或 hosts 文件解析。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "无法为“%s”创建新接口:“%s”" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "新接口名称…" @@ -5219,13 +5848,13 @@ msgstr "新接口名称…" msgid "Next »" msgstr "前进 »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "否" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "本接口未配置 DHCP 服务器" @@ -5233,7 +5862,7 @@ msgstr "本接口未配置 DHCP 服务器" msgid "No Data" msgstr "无数据" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "无加密" @@ -5249,9 +5878,17 @@ msgstr "无 NAT-T" msgid "No RX signal" msgstr "无接收信号" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "未配置 WireGuard 接口。" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "未找到允许的模式配置。" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5263,7 +5900,11 @@ msgstr "" msgid "No client associated" msgstr "没有关联的客户端" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "未指定控制设备" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "无数据" @@ -5272,8 +5913,8 @@ msgstr "无数据" msgid "No data received" msgstr "未收到数据" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "不强制" @@ -5286,15 +5927,11 @@ msgstr "不强制" msgid "No entries available" msgstr "没有可用的条目" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "此目录中没有内容" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "未找到文件" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5309,7 +5946,7 @@ msgstr "" msgid "No host route" msgstr "无主机路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5330,30 +5967,39 @@ msgstr "没有更多的从属设备可用" msgid "No more slaves available, can not save interface" msgstr "没有更多的从属设备可用,无法保存接口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "禁用无效信息缓存" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "未加载 nftables 规则集。" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "未设置密码!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +msgid "No peers connected" +msgstr "未连接对端" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "尚未定义对端。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "未找到首选的模式配置。" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "当前还没有公钥。" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "此链中没有规则" @@ -5367,7 +6013,8 @@ msgid "No validation or filtering" msgstr "没有验证或过滤" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "未指定区域" @@ -5379,37 +6026,40 @@ msgstr "未指定区域" msgid "Noise" msgstr "噪声" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "噪声容限(SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "噪声容限" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "噪声:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "非抢占 CRC 错误(CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "非全部地址" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "无" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "正常" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "未找到" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "非成员" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "未关联" @@ -5422,7 +6072,7 @@ msgstr "未连接" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "不存在" @@ -5434,13 +6084,21 @@ msgstr "开机时不启动" msgid "Not supported" msgstr "不支持" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "" "注意:有些无线驱动程序不完全支持 802.11w。例如:mwlwifi 可能会有一些问题" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" +"注意:在指定非标准 Relay To 端口时,你可能还需要 DHCP 代理(当前不可用)" +"(addr#port)。" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "备注" @@ -5449,7 +6107,7 @@ msgstr "备注" msgid "Notice" msgstr "注意" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "Nslookup" @@ -5457,7 +6115,7 @@ msgstr "Nslookup" msgid "Number of IGMP membership reports" msgstr "IGMP 成员数量报告" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "缓存的 DNS 条目数量,最大 10000,0 表示不缓存。" @@ -5474,7 +6132,7 @@ msgid "Obfuscated Password" msgstr "混淆密码" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5485,6 +6143,7 @@ msgid "Obtain IPv6 address" msgstr "获取 IPv6 地址" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "关" @@ -5493,6 +6152,14 @@ msgstr "关" msgid "Off-State Delay" msgstr "关闭时间" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" +"关: vlanXXX, 如 vlan1。开: " +"vlan_tagged_interface.XXX, 如 eth0.1." + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "开" @@ -5501,15 +6168,15 @@ msgstr "开" msgid "On-State Delay" msgstr "通电时间" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "On-Link 路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "请指定主机名或 MAC 地址!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "可选值:%s" @@ -5527,7 +6194,11 @@ msgstr "选项卡上存在一个或多个无效/必需值" msgid "One or more required fields have no value!" msgstr "一个或多个必选项值为空!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "只接受来自下列地址的响应" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "启用后仅允许与非隔离网桥端口通信" @@ -5536,25 +6207,24 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "仅在当前活跃从属设备发生故障,且主从属设备在线时(failure,2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "打开 iptables 规则概况…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "打开列表…" #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect(CISCO AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn(Fortinet VPN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable 中继模式
    运行,否则禁用 " "NDP 代理。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5571,18 +6241,30 @@ msgstr "" "如指定的主接口已配置且处于活跃状态,则以中继模式运行,否则退回到" "服务器模式。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "如存在上游 IPv6 前缀则以中继模式运行,否则禁用服务。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "工作频率" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "运营商" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "运营商码" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "运营商名" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "选项“%s”包含无效的输入值。" @@ -5590,22 +6272,31 @@ msgstr "选项“%s”包含无效的输入值。" msgid "Option \"%s\" must not be empty." msgstr "选项“%s”不能为空。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "选项已更改" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "选项已移除" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "可选" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "要分配的可选主机名" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "此设备的可选任意格式备注" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "可选,以秒为单位。 如果设置为“0”,则不尝试重新连接。" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " @@ -5613,7 +6304,7 @@ msgid "" msgstr "" "可选,传出加密数据包的 32 位标记。请输入十六进制值,以 0x 开头。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5624,7 +6315,7 @@ msgstr "" "权服务器获取到 IPv6 前缀(如“a:b:c:d::”),使用后缀(如 “::1”)合成 IPv6 地址" "(“a:b:c:d::1”)分配给此接口。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5632,11 +6323,11 @@ msgstr "" "可选,Base64 编码的预共享密钥。添加在额外的对称密钥加密层中,用于抵抗未来的量" "子计算破解。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "可选,为此对端创建允许 IP 的路由。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "可选,对端的描述。" @@ -5644,13 +6335,13 @@ msgstr "可选,对端的描述。" msgid "Optional. Do not create host routes to peers." msgstr "可选,不要创建到对端的主机路由。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "可选,对端主机。名称将会预先被解析以启动接口。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5667,11 +6358,11 @@ msgstr "可选。XFRM 接口的最大传输单元。" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "可选,隧道接口的最大传输单元。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "可选,对端的端口。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5681,7 +6372,7 @@ msgstr "" "可选。WireGuard 对端的私钥。 该密钥不是建立连接所必需的,但允许生成对端配置" "或 二维码(如果可用)。 导出配置后可以将其删除。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5697,7 +6388,7 @@ msgstr "可选,用于传出和传入数据包的 UDP 端口。" msgid "Options" msgstr "选项" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4”为 NTP 服务器,“3,192.168.4.4”为默认路由。0.0.0.0 表示“系统运行 dnsmasq 的地址”。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "选项:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "序数:较低的优先。" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "发起人间隔" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "其余:" @@ -5731,7 +6431,7 @@ msgstr "出站:" msgid "Outgoing checksum" msgstr "传出校验和" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "传出接口" @@ -5739,6 +6439,7 @@ msgstr "传出接口" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "传出密钥" @@ -5762,21 +6463,23 @@ msgstr "出口区域" msgid "Overlap" msgstr "重叠" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "覆盖 IPv4 路由表" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "覆盖 IPv6 路由表" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5784,6 +6487,7 @@ msgstr "覆盖 IPv6 路由表" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "重设 MTU" @@ -5805,7 +6509,7 @@ msgstr "重设 TOS" msgid "Override TTL" msgstr "重设 TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -5819,7 +6523,7 @@ msgstr "重设默认接口名称" msgid "Override the gateway in DHCP responses" msgstr "重设 DHCP 响应网关" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -5833,7 +6537,7 @@ msgstr "重设内部路由表" msgid "Overview" msgstr "概览" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "覆盖已存在的文件“%s”吗?" @@ -5841,17 +6545,30 @@ msgstr "覆盖已存在的文件“%s”吗?" msgid "Overwrite the current settings with the imported configuration?" msgstr "用导入的配置覆盖当前设置?" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "自己的号码" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "用户名" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "PAP" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "PAP/CHAP" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP(均使用)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -5863,8 +6580,9 @@ msgid "PAP/CHAP password" msgstr "PAP/CHAP 密码" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -5875,6 +6593,7 @@ msgstr "PAP/CHAP 密码" msgid "PAP/CHAP username" msgstr "PAP/CHAP 用户名" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "PDP 类型" @@ -5884,8 +6603,9 @@ msgid "PID" msgstr "PID" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "PIN" @@ -5895,7 +6615,7 @@ msgstr "PIN" msgid "PIN code rejected" msgstr "PIN 码被拒绝" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "PMK R1 推送" @@ -5936,28 +6656,37 @@ msgstr "PSID 偏移" msgid "PSID-bits length" msgstr "PSID-bits 长度" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM(分组传输模式)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "PXE/TFTP 设置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "数据包服务状态" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "数据包引导" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "数据包标记" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "数据包接收时间" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "数据包" @@ -5966,23 +6695,29 @@ msgstr "数据包" msgid "Packets To Transmit Before Moving To Next Slave" msgstr "切换到下一个从属设备前要传输的数据包" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "网络的一部分:" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "区域 %q" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "直通(将物理设备镜像到单个 MAC VLAN)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "密码" @@ -5990,11 +6725,11 @@ msgstr "密码" msgid "Password authentication" msgstr "密码验证" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "私钥密码" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "内部私钥的密码" @@ -6005,19 +6740,19 @@ msgstr "内部私钥的密码" msgid "Password strength" msgstr "密码强度" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "密码 2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "粘贴或拖动 SSH 密钥文件……" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "粘贴或拖动 WireGuard peer 配置 (wg0.conf) 文件…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " @@ -6026,31 +6761,31 @@ msgstr "" "将来自另一个系统的 WireGuard 配置(通常是 wg0.conf)粘贴或拖动到下方" "创建一个匹配的 peer 条目,其允许该系统连接到本地 WireGuard 接口。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "粘贴或拖动提供的 WireGuard 配置文件…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "CA 证书路径" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "客户端证书路径" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "私钥路径" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "内部 CA 证书的路径" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "内部客户端证书的路径" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "内部私钥的路径" @@ -6072,11 +6807,19 @@ msgstr "暂停" msgid "Peak:" msgstr "峰值:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "对端" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "对端详情" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "要分配的对端 IP 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "对端 MAC 地址" @@ -6085,11 +6828,11 @@ msgstr "对端 MAC 地址" msgid "Peer address is missing" msgstr "对端地址缺失" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "对端设备名" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "已禁用对端" @@ -6120,10 +6863,14 @@ msgstr "执行重置" msgid "Permission denied" msgstr "没有权限" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "持续 Keep-Alive" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "持续重新连接间隔" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "PersistentKeepAlive 设置无效" @@ -6132,13 +6879,13 @@ msgstr "PersistentKeepAlive 设置无效" msgid "Phy Rate:" msgstr "物理速率:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "物理设置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6151,11 +6898,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pkts." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "请输入用户名和密码。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "请选择要上传的文件。" @@ -6163,56 +6910,74 @@ msgstr "请选择要上传的文件。" msgid "Policy" msgstr "策略" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "策略:%h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "端口" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "端口 %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "端口不是任何一个网络的一部分" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "端口隔离" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "端口状态" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "端口状态:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" msgstr "可能存在的冲突:%s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "电源管理模式" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "抢占式 CRC 错误(CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "电源状态" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "首选 LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "首选 UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "前缀的首选有效期。" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "首选的网络技术" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "分发前缀" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "前缀抑制器" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "预共享密钥" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "预共享密钥使用中" @@ -6235,15 +7000,18 @@ msgstr "在指定数量的 LCP 响应故障后假定链路已断开,0 为忽 msgid "Prevents client-to-client communication" msgstr "禁止客户端间通信" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"防止一个无线客户端与另一个客户端通信。 此设置仅影响没有任何 VLAN 标记的数据包" +"(未打标记的数据包)。" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "主从属设备" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "主 VLAN ID" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6256,29 +7024,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "只要主从属设备重新上线,它就会成为活跃从属设备(always,0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "优先级" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "Private" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "私有(阻止 MAC VLAN 间通信)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "私钥" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "存在私钥" @@ -6296,8 +7066,8 @@ msgid "Prot." msgstr "协议" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6309,14 +7079,14 @@ msgstr "协议" msgid "Provide NTP server" msgstr "作为 NTP 服务器提供服务" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" "在这个接口上提供一个 DHCPv6 服务器并回复至 DHCPv6 solicitations 和请求。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "添加新网络" @@ -6326,25 +7096,36 @@ msgid "" "interfaces" msgstr "将 NTP 服务器提供给选定的接口,或者,如果未指定,则提供给所有接口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "代理服务器" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "代理 ARP" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "伪装 Ad-Hoc(ahdemo)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "公钥" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "缺少公钥" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "公钥:%h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6371,59 +7152,83 @@ msgstr "QMI 蜂窝" msgid "Quality" msgstr "质量" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "查询所有可用的上游解析器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "查询间隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "查询响应间隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "R0 密钥生存期" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "R1 密钥持有者" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Radius 计费端口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Radius 计费密钥" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Radius 计费服务器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Radius 认证端口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Radius 认证密钥" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Radius 认证服务器" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "RADIUS 动态 VLAN 分配" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "RADIUS Per STA VLAN" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "RADIUS VLAN 网桥命名方案" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "RADIUS VLAN 命名" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "RADIUS VLAN 有标签的接口" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "RFC3947 NAT-T 模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "RSN 预认证" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "RSSI 加入阈值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "RTS/CTS 阈值" @@ -6436,10 +7241,16 @@ msgstr "接收" msgid "RX Rate" msgstr "接收速率" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "接收速率/发送速率" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "无线电资源测量 - 发送信标以协助漫游。并不是所有的客户端都支持这一点。" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6449,11 +7260,11 @@ msgstr "随机化源端口映射" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "原始 16 进制编码的字节。除非您的运营商要求,否则请留空" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "读取 /etc/ethers来配置 DHCP 服务器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "确定要切换协议?" @@ -6461,11 +7272,11 @@ msgstr "确定要切换协议?" msgid "Realtime Graphs" msgstr "实时信息" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "重关联截止时间" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "重绑定保护" @@ -6489,11 +7300,39 @@ msgstr "重启您设备上的系统" msgid "Receive" msgstr "接收" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "接收被丢弃" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "接收出错" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +msgid "Received Data" +msgstr "已接收的数据" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "接收到的字节数" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "接收到的多播" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "接收到的数据包" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "推荐,WireGuard 接口的 IP 地址。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "重连超时" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "重连此接口" @@ -6501,12 +7340,12 @@ msgstr "重连此接口" msgid "Redirect to HTTPS" msgstr "重定向到 HTTPS" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "重定向到本地端口 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "重定向到本地系统" @@ -6515,37 +7354,47 @@ msgstr "重定向到本地系统" msgid "References" msgstr "引用" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "刷新频道" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "刷新" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "注册状态" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "拒绝 ICMP 类型为 %h 的 IPv4 数据包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "拒绝 ICMP 类型为 %h 的数据包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "拒绝 ICMPv6 类型为 %h 的数据包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "拒绝 TCP 重置数据包" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "拒绝前缀长度小于或等于指定值的路由决策" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "中继" @@ -6555,6 +7404,10 @@ msgstr "中继" msgid "Relay Bridge" msgstr "中继桥" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "在别处中继 DHCP 请求。OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4。" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "网络间中继" @@ -6564,6 +7417,14 @@ msgstr "网络间中继" msgid "Relay bridge" msgstr "中继桥" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "中继来源" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "中继目标地址" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6573,6 +7434,7 @@ msgstr "远程 IPv4 地址" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "远程 IPv4 地址或 FQDN" @@ -6585,15 +7447,23 @@ msgstr "远程 IPv6 地址" msgid "Remote IPv6 address or FQDN" msgstr "远程 IPv6 地址或 FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "移除" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "从结果中删除 IPv4 地址,只返回 IPv6 地址。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "从结果中删除 IPv6 地址,只返回 IPv4 地址。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "从配置中移除相关的设备设置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "重置无线配置" @@ -6623,7 +7493,8 @@ msgstr "需要传入校验和(可选)。" msgid "Require incoming packets serialization (optional)." msgstr "需要传入数据包序列化(可选)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "必需的" @@ -6639,7 +7510,7 @@ msgstr "必须,此接口的 Base64 编码私钥。" msgid "Required. Path to the .yml config file for this interface." msgstr "必填。 此接口 .yml 配置文件的路径。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "必需。WireGuard 对端的公钥。" @@ -6651,67 +7522,73 @@ msgstr "必需。底层接口。" msgid "Required. XFRM interface ID to be used for SA." msgstr "必需。用于 SA 的 XFRM 接口 ID。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "必需:拒绝验证,如果 RADIUS 服务器不提供正确的 VLAN 属性。" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "需要 hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "需要带 EAP Suite-B 支持的 hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "需要带 EAP 支持的 hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "需要带 OWE 支持的 hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "需要带 SAE 支持的 hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "需要带 WEP 支持的 hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "需要 wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "需要带 EAP Suite-B 支持的 wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "需要带 EAP 支持的 wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "需要带 OWE 支持的 wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "需要带 SAE 支持的 wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "需要带 WEP 支持的 wpa-supplicant" @@ -6720,7 +7597,7 @@ msgid "Reselection policy for primary slave" msgstr "主从属设备的重选策略" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6735,20 +7612,24 @@ msgstr "复位计数器" msgid "Reset to defaults" msgstr "恢复到出厂设置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "HOSTS 和解析文件" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "解析文件" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "此列表将域名强制指向某个 IP 地址。" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "未找到资源" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "重启" @@ -6757,7 +7638,7 @@ msgstr "重启" msgid "Restart Firewall" msgstr "重启防火墙" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "重启无线接口" @@ -6769,87 +7650,100 @@ msgstr "恢复" msgid "Restore backup" msgstr "恢复配置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "" "如果有多个 IP 可用,则应答特定的 DNS 查询,这些查询匹配接收到查询的子网。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "显示/隐藏 密码" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "反转路径过滤器" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "恢复" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "恢复更改" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "恢复请求失败,状态 %h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "正在恢复配置…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "修改" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "重写目的地到 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "重写目的地到 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "重写目的地到 %h,端口 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "重写目的地到 %h,端口%h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "重写源到 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "重写源到 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "重写源到 %h,端口%h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "重写源到 %h,端口%h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "重写到出口设备地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" +"健壮安全网络 (RSN):允许 WPA2-EAP 网络的漫游预认证 (并在 WLAN 信标中发布它)。" +"只有当指定的网络接口是网桥时才有效。缩短时序要求严格的再关联过程。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "健壮性" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6866,19 +7760,19 @@ msgstr "根目录准备" msgid "Round-Robin policy (balance-rr, 0)" msgstr "循环策略(balance-rr,0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "路由允许的 IP" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "路由动作链 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "路由类型" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6898,6 +7792,10 @@ msgstr "路由器密码" msgid "Routing" msgstr "路由" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "路由算法" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6910,24 +7808,24 @@ msgstr "路由指定通过哪个接口和网关可以到达某个主机或网络 msgid "Rule" msgstr "规则" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "规则操作" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "规则评论:%s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "规则容器链 \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "规则匹配" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "规则类型" @@ -6947,11 +7845,24 @@ msgstr "运行时错误" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "SIM %d" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "SIMs" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "信噪比" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "SRV" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6969,15 +7880,15 @@ msgstr "SSH 服务器端口" msgid "SSH username" msgstr "SSH 用户名" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH 密钥" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6994,7 +7905,7 @@ msgstr "SSTP 服务器" msgid "SWAP" msgstr "交换分区" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7005,7 +7916,7 @@ msgid "Save" msgstr "保存" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "保存并应用" @@ -7022,7 +7933,7 @@ msgstr "保存 mtdblock" msgid "Save mtdblock contents" msgstr "保存 mtdblock 内容" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "扫描" @@ -7031,11 +7942,16 @@ msgstr "扫描" msgid "Scheduled Tasks" msgstr "计划任务" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "%s 部分为空。" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "添加的节点" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "移除的节点" @@ -7052,9 +7968,9 @@ msgstr "" "即使映像文件检查失败,也“强制升级”以烧录映像。仅在您确定固件正确且适用于您的" "设备时使用!" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "选择文件…" @@ -7062,7 +7978,7 @@ msgstr "选择文件…" msgid "Selects the transmit hash policy to use for slave selection" msgstr "选择用于从属设备选择的传输哈希策略" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7070,7 +7986,7 @@ msgstr "" "发送通告此设备为 IPv6 路由器的 RA 消息。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "发送 ICMP 重定向" @@ -7089,11 +8005,15 @@ msgstr "定时发送 LCP 响应(秒),仅在结合了故障阈值时有效" msgid "Send the hostname of this device" msgstr "传输这台设备的主机名称" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "服务器" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "服务器地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "服务器名称" @@ -7118,16 +8038,20 @@ msgstr "会话已过期" msgid "Set Static" msgstr "设为静态" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "为主机名设置别称。" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "将标头字段 %s设为%s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "将接口设置为 NDP 代理外部从属设备。默认为关闭。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7139,7 +8063,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "为所有从属设备设置相同的 MAC 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7148,7 +8072,7 @@ msgstr "" "在已发送 RA 报文的前缀信息选项中设置自主地" "址配置标记。启用后,客户端将执行无状态 IPv6 地址自动配置。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7162,11 +8086,15 @@ msgstr "设置到当前活跃的从属设备(active,1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "设置到第一个添加到 bond 接口的从属设备(follow,2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "配置 DHCP 服务器" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "设置已代理 IPv6 邻居的路由。" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7174,33 +8102,37 @@ msgid "Setting PLMN failed" msgstr "设置 PLMN 失败" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "设置操作模式失败" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "设置允许的网络技术。" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "设置首选的网络技术。" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" msgstr "设置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "设置已代理 IPv6 邻居的路由。" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "严重误码秒(SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" +msgstr "协助无线客户端在多个 AP 之间漫游的设置:802.11r、 802.11k 和 802.11v" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "Short GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "Short Preamble" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "显示当前备份文件列表" @@ -7213,16 +8145,16 @@ msgstr "显示空链" msgid "Show raw counters" msgstr "显示原始计数器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "关闭此接口" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7230,15 +8162,15 @@ msgstr "关闭此接口" msgid "Signal" msgstr "信号" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "信号/噪声" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "信号衰减(SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "信号质量" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "信号刷新率" @@ -7246,12 +8178,12 @@ msgstr "信号刷新率" msgid "Signal:" msgstr "信号:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "大小" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "DNS 查询缓存的大小" @@ -7268,12 +8200,12 @@ msgstr "跳过" msgid "Skip from backup files that are equal to those in /rom" msgstr "不备份与 /rom 目录下文件相同的文件" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "跳到内容" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "跳转到导航" @@ -7291,14 +8223,10 @@ msgstr "软件 VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "一些字段的值无效,无法保存!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "对不起,请求的目标未找到。" -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "对不起,服务器遇到未知错误。" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7308,8 +8236,8 @@ msgstr "" "抱歉,您的设备暂不支持 sysupgrade 升级,需手动更新固件。请参考 Wiki 中关于此" "设备的固件更新说明。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7336,7 +8264,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "源端口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7344,7 +8272,7 @@ msgstr "" "Dnsmasq 的特殊PXE启动选" "项。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7352,7 +8280,7 @@ msgstr "" "指定一个通过 DHCPv6 宣告的 DNS 搜索域名的固定列表。如未指定,本地设备 DNS 搜" "索域将被宣布。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7361,7 +8289,7 @@ msgstr "" "指定一个通过 DHCPv6 宣布的 IPv6 DNS 服务器地址的固定列表。如未指定,设备会宣" "布自己是 IPv6 DNS 服务器,除非本地 IPv6 DNS 服务器选项被禁用。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7388,7 +8316,7 @@ msgstr "指定用于 ARP 监控的 IP 地址" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "以毫秒为单位指定 MII 链接监控频率" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "指定要在 IP 头中匹配的 TOS 值" @@ -7396,7 +8324,7 @@ msgstr "指定要在 IP 头中匹配的 TOS 值" msgid "Specifies the aggregation selection logic to use" msgstr "指定要使用的聚合选择逻辑" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "指定要匹配的目标子网(CIDR 符号)" @@ -7404,7 +8332,7 @@ msgstr "指定要匹配的目标子网(CIDR 符号)" msgid "Specifies the directory the device is attached to" msgstr "指定设备的挂载目录" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7413,7 +8341,7 @@ msgstr "" "指定RA消息中发送的标记,比如指示客户端通过" "有状态 DHCPv6 请求进一步的信息。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" @@ -7421,7 +8349,7 @@ msgstr "" "指定要匹配的 fwmark 及其 mask(可选),例如 0xFF 匹配 mark 255,0x0/0x1 匹配" "任意 mark 值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "输入传入逻辑接口名称" @@ -7451,7 +8379,7 @@ msgid "" "dead" msgstr "判断主机已下线的超时时间(秒)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7470,7 +8398,7 @@ msgstr "指定 asserting 运营商前必须处于活跃状态的链接的最小 msgid "Specifies the mode to be used for this bonding interface" msgstr "指定用于此 bonding 接口的模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7505,15 +8433,15 @@ msgid "" msgstr "" "指定 bonding 驱动程序向每个从属设备连接的交换机发送学习数据包的间隔秒数" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "指定 IP 规则的顺序" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "指定传出逻辑接口名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7535,19 +8463,19 @@ msgid "" "active slave or recovery of the primary slave occurs" msgstr "指定当活动从属设备发生故障或主从属设备恢复时,主从属设备的重选策略" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "指定要使用的路由度量" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "指定要创建的路由类型" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "指定规则目标路由动作" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "指定要匹配的源子网(CIDR符号)" @@ -7567,7 +8495,7 @@ msgid "" "link recovery detection" msgstr "指定在检测到链路恢复后,在启用从属设备之前等待的时间(以毫秒为单位)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7668,15 +8596,23 @@ msgid "" "bytes)." msgstr "设置 MTU(最大传输单位),缺省值:1280 bytes。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "在此指定密钥。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "速度: %d Mibit/s, 双工: %s" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "Splitterless ADSL (G.992.2) Annex A" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "过时的邻近缓存超时" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "启动" @@ -7689,16 +8625,16 @@ msgstr "启动 WPS" msgid "Start priority" msgstr "启动优先级" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "开始刷新" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "开始应用配置…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "正在启动无线扫描…" @@ -7707,6 +8643,10 @@ msgstr "正在启动无线扫描…" msgid "Startup" msgstr "启动项" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "状态" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "静态 IPv4 路由" @@ -7720,7 +8660,7 @@ msgstr "静态 IPv6 路由" msgid "Static Lease" msgstr "静态租约" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "静态地址分配" @@ -7730,7 +8670,7 @@ msgstr "静态地址分配" msgid "Static address" msgstr "静态地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7739,18 +8679,18 @@ msgstr "" "静态租约用于给 DHCP 客户端分配固定的 IP 地址和主机标识。只有指定的主机才能连" "接,并且接口须为非动态配置。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "非活动站点限制" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "状态" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "停止" @@ -7759,8 +8699,8 @@ msgstr "停止" msgid "Stop WPS" msgstr "停止 WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "停止刷新" @@ -7768,11 +8708,11 @@ msgstr "停止刷新" msgid "Storage" msgstr "存储空间使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "严格过滤" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "严谨查序" @@ -7781,15 +8721,15 @@ msgid "Strong" msgstr "强" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "提交" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "不记录日志" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "禁止记录 DHCP 协议的日常操作。" @@ -7820,7 +8760,7 @@ msgstr "交换机 VLAN" msgid "Switch port" msgstr "交换机端口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "切换协议" @@ -7830,7 +8770,7 @@ msgstr "切换协议" msgid "Switch to CIDR list notation" msgstr "切换到 CIDR 列表记法" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "符号链接" @@ -7842,8 +8782,16 @@ msgstr "与 NTP 服务器同步" msgid "Sync with browser" msgstr "同步浏览器时间" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "语法: /fqdn[/fqdn…]/[ipaddr]." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "语法:_service._proto.example.com." + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7867,9 +8815,9 @@ msgstr "系统属性" msgid "System log buffer size" msgstr "系统日志缓冲区大小" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." msgstr "系统在恢复 (initramfs) 模式下运行。" @@ -7898,7 +8846,7 @@ msgstr "TCP 源端口" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "TFTP 服务器根目录" @@ -7911,26 +8859,37 @@ msgstr "发送" msgid "TX Rate" msgstr "发送速率" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "TX 队列长度" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "表" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "标签" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "已打标签" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "目标" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "目标平台" @@ -7946,7 +8905,7 @@ msgstr "临时空间" msgid "Terminate" msgstr "关闭" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -7955,13 +8914,13 @@ msgstr "" "将在 RA消息中发布的MTU。最小值是 1280 字节。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "受管地址配置 (M) 标记表明可以通过 DHCPv6 获取 IPv6 地址。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -7969,7 +8928,7 @@ msgstr "" " 移动 IPv6 Home 代理 (H) 标记表明该设备在此链路上还 充当移动 IPv6 " "home 代理。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7986,7 +8945,11 @@ msgid "" "the configuration." msgstr "qrencode包对生成配置的二维码图像是必需的。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "此主机的 DHCPv6-DUID (DHCP 唯一标识符)。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -7998,18 +8961,26 @@ msgid "" "username instead of the user ID!" msgstr "HE.net 客户端更新设置已经被改变,您现在必须使用用户名代替用户 ID!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "IP 地址 %h 已被另一个静态租约使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" msgstr "IP 地址不在任何 DHCP 池地址范围之内" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "引导服务器的 IP 地址" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" +"将用于此主机的 IP 地址,或者使用ignore标签忽略任何来自此主机的 DHCP " +"请求。" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "远程终端的 IPv4 地址或全称域名。" @@ -8017,6 +8988,7 @@ msgstr "远程终端的 IPv4 地址或全称域名。" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "远程隧道端的 IPv4 地址或完整域名。" @@ -8031,6 +9003,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "远程隧道端的 IPv6 地址或全称域名。" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "16 进制数的 IPv6 接口标识符(地址后缀)(最多 8 个字符)。" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8041,7 +9019,7 @@ msgstr "运营商特定的 IPv6 前缀,通常以 :: 为结尾" msgid "The LED blinks with the configured on/off frequency" msgstr "LED 以配置的开/关频率闪烁" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "LED 闪烁以模拟实际心跳。" @@ -8058,21 +9036,25 @@ msgstr "LED 始终处于默认状态关闭。" msgid "The LED is always in default state on." msgstr "LED 始终处于默认开启状态。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" msgstr "MAC 地址 %h 已被同一个 DHCP 池中的另一个静态租约使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "MTU 不能超过父设备 MTU 的 %d 字节" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "VLAN ID 必须是唯一的" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "用于发现 mesh 路由的算法" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8084,13 +9066,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "由于以下错误,配置文件无法被加载:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "加入一个隐藏的无线网络时,必须手动指定正确的 SSID" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8113,18 +9095,18 @@ msgstr "" "存储器或分区的设备文件(例如:/dev/" "sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "设备名称 “%s” 已被使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "为了使 LuCI 正常运行,现有的网络配置需要更改。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8143,7 +9125,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "以下规则当前在系统中处于活动状态。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "频率与 1 分钟平均 CPU 负载直接成正比。" @@ -8151,31 +9133,49 @@ msgstr "频率与 1 分钟平均 CPU 负载直接成正比。" msgid "The gateway address must not be a local IP address" msgstr "网关地址不能是本地 IP 地址" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "生成的配置可以导入到 WireGuard 客户端应用中来设置到该设备的连接。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "已添加给定的 SSH 公钥。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "给定的 SSH 公钥无效。请提供适当的公共 RSA 或 ECDSA 密钥。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "此条目/主机的硬件地址,用空格分开。" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"跳跃惩罚设置允许修改 batman-adv 对多跳路由与短路由的偏好。该值应用于每个转发 " +"OGM 的 TQ,从而传播额外跳的成本(必须接收和重新传输数据包,这会浪费传播时长)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "引导服务器的主机名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "找不到此接口" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "接口名称已被使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "接口名称过长" @@ -8198,6 +9198,7 @@ msgstr "本地 IPv4 地址" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "所创建隧道的本地 IPv4 地址(可选)。" @@ -8212,7 +9213,7 @@ msgstr "本地 IPv4 网络掩码" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "建立隧道的本地 IPv6 地址(可选)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8224,7 +9225,7 @@ msgstr "" "也是特定于组的查询消息之间的时间量。 可以调整该值以修改网络的“离开等待时" "间”。 减小的值会降低检测组中最后一个成员丢失的时间" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8235,7 +9236,7 @@ msgstr "" "上 IGMP 消息的突发性; 较大的值可减少流量的突发性,因为主机响应会在较大的时间" "间隔内分布" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8243,13 +9244,13 @@ msgstr "" "将在 RA消息中发布的最大跳数。最大值为 255 " "跳。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "更改 “%h”接口的设置可能中断到此设备的网络访问。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "网络名称已被使用" @@ -8266,7 +9267,7 @@ msgstr "" "的计算机可以直接相互通信。VLAN 也常用于分割" "不同网段。通常是默认一条上行端口连接运营商,其余端口用于本地网络。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " @@ -8275,7 +9276,7 @@ msgstr "" "对端应连接到的此系统的公共主机名或 IP 地址。 通常是静态公共 IP 地址、静态主机" "名或 DDNS 域。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "查询响应间隔必须小于查询间隔值" @@ -8288,7 +9289,7 @@ msgstr "reboot 命令失败,代码 %d" msgid "The restore command failed with code %d" msgstr "restore 命令失败,代码 %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8297,13 +9298,13 @@ msgstr "" "健壮性值允许调整网络上预期的数据包丢失。 如果预期网络丢包率较高,可以增加健壮" "值。IGMP对于(Robustness-1)数据包丢失具有鲁棒性" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "规则目标是跳转到由其优先级值指定的另一条规则" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8313,11 +9314,11 @@ msgstr "" "rt_tables 中声明的符号别名。特殊别名 local(255)、main(254) 和 default(253) 也" "有效" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "模式 %s 与 %s 加密方法不兼容" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "提交的安全令牌无效或已过期!" @@ -8353,6 +9354,17 @@ msgstr "系统密码已更改成功。" msgid "The sysupgrade command failed with code %d" msgstr "sysupgrade 命令失败,代码 %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" +"标签用于筛选所用的主机目录;可以提供超过一个标签,但这种情况下,请求必须匹配" +"所有标签。有标签目录的使用优先级高于没有标签的目录。请注意,你仍需指定 mac、" +"duid 和主机名三者中的一个(可以是一个通配符)。" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8376,12 +9388,18 @@ msgid "" "you choose the generic image format for your platform." msgstr "不支持所上传的映像文件格式,请选择适合当前平台的通用映像文件。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "该值被配置覆盖。 原始:%s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "该值被配置覆盖。" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "该值指定 batman-adv 向网络发送其协议信息的时间间隔(毫秒)。" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8389,19 +9407,20 @@ msgstr "" "系统上存在旧版 iptables 规则。 不鼓励混合使用 iptables 和 nftables 规则,这可" "能会导致流量过滤不完整。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "没有已分配的租约" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "没有待应用的更改" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8412,16 +9431,16 @@ msgstr "尚未设置密码。请为 root 用户设置密码以保护主机并启 msgid "This IPv4 address of the relay" msgstr "中继的 IPv4 地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "此身份验证类型不适用于所选的 EAP 方法。" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "这不是有效的 PEM 文件" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8436,6 +9455,21 @@ msgid "" "password if no update key has been configured" msgstr "如果更新密钥没有设置的话,隧道的“更新密钥”或者账户密码必须填写" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"这是你要将上方的物理设备链接到的 batman-adv 设备。 如果此列表为空,你需要先创" +"建一个。 如果你想通过有线网络设备路由 mesh 流量,请从上面的设备选择器中选择" +"它。如果您想将 batman-adv 接口分配给 Wi-fi 网格,则不要在设备选择器中选择设" +"备,而是转到无线设置并从那里选择此接口作为网络。" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8449,7 +9483,7 @@ msgid "" "ends with ...:2/64" msgstr "隧道代理分配的本地终端地址,通常以 ...:2/64 结尾" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "这是本地网络中唯一的 DHCP 服务器。" @@ -8477,8 +9511,8 @@ msgid "" "their status." msgstr "系统中正在运行的进程概况和它们的状态信息。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1587 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1645 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1734 msgid "" "This option cannot be used because the ca-bundle package is not installed." msgstr "此选项不可用,因为 ca-bundle 软件包未安装。" @@ -8493,31 +9527,39 @@ msgstr "尚无任何配置" msgid "Time Synchronization" msgstr "时间同步" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "Time advertisement" +msgstr "时间公告" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Time in milliseconds" msgstr "时间(以毫秒为单位)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Time in seconds to spend in listening and learning states" msgstr "花费在侦听和学习状态上的时间 (以秒为单位)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "Time interval for rekeying GTK" msgstr "重新加密 GTK 的时间间隔" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "Time zone" +msgstr "时间区域" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15 msgid "Timed-out" msgstr "超时" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Timeout in seconds" msgstr "超时(以秒为单位)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Timeout in seconds for learned MAC addresses in the forwarding database" msgstr "转发数据库中学习到的 MAC 地址的超时时间(以秒为单位)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Timeout in seconds until topology updates on link loss" msgstr "链接丢失拓扑更新前的超时时间 (以秒为单位)" @@ -8525,7 +9567,7 @@ msgstr "链接丢失拓扑更新前的超时时间 (以秒为单位)" msgid "Timezone" msgstr "时区" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:440 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:438 msgid "" "To fully configure the local WireGuard interface from an existing (e.g. " "provider supplied) configuration file, use the 配置导入。" -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "去登录…" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" "To restore configuration files, you can upload a previously generated backup " @@ -8547,7 +9585,7 @@ msgstr "" "上传备份存档以恢复配置。要将固件恢复到初始状态,请单击“执行重置”(仅 " "squashfs 格式的镜像文件有效)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "Tone" @@ -8555,12 +9593,16 @@ msgstr "Tone" msgid "Total Available" msgstr "可用数" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "Traceroute" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "追踪区域码" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8572,11 +9614,11 @@ msgstr "流量" msgid "Traffic Class" msgstr "流量类" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "流量过滤链 \"%h\"" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "匹配规则的流量: %.1000mPackets, %.1024mBytes" @@ -8593,6 +9635,26 @@ msgstr "传送" msgid "Transmit Hash Policy" msgstr "传输散列策略" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "传输被丢弃" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "传输错误" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +msgid "Transmitted Data" +msgstr "已传输的数据" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "已传输字节数" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "已传输的数据包" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8631,7 +9693,7 @@ msgstr "隧道接口" msgid "Tunnel Link" msgstr "隧道链接" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "隧道设备" @@ -8640,13 +9702,13 @@ msgid "Tx-Power" msgstr "传输功率" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "类型" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "服务类型" @@ -8695,7 +9757,7 @@ msgstr "无法确认外部 IP 地址" msgid "Unable to determine upstream interface" msgstr "无法确认上游接口" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "无法调度" @@ -8746,19 +9808,31 @@ msgstr "无法重启防火墙:%s" msgid "Unable to save contents: %s" msgstr "无法保存内容:%s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "不可用秒数(UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "无法设置允许的模式列表。" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "无法设置首选的模式。" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "无法验证 PIN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "取消配置" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "错误的数据回复格式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " @@ -8775,7 +9849,7 @@ msgstr "" msgid "Unknown" msgstr "未知" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "未知且不受支持的连接方式。" @@ -8799,11 +9873,11 @@ msgstr "不配置协议" msgid "Unmount" msgstr "卸载分区" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "未命名的密钥" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "未保存的配置" @@ -8817,15 +9891,25 @@ msgid "Unsupported MAP type" msgstr "不支持的 MAP 类型" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "不支持的调制解调器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "不支持的协议" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "不支持的协议类型。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "未打标签" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "无标题的对端" @@ -8837,7 +9921,7 @@ msgstr "上移" msgid "Up Delay" msgstr "Up 延迟" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "上传" @@ -8852,25 +9936,29 @@ msgstr "从这里上传一个 sysupgrade 兼容镜像以更新正在运行的固 msgid "Upload archive..." msgstr "上传备份…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "上传文件" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "上传文件…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "上传已被取消" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "上传请求失败:%s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "正在上传文件…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -8879,32 +9967,36 @@ msgstr "" "点击“继续”后,将为匿名的“wifi-iface”段分配一个名称,格式为 wifinet#,并且网络将重新启动以应用更新的配置。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "按下“继续”后,网桥配置将被更新,网络将重新启动以应用更新的配置。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" "按下 \"继续\",ifname 选项将被重命名,网络将重新启动以应用更新后的配置。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "将按照解析文件的顺序查询上游解析器。" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "运行时间" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "使用 /etc/ethers 配置" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "使用 DHCP" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "使用 DHCP 通告的服务器" @@ -8913,13 +10005,18 @@ msgstr "使用 DHCP 通告的服务器" msgid "Use DHCP gateway" msgstr "使用 DHCP 网关" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "使用 DHCPv6" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "自动获取 DNS 服务器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "参考 ISO/IEC 3166 alpha2 国家代码。" @@ -8965,22 +10062,25 @@ msgstr "作为根文件系统使用(/)" msgid "Use broadcast flag" msgstr "使用广播标签" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "使用内置的 IPv6 管理" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "使用自定义的 DNS 服务器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "使用默认网关" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "使用网关跃点" @@ -9005,15 +10105,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "对每个连接使用相同的源和目标" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "使用系统证书" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "为内置隧道使用系统证书" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9040,11 +10140,11 @@ msgstr "使用上层协议信息,依靠 skb 流剖析 (encap3+4)" msgid "Used" msgstr "已使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "启用密码组" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." @@ -9052,59 +10152,61 @@ msgstr "" "用于两种不同的用途:RADIUS NAS ID 和 802.11r R0KH-ID。通常的 WPA(2)-PSK 不需" "要。" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "用户组" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "用户证书(PEM)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "用户标识符" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "用户密钥(PEM)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "用户名" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "使用流表( flow table)%h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "VDSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA(虚拟以太网端口聚合器)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "VLAN ID" @@ -9124,24 +10226,27 @@ msgstr "VPN 本地地址" msgid "VPN Local port" msgstr "VPN 本地端口" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "VPN 协议" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPN 服务器" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "VPN 服务器证书的 SHA256 哈希" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "VPN 服务器端口" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "VPN 服务器证书的 SHA1 哈希值" @@ -9150,6 +10255,10 @@ msgstr "VPN 服务器证书的 SHA1 哈希值" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC(CISCO 3000 和其他 VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN (RFC7348)" @@ -9163,14 +10272,14 @@ msgstr "VXLAN 网络标识符" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6 (RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "验证 DNS 应答和缓存 DNSSEC 数据,需要上游支持 DNSSEC。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9196,7 +10305,7 @@ msgstr "Vendor" msgid "Vendor Class to send when requesting DHCP" msgstr "请求 DHCP 时发送的 Vendor Class 选项" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "验证未签名的域响应真的来自未签名域。" @@ -9204,12 +10313,12 @@ msgstr "验证未签名的域响应真的来自未签名域。" msgid "Verifying the uploaded image file." msgstr "正在验证上传的镜像文件。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "非常高" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "虚拟以太网" @@ -9217,34 +10326,46 @@ msgstr "虚拟以太网" msgid "Virtual dynamic interface" msgstr "虚拟动态接口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "WEP 开放式系统" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "WEP 共享密钥" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "WEP 密钥" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "WLAN 漫游" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "WMM 模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "WNM 睡眠模式" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "WNM 睡眠模式修复" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "WPA 密钥" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9273,20 +10394,72 @@ msgstr "警告:未保存的更改会在重启时丢失!" msgid "Weak" msgstr "弱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "权重" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" +"当一个主机匹配一个条目时,这个主机会被打上特殊标签known。使用" +"known标签来匹配所有已知的主机。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" "将前缀委派给多个下游时,在分配子网时,将首先考虑具有较高优先级值的接口。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"启用后,网络编码通过将多个帧组合成单个帧来增加 WiFi 吞吐量,从而减少所需的传" +"输时间。" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"启用后,分布式 ARP 表形成一个 mesh 范围的 ARP 缓存,帮助非 mesh 客户端更可靠" +"地获得 ARP 响应,并且没有太多延迟。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "启用后,即使网关与任何接口前缀都不匹配,网关也会处于联机状态" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" +"启用后,从接收到的非必要 ARP 请求或回复添加新的 ARP 表项,否则只更新先前存在" +"的 ARP 表项,但不学习新的 hosts。" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "反转时,LED 会持续亮起并闪烁,而不是默认关闭并在系统活动时闪烁。" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"当在每个节点的多个 WiFi 接口上运行 mesh 时,batman-adv 能够优化流量以获得最大" +"性能。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9295,7 +10468,7 @@ msgstr "" "使用 PSK 时,可以自动生成 PMK,因此以下 R0/R1 密钥选项不生效。若要使用 R0 和 " "R1 密钥则禁用此选项。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." @@ -9303,7 +10476,7 @@ msgstr "" "如果禁用 Wi-Fi 多媒体 (WMM) 模式 QoS,则客户端的速率可能限制为 " "802.11a/802.11g。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." @@ -9311,16 +10484,25 @@ msgstr "" "在 ESSID 被隐藏的范围内,客户端可能无法漫游且信道占用效率可能显著降低。" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" -msgstr "带宽" +msgstr "通道宽度" + +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "WireGuard 状态" #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard VPN" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "WireGuard 对端被禁用" @@ -9336,21 +10518,21 @@ msgid "Wireless Adapter" msgstr "无线适配器" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "无线网络" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "无线概况" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "无线安全" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "无线配置迁移" @@ -9366,15 +10548,15 @@ msgstr "无线未开启" msgid "Wireless is not associated" msgstr "无线未关联" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "无线网络已禁用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "无线网络已启用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "将收到的 DNS 查询写入系统日志。" @@ -9386,7 +10568,7 @@ msgstr "将系统日志写入文件" msgid "XOR policy (balance-xor, 2)" msgstr "XOR 策略 (balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9411,8 +10593,20 @@ msgstr "" "在此启用或禁用已安装的启动脚本,更改在设备重启后生效。
    警告:如" "果禁用了必要的启动脚本,比如“network”,可能会导致无法访问设备!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "你可以为同一目标添加多条记录。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "你可以为同一个域添加多条记录。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "你可以在同一个侦听地址上添加多个不同的 Relay To 地址。" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9441,34 +10635,56 @@ msgstr "ZRam 设置" msgid "ZRam Size" msgstr "ZRam 大小" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "_proto: _tcp, _udp, _sctp, _quic, … ." + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (注:虽然 _http 有可" +"能,但没有浏览器支持 SRV 记录。)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "任意" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "自动" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "自动" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "自动(已禁用)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "自动(已开启)" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "桥接的" @@ -9525,25 +10741,30 @@ msgctxt "nft unit" msgid "day" msgstr "天" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "禁用" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "已禁用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "驱动默认" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "驱动默认(%s)" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "比如: --proxy 10.10.10.10" @@ -9552,14 +10773,23 @@ msgstr "比如: --proxy 10.10.10.10" msgid "e.g: dump" msgstr "比如: dump" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "已开启" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "每 %d 秒" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "已过期" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "强制的" @@ -9569,22 +10799,22 @@ msgstr "强制的" msgid "forward" msgstr "转发" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "全双工" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "半双工" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "十六进制编码值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "隐藏" @@ -9593,9 +10823,9 @@ msgctxt "nft unit" msgid "hour" msgstr "小时" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "混合模式" @@ -9603,6 +10833,10 @@ msgstr "混合模式" msgid "ignore" msgstr "忽略" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "无限(租约永不过期)" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9617,11 +10851,19 @@ msgstr "密钥在 8 到 63 个字符之间" msgid "key with either 5 or 13 characters" msgstr "密钥为 5 或 13 个字符" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "已知" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "known-othernet (在不同子网上)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "受管配置 (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "中等安全性" @@ -9630,11 +10872,11 @@ msgctxt "nft unit" msgid "minute" msgstr "分钟" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "分钟" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "移动 home 代理 (H)" @@ -9646,18 +10888,26 @@ msgstr "netif_carrier_ok()" msgid "no" msgstr "否" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "未连接" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "非绕过" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "非空值" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "无" @@ -9668,20 +10918,20 @@ msgid "not present" msgstr "不存在" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "关" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "在可用的前缀上" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "开放网络" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "其他配置 (O)" @@ -9690,6 +10940,10 @@ msgstr "其他配置 (O)" msgid "output" msgstr "输出" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "超过一天前" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9707,23 +10961,32 @@ msgstr "正整数值" msgid "random" msgstr "随机" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "随机生成" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "通过在单个数据包而不是许多小数据包中收集和聚合发起方消息来减少开销" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "中继模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "已路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "秒" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "服务器模式" @@ -9731,7 +10994,7 @@ msgstr "服务器模式" msgid "sstpc Log-level" msgstr "sstpc 记录级别" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "强安全性" @@ -9739,7 +11002,7 @@ msgstr "强安全性" msgid "tagged" msgstr "已标记" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "时间单位(TUs / 1.024ms)[1000-65535]" @@ -9752,25 +11015,27 @@ msgstr "" "uHTTPd 提供 HTTP 或 HTTPS 网络访问。" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "唯一值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "未知" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "未知版本" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "无限制" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9792,8 +11057,8 @@ msgid "untagged" msgstr "未标记" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "有效 IP 地址" @@ -9806,7 +11071,7 @@ msgid "valid IPv4 CIDR" msgstr "有效 IPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "有效 IPv4 地址" @@ -9835,7 +11100,7 @@ msgid "valid IPv6 CIDR" msgstr "有效 IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "有效 IPv6 地址" @@ -9872,8 +11137,8 @@ msgstr "有效 UCI 标识符,主机名或 IP 地址" msgid "valid address:port" msgstr "有效 address:port" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "有效日期(YYYY-MM-DD)" @@ -9913,11 +11178,21 @@ msgstr "有效整数值" msgid "valid multicast MAC address" msgstr "有效的多播 MAC 地址" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "1 到 15 个字符间的有效网络设备名,不包含 \":\", \"/\", \"%\" 或者空格" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "有效的网络设备名,非\".\" 或 \"..\"" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "地址/网络掩码表示法中的有效网络" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "有效电话号码(0-9、“*”、“#”、“!”或“.”)" @@ -9927,43 +11202,43 @@ msgid "valid port or port range (port1-port2)" msgstr "有效端口或端口范围(port1-port2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "有效端口值" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "有效时间(HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "%d 和 %d 字符之间的值" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "%f 和 %f 之间的值" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "值大于或等于 %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "值小于或等于 %f" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "值有 %d 个字符" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "值至少为 %d 个字符" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "值至多为 %d 个字符" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "弱安全性" diff --git a/package/luci/modules/luci-base/po/zh_Hant/base.po b/package/luci/modules/luci-base/po/zh_Hant/base.po index 529dd7a616..d7613f1ce6 100644 --- a/package/luci/modules/luci-base/po/zh_Hant/base.po +++ b/package/luci/modules/luci-base/po/zh_Hant/base.po @@ -1,34 +1,50 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-11-25 14:34+0000\n" -"Last-Translator: James Tien \n" +"PO-Revision-Date: 2023-08-06 10:10+0000\n" +"Last-Translator: Trevor \n" "Language-Team: Chinese (Traditional) \n" +"librecmc/luci/zh_Hant/>\n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.0-dev\n" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:925 +msgid "!known (not known)" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:649 msgctxt "Yet unknown nftables table family (\"family\" table \"name\")" msgid "\"%h\" table \"%h\"" msgstr "\"%h\" 標籤 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1591 msgid "%.1f dB" msgstr "%.1f 分貝" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:123 msgid "%d Bit" msgstr "%d 位元" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4043 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4097 msgid "%d invalid field(s)" msgstr "%d 個無效欄位" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:26 +msgid "%dh ago" +msgstr "%d小時前" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:24 +msgid "%dm ago" +msgstr "%d分鐘前" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:22 +msgid "%ds ago" +msgstr "%d秒前" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 msgid "%s is untagged in multiple VLANs!" msgstr "%s 在多個 VLAN 中未選!" @@ -53,10 +69,11 @@ msgstr "(空白)" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:352 #: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 #: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:271 msgid "(no interfaces attached)" msgstr "(未連接介面)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:637 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:635 msgctxt "Label indicating further amount of allowed ips" msgid "+ %d more" msgstr "+ 另外 %d" @@ -66,19 +83,19 @@ msgid "-- Additional Field --" msgstr "-- 額外欄位 --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4148 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:798 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1036 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2009 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4157 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:799 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2033 #: modules/luci-compat/luasrc/view/cbi/header.htm:8 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:89 msgid "-- Please choose --" msgstr "-- 請選擇 --" #: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1037 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2010 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:1038 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2034 #: modules/luci-compat/luasrc/view/cbi/header.htm:9 msgid "-- custom --" msgstr "-- 自訂 --" @@ -104,7 +121,7 @@ msgctxt "sstp log level value" msgid "0" msgstr "0" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "0 = not using RSSI threshold, 1 = do not change driver default" msgstr "0 = 不使用無線漫遊(RSSI threshold),1 = 不變更裝置預設" @@ -117,12 +134,17 @@ msgstr "1" msgid "1 Minute Load:" msgstr "1分鐘負載:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:321 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:323 msgctxt "nft amount of flags" msgid "1 flag" msgid_plural "%d flags" msgstr[0] "%d 旗幟" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:984 +msgid "12h (12 hours - default)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:253 msgid "15 Minute Load:" msgstr "15分鐘負載:" @@ -137,12 +159,17 @@ msgctxt "sstp log level value" msgid "3" msgstr "3" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:983 +msgid "3h (3 hours)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:59 msgctxt "sstp log level value" msgid "4" msgstr "4" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "4-character hexadecimal ID" msgstr "4 字元十六進位 ID" @@ -155,46 +182,101 @@ msgstr "464XLAT (CLAT)" msgid "5 Minute Load:" msgstr "5分鐘負載:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:896 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 +msgid "5m (5 minutes)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "6-octet identifier as a hex string - no colons" msgstr "6個八位元組識別碼作為十六進位字串 - 無冒號" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:899 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +msgid "7d (7 days)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "802.11k RRM" +msgstr "802.11k RRM" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "802.11k: Enable beacon report via radio measurements." +msgstr "802.11k:通過無線電測量啟用信標報告。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "802.11k: Enable neighbor report via radio measurements." +msgstr "802.11k:通過無線電測量啟用鄰居報告。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "802.11r Fast Transition" msgstr "802.11r 快速切換" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 +msgid "802.11v: BSS Max Idle. Units: seconds." +msgstr "802.11v:BSS 最大空閒。單位:秒。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "802.11v: Basic Service Set (BSS) transition management." +msgstr "802.11v:基本服務集 (BSS) 轉換管理。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +msgid "802.11v: Local Time Zone Advertisement in management frames." +msgstr "802.11v:管理幀中的本地時區通告。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "" +"802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer." +msgstr "802.11v:代理ARP使非AP STA能夠更長時間地保持節能狀態。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1629 +msgid "802.11v: Time Advertisement in management frames." +msgstr "802.11v:管理幀中的時間播發。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode " +"for stations)." +msgstr "802.11v:無線網路管理 (WNM) 睡眠模式(工作站的擴展睡眠模式)。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "" +"802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents " +"reinstallation attacks." +msgstr "802.11v:無線網路管理 (WNM) 睡眠模式修復:防止重新安裝攻擊。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w Association SA Query maximum timeout" msgstr "802.11w 關聯 SA 查詢最大逾時" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w Association SA Query retry timeout" msgstr "802.11w 關聯 SA 查詢重試逾時" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "802.11w Management Frame Protection" msgstr "802.11w 管理訊框保護" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1796 msgid "802.11w maximum timeout" msgstr "802.11w 最大逾時時間" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1714 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1803 msgid "802.11w retry timeout" msgstr "802.11w 重試逾時時間" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1020 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 msgid "BSSID" msgstr "" "基本服務組識別碼 (BSSID)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 msgid "ESSID" msgstr "" "擴充服務集定識別碼(ESSID)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "IPv4-Netmask" msgstr "IPv4-網路遮罩" @@ -206,34 +288,49 @@ msgstr "LED 組態" msgid "LED Name" msgstr "LED 名稱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:914 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:961 msgid "NDP-Proxy" msgstr "NDP 代理" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:791 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:831 msgid "RA Flags" msgstr "RA 標記" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "RA Hop Limit" msgstr "RA 跳數限制" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "RA Lifetime" msgstr "RA 生命週期" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "RA MTU" msgstr "RA MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:803 msgid "RA-Service" msgstr "RA 服務" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 +msgid "" +"/#/ matches any domain. /example.com/ returns " +"NXDOMAIN." +msgstr "" +"/#/ 相符任何網域名稱。/example.com/ 返回 NXDOMAIN。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +msgid "" +"/example.com/# returns NULL addresses (0.0.0.0 and " +"::) for example.com and its subdomains." +msgstr "" +"/example.com/# 對 example.com 及其子網域名稱返回無效位址 " +"(0.0.0.0 和 ::) 。" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:87 msgctxt "nft relational \">\" operator expression" msgid "%s greater than %s" -msgstr "%s大於%s" +msgstr "%s大於%s" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:85 msgctxt "nft relational \">=\" operator expression" @@ -275,11 +372,21 @@ msgctxt "nft not in set match expression" msgid "%s not in set %s" msgstr "%s 不在集合 %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:370 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:86 +msgid "" +"A batman-adv node can either run in server mode (sharing its internet " +"connection with the mesh) or in client mode (searching for the most suitable " +"internet connection in the mesh) or having the gateway support turned off " +"entirely (which is the default setting)." +msgstr "" +"batman-adv節點可以在伺服器模式(與網格共用其互聯網連接)或用戶端模式(在網格" +"中搜索最合適的互聯網連接)或完全關閉閘道支援(這是預設設置)下運行。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:424 msgid "A configuration for the device \"%s\" already exists" msgstr "設備“%s”的配置已存在" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2779 msgid "A directory with the same name already exists." msgstr "已存在同名的目錄。" @@ -287,25 +394,90 @@ msgstr "已存在同名的目錄。" msgid "A new login is required since the authentication session expired." msgstr "因為身分驗證會話已逾期,需要重新登入。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 msgid "A43C + J43 + A43" msgstr "A43C + J43 + A43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 msgid "A43C + J43 + A43 + V43" msgstr "A43C + J43 + A43 + V43" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1516 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1584 msgid "ADSL" msgstr "ADSL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1558 +msgid "ADSL (G.992.1) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1559 +msgid "ADSL (G.992.1) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1552 +msgid "ADSL (all variants) Annex A/L/M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1548 +msgid "ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1553 +msgid "ADSL (all variants) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1549 +msgid "ADSL (all variants) Annex B + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1554 +msgid "ADSL (all variants) Annex B/J" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1550 +msgid "ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1556 +msgid "ADSL (all variants) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 +msgid "ADSL2 (G.992.3) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +msgid "ADSL2 (G.992.3) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1563 +msgid "ADSL2 (G.992.3) Annex L" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +msgid "ADSL2 (G.992.3) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +msgid "ADSL2+ (G.992.5) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1566 +msgid "ADSL2+ (G.992.5) Annex B" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +msgid "ADSL2+ (G.992.5) Annex M" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1557 msgid "ANSI T1.413" msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:65 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:65 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:91 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 msgid "APN" msgstr "APN" @@ -338,29 +510,39 @@ msgstr "ARP 監視尚不支援已選擇的政策!" msgid "ARP retry threshold" msgstr "ARP重試門檻" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:631 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:637 msgid "ARP traffic table \"%h\"" msgstr "ARP 流量標籤\"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1511 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "" +"ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast " +"to the STA MAC address. Note: This is not Directed Multicast Service (DMS) " +"in 802.11v. Note: might break receiver STA multicast expectations." +msgstr "" +"具有組播目標 MAC 的 ARP、IPv4 和 IPv6(甚至 802.1Q)將單播到 STA MAC 位址。注" +"意:這不是 802.11v 中的定向組播服務 (DMS)。注意:可能會破壞接收方 STA 組播" +"預期。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1579 msgid "ATM (Asynchronous Transfer Mode)" msgstr "ATM (非同步傳輸模式)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "ATM Bridges" msgstr "ATM橋接" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1632 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" msgstr "ATM虛擬通道識別(VCI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1565 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1633 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 msgid "ATM Virtual Path Identifier (VPI)" msgstr "ATM虛擬路徑識別(VPI)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1532 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1600 msgid "" "ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " "Linux network interfaces which can be used in conjunction with DHCP or PPP " @@ -369,26 +551,22 @@ msgstr "" "ATM橋接是以AAL5協定封裝乙太網路如同虛擬Linux網路界面卡,用於連接DHCP或PPP來撥" "號連接到網際網路。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1639 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 msgid "ATM device number" msgstr "ATM裝置號碼" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "ATU-C System Vendor ID" -msgstr "ATU-C 系統廠牌 ID" - #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:266 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:548 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:552 msgid "Absent Interface" msgstr "缺少的介面" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 msgid "Accept DNS queries only from hosts whose address is on a local subnet." msgstr "僅在網卡所屬的子網路中提供 DNS 服務。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept local" msgstr "接受本地連接" @@ -397,7 +575,7 @@ msgctxt "nft accept action" msgid "Accept packet" msgstr "接受數據包" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:647 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:701 msgid "Accept packets with local source addresses" msgstr "接受具有本地來源位址的封包" @@ -405,16 +583,25 @@ msgstr "接受具有本地來源位址的封包" msgid "Access Concentrator" msgstr "存取集線器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:991 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 msgid "Access Point" msgstr "存取點 (AP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:60 +msgid "Access Point Isolation" +msgstr "接入點隔離" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:99 +msgid "Access Technologies" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:388 msgid "Actions" msgstr "動作" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:14 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:134 msgid "Active" msgstr "已啓用" @@ -452,8 +639,8 @@ msgstr "活動的 IPv6 規則" msgid "Active-Backup policy (active-backup, 1)" msgstr "啟動-備份規則 (active-backup, 1)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 msgid "Ad-Hoc" msgstr "無線漫遊(Ad-Hoc)" @@ -470,18 +657,18 @@ msgstr "自適應發送負載平衡 (balance-tlb, 5)" #: modules/luci-base/htdocs/luci-static/resources/form.js:2236 #: modules/luci-base/htdocs/luci-static/resources/form.js:2249 #: modules/luci-base/htdocs/luci-static/resources/form.js:2257 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3578 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3587 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 msgid "Add" -msgstr "新增" +msgstr "加入" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1604 msgid "Add ATM Bridge" msgstr "新增 ATM 橋接" @@ -501,11 +688,11 @@ msgstr "新增 LED 動作" msgid "Add VLAN" msgstr "新增 VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1371 msgid "Add device configuration" msgstr "加入裝置設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1252 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1311 msgid "Add device configuration…" msgstr "加入裝置設定…" @@ -513,18 +700,18 @@ msgstr "加入裝置設定…" msgid "Add instance" msgstr "加入實體" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:171 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 msgid "Add key" msgstr "加入金鑰" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:409 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:496 msgid "Add local domain suffix to names served from hosts files." msgstr "將本地網域尾碼加入到主機檔案提供的名稱。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1195 msgid "Add new interface..." msgstr "新增新介面…" @@ -532,6 +719,10 @@ msgstr "新增新介面…" msgid "Add peer" msgstr "新增 對等方" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:945 +msgid "Add static forward and reverse DNS entries for this host." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:335 msgid "Add to Blacklist" msgstr "新增至黑名單" @@ -540,11 +731,11 @@ msgstr "新增至黑名單" msgid "Add to Whitelist" msgstr "新增至白名單" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:442 msgid "Additional hosts files" msgstr "額外的 hosts 檔案" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:503 msgid "Additional servers file" msgstr "額外的伺服器文件" @@ -561,7 +752,11 @@ msgstr "額外的伺服器文件" msgid "Address" msgstr "位址" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:22 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:410 +msgid "Address families of \"Relay from\" and \"Relay to address\" must match." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:21 msgctxt "nft meta nfproto" msgid "Address family" msgstr "地址家族" @@ -574,7 +769,7 @@ msgstr "位址設定無效" msgid "Address to access local relay bridge" msgstr "將存取的本地中繼橋接位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:297 msgid "Addresses" msgstr "位址" @@ -583,29 +778,29 @@ msgstr "位址" msgid "Administration" msgstr "管理" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:478 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1630 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:988 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:128 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:982 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 msgid "Advanced Settings" msgstr "進階設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:337 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:391 msgid "Advanced device options" msgstr "進階裝置選項" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:567 msgid "Ageing time" msgstr "老化時間" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "彙總發送功率(ACTATP)" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:50 +msgid "Aggregate Originator Messages" +msgstr "聚合發起方消息" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:260 msgid "Aggregation Selection Logic" @@ -640,17 +835,17 @@ msgstr "別名介面" msgid "Alias of \"%s\"" msgstr "\"%s\" 的別名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 msgid "All servers" msgstr "所有伺服器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:453 msgid "" "Allocate IP addresses sequentially, starting from the lowest available " "address." msgstr "按照順序分配 IP 位址,從最低的可用位址開始。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 msgid "Allocate IPs sequentially" msgstr "依序分配 IP" @@ -658,11 +853,11 @@ msgstr "依序分配 IP" msgid "Allow SSH password authentication" msgstr "允許 SSH 密碼驗證" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Allow AP mode to disconnect STAs based on low ACK condition" msgstr "允許 AP 模式針對低 ACK 情形中斷 STA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1089 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 msgid "Allow all except listed" msgstr "允許全部 除 已列表清單" @@ -670,15 +865,15 @@ msgstr "允許全部 除 已列表清單" msgid "Allow full UCI access for legacy applications" msgstr "允許UCI完整的存取老舊應用程式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "Allow legacy 802.11b rates" msgstr "允許舊型 802.11b 頻率" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1083 msgid "Allow listed only" msgstr "僅允許列表內" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 msgid "Allow localhost" msgstr "允許本機" @@ -699,19 +894,24 @@ msgid "Allow system feature probing" msgstr "允許系統功能探測" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" +msgid "Allow the root user to log in with password" msgstr "允許 root 用戶以密碼登入" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 msgid "Allowed IPs" msgstr "允許的 IP群" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:86 +msgid "Allowed network technology" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:315 msgid "AllowedIPs setting is invalid" msgstr "AllowedIPs 設定無效" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:708 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:776 msgid "Always" msgstr "始終" @@ -723,11 +923,11 @@ msgstr "永遠關閉(內核:無)" msgid "Always on (kernel: default-on)" msgstr "永遠開啟 (內核:預設開啟)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:537 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:624 msgid "Always send DHCP Options. Sometimes needed, with e.g. PXELinux." msgstr "始終傳送 DHCP 選項。 有時需要,例如 PXELinux。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" @@ -735,10 +935,14 @@ msgstr "" "永遠使用 40MHz 頻道,即使次要頻道有重疊。使用這個選項並不符合 IEEE " "802.11n-2009 規範!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "Amount of Duplicate Address Detection probes to send" msgstr "要傳送的重複位址偵測探查數量" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 +msgid "Amount of seconds to wait for the modem to become ready" +msgstr "等待數據機準備就緒的秒數" + #: modules/luci-base/htdocs/luci-static/resources/form.js:608 msgid "An error occurred while saving the form:" msgstr "儲存表單時發生錯誤:" @@ -747,78 +951,27 @@ msgstr "儲存表單時發生錯誤:" msgid "An optional, short description for this device" msgstr "此裝置的可選簡短描述" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1546 msgid "Annex" msgstr "附件" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 -msgid "Annex A + L + M (all)" -msgstr "附件 A + L + M (全部)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1493 -msgid "Annex A G.992.1" -msgstr "附件A G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1494 -msgid "Annex A G.992.2" -msgstr "附件A G.992.2" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1495 -msgid "Annex A G.992.3" -msgstr "附件A G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1496 -msgid "Annex A G.992.5" -msgstr "附件A G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1486 -msgid "Annex B (all)" -msgstr "附件B (全部)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1489 -msgid "Annex B G.992.1" -msgstr "附件B G.992.1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1490 -msgid "Annex B G.992.3" -msgstr "附件B G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1491 -msgid "Annex B G.992.5" -msgstr "附件B G.992.5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1487 -msgid "Annex J (all)" -msgstr "附件J (全部)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1497 -msgid "Annex L G.992.3 POTS 1" -msgstr "附件L G.992.3 POTS 1" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1488 -msgid "Annex M (all)" -msgstr "附件M (全部)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1498 -msgid "Annex M G.992.3" -msgstr "附件M G.992.3" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1499 -msgid "Annex M G.992.5" -msgstr "附件M G.992.5" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "" +"Announce NAT64 prefix in RA " +"messages." +msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:945 msgid "Announce this device as IPv6 DNS server." msgstr "宣告該裝置為 IPv6 DNS 伺服器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:817 msgid "" "Announce this device as default router if a local IPv6 default route is " "present." msgstr "如果存在本地 IPv6 預設路由,則宣告此裝置為預設路由器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:779 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:819 msgid "" "Announce this device as default router if a public IPv6 prefix is available, " "regardless of local default route availability." @@ -826,21 +979,21 @@ msgstr "" "如果公共 IPv6 前綴可用,則宣告此裝置為預設路由器,而不考慮本地預設路由的可用" "性。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:781 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:821 msgid "" "Announce this device as default router regardless of whether a prefix or " "default route is present." msgstr "宣告該裝置為預設路由器,不管是否有前綴或預設路由。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 msgid "Announced DNS domains" msgstr "已發布的 DNS 網域群" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:889 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 msgid "Announced IPv6 DNS servers" msgstr "宣告的 IPv6 DNS 伺服器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 msgid "Anonymous Identity" msgstr "匿名身份" @@ -852,7 +1005,7 @@ msgstr "自動掛載檔案系統" msgid "Anonymous Swap" msgstr "自動掛載swap分區" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:512 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:518 msgctxt "nft match any traffic" msgid "Any packet" msgstr "任何數據包" @@ -864,11 +1017,11 @@ msgstr "任何數據包" msgid "Any zone" msgstr "任意區域" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 msgid "Apply DHCP Options to this net. (Empty = all clients)." msgstr "始終傳送 DHCP 選項。 有時需要,例如 PXELinux。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4659 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4713 msgid "Apply and keep settings" msgstr "套用並保留設定" @@ -876,44 +1029,48 @@ msgstr "套用並保留設定" msgid "Apply backup?" msgstr "是否套用備份?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4685 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4739 msgid "Apply request failed with status %h" msgstr "套用要求失敗,狀態 %h" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2175 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4402 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4522 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4456 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4576 msgid "Apply unchecked" msgstr "應用未核取" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4709 msgid "Apply with revert after connectivity loss" msgstr "連線遺失後套用還原" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4595 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4649 msgid "Applying configuration changes… %ds" msgstr "組態變更套用中… %ds" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Architecture" msgstr "架構" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:152 msgid "Arp-scan" msgstr "Arp 掃描" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" msgstr "分配一部分給定長度的公共IPv6地址前綴於此介面" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:917 +msgid "Assign new, freeform tags to this entry." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "" "Assign prefix parts using this hexadecimal subprefix ID for this interface." msgstr "分配使用此十六進制子前綴ID的前綴部分於此介面." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2266 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:366 msgid "Associated Stations" msgstr "已連接裝置" @@ -922,16 +1079,16 @@ msgstr "已連接裝置" msgid "Associations" msgstr "已連接裝置" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:126 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:127 msgid "" "At least %h per %h, burst of %h" msgstr "" "每個 %h 至少 %h,%h 爆發" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:123 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:124 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:125 msgid "" "At most %h per %h, burst of %h" @@ -942,25 +1099,26 @@ msgstr "" msgid "Attempt to enable configured mount points for attached devices" msgstr "嘗試對連接的裝置啟用可設定的掛載" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:145 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" msgstr "認證群組" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1617 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1706 msgid "Authentication" msgstr "認證" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:76 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:79 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 msgid "Authentication Type" msgstr "認證類型" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 msgid "Authoritative" msgstr "授權" -#: modules/luci-base/luasrc/view/sysauth.htm:17 +#: modules/luci-base/ucode/template/sysauth.ut:17 #: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11 msgid "Authorization Required" msgstr "需要授權" @@ -968,7 +1126,9 @@ msgstr "需要授權" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:120 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:112 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:107 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:116 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 @@ -986,7 +1146,7 @@ msgstr "智慧家庭自動控制網路 (HNCP)" msgid "Automatically check filesystem for errors before mounting" msgstr "在掛載前先檢查檔案系統中是否含有錯誤" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "" "Automatically handle multiple uplink interfaces using source-based policy " "routing." @@ -1008,6 +1168,10 @@ msgstr "自動掛載檔案系統" msgid "Automount Swap" msgstr "自動掛載swap分區" +#: protocols/luci-proto-autoip/htdocs/luci-static/resources/protocol/autoip.js:6 +msgid "Avahi IPv4LL" +msgstr "Avahi IPv4LL" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 msgid "Available" msgstr "可用的" @@ -1026,11 +1190,15 @@ msgstr "可用的" msgid "Average:" msgstr "平均:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1505 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:70 +msgid "Avoid Bridge Loops" +msgstr "避免網橋環路" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1573 msgid "B43 + B43C" msgstr "B43 + B43C" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1506 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 msgid "B43 + B43C + V43" msgstr "B43 + B43C + V43" @@ -1038,15 +1206,19 @@ msgstr "B43 + B43C + V43" msgid "BR / DMR / AFTR" msgstr "BR / DMR / AFTR" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1649 +msgid "BSS Transition" +msgstr "BSS 過渡" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1752 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:379 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1841 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:405 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:149 msgid "BSSID" msgstr "BSSID" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3246 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3255 msgid "Back" msgstr "返回" @@ -1055,11 +1227,7 @@ msgstr "返回" msgid "Back to Overview" msgstr "返回至總覽" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "返回至設定" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:836 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:839 msgid "Back to peer configuration" msgstr "返回 peer 設定" @@ -1072,16 +1240,15 @@ msgid "Backup / Flash Firmware" msgstr "備份/燒錄韌體" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 msgid "Backup file list" msgstr "備份檔列表" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:502 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:495 msgid "Band" msgstr "頻段" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:377 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:431 msgid "Base device" msgstr "基礎裝置" @@ -1089,12 +1256,40 @@ msgstr "基礎裝置" msgid "Base64-encoded public key of this interface for sharing." msgstr "此介面用於分享的 Base64 編碼的公鑰。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:974 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:10 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:41 +msgid "Batman Device" +msgstr "Batman設備" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:10 +msgid "Batman Interface" +msgstr "Batman介面" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:81 +msgid "" +"Batman-adv has a built-in layer 2 fragmentation for unicast data flowing " +"through the mesh which will allow to run batman-adv over interfaces / " +"connections that don't allow to increase the MTU beyond the standard " +"Ethernet packet size of 1500 bytes. When the fragmentation is enabled batman-" +"adv will automatically fragment over-sized packets and defragment them on " +"the other end. Per default fragmentation is enabled and inactive if the " +"packet fits but it is possible to deactivate the fragmentation entirely." +msgstr "" +"Batman-adv 具有內建的第 2 層分段,用於流經網格的單播資料,這將允許在不允許將 " +"MTU 增加到超過 1500 位元組的標準以太網資料封包大小的介面/連接上執行 batman-" +"adv。 啟用分段後,batman-adv 將自動對超大資料封包進行分段並在另一端對它們進行" +"碎片整理。 預設情況下,如果資料封包適合,則啟用和停用分段,但可以完全停用分" +"段。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:968 msgid "Beacon Interval" msgstr "訊號間隔" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1623 +msgid "Beacon Report" +msgstr "信標報告" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 msgid "" "Below is the determined list of files to backup. It consists of changed " "configuration files marked by opkg, essential base files and the user " @@ -1107,7 +1302,7 @@ msgstr "" msgid "Bind NTP server" msgstr "綁定NTP伺服器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:337 msgid "Bind dynamically to interfaces rather than wildcard address." msgstr "動態繫結到介面而不是萬用字元位址 (推薦為 linux 預設值)。" @@ -1116,18 +1311,32 @@ msgstr "動態繫結到介面而不是萬用字元位址 (推薦為 linux 預設 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind interface" msgstr "綁定介面" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:676 +msgid "" +"Bind service records to a domain name: specify the location of services." +msgstr "綁定服務記錄到功能變數名稱:指定服務的位置。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:637 +msgid "" +"Bind service records to a domain name: specify the location of services. See " +"RFC2782." +msgstr "" +"將服務記錄綁定到域名:指定服務的位置。請參閱 rfc2782 。" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:59 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:69 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:142 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:59 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 msgid "Bind the tunnel to this interface (optional)." @@ -1137,67 +1346,79 @@ msgstr "綁定通道到此介面 (可選的)。" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:171 msgid "Bitrate" -msgstr "位元率" +msgstr "位元速率" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:65 +msgid "Bonding Mode" +msgstr "綁定模式" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:201 msgid "Bonding Policy" msgstr "保固政策" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:404 +msgid "Both \"Relay from\" and \"Relay to address\" must be specified." +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/network.js:2995 #: modules/luci-compat/luasrc/model/network.lua:1421 msgid "Bridge" msgstr "橋接" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:491 msgctxt "MACVLAN mode" msgid "Bridge (Support direct communication between MAC VLANs)" msgstr "橋接 (支援 MAC VLAN 間的直連)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:481 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:393 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:498 msgid "Bridge VLAN filtering" msgstr "橋接 VLAN 過濾" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:344 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 msgid "Bridge device" msgstr "橋接裝置" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:497 msgid "Bridge port specific options" msgstr "橋接連接埠特定選項" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 msgid "Bridge ports" msgstr "橋接連接埠" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:635 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:641 msgid "Bridge traffic table \"%h\"" -msgstr "橋樑交通表“%h”" +msgstr "橋接流量表「%h」" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1572 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1640 msgid "Bridge unit number" msgstr "橋接單位號碼" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up empty bridge" msgstr "允許啟動空橋接" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:592 msgid "Bring up on boot" msgstr "開機自動執行" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:558 msgid "Bring up the bridge interface even if no ports are attached" msgstr "即使沒有介面附加到橋接,也啟動它" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:940 +msgid "Broadcast" +msgstr "" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 msgid "Broadcast policy (broadcast, 3)" msgstr "廣播政策(廣播,3)" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2845 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4153 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2869 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4207 msgid "Browse…" msgstr "瀏覽…" @@ -1205,14 +1426,36 @@ msgstr "瀏覽…" msgid "Buffered" msgstr "已緩衝" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:130 +msgid "" +"CA certificate (PEM encoded; Use instead of system-wide store to verify the " +"gateway certificate." +msgstr "CA 證書 (PEM 編碼;而不是使用系統範圍的儲存來驗證閘道證書。" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:182 msgid "CA certificate; if empty it will be saved after the first connection." msgstr "CA 憑證;如果留空會在第一次連線後儲存。" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:79 +msgid "CHAP" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 msgid "CLAT configuration failed" msgstr "CLAT 組態失敗" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:265 +msgid "CNAME" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +msgid "CNAME or fqdn" +msgstr "cname或fqdn" + +#: protocols/luci-proto-cni/htdocs/luci-static/resources/protocol/cni.js:6 +msgid "CNI (Externally managed interface)" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 msgid "CPU usage (%)" msgstr "CPU 使用率 (%)" @@ -1227,18 +1470,23 @@ msgstr "已快取" msgid "Call failed" msgstr "呼叫失敗" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2933 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4162 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4651 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:469 +msgid "" +"Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing." +msgstr "如果ISP具有IPv6名稱服務器,但不提供IPv6路由,則很有用。" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4216 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4705 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1142 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2051 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2140 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:295 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:203 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:487 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:209 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:485 msgid "Cancel" msgstr "取消" @@ -1246,32 +1494,32 @@ msgstr "取消" msgid "Cannot parse configuration: %s" msgstr "無法解析設定:%s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:562 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:568 msgctxt "Chain hook: forward" msgid "Capture incoming packets addressed to other hosts" msgstr "捕獲發往其他主機的傳入數據包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:554 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:560 msgctxt "Chain hook: prerouting" msgid "Capture incoming packets before any routing decision" msgstr "在任何路由決策之前捕獲傳入的數據包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:558 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:564 msgctxt "Chain hook: input" msgid "Capture incoming packets routed to the local system" msgstr "捕獲路由到本地系統的傳入數據包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:570 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:576 msgctxt "Chain hook: postrouting" msgid "Capture outgoing packets after any routing decision" msgstr "在任何路由決策後捕獲傳出數據包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:566 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:572 msgctxt "Chain hook: output" msgid "Capture outgoing packets originating from the local system" msgstr "捕獲來自本地系統的傳出數據包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:556 msgctxt "Chain hook: ingress" msgid "Capture packets directly after the NIC received them" msgstr "NIC收到後直接抓包" @@ -1280,24 +1528,32 @@ msgstr "NIC收到後直接抓包" msgid "Category" msgstr "類別" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:114 +msgid "Cell ID" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:113 +msgid "Cell Location" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 msgid "Certificate constraint (Domain)" msgstr "憑證約束 (網域)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 msgid "Certificate constraint (SAN)" msgstr "憑證約束 (多網域)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 msgid "Certificate constraint (Subject)" msgstr "憑證約束 (主體)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 msgid "Certificate constraint (Wildcard)" msgstr "憑證約束 (萬用字元)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1595 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "" "Certificate constraint substring - e.g. /CN=wifi.mycompany.com
    See " "`logread -f` during handshake for actual values" @@ -1305,22 +1561,22 @@ msgstr "" "憑證約束子字串 — 例如:/CN=wifi.mycompany.com
    當握手時請`logread -f`來看" "實際值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1601 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (exact match)" msgstr "憑證約束違反 DNA SAN 參數(如果可用)
    或主題 CN(完全符合)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1604 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1693 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "" "Certificate constraint(s) against DNS SAN values (if available)
    or " "Subject CN (suffix match)" msgstr "憑證約束違反 DNA SAN 參數(如果可用)
    或主題 CN(前綴符合)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1598 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "" "Certificate constraint(s) via Subject Alternate Name values
    (supported " "attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" @@ -1334,16 +1590,16 @@ msgstr "" msgid "Chain" msgstr "鏈" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:574 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:580 msgctxt "Yet unknown nftables chain hook" msgid "Chain hook \"%h\"" msgstr "鏈鉤“%h”" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 msgid "Changes" msgstr "待修改" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4721 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4775 msgid "Changes have been reverted." msgstr "設定值已還原." @@ -1354,18 +1610,19 @@ msgstr "修改可存取這裝置的管理員密碼" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:511 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1750 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:504 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1839 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:402 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:170 msgid "Channel" msgstr "頻道" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:368 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 msgid "Channel Analysis" msgstr "通道分析" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:377 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:403 msgid "Channel Width" msgstr "通道寬度" @@ -1373,7 +1630,7 @@ msgstr "通道寬度" msgid "Check filesystems before mount" msgstr "在掛載前先檢查檔案系統" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Check this option to delete the existing networks from this radio." msgstr "核取這個選項從此無線網路中刪除現有網路。" @@ -1390,8 +1647,8 @@ msgstr "檢查映像檔…" msgid "Choose mtdblock" msgstr "選擇 mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "" "Choose the firewall zone you want to assign to this interface. Select " "unspecified to remove the interface from the associated zone or " @@ -1401,7 +1658,7 @@ msgstr "" "選擇您要指定給這介面的防火牆區. 撿選unspecified以便從指定區域除這個" "介面或者填寫create欄以便定義附加這個介面到一個新的區域上." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 msgid "" "Choose the network(s) you want to attach to this wireless interface or fill " "out the custom field to define a new network." @@ -1409,7 +1666,7 @@ msgstr "" "選擇您要附加到無線網路介面的多個網路或者填寫create 以便定義一個新的" "網路." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1227 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1229 msgid "Cipher" msgstr "加密方式" @@ -1431,9 +1688,10 @@ msgstr "" "按一下「儲存 mtdblock」以下載指定的 mtdblock 檔案。(注意:此功能適用於專業人" "士!)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:992 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3865 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:88 msgid "Client" msgstr "用戶端" @@ -1442,9 +1700,9 @@ msgstr "用戶端" msgid "Client ID to send when requesting DHCP" msgstr "當要求DHCP時要傳送的用戶識別碼ID" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4399 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:167 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4453 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:173 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:179 msgid "Close" msgstr "關閉" @@ -1459,20 +1717,20 @@ msgid "" "persist connection" msgstr "幾秒後關閉閒置的連線, 打0代表永遠連線" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "關閉清單..." - #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2175 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2264 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:391 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:352 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:355 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:72 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:66 msgid "Collecting data..." msgstr "正在收集資料中…" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:250 +msgid "Collisions seen" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 msgid "Command" msgstr "命令" @@ -1489,7 +1747,7 @@ msgstr "指令失敗" msgid "Comment" msgstr "註解" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "" "Complicates key reinstallation attacks on the client side by disabling " "retransmission of EAPOL-Key frames that are used to install keys. This " @@ -1509,31 +1767,30 @@ msgstr "計算傳出的校驗和(自選)." #: protocols/luci-proto-nebula/htdocs/luci-static/resources/protocol/nebula.js:40 msgid "Config File" -msgstr "" +msgstr "配置檔" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4382 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4436 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 msgid "Configuration" msgstr "組態" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:692 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:690 msgid "Configuration Export" msgstr "設定檔案匯出" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4570 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4624 msgid "Configuration changes applied." msgstr "組態變更已套用。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4508 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4562 msgid "Configuration changes have been rolled back!" msgstr "組態變更已被復原!" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 msgid "Configuration failed" msgstr "組態已失敗" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "" "Configures data rates based on the coverage cell density. Normal configures " "basic rates to 6, 12, 24 Mbps if legacy 802.11b rates are not used else to " @@ -1547,30 +1804,30 @@ msgstr "" "則高速將基本速率設置為12、24 Mbps,否則將其設置為11 Mbps。 超高速將24 Mbps設" "置為起跳速率. 凡低於最低基本速率將不提供支援." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:775 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:815 msgid "" "Configures the default router advertisement in RA messages." msgstr "" "設定 RA 訊息中的預設路由器宣告。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:764 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:804 msgid "" "Configures the operation mode of the RA service on this interface." msgstr "" "設定此介面上 RA 服務的操作模式。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:926 msgid "Configures the operation mode of the DHCPv6 service on this interface." msgstr "設定此介面上 DHCPv6 服務的操作模式。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 msgid "" "Configures the operation mode of the NDP proxy service on this interface." msgstr "設定此介面上 NDP 代理服務的操作模式。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1357 msgid "Configure…" msgstr "設定…" @@ -1582,9 +1839,10 @@ msgstr "確認中斷連線" msgid "Confirmation" msgstr "再確認" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:101 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 msgid "Connected" msgstr "已連線" @@ -1594,11 +1852,11 @@ msgstr "已連線" msgid "Connection attempt failed" msgstr "連線嘗試失敗" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:8 msgid "Connection attempt failed." msgstr "嘗試連線失敗." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "Connection endpoint" msgstr "連線端點" @@ -1610,7 +1868,7 @@ msgstr "連接遺失" msgid "Connections" msgstr "連線數" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4644 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4698 msgid "Connectivity change" msgstr "連線變更" @@ -1638,9 +1896,9 @@ msgstr "當任何ARP IP目標可到達時, 啟用實體界面(任一,0)" msgid "Contents have been saved." msgstr "內容已儲存。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:433 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:800 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:269 msgid "Continue" @@ -1651,16 +1909,16 @@ msgctxt "nft jump action" msgid "Continue in %h" msgstr "繼續%h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:128 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:129 msgid "Continue in calling chain" msgstr "繼續調用鏈" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:544 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:550 msgctxt "Chain policy: accept" msgid "Continue processing unmatched packets" msgstr "繼續處理不匹配的數據包" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4544 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4598 msgid "" "Could not regain access to the device after applying the configuration " "changes. You might need to reconnect if you modified network related " @@ -1673,20 +1931,20 @@ msgstr "" msgid "Country" msgstr "國家" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 msgid "Country Code" msgstr "國別碼" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 msgid "Coverage cell density" msgstr "無線電波涵蓋密度" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2041 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2130 msgid "Create / Assign firewall-zone" msgstr "建立/指定防火牆作用區" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1174 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1233 msgid "Create interface" msgstr "建立介面" @@ -1698,7 +1956,7 @@ msgstr "致命錯誤" msgid "Cron Log Level" msgstr "Cron 日誌等級" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:584 msgid "Current power" msgstr "目前功率" @@ -1740,31 +1998,31 @@ msgstr "" "如果可以的話,自訂這個裝置的 LED " "行為。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:673 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:741 msgid "DAD transmits" msgstr "DAD 傳輸" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "DAE-Client" msgstr "DAE-客戶端" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "DAE-Port" msgstr "DAE-連接埠" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "DAE-Secret" msgstr "DAE-金鑰" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:611 msgid "DHCP Options" msgstr "DHCP 選項" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:483 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:500 msgid "DHCP Server" msgstr "DHCP伺服器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:245 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:249 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:62 msgid "DHCP and DNS" msgstr "DHCP 與 DNS" @@ -1775,16 +2033,22 @@ msgstr "DHCP 與 DNS" msgid "DHCP client" msgstr "DHCP用戶端" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "DHCP-Options" msgstr "DHCP 選項" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "" +"DHCPv4 leasetime is used as limit and preferred lifetime of the " +"IPv6 prefix." +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 msgid "DHCPv6 client" msgstr "DHCPv6 客戶端" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 msgid "DHCPv6-Service" msgstr "DHCPv6-服務" @@ -1796,19 +2060,19 @@ msgstr "DHCPv6-服務" msgid "DNS" msgstr "DNS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "DNS forwardings" msgstr "DNS封包轉發" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:444 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:531 msgid "DNS query port" msgstr "DNS 查詢埠號" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:949 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1008 msgid "DNS search domains" msgstr "DNS 搜尋網域" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:437 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 msgid "DNS server port" msgstr "DNS 伺服器埠號" @@ -1816,7 +2080,7 @@ msgstr "DNS 伺服器埠號" msgid "DNS setting is invalid" msgstr "DNS 設定無效" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "DNS weight" msgstr "DNS 權重" @@ -1824,11 +2088,11 @@ msgstr "DNS 權重" msgid "DNS-Label / FQDN" msgstr "DNS-標籤 / FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:483 msgid "DNSSEC" msgstr "DNSSEC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:488 msgid "DNSSEC check unsigned" msgstr "DNSSEC 檢查未簽章" @@ -1840,39 +2104,47 @@ msgstr "DPD 閒置逾時" msgid "DS-Lite AFTR address" msgstr "DS-Lite AFTR 位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1543 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 msgid "DSL" -msgstr "DSL" +msgstr "數位用戶線路(DSL)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 msgid "DSL Status" -msgstr "DSL 狀態" +msgstr "DSL狀態" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1514 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1582 msgid "DSL line mode" msgstr "DSL 線路模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "DTIM Interval" msgstr "DTIM 間隔" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:59 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:903 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:136 msgid "DUID" msgstr "DHCP獨立式別碼DUID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Data Rate" msgstr "資料速率" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:76 +msgid "Data Received" +msgstr "已接收" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:77 +msgid "Data Transmitted" +msgstr "已傳送" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:186 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:197 msgid "Debug" msgstr "除錯" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:774 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:814 msgid "Default router" msgstr "預設路由器" @@ -1880,7 +2152,7 @@ msgstr "預設路由器" msgid "Default state" msgstr "預設狀態" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 msgid "" "Define additional DHCP options, for example " "\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " @@ -1889,61 +2161,62 @@ msgstr "" "定義額外的 DHCP 選項,例如「6,192.168.2.1,192.168.2.2」將會通告" "不同的 DNS 伺服器到客戶端。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "" "Defines a mapping of Linux internal packet priority to VLAN header priority " "but for outgoing frames" msgstr "定義 Linux 內部封包優先順序到 VLAN 標頭優先順序的對應但用於傳出框架" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "" "Defines a mapping of VLAN header priority to the Linux internal packet " "priority on incoming frames" msgstr "在傳入框架上定義 VLAN 標頭優先順序到 Linux 內部封包優先順序的對應" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 msgid "Defines a specific MTU for this route" msgstr "為此路由定義一個特定的 MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "Delegate IPv6 prefixes" msgstr "委派 IPv6 首碼" #: modules/luci-base/htdocs/luci-static/resources/form.js:2310 #: modules/luci-base/htdocs/luci-static/resources/form.js:2740 #: modules/luci-base/htdocs/luci-static/resources/form.js:2744 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3562 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2902 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3571 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2926 #: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 #: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 msgid "Delete" msgstr "刪除" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:199 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:205 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:211 msgid "Delete key" msgstr "刪除金鑰" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2804 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2828 msgid "Delete request failed: %s" msgstr "刪除要求失敗: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 msgid "Delete this network" msgstr "刪除這個網路" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1169 msgid "Delivery Traffic Indication Message Interval" msgstr "傳送流量指示訊息間隔" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:342 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:139 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:53 msgid "Description" msgstr "描述" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2898 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2922 msgid "Deselect" msgstr "取消選擇" @@ -1951,11 +2224,11 @@ msgstr "取消選擇" msgid "Design" msgstr "主題" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:732 msgid "Designated master" msgstr "指定的主介面" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:386 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 msgid "Destination" @@ -1990,9 +2263,9 @@ msgstr "目標區域" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:569 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1124 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1485 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:248 @@ -2002,36 +2275,40 @@ msgstr "目標區域" msgid "Device" msgstr "裝置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:913 msgid "Device Configuration" msgstr "裝置組態" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:88 +msgid "Device Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 msgid "Device is not active" msgstr "裝置未啟用" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:233 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:657 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:650 msgid "Device is restarting…" msgstr "裝置重啟中…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:441 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:495 msgid "Device name" msgstr "裝置名稱" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:10 msgid "Device not managed by ModemManager." msgstr "裝置未被\"數據機管理員(ModemManager)\"所管理." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1460 msgid "Device not present" msgstr "裝置不存在" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:341 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:395 msgid "Device type" msgstr "裝置類型" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4543 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4597 msgid "Device unreachable!" msgstr "裝置不可達!" @@ -2039,31 +2316,31 @@ msgstr "裝置不可達!" msgid "Device unreachable! Still waiting for device..." msgstr "裝置不可達!仍在等待裝置中…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1249 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1308 msgid "Devices" msgstr "裝置" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:159 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 msgid "Diagnostics" msgstr "診斷" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:114 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:106 msgid "Dial number" msgstr "撥號號碼" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2700 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2724 msgid "Directory" msgstr "目錄" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:200 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Disable" msgstr "停用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "" "Disable DHCP for " "this interface." @@ -2080,20 +2357,24 @@ msgstr "停用 DNS Lookups" msgid "Disable Encryption" msgstr "停用加密" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1179 msgid "Disable Inactivity Polling" msgstr "停用非活動輪詢" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Disable this network" msgstr "停用此網路" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:954 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:948 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1630 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:13 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:121 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:113 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:108 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:117 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:97 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 @@ -2102,33 +2383,32 @@ msgstr "停用此網路" msgid "Disabled" msgstr "已停用" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:543 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 msgctxt "Label indicating that WireGuard peer is disabled" msgid "Disabled" msgstr "已停用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1193 msgid "Disassociate On Low Acknowledgement" msgstr "低確認(Low Acknowledgement)時取消連線" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:313 msgid "" "Discard upstream responses containing RFC1918 addresses." msgstr "丟棄包含 RFC1918 地址的上游響應。" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:716 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:336 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:351 msgid "Disconnect" msgstr "斷線" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 msgid "Disconnection attempt failed" msgstr "嘗試中斷線連失敗" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:13 msgid "Disconnection attempt failed." msgstr "嘗試中斷線連失敗." @@ -2138,23 +2418,35 @@ msgstr "磁碟空間" #: modules/luci-base/htdocs/luci-static/resources/form.js:611 #: modules/luci-base/htdocs/luci-static/resources/form.js:3022 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3260 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3661 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4514 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1775 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3269 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3715 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1864 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:358 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:45 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:66 msgid "Dismiss" msgstr "關閉" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance Optimization" msgstr "最佳化距離" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:953 msgid "Distance to farthest network member in meters." msgstr "到最遠的網路距離以米表示." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:75 +msgid "Distributed ARP Table" +msgstr "分散式ARP表" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:931 +msgid "" +"Dnsmasq instance to which this DHCP host section is bound. If unspecified, " +"the section is valid for all dnsmasq instances." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:629 msgid "" "Dnsmasq instance to which this boot section is bound. If unspecified, the " "section is valid for all dnsmasq instances." @@ -2162,7 +2454,7 @@ msgstr "" "此引導部分繫結到的 Dnsmasq 實例。 如果未指定,該部分對所有 dnsmasq 實例都有" "效。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:246 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:250 msgid "" "Dnsmasq is a lightweight DHCP server and DNSDHCP 伺服器和 DNS 轉發器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:500 msgid "Do not cache negative replies, e.g. for non-existent domains." msgstr "不快取拒絕的回應,例如:不存在的網域。" @@ -2184,34 +2476,25 @@ msgstr "不快取拒絕的回應,例如:不存在的網域。" msgid "Do not create host route to peer (optional)." msgstr "不要建立主機(host)到節點(peer)的路由(任選)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 msgid "Do not forward DNS queries without dots or domain parts." msgstr "" "不轉發沒有 DNS 名稱的 DNS 請求。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Do not forward queries that cannot be answered by public resolvers." -msgstr "不轉發公用名稱伺服器不能回答的請求。" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:383 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 msgid "Do not forward reverse lookups for local networks." msgstr "對本地網路不轉發反向查詢。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:350 msgid "Do not listen on the specified interfaces." msgstr "不監聽這些介面。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 msgid "Do not offer DHCPv6 service on this interface." msgstr "不在此介面上提供 DHCPv6 服務。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:158 -msgctxt "VLAN port state" -msgid "Do not participate" -msgstr "不參與" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:964 msgid "" "Do not proxy any NDP " "packets." @@ -2222,7 +2505,7 @@ msgstr "" msgid "Do not send a hostname" msgstr "不傳送主機名稱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:766 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:806 msgid "" "Do not send any RA messages on this interface." @@ -2230,11 +2513,11 @@ msgstr "" "不在此介面上傳送任何 RA 訊息。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2790 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2814 msgid "Do you really want to delete \"%s\" ?" msgstr "您確定要刪除「%s」?" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:200 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:206 msgid "Do you really want to delete the following SSH key?" msgstr "您確定要刪除下列 SSH 金鑰?" @@ -2242,11 +2525,11 @@ msgstr "您確定要刪除下列 SSH 金鑰?" msgid "Do you really want to erase all settings?" msgstr "您確定要清除所有設定?" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2788 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2812 msgid "Do you really want to recursively delete the directory \"%s\" ?" msgstr "您真的要遞迴刪除目錄 \"%s\" 嗎?" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:615 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:613 msgid "Do you want to replace the current PSK?" msgstr "是否要取代目前的 PSK?" @@ -2254,15 +2537,17 @@ msgstr "是否要取代目前的 PSK?" msgid "Do you want to replace the current keys?" msgstr "是否要取代目前金鑰?" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:687 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:713 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:766 msgid "Domain" msgstr "網域名稱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 msgid "Domain required" msgstr "需要網域" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:311 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:322 msgid "Domain whitelist" msgstr "網域白名單" @@ -2288,11 +2573,11 @@ msgstr "下載備份檔" msgid "Download mtdblock" msgstr "下載 mtdblock" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1587 msgid "Downstream SNR offset" msgstr "下載串流 SNR 位移" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:435 msgid "" "Drag or paste a valid *.conf file below to configure the local " "WireGuard interface." @@ -2306,16 +2591,54 @@ msgstr "拖動來排序" msgid "Drop Duplicate Frames" msgstr "丟棄相同多餘的訊框(Frames)" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "" +"Drop all gratuitous ARP frames, for example if there’s a known good ARP " +"proxy on the network and such frames need not be used or in the case of " +"802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "" +"Drop all unsolicited neighbor advertisements, for example if there’s a known " +"good NA proxy on the network and such frames need not be used or in the case " +"of 802.11, must not be used to prevent attacks." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:710 +msgid "Drop gratuitous ARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop layer 2 multicast frames containing IPv4 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop layer 2 multicast frames containing IPv6 unicast packets." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:787 +msgid "Drop nested IPv4 unicast" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:791 +msgid "Drop nested IPv6 unicast" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:96 msgctxt "nft drop action" msgid "Drop packet" msgstr "丟棄數據包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:546 msgctxt "Chain policy: drop" msgid "Drop unmatched packets" msgstr "丟棄不匹配的數據包" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:733 +msgid "Drop unsolicited NA" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 msgid "Dropbear Instance" msgstr "Dropbear實例" @@ -2333,19 +2656,19 @@ msgstr "" msgid "Dual-Stack Lite (RFC6333)" msgstr "隧道IPv4v6雙堆疊協定DS Lite (RFC6333)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "Dynamic DHCP" msgstr "動態 DHCP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1434 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1468 msgid "Dynamic Authorization Extension client." msgstr "動態授權擴展客戶端。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1439 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1473 msgid "Dynamic Authorization Extension port." msgstr "動態授權擴展端口。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 msgid "Dynamic Authorization Extension secret." msgstr "動態授權擴展密鑰。" @@ -2353,27 +2676,39 @@ msgstr "動態授權擴展密鑰。" msgid "Dynamic tunnel" msgstr "動態隧道" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:700 msgid "" "Dynamically allocate DHCP addresses for clients. If disabled, only clients " "having static leases will be served." msgstr "用戶端動態發配 DHCP 位址。若停用,僅有靜態位置的用戶端能使用。" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "E.g. br-vlan or brvlan." +msgstr "例如 br-vlan 或 brvlan。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "E.g. eth0, eth1" +msgstr "例如 eth0、eth1" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" msgstr "EA-位元長度" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1573 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 msgid "EAP-Method" msgstr "可擴展身份驗證協定(EAP)-方式" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "Each STA is assigned its own AP_VLAN interface." +msgstr "每個 STA 都分配有其自己的AP_VLAN介面。" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2718 #: modules/luci-base/htdocs/luci-static/resources/form.js:2721 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3425 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3434 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:902 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:896 msgid "Edit" msgstr "編輯" @@ -2381,17 +2716,21 @@ msgstr "編輯" msgid "Edit peer" msgstr "編輯對等" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:782 +msgid "Edit static lease" +msgstr "" + #: modules/luci-compat/luasrc/view/cbi/error.htm:13 msgid "" "Edit the raw configuration data above to fix any error and hit \"Save\" to " "reload the page." msgstr "編輯上面的原始配置數據以修復任何錯誤,然後點擊\"儲存\"以重新載入頁面." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:900 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:894 msgid "Edit this network" msgstr "編輯此網路" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:851 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:845 msgid "Edit wireless network" msgstr "編輯無線網路" @@ -2400,55 +2739,45 @@ msgctxt "nft rt mtu" msgid "Effective route MTU" msgstr "有效路由 MTU" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:462 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:516 msgid "Egress QoS mapping" msgstr "輸出 QoS 對應" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:13 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 msgctxt "nft meta oif" msgid "Egress device id" msgstr "出口設備ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 msgctxt "nft meta oifname" msgid "Egress device name" msgstr "出口設備名稱" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:166 -msgctxt "VLAN port state" -msgid "Egress tagged" -msgstr "已選的輸出" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:162 -msgctxt "VLAN port state" -msgid "Egress untagged" -msgstr "未選的輸出" - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:193 msgid "Emergency" msgstr "緊急" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:897 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:937 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:891 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 msgid "Enable" msgstr "啟用" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Enable / Disable peer. Restart wireguard interface to apply changes." msgstr "啟用/禁用對等體。 重新啟動wireguard界面以應用更改。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "" "Enable IGMP " "snooping" msgstr "" "啟用 IGMP snooping" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enable STP" msgstr "啟用 生成樹協定(STP)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:785 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 msgid "Enable SLAAC" msgstr "啟用SLAAC" @@ -2466,10 +2795,11 @@ msgstr "啟用動態拖曳(Dynamic Shuffling)流程" msgid "Enable HE.net dynamic endpoint update" msgstr "啟用HE.net服務代管動態更新" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:725 msgid "Enable IPv6" msgstr "啟用IPv6" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:101 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 msgid "Enable IPv6 negotiation" msgstr "啟用 IPv6 協商" @@ -2483,11 +2813,15 @@ msgstr "啟用 IPv6 協商" msgid "Enable IPv6 negotiation on the PPP link" msgstr "啟用PPP連結上的IPv6交涉" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:729 +msgid "Enable IPv6 segment routing" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:194 msgid "Enable Jumbo Frame passthrough" msgstr "啟用超大訊框透穿" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:696 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:764 msgid "Enable MAC address learning" msgstr "啟用 MAC 位址學習" @@ -2499,11 +2833,11 @@ msgstr "啟用 NTP用戶端" msgid "Enable Single DES" msgstr "啟用單一 DES" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:566 msgid "Enable TFTP server" msgstr "啟用TFTP伺服器" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:720 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:796 msgid "Enable VLAN filtering" msgstr "啟用 VLAN 過濾" @@ -2511,7 +2845,7 @@ msgstr "啟用 VLAN 過濾" msgid "Enable VLAN functionality" msgstr "啟用VLAN功能" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1814 msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" msgstr "啟用 WPS 按鈕, 這需要 WPA(2)-PSK/WPA3-SAE" @@ -2525,12 +2859,12 @@ msgstr "" "title=\"Hypertext Transfer Protocol Secure\">HTTPS 的自動重新導向連接" "埠。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1036 msgid "" "Enable downstream delegation of IPv6 prefixes available on this interface" msgstr "啟用此接口上可用的 IPv6 前綴的下游委託" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1721 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1810 msgid "Enable key reinstallation (KRACK) countermeasures" msgstr "啟用密鑰重新安裝 (KRACK) 對策" @@ -2546,24 +2880,24 @@ msgstr "啟用連入封包鏡像" msgid "Enable mirroring of outgoing packets" msgstr "啟用連出封包鏡像" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:715 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:783 msgid "Enable multicast fast leave" msgstr "啟用多播快速離開" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:547 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:601 msgid "Enable multicast querier" msgstr "啟用多播查詢器" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:747 msgid "Enable multicast support" msgstr "啟用多播支援" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "" "Enable packet steering across all CPUs. May help or hinder network speed." msgstr "啟用所有 CPU 的封包控制。 可能會增加或減少網路速度。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:622 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:676 msgid "Enable promiscuous mode" msgstr "啟用混合模式" @@ -2585,11 +2919,11 @@ msgstr "啟用多點播放流量(選項)." msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." msgstr "啟用封裝封包的 DF(不分段)標誌." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:480 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 msgid "Enable the built-in single-instance TFTP server." msgstr "啟用內建的單一執行個體 TFTP 伺服器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 msgid "Enable this network" msgstr "啟用這個網路" @@ -2598,27 +2932,36 @@ msgstr "啟用這個網路" msgid "Enable tx checksum" msgstr "啟用 Tx 校驗和" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:699 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:767 msgid "Enable unicast flooding" msgstr "啟用單播泛洪" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1631 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:353 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:118 msgid "Enabled" msgstr "啟用" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:538 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:592 msgid "Enables IGMP snooping on this bridge" msgstr "在此橋接上啟用 IGMP snooping" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "啟用屬於同一行動網域存取點之間的快速漫遊" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:100 +msgid "" +"Enables more efficient, group aware multicast forwarding infrastructure in " +"batman-adv." +msgstr "在 batman-adv 中啟用更高效、組感知的多播轉發基礎架構。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:572 msgid "Enables the Spanning Tree Protocol on this bridge" msgstr "在橋接器上啟用802.1d Spanning Tree協定" @@ -2626,24 +2969,29 @@ msgstr "在橋接器上啟用802.1d Spanning Tree協定" msgid "Encapsulation limit" msgstr "封裝限制" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1509 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1567 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1577 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1635 msgid "Encapsulation mode" msgstr "封裝模式" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1196 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1753 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1198 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1842 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:150 msgid "Encryption" msgstr "加密(Encryption)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:55 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:75 +msgid "Endpoint" +msgstr "傳輸端點" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "Endpoint Host" msgstr "終端主機" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Endpoint Port" msgstr "終端阜" @@ -2651,23 +2999,23 @@ msgstr "終端阜" msgid "Endpoint setting is invalid" msgstr "端點設定無效" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:684 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:752 msgid "Enforce IGMPv1" msgstr "強制 IGMPv1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:685 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:753 msgid "Enforce IGMPv2" msgstr "強制 IGMPv2" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:754 msgid "Enforce IGMPv3" msgstr "強制 IGMPv3" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:759 msgid "Enforce MLD version 1" msgstr "強制 MLD 版本 1" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:692 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:760 msgid "Enforce MLD version 2" msgstr "強制 MLD 版本 2" @@ -2696,10 +3044,6 @@ msgstr "錯誤" msgid "Error getting PublicKey" msgstr "獲取公鑰時出錯" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Errored seconds (ES)" -msgstr "錯誤秒數 (ES)" - #: modules/luci-base/htdocs/luci-static/resources/network.js:3008 #: modules/luci-compat/luasrc/model/network.lua:1433 msgid "Ethernet Adapter" @@ -2718,11 +3062,17 @@ msgstr "每 30 秒(慢速,0)" msgid "Every second (fast, 1)" msgstr "每一秒(快,1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 msgid "Exclude interfaces" msgstr "排除介面" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:160 +msgid "" +"Execution of various network commands to check the connection and name " +"resolution to other systems." +msgstr "執行各種網路命令以檢查與其他系統的連接和名稱解析。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 msgid "" "Exempt 127.0.0.0/8 and ::1 from rebinding checks, " "e.g. for RBL services." @@ -2730,27 +3080,35 @@ msgstr "" "免除 127.0.0.0/8 和 ::1 重新綁定檢查,例如 用於 " "RBL 服務。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:410 msgid "Existing device" msgstr "現有裝置" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:408 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 msgid "Expand hosts" msgstr "延伸主機" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:994 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:399 +msgid "Expected port number." +msgstr "預期的埠號。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1053 msgid "Expecting a hexadecimal assignment hint" msgstr "預期十六進位賦值提示" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv4 address" msgstr "請輸入有效的 IPv4 位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:18 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:19 msgid "Expecting a valid IPv6 address" msgstr "請輸入有效的 IPv6 位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:28 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:808 +msgid "Expecting a valid MAC address, optionally including wildcards" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:29 msgid "Expecting two priority values separated by a colon" msgstr "請輸入用冒號分隔的兩個優先順序" @@ -2759,11 +3117,11 @@ msgstr "請輸入用冒號分隔的兩個優先順序" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:127 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "Expecting: %s" msgstr "預期: %s" @@ -2775,7 +3133,7 @@ msgstr "預期:非空值" msgid "Expires" msgstr "過期" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "" "Expiry time of leased addresses, minimum is 2 minutes (2m)." msgstr "釋放位置前閒置時間,最少兩分鐘 (2m)。" @@ -2784,11 +3142,11 @@ msgstr "釋放位置前閒置時間,最少兩分鐘 (2m)。" msgid "External" msgstr "外部" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "External R0 Key Holder List" msgstr "外部 R0 金鑰持有者清單" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "External R1 Key Holder List" msgstr "外部 R1 金鑰持有者清單" @@ -2816,35 +3174,63 @@ msgstr "額外的 pppd 選項" msgid "Extra sstpc options" msgstr "額外的 sstpc 選項" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1539 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 msgid "FT over DS" msgstr "FT 透過 DS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1538 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1576 msgid "FT over the Air" msgstr "FT 透過 空中" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1536 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 msgid "FT protocol" msgstr "FT 協定" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:91 +msgid "Failed Reason" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 msgid "Failed to change the system password." msgstr "更新系統密碼失敗。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4502 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 +msgid "Failed to configure modem" +msgstr "設定數據機失敗" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4556 msgid "Failed to confirm apply within %ds, waiting for rollback…" msgstr "無法在 %ds 秒內確認變更,等待回滾…" +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 +msgid "Failed to connect" +msgstr "連線失敗" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +msgid "Failed to disconnect" +msgstr "中斷連線失敗" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" msgstr "執行失敗 \"/etc/init.d/%s %s\" 動作: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2708 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 +msgid "Failed to get modem information" +msgstr "取得數據機資訊失敗" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 +msgid "Failed to initialize modem" +msgstr "初始化數據機失敗" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:30 +msgid "Failed to set operating mode" +msgstr "設定操作模式失敗" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2732 msgid "File" msgstr "檔案" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:417 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 msgid "" "File listing upstream resolvers, optionally domain-specific, e.g. " "server=1.2.3.4, server=/domain/1.2.3.4." @@ -2852,24 +3238,24 @@ msgstr "" "列出上游解析器的文件,可選擇特定於域的,例如 server=1.2.3.4," "server=/domain/1.2.3.4。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2655 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2679 msgid "File not accessible" msgstr "無法存取檔案" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:424 msgid "File to store DHCP lease information." msgstr "用於儲存 DHCP 租用資訊的檔案。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 msgid "File with upstream resolvers." msgstr "與上游解析器一起歸檔。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2846 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:506 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2870 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:593 msgid "Filename" msgstr "檔案名稱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:492 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:579 msgid "Filename of the boot image advertised to clients." msgstr "開機影像檔通知給用戶端。" @@ -2878,14 +3264,22 @@ msgstr "開機影像檔通知給用戶端。" msgid "Filesystem" msgstr "檔案系統" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:382 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +msgid "Filter IPv4 A records" +msgstr "篩選 IPv4 A 記錄" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:467 +msgid "Filter IPv6 AAAA records" +msgstr "篩選 IPv6 AAAA 記錄" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:462 +msgid "Filter SRV/SOA service discovery" +msgstr "篩選器 SRV/SOA 服務發現" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:457 msgid "Filter private" msgstr "私人過濾器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 -msgid "Filter useless" -msgstr "無用過濾器" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 msgid "Filtering for all slaves, no validation" msgstr "篩選所有實體界面 , 無驗證" @@ -2898,8 +3292,13 @@ msgstr "篩選所有實體界面 , 僅驗證有活動的實體界面" msgid "Filtering for all slaves, validation only for backup slaves" msgstr "篩選所有實體界面 , 僅驗證有備份的實體界面" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:463 +msgid "" +"Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links." +msgstr "過濾 SRV/SOA 服務發現,以避免觸發按需撥號鏈路。" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Finalizing failed" msgstr "定案失敗" @@ -2909,7 +3308,7 @@ msgid "" "with defaults based on what was detected" msgstr "尋找所有目前已連接裝置中的檔案系統及swap分區,並覆蓋目前的設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:878 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:872 msgid "Find and join network" msgstr "搜尋並加入網路" @@ -2923,10 +3322,11 @@ msgid "Firewall" msgstr "防火牆" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 msgid "Firewall Mark" msgstr "防火牆遮罩" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:482 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:499 msgid "Firewall Settings" msgstr "防火牆設定" @@ -2934,19 +3334,19 @@ msgstr "防火牆設定" msgid "Firewall Status" msgstr "防火牆狀態" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "Firewall mark" msgstr "防火牆標誌" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1526 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1594 msgid "Firmware File" msgstr "韌體檔案" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 msgid "Firmware Version" msgstr "韌體版本" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:532 msgid "Fixed source port for outbound DNS queries." msgstr "外發DNS請求的固定來源埠號。" @@ -2972,40 +3372,48 @@ msgstr "韌體工具" msgid "Flashing…" msgstr "燒錄中…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:536 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:988 +msgid "Follow IPv4 Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force" msgstr "強制" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:971 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 msgid "Force 40MHz mode" msgstr "強制使用 40MHz 模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 msgid "Force CCMP (AES)" msgstr "強制使用CCMP (AES)加密" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:703 msgid "Force DHCP on this network even if another server is detected." msgstr "即使偵測到另一台伺服器,也要強制使用此網路上的 DHCP。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:750 msgid "Force IGMP version" msgstr "強制 IGMP 版本" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:757 msgid "Force MLD version" msgstr "強制 MLD 版本" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 msgid "Force TKIP" msgstr "強制使用TKIP加密" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 msgid "Force TKIP and CCMP (AES)" msgstr "強制使用TKIP+CCMP (AES)加密" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:941 +msgid "Force broadcast DHCP response." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "Force link" msgstr "強制連結" @@ -3017,11 +3425,11 @@ msgstr "強制升級" msgid "Force use of NAT-T" msgstr "強制使用 NAT-T" -#: modules/luci-base/luasrc/view/csrftoken.htm:8 +#: modules/luci-base/ucode/template/csrftoken.ut:8 msgid "Form token mismatch" msgstr "表單權杖(token )不匹配" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:966 msgid "" "Forward NDP NS and NDP NS 和 NA 訊息。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:770 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:810 msgid "" "Forward RA " "messages received on the designated master interface to downstream " @@ -3045,37 +3453,41 @@ msgstr "" msgid "Forward DHCP traffic" msgstr "轉發DHCP流量" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:885 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 msgid "" "Forward DHCPv6 messages between the designated master interface and " "downstream interfaces." msgstr "在指定的主介面和下游介面之間轉發 DHCPv6 訊息。" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "前向糾錯校正秒數 (FECS)" - #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" msgstr "轉發廣播流量" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:527 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:581 msgid "Forward delay" msgstr "轉發延遲" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:993 msgid "Forward mesh peer traffic" msgstr "轉發 mesh 節點流量" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Forward multicast packets as unicast packets on this device." msgstr "在此裝置上將多播資料封包轉發為單播資料封包。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1574 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:944 +msgid "Forward/reverse DNS" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1642 msgid "Forwarding mode" msgstr "轉發模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:80 +msgid "Fragmentation" +msgstr "碎片化" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 msgid "Fragmentation Threshold" msgstr "分片閥值" @@ -3099,7 +3511,7 @@ msgid "GHz" msgstr "GHz" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:92 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 msgid "GPRS only" msgstr "僅用GPRS" @@ -3119,12 +3531,16 @@ msgstr "IPv4上的GRETAP隧道" msgid "GRETAP tunnel over IPv6" msgstr "IPv6上的GRETAP隧道" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:188 msgid "Gateway" msgstr "閘道器" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:85 +msgid "Gateway Mode" +msgstr "網關模式" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 msgid "Gateway Ports" msgstr "閘道器埠號" @@ -3134,23 +3550,23 @@ msgstr "閘道器埠號" msgid "Gateway address is invalid" msgstr "閘道器位址錯誤無效" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:477 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:494 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:126 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:127 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:122 msgid "General Settings" msgstr "一般設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1561 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1629 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:979 msgid "General Setup" msgstr "一般設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:336 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:390 msgid "General device options" msgstr "一般裝置選項" @@ -3158,7 +3574,7 @@ msgstr "一般裝置選項" msgid "Generate Config" msgstr "產生設定檔" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "Generate PMK locally" msgstr "本地產生 PMK" @@ -3166,11 +3582,11 @@ msgstr "本地產生 PMK" msgid "Generate archive" msgstr "製作壓縮檔" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:821 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:824 msgid "Generate configuration" msgstr "產生設定" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:861 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:864 msgid "Generate configuration…" msgstr "產生設定…" @@ -3178,15 +3594,15 @@ msgstr "產生設定…" msgid "Generate new key pair" msgstr "產生新的金鑰組" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:623 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:621 msgid "Generate preshared key" msgstr "產生預先共用金鑰" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:693 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:691 msgid "Generates a configuration suitable for import on a WireGuard peer" msgstr "產生適合在 WireGuard 對端上匯入的設定" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:795 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:798 msgid "Generating QR code…" msgstr "正在產生 QR code…" @@ -3198,39 +3614,40 @@ msgstr "輸入的密碼確認不匹配,密碼未更改!" msgid "Global Settings" msgstr "全域設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1469 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1531 msgid "Global network options" msgstr "全域網路選項" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:90 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:67 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92 msgid "Go to firmware upgrade..." msgstr "進入固件升級..." -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:80 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:57 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 msgid "Go to password configuration..." msgstr "前往密碼設定..." #: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3744 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3753 #: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 msgid "Go to relevant configuration page" msgstr "前往相應設定頁" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:37 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:39 msgid "Grant access to DHCP configuration" msgstr "授予存取 DHCP 組態的權限" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:22 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:23 msgid "Grant access to DHCP status display" msgstr "授予存取 DHCP 狀態顯示的權限" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:31 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:32 msgid "Grant access to DSL status display" msgstr "授予存取 DSL 狀態顯示的權限" @@ -3242,6 +3659,10 @@ msgstr "授予存取 LuCI OpenConnect 程序的權限" msgid "Grant access to LuCI Wireguard procedures" msgstr "授予存取 LuCI Wireguard 程序的權限" +#: protocols/luci-proto-openfortivpn/root/usr/share/rpcd/acl.d/luci-openfortivpn.json:3 +msgid "Grant access to LuCI openfortivpn procedures" +msgstr "授予對 LuCI openfortivpn 手續的存取權限" + #: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:20 msgid "Grant access to SSH configuration" msgstr "授予存取 SSH 組態的權限" @@ -3278,7 +3699,7 @@ msgstr "授予存取掛載組態的權限" msgid "Grant access to network configuration" msgstr "授予存取網路組態的權限" -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:50 +#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:52 msgid "Grant access to network diagnostic tools" msgstr "授予存取網路診斷工具的權限" @@ -3286,6 +3707,10 @@ msgstr "授予存取網路診斷工具的權限" msgid "Grant access to network status information" msgstr "授予存取網路狀態資訊的權限" +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:41 +msgid "Grant access to port status display" +msgstr "" + #: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 msgid "Grant access to process status" msgstr "授予存取處理狀態的權限" @@ -3318,7 +3743,7 @@ msgstr "授予對 uHTTPd 設定的存取權限" msgid "Grant access to wireless channel status" msgstr "授予無線頻道狀態權限" -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:40 +#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json:50 msgid "Grant access to wireless status display" msgstr "授予存取無線狀態顯示的權限" @@ -3347,15 +3772,11 @@ msgstr "HTTP(S) 存取" msgid "Hang Up" msgstr "掛斷" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Header Error Code Errors (HEC)" -msgstr "標頭錯誤原碼錯誤(HEC)" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 msgid "Heartbeat interval (kernel: heartbeat)" msgstr "心跳間隔(kernel: heartbeat)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Hello interval" msgstr "Hello 間隔" @@ -3365,7 +3786,7 @@ msgid "" "the timezone." msgstr "在這裡設定基本設定值,如主機名稱、時區...等。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "Hide ESSID" msgstr "隱藏 ESSID" @@ -3374,17 +3795,25 @@ msgstr "隱藏 ESSID" msgid "Hide empty chains" msgstr "隱藏空白鏈結" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:950 msgid "High" msgstr "高速" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:587 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "Honor gratuitous ARP" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:593 msgctxt "Chain hook description" msgid "Hook: %h (%h), Priority: %d" msgstr "掛鉤:%h (%h),優先級:%d" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:92 +msgid "Hop Penalty" +msgstr "跳罰" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2169 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2258 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:134 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:234 msgid "Host" @@ -3394,7 +3823,7 @@ msgstr "主機" msgid "Host expiry timeout" msgstr "過期主機" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:507 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:594 msgid "Host requests this filename from the boot server." msgstr "主機從引導伺服器請求此文件名。" @@ -3402,10 +3831,16 @@ msgstr "主機從引導伺服器請求此文件名。" msgid "Host-Uniq tag content" msgstr "Host-Uniq 標籤內容" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:894 +msgid "" +"Host-specific lease time, e.g. 5m, 3h, 7d." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:558 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:785 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:135 msgid "Hostname" @@ -3415,11 +3850,11 @@ msgstr "主機名稱" msgid "Hostname to send when requesting DHCP" msgstr "當請求DHCP服務時傳送的主機名稱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:257 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 msgid "Hostnames" msgstr "主機名稱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:550 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:724 msgid "" "Hostnames are used to bind a domain name to an IP address. This setting is " "redundant for hostnames already configured with static leases, but it can be " @@ -3477,23 +3912,27 @@ msgstr "IEEE 802.3ad 動態鏈路聚合 (802.3ad, 4)" msgid "IKE DH Group" msgstr "IKE DH 群組" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:86 +msgid "IMEI" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "IP Addresses" msgstr "IP 位址" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:81 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 msgid "IP Protocol" msgstr "IP 協定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:261 msgid "IP Sets" msgstr "IP 集" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:126 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 msgid "IP Type" msgstr "IP 類型" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:736 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:178 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:204 msgid "IP address" @@ -3509,32 +3948,34 @@ msgstr "IP位址無效" msgid "IP address is missing" msgstr "缺少IP位址" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:778 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:781 msgid "" "IP addresses that are allowed inside the tunnel. The peer will accept " "tunnelled packets with source IP addresses matching this list and route back " "packets with matching destination IP." msgstr "" +"隧道內允許的IP位址。對等方將接受源IP位址與此清單匹配的隧道數據包,並使用匹配" +"的目標IP路由回數據包。" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:36 msgctxt "nft ip protocol" msgid "IP protocol" msgstr "IP協議" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:15 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:14 msgctxt "nft meta l4proto" msgid "IP protocol" msgstr "IP 協議" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:588 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:762 msgid "IP set" msgstr "IP 集" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:306 msgid "IP sets" msgstr "IP 集" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 msgid "IPs to override with NXDOMAIN" msgstr "偽造的NX網域覆蓋" @@ -3542,14 +3983,15 @@ msgstr "偽造的NX網域覆蓋" msgid "IPsec XFRM" msgstr "IPsec XFRM協定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:96 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 msgid "IPv4" msgstr "IPv4 地址" @@ -3565,7 +4007,7 @@ msgstr "IPv4 鄰居" msgid "IPv4 Routing" msgstr "IPv4 路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv4 Rules" msgstr "IPv4 規則" @@ -3575,7 +4017,7 @@ msgstr "IPv4 上游" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:664 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:88 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:164 msgid "IPv4 address" @@ -3602,7 +4044,7 @@ msgstr "IPv4網路遮罩" msgid "IPv4 network in address/netmask notation" msgstr "IPv4網路以位址/子網路遮罩表示" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:138 msgid "IPv4 only" msgstr "僅 IPv4" @@ -3615,11 +4057,11 @@ msgstr "IPv4 首碼" msgid "IPv4 prefix length" msgstr "IPv4前綴長度" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:619 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:625 msgid "IPv4 traffic table \"%h\"" msgstr "IPv4 流量表 \"%h\"" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 msgid "IPv4+IPv6" msgstr "IPv4+IPv6" @@ -3628,16 +4070,20 @@ msgstr "IPv4+IPv6" msgid "IPv4-in-IPv4 (RFC2003)" msgstr "IPv4-包裹-IPv4 (RFC2003)" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:127 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:95 +msgid "IPv4/IPv6" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:137 msgid "IPv4/IPv6 (both - defaults to IPv4)" msgstr "IPv4/IPv6 (雙啟 - 預設到IPv4)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:627 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:633 msgid "IPv4/IPv6 traffic table \"%h\"" msgstr "IPv4/IPv6 流量表 \"%h\"" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 @@ -3648,7 +4094,8 @@ msgstr "IPv4/IPv6 流量表 \"%h\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:85 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:97 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:89 msgid "IPv6" msgstr "IPv6" @@ -3656,7 +4103,7 @@ msgstr "IPv6" msgid "IPv6 Firewall" msgstr "IPv6防火牆" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:737 msgid "IPv6 MTU" msgstr "IPv6 MTU" @@ -3664,7 +4111,11 @@ msgstr "IPv6 MTU" msgid "IPv6 Neighbours" msgstr "IPv6 鄰居" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "IPv6 Prefix Lifetime" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:652 msgid "IPv6 RA Settings" msgstr "IPv6 RA 設定" @@ -3672,15 +4123,15 @@ msgstr "IPv6 RA 設定" msgid "IPv6 Routing" msgstr "IPv6 路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:120 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:121 msgid "IPv6 Rules" msgstr "IPv6 規則" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:651 msgid "IPv6 Settings" msgstr "IPv6 設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "IPv6 ULA-Prefix" msgstr "IPv6 ULA前綴" @@ -3694,12 +4145,12 @@ msgstr "IPv6 上游" msgid "IPv6 address" msgstr "IPv6位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1044 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 msgid "IPv6 assignment hint" msgstr "IPv6 分配提示" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1039 msgid "IPv6 assignment length" msgstr "IPv6 分配長度" @@ -3711,11 +4162,11 @@ msgstr "IPv6閘道器" msgid "IPv6 network in address/netmask notation" msgstr "IPv6網路以位址/子網路遮罩表示" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:129 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:139 msgid "IPv6 only" msgstr "僅 IPv6" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "IPv6 preference" msgstr "IPv6 偏好設定" @@ -3724,7 +4175,7 @@ msgstr "IPv6 偏好設定" msgid "IPv6 prefix" msgstr "IPv6字首" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "IPv6 prefix filter" msgstr "IPv6 前綴過濾器" @@ -3738,24 +4189,19 @@ msgstr "IPv6字首長度" msgid "IPv6 routed prefix" msgstr "IPv6路由前綴" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1032 msgid "IPv6 source routing" msgstr "IPv6 源路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "IPv6 suffix" msgstr "IPv6 尾碼" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:705 -msgid "IPv6 suffix (hex)" -msgstr "" -"IPv6 尾碼 (十六進位)" - #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 msgid "IPv6 support" msgstr "IPv6 支援" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:623 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:629 msgid "IPv6 traffic table \"%h\"" msgstr "IPv6 流量表 \"%h\"" @@ -3763,6 +4209,10 @@ msgstr "IPv6 流量表 \"%h\"" msgid "IPv6-PD" msgstr "IPv6-前綴代理" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:911 +msgid "IPv6-Suffix (hex)" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 msgid "IPv6-in-IPv4 (RFC4213)" @@ -3778,10 +4228,16 @@ msgstr "IPv6凌駕IPv4外(第6版)" msgid "IPv6-over-IPv4 (6to4)" msgstr "IPv6凌駕IPv4外(6轉4)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1675 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1764 msgid "Identity" msgstr "身分識別" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:923 +msgid "" +"If a host matches an entry which cannot be used because it specifies an " +"address on a different subnet, the tag known-othernet is set." +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "If checked, 1DES is enabled" msgstr "如果勾選,則啟用1DES" @@ -3794,13 +4250,13 @@ msgstr "一旦勾選, 新增\"+ipv6\"到 pppd 選項" msgid "If checked, encryption is disabled" msgstr "如果勾選,加密會停用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1002 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1061 msgid "" "If set, downstream subnets are only allocated from the given IPv6 prefix " "classes." msgstr "如果設定,則僅從給定的 IPv6 前綴類別中分配下游子網路。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "If set, the meaning of the match options is inverted" msgstr "如果設置,則匹配選項的含義反轉" @@ -3817,7 +4273,7 @@ msgid "" "device node" msgstr "假若指定的話, 掛載設備的分割標籤取代固定的設備節點" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4646 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4700 msgid "" "If the IP address used to access LuCI changes, a manual reconnect to " "the new IP is required within %d seconds to confirm the settings, " @@ -3826,14 +4282,16 @@ msgstr "" "如果此 IP 位址用於存取 LuCI 變更,需在 %d 秒內手動重新連線到新 IP 確認設定,否則修改將被還原。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:134 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:122 msgid "If unchecked, no default route is configured" msgstr "如果沒勾選, 將不會設置預設路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:145 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:133 msgid "If unchecked, the advertised DNS server addresses are ignored" msgstr "如果沒勾選, 公告的DNS伺服器位址將被忽視" @@ -3851,15 +4309,23 @@ msgstr "" "用高資料傳輸速率的RAM來存取交換設" "備,交換資料將是一個非常緩慢的過程。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:363 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:860 +msgid "Ignore" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 msgid "Ignore /etc/hosts" msgstr "忽視 /etc/hosts" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:666 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:683 msgid "Ignore interface" msgstr "忽視介面" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:352 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:922 +msgid "Ignore requests from unknown machines using !known." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 msgid "Ignore resolv file" msgstr "忽視解析文件" @@ -3871,25 +4337,25 @@ msgstr "映像檔" msgid "Image check failed:" msgstr "鏡像檢查失敗了:" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import as peer" msgstr "作為對等節點導入" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:188 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:478 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:476 msgid "Import configuration" msgstr "匯入設定檔案" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:506 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:504 msgid "Import configuration as peer…" msgstr "將設定匯入為對端…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:492 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:490 msgid "Import settings" msgstr "匯入設定" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:378 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:405 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:376 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:403 msgid "Imported peer configuration" msgstr "匯入對端設定" @@ -3901,14 +4367,30 @@ msgstr "從現有的 WireGuard 設定檔案匯入設定" msgid "In" msgstr "輸入" -#: modules/luci-base/luasrc/view/csrftoken.htm:13 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:801 +msgid "" +"In DHCPv4, it is possible to include more than one mac address. This allows " +"an IP address to be associated with multiple macaddrs, and dnsmasq abandons " +"a DHCP lease to one of the macaddrs when another asks for a lease. It only " +"works reliably if only one of the macaddrs is active at any time." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:71 +msgid "" +"In bridged LAN setups it is advisable to enable the bridge loop avoidance in " +"order to avoid broadcast loops that can bring the entire LAN to a standstill." +msgstr "" +"在橋接 LAN 設置中,建議啟用橋接環路避免功能,以避免可能導致整個 LAN 停止的廣" +"播環路。" + +#: modules/luci-base/ucode/template/csrftoken.ut:13 msgid "" "In order to prevent unauthorized access to the system, your request has been " "blocked. Click \"Continue »\" below to return to the previous page." msgstr "" "為防止未經授權的存取系統,您的請求已被擋下。按下面的「繼續 »」回到上一頁。" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "In seconds" msgstr "秒數" @@ -3938,7 +4420,7 @@ msgstr "將目前安裝的套件列表備份在 /etc/backup/installed_packages.t msgid "Incoming checksum" msgstr "傳入校驗和" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Incoming interface" msgstr "傳入接口" @@ -3946,6 +4428,7 @@ msgstr "傳入接口" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Incoming key" msgstr "傳入金鑰" @@ -3964,22 +4447,21 @@ msgstr "資訊" msgid "Information" msgstr "資訊" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:456 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:510 msgid "Ingress QoS mapping" msgstr "入口 QoS 對應" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:12 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:11 msgctxt "nft meta iif" msgid "Ingress device id" msgstr "入口裝置 ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:10 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:9 msgctxt "nft meta iifname" msgid "Ingress device name" msgstr "入口裝置名稱" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 msgid "Initialization failure" msgstr "初始化失敗" @@ -3991,31 +4473,42 @@ msgstr "初始化腳本" msgid "Initscripts" msgstr "初始化腳本組" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1659 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 msgid "Inner certificate constraint (Domain)" msgstr "內部憑證制約 (域名)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1656 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1745 msgid "Inner certificate constraint (SAN)" msgstr "內部憑證制約 (SAN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1742 msgid "Inner certificate constraint (Subject)" msgstr "內部憑證制約 (Subject)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 msgid "Inner certificate constraint (Wildcard)" msgstr "內部憑證制約 (萬用字元)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:300 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:317 msgid "Install protocol extensions..." msgstr "安裝延伸協定中..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:541 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:930 msgid "Instance" msgstr "實例" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:125 +#, fuzzy +msgctxt "WireGuard instance heading" +msgid "Instance \"%h\"" +msgstr "實例" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:34 +msgid "Instance Details" +msgstr "實例" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "" "Instead of joining any network with a matching SSID, only connect to the " "BSSID %h." @@ -4025,6 +4518,10 @@ msgstr "不結合同樣 SSID 的網路,只連接到 BSSID %h。" msgid "Insufficient permissions to read UCI configuration." msgstr "權限不足以讀取 UCI 組態。" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:136 +msgid "Integrated Circuit Card Identifier" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:41 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 @@ -4032,7 +4529,7 @@ msgstr "權限不足以讀取 UCI 組態。" msgid "Interface" msgstr "介面" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 msgid "Interface \"%h\" is already marked as designated master." msgstr "介面「%h」已被標記為指定的主介面。" @@ -4040,7 +4537,7 @@ msgstr "介面「%h」已被標記為指定的主介面。" msgid "Interface %q device auto-migrated from %q to %q." msgstr "從 %q 到 %q 自動遷移到介面%q 設備 ." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:975 msgid "Interface Configuration" msgstr "介面組態" @@ -4071,11 +4568,11 @@ msgstr "介面重新連線中..." msgid "Interface is shutting down..." msgstr "介面正在關閉中..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:285 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:302 msgid "Interface is starting..." msgstr "正在啟動介面..." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:288 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:305 msgid "Interface is stopping..." msgstr "正在停止介面..." @@ -4084,12 +4581,12 @@ msgid "Interface name" msgstr "介面名稱" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:123 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:304 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:321 msgid "Interface not present or not connected yet." msgstr "介面不存在或尚未連接。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:508 #: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 msgid "Interfaces" msgstr "介面" @@ -4098,15 +4595,19 @@ msgstr "介面" msgid "Internal" msgstr "內部" -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "內部伺服器發生錯誤" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:85 +msgid "International Mobile Station Equipment Identity" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:139 +msgid "International Mobile Subscriber Identity" +msgstr "" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285 msgid "Interval For Sending Learning Packets" msgstr "傳送學習中封包的時間間隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "" "Interval in centiseconds between multicast general queries. By varying the " "value, an administrator may tune the number of IGMP messages on the subnet; " @@ -4115,7 +4616,7 @@ msgstr "" "組播一般查詢之間的時間間隔 (以毫秒為單位)。透過變更該值,管理員可以調整子網路" "中 IGMP 訊息的數量。 數值越大,IGMP 查詢的傳送頻率越低" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:522 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:576 msgid "Interval in seconds for STP hello packets" msgstr "STP hello 資料封包的時間間隔 (以秒為單位)" @@ -4125,8 +4626,9 @@ msgid "Invalid" msgstr "無效" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:68 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:71 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:74 msgid "Invalid APN provided" msgstr "提供的 APN 無效" @@ -4136,6 +4638,10 @@ msgstr "提供的 APN 無效" msgid "Invalid Base64 key string" msgstr "無效的 Base64 鑰匙" +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +msgid "Invalid IPv6 address" +msgstr "" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:78 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:83 msgid "Invalid TOS value, expected 00..FF or inherit" @@ -4158,7 +4664,7 @@ msgstr "輸入的是不正確的VLAN ID!僅允許獨一無二的IDs" msgid "Invalid argument" msgstr "無效參數" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:11 msgid "" "Invalid bearer list. Possibly too many bearers created. This protocol " "supports one and only one bearer." @@ -4172,15 +4678,36 @@ msgstr "無效的指令" msgid "Invalid hexadecimal value" msgstr "錯誤的十六進制數值" -#: modules/luci-base/luasrc/view/sysauth.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 +msgid "Invalid hostname or IPv4 address" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:134 +msgid "Invalid port" +msgstr "" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 +msgid "Invalid server URL" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32 msgid "Invalid username and/or password! Please try again." msgstr "不正確的使用者名稱和/或者密碼!請再試一次。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:196 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:13 +msgid "Invert blinking" +msgstr "反轉閃爍" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:197 msgid "Invert match" msgstr "反轉匹配" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:223 +msgctxt "VLAN port state" +msgid "Is Primary VLAN" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Isolate Clients" msgstr "隔離用戶端" @@ -4191,25 +4718,25 @@ msgid "" "flash memory, please verify the image file!" msgstr "您正使用不適用於此 Flash 的映像檔,請檢查映像檔!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:97 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 msgid "JavaScript required!" msgstr "需要Java腳本!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1833 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 msgid "Join Network" msgstr "加入網路" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1767 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Join Network: Wireless Scan" msgstr "加入網路:無線掃描" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2045 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2134 msgid "Joining Network: %q" msgstr "加入網路:%q" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "Jump to rule" msgstr "跳轉到規則" @@ -4217,24 +4744,28 @@ msgstr "跳轉到規則" msgid "Keep settings and retain the current configuration" msgstr "保留目前設定" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgid "Keep-Alive" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:84 msgid "Kernel Log" msgstr "核心日誌" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 msgid "Kernel Version" msgstr "核心版本" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1489 msgid "Key" msgstr "金鑰" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1479 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1480 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1481 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1494 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1518 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1532 msgid "Key #%d" msgstr "金鑰 #%d" @@ -4242,6 +4773,7 @@ msgstr "金鑰 #%d" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:64 msgid "Key for incoming packets (optional)." msgstr "付予連入封包的金鑰(選項)." @@ -4249,14 +4781,19 @@ msgstr "付予連入封包的金鑰(選項)." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Key for outgoing packets (optional)." msgstr "付予連外封包的金鑰(選項)." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:551 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 msgctxt "Label indicating that WireGuard peer lacks public key" msgid "Key missing" msgstr "金鑰遺失" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:44 +msgid "Key used to sign network config" +msgstr "用來簽署網路設定的金鑰" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:71 msgctxt "nft unit" msgid "KiB" @@ -4301,7 +4838,7 @@ msgstr "LCP協定呼叫間隔" msgid "LED Configuration" msgstr "LED 設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1636 msgid "LLC" msgstr "LLC邏輯鏈結控制層" @@ -4318,32 +4855,39 @@ msgstr "語言" msgid "Language and Style" msgstr "語言與主題" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:641 +msgid "" +"Larger weights (of the same prio) are given a proportionately higher " +"probability of being selected." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "Last member interval" msgstr "最後成員間隔" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Latency" -msgstr "延遲" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:59 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:78 +msgid "Latest Handshake" +msgstr "上次握手" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 msgid "Leaf" msgstr "頁" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:775 msgid "Learn" msgstr "學習" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 msgid "Learn routes" msgstr "學習路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:423 msgid "Lease file" msgstr "租賃檔案" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:696 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:893 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:696 msgid "Lease time" msgstr "租賃時間長度" @@ -4367,7 +4911,7 @@ msgstr "保持空白以便自動偵測" msgid "Leave empty to use the current WAN address" msgstr "保持空白以便採用現今的寬頻位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938 msgid "" "Legacy or badly behaving devices may require legacy 802.11b rates to " "interoperate. Airtime efficiency may be significantly reduced where these " @@ -4376,33 +4920,29 @@ msgstr "" "舊版或性能欠佳的設備可能需要舊版802.11b速率才能互操作. 使用這些功能時, 通話時" "間效率可能會大大降低. 建議盡可能不允許802.11b速率." -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:671 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:677 msgid "Legacy rules detected" msgstr "檢測到舊版規則" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4384 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4438 msgid "Legend:" msgstr "圖例:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Limit" msgstr "限制" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Line Attenuation (LATN)" -msgstr "線路衰減(LATN)" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 msgid "Line Mode" msgstr "線路模式" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line State" msgstr "線路狀態" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 msgid "Line Uptime" -msgstr "線路已連線時間" +msgstr "線路正常運行時間" #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:125 msgid "Link Aggregation (Channel Bonding)" @@ -4421,16 +4961,18 @@ msgctxt "nft @ll,off,len" msgid "Link layer header bits %d-%d" msgstr "鏈路層標頭位 %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:432 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 msgid "List of IP addresses to convert into NXDOMAIN responses." msgstr "列出供應偽裝NX網域成果的主機群." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:580 -msgid "List of IP sets to populate with the specified domain IPs." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:754 +msgid "" +"List of IP sets to populate with the IPs of DNS lookup results of the FQDNs " +"also specified here." msgstr "使用指定網域 IP 填充的 IP 集列表。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1564 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "" "List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-" "Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID " @@ -4442,7 +4984,7 @@ msgstr "" "字串).
    當從STA在初始行動網域關聯期間從R0KH請求PMK-R1金鑰時, 此列表用於" "將R0KH-ID(NAS標識符)映射到目標MAC位址." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1606 msgid "" "List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID " "as 6 octets with colons,128-bit key as hex string.
    This list is used " @@ -4458,23 +5000,20 @@ msgstr "" msgid "List of SSH key files for auth" msgstr "列出SSH金鑰以便驗證" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:323 msgid "List of domains to allow RFC1918 responses for." msgstr "列出允許RFC1918文件虛擬IP回應的網域." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 -msgid "List of domains to force to an IP address." -msgstr "列出網域以便強制到某個IP位址." - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:291 msgid "List of upstream resolvers to forward queries to." msgstr "列出 DNS 伺服器以便轉發請求." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:176 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:38 msgid "Listen Port" msgstr "監聽連接埠" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:343 msgid "Listen interfaces" msgstr "監聽介面" @@ -4482,7 +5021,7 @@ msgstr "監聽介面" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "僅監聽給定的介面,如果未指定則監聽所有介面" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:333 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 msgid "" "Listen only on the specified interfaces, and loopback if not excluded " "explicitly." @@ -4492,7 +5031,7 @@ msgstr "僅監聽這些介面和回送 (loopback)。" msgid "ListenPort setting is invalid" msgstr "ListenPort 設定無效" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 msgid "Listening port for inbound DNS queries." msgstr "進入的DNS請求聆聽埠." @@ -4501,7 +5040,7 @@ msgstr "進入的DNS請求聆聽埠." msgid "Load" msgstr "負載" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:63 msgid "Load Average" msgstr "平均負載" @@ -4509,27 +5048,28 @@ msgstr "平均負載" msgid "Load configuration…" msgstr "載入設定…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1170 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1976 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1229 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2065 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:167 msgid "Loading data…" msgstr "正在加載數據…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2968 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2992 msgid "Loading directory contents…" msgstr "讀取目錄內容…" #: modules/luci-base/htdocs/luci-static/resources/luci.js:1942 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45 +#: modules/luci-base/ucode/template/view.ut:4 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40 msgid "Loading view…" msgstr "載入畫面中…" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:870 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:948 msgid "Local" msgstr "本地" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:169 msgid "Local IP address" msgstr "本地 IP 位址" @@ -4549,11 +5089,12 @@ msgstr "指定本地 IP 位址" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "Local IPv4 address" msgstr "本地端IPv4位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 msgid "Local IPv6 DNS server" msgstr "本地 IPV6 DNS 伺服器" @@ -4569,44 +5110,70 @@ msgstr "本地端IPv6位址" msgid "Local Startup" msgstr "本地啟動" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:131 msgid "Local Time" msgstr "本地時間" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1062 msgid "Local ULA" msgstr "本地 ULA" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:273 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:281 msgid "Local domain" msgstr "本地網域" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:282 msgid "Local domain suffix appended to DHCP names and hosts file entries." msgstr "附加到 DHCP 名稱和 hosts 檔案項目的本地域字尾." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:269 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 msgid "Local server" msgstr "本地伺服器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:330 msgid "Local service only" msgstr "僅限本機服務" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:391 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:41 +msgid "Local wireguard key" +msgstr "本機 wireguard 金鑰" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:478 msgid "Localise queries" msgstr "本地化網路請求" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2037 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:117 +msgid "Location Area Code" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2126 msgid "Lock to BSSID" msgstr "鎖定 BSSID" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:98 +msgctxt "nft log action" +msgid "Log event \"%h…\"" +msgstr "" + +#: modules/luci-base/ucode/template/sysauth.ut:38 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36 +msgid "Log in" +msgstr "登入" + +#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 +msgid "Log in…" +msgstr "去登入…" + +#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 +msgid "Log out" +msgstr "登出" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 msgid "Log output level" msgstr "日誌輸出等級" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 msgid "Log queries" msgstr "日誌查詢" @@ -4632,37 +5199,28 @@ msgstr "" msgid "Logical network to which the tunnel will be added (bridged) (optional)." msgstr "(已橋接)隧道的邏輯網路將會被新增(可選的)." -#: modules/luci-base/luasrc/view/sysauth.htm:38 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41 -msgid "Login" -msgstr "登入" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "登出" - -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:628 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:682 msgid "Loose filtering" msgstr "寬鬆過濾" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "信號秒漏失(LOSS)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 msgid "Lowest leased address as offset from the network address." msgstr "DHCP 起始位置。" +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12 +msgid "Lua compatibility mode active" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 msgid "MAC" msgstr "MAC" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1445 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1507 msgid "MAC Address" msgstr "MAC 位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1084 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 msgid "MAC Address Filter" msgstr "MAC 位址過濾" @@ -4670,16 +5228,15 @@ msgstr "MAC 位址過濾" msgid "MAC Address For The Actor" msgstr "將扮演的MAC位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:401 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1475 msgid "MAC VLAN" msgstr "MAC VLAN" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:591 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:645 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:40 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:618 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2168 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2257 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:233 @@ -4688,11 +5245,15 @@ msgstr "MAC VLAN" msgid "MAC address" msgstr "MAC 位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:987 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:799 +msgid "MAC address(es)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:981 msgid "MAC-Filter" msgstr "MAC 過濾" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1091 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1086 msgid "MAC-List" msgstr "MAC 清單" @@ -4706,6 +5267,10 @@ msgstr "MAP / LW4over6 (IPv6群播技術)" msgid "MAP rule is invalid" msgstr "MAP 規則無效" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:24 +msgid "MBIM Cellular" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 msgid "MD5" msgstr "MD5" @@ -4727,15 +5292,19 @@ msgstr "MII 寄存器/ ETHTOOL輸入/輸出操作系統呼叫" msgid "MII Interval" msgstr "MII寄存器間隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1457 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:86 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:634 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:87 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:196 #: protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js:46 msgid "MTU" msgstr "MTU最大傳輸單元" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 +msgid "MX" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:303 msgid "" "Make sure to clone the root filesystem using something like the commands " @@ -4743,7 +5312,7 @@ msgid "" msgstr "確保使用以下命令複製根檔案系統:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:122 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:114 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:115 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:53 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:98 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:84 @@ -4752,69 +5321,73 @@ msgstr "確保使用以下命令複製根檔案系統:" msgid "Manual" msgstr "手動" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3863 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:82 +msgid "Manufacturer" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/network.js:3864 msgid "Master" msgstr "主要" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:920 +msgid "Match Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "Max RA interval" msgstr "最長 RA 間隔" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "最高可達到的數據速率 (ATTNDR)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:451 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:538 msgid "Max. DHCP leases" msgstr "" "最大 DHCP 租約" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:458 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 msgid "Max. EDNS0 packet size" msgstr "" "最大 EDNS0 封包大小" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:465 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:552 msgid "Max. concurrent queries" msgstr "最大同時查詢數量" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:532 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 msgid "Maximum age" msgstr "最大年齡" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1188 msgid "Maximum allowed Listen Interval" msgstr "允許的最大監聽間隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:452 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:539 msgid "Maximum allowed number of active DHCP leases." msgstr "允許啟用DHCP釋放的最大數量。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:466 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:553 msgid "Maximum allowed number of concurrent DNS queries." msgstr "允許同時齊發的DNS請求的最大數量。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:459 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:546 msgid "Maximum allowed size of EDNS0 UDP packets." msgstr "允許EDNS.0 協定的UDP封包最大數量。" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Maximum amount of seconds to wait for the modem to become ready" msgstr "等待數據機待命的最大秒數" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:674 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 msgid "Maximum number of leased addresses." msgstr "租約位址群的最大數量。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:596 msgid "Maximum snooping table size" msgstr "最大監聽表大小" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:865 msgid "" "Maximum time allowed between sending unsolicited RA. Default is 600 seconds." @@ -4822,10 +5395,14 @@ msgstr "" "傳送主動 RA 允許" "的最長時間間隔。預設為 600 秒。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "Maximum transmit power" msgstr "最大發射功率" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:464 +msgid "May prevent VoIP or other services from working." +msgstr "可能造成 VoIP 或其他服務無法運作。" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 @@ -4838,7 +5415,7 @@ msgstr "最大發射功率" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:330 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:331 msgid "Mbit/s" -msgstr "Mbit/秒" +msgstr "Mbit/s" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 msgid "Medium" @@ -4852,7 +5429,7 @@ msgstr "記憶體" msgid "Memory usage (%)" msgstr "記憶體使用率 (%)" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3866 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 msgid "Mesh" msgstr "蛛狀網路" @@ -4860,10 +5437,18 @@ msgstr "蛛狀網路" msgid "Mesh ID" msgstr "蛛狀網路ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:995 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 msgid "Mesh Id" msgstr "蛛狀網路id" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh Routing" +msgstr "網狀路由" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:41 +msgid "Mesh and routing related options" +msgstr "網格和路由相關選項" + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 msgid "Method not found" msgstr "找不到方式" @@ -4876,7 +5461,7 @@ msgstr "連線監視方式" msgid "Method to determine link status" msgstr "確定連接狀態的方式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:189 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:215 msgid "Metric" @@ -4887,11 +5472,11 @@ msgctxt "nft unit" msgid "MiB" msgstr "MiB" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "Min RA interval" msgstr "最短 RA 間隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "Minimum ARP validity time" msgstr "最小 ARP 有效時間" @@ -4899,13 +5484,13 @@ msgstr "最小 ARP 有效時間" msgid "Minimum Number of Links" msgstr "連線的最小數量" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:661 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:721 msgid "" "Minimum required time in seconds before an ARP entry may be replaced. " "Prevents ARP cache thrashing." msgstr "取代 ARP 項目所需的最短時間 (以秒為單位)。防止 ARP 快取崩潰。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:872 msgid "" "Minimum time allowed between sending unsolicited RA. Default is 200 seconds." @@ -4921,77 +5506,84 @@ msgstr "映射監測埠號" msgid "Mirror source port" msgstr "映射來源埠號" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:120 +msgid "Mobile Country Code" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 msgid "Mobile Data" msgstr "行動數據" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1524 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:123 +msgid "Mobile Network Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:167 +#: protocols/luci-proto-modemmanager/root/usr/share/luci/menu.d/luci-proto-modemmanager.json:3 +msgid "Mobile Service" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1562 msgid "Mobility Domain" msgstr "行動網域" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:434 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:488 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:493 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:990 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1751 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:378 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:486 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1840 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:404 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:148 msgid "Mode" msgstr "模式" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:83 msgid "Model" msgstr "裝置型號" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "數據機載體拆除進行中." +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:81 +msgid "Modem Info" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:9 msgid "" "Modem connection in progress. Please wait. This process will timeout after 2 " "minutes." msgstr "數據機連線進行中,請稍等。逾時時間為兩分鐘。" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 msgid "Modem default" msgstr "預設數據機" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:54 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:51 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:65 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 msgid "Modem device" msgstr "數據機設備" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "數據機斷線進行中. 請稍等." - #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 msgid "Modem information query failed" msgstr "數據機資訊查詢失敗" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:126 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:118 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:124 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:106 msgid "Modem init timeout" msgstr "數據機初始化逾時值" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "數據機被停用." - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:21 msgid "ModemManager" msgstr "數據機管理器" -#: modules/luci-base/htdocs/luci-static/resources/network.js:3867 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1078 +#: modules/luci-base/htdocs/luci-static/resources/network.js:3868 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1073 msgid "Monitor" msgstr "監視" @@ -5059,6 +5651,10 @@ msgstr "往下移" msgid "Move up" msgstr "往上移" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 +msgid "Multi To Unicast" +msgstr "多播到單播" + #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:89 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:94 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:91 @@ -5066,19 +5662,23 @@ msgstr "往上移" msgid "Multicast" msgstr "群播" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:705 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:99 +msgid "Multicast Mode" +msgstr "組播模式" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:773 msgid "Multicast routing" msgstr "多播路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:711 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:779 msgid "Multicast to unicast" msgstr "多播到單播" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "NAS ID" msgstr "網路儲存設備(NAS)ID" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:530 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:536 msgid "NAT action chain \"%h\"" msgstr "NAT 動作鏈 \"%h\"" @@ -5090,12 +5690,16 @@ msgstr "NAT-T 模式" msgid "NAT64 Prefix" msgstr "NAT64前綴字首" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +msgid "NAT64 prefix" +msgstr "" + #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:35 msgid "NCM" msgstr "NCM" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "NDP-Proxy slave" msgstr "NDP 代理從屬裝置" @@ -5108,18 +5712,23 @@ msgid "NTP server candidates" msgstr "候選 NTP 伺服器" #: modules/luci-base/htdocs/luci-static/resources/form.js:2618 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4139 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4193 #: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1104 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1163 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:68 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:36 msgid "Name" msgstr "名稱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "Name of the new network" msgstr "新網路的名稱" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:46 +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:38 +msgid "Name of the tunnel device" +msgstr "通道裝置名稱" + +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:39 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 msgid "Navigation" msgstr "導覽" @@ -5128,13 +5737,17 @@ msgstr "導覽" msgid "Nebula Network" msgstr "" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:653 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 +msgid "Neighbour Report" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:713 msgid "Neighbour cache validity" msgstr "鄰近快取有效性" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1023 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2167 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2256 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:232 @@ -5143,32 +5756,36 @@ msgstr "鄰近快取有效性" msgid "Network" msgstr "網路" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:104 +msgid "Network Coding" +msgstr "網絡編碼" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:76 msgid "Network Mode" msgstr "網路模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:97 +msgid "Network Registration" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "Network SSID" msgstr "網路SSID" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -msgid "Network Utilities" -msgstr "網路工具" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 msgid "Network address" msgstr "網路地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:491 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:578 msgid "Network boot image" msgstr "網路開機映像檔" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:409 msgid "Network bridge configuration migration" msgstr "橋接設定遷移" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1419 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481 msgid "Network device" msgstr "網路裝置" @@ -5181,7 +5798,7 @@ msgstr "活躍中的網路裝置 (kernel: netdev)" msgid "Network device is not present" msgstr "網路設備不存在" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:639 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:645 msgid "Network device table \"%h\"" msgstr "網絡設備表“%h”" @@ -5190,7 +5807,7 @@ msgctxt "nft @nh,off,len" msgid "Network header bits %d-%d" msgstr "網絡標頭位 %d-%d" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:426 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:443 msgid "Network ifname configuration migration" msgstr "網路 ifname 設定遷移" @@ -5199,25 +5816,31 @@ msgstr "網路 ifname 設定遷移" msgid "Network interface" msgstr "網路界面" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:617 msgid "Network-ID" msgstr "網路-ID" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:706 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:774 msgid "Never" msgstr "永不" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:270 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:16 +#, fuzzy +msgctxt "No WireGuard peer handshake yet" +msgid "Never" +msgstr "永不" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 msgid "" "Never forward matching domains and subdomains, resolve from DHCP or hosts " "files only." msgstr "區網規範。不轉發與此網域符合的名稱,且僅從 DHCP 或 host 文件中解析。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1156 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1215 msgid "New interface for \"%s\" can not be created: %s" msgstr "\"%s\" 的新介面無法建立: %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1166 msgid "New interface name…" msgstr "新介面名稱…" @@ -5225,13 +5848,13 @@ msgstr "新介面名稱…" msgid "Next »" msgstr "下一個 »" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:298 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:346 msgid "No" msgstr "不" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:643 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:660 msgid "No DHCP Server configured for this interface" msgstr "在這個介面尚無DHCP伺服器" @@ -5239,7 +5862,7 @@ msgstr "在這個介面尚無DHCP伺服器" msgid "No Data" msgstr "無資料" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1389 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1391 msgid "No Encryption" msgstr "無加密網路" @@ -5255,9 +5878,17 @@ msgstr "無 NAT-T" msgid "No RX signal" msgstr "沒有 RX 信號" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:148 +msgid "No WireGuard interfaces configured." +msgstr "未設定 WireGuard 介面。" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:16 +msgid "No allowed mode configuration found." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:88 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:65 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90 msgid "" "No changes to settings will be stored and are lost after rebooting. This " @@ -5270,7 +5901,11 @@ msgstr "" msgid "No client associated" msgstr "沒有已連接客戶端" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3206 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +msgid "No control device specified" +msgstr "未指定控制裝置" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:3230 msgctxt "empty table placeholder" msgid "No data" msgstr "暫無數據" @@ -5279,8 +5914,8 @@ msgstr "暫無數據" msgid "No data received" msgstr "未收到任何資料" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:690 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:751 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:758 msgid "No enforcement" msgstr "不強制" @@ -5293,15 +5928,11 @@ msgstr "不強制" msgid "No entries available" msgstr "沒有可用的項目" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2908 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2932 msgid "No entries in this directory" msgstr "在這目錄中缺乏項目" -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "未找到檔案" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:843 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:846 msgid "" "No fixed interface listening port defined, peers might not be able to " "initiate connections to this WireGuard instance!" @@ -5316,7 +5947,7 @@ msgstr "" msgid "No host route" msgstr "無主機路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:725 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:362 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 @@ -5337,30 +5968,40 @@ msgstr "缺乏更多可用的實體界面" msgid "No more slaves available, can not save interface" msgstr "缺乏更多可用的實體界面, 無法儲存界面" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 msgid "No negative cache" msgstr "無負向快取" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:690 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:696 msgid "No nftables ruleset loaded." msgstr "未加載 nftables 規則集。" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:77 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:54 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 msgid "No password set!" msgstr "没有設定密碼!" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:512 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:84 +#, fuzzy +msgid "No peers connected" +msgstr "尚未連線" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:510 msgid "No peers defined yet." msgstr "尚未定義對端。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:140 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:277 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:15 +msgid "No preferred mode configuration found." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 msgid "No public keys present yet." msgstr "尚無可用公鑰。" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:607 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:613 msgctxt "nft chain is empty" msgid "No rules in this chain" msgstr "此鏈中沒有規則" @@ -5374,7 +6015,8 @@ msgid "No validation or filtering" msgstr "沒有驗證或過濾" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "No zone assigned" msgstr "未分配區域" @@ -5386,37 +6028,40 @@ msgstr "未分配區域" msgid "Noise" msgstr "雜訊比" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Noise Margin (SNR)" -msgstr "訊號雜訊比 (SNR)" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 +msgid "Noise Margin" +msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:272 msgid "Noise:" msgstr "雜訊比:" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "非搶先CRC錯誤 (CRC_P)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 msgid "Non-wildcard" msgstr "非-萬用字元" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:80 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:83 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:112 msgid "None" msgstr "無" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:955 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:949 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:198 msgid "Normal" msgstr "正常" -#: modules/luci-base/luasrc/view/error404.htm:8 +#: modules/luci-base/ucode/template/error404.ut:9 msgid "Not Found" msgstr "尚未發現" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:211 +msgctxt "VLAN port state" +msgid "Not Member" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 msgid "Not associated" msgstr "尚未關聯" @@ -5429,7 +6074,7 @@ msgstr "尚未連線" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:121 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:147 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:312 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:329 msgid "Not present" msgstr "不存在" @@ -5441,12 +6086,18 @@ msgstr "開機時未啟動" msgid "Not supported" msgstr "不支援" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1777 msgid "" "Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may " "have problems" msgstr "注意:某些無線驅動程式並不完全支援 802.11w。例如:mwlwifi 可能有問題" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +msgid "" +"Note: you may also need a DHCP Proxy (currently unavailable) when specifying " +"a non-standard Relay To port(addr#port)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Notes" msgstr "註解" @@ -5455,7 +6106,7 @@ msgstr "註解" msgid "Notice" msgstr "注意" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:138 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:135 msgid "Nslookup" msgstr "名稱伺服器查詢" @@ -5463,7 +6114,7 @@ msgstr "名稱伺服器查詢" msgid "Number of IGMP membership reports" msgstr "IGMP成員數量報告" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:560 msgid "Number of cached DNS entries, 10000 is maximum, 0 is no caching." msgstr "快取DNS項目數量(最大值為10000,輸入0代表不快取)。" @@ -5480,7 +6131,7 @@ msgid "Obfuscated Password" msgstr "混淆密碼" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:118 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 @@ -5491,6 +6142,7 @@ msgid "Obtain IPv6 address" msgstr "取得IPv6-位址" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:87 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 msgid "Off" msgstr "關" @@ -5499,6 +6151,12 @@ msgstr "關" msgid "Off-State Delay" msgstr "熄滅狀態間隔" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "" +"Off: vlanXXX, e.g., vlan1. On: " +"vlan_tagged_interface.XXX, e.g. eth0.1." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:19 msgid "On" msgstr "開" @@ -5507,15 +6165,15 @@ msgstr "開" msgid "On-State Delay" msgstr "狀態延遲" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "On-link" msgstr "連接路線" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:867 msgid "One of hostname or MAC address must be specified!" msgstr "主機名稱或 mac 位址至少要有一個被指定!" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:481 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:490 msgid "One of the following: %s" msgstr "以下之一: %s" @@ -5533,7 +6191,11 @@ msgstr "在標籤上的一個或多個無效/必需值" msgid "One or more required fields have no value!" msgstr "有一個以上的欄位缺乏任何數值!" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:413 +msgid "Only accept replies via" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Only allow communication with non-isolated bridge ports when enabled" msgstr "啟用後僅允許與非隔離橋接連接埠通信" @@ -5542,25 +6204,24 @@ msgid "" "Only if current active slave fails and the primary slave is up (failure, 2)" msgstr "僅當當前活躍的實體界面發生故障, 並且主要實體界面上線時(失敗,2)" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:676 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:682 msgid "Open iptables rules overview…" msgstr "打開 iptables 規則概述…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 msgid "Open list..." msgstr "開啟清單..." #: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:65 msgid "OpenConnect (CISCO AnyConnect)" msgstr "OpenConnect (思科 AnyConnect)" -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:63 msgid "OpenFortivpn" msgstr "OpenFortivpn (Fortinet專屬VPN)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:724 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:741 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise disable 中繼模式
    執行,否則停用 " "NDP 代理。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:723 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:740 msgid "" "Operate in relay mode if a designated master interface is " "configured and active, otherwise fall back to server mode." @@ -5577,18 +6238,30 @@ msgstr "" "如指定的主介面已設定且處於活躍狀態,則以中繼模式執行,否則退回到" "伺服器模式。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:725 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:742 msgid "" "Operate in relay mode if an upstream IPv6 prefix is present, " "otherwise disable service." msgstr "如存在上游 IPv6 前綴則以中繼模式執行,否則停用服務。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:940 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 msgid "Operating frequency" msgstr "操作頻率" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:100 +msgid "Operator" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:101 +msgid "Operator Code" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:135 +msgid "Operator Name" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2006 -#: modules/luci-base/htdocs/luci-static/resources/form.js:4097 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4106 msgid "Option \"%s\" contains an invalid input value." msgstr "選項 \"%s\" 含有無效的輸入數值。" @@ -5596,29 +6269,38 @@ msgstr "選項 \"%s\" 含有無效的輸入數值。" msgid "Option \"%s\" must not be empty." msgstr "選項 \"%s\" 必須不能為空值。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4391 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4445 msgid "Option changed" msgstr "選項已變更" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4393 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4447 msgid "Option removed" msgstr "選項已移除" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1440 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1779 msgid "Optional" msgstr "可選" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:786 +msgid "Optional hostname to assign" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:142 msgid "Optional, free-form notes about this device" msgstr "此裝置的可選任意格式註解" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Optional, in seconds. If set to '0', no reconnect is attempted." +msgstr "可選,以秒為單位。如果設定為「0」,則不嘗試重新連線。" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:201 msgid "" "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " "starting with 0x." msgstr "可選性. 傳出的加密封包的32位元標記. 以十六進制0x為輸入值." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1025 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1084 msgid "" "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " "'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " @@ -5629,7 +6311,7 @@ msgstr "" "收到IPv6前綴(如'a :b :c :d ::')時, 請使用後綴(如':: 1')形成IPv6地址('a :b :" "c :d : :1')." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "" "Optional. Base64-encoded preshared key. Adds in an additional layer of " "symmetric-key cryptography for post-quantum resistance." @@ -5637,11 +6319,11 @@ msgstr "" "可選性. Base64編碼的預先共享金鑰. 新增了額外一層對稱金鑰密碼學, 以便針對後量" "子攻擊的抵抗力." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Optional. Create routes for Allowed IPs for this peer." msgstr "可選性. 對已允許的IP對等節點創建路由表." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:519 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:517 msgid "Optional. Description of peer." msgstr "可選性. 對等節點描述." @@ -5649,13 +6331,13 @@ msgstr "可選性. 對等節點描述." msgid "Optional. Do not create host routes to peers." msgstr "可選性. 針對對等節點群別建立主機路由表." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:664 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:662 msgid "" "Optional. Host of peer. Names are resolved prior to bringing up the " "interface." msgstr "可選性. 對等節點主機. 名稱在啟動界面之前已解析." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:626 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:624 msgid "" "Optional. IP addresses and prefixes that this peer is allowed to use inside " "the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " @@ -5672,11 +6354,11 @@ msgstr "自選。XFRM 介面的最大傳輸單元。" msgid "Optional. Maximum Transmission Unit of tunnel interface." msgstr "可選性. 隧道界面的MTU." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:680 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:678 msgid "Optional. Port of peer." msgstr "可選性. 節點的埠號." -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "" "Optional. Private key of the WireGuard peer. The key is not required for " "establishing a connection but allows generating a peer configuration or QR " @@ -5686,7 +6368,7 @@ msgstr "" "可選。WireGuard 對端的私鑰。該金鑰不是建立連接所必需的,但允許產生對端設定或 " "QR code (如果可用)。匯出設定後可以將其刪除。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "" "Optional. Seconds between keep alive messages. Default is 0 (disabled). " "Recommended value if this device is behind a NAT is 25." @@ -5702,7 +6384,7 @@ msgstr "可選性. 用於進出封包的UDP埠號." msgid "Options" msgstr "選項" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:525 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:612 msgid "" "Options for the Network-ID. (Note: needs also Network-ID.) E.g. " "\"42,192.168.1.4\" for NTP server, \"3,192.168.4.4”,預設路由為“3,192.168.4.4”。0.0.0.0 表示" "「運行 dnsmasq 的系統位址」。。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:125 msgid "Options:" msgstr "選項:" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +msgid "Ordinal: lower comes first." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:55 +msgid "Originator Interval" +msgstr "發起人間隔" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:348 msgid "Other:" msgstr "其它:" @@ -5736,7 +6427,7 @@ msgstr "外連:" msgid "Outgoing checksum" msgstr "輸出校驗值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Outgoing interface" msgstr "傳出介面" @@ -5744,6 +6435,7 @@ msgstr "傳出介面" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:101 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:68 msgid "Outgoing key" msgstr "輸出金鑰" @@ -5767,21 +6459,23 @@ msgstr "輸出的區域" msgid "Overlap" msgstr "交疊" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:962 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1021 msgid "Override IPv4 routing table" msgstr "覆蓋 IPv4 路由表" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1026 msgid "Override IPv6 routing table" msgstr "覆蓋 IPv6 路由表" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:54 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:69 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:74 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:132 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:156 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:128 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:142 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:194 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:57 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:132 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:118 @@ -5789,6 +6483,7 @@ msgstr "覆蓋 IPv6 路由表" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:105 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:110 #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:62 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:55 msgid "Override MTU" msgstr "覆蓋MTU數值" @@ -5810,7 +6505,7 @@ msgstr "覆蓋TOS" msgid "Override TTL" msgstr "覆寫TTL" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1161 msgid "" "Override default MAC address - the range of usable addresses might be " "limited by the driver" @@ -5824,7 +6519,7 @@ msgstr "覆寫預設介面名稱" msgid "Override the gateway in DHCP responses" msgstr "在DHCP回應中覆蓋閘道" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:708 msgid "" "Override the netmask sent to clients. Normally it is calculated from the " "subnet that is served." @@ -5838,7 +6533,7 @@ msgstr "覆蓋之前內部使用的路由表" msgid "Overview" msgstr "概覽" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2756 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2780 msgid "Overwrite existing file \"%s\" ?" msgstr "覆蓋現有文件 \"%s\" ?" @@ -5846,17 +6541,30 @@ msgstr "覆蓋現有文件 \"%s\" ?" msgid "Overwrite the current settings with the imported configuration?" msgstr "用匯入的設定覆蓋目前設定?" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:98 +msgid "Own Numbers" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 msgid "Owner" msgstr "持有者" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:109 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:78 +msgid "PAP" +msgstr "" + +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:77 +msgid "PAP/CHAP" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:80 msgid "PAP/CHAP (both)" msgstr "PAP/CHAP (並用)" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:111 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:103 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:88 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:130 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:107 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:90 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 @@ -5868,8 +6576,9 @@ msgid "PAP/CHAP password" msgstr "PAP/CHAP驗證密碼" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:109 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:101 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:83 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:125 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:105 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:88 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 @@ -5880,6 +6589,7 @@ msgstr "PAP/CHAP驗證密碼" msgid "PAP/CHAP username" msgstr "PAP/CHAP驗證用戶名稱" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:94 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:114 msgid "PDP Type" msgstr "PDP類型" @@ -5889,8 +6599,9 @@ msgid "PID" msgstr "PID碼" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:73 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:76 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:102 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:79 msgid "PIN" msgstr "PIN碼" @@ -5900,7 +6611,7 @@ msgstr "PIN碼" msgid "PIN code rejected" msgstr "已拒絕的PIN碼" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1597 msgid "PMK R1 Push" msgstr "PMK R1推送" @@ -5916,7 +6627,7 @@ msgstr "PPPoA封裝" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:19 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:28 msgid "PPPoATM" -msgstr "PPPoATM協定" +msgstr "PPPoATM" #: modules/luci-compat/luasrc/model/network/proto_ppp.lua:17 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:28 @@ -5941,28 +6652,37 @@ msgstr "PSID偏移" msgid "PSID-bits length" msgstr "PSID-位元 長度" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:573 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:571 msgctxt "Label indicating that WireGuard peer uses a PSK" msgid "PSK" msgstr "PSK" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1580 msgid "PTM/EFM (Packet Transfer Mode)" msgstr "PTM/EFM (封包傳輸模式)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:254 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 msgid "PXE/TFTP Settings" msgstr "PXE/TFTP 設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1476 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:103 +msgid "Packet Service State" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1538 msgid "Packet Steering" msgstr "封包操控" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:26 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:25 msgctxt "nft meta mark" msgid "Packet mark" msgstr "數據包標記" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:27 +msgctxt "nft meta time" +msgid "Packet receive time" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 msgid "Packets" msgstr "封包" @@ -5971,23 +6691,29 @@ msgstr "封包" msgid "Packets To Transmit Before Moving To Next Slave" msgstr "在移至下一個實體界面之前要發送的封包" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:291 +msgid "Part of network:" +msgid_plural "Part of networks:" +msgstr[0] "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1201 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1260 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:259 msgid "Part of zone %q" msgstr "區域 %q 的部分" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:438 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:492 msgctxt "MACVLAN mode" msgid "Pass-through (Mirror physical device to single MAC VLAN)" msgstr "直通 (Pass-through, 將物理裝置鏡像到單個 MAC VLAN)" -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 +#: modules/luci-base/ucode/template/sysauth.ut:29 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:149 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19 msgid "Password" msgstr "密碼" @@ -5995,11 +6721,11 @@ msgstr "密碼" msgid "Password authentication" msgstr "密碼驗證" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1613 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1702 msgid "Password of Private Key" msgstr "私鑰密碼" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1671 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1760 msgid "Password of inner Private Key" msgstr "內部私鑰密碼" @@ -6010,19 +6736,19 @@ msgstr "內部私鑰密碼" msgid "Password strength" msgstr "密碼強度" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:117 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:152 msgid "Password2" msgstr "密碼2" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:260 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:266 msgid "Paste or drag SSH key file…" msgstr "貼上或拖曳 SSH 金鑰至此…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:446 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:444 msgid "Paste or drag WireGuard peer configuration (wg0.conf) file…" msgstr "粘貼或拖動 WireGuard 對等配置 (wg0.conf) 檔…" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:439 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:437 msgid "" "Paste or drag a WireGuard configuration (commonly wg0.conf) from " "another system below to create a matching peer entry allowing that system to " @@ -6031,31 +6757,31 @@ msgstr "" "從下面的另一個系統中貼上或拖曳 WireGuard 設定(通常為 wg0.conf),以建" "立相符的對等項目,允許該系統連接到本地 WireGuard 介面。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:445 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:443 msgid "Paste or drag supplied WireGuard configuration file…" msgstr "貼上或拖動提供的 WireGuard 設定檔…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1681 msgid "Path to CA-Certificate" msgstr "CA 憑證路徑" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1696 msgid "Path to Client-Certificate" msgstr "用戶憑證的路徑" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1699 msgid "Path to Private Key" msgstr "私鑰的路徑" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1650 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1739 msgid "Path to inner CA-Certificate" msgstr "內部CA憑證路徑" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1754 msgid "Path to inner Client-Certificate" msgstr "內部用戶憑證的路徑" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1668 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1757 msgid "Path to inner Private Key" msgstr "內部私鑰的路徑" @@ -6077,11 +6803,19 @@ msgstr "已暫停" msgid "Peak:" msgstr "峰值:" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:74 +msgid "Peer" +msgstr "對端" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:51 +msgid "Peer Details" +msgstr "" + #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 msgid "Peer IP address to assign" msgstr "指定對等節點IP位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:613 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:667 msgid "Peer MAC address" msgstr "對端 MAC 位址" @@ -6090,11 +6824,11 @@ msgstr "對端 MAC 位址" msgid "Peer address is missing" msgstr "對等節點位址遺失中" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:594 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:648 msgid "Peer device name" msgstr "對端裝置名稱" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:515 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:513 msgid "Peer disabled" msgstr "對等已禁用" @@ -6125,10 +6859,14 @@ msgstr "執行重置" msgid "Permission denied" msgstr "權限不符" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:685 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:683 msgid "Persistent Keep Alive" msgstr "持久保持活力" +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:147 +msgid "Persistent reconnect interval" +msgstr "持續重新連線間隔" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:334 msgid "PersistentKeepAlive setting is invalid" msgstr "PersistentKeepAlive 設定無效" @@ -6137,13 +6875,13 @@ msgstr "PersistentKeepAlive 設定無效" msgid "Phy Rate:" msgstr "物理傳輸速率:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:479 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:496 msgid "Physical Settings" msgstr "硬體設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:87 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:88 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:98 msgid "Ping" msgstr "Ping" @@ -6156,11 +6894,11 @@ msgstr "Ping" msgid "Pkts." msgstr "Pkts(流量單位)." -#: modules/luci-base/luasrc/view/sysauth.htm:19 +#: modules/luci-base/ucode/template/sysauth.ut:19 msgid "Please enter your username and password." msgstr "請輸入您的用戶名稱和密碼。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4176 msgid "Please select the file to upload." msgstr "請選擇要上傳的檔案。" @@ -6168,56 +6906,75 @@ msgstr "請選擇要上傳的檔案。" msgid "Policy" msgstr "政策" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:588 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:594 msgctxt "Chain hook policy" msgid "Policy: %h (%h)" msgstr "原則: %h (%h)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:660 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 msgid "Port" msgstr "連接埠" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:702 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:137 +#, fuzzy +msgctxt "WireGuard listen port" +msgid "Port %d" +msgstr "埠 %d" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:293 +msgid "Port is not part of any network" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:770 msgid "Port isolation" msgstr "連接埠隔離" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:299 +msgid "Port status" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 msgid "Port status:" msgstr "埠狀態:" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:507 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:516 msgid "Potential negation of: %s" -msgstr "可能反取: %s" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "Power Management Mode" -msgstr "電源管理模式" +msgstr "可能反取: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "搶先式CRC錯誤(CRCP_P)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:89 +msgid "Power State" +msgstr "" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 msgid "Prefer LTE" msgstr "偏好 LTE" -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:75 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 msgid "Prefer UMTS" msgstr "偏好 UMTS" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:979 +msgid "Preferred lifetime for a prefix." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:106 +msgid "Preferred network technology" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 msgid "Prefix Delegated" msgstr "前綴委派" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "Prefix suppressor" msgstr "前綴抑制器" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:601 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:599 msgid "Preshared Key" msgstr "預先共享金鑰" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:572 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:570 msgid "Preshared key in use" msgstr "預先共用金鑰使用中" @@ -6240,15 +6997,18 @@ msgstr "在給定數量的LCP迴聲失敗後, 假定對等節點已死, 使用0 msgid "Prevents client-to-client communication" msgstr "防止用戶端對用戶端的通訊" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:61 +msgid "" +"Prevents one wireless client to talk to another. This setting only affects " +"packets without any VLAN tag (untagged packets)." +msgstr "" +"防止一個無線客戶端與另一個客戶端通話。 此設置僅影響沒有任何 VLAN 標記的數據包" +"(未標記的數據包)。" + #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:213 msgid "Primary Slave" msgstr "主要的實體界面" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:170 -msgctxt "VLAN port state" -msgid "Primary VLAN ID" -msgstr "主要 VLAN ID" - #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:230 msgid "" "Primary becomes active slave when it comes back up if speed and duplex " @@ -6261,29 +7021,31 @@ msgstr "" msgid "Primary becomes active slave whenever it comes back up (always, 0)" msgstr "邏輯主控在恢復後, 始終變為活動的實體界面 (永遠, 0)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:508 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:562 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:665 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:697 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:223 msgid "Priority" msgstr "優先順序" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:567 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:565 msgctxt "Label indicating that WireGuard peer private key is stored" msgid "Private" msgstr "Private" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:436 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:490 msgctxt "MACVLAN mode" msgid "Private (Prevent communication between MAC VLANs)" msgstr "專用(防止MAC VLAN之間的通信)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:151 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:592 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:590 msgid "Private Key" msgstr "私鑰" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:566 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:564 msgid "Private key present" msgstr "存在私鑰" @@ -6301,8 +7063,8 @@ msgid "Prot." msgstr "協定." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:571 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1180 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:191 @@ -6314,14 +7076,14 @@ msgstr "協定" msgid "Provide NTP server" msgstr "提供 NTP 伺服器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:930 msgid "" "Provide a DHCPv6 server on this interface and reply to DHCPv6 solicitations " "and requests." msgstr "" "在這個介面上提供一個 DHCPv6 伺服器並回覆至 DHCPv6 solicitations 和請求。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:883 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 msgid "Provide new network" msgstr "提供新網路" @@ -6331,25 +7093,36 @@ msgid "" "interfaces" msgstr "將 NTP 服務器提供給選定的接口,或者,如果未指定,則提供給所有接口" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1077 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:155 +msgid "Proxy Server" +msgstr "代理伺服器" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1653 +msgid "ProxyARP" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1072 msgid "Pseudo Ad-Hoc (ahdemo)" msgstr "偽裝 Ad-Hoc (ahdemo模式)" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:158 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:37 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:54 msgid "Public Key" msgstr "公鑰" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:549 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:547 msgid "Public key is missing" msgstr "缺少公開金鑰" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:558 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:556 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:101 msgctxt "Tooltip displaying full WireGuard peer public key" msgid "Public key: %h" msgstr "公開金鑰:%h" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:290 msgid "" "Public keys allow for the passwordless SSH logins with a higher security " "compared to the use of plain passwords. In order to upload a new key to the " @@ -6376,60 +7149,84 @@ msgstr "QMI手機" msgid "Quality" msgstr "品質" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:514 msgid "Query all available upstream resolvers." msgstr "" "查詢所有可用的上游 DNS 伺服器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:556 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:610 msgid "Query interval" msgstr "查詢間隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "Query response interval" msgstr "查詢回應間隔" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "R0 Key Lifetime" msgstr "R0 金鑰存留期" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1553 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1591 msgid "R1 Key Holder" msgstr "R1金鑰持有者" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1423 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1425 msgid "RADIUS Accounting Port" msgstr "Radius-驗証帳號-埠" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1429 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "RADIUS Accounting Secret" msgstr "Radius-合法帳號-密碼" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1418 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1420 msgid "RADIUS Accounting Server" msgstr "Radius-合法帳號-伺服器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1409 msgid "RADIUS Authentication Port" msgstr "Radius-驗証-埠" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1413 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1415 msgid "RADIUS Authentication Secret" msgstr "Radius-驗証-密碼" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1404 msgid "RADIUS Authentication Server" msgstr "Radius-驗証-伺服器" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "RADIUS Dynamic VLAN Assignment" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1446 +msgid "RADIUS Per STA VLAN" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1463 +msgid "RADIUS VLAN Bridge Naming Scheme" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1450 +msgid "RADIUS VLAN Naming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1453 +msgid "RADIUS VLAN Tagged Interface" +msgstr "" + #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" msgstr "RFC3947 NAT-T 模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1003 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +msgid "RSN Preauth" +msgstr "RSN 預先驗證" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "RSSI threshold for joining" msgstr "RSSI 加入閾值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:967 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:961 msgid "RTS/CTS Threshold" msgstr "RTS/CTS 門檻" @@ -6442,10 +7239,16 @@ msgstr "接收" msgid "RX Rate" msgstr "接收速率" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2260 msgid "RX Rate / TX Rate" msgstr "接收速率 / 發送速率" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1614 +msgid "" +"Radio Resource Measurement - Sends beacons to assist roaming. Not all " +"clients support this." +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:61 msgctxt "nft nat flag random" msgid "Randomize source port mapping" @@ -6455,11 +7258,11 @@ msgstr "隨機化源埠映射" msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" msgstr "原生十六進制-編碼的位元組. 除非您的ISP要求否則將其留空" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:420 msgid "Read /etc/ethers to configure the DHCP server." msgstr "讀取 /etc/ether 以配置 DHCP 伺服器。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:559 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Really switch protocol?" msgstr "確定要更換協定?" @@ -6467,11 +7270,11 @@ msgstr "確定要更換協定?" msgid "Realtime Graphs" msgstr "即時圖表" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "Reassociation Deadline" msgstr "重新關聯期限" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:312 msgid "Rebind protection" msgstr "重新綁護" @@ -6495,11 +7298,40 @@ msgstr "重新啟動您的裝置的作業系統" msgid "Receive" msgstr "接收" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:243 +msgid "Receive dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:242 +msgid "Receive errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:57 +#, fuzzy +msgid "Received Data" +msgstr "接收" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:239 +msgid "Received bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:241 +msgid "Received multicast" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:240 +msgid "Received packets" +msgstr "" + #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:181 msgid "Recommended. IP addresses of the WireGuard interface." msgstr "推薦的. WireGuard界面的IP地址." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:504 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:199 +msgid "Reconnect Timeout" +msgstr "重新連線逾時" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:521 msgid "Reconnect this interface" msgstr "重新連接這個介面" @@ -6507,12 +7339,12 @@ msgstr "重新連接這個介面" msgid "Redirect to HTTPS" msgstr "重定向至“HTTPS”" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:118 msgctxt "nft redirect to port" msgid "Redirect to local port %h" msgstr "重定向至「本地埠%h」診斷樹" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:116 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:117 msgctxt "nft redirect" msgid "Redirect to local system" msgstr "重定向至「本地系統」診斷樹" @@ -6521,37 +7353,47 @@ msgstr "重定向至「本地系統」診斷樹" msgid "References" msgstr "引用" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:373 +msgid "Refresh Channels" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/luci.js:2721 msgid "Refreshing" msgstr "重新整理" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:102 +msgid "Registration State" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 msgctxt "nft reject with icmp type" msgid "Reject IPv4 packet with ICMP type %h" msgstr "拒絕ICMP類型為 %h的IPv4資料包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:103 msgctxt "nft reject with icmpx type" msgid "Reject packet with ICMP type %h" msgstr "拒絕ICMP類型為 %h 的資料包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:101 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:102 msgctxt "nft reject with icmpv6 type" msgid "Reject packet with ICMPv6 type %h" msgstr "拒絕ICMPv6類型為 %h 的數據包" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:99 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:100 msgctxt "nft reject with tcp reset" msgid "Reject packet with TCP reset" msgstr "使用 TCP 重置拒絕數據包" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:191 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:192 msgid "" "Reject routing decisions that have a prefix length less than or equal to the " "specified value" msgstr "拒絕前綴長度小於或等於指定值的路由決策" #: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:262 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:692 #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 msgid "Relay" msgstr "延遲" @@ -6561,6 +7403,10 @@ msgstr "延遲" msgid "Relay Bridge" msgstr "橋接延遲" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:355 +msgid "Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4." +msgstr "" + #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 msgid "Relay between networks" msgstr "網路間的延遲" @@ -6570,6 +7416,14 @@ msgstr "網路間的延遲" msgid "Relay bridge" msgstr "橋接延遲" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:367 +msgid "Relay from" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:387 +msgid "Relay to address" +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 @@ -6579,6 +7433,7 @@ msgstr "遠端IPv4位址" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "Remote IPv4 address or FQDN" msgstr "遠端IPv4位址或FQDN" @@ -6591,15 +7446,23 @@ msgstr "遠端IPv6位址" msgid "Remote IPv6 address or FQDN" msgstr "遠端IPv6位址或FQDN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 msgid "Remove" msgstr "移除" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1302 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:474 +msgid "Remove IPv4 addresses from the results and only return IPv6 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:468 +msgid "Remove IPv6 addresses from the results and only return IPv4 addresses." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1361 msgid "Remove related device settings from the configuration" msgstr "從設定中移除相關的裝置設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2013 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2102 msgid "Replace wireless configuration" msgstr "替代性無線設定" @@ -6629,7 +7492,8 @@ msgstr "要求輸入的校驗和 (可選的)." msgid "Require incoming packets serialization (optional)." msgstr "要求輸入封包序列化 (可選的)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1691 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1780 msgid "Required" msgstr "必需" @@ -6645,7 +7509,7 @@ msgstr "必需的. 對此界面的以Base64編碼的私鑰." msgid "Required. Path to the .yml config file for this interface." msgstr "" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:587 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:585 msgid "Required. Public key of the WireGuard peer." msgstr "必需。WireGuard 對端的公開金鑰。" @@ -6657,67 +7521,73 @@ msgstr "必填。底層介面。" msgid "Required. XFRM interface ID to be used for SA." msgstr "必填。用於 SA 的 XFRM 介面 ID。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 +msgid "" +"Required: Rejects auth if RADIUS server does not provide appropriate VLAN " +"attributes." +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1320 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 msgid "Requires hostapd" msgstr "要求 hostapd" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 msgid "Requires hostapd with EAP Suite-B support" msgstr "要求 hostapd支援EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1325 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1326 msgid "Requires hostapd with EAP support" msgstr "要求 hostapd支援EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1327 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1329 msgid "Requires hostapd with OWE support" msgstr "要求 hostapd支援OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1321 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1322 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1324 msgid "Requires hostapd with SAE support" msgstr "要求 hostapd支援SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1318 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1319 msgid "Requires hostapd with WEP support" msgstr "要求 hostapd支援WEP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1334 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1347 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1349 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1350 msgid "Requires wpa-supplicant" msgstr "要求wpa-supplicant" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1342 msgid "Requires wpa-supplicant with EAP Suite-B support" msgstr "要求wpa-supplicant支援EAP Suite-B" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1339 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1340 msgid "Requires wpa-supplicant with EAP support" msgstr "要求wpa-supplicant支援EAP" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1341 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 msgid "Requires wpa-supplicant with OWE support" msgstr "要求wpa-supplicant支援OWE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1335 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1336 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1351 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1337 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 msgid "Requires wpa-supplicant with SAE support" msgstr "要求wpa-supplicant支援SAE" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1330 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1331 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1332 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 msgid "Requires wpa-supplicant with WEP support" msgstr "要求wpa-supplicant支援WEP" @@ -6726,7 +7596,7 @@ msgid "Reselection policy for primary slave" msgstr "實體界面的重選政策" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2197 -#: modules/luci-base/luasrc/view/sysauth.htm:39 +#: modules/luci-base/ucode/template/sysauth.ut:39 #: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:30 #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 @@ -6741,20 +7611,24 @@ msgstr "重置計數器" msgid "Reset to defaults" msgstr "回復預設值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:253 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 msgid "Resolv and Hosts Files" msgstr "解析和Hosts檔案" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:356 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 msgid "Resolv file" msgstr "解析檔" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:298 +msgid "Resolve specified FQDNs to an IP." +msgstr "列出網域以便強制到某個IP位址." + #: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 msgid "Resource not found" msgstr "找不到資源" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:506 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:875 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:523 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:869 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 msgid "Restart" msgstr "重新啟動" @@ -6763,7 +7637,7 @@ msgstr "重新啟動" msgid "Restart Firewall" msgstr "重啟防火牆" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:873 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:867 msgid "Restart radio interface" msgstr "重啟無線介面" @@ -6775,86 +7649,100 @@ msgstr "還原" msgid "Restore backup" msgstr "還原之前備份設定" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:392 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:479 msgid "" "Return answers to DNS queries matching the subnet from which the query was " "received if multiple IPs are available." msgstr "若有多個IP可用, 本地化主機名稱端看請求的子網路而言." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:385 #: modules/luci-base/htdocs/luci-static/resources/ui.js:386 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:387 msgid "Reveal/hide password" msgstr "顯示/隱藏 密碼" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:625 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:679 msgid "Reverse path filter" msgstr "反轉路徑過濾器" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4413 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4467 msgid "Revert" msgstr "還原" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4518 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4572 msgid "Revert changes" msgstr "還原更改" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4730 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4784 msgid "Revert request failed with status %h" msgstr "還原請求失敗狀態碼%h" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4710 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4764 msgid "Reverting configuration…" msgstr "正在還原設定值…" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:110 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:84 +msgid "Revision" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 msgctxt "nft dnat ip to addr" msgid "Rewrite destination to %h" msgstr "將目標重寫為 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:113 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 msgctxt "nft dnat ip6 to addr" msgid "Rewrite destination to %h" msgstr "將目標重寫為 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:111 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:112 msgctxt "nft dnat ip to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "將目標重寫為 %h,埠 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:114 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:115 msgctxt "nft dnat ip6 to addr:port" msgid "Rewrite destination to %h, port %h" msgstr "將目標重寫為 %h,埠 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:104 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 msgctxt "nft snat ip to addr" msgid "Rewrite source to %h" msgstr "將源重寫為 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:107 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 msgctxt "nft snat ip6 to addr" msgid "Rewrite source to %h" msgstr "將源重寫為 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:105 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:106 msgctxt "nft snat ip to addr:port" msgid "Rewrite source to %h, port %h" msgstr "將源重寫為 %h,埠 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:108 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:109 msgctxt "nft snat ip6 to addr:port" msgid "Rewrite source to %h, port %h" msgstr "將源重寫為 %h,埠 %h" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:119 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:120 msgid "Rewrite to egress device address" msgstr "重寫為出口設備位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1485 +#, fuzzy +msgid "" +"Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks " +"(and advertise it in WLAN beacons). Only works if the specified network " +"interface is a bridge. Shortens the time-critical reassociation process." +msgstr "" +"健全安全網路 (RSN):允許 WPA2-EAP 網路的漫遊預先驗證 (並在 WLAN 指標中發佈" +"它)。只有當指定的網路介面是橋接時才有效。縮短時序要求嚴格的重新關聯過程。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "Robustness" msgstr "加強性" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:485 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:572 msgid "" "Root directory for files served via TFTP. Enable TFTP server and " "TFTP server root turn on the TFTP server and serve files from " @@ -6871,19 +7759,19 @@ msgstr "預備根系統" msgid "Round-Robin policy (balance-rr, 0)" msgstr "循環政策 (balance-rr, 0)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:661 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:659 msgid "Route Allowed IPs" msgstr "路由允許的IP群" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:526 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:532 msgid "Route action chain \"%h\"" msgstr "路由操作鏈“%h”" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Route type" msgstr "路由型態" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "" "Router Lifetime published in RA messages. Maximum is 9000 seconds." @@ -6903,6 +7791,10 @@ msgstr "路由器密碼" msgid "Routing" msgstr "路由" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:44 +msgid "Routing Algorithm" +msgstr "路由算法" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:28 msgid "" "Routing defines over which interface and gateway a certain host or network " @@ -6915,24 +7807,24 @@ msgstr "路由器指定介面導出到特定主機或者能夠到達的網路." msgid "Rule" msgstr "規則" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:596 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:602 msgid "Rule actions" msgstr "規則操作" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:469 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:475 msgctxt "nft comment" msgid "Rule comment: %s" msgstr "規則註釋: %s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:534 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:540 msgid "Rule container chain \"%h\"" msgstr "規則容器鏈“%h”" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:595 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:601 msgid "Rule matches" msgstr "規則匹配" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Rule type" msgstr "規則類型" @@ -6952,11 +7844,24 @@ msgstr "執行時錯誤" msgid "SHA256" msgstr "SHA256" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:145 +msgid "SIM %d" +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:147 +msgid "SIMs" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:280 msgid "SNR" msgstr "信躁比 (SNR)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "SRV" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 msgid "SSH Access" @@ -6974,15 +7879,15 @@ msgstr "SSH伺服器埠號" msgid "SSH username" msgstr "SSH用戶名稱" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:283 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:289 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 msgid "SSH-Keys" msgstr "SSH 金鑰" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1749 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:375 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1838 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:401 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147 msgid "SSID" msgstr "SSID" @@ -6999,7 +7904,7 @@ msgstr "SSTP伺服器" msgid "SWAP" msgstr "SWAP" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3265 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3274 #: modules/luci-base/htdocs/luci-static/resources/luci.js:2192 #: modules/luci-compat/luasrc/view/cbi/error.htm:17 #: modules/luci-compat/luasrc/view/cbi/footer.htm:26 @@ -7010,7 +7915,7 @@ msgid "Save" msgstr "儲存" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2174 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4401 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4455 #: modules/luci-compat/luasrc/view/cbi/footer.htm:22 msgid "Save & Apply" msgstr "儲存並套用" @@ -7027,7 +7932,7 @@ msgstr "儲存mtd區塊" msgid "Save mtdblock contents" msgstr "儲存 mtdblock 內容" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:880 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:874 msgid "Scan" msgstr "掃描" @@ -7036,11 +7941,16 @@ msgstr "掃描" msgid "Scheduled Tasks" msgstr "排程任務" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4387 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:39 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:62 +msgid "Section %s is empty." +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4441 msgid "Section added" msgstr "已新增的區段" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4389 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4443 msgid "Section removed" msgstr "區段移除" @@ -7056,10 +7966,10 @@ msgid "" msgstr "" "選擇「強制升級」來燒錄映像檔,即使檢查未通過。請僅在您確認映像檔正確無誤時使" "用!" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2957 + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2681 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2821 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2981 msgid "Select file…" msgstr "選擇檔案…" @@ -7067,7 +7977,7 @@ msgstr "選擇檔案…" msgid "Selects the transmit hash policy to use for slave selection" msgstr "請選擇「傳輸雜湊政策」,以便在選擇從屬介面時使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:768 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:808 msgid "" "Send RA " "messages advertising this device as IPv6 router." @@ -7075,7 +7985,7 @@ msgstr "" "傳送通告此裝置為 IPv6 路由器的 RA 訊息。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:650 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:704 msgid "Send ICMP redirects" msgstr "傳送 ICMP 重新導向" @@ -7094,11 +8004,15 @@ msgstr "傳送LCP呼叫請求在這個給予的秒數間隔內, 僅影響關聯 msgid "Send the hostname of this device" msgstr "傳送這台設備的主機名稱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:518 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:89 +msgid "Server" +msgstr "伺服器" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:605 msgid "Server address" msgstr "伺服器位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:599 msgid "Server name" msgstr "伺服器名稱" @@ -7123,16 +8037,20 @@ msgstr "會談結束" msgid "Set Static" msgstr "設定靜態" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:121 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:703 +msgid "Set an alias for a hostname." +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:122 msgctxt "nft mangle" msgid "Set header field %s to %s" msgstr "將標頭欄位 %s 設定為 %s" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:928 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 msgid "Set interface as NDP-Proxy external slave. Default is off." msgstr "將介面設定為 NDP 代理外部從屬裝置。預設為關閉。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1240 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1299 msgid "" "Set interface properties regardless of the link carrier (If set, carrier " "sense events do not invoke hotplug handlers)." @@ -7144,7 +8062,7 @@ msgstr "" msgid "Set same MAC Address to all slaves" msgstr "對所有實體界面設置相同的MAC硬體地址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:786 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:826 msgid "" "Set the autonomous address-configuration flag in the prefix information " "options of sent RA messages. " @@ -7153,7 +8071,7 @@ msgstr "" "在已傳送 RA 報文的前綴資訊選項中" "設定自主位址設定標記。啟用後,客戶端將執行無狀態 IPv6 位址自動設定。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:719 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:736 msgid "" "Set this interface as master for RA and DHCPv6 relaying as well as NDP " "proxying." @@ -7167,11 +8085,15 @@ msgstr "設定為目前使用中的實體介面 (使用中, 1)" msgid "Set to first slave added to the bond (follow, 2)" msgstr "設定為第一個實體界面添加到綁定(跟隨,2)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:662 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:663 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:679 msgid "Set up DHCP Server" msgstr "安裝DHCP伺服器" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 +msgid "Set up routes for proxied IPv6 neighbours." +msgstr "設定已代理 IPv6 鄰居的路由。" + #: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 #: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 @@ -7179,33 +8101,37 @@ msgid "Setting PLMN failed" msgstr "設定PLMN失敗" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 msgid "Setting operation mode failed" msgstr "設定操作模式失敗" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:87 +msgid "Setting the allowed network technology." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:107 +msgid "Setting the preferred network technology." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js:11 msgid "Settings" -msgstr "設定" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "Setup routes for proxied IPv6 neighbours." -msgstr "設定已代理 IPv6 鄰居的路由。" +msgstr "設置" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Severely Errored Seconds (SES)" -msgstr "嚴重錯誤秒數(SES)" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "" +"Settings for assisting wireless clients in roaming between multiple APs: " +"802.11r, 802.11k and 802.11v" +msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:210 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:39 msgid "Short GI" msgstr "短 GI" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1164 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1166 msgid "Short Preamble" msgstr "簡短前序編碼" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" msgstr "顯示現今的備份檔清單" @@ -7218,16 +8144,16 @@ msgstr "顯示空鏈接" msgid "Show raw counters" msgstr "顯示原始計數器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:510 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:527 msgid "Shutdown this interface" msgstr "關閉這個介面" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1748 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1837 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:374 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:400 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:146 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:235 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:278 @@ -7235,15 +8161,15 @@ msgstr "關閉這個介面" msgid "Signal" msgstr "訊號" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2170 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2259 msgid "Signal / Noise" msgstr "信號 /雜訊比" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Signal Attenuation (SATN)" -msgstr "信號衰減(交互式SATN)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:104 +msgid "Signal Quality" +msgstr "" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:136 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:146 msgid "Signal Refresh Rate" msgstr "訊號重新整理頻率" @@ -7251,12 +8177,12 @@ msgstr "訊號重新整理頻率" msgid "Signal:" msgstr "信號:" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4140 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4194 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:222 msgid "Size" msgstr "容量" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:472 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:559 msgid "Size of DNS query cache" msgstr "DNS輪詢的快取大小" @@ -7273,12 +8199,12 @@ msgstr "跳過" msgid "Skip from backup files that are equal to those in /rom" msgstr "不備份與 /rom 目錄下檔案相同的檔案" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:42 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:35 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 msgid "Skip to content" msgstr "跳到內容" -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:41 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:34 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 msgid "Skip to navigation" msgstr "跳到導覽" @@ -7296,14 +8222,10 @@ msgstr "軟體式VLAN" msgid "Some fields are invalid, cannot save values!" msgstr "有些欄位失效, 無法儲存數值!" -#: modules/luci-base/luasrc/view/error404.htm:9 +#: modules/luci-base/ucode/template/error404.ut:10 msgid "Sorry, the object you requested was not found." msgstr "抱歉, 您請求的這物件尚無發現." -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "抱歉, 伺服器遭遇非預期的錯誤." - #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 msgid "" "Sorry, there is no sysupgrade support present; a new firmware image must be " @@ -7313,8 +8235,8 @@ msgstr "" "抱歉,沒有 sysupgrade 支援出現; 新版韌體映像檔必須手動更新,請至 Wiki 尋找特" "定設備安裝指南。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:214 @@ -7341,7 +8263,7 @@ msgctxt "nft ip sport" msgid "Source port" msgstr "源埠" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:499 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:586 msgid "" "Special PXE boot " "options for Dnsmasq." @@ -7349,7 +8271,7 @@ msgstr "" "Dnsmasq 的特殊 PXE 啟動" "選項。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:953 msgid "" "Specifies a fixed list of DNS search domains to announce via DHCPv6. If left " "unspecified, the local device DNS search domain will be announced." @@ -7357,7 +8279,7 @@ msgstr "" "指定一個透過 DHCPv6 宣告的 DNS 搜尋域名的固定列表。如未指定,本地裝置 DNS 搜" "尋域將被宣布。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:937 msgid "" "Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. " "If left unspecified, the device will announce itself as IPv6 DNS server " @@ -7366,7 +8288,7 @@ msgstr "" "指定一個透過 DHCPv6 宣布的 IPv6 DNS 伺服器位址的固定列表。如未指定,裝置會宣" "布自己是 IPv6 DNS 伺服器,除非本地 IPv6 DNS 伺服器選項被停用。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "" "Specifies an individual UID or range of UIDs to match, e.g. 1000 to match " "corresponding UID or 1000-1005 to inclusively match all UIDs within the " @@ -7393,7 +8315,7 @@ msgstr "指定用於ARP監視的IP地址" msgid "Specifies the MII link monitoring frequency in milliseconds" msgstr "指定MII連接監視頻率(以毫秒為單位)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Specifies the TOS value to match in IP headers" msgstr "指定要在IP標頭中匹配的TOS值" @@ -7401,7 +8323,7 @@ msgstr "指定要在IP標頭中匹配的TOS值" msgid "Specifies the aggregation selection logic to use" msgstr "指定要使用的聚合選擇邏輯" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:159 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:160 msgid "Specifies the destination subnet to match (CIDR notation)" msgstr "指定要匹配的目標子網(CIDR 表示法)" @@ -7409,7 +8331,7 @@ msgstr "指定要匹配的目標子網(CIDR 表示法)" msgid "Specifies the directory the device is attached to" msgstr "指定這個設備將被附掛到的目錄" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:792 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:832 msgid "" "Specifies the flags sent in RA " "messages, for example to instruct clients to request further information via " @@ -7418,7 +8340,7 @@ msgstr "" "指定RA訊息中傳送的標記,比如指示客戶端透過" "有狀態 DHCPv6 請求進一步的資訊。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:176 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:177 msgid "" "Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match " "mark 255 or 0x0/0x1 to match any even mark value" @@ -7426,7 +8348,7 @@ msgstr "" "指定要匹配的 fwmark 和可選的掩碼,例如 0xFF 匹配標記 255 或 0x0/0x1 匹配任何" "偶數標記值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:145 msgid "Specifies the incoming logical interface name" msgstr "指定傳入的邏輯接口名稱" @@ -7456,7 +8378,7 @@ msgid "" "dead" msgstr "指定可請求的最大秒數直到駭客主機死亡為止" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:947 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:941 msgid "" "Specifies the maximum transmit power the wireless radio may use. Depending " "on regulatory requirements and wireless usage, the actual transmit power may " @@ -7473,7 +8395,7 @@ msgstr "指定宣告載波之前必須處於活動狀態的最小連接數" msgid "Specifies the mode to be used for this bonding interface" msgstr "指定用於此綁定界面的模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:75 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:76 msgid "" "Specifies the network gateway. If omitted, the gateway from the parent " "interface is taken if any, otherwise creates a link scope route. If set to " @@ -7508,15 +8430,15 @@ msgid "" msgstr "" "指定綁定驅動程式, 將學習封包發送到每個實體界面節點交換機的實例之間的秒數" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:129 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:130 msgid "Specifies the ordering of the IP rules" msgstr "指定 IP 規則的順序" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:155 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:156 msgid "Specifies the outgoing logical interface name" msgstr "指定傳出邏輯介面名稱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:99 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:100 msgid "" "Specifies the preferred source address when sending to destinations covered " "by the target" @@ -7540,19 +8462,19 @@ msgstr "" "當活躍的實體界面發生故障 或 主要實體界面復原發生故障時, 為主要實體界面指定重" "新選擇策略" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:80 msgid "Specifies the route metric to use" msgstr "指定要使用的路由躍點數" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:45 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 msgid "Specifies the route type to be created" msgstr "指定要建立的路由類型" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:136 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:137 msgid "Specifies the rule target routing action" msgstr "指定規則目標路由操作" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:148 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:149 msgid "Specifies the source subnet to match (CIDR notation)" msgstr "指定要符合的來源子網(CIDR 表示法)" @@ -7572,7 +8494,7 @@ msgid "" "link recovery detection" msgstr "指定在檢測到鏈接恢復後啟用實體界面之前等待的時間(毫秒)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:494 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:548 msgid "" "Specifies the wired ports to attach to this bridge. In order to attach " "wireless networks, choose the associated interface as network in the " @@ -7673,15 +8595,23 @@ msgid "" "bytes)." msgstr "指定預設值(1280位元)除外的MTU(最大傳輸單位)." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "Specify the secret encryption key here." msgstr "指定加密金鑰在此." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:657 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:215 +msgid "Speed: %d Mibit/s, Duplex: %s" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1560 +msgid "Splitterless ADSL (G.992.2) Annex A" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:717 msgid "Stale neighbour cache timeout" msgstr "過時的鄰近快取逾時" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:686 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 msgid "Start" msgstr "啟動" @@ -7694,16 +8624,16 @@ msgstr "啟用WPS" msgid "Start priority" msgstr "啟動優先權" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1941 msgid "Start refresh" msgstr "開始更新" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4633 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4687 msgid "Starting configuration apply…" msgstr "開始套用設定值…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:398 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1854 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:425 msgid "Starting wireless scan..." msgstr "開始無線掃描..." @@ -7712,6 +8642,10 @@ msgstr "開始無線掃描..." msgid "Startup" msgstr "開機自動執行" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:90 +msgid "State" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:32 msgid "Static IPv4 Routes" msgstr "靜態IPv4路由" @@ -7725,7 +8659,7 @@ msgstr "靜態IPv6路由" msgid "Static Lease" msgstr "靜態租約" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:258 msgid "Static Leases" msgstr "靜態租約" @@ -7735,7 +8669,7 @@ msgstr "靜態租約" msgid "Static address" msgstr "靜態位址" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:597 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:771 msgid "" "Static leases are used to assign fixed IP addresses and symbolic hostnames " "to DHCP clients. They are also required for non-dynamic interface " @@ -7744,18 +8678,18 @@ msgstr "" "靜態租約是用來指定固定的IP位址和表示的主機名稱給予DHCP用戶端. 它們也需要非動" "態介面設定值以便獲取相應租約的主機服務." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1183 msgid "Station inactivity limit" msgstr "非活動站台限制" #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:558 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 +#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9 msgid "Status" msgstr "狀態" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:512 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:529 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 msgid "Stop" msgstr "停止" @@ -7764,8 +8698,8 @@ msgstr "停止" msgid "Stop WPS" msgstr "停用WPS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1857 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1852 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 msgid "Stop refresh" msgstr "停止重新整理" @@ -7773,11 +8707,11 @@ msgstr "停止重新整理" msgid "Storage" msgstr "儲存空間使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:683 msgid "Strict filtering" msgstr "嚴格過濾" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:421 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:508 msgid "Strict order" msgstr "嚴謹順序" @@ -7786,15 +8720,15 @@ msgid "Strong" msgstr "超激強" #: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2055 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2144 msgid "Submit" msgstr "提交" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:447 msgid "Suppress logging" msgstr "禁止記錄" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:373 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 msgid "Suppress logging of the routine operation for the DHCP protocol." msgstr "禁止記錄這些協定的例行操作。" @@ -7814,7 +8748,7 @@ msgstr "交換器 %q" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:150 msgid "" "Switch %q has an unknown topology - the VLAN settings might not be accurate." -msgstr "交換器%q具有未知的拓撲-VLAN設定可能不準確." +msgstr "交換器 %q 具有未知的拓撲 - VLAN設定可能不準確。" #: modules/luci-base/htdocs/luci-static/resources/network.js:3002 #: modules/luci-compat/luasrc/model/network.lua:1426 @@ -7825,7 +8759,7 @@ msgstr "交換器 VLAN" msgid "Switch port" msgstr "交換器埠" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:577 msgid "Switch protocol" msgstr "切換協定" @@ -7835,7 +8769,7 @@ msgstr "切換協定" msgid "Switch to CIDR list notation" msgstr "切換到 CIDR 清單標記法" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2692 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2716 msgid "Symbolic link" msgstr "符號連接" @@ -7847,8 +8781,16 @@ msgstr "與 NTP 伺服器同步" msgid "Sync with browser" msgstr "與瀏覽器同步時間" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:299 +msgid "Syntax: /fqdn[/fqdn…]/[ipaddr]." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:650 +msgid "Syntax: _service._proto.example.com." +msgstr "" + #: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:22 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:113 #: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 msgid "System" @@ -7872,12 +8814,12 @@ msgstr "系統屬性" msgid "System log buffer size" msgstr "系統日誌緩衝區大小" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:87 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:64 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89 msgid "System running in recovery (initramfs) mode." -msgstr "系統在恢復 (initramfs) 模式下運行。" +msgstr "系統在復原 (initramfs) 模式下執行。" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:67 msgctxt "nft tcp option maxseg size" @@ -7903,7 +8845,7 @@ msgstr "TCP 來源連接埠" msgid "TCP:" msgstr "TCP:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:571 msgid "TFTP server root" msgstr "TFTP 伺服器根" @@ -7916,26 +8858,37 @@ msgstr "傳送" msgid "TX Rate" msgstr "傳送速度" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:618 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:672 msgid "TX queue length" msgstr "TX 佇列長度" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:18 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:190 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:216 msgid "Table" msgstr "表格" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:56 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:916 +msgid "Tag" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:219 +msgctxt "VLAN port state" +msgid "Tagged" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:655 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:718 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:57 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:187 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:213 msgid "Target" msgstr "目標" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 msgid "Target Platform" msgstr "目標平台" @@ -7951,7 +8904,7 @@ msgstr "臨時空間" msgid "Terminate" msgstr "終結" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:839 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 msgid "" "The MTU to be published in " "RA messages. " @@ -7961,13 +8914,13 @@ msgstr "" "佈的MTU。最小值是 1280 位元" "組。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:834 msgid "" "The Managed address configuration (M) flag indicates that IPv6 " "addresses are available via DHCPv6." msgstr "受管位址設定 (M) 標記表明可以透過 DHCPv6 取得 IPv6 位址。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:838 msgid "" "The Mobile IPv6 Home Agent (H) flag indicates that the device is " "also acting as Mobile IPv6 home agent on this link." @@ -7975,7 +8928,7 @@ msgstr "" " 移動 IPv6 Home 代理 (H) 標記表明該裝置在此鏈路上還 充當移動 IPv6 " "home 代理。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:796 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:836 msgid "" "The Other configuration (O) flag indicates that other information, " "such as DNS servers, is available via DHCPv6." @@ -7992,7 +8945,11 @@ msgid "" "the configuration." msgstr "qrencode套件對產生設定的 QR code 圖片是必需的。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:954 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:904 +msgid "The DHCPv6-DUID (DHCP unique identifier) of this host." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1013 msgid "" "The DNS server entries in the local resolv.conf are primarily sorted by the " "weight specified here" @@ -8004,18 +8961,24 @@ msgid "" "username instead of the user ID!" msgstr "HE.net端點更新組態已更改, 您現在必須使用普通用戶名而不是用戶ID!" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:680 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:876 msgid "The IP address %h is already used by another static lease" msgstr "IP 位址 %h 已被另一個靜態租約使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:689 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:885 msgid "The IP address is outside of any DHCP pool address range" -msgstr "IP 位址不在任何 DHCP 池位址范圍之內" +msgstr "IP 位址不在任何 DHCP 集區位址範圍之內" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:606 msgid "The IP address of the boot server" msgstr "引導伺服器的IP位址" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:859 +msgid "" +"The IP address to be used for this host, or ignore to ignore any " +"DHCP request from this host." +msgstr "" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 msgid "The IPv4 address or the fully-qualified domain name of the remote end." msgstr "遠端的IPv4地址或完全符合標準的網域名稱." @@ -8023,6 +8986,7 @@ msgstr "遠端的IPv4地址或完全符合標準的網域名稱." #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:40 msgid "" "The IPv4 address or the fully-qualified domain name of the remote tunnel end." msgstr "遠程隧道端的IPv4地址或完全符合標準的網域名稱." @@ -8037,6 +9001,12 @@ msgid "" "The IPv6 address or the fully-qualified domain name of the remote tunnel end." msgstr "遠端隧道端的IPv6位址或完全符合標準的網域名稱." +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:912 +msgid "" +"The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 " +"chars)." +msgstr "" + #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 msgid "" @@ -8047,7 +9017,7 @@ msgstr "指定到這供應商的IPv6字首, 通常用 ::結尾" msgid "The LED blinks with the configured on/off frequency" msgstr "LED 以配置的開/關頻率閃爍" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:6 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 msgid "The LED flashes to simulate actual heart beat." msgstr "LED 閃爍以類比實際心跳。" @@ -8064,21 +9034,25 @@ msgstr "指示燈始終處於預設關閉狀態。" msgid "The LED is always in default state on." msgstr "指示燈始終處於預設開啟狀態。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:222 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 msgid "" "The MAC address %h is already used by another static lease in the same DHCP " "pool" -msgstr "MAC 位址 %h 已被同一個 DHCP 池中的另一個靜態租約使用" +msgstr "MAC 位址 %h 已被同一個 DHCP 集區中的另一個靜態租約使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:586 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:640 msgid "The MTU must not exceed the parent device MTU of %d bytes" msgstr "MTU 不能超過父裝置 MTU 的 %d 位元組" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:864 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:942 msgid "The VLAN ID must be unique" msgstr "VLAN ID 必須是唯一的" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2015 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:45 +msgid "The algorithm that is used to discover mesh routes" +msgstr "用於發現網狀路由的算法" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2104 msgid "" "The allowed characters are: A-Z, a-z, 0-9 and _" @@ -8090,13 +9064,13 @@ msgstr "" msgid "The configuration file could not be loaded due to the following error:" msgstr "因下列問題導致組態檔無法讀取:" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2009 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2098 msgid "" "The correct SSID must be manually specified when joining a hidden wireless " "network" msgstr "當加入隱形的無線網路時,必須手動指定正確的 SSID" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4509 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4563 msgid "" "The device could not be reached within %d seconds after applying the pending " "changes, which caused the configuration to be rolled back for safety " @@ -8106,10 +9080,9 @@ msgid "" "or revert all pending changes to keep the currently working configuration " "state." msgstr "" -"在套用等候變更後的%d秒內無法訪問該設備, 出於安全原因, 該設置被回復. 儘管若您" -"仍然認為設定值變更是正確的, 請執行未經檢查的配置的套用. 或者, 您可以消除此警" -"告並在嘗試再次應用之前編輯變更, 或者還原所有未決的更改以保持當前工作的設置狀" -"態." +"在套用等候變更後的 %d 秒內無法存取該裝置,出於安全原因,該設定被還原。如果您" +"仍然認為設定值的變更是正確的,請強制套用。或者您可以關閉此警告並在嘗試再次套" +"用之前編輯變更,或者還原所有未套用的變更以保持目前工作的設定狀態。" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:281 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:393 @@ -8120,18 +9093,18 @@ msgstr "" "記憶體的設備檔或者分割區 (e.g. /dev/" "sda1)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:450 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:504 msgid "The device name \"%s\" is already taken" msgstr "裝置名稱 「%s」 已被使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:393 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:427 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:444 msgid "" "The existing network configuration needs to be changed for LuCI to function " "properly." msgstr "為了使 LuCI 正常工作,現有的網路設定需要變更。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:794 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:788 msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." @@ -8150,7 +9123,7 @@ msgstr "" msgid "The following rules are currently active on this system." msgstr "以下的規則現正作用在系統中." -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:7 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:8 msgid "The frequency is in direct proportion to 1-minute average CPU load." msgstr "頻率與 1 分鐘的平均 CPU 負載成正比。" @@ -8158,31 +9131,49 @@ msgstr "頻率與 1 分鐘的平均 CPU 負載成正比。" msgid "The gateway address must not be a local IP address" msgstr "網關位址不能是本地 IP" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:754 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:757 msgid "" "The generated configuration can be imported into a WireGuard client " -"application to setup a connection towards this device." +"application to set up a connection towards this device." msgstr "產生的設定可以匯入到 WireGuard 客戶端應用中來設定到該裝置的連接。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:166 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 msgid "The given SSH public key has already been added." msgstr "輸入的 SSH 公鑰早已存在。" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:172 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:178 msgid "" "The given SSH public key is invalid. Please supply proper public RSA, " "ED25519 or ECDSA keys." msgstr "輸入的 SSH 公鑰無效。請提供正確的 RSA 公鑰或 ECDSA Keys。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:513 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:800 +msgid "The hardware address(es) of this entry/host, separated by spaces." +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:93 +msgid "" +"The hop penalty setting allows to modify batman-adv's preference for " +"multihop routes vs. short routes. The value is applied to the TQ of each " +"forwarded OGM, thereby propagating the cost of an extra hop (the packet has " +"to be received and retransmitted which costs airtime)" +msgstr "" +"跳懲罰設置允許修改 batman-adv 對多跳路由與短路由的偏好。 該值應用於每個轉發 " +"OGM 的 TQ,從而傳播額外跳的成本(必須接收和重新傳輸數據包,這會花費通話時間)" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:600 msgid "The hostname of the boot server" msgstr "引導伺服器的主機名" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1110 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:28 +msgid "The interface could not be found" +msgstr "找不到此介面" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1169 msgid "The interface name is already used" msgstr "介面名稱已被使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1116 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1175 msgid "The interface name is too long" msgstr "介面名稱太長了" @@ -8205,6 +9196,7 @@ msgstr "本地端IPv4位址" #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 #: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:44 #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 msgid "The local IPv4 address over which the tunnel is created (optional)." msgstr "從已建立的隧道產生的本地端IPv4位址(選項)." @@ -8219,7 +9211,7 @@ msgstr "本地端IPv4子網路遮罩" msgid "The local IPv6 address over which the tunnel is created (optional)." msgstr "從已建立的通道產生的本地端IPv6位址(選項)." -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:575 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:629 msgid "" "The max response time in centiseconds inserted into group-specific queries " "sent in response to leave group messages. It is also the amount of time " @@ -8231,7 +9223,7 @@ msgstr "" "位)。它也是特定於組的查詢消息之間的時間量。可以調整此值以修改網路的「離開延" "遲」。減小值可縮短檢測組中最後一個成員丟失的時間" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:561 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:615 msgid "" "The max response time in centiseconds inserted into the periodic general " "queries. By varying the value, an administrator may tune the burstiness of " @@ -8242,7 +9234,7 @@ msgstr "" "IGMP 訊息的突發性; 較大的值可減少流量的突發性,因為主機回應會在較大的時間間" "隔內分布" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:858 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 msgid "" "The maximum hops to be published in RA messages. Maximum is 255 hops." @@ -8250,13 +9242,13 @@ msgstr "" "將在 RA訊息中發佈的最大跳數。最大" "值為 255 跳。" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4645 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4699 msgid "" "The network access to this device could be interrupted by changing settings " "of the \"%h\" interface." msgstr "變更 「%h」介面的設定可能中斷到此裝置的網路存取。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2021 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2110 msgid "The network name is already used" msgstr "網路名稱已被使用" @@ -8274,7 +9266,7 @@ msgstr "" "Area Network\">VLAN 常用來分割網路區段。預設會有一個上傳埠來連接到下一" "個網路,像是 Internet ,而其它埠則供區網使用。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:773 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:776 msgid "" "The public hostname or IP address of this system the peer should connect to. " "This usually is a static public IP address, a static hostname or a DDNS " @@ -8283,7 +9275,7 @@ msgstr "" "對端應連接到的此系統的公共主機名稱或 IP 位址。 通常是靜態公共 IP 位址、靜態主" "機名稱或 DDNS 網域。" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:569 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:623 msgid "The query response interval must be lower than the query interval value" msgstr "查詢回應間隔必須小於查詢間隔值" @@ -8294,9 +9286,9 @@ msgstr "重新啟動命令執行失敗(錯誤碼:%d)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:147 msgid "The restore command failed with code %d" -msgstr "restore命令失敗碼為 %d" +msgstr "restore 命令失敗,代碼 %d" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:551 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:605 msgid "" "The robustness value allows tuning for the expected packet loss on the " "network. If a network is expected to be lossy, the robustness value may be " @@ -8305,13 +9297,13 @@ msgstr "" "健壯性值允許對網路上的預期數據包丟失進行調整。如果預計網路是有損的,則健壯性" "值可能會增加。IGMP 對(魯棒性-1)數據包丟失具有魯棒性" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:171 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:172 msgid "" "The rule target is a jump to another rule specified by its priority value" msgstr "規則目標是跳轉到由其優先順序值指定的另一個規則" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:166 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:92 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:167 msgid "" "The rule target is a table lookup ID: a numeric table index ranging from 0 " "to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special " @@ -8321,11 +9313,11 @@ msgstr "" "rt_tables 中聲明的符號別名。特殊別名本地 (255)、主別名 (254) 和預設別名 " "(253) 也有效" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1376 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "The selected %s mode is incompatible with %s encryption" msgstr "選擇的模式 %s 與 %s 加密不相容" -#: modules/luci-base/luasrc/view/csrftoken.htm:11 +#: modules/luci-base/ucode/template/csrftoken.ut:11 msgid "The submitted security token is invalid or already expired!" msgstr "提交的安全權杖無效或已過期!" @@ -8342,8 +9334,8 @@ msgid "" "address of your computer to reach the device again, depending on your " "settings." msgstr "" -"系統升級中。
    請勿關閉設備!
    請稍待幾分鐘後系統將自動重新連線。根" -"據不同設定,您可能需要更新IP網址以連上設備。" +"系統升級中。
    請勿關閉裝置!
    請稍待幾分鐘後系統將自動重新連線。根" +"據不同設定,您可能需要更新 IP 網址以連上裝置。" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:163 msgid "" @@ -8361,6 +9353,14 @@ msgstr "系統密碼變更成功。" msgid "The sysupgrade command failed with code %d" msgstr "升級指令失敗,錯誤碼 %d" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:773 +msgid "" +"The tag construct filters which host directives are used; more than one tag " +"can be provided, in this case the request must match all of them. Tagged " +"directives are used in preference to untagged ones. Note that one of mac, " +"duid or hostname still needs to be specified (can be a wildcard)." +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 msgid "" "The uploaded backup archive appears to be valid and contains the files " @@ -8385,12 +9385,18 @@ msgid "" msgstr "" "以上傳的映像檔不包含支援格式,請確認您選擇的是針對您的平台採用的通用映像檔。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -msgid "The value is overridden by configuration. Original: %s" -msgstr "該值被設定覆蓋。 原始:%s" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1527 +msgid "The value is overridden by configuration." +msgstr "該值被設定覆蓋。" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:56 +msgid "" +"The value specifies the interval (milliseconds) in which batman-adv floods " +"the network with its protocol information." +msgstr "該值指定 batman-adv 向網絡發送其協議信息的時間間隔(毫秒)。" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:672 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:678 msgid "" "There are legacy iptables rules present on the system. Mixing iptables and " "nftables rules is discouraged and may lead to incomplete traffic filtering." @@ -8398,19 +9404,20 @@ msgstr "" "系統上存在舊版 iptables 規則。 不鼓勵混合使用 iptables 和 nftables 規則,這可" "能會導致流量過濾不完整。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:745 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:777 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:985 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:1017 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:130 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:179 msgid "There are no active leases" msgstr "無活躍的租約" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4677 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4731 msgid "There are no changes to apply" msgstr "無可套用的變更" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:78 +#: themes/luci-theme-librecmc-2020/ucode/template/themes/librecmc2020/header.ut:55 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 msgid "" "There is no password set on this router. Please configure a root password to " @@ -8421,16 +9428,16 @@ msgstr "路由器尚未設密碼. 請設定root密碼以便保護web介面及啟 msgid "This IPv4 address of the relay" msgstr "IPv4位址的中繼" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1633 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1722 msgid "This authentication type is not applicable to the selected EAP method." msgstr "此身份驗證類型不適用於所選的EAP方法." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:58 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:56 msgid "This does not look like a valid PEM file" msgstr "這看起來不像有效的PEM檔案" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 msgid "" "This is a list of shell glob patterns for matching files and directories to " "include during sysupgrade. Modified files in /etc/config/ and certain other " @@ -8445,6 +9452,21 @@ msgid "" "password if no update key has been configured" msgstr "這是為通道設定的 \"更新金鑰\",或者是如果未設定更新金鑰的帳號密碼" +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_hardif.js:42 +msgid "" +"This is the batman-adv device where you want to link the physical Device " +"from above to. If this list is empty, then you need to create one first. If " +"you want to route mesh traffic over a wired network device, then please " +"select it from the above Device selector. If you want to assign the batman-" +"adv interface to a Wi-fi mesh then do not select a Device in the Device " +"selector but rather go to the Wireless settings and select this Interface as " +"a network from there." +msgstr "" +"這是您要將物理裝置從上面連結到的 batman-adv 裝置。 如果此列表為空,則您需要先" +"建立一個。 如果您想透過有線網路裝置路由網狀流量,請從上面的裝置選擇器中選擇" +"它。 如果您想將 batman-adv 介面分配給 Wi-fi 網格,則不要在裝置選擇器中選擇裝" +"置,而是前往無線設定並從那裡選擇此介面作為網路。" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 msgid "" "This is the content of /etc/rc.local. Insert your own commands here (in " @@ -8459,7 +9481,7 @@ msgid "" "ends with ...:2/64" msgstr "這是由通道代理人指定的本地終端位址,通常用 ...:2/64 結尾" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 msgid "This is the only DHCP server in the local network." msgstr "" "在本地網路中 這是唯一的 configuration import
    instead." msgstr "" -"要從現有(例如提供商提供的)配置文件完全配置本地 WireGuard 接口,請改用 " -"配置導入。" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2674 -msgid "To login…" -msgstr "去登入…" +"要從現有 (例如提供者提供的) 組態檔案完全設定本地 WireGuard 介面,請使用" +"組態匯入。" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:400 msgid "" @@ -8559,7 +9585,7 @@ msgstr "" "要還原設定檔,可以上傳先前製作的備份壓縮檔。要重置為出廠設定,按下「執行重" "置」(可能只對 squashfs 映像檔有效)。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1501 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 msgid "Tone" msgstr "音節" @@ -8567,12 +9593,16 @@ msgstr "音節" msgid "Total Available" msgstr "全部可用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:114 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:124 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:110 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:111 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:121 msgid "Traceroute" msgstr "路由追蹤" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/view/modemmanager/status.js:126 +msgid "Tracking Area Code" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:54 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 #: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:139 @@ -8584,11 +9614,11 @@ msgstr "流量" msgid "Traffic Class" msgstr "流量層級" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:522 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:528 msgid "Traffic filter chain \"%h\"" msgstr "流量篩選器鏈 “%h”" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:460 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:466 msgctxt "nft counter" msgid "Traffic matched by rule: %.1000mPackets, %.1024mBytes" msgstr "規則匹配的流量: %.1000mPackets, %.1024mBytes" @@ -8605,6 +9635,27 @@ msgstr "射頻" msgid "Transmit Hash Policy" msgstr "傳輸雜湊政策" +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:248 +msgid "Transmit dropped" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:247 +msgid "Transmit errors" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:58 +#, fuzzy +msgid "Transmitted Data" +msgstr "射頻天線" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:245 +msgid "Transmitted bytes" +msgstr "" + +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:246 +msgid "Transmitted packets" +msgstr "" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:79 msgctxt "nft @th,off,len" msgid "Transport header bits %d-%d" @@ -8643,7 +9694,7 @@ msgstr "通道介面" msgid "Tunnel Link" msgstr "連線通道" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1410 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1472 msgid "Tunnel device" msgstr "隧道裝置" @@ -8652,13 +9703,13 @@ msgid "Tx-Power" msgstr "傳送-功率" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1441 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1503 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:169 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 msgid "Type" msgstr "類型" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:182 msgid "Type of service" msgstr "服務類型" @@ -8707,7 +9758,7 @@ msgstr "無法辨識外部 IP 位址" msgid "Unable to determine upstream interface" msgstr "無法判斷上游介面" -#: modules/luci-base/luasrc/view/error404.htm:11 +#: modules/luci-base/ucode/template/error404.ut:12 msgid "Unable to dispatch" msgstr "無法發送" @@ -8758,28 +9809,40 @@ msgstr "無法重啟防火牆:%s" msgid "Unable to save contents: %s" msgstr "無法儲存內容:%s" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Unavailable Seconds (UAS)" -msgstr "不可用秒數 (UAS)" +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:14 +msgid "Unable to set allowed mode list." +msgstr "" + +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:17 +msgid "Unable to set preferred mode." +msgstr "" + +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:29 +msgid "Unable to verify PIN" +msgstr "無法驗證 PIN" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1301 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1360 msgid "Unconfigure" msgstr "取消配置" +#: protocols/luci-proto-unet/htdocs/luci-static/resources/protocol/unet.js:8 +msgid "Unet" +msgstr "Unet" + #: modules/luci-base/htdocs/luci-static/resources/fs.js:102 msgid "Unexpected reply data format" msgstr "未預期回應的資料格式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1473 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1535 msgid "" "Unique Local Address - in the range fc00::/7. Typically only " "within the ‘local’ half fd00::/8. ULA for IPv6 is " "analogous to IPv4 private network addressing. This prefix is randomly " "generated at first install." msgstr "" -"唯一本地位址 - 在 fc00::/7 范圍內。通常僅在 ‘本地’ 的一半 " -"fd00::/8 之內。用於IPv6的ULA與IPv4專用網路尋址類似。此前綴在首次" -"安裝時隨機產生。" +"唯一本機位址 - 在 fc00::/7 範圍內。通常僅在「本機」的一半 " +"fd00::/8 之內。用於 IPv6 的 ULA 與 IPv4 專用網路尋址類似。此前綴" +"在首次安裝時隨機產生。" #: modules/luci-base/htdocs/luci-static/resources/network.js:2092 #: modules/luci-compat/luasrc/model/network.lua:971 @@ -8787,7 +9850,7 @@ msgstr "" msgid "Unknown" msgstr "未知" -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:12 msgid "Unknown and unsupported connection method." msgstr "未知或不支援的連線模式." @@ -8811,11 +9874,11 @@ msgstr "未託管" msgid "Unmount" msgstr "卸載" -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:115 +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 msgid "Unnamed key" msgstr "未命名的金鑰" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4327 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4381 msgid "Unsaved Changes" msgstr "尚未存檔的修改" @@ -8829,15 +9892,25 @@ msgid "Unsupported MAP type" msgstr "不支援的 MAP 型態" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "Unsupported modem" msgstr "不支援的數據機" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:299 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 +msgid "Unsupported protocol" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:316 msgid "Unsupported protocol type." msgstr "不支援的協定型態。" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:534 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:215 +msgctxt "VLAN port state" +msgid "Untagged" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:532 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:97 msgid "Untitled peer" msgstr "無標題的同行" @@ -8849,7 +9922,7 @@ msgstr "上線" msgid "Up Delay" msgstr "上線延遲" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 msgid "Upload" msgstr "上傳" @@ -8864,25 +9937,29 @@ msgstr "在這裡上傳一個相容的系統升級映像檔來取代正在執行 msgid "Upload archive..." msgstr "上傳壓縮檔..." -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2851 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2875 msgid "Upload file" msgstr "上傳檔案" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2826 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2850 msgid "Upload file…" msgstr "上傳檔案…" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2773 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4202 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4214 +msgid "Upload has been cancelled" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/ui.js:2797 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4256 msgid "Upload request failed: %s" msgstr "上傳失敗: %s" -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4121 #: modules/luci-base/htdocs/luci-static/resources/ui.js:4175 +#: modules/luci-base/htdocs/luci-static/resources/ui.js:4229 msgid "Uploading file…" msgstr "上傳檔案中…" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:789 msgid "" "Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " "assigned with a name in the form wifinet# and the network will be " @@ -8891,34 +9968,38 @@ msgstr "" "按“繼續”後, 將為匿名的“ wifi-iface”部分分配一個名稱, 格式為 wifinet#, 並且網路將重新啟動以便套用更新的設定." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:411 msgid "" "Upon pressing \"Continue\", bridges configuration will be updated and the " "network will be restarted to apply the updated configuration." msgstr "按下「繼續」後,橋接設定將被更新,網路將重新啟動以應用更新的設定。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:428 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:445 msgid "" "Upon pressing \"Continue\", ifname options will get renamed and the network " "will be restarted to apply the updated configuration." msgstr "" "按下「繼續」,ifname 選項將被重新命名,網路將重新啟動以應用更新後的設定。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:422 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:509 msgid "Upstream resolvers will be queried in the order of the resolv file." msgstr "" "將會按照解析文件的順序查詢DNS伺服" "器。" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:62 msgid "Uptime" msgstr "上線時間" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 msgid "Use /etc/ethers" msgstr "採用 /etc/ethers" +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:106 +msgid "Use DHCP" +msgstr "" + #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:295 msgid "Use DHCP advertised servers" msgstr "使用 DHCP 通告的伺服器" @@ -8927,13 +10008,18 @@ msgstr "使用 DHCP 通告的伺服器" msgid "Use DHCP gateway" msgstr "使用DHCP的閘道" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:940 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:115 +msgid "Use DHCPv6" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:999 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:144 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:160 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:132 msgid "Use DNS servers advertised by peer" msgstr "使用終端發布的DNS伺服器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:623 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:616 msgid "Use ISO/IEC 3166 alpha2 country codes." msgstr "使用Use ISO/IEC 3166 alpha2 國別碼." @@ -8979,22 +10065,25 @@ msgstr "當作根 檔案系統(/)" msgid "Use broadcast flag" msgstr "當作廣播旗標" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1236 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1295 msgid "Use builtin IPv6-management" msgstr "使用內建的IPv6管理功能" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:944 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1003 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:148 msgid "Use custom DNS servers" msgstr "使用自訂的 DNS 伺服器" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:936 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:995 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:133 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:156 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:121 msgid "Use default gateway" msgstr "使用預設閘道" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:958 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1017 +#: protocols/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js:138 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:164 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:126 msgid "Use gateway metric" msgstr "使用閘道公測數" @@ -9018,15 +10107,15 @@ msgctxt "nft nat flag persistent" msgid "Use same source and destination for each connection" msgstr "對每個連接使用相同的源和目標" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 msgid "Use system certificates" msgstr "使用系統證書" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "Use system certificates for inner-tunnel" msgstr "對 inner-tunnel 使用系統憑證" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:598 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:772 msgid "" "Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed " @@ -9053,69 +10142,71 @@ msgstr "使用上層協定資訊, 依靠skb_flow_dissect(HASH額外封裝第三 msgid "Used" msgstr "已使用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1476 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1514 msgid "Used Key Slot" msgstr "已使用的關鍵插槽" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1557 msgid "" "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " "needed with normal WPA(2)-PSK." msgstr "採用不同目的: RADIUS NAS ID與802.11r R0KH-ID. 不需要正常的WPA(2)-PSK." -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:146 msgid "User Group" msgstr "使用者群組" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:106 msgid "User certificate (PEM encoded)" msgstr "使用者數位簽證(PEM編碼格式)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:187 msgid "User identifier" msgstr "使用者識別碼" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:132 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:170 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:118 msgid "User key (PEM encoded)" msgstr "使用者金鑰(PEM編碼格式)" -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 +#: modules/luci-base/ucode/template/sysauth.ut:23 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:147 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18 +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13 msgid "Username" msgstr "用戶名稱" -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:130 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:131 msgid "Utilize flow table %h" msgstr "利用流量表 %h" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1569 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1637 msgid "VC-Mux" msgstr "虛擬電路多工器VC-Mux" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1517 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1585 msgid "VDSL" msgstr "超高速數位用戶迴路 (VDSL)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:435 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:489 msgctxt "MACVLAN mode" msgid "VEPA (Virtual Ethernet Port Aggregator)" msgstr "VEPA (虛擬乙太網路埠匯集器)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:346 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1404 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:400 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1466 msgid "VLAN (802.1ad)" msgstr "VLAN (802.1ad)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:345 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1401 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:399 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1463 msgid "VLAN (802.1q)" msgstr "VLAN (802.1q)" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:414 -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:845 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:468 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:923 msgid "VLAN ID" msgstr "VLAN ID" @@ -9135,24 +10226,27 @@ msgstr "本地 VPN 位址" msgid "VPN Local port" msgstr "本地 VPN 阜" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:97 msgid "VPN Protocol" msgstr "VPN協定" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:93 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" msgstr "VPN伺服器" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:152 +msgid "VPN Server certificate's SHA256 hash" +msgstr "VPN 伺服器證書的 SHA256 雜湊" + +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:140 +#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:96 msgid "VPN Server port" msgstr "VPN 伺服器阜" -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:109 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 +#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:144 msgid "VPN Server's certificate SHA1 hash" msgstr "VPN 伺服器的 SHA1 雜湊表式數位簽證" @@ -9161,6 +10255,10 @@ msgstr "VPN 伺服器的 SHA1 雜湊表式數位簽證" msgid "VPNC (CISCO 3000 (and others) VPN)" msgstr "VPNC (CISCO 3000 (和其它) VPN)" +#: protocols/luci-proto-vti/htdocs/luci-static/resources/protocol/vti.js:10 +msgid "VTI" +msgstr "VTI" + #: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 msgid "VXLAN (RFC7348)" msgstr "VXLAN 虛擬區網擴展(RFC7348)" @@ -9174,14 +10272,14 @@ msgstr "VXLAN 虛擬區網擴展識別碼" msgid "VXLANv6 (RFC7348)" msgstr "VXLANv6虛擬區網擴展(RFC7348)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:397 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 msgid "" "Validate DNS replies and cache DNSSEC data, requires upstream to support " "DNSSEC." msgstr "需要上級支援 DNSSEC,驗證未簽章的回應確實是來自未簽章的網域。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1669 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1727 msgid "" "Validate server certificate using built-in system CA bundle,
    requires " "the \"ca-bundle\" package" @@ -9207,7 +10305,7 @@ msgstr "製造商" msgid "Vendor Class to send when requesting DHCP" msgstr "當請求DHCP封包時要傳送的製造商類別碼" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:489 msgid "Verify unsigned domain responses really come from unsigned domains." msgstr "驗證未簽名域回應是否確實來自未簽名域。" @@ -9215,12 +10313,12 @@ msgstr "驗證未簽名域回應是否確實來自未簽名域。" msgid "Verifying the uploaded image file." msgstr "驗證上傳的檔案中。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:957 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:951 msgid "Very High" msgstr "超高速" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:348 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1416 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:402 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1478 msgid "Virtual Ethernet" msgstr "虛擬乙太網路" @@ -9228,34 +10326,46 @@ msgstr "虛擬乙太網路" msgid "Virtual dynamic interface" msgstr "虛擬動態介面" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1106 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1101 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 msgid "WDS" msgstr "無線分散系統 WDS" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1296 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1385 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1298 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1387 msgid "WEP Open System" msgstr "WEP 開放系統" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1299 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1388 msgid "WEP Shared Key" msgstr "WEP 共享金鑰" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WEP passphrase" msgstr "WEP通關密碼" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:983 +msgid "WLAN roaming" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "WMM Mode" msgstr "無線多媒體機制" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2030 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1642 +msgid "WNM Sleep Mode" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1646 +msgid "WNM Sleep Mode Fixes" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2119 msgid "WPA passphrase" msgstr "WPA 密碼" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1287 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1289 msgid "" "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " "and ad-hoc mode) to be installed." @@ -9284,20 +10394,68 @@ msgstr "警告:未儲存的變更會在重新啟動時遺失!" msgid "Weak" msgstr "薄弱" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1029 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:670 +msgid "Weight" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:921 +msgid "" +"When a host matches an entry then the special tag known is set. Use " +"known to match all known hosts." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1088 msgid "" "When delegating prefixes to multiple downstreams, interfaces with a higher " "preference value are considered first when allocating subnets." msgstr "" "將前綴委派給多個下游時,在分配子網路時,將首先考慮具有較高優先順序值的介面。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:109 +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:105 +msgid "" +"When enabled network coding increases the WiFi throughput by combining " +"multiple frames into a single frame, thus reducing the needed air time." +msgstr "" +"啟用網絡編碼後,通過將多個幀組合成單個幀來增加 WiFi 吞吐量,從而減少所需的傳" +"輸時間。" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:76 +msgid "" +"When enabled the distributed ARP table forms a mesh-wide ARP cache that " +"helps non-mesh clients to get ARP responses much more reliably and without " +"much delay." +msgstr "" +"啟用後,分佈式 ARP 表形成一個網格範圍的 ARP 緩存,幫助非網格客戶端更可靠地獲" +"得 ARP 響應,並且沒有太多延遲。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:110 msgid "" "When enabled, gateway is on-link even if the gateway does not match any " "interface prefix" msgstr "啟用後,即使閘道與任何介面前綴都不相符,閘道也處於鏈路上" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1542 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:707 +msgid "" +"When enabled, new ARP table entries are added from received gratuitous APR " +"requests or replies, otherwise only preexisting table entries are updated, " +"but no new hosts are learned." +msgstr "" + +#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:14 +msgid "" +"When inverted, the LED is continuously lit and flickers instead of it being " +"off by default and blinking on system activity." +msgstr "反轉時,LED 會持續亮起並閃爍,而不是預設關閉並在系統動作時閃爍。" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:66 +msgid "" +"When running the mesh over multiple WiFi interfaces per node batman-adv is " +"capable of optimizing the traffic flow to gain maximum performance." +msgstr "" +"當在每個節點的多個 WiFi 接口上運行網格時,batman-adv 能夠優化流量以獲得最大性" +"能。" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 msgid "" "When using a PSK, the PMK can be automatically generated. When enabled, the " "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " @@ -9306,30 +10464,39 @@ msgstr "" "使用PSK時, 可以自動產生PMK. 啟用後, 以下R0/R1鍵選項將不適用. 停用此選項可使用" "R0和R1鍵選項." -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1144 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1139 msgid "" "Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to " "802.11a/802.11g rates." msgstr "" "一旦Wi-Fi多媒體(WMM)模式QoS被禁用,客戶端可能會限速到 802.11a/802.11g 。" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1140 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1135 msgid "" "Where the ESSID is hidden, clients may fail to roam and airtime efficiency " "may be significantly reduced." msgstr "隱藏ESSID的地方,客戶端可能無法漫遊,並且通話時間效率可能會大大降低。" #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:520 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:513 msgid "Width" msgstr "寬度" +#: protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json:3 +msgid "WireGuard" +msgstr "WireGuard VPN" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:120 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:165 +msgid "WireGuard Status" +msgstr "WireGuard 狀態" + #: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:119 msgid "WireGuard VPN" msgstr "WireGuard虛擬私人網路(VPN)" -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:541 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:539 msgid "WireGuard peer is disabled" msgstr "WireGuard 對端被停用" @@ -9345,21 +10512,21 @@ msgid "Wireless Adapter" msgstr "無線網卡" #: modules/luci-base/htdocs/luci-static/resources/network.js:2971 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4275 +#: modules/luci-base/htdocs/luci-static/resources/network.js:4276 #: modules/luci-compat/luasrc/model/network.lua:1405 #: modules/luci-compat/luasrc/model/network.lua:1868 msgid "Wireless Network" msgstr "無線網路" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:805 msgid "Wireless Overview" msgstr "無線網路總覽" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:986 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:980 msgid "Wireless Security" msgstr "無線安全" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless configuration migration" msgstr "無線設定遷移" @@ -9375,15 +10542,15 @@ msgstr "無線被關閉" msgid "Wireless is not associated" msgstr "無線網路未連結" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is disabled" msgstr "無線網路已停用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:935 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 msgid "Wireless network is enabled" msgstr "無線網路已啟用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 msgid "Write received DNS queries to syslog." msgstr "寫入已接收的DNS請求到系統日誌中。" @@ -9395,7 +10562,7 @@ msgstr "將系統日誌寫入檔案" msgid "XOR policy (balance-xor, 2)" msgstr "位元互斥運算子(XOR)策略(balance-xor, 2)" -#: modules/luci-base/htdocs/luci-static/resources/form.js:4085 +#: modules/luci-base/htdocs/luci-static/resources/form.js:4094 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:297 #: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 msgid "Yes" @@ -9420,8 +10587,20 @@ msgstr "" "您可以開啟或關閉初始化指令在這. 修改將會在設備重開後被啟用.
    警" "告: 假如您關閉必要的初始化腳本像\"網路\", 您的設備將可能無法存取!" -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:640 +msgid "You may add multiple records for the same Target." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:677 +msgid "You may add multiple records for the same domain." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:357 +msgid "You may add multiple unique Relay To on the same Listen addr." +msgstr "" + +#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78 +#: themes/luci-theme-material/ucode/template/themes/material/header.ut:98 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 msgid "" "You must enable JavaScript in your browser or LuCI will not work properly." @@ -9450,34 +10629,54 @@ msgstr "ZRam 設定" msgid "ZRam Size" msgstr "ZRam 大小" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:448 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:163 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:639 +msgid "_proto: _tcp, _udp, _sctp, _quic, … ." +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:638 +msgid "" +"_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is " +"possible, no browsers support SRV records.)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:153 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:164 +#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 msgid "any" msgstr "任意" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1502 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1510 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1515 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:133 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1236 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:79 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1578 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1583 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:134 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 +#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 msgid "auto" msgstr "自動" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:776 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:816 msgid "automatic" msgstr "自動" +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (disabled)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:198 +msgid "automatic (enabled)" +msgstr "" + #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 msgid "baseT" msgstr "baseT標準" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1575 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1643 msgid "bridged" msgstr "已橋接" @@ -9534,25 +10733,30 @@ msgctxt "nft unit" msgid "day" msgstr "天" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1087 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1082 msgid "disable" msgstr "關閉" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:765 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:880 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:681 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:805 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:927 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1040 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 msgid "disabled" msgstr "已禁用" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:577 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:611 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:570 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:604 msgid "driver default" msgstr "預設驅動" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "driver default (%s)" +msgstr "" + #: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:66 msgid "e.g: --proxy 10.10.10.10" msgstr "例如: --代理 10.10.10.10" @@ -9561,14 +10765,23 @@ msgstr "例如: --代理 10.10.10.10" msgid "e.g: dump" msgstr "例如:完全備份" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:725 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:755 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:157 +msgid "enabled" +msgstr "" + +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 +msgctxt "WireGuard keep alive interval" +msgid "every %ds" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:965 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:995 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:101 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:148 msgid "expired" msgstr "已過期" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:780 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:820 msgid "forced" msgstr "強制" @@ -9578,22 +10791,22 @@ msgstr "強制" msgid "forward" msgstr "轉發" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "full-duplex" msgstr "全雙工" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:97 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:98 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 msgid "half-duplex" msgstr "半雙工" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:584 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:593 msgid "hexadecimal encoded value" msgstr "十六進制編碼值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1825 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:297 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js:309 msgid "hidden" msgstr "隱藏" @@ -9602,9 +10815,9 @@ msgctxt "nft unit" msgid "hour" msgstr "小時" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:771 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:886 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:811 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:933 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 msgid "hybrid mode" msgstr "複合模式" @@ -9612,6 +10825,10 @@ msgstr "複合模式" msgid "ignore" msgstr "忽略" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:900 +msgid "infinite (lease does not expire)" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:192 #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 @@ -9626,11 +10843,19 @@ msgstr "長度介於 8 到 63 個字" msgid "key with either 5 or 13 characters" msgstr "鑰匙須為 5 或 13 個字" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:793 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:924 +msgid "known" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:926 +msgid "known-othernet (on different subnet)" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:833 msgid "managed config (M)" msgstr "受控設定 (M)" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 msgid "medium security" msgstr "中等安全" @@ -9639,11 +10864,11 @@ msgctxt "nft unit" msgid "minute" msgstr "分" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1547 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1585 msgid "minutes" msgstr "分鐘" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:797 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:837 msgid "mobile home agent (H)" msgstr "移動 home 代理 (H)" @@ -9655,18 +10880,26 @@ msgstr "netif carrier ok()" msgid "no" msgstr "否" -#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:103 +#: modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js:232 msgid "no link" msgstr "未連線" +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1162 +msgid "no override" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/form.js:2269 #: modules/luci-base/htdocs/luci-static/resources/validation.js:59 msgid "non-empty value" msgstr "非空值" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3415 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:800 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3424 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:840 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:39 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:56 +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:60 msgid "none" msgstr "無" @@ -9677,20 +10910,20 @@ msgid "not present" msgstr "未連接" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:349 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:965 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:969 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:963 msgid "off" msgstr "關閉" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:778 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:818 msgid "on available prefix" msgstr "在可用的前綴上" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "open network" msgstr "開放式網路" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:795 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:835 msgid "other config (O)" msgstr "其他設定 (O)" @@ -9699,6 +10932,10 @@ msgstr "其他設定 (O)" msgid "output" msgstr "輸出" +#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js:28 +msgid "over a day ago" +msgstr "超過一天前" + #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js:69 msgctxt "nft unit" msgid "packets" @@ -9716,23 +10953,32 @@ msgstr "正整數" msgid "random" msgstr "隨機" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:769 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1163 +msgid "randomly generated" +msgstr "" + +#: protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv.js:51 +msgid "" +"reduces overhead by collecting and aggregating originator messages in a " +"single packet rather than many small ones" +msgstr "通過在單個數據包而不是許多小數據包中收集和聚合發起方消息來減少開銷" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:809 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:965 msgid "relay mode" msgstr "中繼模式" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1576 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1644 msgid "routed" msgstr "路由" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1172 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1181 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1174 msgid "sec" msgstr "秒" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:767 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:807 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 msgid "server mode" msgstr "伺服器模式" @@ -9740,7 +10986,7 @@ msgstr "伺服器模式" msgid "sstpc Log-level" msgstr "SSTP客戶端 日誌-層級" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 msgid "strong security" msgstr "超安全" @@ -9748,7 +10994,7 @@ msgstr "超安全" msgid "tagged" msgstr "已選" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1530 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "time units (TUs / 1.024 ms) [1000-65535]" msgstr "時間單位 (TUs / 1.024 ms) [1000-65535]" @@ -9761,25 +11007,27 @@ msgstr "" "uHTTPd 提供 HTTP 或 HTTPS 網路存取。" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:574 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:583 msgid "unique value" msgstr "獨特值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1453 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1465 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:592 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:585 msgid "unknown" msgstr "未知" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:455 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:723 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:753 +#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:28 +msgid "unknown version" +msgstr "" + +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:963 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:993 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:99 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:146 msgid "unlimited" msgstr "無限" -#: modules/luci-base/htdocs/luci-static/resources/form.js:3780 +#: modules/luci-base/htdocs/luci-static/resources/form.js:3789 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:370 @@ -9801,8 +11049,8 @@ msgid "untagged" msgstr "未選" #: modules/luci-base/htdocs/luci-static/resources/validation.js:257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:175 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:186 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "valid IP address" msgstr "有效的 IP 位址" @@ -9815,7 +11063,7 @@ msgid "valid IPv4 CIDR" msgstr "有效的 IPv4 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:265 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:179 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 msgid "valid IPv4 address" msgstr "有效的 IPv4 位址" @@ -9844,7 +11092,7 @@ msgid "valid IPv6 CIDR" msgstr "有效的 IPv6 CIDR" #: modules/luci-base/htdocs/luci-static/resources/validation.js:273 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:183 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 msgid "valid IPv6 address" msgstr "有效的 IPv6 位址" @@ -9881,8 +11129,8 @@ msgstr "有效的UCI識別碼, 主機名稱或IP位址" msgid "valid address:port" msgstr "有效的位址:阜號" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:548 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:552 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:557 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:561 msgid "valid date (YYYY-MM-DD)" msgstr "有效日期 (YYYY-MM-DD)" @@ -9922,11 +11170,21 @@ msgstr "有效的整數值" msgid "valid multicast MAC address" msgstr "有效的多播 MAC 位址" +#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +msgid "" +"valid network device name between 1 and 15 characters not containing \":\", " +"\"/\", \"%\" or spaces" +msgstr "" + +#: modules/luci-base/htdocs/luci-static/resources/validation.js:433 +msgid "valid network device name, not \".\" or \"..\"" +msgstr "" + #: modules/luci-base/htdocs/luci-static/resources/validation.js:323 msgid "valid network in address/netmask notation" msgstr "依照「位址/網路遮罩」標記法的有效網路" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:523 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:532 msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" msgstr "有效的電話號碼(0-9, \"*\", \"#\", \"!\" or \".\")" @@ -9936,43 +11194,43 @@ msgid "valid port or port range (port1-port2)" msgstr "有效的埠號或者範圍埠(埠1-埠2)" #: modules/luci-base/htdocs/luci-static/resources/validation.js:338 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:190 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:192 msgid "valid port value" msgstr "有效的阜值" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:528 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 msgid "valid time (HH:MM:SS)" msgstr "有效的時間 (HH:MM:SS)" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:450 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:459 msgid "value between %d and %d characters" msgstr "介於 %d 和 %d 字間的值" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:431 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 msgid "value between %f and %f" msgstr "介於 %d 和 %d 間的值" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 msgid "value greater or equal to %f" msgstr "大於或等於 %f 的值" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:439 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:448 msgid "value smaller or equal to %f" msgstr "小於或等於 %f 的值" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:444 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:453 msgid "value with %d characters" msgstr "有 %d 字的值" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:455 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:464 msgid "value with at least %d characters" msgstr "至少有 %d 字的值" -#: modules/luci-base/htdocs/luci-static/resources/validation.js:460 +#: modules/luci-base/htdocs/luci-static/resources/validation.js:469 msgid "value with at most %d characters" msgstr "最多有 %d 字的值" -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1396 +#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 msgid "weak security" msgstr "安全性不足" diff --git a/package/luci/modules/luci-base/root/usr/libexec/rpcd/luci b/package/luci/modules/luci-base/root/usr/libexec/rpcd/luci deleted file mode 100755 index 6a80951e8c..0000000000 --- a/package/luci/modules/luci-base/root/usr/libexec/rpcd/luci +++ /dev/null @@ -1,683 +0,0 @@ -#!/usr/bin/env lua - -local json = require "luci.jsonc" -local fs = require "nixio.fs" - -local function readfile(path) - local s = fs.readfile(path) - return s and (s:gsub("^%s+", ""):gsub("%s+$", "")) -end - -local methods = { - getInitList = { - args = { name = "name" }, - call = function(args) - local sys = require "luci.sys" - local _, name, scripts = nil, nil, {} - for _, name in ipairs(args.name and { args.name } or sys.init.names()) do - local index = sys.init.index(name) - if index then - scripts[name] = { index = index, enabled = sys.init.enabled(name) } - else - return { error = "No such init script" } - end - end - return scripts - end - }, - - setInitAction = { - args = { name = "name", action = "action" }, - call = function(args) - local sys = require "luci.sys" - if type(sys.init[args.action]) ~= "function" then - return { error = "Invalid action" } - end - return { result = sys.init[args.action](args.name) } - end - }, - - getLocaltime = { - call = function(args) - return { result = os.time() } - end - }, - - setLocaltime = { - args = { localtime = 0 }, - call = function(args) - local sys = require "luci.sys" - local date = os.date("*t", args.localtime) - if date then - sys.call("date -s '%04d-%02d-%02d %02d:%02d:%02d' >/dev/null" %{ date.year, date.month, date.day, date.hour, date.min, date.sec }) - sys.call("/etc/init.d/sysfixtime restart >/dev/null") - end - return { result = args.localtime } - end - }, - - getTimezones = { - call = function(args) - local util = require "luci.util" - local zones = require "luci.sys.zoneinfo" - - local tz = readfile("/etc/TZ") - local res = util.ubus("uci", "get", { - config = "system", - section = "@system[0]", - option = "zonename" - }) - - local result = {} - local _, zone - for _, zone in ipairs(zones.TZ) do - result[zone[1]] = { - tzstring = zone[2], - active = (res and res.value == zone[1]) and true or nil - } - end - return result - end - }, - - getLEDs = { - call = function() - local iter = fs.dir("/sys/class/leds") - local result = { } - - if iter then - local led - for led in iter do - local m, s - - result[led] = { triggers = {} } - - s = readfile("/sys/class/leds/"..led.."/trigger") - for s in (s or ""):gmatch("%S+") do - m = s:match("^%[(.+)%]$") - result[led].triggers[#result[led].triggers+1] = m or s - result[led].active_trigger = m or result[led].active_trigger - end - - s = readfile("/sys/class/leds/"..led.."/brightness") - if s then - result[led].brightness = tonumber(s) - end - - s = readfile("/sys/class/leds/"..led.."/max_brightness") - if s then - result[led].max_brightness = tonumber(s) - end - end - end - - return result - end - }, - - getUSBDevices = { - call = function() - local fs = require "nixio.fs" - local iter = fs.glob("/sys/bus/usb/devices/[0-9]*/manufacturer") - local result = { } - - if iter then - result.devices = {} - - local p - for p in iter do - local id = p:match("/([^/]+)/manufacturer$") - - result.devices[#result.devices+1] = { - id = id, - vid = readfile("/sys/bus/usb/devices/"..id.."/idVendor"), - pid = readfile("/sys/bus/usb/devices/"..id.."/idProduct"), - vendor = readfile("/sys/bus/usb/devices/"..id.."/manufacturer"), - product = readfile("/sys/bus/usb/devices/"..id.."/product"), - speed = tonumber((readfile("/sys/bus/usb/devices/"..id.."/product"))) - } - end - end - - iter = fs.glob("/sys/bus/usb/devices/*/*-port[0-9]*") - - if iter then - result.ports = {} - - local p - for p in iter do - local port = p:match("([^/]+)$") - local link = fs.readlink(p.."/device") - - result.ports[#result.ports+1] = { - port = port, - device = link and fs.basename(link) - } - end - end - - return result - end - }, - - getConntrackHelpers = { - call = function() - local ok, fd = pcall(io.open, "/usr/share/fw3/helpers.conf", "r") - local rv = {} - - if not (ok and fd) then - ok, fd = pcall(io.open, "/usr/share/firewall4/helpers", "r") - end - - if ok and fd then - local entry - - while true do - local line = fd:read("*l") - if not line then - break - end - - if line:match("^%s*config%s") then - if entry then - rv[#rv+1] = entry - end - entry = {} - else - local opt, val = line:match("^%s*option%s+(%S+)%s+(%S.*)$") - if opt and val then - opt = opt:gsub("^'(.+)'$", "%1"):gsub('^"(.+)"$', "%1") - val = val:gsub("^'(.+)'$", "%1"):gsub('^"(.+)"$', "%1") - entry[opt] = val - end - end - end - - if entry then - rv[#rv+1] = entry - end - - fd:close() - end - - return { result = rv } - end - }, - - getFeatures = { - call = function() - local fs = require "nixio.fs" - local rv = {} - local ok, fd - - rv.firewall = fs.access("/sbin/fw3") - rv.firewall4 = fs.access("/sbin/fw4") - rv.opkg = fs.access("/bin/opkg") - rv.offloading = fs.access("/sys/module/xt_FLOWOFFLOAD/refcnt") or fs.access("/sys/module/nft_flow_offload/refcnt") - rv.br2684ctl = fs.access("/usr/sbin/br2684ctl") - rv.swconfig = fs.access("/sbin/swconfig") - rv.odhcpd = fs.access("/usr/sbin/odhcpd") - rv.zram = fs.access("/sys/class/zram-control") - rv.sysntpd = fs.readlink("/usr/sbin/ntpd") and true - rv.ipv6 = fs.access("/proc/net/ipv6_route") - rv.dropbear = fs.access("/usr/sbin/dropbear") - rv.cabundle = fs.access("/etc/ssl/certs/ca-certificates.crt") - rv.relayd = fs.access("/usr/sbin/relayd") - rv.dsl = fs.access("/sbin/dsl_cpe_control") or fs.access("/sbin/vdsl_cpe_control") - - local wifi_features = { "eap", "11n", "11ac", "11r", "acs", "sae", "owe", "suiteb192", "wep", "wps" } - - if fs.access("/usr/sbin/hostapd") then - rv.hostapd = { cli = fs.access("/usr/sbin/hostapd_cli") } - - local _, feature - for _, feature in ipairs(wifi_features) do - rv.hostapd[feature] = - (os.execute(string.format("/usr/sbin/hostapd -v%s >/dev/null 2>/dev/null", feature)) == 0) - end - end - - if fs.access("/usr/sbin/wpa_supplicant") then - rv.wpasupplicant = { cli = fs.access("/usr/sbin/wpa_cli") } - - local _, feature - for _, feature in ipairs(wifi_features) do - rv.wpasupplicant[feature] = - (os.execute(string.format("/usr/sbin/wpa_supplicant -v%s >/dev/null 2>/dev/null", feature)) == 0) - end - end - - ok, fd = pcall(io.popen, "dnsmasq --version 2>/dev/null") - if ok then - rv.dnsmasq = {} - - while true do - local line = fd:read("*l") - if not line then - break - end - - local opts = line:match("^Compile time options: (.+)$") - if opts then - local opt - for opt in opts:gmatch("%S+") do - local no = opt:match("^no%-(%S+)$") - rv.dnsmasq[string.lower(no or opt)] = not no - end - break - end - end - - fd:close() - end - - ok, fd = pcall(io.popen, "ipset --help 2>/dev/null") - if ok then - rv.ipset = {} - - local sets = false - - while true do - local line = fd:read("*l") - if not line then - break - elseif line:match("^Supported set types:") then - sets = true - elseif sets then - local set, ver = line:match("^%s+(%S+)%s+(%d+)") - if set and not rv.ipset[set] then - rv.ipset[set] = tonumber(ver) - end - end - end - - fd:close() - end - - return rv - end - }, - - getSwconfigFeatures = { - args = { switch = "switch0" }, - call = function(args) - local util = require "luci.util" - - -- Parse some common switch properties from swconfig help output. - local swc, err = io.popen("swconfig dev %s help 2>/dev/null" % util.shellquote(args.switch)) - if swc then - local is_port_attr = false - local is_vlan_attr = false - local rv = {} - - while true do - local line = swc:read("*l") - if not line then break end - - if line:match("^%s+%-%-vlan") then - is_vlan_attr = true - - elseif line:match("^%s+%-%-port") then - is_vlan_attr = false - is_port_attr = true - - elseif line:match("cpu @") then - rv.switch_title = line:match("^switch%d: %w+%((.-)%)") - rv.num_vlans = tonumber(line:match("vlans: (%d+)")) or 16 - rv.min_vid = 1 - - elseif line:match(": pvid") or line:match(": tag") or line:match(": vid") then - if is_vlan_attr then rv.vid_option = line:match(": (%w+)") end - - elseif line:match(": enable_vlan4k") then - rv.vlan4k_option = "enable_vlan4k" - - elseif line:match(": enable_vlan") then - rv.vlan_option = "enable_vlan" - - elseif line:match(": enable_learning") then - rv.learning_option = "enable_learning" - - elseif line:match(": enable_mirror_rx") then - rv.mirror_option = "enable_mirror_rx" - - elseif line:match(": max_length") then - rv.jumbo_option = "max_length" - end - end - - swc:close() - - if not next(rv) then - return { error = "No such switch" } - end - - return rv - else - return { error = err } - end - end - }, - - getSwconfigPortState = { - args = { switch = "switch0" }, - call = function(args) - local util = require "luci.util" - - local swc, err = io.popen("swconfig dev %s show 2>/dev/null" % util.shellquote(args.switch)) - if swc then - local ports = { } - - while true do - local line = swc:read("*l") - if not line or (line:match("^VLAN %d+:") and #ports > 0) then - break - end - - local pnum = line:match("^Port (%d+):$") - if pnum then - port = { - port = tonumber(pnum), - duplex = false, - speed = 0, - link = false, - auto = false, - rxflow = false, - txflow = false - } - - ports[#ports+1] = port - end - - if port then - local m - - if line:match("full[%- ]duplex") then - port.duplex = true - end - - m = line:match(" speed:(%d+)") - if m then - port.speed = tonumber(m) - end - - m = line:match("(%d+) Mbps") - if m and port.speed == 0 then - port.speed = tonumber(m) - end - - m = line:match("link: (%d+)") - if m and port.speed == 0 then - port.speed = tonumber(m) - end - - if line:match("link: ?up") or line:match("status: ?up") then - port.link = true - end - - if line:match("auto%-negotiate") or line:match("link:.-auto") then - port.auto = true - end - - if line:match("link:.-rxflow") then - port.rxflow = true - end - - if line:match("link:.-txflow") then - port.txflow = true - end - end - end - - swc:close() - - if not next(ports) then - return { error = "No such switch" } - end - - return { result = ports } - else - return { error = err } - end - end - }, - - setPassword = { - args = { username = "root", password = "password" }, - call = function(args) - local util = require "luci.util" - return { - result = (os.execute("(echo %s; sleep 1; echo %s) | /bin/busybox passwd %s >/dev/null 2>&1" %{ - luci.util.shellquote(args.password), - luci.util.shellquote(args.password), - luci.util.shellquote(args.username) - }) == 0) - } - end - }, - - getBlockDevices = { - call = function() - local fs = require "nixio.fs" - - local block = io.popen("/sbin/block info", "r") - if block then - local rv = {} - - while true do - local ln = block:read("*l") - if not ln then - break - end - - local dev = ln:match("^/dev/(.-):") - if dev then - local s = tonumber((fs.readfile("/sys/class/block/" .. dev .."/size"))) - local e = { - dev = "/dev/" .. dev, - size = s and s * 512 - } - - local key, val = { } - for key, val in ln:gmatch([[(%w+)="(.-)"]]) do - e[key:lower()] = val - end - - rv[dev] = e - end - end - - block:close() - - return rv - else - return { error = "Unable to execute block utility" } - end - end - }, - - setBlockDetect = { - call = function() - return { result = (os.execute("/sbin/block detect > /etc/config/fstab") == 0) } - end - }, - - getMountPoints = { - call = function() - local fs = require "nixio.fs" - - local fd, err = io.open("/proc/mounts", "r") - if fd then - local rv = {} - - while true do - local ln = fd:read("*l") - if not ln then - break - end - - local device, mount, fstype, options, freq, pass = ln:match("^(%S*) (%S*) (%S*) (%S*) (%d+) (%d+)$") - if device and mount then - device = device:gsub("\\(%d+)", function(n) return string.char(tonumber(n, 8)) end) - mount = mount:gsub("\\(%d+)", function(n) return string.char(tonumber(n, 8)) end) - - local stat = fs.statvfs(mount) - if stat and stat.blocks > 0 then - rv[#rv+1] = { - device = device, - mount = mount, - size = stat.bsize * stat.blocks, - avail = stat.bsize * stat.bavail, - free = stat.bsize * stat.bfree - } - end - end - end - - fd:close() - - return { result = rv } - else - return { error = err } - end - end - }, - - getRealtimeStats = { - args = { mode = "interface", device = "eth0" }, - call = function(args) - local util = require "luci.util" - - local flags - if args.mode == "interface" then - flags = "-i %s" % util.shellquote(args.device) - elseif args.mode == "wireless" then - flags = "-r %s" % util.shellquote(args.device) - elseif args.mode == "conntrack" then - flags = "-c" - elseif args.mode == "load" then - flags = "-l" - else - return { error = "Invalid mode" } - end - - local fd, err = io.popen("luci-bwc %s" % flags, "r") - if fd then - local parse = json.new() - local done - - parse:parse("[") - - while true do - local ln = fd:read("*l") - if not ln then - break - end - - done, err = parse:parse((ln:gsub("%d+", "%1.0"))) - - if done then - err = "Unexpected JSON data" - end - - if err then - break - end - end - - fd:close() - - done, err = parse:parse("]") - - if err then - return { error = err } - elseif not done then - return { error = "Incomplete JSON data" } - else - return { result = parse:get() } - end - else - return { error = err } - end - end - }, - - getConntrackList = { - call = function() - local sys = require "luci.sys" - return { result = sys.net.conntrack() } - end - }, - - getProcessList = { - call = function() - local sys = require "luci.sys" - local res = {} - for _, v in pairs(sys.process.list()) do - res[#res + 1] = v - end - return { result = res } - end - } -} - -local function parseInput() - local parse = json.new() - local done, err - - while true do - local chunk = io.read(4096) - if not chunk then - break - elseif not done and not err then - done, err = parse:parse(chunk) - end - end - - if not done then - print(json.stringify({ error = err or "Incomplete input" })) - os.exit(1) - end - - return parse:get() -end - -local function validateArgs(func, uargs) - local method = methods[func] - if not method then - print(json.stringify({ error = "Method not found" })) - os.exit(1) - end - - if type(uargs) ~= "table" then - print(json.stringify({ error = "Invalid arguments" })) - os.exit(1) - end - - uargs.ubus_rpc_session = nil - - local k, v - local margs = method.args or {} - for k, v in pairs(uargs) do - if margs[k] == nil or - (v ~= nil and type(v) ~= type(margs[k])) - then - print(json.stringify({ error = "Invalid arguments" })) - os.exit(1) - end - end - - return method -end - -if arg[1] == "list" then - local _, method, rv = nil, nil, {} - for _, method in pairs(methods) do rv[_] = method.args or {} end - print((json.stringify(rv):gsub(":%[%]", ":{}"))) -elseif arg[1] == "call" then - local args = parseInput() - local method = validateArgs(arg[2], args) - local result, code = method.call(args) - print((json.stringify(result):gsub("^%[%]$", "{}"))) - os.exit(code or 0) -end diff --git a/package/luci/modules/luci-base/root/usr/share/luci/menu.d/luci-base.json b/package/luci/modules/luci-base/root/usr/share/luci/menu.d/luci-base.json index 605c7ab777..e6deb1fddb 100644 --- a/package/luci/modules/luci-base/root/usr/share/luci/menu.d/luci-base.json +++ b/package/luci/modules/luci-base/root/usr/share/luci/menu.d/luci-base.json @@ -61,7 +61,7 @@ "admin/translations/*": { "action": { - "type": "call", + "type": "function", "module": "luci.controller.admin.index", "function": "action_translations" }, @@ -70,7 +70,7 @@ "admin/ubus/*": { "action": { - "type": "call", + "type": "function", "module": "luci.controller.admin.index", "function": "action_ubus" }, @@ -78,10 +78,10 @@ }, "admin/logout": { - "title": "Logout", + "title": "Log out", "order": 999, "action": { - "type": "call", + "type": "function", "module": "luci.controller.admin.index", "function": "action_logout" }, @@ -99,7 +99,7 @@ "admin/uci/revert": { "action": { - "type": "call", + "type": "function", "module": "luci.controller.admin.uci", "function": "action_revert", "post": true @@ -109,7 +109,7 @@ "admin/uci/apply_rollback": { "cors": true, "action": { - "type": "call", + "type": "function", "module": "luci.controller.admin.uci", "function": "action_apply_rollback", "post": true @@ -122,7 +122,7 @@ "admin/uci/apply_unchecked": { "cors": true, "action": { - "type": "call", + "type": "function", "module": "luci.controller.admin.uci", "function": "action_apply_unchecked", "post": true @@ -135,7 +135,7 @@ "admin/uci/confirm": { "cors": true, "action": { - "type": "call", + "type": "function", "module": "luci.controller.admin.uci", "function": "action_confirm" }, @@ -144,7 +144,7 @@ "admin/menu": { "action": { - "type": "call", + "type": "function", "module": "luci.controller.admin.index", "function": "action_menu" }, diff --git a/package/luci/modules/luci-base/root/usr/share/rpcd/ucode/luci b/package/luci/modules/luci-base/root/usr/share/rpcd/ucode/luci new file mode 100644 index 0000000000..3c4fea4691 --- /dev/null +++ b/package/luci/modules/luci-base/root/usr/share/rpcd/ucode/luci @@ -0,0 +1,587 @@ +// Copyright 2022 Jo-Philipp Wich +// Licensed to the public under the Apache License 2.0. + +'use strict'; + +import { stdin, access, dirname, basename, open, popen, glob, lsdir, readfile, readlink, error } from 'fs'; +import { cursor } from 'uci'; + +import { init_list, init_index, init_enabled, init_action, conntrack_list, process_list } from 'luci.sys'; +import { revision, branch } from 'luci.version'; +import { statvfs, uname } from 'luci.core'; + +import timezones from 'luci.zoneinfo'; + + +function shellquote(s) { + return `'${replace(s, "'", "'\\''")}'`; +} + +const methods = { + getVersion: { + call: function(request) { + return { revision, branch }; + } + }, + + getInitList: { + args: { name: 'name' }, + call: function(request) { + let scripts = {}; + + for (let name in filter(init_list(), i => !request.args.name || i == request.args.name)) { + let idx = init_index(name); + + scripts[name] = { + index: idx?.[0], + stop: idx?.[1], + enabled: init_enabled(name) + }; + } + + return length(scripts) ? scripts : { error: 'No such init script' }; + } + }, + + setInitAction: { + args: { name: 'name', action: 'action' }, + call: function(request) { + switch (request.args.action) { + case 'enable': + case 'disable': + case 'start': + case 'stop': + case 'restart': + case 'reload': + const rc = init_action(request.args.name, request.args.action); + + if (rc === false) + return { error: 'No such init script' }; + + return { result: rc == 0 }; + + default: + return { error: 'Invalid action' }; + } + } + }, + + getLocaltime: { + call: function(request) { + return { result: time() }; + } + }, + + setLocaltime: { + args: { localtime: 0 }, + call: function(request) { + let t = localtime(request.args.localtime); + + if (t) { + system(sprintf('date -s "%04d-%02d-%02d %02d:%02d:%02d" >/dev/null', t.year, t.mon, t.mday, t.hour, t.min, t.sec)); + system('/etc/init.d/sysfixtime restart >/dev/null'); + } + + return { result: request.args.localtime }; + } + }, + + getTimezones: { + call: function(request) { + let tz = trim(readfile('/etc/TZ')); + let zn = cursor()?.get?.('system', '@system[0]', 'zonename'); + let result = {}; + + for (let zone, tzstring in timezones) { + result[zone] = { tzstring }; + + if (zn == zone) + result[zone].active = true; + }; + + return result; + } + }, + + getLEDs: { + call: function() { + let result = {}; + + for (let led in lsdir('/sys/class/leds')) { + let s; + + result[led] = { triggers: [] }; + + s = trim(readfile(`/sys/class/leds/${led}/trigger`)); + for (let trigger in split(s, ' ')) { + push(result[led].triggers, trim(trigger, '[]')); + + if (trigger != result[led].triggers[-1]) + result[led].active_trigger = result[led].triggers[-1]; + } + + s = readfile(`/sys/class/leds/${led}/brightness`); + result[led].brightness = +s; + + s = readfile(`/sys/class/leds/${led}/max_brightness`); + result[led].max_brightness = +s; + } + + return result; + } + }, + + getUSBDevices: { + call: function() { + let result = { devices: [], ports: [] }; + + for (let path in glob('/sys/bus/usb/devices/[0-9]*/manufacturer')) { + let id = basename(dirname(path)); + + push(result.devices, { + id, + vid: trim(readfile(`/sys/bus/usb/devices/${id}/idVendor`)), + pid: trim(readfile(`/sys/bus/usb/devices/${id}/idProduct`)), + vendor: trim(readfile(path)), + product: trim(readfile(`/sys/bus/usb/devices/${id}/product`)), + speed: +readfile(`/sys/bus/usb/devices/${id}/speed`) + }); + } + + for (let path in glob('/sys/bus/usb/devices/*/*-port[0-9]*')) { + let port = basename(path); + let link = readlink(`${path}/device`); + + push(result.ports, { + port, + device: basename(link) + }); + } + + return result; + } + }, + + getConntrackHelpers: { + call: function() { + const uci = cursor(); + let helpers = []; + let package; + + if (uci.load('/usr/share/firewall4/helpers')) + package = 'helpers'; + else if (uci.load('/usr/share/fw3/helpers.conf')) + package = 'helpers.conf'; + + if (package) { + uci.foreach(package, 'helper', (s) => { + push(helpers, { + name: s.name, + description: s.description, + module: s.module, + family: s.family, + proto: s.proto, + port: s.port + }); + }); + } + + return { result: helpers }; + } + }, + + getFeatures: { + call: function() { + let result = { + firewall: access('/sbin/fw3') == true, + firewall4: access('/sbin/fw4') == true, + opkg: access('/bin/opkg') == true, + offloading: access('/sys/module/xt_FLOWOFFLOAD/refcnt') == true || access('/sys/module/nft_flow_offload/refcnt') == true, + br2684ctl: access('/usr/sbin/br2684ctl') == true, + swconfig: access('/sbin/swconfig') == true, + odhcpd: access('/usr/sbin/odhcpd') == true, + zram: access('/sys/class/zram-control') == true, + sysntpd: readlink('/usr/sbin/ntpd') != null, + ipv6: access('/proc/net/ipv6_route') == true, + dropbear: access('/usr/sbin/dropbear') == true, + cabundle: access('/etc/ssl/certs/ca-certificates.crt') == true, + relayd: access('/usr/sbin/relayd') == true, + }; + + const wifi_features = [ 'eap', '11ac', '11ax', '11r', 'acs', 'sae', 'owe', 'suiteb192', 'wep', 'wps' ]; + + if (access('/usr/sbin/hostapd')) { + result.hostapd = { cli: access('/usr/sbin/hostapd_cli') == true }; + + for (let feature in wifi_features) + result.hostapd[feature] = system(`/usr/sbin/hostapd -v${feature} >/dev/null 2>/dev/null`) == 0; + } + + if (access('/usr/sbin/wpa_supplicant')) { + result.wpasupplicant = { cli: access('/usr/sbin/wpa_cli') == true }; + + for (let feature in wifi_features) + result.wpasupplicant[feature] = system(`/usr/sbin/wpa_supplicant -v${feature} >/dev/null 2>/dev/null`) == 0; + } + + let fd = popen('dnsmasq --version 2>/dev/null'); + + if (fd) { + const m = match(fd.read('all'), /^Compile time options: (.+)$/s); + + for (let opt in split(m?.[1], ' ')) { + let f = replace(opt, 'no-', '', 1); + + result.dnsmasq ??= {}; + result.dnsmasq[lc(f)] = (f == opt); + } + + fd.close(); + } + + fd = popen('ipset --help 2>/dev/null'); + + if (fd) { + for (let line = fd.read('line'), flag = false; length(line); line = fd.read('line')) { + if (line == 'Supported set types:\n') { + flag = true; + } + else if (flag) { + const m = match(line, /^ +([\w:,]+)\t+([0-9]+)\t/); + + if (m) { + result.ipset ??= {}; + result.ipset[m[1]] ??= +m[2]; + } + } + } + + fd.close(); + } + + return result; + } + }, + + getSwconfigFeatures: { + args: { switch: 'switch0' }, + call: function(request) { + // Parse some common switch properties from swconfig help output. + const swc = popen(`swconfig dev ${shellquote(request.args.switch)} help 2>/dev/null`); + + if (swc) { + let is_port_attr = false; + let is_vlan_attr = false; + let result = {}; + + for (let line = swc.read('line'); length(line); line = swc.read('line')) { + if (match(line, /^\s+--vlan/)) { + is_vlan_attr = true; + } + else if (match(line, /^\s+--port/)) { + is_vlan_attr = false; + is_port_attr = true; + } + else if (match(line, /cpu @/)) { + result.switch_title = match(line, /^switch[0-9]+: \w+\((.+)\)/)?.[1]; + result.num_vlans = match(line, /vlans: ([0-9]+)/)?.[1] ?? 16; + result.min_vid = 1; + } + else if (match(line, /: (pvid|tag|vid)/)) { + if (is_vlan_attr) + result.vid_option = match(line, /: (\w+)/)?.[1]; + } + else if (match(line, /: enable_vlan4k/)) { + result.vlan4k_option = 'enable_vlan4k'; + } + else if (match(line, /: enable_vlan/)) { + result.vlan_option = 'enable_vlan'; + } + else if (match(line, /: enable_learning/)) { + result.learning_option = 'enable_learning'; + } + else if (match(line, /: enable_mirror_rx/)) { + result.mirror_option = 'enable_mirror_rx'; + } + else if (match(line, /: max_length/)) { + result.jumbo_option = 'max_length'; + } + } + + swc.close(); + + if (!length(result)) + return { error: 'No such switch' }; + + return result; + } + else { + return { error: error() }; + } + } + }, + + getSwconfigPortState: { + args: { switch: 'switch0' }, + call: function(request) { + const swc = popen(`swconfig dev ${shellquote(request.args.switch)} show 2>/dev/null`); + + if (swc) { + let ports = [], port; + + for (let line = swc.read('line'); length(line); line = swc.read('line')) { + if (match(line, /^VLAN [0-9]+:/) && length(ports)) + break; + + let pnum = match(line, /^Port ([0-9]+):/)?.[1]; + + if (pnum) { + port = { + port: +pnum, + duplex: false, + speed: 0, + link: false, + auto: false, + rxflow: false, + txflow: false + }; + + push(ports, port); + } + + if (port) { + let m; + + if (match(line, /full[ -]duplex/)) + port.duplex = true; + + if ((m = match(line, / speed:([0-9]+)/)) != null) + port.speed = +m[1]; + + if ((m = match(line, /([0-9]+) Mbps/)) != null && !port.speed) + port.speed = +m[1]; + + if ((m = match(line, /link: ([0-9]+)/)) != null && !port.speed) + port.speed = +m[1]; + + if (match(line, /(link|status): ?up/)) + port.link = true; + + if (match(line, /auto-negotiate|link:.*auto/)) + port.auto = true; + + if (match(line, /link:.*rxflow/)) + port.rxflow = true; + + if (match(line, /link:.*txflow/)) + port.txflow = true; + } + } + + swc.close(); + + if (!length(ports)) + return { error: 'No such switch' }; + + return { result: ports }; + } + else { + return { error: error() }; + } + } + }, + + setPassword: { + args: { username: 'root', password: 'password' }, + call: function(request) { + const u = shellquote(request.args.username); + const p = shellquote(request.args.password); + + return { + result: system(`(echo ${p}; sleep 1; echo ${p}) | /bin/busybox passwd ${u} >/dev/null 2>&1`) == 0 + }; + } + }, + + getBlockDevices: { + call: function() { + const block = popen('/sbin/block info 2>/dev/null'); + + if (block) { + let result = {}; + + for (let line = block.read('line'); length(line); line = block.read('line')) { + let dev = match(line, /^\/dev\/([^:]+):/)?.[1]; + + if (dev) { + let e = result[dev] = { + dev: `/dev/${dev}`, + size: +readfile(`/sys/class/block/${dev}/size`) * 512 + }; + + for (let m in match(line, / (\w+)="([^"]+)"/g)) + e[lc(m[1])] = m[2]; + } + } + + block.close(); + + const swaps = open('/proc/swaps', 'r'); + + if (swaps) { + for (let line = swaps.read('line'); length(line); line = swaps.read('line')) { + let m = match(line, /^(\/\S+)\s+\S+\s+(\d+)/); + + if (m) { + let dev = replace(m[1], /\\(\d\d\d)/g, (_, n) => chr(int(n, 8))); + + result[`swap:${m[1]}`] = { + dev, + type: 'swap', + size: +m[2] * 1024 + }; + } + } + + swaps.close(); + } + + return result; + } + else { + return { error: 'Unable to execute block utility' }; + } + } + }, + + setBlockDetect: { + call: function() { + return { result: system('/sbin/block detect > /etc/config/fstab') == 0 }; + } + }, + + getMountPoints: { + call: function() { + const fd = open('/proc/mounts', 'r'); + + if (fd) { + let result = []; + + for (let line = fd.read('line'); length(line); line = fd.read('line')) { + const m = split(line, ' '); + const device = replace(m[0], /\\([0-9][0-9][0-9])/g, (m, n) => char(int(n, 8))); + const mount = replace(m[1], /\\([0-9][0-9][0-9])/g, (m, n) => char(int(n, 8))); + const stat = statvfs(mount); + + if (stat?.blocks > 0) { + push(result, { + device, mount, + size: stat.bsize * stat.blocks, + avail: stat.bsize * stat.bavail, + free: stat.bsize * stat.bfree + }); + } + } + + fd.close(); + + return { result }; + } + else { + return { error: error() }; + } + } + }, + getRealtimeStats: { + args: { mode: 'interface', device: 'eth0' }, + call: function(request) { + let flags; + + if (request.args.mode == 'interface') + flags = `-i ${shellquote(request.args.device)}`; + else if (request.args.mode == 'wireless') + flags = `-r ${shellquote(request.args.device)}`; + else if (request.args.mode == 'conntrack') + flags = '-c'; + else if (request.args.mode == 'load') + flags = '-l'; + else + return { error: 'Invalid mode' }; + + const fd = popen(`luci-bwc ${flags}`, 'r'); + + if (fd) { + let result; + + try { + result = { result: json(`[${fd.read('all')}]`) }; + } + catch (err) { + result = { error: err }; + } + + return result; + } + else { + return { error: error() }; + } + } + }, + + getConntrackList: { + call: function() { + return { result: conntrack_list() }; + } + }, + + getProcessList: { + call: function() { + return { result: process_list() }; + } + }, + + getBuiltinEthernetPorts: { + call: function() { + let fd = open('/etc/board.json', 'r'); + let board = fd ? json(fd) : {}; + let ports = []; + + for (let k in [ 'lan', 'wan' ]) { + if (!board?.network?.[k]) + continue; + + if (type(board.network[k].ports) == 'array') { + for (let ifname in board.network[k].ports) { + push(ports, { role: k, device: ifname }); + } + } + else if (type(board.network[k].device) == 'string') { + push(ports, { role: k, device: board.network[k].device }); + } + } + + /* Workaround for targets that do not enumerate all netdevs in board.json */ + if (uname().machine in [ 'x86_64' ] && + match(ports[0]?.device, /^eth\d+$/)) { + let bus = readlink(`/sys/class/net/${ports[0].device}/device/subsystem`); + + for (let netdev in lsdir('/sys/class/net')) { + if (!match(netdev, /^eth\d+$/)) + continue; + + if (length(filter(ports, port => port.device == netdev))) + continue; + + if (readlink(`/sys/class/net/${netdev}/device/subsystem`) != bus) + continue; + + push(ports, { role: 'unknown', device: netdev }); + } + } + + return { result: ports }; + } + } +}; + +return { luci: methods }; diff --git a/package/luci/modules/luci-base/root/www/index.html b/package/luci/modules/luci-base/root/www/index.html index bc3c98fe71..d5f7d7209f 100644 --- a/package/luci/modules/luci-base/root/www/index.html +++ b/package/luci/modules/luci-base/root/www/index.html @@ -3,6 +3,8 @@ + + + +
    +

    {{ title }}

    +
    {{ message }}
    + + {% if (exception): %} +
    +
    {{ exception.message }}
    +
    {{ exception.stacktrace[0].context }}
    +
    + {% endif %} +
    diff --git a/package/luci/modules/luci-base/ucode/template/footer.ut b/package/luci/modules/luci-base/ucode/template/footer.ut new file mode 100644 index 0000000000..d0978594f8 --- /dev/null +++ b/package/luci/modules/luci-base/ucode/template/footer.ut @@ -0,0 +1,42 @@ +{# + Copyright 2022 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% const rollback = dispatcher.rollback_pending() %} +{% if (rollback || trigger_apply || trigger_revert): %} + +{% endif %} + +{% if (media_error): %} + +{% endif %} + +{% include(`themes/${theme}/footer`) %} + + diff --git a/package/luci/modules/luci-base/ucode/template/header.ut b/package/luci/modules/luci-base/ucode/template/header.ut new file mode 100644 index 0000000000..7dc3742a9d --- /dev/null +++ b/package/luci/modules/luci-base/ucode/template/header.ut @@ -0,0 +1,32 @@ +{# + Copyright 2022 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% + include(`themes/${theme}/header`); +-%} + + + + diff --git a/package/luci/modules/luci-base/ucode/template/sysauth.ut b/package/luci/modules/luci-base/ucode/template/sysauth.ut new file mode 100644 index 0000000000..3c580949bb --- /dev/null +++ b/package/luci/modules/luci-base/ucode/template/sysauth.ut @@ -0,0 +1,74 @@ +{# + Copyright 2008 Steven Barth + Copyright 2008-2012 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% include('header') %} + +
    + {% if (fuser): %} +
    +

    {{ _('Invalid username and/or password! Please try again.') }}

    +
    + {% endif %} + +
    +

    {{ _('Authorization Required') }}

    +
    + {{ _('Please enter your username and password.') }} +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + + +
    +
    + +{% + let https_ports = uci.get('uhttpd', 'main', 'listen_https') ?? []; + + https_ports = uniq(filter( + map( + (type(https_ports) == 'string') ? split(https_port, /\s+/) : https_ports, + e => +match(e, /\d+$/)?.[0] + ), + p => (p >= 0 && p <= 65535) + )); +%} + + + +{% include('footer') %} diff --git a/package/luci/modules/luci-base/ucode/template/view.ut b/package/luci/modules/luci-base/ucode/template/view.ut new file mode 100644 index 0000000000..11ac824290 --- /dev/null +++ b/package/luci/modules/luci-base/ucode/template/view.ut @@ -0,0 +1,12 @@ +{% include('header') %} + +
    +
    {{ _('Loading view…') }}
    + +
    + +{% include('footer') %} diff --git a/package/luci/modules/luci-base/ucode/uhttpd.uc b/package/luci/modules/luci-base/ucode/uhttpd.uc new file mode 100644 index 0000000000..df1ecc7865 --- /dev/null +++ b/package/luci/modules/luci-base/ucode/uhttpd.uc @@ -0,0 +1,12 @@ +{% + +import dispatch from 'luci.dispatcher'; +import request from 'luci.http'; + +global.handle_request = function(env) { + let req = request(env, uhttpd.recv, uhttpd.send); + + dispatch(req); + + req.close(); +}; diff --git a/package/luci/modules/luci-base/ucode/zoneinfo.uc b/package/luci/modules/luci-base/ucode/zoneinfo.uc new file mode 100644 index 0000000000..cbf2f7dce9 --- /dev/null +++ b/package/luci/modules/luci-base/ucode/zoneinfo.uc @@ -0,0 +1,449 @@ +// Autogenerated by zoneinfo2ucode.pl + +export default { + 'Africa/Abidjan': 'GMT0', + 'Africa/Accra': 'GMT0', + 'Africa/Addis Ababa': 'EAT-3', + 'Africa/Algiers': 'CET-1', + 'Africa/Asmara': 'EAT-3', + 'Africa/Bamako': 'GMT0', + 'Africa/Bangui': 'WAT-1', + 'Africa/Banjul': 'GMT0', + 'Africa/Bissau': 'GMT0', + 'Africa/Blantyre': 'CAT-2', + 'Africa/Brazzaville': 'WAT-1', + 'Africa/Bujumbura': 'CAT-2', + 'Africa/Cairo': 'EET-2EEST,M4.5.5/0,M10.5.4/24', + 'Africa/Casablanca': '<+01>-1', + 'Africa/Ceuta': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Africa/Conakry': 'GMT0', + 'Africa/Dakar': 'GMT0', + 'Africa/Dar es Salaam': 'EAT-3', + 'Africa/Djibouti': 'EAT-3', + 'Africa/Douala': 'WAT-1', + 'Africa/El Aaiun': '<+01>-1', + 'Africa/Freetown': 'GMT0', + 'Africa/Gaborone': 'CAT-2', + 'Africa/Harare': 'CAT-2', + 'Africa/Johannesburg': 'SAST-2', + 'Africa/Juba': 'CAT-2', + 'Africa/Kampala': 'EAT-3', + 'Africa/Khartoum': 'CAT-2', + 'Africa/Kigali': 'CAT-2', + 'Africa/Kinshasa': 'WAT-1', + 'Africa/Lagos': 'WAT-1', + 'Africa/Libreville': 'WAT-1', + 'Africa/Lome': 'GMT0', + 'Africa/Luanda': 'WAT-1', + 'Africa/Lubumbashi': 'CAT-2', + 'Africa/Lusaka': 'CAT-2', + 'Africa/Malabo': 'WAT-1', + 'Africa/Maputo': 'CAT-2', + 'Africa/Maseru': 'SAST-2', + 'Africa/Mbabane': 'SAST-2', + 'Africa/Mogadishu': 'EAT-3', + 'Africa/Monrovia': 'GMT0', + 'Africa/Nairobi': 'EAT-3', + 'Africa/Ndjamena': 'WAT-1', + 'Africa/Niamey': 'WAT-1', + 'Africa/Nouakchott': 'GMT0', + 'Africa/Ouagadougou': 'GMT0', + 'Africa/Porto-Novo': 'WAT-1', + 'Africa/Sao Tome': 'GMT0', + 'Africa/Tripoli': 'EET-2', + 'Africa/Tunis': 'CET-1', + 'Africa/Windhoek': 'CAT-2', + 'America/Adak': 'HST10HDT,M3.2.0,M11.1.0', + 'America/Anchorage': 'AKST9AKDT,M3.2.0,M11.1.0', + 'America/Anguilla': 'AST4', + 'America/Antigua': 'AST4', + 'America/Araguaina': '<-03>3', + 'America/Argentina/Buenos Aires': '<-03>3', + 'America/Argentina/Catamarca': '<-03>3', + 'America/Argentina/Cordoba': '<-03>3', + 'America/Argentina/Jujuy': '<-03>3', + 'America/Argentina/La Rioja': '<-03>3', + 'America/Argentina/Mendoza': '<-03>3', + 'America/Argentina/Rio Gallegos': '<-03>3', + 'America/Argentina/Salta': '<-03>3', + 'America/Argentina/San Juan': '<-03>3', + 'America/Argentina/San Luis': '<-03>3', + 'America/Argentina/Tucuman': '<-03>3', + 'America/Argentina/Ushuaia': '<-03>3', + 'America/Aruba': 'AST4', + 'America/Asuncion': '<-04>4<-03>,M10.1.0/0,M3.4.0/0', + 'America/Atikokan': 'EST5', + 'America/Bahia': '<-03>3', + 'America/Bahia Banderas': 'CST6', + 'America/Barbados': 'AST4', + 'America/Belem': '<-03>3', + 'America/Belize': 'CST6', + 'America/Blanc-Sablon': 'AST4', + 'America/Boa Vista': '<-04>4', + 'America/Bogota': '<-05>5', + 'America/Boise': 'MST7MDT,M3.2.0,M11.1.0', + 'America/Cambridge Bay': 'MST7MDT,M3.2.0,M11.1.0', + 'America/Campo Grande': '<-04>4', + 'America/Cancun': 'EST5', + 'America/Caracas': '<-04>4', + 'America/Cayenne': '<-03>3', + 'America/Cayman': 'EST5', + 'America/Chicago': 'CST6CDT,M3.2.0,M11.1.0', + 'America/Chihuahua': 'CST6', + 'America/Ciudad Juarez': 'MST7MDT,M3.2.0,M11.1.0', + 'America/Costa Rica': 'CST6', + 'America/Creston': 'MST7', + 'America/Cuiaba': '<-04>4', + 'America/Curacao': 'AST4', + 'America/Danmarkshavn': 'GMT0', + 'America/Dawson': 'MST7', + 'America/Dawson Creek': 'MST7', + 'America/Denver': 'MST7MDT,M3.2.0,M11.1.0', + 'America/Detroit': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Dominica': 'AST4', + 'America/Edmonton': 'MST7MDT,M3.2.0,M11.1.0', + 'America/Eirunepe': '<-05>5', + 'America/El Salvador': 'CST6', + 'America/Fort Nelson': 'MST7', + 'America/Fortaleza': '<-03>3', + 'America/Glace Bay': 'AST4ADT,M3.2.0,M11.1.0', + 'America/Goose Bay': 'AST4ADT,M3.2.0,M11.1.0', + 'America/Grand Turk': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Grenada': 'AST4', + 'America/Guadeloupe': 'AST4', + 'America/Guatemala': 'CST6', + 'America/Guayaquil': '<-05>5', + 'America/Guyana': '<-04>4', + 'America/Halifax': 'AST4ADT,M3.2.0,M11.1.0', + 'America/Havana': 'CST5CDT,M3.2.0/0,M11.1.0/1', + 'America/Hermosillo': 'MST7', + 'America/Indiana/Indianapolis': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Indiana/Knox': 'CST6CDT,M3.2.0,M11.1.0', + 'America/Indiana/Marengo': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Indiana/Petersburg': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Indiana/Tell City': 'CST6CDT,M3.2.0,M11.1.0', + 'America/Indiana/Vevay': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Indiana/Vincennes': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Indiana/Winamac': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Inuvik': 'MST7MDT,M3.2.0,M11.1.0', + 'America/Iqaluit': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Jamaica': 'EST5', + 'America/Juneau': 'AKST9AKDT,M3.2.0,M11.1.0', + 'America/Kentucky/Louisville': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Kentucky/Monticello': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Kralendijk': 'AST4', + 'America/La Paz': '<-04>4', + 'America/Lima': '<-05>5', + 'America/Los Angeles': 'PST8PDT,M3.2.0,M11.1.0', + 'America/Lower Princes': 'AST4', + 'America/Maceio': '<-03>3', + 'America/Managua': 'CST6', + 'America/Manaus': '<-04>4', + 'America/Marigot': 'AST4', + 'America/Martinique': 'AST4', + 'America/Matamoros': 'CST6CDT,M3.2.0,M11.1.0', + 'America/Mazatlan': 'MST7', + 'America/Menominee': 'CST6CDT,M3.2.0,M11.1.0', + 'America/Merida': 'CST6', + 'America/Metlakatla': 'AKST9AKDT,M3.2.0,M11.1.0', + 'America/Mexico City': 'CST6', + 'America/Miquelon': '<-03>3<-02>,M3.2.0,M11.1.0', + 'America/Moncton': 'AST4ADT,M3.2.0,M11.1.0', + 'America/Monterrey': 'CST6', + 'America/Montevideo': '<-03>3', + 'America/Montserrat': 'AST4', + 'America/Nassau': 'EST5EDT,M3.2.0,M11.1.0', + 'America/New York': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Nome': 'AKST9AKDT,M3.2.0,M11.1.0', + 'America/Noronha': '<-02>2', + 'America/North Dakota/Beulah': 'CST6CDT,M3.2.0,M11.1.0', + 'America/North Dakota/Center': 'CST6CDT,M3.2.0,M11.1.0', + 'America/North Dakota/New Salem': 'CST6CDT,M3.2.0,M11.1.0', + 'America/Nuuk': '<-02>2<-01>,M3.5.0/-1,M10.5.0/0', + 'America/Ojinaga': 'CST6CDT,M3.2.0,M11.1.0', + 'America/Panama': 'EST5', + 'America/Paramaribo': '<-03>3', + 'America/Phoenix': 'MST7', + 'America/Port of Spain': 'AST4', + 'America/Port-au-Prince': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Porto Velho': '<-04>4', + 'America/Puerto Rico': 'AST4', + 'America/Punta Arenas': '<-03>3', + 'America/Rankin Inlet': 'CST6CDT,M3.2.0,M11.1.0', + 'America/Recife': '<-03>3', + 'America/Regina': 'CST6', + 'America/Resolute': 'CST6CDT,M3.2.0,M11.1.0', + 'America/Rio Branco': '<-05>5', + 'America/Santarem': '<-03>3', + 'America/Santiago': '<-04>4<-03>,M9.1.6/24,M4.1.6/24', + 'America/Santo Domingo': 'AST4', + 'America/Sao Paulo': '<-03>3', + 'America/Scoresbysund': '<-01>1<+00>,M3.5.0/0,M10.5.0/1', + 'America/Sitka': 'AKST9AKDT,M3.2.0,M11.1.0', + 'America/St Barthelemy': 'AST4', + 'America/St Johns': 'NST3:30NDT,M3.2.0,M11.1.0', + 'America/St Kitts': 'AST4', + 'America/St Lucia': 'AST4', + 'America/St Thomas': 'AST4', + 'America/St Vincent': 'AST4', + 'America/Swift Current': 'CST6', + 'America/Tegucigalpa': 'CST6', + 'America/Thule': 'AST4ADT,M3.2.0,M11.1.0', + 'America/Tijuana': 'PST8PDT,M3.2.0,M11.1.0', + 'America/Toronto': 'EST5EDT,M3.2.0,M11.1.0', + 'America/Tortola': 'AST4', + 'America/Vancouver': 'PST8PDT,M3.2.0,M11.1.0', + 'America/Whitehorse': 'MST7', + 'America/Winnipeg': 'CST6CDT,M3.2.0,M11.1.0', + 'America/Yakutat': 'AKST9AKDT,M3.2.0,M11.1.0', + 'Antarctica/Casey': '<+11>-11', + 'Antarctica/Davis': '<+07>-7', + 'Antarctica/DumontDUrville': '<+10>-10', + 'Antarctica/Macquarie': 'AEST-10AEDT,M10.1.0,M4.1.0/3', + 'Antarctica/Mawson': '<+05>-5', + 'Antarctica/McMurdo': 'NZST-12NZDT,M9.5.0,M4.1.0/3', + 'Antarctica/Palmer': '<-03>3', + 'Antarctica/Rothera': '<-03>3', + 'Antarctica/Syowa': '<+03>-3', + 'Antarctica/Troll': '<+00>0<+02>-2,M3.5.0/1,M10.5.0/3', + 'Antarctica/Vostok': '<+06>-6', + 'Arctic/Longyearbyen': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Asia/Aden': '<+03>-3', + 'Asia/Almaty': '<+06>-6', + 'Asia/Amman': '<+03>-3', + 'Asia/Anadyr': '<+12>-12', + 'Asia/Aqtau': '<+05>-5', + 'Asia/Aqtobe': '<+05>-5', + 'Asia/Ashgabat': '<+05>-5', + 'Asia/Atyrau': '<+05>-5', + 'Asia/Baghdad': '<+03>-3', + 'Asia/Bahrain': '<+03>-3', + 'Asia/Baku': '<+04>-4', + 'Asia/Bangkok': '<+07>-7', + 'Asia/Barnaul': '<+07>-7', + 'Asia/Beirut': 'EET-2EEST,M3.5.0/0,M10.5.0/0', + 'Asia/Bishkek': '<+06>-6', + 'Asia/Brunei': '<+08>-8', + 'Asia/Chita': '<+09>-9', + 'Asia/Choibalsan': '<+08>-8', + 'Asia/Colombo': '<+0530>-5:30', + 'Asia/Damascus': '<+03>-3', + 'Asia/Dhaka': '<+06>-6', + 'Asia/Dili': '<+09>-9', + 'Asia/Dubai': '<+04>-4', + 'Asia/Dushanbe': '<+05>-5', + 'Asia/Famagusta': 'EET-2EEST,M3.5.0/3,M10.5.0/4', + 'Asia/Gaza': 'EET-2EEST,M3.4.4/50,M10.4.4/50', + 'Asia/Hebron': 'EET-2EEST,M3.4.4/50,M10.4.4/50', + 'Asia/Ho Chi Minh': '<+07>-7', + 'Asia/Hong Kong': 'HKT-8', + 'Asia/Hovd': '<+07>-7', + 'Asia/Irkutsk': '<+08>-8', + 'Asia/Jakarta': 'WIB-7', + 'Asia/Jayapura': 'WIT-9', + 'Asia/Jerusalem': 'IST-2IDT,M3.4.4/26,M10.5.0', + 'Asia/Kabul': '<+0430>-4:30', + 'Asia/Kamchatka': '<+12>-12', + 'Asia/Karachi': 'PKT-5', + 'Asia/Kathmandu': '<+0545>-5:45', + 'Asia/Khandyga': '<+09>-9', + 'Asia/Kolkata': 'IST-5:30', + 'Asia/Krasnoyarsk': '<+07>-7', + 'Asia/Kuala Lumpur': '<+08>-8', + 'Asia/Kuching': '<+08>-8', + 'Asia/Kuwait': '<+03>-3', + 'Asia/Macau': 'CST-8', + 'Asia/Magadan': '<+11>-11', + 'Asia/Makassar': 'WITA-8', + 'Asia/Manila': 'PST-8', + 'Asia/Muscat': '<+04>-4', + 'Asia/Nicosia': 'EET-2EEST,M3.5.0/3,M10.5.0/4', + 'Asia/Novokuznetsk': '<+07>-7', + 'Asia/Novosibirsk': '<+07>-7', + 'Asia/Omsk': '<+06>-6', + 'Asia/Oral': '<+05>-5', + 'Asia/Phnom Penh': '<+07>-7', + 'Asia/Pontianak': 'WIB-7', + 'Asia/Pyongyang': 'KST-9', + 'Asia/Qatar': '<+03>-3', + 'Asia/Qostanay': '<+06>-6', + 'Asia/Qyzylorda': '<+05>-5', + 'Asia/Riyadh': '<+03>-3', + 'Asia/Sakhalin': '<+11>-11', + 'Asia/Samarkand': '<+05>-5', + 'Asia/Seoul': 'KST-9', + 'Asia/Shanghai': 'CST-8', + 'Asia/Singapore': '<+08>-8', + 'Asia/Srednekolymsk': '<+11>-11', + 'Asia/Taipei': 'CST-8', + 'Asia/Tashkent': '<+05>-5', + 'Asia/Tbilisi': '<+04>-4', + 'Asia/Tehran': '<+0330>-3:30', + 'Asia/Thimphu': '<+06>-6', + 'Asia/Tokyo': 'JST-9', + 'Asia/Tomsk': '<+07>-7', + 'Asia/Ulaanbaatar': '<+08>-8', + 'Asia/Urumqi': '<+06>-6', + 'Asia/Ust-Nera': '<+10>-10', + 'Asia/Vientiane': '<+07>-7', + 'Asia/Vladivostok': '<+10>-10', + 'Asia/Yakutsk': '<+09>-9', + 'Asia/Yangon': '<+0630>-6:30', + 'Asia/Yekaterinburg': '<+05>-5', + 'Asia/Yerevan': '<+04>-4', + 'Atlantic/Azores': '<-01>1<+00>,M3.5.0/0,M10.5.0/1', + 'Atlantic/Bermuda': 'AST4ADT,M3.2.0,M11.1.0', + 'Atlantic/Canary': 'WET0WEST,M3.5.0/1,M10.5.0', + 'Atlantic/Cape Verde': '<-01>1', + 'Atlantic/Faroe': 'WET0WEST,M3.5.0/1,M10.5.0', + 'Atlantic/Madeira': 'WET0WEST,M3.5.0/1,M10.5.0', + 'Atlantic/Reykjavik': 'GMT0', + 'Atlantic/South Georgia': '<-02>2', + 'Atlantic/St Helena': 'GMT0', + 'Atlantic/Stanley': '<-03>3', + 'Australia/Adelaide': 'ACST-9:30ACDT,M10.1.0,M4.1.0/3', + 'Australia/Brisbane': 'AEST-10', + 'Australia/Broken Hill': 'ACST-9:30ACDT,M10.1.0,M4.1.0/3', + 'Australia/Darwin': 'ACST-9:30', + 'Australia/Eucla': '<+0845>-8:45', + 'Australia/Hobart': 'AEST-10AEDT,M10.1.0,M4.1.0/3', + 'Australia/Lindeman': 'AEST-10', + 'Australia/Lord Howe': '<+1030>-10:30<+11>-11,M10.1.0,M4.1.0', + 'Australia/Melbourne': 'AEST-10AEDT,M10.1.0,M4.1.0/3', + 'Australia/Perth': 'AWST-8', + 'Australia/Sydney': 'AEST-10AEDT,M10.1.0,M4.1.0/3', + 'Etc/GMT': 'GMT0', + 'Etc/GMT+1': '<-01>1', + 'Etc/GMT+10': '<-10>10', + 'Etc/GMT+11': '<-11>11', + 'Etc/GMT+12': '<-12>12', + 'Etc/GMT+2': '<-02>2', + 'Etc/GMT+3': '<-03>3', + 'Etc/GMT+4': '<-04>4', + 'Etc/GMT+5': '<-05>5', + 'Etc/GMT+6': '<-06>6', + 'Etc/GMT+7': '<-07>7', + 'Etc/GMT+8': '<-08>8', + 'Etc/GMT+9': '<-09>9', + 'Etc/GMT-1': '<+01>-1', + 'Etc/GMT-10': '<+10>-10', + 'Etc/GMT-11': '<+11>-11', + 'Etc/GMT-12': '<+12>-12', + 'Etc/GMT-13': '<+13>-13', + 'Etc/GMT-14': '<+14>-14', + 'Etc/GMT-2': '<+02>-2', + 'Etc/GMT-3': '<+03>-3', + 'Etc/GMT-4': '<+04>-4', + 'Etc/GMT-5': '<+05>-5', + 'Etc/GMT-6': '<+06>-6', + 'Etc/GMT-7': '<+07>-7', + 'Etc/GMT-8': '<+08>-8', + 'Etc/GMT-9': '<+09>-9', + 'Europe/Amsterdam': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Andorra': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Astrakhan': '<+04>-4', + 'Europe/Athens': 'EET-2EEST,M3.5.0/3,M10.5.0/4', + 'Europe/Belgrade': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Berlin': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Bratislava': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Brussels': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Bucharest': 'EET-2EEST,M3.5.0/3,M10.5.0/4', + 'Europe/Budapest': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Busingen': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Chisinau': 'EET-2EEST,M3.5.0,M10.5.0/3', + 'Europe/Copenhagen': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Dublin': 'IST-1GMT0,M10.5.0,M3.5.0/1', + 'Europe/Gibraltar': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Guernsey': 'GMT0BST,M3.5.0/1,M10.5.0', + 'Europe/Helsinki': 'EET-2EEST,M3.5.0/3,M10.5.0/4', + 'Europe/Isle of Man': 'GMT0BST,M3.5.0/1,M10.5.0', + 'Europe/Istanbul': '<+03>-3', + 'Europe/Jersey': 'GMT0BST,M3.5.0/1,M10.5.0', + 'Europe/Kaliningrad': 'EET-2', + 'Europe/Kirov': 'MSK-3', + 'Europe/Kyiv': 'EET-2EEST,M3.5.0/3,M10.5.0/4', + 'Europe/Lisbon': 'WET0WEST,M3.5.0/1,M10.5.0', + 'Europe/Ljubljana': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/London': 'GMT0BST,M3.5.0/1,M10.5.0', + 'Europe/Luxembourg': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Madrid': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Malta': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Mariehamn': 'EET-2EEST,M3.5.0/3,M10.5.0/4', + 'Europe/Minsk': '<+03>-3', + 'Europe/Monaco': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Moscow': 'MSK-3', + 'Europe/Oslo': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Paris': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Podgorica': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Prague': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Riga': 'EET-2EEST,M3.5.0/3,M10.5.0/4', + 'Europe/Rome': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Samara': '<+04>-4', + 'Europe/San Marino': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Sarajevo': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Saratov': '<+04>-4', + 'Europe/Simferopol': 'MSK-3', + 'Europe/Skopje': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Sofia': 'EET-2EEST,M3.5.0/3,M10.5.0/4', + 'Europe/Stockholm': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Tallinn': 'EET-2EEST,M3.5.0/3,M10.5.0/4', + 'Europe/Tirane': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Ulyanovsk': '<+04>-4', + 'Europe/Vaduz': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Vatican': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Vienna': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Vilnius': 'EET-2EEST,M3.5.0/3,M10.5.0/4', + 'Europe/Volgograd': 'MSK-3', + 'Europe/Warsaw': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Zagreb': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Europe/Zurich': 'CET-1CEST,M3.5.0,M10.5.0/3', + 'Indian/Antananarivo': 'EAT-3', + 'Indian/Chagos': '<+06>-6', + 'Indian/Christmas': '<+07>-7', + 'Indian/Cocos': '<+0630>-6:30', + 'Indian/Comoro': 'EAT-3', + 'Indian/Kerguelen': '<+05>-5', + 'Indian/Mahe': '<+04>-4', + 'Indian/Maldives': '<+05>-5', + 'Indian/Mauritius': '<+04>-4', + 'Indian/Mayotte': 'EAT-3', + 'Indian/Reunion': '<+04>-4', + 'Pacific/Apia': '<+13>-13', + 'Pacific/Auckland': 'NZST-12NZDT,M9.5.0,M4.1.0/3', + 'Pacific/Bougainville': '<+11>-11', + 'Pacific/Chatham': '<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45', + 'Pacific/Chuuk': '<+10>-10', + 'Pacific/Easter': '<-06>6<-05>,M9.1.6/22,M4.1.6/22', + 'Pacific/Efate': '<+11>-11', + 'Pacific/Fakaofo': '<+13>-13', + 'Pacific/Fiji': '<+12>-12', + 'Pacific/Funafuti': '<+12>-12', + 'Pacific/Galapagos': '<-06>6', + 'Pacific/Gambier': '<-09>9', + 'Pacific/Guadalcanal': '<+11>-11', + 'Pacific/Guam': 'ChST-10', + 'Pacific/Honolulu': 'HST10', + 'Pacific/Kanton': '<+13>-13', + 'Pacific/Kiritimati': '<+14>-14', + 'Pacific/Kosrae': '<+11>-11', + 'Pacific/Kwajalein': '<+12>-12', + 'Pacific/Majuro': '<+12>-12', + 'Pacific/Marquesas': '<-0930>9:30', + 'Pacific/Midway': 'SST11', + 'Pacific/Nauru': '<+12>-12', + 'Pacific/Niue': '<-11>11', + 'Pacific/Norfolk': '<+11>-11<+12>,M10.1.0,M4.1.0/3', + 'Pacific/Noumea': '<+11>-11', + 'Pacific/Pago Pago': 'SST11', + 'Pacific/Palau': '<+09>-9', + 'Pacific/Pitcairn': '<-08>8', + 'Pacific/Pohnpei': '<+11>-11', + 'Pacific/Port Moresby': '<+10>-10', + 'Pacific/Rarotonga': '<-10>10', + 'Pacific/Saipan': 'ChST-10', + 'Pacific/Tahiti': '<-10>10', + 'Pacific/Tarawa': '<+12>-12', + 'Pacific/Tongatapu': '<+13>-13', + 'Pacific/Wake': '<+12>-12', + 'Pacific/Wallis': '<+12>-12', +}; diff --git a/package/luci/modules/luci-compat/Makefile b/package/luci/modules/luci-compat/Makefile index d73ca070a1..bea7e23569 100644 --- a/package/luci/modules/luci-compat/Makefile +++ b/package/luci/modules/luci-compat/Makefile @@ -12,8 +12,8 @@ LUCI_TYPE:=mod LUCI_BASENAME:=compat LUCI_TITLE:=LuCI compatibility libraries -LUCI_DEPENDS:=+luci-base +LUCI_DEPENDS:=+luci-lua-runtime include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/modules/luci-compat/luasrc/view/cbi/footer.htm b/package/luci/modules/luci-compat/luasrc/view/cbi/footer.htm index abcc47b920..c72102340f 100644 --- a/package/luci/modules/luci-compat/luasrc/view/cbi/footer.htm +++ b/package/luci/modules/luci-compat/luasrc/view/cbi/footer.htm @@ -8,7 +8,7 @@ if pageaction and (display_back or display_skip or display_apply or display_save or display_reset) then - %>
    <% + %>
    <% if display_back then %> <% diff --git a/package/luci/modules/luci-lua-runtime/Makefile b/package/luci/modules/luci-lua-runtime/Makefile new file mode 100644 index 0000000000..6bd5c7f248 --- /dev/null +++ b/package/luci/modules/luci-lua-runtime/Makefile @@ -0,0 +1,28 @@ +# +# Copyright (C) 2022 Jo-Philipp Wich +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-lua-runtime + +LUCI_TYPE:=mod +LUCI_BASENAME:=lua-runtime + +LUCI_TITLE:=LuCI Lua runtime libraries +LUCI_DEPENDS:= \ + +luci-base \ + +lua \ + +luci-lib-base \ + +luci-lib-nixio \ + +luci-lib-ip \ + +luci-lib-jsonc \ + +libubus-lua \ + +liblucihttp-lua \ + +ucode-mod-lua + +include ../../luci.mk + +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/modules/luci-base/luasrc/cacheloader.lua b/package/luci/modules/luci-lua-runtime/luasrc/cacheloader.lua similarity index 100% rename from package/luci/modules/luci-base/luasrc/cacheloader.lua rename to package/luci/modules/luci-lua-runtime/luasrc/cacheloader.lua diff --git a/package/luci/modules/luci-base/luasrc/ccache.lua b/package/luci/modules/luci-lua-runtime/luasrc/ccache.lua similarity index 100% rename from package/luci/modules/luci-base/luasrc/ccache.lua rename to package/luci/modules/luci-lua-runtime/luasrc/ccache.lua diff --git a/package/luci/modules/luci-base/luasrc/config.lua b/package/luci/modules/luci-lua-runtime/luasrc/config.lua similarity index 100% rename from package/luci/modules/luci-base/luasrc/config.lua rename to package/luci/modules/luci-lua-runtime/luasrc/config.lua diff --git a/package/luci/modules/luci-lua-runtime/luasrc/dispatcher.lua b/package/luci/modules/luci-lua-runtime/luasrc/dispatcher.lua new file mode 100644 index 0000000000..bbe7600c44 --- /dev/null +++ b/package/luci/modules/luci-lua-runtime/luasrc/dispatcher.lua @@ -0,0 +1,484 @@ +-- Copyright 2008 Steven Barth +-- Copyright 2008-2015 Jo-Philipp Wich +-- Licensed to the public under the Apache License 2.0. + +module("luci.dispatcher", package.seeall) + +local http = _G.L.http + +context = setmetatable({}, { + __index = function(t, k) + if k == "request" or k == "requestpath" then + return _G.L.ctx.request_path + elseif k == "requestargs" then + return _G.L.ctx.request_args + else + return _G.L.ctx[k] + end + end +}) + +uci = require "luci.model.uci" +uci:set_session_id(_G.L.ctx.authsession) + +i18n = require "luci.i18n" +i18n.setlanguage(_G.L.dispatcher.lang) + +build_url = _G.L.dispatcher.build_url +menu_json = _G.L.dispatcher.menu_json +error404 = _G.L.dispatcher.error404 +error500 = _G.L.dispatcher.error500 + +function is_authenticated(auth) + local session = _G.L.dispatcher.is_authenticated(auth) + if session then + return session.sid, session.data, session.acls + end +end + +function assign(path, clone, title, order) + local obj = node(unpack(path)) + + obj.title = title + obj.order = order + + setmetatable(obj, {__index = node(unpack(clone))}) + + return obj +end + +function entry(path, target, title, order) + local c = node(unpack(path)) + + c.title = title + c.order = order + c.action = target + + return c +end + +-- enabling the node. +function get(...) + return node(...) +end + +function node(...) + local p = table.concat({ ... }, "/") + + if not __entries[p] then + __entries[p] = {} + end + + return __entries[p] +end + +function lookup(...) + local i, path = nil, {} + for i = 1, select('#', ...) do + local name, arg = nil, tostring(select(i, ...)) + for name in arg:gmatch("[^/]+") do + path[#path+1] = name + end + end + + local node = menu_json() + for i = 1, #path do + node = node.children[path[i]] + + if not node then + return nil + elseif node.leaf then + break + end + end + + return node, build_url(unpack(path)) +end + + +function process_lua_controller(path) + local base = "/usr/lib/lua/luci/controller/" + local modname = "luci.controller." .. path:sub(#base+1, #path-4):gsub("/", ".") + local mod = require(modname) + assert(mod ~= true, + "Invalid controller file found\n" .. + "The file '" .. path .. "' contains an invalid module line.\n" .. + "Please verify whether the module name is set to '" .. modname .. + "' - It must correspond to the file path!") + + local idx = mod.index + if type(idx) ~= "function" then + return nil + end + + local entries = {} + + __entries = entries + __controller = modname + + setfenv(idx, setmetatable({}, { __index = luci.dispatcher }))() + + __entries = nil + __controller = nil + + -- fixup gathered node specs + for path, entry in pairs(entries) do + if entry.leaf then + entry.wildcard = true + end + + if type(entry.file_depends) == "table" then + for _, v in ipairs(entry.file_depends) do + entry.depends = entry.depends or {} + entry.depends.fs = entry.depends.fs or {} + + local ft = fs.stat(v, "type") + if ft == "dir" then + entry.depends.fs[v] = "directory" + elseif v:match("/s?bin/") then + entry.depends.fs[v] = "executable" + else + entry.depends.fs[v] = "file" + end + end + end + + if type(entry.uci_depends) == "table" then + for k, v in pairs(entry.uci_depends) do + entry.depends = entry.depends or {} + entry.depends.uci = entry.depends.uci or {} + entry.depends.uci[k] = v + end + end + + if type(entry.acl_depends) == "table" then + for _, acl in ipairs(entry.acl_depends) do + entry.depends = entry.depends or {} + entry.depends.acl = entry.depends.acl or {} + entry.depends.acl[#entry.depends.acl + 1] = acl + end + end + + if (entry.sysauth_authenticator ~= nil) or + (entry.sysauth ~= nil and entry.sysauth ~= false) + then + if entry.sysauth_authenticator == "htmlauth" then + entry.auth = { + login = true, + methods = { "cookie:sysauth_https", "cookie:sysauth_http" } + } + elseif path == "rpc" and modname == "luci.controller.rpc" then + entry.auth = { + login = false, + methods = { "query:auth", "cookie:sysauth_https", "cookie:sysauth_http", "cookie:sysauth" } + } + elseif modname == "luci.controller.admin.uci" then + entry.auth = { + login = false, + methods = { "param:sid" } + } + end + elseif entry.sysauth == false then + entry.auth = {} + end + + if entry.action == nil and type(entry.target) == "table" then + entry.action = entry.target + entry.target = nil + end + + entry.leaf = nil + + entry.file_depends = nil + entry.uci_depends = nil + entry.acl_depends = nil + + entry.sysauth = nil + entry.sysauth_authenticator = nil + end + + return entries +end + +function invoke_cbi_action(model, config, ...) + local cbi = require "luci.cbi" + local tpl = require "luci.template" + local util = require "luci.util" + + if not config then + config = {} + end + + local maps = cbi.load(model, ...) + + local state = nil + + local function has_uci_access(config, level) + local rv = util.ubus("session", "access", { + ubus_rpc_session = context.authsession, + scope = "uci", object = config, + ["function"] = level + }) + + return (type(rv) == "table" and rv.access == true) or false + end + + local i, res + for i, res in ipairs(maps) do + if util.instanceof(res, cbi.SimpleForm) then + io.stderr:write("Model %s returns SimpleForm but is dispatched via cbi(),\n" + % model) + + io.stderr:write("please change %s to use the form() action instead.\n" + % table.concat(context.request, "/")) + end + + res.flow = config + local cstate = res:parse() + if cstate and (not state or cstate < state) then + state = cstate + end + end + + local function _resolve_path(path) + return type(path) == "table" and build_url(unpack(path)) or path + end + + if config.on_valid_to and state and state > 0 and state < 2 then + http:redirect(_resolve_path(config.on_valid_to)) + return + end + + if config.on_changed_to and state and state > 1 then + http:redirect(_resolve_path(config.on_changed_to)) + return + end + + if config.on_success_to and state and state > 0 then + http:redirect(_resolve_path(config.on_success_to)) + return + end + + if config.state_handler then + if not config.state_handler(state, maps) then + return + end + end + + http:header("X-CBI-State", state or 0) + + if not config.noheader then + _G.L.include("cbi/header", {state = state}) + end + + local redirect + local messages + local applymap = false + local pageaction = true + local parsechain = { } + local writable = false + + for i, res in ipairs(maps) do + if res.apply_needed and res.parsechain then + local c + for _, c in ipairs(res.parsechain) do + parsechain[#parsechain+1] = c + end + applymap = true + end + + if res.redirect then + redirect = redirect or res.redirect + end + + if res.pageaction == false then + pageaction = false + end + + if res.message then + messages = messages or { } + messages[#messages+1] = res.message + end + end + + for i, res in ipairs(maps) do + local is_readable_map = has_uci_access(res.config, "read") + local is_writable_map = has_uci_access(res.config, "write") + + writable = writable or is_writable_map + + res:render({ + firstmap = (i == 1), + redirect = redirect, + messages = messages, + pageaction = pageaction, + parsechain = parsechain, + readable = is_readable_map, + writable = is_writable_map + }) + end + + if not config.nofooter then + _G.L.include("cbi/footer", { + flow = config, + pageaction = pageaction, + redirect = redirect, + state = state, + autoapply = config.autoapply, + trigger_apply = applymap, + writable = writable + }) + end +end + +function invoke_form_action(model, ...) + local cbi = require "luci.cbi" + local tpl = require "luci.template" + + local maps = luci.cbi.load(model, ...) + local state = nil + + local i, res + for i, res in ipairs(maps) do + local cstate = res:parse() + if cstate and (not state or cstate < state) then + state = cstate + end + end + + http:header("X-CBI-State", state or 0) + _G.L.include("header") + for i, res in ipairs(maps) do + res:render() + end + _G.L.include("footer") +end + +function render_lua_template(path) + local tpl = require "luci.template" + + tpl.render(path, getfenv(1)) +end + +function test_post_security() + if http:getenv("REQUEST_METHOD") ~= "POST" then + http:status(405, "Method Not Allowed") + http:header("Allow", "POST") + return false + end + + if http:formvalue("token") ~= context.authtoken then + http:status(403, "Forbidden") + _G.L.include("csrftoken") + return false + end + + return true +end + + +function call(name, ...) + return { + ["type"] = "call", + ["module"] = __controller, + ["function"] = name, + ["parameters"] = select('#', ...) > 0 and {...} or nil + } +end + +function post_on(params, name, ...) + return { + ["type"] = "call", + ["module"] = __controller, + ["function"] = name, + ["parameters"] = select('#', ...) > 0 and {...} or nil, + ["post"] = params + } +end + +function post(...) + return post_on(true, ...) +end + +function view(name) + return { + ["type"] = "view", + ["path"] = name + } +end + +function template(name) + return { + ["type"] = "template", + ["path"] = name + } +end + +function cbi(model, config) + return { + ["type"] = "call", + ["module"] = "luci.dispatcher", + ["function"] = "invoke_cbi_action", + ["parameters"] = { model, config or {} }, + ["post"] = { + ["cbi.submit"] = true + } + } +end + +function form(model) + return { + ["type"] = "call", + ["module"] = "luci.dispatcher", + ["function"] = "invoke_form_action", + ["parameters"] = { model }, + ["post"] = { + ["cbi.submit"] = true + } + } +end + +function firstchild() + return { + ["type"] = "firstchild" + } +end + +function firstnode() + return { + ["type"] = "firstchild", + ["recurse"] = true + } +end + +function arcombine(trg1, trg2) + return { + ["type"] = "arcombine", + ["targets"] = { trg1, trg2 } --, + --env = getfenv(), + } +end + +function alias(...) + return { + ["type"] = "alias", + ["path"] = table.concat({ ... }, "/") + } +end + +function rewrite(n, ...) + return { + ["type"] = "rewrite", + ["path"] = table.concat({ ... }, "/"), + ["remove"] = n + } +end + + +translate = i18n.translate + +-- This function does not actually translate the given argument but +-- is used by build/i18n-scan.pl to find translatable entries. +function _(text) + return text +end diff --git a/package/luci/modules/luci-base/luasrc/i18n.lua b/package/luci/modules/luci-lua-runtime/luasrc/i18n.lua similarity index 100% rename from package/luci/modules/luci-base/luasrc/i18n.lua rename to package/luci/modules/luci-lua-runtime/luasrc/i18n.lua diff --git a/package/luci/modules/luci-base/luasrc/i18n.luadoc b/package/luci/modules/luci-lua-runtime/luasrc/i18n.luadoc similarity index 100% rename from package/luci/modules/luci-base/luasrc/i18n.luadoc rename to package/luci/modules/luci-lua-runtime/luasrc/i18n.luadoc diff --git a/package/luci/modules/luci-base/luasrc/model/uci.lua b/package/luci/modules/luci-lua-runtime/luasrc/model/uci.lua similarity index 100% rename from package/luci/modules/luci-base/luasrc/model/uci.lua rename to package/luci/modules/luci-lua-runtime/luasrc/model/uci.lua diff --git a/package/luci/modules/luci-base/luasrc/model/uci.luadoc b/package/luci/modules/luci-lua-runtime/luasrc/model/uci.luadoc similarity index 100% rename from package/luci/modules/luci-base/luasrc/model/uci.luadoc rename to package/luci/modules/luci-lua-runtime/luasrc/model/uci.luadoc diff --git a/package/luci/modules/luci-base/luasrc/store.lua b/package/luci/modules/luci-lua-runtime/luasrc/store.lua similarity index 100% rename from package/luci/modules/luci-base/luasrc/store.lua rename to package/luci/modules/luci-lua-runtime/luasrc/store.lua diff --git a/package/luci/modules/luci-base/luasrc/sys.lua b/package/luci/modules/luci-lua-runtime/luasrc/sys.lua similarity index 100% rename from package/luci/modules/luci-base/luasrc/sys.lua rename to package/luci/modules/luci-lua-runtime/luasrc/sys.lua diff --git a/package/luci/modules/luci-base/luasrc/sys.luadoc b/package/luci/modules/luci-lua-runtime/luasrc/sys.luadoc similarity index 100% rename from package/luci/modules/luci-base/luasrc/sys.luadoc rename to package/luci/modules/luci-lua-runtime/luasrc/sys.luadoc diff --git a/package/luci/modules/luci-base/luasrc/sys/zoneinfo.lua b/package/luci/modules/luci-lua-runtime/luasrc/sys/zoneinfo.lua similarity index 100% rename from package/luci/modules/luci-base/luasrc/sys/zoneinfo.lua rename to package/luci/modules/luci-lua-runtime/luasrc/sys/zoneinfo.lua diff --git a/package/luci/modules/luci-lua-runtime/luasrc/sys/zoneinfo/tzdata.lua b/package/luci/modules/luci-lua-runtime/luasrc/sys/zoneinfo/tzdata.lua new file mode 100644 index 0000000000..3ef2f4caf4 --- /dev/null +++ b/package/luci/modules/luci-lua-runtime/luasrc/sys/zoneinfo/tzdata.lua @@ -0,0 +1,455 @@ +-- Licensed to the public under the Apache License 2.0. + +module "luci.sys.zoneinfo.tzdata" + +TZ = { + { 'Africa/Abidjan', 'GMT0' }, + { 'Africa/Accra', 'GMT0' }, + { 'Africa/Addis Ababa', 'EAT-3' }, + { 'Africa/Algiers', 'CET-1' }, + { 'Africa/Asmara', 'EAT-3' }, + { 'Africa/Bamako', 'GMT0' }, + { 'Africa/Bangui', 'WAT-1' }, + { 'Africa/Banjul', 'GMT0' }, + { 'Africa/Bissau', 'GMT0' }, + { 'Africa/Blantyre', 'CAT-2' }, + { 'Africa/Brazzaville', 'WAT-1' }, + { 'Africa/Bujumbura', 'CAT-2' }, + { 'Africa/Cairo', 'EET-2' }, + { 'Africa/Casablanca', '<+01>-1' }, + { 'Africa/Ceuta', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Africa/Conakry', 'GMT0' }, + { 'Africa/Dakar', 'GMT0' }, + { 'Africa/Dar es Salaam', 'EAT-3' }, + { 'Africa/Djibouti', 'EAT-3' }, + { 'Africa/Douala', 'WAT-1' }, + { 'Africa/El Aaiun', '<+01>-1' }, + { 'Africa/Freetown', 'GMT0' }, + { 'Africa/Gaborone', 'CAT-2' }, + { 'Africa/Harare', 'CAT-2' }, + { 'Africa/Johannesburg', 'SAST-2' }, + { 'Africa/Juba', 'CAT-2' }, + { 'Africa/Kampala', 'EAT-3' }, + { 'Africa/Khartoum', 'CAT-2' }, + { 'Africa/Kigali', 'CAT-2' }, + { 'Africa/Kinshasa', 'WAT-1' }, + { 'Africa/Lagos', 'WAT-1' }, + { 'Africa/Libreville', 'WAT-1' }, + { 'Africa/Lome', 'GMT0' }, + { 'Africa/Luanda', 'WAT-1' }, + { 'Africa/Lubumbashi', 'CAT-2' }, + { 'Africa/Lusaka', 'CAT-2' }, + { 'Africa/Malabo', 'WAT-1' }, + { 'Africa/Maputo', 'CAT-2' }, + { 'Africa/Maseru', 'SAST-2' }, + { 'Africa/Mbabane', 'SAST-2' }, + { 'Africa/Mogadishu', 'EAT-3' }, + { 'Africa/Monrovia', 'GMT0' }, + { 'Africa/Nairobi', 'EAT-3' }, + { 'Africa/Ndjamena', 'WAT-1' }, + { 'Africa/Niamey', 'WAT-1' }, + { 'Africa/Nouakchott', 'GMT0' }, + { 'Africa/Ouagadougou', 'GMT0' }, + { 'Africa/Porto-Novo', 'WAT-1' }, + { 'Africa/Sao Tome', 'GMT0' }, + { 'Africa/Tripoli', 'EET-2' }, + { 'Africa/Tunis', 'CET-1' }, + { 'Africa/Windhoek', 'CAT-2' }, + { 'America/Adak', 'HST10HDT,M3.2.0,M11.1.0' }, + { 'America/Anchorage', 'AKST9AKDT,M3.2.0,M11.1.0' }, + { 'America/Anguilla', 'AST4' }, + { 'America/Antigua', 'AST4' }, + { 'America/Araguaina', '<-03>3' }, + { 'America/Argentina/Buenos Aires', '<-03>3' }, + { 'America/Argentina/Catamarca', '<-03>3' }, + { 'America/Argentina/Cordoba', '<-03>3' }, + { 'America/Argentina/Jujuy', '<-03>3' }, + { 'America/Argentina/La Rioja', '<-03>3' }, + { 'America/Argentina/Mendoza', '<-03>3' }, + { 'America/Argentina/Rio Gallegos', '<-03>3' }, + { 'America/Argentina/Salta', '<-03>3' }, + { 'America/Argentina/San Juan', '<-03>3' }, + { 'America/Argentina/San Luis', '<-03>3' }, + { 'America/Argentina/Tucuman', '<-03>3' }, + { 'America/Argentina/Ushuaia', '<-03>3' }, + { 'America/Aruba', 'AST4' }, + { 'America/Asuncion', '<-04>4<-03>,M10.1.0/0,M3.4.0/0' }, + { 'America/Atikokan', 'EST5' }, + { 'America/Bahia', '<-03>3' }, + { 'America/Bahia Banderas', 'CST6CDT,M4.1.0,M10.5.0' }, + { 'America/Barbados', 'AST4' }, + { 'America/Belem', '<-03>3' }, + { 'America/Belize', 'CST6' }, + { 'America/Blanc-Sablon', 'AST4' }, + { 'America/Boa Vista', '<-04>4' }, + { 'America/Bogota', '<-05>5' }, + { 'America/Boise', 'MST7MDT,M3.2.0,M11.1.0' }, + { 'America/Cambridge Bay', 'MST7MDT,M3.2.0,M11.1.0' }, + { 'America/Campo Grande', '<-04>4' }, + { 'America/Cancun', 'EST5' }, + { 'America/Caracas', '<-04>4' }, + { 'America/Cayenne', '<-03>3' }, + { 'America/Cayman', 'EST5' }, + { 'America/Chicago', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/Chihuahua', 'MST7MDT,M4.1.0,M10.5.0' }, + { 'America/Costa Rica', 'CST6' }, + { 'America/Creston', 'MST7' }, + { 'America/Cuiaba', '<-04>4' }, + { 'America/Curacao', 'AST4' }, + { 'America/Danmarkshavn', 'GMT0' }, + { 'America/Dawson', 'MST7' }, + { 'America/Dawson Creek', 'MST7' }, + { 'America/Denver', 'MST7MDT,M3.2.0,M11.1.0' }, + { 'America/Detroit', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Dominica', 'AST4' }, + { 'America/Edmonton', 'MST7MDT,M3.2.0,M11.1.0' }, + { 'America/Eirunepe', '<-05>5' }, + { 'America/El Salvador', 'CST6' }, + { 'America/Fort Nelson', 'MST7' }, + { 'America/Fortaleza', '<-03>3' }, + { 'America/Glace Bay', 'AST4ADT,M3.2.0,M11.1.0' }, + { 'America/Goose Bay', 'AST4ADT,M3.2.0,M11.1.0' }, + { 'America/Grand Turk', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Grenada', 'AST4' }, + { 'America/Guadeloupe', 'AST4' }, + { 'America/Guatemala', 'CST6' }, + { 'America/Guayaquil', '<-05>5' }, + { 'America/Guyana', '<-04>4' }, + { 'America/Halifax', 'AST4ADT,M3.2.0,M11.1.0' }, + { 'America/Havana', 'CST5CDT,M3.2.0/0,M11.1.0/1' }, + { 'America/Hermosillo', 'MST7' }, + { 'America/Indiana/Indianapolis', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Indiana/Knox', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/Indiana/Marengo', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Indiana/Petersburg', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Indiana/Tell City', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/Indiana/Vevay', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Indiana/Vincennes', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Indiana/Winamac', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Inuvik', 'MST7MDT,M3.2.0,M11.1.0' }, + { 'America/Iqaluit', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Jamaica', 'EST5' }, + { 'America/Juneau', 'AKST9AKDT,M3.2.0,M11.1.0' }, + { 'America/Kentucky/Louisville', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Kentucky/Monticello', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Kralendijk', 'AST4' }, + { 'America/La Paz', '<-04>4' }, + { 'America/Lima', '<-05>5' }, + { 'America/Los Angeles', 'PST8PDT,M3.2.0,M11.1.0' }, + { 'America/Lower Princes', 'AST4' }, + { 'America/Maceio', '<-03>3' }, + { 'America/Managua', 'CST6' }, + { 'America/Manaus', '<-04>4' }, + { 'America/Marigot', 'AST4' }, + { 'America/Martinique', 'AST4' }, + { 'America/Matamoros', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/Mazatlan', 'MST7MDT,M4.1.0,M10.5.0' }, + { 'America/Menominee', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/Merida', 'CST6CDT,M4.1.0,M10.5.0' }, + { 'America/Metlakatla', 'AKST9AKDT,M3.2.0,M11.1.0' }, + { 'America/Mexico City', 'CST6CDT,M4.1.0,M10.5.0' }, + { 'America/Miquelon', '<-03>3<-02>,M3.2.0,M11.1.0' }, + { 'America/Moncton', 'AST4ADT,M3.2.0,M11.1.0' }, + { 'America/Monterrey', 'CST6CDT,M4.1.0,M10.5.0' }, + { 'America/Montevideo', '<-03>3' }, + { 'America/Montserrat', 'AST4' }, + { 'America/Nassau', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/New York', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Nipigon', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Nome', 'AKST9AKDT,M3.2.0,M11.1.0' }, + { 'America/Noronha', '<-02>2' }, + { 'America/North Dakota/Beulah', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/North Dakota/Center', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/North Dakota/New Salem', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/Nuuk', '<-03>3<-02>,M3.5.0/-2,M10.5.0/-1' }, + { 'America/Ojinaga', 'MST7MDT,M3.2.0,M11.1.0' }, + { 'America/Panama', 'EST5' }, + { 'America/Pangnirtung', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Paramaribo', '<-03>3' }, + { 'America/Phoenix', 'MST7' }, + { 'America/Port of Spain', 'AST4' }, + { 'America/Port-au-Prince', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Porto Velho', '<-04>4' }, + { 'America/Puerto Rico', 'AST4' }, + { 'America/Punta Arenas', '<-03>3' }, + { 'America/Rainy River', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/Rankin Inlet', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/Recife', '<-03>3' }, + { 'America/Regina', 'CST6' }, + { 'America/Resolute', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/Rio Branco', '<-05>5' }, + { 'America/Santarem', '<-03>3' }, + { 'America/Santiago', '<-04>4<-03>,M9.1.6/24,M4.1.6/24' }, + { 'America/Santo Domingo', 'AST4' }, + { 'America/Sao Paulo', '<-03>3' }, + { 'America/Scoresbysund', '<-01>1<+00>,M3.5.0/0,M10.5.0/1' }, + { 'America/Sitka', 'AKST9AKDT,M3.2.0,M11.1.0' }, + { 'America/St Barthelemy', 'AST4' }, + { 'America/St Johns', 'NST3:30NDT,M3.2.0,M11.1.0' }, + { 'America/St Kitts', 'AST4' }, + { 'America/St Lucia', 'AST4' }, + { 'America/St Thomas', 'AST4' }, + { 'America/St Vincent', 'AST4' }, + { 'America/Swift Current', 'CST6' }, + { 'America/Tegucigalpa', 'CST6' }, + { 'America/Thule', 'AST4ADT,M3.2.0,M11.1.0' }, + { 'America/Thunder Bay', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Tijuana', 'PST8PDT,M3.2.0,M11.1.0' }, + { 'America/Toronto', 'EST5EDT,M3.2.0,M11.1.0' }, + { 'America/Tortola', 'AST4' }, + { 'America/Vancouver', 'PST8PDT,M3.2.0,M11.1.0' }, + { 'America/Whitehorse', 'MST7' }, + { 'America/Winnipeg', 'CST6CDT,M3.2.0,M11.1.0' }, + { 'America/Yakutat', 'AKST9AKDT,M3.2.0,M11.1.0' }, + { 'America/Yellowknife', 'MST7MDT,M3.2.0,M11.1.0' }, + { 'Antarctica/Casey', '<+11>-11' }, + { 'Antarctica/Davis', '<+07>-7' }, + { 'Antarctica/DumontDUrville', '<+10>-10' }, + { 'Antarctica/Macquarie', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, + { 'Antarctica/Mawson', '<+05>-5' }, + { 'Antarctica/McMurdo', 'NZST-12NZDT,M9.5.0,M4.1.0/3' }, + { 'Antarctica/Palmer', '<-03>3' }, + { 'Antarctica/Rothera', '<-03>3' }, + { 'Antarctica/Syowa', '<+03>-3' }, + { 'Antarctica/Troll', '<+00>0<+02>-2,M3.5.0/1,M10.5.0/3' }, + { 'Antarctica/Vostok', '<+06>-6' }, + { 'Arctic/Longyearbyen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Asia/Aden', '<+03>-3' }, + { 'Asia/Almaty', '<+06>-6' }, + { 'Asia/Amman', '<+03>-3' }, + { 'Asia/Anadyr', '<+12>-12' }, + { 'Asia/Aqtau', '<+05>-5' }, + { 'Asia/Aqtobe', '<+05>-5' }, + { 'Asia/Ashgabat', '<+05>-5' }, + { 'Asia/Atyrau', '<+05>-5' }, + { 'Asia/Baghdad', '<+03>-3' }, + { 'Asia/Bahrain', '<+03>-3' }, + { 'Asia/Baku', '<+04>-4' }, + { 'Asia/Bangkok', '<+07>-7' }, + { 'Asia/Barnaul', '<+07>-7' }, + { 'Asia/Beirut', 'EET-2EEST,M3.5.0/0,M10.5.0/0' }, + { 'Asia/Bishkek', '<+06>-6' }, + { 'Asia/Brunei', '<+08>-8' }, + { 'Asia/Chita', '<+09>-9' }, + { 'Asia/Choibalsan', '<+08>-8' }, + { 'Asia/Colombo', '<+0530>-5:30' }, + { 'Asia/Damascus', '<+03>-3' }, + { 'Asia/Dhaka', '<+06>-6' }, + { 'Asia/Dili', '<+09>-9' }, + { 'Asia/Dubai', '<+04>-4' }, + { 'Asia/Dushanbe', '<+05>-5' }, + { 'Asia/Famagusta', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, + { 'Asia/Gaza', 'EET-2EEST,M3.4.4/50,M10.4.4/50' }, + { 'Asia/Hebron', 'EET-2EEST,M3.4.4/50,M10.4.4/50' }, + { 'Asia/Ho Chi Minh', '<+07>-7' }, + { 'Asia/Hong Kong', 'HKT-8' }, + { 'Asia/Hovd', '<+07>-7' }, + { 'Asia/Irkutsk', '<+08>-8' }, + { 'Asia/Jakarta', 'WIB-7' }, + { 'Asia/Jayapura', 'WIT-9' }, + { 'Asia/Jerusalem', 'IST-2IDT,M3.4.4/26,M10.5.0' }, + { 'Asia/Kabul', '<+0430>-4:30' }, + { 'Asia/Kamchatka', '<+12>-12' }, + { 'Asia/Karachi', 'PKT-5' }, + { 'Asia/Kathmandu', '<+0545>-5:45' }, + { 'Asia/Khandyga', '<+09>-9' }, + { 'Asia/Kolkata', 'IST-5:30' }, + { 'Asia/Krasnoyarsk', '<+07>-7' }, + { 'Asia/Kuala Lumpur', '<+08>-8' }, + { 'Asia/Kuching', '<+08>-8' }, + { 'Asia/Kuwait', '<+03>-3' }, + { 'Asia/Macau', 'CST-8' }, + { 'Asia/Magadan', '<+11>-11' }, + { 'Asia/Makassar', 'WITA-8' }, + { 'Asia/Manila', 'PST-8' }, + { 'Asia/Muscat', '<+04>-4' }, + { 'Asia/Nicosia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, + { 'Asia/Novokuznetsk', '<+07>-7' }, + { 'Asia/Novosibirsk', '<+07>-7' }, + { 'Asia/Omsk', '<+06>-6' }, + { 'Asia/Oral', '<+05>-5' }, + { 'Asia/Phnom Penh', '<+07>-7' }, + { 'Asia/Pontianak', 'WIB-7' }, + { 'Asia/Pyongyang', 'KST-9' }, + { 'Asia/Qatar', '<+03>-3' }, + { 'Asia/Qostanay', '<+06>-6' }, + { 'Asia/Qyzylorda', '<+05>-5' }, + { 'Asia/Riyadh', '<+03>-3' }, + { 'Asia/Sakhalin', '<+11>-11' }, + { 'Asia/Samarkand', '<+05>-5' }, + { 'Asia/Seoul', 'KST-9' }, + { 'Asia/Shanghai', 'CST-8' }, + { 'Asia/Singapore', '<+08>-8' }, + { 'Asia/Srednekolymsk', '<+11>-11' }, + { 'Asia/Taipei', 'CST-8' }, + { 'Asia/Tashkent', '<+05>-5' }, + { 'Asia/Tbilisi', '<+04>-4' }, + { 'Asia/Tehran', '<+0330>-3:30' }, + { 'Asia/Thimphu', '<+06>-6' }, + { 'Asia/Tokyo', 'JST-9' }, + { 'Asia/Tomsk', '<+07>-7' }, + { 'Asia/Ulaanbaatar', '<+08>-8' }, + { 'Asia/Urumqi', '<+06>-6' }, + { 'Asia/Ust-Nera', '<+10>-10' }, + { 'Asia/Vientiane', '<+07>-7' }, + { 'Asia/Vladivostok', '<+10>-10' }, + { 'Asia/Yakutsk', '<+09>-9' }, + { 'Asia/Yangon', '<+0630>-6:30' }, + { 'Asia/Yekaterinburg', '<+05>-5' }, + { 'Asia/Yerevan', '<+04>-4' }, + { 'Atlantic/Azores', '<-01>1<+00>,M3.5.0/0,M10.5.0/1' }, + { 'Atlantic/Bermuda', 'AST4ADT,M3.2.0,M11.1.0' }, + { 'Atlantic/Canary', 'WET0WEST,M3.5.0/1,M10.5.0' }, + { 'Atlantic/Cape Verde', '<-01>1' }, + { 'Atlantic/Faroe', 'WET0WEST,M3.5.0/1,M10.5.0' }, + { 'Atlantic/Madeira', 'WET0WEST,M3.5.0/1,M10.5.0' }, + { 'Atlantic/Reykjavik', 'GMT0' }, + { 'Atlantic/South Georgia', '<-02>2' }, + { 'Atlantic/St Helena', 'GMT0' }, + { 'Atlantic/Stanley', '<-03>3' }, + { 'Australia/Adelaide', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' }, + { 'Australia/Brisbane', 'AEST-10' }, + { 'Australia/Broken Hill', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' }, + { 'Australia/Darwin', 'ACST-9:30' }, + { 'Australia/Eucla', '<+0845>-8:45' }, + { 'Australia/Hobart', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, + { 'Australia/Lindeman', 'AEST-10' }, + { 'Australia/Lord Howe', '<+1030>-10:30<+11>-11,M10.1.0,M4.1.0' }, + { 'Australia/Melbourne', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, + { 'Australia/Perth', 'AWST-8' }, + { 'Australia/Sydney', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, + { 'Etc/GMT', 'GMT0' }, + { 'Etc/GMT+1', '<-01>1' }, + { 'Etc/GMT+10', '<-10>10' }, + { 'Etc/GMT+11', '<-11>11' }, + { 'Etc/GMT+12', '<-12>12' }, + { 'Etc/GMT+2', '<-02>2' }, + { 'Etc/GMT+3', '<-03>3' }, + { 'Etc/GMT+4', '<-04>4' }, + { 'Etc/GMT+5', '<-05>5' }, + { 'Etc/GMT+6', '<-06>6' }, + { 'Etc/GMT+7', '<-07>7' }, + { 'Etc/GMT+8', '<-08>8' }, + { 'Etc/GMT+9', '<-09>9' }, + { 'Etc/GMT-1', '<+01>-1' }, + { 'Etc/GMT-10', '<+10>-10' }, + { 'Etc/GMT-11', '<+11>-11' }, + { 'Etc/GMT-12', '<+12>-12' }, + { 'Etc/GMT-13', '<+13>-13' }, + { 'Etc/GMT-14', '<+14>-14' }, + { 'Etc/GMT-2', '<+02>-2' }, + { 'Etc/GMT-3', '<+03>-3' }, + { 'Etc/GMT-4', '<+04>-4' }, + { 'Etc/GMT-5', '<+05>-5' }, + { 'Etc/GMT-6', '<+06>-6' }, + { 'Etc/GMT-7', '<+07>-7' }, + { 'Etc/GMT-8', '<+08>-8' }, + { 'Etc/GMT-9', '<+09>-9' }, + { 'Europe/Amsterdam', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Andorra', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Astrakhan', '<+04>-4' }, + { 'Europe/Athens', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, + { 'Europe/Belgrade', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Berlin', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Bratislava', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Brussels', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Bucharest', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, + { 'Europe/Budapest', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Busingen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Chisinau', 'EET-2EEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Copenhagen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Dublin', 'IST-1GMT0,M10.5.0,M3.5.0/1' }, + { 'Europe/Gibraltar', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Guernsey', 'GMT0BST,M3.5.0/1,M10.5.0' }, + { 'Europe/Helsinki', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, + { 'Europe/Isle of Man', 'GMT0BST,M3.5.0/1,M10.5.0' }, + { 'Europe/Istanbul', '<+03>-3' }, + { 'Europe/Jersey', 'GMT0BST,M3.5.0/1,M10.5.0' }, + { 'Europe/Kaliningrad', 'EET-2' }, + { 'Europe/Kirov', '<+03>-3' }, + { 'Europe/Kyiv', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, + { 'Europe/Lisbon', 'WET0WEST,M3.5.0/1,M10.5.0' }, + { 'Europe/Ljubljana', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/London', 'GMT0BST,M3.5.0/1,M10.5.0' }, + { 'Europe/Luxembourg', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Madrid', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Malta', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Mariehamn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, + { 'Europe/Minsk', '<+03>-3' }, + { 'Europe/Monaco', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Moscow', 'MSK-3' }, + { 'Europe/Oslo', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Paris', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Podgorica', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Prague', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Riga', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, + { 'Europe/Rome', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Samara', '<+04>-4' }, + { 'Europe/San Marino', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Sarajevo', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Saratov', '<+04>-4' }, + { 'Europe/Simferopol', 'MSK-3' }, + { 'Europe/Skopje', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Sofia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, + { 'Europe/Stockholm', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Tallinn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, + { 'Europe/Tirane', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Ulyanovsk', '<+04>-4' }, + { 'Europe/Vaduz', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Vatican', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Vienna', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Vilnius', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, + { 'Europe/Volgograd', '<+03>-3' }, + { 'Europe/Warsaw', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Zagreb', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Europe/Zurich', 'CET-1CEST,M3.5.0,M10.5.0/3' }, + { 'Indian/Antananarivo', 'EAT-3' }, + { 'Indian/Chagos', '<+06>-6' }, + { 'Indian/Christmas', '<+07>-7' }, + { 'Indian/Cocos', '<+0630>-6:30' }, + { 'Indian/Comoro', 'EAT-3' }, + { 'Indian/Kerguelen', '<+05>-5' }, + { 'Indian/Mahe', '<+04>-4' }, + { 'Indian/Maldives', '<+05>-5' }, + { 'Indian/Mauritius', '<+04>-4' }, + { 'Indian/Mayotte', 'EAT-3' }, + { 'Indian/Reunion', '<+04>-4' }, + { 'Pacific/Apia', '<+13>-13' }, + { 'Pacific/Auckland', 'NZST-12NZDT,M9.5.0,M4.1.0/3' }, + { 'Pacific/Bougainville', '<+11>-11' }, + { 'Pacific/Chatham', '<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45' }, + { 'Pacific/Chuuk', '<+10>-10' }, + { 'Pacific/Easter', '<-06>6<-05>,M9.1.6/22,M4.1.6/22' }, + { 'Pacific/Efate', '<+11>-11' }, + { 'Pacific/Fakaofo', '<+13>-13' }, + { 'Pacific/Fiji', '<+12>-12<+13>,M11.2.0,M1.2.3/99' }, + { 'Pacific/Funafuti', '<+12>-12' }, + { 'Pacific/Galapagos', '<-06>6' }, + { 'Pacific/Gambier', '<-09>9' }, + { 'Pacific/Guadalcanal', '<+11>-11' }, + { 'Pacific/Guam', 'ChST-10' }, + { 'Pacific/Honolulu', 'HST10' }, + { 'Pacific/Kanton', '<+13>-13' }, + { 'Pacific/Kiritimati', '<+14>-14' }, + { 'Pacific/Kosrae', '<+11>-11' }, + { 'Pacific/Kwajalein', '<+12>-12' }, + { 'Pacific/Majuro', '<+12>-12' }, + { 'Pacific/Marquesas', '<-0930>9:30' }, + { 'Pacific/Midway', 'SST11' }, + { 'Pacific/Nauru', '<+12>-12' }, + { 'Pacific/Niue', '<-11>11' }, + { 'Pacific/Norfolk', '<+11>-11<+12>,M10.1.0,M4.1.0/3' }, + { 'Pacific/Noumea', '<+11>-11' }, + { 'Pacific/Pago Pago', 'SST11' }, + { 'Pacific/Palau', '<+09>-9' }, + { 'Pacific/Pitcairn', '<-08>8' }, + { 'Pacific/Pohnpei', '<+11>-11' }, + { 'Pacific/Port Moresby', '<+10>-10' }, + { 'Pacific/Rarotonga', '<-10>10' }, + { 'Pacific/Saipan', 'ChST-10' }, + { 'Pacific/Tahiti', '<-10>10' }, + { 'Pacific/Tarawa', '<+12>-12' }, + { 'Pacific/Tongatapu', '<+13>-13' }, + { 'Pacific/Wake', '<+12>-12' }, + { 'Pacific/Wallis', '<+12>-12' }, +} diff --git a/package/luci/modules/luci-lua-runtime/luasrc/sys/zoneinfo/tzoffset.lua b/package/luci/modules/luci-lua-runtime/luasrc/sys/zoneinfo/tzoffset.lua new file mode 100644 index 0000000000..caee1d2c1c --- /dev/null +++ b/package/luci/modules/luci-lua-runtime/luasrc/sys/zoneinfo/tzoffset.lua @@ -0,0 +1,46 @@ +-- Licensed to the public under the Apache License 2.0. + +module "luci.sys.zoneinfo.tzoffset" + +OFFSET = { + gmt = 0, -- GMT + eat = 10800, -- EAT + cet = 3600, -- CET + wat = 3600, -- WAT + cat = 7200, -- CAT + eet = 7200, -- EET + sast = 7200, -- SAST + hst = -36000, -- HST + hdt = -32400, -- HDT + akst = -32400, -- AKST + akdt = -28800, -- AKDT + ast = -14400, -- AST + est = -18000, -- EST + cst = -21600, -- CST + cdt = -18000, -- CDT + mst = -25200, -- MST + mdt = -21600, -- MDT + pst = -28800, -- PST + pdt = -25200, -- PDT + nst = -12600, -- NST + ndt = -9000, -- NDT + aest = 36000, -- AEST + aedt = 39600, -- AEDT + nzst = 43200, -- NZST + nzdt = 46800, -- NZDT + hkt = 28800, -- HKT + wib = 25200, -- WIB + wit = 32400, -- WIT + ist = 7200, -- IST + idt = 10800, -- IDT + pkt = 18000, -- PKT + wita = 28800, -- WITA + kst = 32400, -- KST + jst = 32400, -- JST + wet = 0, -- WET + acst = 34200, -- ACST + acdt = 37800, -- ACDT + awst = 28800, -- AWST + msk = 10800, -- MSK + sst = -39600, -- SST +} diff --git a/package/luci/modules/luci-lua-runtime/luasrc/template.lua b/package/luci/modules/luci-lua-runtime/luasrc/template.lua new file mode 100644 index 0000000000..b6b9af0bad --- /dev/null +++ b/package/luci/modules/luci-lua-runtime/luasrc/template.lua @@ -0,0 +1,184 @@ +-- Copyright 2008 Steven Barth +-- Licensed to the public under the Apache License 2.0. + +local util = require "luci.util" +local config = require "luci.config" +local tparser = require "luci.template.parser" + +local tostring, pairs, loadstring = tostring, pairs, loadstring +local setmetatable, loadfile = setmetatable, loadfile +local getfenv, setfenv, rawget = getfenv, setfenv, rawget +local assert, type, error = assert, type, error +local table, string, unpack = table, string, unpack + + +--- +--- bootstrap +--- +local _G = _G +local L = _G.L + +local http = _G.L.http + +local disp = require "luci.dispatcher" +local i18n = require "luci.i18n" +local xml = require "luci.xml" +local fs = require "nixio.fs" + + +--- LuCI template library. +module "luci.template" + +config.template = config.template or {} +viewdir = config.template.viewdir or util.libpath() .. "/view" + + +-- Define the namespace for template modules +context = {} --util.threadlocal() + +--- Render a certain template. +-- @param name Template name +-- @param scope Scope to assign to template (optional) +function render(name, scope) + return Template(name):render(scope or getfenv(2)) +end + +--- Render a template from a string. +-- @param template Template string +-- @param scope Scope to assign to template (optional) +function render_string(template, scope) + return Template(nil, template):render(scope or getfenv(2)) +end + + +-- Template class +Template = util.class() + +-- Shared template cache to store templates in to avoid unnecessary reloading +Template.cache = setmetatable({}, {__mode = "v"}) + + + +local function _ifattr(cond, key, val, noescape) + if cond then + local env = getfenv(3) + local scope = (type(env.self) == "table") and env.self + if type(val) == "table" then + if not next(val) then + return '' + else + val = util.serialize_json(val) + end + end + + val = tostring(val or + (type(env[key]) ~= "function" and env[key]) or + (scope and type(scope[key]) ~= "function" and scope[key]) or "") + + if noescape ~= true then + val = xml.pcdata(val) + end + + return string.format(' %s="%s"', tostring(key), val) + else + return '' + end +end + +context.viewns = setmetatable({ + include = function(name) + if fs.access(viewdir .. "/" .. name .. ".htm") then + Template(name):render(getfenv(2)) + else + L.include(name, getfenv(2)) + end + end; + translate = i18n.translate; + translatef = i18n.translatef; + export = function(k, v) if context.viewns[k] == nil then context.viewns[k] = v end end; + striptags = xml.striptags; + pcdata = xml.pcdata; + ifattr = function(...) return _ifattr(...) end; + attr = function(...) return _ifattr(true, ...) end; + url = disp.build_url; +}, {__index=function(tbl, key) + if key == "controller" then + return disp.build_url() + elseif key == "REQUEST_URI" then + return disp.build_url(unpack(disp.context.requestpath)) + elseif key == "FULL_REQUEST_URI" then + local url = { http:getenv("SCRIPT_NAME") or "", http:getenv("PATH_INFO") } + local query = http:getenv("QUERY_STRING") + if query and #query > 0 then + url[#url+1] = "?" + url[#url+1] = query + end + return table.concat(url, "") + elseif key == "token" then + return disp.context.authtoken + elseif key == "theme" then + return L.media and fs.basename(L.media) or tostring(L) + elseif key == "resource" then + return L.config.main.resourcebase + else + return rawget(tbl, key) or _G[key] or L[key] + end +end}) + + +-- Constructor - Reads and compiles the template on-demand +function Template.__init__(self, name, template) + if name then + self.template = self.cache[name] + self.name = name + else + self.name = "[string]" + end + + -- Create a new namespace for this template + self.viewns = context.viewns + + -- If we have a cached template, skip compiling and loading + if not self.template then + + -- Compile template + local err + local sourcefile + + if name then + sourcefile = viewdir .. "/" .. name .. ".htm" + self.template, _, err = tparser.parse(sourcefile) + else + sourcefile = "[string]" + self.template, _, err = tparser.parse_string(template) + end + + -- If we have no valid template throw error, otherwise cache the template + if not self.template then + error("Failed to load template '" .. self.name .. "'.\n" .. + "Error while parsing template '" .. sourcefile .. "':\n" .. + (err or "Unknown syntax error")) + elseif name then + self.cache[name] = self.template + end + end +end + + +-- Renders a template +function Template.render(self, scope) + scope = scope or getfenv(2) + + -- Put our predefined objects in the scope of the template + setfenv(self.template, setmetatable({}, {__index = + function(tbl, key) + return rawget(tbl, key) or self.viewns[key] or scope[key] + end})) + + -- Now finally render the thing + local stat, err = util.copcall(self.template) + if not stat then + error("Failed to execute template '" .. self.name .. "'.\n" .. + "A runtime error occurred: " .. tostring(err or "(nil)")) + end +end diff --git a/package/luci/modules/luci-lua-runtime/luasrc/ucodebridge.lua b/package/luci/modules/luci-lua-runtime/luasrc/ucodebridge.lua new file mode 100644 index 0000000000..d36b974a73 --- /dev/null +++ b/package/luci/modules/luci-lua-runtime/luasrc/ucodebridge.lua @@ -0,0 +1,54 @@ +-- Copyright 2022 Jo-Philipp Wich +-- Licensed to the public under the Apache License 2.0. + +local coroutine, assert, error, type, require = coroutine, assert, error, type, require +local tmpl = require "luci.template" +local util = require "luci.util" +local http = require "luci.http" +local sys = require "luci.sys" +local ltn12 = require "luci.ltn12" + + +--- LuCI ucode bridge library. +module "luci.ucodebridge" + +local function run(fn, ...) + local co = coroutine.create(fn) + local ok, ret + + while coroutine.status(co) ~= "dead" do + ok, ret = coroutine.resume(co, ...) + + if not ok then + error(ret) + end + end + + return ret +end + +function compile(path) + run(function(path) + return tmpl.Template(path) + end, path) +end + +function render(path, scope) + run(tmpl.render, path, scope) +end + +function call(modname, method, ...) + return run(function(module, method, ...) + local mod = require(modname) + local func = mod[method] + + assert(func ~= nil, + 'Cannot resolve function "' .. method .. '". Is it misspelled or local?') + + assert(type(func) == "function", + 'The symbol "' .. method .. '" does not refer to a function but data ' .. + 'of type "' .. type(func) .. '".') + + return func(...) + end, modname, method, ...) +end diff --git a/package/luci/modules/luci-base/luasrc/version.lua b/package/luci/modules/luci-lua-runtime/luasrc/version.lua similarity index 100% rename from package/luci/modules/luci-base/luasrc/version.lua rename to package/luci/modules/luci-lua-runtime/luasrc/version.lua diff --git a/package/luci/modules/luci-lua-runtime/luasrc/view/admin_status/luaindex.htm b/package/luci/modules/luci-lua-runtime/luasrc/view/admin_status/luaindex.htm new file mode 100644 index 0000000000..ef664edcb2 --- /dev/null +++ b/package/luci/modules/luci-lua-runtime/luasrc/view/admin_status/luaindex.htm @@ -0,0 +1,18 @@ +<%- + local util = require "luci.util" + local fs = require "nixio.fs" + + local incdir = util.libpath() .. "/view/admin_status/index/" + if fs.access(incdir) then + local _, inc + local includes = {} + for inc in fs.dir(incdir) do + if inc:match("%.htm$") then + includes[#includes + 1] = inc:gsub("%.htm$", "") + end + end + for _, inc in luci.util.vspairs(includes) do + include("admin_status/index/" .. inc) + end + end +-%> diff --git a/package/luci/modules/luci-base/luasrc/view/empty_node_placeholder.htm b/package/luci/modules/luci-lua-runtime/luasrc/view/empty_node_placeholder.htm similarity index 100% rename from package/luci/modules/luci-base/luasrc/view/empty_node_placeholder.htm rename to package/luci/modules/luci-lua-runtime/luasrc/view/empty_node_placeholder.htm diff --git a/package/luci/modules/luci-base/luasrc/view/indexer.htm b/package/luci/modules/luci-lua-runtime/luasrc/view/indexer.htm similarity index 100% rename from package/luci/modules/luci-base/luasrc/view/indexer.htm rename to package/luci/modules/luci-lua-runtime/luasrc/view/indexer.htm diff --git a/package/luci/modules/luci-base/luasrc/xml.lua b/package/luci/modules/luci-lua-runtime/luasrc/xml.lua similarity index 100% rename from package/luci/modules/luci-base/luasrc/xml.lua rename to package/luci/modules/luci-lua-runtime/luasrc/xml.lua diff --git a/package/luci/modules/luci-base/luasrc/xml.luadoc b/package/luci/modules/luci-lua-runtime/luasrc/xml.luadoc similarity index 100% rename from package/luci/modules/luci-base/luasrc/xml.luadoc rename to package/luci/modules/luci-lua-runtime/luasrc/xml.luadoc diff --git a/package/luci/modules/luci-lua-runtime/src/Makefile b/package/luci/modules/luci-lua-runtime/src/Makefile new file mode 100644 index 0000000000..dcce33dc8c --- /dev/null +++ b/package/luci/modules/luci-lua-runtime/src/Makefile @@ -0,0 +1,26 @@ +%.o: %.c + $(CC) $(CPPFLAGS) $(CFLAGS) $(FPIC) -DNDEBUG -c -o $@ $< + +contrib/lemon: contrib/lemon.c contrib/lempar.c + cc -o contrib/lemon $< + +plural_formula.c: plural_formula.y contrib/lemon + ./contrib/lemon -q $< + +template_lmo.c: plural_formula.c + +clean: + rm -f contrib/lemon parser.so plural_formula.c plural_formula.h *.o + +parser.so: template_parser.o template_utils.o template_lmo.o template_lualib.o plural_formula.o + $(CC) $(LDFLAGS) -shared -o $@ $^ + +version.lua: + ./mkversion.sh $@ $(LUCI_VERSION) "$(LUCI_GITBRANCH)" + +compile: parser.so version.lua + +install: compile + mkdir -p $(DESTDIR)/usr/lib/lua/luci/template + cp parser.so $(DESTDIR)/usr/lib/lua/luci/template/parser.so + cp version.lua $(DESTDIR)/usr/lib/lua/luci/version.lua diff --git a/package/luci/modules/luci-lua-runtime/src/contrib/lemon.c b/package/luci/modules/luci-lua-runtime/src/contrib/lemon.c new file mode 100644 index 0000000000..85e94f7007 --- /dev/null +++ b/package/luci/modules/luci-lua-runtime/src/contrib/lemon.c @@ -0,0 +1,5040 @@ +/* +** This file contains all sources (including headers) to the LEMON +** LALR(1) parser generator. The sources have been combined into a +** single file to make it easy to include LEMON in the source tree +** and Makefile of another program. +** +** The author of this program disclaims copyright. +*/ +#include +#include +#include +#include +#include +#include + +#ifndef __WIN32__ +# if defined(_WIN32) || defined(WIN32) +# define __WIN32__ +# endif +#endif + +#ifdef __WIN32__ +#ifdef __cplusplus +extern "C" { +#endif +extern int access(const char *path, int mode); +#ifdef __cplusplus +} +#endif +#else +#include +#endif + +/* #define PRIVATE static */ +#define PRIVATE + +#ifdef TEST +#define MAXRHS 5 /* Set low to exercise exception code */ +#else +#define MAXRHS 1000 +#endif + +static int showPrecedenceConflict = 0; +static char *msort(char*,char**,int(*)(const char*,const char*)); + +/* +** Compilers are getting increasingly pedantic about type conversions +** as C evolves ever closer to Ada.... To work around the latest problems +** we have to define the following variant of strlen(). +*/ +#define lemonStrlen(X) ((int)strlen(X)) + +/* +** Compilers are starting to complain about the use of sprintf() and strcpy(), +** saying they are unsafe. So we define our own versions of those routines too. +** +** There are three routines here: lemon_sprintf(), lemon_vsprintf(), and +** lemon_addtext(). The first two are replacements for sprintf() and vsprintf(). +** The third is a helper routine for vsnprintf() that adds texts to the end of a +** buffer, making sure the buffer is always zero-terminated. +** +** The string formatter is a minimal subset of stdlib sprintf() supporting only +** a few simply conversions: +** +** %d +** %s +** %.*s +** +*/ +static void lemon_addtext( + char *zBuf, /* The buffer to which text is added */ + int *pnUsed, /* Slots of the buffer used so far */ + const char *zIn, /* Text to add */ + int nIn, /* Bytes of text to add. -1 to use strlen() */ + int iWidth /* Field width. Negative to left justify */ +){ + if( nIn<0 ) for(nIn=0; zIn[nIn]; nIn++){} + while( iWidth>nIn ){ zBuf[(*pnUsed)++] = ' '; iWidth--; } + if( nIn==0 ) return; + memcpy(&zBuf[*pnUsed], zIn, nIn); + *pnUsed += nIn; + while( (-iWidth)>nIn ){ zBuf[(*pnUsed)++] = ' '; iWidth++; } + zBuf[*pnUsed] = 0; +} +static int lemon_vsprintf(char *str, const char *zFormat, va_list ap){ + int i, j, k, c; + int nUsed = 0; + const char *z; + char zTemp[50]; + str[0] = 0; + for(i=j=0; (c = zFormat[i])!=0; i++){ + if( c=='%' ){ + int iWidth = 0; + lemon_addtext(str, &nUsed, &zFormat[j], i-j, 0); + c = zFormat[++i]; + if( isdigit(c) || (c=='-' && isdigit(zFormat[i+1])) ){ + if( c=='-' ) i++; + while( isdigit(zFormat[i]) ) iWidth = iWidth*10 + zFormat[i++] - '0'; + if( c=='-' ) iWidth = -iWidth; + c = zFormat[i]; + } + if( c=='d' ){ + int v = va_arg(ap, int); + if( v<0 ){ + lemon_addtext(str, &nUsed, "-", 1, iWidth); + v = -v; + }else if( v==0 ){ + lemon_addtext(str, &nUsed, "0", 1, iWidth); + } + k = 0; + while( v>0 ){ + k++; + zTemp[sizeof(zTemp)-k] = (v%10) + '0'; + v /= 10; + } + lemon_addtext(str, &nUsed, &zTemp[sizeof(zTemp)-k], k, iWidth); + }else if( c=='s' ){ + z = va_arg(ap, const char*); + lemon_addtext(str, &nUsed, z, -1, iWidth); + }else if( c=='.' && memcmp(&zFormat[i], ".*s", 3)==0 ){ + i += 2; + k = va_arg(ap, int); + z = va_arg(ap, const char*); + lemon_addtext(str, &nUsed, z, k, iWidth); + }else if( c=='%' ){ + lemon_addtext(str, &nUsed, "%", 1, 0); + }else{ + fprintf(stderr, "illegal format\n"); + exit(1); + } + j = i+1; + } + } + lemon_addtext(str, &nUsed, &zFormat[j], i-j, 0); + return nUsed; +} +static int lemon_sprintf(char *str, const char *format, ...){ + va_list ap; + int rc; + va_start(ap, format); + rc = lemon_vsprintf(str, format, ap); + va_end(ap); + return rc; +} +static void lemon_strcpy(char *dest, const char *src){ + while( (*(dest++) = *(src++))!=0 ){} +} +static void lemon_strcat(char *dest, const char *src){ + while( *dest ) dest++; + lemon_strcpy(dest, src); +} + + +/* a few forward declarations... */ +struct rule; +struct lemon; +struct action; + +static struct action *Action_new(void); +static struct action *Action_sort(struct action *); + +/********** From the file "build.h" ************************************/ +void FindRulePrecedences(); +void FindFirstSets(); +void FindStates(); +void FindLinks(); +void FindFollowSets(); +void FindActions(); + +/********* From the file "configlist.h" *********************************/ +void Configlist_init(void); +struct config *Configlist_add(struct rule *, int); +struct config *Configlist_addbasis(struct rule *, int); +void Configlist_closure(struct lemon *); +void Configlist_sort(void); +void Configlist_sortbasis(void); +struct config *Configlist_return(void); +struct config *Configlist_basis(void); +void Configlist_eat(struct config *); +void Configlist_reset(void); + +/********* From the file "error.h" ***************************************/ +void ErrorMsg(const char *, int,const char *, ...); + +/****** From the file "option.h" ******************************************/ +enum option_type { OPT_FLAG=1, OPT_INT, OPT_DBL, OPT_STR, + OPT_FFLAG, OPT_FINT, OPT_FDBL, OPT_FSTR}; +struct s_options { + enum option_type type; + const char *label; + char *arg; + const char *message; +}; +int OptInit(char**,struct s_options*,FILE*); +int OptNArgs(void); +char *OptArg(int); +void OptErr(int); +void OptPrint(void); + +/******** From the file "parse.h" *****************************************/ +void Parse(struct lemon *lemp); + +/********* From the file "plink.h" ***************************************/ +struct plink *Plink_new(void); +void Plink_add(struct plink **, struct config *); +void Plink_copy(struct plink **, struct plink *); +void Plink_delete(struct plink *); + +/********** From the file "report.h" *************************************/ +void Reprint(struct lemon *); +void ReportOutput(struct lemon *); +void ReportTable(struct lemon *, int); +void ReportHeader(struct lemon *); +void CompressTables(struct lemon *); +void ResortStates(struct lemon *); + +/********** From the file "set.h" ****************************************/ +void SetSize(int); /* All sets will be of size N */ +char *SetNew(void); /* A new set for element 0..N */ +void SetFree(char*); /* Deallocate a set */ +int SetAdd(char*,int); /* Add element to a set */ +int SetUnion(char *,char *); /* A <- A U B, thru element N */ +#define SetFind(X,Y) (X[Y]) /* True if Y is in set X */ + +/********** From the file "struct.h" *************************************/ +/* +** Principal data structures for the LEMON parser generator. +*/ + +typedef enum {LEMON_FALSE=0, LEMON_TRUE} Boolean; + +/* Symbols (terminals and nonterminals) of the grammar are stored +** in the following: */ +enum symbol_type { + TERMINAL, + NONTERMINAL, + MULTITERMINAL +}; +enum e_assoc { + LEFT, + RIGHT, + NONE, + UNK +}; +struct symbol { + const char *name; /* Name of the symbol */ + int index; /* Index number for this symbol */ + enum symbol_type type; /* Symbols are all either TERMINALS or NTs */ + struct rule *rule; /* Linked list of rules of this (if an NT) */ + struct symbol *fallback; /* fallback token in case this token doesn't parse */ + int prec; /* Precedence if defined (-1 otherwise) */ + enum e_assoc assoc; /* Associativity if precedence is defined */ + char *firstset; /* First-set for all rules of this symbol */ + Boolean lambda; /* True if NT and can generate an empty string */ + int useCnt; /* Number of times used */ + char *destructor; /* Code which executes whenever this symbol is + ** popped from the stack during error processing */ + int destLineno; /* Line number for start of destructor */ + char *datatype; /* The data type of information held by this + ** object. Only used if type==NONTERMINAL */ + int dtnum; /* The data type number. In the parser, the value + ** stack is a union. The .yy%d element of this + ** union is the correct data type for this object */ + /* The following fields are used by MULTITERMINALs only */ + int nsubsym; /* Number of constituent symbols in the MULTI */ + struct symbol **subsym; /* Array of constituent symbols */ +}; + +/* Each production rule in the grammar is stored in the following +** structure. */ +struct rule { + struct symbol *lhs; /* Left-hand side of the rule */ + const char *lhsalias; /* Alias for the LHS (NULL if none) */ + int lhsStart; /* True if left-hand side is the start symbol */ + int ruleline; /* Line number for the rule */ + int nrhs; /* Number of RHS symbols */ + struct symbol **rhs; /* The RHS symbols */ + const char **rhsalias; /* An alias for each RHS symbol (NULL if none) */ + int line; /* Line number at which code begins */ + const char *code; /* The code executed when this rule is reduced */ + struct symbol *precsym; /* Precedence symbol for this rule */ + int index; /* An index number for this rule */ + Boolean canReduce; /* True if this rule is ever reduced */ + struct rule *nextlhs; /* Next rule with the same LHS */ + struct rule *next; /* Next rule in the global list */ +}; + +/* A configuration is a production rule of the grammar together with +** a mark (dot) showing how much of that rule has been processed so far. +** Configurations also contain a follow-set which is a list of terminal +** symbols which are allowed to immediately follow the end of the rule. +** Every configuration is recorded as an instance of the following: */ +enum cfgstatus { + COMPLETE, + INCOMPLETE +}; +struct config { + struct rule *rp; /* The rule upon which the configuration is based */ + int dot; /* The parse point */ + char *fws; /* Follow-set for this configuration only */ + struct plink *fplp; /* Follow-set forward propagation links */ + struct plink *bplp; /* Follow-set backwards propagation links */ + struct state *stp; /* Pointer to state which contains this */ + enum cfgstatus status; /* used during followset and shift computations */ + struct config *next; /* Next configuration in the state */ + struct config *bp; /* The next basis configuration */ +}; + +enum e_action { + SHIFT, + ACCEPT, + REDUCE, + ERROR, + SSCONFLICT, /* A shift/shift conflict */ + SRCONFLICT, /* Was a reduce, but part of a conflict */ + RRCONFLICT, /* Was a reduce, but part of a conflict */ + SH_RESOLVED, /* Was a shift. Precedence resolved conflict */ + RD_RESOLVED, /* Was reduce. Precedence resolved conflict */ + NOT_USED /* Deleted by compression */ +}; + +/* Every shift or reduce operation is stored as one of the following */ +struct action { + struct symbol *sp; /* The look-ahead symbol */ + enum e_action type; + union { + struct state *stp; /* The new state, if a shift */ + struct rule *rp; /* The rule, if a reduce */ + } x; + struct action *next; /* Next action for this state */ + struct action *collide; /* Next action with the same hash */ +}; + +/* Each state of the generated parser's finite state machine +** is encoded as an instance of the following structure. */ +struct state { + struct config *bp; /* The basis configurations for this state */ + struct config *cfp; /* All configurations in this set */ + int statenum; /* Sequential number for this state */ + struct action *ap; /* Array of actions for this state */ + int nTknAct, nNtAct; /* Number of actions on terminals and nonterminals */ + int iTknOfst, iNtOfst; /* yy_action[] offset for terminals and nonterms */ + int iDflt; /* Default action */ +}; +#define NO_OFFSET (-2147483647) + +/* A followset propagation link indicates that the contents of one +** configuration followset should be propagated to another whenever +** the first changes. */ +struct plink { + struct config *cfp; /* The configuration to which linked */ + struct plink *next; /* The next propagate link */ +}; + +/* The state vector for the entire parser generator is recorded as +** follows. (LEMON uses no global variables and makes little use of +** static variables. Fields in the following structure can be thought +** of as begin global variables in the program.) */ +struct lemon { + struct state **sorted; /* Table of states sorted by state number */ + struct rule *rule; /* List of all rules */ + int nstate; /* Number of states */ + int nrule; /* Number of rules */ + int nsymbol; /* Number of terminal and nonterminal symbols */ + int nterminal; /* Number of terminal symbols */ + struct symbol **symbols; /* Sorted array of pointers to symbols */ + int errorcnt; /* Number of errors */ + struct symbol *errsym; /* The error symbol */ + struct symbol *wildcard; /* Token that matches anything */ + char *name; /* Name of the generated parser */ + char *arg; /* Declaration of the 3th argument to parser */ + char *tokentype; /* Type of terminal symbols in the parser stack */ + char *vartype; /* The default type of non-terminal symbols */ + char *start; /* Name of the start symbol for the grammar */ + char *stacksize; /* Size of the parser stack */ + char *include; /* Code to put at the start of the C file */ + char *error; /* Code to execute when an error is seen */ + char *overflow; /* Code to execute on a stack overflow */ + char *failure; /* Code to execute on parser failure */ + char *accept; /* Code to execute when the parser excepts */ + char *extracode; /* Code appended to the generated file */ + char *tokendest; /* Code to execute to destroy token data */ + char *vardest; /* Code for the default non-terminal destructor */ + char *filename; /* Name of the input file */ + char *outname; /* Name of the current output file */ + char *tokenprefix; /* A prefix added to token names in the .h file */ + int nconflict; /* Number of parsing conflicts */ + int tablesize; /* Size of the parse tables */ + int basisflag; /* Print only basis configurations */ + int has_fallback; /* True if any %fallback is seen in the grammar */ + int nolinenosflag; /* True if #line statements should not be printed */ + char *argv0; /* Name of the program */ +}; + +#define MemoryCheck(X) if((X)==0){ \ + extern void memory_error(); \ + memory_error(); \ +} + +/**************** From the file "table.h" *********************************/ +/* +** All code in this file has been automatically generated +** from a specification in the file +** "table.q" +** by the associative array code building program "aagen". +** Do not edit this file! Instead, edit the specification +** file, then rerun aagen. +*/ +/* +** Code for processing tables in the LEMON parser generator. +*/ +/* Routines for handling a strings */ + +const char *Strsafe(const char *); + +void Strsafe_init(void); +int Strsafe_insert(const char *); +const char *Strsafe_find(const char *); + +/* Routines for handling symbols of the grammar */ + +struct symbol *Symbol_new(const char *); +int Symbolcmpp(const void *, const void *); +void Symbol_init(void); +int Symbol_insert(struct symbol *, const char *); +struct symbol *Symbol_find(const char *); +struct symbol *Symbol_Nth(int); +int Symbol_count(void); +struct symbol **Symbol_arrayof(void); + +/* Routines to manage the state table */ + +int Configcmp(const char *, const char *); +struct state *State_new(void); +void State_init(void); +int State_insert(struct state *, struct config *); +struct state *State_find(struct config *); +struct state **State_arrayof(/* */); + +/* Routines used for efficiency in Configlist_add */ + +void Configtable_init(void); +int Configtable_insert(struct config *); +struct config *Configtable_find(struct config *); +void Configtable_clear(int(*)(struct config *)); + +/****************** From the file "action.c" *******************************/ +/* +** Routines processing parser actions in the LEMON parser generator. +*/ + +/* Allocate a new parser action */ +static struct action *Action_new(void){ + static struct action *freelist = 0; + struct action *newaction; + + if( freelist==0 ){ + int i; + int amt = 100; + freelist = (struct action *)calloc(amt, sizeof(struct action)); + if( freelist==0 ){ + fprintf(stderr,"Unable to allocate memory for a new parser action."); + exit(1); + } + for(i=0; inext; + return newaction; +} + +/* Compare two actions for sorting purposes. Return negative, zero, or +** positive if the first action is less than, equal to, or greater than +** the first +*/ +static int actioncmp( + struct action *ap1, + struct action *ap2 +){ + int rc; + rc = ap1->sp->index - ap2->sp->index; + if( rc==0 ){ + rc = (int)ap1->type - (int)ap2->type; + } + if( rc==0 && ap1->type==REDUCE ){ + rc = ap1->x.rp->index - ap2->x.rp->index; + } + if( rc==0 ){ + rc = (int) (ap2 - ap1); + } + return rc; +} + +/* Sort parser actions */ +static struct action *Action_sort( + struct action *ap +){ + ap = (struct action *)msort((char *)ap,(char **)&ap->next, + (int(*)(const char*,const char*))actioncmp); + return ap; +} + +void Action_add( + struct action **app, + enum e_action type, + struct symbol *sp, + char *arg +){ + struct action *newaction; + newaction = Action_new(); + newaction->next = *app; + *app = newaction; + newaction->type = type; + newaction->sp = sp; + if( type==SHIFT ){ + newaction->x.stp = (struct state *)arg; + }else{ + newaction->x.rp = (struct rule *)arg; + } +} +/********************** New code to implement the "acttab" module ***********/ +/* +** This module implements routines use to construct the yy_action[] table. +*/ + +/* +** The state of the yy_action table under construction is an instance of +** the following structure. +** +** The yy_action table maps the pair (state_number, lookahead) into an +** action_number. The table is an array of integers pairs. The state_number +** determines an initial offset into the yy_action array. The lookahead +** value is then added to this initial offset to get an index X into the +** yy_action array. If the aAction[X].lookahead equals the value of the +** of the lookahead input, then the value of the action_number output is +** aAction[X].action. If the lookaheads do not match then the +** default action for the state_number is returned. +** +** All actions associated with a single state_number are first entered +** into aLookahead[] using multiple calls to acttab_action(). Then the +** actions for that single state_number are placed into the aAction[] +** array with a single call to acttab_insert(). The acttab_insert() call +** also resets the aLookahead[] array in preparation for the next +** state number. +*/ +struct lookahead_action { + int lookahead; /* Value of the lookahead token */ + int action; /* Action to take on the given lookahead */ +}; +typedef struct acttab acttab; +struct acttab { + int nAction; /* Number of used slots in aAction[] */ + int nActionAlloc; /* Slots allocated for aAction[] */ + struct lookahead_action + *aAction, /* The yy_action[] table under construction */ + *aLookahead; /* A single new transaction set */ + int mnLookahead; /* Minimum aLookahead[].lookahead */ + int mnAction; /* Action associated with mnLookahead */ + int mxLookahead; /* Maximum aLookahead[].lookahead */ + int nLookahead; /* Used slots in aLookahead[] */ + int nLookaheadAlloc; /* Slots allocated in aLookahead[] */ +}; + +/* Return the number of entries in the yy_action table */ +#define acttab_size(X) ((X)->nAction) + +/* The value for the N-th entry in yy_action */ +#define acttab_yyaction(X,N) ((X)->aAction[N].action) + +/* The value for the N-th entry in yy_lookahead */ +#define acttab_yylookahead(X,N) ((X)->aAction[N].lookahead) + +/* Free all memory associated with the given acttab */ +void acttab_free(acttab *p){ + free( p->aAction ); + free( p->aLookahead ); + free( p ); +} + +/* Allocate a new acttab structure */ +acttab *acttab_alloc(void){ + acttab *p = (acttab *) calloc( 1, sizeof(*p) ); + if( p==0 ){ + fprintf(stderr,"Unable to allocate memory for a new acttab."); + exit(1); + } + memset(p, 0, sizeof(*p)); + return p; +} + +/* Add a new action to the current transaction set. +** +** This routine is called once for each lookahead for a particular +** state. +*/ +void acttab_action(acttab *p, int lookahead, int action){ + if( p->nLookahead>=p->nLookaheadAlloc ){ + p->nLookaheadAlloc += 25; + p->aLookahead = (struct lookahead_action *) realloc( p->aLookahead, + sizeof(p->aLookahead[0])*p->nLookaheadAlloc ); + if( p->aLookahead==0 ){ + fprintf(stderr,"malloc failed\n"); + exit(1); + } + } + if( p->nLookahead==0 ){ + p->mxLookahead = lookahead; + p->mnLookahead = lookahead; + p->mnAction = action; + }else{ + if( p->mxLookaheadmxLookahead = lookahead; + if( p->mnLookahead>lookahead ){ + p->mnLookahead = lookahead; + p->mnAction = action; + } + } + p->aLookahead[p->nLookahead].lookahead = lookahead; + p->aLookahead[p->nLookahead].action = action; + p->nLookahead++; +} + +/* +** Add the transaction set built up with prior calls to acttab_action() +** into the current action table. Then reset the transaction set back +** to an empty set in preparation for a new round of acttab_action() calls. +** +** Return the offset into the action table of the new transaction. +*/ +int acttab_insert(acttab *p){ + int i, j, k, n; + assert( p->nLookahead>0 ); + + /* Make sure we have enough space to hold the expanded action table + ** in the worst case. The worst case occurs if the transaction set + ** must be appended to the current action table + */ + n = p->mxLookahead + 1; + if( p->nAction + n >= p->nActionAlloc ){ + int oldAlloc = p->nActionAlloc; + p->nActionAlloc = p->nAction + n + p->nActionAlloc + 20; + p->aAction = (struct lookahead_action *) realloc( p->aAction, + sizeof(p->aAction[0])*p->nActionAlloc); + if( p->aAction==0 ){ + fprintf(stderr,"malloc failed\n"); + exit(1); + } + for(i=oldAlloc; inActionAlloc; i++){ + p->aAction[i].lookahead = -1; + p->aAction[i].action = -1; + } + } + + /* Scan the existing action table looking for an offset that is a + ** duplicate of the current transaction set. Fall out of the loop + ** if and when the duplicate is found. + ** + ** i is the index in p->aAction[] where p->mnLookahead is inserted. + */ + for(i=p->nAction-1; i>=0; i--){ + if( p->aAction[i].lookahead==p->mnLookahead ){ + /* All lookaheads and actions in the aLookahead[] transaction + ** must match against the candidate aAction[i] entry. */ + if( p->aAction[i].action!=p->mnAction ) continue; + for(j=0; jnLookahead; j++){ + k = p->aLookahead[j].lookahead - p->mnLookahead + i; + if( k<0 || k>=p->nAction ) break; + if( p->aLookahead[j].lookahead!=p->aAction[k].lookahead ) break; + if( p->aLookahead[j].action!=p->aAction[k].action ) break; + } + if( jnLookahead ) continue; + + /* No possible lookahead value that is not in the aLookahead[] + ** transaction is allowed to match aAction[i] */ + n = 0; + for(j=0; jnAction; j++){ + if( p->aAction[j].lookahead<0 ) continue; + if( p->aAction[j].lookahead==j+p->mnLookahead-i ) n++; + } + if( n==p->nLookahead ){ + break; /* An exact match is found at offset i */ + } + } + } + + /* If no existing offsets exactly match the current transaction, find an + ** an empty offset in the aAction[] table in which we can add the + ** aLookahead[] transaction. + */ + if( i<0 ){ + /* Look for holes in the aAction[] table that fit the current + ** aLookahead[] transaction. Leave i set to the offset of the hole. + ** If no holes are found, i is left at p->nAction, which means the + ** transaction will be appended. */ + for(i=0; inActionAlloc - p->mxLookahead; i++){ + if( p->aAction[i].lookahead<0 ){ + for(j=0; jnLookahead; j++){ + k = p->aLookahead[j].lookahead - p->mnLookahead + i; + if( k<0 ) break; + if( p->aAction[k].lookahead>=0 ) break; + } + if( jnLookahead ) continue; + for(j=0; jnAction; j++){ + if( p->aAction[j].lookahead==j+p->mnLookahead-i ) break; + } + if( j==p->nAction ){ + break; /* Fits in empty slots */ + } + } + } + } + /* Insert transaction set at index i. */ + for(j=0; jnLookahead; j++){ + k = p->aLookahead[j].lookahead - p->mnLookahead + i; + p->aAction[k] = p->aLookahead[j]; + if( k>=p->nAction ) p->nAction = k+1; + } + p->nLookahead = 0; + + /* Return the offset that is added to the lookahead in order to get the + ** index into yy_action of the action */ + return i - p->mnLookahead; +} + +/********************** From the file "build.c" *****************************/ +/* +** Routines to construction the finite state machine for the LEMON +** parser generator. +*/ + +/* Find a precedence symbol of every rule in the grammar. +** +** Those rules which have a precedence symbol coded in the input +** grammar using the "[symbol]" construct will already have the +** rp->precsym field filled. Other rules take as their precedence +** symbol the first RHS symbol with a defined precedence. If there +** are not RHS symbols with a defined precedence, the precedence +** symbol field is left blank. +*/ +void FindRulePrecedences(struct lemon *xp) +{ + struct rule *rp; + for(rp=xp->rule; rp; rp=rp->next){ + if( rp->precsym==0 ){ + int i, j; + for(i=0; inrhs && rp->precsym==0; i++){ + struct symbol *sp = rp->rhs[i]; + if( sp->type==MULTITERMINAL ){ + for(j=0; jnsubsym; j++){ + if( sp->subsym[j]->prec>=0 ){ + rp->precsym = sp->subsym[j]; + break; + } + } + }else if( sp->prec>=0 ){ + rp->precsym = rp->rhs[i]; + } + } + } + } + return; +} + +/* Find all nonterminals which will generate the empty string. +** Then go back and compute the first sets of every nonterminal. +** The first set is the set of all terminal symbols which can begin +** a string generated by that nonterminal. +*/ +void FindFirstSets(struct lemon *lemp) +{ + int i, j; + struct rule *rp; + int progress; + + for(i=0; insymbol; i++){ + lemp->symbols[i]->lambda = LEMON_FALSE; + } + for(i=lemp->nterminal; insymbol; i++){ + lemp->symbols[i]->firstset = SetNew(); + } + + /* First compute all lambdas */ + do{ + progress = 0; + for(rp=lemp->rule; rp; rp=rp->next){ + if( rp->lhs->lambda ) continue; + for(i=0; inrhs; i++){ + struct symbol *sp = rp->rhs[i]; + assert( sp->type==NONTERMINAL || sp->lambda==LEMON_FALSE ); + if( sp->lambda==LEMON_FALSE ) break; + } + if( i==rp->nrhs ){ + rp->lhs->lambda = LEMON_TRUE; + progress = 1; + } + } + }while( progress ); + + /* Now compute all first sets */ + do{ + struct symbol *s1, *s2; + progress = 0; + for(rp=lemp->rule; rp; rp=rp->next){ + s1 = rp->lhs; + for(i=0; inrhs; i++){ + s2 = rp->rhs[i]; + if( s2->type==TERMINAL ){ + progress += SetAdd(s1->firstset,s2->index); + break; + }else if( s2->type==MULTITERMINAL ){ + for(j=0; jnsubsym; j++){ + progress += SetAdd(s1->firstset,s2->subsym[j]->index); + } + break; + }else if( s1==s2 ){ + if( s1->lambda==LEMON_FALSE ) break; + }else{ + progress += SetUnion(s1->firstset,s2->firstset); + if( s2->lambda==LEMON_FALSE ) break; + } + } + } + }while( progress ); + return; +} + +/* Compute all LR(0) states for the grammar. Links +** are added to between some states so that the LR(1) follow sets +** can be computed later. +*/ +PRIVATE struct state *getstate(struct lemon *); /* forward reference */ +void FindStates(struct lemon *lemp) +{ + struct symbol *sp; + struct rule *rp; + + Configlist_init(); + + /* Find the start symbol */ + if( lemp->start ){ + sp = Symbol_find(lemp->start); + if( sp==0 ){ + ErrorMsg(lemp->filename,0, +"The specified start symbol \"%s\" is not \ +in a nonterminal of the grammar. \"%s\" will be used as the start \ +symbol instead.",lemp->start,lemp->rule->lhs->name); + lemp->errorcnt++; + sp = lemp->rule->lhs; + } + }else{ + sp = lemp->rule->lhs; + } + + /* Make sure the start symbol doesn't occur on the right-hand side of + ** any rule. Report an error if it does. (YACC would generate a new + ** start symbol in this case.) */ + for(rp=lemp->rule; rp; rp=rp->next){ + int i; + for(i=0; inrhs; i++){ + if( rp->rhs[i]==sp ){ /* FIX ME: Deal with multiterminals */ + ErrorMsg(lemp->filename,0, +"The start symbol \"%s\" occurs on the \ +right-hand side of a rule. This will result in a parser which \ +does not work properly.",sp->name); + lemp->errorcnt++; + } + } + } + + /* The basis configuration set for the first state + ** is all rules which have the start symbol as their + ** left-hand side */ + for(rp=sp->rule; rp; rp=rp->nextlhs){ + struct config *newcfp; + rp->lhsStart = 1; + newcfp = Configlist_addbasis(rp,0); + SetAdd(newcfp->fws,0); + } + + /* Compute the first state. All other states will be + ** computed automatically during the computation of the first one. + ** The returned pointer to the first state is not used. */ + (void)getstate(lemp); + return; +} + +/* Return a pointer to a state which is described by the configuration +** list which has been built from calls to Configlist_add. +*/ +PRIVATE void buildshifts(struct lemon *, struct state *); /* Forwd ref */ +PRIVATE struct state *getstate(struct lemon *lemp) +{ + struct config *cfp, *bp; + struct state *stp; + + /* Extract the sorted basis of the new state. The basis was constructed + ** by prior calls to "Configlist_addbasis()". */ + Configlist_sortbasis(); + bp = Configlist_basis(); + + /* Get a state with the same basis */ + stp = State_find(bp); + if( stp ){ + /* A state with the same basis already exists! Copy all the follow-set + ** propagation links from the state under construction into the + ** preexisting state, then return a pointer to the preexisting state */ + struct config *x, *y; + for(x=bp, y=stp->bp; x && y; x=x->bp, y=y->bp){ + Plink_copy(&y->bplp,x->bplp); + Plink_delete(x->fplp); + x->fplp = x->bplp = 0; + } + cfp = Configlist_return(); + Configlist_eat(cfp); + }else{ + /* This really is a new state. Construct all the details */ + Configlist_closure(lemp); /* Compute the configuration closure */ + Configlist_sort(); /* Sort the configuration closure */ + cfp = Configlist_return(); /* Get a pointer to the config list */ + stp = State_new(); /* A new state structure */ + MemoryCheck(stp); + stp->bp = bp; /* Remember the configuration basis */ + stp->cfp = cfp; /* Remember the configuration closure */ + stp->statenum = lemp->nstate++; /* Every state gets a sequence number */ + stp->ap = 0; /* No actions, yet. */ + State_insert(stp,stp->bp); /* Add to the state table */ + buildshifts(lemp,stp); /* Recursively compute successor states */ + } + return stp; +} + +/* +** Return true if two symbols are the same. +*/ +int same_symbol(struct symbol *a, struct symbol *b) +{ + int i; + if( a==b ) return 1; + if( a->type!=MULTITERMINAL ) return 0; + if( b->type!=MULTITERMINAL ) return 0; + if( a->nsubsym!=b->nsubsym ) return 0; + for(i=0; insubsym; i++){ + if( a->subsym[i]!=b->subsym[i] ) return 0; + } + return 1; +} + +/* Construct all successor states to the given state. A "successor" +** state is any state which can be reached by a shift action. +*/ +PRIVATE void buildshifts(struct lemon *lemp, struct state *stp) +{ + struct config *cfp; /* For looping thru the config closure of "stp" */ + struct config *bcfp; /* For the inner loop on config closure of "stp" */ + struct config *newcfg; /* */ + struct symbol *sp; /* Symbol following the dot in configuration "cfp" */ + struct symbol *bsp; /* Symbol following the dot in configuration "bcfp" */ + struct state *newstp; /* A pointer to a successor state */ + + /* Each configuration becomes complete after it contibutes to a successor + ** state. Initially, all configurations are incomplete */ + for(cfp=stp->cfp; cfp; cfp=cfp->next) cfp->status = INCOMPLETE; + + /* Loop through all configurations of the state "stp" */ + for(cfp=stp->cfp; cfp; cfp=cfp->next){ + if( cfp->status==COMPLETE ) continue; /* Already used by inner loop */ + if( cfp->dot>=cfp->rp->nrhs ) continue; /* Can't shift this config */ + Configlist_reset(); /* Reset the new config set */ + sp = cfp->rp->rhs[cfp->dot]; /* Symbol after the dot */ + + /* For every configuration in the state "stp" which has the symbol "sp" + ** following its dot, add the same configuration to the basis set under + ** construction but with the dot shifted one symbol to the right. */ + for(bcfp=cfp; bcfp; bcfp=bcfp->next){ + if( bcfp->status==COMPLETE ) continue; /* Already used */ + if( bcfp->dot>=bcfp->rp->nrhs ) continue; /* Can't shift this one */ + bsp = bcfp->rp->rhs[bcfp->dot]; /* Get symbol after dot */ + if( !same_symbol(bsp,sp) ) continue; /* Must be same as for "cfp" */ + bcfp->status = COMPLETE; /* Mark this config as used */ + newcfg = Configlist_addbasis(bcfp->rp,bcfp->dot+1); + Plink_add(&newcfg->bplp,bcfp); + } + + /* Get a pointer to the state described by the basis configuration set + ** constructed in the preceding loop */ + newstp = getstate(lemp); + + /* The state "newstp" is reached from the state "stp" by a shift action + ** on the symbol "sp" */ + if( sp->type==MULTITERMINAL ){ + int i; + for(i=0; insubsym; i++){ + Action_add(&stp->ap,SHIFT,sp->subsym[i],(char*)newstp); + } + }else{ + Action_add(&stp->ap,SHIFT,sp,(char *)newstp); + } + } +} + +/* +** Construct the propagation links +*/ +void FindLinks(struct lemon *lemp) +{ + int i; + struct config *cfp, *other; + struct state *stp; + struct plink *plp; + + /* Housekeeping detail: + ** Add to every propagate link a pointer back to the state to + ** which the link is attached. */ + for(i=0; instate; i++){ + stp = lemp->sorted[i]; + for(cfp=stp->cfp; cfp; cfp=cfp->next){ + cfp->stp = stp; + } + } + + /* Convert all backlinks into forward links. Only the forward + ** links are used in the follow-set computation. */ + for(i=0; instate; i++){ + stp = lemp->sorted[i]; + for(cfp=stp->cfp; cfp; cfp=cfp->next){ + for(plp=cfp->bplp; plp; plp=plp->next){ + other = plp->cfp; + Plink_add(&other->fplp,cfp); + } + } + } +} + +/* Compute all followsets. +** +** A followset is the set of all symbols which can come immediately +** after a configuration. +*/ +void FindFollowSets(struct lemon *lemp) +{ + int i; + struct config *cfp; + struct plink *plp; + int progress; + int change; + + for(i=0; instate; i++){ + for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){ + cfp->status = INCOMPLETE; + } + } + + do{ + progress = 0; + for(i=0; instate; i++){ + for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){ + if( cfp->status==COMPLETE ) continue; + for(plp=cfp->fplp; plp; plp=plp->next){ + change = SetUnion(plp->cfp->fws,cfp->fws); + if( change ){ + plp->cfp->status = INCOMPLETE; + progress = 1; + } + } + cfp->status = COMPLETE; + } + } + }while( progress ); +} + +static int resolve_conflict(struct action *,struct action *); + +/* Compute the reduce actions, and resolve conflicts. +*/ +void FindActions(struct lemon *lemp) +{ + int i,j; + struct config *cfp; + struct state *stp; + struct symbol *sp; + struct rule *rp; + + /* Add all of the reduce actions + ** A reduce action is added for each element of the followset of + ** a configuration which has its dot at the extreme right. + */ + for(i=0; instate; i++){ /* Loop over all states */ + stp = lemp->sorted[i]; + for(cfp=stp->cfp; cfp; cfp=cfp->next){ /* Loop over all configurations */ + if( cfp->rp->nrhs==cfp->dot ){ /* Is dot at extreme right? */ + for(j=0; jnterminal; j++){ + if( SetFind(cfp->fws,j) ){ + /* Add a reduce action to the state "stp" which will reduce by the + ** rule "cfp->rp" if the lookahead symbol is "lemp->symbols[j]" */ + Action_add(&stp->ap,REDUCE,lemp->symbols[j],(char *)cfp->rp); + } + } + } + } + } + + /* Add the accepting token */ + if( lemp->start ){ + sp = Symbol_find(lemp->start); + if( sp==0 ) sp = lemp->rule->lhs; + }else{ + sp = lemp->rule->lhs; + } + /* Add to the first state (which is always the starting state of the + ** finite state machine) an action to ACCEPT if the lookahead is the + ** start nonterminal. */ + Action_add(&lemp->sorted[0]->ap,ACCEPT,sp,0); + + /* Resolve conflicts */ + for(i=0; instate; i++){ + struct action *ap, *nap; + struct state *stp; + stp = lemp->sorted[i]; + /* assert( stp->ap ); */ + stp->ap = Action_sort(stp->ap); + for(ap=stp->ap; ap && ap->next; ap=ap->next){ + for(nap=ap->next; nap && nap->sp==ap->sp; nap=nap->next){ + /* The two actions "ap" and "nap" have the same lookahead. + ** Figure out which one should be used */ + lemp->nconflict += resolve_conflict(ap,nap); + } + } + } + + /* Report an error for each rule that can never be reduced. */ + for(rp=lemp->rule; rp; rp=rp->next) rp->canReduce = LEMON_FALSE; + for(i=0; instate; i++){ + struct action *ap; + for(ap=lemp->sorted[i]->ap; ap; ap=ap->next){ + if( ap->type==REDUCE ) ap->x.rp->canReduce = LEMON_TRUE; + } + } + for(rp=lemp->rule; rp; rp=rp->next){ + if( rp->canReduce ) continue; + ErrorMsg(lemp->filename,rp->ruleline,"This rule can not be reduced.\n"); + lemp->errorcnt++; + } +} + +/* Resolve a conflict between the two given actions. If the +** conflict can't be resolved, return non-zero. +** +** NO LONGER TRUE: +** To resolve a conflict, first look to see if either action +** is on an error rule. In that case, take the action which +** is not associated with the error rule. If neither or both +** actions are associated with an error rule, then try to +** use precedence to resolve the conflict. +** +** If either action is a SHIFT, then it must be apx. This +** function won't work if apx->type==REDUCE and apy->type==SHIFT. +*/ +static int resolve_conflict( + struct action *apx, + struct action *apy +){ + struct symbol *spx, *spy; + int errcnt = 0; + assert( apx->sp==apy->sp ); /* Otherwise there would be no conflict */ + if( apx->type==SHIFT && apy->type==SHIFT ){ + apy->type = SSCONFLICT; + errcnt++; + } + if( apx->type==SHIFT && apy->type==REDUCE ){ + spx = apx->sp; + spy = apy->x.rp->precsym; + if( spy==0 || spx->prec<0 || spy->prec<0 ){ + /* Not enough precedence information. */ + apy->type = SRCONFLICT; + errcnt++; + }else if( spx->prec>spy->prec ){ /* higher precedence wins */ + apy->type = RD_RESOLVED; + }else if( spx->precprec ){ + apx->type = SH_RESOLVED; + }else if( spx->prec==spy->prec && spx->assoc==RIGHT ){ /* Use operator */ + apy->type = RD_RESOLVED; /* associativity */ + }else if( spx->prec==spy->prec && spx->assoc==LEFT ){ /* to break tie */ + apx->type = SH_RESOLVED; + }else{ + assert( spx->prec==spy->prec && spx->assoc==NONE ); + apx->type = ERROR; + } + }else if( apx->type==REDUCE && apy->type==REDUCE ){ + spx = apx->x.rp->precsym; + spy = apy->x.rp->precsym; + if( spx==0 || spy==0 || spx->prec<0 || + spy->prec<0 || spx->prec==spy->prec ){ + apy->type = RRCONFLICT; + errcnt++; + }else if( spx->prec>spy->prec ){ + apy->type = RD_RESOLVED; + }else if( spx->precprec ){ + apx->type = RD_RESOLVED; + } + }else{ + assert( + apx->type==SH_RESOLVED || + apx->type==RD_RESOLVED || + apx->type==SSCONFLICT || + apx->type==SRCONFLICT || + apx->type==RRCONFLICT || + apy->type==SH_RESOLVED || + apy->type==RD_RESOLVED || + apy->type==SSCONFLICT || + apy->type==SRCONFLICT || + apy->type==RRCONFLICT + ); + /* The REDUCE/SHIFT case cannot happen because SHIFTs come before + ** REDUCEs on the list. If we reach this point it must be because + ** the parser conflict had already been resolved. */ + } + return errcnt; +} +/********************* From the file "configlist.c" *************************/ +/* +** Routines to processing a configuration list and building a state +** in the LEMON parser generator. +*/ + +static struct config *freelist = 0; /* List of free configurations */ +static struct config *current = 0; /* Top of list of configurations */ +static struct config **currentend = 0; /* Last on list of configs */ +static struct config *basis = 0; /* Top of list of basis configs */ +static struct config **basisend = 0; /* End of list of basis configs */ + +/* Return a pointer to a new configuration */ +PRIVATE struct config *newconfig(){ + struct config *newcfg; + if( freelist==0 ){ + int i; + int amt = 3; + freelist = (struct config *)calloc( amt, sizeof(struct config) ); + if( freelist==0 ){ + fprintf(stderr,"Unable to allocate memory for a new configuration."); + exit(1); + } + for(i=0; inext; + return newcfg; +} + +/* The configuration "old" is no longer used */ +PRIVATE void deleteconfig(struct config *old) +{ + old->next = freelist; + freelist = old; +} + +/* Initialized the configuration list builder */ +void Configlist_init(){ + current = 0; + currentend = ¤t; + basis = 0; + basisend = &basis; + Configtable_init(); + return; +} + +/* Initialized the configuration list builder */ +void Configlist_reset(){ + current = 0; + currentend = ¤t; + basis = 0; + basisend = &basis; + Configtable_clear(0); + return; +} + +/* Add another configuration to the configuration list */ +struct config *Configlist_add( + struct rule *rp, /* The rule */ + int dot /* Index into the RHS of the rule where the dot goes */ +){ + struct config *cfp, model; + + assert( currentend!=0 ); + model.rp = rp; + model.dot = dot; + cfp = Configtable_find(&model); + if( cfp==0 ){ + cfp = newconfig(); + cfp->rp = rp; + cfp->dot = dot; + cfp->fws = SetNew(); + cfp->stp = 0; + cfp->fplp = cfp->bplp = 0; + cfp->next = 0; + cfp->bp = 0; + *currentend = cfp; + currentend = &cfp->next; + Configtable_insert(cfp); + } + return cfp; +} + +/* Add a basis configuration to the configuration list */ +struct config *Configlist_addbasis(struct rule *rp, int dot) +{ + struct config *cfp, model; + + assert( basisend!=0 ); + assert( currentend!=0 ); + model.rp = rp; + model.dot = dot; + cfp = Configtable_find(&model); + if( cfp==0 ){ + cfp = newconfig(); + cfp->rp = rp; + cfp->dot = dot; + cfp->fws = SetNew(); + cfp->stp = 0; + cfp->fplp = cfp->bplp = 0; + cfp->next = 0; + cfp->bp = 0; + *currentend = cfp; + currentend = &cfp->next; + *basisend = cfp; + basisend = &cfp->bp; + Configtable_insert(cfp); + } + return cfp; +} + +/* Compute the closure of the configuration list */ +void Configlist_closure(struct lemon *lemp) +{ + struct config *cfp, *newcfp; + struct rule *rp, *newrp; + struct symbol *sp, *xsp; + int i, dot; + + assert( currentend!=0 ); + for(cfp=current; cfp; cfp=cfp->next){ + rp = cfp->rp; + dot = cfp->dot; + if( dot>=rp->nrhs ) continue; + sp = rp->rhs[dot]; + if( sp->type==NONTERMINAL ){ + if( sp->rule==0 && sp!=lemp->errsym ){ + ErrorMsg(lemp->filename,rp->line,"Nonterminal \"%s\" has no rules.", + sp->name); + lemp->errorcnt++; + } + for(newrp=sp->rule; newrp; newrp=newrp->nextlhs){ + newcfp = Configlist_add(newrp,0); + for(i=dot+1; inrhs; i++){ + xsp = rp->rhs[i]; + if( xsp->type==TERMINAL ){ + SetAdd(newcfp->fws,xsp->index); + break; + }else if( xsp->type==MULTITERMINAL ){ + int k; + for(k=0; knsubsym; k++){ + SetAdd(newcfp->fws, xsp->subsym[k]->index); + } + break; + }else{ + SetUnion(newcfp->fws,xsp->firstset); + if( xsp->lambda==LEMON_FALSE ) break; + } + } + if( i==rp->nrhs ) Plink_add(&cfp->fplp,newcfp); + } + } + } + return; +} + +/* Sort the configuration list */ +void Configlist_sort(){ + current = (struct config *)msort((char *)current,(char **)&(current->next),Configcmp); + currentend = 0; + return; +} + +/* Sort the basis configuration list */ +void Configlist_sortbasis(){ + basis = (struct config *)msort((char *)current,(char **)&(current->bp),Configcmp); + basisend = 0; + return; +} + +/* Return a pointer to the head of the configuration list and +** reset the list */ +struct config *Configlist_return(){ + struct config *old; + old = current; + current = 0; + currentend = 0; + return old; +} + +/* Return a pointer to the head of the configuration list and +** reset the list */ +struct config *Configlist_basis(){ + struct config *old; + old = basis; + basis = 0; + basisend = 0; + return old; +} + +/* Free all elements of the given configuration list */ +void Configlist_eat(struct config *cfp) +{ + struct config *nextcfp; + for(; cfp; cfp=nextcfp){ + nextcfp = cfp->next; + assert( cfp->fplp==0 ); + assert( cfp->bplp==0 ); + if( cfp->fws ) SetFree(cfp->fws); + deleteconfig(cfp); + } + return; +} +/***************** From the file "error.c" *********************************/ +/* +** Code for printing error message. +*/ + +void ErrorMsg(const char *filename, int lineno, const char *format, ...){ + va_list ap; + fprintf(stderr, "%s:%d: ", filename, lineno); + va_start(ap, format); + vfprintf(stderr,format,ap); + va_end(ap); + fprintf(stderr, "\n"); +} +/**************** From the file "main.c" ************************************/ +/* +** Main program file for the LEMON parser generator. +*/ + +/* Report an out-of-memory condition and abort. This function +** is used mostly by the "MemoryCheck" macro in struct.h +*/ +void memory_error(){ + fprintf(stderr,"Out of memory. Aborting...\n"); + exit(1); +} + +static int nDefine = 0; /* Number of -D options on the command line */ +static char **azDefine = 0; /* Name of the -D macros */ + +/* This routine is called with the argument to each -D command-line option. +** Add the macro defined to the azDefine array. +*/ +static void handle_D_option(char *z){ + char **paz; + nDefine++; + azDefine = (char **) realloc(azDefine, sizeof(azDefine[0])*nDefine); + if( azDefine==0 ){ + fprintf(stderr,"out of memory\n"); + exit(1); + } + paz = &azDefine[nDefine-1]; + *paz = (char *) malloc( lemonStrlen(z)+1 ); + if( *paz==0 ){ + fprintf(stderr,"out of memory\n"); + exit(1); + } + lemon_strcpy(*paz, z); + for(z=*paz; *z && *z!='='; z++){} + *z = 0; +} + +static char *user_templatename = NULL; +static void handle_T_option(char *z){ + user_templatename = (char *) malloc( lemonStrlen(z)+1 ); + if( user_templatename==0 ){ + memory_error(); + } + lemon_strcpy(user_templatename, z); +} + +/* The main program. Parse the command line and do it... */ +int main(int argc, char **argv) +{ + static int version = 0; + static int rpflag = 0; + static int basisflag = 0; + static int compress = 0; + static int quiet = 0; + static int statistics = 0; + static int mhflag = 0; + static int nolinenosflag = 0; + static int noResort = 0; + static struct s_options options[] = { + {OPT_FLAG, "b", (char*)&basisflag, "Print only the basis in report."}, + {OPT_FLAG, "c", (char*)&compress, "Don't compress the action table."}, + {OPT_FSTR, "D", (char*)handle_D_option, "Define an %ifdef macro."}, + {OPT_FSTR, "T", (char*)handle_T_option, "Specify a template file."}, + {OPT_FLAG, "g", (char*)&rpflag, "Print grammar without actions."}, + {OPT_FLAG, "m", (char*)&mhflag, "Output a makeheaders compatible file."}, + {OPT_FLAG, "l", (char*)&nolinenosflag, "Do not print #line statements."}, + {OPT_FLAG, "p", (char*)&showPrecedenceConflict, + "Show conflicts resolved by precedence rules"}, + {OPT_FLAG, "q", (char*)&quiet, "(Quiet) Don't print the report file."}, + {OPT_FLAG, "r", (char*)&noResort, "Do not sort or renumber states"}, + {OPT_FLAG, "s", (char*)&statistics, + "Print parser stats to standard output."}, + {OPT_FLAG, "x", (char*)&version, "Print the version number."}, + {OPT_FLAG,0,0,0} + }; + int i; + int exitcode; + struct lemon lem; + + OptInit(argv,options,stderr); + if( version ){ + printf("Lemon version 1.0\n"); + exit(0); + } + if( OptNArgs()!=1 ){ + fprintf(stderr,"Exactly one filename argument is required.\n"); + exit(1); + } + memset(&lem, 0, sizeof(lem)); + lem.errorcnt = 0; + + /* Initialize the machine */ + Strsafe_init(); + Symbol_init(); + State_init(); + lem.argv0 = argv[0]; + lem.filename = OptArg(0); + lem.basisflag = basisflag; + lem.nolinenosflag = nolinenosflag; + Symbol_new("$"); + lem.errsym = Symbol_new("error"); + lem.errsym->useCnt = 0; + + /* Parse the input file */ + Parse(&lem); + if( lem.errorcnt ) exit(lem.errorcnt); + if( lem.nrule==0 ){ + fprintf(stderr,"Empty grammar.\n"); + exit(1); + } + + /* Count and index the symbols of the grammar */ + Symbol_new("{default}"); + lem.nsymbol = Symbol_count(); + lem.symbols = Symbol_arrayof(); + for(i=0; iindex = i; + qsort(lem.symbols,lem.nsymbol,sizeof(struct symbol*), Symbolcmpp); + for(i=0; iindex = i; + while( lem.symbols[i-1]->type==MULTITERMINAL ){ i--; } + assert( strcmp(lem.symbols[i-1]->name,"{default}")==0 ); + lem.nsymbol = i - 1; + for(i=1; isupper(lem.symbols[i]->name[0]); i++); + lem.nterminal = i; + + /* Generate a reprint of the grammar, if requested on the command line */ + if( rpflag ){ + Reprint(&lem); + }else{ + /* Initialize the size for all follow and first sets */ + SetSize(lem.nterminal+1); + + /* Find the precedence for every production rule (that has one) */ + FindRulePrecedences(&lem); + + /* Compute the lambda-nonterminals and the first-sets for every + ** nonterminal */ + FindFirstSets(&lem); + + /* Compute all LR(0) states. Also record follow-set propagation + ** links so that the follow-set can be computed later */ + lem.nstate = 0; + FindStates(&lem); + lem.sorted = State_arrayof(); + + /* Tie up loose ends on the propagation links */ + FindLinks(&lem); + + /* Compute the follow set of every reducible configuration */ + FindFollowSets(&lem); + + /* Compute the action tables */ + FindActions(&lem); + + /* Compress the action tables */ + if( compress==0 ) CompressTables(&lem); + + /* Reorder and renumber the states so that states with fewer choices + ** occur at the end. This is an optimization that helps make the + ** generated parser tables smaller. */ + if( noResort==0 ) ResortStates(&lem); + + /* Generate a report of the parser generated. (the "y.output" file) */ + if( !quiet ) ReportOutput(&lem); + + /* Generate the source code for the parser */ + ReportTable(&lem, mhflag); + + /* Produce a header file for use by the scanner. (This step is + ** omitted if the "-m" option is used because makeheaders will + ** generate the file for us.) */ + if( !mhflag ) ReportHeader(&lem); + } + if( statistics ){ + printf("Parser statistics: %d terminals, %d nonterminals, %d rules\n", + lem.nterminal, lem.nsymbol - lem.nterminal, lem.nrule); + printf(" %d states, %d parser table entries, %d conflicts\n", + lem.nstate, lem.tablesize, lem.nconflict); + } + if( lem.nconflict > 0 ){ + fprintf(stderr,"%d parsing conflicts.\n",lem.nconflict); + } + + /* return 0 on success, 1 on failure. */ + exitcode = ((lem.errorcnt > 0) || (lem.nconflict > 0)) ? 1 : 0; + exit(exitcode); + return (exitcode); +} +/******************** From the file "msort.c" *******************************/ +/* +** A generic merge-sort program. +** +** USAGE: +** Let "ptr" be a pointer to some structure which is at the head of +** a null-terminated list. Then to sort the list call: +** +** ptr = msort(ptr,&(ptr->next),cmpfnc); +** +** In the above, "cmpfnc" is a pointer to a function which compares +** two instances of the structure and returns an integer, as in +** strcmp. The second argument is a pointer to the pointer to the +** second element of the linked list. This address is used to compute +** the offset to the "next" field within the structure. The offset to +** the "next" field must be constant for all structures in the list. +** +** The function returns a new pointer which is the head of the list +** after sorting. +** +** ALGORITHM: +** Merge-sort. +*/ + +/* +** Return a pointer to the next structure in the linked list. +*/ +#define NEXT(A) (*(char**)(((char*)A)+offset)) + +/* +** Inputs: +** a: A sorted, null-terminated linked list. (May be null). +** b: A sorted, null-terminated linked list. (May be null). +** cmp: A pointer to the comparison function. +** offset: Offset in the structure to the "next" field. +** +** Return Value: +** A pointer to the head of a sorted list containing the elements +** of both a and b. +** +** Side effects: +** The "next" pointers for elements in the lists a and b are +** changed. +*/ +static char *merge( + char *a, + char *b, + int (*cmp)(const char*,const char*), + int offset +){ + char *ptr, *head; + + if( a==0 ){ + head = b; + }else if( b==0 ){ + head = a; + }else{ + if( (*cmp)(a,b)<=0 ){ + ptr = a; + a = NEXT(a); + }else{ + ptr = b; + b = NEXT(b); + } + head = ptr; + while( a && b ){ + if( (*cmp)(a,b)<=0 ){ + NEXT(ptr) = a; + ptr = a; + a = NEXT(a); + }else{ + NEXT(ptr) = b; + ptr = b; + b = NEXT(b); + } + } + if( a ) NEXT(ptr) = a; + else NEXT(ptr) = b; + } + return head; +} + +/* +** Inputs: +** list: Pointer to a singly-linked list of structures. +** next: Pointer to pointer to the second element of the list. +** cmp: A comparison function. +** +** Return Value: +** A pointer to the head of a sorted list containing the elements +** orginally in list. +** +** Side effects: +** The "next" pointers for elements in list are changed. +*/ +#define LISTSIZE 30 +static char *msort( + char *list, + char **next, + int (*cmp)(const char*,const char*) +){ + unsigned long offset; + char *ep; + char *set[LISTSIZE]; + int i; + offset = (unsigned long)next - (unsigned long)list; + for(i=0; istate = WAITING_FOR_DECL_KEYWORD; + }else if( islower(x[0]) ){ + psp->lhs = Symbol_new(x); + psp->nrhs = 0; + psp->lhsalias = 0; + psp->state = WAITING_FOR_ARROW; + }else if( x[0]=='{' ){ + if( psp->prevrule==0 ){ + ErrorMsg(psp->filename,psp->tokenlineno, +"There is no prior rule upon which to attach the code \ +fragment which begins on this line."); + psp->errorcnt++; + }else if( psp->prevrule->code!=0 ){ + ErrorMsg(psp->filename,psp->tokenlineno, +"Code fragment beginning on this line is not the first \ +to follow the previous rule."); + psp->errorcnt++; + }else{ + psp->prevrule->line = psp->tokenlineno; + psp->prevrule->code = &x[1]; + } + }else if( x[0]=='[' ){ + psp->state = PRECEDENCE_MARK_1; + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "Token \"%s\" should be either \"%%\" or a nonterminal name.", + x); + psp->errorcnt++; + } + break; + case PRECEDENCE_MARK_1: + if( !isupper(x[0]) ){ + ErrorMsg(psp->filename,psp->tokenlineno, + "The precedence symbol must be a terminal."); + psp->errorcnt++; + }else if( psp->prevrule==0 ){ + ErrorMsg(psp->filename,psp->tokenlineno, + "There is no prior rule to assign precedence \"[%s]\".",x); + psp->errorcnt++; + }else if( psp->prevrule->precsym!=0 ){ + ErrorMsg(psp->filename,psp->tokenlineno, +"Precedence mark on this line is not the first \ +to follow the previous rule."); + psp->errorcnt++; + }else{ + psp->prevrule->precsym = Symbol_new(x); + } + psp->state = PRECEDENCE_MARK_2; + break; + case PRECEDENCE_MARK_2: + if( x[0]!=']' ){ + ErrorMsg(psp->filename,psp->tokenlineno, + "Missing \"]\" on precedence mark."); + psp->errorcnt++; + } + psp->state = WAITING_FOR_DECL_OR_RULE; + break; + case WAITING_FOR_ARROW: + if( x[0]==':' && x[1]==':' && x[2]=='=' ){ + psp->state = IN_RHS; + }else if( x[0]=='(' ){ + psp->state = LHS_ALIAS_1; + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "Expected to see a \":\" following the LHS symbol \"%s\".", + psp->lhs->name); + psp->errorcnt++; + psp->state = RESYNC_AFTER_RULE_ERROR; + } + break; + case LHS_ALIAS_1: + if( isalpha(x[0]) ){ + psp->lhsalias = x; + psp->state = LHS_ALIAS_2; + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "\"%s\" is not a valid alias for the LHS \"%s\"\n", + x,psp->lhs->name); + psp->errorcnt++; + psp->state = RESYNC_AFTER_RULE_ERROR; + } + break; + case LHS_ALIAS_2: + if( x[0]==')' ){ + psp->state = LHS_ALIAS_3; + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "Missing \")\" following LHS alias name \"%s\".",psp->lhsalias); + psp->errorcnt++; + psp->state = RESYNC_AFTER_RULE_ERROR; + } + break; + case LHS_ALIAS_3: + if( x[0]==':' && x[1]==':' && x[2]=='=' ){ + psp->state = IN_RHS; + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "Missing \"->\" following: \"%s(%s)\".", + psp->lhs->name,psp->lhsalias); + psp->errorcnt++; + psp->state = RESYNC_AFTER_RULE_ERROR; + } + break; + case IN_RHS: + if( x[0]=='.' ){ + struct rule *rp; + rp = (struct rule *)calloc( sizeof(struct rule) + + sizeof(struct symbol*)*psp->nrhs + sizeof(char*)*psp->nrhs, 1); + if( rp==0 ){ + ErrorMsg(psp->filename,psp->tokenlineno, + "Can't allocate enough memory for this rule."); + psp->errorcnt++; + psp->prevrule = 0; + }else{ + int i; + rp->ruleline = psp->tokenlineno; + rp->rhs = (struct symbol**)&rp[1]; + rp->rhsalias = (const char**)&(rp->rhs[psp->nrhs]); + for(i=0; inrhs; i++){ + rp->rhs[i] = psp->rhs[i]; + rp->rhsalias[i] = psp->alias[i]; + } + rp->lhs = psp->lhs; + rp->lhsalias = psp->lhsalias; + rp->nrhs = psp->nrhs; + rp->code = 0; + rp->precsym = 0; + rp->index = psp->gp->nrule++; + rp->nextlhs = rp->lhs->rule; + rp->lhs->rule = rp; + rp->next = 0; + if( psp->firstrule==0 ){ + psp->firstrule = psp->lastrule = rp; + }else{ + psp->lastrule->next = rp; + psp->lastrule = rp; + } + psp->prevrule = rp; + } + psp->state = WAITING_FOR_DECL_OR_RULE; + }else if( isalpha(x[0]) ){ + if( psp->nrhs>=MAXRHS ){ + ErrorMsg(psp->filename,psp->tokenlineno, + "Too many symbols on RHS of rule beginning at \"%s\".", + x); + psp->errorcnt++; + psp->state = RESYNC_AFTER_RULE_ERROR; + }else{ + psp->rhs[psp->nrhs] = Symbol_new(x); + psp->alias[psp->nrhs] = 0; + psp->nrhs++; + } + }else if( (x[0]=='|' || x[0]=='/') && psp->nrhs>0 ){ + struct symbol *msp = psp->rhs[psp->nrhs-1]; + if( msp->type!=MULTITERMINAL ){ + struct symbol *origsp = msp; + msp = (struct symbol *) calloc(1,sizeof(*msp)); + memset(msp, 0, sizeof(*msp)); + msp->type = MULTITERMINAL; + msp->nsubsym = 1; + msp->subsym = (struct symbol **) calloc(1,sizeof(struct symbol*)); + msp->subsym[0] = origsp; + msp->name = origsp->name; + psp->rhs[psp->nrhs-1] = msp; + } + msp->nsubsym++; + msp->subsym = (struct symbol **) realloc(msp->subsym, + sizeof(struct symbol*)*msp->nsubsym); + msp->subsym[msp->nsubsym-1] = Symbol_new(&x[1]); + if( islower(x[1]) || islower(msp->subsym[0]->name[0]) ){ + ErrorMsg(psp->filename,psp->tokenlineno, + "Cannot form a compound containing a non-terminal"); + psp->errorcnt++; + } + }else if( x[0]=='(' && psp->nrhs>0 ){ + psp->state = RHS_ALIAS_1; + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "Illegal character on RHS of rule: \"%s\".",x); + psp->errorcnt++; + psp->state = RESYNC_AFTER_RULE_ERROR; + } + break; + case RHS_ALIAS_1: + if( isalpha(x[0]) ){ + psp->alias[psp->nrhs-1] = x; + psp->state = RHS_ALIAS_2; + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "\"%s\" is not a valid alias for the RHS symbol \"%s\"\n", + x,psp->rhs[psp->nrhs-1]->name); + psp->errorcnt++; + psp->state = RESYNC_AFTER_RULE_ERROR; + } + break; + case RHS_ALIAS_2: + if( x[0]==')' ){ + psp->state = IN_RHS; + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "Missing \")\" following LHS alias name \"%s\".",psp->lhsalias); + psp->errorcnt++; + psp->state = RESYNC_AFTER_RULE_ERROR; + } + break; + case WAITING_FOR_DECL_KEYWORD: + if( isalpha(x[0]) ){ + psp->declkeyword = x; + psp->declargslot = 0; + psp->decllinenoslot = 0; + psp->insertLineMacro = 1; + psp->state = WAITING_FOR_DECL_ARG; + if( strcmp(x,"name")==0 ){ + psp->declargslot = &(psp->gp->name); + psp->insertLineMacro = 0; + }else if( strcmp(x,"include")==0 ){ + psp->declargslot = &(psp->gp->include); + }else if( strcmp(x,"code")==0 ){ + psp->declargslot = &(psp->gp->extracode); + }else if( strcmp(x,"token_destructor")==0 ){ + psp->declargslot = &psp->gp->tokendest; + }else if( strcmp(x,"default_destructor")==0 ){ + psp->declargslot = &psp->gp->vardest; + }else if( strcmp(x,"token_prefix")==0 ){ + psp->declargslot = &psp->gp->tokenprefix; + psp->insertLineMacro = 0; + }else if( strcmp(x,"syntax_error")==0 ){ + psp->declargslot = &(psp->gp->error); + }else if( strcmp(x,"parse_accept")==0 ){ + psp->declargslot = &(psp->gp->accept); + }else if( strcmp(x,"parse_failure")==0 ){ + psp->declargslot = &(psp->gp->failure); + }else if( strcmp(x,"stack_overflow")==0 ){ + psp->declargslot = &(psp->gp->overflow); + }else if( strcmp(x,"extra_argument")==0 ){ + psp->declargslot = &(psp->gp->arg); + psp->insertLineMacro = 0; + }else if( strcmp(x,"token_type")==0 ){ + psp->declargslot = &(psp->gp->tokentype); + psp->insertLineMacro = 0; + }else if( strcmp(x,"default_type")==0 ){ + psp->declargslot = &(psp->gp->vartype); + psp->insertLineMacro = 0; + }else if( strcmp(x,"stack_size")==0 ){ + psp->declargslot = &(psp->gp->stacksize); + psp->insertLineMacro = 0; + }else if( strcmp(x,"start_symbol")==0 ){ + psp->declargslot = &(psp->gp->start); + psp->insertLineMacro = 0; + }else if( strcmp(x,"left")==0 ){ + psp->preccounter++; + psp->declassoc = LEFT; + psp->state = WAITING_FOR_PRECEDENCE_SYMBOL; + }else if( strcmp(x,"right")==0 ){ + psp->preccounter++; + psp->declassoc = RIGHT; + psp->state = WAITING_FOR_PRECEDENCE_SYMBOL; + }else if( strcmp(x,"nonassoc")==0 ){ + psp->preccounter++; + psp->declassoc = NONE; + psp->state = WAITING_FOR_PRECEDENCE_SYMBOL; + }else if( strcmp(x,"destructor")==0 ){ + psp->state = WAITING_FOR_DESTRUCTOR_SYMBOL; + }else if( strcmp(x,"type")==0 ){ + psp->state = WAITING_FOR_DATATYPE_SYMBOL; + }else if( strcmp(x,"fallback")==0 ){ + psp->fallback = 0; + psp->state = WAITING_FOR_FALLBACK_ID; + }else if( strcmp(x,"wildcard")==0 ){ + psp->state = WAITING_FOR_WILDCARD_ID; + }else if( strcmp(x,"token_class")==0 ){ + psp->state = WAITING_FOR_CLASS_ID; + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "Unknown declaration keyword: \"%%%s\".",x); + psp->errorcnt++; + psp->state = RESYNC_AFTER_DECL_ERROR; + } + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "Illegal declaration keyword: \"%s\".",x); + psp->errorcnt++; + psp->state = RESYNC_AFTER_DECL_ERROR; + } + break; + case WAITING_FOR_DESTRUCTOR_SYMBOL: + if( !isalpha(x[0]) ){ + ErrorMsg(psp->filename,psp->tokenlineno, + "Symbol name missing after %%destructor keyword"); + psp->errorcnt++; + psp->state = RESYNC_AFTER_DECL_ERROR; + }else{ + struct symbol *sp = Symbol_new(x); + psp->declargslot = &sp->destructor; + psp->decllinenoslot = &sp->destLineno; + psp->insertLineMacro = 1; + psp->state = WAITING_FOR_DECL_ARG; + } + break; + case WAITING_FOR_DATATYPE_SYMBOL: + if( !isalpha(x[0]) ){ + ErrorMsg(psp->filename,psp->tokenlineno, + "Symbol name missing after %%type keyword"); + psp->errorcnt++; + psp->state = RESYNC_AFTER_DECL_ERROR; + }else{ + struct symbol *sp = Symbol_find(x); + if((sp) && (sp->datatype)){ + ErrorMsg(psp->filename,psp->tokenlineno, + "Symbol %%type \"%s\" already defined", x); + psp->errorcnt++; + psp->state = RESYNC_AFTER_DECL_ERROR; + }else{ + if (!sp){ + sp = Symbol_new(x); + } + psp->declargslot = &sp->datatype; + psp->insertLineMacro = 0; + psp->state = WAITING_FOR_DECL_ARG; + } + } + break; + case WAITING_FOR_PRECEDENCE_SYMBOL: + if( x[0]=='.' ){ + psp->state = WAITING_FOR_DECL_OR_RULE; + }else if( isupper(x[0]) ){ + struct symbol *sp; + sp = Symbol_new(x); + if( sp->prec>=0 ){ + ErrorMsg(psp->filename,psp->tokenlineno, + "Symbol \"%s\" has already be given a precedence.",x); + psp->errorcnt++; + }else{ + sp->prec = psp->preccounter; + sp->assoc = psp->declassoc; + } + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "Can't assign a precedence to \"%s\".",x); + psp->errorcnt++; + } + break; + case WAITING_FOR_DECL_ARG: + if( x[0]=='{' || x[0]=='\"' || isalnum(x[0]) ){ + const char *zOld, *zNew; + char *zBuf, *z; + int nOld, n, nLine, nNew, nBack; + int addLineMacro; + char zLine[50]; + zNew = x; + if( zNew[0]=='"' || zNew[0]=='{' ) zNew++; + nNew = lemonStrlen(zNew); + if( *psp->declargslot ){ + zOld = *psp->declargslot; + }else{ + zOld = ""; + } + nOld = lemonStrlen(zOld); + n = nOld + nNew + 20; + addLineMacro = !psp->gp->nolinenosflag && psp->insertLineMacro && + (psp->decllinenoslot==0 || psp->decllinenoslot[0]!=0); + if( addLineMacro ){ + for(z=psp->filename, nBack=0; *z; z++){ + if( *z=='\\' ) nBack++; + } + lemon_sprintf(zLine, "#line %d ", psp->tokenlineno); + nLine = lemonStrlen(zLine); + n += nLine + lemonStrlen(psp->filename) + nBack; + } + *psp->declargslot = (char *) realloc(*psp->declargslot, n); + zBuf = *psp->declargslot + nOld; + if( addLineMacro ){ + if( nOld && zBuf[-1]!='\n' ){ + *(zBuf++) = '\n'; + } + memcpy(zBuf, zLine, nLine); + zBuf += nLine; + *(zBuf++) = '"'; + for(z=psp->filename; *z; z++){ + if( *z=='\\' ){ + *(zBuf++) = '\\'; + } + *(zBuf++) = *z; + } + *(zBuf++) = '"'; + *(zBuf++) = '\n'; + } + if( psp->decllinenoslot && psp->decllinenoslot[0]==0 ){ + psp->decllinenoslot[0] = psp->tokenlineno; + } + memcpy(zBuf, zNew, nNew); + zBuf += nNew; + *zBuf = 0; + psp->state = WAITING_FOR_DECL_OR_RULE; + }else{ + ErrorMsg(psp->filename,psp->tokenlineno, + "Illegal argument to %%%s: %s",psp->declkeyword,x); + psp->errorcnt++; + psp->state = RESYNC_AFTER_DECL_ERROR; + } + break; + case WAITING_FOR_FALLBACK_ID: + if( x[0]=='.' ){ + psp->state = WAITING_FOR_DECL_OR_RULE; + }else if( !isupper(x[0]) ){ + ErrorMsg(psp->filename, psp->tokenlineno, + "%%fallback argument \"%s\" should be a token", x); + psp->errorcnt++; + }else{ + struct symbol *sp = Symbol_new(x); + if( psp->fallback==0 ){ + psp->fallback = sp; + }else if( sp->fallback ){ + ErrorMsg(psp->filename, psp->tokenlineno, + "More than one fallback assigned to token %s", x); + psp->errorcnt++; + }else{ + sp->fallback = psp->fallback; + psp->gp->has_fallback = 1; + } + } + break; + case WAITING_FOR_WILDCARD_ID: + if( x[0]=='.' ){ + psp->state = WAITING_FOR_DECL_OR_RULE; + }else if( !isupper(x[0]) ){ + ErrorMsg(psp->filename, psp->tokenlineno, + "%%wildcard argument \"%s\" should be a token", x); + psp->errorcnt++; + }else{ + struct symbol *sp = Symbol_new(x); + if( psp->gp->wildcard==0 ){ + psp->gp->wildcard = sp; + }else{ + ErrorMsg(psp->filename, psp->tokenlineno, + "Extra wildcard to token: %s", x); + psp->errorcnt++; + } + } + break; + case WAITING_FOR_CLASS_ID: + if( !islower(x[0]) ){ + ErrorMsg(psp->filename, psp->tokenlineno, + "%%token_class must be followed by an identifier: ", x); + psp->errorcnt++; + psp->state = RESYNC_AFTER_DECL_ERROR; + }else if( Symbol_find(x) ){ + ErrorMsg(psp->filename, psp->tokenlineno, + "Symbol \"%s\" already used", x); + psp->errorcnt++; + psp->state = RESYNC_AFTER_DECL_ERROR; + }else{ + psp->tkclass = Symbol_new(x); + psp->tkclass->type = MULTITERMINAL; + psp->state = WAITING_FOR_CLASS_TOKEN; + } + break; + case WAITING_FOR_CLASS_TOKEN: + if( x[0]=='.' ){ + psp->state = WAITING_FOR_DECL_OR_RULE; + }else if( isupper(x[0]) || ((x[0]=='|' || x[0]=='/') && isupper(x[1])) ){ + struct symbol *msp = psp->tkclass; + msp->nsubsym++; + msp->subsym = (struct symbol **) realloc(msp->subsym, + sizeof(struct symbol*)*msp->nsubsym); + if( !isupper(x[0]) ) x++; + msp->subsym[msp->nsubsym-1] = Symbol_new(x); + }else{ + ErrorMsg(psp->filename, psp->tokenlineno, + "%%token_class argument \"%s\" should be a token", x); + psp->errorcnt++; + psp->state = RESYNC_AFTER_DECL_ERROR; + } + break; + case RESYNC_AFTER_RULE_ERROR: +/* if( x[0]=='.' ) psp->state = WAITING_FOR_DECL_OR_RULE; +** break; */ + case RESYNC_AFTER_DECL_ERROR: + if( x[0]=='.' ) psp->state = WAITING_FOR_DECL_OR_RULE; + if( x[0]=='%' ) psp->state = WAITING_FOR_DECL_KEYWORD; + break; + } +} + +/* Run the preprocessor over the input file text. The global variables +** azDefine[0] through azDefine[nDefine-1] contains the names of all defined +** macros. This routine looks for "%ifdef" and "%ifndef" and "%endif" and +** comments them out. Text in between is also commented out as appropriate. +*/ +static void preprocess_input(char *z){ + int i, j, k, n; + int exclude = 0; + int start = 0; + int lineno = 1; + int start_lineno = 1; + for(i=0; z[i]; i++){ + if( z[i]=='\n' ) lineno++; + if( z[i]!='%' || (i>0 && z[i-1]!='\n') ) continue; + if( strncmp(&z[i],"%endif",6)==0 && isspace(z[i+6]) ){ + if( exclude ){ + exclude--; + if( exclude==0 ){ + for(j=start; jfilename; + ps.errorcnt = 0; + ps.state = INITIALIZE; + + /* Begin by reading the input file */ + fp = fopen(ps.filename,"rb"); + if( fp==0 ){ + ErrorMsg(ps.filename,0,"Can't open this file for reading."); + gp->errorcnt++; + return; + } + fseek(fp,0,2); + filesize = ftell(fp); + rewind(fp); + filebuf = (char *)malloc( filesize+1 ); + if( filesize>100000000 || filebuf==0 ){ + ErrorMsg(ps.filename,0,"Input file too large."); + gp->errorcnt++; + fclose(fp); + return; + } + if( fread(filebuf,1,filesize,fp)!=filesize ){ + ErrorMsg(ps.filename,0,"Can't read in all %d bytes of this file.", + filesize); + free(filebuf); + gp->errorcnt++; + fclose(fp); + return; + } + fclose(fp); + filebuf[filesize] = 0; + + /* Make an initial pass through the file to handle %ifdef and %ifndef */ + preprocess_input(filebuf); + + /* Now scan the text of the input file */ + lineno = 1; + for(cp=filebuf; (c= *cp)!=0; ){ + if( c=='\n' ) lineno++; /* Keep track of the line number */ + if( isspace(c) ){ cp++; continue; } /* Skip all white space */ + if( c=='/' && cp[1]=='/' ){ /* Skip C++ style comments */ + cp+=2; + while( (c= *cp)!=0 && c!='\n' ) cp++; + continue; + } + if( c=='/' && cp[1]=='*' ){ /* Skip C style comments */ + cp+=2; + while( (c= *cp)!=0 && (c!='/' || cp[-1]!='*') ){ + if( c=='\n' ) lineno++; + cp++; + } + if( c ) cp++; + continue; + } + ps.tokenstart = cp; /* Mark the beginning of the token */ + ps.tokenlineno = lineno; /* Linenumber on which token begins */ + if( c=='\"' ){ /* String literals */ + cp++; + while( (c= *cp)!=0 && c!='\"' ){ + if( c=='\n' ) lineno++; + cp++; + } + if( c==0 ){ + ErrorMsg(ps.filename,startline, +"String starting on this line is not terminated before the end of the file."); + ps.errorcnt++; + nextcp = cp; + }else{ + nextcp = cp+1; + } + }else if( c=='{' ){ /* A block of C code */ + int level; + cp++; + for(level=1; (c= *cp)!=0 && (level>1 || c!='}'); cp++){ + if( c=='\n' ) lineno++; + else if( c=='{' ) level++; + else if( c=='}' ) level--; + else if( c=='/' && cp[1]=='*' ){ /* Skip comments */ + int prevc; + cp = &cp[2]; + prevc = 0; + while( (c= *cp)!=0 && (c!='/' || prevc!='*') ){ + if( c=='\n' ) lineno++; + prevc = c; + cp++; + } + }else if( c=='/' && cp[1]=='/' ){ /* Skip C++ style comments too */ + cp = &cp[2]; + while( (c= *cp)!=0 && c!='\n' ) cp++; + if( c ) lineno++; + }else if( c=='\'' || c=='\"' ){ /* String a character literals */ + int startchar, prevc; + startchar = c; + prevc = 0; + for(cp++; (c= *cp)!=0 && (c!=startchar || prevc=='\\'); cp++){ + if( c=='\n' ) lineno++; + if( prevc=='\\' ) prevc = 0; + else prevc = c; + } + } + } + if( c==0 ){ + ErrorMsg(ps.filename,ps.tokenlineno, +"C code starting on this line is not terminated before the end of the file."); + ps.errorcnt++; + nextcp = cp; + }else{ + nextcp = cp+1; + } + }else if( isalnum(c) ){ /* Identifiers */ + while( (c= *cp)!=0 && (isalnum(c) || c=='_') ) cp++; + nextcp = cp; + }else if( c==':' && cp[1]==':' && cp[2]=='=' ){ /* The operator "::=" */ + cp += 3; + nextcp = cp; + }else if( (c=='/' || c=='|') && isalpha(cp[1]) ){ + cp += 2; + while( (c = *cp)!=0 && (isalnum(c) || c=='_') ) cp++; + nextcp = cp; + }else{ /* All other (one character) operators */ + cp++; + nextcp = cp; + } + c = *cp; + *cp = 0; /* Null terminate the token */ + parseonetoken(&ps); /* Parse the token */ + *cp = c; /* Restore the buffer */ + cp = nextcp; + } + free(filebuf); /* Release the buffer after parsing */ + gp->rule = ps.firstrule; + gp->errorcnt = ps.errorcnt; +} +/*************************** From the file "plink.c" *********************/ +/* +** Routines processing configuration follow-set propagation links +** in the LEMON parser generator. +*/ +static struct plink *plink_freelist = 0; + +/* Allocate a new plink */ +struct plink *Plink_new(){ + struct plink *newlink; + + if( plink_freelist==0 ){ + int i; + int amt = 100; + plink_freelist = (struct plink *)calloc( amt, sizeof(struct plink) ); + if( plink_freelist==0 ){ + fprintf(stderr, + "Unable to allocate memory for a new follow-set propagation link.\n"); + exit(1); + } + for(i=0; inext; + return newlink; +} + +/* Add a plink to a plink list */ +void Plink_add(struct plink **plpp, struct config *cfp) +{ + struct plink *newlink; + newlink = Plink_new(); + newlink->next = *plpp; + *plpp = newlink; + newlink->cfp = cfp; +} + +/* Transfer every plink on the list "from" to the list "to" */ +void Plink_copy(struct plink **to, struct plink *from) +{ + struct plink *nextpl; + while( from ){ + nextpl = from->next; + from->next = *to; + *to = from; + from = nextpl; + } +} + +/* Delete every plink on the list */ +void Plink_delete(struct plink *plp) +{ + struct plink *nextpl; + + while( plp ){ + nextpl = plp->next; + plp->next = plink_freelist; + plink_freelist = plp; + plp = nextpl; + } +} +/*********************** From the file "report.c" **************************/ +/* +** Procedures for generating reports and tables in the LEMON parser generator. +*/ + +/* Generate a filename with the given suffix. Space to hold the +** name comes from malloc() and must be freed by the calling +** function. +*/ +PRIVATE char *file_makename(struct lemon *lemp, const char *suffix) +{ + char *name; + char *cp; + + name = (char*)malloc( lemonStrlen(lemp->filename) + lemonStrlen(suffix) + 5 ); + if( name==0 ){ + fprintf(stderr,"Can't allocate space for a filename.\n"); + exit(1); + } + lemon_strcpy(name,lemp->filename); + cp = strrchr(name,'.'); + if( cp ) *cp = 0; + lemon_strcat(name,suffix); + return name; +} + +/* Open a file with a name based on the name of the input file, +** but with a different (specified) suffix, and return a pointer +** to the stream */ +PRIVATE FILE *file_open( + struct lemon *lemp, + const char *suffix, + const char *mode +){ + FILE *fp; + + if( lemp->outname ) free(lemp->outname); + lemp->outname = file_makename(lemp, suffix); + fp = fopen(lemp->outname,mode); + if( fp==0 && *mode=='w' ){ + fprintf(stderr,"Can't open file \"%s\".\n",lemp->outname); + lemp->errorcnt++; + return 0; + } + return fp; +} + +/* Duplicate the input file without comments and without actions +** on rules */ +void Reprint(struct lemon *lemp) +{ + struct rule *rp; + struct symbol *sp; + int i, j, maxlen, len, ncolumns, skip; + printf("// Reprint of input file \"%s\".\n// Symbols:\n",lemp->filename); + maxlen = 10; + for(i=0; insymbol; i++){ + sp = lemp->symbols[i]; + len = lemonStrlen(sp->name); + if( len>maxlen ) maxlen = len; + } + ncolumns = 76/(maxlen+5); + if( ncolumns<1 ) ncolumns = 1; + skip = (lemp->nsymbol + ncolumns - 1)/ncolumns; + for(i=0; insymbol; j+=skip){ + sp = lemp->symbols[j]; + assert( sp->index==j ); + printf(" %3d %-*.*s",j,maxlen,maxlen,sp->name); + } + printf("\n"); + } + for(rp=lemp->rule; rp; rp=rp->next){ + printf("%s",rp->lhs->name); + /* if( rp->lhsalias ) printf("(%s)",rp->lhsalias); */ + printf(" ::="); + for(i=0; inrhs; i++){ + sp = rp->rhs[i]; + if( sp->type==MULTITERMINAL ){ + printf(" %s", sp->subsym[0]->name); + for(j=1; jnsubsym; j++){ + printf("|%s", sp->subsym[j]->name); + } + }else{ + printf(" %s", sp->name); + } + /* if( rp->rhsalias[i] ) printf("(%s)",rp->rhsalias[i]); */ + } + printf("."); + if( rp->precsym ) printf(" [%s]",rp->precsym->name); + /* if( rp->code ) printf("\n %s",rp->code); */ + printf("\n"); + } +} + +void ConfigPrint(FILE *fp, struct config *cfp) +{ + struct rule *rp; + struct symbol *sp; + int i, j; + rp = cfp->rp; + fprintf(fp,"%s ::=",rp->lhs->name); + for(i=0; i<=rp->nrhs; i++){ + if( i==cfp->dot ) fprintf(fp," *"); + if( i==rp->nrhs ) break; + sp = rp->rhs[i]; + if( sp->type==MULTITERMINAL ){ + fprintf(fp," %s", sp->subsym[0]->name); + for(j=1; jnsubsym; j++){ + fprintf(fp,"|%s",sp->subsym[j]->name); + } + }else{ + fprintf(fp," %s", sp->name); + } + } +} + +/* #define TEST */ +#if 0 +/* Print a set */ +PRIVATE void SetPrint(out,set,lemp) +FILE *out; +char *set; +struct lemon *lemp; +{ + int i; + char *spacer; + spacer = ""; + fprintf(out,"%12s[",""); + for(i=0; interminal; i++){ + if( SetFind(set,i) ){ + fprintf(out,"%s%s",spacer,lemp->symbols[i]->name); + spacer = " "; + } + } + fprintf(out,"]\n"); +} + +/* Print a plink chain */ +PRIVATE void PlinkPrint(out,plp,tag) +FILE *out; +struct plink *plp; +char *tag; +{ + while( plp ){ + fprintf(out,"%12s%s (state %2d) ","",tag,plp->cfp->stp->statenum); + ConfigPrint(out,plp->cfp); + fprintf(out,"\n"); + plp = plp->next; + } +} +#endif + +/* Print an action to the given file descriptor. Return FALSE if +** nothing was actually printed. +*/ +int PrintAction(struct action *ap, FILE *fp, int indent){ + int result = 1; + switch( ap->type ){ + case SHIFT: + fprintf(fp,"%*s shift %d",indent,ap->sp->name,ap->x.stp->statenum); + break; + case REDUCE: + fprintf(fp,"%*s reduce %d",indent,ap->sp->name,ap->x.rp->index); + break; + case ACCEPT: + fprintf(fp,"%*s accept",indent,ap->sp->name); + break; + case ERROR: + fprintf(fp,"%*s error",indent,ap->sp->name); + break; + case SRCONFLICT: + case RRCONFLICT: + fprintf(fp,"%*s reduce %-3d ** Parsing conflict **", + indent,ap->sp->name,ap->x.rp->index); + break; + case SSCONFLICT: + fprintf(fp,"%*s shift %-3d ** Parsing conflict **", + indent,ap->sp->name,ap->x.stp->statenum); + break; + case SH_RESOLVED: + if( showPrecedenceConflict ){ + fprintf(fp,"%*s shift %-3d -- dropped by precedence", + indent,ap->sp->name,ap->x.stp->statenum); + }else{ + result = 0; + } + break; + case RD_RESOLVED: + if( showPrecedenceConflict ){ + fprintf(fp,"%*s reduce %-3d -- dropped by precedence", + indent,ap->sp->name,ap->x.rp->index); + }else{ + result = 0; + } + break; + case NOT_USED: + result = 0; + break; + } + return result; +} + +/* Generate the "y.output" log file */ +void ReportOutput(struct lemon *lemp) +{ + int i; + struct state *stp; + struct config *cfp; + struct action *ap; + FILE *fp; + + fp = file_open(lemp,".out","wb"); + if( fp==0 ) return; + for(i=0; instate; i++){ + stp = lemp->sorted[i]; + fprintf(fp,"State %d:\n",stp->statenum); + if( lemp->basisflag ) cfp=stp->bp; + else cfp=stp->cfp; + while( cfp ){ + char buf[20]; + if( cfp->dot==cfp->rp->nrhs ){ + lemon_sprintf(buf,"(%d)",cfp->rp->index); + fprintf(fp," %5s ",buf); + }else{ + fprintf(fp," "); + } + ConfigPrint(fp,cfp); + fprintf(fp,"\n"); +#if 0 + SetPrint(fp,cfp->fws,lemp); + PlinkPrint(fp,cfp->fplp,"To "); + PlinkPrint(fp,cfp->bplp,"From"); +#endif + if( lemp->basisflag ) cfp=cfp->bp; + else cfp=cfp->next; + } + fprintf(fp,"\n"); + for(ap=stp->ap; ap; ap=ap->next){ + if( PrintAction(ap,fp,30) ) fprintf(fp,"\n"); + } + fprintf(fp,"\n"); + } + fprintf(fp, "----------------------------------------------------\n"); + fprintf(fp, "Symbols:\n"); + for(i=0; insymbol; i++){ + int j; + struct symbol *sp; + + sp = lemp->symbols[i]; + fprintf(fp, " %3d: %s", i, sp->name); + if( sp->type==NONTERMINAL ){ + fprintf(fp, ":"); + if( sp->lambda ){ + fprintf(fp, " "); + } + for(j=0; jnterminal; j++){ + if( sp->firstset && SetFind(sp->firstset, j) ){ + fprintf(fp, " %s", lemp->symbols[j]->name); + } + } + } + fprintf(fp, "\n"); + } + fclose(fp); + return; +} + +/* Search for the file "name" which is in the same directory as +** the exacutable */ +PRIVATE char *pathsearch(char *argv0, char *name, int modemask) +{ + const char *pathlist; + char *pathbufptr; + char *pathbuf; + char *path,*cp; + char c; + +#ifdef __WIN32__ + cp = strrchr(argv0,'\\'); +#else + cp = strrchr(argv0,'/'); +#endif + if( cp ){ + c = *cp; + *cp = 0; + path = (char *)malloc( lemonStrlen(argv0) + lemonStrlen(name) + 2 ); + if( path ) lemon_sprintf(path,"%s/%s",argv0,name); + *cp = c; + }else{ + pathlist = getenv("PATH"); + if( pathlist==0 ) pathlist = ".:/bin:/usr/bin"; + pathbuf = (char *) malloc( lemonStrlen(pathlist) + 1 ); + path = (char *)malloc( lemonStrlen(pathlist)+lemonStrlen(name)+2 ); + if( (pathbuf != 0) && (path!=0) ){ + pathbufptr = pathbuf; + lemon_strcpy(pathbuf, pathlist); + while( *pathbuf ){ + cp = strchr(pathbuf,':'); + if( cp==0 ) cp = &pathbuf[lemonStrlen(pathbuf)]; + c = *cp; + *cp = 0; + lemon_sprintf(path,"%s/%s",pathbuf,name); + *cp = c; + if( c==0 ) pathbuf[0] = 0; + else pathbuf = &cp[1]; + if( access(path,modemask)==0 ) break; + } + free(pathbufptr); + } + } + return path; +} + +/* Given an action, compute the integer value for that action +** which is to be put in the action table of the generated machine. +** Return negative if no action should be generated. +*/ +PRIVATE int compute_action(struct lemon *lemp, struct action *ap) +{ + int act; + switch( ap->type ){ + case SHIFT: act = ap->x.stp->statenum; break; + case REDUCE: act = ap->x.rp->index + lemp->nstate; break; + case ERROR: act = lemp->nstate + lemp->nrule; break; + case ACCEPT: act = lemp->nstate + lemp->nrule + 1; break; + default: act = -1; break; + } + return act; +} + +#define LINESIZE 1000 +/* The next cluster of routines are for reading the template file +** and writing the results to the generated parser */ +/* The first function transfers data from "in" to "out" until +** a line is seen which begins with "%%". The line number is +** tracked. +** +** if name!=0, then any word that begin with "Parse" is changed to +** begin with *name instead. +*/ +PRIVATE void tplt_xfer(char *name, FILE *in, FILE *out, int *lineno) +{ + int i, iStart; + char line[LINESIZE]; + while( fgets(line,LINESIZE,in) && (line[0]!='%' || line[1]!='%') ){ + (*lineno)++; + iStart = 0; + if( name ){ + for(i=0; line[i]; i++){ + if( line[i]=='P' && strncmp(&line[i],"Parse",5)==0 + && (i==0 || !isalpha(line[i-1])) + ){ + if( i>iStart ) fprintf(out,"%.*s",i-iStart,&line[iStart]); + fprintf(out,"%s",name); + i += 4; + iStart = i+1; + } + } + } + fprintf(out,"%s",&line[iStart]); + } +} + +/* The next function finds the template file and opens it, returning +** a pointer to the opened file. */ +PRIVATE FILE *tplt_open(struct lemon *lemp) +{ + static char templatename[] = "lempar.c"; + char buf[1000]; + FILE *in; + char *tpltname; + char *cp; + + /* first, see if user specified a template filename on the command line. */ + if (user_templatename != 0) { + if( access(user_templatename,004)==-1 ){ + fprintf(stderr,"Can't find the parser driver template file \"%s\".\n", + user_templatename); + lemp->errorcnt++; + return 0; + } + in = fopen(user_templatename,"rb"); + if( in==0 ){ + fprintf(stderr,"Can't open the template file \"%s\".\n",user_templatename); + lemp->errorcnt++; + return 0; + } + return in; + } + + cp = strrchr(lemp->filename,'.'); + if( cp ){ + lemon_sprintf(buf,"%.*s.lt",(int)(cp-lemp->filename),lemp->filename); + }else{ + lemon_sprintf(buf,"%s.lt",lemp->filename); + } + if( access(buf,004)==0 ){ + tpltname = buf; + }else if( access(templatename,004)==0 ){ + tpltname = templatename; + }else{ + tpltname = pathsearch(lemp->argv0,templatename,0); + } + if( tpltname==0 ){ + fprintf(stderr,"Can't find the parser driver template file \"%s\".\n", + templatename); + lemp->errorcnt++; + return 0; + } + in = fopen(tpltname,"rb"); + if( in==0 ){ + fprintf(stderr,"Can't open the template file \"%s\".\n",templatename); + lemp->errorcnt++; + return 0; + } + return in; +} + +/* Print a #line directive line to the output file. */ +PRIVATE void tplt_linedir(FILE *out, int lineno, char *filename) +{ + fprintf(out,"#line %d \"",lineno); + while( *filename ){ + if( *filename == '\\' ) putc('\\',out); + putc(*filename,out); + filename++; + } + fprintf(out,"\"\n"); +} + +/* Print a string to the file and keep the linenumber up to date */ +PRIVATE void tplt_print(FILE *out, struct lemon *lemp, char *str, int *lineno) +{ + if( str==0 ) return; + while( *str ){ + putc(*str,out); + if( *str=='\n' ) (*lineno)++; + str++; + } + if( str[-1]!='\n' ){ + putc('\n',out); + (*lineno)++; + } + if (!lemp->nolinenosflag) { + (*lineno)++; tplt_linedir(out,*lineno,lemp->outname); + } + return; +} + +/* +** The following routine emits code for the destructor for the +** symbol sp +*/ +void emit_destructor_code( + FILE *out, + struct symbol *sp, + struct lemon *lemp, + int *lineno +){ + char *cp = 0; + + if( sp->type==TERMINAL ){ + cp = lemp->tokendest; + if( cp==0 ) return; + fprintf(out,"{\n"); (*lineno)++; + }else if( sp->destructor ){ + cp = sp->destructor; + fprintf(out,"{\n"); (*lineno)++; + if (!lemp->nolinenosflag) { (*lineno)++; tplt_linedir(out,sp->destLineno,lemp->filename); } + }else if( lemp->vardest ){ + cp = lemp->vardest; + if( cp==0 ) return; + fprintf(out,"{\n"); (*lineno)++; + }else{ + assert( 0 ); /* Cannot happen */ + } + for(; *cp; cp++){ + if( *cp=='$' && cp[1]=='$' ){ + fprintf(out,"(yypminor->yy%d)",sp->dtnum); + cp++; + continue; + } + if( *cp=='\n' ) (*lineno)++; + fputc(*cp,out); + } + fprintf(out,"\n"); (*lineno)++; + if (!lemp->nolinenosflag) { + (*lineno)++; tplt_linedir(out,*lineno,lemp->outname); + } + fprintf(out,"}\n"); (*lineno)++; + return; +} + +/* +** Return TRUE (non-zero) if the given symbol has a destructor. +*/ +int has_destructor(struct symbol *sp, struct lemon *lemp) +{ + int ret; + if( sp->type==TERMINAL ){ + ret = lemp->tokendest!=0; + }else{ + ret = lemp->vardest!=0 || sp->destructor!=0; + } + return ret; +} + +/* +** Append text to a dynamically allocated string. If zText is 0 then +** reset the string to be empty again. Always return the complete text +** of the string (which is overwritten with each call). +** +** n bytes of zText are stored. If n==0 then all of zText up to the first +** \000 terminator is stored. zText can contain up to two instances of +** %d. The values of p1 and p2 are written into the first and second +** %d. +** +** If n==-1, then the previous character is overwritten. +*/ +PRIVATE char *append_str(const char *zText, int n, int p1, int p2){ + static char empty[1] = { 0 }; + static char *z = 0; + static int alloced = 0; + static int used = 0; + int c; + char zInt[40]; + if( zText==0 ){ + used = 0; + return z; + } + if( n<=0 ){ + if( n<0 ){ + used += n; + assert( used>=0 ); + } + n = lemonStrlen(zText); + } + if( (int) (n+sizeof(zInt)*2+used) >= alloced ){ + alloced = n + sizeof(zInt)*2 + used + 200; + z = (char *) realloc(z, alloced); + } + if( z==0 ) return empty; + while( n-- > 0 ){ + c = *(zText++); + if( c=='%' && n>0 && zText[0]=='d' ){ + lemon_sprintf(zInt, "%d", p1); + p1 = p2; + lemon_strcpy(&z[used], zInt); + used += lemonStrlen(&z[used]); + zText++; + n--; + }else{ + z[used++] = c; + } + } + z[used] = 0; + return z; +} + +/* +** zCode is a string that is the action associated with a rule. Expand +** the symbols in this string so that the refer to elements of the parser +** stack. +*/ +PRIVATE void translate_code(struct lemon *lemp, struct rule *rp){ + char *cp, *xp; + int i; + char lhsused = 0; /* True if the LHS element has been used */ + char used[MAXRHS]; /* True for each RHS element which is used */ + + for(i=0; inrhs; i++) used[i] = 0; + lhsused = 0; + + if( rp->code==0 ){ + static char newlinestr[2] = { '\n', '\0' }; + rp->code = newlinestr; + rp->line = rp->ruleline; + } + + append_str(0,0,0,0); + + /* This const cast is wrong but harmless, if we're careful. */ + for(cp=(char *)rp->code; *cp; cp++){ + if( isalpha(*cp) && (cp==rp->code || (!isalnum(cp[-1]) && cp[-1]!='_')) ){ + char saved; + for(xp= &cp[1]; isalnum(*xp) || *xp=='_'; xp++); + saved = *xp; + *xp = 0; + if( rp->lhsalias && strcmp(cp,rp->lhsalias)==0 ){ + append_str("yygotominor.yy%d",0,rp->lhs->dtnum,0); + cp = xp; + lhsused = 1; + }else{ + for(i=0; inrhs; i++){ + if( rp->rhsalias[i] && strcmp(cp,rp->rhsalias[i])==0 ){ + if( cp!=rp->code && cp[-1]=='@' ){ + /* If the argument is of the form @X then substituted + ** the token number of X, not the value of X */ + append_str("yymsp[%d].major",-1,i-rp->nrhs+1,0); + }else{ + struct symbol *sp = rp->rhs[i]; + int dtnum; + if( sp->type==MULTITERMINAL ){ + dtnum = sp->subsym[0]->dtnum; + }else{ + dtnum = sp->dtnum; + } + append_str("yymsp[%d].minor.yy%d",0,i-rp->nrhs+1, dtnum); + } + cp = xp; + used[i] = 1; + break; + } + } + } + *xp = saved; + } + append_str(cp, 1, 0, 0); + } /* End loop */ + + /* Check to make sure the LHS has been used */ + if( rp->lhsalias && !lhsused ){ + ErrorMsg(lemp->filename,rp->ruleline, + "Label \"%s\" for \"%s(%s)\" is never used.", + rp->lhsalias,rp->lhs->name,rp->lhsalias); + lemp->errorcnt++; + } + + /* Generate destructor code for RHS symbols which are not used in the + ** reduce code */ + for(i=0; inrhs; i++){ + if( rp->rhsalias[i] && !used[i] ){ + ErrorMsg(lemp->filename,rp->ruleline, + "Label %s for \"%s(%s)\" is never used.", + rp->rhsalias[i],rp->rhs[i]->name,rp->rhsalias[i]); + lemp->errorcnt++; + }else if( rp->rhsalias[i]==0 ){ + if( has_destructor(rp->rhs[i],lemp) ){ + append_str(" yy_destructor(yypParser,%d,&yymsp[%d].minor);\n", 0, + rp->rhs[i]->index,i-rp->nrhs+1); + }else{ + /* No destructor defined for this term */ + } + } + } + if( rp->code ){ + cp = append_str(0,0,0,0); + rp->code = Strsafe(cp?cp:""); + } +} + +/* +** Generate code which executes when the rule "rp" is reduced. Write +** the code to "out". Make sure lineno stays up-to-date. +*/ +PRIVATE void emit_code( + FILE *out, + struct rule *rp, + struct lemon *lemp, + int *lineno +){ + const char *cp; + + /* Generate code to do the reduce action */ + if( rp->code ){ + if (!lemp->nolinenosflag) { (*lineno)++; tplt_linedir(out,rp->line,lemp->filename); } + fprintf(out,"{%s",rp->code); + for(cp=rp->code; *cp; cp++){ + if( *cp=='\n' ) (*lineno)++; + } /* End loop */ + fprintf(out,"}\n"); (*lineno)++; + if (!lemp->nolinenosflag) { (*lineno)++; tplt_linedir(out,*lineno,lemp->outname); } + } /* End if( rp->code ) */ + + return; +} + +/* +** Print the definition of the union used for the parser's data stack. +** This union contains fields for every possible data type for tokens +** and nonterminals. In the process of computing and printing this +** union, also set the ".dtnum" field of every terminal and nonterminal +** symbol. +*/ +void print_stack_union( + FILE *out, /* The output stream */ + struct lemon *lemp, /* The main info structure for this parser */ + int *plineno, /* Pointer to the line number */ + int mhflag /* True if generating makeheaders output */ +){ + int lineno = *plineno; /* The line number of the output */ + char **types; /* A hash table of datatypes */ + int arraysize; /* Size of the "types" array */ + int maxdtlength; /* Maximum length of any ".datatype" field. */ + char *stddt; /* Standardized name for a datatype */ + int i,j; /* Loop counters */ + unsigned hash; /* For hashing the name of a type */ + const char *name; /* Name of the parser */ + + /* Allocate and initialize types[] and allocate stddt[] */ + arraysize = lemp->nsymbol * 2; + types = (char**)calloc( arraysize, sizeof(char*) ); + if( types==0 ){ + fprintf(stderr,"Out of memory.\n"); + exit(1); + } + for(i=0; ivartype ){ + maxdtlength = lemonStrlen(lemp->vartype); + } + for(i=0; insymbol; i++){ + int len; + struct symbol *sp = lemp->symbols[i]; + if( sp->datatype==0 ) continue; + len = lemonStrlen(sp->datatype); + if( len>maxdtlength ) maxdtlength = len; + } + stddt = (char*)malloc( maxdtlength*2 + 1 ); + if( stddt==0 ){ + fprintf(stderr,"Out of memory.\n"); + exit(1); + } + + /* Build a hash table of datatypes. The ".dtnum" field of each symbol + ** is filled in with the hash index plus 1. A ".dtnum" value of 0 is + ** used for terminal symbols. If there is no %default_type defined then + ** 0 is also used as the .dtnum value for nonterminals which do not specify + ** a datatype using the %type directive. + */ + for(i=0; insymbol; i++){ + struct symbol *sp = lemp->symbols[i]; + char *cp; + if( sp==lemp->errsym ){ + sp->dtnum = arraysize+1; + continue; + } + if( sp->type!=NONTERMINAL || (sp->datatype==0 && lemp->vartype==0) ){ + sp->dtnum = 0; + continue; + } + cp = sp->datatype; + if( cp==0 ) cp = lemp->vartype; + j = 0; + while( isspace(*cp) ) cp++; + while( *cp ) stddt[j++] = *cp++; + while( j>0 && isspace(stddt[j-1]) ) j--; + stddt[j] = 0; + if( lemp->tokentype && strcmp(stddt, lemp->tokentype)==0 ){ + sp->dtnum = 0; + continue; + } + hash = 0; + for(j=0; stddt[j]; j++){ + hash = hash*53 + stddt[j]; + } + hash = (hash & 0x7fffffff)%arraysize; + while( types[hash] ){ + if( strcmp(types[hash],stddt)==0 ){ + sp->dtnum = hash + 1; + break; + } + hash++; + if( hash>=(unsigned)arraysize ) hash = 0; + } + if( types[hash]==0 ){ + sp->dtnum = hash + 1; + types[hash] = (char*)malloc( lemonStrlen(stddt)+1 ); + if( types[hash]==0 ){ + fprintf(stderr,"Out of memory.\n"); + exit(1); + } + lemon_strcpy(types[hash],stddt); + } + } + + /* Print out the definition of YYTOKENTYPE and YYMINORTYPE */ + name = lemp->name ? lemp->name : "Parse"; + lineno = *plineno; + if( mhflag ){ fprintf(out,"#if INTERFACE\n"); lineno++; } + fprintf(out,"#define %sTOKENTYPE %s\n",name, + lemp->tokentype?lemp->tokentype:"void*"); lineno++; + if( mhflag ){ fprintf(out,"#endif\n"); lineno++; } + fprintf(out,"typedef union {\n"); lineno++; + fprintf(out," int yyinit;\n"); lineno++; + fprintf(out," %sTOKENTYPE yy0;\n",name); lineno++; + for(i=0; ierrsym->useCnt ){ + fprintf(out," int yy%d;\n",lemp->errsym->dtnum); lineno++; + } + free(stddt); + free(types); + fprintf(out,"} YYMINORTYPE;\n"); lineno++; + *plineno = lineno; +} + +/* +** Return the name of a C datatype able to represent values between +** lwr and upr, inclusive. +*/ +static const char *minimum_size_type(int lwr, int upr){ + if( lwr>=0 ){ + if( upr<=255 ){ + return "unsigned char"; + }else if( upr<65535 ){ + return "unsigned short int"; + }else{ + return "unsigned int"; + } + }else if( lwr>=-127 && upr<=127 ){ + return "signed char"; + }else if( lwr>=-32767 && upr<32767 ){ + return "short"; + }else{ + return "int"; + } +} + +/* +** Each state contains a set of token transaction and a set of +** nonterminal transactions. Each of these sets makes an instance +** of the following structure. An array of these structures is used +** to order the creation of entries in the yy_action[] table. +*/ +struct axset { + struct state *stp; /* A pointer to a state */ + int isTkn; /* True to use tokens. False for non-terminals */ + int nAction; /* Number of actions */ + int iOrder; /* Original order of action sets */ +}; + +/* +** Compare to axset structures for sorting purposes +*/ +static int axset_compare(const void *a, const void *b){ + struct axset *p1 = (struct axset*)a; + struct axset *p2 = (struct axset*)b; + int c; + c = p2->nAction - p1->nAction; + if( c==0 ){ + c = p2->iOrder - p1->iOrder; + } + assert( c!=0 || p1==p2 ); + return c; +} + +/* +** Write text on "out" that describes the rule "rp". +*/ +static void writeRuleText(FILE *out, struct rule *rp){ + int j; + fprintf(out,"%s ::=", rp->lhs->name); + for(j=0; jnrhs; j++){ + struct symbol *sp = rp->rhs[j]; + if( sp->type!=MULTITERMINAL ){ + fprintf(out," %s", sp->name); + }else{ + int k; + fprintf(out," %s", sp->subsym[0]->name); + for(k=1; knsubsym; k++){ + fprintf(out,"|%s",sp->subsym[k]->name); + } + } + } +} + + +/* Generate C source code for the parser */ +void ReportTable( + struct lemon *lemp, + int mhflag /* Output in makeheaders format if true */ +){ + FILE *out, *in; + char line[LINESIZE]; + int lineno; + struct state *stp; + struct action *ap; + struct rule *rp; + struct acttab *pActtab; + int i, j, n; + const char *name; + int mnTknOfst, mxTknOfst; + int mnNtOfst, mxNtOfst; + struct axset *ax; + + in = tplt_open(lemp); + if( in==0 ) return; + out = file_open(lemp,".c","wb"); + if( out==0 ){ + fclose(in); + return; + } + lineno = 1; + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate the include code, if any */ + tplt_print(out,lemp,lemp->include,&lineno); + if( mhflag ){ + char *name = file_makename(lemp, ".h"); + fprintf(out,"#include \"%s\"\n", name); lineno++; + free(name); + } + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate #defines for all tokens */ + if( mhflag ){ + const char *prefix; + fprintf(out,"#if INTERFACE\n"); lineno++; + if( lemp->tokenprefix ) prefix = lemp->tokenprefix; + else prefix = ""; + for(i=1; interminal; i++){ + fprintf(out,"#define %s%-30s %2d\n",prefix,lemp->symbols[i]->name,i); + lineno++; + } + fprintf(out,"#endif\n"); lineno++; + } + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate the defines */ + fprintf(out,"#define YYCODETYPE %s\n", + minimum_size_type(0, lemp->nsymbol+1)); lineno++; + fprintf(out,"#define YYNOCODE %d\n",lemp->nsymbol+1); lineno++; + fprintf(out,"#define YYACTIONTYPE %s\n", + minimum_size_type(0, lemp->nstate+lemp->nrule+5)); lineno++; + if( lemp->wildcard ){ + fprintf(out,"#define YYWILDCARD %d\n", + lemp->wildcard->index); lineno++; + } + print_stack_union(out,lemp,&lineno,mhflag); + fprintf(out, "#ifndef YYSTACKDEPTH\n"); lineno++; + if( lemp->stacksize ){ + fprintf(out,"#define YYSTACKDEPTH %s\n",lemp->stacksize); lineno++; + }else{ + fprintf(out,"#define YYSTACKDEPTH 100\n"); lineno++; + } + fprintf(out, "#endif\n"); lineno++; + if( mhflag ){ + fprintf(out,"#if INTERFACE\n"); lineno++; + } + name = lemp->name ? lemp->name : "Parse"; + if( lemp->arg && lemp->arg[0] ){ + int i; + i = lemonStrlen(lemp->arg); + while( i>=1 && isspace(lemp->arg[i-1]) ) i--; + while( i>=1 && (isalnum(lemp->arg[i-1]) || lemp->arg[i-1]=='_') ) i--; + fprintf(out,"#define %sARG_SDECL %s;\n",name,lemp->arg); lineno++; + fprintf(out,"#define %sARG_PDECL ,%s\n",name,lemp->arg); lineno++; + fprintf(out,"#define %sARG_FETCH %s = yypParser->%s\n", + name,lemp->arg,&lemp->arg[i]); lineno++; + fprintf(out,"#define %sARG_STORE yypParser->%s = %s\n", + name,&lemp->arg[i],&lemp->arg[i]); lineno++; + }else{ + fprintf(out,"#define %sARG_SDECL\n",name); lineno++; + fprintf(out,"#define %sARG_PDECL\n",name); lineno++; + fprintf(out,"#define %sARG_FETCH\n",name); lineno++; + fprintf(out,"#define %sARG_STORE\n",name); lineno++; + } + if( mhflag ){ + fprintf(out,"#endif\n"); lineno++; + } + fprintf(out,"#define YYNSTATE %d\n",lemp->nstate); lineno++; + fprintf(out,"#define YYNRULE %d\n",lemp->nrule); lineno++; + if( lemp->errsym->useCnt ){ + fprintf(out,"#define YYERRORSYMBOL %d\n",lemp->errsym->index); lineno++; + fprintf(out,"#define YYERRSYMDT yy%d\n",lemp->errsym->dtnum); lineno++; + } + if( lemp->has_fallback ){ + fprintf(out,"#define YYFALLBACK 1\n"); lineno++; + } + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate the action table and its associates: + ** + ** yy_action[] A single table containing all actions. + ** yy_lookahead[] A table containing the lookahead for each entry in + ** yy_action. Used to detect hash collisions. + ** yy_shift_ofst[] For each state, the offset into yy_action for + ** shifting terminals. + ** yy_reduce_ofst[] For each state, the offset into yy_action for + ** shifting non-terminals after a reduce. + ** yy_default[] Default action for each state. + */ + + /* Compute the actions on all states and count them up */ + ax = (struct axset *) calloc(lemp->nstate*2, sizeof(ax[0])); + if( ax==0 ){ + fprintf(stderr,"malloc failed\n"); + exit(1); + } + for(i=0; instate; i++){ + stp = lemp->sorted[i]; + ax[i*2].stp = stp; + ax[i*2].isTkn = 1; + ax[i*2].nAction = stp->nTknAct; + ax[i*2+1].stp = stp; + ax[i*2+1].isTkn = 0; + ax[i*2+1].nAction = stp->nNtAct; + } + mxTknOfst = mnTknOfst = 0; + mxNtOfst = mnNtOfst = 0; + + /* Compute the action table. In order to try to keep the size of the + ** action table to a minimum, the heuristic of placing the largest action + ** sets first is used. + */ + for(i=0; instate*2; i++) ax[i].iOrder = i; + qsort(ax, lemp->nstate*2, sizeof(ax[0]), axset_compare); + pActtab = acttab_alloc(); + for(i=0; instate*2 && ax[i].nAction>0; i++){ + stp = ax[i].stp; + if( ax[i].isTkn ){ + for(ap=stp->ap; ap; ap=ap->next){ + int action; + if( ap->sp->index>=lemp->nterminal ) continue; + action = compute_action(lemp, ap); + if( action<0 ) continue; + acttab_action(pActtab, ap->sp->index, action); + } + stp->iTknOfst = acttab_insert(pActtab); + if( stp->iTknOfstiTknOfst; + if( stp->iTknOfst>mxTknOfst ) mxTknOfst = stp->iTknOfst; + }else{ + for(ap=stp->ap; ap; ap=ap->next){ + int action; + if( ap->sp->indexnterminal ) continue; + if( ap->sp->index==lemp->nsymbol ) continue; + action = compute_action(lemp, ap); + if( action<0 ) continue; + acttab_action(pActtab, ap->sp->index, action); + } + stp->iNtOfst = acttab_insert(pActtab); + if( stp->iNtOfstiNtOfst; + if( stp->iNtOfst>mxNtOfst ) mxNtOfst = stp->iNtOfst; + } + } + free(ax); + + /* Output the yy_action table */ + n = acttab_size(pActtab); + fprintf(out,"#define YY_ACTTAB_COUNT (%d)\n", n); lineno++; + fprintf(out,"static const YYACTIONTYPE yy_action[] = {\n"); lineno++; + for(i=j=0; instate + lemp->nrule + 2; + if( j==0 ) fprintf(out," /* %5d */ ", i); + fprintf(out, " %4d,", action); + if( j==9 || i==n-1 ){ + fprintf(out, "\n"); lineno++; + j = 0; + }else{ + j++; + } + } + fprintf(out, "};\n"); lineno++; + + /* Output the yy_lookahead table */ + fprintf(out,"static const YYCODETYPE yy_lookahead[] = {\n"); lineno++; + for(i=j=0; insymbol; + if( j==0 ) fprintf(out," /* %5d */ ", i); + fprintf(out, " %4d,", la); + if( j==9 || i==n-1 ){ + fprintf(out, "\n"); lineno++; + j = 0; + }else{ + j++; + } + } + fprintf(out, "};\n"); lineno++; + + /* Output the yy_shift_ofst[] table */ + fprintf(out, "#define YY_SHIFT_USE_DFLT (%d)\n", mnTknOfst-1); lineno++; + n = lemp->nstate; + while( n>0 && lemp->sorted[n-1]->iTknOfst==NO_OFFSET ) n--; + fprintf(out, "#define YY_SHIFT_COUNT (%d)\n", n-1); lineno++; + fprintf(out, "#define YY_SHIFT_MIN (%d)\n", mnTknOfst); lineno++; + fprintf(out, "#define YY_SHIFT_MAX (%d)\n", mxTknOfst); lineno++; + fprintf(out, "static const %s yy_shift_ofst[] = {\n", + minimum_size_type(mnTknOfst-1, mxTknOfst)); lineno++; + for(i=j=0; isorted[i]; + ofst = stp->iTknOfst; + if( ofst==NO_OFFSET ) ofst = mnTknOfst - 1; + if( j==0 ) fprintf(out," /* %5d */ ", i); + fprintf(out, " %4d,", ofst); + if( j==9 || i==n-1 ){ + fprintf(out, "\n"); lineno++; + j = 0; + }else{ + j++; + } + } + fprintf(out, "};\n"); lineno++; + + /* Output the yy_reduce_ofst[] table */ + fprintf(out, "#define YY_REDUCE_USE_DFLT (%d)\n", mnNtOfst-1); lineno++; + n = lemp->nstate; + while( n>0 && lemp->sorted[n-1]->iNtOfst==NO_OFFSET ) n--; + fprintf(out, "#define YY_REDUCE_COUNT (%d)\n", n-1); lineno++; + fprintf(out, "#define YY_REDUCE_MIN (%d)\n", mnNtOfst); lineno++; + fprintf(out, "#define YY_REDUCE_MAX (%d)\n", mxNtOfst); lineno++; + fprintf(out, "static const %s yy_reduce_ofst[] = {\n", + minimum_size_type(mnNtOfst-1, mxNtOfst)); lineno++; + for(i=j=0; isorted[i]; + ofst = stp->iNtOfst; + if( ofst==NO_OFFSET ) ofst = mnNtOfst - 1; + if( j==0 ) fprintf(out," /* %5d */ ", i); + fprintf(out, " %4d,", ofst); + if( j==9 || i==n-1 ){ + fprintf(out, "\n"); lineno++; + j = 0; + }else{ + j++; + } + } + fprintf(out, "};\n"); lineno++; + + /* Output the default action table */ + fprintf(out, "static const YYACTIONTYPE yy_default[] = {\n"); lineno++; + n = lemp->nstate; + for(i=j=0; isorted[i]; + if( j==0 ) fprintf(out," /* %5d */ ", i); + fprintf(out, " %4d,", stp->iDflt); + if( j==9 || i==n-1 ){ + fprintf(out, "\n"); lineno++; + j = 0; + }else{ + j++; + } + } + fprintf(out, "};\n"); lineno++; + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate the table of fallback tokens. + */ + if( lemp->has_fallback ){ + int mx = lemp->nterminal - 1; + while( mx>0 && lemp->symbols[mx]->fallback==0 ){ mx--; } + for(i=0; i<=mx; i++){ + struct symbol *p = lemp->symbols[i]; + if( p->fallback==0 ){ + fprintf(out, " 0, /* %10s => nothing */\n", p->name); + }else{ + fprintf(out, " %3d, /* %10s => %s */\n", p->fallback->index, + p->name, p->fallback->name); + } + lineno++; + } + } + tplt_xfer(lemp->name, in, out, &lineno); + + /* Generate a table containing the symbolic name of every symbol + */ + for(i=0; insymbol; i++){ + lemon_sprintf(line,"\"%s\",",lemp->symbols[i]->name); + fprintf(out," %-15s",line); + if( (i&3)==3 ){ fprintf(out,"\n"); lineno++; } + } + if( (i&3)!=0 ){ fprintf(out,"\n"); lineno++; } + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate a table containing a text string that describes every + ** rule in the rule set of the grammar. This information is used + ** when tracing REDUCE actions. + */ + for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){ + assert( rp->index==i ); + fprintf(out," /* %3d */ \"", i); + writeRuleText(out, rp); + fprintf(out,"\",\n"); lineno++; + } + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate code which executes every time a symbol is popped from + ** the stack while processing errors or while destroying the parser. + ** (In other words, generate the %destructor actions) + */ + if( lemp->tokendest ){ + int once = 1; + for(i=0; insymbol; i++){ + struct symbol *sp = lemp->symbols[i]; + if( sp==0 || sp->type!=TERMINAL ) continue; + if( once ){ + fprintf(out, " /* TERMINAL Destructor */\n"); lineno++; + once = 0; + } + fprintf(out," case %d: /* %s */\n", sp->index, sp->name); lineno++; + } + for(i=0; insymbol && lemp->symbols[i]->type!=TERMINAL; i++); + if( insymbol ){ + emit_destructor_code(out,lemp->symbols[i],lemp,&lineno); + fprintf(out," break;\n"); lineno++; + } + } + if( lemp->vardest ){ + struct symbol *dflt_sp = 0; + int once = 1; + for(i=0; insymbol; i++){ + struct symbol *sp = lemp->symbols[i]; + if( sp==0 || sp->type==TERMINAL || + sp->index<=0 || sp->destructor!=0 ) continue; + if( once ){ + fprintf(out, " /* Default NON-TERMINAL Destructor */\n"); lineno++; + once = 0; + } + fprintf(out," case %d: /* %s */\n", sp->index, sp->name); lineno++; + dflt_sp = sp; + } + if( dflt_sp!=0 ){ + emit_destructor_code(out,dflt_sp,lemp,&lineno); + } + fprintf(out," break;\n"); lineno++; + } + for(i=0; insymbol; i++){ + struct symbol *sp = lemp->symbols[i]; + if( sp==0 || sp->type==TERMINAL || sp->destructor==0 ) continue; + fprintf(out," case %d: /* %s */\n", sp->index, sp->name); lineno++; + + /* Combine duplicate destructors into a single case */ + for(j=i+1; jnsymbol; j++){ + struct symbol *sp2 = lemp->symbols[j]; + if( sp2 && sp2->type!=TERMINAL && sp2->destructor + && sp2->dtnum==sp->dtnum + && strcmp(sp->destructor,sp2->destructor)==0 ){ + fprintf(out," case %d: /* %s */\n", + sp2->index, sp2->name); lineno++; + sp2->destructor = 0; + } + } + + emit_destructor_code(out,lemp->symbols[i],lemp,&lineno); + fprintf(out," break;\n"); lineno++; + } + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate code which executes whenever the parser stack overflows */ + tplt_print(out,lemp,lemp->overflow,&lineno); + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate the table of rule information + ** + ** Note: This code depends on the fact that rules are number + ** sequentually beginning with 0. + */ + for(rp=lemp->rule; rp; rp=rp->next){ + fprintf(out," { %d, %d },\n",rp->lhs->index,rp->nrhs); lineno++; + } + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate code which execution during each REDUCE action */ + for(rp=lemp->rule; rp; rp=rp->next){ + translate_code(lemp, rp); + } + /* First output rules other than the default: rule */ + for(rp=lemp->rule; rp; rp=rp->next){ + struct rule *rp2; /* Other rules with the same action */ + if( rp->code==0 ) continue; + if( rp->code[0]=='\n' && rp->code[1]==0 ) continue; /* Will be default: */ + fprintf(out," case %d: /* ", rp->index); + writeRuleText(out, rp); + fprintf(out, " */\n"); lineno++; + for(rp2=rp->next; rp2; rp2=rp2->next){ + if( rp2->code==rp->code ){ + fprintf(out," case %d: /* ", rp2->index); + writeRuleText(out, rp2); + fprintf(out," */ yytestcase(yyruleno==%d);\n", rp2->index); lineno++; + rp2->code = 0; + } + } + emit_code(out,rp,lemp,&lineno); + fprintf(out," break;\n"); lineno++; + rp->code = 0; + } + /* Finally, output the default: rule. We choose as the default: all + ** empty actions. */ + fprintf(out," default:\n"); lineno++; + for(rp=lemp->rule; rp; rp=rp->next){ + if( rp->code==0 ) continue; + assert( rp->code[0]=='\n' && rp->code[1]==0 ); + fprintf(out," /* (%d) ", rp->index); + writeRuleText(out, rp); + fprintf(out, " */ yytestcase(yyruleno==%d);\n", rp->index); lineno++; + } + fprintf(out," break;\n"); lineno++; + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate code which executes if a parse fails */ + tplt_print(out,lemp,lemp->failure,&lineno); + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate code which executes when a syntax error occurs */ + tplt_print(out,lemp,lemp->error,&lineno); + tplt_xfer(lemp->name,in,out,&lineno); + + /* Generate code which executes when the parser accepts its input */ + tplt_print(out,lemp,lemp->accept,&lineno); + tplt_xfer(lemp->name,in,out,&lineno); + + /* Append any addition code the user desires */ + tplt_print(out,lemp,lemp->extracode,&lineno); + + fclose(in); + fclose(out); + return; +} + +/* Generate a header file for the parser */ +void ReportHeader(struct lemon *lemp) +{ + FILE *out, *in; + const char *prefix; + char line[LINESIZE]; + char pattern[LINESIZE]; + int i; + + if( lemp->tokenprefix ) prefix = lemp->tokenprefix; + else prefix = ""; + in = file_open(lemp,".h","rb"); + if( in ){ + int nextChar; + for(i=1; interminal && fgets(line,LINESIZE,in); i++){ + lemon_sprintf(pattern,"#define %s%-30s %3d\n", + prefix,lemp->symbols[i]->name,i); + if( strcmp(line,pattern) ) break; + } + nextChar = fgetc(in); + fclose(in); + if( i==lemp->nterminal && nextChar==EOF ){ + /* No change in the file. Don't rewrite it. */ + return; + } + } + out = file_open(lemp,".h","wb"); + if( out ){ + for(i=1; interminal; i++){ + fprintf(out,"#define %s%-30s %3d\n",prefix,lemp->symbols[i]->name,i); + } + fclose(out); + } + return; +} + +/* Reduce the size of the action tables, if possible, by making use +** of defaults. +** +** In this version, we take the most frequent REDUCE action and make +** it the default. Except, there is no default if the wildcard token +** is a possible look-ahead. +*/ +void CompressTables(struct lemon *lemp) +{ + struct state *stp; + struct action *ap, *ap2; + struct rule *rp, *rp2, *rbest; + int nbest, n; + int i; + int usesWildcard; + + for(i=0; instate; i++){ + stp = lemp->sorted[i]; + nbest = 0; + rbest = 0; + usesWildcard = 0; + + for(ap=stp->ap; ap; ap=ap->next){ + if( ap->type==SHIFT && ap->sp==lemp->wildcard ){ + usesWildcard = 1; + } + if( ap->type!=REDUCE ) continue; + rp = ap->x.rp; + if( rp->lhsStart ) continue; + if( rp==rbest ) continue; + n = 1; + for(ap2=ap->next; ap2; ap2=ap2->next){ + if( ap2->type!=REDUCE ) continue; + rp2 = ap2->x.rp; + if( rp2==rbest ) continue; + if( rp2==rp ) n++; + } + if( n>nbest ){ + nbest = n; + rbest = rp; + } + } + + /* Do not make a default if the number of rules to default + ** is not at least 1 or if the wildcard token is a possible + ** lookahead. + */ + if( nbest<1 || usesWildcard ) continue; + + + /* Combine matching REDUCE actions into a single default */ + for(ap=stp->ap; ap; ap=ap->next){ + if( ap->type==REDUCE && ap->x.rp==rbest ) break; + } + assert( ap ); + ap->sp = Symbol_new("{default}"); + for(ap=ap->next; ap; ap=ap->next){ + if( ap->type==REDUCE && ap->x.rp==rbest ) ap->type = NOT_USED; + } + stp->ap = Action_sort(stp->ap); + } +} + + +/* +** Compare two states for sorting purposes. The smaller state is the +** one with the most non-terminal actions. If they have the same number +** of non-terminal actions, then the smaller is the one with the most +** token actions. +*/ +static int stateResortCompare(const void *a, const void *b){ + const struct state *pA = *(const struct state**)a; + const struct state *pB = *(const struct state**)b; + int n; + + n = pB->nNtAct - pA->nNtAct; + if( n==0 ){ + n = pB->nTknAct - pA->nTknAct; + if( n==0 ){ + n = pB->statenum - pA->statenum; + } + } + assert( n!=0 ); + return n; +} + + +/* +** Renumber and resort states so that states with fewer choices +** occur at the end. Except, keep state 0 as the first state. +*/ +void ResortStates(struct lemon *lemp) +{ + int i; + struct state *stp; + struct action *ap; + + for(i=0; instate; i++){ + stp = lemp->sorted[i]; + stp->nTknAct = stp->nNtAct = 0; + stp->iDflt = lemp->nstate + lemp->nrule; + stp->iTknOfst = NO_OFFSET; + stp->iNtOfst = NO_OFFSET; + for(ap=stp->ap; ap; ap=ap->next){ + if( compute_action(lemp,ap)>=0 ){ + if( ap->sp->indexnterminal ){ + stp->nTknAct++; + }else if( ap->sp->indexnsymbol ){ + stp->nNtAct++; + }else{ + stp->iDflt = compute_action(lemp, ap); + } + } + } + } + qsort(&lemp->sorted[1], lemp->nstate-1, sizeof(lemp->sorted[0]), + stateResortCompare); + for(i=0; instate; i++){ + lemp->sorted[i]->statenum = i; + } +} + + +/***************** From the file "set.c" ************************************/ +/* +** Set manipulation routines for the LEMON parser generator. +*/ + +static int size = 0; + +/* Set the set size */ +void SetSize(int n) +{ + size = n+1; +} + +/* Allocate a new set */ +char *SetNew(){ + char *s; + s = (char*)calloc( size, 1); + if( s==0 ){ + extern void memory_error(); + memory_error(); + } + return s; +} + +/* Deallocate a set */ +void SetFree(char *s) +{ + free(s); +} + +/* Add a new element to the set. Return TRUE if the element was added +** and FALSE if it was already there. */ +int SetAdd(char *s, int e) +{ + int rv; + assert( e>=0 && esize = 1024; + x1a->count = 0; + x1a->tbl = (x1node*)calloc(1024, sizeof(x1node) + sizeof(x1node*)); + if( x1a->tbl==0 ){ + free(x1a); + x1a = 0; + }else{ + int i; + x1a->ht = (x1node**)&(x1a->tbl[1024]); + for(i=0; i<1024; i++) x1a->ht[i] = 0; + } + } +} +/* Insert a new record into the array. Return TRUE if successful. +** Prior data with the same key is NOT overwritten */ +int Strsafe_insert(const char *data) +{ + x1node *np; + unsigned h; + unsigned ph; + + if( x1a==0 ) return 0; + ph = strhash(data); + h = ph & (x1a->size-1); + np = x1a->ht[h]; + while( np ){ + if( strcmp(np->data,data)==0 ){ + /* An existing entry with the same key is found. */ + /* Fail because overwrite is not allows. */ + return 0; + } + np = np->next; + } + if( x1a->count>=x1a->size ){ + /* Need to make the hash table bigger */ + int i,size; + struct s_x1 array; + array.size = size = x1a->size*2; + array.count = x1a->count; + array.tbl = (x1node*)calloc(size, sizeof(x1node) + sizeof(x1node*)); + if( array.tbl==0 ) return 0; /* Fail due to malloc failure */ + array.ht = (x1node**)&(array.tbl[size]); + for(i=0; icount; i++){ + x1node *oldnp, *newnp; + oldnp = &(x1a->tbl[i]); + h = strhash(oldnp->data) & (size-1); + newnp = &(array.tbl[i]); + if( array.ht[h] ) array.ht[h]->from = &(newnp->next); + newnp->next = array.ht[h]; + newnp->data = oldnp->data; + newnp->from = &(array.ht[h]); + array.ht[h] = newnp; + } + free(x1a->tbl); + *x1a = array; + } + /* Insert the new data */ + h = ph & (x1a->size-1); + np = &(x1a->tbl[x1a->count++]); + np->data = data; + if( x1a->ht[h] ) x1a->ht[h]->from = &(np->next); + np->next = x1a->ht[h]; + x1a->ht[h] = np; + np->from = &(x1a->ht[h]); + return 1; +} + +/* Return a pointer to data assigned to the given key. Return NULL +** if no such key. */ +const char *Strsafe_find(const char *key) +{ + unsigned h; + x1node *np; + + if( x1a==0 ) return 0; + h = strhash(key) & (x1a->size-1); + np = x1a->ht[h]; + while( np ){ + if( strcmp(np->data,key)==0 ) break; + np = np->next; + } + return np ? np->data : 0; +} + +/* Return a pointer to the (terminal or nonterminal) symbol "x". +** Create a new symbol if this is the first time "x" has been seen. +*/ +struct symbol *Symbol_new(const char *x) +{ + struct symbol *sp; + + sp = Symbol_find(x); + if( sp==0 ){ + sp = (struct symbol *)calloc(1, sizeof(struct symbol) ); + MemoryCheck(sp); + sp->name = Strsafe(x); + sp->type = isupper(*x) ? TERMINAL : NONTERMINAL; + sp->rule = 0; + sp->fallback = 0; + sp->prec = -1; + sp->assoc = UNK; + sp->firstset = 0; + sp->lambda = LEMON_FALSE; + sp->destructor = 0; + sp->destLineno = 0; + sp->datatype = 0; + sp->useCnt = 0; + Symbol_insert(sp,sp->name); + } + sp->useCnt++; + return sp; +} + +/* Compare two symbols for sorting purposes. Return negative, +** zero, or positive if a is less then, equal to, or greater +** than b. +** +** Symbols that begin with upper case letters (terminals or tokens) +** must sort before symbols that begin with lower case letters +** (non-terminals). And MULTITERMINAL symbols (created using the +** %token_class directive) must sort at the very end. Other than +** that, the order does not matter. +** +** We find experimentally that leaving the symbols in their original +** order (the order they appeared in the grammar file) gives the +** smallest parser tables in SQLite. +*/ +int Symbolcmpp(const void *_a, const void *_b) +{ + const struct symbol *a = *(const struct symbol **) _a; + const struct symbol *b = *(const struct symbol **) _b; + int i1 = a->type==MULTITERMINAL ? 3 : a->name[0]>'Z' ? 2 : 1; + int i2 = b->type==MULTITERMINAL ? 3 : b->name[0]>'Z' ? 2 : 1; + return i1==i2 ? a->index - b->index : i1 - i2; +} + +/* There is one instance of the following structure for each +** associative array of type "x2". +*/ +struct s_x2 { + int size; /* The number of available slots. */ + /* Must be a power of 2 greater than or */ + /* equal to 1 */ + int count; /* Number of currently slots filled */ + struct s_x2node *tbl; /* The data stored here */ + struct s_x2node **ht; /* Hash table for lookups */ +}; + +/* There is one instance of this structure for every data element +** in an associative array of type "x2". +*/ +typedef struct s_x2node { + struct symbol *data; /* The data */ + const char *key; /* The key */ + struct s_x2node *next; /* Next entry with the same hash */ + struct s_x2node **from; /* Previous link */ +} x2node; + +/* There is only one instance of the array, which is the following */ +static struct s_x2 *x2a; + +/* Allocate a new associative array */ +void Symbol_init(){ + if( x2a ) return; + x2a = (struct s_x2*)malloc( sizeof(struct s_x2) ); + if( x2a ){ + x2a->size = 128; + x2a->count = 0; + x2a->tbl = (x2node*)calloc(128, sizeof(x2node) + sizeof(x2node*)); + if( x2a->tbl==0 ){ + free(x2a); + x2a = 0; + }else{ + int i; + x2a->ht = (x2node**)&(x2a->tbl[128]); + for(i=0; i<128; i++) x2a->ht[i] = 0; + } + } +} +/* Insert a new record into the array. Return TRUE if successful. +** Prior data with the same key is NOT overwritten */ +int Symbol_insert(struct symbol *data, const char *key) +{ + x2node *np; + unsigned h; + unsigned ph; + + if( x2a==0 ) return 0; + ph = strhash(key); + h = ph & (x2a->size-1); + np = x2a->ht[h]; + while( np ){ + if( strcmp(np->key,key)==0 ){ + /* An existing entry with the same key is found. */ + /* Fail because overwrite is not allows. */ + return 0; + } + np = np->next; + } + if( x2a->count>=x2a->size ){ + /* Need to make the hash table bigger */ + int i,size; + struct s_x2 array; + array.size = size = x2a->size*2; + array.count = x2a->count; + array.tbl = (x2node*)calloc(size, sizeof(x2node) + sizeof(x2node*)); + if( array.tbl==0 ) return 0; /* Fail due to malloc failure */ + array.ht = (x2node**)&(array.tbl[size]); + for(i=0; icount; i++){ + x2node *oldnp, *newnp; + oldnp = &(x2a->tbl[i]); + h = strhash(oldnp->key) & (size-1); + newnp = &(array.tbl[i]); + if( array.ht[h] ) array.ht[h]->from = &(newnp->next); + newnp->next = array.ht[h]; + newnp->key = oldnp->key; + newnp->data = oldnp->data; + newnp->from = &(array.ht[h]); + array.ht[h] = newnp; + } + free(x2a->tbl); + *x2a = array; + } + /* Insert the new data */ + h = ph & (x2a->size-1); + np = &(x2a->tbl[x2a->count++]); + np->key = key; + np->data = data; + if( x2a->ht[h] ) x2a->ht[h]->from = &(np->next); + np->next = x2a->ht[h]; + x2a->ht[h] = np; + np->from = &(x2a->ht[h]); + return 1; +} + +/* Return a pointer to data assigned to the given key. Return NULL +** if no such key. */ +struct symbol *Symbol_find(const char *key) +{ + unsigned h; + x2node *np; + + if( x2a==0 ) return 0; + h = strhash(key) & (x2a->size-1); + np = x2a->ht[h]; + while( np ){ + if( strcmp(np->key,key)==0 ) break; + np = np->next; + } + return np ? np->data : 0; +} + +/* Return the n-th data. Return NULL if n is out of range. */ +struct symbol *Symbol_Nth(int n) +{ + struct symbol *data; + if( x2a && n>0 && n<=x2a->count ){ + data = x2a->tbl[n-1].data; + }else{ + data = 0; + } + return data; +} + +/* Return the size of the array */ +int Symbol_count() +{ + return x2a ? x2a->count : 0; +} + +/* Return an array of pointers to all data in the table. +** The array is obtained from malloc. Return NULL if memory allocation +** problems, or if the array is empty. */ +struct symbol **Symbol_arrayof() +{ + struct symbol **array; + int i,size; + if( x2a==0 ) return 0; + size = x2a->count; + array = (struct symbol **)calloc(size, sizeof(struct symbol *)); + if( array ){ + for(i=0; itbl[i].data; + } + return array; +} + +/* Compare two configurations */ +int Configcmp(const char *_a,const char *_b) +{ + const struct config *a = (struct config *) _a; + const struct config *b = (struct config *) _b; + int x; + x = a->rp->index - b->rp->index; + if( x==0 ) x = a->dot - b->dot; + return x; +} + +/* Compare two states */ +PRIVATE int statecmp(struct config *a, struct config *b) +{ + int rc; + for(rc=0; rc==0 && a && b; a=a->bp, b=b->bp){ + rc = a->rp->index - b->rp->index; + if( rc==0 ) rc = a->dot - b->dot; + } + if( rc==0 ){ + if( a ) rc = 1; + if( b ) rc = -1; + } + return rc; +} + +/* Hash a state */ +PRIVATE unsigned statehash(struct config *a) +{ + unsigned h=0; + while( a ){ + h = h*571 + a->rp->index*37 + a->dot; + a = a->bp; + } + return h; +} + +/* Allocate a new state structure */ +struct state *State_new() +{ + struct state *newstate; + newstate = (struct state *)calloc(1, sizeof(struct state) ); + MemoryCheck(newstate); + return newstate; +} + +/* There is one instance of the following structure for each +** associative array of type "x3". +*/ +struct s_x3 { + int size; /* The number of available slots. */ + /* Must be a power of 2 greater than or */ + /* equal to 1 */ + int count; /* Number of currently slots filled */ + struct s_x3node *tbl; /* The data stored here */ + struct s_x3node **ht; /* Hash table for lookups */ +}; + +/* There is one instance of this structure for every data element +** in an associative array of type "x3". +*/ +typedef struct s_x3node { + struct state *data; /* The data */ + struct config *key; /* The key */ + struct s_x3node *next; /* Next entry with the same hash */ + struct s_x3node **from; /* Previous link */ +} x3node; + +/* There is only one instance of the array, which is the following */ +static struct s_x3 *x3a; + +/* Allocate a new associative array */ +void State_init(){ + if( x3a ) return; + x3a = (struct s_x3*)malloc( sizeof(struct s_x3) ); + if( x3a ){ + x3a->size = 128; + x3a->count = 0; + x3a->tbl = (x3node*)calloc(128, sizeof(x3node) + sizeof(x3node*)); + if( x3a->tbl==0 ){ + free(x3a); + x3a = 0; + }else{ + int i; + x3a->ht = (x3node**)&(x3a->tbl[128]); + for(i=0; i<128; i++) x3a->ht[i] = 0; + } + } +} +/* Insert a new record into the array. Return TRUE if successful. +** Prior data with the same key is NOT overwritten */ +int State_insert(struct state *data, struct config *key) +{ + x3node *np; + unsigned h; + unsigned ph; + + if( x3a==0 ) return 0; + ph = statehash(key); + h = ph & (x3a->size-1); + np = x3a->ht[h]; + while( np ){ + if( statecmp(np->key,key)==0 ){ + /* An existing entry with the same key is found. */ + /* Fail because overwrite is not allows. */ + return 0; + } + np = np->next; + } + if( x3a->count>=x3a->size ){ + /* Need to make the hash table bigger */ + int i,size; + struct s_x3 array; + array.size = size = x3a->size*2; + array.count = x3a->count; + array.tbl = (x3node*)calloc(size, sizeof(x3node) + sizeof(x3node*)); + if( array.tbl==0 ) return 0; /* Fail due to malloc failure */ + array.ht = (x3node**)&(array.tbl[size]); + for(i=0; icount; i++){ + x3node *oldnp, *newnp; + oldnp = &(x3a->tbl[i]); + h = statehash(oldnp->key) & (size-1); + newnp = &(array.tbl[i]); + if( array.ht[h] ) array.ht[h]->from = &(newnp->next); + newnp->next = array.ht[h]; + newnp->key = oldnp->key; + newnp->data = oldnp->data; + newnp->from = &(array.ht[h]); + array.ht[h] = newnp; + } + free(x3a->tbl); + *x3a = array; + } + /* Insert the new data */ + h = ph & (x3a->size-1); + np = &(x3a->tbl[x3a->count++]); + np->key = key; + np->data = data; + if( x3a->ht[h] ) x3a->ht[h]->from = &(np->next); + np->next = x3a->ht[h]; + x3a->ht[h] = np; + np->from = &(x3a->ht[h]); + return 1; +} + +/* Return a pointer to data assigned to the given key. Return NULL +** if no such key. */ +struct state *State_find(struct config *key) +{ + unsigned h; + x3node *np; + + if( x3a==0 ) return 0; + h = statehash(key) & (x3a->size-1); + np = x3a->ht[h]; + while( np ){ + if( statecmp(np->key,key)==0 ) break; + np = np->next; + } + return np ? np->data : 0; +} + +/* Return an array of pointers to all data in the table. +** The array is obtained from malloc. Return NULL if memory allocation +** problems, or if the array is empty. */ +struct state **State_arrayof() +{ + struct state **array; + int i,size; + if( x3a==0 ) return 0; + size = x3a->count; + array = (struct state **)calloc(size, sizeof(struct state *)); + if( array ){ + for(i=0; itbl[i].data; + } + return array; +} + +/* Hash a configuration */ +PRIVATE unsigned confighash(struct config *a) +{ + unsigned h=0; + h = h*571 + a->rp->index*37 + a->dot; + return h; +} + +/* There is one instance of the following structure for each +** associative array of type "x4". +*/ +struct s_x4 { + int size; /* The number of available slots. */ + /* Must be a power of 2 greater than or */ + /* equal to 1 */ + int count; /* Number of currently slots filled */ + struct s_x4node *tbl; /* The data stored here */ + struct s_x4node **ht; /* Hash table for lookups */ +}; + +/* There is one instance of this structure for every data element +** in an associative array of type "x4". +*/ +typedef struct s_x4node { + struct config *data; /* The data */ + struct s_x4node *next; /* Next entry with the same hash */ + struct s_x4node **from; /* Previous link */ +} x4node; + +/* There is only one instance of the array, which is the following */ +static struct s_x4 *x4a; + +/* Allocate a new associative array */ +void Configtable_init(){ + if( x4a ) return; + x4a = (struct s_x4*)malloc( sizeof(struct s_x4) ); + if( x4a ){ + x4a->size = 64; + x4a->count = 0; + x4a->tbl = (x4node*)calloc(64, sizeof(x4node) + sizeof(x4node*)); + if( x4a->tbl==0 ){ + free(x4a); + x4a = 0; + }else{ + int i; + x4a->ht = (x4node**)&(x4a->tbl[64]); + for(i=0; i<64; i++) x4a->ht[i] = 0; + } + } +} +/* Insert a new record into the array. Return TRUE if successful. +** Prior data with the same key is NOT overwritten */ +int Configtable_insert(struct config *data) +{ + x4node *np; + unsigned h; + unsigned ph; + + if( x4a==0 ) return 0; + ph = confighash(data); + h = ph & (x4a->size-1); + np = x4a->ht[h]; + while( np ){ + if( Configcmp((const char *) np->data,(const char *) data)==0 ){ + /* An existing entry with the same key is found. */ + /* Fail because overwrite is not allows. */ + return 0; + } + np = np->next; + } + if( x4a->count>=x4a->size ){ + /* Need to make the hash table bigger */ + int i,size; + struct s_x4 array; + array.size = size = x4a->size*2; + array.count = x4a->count; + array.tbl = (x4node*)calloc(size, sizeof(x4node) + sizeof(x4node*)); + if( array.tbl==0 ) return 0; /* Fail due to malloc failure */ + array.ht = (x4node**)&(array.tbl[size]); + for(i=0; icount; i++){ + x4node *oldnp, *newnp; + oldnp = &(x4a->tbl[i]); + h = confighash(oldnp->data) & (size-1); + newnp = &(array.tbl[i]); + if( array.ht[h] ) array.ht[h]->from = &(newnp->next); + newnp->next = array.ht[h]; + newnp->data = oldnp->data; + newnp->from = &(array.ht[h]); + array.ht[h] = newnp; + } + free(x4a->tbl); + *x4a = array; + } + /* Insert the new data */ + h = ph & (x4a->size-1); + np = &(x4a->tbl[x4a->count++]); + np->data = data; + if( x4a->ht[h] ) x4a->ht[h]->from = &(np->next); + np->next = x4a->ht[h]; + x4a->ht[h] = np; + np->from = &(x4a->ht[h]); + return 1; +} + +/* Return a pointer to data assigned to the given key. Return NULL +** if no such key. */ +struct config *Configtable_find(struct config *key) +{ + int h; + x4node *np; + + if( x4a==0 ) return 0; + h = confighash(key) & (x4a->size-1); + np = x4a->ht[h]; + while( np ){ + if( Configcmp((const char *) np->data,(const char *) key)==0 ) break; + np = np->next; + } + return np ? np->data : 0; +} + +/* Remove all data from the table. Pass each data to the function "f" +** as it is removed. ("f" may be null to avoid this step.) */ +void Configtable_clear(int(*f)(struct config *)) +{ + int i; + if( x4a==0 || x4a->count==0 ) return; + if( f ) for(i=0; icount; i++) (*f)(x4a->tbl[i].data); + for(i=0; isize; i++) x4a->ht[i] = 0; + x4a->count = 0; + return; +} diff --git a/package/luci/modules/luci-lua-runtime/src/contrib/lempar.c b/package/luci/modules/luci-lua-runtime/src/contrib/lempar.c new file mode 100644 index 0000000000..a4e3c07ddb --- /dev/null +++ b/package/luci/modules/luci-lua-runtime/src/contrib/lempar.c @@ -0,0 +1,851 @@ +/* Driver template for the LEMON parser generator. +** The author disclaims copyright to this source code. +*/ +/* First off, code is included that follows the "include" declaration +** in the input grammar file. */ +#include +%% +/* Next is all token values, in a form suitable for use by makeheaders. +** This section will be null unless lemon is run with the -m switch. +*/ +/* +** These constants (all generated automatically by the parser generator) +** specify the various kinds of tokens (terminals) that the parser +** understands. +** +** Each symbol here is a terminal symbol in the grammar. +*/ +%% +/* Make sure the INTERFACE macro is defined. +*/ +#ifndef INTERFACE +# define INTERFACE 1 +#endif +/* The next thing included is series of defines which control +** various aspects of the generated parser. +** YYCODETYPE is the data type used for storing terminal +** and nonterminal numbers. "unsigned char" is +** used if there are fewer than 250 terminals +** and nonterminals. "int" is used otherwise. +** YYNOCODE is a number of type YYCODETYPE which corresponds +** to no legal terminal or nonterminal number. This +** number is used to fill in empty slots of the hash +** table. +** YYFALLBACK If defined, this indicates that one or more tokens +** have fall-back values which should be used if the +** original value of the token will not parse. +** YYACTIONTYPE is the data type used for storing terminal +** and nonterminal numbers. "unsigned char" is +** used if there are fewer than 250 rules and +** states combined. "int" is used otherwise. +** ParseTOKENTYPE is the data type used for minor tokens given +** directly to the parser from the tokenizer. +** YYMINORTYPE is the data type used for all minor tokens. +** This is typically a union of many types, one of +** which is ParseTOKENTYPE. The entry in the union +** for base tokens is called "yy0". +** YYSTACKDEPTH is the maximum depth of the parser's stack. If +** zero the stack is dynamically sized using realloc() +** ParseARG_SDECL A static variable declaration for the %extra_argument +** ParseARG_PDECL A parameter declaration for the %extra_argument +** ParseARG_STORE Code to store %extra_argument into yypParser +** ParseARG_FETCH Code to extract %extra_argument from yypParser +** YYNSTATE the combined number of states. +** YYNRULE the number of rules in the grammar +** YYERRORSYMBOL is the code number of the error symbol. If not +** defined, then do no error processing. +*/ +%% +#define YY_NO_ACTION (YYNSTATE+YYNRULE+2) +#define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1) +#define YY_ERROR_ACTION (YYNSTATE+YYNRULE) + +/* The yyzerominor constant is used to initialize instances of +** YYMINORTYPE objects to zero. */ +static const YYMINORTYPE yyzerominor = { 0 }; + +/* Define the yytestcase() macro to be a no-op if is not already defined +** otherwise. +** +** Applications can choose to define yytestcase() in the %include section +** to a macro that can assist in verifying code coverage. For production +** code the yytestcase() macro should be turned off. But it is useful +** for testing. +*/ +#ifndef yytestcase +# define yytestcase(X) +#endif + + +/* Next are the tables used to determine what action to take based on the +** current state and lookahead token. These tables are used to implement +** functions that take a state number and lookahead value and return an +** action integer. +** +** Suppose the action integer is N. Then the action is determined as +** follows +** +** 0 <= N < YYNSTATE Shift N. That is, push the lookahead +** token onto the stack and goto state N. +** +** YYNSTATE <= N < YYNSTATE+YYNRULE Reduce by rule N-YYNSTATE. +** +** N == YYNSTATE+YYNRULE A syntax error has occurred. +** +** N == YYNSTATE+YYNRULE+1 The parser accepts its input. +** +** N == YYNSTATE+YYNRULE+2 No such action. Denotes unused +** slots in the yy_action[] table. +** +** The action table is constructed as a single large table named yy_action[]. +** Given state S and lookahead X, the action is computed as +** +** yy_action[ yy_shift_ofst[S] + X ] +** +** If the index value yy_shift_ofst[S]+X is out of range or if the value +** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S] +** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table +** and that yy_default[S] should be used instead. +** +** The formula above is for computing the action when the lookahead is +** a terminal symbol. If the lookahead is a non-terminal (as occurs after +** a reduce action) then the yy_reduce_ofst[] array is used in place of +** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of +** YY_SHIFT_USE_DFLT. +** +** The following are the tables generated in this section: +** +** yy_action[] A single table containing all actions. +** yy_lookahead[] A table containing the lookahead for each entry in +** yy_action. Used to detect hash collisions. +** yy_shift_ofst[] For each state, the offset into yy_action for +** shifting terminals. +** yy_reduce_ofst[] For each state, the offset into yy_action for +** shifting non-terminals after a reduce. +** yy_default[] Default action for each state. +*/ +%% + +/* The next table maps tokens into fallback tokens. If a construct +** like the following: +** +** %fallback ID X Y Z. +** +** appears in the grammar, then ID becomes a fallback token for X, Y, +** and Z. Whenever one of the tokens X, Y, or Z is input to the parser +** but it does not parse, the type of the token is changed to ID and +** the parse is retried before an error is thrown. +*/ +#ifdef YYFALLBACK +static const YYCODETYPE yyFallback[] = { +%% +}; +#endif /* YYFALLBACK */ + +/* The following structure represents a single element of the +** parser's stack. Information stored includes: +** +** + The state number for the parser at this level of the stack. +** +** + The value of the token stored at this level of the stack. +** (In other words, the "major" token.) +** +** + The semantic value stored at this level of the stack. This is +** the information used by the action routines in the grammar. +** It is sometimes called the "minor" token. +*/ +struct yyStackEntry { + YYACTIONTYPE stateno; /* The state-number */ + YYCODETYPE major; /* The major token value. This is the code + ** number for the token at this stack level */ + YYMINORTYPE minor; /* The user-supplied minor token value. This + ** is the value of the token */ +}; +typedef struct yyStackEntry yyStackEntry; + +/* The state of the parser is completely contained in an instance of +** the following structure */ +struct yyParser { + int yyidx; /* Index of top element in stack */ +#ifdef YYTRACKMAXSTACKDEPTH + int yyidxMax; /* Maximum value of yyidx */ +#endif + int yyerrcnt; /* Shifts left before out of the error */ + ParseARG_SDECL /* A place to hold %extra_argument */ +#if YYSTACKDEPTH<=0 + int yystksz; /* Current side of the stack */ + yyStackEntry *yystack; /* The parser's stack */ +#else + yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ +#endif +}; +typedef struct yyParser yyParser; + +#ifndef NDEBUG +#include +static FILE *yyTraceFILE = 0; +static char *yyTracePrompt = 0; +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* +** Turn parser tracing on by giving a stream to which to write the trace +** and a prompt to preface each trace message. Tracing is turned off +** by making either argument NULL +** +** Inputs: +**
      +**
    • A FILE* to which trace output should be written. +** If NULL, then tracing is turned off. +**
    • A prefix string written at the beginning of every +** line of trace output. If NULL, then tracing is +** turned off. +**
    +** +** Outputs: +** None. +*/ +void ParseTrace(FILE *TraceFILE, char *zTracePrompt); +void ParseTrace(FILE *TraceFILE, char *zTracePrompt){ + yyTraceFILE = TraceFILE; + yyTracePrompt = zTracePrompt; + if( yyTraceFILE==0 ) yyTracePrompt = 0; + else if( yyTracePrompt==0 ) yyTraceFILE = 0; +} +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* For tracing shifts, the names of all terminals and nonterminals +** are required. The following table supplies these names */ +static const char *const yyTokenName[] = { +%% +}; +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* For tracing reduce actions, the names of all rules are required. +*/ +static const char *const yyRuleName[] = { +%% +}; +#endif /* NDEBUG */ + + +#if YYSTACKDEPTH<=0 +/* +** Try to increase the size of the parser stack. +*/ +static void yyGrowStack(yyParser *p){ + int newSize; + yyStackEntry *pNew; + + newSize = p->yystksz*2 + 100; + pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); + if( pNew ){ + p->yystack = pNew; + p->yystksz = newSize; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sStack grows to %d entries!\n", + yyTracePrompt, p->yystksz); + } +#endif + } +} +#endif + +/* +** This function allocates a new parser. +** The only argument is a pointer to a function which works like +** malloc. +** +** Inputs: +** A pointer to the function used to allocate memory. +** +** Outputs: +** A pointer to a parser. This pointer is used in subsequent calls +** to Parse and ParseFree. +*/ +void *ParseAlloc(void *(*mallocProc)(size_t)){ + yyParser *pParser; + pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser) ); + if( pParser ){ + pParser->yyidx = -1; +#ifdef YYTRACKMAXSTACKDEPTH + pParser->yyidxMax = 0; +#endif +#if YYSTACKDEPTH<=0 + pParser->yystack = NULL; + pParser->yystksz = 0; + yyGrowStack(pParser); +#endif + } + return pParser; +} + +/* The following function deletes the value associated with a +** symbol. The symbol can be either a terminal or nonterminal. +** "yymajor" is the symbol code, and "yypminor" is a pointer to +** the value. +*/ +static void yy_destructor( + yyParser *yypParser, /* The parser */ + YYCODETYPE yymajor, /* Type code for object to destroy */ + YYMINORTYPE *yypminor /* The object to be destroyed */ +){ + ParseARG_FETCH; + switch( yymajor ){ + /* Here is inserted the actions which take place when a + ** terminal or non-terminal is destroyed. This can happen + ** when the symbol is popped from the stack during a + ** reduce or during error processing or when a parser is + ** being destroyed before it is finished parsing. + ** + ** Note: during a reduce, the only symbols destroyed are those + ** which appear on the RHS of the rule, but which are not used + ** inside the C code. + */ +%% + default: break; /* If no destructor action specified: do nothing */ + } +} + +/* +** Pop the parser's stack once. +** +** If there is a destructor routine associated with the token which +** is popped from the stack, then call it. +** +** Return the major token number for the symbol popped. +*/ +static int yy_pop_parser_stack(yyParser *pParser){ + YYCODETYPE yymajor; + yyStackEntry *yytos = &pParser->yystack[pParser->yyidx]; + + if( pParser->yyidx<0 ) return 0; +#ifndef NDEBUG + if( yyTraceFILE && pParser->yyidx>=0 ){ + fprintf(yyTraceFILE,"%sPopping %s\n", + yyTracePrompt, + yyTokenName[yytos->major]); + } +#endif + yymajor = yytos->major; + yy_destructor(pParser, yymajor, &yytos->minor); + pParser->yyidx--; + return yymajor; +} + +/* +** Deallocate and destroy a parser. Destructors are all called for +** all stack elements before shutting the parser down. +** +** Inputs: +**
      +**
    • A pointer to the parser. This should be a pointer +** obtained from ParseAlloc. +**
    • A pointer to a function used to reclaim memory obtained +** from malloc. +**
    +*/ +void ParseFree( + void *p, /* The parser to be deleted */ + void (*freeProc)(void*) /* Function used to reclaim memory */ +){ + yyParser *pParser = (yyParser*)p; + if( pParser==0 ) return; + while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser); +#if YYSTACKDEPTH<=0 + free(pParser->yystack); +#endif + (*freeProc)((void*)pParser); +} + +/* +** Return the peak depth of the stack for a parser. +*/ +#ifdef YYTRACKMAXSTACKDEPTH +int ParseStackPeak(void *p){ + yyParser *pParser = (yyParser*)p; + return pParser->yyidxMax; +} +#endif + +/* +** Find the appropriate action for a parser given the terminal +** look-ahead token iLookAhead. +** +** If the look-ahead token is YYNOCODE, then check to see if the action is +** independent of the look-ahead. If it is, return the action, otherwise +** return YY_NO_ACTION. +*/ +static int yy_find_shift_action( + yyParser *pParser, /* The parser */ + YYCODETYPE iLookAhead /* The look-ahead token */ +){ + int i; + int stateno = pParser->yystack[pParser->yyidx].stateno; + + if( stateno>YY_SHIFT_COUNT + || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){ + return yy_default[stateno]; + } + assert( iLookAhead!=YYNOCODE ); + i += iLookAhead; + if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ + if( iLookAhead>0 ){ +#ifdef YYFALLBACK + YYCODETYPE iFallback; /* Fallback token */ + if( iLookAhead %s\n", + yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); + } +#endif + return yy_find_shift_action(pParser, iFallback); + } +#endif +#ifdef YYWILDCARD + { + int j = i - iLookAhead + YYWILDCARD; + if( +#if YY_SHIFT_MIN+YYWILDCARD<0 + j>=0 && +#endif +#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT + j %s\n", + yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[YYWILDCARD]); + } +#endif /* NDEBUG */ + return yy_action[j]; + } + } +#endif /* YYWILDCARD */ + } + return yy_default[stateno]; + }else{ + return yy_action[i]; + } +} + +/* +** Find the appropriate action for a parser given the non-terminal +** look-ahead token iLookAhead. +** +** If the look-ahead token is YYNOCODE, then check to see if the action is +** independent of the look-ahead. If it is, return the action, otherwise +** return YY_NO_ACTION. +*/ +static int yy_find_reduce_action( + int stateno, /* Current state number */ + YYCODETYPE iLookAhead /* The look-ahead token */ +){ + int i; +#ifdef YYERRORSYMBOL + if( stateno>YY_REDUCE_COUNT ){ + return yy_default[stateno]; + } +#else + assert( stateno<=YY_REDUCE_COUNT ); +#endif + i = yy_reduce_ofst[stateno]; + assert( i!=YY_REDUCE_USE_DFLT ); + assert( iLookAhead!=YYNOCODE ); + i += iLookAhead; +#ifdef YYERRORSYMBOL + if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ + return yy_default[stateno]; + } +#else + assert( i>=0 && iyyidx--; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt); + } +#endif + while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will execute if the parser + ** stack every overflows */ +%% + ParseARG_STORE; /* Suppress warning about unused %extra_argument var */ +} + +/* +** Perform a shift action. +*/ +static void yy_shift( + yyParser *yypParser, /* The parser to be shifted */ + int yyNewState, /* The new state to shift in */ + int yyMajor, /* The major token to shift in */ + YYMINORTYPE *yypMinor /* Pointer to the minor token to shift in */ +){ + yyStackEntry *yytos; + yypParser->yyidx++; +#ifdef YYTRACKMAXSTACKDEPTH + if( yypParser->yyidx>yypParser->yyidxMax ){ + yypParser->yyidxMax = yypParser->yyidx; + } +#endif +#if YYSTACKDEPTH>0 + if( yypParser->yyidx>=YYSTACKDEPTH ){ + yyStackOverflow(yypParser, yypMinor); + return; + } +#else + if( yypParser->yyidx>=yypParser->yystksz ){ + yyGrowStack(yypParser); + if( yypParser->yyidx>=yypParser->yystksz ){ + yyStackOverflow(yypParser, yypMinor); + return; + } + } +#endif + yytos = &yypParser->yystack[yypParser->yyidx]; + yytos->stateno = (YYACTIONTYPE)yyNewState; + yytos->major = (YYCODETYPE)yyMajor; + yytos->minor = *yypMinor; +#ifndef NDEBUG + if( yyTraceFILE && yypParser->yyidx>0 ){ + int i; + fprintf(yyTraceFILE,"%sShift %d\n",yyTracePrompt,yyNewState); + fprintf(yyTraceFILE,"%sStack:",yyTracePrompt); + for(i=1; i<=yypParser->yyidx; i++) + fprintf(yyTraceFILE," %s",yyTokenName[yypParser->yystack[i].major]); + fprintf(yyTraceFILE,"\n"); + } +#endif +} + +/* The following table contains information about every rule that +** is used during the reduce. +*/ +static const struct { + YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ + unsigned char nrhs; /* Number of right-hand side symbols in the rule */ +} yyRuleInfo[] = { +%% +}; + +static void yy_accept(yyParser*); /* Forward Declaration */ + +/* +** Perform a reduce action and the shift that must immediately +** follow the reduce. +*/ +static void yy_reduce( + yyParser *yypParser, /* The parser */ + int yyruleno /* Number of the rule by which to reduce */ +){ + int yygoto; /* The next state */ + int yyact; /* The next action */ + YYMINORTYPE yygotominor; /* The LHS of the rule reduced */ + yyStackEntry *yymsp; /* The top of the parser's stack */ + int yysize; /* Amount to pop the stack */ + ParseARG_FETCH; + yymsp = &yypParser->yystack[yypParser->yyidx]; +#ifndef NDEBUG + if( yyTraceFILE && yyruleno>=0 + && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ + fprintf(yyTraceFILE, "%sReduce [%s].\n", yyTracePrompt, + yyRuleName[yyruleno]); + } +#endif /* NDEBUG */ + + /* Silence complaints from purify about yygotominor being uninitialized + ** in some cases when it is copied into the stack after the following + ** switch. yygotominor is uninitialized when a rule reduces that does + ** not set the value of its left-hand side nonterminal. Leaving the + ** value of the nonterminal uninitialized is utterly harmless as long + ** as the value is never used. So really the only thing this code + ** accomplishes is to quieten purify. + ** + ** 2007-01-16: The wireshark project (www.wireshark.org) reports that + ** without this code, their parser segfaults. I'm not sure what there + ** parser is doing to make this happen. This is the second bug report + ** from wireshark this week. Clearly they are stressing Lemon in ways + ** that it has not been previously stressed... (SQLite ticket #2172) + */ + /*memset(&yygotominor, 0, sizeof(yygotominor));*/ + yygotominor = yyzerominor; + + + switch( yyruleno ){ + /* Beginning here are the reduction cases. A typical example + ** follows: + ** case 0: + ** #line + ** { ... } // User supplied code + ** #line + ** break; + */ +%% + }; + yygoto = yyRuleInfo[yyruleno].lhs; + yysize = yyRuleInfo[yyruleno].nrhs; + yypParser->yyidx -= yysize; + yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto); + if( yyact < YYNSTATE ){ +#ifdef NDEBUG + /* If we are not debugging and the reduce action popped at least + ** one element off the stack, then we can push the new element back + ** onto the stack here, and skip the stack overflow test in yy_shift(). + ** That gives a significant speed improvement. */ + if( yysize ){ + yypParser->yyidx++; + yymsp -= yysize-1; + yymsp->stateno = (YYACTIONTYPE)yyact; + yymsp->major = (YYCODETYPE)yygoto; + yymsp->minor = yygotominor; + }else +#endif + { + yy_shift(yypParser,yyact,yygoto,&yygotominor); + } + }else{ + assert( yyact == YYNSTATE + YYNRULE + 1 ); + yy_accept(yypParser); + } +} + +/* +** The following code executes when the parse fails +*/ +#ifndef YYNOERRORRECOVERY +static void yy_parse_failed( + yyParser *yypParser /* The parser */ +){ + ParseARG_FETCH; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); + } +#endif + while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will be executed whenever the + ** parser fails */ +%% + ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ +} +#endif /* YYNOERRORRECOVERY */ + +/* +** The following code executes when a syntax error first occurs. +*/ +static void yy_syntax_error( + yyParser *yypParser, /* The parser */ + int yymajor, /* The major type of the error token */ + YYMINORTYPE yyminor /* The minor type of the error token */ +){ + ParseARG_FETCH; +#define TOKEN (yyminor.yy0) +%% + ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ +} + +/* +** The following is executed when the parser accepts +*/ +static void yy_accept( + yyParser *yypParser /* The parser */ +){ + ParseARG_FETCH; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); + } +#endif + while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will be executed whenever the + ** parser accepts */ +%% + ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ +} + +/* The main parser program. +** The first argument is a pointer to a structure obtained from +** "ParseAlloc" which describes the current state of the parser. +** The second argument is the major token number. The third is +** the minor token. The fourth optional argument is whatever the +** user wants (and specified in the grammar) and is available for +** use by the action routines. +** +** Inputs: +**
      +**
    • A pointer to the parser (an opaque structure.) +**
    • The major token number. +**
    • The minor token number. +**
    • An option argument of a grammar-specified type. +**
    +** +** Outputs: +** None. +*/ +void Parse( + void *yyp, /* The parser */ + int yymajor, /* The major token code number */ + ParseTOKENTYPE yyminor /* The value for the token */ + ParseARG_PDECL /* Optional %extra_argument parameter */ +){ + YYMINORTYPE yyminorunion; + int yyact; /* The parser action. */ + int yyendofinput; /* True if we are at the end of input */ +#ifdef YYERRORSYMBOL + int yyerrorhit = 0; /* True if yymajor has invoked an error */ +#endif + yyParser *yypParser; /* The parser */ + + /* (re)initialize the parser, if necessary */ + yypParser = (yyParser*)yyp; + if( yypParser->yyidx<0 ){ +#if YYSTACKDEPTH<=0 + if( yypParser->yystksz <=0 ){ + /*memset(&yyminorunion, 0, sizeof(yyminorunion));*/ + yyminorunion = yyzerominor; + yyStackOverflow(yypParser, &yyminorunion); + return; + } +#endif + yypParser->yyidx = 0; + yypParser->yyerrcnt = -1; + yypParser->yystack[0].stateno = 0; + yypParser->yystack[0].major = 0; + } + yyminorunion.yy0 = yyminor; + yyendofinput = (yymajor==0); + ParseARG_STORE; + +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]); + } +#endif + + do{ + yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); + if( yyactyyerrcnt--; + yymajor = YYNOCODE; + }else if( yyact < YYNSTATE + YYNRULE ){ + yy_reduce(yypParser,yyact-YYNSTATE); + }else{ + assert( yyact == YY_ERROR_ACTION ); +#ifdef YYERRORSYMBOL + int yymx; +#endif +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); + } +#endif +#ifdef YYERRORSYMBOL + /* A syntax error has occurred. + ** The response to an error depends upon whether or not the + ** grammar defines an error token "ERROR". + ** + ** This is what we do if the grammar does define ERROR: + ** + ** * Call the %syntax_error function. + ** + ** * Begin popping the stack until we enter a state where + ** it is legal to shift the error symbol, then shift + ** the error symbol. + ** + ** * Set the error count to three. + ** + ** * Begin accepting and shifting new tokens. No new error + ** processing will occur until three tokens have been + ** shifted successfully. + ** + */ + if( yypParser->yyerrcnt<0 ){ + yy_syntax_error(yypParser,yymajor,yyminorunion); + } + yymx = yypParser->yystack[yypParser->yyidx].major; + if( yymx==YYERRORSYMBOL || yyerrorhit ){ +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sDiscard input token %s\n", + yyTracePrompt,yyTokenName[yymajor]); + } +#endif + yy_destructor(yypParser, (YYCODETYPE)yymajor,&yyminorunion); + yymajor = YYNOCODE; + }else{ + while( + yypParser->yyidx >= 0 && + yymx != YYERRORSYMBOL && + (yyact = yy_find_reduce_action( + yypParser->yystack[yypParser->yyidx].stateno, + YYERRORSYMBOL)) >= YYNSTATE + ){ + yy_pop_parser_stack(yypParser); + } + if( yypParser->yyidx < 0 || yymajor==0 ){ + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + yy_parse_failed(yypParser); + yymajor = YYNOCODE; + }else if( yymx!=YYERRORSYMBOL ){ + YYMINORTYPE u2; + u2.YYERRSYMDT = 0; + yy_shift(yypParser,yyact,YYERRORSYMBOL,&u2); + } + } + yypParser->yyerrcnt = 3; + yyerrorhit = 1; +#elif defined(YYNOERRORRECOVERY) + /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to + ** do any kind of error recovery. Instead, simply invoke the syntax + ** error routine and continue going as if nothing had happened. + ** + ** Applications can set this macro (for example inside %include) if + ** they intend to abandon the parse upon the first syntax error seen. + */ + yy_syntax_error(yypParser,yymajor,yyminorunion); + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + yymajor = YYNOCODE; + +#else /* YYERRORSYMBOL is not defined */ + /* This is what we do if the grammar does not define ERROR: + ** + ** * Report an error message, and throw away the input token. + ** + ** * If the input token is $, then fail the parse. + ** + ** As before, subsequent error messages are suppressed until + ** three input tokens have been successfully shifted. + */ + if( yypParser->yyerrcnt<=0 ){ + yy_syntax_error(yypParser,yymajor,yyminorunion); + } + yypParser->yyerrcnt = 3; + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + if( yyendofinput ){ + yy_parse_failed(yypParser); + } + yymajor = YYNOCODE; +#endif + } + }while( yymajor!=YYNOCODE && yypParser->yyidx>=0 ); + return; +} diff --git a/package/luci/modules/luci-base/src/mkversion.sh b/package/luci/modules/luci-lua-runtime/src/mkversion.sh similarity index 100% rename from package/luci/modules/luci-base/src/mkversion.sh rename to package/luci/modules/luci-lua-runtime/src/mkversion.sh diff --git a/package/luci/modules/luci-lua-runtime/src/plural_formula.y b/package/luci/modules/luci-lua-runtime/src/plural_formula.y new file mode 100644 index 0000000000..1623f8b282 --- /dev/null +++ b/package/luci/modules/luci-lua-runtime/src/plural_formula.y @@ -0,0 +1,43 @@ +%name pluralParse +%token_type {int} +%extra_argument {struct parse_state *s} + +%right T_QMARK. +%left T_OR. +%left T_AND. +%left T_EQ T_NE. +%left T_LT T_LE T_GT T_GE. +%left T_ADD T_SUB. +%left T_MUL T_DIV T_MOD. +%right T_NOT. +%nonassoc T_COLON T_N T_LPAREN T_RPAREN. + +%include { +#include + +struct parse_state { + int num; + int res; +}; +} + +input ::= expr(A). { s->res = A; } + +expr(A) ::= expr(B) T_QMARK expr(C) T_COLON expr(D). { A = B ? C : D; } +expr(A) ::= expr(B) T_OR expr(C). { A = B || C; } +expr(A) ::= expr(B) T_AND expr(C). { A = B && C; } +expr(A) ::= expr(B) T_EQ expr(C). { A = B == C; } +expr(A) ::= expr(B) T_NE expr(C). { A = B != C; } +expr(A) ::= expr(B) T_LT expr(C). { A = B < C; } +expr(A) ::= expr(B) T_LE expr(C). { A = B <= C; } +expr(A) ::= expr(B) T_GT expr(C). { A = B > C; } +expr(A) ::= expr(B) T_GE expr(C). { A = B >= C; } +expr(A) ::= expr(B) T_ADD expr(C). { A = B + C; } +expr(A) ::= expr(B) T_SUB expr(C). { A = B - C; } +expr(A) ::= expr(B) T_MUL expr(C). { A = B * C; } +expr(A) ::= expr(B) T_DIV expr(C). { A = B / C; } +expr(A) ::= expr(B) T_MOD expr(C). { A = B % C; } +expr(A) ::= T_NOT expr(B). { A = !B; } +expr(A) ::= T_N. { A = s->num; } +expr(A) ::= T_NUM(B). { A = B; } +expr(A) ::= T_LPAREN expr(B) T_RPAREN. { A = B; } diff --git a/package/luci/modules/luci-base/src/template_lmo.c b/package/luci/modules/luci-lua-runtime/src/template_lmo.c similarity index 100% rename from package/luci/modules/luci-base/src/template_lmo.c rename to package/luci/modules/luci-lua-runtime/src/template_lmo.c diff --git a/package/luci/modules/luci-base/src/template_lmo.h b/package/luci/modules/luci-lua-runtime/src/template_lmo.h similarity index 100% rename from package/luci/modules/luci-base/src/template_lmo.h rename to package/luci/modules/luci-lua-runtime/src/template_lmo.h diff --git a/package/luci/modules/luci-base/src/template_lualib.c b/package/luci/modules/luci-lua-runtime/src/template_lualib.c similarity index 100% rename from package/luci/modules/luci-base/src/template_lualib.c rename to package/luci/modules/luci-lua-runtime/src/template_lualib.c diff --git a/package/luci/modules/luci-base/src/template_lualib.h b/package/luci/modules/luci-lua-runtime/src/template_lualib.h similarity index 100% rename from package/luci/modules/luci-base/src/template_lualib.h rename to package/luci/modules/luci-lua-runtime/src/template_lualib.h diff --git a/package/luci/modules/luci-base/src/template_parser.c b/package/luci/modules/luci-lua-runtime/src/template_parser.c similarity index 100% rename from package/luci/modules/luci-base/src/template_parser.c rename to package/luci/modules/luci-lua-runtime/src/template_parser.c diff --git a/package/luci/modules/luci-base/src/template_parser.h b/package/luci/modules/luci-lua-runtime/src/template_parser.h similarity index 100% rename from package/luci/modules/luci-base/src/template_parser.h rename to package/luci/modules/luci-lua-runtime/src/template_parser.h diff --git a/package/luci/modules/luci-base/src/template_utils.c b/package/luci/modules/luci-lua-runtime/src/template_utils.c similarity index 100% rename from package/luci/modules/luci-base/src/template_utils.c rename to package/luci/modules/luci-lua-runtime/src/template_utils.c diff --git a/package/luci/modules/luci-base/src/template_utils.h b/package/luci/modules/luci-lua-runtime/src/template_utils.h similarity index 100% rename from package/luci/modules/luci-base/src/template_utils.h rename to package/luci/modules/luci-lua-runtime/src/template_utils.h diff --git a/package/luci/modules/luci-mod-admin-full/Makefile b/package/luci/modules/luci-mod-admin-full/Makefile index b376b35e55..67250288fa 100644 --- a/package/luci/modules/luci-mod-admin-full/Makefile +++ b/package/luci/modules/luci-mod-admin-full/Makefile @@ -13,5 +13,5 @@ PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/modules/luci-mod-admin-mini/Makefile b/package/luci/modules/luci-mod-admin-mini/Makefile index de00489926..eaed62a3e2 100644 --- a/package/luci/modules/luci-mod-admin-mini/Makefile +++ b/package/luci/modules/luci-mod-admin-mini/Makefile @@ -11,5 +11,5 @@ LUCI_DEPENDS:=+luci-base +luci-compat @BROKEN include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/network.lua b/package/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/network.lua index 7bc4df859b..d2115df8d4 100644 --- a/package/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/network.lua +++ b/package/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/network.lua @@ -134,7 +134,7 @@ if has_pptp then p:value("pptp", "PPTP") end function p.write(self, section, value) -- Always set defaultroute to PPP and use remote dns - -- Overwrite a bad variable behaviour in OpenWrt + -- Overwrite a bad variable behaviour in libreCMC if value == "pptp" or value == "pppoe" then self.map:set(section, "peerdns", "1") self.map:set(section, "defaultroute", "1") diff --git a/package/luci/modules/luci-mod-admin-mini/luasrc/view/mini/index.htm b/package/luci/modules/luci-mod-admin-mini/luasrc/view/mini/index.htm index 621e3cbe89..6d4289177a 100644 --- a/package/luci/modules/luci-mod-admin-mini/luasrc/view/mini/index.htm +++ b/package/luci/modules/luci-mod-admin-mini/luasrc/view/mini/index.htm @@ -6,7 +6,7 @@

    <%:Hello!%>

    <%_This is the administration area of LuCI.%>

    -

    <%_LuCI is a free, flexible, and user friendly graphical interface for configuring OpenWrt.%>
    +

    <%_LuCI is a free, flexible, and user friendly graphical interface for configuring libreCMC.%>
    <%:On the following pages you can adjust all important settings of this device.%>

    <%:As we always want to improve this interface we are looking forward to your feedback and suggestions.%>

    <%:And now have fun with your device!%>

    diff --git a/package/luci/modules/luci-mod-dashboard/Makefile b/package/luci/modules/luci-mod-dashboard/Makefile index dfaeeb7e26..17ea5b9fcc 100644 --- a/package/luci/modules/luci-mod-dashboard/Makefile +++ b/package/luci/modules/luci-mod-dashboard/Makefile @@ -14,5 +14,5 @@ PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css b/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css index 8db3bbbe14..66dd81f79e 100644 --- a/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css +++ b/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css @@ -120,13 +120,11 @@ .Dashboard .settings-info p span:nth-child(2){ display: inline-block; word-break: break-all; - overflow: hidden; - position: relative; - top:2px; } .Dashboard .settings-info p span:nth-child(2).label { - font-size: 8px; + padding: 1px 4px 1px 4px; + font-size: 9.75px; } .Dashboard .router-status-info .settings-info p span:nth-child(2){ diff --git a/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js b/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js index e1ea347d59..c43e2ca544 100644 --- a/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js +++ b/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js @@ -146,6 +146,8 @@ return baseclass.extend({ var ifc = data[i]; if (v6) { + var uptime = ifc.getUptime(); + this.params.internet.v6.uptime.value = (uptime > 0) ? '%t'.format(uptime) : '-'; this.params.internet.v6.ipprefixv6.value = ifc.getIP6Prefix() || '-'; this.params.internet.v6.gatewayv6.value = ifc.getGateway6Addr() || '-'; this.params.internet.v6.protocol.value= ifc.getI18n() || E('em', _('Not connected')); @@ -178,7 +180,7 @@ return baseclass.extend({ }, uptime: { - title: _('Connected since'), + title: _('Uptime'), visible: true, value: '-' }, @@ -218,7 +220,7 @@ return baseclass.extend({ }, uptime: { - title: _('Connected since'), + title: _('Uptime'), visible: true, value: '-' }, diff --git a/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js b/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js index f48622fd66..318c3abf87 100644 --- a/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js +++ b/package/luci/modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js @@ -262,6 +262,8 @@ return baseclass.extend({ this.renderUpdateData(data[0], data[1], data[2]); - return this.renderHtml(); + if (this.params.wifi.radios.length) + return this.renderHtml(); + return E([]); } }); diff --git a/package/luci/modules/luci-mod-dashboard/po/ar/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/ar/dashboard.po index b809d8e37f..fc5c47cbc0 100644 --- a/package/luci/modules/luci-mod-dashboard/po/ar/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/ar/dashboard.po @@ -12,7 +12,7 @@ msgstr "" msgid "Active" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "" @@ -30,25 +30,20 @@ msgstr "" msgid "Channel" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "" @@ -76,7 +71,7 @@ msgstr "" msgid "Encryption" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "" @@ -84,11 +79,11 @@ msgstr "" msgid "GHz" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "" @@ -118,24 +113,24 @@ msgstr "" msgid "IP Address" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "" @@ -143,11 +138,11 @@ msgstr "" msgid "Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "" @@ -163,17 +158,17 @@ msgstr "" msgid "Mbit/s" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "" @@ -198,7 +193,9 @@ msgstr "" msgid "Upload" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "" diff --git a/package/luci/modules/luci-mod-dashboard/po/bg/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/bg/dashboard.po index c628145450..e50e79ca7b 100644 --- a/package/luci/modules/luci-mod-dashboard/po/bg/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/bg/dashboard.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2021-08-27 12:56+0000\n" "Last-Translator: Iskren Mihaylov \n" -"Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" msgid "Active" msgstr "Активен" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Архитектура" @@ -34,25 +34,20 @@ msgstr "Битрейт" msgid "Channel" msgstr "Канал" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Свързан" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Свързан от" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP Устройства" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -80,7 +75,7 @@ msgstr "Сваляне" msgid "Encryption" msgstr "Криптиране" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Версия на firmware" @@ -88,11 +83,11 @@ msgstr "Версия на firmware" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "ГейтауейV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -122,24 +117,24 @@ msgstr "Хостнейм" msgid "IP Address" msgstr "IP адрес" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4 Интернет" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6 Интернет" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "IPv6 префикс" @@ -147,11 +142,11 @@ msgstr "IPv6 префикс" msgid "Internet" msgstr "Интернет" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Версия на ядрото" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Местно време" @@ -167,17 +162,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Модел" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Не е свързан" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Протокол" @@ -202,7 +197,9 @@ msgstr "Горе." msgid "Upload" msgstr "Качване" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Ъптайм" diff --git a/package/luci/modules/luci-mod-dashboard/po/bn_BD/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/bn_BD/dashboard.po index d4cc852acb..11c68537ee 100644 --- a/package/luci/modules/luci-mod-dashboard/po/bn_BD/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/bn_BD/dashboard.po @@ -4,7 +4,7 @@ msgstr "" "PO-Revision-Date: 2021-10-08 17:53+0000\n" "Last-Translator: Rayhan Nabi \n" "Language-Team: Bengali (Bangladesh) \n" +"librecmc/lucimodulesluci-mod-dashboard/bn_BD/>\n" "Language: bn_BD\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -16,7 +16,7 @@ msgstr "" msgid "Active" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "" @@ -34,25 +34,20 @@ msgstr "" msgid "Channel" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "" @@ -80,7 +75,7 @@ msgstr "" msgid "Encryption" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "" @@ -88,11 +83,11 @@ msgstr "" msgid "GHz" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "" @@ -122,24 +117,24 @@ msgstr "হোস্টনেম" msgid "IP Address" msgstr "আইপি এড্রেস" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "" @@ -147,11 +142,11 @@ msgstr "" msgid "Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "" @@ -167,17 +162,17 @@ msgstr "" msgid "Mbit/s" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "প্রোটোকল" @@ -202,7 +197,9 @@ msgstr "" msgid "Upload" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "" diff --git a/package/luci/modules/luci-mod-dashboard/po/ca/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/ca/dashboard.po index 965b4cdc82..2e83313871 100644 --- a/package/luci/modules/luci-mod-dashboard/po/ca/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/ca/dashboard.po @@ -1,24 +1,24 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2021-09-17 06:52+0000\n" -"Last-Translator: Roger Pueyo Centelles \n" -"Language-Team: Catalan \n" +"Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.16.2-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Actiu" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" -msgstr "" +msgstr "Arquitectura" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 msgid "BSSID" @@ -34,25 +34,20 @@ msgstr "" msgid "Channel" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "" @@ -80,7 +75,7 @@ msgstr "" msgid "Encryption" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "" @@ -88,11 +83,11 @@ msgstr "" msgid "GHz" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "" @@ -122,24 +117,24 @@ msgstr "" msgid "IP Address" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "" @@ -147,11 +142,11 @@ msgstr "" msgid "Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "" @@ -165,19 +160,19 @@ msgstr "" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 msgid "Mbit/s" -msgstr "" +msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Model" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "" @@ -202,7 +197,9 @@ msgstr "" msgid "Upload" msgstr "Puja" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "" diff --git a/package/luci/modules/luci-mod-dashboard/po/cs/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/cs/dashboard.po index dd8cb256ef..ab11171fa8 100644 --- a/package/luci/modules/luci-mod-dashboard/po/cs/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/cs/dashboard.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2021-05-07 11:32+0000\n" -"Last-Translator: Adam Salač \n" -"Language-Team: Czech \n" +"Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 5.0.2\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Aktivní" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Architektura" @@ -34,25 +34,20 @@ msgstr "Přenosová rychlost" msgid "Channel" msgstr "Kanál" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Připojeno" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Připojeno od" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP zařízení" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -66,21 +61,21 @@ msgstr "Zařízení" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 msgid "Devices Connected" -msgstr "" +msgstr "Připojená zařízení" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Down." -msgstr "" +msgstr "Staž." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" -msgstr "" +msgstr "Staženo" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" msgstr "Šifrování" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Verze firmware" @@ -88,13 +83,13 @@ msgstr "Verze firmware" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" -msgstr "" +msgstr "Brána v4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" -msgstr "" +msgstr "Brána v6" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 msgid "Grant access to DHCP status display" @@ -102,56 +97,56 @@ msgstr "Poskytnout přístup k zobrazení stavu DHCP" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 msgid "Grant access to main status display" -msgstr "" +msgstr "Udělit přístup k zobrazení hlavního stavu" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 msgid "Grant access to the system route status" -msgstr "" +msgstr "Udělit přístup ke stavu routování" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 msgid "Grant access to wireless status display" -msgstr "" +msgstr "Poskytnout přístup k zobrazení stavu bezdrátové sítě" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 msgid "Hostname" -msgstr "" +msgstr "Název počítače" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 msgid "IP Address" msgstr "IP adresa" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" -msgstr "" +msgstr "IPv4 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" -msgstr "" +msgstr "IPv6 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" -msgstr "" +msgstr "IPv6 prefix" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Verze kernelu" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Místní čas" @@ -161,23 +156,23 @@ msgstr "MAC" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 msgid "Mac" -msgstr "" +msgstr "Mac" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 msgid "Mbit/s" -msgstr "Mbit/s" +msgstr "Mbitů/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Model" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Nepřipojeno" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protokol" @@ -196,13 +191,15 @@ msgstr "Systém" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Up." -msgstr "" +msgstr "Nahr." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 msgid "Upload" -msgstr "" +msgstr "Nahráno" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Doba běhu" diff --git a/package/luci/modules/luci-mod-dashboard/po/da/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/da/dashboard.po index 40702002bc..e76094ef7b 100644 --- a/package/luci/modules/luci-mod-dashboard/po/da/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/da/dashboard.po @@ -1,20 +1,20 @@ msgid "" msgstr "" -"PO-Revision-Date: 2021-12-08 22:46+0000\n" +"PO-Revision-Date: 2023-07-17 15:06+0000\n" "Last-Translator: drax red \n" -"Language-Team: Danish \n" "Language: da\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Aktiv" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Arkitektur" @@ -32,25 +32,20 @@ msgstr "Bitrate" msgid "Channel" msgstr "Kanal" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Tilsluttet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Tilsluttet siden" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP-enheder" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -78,7 +73,7 @@ msgstr "Download" msgid "Encryption" msgstr "Kryptering" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Firmware-version" @@ -86,11 +81,11 @@ msgstr "Firmware-version" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -118,26 +113,26 @@ msgstr "Værtsnavn" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 msgid "IP Address" -msgstr "IP-adresse" +msgstr "IP Address" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "IPv6-præfiks" @@ -145,11 +140,11 @@ msgstr "IPv6-præfiks" msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Kerneversion" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Lokal tid" @@ -165,17 +160,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Model" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Ikke tilsluttet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protokol" @@ -200,7 +195,9 @@ msgstr "Op." msgid "Upload" msgstr "Upload" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Oppetid" diff --git a/package/luci/modules/luci-mod-dashboard/po/de/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/de/dashboard.po index 83d6cd8ea2..f25cf8696a 100644 --- a/package/luci/modules/luci-mod-dashboard/po/de/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/de/dashboard.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2022-11-28 20:47+0000\n" +"PO-Revision-Date: 2023-06-20 16:23+0000\n" "Last-Translator: ssantos \n" -"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 4.18.1\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Aktiv" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Architektur" @@ -34,25 +34,20 @@ msgstr "Bitrate" msgid "Channel" msgstr "Kanal" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Verbunden" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Verbunden seit" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP-Geräte" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -74,13 +69,13 @@ msgstr "Runter." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" -msgstr "Download" +msgstr "Herunterladen" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" msgstr "Verschlüsselung" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Firmware-Version" @@ -88,17 +83,17 @@ msgstr "Firmware-Version" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 msgid "Grant access to DHCP status display" -msgstr "Gewähre Zugriff auf die DHCP-Statusanzeige" +msgstr "Zugriff auf die DHCP-Statusanzeige gewähren" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 msgid "Grant access to main status display" @@ -122,24 +117,24 @@ msgstr "Hostname" msgid "IP Address" msgstr "IP-Adresse" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4-Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6-Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "IPv6-Präfix" @@ -147,11 +142,11 @@ msgstr "IPv6-Präfix" msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Kernel-Version" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Ortszeit" @@ -167,17 +162,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Modell" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Nicht verbunden" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protokoll" @@ -202,7 +197,9 @@ msgstr "Aktiv." msgid "Upload" msgstr "Hochladen" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Laufzeit" diff --git a/package/luci/modules/luci-mod-dashboard/po/el/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/el/dashboard.po index be5d62eb1e..50b1f5e074 100644 --- a/package/luci/modules/luci-mod-dashboard/po/el/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/el/dashboard.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2022-05-15 17:04+0000\n" "Last-Translator: MarioK239 \n" -"Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" msgid "Active" msgstr "Ενεργό" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Αρχιτεκτονική" @@ -34,25 +34,20 @@ msgstr "Ρυθμός bit" msgid "Channel" msgstr "Κανάλι" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Συνδεδεμένο" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Συνδεδεμένο από" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "Συσκευές DHCP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -80,7 +75,7 @@ msgstr "Λήψη" msgid "Encryption" msgstr "Κρυπτογράφηση" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Έκδοση υλικολογισμικού" @@ -88,11 +83,11 @@ msgstr "Έκδοση υλικολογισμικού" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -122,24 +117,24 @@ msgstr "Hostname" msgid "IP Address" msgstr "Διεύθυνση IP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "Ίντερνετ IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "Ίντερνετ IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Πρόθεμα IPv6" @@ -147,11 +142,11 @@ msgstr "Πρόθεμα IPv6" msgid "Internet" msgstr "Διαδίκτυο" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Έκδοση kernel" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Τοπική ώρα" @@ -167,17 +162,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Μοντέλο" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Μη συνδεδεμένο" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Πρωτόκολλο" @@ -202,7 +197,9 @@ msgstr "Πάνω." msgid "Upload" msgstr "Μεταφόρτωση" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Χρόνος λειτουργίας" diff --git a/package/luci/modules/luci-mod-dashboard/po/en/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/en/dashboard.po index 80b225a6d9..edfd4c0a4c 100644 --- a/package/luci/modules/luci-mod-dashboard/po/en/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/en/dashboard.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2021-06-24 07:45+0000\n" "Last-Translator: Hannu Nyman \n" -"Language-Team: English \n" "Language: en\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" msgid "Active" msgstr "Active" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Architecture" @@ -34,25 +34,20 @@ msgstr "Bitrate" msgid "Channel" msgstr "Channel" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Connected" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Connected since" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP Devices" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -80,7 +75,7 @@ msgstr "Download" msgid "Encryption" msgstr "Encryption" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Firmware Version" @@ -88,11 +83,11 @@ msgstr "Firmware Version" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -122,24 +117,24 @@ msgstr "Hostname" msgid "IP Address" msgstr "IP Address" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "IPv6 prefix" @@ -147,11 +142,11 @@ msgstr "IPv6 prefix" msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Kernel Version" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Local Time" @@ -167,17 +162,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Model" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Not connected" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protocol" @@ -202,7 +197,9 @@ msgstr "Up." msgid "Upload" msgstr "Upload" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Uptime" diff --git a/package/luci/modules/luci-mod-dashboard/po/es/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/es/dashboard.po index 76765f25dc..a09cd482da 100644 --- a/package/luci/modules/luci-mod-dashboard/po/es/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/es/dashboard.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2022-05-05 07:13+0000\n" -"Last-Translator: Mc Giver \n" -"Language-Team: Spanish \n" +"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12.1\n" +"X-Generator: Weblate 5.0-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Activo" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Arquitectura" @@ -34,25 +34,20 @@ msgstr "Tasa de bits" msgid "Channel" msgstr "Canal" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Conectado" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Conectado desde" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "Dispositivos DHCP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -80,7 +75,7 @@ msgstr "Descargar" msgid "Encryption" msgstr "Encriptación" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Versión del firmware" @@ -88,13 +83,11 @@ msgstr "Versión del firmware" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 -#, fuzzy +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 -#, fuzzy +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -107,9 +100,8 @@ msgid "Grant access to main status display" msgstr "Otorgar acceso a la pantalla de estado principal" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -#, fuzzy msgid "Grant access to the system route status" -msgstr "Otorgar acceso al estado de la ruta del sistema" +msgstr "Permitir el acceso al estado de la ruta del sistema" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 msgid "Grant access to wireless status display" @@ -125,24 +117,24 @@ msgstr "Nombre de host" msgid "IP Address" msgstr "Dirección IP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "Internet IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "Internet IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Prefijo IPv6" @@ -150,11 +142,11 @@ msgstr "Prefijo IPv6" msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Versión del núcleo" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Hora local" @@ -170,17 +162,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Modelo" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "No conectado" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protocolo" @@ -205,7 +197,9 @@ msgstr "Carga" msgid "Upload" msgstr "Cargar" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Tiempo de actividad" diff --git a/package/luci/modules/luci-mod-dashboard/po/fi/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/fi/dashboard.po index ba0d155a9c..38ff773a68 100644 --- a/package/luci/modules/luci-mod-dashboard/po/fi/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/fi/dashboard.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2022-03-13 23:17+0000\n" +"PO-Revision-Date: 2023-10-18 05:43+0000\n" "Last-Translator: Jiri Grönroos \n" -"Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 5.1\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Aktiivinen" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Arkkitehtuuri" @@ -34,25 +34,20 @@ msgstr "Bittinopeus" msgid "Channel" msgstr "Kanava" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Yhdistetty" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Yhdistetty lähtien" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP-laitteet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -74,13 +69,13 @@ msgstr "Lataus" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" -msgstr "Lataus" +msgstr "Lataa" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" msgstr "Salaus" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Laiteohjelmiston versio" @@ -88,11 +83,11 @@ msgstr "Laiteohjelmiston versio" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -122,24 +117,24 @@ msgstr "Laitenimi" msgid "IP Address" msgstr "IP-osoite" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "IPv6-etuliite" @@ -147,11 +142,11 @@ msgstr "IPv6-etuliite" msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Ytimen versio" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Paikallinen aika" @@ -167,17 +162,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Malli" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Ei yhdistetty" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protokolla" @@ -202,7 +197,9 @@ msgstr "Lähetys" msgid "Upload" msgstr "Lähetys" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Toiminta-aika" diff --git a/package/luci/modules/luci-mod-dashboard/po/fr/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/fr/dashboard.po index 6a1aad2826..69d2e2f669 100644 --- a/package/luci/modules/luci-mod-dashboard/po/fr/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/fr/dashboard.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2022-07-29 19:23+0000\n" -"Last-Translator: Christophe Blancon \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Actif" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Architecture" @@ -34,25 +34,20 @@ msgstr "Débit" msgid "Channel" msgstr "Canal" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Connecté" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Connecté depuis" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" -msgstr "Périphériques DHCP" +msgstr "Appareils DHCP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNS v6" @@ -80,7 +75,7 @@ msgstr "Télécharger" msgid "Encryption" msgstr "Chiffrement" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Version du micrologiciel" @@ -88,11 +83,11 @@ msgstr "Version du micrologiciel" msgid "GHz" msgstr "Ghz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "Passerelle V4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "Passerelle V6" @@ -122,24 +117,24 @@ msgstr "Nom d'hôte" msgid "IP Address" msgstr "Adresse IP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "Internet IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "Internet IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Préfixe IPv6" @@ -147,11 +142,11 @@ msgstr "Préfixe IPv6" msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Version du noyau" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Heure locale" @@ -167,17 +162,17 @@ msgstr "MAC" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Modèle" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Non connecté" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protocole" @@ -202,7 +197,9 @@ msgstr "Connecté." msgid "Upload" msgstr "Téléverser" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Disponibilité" diff --git a/package/luci/modules/luci-mod-dashboard/po/he/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/he/dashboard.po index 53a802dca1..eb51cf59b1 100644 --- a/package/luci/modules/luci-mod-dashboard/po/he/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/he/dashboard.po @@ -13,7 +13,7 @@ msgstr "" msgid "Active" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "" @@ -31,25 +31,20 @@ msgstr "" msgid "Channel" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "" @@ -77,7 +72,7 @@ msgstr "" msgid "Encryption" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "" @@ -85,11 +80,11 @@ msgstr "" msgid "GHz" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "" @@ -119,24 +114,24 @@ msgstr "" msgid "IP Address" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "" @@ -144,11 +139,11 @@ msgstr "" msgid "Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "" @@ -164,17 +159,17 @@ msgstr "" msgid "Mbit/s" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "" @@ -199,7 +194,9 @@ msgstr "" msgid "Upload" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "" diff --git a/package/luci/modules/luci-mod-dashboard/po/hi/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/hi/dashboard.po index c0cadcfe25..f8cdabaf2d 100644 --- a/package/luci/modules/luci-mod-dashboard/po/hi/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/hi/dashboard.po @@ -12,7 +12,7 @@ msgstr "" msgid "Active" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "" @@ -30,25 +30,20 @@ msgstr "" msgid "Channel" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "" @@ -76,7 +71,7 @@ msgstr "" msgid "Encryption" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "" @@ -84,11 +79,11 @@ msgstr "" msgid "GHz" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "" @@ -118,24 +113,24 @@ msgstr "" msgid "IP Address" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "" @@ -143,11 +138,11 @@ msgstr "" msgid "Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "" @@ -163,17 +158,17 @@ msgstr "" msgid "Mbit/s" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "" @@ -198,7 +193,9 @@ msgstr "" msgid "Upload" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "" diff --git a/package/luci/modules/luci-mod-dashboard/po/hu/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/hu/dashboard.po index e1ad427b20..c1b04297e3 100644 --- a/package/luci/modules/luci-mod-dashboard/po/hu/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/hu/dashboard.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2021-08-12 12:55+0000\n" "Last-Translator: Tudós Péter \n" -"Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" msgid "Active" msgstr "Aktív" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Architektúra" @@ -34,26 +34,20 @@ msgstr "Bitráta" msgid "Channel" msgstr "Csatorna" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Csatlakoztatott" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -#, fuzzy -msgid "Connected since" -msgstr "Ennyi ideje csatlakoztatva" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP eszközök" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "" @@ -81,7 +75,7 @@ msgstr "Letöltés" msgid "Encryption" msgstr "Titkosítás" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Firmware verzió" @@ -89,11 +83,11 @@ msgstr "Firmware verzió" msgid "GHz" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "Átjáró V4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "Átjáró V6" @@ -123,24 +117,24 @@ msgstr "Gépnév" msgid "IP Address" msgstr "IP cím" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "" @@ -148,11 +142,11 @@ msgstr "" msgid "Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Kernel Verzió" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Helyi idő" @@ -168,17 +162,17 @@ msgstr "" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Modell" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Nincs csatlakoztatva" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protokol" @@ -203,7 +197,9 @@ msgstr "Fel." msgid "Upload" msgstr "Feltöltés" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Futási idő" diff --git a/package/luci/modules/luci-mod-dashboard/po/id/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/id/dashboard.po new file mode 100644 index 0000000000..c6724375c4 --- /dev/null +++ b/package/luci/modules/luci-mod-dashboard/po/id/dashboard.po @@ -0,0 +1,217 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-08-31 08:31+0000\n" +"Last-Translator: Charles03010 \n" +"Language-Team: Indonesian \n" +"Language: id\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.0.1-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Aktif" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Arsitektur" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bitrate" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Terhubung" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "Perangkat DHCP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Dasbor" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Perangkat" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Perangkat Terhubung" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Turun." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Unduh" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Enkripsi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Versi Firmware" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Berikan akses ke tampilan status DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Berikan akses ke tampilan status utama" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Berikan akses ke status rute sistem" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Berikan akses ke tampilan status wifi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Hostname" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "Alamat IP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6 prefix" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Versi Kernel" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Waktu setempat" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/dtk" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Tidak terhubung" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokol" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Sinyal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Sistem" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Naik." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Upload" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Waktu terkini" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Wifi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "tidak" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "ya" diff --git a/package/luci/modules/luci-mod-dashboard/po/it/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/it/dashboard.po index 81f5bf201b..24acad77be 100644 --- a/package/luci/modules/luci-mod-dashboard/po/it/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/it/dashboard.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2022-02-18 20:58+0000\n" -"Last-Translator: pisquan8 \n" -"Language-Team: Italian \n" +"Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Attivo" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Architettura" @@ -34,25 +34,20 @@ msgstr "Bitrate" msgid "Channel" msgstr "Canale" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Connesso" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Connesso da" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "Dispositivi DHCP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -74,43 +69,43 @@ msgstr "Disconesso." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" -msgstr "Download" +msgstr "Scarica" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" msgstr "Crittografia" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" -msgstr "Versione del Firmware" +msgstr "Versione del firmware" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 msgid "Grant access to DHCP status display" -msgstr "Consentire la visualizzazione dello stato del DHCP" +msgstr "Concedi la visualizzazione dello stato del DHCP" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 msgid "Grant access to main status display" -msgstr "Consentire la visualizzazione dello stato generale" +msgstr "Concedi l'accesso alla visualizzazione dello stato principale" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 msgid "Grant access to the system route status" -msgstr "Consentire l'accesso allo stato delle route di sistema" +msgstr "Concedi l'accesso allo stato delle route di sistema" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 msgid "Grant access to wireless status display" -msgstr "Consentire la visualizzazione dello stato del wireless" +msgstr "Concedi l'accesso alla visualizzazione dello stato wireless" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 @@ -122,24 +117,24 @@ msgstr "Nome host" msgid "IP Address" msgstr "Indirizzo IP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" -msgstr "IPv4 Internet" +msgstr "Internet IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" -msgstr "IPv6 Internet" +msgstr "Internet IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Prefisso IPv6" @@ -147,11 +142,11 @@ msgstr "Prefisso IPv6" msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" -msgstr "Versione del Kernel" +msgstr "Versione del kernel" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Data/ora locale" @@ -167,17 +162,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Modello" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Non connesso" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protocollo" @@ -192,7 +187,7 @@ msgstr "Segnale" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "System" -msgstr "SIstema" +msgstr "Sistema" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Up." @@ -202,9 +197,11 @@ msgstr "In funzione." msgid "Upload" msgstr "Carica" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" -msgstr "Uptime" +msgstr "Tempo di attività" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 diff --git a/package/luci/modules/luci-mod-dashboard/po/ja/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/ja/dashboard.po index ffb750b450..f7ada7f415 100644 --- a/package/luci/modules/luci-mod-dashboard/po/ja/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/ja/dashboard.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2021-06-11 06:32+0000\n" "Last-Translator: Satoru Yoshida \n" -"Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" msgid "Active" msgstr "アクティブ" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "アーキテクチャ" @@ -34,25 +34,20 @@ msgstr "ビットレート" msgid "Channel" msgstr "チャンネル" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "接続中" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "接続時間" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP デバイス" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNS (v4)" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNS (v6)" @@ -80,7 +75,7 @@ msgstr "ダウンロード" msgid "Encryption" msgstr "暗号化" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "ファームウェア バージョン" @@ -88,11 +83,11 @@ msgstr "ファームウェア バージョン" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "ゲートウェイ (v4)" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "ゲートウェイ (v6)" @@ -122,24 +117,24 @@ msgstr "ホスト名" msgid "IP Address" msgstr "IP アドレス" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4 インターネット" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6 インターネット" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "IPv6 プレフィックス" @@ -147,11 +142,11 @@ msgstr "IPv6 プレフィックス" msgid "Internet" msgstr "インターネット" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "カーネル バージョン" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "時刻" @@ -167,17 +162,17 @@ msgstr "MAC" msgid "Mbit/s" msgstr "Mbps" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "モデル" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "未接続" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "プロトコル" @@ -202,7 +197,9 @@ msgstr "アップ" msgid "Upload" msgstr "アップロード" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "稼働時間" diff --git a/package/luci/modules/luci-mod-dashboard/po/ko/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/ko/dashboard.po index ac875032c5..5efac470c3 100644 --- a/package/luci/modules/luci-mod-dashboard/po/ko/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/ko/dashboard.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2022-08-10 03:18+0000\n" -"Last-Translator: SangHoon Kim \n" -"Language-Team: Korean \n" +"Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "활성화" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "아키텍처" @@ -34,25 +34,20 @@ msgstr "비트레이트" msgid "Channel" msgstr "채널" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "연결됨" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP 장치" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -80,7 +75,7 @@ msgstr "다운로드" msgid "Encryption" msgstr "암호화" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "펌웨어 버전" @@ -88,11 +83,11 @@ msgstr "펌웨어 버전" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "게이트웨이 IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "게이트웨이 IPv6" @@ -122,24 +117,24 @@ msgstr "호스트명" msgid "IP Address" msgstr "IP 주소" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4 인터넷" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6 인터넷" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "IPv6 접두사" @@ -147,11 +142,11 @@ msgstr "IPv6 접두사" msgid "Internet" msgstr "인터넷" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "커널 버전" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "로컬 시간" @@ -165,19 +160,19 @@ msgstr "MAC" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 msgid "Mbit/s" -msgstr "Mbps" +msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "모델" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "연결되지 않음" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "프로토콜" @@ -202,7 +197,9 @@ msgstr "업." msgid "Upload" msgstr "업로드" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "가동시간" diff --git a/package/luci/modules/luci-mod-dashboard/po/lt/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/lt/dashboard.po new file mode 100644 index 0000000000..b8cd0f5cd0 --- /dev/null +++ b/package/luci/modules/luci-mod-dashboard/po/lt/dashboard.po @@ -0,0 +1,221 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-10-06 08:29+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.1-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Aktyvu" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Architektūra" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "„BSSID“" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Pralaidumas (bitų)" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanalas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Prisijungta" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "„DHCP“ įrenginiai" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "„DNSv4“" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "„DNSv6“" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Ataskaitų skydelis" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Įrenginiai" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Įrenginiai prijungti" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Žemyn." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Atsisiųsti" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Šifravimas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Programinės įrangos versija" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "„GatewayV4“" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "„GatewayV6“" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Duoti/Suteikti prieigą prie „DHCP“ būsenos rodymo" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Duoti/Suteikti prieigą pagrindiniui statuso rodymui" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Duoti/Suteikti prieigą į sistemos maršruto statusą" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Duoti/Suteikti prieigą į belaidžio statuso rodymą" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Įrenginio pavadinimas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "„IP“ adresas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "„IPv4“" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "„IPv4“ Internetas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "„IPv6“" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "„IPv6“ Internetas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "„IPv6“ prielinksnis" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internetas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "„Kernel“ versija" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Vietinis laikas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "„MAC“" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "„Mac“" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Modelis" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Neprisijungta" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokolas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "„SSID“" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Signalas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Sistema" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Aukštyn." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Įkelti" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Aktyvumo laikas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Belaidis" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "ne" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "Taip" diff --git a/package/luci/modules/luci-mod-dashboard/po/mr/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/mr/dashboard.po index e745993eb4..8c00feafca 100644 --- a/package/luci/modules/luci-mod-dashboard/po/mr/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/mr/dashboard.po @@ -12,7 +12,7 @@ msgstr "" msgid "Active" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "" @@ -30,25 +30,20 @@ msgstr "" msgid "Channel" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "" @@ -76,7 +71,7 @@ msgstr "" msgid "Encryption" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "" @@ -84,11 +79,11 @@ msgstr "" msgid "GHz" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "" @@ -118,24 +113,24 @@ msgstr "" msgid "IP Address" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "" @@ -143,11 +138,11 @@ msgstr "" msgid "Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "" @@ -163,17 +158,17 @@ msgstr "" msgid "Mbit/s" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "" @@ -198,7 +193,9 @@ msgstr "" msgid "Upload" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "" diff --git a/package/luci/modules/luci-mod-dashboard/po/ms/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/ms/dashboard.po index a7dedf8960..705b91931b 100644 --- a/package/luci/modules/luci-mod-dashboard/po/ms/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/ms/dashboard.po @@ -12,7 +12,7 @@ msgstr "" msgid "Active" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "" @@ -30,25 +30,20 @@ msgstr "" msgid "Channel" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "" @@ -76,7 +71,7 @@ msgstr "" msgid "Encryption" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "" @@ -84,11 +79,11 @@ msgstr "" msgid "GHz" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "" @@ -118,24 +113,24 @@ msgstr "" msgid "IP Address" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "" @@ -143,11 +138,11 @@ msgstr "" msgid "Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "" @@ -163,17 +158,17 @@ msgstr "" msgid "Mbit/s" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "" @@ -198,7 +193,9 @@ msgstr "" msgid "Upload" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "" diff --git a/package/luci/modules/luci-mod-dashboard/po/nb_NO/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/nb_NO/dashboard.po index 0b79b5ebd0..85c48fc5a9 100644 --- a/package/luci/modules/luci-mod-dashboard/po/nb_NO/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/nb_NO/dashboard.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2022-11-08 00:12+0000\n" "Last-Translator: Allan Nordhøy \n" -"Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" @@ -17,7 +17,7 @@ msgstr "" msgid "Active" msgstr "Aktiv" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Arkitektur" @@ -35,25 +35,20 @@ msgstr "Bitrate" msgid "Channel" msgstr "Kanal" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Tilkoblet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Tilkoblet siden" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP-enheter" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -82,7 +77,7 @@ msgstr "Last ned" msgid "Encryption" msgstr "Kryptering" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Fastvareversjon" @@ -90,12 +85,12 @@ msgstr "Fastvareversjon" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 #, fuzzy msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 #, fuzzy msgid "GatewayV6" msgstr "GatewayV6" @@ -126,24 +121,24 @@ msgstr "Vertsnavn" msgid "IP Address" msgstr "IP-adresse" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4-Internett" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6-Internett" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "IPv6-prefiks" @@ -151,11 +146,11 @@ msgstr "IPv6-prefiks" msgid "Internet" msgstr "Internett" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Kjerneversjon" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Lokal tid" @@ -172,17 +167,17 @@ msgstr "MAC" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Modell" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Ikke tilkoblet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protokoll" @@ -209,7 +204,9 @@ msgstr "Oppe." msgid "Upload" msgstr "Last opp" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Oppetid" diff --git a/package/luci/modules/luci-mod-dashboard/po/nl/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/nl/dashboard.po index 7768ab9f9c..a17e09f117 100644 --- a/package/luci/modules/luci-mod-dashboard/po/nl/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/nl/dashboard.po @@ -1,27 +1,26 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2022-11-04 10:26+0000\n" -"Last-Translator: fodiator \n" -"Language-Team: Dutch \n" +"Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 5.1-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Actief" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Architectuur" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -#, fuzzy msgid "BSSID" msgstr "BSSID" @@ -35,33 +34,26 @@ msgstr "Bitrate" msgid "Channel" msgstr "Kanaal" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Verbonden" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP Apparaten" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 -#, fuzzy +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 -#, fuzzy +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" #: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 msgid "Dashboard" -msgstr "" +msgstr "Dashboard" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 msgid "Devices" @@ -81,145 +73,147 @@ msgstr "Download" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" -msgstr "" +msgstr "Versleuteling" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" -msgstr "" +msgstr "Firmware Versie" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 msgid "GHz" -msgstr "" +msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" -msgstr "" +msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" -msgstr "" +msgstr "GatewayV6" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 msgid "Grant access to DHCP status display" -msgstr "" +msgstr "Toegang verlenen tot weergave van DHCP-status" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 msgid "Grant access to main status display" -msgstr "" +msgstr "Toegang verlenen tot hoofdstatusweergave" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 msgid "Grant access to the system route status" -msgstr "" +msgstr "Toegang verlenen tot de status van het systeemrouteringsproces" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 msgid "Grant access to wireless status display" -msgstr "" +msgstr "Toegang verlenen tot weergave van draadloze status" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 msgid "Hostname" -msgstr "" +msgstr "Host naam" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 msgid "IP Address" -msgstr "" +msgstr "IP Adres" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" -msgstr "" +msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" -msgstr "" +msgstr "IPv4 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" -msgstr "" +msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" -msgstr "" +msgstr "IPv6 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" -msgstr "" +msgstr "IPv6 prefix" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "Internet" -msgstr "" +msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" -msgstr "" +msgstr "Kernel Versie" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" -msgstr "" +msgstr "Lokale tijd" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 msgid "MAC" -msgstr "" +msgstr "MAC" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 msgid "Mac" -msgstr "" +msgstr "Mac" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 msgid "Mbit/s" -msgstr "" +msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" -msgstr "" +msgstr "Model" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" -msgstr "" +msgstr "Geen verbinding" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" -msgstr "" +msgstr "Protocol" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 msgid "SSID" -msgstr "" +msgstr "SSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 msgid "Signal" -msgstr "" +msgstr "Signaal" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "System" -msgstr "" +msgstr "Systeem" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Up." -msgstr "" +msgstr "Boven." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 msgid "Upload" -msgstr "" +msgstr "Uploaden" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" -msgstr "" +msgstr "Bedrijfstijd" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 msgid "Wireless" -msgstr "" +msgstr "Draadloos" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "no" -msgstr "" +msgstr "nee" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "yes" -msgstr "" +msgstr "ja" diff --git a/package/luci/modules/luci-mod-dashboard/po/pl/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/pl/dashboard.po index 25b9b58758..8a16a612c2 100644 --- a/package/luci/modules/luci-mod-dashboard/po/pl/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/pl/dashboard.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2021-06-26 18:17+0000\n" -"Last-Translator: Adam Stańczyk \n" -"Language-Team: Polish \n" +"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -11,13 +11,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.7.1-dev\n" +"X-Generator: Weblate 4.18.1\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Aktywny" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Architektura" @@ -35,25 +35,20 @@ msgstr "Szybkość transmisji" msgid "Channel" msgstr "Kanał" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Połączony" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Czas połączenia" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "Urządzenia DHCP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -75,13 +70,13 @@ msgstr "Pobieranie" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" -msgstr "Pobieranie" +msgstr "Pobierz" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" msgstr "Szyfrowanie" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Wersja firmware" @@ -89,11 +84,11 @@ msgstr "Wersja firmware" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "BramaV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "BramaV6" @@ -123,24 +118,24 @@ msgstr "Nazwa hosta" msgid "IP Address" msgstr "Adres IP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "Internet IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "Internet IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Prefiks IPv6" @@ -148,11 +143,11 @@ msgstr "Prefiks IPv6" msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Wersja kernela" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Czas lokalny" @@ -168,17 +163,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Model" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" -msgstr "Nie podłączony" +msgstr "Niepodłączony" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protokół" @@ -203,7 +198,9 @@ msgstr "Wysyłanie" msgid "Upload" msgstr "Wysyłanie" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Czas pracy" diff --git a/package/luci/modules/luci-mod-dashboard/po/pt/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/pt/dashboard.po index 252bac1d66..739ac83e00 100644 --- a/package/luci/modules/luci-mod-dashboard/po/pt/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/pt/dashboard.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2022-11-30 14:48+0000\n" "Last-Translator: Gonçalo Pereira \n" -"Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" msgid "Active" msgstr "Ativo" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Arquitectura" @@ -34,25 +34,20 @@ msgstr "Taxa de bits" msgid "Channel" msgstr "Canal" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Ligado" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Ligado desde" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "Dispositivos DHCP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -80,7 +75,7 @@ msgstr "Descarregar" msgid "Encryption" msgstr "Encriptação" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Versão do firmware" @@ -88,11 +83,11 @@ msgstr "Versão do firmware" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -122,24 +117,24 @@ msgstr "Nome do equipamento" msgid "IP Address" msgstr "Endereço IP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "Internet IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "Internet IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Prefixo IPv6" @@ -147,11 +142,11 @@ msgstr "Prefixo IPv6" msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Versão do kernel" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Hora local" @@ -167,17 +162,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Modelo" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Não conectado" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protocolo" @@ -202,7 +197,9 @@ msgstr "Ativo." msgid "Upload" msgstr "Enviar" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Tempo de atividade" diff --git a/package/luci/modules/luci-mod-dashboard/po/pt_BR/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/pt_BR/dashboard.po index 3336d1e66b..a290df252a 100644 --- a/package/luci/modules/luci-mod-dashboard/po/pt_BR/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/pt_BR/dashboard.po @@ -1,22 +1,22 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2021-04-01 17:27+0000\n" +"PO-Revision-Date: 2023-06-05 03:51+0000\n" "Last-Translator: Wellington Terumi Uemura \n" "Language-Team: Portuguese (Brazil) \n" +"librecmc/lucimodulesluci-mod-dashboard/pt_BR/>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.6-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Ativo" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Arquitetura" @@ -34,25 +34,20 @@ msgstr "Taxa de bits" msgid "Channel" msgstr "Canal" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Conectado" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Conectado desde" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "Dispositivos DHCP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -74,13 +69,13 @@ msgstr "Baix." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" -msgstr "Download" +msgstr "Baixar" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" msgstr "Criptografia" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Versão do firmware" @@ -88,11 +83,11 @@ msgstr "Versão do firmware" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -122,24 +117,24 @@ msgstr "Nome do equipamento" msgid "IP Address" msgstr "Endereço IP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "Internet IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "Internet IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Prefixo IPv6" @@ -147,11 +142,11 @@ msgstr "Prefixo IPv6" msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Versão do kernel" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Hora local" @@ -167,17 +162,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Modelo" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Não conectado" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protocolo" @@ -202,7 +197,9 @@ msgstr "Envio" msgid "Upload" msgstr "Envio" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Tempo de atividade" diff --git a/package/luci/modules/luci-mod-dashboard/po/ro/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/ro/dashboard.po index 72ac8ef649..479f5cc9b1 100644 --- a/package/luci/modules/luci-mod-dashboard/po/ro/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/ro/dashboard.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2022-11-04 20:04+0000\n" +"PO-Revision-Date: 2023-07-10 15:50+0000\n" "Last-Translator: Simona Iacob \n" -"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" @@ -11,13 +11,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Activ" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Arhitectură" @@ -28,32 +28,27 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 msgid "Bitrate" -msgstr "Rata de biți" +msgstr "Viteză de transfer" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "Channel" msgstr "Canal" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Conectat" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Conectat de la" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "Dispozitive DHCP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -81,7 +76,7 @@ msgstr "Descărcați" msgid "Encryption" msgstr "Criptare" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Versiunea Firmware-ului" @@ -89,11 +84,11 @@ msgstr "Versiunea Firmware-ului" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -123,24 +118,24 @@ msgstr "Numele gazdei ( hostname )" msgid "IP Address" msgstr "Adresa IP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "Internet IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "Internet IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Prefix IPv6" @@ -148,11 +143,11 @@ msgstr "Prefix IPv6" msgid "Internet" msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Versiunea Kernel-ului" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Ora locală" @@ -168,17 +163,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Model" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Nu este conectat" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protocol" @@ -203,7 +198,9 @@ msgstr "Sus." msgid "Upload" msgstr "Încărcați" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Timp de funcționare" diff --git a/package/luci/modules/luci-mod-dashboard/po/ru/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/ru/dashboard.po index 580e1e92cb..28ca660aea 100644 --- a/package/luci/modules/luci-mod-dashboard/po/ru/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/ru/dashboard.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2021-10-26 14:59+0000\n" -"Last-Translator: Darin Avdeyeva \n" -"Language-Team: Russian \n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -11,13 +11,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.17-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" -msgstr "Активный" +msgstr "Активно" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Архитектура" @@ -35,31 +35,26 @@ msgstr "Битрейт" msgid "Channel" msgstr "Канал" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Подключен" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Подключено с" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "Устройства DHCP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" #: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 msgid "Dashboard" -msgstr "Панель мониторинга" +msgstr "Информационная панель" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 msgid "Devices" @@ -81,7 +76,7 @@ msgstr "Скачать" msgid "Encryption" msgstr "Шифрование" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Версия прошивки" @@ -89,11 +84,11 @@ msgstr "Версия прошивки" msgid "GHz" msgstr "ГГц" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -117,30 +112,30 @@ msgstr "Предоставить доступ к просмотру состоя #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 msgid "Hostname" -msgstr "Имя" +msgstr "Имя хоста" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 msgid "IP Address" msgstr "IP-адрес" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4 Интернет" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6 Интернет" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Префикс IPv6" @@ -148,11 +143,11 @@ msgstr "Префикс IPv6" msgid "Internet" msgstr "Интернет" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Версия ядра" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Время" @@ -168,17 +163,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Мбит/с" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Модель" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Не подключен" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Протокол" @@ -203,7 +198,9 @@ msgstr "Загр." msgid "Upload" msgstr "Загрузить" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Время работы" diff --git a/package/luci/modules/luci-mod-dashboard/po/sk/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/sk/dashboard.po index 9b5a947fc3..b3119b0544 100644 --- a/package/luci/modules/luci-mod-dashboard/po/sk/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/sk/dashboard.po @@ -1,69 +1,67 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2023-09-02 23:33+0000\n" +"Last-Translator: MaycoH \n" +"Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 5.0.1-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" -msgstr "" +msgstr "Aktívny" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" -msgstr "" +msgstr "Architektúra" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 msgid "BSSID" -msgstr "" +msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 msgid "Bitrate" -msgstr "" +msgstr "Bitová rýchlosť" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "Channel" -msgstr "" +msgstr "Kanál" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" +msgstr "Pripojené" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" -msgstr "" +msgstr "Zariadenia DHCP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" -msgstr "" +msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" -msgstr "" +msgstr "DNSv6" #: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 msgid "Dashboard" -msgstr "" +msgstr "Nástenka" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 msgid "Devices" -msgstr "" +msgstr "Zariadenia" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 msgid "Devices Connected" -msgstr "" +msgstr "Pripojené zariadenia" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Down." @@ -71,35 +69,36 @@ msgstr "" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" -msgstr "" +msgstr "Stiahnuť" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" -msgstr "" +msgstr "Šifrovanie" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" -msgstr "" +msgstr "Verzia firmvéru" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 msgid "GHz" -msgstr "" +msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" -msgstr "" +msgstr "Brána v4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" -msgstr "" +msgstr "Brána v6" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 msgid "Grant access to DHCP status display" -msgstr "" +msgstr "Udeliť prístup k zobrazeniu stavu DHCP" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +#, fuzzy msgid "Grant access to main status display" -msgstr "" +msgstr "Udeliť prístup k zobrazeniu hlavného stavu" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 msgid "Grant access to the system route status" @@ -107,54 +106,54 @@ msgstr "" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 msgid "Grant access to wireless status display" -msgstr "" +msgstr "Udeliť prístup k zobrazeniu stavu bezdrôtovej siete" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 msgid "Hostname" -msgstr "" +msgstr "Názov hostiteľa" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 msgid "IP Address" -msgstr "" +msgstr "Adresa IP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" -msgstr "" +msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" -msgstr "" +msgstr "Internet IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" -msgstr "" +msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" -msgstr "" +msgstr "Internet IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" -msgstr "" +msgstr "IPv6 prefix" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "Internet" -msgstr "" +msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" -msgstr "" +msgstr "Verzia jadra" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" -msgstr "" +msgstr "Miestny čas" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 msgid "MAC" -msgstr "" +msgstr "MAC" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 msgid "Mac" @@ -162,34 +161,34 @@ msgstr "" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 msgid "Mbit/s" -msgstr "" +msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" -msgstr "" +msgstr "Model" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" -msgstr "" +msgstr "Nepripojené" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" -msgstr "" +msgstr "Protokol" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 msgid "SSID" -msgstr "" +msgstr "SSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 msgid "Signal" -msgstr "" +msgstr "Signál" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "System" -msgstr "" +msgstr "Systém" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Up." @@ -199,21 +198,23 @@ msgstr "" msgid "Upload" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" -msgstr "" +msgstr "Doba spustenia" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 msgid "Wireless" -msgstr "" +msgstr "Bezdrôtová sieť" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "no" -msgstr "" +msgstr "nie" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "yes" -msgstr "" +msgstr "áno" diff --git a/package/luci/modules/luci-mod-dashboard/po/sv/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/sv/dashboard.po index 24c5d1b28b..bfc2c381f6 100644 --- a/package/luci/modules/luci-mod-dashboard/po/sv/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/sv/dashboard.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2022-12-04 12:08+0000\n" "Last-Translator: Kristoffer Grundström \n" -"Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" msgid "Active" msgstr "Aktiv" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Arkitektur" @@ -34,25 +34,20 @@ msgstr "Bithastighet" msgid "Channel" msgstr "Kanal" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Ansluten" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Ansluten sedan" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP enheter" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -80,7 +75,7 @@ msgstr "Nedladdning" msgid "Encryption" msgstr "Kryptering" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Firmware Version" @@ -88,11 +83,11 @@ msgstr "Firmware Version" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -122,24 +117,24 @@ msgstr "" msgid "IP Address" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "" @@ -147,11 +142,11 @@ msgstr "" msgid "Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "" @@ -167,17 +162,17 @@ msgstr "" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protokoll" @@ -202,7 +197,9 @@ msgstr "" msgid "Upload" msgstr "Ladda upp" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "" diff --git a/package/luci/modules/luci-mod-dashboard/po/templates/dashboard.pot b/package/luci/modules/luci-mod-dashboard/po/templates/dashboard.pot index af5a664af4..005ed4014d 100644 --- a/package/luci/modules/luci-mod-dashboard/po/templates/dashboard.pot +++ b/package/luci/modules/luci-mod-dashboard/po/templates/dashboard.pot @@ -5,7 +5,7 @@ msgstr "Content-Type: text/plain; charset=UTF-8" msgid "Active" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "" @@ -23,25 +23,20 @@ msgstr "" msgid "Channel" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "" @@ -69,7 +64,7 @@ msgstr "" msgid "Encryption" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "" @@ -77,11 +72,11 @@ msgstr "" msgid "GHz" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "" @@ -111,24 +106,24 @@ msgstr "" msgid "IP Address" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "" @@ -136,11 +131,11 @@ msgstr "" msgid "Internet" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "" @@ -156,17 +151,17 @@ msgstr "" msgid "Mbit/s" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "" @@ -191,7 +186,9 @@ msgstr "" msgid "Upload" msgstr "" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "" diff --git a/package/luci/modules/luci-mod-dashboard/po/tr/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/tr/dashboard.po index 673eb84767..fd5736c715 100644 --- a/package/luci/modules/luci-mod-dashboard/po/tr/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/tr/dashboard.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2021-05-11 11:34+0000\n" "Last-Translator: semih \n" -"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" msgid "Active" msgstr "Etkin" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Mimari" @@ -34,25 +34,20 @@ msgstr "Bit hızı" msgid "Channel" msgstr "Kanal" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Bağlandı" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Şu tarihten beri bağlı" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP Aygıtları" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -80,7 +75,7 @@ msgstr "İndir" msgid "Encryption" msgstr "Şifreleme" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Ürün Yazılımı Sürümü" @@ -88,11 +83,11 @@ msgstr "Ürün Yazılımı Sürümü" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "GatewayV6" @@ -122,24 +117,24 @@ msgstr "Sunucu adı" msgid "IP Address" msgstr "IP Adresi" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4 İnternet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6 İnternet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "IPv6 ön eki" @@ -147,11 +142,11 @@ msgstr "IPv6 ön eki" msgid "Internet" msgstr "İnternet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Çekirdek Sürümü" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Yerel Zaman" @@ -167,17 +162,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Model" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Bağlı değil" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Protokol" @@ -202,7 +197,9 @@ msgstr "Yük." msgid "Upload" msgstr "Yükleme" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Çalışma süresi" diff --git a/package/luci/modules/luci-mod-dashboard/po/uk/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/uk/dashboard.po index e94e4439c1..9de449c8a8 100644 --- a/package/luci/modules/luci-mod-dashboard/po/uk/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/uk/dashboard.po @@ -1,9 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2021-11-04 17:37+0000\n" -"Last-Translator: Paul Dee \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -11,13 +11,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 5.1\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" -msgstr "Активний" +msgstr "Активне" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Архітектура" @@ -35,25 +35,20 @@ msgstr "Бітрейт" msgid "Channel" msgstr "Канал" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Підключений" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "Під'єднано з" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP-пристрої" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -81,7 +76,7 @@ msgstr "Завантажити" msgid "Encryption" msgstr "Шифрування" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Версія прошивки" @@ -89,11 +84,11 @@ msgstr "Версія прошивки" msgid "GHz" msgstr "Ггц" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "Шлюз V4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "Шлюз v6" @@ -123,24 +118,24 @@ msgstr "Ім'я хоста" msgid "IP Address" msgstr "IP-адреса" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "Інтернет IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "Інтернет IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Префікс IPv6" @@ -148,11 +143,11 @@ msgstr "Префікс IPv6" msgid "Internet" msgstr "Інтернет" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Версія ядра" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Місцевий час" @@ -168,17 +163,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Мбіт/с" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Модель" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Не підключено" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "Протокол" @@ -203,7 +198,9 @@ msgstr "Вгору." msgid "Upload" msgstr "Завантажити" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "Час безвідмовної роботи" diff --git a/package/luci/modules/luci-mod-dashboard/po/vi/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/vi/dashboard.po index 621efb8401..dbef685a04 100644 --- a/package/luci/modules/luci-mod-dashboard/po/vi/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/vi/dashboard.po @@ -1,219 +1,219 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2023-06-20 13:52+0000\n" +"Last-Translator: Quy \n" +"Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.18.1\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" -msgstr "" +msgstr "Kích hoạt" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" -msgstr "" +msgstr "Kiến trúc" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 msgid "BSSID" -msgstr "" +msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 msgid "Bitrate" -msgstr "" +msgstr "Bitrate" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "Channel" -msgstr "" +msgstr "Kênh" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "" +msgstr "Đã kết nối" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" -msgstr "" +msgstr "Thiết bị DHCP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" -msgstr "" +msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" -msgstr "" +msgstr "DNSv6" #: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 msgid "Dashboard" -msgstr "" +msgstr "Màn hình chính" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 msgid "Devices" -msgstr "" +msgstr "Các thiết bị" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 msgid "Devices Connected" -msgstr "" +msgstr "Thiết bị đã kết nối" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Down." -msgstr "" +msgstr "Sập." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" -msgstr "" +msgstr "Tải xuống" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" -msgstr "" +msgstr "Mã hóa" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" -msgstr "" +msgstr "Phiên bản firmware" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 msgid "GHz" -msgstr "" +msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" -msgstr "" +msgstr "GatewayV4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" -msgstr "" +msgstr "GatewayV6" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 msgid "Grant access to DHCP status display" -msgstr "" +msgstr "Cấp quyền truy cập vào màn hình trạng thái DHCP" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 msgid "Grant access to main status display" -msgstr "" +msgstr "Cấp quyền truy cập vào màn hình trạng thái chính" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 msgid "Grant access to the system route status" -msgstr "" +msgstr "Cấp quyền truy cập vào trạng thái tuyến đường hệ thống" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 msgid "Grant access to wireless status display" -msgstr "" +msgstr "Cấp quyền truy cập vào hiển thị trạng thái không dây" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 msgid "Hostname" -msgstr "" +msgstr "Tên máy chủ (hostname)" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 msgid "IP Address" -msgstr "" +msgstr "Địa chỉ IP" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" -msgstr "" +msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" -msgstr "" +msgstr "IPv4 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" -msgstr "" +msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" -msgstr "" +msgstr "IPv6 Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" -msgstr "" +msgstr "IPv6 prefix" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "Internet" -msgstr "" +msgstr "Internet" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" -msgstr "" +msgstr "Phiên bản Kernel" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" -msgstr "" +msgstr "Giờ địa phương" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 msgid "MAC" -msgstr "" +msgstr "MAC" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 msgid "Mac" -msgstr "" +msgstr "Mac" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 msgid "Mbit/s" -msgstr "" +msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" -msgstr "" +msgstr "Model" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" -msgstr "" +msgstr "Không kết nối" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" -msgstr "" +msgstr "Giao thức" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 msgid "SSID" -msgstr "" +msgstr "SSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 msgid "Signal" -msgstr "" +msgstr "Tín hiệu" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "System" -msgstr "" +msgstr "Hệ thống" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Up." -msgstr "" +msgstr "Đã mở." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 msgid "Upload" -msgstr "" +msgstr "Tải lên" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" -msgstr "" +msgstr "Thời gian hoạt động" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 msgid "Wireless" -msgstr "" +msgstr "Không dây" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "no" -msgstr "" +msgstr "Không" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "yes" -msgstr "" +msgstr "có" diff --git a/package/luci/modules/luci-mod-dashboard/po/zh_Hans/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/zh_Hans/dashboard.po index dd39015a11..84f92b6479 100644 --- a/package/luci/modules/luci-mod-dashboard/po/zh_Hans/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/zh_Hans/dashboard.po @@ -1,20 +1,20 @@ msgid "" msgstr "" -"PO-Revision-Date: 2022-05-07 19:19+0000\n" -"Last-Translator: 王攀 <41330784@qq.com>\n" +"PO-Revision-Date: 2023-07-07 02:23+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" +"librecmc/lucimodulesluci-mod-dashboard/zh_Hans/>\n" "Language: zh_Hans\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12.1\n" +"X-Generator: Weblate 5.0-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "活跃" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "架构" @@ -25,32 +25,27 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 msgid "Bitrate" -msgstr "速率" +msgstr "比特率" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "Channel" msgstr "信道" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "已连接" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "连接开始时间" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP 设备" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -78,7 +73,7 @@ msgstr "下载" msgid "Encryption" msgstr "加密" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "固件版本" @@ -86,11 +81,11 @@ msgstr "固件版本" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "IPv4 网关" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "IPv6 网关" @@ -120,24 +115,24 @@ msgstr "主机名" msgid "IP Address" msgstr "IP 地址" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4 网络" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6 网络" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "IPv6 前缀" @@ -145,11 +140,11 @@ msgstr "IPv6 前缀" msgid "Internet" msgstr "互联网" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "内核版本" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "本地时间" @@ -165,17 +160,17 @@ msgstr "Mac" msgid "Mbit/s" msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "型号" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "未连接" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "协议" @@ -200,7 +195,9 @@ msgstr "上行" msgid "Upload" msgstr "上传" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "运行时间" diff --git a/package/luci/modules/luci-mod-dashboard/po/zh_Hant/dashboard.po b/package/luci/modules/luci-mod-dashboard/po/zh_Hant/dashboard.po index 5998b1fb1f..dec4de6c0c 100644 --- a/package/luci/modules/luci-mod-dashboard/po/zh_Hant/dashboard.po +++ b/package/luci/modules/luci-mod-dashboard/po/zh_Hant/dashboard.po @@ -1,20 +1,20 @@ msgid "" msgstr "" -"PO-Revision-Date: 2022-11-25 14:34+0000\n" -"Last-Translator: James Tien \n" +"PO-Revision-Date: 2023-08-06 01:52+0000\n" +"Last-Translator: Trevor \n" "Language-Team: Chinese (Traditional) \n" +"librecmc/lucimodulesluci-mod-dashboard/zh_Hant/>\n" "Language: zh_Hant\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "已啓用" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:306 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "架構" @@ -25,32 +25,27 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 msgid "Bitrate" -msgstr "位元率" +msgstr "位元速率" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "Channel" msgstr "頻道" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:215 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "已連線" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:181 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:221 -msgid "Connected since" -msgstr "連線開始時間" - #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP 裝置" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:205 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 msgid "DNSv4" msgstr "DNSv4" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:251 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 msgid "DNSv6" msgstr "DNSv6" @@ -78,7 +73,7 @@ msgstr "下載" msgid "Encryption" msgstr "加密(Encryption)" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:311 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "韌體版本" @@ -86,11 +81,11 @@ msgstr "韌體版本" msgid "GHz" msgstr "GHz" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:199 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 msgid "GatewayV4" msgstr "IPv4 閘道" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 msgid "GatewayV6" msgstr "IPv6 閘道" @@ -120,24 +115,24 @@ msgstr "主機名稱" msgid "IP Address" msgstr "IP 位址" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:193 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4 地址" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:172 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "IPv4 網路" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:239 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:212 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "IPv6 網路" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:233 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "IPv6字首" @@ -145,11 +140,11 @@ msgstr "IPv6字首" msgid "Internet" msgstr "網際網路" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:296 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "核心版本" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:291 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "本地時間" @@ -163,19 +158,19 @@ msgstr "Mac" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 msgid "Mbit/s" -msgstr "Mbit/秒" +msgstr "Mbit/s" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:301 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "裝置型號" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:151 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:158 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "尚未連線" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:187 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:227 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 msgid "Protocol" msgstr "協定" @@ -200,7 +195,9 @@ msgstr "上傳" msgid "Upload" msgstr "上傳" -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:286 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "上線時間" diff --git a/package/luci/modules/luci-mod-dsl/Makefile b/package/luci/modules/luci-mod-dsl/Makefile new file mode 100644 index 0000000000..4d8d43b798 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/Makefile @@ -0,0 +1,16 @@ +# +# Copyright (C) 2022 Roland Barenbrug +# +# This is free software, licensed under the Apache License, Version 2.0 +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LUCI DSL spectrum graph +LUCI_DEPENDS:=+luci-base + +PKG_LICENSE:=Apache-2.0 + +include ../../luci.mk + +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js b/package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js new file mode 100644 index 0000000000..218b67938a --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js @@ -0,0 +1,400 @@ +// +// Rendering of DSL spectrum graphs showing +// US/DS SNR and US/DS bits/tone +// +// This version does depend on an ubus version that support DSL line stattiscis but +// does not depend on chart.js or any other package + +class DataSet { + constructor (input, extractFunction) { + this.groupSize = input.groupsize; + this.numData = input.groups; + // needs to be validated with various input + this.maxX = this.numData * this.groupSize; + this.data = input.data.map(extractFunction, + {groupSize: this.groupSize} + ); + } +} + +function myBitsFunction(value, index, array) { + return({x: index, y: value, error: false}); +} + +function mySnrFunction(value, index, array) { + let result; + + if (value == null) { + result = { + x: index * this.groupSize, + y: -40 , + error: true + } + } else { + result = { + x: index * this.groupSize, + y: value, + error: false + } + } + + return(result); +} + +function myQLNFunction(value, index, array) { + let result; + + if (value == null) { + result = { + x: index * this.groupSize, + y: - 150, + error: true + } + } else { + result = { + x: index * this.groupSize, + y: value, + error: false + } + } + + return(result); +} + +function myHLOGFunction(value, index, array) { + let result; + + if (value == null) { + result = { + x: index * this.groupSize, + y: -100, + error: true + } + } else { + result = { + x: index * this.groupSize, + y: value, + error: false + } + } + + return(result); +} + +const usSnrData = new DataSet(window.json['snr']['upstream'], mySnrFunction); +const dsSnrData = new DataSet(window.json['snr']['downstream'], mySnrFunction); +const usBitsData = new DataSet(window.json['bits']['upstream'], myBitsFunction); +const dsBitsData = new DataSet(window.json['bits']['downstream'], myBitsFunction); +const usQLNData = new DataSet(window.json['qln']['upstream'], myQLNFunction); +const dsQLNData = new DataSet(window.json['qln']['downstream'], myQLNFunction); +const usHLOGData = new DataSet(window.json['hlog']['upstream'], myHLOGFunction); +const dsHLOGData = new DataSet(window.json['hlog']['downstream'], myHLOGFunction); +const pilotTonesData = window.json['pilot_tones'] || []; + +const marginX = 50; +const marginY = 80; +let darkMode = document.getElementsByTagName("body")[0].parentNode.dataset.darkmode; + +let bitsChart = { + "config": { + "canvas": document.getElementById("bitsChart"), + "ctx" : document.getElementById("bitsChart").getContext("2d"), + "minX" : 0, + "maxX" : Math.max(dsBitsData.maxX, usBitsData.maxX), + "stepX": Math.max(dsBitsData.maxX, usBitsData.maxX) / 16, + "graphWidth" : document.getElementById("bitsChart").width - 2 * marginX, + "lineWidth" : 1, + "titleX" : _("Sub-carrier"), + "minY" : 0, + "maxY" : 16, + "stepY": 2, + "graphHeight" : document.getElementById("bitsChart").height - 2 * marginY, + "titleY" : _("bits") + }, + "dataSet" : [ + { + "data" :usBitsData.data, + "color":"YellowGreen", + "title": ("Upstream bits allocation") + }, + { + "data" : dsBitsData.data, + "color": "navy", + "title": _("Downstream bits allocation") + }, + { + "lines": true, + "data": pilotTonesData, + "color": "red", + "title": _("Pilot tones") + } + ] +}; + +let dBChart = { + "config": { + "canvas": document.getElementById("dbChart"), + "ctx" : document.getElementById("dbChart").getContext("2d"), + "minX" : 0, + "maxX" : Math.max(dsSnrData.maxX, usSnrData.maxX), + "stepX": Math.max(dsSnrData.maxX, usSnrData.maxX) / 16, + "graphWidth" : document.getElementById("dbChart").width - 2 * marginX, + "lineWidth": 4, + "titleX" : _("Sub-carrier"), + "minY" : -40, + "maxY" : 100, + "stepY": 10, + "graphHeight" : document.getElementById("dbChart").height - 2 * marginY, + "titleY" : _("dB") + }, + "dataSet" : [ + { + "data" :usSnrData.data, + "color":"Turquoise", + "title": _("Upstream SNR") + }, + { + "data" : dsSnrData.data, + "color": "Coral", + "title" : _("Downstream SNR") + } + ] +}; + +let qLNChart = { + "config": { + "canvas": document.getElementById("qlnChart"), + "ctx" : document.getElementById("qlnChart").getContext("2d"), + "minX" : 0, + "maxX" : Math.max(dsQLNData.maxX, usQLNData.maxX), + "stepX": Math.max(dsQLNData.maxX, usQLNData.maxX) / 16, + "graphWidth" : document.getElementById("qlnChart").width - 2 * marginX, + "lineWidth": 4, + "titleX" : _("Sub-carrier"), + "minY" : -150, + "maxY" : -20, + "stepY": 10, + "graphHeight" : document.getElementById("qlnChart").height - 2 * marginY, + "titleY" : _("dBm/Hz") + }, + "dataSet" : [ + { + "data" :usQLNData.data, + "color":"brown", + "title": _("Upstream QLN") + }, + { + "data" : dsQLNData.data, + "color": "teal", + "title" : _("Downstream QLN") + } + ] +}; + +let hLogChart = { + "config": { + "canvas": document.getElementById("hlogChart"), + "ctx" : document.getElementById("hlogChart").getContext("2d"), + "minX" : 0, + "maxX" : Math.max(dsHLOGData.maxX, usHLOGData.maxX), + "stepX": Math.max(dsHLOGData.maxX, usHLOGData.maxX) / 16, + "graphWidth" : document.getElementById("hlogChart").width - 2 * marginX, + "lineWidth": 4, + "titleX" : _("Sub-carrier"), + "minY" : -100, + "maxY" : 14, + "stepY": 10, + "graphHeight" : document.getElementById("hlogChart").height - 2 * marginY, + "titleY" : _("dB") + }, + "dataSet" : [ + { + "data" :usHLOGData.data, + "color":"#E8E800", + "title": _("Upstream HLOG") + }, + { + "data" : dsHLOGData.data, + "color": "darkmagenta", + "title" : _("Downstream HLOG") + } + ] +}; + +function drawChart (info) { + drawAxisX(info.config, info.config.minX, info.config.maxX, info.config.stepX, info.config.titleX); + drawAxisY(info.config, info.config.minY, info.config.maxY, info.config.stepY, info.config.titleY); + + drawLegend(info.config, info.dataSet); + + for (let item of info.dataSet) { + if (item.lines === true) { + drawLines(info.config, item.data, item.color); + } else { + drawData(info.config, item.data, item.color); + } + } +} + +function drawBlocks(config, dataPoints, color, borders) { + borders.map(drawBlock, {config, dataPoints, color, borders}); +} + +function drawLines(config, dataPoints, color) { + let ctx = config.ctx; + let len = dataPoints.length; + let minX = config.minX; + let maxX = config.maxX; + let minY = config.minY; + let maxY = config.maxY; + + ctx.strokeStyle = color; + ctx.beginPath(); + + for (let item of dataPoints) { + let relX = (item - minX) / (maxX - minX); + ctx.moveTo(relX * config.graphWidth + marginX, marginY); + ctx.lineTo(relX * config.graphWidth + marginX, marginY + config.graphHeight); + } + + ctx.stroke(); +} + +function drawData(config, dataPoints, color) { + let ctx = config.ctx; + let len = dataPoints.length; + let minX =config.minX; + let maxX = config.maxX; + let minY = config.minY; + let maxY = config.maxY; + let startX = (dataPoints[0].x - config.minX) / (config.maxX - config.minX) + let startY = (config.minY - config.minY) / (config.maxY - config.minY) + + ctx.fillStyle = color; + ctx.beginPath(); + ctx.moveTo(startX * config.graphWidth + marginX, marginY + config.graphHeight - startY * config.graphHeight); + + for (let i = 1 ; i < len ; i++) { + let relX = (dataPoints[i].x - minX) / (maxX - minX); + let relY = (dataPoints[i].y - minY) / (maxY - minY); + ctx.lineTo(relX * config.graphWidth + marginX, marginY + config.graphHeight - relY * config.graphHeight); + } + + let endX = (dataPoints[len-1].x - minX) / (maxX - minX) + let endY = (config.minY - minY) / (maxY - minY) + + ctx.lineTo(endX * config.graphWidth + marginX, marginY + config.graphHeight - endY * config.graphHeight); + ctx.lineTo(startX * config.graphWidth + marginX, marginY + config.graphHeight - startY * config.graphHeight); + ctx.closePath(); + ctx.fill(); +} + +function drawLegend(config, dataSet){ + let ctx = config.ctx; + let graphWidth = config.graphWidth; + let graphHeight = config.graphHeight; + + ctx.font = "12px Arial"; + + let legendWidth = -10; + for (let item of dataSet) { + legendWidth += 50 + ctx.measureText(item.title).width; + } + + var x = 0.5 * (graphWidth - legendWidth) + marginX; + var y = config.canvas.height - marginY*1/4; + + for (let item of dataSet) { + ctx.fillStyle = item.color; + ctx.fillRect(x, y - 8, 30, 10); + ctx.strokeStyle = "#C0C0C0"; + ctx.strokeRect(x, y - 8, 30, 10); + + if (darkMode == "true") { + ctx.fillStyle = "#A0A0A0"; + } else { + ctx.fillStyle = "#303030"; + } + + x += 40; + + ctx.textAlign = "left" + ctx.fillText(item.title, x, y); + + x += ctx.measureText(item.title).width; + x += 10; + } +} + +function drawAxisX(config, minValue, maxValue, step, title) { + let ctx = config.ctx; + let graphWidth = config.graphWidth; + let graphHeight = config.graphHeight; + + ctx.font = "12px Arial"; + ctx.textAlign = "center"; + + if (darkMode == "true") { + ctx.strokeStyle = "#505050"; + ctx.fillStyle = "#A0A0A0"; + } else { + ctx.strokeStyle = "#E0E0E0"; + ctx.fillStyle = "#303030"; + } + + for (let x = minValue ; x <= maxValue ; x=x+step) { + let relX = (x - config.minX) / (config.maxX - config.minX); + + ctx.fillText(x , relX * graphWidth + marginX, config.canvas.height - marginY*3/4); + + ctx.beginPath(); + ctx.moveTo(relX * graphWidth + marginX, marginY); + ctx.lineTo(relX * graphWidth + marginX, config.canvas.height - marginY); + ctx.stroke(); + } + + ctx.font = "12px Arial"; + ctx.textAlign = "center"; + ctx.fillText(title, config.canvas.width/2, config.canvas.height - marginY*2/4); +} + +function drawAxisY(config, minValue, maxValue, step, title) { + let ctx = config.ctx + let graphWidth = config.graphWidth; + let graphHeight = config.graphHeight; + + ctx.font = "12px Arial"; + ctx.textAlign = "center"; + + if (darkMode == "true") { + ctx.strokeStyle = "#505050"; + ctx.fillStyle = "#A0A0A0"; + } else { + ctx.strokeStyle = "#E0E0E0"; + ctx.fillStyle = "#303030"; + } + + for (let y = minValue ; y <= maxValue ; y=y+step) { + let relY = (y - config.minY) / (config.maxY - config.minY); + + ctx.fillText(y , marginX *2 / 3, marginY + graphHeight - relY * graphHeight + 4); + + ctx.beginPath(); + ctx.moveTo(marginX, marginY + graphHeight - relY * graphHeight ); + ctx.lineTo(config.canvas.width - marginX, marginY + graphHeight - relY * graphHeight); + ctx.stroke(); + } + + ctx.font = "12px Arial"; + ctx.textAlign = "center"; + ctx.translate(marginX/3, marginY + graphHeight / 2); + ctx.rotate(-3.14 /2); + ctx.fillText(title, 0, 0); + ctx.rotate(3.14 /2) + ctx.translate(-marginX/3,-(marginY + graphHeight / 2)); +} + +drawChart(dBChart); +drawChart(bitsChart); +drawChart(qLNChart); +drawChart(hLogChart); diff --git a/package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js b/package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js new file mode 100644 index 0000000000..83884daa84 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js @@ -0,0 +1,63 @@ +'use strict'; +'require view'; +'require fs'; +'require ui'; +'require rpc'; + +var callDSLStatistics = rpc.declare({ + object: 'dsl', + method: 'statistics', + expect: { '': {} } +}); + +return view.extend({ + load: function() { + return Promise.all([ + callDSLStatistics() + ]); + }, + + render: function(data) { + window.json = data[0]; + + var v = E([], [ + E('h2', {'style': "height: 40px"}, [ _('DSL line spectrum') ]), + E('p', {}, _('Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise and Channel characteristics function (HLOG) per sub-carrier.')), + E('div', {'style': "height: 360px; width: 1024px"}, + E('canvas', { + 'id': 'dbChart', + 'height': 360, + 'width': 1024}, + ["chart"]) + ), + E('div', {'style': "height: 360px; width:1024px"}, + E('canvas', { + 'id': 'bitsChart', + 'height': 360, + 'width': 1024}, + ["chart2"]) + ), + E('div', {'style': "height: 360px; width:1024px"}, + E('canvas', { + 'id': 'qlnChart', + 'height': 360, + 'width': 1024}, + ["chart2"]) + ), + E('div', {'style': "height: 360px; width:1024px"}, + E('canvas', { + 'id': 'hlogChart', + 'height': 360, + 'width': 1024}, + ["chart2"]) + ), + E('script', {'src':'/luci-static/resources/view/status/dsl/graph.js'}, {}) + ]); + + return v; + }, + + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js b/package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js new file mode 100644 index 0000000000..5dcdebfd5d --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js @@ -0,0 +1,188 @@ +'use strict'; +'require view'; +'require dom'; +'require poll'; +'require rpc'; + +var callDSLMetrics = rpc.declare({ + object: 'dsl', + method: 'metrics', + expect: { '': {} } +}); + +function format_on_off(val) { + return val ? _('on') : _('off'); +} + +function format_latency(val) { + return '%.2f ms'.format(val / 1000); +} + +return view.extend({ + load: function() { + return L.resolveDefault(callDSLMetrics(), {}); + }, + + pollData: function(container) { + poll.add(L.bind(function() { + return L.resolveDefault(callDSLMetrics(), {}).then(L.bind(function(data) { + dom.content(container, this.renderContent(data)); + }, this)); + }, this)); + }, + + formatHelper: function(format, val) { + if (val != null) { + if (format instanceof Function) { + return format(val); + } else if (typeof format === 'string') { + return format.format(val); + } else { + return val; + } + } + return '-'; + }, + + renderSimpleTable: function(data) { + var table = E('table', { 'class': 'table' }); + + for (var [i, item] of data.entries()) { + var label = item[0]; + var val = item[1]; + + var rowstyle = (i % 2 == 0) ? 'cbi-rowstyle-1' : 'cbi-rowstyle-2'; + + table.appendChild(E('tr', { 'class': 'tr ' + rowstyle }, [ + E('td', { 'class': 'td left', 'width': '33%' }, [ label ]), + E('td', { 'class': 'td left' }, [ this.formatHelper(null, val) ]) + ])); + } + + return table; + }, + + renderTable: function(data) { + var table = E('table', { 'class': 'table' }); + + for (var [i, item] of data.entries()) { + var label = item[0]; + var format = item[1]; + var val1 = item[2]; + var val2 = item[3]; + + var rowstyle = (i % 2 == 0) ? 'cbi-rowstyle-1' : 'cbi-rowstyle-2'; + + table.appendChild(E('tr', { 'class': 'tr ' + rowstyle }, [ + E('td', { 'class': 'td left', 'width': '33%' }, [ label ]), + E('td', { 'class': 'td right', 'width': '33%' }, [ this.formatHelper(format, val1) ]), + E('td', { 'class': 'td right', 'width': '33%' }, [ this.formatHelper(format, val2) ]) + ])); + } + + return table; + }, + + renderContent: function(data) { + return E([], [ + + E('h3', {}, [ _('Connection State') ]), + + this.renderSimpleTable([ + [ _('Line State'), data.state ], + [ _('Line Mode'), data.mode ], + [ _('Line Uptime'), '%t'.format(data.uptime) ], + [ _('Annex'), data.annex ], + [ _('Power Management Mode'), data.power_state ] + ]), + + E('h3', {}, [ _('Inventory') ]), + + this.renderSimpleTable([ + [ _('Modem Chipset'), data.chipset ], + [ _('Modem Firmware'), data.firmware_version ], + [ _('xTU-C Vendor ID'), data.atu_c.vendor || data.atu_c.vendor_id ] + ]), + + E('h3', {}, [ _('Line Details') ]), + + E('h4', {}, [ _('Data Rates') ]), + this.renderTable([ + [ _('Actual Data Rate'), '%1000.3mb/s', data.downstream.data_rate, data.upstream.data_rate ], + [ _('Attainable Data Rate (ATTNDR)'), '%1000.3mb/s', data.downstream.attndr, data.upstream.attndr ], + [ _('Minimum Error-Free Throughput (MINEFTR)'), '%1000.3mb/s', data.downstream.mineftr, data.upstream.mineftr ] + ]), + + E('h4', {}, [ _('On-line Reconfiguration') ]), + this.renderTable([ + [ _('Bitswap'), format_on_off, data.downstream.bitswap, data.upstream.bitswap ], + [ _('Rate Adaptation Mode'), '%s', data.downstream.ra_mode, data.upstream.ra_mode ] + ]), + + E('h4', {}, [ _('Noise Protection') ]), + this.renderTable([ + [ _('Latency'), format_latency, data.downstream.interleave_delay, data.upstream.interleave_delay ], + [ _('Impulse Noise Protection (INP)'), '%.1f symbols', data.downstream.inp, data.upstream.inp ], + [ _('Retransmission (G.INP)'), format_on_off, data.downstream.retx, data.upstream.retx ] + ]), + + E('h4', {}, [ _('Line Parameters') ]), + this.renderTable([ + [ _('Line Attenuation (LATN)'), '%.1f dB', data.downstream.latn, data.upstream.latn ], + [ _('Signal Attenuation (SATN)'), '%.1f dB', data.downstream.satn, data.upstream.satn ], + [ _('Noise Margin (SNRM)'), '%.1f dB', data.downstream.snr, data.upstream.snr ], + [ _('Aggregate Transmit Power (ACTATP)'), '%.1f dB', data.downstream.actatp, data.upstream.actatp ] + ]), + + E('h3', {}, [ _('Error Counters') ]), + + E('h4', {}, [ _('Error Seconds') ]), + this.renderTable([ + [ _('Forward Error Correction Seconds (FECS)'), '%d', data.errors.near.fecs, data.errors.far.fecs ], + [ _('Errored Seconds (ES)'), '%d', data.errors.near.es, data.errors.far.es ], + [ _('Severely Errored Seconds (SES)'), '%d', data.errors.near.ses, data.errors.far.ses ], + [ _('Loss of Signal Seconds (LOSS)'), '%d', data.errors.near.loss, data.errors.far.loss ], + [ _('Unavailable Seconds (UAS)'), '%d', data.errors.near.uas, data.errors.far.uas ], + [ _('Seconds with Low Error-Free Throughput (LEFTRS)'), '%d', data.errors.near.leftrs, data.errors.far.leftrs ] + ]), + + E('h4', {}, [ _('Channel Counters') ]), + this.renderTable([ + [ _('CRC Errors (CV-C)'), '%d', data.errors.near.cv_c, data.errors.far.cv_c ], + [ _('Corrected by FEC (FEC-C)'), '%d', data.errors.near.fec_c, data.errors.far.fec_c ] + ]), + + E('h4', {}, [ _('Data Path Counters') ]), + this.renderTable([ + [ _('ATM Header Error Code Errors (HEC-P)'), '%d', data.errors.near.hec, data.errors.far.hec ], + [ _('PTM Non Pre-emptive CRC Errors (CRC-P)'), '%d', data.errors.near.crc_p, data.errors.far.crc_p ], + [ _('PTM Pre-emptive CRC Errors (CRCP-P)'), '%d', data.errors.near.crcp_p, data.errors.far.crcp_p ] + ]), + + E('h4', {}, [ _('Retransmission Counters') ]), + this.renderTable([ + [ _('Retransmitted DTUs (rtx-tx)'), '%d', data.errors.far.tx_retransmitted, data.errors.near.tx_retransmitted ], + [ _('Corrected DTUs (rtx-c)'), '%d', data.errors.near.rx_corrected, data.errors.far.rx_corrected ], + [ _('Uncorrected DTUs (rtx-uc)'), '%d', data.errors.near.rx_uncorrected_protected, data.errors.far.rx_uncorrected_protected ] + ]) + + ]); + }, + + render: function(data) { + var v = E([], [ + E('h2', {}, [ _('DSL stats') ]), + E('div') + ]); + + var container = v.lastElementChild; + dom.content(container, this.renderContent(data)); + this.pollData(container); + + return v; + }, + + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/package/luci/modules/luci-mod-dsl/po/da/dsl.po b/package/luci/modules/luci-mod-dsl/po/da/dsl.po new file mode 100644 index 0000000000..8f72a02428 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/da/dsl.po @@ -0,0 +1,287 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-07-17 15:06+0000\n" +"Last-Translator: drax red \n" +"Language-Team: Danish \n" +"Language: da\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "DSL linje spektrum" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "Downstream HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "Downstream QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "Downstream SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "Downstream bittildeling" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"Nedenstående grafer viser signal-til-støj-forhold, bitallokering, stille " +"linjestøj og kanalkarakteristikfunktion (HLOG) pr. sub-carrier." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "Linjetilstand" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "Sub-carrier" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "Upstream HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "Upstream QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "Upstream SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "bits" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "dB" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "dBm/Hz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "" diff --git a/package/luci/modules/luci-mod-dsl/po/de/dsl.po b/package/luci/modules/luci-mod-dsl/po/de/dsl.po new file mode 100644 index 0000000000..ac1e1bd849 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/de/dsl.po @@ -0,0 +1,288 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-07-05 10:12+0000\n" +"Last-Translator: ssantos \n" +"Language-Team: German \n" +"Language: de\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "ATM-Header-Fehlercode-Fehler (HEC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "Tatsächliche Datenrate" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "Aggregierte Sendeleistung (ACTATP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "Anhang" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "Erreichbare Datenrate (ATTNDR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "Bitswap" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "CRC-Fehler (CV-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "Kanalzähler" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "Verbindungsstatus" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "Korrigierte DTUs (rtx-c)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "Korrigiert durch FEC (FEC-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "DSL-Leitungsspektrum" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "DSL-Statistiken" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "Datenpfadzähler" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "Datenraten" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "Downstream-HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "Downstream-QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "Downstream-SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "Downstream-Bitzuweisung" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "Fehlerzähler" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "Fehlersekunden" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "Sekunden mit Fehlern (ES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "Sekunden der Vorwärtsfehlerkorrektur (FECS)" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "Zugriff auf luci-mod-dsl gewähren" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"Die nachstehenden Diagramme zeigen das Signal-Rausch-Verhältnis, die Bit-" +"Zuweisung, das ruhige Leitungsrauschen und die Kanalcharakteristikfunktion " +"(HLOG) pro Unterträger." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "Impulslärmschutz (INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "Inventar" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "Latenz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "Leitungsdämpfung (LATN)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "Leitungsdetails" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "Leitungsmodus" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "Leitungsparameter" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "Leitungszustand" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "Verbindungsdauer" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "Signalverlust in Sekunden (LOSS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "Minimaler fehlerfreier Durchsatz (MINEFTR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "Modem-Chipsatz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "Modem-Firmware" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "Rauschabstand (SNRM)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "Lärmschutz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "Online-Rekonfiguration" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "PTM Nicht-präemptive CRC-Fehler (CRC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "PTM Präemptive CRC-Fehler (CRC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "Pilottöne" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "Energieverwaltungsmodus" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "Ratenanpassungsmodus" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "Neuübermittlung (G.INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "Neuübermittlungszähler" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "Neuübermittelte DTUs (rtx-tx)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "Sekunden mit niedrigem fehlerfreiem Durchsatz (LEFTRS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "Sekunden mit schwerwiegenden Fehlern (SES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "Signaldämpfung (SATN)" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "Spektrum" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "Statistiken" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "Unterträger" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "Sekunden der Nichtverfügbarkeit (UAS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "Unkorrigierte DTUs (rtx-uc)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "Upstream-HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "Upstream-QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "Upstream-SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "Bits" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "dB" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "dBm/Hz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "aus" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "an" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "xDSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "xTU-C Hersteller-ID" diff --git a/package/luci/modules/luci-mod-dsl/po/es/dsl.po b/package/luci/modules/luci-mod-dsl/po/es/dsl.po new file mode 100644 index 0000000000..7446dcda0c --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/es/dsl.po @@ -0,0 +1,301 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-11-04 20:04+0000\n" +"PO-Revision-Date: 2023-08-05 15:50+0000\n" +"Last-Translator: Franco Castillo \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "Tasa de datos real" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "Potencia de transmisión agregada (ACTATP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "Anexo" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "Velocidad de datos alcanzable (ATTNDR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "Intercambio de bits" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "Errores CRC (CV-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "Contadores de canales" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "Estado de conexión" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "DTU corregidas (rtx-c)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "Corregido por FEC (FEC-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +#, fuzzy +msgid "DSL line spectrum" +msgstr "Espectro de línea DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "Estadísticas de DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "Contadores de rutas de datos" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +#, fuzzy +msgid "Data Rates" +msgstr "Tasas de transferencia de datos" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "HLOG descendente" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "QLN descendente" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "SNR descendente" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +#, fuzzy +msgid "Downstream bits allocation" +msgstr "Asignación de bits descendente" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "Contadores de errores" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +#, fuzzy +msgid "Error Seconds" +msgstr "Segundos de error" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +#, fuzzy +msgid "Errored Seconds (ES)" +msgstr "Segundos erróneos (ES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "Segundos de corrección de errores de reenvío (FECS)" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "Otorgar acceso a luci-mod-dsl" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"Los siguientes gráficos muestran la relación señal/ruido, la asignación de " +"bits, el ruido de línea silenciosa y la función de características del canal " +"(HLOG) por subportadora." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "Protección contra ruido de impulso (INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "Inventario" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "Latencia" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "Atenuación de línea (LATN)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "Detalles de línea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "Modo de línea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "Parámetros de línea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "Estado de línea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +#, fuzzy +msgid "Line Uptime" +msgstr "Tiempo de actividad de la línea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "Pérdida de segundos de señal (LOSS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "Rendimiento mínimo sin errores (MINEFTR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "Chipset del módem" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "Firmware del módem" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "Margen de ruido (SNRM)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +#, fuzzy +msgid "Noise Protection" +msgstr "Protección contra el ruido" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "Reconfiguración en línea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "Errores CRC no preventivos de PTM (CRC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "Errores CRC preventivos de PTM (CRCP-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "Tonos piloto" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "Modo de administración de energía" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "Modo de adaptación de tasa" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "Retransmisión (G.INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "Contadores de retransmisión" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +#, fuzzy +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "DTU retransmitidas (rtx-tx)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +#, fuzzy +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "Segundos con bajo rendimiento sin errores (LEFTRS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "Segundos con muchos errores (SES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "Atenuación de señal (SATN)" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "Espectro" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "Estadísticas" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "Subportadora" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "Segundos no disponibles (UAS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "DTU no corregidas (rtx-uc)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "HLOG ascendente" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "QLN ascendente" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "SNR ascendente" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "bits" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "dB" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "dBm/Hz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "apagado" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "encendido" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "xDSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "ID de proveedor de xTU-C" diff --git a/package/luci/modules/luci-mod-dsl/po/it/dsl.po b/package/luci/modules/luci-mod-dsl/po/it/dsl.po new file mode 100644 index 0000000000..dec4de8dc8 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/it/dsl.po @@ -0,0 +1,288 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-16 16:56+0000\n" +"Last-Translator: Frankie McEyes \n" +"Language-Team: Italian \n" +"Language: it\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.1\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "Codice di errore nell'intestazione ATM (HEC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "Velocità dei dati effettiva" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "Potenza di trasmissione aggregata (ACTATP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "Annex" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "Velocità dati raggiungibile (ATTNDR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "Bitswap" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "Errori CRC (CV-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "Contatori di canale" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "Stato della connessione" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "DTU corretti (rtx-c)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "Corretto da FEC (FEC-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "Spettro della linea DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "Statistiche DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "Contatori del percorso dati" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "Velocità dati" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "HLOG in ricezione" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "QLN in ricezione" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "SNR in ricezione" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "Allocazione bit in ricezione" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "Contatori di errore" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "Secondi di errore" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "Secondi errati (ES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "Secondi di correzione degli errori inoltrati (FECS)" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "Concedi l'accesso a luci-mod-dsl" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"I grafici sottostanti mostrano il rapporto segnale-rumore, l'allocazione " +"bit, il rumore di fondo e la funzione caratteristiche del canale (HLOG) per " +"sottoportante." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "Protezione dai disturbi da impulsi (INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "Inventario" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "Latenza" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "Attenuazione di linea (LATN)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "Dettagli linea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "Modalità della linea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "Parametri della linea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "Stato della linea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "Tempo di attività della linea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "Secondi di perdita di segnale (LOSS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "Capacità effettiva minima senza errori (MINEFTR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "Chipset del modem" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "Firmware del modem" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "Margine di rumore (SNRM)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "Protezione dal rumore" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "Riconfigurazione in linea" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "Errori CRC non preventivi PTM (CRC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "Errori CRC preventivi PTM (CRCP-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "Toni pilota" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "Modalità di gestione dell'alimentazione" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "Modalità di adattamento della velocità" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "Ritrasmissione (G.INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "Contatori di ritrasmissione" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "DTU ritrasmessi (rtx-tx)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "Secondi con bassa capacità effettiva senza errori (LEFTRS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "Secondi con errori gravi (SES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "Attenuazione del segnale (SATN)" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "Spettro" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "Statistiche" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "Sottoportante" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "Secondi non disponibili (UAS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "DTU non corretti (rtx-uc)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "HLOG in invio" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "QLN in invio" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "SNR in invio" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "bit" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "dB" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "dBm/Hz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "spento" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "on" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "xDSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "Vendor ID xTU-C" diff --git a/package/luci/modules/luci-mod-dsl/po/lt/dsl.po b/package/luci/modules/luci-mod-dsl/po/lt/dsl.po new file mode 100644 index 0000000000..6e7bd13a80 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/lt/dsl.po @@ -0,0 +1,289 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2023-10-18 05:43+0000\n" +"Last-Translator: Džiugas J \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " +"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " +"1 : 2);\n" +"X-Generator: Weblate 5.1\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "Aneksija" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "Linijos režimas" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "Linijos būsena" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "Linijos aktyvumo laikas" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "išjungta" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "" diff --git a/package/luci/modules/luci-mod-dsl/po/nb_NO/dsl.po b/package/luci/modules/luci-mod-dsl/po/nb_NO/dsl.po new file mode 100644 index 0000000000..7f2c690380 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/nb_NO/dsl.po @@ -0,0 +1,294 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-11-07 09:03+0000\n" +"Last-Translator: Allan Nordhøy \n" +"Language-Team: Norwegian Bokmål \n" +"Language: nb_NO\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14.2\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "DSL-linje-spektrum" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +#, fuzzy +msgid "Downstream HLOG" +msgstr "Nedstrøms-HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +#, fuzzy +msgid "Downstream QLN" +msgstr "Nedstrøms-QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +#, fuzzy +msgid "Downstream SNR" +msgstr "Nedstrøms-SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +#, fuzzy +msgid "Downstream bits allocation" +msgstr "Nedstrøms-bit-tildeldning" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +#, fuzzy +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"Diagrammene nedenfor viser signal-til-støy-forhold, bit-tildeldning, ledig-" +"linje-støy, og kanalkarakteristikkfunksjoner (HLOG) per underoperatør." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +#, fuzzy +msgid "Sub-carrier" +msgstr "Underoperatør" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "Oppstrøms-HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "Oppstrøms-QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "Oppstrøms-SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +#, fuzzy +msgid "bits" +msgstr "bit" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "dB" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "dBm/Hz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "" diff --git a/package/luci/modules/luci-mod-dsl/po/pl/dsl.po b/package/luci/modules/luci-mod-dsl/po/pl/dsl.po new file mode 100644 index 0000000000..fd62ee5b27 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/pl/dsl.po @@ -0,0 +1,288 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-06-29 14:15+0000\n" +"Last-Translator: Matthaiks \n" +"Language-Team: Polish \n" +"Language: pl\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.18.1\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "Błędy kodu błędu nagłówka ATM (HEC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "Rzeczywista szybkość transmisji danych" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "Agregacja siły transmisji (ACTATP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "Annex" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "Osiągalna szybkość transmisji danych (ATTNDR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "Wymiana bitów" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "Błędy CRC (CV-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "Liczniki kanałów" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "Stan połączenia" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "Skorygowane jednostki DTU (rtx-c)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "Skorygowane przez FEC (FEC-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "Widmo linii DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "Statystyki DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "Liczniki ścieżek danych" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "Szybkości przesyłania danych" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "HLOG przepustowości do abonamenta" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "QLN przepustowości do abonamenta" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "SNR przepustowości do abonamenta" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "Alokacja bitów przepustowości do abonamenta" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "Liczniki błędów" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "Sekundy błędów" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "Błędne sekundy (ES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "Sekundy przekazywania korekty błędów (FECS)" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "Przyznaj dostęp do luci-mod-dsl" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"Wykresy poniżej pokazują stosunek sygnału do szumu, przydział bitów, szum " +"cichej linii i funkcję charakterystyki kanału (HLOG) dla każdej podnośnej." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "Ochrona przed hałasem impulsowym (INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "Spis" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "Opoźnienie" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "Tłumienie linii (LATN)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "Szczegóły linii" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "Tryb linii" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "Parametry linii" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "Stan linii" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "Czas działania linii" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "Utrata sygnału w sekundach (LOSS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "Minimalna bezbłędna przepustowość (MINEFTR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "Chipset modemu" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "Oprogramowanie układowe modemu" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "Margines szumów (SNRM)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "Ochrona przed hałasem" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "Rekonfiguracja on-line" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "Błędy CRC bez wywłaszczania PTM (CRC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "Błędy CRC z wywłaszczaniem PTM (CRCP-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "Tony przewodnika" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "Tryb zarządzania energią" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "Tryb adaptacji prędkości" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "Retransmisja (G.INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "Liczniki retransmisji" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "Retransmitowane jednostki DTU (rtx-tx)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "Sekundy z niską bezbłędną przepustowością (LEFTRS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "Poważnie błędne sekundy (SES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "Tłumienie sygnału (SATN)" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "Widmo" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "Statystyki" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "Podnośna" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "Niedostępne sekundy (UAS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "Nieskorygowane jednostki DTU (rtx-uc)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "HLOG przepustowości od abonamenta" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "QLN przepustowości od abonamenta" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "SNR przepustowości od abonamenta" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "bity" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "dB" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "dBm/Hz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "wyłączone" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "włączone" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "xDSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "Identyfikator dostawcy xTU-C" diff --git a/package/luci/modules/luci-mod-dsl/po/pt/dsl.po b/package/luci/modules/luci-mod-dsl/po/pt/dsl.po new file mode 100644 index 0000000000..dd8f193910 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/pt/dsl.po @@ -0,0 +1,288 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-07-01 19:50+0000\n" +"Last-Translator: ssantos \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.0-dev\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "Erros do código de erro do cabeçalho ATM (HEC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "Taxa de dados atual" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "Potência de transmissão agregada (ACTATP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "Anexo" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "Taxa atingível de dados (ATTNDR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "Troca de bits" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "Erros de CRC (CV-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "Contadores de canais" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "Estado da conexão" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "DTUs corrigidas (rtx-c)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "Corrigido pela FEC (FEC-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "Espectro de linha DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "Estatísticas da DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "Contadores do caminho de dados" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "Taxas de dados" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "HLOG a jusante" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "QLN a jusante" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "SNR a jusante" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "Alocação de bits a jusante" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "Contadores de erros" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "Erros por segundo" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "Segundos com erros (ES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "Segundos de correção de erro antecipada (FECS)" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "Conceder acesso ao luci-mod-dsl" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"Gráficos abaixo mostram relação sinal-ruído, alocação de bits, ruído de " +"linha silenciosa e função de características do canal (HLOG) por sub-" +"portadora." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "Proteção contra ruído de impulso (INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "Inventário" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "Latência" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "Atenuação de Linha (LATN)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "Detalhes da linha" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "Modo da linha" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "Parâmetros da linha" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "Estado da linha" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "Tempo de atividade da linha" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "Segundos de perda de sinal (LOSS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "Taxa de transferência mínima sem erros (MINEFTR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "Chipset do modem" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "Firmware do modem" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "Margem de ruído (SNRM)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "Proteção contra ruído" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "Reconfiguração on-line" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "Erros CRC não preventivos do PTM (CRC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "Erros CRC preventivo PTM (CRCP-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "Tons piloto" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "Modo de gestão de energia" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "Modo de adaptação da taxa" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "Retransmissão (G.INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "Contadores de retransmissão" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "DTUs retransmitidos (rtx-tx)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "Segundos com baixa taxa de transferência livre de erros (LEFTRS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "Segundos com erros severos (SES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "Atenuação do sinal (SATN)" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "Espectro" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "Condição geral" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "Subportadora" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "Segundos de indisponibilidade (UAS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "DTUs não corrigidos (rtx-uc)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "HLOG a montante" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "QLN a montante" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "SNR a montante" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "bits" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "dB" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "dBm/Hz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "desligado" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "ligado" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "xDSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "ID do fornecedor xTU-C" diff --git a/package/luci/modules/luci-mod-dsl/po/pt_BR/dsl.po b/package/luci/modules/luci-mod-dsl/po/pt_BR/dsl.po new file mode 100644 index 0000000000..7a94c19570 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/pt_BR/dsl.po @@ -0,0 +1,288 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-06-29 14:15+0000\n" +"Last-Translator: Wellington Terumi Uemura \n" +"Language-Team: Portuguese (Brazil) \n" +"Language: pt_BR\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.18.1\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "Erros do código de erro do cabeçalho ATM (HEC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "Taxa de dados atual" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "Potência de transmissão agregada (ACTATP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "Anexo" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "Taxa de dados atingível (ATTNDR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "Troca de bits" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "Erros CRC (CV-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "Contadores de canal" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "Estado da conexão" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "DTUs corrigidas (rtx-c)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "Corrigido pela FEC (FEC-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "Espectro da linha DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "Estatísticas DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "Contadores do caminho de dados" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "Taxas de dados" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "HLOG do downstream" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "Downstream QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "Downstream SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "Alocação de bits do downstream" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "Contadores de erros" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "Erros por segundo" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "Segundos com erro (ES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "Segundos a frente da correção de erros (FECS)" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "Conceda acesso ao luci-mod-dsl" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"Os gráficos abaixo mostram a relação sinal-ruído, alocação dos bits, ruído " +"da linha silenciosa e a função das características de canal (HLOG) por " +"subportadora." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "Proteção contra ruído de impulso (INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "Inventário" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "Latência" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "Atenuação da linha (LATN)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "Detalhes da linha" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "Modo da linha" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "Parâmetros da linha" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "Estado da linha" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "Tempo de atividade da linha" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "Perda de sinal em segundos (LOSS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "Taxa de transferência mínima livre de erros (MINEFTR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "Chipset do modem" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "Firmware do modem" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "Margem de ruído (SNRM)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "Proteção contra ruído" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "Reconfiguração on-line" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "Erros CRC não preventivos do PTM (CRC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "Erros CRC preventivo PTM (CRCP-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "Tons piloto" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "Modo de gerenciamento de energia" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "Modo de adaptação da taxa" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "Retransmissão (G.INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "Contadores de retransmissão" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "DTUs retransmitidos (rtx-tx)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "Segundos com baixa taxa de transferência livre de erros (LEFTRS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "Segundos com erros severos (SES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "Atenuação do sinal (SATN)" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "Espectro" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "Condição geral" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "Subportadora" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "Segundos de indisponibilidade (UAS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "DTUs não corrigidos (rtx-uc)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "Upstream HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "Upstream QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "Upstream SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "bits" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "dB" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "dBm/Hz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "desligado" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "ligado" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "xDSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "ID do fornecedor xTU-C" diff --git a/package/luci/modules/luci-mod-dsl/po/ro/dsl.po b/package/luci/modules/luci-mod-dsl/po/ro/dsl.po new file mode 100644 index 0000000000..5a5c5b9280 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/ro/dsl.po @@ -0,0 +1,289 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-06-29 20:41+0000\n" +"Last-Translator: Simona Iacob \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2;\n" +"X-Generator: Weblate 4.18.1\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "Erori de cod de eroare de antet ATM (HEC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "Current Data Rate" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "Puterea de transmisie agregată (ACTATP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "Anexă" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "Rata de date realizabilă (ATTNDR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "Bitswap" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "Erori CRC (CV-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "Contoare de canal" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "Starea conexiunii" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "DTU corectate (rtx-c)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "Corectate de FEC (FEC-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "Spectrul liniei DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "Statistici DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "Contoare de traseu de date" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "Ratele de date" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "HLOG în aval" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "QLN în aval" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "SNR în aval" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "Alocarea de biți în aval" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "Contoare de erori" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "Secunde de eroare" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "Secunde de eroare (ES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "Secunde de corecție a erorilor înainte (FECS)" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "Acordă acces la luci-mod-dsl" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"Graficele de mai jos arată Raportul semnal-zgomot, Alocarea de biți, " +"Zgomotul de linie liniștită și Funcția caracteristică a canalului (HLOG) " +"pentru fiecare subpurtătoare." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "Protecția împotriva zgomotului la impulsuri (INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "Inventar" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "Latență" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "Atenuarea liniei (LATN)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "Detalii despre linie" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "Modul linie" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "Parametrii de linie" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "Starea liniei" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "Timp de funcționare a liniei" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "Secunde de pierdere a semnalului (LOSS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "Randament minim fără erori (MINEFTR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "Chipset de modem" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "Firmware pentru modem" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "Marja de zgomot (SNRM)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "Protecția împotriva zgomotului" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "Reconfigurare on-line" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "PTM Erori CRC non-preemptive (CRC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "PTM Erori CRC preemptive (CRCP-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "Tonuri pilot" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "Modul de gestionare a energiei" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "Modul de adaptare a ratei" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "Retransmisie (G.INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "Contoare de retransmisie" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "DTU retransmise (rtx-tx)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "Secunde cu randament scăzut fără erori (LEFTRS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "Secunde cu erori grave (SES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "Atenuarea semnalului (SATN)" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "Spectru" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "Statistici" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "Subpurtătoare" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "Secunde indisponibile (UAS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "DTU necorectate (rtx-uc)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "HLOG în amonte" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "QLN în amonte" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "SNR în amonte" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "biți" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "dB" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "dBm/Hz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "oprit" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "deschis" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "xDSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "Vendor ID xTU-C" diff --git a/package/luci/modules/luci-mod-dsl/po/ru/dsl.po b/package/luci/modules/luci-mod-dsl/po/ru/dsl.po new file mode 100644 index 0000000000..1c0e29d3b9 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/ru/dsl.po @@ -0,0 +1,288 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-06-29 14:15+0000\n" +"Last-Translator: sergio \n" +"Language-Team: Russian \n" +"Language: ru\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.18.1\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "Ошибки кода заголовка ATM (HEC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "Фактическая скорость передачи данных" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "Агрегация мощности передачи (ACTATP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "Annex" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "Достижимая скорость передачи данных (ATTNDR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "Bitswap" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "Ошибки CRC (CV-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "Счетчики канала" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "Состояние соединения" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "Исправленные DTU (rtx-c)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "Исправлено FEC (FEC-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "Спектр линии DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "Статистика DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "Счетчики пути передачи данных" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "Скорость передачи данных" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "Нисходящий HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "Нисходящий QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "Нисходящий SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "Назначение входящих битов" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "Счетчики ошибок" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "Продолжительность ошибок в секундах" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "Продолжительность ошибок в секундах (ES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "Потрачено на помехоустойчивое кодирование в секундах (FECS)" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "Предоставить доступ к luci-mod-dsl" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"Графики ниже показывают соотношение сигнал/шум, распределение битов, шум " +"тихой линии и функцию характеристик канала (HLOG) для каждой поднесущей." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "Защита от импульсных помех (INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "Инвентарь" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "Задержка" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "Затухание линии (LATN)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "Детали линии" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "Режим линии" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "Параметры линии" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "Состояние линии" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "Время подключения к линии" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "Потеря сигнала в секундах (LOSS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "Минимальная пропускная способность без ошибок (MINEFTR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "Микросхема модема" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "Версия прошивки модема" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "Запас шума (SNRM)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "Защита от шума" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "Применение настроек без разрыва соединения" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "Неупреждающие ошибки CRC PTM (CRC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "Упреждающие ошибки CRC PTM (CRCP-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "Пилот-сигнал" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "Режим управления питанием" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "Режим адаптации скорости" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "Повторная передача (G.INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "Счетчики повторной передачи" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "Переотправленные DTU (rtx-tx)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "Низкая пропускная способность без ошибок в секундах (LEFTRS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "Длительность серьезных ошибок в секундах (SES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "Затухание сигнала (SATN)" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "Спектр" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "Статистика" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "Поднесущая" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "Время недоступности в секундах (UAS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "Неисправленные DTU (rtx-uc)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "Входящий HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "Восходящий QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "Восходящий SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "бит" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "дБ" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "дБм/Гц" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "выкл" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "вкл" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "xDSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "Идентификатор поставщика xTU-C" diff --git a/package/luci/modules/luci-mod-dsl/po/sv/dsl.po b/package/luci/modules/luci-mod-dsl/po/sv/dsl.po new file mode 100644 index 0000000000..702f970756 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/sv/dsl.po @@ -0,0 +1,288 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-02 17:46+0000\n" +"Last-Translator: Kristoffer Grundström \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.1-dev\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "Faktisk datahastighet" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "CRC-fel (CV-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "Kanal-räknare" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "Korrigerade DTU:er (rtx-c)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "Korrigerad av FEC (FEC-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "Spektrum för DSL-lina" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "Status för DSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "Datahastigheter" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "Nedströms-HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "Nedströms-QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "Nedströms-SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "Bit-tilldelning nedströms" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "Felräknare" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "Sekundfel" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "Godkänn åtkomst för luci-mod-dsl" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +#, fuzzy +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"Diagrammerna nedan visar signal-till-brusförhållande, Bit-tilldelning, Tyst " +"linjebrus och kanalens karaktäristiska funktion (HLOG) per under-leverantör." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "Latens" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "Underoperatör" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "Uppströms-HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "Uppströms QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "Uppströms SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "bitar" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "dB" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "dBm/Hz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "" diff --git a/package/luci/modules/luci-mod-dsl/po/templates/dsl.pot b/package/luci/modules/luci-mod-dsl/po/templates/dsl.pot new file mode 100644 index 0000000000..924a0ff756 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/templates/dsl.pot @@ -0,0 +1,276 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "" diff --git a/package/luci/modules/luci-mod-dsl/po/tr/dsl.po b/package/luci/modules/luci-mod-dsl/po/tr/dsl.po new file mode 100644 index 0000000000..cf670ad0f1 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/tr/dsl.po @@ -0,0 +1,287 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-29 19:41+0000\n" +"Last-Translator: semih \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.2-dev\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "ATM Başlığı Hata Kodu Hataları (HEC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "Gerçek Veri Hızı" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "Toplam İletim Gücü (ACTATP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "Annex" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "Ulaşılabilir Veri Hızı (ATTNDR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "Bit değişimi" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "CRC Hataları (CV-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "Kanal Sayacı" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "Bağlantı Durumu" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "Düzeltilmiş DTU'lar (rtx-c)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "FEC (FEC-C) tarafından düzeltildi" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "DSL hat spektrumu" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "DSL istatistikleri" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "Veri Yolu Sayaçları" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "Veri Hızları" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "Aşağı akış HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "Aşağı yön QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "Aşağı akış SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "Aşağı akış bit tahsisi" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "Hata Sayacı" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "Hata Saniyeleri" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "Hata meydana gelmiş olan saniyeler (ES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "İleri Yön Hata Düzeltme Saniyesi (FECS)" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "luci-mod-dsl'ye erişim izni ver" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"Aşağıdaki grafiklerde alt taşıyıcı başına Sinyal-gürültü oranı, Bit tahsisi, " +"Sessiz hat gürültüsü ve Kanal özellikleri işlevi (HLOG) gösterilmektedir." + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "Darbe Gürültü Koruması (INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "Envanter" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "Gecikme" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "Hat Zayıflaması (LATN)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "Hat Detayları" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "Hat Modu" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "Hat Parametreleri" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "Hat Durumu" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "Hattın Çalışma Süresi" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "Sinyal Kaybı süresi, saniye (KAYIP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "Minimum Hatasız Akış (MINEFTR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "Modem Yonga Seti" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "Modem Aygıt Yazılımı" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "Gürültü Marjı (SNRM)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "Gürültü Koruması" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "Çevrim Yeniden Yapılandırma" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "PTM Önleyici Olmayan CRC Hataları (CRC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "PTM Önleyici CRC Hataları (CRCP-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "Pilot tonları" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "Güç Yönetimi Modu" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "Hız Uyarlama Modu" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "Yeniden İletim (G.INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "Yeniden İletim Sayacı" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "Yeniden iletilen DTU'lar (rtx-tx)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "Düşük Hatasız Akış Sağlanan süre, saniye(LEFTRS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "Ciddi Hatalı Saniyeler (SES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "Sinyal Zayıflaması (SATN)" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "Spektrum" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "İstatistikler" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "Alt taşıyıcı" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "Kullanılamaz durumda geçen saniyeler (UAS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "Düzeltilmemiş DTU'lar (rtx-uc)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "Yukarı akış HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "Yukarı akış QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "Yukarı akış SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "bitler" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "dB" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "dBm/Hz" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "kapalı" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "açık" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "xDSL" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "xTU-C Tedarikçi Kimliği" diff --git a/package/luci/modules/luci-mod-dsl/po/uk/dsl.po b/package/luci/modules/luci-mod-dsl/po/uk/dsl.po new file mode 100644 index 0000000000..45f27f640b --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/uk/dsl.po @@ -0,0 +1,286 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-10-19 13:30+0000\n" +"Last-Translator: Oleksandr Shvets \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 5.1\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "Код помилки (HEC-P) ATM заголовка" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "" diff --git a/package/luci/modules/luci-mod-dsl/po/zh_Hant/dsl.po b/package/luci/modules/luci-mod-dsl/po/zh_Hant/dsl.po new file mode 100644 index 0000000000..0e9e22bcc3 --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/po/zh_Hant/dsl.po @@ -0,0 +1,286 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-02-16 13:38+0000\n" +"Last-Translator: 王攀 <41330784@qq.com>\n" +"Language-Team: Chinese (Traditional) \n" +"Language: zh_Hant\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.16-dev\n" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:157 +msgid "ATM Header Error Code Errors (HEC-P)" +msgstr "ATM 接頭錯誤代碼錯誤 (HEC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:111 +msgid "Actual Data Rate" +msgstr "實際數據速率" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:134 +msgid "Aggregate Transmit Power (ACTATP)" +msgstr "總發射功率(ACTATP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:95 +msgid "Annex" +msgstr "附件" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:112 +msgid "Attainable Data Rate (ATTNDR)" +msgstr "可實現的資料速率 (ATTNDR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:118 +msgid "Bitswap" +msgstr "位交換" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:151 +msgid "CRC Errors (CV-C)" +msgstr "CRC 錯誤 (CV-C)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:149 +msgid "Channel Counters" +msgstr "通道計數器" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:89 +msgid "Connection State" +msgstr "連接狀態" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:165 +msgid "Corrected DTUs (rtx-c)" +msgstr "更正的 DTU (rtx-c)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:152 +msgid "Corrected by FEC (FEC-C)" +msgstr "由 FEC (FEC-C) 更正" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24 +msgid "DSL line spectrum" +msgstr "DSL線譜" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:174 +msgid "DSL stats" +msgstr "DSL統計數據" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:155 +msgid "Data Path Counters" +msgstr "數據路徑計數器" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:109 +msgid "Data Rates" +msgstr "數據速率" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:219 +msgid "Downstream HLOG" +msgstr "下游 HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:189 +msgid "Downstream QLN" +msgstr "下游QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:159 +msgid "Downstream SNR" +msgstr "下游SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:123 +msgid "Downstream bits allocation" +msgstr "下游位分配" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:137 +msgid "Error Counters" +msgstr "錯誤計數器" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:139 +msgid "Error Seconds" +msgstr "錯誤秒數" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:142 +msgid "Errored Seconds (ES)" +msgstr "錯誤秒數 (ES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:141 +msgid "Forward Error Correction Seconds (FECS)" +msgstr "前向糾錯秒數 (FECS)" + +#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3 +msgid "Grant access to luci-mod-dsl" +msgstr "授予對 luci-mod-dsl 的訪問許可權" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25 +msgid "" +"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise " +"and Channel characteristics function (HLOG) per sub-carrier." +msgstr "" +"下圖顯示了每個子載波的信噪比、位分配、安靜線路雜訊和通道特性函數 (HLOG)。" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:125 +msgid "Impulse Noise Protection (INP)" +msgstr "脈衝雜訊保護(INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:99 +msgid "Inventory" +msgstr "庫存" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:124 +msgid "Latency" +msgstr "延遲" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:131 +msgid "Line Attenuation (LATN)" +msgstr "線路衰減 (LATN)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:107 +msgid "Line Details" +msgstr "線路詳情" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:93 +msgid "Line Mode" +msgstr "線路模式" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:129 +msgid "Line Parameters" +msgstr "線路參數" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:92 +msgid "Line State" +msgstr "線路狀態" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:94 +msgid "Line Uptime" +msgstr "線路正常運行時間" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:144 +msgid "Loss of Signal Seconds (LOSS)" +msgstr "信號秒數損失(損失)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:113 +msgid "Minimum Error-Free Throughput (MINEFTR)" +msgstr "最小無差錯輸送量 (MINEFTR)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:102 +msgid "Modem Chipset" +msgstr "數據機晶片組" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:103 +msgid "Modem Firmware" +msgstr "數據機韌體" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:133 +msgid "Noise Margin (SNRM)" +msgstr "雜訊容限 (信噪比)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:122 +msgid "Noise Protection" +msgstr "噪音防護" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:116 +msgid "On-line Reconfiguration" +msgstr "在線重新配置" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:158 +msgid "PTM Non Pre-emptive CRC Errors (CRC-P)" +msgstr "PTM 非先發制人的 CRC 錯誤 (CRC-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:159 +msgid "PTM Pre-emptive CRC Errors (CRCP-P)" +msgstr "PTM 搶佔式 CRC 錯誤 (CRCP-P)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:129 +msgid "Pilot tones" +msgstr "引導音" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:96 +msgid "Power Management Mode" +msgstr "電源管理模式" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:119 +msgid "Rate Adaptation Mode" +msgstr "速率適應模式" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:126 +msgid "Retransmission (G.INP)" +msgstr "轉播 (G.INP)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:162 +msgid "Retransmission Counters" +msgstr "重傳計數器" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:164 +msgid "Retransmitted DTUs (rtx-tx)" +msgstr "重新傳輸的 DTU (rtx-tx)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:146 +msgid "Seconds with Low Error-Free Throughput (LEFTRS)" +msgstr "秒,無差錯輸送量 (LEFTRS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:143 +msgid "Severely Errored Seconds (SES)" +msgstr "嚴重錯誤秒 (SES)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:132 +msgid "Signal Attenuation (SATN)" +msgstr "信號衰減(SATN)" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:23 +msgid "Spectrum" +msgstr "光譜" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:14 +msgid "Stats" +msgstr "統計" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:107 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:143 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:173 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:203 +msgid "Sub-carrier" +msgstr "子載波" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:145 +msgid "Unavailable Seconds (UAS)" +msgstr "無法用秒數 (UAS)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:166 +msgid "Uncorrected DTUs (rtx-uc)" +msgstr "未更正的 DTU (rtx-uc)" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:214 +msgid "Upstream HLOG" +msgstr "上游 HLOG" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:184 +msgid "Upstream QLN" +msgstr "上游QLN" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:154 +msgid "Upstream SNR" +msgstr "上游SNR" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:112 +msgid "bits" +msgstr "位" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:148 +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:208 +msgid "dB" +msgstr "分貝" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:178 +msgid "dBm/Hz" +msgstr "分貝/赫茲" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "off" +msgstr "關閉" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:14 +msgid "on" +msgstr "開" + +#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3 +msgid "xDSL" +msgstr "" + +#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/stats.js:104 +msgid "xTU-C Vendor ID" +msgstr "xTU-C 供應商編號" diff --git a/package/luci/modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json b/package/luci/modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json new file mode 100644 index 0000000000..498157f92d --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json @@ -0,0 +1,30 @@ +{ + "admin/status/dsl": { + "title": "xDSL", + "order": 7, + "action": { + "type": "firstchild" + }, + "depends": { + "acl": [ "luci-mod-dsl" ] + } + }, + + "admin/status/dsl/stats": { + "title": "Stats", + "order": 1, + "action": { + "type": "view", + "path": "status/dsl/stats" + } + }, + + "admin/status/dsl/spectrum": { + "title": "Spectrum", + "order": 2, + "action": { + "type": "view", + "path": "status/dsl/spectrum" + } + } +} diff --git a/package/luci/modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json b/package/luci/modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json new file mode 100644 index 0000000000..ee69882f4e --- /dev/null +++ b/package/luci/modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json @@ -0,0 +1,10 @@ +{ + "luci-mod-dsl": { + "description": "Grant access to luci-mod-dsl", + "read": { + "ubus": { + "dsl": [ "metrics", "statistics" ] + } + } + } +} diff --git a/package/luci/modules/luci-mod-network/Makefile b/package/luci/modules/luci-mod-network/Makefile index bf5627d64d..af6256419e 100644 --- a/package/luci/modules/luci-mod-network/Makefile +++ b/package/luci/modules/luci-mod-network/Makefile @@ -7,11 +7,11 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Network Administration -LUCI_DEPENDS:=+luci-base +libiwinfo-lua +rpcd-mod-iwinfo +LUCI_DEPENDS:=+luci-base +rpcd-mod-iwinfo PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js index 11d2162d11..092bbbc14a 100644 --- a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js +++ b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js @@ -1,4 +1,5 @@ 'use strict'; +'require fs'; 'require ui'; 'require dom'; 'require uci'; @@ -149,25 +150,77 @@ function updatePlaceholders(opt, section_id) { } } +var cbiFlagTristate = form.ListValue.extend({ + __init__: function(/* ... */) { + this.super('__init__', arguments); + this.keylist = [ '', '0!', '1!' ]; + this.vallist = [ _('automatic'), _('disabled'), _('enabled') ]; + }, + + load: function(section_id) { + var invert = false, sysfs = this.sysfs; + + if (sysfs) { + if (sysfs.charAt(0) == '!') { + invert = true; + sysfs = sysfs.substring(1); + } + + return L.resolveDefault(fs.read(sysfs), '').then(L.bind(function(res) { + res = (res || '').trim(); + + if (res == '0') + this.sysfs_default = invert; + else if (res == '1') + this.sysfs_default = !invert; + + return this.super('load', [section_id]); + }, this)); + } + + return this.super('load', [section_id]); + }, + + write: function(section_id, formvalue) { + if (formvalue == '1!') + return this.super('write', [section_id, '1']); + else if (formvalue == '0!') + return this.super('write', [section_id, '0']); + else + return this.super('remove', [section_id]); + }, + + renderWidget: function(section_id, option_index, cfgvalue) { + var sysdef = this.sysfs_default; + + if (this.sysfs_default !== null) { + this.keylist[0] = sysdef ? '1' : '0'; + this.vallist[0] = sysdef ? _('automatic (enabled)') : _('automatic (disabled)'); + } + + return this.super('renderWidget', [section_id, option_index, cfgvalue]); + } +}); + var cbiTagValue = form.Value.extend({ renderWidget: function(section_id, option_index, cfgvalue) { var widget = new ui.Dropdown(cfgvalue || ['-'], { '-': E([], [ E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ '—' ]), - E('span', { 'class': 'hide-close' }, [ _('Do not participate', 'VLAN port state') ]) + E('span', { 'class': 'hide-close' }, [ _('Not Member', 'VLAN port state') ]) ]), 'u': E([], [ - E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 'u' ]), - E('span', { 'class': 'hide-close' }, [ _('Egress untagged', 'VLAN port state') ]) + E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 'U' ]), + E('span', { 'class': 'hide-close' }, [ _('Untagged', 'VLAN port state') ]) ]), 't': E([], [ - E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 't' ]), - E('span', { 'class': 'hide-close' }, [ _('Egress tagged', 'VLAN port state') ]) + E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 'T' ]), + E('span', { 'class': 'hide-close' }, [ _('Tagged', 'VLAN port state') ]) ]), '*': E([], [ E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ '*' ]), - E('span', { 'class': 'hide-close' }, [ _('Primary VLAN ID', 'VLAN port state') ]) + E('span', { 'class': 'hide-close' }, [ _('Is Primary VLAN', 'VLAN port state') ]) ]) }, { id: this.cbid(section_id), @@ -331,6 +384,7 @@ return baseclass.extend({ addDeviceOptions: function(s, dev, isNew) { var parent_dev = dev ? dev.getParent() : null, + devname = dev ? dev.getName() : null, o, ss; s.tab('devgeneral', _('General device options')); @@ -421,7 +475,7 @@ return baseclass.extend({ vid = this.section.formvalue(section_id, 'vid'), name = this.section.getUIElement(section_id, 'name_complex'); - if (base && vid && name && !name.isChanged()) { + if (base && vid && name && !name.isChanged() && isNew) { name.setValue('%s.%d'.format(base, vid)); name.triggerValidation(); } @@ -619,8 +673,8 @@ return baseclass.extend({ o.placeholder = dev ? dev._devstate('qlen') : ''; o.datatype = 'uinteger'; - o = this.replaceOption(s, 'devadvanced', form.Flag, 'promisc', _('Enable promiscuous mode')); - o.default = o.disabled; + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'promisc', _('Enable promiscuous mode')); + o.sysfs_default = (dev && dev.dev && dev.dev.flags) ? dev.dev.flags.promisc : null; o = this.replaceOption(s, 'devadvanced', form.ListValue, 'rpfilter', _('Reverse path filter')); o.default = ''; @@ -644,11 +698,17 @@ return baseclass.extend({ } }; - o = this.replaceOption(s, 'devadvanced', form.Flag, 'acceptlocal', _('Accept local'), _('Accept packets with local source addresses')); - o.default = o.disabled; + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'acceptlocal', _('Accept local'), _('Accept packets with local source addresses')); + o.sysfs = '/proc/sys/net/ipv4/conf/%s/accept_local'.format(devname || 'default'); - o = this.replaceOption(s, 'devadvanced', form.Flag, 'sendredirects', _('Send ICMP redirects')); - o.default = o.enabled; + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'sendredirects', _('Send ICMP redirects')); + o.sysfs = '/proc/sys/net/ipv4/conf/%s/send_redirects'.format(devname || 'default'); + + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'arp_accept ', _('Honor gratuitous ARP'), _('When enabled, new ARP table entries are added from received gratuitous APR requests or replies, otherwise only preexisting table entries are updated, but no new hosts are learned.')); + o.sysfs = '/proc/sys/net/ipv4/conf/%s/arp_accept'.format(devname || 'default'); + + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'drop_gratuitous_arp', _('Drop gratuitous ARP'), _('Drop all gratuitous ARP frames, for example if there’s a known good ARP proxy on the network and such frames need not be used or in the case of 802.11, must not be used to prevent attacks.')); + o.sysfs = '/proc/sys/net/ipv4/conf/%s/drop_gratuitous_arp'.format(devname || 'default'); o = this.replaceOption(s, 'devadvanced', form.Value, 'neighreachabletime', _('Neighbour cache validity'), _('Time in milliseconds')); o.placeholder = '30000'; @@ -662,59 +722,75 @@ return baseclass.extend({ o.placeholder = '0'; o.datatype = 'uinteger'; - o = this.replaceOption(s, 'devgeneral', form.Flag, 'ipv6', _('Enable IPv6')); + o = this.replaceOption(s, 'devgeneral', cbiFlagTristate, 'ipv6', _('Enable IPv6')); + o.sysfs = '!/proc/sys/net/ipv6/conf/%s/disable_ipv6'.format(devname || 'default'); o.migrate = false; - o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'ip6segmentrouting', _('Enable IPv6 segment routing')); + o.sysfs = '/proc/sys/net/ipv6/conf/%s/seg6_enabled'.format(devname || 'default'); + o.depends('ipv6', /1/); + + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'drop_unsolicited_na', _('Drop unsolicited NA'), _('Drop all unsolicited neighbor advertisements, for example if there’s a known good NA proxy on the network and such frames need not be used or in the case of 802.11, must not be used to prevent attacks.')); + o.sysfs = '/proc/sys/net/ipv6/conf/%s/drop_unsolicited_na'.format(devname || 'default'); + o.depends('ipv6', /1/); o = this.replaceOption(s, 'devgeneral', form.Value, 'mtu6', _('IPv6 MTU')); o.datatype = 'max(9200)'; - o.depends('ipv6', '1'); + o.depends('ipv6', /1/); o = this.replaceOption(s, 'devgeneral', form.Value, 'dadtransmits', _('DAD transmits'), _('Amount of Duplicate Address Detection probes to send')); o.placeholder = '1'; o.datatype = 'uinteger'; - o.depends('ipv6', '1'); + o.depends('ipv6', /1/); - o = this.replaceOption(s, 'devadvanced', form.Flag, 'multicast', _('Enable multicast support')); - o.default = o.enabled; + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'multicast', _('Enable multicast support')); + o.sysfs_default = (dev && dev.dev && dev.dev.flags) ? dev.dev.flags.multicast : null; o = this.replaceOption(s, 'devadvanced', form.ListValue, 'igmpversion', _('Force IGMP version')); o.value('', _('No enforcement')); o.value('1', _('Enforce IGMPv1')); o.value('2', _('Enforce IGMPv2')); o.value('3', _('Enforce IGMPv3')); - o.depends('multicast', '1'); + o.depends('multicast', /1/); o = this.replaceOption(s, 'devadvanced', form.ListValue, 'mldversion', _('Force MLD version')); o.value('', _('No enforcement')); o.value('1', _('Enforce MLD version 1')); o.value('2', _('Enforce MLD version 2')); - o.depends('multicast', '1'); + o.depends('multicast', /1/); if (isBridgePort(dev)) { - o = this.replaceOption(s, 'brport', form.Flag, 'learning', _('Enable MAC address learning')); - o.default = o.enabled; + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'learning', _('Enable MAC address learning')); + o.sysfs = '/sys/class/net/%s/brport/learning'.format(devname || 'default'); - o = this.replaceOption(s, 'brport', form.Flag, 'unicast_flood', _('Enable unicast flooding')); - o.default = o.enabled; + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'unicast_flood', _('Enable unicast flooding')); + o.sysfs = '/sys/class/net/%s/brport/unicast_flood'.format(devname || 'default'); - o = this.replaceOption(s, 'brport', form.Flag, 'isolate', _('Port isolation'), _('Only allow communication with non-isolated bridge ports when enabled')); - o.default = o.disabled; + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'isolate', _('Port isolation'), _('Only allow communication with non-isolated bridge ports when enabled')); + o.sysfs = '/sys/class/net/%s/brport/isolated'.format(devname || 'default'); o = this.replaceOption(s, 'brport', form.ListValue, 'multicast_router', _('Multicast routing')); o.value('', _('Never')); o.value('1', _('Learn')); o.value('2', _('Always')); - o.depends('multicast', '1'); + o.depends('multicast', /1/); + + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'multicast_to_unicast', _('Multicast to unicast'), _('Forward multicast packets as unicast packets on this device.')); + o.sysfs = '/sys/class/net/%s/brport/multicast_to_unicast'.format(devname || 'default'); + o.depends('multicast', /1/); - o = this.replaceOption(s, 'brport', form.Flag, 'multicast_to_unicast', _('Multicast to unicast'), _('Forward multicast packets as unicast packets on this device.')); - o.default = o.disabled; - o.depends('multicast', '1'); + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'multicast_fast_leave', _('Enable multicast fast leave')); + o.sysfs = '/sys/class/net/%s/brport/multicast_fast_leave'.format(devname || 'default'); + o.depends('multicast', /1/); - o = this.replaceOption(s, 'brport', form.Flag, 'multicast_fast_leave', _('Enable multicast fast leave')); - o.default = o.disabled; - o.depends('multicast', '1'); + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'drop_v4_unicast_in_l2_multicast', _('Drop nested IPv4 unicast'), _('Drop layer 2 multicast frames containing IPv4 unicast packets.')); + o.sysfs = '/proc/sys/net/ipv4/conf/%s/drop_unicast_in_l2_multicast'.format(devname || 'default'); + o.depends('multicast', /1/); + + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'drop_v6_unicast_in_l2_multicast', _('Drop nested IPv6 unicast'), _('Drop layer 2 multicast frames containing IPv6 unicast packets.')); + o.sysfs = '/proc/sys/net/ipv6/conf/%s/drop_unicast_in_l2_multicast'.format(devname || 'default'); + o.depends('multicast', /1/); } o = this.replaceOption(s, 'bridgevlan', form.Flag, 'vlan_filtering', _('Enable VLAN filtering')); @@ -780,6 +856,8 @@ return baseclass.extend({ return network.instantiateDevice(port) }).filter(function(dev) { return dev.getType() != 'wifi' || dev.isUp(); + }).sort(function(a, b) { + return L.naturalCompare(a.getName(), b.getName()); }); this.children = this.children.filter(function(opt) { return !opt.option.match(/^port_/) }); @@ -893,18 +971,6 @@ return baseclass.extend({ for (var port_name in seen_ports) ports.push(port_name); - ports.sort(function(a, b) { - var m1 = a.match(/^(.+?)([0-9]*)$/), - m2 = b.match(/^(.+?)([0-9]*)$/); - - if (m1[1] < m2[1]) - return -1; - else if (m1[1] > m2[1]) - return 1; - else - return +(m1[2] || 0) - +(m2[2] || 0); - }); - ss.updatePorts(ports); }, diff --git a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js index 5059b389b4..04b57a277d 100644 --- a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js +++ b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js @@ -126,7 +126,7 @@ function validateHostname(sid, s) { if (s.length > 256) return _('Expecting: %s').format(_('valid hostname')); - var labels = s.replace(/^\.+|\.$/g, '').split(/\./); + var labels = s.replace(/^\*?\.?|\.$/g, '').split(/\./); for (var i = 0; i < labels.length; i++) if (!labels[i].match(/^[a-z0-9_](?:[a-z0-9-]{0,61}[a-z0-9])?$/i)) @@ -156,13 +156,15 @@ function validateServerSpec(sid, s) { if (s == null || s == '') return true; - var m = s.match(/^(?:\/(.+)\/)?(.*)$/); + var m = s.match(/^(\/.*\/)?(.*)$/); if (!m) return _('Expecting: %s').format(_('valid hostname')); - var res = validateAddressList(sid, m[1]); - if (res !== true) - return res; + if (m[1] != '//' && m[1] != '/#/') { + var res = validateAddressList(sid, m[1]); + if (res !== true) + return res; + } if (m[2] == '' || m[2] == '#') return true; @@ -231,7 +233,8 @@ return view.extend({ return Promise.all([ callHostHints(), callDUIDHints(), - getDHCPPools() + getDHCPPools(), + network.getNetworks() ]); }, @@ -240,6 +243,7 @@ return view.extend({ hosts = hosts_duids_pools[0], duids = hosts_duids_pools[1], pools = hosts_duids_pools[2], + networks = hosts_duids_pools[3], m, s, o, ss, so; m = new form.Map('dhcp', _('DHCP and DNS'), @@ -250,12 +254,16 @@ return view.extend({ s.addremove = false; s.tab('general', _('General Settings')); - s.tab('files', _('Resolv and Hosts Files')); - s.tab('pxe_tftp', _('PXE/TFTP Settings')); s.tab('advanced', _('Advanced Settings')); s.tab('leases', _('Static Leases')); + s.tab('files', _('Resolv and Hosts Files')); s.tab('hosts', _('Hostnames')); s.tab('ipsets', _('IP Sets')); + s.tab('relay', _('Relay')); + s.tab('srvhosts', _('SRV')); + s.tab('mxhosts', _('MX')); + s.tab('cnamehosts', _('CNAME')); + s.tab('pxe_tftp', _('PXE/TFTP Settings')); s.taboption('general', form.Flag, 'domainneeded', _('Domain required'), @@ -287,13 +295,16 @@ return view.extend({ o = s.taboption('general', form.DynamicList, 'address', _('Addresses'), - _('List of domains to force to an IP address.')); + _('Resolve specified FQDNs to an IP.') + '
    ' + + _('Syntax: /fqdn[/fqdn…]/[ipaddr].') + '
    ' + + _('/#/ matches any domain. /example.com/ returns NXDOMAIN.') + '
    ' + + _('/example.com/# returns NULL addresses (0.0.0.0 and ::) for example.com and its subdomains.')); o.optional = true; - o.placeholder = '/router.local/192.168.0.1'; + o.placeholder = '/router.local/router.lan/192.168.0.1'; o = s.taboption('general', form.DynamicList, 'ipset', _('IP sets'), - _('List of IP sets to populate with the specified domain IPs.')); + _('List of IP sets to populate with the IPs of DNS lookup results of the FQDNs also specified here.')); o.optional = true; o.placeholder = '/example.org/ipset,ipset6'; @@ -340,6 +351,70 @@ return view.extend({ o.optional = true; o.placeholder = 'loopback'; + o = s.taboption('relay', form.SectionValue, '__relays__', form.TableSection, 'relay', null, + _('Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4.') + + '
    ' + _('Note: you may also need a DHCP Proxy (currently unavailable) when specifying a non-standard Relay To port(addr#port).') + + '
    ' + _('You may add multiple unique Relay To on the same Listen addr.')); + + ss = o.subsection; + + ss.addremove = true; + ss.anonymous = true; + ss.sortable = true; + ss.rowcolors = true; + ss.nodescriptions = true; + + so = ss.option(form.Value, 'local_addr', _('Relay from')); + so.rmempty = false; + so.datatype = 'ipaddr'; + + for (var family = 4; family <= 6; family += 2) { + for (var i = 0; i < networks.length; i++) { + if (networks[i].getName() != 'loopback') { + var addrs = (family == 6) ? networks[i].getIP6Addrs() : networks[i].getIPAddrs(); + for (var j = 0; j < addrs.length; j++) { + var addr = addrs[j].split('/')[0]; + so.value(addr, E([], [ + addr, ' (', + widgets.NetworkSelect.prototype.renderIfaceBadge(networks[i]), + ')' + ])); + } + } + } + } + + so = ss.option(form.Value, 'server_addr', _('Relay to address')); + so.rmempty = false; + so.optional = false; + so.placeholder = '192.168.10.1#535'; + + so.validate = function(section, value) { + var m = this.section.formvalue(section, 'local_addr'), + n = this.section.formvalue(section, 'server_addr'), + p; + if (n != null && n != '') + p = n.split('#'); + if (p.length > 1 && !/^[0-9]+$/.test(p[1])) + return _('Expected port number.'); + else + n = p[0]; + + if ((m == null || m == '') && (n == null || n == '')) + return _('Both "Relay from" and "Relay to address" must be specified.'); + + if ((validation.parseIPv6(m) && validation.parseIPv6(n)) || + validation.parseIPv4(m) && validation.parseIPv4(n)) + return true; + else + return _('Address families of "Relay from" and "Relay to address" must match.') + }; + + so = ss.option(widgets.NetworkSelect, 'interface', _('Only accept replies via')); + so.optional = true; + so.rmempty = false; + so.placeholder = 'lan'; + s.taboption('files', form.Flag, 'readethers', _('Use /etc/ethers'), _('Read /etc/ethers to configure the DHCP server.')); @@ -384,8 +459,20 @@ return view.extend({ o.default = o.enabled; s.taboption('advanced', form.Flag, 'filterwin2k', - _('Filter useless'), - _('Do not forward queries that cannot be answered by public resolvers.')); + _('Filter SRV/SOA service discovery'), + _('Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links.') + '
    ' + + _('May prevent VoIP or other services from working.')); + + o = s.taboption('advanced', form.Flag, 'filter_aaaa', + _('Filter IPv6 AAAA records'), + _('Remove IPv6 addresses from the results and only return IPv4 addresses.') + '
    ' + + _('Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing.')); + o.optional = true; + + o = s.taboption('advanced', form.Flag, 'filter_a', + _('Filter IPv4 A records'), + _('Remove IPv4 addresses from the results and only return IPv6 addresses.')); + o.optional = true; s.taboption('advanced', form.Flag, 'localise_queries', _('Localise queries'), @@ -473,7 +560,7 @@ return view.extend({ _('Number of cached DNS entries, 10000 is maximum, 0 is no caching.')); o.optional = true; o.datatype = 'range(0,10000)'; - o.placeholder = 150; + o.placeholder = 1000; o = s.taboption('pxe_tftp', form.Flag, 'enable_tftp', _('Enable TFTP server'), @@ -546,6 +633,93 @@ return view.extend({ so.value(index, '%s (Domain: %s, Local: %s)'.format(index, val.domain || '?', val.local || '?')); }); + o = s.taboption('srvhosts', form.SectionValue, '__srvhosts__', form.TableSection, 'srvhost', null, + _('Bind service records to a domain name: specify the location of services. See RFC2782.').format('https://datatracker.ietf.org/doc/html/rfc2782') + + '
    ' + _('_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is possible, no browsers support SRV records.)') + + '
    ' + _('_proto: _tcp, _udp, _sctp, _quic, … .') + + '
    ' + _('You may add multiple records for the same Target.') + + '
    ' + _('Larger weights (of the same prio) are given a proportionately higher probability of being selected.')); + + ss = o.subsection; + + ss.addremove = true; + ss.anonymous = true; + ss.sortable = true; + ss.rowcolors = true; + + so = ss.option(form.Value, 'srv', _('SRV'), _('Syntax: _service._proto.example.com.')); + so.rmempty = false; + so.datatype = 'hostname'; + so.placeholder = '_sip._tcp.example.com'; + + so = ss.option(form.Value, 'target', _('Target'), _('CNAME or fqdn')); + so.rmempty = false; + so.datatype = 'hostname'; + so.placeholder = 'sip.example.com'; + + so = ss.option(form.Value, 'port', _('Port')); + so.rmempty = false; + so.datatype = 'port'; + so.placeholder = '5060'; + + so = ss.option(form.Value, 'class', _('Priority'), _('Ordinal: lower comes first.')); + so.rmempty = true; + so.datatype = 'range(0,65535)'; + so.placeholder = '10'; + + so = ss.option(form.Value, 'weight', _('Weight')); + so.rmempty = true; + so.datatype = 'range(0,65535)'; + so.placeholder = '50'; + + o = s.taboption('mxhosts', form.SectionValue, '__mxhosts__', form.TableSection, 'mxhost', null, + _('Bind service records to a domain name: specify the location of services.') + + '
    ' + _('You may add multiple records for the same domain.')); + + ss = o.subsection; + + ss.addremove = true; + ss.anonymous = true; + ss.sortable = true; + ss.rowcolors = true; + ss.nodescriptions = true; + + so = ss.option(form.Value, 'domain', _('Domain')); + so.rmempty = false; + so.datatype = 'hostname'; + so.placeholder = 'example.com'; + + so = ss.option(form.Value, 'relay', _('Relay')); + so.rmempty = false; + so.datatype = 'hostname'; + so.placeholder = 'relay.example.com'; + + so = ss.option(form.Value, 'pref', _('Priority'), _('Ordinal: lower comes first.')); + so.rmempty = true; + so.datatype = 'range(0,65535)'; + so.placeholder = '0'; + + o = s.taboption('cnamehosts', form.SectionValue, '__cname__', form.TableSection, 'cname', null, + _('Set an alias for a hostname.')); + + ss = o.subsection; + + ss.addremove = true; + ss.anonymous = true; + ss.sortable = true; + ss.rowcolors = true; + ss.nodescriptions = true; + + so = ss.option(form.Value, 'cname', _('Domain')); + so.rmempty = false; + so.datatype = 'hostname'; + so.placeholder = 'www.example.com'; + + so = ss.option(form.Value, 'target', _('Target')); + so.rmempty = false; + so.datatype = 'hostname'; + so.placeholder = 'example.com'; + o = s.taboption('hosts', form.SectionValue, '__hosts__', form.GridSection, 'domain', null, _('Hostnames are used to bind a domain name to an IP address. This setting is redundant for hostnames already configured with static leases, but it can be useful to rebind an FQDN.')); @@ -577,7 +751,7 @@ return view.extend({ }); o = s.taboption('ipsets', form.SectionValue, '__ipsets__', form.GridSection, 'ipset', null, - _('List of IP sets to populate with the specified domain IPs.')); + _('List of IP sets to populate with the IPs of DNS lookup results of the FQDNs also specified here.')); ss = o.subsection; @@ -594,16 +768,22 @@ return view.extend({ so.datatype = 'hostname'; o = s.taboption('leases', form.SectionValue, '__leases__', form.GridSection, 'host', null, - _('Static leases are used to assign fixed IP addresses and symbolic hostnames to DHCP clients. They are also required for non-dynamic interface configurations where only hosts with a corresponding lease are served.') + '
    ' + - _('Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed address to use, and the Hostname is assigned as a symbolic name to the requesting host. The optional Lease time can be used to set non-standard host-specific lease time, e.g. 12h, 3d or infinite.')); + _('Static leases are used to assign fixed IP addresses and symbolic hostnames to DHCP clients. They are also required for non-dynamic interface configurations where only hosts with a corresponding lease are served.') + '

    ' + + _('Use the Add Button to add a new lease entry. The MAC address identifies the host, the IPv4 address specifies the fixed address to use, and the Hostname is assigned as a symbolic name to the requesting host. The optional Lease time can be used to set non-standard host-specific lease time, e.g. 12h, 3d or infinite.') + '

    ' + + _('The tag construct filters which host directives are used; more than one tag can be provided, in this case the request must match all of them. Tagged directives are used in preference to untagged ones. Note that one of mac, duid or hostname still needs to be specified (can be a wildcard).')); ss = o.subsection; ss.addremove = true; ss.anonymous = true; ss.sortable = true; + ss.nodescriptions = true; + ss.max_cols = 8; + ss.modaltitle = _('Edit static lease'); - so = ss.option(form.Value, 'name', _('Hostname')); + so = ss.option(form.Value, 'name', + _('Hostname'), + _('Optional hostname to assign')); so.validate = validateHostname; so.rmempty = true; so.write = function(section, value) { @@ -615,20 +795,35 @@ return view.extend({ uci.unset('dhcp', section, 'dns'); }; - so = ss.option(form.Value, 'mac', _('MAC address')); - so.datatype = 'list(macaddr)'; + so = ss.option(form.Value, 'mac', + _('MAC address(es)'), + _('The hardware address(es) of this entry/host, separated by spaces.') + '

    ' + + _('In DHCPv4, it is possible to include more than one mac address. This allows an IP address to be associated with multiple macaddrs, and dnsmasq abandons a DHCP lease to one of the macaddrs when another asks for a lease. It only works reliably if only one of the macaddrs is active at any time.')); + //As a special case, in DHCPv4, it is possible to include more than one hardware address. eg: --dhcp-host=11:22:33:44:55:66,12:34:56:78:90:12,192.168.0.2 This allows an IP address to be associated with multiple hardware addresses, and gives dnsmasq permission to abandon a DHCP lease to one of the hardware addresses when another one asks for a lease + so.validate = function(section_id, value) { + var macaddrs = L.toArray(value); + + for (var i = 0; i < macaddrs.length; i++) + if (!macaddrs[i].match(/^([a-fA-F0-9]{2}|\*):([a-fA-F0-9]{2}:|\*:){4}(?:[a-fA-F0-9]{2}|\*)$/)) + return _('Expecting a valid MAC address, optionally including wildcards'); + + return true; + }; so.rmempty = true; so.cfgvalue = function(section) { var macs = L.toArray(uci.get('dhcp', section, 'mac')), result = []; for (var i = 0, mac; (mac = macs[i]) != null; i++) - if (/^([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2})$/.test(mac)) - result.push('%02X:%02X:%02X:%02X:%02X:%02X'.format( + if (/^([0-9a-fA-F]{1,2}|\*):([0-9a-fA-F]{1,2}|\*):([0-9a-fA-F]{1,2}|\*):([0-9a-fA-F]{1,2}|\*):([0-9a-fA-F]{1,2}|\*):([0-9a-fA-F]{1,2}|\*)$/.test(mac)) { + var m = [ parseInt(RegExp.$1, 16), parseInt(RegExp.$2, 16), parseInt(RegExp.$3, 16), parseInt(RegExp.$4, 16), - parseInt(RegExp.$5, 16), parseInt(RegExp.$6, 16))); + parseInt(RegExp.$5, 16), parseInt(RegExp.$6, 16) + ]; + result.push(m.map(function(n) { return isNaN(n) ? '*' : '%02X'.format(n) }).join(':')); + } return result.length ? result.join(' ') : null; }; so.renderWidget = function(section_id, option_index, cfgvalue) { @@ -661,7 +856,8 @@ return view.extend({ so.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac); }); - so = ss.option(form.Value, 'ip', _('IPv4 address')); + so = ss.option(form.Value, 'ip', _('IPv4 address'), _('The IP address to be used for this host, or ignore to ignore any DHCP request from this host.')); + so.value('ignore', _('Ignore')); so.datatype = 'or(ip4addr,"ignore")'; so.validate = function(section, value) { var m = this.section.formvalue(section, 'mac'), @@ -693,16 +889,60 @@ return view.extend({ so.value(ipv4, ipaddrs[ipv4] ? '%s (%s)'.format(ipv4, ipaddrs[ipv4]) : ipv4); }); - so = ss.option(form.Value, 'leasetime', _('Lease time')); + so = ss.option(form.Value, 'leasetime', + _('Lease time'), + _('Host-specific lease time, e.g. 5m, 3h, 7d.')); so.rmempty = true; - - so = ss.option(form.Value, 'duid', _('DUID')); + so.value('5m', _('5m (5 minutes)')); + so.value('3h', _('3h (3 hours)')); + so.value('12h', _('12h (12 hours - default)')); + so.value('7d', _('7d (7 days)')); + so.value('infinite', _('infinite (lease does not expire)')); + + so = ss.option(form.Value, 'duid', + _('DUID'), + _('The DHCPv6-DUID (DHCP unique identifier) of this host.')); so.datatype = 'and(rangelength(20,36),hexstring)'; Object.keys(duids).forEach(function(duid) { so.value(duid, '%s (%s)'.format(duid, duids[duid].hostname || duids[duid].macaddr || duids[duid].ip6addr || '?')); }); - so = ss.option(form.Value, 'hostid', _('IPv6 suffix (hex)')); + so = ss.option(form.Value, 'hostid', + _('IPv6-Suffix (hex)'), + _('The IPv6 interface identifier (address suffix) as hexadecimal number (max. 8 chars).')); + so.datatype = 'and(rangelength(0,8),hexstring)'; + + so = ss.option(form.DynamicList, 'tag', + _('Tag'), + _('Assign new, freeform tags to this entry.')); + + so = ss.option(form.DynamicList, 'match_tag', + _('Match Tag'), + _('When a host matches an entry then the special tag known is set. Use known to match all known hosts.') + '

    ' + + _('Ignore requests from unknown machines using !known.') + '

    ' + + _('If a host matches an entry which cannot be used because it specifies an address on a different subnet, the tag known-othernet is set.')); + so.value('known', _('known')); + so.value('!known', _('!known (not known)')); + so.value('known-othernet', _('known-othernet (on different subnet)')); + so.optional = true; + + so = ss.option(form.Value, 'instance', + _('Instance'), + _('Dnsmasq instance to which this DHCP host section is bound. If unspecified, the section is valid for all dnsmasq instances.')); + so.optional = true; + + Object.values(L.uci.sections('dhcp', 'dnsmasq')).forEach(function(val, index) { + so.value(index, '%s (Domain: %s, Local: %s)'.format(index, val.domain || '?', val.local || '?')); + }); + + + so = ss.option(form.Flag, 'broadcast', + _('Broadcast'), + _('Force broadcast DHCP response.')); + + so = ss.option(form.Flag, 'dns', + _('Forward/reverse DNS'), + _('Add static forward and reverse DNS entries for this host.')); o = s.taboption('leases', CBILeaseStatus, '__status__'); diff --git a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js index da7cd95bdc..1bfa95501a 100644 --- a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js +++ b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js @@ -14,8 +14,7 @@ return view.extend({ buttons[i].setAttribute('disabled', 'true'); return fs.exec(exec, args).then(function(res) { - var out = document.querySelector('.command-output'); - out.style.display = ''; + var out = document.querySelector('textarea'); dom.content(out, [ res.stdout || '', res.stderr || '' ]); }).catch(function(err) { @@ -75,11 +74,9 @@ return view.extend({ ping_host = uci.get('luci', 'diag', 'ping') || 'openwrt.org', route_host = uci.get('luci', 'diag', 'route') || 'openwrt.org'; - return E([], [ - E('h2', {}, [ _('Network Utilities') ]), - E('table', { 'class': 'table' }, [ + var table = E('table', { 'class': 'table' }, [ E('tr', { 'class': 'tr' }, [ - E('td', { 'class': 'td left' }, [ + E('td', { 'class': 'td left', 'style': 'overflow:initial' }, [ E('input', { 'style': 'margin:5px 0', 'type': 'text', @@ -102,7 +99,7 @@ return view.extend({ ]) ]), - E('td', { 'class': 'td left' }, [ + E('td', { 'class': 'td left', 'style': 'overflow:initial' }, [ E('input', { 'style': 'margin:5px 0', 'type': 'text', @@ -156,9 +153,26 @@ return view.extend({ ]) ]) : E([]), ]) - ]), - E('pre', { 'class': 'command-output', 'style': 'display:none' }) + ]); + + var view = E('div', { 'class': 'cbi-map'}, [ + E('h2', {}, [ _('Diagnostics') ]), + E('div', { 'class': 'cbi-map-descr'}, _('Execution of various network commands to check the connection and name resolution to other systems.')), + table, + E('div', {'class': 'cbi-section'}, [ + E('div', { 'id' : 'command-output'}, + E('textarea', { + 'id': 'widget.command-output', + 'style': 'width: 100%; font-family:monospace; white-space:pre', + 'readonly': true, + 'wrap': 'off', + 'rows': '20' + }) + ) + ]) ]); + + return view; }, handleSaveApply: null, diff --git a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js index 5b99ae17cd..68acda59c2 100644 --- a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js +++ b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js @@ -228,6 +228,23 @@ function get_netmask(s, use_cfgvalue) { return subnetmask; } +function has_peerdns(proto) { + switch (proto) { + case 'dhcp': + case 'dhcpv6': + case 'qmi': + case 'ppp': + case 'pppoe': + case 'pppoa': + case 'pptp': + case 'openvpn': + case 'sstp': + return true; + } + + return false; +} + var cbiRichListValue = form.ListValue.extend({ renderWidget: function(section_id, option_index, cfgvalue) { var choices = this.transformChoices(); @@ -488,7 +505,7 @@ return view.extend({ }; s.modaltitle = function(section_id) { - return _('Interfaces') + ' » ' + section_id.toUpperCase(); + return _('Interfaces') + ' » ' + section_id; }; s.renderRowActions = function(section_id) { @@ -535,7 +552,7 @@ return view.extend({ var protocols = network.getProtocols(); protocols.sort(function(a, b) { - return a.getProtocol() > b.getProtocol(); + return L.naturalCompare(a.getProtocol(), b.getProtocol()); }); o = s.taboption('general', form.DummyValue, '_ifacestat_modal', _('Status')); @@ -723,12 +740,35 @@ return view.extend({ var hybrid_downstream_desc = _('Operate in relay mode if a designated master interface is configured and active, otherwise fall back to server mode.'), ndp_downstream_desc = _('Operate in relay mode if a designated master interface is configured and active, otherwise disable NDP proxying.'), hybrid_master_desc = _('Operate in relay mode if an upstream IPv6 prefix is present, otherwise disable service.'), + ra_server_allowed = true, checked = this.formvalue(section_id), dhcpv6 = this.section.getOption('dhcpv6').getUIElement(section_id), ndp = this.section.getOption('ndp').getUIElement(section_id), ra = this.section.getOption('ra').getUIElement(section_id); - if (checked == '1' || protoval != 'static') { + /* Assume that serving RAs by default is fine, but disallow it for certain + interface protocols such as DHCP, DHCPv6 or the various PPP flavors. + The intent is to only allow RA serving for interface protocols doing + some kind of static IP config over something resembling a layer 2 + ethernet device. */ + switch (protoval) { + case 'dhcp': + case 'dhcpv6': + case '3g': + case 'l2tp': + case 'ppp': + case 'pppoa': + case 'pppoe': + case 'pptp': + case 'pppossh': + case 'ipip': + case 'gre': + case 'grev6': + ra_server_allowed = false; + break; + } + + if (checked == '1' || !ra_server_allowed) { dhcpv6.node.querySelector('li[data-value="server"]').setAttribute('unselectable', ''); if (dhcpv6.getValue() == 'server') @@ -746,7 +786,7 @@ return view.extend({ ndp.node.querySelector('li[data-value="hybrid"] > div > span').innerHTML = hybrid_master_desc; } else { - if (protoval == 'static') { + if (ra_server_allowed) { dhcpv6.node.querySelector('li[data-value="server"]').removeAttribute('unselectable'); ra.node.querySelector('li[data-value="server"]').removeAttribute('unselectable'); } @@ -815,6 +855,13 @@ return view.extend({ } }; + so = ss.taboption('ipv6-ra', form.Value, 'ra_pref64', _('NAT64 prefix'), _('Announce NAT64 prefix in RA messages.')); + so.optional = true; + so.datatype = 'cidr6'; + so.placeholder = '64:ff9b::/96'; + so.depends('ra', 'server'); + so.depends({ ra: 'hybrid', master: '0' }); + so = ss.taboption('ipv6-ra', form.Value, 'ra_maxinterval', _('Max RA interval'), _('Maximum time allowed between sending unsolicited RA. Default is 600 seconds.')); so.optional = true; so.datatype = 'uinteger'; @@ -920,7 +967,7 @@ return view.extend({ so.value('hybrid', _('hybrid mode'), ' '); - so = ss.taboption('ipv6', form.Flag, 'ndproxy_routing', _('Learn routes'), _('Setup routes for proxied IPv6 neighbours.')); + so = ss.taboption('ipv6', form.Flag, 'ndproxy_routing', _('Learn routes'), _('Set up routes for proxied IPv6 neighbours.')); so.default = so.enabled; so.depends('ndp', 'relay'); so.depends('ndp', 'hybrid'); @@ -928,6 +975,18 @@ return view.extend({ so = ss.taboption('ipv6', form.Flag, 'ndproxy_slave', _('NDP-Proxy slave'), _('Set interface as NDP-Proxy external slave. Default is off.')); so.depends({ ndp: 'relay', master: '0' }); so.depends({ ndp: 'hybrid', master: '0' }); + + so = ss.taboption('ipv6', form.Value, 'preferred_lifetime', _('IPv6 Prefix Lifetime'), _('Preferred lifetime for a prefix.')); + so.optional = true; + so.placeholder = '12h'; + so.value('5m', _('5m (5 minutes)')); + so.value('3h', _('3h (3 hours)')); + so.value('12h', _('12h (12 hours - default)')); + so.value('7d', _('7d (7 days)')); + + //This is a ra_* setting, but its placement is more logical/findable under IPv6 settings. + so = ss.taboption('ipv6', form.Flag, 'ra_useleasetime', _('Follow IPv4 Lifetime'), _('DHCPv4 leasetime is used as limit and preferred lifetime of the IPv6 prefix.')); + so.optional = true; } ifc.renderFormOptions(s); @@ -936,13 +995,13 @@ return view.extend({ o = nettools.replaceOption(s, 'advanced', form.Flag, 'defaultroute', _('Use default gateway'), _('If unchecked, no default route is configured')); o.default = o.enabled; - if (protoval != 'static') { + if (has_peerdns(protoval)) { o = nettools.replaceOption(s, 'advanced', form.Flag, 'peerdns', _('Use DNS servers advertised by peer'), _('If unchecked, the advertised DNS server addresses are ignored')); o.default = o.enabled; } o = nettools.replaceOption(s, 'advanced', form.DynamicList, 'dns', _('Use custom DNS servers')); - if (protoval != 'static') + if (has_peerdns(protoval)) o.depends('peerdns', '0'); o.datatype = 'ipaddr'; @@ -1091,7 +1150,7 @@ return view.extend({ proto, name, device; protocols.sort(function(a, b) { - return a.getProtocol() > b.getProtocol(); + return L.naturalCompare(a.getProtocol(), b.getProtocol()); }); s2.render = function() { @@ -1199,7 +1258,7 @@ return view.extend({ 'class': 'ifacebox-head', 'style': firewall.getZoneColorStyle(zone), 'title': zone ? _('Part of zone %q').format(zone.getName()) : _('No zone assigned') - }, E('strong', net.getName().toUpperCase())), + }, E('strong', net.getName())), E('div', { 'class': 'ifacebox-body', 'id': '%s-ifc-devices'.format(section_id), @@ -1253,7 +1312,7 @@ return view.extend({ s.cfgsections = function() { var sections = uci.sections('network', 'device'), - section_ids = sections.sort(function(a, b) { return a.name > b.name }).map(function(s) { return s['.name'] }); + section_ids = sections.sort(function(a, b) { return L.naturalCompare(a.name, b.name) }).map(function(s) { return s['.name'] }); for (var i = 0; i < netDevs.length; i++) { if (sections.filter(function(s) { return s.name == netDevs[i].getName() }).length) @@ -1331,6 +1390,9 @@ return view.extend({ for (var i = 0; i < map.addedVLANs.length; i++) uci.remove('network', map.addedVLANs[i]); + if (this.addedSection) + uci.remove('network', this.addedSection); + return form.GridSection.prototype.handleModalCancel.apply(this, arguments); }; @@ -1450,7 +1512,7 @@ return view.extend({ mac = dev ? dev.getMAC() : null; return val ? E('strong', { - 'data-tooltip': _('The value is overridden by configuration. Original: %s').format(mac || _('unknown')) + 'data-tooltip': _('The value is overridden by configuration.') }, [ val.toUpperCase() ]) : (mac || '-'); }; @@ -1462,7 +1524,7 @@ return view.extend({ mtu = dev ? dev.getMTU() : null; return val ? E('strong', { - 'data-tooltip': _('The value is overridden by configuration. Original: %s').format(mtu || _('unknown')) + 'data-tooltip': _('The value is overridden by configuration.') }, [ val ]) : (mtu || '-').toString(); }; @@ -1482,21 +1544,27 @@ return view.extend({ s.anonymous = true; o = s.option(form.ListValue, 'annex', _('Annex')); - o.value('a', _('Annex A + L + M (all)')); - o.value('b', _('Annex B (all)')); - o.value('j', _('Annex J (all)')); - o.value('m', _('Annex M (all)')); - o.value('bdmt', _('Annex B G.992.1')); - o.value('b2', _('Annex B G.992.3')); - o.value('b2p', _('Annex B G.992.5')); + if (dslModemType == 'vdsl') { + o.value('a', _('ADSL (all variants) Annex A/L/M + VDSL2 Annex A/B/C')); + o.value('b', _('ADSL (all variants) Annex B + VDSL2 Annex A/B/C')); + o.value('j', _('ADSL (all variants) Annex B/J + VDSL2 Annex A/B/C')); + } else { + o.value('a', _('ADSL (all variants) Annex A/L/M')); + o.value('b', _('ADSL (all variants) Annex B')); + o.value('j', _('ADSL (all variants) Annex B/J')); + } + o.value('m', _('ADSL (all variants) Annex M')); o.value('at1', _('ANSI T1.413')); - o.value('admt', _('Annex A G.992.1')); - o.value('alite', _('Annex A G.992.2')); - o.value('a2', _('Annex A G.992.3')); - o.value('a2p', _('Annex A G.992.5')); - o.value('l', _('Annex L G.992.3 POTS 1')); - o.value('m2', _('Annex M G.992.3')); - o.value('m2p', _('Annex M G.992.5')); + o.value('admt', _('ADSL (G.992.1) Annex A')); + o.value('bdmt', _('ADSL (G.992.1) Annex B')); + o.value('alite', _('Splitterless ADSL (G.992.2) Annex A')); + o.value('a2', _('ADSL2 (G.992.3) Annex A')); + o.value('b2', _('ADSL2 (G.992.3) Annex B')); + o.value('l', _('ADSL2 (G.992.3) Annex L')); + o.value('m2', _('ADSL2 (G.992.3) Annex M')); + o.value('a2p', _('ADSL2+ (G.992.5) Annex A')); + o.value('b2p', _('ADSL2+ (G.992.5) Annex B')); + o.value('m2p', _('ADSL2+ (G.992.5) Annex M')); o = s.option(form.ListValue, 'tone', _('Tone')); o.value('', _('auto')); diff --git a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js index da1330aec8..6a08428457 100644 --- a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js +++ b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js @@ -41,6 +41,7 @@ return view.extend({ o = s.taboption('general', widgets.NetworkSelect, 'interface', _('Interface'), _('Specifies the logical interface name of the parent (or master) interface this route belongs to')); o.loopback = true; o.nocreate = true; + o.rmempty = false; o = s.taboption('general', form.ListValue, 'type', _('Route type'), _('Specifies the route type to be created')); o.modalonly = true; @@ -52,6 +53,7 @@ return view.extend({ o.value('prohibit'); o.value('blackhole'); o.value('anycast'); + o.value('throw'); o = s.taboption('general', form.Value, 'target', _('Target'), _('Network address')); o.rmempty = false; diff --git a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js index 3f5468c1bd..f722045689 100644 --- a/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js +++ b/package/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js @@ -314,24 +314,16 @@ var CBIWifiFrequencyValue = form.Value.extend({ this.channels = { '2g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [], '5g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [], - '6g': [], + '6g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [], '60g': [] }; for (var i = 0; i < data[1].length; i++) { - var band; - - if (data[1][i].mhz >= 2412 && data[1][i].mhz <= 2484) - band = '2g'; - else if (data[1][i].mhz >= 5160 && data[1][i].mhz <= 5885) - band = '5g'; - else if (data[1][i].mhz >= 5925 && data[1][i].mhz <= 7125) - band = '6g'; - else if (data[1][i].mhz >= 58320 && data[1][i].mhz <= 69120) - band = '60g'; - else + if (!data[1][i].band) continue; + var band = '%dg'.format(data[1][i].band); + this.channels[band].push( data[1][i].channel, '%d (%d Mhz)'.format(data[1][i].channel, data[1][i].mhz), @@ -343,10 +335,10 @@ var CBIWifiFrequencyValue = form.Value.extend({ .reduce(function(o, v) { o[v] = true; return o }, {}); this.modes = [ - '', 'Legacy', true, + '', 'Legacy', hwmodelist.a || hwmodelist.b || hwmodelist.g, 'n', 'N', hwmodelist.n, - 'ac', 'AC', hwmodelist.ac, - 'ax', 'AX', hwmodelist.ax + 'ac', 'AC', L.hasSystemFeature('hostapd', '11ac') && hwmodelist.ac, + 'ax', 'AX', L.hasSystemFeature('hostapd', '11ax') && hwmodelist.ax ]; var htmodelist = L.toArray(data[0] ? data[0].getHTModes() : null) @@ -387,7 +379,8 @@ var CBIWifiFrequencyValue = form.Value.extend({ ], 'ax': [ '2g', '2.4 GHz', this.channels['2g'].length > 3, - '5g', '5 GHz', this.channels['5g'].length > 3 + '5g', '5 GHz', this.channels['5g'].length > 3, + '6g', '6 GHz', this.channels['6g'].length > 3 ] }; }, this)); @@ -987,6 +980,7 @@ return view.extend({ ss.tab('encryption', _('Wireless Security')); ss.tab('macfilter', _('MAC-Filter')); ss.tab('advanced', _('Advanced Settings')); + ss.tab('roaming', _('WLAN roaming'), _('Settings for assisting wireless clients in roaming between multiple APs: 802.11r, 802.11k and 802.11v')); o = ss.taboption('general', form.ListValue, 'mode', _('Mode')); o.value('ap', _('Access Point')); @@ -1074,41 +1068,6 @@ return view.extend({ bssid = ss.children[5], encr; - /* 802.11v settings start */ - // Probe 802.11v support (needs full hostapd/wpad) via EAP support (full hostapd has EAP) - if (L.hasSystemFeature('hostapd', 'eap')) - { - o = ss.taboption('advanced', form.ListValue, 'time_advertisement', _('Time advertisement'), _('802.11v: Time Advertisement in management frames.')); - o.value('0', _('Disabled')); - o.value('2', _('Enabled')); - o.write = function (section_id, value) { - return this.super('write', [section_id, (value == 2) ? value: null]); - } - - //Pull current System TZ setting - var tz = uci.get('system', '@system[0]', 'timezone'); - o = ss.taboption('advanced', form.Value, 'time_zone', _('Time zone'), _('802.11v: Local Time Zone Advertisement in management frames.')); - o.value(tz); - o.rmempty = true; - - o = ss.taboption('advanced', form.Flag, 'wnm_sleep_mode', _('WNM Sleep Mode'), _('802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode for stations).')); - o.rmempty = true; - - /* wnm_sleep_mode_no_keys: https://git.openwrt.org/?p=openwrt/openwrt.git;a=commitdiff;h=bf98faaac8ed24cf7d3d93dd4fcd7304d109363b */ - o = ss.taboption('advanced', form.Flag, 'wnm_sleep_mode_no_keys', _('WNM Sleep Mode Fixes'), _('802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents reinstallation attacks.')); - o.rmempty = true; - - o = ss.taboption('advanced', form.Flag, 'bss_transition', _('BSS Transition'), _('802.11v: Basic Service Set (BSS) transition management.')); - o.rmempty = true; - - /* in master, but not 21.02.1: proxy_arp */ - o = ss.taboption('advanced', form.Flag, 'proxy_arp', _('ProxyARP'), _('802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer.')); - o.rmempty = true; - - /* TODO: na_mcast_to_ucast is missing: needs adding to hostapd.sh - nice to have */ - } - /* 802.11v settings end */ - mode.value('mesh', '802.11s'); mode.value('ahdemo', _('Pseudo Ad-Hoc (ahdemo)')); mode.value('monitor', _('Monitor')); @@ -1183,42 +1142,26 @@ return view.extend({ o.default = o.enabled; /* https://w1.fi/cgit/hostap/commit/?id=34f7c699a6bcb5c45f82ceb6743354ad79296078 */ - /* multicast_to_unicast https://github.com/openwrt/openwrt/commit/7babb978ad9d7fc29acb1ff86afb1eb343af303a */ - o = ss.taboption('advanced', form.Flag, 'multicast_to_unicast', _('Multi To Unicast'), _('ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast to the STA MAC address. Note: This is not Directed Multicast Service (DMS) in 802.11v. Note: might break receiver STA multicast expectations.')); + /* multicast_to_unicast https://github.com/librecmc/librecmc/commit/7babb978ad9d7fc29acb1ff86afb1eb343af303a */ + o = ss.taboption('advanced', form.Flag, 'multicast_to_unicast_all', _('Multi To Unicast'), _('ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast to the STA MAC address. Note: This is not Directed Multicast Service (DMS) in 802.11v. Note: might break receiver STA multicast expectations.')); o.rmempty = true; - /* 802.11k settings start */ - // Probe 802.11k support via EAP support (full hostapd has EAP) - if (L.hasSystemFeature('hostapd', 'eap')) { - o = ss.taboption('advanced', form.Flag, 'ieee80211k', _('802.11k RRM'), _('Radio Resource Measurement - Sends beacons to assist roaming. Not all clients support this.')); - // add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['psk', 'psk2', 'psk-mixed', 'sae', 'sae-mixed'] }); - o.depends('mode', 'ap'); - o.depends('mode', 'ap-wds'); - - o = ss.taboption('advanced', form.Flag, 'rrm_neighbor_report', _('Neighbour Report'), _('802.11k: Enable neighbor report via radio measurements.')); - o.depends({ ieee80211k: '1' }); - o.default = o.enabled; - - o = ss.taboption('advanced', form.Flag, 'rrm_beacon_report', _('Beacon Report'), _('802.11k: Enable beacon report via radio measurements.')); - o.depends({ ieee80211k: '1' }); - o.default = o.enabled; - } - /* 802.11k settings end */ - o = ss.taboption('advanced', form.Flag, 'isolate', _('Isolate Clients'), _('Prevents client-to-client communication')); o.depends('mode', 'ap'); o.depends('mode', 'ap-wds'); o = ss.taboption('advanced', form.Value, 'ifname', _('Interface name'), _('Override default interface name')); o.optional = true; + o.datatype = 'netdevname'; o.placeholder = radioNet.getIfname(); if (/^radio\d+\.network/.test(o.placeholder)) o.placeholder = ''; + var macaddr = uci.get('wireless', radioNet.getName(), 'macaddr'); o = ss.taboption('advanced', form.Value, 'macaddr', _('MAC address'), _('Override default MAC address - the range of usable addresses might be limited by the driver')); - o.optional = true; - o.placeholder = radioNet.getActiveBSSID(); - o.datatype = 'macaddr'; + o.value('', _('driver default (%s)').format(!macaddr ? radioNet.getActiveBSSID() : _('no override'))); + o.value('random', _('randomly generated')); + o.datatype = "or('random',macaddr)"; o = ss.taboption('advanced', form.Flag, 'short_preamble', _('Short Preamble')); o.default = o.enabled; @@ -1490,6 +1433,38 @@ return view.extend({ o.rmempty = true; o.password = true; + /* extra RADIUS settings start */ + o = ss.taboption('encryption', form.ListValue, 'dynamic_vlan', _('RADIUS Dynamic VLAN Assignment'), _('Required: Rejects auth if RADIUS server does not provide appropriate VLAN attributes.')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); + o.value('0', _('Disabled')); + o.value('1', _('Optional')); + o.value('2', _('Required')); + o.write = function (section_id, value) { + return this.super('write', [section_id, (value == 0) ? null: value]); + } + + o = ss.taboption('encryption', form.Flag, 'per_sta_vif', _('RADIUS Per STA VLAN'), _('Each STA is assigned its own AP_VLAN interface.')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); + + //hostapd internally defaults to vlan_naming=1 even with dynamic VLAN off + o = ss.taboption('encryption', form.Flag, 'vlan_naming', _('RADIUS VLAN Naming'), _('Off: vlanXXX, e.g., vlan1. On: vlan_tagged_interface.XXX, e.g. eth0.1.')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); + + o = ss.taboption('encryption', widgets.DeviceSelect, 'vlan_tagged_interface', _('RADIUS VLAN Tagged Interface'), _('E.g. eth0, eth1')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); + o.size = 1; + o.rmempty = true; + o.multiple = false; + o.noaliases = true; + o.nobridges = true; + o.nocreate = true; + o.noinactive = true; + + o = ss.taboption('encryption', form.Value, 'vlan_bridge', _('RADIUS VLAN Bridge Naming Scheme'), _('E.g. br-vlan or brvlan.')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); + o.rmempty = true; + /* extra RADIUS settings end */ + o = ss.taboption('encryption', form.Value, 'dae_client', _('DAE-Client'), _('Dynamic Authorization Extension client.')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; @@ -1506,6 +1481,10 @@ return view.extend({ o.rmempty = true; o.password = true; + //WPA(1) has only WPA IE. Only >= WPA2 has RSN IE Preauth frames. + o = ss.taboption('encryption', form.Flag, 'rsn_preauth', _('RSN Preauth'), _('Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks (and advertise it in WLAN beacons). Only works if the specified network interface is a bridge. Shortens the time-critical reassociation process.')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa2', 'wpa3', 'wpa3-mixed'] }); + o = ss.taboption('encryption', form.Value, '_wpa_key', _('Key')); o.depends('encryption', 'psk'); @@ -1569,66 +1548,117 @@ return view.extend({ // Probe 802.11r support (and EAP support as a proxy for Openwrt) var has_80211r = L.hasSystemFeature('hostapd', '11r') || L.hasSystemFeature('hostapd', 'eap'); - o = ss.taboption('encryption', form.Flag, 'ieee80211r', _('802.11r Fast Transition'), _('Enables fast roaming among access points that belong to the same Mobility Domain')); + o = ss.taboption('roaming', form.Flag, 'ieee80211r', _('802.11r Fast Transition'), _('Enables fast roaming among access points that belong to the same Mobility Domain')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); if (has_80211r) add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['psk', 'psk2', 'psk-mixed', 'sae', 'sae-mixed'] }); o.rmempty = true; - o = ss.taboption('encryption', form.Value, 'nasid', _('NAS ID'), _('Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not needed with normal WPA(2)-PSK.')); + o = ss.taboption('roaming', form.Value, 'nasid', _('NAS ID'), _('Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not needed with normal WPA(2)-PSK.')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.depends({ ieee80211r: '1' }); o.rmempty = true; - o = ss.taboption('encryption', form.Value, 'mobility_domain', _('Mobility Domain'), _('4-character hexadecimal ID')); + o = ss.taboption('roaming', form.Value, 'mobility_domain', _('Mobility Domain'), _('4-character hexadecimal ID')); o.depends({ ieee80211r: '1' }); o.placeholder = '4f57'; o.datatype = 'and(hexstring,length(4))'; o.rmempty = true; - o = ss.taboption('encryption', form.Value, 'reassociation_deadline', _('Reassociation Deadline'), _('time units (TUs / 1.024 ms) [1000-65535]')); + o = ss.taboption('roaming', form.Value, 'reassociation_deadline', _('Reassociation Deadline'), _('time units (TUs / 1.024 ms) [1000-65535]')); o.depends({ ieee80211r: '1' }); o.placeholder = '1000'; o.datatype = 'range(1000,65535)'; o.rmempty = true; - o = ss.taboption('encryption', form.ListValue, 'ft_over_ds', _('FT protocol')); + o = ss.taboption('roaming', form.ListValue, 'ft_over_ds', _('FT protocol')); o.depends({ ieee80211r: '1' }); o.value('0', _('FT over the Air')); o.value('1', _('FT over DS')); o.rmempty = true; - o = ss.taboption('encryption', form.Flag, 'ft_psk_generate_local', _('Generate PMK locally'), _('When using a PSK, the PMK can be automatically generated. When enabled, the R0/R1 key options below are not applied. Disable this to use the R0 and R1 key options.')); + o = ss.taboption('roaming', form.Flag, 'ft_psk_generate_local', _('Generate PMK locally'), _('When using a PSK, the PMK can be automatically generated. When enabled, the R0/R1 key options below are not applied. Disable this to use the R0 and R1 key options.')); o.depends({ ieee80211r: '1' }); o.default = o.enabled; o.rmempty = false; - o = ss.taboption('encryption', form.Value, 'r0_key_lifetime', _('R0 Key Lifetime'), _('minutes')); + o = ss.taboption('roaming', form.Value, 'r0_key_lifetime', _('R0 Key Lifetime'), _('minutes')); o.depends({ ieee80211r: '1' }); o.placeholder = '10000'; o.datatype = 'uinteger'; o.rmempty = true; - o = ss.taboption('encryption', form.Value, 'r1_key_holder', _('R1 Key Holder'), _('6-octet identifier as a hex string - no colons')); + o = ss.taboption('roaming', form.Value, 'r1_key_holder', _('R1 Key Holder'), _('6-octet identifier as a hex string - no colons')); o.depends({ ieee80211r: '1' }); o.placeholder = '00004f577274'; o.datatype = 'and(hexstring,length(12))'; o.rmempty = true; - o = ss.taboption('encryption', form.Flag, 'pmk_r1_push', _('PMK R1 Push')); + o = ss.taboption('roaming', form.Flag, 'pmk_r1_push', _('PMK R1 Push')); o.depends({ ieee80211r: '1' }); o.placeholder = '0'; o.rmempty = true; - o = ss.taboption('encryption', form.DynamicList, 'r0kh', _('External R0 Key Holder List'), _('List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID (NAS Identifier) to a destination MAC address when requesting PMK-R1 key from the R0KH that the STA used during the Initial Mobility Domain Association.')); + o = ss.taboption('roaming', form.DynamicList, 'r0kh', _('External R0 Key Holder List'), _('List of R0KHs in the same Mobility Domain.
    Format: MAC-address,NAS-Identifier,128-bit key as hex string.
    This list is used to map R0KH-ID (NAS Identifier) to a destination MAC address when requesting PMK-R1 key from the R0KH that the STA used during the Initial Mobility Domain Association.')); o.depends({ ieee80211r: '1' }); o.rmempty = true; - o = ss.taboption('encryption', form.DynamicList, 'r1kh', _('External R1 Key Holder List'), _ ('List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID as 6 octets with colons,128-bit key as hex string.
    This list is used to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the R0KH. This is also the list of authorized R1KHs in the MD that can request PMK-R1 keys.')); + o = ss.taboption('roaming', form.DynamicList, 'r1kh', _('External R1 Key Holder List'), _ ('List of R1KHs in the same Mobility Domain.
    Format: MAC-address,R1KH-ID as 6 octets with colons,128-bit key as hex string.
    This list is used to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the R0KH. This is also the list of authorized R1KHs in the MD that can request PMK-R1 keys.')); o.depends({ ieee80211r: '1' }); o.rmempty = true; // End of 802.11r options + // Probe 802.11k and 802.11v support via EAP support (full hostapd has EAP) + if (L.hasSystemFeature('hostapd', 'eap')) { + /* 802.11k settings start */ o = + ss.taboption('roaming', form.Flag, 'ieee80211k', _('802.11k RRM'), _('Radio Resource Measurement - Sends beacons to assist roaming. Not all clients support this.')); + // add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['psk', 'psk2', 'psk-mixed', 'sae', 'sae-mixed'] }); + o.depends('mode', 'ap'); + o.depends('mode', 'ap-wds'); + + o = ss.taboption('roaming', form.Flag, 'rrm_neighbor_report', _('Neighbour Report'), _('802.11k: Enable neighbor report via radio measurements.')); + o.depends({ ieee80211k: '1' }); + o.default = o.enabled; + + o = ss.taboption('roaming', form.Flag, 'rrm_beacon_report', _('Beacon Report'), _('802.11k: Enable beacon report via radio measurements.')); + o.depends({ ieee80211k: '1' }); + o.default = o.enabled; + /* 802.11k settings end */ + + /* 802.11v settings start */ + o = ss.taboption('roaming', form.ListValue, 'time_advertisement', _('Time advertisement'), _('802.11v: Time Advertisement in management frames.')); + o.value('0', _('Disabled')); + o.value('2', _('Enabled')); + o.write = function (section_id, value) { + return this.super('write', [section_id, (value == 2) ? value: null]); + } + + //Pull current System TZ setting + var tz = uci.get('system', '@system[0]', 'timezone'); + o = ss.taboption('roaming', form.Value, 'time_zone', _('Time zone'), _('802.11v: Local Time Zone Advertisement in management frames.')); + o.value(tz); + o.rmempty = true; + + o = ss.taboption('roaming', form.Flag, 'wnm_sleep_mode', _('WNM Sleep Mode'), _('802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode for stations).')); + o.rmempty = true; + + /* wnm_sleep_mode_no_keys: https://git.openwrt.org/?p=openwrt/openwrt.git;a=commitdiff;h=bf98faaac8ed24cf7d3d93dd4fcd7304d109363b */ + o = ss.taboption('roaming', form.Flag, 'wnm_sleep_mode_no_keys', _('WNM Sleep Mode Fixes'), _('802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents reinstallation attacks.')); + o.rmempty = true; + + o = ss.taboption('roaming', form.Flag, 'bss_transition', _('BSS Transition'), _('802.11v: Basic Service Set (BSS) transition management.')); + o.rmempty = true; + + /* in master, but not 21.02.1: proxy_arp */ + o = ss.taboption('roaming', form.Flag, 'proxy_arp', _('ProxyARP'), _('802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer.')); + o.rmempty = true; + + /* TODO: na_mcast_to_ucast is missing: needs adding to hostapd.sh - nice to have */ + } + /* 802.11v settings end */ + } + + if (hwtype == 'mac80211') { o = ss.taboption('encryption', form.ListValue, 'eap_type', _('EAP-Method')); o.value('tls', 'TLS'); o.value('ttls', 'TTLS'); @@ -2125,7 +2155,7 @@ return view.extend({ uci.add('wireless', 'wifi-iface', section_id); uci.set('wireless', section_id, 'device', radioDev.getName()); uci.set('wireless', section_id, 'mode', 'ap'); - uci.set('wireless', section_id, 'ssid', 'OpenWrt'); + uci.set('wireless', section_id, 'ssid', 'libreCMC'); uci.set('wireless', section_id, 'encryption', 'none'); this.addedSection = section_id; @@ -2235,5 +2265,7 @@ return view.extend({ return E([ nodes, E('h3', _('Associated Stations')), table ]); }, this, m)); - } + }, + + handleReset: null }); diff --git a/package/luci/modules/luci-mod-network/root/etc/uci-defaults/50_luci-mod-admin-full b/package/luci/modules/luci-mod-network/root/etc/uci-defaults/50_luci-mod-admin-full index 140c832997..4f40d4c2b9 100755 --- a/package/luci/modules/luci-mod-network/root/etc/uci-defaults/50_luci-mod-admin-full +++ b/package/luci/modules/luci-mod-network/root/etc/uci-defaults/50_luci-mod-admin-full @@ -5,7 +5,7 @@ if [ "$(uci -q get luci.diag)" != "internal" ]; then if [ -s /etc/os-release ]; then . /etc/os-release - host="${HOME_URL:-${BUG_URL:-$OPENWRT_DEVICE_MANUFACTURER_URL}}" + host="${HOME_URL:-${BUG_URL:-$LIBRECMC_DEVICE_MANUFACTURER_URL}}" host="${host#*://}" host="${host%%/*}" fi diff --git a/package/luci/modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json b/package/luci/modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json index 1c553f3992..b377f395f0 100644 --- a/package/luci/modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json +++ b/package/luci/modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json @@ -8,7 +8,9 @@ "/proc/sys/net/ipv6/conf/*/mtu": [ "read" ], "/proc/sys/net/ipv6/conf/*/hop_limit": [ "read" ], "/usr/libexec/luci-peeraddr": [ "exec" ], - "/usr/lib/opkg/info/netifd.control": [ "read" ] + "/usr/lib/opkg/info/netifd.control": [ "read" ], + "/proc/sys/net/ipv[46]/conf/*": [ "read" ], + "/sys/class/net/*/brport/*": [ "read" ] }, "ubus": { "file": [ "exec" ], diff --git a/package/luci/modules/luci-mod-rpc/Makefile b/package/luci/modules/luci-mod-rpc/Makefile index bc1f6d2756..2d9f2af845 100644 --- a/package/luci/modules/luci-mod-rpc/Makefile +++ b/package/luci/modules/luci-mod-rpc/Makefile @@ -13,5 +13,5 @@ PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/modules/luci-mod-status/Makefile b/package/luci/modules/luci-mod-status/Makefile index cf8c8ddf83..8246ae1877 100644 --- a/package/luci/modules/luci-mod-status/Makefile +++ b/package/luci/modules/luci-mod-status/Makefile @@ -7,12 +7,13 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Status Pages -LUCI_DEPENDS:=+luci-base +libiwinfo +libiwinfo-lua +LUCI_DEPENDS:=+luci-base +libiwinfo +rpcd-mod-iwinfo +PKG_RELEASE:=2 PKG_BUILD_DEPENDS:=iwinfo PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js index 0c8cff8c0e..d8a3393256 100644 --- a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js +++ b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js @@ -105,13 +105,13 @@ return view.extend({ step = (chan_graph.offsetWidth - 2) / columns, curr_offset = step; - function createGraphHLine(graph, pos) { + function createGraphHLine(graph, pos, width, dash) { var elem = document.createElementNS('http://www.w3.org/2000/svg', 'line'); elem.setAttribute('x1', pos); elem.setAttribute('y1', 0); elem.setAttribute('x2', pos); elem.setAttribute('y2', '100%'); - elem.setAttribute('style', 'stroke:black;stroke-width:0.1'); + elem.setAttribute('style', 'stroke:black;stroke-width:'+width+';stroke-dasharray:'+dash); graph.appendChild(elem); } @@ -126,13 +126,21 @@ return view.extend({ chan_analysis.col_width = step; - createGraphHLine(G,curr_offset); + createGraphHLine(G,curr_offset, 0.1, 1); for (var i=0; i< freq_tbl.length;i++) { var channel = freq_tbl[i] chan_analysis.offset_tbl[channel] = curr_offset+step; - createGraphHLine(G,curr_offset+step); - createGraphText(G,curr_offset+step, channel); + if (is5GHz) { + createGraphHLine(G,curr_offset+step, 0.1, 3); + if (channel < 100) + createGraphText(G,curr_offset-(step/2), channel); + else + createGraphText(G,curr_offset-step, channel); + } else { + createGraphHLine(G,curr_offset+step, 0.1, 0); + createGraphText(G,curr_offset+step, channel); + } curr_offset += step; if (is5GHz && freq_tbl[i+1]) { @@ -141,28 +149,33 @@ return view.extend({ if ((next_channel - channel) == 4) { for (var j=1; j < 4; j++) { chan_analysis.offset_tbl[channel+j] = curr_offset+step; - createGraphHLine(G,curr_offset+step); + if (j == 2) + createGraphHLine(G,curr_offset+step, 0.1, 0); + else + createGraphHLine(G,curr_offset+step, 0.1, 1); curr_offset += step; } } else { chan_analysis.offset_tbl[channel+1] = curr_offset+step; - createGraphHLine(G,curr_offset+step); + createGraphHLine(G,curr_offset+step, 0.1, 1); curr_offset += step; chan_analysis.offset_tbl[next_channel-2] = curr_offset+step; - createGraphHLine(G,curr_offset+step); + createGraphHLine(G,curr_offset+step, 0.5, 0); curr_offset += step; chan_analysis.offset_tbl[next_channel-1] = curr_offset+step; - createGraphHLine(G,curr_offset+step); + createGraphHLine(G,curr_offset+step, 0.1, 1); curr_offset += step; } } } - createGraphHLine(G,curr_offset+step); + createGraphHLine(G,curr_offset+step, 0.1, 1); chan_analysis.tab.addEventListener('cbi-tab-active', L.bind(function(ev) { this.active_tab = ev.detail.tab; + if (!this.radios[this.active_tab].loadedOnce) + poll.start(); }, this)); }, @@ -170,17 +183,17 @@ return view.extend({ if (!this.active_tab) return; - var radioDev = this.radios[this.active_tab].dev, - table = this.radios[this.active_tab].table, - chan_analysis = this.radios[this.active_tab].graph, - scanCache = this.radios[this.active_tab].scanCache; + var radio = this.radios[this.active_tab]; return Promise.all([ - radioDev.getScanList(), - this.callInfo(radioDev.getName()) + radio.dev.getScanList(), + this.callInfo(radio.dev.getName()) ]).then(L.bind(function(data) { var results = data[0], - local_wifi = data[1]; + local_wifi = data[1], + table = radio.table, + chan_analysis = radio.graph, + scanCache = radio.scanCache; var rows = []; @@ -189,6 +202,7 @@ return view.extend({ scanCache[results[i].bssid] = {}; scanCache[results[i].bssid].data = results[i]; + scanCache[results[i].bssid].data.stale = false; } if (scanCache[local_wifi.bssid] == null) @@ -198,7 +212,7 @@ return view.extend({ if (chan_analysis.offset_tbl[local_wifi.channel] != null && local_wifi.center_chan1) { var center_channels = [local_wifi.center_chan1], - chan_width_text = local_wifi.htmode.replace(/(V)*HT/,''), + chan_width_text = local_wifi.htmode.replace(/(V)*H[TE]/,''), /* Handle HT VHT HE */ chan_width = parseInt(chan_width_text)/10; if (local_wifi.center_chan2) { @@ -224,14 +238,12 @@ return view.extend({ } for (var k in scanCache) - if (scanCache[k].stale) + if (scanCache[k].data.stale) results.push(scanCache[k].data); results.sort(function(a, b) { - var diff = (b.quality - a.quality) || (a.channel - b.channel); - - if (diff) - return diff; + if (a.channel - b.channel) + return 1; if (a.ssid < b.ssid) return -1; @@ -302,10 +314,15 @@ return view.extend({ E('span', { 'style': s }, '%h'.format(res.bssid)) ]); - res.stale = true; + scanCache[results[i].bssid].data.stale = true; } cbi_update_table(table, rows); + + if (!radio.loadedOnce) { + radio.loadedOnce = true; + poll.stop(); + } }, this)) }, @@ -347,7 +364,16 @@ return view.extend({ var svg = data[0], wifiDevs = data[1]; - var v = E('div', {}, E('div')); + var h2 = E('div', {'class' : 'cbi-title-section'}, [ + E('h2', {'class': 'cbi-title-field'}, [ _('Channel Analysis') ]), + E('div', {'class': 'cbi-title-buttons' }, [ + E('button', { + 'class': 'cbi-button cbi-button-edit', + 'click': ui.createHandlerFn(this, 'handleScanRefresh') + }, [ _('Refresh Channels') ])]) + ]); + + var tabs = E('div', {}, E('div')); for (var ifname in wifiDevs) { var freq_tbl = { @@ -392,25 +418,24 @@ return view.extend({ dev: wifiDevs[ifname].dev, graph: graph_data, table: table, - scanCache: {} + scanCache: {}, + loadedOnce: false, }; cbi_update_table(table, [], E('em', { class: 'spinning' }, _('Starting wireless scan...'))); - v.firstElementChild.appendChild(tab) + tabs.firstElementChild.appendChild(tab) requestAnimationFrame(L.bind(this.create_channel_graph, this, graph_data, freq_tbl[freq], freq)); } } - ui.tabs.initTabGroup(v.firstElementChild.childNodes); + ui.tabs.initTabGroup(tabs.firstElementChild.childNodes); this.pollFn = L.bind(this.handleScanRefresh, this); - poll.add(this.pollFn); - poll.start(); - return v; + return E('div', {}, [h2, tabs]); }, handleSaveApply: null, diff --git a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js index ae7efa3e75..45f7b4acae 100644 --- a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js +++ b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js @@ -3,6 +3,11 @@ 'require fs'; 'require rpc'; +var callLuciVersion = rpc.declare({ + object: 'luci', + method: 'getVersion' +}); + var callSystemBoard = rpc.declare({ object: 'system', method: 'board' @@ -20,7 +25,7 @@ return baseclass.extend({ return Promise.all([ L.resolveDefault(callSystemBoard(), {}), L.resolveDefault(callSystemInfo(), {}), - fs.lines('/usr/lib/lua/luci/version.lua') + L.resolveDefault(callLuciVersion(), { revision: _('unknown version'), branch: 'LuCI' }) ]); }, @@ -29,11 +34,7 @@ return baseclass.extend({ systeminfo = data[1], luciversion = data[2]; - luciversion = luciversion.filter(function(l) { - return l.match(/^\s*(luciname|luciversion)\s*=/); - }).map(function(l) { - return l.replace(/^\s*\w+\s*=\s*['"]([^'"]+)['"].*$/, '$1'); - }).join(' '); + luciversion = luciversion.branch + ' ' + luciversion.revision; var datestr = null; diff --git a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js new file mode 100644 index 0000000000..b511897921 --- /dev/null +++ b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js @@ -0,0 +1,386 @@ +'use strict'; +'require baseclass'; +'require fs'; +'require ui'; +'require uci'; +'require rpc'; +'require network'; +'require firewall'; + +var callGetBuiltinEthernetPorts = rpc.declare({ + object: 'luci', + method: 'getBuiltinEthernetPorts', + expect: { result: [] } +}); + +function isString(v) +{ + return typeof(v) === 'string' && v !== ''; +} + +function resolveVLANChain(ifname, bridges, mapping) +{ + while (!mapping[ifname]) { + var m = ifname.match(/^(.+)\.([^.]+)$/); + + if (!m) + break; + + if (bridges[m[1]]) { + if (bridges[m[1]].vlan_filtering) + mapping[ifname] = bridges[m[1]].vlans[m[2]]; + else + mapping[ifname] = bridges[m[1]].ports; + } + else if (/^[0-9]{1,4}$/.test(m[2]) && m[2] <= 4095) { + mapping[ifname] = [ m[1] ]; + } + else { + break; + } + + ifname = m[1]; + } +} + +function buildVLANMappings(mapping) +{ + var bridge_vlans = uci.sections('network', 'bridge-vlan'), + vlan_devices = uci.sections('network', 'device'), + interfaces = uci.sections('network', 'interface'), + bridges = {}; + + /* find bridge VLANs */ + for (var i = 0, s; (s = bridge_vlans[i]) != null; i++) { + if (!isString(s.device) || !/^[0-9]{1,4}$/.test(s.vlan) || +s.vlan > 4095) + continue; + + var aliases = L.toArray(s.alias), + ports = L.toArray(s.ports), + br = bridges[s.device] = (bridges[s.device] || { ports: [], vlans: {}, vlan_filtering: true }); + + br.vlans[s.vlan] = []; + + for (var j = 0; j < ports.length; j++) { + var port = ports[j].replace(/:[ut*]+$/, ''); + + if (br.ports.indexOf(port) === -1) + br.ports.push(port); + + br.vlans[s.vlan].push(port); + } + + for (var j = 0; j < aliases.length; j++) + if (aliases[j] != s.vlan) + br.vlans[aliases[j]] = br.vlans[s.vlan]; + } + + /* find bridges, VLAN devices */ + for (var i = 0, s; (s = vlan_devices[i]) != null; i++) { + if (s.type == 'bridge') { + if (!isString(s.name)) + continue; + + var ports = L.toArray(s.ports), + br = bridges[s.name] || (bridges[s.name] = { ports: [], vlans: {}, vlan_filtering: false }); + + if (s.vlan_filtering == '0') + br.vlan_filtering = false; + else if (s.vlan_filtering == '1') + br.vlan_filtering = true; + + for (var j = 0; j < ports.length; j++) + if (br.ports.indexOf(ports[j]) === -1) + br.ports.push(ports[j]); + + mapping[s.name] = br.ports; + } + else if (s.type == '8021q' || s.type == '8021ad') { + if (!isString(s.name) || !isString(s.vid) || !isString(s.ifname)) + continue; + + /* parent device is a bridge */ + if (bridges[s.ifname]) { + /* parent bridge is VLAN enabled, device refers to VLAN ports */ + if (bridges[s.ifname].vlan_filtering) + mapping[s.name] = bridges[s.ifname].vlans[s.vid]; + + /* parent bridge is not VLAN enabled, device refers to all bridge ports */ + else + mapping[s.name] = bridges[s.ifname].ports; + } + + /* parent is a simple netdev */ + else { + mapping[s.name] = [ s.ifname ]; + } + + resolveVLANChain(s.ifname, bridges, mapping); + } + } + + /* resolve VLAN tagged interfaces in bridge ports */ + for (var brname in bridges) { + for (var i = 0; i < bridges[brname].ports.length; i++) + resolveVLANChain(bridges[brname].ports[i], bridges, mapping); + + for (var vid in bridges[brname].vlans) + for (var i = 0; i < bridges[brname].vlans[vid].length; i++) + resolveVLANChain(bridges[brname].vlans[vid][i], bridges, mapping); + } + + /* find implicit VLAN devices */ + for (var i = 0, s; (s = interfaces[i]) != null; i++) { + if (!isString(s.device)) + continue; + + resolveVLANChain(s.device, bridges, mapping); + } +} + +function resolveVLANPorts(ifname, mapping, seen) +{ + var ports = []; + + if (!seen) + seen = {}; + + if (mapping[ifname]) { + for (var i = 0; i < mapping[ifname].length; i++) { + if (!seen[mapping[ifname][i]]) { + seen[mapping[ifname][i]] = true; + ports.push.apply(ports, resolveVLANPorts(mapping[ifname][i], mapping, seen)); + } + } + } + else { + ports.push(ifname); + } + + return ports.sort(L.naturalCompare); +} + +function buildInterfaceMapping(zones, networks) { + var vlanmap = {}, + portmap = {}, + netmap = {}; + + buildVLANMappings(vlanmap); + + for (var i = 0; i < networks.length; i++) { + var l3dev = networks[i].getDevice(); + + if (!l3dev) + continue; + + var ports = resolveVLANPorts(l3dev.getName(), vlanmap); + + for (var j = 0; j < ports.length; j++) { + portmap[ports[j]] = portmap[ports[j]] || { networks: [], zones: [] }; + portmap[ports[j]].networks.push(networks[i]); + } + + netmap[networks[i].getName()] = networks[i]; + } + + for (var i = 0; i < zones.length; i++) { + var networknames = zones[i].getNetworks(); + + for (var j = 0; j < networknames.length; j++) { + if (!netmap[networknames[j]]) + continue; + + var l3dev = netmap[networknames[j]].getDevice(); + + if (!l3dev) + continue; + + var ports = resolveVLANPorts(l3dev.getName(), vlanmap); + + for (var k = 0; k < ports.length; k++) { + portmap[ports[k]] = portmap[ports[k]] || { networks: [], zones: [] }; + + if (portmap[ports[k]].zones.indexOf(zones[i]) === -1) + portmap[ports[k]].zones.push(zones[i]); + } + } + } + + return portmap; +} + +function formatSpeed(carrier, speed, duplex) { + if (speed && duplex) { + var d = (duplex == 'half') ? '\u202f(H)' : '', + e = E('span', { 'title': _('Speed: %d Mibit/s, Duplex: %s').format(speed, duplex) }); + + switch (speed) { + case 10: e.innerText = '10\u202fM' + d; break; + case 100: e.innerText = '100\u202fM' + d; break; + case 1000: e.innerText = '1\u202fGbE' + d; break; + case 2500: e.innerText = '2.5\u202fGbE'; break; + case 5000: e.innerText = '5\u202fGbE'; break; + case 10000: e.innerText = '10\u202fGbE'; break; + case 25000: e.innerText = '25\u202fGbE'; break; + case 40000: e.innerText = '40\u202fGbE'; break; + default: e.innerText = '%d\u202fMbE%s'.format(speed, d); + } + + return e; + } + + return carrier ? _('Connected') : _('no link'); +} + +function formatStats(portdev) { + var stats = portdev._devstate('stats') || {}; + + return ui.itemlist(E('span'), [ + _('Received bytes'), '%1024mB'.format(stats.rx_bytes), + _('Received packets'), '%1000mPkts.'.format(stats.rx_packets), + _('Received multicast'), '%1000mPkts.'.format(stats.multicast), + _('Receive errors'), '%1000mPkts.'.format(stats.rx_errors), + _('Receive dropped'), '%1000mPkts.'.format(stats.rx_dropped), + + _('Transmitted bytes'), '%1024mB'.format(stats.tx_bytes), + _('Transmitted packets'), '%1000mPkts.'.format(stats.tx_packets), + _('Transmit errors'), '%1000mPkts.'.format(stats.tx_errors), + _('Transmit dropped'), '%1000mPkts.'.format(stats.tx_dropped), + + _('Collisions seen'), stats.collisions + ]); +} + +function renderNetworkBadge(network, zonename) { + var l3dev = network.getDevice(); + var span = E('span', { 'class': 'ifacebadge', 'style': 'margin:.125em 0' }, [ + E('span', { + 'class': 'zonebadge', + 'title': zonename ? _('Part of zone %q').format(zonename) : _('No zone assigned'), + 'style': firewall.getZoneColorStyle(zonename) + }, '\u202f'), + '\u202f', network.getName(), ': ' + ]); + + if (l3dev) + span.appendChild(E('img', { + 'title': l3dev.getI18n(), + 'src': L.resource('icons/%s%s.png'.format(l3dev.getType(), l3dev.isUp() ? '' : '_disabled')) + })); + else + span.appendChild(E('em', _('(no interfaces attached)'))); + + return span; +} + +function renderNetworksTooltip(pmap) { + var res = [ null ], + zmap = {}; + + for (var i = 0; pmap && i < pmap.zones.length; i++) { + var networknames = pmap.zones[i].getNetworks(); + + for (var k = 0; k < networknames.length; k++) + zmap[networknames[k]] = pmap.zones[i].getName(); + } + + for (var i = 0; pmap && i < pmap.networks.length; i++) + res.push(E('br'), renderNetworkBadge(pmap.networks[i], zmap[pmap.networks[i].getName()])); + + if (res.length > 1) + res[0] = N_((res.length - 1) / 2, 'Part of network:', 'Part of networks:'); + else + res[0] = _('Port is not part of any network'); + + return E([], res); +} + +return baseclass.extend({ + title: _('Port status'), + + load: function() { + return Promise.all([ + L.resolveDefault(callGetBuiltinEthernetPorts(), []), + L.resolveDefault(fs.read('/etc/board.json'), '{}'), + firewall.getZones(), + network.getNetworks(), + uci.load('network') + ]); + }, + + render: function(data) { + if (L.hasSystemFeature('swconfig')) + return null; + + var board = JSON.parse(data[1]), + known_ports = [], + port_map = buildInterfaceMapping(data[2], data[3]); + + if (Array.isArray(data[0]) && data[0].length > 0) { + known_ports = data[0].map(port => ({ + ...port, + netdev: network.instantiateDevice(port.device) + })); + } + else { + if (L.isObject(board) && L.isObject(board.network)) { + for (var k = 'lan'; k != null; k = (k == 'lan') ? 'wan' : null) { + if (!L.isObject(board.network[k])) + continue; + + if (Array.isArray(board.network[k].ports)) + for (let i = 0; i < board.network[k].ports.length; i++) + known_ports.push({ + role: k, + device: board.network[k].ports[i], + netdev: network.instantiateDevice(board.network[k].ports[i]) + }); + else if (typeof(board.network[k].device) == 'string') + known_ports.push({ + role: k, + device: board.network[k].device, + netdev: network.instantiateDevice(board.network[k].device) + }); + } + } + } + + known_ports.sort(function(a, b) { + return L.naturalCompare(a.device, b.device); + }); + + return E('div', { 'style': 'display:grid;grid-template-columns:repeat(auto-fit, minmax(70px, 1fr));margin-bottom:1em' }, known_ports.map(function(port) { + var speed = port.netdev.getSpeed(), + duplex = port.netdev.getDuplex(), + carrier = port.netdev.getCarrier(), + pmap = port_map[port.netdev.getName()], + pzones = (pmap && pmap.zones.length) ? pmap.zones.sort(function(a, b) { return L.naturalCompare(a.getName(), b.getName()) }) : [ null ]; + + return E('div', { 'class': 'ifacebox', 'style': 'margin:.25em;min-width:70px;max-width:100px' }, [ + E('div', { 'class': 'ifacebox-head', 'style': 'font-weight:bold' }, [ port.netdev.getName() ]), + E('div', { 'class': 'ifacebox-body' }, [ + E('img', { 'src': L.resource('icons/port_%s.png').format(carrier ? 'up' : 'down') }), + E('br'), + formatSpeed(carrier, speed, duplex) + ]), + E('div', { 'class': 'ifacebox-head cbi-tooltip-container', 'style': 'display:flex' }, [ + E([], pzones.map(function(zone) { + return E('div', { + 'class': 'zonebadge', + 'style': 'cursor:help;flex:1;height:3px;opacity:' + (carrier ? 1 : 0.25) + ';' + firewall.getZoneColorStyle(zone) + }); + })), + E('span', { 'class': 'cbi-tooltip left' }, [ renderNetworksTooltip(pmap) ]) + ]), + E('div', { 'class': 'ifacebox-body' }, [ + E('div', { 'class': 'cbi-tooltip-container', 'style': 'text-align:left;font-size:80%' }, [ + '\u25b2\u202f%1024.1mB'.format(port.netdev.getTXBytes()), + E('br'), + '\u25bc\u202f%1024.1mB'.format(port.netdev.getRXBytes()), + E('span', { 'class': 'cbi-tooltip' }, formatStats(port.netdev)) + ]), + ]) + ]); + })); + } +}); diff --git a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js index 956c1b20f9..4c52916423 100644 --- a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js +++ b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js @@ -82,7 +82,7 @@ return baseclass.extend({ } }; - var table = E('table', { 'class': 'table lases' }, [ + var table = E('table', { 'id': 'status_leases', 'class': 'table lases' }, [ E('tr', { 'class': 'tr table-titles' }, [ E('th', { 'class': 'th' }, _('Hostname')), E('th', { 'class': 'th' }, _('IPv4 address')), @@ -129,7 +129,7 @@ return baseclass.extend({ return rows; }, this)), E('em', _('There are no active leases'))); - var table6 = E('table', { 'class': 'table leases6' }, [ + var table6 = E('table', { 'id': 'status_leases6', 'class': 'table leases6' }, [ E('tr', { 'class': 'tr table-titles' }, [ E('th', { 'class': 'th' }, _('Host')), E('th', { 'class': 'th' }, _('IPv6 address')), diff --git a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js index ed47758f4f..3482a9fd08 100644 --- a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js +++ b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js @@ -1,5 +1,6 @@ 'use strict'; 'require baseclass'; +'require network'; 'require rpc'; var callDSLMetrics = rpc.declare({ @@ -8,6 +9,12 @@ var callDSLMetrics = rpc.declare({ expect: { '': {} } }); +function format_values(format, val1, val2) { + var val1Str = (val1 != null) ? format.format(val1) : '-'; + var val2Str = (val2 != null) ? format.format(val2) : '-'; + return val1Str + ' / ' + val2Str; +} + function renderbox(dsl) { return E('div', { class: 'ifacebox' }, [ E('div', { class: 'ifacebox-head center ' + (dsl.up ? 'active' : '') }, @@ -17,24 +24,10 @@ function renderbox(dsl) { _('Line State'), dsl.state || '-', _('Line Mode'), dsl.mode || '-', _('Line Uptime'), '%t'.format(dsl.uptime), - _('Annex'), dsl.annex || '-', - _('Data Rate'), '%1000.3mb/s / %1000.3mb/s'.format(dsl.downstream.data_rate, dsl.upstream.data_rate), - _('Max. Attainable Data Rate (ATTNDR)'), '%1000.3mb/s / %1000.3mb/s'.format(dsl.downstream.attndr, dsl.upstream.attndr), - _('Latency'), '%.2f ms / %.2f ms'.format(dsl.downstream.interleave_delay / 1000, dsl.upstream.interleave_delay / 1000), - _('Line Attenuation (LATN)'), '%.1f dB / %.1f dB'.format(dsl.downstream.latn, dsl.upstream.latn), - _('Signal Attenuation (SATN)'), '%.1f dB / %.1f dB'.format(dsl.downstream.satn, dsl.upstream.satn), - _('Noise Margin (SNR)'), '%.1f dB / %.1f dB'.format(dsl.downstream.snr, dsl.upstream.snr), - _('Aggregate Transmit Power (ACTATP)'), '%.1f dB / %.1f dB'.format(dsl.downstream.actatp, dsl.upstream.actatp), - _('Forward Error Correction Seconds (FECS)'), '%d / %d'.format(dsl.errors.near.fecs, dsl.errors.far.fecs), - _('Errored seconds (ES)'), '%d / %d'.format(dsl.errors.near.es, dsl.errors.far.es), - _('Severely Errored Seconds (SES)'), '%d / %d'.format(dsl.errors.near.ses, dsl.errors.far.ses), - _('Loss of Signal Seconds (LOSS)'), '%d / %d'.format(dsl.errors.near.loss, dsl.errors.far.loss), - _('Unavailable Seconds (UAS)'), '%d / %d'.format(dsl.errors.near.uas, dsl.errors.far.uas), - _('Header Error Code Errors (HEC)'), '%d / %d'.format(dsl.errors.near.hec, dsl.errors.far.hec), - _('Non Pre-emptive CRC errors (CRC_P)'), '%d / %d'.format(dsl.errors.near.crc_p, dsl.errors.far.crc_p), - _('Pre-emptive CRC errors (CRCP_P)'), '%d / %d'.format(dsl.errors.near.crcp_p, dsl.errors.far.crcp_p), - _('ATU-C System Vendor ID'), dsl.atu_c.vendor || dsl.atu_c.vendor_id, - _('Power Management Mode'), dsl.power_state + ]), + L.itemlist(E('span'), [ + _('Data Rate'), format_values('%1000.3mb/s', dsl.downstream.data_rate, dsl.upstream.data_rate), + _('Noise Margin'), format_values('%.1f dB', dsl.downstream.snr, dsl.upstream.snr), ]) ]) ]); @@ -44,10 +37,12 @@ return baseclass.extend({ title: _('DSL'), load: function() { - if (!L.hasSystemFeature('dsl')) - return Promise.reject(); + return network.getDSLModemType().then(function(type) { + if (!type) + return Promise.reject(); - return L.resolveDefault(callDSLMetrics(), {}); + return L.resolveDefault(callDSLMetrics(), {}); + }); }, render: function(dsl) { diff --git a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js index 951c31218d..e409a5ac50 100644 --- a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js +++ b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js @@ -173,7 +173,7 @@ return view.extend({ srcnet, dstnet, options, - [ comment ] + [ comment, '%h'.format(comment) ] ]); if (target) { diff --git a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js index 82660c1595..d891526d04 100644 --- a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js +++ b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js @@ -4,7 +4,6 @@ 'require fs'; 'require ui'; 'require dom'; -'require tools.firewall as fwtool'; var expr_translations = { 'meta.iifname': _('Ingress device name', 'nft meta iifname'), @@ -25,6 +24,7 @@ var expr_translations = { 'meta.mark': _('Packet mark', 'nft meta mark'), + 'meta.time': _('Packet receive time', 'nft meta time'), 'meta.hour': _('Current time', 'nft meta hour'), 'meta.day': _('Current weekday', 'nft meta day'), @@ -95,6 +95,7 @@ var action_translations = { 'accept': _('Accept packet', 'nft accept action'), 'drop': _('Drop packet', 'nft drop action'), 'jump': _('Continue in %h', 'nft jump action'), + 'log': _('Log event "%h…"', 'nft log action'), 'reject.tcp reset': _('Reject packet with TCP reset', 'nft reject with tcp reset'), 'reject.icmp': _('Reject IPv4 packet with ICMP type %h', 'nft reject with icmp type'), @@ -154,6 +155,7 @@ return view.extend({ case 'masquerade': case 'return': case 'flow': + case 'log': return true; } } @@ -355,8 +357,7 @@ return view.extend({ var k = 'reject.%s'.format(spec.type); return E('span', { - 'class': 'ifacebadge', - 'data-tooltip': JSON.stringify(spec) + 'class': 'ifacebadge' }, (action_translations[k] || k).format(this.exprToString(spec.expr))); case 'accept': @@ -445,6 +446,11 @@ return view.extend({ 'class': 'ifacebadge' }, action_translations.flow.format(spec.flowtable.replace(/^@/, ''))); + case 'log': + return E('span', { + 'class': 'ifacebadge' + }, action_translations.log.format(spec.prefix)); + default: return E('span', { 'class': 'ifacebadge', @@ -509,7 +515,7 @@ return view.extend({ } if (empty) - dom.content(row.childNodes[0], E('em', [ _('Any packet', 'nft match any traffic') ])); + dom.append(row.childNodes[0], E('span', { 'class': 'ifacebadge' }, '%h'.format(_('Any packet', 'nft match any traffic')))); return row; }, diff --git a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js index 9b9b06e223..5e8bb52566 100644 --- a/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js +++ b/package/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js @@ -87,7 +87,7 @@ return view.extend({ res = []; for (var i = 0; i < lines.length; i++) { - var m = lines[i].match(/^([0-9a-f:.]+) (.+) (\S+)$/), + var m = lines[i].match(/^([0-9a-f:.]+) (.+) (\S+) *$/), addr = m ? m[1] : null, flags = m ? m[2].trim().split(/\s+/) : [], state = (m ? m[3] : null) || 'FAILED'; @@ -248,7 +248,7 @@ return view.extend({ E('h2', {}, [ _('Routing') ]), E('p', {}, [ _('The following rules are currently active on this system.') ]), E('div', {}, [ - E('div', { 'data-tab': 'ipv4routing', 'data-tab-title': _('IPv4 Routing') }, [ + E('div', { 'class': 'cbi-section', 'data-tab': 'ipv4routing', 'data-tab-title': _('IPv4 Routing') }, [ E('h3', {}, [ _('IPv4 Neighbours') ]), neigh4tbl, @@ -258,7 +258,7 @@ return view.extend({ E('h3', {}, [ _('Active IPv4 Rules') ]), rule4tbl ]), - E('div', { 'data-tab': 'ipv6routing', 'data-tab-title': _('IPv6 Routing') }, [ + E('div', { 'class': 'cbi-section', 'data-tab': 'ipv6routing', 'data-tab-title': _('IPv6 Routing') }, [ E('h3', {}, [ _('IPv6 Neighbours') ]), neigh6tbl, diff --git a/package/luci/modules/luci-mod-status/luasrc/view/admin_status/index.htm b/package/luci/modules/luci-mod-status/luasrc/view/admin_status/index.htm deleted file mode 100644 index 7d7a42c2e3..0000000000 --- a/package/luci/modules/luci-mod-status/luasrc/view/admin_status/index.htm +++ /dev/null @@ -1,78 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008-2018 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<%+header%> - -

    <%:Status%>

    - -
    -
    <%:Loading view…%>
    -
    - - - - - - - -<%+footer%> diff --git a/package/luci/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json b/package/luci/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json index a9ae0cef49..20cd23bb6c 100644 --- a/package/luci/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json +++ b/package/luci/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status-index.json @@ -3,12 +3,13 @@ "description": "Grant access to main status display", "read": { "file": { + "/etc/board.json": [ "read" ], "/proc/sys/net/netfilter/nf_conntrack_count": [ "read" ], "/proc/sys/net/netfilter/nf_conntrack_max": [ "read" ], - "/usr/lib/lua/luci/version.lua": [ "read" ], "/www/luci-static/resources/view/status/include": [ "list" ] }, "ubus": { + "luci": [ "getVersion" ], "file": [ "list", "read" ], "system": [ "board", "info" ] } @@ -36,6 +37,15 @@ } }, + "luci-mod-status-index-ports": { + "description": "Grant access to port status display", + "read": { + "ubus": { + "luci": [ "getBuiltinEthernetPorts" ] + } + } + }, + "luci-mod-status-index-wifi": { "description": "Grant access to wireless status display", "read": { diff --git a/package/luci/modules/luci-mod-status/ucode/template/admin_status/index.ut b/package/luci/modules/luci-mod-status/ucode/template/admin_status/index.ut new file mode 100644 index 0000000000..4d018a3efd --- /dev/null +++ b/package/luci/modules/luci-mod-status/ucode/template/admin_status/index.ut @@ -0,0 +1,69 @@ +{# + Copyright 2008 Steven Barth + Copyright 2008-2022 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% include('header') %} + +

    {{ _('Status') }}

    + +
    +
    {{ _('Loading view…') }}
    +
    + + + + + + + +{% include('footer') %} diff --git a/package/luci/modules/luci-mod-system/Makefile b/package/luci/modules/luci-mod-system/Makefile index a6d5a7a456..2bd51b6558 100644 --- a/package/luci/modules/luci-mod-system/Makefile +++ b/package/luci/modules/luci-mod-system/Makefile @@ -13,5 +13,5 @@ PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js index 6ee801abc2..05afc670ab 100644 --- a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js +++ b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js @@ -28,7 +28,7 @@ return view.extend({ o.default = o.enabled; o.rmempty = false; - o = s.option(form.Flag, 'RootPasswordAuth', _('Allow root logins with password'), _('Allow the root user to login with password')); + o = s.option(form.Flag, 'RootPasswordAuth', _('Allow root logins with password'), _('Allow the root user to log in with password')); o.enabled = 'on'; o.disabled = 'off'; o.default = o.enabled; diff --git a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js index 8661181781..ebf90fcda7 100644 --- a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js +++ b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js @@ -101,7 +101,7 @@ return view.extend({ /* Currently the sysupgrade rpc call will not return, hence no promise handling */ fs.exec('/sbin/firstboot', [ '-r', '-y' ]); - ui.awaitReconnect('192.168.1.1', 'openwrt.lan'); + ui.awaitReconnect('192.168.1.1', 'librecmc.lan'); }, handleRestore: function(ev) { @@ -163,7 +163,7 @@ return view.extend({ E('p', { 'class': 'spinning' }, _('The system is rebooting now. If the restored configuration changed the current LAN IP address, you might need to reconnect manually.')) ]); - ui.awaitReconnect(window.location.host, '192.168.1.1', 'openwrt.lan'); + ui.awaitReconnect(window.location.host, '192.168.1.1', 'librecmc.lan'); }, this)) .catch(function(e) { ui.addNotification(null, E('p', e.message)) }) .finally(function() { btn.firstChild.data = _('Upload archive...') }); @@ -335,7 +335,7 @@ return view.extend({ if (opts['keep'][0].checked) ui.awaitReconnect(window.location.host); else - ui.awaitReconnect('192.168.1.1', 'openwrt.lan'); + ui.awaitReconnect('192.168.1.1', 'librecmc.lan'); }, handleBackupList: function(ev) { diff --git a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js index 49744ed42a..4a093ffed5 100644 --- a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js +++ b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js @@ -1,10 +1,19 @@ 'use strict'; 'require baseclass'; +'require form'; return baseclass.extend({ trigger: _('Heartbeat interval (kernel: heartbeat)'), description: _('The LED flashes to simulate actual heart beat.') + _('The frequency is in direct proportion to 1-minute average CPU load.'), kernel: true, - addFormOptions: function(s) {} + addFormOptions: function(s) { + var o; + + o = s.option(form.Flag, 'inverted', _('Invert blinking'), + _('When inverted, the LED is continuously lit and flickers instead of it being off by default and blinking on system activity.')); + o.rmempty = true; + o.modalonly = true; + o.depends('trigger', 'heartbeat'); + } }); diff --git a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js index 8b12b2311e..a1748ad990 100644 --- a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js +++ b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js @@ -22,7 +22,7 @@ var SSHPubkeyDecoder = baseclass.singleton({ decode: function(s) { - var parts = s.trim().match(/^((?:(?:^|,)[^ =,]+(?:=(?:[^ ",]+|"(?:[^"\\]|\\.)*"))?)+ +)?(ssh-dss|ssh-rsa|ssh-ed25519|ecdsa-sha2-nistp[0-9]+) +([^ ]+)( +.*)?$/); + var parts = s.trim().match(/^((?:(?:^|,)[^ =,]+(?:=(?:[^ ",]+|"(?:[^"\\]|\\.)*"))?)+ +)?(ssh-dss|ssh-rsa|ssh-ed25519|ecdsa-sha2-nistp[0-9]+|sk-ecdsa-sha2-nistp256@openssh\.com|sk-ssh-ed25519@openssh\.com) +([^ ]+)( +.*)?$/); if (!parts) return null; @@ -99,6 +99,12 @@ var SSHPubkeyDecoder = baseclass.singleton({ case 'ecdsa-sha2': return { type: 'ECDSA', curve: curve, comment: comment, options: options, fprint: fprint, src: s }; + + case 'sk-ecdsa-sha2-nistp256@openssh.com': + return { type: 'ECDSA-SK', curve: 'NIST P-256', comment: comment, options: options, fprint: fprint, src: s }; + + case 'sk-ssh-ed25519@openssh.com': + return { type: 'EdDSA-SK', curve: 'Curve25519', comment: comment, options: options, fprint: fprint, src: s }; default: return null; @@ -198,7 +204,7 @@ function removeKey(ev) { L.showModal(_('Delete key'), [ E('div', _('Do you really want to delete the following SSH key?')), - E('pre', delkey), + E('pre', [ delkey ]), E('div', { class: 'right' }, [ E('div', { class: 'btn', click: L.hideModal }, _('Cancel')), ' ', diff --git a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js index 767bc8c619..259cf9211c 100644 --- a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js +++ b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js @@ -250,8 +250,8 @@ return view.extend({ if (L.hasSystemFeature('sysntpd')) { var default_servers = [ - '0.openwrt.pool.ntp.org', '1.openwrt.pool.ntp.org', - '2.openwrt.pool.ntp.org', '3.openwrt.pool.ntp.org' + '0.librecmc.pool.ntp.org', '1.librecmc.pool.ntp.org', + '2.librecmc.pool.ntp.org', '3.librecmc.pool.ntp.org' ]; o = s.taboption('timesync', form.Flag, 'enabled', _('Enable NTP client')); diff --git a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js index d02e18505a..6febb4cc17 100644 --- a/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js +++ b/package/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/uhttpd.js @@ -12,9 +12,6 @@ return view.extend({ s.addremove = false; o = s.option(form.Flag, 'redirect_https', _('Redirect to HTTPS'), _('Enable automatic redirection of HTTP requests to HTTPS port.')); - o.enabled = 'on'; - o.disabled = 'off'; - o.default = o.disabled; o.rmempty = false; return m.render(); diff --git a/package/luci/modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua b/package/luci/modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua deleted file mode 100644 index 91c6549163..0000000000 --- a/package/luci/modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua +++ /dev/null @@ -1,87 +0,0 @@ --- Copyright 2008 Steven Barth --- Copyright 2011 Jo-Philipp Wich --- Licensed to the public under the Apache License 2.0. - -if luci.http.formvalue("cbid.luci.1._list") then - luci.http.redirect(luci.dispatcher.build_url("admin/system/flashops/backupfiles") .. "?display=list") -elseif luci.http.formvalue("cbid.luci.1._edit") then - luci.http.redirect(luci.dispatcher.build_url("admin/system/flashops/backupfiles") .. "?display=edit") - return -end - -m = SimpleForm("luci", translate("Backup file list")) -m:append(Template("admin_system/backupfiles")) - -if luci.http.formvalue("display") ~= "list" then - f = m:section(SimpleSection, nil, translate("This is a list of shell glob patterns for matching files and directories to include during sysupgrade. Modified files in /etc/config/ and certain other configurations are automatically preserved.")) - - l = f:option(Button, "_list", translate("Show current backup file list")) - l.inputtitle = translate("Open list...") - l.inputstyle = "apply" - - c = f:option(TextValue, "_custom") - c.forcewrite = true - c.rmempty = true - c.cols = 70 - c.rows = 30 - - c.cfgvalue = function(self, section) - return nixio.fs.readfile("/etc/sysupgrade.conf") - end - - m.handle = function(self, state, data) - if state == FORM_VALID then - if data._custom then - nixio.fs.writefile("/etc/sysupgrade.conf", data._custom:gsub("\r\n", "\n")) - else - nixio.fs.writefile("/etc/sysupgrade.conf", "") - end - end - return true - end -else - m.submit = false - m.reset = false - - f = m:section(SimpleSection, nil, translate("Below is the determined list of files to backup. It consists of changed configuration files marked by opkg, essential base files and the user defined backup patterns.")) - - l = f:option(Button, "_edit", translate("Back to configuration")) - l.inputtitle = translate("Close list...") - l.inputstyle = "link" - - - d = f:option(DummyValue, "_detected") - d.rawhtml = true - d.cfgvalue = function(s) - local list = io.popen( - "( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' /etc/sysupgrade.conf " .. - "/lib/upgrade/keep.d/* 2>/dev/null) -type f 2>/dev/null; " .. - "opkg list-changed-conffiles ) | sort -u" - ) - - if list then - local files = { "
      " } - - while true do - local ln = list:read("*l") - if not ln then - break - else - files[#files+1] = "
    • " - files[#files+1] = luci.xml.pcdata(ln) - files[#files+1] = "
    • " - end - end - - list:close() - files[#files+1] = "
    " - - return table.concat(files, "") - end - - return "" .. translate("No files found") .. "" - end - -end - -return m diff --git a/package/luci/protocols/luci-proto-3g/Makefile b/package/luci/protocols/luci-proto-3g/Makefile index d1d5455dc8..487d17572b 100644 --- a/package/luci/protocols/luci-proto-3g/Makefile +++ b/package/luci/protocols/luci-proto-3g/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+comgt include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/protocols/luci-proto-bonding/Makefile b/package/luci/protocols/luci-proto-bonding/Makefile deleted file mode 100644 index 81988cfa2f..0000000000 --- a/package/luci/protocols/luci-proto-bonding/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2020 TDT AG -# -# This is free software, licensed under the Apache License Version 2.0. -# See https://www.apache.org/licenses/LICENSE-2.0 for more information. -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=Support for Link Aggregation (Channel Bonding) -LUCI_DEPENDS:=+proto-bonding - -PKG_MAINTAINER:=Helge Mader - -include ../../luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js b/package/luci/protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js deleted file mode 100644 index 4c774290f0..0000000000 --- a/package/luci/protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js +++ /dev/null @@ -1,426 +0,0 @@ -'use strict'; -'require ui'; -'require uci'; -'require form'; -'require fs'; -'require network'; -'require tools.widgets as widgets'; - - -function getSelectableSlaves(section_id) { - var rv = []; - var NonUsableMac = /^(00:00:00:00:00:00|null)/; - var interfaces = uci.sections('network', 'interface'); - - return network.getDevices().then(function(devices) { - for (var i = 0; i < devices.length; i++) { - var in_use = false; - var NotUsable = NonUsableMac.test(devices[i].getMAC()); - - // Only "real" interfaces for slaves needed - if (NotUsable == false) { - for (var j = 0; j < interfaces.length; j++) { - if (uci.get('network', interfaces[j]['.name'], 'proto') == 'bonding') { - var slaves = L.toArray(uci.get('network', interfaces[j]['.name'], 'slaves')); - - for (var k = 0; k < slaves.length; k++) { - if (devices[i].ifname == slaves[k] || devices[i].device == slaves[k]) { - if (interfaces[j]['.name'] != section_id) { - in_use = true; - } - } - } - } - } - if (in_use == false) { - devices[i].device == null ? rv.push(devices[i].ifname) : rv.push(devices[i].device) - } - } - } - - return rv.sort(); - }); -} - -function validateEmpty(section, value) { - if (value) { - return true; - } - else { - return _('Expecting: non-empty value'); - } -} - -function updatePrimaries(section, value) { - - var opt = this.map.lookupOption('slaves', section); - var selected_slaves = opt[0].formvalue(section); - - var uielem = this.map.lookupOption('primary', section)[0].getUIElement(section); - uielem.clearChoices(); - - for (var i = 0; i < selected_slaves.length; i++) { - uielem.addChoices(selected_slaves[i], selected_slaves[i]); - } - - return true; -} - -function validate_arp_policy(section, value) { - - var opt = this.map.lookupOption('link_monitoring', section); - var selected_link_monitoring = opt[0].formvalue(section); - - var opt = this.map.lookupOption('bonding_policy', section); - var selected_policy = opt[0].formvalue(section); - - if (selected_link_monitoring == 'arp') { - if (selected_policy == '802.3ad' || selected_policy == 'balance-tlb' || selected_policy == 'balance-alb') { - return _('ARP monitoring is not supported for the selected policy!'); - } - } - - return true; -} - -function validate_arp_ip_targets(section, value) { - - var opt = this.map.lookupOption('link_monitoring', section); - var selected_link_monitoring = opt[0].formvalue(section); - - var opt = this.map.lookupOption('arp_ip_target', section); - var selected_arp_ip_targets = opt[0].formvalue(section); - - var opt = this.map.lookupOption('bonding_policy', section); - var selected_policy = opt[0].formvalue(section); - - if (selected_link_monitoring == 'arp' && selected_arp_ip_targets.length == 0) { - return _('You must select at least one ARP IP target if ARP monitoring is selected!'); - } - - return true; -} - -function validate_primary_interface(section, value) { - - var opt = this.map.lookupOption('bonding_policy', section); - var selected_policy = opt[0].formvalue(section); - - var opt = this.map.lookupOption('slaves', section); - var selected_slaves = opt[0].formvalue(section); - - var opt = this.map.lookupOption('primary', section); - var selected_primary = opt[0].formvalue(section); - - if (selected_policy == 'active-backup' || selected_policy == 'balance-tlb' || selected_policy == 'balance-alb') { - if (selected_slaves.filter(function(slave) { return slave == selected_primary }).length == 0) - return _('You must select a primary interface which is included in selected slave interfaces!'); - } - - return true; -} - -return network.registerProtocol('bonding', { - getI18n: function() { - return _('Link Aggregation (Channel Bonding)'); - }, - - getIfname: function() { - return null; - }, - - getOpkgPackage: function() { - return 'bonding'; - }, - - isFloating: function() { - return true; - }, - - isCreateable: function(ifname) { - return getSelectableSlaves(ifname).then(L.bind(function(devices) { - return devices.length == 0 ? _('No more slaves available') : null; - }, this)); - - return _('No more slaves available'); - }, - - isVirtual: function() { - return true; - }, - - getDevices: function() { - return null; - }, - - containsDevice: function(ifname) { - return (network.getIfnameOf(ifname) == this.getIfname()); - }, - - renderFormOptions: function(s) { - var o; - - o = s.taboption('general', form.Value, 'ipaddr', - _('IPv4 address'), - _('The local IPv4 address')); - o.datatype = 'ip4addr'; - o.rmempty = false; - - o = s.taboption('general', form.Value, 'netmask', - _('IPv4 netmask'), - _('The local IPv4 netmask')); - o.datatype = 'ip4addr'; - o.validate = validateEmpty; - o.rmempty = false; - o.value("255.255.255.0"); - o.value("255.255.0.0"); - o.value("255.0.0.0"); - - o = s.taboption('advanced', form.MultiValue, 'slaves', - _('Slave Interfaces'), - _('Specifies which slave interfaces should be attached to this bonding interface')); - o.load = function(section_id) { - return getSelectableSlaves(section_id).then(L.bind(function(devices) { - for (var i = 0; i < devices.length; i++) { - this.value(devices[i], devices[i]); - } - - if (devices.length == 0) { - this.placeholder = _('No more slaves available, can not save interface'); - this.value('', ''); - return ''; - } - - return uci.get('network', section_id, 'slaves'); - }, this)); - }; - o.validate = updatePrimaries; - o.rmempty = false; - - o = s.taboption('advanced', form.ListValue, 'bonding_policy', - _('Bonding Policy'), - _('Specifies the mode to be used for this bonding interface')); - o.default = 'balance-rr'; - o.value('balance-rr', _('Round-Robin policy (balance-rr, 0)')); - o.value('active-backup', _('Active-Backup policy (active-backup, 1)')); - o.value('balance-xor', _('XOR policy (balance-xor, 2)')); - o.value('broadcast', _('Broadcast policy (broadcast, 3)')); - o.value('802.3ad', _('IEEE 802.3ad Dynamic link aggregation (802.3ad, 4)')); - o.value('balance-tlb', _('Adaptive transmit load balancing (balance-tlb, 5)')); - o.value('balance-alb', _('Adaptive load balancing (balance-alb, 6)')); - - o = s.taboption('advanced', widgets.DeviceSelect, 'primary', - _('Primary Slave'), - _('Specifies which slave is the primary device. It will always be the active slave while it is available')); - o.depends('bonding_policy', 'active-backup'); - o.depends('bonding_policy', 'balance-tlb'); - o.depends('bonding_policy', 'balance-alb'); - o.filter = function(section_id, value) { - // Never return anything as valid, as the valid possibilities - // will be set in the slaves validate function - return false; - }; - o.validate = validate_primary_interface; - - o = s.taboption('advanced', form.ListValue, 'primary_reselect', - _('Reselection policy for primary slave'), - _('Specifies the reselection policy for the primary slave when failure of the active slave or recovery of the primary slave occurs')); - o.default = 'always'; - o.value('always', _('Primary becomes active slave whenever it comes back up (always, 0)')); - o.value('better', _('Primary becomes active slave when it comes back up if speed and duplex better than current slave (better, 1)')); - o.value('failure', _('Only if current active slave fails and the primary slave is up (failure, 2)')); - o.depends('bonding_policy', 'active-backup'); - o.depends('bonding_policy', 'balance-tlb'); - o.depends('bonding_policy', 'balance-alb'); - - o = s.taboption('advanced', form.Value, 'min_links', - _('Minimum Number of Links'), - _('Specifies the minimum number of links that must be active before asserting carrier')); - o.datatype = 'uinteger'; - o.default = 0; - o.rmempty = false; - o.depends('bonding_policy', '802.3ad'); - - o = s.taboption('advanced', form.Value, 'ad_actor_sys_prio', - _('System Priority'), - _('Specifies the system priority')); - o.datatype = 'range(1,65535)'; - o.default = 65535; - o.rmempty = false; - o.depends('bonding_policy', '802.3ad'); - - o = s.taboption('advanced', form.Value, 'ad_actor_system', - _('MAC Address For The Actor'), - _("Specifies the mac-address for the actor in protocol packet exchanges (LACPDUs). If empty, masters' mac address defaults to system default")); - o.datatype = 'macaddr'; - o.default = ''; - o.depends('bonding_policy', '802.3ad'); - - o = s.taboption('advanced', form.ListValue, 'ad_select', - _('Aggregation Selection Logic'), - _('Specifies the aggregation selection logic to use')); - o.default = 'stable'; - o.value('stable', _('Aggregator: All slaves down or has no slaves (stable, 0)')); - o.value('bandwidth', _('Aggregator: Slave added/removed or state changes (bandwidth, 1)')); - o.value('count', _('Aggregator: Chosen by the largest number of ports + slave added/removed or state changes (count, 2)')); - o.depends('bonding_policy', '802.3ad'); - - o = s.taboption('advanced', form.ListValue, 'lacp_rate', - _('LACPDU Packets'), - _('Specifies the rate in which the link partner will be asked to transmit LACPDU packets')); - o.default = 'slow'; - o.value('slow', _('Every 30 seconds (slow, 0)')); - o.value('fast', _('Every second (fast, 1)')); - o.depends('bonding_policy', '802.3ad'); - - o = s.taboption('advanced', form.Value, 'packets_per_slave', - _('Packets To Transmit Before Moving To Next Slave'), - _("Specifies the number of packets to transmit through a slave before moving to the next one")); - o.datatype = 'range(0,65535)'; - o.default = '1'; - o.rmempty = false; - o.depends('bonding_policy', 'balance-rr'); - - o = s.taboption('advanced', form.Value, 'lp_interval', - _('Interval For Sending Learning Packets'), - _("Specifies the number of seconds between instances where the bonding driver sends learning packets to each slaves peer switch")); - o.datatype = 'range(1,2147483647)'; - o.default = '1'; - o.rmempty = false; - o.depends('bonding_policy', 'balance-tlb'); - o.depends('bonding_policy', 'balance-alb'); - - o = s.taboption('advanced', form.ListValue, 'tlb_dynamic_lb', - _('Enable Dynamic Shuffling Of Flows'), - _('Specifies whether to shuffle active flows across slaves based on the load')); - o.default = '1'; - o.value('1', _('Yes')); - o.value('0', _('No')); - o.depends('bonding_policy', 'balance-tlb'); - - o = s.taboption('advanced', form.ListValue, 'fail_over_mac', - _('Set same MAC Address to all slaves'), - _('Specifies whether active-backup mode should set all slaves to the same MAC address at enslavement')); - o.default = 'none'; - o.value('none', _('Yes (none, 0)')); - o.value('active', _('Set to currently active slave (active, 1)')); - o.value('follow', _('Set to first slave added to the bond (follow, 2)')); - o.depends('bonding_policy', 'active-backup'); - - o = s.taboption('advanced', form.Value, 'num_grat_arp__num_unsol_na', - _('Number of peer notifications after failover event'), - _("Specifies the number of peer notifications (gratuitous ARPs and unsolicited IPv6 Neighbor Advertisements) to be issued after a failover event")); - o.datatype = 'range(0,255)'; - o.default = '1'; - o.rmempty = false; - o.depends('bonding_policy', 'active-backup'); - - o = s.taboption('advanced', form.ListValue, 'xmit_hash_policy', - _('Transmit Hash Policy'), - _('Selects the transmit hash policy to use for slave selection')); - o.default = 'layer2'; - o.value('layer2', _('Use XOR of hardware MAC addresses (layer2)')); - o.value('layer2+3', _('Use XOR of hardware MAC addresses and IP addresses (layer2+3)')); - o.value('layer3+4', _('Use upper layer protocol information (layer3+4)')); - o.value('encap2+3', _('Use XOR of hardware MAC addresses and IP addresses, rely on skb_flow_dissect (encap2+3)')); - o.value('encap3+4', _('Use upper layer protocol information, rely on skb_flow_dissect (encap3+4)')); - o.depends('bonding_policy', 'balance-xor'); - o.depends('bonding_policy', 'balance-alb'); - o.depends('bonding_policy', 'balance-tlb'); - o.depends('bonding_policy', '802.3ad'); - - o = s.taboption('advanced', form.Value, 'resend_igmp', - _('Number of IGMP membership reports'), - _("Specifies the number of IGMP membership reports to be issued after a failover event in 200ms intervals")); - o.datatype = 'range(0,255)'; - o.default = '1'; - o.rmempty = false; - o.depends('bonding_policy', 'balance-tlb'); - o.depends('bonding_policy', 'balance-alb'); - - o = s.taboption('advanced', form.ListValue, 'all_slaves_active', - _('Drop Duplicate Frames'), - _('Specifies that duplicate frames (received on inactive ports) should be dropped or delivered')); - o.default = '0'; - o.value('0', _('Yes')); - o.value('1', _('No')); - - o = s.taboption('advanced', form.ListValue, 'link_monitoring', - _('Link Monitoring'), - _('Method of link monitoring')); - o.default = 'off'; - o.value('off', _('Off')); - o.value('arp', _('ARP')); - o.value('mii', _('MII')); - o.validate = validate_arp_policy; - - o = s.taboption('advanced', form.Value, 'arp_interval', - _('ARP Interval'), - _("Specifies the ARP link monitoring frequency in milliseconds")); - o.datatype = 'uinteger'; - o.default = '0'; - o.rmempty = false; - o.depends('link_monitoring', 'arp'); - - o = s.taboption('advanced', form.DynamicList, 'arp_ip_target', - _('ARP IP Targets'), - _('Specifies the IP addresses to use for ARP monitoring')); - o.datatype = 'ipaddr'; - o.cast = 'string'; - o.depends('link_monitoring', 'arp'); - o.validate = validate_arp_ip_targets; - - o = s.taboption('advanced', form.ListValue, 'arp_all_targets', - _('ARP mode to consider a slave as being up'), - _('Specifies the quantity of ARP IP targets that must be reachable')); - o.default = 'any'; - o.value('any', _('Consider the slave up when any ARP IP target is reachable (any, 0)')); - o.value('all', _('Consider the slave up when all ARP IP targets are reachable (all, 1)')); - o.depends({link_monitoring: 'arp', bonding_policy: 'active-backup'}); - - o = s.taboption('advanced', form.ListValue, 'arp_validate', - _('ARP Validation'), - _('Specifies whether ARP probes and replies should be validated or non-ARP traffic should be filtered for link monitoring')); - o.default = 'filter'; - o.value('none', _('No validation or filtering')); - o.value('active', _('Validation only for active slave')); - o.value('backup', _('Validation only for backup slaves')); - o.value('all', _('Validation for all slaves')); - o.value('filter', _('Filtering for all slaves, no validation')); - o.value('filter_active', _('Filtering for all slaves, validation only for active slave')); - o.value('filter_backup', _('Filtering for all slaves, validation only for backup slaves')); - o.depends('link_monitoring', 'arp'); - - o = s.taboption('advanced', form.Value, 'miimon', - _('MII Interval'), - _("Specifies the MII link monitoring frequency in milliseconds")); - o.datatype = 'uinteger'; - o.default = '0'; - o.rmempty = false; - o.depends('link_monitoring', 'mii'); - - o = s.taboption('advanced', form.Value, 'downdelay', - _('Down Delay'), - _("Specifies the time in milliseconds to wait before disabling a slave after a link failure detection")); - o.datatype = 'uinteger'; - o.default = '0'; - o.rmempty = false; - o.depends('link_monitoring', 'mii'); - - o = s.taboption('advanced', form.Value, 'updelay', - _('Up Delay'), - _("Specifies the time in milliseconds to wait before enabling a slave after a link recovery detection")); - o.datatype = 'uinteger'; - o.default = '0'; - o.rmempty = false; - o.depends('link_monitoring', 'mii'); - - o = s.taboption('advanced', form.ListValue, 'use_carrier', - _('Method to determine link status'), - _('Specifies whether or not miimon should use MII or ETHTOOL ioctls vs. netif_carrier_ok()')); - o.default = '1'; - o.value('0', _('MII / ETHTOOL ioctls')); - o.value('1', _('netif_carrier_ok()')); - o.depends('link_monitoring', 'mii'); - } -}); diff --git a/package/luci/protocols/luci-proto-gre/Makefile b/package/luci/protocols/luci-proto-gre/Makefile deleted file mode 100644 index 0b0fa541cb..0000000000 --- a/package/luci/protocols/luci-proto-gre/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# -# Based on luci-proto-ipip. -# Credited author of luci-proto-ipip is Roger Pueyo Centelles -# Copyright 2016 Roger Pueyo Centelles -# -# Modified by Jan Betik -# Copyright 2020 Jan Betik -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=Support for GRE tunnels (RFC2784) -LUCI_DEPENDS:=+gre - -PKG_MAINTAINER:=Jan Betik - -include ../../luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js b/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js deleted file mode 100644 index 91837b29c3..0000000000 --- a/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js +++ /dev/null @@ -1,106 +0,0 @@ -'use strict'; -'require form'; -'require network'; -'require tools.widgets as widgets'; - -network.registerPatternVirtual(/^gre4-.+$/); - -return network.registerProtocol('gre', { - getI18n: function() { - return _('GRE tunnel over IPv4'); - }, - - getIfname: function() { - return this._ubus('l3_device') || 'gre4-%s'.format(this.sid); - }, - - getOpkgPackage: function() { - return 'gre'; - }, - - isFloating: function() { - return true; - }, - - isVirtual: function() { - return true; - }, - - getDevices: function() { - return null; - }, - - containsDevice: function(ifname) { - return (network.getIfnameOf(ifname) == this.getIfname()); - }, - - renderFormOptions: function(s) { - var o; - - // -- general --------------------------------------------------------------------- - - o = s.taboption('general', form.Value, 'peeraddr', _("Remote IPv4 address or FQDN"), _("The IPv4 address or the fully-qualified domain name of the remote tunnel end.")); - o.optional = false; - o.datatype = 'or(hostname,ip4addr("nomask"))'; - - o = s.taboption('general', form.Value, 'ipaddr', _("Local IPv4 address"), _("The local IPv4 address over which the tunnel is created (optional).")); - o.optional = true; - o.datatype = 'ip4addr("nomask")'; - o.load = function(section_id) { - return network.getWANNetworks().then(L.bind(function(nets) { - if (nets.length) - this.placeholder = nets[0].getIPAddr(); - return form.Value.prototype.load.apply(this, [section_id]); - }, this)); - }; - - // -- advanced --------------------------------------------------------------------- - - o = s.taboption('advanced', widgets.NetworkSelect, 'tunlink', _("Bind interface"), _("Bind the tunnel to this interface (optional).")); - o.exclude = s.section; - o.nocreate = true; - o.optional = true; - - o = s.taboption('advanced', form.Value, 'mtu', _("Override MTU"), _("Specify an MTU (Maximum Transmission Unit) other than the default (1280 bytes) (optional).")); - o.optional = true; - o.placeholder = 1280; - o.datatype = 'range(68, 9200)'; - - o = s.taboption('advanced', form.Value, 'ttl', _("Override TTL"), _("Specify a TTL (Time to Live) for the encapsulating packet other than the default (64).")); - o.optional = true; - o.placeholder = 64; - o.datatype = 'min(1)'; - - o = s.taboption('advanced', form.Value, 'tos', _("Override TOS"), _("Specify a TOS (Type of Service). Can be inherit (the outer header inherits the value of the inner header) or an hexadecimal value 00..FF (optional).")); - o.optional = true; - o.validate = function(section_id, value) { - if (value.length > 0 && !value.match(/^[a-f0-9]{1,2}$/i) && !value.match(/^inherit$/i)) - return _("Invalid TOS value, expected 00..FF or inherit"); - - return true; - }; - - o = s.taboption('advanced', form.Flag, 'df', _("Don't Fragment"), _("Enable the DF (Don't Fragment) flag of the encapsulating packets.")); - o.default = o.enabled; - - o = s.taboption('advanced', form.Flag, 'nohostroute', _("No host route"), _("Do not create host route to peer (optional).")); - o.optional = true; - - o = s.taboption('advanced', form.Flag, 'multicast', _("Multicast"), _("Enable support for multicast traffic (optional).")); - o.optional = true; - - o = s.taboption('advanced', form.Value, 'ikey', _("Incoming key"), _("Key for incoming packets (optional).")); - o.optional = true; - o.datatype = 'integer'; - - o = s.taboption('advanced', form.Value, 'okey', _("Outgoing key"), _("Key for outgoing packets (optional).")); - o.optional = true; - o.datatype = 'integer'; - - s.taboption('advanced', form.Flag, 'icsum', _("Incoming checksum"), _("Require incoming checksum (optional).")); - s.taboption('advanced', form.Flag, 'ocsum', _("Outgoing checksum"), _("Compute outgoing checksum (optional).")); - s.taboption('advanced', form.Flag, 'iseqno', _("Incoming serialization"), _("Require incoming packets serialization (optional).")); - s.taboption('advanced', form.Flag, 'oseqno', _("Outgoing serialization"), _("Perform outgoing packets serialization (optional).")); - - } -}); diff --git a/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js b/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js deleted file mode 100644 index e1e9c8c39c..0000000000 --- a/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js +++ /dev/null @@ -1,111 +0,0 @@ -'use strict'; -'require form'; -'require network'; -'require tools.widgets as widgets'; - -network.registerPatternVirtual(/^gre4t-.+$/); - -return network.registerProtocol('gretap', { - getI18n: function() { - return _('GRETAP tunnel over IPv4'); - }, - - getIfname: function() { - return this._ubus('l3_device') || 'gre4t-%s'.format(this.sid); - }, - - getOpkgPackage: function() { - return 'gre'; - }, - - isFloating: function() { - return true; - }, - - isVirtual: function() { - return true; - }, - - getDevices: function() { - return null; - }, - - containsDevice: function(ifname) { - return (network.getIfnameOf(ifname) == this.getIfname()); - }, - - renderFormOptions: function(s) { - var o; - - // -- general --------------------------------------------------------------------- - - o = s.taboption('general', form.Value, 'peeraddr', _("Remote IPv4 address or FQDN"), _("The IPv4 address or the fully-qualified domain name of the remote tunnel end.")); - o.optional = false; - o.datatype = 'or(hostname,ip4addr("nomask"))'; - - o = s.taboption('general', form.Value, 'ipaddr', _("Local IPv4 address"), _("The local IPv4 address over which the tunnel is created (optional).")); - o.optional = true; - o.datatype = 'ip4addr("nomask")'; - o.load = function(section_id) { - return network.getWANNetworks().then(L.bind(function(nets) { - if (nets.length) - this.placeholder = nets[0].getIPAddr(); - return form.Value.prototype.load.apply(this, [section_id]); - }, this)); - }; - - o = s.taboption('general', widgets.NetworkSelect, 'network', _("Network interface"), _("Logical network to which the tunnel will be added (bridged) (optional).")); - o.exclude = s.section; - o.nocreate = true; - o.optional = true; - - // -- advanced --------------------------------------------------------------------- - - o = s.taboption('advanced', widgets.NetworkSelect, 'tunlink', _("Bind interface"), _("Bind the tunnel to this interface (optional).")); - o.exclude = s.section; - o.nocreate = true; - o.optional = true; - - o = s.taboption('advanced', form.Value, 'mtu', _("Override MTU"), _("Specify an MTU (Maximum Transmission Unit) other than the default (1280 bytes) (optional).")); - o.optional = true; - o.placeholder = 1280; - o.datatype = 'range(68, 9200)'; - - o = s.taboption('advanced', form.Value, 'ttl', _("Override TTL"), _("Specify a TTL (Time to Live) for the encapsulating packet other than the default (64) (optional).")); - o.optional = true; - o.placeholder = 64; - o.datatype = 'min(1)'; - - o = s.taboption('advanced', form.Value, 'tos', _("Override TOS"), _("Specify a TOS (Type of Service). Can be inherit (the outer header inherits the value of the inner header) or an hexadecimal value 00..FF (optional).")); - o.optional = true; - o.validate = function(section_id, value) { - if (value.length > 0 && !value.match(/^[a-f0-9]{1,2}$/i) && !value.match(/^inherit$/i)) - return _("Invalid TOS value, expected 00..FF or inherit"); - - return true; - }; - - o = s.taboption('advanced', form.Flag, 'df', _("Don't Fragment"), _("Enable the DF (Don't Fragment) flag of the encapsulating packets.")); - o.default = o.enabled; - - o = s.taboption('advanced', form.Flag, 'nohostroute', _("No host route"), _("Do not create host route to peer (optional).")); - o.optional = true; - - o = s.taboption('advanced', form.Flag, 'multicast', _("Multicast"), _("Enable support for multicast traffic (optional).")); - o.optional = true; - - o = s.taboption('advanced', form.Value, 'ikey', _("Incoming key"), _("Key for incoming packets (optional).")); - o.optional = true; - o.datatype = 'integer'; - - o = s.taboption('advanced', form.Value, 'okey', _("Outgoing key"), _("Key for outgoing packets (optional).")); - o.optional = true; - o.datatype = 'integer'; - - s.taboption('advanced', form.Flag, 'icsum', _("Incoming checksum"), _("Require incoming checksum (optional).")); - s.taboption('advanced', form.Flag, 'ocsum', _("Outgoing checksum"), _("Compute outgoing checksum (optional).")); - s.taboption('advanced', form.Flag, 'iseqno', _("Incoming serialization"), _("Require incoming packets serialization (optional).")); - s.taboption('advanced', form.Flag, 'oseqno', _("Outgoing serialization"), _("Perform outgoing packets serialization (optional).")); - - } -}); diff --git a/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js b/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js deleted file mode 100644 index 97b84754ff..0000000000 --- a/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js +++ /dev/null @@ -1,108 +0,0 @@ -'use strict'; -'require form'; -'require network'; -'require tools.widgets as widgets'; - -network.registerPatternVirtual(/^gre6-.+$/); - -return network.registerProtocol('grev6', { - getI18n: function() { - return _('GRE tunnel over IPv6'); - }, - - getIfname: function() { - return this._ubus('l3_device') || 'gre6-%s'.format(this.sid); - }, - - getOpkgPackage: function() { - return 'gre'; - }, - - isFloating: function() { - return true; - }, - - isVirtual: function() { - return true; - }, - - getDevices: function() { - return null; - }, - - containsDevice: function(ifname) { - return (network.getIfnameOf(ifname) == this.getIfname()); - }, - - renderFormOptions: function(s) { - var o; - - // -- general --------------------------------------------------------------------- - - o = s.taboption('general', form.Value, 'peer6addr', _("Remote IPv6 address or FQDN"), _("The IPv6 address or the fully-qualified domain name of the remote tunnel end.")); - o.optional = false; - o.datatype = 'or(hostname,ip6addr("nomask"))'; - - o = s.taboption('general', form.Value, 'ip6addr', _("Local IPv6 address"), _("The local IPv6 address over which the tunnel is created (optional).")); - o.optional = true; - o.datatype = 'ip6addr("nomask")'; - o.load = function(section_id) { - return network.getWAN6Networks().then(L.bind(function(nets) { - if (Array.isArray(nets) && nets.length) - this.placeholder = nets[0].getIP6Addr(); - return form.Value.prototype.load.apply(this, [section_id]); - }, this)); - }; - - o = s.taboption('general', widgets.NetworkSelect, 'weakif', _("Source interface"), _("Logical network from which to select the local endpoint if local IPv6 address is empty and no WAN IPv6 is available (optional).")); - o.exclude = s.section; - o.nocreate = true; - o.optional = true; - - // -- advanced --------------------------------------------------------------------- - - o = s.taboption('advanced', widgets.NetworkSelect, 'tunlink', _("Bind interface"), _("Bind the tunnel to this interface (optional).")); - o.exclude = s.section; - o.nocreate = true; - o.optional = true; - - o = s.taboption('advanced', form.Value, 'mtu', _("Override MTU"), _("Specify an MTU (Maximum Transmission Unit) other than the default (1280 bytes) (optional).")); - o.optional = true; - o.placeholder = 1280; - o.datatype = 'range(68, 9200)'; - - o = s.taboption('advanced', form.Value, 'ttl', _("Override TTL"), _("Specify a TTL (Time to Live) for the encapsulating packet other than the default (64) (optional).")); - o.optional = true; - o.placeholder = 64; - o.datatype = 'min(1)'; - - o = s.taboption('advanced', form.Value, 'tos', _("Traffic Class"), _("Specify a TOS (Type of Service). Can be inherit (the outer header inherits the value of the inner header) or an hexadecimal value 00..FF (optional).")); - o.optional = true; - o.validate = function(section_id, value) { - if (value.length > 0 && !value.match(/^[a-f0-9]{1,2}$/i) && !value.match(/^inherit$/i)) - return _("Invalid Traffic Class value, expected 00..FF or inherit"); - - return true; - }; - - o = s.taboption('advanced', form.Flag, 'nohostroute', _("No host route"), _("Do not create host route to peer (optional).")); - o.optional = true; - - o = s.taboption('advanced', form.Flag, 'multicast', _("Multicast"), _("Enable support for multicast traffic (optional).")); - o.optional = true; - - o = s.taboption('advanced', form.Value, 'ikey', _("Incoming key"), _("Key for incoming packets (optional).")); - o.optional = true; - o.datatype = 'integer'; - - o = s.taboption('advanced', form.Value, 'okey', _("Outgoing key"), _("Key for outgoing packets (optional).")); - o.optional = true; - o.datatype = 'integer'; - - s.taboption('advanced', form.Flag, 'icsum', _("Incoming checksum"), _("Require incoming checksum (optional).")); - s.taboption('advanced', form.Flag, 'ocsum', _("Outgoing checksum"), _("Compute outgoing checksum (optional).")); - s.taboption('advanced', form.Flag, 'iseqno', _("Incoming serialization"), _("Require incoming packets serialization (optional).")); - s.taboption('advanced', form.Flag, 'oseqno', _("Outgoing serialization"), _("Perform outgoing packets serialization (optional).")); - - } -}); diff --git a/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js b/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js deleted file mode 100644 index 6203f83557..0000000000 --- a/package/luci/protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js +++ /dev/null @@ -1,113 +0,0 @@ -'use strict'; -'require form'; -'require network'; -'require tools.widgets as widgets'; - -network.registerPatternVirtual(/^gre6t-.+$/); - -return network.registerProtocol('grev6tap', { - getI18n: function() { - return _('GRETAP tunnel over IPv6'); - }, - - getIfname: function() { - return this._ubus('l3_device') || 'gre6t-%s'.format(this.sid); - }, - - getOpkgPackage: function() { - return 'gre'; - }, - - isFloating: function() { - return true; - }, - - isVirtual: function() { - return true; - }, - - getDevices: function() { - return null; - }, - - containsDevice: function(ifname) { - return (network.getIfnameOf(ifname) == this.getIfname()); - }, - - renderFormOptions: function(s) { - var o; - - // -- general --------------------------------------------------------------------- - - o = s.taboption('general', form.Value, 'peer6addr', _("Remote IPv6 address or FQDN"), _("The IPv6 address or the fully-qualified domain name of the remote tunnel end.")); - o.optional = false; - o.datatype = 'or(hostname,ip6addr("nomask"))'; - o.load = function(section_id) { - return network.getWAN6Networks().then(L.bind(function(nets) { - if (Array.isArray(nets) && nets.length) - this.placeholder = nets[0].getIP6Addr(); - return form.Value.prototype.load.apply(this, [section_id]); - }, this)); - }; - - o = s.taboption('general', form.Value, 'ip6addr', _("Local IPv6 address"), _("The local IPv6 address over which the tunnel is created (optional).")); - o.optional = true; - o.datatype = 'ip6addr("nomask")'; - - o = s.taboption('general', widgets.NetworkSelect, 'weakif', _("Source interface"), _("Logical network from which to select the local endpoint if local IPv6 address is empty and no WAN IPv6 is available (optional).")); - o.exclude = s.section; - o.nocreate = true; - o.optional = true; - - o = s.taboption('general', widgets.NetworkSelect, 'network', _("Network interface"), _("Logical network to which the tunnel will be added (bridged) (optional).")); - o.exclude = s.section; - o.nocreate = true; - o.optional = true; - - // -- advanced --------------------------------------------------------------------- - - o = s.taboption('advanced', widgets.NetworkSelect, 'tunlink', _("Bind interface"), _("Bind the tunnel to this interface (optional).")); - o.exclude = s.section; - o.nocreate = true; - o.optional = true; - - o = s.taboption('advanced', form.Value, 'mtu', _("Override MTU"), _("Specify an MTU (Maximum Transmission Unit) other than the default (1280 bytes) (optional).")); - o.optional = true; - o.placeholder = 1280; - o.datatype = 'range(68, 9200)'; - - o = s.taboption('advanced', form.Value, 'ttl', _("Override TTL"), _("Specify a TTL (Time to Live) for the encapsulating packet other than the default (64) (optional).")); - o.optional = true; - o.placeholder = 64; - o.datatype = 'min(1)'; - - o = s.taboption('advanced', form.Value, 'tos', _("Traffic Class"), _("Specify a Traffic Class. Can be inherit (the outer header inherits the value of the inner header) or an hexadecimal value 00..FF (optional).")); - o.optional = true; - o.validate = function(section_id, value) { - if (value.length > 0 && !value.match(/^[a-f0-9]{1,2}$/i) && !value.match(/^inherit$/i)) - return _("Invalid Traffic Class value, expected 00..FF or inherit"); - - return true; - }; - - o = s.taboption('advanced', form.Flag, 'nohostroute', _("No host route"), _("Do not create host route to peer (optional).")); - o.optional = true; - - o = s.taboption('advanced', form.Flag, 'multicast', _("Multicast"), _("Enable support for multicast traffic (optional).")); - o.optional = true; - - o = s.taboption('advanced', form.Value, 'ikey', _("Incoming key"), _("Key for incoming packets (optional).")); - o.optional = true; - o.datatype = 'integer'; - - o = s.taboption('advanced', form.Value, 'okey', _("Outgoing key"), _("Key for outgoing packets (optional).")); - o.optional = true; - o.datatype = 'integer'; - - s.taboption('advanced', form.Flag, 'icsum', _("Incoming checksum"), _("Require incoming checksum (optional).")); - s.taboption('advanced', form.Flag, 'ocsum', _("Outgoing checksum"), _("Compute outgoing checksum (optional).")); - s.taboption('advanced', form.Flag, 'iseqno', _("Incoming serialization"), _("Require incoming packets serialization (optional).")); - s.taboption('advanced', form.Flag, 'oseqno', _("Outgoing serialization"), _("Perform outgoing packets serialization (optional).")); - - } -}); diff --git a/package/luci/protocols/luci-proto-hnet/Makefile b/package/luci/protocols/luci-proto-hnet/Makefile index 10beb032bc..1db66dba8a 100644 --- a/package/luci/protocols/luci-proto-hnet/Makefile +++ b/package/luci/protocols/luci-proto-hnet/Makefile @@ -14,4 +14,4 @@ PKG_MAINTAINER:=Steven Barth include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/protocols/luci-proto-ipip/Makefile b/package/luci/protocols/luci-proto-ipip/Makefile index 6af85647e5..ad27fca922 100644 --- a/package/luci/protocols/luci-proto-ipip/Makefile +++ b/package/luci/protocols/luci-proto-ipip/Makefile @@ -13,4 +13,4 @@ PKG_MAINTAINER:=Roger Pueyo Centelles include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/protocols/luci-proto-ipv6/Makefile b/package/luci/protocols/luci-proto-ipv6/Makefile index b0c8395e86..674f0462ce 100644 --- a/package/luci/protocols/luci-proto-ipv6/Makefile +++ b/package/luci/protocols/luci-proto-ipv6/Makefile @@ -13,4 +13,4 @@ PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/protocols/luci-proto-modemmanager/Makefile b/package/luci/protocols/luci-proto-modemmanager/Makefile deleted file mode 100644 index c2718dd0ae..0000000000 --- a/package/luci/protocols/luci-proto-modemmanager/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# -# Copyright (C) 2008-2014 The LuCI Team -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=Support for ModemManager -LUCI_DEPENDS:=+modemmanager - -include ../../luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js b/package/luci/protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js deleted file mode 100644 index 501f759646..0000000000 --- a/package/luci/protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js +++ /dev/null @@ -1,139 +0,0 @@ -'use strict'; -'require fs'; -'require form'; -'require network'; - -function getModemList() { - return fs.exec_direct('/usr/bin/mmcli', [ '-L' ]).then(function(res) { - var lines = (res || '').split(/\n/), - tasks = []; - - for (var i = 0; i < lines.length; i++) { - var m = lines[i].match(/\/Modem\/(\d+)/); - if (m) - tasks.push(fs.exec_direct('/usr/bin/mmcli', [ '-m', m[1] ])); - } - - return Promise.all(tasks).then(function(res) { - var modems = []; - - for (var i = 0; i < res.length; i++) { - var man = res[i].match(/manufacturer: ([^\n]+)/), - mod = res[i].match(/model: ([^\n]+)/), - dev = res[i].match(/device: ([^\n]+)/); - - if (dev) { - modems.push({ - device: dev[1].trim(), - manufacturer: (man ? man[1].trim() : '') || '?', - model: (mod ? mod[1].trim() : '') || dev[1].trim() - }); - } - } - - return modems; - }); - }); -} - -network.registerPatternVirtual(/^mobiledata-.+$/); -network.registerErrorCode('MM_CONNECT_FAILED', _('Connection attempt failed.')); -network.registerErrorCode('MM_DISCONNECT_IN_PROGRESS', _('Modem disconnection in progress. Please wait.')); -network.registerErrorCode('MM_CONNECT_IN_PROGRESS', _('Modem connection in progress. Please wait. This process will timeout after 2 minutes.')); -network.registerErrorCode('MM_TEARDOWN_IN_PROGRESS', _('Modem bearer teardown in progress.')); -network.registerErrorCode('MM_MODEM_DISABLED', _('Modem is disabled.')); -network.registerErrorCode('DEVICE_NOT_MANAGED', _('Device not managed by ModemManager.')); -network.registerErrorCode('INVALID_BEARER_LIST', _('Invalid bearer list. Possibly too many bearers created. This protocol supports one and only one bearer.')); -network.registerErrorCode('UNKNOWN_METHOD', _('Unknown and unsupported connection method.')); -network.registerErrorCode('DISCONNECT_FAILED', _('Disconnection attempt failed.')); - -return network.registerProtocol('modemmanager', { - getI18n: function() { - return _('ModemManager'); - }, - - getIfname: function() { - return this._ubus('l3_device') || 'modemmanager-%s'.format(this.sid); - }, - - getOpkgPackage: function() { - return 'modemmanager'; - }, - - isFloating: function() { - return true; - }, - - isVirtual: function() { - return true; - }, - - getDevices: function() { - return null; - }, - - containsDevice: function(ifname) { - return (network.getIfnameOf(ifname) == this.getIfname()); - }, - - renderFormOptions: function(s) { - var dev = this.getL3Device() || this.getDevice(), o; - - o = s.taboption('general', form.ListValue, '_modem_device', _('Modem device')); - o.ucioption = 'device'; - o.rmempty = false; - o.load = function(section_id) { - return getModemList().then(L.bind(function(devices) { - for (var i = 0; i < devices.length; i++) - this.value(devices[i].device, - '%s - %s'.format(devices[i].manufacturer, devices[i].model)); - return form.Value.prototype.load.apply(this, [section_id]); - }, this)); - }; - - o = s.taboption('general', form.Value, 'apn', _('APN')); - o.validate = function(section_id, value) { - if (value == null || value == '') - return true; - - if (!/^[a-zA-Z0-9\-.]*[a-zA-Z0-9]$/.test(value)) - return _('Invalid APN provided'); - - return true; - }; - - o = s.taboption('general', form.Value, 'pincode', _('PIN')); - o.datatype = 'and(uinteger,minlength(4),maxlength(8))'; - - o = s.taboption('general', form.ListValue, 'auth', _('Authentication Type')); - o.value('both', _('PAP/CHAP (both)')); - o.value('pap', 'PAP'); - o.value('chap', 'CHAP'); - o.value('none', _('None')); - o.default = 'none'; - - o = s.taboption('general', form.Value, 'username', _('PAP/CHAP username')); - o.depends('auth', 'pap'); - o.depends('auth', 'chap'); - o.depends('auth', 'both'); - - o = s.taboption('general', form.Value, 'password', _('PAP/CHAP password')); - o.depends('auth', 'pap'); - o.depends('auth', 'chap'); - o.depends('auth', 'both'); - o.password = true; - - o = s.taboption('general', form.ListValue, 'iptype', _('IP Type')); - o.value('ipv4v6', _('IPv4/IPv6 (both - defaults to IPv4)')) - o.value('ipv4', _('IPv4 only')); - o.value('ipv6', _('IPv6 only')); - o.default = 'ipv4v6'; - - o = s.taboption('advanced', form.Value, 'mtu', _('Override MTU')); - o.placeholder = dev ? (dev.getMTU() || '1500') : '1500'; - o.datatype = 'max(9200)'; - - o = s.taboption('general', form.Value, 'signalrate', _('Signal Refresh Rate'), _("In seconds")); - o.datatype = 'uinteger'; - } -}); diff --git a/package/luci/protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json b/package/luci/protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json deleted file mode 100644 index 716f4c4655..0000000000 --- a/package/luci/protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "luci-proto-modemmanager": { - "description": "Grant access to mmcli", - "read": { - "cgi-io": [ "exec" ], - "file": { - "/usr/bin/mmcli -L": [ "exec" ], - "/usr/bin/mmcli -m [0-9]": [ "exec" ] - } - } - } -} diff --git a/package/luci/protocols/luci-proto-ncm/Makefile b/package/luci/protocols/luci-proto-ncm/Makefile index 5fd9c9a266..51ff535455 100644 --- a/package/luci/protocols/luci-proto-ncm/Makefile +++ b/package/luci/protocols/luci-proto-ncm/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+comgt-ncm include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js b/package/luci/protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js index 8ff4a15506..28d65fceb1 100644 --- a/package/luci/protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js +++ b/package/luci/protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js @@ -18,12 +18,16 @@ var callFileList = rpc.declare({ }); network.registerPatternVirtual(/^ncm-.+$/); -network.registerErrorCode('CONFIGURE_FAILED', _('Configuration failed')); -network.registerErrorCode('DISCONNECT_FAILED', _('Disconnection attempt failed')); -network.registerErrorCode('FINALIZE_FAILED', _('Finalizing failed')); -network.registerErrorCode('GETINFO_FAILED', _('Modem information query failed')); -network.registerErrorCode('INITIALIZE_FAILED', _('Initialization failure')); -network.registerErrorCode('SETMODE_FAILED', _('Setting operation mode failed')); +network.registerErrorCode('CONFIGURE_FAILED', _('Failed to configure modem')); +network.registerErrorCode('CONNECT_FAILED', _('Failed to connect')); +network.registerErrorCode('DISCONNECT_FAILED', _('Failed to disconnect')); +network.registerErrorCode('FINALIZE_FAILED', _('Finalizing failed')); +network.registerErrorCode('GETINFO_FAILED', _('Failed to get modem information')); +network.registerErrorCode('INITIALIZE_FAILED', _('Failed to initialize modem')); +network.registerErrorCode('NO_DEVICE', _('No control device specified')); +network.registerErrorCode('NO_IFACE', _('The interface could not be found')); +network.registerErrorCode('PIN_FAILED', _('Unable to verify PIN')); +network.registerErrorCode('SETMODE_FAILED', _('Failed to set operating mode')); network.registerErrorCode('UNSUPPORTED_MODEM', _('Unsupported modem')); return network.registerProtocol('ncm', { @@ -103,9 +107,6 @@ return network.registerProtocol('ncm', { o = s.taboption('general', form.Value, 'password', _('PAP/CHAP password')); o.password = true; - o = s.taboption('general', form.Value, 'dialnumber', _('Dial number')); - o.placeholder = '*99***1#'; - if (L.hasSystemFeature('ipv6')) { o = s.taboption('advanced', form.ListValue, 'ppp_ipv6', _('Obtain IPv6 address')); o.ucioption = 'ipv6'; @@ -115,8 +116,8 @@ return network.registerProtocol('ncm', { o.default = 'auto'; } - o = s.taboption('advanced', form.Value, 'delay', _('Modem init timeout'), _('Maximum amount of seconds to wait for the modem to become ready')); - o.placeholder = '10'; - o.datatype = 'min(1)'; + o = s.taboption('advanced', form.Value, 'delay', _('Modem init timeout'), _('Amount of seconds to wait for the modem to become ready')); + o.placeholder = '0'; + o.datatype = 'min(0)'; } }); diff --git a/package/luci/protocols/luci-proto-ppp/Makefile b/package/luci/protocols/luci-proto-ppp/Makefile index dd1859ef54..4426dc7312 100644 --- a/package/luci/protocols/luci-proto-ppp/Makefile +++ b/package/luci/protocols/luci-proto-ppp/Makefile @@ -13,4 +13,4 @@ PKG_LICENSE:=Apache-2.0 include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/protocols/luci-proto-pppossh/Makefile b/package/luci/protocols/luci-proto-pppossh/Makefile deleted file mode 100644 index 1c0a63b0f2..0000000000 --- a/package/luci/protocols/luci-proto-pppossh/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2018 Florian Eckert -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=Support for pppossh -LUCI_DEPENDS:=+pppossh - -PKG_LICENSE:=Apache-2.0 -PKG_MAINTAINER:=Yousong Zhou - -include ../../luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js b/package/luci/protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js deleted file mode 100644 index 52cf481a5e..0000000000 --- a/package/luci/protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js +++ /dev/null @@ -1,128 +0,0 @@ -'use strict'; -'require uci'; -'require form'; -'require network'; - -network.registerPatternVirtual(/^pppossh-.+$/); - -function write_keepalive(section_id, value) { - var f_opt = this.map.lookupOption('_keepalive_failure', section_id), - i_opt = this.map.lookupOption('_keepalive_interval', section_id), - f = (f_opt != null) ? +f_opt[0].formvalue(section_id) : null, - i = (i_opt != null) ? +i_opt[0].formvalue(section_id) : null; - - if (f == null || f == '' || isNaN(f)) - f = 0; - - if (i == null || i == '' || isNaN(i) || i < 1) - i = 1; - - if (f > 0) - uci.set('network', section_id, 'keepalive', '%d %d'.format(f, i)); - else - uci.unset('network', section_id, 'keepalive'); -} - -return network.registerProtocol('pppossh', { - getI18n: function() { - return _('PPPoSSH'); - }, - - getIfname: function() { - return this._ubus('l3_device') || 'pppossh-%s'.format(this.sid); - }, - - getOpkgPackage: function() { - return 'pppossh'; - }, - - isFloating: function() { - return true; - }, - - isVirtual: function() { - return true; - }, - - getDevices: function() { - return null; - }, - - containsDevice: function(ifname) { - return (network.getIfnameOf(ifname) == this.getIfname()); - }, - - renderFormOptions: function(s) { - var o; - - o = s.taboption('general', form.Value, 'sshuser', _('SSH username')); - o.rmempty = false; - o.validate = function(section_id, value) { - var id_opt = this.section.children.filter(function(o) { return o.option == 'identity' })[0]; - if (id_opt && value.length) { - var input = this.map.findElement('id', id_opt.cbid(section_id)).querySelector('input[type="text"]'); - if (input) - input.placeholder = (value == 'root' ? '/root' : '/home/' + value) + '/.ssh/id_rsa'; - } - return true; - }; - - o = s.taboption('general', form.Value, 'server', _('SSH server address')); - o.datatype = 'host(0)'; - o.rmempty = false; - - o = s.taboption('general', form.Value, 'port', _('SSH server port')); - o.datatype = 'port'; - o.optional = true; - o.placeholder = 22; - - o = s.taboption('general', form.Value, 'ssh_options', _('Extra SSH command options')); - o.optional = true; - - o = s.taboption('general', form.DynamicList, 'identity', _('List of SSH key files for auth')); - o.optional = true; - o.datatype = 'file'; - - o = s.taboption('general', form.Value, 'ipaddr', _('Local IP address to assign')); - o.datatype = 'ipaddr("nomask")'; - - o = s.taboption('general', form.Value, 'peeraddr', _('Peer IP address to assign')); - o.datatype = 'ipaddr("nomask")'; - - if (L.hasSystemFeature('ipv6')) { - o = s.taboption('advanced', form.Flag, 'ppp_ipv6', _('Obtain IPv6 address'), _('Enable IPv6 negotiation on the PPP link')); - o.ucioption = 'ipv6'; - o.default = o.disabled; - } - - o = s.taboption('advanced', form.Value, '_keepalive_failure', _('LCP echo failure threshold'), _('Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures')); - o.placeholder = '0'; - o.datatype = 'uinteger'; - o.write = write_keepalive; - o.remove = write_keepalive; - o.cfgvalue = function(section_id) { - var v = uci.get('network', section_id, 'keepalive'); - if (typeof(v) == 'string' && v != '') { - var m = v.match(/^(\d+)[ ,]\d+$/); - return m ? m[1] : v; - } - }; - - o = s.taboption('advanced', form.Value, '_keepalive_interval', _('LCP echo interval'), _('Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold')); - o.placeholder = '5'; - o.datatype = 'min(1)'; - o.write = write_keepalive; - o.remove = write_keepalive; - o.cfgvalue = function(section_id) { - var v = uci.get('network', section_id, 'keepalive'); - if (typeof(v) == 'string' && v != '') { - var m = v.match(/^\d+[ ,](\d+)$/); - return m ? m[1] : v; - } - }; - - o = s.taboption('advanced', form.Value, 'demand', _('Inactivity timeout'), _('Close inactive connection after the given amount of seconds, use 0 to persist connection')); - o.placeholder = '0'; - o.datatype = 'uinteger'; - } -}); diff --git a/package/luci/protocols/luci-proto-qmi/Makefile b/package/luci/protocols/luci-proto-qmi/Makefile index 8b2b5e37eb..3fecdc1b52 100644 --- a/package/luci/protocols/luci-proto-qmi/Makefile +++ b/package/luci/protocols/luci-proto-qmi/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+uqmi include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/protocols/luci-proto-relay/Makefile b/package/luci/protocols/luci-proto-relay/Makefile index d9c04f76a8..b846da6e9d 100644 --- a/package/luci/protocols/luci-proto-relay/Makefile +++ b/package/luci/protocols/luci-proto-relay/Makefile @@ -11,4 +11,4 @@ LUCI_DEPENDS:=+relayd include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/protocols/luci-proto-sstp/Makefile b/package/luci/protocols/luci-proto-sstp/Makefile deleted file mode 100644 index afb4e1a379..0000000000 --- a/package/luci/protocols/luci-proto-sstp/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -# -# Copyright (C) 2020 Robert Koszewski -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=Support for SSTP -LUCI_DEPENDS:=+sstp-client -LUCI_PKGARCH:=all - -include ../../luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js b/package/luci/protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js deleted file mode 100644 index 6a23407b50..0000000000 --- a/package/luci/protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; -'require form'; -'require network'; - -network.registerPatternVirtual(/^sstp-.+$/); - -return network.registerProtocol('sstp', { - getI18n: function() { - return _('SSTP'); - }, - - getIfname: function() { - return this._ubus('l3_device') || 'sstp-%s'.format(this.sid); - }, - - getOpkgPackage: function() { - return 'sstp-client'; - }, - - isFloating: function() { - return true; - }, - - isVirtual: function() { - return true; - }, - - getDevices: function() { - return null; - }, - - containsDevice: function(ifname) { - return (network.getIfnameOf(ifname) == this.getIfname()); - }, - - renderFormOptions: function(s) { - var dev = this.getL3Device() || this.getDevice(), o; - - // -- general --------------------------------------------------------------------- - - o = s.taboption('general', form.Value, 'server', _('SSTP Server')); - o.datatype = 'host'; - - o = s.taboption('general', form.Value, 'username', _('PAP/CHAP username')); - - o = s.taboption('general', form.Value, 'password', _('PAP/CHAP password')); - o.password = true; - - // -- advanced -------------------------------------------------------------------- - - o = s.taboption('advanced', form.Flag, 'ppp_ipv6', _('IPv6 support'), _('If checked, adds "+ipv6" to the pppd options')); - o.ucioption = 'ipv6'; - - o = s.taboption('advanced', form.ListValue, 'log_level', _('sstpc Log-level')); - o.value('0', _('0', 'sstp log level value')); - o.value('1', _('1', 'sstp log level value')); - o.value('2', _('2', 'sstp log level value')); - o.value('3', _('3', 'sstp log level value')); - o.value('4', _('4', 'sstp log level value')); - o.default = '0'; - - o = s.taboption('advanced', form.Value, 'mtu', _('Override MTU')); - o.placeholder = dev ? (dev.getMTU() || '1500') : '1500'; - o.datatype = 'max(9200)'; - - o = s.taboption('advanced', form.Value, 'sstp_options', _('Extra sstpc options'), _('e.g: --proxy 10.10.10.10')); - - o = s.taboption('advanced', form.Value, 'pppd_options', _('Extra pppd options'), _('e.g: dump')); - } -}); diff --git a/package/luci/protocols/luci-proto-vxlan/Makefile b/package/luci/protocols/luci-proto-vxlan/Makefile deleted file mode 100644 index d6b2e6faaa..0000000000 --- a/package/luci/protocols/luci-proto-vxlan/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# -# Copyright 2020 Wojciech Jowsa -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=Support for Virtual eXtensible Local Area Network (VXLAN, RFC7348) -LUCI_DEPENDS:=+vxlan - -PKG_MAINTAINER:=Wojciech Jowsa - -include ../../luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js b/package/luci/protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js deleted file mode 100644 index 1d5052fdfc..0000000000 --- a/package/luci/protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict'; -'require form'; -'require network'; -'require tools.widgets as widgets'; - -network.registerPatternVirtual(/^vxlan-.+$/); - -return network.registerProtocol('vxlan', { - getI18n: function() { - return _('VXLAN (RFC7348)'); - }, - - getIfname: function() { - return this._ubus('l3_device') || 'vxlan-%s'.format(this.sid); - }, - - getOpkgPackage: function() { - return 'vxlan'; - }, - - isFloating: function() { - return true; - }, - - isVirtual: function() { - return true; - }, - - getDevices: function() { - return null; - }, - - containsDevice: function(ifname) { - return (network.getIfnameOf(ifname) == this.getIfname()); - }, - - renderFormOptions: function(s) { - var o; - - o = s.taboption('general', form.Value, 'peeraddr', _('Remote IPv4 address'), _('The IPv4 address or the fully-qualified domain name of the remote end.')); - o.optional = false; - o.datatype = 'or(hostname,ip4addr("nomask"))'; - - o = s.taboption('general', form.Value, 'ipaddr', _('Local IPv4 address'), _('The local IPv4 address over which the tunnel is created (optional).')); - o.optional = true; - o.datatype = 'ip4addr("nomask")'; - - o = s.taboption('general', form.Value, 'port', _('Destination port')); - o.optional = true; - o.placeholder = 4789; - o.datatype = 'port'; - - o = s.taboption('general', form.Value, 'vid', _('VXLAN network identifier'), _('ID used to uniquely identify the VXLAN')); - o.optional = true; - o.datatype = 'range(1, 16777216)'; - - o = s.taboption('general', widgets.NetworkSelect, 'tunlink', _('Bind interface'), _('Bind the tunnel to this interface (optional).')); - o.exclude = s.section; - o.nocreate = true; - o.optional = true; - - o = s.taboption('advanced', form.Value, 'ttl', _('Override TTL'), _('Specify a TTL (Time to Live) for the encapsulating packet other than the default (64).')); - o.optional = true; - o.placeholder = 64; - o.datatype = 'min(1)'; - - o = s.taboption('advanced', form.Value, 'tos', _('Override TOS'), _('Specify a TOS (Type of Service).')); - o.optional = true; - o.datatype = 'range(0, 255)'; - - o = s.taboption('advanced', form.Flag, 'rxcsum', _('Enable rx checksum')); - o.optional = true; - o.default = o.enabled; - - o = s.taboption('advanced', form.Flag, 'txcsum', _('Enable tx checksum')); - o.optional = true; - o.default = o.enabled; - - } -}); diff --git a/package/luci/protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js b/package/luci/protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js deleted file mode 100644 index 30250cdcfa..0000000000 --- a/package/luci/protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js +++ /dev/null @@ -1,75 +0,0 @@ -'use strict'; -'require form'; -'require network'; -'require tools.widgets as widgets'; - -network.registerPatternVirtual(/^vxlan-.+$/); - -return network.registerProtocol('vxlan6', { - getI18n: function() { - return _('VXLANv6 (RFC7348)'); - }, - - getIfname: function() { - return this._ubus('l3_device') || 'vxlan-%s'.format(this.sid); - }, - - getOpkgPackage: function() { - return 'vxlan'; - }, - - isFloating: function() { - return true; - }, - - isVirtual: function() { - return true; - }, - - getDevices: function() { - return null; - }, - - containsDevice: function(ifname) { - return (network.getIfnameOf(ifname) == this.getIfname()); - }, - - renderFormOptions: function(s) { - var o; - - o = s.taboption('general', form.Value, 'peer6addr', _('Remote IPv6 address'), _('The IPv6 address or the fully-qualified domain name of the remote end.')); - o.optional = false; - o.datatype = 'or(hostname,cidr6)'; - - o = s.taboption('general', form.Value, 'ip6addr', _('Local IPv6 address'), _('The local IPv6 address over which the tunnel is created (optional).')); - o.optional = true; - o.datatype = 'cidr6'; - - o = s.taboption('general', form.Value, 'vid', _('VXLAN network identifier'), _('ID used to uniquely identify the VXLAN')); - o.optional = true; - o.datatype = 'range(1, 16777216)'; - - o = s.taboption('general', widgets.NetworkSelect, 'tunlink', _('Bind interface'), _('Bind the tunnel to this interface (optional).')); - o.exclude = s.section; - o.nocreate = true; - o.optional = true; - - o = s.taboption('advanced', form.Value, 'ttl', _('Override TTL'), _('Specify a TTL (Time to Live) for the encapsulating packet other than the default (64).')); - o.optional = true; - o.placeholder = 64; - o.datatype = 'min(1)'; - - o = s.taboption('advanced', form.Value, 'tos', _('Override TOS'), _('Specify a TOS (Type of Service).')); - o.optional = true; - o.datatype = 'range(0, 255)'; - - o = s.taboption('advanced', form.Flag, 'rxcsum', _('Enable rx checksum')); - o.optional = true; - o.default = o.enabled; - - o = s.taboption('advanced', form.Flag, 'txcsum', _('Enable tx checksum')); - o.optional = true; - o.default = o.enabled; - - } -}); diff --git a/package/luci/protocols/luci-proto-wireguard/Makefile b/package/luci/protocols/luci-proto-wireguard/Makefile index 75c5e1868f..de14abcbd6 100644 --- a/package/luci/protocols/luci-proto-wireguard/Makefile +++ b/package/luci/protocols/luci-proto-wireguard/Makefile @@ -7,9 +7,11 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=Support for WireGuard VPN -LUCI_DEPENDS:=+wireguard-tools +libuci-lua +LUCI_DEPENDS:=+wireguard-tools +ucode LUCI_PKGARCH:=all +PKG_PROVIDES:=luci-app-wireguard + include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js b/package/luci/protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js index 068cc7b0c1..58537f38f8 100644 --- a/package/luci/protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js +++ b/package/luci/protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js @@ -361,10 +361,8 @@ return network.registerProtocol('wireguard', { s.getOption('listen_port').getUIElement(s.section).setValue(config.interface_listenport || ''); s.getOption('addresses').getUIElement(s.section).setValue(config.interface_address); - if (config.interface_dns) { - s.getOption('peerdns').getUIElement(s.section).setValue('0'); + if (config.interface_dns) s.getOption('dns').getUIElement(s.section).setValue(config.interface_dns); - } for (var i = 0; i < config.peers.length; i++) { var pconf = config.peers[i]; @@ -702,6 +700,11 @@ return network.registerProtocol('wireguard', { eport = this.section.formvalue(section_id, 'endpoint_port'), keep = this.section.formvalue(section_id, 'persistent_keepalive'); + // If endpoint is IPv6 we must escape it with [] + if (endpoint.indexOf(':') > 0) { + endpoint = '['+endpoint+']'; + } + return [ '[Interface]', 'PrivateKey = ' + prv, @@ -732,8 +735,8 @@ return network.registerProtocol('wireguard', { var hostnames = []; uci.sections('ddns', 'service', function(s) { - if (typeof(s.domain) == 'string' && s.enabled == '1') - hostnames.push(s.domain); + if (typeof(s.lookup_host) == 'string' && s.enabled == '1') + hostnames.push(s.lookup_host); }); uci.sections('system', 'system', function(s) { @@ -751,7 +754,7 @@ return network.registerProtocol('wireguard', { var qrm, qrs, qro; - qrm = new form.JSONMap({ config: { endpoint: hostnames[0], allowed_ips: ips } }, null, _('The generated configuration can be imported into a WireGuard client application to setup a connection towards this device.')); + qrm = new form.JSONMap({ config: { endpoint: hostnames[0], allowed_ips: ips } }, null, _('The generated configuration can be imported into a WireGuard client application to set up a connection towards this device.')); qrm.parent = parent; qrs = qrm.section(form.NamedSection, 'config'); diff --git a/package/luci/protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js b/package/luci/protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js new file mode 100644 index 0000000000..4344c36739 --- /dev/null +++ b/package/luci/protocols/luci-proto-wireguard/htdocs/luci-static/resources/view/wireguard/status.js @@ -0,0 +1,175 @@ +'use strict'; +'require view'; +'require rpc'; +'require poll'; +'require dom'; +'require ui'; + + +var callGetWgInstances = rpc.declare({ + object: 'luci.wireguard', + method: 'getWgInstances' +}); + +function timestampToStr(timestamp) { + if (timestamp < 1) + return _('Never', 'No WireGuard peer handshake yet'); + + var seconds = (Date.now() / 1000) - timestamp; + var ago; + + if (seconds < 60) + ago = _('%ds ago').format(seconds); + else if (seconds < 3600) + ago = _('%dm ago').format(seconds / 60); + else if (seconds < 86401) + ago = _('%dh ago').format(seconds / 3600); + else + ago = _('over a day ago'); + + return (new Date(timestamp * 1000)).toUTCString() + ' (' + ago + ')'; +} + +function handleInterfaceDetails(iface) { + ui.showModal(_('Instance Details'), [ + ui.itemlist(E([]), [ + _('Name'), iface.name, + _('Public Key'), E('code', [ iface.public_key ]), + _('Listen Port'), iface.listen_port, + _('Firewall Mark'), iface.fwmark != 'off' ? iface.fwmark : E('em', _('none')) + ]), + E('div', { 'class': 'right' }, [ + E('button', { + 'class': 'btn cbi-button', + 'click': ui.hideModal + }, [ _('Dismiss') ]) + ]) + ]); +} + +function handlePeerDetails(peer) { + ui.showModal(_('Peer Details'), [ + ui.itemlist(E([]), [ + _('Description'), peer.name, + _('Public Key'), E('code', [ peer.public_key ]), + _('Endpoint'), peer.endpoint, + _('Allowed IPs'), (Array.isArray(peer.allowed_ips) && peer.allowed_ips.length) ? peer.allowed_ips.join(', ') : E('em', _('none')), + _('Received Data'), '%1024mB'.format(peer.transfer_rx), + _('Transmitted Data'), '%1024mB'.format(peer.transfer_tx), + _('Latest Handshake'), timestampToStr(+peer.latest_handshake), + _('Keep-Alive'), (peer.persistent_keepalive != 'off') ? _('every %ds', 'WireGuard keep alive interval').format(+peer.persistent_keepalive) : E('em', _('none')), + ]), + E('div', { 'class': 'right' }, [ + E('button', { + 'class': 'btn cbi-button', + 'click': ui.hideModal + }, [ _('Dismiss') ]) + ]) + ]); +} + +function renderPeerTable(instanceName, peers) { + var t = new L.ui.Table( + [ + _('Peer'), + _('Endpoint'), + _('Data Received'), + _('Data Transmitted'), + _('Latest Handshake') + ], + { + id: 'peers-' + instanceName + }, + E('em', [ + _('No peers connected') + ]) + ); + + t.update(peers.map(function(peer) { + return [ + [ + peer.name || '', + E('div', { + 'style': 'cursor:pointer', + 'click': ui.createHandlerFn(this, handlePeerDetails, peer) + }, [ + E('p', [ + peer.name ? E('span', [ peer.name ]) : E('em', [ _('Untitled peer') ]) + ]), + E('span', { + 'class': 'ifacebadge hide-sm', + 'data-tooltip': _('Public key: %h', 'Tooltip displaying full WireGuard peer public key').format(peer.public_key) + }, [ + E('code', [ peer.public_key.replace(/^(.{5}).+(.{6})$/, '$1…$2') ]) + ]) + ]) + ], + peer.endpoint, + [ +peer.transfer_rx, '%1024mB'.format(+peer.transfer_rx) ], + [ +peer.transfer_tx, '%1024mB'.format(+peer.transfer_tx) ], + [ +peer.latest_handshake, timestampToStr(+peer.latest_handshake) ] + ]; + })); + + return t.render(); +} + +return view.extend({ + renderIfaces: function(ifaces) { + var res = [ + E('h2', [ _('WireGuard Status') ]) + ]; + + for (var instanceName in ifaces) { + res.push( + E('h3', [ _('Instance "%h"', 'WireGuard instance heading').format(instanceName) ]), + E('p', { + 'style': 'cursor:pointer', + 'click': ui.createHandlerFn(this, handleInterfaceDetails, ifaces[instanceName]) + }, [ + E('span', { 'class': 'ifacebadge' }, [ + E('img', { 'src': L.resource('icons', 'tunnel.png') }), + '\xa0', + instanceName + ]), + E('span', { 'style': 'opacity:.8' }, [ + ' · ', + _('Port %d', 'WireGuard listen port').format(ifaces[instanceName].listen_port), + ' · ', + E('code', { 'click': '' }, [ ifaces[instanceName].public_key ]) + ]) + ]), + renderPeerTable(instanceName, ifaces[instanceName].peers) + ); + } + + if (res.length == 1) + res.push(E('p', { 'class': 'center', 'style': 'margin-top:5em' }, [ + E('em', [ _('No WireGuard interfaces configured.') ]) + ])); + + return E([], res); + }, + + render: function() { + poll.add(L.bind(function () { + return callGetWgInstances().then(L.bind(function(ifaces) { + dom.content( + document.querySelector('#view'), + this.renderIfaces(ifaces) + ); + }, this)); + }, this), 5); + + return E([], [ + E('h2', [ _('WireGuard Status') ]), + E('p', { 'class': 'center', 'style': 'margin-top:5em' }, [ + E('em', [ _('Loading data…') ]) + ]) + ]); + }, + + handleReset: null, + handleSaveApply: null, + handleSave: null +}); diff --git a/package/luci/protocols/luci-proto-wireguard/root/usr/libexec/rpcd/luci.wireguard b/package/luci/protocols/luci-proto-wireguard/root/usr/libexec/rpcd/luci.wireguard deleted file mode 100755 index a42b6fac85..0000000000 --- a/package/luci/protocols/luci-proto-wireguard/root/usr/libexec/rpcd/luci.wireguard +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env lua - -local json = require "luci.jsonc" -local util = require "luci.util" -local sys = require "luci.sys" -local io = require "io" -local uci = require "uci" -local fs = require "nixio.fs" - -local methods = { - generatePsk = { - call = function() - local psk = sys.exec("wg genpsk"):sub(1, -2) - - return {psk = psk} - end - }, - generateKeyPair = { - call = function() - local prv = sys.exec("wg genkey 2>/dev/null"):sub(1, -2) - local pub = sys.exec("echo %s | wg pubkey 2>/dev/null" % util.shellquote(prv)):sub(1, -2) - - return {keys = {priv = prv, pub = pub}} - end - }, - getPublicAndPrivateKeyFromPrivate = { - args = {privkey = "privkey"}, - call = function(args) - local pubkey = sys.exec("echo %s | wg pubkey 2>/dev/null" % util.shellquote(args.privkey)):sub(1, -2) - - return {keys = {priv = args.privkey, pub = pubkey}} - end - }, - getWgInstances = { - call = function() - local data = {} - local last_device = "" - local qr_pubkey = {} - - local wg_dump = io.popen("wg show all dump 2>/dev/null") - if wg_dump then - local line - for line in wg_dump:lines() do - local line = string.split(line, "\t") - if not (last_device == line[1]) then - last_device = line[1] - data[line[1]] = { - name = line[1], - public_key = line[3], - listen_port = line[4], - fwmark = line[5], - peers = {} - } - if not line[3] or line[3] == "" or line[3] == "(none)" then - qr_pubkey[line[1]] = "" - else - qr_pubkey[line[1]] = "PublicKey = " .. line[3] - end - else - local peer_name - local cur = uci.cursor() - - cur:foreach( - "network", - "wireguard_" .. line[1], - function(s) - if s.public_key == line[2] then - peer_name = s.description - end - end - ) - - local peer = { - name = peer_name, - public_key = line[2], - endpoint = line[4], - allowed_ips = {}, - latest_handshake = line[6], - transfer_rx = line[7], - transfer_tx = line[8], - persistent_keepalive = line[9] - } - - if not (line[4] == "(none)") then - local ipkey, ipvalue - for ipkey, ipvalue in pairs(string.split(line[5], ",")) do - if #ipvalue > 0 then - table.insert(peer["allowed_ips"], ipvalue) - end - end - end - - table.insert(data[line[1]].peers, peer) - end - end - end - - return data - end - } -} - -local function parseInput() - local parse = json.new() - local done, err - - while true do - local chunk = io.read(4096) - if not chunk then - break - elseif not done and not err then - done, err = parse:parse(chunk) - end - end - - if not done then - print(json.stringify({error = err or "Incomplete input"})) - os.exit(1) - end - - return parse:get() -end - -local function validateArgs(func, uargs) - local method = methods[func] - if not method then - print(json.stringify({error = "Method not found"})) - os.exit(1) - end - - if type(uargs) ~= "table" then - print(json.stringify({error = "Invalid arguments"})) - os.exit(1) - end - - uargs.ubus_rpc_session = nil - - local k, v - local margs = method.args or {} - for k, v in pairs(uargs) do - if margs[k] == nil or (v ~= nil and type(v) ~= type(margs[k])) then - print(json.stringify({error = "Invalid arguments"})) - os.exit(1) - end - end - - return method -end - -if arg[1] == "list" then - local _, method, rv = nil, nil, {} - for _, method in pairs(methods) do - rv[_] = method.args or {} - end - print((json.stringify(rv):gsub(":%[%]", ":{}"))) -elseif arg[1] == "call" then - local args = parseInput() - local method = validateArgs(arg[2], args) - local result, code = method.call(args) - print((json.stringify(result):gsub("^%[%]$", "{}"))) - os.exit(code or 0) -end diff --git a/package/luci/protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json b/package/luci/protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json new file mode 100644 index 0000000000..06940ee7ef --- /dev/null +++ b/package/luci/protocols/luci-proto-wireguard/root/usr/share/luci/menu.d/luci-proto-wireguard.json @@ -0,0 +1,14 @@ +{ + "admin/status/wireguard": { + "title": "WireGuard", + "order": 92, + "action": { + "type": "view", + "path": "wireguard/status" + }, + "depends": { + "acl": [ "luci-proto-wireguard" ], + "uci": { "network": true } + } + } +} diff --git a/package/luci/protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json b/package/luci/protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json index 674deb6c7d..e7187c0e4f 100644 --- a/package/luci/protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json +++ b/package/luci/protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json @@ -5,6 +5,11 @@ "file": { "/usr/bin/qrencode --inline --8bit --type=SVG --output=- -- *": [ "exec" ] }, + "ubus": { + "luci.wireguard": [ + "getWgInstances" + ] + }, "uci": [ "ddns", "system" ] }, "write": { diff --git a/package/luci/protocols/luci-proto-wireguard/root/usr/share/rpcd/ucode/luci.wireguard b/package/luci/protocols/luci-proto-wireguard/root/usr/share/rpcd/ucode/luci.wireguard new file mode 100644 index 0000000000..add810c8ae --- /dev/null +++ b/package/luci/protocols/luci-proto-wireguard/root/usr/share/rpcd/ucode/luci.wireguard @@ -0,0 +1,107 @@ +// Copyright 2022 Jo-Philipp Wich +// Licensed to the public under the Apache License 2.0. + +'use strict'; + +import { cursor } from 'uci'; +import { popen } from 'fs'; + + +function shellquote(s) { + return `'${replace(s ?? '', "'", "'\\''")}'`; +} + +function command(cmd) { + return trim(popen(cmd)?.read?.('all')); +} + + +const methods = { + generatePsk: { + call: function() { + return { psk: command('wg genpsk 2>/dev/null') }; + } + }, + + generateKeyPair: { + call: function() { + const priv = command('wg genkey 2>/dev/null'); + const pub = command(`echo ${shellquote(priv)} | wg pubkey 2>/dev/null`); + + return { keys: { priv, pub } }; + } + }, + + getPublicAndPrivateKeyFromPrivate: { + args: { privkey: "privkey" }, + call: function(req) { + const priv = req.args?.privkey; + const pub = command(`echo ${shellquote(priv)} | wg pubkey 2>/dev/null`); + + return { keys: { priv, pub } }; + } + }, + + getWgInstances: { + call: function() { + const data = {}; + let last_device; + let qr_pubkey = {}; + + const uci = cursor(); + const wg_dump = popen("wg show all dump 2>/dev/null"); + + if (wg_dump) { + uci.load("network"); + + for (let line = wg_dump.read('line'); length(line); line = wg_dump.read('line')) { + const record = split(rtrim(line, '\n'), '\t'); + + if (last_device != record[0]) { + last_device = record[0]; + data[last_device] = { + name: last_device, + public_key: record[2], + listen_port: record[3], + fwmark: record[4], + peers: [] + }; + + if (!length(record[2]) || record[2] == '(none)') + qr_pubkey[last_device] = ''; + else + qr_pubkey[last_device] = `PublicKey = ${record[2]}`; + } + else { + let peer_name; + + uci.foreach('network', `wireguard_${last_device}`, (s) => { + if (s.public_key == record[1]) + peer_name = s.description; + }); + + const peer = { + name: peer_name, + public_key: record[1], + endpoint: record[3], + allowed_ips: [], + latest_handshake: record[5], + transfer_rx: record[6], + transfer_tx: record[7], + persistent_keepalive: record[8] + }; + + if (record[3] != '(none)' && length(record[4])) + push(peer.allowed_ips, ...split(record[4], ',')); + + push(data[last_device].peers, peer); + } + } + } + + return data; + } + } +}; + +return { 'luci.wireguard': methods }; diff --git a/package/luci/protocols/luci-proto-xfrm/Makefile b/package/luci/protocols/luci-proto-xfrm/Makefile deleted file mode 100644 index e59818e417..0000000000 --- a/package/luci/protocols/luci-proto-xfrm/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=Support for XFRM interfaces -LUCI_DEPENDS:=+xfrm - -PKG_MAINTAINER:=Glen Huang - -include ../../luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js b/package/luci/protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js deleted file mode 100644 index b630f3818b..0000000000 --- a/package/luci/protocols/luci-proto-xfrm/htdocs/luci-static/resources/protocol/xfrm.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; -'require uci'; -'require form'; -'require network'; -'require tools.widgets as widgets'; - -return network.registerProtocol('xfrm', { - getI18n: function() { - return _('IPsec XFRM'); - }, - - getIfname: function() { - return this._ubus('l3_device') || this.sid; - }, - - getOpkgPackage: function() { - return 'xfrm'; - }, - - isFloating: function() { - return true; - }, - - isVirtual: function() { - return true; - }, - - getDevice: function() { - return null; - }, - - containsDevice: function(ifname) { - return (network.getIfnameOf(ifname) == this.getIfname()); - }, - - renderFormOptions: function(s) { - var o, ss; - - o = s.taboption('general', form.Value, 'ifid', _('Interface ID'), _('Required. XFRM interface ID to be used for SA.')); - o.datatype = 'integer'; - - o = s.taboption('general', widgets.NetworkSelect, 'tunlink', _('Required. Underlying interface.')); - o.exclude = s.section; - o.nocreate = true; - - o = s.taboption('general', form.Value, 'mtu', _('MTU'), _('Optional. Maximum Transmission Unit of the XFRM interface.')); - o.datatype = 'range(68,65535)'; - o.placeholder = '1280'; - o.optional = true; - } -}); diff --git a/package/luci/themes/luci-theme-bootstrap/Makefile b/package/luci/themes/luci-theme-bootstrap/Makefile index 1bb205ee05..7ea420cad9 100644 --- a/package/luci/themes/luci-theme-bootstrap/Makefile +++ b/package/luci/themes/luci-theme-bootstrap/Makefile @@ -11,6 +11,16 @@ LUCI_DEPENDS:= PKG_LICENSE:=Apache-2.0 +define Package/luci-theme-bootstrap/postrm +#!/bin/sh +[ -n "$${IPKG_INSTROOT}" ] || { + uci -q delete luci.themes.Bootstrap + uci -q delete luci.themes.BootstrapDark + uci -q delete luci.themes.BootstrapLight + uci commit luci +} +endef + include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark b/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark deleted file mode 120000 index ac7bcbbf37..0000000000 --- a/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark +++ /dev/null @@ -1 +0,0 @@ -bootstrap \ No newline at end of file diff --git a/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap-light b/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap-light deleted file mode 120000 index ac7bcbbf37..0000000000 --- a/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap-light +++ /dev/null @@ -1 +0,0 @@ -bootstrap \ No newline at end of file diff --git a/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css b/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css index b558764962..2ab22d18d0 100644 --- a/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css +++ b/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css @@ -154,7 +154,7 @@ * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc). * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ -* { +*, *::before, *::after { margin: 0; padding: 0; border: 0; @@ -257,6 +257,18 @@ textarea { vertical-align: top; } +.control-group { + display: inline-flex; + gap: .2em; +} + +.control-group > input + :not(input):not(select), +.control-group > select + :not(input):not(select) { + margin-left: calc(-.2em + -2px); + border-radius: 0 3px 3px 0; + padding: 0 6px; +} + /* * Scaffolding * Basic and global styles for generating a grid system, structural layout, and page templates @@ -602,7 +614,7 @@ select, margin-bottom: 4px; box-shadow: 0 0 2px var(--border-color-high); background: var(--background-color-high); - padding: 2px 2em 2px 4px; + padding: 6px 2em 6px 4px; border: 1px solid var(--border-color-high); border-radius: 3px; color: var(--text-color-high); @@ -640,12 +652,18 @@ select, white-space: nowrap; } -.cbi-value-field > .cbi-checkbox { +.cbi-value-field > .cbi-checkbox, +.cbi-value-field > div > .cbi-radio { height: 30px; - display: flex; + display: inline-flex; align-items: center; } +.cbi-radio { + cursor: pointer; + gap: .125em; +} + .cbi-select { padding: 0; position: relative; @@ -697,7 +715,6 @@ select, } input[type=file] { - background-color: #fff; padding: initial; border: initial; line-height: initial; @@ -742,8 +759,8 @@ input[type="radio"]::after { input[type="checkbox"]::before, input[type="radio"]::before { - top: -1px; - left: -1px; + top: 0; + left: 0; width: 14px; height: 14px; background: linear-gradient(var(--background-color-high), var(--background-color-low)); @@ -773,7 +790,7 @@ input[type="radio"]:checked::after { } input[type="radio"]:checked:after { - --checkmark-icon: url("data:image/svg+xml,"); + --checkmark-icon: url("data:image/svg+xml,"); } input[type="checkbox"].cbi-input-invalid, @@ -802,7 +819,7 @@ input[type="radio"].cbi-input-invalid { .cbi-dynlist > .item, input[type="checkbox"]::before, input[type="radio"]::before, -input, button, textarea { +input, button, textarea, select { transition: border linear 0.2s, box-shadow linear 0.2s; box-shadow: inset 0 1px 3px hsla(var(--border-color-low-hsl), .01); } @@ -815,7 +832,7 @@ input, button, textarea { .cbi-dynlist > .item:focus, input[type="checkbox"]:focus::before, input[type="radio"]:focus::before, -input:focus, button:hover, textarea:focus { +input:focus, button:hover, textarea:focus, select:focus { --focus-color-rgb: 82, 168, 236; outline: 0; @@ -1213,6 +1230,10 @@ a.menu:after { outline: none; } +.tabs > li > a:focus-visible, .cbi-tabmenu > li > a:focus-visible { + text-decoration: underline; +} + .tabs > li:not(.active):hover, .cbi-tabmenu > .cbi-tab-disabled:hover { background: linear-gradient(var(--tab-inactive-hover-background-color) 90%, var(--tab-inactive-border-color) 100%); } @@ -1226,12 +1247,16 @@ a.menu:after { content: attr(data-errors); background: #c43c35; color: #fff; - min-width: 12px; - line-height: 14px; - border-radius: 7px; + height: 16px; + min-width: 16px; + border-radius: 8px; text-align: center; margin: 0 5px 0 0; - padding: 1px 2px; + padding: 3px 2px 1px 2px; + display: inline-flex; + flex-direction: column; + justify-content: center; + font-size: 12px; } .cbi-tabmenu.map { @@ -1709,25 +1734,6 @@ body.modal-overlay-active #modal_overlay { width: 100%; } -input[type="text"] + .cbi-button, -input[type="password"] + .cbi-button, -select + .cbi-button, -.cbi-select + .cbi-button { - border-radius: 0 3px 3px 0; - border-color: var(--border-color-high); - margin-left: -2px; - padding: 0 6px; - vertical-align: top; - height: 30px; - font-size: 14px; - line-height: 28px; -} - -select + .cbi-button, -.cbi-select + .cbi-button { - position: relative; -} - .cbi-title-ref { color: #37c; } @@ -1961,6 +1967,7 @@ form.inline { display: inline; margin-bottom: 0; } width: 100%; color: var(--text-color-highest); margin-bottom: 18px; + font-family: monospace; } .cbi-section-table .tr:hover .td, @@ -2544,3 +2551,7 @@ div.cbi-value var.cbi-tooltip-container, [data-darkmode="true"] [data-page="admin-statistics-graphs"] [data-plugin] img { filter: invert(100%) hue-rotate(150deg); } + +[data-page="admin-system-admin-sshkeys"] .cbi-dynlist { + max-width: none; +} diff --git a/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.png b/package/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.png index d6eaa4bc4d2229ffa6ace7bd6432125ab4c128c3..90adf2f94f5551c42f373ce68e583734674bb5c0 100644 GIT binary patch delta 568 zcmV-80>}N`1<(YLBYy%HNklsx-8_0H705DDyb8#cVN;Glw$k+G8+nC!myy0N~(pI3i;?Zs3-Ijs3#_k*ZP* zFo^L8D`Amc+daHCV!K|1$c!#+z-N98Vt;aV3mgGNM-%Lyn14E7IGxi=coknnqf6@| z_+SJFhDD!J%aGABphRbF?@-qq&kc1vA3w6H5Lwj$$Mw*~#yFB&o`)CLz|K%JG|i5R zv9fyr!*)V7sWykMUd9z+VQY`tCKvE3p@^1t_ThRyS*|C7^fR*(sZD)kI1WCgmQzX3 zm>3=x16K9m6n{RZl)-XcL{)bnxU2;>=NVejhCewq*f~5w#lR#!rIbU?1B{IBDC?<|ZoDl!642-u<&f`r|3HFW+ zq9BVQ1)-=UYfMeE z{L$EqHtCE{XXd^8=ACm|I4Gvm2M!1Bx%Y4vpD(~ah=@r<{eL1dOGLJa*hDldBK<^U zLNRiVGMG6mB1(#*m^o}K*Vy-XEo~V@9ARb_5g{Tf(hGBrBsQ$QC61d96Oqis*2LSn zdnn8--{MKJl`D>$4+8)|I+HV*S$+5(lRJ-}(@bntnEB8jY-Vk`J1{JRZ=%f1Dv`2G zy|PU2%M<&CKY!0bs5yvjjrH(x;TM{%%}|1f005e%;dE>jj@MP=m9y>eVq#9ac)G<` zzi!5c}!<*HY&PBiwW#CLvZWr1 .item { + min-height: 30px; + display: flex; + align-items: center; + } + input, textarea, select, .cbi-dropdown > ul > li { font-size: 16px !important; @@ -194,7 +210,8 @@ header h3 a, header .brand { } select, input[type="text"], input[type="password"], - .cbi-dropdown > ul > li input[type="text"] { + .cbi-dropdown > ul > li input[type="text"], + .cbi-value-field .control-group { width: 100%; height: 30px; } @@ -203,25 +220,9 @@ header h3 a, header .brand { width: calc(100% - 25px); } - [data-dynlist] { - display: block; - } - - [data-dynlist] > .add-item > input { - width: calc(100% - 21px); - } - - [data-dynlist] > .add-item > .cbi-button { - margin-right: -1px; - } - input[type="text"] + .cbi-button, input[type="password"] + .cbi-button, select + .cbi-button { - font-size: 14px !important; - line-height: 28px; - height: 30px; - box-sizing: border-box; overflow: hidden; text-overflow: ellipsis; } @@ -243,9 +244,8 @@ header h3 a, header .brand { padding: 8px; } - [data-page="admin-status-overview"] .cbi-section:nth-of-type(1) .td:first-child, - [data-page="admin-status-overview"] .cbi-section:nth-of-type(2) .td:first-child { - flex-grow: 1; + [data-page="admin-status-overview"] .td[width="33%"] { + flex-basis: 33%; } header .pull-right .label { @@ -300,14 +300,6 @@ header h3 a, header .brand { flex-basis: 12%; } - #cbi-network-switch_vlan .td.cbi-section-actions { - flex-basis: 100%; - } - - #cbi-network-switch_vlan .td.cbi-section-actions::before { - display: none; - } - #cbi-network-switch_vlan .td.cbi-section-actions > * { width: auto; display: block; @@ -344,6 +336,14 @@ header h3 a, header .brand { [data-name="bridge-vlan"] .td[data-title]::before { content: attr(data-title); } + + [data-page="admin-network-network"] .td[data-name="_ifacebox"] { + flex-basis: 40%; + } + + [data-page="admin-network-network"] .td[data-name="_ifacestat"] { + flex-basis: 60%; + } } @media screen and (max-device-width: 375px) { @@ -396,9 +396,12 @@ header h3 a, header .brand { body[data-page="admin-network-wireless"] .td.cbi-section-actions::before { content: none !important; } -} -@media screen and (max-width: 375px) { + [data-page="admin-network-network"] .td[data-name="_ifacebox"], + [data-page="admin-network-network"] .td[data-name="_ifacestat"] { + flex-basis: 100%; + } + .td .ifacebox { width: 100%; margin: 0 !important; diff --git a/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap-dark b/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap-dark deleted file mode 120000 index ac7bcbbf37..0000000000 --- a/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap-dark +++ /dev/null @@ -1 +0,0 @@ -bootstrap \ No newline at end of file diff --git a/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap-light b/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap-light deleted file mode 120000 index ac7bcbbf37..0000000000 --- a/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap-light +++ /dev/null @@ -1 +0,0 @@ -bootstrap \ No newline at end of file diff --git a/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/footer.htm b/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/footer.htm deleted file mode 100644 index 48d9b98b92..0000000000 --- a/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/footer.htm +++ /dev/null @@ -1,21 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008 Jo-Philipp Wich - Copyright 2012 David Menting - Licensed to the public under the Apache License 2.0. --%> - - <% if not blank_page then %> - <% local ver = require "luci.version" %> -
    - - - <% end %> - - - diff --git a/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm b/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm deleted file mode 100644 index 37d18a2f07..0000000000 --- a/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm +++ /dev/null @@ -1,95 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008-2016 Jo-Philipp Wich - Copyright 2012 David Menting - Licensed to the public under the Apache License 2.0. --%> - -<% - local sys = require "luci.sys" - local util = require "luci.util" - local http = require "luci.http" - local disp = require "luci.dispatcher" - - local boardinfo = util.ubus("system", "board") - - local node = disp.context.dispatched - - local darkpref - - if theme == "bootstrap-dark" then - darkpref = "true" - elseif theme == "bootstrap-light" then - darkpref = "false" - end - - -- send as HTML5 - http.prepare_content("text/html") --%> - -> - - - <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI - <% if darkpref == nil then %> - - <% end %> - - - - - <% if node and node.css then %> - - <% end -%> - <% if css then %> - - <% end -%> - - - - - "> - <% if not blank_page then %> -
    - <%=striptags(boardinfo.hostname or "?")%> - -
    -
    - -
    - <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> -
    -

    <%:No password set!%>

    -

    <%:There is no password set on this router. Please configure a root password to protect the web interface.%>

    - <% if disp.lookup("admin/system/admin") then %> - - <% end %> -
    - <%- end -%> - - <%- if boardinfo.rootfs_type == "initramfs" then -%> -
    -

    <%:System running in recovery (initramfs) mode.%>

    -

    <%:No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade%>

    - <% if disp.lookup("admin/system/flash") then %> - - <% end %> -
    - <%- end -%> - - - - - <% end %> diff --git a/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm b/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm deleted file mode 100644 index 72b04783bb..0000000000 --- a/package/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm +++ /dev/null @@ -1,53 +0,0 @@ -<%# - Copyright 2021 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<% - -- tell bootstrap's templates to not render header and footer - blank_page = true -%> - -<%+header%> - - - -
    -
    <%:Loading view…%>
    - -
    - -<%+footer%> diff --git a/package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut b/package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut new file mode 100644 index 0000000000..4be276904d --- /dev/null +++ b/package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut @@ -0,0 +1,20 @@ + {% if (!blank_page): %} +
    + + + {% endif %} + + diff --git a/package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut b/package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut new file mode 100644 index 0000000000..b7bc770b4b --- /dev/null +++ b/package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut @@ -0,0 +1,83 @@ +{# + Copyright 2008 Steven Barth + Copyright 2012 David Menting + Copyright 2008-2022 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% + import { getuid, getspnam } from 'luci.core'; + + const boardinfo = ubus.call('system', 'board'); + const darkpref = (theme == 'bootstrap-dark' ? 'true' : (theme == 'bootstrap-light' ? 'false' : null)); + + http.prepare_content('text/html; charset=UTF-8'); +-%} + + + + + + {{ striptags(`${boardinfo.hostname ?? '?'}${node ? ` - ${node.title}` : ''}`) }} - LuCI + {% if (!darkpref): %} + + {% endif %} + + + + + {% if (node?.css): %} + + {% endif %} + {% if (css): %} + + {% endif %} + + + + + + {% if (!blank_page): %} +
    + {{ striptags(boardinfo.hostname ?? '?') }} + +
    +
    + +
    + {% if (getuid() == 0 && getspnam('root')?.pwdp === ''): %} +
    +

    {{ _('No password set!') }}

    +

    {{ _('There is no password set on this router. Please configure a root password to protect the web interface.') }}

    + {% if (dispatcher.lookup("admin/system/admin")): %} + + {% endif %} +
    + {% endif %} + + {% if (boardinfo.rootfs_type == "initramfs"): %} +
    +

    {{ _('System running in recovery (initramfs) mode.') }}

    +

    {{ _('No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade') }}

    + {% if (dispatcher.lookup("admin/system/flash")): %} + + {% endif %} +
    + {% endif %} + + + + + {% endif %} diff --git a/package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut b/package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut new file mode 100644 index 0000000000..15f3b1435b --- /dev/null +++ b/package/luci/themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut @@ -0,0 +1,48 @@ +{# + Copyright 2022 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% include('header', { blank_page: true }) %} + + + +
    +
    {{ _('Loading view…') }}
    + +
    + +{% include('footer', { blank_page: true }) %} diff --git a/package/luci/themes/luci-theme-librecmc-2020/Makefile b/package/luci/themes/luci-theme-librecmc-2020/Makefile new file mode 100644 index 0000000000..3208a28f81 --- /dev/null +++ b/package/luci/themes/luci-theme-librecmc-2020/Makefile @@ -0,0 +1,22 @@ +# +# Copyright (C) 2020 Jo-Philipp Wich +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI modern libreCMC theme +LUCI_DEPENDS:= + +define Package/luci-theme-librecmc-2020/postrm +#!/bin/sh +[ -n "$${IPKG_INSTROOT}" ] || { + uci -q delete luci.themes.libreCMC2020 + uci commit luci +} +endef + +include ../../luci.mk + +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 b/package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 similarity index 100% rename from package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 rename to package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 diff --git a/package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/cascade.css b/package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/cascade.css new file mode 100644 index 0000000000..bf7a7a391d --- /dev/null +++ b/package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/cascade.css @@ -0,0 +1,1938 @@ +:root { + --main-bright-color: #00A3E1; + --main-dark-color: #002B49; + --secondary-bright-color: #FFFFFF; + --secondary-dark-color: #212322; + --danger-color: #CC1111; + --warning-color: #CC8800; + --success-color: #5CB85C; + --regular-font: "GalanoGrotesqueW00-Regular"; + --base-font-size: 16px; +} + +@font-face { + font-family: "GalanoGrotesqueW00-Regular"; + src: url("GalanoGrotesqueW00-Regular.woff2") format("woff2"); +} + +:root[lang="bg"], :root[lang="ru"], :root[lang="uk"], :root[lang="el"], :root[lang="he"] { + --regular-font: "Helvetica"; +} + +/* + * resets and base style + */ + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + text-decoration: none; + list-style: none; + color: inherit; + font-family: var(--regular-font), "sans-serif"; + border: none; + font-size: 100%; + background: none; + outline: none; + -webkit-appearance: none; + -webkit-text-size-adjust: none; +} + +html { + height: 100%; + width: 100%; + max-width: 1366px; + margin: 0 auto; + background: #fff linear-gradient(90deg, rgba(0, 0, 0, .8), rgba(0, 0, 0 ,.5), rgba(0, 0, 0, .8)); +} + +body { + background: var(--secondary-bright-color); + color: var(--secondary-dark-color); + font-size: var(--base-font-size); + cursor: default; + display: inline-flex; + flex-direction: column; + min-height: 100%; + min-width: 100%; +} + +abbr[title], acronym[title] { + text-decoration: dotted underline; +} + +/* + * scaffholding + */ + +#menubar { + background-color: var(--main-bright-color); + background-image: url("logo.svg"); + background-position: 10px center; + background-size: 50px 50px; + background-repeat: no-repeat; + padding: 0 1em 0 70px; + min-height: 70px; + display: flex; + align-items: center; + color: var(--secondary-bright-color); + flex: 0; + width: 100%; + box-shadow: inset 0 0 1px var(--main-dark-color); +} + +#menubar > * { + flex: 1 1 auto; +} + +#menubar .hostname { + font-weight: bold; + font-size: 2em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#menubar .distversion { + flex: 3; +} + +#indicators { + flex: 1 1 25%; + text-align: right; +} + +#indicators > * { + background: var(--secondary-bright-color); + color: var(--main-bright-color); + display: inline-block; + font-size: .85em; + line-height: 1.5em; + padding: 0 .5em; + margin: .125em; + border-radius: 1em; + cursor: pointer; + white-space: nowrap; +} + +#indicators > [data-style="inactive"] { + background: var(--main-bright-color); + color: var(--secondary-bright-color); + border: 2px solid var(--secondary-bright-color); + line-height: calc(1.5em - 4px); + padding: 0 calc(.5em - 2px); +} + +#menubar h2, +.skiplink { + display: none; +} + +#modemenu { + background: var(--main-bright-color); + padding: .5rem 1rem; + display: flex; + align-items: center; + color: var(--secondary-bright-color); + box-shadow: inset 0 0 1px var(--main-dark-color); + font-size: 1rem; + flex-wrap: wrap; +} + +#modemenu > * { + margin: .125rem; +} + +#modemenu > .active { + font-weight: bold; + border-bottom: 2px solid var(--secondary-bright-color); +} + +#maincontainer { + flex-direction: row; + display: inline-flex; + flex: 1 0 auto; +} + +#mainmenu { + flex: 1 1 100px; + max-width: 250px; + background: var(--main-dark-color); + color: var(--main-bright-color); + padding: 1em; +} + +#mainmenu:empty { + max-width: 0; + padding: 1em 0; + transition: all .2s ease-in-out; +} + +#mainmenu > div { + position: sticky; + top: 1em; +} + +#mainmenu ul { + padding: 0; + margin: 0 0 0 .5em; + line-height: 1.5em; +} + +#mainmenu ul > li { + list-style: none; +} + +#mainmenu li > ul { + max-height: 0; + overflow: hidden; + transition: max-height .1s ease-in-out; +} + +#mainmenu li.selected > a { + color: var(--secondary-bright-color); +} + +#mainmenu ul:not(.active) > li.selected > ul, +#mainmenu li.active > ul { + max-height: 3000px; + transition: max-height 1s ease-in-out; + margin: 0 0 .5em .5em; +} + +#mainmenu .l1 > li > a { + font-weight: bold; + font-size: 1.05em; +} + +#maincontent { + flex: 10; + padding: 1em 1em 0 1em; +} + +body > .luci { + flex: 0; + font-size: .7em; + padding: .25em; + text-align: right; + background: var(--main-bright-color); + color: var(--secondary-bright-color); + margin: 0; +} + +/* + * modal + */ + +body.modal-overlay-active { + overflow: hidden; +} + +body.modal-overlay-active #modal_overlay { + left: 0; + right: 0; + opacity: 1; +} + +#modal_overlay { + position: fixed; + top: 0; + bottom: 0; + left: -10000px; + right: 10000px; + background: rgba(0, 0, 0, 0.7); + z-index: 10000; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + transition: opacity .125s ease-in; + opacity: 0; +} + +#modal_overlay > .modal { + max-width: 1300px; + width: 80%; + margin: 10% auto 5rem auto; + background: var(--secondary-bright-color); + box-shadow: 0 0 3px 1px var(--main-bright-color); + padding: .5em; + border-radius: .25em; + display: flex; + flex-direction: column; +} + +.modal > h4:first-child { + padding: .5rem; + margin: -.5rem -.5rem .5rem -.5rem; + background: var(--main-bright-color); + color: var(--secondary-bright-color); + border-radius: .25rem .25rem 0 0; +} + +.modal > *:first-child:last-child { + margin: .5em 0 !important; +} + +.modal .cbi-section > legend:first-child { font-size: 120%; } + + +/* + * table layout + */ + +table { + width: 100%; + margin: 0 0 1rem 0; + position: relative; + border-collapse: collapse; +} + +tr.cbi-section-table-titles[data-title]::before { + font-weight: bold; + border-top: none; +} + +tr[data-title]::before { + content: attr(data-title); + display: table-cell; + border-top: 1px solid var(--main-dark-color); + padding: .5em; +} + +th { + text-align: left; + font-weight: bold; + padding: .5em; + /* word-break: break-word; */ +} + +.cbi-section-table-descr th { + opacity: .8; + font-size: 90%; + font-weight: normal; +} + +td { + border-top: 1px solid var(--main-dark-color); + padding: .5em; + vertical-align: middle; +} + +td input:not([type]), +td input[type="text"], +td input[type="password"], +td select, +td .cbi-dropdown:not(.btn):not(.cbi-button), +td .cbi-dynlist, +td .control-group { + min-width: auto; + width: 100%; +} + +tr.drag-over-above { + box-shadow: 0 -6px 6px var(--main-bright-color); +} + +tr.drag-over-below { + box-shadow: 0 6px 6px var(--main-bright-color); +} + +tr.placeholder { + height: 4em; + position: relative; +} + +tr.placeholder > td { + position: absolute; + left: 0; + right: 0; + bottom: 0; + text-align: center; + line-height: 3em; + font-size: 90%; + opacity: .8; +} + +/* + * view specific table invariants + */ + + #cbi-wireless-wifi-device .ifacebadge { + flex-direction: column; + justify-content: space-around; + } + +.assoclist td, +[data-page="admin-status-overview"] td { + font-size: .9rem; + vertical-align: middle; +} + +.assoclist td:nth-of-type(3) > span { + display: block; + max-width: 270px; + font-size: .8rem; +} + +.assoclist td:nth-of-type(5) > span { + font-size: .8rem; +} + +.assoclist td > .ifacebadge { + flex-wrap: wrap; + justify-content: space-around; + max-width: 120px; + padding: .2em; +} + +.assoclist td > .ifacebadge::after { + overflow: hidden; + text-overflow: ellipsis; +} + +.assoclist td > .ifacebadge > img { + margin: 0 25px; +} + +.assoclist td > .ifacebadge[data-ssid][data-ifname] > span { + display: none; +} + +.assoclist td > .ifacebadge[data-ssid][data-ifname]::after { + content: attr(data-ssid) " (" attr(data-ifname) ")"; +} + +[data-page="admin-status-overview"] td:nth-of-type(3) { + min-width: 100px; +} + +[data-page="admin-network-firewall"] table > tr > *:nth-child(1) { + flex: 1 1 30%; +} + +[data-page="admin-network-wireless"] .cbi-section-actions > div { + display: flex; +} + +[data-page="admin-network-wireless"] .cbi-section-actions > div > * { + flex: 1; +} + +[data-page="admin-status-processes"] table td:nth-of-type(3), +[data-tab="leases"] table td[data-name="duid"] { + word-break: break-word; +} + +/* + * uci changelog + */ + +.uci-change-list { + font-size: 90%; + white-space: pre; + overflow: hidden; +} + +.uci-change-list del, +.uci-change-list ins, +.uci-change-list var, +.uci-change-legend-label del, +.uci-change-legend-label ins, +.uci-change-legend-label var { + text-decoration: none; + font-family: monospace; + font-style: normal; + border: 1px solid #ccc; + background: #eee; + padding: 2px; + display: block; + line-height: 15px; + margin-bottom: 1px; +} + +.uci-change-list h5 { + margin: .5em 0 .25em 0; +} + +.uci-change-list ins, +.uci-change-legend-label ins { + border-color: #0f0; + background: #cfc; +} + +.uci-change-list del, +.uci-change-legend-label del { + border-color: #f00; + background: #fcc; +} + +.uci-change-list var, +.uci-change-legend-label var { + border-color: #ccc; + background: #eee; +} + +.uci-change-list var ins, +.uci-change-list var del { + display: inline-block; + border: none; + width: 100%; + padding: 0; +} + +.uci-change-legend { + margin: .5em 0 0 0; + display: flex; + flex-wrap: wrap; +} + +.uci-change-legend-label { + flex: 1 1 10em; + white-space: nowrap; +} + +.uci-change-legend-label > ins, +.uci-change-legend-label > del, +.uci-change-legend-label > var { + float: left; + margin-right: 4px; + width: 16px; + height: 16px; + display: block; + position: relative; +} + +.uci-change-legend-label var ins, +.uci-change-legend-label var del { + border: none; + position: absolute; + top: 2px; + left: 2px; + right: 2px; + bottom: 2px; +} + +/* + * alignment helpers + */ + +.left { + text-align: left !important; +} + +.right { + text-align: right !important; +} + +.center { + text-align: center !important; +} + +.top { + vertical-align: top !important; +} + +.bottom { + vertical-align: bottom !important; +} + +.middle { + vertical-align: middle !important; +} + +.nowrap { + white-space: nowrap !important; +} + +.hidden { + display: none !important; +} + +/* + * legacy hacks + */ + +[width="33%"] { + width: 33%; + max-width: 33%; +} + +[width="50%"] { + width: 50%; + max-width: 50%; +} + +[data-name="_freq"] select { + min-width: auto; +} + +.cbi-value-field > div:first-child + br { + display: none; +} + +/* + * typography + */ + +h1, h2, h3, h4, h5, h6, +.cbi-section > legend:first-child { + font-weight: bold; + margin: 0 0 1rem 0; +} + +strong, b { + font-weight: bold; +} + +h1 { font-size: 160%; } +h2 { font-size: 150%; } +h3 { font-size: 140%; } +h4 { font-size: 130%; } +h5 { font-size: 120%; } +h6 { font-size: 110%; } + +.cbi-section > legend:first-child { font-size: 140%; } + +p, ul, textarea { + margin: 0 0 1em 0; +} + +p > textarea:last-child { + margin: 0; +} + +var { + color: var(--main-dark-color); + font-weight: bold; +} + +code { + font-family: monospace; + color: var(--main-dark-color); +} + +pre { + font-family: monospace; + margin: 0 0 1em 0; + font-size: .9rem; + box-shadow: inset 0 0 2px var(--main-dark-color); + padding: .25rem; + overflow: auto; +} + +big { + font-size: 110%; +} + +small { + font-size: 95%; +} + +ul { + padding: 0 0 0 1.5em; +} + +ul > li { + list-style: disc; +} + +p > a { + text-decoration: underline; +} + +/* + * widgets + */ + +.ifacebox, .ifacebadge, .zonebadge { + display: inline-flex; + line-height: 1.8em; + padding: 0 .25em; + margin: .25em; + box-shadow: 0px 0px 2px var(--main-dark-color); + font-size: .9em; + border-radius: .5em; + overflow: hidden; + font-size: .8rem; + vertical-align: text-top; + background: var(--secondary-bright-color); + align-items: center; + color: var(--secondary-dark-color); + vertical-align: middle; +} + +.zonebadge > .ifacebadge { + margin: .125em -.125em .125em .35em; +} + +.zonebadge > .ifacebadge > img +{ + margin: .125em 0 .125em .25em; +} + +.ifacebox { + display: inline-flex; + flex-direction: column; + padding: 0; + text-align: center; + width: 100%; + max-width: 150px; +} + +.ifacebox-head { + background: var(--main-bright-color); + width: 100%; +} + +.ifacebox-body { + text-align: center; + padding: .3em .25em .25em .25em; + white-space: nowrap; +} + +.ifacebadge { + display: inline-flex; + align-items: center; +} + +.ifacebadge.large { + line-height: 1.3em; +} + +.ifacebadge > img { + vertical-align: text-bottom; + margin: .25em; + height: 16px; +} + +.ifacebadge > * { + margin-left: .25em; +} + +.network-status-table { + display: inline-flex; + flex-wrap: wrap; + width: 100%; + margin: 0 -.2em 1em -.2em; +} + +.network-status-table > .ifacebox { + max-width: none; + flex: 1 1 45%; + margin: .25em; + min-width: 250px; +} + +.network-status-table > .ifacebox .ifacebadge { + font-size: 100%; + max-width: none; + flex: 1 1 45%; + margin: .2em; +} + +.network-status-table .ifacebox-body > div { + display: flex; + flex-wrap: wrap; + margin: .3em -.1em -.1em -.1em; +} + +.cbi-tooltip-container { + cursor: help; +} + +.cbi-tooltip { + position: absolute; + z-index: 10000; + left: -10000px; + box-shadow: 0 0 2px rgba(0, 0, 0, .7); + border-radius: 3px; + background: var(--secondary-bright-color); + white-space: pre; + padding: 2px 5px; + opacity: 0; + transition: opacity .25s ease-in; + font-size: .8rem; +} + +.cbi-tooltip.error { + color: var(--danger-color); +} + +.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) { + left: auto; + opacity: 1; + transition: opacity .25s ease-in; +} + +.zone-forwards { + display: flex; + align-items: center; +} + +.cbi-progressbar { + border-radius: .25em; + position: relative; + min-width: 20rem; + height: 1.5em; + box-shadow: 0 0 2px var(--main-dark-color); + overflow: hidden; + margin: .125rem 0; +} + +.cbi-progressbar > div { + background: var(--main-bright-color); + height: 100%; + transition: width .25s ease-in; + width: 0%; +} + +.cbi-progressbar::after { + position: absolute; + bottom: 0; + top: 0; + right: 0; + left: 0; + text-align: center; + text-shadow: 0 0 2px var(--secondary-bright-color); + content: attr(title); + white-space: nowrap; + line-height: 1.5em; +} + +.cbi-tabmenu { + padding: 0; + margin: 0 -.5em 1em -.5em; + font-weight: bold; + color: var(--main-dark-color); +} + +.cbi-tabmenu > li { + display: inline-flex; + white-space: nowrap; + opacity: 1; + height: 1.8em; + max-height: none; + overflow: visible; +} + +.cbi-tabmenu > li > a { + flex: 1; + margin: .1em .5em; +} + +.cbi-tabmenu > .cbi-tab > a { + border-bottom: 2px solid var(--main-dark-color); +} + +[data-tab] { + opacity: 0; + max-height: 0; + transition: opacity .25s ease-in-out; + overflow: hidden; +} + +[data-tab-active="true"] { + opacity: 1; + height: auto; + max-height: none; + overflow: visible; +} + +.alert-message:not(.modal) { + box-shadow: 0 0 3px var(--secondary-dark-color); + padding: .5em; + margin: 0 0 1em 0; + background: var(--warning-color); + color: var(--secondary-bright-color); + transition: opacity .4s ease; +} + +.alert-message + .alert-message { + margin: -.5em 0 1em 0; +} + +.alert-message.info { + background: var(--main-bright-color); +} + +.alert-message.warning { + background: var(--warning-color); +} + +.alert-message.danger { + background: var(--danger-color); +} + +.alert-message.success { + background: var(--success-color); +} + +.alert-message .btn { + box-shadow: 0 0 2px var(--secondary-bright-color); +} + +.alert-message .btn:hover { + box-shadow: 0 0 4px 1px var(--secondary-bright-color); +} + +@keyframes fade-in { + 0% { opacity: 0; } + 100% { opacity: 1; } +} + +@keyframes fade-out { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +.fade-in { + animation: fade-in .4s ease; +} + +.fade-out { + animation: fade-out .4s ease; + opacity: 0; +} + +/* + * forms + */ + +button, .btn { + background: var(--main-bright-color); + color: var(--secondary-bright-color); + line-height: 1.5em; + border-radius: .25em; + cursor: pointer; + box-shadow: 0 0 2px var(--main-dark-color); + padding: 0 .5em; + display: inline-block; +} + +button:hover, .btn:hover { + box-shadow: 0 0 6px var(--main-bright-color); +} + +button + button, .btn + .btn, button + .btn, .btn + button, select + button { + margin-left: .25em; +} + +button.important { + background: var(--main-dark-color); +} + +button[disabled], button.disabled, .btn[disabled], .btn.disabled { + pointer-events: none; + opacity: .6; +} + +.cbi-button-apply, .cbi-button-positive { + background: var(--main-dark-color); +} + +.cbi-button-negative, .cbi-button-remove { + background: var(--danger-color); +} + +input[type="checkbox"], +input[type="radio"] { + --bd-color: var(--main-dark-color); + --fg-color: var(--main-dark-color); + + appearance: none; + -webkit-appearance: none; + width: 1em; + height: 1em; + color: var(--fg-color); + position: relative; + display: inline-block; + cursor: pointer; + background: none; + border: none; +} + +input[type="checkbox"]::before, +input[type="checkbox"]::after, +input[type="radio"]::before, +input[type="radio"]::after { + position: absolute; + content: ""; + margin: .15em 0; +} + +input[type="checkbox"]::before, +input[type="radio"]::before { + top: 0; + left: 0; + width: 1em; + height: 1em; + box-shadow: 0 0 2px var(--bd-color) !important; + border-radius: .25em; +} + +input[type="radio"], +input[type="radio"]::before { + border-radius: 50%; +} + +input[type="checkbox"]::after, +input[type="radio"]::after { + top: .15em; + left: .15em; + width: .7em; + height: .7em; +} + +input[type="checkbox"]:checked::after, +input[type="radio"]:checked::after { + --checkmark-icon: url("data:image/svg+xml,"); + -webkit-mask: var(--checkmark-icon) center/cover no-repeat; + mask: var(--checkmark-icon) center/cover no-repeat; + background: var(--fg-color); +} + +input[type="radio"]:checked:after { + --checkmark-icon: url("data:image/svg+xml,"); +} + +input[type="checkbox"].cbi-input-invalid, +input[type="radio"].cbi-input-invalid { + --bd-color: var(--danger-color); + --fg-color: var(--danger-color); +} + +input:not([type]), +input[type="text"], +input[type="password"], +select, +.cbi-dropdown:not(.btn):not(.cbi-button) { + border-bottom: 2px solid transparent; + box-shadow: inset 0 0 1px var(--main-dark-color); + padding: 0 .2rem; + line-height: 1.5rem; + min-height: calc(1.5rem + 2px); + min-width: 20rem; + border-radius: .25em; +} + +input:not([type]):focus, +input[type="text"]:focus, +input[type="password"]:focus, +select:focus, +.cbi-dropdown:not(.btn):not(.cbi-button):focus, +.cbi-dropdown[open]:not(.btn):not(.cbi-button) { + border-color: var(--main-dark-color); +} + +input[disabled]:not([type]), +input[disabled][type="text"], +input[disabled][type="password"], +select[disabled], +.cbi-dynlist[disabled] { + opacity: .6; + pointer-events: none; +} + +input:not([type]) + .btn, input:not([type]) + button, +input[type="text"] + .btn, input[type="text"] + button, +input[type="password"] + .btn, input[type="password"] + button { + margin: 0 0 2px -1px; + background: var(--main-dark-color); + border-radius: 0 .25em .25em 0; +} + +.control-group > select + .btn, .control-group > select + button { + margin-left: .25em; +} + +.control-group > input:not([type]) + .btn, .control-group > input:not([type]) + button, +.control-group > input[type="text"] + .btn, .control-group > input[type="text"] + button, +.control-group > input[type="password"] + .btn, .control-group > input[type="password"] + button { + margin: .125em .125em calc(.125em + 2px) calc(-.125em - .25em) !important; +} + +select { + padding: .1rem 0; + -webkit-appearance: menulist; +} + +textarea { + width: 100%; + box-shadow: inset 0 0 2px var(--main-dark-color); + font-family: monospace; + font-size: .9rem; + padding: .2rem; +} + +.cbi-input-invalid, +.cbi-input-invalid:focus { + color: var(--danger-color); + border-color: var(--danger-color) !important; + box-shadow: inset 0 0 2px var(--danger-color); +} + +.control-group { + display: inline-flex; + margin: 0 -.125rem; + min-width: 20.25em; +} + +.control-group > *, +.control-group > .cbi-dropdown > ul > li { + justify-content: space-around; +} + +.control-group > * { + margin: .125rem !important; + min-width: auto !important; +} + +.control-group > select, +.control-group > input:not([type]), +.control-group > input[type="text"], +.control-group > input[type="password"] { + flex: 10; +} + +.cbi-value { + display: flex; + flex-wrap: wrap; + margin: 0 0 1em 0; +} + +.cbi-value > label:first-child { + flex: 1 1 40%; + padding: 0 .5em 0 0; +} + +.cbi-value > .cbi-value-field { + flex: 2 2 55%; +} + +.cbi-value > .cbi-section { + flex: 1 1 100%; +} + +.cbi-map-descr, +.cbi-tab-descr, +.cbi-section-descr, +.cbi-value-description, +.cbi-value[data-widget="CBI.DummyValue"] > div:first-child { + opacity: .8; + font-size: .9rem; + padding: .2em 0; +} + +.cbi-map-descr, +.cbi-tab-descr, +.cbi-section-descr, +.cbi-section-table, +.cbi-section-create { + margin: 0 0 1em 0; +} + +.cbi-dynlist { + display: inline-block; + font-size: 90%; + min-height: calc(1.5em + 2px); + line-height: 1.5em; + min-width: 20rem; + flex-wrap: wrap; +} + +.cbi-dynlist > .item { + box-shadow: 0 0 2px var(--main-dark-color); + margin: .3em 0; + padding: .15em 2em .15em .2em; + border-radius: .25em; + position: relative; + overflow: hidden; + transition: box-shadow .25s ease-in-out; + pointer-events: none; + flex: 1 1 100%; + word-break: break-all; +} + +.cbi-dynlist > .item::after { + content: "-"; + top: 0; + right: 0; + bottom: 0; + width: 1.6rem; + background: var(--main-bright-color); + display: flex; + align-items: center; + justify-content: space-around; + position: absolute; + box-shadow: 0 0 2px var(--main-dark-color); + text-align: center; + color: var(--secondary-bright-color); + cursor: pointer; + pointer-events: all; +} + +.cbi-dynlist[disabled] > .item::after { + pointer-events: none; +} + +.cbi-dynlist > .item:hover { + box-shadow: 0 0 2px var(--main-bright-color); +} + +.cbi-dynlist > .add-item { + flex: 1; + display: flex; +} + +.cbi-dynlist > .add-item > input { + flex: 1; + min-width: 18.5rem; + border-radius: .25rem 0 0 .25rem; +} + +.cbi-dynlist > .add-item > .btn { + flex: 0 0 1.6rem; + margin: 0 0 2px -1px; + width: 1.6rem; + text-align: center; +} + +.cbi-dropdown { + display: inline-flex !important; + cursor: pointer; + height: auto; + position: relative; + padding: 0 !important; +} + +.cbi-dropdown:not(.btn):not(.cbi-button) { + box-shadow: inset 0 0 1px var(--main-dark-color); +} + +.cbi-dropdown > ul { + margin: 0 !important; + padding: 0; + list-style: none; + overflow-x: hidden; + overflow-y: auto; + display: flex; + width: 100%; +} + +.cbi-dropdown.btn > ul:not(.dropdown) { + padding-left: .5em; +} + +.cbi-dropdown.btn.spinning > ul:not(.dropdown) { + padding-left: 0; +} + +.cbi-dropdown.btn > ul.dropdown > li { + color: var(--main-dark-color); +} + +.cbi-dropdown > ul.preview { + display: none; +} + +.cbi-dropdown > .open, +.cbi-dropdown > .more { + flex-grow: 0; + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + padding: 0 .25em; +} + +.cbi-dropdown.btn > .open, +.cbi-dropdown.cbi-button > .open { + padding: 0 .5em; + margin-left: .5em; + border-left: 1px solid; +} + +.cbi-dropdown > .more, +.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li[placeholder] { + display: none; + justify-content: center; + color: rgba(0, 0, 0, .5); +} + +.cbi-dropdown > ul > li { + display: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 1; + flex-grow: 1; + align-items: center; + align-self: center; + color: inherit; +} + +.cbi-dropdown > ul.dropdown > li, +.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li { + padding: 0 .25em; +} + +.cbi-dropdown > ul > li .hide-open { display: block; display: initial; } +.cbi-dropdown > ul > li .hide-close { display: none; } + +.cbi-dropdown > ul > li[display]:not([display="0"]) { + border-left: 1px solid #ccc; +} + +.cbi-dropdown[empty] > ul { + max-width: 1px; + max-height: 1.5em; +} + +.cbi-dropdown > ul > li > form { + display: none; + margin: 0; + padding: 0; + pointer-events: none; +} + +.cbi-dropdown > ul > li img { + align-self: center; + margin-right: .25em; +} + +.cbi-dropdown > ul > li input[type="text"] { + margin: .25em 0; + border: none; + background: var(--secondary-bright-color); +} + +.cbi-dropdown[open] { + position: relative; +} + +.cbi-dropdown[open] > ul.dropdown { + display: block; + background: var(--secondary-bright-color); + box-shadow: 0 0 1px var(--main-dark-color), 0 0 4px rgba(0, 0, 0, .7); + position: absolute; + z-index: 1100; + max-width: none; + min-width: 100%; + width: auto; + transition: max-height .125s ease-in; +} + +.cbi-dropdown > ul > li[display], +.cbi-dropdown[open] > ul.preview, +.cbi-dropdown[open] > ul.dropdown > li, +.cbi-dropdown[multiple] > ul > li > label, +.cbi-dropdown[multiple][open] > ul.dropdown > li, +.cbi-dropdown[multiple][more] > .more, +.cbi-dropdown[multiple][empty] > .more { + flex-grow: 1; + display: flex !important; +} + +.cbi-dropdown[empty] > ul > li, +.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder], +.cbi-dropdown[multiple][open] > ul.dropdown > li > form { + display: block !important; +} + +.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; } +.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: block; display: initial; } + +.cbi-dropdown[open] > ul.dropdown > li { + border-bottom: 1px solid #ccc; +} + +.cbi-dropdown[open] > ul.dropdown > li[selected] { + background: var(--main-dark-color); + color: var(--secondary-bright-color); +} + +.cbi-dropdown[open] > ul.dropdown > li.focus { + background: var(--main-bright-color); +} + +.cbi-dropdown[open] > ul.dropdown > li:last-child { + margin-bottom: 0; + border-bottom: none; +} + +.cbi-dropdown[open] > ul.dropdown > li[unselectable] { + opacity: 0.7; +} + +.cbi-dropdown[open] > ul.dropdown > li > input.create-item-input:first-child:last-child { + width: 100%; +} + +.cbi-dropdown[disabled] { + pointer-events: none; + opacity: .6; +} + +.cbi-filebrowser { + max-width: 100%; + width: 1px; + box-shadow: 0 0 2px var(--main-dark-color); + border-radius: .25rem; + display: flex; + flex-direction: column; + opacity: 0; + height: 0; + overflow: hidden; +} + +.cbi-filebrowser.open { + min-width: 20rem; + width: auto; + opacity: 1; + height: auto; + overflow: visible; + transition: opacity .25s ease-in; +} + +.cbi-filebrowser > * { + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + padding: 0 0 .25em 0; + margin: .25em .25em 0px .25em; + white-space: nowrap; + border-bottom: 1px solid var(--main-dark-color); +} + +.cbi-filebrowser .cbi-button-positive { + margin-right: .25em; +} + +.cbi-filebrowser > div { + border-bottom: none; +} + +.cbi-filebrowser > ul > li { + display: flex; + flex-direction: row; + align-items: center; +} + +.cbi-filebrowser > ul > li a:hover { + font-weight: bold; + text-decoration: underline; +} + +.cbi-filebrowser > ul > li > div:first-child { + flex: 10; + overflow: hidden; + text-overflow: ellipsis; +} + +.cbi-filebrowser > ul > li > div:last-child { + flex: 3 3 10em; + text-align: right; +} + +.cbi-filebrowser > ul > li > div:last-child > button { + padding: .125em .25em; + margin: 1px 0 1px .25em; +} + +.cbi-filebrowser .upload { + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin: 0 -.125em .25em -.125em; + padding: 0 0 .125em 0px; + border-bottom: 1px solid var(--main-dark-color); +} + +.cbi-filebrowser .upload > * { + margin: .125em; + flex: 1; +} + +.cbi-filebrowser .upload > div > input { + width: 100%; +} + +.cbi-section-actions { + text-align: right; +} + +.cbi-page-actions { + flex-wrap: wrap; + width: 100%; + justify-content: flex-end; + margin-bottom: 1em; + margin-top: 1em; + border-top: 1px solid var(--main-dark-color); + padding-top: 1em; + text-align: right; +} + +div[id$=".ipaddr"] > input, +.cbi-value-field > div > input[type="password"] { + min-width: 18.5rem; + border-radius: .25rem 0 0 .25rem; +} + +div[id$=".txpower"] { + flex-wrap: wrap; + align-items: center; +} + +div[id$=".txpower"] > span { + white-space: nowrap; + margin-left: .25em; +} + +div[id$=".editlist"] { + flex: 1; +} + +[data-errors]::after { + content: attr(data-errors); + background: var(--danger-color); + color: var(--secondary-bright-color); + border-radius: .6rem; + height: 1.1rem; + padding: 0 .25rem; + font-size: .9rem; + display: inline-block; + font-weight: bold; + min-width: .6rem; + line-height: 1rem; + margin: -.1rem 0 0 -.2rem; + text-align: center; +} + +@keyframes spin { + 100% { transform: rotate(360deg); } +} + +.spinning { + position: relative; + padding-left: 2.1em !important; +} + +.spinning::before { + position: absolute; + display: block; + align-items: center; + top: 0; + bottom: 0; + left: .4em; + width: 1.4em; + height: 1.4em; + animation: spin 1s linear infinite; + content: url("spinner.svg"); + margin: auto; + line-height: 0; +} + +button.spinning, .btn.spinning { + padding-left: 1.6em !important; +} + +button.spinning::before, .btn.spinning::before { + filter: invert(1); + left: .2em; + width: 1.2em; + height: 1.2em; +} + +#view > div.spinning:first-child { + padding: .5em 0; +} + +#view > *:last-child { + margin: 0 0 1em 0; +} + +.label { + background: var(--main-bright-color); + color: var(--secondary-bright-color); + font-size: .8rem; + padding: 0 .4rem; + border-radius: .5rem; +} + +.label.warning { + background: var(--danger-color); +} + +.label.success { + background: var(--success-color); +} + +ul.deps { + margin: 0; + padding: 0; + font-size: .9rem; +} + +ul.errors { + margin: 0 0 1em 0; + padding: 0; +} + +@media only screen and (max-width: 800px) { + body { + padding-top: 70px; + } + + #maincontent { + padding: .25em; + max-width: 100vw; + } + + #menubar { + background: var(--main-bright-color); + padding: 0 .5em; + position: fixed; + top: 0; + z-index: 1000; + } + + #menubar > h2 { + flex: 0 0 2em; + display: block; + border: 2px solid var(--secondary-bright-color); + color: var(--secondary-bright-color); + border-radius: .5em; + cursor: pointer; + font-size: 100%; + margin: 0 1em 0 0; + } + + #menubar > h2:hover { + border-color: var(--secondary-bright-color); + color: var(--secondary-bright-color); + } + + #menubar > h2 > * { + display: none; + } + + #menubar > h2::before { + content: "☰"; + width: 35px; + line-height: 35px; + text-align: center; + display: inline-block; + color: inherit; + font-weight: bold; + } + + #menubar > h2.active::before { + content: "×"; + font-size: 200%; + } + + #menubar .hostname { + font-size: 1.6em; + } + + .distversion { + display: none; + } + + #modemenu { + padding: .125em .25em; + } + + #mainmenu { + overflow-x: hidden; + overflow-y: auto; + max-width: 0; + padding: 1em 0; + transition: max-width .25s ease-in-out, padding .25s ease-in-out; + position: fixed; + z-index: 900; + height: 100%; + } + + #mainmenu.active { + max-width: 200px; + padding: 1em 1em calc(1em + 70px) 1em; + overflow-x: visible; + } + + #mainmenu > div { + position: static; + } + + #mainmenu ul > li { + padding: .25em 0; + } + + .hide-xs { + display: none !important; + } + + table { + display: flex; + flex-direction: column; + } + + tr { + display: block; + border-bottom: 1px solid var(--main-dark-color); + margin-bottom: .5em; + padding-bottom: .5em; + } + + tr.cbi-section-table-titles[data-title]::before, + tr.cbi-section-table-titles, + tr.cbi-section-table-descr { + display: none; + } + + tr[data-title]::before { + display: block; + font-weight: bold; + border-top: none; + padding: .4em 0; + font-size: 110%; + } + + td { + display: block; + border-top: none; + text-align: left !important; + padding: .2em 0; + } + + th, table-titles { + display: none; + } + + td[data-title] { + position: relative; + padding: .2em 0 .2em 40%; + } + + td[data-title]::before { + content: attr(data-title) ": "; + white-space: nowrap; + font-weight: bold; + width: 40%; + overflow: hidden; + text-overflow: ellipsis; + position: absolute; + left: 0; + top: 0; + bottom: 0; + padding: .2em 0; + text-align: left; + display: inline-flex; + align-items: center; + } + + td[data-title]::after { + content: ""; + width: 2em; + position: absolute; + left: calc(40% - 2em); + top: 0; + bottom: 0; + display: block; + background: linear-gradient(90deg, rgba(255, 255, 255, 0), var(--secondary-bright-color) 90%); + } + + [data-page="admin-status-overview"] .cbi-section:nth-of-type(1) td:first-of-type, + [data-page="admin-status-overview"] .cbi-section:nth-of-type(2) td:first-of-type { + font-weight: bold; + max-width: none; + width: 100%; + } + + [data-page="admin-status-overview"] td > span > span { font-size: .9rem; } + + [data-page="admin-status-routes"] table:nth-of-type(3) td:nth-of-type(1) { word-break: break-all; } + + [data-page="admin-network-firewall-zones"] td[data-name="_info"] { + padding: .2em 0; + line-height: 2.2rem; + } + + [data-page="admin-network-firewall-zones"] td[data-name="_info"]::before, + [data-page="admin-network-firewall-zones"] td[data-name="_info"]::after { + display: none; + } + + [data-page="admin-network-firewall-zones"] td[data-name="_info"] label { + font-size: 1rem; + } + + #cbi-wireless-wifi-device tr { display: flex; flex-wrap: wrap; } + #cbi-wireless-wifi-device tr > *:nth-child(1) { flex: 1 1 20%; align-self: center; } + #cbi-wireless-wifi-device tr > *:nth-child(2) { flex: 2 2 75%; } + #cbi-wireless-wifi-device tr > *:nth-child(3) { flex: 3 3 100%; } + + #cbi-network-interface tr { display: flex; flex-wrap: wrap; } + #cbi-network-interface tr > *:nth-child(1) { flex: 1 1 33%; align-self: center; } + #cbi-network-interface tr > *:nth-child(2) { flex: 2 2 60%; align-self: center; font-size: .9rem; overflow: hidden; } + #cbi-network-interface tr > *:nth-child(3) { flex: 3 3 100%; } + #cbi-network-interface tr > *:nth-child(2) > div { overflow: hidden; text-overflow: ellipsis; } + + .assoclist tr { + display: flex; + flex-wrap: wrap; + } + + .assoclist td > .ifacebadge { + max-width: 90px; + } + + .assoclist td > .ifacebadge > img { + margin: 0 35px; + } + + .assoclist td > .ifacebadge > span { + display: none; + } + + .assoclist td > .ifacebadge[data-ifname]::after { + content: attr(data-ifname); + } + + .assoclist td > .ifacebadge[data-signal]::after { + content: attr(data-signal) " dBm"; + } + + .assoclist td:nth-of-type(3) { + font-weight: bold; + font-size: 1rem; + } + + .assoclist td:nth-of-type(1), .assoclist td:nth-of-type(4) { + flex: 1 1 100px; + margin-right: .5em; + } + + .assoclist td:nth-of-type(3), .assoclist td:nth-of-type(5) { + flex: 2 2 calc(100% - 110px); + overflow: hidden; + text-overflow: ellipsis; + align-self: center; + } + + .assoclist td:nth-of-type(6) { flex: 1; text-align: right !important; } + .assoclist td[data-title] { padding: .2em 0; } + .assoclist td[data-title]::before, + .assoclist td[data-title]::after { display: none; } + + .leases6 td:nth-of-type(3) { word-wrap: break-word; } + + td.cbi-section-actions > div { display: flex; } + td.cbi-section-actions > div > * { flex: 1; } + + body.modal-overlay-active #modal_overlay > .modal { + width: 95%; + margin: 5% auto; + } + + input:not([type]), + input[type="text"], + input[type="password"], + select, + .cbi-dropdown:not(.btn):not(.cbi-button), + .cbi-dynlist { + min-height: calc(2.2rem + 2px); + line-height: 2.2rem; + font-size: 1.2rem; + min-width: 10rem; + } + + button, .btn { + line-height: 1.8rem; + font-size: 1.2rem; + } + + select { + padding: .4em 0; + } + + .cbi-value > .cbi-value-field { + flex: 1 0 100%; + display: flex; + flex-direction: column; + max-width: 100%; + } + + .cbi-value > .cbi-value-field > div[id] { + display: flex; + flex-direction: row; + } + + .cbi-value > .cbi-value-field > div[id] > input, + .cbi-value > .cbi-value-field > div[id] > select, + .cbi-value > .cbi-value-field > div[id] > .cbi-filebrowser.open { + flex: 1; + width: 100%; + } + + .cbi-dynlist .item::after, + .cbi-dynlist .add-item > .btn { + line-height: 2em; + flex-basis: 2rem; + width: 2rem; + } + + .ifacebadge.large { + font-size: .9rem; + } + + .control-group > *, + .control-group > .cbi-dropdown > ul > li { + flex: 1; + white-space: normal; + word-wrap: break-word; + } + + .cbi-page-actions .cbi-dropdown, + .cbi-page-actions .cbi-button-apply:first-child { + flex-basis: 100%; + } + + .cbi-checkbox { + margin: .25rem; + } + + .cbi-tabmenu { + margin: 0 -.25em 1em -.25em; + } + + .cbi-tooltip { + font-size: 1rem; + box-shadow: 0 0 4px rgba(0, 0, 0, .7); + } + + .cbi-value > label:first-child { + padding: 0 0 .5em 0; + } + + [data-page="admin-system-admin-sshkeys"] .cbi-dynlist > .item { + font-size: .9rem; + line-height: 1rem; + } + + [data-page="admin-system-opkg"] .control-group { + flex-wrap: wrap; + } + + [data-page="admin-status-iptables"] h2 + div.right { + margin: 0 0 1em 0 !important; + display: flex; + } +} + +@media only screen and (min-width: 800px) and (max-width: 1200px) { + .assoclist tr > *:nth-of-type(2) { + display: none; + } +} diff --git a/package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.png b/package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/logo.png similarity index 100% rename from package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.png rename to package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/logo.png diff --git a/package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.svg b/package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/logo.svg similarity index 100% rename from package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.svg rename to package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/logo.svg diff --git a/package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg b/package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/spinner.svg similarity index 100% rename from package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg rename to package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/openwrt2020/spinner.svg diff --git a/package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js b/package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/resources/menu-openwrt2020.js similarity index 100% rename from package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js rename to package/luci/themes/luci-theme-librecmc-2020/htdocs/luci-static/resources/menu-openwrt2020.js diff --git a/package/luci/themes/luci-theme-librecmc-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 b/package/luci/themes/luci-theme-librecmc-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 new file mode 100755 index 0000000000..118ba47147 --- /dev/null +++ b/package/luci/themes/luci-theme-librecmc-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 @@ -0,0 +1,12 @@ +#!/bin/sh + +if [ "$PKG_UPGRADE" != 1 ]; then + uci get luci.themes.libreCMC2020 >/dev/null 2>&1 || \ + uci batch <<-EOF + set luci.themes.libreCMC2020=/luci-static/librecmc2020 + set luci.main.mediaurlbase=/luci-static/librecmc2020 + commit luci + EOF +fi + +exit 0 diff --git a/package/luci/themes/luci-theme-librecmc-2020/ucode/template/themes/openwrt2020/footer.ut b/package/luci/themes/luci-theme-librecmc-2020/ucode/template/themes/openwrt2020/footer.ut new file mode 100644 index 0000000000..a5e4ea12d5 --- /dev/null +++ b/package/luci/themes/luci-theme-librecmc-2020/ucode/template/themes/openwrt2020/footer.ut @@ -0,0 +1,16 @@ +{# + Copyright 2020 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +
    +
    + +

    + Powered by {{ version.luciname }} ({{ version.luciversion }}) +

    + + + + + diff --git a/package/luci/themes/luci-theme-librecmc-2020/ucode/template/themes/openwrt2020/header.ut b/package/luci/themes/luci-theme-librecmc-2020/ucode/template/themes/openwrt2020/header.ut new file mode 100644 index 0000000000..2b7c581387 --- /dev/null +++ b/package/luci/themes/luci-theme-librecmc-2020/ucode/template/themes/openwrt2020/header.ut @@ -0,0 +1,72 @@ +{# + Copyright 2020 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% + import { getuid, getspnam } from 'luci.core'; + + const boardinfo = ubus.call('system', 'board'); + + http.prepare_content('text/html; charset=UTF-8'); +-%} + + + + + + + + + + + + + +{{ striptags(`${boardinfo.hostname ?? '?'}${node ? ` - ${node.title}` : ''}`) }} - LuCI +{% if (css): %} + +{% endif %} + + + + + + + + + +
    + + +
    + {% if (getuid() == 0 && getspnam('root')?.pwdp === '' && join('-', ctx.request_path) != 'admin-system-admin'): %} +
    +

    {{ _('No password set!') }}

    +

    {{ _('There is no password set on this router. Please configure a root password to protect the web interface.') }}

    + {% if (dispatcher.lookup("admin/system/admin")): %} + + {% endif %} +
    + {% endif %} + + {% if (boardinfo.rootfs_type == "initramfs"): %} +
    +

    {{ _('System running in recovery (initramfs) mode.') }}

    +

    {{ _('No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade') }}

    + {% if (dispatcher.lookup("admin/system/flash")): %} + + {% endif %} +
    + {% endif %} + + diff --git a/package/luci/themes/luci-theme-librecmc/Makefile b/package/luci/themes/luci-theme-librecmc/Makefile new file mode 100644 index 0000000000..1dc59964fd --- /dev/null +++ b/package/luci/themes/luci-theme-librecmc/Makefile @@ -0,0 +1,22 @@ +# +# Copyright (C) 2008-2014 The LuCI Team +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI libreCMC.org theme +LUCI_DEPENDS:= + +define Package/luci-theme-librecmc/postrm +#!/bin/sh +[ -n "$${IPKG_INSTROOT}" ] || { + uci -q delete luci.themes.libreCMC + uci commit luci +} +endef + +include ../../luci.mk + +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css b/package/luci/themes/luci-theme-librecmc/htdocs/luci-static/openwrt.org/cascade.css similarity index 100% rename from package/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css rename to package/luci/themes/luci-theme-librecmc/htdocs/luci-static/openwrt.org/cascade.css diff --git a/package/luci/themes/luci-theme-librecmc/htdocs/luci-static/openwrt.org/tabbg.png b/package/luci/themes/luci-theme-librecmc/htdocs/luci-static/openwrt.org/tabbg.png new file mode 100644 index 0000000000000000000000000000000000000000..5c9d03018882de9bb92f2d708bcd93b671beaa03 GIT binary patch literal 80 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{O0VEi%{+3=0q{Ka4978H@CI2|}MV$T5;V=9L d*(U#Y&|%1xk+@qLpJ4-1>gnp|vd$@?2>=7W7QX-h literal 0 HcmV?d00001 diff --git a/package/luci/themes/luci-theme-openwrt/htdocs/luci-static/resources/menu-openwrt.js b/package/luci/themes/luci-theme-librecmc/htdocs/luci-static/resources/menu-openwrt.js similarity index 100% rename from package/luci/themes/luci-theme-openwrt/htdocs/luci-static/resources/menu-openwrt.js rename to package/luci/themes/luci-theme-librecmc/htdocs/luci-static/resources/menu-openwrt.js diff --git a/package/luci/themes/luci-theme-librecmc/luasrc/view/themes/openwrt.org/footer.htm b/package/luci/themes/luci-theme-librecmc/luasrc/view/themes/openwrt.org/footer.htm new file mode 100644 index 0000000000..4510bda0a7 --- /dev/null +++ b/package/luci/themes/luci-theme-librecmc/luasrc/view/themes/openwrt.org/footer.htm @@ -0,0 +1,19 @@ +<%# + Copyright 2008 Steven Barth + Copyright 2008 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-%> + +
    +
    +
    + +

    + <% local ver = require "luci.version" -%> + Powered by <%= ver.luciname %> (<%= ver.luciversion %>) +

    + + + + + diff --git a/package/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm b/package/luci/themes/luci-theme-librecmc/luasrc/view/themes/openwrt.org/header.htm similarity index 100% rename from package/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm rename to package/luci/themes/luci-theme-librecmc/luasrc/view/themes/openwrt.org/header.htm diff --git a/package/luci/themes/luci-theme-librecmc/root/etc/uci-defaults/30_luci-theme-openwrt b/package/luci/themes/luci-theme-librecmc/root/etc/uci-defaults/30_luci-theme-openwrt new file mode 100755 index 0000000000..139d63b7a7 --- /dev/null +++ b/package/luci/themes/luci-theme-librecmc/root/etc/uci-defaults/30_luci-theme-openwrt @@ -0,0 +1,12 @@ +#!/bin/sh + +if [ "$PKG_UPGRADE" != 1 ]; then + uci get luci.themes.libreCMC >/dev/null 2>&1 || \ + uci batch <<-EOF + set luci.themes.libreCMC=/luci-static/openwrt.org + set luci.main.mediaurlbase=/luci-static/openwrt.org + commit luci + EOF +fi + +exit 0 diff --git a/package/luci/themes/luci-theme-material/Makefile b/package/luci/themes/luci-theme-material/Makefile index 5bc16eb7db..038e355dec 100644 --- a/package/luci/themes/luci-theme-material/Makefile +++ b/package/luci/themes/luci-theme-material/Makefile @@ -9,6 +9,14 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=Material Theme LUCI_DEPENDS:= +define Package/luci-theme-material/postrm +#!/bin/sh +[ -n "$${IPKG_INSTROOT}" ] || { + uci -q delete luci.themes.Material + uci commit luci +} +endef + include ../../luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - libreCMC buildroot signature diff --git a/package/luci/themes/luci-theme-material/luasrc/view/themes/material/footer.htm b/package/luci/themes/luci-theme-material/luasrc/view/themes/material/footer.htm deleted file mode 100644 index f572504f4b..0000000000 --- a/package/luci/themes/luci-theme-material/luasrc/view/themes/material/footer.htm +++ /dev/null @@ -1,32 +0,0 @@ -<%# - Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI - - luci-theme-material - Copyright 2015 Lutty Yang - - Have a bug? Please create an issue here on GitHub! - https://github.com/LuttyYang/luci-theme-material/issues - - luci-theme-bootstrap: - Copyright 2008 Steven Barth - Copyright 2008 Jo-Philipp Wich - Copyright 2012 David Menting - - MUI: - https://github.com/muicss/mui - - Licensed to the public under the Apache License 2.0 --%> - -<% local ver = require "luci.version" %> -
    - - - - - - - - diff --git a/package/luci/themes/luci-theme-material/luasrc/view/themes/material/header.htm b/package/luci/themes/luci-theme-material/luasrc/view/themes/material/header.htm deleted file mode 100644 index 48059fe17a..0000000000 --- a/package/luci/themes/luci-theme-material/luasrc/view/themes/material/header.htm +++ /dev/null @@ -1,101 +0,0 @@ -<%# - Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI - - luci-theme-material - Copyright 2015-2017 Lutty Yang - - Have a bug? Please create an issue here on GitHub! - https://github.com/LuttyYang/luci-theme-material/issues - - luci-theme-bootstrap: - Copyright 2008 Steven Barth - Copyright 2008-2016 Jo-Philipp Wich - Copyright 2012 David Menting - - MUI: - https://github.com/muicss/mui - - Licensed to the public under the Apache License 2.0 --%> - -<% - local sys = require "luci.sys" - local util = require "luci.util" - local http = require "luci.http" - local disp = require "luci.dispatcher" - local ver = require "luci.version" - - local boardinfo = util.ubus("system", "board") or { } - - local node = disp.context.dispatched - local path = table.concat(disp.context.path, "-") - - http.prepare_content("text/html; charset=UTF-8") --%> - - - - - - - - - - - - LuCI"> - - LuCI"> - - -<% if node and node.css then %> - -<% end -%> - - -<%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI -<% if css then %> -<% end -%> - -node-<%= path %><% else %>node-main-login<% end %>" data-page="<%= pcdata(path) %>"> -
    - -
    -
    -
    <%:Collecting data...%>
    - -
    - -
    -
    -
    - <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") and path ~= "admin-system-admin-password" then -%> - <%- end -%> - - <%- if boardinfo.rootfs_type == "initramfs" then -%> -
    -

    <%:System running in recovery (initramfs) mode.%>

    -

    <%:No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade%>

    - <% if disp.lookup("admin/system/flash") then %> - - <% end %> -
    - <%- end -%> - - - - diff --git a/package/luci/themes/luci-theme-material/ucode/template/themes/material/footer.ut b/package/luci/themes/luci-theme-material/ucode/template/themes/material/footer.ut new file mode 100644 index 0000000000..63463e99f2 --- /dev/null +++ b/package/luci/themes/luci-theme-material/ucode/template/themes/material/footer.ut @@ -0,0 +1,32 @@ +{# + Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI + + luci-theme-material + Copyright 2015 Lutty Yang + + Have a bug? Please create an issue here on GitHub! + https://github.com/LuttyYang/luci-theme-material/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Licensed to the public under the Apache License 2.0 +-#} + +
    + +
    +
    + + + + + diff --git a/package/luci/themes/luci-theme-material/ucode/template/themes/material/header.ut b/package/luci/themes/luci-theme-material/ucode/template/themes/material/header.ut new file mode 100644 index 0000000000..569963e7c5 --- /dev/null +++ b/package/luci/themes/luci-theme-material/ucode/template/themes/material/header.ut @@ -0,0 +1,102 @@ +{# + Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI + + luci-theme-material + Copyright 2015-2017 Lutty Yang + + Have a bug? Please create an issue here on GitHub! + https://github.com/LuttyYang/luci-theme-material/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Licensed to the public under the Apache License 2.0 +-#} + +{% + import { getuid, getspnam } from 'luci.core'; + + const boardinfo = ubus.call('system', 'board'); + const hostname = striptags(boardinfo?.hostname ?? '?'); + + http.prepare_content('text/html; charset=UTF-8'); +-%} + + + + + + + + + + + + + + + +{% if (node?.css): %} + +{% endif %} + + +{{ hostname }}{{ node?.title ? ` - ${striptags(node.title)}` : '' }} - LuCI +{% if (css): %} + +{% endif %} + + +
    +
    +
    + + + {{ hostname }} + +
    +
    +
    +
    +
    {{ _('Collecting data...') }}
    + +
    + +
    +
    +
    + {% if (getuid() == 0 && getspnam('root')?.pwdp === ''): %} +
    +

    {{ _('No password set!') }}

    +

    {{ _('There is no password set on this router. Please configure a root password to protect the web interface.') }}

    + {% if (dispatcher.lookup("admin/system/admin")): %} + + {% endif %} +
    + {% endif %} + + {% if (boardinfo?.rootfs_type == "initramfs"): %} +
    +

    {{ _('System running in recovery (initramfs) mode.') }}

    +

    {{ _('No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade') }}

    + {% if (dispatcher.lookup("admin/system/flash")): %} + + {% endif %} +
    + {% endif %} + + + + diff --git a/package/luci/themes/luci-theme-openwrt-2020/Makefile b/package/luci/themes/luci-theme-openwrt-2020/Makefile deleted file mode 100644 index dcbe110125..0000000000 --- a/package/luci/themes/luci-theme-openwrt-2020/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# -# Copyright (C) 2020 Jo-Philipp Wich -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=LuCI modern OpenWrt theme -LUCI_DEPENDS:= - -include ../../luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css b/package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css deleted file mode 100644 index a8b33c022f..0000000000 --- a/package/luci/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css +++ /dev/null @@ -1,1944 +0,0 @@ -:root { - --main-bright-color: #00A3E1; - --main-dark-color: #002B49; - --secondary-bright-color: #FFFFFF; - --secondary-dark-color: #212322; - --danger-color: #CC1111; - --warning-color: #CC8800; - --success-color: #5CB85C; - --regular-font: "GalanoGrotesqueW00-Regular"; - --base-font-size: 16px; -} - -@font-face { - font-family: "GalanoGrotesqueW00-Regular"; - src: url("GalanoGrotesqueW00-Regular.woff2") format("woff2"); -} - -:root[lang="bg"], :root[lang="ru"], :root[lang="uk"], :root[lang="el"], :root[lang="he"] { - --regular-font: "Helvetica"; -} - -/* - * resets and base style - */ - -* { - margin: 0; - padding: 0; - box-sizing: border-box; - text-decoration: none; - list-style: none; - color: inherit; - font-family: var(--regular-font), "sans-serif"; - border: none; - font-size: 100%; - background: none; - outline: none; - -webkit-appearance: none; - -webkit-text-size-adjust: none; -} - -html { - height: 100%; - width: 100%; - max-width: 1366px; - margin: 0 auto; - background: #fff linear-gradient(90deg, rgba(0, 0, 0, .8), rgba(0, 0, 0 ,.5), rgba(0, 0, 0, .8)); -} - -body { - background: var(--secondary-bright-color); - color: var(--secondary-dark-color); - font-size: var(--base-font-size); - cursor: default; - display: inline-flex; - flex-direction: column; - min-height: 100%; - min-width: 100%; -} - -abbr[title], acronym[title] { - text-decoration: dotted underline; -} - -/* - * scaffholding - */ - -#menubar { - background-color: var(--main-bright-color); - background-image: url("logo.svg"); - background-position: 10px center; - background-size: 50px 50px; - background-repeat: no-repeat; - padding: 0 1em 0 70px; - min-height: 70px; - display: flex; - align-items: center; - color: var(--secondary-bright-color); - flex: 0; - width: 100%; - box-shadow: inset 0 0 1px var(--main-dark-color); -} - -#menubar > * { - flex: 1 1 auto; -} - -#menubar .hostname { - font-weight: bold; - font-size: 2em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -#menubar .distversion { - flex: 3; -} - -#indicators { - flex: 1 1 25%; - text-align: right; -} - -#indicators > * { - background: var(--secondary-bright-color); - color: var(--main-bright-color); - display: inline-block; - font-size: .85em; - line-height: 1.5em; - padding: 0 .5em; - margin: .125em; - border-radius: 1em; - cursor: pointer; - white-space: nowrap; -} - -#indicators > [data-style="inactive"] { - background: var(--main-bright-color); - color: var(--secondary-bright-color); - border: 2px solid var(--secondary-bright-color); - line-height: calc(1.5em - 4px); - padding: 0 calc(.5em - 2px); -} - -#menubar h2, -.skiplink { - display: none; -} - -#modemenu { - background: var(--main-bright-color); - padding: .5rem 1rem; - display: flex; - align-items: center; - color: var(--secondary-bright-color); - box-shadow: inset 0 0 1px var(--main-dark-color); - font-size: 1rem; - flex-wrap: wrap; -} - -#modemenu > * { - margin: .125rem; -} - -#modemenu > .active { - font-weight: bold; - border-bottom: 2px solid var(--secondary-bright-color); -} - -#maincontainer { - flex-direction: row; - display: inline-flex; - flex: 1 0 auto; -} - -#mainmenu { - flex: 1 1 100px; - max-width: 250px; - background: var(--main-dark-color); - color: var(--main-bright-color); - padding: 1em; -} - -#mainmenu:empty { - max-width: 0; - padding: 1em 0; - transition: all .2s ease-in-out; -} - -#mainmenu > div { - position: sticky; - top: 1em; -} - -#mainmenu ul { - padding: 0; - margin: 0 0 0 .5em; - line-height: 1.5em; -} - -#mainmenu ul > li { - list-style: none; -} - -#mainmenu li > ul { - max-height: 0; - overflow: hidden; - transition: max-height .1s ease-in-out; -} - -#mainmenu li.selected > a { - color: var(--secondary-bright-color); -} - -#mainmenu ul:not(.active) > li.selected > ul, -#mainmenu li.active > ul { - max-height: 3000px; - transition: max-height 1s ease-in-out; - margin: 0 0 .5em .5em; -} - -#mainmenu .l1 > li > a { - font-weight: bold; - font-size: 1.05em; -} - -#maincontent { - flex: 10; - padding: 1em 1em 0 1em; -} - -body > .luci { - flex: 0; - font-size: .7em; - padding: .25em; - text-align: right; - background: var(--main-bright-color); - color: var(--secondary-bright-color); - margin: 0; -} - -/* - * modal - */ - -body.modal-overlay-active { - overflow: hidden; -} - -body.modal-overlay-active #modal_overlay { - left: 0; - right: 0; - opacity: 1; -} - -#modal_overlay { - position: fixed; - top: 0; - bottom: 0; - left: -10000px; - right: 10000px; - background: rgba(0, 0, 0, 0.7); - z-index: 10000; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; - transition: opacity .125s ease-in; - opacity: 0; -} - -#modal_overlay > .modal { - max-width: 1300px; - width: 80%; - margin: 10% auto 5rem auto; - background: var(--secondary-bright-color); - box-shadow: 0 0 3px 1px var(--main-bright-color); - padding: .5em; - border-radius: .25em; - display: flex; - flex-direction: column; -} - -.modal > h4:first-child { - padding: .5rem; - margin: -.5rem -.5rem .5rem -.5rem; - background: var(--main-bright-color); - color: var(--secondary-bright-color); - border-radius: .25rem .25rem 0 0; -} - -.modal > *:first-child:last-child { - margin: .5em 0 !important; -} - -.modal .cbi-section > legend:first-child { font-size: 120%; } - - -/* - * table layout - */ - -table { - width: 100%; - margin: 0 0 1rem 0; - position: relative; - border-collapse: collapse; -} - -tr.cbi-section-table-titles[data-title]::before { - font-weight: bold; - border-top: none; -} - -tr[data-title]::before { - content: attr(data-title); - display: table-cell; - border-top: 1px solid var(--main-dark-color); - padding: .5em; -} - -th { - text-align: left; - font-weight: bold; - padding: .5em; - /* word-break: break-word; */ -} - -.cbi-section-table-descr th { - opacity: .8; - font-size: 90%; - font-weight: normal; -} - -td { - border-top: 1px solid var(--main-dark-color); - padding: .5em; - vertical-align: middle; -} - -td input:not([type]), -td input[type="text"], -td input[type="password"], -td select, -td .cbi-dropdown:not(.btn):not(.cbi-button), -td .cbi-dynlist, -td .control-group { - min-width: auto; - width: 100%; -} - -tr.drag-over-above { - box-shadow: 0 -6px 6px var(--main-bright-color); -} - -tr.drag-over-below { - box-shadow: 0 6px 6px var(--main-bright-color); -} - -tr.placeholder { - height: 4em; - position: relative; -} - -tr.placeholder > td { - position: absolute; - left: 0; - right: 0; - bottom: 0; - text-align: center; - line-height: 3em; - font-size: 90%; - opacity: .8; -} - -/* - * view specific table invariants - */ - - #cbi-wireless-wifi-device .ifacebadge { - flex-direction: column; - justify-content: space-around; - } - -.assoclist td, -[data-page="admin-status-overview"] td { - font-size: .9rem; - vertical-align: middle; -} - -.assoclist td:nth-of-type(3) > span { - display: block; - max-width: 270px; - font-size: .8rem; -} - -.assoclist td:nth-of-type(5) > span { - font-size: .8rem; -} - -.assoclist td > .ifacebadge { - flex-wrap: wrap; - justify-content: space-around; - max-width: 120px; - padding: .2em; -} - -.assoclist td > .ifacebadge::after { - overflow: hidden; - text-overflow: ellipsis; -} - -.assoclist td > .ifacebadge > img { - margin: 0 25px; -} - -.assoclist td > .ifacebadge[data-ssid][data-ifname] > span { - display: none; -} - -.assoclist td > .ifacebadge[data-ssid][data-ifname]::after { - content: attr(data-ssid) " (" attr(data-ifname) ")"; -} - -[data-page="admin-status-overview"] td:nth-of-type(3) { - min-width: 100px; -} - -[data-page="admin-network-firewall"] table > tr > *:nth-child(1) { - flex: 1 1 30%; -} - -[data-page="admin-network-wireless"] .cbi-section-actions > div { - display: flex; -} - -[data-page="admin-network-wireless"] .cbi-section-actions > div > * { - flex: 1; -} - -[data-page="admin-status-processes"] table td:nth-of-type(3), -[data-tab="leases"] table td[data-name="duid"] { - word-break: break-word; -} - -/* - * uci changelog - */ - -.uci-change-list { - font-size: 90%; - white-space: pre; - overflow: hidden; -} - -.uci-change-list del, -.uci-change-list ins, -.uci-change-list var, -.uci-change-legend-label del, -.uci-change-legend-label ins, -.uci-change-legend-label var { - text-decoration: none; - font-family: monospace; - font-style: normal; - border: 1px solid #ccc; - background: #eee; - padding: 2px; - display: block; - line-height: 15px; - margin-bottom: 1px; -} - -.uci-change-list h5 { - margin: .5em 0 .25em 0; -} - -.uci-change-list ins, -.uci-change-legend-label ins { - border-color: #0f0; - background: #cfc; -} - -.uci-change-list del, -.uci-change-legend-label del { - border-color: #f00; - background: #fcc; -} - -.uci-change-list var, -.uci-change-legend-label var { - border-color: #ccc; - background: #eee; -} - -.uci-change-list var ins, -.uci-change-list var del { - display: inline-block; - border: none; - width: 100%; - padding: 0; -} - -.uci-change-legend { - margin: .5em 0 0 0; - display: flex; - flex-wrap: wrap; -} - -.uci-change-legend-label { - flex: 1 1 10em; - white-space: nowrap; -} - -.uci-change-legend-label > ins, -.uci-change-legend-label > del, -.uci-change-legend-label > var { - float: left; - margin-right: 4px; - width: 16px; - height: 16px; - display: block; - position: relative; -} - -.uci-change-legend-label var ins, -.uci-change-legend-label var del { - border: none; - position: absolute; - top: 2px; - left: 2px; - right: 2px; - bottom: 2px; -} - -/* - * alignment helpers - */ - -.left { - text-align: left !important; -} - -.right { - text-align: right !important; -} - -.center { - text-align: center !important; -} - -.top { - vertical-align: top !important; -} - -.bottom { - vertical-align: bottom !important; -} - -.middle { - vertical-align: middle !important; -} - -.nowrap { - white-space: nowrap !important; -} - -.hidden { - display: none !important; -} - -/* - * legacy hacks - */ - -[width="33%"] { - width: 33%; - max-width: 33%; -} - -[width="50%"] { - width: 50%; - max-width: 50%; -} - -[data-name="_freq"] select { - min-width: auto; -} - -.cbi-value-field > div:first-child + br { - display: none; -} - -/* - * typography - */ - -h1, h2, h3, h4, h5, h6, -.cbi-section > legend:first-child { - font-weight: bold; - margin: 0 0 1rem 0; -} - -strong, b { - font-weight: bold; -} - -h1 { font-size: 160%; } -h2 { font-size: 150%; } -h3 { font-size: 140%; } -h4 { font-size: 130%; } -h5 { font-size: 120%; } -h6 { font-size: 110%; } - -.cbi-section > legend:first-child { font-size: 140%; } - -p, ul, textarea { - margin: 0 0 1em 0; -} - -p > textarea:last-child { - margin: 0; -} - -var { - color: var(--main-dark-color); - font-weight: bold; -} - -code { - font-family: monospace; - color: var(--main-dark-color); -} - -pre { - font-family: monospace; - margin: 0 0 1em 0; - font-size: .9rem; - box-shadow: inset 0 0 2px var(--main-dark-color); - padding: .25rem; - overflow: auto; -} - -big { - font-size: 110%; -} - -small { - font-size: 95%; -} - -ul { - padding: 0 0 0 1.5em; -} - -ul > li { - list-style: disc; -} - -p > a { - text-decoration: underline; -} - -/* - * widgets - */ - -.ifacebox, .ifacebadge, .zonebadge { - display: inline-flex; - line-height: 1.8em; - padding: 0 .25em; - margin: .25em; - box-shadow: 0px 0px 2px var(--main-dark-color); - font-size: .9em; - border-radius: .5em; - overflow: hidden; - font-size: .8rem; - vertical-align: text-top; - background: var(--secondary-bright-color); - align-items: center; - color: var(--secondary-dark-color); - vertical-align: middle; -} - -.zonebadge > .ifacebadge { - margin: .125em -.125em .125em .35em; -} - -.zonebadge > .ifacebadge > img -{ - margin: .125em 0 .125em .25em; -} - -.ifacebox { - display: inline-flex; - flex-direction: column; - padding: 0; - text-align: center; - width: 100%; - max-width: 150px; -} - -.ifacebox-head { - background: var(--main-bright-color); - width: 100%; -} - -.ifacebox-body { - text-align: center; - padding: .3em .25em .25em .25em; - white-space: nowrap; -} - -.ifacebadge { - display: inline-flex; - align-items: center; -} - -.ifacebadge.large { - line-height: 1.3em; -} - -.ifacebadge > img { - vertical-align: text-bottom; - margin: .25em; - height: 16px; -} - -.ifacebadge > * { - margin-left: .25em; -} - -.network-status-table { - display: inline-flex; - flex-wrap: wrap; - width: 100%; - margin: 0 -.2em 1em -.2em; -} - -.network-status-table > .ifacebox { - max-width: none; - flex: 1 1 45%; - margin: .25em; - min-width: 250px; -} - -.network-status-table > .ifacebox .ifacebadge { - font-size: 100%; - max-width: none; - flex: 1 1 45%; - margin: .2em; -} - -.network-status-table .ifacebox-body > div { - display: flex; - flex-wrap: wrap; - margin: .3em -.1em -.1em -.1em; -} - -.cbi-tooltip-container { - cursor: help; -} - -.cbi-tooltip { - position: absolute; - z-index: 10000; - left: -10000px; - box-shadow: 0 0 2px rgba(0, 0, 0, .7); - border-radius: 3px; - background: var(--secondary-bright-color); - white-space: pre; - padding: 2px 5px; - opacity: 0; - transition: opacity .25s ease-in; - font-size: .8rem; -} - -.cbi-tooltip.error { - color: var(--danger-color); -} - -.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) { - left: auto; - opacity: 1; - transition: opacity .25s ease-in; -} - -.zone-forwards { - display: flex; - align-items: center; -} - -.cbi-progressbar { - border-radius: .25em; - position: relative; - min-width: 20rem; - height: 1.5em; - box-shadow: 0 0 2px var(--main-dark-color); - overflow: hidden; - margin: .125rem 0; -} - -.cbi-progressbar > div { - background: var(--main-bright-color); - height: 100%; - transition: width .25s ease-in; - width: 0%; -} - -.cbi-progressbar::after { - position: absolute; - bottom: 0; - top: 0; - right: 0; - left: 0; - text-align: center; - text-shadow: 0 0 2px var(--secondary-bright-color); - content: attr(title); - white-space: nowrap; - line-height: 1.5em; -} - -.cbi-tabmenu { - padding: 0; - margin: 0 -.5em 1em -.5em; - font-weight: bold; - color: var(--main-dark-color); -} - -.cbi-tabmenu > li { - display: inline-flex; - white-space: nowrap; - opacity: 1; - height: 1.8em; - max-height: none; - overflow: visible; -} - -.cbi-tabmenu > li > a { - flex: 1; - margin: .1em .5em; -} - -.cbi-tabmenu > .cbi-tab > a { - border-bottom: 2px solid var(--main-dark-color); -} - -[data-tab] { - opacity: 0; - max-height: 0; - transition: opacity .25s ease-in-out; - overflow: hidden; -} - -[data-tab-active="true"] { - opacity: 1; - height: auto; - max-height: none; - overflow: visible; -} - -.alert-message:not(.modal) { - box-shadow: 0 0 3px var(--secondary-dark-color); - padding: .5em; - margin: 0 0 1em 0; - background: var(--warning-color); - color: var(--secondary-bright-color); - transition: opacity .4s ease; -} - -.alert-message + .alert-message { - margin: -.5em 0 1em 0; -} - -.alert-message.info { - background: var(--main-bright-color); -} - -.alert-message.warning { - background: var(--warning-color); -} - -.alert-message.danger { - background: var(--danger-color); -} - -.alert-message.success { - background: var(--success-color); -} - -.alert-message .btn { - background: inherit; - box-shadow: 0 0 2px var(--secondary-bright-color); -} - -.alert-message .btn:hover { - box-shadow: 0 0 4px 1px var(--secondary-bright-color); -} - -@keyframes fade-in { - 0% { opacity: 0; } - 100% { opacity: 1; } -} - -@keyframes fade-out { - 0% { opacity: 1; } - 100% { opacity: 0; } -} - -.fade-in { - animation: fade-in .4s ease; -} - -.fade-out { - animation: fade-out .4s ease; - opacity: 0; -} - -/* - * forms - */ - -button, .btn { - background: var(--main-bright-color); - color: var(--secondary-bright-color); - line-height: 1.5em; - border-radius: .25em; - cursor: pointer; - box-shadow: 0 0 2px var(--main-dark-color); - padding: 0 .5em; - display: inline-block; -} - -button:hover, .btn:hover { - box-shadow: 0 0 6px var(--main-bright-color); -} - -button + button, .btn + .btn, button + .btn, .btn + button, select + button { - margin-left: .25em; -} - -button.important { - background: var(--main-dark-color); -} - -button[disabled], button.disabled, .btn[disabled], .btn.disabled { - pointer-events: none; - opacity: .6; -} - -.cbi-button-apply, .cbi-button-positive { - background: var(--main-dark-color); -} - -.cbi-button-negative, .cbi-button-remove { - background: var(--danger-color); -} - -.cbi-checkbox { - position: relative; -} - -.cbi-checkbox input[type="checkbox"] { - position: absolute; - z-index: 10; - -webkit-appearence: button; - height: 1.3em; - width: 1.3em; - opacity: 0; - cursor: pointer; -} - -.cbi-checkbox input[type="checkbox"] + label { - position: relative; - display: inline-block; - width: 1.3em; - height: 1.3em; - vertical-align: text-top; -} - -.cbi-checkbox input[type="checkbox"] + label::before { - content: "\0a"; - height: 1em; - width: 1em; - box-shadow: 0 0 2px var(--main-dark-color); - display: inline-block; - border-radius: .25em; - margin: .15em 0; - position: absolute; - left: 0; - top: 0; -} - -.cbi-checkbox input[type="checkbox"]:checked + label::after { - content: "\0a"; - position: absolute; - display: inline-block; - background: var(--main-dark-color); - top: .35em; - left: .2em; - width: .6em; - height: .6em; - border-radius: .15em; - cursor: pointer; -} - -.cbi-checkbox input.cbi-input-invalid[type="checkbox"] + label::before { - box-shadow: 0 0 2px var(--danger-color); -} - -.cbi-checkbox input.cbi-input-invalid[type="checkbox"]:checked + label::after { - background: var(--danger-color); -} - -.cbi-checkbox input[type="checkbox"][disabled] + label::before, -.cbi-checkbox input[type="checkbox"][disabled] + label::after { - pointer-events: none; - opacity: .6; -} - -.cbi-checkbox input[type="checkbox"][disabled] { - pointer-events: none; -} - -input:not([type]), -input[type="text"], -input[type="password"], -select, -.cbi-dropdown:not(.btn):not(.cbi-button) { - border-bottom: 2px solid transparent; - box-shadow: inset 0 0 1px var(--main-dark-color); - padding: 0 .2rem; - line-height: 1.5rem; - min-height: calc(1.5rem + 2px); - min-width: 20rem; - border-radius: .25em; -} - -input:not([type]):focus, -input[type="text"]:focus, -input[type="password"]:focus, -select:focus, -.cbi-dropdown:not(.btn):not(.cbi-button):focus, -.cbi-dropdown[open]:not(.btn):not(.cbi-button) { - border-color: var(--main-dark-color); -} - -input[disabled]:not([type]), -input[disabled][type="text"], -input[disabled][type="password"], -select[disabled], -.cbi-dynlist[disabled] { - opacity: .6; - pointer-events: none; -} - -input:not([type]) + .btn, input:not([type]) + button, -input[type="text"] + .btn, input[type="text"] + button, -input[type="password"] + .btn, input[type="password"] + button { - margin: 0 0 2px -1px; - background: var(--main-dark-color); - border-radius: 0 .25em .25em 0; -} - -.control-group > select + .btn, .control-group > select + button { - margin-left: .25em; -} - -.control-group > input:not([type]) + .btn, .control-group > input:not([type]) + button, -.control-group > input[type="text"] + .btn, .control-group > input[type="text"] + button, -.control-group > input[type="password"] + .btn, .control-group > input[type="password"] + button { - margin: .125em .125em calc(.125em + 2px) calc(-.125em - .25em) !important; -} - -input[type="checkbox"] { - height: 1em; - vertical-align: middle; - -webkit-appearance: checkbox; -} - -select { - padding: .1rem 0; - -webkit-appearance: menulist; -} - -textarea { - width: 100%; - box-shadow: inset 0 0 2px var(--main-dark-color); - font-family: monospace; - font-size: .9rem; - padding: .2rem; -} - -.cbi-input-invalid, -.cbi-input-invalid:focus { - color: var(--danger-color); - border-color: var(--danger-color) !important; - box-shadow: inset 0 0 2px var(--danger-color); -} - -.control-group { - display: inline-flex; - margin: 0 -.125rem; - min-width: 20.25em; -} - -.control-group > *, -.control-group > .cbi-dropdown > ul > li { - justify-content: space-around; -} - -.control-group > * { - margin: .125rem !important; - min-width: auto !important; -} - -.control-group > select, -.control-group > input:not([type]), -.control-group > input[type="text"], -.control-group > input[type="password"] { - flex: 10; -} - -.cbi-value { - display: flex; - flex-wrap: wrap; - margin: 0 0 1em 0; -} - -.cbi-value > label:first-child { - flex: 1 1 40%; - padding: 0 .5em 0 0; -} - -.cbi-value > .cbi-value-field { - flex: 2 2 55%; -} - -.cbi-value > .cbi-section { - flex: 1 1 100%; -} - -.cbi-map-descr, -.cbi-tab-descr, -.cbi-section-descr, -.cbi-value-description, -.cbi-value[data-widget="CBI.DummyValue"] > div:first-child { - opacity: .8; - font-size: .9rem; - padding: .2em 0; -} - -.cbi-map-descr, -.cbi-tab-descr, -.cbi-section-descr, -.cbi-section-table, -.cbi-section-create { - margin: 0 0 1em 0; -} - -.cbi-dynlist { - display: inline-block; - font-size: 90%; - min-height: calc(1.5em + 2px); - line-height: 1.5em; - min-width: 20rem; - flex-wrap: wrap; -} - -.cbi-dynlist > .item { - box-shadow: 0 0 2px var(--main-dark-color); - margin: .3em 0; - padding: .15em 2em .15em .2em; - border-radius: .25em; - position: relative; - overflow: hidden; - transition: box-shadow .25s ease-in-out; - pointer-events: none; - flex: 1 1 100%; - word-break: break-all; -} - -.cbi-dynlist > .item::after { - content: "-"; - top: 0; - right: 0; - bottom: 0; - width: 1.6rem; - background: var(--main-bright-color); - display: flex; - align-items: center; - justify-content: space-around; - position: absolute; - box-shadow: 0 0 2px var(--main-dark-color); - text-align: center; - color: var(--secondary-bright-color); - cursor: pointer; - pointer-events: all; -} - -.cbi-dynlist[disabled] > .item::after { - pointer-events: none; -} - -.cbi-dynlist > .item:hover { - box-shadow: 0 0 2px var(--main-bright-color); -} - -.cbi-dynlist > .add-item { - flex: 1; - display: flex; -} - -.cbi-dynlist > .add-item > input { - flex: 1; - min-width: 18.5rem; - border-radius: .25rem 0 0 .25rem; -} - -.cbi-dynlist > .add-item > .btn { - flex: 0 0 1.6rem; - margin: 0 0 2px -1px; - width: 1.6rem; - text-align: center; -} - -.cbi-dropdown { - display: inline-flex !important; - cursor: pointer; - height: auto; - position: relative; - padding: 0 !important; -} - -.cbi-dropdown:not(.btn):not(.cbi-button) { - box-shadow: inset 0 0 1px var(--main-dark-color); -} - -.cbi-dropdown > ul { - margin: 0 !important; - padding: 0; - list-style: none; - overflow-x: hidden; - overflow-y: auto; - display: flex; - width: 100%; -} - -.cbi-dropdown.btn > ul:not(.dropdown) { - padding-left: .5em; -} - -.cbi-dropdown.btn.spinning > ul:not(.dropdown) { - padding-left: 0; -} - -.cbi-dropdown.btn > ul.dropdown > li { - color: var(--main-dark-color); -} - -.cbi-dropdown > ul.preview { - display: none; -} - -.cbi-dropdown > .open, -.cbi-dropdown > .more { - flex-grow: 0; - flex-shrink: 0; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; - padding: 0 .25em; -} - -.cbi-dropdown.btn > .open, -.cbi-dropdown.cbi-button > .open { - padding: 0 .5em; - margin-left: .5em; - border-left: 1px solid; -} - -.cbi-dropdown > .more, -.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li[placeholder] { - display: none; - justify-content: center; - color: rgba(0, 0, 0, .5); -} - -.cbi-dropdown > ul > li { - display: none; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 1; - flex-grow: 1; - align-items: center; - align-self: center; - color: inherit; -} - -.cbi-dropdown > ul.dropdown > li, -.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li { - padding: 0 .25em; -} - -.cbi-dropdown > ul > li .hide-open { display: block; display: initial; } -.cbi-dropdown > ul > li .hide-close { display: none; } - -.cbi-dropdown > ul > li[display]:not([display="0"]) { - border-left: 1px solid #ccc; -} - -.cbi-dropdown[empty] > ul { - max-width: 1px; - max-height: 1.5em; -} - -.cbi-dropdown > ul > li > form { - display: none; - margin: 0; - padding: 0; - pointer-events: none; -} - -.cbi-dropdown > ul > li img { - align-self: center; - margin-right: .25em; -} - -.cbi-dropdown > ul > li input[type="text"] { - margin: .25em 0; - border: none; - background: var(--secondary-bright-color); -} - -.cbi-dropdown[open] { - position: relative; -} - -.cbi-dropdown[open] > ul.dropdown { - display: block; - background: var(--secondary-bright-color); - box-shadow: 0 0 1px var(--main-dark-color), 0 0 4px rgba(0, 0, 0, .7); - position: absolute; - z-index: 1100; - max-width: none; - min-width: 100%; - width: auto; - transition: max-height .125s ease-in; -} - -.cbi-dropdown > ul > li[display], -.cbi-dropdown[open] > ul.preview, -.cbi-dropdown[open] > ul.dropdown > li, -.cbi-dropdown[multiple] > ul > li > label, -.cbi-dropdown[multiple][open] > ul.dropdown > li, -.cbi-dropdown[multiple][more] > .more, -.cbi-dropdown[multiple][empty] > .more { - flex-grow: 1; - display: flex !important; -} - -.cbi-dropdown[empty] > ul > li, -.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder], -.cbi-dropdown[multiple][open] > ul.dropdown > li > form { - display: block !important; -} - -.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; } -.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: block; display: initial; } - -.cbi-dropdown[open] > ul.dropdown > li { - border-bottom: 1px solid #ccc; -} - -.cbi-dropdown[open] > ul.dropdown > li[selected] { - background: var(--main-dark-color); - color: var(--secondary-bright-color); -} - -.cbi-dropdown[open] > ul.dropdown > li.focus { - background: var(--main-bright-color); -} - -.cbi-dropdown[open] > ul.dropdown > li:last-child { - margin-bottom: 0; - border-bottom: none; -} - -.cbi-dropdown[open] > ul.dropdown > li[unselectable] { - opacity: 0.7; -} - -.cbi-dropdown[open] > ul.dropdown > li > input.create-item-input:first-child:last-child { - width: 100%; -} - -.cbi-dropdown[disabled] { - pointer-events: none; - opacity: .6; -} - -.cbi-filebrowser { - max-width: 100%; - width: 1px; - box-shadow: 0 0 2px var(--main-dark-color); - border-radius: .25rem; - display: flex; - flex-direction: column; - opacity: 0; - height: 0; - overflow: hidden; -} - -.cbi-filebrowser.open { - min-width: 20rem; - width: auto; - opacity: 1; - height: auto; - overflow: visible; - transition: opacity .25s ease-in; -} - -.cbi-filebrowser > * { - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - padding: 0 0 .25em 0; - margin: .25em .25em 0px .25em; - white-space: nowrap; - border-bottom: 1px solid var(--main-dark-color); -} - -.cbi-filebrowser .cbi-button-positive { - margin-right: .25em; -} - -.cbi-filebrowser > div { - border-bottom: none; -} - -.cbi-filebrowser > ul > li { - display: flex; - flex-direction: row; - align-items: center; -} - -.cbi-filebrowser > ul > li a:hover { - font-weight: bold; - text-decoration: underline; -} - -.cbi-filebrowser > ul > li > div:first-child { - flex: 10; - overflow: hidden; - text-overflow: ellipsis; -} - -.cbi-filebrowser > ul > li > div:last-child { - flex: 3 3 10em; - text-align: right; -} - -.cbi-filebrowser > ul > li > div:last-child > button { - padding: .125em .25em; - margin: 1px 0 1px .25em; -} - -.cbi-filebrowser .upload { - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin: 0 -.125em .25em -.125em; - padding: 0 0 .125em 0px; - border-bottom: 1px solid var(--main-dark-color); -} - -.cbi-filebrowser .upload > * { - margin: .125em; - flex: 1; -} - -.cbi-filebrowser .upload > div > input { - width: 100%; -} - -.cbi-section-actions { - text-align: right; -} - -.cbi-page-actions { - flex-wrap: wrap; - width: 100%; - justify-content: flex-end; - margin-bottom: 1em; - margin-top: 1em; - border-top: 1px solid var(--main-dark-color); - padding-top: 1em; - text-align: right; -} - -div[id$=".ipaddr"] > input, -.cbi-value-field > div > input[type="password"] { - min-width: 18.5rem; - border-radius: .25rem 0 0 .25rem; -} - -div[id$=".txpower"] { - flex-wrap: wrap; - align-items: center; -} - -div[id$=".txpower"] > span { - white-space: nowrap; - margin-left: .25em; -} - -div[id$=".editlist"] { - flex: 1; -} - -[data-errors]::after { - content: attr(data-errors); - background: var(--danger-color); - color: var(--secondary-bright-color); - border-radius: .6rem; - height: 1.1rem; - padding: 0 .25rem; - font-size: .9rem; - display: inline-block; - font-weight: bold; - min-width: .6rem; - line-height: 1rem; - margin: -.1rem 0 0 -.2rem; - text-align: center; -} - -@keyframes spin { - 100% { transform: rotate(360deg); } -} - -.spinning { - position: relative; - padding-left: 2.1em !important; -} - -.spinning::before { - position: absolute; - display: block; - align-items: center; - top: 0; - bottom: 0; - left: .4em; - width: 1.4em; - height: 1.4em; - animation: spin 1s linear infinite; - content: url("spinner.svg"); - margin: auto; - line-height: 0; -} - -button.spinning, .btn.spinning { - padding-left: 1.6em !important; -} - -button.spinning::before, .btn.spinning::before { - filter: invert(1); - left: .2em; - width: 1.2em; - height: 1.2em; -} - -#view > div.spinning:first-child { - padding: .5em 0; -} - -#view > *:last-child { - margin: 0 0 1em 0; -} - -.label { - background: var(--main-bright-color); - color: var(--secondary-bright-color); - font-size: .8rem; - padding: 0 .4rem; - border-radius: .5rem; -} - -.label.warning { - background: var(--danger-color); -} - -.label.success { - background: var(--success-color); -} - -ul.deps { - margin: 0; - padding: 0; - font-size: .9rem; -} - -ul.errors { - margin: 0 0 1em 0; - padding: 0; -} - -@media only screen and (max-width: 800px) { - body { - padding-top: 70px; - } - - #maincontent { - padding: .25em; - max-width: 100vw; - } - - #menubar { - background: var(--main-bright-color); - padding: 0 .5em; - position: fixed; - top: 0; - z-index: 1000; - } - - #menubar > h2 { - flex: 0 0 2em; - display: block; - border: 2px solid var(--secondary-bright-color); - color: var(--secondary-bright-color); - border-radius: .5em; - cursor: pointer; - font-size: 100%; - margin: 0 1em 0 0; - } - - #menubar > h2:hover { - border-color: var(--secondary-bright-color); - color: var(--secondary-bright-color); - } - - #menubar > h2 > * { - display: none; - } - - #menubar > h2::before { - content: "☰"; - width: 35px; - line-height: 35px; - text-align: center; - display: inline-block; - color: inherit; - font-weight: bold; - } - - #menubar > h2.active::before { - content: "×"; - font-size: 200%; - } - - #menubar .hostname { - font-size: 1.6em; - } - - .distversion { - display: none; - } - - #modemenu { - padding: .125em .25em; - } - - #mainmenu { - overflow-x: hidden; - overflow-y: auto; - max-width: 0; - padding: 1em 0; - transition: max-width .25s ease-in-out, padding .25s ease-in-out; - position: fixed; - z-index: 900; - height: 100%; - } - - #mainmenu.active { - max-width: 200px; - padding: 1em 1em calc(1em + 70px) 1em; - overflow-x: visible; - } - - #mainmenu > div { - position: static; - } - - #mainmenu ul > li { - padding: .25em 0; - } - - .hide-xs { - display: none !important; - } - - table { - display: flex; - flex-direction: column; - } - - tr { - display: block; - border-bottom: 1px solid var(--main-dark-color); - margin-bottom: .5em; - padding-bottom: .5em; - } - - tr.cbi-section-table-titles[data-title]::before, - tr.cbi-section-table-titles, - tr.cbi-section-table-descr { - display: none; - } - - tr[data-title]::before { - display: block; - font-weight: bold; - border-top: none; - padding: .4em 0; - font-size: 110%; - } - - td { - display: block; - border-top: none; - text-align: left !important; - padding: .2em 0; - } - - th, table-titles { - display: none; - } - - td[data-title] { - position: relative; - padding: .2em 0 .2em 40%; - } - - td[data-title]::before { - content: attr(data-title) ": "; - white-space: nowrap; - font-weight: bold; - width: 40%; - overflow: hidden; - text-overflow: ellipsis; - position: absolute; - left: 0; - top: 0; - bottom: 0; - padding: .2em 0; - text-align: left; - display: inline-flex; - align-items: center; - } - - td[data-title]::after { - content: ""; - width: 2em; - position: absolute; - left: calc(40% - 2em); - top: 0; - bottom: 0; - display: block; - background: linear-gradient(90deg, rgba(255, 255, 255, 0), var(--secondary-bright-color) 90%); - } - - [data-page="admin-status-overview"] .cbi-section:nth-of-type(1) td:first-of-type, - [data-page="admin-status-overview"] .cbi-section:nth-of-type(2) td:first-of-type { - font-weight: bold; - max-width: none; - width: 100%; - } - - [data-page="admin-status-overview"] td > span > span { font-size: .9rem; } - - [data-page="admin-status-routes"] table:nth-of-type(3) td:nth-of-type(1) { word-break: break-all; } - - [data-page="admin-network-firewall-zones"] td[data-name="_info"] { - padding: .2em 0; - line-height: 2.2rem; - } - - [data-page="admin-network-firewall-zones"] td[data-name="_info"]::before, - [data-page="admin-network-firewall-zones"] td[data-name="_info"]::after { - display: none; - } - - [data-page="admin-network-firewall-zones"] td[data-name="_info"] label { - font-size: 1rem; - } - - #cbi-wireless-wifi-device tr { display: flex; flex-wrap: wrap; } - #cbi-wireless-wifi-device tr > *:nth-child(1) { flex: 1 1 20%; align-self: center; } - #cbi-wireless-wifi-device tr > *:nth-child(2) { flex: 2 2 75%; } - #cbi-wireless-wifi-device tr > *:nth-child(3) { flex: 3 3 100%; } - - #cbi-network-interface tr { display: flex; flex-wrap: wrap; } - #cbi-network-interface tr > *:nth-child(1) { flex: 1 1 33%; align-self: center; } - #cbi-network-interface tr > *:nth-child(2) { flex: 2 2 60%; align-self: center; font-size: .9rem; overflow: hidden; } - #cbi-network-interface tr > *:nth-child(3) { flex: 3 3 100%; } - #cbi-network-interface tr > *:nth-child(2) > div { overflow: hidden; text-overflow: ellipsis; } - - .assoclist tr { - display: flex; - flex-wrap: wrap; - } - - .assoclist td > .ifacebadge { - max-width: 90px; - } - - .assoclist td > .ifacebadge > img { - margin: 0 35px; - } - - .assoclist td > .ifacebadge > span { - display: none; - } - - .assoclist td > .ifacebadge[data-ifname]::after { - content: attr(data-ifname); - } - - .assoclist td > .ifacebadge[data-signal]::after { - content: attr(data-signal) " dBm"; - } - - .assoclist td:nth-of-type(3) { - font-weight: bold; - font-size: 1rem; - } - - .assoclist td:nth-of-type(1), .assoclist td:nth-of-type(4) { - flex: 1 1 100px; - margin-right: .5em; - } - - .assoclist td:nth-of-type(3), .assoclist td:nth-of-type(5) { - flex: 2 2 calc(100% - 110px); - overflow: hidden; - text-overflow: ellipsis; - align-self: center; - } - - .assoclist td:nth-of-type(6) { flex: 1; text-align: right !important; } - .assoclist td[data-title] { padding: .2em 0; } - .assoclist td[data-title]::before, - .assoclist td[data-title]::after { display: none; } - - .leases6 td:nth-of-type(3) { word-wrap: break-word; } - - td.cbi-section-actions > div { display: flex; } - td.cbi-section-actions > div > * { flex: 1; } - - body.modal-overlay-active #modal_overlay > .modal { - width: 95%; - margin: 5% auto; - } - - input:not([type]), - input[type="text"], - input[type="password"], - select, - .cbi-dropdown:not(.btn):not(.cbi-button), - .cbi-dynlist { - min-height: calc(2.2rem + 2px); - line-height: 2.2rem; - font-size: 1.2rem; - min-width: 10rem; - } - - button, .btn { - line-height: 1.8rem; - font-size: 1.2rem; - } - - select { - padding: .4em 0; - } - - .cbi-value > .cbi-value-field { - flex: 1 0 100%; - display: flex; - flex-direction: column; - max-width: 100%; - } - - .cbi-value > .cbi-value-field > div[id] { - display: flex; - flex-direction: row; - } - - .cbi-value > .cbi-value-field > div[id] > input, - .cbi-value > .cbi-value-field > div[id] > select, - .cbi-value > .cbi-value-field > div[id] > .cbi-filebrowser.open { - flex: 1; - width: 100%; - } - - .cbi-dynlist .item::after, - .cbi-dynlist .add-item > .btn { - line-height: 2em; - flex-basis: 2rem; - width: 2rem; - } - - .ifacebadge.large { - font-size: .9rem; - } - - .control-group > *, - .control-group > .cbi-dropdown > ul > li { - flex: 1; - white-space: normal; - word-wrap: break-word; - } - - .cbi-page-actions .cbi-dropdown, - .cbi-page-actions .cbi-button-apply:first-child { - flex-basis: 100%; - } - - .cbi-checkbox { - margin: .25rem; - } - - .cbi-tabmenu { - margin: 0 -.25em 1em -.25em; - } - - .cbi-tooltip { - font-size: 1rem; - box-shadow: 0 0 4px rgba(0, 0, 0, .7); - } - - .cbi-value > label:first-child { - padding: 0 0 .5em 0; - } - - [data-page="admin-system-admin-sshkeys"] .cbi-dynlist > .item { - font-size: .9rem; - line-height: 1rem; - } - - [data-page="admin-system-opkg"] .control-group { - flex-wrap: wrap; - } - - [data-page="admin-status-iptables"] h2 + div.right { - margin: 0 0 1em 0 !important; - display: flex; - } -} - -@media only screen and (min-width: 800px) and (max-width: 1200px) { - .assoclist tr > *:nth-of-type(2) { - display: none; - } -} diff --git a/package/luci/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm b/package/luci/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm deleted file mode 100644 index e9122f0b5c..0000000000 --- a/package/luci/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm +++ /dev/null @@ -1,17 +0,0 @@ -<%# - Copyright 2020 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -
    -
    - -

    - <% local ver = require "luci.version" -%> - Powered by <%= ver.luciname %> (<%= ver.luciversion %>) -

    - - - - - diff --git a/package/luci/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm b/package/luci/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm deleted file mode 100644 index ba0945a172..0000000000 --- a/package/luci/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm +++ /dev/null @@ -1,79 +0,0 @@ -<%# - Copyright 2020 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<% - local sys = require "luci.sys" - local util = require "luci.util" - local http = require "luci.http" - local disp = require "luci.dispatcher" - local ver = require "luci.version" - - local boardinfo = util.ubus("system", "board") or { } - - local node = disp.context.dispatched - local path = table.concat(disp.context.path, "-") - - http.prepare_content("text/html; charset=UTF-8") --%> - - - - - - - - - - - - -<%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI -<% if css then %> -<% end -%> - - - - - - - - - -
    - - -
    - <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") and path ~= "admin-system-admin-password" then -%> -
    -

    <%:No password set!%>

    -

    <%:There is no password set on this router. Please configure a root password to protect the web interface.%>

    - <% if disp.lookup("admin/system/admin") then %> - - <% end %> -
    - <%- end -%> - - <%- if boardinfo.rootfs_type == "initramfs" then -%> -
    -

    <%:System running in recovery (initramfs) mode.%>

    -

    <%:No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade%>

    - <% if disp.lookup("admin/system/flash") then %> - - <% end %> -
    - <%- end -%> - - diff --git a/package/luci/themes/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 b/package/luci/themes/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 deleted file mode 100755 index 7c49acfda9..0000000000 --- a/package/luci/themes/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -if [ "$PKG_UPGRADE" != 1 ]; then - uci get luci.themes.OpenWrt2020 >/dev/null 2>&1 || \ - uci batch <<-EOF - set luci.themes.OpenWrt2020=/luci-static/openwrt2020 - set luci.main.mediaurlbase=/luci-static/openwrt2020 - commit luci - EOF -fi - -exit 0 diff --git a/package/luci/themes/luci-theme-openwrt/Makefile b/package/luci/themes/luci-theme-openwrt/Makefile deleted file mode 100644 index b873d80727..0000000000 --- a/package/luci/themes/luci-theme-openwrt/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# -# Copyright (C) 2008-2014 The LuCI Team -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=LuCI OpenWrt.org theme -LUCI_DEPENDS:= - -include ../../luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/tabbg.png b/package/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/tabbg.png deleted file mode 100644 index c84c437cda41c321b58c331d91291d5ee78b4660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{O0VEi%{+3=05-1LGcVbv~PUa<$!<6Lh?!xdj zJxX;UkjGiz5n0T@z%2~Ij105pNB{-dOFVsD*>7<(i3%vGKaYzA3dwl7IEHXsPyTW0 si#YqA!(aG2|4x6Yf7yQ7exG`VTp5YG2iPA^1gc~3boFyt=akR{04u90xBvhE diff --git a/package/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm b/package/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm deleted file mode 100644 index 356b6dac10..0000000000 --- a/package/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm +++ /dev/null @@ -1,19 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -
    -
    -
    - -

    - <% local ver = require "luci.version" -%> - Powered by <%= ver.luciname %> (<%= ver.luciversion %>) -

    - - - - - diff --git a/package/luci/themes/luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt b/package/luci/themes/luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt deleted file mode 100755 index 7ee8c193d7..0000000000 --- a/package/luci/themes/luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -if [ "$PKG_UPGRADE" != 1 ]; then - uci get luci.themes.OpenWrt >/dev/null 2>&1 || \ - uci batch <<-EOF - set luci.themes.OpenWrt=/luci-static/openwrt.org - set luci.main.mediaurlbase=/luci-static/openwrt.org - commit luci - EOF -fi - -exit 0 diff --git a/package/network/config/adblock-fast/Makefile b/package/network/config/adblock-fast/Makefile new file mode 100644 index 0000000000..a5d137b39d --- /dev/null +++ b/package/network/config/adblock-fast/Makefile @@ -0,0 +1,80 @@ +# Copyright 2023 MOSSDeF, Stan Grishin (stangri@melmac.ca) +# TLD optimization written by Dirk Brenken (dev@brenken.org) +# This is free software, licensed under the GNU General Public License v3. + +include $(TOPDIR)/rules.mk + +PKG_NAME:=adblock-fast +PKG_VERSION:=1.1.1 +PKG_RELEASE:=1 +PKG_MAINTAINER:=Stan Grishin +PKG_LICENSE:=GPL-3.0-or-later + +include $(INCLUDE_DIR)/package.mk + +define Package/adblock-fast + SECTION:=net + CATEGORY:=Network + TITLE:=AdBlock Fast Service + URL:=https://docs.openwrt.melmac.net/adblock-fast/ + DEPENDS:=+jshn +curl + DEPENDS+=+!BUSYBOX_DEFAULT_AWK:gawk + DEPENDS+=+!BUSYBOX_DEFAULT_GREP:grep + DEPENDS+=+!BUSYBOX_DEFAULT_SED:sed + DEPENDS+=+!BUSYBOX_DEFAULT_SORT:coreutils-sort + CONFLICTS:=simple-adblock + PROVIDES:=simple-adblock + PKGARCH:=all +endef + +define Package/adblock-fast/description +Fast AdBlocking script to block ad or abuse/malware domains with DNSMASQ or Unbound. +Script supports local/remote list of domains and hosts-files for both block-listing and allow-listing. +Please see https://docs.openwrt.melmac.net/adblock-fast/ for more information. +endef + +define Package/adblock-fast/conffiles +/etc/config/adblock-fast +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/adblock-fast/install + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/etc/init.d/adblock-fast $(1)/etc/init.d/adblock-fast + $(SED) "s|^\(readonly PKG_VERSION\).*|\1='$(PKG_VERSION)-$(PKG_RELEASE)'|" $(1)/etc/init.d/adblock-fast + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_CONF) ./files/etc/config/adblock-fast $(1)/etc/config/adblock-fast + $(INSTALL_DIR) $(1)/tmp + $(INSTALL_DATA) ./files/adblock-fast.config.update $(1)/tmp/adblock-fast.config.update + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./files/etc/uci-defaults/90-adblock-fast $(1)/etc/uci-defaults/90-adblock-fast +endef + +define Package/adblock-fast/postinst + #!/bin/sh + # check if we are on real system + if [ -z "$${IPKG_INSTROOT}" ]; then + sed -f /tmp/adblock-fast.config.update -i /etc/config/adblock-fast || true + /etc/init.d/adblock-fast enable + fi + exit 0 +endef + +define Package/adblock-fast/prerm + #!/bin/sh + # check if we are on real system + if [ -z "$${IPKG_INSTROOT}" ]; then + echo "Stopping service and removing rc.d symlink for adblock-fast" + /etc/init.d/adblock-fast stop || true + /etc/init.d/adblock-fast killcache || true + /etc/init.d/adblock-fast disable || true + fi + exit 0 +endef + +$(eval $(call BuildPackage,adblock-fast)) diff --git a/package/network/config/adblock-fast/files/README.md b/package/network/config/adblock-fast/files/README.md new file mode 100644 index 0000000000..827255ab2a --- /dev/null +++ b/package/network/config/adblock-fast/files/README.md @@ -0,0 +1,3 @@ +# README + +README has been moved to [https://docs.openwrt.melmac.net/adblock-fast/](https://docs.openwrt.melmac.net/adblock-fast/). diff --git a/package/network/config/adblock-fast/files/adblock-fast.config.update b/package/network/config/adblock-fast/files/adblock-fast.config.update new file mode 100644 index 0000000000..08f625eae1 --- /dev/null +++ b/package/network/config/adblock-fast/files/adblock-fast.config.update @@ -0,0 +1,15 @@ +s|http://winhelp2002.mvps.org/hosts.txt|https://winhelp2002.mvps.org/hosts.txt|g +s|list blocked_domains_url 'https://dbl.oisd.nl/basic'|list blocked_adblockplus_url 'https://small.oisd.nl/'|g +s|list blocked_domains_url 'https://dbl.oisd.nl/nsfw'|list blocked_adblockplus_url 'https://nsfw.oisd.nl/'|g +s|list blocked_domains_url 'https://dbl.oisd.nl/'|list blocked_adblockplus_url 'https://big.oisd.nl/'|g +s|list blocked_hosts_url 'https://hosts.oisd.nl/basic'|list blocked_adblockplus_url 'https://small.oisd.nl/'|g +s|list blocked_hosts_url 'https://hosts.oisd.nl/nsfw'|list blocked_adblockplus_url 'https://nsfw.oisd.nl/'|g +s|list blocked_hosts_url 'https://hosts.oisd.nl/'|list blocked_adblockplus_url 'https://big.oisd.nl/'|g +\|dshield.org|d +\|www.malwaredomainlist.com/hostslist/hosts.txt|d +\|https://mirror1.malwaredomains.com/files/justdomains|d +\|lists.disconnect.me|d +\|https://cdn.jsdelivr.net/gh/paulgb/BarbBlock/blacklists/domain-list.txt|d +\|dnsmasq.oisd.nl|d +\|dnsmasq2.oisd.nl|d +\|https://cdn.jsdelivr.net/gh/AdguardTeam/cname-trackers@master/combined_disguised_trackers_justdomains.txt|d diff --git a/package/network/config/adblock-fast/files/etc/config/adblock-fast b/package/network/config/adblock-fast/files/etc/config/adblock-fast new file mode 100644 index 0000000000..68a6392ff4 --- /dev/null +++ b/package/network/config/adblock-fast/files/etc/config/adblock-fast @@ -0,0 +1,120 @@ +config adblock-fast 'config' + option enabled '0' + list allowed_domain 'cdn.jsdelivr.net' + option allow_non_ascii '0' + option canary_domains_icloud '0' + option canary_domains_mozilla '0' + option compressed_cache '0' + option compressed_cache_dir '/etc' + option config_update_enabled '0' + option config_update_url 'https://cdn.jsdelivr.net/gh/openwrt/packages/net/adblock-fast/files/adblock-fast.config.update' + option curl_additional_param '' + option curl_max_file_size '30000000' + option curl_retry '3' + option debug '0' + option dns 'dnsmasq.servers' + list dnsmasq_instance '*' +# option dnsmasq_config_file_url 'https://big.oisd.nl/dnsmasq2' + option download_timeout '10' + option force_dns '1' + list force_dns_port '53' + list force_dns_port '853' +# ports listed below are used by some +# of the dnscrypt-proxy v1 resolvers +# list force_dns_port '553' +# list force_dns_port '1443' +# list force_dns_port '4343' +# list force_dns_port '4434' +# list force_dns_port '5443' +# list force_dns_port '8443' + option led 'none' + option parallel_downloads '1' + option pause_timeout '20' + option procd_trigger_wan6 '0' + option procd_boot_delay '0' + option procd_boot_wan_timeout '60' + option verbosity '2' + +config file_url + option url 'https://cdn.jsdelivr.net/gh/StevenBlack/hosts/hosts' + option size '6770929' + option action 'block' + option enabled '0' + +config file_url + option url 'https://raw.githubusercontent.com/AdguardTeam/cname-trackers/master/data/combined_disguised_trackers_justdomains.txt' + option size '6241707' + option action 'block' + option enabled '0' + +config file_url + option url 'https://big.oisd.nl/' + option size '6163363' + option action 'block' + option enabled '0' + +config file_url + option url 'https://cdn.jsdelivr.net/gh/bongochong/CombinedPrivacyBlockLists/NoFormatting/cpbl-ctld.txt' + option size '2608152' + option action 'block' + option enabled '0' + +config file_url + option url 'http://sysctl.org/cameleon/hosts' + option size '638545' + option action 'block' + option enabled '0' + +config file_url + option url 'https://cdn.jsdelivr.net/gh/kboghdady/youTube_ads_4_pi-hole/black.list' + option size '553006' + option action 'block' + option enabled '0' + +config file_url + option url 'https://raw.githubusercontent.com/AdguardTeam/cname-trackers/master/data/combined_disguised_clickthroughs_justdomains.txt' + option size '362170' + option action 'block' + option enabled '0' + +config file_url + option url 'https://someonewhocares.org/hosts/hosts' + option size '347410' + option action 'block' + option enabled '0' + +config file_url + option url 'https://winhelp2002.mvps.org/hosts.txt' + option size '334861' + option action 'block' + option enabled '0' + +config file_url + option url 'https://adaway.org/hosts.txt' + option size '243454' + option action 'block' + option enabled '0' + +config file_url + option url 'https://raw.githubusercontent.com/AdguardTeam/cname-trackers/master/data/combined_disguised_ads_justdomains.txt' + option size '222595' + option action 'block' + option enabled '0' + +config file_url + option url 'https://raw.githubusercontent.com/AdguardTeam/cname-trackers/master/data/combined_disguised_microsites_justdomains.txt' + option size '123275' + option action 'block' + option enabled '0' + +config file_url + option url 'https://pgl.yoyo.org/as/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext' + option size '99588' + option action 'block' + option enabled '0' + +config file_url + option url 'https://cdn.jsdelivr.net/gh/hoshsadiq/adblock-nocoin-list/hosts.txt' + option size '11149' + option action 'block' + option enabled '0' diff --git a/package/network/config/adblock-fast/files/etc/init.d/adblock-fast b/package/network/config/adblock-fast/files/etc/init.d/adblock-fast new file mode 100755 index 0000000000..bb09717705 --- /dev/null +++ b/package/network/config/adblock-fast/files/etc/init.d/adblock-fast @@ -0,0 +1,2125 @@ +#!/bin/sh /etc/rc.common +# Copyright 2023 MOSSDeF, Stan Grishin (stangri@melmac.ca) +# shellcheck disable=SC3043 + +# shellcheck disable=SC2034 +START=94 +# shellcheck disable=SC2034 +USE_PROCD=1 +LC_ALL=C + +readonly PKG_VERSION='dev-test' +readonly packageName='adblock-fast' +readonly serviceName="$packageName $PKG_VERSION" +readonly packageConfigFile="/etc/config/${packageName}" +readonly dnsmasqAddnhostsFile="/var/run/${packageName}/dnsmasq.addnhosts" +readonly dnsmasqAddnhostsCache="/var/run/${packageName}/dnsmasq.addnhosts.cache" +readonly dnsmasqAddnhostsGzip="${packageName}.dnsmasq.addnhosts.gz" +readonly dnsmasqAddnhostsFilter='s|^|127.0.0.1 |;s|$||' +readonly dnsmasqAddnhostsFilterIPv6='s|^|:: |;s|$||' +readonly dnsmasqConfFile="/tmp/dnsmasq.d/${packageName}" +readonly dnsmasqConfCache="/var/run/${packageName}/dnsmasq.conf.cache" +readonly dnsmasqConfGzip="${packageName}.dnsmasq.conf.gz" +readonly dnsmasqConfFilter='s|^|local=/|;s|$|/|' +readonly dnsmasqIpsetFile="/tmp/dnsmasq.d/${packageName}.ipset" +readonly dnsmasqIpsetCache="/var/run/${packageName}/dnsmasq.ipset.cache" +readonly dnsmasqIpsetGzip="${packageName}.dnsmasq.ipset.gz" +readonly dnsmasqIpsetFilter='s|^|ipset=/|;s|$|/adb|' +readonly dnsmasqNftsetFile="/tmp/dnsmasq.d/${packageName}.nftset" +readonly dnsmasqNftsetCache="/var/run/${packageName}/dnsmasq.nftset.cache" +readonly dnsmasqNftsetGzip="${packageName}.dnsmasq.nftset.gz" +readonly dnsmasqNftsetFilter='s|^|nftset=/|;s|$|/4#inet#fw4#adb4|' +readonly dnsmasqNftsetFilterIPv6='s|^|nftset=/|;s|$|/4#inet#fw4#adb4,6#inet#fw4#adb6|' +readonly dnsmasqServersFile="/var/run/${packageName}/dnsmasq.servers" +readonly dnsmasqServersCache="/var/run/${packageName}/dnsmasq.servers.cache" +readonly dnsmasqServersGzip="${packageName}.dnsmasq.servers.gz" +readonly dnsmasqServersFilter='s|^|server=/|;s|$|/|' +readonly smartdnsDomainSetFile="/var/run/${packageName}/smartdns.domainset" +readonly smartdnsDomainSetCache="/var/run/${packageName}/smartdns.domainset.cache" +readonly smartdnsDomainSetConfig="/var/run/${packageName}/smartdns.domainset.conf" +readonly smartdnsDomainSetGzip="${packageName}.smartdns.domainset.gz" +readonly smartdnsDomainSetFilter=';' +readonly smartdnsIpsetFile="/var/run/${packageName}/smartdns.ipset" +readonly smartdnsIpsetCache="/var/run/${packageName}/smartdns.ipset.cache" +readonly smartdnsIpsetConfig="/var/run/${packageName}/smartdns.ipset.conf" +readonly smartdnsIpsetGzip="${packageName}.smartdns.ipset.gz" +readonly smartdnsIpsetFilter=';' +readonly smartdnsNftsetFile="/var/run/${packageName}/smartdns.nftset" +readonly smartdnsNftsetCache="/var/run/${packageName}/smartdns.nftset.cache" +readonly smartdnsNftsetConfig="/var/run/${packageName}/smartdns.nftset.conf" +readonly smartdnsNftsetGzip="${packageName}.smartdns.nftset.gz" +readonly smartdnsNftsetFilter=';' +readonly unboundFile="/var/lib/unbound/adb_list.${packageName}" +readonly unboundCache="/var/run/${packageName}/unbound.cache" +readonly unboundGzip="${packageName}.unbound.gz" +readonly unboundFilter='s|^|local-zone: "|;s|$|" static|' +readonly A_TMP="/var/${packageName}.a.tmp" +readonly B_TMP="/var/${packageName}.b.tmp" +readonly SED_TMP="/var/${packageName}.sed.tmp" +readonly runningConfigFile="/dev/shm/${packageName}.config" +readonly runningErrorFile="/dev/shm/${packageName}.error" +readonly runningStatusFile="/dev/shm/${packageName}.status" +readonly hostsFilter='/localhost/d;/^#/d;/^[^0-9]/d;s/^0\.0\.0\.0.//;s/^127\.0\.0\.1.//;s/[[:space:]]*#.*$//;s/[[:cntrl:]]$//;s/[[:space:]]//g;/[`~!@#\$%\^&\*()=+;:"'\'',<>?/\|[{}]/d;/]/d;/\./!d;/^$/d;/[^[:alnum:]_.-]/d;' +readonly domainsFilter='/^#/d;s/[[:space:]]*#.*$//;s/[[:space:]]*$//;s/[[:cntrl:]]$//;/[[:space:]]/d;/[`~!@#\$%\^&\*()=+;:"'\'',<>?/\|[{}]/d;/]/d;/\./!d;/^$/d;/[^[:alnum:]_.-]/d;' +readonly adBlockPlusFilter='/^#/d;/^!/d;s/[[:space:]]*#.*$//;s/^||//;s/\^$//;s/[[:space:]]*$//;s/[[:cntrl:]]$//;/[[:space:]]/d;/[`~!@#\$%\^&\*()=+;:"'\'',<>?/\|[{}]/d;/]/d;/\./!d;/^$/d;/[^[:alnum:]_.-]/d;' +readonly dnsmasqFileFilter='\|^server=/[[:alnum:]_.-].*/|!d;s|server=/||;s|/.*$||' +readonly dnsmasq2FileFilter='\|^local=/[[:alnum:]_.-].*/|!d;s|local=/||;s|/.*$||' +readonly dnsmasq3FileFilter='\|^address=/[[:alnum:]_.-].*/|!d;s|address=/||;s|/.*$||' +readonly _ERROR_='\033[0;31mERROR\033[0m' +readonly _OK_='\033[0;32m\xe2\x9c\x93\033[0m' +readonly _FAIL_='\033[0;31m\xe2\x9c\x97\033[0m' +readonly __OK__='\033[0;32m[\xe2\x9c\x93]\033[0m' +readonly __FAIL__='\033[0;31m[\xe2\x9c\x97]\033[0m' +readonly _WARNING_='\033[0;33mWARNING\033[0m' +# shellcheck disable=SC2155 +readonly ipset="$(command -v ipset)" +# shellcheck disable=SC2155 +readonly nft="$(command -v nft)" +readonly canaryDomainsMozilla='use-application-dns.net' +readonly canaryDomainsiCloud='mask.icloud.com mask-h2.icloud.com' +readonly triggersReload='parallel_downloads debug download_timeout allowed_domain blocked_domain allowed_url blocked_url dns config_update_enabled config_update_url dnsmasq_config_file_url curl_additional_param curl_max_file_size curl_retry' +readonly triggersRestart='compressed_cache compressed_cache_dir force_dns led force_dns_port' + +dl_command= +dl_flag= +isSSLSupported= +outputFilter= +outputFilterIPv6= +outputFile= +outputGzip= +outputCache= +awk='awk' +load_environment_flag= +allowed_url= +blocked_url= +fw4_restart_flag= + +# shellcheck disable=SC1091 +. /lib/functions.sh +# shellcheck disable=SC1091 +. /lib/functions/network.sh +# shellcheck disable=SC1091 +. /usr/share/libubox/jshn.sh + +append_newline() { is_newline_ending "$1" || echo '' >> "$1"; } +check_ipset() { { command -v ipset && /usr/sbin/ipset help hash:net; } >/dev/null 2>&1; } +check_nft() { command -v nft >/dev/null 2>&1; } +check_dnsmasq() { command -v dnsmasq >/dev/null 2>&1; } +check_dnsmasq_ipset() { + local o; + check_dnsmasq || return 1 + o="$(dnsmasq -v 2>/dev/null)" + check_ipset && ! echo "$o" | grep -q 'no-ipset' && echo "$o" | grep -q 'ipset' +} +check_dnsmasq_nftset() { + local o; + check_dnsmasq || return 1 + o="$(dnsmasq -v 2>/dev/null)" + check_nft && ! echo "$o" | grep -q 'no-nftset' && echo "$o" | grep -q 'nftset' +} +check_smartdns() { command -v smartdns >/dev/null 2>&1; } +check_smartdns_ipset() { check_smartdns && check_ipset; } +check_smartdns_nftset() { check_smartdns && check_nft; } +check_unbound() { command -v unbound >/dev/null 2>&1; } +config_cache() { + local param="$1" var="$2" + local _reload="$triggersReload" + local _restart="$triggersRestart" + local i ret + case "$param" in + create|set) + cp -f "/etc/config/${packageName}" "$runningConfigFile" + ;; + get) + case "$var" in + trigger_fw4) + ret='false' + if [ -s "$runningConfigFile" ]; then + local UCI_CONFIG_DIR="${runningConfigFile%/*}" + is_fw4_restart_needed && ret='true' + fi + printf "%b" "$ret" + return + ;; + trigger_service) + local old_allowed_url old_blocked_url + if [ ! -s "$runningConfigFile" ]; then + ret='on_boot' + else + for i in $_reload; do + local val_current val_old UCI_CONFIG_DIR + case "$i" in + allowed_url) + val_current="$allowed_url" + config_load "$runningConfigFile" + config_foreach append_url 'file_url' old_allowed_url old_blocked_url + val_old="$old_allowed_url" + ;; + blocked_url) + val_current="$blocked_url" + config_load "$runningConfigFile" + config_foreach append_url 'file_url' old_allowed_url old_blocked_url + val_old="$old_blocked_url" + ;; + *) + UCI_CONFIG_DIR= + val_current="$(uci_get "$packageName" 'config' "$i")" + UCI_CONFIG_DIR="${runningConfigFile%/*}" + val_old="$(uci_get "$packageName" 'config' "$i")" + ;; + esac + if [ "$val_current" != "$val_old" ]; then + ret='download' + unset _restart + break + fi + done + for i in $_restart; do + local val_current val_old UCI_CONFIG_DIR + UCI_CONFIG_DIR= + val_current="$(uci_get "$packageName" 'config' "$i")" + UCI_CONFIG_DIR="${runningConfigFile%/*}" + val_old="$(uci_get "$packageName" 'config' "$i")" + if [ "$val_current" != "$val_old" ]; then + ret='restart' + break + fi + done + fi + printf "%b" "$ret" + return + ;; + *) + local UCI_CONFIG_DIR="${runningConfigFile%/*}" + ret="$(uci_get "$packageName" 'config' "$var")" + printf "%b" "$ret" + return + ;; + esac + ;; + esac +} +debug() { local i j; for i in "$@"; do eval "j=\$$i"; echo "${i}: ${j} "; done; } +dns_set_output_values() { + case "$1" in + dnsmasq.addnhosts) + outputFilter="$dnsmasqAddnhostsFilter" + outputFile="$dnsmasqAddnhostsFile" + outputCache="$dnsmasqAddnhostsCache" + outputGzip="${compressed_cache_dir}/${dnsmasqAddnhostsGzip}" + if [ "$ipv6_enabled" -ne '0' ]; then + outputFilterIPv6="$dnsmasqAddnhostsFilterIPv6" + fi + ;; + dnsmasq.conf) + outputFilter="$dnsmasqConfFilter" + outputFile="$dnsmasqConfFile" + outputCache="$dnsmasqConfCache" + outputGzip="${compressed_cache_dir}/${dnsmasqConfGzip}" + ;; + dnsmasq.ipset) + outputFilter="$dnsmasqIpsetFilter" + outputFile="$dnsmasqIpsetFile" + outputCache="$dnsmasqIpsetCache" + outputGzip="${compressed_cache_dir}/${dnsmasqIpsetGzip}" + ;; + dnsmasq.nftset) + if [ "$ipv6_enabled" -ne '0' ]; then + outputFilter="$dnsmasqNftsetFilterIPv6" + else + outputFilter="$dnsmasqNftsetFilter" + fi + outputFile="$dnsmasqNftsetFile" + outputCache="$dnsmasqNftsetCache" + outputGzip="${compressed_cache_dir}/${dnsmasqNftsetGzip}" + ;; + dnsmasq.servers) + outputFilter="$dnsmasqServersFilter" + outputFile="$dnsmasqServersFile" + outputCache="$dnsmasqServersCache" + outputGzip="${compressed_cache_dir}/${dnsmasqServersGzip}" + ;; + smartdns.domainset) + outputFilter="$smartdnsDomainSetFilter" + outputFile="$smartdnsDomainSetFile" + outputCache="$smartdnsDomainSetCache" + outputGzip="${compressed_cache_dir}/${smartdnsDomainSetGzip}" + outputConfig="$smartdnsDomainSetConfig" + ;; + smartdns.ipset) + outputFilter="$smartdnsIpsetFilter" + outputFile="$smartdnsIpsetFile" + outputCache="$smartdnsIpsetCache" + outputGzip="${compressed_cache_dir}/${smartdnsIpsetGzip}" + outputConfig="$smartdnsIpsetConfig" + ;; + smartdns.nftset) + outputFilter="$smartdnsNftsetFilter" + outputFile="$smartdnsNftsetFile" + outputCache="$smartdnsNftsetCache" + outputGzip="${compressed_cache_dir}/${smartdnsNftsetGzip}" + outputConfig="$smartdnsNftsetConfig" + ;; + unbound.adb_list) + outputFilter="$unboundFilter" + outputFile="$unboundFile" + outputCache="$unboundCache" + outputGzip="$unboundGzip" + ;; + esac +} +dnsmasq_hup() { killall -q -s HUP dnsmasq; } +dnsmasq_kill() { killall -q -s KILL dnsmasq; } +dnsmasq_restart() { /etc/init.d/dnsmasq restart >/dev/null 2>&1; } +is_enabled() { uci_get "$1" 'config' 'enabled' '0'; } +is_fw4_restart_needed() { + [ "$fw4_restart_flag" = 'true' ] && return 0 + local dns force_dns + dns="$(uci_get "$packageName" 'config' 'dns' 'dnsmasq.servers')" + force_dns="$(uci_get "$packageName" 'config' 'force_dns' '1')" + if [ "$force_dns" = '1' ]; then + return 0 + elif [ "$dns" = 'dnsmasq.ipset' ]; then + return 0 + elif [ "$dns" = 'dnsmasq.nftset' ]; then + return 0 + elif [ "$dns" = 'smartdns.ipset' ]; then + return 0 + elif [ "$dns" = 'smartdns.nftset' ]; then + return 0 + else + return 1 + fi +} +is_integer() { + case "$1" in + (*[!0123456789]*) return 1;; + ('') return 1;; + (*) return 0;; + esac +} +is_greater() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1"; } +is_greater_or_equal() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" = "$2"; } +# shellcheck disable=SC3057 +is_https_url() { [ "${1:0:8}" = "https://" ]; } +is_newline_ending() { [ "$(tail -c1 "$1" | wc -l)" -ne '0' ]; } +is_present() { command -v "$1" >/dev/null 2>&1; } +is_running() { + local i j + i="$(json 'get' 'status')" + j="$(ubus_get_data 'status')" + if [ "$i" = 'statusStopped' ] || [ -z "${i}${j}" ]; then + return 1 + else + return 0 + fi +} +ipset() { "$ipset" "$@" >/dev/null 2>&1; } +get_version() { grep -m1 -A2 -w "^Package: $1$" /usr/lib/opkg/status | sed -n 's/Version: //p'; } +get_ram_free() { ubus call system info | jsonfilter -e '@.memory.free'; } +get_ram_total() { ubus call system info | jsonfilter -e '@.memory.total'; } +led_on(){ if [ -n "${1}" ] && [ -e "${1}/trigger" ]; then echo 'default-on' > "${1}/trigger" 2>&1; fi; } +led_off(){ if [ -n "${1}" ] && [ -e "${1}/trigger" ]; then echo 'none' > "${1}/trigger" 2>&1; fi; } +logger() { /usr/bin/logger -t "$packageName" "$@"; } +nft() { "$nft" "$@" >/dev/null 2>&1; } +output_ok() { output 1 "$_OK_"; output 2 "$__OK__\\n"; } +output_okn() { output 1 "$_OK_\\n"; output 2 "$__OK__\\n"; } +output_fail() { output 1 "$_FAIL_"; output 2 "$__FAIL__\\n"; } +output_failn() { output 1 "$_FAIL_\\n"; output 2 "$__FAIL__\\n"; } +print_json_bool() { json_init; json_add_boolean "$1" "$2"; json_dump; json_cleanup; } +print_json_int() { json_init; json_add_int "$1" "$2"; json_dump; json_cleanup; } +print_json_string() { json_init; json_add_string "$1" "$2"; json_dump; json_cleanup; } +sanitize_dir() { [ -d "$(readlink -fn "$1")" ] && readlink -fn "$1"; } +str_contains() { test "$1" != "$(str_replace "$1" "$2" '')"; } +str_contains_word() { echo "$1" | grep -q -w "$2"; } +# shellcheck disable=SC2018,SC2019 +str_to_lower() { echo "$1" | tr 'A-Z' 'a-z'; } +# shellcheck disable=SC2018,SC2019 +str_to_upper() { echo "$1" | tr 'a-z' 'A-Z'; } +str_replace() { printf "%b" "$1" | sed -e "s/$(printf "%b" "$2")/$(printf "%b" "$3")/g"; } +ubus_get_data() { ubus call service list "{ 'name': '$packageName' }" | jsonfilter -e "@['${packageName}'].instances.main.data.${1}"; } +ubus_get_ports() { ubus call service list "{ 'name': '$packageName' }" | jsonfilter -e "@['${packageName}'].instances.main.data.firewall.*.dest_port"; } +unbound_restart() { /etc/init.d/unbound restart >/dev/null 2>&1; } + +json() { +# shellcheck disable=SC2034 + local action="$1" param="$2" value="$3" + shift 3 +# shellcheck disable=SC2124 + local extras="$@" line + local status message error stats + local ret i + if [ -s "$runningStatusFile" ]; then + json_load_file "$runningStatusFile" 2>/dev/null + json_select 'data' 2>/dev/null + for i in status message error stats; do + json_get_var "$i" "$i" 2>/dev/null + done + fi + case "$action" in + get) + printf "%b" "$(eval echo "\$$param")" + return + ;; + add) + line="$(eval echo "\$$param")" + eval "$param"='${line:+$line }${value}${extras:+|$extras}' + ;; + del) + case "$param" in + all) + unset status message error stats;; + *) + unset "$param";; + esac + ;; + set) + eval "$param"='${value}${extras:+|$extras}' + ;; + esac + json_init + json_add_object 'data' + json_add_string version "$PKG_VERSION" + json_add_string status "$status" + json_add_string message "$message" + json_add_string error "$error" + json_add_string stats "$stats" + json_close_object + mkdir -p "${runningStatusFile%/*}" + json_dump > "$runningStatusFile" + sync +} + +get_local_filesize() { + local file="$1" size + [ -f "$file" ] || return 0 + if is_present stat; then + size="$(stat -c%s "$file")" + elif is_present wc; then + size="$(wc -c < "$file")" + fi +# shellcheck disable=SC3037 + echo -en "$size" +} + +get_url_filesize() { + local url="$1" size size_command + [ -n "$url" ] || return 0 + is_present 'curl' || return 0 + size_command='curl --silent --insecure --fail --head --request GET' +# size="$($size_command "$url" | grep -Po '^[cC]ontent-[lL]ength: \K\w+')" + size="$($size_command "$url" | grep -Eo '^[cC]ontent-[lL]ength: (.*)' | awk '{print $2}')" +# shellcheck disable=SC3037 + echo -en "$size" +} + +output() { +# Target verbosity level with the first parameter being an integer + is_integer() { + case "$1" in + (*[!0123456789]*) return 1;; + ('') return 1;; + (*) return 0;; + esac + } + local msg memmsg logmsg text + local sharedMemoryOutput="/dev/shm/$packageName-output" + if [ -z "$verbosity" ] && [ -n "$packageName" ]; then + verbosity="$(uci -q get "$packageName.config.verbosity")" + fi + verbosity="${verbosity:-2}" + if [ $# -ne 1 ] && is_integer "$1"; then + if [ $((verbosity & $1)) -gt 0 ] || [ "$verbosity" = "$1" ]; then shift; text="$*"; else return 0; fi + fi + text="${text:-$*}"; + [ -t 1 ] && printf "%b" "$text" +# shellcheck disable=SC3060 + msg="${text//$serviceName /service }"; + if [ "$(printf "%b" "$msg" | wc -l)" -gt 0 ]; then + [ -s "$sharedMemoryOutput" ] && memmsg="$(cat "$sharedMemoryOutput")" + logmsg="$(printf "%b" "${memmsg}${msg}" | sed 's/\x1b\[[0-9;]*m//g')" + logger -t "${packageName:-service} [$$]" "$(printf "%b" "$logmsg")" + rm -f "$sharedMemoryOutput" + else + printf "%b" "$msg" >> "$sharedMemoryOutput" + fi +} + +uci_add_list_if_new() { + local PACKAGE="$1" + local CONFIG="$2" + local OPTION="$3" + local VALUE="$4" + local i + [ -n "$PACKAGE" ] && [ -n "$CONFIG" ] && [ -n "$OPTION" ] && [ -n "$VALUE" ] || return 1 + for i in $(uci_get "$PACKAGE" "$CONFIG" "$OPTION"); do + [ "$i" = "$VALUE" ] && return 0 + done + uci_add_list "$PACKAGE" "$CONFIG" "$OPTION" "$VALUE" +} + +uci_changes() { + local PACKAGE="$1" + local CONFIG="$2" + local OPTION="$3" + if [ -s "${UCI_CONFIG_DIR:-/etc/config/}${PACKAGE}" ]; then + /sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} changes "$PACKAGE${CONFIG:+.$CONFIG}${OPTION:+.$OPTION}" + fi +} + +if type extra_command 1>/dev/null 2>&1; then + extra_command 'allow' 'Allows domain in current block-list and config' + extra_command 'check' 'Checks if specified domain is found in current block-list' + extra_command 'check_lists' 'Checks if specified domain is found in enabled block-lists' + extra_command 'dl' 'Force-downloads all enabled block-list' + extra_command 'killcache' 'Delete all cached files' + extra_command 'pause' 'Pauses AdBlocking for specified number of seconds (default: 60)' + extra_command 'sizes' 'Displays the file-sizes of enabled block-lists' + extra_command 'version' 'Show version information' +else +# shellcheck disable=SC2034 + EXTRA_COMMANDS='allow check dl killcache pause sizes status_service version' +# shellcheck disable=SC2034 + EXTRA_HELP=' allow Allows domain(s) in current block-list and config + check Checks if specified domain is found in current block-list + dl Force-downloads all enabled block-list + pause Pauses AdBlocking for specified number of seconds (default: 60) + sizes Displays the file-sizes of enabled block-lists' +fi + +get_text() { + local r + case "$1" in + errorConfigValidationFail) r="$packageName config validation failed";; + errorServiceDisabled) r="$packageName is currently disabled";; + errorNoDnsmasqIpset) + r="dnsmasq ipset support is enabled in $packageName, but dnsmasq is either not installed or installed dnsmasq does not support ipset";; + errorNoIpset) + r="dnsmasq ipset support is enabled in $packageName, but ipset is either not installed or installed ipset does not support 'hash:net' type";; + errorNoDnsmasqNftset) + r="dnsmasq nft set support is enabled in $packageName, but dnsmasq is either not installed or installed dnsmasq does not support nft set";; + errorNoNft) r="dnsmasq nft sets support is enabled in $packageName, but nft is not installed";; + errorNoWanGateway) r="The ${serviceName} failed to discover WAN gateway";; + errorOutputDirCreate) r="failed to create directory for %s file";; + errorOutputFileCreate) r="failed to create $outputFile file";; + errorFailDNSReload) r="failed to restart/reload DNS resolver";; + errorSharedMemory) r="failed to access shared memory";; + errorSorting) r="failed to sort data file";; + errorOptimization) r="failed to optimize data file";; + errorAllowListProcessing) r="failed to process allow-list";; + errorDataFileFormatting) r="failed to format data file";; + errorMovingDataFile) r="failed to move data file '${A_TMP}' to '${outputFile}'";; + errorCreatingCompressedCache) r="failed to create compressed cache";; + errorRemovingTempFiles) r="failed to remove temporary files";; + errorRestoreCompressedCache) r="failed to unpack compressed cache";; + errorRestoreCache) r="failed to move '$outputCache' to '$outputFile'";; + errorOhSnap) r="failed to create block-list or restart DNS resolver";; + errorStopping) r="failed to stop $serviceName";; + errorDNSReload) r="failed to reload/restart DNS resolver";; + errorDownloadingConfigUpdate) r="failed to download Config Update file";; + errorDownloadingList) r="failed to download";; + errorParsingConfigUpdate) r="failed to parse Config Update file";; + errorParsingList) r="failed to parse";; + errorNoSSLSupport) r="no HTTPS/SSL support on device";; + errorCreatingDirectory) r="failed to create output/cache/gzip file directory";; + errorDetectingFileType) r="failed to detect format";; + errorNothingToDo) r="no blocked list URLs nor blocked-domains enabled";; + errorTooLittleRam) r="free ram (%s) is not enough to process all enabled block-lists";; + + statusNoInstall) r="$serviceName is not installed or not found";; + statusStopped) r="Stopped";; + statusStarting) r="Starting";; + statusRestarting) r="Restarting";; + statusForceReloading) r="Force Reloading";; + statusDownloading) r="Downloading";; + statusProcessing) r="Processing";; + statusFail) r="failed to start";; + statusSuccess) r="Success";; + + warningExternalDnsmasqConfig) + r="use of external dnsmasq config file detected, please set 'dns' option to 'dnsmasq.conf'";; + warningMissingRecommendedPackages) r="some recommended packages are missing";; + warningInvalidCompressedCacheDir) r="invalid compressed cache directory '%s'";; + warningFreeRamCheckFail) r="can't detect free RAM";; + esac + shift +# shellcheck disable=SC2059 + printf "$r" "$@" +} + +load_network() { + local param="$1" + local i j wan_if wan_gw wan_proto + local counter wan_if_timeout="$procd_boot_wan_timeout" wan_gw_timeout='5' + counter=0 + while [ -z "$wan_if" ]; do + network_flush_cache + network_find_wan wan_if + if [ -n "$wan_if" ]; then + output "WAN interface found: '${wan_if}'.\\n" + break + fi + if [ "$counter" -gt "$wan_if_timeout" ]; then + output "WAN interface timeout, assuming 'wan'.\\n" + wan_if='wan' + break + fi + counter=$((counter+1)) + output "Waiting to discover WAN Interface...\\n" + sleep 1 + done + + counter=0 + wan_proto="$(uci -q get "network.${wan_if}.proto")" + if [ "$wan_proto" = 'pppoe' ]; then + wan_gw_timeout=$((wan_gw_timeout+10)) + fi + while [ "$counter" -le "$wan_gw_timeout" ]; do + network_flush_cache + network_get_gateway wan_gw "$wan_if" + if [ -n "$wan_gw" ]; then + output "WAN gateway found: '${wan_gw}.'\\n" + return 0 + fi + counter=$((counter+1)) + output "Waiting to discover $wan_if gateway...\\n" + sleep 1 + done + json add error 'errorNoWanGateway' + output "${_ERROR_}: $(get_text 'errorNoWanGateway')!\\n"; return 1; +} + +append_url() { + local cfg="$1" allow_var="${2:-allowed_url}" block_var="${3:-blocked_url}" + local old_value + local en action url + config_get_bool en "$cfg" enabled '1' + config_get action "$cfg" action 'block' + config_get url "$cfg" url + if [ "$en" = '1' ]; then + if [ "$action" = 'allow' ]; then + old_value=$(eval echo "\$$allow_var") + old_value="${old_value:+$old_value }${url}" + eval "$allow_var"="\$old_value" + else + old_value=$(eval echo "\$$block_var") + old_value="${old_value:+$old_value }${url}" + eval "$block_var"="\$old_value" + fi + fi +} + +detect_file_type() { + local file="$1" + if [ "$(head -1 "$file")" = '[Adblock Plus]' ] || \ + grep -q '^||' "$file"; then + echo 'adblockplus' + elif grep -q '^server=' "$file"; then + echo 'dnsmasq' + elif grep -q '^local=' "$file"; then + echo 'dnsmasq2' + elif grep -q '^address=' "$file"; then + echo 'dnsmasq3' + elif grep -q '^0\.0\.0\.0' "$file" || grep -q '^127\.0\.0\.1' "$file"; then + echo 'hosts' + elif [ -n "$(sed "$domainsFilter" "$file" | head -1)" ]; then + echo 'domains' + fi +} + +load_environment() { + local i j + local validation_result="$1" param="$2" + + [ -z "$load_environment_flag" ] || return 0 + + if [ "$validation_result" != '0' ]; then + json add error 'errorConfigValidationFail' + output "${_ERROR_}: $(get_text 'errorConfigValidationFail')!\\n" + output "Please check if the '$packageConfigFile' contains correct values for config options.\\n" + return 1 + fi + + if [ "$enabled" -eq 0 ]; then + json add error 'errorServiceDisabled' + output "${_ERROR_}: $(get_text 'errorServiceDisabled')!\\n" + output "Run the following commands before starting service again:\\n" + output "uci set ${packageName}.config.enabled='1'; uci commit $packageName;\\n" + return 1 + fi + + if [ "$debug" -ne '0' ]; then + exec 1>>"/tmp/$packageName.log" + exec 2>&1 + set -x + fi + +# TODO: check for resolver and error out on start + + if [ -n "$dnsmasq_config_file_url" ]; then + case "$dns" in + dnsmasq.conf) :;; + *) + if [ "$param" != 'quiet' ]; then + json add warning 'warningExternalDnsmasqConfig' + output "${_WARNING_}: $(get_text 'warningExternalDnsmasqConfig')!\\n" + fi + ;; + esac + fi + + case "$dns" in + dnsmasq.*) + if dnsmasq -v 2>/dev/null | grep -q 'no-IDN' || ! dnsmasq -v 2>/dev/null | grep -q -w 'IDN'; then + allow_non_ascii='0' + fi + ;; + smartdns.*) + allow_non_ascii='0' + ;; + unbound.*) + allow_non_ascii='1' + ;; + esac + + case "$dns" in + dnsmasq.ipset) + if dnsmasq -v 2>/dev/null | grep -q 'no-ipset' || ! dnsmasq -v 2>/dev/null | grep -q -w 'ipset'; then + if [ "$param" != 'quiet' ]; then + json add error 'errorNoDnsmasqIpset' + output "${_ERROR_}: $(get_text 'errorNoDnsmasqIpset')!\\n" + fi + dns='dnsmasq.servers' + fi + if ! ipset help hash:net; then + if [ "$param" != 'quiet' ]; then + json add error 'errorNoIpset' + output "${_ERROR_}: $(get_text 'errorNoIpset')!\\n" + fi + dns='dnsmasq.servers' + fi + ;; + dnsmasq.nftset) + if dnsmasq -v 2>/dev/null | grep -q 'no-nftset' || ! dnsmasq -v 2>/dev/null | grep -q -w 'nftset'; then + if [ "$param" != 'quiet' ]; then + json add error 'errorNoDnsmasqNftset' + output "${_ERROR_}: $(get_text 'errorNoDnsmasqNftset')!\\n" + fi + dns='dnsmasq.servers' + fi + if [ -z "$nft" ]; then + if [ "$param" != 'quiet' ]; then + json add error 'errorNoNft' + output "${_ERROR_}: $(get_text 'errorNoNft')!\\n" + fi + dns='dnsmasq.servers' + fi + ;; + smartdns.ipset) + if ! ipset help hash:net; then + if [ "$param" != 'quiet' ]; then + json add error 'errorNoIpset' + output "${_ERROR_}: $(get_text 'errorNoIpset')!\\n" + fi + dns='smartdns.domainset' + fi + ;; + smartdns.nftset) + if [ -z "$nft" ]; then + if [ "$param" != 'quiet' ]; then + json add error 'errorNoNft' + output "${_ERROR_}: $(get_text 'errorNoNft')!\\n" + fi + dns='smartdns.domainset' + fi + ;; + esac + + if [ "$(sanitize_dir "$compressed_cache_dir")" = '/' ]; then + compressed_cache_dir='' + elif [ -n "$(sanitize_dir "$compressed_cache_dir")" ]; then + compressed_cache_dir="$(sanitize_dir "$compressed_cache_dir")" + else + json add warning 'warningInvalidCompressedCacheDir' "$compressed_cache_dir" + output "${_WARNING_}: $(get_text 'warningInvalidCompressedCacheDir' "$compressed_cache_dir")!\\n" + compressed_cache_dir="/etc" + fi + + dns_set_output_values "$dns" + + [ "$dns" = 'dnsmasq.addnhosts' ] || rm -f "$dnsmasqAddnhostsFile" "$dnsmasqAddnhostsCache" "${compressed_cache_dir}/${dnsmasqAddnhostsGzip}" + [ "$dns" = 'dnsmasq.conf' ] || rm -f "$dnsmasqConfFile" "$dnsmasqConfCache" "${compressed_cache_dir}/${dnsmasqConfGzip}" + [ "$dns" = 'dnsmasq.ipset' ] || rm -f "$dnsmasqIpsetFile" "$dnsmasqIpsetCache" "${compressed_cache_dir}/${dnsmasqIpsetGzip}" + [ "$dns" = 'dnsmasq.nftset' ] || rm -f "$dnsmasqNftsetFile" "$dnsmasqNftsetCache" "${compressed_cache_dir}/${dnsmasqNftsetGzip}" + [ "$dns" = 'dnsmasq.servers' ] || rm -f "$dnsmasqServersFile" "$dnsmasqServersCache" "${compressed_cache_dir}/${dnsmasqServersGzip}" + [ "$dns" = 'smartdns.domainset' ] || rm -f "$smartdnsDomainSetFile" "$smartdnsDomainSetCache" "${compressed_cache_dir}/${smartdnsDomainSetGzip}" "$smartdnsDomainSetConfig" + [ "$dns" = 'smartdns.ipset' ] || rm -f "$smartdnsIpsetFile" "$smartdnsIpsetCache" "${compressed_cache_dir}/${smartdnsIpsetGzip}" "$smartdnsIpsetConfig" + [ "$dns" = 'smartdns.nftset' ] || rm -f "$smartdnsNftsetFile" "$smartdnsNftsetCache" "${compressed_cache_dir}/${smartdnsNftsetGzip}" "$smartdnsNftsetConfig" + [ "$dns" = 'unbound.adb_list' ] || rm -f "$unboundFile" "$unboundCache" "$unboundGzip" + + for i in "$runningConfigFile" "$runningErrorFile" "$runningStatusFile" "$outputFile" "$outputCache" "$outputGzip" "$outputConfig"; do + [ -n "$i" ] || continue + if ! mkdir -p "${i%/*}"; then + if [ "$param" != 'quiet' ]; then + json add error 'errorOutputDirCreate' "$i" + output "${_ERROR_}: $(get_text 'errorOutputDirCreate' "$i")!\\n" + fi + fi + done + + is_present 'gawk' && awk='gawk' + if ! is_present '/usr/libexec/grep-gnu' || ! is_present '/usr/libexec/sed-gnu' || \ + ! is_present '/usr/libexec/sort-coreutils' || ! is_present 'gawk'; then + local s + is_present 'gawk' || s="${s:+$s }gawk" + is_present '/usr/libexec/grep-gnu' || s="${s:+$s }grep" + is_present '/usr/libexec/sed-gnu' || s="${s:+$s }sed" + is_present '/usr/libexec/sort-coreutils' || s="${s:+$s }coreutils-sort" + if [ "$param" != 'quiet' ]; then + json add warning 'warningMissingRecommendedPackages' "$s" + output "${_WARNING_}: $(get_text 'warningMissingRecommendedPackages'), install them by running:\\n" + output "opkg update; opkg --force-overwrite install $s;\\n" + fi + fi + # Prefer curl because it supports the file:// scheme. + if is_present 'curl'; then + dl_command='curl --silent --insecure' + dl_command="${dl_command}${curl_additional_param:+ $curl_additional_param}" + dl_command="${dl_command}${curl_max_file_size:+ --max-filesize $curl_max_file_size}" + dl_command="${dl_command}${curl_retry:+ --retry $curl_retry}" + dl_command="${dl_command}${download_timeout:+ --connect-timeout $download_timeout}" + dl_flag='-o' + elif is_present '/usr/libexec/wget-ssl'; then + dl_command='/usr/libexec/wget-ssl --no-check-certificate -q' + dl_command="${dl_command}${download_timeout:+ --timeout $download_timeout}" + dl_flag="-O" + size_command='/usr/libexec/wget-ssl --no-check-certificate -q -O /dev/null --server-response' + size_command="${size_command}${download_timeout:+ --timeout $download_timeout}" + elif is_present wget && wget --version 2>/dev/null | grep -q "+https"; then + dl_command="wget --no-check-certificate -q" + dl_command="${dl_command}${download_timeout:+ --timeout $download_timeout}" + dl_flag="-O" + size_command='wget --no-check-certificate -q -O /dev/null --server-response' + size_command="${size_command}${download_timeout:+ --timeout $download_timeout}" + else + dl_command="uclient-fetch --no-check-certificate -q" + dl_command="${dl_command}${download_timeout:+ --timeout $download_timeout}" + dl_flag="-O" + fi + led="${led:+/sys/class/leds/$led}" + if curl --version 2>/dev/null | grep -q "https" \ + || wget --version 2>/dev/null | grep -q "+https" \ + || grep -q "libustream-mbedtls" /usr/lib/opkg/status \ + || grep -q "libustream-openssl" /usr/lib/opkg/status \ + || grep -q "libustream-wolfssl" /usr/lib/opkg/status; then + isSSLSupported=1 + else + unset isSSLSupported + fi + config_load "$packageName" + config_foreach append_url 'file_url' + load_environment_flag=1 + cache 'test' && return 0 + cache 'test_gzip' && return 0 + if [ "$param" = 'on_boot' ]; then + load_network "$param" + return "$?" + else + return 0 + fi +} + +resolver() { + _resolver_config() { + local cfg="$1" param="$2" + [ -s "/etc/config/dhcp" ] || return 0 + case "$param" in + dnsmasq.addnhosts) + if [ "$(uci_get 'dhcp' "$cfg" 'serversfile')" = "$dnsmasqServersFile" ]; then + uci_remove 'dhcp' "$cfg" 'serversfile' + fi + uci_add_list_if_new 'dhcp' "$cfg" 'addnhosts' "$dnsmasqAddnhostsFile" + ;; + cleanup|dnsmasq.conf|dnsmasq.ipset|dnsmasq.nftset|unbound.adb_list) + uci_remove_list 'dhcp' "$cfg" 'addnhosts' "$dnsmasqAddnhostsFile" + if [ "$(uci_get 'dhcp' "$cfg" 'serversfile')" = "$dnsmasqServersFile" ]; then + uci_remove 'dhcp' "$cfg" 'serversfile' + fi + ;; + dnsmasq.servers) + uci_remove_list 'dhcp' "$cfg" 'addnhosts' "$dnsmasqAddnhostsFile" + if [ "$(uci_get 'dhcp' "$cfg" 'serversfile')" != "$dnsmasqServersFile" ]; then + uci_set 'dhcp' "$cfg" 'serversfile' "$dnsmasqServersFile" + fi + ;; + esac + } + _smartdns_instance_config() { + [ -s "/etc/config/smartdns" ] || return 0 + local cfg="$1" param="$2" + case "$param" in + cleanup) + uci_remove_list 'smartdns' "$cfg" 'conf_files' "$outputConfig" + rm -f "$outputConfig" + ;; + smartdns.domainset) + { echo "domain-set -name adblock-fast -file $outputFile"; \ + echo "domain-rules /domain-set:adblock-fast/ -a #"; } > "$outputConfig" + uci_add_list_if_new 'smartdns' "$cfg" 'conf_files' "$outputConfig" + ;; + smartdns.ipset) + { echo "domain-set -name adblock-fast -file $outputFile"; \ + echo "domain-rules /domain-set:adblock-fast/ -ipset adb"; } > "$outputConfig" + uci_add_list_if_new 'smartdns' "$cfg" 'conf_files' "$outputConfig" + ;; + smartdns.nftset) + local nftset="#4:inet#fw4#adb4" + [ "$ipv6_enabled" -ne '0' ] && nftset="${nftset},#6:inet#fw4#adb6" + { echo "domain-set -name adblock-fast -file $outputFile"; \ + echo "domain-rules /domain-set:adblock-fast/ -nftset $nftset"; } > "$outputConfig" + uci_add_list_if_new 'smartdns' "$cfg" 'conf_files' "$outputConfig" + ;; + esac + } + + local param output_text i + case $1 in + cleanup) + rm -f "$dnsmasqAddnhostsFile" "$dnsmasqAddnhostsCache" "${compressed_cache_dir}/${dnsmasqAddnhostsGzip}" + rm -f "$dnsmasqConfFile" "$dnsmasqConfCache" "${compressed_cache_dir}/${dnsmasqConfGzip}" + rm -f "$dnsmasqIpsetFile" "$dnsmasqIpsetCache" "${compressed_cache_dir}/${dnsmasqIpsetGzip}" + rm -f "$dnsmasqNftsetFile" "$dnsmasqNftsetCache" "${compressed_cache_dir}/${dnsmasqNftsetGzip}" + rm -f "$dnsmasqServersFile" "$dnsmasqServersCache" "${compressed_cache_dir}/${dnsmasqServersGzip}" + rm -f "$smartdnsDomainSetFile" "$smartdnsDomainSetCache" "${compressed_cache_dir}/${smartdnsDomainSetGzip}" "$smartdnsDomainSetConfig" + rm -f "$smartdnsIpsetFile" "$smartdnsIpsetCache" "${compressed_cache_dir}/${smartdnsIpsetGzip}" "$smartdnsIpsetConfig" + rm -f "$smartdnsNftsetFile" "$smartdnsNftsetCache" "${compressed_cache_dir}/${smartdnsNftsetGzip}" "$smartdnsNftsetConfig" + rm -f "$unboundFile" "$unboundCache" "$unboundGzip" + if [ -s "/etc/config/dhcp" ]; then + config_load 'dhcp' + config_foreach _dnsmasq_instance_config 'dnsmasq' 'cleanup' + [ -n "$(uci_changes 'dhcp')" ] && uci_commit 'dhcp' + fi + if [ -s "/etc/config/smartdns" ]; then + config_load 'smartdns' + config_foreach _smartdns_instance_config 'smartdns' 'cleanup' + [ -n "$(uci_changes 'smartdns')" ] && uci_commit 'smartdns' + fi + ;; + on_start) + if [ ! -s "$outputFile" ]; then + json set status 'statusFail' + json add error 'errorOutputFileCreate' + output "${_ERROR_}: $(get_text 'errorOutputFileCreate')!\\n" + return 1 + fi + + config_load 'dhcp' + if [ "$dnsmasq_instance" = "*" ]; then + config_foreach _resolver_config 'dnsmasq' "$dns" + elif [ -n "$dnsmasq_instance" ]; then + for i in $dnsmasq_instance; do + _resolver_config "@dnsmasq[$i]" "$dns" || _resolver_config "$i" "$dns" + done + fi + + case "$dns" in + dnsmasq.*) + chmod 660 "$outputFile" + chown root:dnsmasq "$outputFile" + param=dnsmasq_restart + output_text='Restarting dnsmasq' + ;; + smartdns.*) + chmod 660 "$outputFile" "$outputConfig" + chown root:root "$outputFile" "$outputConfig" + param='smartdns_restart' + output_text='Restarting SmartDNS' + ;; + unbound.*) + chmod 660 "$outputFile" + chown root:unbound "$outputFile" + param='unbound_restart' + output_text='Restarting Unbound' + ;; + esac + + if [ -n "$(uci_changes dhcp)" ]; then + uci_commit dhcp + if [ "$param" = 'unbound_restart' ]; then + param='dnsmasq_restart; unbound_restart;' + output_text='Restarting Unbound/dnsmasq' + else + param=dnsmasq_restart + output_text='Restarting dnsmasq' + fi + fi + output 1 "$output_text " + output 2 "$output_text " + json set message "$output_text" + if eval "$param"; then + json set status 'statusSuccess' + led_on "$led" + output_okn + else + output_fail + json set status 'statusFail' + json add error 'errorDNSReload' + output "${_ERROR_}: $(get_text 'errorDNSReload')!\\n" + return 1 + fi + ;; + on_stop) + case "$dns" in + dnsmasq.*) + param='dnsmasq_restart' + ;; + smartdns.*) + param='smartdns_restart' + ;; + unbound.*) + param='unbound_restart' + ;; + esac + if [ -n "$(uci_changes dhcp)" ]; then + uci_commit dhcp + if [ "$param" = 'unbound_restart' ]; then + param='dnsmasq_restart; unbound_restart;' + else + param=dnsmasq_restart + fi + fi + eval "$param" + return $? + ;; + quiet|quiet_restart) + case "$dns" in + dnsmasq.*) + param='dnsmasq_restart' + ;; + smartdns.*) + param='smartdns_restart' + ;; + unbound.*) + param='unbound_restart' + ;; + esac + eval "$param" + return $? + ;; + esac +} + +cache() { + local R_TMP + case "$1" in + create|backup) + [ -s "$outputFile" ] && { mv -f "$outputFile" "$outputCache"; } >/dev/null 2>/dev/null + return $? + ;; + restore|use) + [ -s "$outputCache" ] && mv "$outputCache" "$outputFile" >/dev/null 2>/dev/null + return $? + ;; + test) + [ -s "$outputCache" ] + return $? + ;; + test_gzip) + [ -s "$outputGzip" ] && gzip -t -c "$outputGzip" + return $? + ;; + create_gzip) + rm -f "$outputGzip" >/dev/null 2>/dev/null + R_TMP="$(mktemp -u -q -t ${packageName}_tmp.XXXXXXXX)" + if gzip < "$outputFile" > "$R_TMP"; then + if mv "$R_TMP" "$outputGzip"; then + rm -f "$R_TMP" + return 0 + else + rm -f "$R_TMP" + return 1 + fi + else + return 1 + fi + ;; + expand|unpack|unpack_gzip) + [ -s "$outputGzip" ] && gzip -dc < "$outputGzip" > "$outputCache" + return $? + ;; + esac +} + +process_file_url_wrapper() { + if [ "$2" != '0' ]; then + json add error 'errorConfigValidationFail' + output "${_ERROR_}: $(get_text 'errorConfigValidationFail')!\\n" + output "Please check if the '$packageConfigFile' contains correct values for config options.\\n" + fi + if [ "$parallel_downloads" -gt 0 ]; then + process_file_url "$1" & + else + process_file_url "$1" + fi +} + +process_file_url() { + local cfg="$1" new_size + local label type D_TMP R_TMP filter + if [ -z "$cfg" ] || [ -n "${2}${3}" ]; then + url="$2" + action="$3" + fi + + [ "$enabled" = '1' ] || return 0 + [ -n "$url" ] || return 1 + + label="${url##*//}" + label="${label%%/*}" + label="File: $label" + case "$action" in + allow) type='Allowed'; D_TMP="$A_TMP" + ;; + block) type='Blocked'; D_TMP="$B_TMP" + ;; + file) type='File'; D_TMP="$B_TMP" + ;; + esac + if is_https_url "$url" && [ -z "$isSSLSupported" ]; then + output 1 "$_FAIL_" + output 2 "[DL] $type $label $__FAIL__\\n" + echo "errorNoSSLSupport|${1}" >> "$runningErrorFile" + return 0 + fi + while [ -z "$R_TMP" ] || [ -e "$R_TMP" ]; do + R_TMP="$(mktemp -u -q -t ${packageName}_tmp.XXXXXXXX)" + done + if [ -z "$url" ] || ! $dl_command "$url" "$dl_flag" "$R_TMP" 2>/dev/null || \ + [ ! -s "$R_TMP" ]; then + output 1 "$_FAIL_" + output 2 "[DL] $type $label $__FAIL__\\n" + echo "errorDownloadingList|${url}" >> "$runningErrorFile" + else + append_newline "$R_TMP" + [ -n "$cfg" ] && new_size="$(get_local_filesize "$R_TMP")" + if [ -n "$new_size" ] && [ "$size" != "$new_size" ]; then + uci set "${packageName}.${cfg}.size=$size" + fi + format="$(detect_file_type "$R_TMP")" + case "$format" in + adblockplus) filter="$adBlockPlusFilter";; + dnsmasq) filter="$dnsmasqFileFilter";; + dnsmasq2) filter="$dnsmasq2FileFilter";; + dnsmasq3) filter="$dnsmasq3FileFilter";; + domains) filter="$domainsFilter";; + hosts) filter="$hostsFilter";; + *) + output 1 "$_FAIL_" + output 2 "[DL] $type $label $__FAIL__\\n" + echo "errorDetectingFileType|${url}" >> "$runningErrorFile" + rm -f "$R_TMP" + return 0 + ;; + esac + if [ -n "$filter" ] && [ "$action" != 'file' ]; then + sed -i "$filter" "$R_TMP" + fi + if [ ! -s "$R_TMP" ]; then + output 1 "$_FAIL_" + output 2 "[DL] $type $label ($format) $__FAIL__\\n" + echo "errorParsingList|${url}" >> "$runningErrorFile" + else + append_newline "$R_TMP" + cat "${R_TMP}" >> "$D_TMP" + output 1 "$_OK_" + output 2 "[DL] $type $label ($format) $__OK__\\n" + fi + fi + rm -f "$R_TMP" + return 0 +} + +download_dnsmasq_file() { + json set message "$(get_text 'statusDownloading')..." + json set status 'statusDownloading' + + rm -f "$A_TMP" "$B_TMP" "$SED_TMP" "$outputFile" "$outputCache" "$outputGzip" + if [ "$(get_ram_free)" -lt 32 ]; then + output 3 'Low free memory, restarting resolver ' + if resolver 'quiet_restart'; then + output_okn + else + output_failn + fi + fi + touch "$A_TMP" "$B_TMP" "$SED_TMP" + output 1 'Downloading dnsmasq file ' + rm -f "$runningErrorFile" + process_file_url '' "$dnsmasq_config_file_url" 'file' + if [ -s "$runningErrorFile" ]; then + while IFS= read -r line; do + json add error "$line" + done < "$runningErrorFile" + rm -f "$runningErrorFile" + fi + output 2 'Moving dnsmasq file ' + if mv "$B_TMP" "$outputFile"; then + output 2 "$__OK__\\n" + else + output 2 "$__FAIL__\\n" + json add error 'errorMovingDataFile' + fi + output 1 '\n' +} + +download_lists() { + _ram_check() { + _config_calculate_sizes() { + local cfg="$1" + local en size url + config_get_bool en "$cfg" enabled '1' + config_get size "$cfg" size + config_get url "$cfg" url + [ "$en" = '0' ] && return 0 + [ -n "$size" ] || size="$(get_url_filesize "$url")" + [ -n "$size" ] && total_sizes=$((total_sizes+size)) + } + local i free_mem total_sizes + free_mem="$(get_ram_free)" + if [ -z "$free_mem" ]; then + json add warnning 'warningFreeRamCheckFail' + output "${_WARNING_}: $(get_text 'warningFreeRamCheckFail')!\\n" + return 0 + fi + config_load "$packageName" + config_foreach _config_calculate_sizes 'file_url' + if [ $((free_mem)) -lt $((total_sizes * 2)) ]; then + json add error 'errorTooLittleRam' "$free_mem" + output "${_ERROR_}: $(get_text 'errorTooLittleRam' "$free_mem")!\\n" + return 1 + else + return 0 + fi + } + local hf j=0 R_TMP + + _ram_check || return 1 + + json set message "$(get_text 'statusDownloading')..." + json set status 'statusDownloading' + + rm -f "$A_TMP" "$B_TMP" "$SED_TMP" "$outputFile" "$outputCache" "$outputGzip" + if [ "$(get_ram_total)" -lt 33554432 ]; then + output 3 'Low free memory, restarting resolver ' + if resolver 'quiet_restart'; then + output_okn + else + output_failn + fi + fi + touch "$A_TMP" "$B_TMP" "$SED_TMP" + output 1 'Downloading lists ' + rm -f "$runningErrorFile" + config_load "$packageName" + config_foreach load_validate_file_url_section 'file_url' process_file_url_wrapper + wait + if [ -n "$(uci changes "$packageName")" ]; then + output 2 "Saving updated file size(s) " + if uci commit "$packageName"; then output_okn; else output_failn; fi + fi + output 1 '\n' + + if [ -s "$runningErrorFile" ]; then + while IFS= read -r line; do + json add error "$line" + done < "$runningErrorFile" + rm -f "$runningErrorFile" + fi + + if [ "$canary_domains_icloud" -ne '0' ]; then + canaryDomains="${canaryDomains:+$canaryDomains }${canaryDomainsiCloud}" + fi + if [ "$canary_domains_mozilla" -ne '0' ]; then + canaryDomains="${canaryDomains:+$canaryDomains }${canaryDomainsMozilla}" + fi + + append_newline "$B_TMP" + for hf in $blocked_domain $canaryDomains; do + printf "%s\n" "$(echo "$hf" | sed "$domainsFilter")" >> "$B_TMP" + done + allowed_domain="${allowed_domain} +$(sed '/^[[:space:]]*$/d' "$A_TMP")" + for hf in ${allowed_domain}; do + hf="$(echo "$hf" | sed 's/\./\\./g')" + echo "/(^|\.)${hf}$/d;" >> "$SED_TMP" + done + + sed -i '/^[[:space:]]*$/d' "$B_TMP" + [ ! -s "$B_TMP" ] && return 1 + + output 1 'Processing downloads ' + output 2 'Sorting combined list ' + json set status 'statusProcessing' + json set message "$(get_text 'statusProcessing'): sorting combined list" + if [ "$allow_non_ascii" -gt 0 ]; then + if sort -u "$B_TMP" > "$A_TMP"; then + output_ok + else + output_failn + json add error 'errorSorting' + fi + else + if sort -u "$B_TMP" | grep -E -v '[^a-zA-Z0-9=/.-]' > "$A_TMP"; then + output_ok + else + output_failn + json add error 'errorSorting' + fi + fi + + if [ "$dns" = 'dnsmasq.conf' ] || \ + [ "$dns" = 'dnsmasq.ipset' ] || \ + [ "$dns" = 'dnsmasq.nftset' ] || \ + [ "$dns" = 'dnsmasq.servers' ] || \ + [ "$dns" = 'smartdns.domainset' ] || \ + [ "$dns" = 'smartdns.ipset' ] || \ + [ "$dns" = 'smartdns.nftset' ] || \ + [ "$dns" = 'unbound.adb_list' ]; then + # TLD optimization written by Dirk Brenken (dev@brenken.org) + output 2 'Optimizing combined list ' + json set message "$(get_text 'statusProcessing'): optimizing combined list" +# sed -E 'G;:t;s/(.*)(\.)(.*)(\n)(.*)/\1\4\5\2\3/;tt;s/(.*)\n(\.)(.*)/\3\2\1/' is actually slower than command below +# shellcheck disable=SC2016 + if $awk -F "." '{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' "$A_TMP" > "$B_TMP"; then + if sort "$B_TMP" > "$A_TMP"; then + if $awk '{if(NR=1){tld=$NF};while(getline){if($NF!~tld"\\."){print tld;tld=$NF}}print tld}' "$A_TMP" > "$B_TMP"; then + if $awk -F "." '{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' "$B_TMP" > "$A_TMP"; then + if sort -u "$A_TMP" > "$B_TMP"; then + output_ok + else + output_failn + json add error 'errorOptimization' + mv "$A_TMP" "$B_TMP" + fi + else + output_failn + json add error 'errorOptimization' + fi + else + output_failn + json add error 'errorOptimization' + mv "$A_TMP" "$B_TMP" + fi + else + output_failn + json add error 'errorOptimization' + fi + else + output_failn + json add error 'errorOptimization' + mv "$A_TMP" "$B_TMP" + fi + else + mv "$A_TMP" "$B_TMP" + fi + + if [ -s "$SED_TMP" ]; then + output 2 'Allowing domains ' + json set message "$(get_text 'statusProcessing'): allowing domains" + if sed -i -E -f "$SED_TMP" "$B_TMP"; then + output_ok + else + output_failn + json add error 'errorAllowListProcessing' + fi + fi + output 2 'Formatting merged file ' + json set message "$(get_text 'statusProcessing'): formatting merged file" + if [ -z "$outputFilterIPv6" ]; then + if sed "$outputFilter" "$B_TMP" > "$A_TMP"; then + output_ok + else + output_failn + json add error 'errorDataFileFormatting' + fi + else + case "$dns" in + dnsmasq.addnhosts) + if sed "$outputFilter" "$B_TMP" > "$A_TMP" && \ + sed "$outputFilterIPv6" "$B_TMP" >> "$A_TMP"; then + output_ok + else + output_failn + json add error 'errorDataFileFormatting' + fi + ;; + esac + fi + + case "$dns" in + dnsmasq.addnhosts) + output 2 'Creating dnsmasq addnhosts file ' + json set message "$(get_text 'statusProcessing'): creating dnsmasq addnhosts file" + ;; + dnsmasq.conf) + output 2 'Creating dnsmasq config file ' + json set message "$(get_text 'statusProcessing'): creating dnsmasq config file" + ;; + dnsmasq.ipset) + output 2 'Creating dnsmasq ipset file ' + json set message "$(get_text 'statusProcessing'): creating dnsmasq ipset file" + ;; + dnsmasq.nftset) + output 2 'Creating dnsmasq nft set file ' + json set message "$(get_text 'statusProcessing'): creating dnsmasq nft set file" + ;; + dnsmasq.servers) + output 2 'Creating dnsmasq servers file ' + json set message "$(get_text 'statusProcessing'): creating dnsmasq servers file" + ;; + smartdns.domainset) + output 2 'Creating smartdns domain-set file ' + json set message "$(get_text 'statusProcessing'): creating smartdns domain-set file" + ;; + smartdns.ipset) + output 2 'Creating smartdns domain-set file ' + json set message "$(get_text 'statusProcessing'): creating smartdns ipset file" + ;; + smartdns.nftset) + output 2 'Creating smartdns domain-set file ' + json set message "$(get_text 'statusProcessing'): creating smartdns nft set file" + ;; + unbound.adb_list) + output 2 'Creating Unbound adb_list file ' + json set message "$(get_text 'statusProcessing'): creating Unbound adb_list file" + ;; + esac + + if mv "$A_TMP" "$outputFile"; then + output_ok + else + output_failn + json add error 'errorMovingDataFile' + fi + if [ "$compressed_cache" -gt 0 ]; then + output 2 'Creating compressed cache ' + json set message "$(get_text 'statusProcessing'): creating compressed cache" + if cache 'create_gzip'; then + output_ok + else + output_failn + json add error 'errorCreatingCompressedCache' + fi + else + rm -f "$outputGzip" + fi + output 2 'Removing temporary files ' + json set message "$(get_text 'statusProcessing'): removing temporary files" + rm -f "/tmp/${packageName}_tmp.*" "$A_TMP" "$B_TMP" "$SED_TMP" "$outputCache" || j=1 + if [ $j -eq 0 ]; then + output_ok + else + output_failn + json add error 'errorRemovingTempFiles' + fi + output 1 '\n' +} + +adb_allow() { + local c hf string="$1" + local validation_result="$3" + load_environment "$validation_result" 'quiet' || return 1 + if [ ! -s "$outputFile" ]; then + output "No block-list ('$outputFile') found.\\n" + return 0 + elif [ -z "$string" ]; then + output "Usage: /etc/init.d/${packageName} allow 'domain' ...\\n" + return 0 + elif [ -n "$dnsmasq_config_file_url" ]; then + output "Allowing individual domains is not possible when using external dnsmasq config file.\\n" + return 0 + fi + case "$dns" in + dnsmasq.*) + output 1 "Allowing domain(s) and restarting dnsmasq " + output 2 "Allowing domain(s) \\n" + for c in $string; do + output 2 " $c " + hf="$(echo "$c" | sed 's/\./\\./g')" + if sed -i "\:\(/\|\.\)${hf}/:d" "$outputFile" && \ + uci_add_list_if_new "${packageName}" 'config' 'allowed_domain' "$c"; then + output_ok + else + output_fail + fi + done + if [ "$compressed_cache" -gt 0 ]; then + output 2 'Creating compressed cache ' + if cache 'create_gzip'; then + output_ok + else + output_failn + fi + fi + output 2 "Committing changes to config " + if uci_commit "$packageName"; then + allowed_domain="$(uci_get "$packageName" 'config' 'allowed_domain')" + config_cache 'create' + json set stats "$serviceName is blocking $(wc -l < "$outputFile") domains (with ${dns})" + output_ok; + if [ "$dns" = 'dnsmasq.ipset' ]; then + output 2 "Flushing adb ipset " + if ipset -q -! flush adb; then output_ok; else output_fail; fi + fi + if [ "$dns" = 'dnsmasq.nftset' ]; then + output 2 "Flushing adb nft sets " + nft flush set inet fw4 adb6 + if nft flush set inet fw4 adb4; then output_ok; else output_fail; fi + fi + output 2 "Restarting dnsmasq " + if dnsmasq_restart; then output_okn; else output_failn; fi + else + output_fail; + fi + ;; + smartdns.*) + output 1 "Allowing domain(s) and restarting smartdns " + output 2 "Allowing domain(s) \\n" + for c in $string; do + output 2 " $c " + hf="$(echo "$c" | sed 's/\./\\./g')" + if sed -i "\:\(\"\|\.\)${hf}\":d" "$outputFile" && \ + uci_add_list_if_new "$packageName" 'config' 'allowed_domain' "$string"; then + output_ok + else + output_fail + fi + done + if [ "$compressed_cache" -gt 0 ]; then + output 2 'Creating compressed cache ' + if cache 'create_gzip'; then + output_ok + else + output_failn + fi + fi + output 2 "Committing changes to config " + if uci_commit "$packageName"; then + allowed_domain="$(uci_get "$packageName" 'config' 'allowed_domain')" + config_cache 'create' + json set stats "$serviceName is blocking $(wc -l < "$outputFile") domains (with ${dns})" + output_ok; + output 2 "Restarting Unbound " + if unbound_restart; then output_okn; else output_failn; fi + else + output_fail; + fi + ;; + unbound.*) + output 1 "Allowing domain(s) and restarting Unbound " + output 2 "Allowing domain(s) \\n" + for c in $string; do + output 2 " $c " + hf="$(echo "$c" | sed 's/\./\\./g')" + if sed -i "\:\(\"\|\.\)${hf}\":d" "$outputFile" && \ + uci_add_list_if_new "$packageName" 'config' 'allowed_domain' "$string"; then + output_ok + else + output_fail + fi + done + if [ "$compressed_cache" -gt 0 ]; then + output 2 'Creating compressed cache ' + if cache 'create_gzip'; then + output_ok + else + output_failn + fi + fi + output 2 "Committing changes to config " + if uci_commit "$packageName"; then + allowed_domain="$(uci_get "$packageName" 'config' 'allowed_domain')" + config_cache 'create' + json set stats "$serviceName is blocking $(wc -l < "$outputFile") domains (with ${dns})" + output_ok; + output 2 "Restarting Unbound " + if unbound_restart; then output_okn; else output_failn; fi + else + output_fail; + fi + ;; + esac +} + +adb_check() { + local c param="$1" + local validation_result="$3" + load_environment "$validation_result" 'quiet' || return 1 + if [ ! -s "$outputFile" ]; then + output "No block-list ('$outputFile') found.\\n" + return 0 + elif [ -z "$param" ]; then + output "Usage: /etc/init.d/${packageName} check 'domain' ...\\n" + return 0 + fi + for string in ${param}; do + c="$(grep -c "$string" "$outputFile")" + if [ "$c" -gt 0 ]; then + if [ "$c" -eq 1 ]; then + output "Found 1 match for '$string' in '$outputFile'.\\n" + else + output "Found $c matches for '$string' in '$outputFile'.\\n" + fi + if [ "$c" -le 20 ]; then + case "$dns" in + dnsmasq.addnhosts) + grep "$string" "$outputFile" | sed 's|^127.0.0.1 ||;s|^:: ||;';; + dnsmasq.conf) + grep "$string" "$outputFile" | sed 's|local=/||;s|/$||;';; + dnsmasq.ipset) + grep "$string" "$outputFile" | sed 's|ipset=/||;s|/adb$||;';; + dnsmasq.nftset) + grep "$string" "$outputFile" | sed 's|nftset=/||;s|/4#inet#adb#adb4||;';; + dnsmasq.servers) + grep "$string" "$outputFile" | sed 's|server=/||;s|/$||;';; + smartdns.*) + grep "$string" "$outputFile";; + unbound.adb_list) + grep "$string" "$outputFile" | sed 's|^local-zone: "||;s|" static$||;';; + esac + fi + else + output "The '$string' is not found in current block-list ('$outputFile').\\n" + fi + done +} + +adb_check_lists() { + _check_list() { + local cfg="$1" + local en size url R_TMP string c + config_get_bool en "$cfg" enabled '1' + config_get action "$cfg" action 'block' + config_get url "$cfg" url + [ "$en" = '0' ] && return 0 + [ "$action" != 'block' ] && return 0 + if is_https_url "$url" && [ -z "$isSSLSupported" ]; then + output "[DL] $url $__FAIL__\\n" + fi + while [ -z "$R_TMP" ] || [ -e "$R_TMP" ]; do + R_TMP="$(mktemp -u -q -t ${packageName}_tmp.XXXXXXXX)" + done + if [ -z "$url" ] || ! $dl_command "$url" "$dl_flag" "$R_TMP" 2>/dev/null || \ + [ ! -s "$R_TMP" ]; then + output "[DL] $url $__FAIL__\\n" + else + append_newline "$R_TMP" + for string in ${param}; do + c="$(grep -c "$string" "$R_TMP")" + if [ "$c" -gt 0 ]; then + if [ "$c" -eq 1 ]; then + output "Found 1 match for '$string' in '$url'.\\n" + else + output "Found $c matches for '$string' in '$url'.\\n" + fi + grep "$string" "$R_TMP" + else + output "The '$string' is not found in '$url'.\\n" + fi + done + rm -f "$R_TMP" + fi + } + local param="$1" + local validation_result="$3" + load_environment "$validation_result" 'quiet' || return 1 + if [ -z "$param" ]; then + output "Usage: /etc/init.d/${packageName} check_lists 'domain' ...\\n" + return 0 + fi + config_load "$packageName" + config_foreach _check_list 'file_url' + return 0 +} + +adb_config_update() { + local R_TMP label + local param validation_result="$3" + case "$1" in + on_boot) param="$1";; + *) param='quiet';; + esac + load_environment "$validation_result" "$param" || return 1 + label="${config_update_url##*//}" + label="${label%%/*}"; + [ "$config_update_enabled" -ne '0' ] || return 0 + + if [ "$param" != 'download' ]; then + cache 'test' && return 0 + cache 'test_gzip' && return 0 + fi + output 1 'Updating config ' + while [ -z "$R_TMP" ] || [ -e "$R_TMP" ]; do + R_TMP="$(mktemp -u -q -t ${packageName}_tmp.XXXXXXXX)" + done + if ! $dl_command "$config_update_url" "$dl_flag" "$R_TMP" 2>/dev/null || [ ! -s "$R_TMP" ]; then + append_newline "$R_TMP" + output 1 "$_FAIL_\\n" + output 2 "[DL] Config Update: $label $__FAIL__\\n" + json add error 'errorDownloadingConfigUpdate' + else + if [ -s "$R_TMP" ] && sed -f "$R_TMP" -i "$packageConfigFile" 2>/dev/null; then + output 1 "$_OK_\\n" + output 2 "[DL] Config Update: $label $__OK__\\n" + else + output 1 "$_FAIL_\\n" + output 2 "[DL] Config Update: $label $__FAIL__\\n" + json add error 'errorParsingConfigUpdate' + fi + fi + rm -f "$R_TMP" + return 0 +} + +adb_sizes() { + _config_add_url_size() { + local cfg="$1" url size + config_get url "$cfg" url + size="$(get_url_filesize "$url")" + output "$url${size:+: $size} " + if [ -n "$size" ]; then + uci set "${packageName}.${cfg}.size=$size" + output_okn + else + output_failn + fi + } + local i + local validation_result="$3" + load_environment "$validation_result" 'quiet' || return 1 + config_load "$packageName" + config_foreach _config_add_url_size 'file_url' + uci commit "$packageName" +} + +# shellcheck disable=SC2120 +adb_start() { + local action status error message stats c + local param="$1" validation_result="$3" + + load_environment "$validation_result" "$param" || return 1 + + status="$(json get 'status')" + error="$(json get 'error')" + message="$(json get 'message')" + stats="$(json get 'stats')" + action="$(config_cache get 'trigger_service')" + fw4_restart_flag="$(config_cache get 'trigger_fw4')" + + if [ "$action" = 'on_boot' ] || [ "$param" = 'on_boot' ]; then + if cache 'test_gzip' || cache 'test'; then + action='restore' + else + action='download' + fi + elif [ "$action" = 'download' ] || [ "$param" = 'download' ] || [ -n "$error" ]; then + action='download' + elif [ ! -s "$outputFile" ]; then + if cache 'test_gzip' || cache 'test'; then + action='restore' + else + action='download' + fi + elif [ "$action" = 'restart' ] || [ "$param" = 'restart' ]; then + action='restart' + elif [ -s "$outputFile" ] && [ "$status" = "statusSuccess" ] && [ -z "$error" ]; then + status_service 'quiet' + return 0 + else + action='download' + fi + + json del all + config_cache 'create' + + if [ "$action" = 'restore' ]; then + output 0 "Starting $serviceName... " + output 3 "Starting $serviceName...\\n" + json set status 'statusStarting' + if cache 'test_gzip' && ! cache 'test' && [ ! -s "$outputFile" ]; then + output 3 'Found compressed cache file, unpacking it ' + json set message 'found compressed cache file, unpacking it.' + if cache 'unpack_gzip'; then + output_okn + else + output_failn + json add error 'errorRestoreCompressedCache' + output "${_ERROR_}: $(get_text 'errorRestoreCompressedCache')!\\n" + action='download' + fi + fi + if cache 'test' && [ ! -s "$outputFile" ]; then + output 3 'Found cache file, reusing it ' + json set message 'found cache file, reusing it.' + if cache 'restore'; then + output_okn + resolver 'on_start' + else + output_failn + json add error 'errorRestoreCache' + output "${_ERROR_}: $(get_text 'errorRestoreCache')!\\n" + action='download' + fi + fi + fi + if [ "$action" = 'download' ]; then + if [ -z "$blocked_url" ] && [ -z "$blocked_domain" ]; then + json set status 'statusFail' + json add error 'errorNothingToDo' + output "${_ERROR_}: $(get_text 'errorNothingToDo')!\\n" + else + if [ -s "$outputFile" ] || cache 'test' || cache 'test_gzip'; then + output 0 "Force-reloading $serviceName... " + output 3 "Force-reloading $serviceName...\\n" + json set status 'statusForceReloading' + else + output 0 "Starting $serviceName... " + output 3 "Starting $serviceName...\\n" + json set status 'statusStarting' + fi + resolver 'cleanup' + if [ "$dns" = 'dnsmasq.conf' ] && [ -n "$dnsmasq_config_file_url" ]; then + download_dnsmasq_file + else + download_lists + fi + resolver 'on_start' + fi + fi + if [ "$action" = 'restart' ]; then + output 0 "Restarting $serviceName... " + output 3 "Restarting $serviceName...\\n" + json set status 'statusRestarting' + resolver 'on_start' + fi + if [ "$action" = 'start' ]; then + output 0 "Starting $serviceName... " + output 3 "Starting $serviceName...\\n" + json set status 'statusStarting' + resolver 'on_start' + fi + if [ -s "$outputFile" ] && [ "$(json get status)" != "statusFail" ]; then + output 0 "$__OK__\\n"; + json del message + json set status 'statusSuccess' + json set stats "$serviceName is blocking $(wc -l < "$outputFile") domains (with ${dns})" + status_service 'quiet' + + else + output 0 "$__FAIL__\\n"; + json set status 'statusFail' + json add error 'errorOhSnap' + status_service 'quiet' + fi + + procd_open_instance 'main' + procd_set_param command /bin/true + procd_set_param stdout 1 + procd_set_param stderr 1 + procd_open_data + json_add_string 'status' "$(json get status)" + json_add_string 'errors' "$(json get error)" + json_add_string 'warnings' "$(json get warning)" + if [ -s "$outputFile" ]; then + json_add_int 'entries' "$(wc -l < "$outputFile")" + else + json_add_int 'entries' '0' + fi + json_add_array firewall + if [ "$force_dns" -ne '0' ]; then +# shellcheck disable=SC3060 + for c in ${force_dns_port/,/ }; do + if netstat -tuln | grep LISTEN | grep ":${c}" >/dev/null 2>&1; then + json_add_object "" + json_add_string type redirect + json_add_string target DNAT + json_add_string src lan + json_add_string proto "tcp udp" + json_add_string src_dport "$c" + json_add_string dest_port "$c" + json_add_string family any + json_add_boolean reflection 0 + json_close_object + else + json_add_object "" + json_add_string type rule + json_add_string src lan + json_add_string dest "*" + json_add_string proto "tcp udp" + json_add_string dest_port "$c" + json_add_string target REJECT + json_close_object + fi + done + fi + case "$dns" in + dnsmasq.ipset|smartdns.ipset) + json_add_object "" + json_add_string type ipset + json_add_string name adb + json_add_string match dest_net + json_add_string storage hash + json_close_object + json_add_object "" + json_add_string type rule + json_add_string ipset adb + json_add_string src lan + json_add_string dest "*" + json_add_string proto "tcp udp" + json_add_string target REJECT + json_close_object + ;; + dnsmasq.nftset|smartdns.nftset) + json_add_object "" + json_add_string type ipset + json_add_string name adb4 + json_add_string family 4 + json_add_string match dest_net + json_close_object + json_add_object "" + json_add_string type rule + json_add_string ipset adb4 + json_add_string src lan + json_add_string dest "*" + json_add_string proto "tcp udp" + json_add_string target REJECT + json_close_object + if [ "$ipv6_enabled" -ne '0' ]; then + json_add_object "" + json_add_string type ipset + json_add_string name adb6 + json_add_string family 6 + json_add_string match dest_net + json_close_object + json_add_object "" + json_add_string type rule + json_add_string ipset adb6 + json_add_string src lan + json_add_string dest "*" + json_add_string proto "tcp udp" + json_add_string target REJECT + json_close_object + fi + ;; + esac + json_close_array + procd_close_data + procd_close_instance + return 0 +} + +adb_status() { + local param="$1" + local c status message error warning stats text + status="$(json get status)" + message="$(json get message)" + error="$(json get error)" + warning="$(json get warning)" + stats="$(json get stats)" + if [ "$status" = "statusSuccess" ]; then + output "$stats "; output_okn; + else + [ -n "$status" ] && status="$(get_text "$status")" + if [ -n "$status" ] && [ -n "$message" ]; then + status="${status}: $message" + fi + [ -n "$status" ] && output "$serviceName $status!\\n" + fi + if [ "$param" != 'quiet' ] && [ -n "$error" ]; then + for c in $error; do + local error_param="${c##*|}" + local error_code="${c%|*}" + output "${_ERROR_}: $(get_text "$error_code" "$error_param")!\\n" + done + fi + if [ "$param" != 'quiet' ] && [ -n "$warning" ]; then + for c in $warning; do + local warning_param="${c##*|}" + local warning_code="${c%|*}" + output "${_WARNING_}: $(get_text "$warning_code" "$warning_param").\\n" + done + fi + return 0 +} + +# shellcheck disable=SC2120 +adb_stop() { + local validation_result="$3" + load_environment "$validation_result" 'quiet' || return 0 + if [ -s "$outputFile" ]; then + output "Stopping $serviceName... " + cache 'create' + if resolver 'on_stop'; then + ipset -q -! flush adb + ipset -q -! destroy adb + nft delete set inet fw4 adb4 + nft delete set inet fw4 adb6 + led_off "$led" + output 0 "$__OK__\\n"; output_okn; + json set status 'statusStopped' + json del message + else + output 0 "$__FAIL__\\n"; output_fail; + json set status 'statusFail' + json add error 'errorStopping' + output "${_ERROR_}: $(get_text 'errorStopping')!\\n" + fi + fi + return 0 +} + +adb_pause() { + local timeout="${1:-$pause_timeout}" + local validation_result="$3" + adb_stop 'on_pause' '' "$validation_result" + output "Sleeping for $timeout seconds... " + if is_integer "$timeout" && sleep "$timeout"; then + output_okn + else + output_failn + fi + adb_start 'on_pause' '' "$validation_result" +} + +allow() { load_validate_config 'config' adb_allow "'$*'"; } +boot() { + local procd_boot_delay + ubus -t 30 wait_for network.interface 2>/dev/null + config_load "$packageName" + config_get procd_boot_delay 'config' 'procd_boot_delay' '0' +# shellcheck disable=SC2154 + { is_integer "$procd_boot_delay" && sleep "$procd_boot_delay"; \ + rc_procd start_service 'on_boot' && service_started 'on_boot'; } & +} +check() { load_validate_config 'config' adb_check "'$*'"; } +check_lists() { load_validate_config 'config' adb_check_lists "'$*'"; } +dl() { rc_procd start_service 'download'; } +killcache() { + local compressed_cache_dir + config_load "$packageName" + config_get compressed_cache_dir 'config' 'compressed_cache_dir' '/etc' + if [ "$(sanitize_dir "$compressed_cache_dir")" = '/' ]; then + compressed_cache_dir='' + elif [ -n "$(sanitize_dir "$compressed_cache_dir")" ]; then + compressed_cache_dir="$(sanitize_dir "$compressed_cache_dir")" + else + compressed_cache_dir="/etc" + fi + rm -f "$dnsmasqAddnhostsCache" "${compressed_cache_dir}/${dnsmasqAddnhostsGzip}" + rm -f "$dnsmasqConfCache" "${compressed_cache_dir}/${dnsmasqConfGzip}" + rm -f "$dnsmasqIpsetCache" "${compressed_cache_dir}/${dnsmasqIpsetGzip}" + rm -f "$dnsmasqNftsetCache" "${compressed_cache_dir}/${dnsmasqNftsetGzip}" + rm -f "$dnsmasqServersCache" "${compressed_cache_dir}/${dnsmasqServersGzip}" + rm -f "$smartdnsDomainSetCache" "${compressed_cache_dir}/${smartdnsDomainSetGzip}" + rm -f "$smartdnsIpsetCache" "${compressed_cache_dir}/${smartdnsIpsetGzip}" + rm -f "$smartdnsNftsetCache" "${compressed_cache_dir}/${smartdnsNftsetGzip}" + rm -f "$unboundCache" "${compressed_cache_dir}/${unboundGzip}" + resolver 'cleanup' + return 0 +} +reload_service() { rc_procd start_service 'restart'; } +restart_service() { rc_procd start_service 'restart'; } +service_started() { is_fw4_restart_needed && procd_set_config_changed firewall; } +service_stopped() { is_fw4_restart_needed && procd_set_config_changed firewall; } +service_triggers() { + local wan wan6 i + local procd_trigger_wan6 + config_load "$packageName" + config_get_bool procd_trigger_wan6 'config' 'procd_trigger_wan6' '0' + network_flush_cache + network_find_wan wan + wan="${wan:-wan}" + if [ "$procd_trigger_wan6" -ne '0' ]; then + network_find_wan6 wan6 + wan6="${wan6:-wan6}" + fi + for i in "$wan" "$wan6"; do + [ -n "$i" ] && procd_add_interface_trigger "interface.*" "$i" "/etc/init.d/${packageName}" start + done + procd_add_config_trigger "config.change" "$packageName" "/etc/init.d/${packageName}" reload +} +sizes() { load_validate_config 'config' adb_sizes "''"; } +start_service() { + load_validate_config 'config' adb_config_update "'$*'" + load_validate_config 'config' adb_start "'$*'" +} +status_service() { adb_status "$@"; } +stop_service() { load_validate_config 'config' adb_stop "'$*'"; } +pause() { load_validate_config 'config' adb_pause "'$*'"; } +version() { echo "$PKG_VERSION"; } + +load_validate_file_url_section() { + uci_load_validate "$packageName" "$packageName" "$1" "$2" \ + 'enabled:bool:1' \ + 'action:or("allow", "block"):block' \ + 'size:or(uinteger, "")' \ + 'url:string' +} + +load_validate_config() { + local enabled + local force_dns + local force_dns_port + local parallel_downloads + local debug + local compressed_cache + local compressed_cache_dir + local ipv6_enabled + local allow_non_ascii + local canary_domains_icloud + local canary_domains_mozilla + local config_update_enabled + local config_update_url + local download_timeout + local pause_timeout + local curl_additional_param + local curl_max_file_size + local curl_retry + local verbosity + local procd_trigger_wan6 + local procd_boot_wan_timeout + local led + local dns + local dnsmasq_instance + local allowed_domain + local blocked_domain + local dnsmasq_config_file_url + uci_load_validate "$packageName" "$packageName" "$1" "${2}${3:+ $3}" \ + 'enabled:bool:0' \ + 'force_dns:bool:1' \ + 'force_dns_port:list(integer):53,853' \ + 'parallel_downloads:bool:1' \ + 'debug:bool:0' \ + 'compressed_cache:bool:0' \ + 'compressed_cache_dir:directory:/etc' \ + 'ipv6_enabled:bool:0' \ + 'allow_non_ascii:bool:0' \ + 'canary_domains_icloud:bool:0' \ + 'canary_domains_mozilla:bool:0' \ + 'config_update_enabled:bool:0' \ + 'config_update_url:string:https://cdn.jsdelivr.net/gh/openwrt/packages/net/adblock-fast/files/adblock-fast.config.update' \ + 'download_timeout:range(1,60):20' \ + 'pause_timeout:range(1,60):20' \ + 'curl_additional_param:or("", string)' \ + 'curl_max_file_size:or("", uinteger)' \ + 'curl_retry:range(0,30):3' \ + 'verbosity:range(0,2):2' \ + 'procd_trigger_wan6:bool:0' \ + 'procd_boot_wan_timeout:integer:60' \ + 'led:or("", "none", file, device, string)' \ + 'dns:or("dnsmasq.addnhosts", "dnsmasq.conf", "dnsmasq.ipset", "dnsmasq.nftset", "dnsmasq.servers", "smartdns.domainset", "smartdns.ipset", "smartdns.nftset", "unbound.adb_list"):dnsmasq.servers' \ + 'dnsmasq_instance:list(or(integer, string)):*' \ + 'allowed_domain:list(string)' \ + 'blocked_domain:list(string)' \ + 'dnsmasq_config_file_url:string' +} diff --git a/package/network/config/adblock-fast/files/etc/uci-defaults/90-adblock-fast b/package/network/config/adblock-fast/files/etc/uci-defaults/90-adblock-fast new file mode 100644 index 0000000000..0ba1f9a35c --- /dev/null +++ b/package/network/config/adblock-fast/files/etc/uci-defaults/90-adblock-fast @@ -0,0 +1,128 @@ +#!/bin/sh +# Copyright 2023 MOSSDeF, Stan Grishin (stangri@melmac.ca) +# shellcheck disable=SC2015,SC3043,SC3060 + +readonly adbFunctionsFile='/etc/init.d/adblock-fast' +if [ -s "$adbFunctionsFile" ]; then +# shellcheck source=../../etc/init.d/adblock-fast + . "$adbFunctionsFile" +else + printf "%b: adblock-fast init.d file (%s) not found! \n" '\033[0;31mERROR\033[0m' "$adbFunctionsFile" +fi + +# Transition from simple-adblock +_enable_url() { + local cfg="$1" url="$2" action="$3" + local u a + config_get u "$cfg" 'url' + config_get a "$cfg" 'action' 'block' + if [ "$u" = "$url" ] && [ "$a" = "$action" ]; then + uci del "${packageName}.${cfg}.enabled" && _found=1 + fi +} + +enable_add_url() { + local url="$1" action="$2" _found + config_load "$packageName" + config_foreach _enable_url 'file_url' "$url" "$action" + if [ -z "$_found" ]; then + uci add "${packageName}" 'file_url' >/dev/null 2>&1 + uci set "${packageName}.@file_url[-1].url=$url" + uci set "${packageName}.@file_url[-1].size=$(get_url_filesize "$url")" + uci set "${packageName}.@file_url[-1].action=$action" + fi +} + +if [ -s '/etc/config/simple-adblock' ] \ + && [ ! -s '/etc/config/adblock-fast-opkg' ] \ + && [ "$(uci get adblock-fast.config.enabled)" = '0' ]; then + cp -f '/etc/config/adblock-fast' '/etc/config/adblock-fast-opkg' + enabled="$(uci get simple-adblock.config.enabled)" + if [ -x '/etc/init.d/simple-adblock' ]; then + output "Stopping and disabling simple-adblock " + if /etc/init.d/simple-adblock stop >/dev/null 2>&1 \ + && /etc/init.d/simple-adblock disable \ + && uci set simple-adblock.config.enabled=0 \ + && uci commit simple-adblock; then + output_okn + else + output_failn + fi + else + output "Disabling simple-adblock." + if uci set simple-adblock.config.enabled=0 \ + && uci commit simple-adblock; then + output_okn + else + output_failn + fi + fi + output "Migrating simple-adblock config file " + for i in allow_non_ascii canary_domains_icloud canary_domains_mozilla \ + compressed_cache compressed_cache_dir config_update_enabled \ + curl_additional_param curl_max_file_size curl_retry download_timeout \ + debug dns dns_instance dnsmasq_config_file_url force_dns led \ + parallel_downloads procd_trigger_wan6 procd_boot_wan_timeout verbosity; do + j="$(uci -q get simple-adblock.config.${i})" + [ -n "$j" ] && uci set "${packageName}.config.${i}=${j}" + done + [ -n "$enabled" ] && uci set "${packageName}.config.enabled=${enabled}" + j="$(uci -q get simple-adblock.config.config_update_url)" + if [ "${j//simple-adblock/}" = "$j" ]; then + uci set "${packageName}.config.config_update_url=$j" + fi + ccd="$(uci get simple-adblock.config.compressed_cache_dir)" + ccd="${ccd:-/etc}" + for j in $(uci -q get simple-adblock.config.allowed_domain); do + [ -n "$j" ] && uci add_list "${packageName}.config.allowed_domain=${j}" + done + for j in $(uci -q get simple-adblock.config.blocked_domain); do + [ -n "$j" ] && uci add_list "${packageName}.config.blocked_domain=${j}" + done + for j in $(uci -q get simple-adblock.config.force_dns_port); do + [ -n "$j" ] && uci add_list "${packageName}.config.force_dns_port=${j}" + done + output_okn + + for i in allowed_domains_url blocked_adblockplus_url blocked_domains_url \ + blocked_hosts_url; do + output "Migrating simple-adblock ${i} " + for j in $(uci -q get simple-adblock.config.${i}); do + if [ "$i" = 'allowed_domains_url' ]; then + enable_add_url "$j" 'allow' + else + enable_add_url "$j" 'block' + fi + done + output_okn + done + uci commit "$packageName" + output "Migrating simple-adblock cache file(s) " + for i in '/var/run/simple-adblock/dnsmasq.addnhosts.cache' \ + '/var/run/simple-adblock/dnsmasq.conf.cache' \ + '/var/run/simple-adblock/dnsmasq.ipset.cache' \ + '/var/run/simple-adblock/dnsmasq.nftset.cache' \ + '/var/run/simple-adblock/dnsmasq.servers.cache' \ + '/var/run/simple-adblock/unbound.cache'; do + if [ -s "$i" ]; then + current_dir="$(dirname "$i")" + mkdir -p "${current_dir//simple-adblock/adblock-fast}" + mv -f "$i" "${i//simple-adblock/adblock-fast}" && output_okn || output_failn + fi + done + for i in 'simple-adblock.dnsmasq.addnhosts.gz' \ + 'simple-adblock.dnsmasq.conf.gz' \ + 'simple-adblock.dnsmasq.ipset.gz' \ + 'simple-adblock.dnsmasq.nftset.gz' \ + 'simple-adblock.dnsmasq.servers.gz' \ + 'simple-adblock.unbound.gz'; do + i="${ccd}/${i}" + if [ -s "$i" ]; then + mkdir -p "${ccd//simple-adblock/adblock-fast}" + mv -f "$i" "${i//simple-adblock/adblock-fast}" && output_okn || output_failn + fi + done + output_okn +fi + +exit 0 diff --git a/package/network/config/adblock-fast/test.sh b/package/network/config/adblock-fast/test.sh new file mode 100644 index 0000000000..45469ed96e --- /dev/null +++ b/package/network/config/adblock-fast/test.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +/etc/init.d/"$1" version 2>&1 | grep "$2" diff --git a/package/network/config/adblock/Makefile b/package/network/config/adblock/Makefile new file mode 100644 index 0000000000..0e11de1050 --- /dev/null +++ b/package/network/config/adblock/Makefile @@ -0,0 +1,65 @@ +# +# Copyright (c) 2015-2023 Dirk Brenken (dev@brenken.org) +# This is free software, licensed under the GNU General Public License v3. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=adblock +PKG_VERSION:=4.1.5 +PKG_RELEASE:=8 +PKG_LICENSE:=GPL-3.0-or-later +PKG_MAINTAINER:=Dirk Brenken + +include $(INCLUDE_DIR)/package.mk + +define Package/adblock + SECTION:=net + CATEGORY:=Network + TITLE:=Powerful adblock script to block ad/abuse domains by using DNS + DEPENDS:=+jshn +jsonfilter +coreutils +coreutils-sort +ca-bundle +opkg + PKGARCH:=all +endef + +define Package/adblock/description +Powerful adblock solution to block ad/abuse domains via dnsmasq, unbound, named or kresd. +The script supports many domain blacklist sites plus manual black- and whitelist overrides. +Please see https://github.com/openwrt/packages/blob/master/net/adblock/files/README.md for further information. + +endef + +define Package/adblock/conffiles +/etc/config/adblock +/etc/adblock/adblock.whitelist +/etc/adblock/adblock.blacklist +endef + +define Build/Prepare +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/adblock/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) ./files/adblock.sh $(1)/usr/bin + + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/adblock.init $(1)/etc/init.d/adblock + + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_CONF) ./files/adblock.conf $(1)/etc/config/adblock + + $(INSTALL_DIR) $(1)/etc/adblock + $(INSTALL_BIN) ./files/adblock.mail $(1)/etc/adblock + $(INSTALL_CONF) ./files/adblock.blacklist $(1)/etc/adblock + $(INSTALL_CONF) ./files/adblock.whitelist $(1)/etc/adblock + $(INSTALL_CONF) ./files/adblock.categories $(1)/etc/adblock + $(INSTALL_CONF) ./files/adblock.sources $(1)/etc/adblock + gzip -9n $(1)/etc/adblock/adblock.sources +endef + +$(eval $(call BuildPackage,adblock)) diff --git a/package/network/config/adblock/files/README.md b/package/network/config/adblock/files/README.md new file mode 100644 index 0000000000..463965b0f1 --- /dev/null +++ b/package/network/config/adblock/files/README.md @@ -0,0 +1,314 @@ + + +# DNS based ad/abuse domain blocking + +## Description +A lot of people already use adblocker plugins within their desktop browsers, but what if you are using your (smart) phone, tablet, watch or any other (wlan) gadget!? Getting rid of annoying ads, trackers and other abuse sites (like facebook) is simple: block them with your router. When the DNS server on your router receives DNS requests, you will sort out queries that ask for the resource records of ad servers and return a simple 'NXDOMAIN'. This is nothing but **N**on-e**X**istent Internet or Intranet domain name, if domain name is unable to resolved using the DNS server, a condition called the 'NXDOMAIN' occurred. + +## Main Features +* Support of the following fully pre-configured domain blocklist sources (free for private usage, for commercial use please check their individual licenses) + +| Source | Enabled | Size | Focus | Information | +| :------------------ | :-----: | :--- | :--------------- | :-------------------------------------------------------------------------------- | +| adaway | x | S | mobile | [Link](https://github.com/AdAway/adaway.github.io) | +| adguard | x | L | general | [Link](https://adguard.com) | +| adguard_tracking | | L | tracking | [Link](https://github.com/AdguardTeam/cname-trackers) | +| android_tracking | | S | tracking | [Link](https://github.com/Perflyst/PiHoleBlocklist) | +| andryou | | L | compilation | [Link](https://gitlab.com/andryou/block/-/blob/master/readme.md) | +| anti_ad | | L | compilation | [Link](https://github.com/privacy-protection-tools/anti-AD/blob/master/README.md) | +| antipopads | | L | compilation | [Link](https://github.com/AdroitAdorKhan/antipopads-re) | +| anudeep | | M | compilation | [Link](https://github.com/anudeepND/blacklist) | +| bitcoin | | S | mining | [Link](https://github.com/hoshsadiq/adblock-nocoin-list) | +| cpbl | | XL | compilation | [Link](https://github.com/bongochong/CombinedPrivacyBlockLists) | +| disconnect | x | S | general | [Link](https://disconnect.me) | +| doh_blocklist | | S | doh_server | [Link](https://github.com/dibdot/DoH-IP-blocklists) | +| easylist | | M | compilation | [Link](https://easylist.to) | +| easyprivacy | | M | tracking | [Link](https://easylist.to) | +| firetv_tracking | | S | tracking | [Link](https://github.com/Perflyst/PiHoleBlocklist) | +| games_tracking | | S | tracking | [Link](https://www.gameindustry.eu) | +| hblock | | XL | compilation | [Link](https://hblock.molinero.dev) | +| lightswitch05 | | XL | compilation | [Link](https://github.com/lightswitch05/hosts) | +| notracking | | XL | tracking | [Link](https://github.com/notracking/hosts-blocklists) | +| oisd_big | | XXL | general | [Link](https://oisd.nl) | +| oisd_nsfw | | XXL | porn | [Link](https://oisd.nl) | +| oisd_small | | L | general | [Link](https://oisd.nl) | +| openphish | | S | phishing | [Link](https://openphish.com) | +| phishing_army | | S | phishing | [Link](https://phishing.army) | +| reg_cn | | S | reg_china | [Link](https://easylist.to) | +| reg_cz | | S | reg_czech+slovak | [Link](https://easylist.to) | +| reg_de | | S | reg_germany | [Link](https://easylist.to) | +| reg_es | | S | reg_espania | [Link](https://easylist.to) | +| reg_fi | | S | reg_finland | [Link](https://github.com/finnish-easylist-addition) | +| reg_fr | | M | reg_france | [Link](https://forums.lanik.us/viewforum.php?f=91) | +| reg_id | | S | reg_indonesia | [Link](https://easylist.to) | +| reg_it | | S | reg_italy | [Link](https://easylist.to) | +| reg_jp | | S | reg_japan | [Link](https://github.com/k2jp/abp-japanese-filters) | +| reg_kr | | S | reg_korea | [Link](https://github.com/List-KR/List-KR) | +| reg_nl | | S | reg_netherlands | [Link](https://easylist.to) | +| reg_pl | | M | reg_poland | [Link](https://kadantiscam.netlify.com) | +| reg_ro | | S | reg_romania | [Link](https://easylist.to) | +| reg_ru | | S | reg_russia | [Link](https://easylist.to) | +| reg_se | | S | reg_sweden | [Link](https://github.com/lassekongo83/Frellwits-filter-lists) | +| reg_vn | | S | reg_vietnam | [Link](https://bigdargon.github.io/hostsVN) | +| smarttv_tracking | | S | tracking | [Link](https://github.com/Perflyst/PiHoleBlocklist) | +| spam404 | | S | general | [Link](https://github.com/Dawsey21) | +| stevenblack | | VAR | compilation | [Link](https://github.com/StevenBlack/hosts) | +| stopforumspam | | S | spam | [Link](https://www.stopforumspam.com) | +| utcapitole | | VAR | general | [Link](https://dsi.ut-capitole.fr/blacklists/index_en.php) | +| wally3k | | S | compilation | [Link](https://firebog.net/about) | +| whocares | | M | general | [Link](https://someonewhocares.org) | +| winhelp | | S | general | [Link](https://winhelp2002.mvps.org) | +| winspy | | S | win_telemetry | [Link](https://github.com/crazy-max/WindowsSpyBlocker) | +| yoyo | x | S | general | [Link](https://pgl.yoyo.org/adservers) | + +* List of supported and fully pre-configured adblock sources, already active sources are pre-selected. + To avoid OOM errors, please do not select too many lists! + List size information with the respective domain ranges as follows: + • S (-10k), M (10k-30k) and L (30k-80k) should work for 128 MByte devices, + • XL (80k-200k) should work for 256-512 MByte devices, + • XXL (200k-) needs more RAM and Multicore support, e.g. x86 or raspberry devices. + • VAR (50k-500k) variable size depending on the selection. +* Zero-conf like automatic installation & setup, usually no manual changes needed +* Simple but yet powerful adblock engine: adblock does not use error prone external iptables rulesets, http pixel server instances and things like that +* Supports five different DNS backend formats: dnsmasq, unbound, named (bind), kresd or raw (e.g. used by dnscrypt-proxy) +* Supports four different SSL-enabled download utilities: uclient-fetch, wget, curl or aria2c +* Supports SafeSearch for google, bing, duckduckgo, yandex, youtube and pixabay +* Supports RPZ-trigger 'RPZ-CLIENT-IP' to always allow/deny certain DNS clients based on their IP address (currently only supported by bind dns backend) +* Fast downloads & list processing as they are handled in parallel running background jobs with multicore support +* Supports a wide range of router modes, even AP modes are supported +* Full IPv4 and IPv6 support +* Provides top level domain compression ('tld compression'), this feature removes thousands of needless host entries from the blocklist and lowers the memory footprint for the DNS backend +* Provides a 'DNS File Reset', where the generated DNS blocklist file will be purged after DNS backend loading to save storage space +* Source parsing by fast & flexible regex rulesets, all rules and source information are placed in an external/compredd JSON file ('/etc/adblock/adblock.sources.gz') +* Overall duplicate removal in generated blocklist file 'adb_list.overall' +* Additional local blacklist for manual overrides, located in '/etc/adblock/adblock.blacklist' +* Additional local whitelist for manual overrides, located in '/etc/adblock/adblock.whitelist' +* Quality checks during blocklist update to ensure a reliable DNS backend service +* Minimal status & error logging to syslog, enable debug logging to receive more output +* Procd based init system support ('start', 'stop', 'restart', 'reload', 'enable', 'disable', 'running', 'status', 'suspend', 'resume', 'query', 'report', 'list', 'timer') +* Auto-Startup via procd network interface trigger or via classic time based startup +* Suspend & Resume adblock temporarily without blocklist reloading +* Provides comprehensive runtime information +* Provides a detailed DNS Query Report with DNS related information about client requests, top (blocked) domains and more +* Provides a powerful query function to quickly find blocked (sub-)domains, e.g. for whitelisting +* Provides an easily configurable blocklist update scheduler called 'Refresh Timer' +* Includes an option to generate an additional, restrictive 'adb_list.jail' to block access to all domains except those listed in the whitelist file. You can use this restrictive blocklist manually e.g. for guest wifi or kidsafe configurations +* Includes an option to force DNS requests to the local resolver +* Automatic blocklist backup & restore, these backups will be used in case of download errors and during startup +* Send notification E-Mails in case of a processing error or if the overall domain count is ≤ 0 +* Add new adblock sources on your own, see example below +* Strong LuCI support, all relevant options are exposed to the web frontend + +## Prerequisites +* [OpenWrt](https://openwrt.org), tested with the stable release series and with the latest rolling snapshot releases. + Please note: Devices with less than 128 MByte RAM are _not_ supported! +* A usual setup with an enabled DNS backend at minimum - dumb AP modes without a working DNS backend are _not_ supported +* A download utility with SSL support: 'wget', 'uclient-fetch' with one of the 'libustream-*' ssl libraries, 'aria2c' or 'curl' is required +* A certificate store such as 'ca-bundle' or 'ca-certificates', as adblock checks the validity of the SSL certificates of all download sites by default +* Optional E-Mail notification support: for E-Mail notifications you need to install the additional 'msmtp' package +* Optional DNS Query Report support: for DNS reporting you need to install the additional package 'tcpdump-mini' or 'tcpdump' +* Optional support for gnu awk as alternative to the busybox default, install the additional package 'gawk' + +## Installation & Usage +* Update your local opkg repository (_opkg update_) +* Install 'adblock' (_opkg install adblock_). The adblock service is enabled by default +* Install the LuCI companion package 'luci-app-adblock' (_opkg install luci-app-adblock_) +* It's strongly recommended to use the LuCI frontend to easily configure all aspects of adblock, the application is located in LuCI under the 'Services' menu +* Update from a former adblock version is easy. During the update a backup is made of the old configuration '/etc/config/adblock-backup' and replaced by the new config - that's all + +## Adblock CLI Options +* All important adblock functions are accessible via CLI as well. +
    
    +~# /etc/init.d/adblock
    +Syntax: /etc/init.d/adblock [command]
    +
    +Available commands:
    +	start           Start the service
    +	stop            Stop the service
    +	restart         Restart the service
    +	reload          Reload configuration files (or restart if service does not implement reload)
    +	enable          Enable service autostart
    +	disable         Disable service autostart
    +	enabled         Check if service is started on boot
    +	suspend         Suspend adblock processing
    +	resume          Resume adblock processing
    +	query           <domain> Query active blocklists and backups for a specific domain
    +	report          [<search>] Print DNS statistics with an optional search parameter
    +	list            [<add>|<add_utc>|<add_eng>|<add_stb>|<remove>|<remove_utc>|<remove_eng>|<remove_stb>] <source(s)> List/Edit available sources
    +	timer           [<add> <tasks> <hour> [<minute>] [<weekday>]]|[<remove> <line no.>] List/Edit cron update intervals
    +	version         Print version information
    +	running         Check if service is running
    +	status          Service status
    +	trace           Start with syscall trace
    +
    + +## Adblock Config Options +* Usually the auto pre-configured adblock setup works quite well and no manual overrides are needed + +| Option | Default | Description/Valid Values | +| :----------------- | :--------------------------------- | :--------------------------------------------------------------------------------------------- | +| adb_enabled | 1, enabled | set to 0 to disable the adblock service | +| adb_srcarc | -, /etc/adblock/adblock.sources.gz | full path to the used adblock source archive | +| adb_srcfile | -, /tmp/adb_sources.json | full path to the used adblock source file, which has a higher precedence than the archive file | +| adb_dns | -, auto-detected | 'dnsmasq', 'unbound', 'named', 'kresd' or 'raw' | +| adb_fetchutil | -, auto-detected | 'uclient-fetch', 'wget', 'curl' or 'aria2c' | +| adb_fetchparm | -, auto-detected | manually override the config options for the selected download utility | +| adb_fetchinsecure | 0, disabled | don't check SSL server certificates during download | +| adb_trigger | -, not set | trigger network interface or 'not set' to use a time-based startup | +| adb_triggerdelay | 2 | additional trigger delay in seconds before adblock processing begins | +| adb_debug | 0, disabled | set to 1 to enable the debug output | +| adb_nice | 0, standard prio. | valid nice level range 0-19 of the adblock processes | +| adb_forcedns | 0, disabled | set to 1 to force DNS requests to the local resolver | +| adb_dnsdir | -, auto-detected | path for the generated blocklist file 'adb_list.overall' | +| adb_dnstimeout | 10 | timeout in seconds to wait for a successful DNS backend restart | +| adb_dnsinstance | 0, first instance | set to the relevant dns backend instance used by adblock (dnsmasq only) | +| adb_dnsflush | 0, disabled | set to 1 to flush the DNS Cache before & after adblock processing | +| adb_dnsallow | -, not set | set to 1 to disable selective DNS whitelisting (RPZ-PASSTHRU) | +| adb_lookupdomain | example.com | external domain to check for a successful DNS backend restart or 'false' to disable this check | +| adb_portlist | 53 853 5353 | space separated list of firewall ports which should be redirected locally | +| adb_report | 0, disabled | set to 1 to enable the background tcpdump gathering process for reporting | +| adb_reportdir | /tmp | path for DNS related report files | +| adb_repiface | -, auto-detected | name of the reporting interface or 'any' used by tcpdump | +| adb_replisten | 53 | space separated list of reporting port(s) used by tcpdump | +| adb_repchunkcnt | 5 | report chunk count used by tcpdump | +| adb_repchunksize | 1 | report chunk size used by tcpdump in MB | +| adb_represolve | 0, disabled | resolve reporting IP addresses using reverse DNS (PTR) lookups | +| adb_backup | 1, enabled | set to 0 to disable the backup function | +| adb_backupdir | /tmp | path for adblock backups | +| adb_tmpbase | /tmp | path for all adblock related runtime operations, e.g. downloading, sorting, merging etc. | +| adb_safesearch | 0, disabled | set to 1 to enforce SafeSearch for google, bing, duckduckgo, yandex, youtube and pixabay | +| adb_safesearchlist | -, not set | Limit SafeSearch to certain provider (see above) | +| adb_safesearchmod | 0, disabled | set to 1 to enable moderate SafeSearch filters for youtube | +| adb_mail | 0, disabled | set to 1 to enable notification E-Mails in case of a processing errors | +| adb_mailreceiver | -, not set | receiver address for adblock notification E-Mails | +| adb_mailsender | no-reply@adblock | sender address for adblock notification E-Mails | +| adb_mailtopic | adblock notification | topic for adblock notification E-Mails | +| adb_mailprofile | adb_notify | mail profile used in 'msmtp' for adblock notification E-Mails | +| adb_mailcnt | 0 | minimum domain count to trigger E-Mail notifications | +| adb_jail | 0 | set to 1 to enable the additional, restrictive 'adb_list.jail' creation | +| adb_jaildir | /tmp | path for the generated jail list | + +## Examples +**Change the DNS backend to 'unbound':** +No further configuration is needed, adblock deposits the final blocklist 'adb_list.overall' in '/var/lib/unbound' by default. +To preserve the DNS cache after adblock processing please install the additional package 'unbound-control'. + +**Change the DNS backend to 'bind':** +Adblock deposits the final blocklist 'adb_list.overall' in '/var/lib/bind' by default. +To preserve the DNS cache after adblock processing please install the additional package 'bind-rdnc'. +To use the blocklist please modify '/etc/bind/named.conf': +
    
    +in the 'options' namespace add:
    +  response-policy { zone "rpz"; };
    +
    +and at the end of the file add:
    +  zone "rpz" {
    +    type master;
    +    file "/var/lib/bind/adb_list.overall";
    +    allow-query { none; };
    +    allow-transfer { none; };
    +  };
    +
    + +**Change the DNS backend to 'kresd':** +Adblock deposits the final blocklist 'adb_list.overall' in '/etc/kresd', no further configuration needed. +Please note: The knot-resolver (kresd) is only available on Turris devices and does not support the SafeSearch functionality yet. + +**Use restrictive jail modes:** +You can enable a restrictive 'adb_list.jail' to block access to all domains except those listed in the whitelist file. Usually this list will be generated as an additional list for guest or kidsafe configurations (for a separate dns server instance). If the jail directory points to your primary dns directory, adblock enables the restrictive jail mode automatically (jail mode only). + +**Manually override the download options:** +By default adblock uses the following pre-configured download options: +* aria2c: --timeout=20 --allow-overwrite=true --auto-file-renaming=false --log-level=warn --dir=/ -o +* curl: --connect-timeout 20 --silent --show-error --location -o +* uclient-fetch: --timeout=20 -O +* wget: --no-cache --no-cookies --max-redirect=0 --timeout=20 -O + +To override the default set 'adb_fetchparm' manually to your needs. + +**Enable E-Mail notification via 'msmtp':** +To use the email notification you have to install & configure the package 'msmtp'. +Modify the file '/etc/msmtprc': +
    
    +[...]
    +defaults
    +auth            on
    +tls             on
    +tls_certcheck   off
    +timeout         5
    +syslog          LOG_MAIL
    +[...]
    +account         adb_notify
    +host            smtp.gmail.com
    +port            587
    +from            dev.adblock@gmail.com
    +user            dev.adblock
    +password        xxx
    +
    +Finally enable E-Mail support and add a valid E-Mail receiver address in LuCI. + +**Service status output:** +In LuCI you'll see the realtime status in the 'Runtime' section on the overview page. +To get the status in the CLI, just call _/etc/init.d/adblock status_ or _/etc/init.d/adblock status\_service_: +
    
    +~#@blackhole:~# /etc/init.d/adblock status
    +::: adblock runtime information
    +  + adblock_status  : enabled
    +  + adblock_version : 4.1.4
    +  + blocked_domains : 268355
    +  + active_sources  : adaway, adguard, adguard_tracking, android_tracking, bitcoin, disconnect, firetv_tracking, games_t
    +                      racking, hblock, oisd_basic, phishing_army, smarttv_tracking, stopforumspam, wally3k, winspy, yoyo
    +  + dns_backend     : unbound (unbound-control), /var/lib/unbound
    +  + run_utils       : download: /usr/bin/curl, sort: /usr/libexec/sort-coreutils, awk: /bin/busybox
    +  + run_ifaces      : trigger: wan, report: br-lan
    +  + run_directories : base: /tmp, backup: /mnt/data/adblock-Backup, report: /mnt/data/adblock-Report, jail: /tmp
    +  + run_flags       : backup: ✔, flush: ✘, force: ✔, search: ✘, report: ✔, mail: ✔, jail: ✘
    +  + last_run        : restart, 3m 17s, 249/73/68, 2022-09-10T13:43:07+02:00
    +  + system          : ASUS RT-AX53U, OpenWrt SNAPSHOT r20535-2ca5602864
    +
    +The 'last\_run' line includes the used start type, the run duration, the memory footprint after DNS backend loading (total/free/available) and the date/time of the last run. + +**Edit, add new adblock sources:** +The adblock blocklist sources are stored in an external, compressed JSON file '/etc/adblock/adblock.sources.gz'. +This file is directly parsed in LuCI and accessible via CLI, just call _/etc/init.d/adblock list_: +
    
    +/etc/init.d/adblock list
    +::: Available adblock sources
    +:::
    +    Name                 Enabled   Size   Focus               Info URL
    +    ------------------------------------------------------------------
    +  + adaway               x         S      mobile              https://adaway.org
    +  + adguard              x         L      general             https://adguard.com
    +  + andryou              x         L      compilation         https://gitlab.com/andryou/block/-/blob/master/readme.md
    +  + bitcoin              x         S      mining              https://github.com/hoshsadiq/adblock-nocoin-list
    +  + disconnect           x         S      general             https://disconnect.me
    +  + dshield                        XL     general             https://www.dshield.org
    +[...]
    +  + winhelp                        S      general             http://winhelp2002.mvps.org
    +  + winspy               x         S      win_telemetry       https://github.com/crazy-max/WindowsSpyBlocker
    +  + yoyo                 x         S      general             https://pgl.yoyo.org
    +
    + +To add new or edit existing sources extract the compressed JSON file _gunzip /etc/adblock/adblock.sources.gz_. +A valid JSON source object contains the following required information, e.g.: +
    
    +	[...]
    +	"adaway": {
    +		"url": "https://raw.githubusercontent.com/AdAway/adaway.github.io/master/hosts.txt",
    +		"rule": "/^127\\.0\\.0\\.1[[:space:]]+([[:alnum:]_-]+\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}",
    +		"size": "S",
    +		"focus": "mobile",
    +		"descurl": "https://github.com/AdAway/adaway.github.io"
    +	},
    +	[...]
    +
    +Add an unique object name, make the required changes to 'url', 'rule', 'size' and 'descurl' and finally compress the changed JSON file _gzip /etc/adblock/adblock.sources_ to use the new source object in adblock. +Please note: if you're going to add new sources on your own, please make a copy of the default file and work with that copy further on, cause the default will be overwritten with every adblock update. To reference your copy set the option 'adb\_srcarc' which points by default to '/etc/adblock/adblock.sources.gz' +Please note: when adblock starts, it looks for the uncompressed 'adb\_srcfile', only if this file is not found the archive 'adb\_srcarc' is unpacked once and then the uncompressed file is used + +## Support +Please join the adblock discussion in this [forum thread](https://forum.openwrt.org/t/adblock-support-thread/507) or contact me by mail + +Have fun! +Dirk + diff --git a/package/network/config/adblock/files/adblock.blacklist b/package/network/config/adblock/files/adblock.blacklist new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package/network/config/adblock/files/adblock.categories b/package/network/config/adblock/files/adblock.categories new file mode 100644 index 0000000000..1d1118837b --- /dev/null +++ b/package/network/config/adblock/files/adblock.categories @@ -0,0 +1,79 @@ +stb;fakenews;alternates/fakenews/hosts +stb;fakenews-gambling;alternates/fakenews-gambling/hosts +stb;fakenews-gambling-porn;alternates/fakenews-gambling-porn/hosts +stb;fakenews-gambling-porn-social;alternates/fakenews-porn-social/hosts +stb;fakenews-gambling-social;alternates/fakenews-gambling-social/hosts +stb;fakenews-porn;alternates/fakenews-porn/hosts +stb;fakenews-porn-social;alternates/fakenews-porn-social/hosts +stb;fakenews-social;alternates/fakenews-social/hosts +stb;gambling;alternates/gambling/hosts +stb;gambling-porn;alternates/gambling-porn/hosts +stb;gambling-porn-social;alternates/gambling-porn-social/hosts +stb;gambling-social;alternates/gambling-social/hosts +stb;porn;alternates/porn/hosts +stb;porn-social;alternates/porn-social/hosts +stb;social;alternates/social/hosts +stb;standard;hosts +utc;adult +utc;agressif +utc;arjel +utc;associations_religieuses +utc;astrology +utc;audio-video +utc;bank +utc;bitcoin +utc;blog +utc;celebrity +utc;chat +utc;child +utc;cleaning +utc;cooking +utc;cryptojacking +utc;dangerous_material +utc;dating +utc;ddos +utc;dialer +utc;doh +utc;download +utc;drogue +utc;educational_games +utc;examen_pix +utc;exceptions_liste_bu +utc;filehosting +utc;financial +utc;forums +utc;gambling +utc;games +utc;hacking +utc;jobsearch +utc;lingerie +utc;liste_blanche +utc;liste_bu +utc;malware +utc;manga +utc;marketingware +utc;mixed_adult +utc;mobile-phone +utc;phishing +utc;press +utc;publicite +utc;radio +utc;reaffected +utc;redirector +utc;remote-control +utc;sect +utc;sexual_education +utc;shopping +utc;shortener +utc;social_networks +utc;special +utc;sports +utc;stalkerware +utc;strict_redirector +utc;strong_redirector +utc;translation +utc;tricheur +utc;update +utc;vpn +utc;warez +utc;webmail diff --git a/package/network/config/adblock/files/adblock.conf b/package/network/config/adblock/files/adblock.conf new file mode 100644 index 0000000000..aeceb500f2 --- /dev/null +++ b/package/network/config/adblock/files/adblock.conf @@ -0,0 +1,14 @@ + +config adblock 'global' + option adb_enabled '1' + option adb_debug '0' + option adb_forcedns '0' + option adb_safesearch '0' + option adb_dnsfilereset '0' + option adb_mail '0' + option adb_report '0' + option adb_backup '1' + list adb_sources 'adaway' + list adb_sources 'adguard' + list adb_sources 'disconnect' + list adb_sources 'yoyo' diff --git a/package/network/config/adblock/files/adblock.init b/package/network/config/adblock/files/adblock.init new file mode 100755 index 0000000000..947e2f6cec --- /dev/null +++ b/package/network/config/adblock/files/adblock.init @@ -0,0 +1,269 @@ +#!/bin/sh /etc/rc.common +# Copyright (c) 2015-2022 Dirk Brenken (dev@brenken.org) +# This is free software, licensed under the GNU General Public License v3. + +# disable (s)hellcheck in release +# shellcheck disable=all + +START=30 +USE_PROCD=1 + +extra_command "suspend" "Suspend adblock processing" +extra_command "resume" "Resume adblock processing" +extra_command "query" " Query active blocklists and backups for a specific domain" +extra_command "report" "[[|||] [] [] []] Print DNS statistics with an optional search parameter" +extra_command "list" "[|||||||] List/Edit available sources" +extra_command "timer" "[ [] []]|[ ] List/Edit cron update intervals" + +adb_init="/etc/init.d/adblock" +adb_script="/usr/bin/adblock.sh" +adb_pidfile="/var/run/adblock.pid" + +if [ -s "${adb_pidfile}" ] && { [ "${action}" = "start" ] || [ "${action}" = "stop" ] || + [ "${action}" = "restart" ] || [ "${action}" = "reload" ] || [ "${action}" = "report" ] || + [ "${action}" = "suspend" ] || [ "${action}" = "resume" ] || [ "${action}" = "query" ] || + { [ "${action}" = "list" ] && [ -n "${1}" ]; }; }; then + return 0 +fi + +boot() { + [ -s "${adb_pidfile}" ] && : >"${adb_pidfile}" + rc_procd start_service +} + +start_service() { + if "${adb_init}" enabled; then + if [ "${action}" = "boot" ]; then + [ -n "$(uci_get adblock global adb_trigger)" ] && return 0 + fi + procd_open_instance "adblock" + procd_set_param command "${adb_script}" "${@}" + procd_set_param pidfile "${adb_pidfile}" + procd_set_param nice "$(uci_get adblock global adb_nice "0")" + procd_set_param stdout 1 + procd_set_param stderr 1 + procd_close_instance + fi +} + +reload_service() { + rc_procd start_service reload +} + +stop_service() { + rc_procd "${adb_script}" stop +} + +restart() { + rc_procd start_service restart +} + +suspend() { + rc_procd start_service suspend +} + +resume() { + rc_procd start_service resume +} + +query() { + rc_procd "${adb_script}" query "${1}" +} + +report() { + rc_procd "${adb_script}" report "${1:-"cli"}" "${2}" "${3}" "${4}" +} + +list() { + local src_archive src_file src_enabled enabled name utc_list size focus descurl action="${1}" + + if [ "${action%_*}" = "add" ] || [ "${action%_*}" = "remove" ]; then + shift + for name in "${@}"; do + case "${action}" in + "add") + if ! uci_get adblock global adb_sources | grep -q "${name}"; then + uci_add_list adblock global adb_sources "${name}" + printf "%s\n" "::: adblock source '${name}' added to config" + fi + ;; + "remove") + if uci_get adblock global adb_sources | grep -q "${name}"; then + uci_remove_list adblock global adb_sources "${name}" + printf "%s\n" "::: adblock source '${name}' removed from config" + fi + ;; + "add_utc") + if ! uci_get adblock global adb_utc_sources | grep -q "${name}"; then + uci_add_list adblock global adb_utc_sources "${name}" + printf "%s\n" "::: adblock utcapitole '${name}' added to config" + fi + ;; + "remove_utc") + if uci_get adblock global adb_utc_sources | grep -q "${name}"; then + uci_remove_list adblock global adb_utc_sources "${name}" + printf "%s\n" "::: adblock utcapitole '${name}' removed from config" + fi + ;; + "add_eng") + if ! uci_get adblock global adb_eng_sources | grep -q "${name}"; then + uci_add_list adblock global adb_eng_sources "${name}" + printf "%s\n" "::: adblock energized '${name}' added to config" + fi + ;; + "remove_eng") + if uci_get adblock global adb_eng_sources | grep -q "${name}"; then + uci_remove_list adblock global adb_eng_sources "${name}" + printf "%s\n" "::: adblock energized '${name}' removed from config" + fi + ;; + "add_stb") + if ! uci_get adblock global adb_stb_sources | grep -q "${name}"; then + uci_add_list adblock global adb_stb_sources "${name}" + printf "%s\n" "::: adblock stevenblack '${name}' added to config" + fi + ;; + "remove_stb") + if uci_get adblock global adb_stb_sources | grep -q "${name}"; then + uci_remove_list adblock global adb_stb_sources "${name}" + printf "%s\n" "::: adblock stevenblack '${name}' removed from config" + fi + ;; + esac + done + [ -n "$(uci -q changes adblock)" ] && { uci_commit adblock; "${adb_init}" start; } + else + src_archive="$(uci_get adblock global adb_srcarc "/etc/adblock/adblock.sources.gz")" + src_file="$(uci_get adblock global adb_srcfile "/tmp/adb_sources.json")" + src_enabled="$(uci -q show adblock.global.adb_sources)" + [ -r "${src_archive}" ] && zcat "${src_archive}" >"${src_file}" || printf "%s\n" "::: adblock source archive '${src_archive}' not found" + + if [ -r "${src_file}" ]; then + src_enabled="${src_enabled#*=}" + src_enabled="${src_enabled//\'}" + printf "%s\n" "::: Available adblock sources" + printf "%s\n" ":::" + printf "%-25s%-10s%-7s%-21s%s\n" " Name" "Enabled" "Size" "Focus" "Info URL" + printf "%s\n" " -------------------------------------------------------------------" + json_load_file "${src_file}" + json_get_keys keylist + for key in ${keylist}; do + json_select "${key}" + json_get_var size "size" + json_get_var focus "focus" + json_get_var descurl "descurl" + json_get_var url "url" + json_get_var rule "rule" + if [ -n "${url}" ] && [ -n "${rule}" ]; then + if printf "%s" "${src_enabled}" | grep -q "${key}"; then + enabled="x" + else + enabled=" " + fi + src_enabled="${src_enabled/${key}}" + printf " + %-21s%-10s%-7s%-21s%s\n" "${key:0:20}" "${enabled}" "${size:0:3}" "${focus:0:20}" "${descurl:0:50}" + else + src_enabled="${src_enabled} ${key}" + fi + json_select .. + done + utc_list="$(uci_get adblock global adb_utc_sources "-")" + eng_list="$(uci_get adblock global adb_eng_sources "-")" + stb_list="$(uci_get adblock global adb_stb_sources "-")" + printf "%s\n" " ---------------------------------------------------------------------------" + printf " * %s\n" "Configured utcapitole categories: ${utc_list// /, }" + printf " * %s\n" "Configured energized variants: ${eng_list// /, }" + printf " * %s\n" "Configured stevenblack variants: ${stb_list// /, }" + + if [ -n "${src_enabled// }" ]; then + printf "%s\n" " ---------------------------------------------------------------------------" + printf "%s\n" " Sources with invalid configuration" + printf "%s\n" " ---------------------------------------------------------------------------" + for key in ${src_enabled}; do + printf " - %s\n" "${key:0:20}" + done + fi + else + printf "%s\n" "::: adblock source file '${src_file}' not found" + fi + fi +} + +status() { + status_service +} + +status_service() { + local key keylist value idxval values type rtfile + + rtfile="$(uci_get adblock global adb_rtfile "/tmp/adb_runtime.json")" + + json_load_file "${rtfile}" >/dev/null 2>&1 + json_get_keys keylist + if [ -n "${keylist}" ]; then + printf "%s\n" "::: adblock runtime information" + for key in ${keylist}; do + json_get_var value "${key}" >/dev/null 2>&1 + if [ "${key%_*}" = "active" ]; then + printf " + %-15s : " "${key}" + json_select "${key}" >/dev/null 2>&1 + values="" + index="1" + while json_get_type type "${index}" && [ "${type}" = "object" ]; do + json_get_values idxval "${index}" >/dev/null 2>&1 + if [ "${index}" = "1" ]; then + values="${idxval}" + else + values="${values}, ${idxval}" + fi + index="$((index + 1))" + done + values="$(printf "%s" "${values}" | awk '{NR=1;max=98;if(length($0)>max+1)while($0){if(NR==1){print substr($0,1,max)}else{printf"%-22s%s\n","",substr($0,1,max)}{$0=substr($0,max+1);NR=NR+1}}else print}')" + printf "%s\n" "${values:-"-"}" + json_select ".." + else + printf " + %-15s : %s\n" "${key}" "${value:-"-"}" + fi + done + else + printf "%s\n" "::: no adblock runtime information available" + fi +} + +timer() { + local cron_file cron_content cron_lineno action="${1:-"list"}" cron_tasks="${2}" hour="${3}" minute="${4:-0}" weekday="${5:-"*"}" + + cron_file="/etc/crontabs/root" + + if [ -s "${cron_file}" ] && [ "${action}" = "list" ]; then + awk '{print NR "> " $0}' "${cron_file}" + elif [ -x "/etc/init.d/cron" ] && [ "${action}" = "add" ]; then + hour="${hour//[[:alpha:]]/}" + minute="${minute//[[:alpha:]]/}" + if [ -n "${cron_tasks}" ] && [ -n "${hour}" ] && [ -n "${minute}" ] && [ -n "${weekday}" ] && + [ "${hour}" -ge 0 ] && [ "${hour}" -le 23 ] && + [ "${minute}" -ge 0 ] && [ "${minute}" -le 59 ]; then + printf "%02d %02d %s\n" "${minute}" "${hour}" "* * ${weekday} ${adb_init} ${cron_tasks}" >>"${cron_file}" + /etc/init.d/cron restart + fi + elif [ -x "/etc/init.d/cron" ] && [ -s "${cron_file}" ] && [ "${action}" = "remove" ]; then + cron_tasks="${cron_tasks//[[:alpha:]]/}" + cron_lineno="$(awk 'END{print NR}' "${cron_file}")" + cron_content="$(awk '{print $0}' "${cron_file}")" + if [ "${cron_tasks:-"0"}" -le "${cron_lineno:-"1"}" ] && [ -n "${cron_content}" ]; then + printf "%s\n" "${cron_content}" | awk "NR!~/^${cron_tasks}$/" >"${cron_file}" + /etc/init.d/cron restart + fi + fi +} + +service_triggers() { + local iface delay + + iface="$(uci_get adblock global adb_trigger)" + delay="$(uci_get adblock global adb_triggerdelay "5")" + PROCD_RELOAD_DELAY="$((delay * 1000))" + + [ -n "${iface}" ] && procd_add_interface_trigger "interface.*.up" "${iface}" "${adb_init}" "start" + procd_add_reload_trigger "adblock" +} diff --git a/package/network/config/adblock/files/adblock.mail b/package/network/config/adblock/files/adblock.mail new file mode 100755 index 0000000000..67fc011aa5 --- /dev/null +++ b/package/network/config/adblock/files/adblock.mail @@ -0,0 +1,77 @@ +#!/bin/sh +# send mail script for adblock notifications +# Copyright (c) 2015-2022 Dirk Brenken (dev@brenken.org) +# This is free software, licensed under the GNU General Public License v3. + +# Please note: you have to manually install and configure the package 'msmtp' before using this script + +# set (s)hellcheck exceptions +# shellcheck disable=all + +LC_ALL=C +PATH="/usr/sbin:/usr/bin:/sbin:/bin" + +[ -r "/lib/functions.sh" ] && . "/lib/functions.sh" + +adb_debug="$(uci_get adblock global adb_debug "0")" +adb_mailsender="$(uci_get adblock global adb_mailsender "no-reply@adblock")" +adb_mailreceiver="$(uci_get adblock global adb_mailreceiver)" +adb_mailtopic="$(uci_get adblock global adb_mailtopic "adblock notification")" +adb_mailprofile="$(uci_get adblock global adb_mailprofile "adb_notify")" +adb_ver="${1}" +adb_mail="$(command -v msmtp)" +adb_logger="$(command -v logger)" +adb_logread="$(command -v logread)" +adb_rc="1" + +f_log() { + local class="${1}" log_msg="${2}" + + if [ -x "${adb_logger}" ]; then + "${adb_logger}" -p "${class}" -t "adblock-${adb_ver}[${$}]" "${log_msg}" + else + printf "%s %s %s\n" "${class}" "adblock-${adb_ver}[${$}]" "${log_msg}" + fi +} + +if [ -z "${adb_mailreceiver}" ]; then + f_log "err" "please set the mail receiver with the 'adb_mailreceiver' option" + exit ${adb_rc} +fi +[ "${adb_debug}" = "1" ] && debug="--debug" + +adb_mailhead="From: ${adb_mailsender}\nTo: ${adb_mailreceiver}\nSubject: ${adb_mailtopic}\nReply-to: ${adb_mailsender}\nMime-Version: 1.0\nContent-Type: text/html;charset=utf-8\nContent-Disposition: inline\n\n" + +# info preparation +# +sys_info="$( + strings /etc/banner 2>/dev/null + ubus call system board | sed -e 's/\"release\": {//' | sed -e 's/^[ \t]*//' | sed -e 's/[{}\",]//g' | sed -e 's/[ ]/ \t/' | sed '/^$/d' 2>/dev/null +)" +adb_info="$(/etc/init.d/adblock status 2>/dev/null)" +rep_info="${2}" +if [ -x "${adb_logread}" ]; then + log_info="$("${adb_logread}" -l 100 -e "adblock-" | awk '{NR=1;max=120;if(length($0)>max+1)while($0){if(NR==1){print substr($0,1,max)}else{print substr($0,1,max)}{$0=substr($0,max+1);NR=NR+1}}else print}')" +fi + +# mail body +# +adb_mailtext="
    "
    +adb_mailtext="${adb_mailtext}\n++\n++ System Information ++\n++\n${sys_info}"
    +adb_mailtext="${adb_mailtext}\n\n++\n++ Adblock Information ++\n++\n${adb_info}"
    +if [ -n "${rep_info}" ]; then
    +	adb_mailtext="${adb_mailtext}\n\n++\n++ Report Information ++\n++\n${rep_info}"
    +fi
    +adb_mailtext="${adb_mailtext}\n\n++\n++ Logfile Information ++\n++\n${log_info}"
    +adb_mailtext="${adb_mailtext}
    " + +# send mail +# +if [ -x "${adb_mail}" ]; then + printf "%b" "${adb_mailhead}${adb_mailtext}" 2>/dev/null | "${adb_mail}" ${debug} -a "${adb_mailprofile}" "${adb_mailreceiver}" >/dev/null 2>&1 + adb_rc=${?} + f_log "info" "mail sent to '${adb_mailreceiver}' with rc '${adb_rc}'" +else + f_log "err" "msmtp mail daemon not found" +fi +exit ${adb_rc} diff --git a/package/network/config/adblock/files/adblock.sh b/package/network/config/adblock/files/adblock.sh new file mode 100755 index 0000000000..e76e814507 --- /dev/null +++ b/package/network/config/adblock/files/adblock.sh @@ -0,0 +1,1488 @@ +#!/bin/sh +# dns based ad/abuse domain blocking +# Copyright (c) 2015-2023 Dirk Brenken (dev@brenken.org) +# This is free software, licensed under the GNU General Public License v3. + +# disable (s)hellcheck in release +# shellcheck disable=all + +# set initial defaults +# +export LC_ALL=C +export PATH="/usr/sbin:/usr/bin:/sbin:/bin" + +adb_ver="4.1.5" +adb_enabled="0" +adb_debug="0" +adb_forcedns="0" +adb_dnsflush="0" +adb_dnstimeout="20" +adb_safesearch="0" +adb_safesearchlist="" +adb_safesearchmod="0" +adb_report="0" +adb_trigger="" +adb_triggerdelay="0" +adb_backup="1" +adb_mail="0" +adb_mailcnt="0" +adb_jail="0" +adb_dns="" +adb_dnsprefix="adb_list" +adb_locallist="blacklist whitelist iplist" +adb_tmpbase="/tmp" +adb_backupdir="${adb_tmpbase}/adblock-Backup" +adb_reportdir="${adb_tmpbase}/adblock-Report" +adb_jaildir="/tmp" +adb_pidfile="/var/run/adblock.pid" +adb_blacklist="/etc/adblock/adblock.blacklist" +adb_whitelist="/etc/adblock/adblock.whitelist" +adb_mailservice="/etc/adblock/adblock.mail" +adb_dnsfile="${adb_dnsprefix}.overall" +adb_dnsjail="${adb_dnsprefix}.jail" +adb_srcarc="/etc/adblock/adblock.sources.gz" +adb_srcfile="${adb_tmpbase}/adb_sources.json" +adb_rtfile="${adb_tmpbase}/adb_runtime.json" +adb_loggercmd="$(command -v logger)" +adb_dumpcmd="$(command -v tcpdump)" +adb_lookupcmd="$(command -v nslookup)" +adb_fetchutil="" +adb_fetchinsecure="" +adb_zonelist="" +adb_portlist="" +adb_repiface="" +adb_replisten="53" +adb_repchunkcnt="5" +adb_repchunksize="1" +adb_represolve="0" +adb_lookupdomain="example.com" +adb_action="${1:-"start"}" +adb_packages="" +adb_sources="" +adb_cnt="" + +# load & check adblock environment +# +f_load() { + local bg_pid iface port ports cpu core + + adb_sysver="$(ubus -S call system board 2>/dev/null | jsonfilter -q -e '@.model' -e '@.release.description' | + "${adb_awk}" 'BEGIN{RS="";FS="\n"}{printf "%s, %s",$1,$2}')" + adb_memory="$("${adb_awk}" '/^MemTotal|^MemFree|^MemAvailable/{ORS="/"; print int($2/1000)}' "/proc/meminfo" 2>/dev/null | + "${adb_awk}" '{print substr($0,1,length($0)-1)}')" + + f_conf + + cpu="$(grep -c '^processor' /proc/cpuinfo 2>/dev/null)" + core="$(grep -cm1 '^core id' /proc/cpuinfo 2>/dev/null)" + [ "${cpu}" = "0" ] && cpu="1" + [ "${core}" = "0" ] && core="1" + adb_cores="$((cpu * core))" + + if [ "${adb_action}" != "report" ]; then + f_dns + f_fetch + fi + + if [ "${adb_enabled}" = "0" ]; then + f_extconf + f_temp + f_rmdns + f_jsnup "disabled" + f_log "info" "adblock is currently disabled, please set the config option 'adb_enabled' to '1' to use this service" + exit 0 + fi + + if [ "${adb_report}" = "1" ] && [ ! -x "${adb_dumpcmd}" ]; then + f_log "info" "Please install the package 'tcpdump' or 'tcpdump-mini' to use the reporting feature" + elif [ "${adb_report}" = "0" ] && [ "${adb_action}" = "report" ]; then + f_log "info" "Please enable the 'DNS Report' option to use the reporting feature" + exit 0 + fi + + bg_pid="$(pgrep -f "^${adb_dumpcmd}.*adb_report\\.pcap$" | "${adb_awk}" '{ORS=" "; print $1}')" + if [ -x "${adb_dumpcmd}" ] && { [ "${adb_report}" = "0" ] || { [ -n "${bg_pid}" ] && { [ "${adb_action}" = "stop" ] || [ "${adb_action}" = "restart" ]; }; }; }; then + if [ -n "${bg_pid}" ]; then + kill -HUP "${bg_pid}" 2>/dev/null + while kill -0 "${bg_pid}" 2>/dev/null; do + sleep 1 + done + unset bg_pid + fi + fi + + if [ -x "${adb_dumpcmd}" ] && [ "${adb_report}" = "1" ] && [ -z "${bg_pid}" ] && [ "${adb_action}" != "report" ] && [ "${adb_action}" != "stop" ]; then + for port in ${adb_replisten}; do + [ -z "${ports}" ] && ports="port ${port}" || ports="${ports} or port ${port}" + done + if [ -z "${adb_repiface}" ]; then + network_get_device iface "lan" + [ -z "${iface}" ] && network_get_physdev iface "lan" + [ -n "${iface}" ] && adb_repiface="${iface}" + [ -n "${adb_repiface}" ] && { uci_set adblock global adb_repiface "${adb_repiface}"; f_uci "adblock"; } + fi + if [ -n "${adb_reportdir}" ] && [ ! -d "${adb_reportdir}" ]; then + mkdir -p "${adb_reportdir}" + f_log "info" "report directory '${adb_reportdir}' created" + fi + if [ -n "${adb_repiface}" ] && [ -d "${adb_reportdir}" ]; then + ("${adb_dumpcmd}" -nn -p -s0 -l -i ${adb_repiface} ${ports} -C${adb_repchunksize} -W${adb_repchunkcnt} -w "${adb_reportdir}/adb_report.pcap" >/dev/null 2>&1 &) + bg_pid="$(pgrep -f "^${adb_dumpcmd}.*adb_report\\.pcap$" | "${adb_awk}" '{ORS=" "; print $1}')" + else + f_log "info" "Please set the name of the reporting network device 'adb_repiface' manually" + fi + fi +} + +# check & set environment +# +f_env() { + adb_starttime="$(date "+%s")" + f_log "info" "adblock instance started ::: action: ${adb_action}, priority: ${adb_nice:-"0"}, pid: ${$}" + f_jsnup "running" + f_extconf + f_temp + + if [ "${adb_dnsflush}" = "1" ] || [ "${adb_memory##*/}" -lt "64" ]; then + printf "%b" "${adb_dnsheader}" >"${adb_dnsdir}/${adb_dnsfile}" + f_dnsup + fi + + if [ ! -r "${adb_srcfile}" ]; then + if [ -r "${adb_srcarc}" ]; then + zcat "${adb_srcarc}" >"${adb_srcfile}" + else + f_log "err" "adblock source archive not found" + fi + fi + if [ -r "${adb_srcfile}" ] && [ "${adb_action}" != "report" ]; then + json_init + json_load_file "${adb_srcfile}" + else + f_log "err" "adblock source file not found" + fi +} + +# load adblock config +# +f_conf() { + local cnt="0" cnt_max="10" + + [ ! -r "/etc/config/adblock" ] && f_log "err" "no valid adblock config found, please re-install the package via opkg with the '--force-reinstall --force-maintainer' options" + + config_cb() { + option_cb() { + local option="${1}" + local value="${2}" + eval "${option}=\"${value}\"" + } + list_cb() { + local option="${1}" + local value="${2}" + if [ "${option}" = "adb_sources" ]; then + eval "${option}=\"$(printf "%s" "${adb_sources}") ${value}\"" + elif [ "${option}" = "adb_eng_sources" ]; then + eval "${option}=\"$(printf "%s" "${adb_eng_sources}") ${value}\"" + elif [ "${option}" = "adb_stb_sources" ]; then + eval "${option}=\"$(printf "%s" "${adb_stb_sources}") ${value}\"" + elif [ "${option}" = "adb_utc_sources" ]; then + eval "${option}=\"$(printf "%s" "${adb_utc_sources}") ${value}\"" + elif [ "${option}" = "adb_denyip" ]; then + eval "${option}=\"$(printf "%s" "${adb_denyip}") ${value}\"" + elif [ "${option}" = "adb_allowip" ]; then + eval "${option}=\"$(printf "%s" "${adb_allowip}") ${value}\"" + elif [ "${option}" = "adb_safesearchlist" ]; then + eval "${option}=\"$(printf "%s" "${adb_safesearchlist}") ${value}\"" + elif [ "${option}" = "adb_zonelist" ]; then + eval "${option}=\"$(printf "%s" "${adb_zonelist}") ${value}\"" + elif [ "${option}" = "adb_portlist" ]; then + eval "${option}=\"$(printf "%s" "${adb_portlist}") ${value}\"" + fi + } + } + config_load adblock + + if [ -z "${adb_fetchutil}" ] || [ -z "${adb_dns}" ]; then + while [ -z "${adb_packages}" ] && [ "${cnt}" -le "${cnt_max}" ]; do + adb_packages="$(opkg list-installed 2>/dev/null)" + cnt="$((cnt + 1))" + sleep 1 + done + [ -z "${adb_packages}" ] && f_log "err" "local opkg package repository is not available, please set 'adb_fetchutil' and 'adb_dns' manually" + fi +} + +# status helper function +# +f_char() { + local result input="${1}" + + if [ "${input}" = "1" ]; then + result="✔" + else + result="✘" + fi + printf "%s" "${result}" +} + +# load dns backend config +# +f_dns() { + local util utils dns_up cnt="0" + + if [ -z "${adb_dns}" ]; then + utils="knot-resolver bind unbound dnsmasq raw" + for util in ${utils}; do + if [ "${util}" = "raw" ] || printf "%s" "${adb_packages}" | grep -q "^${util}"; then + if [ "${util}" = "knot-resolver" ]; then + util="kresd" + elif [ "${util}" = "bind" ]; then + util="named" + fi + if [ "${util}" = "raw" ] || [ -x "$(command -v "${util}")" ]; then + adb_dns="${util}" + uci_set adblock global adb_dns "${util}" + f_uci "adblock" + break + fi + fi + done + elif [ "${adb_dns}" != "raw" ] && [ ! -x "$(command -v "${adb_dns}")" ]; then + unset adb_dns + fi + + if [ -n "${adb_dns}" ]; then + case "${adb_dns}" in + "dnsmasq") + adb_dnscachecmd="-" + adb_dnsinstance="${adb_dnsinstance:-"0"}" + adb_dnsuser="${adb_dnsuser:-"dnsmasq"}" + adb_dnsdir="${adb_dnsdir:-"/tmp/dnsmasq.d"}" + adb_dnsheader="${adb_dnsheader:-""}" + adb_dnsdeny="${adb_dnsdeny:-"${adb_awk} '{print \"local=/\"\$0\"/\"}'"}" + adb_dnsallow="${adb_dnsallow:-"${adb_awk} '{print \"local=/\"\$0\"/#\"}'"}" + adb_dnssafesearch="${adb_dnssafesearch:-"${adb_awk} -v item=\"\$item\" '{print \"address=/\"\$0\"/\"item\"\"}'"}" + adb_dnsstop="${adb_dnsstop:-"address=/#/"}" + ;; + "unbound") + adb_dnscachecmd="$(command -v unbound-control || printf "%s" "-")" + adb_dnsinstance="${adb_dnsinstance:-"0"}" + adb_dnsuser="${adb_dnsuser:-"unbound"}" + adb_dnsdir="${adb_dnsdir:-"/var/lib/unbound"}" + adb_dnsheader="${adb_dnsheader:-""}" + adb_dnsdeny="${adb_dnsdeny:-"${adb_awk} '{print \"local-zone: \\042\"\$0\"\\042 always_nxdomain\"}'"}" + adb_dnsallow="${adb_dnsallow:-"${adb_awk} '{print \"local-zone: \\042\"\$0\"\\042 always_transparent\"}'"}" + adb_dnssafesearch="${adb_dnssafesearch:-"${adb_awk} -v item=\"\$item\" '{type=\"AAAA\";if(match(item,/^([0-9]{1,3}\.){3}[0-9]{1,3}$/)){type=\"A\"}}{print \"local-data: \\042\"\$0\" \"type\" \"item\"\\042\"}'"}" + adb_dnsstop="${adb_dnsstop:-"local-zone: \".\" always_nxdomain"}" + ;; + "named") + adb_dnscachecmd="$(command -v rndc || printf "%s" "-")" + adb_dnsinstance="${adb_dnsinstance:-"0"}" + adb_dnsuser="${adb_dnsuser:-"bind"}" + adb_dnsdir="${adb_dnsdir:-"/var/lib/bind"}" + adb_dnsheader="${adb_dnsheader:-"\$TTL 2h\n@ IN SOA localhost. root.localhost. (1 6h 1h 1w 2h)\n IN NS localhost.\n"}" + adb_dnsdeny="${adb_dnsdeny:-"${adb_awk} '{print \"\"\$0\" CNAME .\\n*.\"\$0\" CNAME .\"}'"}" + adb_dnsallow="${adb_dnsallow:-"${adb_awk} '{print \"\"\$0\" CNAME rpz-passthru.\\n*.\"\$0\" CNAME rpz-passthru.\"}'"}" + adb_dnsdenyip="${adb_dnsdenyip:-"${adb_awk} '{print \"\"\$0\".rpz-client-ip CNAME .\"}'"}" + adb_dnsallowip="${adb_dnsallowip:-"${adb_awk} '{print \"\"\$0\".rpz-client-ip CNAME rpz-passthru.\"}'"}" + adb_dnssafesearch="${adb_dnssafesearch:-"${adb_awk} -v item=\"\$item\" '{print \"\"\$0\" CNAME \"item\".\\n*.\"\$0\" CNAME \"item\".\"}'"}" + adb_dnsstop="${adb_dnsstop:-"* CNAME ."}" + ;; + "kresd") + adb_dnscachecmd="-" + adb_dnsinstance="${adb_dnsinstance:-"0"}" + adb_dnsuser="${adb_dnsuser:-"root"}" + adb_dnsdir="${adb_dnsdir:-"/etc/kresd"}" + adb_dnsheader="${adb_dnsheader:-"\$TTL 2h\n@ IN SOA localhost. root.localhost. (1 6h 1h 1w 2h)\n"}" + adb_dnsdeny="${adb_dnsdeny:-"${adb_awk} '{print \"\"\$0\" CNAME .\\n*.\"\$0\" CNAME .\"}'"}" + adb_dnsallow="${adb_dnsallow:-"${adb_awk} '{print \"\"\$0\" CNAME rpz-passthru.\\n*.\"\$0\" CNAME rpz-passthru.\"}'"}" + adb_dnssafesearch="${adb_dnssafesearch:-"${adb_awk} -v item=\"\$item\" '{type=\"AAAA\";if(match(item,/^([0-9]{1,3}\.){3}[0-9]{1,3}$/)){type=\"A\"}}{print \"\"\$0\" \"type\" \"item\"\"}'"}" + adb_dnsstop="${adb_dnsstop:-"* CNAME ."}" + ;; + "raw") + adb_dnscachecmd="-" + adb_dnsinstance="${adb_dnsinstance:-"0"}" + adb_dnsuser="${adb_dnsuser:-"root"}" + adb_dnsdir="${adb_dnsdir:-"/tmp"}" + adb_dnsheader="${adb_dnsheader:-""}" + adb_dnsdeny="${adb_dnsdeny:-"0"}" + adb_dnsallow="${adb_dnsallow:-"1"}" + adb_dnssafesearch="${adb_dnssafesearch:-"0"}" + adb_dnsstop="${adb_dnsstop:-"0"}" + ;; + esac + fi + + if [ "${adb_dns}" != "raw" ] && { [ -z "${adb_dns}" ] || [ ! -x "$(command -v "${adb_dns}")" ]; }; then + f_log "err" "dns backend not found, please set 'adb_dns' manually" + fi + + if [ "${adb_dns}" != "raw" ] && { [ "${adb_dnsdir}" = "${adb_tmpbase}" ] || [ "${adb_dnsdir}" = "${adb_backupdir}" ] || [ "${adb_dnsdir}" = "${adb_reportdir}" ]; }; then + f_log "err" "dns directory '${adb_dnsdir}' has been misconfigured, it must not point to the 'adb_tmpbase', 'adb_backupdir', 'adb_reportdir'" + fi + + if [ "${adb_action}" = "start" ] && [ -z "${adb_trigger}" ]; then + sleep ${adb_triggerdelay} + fi + + if [ "${adb_dns}" != "raw" ] && [ "${adb_action}" != "stop" ]; then + while [ "${cnt}" -le 30 ]; do + dns_up="$(ubus -S call service list "{\"name\":\"${adb_dns}\"}" 2>/dev/null | jsonfilter -l1 -e "@[\"${adb_dns}\"].instances.*.running" 2>/dev/null)" + if [ "${dns_up}" = "true" ]; then + break + fi + sleep 1 + cnt="$((cnt + 1))" + done + fi + + if [ "${adb_action}" != "stop" ]; then + if [ -n "${adb_dnsdir}" ] && [ ! -d "${adb_dnsdir}" ]; then + if mkdir -p "${adb_dnsdir}"; then + f_log "info" "dns backend directory '${adb_dnsdir}' created" + else + f_log "err" "dns backend directory '${adb_dnsdir}' could not be created" + fi + fi + [ ! -f "${adb_dnsdir}/${adb_dnsfile}" ] && printf "%b" "${adb_dnsheader}" >"${adb_dnsdir}/${adb_dnsfile}" + + if [ "${dns_up}" != "true" ]; then + if ! f_dnsup 4; then + f_log "err" "dns backend '${adb_dns}' not running or executable" + fi + fi + + if [ "${adb_backup}" = "1" ] && [ -n "${adb_backupdir}" ] && [ ! -d "${adb_backupdir}" ]; then + if mkdir -p "${adb_backupdir}"; then + f_log "info" "backup directory '${adb_backupdir}' created" + else + f_log "err" "backup directory '${adb_backupdir}' could not be created" + fi + fi + + if [ -n "${adb_jaildir}" ] && [ ! -d "${adb_jaildir}" ]; then + if mkdir -p "${adb_jaildir}"; then + f_log "info" "jail directory '${adb_jaildir}' created" + else + f_log "err" "jail directory '${adb_jaildir}' could not be created" + fi + fi + fi + f_log "debug" "f_dns ::: dns: ${adb_dns}, dns_dir: ${adb_dnsdir}, dns_file: ${adb_dnsfile}, dns_user: ${adb_dnsuser}, dns_instance: ${adb_dnsinstance}, backup: ${adb_backup}, backup_dir: ${adb_backupdir}, jail_dir: ${adb_jaildir}" +} + +# load fetch utility +# +f_fetch() { + local util utils insecure cnt="0" + + if [ -z "${adb_fetchutil}" ]; then + utils="aria2c curl wget uclient-fetch" + for util in ${utils}; do + if { [ "${util}" = "uclient-fetch" ] && printf "%s" "${adb_packages}" | grep -q "^libustream-"; } || + { [ "${util}" = "wget" ] && printf "%s" "${adb_packages}" | grep -q "^wget -"; } || + [ "${util}" = "curl" ] || [ "${util}" = "aria2c" ]; then + if [ -x "$(command -v "${util}")" ]; then + adb_fetchutil="${util}" + uci_set adblock global adb_fetchutil "${util}" + f_uci "adblock" + break + fi + fi + done + elif [ ! -x "$(command -v "${adb_fetchutil}")" ]; then + unset adb_fetchutil + fi + case "${adb_fetchutil}" in + "aria2c") + [ "${adb_fetchinsecure}" = "1" ] && insecure="--check-certificate=false" + adb_fetchparm="${adb_fetchparm:-"${insecure} --timeout=20 --allow-overwrite=true --auto-file-renaming=false --log-level=warn --dir=/ -o"}" + ;; + "curl") + [ "${adb_fetchinsecure}" = "1" ] && insecure="--insecure" + adb_fetchparm="${adb_fetchparm:-"${insecure} --connect-timeout 20 --fail --silent --show-error --location -o"}" + ;; + "uclient-fetch") + [ "${adb_fetchinsecure}" = "1" ] && insecure="--no-check-certificate" + adb_fetchparm="${adb_fetchparm:-"${insecure} --timeout=20 -O"}" + ;; + "wget") + [ "${adb_fetchinsecure}" = "1" ] && insecure="--no-check-certificate" + adb_fetchparm="${adb_fetchparm:-"${insecure} --no-cache --no-cookies --max-redirect=0 --timeout=20 -O"}" + ;; + esac + if [ -n "${adb_fetchutil}" ] && [ -n "${adb_fetchparm}" ]; then + adb_fetchutil="$(command -v "${adb_fetchutil}")" + else + f_log "err" "download utility with SSL support not found, please install 'uclient-fetch' with a 'libustream-*' variant or another download utility like 'wget', 'curl' or 'aria2'" + fi + f_log "debug" "f_fetch ::: fetch_util: ${adb_fetchutil:-"-"}, fetch_parm: ${adb_fetchparm:-"-"}" +} + +# create temporary files, directories and set dependent options +# +f_temp() { + if [ -d "${adb_tmpbase}" ]; then + adb_tmpdir="$(mktemp -p "${adb_tmpbase}" -d)" + adb_tmpload="$(mktemp -p "${adb_tmpdir}" -tu)" + adb_tmpfile="$(mktemp -p "${adb_tmpdir}" -tu)" + adb_srtopts="--temporary-directory=${adb_tmpdir} --compress-program=gzip --parallel=${adb_cores}" + else + f_log "err" "the temp base directory '${adb_tmpbase}' does not exist/is not mounted yet, please create the directory or raise the 'adb_triggerdelay' to defer the adblock start" + fi + [ ! -s "${adb_pidfile}" ] && printf "%s" "${$}" >"${adb_pidfile}" + f_log "debug" "f_temp ::: tmp_base: ${adb_tmpbase:-"-"}, tmp_dir: ${adb_tmpdir:-"-"}, sort_options: ${adb_srtopts}, pid_file: ${adb_pidfile:-"-"}" +} + +# remove temporary files and directories +# +f_rmtemp() { + [ -d "${adb_tmpdir}" ] && rm -rf "${adb_tmpdir}" + rm -f "${adb_srcfile}" + : >"${adb_pidfile}" + f_log "debug" "f_rmtemp ::: tmp_dir: ${adb_tmpdir:-"-"}, src_file: ${adb_srcfile:-"-"}, pid_file: ${adb_pidfile:-"-"}" +} + +# remove dns related files +# +f_rmdns() { + local status + + status="$(ubus -S call service list '{"name":"adblock"}' 2>/dev/null | jsonfilter -l1 -e '@["adblock"].instances.*.running' 2>/dev/null)" + if [ "${adb_dns}" = "raw" ] || { [ -n "${adb_dns}" ] && [ -n "${status}" ]; }; then + : >"${adb_rtfile}" + [ "${adb_backup}" = "1" ] && rm -f "${adb_backupdir}/${adb_dnsprefix}".*.gz + printf "%b" "${adb_dnsheader}" >"${adb_dnsdir}/${adb_dnsfile}" + f_dnsup 4 + fi + f_rmtemp + f_log "debug" "f_rmdns ::: dns: ${adb_dns}, status: ${status:-"-"}, dns_dir: ${adb_dnsdir}, dns_file: ${adb_dnsfile}, rt_file: ${adb_rtfile}, backup_dir: ${adb_backupdir:-"-"}" +} + +# commit uci changes +# +f_uci() { + local change config="${1}" + + if [ -n "${config}" ]; then + change="$(uci -q changes "${config}" | "${adb_awk}" '{ORS=" "; print $0}')" + if [ -n "${change}" ]; then + uci_commit "${config}" + case "${config}" in + "firewall") + "/etc/init.d/firewall" reload >/dev/null 2>&1 + ;; + "resolver") + printf "%b" "${adb_dnsheader}" >"${adb_dnsdir}/${adb_dnsfile}" + f_count + f_jsnup "running" + "/etc/init.d/${adb_dns}" reload >/dev/null 2>&1 + ;; + esac + fi + f_log "debug" "f_uci ::: config: ${config}, change: ${change}" + fi +} + +# get list counter +# +f_count() { + local file mode="${1}" name="${2}" + + adb_cnt="0" + case "${mode}" in + "iplist") + [ -s "${adb_tmpdir}/tmp.add.${name}" ] && adb_cnt="$(wc -l 2>/dev/null <"${adb_tmpdir}/tmp.add.${name}")" + ;; + "blacklist") + [ -s "${adb_tmpfile}.${name}" ] && adb_cnt="$(wc -l 2>/dev/null <"${adb_tmpfile}.${name}")" + ;; + "whitelist") + [ -s "${adb_tmpdir}/tmp.raw.${name}" ] && { adb_cnt="$(wc -l 2>/dev/null <"${adb_tmpdir}/tmp.raw.${name}")"; rm -f "${adb_tmpdir}/tmp.raw.${name}"; } + ;; + "safesearch") + [ -s "${adb_tmpdir}/tmp.safesearch.${name}" ] && adb_cnt="$(wc -l 2>/dev/null <"${adb_tmpdir}/tmp.safesearch.${name}")" + ;; + "merge") + [ -s "${adb_tmpdir}/${adb_dnsfile}" ] && adb_cnt="$(wc -l 2>/dev/null <"${adb_tmpdir}/${adb_dnsfile}")" + ;; + "download" | "backup" | "restore") + [ -s "${src_tmpfile}" ] && adb_cnt="$(wc -l 2>/dev/null <"${src_tmpfile}")" + ;; + "final") + if [ -s "${adb_dnsdir}/${adb_dnsfile}" ]; then + adb_cnt="$(wc -l 2>/dev/null <"${adb_dnsdir}/${adb_dnsfile}")" + if [ -s "${adb_tmpdir}/tmp.add.whitelist" ]; then + adb_cnt="$((adb_cnt - $(wc -l 2>/dev/null <"${adb_tmpdir}/tmp.add.whitelist")))" + fi + for file in "${adb_tmpdir}/tmp.safesearch".*; do + if [ -r "${file}" ]; then + adb_cnt="$((adb_cnt - $(wc -l 2>/dev/null <"${file}")))" + fi + done + [ -n "${adb_dnsheader}" ] && adb_cnt="$(((adb_cnt - $(printf "%b" "${adb_dnsheader}" | grep -c "^")) / 2))" + fi + ;; + esac +} + +# set external config options +# +f_extconf() { + local config config_dir config_file section zone port fwcfg + + case "${adb_dns}" in + "dnsmasq") + config="dhcp" + config_dir="$(uci_get dhcp "@dnsmasq[${adb_dnsinstance}]" confdir | grep -Fo "${adb_dnsdir}")" + if [ "${adb_enabled}" = "1" ] && [ -z "${config_dir}" ]; then + uci_set dhcp "@dnsmasq[${adb_dnsinstance}]" confdir "${adb_dnsdir}" 2>/dev/null + fi + ;; + "kresd") + config="resolver" + config_file="$(uci_get resolver kresd rpz_file | grep -Fo "${adb_dnsdir}/${adb_dnsfile}")" + if [ "${adb_enabled}" = "1" ] && [ -z "${config_file}" ]; then + uci -q add_list resolver.kresd.rpz_file="${adb_dnsdir}/${adb_dnsfile}" + elif [ "${adb_enabled}" = "0" ] && [ -n "${config_file}" ]; then + uci -q del_list resolver.kresd.rpz_file="${adb_dnsdir}/${adb_dnsfile}" + fi + ;; + esac + f_uci "${config}" + + config="firewall" + fwcfg="$(uci -qNX show "${config}" | "${adb_awk}" 'BEGIN{FS="[.=]"};/adblock_/{if(zone==$2){next}else{ORS=" ";zone=$2;print zone}}')" + if [ "${adb_enabled}" = "1" ] && [ "${adb_forcedns}" = "1" ] && + /etc/init.d/firewall enabled; then + for zone in ${adb_zonelist}; do + for port in ${adb_portlist}; do + if ! printf "%s" "${fwcfg}" | grep -q "adblock_${zone}${port}[ |\$]"; then + uci -q batch <<-EOC + set firewall."adblock_${zone}${port}"="redirect" + set firewall."adblock_${zone}${port}".name="Adblock DNS (${zone}, ${port})" + set firewall."adblock_${zone}${port}".src="${zone}" + set firewall."adblock_${zone}${port}".proto="tcp udp" + set firewall."adblock_${zone}${port}".src_dport="${port}" + set firewall."adblock_${zone}${port}".dest_port="${port}" + set firewall."adblock_${zone}${port}".target="DNAT" + set firewall."adblock_${zone}${port}".family="any" + EOC + fi + fwcfg="${fwcfg/adblock_${zone}${port}[ |\$]/}" + done + done + fwcfg="${fwcfg#"${fwcfg%%[![:space:]]*}"}" + fwcfg="${fwcfg%"${fwcfg##*[![:space:]]}"}" + fi + if [ "${adb_enabled}" = "0" ] || [ "${adb_forcedns}" = "0" ] || [ -n "${fwcfg}" ]; then + for section in ${fwcfg}; do + uci_remove firewall "${section}" + done + fi + f_uci "${config}" +} + +# restart dns backend +# +f_dnsup() { + local rset dns_service dns_up dns_pid restart_rc cnt="0" out_rc="4" in_rc="${1:-0}" + + if [ "${adb_dns}" = "raw" ]; then + out_rc="0" + else + if [ "${in_rc}" = "0" ] && [ "${adb_dnsflush}" = "0" ]; then + case "${adb_dns}" in + "unbound") + if [ -x "${adb_dnscachecmd}" ] && [ -d "${adb_tmpdir}" ] && [ -f "${adb_dnsdir}/unbound.conf" ]; then + "${adb_dnscachecmd}" -c "${adb_dnsdir}/unbound.conf" dump_cache >"${adb_tmpdir}/adb_cache.dump" 2>/dev/null + fi + "/etc/init.d/${adb_dns}" restart >/dev/null 2>&1 + restart_rc="${?}" + ;; + "named") + if [ -x "${adb_dnscachecmd}" ] && [ -f "/etc/bind/rndc.conf" ]; then + "${adb_dnscachecmd}" -c "/etc/bind/rndc.conf" reload >/dev/null 2>&1 + restart_rc="${?}" + fi + if [ -z "${restart_rc}" ] || { [ -n "${restart_rc}" ] && [ "${restart_rc}" != "0" ]; }; then + "/etc/init.d/${adb_dns}" restart >/dev/null 2>&1 + restart_rc="${?}" + fi + ;; + *) + "/etc/init.d/${adb_dns}" restart >/dev/null 2>&1 + restart_rc="${?}" + ;; + esac + fi + if [ -z "${restart_rc}" ]; then + "/etc/init.d/${adb_dns}" restart >/dev/null 2>&1 + restart_rc="${?}" + fi + fi + if [ "${restart_rc}" = "0" ]; then + rset="/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower(\$1)}" + while [ "${cnt}" -le "${adb_dnstimeout}" ]; do + dns_service="$(ubus -S call service list "{\"name\":\"${adb_dns}\"}")" + dns_up="$(printf "%s" "${dns_service}" | jsonfilter -l1 -e "@[\"${adb_dns}\"].instances.*.running")" + dns_pid="$(printf "%s" "${dns_service}" | jsonfilter -l1 -e "@[\"${adb_dns}\"].instances.*.pid")" + if [ "${dns_up}" = "true" ] && [ -n "${dns_pid}" ] && ! ls "/proc/${dns_pid}/fd/${adb_dnsdir}/${adb_dnsfile}" >/dev/null 2>&1; then + if [ -x "${adb_lookupcmd}" ] && [ -n "$(printf "%s" "${adb_lookupdomain}" | "${adb_awk}" "${rset}")" ]; then + if "${adb_lookupcmd}" "${adb_lookupdomain}" >/dev/null 2>&1; then + out_rc="0" + break + fi + else + sleep ${adb_dnstimeout} + cnt=${adb_dnstimeout} + out_rc="0" + break + fi + fi + cnt="$((cnt + 1))" + sleep 1 + done + if [ "${out_rc}" = "0" ] && [ "${adb_dns}" = "unbound" ]; then + if [ -x "${adb_dnscachecmd}" ] && [ -d "${adb_tmpdir}" ] && [ -s "${adb_tmpdir}/adb_cache.dump" ]; then + "${adb_dnscachecmd}" -c "${adb_dnsdir}/unbound.conf" load_cache <"${adb_tmpdir}/adb_cache.dump" >/dev/null 2>&1 + restart_rc="${?}" + fi + fi + fi + f_log "debug" "f_dnsup ::: dns: ${adb_dns}, cache_cmd: ${adb_dnscachecmd:-"-"}, lookup_cmd: ${adb_lookupcmd:-"-"}, lookup_domain: ${adb_lookupdomain:-"-"}, restart_rc: ${restart_rc:-"-"}, dns_flush: ${adb_dnsflush}, dns_timeout: ${adb_dnstimeout}, dns_cnt: ${cnt}, in_rc: ${in_rc}, out_rc: ${out_rc}" + return "${out_rc}" +} + +# backup/restore/remove blocklists +# +f_list() { + local hold file rset item array safe_url safe_ips safe_cname safe_domains ip out_rc mode="${1}" src_name="${2:-"${src_name}"}" in_rc="${src_rc:-0}" cnt ffiles="-maxdepth 1 -name ${adb_dnsprefix}.*.gz" + + case "${mode}" in + "iplist") + src_name="${mode}" + if [ "${adb_dns}" = "named" ]; then + rset="BEGIN{FS=\"[.:]\";pfx=\"32\"}{if(match(\$0,/:/))pfx=\"128\"}{printf \"%s.\",pfx;for(seg=NF;seg>=1;seg--)if(seg==1)printf \"%s\n\",\$seg;else if(\$seg>=0)printf \"%s.\",\$seg; else printf \"%s.\",\"zz\"}" + if [ -n "${adb_allowip}" ]; then + : >"${adb_tmpdir}/tmp.raw.${src_name}" + for ip in ${adb_allowip}; do + printf "%s" "${ip}" | "${adb_awk}" "${rset}" >>"${adb_tmpdir}/tmp.raw.${src_name}" + done + eval "${adb_dnsallowip}" "${adb_tmpdir}/tmp.raw.${src_name}" >"${adb_tmpdir}/tmp.add.${src_name}" + out_rc="${?}" + fi + if [ -n "${adb_denyip}" ] && { [ -z "${out_rc}" ] || [ "${out_rc}" = "0" ]; }; then + : >"${adb_tmpdir}/tmp.raw.${src_name}" + for ip in ${adb_denyip}; do + printf "%s" "${ip}" | "${adb_awk}" "${rset}" >>"${adb_tmpdir}/tmp.raw.${src_name}" + done + eval "${adb_dnsdenyip}" "${adb_tmpdir}/tmp.raw.${src_name}" >>"${adb_tmpdir}/tmp.add.${src_name}" + out_rc="${?}" + fi + rm -f "${adb_tmpdir}/tmp.raw.${src_name}" + fi + ;; + "blacklist" | "whitelist") + src_name="${mode}" + if [ "${src_name}" = "blacklist" ] && [ -f "${adb_blacklist}" ]; then + rset="/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower(\$1)}" + "${adb_awk}" "${rset}" "${adb_blacklist}" >"${adb_tmpdir}/tmp.raw.${src_name}" + if [ -s "${adb_whitelist}" ]; then + "${adb_awk}" 'NR==FNR{member[$1];next}!($1 in member)' "${adb_whitelist}" "${adb_tmpdir}/tmp.raw.${src_name}" >"${adb_tmpdir}/tmp.deduplicate.${src_name}" + else + cat "${adb_tmpdir}/tmp.raw.${src_name}" >"${adb_tmpdir}/tmp.deduplicate.${src_name}" + fi + "${adb_awk}" 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' "${adb_tmpdir}/tmp.deduplicate.${src_name}" >"${adb_tmpdir}/tmp.raw.${src_name}" + "${adb_sort}" ${adb_srtopts} -u "${adb_tmpdir}/tmp.raw.${src_name}" 2>/dev/null >"${adb_tmpfile}.${src_name}" + out_rc="${?}" + rm -f "${adb_tmpdir}/tmp.raw.${src_name}" + elif [ "${src_name}" = "whitelist" ] && [ -f "${adb_whitelist}" ]; then + rset="/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower(\$1)}" + printf "%s\n" "${adb_lookupdomain}" | "${adb_awk}" "${rset}" >"${adb_tmpdir}/tmp.raw.${src_name}" + "${adb_awk}" "${rset}" "${adb_whitelist}" >>"${adb_tmpdir}/tmp.raw.${src_name}" + out_rc="${?}" + if [ "${out_rc}" = "0" ]; then + rset="/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{gsub(\"\\\\.\",\"\\\\.\",\$1);print tolower(\"^(|.*\\\\.)\"\$1\"$\")}" + "${adb_awk}" "${rset}" "${adb_tmpdir}/tmp.raw.${src_name}" >"${adb_tmpdir}/tmp.rem.${src_name}" + out_rc="${?}" + if [ "${out_rc}" = "0" ] && [ "${adb_dnsallow}" != "1" ]; then + eval "${adb_dnsallow}" "${adb_tmpdir}/tmp.raw.${src_name}" >"${adb_tmpdir}/tmp.add.${src_name}" + out_rc="${?}" + if [ "${out_rc}" = "0" ] && [ "${adb_jail}" = "1" ] && [ "${adb_dnsstop}" != "0" ]; then + : >"${adb_jaildir}/${adb_dnsjail}" + [ -n "${adb_dnsheader}" ] && printf "%b" "${adb_dnsheader}" >>"${adb_jaildir}/${adb_dnsjail}" + cat "${adb_tmpdir}/tmp.add.${src_name}" >>"${adb_jaildir}/${adb_dnsjail}" + printf "%s\n" "${adb_dnsstop}" >>"${adb_jaildir}/${adb_dnsjail}" + fi + fi + fi + fi + ;; + "safesearch") + case "${src_name}" in + "google") + rset="/^\\.([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{printf \"%s\n%s\n\",tolower(\"www\"\$1),tolower(substr(\$1,2,length(\$1)))}" + safe_url="https://www.google.com/supported_domains" + safe_cname="forcesafesearch.google.com" + safe_domains="${adb_tmpdir}/tmp.load.safesearch.${src_name}" + if [ "${adb_backup}" = "1" ] && [ -s "${adb_backupdir}/safesearch.${src_name}.gz" ]; then + zcat "${adb_backupdir}/safesearch.${src_name}.gz" >"${safe_domains}" + out_rc="${?}" + else + "${adb_fetchutil}" ${adb_fetchparm} "${safe_domains}" "${safe_url}" 2>/dev/null + out_rc="${?}" + if [ "${adb_backup}" = "1" ] && [ "${out_rc}" = "0" ]; then + gzip -cf "${safe_domains}" >"${adb_backupdir}/safesearch.${src_name}.gz" + out_rc="${?}" + fi + fi + if [ "${out_rc}" = "0" ]; then + if [ -x "${adb_lookupcmd}" ]; then + safe_ips="$("${adb_lookupcmd}" "${safe_cname}" 2>/dev/null | "${adb_awk}" '/^Address[ 0-9]*: /{ORS=" ";print $NF}')" + [ -n "${safe_ips}" ] && "${adb_awk}" "${rset}" "${safe_domains}" >"${adb_tmpdir}/tmp.raw.safesearch.${src_name}" + fi + out_rc="${?}" + fi + ;; + "bing") + safe_cname="strict.bing.com" + safe_domains="www.bing.com" + if [ -x "${adb_lookupcmd}" ]; then + safe_ips="$("${adb_lookupcmd}" "${safe_cname}" 2>/dev/null | "${adb_awk}" '/^Address[ 0-9]*: /{ORS=" ";print $NF}')" + [ -n "${safe_ips}" ] && printf "%s\n" ${safe_domains} >"${adb_tmpdir}/tmp.raw.safesearch.${src_name}" + fi + out_rc="${?}" + ;; + "duckduckgo") + safe_cname="safe.duckduckgo.com" + safe_domains="duckduckgo.com" + if [ -x "${adb_lookupcmd}" ]; then + safe_ips="$("${adb_lookupcmd}" "${safe_cname}" 2>/dev/null | "${adb_awk}" '/^Address[ 0-9]*: /{ORS=" ";print $NF}')" + [ -n "${safe_ips}" ] && printf "%s\n" ${safe_domains} >"${adb_tmpdir}/tmp.raw.safesearch.${src_name}" + fi + out_rc="${?}" + ;; + "pixabay") + safe_cname="safesearch.pixabay.com" + safe_domains="pixabay.com" + if [ -x "${adb_lookupcmd}" ]; then + safe_ips="$("${adb_lookupcmd}" "${safe_cname}" 2>/dev/null | "${adb_awk}" '/^Address[ 0-9]*: /{ORS=" ";print $NF}')" + [ -n "${safe_ips}" ] && printf "%s\n" ${safe_domains} >"${adb_tmpdir}/tmp.raw.safesearch.${src_name}" + fi + out_rc="${?}" + ;; + "yandex") + safe_cname="familysearch.yandex.ru" + safe_domains="ya.ru yandex.ru yandex.com yandex.com.tr yandex.ua yandex.by yandex.ee yandex.lt yandex.lv yandex.md yandex.uz yandex.tm yandex.tj yandex.az yandex.kz" + if [ -x "${adb_lookupcmd}" ]; then + safe_ips="$("${adb_lookupcmd}" "${safe_cname}" 2>/dev/null | "${adb_awk}" '/^Address[ 0-9]*: /{ORS=" ";print $NF}')" + [ -n "${safe_ips}" ] && printf "%s\n" ${safe_domains} >"${adb_tmpdir}/tmp.raw.safesearch.${src_name}" + fi + out_rc="${?}" + ;; + "youtube") + if [ "${adb_safesearchmod}" = "0" ]; then + safe_cname="restrict.youtube.com" + else + safe_cname="restrictmoderate.youtube.com" + fi + safe_domains="www.youtube.com m.youtube.com youtubei.googleapis.com youtube.googleapis.com www.youtube-nocookie.com" + if [ -x "${adb_lookupcmd}" ]; then + safe_ips="$("${adb_lookupcmd}" "${safe_cname}" 2>/dev/null | "${adb_awk}" '/^Address[ 0-9]*: /{ORS=" ";print $NF}')" + [ -n "${safe_ips}" ] && printf "%s\n" ${safe_domains} >"${adb_tmpdir}/tmp.raw.safesearch.${src_name}" + fi + out_rc="${?}" + ;; + esac + if [ "${out_rc}" = "0" ] && [ -s "${adb_tmpdir}/tmp.raw.safesearch.${src_name}" ]; then + : >"${adb_tmpdir}/tmp.safesearch.${src_name}" + [ "${adb_dns}" = "named" ] && array="${safe_cname}" || array="${safe_ips}" + for item in ${array}; do + if ! eval "${adb_dnssafesearch}" "${adb_tmpdir}/tmp.raw.safesearch.${src_name}" >>"${adb_tmpdir}/tmp.safesearch.${src_name}"; then + rm -f "${adb_tmpdir}/tmp.safesearch.${src_name}" + break + fi + done + out_rc="${?}" + rm -f "${adb_tmpdir}/tmp.raw.safesearch.${src_name}" + fi + ;; + "backup") + ( + gzip -cf "${src_tmpfile}" >"${adb_backupdir}/${adb_dnsprefix}.${src_name}.gz" + out_rc="${?}" + ) & + ;; + "restore") + if [ -n "${src_name}" ] && [ -s "${adb_backupdir}/${adb_dnsprefix}.${src_name}.gz" ]; then + zcat "${adb_backupdir}/${adb_dnsprefix}.${src_name}.gz" >"${src_tmpfile}" + out_rc="${?}" + elif [ -z "${src_name}" ]; then + cnt="1" + for file in "${adb_backupdir}/${adb_dnsprefix}".*.gz; do + if [ -r "${file}" ]; then + name="${file##*/}" + name="${name%.*}" + zcat "${file}" >"${adb_tmpfile}.${name}" & + hold="$((cnt % adb_cores))" + if [ "${hold}" = "0" ]; then + wait + fi + cnt="$((cnt + 1))" + fi + done + wait + out_rc="${?}" + else + out_rc=4 + fi + if [ "${adb_action}" != "start" ] && [ "${adb_action}" != "resume" ] && [ -n "${src_name}" ] && [ "${out_rc}" != "0" ]; then + adb_sources="${adb_sources/${src_name}}" + fi + ;; + "remove") + [ "${adb_backup}" = "1" ] && rm "${adb_backupdir}/${adb_dnsprefix}.${src_name}.gz" 2>/dev/null + out_rc="${?}" + adb_sources="${adb_sources/${src_name}}" + ;; + "merge") + if [ "${adb_backup}" = "1" ]; then + for src_name in ${adb_sources}; do + ffiles="${ffiles} -a ! -name ${adb_dnsprefix}.${src_name}.gz" + done + if [ "${adb_safesearch}" = "1" ] && [ "${adb_dnssafesearch}" != "0" ]; then + ffiles="${ffiles} -a ! -name safesearch.google.gz" + fi + find "${adb_backupdir}" ${ffiles} -print0 2>/dev/null | xargs -0 rm 2>/dev/null + fi + unset src_name + "${adb_sort}" ${adb_srtopts} -mu "${adb_tmpfile}".* 2>/dev/null >"${adb_tmpdir}/${adb_dnsfile}" + out_rc="${?}" + rm -f "${adb_tmpfile}".* + ;; + "final") + unset src_name + { [ -n "${adb_dnsheader}" ] && printf "%b" "${adb_dnsheader}" >"${adb_dnsdir}/${adb_dnsfile}"; } || : >"${adb_dnsdir}/${adb_dnsfile}" + [ -s "${adb_tmpdir}/tmp.add.iplist" ] && cat "${adb_tmpdir}/tmp.add.iplist" >>"${adb_dnsdir}/${adb_dnsfile}" + [ -s "${adb_tmpdir}/tmp.add.whitelist" ] && cat "${adb_tmpdir}/tmp.add.whitelist" >>"${adb_dnsdir}/${adb_dnsfile}" + for file in "${adb_tmpdir}/tmp.safesearch".*; do + [ -r "${file}" ] && cat "${file}" >>"${adb_dnsdir}/${adb_dnsfile}" + done + { [ "${adb_dnsdeny}" != "0" ] && eval "${adb_dnsdeny}" "${adb_tmpdir}/${adb_dnsfile}" >>"${adb_dnsdir}/${adb_dnsfile}"; } || mv "${adb_tmpdir}/${adb_dnsfile}" "${adb_dnsdir}/${adb_dnsfile}" + out_rc="${?}" + ;; + esac + f_count "${mode}" "${src_name}" + out_rc="${out_rc:-"${in_rc}"}" + f_log "debug" "f_list ::: name: ${src_name:-"-"}, mode: ${mode}, cnt: ${adb_cnt}, in_rc: ${in_rc}, out_rc: ${out_rc}" + return "${out_rc}" +} + +# top level domain compression +# +f_tld() { + local cnt cnt_tld source="${1}" temp_tld="${1}.tld" + + if "${adb_awk}" '{if(NR==1){tld=$NF};while(getline){if(index($NF,tld".")==0){print tld;tld=$NF}}print tld}' "${source}" | + "${adb_awk}" 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' >"${temp_tld}"; then + mv -f "${temp_tld}" "${source}" + cnt_tld="$(wc -l 2>/dev/null <"${source}")" + else + rm -f "${temp_tld}" + fi + f_log "debug" "f_tld ::: source: ${source}, cnt: ${adb_cnt:-"-"}, cnt_tld: ${cnt_tld:-"-"}" +} + +# suspend/resume adblock processing +# +f_switch() { + local status entry done="false" mode="${1}" + + json_init + json_load_file "${adb_rtfile}" >/dev/null 2>&1 + json_select "data" >/dev/null 2>&1 + json_get_var status "adblock_status" + if [ "${mode}" = "suspend" ] && [ "${status}" = "enabled" ]; then + f_env + printf "%b" "${adb_dnsheader}" >"${adb_dnsdir}/${adb_dnsfile}" + if [ "${adb_jail}" = "1" ] && [ "${adb_jaildir}" = "${adb_dnsdir}" ]; then + printf "%b" "${adb_dnsheader}" >"${adb_jaildir}/${adb_dnsjail}" + elif [ -f "${adb_dnsdir}/${adb_dnsjail}" ]; then + rm -f "${adb_dnsdir}/${adb_dnsjail}" + fi + f_count + done="true" + elif [ "${mode}" = "resume" ] && [ "${status}" = "paused" ]; then + f_env + f_main + done="true" + fi + if [ "${done}" = "true" ]; then + [ "${mode}" = "suspend" ] && f_dnsup + f_jsnup "${mode}" + f_log "info" "${mode} adblock processing" + fi + f_rmtemp +} + +# query blocklist for certain (sub-)domains +# +f_query() { + local search result prefix suffix field query_start query_end query_timeout=30 domain="${1}" tld="${1#*.}" + + if [ -z "${domain}" ] || [ "${domain}" = "${tld}" ]; then + printf "%s\n" "::: invalid input, please submit a single (sub-)domain :::" + else + case "${adb_dns}" in + "dnsmasq") + prefix=".*[\\/\\.]" + suffix="(\\/)" + field="2" + ;; + "unbound") + prefix=".*[\"\\.]" + suffix="(always_nxdomain)" + field="3" + ;; + "named") + prefix="[^\\*].*[\\.]" + suffix="( \\.)" + field="1" + ;; + "kresd") + prefix="[^\\*].*[\\.]" + suffix="( \\.)" + field="1" + ;; + "raw") + prefix=".*[\\.]" + suffix="" + field="1" + ;; + esac + query_start="$(date "+%s")" + while [ "${domain}" != "${tld}" ]; do + search="${domain//[+*~%\$&\"\']/}" + search="${search//./\\.}" + result="$("${adb_awk}" -F '/|\"|\t| ' "/^(${search}|${prefix}+${search}.*${suffix})$/{i++;if(i<=9){printf \" + %s\n\",\$${field}}else if(i==10){printf \" + %s\n\",\"[...]\";exit}}" "${adb_dnsdir}/${adb_dnsfile}")" + printf "%s\n%s\n%s\n" ":::" "::: domain '${domain}' in active blocklist" ":::" + printf "%s\n\n" "${result:-" - no match"}" + domain="${tld}" + tld="${domain#*.}" + done + if [ "${adb_backup}" = "1" ] && [ -d "${adb_backupdir}" ]; then + search="${1//[+*~%\$&\"\']/}" + search="${search//./\\.}" + printf "%s\n%s\n%s\n" ":::" "::: domain '${1}' in backups and black-/whitelist" ":::" + for file in "${adb_backupdir}/${adb_dnsprefix}".*.gz "${adb_blacklist}" "${adb_whitelist}"; do + suffix="${file##*.}" + if [ "${suffix}" = "gz" ]; then + zcat "${file}" 2>/dev/null | + "${adb_awk}" 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' | "${adb_awk}" -v f="${file##*/}" "BEGIN{rc=1};/^($search|.*\\.${search})$/{i++;if(i<=3){printf \" + %-30s%s\n\",f,\$1;rc=0}else if(i==4){printf \" + %-30s%s\n\",f,\"[...]\"}};END{exit rc}" + else + "${adb_awk}" -v f="${file##*/}" "BEGIN{rc=1};/^($search|.*\\.${search})$/{i++;if(i<=3){printf \" + %-30s%s\n\",f,\$1;rc=0}else if(i==4){printf \" + %-30s%s\n\",f,\"[...]\"}};END{exit rc}" "${file}" + fi + if [ "${?}" = "0" ]; then + result="true" + query_end="$(date "+%s")" + if [ "$((query_end - query_start))" -gt "${query_timeout}" ]; then + printf "%s\n\n" " - [...]" + break + fi + fi + done + [ "${result}" != "true" ] && printf "%s\n\n" " - no match" + fi + fi +} + +# update runtime information +# +f_jsnup() { + local entry sources runtime utils bg_pid status="${1:-"enabled"}" + + adb_memory="$("${adb_awk}" '/^MemTotal|^MemFree|^MemAvailable/{ORS="/"; print int($2/1000)}' "/proc/meminfo" 2>/dev/null | + "${adb_awk}" '{print substr($0,1,length($0)-1)}')" + + case "${status}" in + "enabled" | "error") + adb_endtime="$(date "+%s")" + if [ "$(((adb_endtime - adb_starttime) / 60))" -lt 60 ]; then + runtime="${adb_action}, $(((adb_endtime - adb_starttime) / 60))m $(((adb_endtime - adb_starttime) % 60))s, ${adb_memory:-0}, $(date -Iseconds)" + else + runtime="${adb_action}, n/a, ${adb_memory:-0}, $(date -Iseconds)" + fi + [ "${status}" = "error" ] && adb_cnt="0" + ;; + "suspend") + status="paused" + ;; + "resume") + status="" + ;; + esac + json_init + if json_load_file "${adb_rtfile}" >/dev/null 2>&1; then + utils="download: $(readlink -fn "${adb_fetchutil}"), sort: $(readlink -fn "${adb_sort}"), awk: $(readlink -fn "${adb_awk}")" + [ -z "${adb_cnt}" ] && { json_get_var adb_cnt "blocked_domains"; adb_cnt="${adb_cnt%% *}"; } + [ -z "${runtime}" ] && json_get_var runtime "last_run" + fi + if [ "${adb_jail}" = "1" ] && [ "${adb_jaildir}" = "${adb_dnsdir}" ]; then + adb_cnt="0" + sources="restrictive_jail" + else + sources="$(printf "%s\n" ${adb_sources} | "${adb_sort}" | "${adb_awk}" '{ORS=" ";print $0}')" + fi + + : >"${adb_rtfile}" + json_init + json_load_file "${adb_rtfile}" >/dev/null 2>&1 + json_init + json_add_string "adblock_status" "${status:-"enabled"}" + json_add_string "adblock_version" "${adb_ver}" + json_add_string "blocked_domains" "${adb_cnt:-0}" + json_add_array "active_sources" + for entry in ${sources}; do + json_add_object + json_add_string "source" "${entry}" + json_close_object + done + json_close_array + json_add_string "dns_backend" "${adb_dns:-"-"} (${adb_dnscachecmd##*/}), ${adb_dnsdir:-"-"}" + json_add_string "run_utils" "${utils:-"-"}" + json_add_string "run_ifaces" "trigger: ${adb_trigger:-"-"}, report: ${adb_repiface:-"-"}" + json_add_string "run_directories" "base: ${adb_tmpbase}, backup: ${adb_backupdir}, report: ${adb_reportdir}, jail: ${adb_jaildir}" + json_add_string "run_flags" "backup: $(f_char ${adb_backup}), flush: $(f_char ${adb_dnsflush}), force: $(f_char ${adb_forcedns}), search: $(f_char ${adb_safesearch}), report: $(f_char ${adb_report}), mail: $(f_char ${adb_mail}), jail: $(f_char ${adb_jail})" + json_add_string "last_run" "${runtime:-"-"}" + json_add_string "system" "${adb_sysver}" + json_dump >"${adb_rtfile}" + + if [ "${adb_mail}" = "1" ] && [ -x "${adb_mailservice}" ] && + { [ "${status}" = "error" ] || { [ "${status}" = "enabled" ] && [ "${adb_cnt}" -le "${adb_mailcnt}" ]; }; }; then + ("${adb_mailservice}" "${adb_ver}" >/dev/null 2>&1) & + bg_pid="${!}" + fi + f_log "debug" "f_jsnup ::: status: ${status:-"-"}, cnt: ${adb_cnt}, mail: ${adb_mail}, mail_service: ${adb_mailservice}, mail_cnt: ${adb_mailcnt}, mail_pid: ${bg_pid:-"-"}" +} + +# write to syslog +# +f_log() { + local class="${1}" log_msg="${2}" + + if [ -n "${log_msg}" ] && { [ "${class}" != "debug" ] || [ "${adb_debug}" = "1" ]; }; then + [ -x "${adb_loggercmd}" ] && "${adb_loggercmd}" -p "${class}" -t "adblock-${adb_ver}[${$}]" "${log_msg}" || \ + printf "%s %s %s\n" "${class}" "adblock-${adb_ver}[${$}]" "${log_msg}" + if [ "${class}" = "err" ]; then + f_rmdns + f_jsnup "error" + exit 1 + fi + fi +} + +# main function for blocklist processing +# +f_main() { + local src_tmpload src_tmpfile src_name src_rset src_url src_log src_arc src_cat src_item src_list src_entries src_suffix src_rc entry cnt + + f_log "debug" "f_main ::: memory: ${adb_memory:-0}, cores: ${adb_cores}, safe_search: ${adb_safesearch}, force_dns: ${adb_forcedns}, awk: ${adb_awk}" + + # white- and blacklist preparation + # + for entry in ${adb_locallist}; do + (f_list "${entry}" "${entry}") & + done + + if [ "${adb_dns}" != "raw" ] && [ "${adb_jail}" = "1" ] && [ "${adb_jaildir}" = "${adb_dnsdir}" ]; then + printf "%b" "${adb_dnsheader}" >"${adb_dnsdir}/${adb_dnsfile}" + chown "${adb_dnsuser}" "${adb_jaildir}/${adb_dnsjail}" 2>/dev/null + if f_dnsup; then + if [ "${adb_action}" != "resume" ]; then + f_jsnup "enabled" + fi + f_log "info" "restrictive jail mode enabled successfully (${adb_sysver})" + else + f_log "err" "dns backend restart in jail mode failed" + fi + f_rmtemp + return + elif [ -f "${adb_dnsdir}/${adb_dnsjail}" ]; then + rm -f "${adb_dnsdir}/${adb_dnsjail}" + f_dnsup + fi + + # safe search preparation + # + if [ "${adb_safesearch}" = "1" ] && [ "${adb_dnssafesearch}" != "0" ]; then + [ -z "${adb_safesearchlist}" ] && adb_safesearchlist="google bing duckduckgo pixabay yandex youtube" + cnt="1" + for entry in ${adb_safesearchlist}; do + (f_list safesearch "${entry}") & + hold="$((cnt % adb_cores))" + [ "${hold}" = "0" ] && wait + cnt="$((cnt + 1))" + done + fi + wait + + # main loop + # + cnt="1" + for src_name in ${adb_sources}; do + if ! json_select "${src_name}" >/dev/null 2>&1; then + adb_sources="${adb_sources/${src_name}/}" + continue + fi + json_get_var src_url "url" >/dev/null 2>&1 + json_get_var src_rset "rule" >/dev/null 2>&1 + json_select .. + src_tmpcat="${adb_tmpload}.${src_name}.cat" + src_tmpload="${adb_tmpload}.${src_name}.load" + src_tmpsort="${adb_tmpload}.${src_name}.sort" + src_tmpfile="${adb_tmpfile}.${src_name}" + src_rc=4 + + # basic pre-checks + # + if [ -z "${src_url}" ] || [ -z "${src_rset}" ]; then + f_list remove + continue + fi + + # backup mode + # + if [ "${adb_backup}" = "1" ] && { [ "${adb_action}" = "start" ] || [ "${adb_action}" = "resume" ]; }; then + if f_list restore && [ -s "${src_tmpfile}" ]; then + continue + fi + fi + + # download queue processing + # + unset src_cat src_entries + if [ "${src_name}" = "utcapitole" ] && [ -n "${adb_utc_sources}" ]; then + src_cat="${adb_utc_sources}" + if [ -n "${src_cat}" ]; then + ( + src_arc="${adb_tmpdir}/${src_url##*/}" + src_log="$("${adb_fetchutil}" ${adb_fetchparm} "${src_arc}" "${src_url}" 2>&1)" + src_rc="${?}" + if [ "${src_rc}" = "0" ] && [ -s "${src_arc}" ]; then + src_suffix="$(eval printf "%s" \"\$\{adb_src_suffix_${src_name}:-\"domains\"\}\")" + src_list="$(tar -tzf "${src_arc}" 2>/dev/null)" + for src_item in ${src_cat}; do + src_entries="${src_entries} $(printf "%s" "${src_list}" | grep -E "${src_item}/${src_suffix}$")" + done + if [ -n "${src_entries}" ]; then + tar -xOzf "${src_arc}" ${src_entries} 2>/dev/null >"${src_tmpload}" + src_rc="${?}" + fi + : >"${src_arc}" + else + src_log="$(printf "%s" "${src_log}" | "${adb_awk}" '{ORS=" ";print $0}')" + f_log "info" "download of '${src_name}' failed, url: ${src_url}, rule: ${src_rset:-"-"}, categories: ${src_cat:-"-"}, rc: ${src_rc}, log: ${src_log:-"-"}" + fi + if [ "${src_rc}" = "0" ] && [ -s "${src_tmpload}" ]; then + if [ -s "${adb_tmpdir}/tmp.rem.whitelist" ]; then + "${adb_awk}" "${src_rset}" "${src_tmpload}" | sed "s/\r//g" | + grep -Evf "${adb_tmpdir}/tmp.rem.whitelist" | "${adb_awk}" 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' >"${src_tmpsort}" + else + "${adb_awk}" "${src_rset}" "${src_tmpload}" | sed "s/\r//g" | + "${adb_awk}" 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' >"${src_tmpsort}" + fi + : >"${src_tmpload}" + "${adb_sort}" ${adb_srtopts} -u "${src_tmpsort}" 2>/dev/null >"${src_tmpfile}" + src_rc="${?}" + : >"${src_tmpsort}" + if [ "${src_rc}" = "0" ] && [ -s "${src_tmpfile}" ]; then + f_list download + [ "${adb_backup}" = "1" ] && f_list backup + elif [ "${adb_backup}" = "1" ] && [ "${adb_action}" != "start" ]; then + f_log "info" "archive preparation of '${src_name}' failed, categories: ${src_cat:-"-"}, entries: ${src_entries}, rc: ${src_rc}" + f_list restore + rm -f "${src_tmpfile}" + fi + elif [ "${adb_backup}" = "1" ] && [ "${adb_action}" != "start" ]; then + f_log "info" "archive extraction of '${src_name}' failed, categories: ${src_cat:-"-"}, entries: ${src_entries}, rc: ${src_rc}" + f_list restore + fi + ) & + fi + else + if [ "${src_name}" = "energized" ] && [ -n "${adb_eng_sources}" ]; then + src_cat="${adb_eng_sources}" + elif [ "${src_name}" = "stevenblack" ] && [ -n "${adb_stb_sources}" ]; then + src_cat="${adb_stb_sources}" + elif { [ "${src_name}" = "energized" ] && [ -z "${adb_eng_sources}" ]; } || + { [ "${src_name}" = "stevenblack" ] && [ -z "${adb_stb_sources}" ]; }; then + continue + fi + ( + for suffix in ${src_cat:-${src_url}}; do + if [ "${src_url}" != "${suffix}" ]; then + src_log="$("${adb_fetchutil}" ${adb_fetchparm} "${src_tmpcat}" "${src_url}${suffix}" 2>&1)" + src_rc="${?}" + if [ "${src_rc}" = "0" ] && [ -s "${src_tmpcat}" ]; then + cat "${src_tmpcat}" >>"${src_tmpload}" + : >"${src_tmpcat}" + fi + else + src_log="$("${adb_fetchutil}" ${adb_fetchparm} "${src_tmpload}" "${src_url}" 2>&1)" + src_rc="${?}" + fi + done + if [ "${src_rc}" = "0" ] && [ -s "${src_tmpload}" ]; then + if [ -s "${adb_tmpdir}/tmp.rem.whitelist" ]; then + "${adb_awk}" "${src_rset}" "${src_tmpload}" | sed "s/\r//g" | + grep -Evf "${adb_tmpdir}/tmp.rem.whitelist" | "${adb_awk}" 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' >"${src_tmpsort}" + else + "${adb_awk}" "${src_rset}" "${src_tmpload}" | sed "s/\r//g" | + "${adb_awk}" 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' >"${src_tmpsort}" + fi + : >"${src_tmpload}" + "${adb_sort}" ${adb_srtopts} -u "${src_tmpsort}" 2>/dev/null >"${src_tmpfile}" + src_rc="${?}" + : >"${src_tmpsort}" + if [ "${src_rc}" = "0" ] && [ -s "${src_tmpfile}" ]; then + f_list download + [ "${adb_backup}" = "1" ] && f_list backup + elif [ "${adb_backup}" = "1" ] && [ "${adb_action}" != "start" ]; then + f_log "info" "preparation of '${src_name}' failed, rc: ${src_rc}" + f_list restore + rm -f "${src_tmpfile}" + fi + else + src_log="$(printf "%s" "${src_log}" | "${adb_awk}" '{ORS=" ";print $0}')" + f_log "info" "download of '${src_name}' failed, url: ${src_url}, rule: ${src_rset:-"-"}, categories: ${src_cat:-"-"}, rc: ${src_rc}, log: ${src_log:-"-"}" + [ "${adb_backup}" = "1" ] && [ "${adb_action}" != "start" ] && f_list restore + fi + ) & + fi + hold="$((cnt % adb_cores))" + [ "${hold}" = "0" ] && wait + cnt="$((cnt + 1))" + done + wait + + # tld compression and dns restart + # + if f_list merge && [ -s "${adb_tmpdir}/${adb_dnsfile}" ]; then + f_tld "${adb_tmpdir}/${adb_dnsfile}" + f_list final + else + printf "%b" "${adb_dnsheader}" >"${adb_dnsdir}/${adb_dnsfile}" + fi + chown "${adb_dnsuser}" "${adb_dnsdir}/${adb_dnsfile}" 2>/dev/null + if f_dnsup; then + [ "${adb_action}" != "resume" ] && f_jsnup "enabled" + f_log "info" "blocklist with overall ${adb_cnt} blocked domains loaded successfully (${adb_sysver})" + else + f_log "err" "dns backend restart with adblock blocklist failed" + fi + f_rmtemp +} + +# trace dns queries via tcpdump and prepare a report +# +f_report() { + local report_raw report_txt content status total start end start_date start_time end_date end_time blocked percent top_list top array item index hold ports value key key_list cnt="0" resolve="-nn" action="${1}" top_count="${2:-"10"}" res_count="${3:-"50"}" search="${4:-"+"}" + + report_raw="${adb_reportdir}/adb_report.raw" + report_srt="${adb_reportdir}/adb_report.srt" + report_jsn="${adb_reportdir}/adb_report.json" + report_txt="${adb_reportdir}/adb_mailreport.txt" + + # build json file + # + if [ "${action}" != "json" ]; then + : >"${report_raw}" + : >"${report_srt}" + : >"${report_txt}" + : >"${report_jsn}" + [ "${adb_represolve}" = "1" ] && resolve="" + for file in "${adb_reportdir}/adb_report.pcap"*; do + ( + "${adb_dumpcmd}" "${resolve}" -tttt -r "${file}" 2>/dev/null | + "${adb_awk}" -v cnt="${cnt}" '!/\.lan\. |PTR\? | SOA\? /&&/ A[\? ]+|NXDomain|0\.0\.0\.0/{a=$1;b=substr($2,0,8);c=$4;sub(/\.[0-9]+$/,"",c);gsub(/[^[:alnum:]\.:-]/,"",c);d=cnt $7;sub(/\*$/,"",d); + e=$(NF-1);sub(/[0-9]\/[0-9]\/[0-9]|0\.0\.0\.0/,"NX",e);sub(/\.$/,"",e);sub(/([0-9]{1,3}\.){3}[0-9]{1,3}/,"OK",e);gsub(/[^[:alnum:]\.-]/,"",e);if(e==""){e="err"};printf "%s\t%s\t%s\t%s\t%s\n",d,e,a,b,c}' >>"${report_raw}" + ) & + hold="$((cnt % adb_cores))" + [ "${hold}" = "0" ] && wait + cnt="$((cnt + 1))" + done + wait + if [ -s "${report_raw}" ]; then + "${adb_sort}" ${adb_srtopts} -k1 -k3 -k4 -k5 -k1 -ur "${report_raw}" | + "${adb_awk}" '{currA=($1+0);currB=$1;currC=substr($1,length($1),1);if(reqA==currB){reqA=0;printf "%s\t%s\n",d,$2}else if(currC=="+"){reqA=currA;d=$3"\t"$4"\t"$5"\t"$2}}' | + "${adb_sort}" ${adb_srtopts} -k1 -k2 -k3 -k4 -ur >"${report_srt}" + rm -f "${report_raw}" + fi + + if [ -s "${report_srt}" ]; then + start="$("${adb_awk}" 'END{printf "%s_%s",$1,$2}' "${report_srt}")" + end="$("${adb_awk}" 'NR==1{printf "%s_%s",$1,$2}' "${report_srt}")" + total="$(wc -l <"${report_srt}")" + blocked="$("${adb_awk}" '{if($5=="NX")cnt++}END{printf "%s",cnt}' "${report_srt}")" + percent="$("${adb_awk}" -v t="${total}" -v b="${blocked}" 'BEGIN{printf "%.2f%s",b/t*100,"%"}')" + : >"${report_jsn}" + { + printf "%s\n" "{ " + printf "\t%s\n" "\"start_date\": \"${start%_*}\", " + printf "\t%s\n" "\"start_time\": \"${start#*_}\", " + printf "\t%s\n" "\"end_date\": \"${end%_*}\", " + printf "\t%s\n" "\"end_time\": \"${end#*_}\", " + printf "\t%s\n" "\"total\": \"${total}\", " + printf "\t%s\n" "\"blocked\": \"${blocked}\", " + printf "\t%s\n" "\"percent\": \"${percent}\", " + } >>"${report_jsn}" + top_list="top_clients top_domains top_blocked" + for top in ${top_list}; do + printf "\t%s" "\"${top}\": [ " >>"${report_jsn}" + case "${top}" in + "top_clients") + "${adb_awk}" '{print $3}' "${report_srt}" | "${adb_sort}" ${adb_srtopts} | uniq -c | + "${adb_sort}" ${adb_srtopts} -nr | + "${adb_awk}" "{ORS=\" \";if(NR==1)printf \"\n\t\t{\n\t\t\t\\\"count\\\": \\\"%s\\\",\n\t\t\t\\\"address\\\": \\\"%s\\\"\n\t\t}\",\$1,\$2; else if(NR<=${top_count})printf \",\n\t\t{\n\t\t\t\\\"count\\\": \\\"%s\\\",\n\t\t\t\\\"address\\\": \\\"%s\\\"\n\t\t}\",\$1,\$2}" >>"${report_jsn}" + ;; + "top_domains") + "${adb_awk}" '{if($5!="NX")print $4}' "${report_srt}" | "${adb_sort}" ${adb_srtopts} | uniq -c | + "${adb_sort}" ${adb_srtopts} -nr | + "${adb_awk}" "{ORS=\" \";if(NR==1)printf \"\n\t\t{\n\t\t\t\\\"count\\\": \\\"%s\\\",\n\t\t\t\\\"address\\\": \\\"%s\\\"\n\t\t}\",\$1,\$2; else if(NR<=${top_count})printf \",\n\t\t{\n\t\t\t\\\"count\\\": \\\"%s\\\",\n\t\t\t\\\"address\\\": \\\"%s\\\"\n\t\t}\",\$1,\$2}" >>"${report_jsn}" + ;; + "top_blocked") + "${adb_awk}" '{if($5=="NX")print $4}' "${report_srt}" | + "${adb_sort}" ${adb_srtopts} | uniq -c | "${adb_sort}" ${adb_srtopts} -nr | + "${adb_awk}" "{ORS=\" \";if(NR==1)printf \"\n\t\t{\n\t\t\t\\\"count\\\": \\\"%s\\\",\n\t\t\t\\\"address\\\": \\\"%s\\\"\n\t\t}\",\$1,\$2; else if(NR<=${top_count})printf \",\n\t\t{\n\t\t\t\\\"count\\\": \\\"%s\\\",\n\t\t\t\\\"address\\\": \\\"%s\\\"\n\t\t}\",\$1,\$2}" >>"${report_jsn}" + ;; + esac + printf "\n\t%s\n" "]," >>"${report_jsn}" + done + search="${search//./\\.}" + search="${search//[+*~%\$&\"\' ]/}" + "${adb_awk}" "BEGIN{i=0;printf \"\t\\\"requests\\\": [\n\"}/(${search})/{i++;if(i==1)printf \"\n\t\t{\n\t\t\t\\\"date\\\": \\\"%s\\\",\n\t\t\t\\\"time\\\": \\\"%s\\\",\n\t\t\t\\\"client\\\": \\\"%s\\\",\n\t\t\t\\\"domain\\\": \\\"%s\\\",\n\t\t\t\\\"rc\\\": \\\"%s\\\"\n\t\t}\",\$1,\$2,\$3,\$4,\$5;else if(i<=${res_count})printf \",\n\t\t{\n\t\t\t\\\"date\\\": \\\"%s\\\",\n\t\t\t\\\"time\\\": \\\"%s\\\",\n\t\t\t\\\"client\\\": \\\"%s\\\",\n\t\t\t\\\"domain\\\": \\\"%s\\\",\n\t\t\t\\\"rc\\\": \\\"%s\\\"\n\t\t}\",\$1,\$2,\$3,\$4,\$5}END{printf \"\n\t]\n}\n\"}" "${adb_reportdir}/adb_report.srt" >>"${report_jsn}" + rm -f "${report_srt}" + fi + fi + + # output preparation + # + if [ -s "${report_jsn}" ] && { [ "${action}" = "cli" ] || [ "${action}" = "mail" ]; }; then + printf "%s\n%s\n%s\n" ":::" "::: Adblock DNS-Query Report" ":::" >>"${report_txt}" + json_init + json_load_file "${report_jsn}" + json_get_keys key_list + for key in ${key_list}; do + json_get_var value "${key}" + eval "${key}=\"${value}\"" + done + printf " + %s\n + %s\n" "Start ::: ${start_date}, ${start_time}" "End ::: ${end_date}, ${end_time}" >>"${report_txt}" + printf " + %s\n + %s %s\n" "Total ::: ${total}" "Blocked ::: ${blocked}" "(${percent})" >>"${report_txt}" + top_list="top_clients top_domains top_blocked requests" + for top in ${top_list}; do + case "${top}" in + "top_clients") + item="::: Top Clients" + ;; + "top_domains") + item="::: Top Domains" + ;; + "top_blocked") + item="::: Top Blocked Domains" + ;; + esac + if json_get_type status "${top}" && [ "${top}" != "requests" ] && [ "${status}" = "array" ]; then + printf "%s\n%s\n%s\n" ":::" "${item}" ":::" >>"${report_txt}" + json_select "${top}" + index="1" + item="" + while json_get_type status "${index}" && [ "${status}" = "object" ]; do + json_get_values item "${index}" + printf " + %-9s::: %s\n" ${item} >>"${report_txt}" + index="$((index + 1))" + done + elif json_get_type status "${top}" && [ "${top}" = "requests" ] && [ "${status}" = "array" ]; then + printf "%s\n%s\n%s\n" ":::" "::: Latest DNS Queries" ":::" >>"${report_txt}" + printf "%-15s%-15s%-45s%-80s%s\n" "Date" "Time" "Client" "Domain" "Answer" >>"${report_txt}" + json_select "${top}" + index="1" + while json_get_type status "${index}" && [ "${status}" = "object" ]; do + json_get_values item "${index}" + printf "%-15s%-15s%-45s%-80s%s\n" ${item} >>"${report_txt}" + index="$((index + 1))" + done + fi + json_select ".." + done + content="$(cat "${report_txt}" 2>/dev/null)" + rm -f "${report_txt}" + fi + + # report output + # + if [ "${action}" = "cli" ]; then + printf "%s\n" "${content}" + elif [ "${action}" = "json" ]; then + cat "${report_jsn}" + elif [ "${action}" = "mail" ] && [ "${adb_mail}" = "1" ] && [ -x "${adb_mailservice}" ]; then + ("${adb_mailservice}" "${adb_ver}" "${content}" >/dev/null 2>&1) & + bg_pid="${!}" + fi + f_log "debug" "f_report ::: action: ${action}, top_count: ${top_count}, res_count: ${res_count}, search: ${search}, dump_util: ${adb_dumpcmd}, rep_dir: ${adb_reportdir}, rep_iface: ${adb_repiface:-"-"}, rep_listen: ${adb_replisten}, rep_chunksize: ${adb_repchunksize}, rep_chunkcnt: ${adb_repchunkcnt}, rep_resolve: ${adb_represolve}" +} + +# source required system libraries +# +if [ -r "/lib/functions.sh" ] && [ -r "/lib/functions/network.sh" ] && [ -r "/usr/share/libubox/jshn.sh" ]; then + . "/lib/functions.sh" + . "/lib/functions/network.sh" + . "/usr/share/libubox/jshn.sh" +else + f_log "err" "system libraries not found" +fi + +# awk check +# +adb_awk="$(command -v gawk)" +if [ ! -x "${adb_awk}" ]; then + adb_awk="$(command -v awk)" + [ ! -x "${adb_awk}" ] && f_log "err" "awk not found or not executable" +fi + +# sort check +# +adb_sort="$(command -v sort)" +if [ ! -x "${adb_sort}" ] || ! "${adb_sort}" --version 2>/dev/null | grep -q "coreutils"; then + f_log "err" "coreutils sort not found or not executable" +fi + +# handle different adblock actions +# +f_load +case "${adb_action}" in + "stop") + f_rmdns + ;; + "restart") + f_rmdns + f_env + f_main + ;; + "suspend") + [ "${adb_dns}" != "raw" ] && f_switch suspend + ;; + "resume") + [ "${adb_dns}" != "raw" ] && f_switch resume + ;; + "report") + f_report "${2}" "${3}" "${4}" "${5}" + ;; + "query") + f_query "${2}" + ;; + "start" | "reload") + f_env + f_main + ;; +esac diff --git a/package/network/config/adblock/files/adblock.sources b/package/network/config/adblock/files/adblock.sources new file mode 100644 index 0000000000..b7f8f8b112 --- /dev/null +++ b/package/network/config/adblock/files/adblock.sources @@ -0,0 +1,352 @@ +{ + "adaway": { + "url": "https://raw.githubusercontent.com/AdAway/adaway.github.io/master/hosts.txt", + "rule": "/^127\\.0\\.0\\.1[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "S", + "focus": "mobile", + "descurl": "https://github.com/AdAway/adaway.github.io" + }, + "adguard": { + "url": "https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt", + "rule": "BEGIN{FS=\"[\/|^|\\r]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+[\\/\\^\\r]+$/{print tolower($3)}", + "size": "L", + "focus": "general", + "descurl": "https://adguard.com" + }, + "adguard_tracking": { + "url": "https://raw.githubusercontent.com/AdguardTeam/cname-trackers/master/data/combined_disguised_trackers_justdomains.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "L", + "focus": "tracking", + "descurl": "https://github.com/AdguardTeam/cname-trackers" + }, + "android_tracking": { + "url": "https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/android-tracking.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "S", + "focus": "tracking", + "descurl": "https://github.com/Perflyst/PiHoleBlocklist" + }, + "andryou": { + "url": "https://gitlab.com/andryou/block/raw/master/kouhai-compressed-domains", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "L", + "focus": "compilation", + "descurl": "https://gitlab.com/andryou/block/-/blob/master/readme.md" + }, + "anti_ad": { + "url": "https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/anti-ad-domains.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "L", + "focus": "compilation", + "descurl": "https://github.com/privacy-protection-tools/anti-AD/blob/master/README.md" + }, + "antipopads": { + "url": "https://raw.githubusercontent.com/AdroitAdorKhan/antipopads-re/master/formats/domains.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "L", + "focus": "compilation", + "descurl": "https://github.com/AdroitAdorKhan/antipopads-re" + }, + "anudeep": { + "url": "https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt", + "rule": "/^0\\.0\\.0\\.0[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "M", + "focus": "compilation", + "descurl": "https://github.com/anudeepND/blacklist" + }, + "bitcoin": { + "url": "https://raw.githubusercontent.com/hoshsadiq/adblock-nocoin-list/master/hosts.txt", + "rule": "/^0\\.0\\.0\\.0[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "S", + "focus": "mining", + "descurl": "https://github.com/hoshsadiq/adblock-nocoin-list" + }, + "cpbl": { + "url": "https://raw.githubusercontent.com/bongochong/CombinedPrivacyBlockLists/master/NoFormatting/cpbl-ctld.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "XL", + "focus": "compilation", + "descurl": "https://github.com/bongochong/CombinedPrivacyBlockLists" + }, + "disconnect": { + "url": "https://s3.amazonaws.com/lists.disconnect.me/simple_malvertising.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "S", + "focus": "general", + "descurl": "https://disconnect.me" + }, + "doh_blocklist": { + "url": "https://raw.githubusercontent.com/dibdot/DoH-IP-blocklists/master/doh-domains_overall.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "S", + "focus": "doh_server", + "descurl": "https://github.com/dibdot/DoH-IP-blocklists" + }, + "easylist": { + "url": "https://easylist-downloads.adblockplus.org/easylist.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "M", + "focus": "compilation", + "descurl": "https://easylist.to" + }, + "easyprivacy": { + "url": "https://easylist-downloads.adblockplus.org/easyprivacy.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "M", + "focus": "tracking", + "descurl": "https://easylist.to" + }, + "firetv_tracking": { + "url": "https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/AmazonFireTV.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "S", + "focus": "tracking", + "descurl": "https://github.com/Perflyst/PiHoleBlocklist" + }, + "games_tracking": { + "url": "https://raw.githubusercontent.com/KodoPengin/GameIndustry-hosts-Template/master/Main-Template/hosts", + "rule": "/^0\\.0\\.0\\.0[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "S", + "focus": "tracking", + "descurl": "https://www.gameindustry.eu" + }, + "hblock": { + "url": "https://hblock.molinero.dev/hosts_domains.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "XL", + "focus": "compilation", + "descurl": "https://hblock.molinero.dev" + }, + "lightswitch05": { + "url": "https://www.github.developerdan.com/hosts/lists/ads-and-tracking-extended.txt", + "rule": "/^0\\.0\\.0\\.0[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "XL", + "focus": "compilation", + "descurl": "https://github.com/lightswitch05/hosts" + }, + "notracking": { + "url": "https://raw.githubusercontent.com/notracking/hosts-blocklists/master/dnscrypt-proxy/dnscrypt-proxy.blacklist.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "XL", + "focus": "tracking", + "descurl": "https://github.com/notracking/hosts-blocklists" + }, + "oisd_big": { + "url": "https://big.oisd.nl/domainswild", + "rule": "BEGIN{FS=\"\\\\*.\"}/^\\*\\.([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "XXL", + "focus": "general", + "descurl": "https://oisd.nl" + }, + "oisd_nsfw": { + "url": "https://nsfw.oisd.nl/domainswild", + "rule": "BEGIN{FS=\"\\\\*.\"}/^\\*\\.([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "XXL", + "focus": "porn", + "descurl": "https://oisd.nl" + }, + "oisd_small": { + "url": "https://small.oisd.nl/domainswild", + "rule": "BEGIN{FS=\"\\\\*.\"}/^\\*\\.([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "L", + "focus": "general", + "descurl": "https://oisd.nl" + }, + "openphish": { + "url": "https://openphish.com/feed.txt", + "rule": "BEGIN{FS=\"\/\"}/^http[s]?:\\/\\/([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+(\\/|$)/{print tolower($3)}", + "size": "S", + "focus": "phishing", + "descurl": "https://openphish.com" + }, + "phishing_army": { + "url": "https://phishing.army/download/phishing_army_blocklist_extended.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "S", + "focus": "phishing", + "descurl": "https://phishing.army" + }, + "reg_cn": { + "url": "https://easylist-downloads.adblockplus.org/easylistchina.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_china", + "descurl": "https://easylist.to" + }, + "reg_cz": { + "url": "https://easylist-downloads.adblockplus.org/easylistczechslovak.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_czech+slovak", + "descurl": "https://easylist.to" + }, + "reg_de": { + "url": "https://easylist-downloads.adblockplus.org/easylistgermany.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_germany", + "descurl": "https://easylist.to" + }, + "reg_es": { + "url": "https://easylist-downloads.adblockplus.org/easylistspanish.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_spain", + "descurl": "https://easylist.to" + }, + "reg_fi": { + "url": "https://raw.githubusercontent.com/finnish-easylist-addition/finnish-easylist-addition/master/Finland_adb.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_finland", + "descurl": "https://github.com/finnish-easylist-addition" + }, + "reg_fr": { + "url": "https://easylist-downloads.adblockplus.org/liste_fr.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "M", + "focus": "reg_france", + "descurl": "https://forums.lanik.us/viewforum.php?f=91" + }, + "reg_id": { + "url": "https://easylist-downloads.adblockplus.org/abpindo.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_indonesia", + "descurl": "https://easylist.to" + }, + "reg_it": { + "url": "https://easylist-downloads.adblockplus.org/easylistitaly.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_italy", + "descurl": "https://easylist.to" + }, + "reg_jp": { + "url": "https://raw.githubusercontent.com/k2jp/abp-japanese-filters/master/abpjf.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_japan", + "descurl": "https://github.com/k2jp/abp-japanese-filters" + }, + "reg_kr": { + "url": "https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/adservice.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_korea", + "descurl": "https://github.com/List-KR/List-KR" + }, + "reg_nl": { + "url": "https://easylist-downloads.adblockplus.org/easylistdutch.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_netherlands", + "descurl": "https://easylist.to" + }, + "reg_pl": { + "url": "https://raw.githubusercontent.com/PolishFiltersTeam/KADhosts/master/KADhosts.txt", + "rule": "/^0\\.0\\.0\\.0[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "M", + "focus": "reg_poland", + "descurl": "https://kadantiscam.netlify.app" + }, + "reg_ro": { + "url": "https://easylist-downloads.adblockplus.org/rolist.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_romania", + "descurl": "https://easylist.to" + }, + "reg_ru": { + "url": "https://easylist-downloads.adblockplus.org/ruadlist.txt", + "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}", + "size": "S", + "focus": "reg_russia", + "descurl": "https://easylist.to" + }, + "reg_se": { + "url": "https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Frellwits-Swedish-Hosts-File.txt", + "rule": "/^127\\.0\\.0\\.1[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "S", + "focus": "reg_sweden", + "descurl": "https://github.com/lassekongo83/Frellwits-filter-lists" + }, + "reg_vn": { + "url": "https://raw.githubusercontent.com/bigdargon/hostsVN/master/hosts", + "rule": "/^0\\.0\\.0\\.0[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "S", + "focus": "reg_vietnam", + "descurl": "https://bigdargon.github.io/hostsVN" + }, + "smarttv_tracking": { + "url": "https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/SmartTV.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "S", + "focus": "tracking", + "descurl": "https://github.com/Perflyst/PiHoleBlocklist" + }, + "spam404": { + "url": "https://raw.githubusercontent.com/Dawsey21/Lists/master/main-blacklist.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "S", + "focus": "general", + "descurl": "https://github.com/Dawsey21" + }, + "stevenblack": { + "url": "https://raw.githubusercontent.com/StevenBlack/hosts/master/", + "rule": "/^0\\.0\\.0\\.0[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "VAR", + "focus": "compilation", + "descurl": "https://github.com/StevenBlack/hosts" + }, + "stopforumspam": { + "url": "https://www.stopforumspam.com/downloads/toxic_domains_whole.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "S", + "focus": "spam", + "descurl": "https://www.stopforumspam.com" + }, + "utcapitole": { + "url": "https://dsi.ut-capitole.fr/blacklists/download/blacklists.tar.gz", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "VAR", + "focus": "general", + "descurl": "https://dsi.ut-capitole.fr/blacklists/index_en.php" + }, + "wally3k": { + "url": "https://v.firebog.net/hosts/static/w3kbl.txt", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "S", + "focus": "compilation", + "descurl": "https://firebog.net/about" + }, + "whocares": { + "url": "https://someonewhocares.org/hosts/hosts", + "rule": "/^127\\.0\\.0\\.1[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "M", + "focus": "general", + "descurl": "https://someonewhocares.org" + }, + "winhelp": { + "url": "https://winhelp2002.mvps.org/hosts.txt", + "rule": "/^0\\.0\\.0\\.0[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "S", + "focus": "general", + "descurl": "https://winhelp2002.mvps.org" + }, + "winspy": { + "url": "https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/spy.txt", + "rule": "/^0\\.0\\.0\\.0[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}", + "size": "S", + "focus": "win_telemetry", + "descurl": "https://github.com/crazy-max/WindowsSpyBlocker" + }, + "yoyo": { + "url": "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=nohtml&showintro=0&mimetype=plaintext", + "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}", + "size": "S", + "focus": "general", + "descurl": "https://pgl.yoyo.org/as" + } +} diff --git a/package/network/config/adblock/files/adblock.whitelist b/package/network/config/adblock/files/adblock.whitelist new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package/network/config/firewall/Makefile b/package/network/config/firewall/Makefile index 446a416722..6115a52f8c 100644 --- a/package/network/config/firewall/Makefile +++ b/package/network/config/firewall/Makefile @@ -21,6 +21,8 @@ PKG_LICENSE:=ISC PKG_CONFIG_DEPENDS := CONFIG_IPV6 +PKG_BUILD_FLAGS:=gc-sections lto + include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -42,8 +44,6 @@ define Package/firewall/conffiles /etc/firewall.user endef -TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto -TARGET_LDFLAGS += -Wl,--gc-sections -flto CMAKE_OPTIONS += $(if $(CONFIG_IPV6),,-DDISABLE_IPV6=1) define Package/firewall/install diff --git a/package/network/config/firewall/files/firewall.config b/package/network/config/firewall/files/firewall.config index ab9dc2c553..8143820b6c 100644 --- a/package/network/config/firewall/files/firewall.config +++ b/package/network/config/firewall/files/firewall.config @@ -1,6 +1,6 @@ config defaults option syn_flood 1 - option input ACCEPT + option input REJECT option output ACCEPT option forward REJECT # Uncomment this line to disable ipv6 rules diff --git a/package/network/config/firewall4/Makefile b/package/network/config/firewall4/Makefile index 3a36f2b845..10bdbf8c79 100644 --- a/package/network/config/firewall4/Makefile +++ b/package/network/config/firewall4/Makefile @@ -5,13 +5,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=firewall4 -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/firewall4.git -PKG_SOURCE_DATE:=2022-10-18 -PKG_SOURCE_VERSION:=7ae5e14bbd7265cc67ec870c3bb0c8e197bb7ca9 -PKG_MIRROR_HASH:=ce190e526df915df65b40aa24fadf2a1b5badc57ab4e564d5f44575b11d18e26 +PKG_SOURCE_DATE:=2023-09-01 +PKG_SOURCE_VERSION:=598d9fbb5179667aa0c525040eaa41bc7f2dc015 +PKG_MIRROR_HASH:=038b5b5611425e3c0fcc3ef4a0aea37296733300766d787909a689d16d4f39b4 PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=ISC diff --git a/package/network/config/netifd/Makefile b/package/network/config/netifd/Makefile index dbda51096e..6059ea9947 100644 --- a/package/network/config/netifd/Makefile +++ b/package/network/config/netifd/Makefile @@ -1,18 +1,20 @@ include $(TOPDIR)/rules.mk PKG_NAME:=netifd -PKG_RELEASE:=1 +PKG_RELEASE:=1.1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/netifd.git -PKG_SOURCE_DATE:=2022-08-25 -PKG_SOURCE_VERSION:=76d2d41b7355e02f95fbfa79affbd232fb090595 -PKG_MIRROR_HASH:=cd754decce7d9f9c69e0ad8c6801f306fa37dd6c8a7039aea610c1c71d06b8f9 +PKG_SOURCE_DATE:=2023-11-10 +PKG_SOURCE_VERSION:=35facc8306f590a7330789ab6d5785c0d43073ef +PKG_MIRROR_HASH:=4f73591ae1873e18df235349e478f2196ca0d3123c313a04149dc9d5e2bfb403 PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:= +PKG_BUILD_FLAGS:=lto + include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -30,10 +32,7 @@ endef TARGET_CFLAGS += \ -I$(STAGING_DIR)/usr/include/libnl-tiny \ - -I$(STAGING_DIR)/usr/include \ - -flto - -TARGET_LDFLAGS += -flto -fuse-linker-plugin + -I$(STAGING_DIR)/usr/include CMAKE_OPTIONS += \ -DLIBNL_LIBS=-lnl-tiny \ diff --git a/package/network/config/netifd/files/etc/hotplug.d/net/20-smp-packet-steering b/package/network/config/netifd/files/etc/hotplug.d/net/20-smp-packet-steering deleted file mode 100644 index 8a86bf75f6..0000000000 --- a/package/network/config/netifd/files/etc/hotplug.d/net/20-smp-packet-steering +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh -[ "$ACTION" = add ] || exit - -NPROCS="$(grep -c "^processor.*:" /proc/cpuinfo)" -[ "$NPROCS" -gt 1 ] || exit - -PROC_MASK="$(( (1 << $NPROCS) - 1 ))" - -find_irq_cpu() { - local dev="$1" - local match="$(grep -m 1 "$dev\$" /proc/interrupts)" - local cpu=0 - - [ -n "$match" ] && { - set -- $match - shift - for cur in $(seq 1 $NPROCS); do - [ "$1" -gt 0 ] && { - cpu=$(($cur - 1)) - break - } - shift - done - } - - echo "$cpu" -} - -set_hex_val() { - local file="$1" - local val="$2" - val="$(printf %x "$val")" - [ -n "$DEBUG" ] && echo "$file = $val" - echo "$val" > "$file" -} - -packet_steering="$(uci get "network.@globals[0].packet_steering")" -[ "$packet_steering" != 1 ] && exit 0 - -exec 512>/var/lock/smp_tune.lock -flock 512 || exit 1 - -for dev in /sys/class/net/*; do - [ -d "$dev" ] || continue - - # ignore virtual interfaces - [ -n "$(ls "${dev}/" | grep '^lower_')" ] && continue - [ -d "${dev}/device" ] || continue - - device="$(readlink "${dev}/device")" - device="$(basename "$device")" - irq_cpu="$(find_irq_cpu "$device")" - irq_cpu_mask="$((1 << $irq_cpu))" - - for q in ${dev}/queues/tx-*; do - set_hex_val "$q/xps_cpus" "$PROC_MASK" - done - - # ignore dsa slave ports for RPS - subsys="$(readlink "${dev}/device/subsystem")" - subsys="$(basename "$subsys")" - [ "$subsys" = "mdio_bus" ] && continue - - for q in ${dev}/queues/rx-*; do - set_hex_val "$q/rps_cpus" "$PROC_MASK" - done -done diff --git a/package/network/config/netifd/files/etc/init.d/packet_steering b/package/network/config/netifd/files/etc/init.d/packet_steering new file mode 100755 index 0000000000..9d8f791e23 --- /dev/null +++ b/package/network/config/netifd/files/etc/init.d/packet_steering @@ -0,0 +1,18 @@ +#!/bin/sh /etc/rc.common + +START=25 +USE_PROCD=1 + +start_service() { + reload_service +} + +service_triggers() { + procd_add_reload_trigger "network" + procd_add_reload_trigger "firewall" + procd_add_raw_trigger "interface.*" 1000 /etc/init.d/packet_steering reload +} + +reload_service() { + /usr/libexec/network/packet-steering.sh +} diff --git a/package/network/config/netifd/files/sbin/ifdown b/package/network/config/netifd/files/sbin/ifdown deleted file mode 120000 index a0e5c176a3..0000000000 --- a/package/network/config/netifd/files/sbin/ifdown +++ /dev/null @@ -1 +0,0 @@ -ifup \ No newline at end of file diff --git a/package/network/config/netifd/files/sbin/ifup b/package/network/config/netifd/files/sbin/ifup index 15be535bbf..fbf2fd80c7 100755 --- a/package/network/config/netifd/files/sbin/ifup +++ b/package/network/config/netifd/files/sbin/ifup @@ -1,7 +1,6 @@ #!/bin/sh ifup_all= -setup_wifi= if_call() { local interface="$1" @@ -14,7 +13,6 @@ case "$0" in *ifdown) modes=down;; *ifup) modes="down up" - setup_wifi=1 ;; *) echo "Invalid command: $0";; esac @@ -25,10 +23,6 @@ while :; do ifup_all=1 shift ;; - -w) - setup_wifi= - shift - ;; *) break ;; @@ -40,7 +34,6 @@ if [ -n "$ifup_all" ]; then for interface in $(ubus -S list 'network.interface.*'); do if_call "${interface##network.interface.}" done - [ -n "$setup_wifi" ] && /sbin/wifi up exit else ubus -S list "network.interface.$1" > /dev/null || { @@ -49,29 +42,3 @@ else } if_call "$1" fi - -if [ -n "$setup_wifi" ] && grep -sq config /etc/config/wireless; then - . /lib/functions.sh - - find_related_radios() { - local wdev wnet - config_get wdev "$1" device - config_get wnet "$1" network - - if [ -n "$wdev" ]; then - for wnet in $wnet; do - if [ "$wnet" = "$network" ]; then - append radio_devs "$wdev" "$N" - fi - done - fi - } - - network="$1" - config_load wireless - config_foreach find_related_radios wifi-iface - - for dev in $(echo "$radio_devs" | sort -u); do - /sbin/wifi up "$dev" - done -fi diff --git a/package/network/config/netifd/files/usr/libexec/network/packet-steering.sh b/package/network/config/netifd/files/usr/libexec/network/packet-steering.sh new file mode 100755 index 0000000000..799c080805 --- /dev/null +++ b/package/network/config/netifd/files/usr/libexec/network/packet-steering.sh @@ -0,0 +1,70 @@ +#!/bin/sh +NPROCS="$(grep -c "^processor.*:" /proc/cpuinfo)" +[ "$NPROCS" -gt 1 ] || exit + +PROC_MASK="$(( (1 << $NPROCS) - 1 ))" + +find_irq_cpu() { + local dev="$1" + local match="$(grep -m 1 "$dev\$" /proc/interrupts)" + local cpu=0 + + [ -n "$match" ] && { + set -- $match + shift + for cur in $(seq 1 $NPROCS); do + [ "$1" -gt 0 ] && { + cpu=$(($cur - 1)) + break + } + shift + done + } + + echo "$cpu" +} + +set_hex_val() { + local file="$1" + local val="$2" + val="$(printf %x "$val")" + [ -n "$DEBUG" ] && echo "$file = $val" + echo "$val" > "$file" +} + +packet_steering="$(uci get "network.@globals[0].packet_steering")" +[ "$packet_steering" != 1 ] && exit 0 + +exec 512>/var/lock/smp_tune.lock +flock 512 || exit 1 + +[ -e "/usr/libexec/platform/packet-steering.sh" ] && { + /usr/libexec/platform/packet-steering.sh + exit 0 +} + +for dev in /sys/class/net/*; do + [ -d "$dev" ] || continue + + # ignore virtual interfaces + [ -n "$(ls "${dev}/" | grep '^lower_')" ] && continue + [ -d "${dev}/device" ] || continue + + device="$(readlink "${dev}/device")" + device="$(basename "$device")" + irq_cpu="$(find_irq_cpu "$device")" + irq_cpu_mask="$((1 << $irq_cpu))" + + for q in ${dev}/queues/tx-*; do + set_hex_val "$q/xps_cpus" "$PROC_MASK" + done + + # ignore dsa slave ports for RPS + subsys="$(readlink "${dev}/device/subsystem")" + subsys="$(basename "$subsys")" + [ "$subsys" = "mdio_bus" ] && continue + + for q in ${dev}/queues/rx-*; do + set_hex_val "$q/rps_cpus" "$PROC_MASK" + done +done diff --git a/package/network/config/netifd/patches/0001-interface-ip-fix-IPv4-route-target-masking.patch b/package/network/config/netifd/patches/0001-interface-ip-fix-IPv4-route-target-masking.patch new file mode 100644 index 0000000000..dd9374a83c --- /dev/null +++ b/package/network/config/netifd/patches/0001-interface-ip-fix-IPv4-route-target-masking.patch @@ -0,0 +1,32 @@ +From 8587c074f1eb2064c42adb0a6aa5073f695ab89d Mon Sep 17 00:00:00 2001 +From: Jo-Philipp Wich +Date: Tue, 14 Nov 2023 14:01:44 +0100 +Subject: [PATCH] interface-ip: fix IPv4 route target masking + +A previous commit supposed to mask out excess host bits in route targets +failed to correctly calculate the mask value, causing it to produce +improper results for certain mask lengths. + +Fixes: #17 +Fixes: 76eb342 ("interface-ip: mask out host bits in IPv4 route targets") +Signed-off-by: Jo-Philipp Wich +--- + interface-ip.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/interface-ip.c b/interface-ip.c +index d2fe385..28e7106 100644 +--- a/interface-ip.c ++++ b/interface-ip.c +@@ -448,7 +448,7 @@ interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6) + + /* Mask out IPv4 host bits to avoid "Invalid prefix for given prefix length" */ + if (af == AF_INET && route->mask < 32) +- route->addr.in.s_addr &= ((1u << route->mask) - 1); ++ clear_if_addr(&route->addr, route->mask); + } + + if ((cur = tb[ROUTE_GATEWAY]) != NULL) { +-- +2.39.1 + diff --git a/package/network/config/qos-scripts/Makefile b/package/network/config/qos-scripts/Makefile index d6e7df1467..774ce4d94a 100644 --- a/package/network/config/qos-scripts/Makefile +++ b/package/network/config/qos-scripts/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=qos-scripts PKG_VERSION:=1.3.1 -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=33 PKG_LICENSE:=GPL-2.0 PKG_MAINTAINER:=Felix Fietkau diff --git a/package/network/config/qos-scripts/files/usr/bin/qos-start b/package/network/config/qos-scripts/files/usr/bin/qos-start index 68dae70638..13d7772095 100755 --- a/package/network/config/qos-scripts/files/usr/bin/qos-start +++ b/package/network/config/qos-scripts/files/usr/bin/qos-start @@ -1,4 +1,4 @@ #!/bin/sh -qos-stop +qos-stop /usr/lib/qos/generate.sh all | sh diff --git a/package/network/config/qos-scripts/files/usr/bin/qos-stat b/package/network/config/qos-scripts/files/usr/bin/qos-stat index 03b737c89d..454e18aa72 100755 --- a/package/network/config/qos-scripts/files/usr/bin/qos-stat +++ b/package/network/config/qos-scripts/files/usr/bin/qos-stat @@ -32,7 +32,7 @@ print_comments() { echo '# Direction: '"$2" echo '# Stats: '"$3" echo '' -} +} get_device() { ( config_load network; scan_interfaces; config_get "$1" ifname ) diff --git a/package/network/config/qos-scripts/files/usr/lib/qos/generate.sh b/package/network/config/qos-scripts/files/usr/lib/qos/generate.sh index c4bd9d9835..bba7cb6569 100755 --- a/package/network/config/qos-scripts/files/usr/lib/qos/generate.sh +++ b/package/network/config/qos-scripts/files/usr/lib/qos/generate.sh @@ -2,11 +2,10 @@ [ -e /lib/functions.sh ] && . /lib/functions.sh || . ./functions.sh [ -x /sbin/modprobe ] && { insmod="modprobe" - rmmod="$insmod -r" } || { insmod="insmod" - rmmod="rmmod" } +rmmod="rmmod" add_insmod() { eval "export isset=\${insmod_$1}" @@ -65,7 +64,7 @@ parse_matching_rule() { append "$var" "${proto:+-p $proto}" for option in $options; do config_get value "$section" "$option" - + case "$pkt:$option" in *:srchost) append "$var" "-s $value" @@ -283,14 +282,14 @@ start_interface() { config_get device "$iface" device config_get_bool enabled "$iface" enabled 1 [ -z "$device" -o 1 -ne "$enabled" ] && { - return 1 + return 1 } config_get upload "$iface" upload config_get_bool halfduplex "$iface" halfduplex config_get download "$iface" download config_get classgroup "$iface" classgroup config_get_bool overhead "$iface" overhead 0 - + download="${download:-${halfduplex:+$upload}}" enum_classes "$classgroup" for dir in ${halfduplex:-up} ${download:+down}; do @@ -374,7 +373,7 @@ add_rules() { local var="$1" local rules="$2" local prefix="$3" - + for rule in $rules; do unset iptrule config_get target "$rule" target @@ -438,7 +437,7 @@ EOF for command in $iptables; do cat < + +PKG_BUILD_DEPENDS:=bpf-headers +PKG_FLAGS:=nonshared + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk +include $(INCLUDE_DIR)/bpf.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/qosify + SECTION:=utils + CATEGORY:=Base system + TITLE:=A simple QoS solution based eBPF + CAKE + DEPENDS:=+libbpf +libubox +libubus +libnl-tiny +kmod-sched-cake +kmod-sched-bpf +kmod-ifb +tc $(BPF_DEPENDS) +endef + +TARGET_CFLAGS += \ + -Wno-error=deprecated-declarations \ + -I$(STAGING_DIR)/usr/include/libnl-tiny \ + -I$(STAGING_DIR)/usr/include + +CMAKE_OPTIONS += \ + -DLIBNL_LIBS=-lnl-tiny + +define Build/Compile + $(call CompileBPF,$(PKG_BUILD_DIR)/qosify-bpf.c) + $(Build/Compile/Default) +endef + +define Package/qosify/conffiles +/etc/config/qosify +/etc/qosify/00-defaults.conf +endef + +define Package/qosify/install + $(INSTALL_DIR) \ + $(1)/lib/bpf \ + $(1)/usr/sbin \ + $(1)/etc/init.d \ + $(1)/etc/config \ + $(1)/etc/qosify \ + $(1)/etc/hotplug.d/net \ + $(1)/etc/hotplug.d/iface + $(INSTALL_DATA) $(PKG_BUILD_DIR)/qosify-bpf.o $(1)/lib/bpf + $(INSTALL_BIN) \ + $(PKG_INSTALL_DIR)/usr/bin/qosify \ + ./files/qosify-status \ + $(1)/usr/sbin/ + $(INSTALL_BIN) ./files/qosify.init $(1)/etc/init.d/qosify + $(INSTALL_DATA) ./files/qosify-defaults.conf $(1)/etc/qosify/00-defaults.conf + $(INSTALL_DATA) ./files/qosify.conf $(1)/etc/config/qosify + $(INSTALL_DATA) ./files/qosify.hotplug $(1)/etc/hotplug.d/net/10-qosify + $(INSTALL_DATA) ./files/qosify.hotplug $(1)/etc/hotplug.d/iface/10-qosify +endef + +$(eval $(call BuildPackage,qosify)) diff --git a/package/network/config/qosify/files/qosify-defaults.conf b/package/network/config/qosify/files/qosify-defaults.conf new file mode 100644 index 0000000000..ff8a0bef5b --- /dev/null +++ b/package/network/config/qosify/files/qosify-defaults.conf @@ -0,0 +1,17 @@ +# DNS +tcp:53 voice +tcp:5353 voice +udp:53 voice +udp:5353 voice + +# NTP +udp:123 voice + +# SSH +tcp:22 +video + +# HTTP/QUIC +tcp:80 +besteffort +tcp:443 +besteffort +udp:80 +besteffort +udp:443 +besteffort diff --git a/package/network/config/qosify/files/qosify-status b/package/network/config/qosify/files/qosify-status new file mode 100644 index 0000000000..dc58232268 --- /dev/null +++ b/package/network/config/qosify/files/qosify-status @@ -0,0 +1,70 @@ +#!/bin/sh +. /usr/share/libubox/jshn.sh + +dev_status() { + tc -s qdisc sh dev "$1" root + echo +} + +common_status() { + json_get_vars ifname ingress egress + + [ -n "$ifname" ] || return + + [ "$egress" -gt 0 ] && { + echo "egress status:" + dev_status "$ifname" + } + [ "$ingress" -gt 0 ] && { + echo "ingress status:" + dev_status "$(printf %.16s "ifb-$ifname")" + } +} + +is_active() { + json_get_vars active + + [ "${active:-0}" -gt 0 ] +} + +device_status() { + local name="$2" + + json_select "$name" + + if is_active; then + status="active" + else + status="not found" + fi + + echo "===== device $name: $status =====" + + is_active && common_status + + json_select .. +} + +interface_status() { + local name="$2" + + json_select "$name" + + if is_active; then + status="active" + elif ubus -S -t 0 wait_for "network.interface.$name"; then + status="down" + else + status="not found" + fi + + echo "===== interface $name: $status =====" + + is_active && common_status + + json_select .. +} + +json_load "$(ubus call qosify status)" +json_for_each_item device_status devices +json_for_each_item interface_status interfaces diff --git a/package/network/config/qosify/files/qosify.conf b/package/network/config/qosify/files/qosify.conf new file mode 100644 index 0000000000..7a3d0d068a --- /dev/null +++ b/package/network/config/qosify/files/qosify.conf @@ -0,0 +1,48 @@ +config defaults + list defaults /etc/qosify/*.conf + option dscp_prio video + option dscp_icmp +besteffort + option dscp_default_udp besteffort + option prio_max_avg_pkt_len 500 + +config class besteffort + option ingress CS0 + option egress CS0 + +config class bulk + option ingress LE + option egress LE + +config class video + option ingress AF41 + option egress AF41 + +config class voice + option ingress CS6 + option egress CS6 + option bulk_trigger_pps 100 + option bulk_trigger_timeout 5 + option dscp_bulk CS0 + +config interface wan + option name wan + option disabled 1 + option bandwidth_up 100mbit + option bandwidth_down 100mbit + option overhead_type none + # defaults: + option ingress 1 + option egress 1 + option mode diffserv4 + option nat 1 + option host_isolate 1 + option autorate_ingress 0 + option ingress_options "" + option egress_options "" + option options "" + +config device wandev + option disabled 1 + option name wan + option bandwidth 100mbit + diff --git a/package/network/config/qosify/files/qosify.hotplug b/package/network/config/qosify/files/qosify.hotplug new file mode 100644 index 0000000000..950812c03c --- /dev/null +++ b/package/network/config/qosify/files/qosify.hotplug @@ -0,0 +1,2 @@ +#!/bin/sh +ubus call qosify check_devices diff --git a/package/network/config/qosify/files/qosify.init b/package/network/config/qosify/files/qosify.init new file mode 100644 index 0000000000..f676d92a52 --- /dev/null +++ b/package/network/config/qosify/files/qosify.init @@ -0,0 +1,171 @@ +#!/bin/sh /etc/rc.common +# Copyright (c) 2021 OpenWrt.org + +START=19 + +USE_PROCD=1 +PROG=/usr/sbin/qosify + +add_option() { + local type="$1" + local name="$2" + + config_get val "$cfg" "$name" + + [ -n "$val" ] && json_add_$type "$name" "$val" +} + +add_flow_config() { + local cfg="$1" + + add_option string dscp_prio + add_option string dscp_bulk + add_option int bulk_trigger_timeout + add_option int bulk_trigger_pps + add_option int prio_max_avg_pkt_len +} + +add_defaults() { + cfg="$1" + + json_add_boolean reset 1 + + config_get files "$cfg" defaults + json_add_array files + for i in $files; do + json_add_string "" "$i" + done + json_close_array + + add_flow_config "$cfg" + add_option int timeout + add_option string dscp_icmp + add_option string dscp_default_udp + add_option string dscp_default_tcp +} + +add_interface() { + local cfg="$1" + + config_get_bool disabled "$cfg" disabled 0 + [ "$disabled" -gt 0 ] && return + + config_get name "$cfg" name + json_add_object "$name" + + config_get bw "$cfg" bandwidth + + config_get bw_up "$cfg" bandwidth_up + bw_up="${bw_up:-$bw}" + [ -n "$bw_up" ] && json_add_string bandwidth_up "$bw_up" + + config_get bw_down "$cfg" bandwidth_down + bw_down="${bw_down:-$bw}" + [ -n "$bw_down" ] && json_add_string bandwidth_down "$bw_down" + + add_option string bandwidth + add_option boolean ingress + add_option boolean egress + add_option string mode + add_option boolean nat + add_option boolean host_isolate + add_option boolean autorate_ingress + add_option string ingress_options + add_option string egress_options + + config_get user_options "$cfg" options + + config_get otype "$cfg" overhead_type + options= + case "$otype" in + none);; + manual) + config_get overhead "$cfg" overhead + [ -n "$overhead" ] && append options "overhead $overhead" + + config_get encap "$cfg" overhead_encap + [ -n "$encap" ] && append options "$encap" + ;; + conservative|\ + pppoa-vcmux|\ + pppoa-llc|\ + pppoe-vcmux|\ + pppoe-llcsnap|\ + bridged-vcmux|\ + bridged-llcsnap|\ + ipoa-vcmux|\ + ipoa-llcsnap|\ + pppoe-ptm|\ + bridged-ptm|\ + docsis|\ + ethernet) + append options "$otype" + ;; + esac + + config_get mpu "$cfg" overhead_mpu + [ -n "$mpu" ] && append options "mpu $mpu" + + config_get ovlan "$cfg" overhead_vlan + [ "${ovlan:-0}" -ge 2 ] && append options "ether-vlan" + [ "${ovlan:-0}" -ge 1 ] && append options "ether-vlan" + + [ -n "$user_options" ] && append options "$user_options" + [ -n "$options" ] && json_add_string options "$options" + + json_close_object +} + +add_class() { + local cfg="$1" + + config_get value "$cfg" value + config_get ingress "$cfg" ingress + config_get egress "$cfg" egress + + json_add_object "$cfg" + json_add_string ingress "${ingress:-$value}" + json_add_string egress "${egress:-$value}" + add_flow_config "$cfg" + json_close_object +} + + +reload_service() { + json_init + + config_load qosify + + config_foreach add_defaults defaults + + json_add_object interfaces + config_foreach add_interface interface + json_close_object + + json_add_object classes + config_foreach add_class class + config_foreach add_class alias + json_close_object + + json_add_object devices + config_foreach add_interface device + json_close_object + + ubus call qosify config "$(json_dump)" +} + +service_triggers() { + procd_add_reload_trigger qosify +} + +start_service() { + procd_open_instance + procd_set_param command "$PROG" + procd_set_param respawn + procd_close_instance +} + +service_started() { + ubus -t 10 wait_for qosify + [ $? = 0 ] && reload_service +} diff --git a/package/network/config/swconfig/Makefile b/package/network/config/swconfig/Makefile index 4d3e572d82..6549075e5c 100644 --- a/package/network/config/swconfig/Makefile +++ b/package/network/config/swconfig/Makefile @@ -13,6 +13,8 @@ PKG_RELEASE:=12 PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0 +PKG_BUILD_FLAGS:=lto + include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/kernel.mk @@ -23,9 +25,6 @@ define Package/swconfig TITLE:=Switch configuration utility endef -TARGET_CFLAGS += -flto -TARGET_LDFLAGS += -flto=jobserver - TARGET_CPPFLAGS := \ -D_GNU_SOURCE \ -I$(STAGING_DIR)/usr/include/libnl-tiny \ diff --git a/package/network/config/swconfig/src/uci.c b/package/network/config/swconfig/src/uci.c index f99583b483..200069f94f 100644 --- a/package/network/config/swconfig/src/uci.c +++ b/package/network/config/swconfig/src/uci.c @@ -164,32 +164,7 @@ found: struct uci_element *os; s = uci_to_section(e); - if (!strcmp(s->type, "switch_port")) { - char *devn = NULL, *port = NULL, *port_err = NULL; - int port_n; - - uci_foreach_element(&s->options, os) { - o = uci_to_option(os); - if (o->type != UCI_TYPE_STRING) - continue; - - if (!strcmp(os->name, "device")) { - devn = o->v.string; - if (!swlib_match_name(dev, devn)) - devn = NULL; - } else if (!strcmp(os->name, "port")) { - port = o->v.string; - } - } - if (!devn || !port || !port[0]) - continue; - - port_n = strtoul(port, &port_err, 0); - if (port_err && port_err[0]) - continue; - - swlib_map_settings(dev, SWLIB_ATTR_GROUP_PORT, port_n, s); - } else if (!strcmp(s->type, "switch_vlan")) { + if (!strcmp(s->type, "switch_vlan")) { char *devn = NULL, *vlan = NULL, *vlan_err = NULL; int vlan_n; @@ -216,6 +191,38 @@ found: swlib_map_settings(dev, SWLIB_ATTR_GROUP_VLAN, vlan_n, s); } } + uci_foreach_element(&p->sections, e) { + struct uci_element *os; + char *devn = NULL, *port = NULL, *port_err = NULL; + int port_n; + + s = uci_to_section(e); + + if (strcmp(s->type, "switch_port")) + continue; + + uci_foreach_element(&s->options, os) { + o = uci_to_option(os); + if (o->type != UCI_TYPE_STRING) + continue; + + if (!strcmp(os->name, "device")) { + devn = o->v.string; + if (!swlib_match_name(dev, devn)) + devn = NULL; + } else if (!strcmp(os->name, "port")) { + port = o->v.string; + } + } + if (!devn || !port || !port[0]) + continue; + + port_n = strtoul(port, &port_err, 0); + if (port_err && port_err[0]) + continue; + + swlib_map_settings(dev, SWLIB_ATTR_GROUP_PORT, port_n, s); + } for (i = 0; i < ARRAY_SIZE(early_settings); i++) { struct swlib_setting *st = &early_settings[i]; diff --git a/package/network/ipv6/odhcp6c/Makefile b/package/network/ipv6/odhcp6c/Makefile index 892c1e213b..7fc4315d70 100644 --- a/package/network/ipv6/odhcp6c/Makefile +++ b/package/network/ipv6/odhcp6c/Makefile @@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=odhcp6c -PKG_RELEASE:=18 +PKG_RELEASE:=20 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/odhcp6c.git -PKG_SOURCE_DATE:=2022-08-05 -PKG_SOURCE_VERSION:=7d21e8d8ecd6d776f64b6928f62893c0f5c9747a -PKG_MIRROR_HASH:=6d918517de4ec47d83edddb6167bb52f08b2b696f336d5055a45290bb37ac4db +PKG_SOURCE_DATE:=2023-05-12 +PKG_SOURCE_VERSION:=bcd283632ac13391aac3ebdd074d1fd832d76fa3 +PKG_MIRROR_HASH:=0f3508a5a148ca831ae30b49b21919535f9dfbbd003a942baa6cb5388d207878 PKG_MAINTAINER:=Hans Dedecker PKG_LICENSE:=GPL-2.0 diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.sh b/package/network/ipv6/odhcp6c/files/dhcpv6.sh index cf6847f29e..18c24febd6 100755 --- a/package/network/ipv6/odhcp6c/files/dhcpv6.sh +++ b/package/network/ipv6/odhcp6c/files/dhcpv6.sh @@ -34,11 +34,13 @@ proto_dhcpv6_init_config() { proto_config_add_string "vendorclass" proto_config_add_array "sendopts:list(string)" proto_config_add_boolean delegate + proto_config_add_int skpriority proto_config_add_int "soltimeout" proto_config_add_boolean fakeroutes proto_config_add_boolean sourcefilter proto_config_add_boolean keep_ra_dnslifetime proto_config_add_int "ra_holdoff" + proto_config_add_boolean verbose } proto_dhcpv6_add_prefix() { @@ -53,8 +55,8 @@ proto_dhcpv6_setup() { local config="$1" local iface="$2" - local reqaddress reqprefix clientid reqopts defaultreqopts noslaaconly forceprefix extendprefix norelease noserverunicast noclientfqdn noacceptreconfig ip6prefix ip6prefixes iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass sendopts delegate zone_dslite zone_map zone_464xlat zone encaplimit_dslite encaplimit_map soltimeout fakeroutes sourcefilter keep_ra_dnslifetime ra_holdoff - json_get_vars reqaddress reqprefix clientid reqopts defaultreqopts noslaaconly forceprefix extendprefix norelease noserverunicast noclientfqdn noacceptreconfig iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone encaplimit_dslite encaplimit_map soltimeout fakeroutes sourcefilter keep_ra_dnslifetime ra_holdoff + local reqaddress reqprefix clientid reqopts defaultreqopts noslaaconly forceprefix extendprefix norelease noserverunicast noclientfqdn noacceptreconfig ip6prefix ip6prefixes iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass sendopts delegate zone_dslite zone_map zone_464xlat zone encaplimit_dslite encaplimit_map skpriority soltimeout fakeroutes sourcefilter keep_ra_dnslifetime ra_holdoff verbose + json_get_vars reqaddress reqprefix clientid reqopts defaultreqopts noslaaconly forceprefix extendprefix norelease noserverunicast noclientfqdn noacceptreconfig iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone encaplimit_dslite encaplimit_map skpriority soltimeout fakeroutes sourcefilter keep_ra_dnslifetime ra_holdoff verbose json_for_each_item proto_dhcpv6_add_prefix ip6prefix ip6prefixes # Configure @@ -88,8 +90,12 @@ proto_dhcpv6_setup() { [ "$keep_ra_dnslifetime" = "1" ] && append opts "-L" + [ -n "$skpriority" ] && append opts "-K$skpriority" + [ -n "$ra_holdoff" ] && append opts "-m$ra_holdoff" + [ "$verbose" = "1" ] && append opts "-v" + local opt for opt in $reqopts; do append opts "-r$opt" @@ -105,6 +111,7 @@ proto_dhcpv6_setup() { [ -n "$iface_464xlat" ] && proto_export "IFACE_464XLAT=$iface_464xlat" [ "$delegate" = "0" ] && proto_export "IFACE_DSLITE_DELEGATE=0" [ "$delegate" = "0" ] && proto_export "IFACE_MAP_DELEGATE=0" + [ "$delegate" = "0" ] && proto_export "IFACE_464XLAT_DELEGATE=0" [ -n "$zone_dslite" ] && proto_export "ZONE_DSLITE=$zone_dslite" [ -n "$zone_map" ] && proto_export "ZONE_MAP=$zone_map" [ -n "$zone_464xlat" ] && proto_export "ZONE_464XLAT=$zone_464xlat" diff --git a/package/network/ipv6/thc-ipv6/Makefile b/package/network/ipv6/thc-ipv6/Makefile index 91bacf625e..b26b0507fb 100644 --- a/package/network/ipv6/thc-ipv6/Makefile +++ b/package/network/ipv6/thc-ipv6/Makefile @@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=thc-ipv6 -PKG_VERSION:=2.7 +PKG_VERSION:=3.8 PKG_RELEASE:=1 PKG_LICENSE:=GPL-3.0 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@GITHUB/vanhauser-thc/THC-Archive/master/Tools -PKG_HASH:=440a3ae98b57100c397ec4f8634468dbbb0c3b48788c6b74af2a597a90544a96 +PKG_HASH:=b60be61a8b0a944a66e3b719704b4c03c1bc2c22f32d5d21e99e434c82a9d769 PKG_MAINTAINER:=Jo-Philipp Wich @@ -31,7 +31,7 @@ THC_APPLETS := \ fuzz_dhcps6 implementation6 implementation6d inverse_lookup6 \ kill_router6 ndpexhaust6 node_query6 parasite6 passive_discovery6 \ randicmp6 redir6 rsmurf6 sendpees6 sendpeesmp6 smurf6 thcping6 \ - toobig6 trace6 + toobig6 trace6 toobigsniff6 flood_unreach6 connect6 THC_DEPENDS_dnsdict6 := +libpthread THC_DEPENDS_thcping6 := +librt diff --git a/package/network/ipv6/thc-ipv6/patches/000-cflags_override.patch b/package/network/ipv6/thc-ipv6/patches/000-cflags_override.patch deleted file mode 100644 index e1c36b6c6c..0000000000 --- a/package/network/ipv6/thc-ipv6/patches/000-cflags_override.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -urN thc-ipv6-2.7/Makefile thc-ipv6-2.7.new/Makefile ---- thc-ipv6-2.7/Makefile 2014-12-27 05:05:30.000000000 -0800 -+++ thc-ipv6-2.7.new/Makefile 2017-02-04 20:55:51.679898101 -0800 -@@ -3,7 +3,7 @@ - - CC=gcc - #CFLAGS=-g --CFLAGS=-O2 -+CFLAGS?=-O2 - CFLAGS+=$(if $(HAVE_SSL),-D_HAVE_SSL,) - LDFLAGS+=-lpcap $(if $(HAVE_SSL),-lssl -lcrypto,) - PROGRAMS=parasite6 dos-new-ip6 detect-new-ip6 fake_router6 fake_advertise6 fake_solicitate6 fake_mld6 fake_mld26 fake_mldrouter6 flood_mldrouter6 fake_mipv6 redir6 smurf6 alive6 toobig6 rsmurf6 implementation6 implementation6d sendpees6 sendpeesmp6 randicmp6 fuzz_ip6 flood_mld6 flood_mld26 flood_router6 flood_advertise6 flood_solicitate6 trace6 exploit6 denial6 fake_dhcps6 flood_dhcpc6 fake_dns6d fragmentation6 kill_router6 fake_dnsupdate6 ndpexhaust6 detect_sniffer6 dump_router6 fake_router26 flood_router26 passive_discovery6 dnsrevenum6 inverse_lookup6 node_query6 address6 covert_send6 covert_send6d inject_alive6 firewall6 ndpexhaust26 fake_pim6 thcsyn6 redirsniff6 flood_redir6 four2six dump_dhcp6 fuzz_dhcps6 flood_rs6 fuzz_dhcpc6 diff --git a/package/network/ipv6/thc-ipv6/patches/100-no-ssl.patch b/package/network/ipv6/thc-ipv6/patches/100-no-ssl.patch index 1ef1f66be8..118c2a705b 100644 --- a/package/network/ipv6/thc-ipv6/patches/100-no-ssl.patch +++ b/package/network/ipv6/thc-ipv6/patches/100-no-ssl.patch @@ -1,9 +1,10 @@ --- a/Makefile +++ b/Makefile -@@ -1,5 +1,5 @@ +@@ -1,6 +1,6 @@ # Comment out if openssl-dev is not present + # of if you want to compile statc -HAVE_SSL=yes +#HAVE_SSL=yes - CC=gcc - #CFLAGS=-g + # comment in if you want to compile static tools + #STATIC=-static diff --git a/package/network/ipv6/thc-ipv6/patches/101-remove-march-native.patch b/package/network/ipv6/thc-ipv6/patches/101-remove-march-native.patch new file mode 100644 index 0000000000..da6c7caa7c --- /dev/null +++ b/package/network/ipv6/thc-ipv6/patches/101-remove-march-native.patch @@ -0,0 +1,11 @@ +--- a/Makefile ++++ b/Makefile +@@ -7,7 +7,7 @@ HAVE_SSL=yes + + #CC=gcc + #CFLAGS=-g +-CFLAGS+=-g -O3 -march=native -flto -falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks ++CFLAGS+=-g -O3 -flto -falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks + CFLAGS+=$(if $(HAVE_SSL),-D_HAVE_SSL,) + LDFLAGS+=-lpcap $(if $(HAVE_SSL),-lssl -lcrypto,) + PROGRAMS=parasite6 dos-new-ip6 detect-new-ip6 fake_router6 fake_advertise6 fake_solicitate6 fake_mld6 fake_mld26 fake_mldrouter6 flood_mldrouter6 fake_mipv6 redir6 smurf6 alive6 toobig6 rsmurf6 implementation6 implementation6d sendpees6 sendpeesmp6 randicmp6 fuzz_ip6 flood_mld6 flood_mld26 flood_router6 flood_advertise6 flood_solicitate6 trace6 exploit6 denial6 fake_dhcps6 flood_dhcpc6 fake_dns6d fragmentation6 kill_router6 fake_dnsupdate6 ndpexhaust6 detect_sniffer6 dump_router6 fake_router26 flood_router26 passive_discovery6 dnsrevenum6 inverse_lookup6 node_query6 address6 covert_send6 covert_send6d inject_alive6 firewall6 ndpexhaust26 fake_pim6 thcsyn6 redirsniff6 flood_redir6 four2six dump_dhcp6 flood_rs6 fuzz_dhcps6 fuzz_dhcpc6 toobigsniff6 flood_unreach6 connect6 diff --git a/package/network/utils/bonding/Makefile b/package/network/services/bonding/Makefile similarity index 100% rename from package/network/utils/bonding/Makefile rename to package/network/services/bonding/Makefile diff --git a/package/network/utils/bonding/files/lib/netifd/proto/bonding.sh b/package/network/services/bonding/files/lib/netifd/proto/bonding.sh similarity index 100% rename from package/network/utils/bonding/files/lib/netifd/proto/bonding.sh rename to package/network/services/bonding/files/lib/netifd/proto/bonding.sh diff --git a/package/network/services/bridger/Makefile b/package/network/services/bridger/Makefile new file mode 100644 index 0000000000..e228de517d --- /dev/null +++ b/package/network/services/bridger/Makefile @@ -0,0 +1,62 @@ +# +# Copyright (C) 2022 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=bridger +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL=https://github.com/nbd168/bridger +PKG_SOURCE_DATE:=2023-05-12 +PKG_SOURCE_VERSION:=d0f79a16c749ad310d79e1c31f593860619f99eb +PKG_MIRROR_HASH:=bee35594767cbcd13764f5c95e4837a4fc73171a91fcdae73aaefe00f4e8f8fa + +PKG_LICENSE:=GPL-2.0 +PKG_MAINTAINER:=Felix Fietkau + +PKG_BUILD_DEPENDS:=bpf-headers + +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk +include $(INCLUDE_DIR)/bpf.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/bridger + SECTION:=utils + CATEGORY:=Base system + TITLE:=Bridge forwarding accelerator + DEPENDS:=+libbpf +libubox +libubus +libnl-tiny +kmod-sched-core +kmod-sched-flower +kmod-sched-bpf +kmod-sched-act-vlan $(BPF_DEPENDS) +endef + +TARGET_CFLAGS += \ + -I$(STAGING_DIR)/usr/include/libnl-tiny \ + -I$(STAGING_DIR)/usr/include + +CMAKE_OPTIONS += \ + -DLIBNL_LIBS=-lnl-tiny + +define Build/Compile + $(call CompileBPF,$(PKG_BUILD_DIR)/bridger-bpf.c) + $(Build/Compile/Default) +endef + +define Package/bridger/install + $(INSTALL_DIR) \ + $(1)/etc/config \ + $(1)/etc/init.d \ + $(1)/lib/bpf \ + $(1)/usr/sbin + $(INSTALL_DATA) $(PKG_BUILD_DIR)/bridger-bpf.o $(1)/lib/bpf + $(INSTALL_BIN) \ + $(PKG_INSTALL_DIR)/usr/bin/bridger \ + $(1)/usr/sbin/ + $(INSTALL_DATA) ./files/bridger.conf $(1)/etc/config/bridger + $(INSTALL_BIN) ./files/bridger.init $(1)/etc/init.d/bridger +endef + +$(eval $(call BuildPackage,bridger)) diff --git a/package/network/services/bridger/files/bridger.conf b/package/network/services/bridger/files/bridger.conf new file mode 100644 index 0000000000..cb43deff79 --- /dev/null +++ b/package/network/services/bridger/files/bridger.conf @@ -0,0 +1,3 @@ +config defaults + # example for blacklisting individual devices or bridges + # list blacklist eth0 diff --git a/package/network/services/bridger/files/bridger.init b/package/network/services/bridger/files/bridger.init new file mode 100644 index 0000000000..2ba9f06b65 --- /dev/null +++ b/package/network/services/bridger/files/bridger.init @@ -0,0 +1,44 @@ +#!/bin/sh /etc/rc.common +# Copyright (c) 2021 OpenWrt.org + +START=19 + +USE_PROCD=1 +PROG=/usr/sbin/bridger + +add_blacklist() { + cfg="$1" + + config_get blacklist "$cfg" blacklist + for i in $blacklist; do + json_add_string "" "$i" + done +} + +reload_service() { + config_load bridger + + json_init + json_add_string name "config" + json_add_array devices + config_foreach add_blacklist defaults + json_close_array + + ubus call bridger set_blacklist "$(json_dump)" +} + +service_triggers() { + procd_add_reload_trigger bridger +} + +start_service() { + procd_open_instance + procd_set_param command "$PROG" + procd_set_param respawn + procd_close_instance +} + +service_started() { + ubus -t 10 wait_for bridger + [ $? = 0 ] && reload_service +} diff --git a/package/network/services/dnsmasq/Makefile b/package/network/services/dnsmasq/Makefile index c5a8930ea7..4272398a92 100644 --- a/package/network/services/dnsmasq/Makefile +++ b/package/network/services/dnsmasq/Makefile @@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=dnsmasq -PKG_UPSTREAM_VERSION:=2.86 +PKG_UPSTREAM_VERSION:=2.89 PKG_VERSION:=$(subst test,~~test,$(subst rc,~rc,$(PKG_UPSTREAM_VERSION))) -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=4 PKG_SOURCE:=$(PKG_NAME)-$(PKG_UPSTREAM_VERSION).tar.xz -PKG_SOURCE_URL:=http://thekelleys.org.uk/dnsmasq -PKG_HASH:=28d52cfc9e2004ac4f85274f52b32e1647b4dbc9761b82e7de1e41c49907eb08 +PKG_SOURCE_URL:=https://thekelleys.org.uk/dnsmasq/ +PKG_HASH:=02bd230346cf0b9d5909f5e151df168b2707103785eb616b56685855adebb609 PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:=COPYING @@ -24,12 +24,14 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_UPSTR PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 +PKG_BUILD_FLAGS:=lto PKG_ASLR_PIE_REGULAR:=1 PKG_CONFIG_DEPENDS:= CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dhcp \ CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dhcpv6 \ CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dnssec \ CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_auth \ CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_ipset \ + CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_nftset \ CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_conntrack \ CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_noid \ CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_broken_rtc \ @@ -61,10 +63,11 @@ endef define Package/dnsmasq-full $(call Package/dnsmasq/Default) - TITLE += (with DNSSEC, DHCPv6, Auth DNS, IPset, Conntrack, NO_ID enabled by default) + TITLE += (with DNSSEC, DHCPv6, Auth DNS, IPset, Nftset, Conntrack, NO_ID enabled by default) DEPENDS+=+PACKAGE_dnsmasq_full_dnssec:libnettle \ +PACKAGE_dnsmasq_full_ipset:kmod-ipt-ipset \ - +PACKAGE_dnsmasq_full_conntrack:libnetfilter-conntrack + +PACKAGE_dnsmasq_full_conntrack:libnetfilter-conntrack \ + +PACKAGE_dnsmasq_full_nftset:nftables-json VARIANT:=full PROVIDES:=dnsmasq endef @@ -83,7 +86,7 @@ define Package/dnsmasq-full/description $(call Package/dnsmasq/description) This is a fully configurable variant with DHCPv4, DHCPv6, DNSSEC, Authoritative DNS -and IPset, Conntrack support & NO_ID enabled by default. +and nftset, Conntrack support & NO_ID enabled by default. endef define Package/dnsmasq/conffiles @@ -109,6 +112,9 @@ define Package/dnsmasq-full/config default y config PACKAGE_dnsmasq_full_ipset bool "Build with IPset support." + default n + config PACKAGE_dnsmasq_full_nftset + bool "Build with Nftset support." default y config PACKAGE_dnsmasq_full_conntrack bool "Build with Conntrack support." @@ -128,9 +134,6 @@ endef Package/dnsmasq-dhcpv6/conffiles = $(Package/dnsmasq/conffiles) Package/dnsmasq-full/conffiles = $(Package/dnsmasq/conffiles) -TARGET_CFLAGS += -flto -TARGET_LDFLAGS += -flto=jobserver - COPTS = -DHAVE_UBUS -DHAVE_POLL_H \ $(if $(CONFIG_IPV6),,-DNO_IPV6) @@ -144,6 +147,7 @@ ifeq ($(BUILD_VARIANT),full) $(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dnssec),-DHAVE_DNSSEC) \ $(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_auth),,-DNO_AUTH) \ $(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_ipset),,-DNO_IPSET) \ + $(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_nftset),-DHAVE_NFTSET,) \ $(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_conntrack),-DHAVE_CONNTRACK,) \ $(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_noid),-DNO_ID,) \ $(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_broken_rtc),-DHAVE_BROKEN_RTC) \ @@ -182,6 +186,7 @@ define Package/dnsmasq/install $(INSTALL_DATA) ./files/dnsmasq_acl.json $(1)/usr/share/acl.d/ $(INSTALL_DIR) $(1)/etc/uci-defaults $(INSTALL_BIN) ./files/50-dnsmasq-migrate-resolv-conf-auto.sh $(1)/etc/uci-defaults + $(INSTALL_BIN) ./files/50-dnsmasq-migrate-ipset.sh $(1)/etc/uci-defaults endef Package/dnsmasq-dhcpv6/install = $(Package/dnsmasq/install) diff --git a/package/network/services/dnsmasq/files/50-dnsmasq-migrate-ipset.sh b/package/network/services/dnsmasq/files/50-dnsmasq-migrate-ipset.sh new file mode 100755 index 0000000000..aba73e7dd4 --- /dev/null +++ b/package/network/services/dnsmasq/files/50-dnsmasq-migrate-ipset.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +ipsets=$(uci -q get dhcp.@dnsmasq[0].ipset) +[ -z "$ipsets" ] && exit 0 + +for ipset in $ipsets; do + names=${ipset##*/} + domains=${ipset%/*} + + [ -z "$names" ] || [ -z "$domains" ] && continue + + uci add dhcp ipset + + OLDIFS="$IFS" + + IFS="," + for name in $names; do + uci add_list dhcp.@ipset[-1].name="$name" + done + + IFS="/" + for domain in ${domains:1}; do + uci add_list dhcp.@ipset[-1].domain="$domain" + done + + IFS="$OLDIFS" + + uci del_list dhcp.@dnsmasq[0].ipset="$ipset" +done + +uci commit dhcp +exit 0 diff --git a/package/network/services/dnsmasq/files/dhcp.conf b/package/network/services/dnsmasq/files/dhcp.conf index 8c42ef782e..d5b9dfa018 100644 --- a/package/network/services/dnsmasq/files/dhcp.conf +++ b/package/network/services/dnsmasq/files/dhcp.conf @@ -10,6 +10,7 @@ config dnsmasq option domain 'lan' option expandhosts 1 option nonegcache 0 + option cachesize 1000 option authoritative 1 option readethers 1 option leasefile '/tmp/dhcp.leases' @@ -21,6 +22,9 @@ config dnsmasq #list bogusnxdomain '64.94.110.11' option localservice 1 # disable to allow DNS requests from non-local subnets option ednspacket_max 1232 + option filter_aaaa 0 + option filter_a 0 + #list addnmount /some/path # read-only mount path to expose it to dnsmasq config dhcp lan option interface lan diff --git a/package/network/services/dnsmasq/files/dnsmasq.init b/package/network/services/dnsmasq/files/dnsmasq.init index d2bcca46ed..2a3327b0c6 100755 --- a/package/network/services/dnsmasq/files/dnsmasq.init +++ b/package/network/services/dnsmasq/files/dnsmasq.init @@ -33,6 +33,7 @@ dnsmasq_ignore_opt() { [ "${dnsmasq_features#* DNSSEC }" = "$dnsmasq_features" ] || dnsmasq_has_dnssec=1 [ "${dnsmasq_features#* TFTP }" = "$dnsmasq_features" ] || dnsmasq_has_tftp=1 [ "${dnsmasq_features#* ipset }" = "$dnsmasq_features" ] || dnsmasq_has_ipset=1 + [ "${dnsmasq_features#* nftset }" = "$dnsmasq_features" ] || dnsmasq_has_nftset=1 fi case "$opt" in @@ -55,6 +56,8 @@ dnsmasq_ignore_opt() { [ -z "$dnsmasq_has_tftp" ] ;; ipset) [ -z "$dnsmasq_has_ipset" ] ;; + nftset) + [ -z "$dnsmasq_has_nftset" ] ;; *) return 1 esac @@ -169,10 +172,6 @@ append_address() { xappend "--address=$1" } -append_ipset() { - xappend "--ipset=$1" -} - append_connmark_allowlist() { xappend "--connmark-allowlist=$1" } @@ -205,8 +204,12 @@ ismounted() { return 1 } -append_addnhosts() { +append_extramount() { ismounted "$1" || append EXTRA_MOUNT "$1" +} + +append_addnhosts() { + append_extramount "$1" xappend "--addn-hosts=$1" } @@ -554,6 +557,8 @@ dhcp_add() { config_get leasetime "$cfg" leasetime 12h config_get options "$cfg" options config_get_bool dynamicdhcp "$cfg" dynamicdhcp 1 + config_get_bool dynamicdhcpv4 "$cfg" dynamicdhcpv4 $dynamicdhcp + config_get_bool dynamicdhcpv6 "$cfg" dynamicdhcpv6 $dynamicdhcp config_get dhcpv4 "$cfg" dhcpv4 config_get dhcpv6 "$cfg" dhcpv6 @@ -581,21 +586,20 @@ dhcp_add() { limit=$((limit-1)) fi - eval "$(ipcalc.sh "${subnet%%/*}" $netmask $start $limit)" + # make sure the DHCP range is not empty + if [ "$dhcpv4" != "disabled" ] && eval "$(ipcalc.sh "${subnet%%/*}" "$netmask" "$start" "$limit")" ; then + [ "$dynamicdhcpv4" = "0" ] && END="static" - if [ "$dynamicdhcp" = "0" ] ; then - END="static" + xappend "--dhcp-range=$tags$nettag$START,$END,$NETMASK,$leasetime${options:+ $options}" + fi + + if [ "$dynamicdhcpv6" = "0" ] ; then dhcp6range="::,static" else dhcp6range="::1000,::ffff" fi - if [ "$dhcpv4" != "disabled" ] ; then - xappend "--dhcp-range=$tags$nettag$START,$END,$NETMASK,$leasetime${options:+ $options}" - fi - - if [ $DNSMASQ_DHCP_VER -eq 6 ] && [ "$ra" = "server" ] ; then # Note: dnsmasq cannot just be a DHCPv6 server (all-in-1) # and let some other machine(s) send RA pointing to it. @@ -796,25 +800,54 @@ dhcp_relay_add() { dnsmasq_ipset_add() { local cfg="$1" - local ipsets domains + local ipsets nftsets domains add_ipset() { ipsets="${ipsets:+$ipsets,}$1" } + add_nftset() { + local IFS=, + for set in $1; do + local fam="$family" + [ -n "$fam" ] || fam=$(echo "$set" | sed -nre \ + 's#^.*[^0-9]([46])$|^.*[-_]([46])[-_].*$|^([46])[^0-9].*$#\1\2\3#p') + [ -n "$fam" ] || \ + fam=$(nft -t list set "$table_family" "$table" "$set" 2>&1 | sed -nre \ + 's#^\t\ttype .*\bipv([46])_addr\b.*$#\1#p') + + [ -n "$fam" ] || \ + logger -t dnsmasq "Cannot infer address family from non-existent nftables set '$set'" + + nftsets="${nftsets:+$nftsets,}${fam:+$fam#}$table_family#$table#$set" + done + } + add_domain() { # leading '/' is expected domains="$domains/$1" } + config_get table "$cfg" table 'fw4' + config_get table_family "$cfg" table_family 'inet' + if [ "$table_family" = "ip" ] ; then + family="4" + elif [ "$table_family" = "ip6" ] ; then + family="6" + else + config_get family "$cfg" family + fi + config_list_foreach "$cfg" "name" add_ipset + config_list_foreach "$cfg" "name" add_nftset config_list_foreach "$cfg" "domain" add_domain - if [ -z "$ipsets" ] || [ -z "$domains" ]; then + if [ -z "$ipsets" ] || [ -z "$nftsets" ] || [ -z "$domains" ]; then return 0 fi xappend "--ipset=$domains/$ipsets" + xappend "--nftset=$domains/$nftsets" } dnsmasq_start() @@ -932,6 +965,9 @@ dnsmasq_start() append_bool "$cfg" rapidcommit "--dhcp-rapid-commit" append_bool "$cfg" scriptarp "--script-arp" + append_bool "$cfg" filter_aaaa "--filter-AAAA" + append_bool "$cfg" filter_a "--filter-A" + append_parm "$cfg" logfacility "--log-facility" config_get logfacility "$cfg" "logfacility" append_parm "$cfg" cachesize "--cache-size" @@ -948,7 +984,6 @@ dnsmasq_start() config_list_foreach "$cfg" "server" append_server config_list_foreach "$cfg" "rev_server" append_rev_server config_list_foreach "$cfg" "address" append_address - config_list_foreach "$cfg" "ipset" append_ipset local connmark_allowlist_enable config_get connmark_allowlist_enable "$cfg" connmark_allowlist_enable 0 @@ -1141,7 +1176,6 @@ dnsmasq_start() config_foreach filter_dnsmasq ipset dnsmasq_ipset_add "$cfg" echo >> $CONFIGFILE_TMP - echo >> $CONFIGFILE_TMP mv -f $CONFIGFILE_TMP $CONFIGFILE mv -f $HOSTFILE_TMP $HOSTFILE @@ -1157,6 +1191,8 @@ dnsmasq_start() done } + config_list_foreach "$cfg" addnmount append_extramount + procd_open_instance $cfg procd_set_param command $PROG -C $CONFIGFILE -k -x /var/run/dnsmasq/dnsmasq."${cfg}".pid procd_set_param file $CONFIGFILE diff --git a/package/network/services/dnsmasq/patches/001-CVE-2022-0934-Fix-write-after-free-error-in-DHCPv6-code.patch b/package/network/services/dnsmasq/patches/001-CVE-2022-0934-Fix-write-after-free-error-in-DHCPv6-code.patch deleted file mode 100644 index 4113be99aa..0000000000 --- a/package/network/services/dnsmasq/patches/001-CVE-2022-0934-Fix-write-after-free-error-in-DHCPv6-code.patch +++ /dev/null @@ -1,179 +0,0 @@ -From 03345ecefeb0d82e3c3a4c28f27c3554f0611b39 Mon Sep 17 00:00:00 2001 -From: Simon Kelley -Date: Thu, 31 Mar 2022 21:35:20 +0100 -Subject: Fix write-after-free error in DHCPv6 code. CVE-2022-0934 refers. - ---- - CHANGELOG | 3 +++ - src/rfc3315.c | 48 +++++++++++++++++++++++++++--------------------- - 2 files changed, 30 insertions(+), 21 deletions(-) - ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -92,6 +92,9 @@ version 2.86 - of filename). Thanks to Ed Wildgoose for the initial patch - and motivation for this. - -+ Fix write-after-free error in DHCPv6 server code. -+ CVE-2022-0934 refers. -+ - - version 2.85 - Fix problem with DNS retries in 2.83/2.84. ---- a/src/rfc3315.c -+++ b/src/rfc3315.c -@@ -33,9 +33,9 @@ struct state { - unsigned int mac_len, mac_type; - }; - --static int dhcp6_maybe_relay(struct state *state, void *inbuff, size_t sz, -+static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t sz, - struct in6_addr *client_addr, int is_unicast, time_t now); --static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_t sz, int is_unicast, time_t now); -+static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbuff, size_t sz, int is_unicast, time_t now); - static void log6_opts(int nest, unsigned int xid, void *start_opts, void *end_opts); - static void log6_packet(struct state *state, char *type, struct in6_addr *addr, char *string); - static void log6_quiet(struct state *state, char *type, struct in6_addr *addr, char *string); -@@ -104,12 +104,12 @@ unsigned short dhcp6_reply(struct dhcp_c - } - - /* This cost me blood to write, it will probably cost you blood to understand - srk. */ --static int dhcp6_maybe_relay(struct state *state, void *inbuff, size_t sz, -+static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t sz, - struct in6_addr *client_addr, int is_unicast, time_t now) - { - void *end = inbuff + sz; - void *opts = inbuff + 34; -- int msg_type = *((unsigned char *)inbuff); -+ int msg_type = *inbuff; - unsigned char *outmsgtypep; - void *opt; - struct dhcp_vendor *vendor; -@@ -259,15 +259,15 @@ static int dhcp6_maybe_relay(struct stat - return 1; - } - --static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_t sz, int is_unicast, time_t now) -+static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbuff, size_t sz, int is_unicast, time_t now) - { - void *opt; -- int i, o, o1, start_opts; -+ int i, o, o1, start_opts, start_msg; - struct dhcp_opt *opt_cfg; - struct dhcp_netid *tagif; - struct dhcp_config *config = NULL; - struct dhcp_netid known_id, iface_id, v6_id; -- unsigned char *outmsgtypep; -+ unsigned char outmsgtype; - struct dhcp_vendor *vendor; - struct dhcp_context *context_tmp; - struct dhcp_mac *mac_opt; -@@ -296,12 +296,13 @@ static int dhcp6_no_relay(struct state * - v6_id.next = state->tags; - state->tags = &v6_id; - -- /* copy over transaction-id, and save pointer to message type */ -- if (!(outmsgtypep = put_opt6(inbuff, 4))) -+ start_msg = save_counter(-1); -+ /* copy over transaction-id */ -+ if (!put_opt6(inbuff, 4)) - return 0; - start_opts = save_counter(-1); -- state->xid = outmsgtypep[3] | outmsgtypep[2] << 8 | outmsgtypep[1] << 16; -- -+ state->xid = inbuff[3] | inbuff[2] << 8 | inbuff[1] << 16; -+ - /* We're going to be linking tags from all context we use. - mark them as unused so we don't link one twice and break the list */ - for (context_tmp = state->context; context_tmp; context_tmp = context_tmp->current) -@@ -347,7 +348,7 @@ static int dhcp6_no_relay(struct state * - (msg_type == DHCP6REQUEST || msg_type == DHCP6RENEW || msg_type == DHCP6RELEASE || msg_type == DHCP6DECLINE)) - - { -- *outmsgtypep = DHCP6REPLY; -+ outmsgtype = DHCP6REPLY; - o1 = new_opt6(OPTION6_STATUS_CODE); - put_opt6_short(DHCP6USEMULTI); - put_opt6_string("Use multicast"); -@@ -619,11 +620,11 @@ static int dhcp6_no_relay(struct state * - struct dhcp_netid *solicit_tags; - struct dhcp_context *c; - -- *outmsgtypep = DHCP6ADVERTISE; -+ outmsgtype = DHCP6ADVERTISE; - - if (opt6_find(state->packet_options, state->end, OPTION6_RAPID_COMMIT, 0)) - { -- *outmsgtypep = DHCP6REPLY; -+ outmsgtype = DHCP6REPLY; - state->lease_allocate = 1; - o = new_opt6(OPTION6_RAPID_COMMIT); - end_opt6(o); -@@ -809,7 +810,7 @@ static int dhcp6_no_relay(struct state * - int start = save_counter(-1); - - /* set reply message type */ -- *outmsgtypep = DHCP6REPLY; -+ outmsgtype = DHCP6REPLY; - state->lease_allocate = 1; - - log6_quiet(state, "DHCPREQUEST", NULL, ignore ? _("ignored") : NULL); -@@ -924,7 +925,7 @@ static int dhcp6_no_relay(struct state * - int address_assigned = 0; - - /* set reply message type */ -- *outmsgtypep = DHCP6REPLY; -+ outmsgtype = DHCP6REPLY; - - log6_quiet(state, msg_type == DHCP6RENEW ? "DHCPRENEW" : "DHCPREBIND", NULL, NULL); - -@@ -1057,7 +1058,7 @@ static int dhcp6_no_relay(struct state * - int good_addr = 0; - - /* set reply message type */ -- *outmsgtypep = DHCP6REPLY; -+ outmsgtype = DHCP6REPLY; - - log6_quiet(state, "DHCPCONFIRM", NULL, NULL); - -@@ -1121,7 +1122,7 @@ static int dhcp6_no_relay(struct state * - log6_quiet(state, "DHCPINFORMATION-REQUEST", NULL, ignore ? _("ignored") : state->hostname); - if (ignore) - return 0; -- *outmsgtypep = DHCP6REPLY; -+ outmsgtype = DHCP6REPLY; - tagif = add_options(state, 1); - break; - } -@@ -1130,7 +1131,7 @@ static int dhcp6_no_relay(struct state * - case DHCP6RELEASE: - { - /* set reply message type */ -- *outmsgtypep = DHCP6REPLY; -+ outmsgtype = DHCP6REPLY; - - log6_quiet(state, "DHCPRELEASE", NULL, NULL); - -@@ -1195,7 +1196,7 @@ static int dhcp6_no_relay(struct state * - case DHCP6DECLINE: - { - /* set reply message type */ -- *outmsgtypep = DHCP6REPLY; -+ outmsgtype = DHCP6REPLY; - - log6_quiet(state, "DHCPDECLINE", NULL, NULL); - -@@ -1275,7 +1276,12 @@ static int dhcp6_no_relay(struct state * - } - - } -- -+ -+ /* Fill in the message type. Note that we store the offset, -+ not a direct pointer, since the packet memory may have been -+ reallocated. */ -+ ((unsigned char *)(daemon->outpacket.iov_base))[start_msg] = outmsgtype; -+ - log_tags(tagif, state->xid); - log6_opts(0, state->xid, daemon->outpacket.iov_base + start_opts, daemon->outpacket.iov_base + save_counter(-1)); - diff --git a/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch b/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch index 4f8fe4ecbe..59b8d02c0e 100644 --- a/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch +++ b/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch @@ -13,7 +13,7 @@ Signed-off-by: Kevin Darbyshire-Bryant --- a/src/dnsmasq.c +++ b/src/dnsmasq.c -@@ -95,10 +95,6 @@ int main (int argc, char **argv) +@@ -103,10 +103,6 @@ int main (int argc, char **argv) read_opts(argc, argv, compile_opts); @@ -26,7 +26,7 @@ Signed-off-by: Kevin Darbyshire-Bryant --- a/src/dnsmasq.h +++ b/src/dnsmasq.h -@@ -1201,7 +1201,7 @@ extern struct daemon { +@@ -1248,7 +1248,7 @@ extern struct daemon { int inotifyfd; #endif #if defined(HAVE_LINUX_NETWORK) @@ -35,7 +35,7 @@ Signed-off-by: Kevin Darbyshire-Bryant #elif defined(HAVE_BSD_NETWORK) int dhcp_raw_fd, dhcp_icmp_fd, routefd; #endif -@@ -1388,9 +1388,6 @@ int read_write(int fd, unsigned char *pa +@@ -1453,9 +1453,6 @@ int read_write(int fd, unsigned char *pa void close_fds(long max_fd, int spare1, int spare2, int spare3); int wildcard_match(const char* wildcard, const char* match); int wildcard_matchn(const char* wildcard, const char* match, int num); @@ -140,7 +140,7 @@ Signed-off-by: Kevin Darbyshire-Bryant my_syslog(LOG_ERR, _("failed to update ipset %s: %s"), setname, strerror(errno)); --- a/src/util.c +++ b/src/util.c -@@ -796,22 +796,3 @@ int wildcard_matchn(const char* wildcard +@@ -855,22 +855,3 @@ int wildcard_matchn(const char* wildcard return (!num) || (*wildcard == *match); } diff --git a/package/network/services/dnsmasq/patches/200-ubus_dns.patch b/package/network/services/dnsmasq/patches/200-ubus_dns.patch index b8c4e44952..8a70bb8bdf 100644 --- a/package/network/services/dnsmasq/patches/200-ubus_dns.patch +++ b/package/network/services/dnsmasq/patches/200-ubus_dns.patch @@ -1,6 +1,6 @@ --- a/src/dnsmasq.h +++ b/src/dnsmasq.h -@@ -1564,14 +1564,26 @@ void emit_dbus_signal(int action, struct +@@ -1631,14 +1631,26 @@ void emit_dbus_signal(int action, struct /* ubus.c */ #ifdef HAVE_UBUS @@ -151,7 +151,7 @@ if (!ADD_RDLEN(header, p, qlen, rdlen)) return 0; /* bad packet */ } -@@ -563,7 +632,7 @@ int extract_addresses(struct dns_header +@@ -570,7 +639,7 @@ int extract_addresses(struct dns_header cache_start_insert(); /* find_soa is needed for dns_doctor side effects, so don't call it lazily if there are any. */ @@ -269,7 +269,7 @@ struct ubus_context *ubus = (struct ubus_context *)daemon->ubus; --- a/src/dnsmasq.c +++ b/src/dnsmasq.c -@@ -1972,6 +1972,10 @@ static void check_dns_listeners(time_t n +@@ -2003,6 +2003,10 @@ static void check_dns_listeners(time_t n daemon->pipe_to_parent = pipefd[1]; } diff --git a/package/network/services/dropbear/Makefile b/package/network/services/dropbear/Makefile index eaf14c5533..e98e995ba7 100644 --- a/package/network/services/dropbear/Makefile +++ b/package/network/services/dropbear/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=dropbear PKG_VERSION:=2022.82 -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=5 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:= \ @@ -23,7 +23,7 @@ PKG_CPE_ID:=cpe:/a:matt_johnston:dropbear_ssh_server PKG_BUILD_PARALLEL:=1 PKG_ASLR_PIE_REGULAR:=1 -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 gc-sections lto PKG_FIXUP:=autoreconf PKG_FLAGS:=nonshared @@ -142,8 +142,7 @@ DB_OPT_CONFIG = \ DROPBEAR_SVR_AGENTFWD|CONFIG_DROPBEAR_AGENTFORWARD|1|0 \ -TARGET_CFLAGS += -DARGTYPE=3 -ffunction-sections -fdata-sections -flto -TARGET_LDFLAGS += -Wl,--gc-sections -flto=jobserver +TARGET_CFLAGS += -DARGTYPE=3 db_opt_add =echo '\#define $(1) $(2)' >> $(PKG_BUILD_DIR)/localoptions.h db_opt_replace =$(ESED) 's,^(\#define $(1)) .*$$$$,\1 $(2),g' $(PKG_BUILD_DIR)/sysoptions.h diff --git a/package/network/services/dropbear/files/dropbear.failsafe b/package/network/services/dropbear/files/dropbear.failsafe index a98ede459a..97bd12d58a 100755 --- a/package/network/services/dropbear/files/dropbear.failsafe +++ b/package/network/services/dropbear/files/dropbear.failsafe @@ -1,8 +1,9 @@ #!/bin/sh failsafe_dropbear () { - dropbearkey -t rsa -s 1024 -f /tmp/dropbear_failsafe_host_key - dropbear -r /tmp/dropbear_failsafe_host_key <> /dev/null 2>&1 + dropbearkey -t rsa -s 1024 -f /tmp/dropbear_rsa_failsafe_host_key + dropbearkey -t ed25519 -f /tmp/dropbear_ed25519_failsafe_host_key + dropbear -r /tmp/dropbear_rsa_failsafe_host_key -r /tmp/dropbear_ed25519_failsafe_host_key <> /dev/null 2>&1 } boot_hook_add failsafe failsafe_dropbear diff --git a/package/network/services/dropbear/files/dropbear.init b/package/network/services/dropbear/files/dropbear.init index ea4cad2a8d..b82e967cbc 100755 --- a/package/network/services/dropbear/files/dropbear.init +++ b/package/network/services/dropbear/files/dropbear.init @@ -119,6 +119,7 @@ validate_section_dropbear() 'enable:bool:1' \ 'Interface:string' \ 'GatewayPorts:bool:0' \ + 'ForceCommand:string' \ 'RootPasswordAuth:bool:1' \ 'RootLogin:bool:1' \ 'rsakeyfile:file' \ @@ -158,6 +159,7 @@ dropbear_instance() procd_set_param command "$PROG" -F -P "$pid_file" [ "${PasswordAuth}" -eq 0 ] && procd_append_param command -s [ "${GatewayPorts}" -eq 1 ] && procd_append_param command -a + [ -n "${ForceCommand}" ] && procd_append_param command -c "${ForceCommand}" [ "${RootPasswordAuth}" -eq 0 ] && procd_append_param command -g [ "${RootLogin}" -eq 0 ] && procd_append_param command -w if [ -n "${rsakeyfile}" ]; then diff --git a/package/network/services/hostapd/Config.in b/package/network/services/hostapd/Config.in index 5c00f3e24e..87ad7e093e 100644 --- a/package/network/services/hostapd/Config.in +++ b/package/network/services/hostapd/Config.in @@ -4,20 +4,25 @@ config WPA_RFKILL_SUPPORT depends on PACKAGE_wpa-supplicant || \ PACKAGE_wpa-supplicant-openssl || \ PACKAGE_wpa-supplicant-wolfssl || \ + PACKAGE_wpa-supplicant-mbedtls || \ PACKAGE_wpa-supplicant-mesh-openssl || \ PACKAGE_wpa-supplicant-mesh-wolfssl || \ + PACKAGE_wpa-supplicant-mesh-mbedtls || \ PACKAGE_wpa-supplicant-basic || \ PACKAGE_wpa-supplicant-mini || \ PACKAGE_wpa-supplicant-p2p || \ PACKAGE_wpad || \ PACKAGE_wpad-openssl || \ PACKAGE_wpad-wolfssl || \ + PACKAGE_wpad-mbedtls || \ PACKAGE_wpad-basic || \ PACKAGE_wpad-basic-openssl || \ PACKAGE_wpad-basic-wolfssl || \ + PACKAGE_wpad-basic-mbedtls || \ PACKAGE_wpad-mini || \ PACKAGE_wpad-mesh-openssl || \ - PACKAGE_wpad-mesh-wolfssl + PACKAGE_wpad-mesh-wolfssl || \ + PACKAGE_wpad-mesh-mbedtls default n config WPA_MSG_MIN_PRIORITY @@ -25,20 +30,25 @@ config WPA_MSG_MIN_PRIORITY depends on PACKAGE_wpa-supplicant || \ PACKAGE_wpa-supplicant-openssl || \ PACKAGE_wpa-supplicant-wolfssl || \ + PACKAGE_wpa-supplicant-mbedtls || \ PACKAGE_wpa-supplicant-mesh-openssl || \ PACKAGE_wpa-supplicant-mesh-wolfssl || \ + PACKAGE_wpa-supplicant-mesh-mbedtls || \ PACKAGE_wpa-supplicant-basic || \ PACKAGE_wpa-supplicant-mini || \ PACKAGE_wpa-supplicant-p2p || \ PACKAGE_wpad || \ PACKAGE_wpad-openssl || \ PACKAGE_wpad-wolfssl || \ + PACKAGE_wpad-mbedtls || \ PACKAGE_wpad-basic || \ PACKAGE_wpad-basic-openssl || \ PACKAGE_wpad-basic-wolfssl || \ + PACKAGE_wpad-basic-mbedtls || \ PACKAGE_wpad-mini || \ PACKAGE_wpad-mesh-openssl || \ - PACKAGE_wpad-mesh-wolfssl + PACKAGE_wpad-mesh-wolfssl || \ + PACKAGE_wpad-mesh-mbedtls default 3 help Useful values are: @@ -63,14 +73,6 @@ config WPA_WOLFSSL select WOLFSSL_HAS_SESSION_TICKET select WOLFSSL_HAS_WPAS -config DRIVER_WEXT_SUPPORT - bool - default n - -config DRIVER_11N_SUPPORT - bool - default n - config DRIVER_11AC_SUPPORT bool default n @@ -78,6 +80,7 @@ config DRIVER_11AC_SUPPORT config DRIVER_11AX_SUPPORT bool default n + select WPA_MBO_SUPPORT config WPA_ENABLE_WEP bool "Enable support for unsecure and obsolete WEP" @@ -87,3 +90,19 @@ config WPA_ENABLE_WEP for anything anymore. The functionality needed to use WEP is available in the current hostapd release under this optional build parameter and completely removed in a future release. + +config WPA_MBO_SUPPORT + bool "Multi Band Operation (Agile Multiband)" + default PACKAGE_wpa-supplicant || \ + PACKAGE_wpa-supplicant-openssl || \ + PACKAGE_wpa-supplicant-wolfssl || \ + PACKAGE_wpa-supplicant-mbedtls || \ + PACKAGE_wpad || \ + PACKAGE_wpad-openssl || \ + PACKAGE_wpad-wolfssl || \ + PACKAGE_wpad-mbedtls + help + Multi Band Operation aka (Agile Multiband) enables features + that facilitate efficient use of multiple frequency bands. + Enabling MBO on an AP using RSN requires 802.11w to be enabled. + Hostapd will refuse to start if MBO and RSN are enabled without 11w. diff --git a/package/network/services/hostapd/Makefile b/package/network/services/hostapd/Makefile index 0e60c1481e..c5a1b1f757 100644 --- a/package/network/services/hostapd/Makefile +++ b/package/network/services/hostapd/Makefile @@ -5,13 +5,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=hostapd -PKG_RELEASE:=$(AUTORELEASE).1 +PKG_RELEASE:=6 PKG_SOURCE_URL:=http://w1.fi/hostap.git PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2022-01-16 -PKG_SOURCE_VERSION:=cff80b4f7d3c0a47c052e8187d671710f48939e4 -PKG_MIRROR_HASH:=712965bfa11a2e601d3e1c9a51a2cf3cffc6db89abafb3df3eb0cfd83c64705b +PKG_SOURCE_DATE:=2023-09-08 +PKG_SOURCE_VERSION:=e5ccbfc69ecf297590341ae8b461edba9d8e964c +PKG_MIRROR_HASH:=fcc6550f46c7f8bbdbf71e63f8f699b9a0878565ad1b90a17855f5ec21283b8f PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=BSD-3-Clause @@ -21,18 +21,16 @@ PKG_BUILD_PARALLEL:=1 PKG_ASLR_PIE_REGULAR:=1 PKG_CONFIG_DEPENDS:= \ - CONFIG_PACKAGE_kmod-ath9k \ - CONFIG_PACKAGE_kmod-cfg80211 \ CONFIG_PACKAGE_hostapd \ CONFIG_PACKAGE_hostapd-basic \ CONFIG_PACKAGE_hostapd-mini \ CONFIG_WPA_RFKILL_SUPPORT \ - CONFIG_DRIVER_WEXT_SUPPORT \ - CONFIG_DRIVER_11N_SUPPORT \ CONFIG_DRIVER_11AC_SUPPORT \ CONFIG_DRIVER_11AX_SUPPORT \ CONFIG_WPA_ENABLE_WEP +PKG_BUILD_FLAGS:=gc-sections lto + EAPOL_TEST_PROVIDERS:=eapol-test eapol-test-openssl eapol-test-wolfssl SUPPLICANT_PROVIDERS:= @@ -53,14 +51,16 @@ LOCAL_AND_LIB_VARIANT=$(patsubst hostapd-%,%,\ LOCAL_VARIANT=$(patsubst %-internal,%,\ $(patsubst %-openssl,%,\ $(patsubst %-wolfssl,%,\ + $(patsubst %-mbedtls,%,\ $(LOCAL_AND_LIB_VARIANT)\ - ))) + )))) SSL_VARIANT=$(strip \ $(if $(findstring openssl,$(LOCAL_AND_LIB_VARIANT)),openssl,\ $(if $(findstring wolfssl,$(LOCAL_AND_LIB_VARIANT)),wolfssl,\ + $(if $(findstring mbedtls,$(LOCAL_AND_LIB_VARIANT)),mbedtls,\ internal\ - ))) + )))) CONFIG_VARIANT:=$(LOCAL_VARIANT) ifeq ($(LOCAL_VARIANT),mesh) @@ -71,11 +71,6 @@ include $(INCLUDE_DIR)/package.mk STAMP_CONFIGURED:=$(STAMP_CONFIGURED)_$(CONFIG_WPA_MSG_MIN_PRIORITY) - -ifneq ($(CONFIG_DRIVER_11N_SUPPORT),) - HOSTAPD_IEEE80211N:=y -endif - ifneq ($(CONFIG_DRIVER_11AC_SUPPORT),) HOSTAPD_IEEE80211AC:=y endif @@ -84,13 +79,15 @@ ifneq ($(CONFIG_DRIVER_11AX_SUPPORT),) HOSTAPD_IEEE80211AX:=y endif +CORE_DEPENDS = +ucode +libubus +libucode +ucode-mod-fs +ucode-mod-nl80211 +ucode-mod-rtnl +ucode-mod-ubus +ucode-mod-uloop +libblobmsg-json +OPENSSL_DEPENDS = +PACKAGE_$(1):libopenssl +PACKAGE_$(1):libopenssl-legacy + DRIVER_MAKEOPTS= \ - CONFIG_ACS=$(CONFIG_PACKAGE_kmod-cfg80211) \ - CONFIG_DRIVER_NL80211=$(CONFIG_PACKAGE_kmod-cfg80211) \ - CONFIG_IEEE80211N=$(HOSTAPD_IEEE80211N) \ + CONFIG_ACS=y CONFIG_DRIVER_NL80211=y \ CONFIG_IEEE80211AC=$(HOSTAPD_IEEE80211AC) \ CONFIG_IEEE80211AX=$(HOSTAPD_IEEE80211AX) \ - CONFIG_DRIVER_WEXT=$(CONFIG_DRIVER_WEXT_SUPPORT) \ + CONFIG_MBO=$(CONFIG_WPA_MBO_SUPPORT) \ + CONFIG_UCODE=y ifeq ($(SSL_VARIANT),openssl) DRIVER_MAKEOPTS += CONFIG_TLS=openssl CONFIG_SAE=y @@ -122,18 +119,28 @@ ifeq ($(SSL_VARIANT),wolfssl) endif endif +ifeq ($(SSL_VARIANT),mbedtls) + DRIVER_MAKEOPTS += CONFIG_TLS=mbedtls CONFIG_SAE=y + TARGET_LDFLAGS += -lmbedcrypto -lmbedx509 -lmbedtls + + ifeq ($(LOCAL_VARIANT),basic) + DRIVER_MAKEOPTS += CONFIG_OWE=y + endif + ifeq ($(LOCAL_VARIANT),mesh) + DRIVER_MAKEOPTS += CONFIG_AP=y CONFIG_MESH=y CONFIG_WPS_NFC=1 + endif + ifeq ($(LOCAL_VARIANT),full) + DRIVER_MAKEOPTS += CONFIG_OWE=y CONFIG_SUITEB192=y CONFIG_AP=y CONFIG_MESH=y CONFIG_WPS_NFC=1 + endif +endif + ifneq ($(LOCAL_TYPE),hostapd) ifdef CONFIG_WPA_RFKILL_SUPPORT DRIVER_MAKEOPTS += NEED_RFKILL=y endif endif -ifdef CONFIG_USE_GLIBC - TARGET_LDFLAGS += -lrt - TARGET_LDFLAGS_C += -lrt -endif - -DRV_DEPENDS:=+PACKAGE_kmod-cfg80211:libnl-tiny +DRV_DEPENDS:=+libnl-tiny define Package/hostapd/Default @@ -142,7 +149,7 @@ define Package/hostapd/Default SUBMENU:=WirelessAPD TITLE:=IEEE 802.1x Authenticator URL:=http://hostap.epitest.fi/ - DEPENDS:=$(DRV_DEPENDS) +hostapd-common +libubus + DEPENDS:=$(DRV_DEPENDS) +hostapd-common $(CORE_DEPENDS) EXTRA_DEPENDS:=hostapd-common (=$(PKG_VERSION)-$(PKG_RELEASE)) USERID:=network=101:network=101 PROVIDES:=hostapd @@ -165,7 +172,7 @@ define Package/hostapd-openssl $(call Package/hostapd/Default,$(1)) TITLE+= (OpenSSL full) VARIANT:=full-openssl - DEPENDS+=+libopenssl + DEPENDS+=$(OPENSSL_DEPENDS) endef Package/hostapd-openssl/description = $(Package/hostapd/description) @@ -174,11 +181,20 @@ define Package/hostapd-wolfssl $(call Package/hostapd/Default,$(1)) TITLE+= (wolfSSL full) VARIANT:=full-wolfssl - DEPENDS+=+libwolfssl + DEPENDS+=+PACKAGE_hostapd-wolfssl:libwolfssl endef Package/hostapd-wolfssl/description = $(Package/hostapd/description) +define Package/hostapd-mbedtls +$(call Package/hostapd/Default,$(1)) + TITLE+= (mbedTLS full) + VARIANT:=full-mbedtls + DEPENDS+=+PACKAGE_hostapd-mbedtls:libmbedtls +endef + +Package/hostapd-mbedtls/description = $(Package/hostapd/description) + define Package/hostapd-basic $(call Package/hostapd/Default,$(1)) TITLE+= (WPA-PSK, 11r, 11w) @@ -193,7 +209,7 @@ define Package/hostapd-basic-openssl $(call Package/hostapd/Default,$(1)) TITLE+= (WPA-PSK, 11r and 11w) VARIANT:=basic-openssl - DEPENDS+=+libopenssl + DEPENDS+=+PACKAGE_hostapd-basic-openssl:libopenssl endef define Package/hostapd-basic-openssl/description @@ -204,13 +220,24 @@ define Package/hostapd-basic-wolfssl $(call Package/hostapd/Default,$(1)) TITLE+= (WPA-PSK, 11r and 11w) VARIANT:=basic-wolfssl - DEPENDS+=+libwolfssl + DEPENDS+=+PACKAGE_hostapd-basic-wolfssl:libwolfssl endef define Package/hostapd-basic-wolfssl/description This package contains a basic IEEE 802.1x/WPA Authenticator with WPA-PSK, 802.11r and 802.11w support. endef +define Package/hostapd-basic-mbedtls +$(call Package/hostapd/Default,$(1)) + TITLE+= (WPA-PSK, 11r and 11w) + VARIANT:=basic-mbedtls + DEPENDS+=+PACKAGE_hostapd-basic-mbedtls:libmbedtls +endef + +define Package/hostapd-basic-mbedtls/description + This package contains a basic IEEE 802.1x/WPA Authenticator with WPA-PSK, 802.11r and 802.11w support. +endef + define Package/hostapd-mini $(call Package/hostapd/Default,$(1)) TITLE+= (WPA-PSK only) @@ -227,7 +254,7 @@ define Package/wpad/Default CATEGORY:=Network SUBMENU:=WirelessAPD TITLE:=IEEE 802.1x Auth/Supplicant - DEPENDS:=$(DRV_DEPENDS) +hostapd-common +libubus + DEPENDS:=$(DRV_DEPENDS) +hostapd-common $(CORE_DEPENDS) EXTRA_DEPENDS:=hostapd-common (=$(PKG_VERSION)-$(PKG_RELEASE)) USERID:=network=101:network=101 URL:=http://hostap.epitest.fi/ @@ -252,7 +279,7 @@ define Package/wpad-openssl $(call Package/wpad/Default,$(1)) TITLE+= (OpenSSL full) VARIANT:=wpad-full-openssl - DEPENDS+=+libopenssl + DEPENDS+=$(OPENSSL_DEPENDS) endef Package/wpad-openssl/description = $(Package/wpad/description) @@ -261,11 +288,20 @@ define Package/wpad-wolfssl $(call Package/wpad/Default,$(1)) TITLE+= (wolfSSL full) VARIANT:=wpad-full-wolfssl - DEPENDS+=+libwolfssl + DEPENDS+=+PACKAGE_wpad-wolfssl:libwolfssl endef Package/wpad-wolfssl/description = $(Package/wpad/description) +define Package/wpad-mbedtls +$(call Package/wpad/Default,$(1)) + TITLE+= (mbedTLS full) + VARIANT:=wpad-full-mbedtls + DEPENDS+=+PACKAGE_wpad-mbedtls:libmbedtls +endef + +Package/wpad-mbedtls/description = $(Package/wpad/description) + define Package/wpad-basic $(call Package/wpad/Default,$(1)) TITLE+= (WPA-PSK, 11r, 11w) @@ -280,7 +316,7 @@ define Package/wpad-basic-openssl $(call Package/wpad/Default,$(1)) TITLE+= (OpenSSL, 11r, 11w) VARIANT:=wpad-basic-openssl - DEPENDS+=+libopenssl + DEPENDS+=$(OPENSSL_DEPENDS) endef define Package/wpad-basic-openssl/description @@ -291,13 +327,24 @@ define Package/wpad-basic-wolfssl $(call Package/wpad/Default,$(1)) TITLE+= (wolfSSL, 11r, 11w) VARIANT:=wpad-basic-wolfssl - DEPENDS+=+libwolfssl + DEPENDS+=+PACKAGE_wpad-basic-wolfssl:libwolfssl endef define Package/wpad-basic-wolfssl/description This package contains a basic IEEE 802.1x/WPA Authenticator and Supplicant with WPA-PSK, SAE (WPA3-Personal), 802.11r and 802.11w support. endef +define Package/wpad-basic-mbedtls +$(call Package/wpad/Default,$(1)) + TITLE+= (mbedTLS, 11r, 11w) + VARIANT:=wpad-basic-mbedtls + DEPENDS+=+PACKAGE_wpad-basic-mbedtls:libmbedtls +endef + +define Package/wpad-basic-mbedtls/description + This package contains a basic IEEE 802.1x/WPA Authenticator and Supplicant with WPA-PSK, SAE (WPA3-Personal), 802.11r and 802.11w support. +endef + define Package/wpad-mini $(call Package/wpad/Default,$(1)) TITLE+= (WPA-PSK only) @@ -310,7 +357,7 @@ endef define Package/wpad-mesh $(call Package/wpad/Default,$(1)) - DEPENDS+=@PACKAGE_kmod-cfg80211 @(!TARGET_uml||BROKEN) + DEPENDS+=@(!TARGET_uml||BROKEN) PROVIDES+=wpa-supplicant-mesh wpad-mesh endef @@ -321,7 +368,7 @@ endef define Package/wpad-mesh-openssl $(call Package/wpad-mesh,$(1)) TITLE+= (OpenSSL, 11s, SAE) - DEPENDS+=+libopenssl + DEPENDS+=$(OPENSSL_DEPENDS) VARIANT:=wpad-mesh-openssl endef @@ -330,12 +377,21 @@ Package/wpad-mesh-openssl/description = $(Package/wpad-mesh/description) define Package/wpad-mesh-wolfssl $(call Package/wpad-mesh,$(1)) TITLE+= (wolfSSL, 11s, SAE) - DEPENDS+=+libwolfssl + DEPENDS+=+PACKAGE_wpad-mesh-wolfssl:libwolfssl VARIANT:=wpad-mesh-wolfssl endef Package/wpad-mesh-wolfssl/description = $(Package/wpad-mesh/description) +define Package/wpad-mesh-mbedtls +$(call Package/wpad-mesh,$(1)) + TITLE+= (mbedTLS, 11s, SAE) + DEPENDS+=+PACKAGE_wpad-mesh-mbedtls:libmbedtls + VARIANT:=wpad-mesh-mbedtls +endef + +Package/wpad-mesh-mbedtls/description = $(Package/wpad-mesh/description) + define Package/wpa-supplicant/Default SECTION:=net @@ -343,7 +399,7 @@ define Package/wpa-supplicant/Default SUBMENU:=WirelessAPD TITLE:=WPA Supplicant URL:=http://hostap.epitest.fi/wpa_supplicant/ - DEPENDS:=$(DRV_DEPENDS) +hostapd-common +libubus + DEPENDS:=$(DRV_DEPENDS) +hostapd-common $(CORE_DEPENDS) EXTRA_DEPENDS:=hostapd-common (=$(PKG_VERSION)-$(PKG_RELEASE)) USERID:=network=101:network=101 PROVIDES:=wpa-supplicant @@ -361,14 +417,21 @@ define Package/wpa-supplicant-openssl $(call Package/wpa-supplicant/Default,$(1)) TITLE+= (OpenSSL full) VARIANT:=supplicant-full-openssl - DEPENDS+=+libopenssl + DEPENDS+=$(OPENSSL_DEPENDS) endef define Package/wpa-supplicant-wolfssl $(call Package/wpa-supplicant/Default,$(1)) TITLE+= (wolfSSL full) VARIANT:=supplicant-full-wolfssl - DEPENDS+=+libwolfssl + DEPENDS+=+PACKAGE_wpa-supplicant-wolfssl:libwolfssl +endef + +define Package/wpa-supplicant-mbedtls +$(call Package/wpa-supplicant/Default,$(1)) + TITLE+= (mbedTLS full) + VARIANT:=supplicant-full-mbedtls + DEPENDS+=+PACKAGE_wpa-supplicant-mbedtls:libmbedtls endef define Package/wpa-supplicant/config @@ -378,13 +441,12 @@ endef define Package/wpa-supplicant-p2p $(call Package/wpa-supplicant/Default,$(1)) TITLE+= (Wi-Fi P2P support) - DEPENDS+=@PACKAGE_kmod-cfg80211 VARIANT:=supplicant-p2p-internal endef define Package/wpa-supplicant-mesh/Default $(call Package/wpa-supplicant/Default,$(1)) - DEPENDS+=@PACKAGE_kmod-cfg80211 @(!TARGET_uml||BROKEN) + DEPENDS+=@(!TARGET_uml||BROKEN) PROVIDES+=wpa-supplicant-mesh endef @@ -392,14 +454,21 @@ define Package/wpa-supplicant-mesh-openssl $(call Package/wpa-supplicant-mesh/Default,$(1)) TITLE+= (OpenSSL, 11s, SAE) VARIANT:=supplicant-mesh-openssl - DEPENDS+=+libopenssl + DEPENDS+=$(OPENSSL_DEPENDS) endef define Package/wpa-supplicant-mesh-wolfssl $(call Package/wpa-supplicant-mesh/Default,$(1)) TITLE+= (wolfSSL, 11s, SAE) VARIANT:=supplicant-mesh-wolfssl - DEPENDS+=+libwolfssl + DEPENDS+=+PACKAGE_wpa-supplicant-mesh-wolfssl:libwolfssl +endef + +define Package/wpa-supplicant-mesh-mbedtls +$(call Package/wpa-supplicant-mesh/Default,$(1)) + TITLE+= (mbedTLS, 11s, SAE) + VARIANT:=supplicant-mesh-mbedtls + DEPENDS+=+PACKAGE_wpa-supplicant-mesh-mbedtls:libmbedtls endef define Package/wpa-supplicant-basic @@ -451,7 +520,7 @@ define Package/eapol-test/Default SECTION:=net SUBMENU:=WirelessAPD CATEGORY:=Network - DEPENDS:=$(DRV_DEPENDS) +libubus + DEPENDS:=$(DRV_DEPENDS) $(CORE_DEPENDS) endef define Package/eapol-test @@ -465,7 +534,7 @@ define Package/eapol-test-openssl TITLE+= (OpenSSL full) VARIANT:=supplicant-full-openssl CONFLICTS:=$(filter-out eapol-test-openssl ,$(EAPOL_TEST_PROVIDERS)) - DEPENDS+=+libopenssl + DEPENDS+=$(OPENSSL_DEPENDS) PROVIDES:=eapol-test endef @@ -474,7 +543,16 @@ define Package/eapol-test-wolfssl TITLE+= (wolfSSL full) VARIANT:=supplicant-full-wolfssl CONFLICTS:=$(filter-out eapol-test-openssl ,$(filter-out eapol-test-wolfssl ,$(EAPOL_TEST_PROVIDERS))) - DEPENDS+=+libwolfssl + DEPENDS+=+PACKAGE_eapol-test-wolfssl:libwolfssl + PROVIDES:=eapol-test +endef + +define Package/eapol-test-mbedtls + $(call Package/eapol-test/Default,$(1)) + TITLE+= (mbedTLS full) + VARIANT:=supplicant-full-mbedtls + CONFLICTS:=$(filter-out eapol-test-openssl ,$(filter-out eapol-test-mbedtls ,$(EAPOL_TEST_PROVIDERS))) + DEPENDS+=+PACKAGE_eapol-test-mbedtls:libmbedtls PROVIDES:=eapol-test endef @@ -507,12 +585,7 @@ TARGET_CPPFLAGS := \ -D_GNU_SOURCE \ $(if $(CONFIG_WPA_MSG_MIN_PRIORITY),-DCONFIG_MSG_MIN_PRIORITY=$(CONFIG_WPA_MSG_MIN_PRIORITY)) -TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto -TARGET_LDFLAGS += -Wl,--gc-sections -flto=jobserver -fuse-linker-plugin -lubox -lubus - -ifdef CONFIG_PACKAGE_kmod-cfg80211 - TARGET_LDFLAGS += -lm -lnl-tiny -endif +TARGET_LDFLAGS += -lubox -lubus -lblobmsg_json -lucode -lm -lnl-tiny ifdef CONFIG_WPA_ENABLE_WEP DRIVER_MAKEOPTS += CONFIG_WEP=y @@ -586,27 +659,66 @@ define Build/Compile/supplicant-full-wolfssl ) endef +define Build/Compile/supplicant-full-mbedtls + +$(call Build/RunMake,wpa_supplicant, \ + eapol_test \ + ) +endef + define Build/Compile $(Build/Compile/$(LOCAL_TYPE)) $(Build/Compile/$(BUILD_VARIANT)) endef +define Install/hostapd/full + $(INSTALL_DIR) $(1)/etc/init.d $(1)/etc/config $(1)/etc/radius + ln -sf hostapd $(1)/usr/sbin/hostapd-radius + $(INSTALL_BIN) ./files/radius.init $(1)/etc/init.d/radius + $(INSTALL_DATA) ./files/radius.config $(1)/etc/config/radius + $(INSTALL_DATA) ./files/radius.clients $(1)/etc/radius/clients + $(INSTALL_DATA) ./files/radius.users $(1)/etc/radius/users +endef + +define Package/hostapd-full/conffiles +/etc/config/radius +/etc/radius +endef + +ifeq ($(CONFIG_VARIANT),full) +Package/wpad-mesh-openssl/conffiles = $(Package/hostapd-full/conffiles) +Package/wpad-mesh-wolfssl/conffiles = $(Package/hostapd-full/conffiles) +Package/wpad-mesh-mbedtls/conffiles = $(Package/hostapd-full/conffiles) +Package/wpad/conffiles = $(Package/hostapd-full/conffiles) +Package/wpad-openssl/conffiles = $(Package/hostapd-full/conffiles) +Package/wpad-wolfssl/conffiles = $(Package/hostapd-full/conffiles) +Package/wpad-mbedtls/conffiles = $(Package/hostapd-full/conffiles) +Package/hostapd/conffiles = $(Package/hostapd-full/conffiles) +Package/hostapd-openssl/conffiles = $(Package/hostapd-full/conffiles) +Package/hostapd-wolfssl/conffiles = $(Package/hostapd-full/conffiles) +Package/hostapd-mbedtls/conffiles = $(Package/hostapd-full/conffiles) +endif + define Install/hostapd - $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_DIR) $(1)/usr/sbin $(1)/usr/share/hostap + $(INSTALL_DATA) ./files/hostapd.uc $(1)/usr/share/hostap/ + $(if $(findstring full,$(CONFIG_VARIANT)),$(Install/hostapd/full)) endef define Install/supplicant - $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_DIR) $(1)/usr/sbin $(1)/usr/share/hostap + $(INSTALL_DATA) ./files/wpa_supplicant.uc $(1)/usr/share/hostap/ endef define Package/hostapd-common/install - $(INSTALL_DIR) $(1)/etc/capabilities $(1)/etc/rc.button $(1)/etc/hotplug.d/ieee80211 $(1)/etc/init.d $(1)/lib/netifd $(1)/usr/share/acl.d + $(INSTALL_DIR) $(1)/etc/capabilities $(1)/etc/rc.button $(1)/etc/hotplug.d/ieee80211 $(1)/etc/init.d $(1)/lib/netifd $(1)/usr/share/acl.d $(1)/usr/share/hostap $(INSTALL_BIN) ./files/dhcp-get-server.sh $(1)/lib/netifd/dhcp-get-server.sh $(INSTALL_DATA) ./files/hostapd.sh $(1)/lib/netifd/hostapd.sh $(INSTALL_BIN) ./files/wpad.init $(1)/etc/init.d/wpad $(INSTALL_BIN) ./files/wps-hotplug.sh $(1)/etc/rc.button/wps $(INSTALL_DATA) ./files/wpad_acl.json $(1)/usr/share/acl.d $(INSTALL_DATA) ./files/wpad.json $(1)/etc/capabilities + $(INSTALL_DATA) ./files/common.uc $(1)/usr/share/hostap/ + $(INSTALL_DATA) ./files/wdev.uc $(1)/usr/share/hostap/ endef define Package/hostapd/install @@ -616,9 +728,11 @@ endef Package/hostapd-basic/install = $(Package/hostapd/install) Package/hostapd-basic-openssl/install = $(Package/hostapd/install) Package/hostapd-basic-wolfssl/install = $(Package/hostapd/install) +Package/hostapd-basic-mbedtls/install = $(Package/hostapd/install) Package/hostapd-mini/install = $(Package/hostapd/install) Package/hostapd-openssl/install = $(Package/hostapd/install) Package/hostapd-wolfssl/install = $(Package/hostapd/install) +Package/hostapd-mbedtls/install = $(Package/hostapd/install) ifneq ($(LOCAL_TYPE),supplicant) define Package/hostapd-utils/install @@ -637,11 +751,14 @@ endef Package/wpad-basic/install = $(Package/wpad/install) Package/wpad-basic-openssl/install = $(Package/wpad/install) Package/wpad-basic-wolfssl/install = $(Package/wpad/install) +Package/wpad-basic-mbedtls/install = $(Package/wpad/install) Package/wpad-mini/install = $(Package/wpad/install) Package/wpad-openssl/install = $(Package/wpad/install) Package/wpad-wolfssl/install = $(Package/wpad/install) +Package/wpad-mbedtls/install = $(Package/wpad/install) Package/wpad-mesh-openssl/install = $(Package/wpad/install) Package/wpad-mesh-wolfssl/install = $(Package/wpad/install) +Package/wpad-mesh-mbedtls/install = $(Package/wpad/install) define Package/wpa-supplicant/install $(call Install/supplicant,$(1)) @@ -652,8 +769,10 @@ Package/wpa-supplicant-mini/install = $(Package/wpa-supplicant/install) Package/wpa-supplicant-p2p/install = $(Package/wpa-supplicant/install) Package/wpa-supplicant-openssl/install = $(Package/wpa-supplicant/install) Package/wpa-supplicant-wolfssl/install = $(Package/wpa-supplicant/install) +Package/wpa-supplicant-mbedtls/install = $(Package/wpa-supplicant/install) Package/wpa-supplicant-mesh-openssl/install = $(Package/wpa-supplicant/install) Package/wpa-supplicant-mesh-wolfssl/install = $(Package/wpa-supplicant/install) +Package/wpa-supplicant-mesh-mbedtls/install = $(Package/wpa-supplicant/install) ifneq ($(LOCAL_TYPE),hostapd) define Package/wpa-cli/install @@ -683,6 +802,13 @@ ifeq ($(BUILD_VARIANT),supplicant-full-wolfssl) endef endif +ifeq ($(BUILD_VARIANT),supplicant-full-mbedtls) + define Package/eapol-test-mbedtls/install + $(INSTALL_DIR) $(1)/usr/sbin + $(CP) $(PKG_BUILD_DIR)/wpa_supplicant/eapol_test $(1)/usr/sbin/ + endef +endif + # Build hostapd-common before its dependents, to avoid # spurious rebuilds when building multiple variants. $(eval $(call BuildPackage,hostapd-common)) @@ -690,28 +816,36 @@ $(eval $(call BuildPackage,hostapd)) $(eval $(call BuildPackage,hostapd-basic)) $(eval $(call BuildPackage,hostapd-basic-openssl)) $(eval $(call BuildPackage,hostapd-basic-wolfssl)) +$(eval $(call BuildPackage,hostapd-basic-mbedtls)) $(eval $(call BuildPackage,hostapd-mini)) $(eval $(call BuildPackage,hostapd-openssl)) $(eval $(call BuildPackage,hostapd-wolfssl)) +$(eval $(call BuildPackage,hostapd-mbedtls)) $(eval $(call BuildPackage,wpad)) $(eval $(call BuildPackage,wpad-mesh-openssl)) $(eval $(call BuildPackage,wpad-mesh-wolfssl)) +$(eval $(call BuildPackage,wpad-mesh-mbedtls)) $(eval $(call BuildPackage,wpad-basic)) $(eval $(call BuildPackage,wpad-basic-openssl)) $(eval $(call BuildPackage,wpad-basic-wolfssl)) +$(eval $(call BuildPackage,wpad-basic-mbedtls)) $(eval $(call BuildPackage,wpad-mini)) $(eval $(call BuildPackage,wpad-openssl)) $(eval $(call BuildPackage,wpad-wolfssl)) +$(eval $(call BuildPackage,wpad-mbedtls)) $(eval $(call BuildPackage,wpa-supplicant)) $(eval $(call BuildPackage,wpa-supplicant-mesh-openssl)) $(eval $(call BuildPackage,wpa-supplicant-mesh-wolfssl)) +$(eval $(call BuildPackage,wpa-supplicant-mesh-mbedtls)) $(eval $(call BuildPackage,wpa-supplicant-basic)) $(eval $(call BuildPackage,wpa-supplicant-mini)) $(eval $(call BuildPackage,wpa-supplicant-p2p)) $(eval $(call BuildPackage,wpa-supplicant-openssl)) $(eval $(call BuildPackage,wpa-supplicant-wolfssl)) +$(eval $(call BuildPackage,wpa-supplicant-mbedtls)) $(eval $(call BuildPackage,wpa-cli)) $(eval $(call BuildPackage,hostapd-utils)) $(eval $(call BuildPackage,eapol-test)) $(eval $(call BuildPackage,eapol-test-openssl)) $(eval $(call BuildPackage,eapol-test-wolfssl)) +$(eval $(call BuildPackage,eapol-test-mbedtls)) diff --git a/package/network/services/hostapd/README.md b/package/network/services/hostapd/README.md new file mode 100644 index 0000000000..2150863306 --- /dev/null +++ b/package/network/services/hostapd/README.md @@ -0,0 +1,419 @@ +# UBUS methods - hostapd + +## bss_mgmt_enable +Enable 802.11k/v features. + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| neighbor_report | bool | no | enable 802.11k neighbor reports | +| beacon_report | bool | no | enable 802.11k beacon reports | +| link_measurements | bool | no | enable 802.11k link measurements | +| bss_transition | bool | no | enable 802.11v BSS transition support | + +### example +`ubus call hostapd.wl5-fb bss_mgmt_enable '{ "neighbor_report": true, "beacon_report": true, "link_measurements": true, "bss_transition": true +}'` + + +## bss_transition_request +Initiate an 802.11v transition request. + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| addr | string | yes | client MAC address | +| disassociation_imminent | bool | no | set Disassociation Imminent bit | +| disassociation_timer | int32 | no | disassociate client if it doesn't roam after this time | +| validity_period | int32 | no | validity of the BSS Transition Candiate List | +| neighbors | array | no | BSS Transition Candidate List | +| abridged | bool | no | prefer APs in the BSS Transition Candidate List | +| dialog_token | int32 | no | identifier for the request/report transaction | +| mbo_reason | int32 | no | MBO Transition Reason Code Attribute | +| cell_pref | int32 | no | MBO Cellular Data Connection Preference Attribute | +| reassoc_delay | int32 | no | MBO Re-association retry delay | + +### example +`ubus call hostapd.wl5-fb bss_transition_request '{ "addr": "68:2F:67:8B:98:ED", "disassociation_imminent": false, "disassociation_timer": 0, "validity_period": 30, "neighbors": ["b6a7b9cbeebabf5900008064090603026a00"], "abridged": 1 }'` + + +## config_add +Dynamically load a BSS configuration from a file. This is used by netifd's mac80211 support script to configure BSSes on multiple PHYs in a single hostapd instance. + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| iface | string | yes | WiFi interface name | +| config | string | yes | path to hostapd config file | + + +## config_remove +Dynamically remove a BSS configuration. + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| iface | string | yes | WiFi interface name | + + +## del_client +Kick a client off the network. + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| addr | string | yes | client MAC address | +| reason | int32 | no | 802.11 reason code | +| deauth | bool | no | deauthenticates client instead of disassociating | +| ban_time | int32 | no | ban client for N milliseconds | + +### example +`ubus call hostapd.wl5-fb del_client '{ "addr": "68:2f:67:8b:98:ed", "reason": 5, "deauth": true, "ban_time": 10000 }'` + + +## get_clients +Show associated clients. + +### example +`ubus call hostapd.wl5-fb get_clients` + +### output +```json +{ + "freq": 5260, + "clients": { + "68:2f:67:8b:98:ed": { + "auth": true, + "assoc": true, + "authorized": true, + "preauth": false, + "wds": false, + "wmm": true, + "ht": true, + "vht": true, + "he": false, + "wps": false, + "mfp": true, + "rrm": [ + 0, + 0, + 0, + 0, + 0 + ], + "extended_capabilities": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64 + ], + "aid": 3, + "signature": "wifi4|probe:0,1,45,127,107,191,221(0017f2,10),221(001018,2),htcap:006f,htagg:1b,htmcs:0000ffff,vhtcap:0f825832,vhtrxmcs:0000ffea,vhttxmcs:0000ffea,extcap:0000008000000040|assoc:0,1,33,36,48,45,127,191,221(0017f2,10),221(001018,2),221(0050f2,2),htcap:006f,htagg:1b,htmcs:0000ffff,vhtcap:0f825832,vhtrxmcs:0000ffea,vhttxmcs:0000ffea,txpow:14f9,extcap:0000000000000040", + "bytes": { + "rx": 1933667, + "tx": 746805 + }, + "airtime": { + "rx": 208863, + "tx": 9037883 + }, + "packets": { + "rx": 3587, + "tx": 2185 + }, + "rate": { + "rx": 866700, + "tx": 866700 + }, + "signal": -50, + "capabilities": { + "vht": { + "su_beamformee": true, + "mu_beamformee": false, + "mcs_map": { + "rx": { + "1ss": 9, + "2ss": 9, + "3ss": 9, + "4ss": -1, + "5ss": -1, + "6ss": -1, + "7ss": -1, + "8ss": -1 + }, + "tx": { + "1ss": 9, + "2ss": 9, + "3ss": 9, + "4ss": -1, + "5ss": -1, + "6ss": -1, + "7ss": -1, + "8ss": -1 + } + } + } + } + } + } +} +``` + + +## get_features +Show HT/VHT support. + +### example +`ubus call hostapd.wl5-fb get_features` + +### output +```json +{ + "ht_supported": true, + "vht_supported": true +} +``` + + +## get_status +Get BSS status. + +### example +`ubus call hostapd.wl5-fb get_status` + +### output +```json +{ + "status": "ENABLED", + "bssid": "b6:a7:b9:cb:ee:bc", + "ssid": "fb", + "freq": 5260, + "channel": 52, + "op_class": 128, + "beacon_interval": 100, + "phy": "wl5-lan", + "rrm": { + "neighbor_report_tx": 0 + }, + "wnm": { + "bss_transition_query_rx": 0, + "bss_transition_request_tx": 0, + "bss_transition_response_rx": 0 + }, + "airtime": { + "time": 259561738, + "time_busy": 2844249, + "utilization": 0 + }, + "dfs": { + "cac_seconds": 60, + "cac_active": false, + "cac_seconds_left": 0 + } +} +``` + + +## link_measurement_req +Initiate an 802.11k Link Measurement Request. + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| addr | string | yes | client MAC address | +| tx-power-used | int32 | no | transmit power used to transmit the Link Measurement Request frame | +| tx-power-max | int32 | no | upper limit of transmit power to be used by the client | + + +## list_bans +List banned clients. + +### example +`ubus call hostapd.wl5-fb list_bans` + +### output +```json +{ + "clients": [ + "68:2f:67:8b:98:ed" + ] +} +``` + + +## notify_response +When enabled, hostapd will send a ubus notification and wait for a response before responding to various requests. This is used by e.g. usteer to make it possible to ignore probe requests. + +:warning: enabling this will cause hostapd to stop responding to probe requests unless a ubus subscriber responds to the ubus notifications. + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| notify_response | int32 | yes | disable (0) or enable (!0) | + +### example +`ubus call hostapd.wl5-fb notify_response '{ "notify_response": 1 }'` + +## reload +Reload BSS configuration. + +:warning: this can cause problems for certain configurations: + +``` +Mon May 16 16:09:08 2022 daemon.warn hostapd: Failed to check if DFS is required; ret=-1 +Mon May 16 16:09:08 2022 daemon.warn hostapd: Failed to check if DFS is required; ret=-1 +Mon May 16 16:09:08 2022 daemon.err hostapd: Wrong coupling between HT and VHT/HE channel setting +``` + +### example +`ubus call hostapd.wl5-fb reload` + + +## rrm_beacon_req +Send a Beacon Measurement Request to a client. + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| addr | string | yes | client MAC address | +| op_class | int32 | yes | the Regulatory Class for which this Measurement Request applies | +| channel | int32 | yes | channel to measure | +| duration | int32 | yes | compile Beacon Measurement Report after N TU | +| mode | int32 | yes | mode to be used for measurement (0: passive, 1: active, 2: beacon table) | +| bssid | string | no | filter BSSes in Beacon Measurement Report by BSSID | +| ssid | string | no | filter BSSes in Beacon Measurement Report by SSID| + + +## rrm_nr_get_own +Show Neighbor Report Element for this BSS. + +### example +`ubus call hostapd.wl5-fb rrm_nr_get_own` + +### output +```json +{ + "value": [ + "b6:a7:b9:cb:ee:bc", + "fb", + "b6a7b9cbeebcaf5900008095090603029b00" + ] +} +``` + + +## rrm_nr_list +Show Neighbor Report Elements for other BSSes in this ESS. + +### example +`ubus call hostapd.wl5-fb rrm_nr_list` + +### output +```json +{ + "list": [ + [ + "b6:a7:b9:cb:ee:ba", + "fb", + "b6a7b9cbeebabf5900008064090603026a00" + ] + ] +} +``` + +## rrm_nr_set +Set the Neighbor Report Elements. An element for the node on which this command is executed will always be added. + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| list | array | yes | array of Neighbor Report Elements in the format of the rrm_nr_list output | + +### example +`ubus call hostapd.wl5-fb rrm_nr_set '{ "list": [ [ "b6:a7:b9:cb:ee:ba", "fb", "b6a7b9cbeebabf5900008064090603026a00" ] ] }'` + + +## set_vendor_elements +Configure Vendor-specific Information Elements for BSS. + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| vendor_elements | string | yes | Vendor-specific Information Elements as hex string | + +### example +`ubus call hostapd.wl5-fb set_vendor_elements '{ "vendor_elements": "dd054857dd6662" }'` + + +## switch_chan +Initiate a channel switch. + +:warning: trying to switch to the channel that is currently in use will fail: `Command failed: Operation not supported` + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| freq | int32 | yes | frequency in MHz to switch to | +| bcn_count | int32 | no | count in Beacon frames (TBTT) to perform the switch | +| center_freq1 | int32 | no | segment 0 center frequency in MHz (valid for HT and VHT) | +| center_freq2 | int32 | no | segment 1 center frequency in MHz (valid only for 80 MHz channel width and an 80+80 channel) | +| bandwidth | int32 | no | channel width to use | +| sec_channel_offset| int32 | no | secondary channel offset for HT40 (0 = disabled, 1 = HT40+, -1 = HT40-) | +| ht | bool | no | enable 802.11n | +| vht | bool | no | enable 802.11ac | +| he | bool | no | enable 802.11ax | +| block_tx | bool | no | block transmission during CSA period | +| csa_force | bool | no | restart the interface in case the CSA fails | + +## example +`ubus call hostapd.wl5-fb switch_chan '{ "freq": 5180, "bcn_count": 10, "center_freq1": 5210, "bandwidth": 80, "he": 1, "block_tx": 1, "csa_force": 0 }'` + + +## update_airtime +Set dynamic airtime weight for client. + +### arguments +| Name | Type | Required | Description | +|---|---|---|---| +| sta | string | yes | client MAC address | +| weight | int32 | yes | airtime weight | + + +## update_beacon +Force beacon frame content to be updated and to start beaconing on an interface that uses start_disabled=1. + +### example +`ubus call hostapd.wl5-fb update_beacon` + + +## wps_status +Get WPS status for BSS. + +### example +`ubus call hostapd.wl5-fb wps_status` + +### output +```json +{ + "pbc_status": "Disabled", + "last_wps_result": "None" +} +``` + + +## wps_cancel +Cancel WPS Push Button Configuration. + +### example +`ubus call hostapd.wl5-fb wps_cancel` + + +## wps_start +Start WPS Push Button Configuration. + +### example +`ubus call hostapd.wl5-fb wps_start` diff --git a/package/network/services/hostapd/files/common.uc b/package/network/services/hostapd/files/common.uc new file mode 100644 index 0000000000..4c33779af9 --- /dev/null +++ b/package/network/services/hostapd/files/common.uc @@ -0,0 +1,373 @@ +import * as nl80211 from "nl80211"; +import * as rtnl from "rtnl"; +import { readfile, glob, basename, readlink } from "fs"; + +const iftypes = { + ap: nl80211.const.NL80211_IFTYPE_AP, + mesh: nl80211.const.NL80211_IFTYPE_MESH_POINT, + sta: nl80211.const.NL80211_IFTYPE_STATION, + adhoc: nl80211.const.NL80211_IFTYPE_ADHOC, + monitor: nl80211.const.NL80211_IFTYPE_MONITOR, +}; + +const mesh_params = { + mesh_retry_timeout: "retry_timeout", + mesh_confirm_timeout: "confirm_timeout", + mesh_holding_timeout: "holding_timeout", + mesh_max_peer_links: "max_peer_links", + mesh_max_retries: "max_retries", + mesh_ttl: "ttl", + mesh_element_ttl: "element_ttl", + mesh_auto_open_plinks: "auto_open_plinks", + mesh_hwmp_max_preq_retries: "hwmp_max_preq_retries", + mesh_path_refresh_time: "path_refresh_time", + mesh_min_discovery_timeout: "min_discovery_timeout", + mesh_hwmp_active_path_timeout: "hwmp_active_path_timeout", + mesh_hwmp_preq_min_interval: "hwmp_preq_min_interval", + mesh_hwmp_net_diameter_traversal_time: "hwmp_net_diam_trvs_time", + mesh_hwmp_rootmode: "hwmp_rootmode", + mesh_hwmp_rann_interval: "hwmp_rann_interval", + mesh_gate_announcements: "gate_announcements", + mesh_sync_offset_max_neighor: "sync_offset_max_neighbor", + mesh_rssi_threshold: "rssi_threshold", + mesh_hwmp_active_path_to_root_timeout: "hwmp_path_to_root_timeout", + mesh_hwmp_root_interval: "hwmp_root_interval", + mesh_hwmp_confirmation_interval: "hwmp_confirmation_interval", + mesh_awake_window: "awake_window", + mesh_plink_timeout: "plink_timeout", + mesh_fwding: "forwarding", + mesh_power_mode: "power_mode", + mesh_nolearn: "nolearn" +}; + +function wdev_remove(name) +{ + nl80211.request(nl80211.const.NL80211_CMD_DEL_INTERFACE, 0, { dev: name }); +} + +function __phy_is_fullmac(phyidx) +{ + let data = nl80211.request(nl80211.const.NL80211_CMD_GET_WIPHY, 0, { wiphy: phyidx }); + + return !data.software_iftypes.ap_vlan; +} + +function phy_is_fullmac(phy) +{ + let phyidx = int(trim(readfile(`/sys/class/ieee80211/${phy}/index`))); + + return __phy_is_fullmac(phyidx); +} + +function find_reusable_wdev(phyidx) +{ + if (!__phy_is_fullmac(phyidx)) + return null; + + let data = nl80211.request( + nl80211.const.NL80211_CMD_GET_INTERFACE, + nl80211.const.NLM_F_DUMP, + { wiphy: phyidx }); + for (let res in data) + if (trim(readfile(`/sys/class/net/${res.ifname}/operstate`)) == "down") + return res.ifname; + return null; +} + +function wdev_create(phy, name, data) +{ + let phyidx = int(readfile(`/sys/class/ieee80211/${phy}/index`)); + + wdev_remove(name); + + if (!iftypes[data.mode]) + return `Invalid mode: ${data.mode}`; + + let req = { + wiphy: phyidx, + ifname: name, + iftype: iftypes[data.mode], + }; + + if (data["4addr"]) + req["4addr"] = data["4addr"]; + if (data.macaddr) + req.mac = data.macaddr; + + nl80211.error(); + + let reuse_ifname = find_reusable_wdev(phyidx); + if (reuse_ifname && + (reuse_ifname == name || + rtnl.request(rtnl.const.RTM_SETLINK, 0, { dev: reuse_ifname, ifname: name}) != false)) + nl80211.request( + nl80211.const.NL80211_CMD_SET_INTERFACE, 0, { + wiphy: phyidx, + dev: name, + iftype: iftypes[data.mode], + }); + else + nl80211.request( + nl80211.const.NL80211_CMD_NEW_INTERFACE, + nl80211.const.NLM_F_CREATE, + req); + + let error = nl80211.error(); + if (error) + return error; + + if (data.powersave != null) { + nl80211.request(nl80211.const.NL80211_CMD_SET_POWER_SAVE, 0, + { dev: name, ps_state: data.powersave ? 1 : 0}); + } + + return null; +} + +function wdev_set_mesh_params(name, data) +{ + let mesh_cfg = {}; + + for (let key in mesh_params) { + let val = data[key]; + if (val == null) + continue; + mesh_cfg[mesh_params[key]] = int(val); + } + + if (!length(mesh_cfg)) + return null; + + nl80211.request(nl80211.const.NL80211_CMD_SET_MESH_CONFIG, 0, + { dev: name, mesh_params: mesh_cfg }); + + return nl80211.error(); +} + +function wdev_set_up(name, up) +{ + rtnl.request(rtnl.const.RTM_SETLINK, 0, { dev: name, change: 1, flags: up ? 1 : 0 }); +} + +function phy_sysfs_file(phy, name) +{ + return trim(readfile(`/sys/class/ieee80211/${phy}/${name}`)); +} + +function macaddr_split(str) +{ + return map(split(str, ":"), (val) => hex(val)); +} + +function macaddr_join(addr) +{ + return join(":", map(addr, (val) => sprintf("%02x", val))); +} + +function wdev_macaddr(wdev) +{ + return trim(readfile(`/sys/class/net/${wdev}/address`)); +} + +const phy_proto = { + macaddr_init: function(used, options) { + this.macaddr_options = options ?? {}; + this.macaddr_list = {}; + + if (type(used) == "object") + for (let addr in used) + this.macaddr_list[addr] = used[addr]; + else + for (let addr in used) + this.macaddr_list[addr] = -1; + + this.for_each_wdev((wdev) => { + let macaddr = wdev_macaddr(wdev); + this.macaddr_list[macaddr] ??= -1; + }); + + return this.macaddr_list; + }, + + macaddr_generate: function(data) { + let phy = this.name; + let idx = int(data.id ?? 0); + let mbssid = int(data.mbssid ?? 0) > 0; + let num_global = int(data.num_global ?? 1); + let use_global = !mbssid && idx < num_global; + + let base_addr = phy_sysfs_file(phy, "macaddress"); + if (!base_addr) + return null; + + if (!idx && !mbssid) + return base_addr; + + let base_mask = phy_sysfs_file(phy, "address_mask"); + if (!base_mask) + return null; + + if (base_mask == "00:00:00:00:00:00" && idx >= num_global) { + let addrs = split(phy_sysfs_file(phy, "addresses"), "\n"); + + if (idx < length(addrs)) + return addrs[idx]; + + base_mask = "ff:ff:ff:ff:ff:ff"; + } + + let addr = macaddr_split(base_addr); + let mask = macaddr_split(base_mask); + let type; + + if (mbssid) + type = "b5"; + else if (use_global) + type = "add"; + else if (mask[0] > 0) + type = "b1"; + else if (mask[5] < 0xff) + type = "b5"; + else + type = "add"; + + switch (type) { + case "b1": + if (!(addr[0] & 2)) + idx--; + addr[0] |= 2; + addr[0] ^= idx << 2; + break; + case "b5": + if (mbssid) + addr[0] |= 2; + addr[5] ^= idx; + break; + default: + for (let i = 5; i > 0; i--) { + addr[i] += idx; + if (addr[i] < 256) + break; + addr[i] %= 256; + } + break; + } + + return macaddr_join(addr); + }, + + macaddr_next: function(val) { + let data = this.macaddr_options ?? {}; + let list = this.macaddr_list; + + for (let i = 0; i < 32; i++) { + data.id = i; + + let mac = this.macaddr_generate(data); + if (!mac) + return null; + + if (list[mac] != null) + continue; + + list[mac] = val != null ? val : -1; + return mac; + } + }, + + for_each_wdev: function(cb) { + let wdevs = glob(`/sys/class/ieee80211/${this.name}/device/net/*`); + wdevs = map(wdevs, (arg) => basename(arg)); + for (let wdev in wdevs) { + if (basename(readlink(`/sys/class/net/${wdev}/phy80211`)) != this.name) + continue; + + cb(wdev); + } + } +}; + +function phy_open(phy) +{ + let phyidx = readfile(`/sys/class/ieee80211/${phy}/index`); + if (!phyidx) + return null; + + return proto({ + name: phy, + idx: int(phyidx) + }, phy_proto); +} + +const vlist_proto = { + update: function(values, arg) { + let data = this.data; + let cb = this.cb; + let seq = { }; + let new_data = {}; + let old_data = {}; + + this.data = new_data; + + if (type(values) == "object") { + for (let key in values) { + old_data[key] = data[key]; + new_data[key] = values[key]; + delete data[key]; + } + } else { + for (let val in values) { + let cur_key = val[0]; + let cur_obj = val[1]; + + old_data[cur_key] = data[cur_key]; + new_data[cur_key] = val[1]; + delete data[cur_key]; + } + } + + for (let key in data) { + cb(null, data[key], arg); + delete data[key]; + } + for (let key in new_data) + cb(new_data[key], old_data[key], arg); + } +}; + +function is_equal(val1, val2) { + let t1 = type(val1); + + if (t1 != type(val2)) + return false; + + if (t1 == "array") { + if (length(val1) != length(val2)) + return false; + + for (let i = 0; i < length(val1); i++) + if (!is_equal(val1[i], val2[i])) + return false; + + return true; + } else if (t1 == "object") { + for (let key in val1) + if (!is_equal(val1[key], val2[key])) + return false; + for (let key in val2) + if (val1[key] == null) + return false; + return true; + } else { + return val1 == val2; + } +} + +function vlist_new(cb) { + return proto({ + cb: cb, + data: {} + }, vlist_proto); +} + +export { wdev_remove, wdev_create, wdev_set_mesh_params, wdev_set_up, is_equal, vlist_new, phy_is_fullmac, phy_open }; diff --git a/package/network/services/hostapd/files/hostapd-basic.config b/package/network/services/hostapd/files/hostapd-basic.config index a990c924ed..fff7dca971 100644 --- a/package/network/services/hostapd/files/hostapd-basic.config +++ b/package/network/services/hostapd/files/hostapd-basic.config @@ -54,7 +54,7 @@ CONFIG_RSN_PREAUTH=y #CONFIG_IEEE80211W=y # Support Operating Channel Validation -#CONFIG_OCV=y +CONFIG_OCV=y # Integrated EAP server #CONFIG_EAP=y @@ -352,6 +352,7 @@ CONFIG_TLS=internal # Supported ACS drivers: # * ath9k # * ath5k +# * ath10k # # For more details refer to: # http://wireless.kernel.org/en/users/Documentation/acs diff --git a/package/network/services/hostapd/files/hostapd-full.config b/package/network/services/hostapd/files/hostapd-full.config index d7f1746b89..f0e0cb2954 100644 --- a/package/network/services/hostapd/files/hostapd-full.config +++ b/package/network/services/hostapd/files/hostapd-full.config @@ -54,7 +54,7 @@ CONFIG_RSN_PREAUTH=y #CONFIG_IEEE80211W=y # Support Operating Channel Validation -#CONFIG_OCV=y +CONFIG_OCV=y # Integrated EAP server CONFIG_EAP=y @@ -142,7 +142,7 @@ CONFIG_PKCS12=y # RADIUS authentication server. This provides access to the integrated EAP # server from external hosts using RADIUS. -#CONFIG_RADIUS_SERVER=y +CONFIG_RADIUS_SERVER=y # Build IPv6 support for RADIUS operations CONFIG_IPV6=y @@ -316,7 +316,7 @@ CONFIG_INTERNAL_LIBTOMMATH=y CONFIG_INTERWORKING=y # Hotspot 2.0 -#CONFIG_HS20=y +CONFIG_HS20=y # Enable SQLite database support in hlr_auc_gw, EAP-SIM DB, and eap_user_file #CONFIG_SQLITE=y @@ -352,6 +352,7 @@ CONFIG_INTERWORKING=y # Supported ACS drivers: # * ath9k # * ath5k +# * ath10k # # For more details refer to: # http://wireless.kernel.org/en/users/Documentation/acs diff --git a/package/network/services/hostapd/files/hostapd-mini.config b/package/network/services/hostapd/files/hostapd-mini.config index 4e7dba8377..8a6cc0d968 100644 --- a/package/network/services/hostapd/files/hostapd-mini.config +++ b/package/network/services/hostapd/files/hostapd-mini.config @@ -352,6 +352,7 @@ CONFIG_TLS=internal # Supported ACS drivers: # * ath9k # * ath5k +# * ath10k # # For more details refer to: # http://wireless.kernel.org/en/users/Documentation/acs diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh index c2c8e52b39..9ca44a855d 100644 --- a/package/network/services/hostapd/files/hostapd.sh +++ b/package/network/services/hostapd/files/hostapd.sh @@ -24,12 +24,12 @@ hostapd_append_wep_key() { [1234]) for idx in 1 2 3 4; do local zidx - zidx=$(($idx - 1)) + zidx="$(($idx - 1))" json_get_var ckey "key${idx}" [ -n "$ckey" ] && \ append $var "wep_key${zidx}=$(prepare_key_wep "$ckey")" "$N$T" done - wep_keyidx=$((key - 1)) + wep_keyidx="$((key - 1))" ;; *) append $var "wep_key0=$(prepare_key_wep "$key")" "$N$T" @@ -50,14 +50,14 @@ hostapd_append_wpa_key_mgmt() { append wpa_key_mgmt "WPA-EAP-SUITE-B-192" [ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-EAP-SHA384" ;; - eap-eap192) - append wpa_key_mgmt "WPA-EAP-SUITE-B-192" + eap-eap2) append wpa_key_mgmt "WPA-EAP" - [ "${ieee80211r:-0}" -gt 0 ] && { - append wpa_key_mgmt "FT-EAP-SHA384" - append wpa_key_mgmt "FT-EAP" - } - [ "${ieee80211w:-0}" -gt 0 ] && append wpa_key_mgmt "WPA-EAP-SHA256" + append wpa_key_mgmt "WPA-EAP-SHA256" + [ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-EAP" + ;; + eap2) + [ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-EAP" + append wpa_key_mgmt "WPA-EAP-SHA256" ;; sae) append wpa_key_mgmt "SAE" @@ -77,6 +77,10 @@ hostapd_append_wpa_key_mgmt() { [ "$fils" -gt 0 ] && { case "$auth_type" in + eap-192) + append wpa_key_mgmt FILS-SHA384 + [ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt FT-FILS-SHA384 + ;; eap*) append wpa_key_mgmt FILS-SHA256 [ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt FT-FILS-SHA256 @@ -121,6 +125,7 @@ hostapd_common_add_device_config() { config_add_array hostapd_options config_add_int airtime_mode + config_add_int mbssid hostapd_add_log_config } @@ -133,7 +138,8 @@ hostapd_prepare_device_config() { json_get_vars country country3 country_ie beacon_int:100 doth require_mode legacy_rates \ acs_chan_bias local_pwr_constraint spectrum_mgmt_required airtime_mode cell_density \ - rts_threshold beacon_rate rssi_reject_assoc_rssi rssi_ignore_probe_request maxassoc + rts_threshold beacon_rate rssi_reject_assoc_rssi rssi_ignore_probe_request maxassoc \ + mbssid:0 hostapd_set_log_options base_cfg @@ -234,6 +240,7 @@ hostapd_prepare_device_config() { [ -n "$rts_threshold" ] && append base_cfg "rts_threshold=$rts_threshold" "$N" [ "$airtime_mode" -gt 0 ] && append base_cfg "airtime_mode=$airtime_mode" "$N" [ -n "$maxassoc" ] && append base_cfg "iface_max_num_sta=$maxassoc" "$N" + [ "$mbssid" -gt 0 ] && [ "$mbssid" -le 2 ] && append base_cfg "mbssid=$mbssid" "$N" json_get_values opts hostapd_options for val in $opts; do @@ -248,7 +255,7 @@ EOF hostapd_common_add_bss_config() { config_add_string 'bssid:macaddr' 'ssid:string' - config_add_boolean wds wmm uapsd hidden utf8_ssid + config_add_boolean wds wmm uapsd hidden utf8_ssid ppsk config_add_int maxassoc max_inactivity config_add_boolean disassoc_low_ack isolate short_preamble skip_inactivity_poll @@ -265,11 +272,11 @@ hostapd_common_add_bss_config() { config_add_int ieee80211w config_add_int eapol_version - config_add_string 'auth_server:host' 'server:host' + config_add_array auth_server acct_server + config_add_string 'server:host' config_add_string auth_secret key config_add_int 'auth_port:port' 'port:port' - config_add_string acct_server config_add_string acct_secret config_add_int acct_port config_add_int acct_interval @@ -306,7 +313,7 @@ hostapd_common_add_bss_config() { config_add_string wps_device_type wps_device_name wps_manufacturer wps_pin config_add_string multi_ap_backhaul_ssid multi_ap_backhaul_key - config_add_boolean wnm_sleep_mode wnm_sleep_mode_no_keys bss_transition + config_add_boolean wnm_sleep_mode wnm_sleep_mode_no_keys bss_transition mbo config_add_int time_advertisement config_add_string time_zone config_add_string vendor_elements @@ -374,6 +381,8 @@ hostapd_common_add_bss_config() { config_add_boolean fils config_add_string fils_dhcp + + config_add_int ocv } hostapd_set_vlan_file() { @@ -522,6 +531,20 @@ append_airtime_sta_weight() { [ -n "$1" ] && append bss_conf "airtime_sta_weight=$1" "$N" } +append_auth_server() { + [ -n "$1" ] || return + append bss_conf "auth_server_addr=$1" "$N" + append bss_conf "auth_server_port=$auth_port" "$N" + [ -n "$auth_secret" ] && append bss_conf "auth_server_shared_secret=$auth_secret" "$N" +} + +append_acct_server() { + [ -n "$1" ] || return + append bss_conf "acct_server_addr=$1" "$N" + append bss_conf "acct_server_port=$acct_port" "$N" + [ -n "$acct_secret" ] && append bss_conf "acct_server_shared_secret=$acct_secret" "$N" +} + hostapd_set_bss_options() { local var="$1" local phy="$2" @@ -540,13 +563,13 @@ hostapd_set_bss_options() { wps_independent wps_device_type wps_device_name wps_manufacturer wps_pin \ macfilter ssid utf8_ssid wmm uapsd hidden short_preamble rsn_preauth \ iapp_interface eapol_version dynamic_vlan ieee80211w nasid \ - acct_server acct_secret acct_port acct_interval \ + acct_secret acct_port acct_interval \ bss_load_update_period chan_util_avg_period sae_require_mfp sae_pwe \ multi_ap multi_ap_backhaul_ssid multi_ap_backhaul_key skip_inactivity_poll \ - airtime_bss_weight airtime_bss_limit airtime_sta_weight \ + ppsk airtime_bss_weight airtime_bss_limit airtime_sta_weight \ multicast_to_unicast_all proxy_arp per_sta_vif \ eap_server eap_user_file ca_cert server_cert private_key private_key_passwd server_id \ - vendor_elements fils + vendor_elements fils ocv set_default fils 0 set_default isolate 0 @@ -566,6 +589,7 @@ hostapd_set_bss_options() { set_default chan_util_avg_period 600 set_default utf8_ssid 1 set_default multi_ap 0 + set_default ppsk 0 set_default airtime_bss_weight 0 set_default airtime_bss_limit 0 set_default eap_server 0 @@ -609,23 +633,21 @@ hostapd_set_bss_options() { } [ -n "$nasid" ] && append bss_conf "nas_identifier=$nasid" "$N" - [ -n "$acct_server" ] && { - append bss_conf "acct_server_addr=$acct_server" "$N" - append bss_conf "acct_server_port=$acct_port" "$N" - [ -n "$acct_secret" ] && \ - append bss_conf "acct_server_shared_secret=$acct_secret" "$N" - [ -n "$acct_interval" ] && \ - append bss_conf "radius_acct_interim_interval=$acct_interval" "$N" - json_for_each_item append_radius_acct_req_attr radius_acct_req_attr - } + + [ -n "$acct_interval" ] && \ + append bss_conf "radius_acct_interim_interval=$acct_interval" "$N" + json_for_each_item append_acct_server acct_server + json_for_each_item append_radius_acct_req_attr radius_acct_req_attr + + [ -n "$ocv" ] && append bss_conf "ocv=$ocv" "$N" case "$auth_type" in - sae|owe|eap192|eap-eap192) + sae|owe|eap2|eap192) set_default ieee80211w 2 set_default sae_require_mfp 1 set_default sae_pwe 2 ;; - psk-sae) + psk-sae|eap-eap2) set_default ieee80211w 1 set_default sae_require_mfp 1 set_default sae_pwe 2 @@ -651,7 +673,13 @@ hostapd_set_bss_options() { ;; psk|sae|psk-sae) json_get_vars key wpa_psk_file - if [ ${#key} -eq 64 ]; then + if [ "$auth_type" = "psk" ] && [ "$ppsk" -ne 0 ] ; then + json_get_vars auth_secret auth_port + set_default auth_port 1812 + json_for_each_item append_auth_server auth_server + append bss_conf "macaddr_acl=2" "$N" + append bss_conf "wpa_psk_radius=2" "$N" + elif [ ${#key} -eq 64 ]; then append bss_conf "wpa_psk=$key" "$N" elif [ ${#key} -ge 8 ] && [ ${#key} -le 63 ]; then append bss_conf "wpa_passphrase=$key" "$N" @@ -670,11 +698,11 @@ hostapd_set_bss_options() { vlan_possible=1 wps_possible=1 ;; - eap|eap192|eap-eap192) + eap|eap2|eap-eap2|eap192) json_get_vars \ auth_server auth_secret auth_port \ dae_client dae_secret dae_port \ - ownip radius_client_addr \ + dynamic_ownip ownip radius_client_addr \ eap_reauth_period request_cui \ erp_domain mobility_domain \ fils_realm fils_dhcp @@ -682,6 +710,8 @@ hostapd_set_bss_options() { # radius can provide VLAN ID for clients vlan_possible=1 + set_default dynamic_ownip 1 + # legacy compatibility [ -n "$auth_server" ] || json_get_var auth_server server [ -n "$auth_port" ] || json_get_var auth_port port @@ -715,12 +745,7 @@ hostapd_set_bss_options() { set_default dae_port 3799 set_default request_cui 0 - [ "$eap_server" -eq 0 ] && { - append bss_conf "auth_server_addr=$auth_server" "$N" - append bss_conf "auth_server_port=$auth_port" "$N" - append bss_conf "auth_server_shared_secret=$auth_secret" "$N" - } - + [ "$eap_server" -eq 0 ] && json_for_each_item append_auth_server auth_server [ "$request_cui" -gt 0 ] && append bss_conf "radius_request_cui=$request_cui" "$N" [ -n "$eap_reauth_period" ] && append bss_conf "eap_reauth_period=$eap_reauth_period" "$N" @@ -730,7 +755,12 @@ hostapd_set_bss_options() { } json_for_each_item append_radius_auth_req_attr radius_auth_req_attr - [ -n "$ownip" ] && append bss_conf "own_ip_addr=$ownip" "$N" + if [ -n "$ownip" ]; then + append bss_conf "own_ip_addr=$ownip" "$N" + elif [ "$dynamic_ownip" -gt 0 ]; then + append bss_conf "dynamic_own_ip_addr=$dynamic_ownip" "$N" + fi + [ -n "$radius_client_addr" ] && append bss_conf "radius_client_addr=$radius_client_addr" "$N" append bss_conf "eapol_key_index_workaround=1" "$N" append bss_conf "ieee8021x=1" "$N" @@ -746,7 +776,24 @@ hostapd_set_bss_options() { ;; esac - local auth_algs=$((($auth_mode_shared << 1) | $auth_mode_open)) + case "$auth_type" in + none|owe|psk|sae|psk-sae|wep) + json_get_vars \ + auth_server auth_port auth_secret \ + ownip radius_client_addr + + [ -n "$auth_server" ] && { + set_default auth_port 1812 + + json_for_each_item append_auth_server auth_server + [ -n "$ownip" ] && append bss_conf "own_ip_addr=$ownip" "$N" + [ -n "$radius_client_addr" ] && append bss_conf "radius_client_addr=$radius_client_addr" "$N" + append bss_conf "macaddr_acl=2" "$N" + } + ;; + esac + + local auth_algs="$((($auth_mode_shared << 1) | $auth_mode_open))" append bss_conf "auth_algs=${auth_algs:-1}" "$N" append bss_conf "wpa=$wpa" "$N" [ -n "$wpa_pairwise" ] && append bss_conf "wpa_pairwise=$wpa_pairwise" "$N" @@ -808,10 +855,11 @@ hostapd_set_bss_options() { append bss_conf "iapp_interface=$ifname" "$N" } - json_get_vars time_advertisement time_zone wnm_sleep_mode wnm_sleep_mode_no_keys bss_transition + json_get_vars time_advertisement time_zone wnm_sleep_mode wnm_sleep_mode_no_keys bss_transition mbo set_default bss_transition 0 set_default wnm_sleep_mode 0 set_default wnm_sleep_mode_no_keys 0 + set_default mbo 0 [ -n "$time_advertisement" ] && append bss_conf "time_advertisement=$time_advertisement" "$N" [ -n "$time_zone" ] && append bss_conf "time_zone=$time_zone" "$N" @@ -820,9 +868,11 @@ hostapd_set_bss_options() { [ "$wnm_sleep_mode_no_keys" -eq "1" ] && append bss_conf "wnm_sleep_mode_no_keys=1" "$N" fi [ "$bss_transition" -eq "1" ] && append bss_conf "bss_transition=1" "$N" + [ "$mbo" -eq 1 ] && append bss_conf "mbo=1" "$N" - json_get_vars ieee80211k rrm_neighbor_report rrm_beacon_report + json_get_vars ieee80211k rrm_neighbor_report rrm_beacon_report rnr set_default ieee80211k 0 + set_default rnr 0 if [ "$ieee80211k" -eq "1" ]; then set_default rrm_neighbor_report 1 set_default rrm_beacon_report 1 @@ -833,6 +883,7 @@ hostapd_set_bss_options() { [ "$rrm_neighbor_report" -eq "1" ] && append bss_conf "rrm_neighbor_report=1" "$N" [ "$rrm_beacon_report" -eq "1" ] && append bss_conf "rrm_beacon_report=1" "$N" + [ "$rnr" -eq "1" ] && append bss_conf "rnr=1" "$N" json_get_vars ftm_responder stationary_ap lci civic set_default ftm_responder 0 @@ -871,7 +922,6 @@ hostapd_set_bss_options() { append bss_conf "ft_psk_generate_local=$ft_psk_generate_local" "$N" append bss_conf "ft_over_ds=$ft_over_ds" "$N" append bss_conf "reassociation_deadline=$reassociation_deadline" "$N" - [ -n "$nasid" ] || append bss_conf "nas_identifier=${macaddr//\:}" "$N" if [ "$ft_psk_generate_local" -eq "0" ]; then json_get_vars r0_key_lifetime r1_key_holder pmk_r1_push @@ -1114,9 +1164,6 @@ hostapd_set_bss_options() { append bss_conf "$val" "$N" done - bss_md5sum=$(echo $bss_conf | md5sum | cut -d" " -f1) - append bss_conf "config_id=$bss_md5sum" "$N" - append "$var" "$bss_conf" "$N" return 0 } @@ -1136,7 +1183,7 @@ hostapd_set_log_options() { set_default log_iapp 1 set_default log_mlme 1 - local log_mask=$(( \ + local log_mask="$(( \ ($log_80211 << 0) | \ ($log_8021x << 1) | \ ($log_radius << 2) | \ @@ -1144,7 +1191,7 @@ hostapd_set_log_options() { ($log_driver << 4) | \ ($log_iapp << 5) | \ ($log_mlme << 6) \ - )) + ))" append "$var" "logger_syslog=$log_mask" "$N" append "$var" "logger_syslog_level=$log_level" "$N" @@ -1253,12 +1300,12 @@ wpa_supplicant_add_network() { json_get_vars \ ssid bssid key \ basic_rate mcast_rate \ - ieee80211w ieee80211r fils \ + ieee80211w ieee80211r fils ocv \ multi_ap \ default_disabled case "$auth_type" in - sae|owe|eap192|eap-eap192) + sae|owe|eap2|eap192) set_default ieee80211w 2 ;; psk-sae) @@ -1288,7 +1335,7 @@ wpa_supplicant_add_network() { } [ "$_w_mode" = "mesh" ] && { - json_get_vars mesh_id mesh_fwding mesh_rssi_threshold + json_get_vars mesh_id mesh_fwding mesh_rssi_threshold encryption [ -n "$mesh_id" ] && ssid="${mesh_id}" append network_data "mode=5" "$N$T" @@ -1296,7 +1343,7 @@ wpa_supplicant_add_network() { [ -n "$mesh_rssi_threshold" ] && append network_data "mesh_rssi_threshold=${mesh_rssi_threshold}" "$N$T" [ -n "$freq" ] && wpa_supplicant_set_fixed_freq "$freq" "$htmode" [ "$noscan" = "1" ] && append network_data "noscan=1" "$N$T" - append wpa_key_mgmt "SAE" + [ "$encryption" = "none" -o -z "$encryption" ] || append wpa_key_mgmt "SAE" scan_ssid="" } @@ -1305,6 +1352,8 @@ wpa_supplicant_add_network() { [ "$default_disabled" = 1 ] && append network_data "disabled=1" "$N$T" } + [ -n "$ocv" ] && append network_data "ocv=$ocv" "$N$T" + case "$auth_type" in none) ;; owe) @@ -1328,18 +1377,18 @@ wpa_supplicant_add_network() { key_mgmt="$wpa_key_mgmt" - if [ ${#key} -eq 64 ]; then - passphrase="psk=${key}" + if [ "$_w_mode" = "mesh" ] || [ "$auth_type" = "sae" ]; then + passphrase="sae_password=\"${key}\"" else - if [ "$_w_mode" = "mesh" ]; then - passphrase="sae_password=\"${key}\"" + if [ ${#key} -eq 64 ]; then + passphrase="psk=${key}" else passphrase="psk=\"${key}\"" fi fi append network_data "$passphrase" "$N$T" ;; - eap|eap192|eap-eap192) + eap|eap2|eap192) hostapd_append_wpa_key_mgmt key_mgmt="$wpa_key_mgmt" @@ -1544,29 +1593,6 @@ EOF return 0 } -wpa_supplicant_run() { - local ifname="$1" - local hostapd_ctrl="$2" - - _wpa_supplicant_common "$ifname" - - ubus wait_for wpa_supplicant - local supplicant_res="$(ubus call wpa_supplicant config_add "{ \ - \"driver\": \"${_w_driver:-wext}\", \"ctrl\": \"$_rpath\", \ - \"iface\": \"$ifname\", \"config\": \"$_config\" \ - ${network_bridge:+, \"bridge\": \"$network_bridge\"} \ - ${hostapd_ctrl:+, \"hostapd_ctrl\": \"$hostapd_ctrl\"} \ - }")" - - ret="$?" - - [ "$ret" != 0 -o -z "$supplicant_res" ] && wireless_setup_vif_failed WPA_SUPPLICANT_FAILED - - wireless_add_process "$(jsonfilter -s "$supplicant_res" -l 1 -e @.pid)" "/usr/sbin/wpa_supplicant" 1 1 - - return $ret -} - hostapd_common_cleanup() { killall meshd-nl80211 } diff --git a/package/network/services/hostapd/files/hostapd.uc b/package/network/services/hostapd/files/hostapd.uc new file mode 100644 index 0000000000..593840cca8 --- /dev/null +++ b/package/network/services/hostapd/files/hostapd.uc @@ -0,0 +1,812 @@ +let libubus = require("ubus"); +import { open, readfile } from "fs"; +import { wdev_create, wdev_remove, is_equal, vlist_new, phy_is_fullmac, phy_open } from "common"; + +let ubus = libubus.connect(); + +hostapd.data.config = {}; + +hostapd.data.file_fields = { + vlan_file: true, + wpa_psk_file: true, + accept_mac_file: true, + deny_mac_file: true, + eap_user_file: true, + ca_cert: true, + server_cert: true, + server_cert2: true, + private_key: true, + private_key2: true, + dh_file: true, + eap_sim_db: true, +}; + +function iface_remove(cfg) +{ + if (!cfg || !cfg.bss || !cfg.bss[0] || !cfg.bss[0].ifname) + return; + + for (let bss in cfg.bss) + wdev_remove(bss.ifname); +} + +function iface_gen_config(phy, config, start_disabled) +{ + let str = `data: +${join("\n", config.radio.data)} +channel=${config.radio.channel} +`; + + for (let i = 0; i < length(config.bss); i++) { + let bss = config.bss[i]; + let type = i > 0 ? "bss" : "interface"; + let nasid = bss.nasid ?? replace(bss.bssid, ":", ""); + + str += ` +${type}=${bss.ifname} +bssid=${bss.bssid} +${join("\n", bss.data)} +nas_identifier=${nasid} +`; + if (start_disabled) + str += ` +start_disabled=1 +`; + } + + return str; +} + +function iface_freq_info(iface, config, params) +{ + let freq = params.frequency; + if (!freq) + return null; + + let sec_offset = params.sec_chan_offset; + if (sec_offset != -1 && sec_offset != 1) + sec_offset = 0; + + let width = 0; + for (let line in config.radio.data) { + if (!sec_offset && match(line, /^ht_capab=.*HT40/)) { + sec_offset = null; // auto-detect + continue; + } + + let val = match(line, /^(vht_oper_chwidth|he_oper_chwidth)=(\d+)/); + if (!val) + continue; + + val = int(val[2]); + if (val > width) + width = val; + } + + if (freq < 4000) + width = 0; + + return hostapd.freq_info(freq, sec_offset, width); +} + +function iface_add(phy, config, phy_status) +{ + let config_inline = iface_gen_config(phy, config, !!phy_status); + + let bss = config.bss[0]; + let ret = hostapd.add_iface(`bss_config=${phy}:${config_inline}`); + if (ret < 0) + return false; + + if (!phy_status) + return true; + + let iface = hostapd.interfaces[phy]; + if (!iface) + return false; + + let freq_info = iface_freq_info(iface, config, phy_status); + + return iface.start(freq_info) >= 0; +} + +function iface_config_macaddr_list(config) +{ + let macaddr_list = {}; + for (let i = 0; i < length(config.bss); i++) { + let bss = config.bss[i]; + if (!bss.default_macaddr) + macaddr_list[bss.bssid] = i; + } + + return macaddr_list; +} + +function iface_update_supplicant_macaddr(phy, config) +{ + let macaddr_list = []; + for (let i = 0; i < length(config.bss); i++) + push(macaddr_list, config.bss[i].bssid); + ubus.call("wpa_supplicant", "phy_set_macaddr_list", { phy: phy, macaddr: macaddr_list }); +} + +function iface_restart(phydev, config, old_config) +{ + let phy = phydev.name; + + hostapd.remove_iface(phy); + iface_remove(old_config); + iface_remove(config); + + if (!config.bss || !config.bss[0]) { + hostapd.printf(`No bss for phy ${phy}`); + return; + } + + phydev.macaddr_init(iface_config_macaddr_list(config)); + for (let i = 0; i < length(config.bss); i++) { + let bss = config.bss[i]; + if (bss.default_macaddr) + bss.bssid = phydev.macaddr_next(); + } + + iface_update_supplicant_macaddr(phy, config); + + let bss = config.bss[0]; + let err = wdev_create(phy, bss.ifname, { mode: "ap" }); + if (err) + hostapd.printf(`Failed to create ${bss.ifname} on phy ${phy}: ${err}`); + + let ubus = hostapd.data.ubus; + let phy_status = ubus.call("wpa_supplicant", "phy_status", { phy: phy }); + if (phy_status && phy_status.state == "COMPLETED") { + if (iface_add(phy, config, phy_status)) + return; + + hostapd.printf(`Failed to bring up phy ${phy} ifname=${bss.ifname} with supplicant provided frequency`); + } + + ubus.call("wpa_supplicant", "phy_set_state", { phy: phy, stop: true }); + if (!iface_add(phy, config)) + hostapd.printf(`hostapd.add_iface failed for phy ${phy} ifname=${bss.ifname}`); + ubus.call("wpa_supplicant", "phy_set_state", { phy: phy, stop: false }); +} + +function array_to_obj(arr, key, start) +{ + let obj = {}; + + start ??= 0; + for (let i = start; i < length(arr); i++) { + let cur = arr[i]; + obj[cur[key]] = cur; + } + + return obj; +} + +function find_array_idx(arr, key, val) +{ + for (let i = 0; i < length(arr); i++) + if (arr[i][key] == val) + return i; + + return -1; +} + +function bss_reload_psk(bss, config, old_config) +{ + if (is_equal(old_config.hash.wpa_psk_file, config.hash.wpa_psk_file)) + return; + + old_config.hash.wpa_psk_file = config.hash.wpa_psk_file; + if (!is_equal(old_config, config)) + return; + + let ret = bss.ctrl("RELOAD_WPA_PSK"); + ret ??= "failed"; + + hostapd.printf(`Reload WPA PSK file for bss ${config.ifname}: ${ret}`); +} + +function remove_file_fields(config) +{ + return filter(config, (line) => !hostapd.data.file_fields[split(line, "=")[0]]); +} + +function bss_remove_file_fields(config) +{ + let new_cfg = {}; + + for (let key in config) + new_cfg[key] = config[key]; + new_cfg.data = remove_file_fields(new_cfg.data); + new_cfg.hash = {}; + for (let key in config.hash) + new_cfg.hash[key] = config.hash[key]; + delete new_cfg.hash.wpa_psk_file; + delete new_cfg.hash.vlan_file; + + return new_cfg; +} + +function bss_config_hash(config) +{ + return hostapd.sha1(remove_file_fields(config) + ""); +} + +function bss_find_existing(config, prev_config, prev_hash) +{ + let hash = bss_config_hash(config.data); + + for (let i = 0; i < length(prev_config.bss); i++) { + if (!prev_hash[i] || hash != prev_hash[i]) + continue; + + prev_hash[i] = null; + return i; + } + + return -1; +} + +function get_config_bss(config, idx) +{ + if (!config.bss[idx]) { + hostapd.printf(`Invalid bss index ${idx}`); + return null; + } + + let ifname = config.bss[idx].ifname; + if (!ifname) + hostapd.printf(`Could not find bss ${config.bss[idx].ifname}`); + + return hostapd.bss[ifname]; +} + +function iface_reload_config(phydev, config, old_config) +{ + let phy = phydev.name; + + if (!old_config || !is_equal(old_config.radio, config.radio)) + return false; + + if (is_equal(old_config.bss, config.bss)) + return true; + + if (!old_config.bss || !old_config.bss[0]) + return false; + + let iface = hostapd.interfaces[phy]; + if (!iface) { + hostapd.printf(`Could not find previous interface ${iface_name}`); + return false; + } + + let iface_name = old_config.bss[0].ifname; + let first_bss = hostapd.bss[iface_name]; + if (!first_bss) { + hostapd.printf(`Could not find bss of previous interface ${iface_name}`); + return false; + } + + let macaddr_list = iface_config_macaddr_list(config); + let bss_list = []; + let bss_list_cfg = []; + let prev_bss_hash = []; + + for (let bss in old_config.bss) { + let hash = bss_config_hash(bss.data); + push(prev_bss_hash, bss_config_hash(bss.data)); + } + + // Step 1: find (possibly renamed) interfaces with the same config + // and store them in the new order (with gaps) + for (let i = 0; i < length(config.bss); i++) { + let prev; + + // For fullmac devices, the first interface needs to be preserved, + // since it's treated as the master + if (!i && phy_is_fullmac(phy)) { + prev = 0; + prev_bss_hash[0] = null; + } else { + prev = bss_find_existing(config.bss[i], old_config, prev_bss_hash); + } + if (prev < 0) + continue; + + let cur_config = config.bss[i]; + let prev_config = old_config.bss[prev]; + + let prev_bss = get_config_bss(old_config, prev); + if (!prev_bss) + return false; + + // try to preserve MAC address of this BSS by reassigning another + // BSS if necessary + if (cur_config.default_macaddr && + !macaddr_list[prev_config.bssid]) { + macaddr_list[prev_config.bssid] = i; + cur_config.bssid = prev_config.bssid; + } + + bss_list[i] = prev_bss; + bss_list_cfg[i] = old_config.bss[prev]; + } + + if (config.mbssid && !bss_list_cfg[0]) { + hostapd.printf("First BSS changed with MBSSID enabled"); + return false; + } + + // Step 2: if none were found, rename and preserve the first one + if (length(bss_list) == 0) { + // can't change the bssid of the first bss + if (config.bss[0].bssid != old_config.bss[0].bssid) { + if (!config.bss[0].default_macaddr) { + hostapd.printf(`BSSID of first interface changed: ${lc(old_config.bss[0].bssid)} -> ${lc(config.bss[0].bssid)}`); + return false; + } + + config.bss[0].bssid = old_config.bss[0].bssid; + } + + let prev_bss = get_config_bss(old_config, 0); + if (!prev_bss) + return false; + + macaddr_list[config.bss[0].bssid] = 0; + bss_list[0] = prev_bss; + bss_list_cfg[0] = old_config.bss[0]; + prev_bss_hash[0] = null; + } + + // Step 3: delete all unused old interfaces + for (let i = 0; i < length(prev_bss_hash); i++) { + if (!prev_bss_hash[i]) + continue; + + let prev_bss = get_config_bss(old_config, i); + if (!prev_bss) + return false; + + let ifname = old_config.bss[i].ifname; + hostapd.printf(`Remove bss '${ifname}' on phy '${phy}'`); + prev_bss.delete(); + wdev_remove(ifname); + } + + // Step 4: rename preserved interfaces, use temporary name on duplicates + let rename_list = []; + for (let i = 0; i < length(bss_list); i++) { + if (!bss_list[i]) + continue; + + let old_ifname = bss_list_cfg[i].ifname; + let new_ifname = config.bss[i].ifname; + if (old_ifname == new_ifname) + continue; + + if (hostapd.bss[new_ifname]) { + new_ifname = "tmp_" + substr(hostapd.sha1(new_ifname), 0, 8); + push(rename_list, i); + } + + hostapd.printf(`Rename bss ${old_ifname} to ${new_ifname}`); + if (!bss_list[i].rename(new_ifname)) { + hostapd.printf(`Failed to rename bss ${old_ifname} to ${new_ifname}`); + return false; + } + + bss_list_cfg[i].ifname = new_ifname; + } + + // Step 5: rename interfaces with temporary names + for (let i in rename_list) { + let new_ifname = config.bss[i].ifname; + if (!bss_list[i].rename(new_ifname)) { + hostapd.printf(`Failed to rename bss to ${new_ifname}`); + return false; + } + bss_list_cfg[i].ifname = new_ifname; + } + + // Step 6: assign BSSID for newly created interfaces + let macaddr_data = { + num_global: config.num_global_macaddr ?? 1, + mbssid: config.mbssid ?? 0, + }; + macaddr_list = phydev.macaddr_init(macaddr_list, macaddr_data); + for (let i = 0; i < length(config.bss); i++) { + if (bss_list[i]) + continue; + let bsscfg = config.bss[i]; + + let mac_idx = macaddr_list[bsscfg.bssid]; + if (mac_idx < 0) + macaddr_list[bsscfg.bssid] = i; + if (mac_idx == i) + continue; + + // statically assigned bssid of the new interface is in conflict + // with the bssid of a reused interface. reassign the reused interface + if (!bsscfg.default_macaddr) { + // can't update bssid of the first BSS, need to restart + if (!mac_idx < 0) + return false; + + bsscfg = config.bss[mac_idx]; + } + + let addr = phydev.macaddr_next(i); + if (!addr) { + hostapd.printf(`Failed to generate mac address for phy ${phy}`); + return false; + } + bsscfg.bssid = addr; + } + + let config_inline = iface_gen_config(phy, config); + + // Step 7: fill in the gaps with new interfaces + for (let i = 0; i < length(config.bss); i++) { + let ifname = config.bss[i].ifname; + let bss = bss_list[i]; + + if (bss) + continue; + + hostapd.printf(`Add bss ${ifname} on phy ${phy}`); + bss_list[i] = iface.add_bss(config_inline, i); + if (!bss_list[i]) { + hostapd.printf(`Failed to add new bss ${ifname} on phy ${phy}`); + return false; + } + } + + // Step 8: update interface bss order + if (!iface.set_bss_order(bss_list)) { + hostapd.printf(`Failed to update BSS order on phy '${phy}'`); + return false; + } + + // Step 9: update config + for (let i = 0; i < length(config.bss); i++) { + if (!bss_list_cfg[i]) + continue; + + let ifname = config.bss[i].ifname; + let bss = bss_list[i]; + + if (is_equal(config.bss[i], bss_list_cfg[i])) + continue; + + if (is_equal(bss_remove_file_fields(config.bss[i]), + bss_remove_file_fields(bss_list_cfg[i]))) { + hostapd.printf(`Update config data files for bss ${ifname}`); + if (bss.set_config(config_inline, i, true) < 0) { + hostapd.printf(`Could not update config data files for bss ${ifname}`); + return false; + } else { + bss.ctrl("RELOAD_WPA_PSK"); + continue; + } + } + + bss_reload_psk(bss, config.bss[i], bss_list_cfg[i]); + if (is_equal(config.bss[i], bss_list_cfg[i])) + continue; + + hostapd.printf(`Reload config for bss '${config.bss[0].ifname}' on phy '${phy}'`); + if (bss.set_config(config_inline, i) < 0) { + hostapd.printf(`Failed to set config for bss ${ifname}`); + return false; + } + } + + return true; +} + +function iface_set_config(phy, config) +{ + let old_config = hostapd.data.config[phy]; + + hostapd.data.config[phy] = config; + + if (!config) { + hostapd.remove_iface(phy); + return iface_remove(old_config); + } + + let phydev = phy_open(phy); + if (!phydev) { + hostapd.printf(`Failed to open phy ${phy}`); + return false; + } + + try { + let ret = iface_reload_config(phydev, config, old_config); + if (ret) { + iface_update_supplicant_macaddr(phy, config); + hostapd.printf(`Reloaded settings for phy ${phy}`); + return 0; + } + } catch (e) { + hostapd.printf(`Error reloading config: ${e}\n${e.stacktrace[0].context}`); + } + + hostapd.printf(`Restart interface for phy ${phy}`); + let ret = iface_restart(phydev, config, old_config); + + return ret; +} + +function config_add_bss(config, name) +{ + let bss = { + ifname: name, + data: [], + hash: {} + }; + + push(config.bss, bss); + + return bss; +} + +function iface_load_config(filename) +{ + let f = open(filename, "r"); + if (!f) + return null; + + let config = { + radio: { + data: [] + }, + bss: [], + orig_file: filename, + }; + + let bss; + let line; + while ((line = rtrim(f.read("line"), "\n")) != null) { + let val = split(line, "=", 2); + if (!val[0]) + continue; + + if (val[0] == "interface") { + bss = config_add_bss(config, val[1]); + break; + } + + if (val[0] == "channel") { + config.radio.channel = val[1]; + continue; + } + + if (val[0] == "#num_global_macaddr" || + val[0] == "mbssid") + config[val[0]] = int(val[1]); + + push(config.radio.data, line); + } + + while ((line = rtrim(f.read("line"), "\n")) != null) { + if (line == "#default_macaddr") + bss.default_macaddr = true; + + let val = split(line, "=", 2); + if (!val[0]) + continue; + + if (val[0] == "bssid") { + bss.bssid = lc(val[1]); + continue; + } + + if (val[0] == "nas_identifier") + bss.nasid = val[1]; + + if (val[0] == "bss") { + bss = config_add_bss(config, val[1]); + continue; + } + + if (hostapd.data.file_fields[val[0]]) + bss.hash[val[0]] = hostapd.sha1(readfile(val[1])); + + push(bss.data, line); + } + f.close(); + + return config; +} + +function ex_wrap(func) { + return (req) => { + try { + let ret = func(req); + return ret; + } catch(e) { + hostapd.printf(`Exception in ubus function: ${e}\n${e.stacktrace[0].context}`); + } + return libubus.STATUS_UNKNOWN_ERROR; + }; +} + +let main_obj = { + reload: { + args: { + phy: "", + }, + call: ex_wrap(function(req) { + let phy_list = req.args.phy ? [ req.args.phy ] : keys(hostapd.data.config); + for (let phy_name in phy_list) { + let phy = hostapd.data.config[phy_name]; + let config = iface_load_config(phy.orig_file); + iface_set_config(phy_name, config); + } + + return 0; + }) + }, + apsta_state: { + args: { + phy: "", + up: true, + frequency: 0, + sec_chan_offset: 0, + csa: true, + csa_count: 0, + }, + call: ex_wrap(function(req) { + if (req.args.up == null || !req.args.phy) + return libubus.STATUS_INVALID_ARGUMENT; + + let phy = req.args.phy; + let config = hostapd.data.config[phy]; + if (!config || !config.bss || !config.bss[0] || !config.bss[0].ifname) + return 0; + + let iface = hostapd.interfaces[phy]; + if (!iface) + return 0; + + if (!req.args.up) { + iface.stop(); + return 0; + } + + if (!req.args.frequency) + return libubus.STATUS_INVALID_ARGUMENT; + + let freq_info = iface_freq_info(iface, config, req.args); + if (!freq_info) + return libubus.STATUS_UNKNOWN_ERROR; + + let ret; + if (req.args.csa) { + freq_info.csa_count = req.args.csa_count ?? 10; + ret = iface.switch_channel(freq_info); + } else { + ret = iface.start(freq_info); + } + if (!ret) + return libubus.STATUS_UNKNOWN_ERROR; + + return 0; + }) + }, + config_get_macaddr_list: { + args: { + phy: "" + }, + call: ex_wrap(function(req) { + let phy = req.args.phy; + if (!phy) + return libubus.STATUS_INVALID_ARGUMENT; + + let ret = { + macaddr: [], + }; + + let config = hostapd.data.config[phy]; + if (!config) + return ret; + + ret.macaddr = map(config.bss, (bss) => bss.bssid); + return ret; + }) + }, + config_set: { + args: { + phy: "", + config: "", + prev_config: "", + }, + call: ex_wrap(function(req) { + let phy = req.args.phy; + let file = req.args.config; + let prev_file = req.args.prev_config; + + if (!phy) + return libubus.STATUS_INVALID_ARGUMENT; + + if (prev_file && !hostapd.data.config[phy]) { + let config = iface_load_config(prev_file); + if (config) + config.radio.data = []; + hostapd.data.config[phy] = config; + } + + let config = iface_load_config(file); + + hostapd.printf(`Set new config for phy ${phy}: ${file}`); + iface_set_config(phy, config); + + return { + pid: hostapd.getpid() + }; + }) + }, + config_add: { + args: { + iface: "", + config: "", + }, + call: ex_wrap(function(req) { + if (!req.args.iface || !req.args.config) + return libubus.STATUS_INVALID_ARGUMENT; + + if (hostapd.add_iface(`bss_config=${req.args.iface}:${req.args.config}`) < 0) + return libubus.STATUS_INVALID_ARGUMENT; + + return { + pid: hostapd.getpid() + }; + }) + }, + config_remove: { + args: { + iface: "" + }, + call: ex_wrap(function(req) { + if (!req.args.iface) + return libubus.STATUS_INVALID_ARGUMENT; + + hostapd.remove_iface(req.args.iface); + return 0; + }) + }, +}; + +hostapd.data.ubus = ubus; +hostapd.data.obj = ubus.publish("hostapd", main_obj); + +function bss_event(type, name, data) { + let ubus = hostapd.data.ubus; + + data ??= {}; + data.name = name; + hostapd.data.obj.notify(`bss.${type}`, data, null, null, null, -1); + ubus.call("service", "event", { type: `hostapd.${name}.${type}`, data: {} }); +} + +return { + shutdown: function() { + for (let phy in hostapd.data.config) + iface_set_config(phy, null); + hostapd.ubus.disconnect(); + }, + bss_add: function(name, obj) { + bss_event("add", name); + }, + bss_reload: function(name, obj, reconf) { + bss_event("reload", name, { reconf: reconf != 0 }); + }, + bss_remove: function(name, obj) { + bss_event("remove", name); + } +}; diff --git a/package/network/services/hostapd/files/radius.clients b/package/network/services/hostapd/files/radius.clients new file mode 100644 index 0000000000..3175dcfd04 --- /dev/null +++ b/package/network/services/hostapd/files/radius.clients @@ -0,0 +1 @@ +0.0.0.0/0 radius diff --git a/package/network/services/hostapd/files/radius.config b/package/network/services/hostapd/files/radius.config new file mode 100644 index 0000000000..ad8730748b --- /dev/null +++ b/package/network/services/hostapd/files/radius.config @@ -0,0 +1,9 @@ +config radius + option disabled '1' + option ca_cert '/etc/radius/ca.pem' + option cert '/etc/radius/cert.pem' + option key '/etc/radius/key.pem' + option users '/etc/radius/users' + option clients '/etc/radius/clients' + option auth_port '1812' + option acct_port '1813' diff --git a/package/network/services/hostapd/files/radius.init b/package/network/services/hostapd/files/radius.init new file mode 100644 index 0000000000..4c562c2473 --- /dev/null +++ b/package/network/services/hostapd/files/radius.init @@ -0,0 +1,42 @@ +#!/bin/sh /etc/rc.common + +START=30 + +USE_PROCD=1 +NAME=radius + +radius_start() { + local cfg="$1" + + config_get_bool disabled "$cfg" disabled 0 + + [ "$disabled" -gt 0 ] && return + + config_get ca "$cfg" ca_cert + config_get key "$cfg" key + config_get cert "$cfg" cert + config_get users "$cfg" users + config_get clients "$cfg" clients + config_get auth_port "$cfg" auth_port 1812 + config_get acct_port "$cfg" acct_port 1813 + config_get identity "$cfg" identity "$(cat /proc/sys/kernel/hostname)" + + procd_open_instance $cfg + procd_set_param command /usr/sbin/hostapd-radius \ + -C "$ca" \ + -c "$cert" -k "$key" \ + -s "$clients" -u "$users" \ + -p "$auth_port" -P "$acct_port" \ + -i "$identity" + procd_close_instance +} + +start_service() { + config_load radius + config_foreach radius_start radius +} + +service_triggers() +{ + procd_add_reload_trigger "radius" +} diff --git a/package/network/services/hostapd/files/radius.users b/package/network/services/hostapd/files/radius.users new file mode 100644 index 0000000000..03e2fc8fae --- /dev/null +++ b/package/network/services/hostapd/files/radius.users @@ -0,0 +1,14 @@ +{ + "phase1": { + "wildcard": [ + { + "name": "*", + "methods": [ "PEAP" ] + } + ] + }, + "phase2": { + "users": { + } + } +} diff --git a/package/network/services/hostapd/files/wdev.uc b/package/network/services/hostapd/files/wdev.uc new file mode 100644 index 0000000000..ff4d629fd6 --- /dev/null +++ b/package/network/services/hostapd/files/wdev.uc @@ -0,0 +1,185 @@ +#!/usr/bin/env ucode +'use strict'; +import { vlist_new, is_equal, wdev_create, wdev_set_mesh_params, wdev_remove, wdev_set_up, phy_open } from "/usr/share/hostap/common.uc"; +import { readfile, writefile, basename, readlink, glob } from "fs"; +let libubus = require("ubus"); + +let keep_devices = {}; +let phy = shift(ARGV); +let command = shift(ARGV); +let phydev; + +function iface_stop(wdev) +{ + if (keep_devices[wdev.ifname]) + return; + + wdev_remove(wdev.ifname); +} + +function iface_start(wdev) +{ + let ifname = wdev.ifname; + + if (readfile(`/sys/class/net/${ifname}/ifindex`)) { + wdev_set_up(ifname, false); + wdev_remove(ifname); + } + let wdev_config = {}; + for (let key in wdev) + wdev_config[key] = wdev[key]; + if (!wdev_config.macaddr && wdev.mode != "monitor") + wdev_config.macaddr = phydev.macaddr_next(); + wdev_create(phy, ifname, wdev_config); + wdev_set_up(ifname, true); + if (wdev.freq) + system(`iw dev ${ifname} set freq ${wdev.freq} ${wdev.htmode}`); + if (wdev.mode == "adhoc") { + let cmd = ["iw", "dev", ifname, "ibss", "join", wdev.ssid, wdev.freq, wdev.htmode, "fixed-freq" ]; + if (wdev.bssid) + push(cmd, wdev.bssid); + for (let key in [ "beacon-interval", "basic-rates", "mcast-rate", "keys" ]) + if (wdev[key]) + push(cmd, key, wdev[key]); + system(cmd); + } else if (wdev.mode == "mesh") { + let cmd = [ "iw", "dev", ifname, "mesh", "join", wdev.ssid, "freq", wdev.freq, wdev.htmode ]; + for (let key in [ "mcast-rate", "beacon-interval" ]) + if (wdev[key]) + push(cmd, key, wdev[key]); + system(cmd); + + wdev_set_mesh_params(ifname, wdev); + } +} + +function iface_cb(new_if, old_if) +{ + if (old_if && new_if && is_equal(old_if, new_if)) + return; + + if (old_if) + iface_stop(old_if); + if (new_if) + iface_start(new_if); +} + +function drop_inactive(config) +{ + for (let key in config) { + if (!readfile(`/sys/class/net/${key}/ifindex`)) + delete config[key]; + } +} + +function add_ifname(config) +{ + for (let key in config) + config[key].ifname = key; +} + +function delete_ifname(config) +{ + for (let key in config) + delete config[key].ifname; +} + +function add_existing(phy, config) +{ + let wdevs = glob(`/sys/class/ieee80211/${phy}/device/net/*`); + wdevs = map(wdevs, (arg) => basename(arg)); + for (let wdev in wdevs) { + if (config[wdev]) + continue; + + if (basename(readlink(`/sys/class/net/${wdev}/phy80211`)) != phy) + continue; + + if (trim(readfile(`/sys/class/net/${wdev}/operstate`)) == "down") + config[wdev] = {}; + } +} + +function usage() +{ + warn(`Usage: ${basename(sourcepath())} [] + +Commands: + set_config [ - get phy MAC address for vif index +`); + exit(1); +} + +const commands = { + set_config: function(args) { + let statefile = `/var/run/wdev-${phy}.json`; + + let new_config = shift(args); + for (let dev in ARGV) + keep_devices[dev] = true; + + if (!new_config) + usage(); + + new_config = json(new_config); + if (!new_config) { + warn("Invalid configuration\n"); + exit(1); + } + + let old_config = readfile(statefile); + if (old_config) + old_config = json(old_config); + + let config = vlist_new(iface_cb); + if (type(old_config) == "object") + config.data = old_config; + + add_existing(phy, config.data); + add_ifname(config.data); + drop_inactive(config.data); + + let ubus = libubus.connect(); + let data = ubus.call("hostapd", "config_get_macaddr_list", { phy: phy }); + let macaddr_list = []; + if (type(data) == "object" && data.macaddr) + macaddr_list = data.macaddr; + ubus.disconnect(); + phydev.macaddr_init(macaddr_list); + + add_ifname(new_config); + config.update(new_config); + + drop_inactive(config.data); + delete_ifname(config.data); + writefile(statefile, sprintf("%J", config.data)); + }, + get_macaddr: function(args) { + let data = {}; + + for (let arg in args) { + arg = split(arg, "=", 2); + data[arg[0]] = arg[1]; + } + + let macaddr = phydev.macaddr_generate(data); + if (!macaddr) { + warn(`Could not get MAC address for phy ${phy}\n`); + exit(1); + } + + print(macaddr + "\n"); + }, +}; + +if (!phy || !command | !commands[command]) + usage(); + +phydev = phy_open(phy); +if (!phydev) { + warn(`PHY ${phy} does not exist\n`); + exit(1); +} + +commands[command](ARGV); diff --git a/package/network/services/hostapd/files/wpa_supplicant-basic.config b/package/network/services/hostapd/files/wpa_supplicant-basic.config index f96bf16e9e..e2456fe093 100644 --- a/package/network/services/hostapd/files/wpa_supplicant-basic.config +++ b/package/network/services/hostapd/files/wpa_supplicant-basic.config @@ -26,7 +26,7 @@ # replacement for WEXT and its use allows wpa_supplicant to properly control # the driver to improve existing functionality like roaming and to support new # functionality. -CONFIG_DRIVER_WEXT=y +#CONFIG_DRIVER_WEXT=y # Driver interface for Linux drivers using the nl80211 kernel interface CONFIG_DRIVER_NL80211=y @@ -315,7 +315,7 @@ CONFIG_NO_LINUX_PACKET_SOCKET_WAR=y #CONFIG_IEEE80211W=y # Support Operating Channel Validation -#CONFIG_OCV=y +CONFIG_OCV=y # Select TLS implementation # openssl = OpenSSL (default) @@ -568,6 +568,7 @@ CONFIG_GETRANDOM=y # Supported ACS drivers: # * ath9k # * ath5k +# * ath10k # # For more details refer to: # http://wireless.kernel.org/en/users/Documentation/acs diff --git a/package/network/services/hostapd/files/wpa_supplicant-full.config b/package/network/services/hostapd/files/wpa_supplicant-full.config index c18f554e6a..b5bb917cf0 100644 --- a/package/network/services/hostapd/files/wpa_supplicant-full.config +++ b/package/network/services/hostapd/files/wpa_supplicant-full.config @@ -26,7 +26,7 @@ # replacement for WEXT and its use allows wpa_supplicant to properly control # the driver to improve existing functionality like roaming and to support new # functionality. -CONFIG_DRIVER_WEXT=y +#CONFIG_DRIVER_WEXT=y # Driver interface for Linux drivers using the nl80211 kernel interface CONFIG_DRIVER_NL80211=y @@ -315,7 +315,7 @@ CONFIG_NO_LINUX_PACKET_SOCKET_WAR=y #CONFIG_IEEE80211W=y # Support Operating Channel Validation -#CONFIG_OCV=y +CONFIG_OCV=y # Select TLS implementation # openssl = OpenSSL (default) @@ -568,6 +568,7 @@ CONFIG_HS20=y # Supported ACS drivers: # * ath9k # * ath5k +# * ath10k # # For more details refer to: # http://wireless.kernel.org/en/users/Documentation/acs diff --git a/package/network/services/hostapd/files/wpa_supplicant-mini.config b/package/network/services/hostapd/files/wpa_supplicant-mini.config index 107691372e..28f98b5ac7 100644 --- a/package/network/services/hostapd/files/wpa_supplicant-mini.config +++ b/package/network/services/hostapd/files/wpa_supplicant-mini.config @@ -26,7 +26,7 @@ # replacement for WEXT and its use allows wpa_supplicant to properly control # the driver to improve existing functionality like roaming and to support new # functionality. -CONFIG_DRIVER_WEXT=y +#CONFIG_DRIVER_WEXT=y # Driver interface for Linux drivers using the nl80211 kernel interface CONFIG_DRIVER_NL80211=y @@ -568,6 +568,7 @@ CONFIG_GETRANDOM=y # Supported ACS drivers: # * ath9k # * ath5k +# * ath10k # # For more details refer to: # http://wireless.kernel.org/en/users/Documentation/acs diff --git a/package/network/services/hostapd/files/wpa_supplicant-p2p.config b/package/network/services/hostapd/files/wpa_supplicant-p2p.config index ed6745444a..f6861fd826 100644 --- a/package/network/services/hostapd/files/wpa_supplicant-p2p.config +++ b/package/network/services/hostapd/files/wpa_supplicant-p2p.config @@ -26,7 +26,7 @@ # replacement for WEXT and its use allows wpa_supplicant to properly control # the driver to improve existing functionality like roaming and to support new # functionality. -CONFIG_DRIVER_WEXT=y +#CONFIG_DRIVER_WEXT=y # Driver interface for Linux drivers using the nl80211 kernel interface CONFIG_DRIVER_NL80211=y @@ -568,6 +568,7 @@ CONFIG_P2P=y # Supported ACS drivers: # * ath9k # * ath5k +# * ath10k # # For more details refer to: # http://wireless.kernel.org/en/users/Documentation/acs @@ -621,4 +622,4 @@ CONFIG_UBUS=y # libreCMC patch 380-disable-ctrl-iface-mib.patch # leads to the MIB only being compiled in if # CONFIG_CTRL_IFACE_MIB is enabled. -#CONFIG_CTRL_IFACE_MIB=y +CONFIG_CTRL_IFACE_MIB=y diff --git a/package/network/services/hostapd/files/wpa_supplicant.uc b/package/network/services/hostapd/files/wpa_supplicant.uc new file mode 100644 index 0000000000..d624f27cdd --- /dev/null +++ b/package/network/services/hostapd/files/wpa_supplicant.uc @@ -0,0 +1,348 @@ +let libubus = require("ubus"); +import { open, readfile } from "fs"; +import { wdev_create, wdev_set_mesh_params, wdev_remove, is_equal, wdev_set_up, vlist_new, phy_open } from "common"; + +let ubus = libubus.connect(); + +wpas.data.config = {}; +wpas.data.iface_phy = {}; +wpas.data.macaddr_list = {}; + +function iface_stop(iface) +{ + let ifname = iface.config.iface; + + if (!iface.running) + return; + + delete wpas.data.iface_phy[ifname]; + wpas.remove_iface(ifname); + wdev_remove(ifname); + iface.running = false; +} + +function iface_start(phydev, iface, macaddr_list) +{ + let phy = phydev.name; + + if (iface.running) + return; + + let ifname = iface.config.iface; + let wdev_config = {}; + for (let field in iface.config) + wdev_config[field] = iface.config[field]; + if (!wdev_config.macaddr) + wdev_config.macaddr = phydev.macaddr_next(); + + wpas.data.iface_phy[ifname] = phy; + wdev_remove(ifname); + let ret = wdev_create(phy, ifname, wdev_config); + if (ret) + wpas.printf(`Failed to create device ${ifname}: ${ret}`); + wdev_set_up(ifname, true); + wpas.add_iface(iface.config); + iface.running = true; +} + +function iface_cb(new_if, old_if) +{ + if (old_if && new_if && is_equal(old_if.config, new_if.config)) { + new_if.running = old_if.running; + return; + } + + if (new_if && old_if) + wpas.printf(`Update configuration for interface ${old_if.config.iface}`); + else if (old_if) + wpas.printf(`Remove interface ${old_if.config.iface}`); + + if (old_if) + iface_stop(old_if); +} + +function prepare_config(config) +{ + config.config_data = readfile(config.config); + + return { config: config }; +} + +function set_config(phy_name, config_list) +{ + let phy = wpas.data.config[phy_name]; + + if (!phy) { + phy = vlist_new(iface_cb, false); + wpas.data.config[phy_name] = phy; + } + + let values = []; + for (let config in config_list) + push(values, [ config.iface, prepare_config(config) ]); + + phy.update(values); +} + +function start_pending(phy_name) +{ + let phy = wpas.data.config[phy_name]; + let ubus = wpas.data.ubus; + + if (!phy || !phy.data) + return; + + let phydev = phy_open(phy_name); + if (!phydev) { + wpas.printf(`Could not open phy ${phy_name}`); + return; + } + + let macaddr_list = wpas.data.macaddr_list[phy_name]; + phydev.macaddr_init(macaddr_list); + + for (let ifname in phy.data) + iface_start(phydev, phy.data[ifname]); +} + +let main_obj = { + phy_set_state: { + args: { + phy: "", + stop: true, + }, + call: function(req) { + if (!req.args.phy || req.args.stop == null) + return libubus.STATUS_INVALID_ARGUMENT; + + let phy = wpas.data.config[req.args.phy]; + if (!phy) + return libubus.STATUS_NOT_FOUND; + + try { + if (req.args.stop) { + for (let ifname in phy.data) + iface_stop(phy.data[ifname]); + } else { + start_pending(req.args.phy); + } + } catch (e) { + wpas.printf(`Error chaging state: ${e}\n${e.stacktrace[0].context}`); + return libubus.STATUS_INVALID_ARGUMENT; + } + return 0; + } + }, + phy_set_macaddr_list: { + args: { + phy: "", + macaddr: [], + }, + call: function(req) { + let phy = req.args.phy; + if (!phy) + return libubus.STATUS_INVALID_ARGUMENT; + + wpas.data.macaddr_list[phy] = req.args.macaddr; + return 0; + } + }, + phy_status: { + args: { + phy: "" + }, + call: function(req) { + if (!req.args.phy) + return libubus.STATUS_INVALID_ARGUMENT; + + let phy = wpas.data.config[req.args.phy]; + if (!phy) + return libubus.STATUS_NOT_FOUND; + + for (let ifname in phy.data) { + try { + let iface = wpas.interfaces[ifname]; + if (!iface) + continue; + + let status = iface.status(); + if (!status) + continue; + + if (status.state == "INTERFACE_DISABLED") + continue; + + status.ifname = ifname; + return status; + } catch (e) { + continue; + } + } + + return libubus.STATUS_NOT_FOUND; + } + }, + config_set: { + args: { + phy: "", + config: [], + defer: true, + }, + call: function(req) { + if (!req.args.phy) + return libubus.STATUS_INVALID_ARGUMENT; + + wpas.printf(`Set new config for phy ${req.args.phy}`); + try { + if (req.args.config) + set_config(req.args.phy, req.args.config); + + if (!req.args.defer) + start_pending(req.args.phy); + } catch (e) { + wpas.printf(`Error loading config: ${e}\n${e.stacktrace[0].context}`); + return libubus.STATUS_INVALID_ARGUMENT; + } + + return { + pid: wpas.getpid() + }; + } + }, + config_add: { + args: { + driver: "", + iface: "", + bridge: "", + hostapd_ctrl: "", + ctrl: "", + config: "", + }, + call: function(req) { + if (!req.args.iface || !req.args.config) + return libubus.STATUS_INVALID_ARGUMENT; + + if (wpas.add_iface(req.args) < 0) + return libubus.STATUS_INVALID_ARGUMENT; + + return { + pid: wpas.getpid() + }; + } + }, + config_remove: { + args: { + iface: "" + }, + call: function(req) { + if (!req.args.iface) + return libubus.STATUS_INVALID_ARGUMENT; + + wpas.remove_iface(req.args.iface); + return 0; + } + }, +}; + +wpas.data.ubus = ubus; +wpas.data.obj = ubus.publish("wpa_supplicant", main_obj); + +function iface_event(type, name, data) { + let ubus = wpas.data.ubus; + + data ??= {}; + data.name = name; + wpas.data.obj.notify(`iface.${type}`, data, null, null, null, -1); + ubus.call("service", "event", { type: `wpa_supplicant.${name}.${type}`, data: {} }); +} + +function iface_hostapd_notify(phy, ifname, iface, state) +{ + let ubus = wpas.data.ubus; + let status = iface.status(); + let msg = { phy: phy }; + + switch (state) { + case "DISCONNECTED": + case "AUTHENTICATING": + case "SCANNING": + msg.up = false; + break; + case "INTERFACE_DISABLED": + case "INACTIVE": + msg.up = true; + break; + case "COMPLETED": + msg.up = true; + msg.frequency = status.frequency; + msg.sec_chan_offset = status.sec_chan_offset; + break; + default: + return; + } + + ubus.call("hostapd", "apsta_state", msg); +} + +function iface_channel_switch(phy, ifname, iface, info) +{ + let msg = { + phy: phy, + up: true, + csa: true, + csa_count: info.csa_count ? info.csa_count - 1 : 0, + frequency: info.frequency, + sec_chan_offset: info.sec_chan_offset, + }; + ubus.call("hostapd", "apsta_state", msg); +} + +return { + shutdown: function() { + for (let phy in wpas.data.config) + set_config(phy, []); + wpas.ubus.disconnect(); + }, + iface_add: function(name, obj) { + iface_event("add", name); + }, + iface_remove: function(name, obj) { + iface_event("remove", name); + }, + state: function(ifname, iface, state) { + let phy = wpas.data.iface_phy[ifname]; + if (!phy) { + wpas.printf(`no PHY for ifname ${ifname}`); + return; + } + + iface_hostapd_notify(phy, ifname, iface, state); + + if (state != "COMPLETED") + return; + + let phy_data = wpas.data.config[phy]; + if (!phy_data) + return; + + let iface_data = phy_data.data[ifname]; + if (!iface_data) + return; + + let wdev_config = iface_data.config; + if (!wdev_config || wdev_config.mode != "mesh") + return; + + wdev_set_mesh_params(ifname, wdev_config); + }, + event: function(ifname, iface, ev, info) { + let phy = wpas.data.iface_phy[ifname]; + if (!phy) { + wpas.printf(`no PHY for ifname ${ifname}`); + return; + } + + if (ev == "CH_SWITCH_STARTED") + iface_channel_switch(phy, ifname, iface, info); + } +}; diff --git a/package/network/services/hostapd/files/wpad.init b/package/network/services/hostapd/files/wpad.init index 79c5bf1075..65d46df982 100644 --- a/package/network/services/hostapd/files/wpad.init +++ b/package/network/services/hostapd/files/wpad.init @@ -13,6 +13,7 @@ start_service() { procd_open_instance hostapd procd_set_param command /usr/sbin/hostapd -s -g /var/run/hostapd/global procd_set_param respawn 3600 1 0 + procd_set_param limits core="unlimited" [ -x /sbin/ujail -a -e /etc/capabilities/wpad.json ] && { procd_add_jail hostapd procd_set_param capabilities /etc/capabilities/wpad.json @@ -29,6 +30,7 @@ start_service() { procd_open_instance supplicant procd_set_param command /usr/sbin/wpa_supplicant -n -s -g /var/run/wpa_supplicant/global procd_set_param respawn 3600 1 0 + procd_set_param limits core="unlimited" [ -x /sbin/ujail -a -e /etc/capabilities/wpad.json ] && { procd_add_jail wpa_supplicant procd_set_param capabilities /etc/capabilities/wpad.json diff --git a/package/network/services/hostapd/files/wpad_acl.json b/package/network/services/hostapd/files/wpad_acl.json index c77ccd8ea0..d00fd945ba 100644 --- a/package/network/services/hostapd/files/wpad_acl.json +++ b/package/network/services/hostapd/files/wpad_acl.json @@ -3,6 +3,12 @@ "access": { "service": { "methods": [ "event" ] + }, + "wpa_supplicant": { + "methods": [ "phy_set_state", "phy_set_macaddr_list", "phy_status" ] + }, + "hostapd": { + "methods": [ "apsta_state" ] } }, "publish": [ "hostapd", "hostapd.*", "wpa_supplicant", "wpa_supplicant.*" ], diff --git a/package/network/services/hostapd/patches/001-wolfssl-init-RNG-with-ECC-key.patch b/package/network/services/hostapd/patches/001-wolfssl-init-RNG-with-ECC-key.patch index 994aa30626..269dcaac75 100644 --- a/package/network/services/hostapd/patches/001-wolfssl-init-RNG-with-ECC-key.patch +++ b/package/network/services/hostapd/patches/001-wolfssl-init-RNG-with-ECC-key.patch @@ -16,7 +16,7 @@ Signed-off-by: David Bauer --- a/src/crypto/crypto_wolfssl.c +++ b/src/crypto/crypto_wolfssl.c -@@ -1307,6 +1307,7 @@ int ecc_projective_add_point(ecc_point * +@@ -1340,6 +1340,7 @@ int ecc_projective_add_point(ecc_point * struct crypto_ec { ecc_key key; @@ -24,7 +24,7 @@ Signed-off-by: David Bauer mp_int a; mp_int prime; mp_int order; -@@ -1361,6 +1362,8 @@ struct crypto_ec * crypto_ec_init(int gr +@@ -1394,6 +1395,8 @@ struct crypto_ec * crypto_ec_init(int gr return NULL; if (wc_ecc_init(&e->key) != 0 || @@ -33,7 +33,7 @@ Signed-off-by: David Bauer wc_ecc_set_curve(&e->key, 0, curve_id) != 0 || mp_init(&e->a) != MP_OKAY || mp_init(&e->prime) != MP_OKAY || -@@ -1392,6 +1395,7 @@ void crypto_ec_deinit(struct crypto_ec* +@@ -1425,6 +1428,7 @@ void crypto_ec_deinit(struct crypto_ec* mp_clear(&e->order); mp_clear(&e->prime); mp_clear(&e->a); diff --git a/package/network/services/hostapd/patches/010-mesh-Allow-DFS-channels-to-be-selected-if-dfs-is-ena.patch b/package/network/services/hostapd/patches/010-mesh-Allow-DFS-channels-to-be-selected-if-dfs-is-ena.patch index 16d24d1000..0a51c84d21 100644 --- a/package/network/services/hostapd/patches/010-mesh-Allow-DFS-channels-to-be-selected-if-dfs-is-ena.patch +++ b/package/network/services/hostapd/patches/010-mesh-Allow-DFS-channels-to-be-selected-if-dfs-is-ena.patch @@ -14,7 +14,7 @@ Signed-off-by: Peter Oh --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c -@@ -2409,7 +2409,7 @@ static int drv_supports_vht(struct wpa_s +@@ -2638,7 +2638,7 @@ static int drv_supports_vht(struct wpa_s } @@ -23,7 +23,7 @@ Signed-off-by: Peter Oh { int i; -@@ -2418,7 +2418,10 @@ static bool ibss_mesh_is_80mhz_avail(int +@@ -2647,7 +2647,10 @@ static bool ibss_mesh_is_80mhz_avail(int chan = hw_get_channel_chan(mode, i, NULL); if (!chan || @@ -35,16 +35,16 @@ Signed-off-by: Peter Oh return false; } -@@ -2447,6 +2450,8 @@ void ibss_mesh_setup_freq(struct wpa_sup - int chwidth, seg0, seg1; - u32 vht_caps = 0; - bool is_24ghz, is_6ghz; -+ bool dfs_enabled = wpa_s->conf->country[0] && -+ (wpa_s->drv_flags & WPA_DRIVER_FLAGS_RADAR); - - freq->freq = ssid->frequency; - -@@ -2543,8 +2548,11 @@ void ibss_mesh_setup_freq(struct wpa_sup +@@ -2774,7 +2777,7 @@ static void ibss_mesh_select_40mhz(struc + const struct wpa_ssid *ssid, + struct hostapd_hw_modes *mode, + struct hostapd_freq_params *freq, +- int obss_scan) { ++ int obss_scan, bool dfs_enabled) { + int chan_idx; + struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL; + int i, res; +@@ -2798,8 +2801,11 @@ static void ibss_mesh_select_40mhz(struc return; /* Check primary channel flags */ @@ -55,9 +55,9 @@ Signed-off-by: Peter Oh + if (!dfs_enabled) + return; - freq->channel = pri_chan->chan; - -@@ -2577,8 +2585,11 @@ void ibss_mesh_setup_freq(struct wpa_sup + #ifdef CONFIG_HT_OVERRIDES + if (ssid->disable_ht40) +@@ -2825,8 +2831,11 @@ static void ibss_mesh_select_40mhz(struc return; /* Check secondary channel flags */ @@ -70,25 +70,34 @@ Signed-off-by: Peter Oh if (ht40 == -1) { if (!(pri_chan->flag & HOSTAPD_CHAN_HT40MINUS)) -@@ -2667,7 +2678,7 @@ skip_to_6ghz: - return; - - /* Back to HT configuration if channel not usable */ +@@ -2880,7 +2889,7 @@ static bool ibss_mesh_select_80_160mhz(s + const struct wpa_ssid *ssid, + struct hostapd_hw_modes *mode, + struct hostapd_freq_params *freq, +- int ieee80211_mode, bool is_6ghz) { ++ int ieee80211_mode, bool is_6ghz, bool dfs_enabled) { + static const int bw80[] = { + 5180, 5260, 5500, 5580, 5660, 5745, 5825, + 5955, 6035, 6115, 6195, 6275, 6355, 6435, +@@ -2925,7 +2934,7 @@ static bool ibss_mesh_select_80_160mhz(s + goto skip_80mhz; + + /* Use 40 MHz if channel not usable */ - if (!ibss_mesh_is_80mhz_avail(channel, mode)) + if (!ibss_mesh_is_80mhz_avail(channel, mode, dfs_enabled)) - return; - - chwidth = CHANWIDTH_80MHZ; -@@ -2681,7 +2692,7 @@ skip_to_6ghz: - * above; check the remaining four 20 MHz channels for the total - * of 160 MHz bandwidth. - */ -- if (!ibss_mesh_is_80mhz_avail(channel + 16, mode)) -+ if (!ibss_mesh_is_80mhz_avail(channel + 16, mode, dfs_enabled)) - return; - + goto skip_80mhz; + + chwidth = CONF_OPER_CHWIDTH_80MHZ; +@@ -2939,7 +2948,7 @@ static bool ibss_mesh_select_80_160mhz(s + if ((mode->he_capab[ieee80211_mode].phy_cap[ + HE_PHYCAP_CHANNEL_WIDTH_SET_IDX] & + HE_PHYCAP_CHANNEL_WIDTH_SET_160MHZ_IN_5G) && is_6ghz && +- ibss_mesh_is_80mhz_avail(channel + 16, mode)) { ++ ibss_mesh_is_80mhz_avail(channel + 16, mode, dfs_enabled)) { for (j = 0; j < ARRAY_SIZE(bw160); j++) { -@@ -2711,10 +2722,12 @@ skip_to_6ghz: + if (freq->freq == bw160[j]) { + chwidth = CONF_OPER_CHWIDTH_160MHZ; +@@ -2967,10 +2976,12 @@ static bool ibss_mesh_select_80_160mhz(s if (!chan) continue; @@ -103,4 +112,24 @@ Signed-off-by: Peter Oh + continue; /* Found a suitable second segment for 80+80 */ - chwidth = CHANWIDTH_80P80MHZ; + chwidth = CONF_OPER_CHWIDTH_80P80MHZ; +@@ -3025,6 +3036,7 @@ void ibss_mesh_setup_freq(struct wpa_sup + int i, obss_scan = 1; + u8 channel; + bool is_6ghz; ++ bool dfs_enabled = wpa_s->conf->country[0] && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_RADAR); + + freq->freq = ssid->frequency; + +@@ -3070,9 +3082,9 @@ void ibss_mesh_setup_freq(struct wpa_sup + freq->channel = channel; + /* Setup higher BW only for 5 GHz */ + if (mode->mode == HOSTAPD_MODE_IEEE80211A) { +- ibss_mesh_select_40mhz(wpa_s, ssid, mode, freq, obss_scan); ++ ibss_mesh_select_40mhz(wpa_s, ssid, mode, freq, obss_scan, dfs_enabled); + if (!ibss_mesh_select_80_160mhz(wpa_s, ssid, mode, freq, +- ieee80211_mode, is_6ghz)) ++ ieee80211_mode, is_6ghz, dfs_enabled)) + freq->he_enabled = freq->vht_enabled = false; + } + diff --git a/package/network/services/hostapd/patches/011-mesh-use-deterministic-channel-on-channel-switch.patch b/package/network/services/hostapd/patches/011-mesh-use-deterministic-channel-on-channel-switch.patch index 1faeacf766..07b7a5971d 100644 --- a/package/network/services/hostapd/patches/011-mesh-use-deterministic-channel-on-channel-switch.patch +++ b/package/network/services/hostapd/patches/011-mesh-use-deterministic-channel-on-channel-switch.patch @@ -28,8 +28,8 @@ Signed-off-by: Markus Theil +#include "crypto/crypto.h" - static int dfs_get_used_n_chans(struct hostapd_iface *iface, int *seg1) -@@ -483,9 +484,14 @@ dfs_get_valid_channel(struct hostapd_ifa + enum dfs_channel_type { +@@ -526,9 +527,14 @@ dfs_get_valid_channel(struct hostapd_ifa int num_available_chandefs; int chan_idx, chan_idx2; int sec_chan_idx_80p80 = -1; @@ -44,7 +44,7 @@ Signed-off-by: Markus Theil wpa_printf(MSG_DEBUG, "DFS: Selecting random channel"); *secondary_channel = 0; *oper_centr_freq_seg0_idx = 0; -@@ -505,8 +511,20 @@ dfs_get_valid_channel(struct hostapd_ifa +@@ -548,8 +554,20 @@ dfs_get_valid_channel(struct hostapd_ifa if (num_available_chandefs == 0) return NULL; @@ -64,11 +64,11 @@ Signed-off-by: Markus Theil return NULL; + chan_idx = _rand % num_available_chandefs; - dfs_find_channel(iface, &chan, chan_idx, skip_radar); + dfs_find_channel(iface, &chan, chan_idx, type); if (!chan) { --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c -@@ -9895,6 +9895,10 @@ static int nl80211_switch_channel(void * +@@ -11017,6 +11017,10 @@ static int nl80211_switch_channel(void * if (ret) goto error; diff --git a/package/network/services/hostapd/patches/021-fix-sta-add-after-previous-connection.patch b/package/network/services/hostapd/patches/021-fix-sta-add-after-previous-connection.patch index ac02ec5ab7..edf599e3e2 100644 --- a/package/network/services/hostapd/patches/021-fix-sta-add-after-previous-connection.patch +++ b/package/network/services/hostapd/patches/021-fix-sta-add-after-previous-connection.patch @@ -1,6 +1,6 @@ --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c -@@ -4944,6 +4944,13 @@ static int add_associated_sta(struct hos +@@ -4621,6 +4621,13 @@ static int add_associated_sta(struct hos * drivers to accept the STA parameter configuration. Since this is * after a new FT-over-DS exchange, a new TK has been derived, so key * reinstallation is not a concern for this case. @@ -14,7 +14,7 @@ */ wpa_printf(MSG_DEBUG, "Add associated STA " MACSTR " (added_unassoc=%d auth_alg=%u ft_over_ds=%u reassoc=%d authorized=%d ft_tk=%d fils_tk=%d)", -@@ -4957,7 +4964,8 @@ static int add_associated_sta(struct hos +@@ -4634,7 +4641,8 @@ static int add_associated_sta(struct hos (!(sta->flags & WLAN_STA_AUTHORIZED) || (reassoc && sta->ft_over_ds && sta->auth_alg == WLAN_AUTH_FT) || (!wpa_auth_sta_ft_tk_already_set(sta->wpa_sm) && diff --git a/package/network/services/hostapd/patches/022-hostapd-fix-use-of-uninitialized-stack-variables.patch b/package/network/services/hostapd/patches/022-hostapd-fix-use-of-uninitialized-stack-variables.patch index c7da33f029..8dec325c98 100644 --- a/package/network/services/hostapd/patches/022-hostapd-fix-use-of-uninitialized-stack-variables.patch +++ b/package/network/services/hostapd/patches/022-hostapd-fix-use-of-uninitialized-stack-variables.patch @@ -14,7 +14,7 @@ Signed-off-by: Felix Fietkau --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c -@@ -3431,7 +3431,7 @@ static int hostapd_change_config_freq(st +@@ -3764,7 +3764,7 @@ static int hostapd_change_config_freq(st struct hostapd_freq_params *old_params) { int channel; diff --git a/package/network/services/hostapd/patches/030-driver_nl80211-rewrite-neigh-code-to-not-depend-on-l.patch b/package/network/services/hostapd/patches/030-driver_nl80211-rewrite-neigh-code-to-not-depend-on-l.patch index ade0b11311..ef2bb408fb 100644 --- a/package/network/services/hostapd/patches/030-driver_nl80211-rewrite-neigh-code-to-not-depend-on-l.patch +++ b/package/network/services/hostapd/patches/030-driver_nl80211-rewrite-neigh-code-to-not-depend-on-l.patch @@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau #include #include #include -@@ -5300,26 +5297,29 @@ fail: +@@ -5783,26 +5780,29 @@ fail: static void rtnl_neigh_delete_fdb_entry(struct i802_bss *bss, const u8 *addr) { @@ -64,7 +64,7 @@ Signed-off-by: Felix Fietkau if (err < 0) { wpa_printf(MSG_DEBUG, "nl80211: bridge FDB entry delete for " MACSTR " ifindex=%d failed: %s", MAC2STR(addr), -@@ -5329,9 +5329,8 @@ static void rtnl_neigh_delete_fdb_entry( +@@ -5812,9 +5812,8 @@ static void rtnl_neigh_delete_fdb_entry( MACSTR, MAC2STR(addr)); } @@ -76,7 +76,7 @@ Signed-off-by: Felix Fietkau } -@@ -7714,7 +7713,6 @@ static void *i802_init(struct hostapd_da +@@ -8492,7 +8491,6 @@ static void *i802_init(struct hostapd_da (params->num_bridge == 0 || !params->bridge[0])) add_ifidx(drv, br_ifindex, drv->ifindex); @@ -84,7 +84,7 @@ Signed-off-by: Felix Fietkau if (bss->added_if_into_bridge || bss->already_in_bridge) { int err; -@@ -7731,7 +7729,6 @@ static void *i802_init(struct hostapd_da +@@ -8509,7 +8507,6 @@ static void *i802_init(struct hostapd_da goto failed; } } @@ -92,7 +92,7 @@ Signed-off-by: Felix Fietkau if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) { wpa_printf(MSG_DEBUG, -@@ -10678,13 +10675,14 @@ static int wpa_driver_br_add_ip_neigh(vo +@@ -11883,13 +11880,14 @@ static int wpa_driver_br_add_ip_neigh(vo const u8 *ipaddr, int prefixlen, const u8 *addr) { @@ -112,7 +112,7 @@ Signed-off-by: Felix Fietkau int res; if (!ipaddr || prefixlen == 0 || !addr) -@@ -10703,85 +10701,66 @@ static int wpa_driver_br_add_ip_neigh(vo +@@ -11908,85 +11906,66 @@ static int wpa_driver_br_add_ip_neigh(vo } if (version == 4) { @@ -220,7 +220,7 @@ Signed-off-by: Felix Fietkau addrsize = 16; } else { return -EINVAL; -@@ -10799,41 +10778,30 @@ static int wpa_driver_br_delete_ip_neigh +@@ -12004,41 +11983,30 @@ static int wpa_driver_br_delete_ip_neigh return -1; } diff --git a/package/network/services/hostapd/patches/040-mesh-allow-processing-authentication-frames-in-block.patch b/package/network/services/hostapd/patches/040-mesh-allow-processing-authentication-frames-in-block.patch index 6d9fd81acf..b7bf9e351e 100644 --- a/package/network/services/hostapd/patches/040-mesh-allow-processing-authentication-frames-in-block.patch +++ b/package/network/services/hostapd/patches/040-mesh-allow-processing-authentication-frames-in-block.patch @@ -16,7 +16,7 @@ Signed-off-by: Felix Fietkau --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c -@@ -3761,15 +3761,6 @@ static void handle_auth(struct hostapd_d +@@ -3020,15 +3020,6 @@ static void handle_auth(struct hostapd_d seq_ctrl); return; } @@ -25,7 +25,7 @@ Signed-off-by: Felix Fietkau - sta->plink_state == PLINK_BLOCKED) { - wpa_printf(MSG_DEBUG, "Mesh peer " MACSTR - " is blocked - drop Authentication frame", -- MAC2STR(mgmt->sa)); +- MAC2STR(sa)); - return; - } -#endif /* CONFIG_MESH */ diff --git a/package/network/services/hostapd/patches/050-build_fix.patch b/package/network/services/hostapd/patches/050-build_fix.patch index 2652a83316..8680b07c66 100644 --- a/package/network/services/hostapd/patches/050-build_fix.patch +++ b/package/network/services/hostapd/patches/050-build_fix.patch @@ -1,6 +1,6 @@ --- a/hostapd/Makefile +++ b/hostapd/Makefile -@@ -323,6 +323,7 @@ ifdef CONFIG_FILS +@@ -324,6 +324,7 @@ ifdef CONFIG_FILS CFLAGS += -DCONFIG_FILS OBJS += ../src/ap/fils_hlp.o NEED_SHA384=y @@ -10,7 +10,7 @@ CFLAGS += -DCONFIG_FILS_SK_PFS --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile -@@ -312,6 +312,7 @@ endif +@@ -331,6 +331,7 @@ endif ifdef CONFIG_FILS CFLAGS += -DCONFIG_FILS NEED_SHA384=y diff --git a/package/network/services/hostapd/patches/100-daemonize_fix.patch b/package/network/services/hostapd/patches/100-daemonize_fix.patch deleted file mode 100644 index 687bd4082d..0000000000 --- a/package/network/services/hostapd/patches/100-daemonize_fix.patch +++ /dev/null @@ -1,97 +0,0 @@ ---- a/src/utils/os_unix.c -+++ b/src/utils/os_unix.c -@@ -10,6 +10,7 @@ - - #include - #include -+#include - - #ifdef ANDROID - #include -@@ -188,59 +189,46 @@ int os_gmtime(os_time_t t, struct os_tm - return 0; - } - -- --#ifdef __APPLE__ --#include --static int os_daemon(int nochdir, int noclose) -+int os_daemonize(const char *pid_file) - { -- int devnull; -+ int pid = 0, i, devnull; - -- if (chdir("/") < 0) -- return -1; -+#if defined(__uClinux__) || defined(__sun__) -+ return -1; -+#else /* defined(__uClinux__) || defined(__sun__) */ - -- devnull = open("/dev/null", O_RDWR); -- if (devnull < 0) -+#ifndef __APPLE__ -+ pid = fork(); -+ if (pid < 0) - return -1; -+#endif - -- if (dup2(devnull, STDIN_FILENO) < 0) { -- close(devnull); -- return -1; -+ if (pid > 0) { -+ if (pid_file) { -+ FILE *f = fopen(pid_file, "w"); -+ if (f) { -+ fprintf(f, "%u\n", pid); -+ fclose(f); -+ } -+ } -+ _exit(0); - } - -- if (dup2(devnull, STDOUT_FILENO) < 0) { -- close(devnull); -+ if (setsid() < 0) - return -1; -- } - -- if (dup2(devnull, STDERR_FILENO) < 0) { -- close(devnull); -+ if (chdir("/") < 0) - return -1; -- } -- -- return 0; --} --#else /* __APPLE__ */ --#define os_daemon daemon --#endif /* __APPLE__ */ - -- --int os_daemonize(const char *pid_file) --{ --#if defined(__uClinux__) || defined(__sun__) -- return -1; --#else /* defined(__uClinux__) || defined(__sun__) */ -- if (os_daemon(0, 0)) { -- perror("daemon"); -+ devnull = open("/dev/null", O_RDWR); -+ if (devnull < 0) - return -1; -- } - -- if (pid_file) { -- FILE *f = fopen(pid_file, "w"); -- if (f) { -- fprintf(f, "%u\n", getpid()); -- fclose(f); -- } -- } -+ for (i = 0; i <= STDERR_FILENO; i++) -+ dup2(devnull, i); -+ -+ if (devnull > 2) -+ close(devnull); - - return -0; - #endif /* defined(__uClinux__) || defined(__sun__) */ diff --git a/package/network/services/hostapd/patches/110-mbedtls-TLS-crypto-option-initial-port.patch b/package/network/services/hostapd/patches/110-mbedtls-TLS-crypto-option-initial-port.patch new file mode 100644 index 0000000000..22107944dc --- /dev/null +++ b/package/network/services/hostapd/patches/110-mbedtls-TLS-crypto-option-initial-port.patch @@ -0,0 +1,8051 @@ +From e16f200dc1d2f69efc78c7c55af0d7b410a981f9 Mon Sep 17 00:00:00 2001 +From: Glenn Strauss +Date: Tue, 5 Jul 2022 02:49:50 -0400 +Subject: [PATCH 1/7] mbedtls: TLS/crypto option (initial port) + +Signed-off-by: Glenn Strauss +--- + hostapd/Makefile | 91 + + hostapd/defconfig | 15 +- + src/crypto/crypto_mbedtls.c | 4043 +++++++++++++++++ + src/crypto/tls_mbedtls.c | 3313 ++++++++++++++ + .../build/build-wpa_supplicant-mbedtls.config | 24 + + tests/hwsim/example-hostapd.config | 4 + + tests/hwsim/example-wpa_supplicant.config | 4 + + wpa_supplicant/Makefile | 74 + + wpa_supplicant/defconfig | 6 +- + 9 files changed, 7571 insertions(+), 3 deletions(-) + create mode 100644 src/crypto/crypto_mbedtls.c + create mode 100644 src/crypto/tls_mbedtls.c + create mode 100644 tests/build/build-wpa_supplicant-mbedtls.config + +--- a/hostapd/Makefile ++++ b/hostapd/Makefile +@@ -745,6 +745,40 @@ endif + CFLAGS += -DTLS_DEFAULT_CIPHERS=\"$(CONFIG_TLS_DEFAULT_CIPHERS)\" + endif + ++ifeq ($(CONFIG_TLS), mbedtls) ++ifndef CONFIG_CRYPTO ++CONFIG_CRYPTO=mbedtls ++endif ++ifdef TLS_FUNCS ++OBJS += ../src/crypto/tls_mbedtls.o ++LIBS += -lmbedtls ++ifndef CONFIG_DPP ++LIBS += -lmbedx509 ++endif ++endif ++OBJS += ../src/crypto/crypto_$(CONFIG_CRYPTO).o ++HOBJS += ../src/crypto/crypto_$(CONFIG_CRYPTO).o ++SOBJS += ../src/crypto/crypto_$(CONFIG_CRYPTO).o ++ifdef NEED_FIPS186_2_PRF ++OBJS += ../src/crypto/fips_prf_internal.o ++SHA1OBJS += ../src/crypto/sha1-internal.o ++endif ++ifeq ($(CONFIG_CRYPTO), mbedtls) ++ifdef CONFIG_DPP ++LIBS += -lmbedx509 ++LIBS_h += -lmbedx509 ++LIBS_n += -lmbedx509 ++LIBS_s += -lmbedx509 ++endif ++LIBS += -lmbedcrypto ++LIBS_h += -lmbedcrypto ++LIBS_n += -lmbedcrypto ++LIBS_s += -lmbedcrypto ++# XXX: create a config option? ++CFLAGS += -DCRYPTO_RSA_OAEP_SHA256 ++endif ++endif ++ + ifeq ($(CONFIG_TLS), gnutls) + ifndef CONFIG_CRYPTO + # default to libgcrypt +@@ -924,9 +958,11 @@ endif + + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + AESOBJS += ../src/crypto/aes-wrap.o + endif + endif ++endif + ifdef NEED_AES_EAX + AESOBJS += ../src/crypto/aes-eax.o + NEED_AES_CTR=y +@@ -936,38 +972,48 @@ AESOBJS += ../src/crypto/aes-siv.o + NEED_AES_CTR=y + endif + ifdef NEED_AES_CTR ++ifneq ($(CONFIG_TLS), mbedtls) + AESOBJS += ../src/crypto/aes-ctr.o + endif ++endif + ifdef NEED_AES_ENCBLOCK ++ifneq ($(CONFIG_TLS), mbedtls) + AESOBJS += ../src/crypto/aes-encblock.o + endif ++endif + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + AESOBJS += ../src/crypto/aes-omac1.o + endif + endif + endif ++endif + ifdef NEED_AES_UNWRAP + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + NEED_AES_DEC=y + AESOBJS += ../src/crypto/aes-unwrap.o + endif + endif + endif + endif ++endif + ifdef NEED_AES_CBC + NEED_AES_DEC=y + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + AESOBJS += ../src/crypto/aes-cbc.o + endif + endif + endif + endif ++endif + ifdef NEED_AES_DEC + ifdef CONFIG_INTERNAL_AES + AESOBJS += ../src/crypto/aes-internal-dec.o +@@ -982,12 +1028,16 @@ ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), gnutls) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + SHA1OBJS += ../src/crypto/sha1.o + endif + endif + endif + endif ++endif ++ifneq ($(CONFIG_TLS), mbedtls) + SHA1OBJS += ../src/crypto/sha1-prf.o ++endif + ifdef CONFIG_INTERNAL_SHA1 + SHA1OBJS += ../src/crypto/sha1-internal.o + ifdef NEED_FIPS186_2_PRF +@@ -996,16 +1046,22 @@ endif + endif + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + SHA1OBJS += ../src/crypto/sha1-pbkdf2.o + endif + endif ++endif + ifdef NEED_T_PRF ++ifneq ($(CONFIG_TLS), mbedtls) + SHA1OBJS += ../src/crypto/sha1-tprf.o + endif ++endif + ifdef NEED_TLS_PRF ++ifneq ($(CONFIG_TLS), mbedtls) + SHA1OBJS += ../src/crypto/sha1-tlsprf.o + endif + endif ++endif + + ifdef NEED_SHA1 + OBJS += $(SHA1OBJS) +@@ -1015,11 +1071,13 @@ ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), gnutls) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/md5.o + endif + endif + endif + endif ++endif + + ifdef NEED_MD5 + ifdef CONFIG_INTERNAL_MD5 +@@ -1058,56 +1116,81 @@ ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), gnutls) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha256.o + endif + endif + endif + endif ++endif ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha256-prf.o ++endif + ifdef CONFIG_INTERNAL_SHA256 + OBJS += ../src/crypto/sha256-internal.o + endif + ifdef NEED_TLS_PRF_SHA256 ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha256-tlsprf.o + endif ++endif + ifdef NEED_TLS_PRF_SHA384 ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha384-tlsprf.o + endif ++endif + ifdef NEED_HMAC_SHA256_KDF ++CFLAGS += -DCONFIG_HMAC_SHA256_KDF ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha256-kdf.o + endif ++endif + ifdef NEED_HMAC_SHA384_KDF ++CFLAGS += -DCONFIG_HMAC_SHA384_KDF ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha384-kdf.o + endif ++endif + ifdef NEED_HMAC_SHA512_KDF ++CFLAGS += -DCONFIG_HMAC_SHA512_KDF ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha512-kdf.o + endif ++endif + ifdef NEED_SHA384 + CFLAGS += -DCONFIG_SHA384 + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), gnutls) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha384.o + endif + endif + endif + endif ++endif ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha384-prf.o + endif ++endif + ifdef NEED_SHA512 + CFLAGS += -DCONFIG_SHA512 + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), gnutls) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha512.o + endif + endif + endif + endif ++endif ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha512-prf.o + endif ++endif + + ifdef CONFIG_INTERNAL_SHA384 + CFLAGS += -DCONFIG_INTERNAL_SHA384 +@@ -1152,11 +1235,13 @@ HOBJS += $(SHA1OBJS) + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + HOBJS += ../src/crypto/md5.o + endif + endif + endif + endif ++endif + + ifdef CONFIG_RADIUS_SERVER + CFLAGS += -DRADIUS_SERVER +@@ -1329,7 +1414,9 @@ NOBJS += ../src/utils/trace.o + endif + + HOBJS += hlr_auc_gw.o ../src/utils/common.o ../src/utils/wpa_debug.o ../src/utils/os_$(CONFIG_OS).o ../src/utils/wpabuf.o ../src/crypto/milenage.o ++ifneq ($(CONFIG_TLS), mbedtls) + HOBJS += ../src/crypto/aes-encblock.o ++endif + ifdef CONFIG_INTERNAL_AES + HOBJS += ../src/crypto/aes-internal.o + HOBJS += ../src/crypto/aes-internal-enc.o +@@ -1352,13 +1439,17 @@ SOBJS += ../src/common/sae.o + SOBJS += ../src/common/sae_pk.o + SOBJS += ../src/common/dragonfly.o + SOBJS += $(AESOBJS) ++ifneq ($(CONFIG_TLS), mbedtls) + SOBJS += ../src/crypto/sha256-prf.o + SOBJS += ../src/crypto/sha384-prf.o + SOBJS += ../src/crypto/sha512-prf.o ++endif + SOBJS += ../src/crypto/dh_groups.o ++ifneq ($(CONFIG_TLS), mbedtls) + SOBJS += ../src/crypto/sha256-kdf.o + SOBJS += ../src/crypto/sha384-kdf.o + SOBJS += ../src/crypto/sha512-kdf.o ++endif + + _OBJS_VAR := NOBJS + include ../src/objs.mk +--- a/hostapd/defconfig ++++ b/hostapd/defconfig +@@ -6,9 +6,21 @@ + # just setting VARIABLE=n is not disabling that variable. + # + # This file is included in Makefile, so variables like CFLAGS and LIBS can also +-# be modified from here. In most cass, these lines should use += in order not ++# be modified from here. In most cases, these lines should use += in order not + # to override previous values of the variables. + ++ ++# Uncomment following two lines and fix the paths if you have installed TLS ++# libraries in a non-default location ++#CFLAGS += -I/usr/local/openssl/include ++#LIBS += -L/usr/local/openssl/lib ++ ++# Some Red Hat versions seem to include kerberos header files from OpenSSL, but ++# the kerberos files are not in the default include path. Following line can be ++# used to fix build issues on such systems (krb5.h not found). ++#CFLAGS += -I/usr/include/kerberos ++ ++ + # Driver interface for Host AP driver + CONFIG_DRIVER_HOSTAP=y + +@@ -278,6 +290,7 @@ CONFIG_IPV6=y + # openssl = OpenSSL (default) + # gnutls = GnuTLS + # internal = Internal TLSv1 implementation (experimental) ++# mbedtls = mbed TLS + # linux = Linux kernel AF_ALG and internal TLSv1 implementation (experimental) + # none = Empty template + #CONFIG_TLS=openssl +--- /dev/null ++++ b/src/crypto/crypto_mbedtls.c +@@ -0,0 +1,4043 @@ ++/* ++ * crypto wrapper functions for mbed TLS ++ * ++ * SPDX-FileCopyrightText: 2022 Glenn Strauss ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++#include "utils/includes.h" ++#include "utils/common.h" ++ ++#include ++#include ++#include ++#include /* mbedtls_platform_zeroize() */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef MBEDTLS_PRIVATE ++#define MBEDTLS_PRIVATE(x) x ++#endif ++ ++/* hostapd/wpa_supplicant provides forced_memzero(), ++ * but prefer mbedtls_platform_zeroize() */ ++#define forced_memzero(ptr,sz) mbedtls_platform_zeroize(ptr,sz) ++ ++#ifndef __has_attribute ++#define __has_attribute(x) 0 ++#endif ++ ++#ifndef __GNUC_PREREQ ++#define __GNUC_PREREQ(maj,min) 0 ++#endif ++ ++#ifndef __attribute_cold__ ++#if __has_attribute(cold) \ ++ || __GNUC_PREREQ(4,3) ++#define __attribute_cold__ __attribute__((__cold__)) ++#else ++#define __attribute_cold__ ++#endif ++#endif ++ ++#ifndef __attribute_noinline__ ++#if __has_attribute(noinline) \ ++ || __GNUC_PREREQ(3,1) ++#define __attribute_noinline__ __attribute__((__noinline__)) ++#else ++#define __attribute_noinline__ ++#endif ++#endif ++ ++#include "crypto.h" ++#include "aes_wrap.h" ++#include "aes.h" ++#include "md5.h" ++#include "sha1.h" ++#include "sha256.h" ++#include "sha384.h" ++#include "sha512.h" ++ ++ ++/* ++ * selective code inclusion based on preprocessor defines ++ * ++ * future: additional code could be wrapped with preprocessor checks if ++ * wpa_supplicant/Makefile and hostap/Makefile were more consistent with ++ * setting preprocessor defines for named groups of functionality ++ */ ++ ++#if defined(CONFIG_FIPS) ++#undef MBEDTLS_MD4_C /* omit md4_vector() */ ++#undef MBEDTLS_MD5_C /* omit md5_vector() hmac_md5_vector() hmac_md5() */ ++#undef MBEDTLS_DES_C /* omit des_encrypt() */ ++#undef MBEDTLS_NIST_KW_C /* omit aes_wrap() aes_unwrap() */ ++#define CRYPTO_MBEDTLS_CONFIG_FIPS ++#endif ++ ++#if !defined(CONFIG_FIPS) ++#if defined(EAP_PWD) \ ++ || defined(EAP_LEAP) || defined(EAP_LEAP_DYNAMIC) \ ++ || defined(EAP_TTLS) || defined(EAP_TTLS_DYNAMIC) \ ++ || defined(EAP_MSCHAPv2) || defined(EAP_MSCHAPv2_DYNAMIC) \ ++ || defined(EAP_SERVER_MSCHAPV2) ++#ifndef MBEDTLS_MD4_C /* (MD4 not in mbedtls 3.x) */ ++#include "md4-internal.c"/* pull in hostap local implementation */ ++#endif /* md4_vector() */ ++#else ++#undef MBEDTLS_MD4_C /* omit md4_vector() */ ++#endif ++#endif ++ ++#if !defined(CONFIG_NO_RC4) && !defined(CONFIG_NO_WPA) ++#ifndef MBEDTLS_ARC4_C /* (RC4 not in mbedtls 3.x) */ ++#include "rc4.c" /* pull in hostap local implementation */ ++#endif /* rc4_skip() */ ++#else ++#undef MBEDTLS_ARC4_C /* omit rc4_skip() */ ++#endif ++ ++#if defined(CONFIG_MACSEC) \ ++ || defined(CONFIG_NO_RADIUS) \ ++ || defined(CONFIG_IEEE80211R) \ ++ || defined(EAP_SERVER_FAST) \ ++ || defined(EAP_SERVER_TEAP) \ ++ || !defined(CONFIG_NO_WPA) ++ /* aes_wrap() aes_unwrap() */ ++#else ++#undef MBEDTLS_NIST_KW_C /* omit aes_wrap() aes_unwrap() */ ++#endif ++ ++#if !defined(CONFIG_SHA256) ++#undef MBEDTLS_SHA256_C ++#endif ++ ++#if !defined(CONFIG_SHA384) && !defined(CONFIG_SHA512) ++#undef MBEDTLS_SHA512_C ++#endif ++ ++#if defined(CONFIG_HMAC_SHA256_KDF) ++#define CRYPTO_MBEDTLS_HMAC_KDF_SHA256 ++#endif ++#if defined(CONFIG_HMAC_SHA384_KDF) ++#define CRYPTO_MBEDTLS_HMAC_KDF_SHA384 ++#endif ++#if defined(CONFIG_HMAC_SHA512_KDF) ++#define CRYPTO_MBEDTLS_HMAC_KDF_SHA512 ++#endif ++ ++#if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST) \ ++ || defined(EAP_TEAP) || defined(EAP_TEAP_DYNAMIC) || defined(EAP_SERVER_FAST) ++#define CRYPTO_MBEDTLS_SHA1_T_PRF ++#endif ++ ++#if defined(CONFIG_DES) ++#define CRYPTO_MBEDTLS_DES_ENCRYPT ++#endif /* des_encrypt() */ ++ ++#if !defined(CONFIG_NO_PBKDF2) ++#define CRYPTO_MBEDTLS_PBKDF2_SHA1 ++#endif /* pbkdf2_sha1() */ ++ ++#if defined(EAP_IKEV2) \ ++ || defined(EAP_IKEV2_DYNAMIC) \ ++ || defined(EAP_SERVER_IKEV2) /* CONFIG_EAP_IKEV2=y */ ++#define CRYPTO_MBEDTLS_CRYPTO_CIPHER ++#endif /* crypto_cipher_*() */ ++ ++#if defined(EAP_PWD) || defined(EAP_SERVER_PWD) /* CONFIG_EAP_PWD=y */ ++#define CRYPTO_MBEDTLS_CRYPTO_HASH ++#endif /* crypto_hash_*() */ ++ ++#if defined(EAP_PWD) || defined(EAP_SERVER_PWD) /* CONFIG_EAP_PWD=y */ \ ++ || defined(CONFIG_SAE) /* CONFIG_SAE=y */ ++#define CRYPTO_MBEDTLS_CRYPTO_BIGNUM ++#endif /* crypto_bignum_*() */ ++ ++#if defined(EAP_PWD) /* CONFIG_EAP_PWD=y */ \ ++ || defined(EAP_EKE) /* CONFIG_EAP_EKE=y */ \ ++ || defined(EAP_EKE_DYNAMIC) /* CONFIG_EAP_EKE=y */ \ ++ || defined(EAP_SERVER_EKE) /* CONFIG_EAP_EKE=y */ \ ++ || defined(EAP_IKEV2) /* CONFIG_EAP_IKEV2y */ \ ++ || defined(EAP_IKEV2_DYNAMIC)/* CONFIG_EAP_IKEV2=y */ \ ++ || defined(EAP_SERVER_IKEV2) /* CONFIG_EAP_IKEV2=y */ \ ++ || defined(CONFIG_SAE) /* CONFIG_SAE=y */ \ ++ || defined(CONFIG_WPS) /* CONFIG_WPS=y */ ++#define CRYPTO_MBEDTLS_CRYPTO_DH ++#if defined(CONFIG_WPS_NFC) ++#define CRYPTO_MBEDTLS_DH5_INIT_FIXED ++#endif /* dh5_init_fixed() */ ++#endif /* crypto_dh_*() */ ++ ++#if !defined(CONFIG_NO_WPA) /* CONFIG_NO_WPA= */ ++#define CRYPTO_MBEDTLS_CRYPTO_ECDH ++#endif /* crypto_ecdh_*() */ ++ ++#if defined(CONFIG_ECC) ++#define CRYPTO_MBEDTLS_CRYPTO_BIGNUM ++#define CRYPTO_MBEDTLS_CRYPTO_EC ++#endif /* crypto_ec_*() crypto_ec_key_*() */ ++ ++#if defined(CONFIG_DPP) /* CONFIG_DPP=y */ ++#define CRYPTO_MBEDTLS_CRYPTO_EC_DPP /* extra for DPP */ ++#define CRYPTO_MBEDTLS_CRYPTO_CSR ++#endif /* crypto_csr_*() */ ++ ++#if defined(CONFIG_DPP3) /* CONFIG_DPP3=y */ ++#define CRYPTO_MBEDTLS_CRYPTO_HPKE ++#endif ++ ++#if defined(CONFIG_DPP2) /* CONFIG_DPP2=y */ ++#define CRYPTO_MBEDTLS_CRYPTO_PKCS7 ++#endif /* crypto_pkcs7_*() */ ++ ++#if defined(EAP_SIM) || defined(EAP_SIM_DYNAMIC) || defined(EAP_SERVER_SIM) \ ++ || defined(EAP_AKA) || defined(EAP_AKA_DYNAMIC) || defined(EAP_SERVER_AKA) \ ++ || defined(CONFIG_AP) || defined(HOSTAPD) ++/* CONFIG_EAP_SIM=y CONFIG_EAP_AKA=y CONFIG_AP=y HOSTAPD */ ++#if defined(CRYPTO_RSA_OAEP_SHA256) ++#define CRYPTO_MBEDTLS_CRYPTO_RSA ++#endif ++#endif /* crypto_rsa_*() */ ++ ++ ++static int ctr_drbg_init_state; ++static mbedtls_ctr_drbg_context ctr_drbg; ++static mbedtls_entropy_context entropy; ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_BIGNUM ++#include ++static mbedtls_mpi mpi_sw_A; ++#endif ++ ++__attribute_cold__ ++__attribute_noinline__ ++static mbedtls_ctr_drbg_context * ctr_drbg_init(void) ++{ ++ mbedtls_ctr_drbg_init(&ctr_drbg); ++ mbedtls_entropy_init(&entropy); ++ if (mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, ++ NULL, 0)) { ++ wpa_printf(MSG_ERROR, "Init of random number generator failed"); ++ /* XXX: abort? */ ++ } ++ else ++ ctr_drbg_init_state = 1; ++ ++ return &ctr_drbg; ++} ++ ++__attribute_cold__ ++void crypto_unload(void) ++{ ++ if (ctr_drbg_init_state) { ++ mbedtls_ctr_drbg_free(&ctr_drbg); ++ mbedtls_entropy_free(&entropy); ++ #ifdef CRYPTO_MBEDTLS_CRYPTO_BIGNUM ++ mbedtls_mpi_free(&mpi_sw_A); ++ #endif ++ ctr_drbg_init_state = 0; ++ } ++} ++ ++/* init ctr_drbg on first use ++ * crypto_global_init() and crypto_global_deinit() are not available here ++ * (available only when CONFIG_TLS=internal, which is not CONFIG_TLS=mbedtls) */ ++mbedtls_ctr_drbg_context * crypto_mbedtls_ctr_drbg(void); /*(not in header)*/ ++inline ++mbedtls_ctr_drbg_context * crypto_mbedtls_ctr_drbg(void) ++{ ++ return ctr_drbg_init_state ? &ctr_drbg : ctr_drbg_init(); ++} ++ ++#ifdef CRYPTO_MBEDTLS_CONFIG_FIPS ++int crypto_get_random(void *buf, size_t len) ++{ ++ return mbedtls_ctr_drbg_random(crypto_mbedtls_ctr_drbg(),buf,len) ? -1 : 0; ++} ++#endif ++ ++ ++#if 1 ++ ++/* tradeoff: slightly smaller code size here at cost of slight increase ++ * in instructions and function calls at runtime versus the expanded ++ * per-message-digest code that follows in #else (~0.5 kib .text larger) */ ++ ++__attribute_noinline__ ++static int md_vector(size_t num_elem, const u8 *addr[], const size_t *len, ++ u8 *mac, mbedtls_md_type_t md_type) ++{ ++ mbedtls_md_context_t ctx; ++ mbedtls_md_init(&ctx); ++ if (mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 0) != 0){ ++ mbedtls_md_free(&ctx); ++ return -1; ++ } ++ mbedtls_md_starts(&ctx); ++ for (size_t i = 0; i < num_elem; ++i) ++ mbedtls_md_update(&ctx, addr[i], len[i]); ++ mbedtls_md_finish(&ctx, mac); ++ mbedtls_md_free(&ctx); ++ return 0; ++} ++ ++#ifdef MBEDTLS_SHA512_C ++int sha512_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return md_vector(num_elem, addr, len, mac, MBEDTLS_MD_SHA512); ++} ++ ++int sha384_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return md_vector(num_elem, addr, len, mac, MBEDTLS_MD_SHA384); ++} ++#endif ++ ++#ifdef MBEDTLS_SHA256_C ++int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return md_vector(num_elem, addr, len, mac, MBEDTLS_MD_SHA256); ++} ++#endif ++ ++#ifdef MBEDTLS_SHA1_C ++int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return md_vector(num_elem, addr, len, mac, MBEDTLS_MD_SHA1); ++} ++#endif ++ ++#ifdef MBEDTLS_MD5_C ++int md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return md_vector(num_elem, addr, len, mac, MBEDTLS_MD_MD5); ++} ++#endif ++ ++#ifdef MBEDTLS_MD4_C ++#include ++int md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return md_vector(num_elem, addr, len, mac, MBEDTLS_MD_MD4); ++} ++#endif ++ ++#else /* expanded per-message-digest functions */ ++ ++#ifdef MBEDTLS_SHA512_C ++#include ++__attribute_noinline__ ++static int sha384_512_vector(size_t num_elem, const u8 *addr[], ++ const size_t *len, u8 *mac, int is384) ++{ ++ struct mbedtls_sha512_context ctx; ++ mbedtls_sha512_init(&ctx); ++ #if MBEDTLS_VERSION_MAJOR >= 3 ++ mbedtls_sha512_starts(&ctx, is384); ++ for (size_t i = 0; i < num_elem; ++i) ++ mbedtls_sha512_update(&ctx, addr[i], len[i]); ++ mbedtls_sha512_finish(&ctx, mac); ++ #else ++ mbedtls_sha512_starts_ret(&ctx, is384); ++ for (size_t i = 0; i < num_elem; ++i) ++ mbedtls_sha512_update_ret(&ctx, addr[i], len[i]); ++ mbedtls_sha512_finish_ret(&ctx, mac); ++ #endif ++ mbedtls_sha512_free(&ctx); ++ return 0; ++} ++ ++int sha512_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return sha384_512_vector(num_elem, addr, len, mac, 0); ++} ++ ++int sha384_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return sha384_512_vector(num_elem, addr, len, mac, 1); ++} ++#endif ++ ++#ifdef MBEDTLS_SHA256_C ++#include ++int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ struct mbedtls_sha256_context ctx; ++ mbedtls_sha256_init(&ctx); ++ #if MBEDTLS_VERSION_MAJOR >= 3 ++ mbedtls_sha256_starts(&ctx, 0); ++ for (size_t i = 0; i < num_elem; ++i) ++ mbedtls_sha256_update(&ctx, addr[i], len[i]); ++ mbedtls_sha256_finish(&ctx, mac); ++ #else ++ mbedtls_sha256_starts_ret(&ctx, 0); ++ for (size_t i = 0; i < num_elem; ++i) ++ mbedtls_sha256_update_ret(&ctx, addr[i], len[i]); ++ mbedtls_sha256_finish_ret(&ctx, mac); ++ #endif ++ mbedtls_sha256_free(&ctx); ++ return 0; ++} ++#endif ++ ++#ifdef MBEDTLS_SHA1_C ++#include ++int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ struct mbedtls_sha1_context ctx; ++ mbedtls_sha1_init(&ctx); ++ #if MBEDTLS_VERSION_MAJOR >= 3 ++ mbedtls_sha1_starts(&ctx); ++ for (size_t i = 0; i < num_elem; ++i) ++ mbedtls_sha1_update(&ctx, addr[i], len[i]); ++ mbedtls_sha1_finish(&ctx, mac); ++ #else ++ mbedtls_sha1_starts_ret(&ctx); ++ for (size_t i = 0; i < num_elem; ++i) ++ mbedtls_sha1_update_ret(&ctx, addr[i], len[i]); ++ mbedtls_sha1_finish_ret(&ctx, mac); ++ #endif ++ mbedtls_sha1_free(&ctx); ++ return 0; ++} ++#endif ++ ++#ifdef MBEDTLS_MD5_C ++#include ++int md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ struct mbedtls_md5_context ctx; ++ mbedtls_md5_init(&ctx); ++ #if MBEDTLS_VERSION_MAJOR >= 3 ++ mbedtls_md5_starts(&ctx); ++ for (size_t i = 0; i < num_elem; ++i) ++ mbedtls_md5_update(&ctx, addr[i], len[i]); ++ mbedtls_md5_finish(&ctx, mac); ++ #else ++ mbedtls_md5_starts_ret(&ctx); ++ for (size_t i = 0; i < num_elem; ++i) ++ mbedtls_md5_update_ret(&ctx, addr[i], len[i]); ++ mbedtls_md5_finish_ret(&ctx, mac); ++ #endif ++ mbedtls_md5_free(&ctx); ++ return 0; ++} ++#endif ++ ++#ifdef MBEDTLS_MD4_C ++#include ++int md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ struct mbedtls_md4_context ctx; ++ mbedtls_md4_init(&ctx); ++ mbedtls_md4_starts_ret(&ctx); ++ for (size_t i = 0; i < num_elem; ++i) ++ mbedtls_md4_update_ret(&ctx, addr[i], len[i]); ++ mbedtls_md4_finish_ret(&ctx, mac); ++ mbedtls_md4_free(&ctx); ++ return 0; ++} ++#endif ++ ++#endif /* expanded per-message-digest functions */ ++ ++ ++__attribute_noinline__ ++static int hmac_vector(const u8 *key, size_t key_len, size_t num_elem, ++ const u8 *addr[], const size_t *len, u8 *mac, ++ mbedtls_md_type_t md_type) ++{ ++ mbedtls_md_context_t ctx; ++ mbedtls_md_init(&ctx); ++ if (mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 1) != 0){ ++ mbedtls_md_free(&ctx); ++ return -1; ++ } ++ mbedtls_md_hmac_starts(&ctx, key, key_len); ++ for (size_t i = 0; i < num_elem; ++i) ++ mbedtls_md_hmac_update(&ctx, addr[i], len[i]); ++ mbedtls_md_hmac_finish(&ctx, mac); ++ mbedtls_md_free(&ctx); ++ return 0; ++} ++ ++#ifdef MBEDTLS_SHA512_C ++int hmac_sha512_vector(const u8 *key, size_t key_len, size_t num_elem, ++ const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return hmac_vector(key, key_len, num_elem, addr, len, mac, ++ MBEDTLS_MD_SHA512); ++} ++ ++int hmac_sha512(const u8 *key, size_t key_len, const u8 *data, size_t data_len, ++ u8 *mac) ++{ ++ return hmac_vector(key, key_len, 1, &data, &data_len, mac, ++ MBEDTLS_MD_SHA512); ++} ++ ++int hmac_sha384_vector(const u8 *key, size_t key_len, size_t num_elem, ++ const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return hmac_vector(key, key_len, num_elem, addr, len, mac, ++ MBEDTLS_MD_SHA384); ++} ++ ++int hmac_sha384(const u8 *key, size_t key_len, const u8 *data, size_t data_len, ++ u8 *mac) ++{ ++ return hmac_vector(key, key_len, 1, &data, &data_len, mac, ++ MBEDTLS_MD_SHA384); ++} ++#endif ++ ++#ifdef MBEDTLS_SHA256_C ++int hmac_sha256_vector(const u8 *key, size_t key_len, size_t num_elem, ++ const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return hmac_vector(key, key_len, num_elem, addr, len, mac, ++ MBEDTLS_MD_SHA256); ++} ++ ++int hmac_sha256(const u8 *key, size_t key_len, const u8 *data, size_t data_len, ++ u8 *mac) ++{ ++ return hmac_vector(key, key_len, 1, &data, &data_len, mac, ++ MBEDTLS_MD_SHA256); ++} ++#endif ++ ++#ifdef MBEDTLS_SHA1_C ++int hmac_sha1_vector(const u8 *key, size_t key_len, size_t num_elem, ++ const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return hmac_vector(key, key_len, num_elem, addr, len, mac, ++ MBEDTLS_MD_SHA1); ++} ++ ++int hmac_sha1(const u8 *key, size_t key_len, const u8 *data, size_t data_len, ++ u8 *mac) ++{ ++ return hmac_vector(key, key_len, 1, &data, &data_len, mac, ++ MBEDTLS_MD_SHA1); ++} ++#endif ++ ++#ifdef MBEDTLS_MD5_C ++int hmac_md5_vector(const u8 *key, size_t key_len, size_t num_elem, ++ const u8 *addr[], const size_t *len, u8 *mac) ++{ ++ return hmac_vector(key, key_len, num_elem, addr, len, mac, ++ MBEDTLS_MD_MD5); ++} ++ ++int hmac_md5(const u8 *key, size_t key_len, const u8 *data, size_t data_len, ++ u8 *mac) ++{ ++ return hmac_vector(key, key_len, 1, &data, &data_len, mac, ++ MBEDTLS_MD_MD5); ++} ++#endif ++ ++ ++#if defined(MBEDTLS_SHA256_C) || defined(MBEDTLS_SHA512_C) ++ ++#if defined(CRYPTO_MBEDTLS_HMAC_KDF_SHA256) \ ++ || defined(CRYPTO_MBEDTLS_HMAC_KDF_SHA384) \ ++ || defined(CRYPTO_MBEDTLS_HMAC_KDF_SHA512) ++ ++#include ++ ++/* sha256-kdf.c sha384-kdf.c sha512-kdf.c */ ++ ++/* HMAC-SHA256 KDF (RFC 5295) and HKDF-Expand(SHA256) (RFC 5869) */ ++/* HMAC-SHA384 KDF (RFC 5295) and HKDF-Expand(SHA384) (RFC 5869) */ ++/* HMAC-SHA512 KDF (RFC 5295) and HKDF-Expand(SHA512) (RFC 5869) */ ++__attribute_noinline__ ++static int hmac_kdf_expand(const u8 *prk, size_t prk_len, ++ const char *label, const u8 *info, size_t info_len, ++ u8 *okm, size_t okm_len, mbedtls_md_type_t md_type) ++{ ++ const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type); ++ #ifdef MBEDTLS_HKDF_C ++ if (label == NULL) /* RFC 5869 HKDF-Expand when (label == NULL) */ ++ return mbedtls_hkdf_expand(md_info, prk, prk_len, info, ++ info_len, okm, okm_len) ? -1 : 0; ++ #endif ++ ++ const size_t mac_len = mbedtls_md_get_size(md_info); ++ /* okm_len must not exceed 255 times hash len (RFC 5869 Section 2.3) */ ++ if (okm_len > ((mac_len << 8) - mac_len)) ++ return -1; ++ ++ mbedtls_md_context_t ctx; ++ mbedtls_md_init(&ctx); ++ if (mbedtls_md_setup(&ctx, md_info, 1) != 0) { ++ mbedtls_md_free(&ctx); ++ return -1; ++ } ++ mbedtls_md_hmac_starts(&ctx, prk, prk_len); ++ ++ u8 iter = 1; ++ const u8 *addr[4] = { okm, (const u8 *)label, info, &iter }; ++ size_t len[4] = { 0, label ? os_strlen(label)+1 : 0, info_len, 1 }; ++ ++ for (; okm_len >= mac_len; okm_len -= mac_len, ++iter) { ++ for (size_t i = 0; i < ARRAY_SIZE(addr); ++i) ++ mbedtls_md_hmac_update(&ctx, addr[i], len[i]); ++ mbedtls_md_hmac_finish(&ctx, okm); ++ mbedtls_md_hmac_reset(&ctx); ++ addr[0] = okm; ++ okm += mac_len; ++ len[0] = mac_len; /*(include digest in subsequent rounds)*/ ++ } ++ ++ if (okm_len) { ++ u8 hash[MBEDTLS_MD_MAX_SIZE]; ++ for (size_t i = 0; i < ARRAY_SIZE(addr); ++i) ++ mbedtls_md_hmac_update(&ctx, addr[i], len[i]); ++ mbedtls_md_hmac_finish(&ctx, hash); ++ os_memcpy(okm, hash, okm_len); ++ forced_memzero(hash, mac_len); ++ } ++ ++ mbedtls_md_free(&ctx); ++ return 0; ++} ++ ++#ifdef MBEDTLS_SHA512_C ++#ifdef CRYPTO_MBEDTLS_HMAC_KDF_SHA512 ++int hmac_sha512_kdf(const u8 *secret, size_t secret_len, ++ const char *label, const u8 *seed, size_t seed_len, ++ u8 *out, size_t outlen) ++{ ++ return hmac_kdf_expand(secret, secret_len, label, seed, seed_len, ++ out, outlen, MBEDTLS_MD_SHA512); ++} ++#endif ++ ++#ifdef CRYPTO_MBEDTLS_HMAC_KDF_SHA384 ++int hmac_sha384_kdf(const u8 *secret, size_t secret_len, ++ const char *label, const u8 *seed, size_t seed_len, ++ u8 *out, size_t outlen) ++{ ++ return hmac_kdf_expand(secret, secret_len, label, seed, seed_len, ++ out, outlen, MBEDTLS_MD_SHA384); ++} ++#endif ++#endif ++ ++#ifdef MBEDTLS_SHA256_C ++#ifdef CRYPTO_MBEDTLS_HMAC_KDF_SHA256 ++int hmac_sha256_kdf(const u8 *secret, size_t secret_len, ++ const char *label, const u8 *seed, size_t seed_len, ++ u8 *out, size_t outlen) ++{ ++ return hmac_kdf_expand(secret, secret_len, label, seed, seed_len, ++ out, outlen, MBEDTLS_MD_SHA256); ++} ++#endif ++#endif ++ ++#endif /* CRYPTO_MBEDTLS_HMAC_KDF_* */ ++ ++ ++/* sha256-prf.c sha384-prf.c sha512-prf.c */ ++ ++/* hmac_prf_bits - IEEE Std 802.11ac-2013, 11.6.1.7.2 Key derivation function */ ++__attribute_noinline__ ++static int hmac_prf_bits(const u8 *key, size_t key_len, const char *label, ++ const u8 *data, size_t data_len, u8 *buf, ++ size_t buf_len_bits, mbedtls_md_type_t md_type) ++{ ++ mbedtls_md_context_t ctx; ++ mbedtls_md_init(&ctx); ++ const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type); ++ if (mbedtls_md_setup(&ctx, md_info, 1) != 0) { ++ mbedtls_md_free(&ctx); ++ return -1; ++ } ++ mbedtls_md_hmac_starts(&ctx, key, key_len); ++ ++ u16 ctr, n_le = host_to_le16(buf_len_bits); ++ const u8 * const addr[] = { (u8 *)&ctr,(u8 *)label,data,(u8 *)&n_le }; ++ const size_t len[] = { 2, os_strlen(label), data_len, 2 }; ++ const size_t mac_len = mbedtls_md_get_size(md_info); ++ size_t buf_len = (buf_len_bits + 7) / 8; ++ for (ctr = 1; buf_len >= mac_len; buf_len -= mac_len, ++ctr) { ++ #if __BYTE_ORDER == __BIG_ENDIAN ++ ctr = host_to_le16(ctr); ++ #endif ++ for (size_t i = 0; i < ARRAY_SIZE(addr); ++i) ++ mbedtls_md_hmac_update(&ctx, addr[i], len[i]); ++ mbedtls_md_hmac_finish(&ctx, buf); ++ mbedtls_md_hmac_reset(&ctx); ++ buf += mac_len; ++ #if __BYTE_ORDER == __BIG_ENDIAN ++ ctr = le_to_host16(ctr); ++ #endif ++ } ++ ++ if (buf_len) { ++ u8 hash[MBEDTLS_MD_MAX_SIZE]; ++ #if __BYTE_ORDER == __BIG_ENDIAN ++ ctr = host_to_le16(ctr); ++ #endif ++ for (size_t i = 0; i < ARRAY_SIZE(addr); ++i) ++ mbedtls_md_hmac_update(&ctx, addr[i], len[i]); ++ mbedtls_md_hmac_finish(&ctx, hash); ++ os_memcpy(buf, hash, buf_len); ++ buf += buf_len; ++ forced_memzero(hash, mac_len); ++ } ++ ++ /* Mask out unused bits in last octet if it does not use all the bits */ ++ if ((buf_len_bits &= 0x7)) ++ buf[-1] &= (u8)(0xff << (8 - buf_len_bits)); ++ ++ mbedtls_md_free(&ctx); ++ return 0; ++} ++ ++#ifdef MBEDTLS_SHA512_C ++int sha512_prf(const u8 *key, size_t key_len, const char *label, ++ const u8 *data, size_t data_len, u8 *buf, size_t buf_len) ++{ ++ return hmac_prf_bits(key, key_len, label, data, data_len, buf, ++ buf_len * 8, MBEDTLS_MD_SHA512); ++} ++ ++int sha384_prf(const u8 *key, size_t key_len, const char *label, ++ const u8 *data, size_t data_len, u8 *buf, size_t buf_len) ++{ ++ return hmac_prf_bits(key, key_len, label, data, data_len, buf, ++ buf_len * 8, MBEDTLS_MD_SHA384); ++} ++#endif ++ ++#ifdef MBEDTLS_SHA256_C ++int sha256_prf(const u8 *key, size_t key_len, const char *label, ++ const u8 *data, size_t data_len, u8 *buf, size_t buf_len) ++{ ++ return hmac_prf_bits(key, key_len, label, data, data_len, buf, ++ buf_len * 8, MBEDTLS_MD_SHA256); ++} ++ ++int sha256_prf_bits(const u8 *key, size_t key_len, const char *label, ++ const u8 *data, size_t data_len, u8 *buf, ++ size_t buf_len_bits) ++{ ++ return hmac_prf_bits(key, key_len, label, data, data_len, buf, ++ buf_len_bits, MBEDTLS_MD_SHA256); ++} ++#endif ++ ++#endif /* MBEDTLS_SHA256_C || MBEDTLS_SHA512_C */ ++ ++ ++#ifdef MBEDTLS_SHA1_C ++ ++/* sha1-prf.c */ ++ ++/* sha1_prf - SHA1-based Pseudo-Random Function (PRF) (IEEE 802.11i, 8.5.1.1) */ ++ ++int sha1_prf(const u8 *key, size_t key_len, const char *label, ++ const u8 *data, size_t data_len, u8 *buf, size_t buf_len) ++{ ++ /*(note: algorithm differs from hmac_prf_bits() */ ++ /*(note: smaller code size instead of expanding hmac_sha1_vector() ++ * as is done in hmac_prf_bits(); not expecting large num of loops) */ ++ u8 counter = 0; ++ const u8 *addr[] = { (u8 *)label, data, &counter }; ++ const size_t len[] = { os_strlen(label)+1, data_len, 1 }; ++ ++ for (; buf_len >= SHA1_MAC_LEN; buf_len -= SHA1_MAC_LEN, ++counter) { ++ if (hmac_sha1_vector(key, key_len, 3, addr, len, buf)) ++ return -1; ++ buf += SHA1_MAC_LEN; ++ } ++ ++ if (buf_len) { ++ u8 hash[SHA1_MAC_LEN]; ++ if (hmac_sha1_vector(key, key_len, 3, addr, len, hash)) ++ return -1; ++ os_memcpy(buf, hash, buf_len); ++ forced_memzero(hash, sizeof(hash)); ++ } ++ ++ return 0; ++} ++ ++#ifdef CRYPTO_MBEDTLS_SHA1_T_PRF ++ ++/* sha1-tprf.c */ ++ ++/* sha1_t_prf - EAP-FAST Pseudo-Random Function (T-PRF) (RFC 4851,Section 5.5)*/ ++ ++int sha1_t_prf(const u8 *key, size_t key_len, const char *label, ++ const u8 *seed, size_t seed_len, u8 *buf, size_t buf_len) ++{ ++ /*(note: algorithm differs from hmac_prf_bits() and hmac_kdf() above)*/ ++ /*(note: smaller code size instead of expanding hmac_sha1_vector() ++ * as is done in hmac_prf_bits(); not expecting large num of loops) */ ++ u8 ctr; ++ u16 olen = host_to_be16(buf_len); ++ const u8 *addr[] = { buf, (u8 *)label, seed, (u8 *)&olen, &ctr }; ++ size_t len[] = { 0, os_strlen(label)+1, seed_len, 2, 1 }; ++ ++ for (ctr = 1; buf_len >= SHA1_MAC_LEN; buf_len -= SHA1_MAC_LEN, ++ctr) { ++ if (hmac_sha1_vector(key, key_len, 5, addr, len, buf)) ++ return -1; ++ addr[0] = buf; ++ buf += SHA1_MAC_LEN; ++ len[0] = SHA1_MAC_LEN; /*(include digest in subsequent rounds)*/ ++ } ++ ++ if (buf_len) { ++ u8 hash[SHA1_MAC_LEN]; ++ if (hmac_sha1_vector(key, key_len, 5, addr, len, hash)) ++ return -1; ++ os_memcpy(buf, hash, buf_len); ++ forced_memzero(hash, sizeof(hash)); ++ } ++ ++ return 0; ++} ++ ++#endif /* CRYPTO_MBEDTLS_SHA1_T_PRF */ ++ ++#endif /* MBEDTLS_SHA1_C */ ++ ++ ++#ifdef CRYPTO_MBEDTLS_DES_ENCRYPT ++#ifdef MBEDTLS_DES_C ++#include ++int des_encrypt(const u8 *clear, const u8 *key, u8 *cypher) ++{ ++ u8 pkey[8], next, tmp; ++ int i; ++ ++ /* Add parity bits to the key */ ++ next = 0; ++ for (i = 0; i < 7; i++) { ++ tmp = key[i]; ++ pkey[i] = (tmp >> i) | next | 1; ++ next = tmp << (7 - i); ++ } ++ pkey[i] = next | 1; ++ ++ mbedtls_des_context des; ++ mbedtls_des_init(&des); ++ int ret = mbedtls_des_setkey_enc(&des, pkey) ++ || mbedtls_des_crypt_ecb(&des, clear, cypher) ? -1 : 0; ++ mbedtls_des_free(&des); ++ return ret; ++} ++#else ++#include "des-internal.c"/* pull in hostap local implementation */ ++#endif ++#endif ++ ++ ++#ifdef CRYPTO_MBEDTLS_PBKDF2_SHA1 ++/* sha1-pbkdf2.c */ ++#include ++int pbkdf2_sha1(const char *passphrase, const u8 *ssid, size_t ssid_len, ++ int iterations, u8 *buf, size_t buflen) ++{ ++ #if MBEDTLS_VERSION_NUMBER >= 0x03020200 /* mbedtls 3.2.2 */ ++ return mbedtls_pkcs5_pbkdf2_hmac_ext(MBEDTLS_MD_SHA1, ++ (const u8 *)passphrase, os_strlen(passphrase), ++ ssid, ssid_len, iterations, 32, buf) ? -1 : 0; ++ #else ++ const mbedtls_md_info_t *md_info; ++ md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1); ++ if (md_info == NULL) ++ return -1; ++ mbedtls_md_context_t ctx; ++ mbedtls_md_init(&ctx); ++ int ret = mbedtls_md_setup(&ctx, md_info, 1) ++ || mbedtls_pkcs5_pbkdf2_hmac(&ctx, ++ (const u8 *)passphrase, os_strlen(passphrase), ++ ssid, ssid_len, iterations, 32, buf) ? -1 : 0; ++ mbedtls_md_free(&ctx); ++ return ret; ++ #endif ++} ++#endif ++ ++ ++/*#include "aes.h"*/ /* prototypes also included in "crypto.h" */ ++ ++static void *aes_crypt_init_mode(const u8 *key, size_t len, int mode) ++{ ++ mbedtls_aes_context *aes = os_malloc(sizeof(*aes)); ++ if (!aes) ++ return NULL; ++ ++ mbedtls_aes_init(aes); ++ if ((mode == MBEDTLS_AES_ENCRYPT ++ ? mbedtls_aes_setkey_enc(aes, key, len * 8) ++ : mbedtls_aes_setkey_dec(aes, key, len * 8)) == 0) ++ return aes; ++ ++ mbedtls_aes_free(aes); ++ os_free(aes); ++ return NULL; ++} ++ ++void *aes_encrypt_init(const u8 *key, size_t len) ++{ ++ return aes_crypt_init_mode(key, len, MBEDTLS_AES_ENCRYPT); ++} ++ ++int aes_encrypt(void *ctx, const u8 *plain, u8 *crypt) ++{ ++ return mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, plain, crypt); ++} ++ ++void aes_encrypt_deinit(void *ctx) ++{ ++ mbedtls_aes_free(ctx); ++ os_free(ctx); ++} ++ ++void *aes_decrypt_init(const u8 *key, size_t len) ++{ ++ return aes_crypt_init_mode(key, len, MBEDTLS_AES_DECRYPT); ++} ++ ++int aes_decrypt(void *ctx, const u8 *crypt, u8 *plain) ++{ ++ return mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_DECRYPT, crypt, plain); ++} ++ ++void aes_decrypt_deinit(void *ctx) ++{ ++ mbedtls_aes_free(ctx); ++ os_free(ctx); ++} ++ ++ ++#include "aes_wrap.h" ++ ++ ++#ifdef MBEDTLS_NIST_KW_C ++ ++#include ++ ++/* aes-wrap.c */ ++int aes_wrap(const u8 *kek, size_t kek_len, int n, const u8 *plain, u8 *cipher) ++{ ++ mbedtls_nist_kw_context ctx; ++ mbedtls_nist_kw_init(&ctx); ++ size_t olen; ++ int ret = mbedtls_nist_kw_setkey(&ctx, MBEDTLS_CIPHER_ID_AES, ++ kek, kek_len*8, 1) ++ || mbedtls_nist_kw_wrap(&ctx, MBEDTLS_KW_MODE_KW, plain, n*8, ++ cipher, &olen, (n+1)*8) ? -1 : 0; ++ mbedtls_nist_kw_free(&ctx); ++ return ret; ++} ++ ++/* aes-unwrap.c */ ++int aes_unwrap(const u8 *kek, size_t kek_len, int n, const u8 *cipher, u8 *plain) ++{ ++ mbedtls_nist_kw_context ctx; ++ mbedtls_nist_kw_init(&ctx); ++ size_t olen; ++ int ret = mbedtls_nist_kw_setkey(&ctx, MBEDTLS_CIPHER_ID_AES, ++ kek, kek_len*8, 0) ++ || mbedtls_nist_kw_unwrap(&ctx, MBEDTLS_KW_MODE_KW, cipher, ++ (n+1)*8, plain, &olen, n*8) ? -1 : 0; ++ mbedtls_nist_kw_free(&ctx); ++ return ret; ++} ++ ++#else ++ ++#ifndef CRYPTO_MBEDTLS_CONFIG_FIPS ++#include "aes-wrap.c" /* pull in hostap local implementation */ ++#include "aes-unwrap.c" /* pull in hostap local implementation */ ++#endif ++ ++#endif /* MBEDTLS_NIST_KW_C */ ++ ++ ++#ifdef MBEDTLS_CMAC_C ++ ++/* aes-omac1.c */ ++ ++#include ++ ++int omac1_aes_vector( ++ const u8 *key, size_t key_len, size_t num_elem, const u8 *addr[], ++ const size_t *len, u8 *mac) ++{ ++ mbedtls_cipher_type_t cipher_type; ++ switch (key_len) { ++ case 16: cipher_type = MBEDTLS_CIPHER_AES_128_ECB; break; ++ case 24: cipher_type = MBEDTLS_CIPHER_AES_192_ECB; break; ++ case 32: cipher_type = MBEDTLS_CIPHER_AES_256_ECB; break; ++ default: return -1; ++ } ++ const mbedtls_cipher_info_t *cipher_info; ++ cipher_info = mbedtls_cipher_info_from_type(cipher_type); ++ if (cipher_info == NULL) ++ return -1; ++ ++ mbedtls_cipher_context_t ctx; ++ mbedtls_cipher_init(&ctx); ++ int ret = -1; ++ if (mbedtls_cipher_setup(&ctx, cipher_info) == 0 ++ && mbedtls_cipher_cmac_starts(&ctx, key, key_len*8) == 0) { ++ ret = 0; ++ for (size_t i = 0; i < num_elem && ret == 0; ++i) ++ ret = mbedtls_cipher_cmac_update(&ctx, addr[i], len[i]); ++ } ++ if (ret == 0) ++ ret = mbedtls_cipher_cmac_finish(&ctx, mac); ++ mbedtls_cipher_free(&ctx); ++ return ret ? -1 : 0; ++} ++ ++int omac1_aes_128_vector(const u8 *key, size_t num_elem, ++ const u8 *addr[], const size_t *len, ++ u8 *mac) ++{ ++ return omac1_aes_vector(key, 16, num_elem, addr, len, mac); ++} ++ ++int omac1_aes_128(const u8 *key, const u8 *data, size_t data_len, u8 *mac) ++{ ++ return omac1_aes_vector(key, 16, 1, &data, &data_len, mac); ++} ++ ++int omac1_aes_256(const u8 *key, const u8 *data, size_t data_len, u8 *mac) ++{ ++ return omac1_aes_vector(key, 32, 1, &data, &data_len, mac); ++} ++ ++#else ++ ++#include "aes-omac1.c" /* pull in hostap local implementation */ ++ ++#ifndef MBEDTLS_AES_BLOCK_SIZE ++#define MBEDTLS_AES_BLOCK_SIZE 16 ++#endif ++ ++#endif /* MBEDTLS_CMAC_C */ ++ ++ ++/* These interfaces can be inefficient when used in loops, as the overhead of ++ * initialization each call is large for each block input (e.g. 16 bytes) */ ++ ++ ++/* aes-encblock.c */ ++int aes_128_encrypt_block(const u8 *key, const u8 *in, u8 *out) ++{ ++ mbedtls_aes_context aes; ++ mbedtls_aes_init(&aes); ++ int ret = mbedtls_aes_setkey_enc(&aes, key, 128) ++ || mbedtls_aes_crypt_ecb(&aes, MBEDTLS_AES_ENCRYPT, in, out) ++ ? -1 ++ : 0; ++ mbedtls_aes_free(&aes); ++ return ret; ++} ++ ++ ++/* aes-ctr.c */ ++int aes_ctr_encrypt(const u8 *key, size_t key_len, const u8 *nonce, ++ u8 *data, size_t data_len) ++{ ++ unsigned char counter[MBEDTLS_AES_BLOCK_SIZE]; ++ unsigned char stream_block[MBEDTLS_AES_BLOCK_SIZE]; ++ os_memcpy(counter, nonce, MBEDTLS_AES_BLOCK_SIZE);/*(must be writable)*/ ++ ++ mbedtls_aes_context ctx; ++ mbedtls_aes_init(&ctx); ++ size_t nc_off = 0; ++ int ret = mbedtls_aes_setkey_enc(&ctx, key, key_len*8) ++ || mbedtls_aes_crypt_ctr(&ctx, data_len, &nc_off, ++ counter, stream_block, ++ data, data) ? -1 : 0; ++ forced_memzero(stream_block, sizeof(stream_block)); ++ mbedtls_aes_free(&ctx); ++ return ret; ++} ++ ++int aes_128_ctr_encrypt(const u8 *key, const u8 *nonce, ++ u8 *data, size_t data_len) ++{ ++ return aes_ctr_encrypt(key, 16, nonce, data, data_len); ++} ++ ++ ++/* aes-cbc.c */ ++static int aes_128_cbc_oper(const u8 *key, const u8 *iv, ++ u8 *data, size_t data_len, int mode) ++{ ++ unsigned char ivec[MBEDTLS_AES_BLOCK_SIZE]; ++ os_memcpy(ivec, iv, MBEDTLS_AES_BLOCK_SIZE); /*(must be writable)*/ ++ ++ mbedtls_aes_context ctx; ++ mbedtls_aes_init(&ctx); ++ int ret = (mode == MBEDTLS_AES_ENCRYPT ++ ? mbedtls_aes_setkey_enc(&ctx, key, 128) ++ : mbedtls_aes_setkey_dec(&ctx, key, 128)) ++ || mbedtls_aes_crypt_cbc(&ctx, mode, data_len, ivec, data, data); ++ mbedtls_aes_free(&ctx); ++ return ret ? -1 : 0; ++} ++ ++int aes_128_cbc_encrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len) ++{ ++ return aes_128_cbc_oper(key, iv, data, data_len, MBEDTLS_AES_ENCRYPT); ++} ++ ++int aes_128_cbc_decrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len) ++{ ++ return aes_128_cbc_oper(key, iv, data, data_len, MBEDTLS_AES_DECRYPT); ++} ++ ++ ++/* ++ * Much of the following is documented in crypto.h as for CONFIG_TLS=internal ++ * but such comments are not accurate: ++ * ++ * "This function is only used with internal TLSv1 implementation ++ * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need ++ * to implement this." ++ */ ++ ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_CIPHER ++ ++#include ++ ++struct crypto_cipher ++{ ++ mbedtls_cipher_context_t ctx_enc; ++ mbedtls_cipher_context_t ctx_dec; ++}; ++ ++struct crypto_cipher * crypto_cipher_init(enum crypto_cipher_alg alg, ++ const u8 *iv, const u8 *key, ++ size_t key_len) ++{ ++ /* IKEv2 src/eap_common/ikev2_common.c:ikev2_{encr,decr}_encrypt() ++ * uses one of CRYPTO_CIPHER_ALG_AES or CRYPTO_CIPHER_ALG_3DES */ ++ ++ mbedtls_cipher_type_t cipher_type; ++ size_t iv_len; ++ switch (alg) { ++ #ifdef MBEDTLS_ARC4_C ++ #if 0 ++ case CRYPTO_CIPHER_ALG_RC4: ++ cipher_type = MBEDTLS_CIPHER_ARC4_128; ++ iv_len = 0; ++ break; ++ #endif ++ #endif ++ #ifdef MBEDTLS_AES_C ++ case CRYPTO_CIPHER_ALG_AES: ++ if (key_len == 16) cipher_type = MBEDTLS_CIPHER_AES_128_CTR; ++ if (key_len == 24) cipher_type = MBEDTLS_CIPHER_AES_192_CTR; ++ if (key_len == 32) cipher_type = MBEDTLS_CIPHER_AES_256_CTR; ++ iv_len = 16; ++ break; ++ #endif ++ #ifdef MBEDTLS_DES_C ++ case CRYPTO_CIPHER_ALG_3DES: ++ cipher_type = MBEDTLS_CIPHER_DES_EDE3_CBC; ++ iv_len = 8; ++ break; ++ #if 0 ++ case CRYPTO_CIPHER_ALG_DES: ++ cipher_type = MBEDTLS_CIPHER_DES_CBC; ++ iv_len = 8; ++ break; ++ #endif ++ #endif ++ default: ++ return NULL; ++ } ++ ++ const mbedtls_cipher_info_t *cipher_info; ++ cipher_info = mbedtls_cipher_info_from_type(cipher_type); ++ if (cipher_info == NULL) ++ return NULL; ++ ++ key_len *= 8; /* key_bitlen */ ++ #if 0 /*(were key_bitlen not already available)*/ ++ #if MBEDTLS_VERSION_NUMBER >= 0x03010000 /* mbedtls 3.1.0 */ ++ key_len = mbedtls_cipher_info_get_key_bitlen(cipher_info); ++ #else ++ key_len = cipher_info->MBEDTLS_PRIVATE(key_bitlen); ++ #endif ++ #endif ++ ++ #if 0 /*(were iv_len not known above, would need MBEDTLS_PRIVATE(iv_size))*/ ++ iv_len = cipher_info->MBEDTLS_PRIVATE(iv_size); ++ #endif ++ ++ struct crypto_cipher *ctx = os_malloc(sizeof(*ctx)); ++ if (!ctx) ++ return NULL; ++ ++ mbedtls_cipher_init(&ctx->ctx_enc); ++ mbedtls_cipher_init(&ctx->ctx_dec); ++ if ( mbedtls_cipher_setup(&ctx->ctx_enc,cipher_info) == 0 ++ && mbedtls_cipher_setup(&ctx->ctx_dec,cipher_info) == 0 ++ && mbedtls_cipher_setkey(&ctx->ctx_enc,key,key_len,MBEDTLS_ENCRYPT) == 0 ++ && mbedtls_cipher_setkey(&ctx->ctx_dec,key,key_len,MBEDTLS_DECRYPT) == 0 ++ && mbedtls_cipher_set_iv(&ctx->ctx_enc,iv,iv_len) == 0 ++ && mbedtls_cipher_set_iv(&ctx->ctx_dec,iv,iv_len) == 0 ++ && mbedtls_cipher_reset(&ctx->ctx_enc) == 0 ++ && mbedtls_cipher_reset(&ctx->ctx_dec) == 0) { ++ return ctx; ++ } ++ ++ mbedtls_cipher_free(&ctx->ctx_enc); ++ mbedtls_cipher_free(&ctx->ctx_dec); ++ os_free(ctx); ++ return NULL; ++} ++ ++int crypto_cipher_encrypt(struct crypto_cipher *ctx, ++ const u8 *plain, u8 *crypt, size_t len) ++{ ++ size_t olen = 0; /*(poor interface above; unknown size of u8 *crypt)*/ ++ return (mbedtls_cipher_update(&ctx->ctx_enc, plain, len, crypt, &olen) ++ || mbedtls_cipher_finish(&ctx->ctx_enc, crypt + olen, &olen)) ? -1 : 0; ++} ++ ++int crypto_cipher_decrypt(struct crypto_cipher *ctx, ++ const u8 *crypt, u8 *plain, size_t len) ++{ ++ size_t olen = 0; /*(poor interface above; unknown size of u8 *plain)*/ ++ return (mbedtls_cipher_update(&ctx->ctx_dec, crypt, len, plain, &olen) ++ || mbedtls_cipher_finish(&ctx->ctx_dec, plain + olen, &olen)) ? -1 : 0; ++} ++ ++void crypto_cipher_deinit(struct crypto_cipher *ctx) ++{ ++ mbedtls_cipher_free(&ctx->ctx_enc); ++ mbedtls_cipher_free(&ctx->ctx_dec); ++ os_free(ctx); ++} ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_CIPHER */ ++ ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_HASH ++ ++struct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key, ++ size_t key_len) ++{ ++ mbedtls_md_type_t md_type; ++ int is_hmac = 0; ++ ++ switch (alg) { ++ #ifdef MBEDTLS_MD5_C ++ case CRYPTO_HASH_ALG_MD5: ++ md_type = MBEDTLS_MD_MD5; ++ break; ++ #endif ++ #ifdef MBEDTLS_SHA1_C ++ case CRYPTO_HASH_ALG_SHA1: ++ md_type = MBEDTLS_MD_SHA1; ++ break; ++ #endif ++ #ifdef MBEDTLS_MD5_C ++ case CRYPTO_HASH_ALG_HMAC_MD5: ++ md_type = MBEDTLS_MD_MD5; ++ is_hmac = 1; ++ break; ++ #endif ++ #ifdef MBEDTLS_SHA1_C ++ case CRYPTO_HASH_ALG_HMAC_SHA1: ++ md_type = MBEDTLS_MD_SHA1; ++ is_hmac = 1; ++ break; ++ #endif ++ #ifdef MBEDTLS_SHA256_C ++ case CRYPTO_HASH_ALG_SHA256: ++ md_type = MBEDTLS_MD_SHA256; ++ break; ++ case CRYPTO_HASH_ALG_HMAC_SHA256: ++ md_type = MBEDTLS_MD_SHA256; ++ is_hmac = 1; ++ break; ++ #endif ++ #ifdef MBEDTLS_SHA512_C ++ case CRYPTO_HASH_ALG_SHA384: ++ md_type = MBEDTLS_MD_SHA384; ++ break; ++ case CRYPTO_HASH_ALG_SHA512: ++ md_type = MBEDTLS_MD_SHA512; ++ break; ++ #endif ++ default: ++ return NULL; ++ } ++ ++ const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type); ++ if (!md_info) ++ return NULL; ++ ++ mbedtls_md_context_t *mctx = os_malloc(sizeof(*mctx)); ++ if (mctx == NULL) ++ return NULL; ++ ++ mbedtls_md_init(mctx); ++ if (mbedtls_md_setup(mctx, md_info, is_hmac) != 0) { ++ os_free(mctx); ++ return NULL; ++ } ++ ++ if (is_hmac) ++ mbedtls_md_hmac_starts(mctx, key, key_len); ++ else ++ mbedtls_md_starts(mctx); ++ return (struct crypto_hash *)((uintptr_t)mctx | is_hmac); ++} ++ ++void crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len) ++{ ++ mbedtls_md_context_t *mctx = (mbedtls_md_context_t*)((uintptr_t)ctx & ~1uL); ++ #if 0 ++ /*(mbedtls_md_hmac_update() and mbedtls_md_update() ++ * make same modifications under the hood in mbedtls)*/ ++ if ((uintptr_t)ctx & 1uL) ++ mbedtls_md_hmac_update(mctx, data, len); ++ else ++ #endif ++ mbedtls_md_update(mctx, data, len); ++} ++ ++int crypto_hash_finish(struct crypto_hash *ctx, u8 *mac, size_t *len) ++{ ++ mbedtls_md_context_t *mctx = (mbedtls_md_context_t*)((uintptr_t)ctx & ~1uL); ++ if (mac != NULL && len != NULL) { /*(NULL if caller just freeing context)*/ ++ #if MBEDTLS_VERSION_NUMBER >= 0x03020000 /* mbedtls 3.2.0 */ ++ const mbedtls_md_info_t *md_info = mbedtls_md_info_from_ctx(mctx); ++ #else ++ const mbedtls_md_info_t *md_info = mctx->MBEDTLS_PRIVATE(md_info); ++ #endif ++ size_t maclen = mbedtls_md_get_size(md_info); ++ if (*len < maclen) { ++ *len = maclen; ++ /*(note: ctx not freed; can call again with larger *len)*/ ++ return -1; ++ } ++ *len = maclen; ++ if ((uintptr_t)ctx & 1uL) ++ mbedtls_md_hmac_finish(mctx, mac); ++ else ++ mbedtls_md_finish(mctx, mac); ++ } ++ mbedtls_md_free(mctx); ++ os_free(mctx); ++ return 0; ++} ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_HASH */ ++ ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_BIGNUM ++ ++#include ++ ++/* crypto.h bignum interfaces */ ++ ++struct crypto_bignum *crypto_bignum_init(void) ++{ ++ mbedtls_mpi *bn = os_malloc(sizeof(*bn)); ++ if (bn) ++ mbedtls_mpi_init(bn); ++ return (struct crypto_bignum *)bn; ++} ++ ++struct crypto_bignum *crypto_bignum_init_set(const u8 *buf, size_t len) ++{ ++ mbedtls_mpi *bn = os_malloc(sizeof(*bn)); ++ if (bn) { ++ mbedtls_mpi_init(bn); ++ if (mbedtls_mpi_read_binary(bn, buf, len) == 0) ++ return (struct crypto_bignum *)bn; ++ } ++ ++ os_free(bn); ++ return NULL; ++} ++ ++struct crypto_bignum *crypto_bignum_init_uint(unsigned int val) ++{ ++ #if 0 /*(hostap use of this interface passes int, not uint)*/ ++ val = host_to_be32(val); ++ return crypto_bignum_init_set((const u8 *)&val, sizeof(val)); ++ #else ++ mbedtls_mpi *bn = os_malloc(sizeof(*bn)); ++ if (bn) { ++ mbedtls_mpi_init(bn); ++ if (mbedtls_mpi_lset(bn, (int)val) == 0) ++ return (struct crypto_bignum *)bn; ++ } ++ ++ os_free(bn); ++ return NULL; ++ #endif ++} ++ ++void crypto_bignum_deinit(struct crypto_bignum *n, int clear) ++{ ++ mbedtls_mpi_free((mbedtls_mpi *)n); ++ os_free(n); ++} ++ ++int crypto_bignum_to_bin(const struct crypto_bignum *a, ++ u8 *buf, size_t buflen, size_t padlen) ++{ ++ size_t n = mbedtls_mpi_size((mbedtls_mpi *)a); ++ if (n < padlen) ++ n = padlen; ++ return n > buflen || mbedtls_mpi_write_binary((mbedtls_mpi *)a, buf, n) ++ ? -1 ++ : (int)(n); ++} ++ ++int crypto_bignum_rand(struct crypto_bignum *r, const struct crypto_bignum *m) ++{ ++ /*assert(r != m);*//* r must not be same as m for mbedtls_mpi_random()*/ ++ #if MBEDTLS_VERSION_NUMBER >= 0x021B0000 /* mbedtls 2.27.0 */ ++ return mbedtls_mpi_random((mbedtls_mpi *)r, 0, (mbedtls_mpi *)m, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg()) ? -1 : 0; ++ #else ++ /* (needed by EAP_PWD, SAE, DPP) */ ++ wpa_printf(MSG_ERROR, ++ "mbedtls 2.27.0 or later required for mbedtls_mpi_random()"); ++ return -1; ++ #endif ++} ++ ++int crypto_bignum_add(const struct crypto_bignum *a, ++ const struct crypto_bignum *b, ++ struct crypto_bignum *c) ++{ ++ return mbedtls_mpi_add_mpi((mbedtls_mpi *)c, ++ (const mbedtls_mpi *)a, ++ (const mbedtls_mpi *)b) ? -1 : 0; ++} ++ ++int crypto_bignum_mod(const struct crypto_bignum *a, ++ const struct crypto_bignum *b, ++ struct crypto_bignum *c) ++{ ++ return mbedtls_mpi_mod_mpi((mbedtls_mpi *)c, ++ (const mbedtls_mpi *)a, ++ (const mbedtls_mpi *)b) ? -1 : 0; ++} ++ ++int crypto_bignum_exptmod(const struct crypto_bignum *a, ++ const struct crypto_bignum *b, ++ const struct crypto_bignum *c, ++ struct crypto_bignum *d) ++{ ++ /* (check if input params match d; d is the result) */ ++ /* (a == d) is ok in current mbedtls implementation */ ++ if (b == d || c == d) { /*(not ok; store result in intermediate)*/ ++ mbedtls_mpi R; ++ mbedtls_mpi_init(&R); ++ int rc = mbedtls_mpi_exp_mod(&R, ++ (const mbedtls_mpi *)a, ++ (const mbedtls_mpi *)b, ++ (const mbedtls_mpi *)c, ++ NULL) ++ || mbedtls_mpi_copy((mbedtls_mpi *)d, &R) ? -1 : 0; ++ mbedtls_mpi_free(&R); ++ return rc; ++ } ++ else { ++ return mbedtls_mpi_exp_mod((mbedtls_mpi *)d, ++ (const mbedtls_mpi *)a, ++ (const mbedtls_mpi *)b, ++ (const mbedtls_mpi *)c, ++ NULL) ? -1 : 0; ++ } ++} ++ ++int crypto_bignum_inverse(const struct crypto_bignum *a, ++ const struct crypto_bignum *b, ++ struct crypto_bignum *c) ++{ ++ return mbedtls_mpi_inv_mod((mbedtls_mpi *)c, ++ (const mbedtls_mpi *)a, ++ (const mbedtls_mpi *)b) ? -1 : 0; ++} ++ ++int crypto_bignum_sub(const struct crypto_bignum *a, ++ const struct crypto_bignum *b, ++ struct crypto_bignum *c) ++{ ++ return mbedtls_mpi_sub_mpi((mbedtls_mpi *)c, ++ (const mbedtls_mpi *)a, ++ (const mbedtls_mpi *)b) ? -1 : 0; ++} ++ ++int crypto_bignum_div(const struct crypto_bignum *a, ++ const struct crypto_bignum *b, ++ struct crypto_bignum *c) ++{ ++ /*(most current use of this crypto.h interface has a == c (result), ++ * so store result in an intermediate to avoid overwritten input)*/ ++ mbedtls_mpi R; ++ mbedtls_mpi_init(&R); ++ int rc = mbedtls_mpi_div_mpi(&R, NULL, ++ (const mbedtls_mpi *)a, ++ (const mbedtls_mpi *)b) ++ || mbedtls_mpi_copy((mbedtls_mpi *)c, &R) ? -1 : 0; ++ mbedtls_mpi_free(&R); ++ return rc; ++} ++ ++int crypto_bignum_addmod(const struct crypto_bignum *a, ++ const struct crypto_bignum *b, ++ const struct crypto_bignum *c, ++ struct crypto_bignum *d) ++{ ++ return mbedtls_mpi_add_mpi((mbedtls_mpi *)d, ++ (const mbedtls_mpi *)a, ++ (const mbedtls_mpi *)b) ++ || mbedtls_mpi_mod_mpi((mbedtls_mpi *)d, ++ (mbedtls_mpi *)d, ++ (const mbedtls_mpi *)c) ? -1 : 0; ++} ++ ++int crypto_bignum_mulmod(const struct crypto_bignum *a, ++ const struct crypto_bignum *b, ++ const struct crypto_bignum *c, ++ struct crypto_bignum *d) ++{ ++ return mbedtls_mpi_mul_mpi((mbedtls_mpi *)d, ++ (const mbedtls_mpi *)a, ++ (const mbedtls_mpi *)b) ++ || mbedtls_mpi_mod_mpi((mbedtls_mpi *)d, ++ (mbedtls_mpi *)d, ++ (const mbedtls_mpi *)c) ? -1 : 0; ++} ++ ++int crypto_bignum_sqrmod(const struct crypto_bignum *a, ++ const struct crypto_bignum *b, ++ struct crypto_bignum *c) ++{ ++ #if 1 ++ return crypto_bignum_mulmod(a, a, b, c); ++ #else ++ mbedtls_mpi bn; ++ mbedtls_mpi_init(&bn); ++ if (mbedtls_mpi_lset(&bn, 2)) /* alt?: mbedtls_mpi_set_bit(&bn, 1) */ ++ return -1; ++ int ret = mbedtls_mpi_exp_mod((mbedtls_mpi *)c, ++ (const mbedtls_mpi *)a, &bn, ++ (const mbedtls_mpi *)b, NULL) ? -1 : 0; ++ mbedtls_mpi_free(&bn); ++ return ret; ++ #endif ++} ++ ++int crypto_bignum_rshift(const struct crypto_bignum *a, int n, ++ struct crypto_bignum *r) ++{ ++ return mbedtls_mpi_copy((mbedtls_mpi *)r, (const mbedtls_mpi *)a) ++ || mbedtls_mpi_shift_r((mbedtls_mpi *)r, n) ? -1 : 0; ++} ++ ++int crypto_bignum_cmp(const struct crypto_bignum *a, ++ const struct crypto_bignum *b) ++{ ++ return mbedtls_mpi_cmp_mpi((const mbedtls_mpi *)a, (const mbedtls_mpi *)b); ++} ++ ++int crypto_bignum_is_zero(const struct crypto_bignum *a) ++{ ++ /* XXX: src/common/sae.c:sswu() contains comment: ++ * "TODO: Make sure crypto_bignum_is_zero() is constant time" ++ * Note: mbedtls_mpi_cmp_int() *is not* constant time */ ++ return (mbedtls_mpi_cmp_int((const mbedtls_mpi *)a, 0) == 0); ++} ++ ++int crypto_bignum_is_one(const struct crypto_bignum *a) ++{ ++ return (mbedtls_mpi_cmp_int((const mbedtls_mpi *)a, 1) == 0); ++} ++ ++int crypto_bignum_is_odd(const struct crypto_bignum *a) ++{ ++ return mbedtls_mpi_get_bit((const mbedtls_mpi *)a, 0); ++} ++ ++#include "utils/const_time.h" ++int crypto_bignum_legendre(const struct crypto_bignum *a, ++ const struct crypto_bignum *p) ++{ ++ /* Security Note: ++ * mbedtls_mpi_exp_mod() is not documented to run in constant time, ++ * though mbedtls/library/bignum.c uses constant_time_internal.h funcs. ++ * Compare to crypto_openssl.c:crypto_bignum_legendre() ++ * which uses openssl BN_mod_exp_mont_consttime() ++ * mbedtls/library/ecp.c has further countermeasures to timing attacks, ++ * (but ecp.c funcs are not used here) */ ++ ++ mbedtls_mpi exp, tmp; ++ mbedtls_mpi_init(&exp); ++ mbedtls_mpi_init(&tmp); ++ ++ /* exp = (p-1) / 2 */ ++ int res; ++ if (mbedtls_mpi_sub_int(&exp, (const mbedtls_mpi *)p, 1) == 0 ++ && mbedtls_mpi_shift_r(&exp, 1) == 0 ++ && mbedtls_mpi_exp_mod(&tmp, (const mbedtls_mpi *)a, &exp, ++ (const mbedtls_mpi *)p, NULL) == 0) { ++ /*(modified from crypto_openssl.c:crypto_bignum_legendre())*/ ++ /* Return 1 if tmp == 1, 0 if tmp == 0, or -1 otherwise. Need ++ * to use constant time selection to avoid branches here. */ ++ unsigned int mask; ++ res = -1; ++ mask = const_time_eq((mbedtls_mpi_cmp_int(&tmp, 1) == 0), 1); ++ res = const_time_select_int(mask, 1, res); ++ mask = const_time_eq((mbedtls_mpi_cmp_int(&tmp, 0) == 0), 1); ++ res = const_time_select_int(mask, 0, res); ++ } else { ++ res = -2; ++ } ++ ++ mbedtls_mpi_free(&tmp); ++ mbedtls_mpi_free(&exp); ++ return res; ++} ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_BIGNUM */ ++ ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_DH ++ ++/* crypto_internal-modexp.c */ ++ ++#include ++#include ++ ++#if 0 /* crypto_dh_init() and crypto_dh_derive_secret() prefer to use mbedtls */ ++int crypto_mod_exp(const u8 *base, size_t base_len, ++ const u8 *power, size_t power_len, ++ const u8 *modulus, size_t modulus_len, ++ u8 *result, size_t *result_len) ++{ ++ mbedtls_mpi bn_base, bn_exp, bn_modulus, bn_result; ++ mbedtls_mpi_init(&bn_base); ++ mbedtls_mpi_init(&bn_exp); ++ mbedtls_mpi_init(&bn_modulus); ++ mbedtls_mpi_init(&bn_result); ++ ++ size_t len; ++ int ret = mbedtls_mpi_read_binary(&bn_base, base, base_len) ++ || mbedtls_mpi_read_binary(&bn_exp, power, power_len) ++ || mbedtls_mpi_read_binary(&bn_modulus, modulus, modulus_len) ++ || mbedtls_mpi_exp_mod(&bn_result,&bn_base,&bn_exp,&bn_modulus,NULL) ++ || (len = mbedtls_mpi_size(&bn_result)) > *result_len ++ || mbedtls_mpi_write_binary(&bn_result, result, (*result_len = len)) ++ ? -1 ++ : 0; ++ ++ mbedtls_mpi_free(&bn_base); ++ mbedtls_mpi_free(&bn_exp); ++ mbedtls_mpi_free(&bn_modulus); ++ mbedtls_mpi_free(&bn_result); ++ return ret; ++} ++#endif ++ ++static int crypto_mbedtls_dh_set_bin_pg(mbedtls_dhm_context *ctx, u8 generator, ++ const u8 *prime, size_t prime_len) ++{ ++ /*(could set these directly in MBEDTLS_PRIVATE members)*/ ++ mbedtls_mpi P, G; ++ mbedtls_mpi_init(&P); ++ mbedtls_mpi_init(&G); ++ int ret = mbedtls_mpi_lset(&G, generator) ++ || mbedtls_mpi_read_binary(&P, prime, prime_len) ++ || mbedtls_dhm_set_group(ctx, &P, &G); ++ mbedtls_mpi_free(&P); ++ mbedtls_mpi_free(&G); ++ return ret; ++} ++ ++__attribute_noinline__ ++static int crypto_mbedtls_dh_init_public(mbedtls_dhm_context *ctx, u8 generator, ++ const u8 *prime, size_t prime_len, ++ u8 *privkey, u8 *pubkey) ++{ ++ if (crypto_mbedtls_dh_set_bin_pg(ctx, generator, prime, prime_len) ++ || mbedtls_dhm_make_public(ctx, (int)prime_len, pubkey, prime_len, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg())) ++ return -1; ++ ++ /*(enable later when upstream mbedtls interface changes require)*/ ++ #if 0 && MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++ mbedtls_mpi X; ++ mbedtls_mpi_init(&X); ++ int ret = mbedtls_dhm_get_value(ctx, MBEDTLS_DHM_PARAM_X, &X) ++ || mbedtls_mpi_write_binary(&X, privkey, prime_len) ? -1 : 0; ++ mbedtls_mpi_free(&X); ++ return ret; ++ #else ++ return mbedtls_mpi_write_binary(&ctx->MBEDTLS_PRIVATE(X), ++ privkey, prime_len) ? -1 : 0; ++ #endif ++} ++ ++int crypto_dh_init(u8 generator, const u8 *prime, size_t prime_len, u8 *privkey, ++ u8 *pubkey) ++{ ++ #if 0 /*(crypto_dh_init() duplicated (and identical) in crypto_*.c modules)*/ ++ size_t pubkey_len, pad; ++ ++ if (os_get_random(privkey, prime_len) < 0) ++ return -1; ++ if (os_memcmp(privkey, prime, prime_len) > 0) { ++ /* Make sure private value is smaller than prime */ ++ privkey[0] = 0; ++ } ++ ++ pubkey_len = prime_len; ++ if (crypto_mod_exp(&generator, 1, privkey, prime_len, prime, prime_len, ++ pubkey, &pubkey_len) < 0) ++ return -1; ++ if (pubkey_len < prime_len) { ++ pad = prime_len - pubkey_len; ++ os_memmove(pubkey + pad, pubkey, pubkey_len); ++ os_memset(pubkey, 0, pad); ++ } ++ ++ return 0; ++ #else ++ /* Prefer to use mbedtls to derive our public/private key, as doing so ++ * leverages mbedtls to properly format output and to perform blinding*/ ++ mbedtls_dhm_context ctx; ++ mbedtls_dhm_init(&ctx); ++ int ret = crypto_mbedtls_dh_init_public(&ctx, generator, prime, ++ prime_len, privkey, pubkey); ++ mbedtls_dhm_free(&ctx); ++ return ret; ++ #endif ++} ++ ++/*(crypto_dh_derive_secret() could be implemented using crypto.h APIs ++ * instead of being reimplemented in each crypto_*.c)*/ ++int crypto_dh_derive_secret(u8 generator, const u8 *prime, size_t prime_len, ++ const u8 *order, size_t order_len, ++ const u8 *privkey, size_t privkey_len, ++ const u8 *pubkey, size_t pubkey_len, ++ u8 *secret, size_t *len) ++{ ++ #if 0 ++ if (pubkey_len > prime_len || ++ (pubkey_len == prime_len && ++ os_memcmp(pubkey, prime, prime_len) >= 0)) ++ return -1; ++ ++ int res = 0; ++ mbedtls_mpi pub; ++ mbedtls_mpi_init(&pub); ++ if (mbedtls_mpi_read_binary(&pub, pubkey, pubkey_len) ++ || mbedtls_mpi_cmp_int(&pub, 1) <= 0) { ++ res = -1; ++ } else if (order) { ++ mbedtls_mpi p, q, tmp; ++ mbedtls_mpi_init(&p); ++ mbedtls_mpi_init(&q); ++ mbedtls_mpi_init(&tmp); ++ ++ /* verify: pubkey^q == 1 mod p */ ++ res = (mbedtls_mpi_read_binary(&p, prime, prime_len) ++ || mbedtls_mpi_read_binary(&q, order, order_len) ++ || mbedtls_mpi_exp_mod(&tmp, &pub, &q, &p, NULL) ++ || mbedtls_mpi_cmp_int(&tmp, 1) != 0); ++ ++ mbedtls_mpi_free(&p); ++ mbedtls_mpi_free(&q); ++ mbedtls_mpi_free(&tmp); ++ } ++ mbedtls_mpi_free(&pub); ++ ++ return (res == 0) ++ ? crypto_mod_exp(pubkey, pubkey_len, privkey, privkey_len, ++ prime, prime_len, secret, len) ++ : -1; ++ #else ++ /* Prefer to use mbedtls to derive DH shared secret, as doing so ++ * leverages mbedtls to validate params and to perform blinding. ++ * ++ * Attempt to reconstitute DH context to derive shared secret ++ * (due to limitations of the interface, which ought to pass context). ++ * Force provided G (our private key) into context without validation. ++ * Regenerating GX (our public key) not needed to derive shared secret. ++ */ ++ /*(older compilers might not support VLAs)*/ ++ /*unsigned char buf[2+prime_len+2+1+2+pubkey_len];*/ ++ unsigned char buf[2+MBEDTLS_MPI_MAX_SIZE+2+1+2+MBEDTLS_MPI_MAX_SIZE]; ++ unsigned char *p = buf + 2 + prime_len; ++ if (2+prime_len+2+1+2+pubkey_len > sizeof(buf)) ++ return -1; ++ WPA_PUT_BE16(buf, prime_len); /*(2-byte big-endian size of prime)*/ ++ p[0] = 0; /*(2-byte big-endian size of generator)*/ ++ p[1] = 1; ++ p[2] = generator; ++ WPA_PUT_BE16(p+3, pubkey_len); /*(2-byte big-endian size of pubkey)*/ ++ os_memcpy(p+5, pubkey, pubkey_len); ++ os_memcpy(buf+2, prime, prime_len); ++ ++ mbedtls_dhm_context ctx; ++ mbedtls_dhm_init(&ctx); ++ p = buf; ++ int ret = mbedtls_dhm_read_params(&ctx, &p, p+2+prime_len+5+pubkey_len) ++ || mbedtls_mpi_read_binary(&ctx.MBEDTLS_PRIVATE(X), ++ privkey, privkey_len) ++ || mbedtls_dhm_calc_secret(&ctx, secret, *len, len, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg()) ? -1 : 0; ++ mbedtls_dhm_free(&ctx); ++ return ret; ++ #endif ++} ++ ++/* dh_group5.c */ ++ ++#include "dh_group5.h" ++ ++/* RFC3526_PRIME_1536[] and RFC3526_GENERATOR_1536[] from crypto_wolfssl.c */ ++ ++static const unsigned char RFC3526_PRIME_1536[] = { ++ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, ++ 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, ++ 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, ++ 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, ++ 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, ++ 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, ++ 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, ++ 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, ++ 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, ++ 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, ++ 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, ++ 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, ++ 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, ++ 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, ++ 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, ++ 0xCA, 0x23, 0x73, 0x27, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ++}; ++ ++static const unsigned char RFC3526_GENERATOR_1536[] = { ++ 0x02 ++}; ++ ++void * dh5_init(struct wpabuf **priv, struct wpabuf **publ) ++{ ++ const unsigned char * const prime = RFC3526_PRIME_1536; ++ const size_t prime_len = sizeof(RFC3526_PRIME_1536); ++ const u8 generator = *RFC3526_GENERATOR_1536; ++ struct wpabuf *wpubl = NULL, *wpriv = NULL; ++ ++ mbedtls_dhm_context *ctx = os_malloc(sizeof(*ctx)); ++ if (ctx == NULL) ++ return NULL; ++ mbedtls_dhm_init(ctx); ++ ++ if ( (wpubl = wpabuf_alloc(prime_len)) ++ && (wpriv = wpabuf_alloc(prime_len)) ++ && crypto_mbedtls_dh_init_public(ctx, generator, prime, prime_len, ++ wpabuf_put(wpriv, prime_len), ++ wpabuf_put(wpubl, prime_len))==0) { ++ wpabuf_free(*publ); ++ wpabuf_clear_free(*priv); ++ *publ = wpubl; ++ *priv = wpriv; ++ return ctx; ++ } ++ ++ wpabuf_clear_free(wpriv); ++ wpabuf_free(wpubl); ++ mbedtls_dhm_free(ctx); ++ os_free(ctx); ++ return NULL; ++} ++ ++#ifdef CRYPTO_MBEDTLS_DH5_INIT_FIXED ++void * dh5_init_fixed(const struct wpabuf *priv, const struct wpabuf *publ) ++{ ++ const unsigned char * const prime = RFC3526_PRIME_1536; ++ const size_t prime_len = sizeof(RFC3526_PRIME_1536); ++ const u8 generator = *RFC3526_GENERATOR_1536; ++ ++ mbedtls_dhm_context *ctx = os_malloc(sizeof(*ctx)); ++ if (ctx == NULL) ++ return NULL; ++ mbedtls_dhm_init(ctx); ++ ++ if (crypto_mbedtls_dh_set_bin_pg(ctx, generator, prime, prime_len)==0 ++ #if 0 /*(ignore; not required to derive shared secret)*/ ++ && mbedtls_mpi_read_binary(&ctx->MBEDTLS_PRIVATE(GX), ++ wpabuf_head(publ),wpabuf_len(publ))==0 ++ #endif ++ && mbedtls_mpi_read_binary(&ctx->MBEDTLS_PRIVATE(X), ++ wpabuf_head(priv),wpabuf_len(priv))==0) { ++ return ctx; ++ } ++ ++ mbedtls_dhm_free(ctx); ++ os_free(ctx); ++ return NULL; ++} ++#endif ++ ++struct wpabuf * dh5_derive_shared(void *ctx, const struct wpabuf *peer_public, ++ const struct wpabuf *own_private) ++{ ++ /*((mbedtls_dhm_context *)ctx must already contain own_private)*/ ++ /* mbedtls 2.x: prime_len = ctx->len; */ ++ /* mbedtls 3.x: prime_len = mbedtls_dhm_get_len(ctx); */ ++ size_t olen = sizeof(RFC3526_PRIME_1536); /*(sizeof(); prime known)*/ ++ struct wpabuf *buf = wpabuf_alloc(olen); ++ if (buf == NULL) ++ return NULL; ++ if (mbedtls_dhm_read_public((mbedtls_dhm_context *)ctx, ++ wpabuf_head(peer_public), ++ wpabuf_len(peer_public)) == 0 ++ && mbedtls_dhm_calc_secret(ctx, wpabuf_mhead(buf), olen, &olen, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg()) == 0) { ++ wpabuf_put(buf, olen); ++ return buf; ++ } ++ ++ wpabuf_free(buf); ++ return NULL; ++} ++ ++void dh5_free(void *ctx) ++{ ++ mbedtls_dhm_free(ctx); ++ os_free(ctx); ++} ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_DH */ ++ ++ ++#if defined(CRYPTO_MBEDTLS_CRYPTO_ECDH) || defined(CRYPTO_MBEDTLS_CRYPTO_EC) ++ ++#include ++ ++#define CRYPTO_EC_pbits(e) (((mbedtls_ecp_group *)(e))->pbits) ++#define CRYPTO_EC_plen(e) ((((mbedtls_ecp_group *)(e))->pbits+7)>>3) ++#define CRYPTO_EC_P(e) (&((mbedtls_ecp_group *)(e))->P) ++#define CRYPTO_EC_N(e) (&((mbedtls_ecp_group *)(e))->N) ++#define CRYPTO_EC_A(e) (&((mbedtls_ecp_group *)(e))->A) ++#define CRYPTO_EC_B(e) (&((mbedtls_ecp_group *)(e))->B) ++#define CRYPTO_EC_G(e) (&((mbedtls_ecp_group *)(e))->G) ++ ++static mbedtls_ecp_group_id crypto_mbedtls_ecp_group_id_from_ike_id(int group) ++{ ++ /* https://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml */ ++ switch (group) { ++ #ifdef MBEDTLS_ECP_DP_SECP256R1_ENABLED ++ case 19: return MBEDTLS_ECP_DP_SECP256R1; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP384R1_ENABLED ++ case 20: return MBEDTLS_ECP_DP_SECP384R1; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP521R1_ENABLED ++ case 21: return MBEDTLS_ECP_DP_SECP521R1; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP192R1_ENABLED ++ case 25: return MBEDTLS_ECP_DP_SECP192R1; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP224R1_ENABLED ++ case 26: return MBEDTLS_ECP_DP_SECP224R1; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_BP256R1_ENABLED ++ case 28: return MBEDTLS_ECP_DP_BP256R1; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_BP384R1_ENABLED ++ case 29: return MBEDTLS_ECP_DP_BP384R1; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_BP512R1_ENABLED ++ case 30: return MBEDTLS_ECP_DP_BP512R1; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_CURVE25519_ENABLED ++ case 31: return MBEDTLS_ECP_DP_CURVE25519; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_CURVE448_ENABLED ++ case 32: return MBEDTLS_ECP_DP_CURVE448; ++ #endif ++ default: return MBEDTLS_ECP_DP_NONE; ++ } ++} ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_EC ++static int crypto_mbedtls_ike_id_from_ecp_group_id(mbedtls_ecp_group_id grp_id) ++{ ++ /* https://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml */ ++ /*(for crypto_ec_key_group())*/ ++ switch (grp_id) { ++ #ifdef MBEDTLS_ECP_DP_SECP256R1_ENABLED ++ case MBEDTLS_ECP_DP_SECP256R1: return 19; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP384R1_ENABLED ++ case MBEDTLS_ECP_DP_SECP384R1: return 20; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP521R1_ENABLED ++ case MBEDTLS_ECP_DP_SECP521R1: return 21; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP192R1_ENABLED ++ case MBEDTLS_ECP_DP_SECP192R1: return 25; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP224R1_ENABLED ++ case MBEDTLS_ECP_DP_SECP224R1: return 26; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_BP256R1_ENABLED ++ case MBEDTLS_ECP_DP_BP256R1: return 28; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_BP384R1_ENABLED ++ case MBEDTLS_ECP_DP_BP384R1: return 29; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_BP512R1_ENABLED ++ case MBEDTLS_ECP_DP_BP512R1: return 30; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_CURVE25519_ENABLED ++ case MBEDTLS_ECP_DP_CURVE25519: return 31; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_CURVE448_ENABLED ++ case MBEDTLS_ECP_DP_CURVE448: return 32; ++ #endif ++ default: return -1; ++ } ++} ++#endif ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_ECDH || CRYPTO_MBEDTLS_CRYPTO_EC */ ++ ++ ++#if defined(CRYPTO_MBEDTLS_CRYPTO_ECDH) || defined(CRYPTO_MBEDTLS_CRYPTO_EC_DPP) ++ ++#include ++#include ++ ++static int crypto_mbedtls_keypair_gen(int group, mbedtls_pk_context *pk) ++{ ++ mbedtls_ecp_group_id grp_id = ++ crypto_mbedtls_ecp_group_id_from_ike_id(group); ++ if (grp_id == MBEDTLS_ECP_DP_NONE) ++ return -1; ++ const mbedtls_pk_info_t *pk_info = ++ mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY); ++ if (pk_info == NULL) ++ return -1; ++ return mbedtls_pk_setup(pk, pk_info) ++ || mbedtls_ecp_gen_key(grp_id, mbedtls_pk_ec(*pk), ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg()) ? -1 : 0; ++} ++ ++#endif ++ ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_ECDH ++ ++#include ++#include ++#include ++#include ++ ++/* wrap mbedtls_ecdh_context for more future-proof direct access to components ++ * (mbedtls_ecdh_context internal implementation may change between releases) ++ * ++ * If mbedtls_pk_context -- specifically underlying mbedtls_ecp_keypair -- ++ * lifetime were guaranteed to be longer than that of mbedtls_ecdh_context, ++ * then mbedtls_pk_context or mbedtls_ecp_keypair could be stored in crypto_ecdh ++ * (or crypto_ec_key could be stored in crypto_ecdh, and crypto_ec_key could ++ * wrap mbedtls_ecp_keypair and components, to avoid MBEDTLS_PRIVATE access) */ ++struct crypto_ecdh { ++ mbedtls_ecdh_context ctx; ++ mbedtls_ecp_group grp; ++ mbedtls_ecp_point Q; ++}; ++ ++struct crypto_ecdh * crypto_ecdh_init(int group) ++{ ++ mbedtls_pk_context pk; ++ mbedtls_pk_init(&pk); ++ struct crypto_ecdh *ecdh = crypto_mbedtls_keypair_gen(group, &pk) == 0 ++ ? crypto_ecdh_init2(group, (struct crypto_ec_key *)&pk) ++ : NULL; ++ mbedtls_pk_free(&pk); ++ return ecdh; ++} ++ ++struct crypto_ecdh * crypto_ecdh_init2(int group, ++ struct crypto_ec_key *own_key) ++{ ++ mbedtls_ecp_group_id grp_id = ++ crypto_mbedtls_ecp_group_id_from_ike_id(group); ++ if (grp_id == MBEDTLS_ECP_DP_NONE) ++ return NULL; ++ mbedtls_ecp_keypair *ecp_kp = mbedtls_pk_ec(*(mbedtls_pk_context *)own_key); ++ struct crypto_ecdh *ecdh = os_malloc(sizeof(*ecdh)); ++ if (ecdh == NULL) ++ return NULL; ++ mbedtls_ecdh_init(&ecdh->ctx); ++ mbedtls_ecp_group_init(&ecdh->grp); ++ mbedtls_ecp_point_init(&ecdh->Q); ++ if (mbedtls_ecdh_setup(&ecdh->ctx, grp_id) == 0 ++ && mbedtls_ecdh_get_params(&ecdh->ctx,ecp_kp,MBEDTLS_ECDH_OURS) == 0) { ++ /* copy grp and Q for later use ++ * (retrieving this info later is more convoluted ++ * even if mbedtls_ecdh_make_public() is considered)*/ ++ #if MBEDTLS_VERSION_NUMBER >= 0x03020000 /* mbedtls 3.2.0 */ ++ mbedtls_mpi d; ++ mbedtls_mpi_init(&d); ++ if (mbedtls_ecp_export(ecp_kp, &ecdh->grp, &d, &ecdh->Q) == 0) { ++ mbedtls_mpi_free(&d); ++ return ecdh; ++ } ++ mbedtls_mpi_free(&d); ++ #else ++ if (mbedtls_ecp_group_load(&ecdh->grp, grp_id) == 0 ++ && mbedtls_ecp_copy(&ecdh->Q, &ecp_kp->MBEDTLS_PRIVATE(Q)) == 0) ++ return ecdh; ++ #endif ++ } ++ ++ mbedtls_ecp_point_free(&ecdh->Q); ++ mbedtls_ecp_group_free(&ecdh->grp); ++ mbedtls_ecdh_free(&ecdh->ctx); ++ os_free(ecdh); ++ return NULL; ++} ++ ++struct wpabuf * crypto_ecdh_get_pubkey(struct crypto_ecdh *ecdh, int inc_y) ++{ ++ mbedtls_ecp_group *grp = &ecdh->grp; ++ size_t len = CRYPTO_EC_plen(grp); ++ #ifdef MBEDTLS_ECP_MONTGOMERY_ENABLED ++ /* len */ ++ #endif ++ #ifdef MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED ++ if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) ++ len = inc_y ? len*2+1 : len+1; ++ #endif ++ struct wpabuf *buf = wpabuf_alloc(len); ++ if (buf == NULL) ++ return NULL; ++ inc_y = inc_y ? MBEDTLS_ECP_PF_UNCOMPRESSED : MBEDTLS_ECP_PF_COMPRESSED; ++ if (mbedtls_ecp_point_write_binary(grp, &ecdh->Q, inc_y, &len, ++ wpabuf_mhead_u8(buf), len) == 0) { ++ wpabuf_put(buf, len); ++ return buf; ++ } ++ ++ wpabuf_free(buf); ++ return NULL; ++} ++ ++#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) ++static int crypto_mbedtls_short_weierstrass_derive_y(mbedtls_ecp_group *grp, ++ mbedtls_mpi *bn, ++ int parity_bit) ++{ ++ /* y^2 = x^3 + ax + b ++ * sqrt(w) = w^((p+1)/4) mod p (for prime p where p = 3 mod 4) */ ++ mbedtls_mpi *cy2 = (mbedtls_mpi *) ++ crypto_ec_point_compute_y_sqr((struct crypto_ec *)grp, ++ (const struct crypto_bignum *)bn); /*x*/ ++ if (cy2 == NULL) ++ return -1; ++ ++ /*mbedtls_mpi_free(bn);*/ ++ /*(reuse bn to store result (y))*/ ++ ++ mbedtls_mpi exp; ++ mbedtls_mpi_init(&exp); ++ int ret = mbedtls_mpi_get_bit(&grp->P, 0) != 1 /*(p = 3 mod 4)*/ ++ || mbedtls_mpi_get_bit(&grp->P, 1) != 1 /*(p = 3 mod 4)*/ ++ || mbedtls_mpi_add_int(&exp, &grp->P, 1) ++ || mbedtls_mpi_shift_r(&exp, 2) ++ || mbedtls_mpi_exp_mod(bn, cy2, &exp, &grp->P, NULL) ++ || (mbedtls_mpi_get_bit(bn, 0) != parity_bit ++ && mbedtls_mpi_sub_mpi(bn, &grp->P, bn)); ++ mbedtls_mpi_free(&exp); ++ mbedtls_mpi_free(cy2); ++ os_free(cy2); ++ return ret; ++} ++#endif ++ ++struct wpabuf * crypto_ecdh_set_peerkey(struct crypto_ecdh *ecdh, int inc_y, ++ const u8 *key, size_t len) ++{ ++ if (len == 0) /*(invalid peer key)*/ ++ return NULL; ++ ++ mbedtls_ecp_group *grp = &ecdh->grp; ++ ++ #if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) ++ if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { ++ /* add header for mbedtls_ecdh_read_public() */ ++ u8 buf[256]; ++ if (sizeof(buf)-1 < len) ++ return NULL; ++ buf[0] = (u8)(len); ++ os_memcpy(buf+1, key, len); ++ ++ if (inc_y) { ++ if (!(len & 1)) { /*(dpp code/tests does not include tag?!?)*/ ++ if (sizeof(buf)-2 < len) ++ return NULL; ++ buf[0] = (u8)(1+len); ++ buf[1] = 0x04; ++ os_memcpy(buf+2, key, len); ++ } ++ len >>= 1; /*(repurpose len to prime_len)*/ ++ } ++ else if (key[0] == 0x02 || key[0] == 0x03) { /* (inc_y == 0) */ ++ --len; /*(repurpose len to prime_len)*/ ++ ++ /* mbedtls_ecp_point_read_binary() does not currently support ++ * MBEDTLS_ECP_PF_COMPRESSED format (buf[1] = 0x02 or 0x03) ++ * (returns MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE) */ ++ ++ /* derive y, amend buf[] with y for UNCOMPRESSED format */ ++ if (sizeof(buf)-2 < len*2 || len == 0) ++ return NULL; ++ buf[0] = (u8)(1+len*2); ++ buf[1] = 0x04; ++ mbedtls_mpi bn; ++ mbedtls_mpi_init(&bn); ++ int ret = mbedtls_mpi_read_binary(&bn, key+1, len) ++ || crypto_mbedtls_short_weierstrass_derive_y(grp, &bn, ++ key[0] & 1) ++ || mbedtls_mpi_write_binary(&bn, buf+2+len, len); ++ mbedtls_mpi_free(&bn); ++ if (ret != 0) ++ return NULL; ++ } ++ ++ if (key[0] == 0) /*(repurpose len to prime_len)*/ ++ len = CRYPTO_EC_plen(grp); ++ ++ if (mbedtls_ecdh_read_public(&ecdh->ctx, buf, buf[0]+1)) ++ return NULL; ++ } ++ #endif ++ #if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) ++ if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) { ++ if (mbedtls_ecdh_read_public(&ecdh->ctx, key, len)) ++ return NULL; ++ } ++ #endif ++ ++ struct wpabuf *buf = wpabuf_alloc(len); ++ if (buf == NULL) ++ return NULL; ++ ++ if (mbedtls_ecdh_calc_secret(&ecdh->ctx, &len, ++ wpabuf_mhead(buf), len, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg()) == 0) { ++ wpabuf_put(buf, len); ++ return buf; ++ } ++ ++ wpabuf_clear_free(buf); ++ return NULL; ++} ++ ++void crypto_ecdh_deinit(struct crypto_ecdh *ecdh) ++{ ++ if (ecdh == NULL) ++ return; ++ mbedtls_ecp_point_free(&ecdh->Q); ++ mbedtls_ecp_group_free(&ecdh->grp); ++ mbedtls_ecdh_free(&ecdh->ctx); ++ os_free(ecdh); ++} ++ ++size_t crypto_ecdh_prime_len(struct crypto_ecdh *ecdh) ++{ ++ return CRYPTO_EC_plen(&ecdh->grp); ++} ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_ECDH */ ++ ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_EC ++ ++#include ++ ++struct crypto_ec *crypto_ec_init(int group) ++{ ++ mbedtls_ecp_group_id grp_id = ++ crypto_mbedtls_ecp_group_id_from_ike_id(group); ++ if (grp_id == MBEDTLS_ECP_DP_NONE) ++ return NULL; ++ mbedtls_ecp_group *e = os_malloc(sizeof(*e)); ++ if (e == NULL) ++ return NULL; ++ mbedtls_ecp_group_init(e); ++ if (mbedtls_ecp_group_load(e, grp_id) == 0) ++ return (struct crypto_ec *)e; ++ ++ mbedtls_ecp_group_free(e); ++ os_free(e); ++ return NULL; ++} ++ ++void crypto_ec_deinit(struct crypto_ec *e) ++{ ++ mbedtls_ecp_group_free((mbedtls_ecp_group *)e); ++ os_free(e); ++} ++ ++size_t crypto_ec_prime_len(struct crypto_ec *e) ++{ ++ return CRYPTO_EC_plen(e); ++} ++ ++size_t crypto_ec_prime_len_bits(struct crypto_ec *e) ++{ ++ return CRYPTO_EC_pbits(e); ++} ++ ++size_t crypto_ec_order_len(struct crypto_ec *e) ++{ ++ return (mbedtls_mpi_bitlen(CRYPTO_EC_N(e)) + 7) / 8; ++} ++ ++const struct crypto_bignum *crypto_ec_get_prime(struct crypto_ec *e) ++{ ++ return (const struct crypto_bignum *)CRYPTO_EC_P(e); ++} ++ ++const struct crypto_bignum *crypto_ec_get_order(struct crypto_ec *e) ++{ ++ return (const struct crypto_bignum *)CRYPTO_EC_N(e); ++} ++ ++const struct crypto_bignum *crypto_ec_get_a(struct crypto_ec *e) ++{ ++ static const uint8_t secp256r1_a[] = ++ {0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x01, ++ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ++ 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc}; ++ static const uint8_t secp384r1_a[] = ++ {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe, ++ 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, ++ 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xfc}; ++ static const uint8_t secp521r1_a[] = ++ {0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xfc}; ++ static const uint8_t secp192r1_a[] = ++ {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc}; ++ static const uint8_t secp224r1_a[] = ++ {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe, ++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ++ 0xff,0xff,0xff,0xfe}; ++ ++ const uint8_t *bin = NULL; ++ size_t len = 0; ++ ++ /* (mbedtls groups matching supported sswu_curve_param() IKE groups) */ ++ switch (((mbedtls_ecp_group *)e)->id) { ++ #ifdef MBEDTLS_ECP_DP_SECP256R1_ENABLED ++ case MBEDTLS_ECP_DP_SECP256R1: ++ bin = secp256r1_a; ++ len = sizeof(secp256r1_a); ++ break; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP384R1_ENABLED ++ case MBEDTLS_ECP_DP_SECP384R1: ++ bin = secp384r1_a; ++ len = sizeof(secp384r1_a); ++ break; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP521R1_ENABLED ++ case MBEDTLS_ECP_DP_SECP521R1: ++ bin = secp521r1_a; ++ len = sizeof(secp521r1_a); ++ break; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP192R1_ENABLED ++ case MBEDTLS_ECP_DP_SECP192R1: ++ bin = secp192r1_a; ++ len = sizeof(secp192r1_a); ++ break; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_SECP224R1_ENABLED ++ case MBEDTLS_ECP_DP_SECP224R1: ++ bin = secp224r1_a; ++ len = sizeof(secp224r1_a); ++ break; ++ #endif ++ #ifdef MBEDTLS_ECP_DP_BP256R1_ENABLED ++ case MBEDTLS_ECP_DP_BP256R1: ++ return (const struct crypto_bignum *)CRYPTO_EC_A(e); ++ #endif ++ #ifdef MBEDTLS_ECP_DP_BP384R1_ENABLED ++ case MBEDTLS_ECP_DP_BP384R1: ++ return (const struct crypto_bignum *)CRYPTO_EC_A(e); ++ #endif ++ #ifdef MBEDTLS_ECP_DP_BP512R1_ENABLED ++ case MBEDTLS_ECP_DP_BP512R1: ++ return (const struct crypto_bignum *)CRYPTO_EC_A(e); ++ #endif ++ #ifdef MBEDTLS_ECP_DP_CURVE25519_ENABLED ++ case MBEDTLS_ECP_DP_CURVE25519: ++ return (const struct crypto_bignum *)CRYPTO_EC_A(e); ++ #endif ++ #ifdef MBEDTLS_ECP_DP_CURVE448_ENABLED ++ case MBEDTLS_ECP_DP_CURVE448: ++ return (const struct crypto_bignum *)CRYPTO_EC_A(e); ++ #endif ++ default: ++ return NULL; ++ } ++ ++ /*(note: not thread-safe; returns file-scoped static storage)*/ ++ if (mbedtls_mpi_read_binary(&mpi_sw_A, bin, len) == 0) ++ return (const struct crypto_bignum *)&mpi_sw_A; ++ return NULL; ++} ++ ++const struct crypto_bignum *crypto_ec_get_b(struct crypto_ec *e) ++{ ++ return (const struct crypto_bignum *)CRYPTO_EC_B(e); ++} ++ ++const struct crypto_ec_point * crypto_ec_get_generator(struct crypto_ec *e) ++{ ++ return (const struct crypto_ec_point *)CRYPTO_EC_G(e); ++} ++ ++struct crypto_ec_point *crypto_ec_point_init(struct crypto_ec *e) ++{ ++ mbedtls_ecp_point *p = os_malloc(sizeof(*p)); ++ if (p != NULL) ++ mbedtls_ecp_point_init(p); ++ return (struct crypto_ec_point *)p; ++} ++ ++void crypto_ec_point_deinit(struct crypto_ec_point *p, int clear) ++{ ++ mbedtls_ecp_point_free((mbedtls_ecp_point *)p); ++ os_free(p); ++} ++ ++int crypto_ec_point_x(struct crypto_ec *e, const struct crypto_ec_point *p, ++ struct crypto_bignum *x) ++{ ++ mbedtls_mpi *px = &((mbedtls_ecp_point *)p)->MBEDTLS_PRIVATE(X); ++ return mbedtls_mpi_copy((mbedtls_mpi *)x, px) ++ ? -1 ++ : 0; ++} ++ ++int crypto_ec_point_to_bin(struct crypto_ec *e, ++ const struct crypto_ec_point *point, u8 *x, u8 *y) ++{ ++ /* crypto.h documents crypto_ec_point_to_bin() output is big-endian */ ++ size_t len = CRYPTO_EC_plen(e); ++ if (x) { ++ mbedtls_mpi *px = &((mbedtls_ecp_point *)point)->MBEDTLS_PRIVATE(X); ++ if (mbedtls_mpi_write_binary(px, x, len)) ++ return -1; ++ } ++ if (y) { ++ #if 0 /*(should not be necessary; py mpi should be in initial state)*/ ++ #ifdef MBEDTLS_ECP_MONTGOMERY_ENABLED ++ if (mbedtls_ecp_get_type((mbedtls_ecp_group *)e) ++ == MBEDTLS_ECP_TYPE_MONTGOMERY) { ++ os_memset(y, 0, len); ++ return 0; ++ } ++ #endif ++ #endif ++ mbedtls_mpi *py = &((mbedtls_ecp_point *)point)->MBEDTLS_PRIVATE(Y); ++ if (mbedtls_mpi_write_binary(py, y, len)) ++ return -1; ++ } ++ return 0; ++} ++ ++struct crypto_ec_point * crypto_ec_point_from_bin(struct crypto_ec *e, ++ const u8 *val) ++{ ++ size_t len = CRYPTO_EC_plen(e); ++ mbedtls_ecp_point *p = os_malloc(sizeof(*p)); ++ u8 buf[1+MBEDTLS_MPI_MAX_SIZE*2]; ++ if (p == NULL) ++ return NULL; ++ mbedtls_ecp_point_init(p); ++ ++ #ifdef MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED ++ if (mbedtls_ecp_get_type((mbedtls_ecp_group *)e) ++ == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { ++ #if 0 /* prefer alternative to MBEDTLS_PRIVATE() access */ ++ mbedtls_mpi *px = &((mbedtls_ecp_point *)p)->MBEDTLS_PRIVATE(X); ++ mbedtls_mpi *py = &((mbedtls_ecp_point *)p)->MBEDTLS_PRIVATE(Y); ++ mbedtls_mpi *pz = &((mbedtls_ecp_point *)p)->MBEDTLS_PRIVATE(Z); ++ ++ if (mbedtls_mpi_read_binary(px, val, len) == 0 ++ && mbedtls_mpi_read_binary(py, val + len, len) == 0 ++ && mbedtls_mpi_lset(pz, 1) == 0) ++ return (struct crypto_ec_point *)p; ++ #else ++ buf[0] = 0x04; ++ os_memcpy(buf+1, val, len*2); ++ if (mbedtls_ecp_point_read_binary((mbedtls_ecp_group *)e, p, ++ buf, 1+len*2) == 0) ++ return (struct crypto_ec_point *)p; ++ #endif ++ } ++ #endif ++ #ifdef MBEDTLS_ECP_MONTGOMERY_ENABLED ++ if (mbedtls_ecp_get_type((mbedtls_ecp_group *)e) ++ == MBEDTLS_ECP_TYPE_MONTGOMERY) { ++ /* crypto.h interface documents crypto_ec_point_from_bin() ++ * val is length: prime_len * 2 and is big-endian ++ * (Short Weierstrass is assumed by hostap) ++ * Reverse to little-endian format for Montgomery */ ++ for (unsigned int i = 0; i < len; ++i) ++ buf[i] = val[len-1-i]; ++ if (mbedtls_ecp_point_read_binary((mbedtls_ecp_group *)e, p, ++ buf, len) == 0) ++ return (struct crypto_ec_point *)p; ++ } ++ #endif ++ ++ mbedtls_ecp_point_free(p); ++ os_free(p); ++ return NULL; ++} ++ ++int crypto_ec_point_add(struct crypto_ec *e, const struct crypto_ec_point *a, ++ const struct crypto_ec_point *b, ++ struct crypto_ec_point *c) ++{ ++ /* mbedtls does not provide an mbedtls_ecp_point add function */ ++ mbedtls_mpi one; ++ mbedtls_mpi_init(&one); ++ int ret = mbedtls_mpi_lset(&one, 1) ++ || mbedtls_ecp_muladd( ++ (mbedtls_ecp_group *)e, (mbedtls_ecp_point *)c, ++ &one, (const mbedtls_ecp_point *)a, ++ &one, (const mbedtls_ecp_point *)b) ? -1 : 0; ++ mbedtls_mpi_free(&one); ++ return ret; ++} ++ ++int crypto_ec_point_mul(struct crypto_ec *e, const struct crypto_ec_point *p, ++ const struct crypto_bignum *b, ++ struct crypto_ec_point *res) ++{ ++ return mbedtls_ecp_mul( ++ (mbedtls_ecp_group *)e, (mbedtls_ecp_point *)res, ++ (const mbedtls_mpi *)b, (const mbedtls_ecp_point *)p, ++ mbedtls_ctr_drbg_random, crypto_mbedtls_ctr_drbg()) ? -1 : 0; ++} ++ ++int crypto_ec_point_invert(struct crypto_ec *e, struct crypto_ec_point *p) ++{ ++ if (mbedtls_ecp_get_type((mbedtls_ecp_group *)e) ++ == MBEDTLS_ECP_TYPE_MONTGOMERY) { ++ /* e.g. MBEDTLS_ECP_DP_CURVE25519 and MBEDTLS_ECP_DP_CURVE448 */ ++ wpa_printf(MSG_ERROR, ++ "%s not implemented for Montgomery curves",__func__); ++ return -1; ++ } ++ ++ /* mbedtls does not provide an mbedtls_ecp_point invert function */ ++ /* below works for Short Weierstrass; incorrect for Montgomery curves */ ++ mbedtls_mpi *py = &((mbedtls_ecp_point *)p)->MBEDTLS_PRIVATE(Y); ++ return mbedtls_ecp_is_zero((mbedtls_ecp_point *)p) /*point at infinity*/ ++ || mbedtls_mpi_cmp_int(py, 0) == 0 /*point is its own inverse*/ ++ || mbedtls_mpi_sub_abs(py, CRYPTO_EC_P(e), py) == 0 ? 0 : -1; ++} ++ ++#ifdef MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED ++static int ++crypto_ec_point_y_sqr_weierstrass(mbedtls_ecp_group *e, const mbedtls_mpi *x, ++ mbedtls_mpi *y2) ++{ ++ /* MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS y^2 = x^3 + a x + b */ ++ ++ /* Short Weierstrass elliptic curve group w/o A set treated as A = -3 */ ++ /* Attempt to match mbedtls/library/ecp.c:ecp_check_pubkey_sw() behavior ++ * and elsewhere in mbedtls/library/ecp.c where if A is not set, it is ++ * treated as if A = -3. */ ++ ++ #if 0 ++ /* y^2 = x^3 + ax + b */ ++ mbedtls_mpi *A = &e->A; ++ mbedtls_mpi t, A_neg3; ++ if (&e->A.p == NULL) { ++ mbedtls_mpi_init(&A_neg3); ++ if (mbedtls_mpi_lset(&A_neg3, -3) != 0) { ++ mbedtls_mpi_free(&A_neg3); ++ return -1; ++ } ++ A = &A_neg3; ++ } ++ mbedtls_mpi_init(&t); ++ int ret = /* x^3 */ ++ mbedtls_mpi_lset(&t, 3) ++ || mbedtls_mpi_exp_mod(y2, x, &t, &e->P, NULL) ++ /* ax */ ++ || mbedtls_mpi_mul_mpi(y2, y2, A) ++ || mbedtls_mpi_mod_mpi(&t, &t, &e->P) ++ /* ax + b */ ++ || mbedtls_mpi_add_mpi(&t, &t, &e->B) ++ || mbedtls_mpi_mod_mpi(&t, &t, &e->P) ++ /* x^3 + ax + b */ ++ || mbedtls_mpi_add_mpi(&t, &t, y2) /* ax + b + x^3 */ ++ || mbedtls_mpi_mod_mpi(y2, &t, &e->P); ++ mbedtls_mpi_free(&t); ++ if (A == &A_neg3) ++ mbedtls_mpi_free(&A_neg3); ++ return ret; /* 0: success, non-zero: failure */ ++ #else ++ /* y^2 = x^3 + ax + b = (x^2 + a)x + b */ ++ return /* x^2 */ ++ mbedtls_mpi_mul_mpi(y2, x, x) ++ || mbedtls_mpi_mod_mpi(y2, y2, &e->P) ++ /* x^2 + a */ ++ || (e->A.MBEDTLS_PRIVATE(p) ++ ? mbedtls_mpi_add_mpi(y2, y2, &e->A) ++ : mbedtls_mpi_sub_int(y2, y2, 3)) ++ || mbedtls_mpi_mod_mpi(y2, y2, &e->P) ++ /* (x^2 + a)x */ ++ || mbedtls_mpi_mul_mpi(y2, y2, x) ++ || mbedtls_mpi_mod_mpi(y2, y2, &e->P) ++ /* (x^2 + a)x + b */ ++ || mbedtls_mpi_add_mpi(y2, y2, &e->B) ++ || mbedtls_mpi_mod_mpi(y2, y2, &e->P); ++ #endif ++} ++#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */ ++ ++#if 0 /* not used by hostap */ ++#ifdef MBEDTLS_ECP_MONTGOMERY_ENABLED ++static int ++crypto_ec_point_y_sqr_montgomery(mbedtls_ecp_group *e, const mbedtls_mpi *x, ++ mbedtls_mpi *y2) ++{ ++ /* XXX: !!! must be reviewed and audited for correctness !!! */ ++ ++ /* MBEDTLS_ECP_TYPE_MONTGOMERY y^2 = x^3 + a x^2 + x */ ++ ++ /* y^2 = x^3 + a x^2 + x = (x + a)x^2 + x */ ++ mbedtls_mpi x2; ++ mbedtls_mpi_init(&x2); ++ int ret = /* x^2 */ ++ mbedtls_mpi_mul_mpi(&x2, x, x) ++ || mbedtls_mpi_mod_mpi(&x2, &x2, &e->P) ++ /* x + a */ ++ || mbedtls_mpi_add_mpi(y2, x, &e->A) ++ || mbedtls_mpi_mod_mpi(y2, y2, &e->P) ++ /* (x + a)x^2 */ ++ || mbedtls_mpi_mul_mpi(y2, y2, &x2) ++ || mbedtls_mpi_mod_mpi(y2, y2, &e->P) ++ /* (x + a)x^2 + x */ ++ || mbedtls_mpi_add_mpi(y2, y2, x) ++ || mbedtls_mpi_mod_mpi(y2, y2, &e->P); ++ mbedtls_mpi_free(&x2); ++ return ret; /* 0: success, non-zero: failure */ ++} ++#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */ ++#endif ++ ++struct crypto_bignum * ++crypto_ec_point_compute_y_sqr(struct crypto_ec *e, ++ const struct crypto_bignum *x) ++{ ++ mbedtls_mpi *y2 = os_malloc(sizeof(*y2)); ++ if (y2 == NULL) ++ return NULL; ++ mbedtls_mpi_init(y2); ++ ++ #ifdef MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED ++ if (mbedtls_ecp_get_type((mbedtls_ecp_group *)e) ++ == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS ++ && crypto_ec_point_y_sqr_weierstrass((mbedtls_ecp_group *)e, ++ (const mbedtls_mpi *)x, ++ y2) == 0) ++ return (struct crypto_bignum *)y2; ++ #endif ++ #if 0 /* not used by hostap */ ++ #ifdef MBEDTLS_ECP_MONTGOMERY_ENABLED ++ if (mbedtls_ecp_get_type((mbedtls_ecp_group *)e) ++ == MBEDTLS_ECP_TYPE_MONTGOMERY ++ && crypto_ec_point_y_sqr_montgomery((mbedtls_ecp_group *)e, ++ (const mbedtls_mpi *)x, ++ y2) == 0) ++ return (struct crypto_bignum *)y2; ++ #endif ++ #endif ++ ++ mbedtls_mpi_free(y2); ++ os_free(y2); ++ return NULL; ++} ++ ++int crypto_ec_point_is_at_infinity(struct crypto_ec *e, ++ const struct crypto_ec_point *p) ++{ ++ return mbedtls_ecp_is_zero((mbedtls_ecp_point *)p); ++} ++ ++int crypto_ec_point_is_on_curve(struct crypto_ec *e, ++ const struct crypto_ec_point *p) ++{ ++ #if 1 ++ return mbedtls_ecp_check_pubkey((const mbedtls_ecp_group *)e, ++ (const mbedtls_ecp_point *)p) == 0; ++ #else ++ /* compute y^2 mod P and compare to y^2 mod P */ ++ /*(ref: src/eap_common/eap_pwd_common.c:compute_password_element())*/ ++ const mbedtls_mpi *px = &((const mbedtls_ecp_point *)p)->MBEDTLS_PRIVATE(X); ++ mbedtls_mpi *cy2 = (mbedtls_mpi *) ++ crypto_ec_point_compute_y_sqr(e, (const struct crypto_bignum *)px); ++ if (cy2 == NULL) ++ return 0; ++ ++ mbedtls_mpi y2; ++ mbedtls_mpi_init(&y2); ++ const mbedtls_mpi *py = &((const mbedtls_ecp_point *)p)->MBEDTLS_PRIVATE(Y); ++ int is_on_curve = mbedtls_mpi_mul_mpi(&y2, py, py) /* y^2 mod P */ ++ || mbedtls_mpi_mod_mpi(&y2, &y2, CRYPTO_EC_P(e)) ++ || mbedtls_mpi_cmp_mpi(&y2, cy2) != 0 ? 0 : 1; ++ ++ mbedtls_mpi_free(&y2); ++ mbedtls_mpi_free(cy2); ++ os_free(cy2); ++ return is_on_curve; ++ #endif ++} ++ ++int crypto_ec_point_cmp(const struct crypto_ec *e, ++ const struct crypto_ec_point *a, ++ const struct crypto_ec_point *b) ++{ ++ return mbedtls_ecp_point_cmp((const mbedtls_ecp_point *)a, ++ (const mbedtls_ecp_point *)b); ++} ++ ++#if !defined(CONFIG_NO_STDOUT_DEBUG) ++void crypto_ec_point_debug_print(const struct crypto_ec *e, ++ const struct crypto_ec_point *p, ++ const char *title) ++{ ++ u8 x[MBEDTLS_MPI_MAX_SIZE]; ++ u8 y[MBEDTLS_MPI_MAX_SIZE]; ++ size_t len = CRYPTO_EC_plen(e); ++ /* crypto_ec_point_to_bin ought to take (const struct crypto_ec *e) */ ++ struct crypto_ec *ee; ++ *(const struct crypto_ec **)&ee = e; /*(cast away const)*/ ++ if (crypto_ec_point_to_bin(ee, p, x, y) == 0) { ++ if (title) ++ wpa_printf(MSG_DEBUG, "%s", title); ++ wpa_hexdump(MSG_DEBUG, "x:", x, len); ++ wpa_hexdump(MSG_DEBUG, "y:", y, len); ++ } ++} ++#endif ++ ++ ++struct crypto_ec_key * crypto_ec_key_parse_priv(const u8 *der, size_t der_len) ++{ ++ mbedtls_pk_context *ctx = os_malloc(sizeof(*ctx)); ++ if (ctx == NULL) ++ return NULL; ++ mbedtls_pk_init(ctx); ++ #if MBEDTLS_VERSION_NUMBER < 0x03000000 /* mbedtls 3.0.0 */ ++ if (mbedtls_pk_parse_key(ctx, der, der_len, NULL, 0) == 0) ++ #else ++ if (mbedtls_pk_parse_key(ctx, der, der_len, NULL, 0, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg()) == 0) ++ #endif ++ return (struct crypto_ec_key *)ctx; ++ ++ mbedtls_pk_free(ctx); ++ os_free(ctx); ++ return NULL; ++} ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_HPKE ++#ifdef CONFIG_MODULE_TESTS ++/*(for crypto_module_tests.c)*/ ++struct crypto_ec_key * crypto_ec_key_set_priv(int group, ++ const u8 *raw, size_t raw_len) ++{ ++ mbedtls_ecp_group_id grp_id = ++ crypto_mbedtls_ecp_group_id_from_ike_id(group); ++ if (grp_id == MBEDTLS_ECP_DP_NONE) ++ return NULL; ++ const mbedtls_pk_info_t *pk_info = ++ mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY); ++ if (pk_info == NULL) ++ return NULL; ++ mbedtls_pk_context *ctx = os_malloc(sizeof(*ctx)); ++ if (ctx == NULL) ++ return NULL; ++ mbedtls_pk_init(ctx); ++ if (mbedtls_pk_setup(ctx, pk_info) == 0 ++ && mbedtls_ecp_read_key(grp_id,mbedtls_pk_ec(*ctx),raw,raw_len) == 0) { ++ return (struct crypto_ec_key *)ctx; ++ } ++ ++ mbedtls_pk_free(ctx); ++ os_free(ctx); ++ return NULL; ++} ++#endif ++#endif ++ ++#include ++#include ++static int crypto_mbedtls_pk_parse_subpubkey_compressed(mbedtls_pk_context *ctx, const u8 *der, size_t der_len) ++{ ++ /* The following is modified from: ++ * mbedtls/library/pkparse.c:mbedtls_pk_parse_subpubkey() ++ * mbedtls/library/pkparse.c:pk_get_pk_alg() ++ * mbedtls/library/pkparse.c:pk_use_ecparams() ++ */ ++ mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE; ++ const mbedtls_pk_info_t *pk_info; ++ int ret; ++ size_t len; ++ const unsigned char *end = der+der_len; ++ unsigned char *p; ++ *(const unsigned char **)&p = der; ++ ++ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, ++ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) ++ { ++ return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret ) ); ++ } ++ ++ end = p + len; ++ ++ /* ++ if( ( ret = pk_get_pk_alg( &p, end, &pk_alg, &alg_params ) ) != 0 ) ++ return( ret ); ++ */ ++ mbedtls_asn1_buf alg_oid, params; ++ memset( ¶ms, 0, sizeof(mbedtls_asn1_buf) ); ++ if( ( ret = mbedtls_asn1_get_alg( &p, end, &alg_oid, ¶ms ) ) != 0 ) ++ return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_PK_INVALID_ALG, ret ) ); ++ if( mbedtls_oid_get_pk_alg( &alg_oid, &pk_alg ) != 0 ) ++ return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); ++ ++ if( ( ret = mbedtls_asn1_get_bitstring_null( &p, end, &len ) ) != 0 ) ++ return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_PK_INVALID_PUBKEY, ret ) ); ++ ++ if( p + len != end ) ++ return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_PK_INVALID_PUBKEY, ++ MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ) ); ++ ++ if( ( pk_info = mbedtls_pk_info_from_type( pk_alg ) ) == NULL ) ++ return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); ++ ++ if( ( ret = mbedtls_pk_setup( ctx, pk_info ) ) != 0 ) ++ return( ret ); ++ ++ /* assume mbedtls_pk_parse_subpubkey(&der, der+der_len, ctx) ++ * has already run with ctx initialized up to pk_get_ecpubkey(), ++ * and pk_get_ecpubkey() has returned MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ++ * ++ * mbedtls mbedtls_ecp_point_read_binary() ++ * does not handle point in COMPRESSED format ++ * ++ * (validate assumption that algorithm is EC) */ ++ mbedtls_ecp_keypair *ecp_kp = mbedtls_pk_ec(*ctx); ++ if (ecp_kp == NULL) ++ return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); ++ mbedtls_ecp_group *ecp_kp_grp = &ecp_kp->MBEDTLS_PRIVATE(grp); ++ mbedtls_ecp_point *ecp_kp_Q = &ecp_kp->MBEDTLS_PRIVATE(Q); ++ mbedtls_ecp_group_id grp_id; ++ ++ ++ /* mbedtls/library/pkparse.c:pk_use_ecparams() */ ++ ++ if( params.tag == MBEDTLS_ASN1_OID ) ++ { ++ if( mbedtls_oid_get_ec_grp( ¶ms, &grp_id ) != 0 ) ++ return( MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE ); ++ } ++ else ++ { ++#if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) ++ /*(large code block not copied from mbedtls; unsupported)*/ ++ #if 0 ++ if( ( ret = pk_group_id_from_specified( ¶ms, &grp_id ) ) != 0 ) ++ return( ret ); ++ #endif ++#endif ++ return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); ++ } ++ ++ /* ++ * grp may already be initialized; if so, make sure IDs match ++ */ ++ if( ecp_kp_grp->id != MBEDTLS_ECP_DP_NONE && ecp_kp_grp->id != grp_id ) ++ return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); ++ ++ if( ( ret = mbedtls_ecp_group_load( ecp_kp_grp, grp_id ) ) != 0 ) ++ return( ret ); ++ ++ ++ /* (validate assumption that EC point is in COMPRESSED format) */ ++ len = CRYPTO_EC_plen(ecp_kp_grp); ++ if( mbedtls_ecp_get_type(ecp_kp_grp) != MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS ++ || (end - p) != 1+len ++ || (*p != 0x02 && *p != 0x03) ) ++ return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); ++ ++ /* Instead of calling mbedtls/library/pkparse.c:pk_get_ecpubkey() to call ++ * mbedtls_ecp_point_read_binary(), manually parse point into ecp_kp_Q */ ++ mbedtls_mpi *X = &ecp_kp_Q->MBEDTLS_PRIVATE(X); ++ mbedtls_mpi *Y = &ecp_kp_Q->MBEDTLS_PRIVATE(Y); ++ mbedtls_mpi *Z = &ecp_kp_Q->MBEDTLS_PRIVATE(Z); ++ ret = mbedtls_mpi_lset(Z, 1); ++ if (ret != 0) ++ return( ret ); ++ ret = mbedtls_mpi_read_binary(X, p+1, len); ++ if (ret != 0) ++ return( ret ); ++ /* derive Y ++ * (similar derivation of Y in crypto_mbedtls.c:crypto_ecdh_set_peerkey())*/ ++ ret = mbedtls_mpi_copy(Y, X) /*(Y is used as input and output obj below)*/ ++ || crypto_mbedtls_short_weierstrass_derive_y(ecp_kp_grp, Y, (*p & 1)); ++ if (ret != 0) ++ return( ret ); ++ ++ return mbedtls_ecp_check_pubkey( ecp_kp_grp, ecp_kp_Q ); ++} ++ ++struct crypto_ec_key * crypto_ec_key_parse_pub(const u8 *der, size_t der_len) ++{ ++ mbedtls_pk_context *ctx = os_malloc(sizeof(*ctx)); ++ if (ctx == NULL) ++ return NULL; ++ mbedtls_pk_init(ctx); ++ /*int rc = mbedtls_pk_parse_subpubkey(&der, der+der_len, ctx);*/ ++ int rc = mbedtls_pk_parse_public_key(ctx, der, der_len); ++ if (rc == 0) ++ return (struct crypto_ec_key *)ctx; ++ else if (rc == MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE) { ++ /* mbedtls mbedtls_ecp_point_read_binary() ++ * does not handle point in COMPRESSED format; parse internally */ ++ rc = crypto_mbedtls_pk_parse_subpubkey_compressed(ctx,der,der_len); ++ if (rc == 0) ++ return (struct crypto_ec_key *)ctx; ++ } ++ ++ mbedtls_pk_free(ctx); ++ os_free(ctx); ++ return NULL; ++} ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_EC_DPP ++ ++static struct crypto_ec_key * ++crypto_ec_key_set_pub_point_for_group(mbedtls_ecp_group_id grp_id, ++ const mbedtls_ecp_point *pub, ++ const u8 *buf, size_t len) ++{ ++ const mbedtls_pk_info_t *pk_info = ++ mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY); ++ if (pk_info == NULL) ++ return NULL; ++ mbedtls_pk_context *ctx = os_malloc(sizeof(*ctx)); ++ if (ctx == NULL) ++ return NULL; ++ mbedtls_pk_init(ctx); ++ if (mbedtls_pk_setup(ctx, pk_info) == 0) { ++ /* (Is private key generation necessary for callers?) ++ * alt: gen key then overwrite Q ++ * mbedtls_ecp_gen_key(grp_id, ecp_kp, ++ * mbedtls_ctr_drbg_random, ++ * crypto_mbedtls_ctr_drbg()) == 0 ++ */ ++ mbedtls_ecp_keypair *ecp_kp = mbedtls_pk_ec(*ctx); ++ mbedtls_ecp_group *ecp_kp_grp = &ecp_kp->MBEDTLS_PRIVATE(grp); ++ mbedtls_ecp_point *ecp_kp_Q = &ecp_kp->MBEDTLS_PRIVATE(Q); ++ mbedtls_mpi *ecp_kp_d = &ecp_kp->MBEDTLS_PRIVATE(d); ++ if (mbedtls_ecp_group_load(ecp_kp_grp, grp_id) == 0 ++ && (pub ++ ? mbedtls_ecp_copy(ecp_kp_Q, pub) == 0 ++ : mbedtls_ecp_point_read_binary(ecp_kp_grp, ecp_kp_Q, ++ buf, len) == 0) ++ && mbedtls_ecp_gen_privkey(ecp_kp_grp, ecp_kp_d, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg()) == 0){ ++ return (struct crypto_ec_key *)ctx; ++ } ++ } ++ ++ mbedtls_pk_free(ctx); ++ os_free(ctx); ++ return NULL; ++} ++ ++struct crypto_ec_key * crypto_ec_key_set_pub(int group, const u8 *x, ++ const u8 *y, size_t len) ++{ ++ mbedtls_ecp_group_id grp_id = ++ crypto_mbedtls_ecp_group_id_from_ike_id(group); ++ if (grp_id == MBEDTLS_ECP_DP_NONE) ++ return NULL; ++ if (len > MBEDTLS_MPI_MAX_SIZE) ++ return NULL; ++ u8 buf[1+MBEDTLS_MPI_MAX_SIZE*2]; ++ buf[0] = 0x04; /* assume x,y for Short Weierstrass */ ++ os_memcpy(buf+1, x, len); ++ os_memcpy(buf+1+len, y, len); ++ ++ return crypto_ec_key_set_pub_point_for_group(grp_id,NULL,buf,1+len*2); ++} ++ ++struct crypto_ec_key * ++crypto_ec_key_set_pub_point(struct crypto_ec *e, ++ const struct crypto_ec_point *pub) ++{ ++ mbedtls_ecp_group_id grp_id = ((mbedtls_ecp_group *)e)->id; ++ mbedtls_ecp_point *p = (mbedtls_ecp_point *)pub; ++ return crypto_ec_key_set_pub_point_for_group(grp_id, p, NULL, 0); ++} ++ ++ ++struct crypto_ec_key * crypto_ec_key_gen(int group) ++{ ++ mbedtls_pk_context *ctx = os_malloc(sizeof(*ctx)); ++ if (ctx == NULL) ++ return NULL; ++ mbedtls_pk_init(ctx); ++ if (crypto_mbedtls_keypair_gen(group, ctx) == 0) ++ return (struct crypto_ec_key *)ctx; ++ mbedtls_pk_free(ctx); ++ os_free(ctx); ++ return NULL; ++} ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_EC_DPP */ ++ ++void crypto_ec_key_deinit(struct crypto_ec_key *key) ++{ ++ mbedtls_pk_free((mbedtls_pk_context *)key); ++ os_free(key); ++} ++ ++struct wpabuf * crypto_ec_key_get_subject_public_key(struct crypto_ec_key *key) ++{ ++ /* (similar to crypto_ec_key_get_pubkey_point(), ++ * but compressed point format and ASN.1 DER wrapping)*/ ++#ifndef MBEDTLS_PK_ECP_PUB_DER_MAX_BYTES /*(mbedtls/library/pkwrite.h)*/ ++#define MBEDTLS_PK_ECP_PUB_DER_MAX_BYTES ( 30 + 2 * MBEDTLS_ECP_MAX_BYTES ) ++#endif ++ unsigned char buf[MBEDTLS_PK_ECP_PUB_DER_MAX_BYTES]; ++ int len = mbedtls_pk_write_pubkey_der((mbedtls_pk_context *)key, ++ buf, sizeof(buf)); ++ if (len < 0) ++ return NULL; ++ /* Note: data is written at the end of the buffer! Use the ++ * return value to determine where you should start ++ * using the buffer */ ++ unsigned char *p = buf+sizeof(buf)-len; ++ ++ #ifdef MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED ++ mbedtls_ecp_keypair *ecp_kp = mbedtls_pk_ec(*(mbedtls_pk_context *)key); ++ if (ecp_kp == NULL) ++ return NULL; ++ mbedtls_ecp_group *grp = &ecp_kp->MBEDTLS_PRIVATE(grp); ++ /* Note: sae_pk.c expects pubkey point in compressed format, ++ * but mbedtls_pk_write_pubkey_der() writes uncompressed format. ++ * Manually translate format and update lengths in DER format */ ++ if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { ++ unsigned char *end = buf+sizeof(buf); ++ size_t n; ++ /* SubjectPublicKeyInfo SEQUENCE */ ++ mbedtls_asn1_get_tag(&p, end, &n, ++ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE); ++ /* algorithm AlgorithmIdentifier */ ++ unsigned char *a = p; ++ size_t alen; ++ mbedtls_asn1_get_tag(&p, end, &alen, ++ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE); ++ p += alen; ++ alen = (size_t)(p - a); ++ /* subjectPublicKey BIT STRING */ ++ mbedtls_asn1_get_tag(&p, end, &n, MBEDTLS_ASN1_BIT_STRING); ++ /* rewrite into compressed point format and rebuild ASN.1 */ ++ p[1] = (buf[sizeof(buf)-1] & 1) ? 0x03 : 0x02; ++ n = 1 + 1 + (n-2)/2; ++ len = mbedtls_asn1_write_len(&p, buf, n) + (int)n; ++ len += mbedtls_asn1_write_tag(&p, buf, MBEDTLS_ASN1_BIT_STRING); ++ os_memmove(p-alen, a, alen); ++ len += alen; ++ p -= alen; ++ len += mbedtls_asn1_write_len(&p, buf, (size_t)len); ++ len += mbedtls_asn1_write_tag(&p, buf, ++ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE); ++ } ++ #endif ++ return wpabuf_alloc_copy(p, (size_t)len); ++} ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_EC_DPP ++ ++struct wpabuf * crypto_ec_key_get_ecprivate_key(struct crypto_ec_key *key, ++ bool include_pub) ++{ ++#ifndef MBEDTLS_PK_ECP_PRV_DER_MAX_BYTES /*(mbedtls/library/pkwrite.h)*/ ++#define MBEDTLS_PK_ECP_PRV_DER_MAX_BYTES ( 29 + 3 * MBEDTLS_ECP_MAX_BYTES ) ++#endif ++ unsigned char priv[MBEDTLS_PK_ECP_PRV_DER_MAX_BYTES]; ++ int privlen = mbedtls_pk_write_key_der((mbedtls_pk_context *)key, ++ priv, sizeof(priv)); ++ if (privlen < 0) ++ return NULL; ++ ++ struct wpabuf *wbuf; ++ ++ /* Note: data is written at the end of the buffer! Use the ++ * return value to determine where you should start ++ * using the buffer */ ++ /* mbedtls_pk_write_key_der() includes publicKey in DER */ ++ if (include_pub) ++ wbuf = wpabuf_alloc_copy(priv+sizeof(priv)-privlen, privlen); ++ else { ++ /* calculate publicKey offset and skip from end of buffer */ ++ unsigned char *p = priv+sizeof(priv)-privlen; ++ unsigned char *end = priv+sizeof(priv); ++ size_t len; ++ /* ECPrivateKey SEQUENCE */ ++ mbedtls_asn1_get_tag(&p, end, &len, ++ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE); ++ /* version INTEGER */ ++ unsigned char *v = p; ++ mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_INTEGER); ++ p += len; ++ /* privateKey OCTET STRING */ ++ mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OCTET_STRING); ++ p += len; ++ /* parameters ECParameters */ ++ mbedtls_asn1_get_tag(&p, end, &len, ++ MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED); ++ p += len; ++ ++ /* write new SEQUENCE header (we know that it fits in priv[]) */ ++ len = (size_t)(p - v); ++ p = v; ++ len += mbedtls_asn1_write_len(&p, priv, len); ++ len += mbedtls_asn1_write_tag(&p, priv, ++ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE); ++ wbuf = wpabuf_alloc_copy(p, len); ++ } ++ ++ forced_memzero(priv, sizeof(priv)); ++ return wbuf; ++} ++ ++struct wpabuf * crypto_ec_key_get_pubkey_point(struct crypto_ec_key *key, ++ int prefix) ++{ ++ /*(similarities to crypto_ecdh_get_pubkey(), but different struct)*/ ++ mbedtls_ecp_keypair *ecp_kp = mbedtls_pk_ec(*(mbedtls_pk_context *)key); ++ if (ecp_kp == NULL) ++ return NULL; ++ mbedtls_ecp_group *grp = &ecp_kp->MBEDTLS_PRIVATE(grp); ++ size_t len = CRYPTO_EC_plen(grp); ++ #ifdef MBEDTLS_ECP_MONTGOMERY_ENABLED ++ /* len */ ++ #endif ++ #ifdef MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED ++ if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) ++ len = len*2+1; ++ #endif ++ struct wpabuf *buf = wpabuf_alloc(len); ++ if (buf == NULL) ++ return NULL; ++ mbedtls_ecp_point *ecp_kp_Q = &ecp_kp->MBEDTLS_PRIVATE(Q); ++ if (mbedtls_ecp_point_write_binary(grp, ecp_kp_Q, ++ MBEDTLS_ECP_PF_UNCOMPRESSED, &len, ++ wpabuf_mhead_u8(buf), len) == 0) { ++ if (!prefix) /* Remove 0x04 prefix if requested */ ++ os_memmove(wpabuf_mhead(buf),wpabuf_mhead(buf)+1,--len); ++ wpabuf_put(buf, len); ++ return buf; ++ } ++ ++ wpabuf_free(buf); ++ return NULL; ++} ++ ++struct crypto_ec_point * ++crypto_ec_key_get_public_key(struct crypto_ec_key *key) ++{ ++ mbedtls_ecp_keypair *ecp_kp = mbedtls_pk_ec(*(mbedtls_pk_context *)key); ++ if (ecp_kp == NULL) ++ return NULL; ++ mbedtls_ecp_point *p = os_malloc(sizeof(*p)); ++ if (p != NULL) { ++ /*(mbedtls_ecp_export() uses &ecp_kp->MBEDTLS_PRIVATE(grp))*/ ++ mbedtls_ecp_point_init(p); ++ mbedtls_ecp_point *ecp_kp_Q = &ecp_kp->MBEDTLS_PRIVATE(Q); ++ if (mbedtls_ecp_copy(p, ecp_kp_Q)) { ++ mbedtls_ecp_point_free(p); ++ os_free(p); ++ p = NULL; ++ } ++ } ++ return (struct crypto_ec_point *)p; ++} ++ ++struct crypto_bignum * ++crypto_ec_key_get_private_key(struct crypto_ec_key *key) ++{ ++ mbedtls_ecp_keypair *ecp_kp = mbedtls_pk_ec(*(mbedtls_pk_context *)key); ++ if (ecp_kp == NULL) ++ return NULL; ++ mbedtls_mpi *bn = os_malloc(sizeof(*bn)); ++ if (bn) { ++ /*(mbedtls_ecp_export() uses &ecp_kp->MBEDTLS_PRIVATE(grp))*/ ++ mbedtls_mpi_init(bn); ++ mbedtls_mpi *ecp_kp_d = &ecp_kp->MBEDTLS_PRIVATE(d); ++ if (mbedtls_mpi_copy(bn, ecp_kp_d)) { ++ mbedtls_mpi_free(bn); ++ os_free(bn); ++ bn = NULL; ++ } ++ } ++ return (struct crypto_bignum *)bn; ++} ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_EC_DPP */ ++ ++static mbedtls_md_type_t crypto_ec_key_sign_md(size_t len) ++{ ++ /* get mbedtls_md_type_t from length of hash data to be signed */ ++ switch (len) { ++ case 64: return MBEDTLS_MD_SHA512; ++ case 48: return MBEDTLS_MD_SHA384; ++ case 32: return MBEDTLS_MD_SHA256; ++ case 20: return MBEDTLS_MD_SHA1; ++ case 16: return MBEDTLS_MD_MD5; ++ default: return MBEDTLS_MD_NONE; ++ } ++} ++ ++struct wpabuf * crypto_ec_key_sign(struct crypto_ec_key *key, const u8 *data, ++ size_t len) ++{ ++ #ifndef MBEDTLS_PK_SIGNATURE_MAX_SIZE /*(defined since mbedtls 2.20.0)*/ ++ #if MBEDTLS_ECDSA_MAX_LEN > MBEDTLS_MPI_MAX_SIZE ++ #define MBEDTLS_PK_SIGNATURE_MAX_SIZE MBEDTLS_ECDSA_MAX_LEN ++ #else ++ #define MBEDTLS_PK_SIGNATURE_MAX_SIZE MBEDTLS_MPI_MAX_SIZE ++ #endif ++ #endif ++ size_t sig_len = MBEDTLS_PK_SIGNATURE_MAX_SIZE; ++ struct wpabuf *buf = wpabuf_alloc(sig_len); ++ if (buf == NULL) ++ return NULL; ++ if (mbedtls_pk_sign((mbedtls_pk_context *)key, ++ crypto_ec_key_sign_md(len), data, len, ++ wpabuf_mhead_u8(buf), ++ #if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++ sig_len, ++ #endif ++ &sig_len, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg()) == 0) { ++ wpabuf_put(buf, sig_len); ++ return buf; ++ } ++ ++ wpabuf_free(buf); ++ return NULL; ++} ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_EC_DPP ++struct wpabuf * crypto_ec_key_sign_r_s(struct crypto_ec_key *key, ++ const u8 *data, size_t len) ++{ ++ mbedtls_ecp_keypair *ecp_kp = mbedtls_pk_ec(*(mbedtls_pk_context *)key); ++ if (ecp_kp == NULL) ++ return NULL; ++ ++ size_t sig_len = MBEDTLS_ECDSA_MAX_LEN; ++ u8 buf[MBEDTLS_ECDSA_MAX_LEN]; ++ if (mbedtls_ecdsa_write_signature(ecp_kp, crypto_ec_key_sign_md(len), ++ data, len, buf, ++ #if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++ sig_len, ++ #endif ++ &sig_len, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg())) { ++ return NULL; ++ } ++ ++ /*(mbedtls_ecdsa_write_signature() writes signature in ASN.1)*/ ++ /* parse ASN.1 to get r and s and lengths */ ++ u8 *p = buf, *r, *s; ++ u8 *end = p + sig_len; ++ size_t rlen, slen; ++ mbedtls_asn1_get_tag(&p, end, &rlen, ++ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE); ++ mbedtls_asn1_get_tag(&p, end, &rlen, MBEDTLS_ASN1_INTEGER); ++ r = p; ++ p += rlen; ++ mbedtls_asn1_get_tag(&p, end, &slen, MBEDTLS_ASN1_INTEGER); ++ s = p; ++ ++ /* write raw r and s into out ++ * (including removal of leading 0 if added for ASN.1 integer) ++ * note: DPP caller expects raw r, s each padded to prime len */ ++ mbedtls_ecp_group *ecp_kp_grp = &ecp_kp->MBEDTLS_PRIVATE(grp); ++ size_t plen = CRYPTO_EC_plen(ecp_kp_grp); ++ if (rlen > plen) { ++ r += (rlen - plen); ++ rlen = plen; ++ } ++ if (slen > plen) { ++ s += (slen - plen); ++ slen = plen; ++ } ++ struct wpabuf *out = wpabuf_alloc(plen*2); ++ if (out) { ++ wpabuf_put(out, plen*2); ++ p = wpabuf_mhead_u8(out); ++ os_memset(p, 0, plen*2); ++ os_memcpy(p+plen*1-rlen, r, rlen); ++ os_memcpy(p+plen*2-slen, s, slen); ++ } ++ return out; ++} ++#endif /* CRYPTO_MBEDTLS_CRYPTO_EC_DPP */ ++ ++int crypto_ec_key_verify_signature(struct crypto_ec_key *key, const u8 *data, ++ size_t len, const u8 *sig, size_t sig_len) ++{ ++ switch (mbedtls_pk_verify((mbedtls_pk_context *)key, ++ crypto_ec_key_sign_md(len), data, len, ++ sig, sig_len)) { ++ case 0: ++ /*case MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH:*//* XXX: allow? */ ++ return 1; ++ case MBEDTLS_ERR_ECP_VERIFY_FAILED: ++ return 0; ++ default: ++ return -1; ++ } ++} ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_EC_DPP ++int crypto_ec_key_verify_signature_r_s(struct crypto_ec_key *key, ++ const u8 *data, size_t len, ++ const u8 *r, size_t r_len, ++ const u8 *s, size_t s_len) ++{ ++ /* reimplement mbedtls_ecdsa_read_signature() without encoding r and s ++ * into ASN.1 just for mbedtls_ecdsa_read_signature() to decode ASN.1 */ ++ mbedtls_ecp_keypair *ecp_kp = mbedtls_pk_ec(*(mbedtls_pk_context *)key); ++ if (ecp_kp == NULL) ++ return -1; ++ mbedtls_ecp_group *ecp_kp_grp = &ecp_kp->MBEDTLS_PRIVATE(grp); ++ mbedtls_ecp_point *ecp_kp_Q = &ecp_kp->MBEDTLS_PRIVATE(Q); ++ ++ mbedtls_mpi mpi_r; ++ mbedtls_mpi mpi_s; ++ mbedtls_mpi_init(&mpi_r); ++ mbedtls_mpi_init(&mpi_s); ++ int ret = mbedtls_mpi_read_binary(&mpi_r, r, r_len) ++ || mbedtls_mpi_read_binary(&mpi_s, s, s_len) ? -1 : 0; ++ if (ret == 0) { ++ ret = mbedtls_ecdsa_verify(ecp_kp_grp, data, len, ++ ecp_kp_Q, &mpi_r, &mpi_s); ++ ret = ret ? ret == MBEDTLS_ERR_ECP_BAD_INPUT_DATA ? 0 : -1 : 1; ++ } ++ mbedtls_mpi_free(&mpi_r); ++ mbedtls_mpi_free(&mpi_s); ++ return ret; ++} ++#endif /* CRYPTO_MBEDTLS_CRYPTO_EC_DPP */ ++ ++int crypto_ec_key_group(struct crypto_ec_key *key) ++{ ++ mbedtls_ecp_keypair *ecp_kp = mbedtls_pk_ec(*(mbedtls_pk_context *)key); ++ if (ecp_kp == NULL) ++ return -1; ++ mbedtls_ecp_group *ecp_group = &ecp_kp->MBEDTLS_PRIVATE(grp); ++ return crypto_mbedtls_ike_id_from_ecp_group_id(ecp_group->id); ++} ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_EC_DPP ++ ++int crypto_ec_key_cmp(struct crypto_ec_key *key1, struct crypto_ec_key *key2) ++{ ++#if 0 /*(DPP is passing two public keys; unable to use pk_check_pair())*/ ++ #if MBEDTLS_VERSION_NUMBER < 0x03000000 /* mbedtls 3.0.0 */ ++ return mbedtls_pk_check_pair((const mbedtls_pk_context *)key1, ++ (const mbedtls_pk_context *)key2) ? -1 : 0; ++ #else ++ return mbedtls_pk_check_pair((const mbedtls_pk_context *)key1, ++ (const mbedtls_pk_context *)key2, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg()) ? -1 : 0; ++ #endif ++#else ++ mbedtls_ecp_keypair *ecp_kp1=mbedtls_pk_ec(*(mbedtls_pk_context *)key1); ++ mbedtls_ecp_keypair *ecp_kp2=mbedtls_pk_ec(*(mbedtls_pk_context *)key2); ++ if (ecp_kp1 == NULL || ecp_kp2 == NULL) ++ return -1; ++ mbedtls_ecp_group *ecp_kp1_grp = &ecp_kp1->MBEDTLS_PRIVATE(grp); ++ mbedtls_ecp_group *ecp_kp2_grp = &ecp_kp2->MBEDTLS_PRIVATE(grp); ++ mbedtls_ecp_point *ecp_kp1_Q = &ecp_kp1->MBEDTLS_PRIVATE(Q); ++ mbedtls_ecp_point *ecp_kp2_Q = &ecp_kp2->MBEDTLS_PRIVATE(Q); ++ return ecp_kp1_grp->id != ecp_kp2_grp->id ++ || mbedtls_ecp_point_cmp(ecp_kp1_Q, ecp_kp2_Q) ? -1 : 0; ++#endif ++} ++ ++void crypto_ec_key_debug_print(const struct crypto_ec_key *key, ++ const char *title) ++{ ++ /* TBD: what info is desirable here and in what human readable format?*/ ++ /*(crypto_openssl.c prints a human-readably public key and attributes)*/ ++ #if 0 ++ struct mbedtls_pk_debug_item debug_item; ++ if (mbedtls_pk_debug((const mbedtls_pk_context *)key, &debug_item)) ++ return; ++ /* ... */ ++ #endif ++ wpa_printf(MSG_DEBUG, "%s: %s not implemented", title, __func__); ++} ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_EC_DPP */ ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_EC */ ++ ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_CSR ++ ++#include ++#include ++ ++struct crypto_csr * crypto_csr_init(void) ++{ ++ mbedtls_x509write_csr *csr = os_malloc(sizeof(*csr)); ++ if (csr != NULL) ++ mbedtls_x509write_csr_init(csr); ++ return (struct crypto_csr *)csr; ++} ++ ++struct crypto_csr * crypto_csr_verify(const struct wpabuf *req) ++{ ++ /* future: look for alternatives to MBEDTLS_PRIVATE() access */ ++ ++ /* sole caller src/common/dpp_crypto.c:dpp_validate_csr() ++ * uses (mbedtls_x509_csr *) to obtain CSR_ATTR_CHALLENGE_PASSWORD ++ * so allocate different object (mbedtls_x509_csr *) and special-case ++ * object when used in crypto_csr_get_attribute() and when free()d in ++ * crypto_csr_deinit(). */ ++ ++ mbedtls_x509_csr *csr = os_malloc(sizeof(*csr)); ++ if (csr == NULL) ++ return NULL; ++ mbedtls_x509_csr_init(csr); ++ const mbedtls_md_info_t *md_info; ++ unsigned char digest[MBEDTLS_MD_MAX_SIZE]; ++ if (mbedtls_x509_csr_parse_der(csr,wpabuf_head(req),wpabuf_len(req))==0 ++ && (md_info=mbedtls_md_info_from_type(csr->MBEDTLS_PRIVATE(sig_md))) ++ != NULL ++ && mbedtls_md(md_info, csr->cri.p, csr->cri.len, digest) == 0) { ++ switch (mbedtls_pk_verify(&csr->pk,csr->MBEDTLS_PRIVATE(sig_md), ++ digest, mbedtls_md_get_size(md_info), ++ csr->MBEDTLS_PRIVATE(sig).p, ++ csr->MBEDTLS_PRIVATE(sig).len)) { ++ case 0: ++ /*case MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH:*//* XXX: allow? */ ++ return (struct crypto_csr *)((uintptr_t)csr | 1uL); ++ default: ++ break; ++ } ++ } ++ ++ mbedtls_x509_csr_free(csr); ++ os_free(csr); ++ return NULL; ++} ++ ++void crypto_csr_deinit(struct crypto_csr *csr) ++{ ++ if ((uintptr_t)csr & 1uL) { ++ csr = (struct crypto_csr *)((uintptr_t)csr & ~1uL); ++ mbedtls_x509_csr_free((mbedtls_x509_csr *)csr); ++ } ++ else ++ mbedtls_x509write_csr_free((mbedtls_x509write_csr *)csr); ++ os_free(csr); ++} ++ ++int crypto_csr_set_ec_public_key(struct crypto_csr *csr, ++ struct crypto_ec_key *key) ++{ ++ mbedtls_x509write_csr_set_key((mbedtls_x509write_csr *)csr, ++ (mbedtls_pk_context *)key); ++ return 0; ++} ++ ++int crypto_csr_set_name(struct crypto_csr *csr, enum crypto_csr_name type, ++ const char *name) ++{ ++ /* specialized for src/common/dpp_crypto.c */ ++ ++ /* sole caller src/common/dpp_crypto.c:dpp_build_csr() ++ * calls this function only once, using type == CSR_NAME_CN ++ * (If called more than once, this code would need to append ++ * components to the subject name, which we could do by ++ * appending to (mbedtls_x509write_csr *) private member ++ * mbedtls_asn1_named_data *MBEDTLS_PRIVATE(subject)) */ ++ ++ const char *label; ++ switch (type) { ++ case CSR_NAME_CN: label = "CN="; break; ++ case CSR_NAME_SN: label = "SN="; break; ++ case CSR_NAME_C: label = "C="; break; ++ case CSR_NAME_O: label = "O="; break; ++ case CSR_NAME_OU: label = "OU="; break; ++ default: return -1; ++ } ++ ++ size_t len = strlen(name); ++ struct wpabuf *buf = wpabuf_alloc(3+len+1); ++ if (buf == NULL) ++ return -1; ++ wpabuf_put_data(buf, label, strlen(label)); ++ wpabuf_put_data(buf, name, len+1); /*(include trailing '\0')*/ ++ /* Note: 'name' provided is set as given and should be backslash-escaped ++ * by caller when necessary, e.g. literal ',' which are not separating ++ * components should be backslash-escaped */ ++ ++ int ret = ++ mbedtls_x509write_csr_set_subject_name((mbedtls_x509write_csr *)csr, ++ wpabuf_head(buf)) ? -1 : 0; ++ wpabuf_free(buf); ++ return ret; ++} ++ ++/* OBJ_pkcs9_challengePassword 1 2 840 113549 1 9 7 */ ++static const char OBJ_pkcs9_challengePassword[] = MBEDTLS_OID_PKCS9 "\x07"; ++ ++int crypto_csr_set_attribute(struct crypto_csr *csr, enum crypto_csr_attr attr, ++ int attr_type, const u8 *value, size_t len) ++{ ++ /* specialized for src/common/dpp_crypto.c */ ++ /* sole caller src/common/dpp_crypto.c:dpp_build_csr() passes ++ * attr == CSR_ATTR_CHALLENGE_PASSWORD ++ * attr_type == ASN1_TAG_UTF8STRING */ ++ ++ const char *oid; ++ size_t oid_len; ++ switch (attr) { ++ case CSR_ATTR_CHALLENGE_PASSWORD: ++ oid = OBJ_pkcs9_challengePassword; ++ oid_len = sizeof(OBJ_pkcs9_challengePassword)-1; ++ break; ++ default: ++ return -1; ++ } ++ ++ #if 0 /*(incorrect; sets an extension, not an attribute)*/ ++ return mbedtls_x509write_csr_set_extension((mbedtls_x509write_csr *)csr, ++ oid, oid_len, ++ #if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++ 0, /*(critical flag)*/ ++ #endif ++ value, len) ? -1 : 0; ++ #else ++ (void)oid; ++ (void)oid_len; ++ #endif ++ ++ /* mbedtls does not currently provide way to set an attribute in a CSR: ++ * https://github.com/Mbed-TLS/mbedtls/issues/4886 */ ++ wpa_printf(MSG_ERROR, ++ "mbedtls does not currently support setting challengePassword " ++ "attribute in CSR"); ++ return -1; ++} ++ ++const u8 * mbedtls_x509_csr_attr_oid_value(mbedtls_x509_csr *csr, ++ const char *oid, size_t oid_len, ++ size_t *vlen, int *vtype) ++{ ++ /* Note: mbedtls_x509_csr_parse_der() has parsed and validated CSR, ++ * so validation checks are not repeated here ++ * ++ * It would be nicer if (mbedtls_x509_csr *) had an mbedtls_x509_buf of ++ * Attributes (or at least a pointer) since mbedtls_x509_csr_parse_der() ++ * already parsed the rest of CertificationRequestInfo, some of which is ++ * repeated here to step to Attributes. Since csr->subject_raw.p points ++ * into csr->cri.p, which points into csr->raw.p, step over version and ++ * subject of CertificationRequestInfo (SEQUENCE) */ ++ unsigned char *p = csr->subject_raw.p + csr->subject_raw.len; ++ unsigned char *end = csr->cri.p + csr->cri.len, *ext; ++ size_t len; ++ ++ /* step over SubjectPublicKeyInfo */ ++ mbedtls_asn1_get_tag(&p, end, &len, ++ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE); ++ p += len; ++ ++ /* Attributes ++ * { ATTRIBUTE:IOSet } ::= SET OF { SEQUENCE { OID, value } } ++ */ ++ if (mbedtls_asn1_get_tag(&p, end, &len, ++ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC) != 0) { ++ return NULL; ++ } ++ while (p < end) { ++ if (mbedtls_asn1_get_tag(&p, end, &len, ++ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE) != 0) { ++ return NULL; ++ } ++ ext = p; ++ p += len; ++ ++ if (mbedtls_asn1_get_tag(&ext,end,&len,MBEDTLS_ASN1_OID) != 0) ++ return NULL; ++ if (oid_len != len || 0 != memcmp(ext, oid, oid_len)) ++ continue; ++ ++ /* found oid; return value */ ++ *vtype = *ext++; /* tag */ ++ return (mbedtls_asn1_get_len(&ext,end,vlen) == 0) ? ext : NULL; ++ } ++ ++ return NULL; ++} ++ ++const u8 * crypto_csr_get_attribute(struct crypto_csr *csr, ++ enum crypto_csr_attr attr, ++ size_t *len, int *type) ++{ ++ /* specialized for src/common/dpp_crypto.c */ ++ /* sole caller src/common/dpp_crypto.c:dpp_build_csr() passes ++ * attr == CSR_ATTR_CHALLENGE_PASSWORD */ ++ ++ const char *oid; ++ size_t oid_len; ++ switch (attr) { ++ case CSR_ATTR_CHALLENGE_PASSWORD: ++ oid = OBJ_pkcs9_challengePassword; ++ oid_len = sizeof(OBJ_pkcs9_challengePassword)-1; ++ break; ++ default: ++ return NULL; ++ } ++ ++ /* see crypto_csr_verify(); expecting (mbedtls_x509_csr *) tagged |=1 */ ++ if (!((uintptr_t)csr & 1uL)) ++ return NULL; ++ csr = (struct crypto_csr *)((uintptr_t)csr & ~1uL); ++ ++ return mbedtls_x509_csr_attr_oid_value((mbedtls_x509_csr *)csr, ++ oid, oid_len, len, type); ++} ++ ++struct wpabuf * crypto_csr_sign(struct crypto_csr *csr, ++ struct crypto_ec_key *key, ++ enum crypto_hash_alg algo) ++{ ++ mbedtls_md_type_t sig_md; ++ switch (algo) { ++ #ifdef MBEDTLS_SHA256_C ++ case CRYPTO_HASH_ALG_SHA256: sig_md = MBEDTLS_MD_SHA256; break; ++ #endif ++ #ifdef MBEDTLS_SHA512_C ++ case CRYPTO_HASH_ALG_SHA384: sig_md = MBEDTLS_MD_SHA384; break; ++ case CRYPTO_HASH_ALG_SHA512: sig_md = MBEDTLS_MD_SHA512; break; ++ #endif ++ default: ++ return NULL; ++ } ++ mbedtls_x509write_csr_set_md_alg((mbedtls_x509write_csr *)csr, sig_md); ++ ++ #if 0 ++ unsigned char key_usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE ++ | MBEDTLS_X509_KU_KEY_CERT_SIGN; ++ if (mbedtls_x509write_csr_set_key_usage((mbedtls_x509write_csr *)csr, ++ key_usage)) ++ return NULL; ++ #endif ++ ++ #if 0 ++ unsigned char ns_cert_type = MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT ++ | MBEDTLS_X509_NS_CERT_TYPE_EMAIL; ++ if (mbedtls_x509write_csr_set_ns_cert_type((mbedtls_x509write_csr *)csr, ++ ns_cert_type)) ++ return NULL; ++ #endif ++ ++ #if 0 ++ /* mbedtls does not currently provide way to set an attribute in a CSR: ++ * https://github.com/Mbed-TLS/mbedtls/issues/4886 ++ * XXX: hwsim dpp_enterprise test fails due to this limitation. ++ * ++ * Current usage of this function is solely by dpp_build_csr(), ++ * so as a kludge, might consider custom (struct crypto_csr *) ++ * containing (mbedtls_x509write_csr *) and a list of attributes ++ * (i.e. challengePassword). Might have to totally reimplement ++ * mbedtls_x509write_csr_der(); underlying x509write_csr_der_internal() ++ * handles signing the CSR. (This is more work that appending an ++ * Attributes section to end of CSR and adjusting ASN.1 length of CSR.) ++ */ ++ #endif ++ ++ unsigned char buf[4096]; /* XXX: large enough? too large? */ ++ int len = mbedtls_x509write_csr_der((mbedtls_x509write_csr *)csr, ++ buf, sizeof(buf), ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg()); ++ if (len < 0) ++ return NULL; ++ /* Note: data is written at the end of the buffer! Use the ++ * return value to determine where you should start ++ * using the buffer */ ++ return wpabuf_alloc_copy(buf+sizeof(buf)-len, (size_t)len); ++} ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_CSR */ ++ ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_PKCS7 ++ ++#if 0 ++#include /* PKCS7 is not currently supported in mbedtls */ ++#include ++#endif ++ ++struct wpabuf * crypto_pkcs7_get_certificates(const struct wpabuf *pkcs7) ++{ ++ /* PKCS7 is not currently supported in mbedtls */ ++ return NULL; ++ ++#if 0 ++ /* https://github.com/naynajain/mbedtls-1 branch: development-pkcs7 ++ * (??? potential future contribution to mbedtls ???) */ ++ ++ /* Note: PKCS7 signature *is not* verified by this function. ++ * The function interface does not provide for passing a certificate */ ++ ++ mbedtls_pkcs7 mpkcs7; ++ mbedtls_pkcs7_init(&mpkcs7); ++ int pkcs7_type = mbedtls_pkcs7_parse_der(wpabuf_head(pkcs7), ++ wpabuf_len(pkcs7), ++ &mpkcs7); ++ wpabuf *buf = NULL; ++ do { ++ if (pkcs7_type < 0) ++ break; ++ ++ /* src/common/dpp.c:dpp_parse_cred_dot1x() interested in certs ++ * for wpa_supplicant/dpp_supplicant.c:wpas_dpp_add_network() ++ * (? are adding certificate headers and footers desired ?) */ ++ ++ /* development-pkcs7 branch does not currently provide ++ * additional interfaces to retrieve the parsed data */ ++ ++ mbedtls_x509_crt *certs = ++ &mpkcs7.MBEDTLS_PRIVATE(signed_data).MBEDTLS_PRIVATE(certs); ++ int ncerts = ++ mpkcs7.MBEDTLS_PRIVATE(signed_data).MBEDTLS_PRIVATE(no_of_certs); ++ ++ /* allocate buffer for PEM (base64-encoded DER) ++ * plus header, footer, newlines, and some extra */ ++ buf = wpabuf_alloc((wpabuf_len(pkcs7)+2)/3*4 + ncerts*64); ++ if (buf == NULL) ++ break; ++ ++ #define PEM_BEGIN_CRT "-----BEGIN CERTIFICATE-----\n" ++ #define PEM_END_CRT "-----END CERTIFICATE-----\n" ++ size_t olen; ++ for (int i = 0; i < ncerts; ++i) { ++ int ret = mbedtls_pem_write_buffer( ++ PEM_BEGIN_CRT, PEM_END_CRT, ++ certs[i].raw.p, certs[i].raw.len, ++ wpabuf_mhead(buf, 0), wpabuf_tailroom(buf), ++ &olen)); ++ if (ret == 0) ++ wpabuf_put(buf, olen); ++ } else { ++ if (ret == MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL) ++ ret = wpabuf_resize( ++ &buf,olen-wpabuf_tailroom(buf)); ++ if (ret == 0) { ++ --i;/*(adjust loop iterator for retry)*/ ++ continue; ++ } ++ wpabuf_free(buf); ++ buf = NULL; ++ break; ++ } ++ } ++ } while (0); ++ ++ mbedtls_pkcs7_free(&mpkcs7); ++ return buf; ++#endif ++} ++ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_PKCS7 */ ++ ++ ++#ifdef MBEDTLS_ARC4_C ++#include ++int rc4_skip(const u8 *key, size_t keylen, size_t skip, ++ u8 *data, size_t data_len) ++{ ++ mbedtls_arc4_context ctx; ++ mbedtls_arc4_init(&ctx); ++ mbedtls_arc4_setup(&ctx, key, keylen); ++ ++ if (skip) { ++ /*(prefer [16] on ancient hardware with smaller cache lines)*/ ++ unsigned char skip_buf[64]; /*('skip' is generally small)*/ ++ /*os_memset(skip_buf, 0, sizeof(skip_buf));*/ /*(necessary?)*/ ++ size_t len; ++ do { ++ len = skip > sizeof(skip_buf) ? sizeof(skip_buf) : skip; ++ mbedtls_arc4_crypt(&ctx, len, skip_buf, skip_buf); ++ } while ((skip -= len)); ++ } ++ ++ int ret = mbedtls_arc4_crypt(&ctx, data_len, data, data); ++ mbedtls_arc4_free(&ctx); ++ return ret; ++} ++#endif ++ ++ ++/* duplicated in tls_mbedtls.c:tls_mbedtls_readfile()*/ ++__attribute_noinline__ ++static int crypto_mbedtls_readfile(const char *path, u8 **buf, size_t *n) ++{ ++ #if 0 /* #ifdef MBEDTLS_FS_IO */ ++ /*(includes +1 for '\0' needed by mbedtls PEM parsing funcs)*/ ++ if (mbedtls_pk_load_file(path, (unsigned char **)buf, n) != 0) { ++ wpa_printf(MSG_ERROR, "error: mbedtls_pk_load_file %s", path); ++ return -1; ++ } ++ #else ++ /*(use os_readfile() so that we can use os_free() ++ *(if we use mbedtls_pk_load_file() above, macros prevent calling free() ++ * directly #if defined(OS_REJECT_C_LIB_FUNCTIONS) and calling os_free() ++ * on buf aborts in tests if buf not allocated via os_malloc())*/ ++ *buf = (u8 *)os_readfile(path, n); ++ if (!*buf) { ++ wpa_printf(MSG_ERROR, "error: os_readfile %s", path); ++ return -1; ++ } ++ u8 *buf0 = os_realloc(*buf, *n+1); ++ if (!buf0) { ++ bin_clear_free(*buf, *n); ++ *buf = NULL; ++ return -1; ++ } ++ buf0[(*n)++] = '\0'; ++ *buf = buf0; ++ #endif ++ return 0; ++} ++ ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_RSA ++#ifdef MBEDTLS_RSA_C ++ ++#include ++#include ++ ++struct crypto_rsa_key * crypto_rsa_key_read(const char *file, bool private_key) ++{ ++ /* mbedtls_pk_parse_keyfile() and mbedtls_pk_parse_public_keyfile() ++ * require #ifdef MBEDTLS_FS_IO in mbedtls library. Prefer to use ++ * crypto_mbedtls_readfile(), which wraps os_readfile() */ ++ u8 *data; ++ size_t len; ++ if (crypto_mbedtls_readfile(file, &data, &len) != 0) ++ return NULL; ++ ++ mbedtls_pk_context *ctx = os_malloc(sizeof(*ctx)); ++ if (ctx == NULL) { ++ bin_clear_free(data, len); ++ return NULL; ++ } ++ mbedtls_pk_init(ctx); ++ ++ int rc; ++ rc = (private_key ++ ? mbedtls_pk_parse_key(ctx, data, len, NULL, 0 ++ #if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++ ,mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg() ++ #endif ++ ) ++ : mbedtls_pk_parse_public_key(ctx, data, len)) == 0 ++ && mbedtls_pk_can_do(ctx, MBEDTLS_PK_RSA); ++ ++ bin_clear_free(data, len); ++ ++ if (rc) { ++ /* use MBEDTLS_RSA_PKCS_V21 padding for RSAES-OAEP */ ++ /* use MBEDTLS_MD_SHA256 for these hostap interfaces */ ++ #if MBEDTLS_VERSION_NUMBER < 0x03000000 /* mbedtls 3.0.0 */ ++ /*(no return value in mbedtls 2.x)*/ ++ mbedtls_rsa_set_padding(mbedtls_pk_rsa(*ctx), ++ MBEDTLS_RSA_PKCS_V21, ++ MBEDTLS_MD_SHA256); ++ #else ++ if (mbedtls_rsa_set_padding(mbedtls_pk_rsa(*ctx), ++ MBEDTLS_RSA_PKCS_V21, ++ MBEDTLS_MD_SHA256) == 0) ++ #endif ++ return (struct crypto_rsa_key *)ctx; ++ } ++ ++ mbedtls_pk_free(ctx); ++ os_free(ctx); ++ return NULL; ++} ++ ++struct wpabuf * crypto_rsa_oaep_sha256_encrypt(struct crypto_rsa_key *key, ++ const struct wpabuf *in) ++{ ++ mbedtls_rsa_context *pk_rsa = mbedtls_pk_rsa(*(mbedtls_pk_context*)key); ++ size_t olen = mbedtls_rsa_get_len(pk_rsa); ++ struct wpabuf *buf = wpabuf_alloc(olen); ++ if (buf == NULL) ++ return NULL; ++ ++ /* mbedtls_pk_encrypt() takes a few more hops to get to same func */ ++ if (mbedtls_rsa_rsaes_oaep_encrypt(pk_rsa, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg(), ++ #if MBEDTLS_VERSION_NUMBER < 0x03000000 /* mbedtls 3.0.0 */ ++ MBEDTLS_RSA_PRIVATE, ++ #endif ++ NULL, 0, ++ wpabuf_len(in), wpabuf_head(in), ++ wpabuf_put(buf, olen)) == 0) { ++ return buf; ++ } ++ ++ wpabuf_clear_free(buf); ++ return NULL; ++} ++ ++struct wpabuf * crypto_rsa_oaep_sha256_decrypt(struct crypto_rsa_key *key, ++ const struct wpabuf *in) ++{ ++ mbedtls_rsa_context *pk_rsa = mbedtls_pk_rsa(*(mbedtls_pk_context*)key); ++ size_t olen = mbedtls_rsa_get_len(pk_rsa); ++ struct wpabuf *buf = wpabuf_alloc(olen); ++ if (buf == NULL) ++ return NULL; ++ ++ /* mbedtls_pk_decrypt() takes a few more hops to get to same func */ ++ if (mbedtls_rsa_rsaes_oaep_decrypt(pk_rsa, ++ mbedtls_ctr_drbg_random, ++ crypto_mbedtls_ctr_drbg(), ++ #if MBEDTLS_VERSION_NUMBER < 0x03000000 /* mbedtls 3.0.0 */ ++ MBEDTLS_RSA_PUBLIC, ++ #endif ++ NULL, 0, &olen, wpabuf_head(in), ++ wpabuf_mhead(buf), olen) == 0) { ++ wpabuf_put(buf, olen); ++ return buf; ++ } ++ ++ wpabuf_clear_free(buf); ++ return NULL; ++} ++ ++void crypto_rsa_key_free(struct crypto_rsa_key *key) ++{ ++ mbedtls_pk_free((mbedtls_pk_context *)key); ++ os_free(key); ++} ++ ++#endif /* MBEDTLS_RSA_C */ ++#endif /* CRYPTO_MBEDTLS_CRYPTO_RSA */ ++ ++#ifdef CRYPTO_MBEDTLS_CRYPTO_HPKE ++ ++struct wpabuf * hpke_base_seal(enum hpke_kem_id kem_id, ++ enum hpke_kdf_id kdf_id, ++ enum hpke_aead_id aead_id, ++ struct crypto_ec_key *peer_pub, ++ const u8 *info, size_t info_len, ++ const u8 *aad, size_t aad_len, ++ const u8 *pt, size_t pt_len) ++{ ++ /* not yet implemented */ ++ return NULL; ++} ++ ++struct wpabuf * hpke_base_open(enum hpke_kem_id kem_id, ++ enum hpke_kdf_id kdf_id, ++ enum hpke_aead_id aead_id, ++ struct crypto_ec_key *own_priv, ++ const u8 *info, size_t info_len, ++ const u8 *aad, size_t aad_len, ++ const u8 *enc_ct, size_t enc_ct_len) ++{ ++ /* not yet implemented */ ++ return NULL; ++} ++ ++#endif +--- /dev/null ++++ b/src/crypto/tls_mbedtls.c +@@ -0,0 +1,3313 @@ ++/* ++ * SSL/TLS interface functions for mbed TLS ++ * ++ * SPDX-FileCopyrightText: 2022 Glenn Strauss ++ * SPDX-License-Identifier: BSD-3-Clause ++ * ++ * This software may be distributed under the terms of the BSD license. ++ * See README for more details. ++ * ++ * template: src/crypto/tls_none.c ++ * reference: src/crypto/tls_*.c ++ * ++ * Known Limitations: ++ * - no TLSv1.3 (not available in mbedtls 2.x; experimental in mbedtls 3.x) ++ * - no OCSP (not yet available in mbedtls) ++ * - mbedtls does not support all certificate encodings used by hwsim tests ++ * PCKS#5 v1.5 ++ * PCKS#12 ++ * DH DSA ++ * - EAP-FAST, EAP-TEAP session ticket support not implemented in tls_mbedtls.c ++ * - mbedtls does not currently provide way to set an attribute in a CSR ++ * https://github.com/Mbed-TLS/mbedtls/issues/4886 ++ * so tests/hwsim dpp_enterprise tests fail ++ * - DPP2 not supported ++ * PKCS#7 parsing is not supported in mbedtls ++ * See crypto_mbedtls.c:crypto_pkcs7_get_certificates() comments ++ * - DPP3 not supported ++ * hpke_base_seal() and hpke_base_seal() not implemented in crypto_mbedtls.c ++ * ++ * Status: ++ * - code written to be compatible with mbedtls 2.x and mbedtls 3.x ++ * (currently requires mbedtls >= 2.27.0 for mbedtls_mpi_random()) ++ * (currently requires mbedtls >= 2.18.0 for mbedtls_ssl_tls_prf()) ++ * - builds with tests/build/build-wpa_supplicant-mbedtls.config ++ * - passes all tests/ crypto module tests (incomplete coverage) ++ * ($ cd tests; make clean; make -j 4 run-tests CONFIG_TLS=mbedtls) ++ * - passes almost all tests/hwsim tests ++ * (hwsim tests skipped for missing features) ++ * ++ * RFE: ++ * - EAP-FAST, EAP-TEAP session ticket support not implemented in tls_mbedtls.c ++ * - client/server session resumption, and/or save client session ticket ++ */ ++ ++#include "includes.h" ++#include "common.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include /* mbedtls_calloc() mbedtls_free() */ ++#include /* mbedtls_platform_zeroize() */ ++#include ++#include ++#include ++#include ++ ++#if MBEDTLS_VERSION_NUMBER >= 0x02040000 /* mbedtls 2.4.0 */ ++#include ++#else ++#include ++#endif ++ ++#ifndef MBEDTLS_PRIVATE ++#define MBEDTLS_PRIVATE(x) x ++#endif ++ ++#if MBEDTLS_VERSION_NUMBER < 0x03020000 /* mbedtls 3.2.0 */ ++#define mbedtls_ssl_get_ciphersuite_id_from_ssl(ssl) \ ++ ((ssl)->MBEDTLS_PRIVATE(session) \ ++ ?(ssl)->MBEDTLS_PRIVATE(session)->MBEDTLS_PRIVATE(ciphersuite) \ ++ : 0) ++#define mbedtls_ssl_ciphersuite_get_name(info) \ ++ (info)->MBEDTLS_PRIVATE(name) ++#endif ++ ++#include "crypto.h" /* sha256_vector() */ ++#include "tls.h" ++ ++#ifndef SHA256_DIGEST_LENGTH ++#define SHA256_DIGEST_LENGTH 32 ++#endif ++ ++#ifndef MBEDTLS_EXPKEY_FIXED_SECRET_LEN ++#define MBEDTLS_EXPKEY_FIXED_SECRET_LEN 48 ++#endif ++ ++#ifndef MBEDTLS_EXPKEY_RAND_LEN ++#define MBEDTLS_EXPKEY_RAND_LEN 32 ++#endif ++ ++#if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++static mbedtls_ssl_export_keys_t tls_connection_export_keys_cb; ++#elif MBEDTLS_VERSION_NUMBER >= 0x02120000 /* mbedtls 2.18.0 */ ++static mbedtls_ssl_export_keys_ext_t tls_connection_export_keys_cb; ++#else /*(not implemented; return error)*/ ++#define mbedtls_ssl_tls_prf(a,b,c,d,e,f,g,h) (-1) ++typedef mbedtls_tls_prf_types int; ++#endif ++ ++ ++/* hostapd/wpa_supplicant provides forced_memzero(), ++ * but prefer mbedtls_platform_zeroize() */ ++#define forced_memzero(ptr,sz) mbedtls_platform_zeroize(ptr,sz) ++ ++ ++#if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST) \ ++ || defined(EAP_TEAP) || defined(EAP_SERVER_TEAP) ++#ifdef MBEDTLS_SSL_SESSION_TICKETS ++#ifdef MBEDTLS_SSL_TICKET_C ++#define TLS_MBEDTLS_SESSION_TICKETS ++#if defined(EAP_TEAP) || defined(EAP_SERVER_TEAP) ++#define TLS_MBEDTLS_EAP_TEAP ++#endif ++#if !defined(CONFIG_FIPS) /* EAP-FAST keys cannot be exported in FIPS mode */ ++#if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST) ++#define TLS_MBEDTLS_EAP_FAST ++#endif ++#endif ++#endif ++#endif ++#endif ++ ++ ++struct tls_conf { ++ mbedtls_ssl_config conf; ++ ++ unsigned int verify_peer:1; ++ unsigned int verify_depth0_only:1; ++ unsigned int check_crl:2; /*(needs :2 bits for 0, 1, 2)*/ ++ unsigned int check_crl_strict:1; /*(needs :1 bit for 0, 1)*/ ++ unsigned int ca_cert_probe:1; ++ unsigned int has_ca_cert:1; ++ unsigned int has_client_cert:1; ++ unsigned int has_private_key:1; ++ unsigned int suiteb128:1; ++ unsigned int suiteb192:1; ++ mbedtls_x509_crl *crl; ++ mbedtls_x509_crt ca_cert; ++ mbedtls_x509_crt client_cert; ++ mbedtls_pk_context private_key; ++ ++ uint32_t refcnt; ++ ++ unsigned int flags; ++ char *subject_match; ++ char *altsubject_match; ++ char *suffix_match; ++ char *domain_match; ++ char *check_cert_subject; ++ u8 ca_cert_hash[SHA256_DIGEST_LENGTH]; ++ ++ int *ciphersuites; /* list of ciphersuite ids for mbedtls_ssl_config */ ++#if MBEDTLS_VERSION_NUMBER < 0x03010000 /* mbedtls 3.1.0 */ ++ mbedtls_ecp_group_id *curves; ++#else ++ uint16_t *curves; /* list of curve ids for mbedtls_ssl_config */ ++#endif ++}; ++ ++ ++struct tls_global { ++ struct tls_conf *tls_conf; ++ char *ocsp_stapling_response; ++ mbedtls_ctr_drbg_context *ctr_drbg; /*(see crypto_mbedtls.c)*/ ++ #ifdef MBEDTLS_SSL_SESSION_TICKETS ++ mbedtls_ssl_ticket_context ticket_ctx; ++ #endif ++ char *ca_cert_file; ++ struct os_reltime crl_reload_previous; ++ unsigned int crl_reload_interval; ++ uint32_t refcnt; ++ struct tls_config init_conf; ++}; ++ ++static struct tls_global tls_ctx_global; ++ ++ ++struct tls_connection { ++ struct tls_conf *tls_conf; ++ struct wpabuf *push_buf; ++ struct wpabuf *pull_buf; ++ size_t pull_buf_offset; ++ ++ unsigned int established:1; ++ unsigned int resumed:1; ++ unsigned int verify_peer:1; ++ unsigned int is_server:1; ++ ++ mbedtls_ssl_context ssl; ++ ++ mbedtls_tls_prf_types tls_prf_type; ++ size_t expkey_keyblock_size; ++ size_t expkey_secret_len; ++ #if MBEDTLS_VERSION_NUMBER < 0x03000000 /* mbedtls 3.0.0 */ ++ unsigned char expkey_secret[MBEDTLS_EXPKEY_FIXED_SECRET_LEN]; ++ #else ++ unsigned char expkey_secret[MBEDTLS_MD_MAX_SIZE]; ++ #endif ++ unsigned char expkey_randbytes[MBEDTLS_EXPKEY_RAND_LEN*2]; ++ ++ int read_alerts, write_alerts, failed; ++ ++ #ifdef TLS_MBEDTLS_SESSION_TICKETS ++ tls_session_ticket_cb session_ticket_cb; ++ void *session_ticket_cb_ctx; ++ unsigned char *clienthello_session_ticket; ++ size_t clienthello_session_ticket_len; ++ #endif ++ char *peer_subject; /* peer subject info for authenticated peer */ ++ struct wpabuf *success_data; ++}; ++ ++ ++#ifndef __has_attribute ++#define __has_attribute(x) 0 ++#endif ++ ++#ifndef __GNUC_PREREQ ++#define __GNUC_PREREQ(maj,min) 0 ++#endif ++ ++#ifndef __attribute_cold__ ++#if __has_attribute(cold) \ ++ || __GNUC_PREREQ(4,3) ++#define __attribute_cold__ __attribute__((__cold__)) ++#else ++#define __attribute_cold__ ++#endif ++#endif ++ ++#ifndef __attribute_noinline__ ++#if __has_attribute(noinline) \ ++ || __GNUC_PREREQ(3,1) ++#define __attribute_noinline__ __attribute__((__noinline__)) ++#else ++#define __attribute_noinline__ ++#endif ++#endif ++ ++ ++__attribute_cold__ ++__attribute_noinline__ ++static void emsg(int level, const char * const msg) ++{ ++ wpa_printf(level, "MTLS: %s", msg); ++} ++ ++ ++__attribute_cold__ ++__attribute_noinline__ ++static void emsgrc(int level, const char * const msg, int rc) ++{ ++ #ifdef MBEDTLS_ERROR_C ++ /* error logging convenience function that decodes mbedtls result codes */ ++ char buf[256]; ++ mbedtls_strerror(rc, buf, sizeof(buf)); ++ wpa_printf(level, "MTLS: %s: %s (-0x%04x)", msg, buf, -rc); ++ #else ++ wpa_printf(level, "MTLS: %s: (-0x%04x)", msg, -rc); ++ #endif ++} ++ ++ ++#define elog(rc, msg) emsgrc(MSG_ERROR, (msg), (rc)) ++#define ilog(rc, msg) emsgrc(MSG_INFO, (msg), (rc)) ++ ++ ++struct tls_conf * tls_conf_init(void *tls_ctx) ++{ ++ struct tls_conf *tls_conf = os_zalloc(sizeof(*tls_conf)); ++ if (tls_conf == NULL) ++ return NULL; ++ tls_conf->refcnt = 1; ++ ++ mbedtls_ssl_config_init(&tls_conf->conf); ++ mbedtls_ssl_conf_rng(&tls_conf->conf, ++ mbedtls_ctr_drbg_random, tls_ctx_global.ctr_drbg); ++ mbedtls_x509_crt_init(&tls_conf->ca_cert); ++ mbedtls_x509_crt_init(&tls_conf->client_cert); ++ mbedtls_pk_init(&tls_conf->private_key); ++ ++ return tls_conf; ++} ++ ++ ++void tls_conf_deinit(struct tls_conf *tls_conf) ++{ ++ if (tls_conf == NULL || --tls_conf->refcnt != 0) ++ return; ++ ++ mbedtls_x509_crt_free(&tls_conf->ca_cert); ++ mbedtls_x509_crt_free(&tls_conf->client_cert); ++ if (tls_conf->crl) { ++ mbedtls_x509_crl_free(tls_conf->crl); ++ os_free(tls_conf->crl); ++ } ++ mbedtls_pk_free(&tls_conf->private_key); ++ mbedtls_ssl_config_free(&tls_conf->conf); ++ os_free(tls_conf->curves); ++ os_free(tls_conf->ciphersuites); ++ os_free(tls_conf->subject_match); ++ os_free(tls_conf->altsubject_match); ++ os_free(tls_conf->suffix_match); ++ os_free(tls_conf->domain_match); ++ os_free(tls_conf->check_cert_subject); ++ os_free(tls_conf); ++} ++ ++ ++mbedtls_ctr_drbg_context * crypto_mbedtls_ctr_drbg(void); /*(not in header)*/ ++ ++__attribute_cold__ ++void * tls_init(const struct tls_config *conf) ++{ ++ /* RFE: review struct tls_config *conf (different from tls_conf) */ ++ ++ if (++tls_ctx_global.refcnt > 1) ++ return &tls_ctx_global; ++ ++ tls_ctx_global.ctr_drbg = crypto_mbedtls_ctr_drbg(); ++ #ifdef MBEDTLS_SSL_SESSION_TICKETS ++ mbedtls_ssl_ticket_init(&tls_ctx_global.ticket_ctx); ++ mbedtls_ssl_ticket_setup(&tls_ctx_global.ticket_ctx, ++ mbedtls_ctr_drbg_random, ++ tls_ctx_global.ctr_drbg, ++ MBEDTLS_CIPHER_AES_256_GCM, ++ 43200); /* ticket timeout: 12 hours */ ++ #endif ++ /* copy struct for future use */ ++ tls_ctx_global.init_conf = *conf; ++ if (conf->openssl_ciphers) ++ tls_ctx_global.init_conf.openssl_ciphers = ++ os_strdup(conf->openssl_ciphers); ++ ++ tls_ctx_global.crl_reload_interval = conf->crl_reload_interval; ++ os_get_reltime(&tls_ctx_global.crl_reload_previous); ++ ++ return &tls_ctx_global; ++} ++ ++ ++__attribute_cold__ ++void tls_deinit(void *tls_ctx) ++{ ++ if (tls_ctx == NULL || --tls_ctx_global.refcnt != 0) ++ return; ++ ++ tls_conf_deinit(tls_ctx_global.tls_conf); ++ os_free(tls_ctx_global.ca_cert_file); ++ os_free(tls_ctx_global.ocsp_stapling_response); ++ char *openssl_ciphers; /*(allocated in tls_init())*/ ++ *(const char **)&openssl_ciphers = ++ tls_ctx_global.init_conf.openssl_ciphers; ++ os_free(openssl_ciphers); ++ #ifdef MBEDTLS_SSL_SESSION_TICKETS ++ mbedtls_ssl_ticket_free(&tls_ctx_global.ticket_ctx); ++ #endif ++ os_memset(&tls_ctx_global, 0, sizeof(tls_ctx_global)); ++} ++ ++ ++int tls_get_errors(void *tls_ctx) ++{ ++ return 0; ++} ++ ++ ++static void tls_connection_deinit_expkey(struct tls_connection *conn) ++{ ++ conn->tls_prf_type = 0; /* MBEDTLS_SSL_TLS_PRF_NONE; */ ++ conn->expkey_keyblock_size = 0; ++ conn->expkey_secret_len = 0; ++ forced_memzero(conn->expkey_secret, sizeof(conn->expkey_secret)); ++ forced_memzero(conn->expkey_randbytes, sizeof(conn->expkey_randbytes)); ++} ++ ++ ++#ifdef TLS_MBEDTLS_SESSION_TICKETS ++void tls_connection_deinit_clienthello_session_ticket(struct tls_connection *conn) ++{ ++ if (conn->clienthello_session_ticket) { ++ mbedtls_platform_zeroize(conn->clienthello_session_ticket, ++ conn->clienthello_session_ticket_len); ++ mbedtls_free(conn->clienthello_session_ticket); ++ conn->clienthello_session_ticket = NULL; ++ conn->clienthello_session_ticket_len = 0; ++ } ++} ++#endif ++ ++ ++void tls_connection_deinit(void *tls_ctx, struct tls_connection *conn) ++{ ++ if (conn == NULL) ++ return; ++ ++ #if 0 /*(good intention, but never sent since we destroy self below)*/ ++ if (conn->established) ++ mbedtls_ssl_close_notify(&conn->ssl); ++ #endif ++ ++ if (conn->tls_prf_type) ++ tls_connection_deinit_expkey(conn); ++ ++ #ifdef TLS_MBEDTLS_SESSION_TICKETS ++ if (conn->clienthello_session_ticket) ++ tls_connection_deinit_clienthello_session_ticket(conn); ++ #endif ++ ++ os_free(conn->peer_subject); ++ wpabuf_free(conn->success_data); ++ wpabuf_free(conn->push_buf); ++ wpabuf_free(conn->pull_buf); ++ mbedtls_ssl_free(&conn->ssl); ++ tls_conf_deinit(conn->tls_conf); ++ os_free(conn); ++} ++ ++ ++static void tls_mbedtls_refresh_crl(void); ++static int tls_mbedtls_ssl_setup(struct tls_connection *conn); ++ ++struct tls_connection * tls_connection_init(void *tls_ctx) ++{ ++ struct tls_connection *conn = os_zalloc(sizeof(*conn)); ++ if (conn == NULL) ++ return NULL; ++ ++ mbedtls_ssl_init(&conn->ssl); ++ ++ conn->tls_conf = tls_ctx_global.tls_conf; /*(inherit global conf, if set)*/ ++ if (conn->tls_conf) { ++ ++conn->tls_conf->refcnt; ++ /* check for CRL refresh if inheriting from global config */ ++ tls_mbedtls_refresh_crl(); ++ ++ conn->verify_peer = conn->tls_conf->verify_peer; ++ if (tls_mbedtls_ssl_setup(conn) != 0) { ++ tls_connection_deinit(&tls_ctx_global, conn); ++ return NULL; ++ } ++ } ++ ++ return conn; ++} ++ ++ ++int tls_connection_established(void *tls_ctx, struct tls_connection *conn) ++{ ++ return conn ? conn->established : 0; ++} ++ ++ ++__attribute_noinline__ ++char * tls_mbedtls_peer_serial_num(const mbedtls_x509_crt *crt, char *serial_num, size_t len) ++{ ++ /* mbedtls_x509_serial_gets() inefficiently formats to hex separated by ++ * colons, so generate the hex serial number here. The func ++ * wpa_snprintf_hex_uppercase() is similarly inefficient. */ ++ size_t i = 0; /* skip leading 0's per Distinguished Encoding Rules (DER) */ ++ while (i < crt->serial.len && crt->serial.p[i] == 0) ++i; ++ if (i == crt->serial.len) --i; ++ ++ const unsigned char *s = crt->serial.p + i; ++ const size_t e = (crt->serial.len - i) * 2; ++ if (e >= len) ++ return NULL; ++ #if 0 ++ wpa_snprintf_hex_uppercase(serial_num, len, s, crt->serial.len-i); ++ #else ++ for (i = 0; i < e; i+=2, ++s) { ++ serial_num[i+0] = "0123456789ABCDEF"[(*s >> 4)]; ++ serial_num[i+1] = "0123456789ABCDEF"[(*s & 0xF)]; ++ } ++ serial_num[e] = '\0'; ++ #endif ++ return serial_num; ++} ++ ++ ++char * tls_connection_peer_serial_num(void *tls_ctx, ++ struct tls_connection *conn) ++{ ++ const mbedtls_x509_crt *crt = mbedtls_ssl_get_peer_cert(&conn->ssl); ++ if (crt == NULL) ++ return NULL; ++ size_t len = crt->serial.len * 2 + 1; ++ char *serial_num = os_malloc(len); ++ if (!serial_num) ++ return NULL; ++ return tls_mbedtls_peer_serial_num(crt, serial_num, len); ++} ++ ++ ++static void tls_pull_buf_reset(struct tls_connection *conn); ++ ++int tls_connection_shutdown(void *tls_ctx, struct tls_connection *conn) ++{ ++ /* Note: this function called from eap_peer_tls_reauth_init() ++ * for session resumption, not for connection shutdown */ ++ ++ if (conn == NULL) ++ return -1; ++ ++ tls_pull_buf_reset(conn); ++ wpabuf_free(conn->push_buf); ++ conn->push_buf = NULL; ++ conn->established = 0; ++ conn->resumed = 0; ++ if (conn->tls_prf_type) ++ tls_connection_deinit_expkey(conn); ++ ++ /* RFE: prepare for session resumption? (see doc in crypto/tls.h) */ ++ ++ return mbedtls_ssl_session_reset(&conn->ssl); ++} ++ ++ ++static int tls_wpabuf_resize_put_data(struct wpabuf **buf, ++ const unsigned char *data, size_t dlen) ++{ ++ if (wpabuf_resize(buf, dlen) < 0) ++ return 0; ++ wpabuf_put_data(*buf, data, dlen); ++ return 1; ++} ++ ++ ++static int tls_pull_buf_append(struct tls_connection *conn, ++ const struct wpabuf *in_data) ++{ ++ /*(interface does not lend itself to move semantics)*/ ++ return tls_wpabuf_resize_put_data(&conn->pull_buf, ++ wpabuf_head(in_data), ++ wpabuf_len(in_data)); ++} ++ ++ ++static void tls_pull_buf_reset(struct tls_connection *conn) ++{ ++ /*(future: might consider reusing conn->pull_buf)*/ ++ wpabuf_free(conn->pull_buf); ++ conn->pull_buf = NULL; ++ conn->pull_buf_offset = 0; ++} ++ ++ ++__attribute_cold__ ++static void tls_pull_buf_discard(struct tls_connection *conn, const char *func) ++{ ++ size_t discard = wpabuf_len(conn->pull_buf) - conn->pull_buf_offset; ++ if (discard) ++ wpa_printf(MSG_DEBUG, ++ "%s - %zu bytes remaining in pull_buf; discarding", ++ func, discard); ++ tls_pull_buf_reset(conn); ++} ++ ++ ++static int tls_pull_func(void *ptr, unsigned char *buf, size_t len) ++{ ++ struct tls_connection *conn = (struct tls_connection *) ptr; ++ if (conn->pull_buf == NULL) ++ return MBEDTLS_ERR_SSL_WANT_READ; ++ const size_t dlen = wpabuf_len(conn->pull_buf) - conn->pull_buf_offset; ++ if (dlen == 0) ++ return MBEDTLS_ERR_SSL_WANT_READ; ++ ++ if (len > dlen) ++ len = dlen; ++ os_memcpy(buf, wpabuf_head(conn->pull_buf)+conn->pull_buf_offset, len); ++ ++ if (len == dlen) { ++ tls_pull_buf_reset(conn); ++ /*wpa_printf(MSG_DEBUG, "%s - emptied pull_buf", __func__);*/ ++ } ++ else { ++ conn->pull_buf_offset += len; ++ /*wpa_printf(MSG_DEBUG, "%s - %zu bytes remaining in pull_buf", ++ __func__, dlen - len);*/ ++ } ++ return (int)len; ++} ++ ++ ++static int tls_push_func(void *ptr, const unsigned char *buf, size_t len) ++{ ++ struct tls_connection *conn = (struct tls_connection *) ptr; ++ return tls_wpabuf_resize_put_data(&conn->push_buf, buf, len) ++ ? (int)len ++ : MBEDTLS_ERR_SSL_ALLOC_FAILED; ++} ++ ++ ++static int ++tls_mbedtls_verify_cb (void *arg, mbedtls_x509_crt *crt, int depth, uint32_t *flags); ++ ++ ++static int tls_mbedtls_ssl_setup(struct tls_connection *conn) ++{ ++ #if 0 ++ /* mbedtls_ssl_setup() must be called only once */ ++ /* If this func might be called multiple times (e.g. via set_params), ++ * then we should set a flag in conn that ssl was initialized */ ++ if (conn->ssl_is_init) { ++ mbedtls_ssl_free(&conn->ssl); ++ mbedtls_ssl_init(&conn->ssl); ++ } ++ #endif ++ ++ int ret = mbedtls_ssl_setup(&conn->ssl, &conn->tls_conf->conf); ++ if (ret != 0) { ++ elog(ret, "mbedtls_ssl_setup"); ++ return -1; ++ } ++ ++ mbedtls_ssl_set_bio(&conn->ssl, conn, tls_push_func, tls_pull_func, NULL); ++ #if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++ mbedtls_ssl_set_export_keys_cb( ++ &conn->ssl, tls_connection_export_keys_cb, conn); ++ #elif MBEDTLS_VERSION_NUMBER >= 0x02120000 /* mbedtls 2.18.0 */ ++ mbedtls_ssl_conf_export_keys_ext_cb( ++ &conn->tls_conf->conf, tls_connection_export_keys_cb, conn); ++ #endif ++ if (conn->verify_peer) ++ mbedtls_ssl_set_verify(&conn->ssl, tls_mbedtls_verify_cb, conn); ++ ++ return 0; ++} ++ ++ ++static int tls_mbedtls_data_is_pem(const u8 *data) ++{ ++ return (NULL != os_strstr((char *)data, "-----")); ++} ++ ++ ++static void tls_mbedtls_set_allowed_tls_vers(struct tls_conf *tls_conf, ++ mbedtls_ssl_config *conf) ++{ ++ #if !defined(MBEDTLS_SSL_PROTO_TLS1_3) ++ tls_conf->flags |= TLS_CONN_DISABLE_TLSv1_3; ++ #endif ++ ++ /* unconditionally require TLSv1.2+ for TLS_CONN_SUITEB */ ++ if (tls_conf->flags & TLS_CONN_SUITEB) { ++ tls_conf->flags |= TLS_CONN_DISABLE_TLSv1_0; ++ tls_conf->flags |= TLS_CONN_DISABLE_TLSv1_1; ++ } ++ ++ const unsigned int flags = tls_conf->flags; ++ ++ /* attempt to map flags to min and max TLS protocol version */ ++ ++ int min = (flags & TLS_CONN_DISABLE_TLSv1_0) ++ ? (flags & TLS_CONN_DISABLE_TLSv1_1) ++ ? (flags & TLS_CONN_DISABLE_TLSv1_2) ++ ? (flags & TLS_CONN_DISABLE_TLSv1_3) ++ ? 4 ++ : 3 ++ : 2 ++ : 1 ++ : 0; ++ ++ int max = (flags & TLS_CONN_DISABLE_TLSv1_3) ++ ? (flags & TLS_CONN_DISABLE_TLSv1_2) ++ ? (flags & TLS_CONN_DISABLE_TLSv1_1) ++ ? (flags & TLS_CONN_DISABLE_TLSv1_0) ++ ? -1 ++ : 0 ++ : 1 ++ : 2 ++ : 3; ++ ++ if ((flags & TLS_CONN_ENABLE_TLSv1_2) && min > 2) min = 2; ++ if ((flags & TLS_CONN_ENABLE_TLSv1_1) && min > 1) min = 1; ++ if ((flags & TLS_CONN_ENABLE_TLSv1_0) && min > 0) min = 0; ++ if (max < min) { ++ emsg(MSG_ERROR, "invalid tls_disable_tlsv* params; ignoring"); ++ return; ++ } ++ #if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++ /* mbed TLS 3.0.0 removes support for protocols < TLSv1.2 */ ++ if (min < 2 || max < 2) { ++ emsg(MSG_ERROR, "invalid tls_disable_tlsv* params; ignoring"); ++ if (min < 2) min = 2; ++ if (max < 2) max = 2; ++ } ++ #endif ++ ++ #if MBEDTLS_VERSION_NUMBER >= 0x03020000 /* mbedtls 3.2.0 */ ++ /* MBEDTLS_SSL_VERSION_TLS1_2 = 0x0303 *//*!< (D)TLS 1.2 */ ++ /* MBEDTLS_SSL_VERSION_TLS1_3 = 0x0304 *//*!< (D)TLS 1.3 */ ++ min = (min == 2) ? MBEDTLS_SSL_VERSION_TLS1_2 : MBEDTLS_SSL_VERSION_TLS1_3; ++ max = (max == 2) ? MBEDTLS_SSL_VERSION_TLS1_2 : MBEDTLS_SSL_VERSION_TLS1_3; ++ mbedtls_ssl_conf_min_tls_version(conf, min); ++ mbedtls_ssl_conf_max_tls_version(conf, max); ++ #else ++ #ifndef MBEDTLS_SSL_MINOR_VERSION_4 ++ if (min == 3) min = 2; ++ if (max == 3) max = 2; ++ #endif ++ /* MBEDTLS_SSL_MINOR_VERSION_0 0 *//*!< SSL v3.0 */ ++ /* MBEDTLS_SSL_MINOR_VERSION_1 1 *//*!< TLS v1.0 */ ++ /* MBEDTLS_SSL_MINOR_VERSION_2 2 *//*!< TLS v1.1 */ ++ /* MBEDTLS_SSL_MINOR_VERSION_3 3 *//*!< TLS v1.2 */ ++ /* MBEDTLS_SSL_MINOR_VERSION_4 4 *//*!< TLS v1.3 */ ++ mbedtls_ssl_conf_min_version(conf, MBEDTLS_SSL_MAJOR_VERSION_3, min+1); ++ mbedtls_ssl_conf_max_version(conf, MBEDTLS_SSL_MAJOR_VERSION_3, max+1); ++ #endif ++} ++ ++ ++__attribute_noinline__ ++static int tls_mbedtls_readfile(const char *path, u8 **buf, size_t *n); ++ ++ ++static int ++tls_mbedtls_set_dhparams(struct tls_conf *tls_conf, const char *dh_file) ++{ ++ size_t len; ++ u8 *data; ++ if (tls_mbedtls_readfile(dh_file, &data, &len)) ++ return 0; ++ ++ /* parse only if DH parameters if in PEM format */ ++ if (tls_mbedtls_data_is_pem(data) ++ && NULL == os_strstr((char *)data, "-----BEGIN DH PARAMETERS-----")) { ++ if (os_strstr((char *)data, "-----BEGIN DSA PARAMETERS-----")) ++ wpa_printf(MSG_WARNING, "DSA parameters not handled (%s)", dh_file); ++ else ++ wpa_printf(MSG_WARNING, "unexpected DH param content (%s)",dh_file); ++ forced_memzero(data, len); ++ os_free(data); ++ return 0; ++ } ++ ++ /* mbedtls_dhm_parse_dhm() expects "-----BEGIN DH PARAMETERS-----" if PEM */ ++ mbedtls_dhm_context dhm; ++ mbedtls_dhm_init(&dhm); ++ int rc = mbedtls_dhm_parse_dhm(&dhm, data, len); ++ if (0 == rc) ++ rc = mbedtls_ssl_conf_dh_param_ctx(&tls_conf->conf, &dhm); ++ if (0 != rc) ++ elog(rc, dh_file); ++ mbedtls_dhm_free(&dhm); ++ ++ forced_memzero(data, len); ++ os_free(data); ++ return (0 == rc); ++} ++ ++ ++/* reference: lighttpd src/mod_mbedtls.c:mod_mbedtls_ssl_append_curve() ++ * (same author: gstrauss@gluelogic.com; same license: BSD-3-Clause) */ ++#if MBEDTLS_VERSION_NUMBER < 0x03010000 /* mbedtls 3.1.0 */ ++static int ++tls_mbedtls_append_curve (mbedtls_ecp_group_id *ids, int nids, int idsz, const mbedtls_ecp_group_id id) ++{ ++ if (1 >= idsz - (nids + 1)) { ++ emsg(MSG_ERROR, "error: too many curves during list expand"); ++ return -1; ++ } ++ ids[++nids] = id; ++ return nids; ++} ++ ++ ++static int ++tls_mbedtls_set_curves(struct tls_conf *tls_conf, const char *curvelist) ++{ ++ mbedtls_ecp_group_id ids[512]; ++ int nids = -1; ++ const int idsz = (int)(sizeof(ids)/sizeof(*ids)-1); ++ const mbedtls_ecp_curve_info * const curve_info = mbedtls_ecp_curve_list(); ++ ++ for (const char *e = curvelist-1; e; ) { ++ const char * const n = e+1; ++ e = os_strchr(n, ':'); ++ size_t len = e ? (size_t)(e - n) : os_strlen(n); ++ mbedtls_ecp_group_id grp_id = MBEDTLS_ECP_DP_NONE; ++ switch (len) { ++ case 5: ++ if (0 == os_memcmp("P-521", n, 5)) ++ grp_id = MBEDTLS_ECP_DP_SECP521R1; ++ else if (0 == os_memcmp("P-384", n, 5)) ++ grp_id = MBEDTLS_ECP_DP_SECP384R1; ++ else if (0 == os_memcmp("P-256", n, 5)) ++ grp_id = MBEDTLS_ECP_DP_SECP256R1; ++ break; ++ case 6: ++ if (0 == os_memcmp("BP-521", n, 6)) ++ grp_id = MBEDTLS_ECP_DP_BP512R1; ++ else if (0 == os_memcmp("BP-384", n, 6)) ++ grp_id = MBEDTLS_ECP_DP_BP384R1; ++ else if (0 == os_memcmp("BP-256", n, 6)) ++ grp_id = MBEDTLS_ECP_DP_BP256R1; ++ break; ++ default: ++ break; ++ } ++ if (grp_id != MBEDTLS_ECP_DP_NONE) { ++ nids = tls_mbedtls_append_curve(ids, nids, idsz, grp_id); ++ if (-1 == nids) return 0; ++ continue; ++ } ++ /* similar to mbedtls_ecp_curve_info_from_name() */ ++ const mbedtls_ecp_curve_info *info; ++ for (info = curve_info; info->grp_id != MBEDTLS_ECP_DP_NONE; ++info) { ++ if (0 == os_strncmp(info->name, n, len) && info->name[len] == '\0') ++ break; ++ } ++ if (info->grp_id == MBEDTLS_ECP_DP_NONE) { ++ wpa_printf(MSG_ERROR, "MTLS: unrecognized curve: %.*s",(int)len,n); ++ return 0; ++ } ++ ++ nids = tls_mbedtls_append_curve(ids, nids, idsz, info->grp_id); ++ if (-1 == nids) return 0; ++ } ++ ++ /* mod_openssl configures "prime256v1" if curve list not specified, ++ * but mbedtls provides a list of supported curves if not explicitly set */ ++ if (-1 == nids) return 1; /* empty list; no-op */ ++ ++ ids[++nids] = MBEDTLS_ECP_DP_NONE; /* terminate list */ ++ ++nids; ++ ++ /* curves list must be persistent for lifetime of mbedtls_ssl_config */ ++ tls_conf->curves = os_malloc(nids * sizeof(mbedtls_ecp_group_id)); ++ if (tls_conf->curves == NULL) ++ return 0; ++ os_memcpy(tls_conf->curves, ids, nids * sizeof(mbedtls_ecp_group_id)); ++ ++ mbedtls_ssl_conf_curves(&tls_conf->conf, tls_conf->curves); ++ return 1; ++} ++#else ++static int ++tls_mbedtls_append_curve (uint16_t *ids, int nids, int idsz, const uint16_t id) ++{ ++ if (1 >= idsz - (nids + 1)) { ++ emsg(MSG_ERROR, "error: too many curves during list expand"); ++ return -1; ++ } ++ ids[++nids] = id; ++ return nids; ++} ++ ++ ++static int ++tls_mbedtls_set_curves(struct tls_conf *tls_conf, const char *curvelist) ++{ ++ /* TLS Supported Groups (renamed from "EC Named Curve Registry") ++ * https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8 ++ */ ++ uint16_t ids[512]; ++ int nids = -1; ++ const int idsz = (int)(sizeof(ids)/sizeof(*ids)-1); ++ const mbedtls_ecp_curve_info * const curve_info = mbedtls_ecp_curve_list(); ++ ++ for (const char *e = curvelist-1; e; ) { ++ const char * const n = e+1; ++ e = os_strchr(n, ':'); ++ size_t len = e ? (size_t)(e - n) : os_strlen(n); ++ uint16_t tls_id = 0; ++ switch (len) { ++ case 5: ++ if (0 == os_memcmp("P-521", n, 5)) ++ tls_id = 25; /* mbedtls_ecp_group_id MBEDTLS_ECP_DP_SECP521R1 */ ++ else if (0 == os_memcmp("P-384", n, 5)) ++ tls_id = 24; /* mbedtls_ecp_group_id MBEDTLS_ECP_DP_SECP384R1 */ ++ else if (0 == os_memcmp("P-256", n, 5)) ++ tls_id = 23; /* mbedtls_ecp_group_id MBEDTLS_ECP_DP_SECP256R1 */ ++ break; ++ case 6: ++ if (0 == os_memcmp("BP-521", n, 6)) ++ tls_id = 28; /* mbedtls_ecp_group_id MBEDTLS_ECP_DP_BP512R1 */ ++ else if (0 == os_memcmp("BP-384", n, 6)) ++ tls_id = 27; /* mbedtls_ecp_group_id MBEDTLS_ECP_DP_BP384R1 */ ++ else if (0 == os_memcmp("BP-256", n, 6)) ++ tls_id = 26; /* mbedtls_ecp_group_id MBEDTLS_ECP_DP_BP256R1 */ ++ break; ++ default: ++ break; ++ } ++ if (tls_id != 0) { ++ nids = tls_mbedtls_append_curve(ids, nids, idsz, tls_id); ++ if (-1 == nids) return 0; ++ continue; ++ } ++ /* similar to mbedtls_ecp_curve_info_from_name() */ ++ const mbedtls_ecp_curve_info *info; ++ for (info = curve_info; info->tls_id != 0; ++info) { ++ if (0 == os_strncmp(info->name, n, len) && info->name[len] == '\0') ++ break; ++ } ++ if (info->tls_id == 0) { ++ wpa_printf(MSG_ERROR, "MTLS: unrecognized curve: %.*s",(int)len,n); ++ return 0; ++ } ++ ++ nids = tls_mbedtls_append_curve(ids, nids, idsz, info->tls_id); ++ if (-1 == nids) return 0; ++ } ++ ++ /* mod_openssl configures "prime256v1" if curve list not specified, ++ * but mbedtls provides a list of supported curves if not explicitly set */ ++ if (-1 == nids) return 1; /* empty list; no-op */ ++ ++ ids[++nids] = 0; /* terminate list */ ++ ++nids; ++ ++ /* curves list must be persistent for lifetime of mbedtls_ssl_config */ ++ tls_conf->curves = os_malloc(nids * sizeof(uint16_t)); ++ if (tls_conf->curves == NULL) ++ return 0; ++ os_memcpy(tls_conf->curves, ids, nids * sizeof(uint16_t)); ++ ++ mbedtls_ssl_conf_groups(&tls_conf->conf, tls_conf->curves); ++ return 1; ++} ++#endif /* MBEDTLS_VERSION_NUMBER >= 0x03010000 */ /* mbedtls 3.1.0 */ ++ ++ ++/* data copied from lighttpd src/mod_mbedtls.c (BSD-3-Clause) */ ++static const int suite_AES_256_ephemeral[] = { ++ /* All AES-256 ephemeral suites */ ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8 ++}; ++ ++/* data copied from lighttpd src/mod_mbedtls.c (BSD-3-Clause) */ ++static const int suite_AES_128_ephemeral[] = { ++ /* All AES-128 ephemeral suites */ ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8 ++}; ++ ++/* data copied from lighttpd src/mod_mbedtls.c (BSD-3-Clause) */ ++/* HIGH cipher list (mapped from openssl list to mbedtls) */ ++static const int suite_HIGH[] = { ++ MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, ++ MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, ++ MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, ++ MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384, ++ MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, ++ MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, ++ MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, ++ MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256, ++ MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256, ++ MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256, ++ MBEDTLS_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, ++ MBEDTLS_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256, ++ MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384, ++ MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM, ++ MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, ++ MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, ++ MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, ++ MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, ++ MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, ++ MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, ++ MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8, ++ MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384, ++ MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256, ++ MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM, ++ MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, ++ MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, ++ MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, ++ MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, ++ MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, ++ MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, ++ MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8, ++ MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256, ++ MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384, ++ MBEDTLS_TLS_RSA_WITH_AES_256_CCM, ++ MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256, ++ MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA, ++ MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8, ++ MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, ++ MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, ++ MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384, ++ MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256, ++ MBEDTLS_TLS_RSA_WITH_AES_128_CCM, ++ MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256, ++ MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA, ++ MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8, ++ MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, ++ MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, ++ MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256, ++ MBEDTLS_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256, ++ MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, ++ MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, ++ MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, ++ MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, ++ MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384, ++ MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, ++ MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, ++ MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, ++ MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, ++ MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, ++ MBEDTLS_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256, ++ MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384, ++ MBEDTLS_TLS_PSK_WITH_AES_256_CCM, ++ MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384, ++ MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA, ++ MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, ++ MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8, ++ MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384, ++ MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256, ++ MBEDTLS_TLS_PSK_WITH_AES_128_CCM, ++ MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256, ++ MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA, ++ MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, ++ MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8, ++ MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256 ++}; ++ ++ ++__attribute_noinline__ ++static int ++tls_mbedtls_append_ciphersuite (int *ids, int nids, int idsz, const int *x, int xsz) ++{ ++ if (xsz >= idsz - (nids + 1)) { ++ emsg(MSG_ERROR, "error: too many ciphers during list expand"); ++ return -1; ++ } ++ ++ for (int i = 0; i < xsz; ++i) ++ ids[++nids] = x[i]; ++ ++ return nids; ++} ++ ++ ++static int ++tls_mbedtls_translate_ciphername(int id, char *buf, size_t buflen) ++{ ++ const mbedtls_ssl_ciphersuite_t *info = ++ mbedtls_ssl_ciphersuite_from_id(id); ++ if (info == NULL) ++ return 0; ++ const char *name = mbedtls_ssl_ciphersuite_get_name(info); ++ const size_t len = os_strlen(name); ++ if (len == 7 && 0 == os_memcmp(name, "unknown", 7)) ++ return 0; ++ if (len >= buflen) ++ return 0; ++ os_strlcpy(buf, name, buflen); ++ ++ /* attempt to translate mbedtls string to openssl string ++ * (some heuristics; incomplete) */ ++ size_t i = 0, j = 0; ++ if (buf[0] == 'T') { ++ if (os_strncmp(buf, "TLS1-3-", 7) == 0) { ++ buf[3] = '-'; ++ j = 4; /* remove "1-3" from "TLS1-3-" prefix */ ++ i = 7; ++ } ++ else if (os_strncmp(buf, "TLS-", 4) == 0) ++ i = 4; /* remove "TLS-" prefix */ ++ } ++ for (; buf[i]; ++i) { ++ if (buf[i] == '-') { ++ if (i >= 3) { ++ if (0 == os_memcmp(buf+i-3, "AES", 3)) ++ continue; /* "AES-" -> "AES" */ ++ } ++ if (i >= 4) { ++ if (0 == os_memcmp(buf+i-4, "WITH", 4)) { ++ j -= 4; /* remove "WITH-" */ ++ continue; ++ } ++ } ++ } ++ buf[j++] = buf[i]; ++ } ++ buf[j] = '\0'; ++ ++ return j; ++} ++ ++ ++__attribute_noinline__ ++static int ++tls_mbedtls_set_ciphersuites(struct tls_conf *tls_conf, int *ids, int nids) ++{ ++ /* ciphersuites list must be persistent for lifetime of mbedtls_ssl_config*/ ++ os_free(tls_conf->ciphersuites); ++ tls_conf->ciphersuites = os_malloc(nids * sizeof(int)); ++ if (tls_conf->ciphersuites == NULL) ++ return 0; ++ os_memcpy(tls_conf->ciphersuites, ids, nids * sizeof(int)); ++ mbedtls_ssl_conf_ciphersuites(&tls_conf->conf, tls_conf->ciphersuites); ++ return 1; ++} ++ ++ ++static int ++tls_mbedtls_set_ciphers(struct tls_conf *tls_conf, const char *ciphers) ++{ ++ char buf[64]; ++ int ids[512]; ++ int nids = -1; ++ const int idsz = (int)(sizeof(ids)/sizeof(*ids)-1); ++ const char *next; ++ size_t blen, clen; ++ do { ++ next = os_strchr(ciphers, ':'); ++ clen = next ? (size_t)(next - ciphers) : os_strlen(ciphers); ++ if (!clen) ++ continue; ++ ++ /* special-case a select set of openssl group names for hwsim tests */ ++ /* (review; remove excess code if tests are not run for non-OpenSSL?) */ ++ if (clen == 9 && os_memcmp(ciphers, "SUITEB192", 9) == 0) { ++ static int ssl_preset_suiteb192_ciphersuites[] = { ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, ++ 0 ++ }; ++ return tls_mbedtls_set_ciphersuites(tls_conf, ++ ssl_preset_suiteb192_ciphersuites, ++ 2); ++ } ++ if (clen == 9 && os_memcmp(ciphers, "SUITEB128", 9) == 0) { ++ static int ssl_preset_suiteb128_ciphersuites[] = { ++ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, ++ 0 ++ }; ++ return tls_mbedtls_set_ciphersuites(tls_conf, ++ ssl_preset_suiteb128_ciphersuites, ++ 2); ++ } ++ if (clen == 7 && os_memcmp(ciphers, "DEFAULT", 7) == 0) ++ continue; ++ if (clen == 6 && os_memcmp(ciphers, "AES128", 6) == 0) { ++ nids = tls_mbedtls_append_ciphersuite(ids, nids, idsz, ++ suite_AES_128_ephemeral, ++ (int)ARRAY_SIZE(suite_AES_128_ephemeral)); ++ if (nids == -1) ++ return 0; ++ continue; ++ } ++ if (clen == 6 && os_memcmp(ciphers, "AES256", 6) == 0) { ++ nids = tls_mbedtls_append_ciphersuite(ids, nids, idsz, ++ suite_AES_256_ephemeral, ++ (int)ARRAY_SIZE(suite_AES_256_ephemeral)); ++ if (nids == -1) ++ return 0; ++ continue; ++ } ++ if (clen == 4 && os_memcmp(ciphers, "HIGH", 4) == 0) { ++ nids = tls_mbedtls_append_ciphersuite(ids, nids, idsz, suite_HIGH, ++ (int)ARRAY_SIZE(suite_HIGH)); ++ if (nids == -1) ++ return 0; ++ continue; ++ } ++ /* ignore anonymous cipher group names (?not supported by mbedtls?) */ ++ if (clen == 4 && os_memcmp(ciphers, "!ADH", 4) == 0) ++ continue; ++ if (clen == 6 && os_memcmp(ciphers, "-aECDH", 6) == 0) ++ continue; ++ if (clen == 7 && os_memcmp(ciphers, "-aECDSA", 7) == 0) ++ continue; ++ ++ /* attempt to match mbedtls cipher names ++ * nb: does not support openssl group names or list manipulation syntax ++ * (alt: could copy almost 1200 lines (!!!) of lighttpd mod_mbedtls.c ++ * mod_mbedtls_ssl_conf_ciphersuites() to translate strings) ++ * note: not efficient to rewrite list for each ciphers entry, ++ * but this code is expected to run only at startup ++ */ ++ const int *list = mbedtls_ssl_list_ciphersuites(); ++ for (; *list; ++list) { ++ blen = tls_mbedtls_translate_ciphername(*list,buf,sizeof(buf)); ++ if (!blen) ++ continue; ++ ++ /* matching heuristics additional to translate_ciphername above */ ++ if (blen == clen+4) { ++ char *cbc = os_strstr(buf, "CBC-"); ++ if (cbc) { ++ os_memmove(cbc, cbc+4, blen-(cbc+4-buf)+1); /*(w/ '\0')*/ ++ blen -= 4; ++ } ++ } ++ if (blen >= clen && os_memcmp(ciphers, buf, clen) == 0 ++ && (blen == clen ++ || (blen == clen+7 && os_memcmp(buf+clen, "-SHA256", 7)))) { ++ if (1 >= idsz - (nids + 1)) { ++ emsg(MSG_ERROR, ++ "error: too many ciphers during list expand"); ++ return 0; ++ } ++ ids[++nids] = *list; ++ break; ++ } ++ } ++ if (*list == 0) { ++ wpa_printf(MSG_ERROR, ++ "MTLS: unrecognized cipher: %.*s", (int)clen, ciphers); ++ return 0; ++ } ++ } while ((ciphers = next ? next+1 : NULL)); ++ ++ if (-1 == nids) return 1; /* empty list; no-op */ ++ ++ ids[++nids] = 0; /* terminate list */ ++ ++nids; ++ ++ return tls_mbedtls_set_ciphersuites(tls_conf, ids, nids); ++} ++ ++ ++__attribute_noinline__ ++static int tls_mbedtls_set_item(char **config_item, const char *item) ++{ ++ os_free(*config_item); ++ *config_item = NULL; ++ return item ? (*config_item = os_strdup(item)) != NULL : 1; ++} ++ ++ ++static int tls_connection_set_subject_match(struct tls_conf *tls_conf, ++ const struct tls_connection_params *params) ++{ ++ int rc = 1; ++ rc &= tls_mbedtls_set_item(&tls_conf->subject_match, ++ params->subject_match); ++ rc &= tls_mbedtls_set_item(&tls_conf->altsubject_match, ++ params->altsubject_match); ++ rc &= tls_mbedtls_set_item(&tls_conf->suffix_match, ++ params->suffix_match); ++ rc &= tls_mbedtls_set_item(&tls_conf->domain_match, ++ params->domain_match); ++ rc &= tls_mbedtls_set_item(&tls_conf->check_cert_subject, ++ params->check_cert_subject); ++ return rc; ++} ++ ++ ++/* duplicated in crypto_mbedtls.c:crypto_mbedtls_readfile()*/ ++__attribute_noinline__ ++static int tls_mbedtls_readfile(const char *path, u8 **buf, size_t *n) ++{ ++ #if 0 /* #ifdef MBEDTLS_FS_IO */ ++ /*(includes +1 for '\0' needed by mbedtls PEM parsing funcs)*/ ++ if (mbedtls_pk_load_file(path, (unsigned char **)buf, n) != 0) { ++ wpa_printf(MSG_ERROR, "error: mbedtls_pk_load_file %s", path); ++ return -1; ++ } ++ #else ++ /*(use os_readfile() so that we can use os_free() ++ *(if we use mbedtls_pk_load_file() above, macros prevent calling free() ++ * directly #if defined(OS_REJECT_C_LIB_FUNCTIONS) and calling os_free() ++ * on buf aborts in tests if buf not allocated via os_malloc())*/ ++ *buf = (u8 *)os_readfile(path, n); ++ if (!*buf) { ++ wpa_printf(MSG_ERROR, "error: os_readfile %s", path); ++ return -1; ++ } ++ u8 *buf0 = os_realloc(*buf, *n+1); ++ if (!buf0) { ++ bin_clear_free(*buf, *n); ++ *buf = NULL; ++ return -1; ++ } ++ buf0[(*n)++] = '\0'; ++ *buf = buf0; ++ #endif ++ return 0; ++} ++ ++ ++static int tls_mbedtls_set_crl(struct tls_conf *tls_conf, const u8 *data, size_t len) ++{ ++ /* do not use mbedtls_x509_crl_parse() on PEM unless it contains CRL */ ++ if (len && data[len-1] == '\0' ++ && NULL == os_strstr((const char *)data,"-----BEGIN X509 CRL-----") ++ && tls_mbedtls_data_is_pem(data)) ++ return 0; ++ ++ mbedtls_x509_crl crl; ++ mbedtls_x509_crl_init(&crl); ++ int rc = mbedtls_x509_crl_parse(&crl, data, len); ++ if (rc < 0) { ++ mbedtls_x509_crl_free(&crl); ++ return rc == MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ? 0 : rc; ++ } ++ ++ mbedtls_x509_crl *crl_new = os_malloc(sizeof(crl)); ++ if (crl_new == NULL) { ++ mbedtls_x509_crl_free(&crl); ++ return MBEDTLS_ERR_X509_ALLOC_FAILED; ++ } ++ os_memcpy(crl_new, &crl, sizeof(crl)); ++ ++ mbedtls_x509_crl *crl_old = tls_conf->crl; ++ tls_conf->crl = crl_new; ++ if (crl_old) { ++ mbedtls_x509_crl_free(crl_old); ++ os_free(crl_old); ++ } ++ return 0; ++} ++ ++ ++static int tls_mbedtls_set_ca(struct tls_conf *tls_conf, u8 *data, size_t len) ++{ ++ /* load crt struct onto stack and then copy into tls_conf in ++ * order to preserve existing tls_conf value if error occurs ++ * ++ * hostapd is not threaded, or else should allocate memory and swap in ++ * pointer reduce race condition. (If threaded, would also need to ++ * keep reference count of use to avoid freeing while still in use.) */ ++ ++ mbedtls_x509_crt crt; ++ mbedtls_x509_crt_init(&crt); ++ int rc = mbedtls_x509_crt_parse(&crt, data, len); ++ if (rc < 0) { ++ mbedtls_x509_crt_free(&crt); ++ return rc; ++ } ++ ++ mbedtls_x509_crt_free(&tls_conf->ca_cert); ++ os_memcpy(&tls_conf->ca_cert, &crt, sizeof(crt)); ++ return 0; ++} ++ ++ ++static int tls_mbedtls_set_ca_and_crl(struct tls_conf *tls_conf, const char *ca_cert_file) ++{ ++ size_t len; ++ u8 *data; ++ if (tls_mbedtls_readfile(ca_cert_file, &data, &len)) ++ return -1; ++ ++ int rc; ++ if (0 == (rc = tls_mbedtls_set_ca(tls_conf, data, len)) ++ && (!tls_mbedtls_data_is_pem(data) /*skip parse for CRL if not PEM*/ ++ || 0 == (rc = tls_mbedtls_set_crl(tls_conf, data, len)))) { ++ mbedtls_ssl_conf_ca_chain(&tls_conf->conf, ++ &tls_conf->ca_cert, ++ tls_conf->crl); ++ } ++ else { ++ elog(rc, __func__); ++ emsg(MSG_ERROR, ca_cert_file); ++ } ++ ++ forced_memzero(data, len); ++ os_free(data); ++ return rc; ++} ++ ++ ++static void tls_mbedtls_refresh_crl(void) ++{ ++ /* check for CRL refresh ++ * continue even if error occurs; continue with previous cert, CRL */ ++ unsigned int crl_reload_interval = tls_ctx_global.crl_reload_interval; ++ const char *ca_cert_file = tls_ctx_global.ca_cert_file; ++ if (!crl_reload_interval || !ca_cert_file) ++ return; ++ ++ struct os_reltime *previous = &tls_ctx_global.crl_reload_previous; ++ struct os_reltime now; ++ if (os_get_reltime(&now) != 0 ++ || !os_reltime_expired(&now, previous, crl_reload_interval)) ++ return; ++ ++ /* Note: modifying global state is not thread-safe ++ * if in use by existing connections ++ * ++ * src/utils/os.h does not provide a portable stat() ++ * or else it would be a good idea to check mtime and size, ++ * and avoid reloading if file has not changed */ ++ ++ if (tls_mbedtls_set_ca_and_crl(tls_ctx_global.tls_conf, ca_cert_file) == 0) ++ *previous = now; ++} ++ ++ ++static int tls_mbedtls_set_ca_cert(struct tls_conf *tls_conf, ++ const struct tls_connection_params *params) ++{ ++ if (params->ca_cert) { ++ if (os_strncmp(params->ca_cert, "probe://", 8) == 0) { ++ tls_conf->ca_cert_probe = 1; ++ tls_conf->has_ca_cert = 1; ++ return 0; ++ } ++ ++ if (os_strncmp(params->ca_cert, "hash://", 7) == 0) { ++ const char *pos = params->ca_cert + 7; ++ if (os_strncmp(pos, "server/sha256/", 14) != 0) { ++ emsg(MSG_ERROR, "unsupported ca_cert hash value"); ++ return -1; ++ } ++ pos += 14; ++ if (os_strlen(pos) != SHA256_DIGEST_LENGTH*2) { ++ emsg(MSG_ERROR, "unexpected ca_cert hash length"); ++ return -1; ++ } ++ if (hexstr2bin(pos, tls_conf->ca_cert_hash, ++ SHA256_DIGEST_LENGTH) < 0) { ++ emsg(MSG_ERROR, "invalid ca_cert hash value"); ++ return -1; ++ } ++ emsg(MSG_DEBUG, "checking only server certificate match"); ++ tls_conf->verify_depth0_only = 1; ++ tls_conf->has_ca_cert = 1; ++ return 0; ++ } ++ ++ if (tls_mbedtls_set_ca_and_crl(tls_conf, params->ca_cert) != 0) ++ return -1; ++ } ++ if (params->ca_cert_blob) { ++ size_t len = params->ca_cert_blob_len; ++ int is_pem = tls_mbedtls_data_is_pem(params->ca_cert_blob); ++ if (len && params->ca_cert_blob[len-1] != '\0' && is_pem) ++ ++len; /*(include '\0' in len for PEM)*/ ++ int ret = mbedtls_x509_crt_parse(&tls_conf->ca_cert, ++ params->ca_cert_blob, len); ++ if (ret != 0) { ++ elog(ret, "mbedtls_x509_crt_parse"); ++ return -1; ++ } ++ if (is_pem) { /*(ca_cert_blob in DER format contains ca cert only)*/ ++ ret = tls_mbedtls_set_crl(tls_conf, params->ca_cert_blob, len); ++ if (ret != 0) { ++ elog(ret, "mbedtls_x509_crl_parse"); ++ return -1; ++ } ++ } ++ } ++ ++ if (mbedtls_x509_time_is_future(&tls_conf->ca_cert.valid_from) ++ || mbedtls_x509_time_is_past(&tls_conf->ca_cert.valid_to)) { ++ emsg(MSG_WARNING, "ca_cert expired or not yet valid"); ++ if (params->ca_cert) ++ emsg(MSG_WARNING, params->ca_cert); ++ } ++ ++ tls_conf->has_ca_cert = 1; ++ return 0; ++} ++ ++ ++static int tls_mbedtls_set_certs(struct tls_conf *tls_conf, ++ const struct tls_connection_params *params) ++{ ++ int ret; ++ ++ if (params->ca_cert || params->ca_cert_blob) { ++ if (tls_mbedtls_set_ca_cert(tls_conf, params) != 0) ++ return -1; ++ } ++ else if (params->ca_path) { ++ emsg(MSG_INFO, "ca_path support not implemented"); ++ return -1; ++ } ++ ++ if (!tls_conf->has_ca_cert) ++ mbedtls_ssl_conf_authmode(&tls_conf->conf, MBEDTLS_SSL_VERIFY_NONE); ++ else { ++ /* Initial setting: REQUIRED for client, OPTIONAL for server ++ * (see also tls_connection_set_verify()) */ ++ tls_conf->verify_peer = (tls_ctx_global.tls_conf == NULL); ++ int authmode = tls_conf->verify_peer ++ ? MBEDTLS_SSL_VERIFY_REQUIRED ++ : MBEDTLS_SSL_VERIFY_OPTIONAL; ++ mbedtls_ssl_conf_authmode(&tls_conf->conf, authmode); ++ mbedtls_ssl_conf_ca_chain(&tls_conf->conf, ++ &tls_conf->ca_cert, ++ tls_conf->crl); ++ ++ if (!tls_connection_set_subject_match(tls_conf, params)) ++ return -1; ++ } ++ ++ if (params->client_cert2) /*(yes, server_cert2 in msg below)*/ ++ emsg(MSG_INFO, "server_cert2 support not implemented"); ++ ++ if (params->client_cert) { ++ size_t len; ++ u8 *data; ++ if (tls_mbedtls_readfile(params->client_cert, &data, &len)) ++ return -1; ++ ret = mbedtls_x509_crt_parse(&tls_conf->client_cert, data, len); ++ forced_memzero(data, len); ++ os_free(data); ++ } ++ if (params->client_cert_blob) { ++ size_t len = params->client_cert_blob_len; ++ if (len && params->client_cert_blob[len-1] != '\0' ++ && tls_mbedtls_data_is_pem(params->client_cert_blob)) ++ ++len; /*(include '\0' in len for PEM)*/ ++ ret = mbedtls_x509_crt_parse(&tls_conf->client_cert, ++ params->client_cert_blob, len); ++ } ++ if (params->client_cert || params->client_cert_blob) { ++ if (ret < 0) { ++ elog(ret, "mbedtls_x509_crt_parse"); ++ if (params->client_cert) ++ emsg(MSG_ERROR, params->client_cert); ++ return -1; ++ } ++ if (mbedtls_x509_time_is_future(&tls_conf->client_cert.valid_from) ++ || mbedtls_x509_time_is_past(&tls_conf->client_cert.valid_to)) { ++ emsg(MSG_WARNING, "cert expired or not yet valid"); ++ if (params->client_cert) ++ emsg(MSG_WARNING, params->client_cert); ++ } ++ tls_conf->has_client_cert = 1; ++ } ++ ++ if (params->private_key || params->private_key_blob) { ++ size_t len = params->private_key_blob_len; ++ u8 *data; ++ *(const u8 **)&data = params->private_key_blob; ++ if (len && data[len-1] != '\0' && tls_mbedtls_data_is_pem(data)) ++ ++len; /*(include '\0' in len for PEM)*/ ++ if (params->private_key ++ && tls_mbedtls_readfile(params->private_key, &data, &len)) { ++ return -1; ++ } ++ const char *pwd = params->private_key_passwd; ++ #if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++ ret = mbedtls_pk_parse_key(&tls_conf->private_key, ++ data, len, ++ (const unsigned char *)pwd, ++ pwd ? os_strlen(pwd) : 0, ++ mbedtls_ctr_drbg_random, ++ tls_ctx_global.ctr_drbg); ++ #else ++ ret = mbedtls_pk_parse_key(&tls_conf->private_key, ++ data, len, ++ (const unsigned char *)pwd, ++ pwd ? os_strlen(pwd) : 0); ++ #endif ++ if (params->private_key) { ++ forced_memzero(data, len); ++ os_free(data); ++ } ++ if (ret < 0) { ++ elog(ret, "mbedtls_pk_parse_key"); ++ return -1; ++ } ++ tls_conf->has_private_key = 1; ++ } ++ ++ if (tls_conf->has_client_cert && tls_conf->has_private_key) { ++ ret = mbedtls_ssl_conf_own_cert( ++ &tls_conf->conf, &tls_conf->client_cert, &tls_conf->private_key); ++ if (ret < 0) { ++ elog(ret, "mbedtls_ssl_conf_own_cert"); ++ return -1; ++ } ++ } ++ ++ return 0; ++} ++ ++ ++/* mbedtls_x509_crt_profile_suiteb plus rsa_min_bitlen 2048 */ ++/* (reference: see also mbedtls_x509_crt_profile_next) */ ++/* ??? should permit SHA-512, too, and additional curves ??? */ ++static const mbedtls_x509_crt_profile tls_mbedtls_crt_profile_suiteb128 = ++{ ++ /* Only SHA-256 and 384 */ ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) | ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ), ++ /* Only ECDSA */ ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_PK_ECDSA ) | ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_PK_ECKEY ), ++#if defined(MBEDTLS_ECP_C) ++ /* Only NIST P-256 and P-384 */ ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256R1 ) | ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP384R1 ), ++#else ++ 0, ++#endif ++ 2048, ++}; ++ ++ ++/* stricter than mbedtls_x509_crt_profile_suiteb */ ++/* (reference: see also mbedtls_x509_crt_profile_next) */ ++/* ??? should permit SHA-512, too, and additional curves ??? */ ++static const mbedtls_x509_crt_profile tls_mbedtls_crt_profile_suiteb192 = ++{ ++ /* Only SHA-384 */ ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ), ++ /* Only ECDSA */ ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_PK_ECDSA ) | ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_PK_ECKEY ), ++#if defined(MBEDTLS_ECP_C) ++ /* Only NIST P-384 */ ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP384R1 ), ++#else ++ 0, ++#endif ++ 3072, ++}; ++ ++ ++/* stricter than mbedtls_x509_crt_profile_suiteb except allow any PK alg */ ++/* (reference: see also mbedtls_x509_crt_profile_next) */ ++/* ??? should permit SHA-512, too, and additional curves ??? */ ++static const mbedtls_x509_crt_profile tls_mbedtls_crt_profile_suiteb192_anypk = ++{ ++ /* Only SHA-384 */ ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ), ++ 0xFFFFFFF, /* Any PK alg */ ++#if defined(MBEDTLS_ECP_C) ++ /* Only NIST P-384 */ ++ MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP384R1 ), ++#else ++ 0, ++#endif ++ 3072, ++}; ++ ++ ++static int tls_mbedtls_set_params(struct tls_conf *tls_conf, ++ const struct tls_connection_params *params) ++{ ++ tls_conf->flags = params->flags; ++ ++ if (tls_conf->flags & TLS_CONN_REQUIRE_OCSP_ALL) { ++ emsg(MSG_INFO, "ocsp=3 not supported"); ++ return -1; ++ } ++ ++ if (tls_conf->flags & TLS_CONN_REQUIRE_OCSP) { ++ emsg(MSG_INFO, "ocsp not supported"); ++ return -1; ++ } ++ ++ int suiteb128 = 0; ++ int suiteb192 = 0; ++ if (params->openssl_ciphers) { ++ if (os_strcmp(params->openssl_ciphers, "SUITEB192") == 0) { ++ suiteb192 = 1; ++ tls_conf->flags |= TLS_CONN_SUITEB; ++ } ++ if (os_strcmp(params->openssl_ciphers, "SUITEB128") == 0) { ++ suiteb128 = 1; ++ tls_conf->flags |= TLS_CONN_SUITEB; ++ } ++ } ++ ++ int ret = mbedtls_ssl_config_defaults( ++ &tls_conf->conf, tls_ctx_global.tls_conf ? MBEDTLS_SSL_IS_SERVER ++ : MBEDTLS_SSL_IS_CLIENT, ++ MBEDTLS_SSL_TRANSPORT_STREAM, ++ (tls_conf->flags & TLS_CONN_SUITEB) ? MBEDTLS_SSL_PRESET_SUITEB ++ : MBEDTLS_SSL_PRESET_DEFAULT); ++ if (ret != 0) { ++ elog(ret, "mbedtls_ssl_config_defaults"); ++ return -1; ++ } ++ ++ if (suiteb128) { ++ mbedtls_ssl_conf_cert_profile(&tls_conf->conf, ++ &tls_mbedtls_crt_profile_suiteb128); ++ mbedtls_ssl_conf_dhm_min_bitlen(&tls_conf->conf, 2048); ++ } ++ else if (suiteb192) { ++ mbedtls_ssl_conf_cert_profile(&tls_conf->conf, ++ &tls_mbedtls_crt_profile_suiteb192); ++ mbedtls_ssl_conf_dhm_min_bitlen(&tls_conf->conf, 3072); ++ } ++ else if (tls_conf->flags & TLS_CONN_SUITEB) { ++ /* treat as suiteb192 while allowing any PK algorithm */ ++ mbedtls_ssl_conf_cert_profile(&tls_conf->conf, ++ &tls_mbedtls_crt_profile_suiteb192_anypk); ++ mbedtls_ssl_conf_dhm_min_bitlen(&tls_conf->conf, 3072); ++ } ++ ++ tls_mbedtls_set_allowed_tls_vers(tls_conf, &tls_conf->conf); ++ ret = tls_mbedtls_set_certs(tls_conf, params); ++ if (ret != 0) ++ return -1; ++ ++ if (params->dh_file ++ && !tls_mbedtls_set_dhparams(tls_conf, params->dh_file)) { ++ return -1; ++ } ++ ++ if (params->openssl_ecdh_curves ++ && !tls_mbedtls_set_curves(tls_conf, params->openssl_ecdh_curves)) { ++ return -1; ++ } ++ ++ if (params->openssl_ciphers) { ++ if (!tls_mbedtls_set_ciphers(tls_conf, params->openssl_ciphers)) ++ return -1; ++ } ++ else if (tls_conf->flags & TLS_CONN_SUITEB) { ++ /* special-case a select set of ciphers for hwsim tests */ ++ if (!tls_mbedtls_set_ciphers(tls_conf, ++ (tls_conf->flags & TLS_CONN_SUITEB_NO_ECDH) ++ ? "DHE-RSA-AES256-GCM-SHA384" ++ : "ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384")) ++ return -1; ++ } ++ ++ return 0; ++} ++ ++ ++int tls_connection_set_params(void *tls_ctx, struct tls_connection *conn, ++ const struct tls_connection_params *params) ++{ ++ if (conn == NULL || params == NULL) ++ return -1; ++ ++ tls_conf_deinit(conn->tls_conf); ++ struct tls_conf *tls_conf = conn->tls_conf = tls_conf_init(tls_ctx); ++ if (tls_conf == NULL) ++ return -1; ++ ++ if (tls_ctx_global.tls_conf) { ++ tls_conf->check_crl = tls_ctx_global.tls_conf->check_crl; ++ tls_conf->check_crl_strict = tls_ctx_global.tls_conf->check_crl_strict; ++ /*(tls_openssl.c inherits check_cert_subject from global conf)*/ ++ if (tls_ctx_global.tls_conf->check_cert_subject) { ++ tls_conf->check_cert_subject = ++ os_strdup(tls_ctx_global.tls_conf->check_cert_subject); ++ if (tls_conf->check_cert_subject == NULL) ++ return -1; ++ } ++ } ++ ++ if (tls_mbedtls_set_params(tls_conf, params) != 0) ++ return -1; ++ conn->verify_peer = tls_conf->verify_peer; ++ ++ return tls_mbedtls_ssl_setup(conn); ++} ++ ++ ++#ifdef TLS_MBEDTLS_SESSION_TICKETS ++ ++static int tls_mbedtls_clienthello_session_ticket_prep (struct tls_connection *conn, ++ const u8 *data, size_t len) ++{ ++ if (conn->tls_conf->flags & TLS_CONN_DISABLE_SESSION_TICKET) ++ return -1; ++ if (conn->clienthello_session_ticket) ++ tls_connection_deinit_clienthello_session_ticket(conn); ++ if (len) { ++ conn->clienthello_session_ticket = mbedtls_calloc(1, len); ++ if (conn->clienthello_session_ticket == NULL) ++ return -1; ++ conn->clienthello_session_ticket_len = len; ++ os_memcpy(conn->clienthello_session_ticket, data, len); ++ } ++ return 0; ++} ++ ++ ++static void tls_mbedtls_clienthello_session_ticket_set (struct tls_connection *conn) ++{ ++ mbedtls_ssl_session *sess = conn->ssl.MBEDTLS_PRIVATE(session_negotiate); ++ if (sess->MBEDTLS_PRIVATE(ticket)) { ++ mbedtls_platform_zeroize(sess->MBEDTLS_PRIVATE(ticket), ++ sess->MBEDTLS_PRIVATE(ticket_len)); ++ mbedtls_free(sess->MBEDTLS_PRIVATE(ticket)); ++ } ++ sess->MBEDTLS_PRIVATE(ticket) = conn->clienthello_session_ticket; ++ sess->MBEDTLS_PRIVATE(ticket_len) = conn->clienthello_session_ticket_len; ++ sess->MBEDTLS_PRIVATE(ticket_lifetime) = 86400;/* XXX: can hint be 0? */ ++ ++ conn->clienthello_session_ticket = NULL; ++ conn->clienthello_session_ticket_len = 0; ++} ++ ++ ++static int tls_mbedtls_ssl_ticket_write(void *p_ticket, ++ const mbedtls_ssl_session *session, ++ unsigned char *start, ++ const unsigned char *end, ++ size_t *tlen, ++ uint32_t *lifetime) ++{ ++ struct tls_connection *conn = p_ticket; ++ if (conn && conn->session_ticket_cb) { ++ /* see tls_mbedtls_clienthello_session_ticket_prep() */ ++ /* see tls_mbedtls_clienthello_session_ticket_set() */ ++ return 0; ++ } ++ ++ return mbedtls_ssl_ticket_write(&tls_ctx_global.ticket_ctx, ++ session, start, end, tlen, lifetime); ++} ++ ++ ++static int tls_mbedtls_ssl_ticket_parse(void *p_ticket, ++ mbedtls_ssl_session *session, ++ unsigned char *buf, ++ size_t len) ++{ ++ /* XXX: TODO: not implemented in client; ++ * mbedtls_ssl_conf_session_tickets_cb() callbacks only for TLS server*/ ++ ++ if (len == 0) ++ return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; ++ ++ struct tls_connection *conn = p_ticket; ++ if (conn && conn->session_ticket_cb) { ++ /* XXX: have random and secret been initialized yet? ++ * or must keys first be exported? ++ * EAP-FAST uses all args, EAP-TEAP only uses secret */ ++ struct tls_random data; ++ if (tls_connection_get_random(NULL, conn, &data) != 0) ++ return MBEDTLS_ERR_SSL_INTERNAL_ERROR; ++ int ret = ++ conn->session_ticket_cb(conn->session_ticket_cb_ctx, ++ buf, len, ++ data.client_random, ++ data.server_random, ++ conn->expkey_secret); ++ if (ret == 1) { ++ conn->resumed = 1; ++ return 0; ++ } ++ emsg(MSG_ERROR, "EAP session ticket ext not implemented"); ++ return MBEDTLS_ERR_SSL_INVALID_MAC; ++ /*(non-zero return used for mbedtls debug logging)*/ ++ } ++ ++ /* XXX: TODO always use tls_mbedtls_ssl_ticket_parse() for callback? */ ++ int rc = mbedtls_ssl_ticket_parse(&tls_ctx_global.ticket_ctx, ++ session, buf, len); ++ if (conn) ++ conn->resumed = (rc == 0); ++ return rc; ++} ++ ++#endif /* TLS_MBEDTLS_SESSION_TICKETS */ ++ ++ ++__attribute_cold__ ++int tls_global_set_params(void *tls_ctx, ++ const struct tls_connection_params *params) ++{ ++ /* XXX: why might global_set_params be called more than once? */ ++ if (tls_ctx_global.tls_conf) ++ tls_conf_deinit(tls_ctx_global.tls_conf); ++ tls_ctx_global.tls_conf = tls_conf_init(tls_ctx); ++ if (tls_ctx_global.tls_conf == NULL) ++ return -1; ++ ++ #ifdef MBEDTLS_SSL_SESSION_TICKETS ++ #ifdef MBEDTLS_SSL_TICKET_C ++ if (!(params->flags & TLS_CONN_DISABLE_SESSION_TICKET)) ++ #ifdef TLS_MBEDTLS_SESSION_TICKETS ++ mbedtls_ssl_conf_session_tickets_cb(&tls_ctx_global.tls_conf->conf, ++ tls_mbedtls_ssl_ticket_write, ++ tls_mbedtls_ssl_ticket_parse, ++ NULL); ++ #else ++ mbedtls_ssl_conf_session_tickets_cb(&tls_ctx_global.tls_conf->conf, ++ mbedtls_ssl_ticket_write, ++ mbedtls_ssl_ticket_parse, ++ &tls_ctx_global.ticket_ctx); ++ #endif ++ #endif ++ #endif ++ ++ os_free(tls_ctx_global.ocsp_stapling_response); ++ tls_ctx_global.ocsp_stapling_response = NULL; ++ if (params->ocsp_stapling_response) ++ tls_ctx_global.ocsp_stapling_response = ++ os_strdup(params->ocsp_stapling_response); ++ ++ os_free(tls_ctx_global.ca_cert_file); ++ tls_ctx_global.ca_cert_file = NULL; ++ if (params->ca_cert) ++ tls_ctx_global.ca_cert_file = os_strdup(params->ca_cert); ++ return tls_mbedtls_set_params(tls_ctx_global.tls_conf, params); ++} ++ ++ ++int tls_global_set_verify(void *tls_ctx, int check_crl, int strict) ++{ ++ tls_ctx_global.tls_conf->check_crl = check_crl; ++ tls_ctx_global.tls_conf->check_crl_strict = strict; /*(time checks)*/ ++ return 0; ++} ++ ++ ++int tls_connection_set_verify(void *tls_ctx, struct tls_connection *conn, ++ int verify_peer, unsigned int flags, ++ const u8 *session_ctx, size_t session_ctx_len) ++{ ++ /*(EAP server-side calls this from eap_server_tls_ssl_init())*/ ++ if (conn == NULL) ++ return -1; ++ ++ conn->tls_conf->flags |= flags;/* TODO: reprocess flags, if necessary */ ++ ++ int authmode; ++ switch (verify_peer) { ++ case 2: authmode = MBEDTLS_SSL_VERIFY_OPTIONAL; break;/*(eap_teap_init())*/ ++ case 1: authmode = MBEDTLS_SSL_VERIFY_REQUIRED; break; ++ default: authmode = MBEDTLS_SSL_VERIFY_NONE; break; ++ } ++ mbedtls_ssl_set_hs_authmode(&conn->ssl, authmode); ++ ++ if ((conn->verify_peer = (authmode != MBEDTLS_SSL_VERIFY_NONE))) ++ mbedtls_ssl_set_verify(&conn->ssl, tls_mbedtls_verify_cb, conn); ++ else ++ mbedtls_ssl_set_verify(&conn->ssl, NULL, NULL); ++ ++ return 0; ++} ++ ++ ++#if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++static void tls_connection_export_keys_cb( ++ void *p_expkey, mbedtls_ssl_key_export_type secret_type, ++ const unsigned char *secret, size_t secret_len, ++ const unsigned char client_random[MBEDTLS_EXPKEY_RAND_LEN], ++ const unsigned char server_random[MBEDTLS_EXPKEY_RAND_LEN], ++ mbedtls_tls_prf_types tls_prf_type) ++{ ++ struct tls_connection *conn = p_expkey; ++ conn->tls_prf_type = tls_prf_type; ++ if (!tls_prf_type) ++ return; ++ if (secret_len > sizeof(conn->expkey_secret)) { ++ emsg(MSG_ERROR, "tls_connection_export_keys_cb secret too long"); ++ conn->tls_prf_type = MBEDTLS_SSL_TLS_PRF_NONE; /* 0 */ ++ return; ++ } ++ conn->expkey_secret_len = secret_len; ++ os_memcpy(conn->expkey_secret, secret, secret_len); ++ os_memcpy(conn->expkey_randbytes, ++ client_random, MBEDTLS_EXPKEY_RAND_LEN); ++ os_memcpy(conn->expkey_randbytes + MBEDTLS_EXPKEY_RAND_LEN, ++ server_random, MBEDTLS_EXPKEY_RAND_LEN); ++} ++#elif MBEDTLS_VERSION_NUMBER >= 0x02120000 /* mbedtls 2.18.0 */ ++static int tls_connection_export_keys_cb( ++ void *p_expkey, ++ const unsigned char *ms, ++ const unsigned char *kb, ++ size_t maclen, ++ size_t keylen, ++ size_t ivlen, ++ const unsigned char client_random[MBEDTLS_EXPKEY_RAND_LEN], ++ const unsigned char server_random[MBEDTLS_EXPKEY_RAND_LEN], ++ mbedtls_tls_prf_types tls_prf_type ) ++{ ++ struct tls_connection *conn = p_expkey; ++ conn->tls_prf_type = tls_prf_type; ++ if (!tls_prf_type) ++ return -1; /*(return value ignored by mbedtls)*/ ++ conn->expkey_keyblock_size = maclen + keylen + ivlen; ++ conn->expkey_secret_len = MBEDTLS_EXPKEY_FIXED_SECRET_LEN; ++ os_memcpy(conn->expkey_secret, ms, MBEDTLS_EXPKEY_FIXED_SECRET_LEN); ++ os_memcpy(conn->expkey_randbytes, ++ client_random, MBEDTLS_EXPKEY_RAND_LEN); ++ os_memcpy(conn->expkey_randbytes + MBEDTLS_EXPKEY_RAND_LEN, ++ server_random, MBEDTLS_EXPKEY_RAND_LEN); ++ return 0; ++} ++#endif ++ ++ ++int tls_connection_get_random(void *tls_ctx, struct tls_connection *conn, ++ struct tls_random *data) ++{ ++ if (!conn || !conn->tls_prf_type) ++ return -1; ++ data->client_random = conn->expkey_randbytes; ++ data->client_random_len = MBEDTLS_EXPKEY_RAND_LEN; ++ data->server_random = conn->expkey_randbytes + MBEDTLS_EXPKEY_RAND_LEN; ++ data->server_random_len = MBEDTLS_EXPKEY_RAND_LEN; ++ return 0; ++} ++ ++ ++int tls_connection_export_key(void *tls_ctx, struct tls_connection *conn, ++ const char *label, const u8 *context, ++ size_t context_len, u8 *out, size_t out_len) ++{ ++ /* (EAP-PEAP EAP-TLS EAP-TTLS) */ ++ #if MBEDTLS_VERSION_NUMBER >= 0x02120000 /* mbedtls 2.18.0 */ ++ return (conn && conn->established && conn->tls_prf_type) ++ ? mbedtls_ssl_tls_prf(conn->tls_prf_type, ++ conn->expkey_secret, conn->expkey_secret_len, label, ++ conn->expkey_randbytes, ++ sizeof(conn->expkey_randbytes), out, out_len) ++ : -1; ++ #else ++ /* not implemented here for mbedtls < 2.18.0 */ ++ return -1; ++ #endif ++} ++ ++ ++#ifdef TLS_MBEDTLS_EAP_FAST ++ ++#if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++/* keyblock size info is not exposed in mbed TLS 3.0.0 */ ++/* extracted from mbedtls library/ssl_tls.c:ssl_tls12_populate_transform() */ ++#include ++#include ++static size_t tls_mbedtls_ssl_keyblock_size (mbedtls_ssl_context *ssl) ++{ ++ #if !defined(MBEDTLS_USE_PSA_CRYPTO) /* XXX: (not extracted for PSA crypto) */ ++ #if defined(MBEDTLS_SSL_PROTO_TLS1_3) ++ if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) ++ return 0; /* (calculation not extracted) */ ++ #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ ++ ++ int ciphersuite = mbedtls_ssl_get_ciphersuite_id_from_ssl(ssl); ++ const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ++ mbedtls_ssl_ciphersuite_from_id(ciphersuite); ++ if (ciphersuite_info == NULL) ++ return 0; ++ ++ const mbedtls_cipher_info_t *cipher_info = ++ mbedtls_cipher_info_from_type(ciphersuite_info->MBEDTLS_PRIVATE(cipher)); ++ if (cipher_info == NULL) ++ return 0; ++ ++ #if MBEDTLS_VERSION_NUMBER >= 0x03010000 /* mbedtls 3.1.0 */ ++ size_t keylen = mbedtls_cipher_info_get_key_bitlen(cipher_info) / 8; ++ mbedtls_cipher_mode_t mode = mbedtls_cipher_info_get_mode(cipher_info); ++ #else ++ size_t keylen = cipher_info->MBEDTLS_PRIVATE(key_bitlen) / 8; ++ mbedtls_cipher_mode_t mode = cipher_info->MBEDTLS_PRIVATE(mode); ++ #endif ++ #if defined(MBEDTLS_GCM_C) || \ ++ defined(MBEDTLS_CCM_C) || \ ++ defined(MBEDTLS_CHACHAPOLY_C) ++ if (mode == MBEDTLS_MODE_GCM || mode == MBEDTLS_MODE_CCM) ++ return keylen + 4; ++ else if (mode == MBEDTLS_MODE_CHACHAPOLY) ++ return keylen + 12; ++ else ++ #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */ ++ #if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC) ++ { ++ const mbedtls_md_info_t *md_info = ++ mbedtls_md_info_from_type(ciphersuite_info->MBEDTLS_PRIVATE(mac)); ++ if (md_info == NULL) ++ return 0; ++ size_t mac_key_len = mbedtls_md_get_size(md_info); ++ size_t ivlen = mbedtls_cipher_info_get_iv_size(cipher_info); ++ return keylen + mac_key_len + ivlen; ++ } ++ #endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */ ++ #endif /* !MBEDTLS_USE_PSA_CRYPTO *//* (not extracted for PSA crypto) */ ++ return 0; ++} ++#endif /* MBEDTLS_VERSION_NUMBER >= 0x03000000 *//* mbedtls 3.0.0 */ ++ ++ ++int tls_connection_get_eap_fast_key(void *tls_ctx, struct tls_connection *conn, ++ u8 *out, size_t out_len) ++{ ++ /* XXX: has export keys callback been run? */ ++ if (!conn || !conn->tls_prf_type) ++ return -1; ++ ++ #if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++ conn->expkey_keyblock_size = tls_mbedtls_ssl_keyblock_size(&conn->ssl); ++ if (conn->expkey_keyblock_size == 0) ++ return -1; ++ #endif ++ size_t skip = conn->expkey_keyblock_size * 2; ++ unsigned char *tmp_out = os_malloc(skip + out_len); ++ if (!tmp_out) ++ return -1; ++ ++ /* server_random and then client_random */ ++ unsigned char seed[MBEDTLS_EXPKEY_RAND_LEN*2]; ++ os_memcpy(seed, conn->expkey_randbytes + MBEDTLS_EXPKEY_RAND_LEN, ++ MBEDTLS_EXPKEY_RAND_LEN); ++ os_memcpy(seed + MBEDTLS_EXPKEY_RAND_LEN, conn->expkey_randbytes, ++ MBEDTLS_EXPKEY_RAND_LEN); ++ ++ #if MBEDTLS_VERSION_NUMBER >= 0x02120000 /* mbedtls 2.18.0 */ ++ int ret = mbedtls_ssl_tls_prf(conn->tls_prf_type, ++ conn->expkey_secret, conn->expkey_secret_len, ++ "key expansion", seed, sizeof(seed), ++ tmp_out, skip + out_len); ++ if (ret == 0) ++ os_memcpy(out, tmp_out + skip, out_len); ++ #else ++ int ret = -1; /*(not reached if not impl; return -1 at top of func)*/ ++ #endif ++ ++ bin_clear_free(tmp_out, skip + out_len); ++ forced_memzero(seed, sizeof(seed)); ++ return ret; ++} ++ ++#endif /* TLS_MBEDTLS_EAP_FAST */ ++ ++ ++__attribute_cold__ ++static void tls_mbedtls_suiteb_handshake_alert (struct tls_connection *conn) ++{ ++ /* tests/hwsim/test_suite_b.py test_suite_b_192_rsa_insufficient_dh */ ++ if (!(conn->tls_conf->flags & TLS_CONN_SUITEB)) ++ return; ++ if (tls_ctx_global.tls_conf) /*(is server; want issue event on client)*/ ++ return; ++ #if 0 ++ /*(info not available on client; ++ * mbed TLS library enforces dhm min bitlen in ServerKeyExchange)*/ ++ if (MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 == ++ #if MBEDTLS_VERSION_NUMBER < 0x03020000 /* mbedtls 3.2.0 */ ++ mbedtls_ssl_get_ciphersuite_id_from_ssl(&conn->ssl) ++ #else ++ mbedtls_ssl_get_ciphersuite_id( ++ mbedtls_ssl_get_ciphersuite(&conn->ssl)) ++ #endif ++ && mbedtls_mpi_size(&conn->tls_conf->conf.MBEDTLS_PRIVATE(dhm_P)) ++ < 384 /*(3072/8)*/) ++ #endif ++ { ++ struct tls_config *init_conf = &tls_ctx_global.init_conf; ++ if (init_conf->event_cb) { ++ union tls_event_data ev; ++ os_memset(&ev, 0, sizeof(ev)); ++ ev.alert.is_local = 1; ++ ev.alert.type = "fatal"; ++ /*"internal error" string for tests/hwsim/test_suiteb.py */ ++ ev.alert.description = "internal error: handshake failure"; ++ /*ev.alert.description = "insufficient security";*/ ++ init_conf->event_cb(init_conf->cb_ctx, TLS_ALERT, &ev); ++ } ++ } ++} ++ ++ ++struct wpabuf * tls_connection_handshake(void *tls_ctx, ++ struct tls_connection *conn, ++ const struct wpabuf *in_data, ++ struct wpabuf **appl_data) ++{ ++ if (appl_data) ++ *appl_data = NULL; ++ ++ if (in_data && wpabuf_len(in_data)) { ++ /*(unsure why tls_gnutls.c discards buffer contents; skip here)*/ ++ if (conn->pull_buf && 0) /* disable; appears unwise */ ++ tls_pull_buf_discard(conn, __func__); ++ if (!tls_pull_buf_append(conn, in_data)) ++ return NULL; ++ } ++ ++ if (conn->tls_conf == NULL) { ++ struct tls_connection_params params; ++ os_memset(¶ms, 0, sizeof(params)); ++ params.openssl_ciphers = ++ tls_ctx_global.init_conf.openssl_ciphers; ++ params.flags = tls_ctx_global.tls_conf->flags; ++ if (tls_connection_set_params(tls_ctx, conn, ¶ms) != 0) ++ return NULL; ++ } ++ ++ if (conn->verify_peer) /*(call here might be redundant; nbd)*/ ++ mbedtls_ssl_set_verify(&conn->ssl, tls_mbedtls_verify_cb, conn); ++ ++ #ifdef TLS_MBEDTLS_SESSION_TICKETS ++ if (conn->clienthello_session_ticket) ++ /*(starting handshake for EAP-FAST and EAP-TEAP)*/ ++ tls_mbedtls_clienthello_session_ticket_set(conn); ++ ++ /* (not thread-safe due to need to set userdata 'conn' for callback) */ ++ /* (unable to use mbedtls_ssl_set_user_data_p() with mbedtls 3.2.0+ ++ * since ticket write and parse callbacks take (mbedtls_ssl_session *) ++ * param instead of (mbedtls_ssl_context *) param) */ ++ if (conn->tls_conf->flags & TLS_CONN_DISABLE_SESSION_TICKET) ++ mbedtls_ssl_conf_session_tickets_cb(&conn->tls_conf->conf, ++ NULL, NULL, NULL); ++ else ++ mbedtls_ssl_conf_session_tickets_cb(&conn->tls_conf->conf, ++ tls_mbedtls_ssl_ticket_write, ++ tls_mbedtls_ssl_ticket_parse, ++ conn); ++ #endif ++ ++ #if MBEDTLS_VERSION_NUMBER >= 0x03020000 /* mbedtls 3.2.0 */ ++ int ret = mbedtls_ssl_handshake(&conn->ssl); ++ #else ++ int ret = 0; ++ while (conn->ssl.MBEDTLS_PRIVATE(state) != MBEDTLS_SSL_HANDSHAKE_OVER) { ++ ret = mbedtls_ssl_handshake_step(&conn->ssl); ++ if (ret != 0) ++ break; ++ } ++ #endif ++ ++ #ifdef TLS_MBEDTLS_SESSION_TICKETS ++ mbedtls_ssl_conf_session_tickets_cb(&conn->tls_conf->conf, ++ tls_mbedtls_ssl_ticket_write, ++ tls_mbedtls_ssl_ticket_parse, ++ NULL); ++ #endif ++ ++ switch (ret) { ++ case 0: ++ conn->established = 1; ++ if (conn->push_buf == NULL) ++ /* Need to return something to get final TLS ACK. */ ++ conn->push_buf = wpabuf_alloc(0); ++ ++ if (appl_data /*&& conn->pull_buf && wpabuf_len(conn->pull_buf)*/) ++ *appl_data = NULL; /* RFE: check for application data */ ++ break; ++ case MBEDTLS_ERR_SSL_WANT_WRITE: ++ case MBEDTLS_ERR_SSL_WANT_READ: ++ case MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS: ++ case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS: ++ if (tls_ctx_global.tls_conf /*(is server)*/ ++ && conn->established && conn->push_buf == NULL) ++ /* Need to return something to trigger completion of EAP-TLS. */ ++ conn->push_buf = wpabuf_alloc(0); ++ break; ++ default: ++ ++conn->failed; ++ switch (ret) { ++ case MBEDTLS_ERR_SSL_CLIENT_RECONNECT: ++ case MBEDTLS_ERR_NET_CONN_RESET: ++ case MBEDTLS_ERR_NET_SEND_FAILED: ++ ++conn->write_alerts; ++ break; ++ #if MBEDTLS_VERSION_NUMBER >= 0x03000000 /* mbedtls 3.0.0 */ ++ case MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE: ++ #else ++ case MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE: ++ #endif ++ tls_mbedtls_suiteb_handshake_alert(conn); ++ /* fall through */ ++ case MBEDTLS_ERR_NET_RECV_FAILED: ++ case MBEDTLS_ERR_SSL_CONN_EOF: ++ case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY: ++ case MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE: ++ ++conn->read_alerts; ++ break; ++ default: ++ break; ++ } ++ ++ ilog(ret, "mbedtls_ssl_handshake"); ++ break; ++ } ++ ++ struct wpabuf *out_data = conn->push_buf; ++ conn->push_buf = NULL; ++ return out_data; ++} ++ ++ ++struct wpabuf * tls_connection_server_handshake(void *tls_ctx, ++ struct tls_connection *conn, ++ const struct wpabuf *in_data, ++ struct wpabuf **appl_data) ++{ ++ conn->is_server = 1; ++ return tls_connection_handshake(tls_ctx, conn, in_data, appl_data); ++} ++ ++ ++struct wpabuf * tls_connection_encrypt(void *tls_ctx, ++ struct tls_connection *conn, ++ const struct wpabuf *in_data) ++{ ++ int res = mbedtls_ssl_write(&conn->ssl, ++ wpabuf_head_u8(in_data), wpabuf_len(in_data)); ++ if (res < 0) { ++ elog(res, "mbedtls_ssl_write"); ++ return NULL; ++ } ++ ++ struct wpabuf *buf = conn->push_buf; ++ conn->push_buf = NULL; ++ return buf; ++} ++ ++ ++struct wpabuf * tls_connection_decrypt(void *tls_ctx, ++ struct tls_connection *conn, ++ const struct wpabuf *in_data) ++{ ++ int res; ++ struct wpabuf *out; ++ ++ /*assert(in_data != NULL);*/ ++ if (!tls_pull_buf_append(conn, in_data)) ++ return NULL; ++ ++ #if defined(MBEDTLS_ZLIB_SUPPORT) /* removed in mbedtls 3.x */ ++ /* Add extra buffer space to handle the possibility of decrypted ++ * data being longer than input data due to TLS compression. */ ++ out = wpabuf_alloc((wpabuf_len(in_data) + 500) * 3); ++ #else /* TLS compression is disabled in mbedtls 3.x */ ++ out = wpabuf_alloc(wpabuf_len(in_data)); ++ #endif ++ if (out == NULL) ++ return NULL; ++ ++ res = mbedtls_ssl_read(&conn->ssl, wpabuf_mhead(out), wpabuf_size(out)); ++ if (res < 0) { ++ #if 1 /*(seems like a different error if wpabuf_len(in_data) == 0)*/ ++ if (res == MBEDTLS_ERR_SSL_WANT_READ) ++ return out; ++ #endif ++ elog(res, "mbedtls_ssl_read"); ++ wpabuf_free(out); ++ return NULL; ++ } ++ wpabuf_put(out, res); ++ ++ return out; ++} ++ ++ ++int tls_connection_resumed(void *tls_ctx, struct tls_connection *conn) ++{ ++ /* XXX: might need to detect if session resumed from TLS session ticket ++ * even if not special session ticket handling for EAP-FAST, EAP-TEAP */ ++ /* (?ssl->handshake->resume during session ticket validation?) */ ++ return conn && conn->resumed; ++} ++ ++ ++#ifdef TLS_MBEDTLS_EAP_FAST ++int tls_connection_set_cipher_list(void *tls_ctx, struct tls_connection *conn, ++ u8 *ciphers) ++{ ++ /* ciphers is list of TLS_CIPHER_* from hostap/src/crypto/tls.h */ ++ int ids[7]; ++ const int idsz = (int)sizeof(ids); ++ int nids = -1, id; ++ for ( ; *ciphers != TLS_CIPHER_NONE; ++ciphers) { ++ switch (*ciphers) { ++ case TLS_CIPHER_RC4_SHA: ++ #ifdef MBEDTLS_TLS_RSA_WITH_RC4_128_SHA ++ id = MBEDTLS_TLS_RSA_WITH_RC4_128_SHA; ++ break; ++ #else ++ continue; /*(not supported in mbedtls 3.x; ignore)*/ ++ #endif ++ case TLS_CIPHER_AES128_SHA: ++ id = MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA; ++ break; ++ case TLS_CIPHER_RSA_DHE_AES128_SHA: ++ id = MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA; ++ break; ++ case TLS_CIPHER_ANON_DH_AES128_SHA: ++ continue; /*(not supported in mbedtls; ignore)*/ ++ case TLS_CIPHER_RSA_DHE_AES256_SHA: ++ id = MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA; ++ break; ++ case TLS_CIPHER_AES256_SHA: ++ id = MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA; ++ break; ++ default: ++ return -1; /* should not happen */ ++ } ++ if (++nids == idsz) ++ return -1; /* should not happen */ ++ ids[nids] = id; ++ } ++ if (nids < 0) ++ return 0; /* nothing to do */ ++ if (++nids == idsz) ++ return -1; /* should not happen */ ++ ids[nids] = 0; /* terminate list */ ++ ++nids; ++ ++ return tls_mbedtls_set_ciphersuites(conn->tls_conf, ids, nids) ? 0 : -1; ++} ++#endif ++ ++ ++int tls_get_version(void *ssl_ctx, struct tls_connection *conn, ++ char *buf, size_t buflen) ++{ ++ if (conn == NULL) ++ return -1; ++ os_strlcpy(buf, mbedtls_ssl_get_version(&conn->ssl), buflen); ++ return buf[0] != 'u' ? 0 : -1; /*(-1 if "unknown")*/ ++} ++ ++ ++#ifdef TLS_MBEDTLS_EAP_TEAP ++u16 tls_connection_get_cipher_suite(struct tls_connection *conn) ++{ ++ if (conn == NULL) ++ return 0; ++ return (u16)mbedtls_ssl_get_ciphersuite_id_from_ssl(&conn->ssl); ++} ++#endif ++ ++ ++int tls_get_cipher(void *tls_ctx, struct tls_connection *conn, ++ char *buf, size_t buflen) ++{ ++ if (conn == NULL) ++ return -1; ++ const int id = mbedtls_ssl_get_ciphersuite_id_from_ssl(&conn->ssl); ++ return tls_mbedtls_translate_ciphername(id, buf, buflen) ? 0 : -1; ++} ++ ++ ++#ifdef TLS_MBEDTLS_SESSION_TICKETS ++ ++int tls_connection_enable_workaround(void *tls_ctx, ++ struct tls_connection *conn) ++{ ++ /* (see comment in src/eap_peer/eap_fast.c:eap_fast_init()) */ ++ /* XXX: is there a relevant setting for this in mbed TLS? */ ++ /* (do we even care that much about older CBC ciphers?) */ ++ return 0; ++} ++ ++ ++int tls_connection_client_hello_ext(void *tls_ctx, struct tls_connection *conn, ++ int ext_type, const u8 *data, ++ size_t data_len) ++{ ++ /* (EAP-FAST and EAP-TEAP) */ ++ if (ext_type == MBEDTLS_TLS_EXT_SESSION_TICKET) /*(ext_type == 35)*/ ++ return tls_mbedtls_clienthello_session_ticket_prep(conn, data, ++ data_len); ++ ++ return -1; ++} ++ ++#endif /* TLS_MBEDTLS_SESSION_TICKETS */ ++ ++ ++int tls_connection_get_failed(void *tls_ctx, struct tls_connection *conn) ++{ ++ return conn ? conn->failed : -1; ++} ++ ++ ++int tls_connection_get_read_alerts(void *tls_ctx, struct tls_connection *conn) ++{ ++ return conn ? conn->read_alerts : -1; ++} ++ ++ ++int tls_connection_get_write_alerts(void *tls_ctx, ++ struct tls_connection *conn) ++{ ++ return conn ? conn->write_alerts : -1; ++} ++ ++ ++#ifdef TLS_MBEDTLS_SESSION_TICKETS ++int tls_connection_set_session_ticket_cb( ++ void *tls_ctx, struct tls_connection *conn, ++ tls_session_ticket_cb cb, void *ctx) ++{ ++ if (!(conn->tls_conf->flags & TLS_CONN_DISABLE_SESSION_TICKET)) { ++ /* (EAP-FAST and EAP-TEAP) */ ++ conn->session_ticket_cb = cb; ++ conn->session_ticket_cb_ctx = ctx; ++ return 0; ++ } ++ return -1; ++} ++#endif ++ ++ ++int tls_get_library_version(char *buf, size_t buf_len) ++{ ++ #ifndef MBEDTLS_VERSION_C ++ const char * const ver = "n/a"; ++ #else ++ char ver[9]; ++ mbedtls_version_get_string(ver); ++ #endif ++ return os_snprintf(buf, buf_len, ++ "mbed TLS build=" MBEDTLS_VERSION_STRING " run=%s", ver); ++} ++ ++ ++void tls_connection_set_success_data(struct tls_connection *conn, ++ struct wpabuf *data) ++{ ++ wpabuf_free(conn->success_data); ++ conn->success_data = data; ++} ++ ++ ++void tls_connection_set_success_data_resumed(struct tls_connection *conn) ++{ ++} ++ ++ ++const struct wpabuf * ++tls_connection_get_success_data(struct tls_connection *conn) ++{ ++ return conn->success_data; ++} ++ ++ ++void tls_connection_remove_session(struct tls_connection *conn) ++{ ++} ++ ++ ++#ifdef TLS_MBEDTLS_EAP_TEAP ++int tls_get_tls_unique(struct tls_connection *conn, u8 *buf, size_t max_len) ++{ ++ #if defined(MBEDTLS_SSL_RENEGOTIATION) /* XXX: renegotiation or resumption? */ ++ /* data from TLS handshake Finished message */ ++ size_t verify_len = conn->ssl.MBEDTLS_PRIVATE(verify_data_len); ++ char *verify_data = (conn->is_server ^ conn->resumed) ++ ? conn->ssl.MBEDTLS_PRIVATE(peer_verify_data) ++ : conn->ssl.MBEDTLS_PRIVATE(own_verify_data); ++ if (verify_len && verify_len <= max_len) { ++ os_memcpy(buf, verify_data, verify_len); ++ return (int)verify_len; ++ } ++ #endif ++ return -1; ++} ++#endif ++ ++ ++__attribute_noinline__ ++static void tls_mbedtls_set_peer_subject(struct tls_connection *conn, const mbedtls_x509_crt *crt) ++{ ++ if (conn->peer_subject) ++ return; ++ char buf[MBEDTLS_X509_MAX_DN_NAME_SIZE*2]; ++ int buflen = mbedtls_x509_dn_gets(buf, sizeof(buf), &crt->subject); ++ if (buflen >= 0 && (conn->peer_subject = os_malloc((size_t)buflen+1))) ++ os_memcpy(conn->peer_subject, buf, (size_t)buflen+1); ++} ++ ++ ++#ifdef TLS_MBEDTLS_EAP_TEAP ++const char * tls_connection_get_peer_subject(struct tls_connection *conn) ++{ ++ if (!conn) ++ return NULL; ++ if (!conn->peer_subject) { /*(if not set during cert verify)*/ ++ const mbedtls_x509_crt *peer_cert = ++ mbedtls_ssl_get_peer_cert(&conn->ssl); ++ if (peer_cert) ++ tls_mbedtls_set_peer_subject(conn, peer_cert); ++ } ++ return conn->peer_subject; ++} ++#endif ++ ++ ++#ifdef TLS_MBEDTLS_EAP_TEAP ++bool tls_connection_get_own_cert_used(struct tls_connection *conn) ++{ ++ /* XXX: availability of cert does not necessary mean that client ++ * received certificate request from server and then sent cert. ++ * ? step handshake in tls_connection_handshake() looking for ++ * MBEDTLS_SSL_CERTIFICATE_REQUEST ? */ ++ const struct tls_conf * const tls_conf = conn->tls_conf; ++ return (tls_conf->has_client_cert && tls_conf->has_private_key); ++} ++#endif ++ ++ ++#if defined(CONFIG_FIPS) ++#define TLS_MBEDTLS_CONFIG_FIPS ++#endif ++ ++#if defined(CONFIG_SHA256) ++#define TLS_MBEDTLS_TLS_PRF_SHA256 ++#endif ++ ++#if defined(CONFIG_SHA384) ++#define TLS_MBEDTLS_TLS_PRF_SHA384 ++#endif ++ ++ ++#ifndef TLS_MBEDTLS_CONFIG_FIPS ++#if defined(CONFIG_MODULE_TESTS) ++/* unused with CONFIG_TLS=mbedtls except in crypto_module_tests.c */ ++#if MBEDTLS_VERSION_NUMBER >= 0x02120000 /* mbedtls 2.18.0 */ \ ++ && MBEDTLS_VERSION_NUMBER < 0x03000000 /* mbedtls 3.0.0 */ ++/* sha1-tlsprf.c */ ++#include "sha1.h" ++int tls_prf_sha1_md5(const u8 *secret, size_t secret_len, const char *label, ++ const u8 *seed, size_t seed_len, u8 *out, size_t outlen) ++{ ++ return mbedtls_ssl_tls_prf(MBEDTLS_SSL_TLS_PRF_TLS1, ++ secret, secret_len, label, ++ seed, seed_len, out, outlen) ? -1 : 0; ++} ++#else ++#include "sha1-tlsprf.c" /* pull in hostap local implementation */ ++#endif ++#endif ++#endif ++ ++#ifdef TLS_MBEDTLS_TLS_PRF_SHA256 ++/* sha256-tlsprf.c */ ++#if MBEDTLS_VERSION_NUMBER >= 0x02120000 /* mbedtls 2.18.0 */ ++#include "sha256.h" ++int tls_prf_sha256(const u8 *secret, size_t secret_len, const char *label, ++ const u8 *seed, size_t seed_len, u8 *out, size_t outlen) ++{ ++ return mbedtls_ssl_tls_prf(MBEDTLS_SSL_TLS_PRF_SHA256, ++ secret, secret_len, label, ++ seed, seed_len, out, outlen) ? -1 : 0; ++} ++#else ++#include "sha256-tlsprf.c" /* pull in hostap local implementation */ ++#endif ++#endif ++ ++#ifdef TLS_MBEDTLS_TLS_PRF_SHA384 ++/* sha384-tlsprf.c */ ++#if MBEDTLS_VERSION_NUMBER >= 0x02120000 /* mbedtls 2.18.0 */ ++#include "sha384.h" ++int tls_prf_sha384(const u8 *secret, size_t secret_len, const char *label, ++ const u8 *seed, size_t seed_len, u8 *out, size_t outlen) ++{ ++ return mbedtls_ssl_tls_prf(MBEDTLS_SSL_TLS_PRF_SHA384, ++ secret, secret_len, label, ++ seed, seed_len, out, outlen) ? -1 : 0; ++} ++#else ++#include "sha384-tlsprf.c" /* pull in hostap local implementation */ ++#endif ++#endif ++ ++ ++#if MBEDTLS_VERSION_NUMBER < 0x03020000 /* mbedtls 3.2.0 */ ++#define mbedtls_x509_crt_has_ext_type(crt, ext_type) \ ++ ((crt)->MBEDTLS_PRIVATE(ext_types) & (ext_type)) ++#endif ++ ++struct mlist { const char *p; size_t n; }; ++ ++ ++static int ++tls_mbedtls_match_altsubject(mbedtls_x509_crt *crt, const char *match) ++{ ++ /* RFE: this could be pre-parsed into structured data at config time */ ++ struct mlist list[256]; /*(much larger than expected)*/ ++ int nlist = 0; ++ if ( os_strncmp(match, "EMAIL:", 6) != 0 ++ && os_strncmp(match, "DNS:", 4) != 0 ++ && os_strncmp(match, "URI:", 4) != 0 ) { ++ wpa_printf(MSG_INFO, "MTLS: Invalid altSubjectName match '%s'", match); ++ return 0; ++ } ++ for (const char *s = match, *tok; *s; s = tok ? tok+1 : "") { ++ do { } while ((tok = os_strchr(s, ';')) ++ && os_strncmp(tok+1, "EMAIL:", 6) != 0 ++ && os_strncmp(tok+1, "DNS:", 4) != 0 ++ && os_strncmp(tok+1, "URI:", 4) != 0); ++ list[nlist].p = s; ++ list[nlist].n = tok ? (size_t)(tok - s) : os_strlen(s); ++ if (list[nlist].n && ++nlist == sizeof(list)/sizeof(*list)) { ++ wpa_printf(MSG_INFO, "MTLS: excessive altSubjectName match '%s'", ++ match); ++ break; /* truncate huge list and continue */ ++ } ++ } ++ ++ if (!mbedtls_x509_crt_has_ext_type(crt, MBEDTLS_X509_EXT_SUBJECT_ALT_NAME)) ++ return 0; ++ ++ const mbedtls_x509_sequence *cur = &crt->subject_alt_names; ++ for (; cur != NULL; cur = cur->next) { ++ const unsigned char san_type = (unsigned char)cur->buf.tag ++ & MBEDTLS_ASN1_TAG_VALUE_MASK; ++ char t; ++ size_t step = 4; ++ switch (san_type) { /* "EMAIL:" or "DNS:" or "URI:" */ ++ case MBEDTLS_X509_SAN_RFC822_NAME: step = 6; t = 'E'; break; ++ case MBEDTLS_X509_SAN_DNS_NAME: t = 'D'; break; ++ case MBEDTLS_X509_SAN_UNIFORM_RESOURCE_IDENTIFIER: t = 'U'; break; ++ default: continue; ++ } ++ ++ for (int i = 0; i < nlist; ++i) { ++ /* step over "EMAIL:" or "DNS:" or "URI:" in list[i].p */ ++ /* Note: v is not '\0'-terminated, but is a known length vlen, ++ * so okay to pass to os_strncasecmp() even though not z-string */ ++ if (cur->buf.len == list[i].n - step && t == *list[i].p ++ && 0 == os_strncasecmp((char *)cur->buf.p, ++ list[i].p+step, cur->buf.len)) { ++ return 1; /* match */ ++ } ++ } ++ } ++ return 0; /* no match */ ++} ++ ++ ++static int ++tls_mbedtls_match_suffix(const char *v, size_t vlen, ++ const struct mlist *list, int nlist, int full) ++{ ++ /* Note: v is not '\0'-terminated, but is a known length vlen, ++ * so okay to pass to os_strncasecmp() even though not z-string */ ++ for (int i = 0; i < nlist; ++i) { ++ size_t n = list[i].n; ++ if ((n == vlen || (n < vlen && v[vlen-n-1] == '.' && !full)) ++ && 0 == os_strncasecmp(v+vlen-n, list[i].p, n)) ++ return 1; /* match */ ++ } ++ return 0; /* no match */ ++} ++ ++ ++static int ++tls_mbedtls_match_suffixes(mbedtls_x509_crt *crt, const char *match, int full) ++{ ++ /* RFE: this could be pre-parsed into structured data at config time */ ++ struct mlist list[256]; /*(much larger than expected)*/ ++ int nlist = 0; ++ for (const char *s = match, *tok; *s; s = tok ? tok+1 : "") { ++ tok = os_strchr(s, ';'); ++ list[nlist].p = s; ++ list[nlist].n = tok ? (size_t)(tok - s) : os_strlen(s); ++ if (list[nlist].n && ++nlist == sizeof(list)/sizeof(*list)) { ++ wpa_printf(MSG_INFO, "MTLS: excessive suffix match '%s'", match); ++ break; /* truncate huge list and continue */ ++ } ++ } ++ ++ /* check subjectAltNames */ ++ if (mbedtls_x509_crt_has_ext_type(crt, MBEDTLS_X509_EXT_SUBJECT_ALT_NAME)) { ++ const mbedtls_x509_sequence *cur = &crt->subject_alt_names; ++ for (; cur != NULL; cur = cur->next) { ++ const unsigned char san_type = (unsigned char)cur->buf.tag ++ & MBEDTLS_ASN1_TAG_VALUE_MASK; ++ if (san_type == MBEDTLS_X509_SAN_DNS_NAME ++ && tls_mbedtls_match_suffix((char *)cur->buf.p, ++ cur->buf.len, ++ list, nlist, full)) { ++ return 1; /* match */ ++ } ++ } ++ } ++ ++ /* check subject CN */ ++ const mbedtls_x509_name *name = &crt->subject; ++ for (; name != NULL; name = name->next) { ++ if (name->oid.p && MBEDTLS_OID_CMP(MBEDTLS_OID_AT_CN, &name->oid) == 0) ++ break; ++ } ++ if (name && tls_mbedtls_match_suffix((char *)name->val.p, name->val.len, ++ list, nlist, full)) { ++ return 1; /* match */ ++ } ++ ++ return 0; /* no match */ ++} ++ ++ ++static int ++tls_mbedtls_match_dn_field(mbedtls_x509_crt *crt, const char *match) ++{ ++ /* RFE: this could be pre-parsed into structured data at config time */ ++ struct mlistoid { const char *p; size_t n; ++ const char *oid; size_t olen; ++ int prefix; }; ++ struct mlistoid list[32]; /*(much larger than expected)*/ ++ int nlist = 0; ++ for (const char *s = match, *tok, *e; *s; s = tok ? tok+1 : "") { ++ tok = os_strchr(s, '/'); ++ list[nlist].oid = NULL; ++ list[nlist].olen = 0; ++ list[nlist].n = tok ? (size_t)(tok - s) : os_strlen(s); ++ e = memchr(s, '=', list[nlist].n); ++ if (e == NULL) { ++ if (list[nlist].n == 0) ++ continue; /* skip consecutive, repeated '/' */ ++ if (list[nlist].n == 1 && *s == '*') { ++ /* special-case "*" to match any OID and value */ ++ s = e = "=*"; ++ list[nlist].n = 2; ++ list[nlist].oid = ""; ++ } ++ else { ++ wpa_printf(MSG_INFO, ++ "MTLS: invalid check_cert_subject '%s' missing '='", ++ match); ++ return 0; ++ } ++ } ++ switch (e - s) { ++ case 1: ++ if (*s == 'C') { ++ list[nlist].oid = MBEDTLS_OID_AT_COUNTRY; ++ list[nlist].olen = sizeof(MBEDTLS_OID_AT_COUNTRY)-1; ++ } ++ else if (*s == 'L') { ++ list[nlist].oid = MBEDTLS_OID_AT_LOCALITY; ++ list[nlist].olen = sizeof(MBEDTLS_OID_AT_LOCALITY)-1; ++ } ++ else if (*s == 'O') { ++ list[nlist].oid = MBEDTLS_OID_AT_ORGANIZATION; ++ list[nlist].olen = sizeof(MBEDTLS_OID_AT_ORGANIZATION)-1; ++ } ++ break; ++ case 2: ++ if (s[0] == 'C' && s[1] == 'N') { ++ list[nlist].oid = MBEDTLS_OID_AT_CN; ++ list[nlist].olen = sizeof(MBEDTLS_OID_AT_CN)-1; ++ } ++ else if (s[0] == 'S' && s[1] == 'T') { ++ list[nlist].oid = MBEDTLS_OID_AT_STATE; ++ list[nlist].olen = sizeof(MBEDTLS_OID_AT_STATE)-1; ++ } ++ else if (s[0] == 'O' && s[1] == 'U') { ++ list[nlist].oid = MBEDTLS_OID_AT_ORG_UNIT; ++ list[nlist].olen = sizeof(MBEDTLS_OID_AT_ORG_UNIT)-1; ++ } ++ break; ++ case 12: ++ if (os_memcmp(s, "emailAddress", 12) == 0) { ++ list[nlist].oid = MBEDTLS_OID_PKCS9_EMAIL; ++ list[nlist].olen = sizeof(MBEDTLS_OID_PKCS9_EMAIL)-1; ++ } ++ break; ++ default: ++ break; ++ } ++ if (list[nlist].oid == NULL) { ++ wpa_printf(MSG_INFO, ++ "MTLS: Unknown field in check_cert_subject '%s'", ++ match); ++ return 0; ++ } ++ list[nlist].n -= (size_t)(++e - s); ++ list[nlist].p = e; ++ if (list[nlist].n && e[list[nlist].n-1] == '*') { ++ --list[nlist].n; ++ list[nlist].prefix = 1; ++ } ++ /*(could easily add support for suffix matches if value begins with '*', ++ * but suffix match is not currently supported by other TLS modules)*/ ++ ++ if (list[nlist].n && ++nlist == sizeof(list)/sizeof(*list)) { ++ wpa_printf(MSG_INFO, ++ "MTLS: excessive check_cert_subject match '%s'", ++ match); ++ break; /* truncate huge list and continue */ ++ } ++ } ++ ++ /* each component in match string must match cert Subject in order listed ++ * The behavior below preserves ordering but is slightly different than ++ * the grossly inefficient contortions implemented in tls_openssl.c */ ++ const mbedtls_x509_name *name = &crt->subject; ++ for (int i = 0; i < nlist; ++i) { ++ int found = 0; ++ for (; name != NULL && !found; name = name->next) { ++ if (!name->oid.p) ++ continue; ++ /* special-case "*" to match any OID and value */ ++ if (list[i].olen == 0) { ++ found = 1; ++ continue; ++ } ++ /* perform equalent of !MBEDTLS_OID_CMP() with oid ptr and len */ ++ if (list[i].olen != name->oid.len ++ || os_memcmp(list[i].oid, name->oid.p, name->oid.len) != 0) ++ continue; ++ /* Note: v is not '\0'-terminated, but is a known length vlen, ++ * so okay to pass to os_strncasecmp() even though not z-string */ ++ if ((list[i].prefix ++ ? list[i].n <= name->val.len /* prefix match */ ++ : list[i].n == name->val.len) /* full match */ ++ && 0 == os_strncasecmp((char *)name->val.p, ++ list[i].p, list[i].n)) { ++ found = 1; ++ continue; ++ } ++ } ++ if (!found) ++ return 0; /* no match */ ++ } ++ return 1; /* match */ ++} ++ ++ ++__attribute_cold__ ++static void ++tls_mbedtls_verify_fail_event (mbedtls_x509_crt *crt, int depth, ++ const char *errmsg, enum tls_fail_reason reason) ++{ ++ struct tls_config *init_conf = &tls_ctx_global.init_conf; ++ if (init_conf->event_cb == NULL) ++ return; ++ ++ struct wpabuf *certbuf = wpabuf_alloc_copy(crt->raw.p, crt->raw.len); ++ char subject[MBEDTLS_X509_MAX_DN_NAME_SIZE*2]; ++ if (mbedtls_x509_dn_gets(subject, sizeof(subject), &crt->subject) < 0) ++ subject[0] = '\0'; ++ union tls_event_data ev; ++ os_memset(&ev, 0, sizeof(ev)); ++ ev.cert_fail.reason = reason; ++ ev.cert_fail.depth = depth; ++ ev.cert_fail.subject = subject; ++ ev.cert_fail.reason_txt = errmsg; ++ ev.cert_fail.cert = certbuf; ++ ++ init_conf->event_cb(init_conf->cb_ctx, TLS_CERT_CHAIN_FAILURE, &ev); ++ ++ wpabuf_free(certbuf); ++} ++ ++ ++__attribute_noinline__ ++static void ++tls_mbedtls_verify_cert_event (struct tls_connection *conn, ++ mbedtls_x509_crt *crt, int depth) ++{ ++ struct tls_config *init_conf = &tls_ctx_global.init_conf; ++ if (init_conf->event_cb == NULL) ++ return; ++ ++ struct wpabuf *certbuf = NULL; ++ union tls_event_data ev; ++ os_memset(&ev, 0, sizeof(ev)); ++ ++ #ifdef MBEDTLS_SHA256_C ++ u8 hash[SHA256_DIGEST_LENGTH]; ++ const u8 *addr[] = { (u8 *)crt->raw.p }; ++ if (sha256_vector(1, addr, &crt->raw.len, hash) == 0) { ++ ev.peer_cert.hash = hash; ++ ev.peer_cert.hash_len = sizeof(hash); ++ } ++ #endif ++ ev.peer_cert.depth = depth; ++ char subject[MBEDTLS_X509_MAX_DN_NAME_SIZE*2]; ++ if (depth == 0) ++ ev.peer_cert.subject = conn->peer_subject; ++ if (ev.peer_cert.subject == NULL) { ++ ev.peer_cert.subject = subject; ++ if (mbedtls_x509_dn_gets(subject, sizeof(subject), &crt->subject) < 0) ++ subject[0] = '\0'; ++ } ++ ++ char serial_num[128+1]; ++ ev.peer_cert.serial_num = ++ tls_mbedtls_peer_serial_num(crt, serial_num, sizeof(serial_num)); ++ ++ const mbedtls_x509_sequence *cur; ++ ++ cur = NULL; ++ if (mbedtls_x509_crt_has_ext_type(crt, MBEDTLS_X509_EXT_SUBJECT_ALT_NAME)) ++ cur = &crt->subject_alt_names; ++ for (; cur != NULL; cur = cur->next) { ++ const unsigned char san_type = (unsigned char)cur->buf.tag ++ & MBEDTLS_ASN1_TAG_VALUE_MASK; ++ size_t prelen = 4; ++ const char *pre; ++ switch (san_type) { ++ case MBEDTLS_X509_SAN_RFC822_NAME: prelen = 6; pre = "EMAIL:";break; ++ case MBEDTLS_X509_SAN_DNS_NAME: pre = "DNS:"; break; ++ case MBEDTLS_X509_SAN_UNIFORM_RESOURCE_IDENTIFIER: pre = "URI:"; break; ++ default: continue; ++ } ++ ++ char *pos = os_malloc(prelen + cur->buf.len + 1); ++ if (pos == NULL) ++ break; ++ ev.peer_cert.altsubject[ev.peer_cert.num_altsubject] = pos; ++ os_memcpy(pos, pre, prelen); ++ /* data should be properly backslash-escaped if needed, ++ * so code below does not re-escape, but does replace CTLs */ ++ /*os_memcpy(pos+prelen, cur->buf.p, cur->buf.len);*/ ++ /*pos[prelen+cur->buf.len] = '\0';*/ ++ pos += prelen; ++ for (size_t i = 0; i < cur->buf.len; ++i) { ++ unsigned char c = cur->buf.p[i]; ++ *pos++ = (c >= 32 && c != 127) ? c : '?'; ++ } ++ *pos = '\0'; ++ ++ if (++ev.peer_cert.num_altsubject == TLS_MAX_ALT_SUBJECT) ++ break; ++ } ++ ++ cur = NULL; ++ if (mbedtls_x509_crt_has_ext_type(crt, MBEDTLS_X509_EXT_CERTIFICATE_POLICIES)) ++ cur = &crt->certificate_policies; ++ for (; cur != NULL; cur = cur->next) { ++ if (cur->buf.len != 11) /* len of OID_TOD_STRICT or OID_TOD_TOFU */ ++ continue; ++ /* TOD-STRICT "1.3.6.1.4.1.40808.1.3.1" */ ++ /* TOD-TOFU "1.3.6.1.4.1.40808.1.3.2" */ ++ #define OID_TOD_STRICT "\x2b\x06\x01\x04\x01\x82\xbe\x68\x01\x03\x01" ++ #define OID_TOD_TOFU "\x2b\x06\x01\x04\x01\x82\xbe\x68\x01\x03\x02" ++ if (os_memcmp(cur->buf.p, ++ OID_TOD_STRICT, sizeof(OID_TOD_STRICT)-1) == 0) { ++ ev.peer_cert.tod = 1; /* TOD-STRICT */ ++ break; ++ } ++ if (os_memcmp(cur->buf.p, ++ OID_TOD_TOFU, sizeof(OID_TOD_TOFU)-1) == 0) { ++ ev.peer_cert.tod = 2; /* TOD-TOFU */ ++ break; ++ } ++ } ++ ++ struct tls_conf *tls_conf = conn->tls_conf; ++ if (tls_conf->ca_cert_probe || (tls_conf->flags & TLS_CONN_EXT_CERT_CHECK) ++ || init_conf->cert_in_cb) { ++ certbuf = wpabuf_alloc_copy(crt->raw.p, crt->raw.len); ++ ev.peer_cert.cert = certbuf; ++ } ++ ++ init_conf->event_cb(init_conf->cb_ctx, TLS_PEER_CERTIFICATE, &ev); ++ ++ wpabuf_free(certbuf); ++ char **altsubject; ++ *(const char ***)&altsubject = ev.peer_cert.altsubject; ++ for (size_t i = 0; i < ev.peer_cert.num_altsubject; ++i) ++ os_free(altsubject[i]); ++} ++ ++ ++static int ++tls_mbedtls_verify_cb (void *arg, mbedtls_x509_crt *crt, int depth, uint32_t *flags) ++{ ++ /* XXX: N.B. verify code not carefully tested besides hwsim tests ++ * ++ * RFE: mbedtls_x509_crt_verify_info() and enhance log trace messages ++ * RFE: review and add support for additional TLS_CONN_* flags ++ * not handling OCSP (not available in mbedtls) ++ * ... */ ++ ++ struct tls_connection *conn = (struct tls_connection *)arg; ++ struct tls_conf *tls_conf = conn->tls_conf; ++ uint32_t flags_in = *flags; ++ ++ if (depth > 8) { /*(depth 8 picked as arbitrary limit)*/ ++ emsg(MSG_WARNING, "client cert chain too long"); ++ *flags |= MBEDTLS_X509_BADCERT_OTHER; /* cert chain too long */ ++ tls_mbedtls_verify_fail_event(crt, depth, ++ "client cert chain too long", ++ TLS_FAIL_BAD_CERTIFICATE); ++ } ++ else if (tls_conf->verify_depth0_only) { ++ if (depth > 0) ++ *flags = 0; ++ else { ++ #ifdef MBEDTLS_SHA256_C ++ u8 hash[SHA256_DIGEST_LENGTH]; ++ const u8 *addr[] = { (u8 *)crt->raw.p }; ++ if (sha256_vector(1, addr, &crt->raw.len, hash) < 0 ++ || os_memcmp(tls_conf->ca_cert_hash, hash, sizeof(hash)) != 0) { ++ *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED; ++ tls_mbedtls_verify_fail_event(crt, depth, ++ "cert hash mismatch", ++ TLS_FAIL_UNTRUSTED); ++ } ++ else /* hash matches; ignore other issues *except* if revoked)*/ ++ *flags &= MBEDTLS_X509_BADCERT_REVOKED; ++ #endif ++ } ++ } ++ else if (depth == 0) { ++ if (!conn->peer_subject) ++ tls_mbedtls_set_peer_subject(conn, crt); ++ /*(use same labels to tls_mbedtls_verify_fail_event() as used in ++ * other TLS modules so that hwsim tests find exact string match)*/ ++ if (!conn->peer_subject) { /* error copying subject string */ ++ *flags |= MBEDTLS_X509_BADCERT_OTHER; ++ tls_mbedtls_verify_fail_event(crt, depth, ++ "internal error", ++ TLS_FAIL_UNSPECIFIED); ++ } ++ /*(use os_strstr() for subject match as is done in tls_mbedtls.c ++ * to follow the same behavior, even though a suffix match would ++ * make more sense. Also, note that strstr match does not ++ * normalize whitespace (between components) for comparison)*/ ++ else if (tls_conf->subject_match ++ && os_strstr(conn->peer_subject, ++ tls_conf->subject_match) == NULL) { ++ wpa_printf(MSG_WARNING, ++ "MTLS: Subject '%s' did not match with '%s'", ++ conn->peer_subject, tls_conf->subject_match); ++ *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; ++ tls_mbedtls_verify_fail_event(crt, depth, ++ "Subject mismatch", ++ TLS_FAIL_SUBJECT_MISMATCH); ++ } ++ if (tls_conf->altsubject_match ++ && !tls_mbedtls_match_altsubject(crt, tls_conf->altsubject_match)) { ++ wpa_printf(MSG_WARNING, ++ "MTLS: altSubjectName match '%s' not found", ++ tls_conf->altsubject_match); ++ *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; ++ tls_mbedtls_verify_fail_event(crt, depth, ++ "AltSubject mismatch", ++ TLS_FAIL_ALTSUBJECT_MISMATCH); ++ } ++ if (tls_conf->suffix_match ++ && !tls_mbedtls_match_suffixes(crt, tls_conf->suffix_match, 0)) { ++ wpa_printf(MSG_WARNING, ++ "MTLS: Domain suffix match '%s' not found", ++ tls_conf->suffix_match); ++ *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; ++ tls_mbedtls_verify_fail_event(crt, depth, ++ "Domain suffix mismatch", ++ TLS_FAIL_DOMAIN_SUFFIX_MISMATCH); ++ } ++ if (tls_conf->domain_match ++ && !tls_mbedtls_match_suffixes(crt, tls_conf->domain_match, 1)) { ++ wpa_printf(MSG_WARNING, ++ "MTLS: Domain match '%s' not found", ++ tls_conf->domain_match); ++ *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; ++ tls_mbedtls_verify_fail_event(crt, depth, ++ "Domain mismatch", ++ TLS_FAIL_DOMAIN_MISMATCH); ++ } ++ if (tls_conf->check_cert_subject ++ && !tls_mbedtls_match_dn_field(crt, tls_conf->check_cert_subject)) { ++ *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; ++ tls_mbedtls_verify_fail_event(crt, depth, ++ "Distinguished Name", ++ TLS_FAIL_DN_MISMATCH); ++ } ++ if (tls_conf->flags & TLS_CONN_SUITEB) { ++ /* check RSA modulus size (public key bitlen) */ ++ const mbedtls_pk_type_t pk_alg = mbedtls_pk_get_type(&crt->pk); ++ if ((pk_alg == MBEDTLS_PK_RSA || pk_alg == MBEDTLS_PK_RSASSA_PSS) ++ && mbedtls_pk_get_bitlen(&crt->pk) < 3072) { ++ /* hwsim suite_b RSA tests expect 3072 ++ * suite_b_192_rsa_ecdhe_radius_rsa2048_client ++ * suite_b_192_rsa_dhe_radius_rsa2048_client */ ++ *flags |= MBEDTLS_X509_BADCERT_BAD_KEY; ++ tls_mbedtls_verify_fail_event(crt, depth, ++ "Insufficient RSA modulus size", ++ TLS_FAIL_INSUFFICIENT_KEY_LEN); ++ } ++ } ++ if (tls_conf->check_crl && tls_conf->crl == NULL) { ++ /* see tests/hwsim test_ap_eap.py ap_wpa2_eap_tls_check_crl */ ++ emsg(MSG_WARNING, "check_crl set but no CRL loaded; reject all?"); ++ *flags |= MBEDTLS_X509_BADCERT_OTHER; ++ tls_mbedtls_verify_fail_event(crt, depth, ++ "check_crl set but no CRL loaded; " ++ "reject all?", ++ TLS_FAIL_BAD_CERTIFICATE); ++ } ++ } ++ else { ++ if (tls_conf->check_crl != 2) /* 2 == verify CRLs for all certs */ ++ *flags &= ~MBEDTLS_X509_BADCERT_REVOKED; ++ } ++ ++ if (!tls_conf->check_crl_strict) { ++ *flags &= ~MBEDTLS_X509_BADCRL_EXPIRED; ++ *flags &= ~MBEDTLS_X509_BADCRL_FUTURE; ++ } ++ ++ if (tls_conf->flags & TLS_CONN_DISABLE_TIME_CHECKS) { ++ *flags &= ~MBEDTLS_X509_BADCERT_EXPIRED; ++ *flags &= ~MBEDTLS_X509_BADCERT_FUTURE; ++ } ++ ++ tls_mbedtls_verify_cert_event(conn, crt, depth); ++ ++ if (*flags) { ++ if (*flags & (MBEDTLS_X509_BADCERT_NOT_TRUSTED ++ |MBEDTLS_X509_BADCERT_CN_MISMATCH ++ |MBEDTLS_X509_BADCERT_REVOKED)) { ++ emsg(MSG_WARNING, "client cert not trusted"); ++ } ++ /* report event if flags set but no additional flags set above */ ++ /* (could translate flags to more detailed TLS_FAIL_* if needed) */ ++ if (!(*flags & ~flags_in)) { ++ enum tls_fail_reason reason = TLS_FAIL_UNSPECIFIED; ++ const char *errmsg = "cert verify fail unspecified"; ++ if (*flags & MBEDTLS_X509_BADCERT_NOT_TRUSTED) { ++ reason = TLS_FAIL_UNTRUSTED; ++ errmsg = "certificate not trusted"; ++ } ++ if (*flags & MBEDTLS_X509_BADCERT_REVOKED) { ++ reason = TLS_FAIL_REVOKED; ++ errmsg = "certificate has been revoked"; ++ } ++ if (*flags & MBEDTLS_X509_BADCERT_FUTURE) { ++ reason = TLS_FAIL_NOT_YET_VALID; ++ errmsg = "certificate not yet valid"; ++ } ++ if (*flags & MBEDTLS_X509_BADCERT_EXPIRED) { ++ reason = TLS_FAIL_EXPIRED; ++ errmsg = "certificate has expired"; ++ } ++ if (*flags & MBEDTLS_X509_BADCERT_BAD_MD) { ++ reason = TLS_FAIL_BAD_CERTIFICATE; ++ errmsg = "certificate uses insecure algorithm"; ++ } ++ tls_mbedtls_verify_fail_event(crt, depth, errmsg, reason); ++ } ++ #if 0 ++ /* ??? send (again) cert events for all certs in chain ??? ++ * (should already have been called for greater depths) */ ++ /* tls_openssl.c:tls_verify_cb() sends cert events for all certs ++ * in chain if certificate validation fails, but sends all events ++ * with depth set to 0 (might be a bug) */ ++ if (depth > 0) { ++ int pdepth = depth + 1; ++ for (mbedtls_x509_crt *pcrt; (pcrt = crt->next); ++pdepth) { ++ tls_mbedtls_verify_cert_event(conn, pcrt, pdepth); ++ } ++ } ++ #endif ++ /*(do not preserve subject if verification failed but was optional)*/ ++ if (depth == 0 && conn->peer_subject) { ++ os_free(conn->peer_subject); ++ conn->peer_subject = NULL; ++ } ++ } ++ else if (depth == 0) { ++ struct tls_config *init_conf = &tls_ctx_global.init_conf; ++ if (tls_conf->ca_cert_probe) { ++ /* reject server certificate on probe-only run */ ++ *flags |= MBEDTLS_X509_BADCERT_OTHER; ++ tls_mbedtls_verify_fail_event(crt, depth, ++ "server chain probe", ++ TLS_FAIL_SERVER_CHAIN_PROBE); ++ } ++ else if (init_conf->event_cb) { ++ /* ??? send event as soon as depth == 0 is verified ??? ++ * What about rest of chain? ++ * Follows tls_mbedtls.c behavior: */ ++ init_conf->event_cb(init_conf->cb_ctx, ++ TLS_CERT_CHAIN_SUCCESS, NULL); ++ } ++ } ++ ++ return 0; ++} +--- /dev/null ++++ b/tests/build/build-wpa_supplicant-mbedtls.config +@@ -0,0 +1,24 @@ ++CONFIG_TLS=mbedtls ++ ++CONFIG_WPS=y ++CONFIG_EAP_TLS=y ++CONFIG_EAP_MSCHAPV2=y ++ ++CONFIG_EAP_PSK=y ++CONFIG_EAP_GPSK=y ++CONFIG_EAP_AKA=y ++CONFIG_EAP_SIM=y ++CONFIG_EAP_SAKE=y ++CONFIG_EAP_PAX=y ++CONFIG_EAP_FAST=y ++CONFIG_EAP_IKEV2=y ++ ++CONFIG_SAE=y ++CONFIG_FILS=y ++CONFIG_FILS_SK_PFS=y ++CONFIG_OWE=y ++CONFIG_DPP=y ++CONFIG_SUITEB=y ++CONFIG_SUITEB192=y ++ ++CFLAGS += -Werror +--- a/tests/hwsim/example-hostapd.config ++++ b/tests/hwsim/example-hostapd.config +@@ -4,6 +4,7 @@ CONFIG_DRIVER_NONE=y + CONFIG_DRIVER_NL80211=y + CONFIG_RSN_PREAUTH=y + ++#CONFIG_TLS=mbedtls + #CONFIG_TLS=internal + #CONFIG_INTERNAL_LIBTOMMATH=y + #CONFIG_INTERNAL_LIBTOMMATH_FAST=y +@@ -39,6 +40,9 @@ endif + ifeq ($(CONFIG_TLS), wolfssl) + CONFIG_EAP_PWD=y + endif ++ifeq ($(CONFIG_TLS), mbedtls) ++CONFIG_EAP_PWD=y ++endif + CONFIG_EAP_EKE=y + CONFIG_PKCS12=y + CONFIG_RADIUS_SERVER=y +--- a/tests/hwsim/example-wpa_supplicant.config ++++ b/tests/hwsim/example-wpa_supplicant.config +@@ -2,6 +2,7 @@ + + CONFIG_TLS=openssl + #CONFIG_TLS=wolfssl ++#CONFIG_TLS=mbedtls + #CONFIG_TLS=internal + #CONFIG_INTERNAL_LIBTOMMATH=y + #CONFIG_INTERNAL_LIBTOMMATH_FAST=y +@@ -41,6 +42,9 @@ endif + ifeq ($(CONFIG_TLS), wolfssl) + CONFIG_EAP_PWD=y + endif ++ifeq ($(CONFIG_TLS), mbedtls) ++CONFIG_EAP_PWD=y ++endif + + CONFIG_USIM_SIMULATOR=y + CONFIG_SIM_SIMULATOR=y +--- a/wpa_supplicant/Makefile ++++ b/wpa_supplicant/Makefile +@@ -1163,6 +1163,29 @@ endif + CFLAGS += -DTLS_DEFAULT_CIPHERS=\"$(CONFIG_TLS_DEFAULT_CIPHERS)\" + endif + ++ifeq ($(CONFIG_TLS), mbedtls) ++ifndef CONFIG_CRYPTO ++CONFIG_CRYPTO=mbedtls ++endif ++ifdef TLS_FUNCS ++OBJS += ../src/crypto/tls_mbedtls.o ++LIBS += -lmbedtls -lmbedx509 ++endif ++OBJS += ../src/crypto/crypto_$(CONFIG_CRYPTO).o ++OBJS_p += ../src/crypto/crypto_$(CONFIG_CRYPTO).o ++OBJS_priv += ../src/crypto/crypto_$(CONFIG_CRYPTO).o ++ifdef NEED_FIPS186_2_PRF ++OBJS += ../src/crypto/fips_prf_internal.o ++SHA1OBJS += ../src/crypto/sha1-internal.o ++endif ++ifeq ($(CONFIG_CRYPTO), mbedtls) ++LIBS += -lmbedcrypto ++LIBS_p += -lmbedcrypto ++# XXX: create a config option? ++CFLAGS += -DCRYPTO_RSA_OAEP_SHA256 ++endif ++endif ++ + ifeq ($(CONFIG_TLS), gnutls) + ifndef CONFIG_CRYPTO + # default to libgcrypt +@@ -1355,9 +1378,11 @@ endif + + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + NEED_INTERNAL_AES_WRAP=y + endif + endif ++endif + ifdef CONFIG_OPENSSL_INTERNAL_AES_WRAP + # Seems to be needed at least with BoringSSL + NEED_INTERNAL_AES_WRAP=y +@@ -1371,9 +1396,11 @@ endif + + ifdef NEED_INTERNAL_AES_WRAP + ifneq ($(CONFIG_TLS), linux) ++ifneq ($(CONFIG_TLS), mbedtls) + AESOBJS += ../src/crypto/aes-unwrap.o + endif + endif ++endif + ifdef NEED_AES_EAX + AESOBJS += ../src/crypto/aes-eax.o + NEED_AES_CTR=y +@@ -1383,35 +1410,45 @@ AESOBJS += ../src/crypto/aes-siv.o + NEED_AES_CTR=y + endif + ifdef NEED_AES_CTR ++ifneq ($(CONFIG_TLS), mbedtls) + AESOBJS += ../src/crypto/aes-ctr.o + endif ++endif + ifdef NEED_AES_ENCBLOCK ++ifneq ($(CONFIG_TLS), mbedtls) + AESOBJS += ../src/crypto/aes-encblock.o + endif ++endif + NEED_AES_ENC=y + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + AESOBJS += ../src/crypto/aes-omac1.o + endif + endif + endif ++endif + ifdef NEED_AES_WRAP + NEED_AES_ENC=y + ifdef NEED_INTERNAL_AES_WRAP ++ifneq ($(CONFIG_TLS), mbedtls) + AESOBJS += ../src/crypto/aes-wrap.o + endif + endif ++endif + ifdef NEED_AES_CBC + NEED_AES_ENC=y + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + AESOBJS += ../src/crypto/aes-cbc.o + endif + endif + endif + endif ++endif + ifdef NEED_AES_ENC + ifdef CONFIG_INTERNAL_AES + AESOBJS += ../src/crypto/aes-internal-enc.o +@@ -1426,12 +1463,16 @@ ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), gnutls) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + SHA1OBJS += ../src/crypto/sha1.o + endif + endif + endif + endif ++endif ++ifneq ($(CONFIG_TLS), mbedtls) + SHA1OBJS += ../src/crypto/sha1-prf.o ++endif + ifdef CONFIG_INTERNAL_SHA1 + SHA1OBJS += ../src/crypto/sha1-internal.o + ifdef NEED_FIPS186_2_PRF +@@ -1443,29 +1484,37 @@ CFLAGS += -DCONFIG_NO_PBKDF2 + else + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + SHA1OBJS += ../src/crypto/sha1-pbkdf2.o + endif + endif + endif ++endif + ifdef NEED_T_PRF ++ifneq ($(CONFIG_TLS), mbedtls) + SHA1OBJS += ../src/crypto/sha1-tprf.o + endif ++endif + ifdef NEED_TLS_PRF ++ifneq ($(CONFIG_TLS), mbedtls) + SHA1OBJS += ../src/crypto/sha1-tlsprf.o + endif + endif ++endif + + ifndef CONFIG_FIPS + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), gnutls) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + MD5OBJS += ../src/crypto/md5.o + endif + endif + endif + endif + endif ++endif + ifdef NEED_MD5 + ifdef CONFIG_INTERNAL_MD5 + MD5OBJS += ../src/crypto/md5-internal.o +@@ -1520,12 +1569,17 @@ ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), gnutls) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + SHA256OBJS += ../src/crypto/sha256.o + endif + endif + endif + endif ++endif ++ ++ifneq ($(CONFIG_TLS), mbedtls) + SHA256OBJS += ../src/crypto/sha256-prf.o ++endif + ifdef CONFIG_INTERNAL_SHA256 + SHA256OBJS += ../src/crypto/sha256-internal.o + endif +@@ -1538,50 +1592,68 @@ CFLAGS += -DCONFIG_INTERNAL_SHA512 + SHA256OBJS += ../src/crypto/sha512-internal.o + endif + ifdef NEED_TLS_PRF_SHA256 ++ifneq ($(CONFIG_TLS), mbedtls) + SHA256OBJS += ../src/crypto/sha256-tlsprf.o + endif ++endif + ifdef NEED_TLS_PRF_SHA384 ++ifneq ($(CONFIG_TLS), mbedtls) + SHA256OBJS += ../src/crypto/sha384-tlsprf.o + endif ++endif + ifdef NEED_HMAC_SHA256_KDF + CFLAGS += -DCONFIG_HMAC_SHA256_KDF ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha256-kdf.o + endif ++endif + ifdef NEED_HMAC_SHA384_KDF + CFLAGS += -DCONFIG_HMAC_SHA384_KDF ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha384-kdf.o + endif ++endif + ifdef NEED_HMAC_SHA512_KDF + CFLAGS += -DCONFIG_HMAC_SHA512_KDF ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha512-kdf.o + endif ++endif + OBJS += $(SHA256OBJS) + ifdef NEED_SHA384 + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), gnutls) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha384.o + endif + endif + endif + endif ++endif + CFLAGS += -DCONFIG_SHA384 ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha384-prf.o + endif ++endif + ifdef NEED_SHA512 + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), linux) + ifneq ($(CONFIG_TLS), gnutls) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha512.o + endif + endif + endif + endif ++endif + CFLAGS += -DCONFIG_SHA512 ++ifneq ($(CONFIG_TLS), mbedtls) + OBJS += ../src/crypto/sha512-prf.o + endif ++endif + + ifdef NEED_ASN1 + OBJS += ../src/tls/asn1.o +@@ -1756,10 +1828,12 @@ ifdef CONFIG_FIPS + CFLAGS += -DCONFIG_FIPS + ifneq ($(CONFIG_TLS), openssl) + ifneq ($(CONFIG_TLS), wolfssl) ++ifneq ($(CONFIG_TLS), mbedtls) + $(error CONFIG_FIPS=y requires CONFIG_TLS=openssl) + endif + endif + endif ++endif + + OBJS += $(SHA1OBJS) $(DESOBJS) + +--- a/wpa_supplicant/defconfig ++++ b/wpa_supplicant/defconfig +@@ -10,8 +10,8 @@ + # to override previous values of the variables. + + +-# Uncomment following two lines and fix the paths if you have installed OpenSSL +-# or GnuTLS in non-default location ++# Uncomment following two lines and fix the paths if you have installed TLS ++# libraries in a non-default location + #CFLAGS += -I/usr/local/openssl/include + #LIBS += -L/usr/local/openssl/lib + +@@ -20,6 +20,7 @@ + # used to fix build issues on such systems (krb5.h not found). + #CFLAGS += -I/usr/include/kerberos + ++ + # Driver interface for generic Linux wireless extensions + # Note: WEXT is deprecated in the current Linux kernel version and no new + # functionality is added to it. nl80211-based interface is the new +@@ -326,6 +327,7 @@ CONFIG_BACKEND=file + # openssl = OpenSSL (default) + # gnutls = GnuTLS + # internal = Internal TLSv1 implementation (experimental) ++# mbedtls = mbed TLS + # linux = Linux kernel AF_ALG and internal TLSv1 implementation (experimental) + # none = Empty template + #CONFIG_TLS=openssl diff --git a/package/network/services/hostapd/patches/120-mbedtls-fips186_2_prf.patch b/package/network/services/hostapd/patches/120-mbedtls-fips186_2_prf.patch new file mode 100644 index 0000000000..a48725264f --- /dev/null +++ b/package/network/services/hostapd/patches/120-mbedtls-fips186_2_prf.patch @@ -0,0 +1,114 @@ +From c8dba4bd750269bcc80fed3d546e2077cb4cdf0e Mon Sep 17 00:00:00 2001 +From: Glenn Strauss +Date: Tue, 19 Jul 2022 20:02:21 -0400 +Subject: [PATCH 2/7] mbedtls: fips186_2_prf() + +Signed-off-by: Glenn Strauss +--- + hostapd/Makefile | 4 --- + src/crypto/crypto_mbedtls.c | 60 +++++++++++++++++++++++++++++++++++++ + wpa_supplicant/Makefile | 4 --- + 3 files changed, 60 insertions(+), 8 deletions(-) + +--- a/hostapd/Makefile ++++ b/hostapd/Makefile +@@ -759,10 +759,6 @@ endif + OBJS += ../src/crypto/crypto_$(CONFIG_CRYPTO).o + HOBJS += ../src/crypto/crypto_$(CONFIG_CRYPTO).o + SOBJS += ../src/crypto/crypto_$(CONFIG_CRYPTO).o +-ifdef NEED_FIPS186_2_PRF +-OBJS += ../src/crypto/fips_prf_internal.o +-SHA1OBJS += ../src/crypto/sha1-internal.o +-endif + ifeq ($(CONFIG_CRYPTO), mbedtls) + ifdef CONFIG_DPP + LIBS += -lmbedx509 +--- a/src/crypto/crypto_mbedtls.c ++++ b/src/crypto/crypto_mbedtls.c +@@ -132,6 +132,12 @@ + #define CRYPTO_MBEDTLS_HMAC_KDF_SHA512 + #endif + ++#if defined(EAP_SIM) || defined(EAP_SIM_DYNAMIC) || defined(EAP_SERVER_SIM) \ ++ || defined(EAP_AKA) || defined(EAP_AKA_DYNAMIC) || defined(EAP_SERVER_AKA) ++/* EAP_SIM=y EAP_AKA=y */ ++#define CRYPTO_MBEDTLS_FIPS186_2_PRF ++#endif ++ + #if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST) \ + || defined(EAP_TEAP) || defined(EAP_TEAP_DYNAMIC) || defined(EAP_SERVER_FAST) + #define CRYPTO_MBEDTLS_SHA1_T_PRF +@@ -813,6 +819,60 @@ int sha1_t_prf(const u8 *key, size_t key + + #endif /* CRYPTO_MBEDTLS_SHA1_T_PRF */ + ++#ifdef CRYPTO_MBEDTLS_FIPS186_2_PRF ++ ++/* fips_prf_internal.c sha1-internal.c */ ++ ++/* used only by src/eap_common/eap_sim_common.c:eap_sim_prf() ++ * for eap_sim_derive_keys() and eap_sim_derive_keys_reauth() ++ * where xlen is 160 */ ++ ++int fips186_2_prf(const u8 *seed, size_t seed_len, u8 *x, size_t xlen) ++{ ++ /* FIPS 186-2 + change notice 1 */ ++ ++ mbedtls_sha1_context ctx; ++ u8 * const xkey = ctx.MBEDTLS_PRIVATE(buffer); ++ u32 * const xstate = ctx.MBEDTLS_PRIVATE(state); ++ const u32 xstate_init[] = ++ { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 }; ++ ++ mbedtls_sha1_init(&ctx); ++ os_memcpy(xkey, seed, seed_len < 64 ? seed_len : 64); ++ ++ /* note: does not fill extra bytes if (xlen % 20) (SHA1_MAC_LEN) */ ++ for (; xlen >= 20; xlen -= 20) { ++ /* XSEED_j = 0 */ ++ /* XVAL = (XKEY + XSEED_j) mod 2^b */ ++ ++ /* w_i = G(t, XVAL) */ ++ os_memcpy(xstate, xstate_init, sizeof(xstate_init)); ++ mbedtls_internal_sha1_process(&ctx, xkey); ++ ++ #if __BYTE_ORDER == __LITTLE_ENDIAN ++ xstate[0] = host_to_be32(xstate[0]); ++ xstate[1] = host_to_be32(xstate[1]); ++ xstate[2] = host_to_be32(xstate[2]); ++ xstate[3] = host_to_be32(xstate[3]); ++ xstate[4] = host_to_be32(xstate[4]); ++ #endif ++ os_memcpy(x, xstate, 20); ++ if (xlen == 20) /*(done; skip prep for next loop)*/ ++ break; ++ ++ /* XKEY = (1 + XKEY + w_i) mod 2^b */ ++ for (u32 carry = 1, k = 20; k-- > 0; carry >>= 8) ++ xkey[k] = (carry += xkey[k] + x[k]) & 0xff; ++ x += 20; ++ /* x_j = w_0|w_1 (each pair of iterations through loop)*/ ++ } ++ ++ mbedtls_sha1_free(&ctx); ++ return 0; ++} ++ ++#endif /* CRYPTO_MBEDTLS_FIPS186_2_PRF */ ++ + #endif /* MBEDTLS_SHA1_C */ + + +--- a/wpa_supplicant/Makefile ++++ b/wpa_supplicant/Makefile +@@ -1174,10 +1174,6 @@ endif + OBJS += ../src/crypto/crypto_$(CONFIG_CRYPTO).o + OBJS_p += ../src/crypto/crypto_$(CONFIG_CRYPTO).o + OBJS_priv += ../src/crypto/crypto_$(CONFIG_CRYPTO).o +-ifdef NEED_FIPS186_2_PRF +-OBJS += ../src/crypto/fips_prf_internal.o +-SHA1OBJS += ../src/crypto/sha1-internal.o +-endif + ifeq ($(CONFIG_CRYPTO), mbedtls) + LIBS += -lmbedcrypto + LIBS_p += -lmbedcrypto diff --git a/package/network/services/hostapd/patches/130-mbedtls-annotate-with-TEST_FAIL-for-hwsim-tests.patch b/package/network/services/hostapd/patches/130-mbedtls-annotate-with-TEST_FAIL-for-hwsim-tests.patch new file mode 100644 index 0000000000..ae7620b90c --- /dev/null +++ b/package/network/services/hostapd/patches/130-mbedtls-annotate-with-TEST_FAIL-for-hwsim-tests.patch @@ -0,0 +1,421 @@ +From 31bd19e0e0254b910cccfd3ddc6a6a9222bbcfc0 Mon Sep 17 00:00:00 2001 +From: Glenn Strauss +Date: Sun, 9 Oct 2022 05:12:17 -0400 +Subject: [PATCH 3/7] mbedtls: annotate with TEST_FAIL() for hwsim tests + +Signed-off-by: Glenn Strauss +--- + src/crypto/crypto_mbedtls.c | 124 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 124 insertions(+) + +--- a/src/crypto/crypto_mbedtls.c ++++ b/src/crypto/crypto_mbedtls.c +@@ -280,6 +280,9 @@ __attribute_noinline__ + static int md_vector(size_t num_elem, const u8 *addr[], const size_t *len, + u8 *mac, mbedtls_md_type_t md_type) + { ++ if (TEST_FAIL()) ++ return -1; ++ + mbedtls_md_context_t ctx; + mbedtls_md_init(&ctx); + if (mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 0) != 0){ +@@ -343,6 +346,9 @@ __attribute_noinline__ + static int sha384_512_vector(size_t num_elem, const u8 *addr[], + const size_t *len, u8 *mac, int is384) + { ++ if (TEST_FAIL()) ++ return -1; ++ + struct mbedtls_sha512_context ctx; + mbedtls_sha512_init(&ctx); + #if MBEDTLS_VERSION_MAJOR >= 3 +@@ -375,6 +381,9 @@ int sha384_vector(size_t num_elem, const + #include + int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) + { ++ if (TEST_FAIL()) ++ return -1; ++ + struct mbedtls_sha256_context ctx; + mbedtls_sha256_init(&ctx); + #if MBEDTLS_VERSION_MAJOR >= 3 +@@ -397,6 +406,9 @@ int sha256_vector(size_t num_elem, const + #include + int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) + { ++ if (TEST_FAIL()) ++ return -1; ++ + struct mbedtls_sha1_context ctx; + mbedtls_sha1_init(&ctx); + #if MBEDTLS_VERSION_MAJOR >= 3 +@@ -419,6 +431,9 @@ int sha1_vector(size_t num_elem, const u + #include + int md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) + { ++ if (TEST_FAIL()) ++ return -1; ++ + struct mbedtls_md5_context ctx; + mbedtls_md5_init(&ctx); + #if MBEDTLS_VERSION_MAJOR >= 3 +@@ -441,6 +456,9 @@ int md5_vector(size_t num_elem, const u8 + #include + int md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) + { ++ if (TEST_FAIL()) ++ return -1; ++ + struct mbedtls_md4_context ctx; + mbedtls_md4_init(&ctx); + mbedtls_md4_starts_ret(&ctx); +@@ -460,6 +478,9 @@ static int hmac_vector(const u8 *key, si + const u8 *addr[], const size_t *len, u8 *mac, + mbedtls_md_type_t md_type) + { ++ if (TEST_FAIL()) ++ return -1; ++ + mbedtls_md_context_t ctx; + mbedtls_md_init(&ctx); + if (mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 1) != 0){ +@@ -571,6 +592,9 @@ static int hmac_kdf_expand(const u8 *prk + const char *label, const u8 *info, size_t info_len, + u8 *okm, size_t okm_len, mbedtls_md_type_t md_type) + { ++ if (TEST_FAIL()) ++ return -1; ++ + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type); + #ifdef MBEDTLS_HKDF_C + if (label == NULL) /* RFC 5869 HKDF-Expand when (label == NULL) */ +@@ -663,6 +687,9 @@ static int hmac_prf_bits(const u8 *key, + const u8 *data, size_t data_len, u8 *buf, + size_t buf_len_bits, mbedtls_md_type_t md_type) + { ++ if (TEST_FAIL()) ++ return -1; ++ + mbedtls_md_context_t ctx; + mbedtls_md_init(&ctx); + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type); +@@ -938,6 +965,9 @@ int pbkdf2_sha1(const char *passphrase, + + static void *aes_crypt_init_mode(const u8 *key, size_t len, int mode) + { ++ if (TEST_FAIL()) ++ return NULL; ++ + mbedtls_aes_context *aes = os_malloc(sizeof(*aes)); + if (!aes) + return NULL; +@@ -996,6 +1026,9 @@ void aes_decrypt_deinit(void *ctx) + /* aes-wrap.c */ + int aes_wrap(const u8 *kek, size_t kek_len, int n, const u8 *plain, u8 *cipher) + { ++ if (TEST_FAIL()) ++ return -1; ++ + mbedtls_nist_kw_context ctx; + mbedtls_nist_kw_init(&ctx); + size_t olen; +@@ -1010,6 +1043,9 @@ int aes_wrap(const u8 *kek, size_t kek_l + /* aes-unwrap.c */ + int aes_unwrap(const u8 *kek, size_t kek_len, int n, const u8 *cipher, u8 *plain) + { ++ if (TEST_FAIL()) ++ return -1; ++ + mbedtls_nist_kw_context ctx; + mbedtls_nist_kw_init(&ctx); + size_t olen; +@@ -1041,6 +1077,9 @@ int omac1_aes_vector( + const u8 *key, size_t key_len, size_t num_elem, const u8 *addr[], + const size_t *len, u8 *mac) + { ++ if (TEST_FAIL()) ++ return -1; ++ + mbedtls_cipher_type_t cipher_type; + switch (key_len) { + case 16: cipher_type = MBEDTLS_CIPHER_AES_128_ECB; break; +@@ -1103,6 +1142,9 @@ int omac1_aes_256(const u8 *key, const u + /* aes-encblock.c */ + int aes_128_encrypt_block(const u8 *key, const u8 *in, u8 *out) + { ++ if (TEST_FAIL()) ++ return -1; ++ + mbedtls_aes_context aes; + mbedtls_aes_init(&aes); + int ret = mbedtls_aes_setkey_enc(&aes, key, 128) +@@ -1118,6 +1160,9 @@ int aes_128_encrypt_block(const u8 *key, + int aes_ctr_encrypt(const u8 *key, size_t key_len, const u8 *nonce, + u8 *data, size_t data_len) + { ++ if (TEST_FAIL()) ++ return -1; ++ + unsigned char counter[MBEDTLS_AES_BLOCK_SIZE]; + unsigned char stream_block[MBEDTLS_AES_BLOCK_SIZE]; + os_memcpy(counter, nonce, MBEDTLS_AES_BLOCK_SIZE);/*(must be writable)*/ +@@ -1160,11 +1205,17 @@ static int aes_128_cbc_oper(const u8 *ke + + int aes_128_cbc_encrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len) + { ++ if (TEST_FAIL()) ++ return -1; ++ + return aes_128_cbc_oper(key, iv, data, data_len, MBEDTLS_AES_ENCRYPT); + } + + int aes_128_cbc_decrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len) + { ++ if (TEST_FAIL()) ++ return -1; ++ + return aes_128_cbc_oper(key, iv, data, data_len, MBEDTLS_AES_DECRYPT); + } + +@@ -1407,6 +1458,10 @@ int crypto_hash_finish(struct crypto_has + } + mbedtls_md_free(mctx); + os_free(mctx); ++ ++ if (TEST_FAIL()) ++ return -1; ++ + return 0; + } + +@@ -1421,6 +1476,9 @@ int crypto_hash_finish(struct crypto_has + + struct crypto_bignum *crypto_bignum_init(void) + { ++ if (TEST_FAIL()) ++ return NULL; ++ + mbedtls_mpi *bn = os_malloc(sizeof(*bn)); + if (bn) + mbedtls_mpi_init(bn); +@@ -1429,6 +1487,9 @@ struct crypto_bignum *crypto_bignum_init + + struct crypto_bignum *crypto_bignum_init_set(const u8 *buf, size_t len) + { ++ if (TEST_FAIL()) ++ return NULL; ++ + mbedtls_mpi *bn = os_malloc(sizeof(*bn)); + if (bn) { + mbedtls_mpi_init(bn); +@@ -1442,6 +1503,9 @@ struct crypto_bignum *crypto_bignum_init + + struct crypto_bignum *crypto_bignum_init_uint(unsigned int val) + { ++ if (TEST_FAIL()) ++ return NULL; ++ + #if 0 /*(hostap use of this interface passes int, not uint)*/ + val = host_to_be32(val); + return crypto_bignum_init_set((const u8 *)&val, sizeof(val)); +@@ -1467,6 +1531,9 @@ void crypto_bignum_deinit(struct crypto_ + int crypto_bignum_to_bin(const struct crypto_bignum *a, + u8 *buf, size_t buflen, size_t padlen) + { ++ if (TEST_FAIL()) ++ return -1; ++ + size_t n = mbedtls_mpi_size((mbedtls_mpi *)a); + if (n < padlen) + n = padlen; +@@ -1477,6 +1544,9 @@ int crypto_bignum_to_bin(const struct cr + + int crypto_bignum_rand(struct crypto_bignum *r, const struct crypto_bignum *m) + { ++ if (TEST_FAIL()) ++ return -1; ++ + /*assert(r != m);*//* r must not be same as m for mbedtls_mpi_random()*/ + #if MBEDTLS_VERSION_NUMBER >= 0x021B0000 /* mbedtls 2.27.0 */ + return mbedtls_mpi_random((mbedtls_mpi *)r, 0, (mbedtls_mpi *)m, +@@ -1513,6 +1583,9 @@ int crypto_bignum_exptmod(const struct c + const struct crypto_bignum *c, + struct crypto_bignum *d) + { ++ if (TEST_FAIL()) ++ return -1; ++ + /* (check if input params match d; d is the result) */ + /* (a == d) is ok in current mbedtls implementation */ + if (b == d || c == d) { /*(not ok; store result in intermediate)*/ +@@ -1540,6 +1613,9 @@ int crypto_bignum_inverse(const struct c + const struct crypto_bignum *b, + struct crypto_bignum *c) + { ++ if (TEST_FAIL()) ++ return -1; ++ + return mbedtls_mpi_inv_mod((mbedtls_mpi *)c, + (const mbedtls_mpi *)a, + (const mbedtls_mpi *)b) ? -1 : 0; +@@ -1549,6 +1625,9 @@ int crypto_bignum_sub(const struct crypt + const struct crypto_bignum *b, + struct crypto_bignum *c) + { ++ if (TEST_FAIL()) ++ return -1; ++ + return mbedtls_mpi_sub_mpi((mbedtls_mpi *)c, + (const mbedtls_mpi *)a, + (const mbedtls_mpi *)b) ? -1 : 0; +@@ -1558,6 +1637,9 @@ int crypto_bignum_div(const struct crypt + const struct crypto_bignum *b, + struct crypto_bignum *c) + { ++ if (TEST_FAIL()) ++ return -1; ++ + /*(most current use of this crypto.h interface has a == c (result), + * so store result in an intermediate to avoid overwritten input)*/ + mbedtls_mpi R; +@@ -1575,6 +1657,9 @@ int crypto_bignum_addmod(const struct cr + const struct crypto_bignum *c, + struct crypto_bignum *d) + { ++ if (TEST_FAIL()) ++ return -1; ++ + return mbedtls_mpi_add_mpi((mbedtls_mpi *)d, + (const mbedtls_mpi *)a, + (const mbedtls_mpi *)b) +@@ -1588,6 +1673,9 @@ int crypto_bignum_mulmod(const struct cr + const struct crypto_bignum *c, + struct crypto_bignum *d) + { ++ if (TEST_FAIL()) ++ return -1; ++ + return mbedtls_mpi_mul_mpi((mbedtls_mpi *)d, + (const mbedtls_mpi *)a, + (const mbedtls_mpi *)b) +@@ -1600,6 +1688,9 @@ int crypto_bignum_sqrmod(const struct cr + const struct crypto_bignum *b, + struct crypto_bignum *c) + { ++ if (TEST_FAIL()) ++ return -1; ++ + #if 1 + return crypto_bignum_mulmod(a, a, b, c); + #else +@@ -1650,6 +1741,9 @@ int crypto_bignum_is_odd(const struct cr + int crypto_bignum_legendre(const struct crypto_bignum *a, + const struct crypto_bignum *p) + { ++ if (TEST_FAIL()) ++ return -2; ++ + /* Security Note: + * mbedtls_mpi_exp_mod() is not documented to run in constant time, + * though mbedtls/library/bignum.c uses constant_time_internal.h funcs. +@@ -1702,6 +1796,9 @@ int crypto_mod_exp(const u8 *base, size_ + const u8 *modulus, size_t modulus_len, + u8 *result, size_t *result_len) + { ++ if (TEST_FAIL()) ++ return -1; ++ + mbedtls_mpi bn_base, bn_exp, bn_modulus, bn_result; + mbedtls_mpi_init(&bn_base); + mbedtls_mpi_init(&bn_exp); +@@ -1769,6 +1866,9 @@ static int crypto_mbedtls_dh_init_public + int crypto_dh_init(u8 generator, const u8 *prime, size_t prime_len, u8 *privkey, + u8 *pubkey) + { ++ if (TEST_FAIL()) ++ return -1; ++ + #if 0 /*(crypto_dh_init() duplicated (and identical) in crypto_*.c modules)*/ + size_t pubkey_len, pad; + +@@ -1810,6 +1910,9 @@ int crypto_dh_derive_secret(u8 generator + const u8 *pubkey, size_t pubkey_len, + u8 *secret, size_t *len) + { ++ if (TEST_FAIL()) ++ return -1; ++ + #if 0 + if (pubkey_len > prime_len || + (pubkey_len == prime_len && +@@ -2512,6 +2615,9 @@ const struct crypto_ec_point * crypto_ec + + struct crypto_ec_point *crypto_ec_point_init(struct crypto_ec *e) + { ++ if (TEST_FAIL()) ++ return NULL; ++ + mbedtls_ecp_point *p = os_malloc(sizeof(*p)); + if (p != NULL) + mbedtls_ecp_point_init(p); +@@ -2536,6 +2642,9 @@ int crypto_ec_point_x(struct crypto_ec * + int crypto_ec_point_to_bin(struct crypto_ec *e, + const struct crypto_ec_point *point, u8 *x, u8 *y) + { ++ if (TEST_FAIL()) ++ return -1; ++ + /* crypto.h documents crypto_ec_point_to_bin() output is big-endian */ + size_t len = CRYPTO_EC_plen(e); + if (x) { +@@ -2563,6 +2672,9 @@ int crypto_ec_point_to_bin(struct crypto + struct crypto_ec_point * crypto_ec_point_from_bin(struct crypto_ec *e, + const u8 *val) + { ++ if (TEST_FAIL()) ++ return NULL; ++ + size_t len = CRYPTO_EC_plen(e); + mbedtls_ecp_point *p = os_malloc(sizeof(*p)); + u8 buf[1+MBEDTLS_MPI_MAX_SIZE*2]; +@@ -2615,6 +2727,9 @@ int crypto_ec_point_add(struct crypto_ec + const struct crypto_ec_point *b, + struct crypto_ec_point *c) + { ++ if (TEST_FAIL()) ++ return -1; ++ + /* mbedtls does not provide an mbedtls_ecp_point add function */ + mbedtls_mpi one; + mbedtls_mpi_init(&one); +@@ -2631,6 +2746,9 @@ int crypto_ec_point_mul(struct crypto_ec + const struct crypto_bignum *b, + struct crypto_ec_point *res) + { ++ if (TEST_FAIL()) ++ return -1; ++ + return mbedtls_ecp_mul( + (mbedtls_ecp_group *)e, (mbedtls_ecp_point *)res, + (const mbedtls_mpi *)b, (const mbedtls_ecp_point *)p, +@@ -2639,6 +2757,9 @@ int crypto_ec_point_mul(struct crypto_ec + + int crypto_ec_point_invert(struct crypto_ec *e, struct crypto_ec_point *p) + { ++ if (TEST_FAIL()) ++ return -1; ++ + if (mbedtls_ecp_get_type((mbedtls_ecp_group *)e) + == MBEDTLS_ECP_TYPE_MONTGOMERY) { + /* e.g. MBEDTLS_ECP_DP_CURVE25519 and MBEDTLS_ECP_DP_CURVE448 */ +@@ -2751,6 +2872,9 @@ struct crypto_bignum * + crypto_ec_point_compute_y_sqr(struct crypto_ec *e, + const struct crypto_bignum *x) + { ++ if (TEST_FAIL()) ++ return NULL; ++ + mbedtls_mpi *y2 = os_malloc(sizeof(*y2)); + if (y2 == NULL) + return NULL; diff --git a/package/network/services/hostapd/patches/135-mbedtls-fix-owe-association.patch b/package/network/services/hostapd/patches/135-mbedtls-fix-owe-association.patch new file mode 100644 index 0000000000..0c29432d3f --- /dev/null +++ b/package/network/services/hostapd/patches/135-mbedtls-fix-owe-association.patch @@ -0,0 +1,91 @@ +The code for hostapd-mbedtls did not work when used for OWE association. + +When handling association requests, the buffer offsets and length assumptions were incorrect, leading to never calculating the y point, thus denying association. + +Also when crafting the association response, the buffer contained the trailing key-type. + +Fix up both issues to adhere to the specification and make hostapd-mbedtls work with the OWE security type. + +--- a/src/crypto/crypto_mbedtls.c ++++ b/src/crypto/crypto_mbedtls.c +@@ -2299,25 +2299,30 @@ struct crypto_ecdh * crypto_ecdh_init2(i + struct wpabuf * crypto_ecdh_get_pubkey(struct crypto_ecdh *ecdh, int inc_y) + { + mbedtls_ecp_group *grp = &ecdh->grp; +- size_t len = CRYPTO_EC_plen(grp); ++ size_t prime_len = CRYPTO_EC_plen(grp); ++ size_t output_len = prime_len; ++ u8 output_offset = 0; ++ u8 buf[256]; ++ + #ifdef MBEDTLS_ECP_MONTGOMERY_ENABLED + /* len */ + #endif + #ifdef MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED +- if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) +- len = inc_y ? len*2+1 : len+1; ++ if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { ++ output_len = inc_y ? prime_len * 2 + 1 : prime_len + 1; ++ output_offset = 1; ++ } + #endif +- struct wpabuf *buf = wpabuf_alloc(len); +- if (buf == NULL) ++ ++ if (output_len > sizeof(buf)) + return NULL; ++ + inc_y = inc_y ? MBEDTLS_ECP_PF_UNCOMPRESSED : MBEDTLS_ECP_PF_COMPRESSED; +- if (mbedtls_ecp_point_write_binary(grp, &ecdh->Q, inc_y, &len, +- wpabuf_mhead_u8(buf), len) == 0) { +- wpabuf_put(buf, len); +- return buf; ++ if (mbedtls_ecp_point_write_binary(grp, &ecdh->Q, inc_y, &output_len, ++ buf, output_len) == 0) { ++ return wpabuf_alloc_copy(buf + output_offset, output_len - output_offset); + } + +- wpabuf_free(buf); + return NULL; + } + +@@ -2379,10 +2384,7 @@ struct wpabuf * crypto_ecdh_set_peerkey( + os_memcpy(buf+2, key, len); + } + len >>= 1; /*(repurpose len to prime_len)*/ +- } +- else if (key[0] == 0x02 || key[0] == 0x03) { /* (inc_y == 0) */ +- --len; /*(repurpose len to prime_len)*/ +- ++ } else { /* (inc_y == 0) */ + /* mbedtls_ecp_point_read_binary() does not currently support + * MBEDTLS_ECP_PF_COMPRESSED format (buf[1] = 0x02 or 0x03) + * (returns MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE) */ +@@ -2390,22 +2392,21 @@ struct wpabuf * crypto_ecdh_set_peerkey( + /* derive y, amend buf[] with y for UNCOMPRESSED format */ + if (sizeof(buf)-2 < len*2 || len == 0) + return NULL; ++ + buf[0] = (u8)(1+len*2); + buf[1] = 0x04; ++ os_memcpy(buf+2, key, len); ++ + mbedtls_mpi bn; + mbedtls_mpi_init(&bn); +- int ret = mbedtls_mpi_read_binary(&bn, key+1, len) +- || crypto_mbedtls_short_weierstrass_derive_y(grp, &bn, +- key[0] & 1) ++ int ret = mbedtls_mpi_read_binary(&bn, key, len) ++ || crypto_mbedtls_short_weierstrass_derive_y(grp, &bn, 0) + || mbedtls_mpi_write_binary(&bn, buf+2+len, len); + mbedtls_mpi_free(&bn); + if (ret != 0) + return NULL; + } + +- if (key[0] == 0) /*(repurpose len to prime_len)*/ +- len = CRYPTO_EC_plen(grp); +- + if (mbedtls_ecdh_read_public(&ecdh->ctx, buf, buf[0]+1)) + return NULL; + } diff --git a/package/network/services/hostapd/patches/140-tests-Makefile-make-run-tests-with-CONFIG_TLS.patch b/package/network/services/hostapd/patches/140-tests-Makefile-make-run-tests-with-CONFIG_TLS.patch new file mode 100644 index 0000000000..e967cff427 --- /dev/null +++ b/package/network/services/hostapd/patches/140-tests-Makefile-make-run-tests-with-CONFIG_TLS.patch @@ -0,0 +1,1358 @@ +From f24933dc175e0faf44a3cce3330c256a59649ca6 Mon Sep 17 00:00:00 2001 +From: Glenn Strauss +Date: Tue, 19 Jul 2022 23:01:17 -0400 +Subject: [PATCH 4/7] tests/Makefile make run-tests with CONFIG_TLS=... + +add test-crypto_module.c to run crypto_module_tests() + +adjust some tests/hwsim/*.py for mbed TLS (work in progress) + +option to build and run-tests with CONFIG_TLS=internal # (default) +$ cd tests; make clean +$ make run-tests + +option to build and run-tests with CONFIG_TLS=gnutls +$ cd tests; make clean CONFIG_TLS=gnutls +$ make run-tests CONFIG_TLS=gnutls + +option to build and run-tests with CONFIG_TLS=mbedtls +$ cd tests; make clean CONFIG_TLS=mbedtls +$ make run-tests CONFIG_TLS=mbedtls + +option to build and run-tests with CONFIG_TLS=openssl +$ cd tests; make clean CONFIG_TLS=openssl +$ make run-tests CONFIG_TLS=openssl + +option to build and run-tests with CONFIG_TLS=wolfssl +$ cd tests; make clean CONFIG_TLS=wolfssl +$ make run-tests CONFIG_TLS=wolfssl + +RFE: Makefile logic for crypto objects should be centralized + instead of being duplicated in hostapd/Makefile, + wpa_supplicant/Makefile, src/crypto/Makefile, + tests/Makefile, ... + +Signed-off-by: Glenn Strauss +--- + hostapd/Makefile | 6 + + src/crypto/Makefile | 129 ++++++++++++++++++++- + src/crypto/crypto_module_tests.c | 134 ++++++++++++++++++++++ + src/tls/Makefile | 11 ++ + tests/Makefile | 75 +++++++++--- + tests/hwsim/example-hostapd.config | 11 +- + tests/hwsim/example-wpa_supplicant.config | 12 +- + tests/hwsim/test_ap_eap.py | 114 +++++++++++++----- + tests/hwsim/test_ap_ft.py | 4 +- + tests/hwsim/test_authsrv.py | 9 +- + tests/hwsim/test_dpp.py | 19 ++- + tests/hwsim/test_erp.py | 16 +-- + tests/hwsim/test_fils.py | 5 +- + tests/hwsim/test_pmksa_cache.py | 4 +- + tests/hwsim/test_sae.py | 7 ++ + tests/hwsim/test_suite_b.py | 3 + + tests/hwsim/test_wpas_ctrl.py | 2 +- + tests/hwsim/utils.py | 8 +- + tests/test-crypto_module.c | 16 +++ + tests/test-https.c | 12 +- + tests/test-https_server.c | 12 +- + wpa_supplicant/Makefile | 6 + + 22 files changed, 524 insertions(+), 91 deletions(-) + create mode 100644 tests/test-crypto_module.c + +--- a/hostapd/Makefile ++++ b/hostapd/Makefile +@@ -696,6 +696,7 @@ CFLAGS += -DCONFIG_TLSV12 + endif + + ifeq ($(CONFIG_TLS), wolfssl) ++CFLAGS += -DCONFIG_TLS_WOLFSSL + CONFIG_CRYPTO=wolfssl + ifdef TLS_FUNCS + OBJS += ../src/crypto/tls_wolfssl.o +@@ -716,6 +717,7 @@ endif + endif + + ifeq ($(CONFIG_TLS), openssl) ++CFLAGS += -DCONFIG_TLS_OPENSSL + CFLAGS += -DCRYPTO_RSA_OAEP_SHA256 + CONFIG_CRYPTO=openssl + ifdef TLS_FUNCS +@@ -746,6 +748,7 @@ CFLAGS += -DTLS_DEFAULT_CIPHERS=\"$(CONF + endif + + ifeq ($(CONFIG_TLS), mbedtls) ++CFLAGS += -DCONFIG_TLS_MBEDTLS + ifndef CONFIG_CRYPTO + CONFIG_CRYPTO=mbedtls + endif +@@ -776,6 +779,7 @@ endif + endif + + ifeq ($(CONFIG_TLS), gnutls) ++CFLAGS += -DCONFIG_TLS_GNUTLS + ifndef CONFIG_CRYPTO + # default to libgcrypt + CONFIG_CRYPTO=gnutls +@@ -806,6 +810,7 @@ endif + endif + + ifeq ($(CONFIG_TLS), internal) ++CFLAGS += -DCONFIG_TLS_INTERNAL + ifndef CONFIG_CRYPTO + CONFIG_CRYPTO=internal + endif +@@ -884,6 +889,7 @@ endif + endif + + ifeq ($(CONFIG_TLS), linux) ++CFLAGS += -DCONFIG_TLS_INTERNAL + OBJS += ../src/crypto/crypto_linux.o + ifdef TLS_FUNCS + OBJS += ../src/crypto/crypto_internal-rsa.o +--- a/src/crypto/Makefile ++++ b/src/crypto/Makefile +@@ -1,10 +1,121 @@ +-CFLAGS += -DCONFIG_CRYPTO_INTERNAL +-CFLAGS += -DCONFIG_TLS_INTERNAL_CLIENT +-CFLAGS += -DCONFIG_TLS_INTERNAL_SERVER + #CFLAGS += -DALL_DH_GROUPS + CFLAGS += -DCONFIG_SHA256 + CFLAGS += -DCONFIG_SHA384 ++CFLAGS += -DCONFIG_HMAC_SHA256_KDF + CFLAGS += -DCONFIG_HMAC_SHA384_KDF ++ ++# crypto_module_tests.c ++CFLAGS += -DCONFIG_MODULE_TESTS ++CFLAGS += -DCONFIG_DPP ++#CFLAGS += -DCONFIG_DPP2 ++#CFLAGS += -DCONFIG_DPP3 ++CFLAGS += -DCONFIG_ECC ++CFLAGS += -DCONFIG_MESH ++CFLAGS += -DEAP_PSK ++CFLAGS += -DEAP_FAST ++ ++ifeq ($(CONFIG_TLS),mbedtls) ++ ++# (enable features for 'cd tests; make run-tests CONFIG_TLS=mbedtls') ++CFLAGS += -DCRYPTO_RSA_OAEP_SHA256 ++CFLAGS += -DCONFIG_DES ++CFLAGS += -DEAP_IKEV2 ++CFLAGS += -DEAP_MSCHAPv2 ++CFLAGS += -DEAP_SIM ++ ++LIB_OBJS = tls_mbedtls.o crypto_mbedtls.o ++LIB_OBJS+= \ ++ aes-eax.o \ ++ aes-siv.o \ ++ dh_groups.o \ ++ milenage.o \ ++ ms_funcs.o ++ ++else ++ifeq ($(CONFIG_TLS),openssl) ++ ++# (enable features for 'cd tests; make run-tests CONFIG_TLS=openssl') ++ifndef CONFIG_TLS_DEFAULT_CIPHERS ++CONFIG_TLS_DEFAULT_CIPHERS = "DEFAULT:!EXP:!LOW" ++endif ++CFLAGS += -DTLS_DEFAULT_CIPHERS=\"$(CONFIG_TLS_DEFAULT_CIPHERS)\" ++CFLAGS += -DCRYPTO_RSA_OAEP_SHA256 ++CFLAGS += -DEAP_TLS_OPENSSL ++ ++LIB_OBJS = tls_openssl.o fips_prf_openssl.o crypto_openssl.o ++LIB_OBJS+= \ ++ aes-ctr.o \ ++ aes-eax.o \ ++ aes-encblock.o \ ++ aes-siv.o \ ++ dh_groups.o \ ++ milenage.o \ ++ ms_funcs.o \ ++ sha1-prf.o \ ++ sha1-tlsprf.o \ ++ sha1-tprf.o \ ++ sha256-kdf.o \ ++ sha256-prf.o \ ++ sha256-tlsprf.o ++ ++else ++ifeq ($(CONFIG_TLS),wolfssl) ++ ++# (wolfssl libraries must be built with ./configure --enable-wpas) ++# (enable features for 'cd tests; make run-tests CONFIG_TLS=wolfssl') ++CFLAGS += -DWOLFSSL_DER_LOAD ++CFLAGS += -DCONFIG_DES ++ ++LIB_OBJS = tls_wolfssl.o fips_prf_wolfssl.o crypto_wolfssl.o ++LIB_OBJS+= \ ++ aes-ctr.o \ ++ aes-eax.o \ ++ aes-encblock.o \ ++ aes-siv.o \ ++ dh_groups.o \ ++ milenage.o \ ++ ms_funcs.o \ ++ sha1-prf.o \ ++ sha1-tlsprf.o \ ++ sha1-tprf.o \ ++ sha256-kdf.o \ ++ sha256-prf.o \ ++ sha256-tlsprf.o ++ ++else ++ifeq ($(CONFIG_TLS),gnutls) ++ ++# (enable features for 'cd tests; make run-tests CONFIG_TLS=gnutls') ++LIB_OBJS = tls_gnutls.o crypto_gnutls.o ++LIB_OBJS+= \ ++ aes-cbc.o \ ++ aes-ctr.o \ ++ aes-eax.o \ ++ aes-encblock.o \ ++ aes-omac1.o \ ++ aes-siv.o \ ++ aes-unwrap.o \ ++ aes-wrap.o \ ++ dh_group5.o \ ++ dh_groups.o \ ++ milenage.o \ ++ ms_funcs.o \ ++ rc4.o \ ++ sha1-pbkdf2.o \ ++ sha1-prf.o \ ++ fips_prf_internal.o \ ++ sha1-internal.o \ ++ sha1-tlsprf.o \ ++ sha1-tprf.o \ ++ sha256-kdf.o \ ++ sha256-prf.o \ ++ sha256-tlsprf.o ++ ++else ++ ++CFLAGS += -DCONFIG_CRYPTO_INTERNAL ++CFLAGS += -DCONFIG_TLS_INTERNAL_CLIENT ++CFLAGS += -DCONFIG_TLS_INTERNAL_SERVER + CFLAGS += -DCONFIG_INTERNAL_SHA384 + + LIB_OBJS= \ +@@ -13,7 +124,6 @@ LIB_OBJS= \ + aes-ctr.o \ + aes-eax.o \ + aes-encblock.o \ +- aes-gcm.o \ + aes-internal.o \ + aes-internal-dec.o \ + aes-internal-enc.o \ +@@ -37,6 +147,7 @@ LIB_OBJS= \ + sha1-tlsprf.o \ + sha1-tprf.o \ + sha256.o \ ++ sha256-kdf.o \ + sha256-prf.o \ + sha256-tlsprf.o \ + sha256-internal.o \ +@@ -53,6 +164,16 @@ LIB_OBJS += crypto_internal-modexp.o + LIB_OBJS += crypto_internal-rsa.o + LIB_OBJS += tls_internal.o + LIB_OBJS += fips_prf_internal.o ++ ++endif ++endif ++endif ++endif ++ ++ ++# (used by wlantest/{bip,gcmp,rx_mgmt}.c and tests/test-aes.c) ++LIB_OBJS += aes-gcm.o ++ + ifndef TEST_FUZZ + LIB_OBJS += random.o + endif +--- a/src/crypto/crypto_module_tests.c ++++ b/src/crypto/crypto_module_tests.c +@@ -2469,6 +2469,139 @@ static int test_hpke(void) + } + + ++static int test_ecc(void) ++{ ++#ifdef CONFIG_ECC ++#ifndef CONFIG_TLS_INTERNAL ++#ifndef CONFIG_TLS_GNUTLS ++#if defined(CONFIG_TLS_MBEDTLS) \ ++ || defined(CONFIG_TLS_OPENSSL) \ ++ || defined(CONFIG_TLS_WOLFSSL) ++ wpa_printf(MSG_INFO, "Testing ECC"); ++ /* Note: some tests below are valid on supported Short Weierstrass ++ * curves, but not on Montgomery curves (e.g. IKE groups 31 and 32) ++ * (e.g. deriving and comparing y^2 test below not valid on Montgomery) ++ */ ++#ifdef CONFIG_TLS_MBEDTLS ++ const int grps[] = {19, 20, 21, 25, 26, 28}; ++#endif ++#ifdef CONFIG_TLS_OPENSSL ++ const int grps[] = {19, 20, 21, 26}; ++#endif ++#ifdef CONFIG_TLS_WOLFSSL ++ const int grps[] = {19, 20, 21, 26}; ++#endif ++ uint32_t i; ++ struct crypto_ec *e = NULL; ++ struct crypto_ec_point *p = NULL, *q = NULL; ++ struct crypto_bignum *x = NULL, *y = NULL; ++#ifdef CONFIG_DPP ++ u8 bin[4096]; ++#endif ++ for (i = 0; i < ARRAY_SIZE(grps); ++i) { ++ e = crypto_ec_init(grps[i]); ++ if (e == NULL ++ || crypto_ec_prime_len(e) == 0 ++ || crypto_ec_prime_len_bits(e) == 0 ++ || crypto_ec_order_len(e) == 0 ++ || crypto_ec_get_prime(e) == NULL ++ || crypto_ec_get_order(e) == NULL ++ || crypto_ec_get_a(e) == NULL ++ || crypto_ec_get_b(e) == NULL ++ || crypto_ec_get_generator(e) == NULL) { ++ break; ++ } ++#ifdef CONFIG_DPP ++ struct crypto_ec_key *key = crypto_ec_key_gen(grps[i]); ++ if (key == NULL) ++ break; ++ p = crypto_ec_key_get_public_key(key); ++ q = crypto_ec_key_get_public_key(key); ++ crypto_ec_key_deinit(key); ++ if (p == NULL || q == NULL) ++ break; ++ if (!crypto_ec_point_is_on_curve(e, p)) ++ break; ++ ++ /* inverted point should not match original; ++ * double-invert should match */ ++ if (crypto_ec_point_invert(e, q) != 0 ++ || crypto_ec_point_cmp(e, p, q) == 0 ++ || crypto_ec_point_invert(e, q) != 0 ++ || crypto_ec_point_cmp(e, p, q) != 0) { ++ break; ++ } ++ ++ /* crypto_ec_point_to_bin() and crypto_ec_point_from_bin() ++ * imbalanced interfaces? */ ++ size_t prime_len = crypto_ec_prime_len(e); ++ if (prime_len * 2 > sizeof(bin)) ++ break; ++ if (crypto_ec_point_to_bin(e, p, bin, bin+prime_len) != 0) ++ break; ++ struct crypto_ec_point *tmp = crypto_ec_point_from_bin(e, bin); ++ if (tmp == NULL) ++ break; ++ if (crypto_ec_point_cmp(e, p, tmp) != 0) { ++ crypto_ec_point_deinit(tmp, 0); ++ break; ++ } ++ crypto_ec_point_deinit(tmp, 0); ++ ++ x = crypto_bignum_init(); ++ y = crypto_bignum_init_set(bin+prime_len, prime_len); ++ if (x == NULL || y == NULL || crypto_ec_point_x(e, p, x) != 0) ++ break; ++ struct crypto_bignum *y2 = crypto_ec_point_compute_y_sqr(e, x); ++ if (y2 == NULL) ++ break; ++ if (crypto_bignum_sqrmod(y, crypto_ec_get_prime(e), y) != 0 ++ || crypto_bignum_cmp(y, y2) != 0) { ++ crypto_bignum_deinit(y2, 0); ++ break; ++ } ++ crypto_bignum_deinit(y2, 0); ++ crypto_bignum_deinit(x, 0); ++ crypto_bignum_deinit(y, 0); ++ x = NULL; ++ y = NULL; ++ ++ x = crypto_bignum_init(); ++ if (x == NULL) ++ break; ++ if (crypto_bignum_rand(x, crypto_ec_get_prime(e)) != 0) ++ break; ++ crypto_bignum_deinit(x, 0); ++ x = NULL; ++ ++ crypto_ec_point_deinit(p, 0); ++ p = NULL; ++ crypto_ec_point_deinit(q, 0); ++ q = NULL; ++#endif /* CONFIG_DPP */ ++ crypto_ec_deinit(e); ++ e = NULL; ++ } ++ if (i != ARRAY_SIZE(grps)) { ++ crypto_bignum_deinit(x, 0); ++ crypto_bignum_deinit(y, 0); ++ crypto_ec_point_deinit(p, 0); ++ crypto_ec_point_deinit(q, 0); ++ crypto_ec_deinit(e); ++ wpa_printf(MSG_INFO, ++ "ECC test case failed tls_id:%d", grps[i]); ++ return -1; ++ } ++ ++ wpa_printf(MSG_INFO, "ECC test cases passed"); ++#endif ++#endif /* !CONFIG_TLS_GNUTLS */ ++#endif /* !CONFIG_TLS_INTERNAL */ ++#endif /* CONFIG_ECC */ ++ return 0; ++} ++ ++ + static int test_ms_funcs(void) + { + #ifndef CONFIG_FIPS +@@ -2590,6 +2723,7 @@ int crypto_module_tests(void) + test_fips186_2_prf() || + test_extract_expand_hkdf() || + test_hpke() || ++ test_ecc() || + test_ms_funcs()) + ret = -1; + +--- a/src/tls/Makefile ++++ b/src/tls/Makefile +@@ -1,3 +1,10 @@ ++LIB_OBJS= asn1.o ++ ++ifneq ($(CONFIG_TLS),gnutls) ++ifneq ($(CONFIG_TLS),mbedtls) ++ifneq ($(CONFIG_TLS),openssl) ++ifneq ($(CONFIG_TLS),wolfssl) ++ + CFLAGS += -DCONFIG_INTERNAL_LIBTOMMATH + CFLAGS += -DCONFIG_CRYPTO_INTERNAL + CFLAGS += -DCONFIG_TLSV11 +@@ -21,5 +28,9 @@ LIB_OBJS= \ + tlsv1_server_read.o \ + tlsv1_server_write.o \ + x509v3.o ++endif ++endif ++endif ++endif + + include ../lib.rules +--- a/tests/Makefile ++++ b/tests/Makefile +@@ -1,8 +1,10 @@ +-ALL=test-base64 test-md4 test-milenage \ +- test-rsa-sig-ver \ +- test-sha1 \ +- test-https test-https_server \ +- test-sha256 test-aes test-x509v3 test-list test-rc4 ++RUN_TESTS= \ ++ test-list \ ++ test-md4 test-rc4 test-sha1 test-sha256 \ ++ test-milenage test-aes \ ++ test-crypto_module ++ ++ALL=$(RUN_TESTS) test-base64 test-https test-https_server + + include ../src/build.rules + +@@ -24,13 +26,27 @@ CFLAGS += -DCONFIG_IEEE80211R_AP + CFLAGS += -DCONFIG_IEEE80211R + CFLAGS += -DCONFIG_TDLS + ++# test-crypto_module ++CFLAGS += -DCONFIG_MODULE_TESTS ++CFLAGS += -DCONFIG_DPP ++#CFLAGS += -DCONFIG_DPP2 ++#CFLAGS += -DCONFIG_DPP3 ++CFLAGS += -DCONFIG_ECC ++CFLAGS += -DCONFIG_HMAC_SHA256_KDF ++CFLAGS += -DCONFIG_HMAC_SHA384_KDF ++CFLAGS += -DCONFIG_MESH ++CFLAGS += -DCONFIG_SHA256 ++CFLAGS += -DCONFIG_SHA384 ++CFLAGS += -DEAP_PSK ++CFLAGS += -DEAP_FAST ++ + CFLAGS += -I../src + CFLAGS += -I../src/utils + + SLIBS = ../src/utils/libutils.a + +-DLIBS = ../src/crypto/libcrypto.a \ +- ../src/tls/libtls.a ++DLIBS = ../src/tls/libtls.a \ ++ ../src/crypto/libcrypto.a + + _OBJS_VAR := LLIBS + include ../src/objs.mk +@@ -42,12 +58,43 @@ include ../src/objs.mk + LIBS = $(SLIBS) $(DLIBS) + LLIBS = -Wl,--start-group $(DLIBS) -Wl,--end-group $(SLIBS) + ++ifeq ($(CONFIG_TLS),mbedtls) ++CFLAGS += -DCONFIG_TLS_MBEDTLS ++LLIBS += -lmbedtls -lmbedx509 -lmbedcrypto ++else ++ifeq ($(CONFIG_TLS),openssl) ++CFLAGS += -DCONFIG_TLS_OPENSSL ++LLIBS += -lssl -lcrypto ++else ++ifeq ($(CONFIG_TLS),gnutls) ++CFLAGS += -DCONFIG_TLS_GNUTLS ++LLIBS += -lgnutls -lgpg-error -lgcrypt ++else ++ifeq ($(CONFIG_TLS),wolfssl) ++CFLAGS += -DCONFIG_TLS_WOLFSSL ++LLIBS += -lwolfssl -lm ++else ++CFLAGS += -DCONFIG_TLS_INTERNAL ++CFLAGS += -DCONFIG_TLS_INTERNAL_SERVER ++ALL += test-rsa-sig-ver ++ALL += test-x509v3 ++clean-config_tls_internal: ++ rm -f test_x509v3_nist.out.* ++ rm -f test_x509v3_nist2.out.* ++endif ++endif ++endif ++endif ++ + # glibc < 2.17 needs -lrt for clock_gettime() + LLIBS += -lrt + + test-aes: $(call BUILDOBJ,test-aes.o) $(LIBS) + $(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS) + ++test-crypto_module: $(call BUILDOBJ,test-crypto_module.o) $(LIBS) ++ $(LDO) $(LDFLAGS) -o $@ $< $(LLIBS) ++ + test-base64: $(call BUILDOBJ,test-base64.o) $(LIBS) + $(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS) + +@@ -83,17 +130,11 @@ test-x509v3: $(call BUILDOBJ,test-x509v3 + + + run-tests: $(ALL) +- ./test-aes +- ./test-list +- ./test-md4 +- ./test-milenage +- ./test-rsa-sig-ver +- ./test-sha1 +- ./test-sha256 ++ @set -ex; for i in $(RUN_TESTS); do ./$$i; done + @echo + @echo All tests completed successfully. + +-clean: common-clean ++clean: common-clean clean-config_tls_internal + rm -f *~ +- rm -f test_x509v3_nist.out.* +- rm -f test_x509v3_nist2.out.* ++ ++.PHONY: run-tests clean-config_tls_internal +--- a/tests/hwsim/example-hostapd.config ++++ b/tests/hwsim/example-hostapd.config +@@ -34,15 +34,7 @@ CONFIG_EAP_TNC=y + CFLAGS += -DTNC_CONFIG_FILE=\"tnc/tnc_config\" + LIBS += -rdynamic + CONFIG_EAP_UNAUTH_TLS=y +-ifeq ($(CONFIG_TLS), openssl) +-CONFIG_EAP_PWD=y +-endif +-ifeq ($(CONFIG_TLS), wolfssl) +-CONFIG_EAP_PWD=y +-endif +-ifeq ($(CONFIG_TLS), mbedtls) +-CONFIG_EAP_PWD=y +-endif ++CONFIG_EAP_PWD=$(if $(filter openssl wolfssl mbedtls,$(CONFIG_TLS)),y,) + CONFIG_EAP_EKE=y + CONFIG_PKCS12=y + CONFIG_RADIUS_SERVER=y +@@ -89,6 +81,7 @@ CFLAGS += -DCONFIG_RADIUS_TEST + CONFIG_MODULE_TESTS=y + + CONFIG_SUITEB=y ++CONFIG_SUITEB192=$(if $(filter openssl mbedtls,$(CONFIG_TLS)),y,) + + # AddressSanitizer (ASan) can be enabled by uncommenting the following lines. + # This can be used as a more efficient memory error detector than valgrind +--- a/tests/hwsim/example-wpa_supplicant.config ++++ b/tests/hwsim/example-wpa_supplicant.config +@@ -35,16 +35,7 @@ LIBS += -rdynamic + CONFIG_EAP_FAST=y + CONFIG_EAP_TEAP=y + CONFIG_EAP_IKEV2=y +- +-ifeq ($(CONFIG_TLS), openssl) +-CONFIG_EAP_PWD=y +-endif +-ifeq ($(CONFIG_TLS), wolfssl) +-CONFIG_EAP_PWD=y +-endif +-ifeq ($(CONFIG_TLS), mbedtls) +-CONFIG_EAP_PWD=y +-endif ++CONFIG_EAP_PWD=$(if $(filter openssl wolfssl mbedtls,$(CONFIG_TLS)),y,) + + CONFIG_USIM_SIMULATOR=y + CONFIG_SIM_SIMULATOR=y +@@ -137,6 +128,7 @@ CONFIG_TESTING_OPTIONS=y + CONFIG_MODULE_TESTS=y + + CONFIG_SUITEB=y ++CONFIG_SUITEB192=$(if $(filter openssl mbedtls,$(CONFIG_TLS)),y,) + + # AddressSanitizer (ASan) can be enabled by uncommenting the following lines. + # This can be used as a more efficient memory error detector than valgrind +--- a/tests/hwsim/test_ap_eap.py ++++ b/tests/hwsim/test_ap_eap.py +@@ -42,20 +42,42 @@ def check_eap_capa(dev, method): + res = dev.get_capability("eap") + if method not in res: + raise HwsimSkip("EAP method %s not supported in the build" % method) ++ if method == "FAST" or method == "TEAP": ++ tls = dev.request("GET tls_library") ++ if tls.startswith("mbed TLS"): ++ raise HwsimSkip("EAP-%s not supported with this TLS library: " % method + tls) + + def check_subject_match_support(dev): + tls = dev.request("GET tls_library") +- if not tls.startswith("OpenSSL") and not tls.startswith("wolfSSL"): ++ if tls.startswith("OpenSSL"): ++ return ++ elif tls.startswith("wolfSSL"): ++ return ++ elif tls.startswith("mbed TLS"): ++ return ++ else: + raise HwsimSkip("subject_match not supported with this TLS library: " + tls) + + def check_check_cert_subject_support(dev): + tls = dev.request("GET tls_library") +- if not tls.startswith("OpenSSL") and not tls.startswith("wolfSSL"): ++ if tls.startswith("OpenSSL"): ++ return ++ elif tls.startswith("wolfSSL"): ++ return ++ elif tls.startswith("mbed TLS"): ++ return ++ else: + raise HwsimSkip("check_cert_subject not supported with this TLS library: " + tls) + + def check_altsubject_match_support(dev): + tls = dev.request("GET tls_library") +- if not tls.startswith("OpenSSL") and not tls.startswith("wolfSSL"): ++ if tls.startswith("OpenSSL"): ++ return ++ elif tls.startswith("wolfSSL"): ++ return ++ elif tls.startswith("mbed TLS"): ++ return ++ else: + raise HwsimSkip("altsubject_match not supported with this TLS library: " + tls) + + def check_domain_match(dev): +@@ -70,7 +92,13 @@ def check_domain_suffix_match(dev): + + def check_domain_match_full(dev): + tls = dev.request("GET tls_library") +- if not tls.startswith("OpenSSL") and not tls.startswith("wolfSSL"): ++ if tls.startswith("OpenSSL"): ++ return ++ elif tls.startswith("wolfSSL"): ++ return ++ elif tls.startswith("mbed TLS"): ++ return ++ else: + raise HwsimSkip("domain_suffix_match requires full match with this TLS library: " + tls) + + def check_cert_probe_support(dev): +@@ -79,8 +107,15 @@ def check_cert_probe_support(dev): + raise HwsimSkip("Certificate probing not supported with this TLS library: " + tls) + + def check_ext_cert_check_support(dev): ++ if not openssl_imported: ++ raise HwsimSkip("OpenSSL python method not available") ++ + tls = dev.request("GET tls_library") +- if not tls.startswith("OpenSSL"): ++ if tls.startswith("OpenSSL"): ++ return ++ elif tls.startswith("mbed TLS"): ++ return ++ else: + raise HwsimSkip("ext_cert_check not supported with this TLS library: " + tls) + + def check_ocsp_support(dev): +@@ -91,14 +126,18 @@ def check_ocsp_support(dev): + # raise HwsimSkip("OCSP not supported with this TLS library: " + tls) + #if tls.startswith("wolfSSL"): + # raise HwsimSkip("OCSP not supported with this TLS library: " + tls) ++ if tls.startswith("mbed TLS"): ++ raise HwsimSkip("OCSP not supported with this TLS library: " + tls) + + def check_pkcs5_v15_support(dev): + tls = dev.request("GET tls_library") +- if "BoringSSL" in tls or "GnuTLS" in tls: ++ if "BoringSSL" in tls or "GnuTLS" in tls or "mbed TLS" in tls: + raise HwsimSkip("PKCS#5 v1.5 not supported with this TLS library: " + tls) + + def check_tls13_support(dev): + tls = dev.request("GET tls_library") ++ if tls.startswith("mbed TLS"): ++ raise HwsimSkip("TLS v1.3 not supported") + if "run=OpenSSL 1.1.1" not in tls and "run=OpenSSL 3.0" not in tls and "wolfSSL" not in tls: + raise HwsimSkip("TLS v1.3 not supported") + +@@ -118,11 +157,15 @@ def check_pkcs12_support(dev): + # raise HwsimSkip("PKCS#12 not supported with this TLS library: " + tls) + if tls.startswith("wolfSSL"): + raise HwsimSkip("PKCS#12 not supported with this TLS library: " + tls) ++ if tls.startswith("mbed TLS"): ++ raise HwsimSkip("PKCS#12 not supported with this TLS library: " + tls) + + def check_dh_dsa_support(dev): + tls = dev.request("GET tls_library") + if tls.startswith("internal"): + raise HwsimSkip("DH DSA not supported with this TLS library: " + tls) ++ if tls.startswith("mbed TLS"): ++ raise HwsimSkip("DH DSA not supported with this TLS library: " + tls) + + def check_ec_support(dev): + tls = dev.request("GET tls_library") +@@ -1595,7 +1638,7 @@ def test_ap_wpa2_eap_ttls_pap_subject_ma + eap_connect(dev[0], hapd, "TTLS", "pap user", + anonymous_identity="ttls", password="password", + ca_cert="auth_serv/ca.pem", phase2="auth=PAP", +- subject_match="/C=FI/O=w1.fi/CN=server.w1.fi", ++ check_cert_subject="/C=FI/O=w1.fi/CN=server.w1.fi", + altsubject_match="EMAIL:noone@example.com;DNS:server.w1.fi;URI:http://example.com/") + eap_reauth(dev[0], "TTLS") + +@@ -2830,6 +2873,7 @@ def test_ap_wpa2_eap_tls_neg_domain_matc + + def test_ap_wpa2_eap_tls_neg_subject_match(dev, apdev): + """WPA2-Enterprise negative test - subject mismatch""" ++ check_subject_match_support(dev[0]) + params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap") + hostapd.add_ap(apdev[0], params) + dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS", +@@ -2890,6 +2934,7 @@ def test_ap_wpa2_eap_tls_neg_subject_mat + + def test_ap_wpa2_eap_tls_neg_altsubject_match(dev, apdev): + """WPA2-Enterprise negative test - altsubject mismatch""" ++ check_altsubject_match_support(dev[0]) + params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap") + hostapd.add_ap(apdev[0], params) + +@@ -3430,7 +3475,7 @@ def test_ap_wpa2_eap_ikev2_oom(dev, apde + dev[0].request("REMOVE_NETWORK all") + + tls = dev[0].request("GET tls_library") +- if not tls.startswith("wolfSSL"): ++ if not tls.startswith("wolfSSL") and not tls.startswith("mbed TLS"): + tests = [(1, "os_get_random;dh_init")] + else: + tests = [(1, "crypto_dh_init;dh_init")] +@@ -4744,7 +4789,7 @@ def test_ap_wpa2_eap_tls_intermediate_ca + params["private_key"] = "auth_serv/iCA-server/server.key" + hostapd.add_ap(apdev[0], params) + tls = dev[0].request("GET tls_library") +- if "GnuTLS" in tls or "wolfSSL" in tls: ++ if "GnuTLS" in tls or "wolfSSL" in tls or "mbed TLS" in tls: + ca_cert = "auth_serv/iCA-user/ca-and-root.pem" + client_cert = "auth_serv/iCA-user/user_and_ica.pem" + else: +@@ -4810,6 +4855,7 @@ def test_ap_wpa2_eap_tls_intermediate_ca + run_ap_wpa2_eap_tls_intermediate_ca_ocsp(dev, apdev, params, "-sha1") + + def run_ap_wpa2_eap_tls_intermediate_ca_ocsp(dev, apdev, params, md): ++ check_ocsp_support(dev[0]) + params = int_eap_server_params() + params["ca_cert"] = "auth_serv/iCA-server/ca-and-root.pem" + params["server_cert"] = "auth_serv/iCA-server/server.pem" +@@ -4819,7 +4865,7 @@ def run_ap_wpa2_eap_tls_intermediate_ca_ + try: + hostapd.add_ap(apdev[0], params) + tls = dev[0].request("GET tls_library") +- if "GnuTLS" in tls or "wolfSSL" in tls: ++ if "GnuTLS" in tls or "wolfSSL" in tls or "mbed TLS" in tls: + ca_cert = "auth_serv/iCA-user/ca-and-root.pem" + client_cert = "auth_serv/iCA-user/user_and_ica.pem" + else: +@@ -4855,7 +4901,7 @@ def run_ap_wpa2_eap_tls_intermediate_ca_ + try: + hostapd.add_ap(apdev[0], params) + tls = dev[0].request("GET tls_library") +- if "GnuTLS" in tls or "wolfSSL" in tls: ++ if "GnuTLS" in tls or "wolfSSL" in tls or "mbed TLS" in tls: + ca_cert = "auth_serv/iCA-user/ca-and-root.pem" + client_cert = "auth_serv/iCA-user/user_and_ica.pem" + else: +@@ -4905,7 +4951,7 @@ def test_ap_wpa2_eap_tls_intermediate_ca + try: + hostapd.add_ap(apdev[0], params) + tls = dev[0].request("GET tls_library") +- if "GnuTLS" in tls or "wolfSSL" in tls: ++ if "GnuTLS" in tls or "wolfSSL" in tls or "mbed TLS" in tls: + ca_cert = "auth_serv/iCA-user/ca-and-root.pem" + client_cert = "auth_serv/iCA-user/user_and_ica.pem" + else: +@@ -4972,7 +5018,7 @@ def test_ap_wpa2_eap_tls_intermediate_ca + + hostapd.add_ap(apdev[0], params) + tls = dev[0].request("GET tls_library") +- if "GnuTLS" in tls or "wolfSSL" in tls: ++ if "GnuTLS" in tls or "wolfSSL" in tls or "mbed TLS" in tls: + ca_cert = "auth_serv/iCA-user/ca-and-root.pem" + client_cert = "auth_serv/iCA-user/user_and_ica.pem" + else: +@@ -5230,6 +5276,7 @@ def test_ap_wpa2_eap_ttls_server_cert_ek + + def test_ap_wpa2_eap_ttls_server_pkcs12(dev, apdev): + """WPA2-Enterprise using EAP-TTLS and server PKCS#12 file""" ++ check_pkcs12_support(dev[0]) + skip_with_fips(dev[0]) + params = int_eap_server_params() + del params["server_cert"] +@@ -5242,6 +5289,7 @@ def test_ap_wpa2_eap_ttls_server_pkcs12( + + def test_ap_wpa2_eap_ttls_server_pkcs12_extra(dev, apdev): + """EAP-TTLS and server PKCS#12 file with extra certs""" ++ check_pkcs12_support(dev[0]) + skip_with_fips(dev[0]) + params = int_eap_server_params() + del params["server_cert"] +@@ -5264,6 +5312,7 @@ def test_ap_wpa2_eap_ttls_dh_params_serv + + def test_ap_wpa2_eap_ttls_dh_params_dsa_server(dev, apdev): + """WPA2-Enterprise using EAP-TTLS and alternative server dhparams (DSA)""" ++ check_dh_dsa_support(dev[0]) + params = int_eap_server_params() + params["dh_file"] = "auth_serv/dsaparam.pem" + hapd = hostapd.add_ap(apdev[0], params) +@@ -5575,8 +5624,8 @@ def test_ap_wpa2_eap_non_ascii_identity2 + def test_openssl_cipher_suite_config_wpas(dev, apdev): + """OpenSSL cipher suite configuration on wpa_supplicant""" + tls = dev[0].request("GET tls_library") +- if not tls.startswith("OpenSSL"): +- raise HwsimSkip("TLS library is not OpenSSL: " + tls) ++ if not tls.startswith("OpenSSL") and not tls.startswith("mbed TLS"): ++ raise HwsimSkip("TLS library is not OpenSSL or mbed TLS: " + tls) + params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap") + hapd = hostapd.add_ap(apdev[0], params) + eap_connect(dev[0], hapd, "TTLS", "pap user", +@@ -5602,14 +5651,14 @@ def test_openssl_cipher_suite_config_wpa + def test_openssl_cipher_suite_config_hapd(dev, apdev): + """OpenSSL cipher suite configuration on hostapd""" + tls = dev[0].request("GET tls_library") +- if not tls.startswith("OpenSSL"): +- raise HwsimSkip("wpa_supplicant TLS library is not OpenSSL: " + tls) ++ if not tls.startswith("OpenSSL") and not tls.startswith("mbed TLS"): ++ raise HwsimSkip("wpa_supplicant TLS library is not OpenSSL or mbed TLS: " + tls) + params = int_eap_server_params() + params['openssl_ciphers'] = "AES256" + hapd = hostapd.add_ap(apdev[0], params) + tls = hapd.request("GET tls_library") +- if not tls.startswith("OpenSSL"): +- raise HwsimSkip("hostapd TLS library is not OpenSSL: " + tls) ++ if not tls.startswith("OpenSSL") and not tls.startswith("mbed TLS"): ++ raise HwsimSkip("hostapd TLS library is not OpenSSL or mbed TLS: " + tls) + eap_connect(dev[0], hapd, "TTLS", "pap user", + anonymous_identity="ttls", password="password", + ca_cert="auth_serv/ca.pem", phase2="auth=PAP") +@@ -6051,13 +6100,17 @@ def test_ap_wpa2_eap_tls_versions(dev, a + check_tls_ver(dev[0], hapd, + "tls_disable_tlsv1_0=1 tls_disable_tlsv1_1=1", + "TLSv1.2") +- elif tls.startswith("internal"): ++ elif tls.startswith("internal") or tls.startswith("mbed TLS"): + check_tls_ver(dev[0], hapd, + "tls_disable_tlsv1_0=1 tls_disable_tlsv1_1=1", "TLSv1.2") +- check_tls_ver(dev[1], hapd, +- "tls_disable_tlsv1_0=1 tls_disable_tlsv1_1=0 tls_disable_tlsv1_2=1", "TLSv1.1") +- check_tls_ver(dev[2], hapd, +- "tls_disable_tlsv1_0=0 tls_disable_tlsv1_1=1 tls_disable_tlsv1_2=1", "TLSv1") ++ if tls.startswith("mbed TLS"): ++ check_tls_ver(dev[2], hapd, ++ "tls_disable_tlsv1_0=0 tls_disable_tlsv1_1=1 tls_disable_tlsv1_2=1", "TLSv1.0") ++ else: ++ check_tls_ver(dev[1], hapd, ++ "tls_disable_tlsv1_0=1 tls_disable_tlsv1_1=0 tls_disable_tlsv1_2=1", "TLSv1.1") ++ check_tls_ver(dev[2], hapd, ++ "tls_disable_tlsv1_0=0 tls_disable_tlsv1_1=1 tls_disable_tlsv1_2=1", "TLSv1") + if "run=OpenSSL 1.1.1" in tls or "run=OpenSSL 3.0" in tls: + check_tls_ver(dev[0], hapd, + "tls_disable_tlsv1_0=1 tls_disable_tlsv1_1=1 tls_disable_tlsv1_2=1 tls_disable_tlsv1_3=0", "TLSv1.3") +@@ -6079,6 +6132,11 @@ def test_ap_wpa2_eap_tls_versions_server + tests = [("TLSv1", "[ENABLE-TLSv1.0][DISABLE-TLSv1.1][DISABLE-TLSv1.2][DISABLE-TLSv1.3]"), + ("TLSv1.1", "[ENABLE-TLSv1.0][ENABLE-TLSv1.1][DISABLE-TLSv1.2][DISABLE-TLSv1.3]"), + ("TLSv1.2", "[ENABLE-TLSv1.0][ENABLE-TLSv1.1][ENABLE-TLSv1.2][DISABLE-TLSv1.3]")] ++ tls = dev[0].request("GET tls_library") ++ if tls.startswith("mbed TLS"): ++ tests = [#("TLSv1.0", "[ENABLE-TLSv1.0][DISABLE-TLSv1.1][DISABLE-TLSv1.2][DISABLE-TLSv1.3]"), ++ #("TLSv1.1", "[ENABLE-TLSv1.0][ENABLE-TLSv1.1][DISABLE-TLSv1.2][DISABLE-TLSv1.3]"), ++ ("TLSv1.2", "[ENABLE-TLSv1.0][ENABLE-TLSv1.1][ENABLE-TLSv1.2][DISABLE-TLSv1.3]")] + for exp, flags in tests: + hapd.disable() + hapd.set("tls_flags", flags) +@@ -7138,6 +7196,7 @@ def test_ap_wpa2_eap_assoc_rsn(dev, apde + def test_eap_tls_ext_cert_check(dev, apdev): + """EAP-TLS and external server certification validation""" + # With internal server certificate chain validation ++ check_ext_cert_check_support(dev[0]) + id = dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TLS", + identity="tls user", + ca_cert="auth_serv/ca.pem", +@@ -7150,6 +7209,7 @@ def test_eap_tls_ext_cert_check(dev, apd + def test_eap_ttls_ext_cert_check(dev, apdev): + """EAP-TTLS and external server certification validation""" + # Without internal server certificate chain validation ++ check_ext_cert_check_support(dev[0]) + id = dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS", + identity="pap user", anonymous_identity="ttls", + password="password", phase2="auth=PAP", +@@ -7160,6 +7220,7 @@ def test_eap_ttls_ext_cert_check(dev, ap + def test_eap_peap_ext_cert_check(dev, apdev): + """EAP-PEAP and external server certification validation""" + # With internal server certificate chain validation ++ check_ext_cert_check_support(dev[0]) + id = dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="PEAP", + identity="user", anonymous_identity="peap", + ca_cert="auth_serv/ca.pem", +@@ -7170,6 +7231,7 @@ def test_eap_peap_ext_cert_check(dev, ap + + def test_eap_fast_ext_cert_check(dev, apdev): + """EAP-FAST and external server certification validation""" ++ check_ext_cert_check_support(dev[0]) + check_eap_capa(dev[0], "FAST") + # With internal server certificate chain validation + dev[0].request("SET blob fast_pac_auth_ext ") +@@ -7184,10 +7246,6 @@ def test_eap_fast_ext_cert_check(dev, ap + run_ext_cert_check(dev, apdev, id) + + def run_ext_cert_check(dev, apdev, net_id): +- check_ext_cert_check_support(dev[0]) +- if not openssl_imported: +- raise HwsimSkip("OpenSSL python method not available") +- + params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap") + hapd = hostapd.add_ap(apdev[0], params) + +--- a/tests/hwsim/test_ap_ft.py ++++ b/tests/hwsim/test_ap_ft.py +@@ -2474,11 +2474,11 @@ def test_ap_ft_ap_oom5(dev, apdev): + # This will fail to roam + dev[0].roam(bssid1, check_bssid=False) + +- with fail_test(hapd1, 1, "sha256_prf_bits;wpa_pmk_r1_to_ptk;wpa_ft_process_auth_req"): ++ with fail_test(hapd1, 1, "sha256_prf;wpa_pmk_r1_to_ptk;wpa_ft_process_auth_req"): + # This will fail to roam + dev[0].roam(bssid1, check_bssid=False) + +- with fail_test(hapd1, 3, "wpa_pmk_r1_to_ptk;wpa_ft_process_auth_req"): ++ with fail_test(hapd1, 2, "wpa_pmk_r1_to_ptk;wpa_ft_process_auth_req"): + # This will fail to roam + dev[0].roam(bssid1, check_bssid=False) + +--- a/tests/hwsim/test_authsrv.py ++++ b/tests/hwsim/test_authsrv.py +@@ -156,9 +156,12 @@ def test_authsrv_oom(dev, apdev): + if "FAIL" not in authsrv.request("ENABLE"): + raise Exception("ENABLE succeeded during OOM") + +- with alloc_fail(authsrv, 1, "tls_init;authsrv_init"): +- if "FAIL" not in authsrv.request("ENABLE"): +- raise Exception("ENABLE succeeded during OOM") ++ # tls_mbedtls.c:tls_init() does not alloc memory (no alloc fail trigger) ++ tls = dev[0].request("GET tls_library") ++ if not tls.startswith("mbed TLS"): ++ with alloc_fail(authsrv, 1, "tls_init;authsrv_init"): ++ if "FAIL" not in authsrv.request("ENABLE"): ++ raise Exception("ENABLE succeeded during OOM") + + for count in range(1, 3): + with alloc_fail(authsrv, count, "eap_sim_db_init;authsrv_init"): +--- a/tests/hwsim/test_dpp.py ++++ b/tests/hwsim/test_dpp.py +@@ -39,7 +39,8 @@ def check_dpp_capab(dev, brainpool=False + raise HwsimSkip("DPP not supported") + if brainpool: + tls = dev.request("GET tls_library") +- if (not tls.startswith("OpenSSL") or "run=BoringSSL" in tls) and not tls.startswith("wolfSSL"): ++ if (not tls.startswith("OpenSSL") or "run=BoringSSL" in tls) and not tls.startswith("wolfSSL") \ ++ and not tls.startswith("mbed TLS"): + raise HwsimSkip("Crypto library does not support Brainpool curves: " + tls) + capa = dev.request("GET_CAPABILITY dpp") + ver = 1 +@@ -3892,6 +3893,9 @@ def test_dpp_proto_auth_req_no_i_proto_k + + def test_dpp_proto_auth_req_invalid_i_proto_key(dev, apdev): + """DPP protocol testing - invalid I-proto key in Auth Req""" ++ tls = dev[0].request("GET tls_library") ++ if tls.startswith("mbed TLS"): ++ raise HwsimSkip("mbed TLS crypto_ecdh_set_peerkey() properly detects invalid key; no response") + run_dpp_proto_auth_req_missing(dev, 66, "Invalid Initiator Protocol Key") + + def test_dpp_proto_auth_req_no_i_nonce(dev, apdev): +@@ -3987,7 +3991,12 @@ def test_dpp_proto_auth_resp_no_r_proto_ + + def test_dpp_proto_auth_resp_invalid_r_proto_key(dev, apdev): + """DPP protocol testing - invalid R-Proto Key in Auth Resp""" +- run_dpp_proto_auth_resp_missing(dev, 67, "Invalid Responder Protocol Key") ++ tls = dev[0].request("GET tls_library") ++ if tls.startswith("mbed TLS"): ++ # mbed TLS crypto_ecdh_set_peerkey() properly detects invalid key ++ run_dpp_proto_auth_resp_missing(dev, 67, "Failed to derive ECDH shared secret") ++ else: ++ run_dpp_proto_auth_resp_missing(dev, 67, "Invalid Responder Protocol Key") + + def test_dpp_proto_auth_resp_no_r_nonce(dev, apdev): + """DPP protocol testing - no R-nonce in Auth Resp""" +@@ -4349,11 +4358,17 @@ def test_dpp_proto_pkex_exchange_resp_in + + def test_dpp_proto_pkex_cr_req_invalid_bootstrap_key(dev, apdev): + """DPP protocol testing - invalid Bootstrap Key in PKEX Commit-Reveal Request""" ++ tls = dev[0].request("GET tls_library") ++ if tls.startswith("mbed TLS"): ++ raise HwsimSkip("mbed TLS crypto_ecdh_set_peerkey() properly detects invalid key; no response") + run_dpp_proto_pkex_req_missing(dev, 47, + "Peer bootstrapping key is invalid") + + def test_dpp_proto_pkex_cr_resp_invalid_bootstrap_key(dev, apdev): + """DPP protocol testing - invalid Bootstrap Key in PKEX Commit-Reveal Response""" ++ tls = dev[0].request("GET tls_library") ++ if tls.startswith("mbed TLS"): ++ raise HwsimSkip("mbed TLS crypto_ecdh_set_peerkey() properly detects invalid key; no response") + run_dpp_proto_pkex_resp_missing(dev, 48, + "Peer bootstrapping key is invalid") + +--- a/tests/hwsim/test_erp.py ++++ b/tests/hwsim/test_erp.py +@@ -12,7 +12,7 @@ import time + + import hostapd + from utils import * +-from test_ap_eap import int_eap_server_params, check_tls13_support ++from test_ap_eap import int_eap_server_params, check_tls13_support, check_eap_capa + from test_ap_psk import find_wpas_process, read_process_memory, verify_not_present, get_key_locations + + def test_erp_initiate_reauth_start(dev, apdev): +@@ -276,6 +276,7 @@ def test_erp_radius_eap_methods(dev, apd + params['erp_domain'] = 'example.com' + params['disable_pmksa_caching'] = '1' + hapd = hostapd.add_ap(apdev[0], params) ++ tls = dev[0].request("GET tls_library") + + erp_test(dev[0], hapd, eap="AKA", identity="0232010000000000@example.com", + password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123") +@@ -289,7 +290,7 @@ def test_erp_radius_eap_methods(dev, apd + password="5122250214c33e723a5dd523fc145fc0:981d464c7c52eb6e5036234984ad0bcf:000000000123") + erp_test(dev[0], hapd, eap="EKE", identity="erp-eke@example.com", + password="hello") +- if "FAST" in eap_methods: ++ if "FAST" in eap_methods and check_eap_capa(dev[0], "FAST"): + erp_test(dev[0], hapd, eap="FAST", identity="erp-fast@example.com", + password="password", ca_cert="auth_serv/ca.pem", + phase2="auth=GTC", +@@ -301,13 +302,14 @@ def test_erp_radius_eap_methods(dev, apd + password="password") + erp_test(dev[0], hapd, eap="PAX", identity="erp-pax@example.com", + password_hex="0123456789abcdef0123456789abcdef") +- if "MSCHAPV2" in eap_methods: ++ if "MSCHAPV2" in eap_methods and check_eap_capa(dev[0], "MSCHAPV2"): + erp_test(dev[0], hapd, eap="PEAP", identity="erp-peap@example.com", + password="password", ca_cert="auth_serv/ca.pem", + phase2="auth=MSCHAPV2") +- erp_test(dev[0], hapd, eap="TEAP", identity="erp-teap@example.com", +- password="password", ca_cert="auth_serv/ca.pem", +- phase2="auth=MSCHAPV2", pac_file="blob://teap_pac") ++ if check_eap_capa(dev[0], "TEAP"): ++ erp_test(dev[0], hapd, eap="TEAP", identity="erp-teap@example.com", ++ password="password", ca_cert="auth_serv/ca.pem", ++ phase2="auth=MSCHAPV2", pac_file="blob://teap_pac") + erp_test(dev[0], hapd, eap="PSK", identity="erp-psk@example.com", + password_hex="0123456789abcdef0123456789abcdef") + if "PWD" in eap_methods: +@@ -640,7 +642,7 @@ def test_erp_local_errors(dev, apdev): + dev[0].request("REMOVE_NETWORK all") + dev[0].wait_disconnected() + +- for count in range(1, 6): ++ for count in range(1, 4): + dev[0].request("ERP_FLUSH") + with fail_test(dev[0], count, "hmac_sha256_kdf;eap_peer_erp_init"): + dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS", +--- a/tests/hwsim/test_fils.py ++++ b/tests/hwsim/test_fils.py +@@ -1422,7 +1422,10 @@ def run_fils_sk_pfs(dev, apdev, group, p + check_erp_capa(dev[0]) + + tls = dev[0].request("GET tls_library") +- if not tls.startswith("wolfSSL"): ++ if tls.startswith("mbed TLS"): ++ if int(group) == 27: ++ raise HwsimSkip("Brainpool EC group 27 not supported by mbed TLS") ++ elif not tls.startswith("wolfSSL"): + if int(group) in [25]: + if not (tls.startswith("OpenSSL") and ("build=OpenSSL 1.0.2" in tls or "build=OpenSSL 1.1" in tls or "build=OpenSSL 3.0" in tls) and ("run=OpenSSL 1.0.2" in tls or "run=OpenSSL 1.1" in tls or "run=OpenSSL 3.0" in tls)): + raise HwsimSkip("EC group not supported") +--- a/tests/hwsim/test_pmksa_cache.py ++++ b/tests/hwsim/test_pmksa_cache.py +@@ -955,7 +955,7 @@ def test_pmksa_cache_preauth_wpas_oom(de + eap_connect(dev[0], hapd, "PAX", "pax.user@example.com", + password_hex="0123456789abcdef0123456789abcdef", + bssid=apdev[0]['bssid']) +- for i in range(1, 11): ++ for i in range(1, 10): + with alloc_fail(dev[0], i, "rsn_preauth_init"): + res = dev[0].request("PREAUTH f2:11:22:33:44:55").strip() + logger.info("Iteration %d - PREAUTH command results: %s" % (i, res)) +@@ -963,7 +963,7 @@ def test_pmksa_cache_preauth_wpas_oom(de + state = dev[0].request('GET_ALLOC_FAIL') + if state.startswith('0:'): + break +- time.sleep(0.05) ++ time.sleep(0.10) + + def test_pmksa_cache_ctrl(dev, apdev): + """PMKSA cache control interface operations""" +--- a/tests/hwsim/test_sae.py ++++ b/tests/hwsim/test_sae.py +@@ -177,6 +177,11 @@ def test_sae_groups(dev, apdev): + if tls.startswith("OpenSSL") and "run=OpenSSL 1." in tls: + logger.info("Add Brainpool EC groups since OpenSSL is new enough") + sae_groups += [27, 28, 29, 30] ++ if tls.startswith("mbed TLS"): ++ # secp224k1 and secp224r1 (26) have prime p = 1 mod 4, and mbedtls ++ # does not have code to derive y from compressed format for those curves ++ sae_groups = [19, 25, 20, 21, 1, 2, 5, 14, 15, 16, 22, 23, 24] ++ sae_groups += [27, 28, 29, 30] + heavy_groups = [14, 15, 16] + suitable_groups = [15, 16, 17, 18, 19, 20, 21] + groups = [str(g) for g in sae_groups] +@@ -2193,6 +2198,8 @@ def run_sae_pwe_group(dev, apdev, group) + logger.info("Add Brainpool EC groups since OpenSSL is new enough") + elif tls.startswith("wolfSSL"): + logger.info("Make sure Brainpool EC groups were enabled when compiling wolfSSL") ++ elif tls.startswith("mbed TLS"): ++ logger.info("Make sure Brainpool EC groups were enabled when compiling mbed TLS") + else: + raise HwsimSkip("Brainpool curve not supported") + start_sae_pwe_ap(apdev[0], group, 2) +--- a/tests/hwsim/test_suite_b.py ++++ b/tests/hwsim/test_suite_b.py +@@ -27,6 +27,8 @@ def check_suite_b_tls_lib(dev, dhe=False + return + if tls.startswith("wolfSSL"): + return ++ if tls.startswith("mbed TLS"): ++ return + if not tls.startswith("OpenSSL"): + raise HwsimSkip("TLS library not supported for Suite B: " + tls) + supported = False +@@ -520,6 +522,7 @@ def test_suite_b_192_rsa_insufficient_dh + + dev[0].connect("test-suite-b", key_mgmt="WPA-EAP-SUITE-B-192", + ieee80211w="2", ++ openssl_ciphers="DHE-RSA-AES256-GCM-SHA384", + phase1="tls_suiteb=1", + eap="TLS", identity="tls user", + ca_cert="auth_serv/rsa3072-ca.pem", +--- a/tests/hwsim/test_wpas_ctrl.py ++++ b/tests/hwsim/test_wpas_ctrl.py +@@ -1842,7 +1842,7 @@ def _test_wpas_ctrl_oom(dev): + tls = dev[0].request("GET tls_library") + if not tls.startswith("internal"): + tests.append(('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', 'FAIL', +- 4, 'wpas_ctrl_nfc_get_handover_sel_p2p')) ++ 3, 'wpas_ctrl_nfc_get_handover_sel_p2p')) + for cmd, exp, count, func in tests: + with alloc_fail(dev[0], count, func): + res = dev[0].request(cmd) +--- a/tests/hwsim/utils.py ++++ b/tests/hwsim/utils.py +@@ -141,7 +141,13 @@ def check_imsi_privacy_support(dev): + + def check_tls_tod(dev): + tls = dev.request("GET tls_library") +- if not tls.startswith("OpenSSL") and not tls.startswith("internal"): ++ if tls.startswith("OpenSSL"): ++ return ++ elif tls.startswith("internal"): ++ return ++ elif tls.startswith("mbed TLS"): ++ return ++ else: + raise HwsimSkip("TLS TOD-TOFU/STRICT not supported with this TLS library: " + tls) + + def vht_supported(): +--- /dev/null ++++ b/tests/test-crypto_module.c +@@ -0,0 +1,16 @@ ++/* ++ * crypto module tests - test program ++ * Copyright (c) 2022, Glenn Strauss ++ * ++ * This software may be distributed under the terms of the BSD license. ++ * See README for more details. ++ */ ++ ++#include "utils/includes.h" ++#include "utils/module_tests.h" ++#include "crypto/crypto_module_tests.c" ++ ++int main(int argc, char *argv[]) ++{ ++ return crypto_module_tests(); ++} +--- a/tests/test-https.c ++++ b/tests/test-https.c +@@ -75,7 +75,7 @@ static int https_client(int s, const cha + struct tls_connection *conn; + struct wpabuf *in, *out, *appl; + int res = -1; +- int need_more_data; ++ int need_more_data = 0; + + os_memset(&conf, 0, sizeof(conf)); + conf.event_cb = https_tls_event_cb; +@@ -93,8 +93,12 @@ static int https_client(int s, const cha + + for (;;) { + appl = NULL; ++#ifdef CONFIG_TLS_INTERNAL_SERVER + out = tls_connection_handshake2(tls, conn, in, &appl, + &need_more_data); ++#else ++ out = tls_connection_handshake(tls, conn, in, &appl); ++#endif + wpabuf_free(in); + in = NULL; + if (out == NULL) { +@@ -152,11 +156,15 @@ static int https_client(int s, const cha + + wpa_printf(MSG_INFO, "Reading HTTP response"); + for (;;) { +- int need_more_data; ++ int need_more_data = 0; + in = https_recv(s); + if (in == NULL) + goto done; ++#ifdef CONFIG_TLS_INTERNAL_SERVER + out = tls_connection_decrypt2(tls, conn, in, &need_more_data); ++#else ++ out = tls_connection_decrypt(tls, conn, in); ++#endif + if (need_more_data) + wpa_printf(MSG_DEBUG, "HTTP: Need more data"); + wpabuf_free(in); +--- a/tests/test-https_server.c ++++ b/tests/test-https_server.c +@@ -67,10 +67,12 @@ static struct wpabuf * https_recv(int s, + } + + ++#ifdef CONFIG_TLS_INTERNAL_SERVER + static void https_tls_log_cb(void *ctx, const char *msg) + { + wpa_printf(MSG_DEBUG, "TLS: %s", msg); + } ++#endif + + + static int https_server(int s) +@@ -79,7 +81,7 @@ static int https_server(int s) + void *tls; + struct tls_connection_params params; + struct tls_connection *conn; +- struct wpabuf *in, *out, *appl; ++ struct wpabuf *in = NULL, *out = NULL, *appl = NULL; + int res = -1; + + os_memset(&conf, 0, sizeof(conf)); +@@ -106,7 +108,9 @@ static int https_server(int s) + return -1; + } + ++#ifdef CONFIG_TLS_INTERNAL_SERVER + tls_connection_set_log_cb(conn, https_tls_log_cb, NULL); ++#endif + + for (;;) { + in = https_recv(s, 5000); +@@ -147,12 +151,16 @@ static int https_server(int s) + + wpa_printf(MSG_INFO, "Reading HTTP request"); + for (;;) { +- int need_more_data; ++ int need_more_data = 0; + + in = https_recv(s, 5000); + if (!in) + goto done; ++#ifdef CONFIG_TLS_INTERNAL_SERVER + out = tls_connection_decrypt2(tls, conn, in, &need_more_data); ++#else ++ out = tls_connection_decrypt(tls, conn, in); ++#endif + wpabuf_free(in); + in = NULL; + if (need_more_data) { +--- a/wpa_supplicant/Makefile ++++ b/wpa_supplicant/Makefile +@@ -1122,6 +1122,7 @@ CFLAGS += -DCONFIG_TLSV12 + endif + + ifeq ($(CONFIG_TLS), wolfssl) ++CFLAGS += -DCONFIG_TLS_WOLFSSL + ifdef TLS_FUNCS + CFLAGS += -DWOLFSSL_DER_LOAD + OBJS += ../src/crypto/tls_wolfssl.o +@@ -1137,6 +1138,7 @@ LIBS_p += -lwolfssl -lm + endif + + ifeq ($(CONFIG_TLS), openssl) ++CFLAGS += -DCONFIG_TLS_OPENSSL + CFLAGS += -DCRYPTO_RSA_OAEP_SHA256 + ifdef TLS_FUNCS + CFLAGS += -DEAP_TLS_OPENSSL +@@ -1164,6 +1166,7 @@ CFLAGS += -DTLS_DEFAULT_CIPHERS=\"$(CONF + endif + + ifeq ($(CONFIG_TLS), mbedtls) ++CFLAGS += -DCONFIG_TLS_MBEDTLS + ifndef CONFIG_CRYPTO + CONFIG_CRYPTO=mbedtls + endif +@@ -1183,6 +1186,7 @@ endif + endif + + ifeq ($(CONFIG_TLS), gnutls) ++CFLAGS += -DCONFIG_TLS_GNUTLS + ifndef CONFIG_CRYPTO + # default to libgcrypt + CONFIG_CRYPTO=gnutls +@@ -1213,6 +1217,7 @@ endif + endif + + ifeq ($(CONFIG_TLS), internal) ++CFLAGS += -DCONFIG_TLS_INTERNAL + ifndef CONFIG_CRYPTO + CONFIG_CRYPTO=internal + endif +@@ -1293,6 +1298,7 @@ endif + endif + + ifeq ($(CONFIG_TLS), linux) ++CFLAGS += -DCONFIG_TLS_INTERNAL + OBJS += ../src/crypto/crypto_linux.o + OBJS_p += ../src/crypto/crypto_linux.o + ifdef TLS_FUNCS diff --git a/package/network/services/hostapd/patches/150-add-NULL-checks-encountered-during-tests-hwsim.patch b/package/network/services/hostapd/patches/150-add-NULL-checks-encountered-during-tests-hwsim.patch new file mode 100644 index 0000000000..c8c3ff33f4 --- /dev/null +++ b/package/network/services/hostapd/patches/150-add-NULL-checks-encountered-during-tests-hwsim.patch @@ -0,0 +1,45 @@ +From 33afce36c54b0cad38643629ded10ff5d727f077 Mon Sep 17 00:00:00 2001 +From: Glenn Strauss +Date: Fri, 12 Aug 2022 05:34:47 -0400 +Subject: [PATCH 5/7] add NULL checks (encountered during tests/hwsim) + +sae_derive_commit_element_ecc NULL pwe_ecc check +dpp_gen_keypair() NULL curve check + +Signed-off-by: Glenn Strauss +--- + src/common/dpp_crypto.c | 6 ++++++ + src/common/sae.c | 7 +++++++ + 2 files changed, 13 insertions(+) + +--- a/src/common/dpp_crypto.c ++++ b/src/common/dpp_crypto.c +@@ -269,6 +269,12 @@ int dpp_get_pubkey_hash(struct crypto_ec + + struct crypto_ec_key * dpp_gen_keypair(const struct dpp_curve_params *curve) + { ++ if (curve == NULL) { ++ wpa_printf(MSG_DEBUG, ++ "DPP: %s curve must be initialized", __func__); ++ return NULL; ++ } ++ + struct crypto_ec_key *key; + + wpa_printf(MSG_DEBUG, "DPP: Generating a keypair"); +--- a/src/common/sae.c ++++ b/src/common/sae.c +@@ -1278,6 +1278,13 @@ void sae_deinit_pt(struct sae_pt *pt) + static int sae_derive_commit_element_ecc(struct sae_data *sae, + struct crypto_bignum *mask) + { ++ if (sae->tmp->pwe_ecc == NULL) { ++ wpa_printf(MSG_DEBUG, ++ "SAE: %s sae->tmp->pwe_ecc must be initialized", ++ __func__); ++ return -1; ++ } ++ + /* COMMIT-ELEMENT = inverse(scalar-op(mask, PWE)) */ + if (!sae->tmp->own_commit_element_ecc) { + sae->tmp->own_commit_element_ecc = diff --git a/package/network/services/hostapd/patches/160-dpp_pkex-EC-point-mul-w-value-prime.patch b/package/network/services/hostapd/patches/160-dpp_pkex-EC-point-mul-w-value-prime.patch new file mode 100644 index 0000000000..db4fcfe235 --- /dev/null +++ b/package/network/services/hostapd/patches/160-dpp_pkex-EC-point-mul-w-value-prime.patch @@ -0,0 +1,26 @@ +From 54211caa2e0e5163aefef390daf88a971367a702 Mon Sep 17 00:00:00 2001 +From: Glenn Strauss +Date: Tue, 4 Oct 2022 17:09:24 -0400 +Subject: [PATCH 6/7] dpp_pkex: EC point mul w/ value < prime + +crypto_ec_point_mul() with mbedtls requires point +be multiplied by a multiplicand with value < prime + +Signed-off-by: Glenn Strauss +--- + src/common/dpp_crypto.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/src/common/dpp_crypto.c ++++ b/src/common/dpp_crypto.c +@@ -1588,7 +1588,9 @@ dpp_pkex_derive_Qr(const struct dpp_curv + Pr = crypto_ec_key_get_public_key(Pr_key); + Qr = crypto_ec_point_init(ec); + hash_bn = crypto_bignum_init_set(hash, curve->hash_len); +- if (!Pr || !Qr || !hash_bn || crypto_ec_point_mul(ec, Pr, hash_bn, Qr)) ++ if (!Pr || !Qr || !hash_bn || ++ crypto_bignum_mod(hash_bn, crypto_ec_get_prime(ec), hash_bn) || ++ crypto_ec_point_mul(ec, Pr, hash_bn, Qr)) + goto fail; + + if (crypto_ec_point_is_at_infinity(ec, Qr)) { diff --git a/package/network/services/hostapd/patches/170-hostapd-update-cfs0-and-cfs1-for-160MHz.patch b/package/network/services/hostapd/patches/170-hostapd-update-cfs0-and-cfs1-for-160MHz.patch new file mode 100644 index 0000000000..b0151b071f --- /dev/null +++ b/package/network/services/hostapd/patches/170-hostapd-update-cfs0-and-cfs1-for-160MHz.patch @@ -0,0 +1,141 @@ +From d4c4ef302f98fd6bce173b8636e7e350d8b44981 Mon Sep 17 00:00:00 2001 +From: P Praneesh +Date: Fri, 19 Mar 2021 12:17:27 +0530 +Subject: [PATCH] hostapd: update cfs0 and cfs1 for 160MHz + +As per standard Draft P802.11ax_D8.0,( Table 26-9—Setting +of the VHT Channel Width and VHT NSS at an HE STA +transmitting the OM Control subfield ), center frequency of +160MHz should be published in HT information subset 2 of +HT information when EXT NSS BW field is enabled. + +If the supported number of NSS in 160MHz is at least max NSS +support, then center_freq_seg0 indicates the center frequency of 80MHz and +center_freq_seg1 indicates the center frequency of 160MHz. + +If the supported number of NSS in 160MHz is less than max NSS +support, then center_freq_seg0 indicates the center frequency of 80MHz and +center_freq_seg1 is 0. The center frequency of 160MHz is published in HT +operation information element instead. + +Signed-off-by: P Praneesh +--- + hostapd/config_file.c | 2 ++ + src/ap/ieee802_11_ht.c | 7 +++++++ + src/ap/ieee802_11_vht.c | 16 ++++++++++++++++ + src/common/hw_features_common.c | 1 + + src/common/ieee802_11_defs.h | 1 + + 5 files changed, 27 insertions(+) + +--- a/hostapd/config_file.c ++++ b/hostapd/config_file.c +@@ -1153,6 +1153,8 @@ static int hostapd_config_vht_capab(stru + conf->vht_capab |= VHT_CAP_RX_ANTENNA_PATTERN; + if (os_strstr(capab, "[TX-ANTENNA-PATTERN]")) + conf->vht_capab |= VHT_CAP_TX_ANTENNA_PATTERN; ++ if (os_strstr(capab, "[EXT-NSS-BW-SUPP]")) ++ conf->vht_capab |= VHT_CAP_EXTENDED_NSS_BW_SUPPORT; + return 0; + } + #endif /* CONFIG_IEEE80211AC */ +--- a/src/ap/ieee802_11_ht.c ++++ b/src/ap/ieee802_11_ht.c +@@ -82,7 +82,9 @@ u8 * hostapd_eid_ht_capabilities(struct + u8 * hostapd_eid_ht_operation(struct hostapd_data *hapd, u8 *eid) + { + struct ieee80211_ht_operation *oper; ++ le32 vht_capabilities_info; + u8 *pos = eid; ++ u8 chwidth; + + if (!hapd->iconf->ieee80211n || hapd->conf->disable_11n || + is_6ghz_op_class(hapd->iconf->op_class)) +@@ -103,6 +105,13 @@ u8 * hostapd_eid_ht_operation(struct hos + oper->ht_param |= HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW | + HT_INFO_HT_PARAM_STA_CHNL_WIDTH; + ++ vht_capabilities_info = host_to_le32(hapd->iface->current_mode->vht_capab); ++ chwidth = hostapd_get_oper_chwidth(hapd->iconf); ++ if (vht_capabilities_info & VHT_CAP_EXTENDED_NSS_BW_SUPPORT ++ && ((chwidth == CHANWIDTH_160MHZ) || (chwidth == CHANWIDTH_80P80MHZ))) { ++ oper->operation_mode = host_to_le16(hapd->iconf->vht_oper_centr_freq_seg0_idx << 5); ++ } ++ + pos += sizeof(*oper); + + return pos; +--- a/src/ap/ieee802_11_vht.c ++++ b/src/ap/ieee802_11_vht.c +@@ -25,6 +25,7 @@ u8 * hostapd_eid_vht_capabilities(struct + struct ieee80211_vht_capabilities *cap; + struct hostapd_hw_modes *mode = hapd->iface->current_mode; + u8 *pos = eid; ++ u8 chwidth; + + if (!mode || is_6ghz_op_class(hapd->iconf->op_class)) + return eid; +@@ -62,6 +63,17 @@ u8 * hostapd_eid_vht_capabilities(struct + host_to_le32(nsts << VHT_CAP_BEAMFORMEE_STS_OFFSET); + } + ++ chwidth = hostapd_get_oper_chwidth(hapd->iconf); ++ if (((host_to_le32(mode->vht_capab)) & VHT_CAP_EXTENDED_NSS_BW_SUPPORT) ++ && ((chwidth == CHANWIDTH_160MHZ) || (chwidth == CHANWIDTH_80P80MHZ))) { ++ cap->vht_capabilities_info |= VHT_CAP_EXTENDED_NSS_BW_SUPPORT; ++ cap->vht_capabilities_info &= ~(host_to_le32(VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)); ++ cap->vht_capabilities_info &= ~(host_to_le32(VHT_CAP_SUPP_CHAN_WIDTH_160MHZ)); ++ cap->vht_capabilities_info &= ~(host_to_le32(VHT_CAP_SUPP_CHAN_WIDTH_MASK)); ++ } else { ++ cap->vht_capabilities_info &= ~VHT_CAP_EXTENDED_NSS_BW_SUPPORT_MASK; ++ } ++ + /* Supported MCS set comes from hw */ + os_memcpy(&cap->vht_supported_mcs_set, mode->vht_mcs_set, 8); + +@@ -74,6 +86,7 @@ u8 * hostapd_eid_vht_capabilities(struct + u8 * hostapd_eid_vht_operation(struct hostapd_data *hapd, u8 *eid) + { + struct ieee80211_vht_operation *oper; ++ le32 vht_capabilities_info; + u8 *pos = eid; + enum oper_chan_width oper_chwidth = + hostapd_get_oper_chwidth(hapd->iconf); +@@ -106,6 +119,7 @@ u8 * hostapd_eid_vht_operation(struct ho + oper->vht_op_info_chan_center_freq_seg1_idx = seg1; + + oper->vht_op_info_chwidth = oper_chwidth; ++ vht_capabilities_info = host_to_le32(hapd->iface->current_mode->vht_capab); + if (oper_chwidth == CONF_OPER_CHWIDTH_160MHZ) { + /* + * Convert 160 MHz channel width to new style as interop +@@ -119,6 +133,9 @@ u8 * hostapd_eid_vht_operation(struct ho + oper->vht_op_info_chan_center_freq_seg0_idx -= 8; + else + oper->vht_op_info_chan_center_freq_seg0_idx += 8; ++ ++ if (vht_capabilities_info & VHT_CAP_EXTENDED_NSS_BW_SUPPORT) ++ oper->vht_op_info_chan_center_freq_seg1_idx = 0; + } else if (oper_chwidth == CONF_OPER_CHWIDTH_80P80MHZ) { + /* + * Convert 80+80 MHz channel width to new style as interop +--- a/src/common/hw_features_common.c ++++ b/src/common/hw_features_common.c +@@ -811,6 +811,7 @@ int ieee80211ac_cap_check(u32 hw, u32 co + VHT_CAP_CHECK(VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB); + VHT_CAP_CHECK(VHT_CAP_RX_ANTENNA_PATTERN); + VHT_CAP_CHECK(VHT_CAP_TX_ANTENNA_PATTERN); ++ VHT_CAP_CHECK(VHT_CAP_EXTENDED_NSS_BW_SUPPORT); + + #undef VHT_CAP_CHECK + #undef VHT_CAP_CHECK_MAX +--- a/src/common/ieee802_11_defs.h ++++ b/src/common/ieee802_11_defs.h +@@ -1349,6 +1349,8 @@ struct ieee80211_ampe_ie { + #define VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB ((u32) BIT(26) | BIT(27)) + #define VHT_CAP_RX_ANTENNA_PATTERN ((u32) BIT(28)) + #define VHT_CAP_TX_ANTENNA_PATTERN ((u32) BIT(29)) ++#define VHT_CAP_EXTENDED_NSS_BW_SUPPORT ((u32) BIT(30)) ++#define VHT_CAP_EXTENDED_NSS_BW_SUPPORT_MASK ((u32) BIT(30) | BIT(31)) + + #define VHT_OPMODE_CHANNEL_WIDTH_MASK ((u8) BIT(0) | BIT(1)) + #define VHT_OPMODE_CHANNEL_RxNSS_MASK ((u8) BIT(4) | BIT(5) | \ diff --git a/package/network/services/hostapd/patches/180-driver_nl80211-fix-setting-QoS-map-on-secondary-BSSs.patch b/package/network/services/hostapd/patches/180-driver_nl80211-fix-setting-QoS-map-on-secondary-BSSs.patch new file mode 100644 index 0000000000..4929c581ce --- /dev/null +++ b/package/network/services/hostapd/patches/180-driver_nl80211-fix-setting-QoS-map-on-secondary-BSSs.patch @@ -0,0 +1,20 @@ +From: Felix Fietkau +Date: Thu, 14 Sep 2023 10:53:50 +0200 +Subject: [PATCH] driver_nl80211: fix setting QoS map on secondary BSSs + +The setting is per-BSS, not per PHY + +Signed-off-by: Felix Fietkau +--- + +--- a/src/drivers/driver_nl80211.c ++++ b/src/drivers/driver_nl80211.c +@@ -11341,7 +11341,7 @@ static int nl80211_set_qos_map(void *pri + wpa_hexdump(MSG_DEBUG, "nl80211: Setting QoS Map", + qos_map_set, qos_map_set_len); + +- if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_SET_QOS_MAP)) || ++ if (!(msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_QOS_MAP)) || + nla_put(msg, NL80211_ATTR_QOS_MAP, qos_map_set_len, qos_map_set)) { + nlmsg_free(msg); + return -ENOBUFS; diff --git a/package/network/services/hostapd/patches/181-driver_nl80211-update-drv-ifindex-on-removing-the-fi.patch b/package/network/services/hostapd/patches/181-driver_nl80211-update-drv-ifindex-on-removing-the-fi.patch new file mode 100644 index 0000000000..adfb21fb47 --- /dev/null +++ b/package/network/services/hostapd/patches/181-driver_nl80211-update-drv-ifindex-on-removing-the-fi.patch @@ -0,0 +1,18 @@ +From: Felix Fietkau +Date: Thu, 14 Sep 2023 11:28:03 +0200 +Subject: [PATCH] driver_nl80211: update drv->ifindex on removing the first + BSS + +Signed-off-by: Felix Fietkau +--- + +--- a/src/drivers/driver_nl80211.c ++++ b/src/drivers/driver_nl80211.c +@@ -8867,6 +8867,7 @@ static int wpa_driver_nl80211_if_remove( + if (drv->first_bss->next) { + drv->first_bss = drv->first_bss->next; + drv->ctx = drv->first_bss->ctx; ++ drv->ifindex = drv->first_bss->ifindex; + os_free(bss); + } else { + wpa_printf(MSG_DEBUG, "nl80211: No second BSS to reassign context to"); diff --git a/package/network/services/hostapd/patches/182-nl80211-move-nl80211_put_freq_params-call-outside-of.patch b/package/network/services/hostapd/patches/182-nl80211-move-nl80211_put_freq_params-call-outside-of.patch new file mode 100644 index 0000000000..395c645954 --- /dev/null +++ b/package/network/services/hostapd/patches/182-nl80211-move-nl80211_put_freq_params-call-outside-of.patch @@ -0,0 +1,34 @@ +From: Felix Fietkau +Date: Mon, 18 Sep 2023 16:47:41 +0200 +Subject: [PATCH] nl80211: move nl80211_put_freq_params call outside of + 802.11ax #ifdef + +The relevance of this call is not specific to 802.11ax, so it should be done +even with CONFIG_IEEE80211AX disabled. + +Fixes: b3921db426ea ("nl80211: Add frequency info in start AP command") +Signed-off-by: Felix Fietkau +--- + +--- a/src/drivers/driver_nl80211.c ++++ b/src/drivers/driver_nl80211.c +@@ -5226,6 +5226,9 @@ static int wpa_driver_nl80211_set_ap(voi + nla_nest_end(msg, ftm); + } + ++ if (params->freq && nl80211_put_freq_params(msg, params->freq) < 0) ++ goto fail; ++ + #ifdef CONFIG_IEEE80211AX + if (params->he_spr_ctrl) { + struct nlattr *spr; +@@ -5260,9 +5263,6 @@ static int wpa_driver_nl80211_set_ap(voi + nla_nest_end(msg, spr); + } + +- if (params->freq && nl80211_put_freq_params(msg, params->freq) < 0) +- goto fail; +- + if (params->freq && params->freq->he_enabled) { + struct nlattr *bss_color; + diff --git a/package/network/services/hostapd/patches/183-hostapd-cancel-channel_list_update_timeout-in-hostap.patch b/package/network/services/hostapd/patches/183-hostapd-cancel-channel_list_update_timeout-in-hostap.patch new file mode 100644 index 0000000000..fe81318385 --- /dev/null +++ b/package/network/services/hostapd/patches/183-hostapd-cancel-channel_list_update_timeout-in-hostap.patch @@ -0,0 +1,28 @@ +From: Felix Fietkau +Date: Wed, 20 Sep 2023 13:41:10 +0200 +Subject: [PATCH] hostapd: cancel channel_list_update_timeout in + hostapd_cleanup_iface_partial + +Fixes a crash when disabling an interface during channel list update + +Signed-off-by: Felix Fietkau +--- + +--- a/src/ap/hostapd.c ++++ b/src/ap/hostapd.c +@@ -569,6 +569,7 @@ static void sta_track_deinit(struct host + void hostapd_cleanup_iface_partial(struct hostapd_iface *iface) + { + wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); ++ eloop_cancel_timeout(channel_list_update_timeout, iface, NULL); + #ifdef NEED_AP_MLME + hostapd_stop_setup_timers(iface); + #endif /* NEED_AP_MLME */ +@@ -598,7 +599,6 @@ void hostapd_cleanup_iface_partial(struc + static void hostapd_cleanup_iface(struct hostapd_iface *iface) + { + wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); +- eloop_cancel_timeout(channel_list_update_timeout, iface, NULL); + eloop_cancel_timeout(hostapd_interface_setup_failure_handler, iface, + NULL); + diff --git a/package/network/services/hostapd/patches/200-multicall.patch b/package/network/services/hostapd/patches/200-multicall.patch index ad82e020f6..e3ed00f2de 100644 --- a/package/network/services/hostapd/patches/200-multicall.patch +++ b/package/network/services/hostapd/patches/200-multicall.patch @@ -18,7 +18,7 @@ OBJS += ../src/ap/vlan_init.o OBJS += ../src/ap/vlan_ifconfig.o OBJS += ../src/ap/vlan.o -@@ -350,10 +352,14 @@ CFLAGS += -DCONFIG_MBO +@@ -357,10 +359,14 @@ CFLAGS += -DCONFIG_MBO OBJS += ../src/ap/mbo_ap.o endif @@ -36,7 +36,7 @@ LIBS += $(DRV_AP_LIBS) ifdef CONFIG_L2_PACKET -@@ -1281,6 +1287,12 @@ install: $(addprefix $(DESTDIR)$(BINDIR) +@@ -1380,6 +1386,12 @@ install: $(addprefix $(DESTDIR)$(BINDIR) _OBJS_VAR := OBJS include ../src/objs.mk @@ -49,7 +49,7 @@ hostapd: $(OBJS) $(Q)$(CC) $(LDFLAGS) -o hostapd $(OBJS) $(LIBS) @$(E) " LD " $@ -@@ -1355,6 +1367,12 @@ include ../src/objs.mk +@@ -1460,6 +1472,12 @@ include ../src/objs.mk _OBJS_VAR := SOBJS include ../src/objs.mk @@ -64,15 +64,15 @@ @$(E) " LD " $@ --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile -@@ -17,6 +17,7 @@ endif +@@ -10,6 +10,7 @@ ALL += dbus/fi.w1.wpa_supplicant1.servic EXTRA_TARGETS=dynamic_eap_methods CONFIG_FILE=.config +-include $(if $(MULTICALL),../hostapd/.config) include ../src/build.rules - ifdef LIBS -@@ -363,7 +364,9 @@ endif + ifdef CONFIG_BUILD_PASN_SO +@@ -382,7 +383,9 @@ endif ifdef CONFIG_IBSS_RSN NEED_RSN_AUTHENTICATOR=y CFLAGS += -DCONFIG_IBSS_RSN @@ -82,7 +82,7 @@ OBJS += ibss_rsn.o endif -@@ -900,6 +903,10 @@ ifdef CONFIG_DYNAMIC_EAP_METHODS +@@ -924,6 +927,10 @@ ifdef CONFIG_DYNAMIC_EAP_METHODS CFLAGS += -DCONFIG_DYNAMIC_EAP_METHODS LIBS += -ldl -rdynamic endif @@ -93,7 +93,7 @@ endif ifdef CONFIG_AP -@@ -907,9 +914,11 @@ NEED_EAP_COMMON=y +@@ -931,9 +938,11 @@ NEED_EAP_COMMON=y NEED_RSN_AUTHENTICATOR=y CFLAGS += -DCONFIG_AP OBJS += ap.o @@ -105,7 +105,7 @@ OBJS += ../src/ap/hostapd.o OBJS += ../src/ap/wpa_auth_glue.o OBJS += ../src/ap/utils.o -@@ -989,6 +998,12 @@ endif +@@ -1022,6 +1031,12 @@ endif ifdef CONFIG_HS20 OBJS += ../src/ap/hs20.o endif @@ -118,7 +118,7 @@ endif ifdef CONFIG_MBO -@@ -997,7 +1012,9 @@ CFLAGS += -DCONFIG_MBO +@@ -1030,7 +1045,9 @@ CFLAGS += -DCONFIG_MBO endif ifdef NEED_RSN_AUTHENTICATOR @@ -128,7 +128,7 @@ NEED_AES_WRAP=y OBJS += ../src/ap/wpa_auth.o OBJS += ../src/ap/wpa_auth_ie.o -@@ -1891,6 +1908,12 @@ wpa_priv: $(BCHECK) $(OBJS_priv) +@@ -2010,6 +2027,12 @@ wpa_priv: $(BCHECK) $(OBJS_priv) _OBJS_VAR := OBJS include ../src/objs.mk @@ -141,7 +141,7 @@ wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs) $(Q)$(LDO) $(LDFLAGS) -o wpa_supplicant $(OBJS) $(LIBS) $(EXTRALIBS) @$(E) " LD " $@ -@@ -2023,6 +2046,12 @@ eap_gpsk.so: $(SRC_EAP_GPSK) +@@ -2142,6 +2165,12 @@ eap_gpsk.so: $(SRC_EAP_GPSK) $(Q)sed -e 's|\@BINDIR\@|$(BINDIR)|g' $< >$@ @$(E) " sed" $< @@ -156,7 +156,7 @@ wpa_cli.exe: wpa_cli --- a/src/drivers/driver.h +++ b/src/drivers/driver.h -@@ -6033,8 +6033,8 @@ union wpa_event_data { +@@ -6667,8 +6667,8 @@ union wpa_event_data { * Driver wrapper code should call this function whenever an event is received * from the driver. */ @@ -167,7 +167,7 @@ /** * wpa_supplicant_event_global - Report a driver event for wpa_supplicant -@@ -6046,7 +6046,7 @@ void wpa_supplicant_event(void *ctx, enu +@@ -6680,7 +6680,7 @@ void wpa_supplicant_event(void *ctx, enu * Same as wpa_supplicant_event(), but we search for the interface in * wpa_global. */ @@ -178,7 +178,7 @@ /* --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c -@@ -1842,8 +1842,8 @@ err: +@@ -2184,8 +2184,8 @@ err: #endif /* CONFIG_OWE */ @@ -189,7 +189,7 @@ { struct hostapd_data *hapd = ctx; #ifndef CONFIG_NO_STDOUT_DEBUG -@@ -2088,7 +2088,7 @@ void wpa_supplicant_event(void *ctx, enu +@@ -2489,7 +2489,7 @@ void wpa_supplicant_event(void *ctx, enu } @@ -200,7 +200,7 @@ struct hapd_interfaces *interfaces = ctx; --- a/wpa_supplicant/wpa_priv.c +++ b/wpa_supplicant/wpa_priv.c -@@ -1038,8 +1038,8 @@ static void wpa_priv_send_ft_response(st +@@ -1039,8 +1039,8 @@ static void wpa_priv_send_ft_response(st } @@ -211,7 +211,7 @@ { struct wpa_priv_interface *iface = ctx; -@@ -1102,7 +1102,7 @@ void wpa_supplicant_event(void *ctx, enu +@@ -1103,7 +1103,7 @@ void wpa_supplicant_event(void *ctx, enu } @@ -220,7 +220,7 @@ union wpa_event_data *data) { struct wpa_priv_global *global = ctx; -@@ -1215,6 +1215,8 @@ int main(int argc, char *argv[]) +@@ -1217,6 +1217,8 @@ int main(int argc, char *argv[]) if (os_program_init()) return -1; @@ -231,7 +231,7 @@ os_memset(&global, 0, sizeof(global)); --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c -@@ -4891,8 +4891,8 @@ static void wpas_event_unprot_beacon(str +@@ -5353,8 +5353,8 @@ static void wpas_link_reconfig(struct wp } @@ -242,7 +242,7 @@ { struct wpa_supplicant *wpa_s = ctx; int resched; -@@ -5745,7 +5745,7 @@ void wpa_supplicant_event(void *ctx, enu +@@ -6272,7 +6272,7 @@ void wpa_supplicant_event(void *ctx, enu } @@ -253,7 +253,7 @@ struct wpa_supplicant *wpa_s; --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c -@@ -7043,7 +7043,6 @@ struct wpa_interface * wpa_supplicant_ma +@@ -7462,7 +7462,6 @@ struct wpa_interface * wpa_supplicant_ma return NULL; } @@ -261,7 +261,7 @@ /** * wpa_supplicant_match_existing - Match existing interfaces * @global: Pointer to global data from wpa_supplicant_init() -@@ -7078,6 +7077,11 @@ static int wpa_supplicant_match_existing +@@ -7497,6 +7496,11 @@ static int wpa_supplicant_match_existing #endif /* CONFIG_MATCH_IFACE */ @@ -273,7 +273,7 @@ /** * wpa_supplicant_add_iface - Add a new network interface -@@ -7334,6 +7338,8 @@ struct wpa_global * wpa_supplicant_init( +@@ -7753,6 +7757,8 @@ struct wpa_global * wpa_supplicant_init( #ifndef CONFIG_NO_WPA_MSG wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb); #endif /* CONFIG_NO_WPA_MSG */ @@ -284,7 +284,7 @@ wpa_debug_open_file(params->wpa_debug_file_path); --- a/hostapd/main.c +++ b/hostapd/main.c -@@ -590,6 +590,11 @@ fail: +@@ -698,6 +698,11 @@ fail: return -1; } @@ -296,14 +296,14 @@ #ifdef CONFIG_WPS static int gen_uuid(const char *txt_addr) -@@ -683,6 +688,8 @@ int main(int argc, char *argv[]) +@@ -791,6 +796,8 @@ int main(int argc, char *argv[]) return -1; #endif /* CONFIG_DPP */ + wpa_supplicant_event = hostapd_wpa_event; + wpa_supplicant_event_global = hostapd_wpa_event_global; for (;;) { - c = getopt(argc, argv, "b:Bde:f:hi:KP:sSTtu:vg:G:"); + c = getopt(argc, argv, "b:Bde:f:hi:KP:sSTtu:vg:G:q"); if (c < 0) --- a/src/drivers/drivers.c +++ b/src/drivers/drivers.c @@ -320,7 +320,7 @@ { --- a/wpa_supplicant/eapol_test.c +++ b/wpa_supplicant/eapol_test.c -@@ -30,7 +30,12 @@ +@@ -31,7 +31,12 @@ #include "ctrl_iface.h" #include "pcsc_funcs.h" #include "wpas_glue.h" @@ -333,7 +333,7 @@ const struct wpa_driver_ops *const wpa_drivers[] = { NULL }; -@@ -1291,6 +1296,10 @@ static void usage(void) +@@ -1303,6 +1308,10 @@ static void usage(void) "option several times.\n"); } @@ -344,7 +344,7 @@ int main(int argc, char *argv[]) { -@@ -1311,6 +1320,8 @@ int main(int argc, char *argv[]) +@@ -1323,6 +1332,8 @@ int main(int argc, char *argv[]) if (os_program_init()) return -1; diff --git a/package/network/services/hostapd/patches/300-noscan.patch b/package/network/services/hostapd/patches/300-noscan.patch index 01a33d0d03..3b5f4325de 100644 --- a/package/network/services/hostapd/patches/300-noscan.patch +++ b/package/network/services/hostapd/patches/300-noscan.patch @@ -1,6 +1,6 @@ --- a/hostapd/config_file.c +++ b/hostapd/config_file.c -@@ -3474,6 +3474,10 @@ static int hostapd_config_fill(struct ho +@@ -3448,6 +3448,10 @@ static int hostapd_config_fill(struct ho if (bss->ocv && !bss->ieee80211w) bss->ieee80211w = 1; #endif /* CONFIG_OCV */ @@ -13,7 +13,7 @@ } else if (os_strcmp(buf, "ht_capab") == 0) { --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h -@@ -1014,6 +1014,8 @@ struct hostapd_config { +@@ -1075,6 +1075,8 @@ struct hostapd_config { int ht_op_mode_fixed; u16 ht_capab; @@ -24,7 +24,7 @@ int no_pri_sec_switch; --- a/src/ap/hw_features.c +++ b/src/ap/hw_features.c -@@ -517,7 +517,8 @@ static int ieee80211n_check_40mhz(struct +@@ -546,7 +546,8 @@ static int ieee80211n_check_40mhz(struct int ret; /* Check that HT40 is used and PRI / SEC switch is allowed */ @@ -36,7 +36,7 @@ hostapd_set_state(iface, HAPD_IFACE_HT_SCAN); --- a/src/ap/ieee802_11_ht.c +++ b/src/ap/ieee802_11_ht.c -@@ -230,6 +230,9 @@ void hostapd_2040_coex_action(struct hos +@@ -239,6 +239,9 @@ void hostapd_2040_coex_action(struct hos return; } @@ -46,7 +46,7 @@ if (len < IEEE80211_HDRLEN + 2 + sizeof(*bc_ie)) { wpa_printf(MSG_DEBUG, "Ignore too short 20/40 BSS Coexistence Management frame"); -@@ -390,6 +393,9 @@ void ht40_intolerant_add(struct hostapd_ +@@ -399,6 +402,9 @@ void ht40_intolerant_add(struct hostapd_ if (iface->current_mode->mode != HOSTAPD_MODE_IEEE80211G) return; diff --git a/package/network/services/hostapd/patches/301-mesh-noscan.patch b/package/network/services/hostapd/patches/301-mesh-noscan.patch index e682efb543..ceb6d0c161 100644 --- a/package/network/services/hostapd/patches/301-mesh-noscan.patch +++ b/package/network/services/hostapd/patches/301-mesh-noscan.patch @@ -1,6 +1,6 @@ --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c -@@ -2532,6 +2532,7 @@ static const struct parse_data ssid_fiel +@@ -2600,6 +2600,7 @@ static const struct parse_data ssid_fiel #else /* CONFIG_MESH */ { INT_RANGE(mode, 0, 4) }, #endif /* CONFIG_MESH */ @@ -10,7 +10,7 @@ { STR(id_str) }, --- a/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c -@@ -769,6 +769,7 @@ static void wpa_config_write_network(FIL +@@ -775,6 +775,7 @@ static void wpa_config_write_network(FIL #endif /* IEEE8021X_EAPOL */ INT(mode); INT(no_auto_peer); @@ -20,47 +20,56 @@ INT(enable_edmg); --- a/wpa_supplicant/mesh.c +++ b/wpa_supplicant/mesh.c -@@ -505,6 +505,8 @@ static int wpa_supplicant_mesh_init(stru +@@ -506,6 +506,8 @@ static int wpa_supplicant_mesh_init(stru frequency); goto out_free; } -+ if (ssid->noscan) -+ conf->noscan = 1; ++ if (conf->noscan) ++ ssid->noscan = 1; if (ssid->mesh_basic_rates == NULL) { /* --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c -@@ -2436,7 +2436,7 @@ void ibss_mesh_setup_freq(struct wpa_sup +@@ -2710,7 +2710,7 @@ static bool ibss_mesh_can_use_vht(struct + const struct wpa_ssid *ssid, + struct hostapd_hw_modes *mode) + { +- if (mode->mode != HOSTAPD_MODE_IEEE80211A) ++ if (mode->mode != HOSTAPD_MODE_IEEE80211A && !(ssid->noscan)) + return false; + + if (!drv_supports_vht(wpa_s, ssid)) +@@ -2783,7 +2783,7 @@ static void ibss_mesh_select_40mhz(struc + int i, res; + unsigned int j; + static const int ht40plus[] = { +- 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157, 165, 173, ++ 1, 2, 3, 4, 5, 6, 7, 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157, 165, 173, + 184, 192 + }; + int ht40 = -1; +@@ -3033,7 +3033,7 @@ void ibss_mesh_setup_freq(struct wpa_sup int ieee80211_mode = wpas_mode_to_ieee80211_mode(ssid->mode); enum hostapd_hw_mode hw_mode; struct hostapd_hw_modes *mode = NULL; -- int ht40plus[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157, -+ int ht40plus[] = { 1, 2, 3, 4, 5, 6, 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157, - 184, 192 }; - int bw80[] = { 5180, 5260, 5500, 5580, 5660, 5745, 5955, - 6035, 6115, 6195, 6275, 6355, 6435, 6515, -@@ -2444,7 +2444,7 @@ void ibss_mesh_setup_freq(struct wpa_sup - int bw160[] = { 5955, 6115, 6275, 6435, 6595, 6755, 6915 }; - struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL; +- int i, obss_scan = 1; ++ int i, obss_scan = !(ssid->noscan); u8 channel; -- int i, chan_idx, ht40 = -1, res, obss_scan = 1; -+ int i, chan_idx, ht40 = -1, res, obss_scan = !(ssid->noscan); - unsigned int j, k; - struct hostapd_freq_params vht_freq; - int chwidth, seg0, seg1; -@@ -2535,7 +2535,7 @@ void ibss_mesh_setup_freq(struct wpa_sup - #endif /* CONFIG_HE_OVERRIDES */ - + bool is_6ghz; + bool dfs_enabled = wpa_s->conf->country[0] && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_RADAR); +@@ -3080,6 +3080,8 @@ void ibss_mesh_setup_freq(struct wpa_sup + freq->he_enabled = ibss_mesh_can_use_he(wpa_s, ssid, mode, + ieee80211_mode); + freq->channel = channel; ++ if (mode->mode == HOSTAPD_MODE_IEEE80211G && ssid->noscan) ++ ibss_mesh_select_40mhz(wpa_s, ssid, mode, freq, obss_scan, dfs_enabled); /* Setup higher BW only for 5 GHz */ -- if (mode->mode != HOSTAPD_MODE_IEEE80211A) -+ if (mode->mode != HOSTAPD_MODE_IEEE80211A && !(ssid->noscan)) - return; - - for (chan_idx = 0; chan_idx < mode->num_channels; chan_idx++) { + if (mode->mode == HOSTAPD_MODE_IEEE80211A) { + ibss_mesh_select_40mhz(wpa_s, ssid, mode, freq, obss_scan, dfs_enabled); --- a/wpa_supplicant/config_ssid.h +++ b/wpa_supplicant/config_ssid.h -@@ -974,6 +974,8 @@ struct wpa_ssid { +@@ -1035,6 +1035,8 @@ struct wpa_ssid { */ int no_auto_peer; diff --git a/package/network/services/hostapd/patches/310-rescan_immediately.patch b/package/network/services/hostapd/patches/310-rescan_immediately.patch index b0c1cb8354..6e0244bca2 100644 --- a/package/network/services/hostapd/patches/310-rescan_immediately.patch +++ b/package/network/services/hostapd/patches/310-rescan_immediately.patch @@ -1,6 +1,6 @@ --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c -@@ -5377,7 +5377,7 @@ wpa_supplicant_alloc(struct wpa_supplica +@@ -5769,7 +5769,7 @@ wpa_supplicant_alloc(struct wpa_supplica if (wpa_s == NULL) return NULL; wpa_s->scan_req = INITIAL_SCAN_REQ; diff --git a/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch b/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch index 37033c3035..c11c957216 100644 --- a/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch +++ b/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch @@ -1,8 +1,8 @@ --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c -@@ -4986,7 +4986,7 @@ static int nl80211_set_channel(struct i8 - freq->freq, freq->ht_enabled, freq->vht_enabled, freq->he_enabled, - freq->bandwidth, freq->center_freq1, freq->center_freq2); +@@ -5407,7 +5407,7 @@ static int nl80211_set_channel(struct i8 + freq->he_enabled, freq->eht_enabled, freq->bandwidth, + freq->center_freq1, freq->center_freq2); - msg = nl80211_drv_msg(drv, 0, set_chan ? NL80211_CMD_SET_CHANNEL : + msg = nl80211_bss_msg(bss, 0, set_chan ? NL80211_CMD_SET_CHANNEL : diff --git a/package/network/services/hostapd/patches/340-reload_freq_change.patch b/package/network/services/hostapd/patches/340-reload_freq_change.patch deleted file mode 100644 index 3d51a47a1e..0000000000 --- a/package/network/services/hostapd/patches/340-reload_freq_change.patch +++ /dev/null @@ -1,75 +0,0 @@ ---- a/src/ap/hostapd.c -+++ b/src/ap/hostapd.c -@@ -115,6 +115,28 @@ static void hostapd_reload_bss(struct ho - #endif /* CONFIG_NO_RADIUS */ - - ssid = &hapd->conf->ssid; -+ -+ hostapd_set_freq(hapd, hapd->iconf->hw_mode, hapd->iface->freq, -+ hapd->iconf->channel, -+ hapd->iconf->enable_edmg, -+ hapd->iconf->edmg_channel, -+ hapd->iconf->ieee80211n, -+ hapd->iconf->ieee80211ac, -+ hapd->iconf->ieee80211ax, -+ hapd->iconf->secondary_channel, -+ hostapd_get_oper_chwidth(hapd->iconf), -+ hostapd_get_oper_centr_freq_seg0_idx(hapd->iconf), -+ hostapd_get_oper_centr_freq_seg1_idx(hapd->iconf)); -+ -+ if (hapd->iface->current_mode) { -+ if (hostapd_prepare_rates(hapd->iface, hapd->iface->current_mode)) { -+ wpa_printf(MSG_ERROR, "Failed to prepare rates table."); -+ hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211, -+ HOSTAPD_LEVEL_WARNING, -+ "Failed to prepare rates table."); -+ } -+ } -+ - if (!ssid->wpa_psk_set && ssid->wpa_psk && !ssid->wpa_psk->next && - ssid->wpa_passphrase_set && ssid->wpa_passphrase) { - /* -@@ -216,6 +238,7 @@ int hostapd_reload_config(struct hostapd - struct hostapd_data *hapd = iface->bss[0]; - struct hostapd_config *newconf, *oldconf; - size_t j; -+ int i; - - if (iface->config_fname == NULL) { - /* Only in-memory config in use - assume it has been updated */ -@@ -266,24 +289,20 @@ int hostapd_reload_config(struct hostapd - } - iface->conf = newconf; - -+ for (i = 0; i < iface->num_hw_features; i++) { -+ struct hostapd_hw_modes *mode = &iface->hw_features[i]; -+ if (mode->mode == iface->conf->hw_mode) { -+ iface->current_mode = mode; -+ break; -+ } -+ } -+ -+ if (iface->conf->channel) -+ iface->freq = hostapd_hw_get_freq(hapd, iface->conf->channel); -+ - for (j = 0; j < iface->num_bss; j++) { - hapd = iface->bss[j]; - hapd->iconf = newconf; -- hapd->iconf->channel = oldconf->channel; -- hapd->iconf->acs = oldconf->acs; -- hapd->iconf->secondary_channel = oldconf->secondary_channel; -- hapd->iconf->ieee80211n = oldconf->ieee80211n; -- hapd->iconf->ieee80211ac = oldconf->ieee80211ac; -- hapd->iconf->ht_capab = oldconf->ht_capab; -- hapd->iconf->vht_capab = oldconf->vht_capab; -- hostapd_set_oper_chwidth(hapd->iconf, -- hostapd_get_oper_chwidth(oldconf)); -- hostapd_set_oper_centr_freq_seg0_idx( -- hapd->iconf, -- hostapd_get_oper_centr_freq_seg0_idx(oldconf)); -- hostapd_set_oper_centr_freq_seg1_idx( -- hapd->iconf, -- hostapd_get_oper_centr_freq_seg1_idx(oldconf)); - hapd->conf = newconf->bss[j]; - hostapd_reload_bss(hapd); - } diff --git a/package/network/services/hostapd/patches/341-mesh-ctrl-iface-channel-switch.patch b/package/network/services/hostapd/patches/341-mesh-ctrl-iface-channel-switch.patch index b13dcb0673..8784452876 100644 --- a/package/network/services/hostapd/patches/341-mesh-ctrl-iface-channel-switch.patch +++ b/package/network/services/hostapd/patches/341-mesh-ctrl-iface-channel-switch.patch @@ -1,6 +1,6 @@ --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c -@@ -1611,15 +1611,35 @@ int ap_switch_channel(struct wpa_supplic +@@ -1825,15 +1825,35 @@ int ap_switch_channel(struct wpa_supplic #ifdef CONFIG_CTRL_IFACE diff --git a/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch b/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch index 35567838f5..647ca2cbf9 100644 --- a/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch +++ b/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch @@ -1,54 +1,35 @@ --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c -@@ -2931,10 +2931,15 @@ static int wpa_driver_nl80211_del_beacon - struct nl_msg *msg; - struct wpa_driver_nl80211_data *drv = bss->drv; +@@ -3008,12 +3008,12 @@ static int wpa_driver_nl80211_del_beacon + return 0; -+ if (!bss->beacon_set) -+ return 0; -+ -+ bss->beacon_set = 0; -+ wpa_printf(MSG_DEBUG, "nl80211: Remove beacon (ifindex=%d)", - drv->ifindex); + bss->ifindex); + link->beacon_set = 0; + link->freq = 0; + nl80211_put_wiphy_data_ap(bss); - msg = nl80211_drv_msg(drv, 0, NL80211_CMD_DEL_BEACON); + msg = nl80211_bss_msg(bss, 0, NL80211_CMD_DEL_BEACON); - return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL); - } + if (!msg) + return -ENOBUFS; -@@ -5617,7 +5622,7 @@ static void nl80211_teardown_ap(struct i +@@ -6100,7 +6100,7 @@ static void nl80211_teardown_ap(struct i nl80211_mgmt_unsubscribe(bss, "AP teardown"); nl80211_put_wiphy_data_ap(bss); -- bss->beacon_set = 0; -+ wpa_driver_nl80211_del_beacon(bss); +- bss->flink->beacon_set = 0; ++ wpa_driver_nl80211_del_beacon_all(bss); } -@@ -8071,8 +8076,6 @@ static int wpa_driver_nl80211_if_remove( +@@ -8859,8 +8859,6 @@ static int wpa_driver_nl80211_if_remove( } else { wpa_printf(MSG_DEBUG, "nl80211: First BSS - reassign context"); nl80211_teardown_ap(bss); - if (!bss->added_if && !drv->first_bss->next) -- wpa_driver_nl80211_del_beacon(bss); +- wpa_driver_nl80211_del_beacon_all(bss); nl80211_destroy_bss(bss); if (!bss->added_if) i802_set_iface_flags(bss, 0); -@@ -8469,7 +8472,6 @@ static int wpa_driver_nl80211_deinit_ap( - if (!is_ap_interface(drv->nlmode)) - return -1; - wpa_driver_nl80211_del_beacon(bss); -- bss->beacon_set = 0; - - /* - * If the P2P GO interface was dynamically added, then it is -@@ -8489,7 +8491,6 @@ static int wpa_driver_nl80211_stop_ap(vo - if (!is_ap_interface(drv->nlmode)) - return -1; - wpa_driver_nl80211_del_beacon(bss); -- bss->beacon_set = 0; - return 0; - } - diff --git a/package/network/services/hostapd/patches/360-ctrl_iface_reload.patch b/package/network/services/hostapd/patches/360-ctrl_iface_reload.patch deleted file mode 100644 index 7f3aa91889..0000000000 --- a/package/network/services/hostapd/patches/360-ctrl_iface_reload.patch +++ /dev/null @@ -1,106 +0,0 @@ ---- a/hostapd/ctrl_iface.c -+++ b/hostapd/ctrl_iface.c -@@ -67,6 +67,7 @@ - #include "fst/fst_ctrl_iface.h" - #include "config_file.h" - #include "ctrl_iface.h" -+#include "config_file.h" - - - #define HOSTAPD_CLI_DUP_VALUE_MAX_LEN 256 -@@ -82,6 +83,7 @@ static void hostapd_ctrl_iface_send(stru - enum wpa_msg_type type, - const char *buf, size_t len); - -+static char *reload_opts = NULL; - - static int hostapd_ctrl_iface_attach(struct hostapd_data *hapd, - struct sockaddr_storage *from, -@@ -133,6 +135,61 @@ static int hostapd_ctrl_iface_new_sta(st - return 0; - } - -+static char *get_option(char *opt, char *str) -+{ -+ int len = strlen(str); -+ -+ if (!strncmp(opt, str, len)) -+ return opt + len; -+ else -+ return NULL; -+} -+ -+static struct hostapd_config *hostapd_ctrl_iface_config_read(const char *fname) -+{ -+ struct hostapd_config *conf; -+ char *opt, *val; -+ -+ conf = hostapd_config_read(fname); -+ if (!conf) -+ return NULL; -+ -+ for (opt = strtok(reload_opts, " "); -+ opt; -+ opt = strtok(NULL, " ")) { -+ -+ if ((val = get_option(opt, "channel="))) -+ conf->channel = atoi(val); -+ else if ((val = get_option(opt, "ht_capab="))) -+ conf->ht_capab = atoi(val); -+ else if ((val = get_option(opt, "ht_capab_mask="))) -+ conf->ht_capab &= atoi(val); -+ else if ((val = get_option(opt, "sec_chan="))) -+ conf->secondary_channel = atoi(val); -+ else if ((val = get_option(opt, "hw_mode="))) -+ conf->hw_mode = atoi(val); -+ else if ((val = get_option(opt, "ieee80211n="))) -+ conf->ieee80211n = atoi(val); -+ else -+ break; -+ } -+ -+ return conf; -+} -+ -+static int hostapd_ctrl_iface_update(struct hostapd_data *hapd, char *txt) -+{ -+ struct hostapd_config * (*config_read_cb)(const char *config_fname); -+ struct hostapd_iface *iface = hapd->iface; -+ -+ config_read_cb = iface->interfaces->config_read_cb; -+ iface->interfaces->config_read_cb = hostapd_ctrl_iface_config_read; -+ reload_opts = txt; -+ -+ hostapd_reload_config(iface); -+ -+ iface->interfaces->config_read_cb = config_read_cb; -+} - - #ifdef NEED_AP_MLME - static int hostapd_ctrl_iface_sa_query(struct hostapd_data *hapd, -@@ -3771,6 +3828,8 @@ static int hostapd_ctrl_iface_receive_pr - } else if (os_strncmp(buf, "VENDOR ", 7) == 0) { - reply_len = hostapd_ctrl_iface_vendor(hapd, buf + 7, reply, - reply_size); -+ } else if (os_strncmp(buf, "UPDATE ", 7) == 0) { -+ hostapd_ctrl_iface_update(hapd, buf + 7); - } else if (os_strcmp(buf, "ERP_FLUSH") == 0) { - ieee802_1x_erp_flush(hapd); - #ifdef RADIUS_SERVER ---- a/src/ap/ctrl_iface_ap.c -+++ b/src/ap/ctrl_iface_ap.c -@@ -927,7 +927,13 @@ int hostapd_parse_csa_settings(const cha - - int hostapd_ctrl_iface_stop_ap(struct hostapd_data *hapd) - { -- return hostapd_drv_stop_ap(hapd); -+ struct hostapd_iface *iface = hapd->iface; -+ int i; -+ -+ for (i = 0; i < iface->num_bss; i++) -+ hostapd_drv_stop_ap(iface->bss[i]); -+ -+ return 0; - } - - diff --git a/package/network/services/hostapd/patches/370-ap_sta_support.patch b/package/network/services/hostapd/patches/370-ap_sta_support.patch deleted file mode 100644 index c81c841a43..0000000000 --- a/package/network/services/hostapd/patches/370-ap_sta_support.patch +++ /dev/null @@ -1,393 +0,0 @@ ---- a/wpa_supplicant/Makefile -+++ b/wpa_supplicant/Makefile -@@ -108,6 +108,8 @@ OBJS_c += ../src/utils/common.o - OBJS_c += ../src/common/cli.o - OBJS += wmm_ac.o - -+OBJS += ../src/common/wpa_ctrl.o -+ - ifndef CONFIG_OS - ifdef CONFIG_NATIVE_WINDOWS - CONFIG_OS=win32 ---- a/wpa_supplicant/bss.c -+++ b/wpa_supplicant/bss.c -@@ -11,6 +11,7 @@ - #include "utils/common.h" - #include "utils/eloop.h" - #include "common/ieee802_11_defs.h" -+#include "common/ieee802_11_common.h" - #include "drivers/driver.h" - #include "eap_peer/eap.h" - #include "wpa_supplicant_i.h" -@@ -282,6 +283,10 @@ void calculate_update_time(const struct - static void wpa_bss_copy_res(struct wpa_bss *dst, struct wpa_scan_res *src, - struct os_reltime *fetch_time) - { -+ struct ieee80211_ht_capabilities *capab; -+ struct ieee80211_ht_operation *oper; -+ struct ieee802_11_elems elems; -+ - dst->flags = src->flags; - os_memcpy(dst->bssid, src->bssid, ETH_ALEN); - dst->freq = src->freq; -@@ -294,6 +299,15 @@ static void wpa_bss_copy_res(struct wpa_ - dst->est_throughput = src->est_throughput; - dst->snr = src->snr; - -+ memset(&elems, 0, sizeof(elems)); -+ ieee802_11_parse_elems((u8 *) (src + 1), src->ie_len, &elems, 0); -+ capab = (struct ieee80211_ht_capabilities *) elems.ht_capabilities; -+ oper = (struct ieee80211_ht_operation *) elems.ht_operation; -+ if (capab) -+ dst->ht_capab = le_to_host16(capab->ht_capabilities_info); -+ if (oper) -+ dst->ht_param = oper->ht_param; -+ - calculate_update_time(fetch_time, src->age, &dst->last_update); - } - ---- a/wpa_supplicant/bss.h -+++ b/wpa_supplicant/bss.h -@@ -94,6 +94,10 @@ struct wpa_bss { - u8 ssid[SSID_MAX_LEN]; - /** Length of SSID */ - size_t ssid_len; -+ /** HT capabilities */ -+ u16 ht_capab; -+ /* Five octets of HT Operation Information */ -+ u8 ht_param; - /** Frequency of the channel in MHz (e.g., 2412 = channel 1) */ - int freq; - /** Beacon interval in TUs (host byte order) */ ---- a/wpa_supplicant/main.c -+++ b/wpa_supplicant/main.c -@@ -34,7 +34,7 @@ static void usage(void) - "vW] [-P] " - "[-g] \\\n" - " [-G] \\\n" -- " -i -c [-C] [-D] " -+ " -i -c [-C] [-D] [-H] " - "[-p] \\\n" - " [-b] [-e]" - #ifdef CONFIG_DEBUG_FILE -@@ -74,6 +74,7 @@ static void usage(void) - " -g = global ctrl_interface\n" - " -G = global ctrl_interface group\n" - " -h = show this help text\n" -+ " -H = connect to a hostapd instance to manage state changes\n" - " -i = interface name\n" - " -I = additional configuration file\n" - " -K = include keys (passwords, etc.) in debug output\n" -@@ -201,7 +202,7 @@ int main(int argc, char *argv[]) - - for (;;) { - c = getopt(argc, argv, -- "b:Bc:C:D:de:f:g:G:hi:I:KLMm:No:O:p:P:qsTtuvW"); -+ "b:Bc:C:D:de:f:g:G:hH:i:I:KLMm:No:O:p:P:qsTtuvW"); - if (c < 0) - break; - switch (c) { -@@ -248,6 +249,9 @@ int main(int argc, char *argv[]) - usage(); - exitcode = 0; - goto out; -+ case 'H': -+ iface->hostapd_ctrl = optarg; -+ break; - case 'i': - iface->ifname = optarg; - break; ---- a/wpa_supplicant/wpa_supplicant.c -+++ b/wpa_supplicant/wpa_supplicant.c -@@ -130,6 +130,54 @@ static void wpas_update_fils_connect_par - static void wpas_update_owe_connect_params(struct wpa_supplicant *wpa_s); - #endif /* CONFIG_OWE */ - -+static int hostapd_stop(struct wpa_supplicant *wpa_s) -+{ -+ const char *cmd = "STOP_AP"; -+ char buf[256]; -+ size_t len = sizeof(buf); -+ -+ if (wpa_ctrl_request(wpa_s->hostapd, cmd, os_strlen(cmd), buf, &len, NULL) < 0) { -+ wpa_printf(MSG_ERROR, "\nFailed to stop hostapd AP interfaces\n"); -+ return -1; -+ } -+ return 0; -+} -+ -+static int hostapd_reload(struct wpa_supplicant *wpa_s, struct wpa_bss *bss) -+{ -+ char *cmd = NULL; -+ char buf[256]; -+ size_t len = sizeof(buf); -+ enum hostapd_hw_mode hw_mode; -+ u8 channel; -+ int sec_chan = 0; -+ int ret; -+ -+ if (!bss) -+ return -1; -+ -+ if (bss->ht_param & HT_INFO_HT_PARAM_STA_CHNL_WIDTH) { -+ int sec = bss->ht_param & HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK; -+ if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE) -+ sec_chan = 1; -+ else if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW) -+ sec_chan = -1; -+ } -+ -+ hw_mode = ieee80211_freq_to_chan(bss->freq, &channel); -+ if (asprintf(&cmd, "UPDATE channel=%d sec_chan=%d hw_mode=%d", -+ channel, sec_chan, hw_mode) < 0) -+ return -1; -+ -+ ret = wpa_ctrl_request(wpa_s->hostapd, cmd, os_strlen(cmd), buf, &len, NULL); -+ free(cmd); -+ -+ if (ret < 0) { -+ wpa_printf(MSG_ERROR, "\nFailed to reload hostapd AP interfaces\n"); -+ return -1; -+ } -+ return 0; -+} - - #ifdef CONFIG_WEP - /* Configure default/group WEP keys for static WEP */ -@@ -1015,6 +1063,8 @@ void wpa_supplicant_set_state(struct wpa - - sme_sched_obss_scan(wpa_s, 1); - -+ if (wpa_s->hostapd) -+ hostapd_reload(wpa_s, wpa_s->current_bss); - #if defined(CONFIG_FILS) && defined(IEEE8021X_EAPOL) - if (!fils_hlp_sent && ssid && ssid->eap.erp) - update_fils_connect_params = true; -@@ -1025,6 +1075,8 @@ void wpa_supplicant_set_state(struct wpa - #endif /* CONFIG_OWE */ - } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING || - state == WPA_ASSOCIATED) { -+ if (wpa_s->hostapd) -+ hostapd_stop(wpa_s); - wpa_s->new_connection = 1; - wpa_drv_set_operstate(wpa_s, 0); - #ifndef IEEE8021X_EAPOL -@@ -2308,6 +2360,8 @@ void wpa_supplicant_associate(struct wpa - return; - } - wpa_s->current_bss = bss; -+ if (wpa_s->hostapd) -+ hostapd_reload(wpa_s, wpa_s->current_bss); - #else /* CONFIG_MESH */ - wpa_msg(wpa_s, MSG_ERROR, - "mesh mode support not included in the build"); -@@ -6650,6 +6704,16 @@ static int wpa_supplicant_init_iface(str - sizeof(wpa_s->bridge_ifname)); - } - -+ if (iface->hostapd_ctrl) { -+ wpa_s->hostapd = wpa_ctrl_open(iface->hostapd_ctrl); -+ if (!wpa_s->hostapd) { -+ wpa_printf(MSG_ERROR, "\nFailed to connect to hostapd\n"); -+ return -1; -+ } -+ if (hostapd_stop(wpa_s) < 0) -+ return -1; -+ } -+ - /* RSNA Supplicant Key Management - INITIALIZE */ - eapol_sm_notify_portEnabled(wpa_s->eapol, false); - eapol_sm_notify_portValid(wpa_s->eapol, false); -@@ -6987,6 +7051,11 @@ static void wpa_supplicant_deinit_iface( - if (terminate) - wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING); - -+ if (wpa_s->hostapd) { -+ wpa_ctrl_close(wpa_s->hostapd); -+ wpa_s->hostapd = NULL; -+ } -+ - wpa_supplicant_ctrl_iface_deinit(wpa_s, wpa_s->ctrl_iface); - wpa_s->ctrl_iface = NULL; - ---- a/wpa_supplicant/wpa_supplicant_i.h -+++ b/wpa_supplicant/wpa_supplicant_i.h -@@ -104,6 +104,11 @@ struct wpa_interface { - const char *ifname; - - /** -+ * hostapd_ctrl - path to hostapd control socket for notification -+ */ -+ const char *hostapd_ctrl; -+ -+ /** - * bridge_ifname - Optional bridge interface name - * - * If the driver interface (ifname) is included in a Linux bridge -@@ -718,6 +723,8 @@ struct wpa_supplicant { - #endif /* CONFIG_CTRL_IFACE_BINDER */ - char bridge_ifname[16]; - -+ struct wpa_ctrl *hostapd; -+ - char *confname; - char *confanother; - ---- a/hostapd/ctrl_iface.c -+++ b/hostapd/ctrl_iface.c -@@ -2889,6 +2889,12 @@ static int hostapd_ctrl_iface_chan_switc - return 0; - } - -+ if (os_strstr(pos, " auto-ht")) { -+ settings.freq_params.ht_enabled = iface->conf->ieee80211n; -+ settings.freq_params.vht_enabled = iface->conf->ieee80211ac; -+ settings.freq_params.he_enabled = iface->conf->ieee80211ax; -+ } -+ - for (i = 0; i < iface->num_bss; i++) { - - /* Save CHAN_SWITCH VHT and HE config */ ---- a/src/ap/beacon.c -+++ b/src/ap/beacon.c -@@ -1791,11 +1791,6 @@ static int __ieee802_11_set_beacon(struc - return -1; - } - -- if (hapd->csa_in_progress) { -- wpa_printf(MSG_ERROR, "Cannot set beacons during CSA period"); -- return -1; -- } -- - hapd->beacon_set_done = 1; - - if (ieee802_11_build_ap_params(hapd, ¶ms) < 0) ---- a/wpa_supplicant/events.c -+++ b/wpa_supplicant/events.c -@@ -4891,6 +4891,60 @@ static void wpas_event_unprot_beacon(str - } - - -+static void -+supplicant_ch_switch_started(struct wpa_supplicant *wpa_s, -+ union wpa_event_data *data) -+{ -+ char buf[256]; -+ size_t len = sizeof(buf); -+ char *cmd = NULL; -+ int width = 20; -+ int ret; -+ -+ if (!wpa_s->hostapd) -+ return; -+ -+ wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CHANNEL_SWITCH -+ "count=%d freq=%d ht_enabled=%d ch_offset=%d ch_width=%s cf1=%d cf2=%d", -+ data->ch_switch.count, -+ data->ch_switch.freq, -+ data->ch_switch.ht_enabled, -+ data->ch_switch.ch_offset, -+ channel_width_to_string(data->ch_switch.ch_width), -+ data->ch_switch.cf1, -+ data->ch_switch.cf2); -+ -+ switch (data->ch_switch.ch_width) { -+ case CHAN_WIDTH_20_NOHT: -+ case CHAN_WIDTH_20: -+ width = 20; -+ break; -+ case CHAN_WIDTH_40: -+ width = 40; -+ break; -+ case CHAN_WIDTH_80: -+ width = 80; -+ break; -+ case CHAN_WIDTH_160: -+ case CHAN_WIDTH_80P80: -+ width = 160; -+ break; -+ } -+ -+ asprintf(&cmd, "CHAN_SWITCH %d %d sec_channel_offset=%d center_freq1=%d center_freq2=%d, bandwidth=%d auto-ht\n", -+ data->ch_switch.count - 1, -+ data->ch_switch.freq, -+ data->ch_switch.ch_offset, -+ data->ch_switch.cf1, -+ data->ch_switch.cf2, -+ width); -+ ret = wpa_ctrl_request(wpa_s->hostapd, cmd, os_strlen(cmd), buf, &len, NULL); -+ free(cmd); -+ -+ if (ret < 0) -+ wpa_printf(MSG_ERROR, "\nFailed to reload hostapd AP interfaces\n"); -+} -+ - void supplicant_event(void *ctx, enum wpa_event_type event, - union wpa_event_data *data) - { -@@ -5206,8 +5260,10 @@ void supplicant_event(void *ctx, enum wp - channel_width_to_string(data->ch_switch.ch_width), - data->ch_switch.cf1, - data->ch_switch.cf2); -- if (event == EVENT_CH_SWITCH_STARTED) -+ if (event == EVENT_CH_SWITCH_STARTED) { -+ supplicant_ch_switch_started(wpa_s, data); - break; -+ } - - wpa_s->assoc_freq = data->ch_switch.freq; - wpa_s->current_ssid->frequency = data->ch_switch.freq; ---- a/src/drivers/driver.h -+++ b/src/drivers/driver.h -@@ -5837,6 +5837,7 @@ union wpa_event_data { - - /** - * struct ch_switch -+ * @count: Count until channel switch activates - * @freq: Frequency of new channel in MHz - * @ht_enabled: Whether this is an HT channel - * @ch_offset: Secondary channel offset -@@ -5845,6 +5846,7 @@ union wpa_event_data { - * @cf2: Center frequency 2 - */ - struct ch_switch { -+ int count; - int freq; - int ht_enabled; - int ch_offset; ---- a/src/drivers/driver_nl80211_event.c -+++ b/src/drivers/driver_nl80211_event.c -@@ -684,7 +684,7 @@ static void mlme_event_ch_switch(struct - struct nlattr *ifindex, struct nlattr *freq, - struct nlattr *type, struct nlattr *bw, - struct nlattr *cf1, struct nlattr *cf2, -- int finished) -+ struct nlattr *count, int finished) - { - struct i802_bss *bss; - union wpa_event_data data; -@@ -745,6 +745,8 @@ static void mlme_event_ch_switch(struct - data.ch_switch.cf1 = nla_get_u32(cf1); - if (cf2) - data.ch_switch.cf2 = nla_get_u32(cf2); -+ if (count) -+ data.ch_switch.count = nla_get_u32(count); - - if (finished) - bss->freq = data.ch_switch.freq; -@@ -3003,6 +3005,7 @@ static void do_process_drv_event(struct - tb[NL80211_ATTR_CHANNEL_WIDTH], - tb[NL80211_ATTR_CENTER_FREQ1], - tb[NL80211_ATTR_CENTER_FREQ2], -+ tb[NL80211_ATTR_CH_SWITCH_COUNT], - 0); - break; - case NL80211_CMD_CH_SWITCH_NOTIFY: -@@ -3013,6 +3016,7 @@ static void do_process_drv_event(struct - tb[NL80211_ATTR_CHANNEL_WIDTH], - tb[NL80211_ATTR_CENTER_FREQ1], - tb[NL80211_ATTR_CENTER_FREQ2], -+ NULL, - 1); - break; - case NL80211_CMD_DISCONNECT: diff --git a/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch b/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch index 92b52a6d37..f7720fce2f 100644 --- a/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch +++ b/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch @@ -12,7 +12,7 @@ else --- a/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c -@@ -3587,6 +3587,7 @@ static int hostapd_ctrl_iface_receive_pr +@@ -3314,6 +3314,7 @@ static int hostapd_ctrl_iface_receive_pr reply_size); } else if (os_strcmp(buf, "STATUS-DRIVER") == 0) { reply_len = hostapd_drv_status(hapd, reply, reply_size); @@ -20,7 +20,7 @@ } else if (os_strcmp(buf, "MIB") == 0) { reply_len = ieee802_11_get_mib(hapd, reply, reply_size); if (reply_len >= 0) { -@@ -3628,6 +3629,7 @@ static int hostapd_ctrl_iface_receive_pr +@@ -3355,6 +3356,7 @@ static int hostapd_ctrl_iface_receive_pr } else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) { reply_len = hostapd_ctrl_iface_sta_next(hapd, buf + 9, reply, reply_size); @@ -30,7 +30,7 @@ reply_len = -1; --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile -@@ -958,6 +958,9 @@ ifdef CONFIG_FILS +@@ -983,6 +983,9 @@ ifdef CONFIG_FILS OBJS += ../src/ap/fils_hlp.o endif ifdef CONFIG_CTRL_IFACE @@ -42,7 +42,7 @@ --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c -@@ -2314,7 +2314,7 @@ static int wpa_supplicant_ctrl_iface_sta +@@ -2326,7 +2326,7 @@ static int wpa_supplicant_ctrl_iface_sta pos += ret; } @@ -51,7 +51,7 @@ if (wpa_s->ap_iface) { pos += ap_ctrl_iface_wpa_get_status(wpa_s, pos, end - pos, -@@ -11494,6 +11494,7 @@ char * wpa_supplicant_ctrl_iface_process +@@ -12087,6 +12087,7 @@ char * wpa_supplicant_ctrl_iface_process reply_len = -1; } else if (os_strncmp(buf, "NOTE ", 5) == 0) { wpa_printf(MSG_INFO, "NOTE: %s", buf + 5); @@ -59,7 +59,7 @@ } else if (os_strcmp(buf, "MIB") == 0) { reply_len = wpa_sm_get_mib(wpa_s->wpa, reply, reply_size); if (reply_len >= 0) { -@@ -11506,6 +11507,7 @@ char * wpa_supplicant_ctrl_iface_process +@@ -12099,6 +12100,7 @@ char * wpa_supplicant_ctrl_iface_process reply_size - reply_len); #endif /* CONFIG_MACSEC */ } @@ -67,7 +67,7 @@ } else if (os_strncmp(buf, "STATUS", 6) == 0) { reply_len = wpa_supplicant_ctrl_iface_status( wpa_s, buf + 6, reply, reply_size); -@@ -11994,6 +11996,7 @@ char * wpa_supplicant_ctrl_iface_process +@@ -12587,6 +12589,7 @@ char * wpa_supplicant_ctrl_iface_process reply_len = wpa_supplicant_ctrl_iface_bss( wpa_s, buf + 4, reply, reply_size); #ifdef CONFIG_AP @@ -75,7 +75,7 @@ } else if (os_strcmp(buf, "STA-FIRST") == 0) { reply_len = ap_ctrl_iface_sta_first(wpa_s, reply, reply_size); } else if (os_strncmp(buf, "STA ", 4) == 0) { -@@ -12002,12 +12005,15 @@ char * wpa_supplicant_ctrl_iface_process +@@ -12595,12 +12598,15 @@ char * wpa_supplicant_ctrl_iface_process } else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) { reply_len = ap_ctrl_iface_sta_next(wpa_s, buf + 9, reply, reply_size); @@ -93,15 +93,61 @@ reply_len = -1; --- a/src/ap/ctrl_iface_ap.c +++ b/src/ap/ctrl_iface_ap.c -@@ -25,6 +25,7 @@ - #include "mbo_ap.h" +@@ -26,6 +26,26 @@ #include "taxonomy.h" - + #include "wnm_ap.h" + ++static const char * hw_mode_str(enum hostapd_hw_mode mode) ++{ ++ switch (mode) { ++ case HOSTAPD_MODE_IEEE80211B: ++ return "b"; ++ case HOSTAPD_MODE_IEEE80211G: ++ return "g"; ++ case HOSTAPD_MODE_IEEE80211A: ++ return "a"; ++ case HOSTAPD_MODE_IEEE80211AD: ++ return "ad"; ++ case HOSTAPD_MODE_IEEE80211ANY: ++ return "any"; ++ case NUM_HOSTAPD_MODES: ++ return "invalid"; ++ } ++ return "unknown"; ++} ++ +#ifdef CONFIG_CTRL_IFACE_MIB static size_t hostapd_write_ht_mcs_bitmask(char *buf, size_t buflen, size_t curr_len, const u8 *mcs_set) -@@ -459,6 +460,7 @@ int hostapd_ctrl_iface_sta_next(struct h +@@ -212,26 +232,6 @@ static const char * timeout_next_str(int + } + + +-static const char * hw_mode_str(enum hostapd_hw_mode mode) +-{ +- switch (mode) { +- case HOSTAPD_MODE_IEEE80211B: +- return "b"; +- case HOSTAPD_MODE_IEEE80211G: +- return "g"; +- case HOSTAPD_MODE_IEEE80211A: +- return "a"; +- case HOSTAPD_MODE_IEEE80211AD: +- return "ad"; +- case HOSTAPD_MODE_IEEE80211ANY: +- return "any"; +- case NUM_HOSTAPD_MODES: +- return "invalid"; +- } +- return "unknown"; +-} +- +- + static int hostapd_ctrl_iface_sta_mib(struct hostapd_data *hapd, + struct sta_info *sta, + char *buf, size_t buflen) +@@ -493,6 +493,7 @@ int hostapd_ctrl_iface_sta_next(struct h return hostapd_ctrl_iface_sta_mib(hapd, sta->next, buf, buflen); } @@ -109,7 +155,7 @@ #ifdef CONFIG_P2P_MANAGER static int p2p_manager_disconnect(struct hostapd_data *hapd, u16 stype, -@@ -815,12 +817,12 @@ int hostapd_ctrl_iface_status(struct hos +@@ -884,12 +885,12 @@ int hostapd_ctrl_iface_status(struct hos return len; len += ret; } @@ -126,7 +172,7 @@ if (os_snprintf_error(buflen - len, ret)) --- a/src/ap/ieee802_1x.c +++ b/src/ap/ieee802_1x.c -@@ -2712,6 +2712,7 @@ static const char * bool_txt(bool val) +@@ -2834,6 +2834,7 @@ static const char * bool_txt(bool val) return val ? "TRUE" : "FALSE"; } @@ -134,7 +180,7 @@ int ieee802_1x_get_mib(struct hostapd_data *hapd, char *buf, size_t buflen) { -@@ -2898,6 +2899,7 @@ int ieee802_1x_get_mib_sta(struct hostap +@@ -3020,6 +3021,7 @@ int ieee802_1x_get_mib_sta(struct hostap return len; } @@ -144,7 +190,7 @@ static void ieee802_1x_wnm_notif_send(void *eloop_ctx, void *timeout_ctx) --- a/src/ap/wpa_auth.c +++ b/src/ap/wpa_auth.c -@@ -4519,6 +4519,7 @@ static const char * wpa_bool_txt(int val +@@ -5328,6 +5328,7 @@ static const char * wpa_bool_txt(int val return val ? "TRUE" : "FALSE"; } @@ -152,7 +198,7 @@ #define RSN_SUITE "%02x-%02x-%02x-%d" #define RSN_SUITE_ARG(s) \ -@@ -4669,7 +4670,7 @@ int wpa_get_mib_sta(struct wpa_state_mac +@@ -5480,7 +5481,7 @@ int wpa_get_mib_sta(struct wpa_state_mac return len; } @@ -163,7 +209,7 @@ { --- a/src/rsn_supp/wpa.c +++ b/src/rsn_supp/wpa.c -@@ -2777,6 +2777,8 @@ static u32 wpa_key_mgmt_suite(struct wpa +@@ -3834,6 +3834,8 @@ static u32 wpa_key_mgmt_suite(struct wpa } @@ -172,7 +218,7 @@ #define RSN_SUITE "%02x-%02x-%02x-%d" #define RSN_SUITE_ARG(s) \ ((s) >> 24) & 0xff, ((s) >> 16) & 0xff, ((s) >> 8) & 0xff, (s) & 0xff -@@ -2858,6 +2860,7 @@ int wpa_sm_get_mib(struct wpa_sm *sm, ch +@@ -3915,6 +3917,7 @@ int wpa_sm_get_mib(struct wpa_sm *sm, ch return (int) len; } @@ -182,7 +228,7 @@ --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c -@@ -1462,7 +1462,7 @@ int wpas_ap_wps_nfc_report_handover(stru +@@ -1499,7 +1499,7 @@ int wpas_ap_wps_nfc_report_handover(stru #endif /* CONFIG_WPS */ diff --git a/package/network/services/hostapd/patches/381-hostapd_cli_UNKNOWN-COMMAND.patch b/package/network/services/hostapd/patches/381-hostapd_cli_UNKNOWN-COMMAND.patch index d2414faf01..e9083f6ecc 100644 --- a/package/network/services/hostapd/patches/381-hostapd_cli_UNKNOWN-COMMAND.patch +++ b/package/network/services/hostapd/patches/381-hostapd_cli_UNKNOWN-COMMAND.patch @@ -1,6 +1,6 @@ --- a/hostapd/hostapd_cli.c +++ b/hostapd/hostapd_cli.c -@@ -744,7 +744,7 @@ static int wpa_ctrl_command_sta(struct w +@@ -757,7 +757,7 @@ static int wpa_ctrl_command_sta(struct w } buf[len] = '\0'; diff --git a/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch b/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch index 65a8b07e65..4592c34127 100644 --- a/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch +++ b/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch @@ -1,6 +1,6 @@ --- a/src/common/wpa_common.c +++ b/src/common/wpa_common.c -@@ -2444,6 +2444,31 @@ u32 wpa_akm_to_suite(int akm) +@@ -2841,6 +2841,31 @@ u32 wpa_akm_to_suite(int akm) } @@ -32,7 +32,7 @@ int wpa_compare_rsn_ie(int ft_initial_assoc, const u8 *ie1, size_t ie1len, const u8 *ie2, size_t ie2len) -@@ -2451,8 +2476,19 @@ int wpa_compare_rsn_ie(int ft_initial_as +@@ -2848,8 +2873,19 @@ int wpa_compare_rsn_ie(int ft_initial_as if (ie1 == NULL || ie2 == NULL) return -1; diff --git a/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch b/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch index f708bf39ba..edcd985257 100644 --- a/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch +++ b/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch @@ -11,7 +11,7 @@ bss->wpa_pairwise |= WPA_CIPHER_TKIP; #endif /* CONFIG_NO_TKIP */ bss->rsn_pairwise = bss->wpa_pairwise; -@@ -1180,8 +1179,7 @@ int hostapd_init_wps(struct hostapd_data +@@ -1181,8 +1180,7 @@ int hostapd_init_wps(struct hostapd_data WPA_CIPHER_GCMP_256)) { wps->encr_types |= WPS_ENCR_AES; wps->encr_types_rsn |= WPS_ENCR_AES; diff --git a/package/network/services/hostapd/patches/410-limit_debug_messages.patch b/package/network/services/hostapd/patches/410-limit_debug_messages.patch index d2713fc29b..48a5589200 100644 --- a/package/network/services/hostapd/patches/410-limit_debug_messages.patch +++ b/package/network/services/hostapd/patches/410-limit_debug_messages.patch @@ -60,7 +60,7 @@ #ifdef CONFIG_DEBUG_FILE static char *last_path = NULL; #endif /* CONFIG_DEBUG_FILE */ -@@ -636,7 +610,7 @@ void wpa_msg_register_ifname_cb(wpa_msg_ +@@ -644,7 +618,7 @@ void wpa_msg_register_ifname_cb(wpa_msg_ } @@ -69,7 +69,7 @@ { va_list ap; char *buf; -@@ -674,7 +648,7 @@ void wpa_msg(void *ctx, int level, const +@@ -682,7 +656,7 @@ void wpa_msg(void *ctx, int level, const } @@ -80,9 +80,9 @@ char *buf; --- a/src/utils/wpa_debug.h +++ b/src/utils/wpa_debug.h -@@ -50,6 +50,17 @@ int wpa_debug_reopen_file(void); - void wpa_debug_close_file(void); +@@ -51,6 +51,17 @@ void wpa_debug_close_file(void); void wpa_debug_setup_stdout(void); + void wpa_debug_stop_log(void); +/* internal */ +void _wpa_hexdump(int level, const char *title, const u8 *buf, @@ -98,7 +98,7 @@ /** * wpa_debug_printf_timestamp - Print timestamp for debug output * -@@ -70,9 +81,15 @@ void wpa_debug_print_timestamp(void); +@@ -71,9 +82,15 @@ void wpa_debug_print_timestamp(void); * * Note: New line '\n' is added to the end of the text when printing to stdout. */ @@ -115,7 +115,7 @@ /** * wpa_hexdump - conditional hex dump * @level: priority level (MSG_*) of the message -@@ -84,7 +101,13 @@ PRINTF_FORMAT(2, 3); +@@ -85,7 +102,13 @@ PRINTF_FORMAT(2, 3); * output may be directed to stdout, stderr, and/or syslog based on * configuration. The contents of buf is printed out has hex dump. */ @@ -130,7 +130,7 @@ static inline void wpa_hexdump_buf(int level, const char *title, const struct wpabuf *buf) -@@ -106,7 +129,13 @@ static inline void wpa_hexdump_buf(int l +@@ -107,7 +130,13 @@ static inline void wpa_hexdump_buf(int l * like wpa_hexdump(), but by default, does not include secret keys (passwords, * etc.) in debug output. */ @@ -145,7 +145,7 @@ static inline void wpa_hexdump_buf_key(int level, const char *title, const struct wpabuf *buf) -@@ -128,8 +157,14 @@ static inline void wpa_hexdump_buf_key(i +@@ -129,8 +158,14 @@ static inline void wpa_hexdump_buf_key(i * the hex numbers and ASCII characters (for printable range) are shown. 16 * bytes per line will be shown. */ @@ -162,7 +162,7 @@ /** * wpa_hexdump_ascii_key - conditional hex dump, hide keys -@@ -145,8 +180,14 @@ void wpa_hexdump_ascii(int level, const +@@ -146,8 +181,14 @@ void wpa_hexdump_ascii(int level, const * bytes per line will be shown. This works like wpa_hexdump_ascii(), but by * default, does not include secret keys (passwords, etc.) in debug output. */ @@ -179,7 +179,7 @@ /* * wpa_dbg() behaves like wpa_msg(), but it can be removed from build to reduce -@@ -183,7 +224,12 @@ void wpa_hexdump_ascii_key(int level, co +@@ -184,7 +225,12 @@ void wpa_hexdump_ascii_key(int level, co * * Note: New line '\n' is added to the end of the text when printing to stdout. */ @@ -193,7 +193,7 @@ /** * wpa_msg_ctrl - Conditional printf for ctrl_iface monitors -@@ -197,8 +243,13 @@ void wpa_msg(void *ctx, int level, const +@@ -198,8 +244,13 @@ void wpa_msg(void *ctx, int level, const * attached ctrl_iface monitors. In other words, it can be used for frequent * events that do not need to be sent to syslog. */ diff --git a/package/network/services/hostapd/patches/420-indicate-features.patch b/package/network/services/hostapd/patches/420-indicate-features.patch index f9dff66073..07df8e5a9a 100644 --- a/package/network/services/hostapd/patches/420-indicate-features.patch +++ b/package/network/services/hostapd/patches/420-indicate-features.patch @@ -1,23 +1,24 @@ --- a/hostapd/main.c +++ b/hostapd/main.c -@@ -15,6 +15,7 @@ - #include "utils/common.h" - #include "utils/eloop.h" - #include "utils/uuid.h" -+#include "utils/build_features.h" - #include "crypto/random.h" - #include "crypto/tls.h" - #include "common/version.h" -@@ -691,7 +692,7 @@ int main(int argc, char *argv[]) +@@ -31,7 +31,7 @@ + #include "config_file.h" + #include "eap_register.h" + #include "ctrl_iface.h" +- ++#include "build_features.h" + + struct hapd_global { + void **drv_priv; +@@ -799,7 +799,7 @@ int main(int argc, char *argv[]) wpa_supplicant_event = hostapd_wpa_event; wpa_supplicant_event_global = hostapd_wpa_event_global; for (;;) { -- c = getopt(argc, argv, "b:Bde:f:hi:KP:sSTtu:vg:G:"); -+ c = getopt(argc, argv, "b:Bde:f:hi:KP:sSTtu:g:G:v::"); +- c = getopt(argc, argv, "b:Bde:f:hi:KP:sSTtu:vg:G:q"); ++ c = getopt(argc, argv, "b:Bde:f:hi:KP:sSTtu:g:G:qv::"); if (c < 0) break; switch (c) { -@@ -728,6 +729,8 @@ int main(int argc, char *argv[]) +@@ -836,6 +836,8 @@ int main(int argc, char *argv[]) break; #endif /* CONFIG_DEBUG_LINUX_TRACING */ case 'v': @@ -25,7 +26,7 @@ + exit(!has_feature(optarg)); show_version(); exit(1); - break; + case 'g': --- a/wpa_supplicant/main.c +++ b/wpa_supplicant/main.c @@ -12,6 +12,7 @@ @@ -33,19 +34,19 @@ #include "common.h" +#include "build_features.h" + #include "crypto/crypto.h" #include "fst/fst.h" #include "wpa_supplicant_i.h" - #include "driver_i.h" @@ -202,7 +203,7 @@ int main(int argc, char *argv[]) for (;;) { c = getopt(argc, argv, -- "b:Bc:C:D:de:f:g:G:hH:i:I:KLMm:No:O:p:P:qsTtuvW"); -+ "b:Bc:C:D:de:f:g:G:hH:i:I:KLMm:No:O:p:P:qsTtuv::W"); +- "b:Bc:C:D:de:f:g:G:hi:I:KLMm:No:O:p:P:qsTtuvW"); ++ "b:Bc:C:D:de:f:g:G:hi:I:KLMm:No:O:p:P:qsTtuv::W"); if (c < 0) break; switch (c) { -@@ -305,8 +306,12 @@ int main(int argc, char *argv[]) +@@ -302,8 +303,12 @@ int main(int argc, char *argv[]) break; #endif /* CONFIG_CTRL_IFACE_DBUS_NEW */ case 'v': diff --git a/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch b/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch index dc1fa3d29d..a21f0bf7ce 100644 --- a/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch +++ b/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch @@ -1,6 +1,6 @@ --- a/hostapd/hostapd_cli.c +++ b/hostapd/hostapd_cli.c -@@ -388,7 +388,6 @@ static int hostapd_cli_cmd_disassociate( +@@ -401,7 +401,6 @@ static int hostapd_cli_cmd_disassociate( } @@ -8,7 +8,7 @@ static int hostapd_cli_cmd_signature(struct wpa_ctrl *ctrl, int argc, char *argv[]) { -@@ -401,7 +400,6 @@ static int hostapd_cli_cmd_signature(str +@@ -414,7 +413,6 @@ static int hostapd_cli_cmd_signature(str os_snprintf(buf, sizeof(buf), "SIGNATURE %s", argv[0]); return wpa_ctrl_command(ctrl, buf); } @@ -16,7 +16,7 @@ static int hostapd_cli_cmd_sa_query(struct wpa_ctrl *ctrl, int argc, -@@ -418,7 +416,6 @@ static int hostapd_cli_cmd_sa_query(stru +@@ -431,7 +429,6 @@ static int hostapd_cli_cmd_sa_query(stru } @@ -24,7 +24,7 @@ static int hostapd_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc, char *argv[]) { -@@ -644,7 +641,6 @@ static int hostapd_cli_cmd_wps_config(st +@@ -657,7 +654,6 @@ static int hostapd_cli_cmd_wps_config(st ssid_hex, argv[1]); return wpa_ctrl_command(ctrl, buf); } @@ -32,7 +32,7 @@ static int hostapd_cli_cmd_disassoc_imminent(struct wpa_ctrl *ctrl, int argc, -@@ -1579,13 +1575,10 @@ static const struct hostapd_cli_cmd host +@@ -1610,13 +1606,10 @@ static const struct hostapd_cli_cmd host { "disassociate", hostapd_cli_cmd_disassociate, hostapd_complete_stations, " = disassociate a station" }, @@ -46,7 +46,7 @@ { "wps_pin", hostapd_cli_cmd_wps_pin, NULL, " [timeout] [addr] = add WPS Enrollee PIN" }, { "wps_check_pin", hostapd_cli_cmd_wps_check_pin, NULL, -@@ -1610,7 +1603,6 @@ static const struct hostapd_cli_cmd host +@@ -1641,7 +1634,6 @@ static const struct hostapd_cli_cmd host " = configure AP" }, { "wps_get_status", hostapd_cli_cmd_wps_get_status, NULL, "= show current WPS status" }, diff --git a/package/network/services/hostapd/patches/432-missing-typedef.patch b/package/network/services/hostapd/patches/432-missing-typedef.patch deleted file mode 100644 index 7a100f1a0d..0000000000 --- a/package/network/services/hostapd/patches/432-missing-typedef.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/src/drivers/linux_wext.h -+++ b/src/drivers/linux_wext.h -@@ -26,6 +26,7 @@ typedef int32_t __s32; - typedef uint16_t __u16; - typedef int16_t __s16; - typedef uint8_t __u8; -+typedef int8_t __s8; - #ifndef __user - #define __user - #endif /* __user */ diff --git a/package/network/services/hostapd/patches/450-scan_wait.patch b/package/network/services/hostapd/patches/450-scan_wait.patch deleted file mode 100644 index ac874ad66a..0000000000 --- a/package/network/services/hostapd/patches/450-scan_wait.patch +++ /dev/null @@ -1,73 +0,0 @@ ---- a/hostapd/main.c -+++ b/hostapd/main.c -@@ -39,6 +39,8 @@ struct hapd_global { - }; - - static struct hapd_global global; -+static int daemonize = 0; -+static char *pid_file = NULL; - - - #ifndef CONFIG_NO_HOSTAPD_LOGGER -@@ -146,6 +148,14 @@ static void hostapd_logger_cb(void *ctx, - } - #endif /* CONFIG_NO_HOSTAPD_LOGGER */ - -+static void hostapd_setup_complete_cb(void *ctx) -+{ -+ if (daemonize && os_daemonize(pid_file)) { -+ perror("daemon"); -+ return; -+ } -+ daemonize = 0; -+} - - /** - * hostapd_driver_init - Preparate driver interface -@@ -164,6 +174,8 @@ static int hostapd_driver_init(struct ho - return -1; - } - -+ hapd->setup_complete_cb = hostapd_setup_complete_cb; -+ - /* Initialize the driver interface */ - if (!(b[0] | b[1] | b[2] | b[3] | b[4] | b[5])) - b = NULL; -@@ -404,8 +416,6 @@ static void hostapd_global_deinit(const - #endif /* CONFIG_NATIVE_WINDOWS */ - - eap_server_unregister_methods(); -- -- os_daemonize_terminate(pid_file); - } - - -@@ -431,18 +441,6 @@ static int hostapd_global_run(struct hap - } - #endif /* EAP_SERVER_TNC */ - -- if (daemonize) { -- if (os_daemonize(pid_file)) { -- wpa_printf(MSG_ERROR, "daemon: %s", strerror(errno)); -- return -1; -- } -- if (eloop_sock_requeue()) { -- wpa_printf(MSG_ERROR, "eloop_sock_requeue: %s", -- strerror(errno)); -- return -1; -- } -- } -- - eloop_run(); - - return 0; -@@ -645,8 +643,7 @@ int main(int argc, char *argv[]) - struct hapd_interfaces interfaces; - int ret = 1; - size_t i, j; -- int c, debug = 0, daemonize = 0; -- char *pid_file = NULL; -+ int c, debug = 0; - const char *log_file = NULL; - const char *entropy_file = NULL; - char **bss_config = NULL, **tmp_bss; diff --git a/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch b/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch index 28f07c7dc2..dc19553e26 100644 --- a/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch +++ b/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch @@ -22,7 +22,7 @@ Signed-hostap: Antonio Quartulli #include "common/defs.h" #include "common/ieee802_11_defs.h" #include "common/wpa_common.h" -@@ -857,6 +858,9 @@ struct wpa_driver_associate_params { +@@ -953,6 +954,9 @@ struct wpa_driver_associate_params { * responsible for selecting with which BSS to associate. */ const u8 *bssid; @@ -42,7 +42,7 @@ Signed-hostap: Antonio Quartulli #include "config.h" -@@ -2321,6 +2322,97 @@ static char * wpa_config_write_peerkey(c +@@ -2389,6 +2390,97 @@ static char * wpa_config_write_mac_value #endif /* NO_CONFIG_WRITE */ @@ -140,7 +140,7 @@ Signed-hostap: Antonio Quartulli /* Helper macros for network block parser */ #ifdef OFFSET -@@ -2606,6 +2698,8 @@ static const struct parse_data ssid_fiel +@@ -2674,6 +2766,8 @@ static const struct parse_data ssid_fiel { INT(ap_max_inactivity) }, { INT(dtim_period) }, { INT(beacon_int) }, @@ -162,7 +162,7 @@ Signed-hostap: Antonio Quartulli #define DEFAULT_EAP_WORKAROUND ((unsigned int) -1) -@@ -846,6 +848,9 @@ struct wpa_ssid { +@@ -879,6 +881,9 @@ struct wpa_ssid { */ void *parent_cred; @@ -174,7 +174,7 @@ Signed-hostap: Antonio Quartulli * macsec_policy - Determines the policy for MACsec secure session --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c -@@ -3865,6 +3865,12 @@ static void wpas_start_assoc_cb(struct w +@@ -4177,6 +4177,12 @@ static void wpas_start_assoc_cb(struct w params.beacon_int = ssid->beacon_int; else params.beacon_int = wpa_s->conf->beacon_int; diff --git a/package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch b/package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch deleted file mode 100644 index 0be77f9845..0000000000 --- a/package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch +++ /dev/null @@ -1,59 +0,0 @@ -From ffc4445958a3ed4064f2e1bf73fa478a61c5cf7b Mon Sep 17 00:00:00 2001 -From: Antonio Quartulli -Date: Sun, 3 Jun 2012 18:42:25 +0200 -Subject: [PATCHv2 602/602] driver_nl80211: use new parameters during ibss join - -Signed-hostap: Antonio Quartulli ---- - src/drivers/driver_nl80211.c | 33 ++++++++++++++++++++++++++++++++- - 1 file changed, 32 insertions(+), 1 deletion(-) - ---- a/src/drivers/driver_nl80211.c -+++ b/src/drivers/driver_nl80211.c -@@ -5966,7 +5966,7 @@ static int wpa_driver_nl80211_ibss(struc - struct wpa_driver_associate_params *params) - { - struct nl_msg *msg; -- int ret = -1; -+ int ret = -1, i; - int count = 0; - - wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex); -@@ -5993,6 +5993,37 @@ retry: - nl80211_put_beacon_int(msg, params->beacon_int)) - goto fail; - -+ if (params->fixed_freq) { -+ wpa_printf(MSG_DEBUG, " * fixed_freq"); -+ nla_put_flag(msg, NL80211_ATTR_FREQ_FIXED); -+ } -+ -+ if (params->beacon_int > 0) { -+ wpa_printf(MSG_DEBUG, " * beacon_int=%d", -+ params->beacon_int); -+ nla_put_u32(msg, NL80211_ATTR_BEACON_INTERVAL, -+ params->beacon_int); -+ } -+ -+ if (params->rates[0] > 0) { -+ wpa_printf(MSG_DEBUG, " * basic_rates:"); -+ i = 0; -+ while (i < NL80211_MAX_SUPP_RATES && -+ params->rates[i] > 0) { -+ wpa_printf(MSG_DEBUG, " %.1f", -+ (double)params->rates[i] / 2); -+ i++; -+ } -+ nla_put(msg, NL80211_ATTR_BSS_BASIC_RATES, i, -+ params->rates); -+ } -+ -+ if (params->mcast_rate > 0) { -+ wpa_printf(MSG_DEBUG, " * mcast_rate=%.1f", -+ (double)params->mcast_rate / 10); -+ nla_put_u32(msg, NL80211_ATTR_MCAST_RATE, params->mcast_rate); -+ } -+ - ret = nl80211_set_conn_keys(params, msg); - if (ret) - goto fail; diff --git a/package/network/services/hostapd/patches/463-add-mcast_rate-to-11s.patch b/package/network/services/hostapd/patches/463-add-mcast_rate-to-11s.patch index bd1d4d7565..daa36c2f35 100644 --- a/package/network/services/hostapd/patches/463-add-mcast_rate-to-11s.patch +++ b/package/network/services/hostapd/patches/463-add-mcast_rate-to-11s.patch @@ -19,7 +19,7 @@ Tested-by: Simon Wunderlich --- a/src/drivers/driver.h +++ b/src/drivers/driver.h -@@ -1624,6 +1624,7 @@ struct wpa_driver_mesh_join_params { +@@ -1827,6 +1827,7 @@ struct wpa_driver_mesh_join_params { #define WPA_DRIVER_MESH_FLAG_AMPE 0x00000008 unsigned int flags; bool handle_dfs; @@ -29,7 +29,7 @@ Tested-by: Simon Wunderlich struct wpa_driver_set_key_params { --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c -@@ -10496,6 +10496,18 @@ static int nl80211_put_mesh_id(struct nl +@@ -11667,6 +11667,18 @@ static int nl80211_put_mesh_id(struct nl } @@ -48,7 +48,7 @@ Tested-by: Simon Wunderlich static int nl80211_put_mesh_config(struct nl_msg *msg, struct wpa_driver_mesh_bss_params *params) { -@@ -10557,6 +10569,7 @@ static int nl80211_join_mesh(struct i802 +@@ -11728,6 +11740,7 @@ static int nl80211_join_mesh(struct i802 nl80211_put_basic_rates(msg, params->basic_rates) || nl80211_put_mesh_id(msg, params->meshid, params->meshid_len) || nl80211_put_beacon_int(msg, params->beacon_int) || @@ -58,7 +58,7 @@ Tested-by: Simon Wunderlich --- a/wpa_supplicant/mesh.c +++ b/wpa_supplicant/mesh.c -@@ -631,6 +631,7 @@ int wpa_supplicant_join_mesh(struct wpa_ +@@ -632,6 +632,7 @@ int wpa_supplicant_join_mesh(struct wpa_ params->meshid = ssid->ssid; params->meshid_len = ssid->ssid_len; diff --git a/package/network/services/hostapd/patches/464-fix-mesh-obss-check.patch b/package/network/services/hostapd/patches/464-fix-mesh-obss-check.patch index 4807727e0e..4d7d85f4ab 100644 --- a/package/network/services/hostapd/patches/464-fix-mesh-obss-check.patch +++ b/package/network/services/hostapd/patches/464-fix-mesh-obss-check.patch @@ -1,19 +1,13 @@ --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c -@@ -2512,11 +2512,13 @@ void ibss_mesh_setup_freq(struct wpa_sup - for (j = 0; j < wpa_s->last_scan_res_used; j++) { - struct wpa_bss *bss = wpa_s->last_scan_res[j]; +@@ -3040,6 +3040,10 @@ void ibss_mesh_setup_freq(struct wpa_sup -- if (ssid->mode != WPAS_MODE_IBSS) -+ /* Don't adjust control freq in case of fixed_freq */ -+ if (ssid->fixed_freq) { -+ obss_scan = 0; - break; -+ } + freq->freq = ssid->frequency; -- /* Don't adjust control freq in case of fixed_freq */ -- if (ssid->fixed_freq) -+ if (ssid->mode != WPAS_MODE_IBSS) - break; ++ if (ssid->fixed_freq) { ++ obss_scan = 0; ++ } ++ + if (ssid->mode == WPAS_MODE_IBSS && !ssid->fixed_freq) { + struct wpa_bss *bss = ibss_find_existing_bss(wpa_s, ssid); - if (!bss_is_ibss(bss)) diff --git a/package/network/services/hostapd/patches/465-hostapd-config-support-random-BSS-color.patch b/package/network/services/hostapd/patches/465-hostapd-config-support-random-BSS-color.patch new file mode 100644 index 0000000000..7d3d94648e --- /dev/null +++ b/package/network/services/hostapd/patches/465-hostapd-config-support-random-BSS-color.patch @@ -0,0 +1,24 @@ +From c9304d3303d563ad6d2619f4e07864ed12f96889 Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Sat, 14 May 2022 21:41:03 +0200 +Subject: [PATCH] hostapd: config: support random BSS color + +Configure the HE BSS color to a random value in case the config defines +a BSS color which exceeds the max BSS color (63). + +Signed-off-by: David Bauer +--- + hostapd/config_file.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/hostapd/config_file.c ++++ b/hostapd/config_file.c +@@ -3500,6 +3500,8 @@ static int hostapd_config_fill(struct ho + } else if (os_strcmp(buf, "he_bss_color") == 0) { + conf->he_op.he_bss_color = atoi(pos) & 0x3f; + conf->he_op.he_bss_color_disabled = 0; ++ if (atoi(pos) > 63) ++ conf->he_op.he_bss_color = os_random() % 63 + 1; + } else if (os_strcmp(buf, "he_bss_color_partial") == 0) { + conf->he_op.he_bss_color_partial = atoi(pos); + } else if (os_strcmp(buf, "he_default_pe_duration") == 0) { diff --git a/package/network/services/hostapd/patches/470-survey_data_fallback.patch b/package/network/services/hostapd/patches/470-survey_data_fallback.patch index 359b5f3ef8..79ab48c5c2 100644 --- a/package/network/services/hostapd/patches/470-survey_data_fallback.patch +++ b/package/network/services/hostapd/patches/470-survey_data_fallback.patch @@ -1,24 +1,29 @@ --- a/src/ap/acs.c +++ b/src/ap/acs.c -@@ -420,20 +420,19 @@ static int acs_usable_bw160_chan(const s +@@ -455,17 +455,17 @@ static int acs_get_bw_center_chan(int fr static int acs_survey_is_sufficient(struct freq_survey *survey) { if (!(survey->filled & SURVEY_HAS_NF)) { + survey->nf = -95; - wpa_printf(MSG_INFO, "ACS: Survey is missing noise floor"); + wpa_printf(MSG_INFO, + "ACS: Survey for freq %d is missing noise floor", + survey->freq); - return 0; } if (!(survey->filled & SURVEY_HAS_CHAN_TIME)) { + survey->channel_time = 0; - wpa_printf(MSG_INFO, "ACS: Survey is missing channel time"); + wpa_printf(MSG_INFO, + "ACS: Survey for freq %d is missing channel time", + survey->freq); - return 0; } if (!(survey->filled & SURVEY_HAS_CHAN_TIME_BUSY) && - !(survey->filled & SURVEY_HAS_CHAN_TIME_RX)) { +@@ -473,7 +473,6 @@ static int acs_survey_is_sufficient(stru wpa_printf(MSG_INFO, - "ACS: Survey is missing RX and busy time (at least one is required)"); + "ACS: Survey for freq %d is missing RX and busy time (at least one is required)", + survey->freq); - return 0; } diff --git a/package/network/services/hostapd/patches/500-lto-jobserver-support.patch b/package/network/services/hostapd/patches/500-lto-jobserver-support.patch index c51db01fec..67312c5004 100644 --- a/package/network/services/hostapd/patches/500-lto-jobserver-support.patch +++ b/package/network/services/hostapd/patches/500-lto-jobserver-support.patch @@ -1,6 +1,6 @@ --- a/hostapd/Makefile +++ b/hostapd/Makefile -@@ -1297,7 +1297,7 @@ hostapd_multi.a: $(BCHECK) $(OBJS) +@@ -1396,7 +1396,7 @@ hostapd_multi.a: $(BCHECK) $(OBJS) @$(AR) cr $@ hostapd_multi.o $(OBJS) hostapd: $(OBJS) @@ -9,7 +9,7 @@ @$(E) " LD " $@ ifdef CONFIG_WPA_TRACE -@@ -1308,7 +1308,7 @@ _OBJS_VAR := OBJS_c +@@ -1407,7 +1407,7 @@ _OBJS_VAR := OBJS_c include ../src/objs.mk hostapd_cli: $(OBJS_c) @@ -20,7 +20,7 @@ NOBJS = nt_password_hash.o ../src/crypto/ms_funcs.o $(SHA1OBJS) --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile -@@ -1920,31 +1920,31 @@ wpa_supplicant_multi.a: .config $(BCHECK +@@ -2037,31 +2037,31 @@ wpa_supplicant_multi.a: .config $(BCHECK @$(AR) cr $@ wpa_supplicant_multi.o $(OBJS) wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs) diff --git a/package/network/services/hostapd/patches/590-rrm-wnm-statistics.patch b/package/network/services/hostapd/patches/590-rrm-wnm-statistics.patch index d273e5cd8b..b608966113 100644 --- a/package/network/services/hostapd/patches/590-rrm-wnm-statistics.patch +++ b/package/network/services/hostapd/patches/590-rrm-wnm-statistics.patch @@ -1,6 +1,6 @@ --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h -@@ -150,6 +150,21 @@ struct hostapd_sae_commit_queue { +@@ -163,6 +163,21 @@ struct hostapd_sae_commit_queue { }; /** @@ -22,9 +22,9 @@ * struct hostapd_data - hostapd per-BSS data structure */ struct hostapd_data { -@@ -163,6 +178,9 @@ struct hostapd_data { +@@ -182,6 +197,9 @@ struct hostapd_data { - u8 own_addr[ETH_ALEN]; + struct hostapd_data *mld_first_bss; + /* libreCMC specific statistics */ + struct hostapd_librecmc_stats librecmc_stats; @@ -42,9 +42,9 @@ wpa_printf(MSG_DEBUG, "WNM: Send BSS Transition Management Request to " MACSTR " dialog_token=%u req_mode=0x%x disassoc_timer=%u " "validity_interval=%u", -@@ -646,10 +647,12 @@ int ieee802_11_rx_wnm_action_ap(struct h - - switch (action) { +@@ -790,10 +791,12 @@ int ieee802_11_rx_wnm_action_ap(struct h + plen); + return 0; case WNM_BSS_TRANS_MGMT_QUERY: + hapd->librecmc_stats.wnm.bss_transition_query_rx++; ieee802_11_rx_bss_trans_mgmt_query(hapd, mgmt->sa, payload, @@ -55,7 +55,7 @@ ieee802_11_rx_bss_trans_mgmt_resp(hapd, mgmt->sa, payload, plen); return 0; -@@ -696,6 +699,7 @@ int wnm_send_disassoc_imminent(struct ho +@@ -840,6 +843,7 @@ int wnm_send_disassoc_imminent(struct ho pos = mgmt->u.action.u.bss_tm_req.variable; @@ -63,7 +63,7 @@ wpa_printf(MSG_DEBUG, "WNM: Send BSS Transition Management Request frame to indicate imminent disassociation (disassoc_timer=%d) to " MACSTR, disassoc_timer, MAC2STR(sta->addr)); if (hostapd_drv_send_mlme(hapd, buf, pos - buf, 0, NULL, 0, 0) < 0) { -@@ -777,6 +781,7 @@ int wnm_send_ess_disassoc_imminent(struc +@@ -921,6 +925,7 @@ int wnm_send_ess_disassoc_imminent(struc return -1; } @@ -71,7 +71,7 @@ if (disassoc_timer) { /* send disassociation frame after time-out */ set_disassoc_timer(hapd, sta, disassoc_timer); -@@ -857,6 +862,7 @@ int wnm_send_bss_tm_req(struct hostapd_d +@@ -1001,6 +1006,7 @@ int wnm_send_bss_tm_req(struct hostapd_d } os_free(buf); diff --git a/package/network/services/hostapd/patches/600-ubus_support.patch b/package/network/services/hostapd/patches/600-ubus_support.patch index 4abb6887f6..a6ccf83331 100644 --- a/package/network/services/hostapd/patches/600-ubus_support.patch +++ b/package/network/services/hostapd/patches/600-ubus_support.patch @@ -1,11 +1,12 @@ --- a/hostapd/Makefile +++ b/hostapd/Makefile -@@ -166,6 +166,11 @@ OBJS += ../src/common/hw_features_common +@@ -166,6 +166,12 @@ OBJS += ../src/common/hw_features_common OBJS += ../src/eapol_auth/eapol_auth_sm.o +ifdef CONFIG_UBUS +CFLAGS += -DUBUS_SUPPORT ++OBJS += ../src/utils/uloop.o +OBJS += ../src/ap/ubus.o +LIBS += -lubox -lubus +endif @@ -14,7 +15,7 @@ CFLAGS += -O0 -fprofile-arcs -ftest-coverage --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h -@@ -17,6 +17,7 @@ +@@ -18,6 +18,7 @@ #include "utils/list.h" #include "ap_config.h" #include "drivers/driver.h" @@ -22,16 +23,7 @@ #define OCE_STA_CFON_ENABLED(hapd) \ ((hapd->conf->oce & OCE_STA_CFON) && \ -@@ -80,7 +81,7 @@ struct hapd_interfaces { - #ifdef CONFIG_CTRL_IFACE_UDP - unsigned char ctrl_iface_cookie[CTRL_IFACE_COOKIE_LEN]; - #endif /* CONFIG_CTRL_IFACE_UDP */ -- -+ struct ubus_object ubus; - }; - - enum hostapd_chan_status { -@@ -171,6 +172,7 @@ struct hostapd_data { +@@ -184,6 +185,7 @@ struct hostapd_data { struct hostapd_iface *iface; struct hostapd_config *iconf; struct hostapd_bss_config *conf; @@ -39,7 +31,7 @@ int interface_added; /* virtual interface added for this BSS */ unsigned int started:1; unsigned int disabled:1; -@@ -630,6 +632,7 @@ hostapd_alloc_bss_data(struct hostapd_if +@@ -695,6 +697,7 @@ hostapd_alloc_bss_data(struct hostapd_if struct hostapd_bss_config *bss); int hostapd_setup_interface(struct hostapd_iface *iface); int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err); @@ -49,7 +41,7 @@ struct hostapd_iface * hostapd_alloc_iface(void); --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c -@@ -396,6 +396,7 @@ void hostapd_free_hapd_data(struct hosta +@@ -435,6 +435,7 @@ void hostapd_free_hapd_data(struct hosta hapd->beacon_set_done = 0; wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface); @@ -57,7 +49,7 @@ accounting_deinit(hapd); hostapd_deinit_wpa(hapd); vlan_deinit(hapd); -@@ -1422,6 +1423,8 @@ static int hostapd_setup_bss(struct host +@@ -1187,6 +1188,8 @@ static int hostapd_start_beacon(struct h if (hapd->driver && hapd->driver->set_operstate) hapd->driver->set_operstate(hapd->drv_priv, 1); @@ -66,7 +58,7 @@ return 0; } -@@ -2028,6 +2031,7 @@ static int hostapd_setup_interface_compl +@@ -2275,6 +2278,7 @@ static int hostapd_setup_interface_compl if (err) goto fail; @@ -74,15 +66,15 @@ wpa_printf(MSG_DEBUG, "Completing interface initialization"); if (iface->freq) { #ifdef NEED_AP_MLME -@@ -2225,6 +2229,7 @@ dfs_offload: +@@ -2494,6 +2498,7 @@ dfs_offload: fail: wpa_printf(MSG_ERROR, "Interface initialization failed"); + hostapd_ubus_free_iface(iface); - hostapd_set_state(iface, HAPD_IFACE_DISABLED); - wpa_msg(hapd->msg_ctx, MSG_INFO, AP_EVENT_DISABLED); - #ifdef CONFIG_FST -@@ -2700,6 +2705,7 @@ void hostapd_interface_deinit_free(struc + + if (iface->is_no_ir) { + hostapd_set_state(iface, HAPD_IFACE_NO_IR); +@@ -2984,6 +2989,7 @@ void hostapd_interface_deinit_free(struc (unsigned int) iface->conf->num_bss); driver = iface->bss[0]->driver; drv_priv = iface->bss[0]->drv_priv; @@ -92,7 +84,7 @@ __func__, driver, drv_priv); --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c -@@ -3553,13 +3553,18 @@ static void handle_auth(struct hostapd_d +@@ -2786,7 +2786,7 @@ static void handle_auth(struct hostapd_d u16 auth_alg, auth_transaction, status_code; u16 resp = WLAN_STATUS_SUCCESS; struct sta_info *sta = NULL; @@ -101,9 +93,10 @@ u16 fc; const u8 *challenge = NULL; u8 resp_ies[2 + WLAN_AUTH_CHALLENGE_LEN]; - size_t resp_ies_len = 0; - u16 seq_ctrl; +@@ -2795,6 +2795,11 @@ static void handle_auth(struct hostapd_d struct radius_sta rad_info; + const u8 *dst, *sa, *bssid; + bool mld_sta = false; + struct hostapd_ubus_request req = { + .type = HOSTAPD_UBUS_AUTH_REQ, + .mgmt_frame = mgmt, @@ -112,7 +105,7 @@ if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.auth)) { wpa_printf(MSG_INFO, "handle_auth - too short payload (len=%lu)", -@@ -3727,6 +3732,13 @@ static void handle_auth(struct hostapd_d +@@ -2986,6 +2991,13 @@ static void handle_auth(struct hostapd_d resp = WLAN_STATUS_UNSPECIFIED_FAILURE; goto fail; } @@ -126,7 +119,7 @@ if (res == HOSTAPD_ACL_PENDING) return; -@@ -5447,7 +5459,7 @@ static void handle_assoc(struct hostapd_ +@@ -5161,7 +5173,7 @@ static void handle_assoc(struct hostapd_ int resp = WLAN_STATUS_SUCCESS; u16 reply_res = WLAN_STATUS_UNSPECIFIED_FAILURE; const u8 *pos; @@ -135,7 +128,7 @@ struct sta_info *sta; u8 *tmp = NULL; #ifdef CONFIG_FILS -@@ -5660,6 +5672,11 @@ static void handle_assoc(struct hostapd_ +@@ -5374,6 +5386,11 @@ static void handle_assoc(struct hostapd_ left = res; } #endif /* CONFIG_FILS */ @@ -147,7 +140,7 @@ /* followed by SSID and Supported rates; and HT capabilities if 802.11n * is used */ -@@ -5758,6 +5775,13 @@ static void handle_assoc(struct hostapd_ +@@ -5472,6 +5489,13 @@ static void handle_assoc(struct hostapd_ } #endif /* CONFIG_FILS */ @@ -161,26 +154,26 @@ fail: /* -@@ -5851,6 +5875,7 @@ static void handle_disassoc(struct hosta - wpa_printf(MSG_DEBUG, "disassocation: STA=" MACSTR " reason_code=%d", - MAC2STR(mgmt->sa), - le_to_host16(mgmt->u.disassoc.reason_code)); +@@ -5753,6 +5777,7 @@ static void handle_disassoc(struct hosta + (unsigned long) len); + return; + } + hostapd_ubus_notify(hapd, "disassoc", mgmt->sa); sta = ap_get_sta(hapd, mgmt->sa); - if (sta == NULL) { -@@ -5920,6 +5945,8 @@ static void handle_deauth(struct hostapd + if (!sta) { +@@ -5784,6 +5809,8 @@ static void handle_deauth(struct hostapd /* Clear the PTKSA cache entries for PASN */ ptksa_cache_flush(hapd->ptksa, mgmt->sa, WPA_CIPHER_NONE); + hostapd_ubus_notify(hapd, "deauth", mgmt->sa); + sta = ap_get_sta(hapd, mgmt->sa); - if (sta == NULL) { - wpa_msg(hapd->msg_ctx, MSG_DEBUG, "Station " MACSTR " trying " + if (!sta) { + wpa_msg(hapd->msg_ctx, MSG_DEBUG, "Station " MACSTR --- a/src/ap/beacon.c +++ b/src/ap/beacon.c -@@ -852,6 +852,12 @@ void handle_probe_req(struct hostapd_dat +@@ -1036,6 +1036,12 @@ void handle_probe_req(struct hostapd_dat u16 csa_offs[2]; size_t csa_offs_len; struct radius_sta rad_info; @@ -193,7 +186,7 @@ if (hapd->iconf->rssi_ignore_probe_request && ssi_signal && ssi_signal < hapd->iconf->rssi_ignore_probe_request) -@@ -1038,6 +1044,12 @@ void handle_probe_req(struct hostapd_dat +@@ -1222,6 +1228,12 @@ void handle_probe_req(struct hostapd_dat } #endif /* CONFIG_P2P */ @@ -208,7 +201,7 @@ --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c -@@ -145,6 +145,10 @@ int hostapd_notif_assoc(struct hostapd_d +@@ -260,6 +260,10 @@ int hostapd_notif_assoc(struct hostapd_d u16 reason = WLAN_REASON_UNSPECIFIED; int status = WLAN_STATUS_SUCCESS; const u8 *p2p_dev_addr = NULL; @@ -219,7 +212,7 @@ if (addr == NULL) { /* -@@ -237,6 +241,12 @@ int hostapd_notif_assoc(struct hostapd_d +@@ -396,6 +400,12 @@ int hostapd_notif_assoc(struct hostapd_d goto fail; } @@ -234,7 +227,7 @@ wpabuf_free(sta->p2p_ie); --- a/src/ap/sta_info.c +++ b/src/ap/sta_info.c -@@ -458,6 +458,7 @@ void ap_handle_timer(void *eloop_ctx, vo +@@ -471,6 +471,7 @@ void ap_handle_timer(void *eloop_ctx, vo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_INFO, "deauthenticated due to " "local deauth request"); @@ -242,7 +235,7 @@ ap_free_sta(hapd, sta); return; } -@@ -613,6 +614,7 @@ skip_poll: +@@ -626,6 +627,7 @@ skip_poll: mlme_deauthenticate_indication( hapd, sta, WLAN_REASON_PREV_AUTH_NOT_VALID); @@ -250,8 +243,67 @@ ap_free_sta(hapd, sta); break; } -@@ -1329,6 +1331,7 @@ void ap_sta_set_authorized(struct hostap - buf, ip_addr, keyid_buf); +@@ -1344,15 +1346,28 @@ void ap_sta_set_authorized(struct hostap + sta->addr, authorized, dev_addr); + + if (authorized) { ++ static const char * const auth_algs[] = { ++ [WLAN_AUTH_OPEN] = "open", ++ [WLAN_AUTH_SHARED_KEY] = "shared", ++ [WLAN_AUTH_FT] = "ft", ++ [WLAN_AUTH_SAE] = "sae", ++ [WLAN_AUTH_FILS_SK] = "fils-sk", ++ [WLAN_AUTH_FILS_SK_PFS] = "fils-sk-pfs", ++ [WLAN_AUTH_FILS_PK] = "fils-pk", ++ [WLAN_AUTH_PASN] = "pasn", ++ }; ++ const char *auth_alg = NULL; + const u8 *dpp_pkhash; + const char *keyid; + char dpp_pkhash_buf[100]; + char keyid_buf[100]; + char ip_addr[100]; ++ char alg_buf[100]; + + dpp_pkhash_buf[0] = '\0'; + keyid_buf[0] = '\0'; + ip_addr[0] = '\0'; ++ alg_buf[0] = '\0'; + #ifdef CONFIG_P2P + if (wpa_auth_get_ip_addr(sta->wpa_sm, ip_addr_buf) == 0) { + os_snprintf(ip_addr, sizeof(ip_addr), +@@ -1362,6 +1377,13 @@ void ap_sta_set_authorized(struct hostap + } + #endif /* CONFIG_P2P */ + ++ if (sta->auth_alg < ARRAY_SIZE(auth_algs)) ++ auth_alg = auth_algs[sta->auth_alg]; ++ ++ if (auth_alg) ++ os_snprintf(alg_buf, sizeof(alg_buf), ++ " auth_alg=%s", auth_alg); ++ + keyid = ap_sta_wpa_get_keyid(hapd, sta); + if (keyid) { + os_snprintf(keyid_buf, sizeof(keyid_buf), +@@ -1380,17 +1402,19 @@ void ap_sta_set_authorized(struct hostap + dpp_pkhash, SHA256_MAC_LEN); + } + +- wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_CONNECTED "%s%s%s%s", +- buf, ip_addr, keyid_buf, dpp_pkhash_buf); ++ hostapd_ubus_notify_authorized(hapd, sta, auth_alg); ++ wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_CONNECTED "%s%s%s%s%s", ++ buf, ip_addr, keyid_buf, dpp_pkhash_buf, alg_buf); + + if (hapd->msg_ctx_parent && + hapd->msg_ctx_parent != hapd->msg_ctx) + wpa_msg_no_global(hapd->msg_ctx_parent, MSG_INFO, +- AP_STA_CONNECTED "%s%s%s%s", ++ AP_STA_CONNECTED "%s%s%s%s%s", + buf, ip_addr, keyid_buf, +- dpp_pkhash_buf); ++ dpp_pkhash_buf, alg_buf); } else { wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_DISCONNECTED "%s", buf); + hostapd_ubus_notify(hapd, "disassoc", sta->addr); @@ -260,7 +312,7 @@ hapd->msg_ctx_parent != hapd->msg_ctx) --- a/src/ap/wpa_auth_glue.c +++ b/src/ap/wpa_auth_glue.c -@@ -265,6 +265,7 @@ static void hostapd_wpa_auth_psk_failure +@@ -269,6 +269,7 @@ static void hostapd_wpa_auth_psk_failure struct hostapd_data *hapd = ctx; wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_POSSIBLE_PSK_MISMATCH MACSTR, MAC2STR(addr)); @@ -270,20 +322,21 @@ --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile -@@ -176,6 +176,12 @@ ifdef CONFIG_EAPOL_TEST +@@ -192,6 +192,13 @@ ifdef CONFIG_EAPOL_TEST CFLAGS += -Werror -DEAPOL_TEST endif +ifdef CONFIG_UBUS +CFLAGS += -DUBUS_SUPPORT +OBJS += ubus.o ++OBJS += ../src/utils/uloop.o +LIBS += -lubox -lubus +endif + ifdef CONFIG_CODE_COVERAGE CFLAGS += -O0 -fprofile-arcs -ftest-coverage LIBS += -lgcov -@@ -962,6 +968,9 @@ ifdef CONFIG_CTRL_IFACE_MIB +@@ -987,6 +994,9 @@ ifdef CONFIG_CTRL_IFACE_MIB CFLAGS += -DCONFIG_CTRL_IFACE_MIB endif OBJS += ../src/ap/ctrl_iface_ap.o @@ -295,7 +348,7 @@ CFLAGS += -DEAP_SERVER -DEAP_SERVER_IDENTITY --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c -@@ -7241,6 +7241,8 @@ struct wpa_supplicant * wpa_supplicant_a +@@ -7595,6 +7595,8 @@ struct wpa_supplicant * wpa_supplicant_a } #endif /* CONFIG_P2P */ @@ -304,7 +357,7 @@ return wpa_s; } -@@ -7267,6 +7269,8 @@ int wpa_supplicant_remove_iface(struct w +@@ -7621,6 +7623,8 @@ int wpa_supplicant_remove_iface(struct w struct wpa_supplicant *parent = wpa_s->parent; #endif /* CONFIG_MESH */ @@ -313,7 +366,7 @@ /* Remove interface from the global list of interfaces */ prev = global->ifaces; if (prev == wpa_s) { -@@ -7570,8 +7574,12 @@ int wpa_supplicant_run(struct wpa_global +@@ -7967,8 +7971,12 @@ int wpa_supplicant_run(struct wpa_global eloop_register_signal_terminate(wpa_supplicant_terminate, global); eloop_register_signal_reconfig(wpa_supplicant_reconfig, global); @@ -328,15 +381,15 @@ --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h -@@ -19,6 +19,7 @@ - #include "wps/wps_defs.h" +@@ -21,6 +21,7 @@ #include "config_ssid.h" #include "wmm_ac.h" + #include "pasn/pasn_common.h" +#include "ubus.h" extern const char *const wpa_supplicant_version; extern const char *const wpa_supplicant_license; -@@ -322,6 +323,8 @@ struct wpa_global { +@@ -319,6 +320,8 @@ struct wpa_global { #endif /* CONFIG_WIFI_DISPLAY */ struct psk_list_entry *add_psk; /* From group formation */ @@ -345,7 +398,7 @@ }; -@@ -708,6 +711,7 @@ struct wpa_supplicant { +@@ -685,6 +688,7 @@ struct wpa_supplicant { unsigned char own_addr[ETH_ALEN]; unsigned char perm_addr[ETH_ALEN]; char ifname[100]; @@ -363,7 +416,7 @@ #ifndef WPS_PIN_SCAN_IGNORE_SEL_REG -@@ -393,6 +394,8 @@ static int wpa_supplicant_wps_cred(void +@@ -402,6 +403,8 @@ static int wpa_supplicant_wps_cred(void wpa_hexdump_key(MSG_DEBUG, "WPS: Received Credential attribute", cred->cred_attr, cred->cred_attr_len); @@ -372,36 +425,18 @@ if (wpa_s->conf->wps_cred_processing == 1) return 0; ---- a/hostapd/main.c -+++ b/hostapd/main.c -@@ -895,6 +895,7 @@ int main(int argc, char *argv[]) - } - - hostapd_global_ctrl_iface_init(&interfaces); -+ hostapd_ubus_add(&interfaces); - - if (hostapd_global_run(&interfaces, daemonize, pid_file)) { - wpa_printf(MSG_ERROR, "Failed to start eloop"); -@@ -904,6 +905,7 @@ int main(int argc, char *argv[]) - ret = 0; - - out: -+ hostapd_ubus_free(&interfaces); - hostapd_global_ctrl_iface_deinit(&interfaces); - /* Deinitialize all interfaces */ - for (i = 0; i < interfaces.count; i++) { --- a/wpa_supplicant/main.c +++ b/wpa_supplicant/main.c @@ -203,7 +203,7 @@ int main(int argc, char *argv[]) for (;;) { c = getopt(argc, argv, -- "b:Bc:C:D:de:f:g:G:hH:i:I:KLMm:No:O:p:P:qsTtuv::W"); -+ "b:Bc:C:D:de:f:g:G:hH:i:I:KLMm:nNo:O:p:P:qsTtuv::W"); +- "b:Bc:C:D:de:f:g:G:hi:I:KLMm:No:O:p:P:qsTtuv::W"); ++ "b:Bc:C:D:de:f:g:G:hi:I:KLMm:nNo:O:p:P:qsTtuv::W"); if (c < 0) break; switch (c) { -@@ -271,6 +271,9 @@ int main(int argc, char *argv[]) +@@ -268,6 +268,9 @@ int main(int argc, char *argv[]) params.conf_p2p_dev = optarg; break; #endif /* CONFIG_P2P */ @@ -473,7 +508,7 @@ --- a/src/ap/dfs.c +++ b/src/ap/dfs.c -@@ -1196,6 +1196,8 @@ int hostapd_dfs_radar_detected(struct ho +@@ -1216,6 +1216,8 @@ int hostapd_dfs_pre_cac_expired(struct h "freq=%d ht_enabled=%d chan_offset=%d chan_width=%d cf1=%d cf2=%d", freq, ht_enabled, chan_offset, chan_width, cf1, cf2); @@ -515,7 +550,7 @@ } --- a/src/ap/sta_info.h +++ b/src/ap/sta_info.h -@@ -324,6 +324,7 @@ struct sta_info { +@@ -322,6 +322,7 @@ struct sta_info { #endif /* CONFIG_TESTING_OPTIONS */ #ifdef CONFIG_AIRTIME_POLICY unsigned int airtime_weight; @@ -525,9 +560,9 @@ --- a/src/ap/wnm_ap.c +++ b/src/ap/wnm_ap.c -@@ -442,7 +442,8 @@ static void ieee802_11_rx_bss_trans_mgmt - wpa_hexdump(MSG_DEBUG, "WNM: BSS Transition Candidate List Entries", - pos, end - pos); +@@ -455,7 +455,8 @@ static void ieee802_11_rx_bss_trans_mgmt + MAC2STR(addr), reason, hex ? " neighbor=" : "", hex); + os_free(hex); - ieee802_11_send_bss_trans_mgmt_request(hapd, addr, dialog_token); + if (!hostapd_ubus_notify_bss_transition_query(hapd, addr, dialog_token, reason, pos, end - pos)) @@ -535,7 +570,7 @@ } -@@ -464,7 +465,7 @@ static void ieee802_11_rx_bss_trans_mgmt +@@ -477,7 +478,7 @@ static void ieee802_11_rx_bss_trans_mgmt size_t len) { u8 dialog_token, status_code, bss_termination_delay; @@ -544,7 +579,7 @@ int enabled = hapd->conf->bss_transition; struct sta_info *sta; -@@ -511,6 +512,7 @@ static void ieee802_11_rx_bss_trans_mgmt +@@ -524,6 +525,7 @@ static void ieee802_11_rx_bss_trans_mgmt wpa_printf(MSG_DEBUG, "WNM: not enough room for Target BSSID field"); return; } @@ -552,7 +587,7 @@ sta->agreed_to_steer = 1; eloop_cancel_timeout(ap_sta_reset_steer_flag_timer, hapd, sta); eloop_register_timeout(2, 0, ap_sta_reset_steer_flag_timer, -@@ -530,6 +532,10 @@ static void ieee802_11_rx_bss_trans_mgmt +@@ -543,6 +545,10 @@ static void ieee802_11_rx_bss_trans_mgmt MAC2STR(addr), status_code, bss_termination_delay); } @@ -563,3 +598,151 @@ wpa_hexdump(MSG_DEBUG, "WNM: BSS Transition Candidate List Entries", pos, end - pos); } +--- a/src/utils/eloop.c ++++ b/src/utils/eloop.c +@@ -77,6 +77,9 @@ struct eloop_sock_table { + struct eloop_data { + int max_sock; + ++ eloop_timeout_poll_handler timeout_poll_cb; ++ eloop_poll_handler poll_cb; ++ + size_t count; /* sum of all table counts */ + #ifdef CONFIG_ELOOP_POLL + size_t max_pollfd_map; /* number of pollfds_map currently allocated */ +@@ -1121,6 +1124,12 @@ void eloop_run(void) + os_reltime_sub(&timeout->time, &now, &tv); + else + tv.sec = tv.usec = 0; ++ } ++ ++ if (eloop.timeout_poll_cb && eloop.timeout_poll_cb(&tv, !!timeout)) ++ timeout = (void *)1; ++ ++ if (timeout) { + #if defined(CONFIG_ELOOP_POLL) || defined(CONFIG_ELOOP_EPOLL) + timeout_ms = tv.sec * 1000 + tv.usec / 1000; + #endif /* defined(CONFIG_ELOOP_POLL) || defined(CONFIG_ELOOP_EPOLL) */ +@@ -1190,7 +1199,8 @@ void eloop_run(void) + eloop.exceptions.changed = 0; + + eloop_process_pending_signals(); +- ++ if (eloop.poll_cb) ++ eloop.poll_cb(); + + /* check if some registered timeouts have occurred */ + timeout = dl_list_first(&eloop.timeout, struct eloop_timeout, +@@ -1252,6 +1262,14 @@ out: + return; + } + ++int eloop_register_cb(eloop_poll_handler poll_cb, ++ eloop_timeout_poll_handler timeout_cb) ++{ ++ eloop.poll_cb = poll_cb; ++ eloop.timeout_poll_cb = timeout_cb; ++ ++ return 0; ++} + + void eloop_terminate(void) + { +--- a/src/utils/eloop.h ++++ b/src/utils/eloop.h +@@ -65,6 +65,9 @@ typedef void (*eloop_timeout_handler)(vo + */ + typedef void (*eloop_signal_handler)(int sig, void *signal_ctx); + ++typedef bool (*eloop_timeout_poll_handler)(struct os_reltime *tv, bool tv_set); ++typedef void (*eloop_poll_handler)(void); ++ + /** + * eloop_init() - Initialize global event loop data + * Returns: 0 on success, -1 on failure +@@ -73,6 +76,9 @@ typedef void (*eloop_signal_handler)(int + */ + int eloop_init(void); + ++int eloop_register_cb(eloop_poll_handler poll_cb, ++ eloop_timeout_poll_handler timeout_cb); ++ + /** + * eloop_register_read_sock - Register handler for read events + * @sock: File descriptor number for the socket +@@ -320,6 +326,8 @@ int eloop_register_signal_reconfig(eloop + */ + int eloop_sock_requeue(void); + ++void eloop_add_uloop(void); ++ + /** + * eloop_run - Start the event loop + * +--- /dev/null ++++ b/src/utils/uloop.c +@@ -0,0 +1,64 @@ ++#include ++#include "includes.h" ++#include "common.h" ++#include "eloop.h" ++ ++static void eloop_uloop_event_cb(int sock, void *eloop_ctx, void *sock_ctx) ++{ ++} ++ ++static void eloop_uloop_fd_cb(struct uloop_fd *fd, unsigned int events) ++{ ++ unsigned int changed = events ^ fd->flags; ++ ++ if (changed & ULOOP_READ) { ++ if (events & ULOOP_READ) ++ eloop_register_sock(fd->fd, EVENT_TYPE_READ, eloop_uloop_event_cb, fd, fd); ++ else ++ eloop_unregister_sock(fd->fd, EVENT_TYPE_READ); ++ } ++ ++ if (changed & ULOOP_WRITE) { ++ if (events & ULOOP_WRITE) ++ eloop_register_sock(fd->fd, EVENT_TYPE_WRITE, eloop_uloop_event_cb, fd, fd); ++ else ++ eloop_unregister_sock(fd->fd, EVENT_TYPE_WRITE); ++ } ++} ++ ++static bool uloop_timeout_poll_handler(struct os_reltime *tv, bool tv_set) ++{ ++ struct os_reltime tv_uloop; ++ int timeout_ms = uloop_get_next_timeout(); ++ ++ if (timeout_ms < 0) ++ return false; ++ ++ tv_uloop.sec = timeout_ms / 1000; ++ tv_uloop.usec = (timeout_ms % 1000) * 1000; ++ ++ if (!tv_set || os_reltime_before(&tv_uloop, tv)) { ++ *tv = tv_uloop; ++ return true; ++ } ++ ++ return false; ++} ++ ++static void uloop_poll_handler(void) ++{ ++ uloop_run_timeout(0); ++} ++ ++void eloop_add_uloop(void) ++{ ++ static bool init_done = false; ++ ++ if (!init_done) { ++ uloop_init(); ++ uloop_fd_set_cb = eloop_uloop_fd_cb; ++ init_done = true; ++ } ++ ++ eloop_register_cb(uloop_poll_handler, uloop_timeout_poll_handler); ++} diff --git a/package/network/services/hostapd/patches/601-ucode_support.patch b/package/network/services/hostapd/patches/601-ucode_support.patch new file mode 100644 index 0000000000..23f535b685 --- /dev/null +++ b/package/network/services/hostapd/patches/601-ucode_support.patch @@ -0,0 +1,553 @@ +--- a/hostapd/Makefile ++++ b/hostapd/Makefile +@@ -168,9 +168,21 @@ OBJS += ../src/eapol_auth/eapol_auth_sm. + + ifdef CONFIG_UBUS + CFLAGS += -DUBUS_SUPPORT +-OBJS += ../src/utils/uloop.o + OBJS += ../src/ap/ubus.o +-LIBS += -lubox -lubus ++LIBS += -lubus ++NEED_ULOOP:=y ++endif ++ ++ifdef CONFIG_UCODE ++CFLAGS += -DUCODE_SUPPORT ++OBJS += ../src/utils/ucode.o ++OBJS += ../src/ap/ucode.o ++NEED_ULOOP:=y ++endif ++ ++ifdef NEED_ULOOP ++OBJS += ../src/utils/uloop.o ++LIBS += -lubox + endif + + ifdef CONFIG_CODE_COVERAGE +--- a/hostapd/main.c ++++ b/hostapd/main.c +@@ -1007,6 +1007,7 @@ int main(int argc, char *argv[]) + } + + hostapd_global_ctrl_iface_init(&interfaces); ++ hostapd_ucode_init(&interfaces); + + if (hostapd_global_run(&interfaces, daemonize, pid_file)) { + wpa_printf(MSG_ERROR, "Failed to start eloop"); +@@ -1016,6 +1017,7 @@ int main(int argc, char *argv[]) + ret = 0; + + out: ++ hostapd_ucode_free(); + hostapd_global_ctrl_iface_deinit(&interfaces); + /* Deinitialize all interfaces */ + for (i = 0; i < interfaces.count; i++) { +--- a/src/ap/hostapd.h ++++ b/src/ap/hostapd.h +@@ -19,6 +19,7 @@ + #include "ap_config.h" + #include "drivers/driver.h" + #include "ubus.h" ++#include "ucode.h" + + #define OCE_STA_CFON_ENABLED(hapd) \ + ((hapd->conf->oce & OCE_STA_CFON) && \ +@@ -51,6 +52,10 @@ struct hapd_interfaces { + struct hostapd_config * (*config_read_cb)(const char *config_fname); + int (*ctrl_iface_init)(struct hostapd_data *hapd); + void (*ctrl_iface_deinit)(struct hostapd_data *hapd); ++ int (*ctrl_iface_recv)(struct hostapd_data *hapd, ++ char *buf, char *reply, int reply_size, ++ struct sockaddr_storage *from, ++ socklen_t fromlen); + int (*for_each_interface)(struct hapd_interfaces *interfaces, + int (*cb)(struct hostapd_iface *iface, + void *ctx), void *ctx); +@@ -186,6 +191,7 @@ struct hostapd_data { + struct hostapd_config *iconf; + struct hostapd_bss_config *conf; + struct hostapd_ubus_bss ubus; ++ struct hostapd_ucode_bss ucode; + int interface_added; /* virtual interface added for this BSS */ + unsigned int started:1; + unsigned int disabled:1; +@@ -506,6 +512,7 @@ struct hostapd_sta_info { + */ + struct hostapd_iface { + struct hapd_interfaces *interfaces; ++ struct hostapd_ucode_iface ucode; + void *owner; + char *config_fname; + struct hostapd_config *conf; +@@ -706,6 +713,8 @@ struct hostapd_iface * hostapd_init(stru + struct hostapd_iface * + hostapd_interface_init_bss(struct hapd_interfaces *interfaces, const char *phy, + const char *config_fname, int debug); ++int hostapd_setup_bss(struct hostapd_data *hapd, int first, bool start_beacon); ++void hostapd_bss_deinit(struct hostapd_data *hapd); + void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta, + int reassoc); + void hostapd_interface_deinit_free(struct hostapd_iface *iface); +--- a/src/ap/hostapd.c ++++ b/src/ap/hostapd.c +@@ -252,6 +252,8 @@ int hostapd_reload_config(struct hostapd + struct hostapd_config *newconf, *oldconf; + size_t j; + ++ hostapd_ucode_reload_bss(hapd); ++ + if (iface->config_fname == NULL) { + /* Only in-memory config in use - assume it has been updated */ + hostapd_clear_old(iface); +@@ -435,6 +437,7 @@ void hostapd_free_hapd_data(struct hosta + hapd->beacon_set_done = 0; + + wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface); ++ hostapd_ucode_free_bss(hapd); + hostapd_ubus_free_bss(hapd); + accounting_deinit(hapd); + hostapd_deinit_wpa(hapd); +@@ -600,6 +603,7 @@ void hostapd_cleanup_iface_partial(struc + static void hostapd_cleanup_iface(struct hostapd_iface *iface) + { + wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); ++ hostapd_ucode_free_iface(iface); + eloop_cancel_timeout(hostapd_interface_setup_failure_handler, iface, + NULL); + +@@ -1189,6 +1193,7 @@ static int hostapd_start_beacon(struct h + hapd->driver->set_operstate(hapd->drv_priv, 1); + + hostapd_ubus_add_bss(hapd); ++ hostapd_ucode_add_bss(hapd); + + return 0; + } +@@ -1211,8 +1216,7 @@ static int hostapd_start_beacon(struct h + * initialized. Most of the modules that are initialized here will be + * deinitialized in hostapd_cleanup(). + */ +-static int hostapd_setup_bss(struct hostapd_data *hapd, int first, +- bool start_beacon) ++int hostapd_setup_bss(struct hostapd_data *hapd, int first, bool start_beacon) + { + struct hostapd_bss_config *conf = hapd->conf; + u8 ssid[SSID_MAX_LEN + 1]; +@@ -2698,7 +2702,7 @@ hostapd_alloc_bss_data(struct hostapd_if + } + + +-static void hostapd_bss_deinit(struct hostapd_data *hapd) ++void hostapd_bss_deinit(struct hostapd_data *hapd) + { + if (!hapd) + return; +@@ -3491,7 +3495,8 @@ int hostapd_remove_iface(struct hapd_int + hapd_iface = interfaces->iface[i]; + if (hapd_iface == NULL) + return -1; +- if (!os_strcmp(hapd_iface->conf->bss[0]->iface, buf)) { ++ if (!os_strcmp(hapd_iface->phy, buf) || ++ !os_strcmp(hapd_iface->conf->bss[0]->iface, buf)) { + wpa_printf(MSG_INFO, "Remove interface '%s'", buf); + hapd_iface->driver_ap_teardown = + !!(hapd_iface->drv_flags & +--- a/wpa_supplicant/Makefile ++++ b/wpa_supplicant/Makefile +@@ -195,8 +195,20 @@ endif + ifdef CONFIG_UBUS + CFLAGS += -DUBUS_SUPPORT + OBJS += ubus.o ++LIBS += -lubus ++NEED_ULOOP:=y ++endif ++ ++ifdef CONFIG_UCODE ++CFLAGS += -DUCODE_SUPPORT ++OBJS += ../src/utils/ucode.o ++OBJS += ucode.o ++NEED_ULOOP:=y ++endif ++ ++ifdef NEED_ULOOP + OBJS += ../src/utils/uloop.o +-LIBS += -lubox -lubus ++LIBS += -lubox + endif + + ifdef CONFIG_CODE_COVERAGE +@@ -997,6 +1009,9 @@ OBJS += ../src/ap/ctrl_iface_ap.o + ifdef CONFIG_UBUS + OBJS += ../src/ap/ubus.o + endif ++ifdef CONFIG_UCODE ++OBJS += ../src/ap/ucode.o ++endif + endif + + CFLAGS += -DEAP_SERVER -DEAP_SERVER_IDENTITY +--- a/wpa_supplicant/wpa_supplicant.c ++++ b/wpa_supplicant/wpa_supplicant.c +@@ -1044,6 +1044,7 @@ void wpa_supplicant_set_state(struct wpa + sme_sched_obss_scan(wpa_s, 0); + } + wpa_s->wpa_state = state; ++ wpas_ucode_update_state(wpa_s); + + #ifdef CONFIG_BGSCAN + if (state == WPA_COMPLETED && wpa_s->current_ssid != wpa_s->bgscan_ssid) +@@ -7596,6 +7597,7 @@ struct wpa_supplicant * wpa_supplicant_a + #endif /* CONFIG_P2P */ + + wpas_ubus_add_bss(wpa_s); ++ wpas_ucode_add_bss(wpa_s); + + return wpa_s; + } +@@ -7623,6 +7625,7 @@ int wpa_supplicant_remove_iface(struct w + struct wpa_supplicant *parent = wpa_s->parent; + #endif /* CONFIG_MESH */ + ++ wpas_ucode_free_bss(wpa_s); + wpas_ubus_free_bss(wpa_s); + + /* Remove interface from the global list of interfaces */ +@@ -7933,6 +7936,7 @@ struct wpa_global * wpa_supplicant_init( + + eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0, + wpas_periodic, global, NULL); ++ wpas_ucode_init(global); + + return global; + } +@@ -7971,12 +7975,8 @@ int wpa_supplicant_run(struct wpa_global + eloop_register_signal_terminate(wpa_supplicant_terminate, global); + eloop_register_signal_reconfig(wpa_supplicant_reconfig, global); + +- wpas_ubus_add(global); +- + eloop_run(); + +- wpas_ubus_free(global); +- + return 0; + } + +@@ -8009,6 +8009,8 @@ void wpa_supplicant_deinit(struct wpa_gl + + wpas_notify_supplicant_deinitialized(global); + ++ wpas_ucode_free(); ++ + eap_peer_unregister_methods(); + #ifdef CONFIG_AP + eap_server_unregister_methods(); +--- a/wpa_supplicant/wpa_supplicant_i.h ++++ b/wpa_supplicant/wpa_supplicant_i.h +@@ -22,6 +22,7 @@ + #include "wmm_ac.h" + #include "pasn/pasn_common.h" + #include "ubus.h" ++#include "ucode.h" + + extern const char *const wpa_supplicant_version; + extern const char *const wpa_supplicant_license; +@@ -689,6 +690,7 @@ struct wpa_supplicant { + unsigned char perm_addr[ETH_ALEN]; + char ifname[100]; + struct wpas_ubus_bss ubus; ++ struct wpas_ucode_bss ucode; + #ifdef CONFIG_MATCH_IFACE + int matched; + #endif /* CONFIG_MATCH_IFACE */ +--- a/hostapd/ctrl_iface.c ++++ b/hostapd/ctrl_iface.c +@@ -4856,6 +4856,7 @@ try_again: + return -1; + } + ++ interface->ctrl_iface_recv = hostapd_ctrl_iface_receive_process; + wpa_msg_register_cb(hostapd_ctrl_iface_msg_cb); + + return 0; +@@ -4957,6 +4958,7 @@ fail: + os_free(fname); + + interface->global_ctrl_sock = s; ++ interface->ctrl_iface_recv = hostapd_ctrl_iface_receive_process; + eloop_register_read_sock(s, hostapd_global_ctrl_iface_receive, + interface, NULL); + +--- a/src/drivers/driver.h ++++ b/src/drivers/driver.h +@@ -3787,6 +3787,25 @@ struct wpa_driver_ops { + const char *ifname); + + /** ++ * if_rename - Rename a virtual interface ++ * @priv: Private driver interface data ++ * @type: Interface type ++ * @ifname: Interface name of the virtual interface to be renamed ++ * (NULL when renaming the AP BSS interface) ++ * @new_name: New interface name of the virtual interface ++ * Returns: 0 on success, -1 on failure ++ */ ++ int (*if_rename)(void *priv, enum wpa_driver_if_type type, ++ const char *ifname, const char *new_name); ++ ++ /** ++ * set_first_bss - Make a virtual interface the first (primary) bss ++ * @priv: Private driver interface data ++ * Returns: 0 on success, -1 on failure ++ */ ++ int (*set_first_bss)(void *priv); ++ ++ /** + * set_sta_vlan - Bind a station into a specific interface (AP only) + * @priv: Private driver interface data + * @ifname: Interface (main or virtual BSS or VLAN) +@@ -6440,6 +6459,7 @@ union wpa_event_data { + + /** + * struct ch_switch ++ * @count: Count until channel switch activates + * @freq: Frequency of new channel in MHz + * @ht_enabled: Whether this is an HT channel + * @ch_offset: Secondary channel offset +@@ -6450,6 +6470,7 @@ union wpa_event_data { + * @punct_bitmap: Puncturing bitmap + */ + struct ch_switch { ++ int count; + int freq; + int ht_enabled; + int ch_offset; +--- a/src/drivers/driver_nl80211_event.c ++++ b/src/drivers/driver_nl80211_event.c +@@ -1202,6 +1202,7 @@ static void mlme_event_ch_switch(struct + struct nlattr *bw, struct nlattr *cf1, + struct nlattr *cf2, + struct nlattr *punct_bitmap, ++ struct nlattr *count, + int finished) + { + struct i802_bss *bss; +@@ -1265,6 +1266,8 @@ static void mlme_event_ch_switch(struct + data.ch_switch.cf1 = nla_get_u32(cf1); + if (cf2) + data.ch_switch.cf2 = nla_get_u32(cf2); ++ if (count) ++ data.ch_switch.count = nla_get_u32(count); + + if (finished) + bss->flink->freq = data.ch_switch.freq; +@@ -3912,6 +3915,7 @@ static void do_process_drv_event(struct + tb[NL80211_ATTR_CENTER_FREQ1], + tb[NL80211_ATTR_CENTER_FREQ2], + tb[NL80211_ATTR_PUNCT_BITMAP], ++ tb[NL80211_ATTR_CH_SWITCH_COUNT], + 0); + break; + case NL80211_CMD_CH_SWITCH_NOTIFY: +@@ -3924,6 +3928,7 @@ static void do_process_drv_event(struct + tb[NL80211_ATTR_CENTER_FREQ1], + tb[NL80211_ATTR_CENTER_FREQ2], + tb[NL80211_ATTR_PUNCT_BITMAP], ++ NULL, + 1); + break; + case NL80211_CMD_DISCONNECT: +--- a/wpa_supplicant/events.c ++++ b/wpa_supplicant/events.c +@@ -5389,6 +5389,7 @@ void supplicant_event(void *ctx, enum wp + event_to_string(event), event); + #endif /* CONFIG_NO_STDOUT_DEBUG */ + ++ wpas_ucode_event(wpa_s, event, data); + switch (event) { + case EVENT_AUTH: + #ifdef CONFIG_FST +--- a/src/ap/ap_drv_ops.h ++++ b/src/ap/ap_drv_ops.h +@@ -393,6 +393,23 @@ static inline int hostapd_drv_stop_ap(st + return hapd->driver->stop_ap(hapd->drv_priv); + } + ++static inline int hostapd_drv_if_rename(struct hostapd_data *hapd, ++ enum wpa_driver_if_type type, ++ const char *ifname, ++ const char *new_name) ++{ ++ if (!hapd->driver || !hapd->driver->if_rename || !hapd->drv_priv) ++ return -1; ++ return hapd->driver->if_rename(hapd->drv_priv, type, ifname, new_name); ++} ++ ++static inline int hostapd_drv_set_first_bss(struct hostapd_data *hapd) ++{ ++ if (!hapd->driver || !hapd->driver->set_first_bss || !hapd->drv_priv) ++ return 0; ++ return hapd->driver->set_first_bss(hapd->drv_priv); ++} ++ + static inline int hostapd_drv_channel_info(struct hostapd_data *hapd, + struct wpa_channel_info *ci) + { +--- a/src/drivers/driver_nl80211.c ++++ b/src/drivers/driver_nl80211.c +@@ -1333,7 +1333,7 @@ static void wpa_driver_nl80211_event_rtm + } + wpa_printf(MSG_DEBUG, "nl80211: Interface down (%s/%s)", + namebuf, ifname); +- if (os_strcmp(drv->first_bss->ifname, ifname) != 0) { ++ if (drv->first_bss->ifindex != ifi->ifi_index) { + wpa_printf(MSG_DEBUG, + "nl80211: Not the main interface (%s) - do not indicate interface down", + drv->first_bss->ifname); +@@ -1369,7 +1369,7 @@ static void wpa_driver_nl80211_event_rtm + } + wpa_printf(MSG_DEBUG, "nl80211: Interface up (%s/%s)", + namebuf, ifname); +- if (os_strcmp(drv->first_bss->ifname, ifname) != 0) { ++ if (drv->first_bss->ifindex != ifi->ifi_index) { + wpa_printf(MSG_DEBUG, + "nl80211: Not the main interface (%s) - do not indicate interface up", + drv->first_bss->ifname); +@@ -8432,6 +8432,7 @@ static void *i802_init(struct hostapd_da + char master_ifname[IFNAMSIZ]; + int ifindex, br_ifindex = 0; + int br_added = 0; ++ int err; + + bss = wpa_driver_nl80211_drv_init(hapd, params->ifname, + params->global_priv, 1, +@@ -8491,21 +8492,17 @@ static void *i802_init(struct hostapd_da + (params->num_bridge == 0 || !params->bridge[0])) + add_ifidx(drv, br_ifindex, drv->ifindex); + +- if (bss->added_if_into_bridge || bss->already_in_bridge) { +- int err; +- +- drv->rtnl_sk = nl_socket_alloc(); +- if (drv->rtnl_sk == NULL) { +- wpa_printf(MSG_ERROR, "nl80211: Failed to allocate nl_sock"); +- goto failed; +- } ++ drv->rtnl_sk = nl_socket_alloc(); ++ if (drv->rtnl_sk == NULL) { ++ wpa_printf(MSG_ERROR, "nl80211: Failed to allocate nl_sock"); ++ goto failed; ++ } + +- err = nl_connect(drv->rtnl_sk, NETLINK_ROUTE); +- if (err) { +- wpa_printf(MSG_ERROR, "nl80211: Failed to connect nl_sock to NETLINK_ROUTE: %s", +- nl_geterror(err)); +- goto failed; +- } ++ err = nl_connect(drv->rtnl_sk, NETLINK_ROUTE); ++ if (err) { ++ wpa_printf(MSG_ERROR, "nl80211: Failed to connect nl_sock to NETLINK_ROUTE: %s", ++ nl_geterror(err)); ++ goto failed; + } + + if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) { +@@ -8875,6 +8872,50 @@ static int wpa_driver_nl80211_if_remove( + return 0; + } + ++static int wpa_driver_nl80211_if_rename(struct i802_bss *bss, ++ enum wpa_driver_if_type type, ++ const char *ifname, const char *new_name) ++{ ++ struct wpa_driver_nl80211_data *drv = bss->drv; ++ struct ifinfomsg ifi = { ++ .ifi_family = AF_UNSPEC, ++ .ifi_index = bss->ifindex, ++ }; ++ struct nl_msg *msg; ++ int res = -ENOMEM; ++ ++ if (ifname) ++ ifi.ifi_index = if_nametoindex(ifname); ++ ++ msg = nlmsg_alloc_simple(RTM_SETLINK, 0); ++ if (!msg) ++ return res; ++ ++ if (nlmsg_append(msg, &ifi, sizeof(ifi), NLMSG_ALIGNTO) < 0) ++ goto out; ++ ++ if (nla_put_string(msg, IFLA_IFNAME, new_name)) ++ goto out; ++ ++ res = nl_send_auto_complete(drv->rtnl_sk, msg); ++ if (res < 0) ++ goto out; ++ ++ res = nl_wait_for_ack(drv->rtnl_sk); ++ if (res) { ++ wpa_printf(MSG_INFO, ++ "nl80211: Renaming device %s to %s failed: %s", ++ ifname ? ifname : bss->ifname, new_name, nl_geterror(res)); ++ goto out; ++ } ++ ++ if (type == WPA_IF_AP_BSS && !ifname) ++ os_strlcpy(bss->ifname, new_name, sizeof(bss->ifname)); ++ ++out: ++ nlmsg_free(msg); ++ return res; ++} + + static int cookie_handler(struct nl_msg *msg, void *arg) + { +@@ -10513,6 +10554,37 @@ static int driver_nl80211_if_remove(void + } + + ++static int driver_nl80211_if_rename(void *priv, enum wpa_driver_if_type type, ++ const char *ifname, const char *new_name) ++{ ++ struct i802_bss *bss = priv; ++ return wpa_driver_nl80211_if_rename(bss, type, ifname, new_name); ++} ++ ++ ++static int driver_nl80211_set_first_bss(void *priv) ++{ ++ struct i802_bss *bss = priv, *tbss; ++ struct wpa_driver_nl80211_data *drv = bss->drv; ++ ++ if (drv->first_bss == bss) ++ return 0; ++ ++ for (tbss = drv->first_bss; tbss; tbss = tbss->next) { ++ if (tbss->next != bss) ++ continue; ++ ++ tbss->next = bss->next; ++ bss->next = drv->first_bss; ++ drv->first_bss = bss; ++ drv->ctx = bss->ctx; ++ return 0; ++ } ++ ++ return -1; ++} ++ ++ + static int driver_nl80211_send_mlme(void *priv, const u8 *data, + size_t data_len, int noack, + unsigned int freq, +@@ -13697,6 +13769,8 @@ const struct wpa_driver_ops wpa_driver_n + .set_acl = wpa_driver_nl80211_set_acl, + .if_add = wpa_driver_nl80211_if_add, + .if_remove = driver_nl80211_if_remove, ++ .if_rename = driver_nl80211_if_rename, ++ .set_first_bss = driver_nl80211_set_first_bss, + .send_mlme = driver_nl80211_send_mlme, + .get_hw_feature_data = nl80211_get_hw_feature_data, + .sta_add = wpa_driver_nl80211_sta_add, diff --git a/package/network/services/hostapd/patches/700-wifi-reload.patch b/package/network/services/hostapd/patches/700-wifi-reload.patch deleted file mode 100644 index e6d7c2f673..0000000000 --- a/package/network/services/hostapd/patches/700-wifi-reload.patch +++ /dev/null @@ -1,220 +0,0 @@ ---- a/hostapd/config_file.c -+++ b/hostapd/config_file.c -@@ -2458,6 +2458,8 @@ static int hostapd_config_fill(struct ho - bss->isolate = atoi(pos); - } else if (os_strcmp(buf, "ap_max_inactivity") == 0) { - bss->ap_max_inactivity = atoi(pos); -+ } else if (os_strcmp(buf, "config_id") == 0) { -+ bss->config_id = os_strdup(pos); - } else if (os_strcmp(buf, "skip_inactivity_poll") == 0) { - bss->skip_inactivity_poll = atoi(pos); - } else if (os_strcmp(buf, "country_code") == 0) { -@@ -3158,6 +3160,8 @@ static int hostapd_config_fill(struct ho - } - } else if (os_strcmp(buf, "acs_exclude_dfs") == 0) { - conf->acs_exclude_dfs = atoi(pos); -+ } else if (os_strcmp(buf, "radio_config_id") == 0) { -+ conf->config_id = os_strdup(pos); - } else if (os_strcmp(buf, "op_class") == 0) { - conf->op_class = atoi(pos); - } else if (os_strcmp(buf, "channel") == 0) { ---- a/src/ap/ap_config.c -+++ b/src/ap/ap_config.c -@@ -792,6 +792,7 @@ void hostapd_config_free_bss(struct host - os_free(conf->radius_req_attr_sqlite); - os_free(conf->rsn_preauth_interfaces); - os_free(conf->ctrl_interface); -+ os_free(conf->config_id); - os_free(conf->ca_cert); - os_free(conf->server_cert); - os_free(conf->server_cert2); -@@ -988,6 +989,7 @@ void hostapd_config_free(struct hostapd_ - - for (i = 0; i < conf->num_bss; i++) - hostapd_config_free_bss(conf->bss[i]); -+ os_free(conf->config_id); - os_free(conf->bss); - os_free(conf->supported_rates); - os_free(conf->basic_rates); ---- a/src/ap/ap_config.h -+++ b/src/ap/ap_config.h -@@ -279,6 +279,8 @@ struct hostapd_bss_config { - char vlan_bridge[IFNAMSIZ + 1]; - char wds_bridge[IFNAMSIZ + 1]; - -+ char *config_id; -+ - enum hostapd_logger_level logger_syslog_level, logger_stdout_level; - - unsigned int logger_syslog; /* module bitfield */ -@@ -942,6 +944,7 @@ struct spatial_reuse { - struct hostapd_config { - struct hostapd_bss_config **bss, *last_bss; - size_t num_bss; -+ char *config_id; - - u16 beacon_int; - int rts_threshold; ---- a/src/ap/hostapd.c -+++ b/src/ap/hostapd.c -@@ -219,6 +219,10 @@ static int hostapd_iface_conf_changed(st - { - size_t i; - -+ if (newconf->config_id != oldconf->config_id) -+ if (strcmp(newconf->config_id, oldconf->config_id)) -+ return 1; -+ - if (newconf->num_bss != oldconf->num_bss) - return 1; - -@@ -232,7 +236,7 @@ static int hostapd_iface_conf_changed(st - } - - --int hostapd_reload_config(struct hostapd_iface *iface) -+int hostapd_reload_config(struct hostapd_iface *iface, int reconf) - { - struct hapd_interfaces *interfaces = iface->interfaces; - struct hostapd_data *hapd = iface->bss[0]; -@@ -255,13 +259,16 @@ int hostapd_reload_config(struct hostapd - if (newconf == NULL) - return -1; - -- hostapd_clear_old(iface); -- - oldconf = hapd->iconf; - if (hostapd_iface_conf_changed(newconf, oldconf)) { - char *fname; - int res; - -+ if (reconf) -+ return -1; -+ -+ hostapd_clear_old(iface); -+ - wpa_printf(MSG_DEBUG, - "Configuration changes include interface/BSS modification - force full disable+enable sequence"); - fname = os_strdup(iface->config_fname); -@@ -286,6 +293,24 @@ int hostapd_reload_config(struct hostapd - wpa_printf(MSG_ERROR, - "Failed to enable interface on config reload"); - return res; -+ } else { -+ for (j = 0; j < iface->num_bss; j++) { -+ hapd = iface->bss[j]; -+ if (!hapd->config_id || strcmp(hapd->config_id, newconf->bss[j]->config_id)) { -+ hostapd_flush_old_stations(iface->bss[j], -+ WLAN_REASON_PREV_AUTH_NOT_VALID); -+#ifdef CONFIG_WEP -+ hostapd_broadcast_wep_clear(iface->bss[j]); -+#endif -+ -+#ifndef CONFIG_NO_RADIUS -+ /* TODO: update dynamic data based on changed configuration -+ * items (e.g., open/close sockets, etc.) */ -+ radius_client_flush(iface->bss[j]->radius, 0); -+#endif /* CONFIG_NO_RADIUS */ -+ wpa_printf(MSG_INFO, "bss %zu changed", j); -+ } -+ } - } - iface->conf = newconf; - -@@ -302,6 +327,12 @@ int hostapd_reload_config(struct hostapd - - for (j = 0; j < iface->num_bss; j++) { - hapd = iface->bss[j]; -+ if (hapd->config_id) { -+ os_free(hapd->config_id); -+ hapd->config_id = NULL; -+ } -+ if (newconf->bss[j]->config_id) -+ hapd->config_id = strdup(newconf->bss[j]->config_id); - hapd->iconf = newconf; - hapd->conf = newconf->bss[j]; - hostapd_reload_bss(hapd); -@@ -2397,6 +2428,10 @@ hostapd_alloc_bss_data(struct hostapd_if - hapd->iconf = conf; - hapd->conf = bss; - hapd->iface = hapd_iface; -+ if (bss && bss->config_id) -+ hapd->config_id = strdup(bss->config_id); -+ else -+ hapd->config_id = NULL; - if (conf) - hapd->driver = conf->driver; - hapd->ctrl_sock = -1; ---- a/src/ap/hostapd.h -+++ b/src/ap/hostapd.h -@@ -46,7 +46,7 @@ struct mesh_conf; - struct hostapd_iface; - - struct hapd_interfaces { -- int (*reload_config)(struct hostapd_iface *iface); -+ int (*reload_config)(struct hostapd_iface *iface, int reconf); - struct hostapd_config * (*config_read_cb)(const char *config_fname); - int (*ctrl_iface_init)(struct hostapd_data *hapd); - void (*ctrl_iface_deinit)(struct hostapd_data *hapd); -@@ -173,6 +173,7 @@ struct hostapd_data { - struct hostapd_config *iconf; - struct hostapd_bss_config *conf; - struct hostapd_ubus_bss ubus; -+ char *config_id; - int interface_added; /* virtual interface added for this BSS */ - unsigned int started:1; - unsigned int disabled:1; -@@ -624,7 +625,7 @@ struct hostapd_iface { - int hostapd_for_each_interface(struct hapd_interfaces *interfaces, - int (*cb)(struct hostapd_iface *iface, - void *ctx), void *ctx); --int hostapd_reload_config(struct hostapd_iface *iface); -+int hostapd_reload_config(struct hostapd_iface *iface, int reconf); - void hostapd_reconfig_encryption(struct hostapd_data *hapd); - struct hostapd_data * - hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface, ---- a/src/drivers/driver_nl80211.c -+++ b/src/drivers/driver_nl80211.c -@@ -4833,6 +4833,9 @@ static int wpa_driver_nl80211_set_ap(voi - if (ret) { - wpa_printf(MSG_DEBUG, "nl80211: Beacon set failed: %d (%s)", - ret, strerror(-ret)); -+ if (!bss->beacon_set) -+ ret = 0; -+ bss->beacon_set = 0; - } else { - bss->beacon_set = 1; - nl80211_set_bss(bss, params->cts_protect, params->preamble, ---- a/hostapd/ctrl_iface.c -+++ b/hostapd/ctrl_iface.c -@@ -186,7 +186,7 @@ static int hostapd_ctrl_iface_update(str - iface->interfaces->config_read_cb = hostapd_ctrl_iface_config_read; - reload_opts = txt; - -- hostapd_reload_config(iface); -+ hostapd_reload_config(iface, 0); - - iface->interfaces->config_read_cb = config_read_cb; - } ---- a/hostapd/main.c -+++ b/hostapd/main.c -@@ -317,7 +317,7 @@ static void handle_term(int sig, void *s - - static int handle_reload_iface(struct hostapd_iface *iface, void *ctx) - { -- if (hostapd_reload_config(iface) < 0) { -+ if (hostapd_reload_config(iface, 0) < 0) { - wpa_printf(MSG_WARNING, "Failed to read new configuration " - "file - continuing with old."); - } ---- a/src/ap/wps_hostapd.c -+++ b/src/ap/wps_hostapd.c -@@ -315,7 +315,7 @@ static void wps_reload_config(void *eloo - - wpa_printf(MSG_DEBUG, "WPS: Reload configuration data"); - if (iface->interfaces == NULL || -- iface->interfaces->reload_config(iface) < 0) { -+ iface->interfaces->reload_config(iface, 1) < 0) { - wpa_printf(MSG_WARNING, "WPS: Failed to reload the updated " - "configuration"); - } diff --git a/package/network/services/hostapd/patches/701-reload_config_inline.patch b/package/network/services/hostapd/patches/701-reload_config_inline.patch new file mode 100644 index 0000000000..3c62bf670f --- /dev/null +++ b/package/network/services/hostapd/patches/701-reload_config_inline.patch @@ -0,0 +1,33 @@ +--- a/hostapd/config_file.c ++++ b/hostapd/config_file.c +@@ -4816,7 +4816,12 @@ struct hostapd_config * hostapd_config_r + int errors = 0; + size_t i; + +- f = fopen(fname, "r"); ++ if (!strncmp(fname, "data:", 5)) { ++ f = fmemopen((void *)(fname + 5), strlen(fname + 5), "r"); ++ fname = ""; ++ } else { ++ f = fopen(fname, "r"); ++ } + if (f == NULL) { + wpa_printf(MSG_ERROR, "Could not open configuration file '%s' " + "for reading.", fname); +--- a/wpa_supplicant/config_file.c ++++ b/wpa_supplicant/config_file.c +@@ -326,8 +326,13 @@ struct wpa_config * wpa_config_read(cons + while (cred_tail && cred_tail->next) + cred_tail = cred_tail->next; + ++ if (!strncmp(name, "data:", 5)) { ++ f = fmemopen((void *)(name + 5), strlen(name + 5), "r"); ++ name = ""; ++ } else { ++ f = fopen(name, "r"); ++ } + wpa_printf(MSG_DEBUG, "Reading configuration file '%s'", name); +- f = fopen(name, "r"); + if (f == NULL) { + wpa_printf(MSG_ERROR, "Failed to open config file '%s', " + "error: %s", name, strerror(errno)); diff --git a/package/network/services/hostapd/patches/710-vlan_no_bridge.patch b/package/network/services/hostapd/patches/710-vlan_no_bridge.patch index 856dc8ba88..63d1b8a3b8 100644 --- a/package/network/services/hostapd/patches/710-vlan_no_bridge.patch +++ b/package/network/services/hostapd/patches/710-vlan_no_bridge.patch @@ -1,6 +1,6 @@ --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h -@@ -115,6 +115,7 @@ struct hostapd_ssid { +@@ -121,6 +121,7 @@ struct hostapd_ssid { #define DYNAMIC_VLAN_OPTIONAL 1 #define DYNAMIC_VLAN_REQUIRED 2 int dynamic_vlan; @@ -30,7 +30,7 @@ --- a/hostapd/config_file.c +++ b/hostapd/config_file.c -@@ -3381,6 +3381,8 @@ static int hostapd_config_fill(struct ho +@@ -3351,6 +3351,8 @@ static int hostapd_config_fill(struct ho #ifndef CONFIG_NO_VLAN } else if (os_strcmp(buf, "dynamic_vlan") == 0) { bss->ssid.dynamic_vlan = atoi(pos); diff --git a/package/network/services/hostapd/patches/711-wds_bridge_force.patch b/package/network/services/hostapd/patches/711-wds_bridge_force.patch index a22580c357..c0f2c31c44 100644 --- a/package/network/services/hostapd/patches/711-wds_bridge_force.patch +++ b/package/network/services/hostapd/patches/711-wds_bridge_force.patch @@ -1,17 +1,17 @@ --- a/hostapd/config_file.c +++ b/hostapd/config_file.c -@@ -2358,6 +2358,8 @@ static int hostapd_config_fill(struct ho +@@ -2318,6 +2318,8 @@ static int hostapd_config_fill(struct ho sizeof(conf->bss[0]->iface)); } else if (os_strcmp(buf, "bridge") == 0) { os_strlcpy(bss->bridge, pos, sizeof(bss->bridge)); + if (!bss->wds_bridge[0]) + os_strlcpy(bss->wds_bridge, pos, sizeof(bss->wds_bridge)); + } else if (os_strcmp(buf, "bridge_hairpin") == 0) { + bss->bridge_hairpin = atoi(pos); } else if (os_strcmp(buf, "vlan_bridge") == 0) { - os_strlcpy(bss->vlan_bridge, pos, sizeof(bss->vlan_bridge)); - } else if (os_strcmp(buf, "wds_bridge") == 0) { --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c -@@ -340,8 +340,6 @@ int hostapd_set_wds_sta(struct hostapd_d +@@ -348,8 +348,6 @@ int hostapd_set_wds_sta(struct hostapd_d return -1; if (hapd->conf->wds_bridge[0]) bridge = hapd->conf->wds_bridge; diff --git a/package/network/services/hostapd/patches/720-iface_max_num_sta.patch b/package/network/services/hostapd/patches/720-iface_max_num_sta.patch index 106f9d7407..089c1ddc24 100644 --- a/package/network/services/hostapd/patches/720-iface_max_num_sta.patch +++ b/package/network/services/hostapd/patches/720-iface_max_num_sta.patch @@ -1,6 +1,6 @@ --- a/hostapd/config_file.c +++ b/hostapd/config_file.c -@@ -2880,6 +2880,14 @@ static int hostapd_config_fill(struct ho +@@ -2848,6 +2848,14 @@ static int hostapd_config_fill(struct ho line, bss->max_num_sta, MAX_STA_COUNT); return 1; } @@ -17,20 +17,20 @@ } else if (os_strcmp(buf, "extended_key_id") == 0) { --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h -@@ -668,6 +668,7 @@ void hostapd_cleanup_cs_params(struct ho +@@ -742,6 +742,7 @@ void hostapd_cleanup_cs_params(struct ho void hostapd_periodic_iface(struct hostapd_iface *iface); int hostapd_owe_trans_get_info(struct hostapd_data *hapd); void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx); +int hostapd_check_max_sta(struct hostapd_data *hapd); - /* utils.c */ - int hostapd_register_probereq_cb(struct hostapd_data *hapd, + void hostapd_switch_color(struct hostapd_data *hapd, u64 bitmap); + void hostapd_cleanup_cca_params(struct hostapd_data *hapd); --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c -@@ -236,6 +236,30 @@ static int hostapd_iface_conf_changed(st +@@ -244,6 +244,29 @@ static int hostapd_iface_conf_changed(st + return 0; } - +static inline int hostapd_iface_num_sta(struct hostapd_iface *iface) +{ + int num_sta = 0; @@ -54,13 +54,12 @@ + + return 0; +} -+ - int hostapd_reload_config(struct hostapd_iface *iface, int reconf) + + int hostapd_reload_config(struct hostapd_iface *iface) { - struct hapd_interfaces *interfaces = iface->interfaces; --- a/src/ap/beacon.c +++ b/src/ap/beacon.c -@@ -1068,7 +1068,7 @@ void handle_probe_req(struct hostapd_dat +@@ -1252,7 +1252,7 @@ void handle_probe_req(struct hostapd_dat if (hapd->conf->no_probe_resp_if_max_sta && is_multicast_ether_addr(mgmt->da) && is_multicast_ether_addr(mgmt->bssid) && @@ -71,7 +70,7 @@ " since no room for additional STA", --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h -@@ -981,6 +981,8 @@ struct hostapd_config { +@@ -1039,6 +1039,8 @@ struct hostapd_config { unsigned int track_sta_max_num; unsigned int track_sta_max_age; diff --git a/package/network/services/hostapd/patches/730-ft_iface.patch b/package/network/services/hostapd/patches/730-ft_iface.patch index b5809222d7..0795ed15a1 100644 --- a/package/network/services/hostapd/patches/730-ft_iface.patch +++ b/package/network/services/hostapd/patches/730-ft_iface.patch @@ -1,6 +1,6 @@ --- a/hostapd/config_file.c +++ b/hostapd/config_file.c -@@ -3038,6 +3038,8 @@ static int hostapd_config_fill(struct ho +@@ -3007,6 +3007,8 @@ static int hostapd_config_fill(struct ho wpa_printf(MSG_INFO, "Line %d: Obsolete peerkey parameter ignored", line); #ifdef CONFIG_IEEE80211R_AP @@ -11,17 +11,17 @@ hexstr2bin(pos, bss->mobility_domain, --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h -@@ -277,6 +277,7 @@ struct airtime_sta_weight { +@@ -283,6 +283,7 @@ struct airtime_sta_weight { struct hostapd_bss_config { char iface[IFNAMSIZ + 1]; char bridge[IFNAMSIZ + 1]; + char ft_iface[IFNAMSIZ + 1]; char vlan_bridge[IFNAMSIZ + 1]; char wds_bridge[IFNAMSIZ + 1]; - + int bridge_hairpin; /* hairpin_mode on bridge members */ --- a/src/ap/wpa_auth_glue.c +++ b/src/ap/wpa_auth_glue.c -@@ -1566,8 +1566,12 @@ int hostapd_setup_wpa(struct hostapd_dat +@@ -1727,8 +1727,12 @@ int hostapd_setup_wpa(struct hostapd_dat wpa_key_mgmt_ft(hapd->conf->wpa_key_mgmt)) { const char *ft_iface; diff --git a/package/network/services/hostapd/patches/740-snoop_iface.patch b/package/network/services/hostapd/patches/740-snoop_iface.patch index 2ed73750ca..ce64513a42 100644 --- a/package/network/services/hostapd/patches/740-snoop_iface.patch +++ b/package/network/services/hostapd/patches/740-snoop_iface.patch @@ -1,18 +1,18 @@ --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h -@@ -278,6 +278,7 @@ struct hostapd_bss_config { +@@ -284,6 +284,7 @@ struct hostapd_bss_config { char iface[IFNAMSIZ + 1]; char bridge[IFNAMSIZ + 1]; char ft_iface[IFNAMSIZ + 1]; + char snoop_iface[IFNAMSIZ + 1]; char vlan_bridge[IFNAMSIZ + 1]; char wds_bridge[IFNAMSIZ + 1]; - + int bridge_hairpin; /* hairpin_mode on bridge members */ --- a/src/ap/x_snoop.c +++ b/src/ap/x_snoop.c -@@ -31,14 +31,16 @@ int x_snoop_init(struct hostapd_data *ha - return -1; - } +@@ -33,28 +33,31 @@ int x_snoop_init(struct hostapd_data *ha + + hapd->x_snoop_initialized = true; - if (hostapd_drv_br_port_set_attr(hapd, DRV_BR_PORT_ATTR_HAIRPIN_MODE, + if (!conf->snoop_iface[0] && @@ -29,38 +29,111 @@ wpa_printf(MSG_DEBUG, "x_snoop: Failed to enable proxyarp on the bridge port"); return -1; -@@ -52,7 +54,8 @@ int x_snoop_init(struct hostapd_data *ha + } + + if (hostapd_drv_br_set_net_param(hapd, DRV_BR_NET_PARAM_GARP_ACCEPT, +- 1)) { ++ conf->snoop_iface[0] ? conf->snoop_iface : NULL, 1)) { + wpa_printf(MSG_DEBUG, + "x_snoop: Failed to enable accepting gratuitous ARP on the bridge"); + return -1; } #ifdef CONFIG_IPV6 - if (hostapd_drv_br_set_net_param(hapd, DRV_BR_MULTICAST_SNOOPING, 1)) { + if (!conf->snoop_iface[0] && -+ hostapd_drv_br_set_net_param(hapd, DRV_BR_MULTICAST_SNOOPING, 1)) { ++ hostapd_drv_br_set_net_param(hapd, DRV_BR_MULTICAST_SNOOPING, NULL, 1)) { wpa_printf(MSG_DEBUG, "x_snoop: Failed to enable multicast snooping on the bridge"); return -1; -@@ -71,8 +74,12 @@ x_snoop_get_l2_packet(struct hostapd_dat +@@ -73,8 +76,12 @@ x_snoop_get_l2_packet(struct hostapd_dat { struct hostapd_bss_config *conf = hapd->conf; struct l2_packet_data *l2; + const char *ifname = conf->bridge; - -- l2 = l2_packet_init(conf->bridge, NULL, ETH_P_ALL, handler, hapd, 1); ++ + if (conf->snoop_iface[0]) + ifname = conf->snoop_iface; -+ + +- l2 = l2_packet_init(conf->bridge, NULL, ETH_P_ALL, handler, hapd, 1); + l2 = l2_packet_init(ifname, NULL, ETH_P_ALL, handler, hapd, 1); if (l2 == NULL) { wpa_printf(MSG_DEBUG, "x_snoop: Failed to initialize L2 packet processing %s", +@@ -127,9 +134,12 @@ void x_snoop_mcast_to_ucast_convert_send + + void x_snoop_deinit(struct hostapd_data *hapd) + { ++ struct hostapd_bss_config *conf = hapd->conf; ++ + if (!hapd->x_snoop_initialized) + return; +- hostapd_drv_br_set_net_param(hapd, DRV_BR_NET_PARAM_GARP_ACCEPT, 0); ++ hostapd_drv_br_set_net_param(hapd, DRV_BR_NET_PARAM_GARP_ACCEPT, ++ conf->snoop_iface[0] ? conf->snoop_iface : NULL, 0); + hostapd_drv_br_port_set_attr(hapd, DRV_BR_PORT_ATTR_PROXYARP, 0); + hostapd_drv_br_port_set_attr(hapd, DRV_BR_PORT_ATTR_HAIRPIN_MODE, 0); + hapd->x_snoop_initialized = false; --- a/hostapd/config_file.c +++ b/hostapd/config_file.c -@@ -2360,6 +2360,8 @@ static int hostapd_config_fill(struct ho - os_strlcpy(bss->bridge, pos, sizeof(bss->bridge)); - if (!bss->wds_bridge[0]) +@@ -2322,6 +2322,8 @@ static int hostapd_config_fill(struct ho os_strlcpy(bss->wds_bridge, pos, sizeof(bss->wds_bridge)); + } else if (os_strcmp(buf, "bridge_hairpin") == 0) { + bss->bridge_hairpin = atoi(pos); + } else if (os_strcmp(buf, "snoop_iface") == 0) { + os_strlcpy(bss->snoop_iface, pos, sizeof(bss->snoop_iface)); } else if (os_strcmp(buf, "vlan_bridge") == 0) { os_strlcpy(bss->vlan_bridge, pos, sizeof(bss->vlan_bridge)); } else if (os_strcmp(buf, "wds_bridge") == 0) { +--- a/src/ap/ap_drv_ops.h ++++ b/src/ap/ap_drv_ops.h +@@ -366,12 +366,12 @@ static inline int hostapd_drv_br_port_se + + static inline int hostapd_drv_br_set_net_param(struct hostapd_data *hapd, + enum drv_br_net_param param, +- unsigned int val) ++ const char *ifname, unsigned int val) + { + if (hapd->driver == NULL || hapd->drv_priv == NULL || + hapd->driver->br_set_net_param == NULL) + return -1; +- return hapd->driver->br_set_net_param(hapd->drv_priv, param, val); ++ return hapd->driver->br_set_net_param(hapd->drv_priv, param, ifname, val); + } + + static inline int hostapd_drv_vendor_cmd(struct hostapd_data *hapd, +--- a/src/drivers/driver.h ++++ b/src/drivers/driver.h +@@ -4209,7 +4209,7 @@ struct wpa_driver_ops { + * Returns: 0 on success, negative (<0) on failure + */ + int (*br_set_net_param)(void *priv, enum drv_br_net_param param, +- unsigned int val); ++ const char *ifname, unsigned int val); + + /** + * get_wowlan - Get wake-on-wireless status +--- a/src/drivers/driver_nl80211.c ++++ b/src/drivers/driver_nl80211.c +@@ -12168,7 +12168,7 @@ static const char * drv_br_net_param_str + + + static int wpa_driver_br_set_net_param(void *priv, enum drv_br_net_param param, +- unsigned int val) ++ const char *ifname, unsigned int val) + { + struct i802_bss *bss = priv; + char path[128]; +@@ -12194,8 +12194,11 @@ static int wpa_driver_br_set_net_param(v + return -EINVAL; + } + ++ if (!ifname) ++ ifname = bss->brname; ++ + os_snprintf(path, sizeof(path), "/proc/sys/net/ipv%d/conf/%s/%s", +- ip_version, bss->brname, param_txt); ++ ip_version, ifname, param_txt); + + set_val: + if (linux_write_system_file(path, val)) diff --git a/package/network/services/hostapd/patches/750-qos_map_set_without_interworking.patch b/package/network/services/hostapd/patches/750-qos_map_set_without_interworking.patch index 43a4ea73b3..97c32df704 100644 --- a/package/network/services/hostapd/patches/750-qos_map_set_without_interworking.patch +++ b/package/network/services/hostapd/patches/750-qos_map_set_without_interworking.patch @@ -1,6 +1,6 @@ --- a/hostapd/config_file.c +++ b/hostapd/config_file.c -@@ -1644,6 +1644,8 @@ static int parse_anqp_elem(struct hostap +@@ -1604,6 +1604,8 @@ static int parse_anqp_elem(struct hostap return 0; } @@ -9,7 +9,7 @@ static int parse_qos_map_set(struct hostapd_bss_config *bss, char *buf, int line) -@@ -1685,8 +1687,6 @@ static int parse_qos_map_set(struct host +@@ -1645,8 +1647,6 @@ static int parse_qos_map_set(struct host return 0; } @@ -18,7 +18,7 @@ #ifdef CONFIG_HS20 static int hs20_parse_conn_capab(struct hostapd_bss_config *bss, char *buf, -@@ -4077,10 +4077,10 @@ static int hostapd_config_fill(struct ho +@@ -4062,10 +4062,10 @@ static int hostapd_config_fill(struct ho bss->gas_frag_limit = val; } else if (os_strcmp(buf, "gas_comeback_delay") == 0) { bss->gas_comeback_delay = atoi(pos); @@ -32,7 +32,7 @@ os_free(bss->dump_msk_file); --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c -@@ -1415,6 +1415,7 @@ static int hostapd_setup_bss(struct host +@@ -1486,6 +1486,7 @@ int hostapd_setup_bss(struct hostapd_dat wpa_printf(MSG_ERROR, "GAS server initialization failed"); return -1; } @@ -40,7 +40,7 @@ if (conf->qos_map_set_len && hostapd_drv_set_qos_map(hapd, conf->qos_map_set, -@@ -1422,7 +1423,6 @@ static int hostapd_setup_bss(struct host +@@ -1493,7 +1494,6 @@ int hostapd_setup_bss(struct hostapd_dat wpa_printf(MSG_ERROR, "Failed to initialize QoS Map"); return -1; } @@ -48,40 +48,9 @@ if (conf->bss_load_update_period && bss_load_update_init(hapd)) { wpa_printf(MSG_ERROR, "BSS Load initialization failed"); ---- a/src/ap/drv_callbacks.c -+++ b/src/ap/drv_callbacks.c -@@ -271,12 +271,10 @@ int hostapd_notif_assoc(struct hostapd_d - } - #endif /* NEED_AP_MLME */ - --#ifdef CONFIG_INTERWORKING - if (elems.ext_capab && elems.ext_capab_len > 4) { - if (elems.ext_capab[4] & 0x01) - sta->qos_map_enabled = 1; - } --#endif /* CONFIG_INTERWORKING */ - - #ifdef CONFIG_HS20 - wpabuf_free(sta->hs20_ie); ---- a/src/ap/ieee802_11.c -+++ b/src/ap/ieee802_11.c -@@ -4129,13 +4129,11 @@ static u16 copy_supp_rates(struct hostap - static u16 check_ext_capab(struct hostapd_data *hapd, struct sta_info *sta, - const u8 *ext_capab_ie, size_t ext_capab_ie_len) - { --#ifdef CONFIG_INTERWORKING - /* check for QoS Map support */ - if (ext_capab_ie_len >= 5) { - if (ext_capab_ie[4] & 0x01) - sta->qos_map_enabled = 1; - } --#endif /* CONFIG_INTERWORKING */ - - if (ext_capab_ie_len > 0) { - sta->ecsa_supported = !!(ext_capab_ie[0] & BIT(2)); --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c -@@ -2540,8 +2540,6 @@ void wnm_bss_keep_alive_deinit(struct wp +@@ -2683,8 +2683,6 @@ void wnm_bss_keep_alive_deinit(struct wp } @@ -90,16 +59,16 @@ static int wpas_qos_map_set(struct wpa_supplicant *wpa_s, const u8 *qos_map, size_t len) { -@@ -2574,8 +2572,6 @@ static void interworking_process_assoc_r +@@ -2717,8 +2715,6 @@ static void interworking_process_assoc_r } } -#endif /* CONFIG_INTERWORKING */ - - static void multi_ap_process_assoc_resp(struct wpa_supplicant *wpa_s, - const u8 *ies, size_t ies_len) -@@ -2908,10 +2904,8 @@ static int wpa_supplicant_event_associnf + static void wpa_supplicant_set_4addr_mode(struct wpa_supplicant *wpa_s) + { +@@ -3098,10 +3094,8 @@ static int wpa_supplicant_event_associnf wnm_process_assoc_resp(wpa_s, data->assoc_info.resp_ies, data->assoc_info.resp_ies_len); #endif /* CONFIG_WNM */ @@ -110,3 +79,19 @@ if (wpa_s->hw_capab == CAPAB_VHT && get_ie(data->assoc_info.resp_ies, data->assoc_info.resp_ies_len, WLAN_EID_VHT_CAP)) +--- a/src/ap/ieee802_11_shared.c ++++ b/src/ap/ieee802_11_shared.c +@@ -1116,13 +1116,11 @@ u8 * hostapd_eid_rsnxe(struct hostapd_da + u16 check_ext_capab(struct hostapd_data *hapd, struct sta_info *sta, + const u8 *ext_capab_ie, size_t ext_capab_ie_len) + { +-#ifdef CONFIG_INTERWORKING + /* check for QoS Map support */ + if (ext_capab_ie_len >= 5) { + if (ext_capab_ie[4] & 0x01) + sta->qos_map_enabled = 1; + } +-#endif /* CONFIG_INTERWORKING */ + + if (ext_capab_ie_len > 0) { + sta->ecsa_supported = !!(ext_capab_ie[0] & BIT(2)); diff --git a/package/network/services/hostapd/patches/751-qos_map_ignore_when_unsupported.patch b/package/network/services/hostapd/patches/751-qos_map_ignore_when_unsupported.patch index 8af5a0a046..f5ebab70d1 100644 --- a/package/network/services/hostapd/patches/751-qos_map_ignore_when_unsupported.patch +++ b/package/network/services/hostapd/patches/751-qos_map_ignore_when_unsupported.patch @@ -1,6 +1,6 @@ --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c -@@ -850,7 +850,8 @@ int hostapd_start_dfs_cac(struct hostapd +@@ -927,7 +927,8 @@ int hostapd_start_dfs_cac(struct hostapd int hostapd_drv_set_qos_map(struct hostapd_data *hapd, const u8 *qos_map_set, u8 qos_map_set_len) { diff --git a/package/network/services/hostapd/patches/760-dynamic_own_ip.patch b/package/network/services/hostapd/patches/760-dynamic_own_ip.patch new file mode 100644 index 0000000000..2c705a68cf --- /dev/null +++ b/package/network/services/hostapd/patches/760-dynamic_own_ip.patch @@ -0,0 +1,109 @@ +--- a/src/ap/ap_config.h ++++ b/src/ap/ap_config.h +@@ -310,6 +310,7 @@ struct hostapd_bss_config { + unsigned int eap_sim_db_timeout; + int eap_server_erp; /* Whether ERP is enabled on internal EAP server */ + struct hostapd_ip_addr own_ip_addr; ++ int dynamic_own_ip_addr; + char *nas_identifier; + struct hostapd_radius_servers *radius; + int acct_interim_interval; +--- a/src/radius/radius_client.c ++++ b/src/radius/radius_client.c +@@ -163,6 +163,8 @@ struct radius_client_data { + */ + void *ctx; + ++ struct hostapd_ip_addr local_ip; ++ + /** + * conf - RADIUS client configuration (list of RADIUS servers to use) + */ +@@ -720,6 +722,30 @@ static void radius_client_list_add(struc + + + /** ++ * radius_client_send - Get local address for the RADIUS auth socket ++ * @radius: RADIUS client context from radius_client_init() ++ * @addr: pointer to store the address ++ * ++ * This function returns the local address for the connection to the RADIUS ++ * auth server. It also opens the socket if it's not available yet. ++ */ ++int radius_client_get_local_addr(struct radius_client_data *radius, ++ struct hostapd_ip_addr *addr) ++{ ++ struct hostapd_radius_servers *conf = radius->conf; ++ ++ if (conf->auth_server && radius->auth_sock < 0) ++ radius_client_init_auth(radius); ++ ++ if (radius->auth_sock < 0) ++ return -1; ++ ++ memcpy(addr, &radius->local_ip, sizeof(*addr)); ++ ++ return 0; ++} ++ ++/** + * radius_client_send - Send a RADIUS request + * @radius: RADIUS client context from radius_client_init() + * @msg: RADIUS message to be sent +@@ -1238,6 +1264,10 @@ radius_change_server(struct radius_clien + wpa_printf(MSG_DEBUG, "RADIUS local address: %s:%u", + inet_ntoa(claddr.sin_addr), + ntohs(claddr.sin_port)); ++ if (auth) { ++ radius->local_ip.af = AF_INET; ++ radius->local_ip.u.v4 = claddr.sin_addr; ++ } + } + break; + #ifdef CONFIG_IPV6 +@@ -1249,6 +1279,10 @@ radius_change_server(struct radius_clien + inet_ntop(AF_INET6, &claddr6.sin6_addr, + abuf, sizeof(abuf)), + ntohs(claddr6.sin6_port)); ++ if (auth) { ++ radius->local_ip.af = AF_INET6; ++ radius->local_ip.u.v6 = claddr6.sin6_addr; ++ } + } + break; + } +--- a/src/radius/radius_client.h ++++ b/src/radius/radius_client.h +@@ -249,6 +249,8 @@ int radius_client_register(struct radius + void radius_client_set_interim_error_cb(struct radius_client_data *radius, + void (*cb)(const u8 *addr, void *ctx), + void *ctx); ++int radius_client_get_local_addr(struct radius_client_data *radius, ++ struct hostapd_ip_addr * addr); + int radius_client_send(struct radius_client_data *radius, + struct radius_msg *msg, + RadiusType msg_type, const u8 *addr); +--- a/src/ap/ieee802_1x.c ++++ b/src/ap/ieee802_1x.c +@@ -598,6 +598,10 @@ int add_common_radius_attr(struct hostap + struct hostapd_radius_attr *attr; + int len; + ++ if (hapd->conf->dynamic_own_ip_addr) ++ radius_client_get_local_addr(hapd->radius, ++ &hapd->conf->own_ip_addr); ++ + if (!hostapd_config_get_radius_attr(req_attr, + RADIUS_ATTR_NAS_IP_ADDRESS) && + hapd->conf->own_ip_addr.af == AF_INET && +--- a/hostapd/config_file.c ++++ b/hostapd/config_file.c +@@ -2688,6 +2688,8 @@ static int hostapd_config_fill(struct ho + } else if (os_strcmp(buf, "iapp_interface") == 0) { + wpa_printf(MSG_INFO, "DEPRECATED: iapp_interface not used"); + #endif /* CONFIG_IAPP */ ++ } else if (os_strcmp(buf, "dynamic_own_ip_addr") == 0) { ++ bss->dynamic_own_ip_addr = atoi(pos); + } else if (os_strcmp(buf, "own_ip_addr") == 0) { + if (hostapd_parse_ip_addr(pos, &bss->own_ip_addr)) { + wpa_printf(MSG_ERROR, diff --git a/package/network/services/hostapd/patches/761-shared_das_port.patch b/package/network/services/hostapd/patches/761-shared_das_port.patch new file mode 100644 index 0000000000..cbb2a1be3c --- /dev/null +++ b/package/network/services/hostapd/patches/761-shared_das_port.patch @@ -0,0 +1,298 @@ +--- a/src/radius/radius_das.h ++++ b/src/radius/radius_das.h +@@ -44,6 +44,7 @@ struct radius_das_attrs { + struct radius_das_conf { + int port; + const u8 *shared_secret; ++ const u8 *nas_identifier; + size_t shared_secret_len; + const struct hostapd_ip_addr *client_addr; + unsigned int time_window; +--- a/src/ap/hostapd.c ++++ b/src/ap/hostapd.c +@@ -1423,6 +1423,7 @@ int hostapd_setup_bss(struct hostapd_dat + + os_memset(&das_conf, 0, sizeof(das_conf)); + das_conf.port = conf->radius_das_port; ++ das_conf.nas_identifier = conf->nas_identifier; + das_conf.shared_secret = conf->radius_das_shared_secret; + das_conf.shared_secret_len = + conf->radius_das_shared_secret_len; +--- a/src/radius/radius_das.c ++++ b/src/radius/radius_das.c +@@ -12,13 +12,26 @@ + #include "utils/common.h" + #include "utils/eloop.h" + #include "utils/ip_addr.h" ++#include "utils/list.h" + #include "radius.h" + #include "radius_das.h" + + +-struct radius_das_data { ++static struct dl_list das_ports = DL_LIST_HEAD_INIT(das_ports); ++ ++struct radius_das_port { ++ struct dl_list list; ++ struct dl_list das_data; ++ ++ int port; + int sock; ++}; ++ ++struct radius_das_data { ++ struct dl_list list; ++ struct radius_das_port *port; + u8 *shared_secret; ++ u8 *nas_identifier; + size_t shared_secret_len; + struct hostapd_ip_addr client_addr; + unsigned int time_window; +@@ -378,56 +391,17 @@ fail: + } + + +-static void radius_das_receive(int sock, void *eloop_ctx, void *sock_ctx) ++static void ++radius_das_receive_msg(struct radius_das_data *das, struct radius_msg *msg, ++ struct sockaddr *from, socklen_t fromlen, ++ char *abuf, int from_port) + { +- struct radius_das_data *das = eloop_ctx; +- u8 buf[1500]; +- union { +- struct sockaddr_storage ss; +- struct sockaddr_in sin; +-#ifdef CONFIG_IPV6 +- struct sockaddr_in6 sin6; +-#endif /* CONFIG_IPV6 */ +- } from; +- char abuf[50]; +- int from_port = 0; +- socklen_t fromlen; +- int len; +- struct radius_msg *msg, *reply = NULL; ++ struct radius_msg *reply = NULL; + struct radius_hdr *hdr; + struct wpabuf *rbuf; ++ struct os_time now; + u32 val; + int res; +- struct os_time now; +- +- fromlen = sizeof(from); +- len = recvfrom(sock, buf, sizeof(buf), 0, +- (struct sockaddr *) &from.ss, &fromlen); +- if (len < 0) { +- wpa_printf(MSG_ERROR, "DAS: recvfrom: %s", strerror(errno)); +- return; +- } +- +- os_strlcpy(abuf, inet_ntoa(from.sin.sin_addr), sizeof(abuf)); +- from_port = ntohs(from.sin.sin_port); +- +- wpa_printf(MSG_DEBUG, "DAS: Received %d bytes from %s:%d", +- len, abuf, from_port); +- if (das->client_addr.u.v4.s_addr && +- das->client_addr.u.v4.s_addr != from.sin.sin_addr.s_addr) { +- wpa_printf(MSG_DEBUG, "DAS: Drop message from unknown client"); +- return; +- } +- +- msg = radius_msg_parse(buf, len); +- if (msg == NULL) { +- wpa_printf(MSG_DEBUG, "DAS: Parsing incoming RADIUS packet " +- "from %s:%d failed", abuf, from_port); +- return; +- } +- +- if (wpa_debug_level <= MSG_MSGDUMP) +- radius_msg_dump(msg); + + if (radius_msg_verify_das_req(msg, das->shared_secret, + das->shared_secret_len, +@@ -494,9 +468,8 @@ static void radius_das_receive(int sock, + radius_msg_dump(reply); + + rbuf = radius_msg_get_buf(reply); +- res = sendto(das->sock, wpabuf_head(rbuf), +- wpabuf_len(rbuf), 0, +- (struct sockaddr *) &from.ss, fromlen); ++ res = sendto(das->port->sock, wpabuf_head(rbuf), ++ wpabuf_len(rbuf), 0, from, fromlen); + if (res < 0) { + wpa_printf(MSG_ERROR, "DAS: sendto(to %s:%d): %s", + abuf, from_port, strerror(errno)); +@@ -508,6 +481,72 @@ fail: + radius_msg_free(reply); + } + ++static void radius_das_receive(int sock, void *eloop_ctx, void *sock_ctx) ++{ ++ struct radius_das_port *p = eloop_ctx; ++ struct radius_das_data *das; ++ u8 buf[1500]; ++ union { ++ struct sockaddr_storage ss; ++ struct sockaddr_in sin; ++#ifdef CONFIG_IPV6 ++ struct sockaddr_in6 sin6; ++#endif /* CONFIG_IPV6 */ ++ } from; ++ struct radius_msg *msg; ++ size_t nasid_len = 0; ++ u8 *nasid_buf = NULL; ++ char abuf[50]; ++ int from_port = 0; ++ socklen_t fromlen; ++ int found = 0; ++ int len; ++ ++ fromlen = sizeof(from); ++ len = recvfrom(sock, buf, sizeof(buf), 0, ++ (struct sockaddr *) &from.ss, &fromlen); ++ if (len < 0) { ++ wpa_printf(MSG_ERROR, "DAS: recvfrom: %s", strerror(errno)); ++ return; ++ } ++ ++ os_strlcpy(abuf, inet_ntoa(from.sin.sin_addr), sizeof(abuf)); ++ from_port = ntohs(from.sin.sin_port); ++ ++ msg = radius_msg_parse(buf, len); ++ if (msg == NULL) { ++ wpa_printf(MSG_DEBUG, "DAS: Parsing incoming RADIUS packet " ++ "from %s:%d failed", abuf, from_port); ++ return; ++ } ++ ++ wpa_printf(MSG_DEBUG, "DAS: Received %d bytes from %s:%d", ++ len, abuf, from_port); ++ ++ if (wpa_debug_level <= MSG_MSGDUMP) ++ radius_msg_dump(msg); ++ ++ radius_msg_get_attr_ptr(msg, RADIUS_ATTR_NAS_IDENTIFIER, ++ &nasid_buf, &nasid_len, NULL); ++ dl_list_for_each(das, &p->das_data, struct radius_das_data, list) { ++ if (das->client_addr.u.v4.s_addr && ++ das->client_addr.u.v4.s_addr != from.sin.sin_addr.s_addr) ++ continue; ++ ++ if (das->nas_identifier && nasid_buf && ++ (nasid_len != os_strlen(das->nas_identifier) || ++ os_memcmp(das->nas_identifier, nasid_buf, nasid_len) != 0)) ++ continue; ++ ++ found = 1; ++ radius_das_receive_msg(das, msg, (struct sockaddr *)&from.ss, ++ fromlen, abuf, from_port); ++ } ++ ++ if (!found) ++ wpa_printf(MSG_DEBUG, "DAS: Drop message from unknown client"); ++} ++ + + static int radius_das_open_socket(int port) + { +@@ -533,6 +572,49 @@ static int radius_das_open_socket(int po + } + + ++static struct radius_das_port * ++radius_das_open_port(int port) ++{ ++ struct radius_das_port *p; ++ ++ dl_list_for_each(p, &das_ports, struct radius_das_port, list) { ++ if (p->port == port) ++ return p; ++ } ++ ++ p = os_zalloc(sizeof(*p)); ++ if (p == NULL) ++ return NULL; ++ ++ dl_list_init(&p->das_data); ++ p->port = port; ++ p->sock = radius_das_open_socket(port); ++ if (p->sock < 0) ++ goto free_port; ++ ++ if (eloop_register_read_sock(p->sock, radius_das_receive, p, NULL)) ++ goto close_port; ++ ++ dl_list_add(&das_ports, &p->list); ++ ++ return p; ++ ++close_port: ++ close(p->sock); ++free_port: ++ os_free(p); ++ ++ return NULL; ++} ++ ++static void radius_das_close_port(struct radius_das_port *p) ++{ ++ dl_list_del(&p->list); ++ eloop_unregister_read_sock(p->sock); ++ close(p->sock); ++ free(p); ++} ++ + struct radius_das_data * + radius_das_init(struct radius_das_conf *conf) + { +@@ -553,6 +635,8 @@ radius_das_init(struct radius_das_conf * + das->ctx = conf->ctx; + das->disconnect = conf->disconnect; + das->coa = conf->coa; ++ if (conf->nas_identifier) ++ das->nas_identifier = os_strdup(conf->nas_identifier); + + os_memcpy(&das->client_addr, conf->client_addr, + sizeof(das->client_addr)); +@@ -565,19 +649,15 @@ radius_das_init(struct radius_das_conf * + } + das->shared_secret_len = conf->shared_secret_len; + +- das->sock = radius_das_open_socket(conf->port); +- if (das->sock < 0) { ++ das->port = radius_das_open_port(conf->port); ++ if (!das->port) { + wpa_printf(MSG_ERROR, "Failed to open UDP socket for RADIUS " + "DAS"); + radius_das_deinit(das); + return NULL; + } + +- if (eloop_register_read_sock(das->sock, radius_das_receive, das, NULL)) +- { +- radius_das_deinit(das); +- return NULL; +- } ++ dl_list_add(&das->port->das_data, &das->list); + + return das; + } +@@ -588,11 +668,14 @@ void radius_das_deinit(struct radius_das + if (das == NULL) + return; + +- if (das->sock >= 0) { +- eloop_unregister_read_sock(das->sock); +- close(das->sock); ++ if (das->port) { ++ dl_list_del(&das->list); ++ ++ if (dl_list_empty(&das->port->das_data)) ++ radius_das_close_port(das->port); + } + ++ os_free(das->nas_identifier); + os_free(das->shared_secret); + os_free(das); + } diff --git a/package/network/services/hostapd/patches/770-radius_server.patch b/package/network/services/hostapd/patches/770-radius_server.patch new file mode 100644 index 0000000000..8837a26257 --- /dev/null +++ b/package/network/services/hostapd/patches/770-radius_server.patch @@ -0,0 +1,154 @@ +--- a/hostapd/Makefile ++++ b/hostapd/Makefile +@@ -63,6 +63,10 @@ endif + OBJS += main.o + OBJS += config_file.o + ++ifdef CONFIG_RADIUS_SERVER ++OBJS += radius.o ++endif ++ + OBJS += ../src/ap/hostapd.o + OBJS += ../src/ap/wpa_auth_glue.o + OBJS += ../src/ap/drv_callbacks.o +--- a/hostapd/main.c ++++ b/hostapd/main.c +@@ -40,6 +40,7 @@ struct hapd_global { + + static struct hapd_global global; + ++extern int radius_main(int argc, char **argv); + + #ifndef CONFIG_NO_HOSTAPD_LOGGER + static void hostapd_logger_cb(void *ctx, const u8 *addr, unsigned int module, +@@ -771,6 +772,11 @@ int main(int argc, char *argv[]) + if (os_program_init()) + return -1; + ++#ifdef RADIUS_SERVER ++ if (strstr(argv[0], "radius")) ++ return radius_main(argc, argv); ++#endif ++ + os_memset(&interfaces, 0, sizeof(interfaces)); + interfaces.reload_config = hostapd_reload_config; + interfaces.config_read_cb = hostapd_config_read; +--- a/src/radius/radius_server.c ++++ b/src/radius/radius_server.c +@@ -63,6 +63,12 @@ struct radius_server_counters { + u32 unknown_acct_types; + }; + ++struct radius_accept_attr { ++ u8 type; ++ u16 len; ++ void *data; ++}; ++ + /** + * struct radius_session - Internal RADIUS server data for a session + */ +@@ -90,7 +96,7 @@ struct radius_session { + unsigned int macacl:1; + unsigned int t_c_filtering:1; + +- struct hostapd_radius_attr *accept_attr; ++ struct radius_accept_attr *accept_attr; + + u32 t_c_timestamp; /* Last read T&C timestamp from user DB */ + }; +@@ -394,6 +400,7 @@ static void radius_server_session_free(s + radius_msg_free(sess->last_reply); + os_free(sess->username); + os_free(sess->nas_ip); ++ os_free(sess->accept_attr); + os_free(sess); + data->num_sess--; + } +@@ -554,6 +561,36 @@ radius_server_erp_find_key(struct radius + } + #endif /* CONFIG_ERP */ + ++static struct radius_accept_attr * ++radius_server_copy_attr(const struct hostapd_radius_attr *data) ++{ ++ const struct hostapd_radius_attr *attr; ++ struct radius_accept_attr *attr_new; ++ size_t data_size = 0; ++ void *data_buf; ++ int n_attr = 1; ++ ++ for (attr = data; attr; attr = attr->next) { ++ n_attr++; ++ data_size += wpabuf_len(attr->val); ++ } ++ ++ attr_new = os_zalloc(n_attr * sizeof(*attr) + data_size); ++ if (!attr_new) ++ return NULL; ++ ++ data_buf = &attr_new[n_attr]; ++ for (n_attr = 0, attr = data; attr; attr = attr->next) { ++ struct radius_accept_attr *cur = &attr_new[n_attr++]; ++ ++ cur->type = attr->type; ++ cur->len = wpabuf_len(attr->val); ++ cur->data = memcpy(data_buf, wpabuf_head(attr->val), cur->len); ++ data_buf += cur->len; ++ } ++ ++ return attr_new; ++} + + static struct radius_session * + radius_server_get_new_session(struct radius_server_data *data, +@@ -607,7 +644,7 @@ radius_server_get_new_session(struct rad + eap_user_free(tmp); + return NULL; + } +- sess->accept_attr = tmp->accept_attr; ++ sess->accept_attr = radius_server_copy_attr(tmp->accept_attr); + sess->macacl = tmp->macacl; + eap_user_free(tmp); + +@@ -1118,11 +1155,10 @@ radius_server_encapsulate_eap(struct rad + } + + if (code == RADIUS_CODE_ACCESS_ACCEPT) { +- struct hostapd_radius_attr *attr; +- for (attr = sess->accept_attr; attr; attr = attr->next) { +- if (!radius_msg_add_attr(msg, attr->type, +- wpabuf_head(attr->val), +- wpabuf_len(attr->val))) { ++ struct radius_accept_attr *attr; ++ for (attr = sess->accept_attr; attr->data; attr++) { ++ if (!radius_msg_add_attr(msg, attr->type, attr->data, ++ attr->len)) { + wpa_printf(MSG_ERROR, "Could not add RADIUS attribute"); + radius_msg_free(msg); + return NULL; +@@ -1211,11 +1247,10 @@ radius_server_macacl(struct radius_serve + } + + if (code == RADIUS_CODE_ACCESS_ACCEPT) { +- struct hostapd_radius_attr *attr; +- for (attr = sess->accept_attr; attr; attr = attr->next) { +- if (!radius_msg_add_attr(msg, attr->type, +- wpabuf_head(attr->val), +- wpabuf_len(attr->val))) { ++ struct radius_accept_attr *attr; ++ for (attr = sess->accept_attr; attr->data; attr++) { ++ if (!radius_msg_add_attr(msg, attr->type, attr->data, ++ attr->len)) { + wpa_printf(MSG_ERROR, "Could not add RADIUS attribute"); + radius_msg_free(msg); + return NULL; +@@ -2512,7 +2547,7 @@ static int radius_server_get_eap_user(vo + ret = data->get_eap_user(data->conf_ctx, identity, identity_len, + phase2, user); + if (ret == 0 && user) { +- sess->accept_attr = user->accept_attr; ++ sess->accept_attr = radius_server_copy_attr(user->accept_attr); + sess->remediation = user->remediation; + sess->macacl = user->macacl; + sess->t_c_timestamp = user->t_c_timestamp; diff --git a/package/network/services/hostapd/patches/990-ctrl-make-WNM_AP-functions-dependant-on-CONFIG_AP.patch b/package/network/services/hostapd/patches/990-ctrl-make-WNM_AP-functions-dependant-on-CONFIG_AP.patch new file mode 100644 index 0000000000..5809a3b7e8 --- /dev/null +++ b/package/network/services/hostapd/patches/990-ctrl-make-WNM_AP-functions-dependant-on-CONFIG_AP.patch @@ -0,0 +1,33 @@ +From f0e9f5aab52b3eab85d28338cc996972ced4c39c Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Tue, 17 May 2022 23:07:59 +0200 +Subject: [PATCH] ctrl: make WNM_AP functions dependant on CONFIG_AP + +This fixes linking errors found when compiling wpa_supplicant with +CONFIG_WNM_AP enabled but CONFIG_AP disabled. + +Signed-off-by: David Bauer +--- + wpa_supplicant/ctrl_iface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/wpa_supplicant/ctrl_iface.c ++++ b/wpa_supplicant/ctrl_iface.c +@@ -12763,7 +12763,7 @@ char * wpa_supplicant_ctrl_iface_process + if (wpas_ctrl_iface_coloc_intf_report(wpa_s, buf + 18)) + reply_len = -1; + #endif /* CONFIG_WNM */ +-#ifdef CONFIG_WNM_AP ++#if defined(CONFIG_AP) && defined(CONFIG_WNM_AP) + } else if (os_strncmp(buf, "DISASSOC_IMMINENT ", 18) == 0) { + if (ap_ctrl_iface_disassoc_imminent(wpa_s, buf + 18)) + reply_len = -1; +@@ -12773,7 +12773,7 @@ char * wpa_supplicant_ctrl_iface_process + } else if (os_strncmp(buf, "BSS_TM_REQ ", 11) == 0) { + if (ap_ctrl_iface_bss_tm_req(wpa_s, buf + 11)) + reply_len = -1; +-#endif /* CONFIG_WNM_AP */ ++#endif /* CONFIG_AP && CONFIG_WNM_AP */ + } else if (os_strcmp(buf, "FLUSH") == 0) { + wpa_supplicant_ctrl_iface_flush(wpa_s); + } else if (os_strncmp(buf, "RADIO_WORK ", 11) == 0) { diff --git a/package/network/services/hostapd/patches/991-Fix-OpenWrt-13156.patch b/package/network/services/hostapd/patches/991-Fix-OpenWrt-13156.patch new file mode 100644 index 0000000000..a4f007d74e --- /dev/null +++ b/package/network/services/hostapd/patches/991-Fix-OpenWrt-13156.patch @@ -0,0 +1,63 @@ +From 26cd9bafc1d25e602952ee86cd2a5b8c3a995490 Mon Sep 17 00:00:00 2001 +From: Stijn Tintel +Date: Fri, 28 Jul 2023 16:27:47 +0300 +Subject: [PATCH] Revert "Do prune_association only after the STA is + authorized" + +Commit e978072baaca ("Do prune_association only after the STA is +authorized") causes issues when an STA roams from one interface to +another interface on the same PHY. The mt7915 driver is not able to +handle this properly. While the commits fixes a DoS, there are other +devices and drivers with the same limitation, so revert to the orginal +behavior for now, until we have a better solution in place. + +Ref: https://github.com/librecmc/librecmc/issues/13156 +Signed-off-by: Stijn Tintel +--- + src/ap/hostapd.c | 14 +++++++++++--- + src/ap/sta_info.c | 3 --- + 2 files changed, 11 insertions(+), 6 deletions(-) + +--- a/src/ap/hostapd.c ++++ b/src/ap/hostapd.c +@@ -3564,6 +3564,8 @@ int hostapd_remove_iface(struct hapd_int + void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta, + int reassoc) + { ++ int mld_assoc_link_id = -1; ++ + if (hapd->tkip_countermeasures) { + hostapd_drv_sta_deauth(hapd, sta->addr, + WLAN_REASON_MICHAEL_MIC_FAILURE); +@@ -3571,10 +3573,16 @@ void hostapd_new_assoc_sta(struct hostap + } + + #ifdef CONFIG_IEEE80211BE +- if (hapd->conf->mld_ap && sta->mld_info.mld_sta && +- sta->mld_assoc_link_id != hapd->mld_link_id) +- return; ++ if (hapd->conf->mld_ap && sta->mld_info.mld_sta) { ++ if (sta->mld_assoc_link_id == hapd->mld_link_id) { ++ mld_assoc_link_id = sta->mld_assoc_link_id; ++ } else { ++ return; ++ } ++ } + #endif /* CONFIG_IEEE80211BE */ ++ if (mld_assoc_link_id != -2) ++ hostapd_prune_associations(hapd, sta->addr, mld_assoc_link_id); + + ap_sta_clear_disconnect_timeouts(hapd, sta); + sta->post_csa_sa_query = 0; +--- a/src/ap/sta_info.c ++++ b/src/ap/sta_info.c +@@ -1318,9 +1318,6 @@ void ap_sta_set_authorized(struct hostap + mld_assoc_link_id = -2; + } + #endif /* CONFIG_IEEE80211BE */ +- if (mld_assoc_link_id != -2) +- hostapd_prune_associations(hapd, sta->addr, +- mld_assoc_link_id); + sta->flags |= WLAN_STA_AUTHORIZED; + } else { + sta->flags &= ~WLAN_STA_AUTHORIZED; diff --git a/package/network/services/hostapd/patches/992-nl80211-add-extra-ies-only-if-allowed-by-driver.patch b/package/network/services/hostapd/patches/992-nl80211-add-extra-ies-only-if-allowed-by-driver.patch new file mode 100644 index 0000000000..c7b595da57 --- /dev/null +++ b/package/network/services/hostapd/patches/992-nl80211-add-extra-ies-only-if-allowed-by-driver.patch @@ -0,0 +1,62 @@ +From: David Bauer +To: hostap@lists.infradead.org +Cc: =?utf-8?q?=C3=89tienne_Morice?= +Subject: [PATCH] nl80211: add extra-ies only if allowed by driver +Date: Sun, 30 Jan 2022 20:22:00 +0100 +Message-Id: <20220130192200.10883-1-mail@david-bauer.net> +List-Id: + +Upgrading wpa_supplicant from 2.9 to 2.10 breaks broadcom-wl +based adapters. The reason for it is hostapd tries to install additional +IEs for scanning while the driver does not support this. + +The kernel indicates the maximum number of bytes for additional scan IEs +using the NL80211_ATTR_MAX_SCAN_IE_LEN attribute. Save this value and +only add additional scan IEs in case the driver can accommodate these +additional IEs. + +Reported-by: Étienne Morice +Tested-by: Étienne Morice +Signed-off-by: David Bauer +--- + src/drivers/driver.h | 3 +++ + src/drivers/driver_nl80211_capa.c | 4 ++++ + src/drivers/driver_nl80211_scan.c | 2 +- + 3 files changed, 8 insertions(+), 1 deletion(-) + +--- a/src/drivers/driver.h ++++ b/src/drivers/driver.h +@@ -2283,6 +2283,9 @@ struct wpa_driver_capa { + /** Maximum number of iterations in a single scan plan */ + u32 max_sched_scan_plan_iterations; + ++ /** Maximum number of extra IE bytes for scans */ ++ u16 max_scan_ie_len; ++ + /** Whether sched_scan (offloaded scanning) is supported */ + int sched_scan_supported; + +--- a/src/drivers/driver_nl80211_capa.c ++++ b/src/drivers/driver_nl80211_capa.c +@@ -949,6 +949,10 @@ static int wiphy_info_handler(struct nl_ + nla_get_u32(tb[NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS]); + } + ++ if (tb[NL80211_ATTR_MAX_SCAN_IE_LEN]) ++ capa->max_scan_ie_len = ++ nla_get_u16(tb[NL80211_ATTR_MAX_SCAN_IE_LEN]); ++ + if (tb[NL80211_ATTR_MAX_MATCH_SETS]) + capa->max_match_sets = + nla_get_u8(tb[NL80211_ATTR_MAX_MATCH_SETS]); +--- a/src/drivers/driver_nl80211_scan.c ++++ b/src/drivers/driver_nl80211_scan.c +@@ -222,7 +222,7 @@ nl80211_scan_common(struct i802_bss *bss + wpa_printf(MSG_DEBUG, "nl80211: Passive scan requested"); + } + +- if (params->extra_ies) { ++ if (params->extra_ies && drv->capa.max_scan_ie_len >= params->extra_ies_len) { + wpa_hexdump(MSG_MSGDUMP, "nl80211: Scan extra IEs", + params->extra_ies, params->extra_ies_len); + if (nla_put(msg, NL80211_ATTR_IE, params->extra_ies_len, diff --git a/package/network/services/hostapd/src/hostapd/radius.c b/package/network/services/hostapd/src/hostapd/radius.c new file mode 100644 index 0000000000..362a22c276 --- /dev/null +++ b/package/network/services/hostapd/src/hostapd/radius.c @@ -0,0 +1,715 @@ +#include "utils/includes.h" +#include "utils/common.h" +#include "utils/eloop.h" +#include "crypto/crypto.h" +#include "crypto/tls.h" + +#include "ap/ap_config.h" +#include "eap_server/eap.h" +#include "radius/radius.h" +#include "radius/radius_server.h" +#include "eap_register.h" + +#include +#include +#include +#include +#include + +#include +#include + +#define VENDOR_ID_WISPR 14122 +#define VENDOR_ATTR_SIZE 6 + +struct radius_parse_attr_data { + unsigned int vendor; + u8 type; + int size; + char format; + const char *data; +}; + +struct radius_parse_attr_state { + struct hostapd_radius_attr *prev; + struct hostapd_radius_attr *attr; + struct wpabuf *buf; + void *attrdata; +}; + +struct radius_user_state { + struct avl_node node; + struct eap_user data; +}; + +struct radius_user_data { + struct kvlist users; + struct avl_tree user_state; + struct blob_attr *wildcard; +}; + +struct radius_state { + struct radius_server_data *radius; + struct eap_config eap; + + struct radius_user_data phase1, phase2; + const char *user_file; + time_t user_file_ts; + + int n_attrs; + struct hostapd_radius_attr *attrs; +}; + +struct radius_config { + struct tls_connection_params tls; + struct radius_server_conf radius; +}; + +enum { + USER_ATTR_PASSWORD, + USER_ATTR_HASH, + USER_ATTR_SALT, + USER_ATTR_METHODS, + USER_ATTR_RADIUS, + USER_ATTR_VLAN, + USER_ATTR_MAX_RATE_UP, + USER_ATTR_MAX_RATE_DOWN, + __USER_ATTR_MAX +}; + +static void radius_tls_event(void *ctx, enum tls_event ev, + union tls_event_data *data) +{ + switch (ev) { + case TLS_CERT_CHAIN_SUCCESS: + wpa_printf(MSG_DEBUG, "radius: remote certificate verification success"); + break; + case TLS_CERT_CHAIN_FAILURE: + wpa_printf(MSG_INFO, "radius: certificate chain failure: reason=%d depth=%d subject='%s' err='%s'", + data->cert_fail.reason, + data->cert_fail.depth, + data->cert_fail.subject, + data->cert_fail.reason_txt); + break; + case TLS_PEER_CERTIFICATE: + wpa_printf(MSG_DEBUG, "radius: peer certificate: depth=%d serial_num=%s subject=%s", + data->peer_cert.depth, + data->peer_cert.serial_num ? data->peer_cert.serial_num : "N/A", + data->peer_cert.subject); + break; + case TLS_ALERT: + if (data->alert.is_local) + wpa_printf(MSG_DEBUG, "radius: local TLS alert: %s", + data->alert.description); + else + wpa_printf(MSG_DEBUG, "radius: remote TLS alert: %s", + data->alert.description); + break; + case TLS_UNSAFE_RENEGOTIATION_DISABLED: + /* Not applicable to TLS server */ + break; + } +} + +static void radius_userdata_init(struct radius_user_data *u) +{ + kvlist_init(&u->users, kvlist_blob_len); + avl_init(&u->user_state, avl_strcmp, false, NULL); +} + +static void radius_userdata_free(struct radius_user_data *u) +{ + struct radius_user_state *s, *tmp; + + kvlist_free(&u->users); + free(u->wildcard); + u->wildcard = NULL; + avl_remove_all_elements(&u->user_state, s, node, tmp) + free(s); +} + +static void +radius_userdata_load(struct radius_user_data *u, struct blob_attr *data) +{ + enum { + USERSTATE_USERS, + USERSTATE_WILDCARD, + __USERSTATE_MAX, + }; + static const struct blobmsg_policy policy[__USERSTATE_MAX] = { + [USERSTATE_USERS] = { "users", BLOBMSG_TYPE_TABLE }, + [USERSTATE_WILDCARD] = { "wildcard", BLOBMSG_TYPE_ARRAY }, + }; + struct blob_attr *tb[__USERSTATE_MAX], *cur; + int rem; + + if (!data) + return; + + blobmsg_parse(policy, __USERSTATE_MAX, tb, blobmsg_data(data), blobmsg_len(data)); + + blobmsg_for_each_attr(cur, tb[USERSTATE_USERS], rem) + kvlist_set(&u->users, blobmsg_name(cur), cur); + + if (tb[USERSTATE_WILDCARD]) + u->wildcard = blob_memdup(tb[USERSTATE_WILDCARD]); +} + +static void +load_userfile(struct radius_state *s) +{ + enum { + USERDATA_PHASE1, + USERDATA_PHASE2, + __USERDATA_MAX + }; + static const struct blobmsg_policy policy[__USERDATA_MAX] = { + [USERDATA_PHASE1] = { "phase1", BLOBMSG_TYPE_TABLE }, + [USERDATA_PHASE2] = { "phase2", BLOBMSG_TYPE_TABLE }, + }; + struct blob_attr *tb[__USERDATA_MAX], *cur; + static struct blob_buf b; + struct stat st; + int rem; + + if (stat(s->user_file, &st)) + return; + + if (s->user_file_ts == st.st_mtime) + return; + + s->user_file_ts = st.st_mtime; + radius_userdata_free(&s->phase1); + radius_userdata_free(&s->phase2); + + blob_buf_init(&b, 0); + blobmsg_add_json_from_file(&b, s->user_file); + blobmsg_parse(policy, __USERDATA_MAX, tb, blob_data(b.head), blob_len(b.head)); + radius_userdata_load(&s->phase1, tb[USERDATA_PHASE1]); + radius_userdata_load(&s->phase2, tb[USERDATA_PHASE2]); + + blob_buf_free(&b); +} + +static struct blob_attr * +radius_user_get(struct radius_user_data *s, const char *name) +{ + struct blob_attr *cur; + int rem; + + cur = kvlist_get(&s->users, name); + if (cur) + return cur; + + blobmsg_for_each_attr(cur, s->wildcard, rem) { + static const struct blobmsg_policy policy = { + "name", BLOBMSG_TYPE_STRING + }; + struct blob_attr *pattern; + + if (blobmsg_type(cur) != BLOBMSG_TYPE_TABLE) + continue; + + blobmsg_parse(&policy, 1, &pattern, blobmsg_data(cur), blobmsg_len(cur)); + if (!name) + continue; + + if (!fnmatch(blobmsg_get_string(pattern), name, 0)) + return cur; + } + + return NULL; +} + +static struct radius_parse_attr_data * +radius_parse_attr(struct blob_attr *attr) +{ + static const struct blobmsg_policy policy[4] = { + { .type = BLOBMSG_TYPE_INT32 }, + { .type = BLOBMSG_TYPE_INT32 }, + { .type = BLOBMSG_TYPE_STRING }, + { .type = BLOBMSG_TYPE_STRING }, + }; + static struct radius_parse_attr_data data; + struct blob_attr *tb[4]; + const char *format; + + blobmsg_parse_array(policy, ARRAY_SIZE(policy), tb, blobmsg_data(attr), blobmsg_len(attr)); + + if (!tb[0] || !tb[1] || !tb[2] || !tb[3]) + return NULL; + + format = blobmsg_get_string(tb[2]); + if (strlen(format) != 1) + return NULL; + + data.vendor = blobmsg_get_u32(tb[0]); + data.type = blobmsg_get_u32(tb[1]); + data.format = format[0]; + data.data = blobmsg_get_string(tb[3]); + data.size = strlen(data.data); + + switch (data.format) { + case 's': + break; + case 'x': + if (data.size & 1) + return NULL; + data.size /= 2; + break; + case 'd': + data.size = 4; + break; + default: + return NULL; + } + + return &data; +} + +static void +radius_count_attrs(struct blob_attr **tb, int *n_attr, size_t *attr_size) +{ + struct blob_attr *data = tb[USER_ATTR_RADIUS]; + struct blob_attr *cur; + int rem; + + blobmsg_for_each_attr(cur, data, rem) { + struct radius_parse_attr_data *data; + size_t prev = *attr_size; + + data = radius_parse_attr(cur); + if (!data) + continue; + + *attr_size += data->size; + if (data->vendor) + *attr_size += VENDOR_ATTR_SIZE; + + (*n_attr)++; + } + + *n_attr += !!tb[USER_ATTR_VLAN] * 3 + + !!tb[USER_ATTR_MAX_RATE_UP] + + !!tb[USER_ATTR_MAX_RATE_DOWN]; + *attr_size += !!tb[USER_ATTR_VLAN] * (4 + 4 + 5) + + !!tb[USER_ATTR_MAX_RATE_UP] * (4 + VENDOR_ATTR_SIZE) + + !!tb[USER_ATTR_MAX_RATE_DOWN] * (4 + VENDOR_ATTR_SIZE); +} + +static void * +radius_add_attr(struct radius_parse_attr_state *state, + u32 vendor, u8 type, u8 len) +{ + struct hostapd_radius_attr *attr; + struct wpabuf *buf; + void *val; + + val = state->attrdata; + + buf = state->buf++; + buf->buf = val; + + attr = state->attr++; + attr->val = buf; + attr->type = type; + + if (state->prev) + state->prev->next = attr; + state->prev = attr; + + if (vendor) { + u8 *vendor_hdr = val + 4; + + WPA_PUT_BE32(val, vendor); + vendor_hdr[0] = type; + vendor_hdr[1] = len + 2; + + len += VENDOR_ATTR_SIZE; + val += VENDOR_ATTR_SIZE; + attr->type = RADIUS_ATTR_VENDOR_SPECIFIC; + } + + buf->size = buf->used = len; + state->attrdata += len; + + return val; +} + +static void +radius_parse_attrs(struct blob_attr **tb, struct radius_parse_attr_state *state) +{ + struct blob_attr *data = tb[USER_ATTR_RADIUS]; + struct hostapd_radius_attr *prev = NULL; + struct blob_attr *cur; + int len, rem; + void *val; + + if ((cur = tb[USER_ATTR_VLAN]) != NULL && blobmsg_get_u32(cur) < 4096) { + char buf[5]; + + val = radius_add_attr(state, 0, RADIUS_ATTR_TUNNEL_TYPE, 4); + WPA_PUT_BE32(val, RADIUS_TUNNEL_TYPE_VLAN); + + val = radius_add_attr(state, 0, RADIUS_ATTR_TUNNEL_MEDIUM_TYPE, 4); + WPA_PUT_BE32(val, RADIUS_TUNNEL_MEDIUM_TYPE_802); + + len = snprintf(buf, sizeof(buf), "%d", blobmsg_get_u32(cur)); + val = radius_add_attr(state, 0, RADIUS_ATTR_TUNNEL_PRIVATE_GROUP_ID, len); + memcpy(val, buf, len); + } + + if ((cur = tb[USER_ATTR_MAX_RATE_UP]) != NULL) { + val = radius_add_attr(state, VENDOR_ID_WISPR, 7, 4); + WPA_PUT_BE32(val, blobmsg_get_u32(cur)); + } + + if ((cur = tb[USER_ATTR_MAX_RATE_DOWN]) != NULL) { + val = radius_add_attr(state, VENDOR_ID_WISPR, 8, 4); + WPA_PUT_BE32(val, blobmsg_get_u32(cur)); + } + + blobmsg_for_each_attr(cur, data, rem) { + struct radius_parse_attr_data *data; + void *val; + int size; + + data = radius_parse_attr(cur); + if (!data) + continue; + + val = radius_add_attr(state, data->vendor, data->type, data->size); + switch (data->format) { + case 's': + memcpy(val, data->data, data->size); + break; + case 'x': + hexstr2bin(data->data, val, data->size); + break; + case 'd': + WPA_PUT_BE32(val, atoi(data->data)); + break; + } + } +} + +static void +radius_user_parse_methods(struct eap_user *eap, struct blob_attr *data) +{ + struct blob_attr *cur; + int rem, n = 0; + + if (!data) + return; + + blobmsg_for_each_attr(cur, data, rem) { + const char *method; + + if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING) + continue; + + if (n == EAP_MAX_METHODS) + break; + + method = blobmsg_get_string(cur); + eap->methods[n].method = eap_server_get_type(method, &eap->methods[n].vendor); + if (eap->methods[n].vendor == EAP_VENDOR_IETF && + eap->methods[n].method == EAP_TYPE_NONE) { + if (!strcmp(method, "TTLS-PAP")) { + eap->ttls_auth |= EAP_TTLS_AUTH_PAP; + continue; + } + if (!strcmp(method, "TTLS-CHAP")) { + eap->ttls_auth |= EAP_TTLS_AUTH_CHAP; + continue; + } + if (!strcmp(method, "TTLS-MSCHAP")) { + eap->ttls_auth |= EAP_TTLS_AUTH_MSCHAP; + continue; + } + if (!strcmp(method, "TTLS-MSCHAPV2")) { + eap->ttls_auth |= EAP_TTLS_AUTH_MSCHAPV2; + continue; + } + } + n++; + } +} + +static struct eap_user * +radius_user_get_state(struct radius_user_data *u, struct blob_attr *data, + const char *id) +{ + static const struct blobmsg_policy policy[__USER_ATTR_MAX] = { + [USER_ATTR_PASSWORD] = { "password", BLOBMSG_TYPE_STRING }, + [USER_ATTR_HASH] = { "hash", BLOBMSG_TYPE_STRING }, + [USER_ATTR_SALT] = { "salt", BLOBMSG_TYPE_STRING }, + [USER_ATTR_METHODS] = { "methods", BLOBMSG_TYPE_ARRAY }, + [USER_ATTR_RADIUS] = { "radius", BLOBMSG_TYPE_ARRAY }, + [USER_ATTR_VLAN] = { "vlan-id", BLOBMSG_TYPE_INT32 }, + [USER_ATTR_MAX_RATE_UP] = { "max-rate-up", BLOBMSG_TYPE_INT32 }, + [USER_ATTR_MAX_RATE_DOWN] = { "max-rate-down", BLOBMSG_TYPE_INT32 }, + }; + struct blob_attr *tb[__USER_ATTR_MAX], *cur; + char *password_buf, *salt_buf, *name_buf; + struct radius_parse_attr_state astate = {}; + struct hostapd_radius_attr *attr; + struct radius_user_state *state; + int pw_len = 0, salt_len = 0; + struct eap_user *eap; + struct wpabuf *val; + size_t attrsize = 0; + void *attrdata; + int n_attr = 0; + + state = avl_find_element(&u->user_state, id, state, node); + if (state) + return &state->data; + + blobmsg_parse(policy, __USER_ATTR_MAX, tb, blobmsg_data(data), blobmsg_len(data)); + + if ((cur = tb[USER_ATTR_SALT]) != NULL) + salt_len = strlen(blobmsg_get_string(cur)) / 2; + if ((cur = tb[USER_ATTR_HASH]) != NULL) + pw_len = strlen(blobmsg_get_string(cur)) / 2; + else if ((cur = tb[USER_ATTR_PASSWORD]) != NULL) + pw_len = blobmsg_len(cur) - 1; + radius_count_attrs(tb, &n_attr, &attrsize); + + state = calloc_a(sizeof(*state), &name_buf, strlen(id) + 1, + &password_buf, pw_len, + &salt_buf, salt_len, + &astate.attr, n_attr * sizeof(*astate.attr), + &astate.buf, n_attr * sizeof(*astate.buf), + &astate.attrdata, attrsize); + eap = &state->data; + eap->salt = salt_len ? salt_buf : NULL; + eap->salt_len = salt_len; + eap->password = pw_len ? password_buf : NULL; + eap->password_len = pw_len; + eap->force_version = -1; + + if ((cur = tb[USER_ATTR_SALT]) != NULL) + hexstr2bin(blobmsg_get_string(cur), salt_buf, salt_len); + if ((cur = tb[USER_ATTR_PASSWORD]) != NULL) + memcpy(password_buf, blobmsg_get_string(cur), pw_len); + else if ((cur = tb[USER_ATTR_HASH]) != NULL) { + hexstr2bin(blobmsg_get_string(cur), password_buf, pw_len); + eap->password_hash = 1; + } + radius_user_parse_methods(eap, tb[USER_ATTR_METHODS]); + + if (n_attr > 0) { + cur = tb[USER_ATTR_RADIUS]; + eap->accept_attr = astate.attr; + radius_parse_attrs(tb, &astate); + } + + state->node.key = strcpy(name_buf, id); + avl_insert(&u->user_state, &state->node); + + return &state->data; + +free: + free(state); + return NULL; +} + +static int radius_get_eap_user(void *ctx, const u8 *identity, + size_t identity_len, int phase2, + struct eap_user *user) +{ + struct radius_state *s = ctx; + struct radius_user_data *u = phase2 ? &s->phase2 : &s->phase1; + struct blob_attr *entry; + struct eap_user *data; + char *id; + + if (identity_len > 512) + return -1; + + load_userfile(s); + + id = alloca(identity_len + 1); + memcpy(id, identity, identity_len); + id[identity_len] = 0; + + entry = radius_user_get(u, id); + if (!entry) + return -1; + + if (!user) + return 0; + + data = radius_user_get_state(u, entry, id); + if (!data) + return -1; + + *user = *data; + if (user->password_len > 0) + user->password = os_memdup(user->password, user->password_len); + if (user->salt_len > 0) + user->salt = os_memdup(user->salt, user->salt_len); + user->phase2 = phase2; + + return 0; +} + +static int radius_setup(struct radius_state *s, struct radius_config *c) +{ + struct eap_config *eap = &s->eap; + struct tls_config conf = { + .event_cb = radius_tls_event, + .tls_flags = TLS_CONN_DISABLE_TLSv1_3, + .cb_ctx = s, + }; + + eap->eap_server = 1; + eap->max_auth_rounds = 100; + eap->max_auth_rounds_short = 50; + eap->ssl_ctx = tls_init(&conf); + if (!eap->ssl_ctx) { + wpa_printf(MSG_INFO, "TLS init failed\n"); + return 1; + } + + if (tls_global_set_params(eap->ssl_ctx, &c->tls)) { + wpa_printf(MSG_INFO, "failed to set TLS parameters\n"); + return 1; + } + + c->radius.eap_cfg = eap; + c->radius.conf_ctx = s; + c->radius.get_eap_user = radius_get_eap_user; + s->radius = radius_server_init(&c->radius); + if (!s->radius) { + wpa_printf(MSG_INFO, "failed to initialize radius server\n"); + return 1; + } + + return 0; +} + +static int radius_init(struct radius_state *s) +{ + memset(s, 0, sizeof(*s)); + radius_userdata_init(&s->phase1); + radius_userdata_init(&s->phase2); +} + +static void radius_deinit(struct radius_state *s) +{ + if (s->radius) + radius_server_deinit(s->radius); + + if (s->eap.ssl_ctx) + tls_deinit(s->eap.ssl_ctx); + + radius_userdata_free(&s->phase1); + radius_userdata_free(&s->phase2); +} + +static int usage(const char *progname) +{ + fprintf(stderr, "Usage: %s \n", + progname); +} + +int radius_main(int argc, char **argv) +{ + static struct radius_state state = {}; + static struct radius_config config = {}; + const char *progname = argv[0]; + int ret = 0; + int ch; + + wpa_debug_setup_stdout(); + wpa_debug_level = 0; + + if (eloop_init()) { + wpa_printf(MSG_ERROR, "Failed to initialize event loop"); + return 1; + } + + eap_server_register_methods(); + radius_init(&state); + + while ((ch = getopt(argc, argv, "6C:c:d:i:k:K:p:P:s:u:")) != -1) { + switch (ch) { + case '6': + config.radius.ipv6 = 1; + break; + case 'C': + config.tls.ca_cert = optarg; + break; + case 'c': + if (config.tls.client_cert2) + return usage(progname); + + if (config.tls.client_cert) + config.tls.client_cert2 = optarg; + else + config.tls.client_cert = optarg; + break; + case 'd': + config.tls.dh_file = optarg; + break; + case 'i': + state.eap.server_id = optarg; + state.eap.server_id_len = strlen(optarg); + break; + case 'k': + if (config.tls.private_key2) + return usage(progname); + + if (config.tls.private_key) + config.tls.private_key2 = optarg; + else + config.tls.private_key = optarg; + break; + case 'K': + if (config.tls.private_key_passwd2) + return usage(progname); + + if (config.tls.private_key_passwd) + config.tls.private_key_passwd2 = optarg; + else + config.tls.private_key_passwd = optarg; + break; + case 'p': + config.radius.auth_port = atoi(optarg); + break; + case 'P': + config.radius.acct_port = atoi(optarg); + break; + case 's': + config.radius.client_file = optarg; + break; + case 'u': + state.user_file = optarg; + break; + default: + return usage(progname); + } + } + + if (!config.tls.client_cert || !config.tls.private_key || + !config.radius.client_file || !state.eap.server_id || + !state.user_file) { + wpa_printf(MSG_INFO, "missing options\n"); + goto out; + } + + ret = radius_setup(&state, &config); + if (ret) + goto out; + + load_userfile(&state); + eloop_run(); + +out: + radius_deinit(&state); + os_program_deinit(); + + return ret; +} diff --git a/package/network/services/hostapd/src/src/ap/ubus.c b/package/network/services/hostapd/src/src/ap/ubus.c index 1aaa6e06ae..693c054177 100644 --- a/package/network/services/hostapd/src/src/ap/ubus.c +++ b/package/network/services/hostapd/src/src/ap/ubus.c @@ -29,11 +29,6 @@ static struct ubus_context *ctx; static struct blob_buf b; static int ctx_ref; -static inline struct hapd_interfaces *get_hapd_interfaces_from_object(struct ubus_object *obj) -{ - return container_of(obj, struct hapd_interfaces, ubus); -} - static inline struct hostapd_data *get_hapd_from_object(struct ubus_object *obj) { return container_of(obj, struct hostapd_data, ubus.obj); @@ -44,12 +39,6 @@ struct ubus_banned_client { u8 addr[ETH_ALEN]; }; -static void ubus_receive(int sock, void *eloop_ctx, void *sock_ctx) -{ - struct ubus_context *ctx = eloop_ctx; - ubus_handle_event(ctx); -} - static void ubus_reconnect_timeout(void *eloop_data, void *user_ctx) { if (ubus_reconnect(ctx, NULL)) { @@ -57,12 +46,12 @@ static void ubus_reconnect_timeout(void *eloop_data, void *user_ctx) return; } - eloop_register_read_sock(ctx->sock.fd, ubus_receive, ctx, NULL); + ubus_add_uloop(ctx); } static void hostapd_ubus_connection_lost(struct ubus_context *ctx) { - eloop_unregister_read_sock(ctx->sock.fd); + uloop_fd_delete(&ctx->sock); eloop_register_timeout(1, 0, ubus_reconnect_timeout, ctx, NULL); } @@ -71,12 +60,14 @@ static bool hostapd_ubus_init(void) if (ctx) return true; + eloop_add_uloop(); ctx = ubus_connect(NULL); if (!ctx) return false; ctx->connection_lost = hostapd_ubus_connection_lost; - eloop_register_read_sock(ctx->sock.fd, ubus_receive, ctx, NULL); + ubus_add_uloop(ctx); + return true; } @@ -94,7 +85,7 @@ static void hostapd_ubus_ref_dec(void) if (ctx_ref) return; - eloop_unregister_read_sock(ctx->sock.fd); + uloop_fd_delete(&ctx->sock); ubus_free(ctx); ctx = NULL; } @@ -127,38 +118,6 @@ static void hostapd_notify_ubus(struct ubus_object *obj, char *bssname, char *ev free(event_type); } -static void hostapd_send_procd_event(char *bssname, char *event) -{ - char *name, *s; - uint32_t id; - void *v; - - if (!ctx || ubus_lookup_id(ctx, "service", &id)) - return; - - if (asprintf(&name, "hostapd.%s.%s", bssname, event) < 0) - return; - - blob_buf_init(&b, 0); - - s = blobmsg_alloc_string_buffer(&b, "type", strlen(name) + 1); - sprintf(s, "%s", name); - blobmsg_add_string_buffer(&b); - - v = blobmsg_open_table(&b, "data"); - blobmsg_close_table(&b, v); - - ubus_invoke(ctx, id, "event", b.head, NULL, NULL, 1000); - - free(name); -} - -static void hostapd_send_shared_event(struct ubus_object *obj, char *bssname, char *event) -{ - hostapd_send_procd_event(bssname, event); - hostapd_notify_ubus(obj, bssname, event); -} - static void hostapd_bss_del_ban(void *eloop_data, void *user_ctx) { @@ -203,10 +162,8 @@ hostapd_bss_reload(struct ubus_context *ctx, struct ubus_object *obj, struct blob_attr *msg) { struct hostapd_data *hapd = container_of(obj, struct hostapd_data, ubus.obj); - int ret = hostapd_reload_config(hapd->iface, 1); - hostapd_send_shared_event(&hapd->iface->interfaces->ubus, hapd->conf->iface, "reload"); - return ret; + return hostapd_reload_config(hapd->iface); } @@ -318,6 +275,10 @@ hostapd_bss_get_clients(struct ubus_context *ctx, struct ubus_object *obj, blobmsg_add_u8(&b, sta_flags[i].name, !!(sta->flags & sta_flags[i].flag)); +#ifdef CONFIG_MBO + blobmsg_add_u8(&b, "mbo", !!(sta->cell_capa)); +#endif + r = blobmsg_open_array(&b, "rrm"); for (i = 0; i < ARRAY_SIZE(sta->rrm_enabled_capa); i++) blobmsg_add_u32(&b, "", sta->rrm_enabled_capa[i]); @@ -386,32 +347,6 @@ hostapd_bss_get_features(struct ubus_context *ctx, struct ubus_object *obj, return 0; } -/* Imported from iw/util.c - * https://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git/tree/util.c?id=4b25ae3537af48dbf9d0abf94132e5ba01b32c18#n200 - */ -int ieee80211_frequency_to_channel(int freq) -{ - /* see 802.11-2007 17.3.8.3.2 and Annex J */ - if (freq == 2484) - return 14; - /* see 802.11ax D6.1 27.3.23.2 and Annex E */ - else if (freq == 5935) - return 2; - else if (freq < 2484) - return (freq - 2407) / 5; - else if (freq >= 4910 && freq <= 4980) - return (freq - 4000) / 5; - else if (freq < 5950) - return (freq - 5000) / 5; - else if (freq <= 45000) /* DMG band lower limit */ - /* see 802.11ax D6.1 27.3.23.2 */ - return (freq - 5950) / 5; - else if (freq >= 58320 && freq <= 70200) - return (freq - 56160) / 2160; - else - return 0; -} - static int hostapd_bss_get_status(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, @@ -445,6 +380,12 @@ hostapd_bss_get_status(struct ubus_context *ctx, struct ubus_object *obj, blobmsg_add_u32(&b, "channel", channel); blobmsg_add_u32(&b, "op_class", op_class); blobmsg_add_u32(&b, "beacon_interval", hapd->iconf->beacon_int); +#ifdef CONFIG_IEEE80211AX + blobmsg_add_u32(&b, "bss_color", hapd->iface->conf->he_op.he_bss_color_disabled ? -1 : + hapd->iface->conf->he_op.he_bss_color); +#else + blobmsg_add_u32(&b, "bss_color", -1); +#endif snprintf(phy_name, 17, "%s", hapd->iface->phy); blobmsg_add_string(&b, "phy", phy_name); @@ -703,68 +644,6 @@ enum { __CONFIG_MAX }; -static const struct blobmsg_policy config_add_policy[__CONFIG_MAX] = { - [CONFIG_IFACE] = { "iface", BLOBMSG_TYPE_STRING }, - [CONFIG_FILE] = { "config", BLOBMSG_TYPE_STRING }, -}; - -static int -hostapd_config_add(struct ubus_context *ctx, struct ubus_object *obj, - struct ubus_request_data *req, const char *method, - struct blob_attr *msg) -{ - struct blob_attr *tb[__CONFIG_MAX]; - struct hapd_interfaces *interfaces = get_hapd_interfaces_from_object(obj); - char buf[128]; - - blobmsg_parse(config_add_policy, __CONFIG_MAX, tb, blob_data(msg), blob_len(msg)); - - if (!tb[CONFIG_FILE] || !tb[CONFIG_IFACE]) - return UBUS_STATUS_INVALID_ARGUMENT; - - snprintf(buf, sizeof(buf), "bss_config=%s:%s", - blobmsg_get_string(tb[CONFIG_IFACE]), - blobmsg_get_string(tb[CONFIG_FILE])); - - if (hostapd_add_iface(interfaces, buf)) - return UBUS_STATUS_INVALID_ARGUMENT; - - blob_buf_init(&b, 0); - blobmsg_add_u32(&b, "pid", getpid()); - ubus_send_reply(ctx, req, b.head); - - return UBUS_STATUS_OK; -} - -enum { - CONFIG_REM_IFACE, - __CONFIG_REM_MAX -}; - -static const struct blobmsg_policy config_remove_policy[__CONFIG_REM_MAX] = { - [CONFIG_REM_IFACE] = { "iface", BLOBMSG_TYPE_STRING }, -}; - -static int -hostapd_config_remove(struct ubus_context *ctx, struct ubus_object *obj, - struct ubus_request_data *req, const char *method, - struct blob_attr *msg) -{ - struct blob_attr *tb[__CONFIG_REM_MAX]; - struct hapd_interfaces *interfaces = get_hapd_interfaces_from_object(obj); - char buf[128]; - - blobmsg_parse(config_remove_policy, __CONFIG_REM_MAX, tb, blob_data(msg), blob_len(msg)); - - if (!tb[CONFIG_REM_IFACE]) - return UBUS_STATUS_INVALID_ARGUMENT; - - if (hostapd_remove_iface(interfaces, blobmsg_get_string(tb[CONFIG_REM_IFACE]))) - return UBUS_STATUS_INVALID_ARGUMENT; - - return UBUS_STATUS_OK; -} - enum { CSA_FREQ, CSA_BCN_COUNT, @@ -888,10 +767,13 @@ hostapd_switch_chan(struct ubus_context *ctx, struct ubus_object *obj, css.freq_params.ht_enabled, css.freq_params.vht_enabled, css.freq_params.he_enabled, + css.freq_params.eht_enabled, css.freq_params.sec_channel_offset, chwidth, seg0, seg1, iconf->vht_capab, mode ? &mode->he_capab[IEEE80211_MODE_AP] : + NULL, + mode ? &mode->eht_capab[IEEE80211_MODE_AP] : NULL); for (i = 0; i < hapd->iface->num_bss; i++) { @@ -1447,7 +1329,7 @@ void hostapd_ubus_handle_link_measurement(struct hostapd_data *hapd, const u8 *d static int hostapd_bss_tr_send(struct hostapd_data *hapd, u8 *addr, bool disassoc_imminent, bool abridged, u16 disassoc_timer, u8 validity_period, u8 dialog_token, - struct blob_attr *neighbors) + struct blob_attr *neighbors, u8 mbo_reason, u8 cell_pref, u8 reassoc_delay) { struct blob_attr *cur; struct sta_info *sta; @@ -1455,6 +1337,8 @@ hostapd_bss_tr_send(struct hostapd_data *hapd, u8 *addr, bool disassoc_imminent, int rem; u8 *nr = NULL; u8 req_mode = 0; + u8 mbo[10]; + size_t mbo_len = 0; sta = ap_get_sta(hapd, addr); if (!sta) @@ -1506,8 +1390,37 @@ hostapd_bss_tr_send(struct hostapd_data *hapd, u8 *addr, bool disassoc_imminent, if (disassoc_imminent) req_mode |= WNM_BSS_TM_REQ_DISASSOC_IMMINENT; +#ifdef CONFIG_MBO + u8 *mbo_pos = mbo; + + if (mbo_reason > MBO_TRANSITION_REASON_PREMIUM_AP) + return UBUS_STATUS_INVALID_ARGUMENT; + + if (cell_pref != 0 && cell_pref != 1 && cell_pref != 255) + return UBUS_STATUS_INVALID_ARGUMENT; + + if (reassoc_delay > 65535 || (reassoc_delay && !disassoc_imminent)) + return UBUS_STATUS_INVALID_ARGUMENT; + + *mbo_pos++ = MBO_ATTR_ID_TRANSITION_REASON; + *mbo_pos++ = 1; + *mbo_pos++ = mbo_reason; + *mbo_pos++ = MBO_ATTR_ID_CELL_DATA_PREF; + *mbo_pos++ = 1; + *mbo_pos++ = cell_pref; + + if (reassoc_delay) { + *mbo_pos++ = MBO_ATTR_ID_ASSOC_RETRY_DELAY; + *mbo_pos++ = 2; + WPA_PUT_LE16(mbo_pos, reassoc_delay); + mbo_pos += 2; + } + + mbo_len = mbo_pos - mbo; +#endif + if (wnm_send_bss_tm_req(hapd, sta, req_mode, disassoc_timer, validity_period, NULL, - dialog_token, NULL, nr, nr_len, NULL, 0)) + dialog_token, NULL, nr, nr_len, mbo_len ? mbo : NULL, mbo_len)) return UBUS_STATUS_UNKNOWN_ERROR; return 0; @@ -1521,6 +1434,11 @@ enum { BSS_TR_NEIGHBORS, BSS_TR_ABRIDGED, BSS_TR_DIALOG_TOKEN, +#ifdef CONFIG_MBO + BSS_TR_MBO_REASON, + BSS_TR_CELL_PREF, + BSS_TR_REASSOC_DELAY, +#endif __BSS_TR_DISASSOC_MAX }; @@ -1532,6 +1450,11 @@ static const struct blobmsg_policy bss_tr_policy[__BSS_TR_DISASSOC_MAX] = { [BSS_TR_NEIGHBORS] = { "neighbors", BLOBMSG_TYPE_ARRAY }, [BSS_TR_ABRIDGED] = { "abridged", BLOBMSG_TYPE_BOOL }, [BSS_TR_DIALOG_TOKEN] = { "dialog_token", BLOBMSG_TYPE_INT32 }, +#ifdef CONFIG_MBO + [BSS_TR_MBO_REASON] = { "mbo_reason", BLOBMSG_TYPE_INT32 }, + [BSS_TR_CELL_PREF] = { "cell_pref", BLOBMSG_TYPE_INT32 }, + [BSS_TR_REASSOC_DELAY] = { "reassoc_delay", BLOBMSG_TYPE_INT32 }, +#endif }; static int @@ -1548,6 +1471,9 @@ hostapd_bss_transition_request(struct ubus_context *ctx, struct ubus_object *obj u32 dialog_token = 1; bool abridged; bool da_imminent; + u8 mbo_reason; + u8 cell_pref; + u8 reassoc_delay; blobmsg_parse(bss_tr_policy, __BSS_TR_DISASSOC_MAX, tb, blob_data(msg), blob_len(msg)); @@ -1569,52 +1495,19 @@ hostapd_bss_transition_request(struct ubus_context *ctx, struct ubus_object *obj da_imminent = !!(tb[BSS_TR_DA_IMMINENT] && blobmsg_get_bool(tb[BSS_TR_DA_IMMINENT])); abridged = !!(tb[BSS_TR_ABRIDGED] && blobmsg_get_bool(tb[BSS_TR_ABRIDGED])); - return hostapd_bss_tr_send(hapd, addr, da_imminent, abridged, da_timer, valid_period, - dialog_token, tb[BSS_TR_NEIGHBORS]); -} - -enum { - WNM_DISASSOC_ADDR, - WNM_DISASSOC_DURATION, - WNM_DISASSOC_NEIGHBORS, - WNM_DISASSOC_ABRIDGED, - __WNM_DISASSOC_MAX, -}; - -static const struct blobmsg_policy wnm_disassoc_policy[__WNM_DISASSOC_MAX] = { - [WNM_DISASSOC_ADDR] = { "addr", BLOBMSG_TYPE_STRING }, - [WNM_DISASSOC_DURATION] { "duration", BLOBMSG_TYPE_INT32 }, - [WNM_DISASSOC_NEIGHBORS] { "neighbors", BLOBMSG_TYPE_ARRAY }, - [WNM_DISASSOC_ABRIDGED] { "abridged", BLOBMSG_TYPE_BOOL }, -}; - -static int -hostapd_wnm_disassoc_imminent(struct ubus_context *ctx, struct ubus_object *obj, - struct ubus_request_data *ureq, const char *method, - struct blob_attr *msg) -{ - struct hostapd_data *hapd = container_of(obj, struct hostapd_data, ubus.obj); - struct blob_attr *tb[__WNM_DISASSOC_MAX]; - struct sta_info *sta; - int duration = 10; - u8 addr[ETH_ALEN]; - bool abridged; - - blobmsg_parse(wnm_disassoc_policy, __WNM_DISASSOC_MAX, tb, blob_data(msg), blob_len(msg)); +#ifdef CONFIG_MBO + if (tb[BSS_TR_MBO_REASON]) + mbo_reason = blobmsg_get_u32(tb[BSS_TR_MBO_REASON]); - if (!tb[WNM_DISASSOC_ADDR]) - return UBUS_STATUS_INVALID_ARGUMENT; - - if (hwaddr_aton(blobmsg_data(tb[WNM_DISASSOC_ADDR]), addr)) - return UBUS_STATUS_INVALID_ARGUMENT; + if (tb[BSS_TR_CELL_PREF]) + cell_pref = blobmsg_get_u32(tb[BSS_TR_CELL_PREF]); - if (tb[WNM_DISASSOC_DURATION]) - duration = blobmsg_get_u32(tb[WNM_DISASSOC_DURATION]); - - abridged = !!(tb[WNM_DISASSOC_ABRIDGED] && blobmsg_get_bool(tb[WNM_DISASSOC_ABRIDGED])); + if (tb[BSS_TR_REASSOC_DELAY]) + reassoc_delay = blobmsg_get_u32(tb[BSS_TR_REASSOC_DELAY]); +#endif - return hostapd_bss_tr_send(hapd, addr, true, abridged, duration, duration, - 1, tb[WNM_DISASSOC_NEIGHBORS]); + return hostapd_bss_tr_send(hapd, addr, da_imminent, abridged, da_timer, valid_period, + dialog_token, tb[BSS_TR_NEIGHBORS], mbo_reason, cell_pref, reassoc_delay); } #endif @@ -1671,10 +1564,61 @@ hostapd_bss_update_airtime(struct ubus_context *ctx, struct ubus_object *obj, } #endif +#ifdef CONFIG_TAXONOMY +static const struct blobmsg_policy addr_policy[] = { + { "address", BLOBMSG_TYPE_STRING } +}; + +static bool +hostapd_add_b64_data(const char *name, const struct wpabuf *buf) +{ + char *str; + + if (!buf) + return false; + + str = blobmsg_alloc_string_buffer(&b, name, B64_ENCODE_LEN(wpabuf_len(buf))); + b64_encode(wpabuf_head(buf), wpabuf_len(buf), str, B64_ENCODE_LEN(wpabuf_len(buf))); + blobmsg_add_string_buffer(&b); + + return true; +} + +static int +hostapd_bss_get_sta_ies(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct hostapd_data *hapd = container_of(obj, struct hostapd_data, ubus.obj); + struct blob_attr *tb; + struct sta_info *sta; + u8 addr[ETH_ALEN]; + + blobmsg_parse(addr_policy, 1, &tb, blobmsg_data(msg), blobmsg_len(msg)); + + if (!tb || hwaddr_aton(blobmsg_data(tb), addr)) + return UBUS_STATUS_INVALID_ARGUMENT; + + sta = ap_get_sta(hapd, addr); + if (!sta || (!sta->probe_ie_taxonomy && !sta->assoc_ie_taxonomy)) + return UBUS_STATUS_NOT_FOUND; + + blob_buf_init(&b, 0); + hostapd_add_b64_data("probe_ie", sta->probe_ie_taxonomy); + hostapd_add_b64_data("assoc_ie", sta->assoc_ie_taxonomy); + ubus_send_reply(ctx, req, b.head); + + return 0; +} +#endif + static const struct ubus_method bss_methods[] = { UBUS_METHOD_NOARG("reload", hostapd_bss_reload), UBUS_METHOD_NOARG("get_clients", hostapd_bss_get_clients), +#ifdef CONFIG_TAXONOMY + UBUS_METHOD("get_sta_ies", hostapd_bss_get_sta_ies, addr_policy), +#endif UBUS_METHOD_NOARG("get_status", hostapd_bss_get_status), UBUS_METHOD("del_client", hostapd_bss_del_client, del_policy), #ifdef CONFIG_AIRTIME_POLICY @@ -1700,7 +1644,6 @@ static const struct ubus_method bss_methods[] = { UBUS_METHOD("rrm_beacon_req", hostapd_rrm_beacon_req, beacon_req_policy), UBUS_METHOD("link_measurement_req", hostapd_rrm_lm_req, lm_req_policy), #ifdef CONFIG_WNM_AP - UBUS_METHOD("wnm_disassoc_imminent", hostapd_wnm_disassoc_imminent, wnm_disassoc_policy), UBUS_METHOD("bss_transition_request", hostapd_bss_transition_request, bss_tr_policy), #endif }; @@ -1737,8 +1680,6 @@ void hostapd_ubus_add_bss(struct hostapd_data *hapd) obj->n_methods = bss_object_type.n_methods; ret = ubus_add_object(ctx, obj); hostapd_ubus_ref_inc(); - - hostapd_send_shared_event(&hapd->iface->interfaces->ubus, hapd->conf->iface, "add"); } void hostapd_ubus_free_bss(struct hostapd_data *hapd) @@ -1754,8 +1695,6 @@ void hostapd_ubus_free_bss(struct hostapd_data *hapd) if (!ctx) return; - hostapd_send_shared_event(&hapd->iface->interfaces->ubus, hapd->conf->iface, "remove"); - if (obj->id) { ubus_remove_object(ctx, obj); hostapd_ubus_ref_dec(); @@ -1801,47 +1740,6 @@ void hostapd_ubus_remove_vlan(struct hostapd_data *hapd, struct hostapd_vlan *vl hostapd_ubus_vlan_action(hapd, vlan, "vlan_remove"); } -static const struct ubus_method daemon_methods[] = { - UBUS_METHOD("config_add", hostapd_config_add, config_add_policy), - UBUS_METHOD("config_remove", hostapd_config_remove, config_remove_policy), -}; - -static struct ubus_object_type daemon_object_type = - UBUS_OBJECT_TYPE("hostapd", daemon_methods); - -void hostapd_ubus_add(struct hapd_interfaces *interfaces) -{ - struct ubus_object *obj = &interfaces->ubus; - int ret; - - if (!hostapd_ubus_init()) - return; - - obj->name = strdup("hostapd"); - - obj->type = &daemon_object_type; - obj->methods = daemon_object_type.methods; - obj->n_methods = daemon_object_type.n_methods; - ret = ubus_add_object(ctx, obj); - hostapd_ubus_ref_inc(); -} - -void hostapd_ubus_free(struct hapd_interfaces *interfaces) -{ - struct ubus_object *obj = &interfaces->ubus; - char *name = (char *) obj->name; - - if (!ctx) - return; - - if (obj->id) { - ubus_remove_object(ctx, obj); - hostapd_ubus_ref_dec(); - } - - free(name); -} - struct ubus_event_req { struct ubus_notify_request nreq; int resp; @@ -1962,6 +1860,20 @@ void hostapd_ubus_notify(struct hostapd_data *hapd, const char *type, const u8 * ubus_notify(ctx, &hapd->ubus.obj, type, b.head, -1); } +void hostapd_ubus_notify_authorized(struct hostapd_data *hapd, struct sta_info *sta, + const char *auth_alg) +{ + if (!hapd->ubus.obj.has_subscribers) + return; + + blob_buf_init(&b, 0); + blobmsg_add_macaddr(&b, "address", sta->addr); + if (auth_alg) + blobmsg_add_string(&b, "auth-alg", auth_alg); + + ubus_notify(ctx, &hapd->ubus.obj, "sta-authorized", b.head, -1); +} + void hostapd_ubus_notify_beacon_report( struct hostapd_data *hapd, const u8 *addr, u8 token, u8 rep_mode, struct rrm_measurement_beacon_report *rep, size_t len) @@ -1984,6 +1896,7 @@ void hostapd_ubus_notify_beacon_report( blobmsg_add_macaddr(&b, "bssid", rep->bssid); blobmsg_add_u16(&b, "antenna-id", rep->antenna_id); blobmsg_add_u16(&b, "parent-tsf", rep->parent_tsf); + blobmsg_add_u16(&b, "rep-mode", rep_mode); ubus_notify(ctx, &hapd->ubus.obj, "beacon-report", b.head, -1); } diff --git a/package/network/services/hostapd/src/src/ap/ubus.h b/package/network/services/hostapd/src/src/ap/ubus.h index 5a33b624d0..b0f7c44ab5 100644 --- a/package/network/services/hostapd/src/src/ap/ubus.h +++ b/package/network/services/hostapd/src/src/ap/ubus.h @@ -65,6 +65,8 @@ void hostapd_ubus_free(struct hapd_interfaces *interfaces); int hostapd_ubus_notify_bss_transition_query( struct hostapd_data *hapd, const u8 *addr, u8 dialog_token, u8 reason, const u8 *candidate_list, u16 candidate_list_len); +void hostapd_ubus_notify_authorized(struct hostapd_data *hapd, struct sta_info *sta, + const char *auth_alg); #else @@ -140,6 +142,13 @@ static inline int hostapd_ubus_notify_bss_transition_query( { return 0; } + +static inline void +hostapd_ubus_notify_authorized(struct hostapd_data *hapd, struct sta_info *sta, + const char *auth_alg) +{ +} + #endif #endif diff --git a/package/network/services/hostapd/src/src/ap/ucode.c b/package/network/services/hostapd/src/src/ap/ucode.c new file mode 100644 index 0000000000..af97091be5 --- /dev/null +++ b/package/network/services/hostapd/src/src/ap/ucode.c @@ -0,0 +1,812 @@ +#include + +#include "utils/includes.h" +#include "utils/common.h" +#include "utils/ucode.h" +#include "hostapd.h" +#include "beacon.h" +#include "hw_features.h" +#include "ap_drv_ops.h" +#include "dfs.h" +#include "acs.h" +#include + +static uc_resource_type_t *global_type, *bss_type, *iface_type; +static struct hapd_interfaces *interfaces; +static uc_value_t *global, *bss_registry, *iface_registry; +static uc_vm_t *vm; + +static uc_value_t * +hostapd_ucode_bss_get_uval(struct hostapd_data *hapd) +{ + uc_value_t *val; + + if (hapd->ucode.idx) + return wpa_ucode_registry_get(bss_registry, hapd->ucode.idx); + + val = uc_resource_new(bss_type, hapd); + hapd->ucode.idx = wpa_ucode_registry_add(bss_registry, val); + + return val; +} + +static uc_value_t * +hostapd_ucode_iface_get_uval(struct hostapd_iface *hapd) +{ + uc_value_t *val; + + if (hapd->ucode.idx) + return wpa_ucode_registry_get(iface_registry, hapd->ucode.idx); + + val = uc_resource_new(iface_type, hapd); + hapd->ucode.idx = wpa_ucode_registry_add(iface_registry, val); + + return val; +} + +static void +hostapd_ucode_update_bss_list(struct hostapd_iface *iface, uc_value_t *if_bss, uc_value_t *bss) +{ + uc_value_t *list; + int i; + + list = ucv_array_new(vm); + for (i = 0; i < iface->num_bss; i++) { + struct hostapd_data *hapd = iface->bss[i]; + uc_value_t *val = hostapd_ucode_bss_get_uval(hapd); + + ucv_array_set(list, i, ucv_get(ucv_string_new(hapd->conf->iface))); + ucv_object_add(bss, hapd->conf->iface, ucv_get(val)); + } + ucv_object_add(if_bss, iface->phy, ucv_get(list)); +} + +static void +hostapd_ucode_update_interfaces(void) +{ + uc_value_t *ifs = ucv_object_new(vm); + uc_value_t *if_bss = ucv_array_new(vm); + uc_value_t *bss = ucv_object_new(vm); + int i; + + for (i = 0; i < interfaces->count; i++) { + struct hostapd_iface *iface = interfaces->iface[i]; + + ucv_object_add(ifs, iface->phy, ucv_get(hostapd_ucode_iface_get_uval(iface))); + hostapd_ucode_update_bss_list(iface, if_bss, bss); + } + + ucv_object_add(ucv_prototype_get(global), "interfaces", ucv_get(ifs)); + ucv_object_add(ucv_prototype_get(global), "interface_bss", ucv_get(if_bss)); + ucv_object_add(ucv_prototype_get(global), "bss", ucv_get(bss)); + ucv_gc(vm); +} + +static uc_value_t * +uc_hostapd_add_iface(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *iface = uc_fn_arg(0); + int ret; + + if (ucv_type(iface) != UC_STRING) + return ucv_int64_new(-1); + + ret = hostapd_add_iface(interfaces, ucv_string_get(iface)); + hostapd_ucode_update_interfaces(); + + return ucv_int64_new(ret); +} + +static uc_value_t * +uc_hostapd_remove_iface(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *iface = uc_fn_arg(0); + + if (ucv_type(iface) != UC_STRING) + return NULL; + + hostapd_remove_iface(interfaces, ucv_string_get(iface)); + hostapd_ucode_update_interfaces(); + + return NULL; +} + +static struct hostapd_vlan * +bss_conf_find_vlan(struct hostapd_bss_config *bss, int id) +{ + struct hostapd_vlan *vlan; + + for (vlan = bss->vlan; vlan; vlan = vlan->next) + if (vlan->vlan_id == id) + return vlan; + + return NULL; +} + +static int +bss_conf_rename_vlan(struct hostapd_data *hapd, struct hostapd_vlan *vlan, + const char *ifname) +{ + if (!strcmp(ifname, vlan->ifname)) + return 0; + + hostapd_drv_if_rename(hapd, WPA_IF_AP_VLAN, vlan->ifname, ifname); + os_strlcpy(vlan->ifname, ifname, sizeof(vlan->ifname)); + + return 0; +} + +static int +bss_reload_vlans(struct hostapd_data *hapd, struct hostapd_bss_config *bss) +{ + struct hostapd_bss_config *old_bss = hapd->conf; + struct hostapd_vlan *vlan, *vlan_new, *wildcard; + char ifname[IFNAMSIZ + 1], vlan_ifname[IFNAMSIZ + 1], *pos; + int ret; + + vlan = bss_conf_find_vlan(old_bss, VLAN_ID_WILDCARD); + wildcard = bss_conf_find_vlan(bss, VLAN_ID_WILDCARD); + if (!!vlan != !!wildcard) + return -1; + + if (vlan && wildcard && strcmp(vlan->ifname, wildcard->ifname) != 0) + strcpy(vlan->ifname, wildcard->ifname); + else + wildcard = NULL; + + for (vlan = bss->vlan; vlan; vlan = vlan->next) { + if (vlan->vlan_id == VLAN_ID_WILDCARD || + vlan->dynamic_vlan > 0) + continue; + + if (!bss_conf_find_vlan(old_bss, vlan->vlan_id)) + return -1; + } + + for (vlan = old_bss->vlan; vlan; vlan = vlan->next) { + if (vlan->vlan_id == VLAN_ID_WILDCARD) + continue; + + if (vlan->dynamic_vlan == 0) { + vlan_new = bss_conf_find_vlan(bss, vlan->vlan_id); + if (!vlan_new) + return -1; + + if (bss_conf_rename_vlan(hapd, vlan, vlan_new->ifname)) + return -1; + + continue; + } + + if (!wildcard) + continue; + + os_strlcpy(ifname, wildcard->ifname, sizeof(ifname)); + pos = os_strchr(ifname, '#'); + if (!pos) + return -1; + + *pos++ = '\0'; + ret = os_snprintf(vlan_ifname, sizeof(vlan_ifname), "%s%d%s", + ifname, vlan->vlan_id, pos); + if (os_snprintf_error(sizeof(vlan_ifname), ret)) + return -1; + + if (bss_conf_rename_vlan(hapd, vlan, vlan_ifname)) + return -1; + } + + return 0; +} + +static uc_value_t * +uc_hostapd_bss_set_config(uc_vm_t *vm, size_t nargs) +{ + struct hostapd_data *hapd = uc_fn_thisval("hostapd.bss"); + struct hostapd_bss_config *old_bss; + struct hostapd_iface *iface; + struct hostapd_config *conf; + uc_value_t *file = uc_fn_arg(0); + uc_value_t *index = uc_fn_arg(1); + uc_value_t *files_only = uc_fn_arg(2); + unsigned int i, idx = 0; + int ret = -1; + + if (!hapd || ucv_type(file) != UC_STRING) + goto out; + + if (ucv_type(index) == UC_INTEGER) + idx = ucv_int64_get(index); + + iface = hapd->iface; + conf = interfaces->config_read_cb(ucv_string_get(file)); + if (!conf) + goto out; + + if (idx > conf->num_bss || !conf->bss[idx]) + goto free; + + if (ucv_boolean_get(files_only)) { + struct hostapd_bss_config *bss = conf->bss[idx]; + struct hostapd_bss_config *old_bss = hapd->conf; + +#define swap_field(name) \ + do { \ + void *ptr = old_bss->name; \ + old_bss->name = bss->name; \ + bss->name = ptr; \ + } while (0) + + swap_field(ssid.wpa_psk_file); + ret = bss_reload_vlans(hapd, bss); + goto done; + } + + hostapd_bss_deinit_no_free(hapd); + hostapd_drv_stop_ap(hapd); + hostapd_free_hapd_data(hapd); + + old_bss = hapd->conf; + for (i = 0; i < iface->conf->num_bss; i++) + if (iface->conf->bss[i] == hapd->conf) + iface->conf->bss[i] = conf->bss[idx]; + hapd->conf = conf->bss[idx]; + conf->bss[idx] = old_bss; + + hostapd_setup_bss(hapd, hapd == iface->bss[0], true); + hostapd_ucode_update_interfaces(); + +done: + ret = 0; +free: + hostapd_config_free(conf); +out: + return ucv_int64_new(ret); +} + +static void +hostapd_remove_iface_bss_conf(struct hostapd_config *iconf, + struct hostapd_bss_config *conf) +{ + int i; + + for (i = 0; i < iconf->num_bss; i++) + if (iconf->bss[i] == conf) + break; + + if (i == iconf->num_bss) + return; + + for (i++; i < iconf->num_bss; i++) + iconf->bss[i - 1] = iconf->bss[i]; + iconf->num_bss--; +} + + +static uc_value_t * +uc_hostapd_bss_delete(uc_vm_t *vm, size_t nargs) +{ + struct hostapd_data *hapd = uc_fn_thisval("hostapd.bss"); + struct hostapd_iface *iface; + int i, idx; + + if (!hapd) + return NULL; + + iface = hapd->iface; + if (iface->num_bss == 1) { + wpa_printf(MSG_ERROR, "trying to delete last bss of an iface: %s\n", hapd->conf->iface); + return NULL; + } + + for (idx = 0; idx < iface->num_bss; idx++) + if (iface->bss[idx] == hapd) + break; + + if (idx == iface->num_bss) + return NULL; + + for (i = idx + 1; i < iface->num_bss; i++) + iface->bss[i - 1] = iface->bss[i]; + + iface->num_bss--; + + iface->bss[0]->interface_added = 0; + hostapd_drv_set_first_bss(iface->bss[0]); + hapd->interface_added = 1; + + hostapd_drv_stop_ap(hapd); + hostapd_bss_deinit(hapd); + hostapd_remove_iface_bss_conf(iface->conf, hapd->conf); + hostapd_config_free_bss(hapd->conf); + os_free(hapd); + + hostapd_ucode_update_interfaces(); + ucv_gc(vm); + + return NULL; +} + +static uc_value_t * +uc_hostapd_iface_add_bss(uc_vm_t *vm, size_t nargs) +{ + struct hostapd_iface *iface = uc_fn_thisval("hostapd.iface"); + struct hostapd_bss_config *bss; + struct hostapd_config *conf; + struct hostapd_data *hapd; + uc_value_t *file = uc_fn_arg(0); + uc_value_t *index = uc_fn_arg(1); + unsigned int idx = 0; + uc_value_t *ret = NULL; + + if (!iface || ucv_type(file) != UC_STRING) + goto out; + + if (ucv_type(index) == UC_INTEGER) + idx = ucv_int64_get(index); + + conf = interfaces->config_read_cb(ucv_string_get(file)); + if (!conf || idx > conf->num_bss || !conf->bss[idx]) + goto out; + + bss = conf->bss[idx]; + hapd = hostapd_alloc_bss_data(iface, iface->conf, bss); + if (!hapd) + goto out; + + hapd->driver = iface->bss[0]->driver; + hapd->drv_priv = iface->bss[0]->drv_priv; + if (interfaces->ctrl_iface_init && + interfaces->ctrl_iface_init(hapd) < 0) + goto free_hapd; + + if (iface->state == HAPD_IFACE_ENABLED && + hostapd_setup_bss(hapd, -1, true)) + goto deinit_ctrl; + + iface->bss = os_realloc_array(iface->bss, iface->num_bss + 1, + sizeof(*iface->bss)); + iface->bss[iface->num_bss++] = hapd; + + iface->conf->bss = os_realloc_array(iface->conf->bss, + iface->conf->num_bss + 1, + sizeof(*iface->conf->bss)); + iface->conf->bss[iface->conf->num_bss] = bss; + conf->bss[idx] = NULL; + ret = hostapd_ucode_bss_get_uval(hapd); + hostapd_ucode_update_interfaces(); + goto out; + +deinit_ctrl: + if (interfaces->ctrl_iface_deinit) + interfaces->ctrl_iface_deinit(hapd); +free_hapd: + hostapd_free_hapd_data(hapd); + os_free(hapd); +out: + hostapd_config_free(conf); + return ret; +} + +static uc_value_t * +uc_hostapd_iface_set_bss_order(uc_vm_t *vm, size_t nargs) +{ + struct hostapd_iface *iface = uc_fn_thisval("hostapd.iface"); + uc_value_t *bss_list = uc_fn_arg(0); + struct hostapd_data **new_bss; + struct hostapd_bss_config **new_conf; + + if (!iface) + return NULL; + + if (ucv_type(bss_list) != UC_ARRAY || + ucv_array_length(bss_list) != iface->num_bss) + return NULL; + + new_bss = calloc(iface->num_bss, sizeof(*new_bss)); + new_conf = calloc(iface->num_bss, sizeof(*new_conf)); + for (size_t i = 0; i < iface->num_bss; i++) { + struct hostapd_data *bss; + + bss = ucv_resource_data(ucv_array_get(bss_list, i), "hostapd.bss"); + if (bss->iface != iface) + goto free; + + for (size_t k = 0; k < i; k++) + if (new_bss[k] == bss) + goto free; + + new_bss[i] = bss; + new_conf[i] = bss->conf; + } + + new_bss[0]->interface_added = 0; + for (size_t i = 1; i < iface->num_bss; i++) + new_bss[i]->interface_added = 1; + + free(iface->bss); + iface->bss = new_bss; + + free(iface->conf->bss); + iface->conf->bss = new_conf; + iface->conf->num_bss = iface->num_bss; + hostapd_drv_set_first_bss(iface->bss[0]); + + return ucv_boolean_new(true); + +free: + free(new_bss); + free(new_conf); + return NULL; +} + +static uc_value_t * +uc_hostapd_bss_ctrl(uc_vm_t *vm, size_t nargs) +{ + struct hostapd_data *hapd = uc_fn_thisval("hostapd.bss"); + uc_value_t *arg = uc_fn_arg(0); + struct sockaddr_storage from = {}; + static char reply[4096]; + int reply_len; + + if (!hapd || !interfaces->ctrl_iface_recv || + ucv_type(arg) != UC_STRING) + return NULL; + + reply_len = interfaces->ctrl_iface_recv(hapd, ucv_string_get(arg), + reply, sizeof(reply), + &from, sizeof(from)); + if (reply_len < 0) + return NULL; + + if (reply_len && reply[reply_len - 1] == '\n') + reply_len--; + + return ucv_string_new_length(reply, reply_len); +} + +static void +uc_hostapd_disable_iface(struct hostapd_iface *iface) +{ + switch (iface->state) { + case HAPD_IFACE_DISABLED: + break; +#ifdef CONFIG_ACS + case HAPD_IFACE_ACS: + acs_cleanup(iface); + iface->scan_cb = NULL; + /* fallthrough */ +#endif + default: + hostapd_disable_iface(iface); + break; + } +} + +static uc_value_t * +uc_hostapd_iface_stop(uc_vm_t *vm, size_t nargs) +{ + struct hostapd_iface *iface = uc_fn_thisval("hostapd.iface"); + int i; + + if (!iface) + return NULL; + + if (iface->state != HAPD_IFACE_ENABLED) + uc_hostapd_disable_iface(iface); + + for (i = 0; i < iface->num_bss; i++) { + struct hostapd_data *hapd = iface->bss[i]; + + hostapd_drv_stop_ap(hapd); + hapd->beacon_set_done = 0; + } + + return NULL; +} + +static uc_value_t * +uc_hostapd_iface_start(uc_vm_t *vm, size_t nargs) +{ + struct hostapd_iface *iface = uc_fn_thisval("hostapd.iface"); + uc_value_t *info = uc_fn_arg(0); + struct hostapd_config *conf; + bool changed = false; + uint64_t intval; + int i; + + if (!iface) + return NULL; + + if (!info) { + iface->freq = 0; + goto out; + } + + if (ucv_type(info) != UC_OBJECT) + return NULL; + +#define UPDATE_VAL(field, name) \ + if ((intval = ucv_int64_get(ucv_object_get(info, name, NULL))) && \ + !errno && intval != conf->field) do { \ + conf->field = intval; \ + changed = true; \ + } while(0) + + conf = iface->conf; + UPDATE_VAL(op_class, "op_class"); + UPDATE_VAL(hw_mode, "hw_mode"); + UPDATE_VAL(channel, "channel"); + UPDATE_VAL(secondary_channel, "sec_channel"); + if (!changed && + (iface->bss[0]->beacon_set_done || + iface->state == HAPD_IFACE_DFS)) + return ucv_boolean_new(true); + + intval = ucv_int64_get(ucv_object_get(info, "center_seg0_idx", NULL)); + if (!errno) + hostapd_set_oper_centr_freq_seg0_idx(conf, intval); + + intval = ucv_int64_get(ucv_object_get(info, "center_seg1_idx", NULL)); + if (!errno) + hostapd_set_oper_centr_freq_seg1_idx(conf, intval); + + intval = ucv_int64_get(ucv_object_get(info, "oper_chwidth", NULL)); + if (!errno) + hostapd_set_oper_chwidth(conf, intval); + + intval = ucv_int64_get(ucv_object_get(info, "frequency", NULL)); + if (!errno) + iface->freq = intval; + else + iface->freq = 0; + conf->acs = 0; + +out: + switch (iface->state) { + case HAPD_IFACE_ENABLED: + if (!hostapd_is_dfs_required(iface) || + hostapd_is_dfs_chan_available(iface)) + break; + wpa_printf(MSG_INFO, "DFS CAC required on new channel, restart interface"); + /* fallthrough */ + default: + uc_hostapd_disable_iface(iface); + break; + } + + if (conf->channel && !iface->freq) + iface->freq = hostapd_hw_get_freq(iface->bss[0], conf->channel); + + if (iface->state != HAPD_IFACE_ENABLED) { + hostapd_enable_iface(iface); + return ucv_boolean_new(true); + } + + for (i = 0; i < iface->num_bss; i++) { + struct hostapd_data *hapd = iface->bss[i]; + int ret; + + hapd->conf->start_disabled = 0; + hostapd_set_freq(hapd, conf->hw_mode, iface->freq, + conf->channel, + conf->enable_edmg, + conf->edmg_channel, + conf->ieee80211n, + conf->ieee80211ac, + conf->ieee80211ax, + conf->ieee80211be, + conf->secondary_channel, + hostapd_get_oper_chwidth(conf), + hostapd_get_oper_centr_freq_seg0_idx(conf), + hostapd_get_oper_centr_freq_seg1_idx(conf)); + + ieee802_11_set_beacon(hapd); + } + + return ucv_boolean_new(true); +} + +static uc_value_t * +uc_hostapd_iface_switch_channel(uc_vm_t *vm, size_t nargs) +{ + struct hostapd_iface *iface = uc_fn_thisval("hostapd.iface"); + uc_value_t *info = uc_fn_arg(0); + struct hostapd_config *conf; + struct csa_settings csa = {}; + uint64_t intval; + int i, ret = 0; + + if (!iface || ucv_type(info) != UC_OBJECT) + return NULL; + + conf = iface->conf; + if ((intval = ucv_int64_get(ucv_object_get(info, "csa_count", NULL))) && !errno) + csa.cs_count = intval; + if ((intval = ucv_int64_get(ucv_object_get(info, "sec_channel", NULL))) && !errno) + csa.freq_params.sec_channel_offset = intval; + + csa.freq_params.ht_enabled = conf->ieee80211n; + csa.freq_params.vht_enabled = conf->ieee80211ac; + csa.freq_params.he_enabled = conf->ieee80211ax; +#ifdef CONFIG_IEEE80211BE + csa.freq_params.eht_enabled = conf->ieee80211be; +#endif + intval = ucv_int64_get(ucv_object_get(info, "oper_chwidth", NULL)); + if (errno) + intval = hostapd_get_oper_chwidth(conf); + if (intval) + csa.freq_params.bandwidth = 40 << intval; + else + csa.freq_params.bandwidth = csa.freq_params.sec_channel_offset ? 40 : 20; + + if ((intval = ucv_int64_get(ucv_object_get(info, "frequency", NULL))) && !errno) + csa.freq_params.freq = intval; + if ((intval = ucv_int64_get(ucv_object_get(info, "center_freq1", NULL))) && !errno) + csa.freq_params.center_freq1 = intval; + if ((intval = ucv_int64_get(ucv_object_get(info, "center_freq2", NULL))) && !errno) + csa.freq_params.center_freq2 = intval; + + for (i = 0; i < iface->num_bss; i++) + ret = hostapd_switch_channel(iface->bss[i], &csa); + + return ucv_boolean_new(!ret); +} + +static uc_value_t * +uc_hostapd_bss_rename(uc_vm_t *vm, size_t nargs) +{ + struct hostapd_data *hapd = uc_fn_thisval("hostapd.bss"); + uc_value_t *ifname_arg = uc_fn_arg(0); + char prev_ifname[IFNAMSIZ + 1]; + struct sta_info *sta; + const char *ifname; + int ret; + + if (!hapd || ucv_type(ifname_arg) != UC_STRING) + return NULL; + + os_strlcpy(prev_ifname, hapd->conf->iface, sizeof(prev_ifname)); + ifname = ucv_string_get(ifname_arg); + + hostapd_ubus_free_bss(hapd); + if (interfaces->ctrl_iface_deinit) + interfaces->ctrl_iface_deinit(hapd); + + ret = hostapd_drv_if_rename(hapd, WPA_IF_AP_BSS, NULL, ifname); + if (ret) + goto out; + + for (sta = hapd->sta_list; sta; sta = sta->next) { + char cur_name[IFNAMSIZ + 1], new_name[IFNAMSIZ + 1]; + + if (!(sta->flags & WLAN_STA_WDS) || sta->pending_wds_enable) + continue; + + snprintf(cur_name, sizeof(cur_name), "%s.sta%d", prev_ifname, sta->aid); + snprintf(new_name, sizeof(new_name), "%s.sta%d", ifname, sta->aid); + hostapd_drv_if_rename(hapd, WPA_IF_AP_VLAN, cur_name, new_name); + } + + if (!strncmp(hapd->conf->ssid.vlan, hapd->conf->iface, sizeof(hapd->conf->ssid.vlan))) + os_strlcpy(hapd->conf->ssid.vlan, ifname, sizeof(hapd->conf->ssid.vlan)); + os_strlcpy(hapd->conf->iface, ifname, sizeof(hapd->conf->iface)); + hostapd_ubus_add_bss(hapd); + + hostapd_ucode_update_interfaces(); +out: + if (interfaces->ctrl_iface_init) + interfaces->ctrl_iface_init(hapd); + + return ret ? NULL : ucv_boolean_new(true); +} + + +int hostapd_ucode_init(struct hapd_interfaces *ifaces) +{ + static const uc_function_list_t global_fns[] = { + { "printf", uc_wpa_printf }, + { "getpid", uc_wpa_getpid }, + { "sha1", uc_wpa_sha1 }, + { "freq_info", uc_wpa_freq_info }, + { "add_iface", uc_hostapd_add_iface }, + { "remove_iface", uc_hostapd_remove_iface }, + }; + static const uc_function_list_t bss_fns[] = { + { "ctrl", uc_hostapd_bss_ctrl }, + { "set_config", uc_hostapd_bss_set_config }, + { "rename", uc_hostapd_bss_rename }, + { "delete", uc_hostapd_bss_delete }, + }; + static const uc_function_list_t iface_fns[] = { + { "set_bss_order", uc_hostapd_iface_set_bss_order }, + { "add_bss", uc_hostapd_iface_add_bss }, + { "stop", uc_hostapd_iface_stop }, + { "start", uc_hostapd_iface_start }, + { "switch_channel", uc_hostapd_iface_switch_channel }, + }; + uc_value_t *data, *proto; + + interfaces = ifaces; + vm = wpa_ucode_create_vm(); + + global_type = uc_type_declare(vm, "hostapd.global", global_fns, NULL); + bss_type = uc_type_declare(vm, "hostapd.bss", bss_fns, NULL); + iface_type = uc_type_declare(vm, "hostapd.iface", iface_fns, NULL); + + bss_registry = ucv_array_new(vm); + uc_vm_registry_set(vm, "hostap.bss_registry", bss_registry); + + iface_registry = ucv_array_new(vm); + uc_vm_registry_set(vm, "hostap.iface_registry", iface_registry); + + global = wpa_ucode_global_init("hostapd", global_type); + + if (wpa_ucode_run(HOSTAPD_UC_PATH "hostapd.uc")) + goto free_vm; + ucv_gc(vm); + + return 0; + +free_vm: + wpa_ucode_free_vm(); + return -1; +} + +void hostapd_ucode_free(void) +{ + if (wpa_ucode_call_prepare("shutdown") == 0) + ucv_put(wpa_ucode_call(0)); + wpa_ucode_free_vm(); +} + +void hostapd_ucode_free_iface(struct hostapd_iface *iface) +{ + wpa_ucode_registry_remove(iface_registry, iface->ucode.idx); +} + +void hostapd_ucode_add_bss(struct hostapd_data *hapd) +{ + uc_value_t *val; + + if (wpa_ucode_call_prepare("bss_add")) + return; + + val = hostapd_ucode_bss_get_uval(hapd); + uc_value_push(ucv_get(ucv_string_new(hapd->conf->iface))); + uc_value_push(ucv_get(val)); + ucv_put(wpa_ucode_call(2)); + ucv_gc(vm); +} + +void hostapd_ucode_reload_bss(struct hostapd_data *hapd) +{ + uc_value_t *val; + + if (wpa_ucode_call_prepare("bss_reload")) + return; + + val = hostapd_ucode_bss_get_uval(hapd); + uc_value_push(ucv_get(ucv_string_new(hapd->conf->iface))); + uc_value_push(ucv_get(val)); + ucv_put(wpa_ucode_call(2)); + ucv_gc(vm); +} + +void hostapd_ucode_free_bss(struct hostapd_data *hapd) +{ + uc_value_t *val; + + val = wpa_ucode_registry_remove(bss_registry, hapd->ucode.idx); + if (!val) + return; + + hapd->ucode.idx = 0; + if (wpa_ucode_call_prepare("bss_remove")) + return; + + uc_value_push(ucv_string_new(hapd->conf->iface)); + uc_value_push(ucv_get(val)); + ucv_put(wpa_ucode_call(2)); + ucv_gc(vm); +} diff --git a/package/network/services/hostapd/src/src/ap/ucode.h b/package/network/services/hostapd/src/src/ap/ucode.h new file mode 100644 index 0000000000..d00b787169 --- /dev/null +++ b/package/network/services/hostapd/src/src/ap/ucode.h @@ -0,0 +1,54 @@ +#ifndef __HOSTAPD_AP_UCODE_H +#define __HOSTAPD_AP_UCODE_H + +#include "utils/ucode.h" + +struct hostapd_data; + +struct hostapd_ucode_bss { +#ifdef UCODE_SUPPORT + int idx; +#endif +}; + +struct hostapd_ucode_iface { +#ifdef UCODE_SUPPORT + int idx; +#endif +}; + +#ifdef UCODE_SUPPORT + +int hostapd_ucode_init(struct hapd_interfaces *ifaces); + +void hostapd_ucode_free(void); +void hostapd_ucode_free_iface(struct hostapd_iface *iface); +void hostapd_ucode_add_bss(struct hostapd_data *hapd); +void hostapd_ucode_free_bss(struct hostapd_data *hapd); +void hostapd_ucode_reload_bss(struct hostapd_data *hapd); + +#else + +static inline int hostapd_ucode_init(struct hapd_interfaces *ifaces) +{ + return -EINVAL; +} +static inline void hostapd_ucode_free(void) +{ +} +static inline void hostapd_ucode_free_iface(struct hostapd_iface *iface) +{ +} +static inline void hostapd_ucode_reload_bss(struct hostapd_data *hapd) +{ +} +static inline void hostapd_ucode_add_bss(struct hostapd_data *hapd) +{ +} +static inline void hostapd_ucode_free_bss(struct hostapd_data *hapd) +{ +} + +#endif + +#endif diff --git a/package/network/services/hostapd/src/src/utils/build_features.h b/package/network/services/hostapd/src/src/utils/build_features.h index cb7cb72731..553769eceb 100644 --- a/package/network/services/hostapd/src/src/utils/build_features.h +++ b/package/network/services/hostapd/src/src/utils/build_features.h @@ -7,10 +7,6 @@ static inline int has_feature(const char *feat) if (!strcmp(feat, "eap")) return 1; #endif -#ifdef CONFIG_IEEE80211N - if (!strcmp(feat, "11n")) - return 1; -#endif #ifdef CONFIG_IEEE80211AC if (!strcmp(feat, "11ac")) return 1; @@ -54,6 +50,14 @@ static inline int has_feature(const char *feat) #ifdef CONFIG_FILS if (!strcmp(feat, "fils")) return 1; +#endif +#ifdef CONFIG_OCV + if (!strcmp(feat, "ocv")) + return 1; +#endif +#ifdef CONFIG_MESH + if (!strcmp(feat, "mesh")) + return 1; #endif return 0; } diff --git a/package/network/services/hostapd/src/src/utils/ucode.c b/package/network/services/hostapd/src/src/utils/ucode.c new file mode 100644 index 0000000000..2beeb9a7ff --- /dev/null +++ b/package/network/services/hostapd/src/src/utils/ucode.c @@ -0,0 +1,335 @@ +#include +#include "ucode.h" +#include "utils/eloop.h" +#include "crypto/crypto.h" +#include "crypto/sha1.h" +#include "common/ieee802_11_common.h" +#include +#include + +static uc_value_t *registry; +static uc_vm_t vm; +static struct uloop_timeout gc_timer; + +static void uc_gc_timer(struct uloop_timeout *timeout) +{ + ucv_gc(&vm); +} + +uc_value_t *uc_wpa_printf(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *level = uc_fn_arg(0); + uc_value_t *ret, **args; + uc_cfn_ptr_t _sprintf; + int l = MSG_INFO; + int i, start = 0; + + _sprintf = uc_stdlib_function("sprintf"); + if (!sprintf) + return NULL; + + if (ucv_type(level) == UC_INTEGER) { + l = ucv_int64_get(level); + start++; + } + + if (nargs <= start) + return NULL; + + ret = _sprintf(vm, nargs - start); + if (ucv_type(ret) != UC_STRING) + return NULL; + + wpa_printf(l, "%s", ucv_string_get(ret)); + ucv_put(ret); + + return NULL; +} + +uc_value_t *uc_wpa_freq_info(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *freq = uc_fn_arg(0); + uc_value_t *sec = uc_fn_arg(1); + int width = ucv_uint64_get(uc_fn_arg(2)); + int freq_val, center_idx, center_ofs; + enum oper_chan_width chanwidth; + enum hostapd_hw_mode hw_mode; + u8 op_class, channel, tmp_channel; + const char *modestr; + int sec_channel = 0; + uc_value_t *ret; + + if (ucv_type(freq) != UC_INTEGER) + return NULL; + + freq_val = ucv_int64_get(freq); + if (ucv_type(sec) == UC_INTEGER) + sec_channel = ucv_int64_get(sec); + else if (sec) + return NULL; + else if (freq_val > 4000) + sec_channel = (freq_val / 20) & 1 ? 1 : -1; + else + sec_channel = freq_val < 2442 ? 1 : -1; + + if (sec_channel != -1 && sec_channel != 1 && sec_channel != 0) + return NULL; + + switch (width) { + case 0: + chanwidth = CONF_OPER_CHWIDTH_USE_HT; + break; + case 1: + chanwidth = CONF_OPER_CHWIDTH_80MHZ; + break; + case 2: + chanwidth = CONF_OPER_CHWIDTH_160MHZ; + break; + default: + return NULL; + } + + hw_mode = ieee80211_freq_to_channel_ext(freq_val, sec_channel, + chanwidth, &op_class, &channel); + switch (hw_mode) { + case HOSTAPD_MODE_IEEE80211B: + modestr = "b"; + break; + case HOSTAPD_MODE_IEEE80211G: + modestr = "g"; + break; + case HOSTAPD_MODE_IEEE80211A: + modestr = "a"; + break; + case HOSTAPD_MODE_IEEE80211AD: + modestr = "ad"; + break; + default: + return NULL; + } + + ret = ucv_object_new(vm); + ucv_object_add(ret, "op_class", ucv_int64_new(op_class)); + ucv_object_add(ret, "channel", ucv_int64_new(channel)); + ucv_object_add(ret, "hw_mode", ucv_int64_new(hw_mode)); + ucv_object_add(ret, "hw_mode_str", ucv_get(ucv_string_new(modestr))); + ucv_object_add(ret, "sec_channel", ucv_int64_new(sec_channel)); + ucv_object_add(ret, "frequency", ucv_int64_new(freq_val)); + + if (!sec_channel) + return ret; + + if (freq_val >= 5900) + center_ofs = 0; + else if (freq_val >= 5745) + center_ofs = 20; + else + center_ofs = 35; + tmp_channel = channel - center_ofs; + tmp_channel &= ~((8 << width) - 1); + center_idx = tmp_channel + center_ofs + (4 << width) - 1; + + if (freq_val < 3000) + ucv_object_add(ret, "center_seg0_idx", ucv_int64_new(0)); + else + ucv_object_add(ret, "center_seg0_idx", ucv_int64_new(center_idx)); + center_idx = (center_idx - channel) * 5 + freq_val; + ucv_object_add(ret, "center_freq1", ucv_int64_new(center_idx)); + +out: + return ret; +} + +uc_value_t *uc_wpa_getpid(uc_vm_t *vm, size_t nargs) +{ + return ucv_int64_new(getpid()); +} + +uc_value_t *uc_wpa_sha1(uc_vm_t *vm, size_t nargs) +{ + u8 hash[SHA1_MAC_LEN]; + char hash_hex[2 * ARRAY_SIZE(hash) + 1]; + uc_value_t *val; + size_t *lens; + const u8 **args; + int i; + + if (!nargs) + return NULL; + + args = alloca(nargs * sizeof(*args)); + lens = alloca(nargs * sizeof(*lens)); + for (i = 0; i < nargs; i++) { + val = uc_fn_arg(i); + if (ucv_type(val) != UC_STRING) + return NULL; + + args[i] = ucv_string_get(val); + lens[i] = ucv_string_length(val); + } + + if (sha1_vector(nargs, args, lens, hash)) + return NULL; + + for (i = 0; i < ARRAY_SIZE(hash); i++) + sprintf(hash_hex + 2 * i, "%02x", hash[i]); + + return ucv_string_new_length(hash_hex, 2 * ARRAY_SIZE(hash)); +} + +uc_vm_t *wpa_ucode_create_vm(void) +{ + static uc_parse_config_t config = { + .strict_declarations = true, + .lstrip_blocks = true, + .trim_blocks = true, + .raw_mode = true + }; + + uc_search_path_init(&config.module_search_path); + uc_search_path_add(&config.module_search_path, HOSTAPD_UC_PATH "*.so"); + uc_search_path_add(&config.module_search_path, HOSTAPD_UC_PATH "*.uc"); + + uc_vm_init(&vm, &config); + + uc_stdlib_load(uc_vm_scope_get(&vm)); + eloop_add_uloop(); + gc_timer.cb = uc_gc_timer; + + return &vm; +} + +int wpa_ucode_run(const char *script) +{ + uc_source_t *source; + uc_program_t *prog; + uc_value_t *ops; + char *err; + int ret; + + source = uc_source_new_file(script); + if (!source) + return -1; + + prog = uc_compile(vm.config, source, &err); + uc_source_put(source); + if (!prog) { + wpa_printf(MSG_ERROR, "Error loading ucode: %s\n", err); + return -1; + } + + ret = uc_vm_execute(&vm, prog, &ops); + uc_program_put(prog); + if (ret || !ops) + return -1; + + registry = ucv_array_new(&vm); + uc_vm_registry_set(&vm, "hostap.registry", registry); + ucv_array_set(registry, 0, ucv_get(ops)); + + return 0; +} + +int wpa_ucode_call_prepare(const char *fname) +{ + uc_value_t *obj, *func; + + if (!registry) + return -1; + + obj = ucv_array_get(registry, 0); + if (!obj) + return -1; + + func = ucv_object_get(obj, fname, NULL); + if (!ucv_is_callable(func)) + return -1; + + uc_vm_stack_push(&vm, ucv_get(obj)); + uc_vm_stack_push(&vm, ucv_get(func)); + + return 0; +} + +uc_value_t *wpa_ucode_global_init(const char *name, uc_resource_type_t *global_type) +{ + uc_value_t *global = uc_resource_new(global_type, NULL); + uc_value_t *proto; + + uc_vm_registry_set(&vm, "hostap.global", global); + proto = ucv_prototype_get(global); + ucv_object_add(proto, "data", ucv_get(ucv_object_new(&vm))); + +#define ADD_CONST(x) ucv_object_add(proto, #x, ucv_int64_new(x)) + ADD_CONST(MSG_EXCESSIVE); + ADD_CONST(MSG_MSGDUMP); + ADD_CONST(MSG_DEBUG); + ADD_CONST(MSG_INFO); + ADD_CONST(MSG_WARNING); + ADD_CONST(MSG_ERROR); +#undef ADD_CONST + + ucv_object_add(uc_vm_scope_get(&vm), name, ucv_get(global)); + + return global; +} + +int wpa_ucode_registry_add(uc_value_t *reg, uc_value_t *val) +{ + uc_value_t *data; + int i = 0; + + while (ucv_array_get(reg, i)) + i++; + + ucv_array_set(reg, i, ucv_get(val)); + + return i + 1; +} + +uc_value_t *wpa_ucode_registry_get(uc_value_t *reg, int idx) +{ + if (!idx) + return NULL; + + return ucv_array_get(reg, idx - 1); +} + +uc_value_t *wpa_ucode_registry_remove(uc_value_t *reg, int idx) +{ + uc_value_t *val = wpa_ucode_registry_get(reg, idx); + void **dataptr; + + if (!val) + return NULL; + + ucv_array_set(reg, idx - 1, NULL); + dataptr = ucv_resource_dataptr(val, NULL); + if (dataptr) + *dataptr = NULL; + + return val; +} + + +uc_value_t *wpa_ucode_call(size_t nargs) +{ + if (uc_vm_call(&vm, true, nargs) != EXCEPTION_NONE) + return NULL; + + if (!gc_timer.pending) + uloop_timeout_set(&gc_timer, 10); + + return uc_vm_stack_pop(&vm); +} + +void wpa_ucode_free_vm(void) +{ + if (!vm.config) + return; + + uc_search_path_free(&vm.config->module_search_path); + uc_vm_free(&vm); + registry = NULL; + vm = (uc_vm_t){}; +} diff --git a/package/network/services/hostapd/src/src/utils/ucode.h b/package/network/services/hostapd/src/src/utils/ucode.h new file mode 100644 index 0000000000..2c1886976e --- /dev/null +++ b/package/network/services/hostapd/src/src/utils/ucode.h @@ -0,0 +1,29 @@ +#ifndef __HOSTAPD_UTILS_UCODE_H +#define __HOSTAPD_UTILS_UCODE_H + +#include "utils/includes.h" +#include "utils/common.h" +#include +#include + +#define HOSTAPD_UC_PATH "/usr/share/hostap/" + +extern uc_value_t *uc_registry; +uc_vm_t *wpa_ucode_create_vm(void); +int wpa_ucode_run(const char *script); +int wpa_ucode_call_prepare(const char *fname); +uc_value_t *wpa_ucode_call(size_t nargs); +void wpa_ucode_free_vm(void); + +uc_value_t *wpa_ucode_global_init(const char *name, uc_resource_type_t *global_type); + +int wpa_ucode_registry_add(uc_value_t *reg, uc_value_t *val); +uc_value_t *wpa_ucode_registry_get(uc_value_t *reg, int idx); +uc_value_t *wpa_ucode_registry_remove(uc_value_t *reg, int idx); + +uc_value_t *uc_wpa_printf(uc_vm_t *vm, size_t nargs); +uc_value_t *uc_wpa_getpid(uc_vm_t *vm, size_t nargs); +uc_value_t *uc_wpa_sha1(uc_vm_t *vm, size_t nargs); +uc_value_t *uc_wpa_freq_info(uc_vm_t *vm, size_t nargs); + +#endif diff --git a/package/network/services/hostapd/src/wpa_supplicant/ubus.c b/package/network/services/hostapd/src/wpa_supplicant/ubus.c index 16a68c5073..1c477f0c0c 100644 --- a/package/network/services/hostapd/src/wpa_supplicant/ubus.c +++ b/package/network/services/hostapd/src/wpa_supplicant/ubus.c @@ -30,12 +30,6 @@ static inline struct wpa_supplicant *get_wpas_from_object(struct ubus_object *ob return container_of(obj, struct wpa_supplicant, ubus.obj); } -static void ubus_receive(int sock, void *eloop_ctx, void *sock_ctx) -{ - struct ubus_context *ctx = eloop_ctx; - ubus_handle_event(ctx); -} - static void ubus_reconnect_timeout(void *eloop_data, void *user_ctx) { if (ubus_reconnect(ctx, NULL)) { @@ -43,12 +37,12 @@ static void ubus_reconnect_timeout(void *eloop_data, void *user_ctx) return; } - eloop_register_read_sock(ctx->sock.fd, ubus_receive, ctx, NULL); + ubus_add_uloop(ctx); } static void wpas_ubus_connection_lost(struct ubus_context *ctx) { - eloop_unregister_read_sock(ctx->sock.fd); + uloop_fd_delete(&ctx->sock); eloop_register_timeout(1, 0, ubus_reconnect_timeout, ctx, NULL); } @@ -57,12 +51,14 @@ static bool wpas_ubus_init(void) if (ctx) return true; + eloop_add_uloop(); ctx = ubus_connect(NULL); if (!ctx) return false; ctx->connection_lost = wpas_ubus_connection_lost; - eloop_register_read_sock(ctx->sock.fd, ubus_receive, ctx, NULL); + ubus_add_uloop(ctx); + return true; } @@ -80,7 +76,7 @@ static void wpas_ubus_ref_dec(void) if (ctx_ref) return; - eloop_unregister_read_sock(ctx->sock.fd); + uloop_fd_delete(&ctx->sock); ubus_free(ctx); ctx = NULL; } @@ -211,152 +207,6 @@ void wpas_ubus_free_bss(struct wpa_supplicant *wpa_s) free(name); } -enum { - WPAS_CONFIG_DRIVER, - WPAS_CONFIG_IFACE, - WPAS_CONFIG_BRIDGE, - WPAS_CONFIG_HOSTAPD_CTRL, - WPAS_CONFIG_CTRL, - WPAS_CONFIG_FILE, - __WPAS_CONFIG_MAX -}; - -static const struct blobmsg_policy wpas_config_add_policy[__WPAS_CONFIG_MAX] = { - [WPAS_CONFIG_DRIVER] = { "driver", BLOBMSG_TYPE_STRING }, - [WPAS_CONFIG_IFACE] = { "iface", BLOBMSG_TYPE_STRING }, - [WPAS_CONFIG_BRIDGE] = { "bridge", BLOBMSG_TYPE_STRING }, - [WPAS_CONFIG_HOSTAPD_CTRL] = { "hostapd_ctrl", BLOBMSG_TYPE_STRING }, - [WPAS_CONFIG_CTRL] = { "ctrl", BLOBMSG_TYPE_STRING }, - [WPAS_CONFIG_FILE] = { "config", BLOBMSG_TYPE_STRING }, -}; - -static int -wpas_config_add(struct ubus_context *ctx, struct ubus_object *obj, - struct ubus_request_data *req, const char *method, - struct blob_attr *msg) -{ - struct blob_attr *tb[__WPAS_CONFIG_MAX]; - struct wpa_global *global = get_wpa_global_from_object(obj); - struct wpa_interface *iface; - - blobmsg_parse(wpas_config_add_policy, __WPAS_CONFIG_MAX, tb, blob_data(msg), blob_len(msg)); - - if (!tb[WPAS_CONFIG_FILE] || !tb[WPAS_CONFIG_IFACE] || !tb[WPAS_CONFIG_DRIVER]) - return UBUS_STATUS_INVALID_ARGUMENT; - - iface = os_zalloc(sizeof(struct wpa_interface)); - if (iface == NULL) - return UBUS_STATUS_UNKNOWN_ERROR; - - iface->driver = blobmsg_get_string(tb[WPAS_CONFIG_DRIVER]); - iface->ifname = blobmsg_get_string(tb[WPAS_CONFIG_IFACE]); - iface->confname = blobmsg_get_string(tb[WPAS_CONFIG_FILE]); - - if (tb[WPAS_CONFIG_BRIDGE]) - iface->bridge_ifname = blobmsg_get_string(tb[WPAS_CONFIG_BRIDGE]); - - if (tb[WPAS_CONFIG_CTRL]) - iface->ctrl_interface = blobmsg_get_string(tb[WPAS_CONFIG_CTRL]); - - if (tb[WPAS_CONFIG_HOSTAPD_CTRL]) - iface->hostapd_ctrl = blobmsg_get_string(tb[WPAS_CONFIG_HOSTAPD_CTRL]); - - if (!wpa_supplicant_add_iface(global, iface, NULL)) - return UBUS_STATUS_INVALID_ARGUMENT; - - blob_buf_init(&b, 0); - blobmsg_add_u32(&b, "pid", getpid()); - ubus_send_reply(ctx, req, b.head); - - return UBUS_STATUS_OK; -} - -enum { - WPAS_CONFIG_REM_IFACE, - __WPAS_CONFIG_REM_MAX -}; - -static const struct blobmsg_policy wpas_config_remove_policy[__WPAS_CONFIG_REM_MAX] = { - [WPAS_CONFIG_REM_IFACE] = { "iface", BLOBMSG_TYPE_STRING }, -}; - -static int -wpas_config_remove(struct ubus_context *ctx, struct ubus_object *obj, - struct ubus_request_data *req, const char *method, - struct blob_attr *msg) -{ - struct blob_attr *tb[__WPAS_CONFIG_REM_MAX]; - struct wpa_global *global = get_wpa_global_from_object(obj); - struct wpa_supplicant *wpa_s = NULL; - unsigned int found = 0; - - blobmsg_parse(wpas_config_remove_policy, __WPAS_CONFIG_REM_MAX, tb, blob_data(msg), blob_len(msg)); - - if (!tb[WPAS_CONFIG_REM_IFACE]) - return UBUS_STATUS_INVALID_ARGUMENT; - - /* find wpa_s object for to-be-removed interface */ - for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { - if (!strncmp(wpa_s->ifname, - blobmsg_get_string(tb[WPAS_CONFIG_REM_IFACE]), - sizeof(wpa_s->ifname))) - { - found = 1; - break; - } - } - - if (!found) - return UBUS_STATUS_INVALID_ARGUMENT; - - if (wpa_supplicant_remove_iface(global, wpa_s, 0)) - return UBUS_STATUS_INVALID_ARGUMENT; - - return UBUS_STATUS_OK; -} - -static const struct ubus_method wpas_daemon_methods[] = { - UBUS_METHOD("config_add", wpas_config_add, wpas_config_add_policy), - UBUS_METHOD("config_remove", wpas_config_remove, wpas_config_remove_policy), -}; - -static struct ubus_object_type wpas_daemon_object_type = - UBUS_OBJECT_TYPE("wpa_supplicant", wpas_daemon_methods); - -void wpas_ubus_add(struct wpa_global *global) -{ - struct ubus_object *obj = &global->ubus_global; - int ret; - - if (!wpas_ubus_init()) - return; - - obj->name = strdup("wpa_supplicant"); - - obj->type = &wpas_daemon_object_type; - obj->methods = wpas_daemon_object_type.methods; - obj->n_methods = wpas_daemon_object_type.n_methods; - ret = ubus_add_object(ctx, obj); - wpas_ubus_ref_inc(); -} - -void wpas_ubus_free(struct wpa_global *global) -{ - struct ubus_object *obj = &global->ubus_global; - char *name = (char *) obj->name; - - if (!ctx) - return; - - if (obj->id) { - ubus_remove_object(ctx, obj); - wpas_ubus_ref_dec(); - } - - free(name); -} - - #ifdef CONFIG_WPS void wpas_ubus_notify(struct wpa_supplicant *wpa_s, const struct wps_credential *cred) { diff --git a/package/network/services/hostapd/src/wpa_supplicant/ubus.h b/package/network/services/hostapd/src/wpa_supplicant/ubus.h index bf92b98c01..f6681cb26d 100644 --- a/package/network/services/hostapd/src/wpa_supplicant/ubus.h +++ b/package/network/services/hostapd/src/wpa_supplicant/ubus.h @@ -24,9 +24,6 @@ struct wpas_ubus_bss { void wpas_ubus_add_bss(struct wpa_supplicant *wpa_s); void wpas_ubus_free_bss(struct wpa_supplicant *wpa_s); -void wpas_ubus_add(struct wpa_global *global); -void wpas_ubus_free(struct wpa_global *global); - #ifdef CONFIG_WPS void wpas_ubus_notify(struct wpa_supplicant *wpa_s, const struct wps_credential *cred); #endif @@ -34,14 +31,6 @@ void wpas_ubus_notify(struct wpa_supplicant *wpa_s, const struct wps_credential #else struct wpas_ubus_bss {}; -static inline void wpas_ubus_add_iface(struct wpa_supplicant *wpa_s) -{ -} - -static inline void wpas_ubus_free_iface(struct wpa_supplicant *wpa_s) -{ -} - static inline void wpas_ubus_add_bss(struct wpa_supplicant *wpa_s) { } diff --git a/package/network/services/hostapd/src/wpa_supplicant/ucode.c b/package/network/services/hostapd/src/wpa_supplicant/ucode.c new file mode 100644 index 0000000000..6cba73dcd5 --- /dev/null +++ b/package/network/services/hostapd/src/wpa_supplicant/ucode.c @@ -0,0 +1,298 @@ +#include "utils/includes.h" +#include "utils/common.h" +#include "utils/ucode.h" +#include "drivers/driver.h" +#include "ap/hostapd.h" +#include "wpa_supplicant_i.h" +#include "wps_supplicant.h" +#include "bss.h" +#include "ucode.h" + +static struct wpa_global *wpa_global; +static uc_resource_type_t *global_type, *iface_type; +static uc_value_t *global, *iface_registry; +static uc_vm_t *vm; + +static uc_value_t * +wpas_ucode_iface_get_uval(struct wpa_supplicant *wpa_s) +{ + uc_value_t *val; + + if (wpa_s->ucode.idx) + return wpa_ucode_registry_get(iface_registry, wpa_s->ucode.idx); + + val = uc_resource_new(iface_type, wpa_s); + wpa_s->ucode.idx = wpa_ucode_registry_add(iface_registry, val); + + return val; +} + +static void +wpas_ucode_update_interfaces(void) +{ + uc_value_t *ifs = ucv_object_new(vm); + struct wpa_supplicant *wpa_s; + int i; + + for (wpa_s = wpa_global->ifaces; wpa_s; wpa_s = wpa_s->next) + ucv_object_add(ifs, wpa_s->ifname, ucv_get(wpas_ucode_iface_get_uval(wpa_s))); + + ucv_object_add(ucv_prototype_get(global), "interfaces", ucv_get(ifs)); + ucv_gc(vm); +} + +void wpas_ucode_add_bss(struct wpa_supplicant *wpa_s) +{ + uc_value_t *val; + + if (wpa_ucode_call_prepare("iface_add")) + return; + + uc_value_push(ucv_get(ucv_string_new(wpa_s->ifname))); + uc_value_push(ucv_get(wpas_ucode_iface_get_uval(wpa_s))); + ucv_put(wpa_ucode_call(2)); + ucv_gc(vm); +} + +void wpas_ucode_free_bss(struct wpa_supplicant *wpa_s) +{ + uc_value_t *val; + + val = wpa_ucode_registry_remove(iface_registry, wpa_s->ucode.idx); + if (!val) + return; + + wpa_s->ucode.idx = 0; + if (wpa_ucode_call_prepare("iface_remove")) + return; + + uc_value_push(ucv_get(ucv_string_new(wpa_s->ifname))); + uc_value_push(ucv_get(val)); + ucv_put(wpa_ucode_call(2)); + ucv_gc(vm); +} + +void wpas_ucode_update_state(struct wpa_supplicant *wpa_s) +{ + const char *state; + uc_value_t *val; + + val = wpa_ucode_registry_get(iface_registry, wpa_s->ucode.idx); + if (!val) + return; + + if (wpa_ucode_call_prepare("state")) + return; + + state = wpa_supplicant_state_txt(wpa_s->wpa_state); + uc_value_push(ucv_get(ucv_string_new(wpa_s->ifname))); + uc_value_push(ucv_get(val)); + uc_value_push(ucv_get(ucv_string_new(state))); + ucv_put(wpa_ucode_call(3)); + ucv_gc(vm); +} + +void wpas_ucode_event(struct wpa_supplicant *wpa_s, int event, union wpa_event_data *data) +{ + const char *state; + uc_value_t *val; + + if (event != EVENT_CH_SWITCH_STARTED) + return; + + val = wpa_ucode_registry_get(iface_registry, wpa_s->ucode.idx); + if (!val) + return; + + if (wpa_ucode_call_prepare("event")) + return; + + uc_value_push(ucv_get(ucv_string_new(wpa_s->ifname))); + uc_value_push(ucv_get(val)); + uc_value_push(ucv_get(ucv_string_new(event_to_string(event)))); + val = ucv_object_new(vm); + uc_value_push(ucv_get(val)); + + if (event == EVENT_CH_SWITCH_STARTED) { + ucv_object_add(val, "csa_count", ucv_int64_new(data->ch_switch.count)); + ucv_object_add(val, "frequency", ucv_int64_new(data->ch_switch.freq)); + ucv_object_add(val, "sec_chan_offset", ucv_int64_new(data->ch_switch.ch_offset)); + ucv_object_add(val, "center_freq1", ucv_int64_new(data->ch_switch.cf1)); + ucv_object_add(val, "center_freq2", ucv_int64_new(data->ch_switch.cf2)); + } + + ucv_put(wpa_ucode_call(4)); + ucv_gc(vm); +} + +static const char *obj_stringval(uc_value_t *obj, const char *name) +{ + uc_value_t *val = ucv_object_get(obj, name, NULL); + + return ucv_string_get(val); +} + +static uc_value_t * +uc_wpas_add_iface(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *info = uc_fn_arg(0); + uc_value_t *driver = ucv_object_get(info, "driver", NULL); + uc_value_t *ifname = ucv_object_get(info, "iface", NULL); + uc_value_t *bridge = ucv_object_get(info, "bridge", NULL); + uc_value_t *config = ucv_object_get(info, "config", NULL); + uc_value_t *ctrl = ucv_object_get(info, "ctrl", NULL); + struct wpa_interface iface; + int ret = -1; + + if (ucv_type(info) != UC_OBJECT) + goto out; + + iface = (struct wpa_interface){ + .driver = "nl80211", + .ifname = ucv_string_get(ifname), + .bridge_ifname = ucv_string_get(bridge), + .confname = ucv_string_get(config), + .ctrl_interface = ucv_string_get(ctrl), + }; + + if (driver) { + const char *drvname; + if (ucv_type(driver) != UC_STRING) + goto out; + + iface.driver = NULL; + drvname = ucv_string_get(driver); + for (int i = 0; wpa_drivers[i]; i++) { + if (!strcmp(drvname, wpa_drivers[i]->name)) + iface.driver = wpa_drivers[i]->name; + } + + if (!iface.driver) + goto out; + } + + if (!iface.ifname || !iface.confname) + goto out; + + ret = wpa_supplicant_add_iface(wpa_global, &iface, 0) ? 0 : -1; + wpas_ucode_update_interfaces(); + +out: + return ucv_int64_new(ret); +} + +static uc_value_t * +uc_wpas_remove_iface(uc_vm_t *vm, size_t nargs) +{ + struct wpa_supplicant *wpa_s = NULL; + uc_value_t *ifname_arg = uc_fn_arg(0); + const char *ifname = ucv_string_get(ifname_arg); + int ret = -1; + + if (!ifname) + goto out; + + for (wpa_s = wpa_global->ifaces; wpa_s; wpa_s = wpa_s->next) + if (!strcmp(wpa_s->ifname, ifname)) + break; + + if (!wpa_s) + goto out; + + ret = wpa_supplicant_remove_iface(wpa_global, wpa_s, 0); + wpas_ucode_update_interfaces(); + +out: + return ucv_int64_new(ret); +} + +static uc_value_t * +uc_wpas_iface_status(uc_vm_t *vm, size_t nargs) +{ + struct wpa_supplicant *wpa_s = uc_fn_thisval("wpas.iface"); + struct wpa_bss *bss; + uc_value_t *ret, *val; + + if (!wpa_s) + return NULL; + + ret = ucv_object_new(vm); + + val = ucv_string_new(wpa_supplicant_state_txt(wpa_s->wpa_state)); + ucv_object_add(ret, "state", ucv_get(val)); + + bss = wpa_s->current_bss; + if (bss) { + int sec_chan = 0; + const u8 *ie; + + ie = wpa_bss_get_ie(bss, WLAN_EID_HT_OPERATION); + if (ie && ie[1] >= 2) { + const struct ieee80211_ht_operation *ht_oper; + int sec; + + ht_oper = (const void *) (ie + 2); + sec = ht_oper->ht_param & HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK; + if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE) + sec_chan = 1; + else if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW) + sec_chan = -1; + } + + ucv_object_add(ret, "sec_chan_offset", ucv_int64_new(sec_chan)); + ucv_object_add(ret, "frequency", ucv_int64_new(bss->freq)); + } + +#ifdef CONFIG_MESH + if (wpa_s->ifmsh) { + struct hostapd_iface *ifmsh = wpa_s->ifmsh; + + ucv_object_add(ret, "sec_chan_offset", ucv_int64_new(ifmsh->conf->secondary_channel)); + ucv_object_add(ret, "frequency", ucv_int64_new(ifmsh->freq)); + } +#endif + + return ret; +} + +int wpas_ucode_init(struct wpa_global *gl) +{ + static const uc_function_list_t global_fns[] = { + { "printf", uc_wpa_printf }, + { "getpid", uc_wpa_getpid }, + { "add_iface", uc_wpas_add_iface }, + { "remove_iface", uc_wpas_remove_iface }, + }; + static const uc_function_list_t iface_fns[] = { + { "status", uc_wpas_iface_status }, + }; + uc_value_t *data, *proto; + + wpa_global = gl; + vm = wpa_ucode_create_vm(); + + global_type = uc_type_declare(vm, "wpas.global", global_fns, NULL); + iface_type = uc_type_declare(vm, "wpas.iface", iface_fns, NULL); + + iface_registry = ucv_array_new(vm); + uc_vm_registry_set(vm, "wpas.iface_registry", iface_registry); + + global = wpa_ucode_global_init("wpas", global_type); + + if (wpa_ucode_run(HOSTAPD_UC_PATH "wpa_supplicant.uc")) + goto free_vm; + + ucv_gc(vm); + return 0; + +free_vm: + wpa_ucode_free_vm(); + return -1; +} + +void wpas_ucode_free(void) +{ + if (wpa_ucode_call_prepare("shutdown") == 0) + ucv_put(wpa_ucode_call(0)); + wpa_ucode_free_vm(); +} diff --git a/package/network/services/hostapd/src/wpa_supplicant/ucode.h b/package/network/services/hostapd/src/wpa_supplicant/ucode.h new file mode 100644 index 0000000000..a429a0ed87 --- /dev/null +++ b/package/network/services/hostapd/src/wpa_supplicant/ucode.h @@ -0,0 +1,49 @@ +#ifndef __WPAS_UCODE_H +#define __WPAS_UCODE_H + +#include "utils/ucode.h" + +struct wpa_global; +union wpa_event_data; +struct wpa_supplicant; + +struct wpas_ucode_bss { +#ifdef UCODE_SUPPORT + unsigned int idx; +#endif +}; + +#ifdef UCODE_SUPPORT +int wpas_ucode_init(struct wpa_global *gl); +void wpas_ucode_free(void); +void wpas_ucode_add_bss(struct wpa_supplicant *wpa_s); +void wpas_ucode_free_bss(struct wpa_supplicant *wpa_s); +void wpas_ucode_update_state(struct wpa_supplicant *wpa_s); +void wpas_ucode_event(struct wpa_supplicant *wpa_s, int event, union wpa_event_data *data); +#else +static inline int wpas_ucode_init(struct wpa_global *gl) +{ + return -EINVAL; +} +static inline void wpas_ucode_free(void) +{ +} +static inline void wpas_ucode_add_bss(struct wpa_supplicant *wpa_s) +{ +} + +static inline void wpas_ucode_free_bss(struct wpa_supplicant *wpa_s) +{ +} + +static inline void wpas_ucode_update_state(struct wpa_supplicant *wpa_s) +{ +} + +static inline void wpas_ucode_event(struct wpa_supplicant *wpa_s, int event, union wpa_event_data *data) +{ +} + +#endif + +#endif diff --git a/package/network/services/ipset-dns/Makefile b/package/network/services/ipset-dns/Makefile index 3f21d04c47..f55281ef42 100644 --- a/package/network/services/ipset-dns/Makefile +++ b/package/network/services/ipset-dns/Makefile @@ -11,7 +11,7 @@ PKG_NAME:=ipset-dns PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL:=http://git.zx2c4.com/ipset-dns +PKG_SOURCE_URL:=https://git.zx2c4.com/ipset-dns PKG_SOURCE_DATE:=2017-10-08 PKG_SOURCE_VERSION:=ade2cf88e933f4f90451e0a6171f0aa4a523f989 PKG_MIRROR_HASH:=34ad1f5c7d2eab90b795f2a512102891428216e3d439d918a8992846550e9697 diff --git a/package/network/services/lldpd/Makefile b/package/network/services/lldpd/Makefile index 8eb7e35716..289adc55c9 100644 --- a/package/network/services/lldpd/Makefile +++ b/package/network/services/lldpd/Makefile @@ -8,18 +8,20 @@ include $(TOPDIR)/rules.mk PKG_NAME:=lldpd -PKG_VERSION:=1.0.13 -PKG_RELEASE:=3 +PKG_VERSION:=1.0.17 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://media.luffy.cx/files/lldpd -PKG_HASH:=d639827fd8a27720d1bfd94bc52eca24af63ddcc3c9d2da60788778889d84701 +PKG_SOURCE_URL:=https://github.com/lldpd/lldpd/releases/download/$(PKG_VERSION)/ +PKG_HASH:=89ae691a4917ac9e0ec3b8b2c1e634cc402d43b804f98850c73bd1c7df380882 PKG_MAINTAINER:=Stijn Tintel PKG_LICENSE:=ISC +PKG_CPE_ID:=cpe:/a:lldpd_project:lldpd PKG_FIXUP:=autoreconf PKG_BUILD_PARALLEL:=1 +PKG_BUILD_FLAGS:=lto PKG_INSTALL:=1 include $(INCLUDE_DIR)/package.mk @@ -110,7 +112,6 @@ CONFIGURE_ARGS += \ $(if $(CONFIG_LLDPD_WITH_SNMP),--with-snmp,) \ $(if $(CONFIG_USE_GLIBC),,--without-libbsd) -TARGET_CFLAGS += -flto -TARGET_LDFLAGS += -flto -Wl,--gc-sections,--as-needed +TARGET_LDFLAGS += -Wl,--gc-sections,--as-needed $(eval $(call BuildPackage,lldpd)) diff --git a/package/network/utils/modemmanager/Config.in b/package/network/services/modemmanager/Config.in similarity index 100% rename from package/network/utils/modemmanager/Config.in rename to package/network/services/modemmanager/Config.in diff --git a/package/network/services/modemmanager/Makefile b/package/network/services/modemmanager/Makefile new file mode 100644 index 0000000000..5017d3e259 --- /dev/null +++ b/package/network/services/modemmanager/Makefile @@ -0,0 +1,140 @@ +# +# Copyright (C) 2016 Velocloud Inc. +# Copyright (C) 2016 Aleksander Morgado +# +# This is free software, licensed under the GNU General Public License v2. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=modemmanager +PKG_SOURCE_VERSION:=1.20.6 +PKG_RELEASE:=12 + +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://gitlab.freedesktop.org/mobile-broadband/ModemManager.git +PKG_MIRROR_HASH:=e90103e2e42bb826bbbac83937a9a69f50348cd6ce0d8da655a12b65494ce7c9 + +PKG_MAINTAINER:=Nicholas Smith +PKG_LICENSE:=GPL-2.0-or-later +PKG_LICENSE_FILES:=COPYING + +PKG_BUILD_DEPENDS:=glib2/host libxslt/host +PKG_BUILD_FLAGS:=gc-sections + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/nls.mk +include $(INCLUDE_DIR)/meson.mk + +TARGET_CFLAGS += -fno-merge-all-constants -fmerge-constants + +define Package/modemmanager/config + source "$(SOURCE)/Config.in" +endef + +define Package/modemmanager + SECTION:=net + CATEGORY:=Network + TITLE:=Control utility for any kind of mobile broadband modem + URL:=https://www.freedesktop.org/wiki/Software/ModemManager + DEPENDS:= \ + $(INTL_DEPENDS) \ + +glib2 \ + +dbus \ + +ppp \ + +MODEMMANAGER_WITH_MBIM:libmbim \ + +MODEMMANAGER_WITH_QMI:libqmi \ + +MODEMMANAGER_WITH_QRTR:libqrtr-glib +endef + +define Package/modemmanager/description + ModemManager is a D-Bus-activated service which allows controlling mobile + broadband modems. Add kernel modules for your modems as needed. + Select Utilities/usb-modeswitch if needed. +endef + +MESON_ARGS += \ + -Dudev=false \ + -Dudevdir=/lib/udev \ + -Dtests=false \ + -Dsystemdsystemunitdir=no \ + -Dsystemd_suspend_resume=false \ + -Dsystemd_journal=false \ + -Dpolkit=no \ + -Dintrospection=false \ + -Dman=false \ + -Dbash_completion=false \ + -Db_lto=true \ + -Dmbim=$(if $(CONFIG_MODEMMANAGER_WITH_MBIM),true,false) \ + -Dqmi=$(if $(CONFIG_MODEMMANAGER_WITH_QMI),true,false) \ + -Dqrtr=$(if $(CONFIG_MODEMMANAGER_WITH_QRTR),true,false) \ + -Dat_command_via_dbus=$(if $(CONFIG_MODEMMANAGER_WITH_AT_COMMAND_VIA_DBUS),true,false) + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include/ModemManager + $(CP) $(PKG_INSTALL_DIR)/usr/include/ModemManager/*.h $(1)/usr/include/ModemManager + $(INSTALL_DIR) $(1)/usr/include/libmm-glib + $(CP) $(PKG_INSTALL_DIR)/usr/include/libmm-glib/*.h $(1)/usr/include/libmm-glib + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmm-glib.so* $(1)/usr/lib + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/ModemManager.pc $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/mm-glib.pc $(1)/usr/lib/pkgconfig + $(INSTALL_DIR) $(1)/usr/share/dbus-1/interfaces + $(CP) $(PKG_BUILD_DIR)/introspection/org.freedesktop.ModemManager1.* $(1)/usr/share/dbus-1/interfaces +endef + +define Package/modemmanager/install + $(INSTALL_DIR) $(1)/lib/udev/rules.d + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/lib/udev/rules.d/*.rules $(1)/lib/udev/rules.d + + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ModemManager $(1)/usr/sbin + $(INSTALL_BIN) ./files/usr/sbin/ModemManager-wrapper $(1)/usr/sbin + + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mmcli $(1)/usr/bin + + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmm-glib.so.* $(1)/usr/lib + + $(INSTALL_DIR) $(1)/usr/lib/ModemManager + $(CP) $(PKG_INSTALL_DIR)/usr/lib/ModemManager/libmm-shared-*.so* $(1)/usr/lib/ModemManager + $(CP) $(PKG_INSTALL_DIR)/usr/lib/ModemManager/libmm-plugin-*.so* $(1)/usr/lib/ModemManager + + $(INSTALL_DIR) $(1)/usr/lib/ModemManager/connection.d + $(INSTALL_BIN) ./files/10-report-down $(1)/usr/lib/ModemManager/connection.d + + $(INSTALL_DIR) $(1)/etc/dbus-1/system.d + $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/dbus-1/system.d/org.freedesktop.ModemManager1.conf $(1)/etc/dbus-1/system.d + + $(INSTALL_DIR) $(1)/usr/share/dbus-1/system-services + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/dbus-1/system-services/org.freedesktop.ModemManager1.service $(1)/usr/share/dbus-1/system-services + + $(INSTALL_DIR) $(1)/usr/share/ModemManager + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/ModemManager/*.conf $(1)/usr/share/ModemManager + $(INSTALL_DATA) ./files/modemmanager.common $(1)/usr/share/ModemManager + + $(INSTALL_DIR) $(1)/usr/share/ModemManager/fcc-unlock.available.d + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/ModemManager/fcc-unlock.available.d/* $(1)/usr/share/ModemManager/fcc-unlock.available.d + + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/modemmanager.init $(1)/etc/init.d/modemmanager + + $(INSTALL_DIR) $(1)/etc/hotplug.d/usb + $(INSTALL_DATA) ./files/25-modemmanager-usb $(1)/etc/hotplug.d/usb + + $(INSTALL_DIR) $(1)/etc/hotplug.d/net + $(INSTALL_DATA) ./files/25-modemmanager-net $(1)/etc/hotplug.d/net + + $(INSTALL_DIR) $(1)/etc/hotplug.d/tty + $(INSTALL_DATA) ./files/25-modemmanager-tty $(1)/etc/hotplug.d/tty + + $(INSTALL_DIR) $(1)/etc/hotplug.d/wwan + $(INSTALL_DATA) ./files/25-modemmanager-wwan $(1)/etc/hotplug.d/wwan + + $(INSTALL_DIR) $(1)/lib/netifd/proto + $(INSTALL_BIN) ./files/modemmanager.proto $(1)/lib/netifd/proto/modemmanager.sh +endef + +$(eval $(call BuildPackage,modemmanager)) diff --git a/package/network/services/modemmanager/README.md b/package/network/services/modemmanager/README.md new file mode 100644 index 0000000000..93a7f9b091 --- /dev/null +++ b/package/network/services/modemmanager/README.md @@ -0,0 +1,44 @@ +# OpenWrt ModemManager + +## Description + +Cellular modem control and connectivity + +Optional libraries libmbim and libqmi are available. +Your modem may require additional kernel modules and/or the usb-modeswitch +package. + +## Usage + +Once installed, you can configure the 2G/3G/4G modem connections directly in +/etc/config/network as in the following example: + + config interface 'broadband' + option device '/sys/devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2.1' + option proto 'modemmanager' + option apn 'ac.vodafone.es' + option allowedauth 'pap chap' + option username 'vodafone' + option password 'vodafone' + option pincode '7423' + option iptype 'ipv4' + option plmn '214001' + option lowpower '1' + option signalrate '30' + option allow_roaming '1' + +Only 'device' and 'proto' are mandatory options, the remaining ones are all +optional. + +The 'allowedauth' option allows limiting the list of authentication protocols. +It is given as a space-separated list of values, including any of the +following: 'pap', 'chap', 'mschap', 'mschapv2' or 'eap'. It will default to +allowing all protocols. + +The 'iptype' option supports any of these values: 'ipv4', 'ipv6' or 'ipv4v6'. +It will default to 'ipv4' if not given. + +The 'plmn' option allows to set the network operator MCCMNC. + +The 'signalrate' option set's the signal refresh rate (in seconds) for the device. +You can call signal info with command: mmcli -m 0 --signal-get diff --git a/package/network/services/modemmanager/files/10-report-down b/package/network/services/modemmanager/files/10-report-down new file mode 100755 index 0000000000..a3e5fb4ba7 --- /dev/null +++ b/package/network/services/modemmanager/files/10-report-down @@ -0,0 +1,35 @@ +#!/bin/sh + +# SPDX-License-Identifier: CC0-1.0 +# 2022 Aleksander Morgado +# +# Automatically report to netifd that the underlying modem +# is really disconnected +# +# require program name and at least 4 arguments +[ $# -lt 4 ] && exit 1 + +MODEM_PATH="$1" +BEARER_PATH="$2" +INTERFACE="$3" +STATE="$4" + +[ "${STATE}" = "disconnected" ] || exit 0 + +. /usr/share/ModemManager/modemmanager.common +. /lib/netifd/netifd-proto.sh +INCLUDE_ONLY=1 . /lib/netifd/proto/modemmanager.sh + +MODEM_STATUS=$(mmcli --modem="${MODEM_PATH}" --output-keyvalue) +[ -n "${MODEM_STATUS}" ] || exit 1 + +MODEM_DEVICE=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.device") +[ -n "${MODEM_DEVICE}" ] || exit 2 + +CFG=$(mm_get_modem_config "${MODEM_DEVICE}") +[ -n "${CFG}" ] || exit 3 + +logger -t "modemmanager" "interface ${CFG} (network device ${INTERFACE}) ${STATE}" +proto_init_update $INTERFACE 0 +proto_send_update $CFG +exit 0 diff --git a/package/network/services/modemmanager/files/25-modemmanager-net b/package/network/services/modemmanager/files/25-modemmanager-net new file mode 100644 index 0000000000..ff46420190 --- /dev/null +++ b/package/network/services/modemmanager/files/25-modemmanager-net @@ -0,0 +1,31 @@ +#!/bin/sh +# Copyright (C) 2016 Velocloud Inc +# Copyright (C) 2016 Aleksander Morgado + +# Load common utilities +. /usr/share/ModemManager/modemmanager.common + +# We require a interface name +[ -n "${INTERFACE}" ] || exit + +# Always make sure the rundir exists +mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" + +# Report network interface +mm_log "info" "${ACTION} network interface ${INTERFACE}: event processed" +mm_report_event "${ACTION}" "${INTERFACE}" "net" "/sys${DEVPATH}" + +# Look for an associated cdc-wdm interface + +cdcwdm="" + +case "${ACTION}" in + "add") cdcwdm=$(mm_track_cdcwdm "${INTERFACE}") ;; + "remove") cdcwdm=$(mm_untrack_cdcwdm "${INTERFACE}") ;; +esac + +# Report cdc-wdm device, if any +[ -n "${cdcwdm}" ] && { + mm_log "info" "${ACTION} cdc interface ${cdcwdm}: custom event processed" + mm_report_event "${ACTION}" "${cdcwdm}" "usbmisc" "/sys${DEVPATH}" +} diff --git a/package/network/services/modemmanager/files/25-modemmanager-tty b/package/network/services/modemmanager/files/25-modemmanager-tty new file mode 100644 index 0000000000..5d1042cdd2 --- /dev/null +++ b/package/network/services/modemmanager/files/25-modemmanager-tty @@ -0,0 +1,16 @@ +#!/bin/sh +# Copyright (C) 2016 Velocloud Inc +# Copyright (C) 2016 Aleksander Morgado + +# Load hotplug common utilities +. /usr/share/ModemManager/modemmanager.common + +# We require a device name +[ -n "$DEVNAME" ] || exit + +# Always make sure the rundir exists +mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" + +# Report TTY +mm_log "info" "${ACTION} serial interface ${DEVNAME}: event processed" +mm_report_event "${ACTION}" "${DEVNAME}" "tty" "/sys${DEVPATH}" diff --git a/package/network/utils/modemmanager/files/25-modemmanager-usb b/package/network/services/modemmanager/files/25-modemmanager-usb similarity index 100% rename from package/network/utils/modemmanager/files/25-modemmanager-usb rename to package/network/services/modemmanager/files/25-modemmanager-usb diff --git a/package/network/services/modemmanager/files/25-modemmanager-wwan b/package/network/services/modemmanager/files/25-modemmanager-wwan new file mode 100644 index 0000000000..b36ade4780 --- /dev/null +++ b/package/network/services/modemmanager/files/25-modemmanager-wwan @@ -0,0 +1,15 @@ +#!/bin/sh +# Copyright (C) 2021 Aleksander Morgado + +# Load hotplug common utilities +. /usr/share/ModemManager/modemmanager.common + +# We require a device name +[ -n "$DEVNAME" ] || exit + +# Always make sure the rundir exists +mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" + +# Report wwan +mm_log "info" "${ACTION} wwan control port ${DEVNAME}: event processed" +mm_report_event "${ACTION}" "${DEVNAME}" "wwan" "/sys${DEVPATH}" diff --git a/package/network/services/modemmanager/files/modemmanager.common b/package/network/services/modemmanager/files/modemmanager.common new file mode 100644 index 0000000000..a931717fd7 --- /dev/null +++ b/package/network/services/modemmanager/files/modemmanager.common @@ -0,0 +1,350 @@ +#!/bin/sh +# Copyright (C) 2016 Velocloud Inc +# Copyright (C) 2016 Aleksander Morgado + +################################################################################ + +. /lib/functions.sh +. /lib/netifd/netifd-proto.sh + +################################################################################ +# Runtime state + +MODEMMANAGER_RUNDIR="/var/run/modemmanager" +MODEMMANAGER_PID_FILE="${MODEMMANAGER_RUNDIR}/modemmanager.pid" +MODEMMANAGER_CDCWDM_CACHE="${MODEMMANAGER_RUNDIR}/cdcwdm.cache" +MODEMMANAGER_SYSFS_CACHE="${MODEMMANAGER_RUNDIR}/sysfs.cache" +MODEMMANAGER_EVENTS_CACHE="${MODEMMANAGER_RUNDIR}/events.cache" + +################################################################################ +# Common logging + +mm_log() { + local level="$1"; shift + logger -p "daemon.${level}" -t "ModemManager[$$]" "hotplug: $*" +} + +################################################################################ +# Receives as input argument the full sysfs path of the device +# Returns the physical device sysfs path +# +# NOTE: this method only works when the device exists, i.e. it cannot be used +# on removal hotplug events + +mm_find_physdev_sysfs_path() { + local tmp_path="$1" + + while true; do + tmp_path=$(dirname "${tmp_path}") + + # avoid infinite loops iterating + [ -z "${tmp_path}" ] || [ "${tmp_path}" = "/" ] && return + + # For USB devices, the physical device will be that with a idVendor + # and idProduct pair of files + [ -f "${tmp_path}"/idVendor ] && [ -f "${tmp_path}"/idProduct ] && { + tmp_path=$(readlink -f "$tmp_path") + echo "${tmp_path}" + return + } + + # For PCI devices, the physical device will be that with a vendor + # and device pair of files + [ -f "${tmp_path}"/vendor ] && [ -f "${tmp_path}"/device ] && { + tmp_path=$(readlink -f "$tmp_path") + echo "${tmp_path}" + return + } + done +} + +################################################################################ + +# Returns the cdc-wdm name retrieved from sysfs +mm_track_cdcwdm() { + local wwan="$1" + local cdcwdm + + cdcwdm=$(ls "/sys/class/net/${wwan}/device/usbmisc/") + [ -n "${cdcwdm}" ] || return + + # We have to cache it for later, as we won't be able to get the + # associated cdc-wdm device on a remove event + echo "${wwan} ${cdcwdm}" >> "${MODEMMANAGER_CDCWDM_CACHE}" + + echo "${cdcwdm}" +} + +# Returns the cdc-wdm name retrieved from the cache +mm_untrack_cdcwdm() { + local wwan="$1" + local cdcwdm + + # Look for the cached associated cdc-wdm device + [ -f "${MODEMMANAGER_CDCWDM_CACHE}" ] || return + + cdcwdm=$(awk -v wwan="${wwan}" '!/^#/ && $0 ~ wwan { print $2 }' "${MODEMMANAGER_CDCWDM_CACHE}") + [ -n "${cdcwdm}" ] || return + + # Remove from cache + sed -i "/${wwan} ${cdcwdm}/d" "${MODEMMANAGER_CDCWDM_CACHE}" + + echo "${cdcwdm}" +} + +################################################################################ +# ModemManager needs some time from the ports being added until a modem object +# is exposed in DBus. With the logic here we do an explicit wait of N seconds +# for ModemManager to expose the new modem object, making sure that the wait is +# unique per device (i.e. per physical device sysfs path). + +# Gets the modem wait status as retrieved from the cache +mm_get_modem_wait_status() { + local sysfspath="$1" + + # If no sysfs cache file, we're done + [ -f "${MODEMMANAGER_SYSFS_CACHE}" ] || return + + # Get status of the sysfs path + awk -v sysfspath="${sysfspath}" '!/^#/ && $0 ~ sysfspath { print $2 }' "${MODEMMANAGER_SYSFS_CACHE}" +} + +# Clear the modem wait status from the cache, if any +mm_clear_modem_wait_status() { + local sysfspath="$1" + + local escaped_sysfspath + + [ -f "${MODEMMANAGER_SYSFS_CACHE}" ] && { + # escape '/', '\' and '&' for sed... + escaped_sysfspath=$(echo "$sysfspath" | sed -e 's/[\/&]/\\&/g') + sed -i "/${escaped_sysfspath}/d" "${MODEMMANAGER_SYSFS_CACHE}" + } +} + +# Sets the modem wait status in the cache +mm_set_modem_wait_status() { + local sysfspath="$1" + local status="$2" + + # Remove sysfs line before adding the new one with the new state + mm_clear_modem_wait_status "${sysfspath}" + + # Add the new status + echo "${sysfspath} ${status}" >> "${MODEMMANAGER_SYSFS_CACHE}" +} + +# Callback for config_foreach() +mm_get_modem_config_foreach_cb() { + local cfg="$1" + local sysfspath="$2" + + local proto + config_get proto "${cfg}" proto + [ "${proto}" = modemmanager ] || return 0 + + local dev + dev=$(uci_get network "${cfg}" device) + [ "${dev}" = "${sysfspath}" ] || return 0 + + echo "${cfg}" +} + +# Returns the name of the interface configured for this device +mm_get_modem_config() { + local sysfspath="$1" + + # Look for configuration for the given sysfs path + config_load network + config_foreach mm_get_modem_config_foreach_cb interface "${sysfspath}" +} + +# Wait for a modem in the specified sysfspath +mm_wait_for_modem() { + local cfg="$1" + local sysfspath="$2" + + # TODO: config max wait + local n=45 + local step=5 + + while [ $n -ge 0 ]; do + [ -d "${sysfspath}" ] || { + mm_log "error" "ignoring modem detection request: no device at ${sysfspath}" + proto_set_available "${cfg}" 0 + return 1 + } + + # Check if the modem exists at the given sysfs path + if ! mmcli -m "${sysfspath}" > /dev/null 2>&1 + then + mm_log "error" "modem not detected at sysfs path" + else + mm_log "info" "modem exported successfully at ${sysfspath}" + mm_log "info" "setting interface '${cfg}' as available" + proto_set_available "${cfg}" 1 + return 0 + fi + + sleep $step + n=$((n-step)) + done + + mm_log "error" "timed out waiting for the modem to get exported at ${sysfspath}" + proto_set_available "${cfg}" 0 + return 2 +} + +mm_report_modem_wait() { + local sysfspath=$1 + + local parent_sysfspath status + + parent_sysfspath=$(mm_find_physdev_sysfs_path "$sysfspath") + [ -n "${parent_sysfspath}" ] || { + mm_log "error" "parent device sysfspath not found" + return + } + + status=$(mm_get_modem_wait_status "${parent_sysfspath}") + case "${status}" in + "") + local cfg + + cfg=$(mm_get_modem_config "${parent_sysfspath}") + if [ -n "${cfg}" ]; then + mm_log "info" "interface '${cfg}' is set to configure device '${parent_sysfspath}'" + mm_log "info" "now waiting for modem at sysfs path ${parent_sysfspath}" + mm_set_modem_wait_status "${parent_sysfspath}" "processed" + # Launch subshell for the explicit wait + ( mm_wait_for_modem "${cfg}" "${parent_sysfspath}" ) > /dev/null 2>&1 & + else + mm_log "info" "no need to wait for modem at sysfs path ${parent_sysfspath}" + mm_set_modem_wait_status "${parent_sysfspath}" "ignored" + fi + ;; + "processed") + mm_log "info" "already waiting for modem at sysfs path ${parent_sysfspath}" + ;; + "ignored") + ;; + *) + mm_log "error" "unknown status read for device at sysfs path ${parent_sysfspath}" + ;; + esac +} + +################################################################################ +# Cleanup interfaces + +mm_cleanup_interface_cb() { + local cfg="$1" + + local proto + config_get proto "${cfg}" proto + [ "${proto}" = modemmanager ] || return 0 + + proto_set_available "${cfg}" 0 +} + +mm_cleanup_interfaces() { + config_load network + config_foreach mm_cleanup_interface_cb interface +} + +mm_cleanup_interface_by_sysfspath() { + local dev="$1" + + local cfg + cfg=$(mm_get_modem_config "$dev") + [ -n "${cfg}" ] || return + + mm_log "info" "setting interface '$cfg' as unavailable" + proto_set_available "${cfg}" 0 +} + +################################################################################ +# Event reporting + +# Receives as input the action, the device name and the subsystem +mm_report_event() { + local action="$1" + local name="$2" + local subsystem="$3" + local sysfspath="$4" + + # Do not save virtual devices + local virtual + virtual="$(echo "$sysfspath" | cut -d'/' -f4)" + [ "$virtual" = "virtual" ] && { + mm_log "debug" "sysfspath is a virtual device ($sysfspath)" + return + } + + # Track/untrack events in cache + case "${action}" in + "add") + # On add events, store event details in cache (if not exists yet) + grep -qs "${name},${subsystem}" "${MODEMMANAGER_EVENTS_CACHE}" || \ + echo "${action},${name},${subsystem},${sysfspath}" >> "${MODEMMANAGER_EVENTS_CACHE}" + ;; + "remove") + # On remove events, remove old events from cache (match by subsystem+name) + sed -i "/${name},${subsystem}/d" "${MODEMMANAGER_EVENTS_CACHE}" + ;; + esac + + # Report the event + mm_log "debug" "event reported: action=${action}, name=${name}, subsystem=${subsystem}" + mmcli --report-kernel-event="action=${action},name=${name},subsystem=${subsystem}" 1>/dev/null 2>&1 & + + # Wait for added modem if a sysfspath is given + [ -n "${sysfspath}" ] && [ "$action" = "add" ] && mm_report_modem_wait "${sysfspath}" +} + +mm_report_event_from_cache_line() { + local event_line="$1" + + local action name subsystem sysfspath + action=$(echo "${event_line}" | awk -F ',' '{ print $1 }') + name=$(echo "${event_line}" | awk -F ',' '{ print $2 }') + subsystem=$(echo "${event_line}" | awk -F ',' '{ print $3 }') + sysfspath=$(echo "${event_line}" | awk -F ',' '{ print $4 }') + + mm_log "debug" "cached event found: action=${action}, name=${name}, subsystem=${subsystem}, sysfspath=${sysfspath}" + mm_report_event "${action}" "${name}" "${subsystem}" "${sysfspath}" +} + +mm_report_events_from_cache() { + # Remove the sysfs cache + rm -f "${MODEMMANAGER_SYSFS_CACHE}" + + local n=60 + local step=1 + local mmrunning=0 + + # Wait for ModemManager to be available in the bus + while [ $n -ge 0 ]; do + sleep $step + mm_log "info" "checking if ModemManager is available..." + + if ! mmcli -L >/dev/null 2>&1 + then + mm_log "info" "ModemManager not yet available" + else + mmrunning=1 + break + fi + n=$((n-step)) + done + + [ ${mmrunning} -eq 1 ] || { + mm_log "error" "couldn't report initial kernel events: ModemManager not running" + return + } + + # Report cached kernel events + while IFS= read -r event_line; do + mm_report_event_from_cache_line "${event_line}" + done < ${MODEMMANAGER_EVENTS_CACHE} +} diff --git a/package/network/utils/modemmanager/files/modemmanager.init b/package/network/services/modemmanager/files/modemmanager.init similarity index 100% rename from package/network/utils/modemmanager/files/modemmanager.init rename to package/network/services/modemmanager/files/modemmanager.init diff --git a/package/network/services/modemmanager/files/modemmanager.proto b/package/network/services/modemmanager/files/modemmanager.proto new file mode 100755 index 0000000000..e97b768d0b --- /dev/null +++ b/package/network/services/modemmanager/files/modemmanager.proto @@ -0,0 +1,650 @@ +#!/bin/sh +# Copyright (C) 2016-2019 Aleksander Morgado + +[ -x /usr/bin/mmcli ] || exit 0 +[ -x /usr/sbin/pppd ] || exit 0 + +[ -n "$INCLUDE_ONLY" ] || { + . /lib/functions.sh + . ../netifd-proto.sh + . ./ppp.sh + init_proto "$@" +} + +cdr2mask () +{ + # Number of args to shift, 255..255, first non-255 byte, zeroes + set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0 + if [ "$1" -gt 1 ] + then + shift "$1" + else + shift + fi + echo "${1-0}"."${2-0}"."${3-0}"."${4-0}" +} + +# This method expects as first argument a list of key-value pairs, as returned by mmcli --output-keyvalue +# The second argument must be exactly the name of the field to read +# +# Sample output: +# $ mmcli -m 0 -K +# modem.dbus-path : /org/freedesktop/ModemManager1/Modem/0 +# modem.generic.device-identifier : ed6eff2e3e0f90463da1c2a755b2acacd1335752 +# modem.generic.manufacturer : Dell Inc. +# modem.generic.model : DW5821e Snapdragon X20 LTE +# modem.generic.revision : T77W968.F1.0.0.4.0.GC.009\n026 +# modem.generic.carrier-configuration : GCF +# modem.generic.carrier-configuration-revision : 08E00009 +# modem.generic.hardware-revision : DW5821e Snapdragon X20 LTE +# .... +modemmanager_get_field() { + local list=$1 + local field=$2 + local value="" + + [ -z "${list}" ] || [ -z "${field}" ] && return + + # there is always at least a whitespace after each key, and we use that as part of the + # key matching we do (e.g. to avoid getting 'modem.generic.state-failed-reason' as a result + # when grepping for 'modem.generic.state'. + line=$(echo "${list}" | grep "${field} ") + value=$(echo ${line#*:}) + + # not found? + [ -n "${value}" ] || return 2 + + # only print value if set + [ "${value}" != "--" ] && echo "${value}" + return 0 +} + +# build a comma-separated list of values from the list +modemmanager_get_multivalue_field() { + local list=$1 + local field=$2 + local value="" + local length idx item + + [ -z "${list}" ] || [ -z "${field}" ] && return + + length=$(modemmanager_get_field "${list}" "${field}.length") + [ -n "${length}" ] || return 0 + [ "$length" -ge 1 ] || return 0 + + idx=1 + while [ $idx -le "$length" ]; do + item=$(modemmanager_get_field "${list}" "${field}.value\[$idx\]") + [ -n "${item}" ] && [ "${item}" != "--" ] && { + [ -n "${value}" ] && value="${value}, " + value="${value}${item}" + } + idx=$((idx + 1)) + done + + # nothing built? + [ -n "${value}" ] || return 2 + + # only print value if set + echo "${value}" + return 0 +} + +modemmanager_cleanup_connection() { + local modemstatus="$1" + + local bearercount idx bearerpath + + bearercount=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.length") + + # do nothing if no bearers reported + [ -n "${bearercount}" ] && [ "$bearercount" -ge 1 ] && { + # explicitly disconnect just in case + mmcli --modem="${device}" --simple-disconnect >/dev/null 2>&1 + # and remove all bearer objects, if any found + idx=1 + while [ $idx -le "$bearercount" ]; do + bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[$idx\]") + mmcli --modem "${device}" --delete-bearer="${bearerpath}" >/dev/null 2>&1 + idx=$((idx + 1)) + done + } +} + +modemmanager_connected_method_ppp_ipv4() { + local interface="$1" + local ttyname="$2" + local username="$3" + local password="$4" + local allowedauth="$5" + + # all auth types are allowed unless a user given list is given + local authopts + local pap=1 + local chap=1 + local mschap=1 + local mschapv2=1 + local eap=1 + + [ -n "$allowedauth" ] && { + pap=0 chap=0 mschap=0 mschapv2=0 eap=0 + for auth in $allowedauth; do + case $auth in + "pap") pap=1 ;; + "chap") chap=1 ;; + "mschap") mschap=1 ;; + "mschapv2") mschapv2=1 ;; + "eap") eap=1 ;; + *) ;; + esac + done + } + + [ $pap -eq 1 ] || append authopts "refuse-pap" + [ $chap -eq 1 ] || append authopts "refuse-chap" + [ $mschap -eq 1 ] || append authopts "refuse-mschap" + [ $mschapv2 -eq 1 ] || append authopts "refuse-mschap-v2" + [ $eap -eq 1 ] || append authopts "refuse-eap" + + proto_run_command "${interface}" /usr/sbin/pppd \ + "${ttyname}" \ + 115200 \ + nodetach \ + noaccomp \ + nobsdcomp \ + nopcomp \ + novj \ + noauth \ + $authopts \ + ${username:+ user "$username"} \ + ${password:+ password "$password"} \ + lcp-echo-failure 5 \ + lcp-echo-interval 15 \ + lock \ + crtscts \ + nodefaultroute \ + usepeerdns \ + ipparam "${interface}" \ + ip-up-script /lib/netifd/ppp-up \ + ip-down-script /lib/netifd/ppp-down +} + +modemmanager_disconnected_method_ppp_ipv4() { + local interface="$1" + + echo "running disconnection (ppp method)" + + [ -n "${ERROR}" ] && { + local errorstring + errorstring=$(ppp_exitcode_tostring "${ERROR}") + case "$ERROR" in + 0) + ;; + 2) + proto_notify_error "$interface" "$errorstring" + proto_block_restart "$interface" + ;; + *) + proto_notify_error "$interface" "$errorstring" + ;; + esac + } || echo "pppd result code not given" + + proto_kill_command "$interface" +} + +modemmanager_connected_method_dhcp_ipv4() { + local interface="$1" + local wwan="$2" + local metric="$3" + + proto_init_update "${wwan}" 1 + proto_set_keep 1 + proto_send_update "${interface}" + + json_init + json_add_string name "${interface}_4" + json_add_string ifname "@${interface}" + json_add_string proto "dhcp" + proto_add_dynamic_defaults + [ -n "$metric" ] && json_add_int metric "${metric}" + json_close_object + ubus call network add_dynamic "$(json_dump)" +} + +modemmanager_connected_method_static_ipv4() { + local interface="$1" + local wwan="$2" + local address="$3" + local prefix="$4" + local gateway="$5" + local mtu="$6" + local dns1="$7" + local dns2="$8" + local metric="$9" + + local mask="" + + [ -n "${address}" ] || { + proto_notify_error "${interface}" ADDRESS_MISSING + return + } + + [ -n "${prefix}" ] || { + proto_notify_error "${interface}" PREFIX_MISSING + return + } + mask=$(cdr2mask "${prefix}") + + [ -n "${mtu}" ] && /sbin/ip link set dev "${wwan}" mtu "${mtu}" + + proto_init_update "${wwan}" 1 + proto_set_keep 1 + echo "adding IPv4 address ${address}, netmask ${mask}" + proto_add_ipv4_address "${address}" "${mask}" + [ -n "${gateway}" ] && { + echo "adding default IPv4 route via ${gateway}" + proto_add_ipv4_route "0.0.0.0" "0" "${gateway}" "${address}" + } + [ -n "${dns1}" ] && { + echo "adding primary DNS at ${dns1}" + proto_add_dns_server "${dns1}" + } + [ -n "${dns2}" ] && { + echo "adding secondary DNS at ${dns2}" + proto_add_dns_server "${dns2}" + } + [ -n "$metric" ] && json_add_int metric "${metric}" + proto_send_update "${interface}" +} + +modemmanager_connected_method_dhcp_ipv6() { + local interface="$1" + local wwan="$2" + local metric="$3" + + proto_init_update "${wwan}" 1 + proto_set_keep 1 + proto_send_update "${interface}" + + json_init + json_add_string name "${interface}_6" + json_add_string ifname "@${interface}" + json_add_string proto "dhcpv6" + proto_add_dynamic_defaults + json_add_string extendprefix 1 # RFC 7278: Extend an IPv6 /64 Prefix to LAN + [ -n "$metric" ] && json_add_int metric "${metric}" + json_close_object + ubus call network add_dynamic "$(json_dump)" +} + +modemmanager_connected_method_static_ipv6() { + local interface="$1" + local wwan="$2" + local address="$3" + local prefix="$4" + local gateway="$5" + local mtu="$6" + local dns1="$7" + local dns2="$8" + local metric="$9" + + [ -n "${address}" ] || { + proto_notify_error "${interface}" ADDRESS_MISSING + return + } + + [ -n "${prefix}" ] || { + proto_notify_error "${interface}" PREFIX_MISSING + return + } + + [ -n "${mtu}" ] && /sbin/ip link set dev "${wwan}" mtu "${mtu}" + + proto_init_update "${wwan}" 1 + proto_set_keep 1 + echo "adding IPv6 address ${address}, prefix ${prefix}" + proto_add_ipv6_address "${address}" "128" + proto_add_ipv6_prefix "${address}/${prefix}" + [ -n "${gateway}" ] && { + echo "adding default IPv6 route via ${gateway}" + proto_add_ipv6_route "${gateway}" "128" + proto_add_ipv6_route "::0" "0" "${gateway}" "" "" "${address}/${prefix}" + } + [ -n "${dns1}" ] && { + echo "adding primary DNS at ${dns1}" + proto_add_dns_server "${dns1}" + } + [ -n "${dns2}" ] && { + echo "adding secondary DNS at ${dns2}" + proto_add_dns_server "${dns2}" + } + [ -n "$metric" ] && json_add_int metric "${metric}" + proto_send_update "${interface}" +} + +modemmanager_disconnected_method_common() { + local interface="$1" + + echo "running disconnection (common)" + + proto_init_update "*" 0 + proto_send_update "${interface}" +} + +proto_modemmanager_init_config() { + available=1 + no_device=1 + proto_config_add_string device + proto_config_add_string apn + proto_config_add_string 'allowedauth:list(string)' + proto_config_add_string username + proto_config_add_string password + proto_config_add_string allowedmode + proto_config_add_string preferredmode + proto_config_add_string pincode + proto_config_add_string iptype + proto_config_add_string plmn + proto_config_add_int signalrate + proto_config_add_boolean lowpower + proto_config_add_boolean allow_roaming + proto_config_add_defaults +} + +# Append param to the global 'connectargs' variable. +append_param() { + local param="$1" + + [ -z "$param" ] && return + [ -z "$connectargs" ] || connectargs="${connectargs}," + connectargs="${connectargs}${param}" +} + +modemmanager_set_allowed_mode() { + local device="$1" + local interface="$2" + local allowedmode="$3" + + echo "setting allowed mode to '${allowedmode}'" + mmcli --modem="${device}" --set-allowed-modes="${allowedmode}" || { + proto_notify_error "${interface}" MM_INVALID_ALLOWED_MODES_LIST + proto_block_restart "${interface}" + return 1 + } +} + +modemmanager_set_preferred_mode() { + local device="$1" + local interface="$2" + local allowedmode="$3" + local preferredmode="$4" + + [ -z "${preferredmode}" ] && { + echo "no preferred mode configured" + proto_notify_error "${interface}" MM_NO_PREFERRED_MODE_CONFIGURED + proto_block_restart "${interface}" + return 1 + } + + [ -z "${allowedmode}" ] && { + echo "no allowed mode configured" + proto_notify_error "${interface}" MM_NO_ALLOWED_MODE_CONFIGURED + proto_block_restart "${interface}" + return 1 + } + + echo "setting preferred mode to '${preferredmode}' (${allowedmode})" + mmcli --modem="${device}" \ + --set-preferred-mode="${preferredmode}" \ + --set-allowed-modes="${allowedmode}" || { + proto_notify_error "${interface}" MM_FAILED_SETTING_PREFERRED_MODE + proto_block_restart "${interface}" + return 1 + } +} + +proto_modemmanager_setup() { + local interface="$1" + + local modempath modemstatus bearercount bearerpath connectargs bearerstatus beareriface + local bearermethod_ipv4 bearermethod_ipv6 auth cliauth + local operatorname operatorid registration accesstech signalquality + local allowedmode preferredmode + + local device apn allowedauth username password pincode + local iptype plmn metric signalrate allow_roaming + + local address prefix gateway mtu dns1 dns2 + + json_get_vars device apn allowedauth username password + json_get_vars pincode iptype plmn metric signalrate allow_roaming + json_get_vars allowedmode preferredmode + + # validate sysfs path given in config + [ -n "${device}" ] || { + echo "No device specified" + proto_notify_error "${interface}" NO_DEVICE + proto_set_available "${interface}" 0 + return 1 + } + + # validate that ModemManager is handling the modem at the sysfs path + modemstatus=$(mmcli --modem="${device}" --output-keyvalue) + modempath=$(modemmanager_get_field "${modemstatus}" "modem.dbus-path") + [ -n "${modempath}" ] || { + echo "Device not managed by ModemManager" + proto_notify_error "${interface}" DEVICE_NOT_MANAGED + proto_set_available "${interface}" 0 + return 1 + } + echo "modem available at ${modempath}" + + [ -z "${allowedmode}" ] || { + case "$allowedmode" in + "2g") + modemmanager_set_allowed_mode "$device" \ + "$interface" "2g" + ;; + "3g") + modemmanager_set_allowed_mode "$device" \ + "$interface" "3g" + ;; + "4g") + modemmanager_set_allowed_mode "$device" \ + "$interface" "4g" + ;; + "5g") + modemmanager_set_allowed_mode "$device" \ + "$interface" "5g" + ;; + *) + modemmanager_set_preferred_mode "$device" \ + "$interface" "${allowedmode}" "${preferredmode}" + ;; + esac + # check error for allowed_mode and preferred_mode function call + [ "$?" -ne "0" ] && return 1 + } + + # always cleanup before attempting a new connection, just in case + modemmanager_cleanup_connection "${modemstatus}" + + # if allowedauth list given, build option string + for auth in $allowedauth; do + cliauth="${cliauth}${cliauth:+|}$auth" + done + + # setup connect args; APN mandatory (even if it may be empty) + echo "starting connection with apn '${apn}'..." + proto_notify_error "${interface}" MM_CONNECT_IN_PROGRESS + + # setup allow-roaming parameter + if [ -n "${allow_roaming}" ] && [ "${allow_roaming}" -eq 0 ];then + allow_roaming="no" + else + # allowed unless a user set the opposite + allow_roaming="yes" + fi + + # Append options to 'connectargs' variable + append_param "apn=${apn}" + append_param "allow-roaming=${allow_roaming}" + append_param "${iptype:+ip-type=${iptype}}" + append_param "${plmn:+operator-id=${plmn}}" + append_param "${cliauth:+allowed-auth=${cliauth}}" + append_param "${username:+user=${username}}" + append_param "${password:+password=${password}}" + append_param "${pincode:+pin=${pincode}}" + + mmcli --modem="${device}" --timeout 120 --simple-connect="${connectargs}" || { + proto_notify_error "${interface}" MM_CONNECT_FAILED + proto_block_restart "${interface}" + return 1 + } + + # check if Signal refresh rate is set + if [ -n "${signalrate}" ] && [ "${signalrate}" -eq "${signalrate}" ] 2>/dev/null; then + echo "setting signal refresh rate to ${signalrate} seconds" + mmcli --modem="${device}" --signal-setup="${signalrate}" + else + echo "signal refresh rate is not set" + fi + + # log additional useful information + modemstatus=$(mmcli --modem="${device}" --output-keyvalue) + operatorname=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.operator-name") + [ -n "${operatorname}" ] && echo "network operator name: ${operatorname}" + operatorid=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.operator-code") + [ -n "${operatorid}" ] && echo "network operator MCCMNC: ${operatorid}" + registration=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.registration-state") + [ -n "${registration}" ] && echo "registration type: ${registration}" + accesstech=$(modemmanager_get_multivalue_field "${modemstatus}" "modem.generic.access-technologies") + [ -n "${accesstech}" ] && echo "access technology: ${accesstech}" + signalquality=$(modemmanager_get_field "${modemstatus}" "modem.generic.signal-quality.value") + [ -n "${signalquality}" ] && echo "signal quality: ${signalquality}%" + + # we won't like it if there are more than one bearers, as that would mean the + # user manually created them, and that's unsupported by this proto + bearercount=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.length") + [ -n "${bearercount}" ] && [ "$bearercount" -eq 1 ] || { + proto_notify_error "${interface}" INVALID_BEARER_LIST + return 1 + } + + # load connected bearer information + bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[1\]") + bearerstatus=$(mmcli --bearer "${bearerpath}" --output-keyvalue) + + # load network interface and method information + beareriface=$(modemmanager_get_field "${bearerstatus}" "bearer.status.interface") + bearermethod_ipv4=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.method") + bearermethod_ipv6=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.method") + + # setup IPv4 + [ -n "${bearermethod_ipv4}" ] && { + echo "IPv4 connection setup required in interface ${interface}: ${bearermethod_ipv4}" + case "${bearermethod_ipv4}" in + "dhcp") + modemmanager_connected_method_dhcp_ipv4 "${interface}" "${beareriface}" "${metric}" + ;; + "static") + address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.address") + prefix=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.prefix") + gateway=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.gateway") + mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.mtu") + dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[1\]") + dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[2\]") + modemmanager_connected_method_static_ipv4 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}" + ;; + "ppp") + modemmanager_connected_method_ppp_ipv4 "${interface}" "${beareriface}" "${username}" "${password}" "${allowedauth}" + ;; + *) + proto_notify_error "${interface}" UNKNOWN_METHOD + return 1 + ;; + esac + } + + # setup IPv6 + # note: if using ipv4v6, both IPv4 and IPv6 settings will have the same MTU and metric values reported + [ -n "${bearermethod_ipv6}" ] && { + echo "IPv6 connection setup required in interface ${interface}: ${bearermethod_ipv6}" + case "${bearermethod_ipv6}" in + "dhcp") + modemmanager_connected_method_dhcp_ipv6 "${interface}" "${beareriface}" "${metric}" + ;; + "static") + address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.address") + prefix=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.prefix") + gateway=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.gateway") + mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.mtu") + dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[1\]") + dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[2\]") + modemmanager_connected_method_static_ipv6 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}" + ;; + "ppp") + proto_notify_error "${interface}" "unsupported method" + return 1 + ;; + *) + proto_notify_error "${interface}" UNKNOWN_METHOD + return 1 + ;; + esac + } + + return 0 +} + +proto_modemmanager_teardown() { + local interface="$1" + + local modemstatus bearerpath errorstring + local bearermethod_ipv4 bearermethod_ipv6 + + local device lowpower iptype + json_get_vars device lowpower iptype + + echo "stopping network" + + # load connected bearer information, just the first one should be ok + modemstatus=$(mmcli --modem="${device}" --output-keyvalue) + bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[1\]") + [ -n "${bearerpath}" ] || { + echo "couldn't load bearer path: disconnecting anyway" + mmcli --modem="${device}" --simple-disconnect >/dev/null 2>&1 + return + } + + # load bearer connection methods + bearerstatus=$(mmcli --bearer "${bearerpath}" --output-keyvalue) + bearermethod_ipv4=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.method") + [ -n "${bearermethod_ipv4}" ] && + echo "IPv4 connection teardown required in interface ${interface}: ${bearermethod_ipv4}" + bearermethod_ipv6=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.method") + [ -n "${bearermethod_ipv6}" ] && + echo "IPv6 connection teardown required in interface ${interface}: ${bearermethod_ipv6}" + + # disconnection handling only requires special treatment in IPv4/PPP + [ "${bearermethod_ipv4}" = "ppp" ] && modemmanager_disconnected_method_ppp_ipv4 "${interface}" + modemmanager_disconnected_method_common "${interface}" + + # disconnect + mmcli --modem="${device}" --simple-disconnect || + proto_notify_error "${interface}" DISCONNECT_FAILED + + # disable + mmcli --modem="${device}" --disable + + # low power, only if requested + [ "${lowpower:-0}" -lt 1 ] || + mmcli --modem="${device}" --set-power-state-low + + proto_init_update "*" 0 + proto_send_update "$interface" +} + +[ -n "$INCLUDE_ONLY" ] || { + add_protocol modemmanager +} diff --git a/package/network/utils/modemmanager/files/usr/sbin/ModemManager-wrapper b/package/network/services/modemmanager/files/usr/sbin/ModemManager-wrapper similarity index 100% rename from package/network/utils/modemmanager/files/usr/sbin/ModemManager-wrapper rename to package/network/services/modemmanager/files/usr/sbin/ModemManager-wrapper diff --git a/package/network/utils/net-snmp/Config.in.wut b/package/network/services/net-snmp/Config.in.wut similarity index 100% rename from package/network/utils/net-snmp/Config.in.wut rename to package/network/services/net-snmp/Config.in.wut diff --git a/package/network/services/net-snmp/Makefile b/package/network/services/net-snmp/Makefile new file mode 100644 index 0000000000..1a1194955b --- /dev/null +++ b/package/network/services/net-snmp/Makefile @@ -0,0 +1,292 @@ +# +# Copyright (C) 2006-2017 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=net-snmp +PKG_VERSION:=5.9.1 +PKG_RELEASE:=7 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=@SF/net-snmp +PKG_HASH:=eb7fd4a44de6cddbffd9a92a85ad1309e5c1054fb9d5a7dd93079c8953f48c3f +PKG_MAINTAINER:=Stijn Tintel +PKG_LICENSE:=MIT BSD-3-Clause-Clear +PKG_CPE_ID:=cpe:/a:net-snmp:net-snmp + +PKG_FIXUP:=autoreconf + +include $(INCLUDE_DIR)/package.mk + +define Package/net-snmp/Default + SECTION:=net + CATEGORY:=Network + URL:=http://www.net-snmp.org/ +endef + +define Package/net-snmp/Default/description + Simple Network Management Protocol (SNMP) is a widely used protocol for + monitoring the health and welfare of network equipment (eg. routers), + computer equipment and even devices like UPSs. Net-SNMP is a suite of + applications used to implement SNMP v1, SNMP v2c and SNMP v3 using both + IPv4 and IPv6. +endef + + +define Package/libnetsnmp +$(call Package/net-snmp/Default) + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+libnl-tiny +libpci +libpcre2 + TITLE:=Open source SNMP implementation (libraries) +endef + +define Package/libnetsnmp/description +$(call Package/net-snmp/Default/description) + . + This package contains shared libraries, needed by other programs. +endef + + +define Package/snmp-mibs +$(call Package/net-snmp/Default) + TITLE:=Open source SNMP implementation (MIB-files) +endef + +define Package/snmp-mibs/description +$(call Package/net-snmp/Default/description) + . + This package contains SNMP MIB-Files. +endef + + +define Package/snmp-utils +$(call Package/net-snmp/Default) + DEPENDS:=+libnetsnmp + TITLE:=Open source SNMP implementation (utilities) +endef + +define Package/snmp-utils/description +$(call Package/net-snmp/Default/description) + . + This package contains SNMP client utilities: + - snmpget + - snmpset + - snmpstatus + - snmptest + - snmptrap + - snmpwalk +endef + + +define Package/snmpd +$(call Package/net-snmp/Default) + DEPENDS:=+libnetsnmp + TITLE:=Open source SNMP implementation (daemon) +endef + +define Package/snmpd/description +$(call Package/net-snmp/Default/description) + . + This package contains the SNMP agent, dynamically linked. +endef + + +define Package/snmpd-static +$(call Package/net-snmp/Default) + DEPENDS:=+snmpd + TITLE:=Open source SNMP implementation (daemon) + BUILDONLY:=1 +endef + + +define Package/snmptrapd +$(call Package/net-snmp/Default) + DEPENDS:=+libnetsnmp + TITLE:=Open source SNMP implementation (notification receiver) +endef + +define Package/snmptrapd/description +$(call Package/net-snmp/Default/description) + . + This package contains the SNMP notification receiver. +endef + + +SNMP_MIB_MODULES_INCLUDED = \ + agent/extend \ + agentx \ + host/hr_device \ + host/hr_disk \ + host/hr_filesys \ + host/hr_network \ + host/hr_partition \ + host/hr_proc \ + host/hr_storage \ + host/hr_system \ + ieee802dot11 \ + if-mib/ifXTable \ + ip-mib/inetNetToMediaTable \ + mibII/at \ + mibII/icmp \ + mibII/ifTable \ + mibII/ip \ + mibII/snmp_mib \ + mibII/sysORTable \ + mibII/system_mib \ + mibII/tcp \ + mibII/udp \ + mibII/vacm_context \ + mibII/vacm_vars \ + snmpv3/snmpEngine \ + snmpv3/snmpMPDStats \ + snmpv3/usmConf \ + snmpv3/usmStats \ + snmpv3/usmUser \ + tunnel \ + ucd-snmp/disk \ + ucd-snmp/dlmod \ + ucd-snmp/extensible \ + ucd-snmp/loadave \ + ucd-snmp/memory \ + ucd-snmp/pass \ + ucd-snmp/pass_persist \ + ucd-snmp/proc \ + ucd-snmp/vmstat \ + util_funcs \ + utilities/execute \ + +SNMP_MIB_MODULES_EXCLUDED = \ + agent_mibs \ + disman/event \ + disman/schedule \ + hardware \ + host \ + if-mib \ + ip-mib \ + mibII \ + notification \ + notification-log-mib \ + snmpv3mibs \ + target \ + tcp-mib \ + ucd_snmp \ + udp-mib \ + utilities \ + +SNMP_TRANSPORTS_INCLUDED = Callback UDP Unix + +SNMP_TRANSPORTS_EXCLUDED = TCP TCPIPv6 + +TARGET_CFLAGS += $(FPIC) +TARGET_CPPFLAGS += -I$(STAGING_DIR)/usr/include/libnl-tiny + +CONFIGURE_ARGS += \ + --enable-mfd-rewrites \ + --enable-shared \ + --enable-static \ + --with-endianness=$(if $(CONFIG_BIG_ENDIAN),big,little) \ + --with-logfile=/var/log/snmpd.log \ + --with-persistent-directory=/usr/lib/snmp/ \ + --with-default-snmp-version=1 \ + --with-sys-contact=root@localhost \ + --with-sys-location=Unknown \ + --enable-applications \ + --disable-debugging \ + --disable-manuals \ + --disable-scripts \ + --with-out-mib-modules="$(SNMP_MIB_MODULES_EXCLUDED)" \ + --with-mib-modules="$(SNMP_MIB_MODULES_INCLUDED)" \ + --with-out-transports="$(SNMP_TRANSPORTS_EXCLUDED)" \ + --with-transports="$(SNMP_TRANSPORTS_INCLUDED)" \ + --without-openssl \ + --without-libwrap \ + --without-mysql \ + --without-rpm \ + --without-zlib \ + --with-pcre2-8 \ + --with-nl \ + $(call autoconf_bool,CONFIG_IPV6,ipv6) \ + --disable-perl-cc-checks \ + --disable-embedded-perl \ + --without-perl-modules + +CONFIGURE_VARS += \ + ac_cv_header_netlink_netlink_h=yes \ + netsnmp_cv_func_nl_connect_LIBS=-lnl-tiny \ + +ifeq ($(CONFIG_IPV6),y) +SNMP_TRANSPORTS_INCLUDED+= UDPIPv6 +endif + +TARGET_LDFLAGS += -L$(TOOLCHAIN_DIR)/usr/lib + +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR) \ + INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \ + LDFLAGS="$(TARGET_LDFLAGS) -lm -lc" \ + all install +endef + +define Build/InstallDev + $(INSTALL_DIR) $(2)/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/net-snmp-config $(2)/bin/ + $(SED) 's,=/usr,=$(STAGING_DIR)/usr,g' $(2)/bin/net-snmp-config + $(INSTALL_DIR) $(STAGING_DIR)/usr/bin + $(LN) $(STAGING_DIR)/host/bin/net-snmp-config $(STAGING_DIR)/usr/bin/ + + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_INSTALL_DIR)/usr/include/net-snmp $(1)/usr/include/ + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnetsnmp{,agent,helpers,mibs}.{a,so*} $(1)/usr/lib/ +endef + +define Package/libnetsnmp/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnetsnmp{,agent,helpers,mibs}.so.* $(1)/usr/lib/ +endef + +define Package/snmp-mibs/install + $(INSTALL_DIR) $(1)/usr/share/snmp/mibs + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/snmp/mibs/* $(1)/usr/share/snmp/mibs/ +endef + +define Package/snmp-utils/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/snmp{get,set,status,test,trap,walk} $(1)/usr/bin/ +endef + +define Package/snmpd/conffiles +/etc/config/snmpd +endef + +define Package/snmpd/install + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DATA) ./files/snmpd.conf $(1)/etc/config/snmpd + $(INSTALL_DIR) $(1)/etc/snmp + $(LN) /var/run/snmpd.conf $(1)/etc/snmp/ + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/snmpd.init $(1)/etc/init.d/snmpd + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/snmpd $(1)/usr/sbin/snmpd +endef + +define Package/snmptrapd/install + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/snmptrapd.init $(1)/etc/init.d/snmptrapd + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnetsnmptrapd.so.* $(1)/usr/lib/ + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/snmptrapd $(1)/usr/sbin/ +endef + +$(eval $(call BuildPackage,libnetsnmp)) +$(eval $(call BuildPackage,snmp-mibs)) +$(eval $(call BuildPackage,snmp-utils)) +$(eval $(call BuildPackage,snmpd)) +$(eval $(call BuildPackage,snmpd-static)) +$(eval $(call BuildPackage,snmptrapd)) diff --git a/package/network/utils/net-snmp/files/snmpd.conf b/package/network/services/net-snmp/files/snmpd.conf similarity index 100% rename from package/network/utils/net-snmp/files/snmpd.conf rename to package/network/services/net-snmp/files/snmpd.conf diff --git a/package/network/services/net-snmp/files/snmpd.init b/package/network/services/net-snmp/files/snmpd.init new file mode 100644 index 0000000000..daecb73c9a --- /dev/null +++ b/package/network/services/net-snmp/files/snmpd.init @@ -0,0 +1,359 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2008 OpenWrt.org +START=99 + +USE_PROCD=1 +PROG="/usr/sbin/snmpd" + +CONFIGFILE="/var/run/snmpd.conf" + +snmpd_agent_add() { + local cfg="$1" + + config_get agentaddress "$cfg" agentaddress + [ -n "$agentaddress" ] || return 0 + echo "agentaddress $agentaddress" >> $CONFIGFILE +} + +snmpd_agentx_add() { + local cfg="$1" + echo "master agentx" >> $CONFIGFILE + config_get agentxsocket "$cfg" agentxsocket + [ -n "$agentxsocket" ] && echo "agentXSocket $agentxsocket" >> $CONFIGFILE +} + +snmpd_system_add() { + local cfg="$1" + config_get syslocation "$cfg" sysLocation + [ -n "$syslocation" ] && echo "sysLocation $syslocation" >> $CONFIGFILE + config_get syscontact "$cfg" sysContact + [ -n "$syscontact" ] && echo "sysContact $syscontact" >> $CONFIGFILE + config_get sysname "$cfg" sysName + [ -n "$sysname" ] && echo "sysName $sysname" >> $CONFIGFILE + config_get sysservice "$cfg" sysService + [ -n "$sysservice" ] && echo "sysService $sysservice" >> $CONFIGFILE + config_get sysdescr "$cfg" sysDescr + [ -n "$sysdescr" ] && echo "sysDescr $sysdescr" >> $CONFIGFILE + config_get sysobjectid "$cfg" sysObjectID + [ -n "$sysobjectid" ] && echo "sysObjectID $sysobjectid" >> $CONFIGFILE +} + +snmpd_com2sec_add() { + local cfg="$1" + config_get secname "$cfg" secname + [ -n "$secname" ] || return 0 + config_get source "$cfg" source + [ -n "$source" ] || return 0 + config_get community "$cfg" community + [ -n "$community" ] || return 0 + echo "com2sec $secname $source $community" >> $CONFIGFILE +} + +snmpd_com2sec6_add() { + local cfg="$1" + config_get secname "$cfg" secname + [ -n "$secname" ] || return 0 + config_get source "$cfg" source + [ -n "$source" ] || return 0 + config_get community "$cfg" community + [ -n "$community" ] || return 0 + echo "com2sec6 $secname $source $community" >> $CONFIGFILE +} + +snmpd_group_add() { + local cfg="$1" + config_get group "$cfg" group + [ -n "$group" ] || return 0 + config_get version "$cfg" version + [ -n "$version" ] || return 0 + config_get secname "$cfg" secname + [ -n "$secname" ] || return 0 + echo "group $group $version $secname" >> $CONFIGFILE +} + +snmpd_view_add() { + local cfg="$1" + config_get viewname "$cfg" viewname + [ -n "$viewname" ] || return 0 + config_get type "$cfg" type + [ -n "$type" ] || return 0 + config_get oid "$cfg" oid + [ -n "$oid" ] || return 0 + # optional mask + config_get mask "$cfg" mask + echo "view $viewname $type $oid $mask" >> $CONFIGFILE +} + +snmpd_access_add() { + local cfg="$1" + config_get group "$cfg" group + [ -n "$group" ] || return 0 + config_get context "$cfg" context + [ -n $context ] || return 0 + [ "$context" == "none" ] && context='""' + config_get version "$cfg" version + [ -n "$version" ] || return 0 + config_get level "$cfg" level + [ -n "$level" ] || return 0 + config_get prefix "$cfg" prefix + [ -n "$prefix" ] || return 0 + config_get read "$cfg" read + [ -n "$read" ] || return 0 + config_get write "$cfg" write + [ -n "$write" ] || return 0 + config_get notify "$cfg" notify + [ -n "$notify" ] || return 0 + echo "access $group $context $version $level $prefix $read $write $notify" >> $CONFIGFILE +} + +snmpd_trap_hostname_add() { + local cfg="$1" + config_get hostname "$cfg" HostName + config_get port "$cfg" Port + config_get community "$cfg" Community + config_get type "$cfg" Type + echo "$type $hostname $community $port" >> $CONFIGFILE +} + +snmpd_trap_ip_add() { + local cfg="$1" + config_get host_ip "$cfg" HostIP + config_get port "$cfg" Port + config_get community "$cfg" Community + config_get type "$cfg" Type + echo "$type $host_ip $community $port" >> $CONFIGFILE +} + +snmpd_access_default_add() { + local cfg="$1" + config_get mode "$cfg" Mode + config_get community "$cfg" CommunityName + config_get oidrestrict "$cfg" RestrictOID + config_get oid "$cfg" RestrictedOID + echo -n "$mode $community default" >> $CONFIGFILE + [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE + [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE +} + +snmpd_access_HostName_add() { + local cfg="$1" + config_get hostname "$cfg" HostName + config_get mode "$cfg" Mode + config_get community "$cfg" CommunityName + config_get oidrestrict "$cfg" RestrictOID + config_get oid "$cfg" RestrictedOID + echo -n "$mode $community $hostname" >> $CONFIGFILE + [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE + [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE +} + +snmpd_access_HostIP_add() { + local cfg="$1" + config_get host_ip "$cfg" HostIP + config_get ip_mask "$cfg" IPMask + config_get mode "$cfg" Mode + config_get community "$cfg" CommunityName + config_get oidrestrict "$cfg" RestrictOID + config_get oid "$cfg" RestrictedOID + echo -n "$mode $community $host_ip/$ip_mask" >> $CONFIGFILE + [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE + [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE +} + +snmpd_pass_add() { + local cfg="$1" + local pass='pass' + + config_get miboid "$cfg" miboid + [ -n "$miboid" ] || return 0 + config_get prog "$cfg" prog + [ -n "$prog" ] || return 0 + config_get_bool persist "$cfg" persist 0 + [ $persist -ne 0 ] && pass='pass_persist' + config_get priority "$cfg" priority + priority=${priority:+-p $priority} + echo "$pass $priority $miboid $prog" >> $CONFIGFILE +} + +snmpd_exec_add() { + local cfg="$1" + + config_get name "$cfg" name + [ -n "$name" ] || return 0 + config_get prog "$cfg" prog + [ -n "$prog" ] || return 0 + config_get args "$cfg" args + config_get miboid "$cfg" miboid + echo "exec $miboid $name $prog $args" >> $CONFIGFILE +} + +snmpd_extend_add() { + local cfg="$1" + + config_get name "$cfg" name + [ -n "$name" ] || return 0 + config_get prog "$cfg" prog + [ -n "$prog" ] || return 0 + config_get args "$cfg" args + config_get miboid "$cfg" miboid + echo "extend $miboid $name $prog $args" >> $CONFIGFILE +} + +snmpd_disk_add() { + local cfg="$1" + local disk='disk' + + config_get partition "$cfg" partition + [ -n "$partition" ] || return 0 + config_get size "$cfg" size + [ -n "$size" ] || return 0 + echo "$disk $partition $size" >> $CONFIGFILE +} + +snmpd_engineid_add() { + local cfg="$1" + + config_get engineid "$cfg" engineid + [ -n "$engineid" ] && echo "engineID $engineid" >> $CONFIGFILE + config_get engineidtype "$cfg" engineidtype + [ "$engineidtype" -ge 1 -a "$engineidtype" -le 3 ] && \ + echo "engineIDType $engineidtype" >> $CONFIGFILE + config_get engineidnic "$cfg" engineidnic + [ -n "$engineidnic" ] && echo "engineIDNic $engineidnic" >> $CONFIGFILE +} + +snmpd_sink_add() { + local cfg="$1" + local section="$2" + local community + local port + local host + + config_get host "$cfg" host + [ -n "section" -a -n "$host" ] || return 0 + # optional community + config_get community "$cfg" community + # optional port + config_get port "$cfg" port + port=${port:+:$port} + echo "$section $host$port $community" >> $CONFIGFILE +} + +append_parm() { + local section="$1" + local option="$2" + local switch="$3" + local _loctmp + config_get _loctmp "$section" "$option" + [ -z "$_loctmp" ] && return 0 + echo "$switch $_loctmp" >> $CONFIGFILE +} + +append_authtrapenable() { + local section="$1" + local option="$2" + local switch="$3" + local _loctmp + config_get_bool _loctmp "$section" "$option" + [ -z "$_loctmp" ] && return 0 + [ "$_loctmp" -gt 0 ] && echo "$switch $_loctmp" >> $CONFIGFILE +} + +snmpd_setup_fw_rules() { + local net="$1" + local zone + + zone=$(fw3 -q network "$net" 2>/dev/null) + + local handled_zone + for handled_zone in $HANDLED_SNMP_ZONES; do + [ "$handled_zone" = "$zone" ] && return + done + + json_add_object "" + json_add_string type rule + json_add_string src "$zone" + json_add_string proto udp + json_add_string dest_port 161 + json_add_string target ACCEPT + json_close_object + + HANDLED_SNMP_ZONES="$HANDLED_SNMP_ZONES $zone" +} + +start_service() { + [ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE" + + config_load snmpd + + config_get_bool snmp_enabled general enabled 1 + [ "$snmp_enabled" -eq 0 ] && return + + procd_open_instance + + config_foreach snmpd_agent_add agent + config_foreach snmpd_agentx_add agentx + config_foreach snmpd_system_add system + config_foreach snmpd_com2sec_add com2sec + config_foreach snmpd_com2sec6_add com2sec6 + config_foreach snmpd_group_add group + config_foreach snmpd_view_add view + config_foreach snmpd_access_add access + config_foreach snmpd_trap_hostname_add trap_HostName + config_foreach snmpd_trap_ip_add trap_HostIP + config_foreach snmpd_access_default_add access_default + config_foreach snmpd_access_HostName_add access_HostName + config_foreach snmpd_access_HostIP_add access_HostIP + config_foreach snmpd_pass_add pass + config_foreach snmpd_exec_add exec + config_foreach snmpd_extend_add extend + config_foreach snmpd_disk_add disk + config_foreach snmpd_engineid_add engineid + append_parm trapcommunity community trapcommunity + config_foreach snmpd_sink_add trapsink trapsink + config_foreach snmpd_sink_add trap2sink trap2sink + config_foreach snmpd_sink_add informsink informsink + append_authtrapenable authtrapenable enable authtrapenable + append_parm v1trapaddress host v1trapaddress + append_parm trapsess trapsess trapsess + + procd_set_param command $PROG -Lf /dev/null -f -r + procd_set_param file $CONFIGFILE + procd_set_param respawn + + for iface in $(ls /sys/class/net 2>/dev/null); do + procd_append_param netdev "$iface" + done + + procd_open_data + + json_add_array firewall + config_list_foreach general network snmpd_setup_fw_rules + json_close_array + + procd_close_data + + procd_close_instance +} + +service_stopped() { + [ -f "$CONFIGFILE" ] || return + rm -f "$CONFIGFILE" + procd_set_config_changed firewall +} + +service_triggers(){ + local script=$(readlink "$initscript") + local name=$(basename ${script:-$initscript}) + + procd_open_trigger + procd_add_raw_trigger "interface.*" 2000 /etc/init.d/$name reload + procd_close_trigger + + procd_add_reload_trigger 'snmpd' +} + +service_started() { + [ "$snmp_enabled" -eq 0 ] && return + procd_set_config_changed firewall +} diff --git a/package/network/utils/net-snmp/files/snmptrapd.init b/package/network/services/net-snmp/files/snmptrapd.init similarity index 100% rename from package/network/utils/net-snmp/files/snmptrapd.init rename to package/network/services/net-snmp/files/snmptrapd.init diff --git a/package/network/utils/net-snmp/patches/000-cross-compile.patch b/package/network/services/net-snmp/patches/000-cross-compile.patch similarity index 100% rename from package/network/utils/net-snmp/patches/000-cross-compile.patch rename to package/network/services/net-snmp/patches/000-cross-compile.patch diff --git a/package/network/utils/net-snmp/patches/010-HOST-MIB-hr_filesys-fix-compile-error.patch b/package/network/services/net-snmp/patches/010-HOST-MIB-hr_filesys-fix-compile-error.patch similarity index 100% rename from package/network/utils/net-snmp/patches/010-HOST-MIB-hr_filesys-fix-compile-error.patch rename to package/network/services/net-snmp/patches/010-HOST-MIB-hr_filesys-fix-compile-error.patch diff --git a/package/network/utils/net-snmp/patches/100-debian-statistics.patch b/package/network/services/net-snmp/patches/100-debian-statistics.patch similarity index 100% rename from package/network/utils/net-snmp/patches/100-debian-statistics.patch rename to package/network/services/net-snmp/patches/100-debian-statistics.patch diff --git a/package/network/utils/net-snmp/patches/110-debian-makefiles.patch b/package/network/services/net-snmp/patches/110-debian-makefiles.patch similarity index 100% rename from package/network/utils/net-snmp/patches/110-debian-makefiles.patch rename to package/network/services/net-snmp/patches/110-debian-makefiles.patch diff --git a/package/network/utils/net-snmp/patches/120-debian-searchdirs.patch b/package/network/services/net-snmp/patches/120-debian-searchdirs.patch similarity index 100% rename from package/network/utils/net-snmp/patches/120-debian-searchdirs.patch rename to package/network/services/net-snmp/patches/120-debian-searchdirs.patch diff --git a/package/network/utils/net-snmp/patches/130-debian-extramibs.patch b/package/network/services/net-snmp/patches/130-debian-extramibs.patch similarity index 100% rename from package/network/utils/net-snmp/patches/130-debian-extramibs.patch rename to package/network/services/net-snmp/patches/130-debian-extramibs.patch diff --git a/package/network/utils/net-snmp/patches/160-no_ldconfig.patch b/package/network/services/net-snmp/patches/160-no_ldconfig.patch similarity index 100% rename from package/network/utils/net-snmp/patches/160-no_ldconfig.patch rename to package/network/services/net-snmp/patches/160-no_ldconfig.patch diff --git a/package/network/utils/net-snmp/patches/170-ldflags.patch b/package/network/services/net-snmp/patches/170-ldflags.patch similarity index 100% rename from package/network/utils/net-snmp/patches/170-ldflags.patch rename to package/network/services/net-snmp/patches/170-ldflags.patch diff --git a/package/network/services/net-snmp/patches/200-add-pcre2-support.patch b/package/network/services/net-snmp/patches/200-add-pcre2-support.patch new file mode 100644 index 0000000000..4100647102 --- /dev/null +++ b/package/network/services/net-snmp/patches/200-add-pcre2-support.patch @@ -0,0 +1,407 @@ +From d3e95c87b32397815f6d5bcfc844259f2552697a Mon Sep 17 00:00:00 2001 +From: gagan sidhu +Date: Sun, 21 May 2023 15:47:36 -0600 +Subject: [PATCH] add pcre2 support + +--- + agent/mibgroup/host/data_access/swrun.c | 29 ++++++++++-- + agent/mibgroup/if-mib/data_access/interface.c | 47 ++++++++++++++++--- + agent/mibgroup/struct.h | 2 +- + agent/mibgroup/ucd-snmp/proc.c | 32 +++++++++---- + agent/mibgroup/ucd-snmp/proc.h | 2 +- + configure.d/config_os_libs1 | 27 +++++++++++ + configure.d/config_project_with_enable | 4 ++ + include/net-snmp/data_access/interface.h | 9 +++- + include/net-snmp/data_access/swrun.h | 2 +- + include/net-snmp/types.h | 2 +- + 10 files changed, 132 insertions(+), 24 deletions(-) + +--- a/agent/mibgroup/host/data_access/swrun.c ++++ b/agent/mibgroup/host/data_access/swrun.c +@@ -17,7 +17,10 @@ + #include "swrun.h" + #include "swrun_private.h" + +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) ++#define PCRE2_CODE_UNIT_WIDTH 8 ++#include ++#elif defined(HAVE_PCRE_H) + #include + #endif + +@@ -100,32 +103,52 @@ swrun_max_processes( void ) + #endif /* NETSNMP_FEATURE_REMOVE_SWRUN_MAX_PROCESSES */ + + #ifndef NETSNMP_FEATURE_REMOVE_SWRUN_COUNT_PROCESSES_BY_REGEX +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) + int + swrun_count_processes_by_regex( char *name, netsnmp_regex_ptr regexp ) + { + netsnmp_swrun_entry *entry; + netsnmp_iterator *it; + int i = 0; ++#ifdef HAVE_PCRE2_H ++ pcre2_match_data *ndx_match; ++ int *found_ndx; ++ ndx_match = pcre2_match_data_create(30, NULL); ++ found_ndx = pcre2_get_ovector_pointer(ndx_match); ++#elif HAVE_PCRE_H + int found_ndx[30]; ++#endif + int found; + char fullCommand[64 + 128 + 128 + 3]; + + netsnmp_cache_check_and_reload(swrun_cache); + if ( !swrun_container || !name || !regexp.regex_ptr ) ++#ifdef HAVE_PCRE2_H ++ { ++ pcre2_match_data_free(ndx_match); ++ return 0; ++ } ++#else + return 0; /* or -1 */ ++#endif + + it = CONTAINER_ITERATOR( swrun_container ); + while ((entry = (netsnmp_swrun_entry*)ITERATOR_NEXT( it )) != NULL) { + /* need to assemble full command back so regexps can get full picture */ + sprintf(fullCommand, "%s %s", entry->hrSWRunPath, entry->hrSWRunParameters); ++#ifdef HAVE_PCRE2_H ++ found = pcre2_match(regexp.regex_ptr, fullCommand, strlen(fullCommand), 0, 0, ndx_match, NULL); ++#elif HAVE_PCRE_H + found = pcre_exec(regexp.regex_ptr, NULL, fullCommand, strlen(fullCommand), 0, 0, found_ndx, 30); ++#endif + if (found > 0) { + i++; + } + } + ITERATOR_RELEASE( it ); +- ++#ifdef HAVE_PCRE2_H ++ pcre2_match_data_free(ndx_match); ++#endif + return i; + } + #endif /* HAVE_PCRE_H */ +--- a/agent/mibgroup/if-mib/data_access/interface.c ++++ b/agent/mibgroup/if-mib/data_access/interface.c +@@ -16,7 +16,11 @@ + #include "if-mib/ifTable/ifTable.h" + #include "if-mib/data_access/interface.h" + #include "interface_private.h" +-#if HAVE_PCRE_H ++ ++#if defined(HAVE_PCRE2_H) ++#define PCRE2_CODE_UNIT_WIDTH 8 ++#include ++#elif defined(HAVE_PCRE_H) + #include + #elif HAVE_REGEX_H + #include +@@ -840,7 +844,13 @@ int netsnmp_access_interface_max_reached + int netsnmp_access_interface_include(const char *name) + { + netsnmp_include_if_list *if_ptr; +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) ++ //pcre_exec->pcre2_match ++ //ovector->pcre2_match_data ++ pcre2_match_data *ndx_match; ++ ndx_match = pcre2_match_data_create(3, NULL); ++ int *found_ndx = pcre2_get_ovector_pointer(ndx_match); ++#elif defined(HAVE_PCRE_H) + int found_ndx[3]; + #endif + +@@ -856,7 +866,13 @@ int netsnmp_access_interface_include(con + + + for (if_ptr = include_list; if_ptr; if_ptr = if_ptr->next) { +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) ++ if (pcre2_match(if_ptr->regex_ptr, name, strlen(name), 0, 0, ++ ndx_match, NULL) >= 0) { ++ pcre2_match_data_free(ndx_match); ++ return TRUE; ++ } ++#elif defined(HAVE_PCRE_H) + if (pcre_exec(if_ptr->regex_ptr, NULL, name, strlen(name), 0, 0, + found_ndx, 3) >= 0) + return TRUE; +@@ -869,6 +885,9 @@ int netsnmp_access_interface_include(con + #endif + } + ++#if defined(HAVE_PCRE2_H) ++ pcre2_match_data_free(ndx_match); ++#endif + return FALSE; + } + +@@ -980,7 +999,13 @@ _parse_include_if_config(const char *tok + { + netsnmp_include_if_list *if_ptr, *if_new; + char *name, *st; +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) ++ //we can only get the message upon calling pcre2_error_message. ++ // so an additional variable is required. ++ int pcre2_err_code; ++ unsigned char pcre2_error[128]; ++ int pcre2_error_offset; ++#elif defined(HAVE_PCRE_H) + const char *pcre_error; + int pcre_error_offset; + #elif HAVE_REGEX_H +@@ -1012,7 +1037,15 @@ _parse_include_if_config(const char *tok + config_perror("Out of memory"); + goto err; + } +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) ++ if_new->regex_ptr = pcre2_compile(if_new->name, PCRE2_ZERO_TERMINATED, 0, ++ &pcre2_err_code, &pcre2_error_offset, NULL); ++ if (!if_new->regex_ptr) { ++ pcre2_get_error_message(pcre2_err_code, pcre2_error, 128); ++ config_perror(pcre2_error); ++ goto err; ++ } ++#elif defined(HAVE_PCRE_H) + if_new->regex_ptr = pcre_compile(if_new->name, 0, &pcre_error, + &pcre_error_offset, NULL); + if (!if_new->regex_ptr) { +@@ -1048,7 +1081,7 @@ _parse_include_if_config(const char *tok + + err: + if (if_new) { +-#if defined(HAVE_PCRE_H) || defined(HAVE_REGEX_H) ++#if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) || defined(HAVE_REGEX_H) + free(if_new->regex_ptr); + #endif + free(if_new->name); +@@ -1063,7 +1096,7 @@ _free_include_if_config(void) + + while (if_ptr) { + if_next = if_ptr->next; +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) + free(if_ptr->regex_ptr); + #elif HAVE_REGEX_H + regfree(if_ptr->regex_ptr); +--- a/agent/mibgroup/struct.h ++++ b/agent/mibgroup/struct.h +@@ -30,7 +30,7 @@ struct extensible { + + struct myproc { + char name[STRMAX]; +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) + netsnmp_regex_ptr regexp; + #endif + char fixcmd[STRMAX]; +--- a/agent/mibgroup/ucd-snmp/proc.c ++++ b/agent/mibgroup/ucd-snmp/proc.c +@@ -39,7 +39,10 @@ + # include + # endif + #endif +-#if HAVE_PCRE_H ++#ifdef HAVE_PCRE2_H ++#define PCRE2_CODE_UNIT_WIDTH 8 ++#include ++#elif HAVE_PCRE_H + #include + #endif + +@@ -108,7 +111,7 @@ init_proc(void) + REGISTER_MIB("ucd-snmp/proc", extensible_proc_variables, variable2, + proc_variables_oid); + +-#ifdef HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) + #define proc_parse_usage "process-name [max-num] [min-num] [regexp]" + #else + #define proc_parse_usage "process-name [max-num] [min-num]" +@@ -134,7 +137,7 @@ proc_free_config(void) + for (ptmp = procwatch; ptmp != NULL;) { + ptmp2 = ptmp; + ptmp = ptmp->next; +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) + free(ptmp2->regexp.regex_ptr); + #endif + free(ptmp2); +@@ -208,7 +211,7 @@ proc_parse_config(const char *token, cha + if (*procp == NULL) + return; /* memory alloc error */ + numprocs++; +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) + (*procp)->regexp.regex_ptr = NULL; + #endif + /* +@@ -220,18 +223,31 @@ proc_parse_config(const char *token, cha + cptr = skip_not_white(cptr); + if ((cptr = skip_white(cptr))) { + (*procp)->min = atoi(cptr); +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) + cptr = skip_not_white(cptr); + if ((cptr = skip_white(cptr))) { ++ DEBUGMSGTL(("ucd-snmp/regexp_proc", "Loading regex %s\n", cptr)); ++#ifdef HAVE_PCRE2_H ++ unsigned char pcre2_error_msg[128]; ++ int pcre2_err_code; ++ int pcre2_error_offset; ++ ++ (*procp)->regexp.regex_ptr = ++ pcre2_compile(cptr, PCRE2_ZERO_TERMINATED, 0, &pcre2_err_code, &pcre2_error_offset, NULL); ++ pcre2_get_error_message(pcre2_err_code, pcre2_error_msg, 128); ++ if ((*procp)->regexp.regex_ptr == NULL) { ++ config_perror(pcre2_error_msg); ++ } ++#elif HAVE_PCRE_H + const char *pcre_error; + int pcre_error_offset; + +- DEBUGMSGTL(("ucd-snmp/regexp_proc", "Loading regex %s\n", cptr)); + (*procp)->regexp.regex_ptr = + pcre_compile(cptr, 0, &pcre_error, &pcre_error_offset, NULL); + if ((*procp)->regexp.regex_ptr == NULL) { + config_perror(pcre_error); + } ++#endif + } + #endif + } else +@@ -390,7 +406,7 @@ sh_count_myprocs(struct myproc *proc) + if (proc == NULL) + return 0; + +-#if defined(USING_HOST_DATA_ACCESS_SWRUN_MODULE) && defined(HAVE_PCRE_H) ++#if defined(USING_HOST_DATA_ACCESS_SWRUN_MODULE) && (defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H)) + if (proc->regexp.regex_ptr != NULL) + return sh_count_procs_by_regex(proc->name, proc->regexp); + #endif +@@ -406,7 +422,7 @@ sh_count_procs(char *procname) + return swrun_count_processes_by_name( procname ); + } + +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) + netsnmp_feature_require(swrun_count_processes_by_regex); + int + sh_count_procs_by_regex(char *procname, netsnmp_regex_ptr regexp) +--- a/agent/mibgroup/ucd-snmp/proc.h ++++ b/agent/mibgroup/ucd-snmp/proc.h +@@ -12,7 +12,7 @@ config_require(util_funcs) + extern WriteMethod fixProcError; + int sh_count_myprocs(struct myproc *); + int sh_count_procs(char *); +-#ifdef HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) + int sh_count_procs_by_regex(char *, netsnmp_regex_ptr); + #endif + +--- a/configure.d/config_os_libs1 ++++ b/configure.d/config_os_libs1 +@@ -97,6 +97,32 @@ LIBS="$netsnmp_save_LIBS" + # + # regex in process table + # ++if test "x$with_pcre2" != "xno"; then ++ AC_CHECK_HEADER([pcre2.h], [ ++ AC_DEFINE([HAVE_PCRE2_H], [1], [Define to 1 if you have .]) ++ pcre2_h=yes ++ ], ++ [pcre2_h=no], [#define PCRE2_CODE_UNIT_WIDTH 8] ++ ) ++fi ++if test "x$pcre2header_h" = "xno" -o "x$pcre2_h" = "xno" ; then ++ if test "x$with_pcre2" = "xyes" ; then ++ AC_MSG_ERROR([Could not find the pcre2 header file needed and was specifically asked to use pcre2 support]) ++ else ++ with_pcre2=no ++ fi ++fi ++ ++if test "x$with_pcre2" != "xno"; then ++ NETSNMP_SEARCH_LIBS([pcre2_match_8], [pcre2-8], [ ++ LMIBLIBS="$LMIBLIBS -lpcre2-8" ++ ],,, LAGENTLIBS) ++ AC_SUBST(LAGENTLIBS) ++ AC_SUBST(LMIBLIBS) ++fi ++ ++if test "x$with_pcre2" != "xyes"; then ++ + if test "x$with_pcre" != "xno"; then + AC_CHECK_HEADER([pcre.h], [ + AC_DEFINE([HAVE_PCRE_H], [1], [Define to 1 if you have .]) +@@ -121,3 +147,4 @@ NETSNMP_SEARCH_LIBS([pcre_exec], [pcre], + ],,, LAGENTLIBS) + AC_SUBST(LAGENTLIBS) + AC_SUBST(LMIBLIBS) ++fi +--- a/configure.d/config_project_with_enable ++++ b/configure.d/config_project_with_enable +@@ -160,6 +160,10 @@ NETSNMP_ARG_WITH(rpm, + management system when building the host MIB + module.]) + ++NETSNMP_ARG_WITH(pcre2-8, ++[ --without-pcre2 Don't include pcre2 process searching ++ support in the agent.], ++ with_pcre2="$withval", with_pcre2="maybe") + + NETSNMP_ARG_WITH(pcre, + [ --without-pcre Don't include pcre process searching +--- a/include/net-snmp/data_access/interface.h ++++ b/include/net-snmp/data_access/interface.h +@@ -10,7 +10,10 @@ + extern "C" { + #endif + +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) ++#define PCRE2_CODE_UNIT_WIDTH 8 ++#include ++#elif defined(HAVE_PCRE_H) + #include + #elif HAVE_REGEX_H + #include +@@ -211,7 +214,9 @@ typedef struct _conf_if_list { + typedef netsnmp_conf_if_list conf_if_list; /* backwards compat */ + + typedef struct _include_if_list { +-#if HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) ++ pcre2_code *regex_ptr; ++#elif defined(HAVE_PCRE_H) + pcre *regex_ptr; + #elif HAVE_REGEX_H + regex_t *regex_ptr; +--- a/include/net-snmp/data_access/swrun.h ++++ b/include/net-snmp/data_access/swrun.h +@@ -90,7 +90,7 @@ extern "C" { + int swrun_count_processes_by_name( char *name ); + + #if !defined(NETSNMP_FEATURE_REMOVE_SWRUN_COUNT_PROCESSES_BY_REGEX) \ +- && defined(HAVE_PCRE_H) ++ && (defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H)) + int swrun_count_processes_by_regex(char *name, netsnmp_regex_ptr regexp); + #endif + +--- a/include/net-snmp/types.h ++++ b/include/net-snmp/types.h +@@ -63,7 +63,7 @@ typedef long ssize_t; + typedef unsigned long int nfds_t; + #endif + +-#ifdef HAVE_PCRE_H ++#if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) + /* + * Abstract the pcre typedef such that not all *.c files have to include + * . diff --git a/package/network/services/net-snmp/patches/201-Run-autoreconf.patch b/package/network/services/net-snmp/patches/201-Run-autoreconf.patch new file mode 100644 index 0000000000..b71b499cbb --- /dev/null +++ b/package/network/services/net-snmp/patches/201-Run-autoreconf.patch @@ -0,0 +1,185 @@ +From 48b313ca34dbdf303fb232191d4f74e1d0fc9f06 Mon Sep 17 00:00:00 2001 +From: Bart Van Assche +Date: Sun, 21 May 2023 16:20:15 -0700 +Subject: [PATCH] Run autoreconf + +--- + configure | 126 ++++++++++++++++++++++++++ + include/net-snmp/net-snmp-config.h.in | 3 + + 2 files changed, 129 insertions(+) + +--- a/configure ++++ b/configure +@@ -898,6 +898,8 @@ with_dnssec + enable_dnssec + with_rpm + enable_rpm ++with_pcre2_8 ++enable_pcre2_8 + with_pcre + enable_pcre + with_install_prefix +@@ -1810,6 +1812,8 @@ Compiler Options: + --without-rpm Don't include support for the RPM package + management system when building the host MIB + module. ++ --without-pcre2 Don't include pcre2 process searching ++ support in the agent. + --without-pcre Don't include pcre process searching + support in the agent. + --with-install-prefix=PATH Just for installing, prefix all +@@ -4907,6 +4911,21 @@ fi + + + ++# Check whether --with-pcre2-8 was given. ++if test ${with_pcre2_8+y} ++then : ++ withval=$with_pcre2_8; with_pcre2="$withval" ++else $as_nop ++ with_pcre2="maybe" ++fi ++ ++ # Check whether --enable-pcre2-8 was given. ++if test ${enable_pcre2_8+y} ++then : ++ enableval=$enable_pcre2_8; as_fn_error $? "Invalid option. Use --with-pcre2-8/--without-pcre2-8 instead" "$LINENO" 5 ++fi ++ ++ + + # Check whether --with-pcre was given. + if test "${with_pcre+set}" = set; then : +@@ -22321,6 +22340,112 @@ LIBS="$netsnmp_save_LIBS" + # + # regex in process table + # ++if test "x$with_pcre2" != "xno"; then ++ ac_fn_c_check_header_compile "$LINENO" "pcre2.h" "ac_cv_header_pcre2_h" "#define PCRE2_CODE_UNIT_WIDTH 8 ++ ++" ++if test "x$ac_cv_header_pcre2_h" = xyes ++then : ++ ++ ++printf "%s\n" "#define HAVE_PCRE2_H 1" >>confdefs.h ++ ++ pcre2_h=yes ++ ++else $as_nop ++ pcre2_h=no ++fi ++ ++fi ++if test "x$pcre2header_h" = "xno" -o "x$pcre2_h" = "xno" ; then ++ if test "x$with_pcre2" = "xyes" ; then ++ as_fn_error $? "Could not find the pcre2 header file needed and was specifically asked to use pcre2 support" "$LINENO" 5 ++ else ++ with_pcre2=no ++ fi ++fi ++ ++if test "x$with_pcre2" != "xno"; then ++ ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing pcre2_match_8" >&5 ++printf %s "checking for library containing pcre2_match_8... " >&6; } ++if test ${netsnmp_cv_func_pcre2_match_8_LAGENTLIBS+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ netsnmp_func_search_save_LIBS="$LIBS" ++ netsnmp_target_val="$LAGENTLIBS" ++ netsnmp_temp_LIBS="${netsnmp_target_val} ${LIBS}" ++ netsnmp_result=no ++ LIBS="${netsnmp_temp_LIBS}" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++char pcre2_match_8 (); ++int ++main (void) ++{ ++return pcre2_match_8 (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO" ++then : ++ netsnmp_result="none required" ++else $as_nop ++ for netsnmp_cur_lib in pcre2-8 ; do ++ LIBS="-l${netsnmp_cur_lib} ${netsnmp_temp_LIBS}" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++char pcre2_match_8 (); ++int ++main (void) ++{ ++return pcre2_match_8 (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO" ++then : ++ netsnmp_result=-l${netsnmp_cur_lib} ++ break ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ ++ conftest$ac_exeext conftest.$ac_ext ++ done ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ ++ conftest$ac_exeext conftest.$ac_ext ++ LIBS="${netsnmp_func_search_save_LIBS}" ++ netsnmp_cv_func_pcre2_match_8_LAGENTLIBS="${netsnmp_result}" ++fi ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $netsnmp_cv_func_pcre2_match_8_LAGENTLIBS" >&5 ++printf "%s\n" "$netsnmp_cv_func_pcre2_match_8_LAGENTLIBS" >&6; } ++ if test "${netsnmp_cv_func_pcre2_match_8_LAGENTLIBS}" != "no" ; then ++ if test "${netsnmp_cv_func_pcre2_match_8_LAGENTLIBS}" != "none required" ; then ++ LAGENTLIBS="${netsnmp_result} ${netsnmp_target_val}" ++ fi ++ ++ LMIBLIBS="$LMIBLIBS -lpcre2-8" ++ ++ ++ fi ++ ++ ++ ++fi ++ ++if test "x$with_pcre2" != "xyes"; then ++ + if test "x$with_pcre" != "xno"; then + ac_fn_c_check_header_mongrel "$LINENO" "pcre.h" "ac_cv_header_pcre_h" "$ac_includes_default" + if test "x$ac_cv_header_pcre_h" = xyes; then : +@@ -25886,6 +26011,7 @@ done + + + fi ++fi + + + +--- a/include/net-snmp/net-snmp-config.h.in ++++ b/include/net-snmp/net-snmp-config.h.in +@@ -722,6 +722,9 @@ + /* Define to 1 if you have the header file. */ + #undef HAVE_PCI_PCI_H + ++/* Define to 1 if you have . */ ++#undef HAVE_PCRE2_H ++ + /* Define to 1 if you have . */ + #undef HAVE_PCRE_H + diff --git a/package/network/services/net-snmp/patches/202-Improve-pcre2-support.patch b/package/network/services/net-snmp/patches/202-Improve-pcre2-support.patch new file mode 100644 index 0000000000..4bd80603ba --- /dev/null +++ b/package/network/services/net-snmp/patches/202-Improve-pcre2-support.patch @@ -0,0 +1,152 @@ +From 346b6f8959513320e5b674fd670c49ba2cd43af5 Mon Sep 17 00:00:00 2001 +From: Bart Van Assche +Date: Sun, 21 May 2023 16:18:56 -0700 +Subject: [PATCH] Improve pcre2 support + +Fix compiler warnings. Convert C++ comments to C comments. Make sure that +declarations occur before statements. +--- + agent/mibgroup/host/data_access/swrun.c | 17 ++++------ + agent/mibgroup/if-mib/data_access/interface.c | 32 ++++++++++--------- + agent/mibgroup/ucd-snmp/proc.c | 13 +++++--- + 3 files changed, 31 insertions(+), 31 deletions(-) + +--- a/agent/mibgroup/host/data_access/swrun.c ++++ b/agent/mibgroup/host/data_access/swrun.c +@@ -111,10 +111,7 @@ swrun_count_processes_by_regex( char *na + netsnmp_iterator *it; + int i = 0; + #ifdef HAVE_PCRE2_H +- pcre2_match_data *ndx_match; +- int *found_ndx; +- ndx_match = pcre2_match_data_create(30, NULL); +- found_ndx = pcre2_get_ovector_pointer(ndx_match); ++ pcre2_match_data *ndx_match = pcre2_match_data_create(30, NULL); + #elif HAVE_PCRE_H + int found_ndx[30]; + #endif +@@ -122,22 +119,20 @@ swrun_count_processes_by_regex( char *na + char fullCommand[64 + 128 + 128 + 3]; + + netsnmp_cache_check_and_reload(swrun_cache); +- if ( !swrun_container || !name || !regexp.regex_ptr ) ++ if ( !swrun_container || !name || !regexp.regex_ptr ) { + #ifdef HAVE_PCRE2_H +- { + pcre2_match_data_free(ndx_match); +- return 0; +- } +-#else +- return 0; /* or -1 */ + #endif ++ return 0; /* or -1 */ ++ } + + it = CONTAINER_ITERATOR( swrun_container ); + while ((entry = (netsnmp_swrun_entry*)ITERATOR_NEXT( it )) != NULL) { + /* need to assemble full command back so regexps can get full picture */ + sprintf(fullCommand, "%s %s", entry->hrSWRunPath, entry->hrSWRunParameters); + #ifdef HAVE_PCRE2_H +- found = pcre2_match(regexp.regex_ptr, fullCommand, strlen(fullCommand), 0, 0, ndx_match, NULL); ++ found = pcre2_match(regexp.regex_ptr, (unsigned char *)fullCommand, ++ strlen(fullCommand), 0, 0, ndx_match, NULL); + #elif HAVE_PCRE_H + found = pcre_exec(regexp.regex_ptr, NULL, fullCommand, strlen(fullCommand), 0, 0, found_ndx, 30); + #endif +--- a/agent/mibgroup/if-mib/data_access/interface.c ++++ b/agent/mibgroup/if-mib/data_access/interface.c +@@ -844,12 +844,8 @@ int netsnmp_access_interface_max_reached + int netsnmp_access_interface_include(const char *name) + { + netsnmp_include_if_list *if_ptr; +-#if defined(HAVE_PCRE2_H) +- //pcre_exec->pcre2_match +- //ovector->pcre2_match_data +- pcre2_match_data *ndx_match; +- ndx_match = pcre2_match_data_create(3, NULL); +- int *found_ndx = pcre2_get_ovector_pointer(ndx_match); ++#if defined(HAVE_PCRE2_H) ++ pcre2_match_data *ndx_match = pcre2_match_data_create(3, NULL); + #elif defined(HAVE_PCRE_H) + int found_ndx[3]; + #endif +@@ -867,8 +863,8 @@ int netsnmp_access_interface_include(con + + for (if_ptr = include_list; if_ptr; if_ptr = if_ptr->next) { + #if defined(HAVE_PCRE2_H) +- if (pcre2_match(if_ptr->regex_ptr, name, strlen(name), 0, 0, +- ndx_match, NULL) >= 0) { ++ if (pcre2_match(if_ptr->regex_ptr, (const unsigned char *)name, ++ strlen(name), 0, 0, ndx_match, NULL) >= 0) { + pcre2_match_data_free(ndx_match); + return TRUE; + } +@@ -1000,11 +996,13 @@ _parse_include_if_config(const char *tok + netsnmp_include_if_list *if_ptr, *if_new; + char *name, *st; + #if defined(HAVE_PCRE2_H) +- //we can only get the message upon calling pcre2_error_message. +- // so an additional variable is required. ++ /* ++ * We can only get the message upon calling pcre2_error_message. ++ * so an additional variable is required. ++ */ + int pcre2_err_code; +- unsigned char pcre2_error[128]; +- int pcre2_error_offset; ++ char pcre2_error[128]; ++ size_t pcre2_error_offset; + #elif defined(HAVE_PCRE_H) + const char *pcre_error; + int pcre_error_offset; +@@ -1038,10 +1036,14 @@ _parse_include_if_config(const char *tok + goto err; + } + #if defined(HAVE_PCRE2_H) +- if_new->regex_ptr = pcre2_compile(if_new->name, PCRE2_ZERO_TERMINATED, 0, +- &pcre2_err_code, &pcre2_error_offset, NULL); ++ if_new->regex_ptr = pcre2_compile((const unsigned char *)if_new->name, ++ PCRE2_ZERO_TERMINATED, 0, ++ &pcre2_err_code, &pcre2_error_offset, ++ NULL); + if (!if_new->regex_ptr) { +- pcre2_get_error_message(pcre2_err_code, pcre2_error, 128); ++ pcre2_get_error_message(pcre2_err_code, ++ (unsigned char *)pcre2_error, ++ sizeof(pcre2_error)); + config_perror(pcre2_error); + goto err; + } +--- a/agent/mibgroup/ucd-snmp/proc.c ++++ b/agent/mibgroup/ucd-snmp/proc.c +@@ -226,15 +226,17 @@ proc_parse_config(const char *token, cha + #if defined(HAVE_PCRE2_H) || defined(HAVE_PCRE_H) + cptr = skip_not_white(cptr); + if ((cptr = skip_white(cptr))) { +- DEBUGMSGTL(("ucd-snmp/regexp_proc", "Loading regex %s\n", cptr)); + #ifdef HAVE_PCRE2_H +- unsigned char pcre2_error_msg[128]; ++ char pcre2_error_msg[128]; + int pcre2_err_code; +- int pcre2_error_offset; ++ size_t pcre2_error_offset; + ++ DEBUGMSGTL(("ucd-snmp/regexp_proc", "Loading regex %s\n", cptr)); + (*procp)->regexp.regex_ptr = +- pcre2_compile(cptr, PCRE2_ZERO_TERMINATED, 0, &pcre2_err_code, &pcre2_error_offset, NULL); +- pcre2_get_error_message(pcre2_err_code, pcre2_error_msg, 128); ++ pcre2_compile((const unsigned char *)cptr, PCRE2_ZERO_TERMINATED, 0, &pcre2_err_code, &pcre2_error_offset, NULL); ++ pcre2_get_error_message(pcre2_err_code, ++ (unsigned char *)pcre2_error_msg, ++ sizeof(pcre2_error_msg)); + if ((*procp)->regexp.regex_ptr == NULL) { + config_perror(pcre2_error_msg); + } +@@ -242,6 +244,7 @@ proc_parse_config(const char *token, cha + const char *pcre_error; + int pcre_error_offset; + ++ DEBUGMSGTL(("ucd-snmp/regexp_proc", "Loading regex %s\n", cptr)); + (*procp)->regexp.regex_ptr = + pcre_compile(cptr, 0, &pcre_error, &pcre_error_offset, NULL); + if ((*procp)->regexp.regex_ptr == NULL) { diff --git a/package/network/services/net-snmp/patches/203-if-mib-data_access-interface.c-plug-a-leak-with-pcre.patch b/package/network/services/net-snmp/patches/203-if-mib-data_access-interface.c-plug-a-leak-with-pcre.patch new file mode 100644 index 0000000000..e2da12f17e --- /dev/null +++ b/package/network/services/net-snmp/patches/203-if-mib-data_access-interface.c-plug-a-leak-with-pcre.patch @@ -0,0 +1,30 @@ +From e5aadf1e78c624a8e4147d4b70a7795497a50e73 Mon Sep 17 00:00:00 2001 +From: Niels Baggesen +Date: Mon, 22 May 2023 18:44:36 +0200 +Subject: [PATCH] if-mib/data_access/interface.c: plug a leak with pcre2 + +--- + agent/mibgroup/if-mib/data_access/interface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +--- a/agent/mibgroup/if-mib/data_access/interface.c ++++ b/agent/mibgroup/if-mib/data_access/interface.c +@@ -845,7 +845,7 @@ int netsnmp_access_interface_include(con + { + netsnmp_include_if_list *if_ptr; + #if defined(HAVE_PCRE2_H) +- pcre2_match_data *ndx_match = pcre2_match_data_create(3, NULL); ++ pcre2_match_data *ndx_match; + #elif defined(HAVE_PCRE_H) + int found_ndx[3]; + #endif +@@ -860,6 +860,9 @@ int netsnmp_access_interface_include(con + */ + return TRUE; + ++#if defined(HAVE_PCRE2_H) ++ ndx_match = pcre2_match_data_create(3, NULL); ++#endif + + for (if_ptr = include_list; if_ptr; if_ptr = if_ptr->next) { + #if defined(HAVE_PCRE2_H) diff --git a/package/network/utils/net-snmp/patches/750-ieee802dot11.patch b/package/network/services/net-snmp/patches/750-ieee802dot11.patch similarity index 100% rename from package/network/utils/net-snmp/patches/750-ieee802dot11.patch rename to package/network/services/net-snmp/patches/750-ieee802dot11.patch diff --git a/package/network/utils/net-snmp/patches/900-musl-compat.patch b/package/network/services/net-snmp/patches/900-musl-compat.patch similarity index 100% rename from package/network/utils/net-snmp/patches/900-musl-compat.patch rename to package/network/services/net-snmp/patches/900-musl-compat.patch diff --git a/package/network/services/odhcpd/Makefile b/package/network/services/odhcpd/Makefile index 5db37c55f4..7cb125da2b 100644 --- a/package/network/services/odhcpd/Makefile +++ b/package/network/services/odhcpd/Makefile @@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=odhcpd -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/odhcpd.git -PKG_SOURCE_DATE:=2022-03-22 -PKG_SOURCE_VERSION:=860ca900e41c5d0f98cc85e67b39977f6f2cb355 -PKG_MIRROR_HASH:=555712a1e25d197e52808a0d5e42bf0d48a8b61fe7c8aad1a02a7c09f0b8b8a3 +PKG_MIRROR_HASH:=9936331b64880260cf969cc5656e1e1a8b7dc0e0843d64621242c500a330b4d6 +PKG_SOURCE_DATE:=2023-10-24 +PKG_SOURCE_VERSION:=d8118f6e76e5519881f9a37137c3a06b3cb60fd2 PKG_MAINTAINER:=Hans Dedecker PKG_LICENSE:=GPL-2.0 diff --git a/package/network/services/openvpn/Config-mbedtls.in b/package/network/services/openvpn/Config-mbedtls.in new file mode 100644 index 0000000000..3cf233b8f7 --- /dev/null +++ b/package/network/services/openvpn/Config-mbedtls.in @@ -0,0 +1,54 @@ +if PACKAGE_openvpn-mbedtls + +config OPENVPN_mbedtls_ENABLE_LZO + bool "Enable LZO compression support" + default n + +config OPENVPN_mbedtls_ENABLE_LZ4 + bool "Enable LZ4 compression support" + default y + +#config OPENVPN_mbedtls_ENABLE_EUREPHIA +# bool "Enable support for the eurephia plug-in" +# default n + +config OPENVPN_mbedtls_ENABLE_MANAGEMENT + bool "Enable management server support" + default n + +#config OPENVPN_mbedtls_ENABLE_PKCS11 +# bool "Enable pkcs11 support" +# default n + +config OPENVPN_mbedtls_ENABLE_FRAGMENT + bool "Enable internal fragmentation support (--fragment)" + default y + +config OPENVPN_mbedtls_ENABLE_MULTIHOME + bool "Enable multi-homed UDP server support (--multihome)" + default y + +config OPENVPN_mbedtls_ENABLE_PORT_SHARE + bool "Enable TCP server port-share support (--port-share)" + default y + +config OPENVPN_mbedtls_ENABLE_DEF_AUTH + bool "Enable deferred authentication" + default y + +config OPENVPN_mbedtls_ENABLE_PF + bool "Enable internal packet filter" + default y + +config OPENVPN_mbedtls_ENABLE_IPROUTE2 + bool "Enable support for iproute2" + default n + +config OPENVPN_mbedtls_ENABLE_SMALL + bool "Enable size optimization" + default y + help + enable smaller executable size (disable OCC, usage + message, and verb 4 parm list) + +endif diff --git a/package/network/services/openvpn/Config-openssl.in b/package/network/services/openvpn/Config-openssl.in new file mode 100644 index 0000000000..7a7be74db9 --- /dev/null +++ b/package/network/services/openvpn/Config-openssl.in @@ -0,0 +1,58 @@ +if PACKAGE_openvpn-openssl + +config OPENVPN_openssl_ENABLE_LZO + bool "Enable LZO compression support" + default y + +config OPENVPN_openssl_ENABLE_LZ4 + bool "Enable LZ4 compression support" + default y + +config OPENVPN_openssl_ENABLE_X509_ALT_USERNAME + bool "Enable the --x509-username-field feature" + default n + +#config OPENVPN_openssl_ENABLE_EUREPHIA +# bool "Enable support for the eurephia plug-in" +# default n + +config OPENVPN_openssl_ENABLE_MANAGEMENT + bool "Enable management server support" + default n + +#config OPENVPN_openssl_ENABLE_PKCS11 +# bool "Enable pkcs11 support" +# default n + +config OPENVPN_openssl_ENABLE_FRAGMENT + bool "Enable internal fragmentation support (--fragment)" + default y + +config OPENVPN_openssl_ENABLE_MULTIHOME + bool "Enable multi-homed UDP server support (--multihome)" + default y + +config OPENVPN_openssl_ENABLE_PORT_SHARE + bool "Enable TCP server port-share support (--port-share)" + default y + +config OPENVPN_openssl_ENABLE_DEF_AUTH + bool "Enable deferred authentication" + default y + +config OPENVPN_openssl_ENABLE_PF + bool "Enable internal packet filter" + default y + +config OPENVPN_openssl_ENABLE_IPROUTE2 + bool "Enable support for iproute2" + default n + +config OPENVPN_openssl_ENABLE_SMALL + bool "Enable size optimization" + default y + help + enable smaller executable size (disable OCC, usage + message, and verb 4 parm list) + +endif diff --git a/package/network/services/openvpn/Config-wolfssl.in b/package/network/services/openvpn/Config-wolfssl.in new file mode 100644 index 0000000000..ef8b9dcb34 --- /dev/null +++ b/package/network/services/openvpn/Config-wolfssl.in @@ -0,0 +1,63 @@ +if PACKAGE_openvpn-wolfssl + +config OPENVPN_wolfssl + bool + default y + select WOLFSSL_HAS_OPENVPN + +config OPENVPN_wolfssl_ENABLE_LZO + bool "Enable LZO compression support" + default n + +config OPENVPN_wolfssl_ENABLE_LZ4 + bool "Enable LZ4 compression support" + default y + +config OPENVPN_wolfssl_ENABLE_X509_ALT_USERNAME + bool "Enable the --x509-username-field feature" + default n + +#config OPENVPN_wolfssl_ENABLE_EUREPHIA +# bool "Enable support for the eurephia plug-in" +# default n + +config OPENVPN_wolfssl_ENABLE_MANAGEMENT + bool "Enable management server support" + default n + +#config OPENVPN_wolfssl_ENABLE_PKCS11 +# bool "Enable pkcs11 support" +# default n + +config OPENVPN_wolfssl_ENABLE_FRAGMENT + bool "Enable internal fragmentation support (--fragment)" + default y + +config OPENVPN_wolfssl_ENABLE_MULTIHOME + bool "Enable multi-homed UDP server support (--multihome)" + default y + +config OPENVPN_wolfssl_ENABLE_PORT_SHARE + bool "Enable TCP server port-share support (--port-share)" + default y + +config OPENVPN_wolfssl_ENABLE_DEF_AUTH + bool "Enable deferred authentication" + default y + +config OPENVPN_wolfssl_ENABLE_PF + bool "Enable internal packet filter" + default y + +config OPENVPN_wolfssl_ENABLE_IPROUTE2 + bool "Enable support for iproute2" + default n + +config OPENVPN_wolfssl_ENABLE_SMALL + bool "Enable size optimization" + default y + help + enable smaller executable size (disable OCC, usage + message, and verb 4 parm list) + +endif diff --git a/package/network/services/openvpn/Makefile b/package/network/services/openvpn/Makefile new file mode 100644 index 0000000000..ac76841b8b --- /dev/null +++ b/package/network/services/openvpn/Makefile @@ -0,0 +1,149 @@ +# +# Copyright (C) 2010-2015 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=openvpn + +PKG_VERSION:=2.5.8 +PKG_RELEASE:=3 + +PKG_SOURCE_URL:=\ + https://build.openvpn.net/downloads/releases/ \ + https://swupdate.openvpn.net/community/releases/ +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_HASH:=2bbd0026469902037ee6499b68283d5ab36c74e36cae3112082cfdf6c77a0c57 + +PKG_MAINTAINER:=Magnus Kroken + +PKG_INSTALL:=1 +PKG_FIXUP:=autoreconf +PKG_BUILD_PARALLEL:=1 +PKG_BUILD_FLAGS:=gc-sections +PKG_LICENSE:=GPL-2.0 +PKG_CPE_ID:=cpe:/a:openvpn:openvpn + +include $(INCLUDE_DIR)/package.mk + +define Package/openvpn/Default + TITLE:=Open source VPN solution using $(2) + SECTION:=net + CATEGORY:=Network + URL:=http://openvpn.net + SUBMENU:=VPN + MENU:=1 + DEPENDS:=+kmod-tun +OPENVPN_$(1)_ENABLE_LZO:liblzo +OPENVPN_$(1)_ENABLE_IPROUTE2:ip $(3) + VARIANT:=$(1) + PROVIDES:=openvpn openvpn-crypto +endef + +Package/openvpn-openssl=$(call Package/openvpn/Default,openssl,OpenSSL,+PACKAGE_openvpn-openssl:libopenssl) +Package/openvpn-mbedtls=$(call Package/openvpn/Default,mbedtls,mbedTLS,+PACKAGE_openvpn-mbedtls:libmbedtls) +Package/openvpn-wolfssl=$(call Package/openvpn/Default,wolfssl,WolfSSL \(experimental\),+PACKAGE_openvpn-wolfssl:libwolfssl) + +define Package/openvpn/config/Default + source "$(SOURCE)/Config-$(1).in" +endef + +Package/openvpn-openssl/config=$(call Package/openvpn/config/Default,openssl) +Package/openvpn-mbedtls/config=$(call Package/openvpn/config/Default,mbedtls) +Package/openvpn-wolfssl/config=$(call Package/openvpn/config/Default,wolfssl) + +ifeq ($(BUILD_VARIANT),mbedtls) +CONFIG_OPENVPN_MBEDTLS:=y +endif +ifeq ($(BUILD_VARIANT),openssl) +CONFIG_OPENVPN_OPENSSL:=y +endif +ifeq ($(BUILD_VARIANT),wolfssl) +CONFIG_OPENVPN_WOLFSSL:=y +endif + +CONFIGURE_VARS += \ + IPROUTE=/sbin/ip \ + NETSTAT=/sbin/netstat + +define Build/Configure + $(call Build/Configure/Default, \ + $(if $(CONFIG_OPENVPN_$(BUILD_VARIANT)_ENABLE_SMALL),--enable-small) \ + --disable-selinux \ + --disable-systemd \ + --disable-plugins \ + --disable-debug \ + --disable-pkcs11 \ + $(if $(CONFIG_OPENVPN_$(BUILD_VARIANT)_ENABLE_LZO),--enable,--disable)-lzo \ + $(if $(CONFIG_OPENVPN_$(BUILD_VARIANT)_ENABLE_LZ4),--enable,--disable)-lz4 \ + $(if $(CONFIG_OPENVPN_$(BUILD_VARIANT)_ENABLE_X509_ALT_USERNAME),--enable,--disable)-x509-alt-username \ + $(if $(CONFIG_OPENVPN_$(BUILD_VARIANT)_ENABLE_MANAGEMENT),--enable,--disable)-management \ + $(if $(CONFIG_OPENVPN_$(BUILD_VARIANT)_ENABLE_FRAGMENT),--enable,--disable)-fragment \ + $(if $(CONFIG_OPENVPN_$(BUILD_VARIANT)_ENABLE_MULTIHOME),--enable,--disable)-multihome \ + $(if $(CONFIG_OPENVPN_$(BUILD_VARIANT)_ENABLE_IPROUTE2),--enable,--disable)-iproute2 \ + $(if $(CONFIG_OPENVPN_$(BUILD_VARIANT)_ENABLE_DEF_AUTH),--enable,--disable)-def-auth \ + $(if $(CONFIG_OPENVPN_$(BUILD_VARIANT)_ENABLE_PF),--enable,--disable)-pf \ + $(if $(CONFIG_OPENVPN_$(BUILD_VARIANT)_ENABLE_PORT_SHARE),--enable,--disable)-port-share \ + $(if $(CONFIG_OPENVPN_OPENSSL),--with-crypto-library=openssl --with-openssl-engine=no) \ + $(if $(CONFIG_OPENVPN_MBEDTLS),--with-crypto-library=mbedtls) \ + $(if $(CONFIG_OPENVPN_WOLFSSL),--with-crypto-library=wolfssl) \ + ) +endef + +define Package/openvpn-$(BUILD_VARIANT)/conffiles +/etc/config/openvpn +/etc/openvpn.user +endef + +define Package/openvpn-$(BUILD_VARIANT)/install + $(INSTALL_DIR) \ + $(1)/usr/sbin \ + $(1)/usr/share/openvpn \ + $(1)/etc/init.d \ + $(1)/etc/config \ + $(1)/etc/openvpn \ + $(1)/lib/functions \ + $(1)/lib/upgrade/keep.d \ + $(1)/usr/libexec \ + $(1)/etc/hotplug.d/openvpn + + $(INSTALL_BIN) \ + $(PKG_INSTALL_DIR)/usr/sbin/openvpn \ + $(1)/usr/sbin/ + + $(INSTALL_BIN) \ + files/openvpn.init \ + $(1)/etc/init.d/openvpn + + $(INSTALL_BIN) \ + files/usr/libexec/openvpn-hotplug \ + $(1)/usr/libexec/openvpn-hotplug + + $(INSTALL_DATA) \ + files/lib/functions/openvpn.sh \ + $(1)/lib/functions/openvpn.sh + + $(INSTALL_DATA) \ + files/etc/hotplug.d/openvpn/01-user \ + $(1)/etc/hotplug.d/openvpn/01-user + + $(INSTALL_DATA) \ + files/etc/openvpn.user \ + $(1)/etc/openvpn.user + + $(INSTALL_DATA) \ + files/openvpn.options \ + $(1)/usr/share/openvpn/openvpn.options + + $(INSTALL_CONF) files/openvpn.config \ + $(1)/etc/config/openvpn + + $(INSTALL_DATA) \ + files/openvpn.upgrade \ + $(1)/lib/upgrade/keep.d/openvpn +endef + +$(eval $(call BuildPackage,openvpn-openssl)) +$(eval $(call BuildPackage,openvpn-mbedtls)) +$(eval $(call BuildPackage,openvpn-wolfssl)) diff --git a/package/network/services/openvpn/files/etc/hotplug.d/openvpn/01-user b/package/network/services/openvpn/files/etc/hotplug.d/openvpn/01-user new file mode 100644 index 0000000000..4c72f1c4bd --- /dev/null +++ b/package/network/services/openvpn/files/etc/hotplug.d/openvpn/01-user @@ -0,0 +1,22 @@ +#!/bin/sh + +[ -e "/etc/openvpn.user" ] && { + env -i ACTION="$ACTION" INSTANCE="$INSTANCE" \ + /bin/sh \ + /etc/openvpn.user \ + $* +} + +# Wrap user defined scripts on up/down events +case "$ACTION" in + up) command=$user_up ;; + down) command=$user_down ;; + *) command= ;; +esac + +if [ -n "$command" ]; then + shift + exec /bin/sh -c "$command $*" +fi + +exit 0 diff --git a/package/network/services/openvpn/files/etc/openvpn.user b/package/network/services/openvpn/files/etc/openvpn.user new file mode 100644 index 0000000000..a77566556a --- /dev/null +++ b/package/network/services/openvpn/files/etc/openvpn.user @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This file is interpreted as shell script. +# Put your custom openvpn action here, they will +# be executed with each opevnp event. +# +# $ACTION +# down action is generated after the TUN/TAP device is closed +# up action is generated after the TUN/TAP device is opened +# $INSTANCE Name of the openvpn instance which went up or down + diff --git a/package/network/services/openvpn/files/lib/functions/openvpn.sh b/package/network/services/openvpn/files/lib/functions/openvpn.sh new file mode 100644 index 0000000000..2de6fb730a --- /dev/null +++ b/package/network/services/openvpn/files/lib/functions/openvpn.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +get_openvpn_option() { + local config="$1" + local variable="$2" + local option="$3" + + local value="$(sed -rne 's/^[ \t]*'"$option"'[ \t]+'"'([^']+)'"'[ \t]*$/\1/p' "$config" | tail -n1)" + [ -n "$value" ] || value="$(sed -rne 's/^[ \t]*'"$option"'[ \t]+"(([^"\\]|\\.)+)"[ \t]*$/\1/p' "$config" | tail -n1 | sed -re 's/\\(.)/\1/g')" + [ -n "$value" ] || value="$(sed -rne 's/^[ \t]*'"$option"'[ \t]+(([^ \t\\]|\\.)+)[ \t]*$/\1/p' "$config" | tail -n1 | sed -re 's/\\(.)/\1/g')" + [ -n "$value" ] || return 1 + + export -n "$variable=$value" + return 0 +} + diff --git a/package/network/services/openvpn/files/openvpn.config b/package/network/services/openvpn/files/openvpn.config new file mode 100644 index 0000000000..ea442c7656 --- /dev/null +++ b/package/network/services/openvpn/files/openvpn.config @@ -0,0 +1,506 @@ +package openvpn + +################################################# +# Sample to include a custom config file. # +################################################# + +config openvpn custom_config + + # Set to 1 to enable this instance: + option enabled 0 + + # Credentials to login + #option username 'login' + #option password 'password' + + # Password for client certificate + #option cert_password 'cert_password' + + # Include OpenVPN configuration + option config /etc/openvpn/my-vpn.conf + + +################################################# +# Sample OpenVPN 2.0 uci config for # +# multi-client server. # +################################################# + +config openvpn sample_server + + # Set to 1 to enable this instance: + option enabled 0 + + # Which local IP address should OpenVPN + # listen on? (optional) +# option local 0.0.0.0 + + # Which TCP/UDP port should OpenVPN listen on? + # If you want to run multiple OpenVPN instances + # on the same machine, use a different port + # number for each one. You will need to + # open up this port on your firewall. + option port 1194 + + # TCP or UDP server? +# option proto tcp + option proto udp + + # "dev tun" will create a routed IP tunnel, + # "dev tap" will create an ethernet tunnel. + # Use "dev tap0" if you are ethernet bridging + # and have precreated a tap0 virtual interface + # and bridged it with your ethernet interface. + # If you want to control access policies + # over the VPN, you must create firewall + # rules for the the TUN/TAP interface. + # On non-Windows systems, you can give + # an explicit unit number, such as tun0. + # On Windows, use "dev-node" for this. + # On most systems, the VPN will not function + # unless you partially or fully disable + # the firewall for the TUN/TAP interface. +# option dev tap + option dev tun + + # SSL/TLS root certificate (ca), certificate + # (cert), and private key (key). Each client + # and the server must have their own cert and + # key file. The server and all clients will + # use the same ca file. + # + # See the "easy-rsa" directory for a series + # of scripts for generating RSA certificates + # and private keys. Remember to use + # a unique Common Name for the server + # and each of the client certificates. + # + # Any X509 key management system can be used. + # OpenVPN can also use a PKCS #12 formatted key file + # (see "pkcs12" directive in man page). + option ca /etc/openvpn/ca.crt + option cert /etc/openvpn/server.crt + # This file should be kept secret: + option key /etc/openvpn/server.key + + # Diffie hellman parameters. + # Generate your own with: + # openssl dhparam -out dh2048.pem 2048 + # Substitute 2048 for 1024 if you are using + # 1024 bit keys. + option dh /etc/openvpn/dh2048.pem + + # Configure server mode and supply a VPN subnet + # for OpenVPN to draw client addresses from. + # The server will take 10.8.0.1 for itself, + # the rest will be made available to clients. + # Each client will be able to reach the server + # on 10.8.0.1. Comment this line out if you are + # ethernet bridging. See the man page for more info. + option server "10.8.0.0 255.255.255.0" + + # Maintain a record of client <-> virtual IP address + # associations in this file. If OpenVPN goes down or + # is restarted, reconnecting clients can be assigned + # the same virtual IP address from the pool that was + # previously assigned. + option ifconfig_pool_persist /tmp/ipp.txt + + # Configure server mode for ethernet bridging. + # You must first use your OS's bridging capability + # to bridge the TAP interface with the ethernet + # NIC interface. Then you must manually set the + # IP/netmask on the bridge interface, here we + # assume 10.8.0.4/255.255.255.0. Finally we + # must set aside an IP range in this subnet + # (start=10.8.0.50 end=10.8.0.100) to allocate + # to connecting clients. Leave this line commented + # out unless you are ethernet bridging. +# option server_bridge "10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100" + + # Push routes to the client to allow it + # to reach other private subnets behind + # the server. Remember that these + # private subnets will also need + # to know to route the OpenVPN client + # address pool (10.8.0.0/255.255.255.0) + # back to the OpenVPN server. +# list push "route 192.168.10.0 255.255.255.0" +# list push "route 192.168.20.0 255.255.255.0" + + # To assign specific IP addresses to specific + # clients or if a connecting client has a private + # subnet behind it that should also have VPN access, + # use the subdirectory "ccd" for client-specific + # configuration files (see man page for more info). + + # EXAMPLE: Suppose the client + # having the certificate common name "Thelonious" + # also has a small subnet behind his connecting + # machine, such as 192.168.40.128/255.255.255.248. + # First, uncomment out these lines: +# option client_config_dir /etc/openvpn/ccd +# list route "192.168.40.128 255.255.255.248" + # Then create a file ccd/Thelonious with this line: + # iroute 192.168.40.128 255.255.255.248 + # This will allow Thelonious' private subnet to + # access the VPN. This example will only work + # if you are routing, not bridging, i.e. you are + # using "dev tun" and "server" directives. + + # EXAMPLE: Suppose you want to give + # Thelonious a fixed VPN IP address of 10.9.0.1. + # First uncomment out these lines: +# option client_config_dir /etc/openvpn/ccd +# list route "10.9.0.0 255.255.255.252" +# list route "192.168.100.0 255.255.255.0" + # Then add this line to ccd/Thelonious: + # ifconfig-push "10.9.0.1 10.9.0.2" + + # Suppose that you want to enable different + # firewall access policies for different groups + # of clients. There are two methods: + # (1) Run multiple OpenVPN daemons, one for each + # group, and firewall the TUN/TAP interface + # for each group/daemon appropriately. + # (2) (Advanced) Create a script to dynamically + # modify the firewall in response to access + # from different clients. See man + # page for more info on learn-address script. +# option learn_address /etc/openvpn/script + + # If enabled, this directive will configure + # all clients to redirect their default + # network gateway through the VPN, causing + # all IP traffic such as web browsing and + # and DNS lookups to go through the VPN + # (The OpenVPN server machine may need to NAT + # the TUN/TAP interface to the internet in + # order for this to work properly). + # CAVEAT: May break client's network config if + # client's local DHCP server packets get routed + # through the tunnel. Solution: make sure + # client's local DHCP server is reachable via + # a more specific route than the default route + # of 0.0.0.0/0.0.0.0. +# list push "redirect-gateway" + + # Certain Windows-specific network settings + # can be pushed to clients, such as DNS + # or WINS server addresses. CAVEAT: + # http://openvpn.net/faq.html#dhcpcaveats +# list push "dhcp-option DNS 10.8.0.1" +# list push "dhcp-option WINS 10.8.0.1" + + # Uncomment this directive to allow different + # clients to be able to "see" each other. + # By default, clients will only see the server. + # To force clients to only see the server, you + # will also need to appropriately firewall the + # server's TUN/TAP interface. +# option client_to_client 1 + + # Uncomment this directive if multiple clients + # might connect with the same certificate/key + # files or common names. This is recommended + # only for testing purposes. For production use, + # each client should have its own certificate/key + # pair. + # + # IF YOU HAVE NOT GENERATED INDIVIDUAL + # CERTIFICATE/KEY PAIRS FOR EACH CLIENT, + # EACH HAVING ITS OWN UNIQUE "COMMON NAME", + # UNCOMMENT THIS LINE OUT. +# option duplicate_cn 1 + + # The keepalive directive causes ping-like + # messages to be sent back and forth over + # the link so that each side knows when + # the other side has gone down. + # Ping every 10 seconds, assume that remote + # peer is down if no ping received during + # a 120 second time period. + option keepalive "10 120" + + # For extra security beyond that provided + # by SSL/TLS, create an "HMAC firewall" + # to help block DoS attacks and UDP port flooding. + # + # Generate with: + # openvpn --genkey --secret ta.key + # + # The server and each client must have + # a copy of this key. + # The second parameter should be '0' + # on the server and '1' on the clients. + # This file is secret: +# option tls_auth "/etc/openvpn/ta.key 0" + + # For additional privacy, a shared secret key + # can be used for both authentication (as in tls_auth) + # and encryption of the TLS control channel. + # + # Generate a shared secret with: + # openvpn --genkey --secret ta.key + # + # The server and each client must have + # a copy of this key. + # + # tls_auth and tls_crypt should NOT + # be combined, as tls_crypt implies tls_auth. + # Use EITHER tls_crypt, tls_auth, or neither option. +# option tls_crypt "/etc/openvpn/ta.key" + + # Set the minimum required TLS protocol version + # for all connections. + # + # Require at least TLS 1.1 +# option tls_version_min "1.1" + # Require at least TLS 1.2 +# option tls_version_min "1.2" + # Require TLS 1.2, or the highest version supported + # on the system +# option tls_version_min "1.2 'or-highest'" + + # List the preferred ciphers to use for the data channel. + # Run openvpn --show-ciphers to see all supported ciphers. +# list data_ciphers 'AES-256-GCM' +# list data_ciphers 'AES-128-GCM' +# list data_ciphers 'CHACHA20-POLY1305' + + # Set a fallback cipher in order to be compatible with + # peers that do not support cipher negotiation. + # + # Use AES-256-CBC as fallback +# option data_ciphers_fallback 'AES-128-CBC' + # Use AES-128-CBC as fallback +# option data_ciphers_fallback 'AES-256-CBC' + # Use Triple-DES as fallback +# option data_ciphers_fallback 'DES-EDE3-CBC' + # Use BF-CBC as fallback +# option data_ciphers_fallback 'BF-CBC' + + # OpenVPN versions 2.4 and later will attempt to + # automatically negotiate the most secure cipher + # between the client and server, regardless of a + # configured "option cipher" (see below). + # Automatic negotiation is recommended. + # + # Uncomment this option to disable this behavior, + # and force all OpenVPN peers to use the configured + # cipher option instead (not recommended). +# option ncp_disable + + # Enable compression on the VPN link. + # If you enable it here, you must also + # enable it in the client config file. + # + # Compression is not recommended, as compression and + # encryption in combination can weaken the security + # of the connection. + # + # LZ4 requires OpenVPN 2.4+ client and server +# option compress lz4 + # LZO is available by default only in openvpn-openssl variant + # LZO is compatible with most OpenVPN versions +# option compress lzo + + # Control how OpenVPN handles peers using compression + # + # Do not allow any connections using compression +# option allow_compression 'no' + # Allow incoming compressed packets, but do not send compressed packets to other peers + # This can be useful when migrating old configurations with compression activated +# option allow_compression 'asym' + # Both incoming and outgoing packets may be compressed +# option allow_compression 'yes' + + # The maximum number of concurrently connected + # clients we want to allow. +# option max_clients 100 + + # The persist options will try to avoid + # accessing certain resources on restart + # that may no longer be accessible because + # of the privilege downgrade. + option persist_key 1 + option persist_tun 1 + option user nobody + + # Output a short status file showing + # current connections, truncated + # and rewritten every minute. + option status /tmp/openvpn-status.log + + # By default, log messages will go to the syslog (or + # on Windows, if running as a service, they will go to + # the "\Program Files\OpenVPN\log" directory). + # Use log or log-append to override this default. + # "log" will truncate the log file on OpenVPN startup, + # while "log-append" will append to it. Use one + # or the other (but not both). +# option log /tmp/openvpn.log +# option log_append /tmp/openvpn.log + + # Set the appropriate level of log + # file verbosity. + # + # 0 is silent, except for fatal errors + # 4 is reasonable for general usage + # 5 and 6 can help to debug connection problems + # 9 is extremely verbose + option verb 3 + + # Silence repeating messages. At most 20 + # sequential messages of the same message + # category will be output to the log. +# option mute 20 + + +############################################## +# Sample client-side OpenVPN 2.0 uci config # +# for connecting to multi-client server. # +############################################## + +config openvpn sample_client + + # Set to 1 to enable this instance: + option enabled 0 + + # Specify that we are a client and that we + # will be pulling certain config file directives + # from the server. + option client 1 + + # Use the same setting as you are using on + # the server. + # On most systems, the VPN will not function + # unless you partially or fully disable + # the firewall for the TUN/TAP interface. +# option dev tap + option dev tun + + # Are we connecting to a TCP or + # UDP server? Use the same setting as + # on the server. +# option proto tcp + option proto udp + + # The hostname/IP and port of the server. + # You can have multiple remote entries + # to load balance between the servers. + list remote "my_server_1 1194" +# list remote "my_server_2 1194" + + # Choose a random host from the remote + # list for load_balancing. Otherwise + # try hosts in the order specified. +# option remote_random 1 + + # Keep trying indefinitely to resolve the + # host name of the OpenVPN server. Very useful + # on machines which are not permanently connected + # to the internet such as laptops. + option resolv_retry infinite + + # Most clients don't need to bind to + # a specific local port number. + option nobind 1 + + # Try to preserve some state across restarts. + option persist_key 1 + option persist_tun 1 + option user nobody + + # If you are connecting through an + # HTTP proxy to reach the actual OpenVPN + # server, put the proxy server/IP and + # port number here. See the man page + # if your proxy server requires + # authentication. + # retry on connection failures: +# option http_proxy_retry 1 + # specify http proxy address and port: +# option http_proxy "192.168.1.100 8080" + + # Wireless networks often produce a lot + # of duplicate packets. Set this flag + # to silence duplicate packet warnings. +# option mute_replay_warnings 1 + + # SSL/TLS parms. + # See the server config file for more + # description. It's best to use + # a separate .crt/.key file pair + # for each client. A single ca + # file can be used for all clients. + option ca /etc/openvpn/ca.crt + option cert /etc/openvpn/client.crt + option key /etc/openvpn/client.key + + # Verify server certificate by checking + # that the certicate has the key usage + # field set to "server". This is an + # important precaution to protect against + # a potential attack discussed here: + # http://openvpn.net/howto.html#mitm + # + # To use this feature, you will need to generate + # your server certificates with the nsCertType + # field set to "server". The build_key_server + # script in the easy_rsa folder will do this. +# option remote_cert_tls server + + # If a tls_auth key is used on the server + # then every client must also have the key. +# option tls_auth "/etc/openvpn/ta.key 1" + + # If a tls_crypt key is used on the server + # every client must also have the key. +# option tls_crypt "/etc/openvpn/ta.key" + + # Set the minimum required TLS protocol version + # for all connections. + # + # Require at least TLS 1.1 +# option tls_version_min "1.1" + # Require at least TLS 1.2 +# option tls_version_min "1.2" + # Require TLS 1.2, or the highest version supported + # on the system +# option tls_version_min "1.2 'or-highest'" + + # List the preferred ciphers for the data channel. +# list data_ciphers 'AES-256-GCM' +# list data_ciphers 'AES-128-GCM' +# list data_ciphers 'CHACHA20-POLY1305' + + # Set a fallback cipher if you connect to a peer that does + # not support cipher negotiation. + # Use AES-256-CBC as fallback +# option data_ciphers_fallback 'AES-128-CBC' + # Use AES-128-CBC as fallback +# option data_ciphers_fallback 'AES-256-CBC' + # Use Triple-DES as fallback +# option data_ciphers_fallback 'DES-EDE3-CBC' + # Use BF-CBC as fallback +# option data_ciphers_fallback 'BF-CBC' + + # Enable compression on the VPN link. + # Don't enable this unless it is also + # enabled in the server config file. + # + # Compression is not recommended, as compression and + # encryption in combination can weaken the security + # of the connection. + # + # LZ4 requires OpenVPN 2.4+ on server and client +# option compress lz4 + # LZO is available by default only in openvpn-openssl variant + # LZO is compatible with most OpenVPN versions +# option compress lzo + + # Set log file verbosity. + option verb 3 + + # Silence repeating messages +# option mute 20 diff --git a/package/network/services/openvpn/files/openvpn.init b/package/network/services/openvpn/files/openvpn.init new file mode 100644 index 0000000000..6eb3051352 --- /dev/null +++ b/package/network/services/openvpn/files/openvpn.init @@ -0,0 +1,258 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2008-2013 OpenWrt.org +# Copyright (C) 2008 Jo-Philipp Wich +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. + +START=90 +STOP=10 + +USE_PROCD=1 +PROG=/usr/sbin/openvpn + +LIST_SEP=" +" + +UCI_STARTED= +UCI_DISABLED= + +append_param() { + local s="$1" + local v="$2" + case "$v" in + *_*_*_*) v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;; + *_*_*) v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;; + *_*) v=${v%%_*}-${v#*_} ;; + esac + echo -n "$v" >> "/var/etc/openvpn-$s.conf" + return 0 +} + +append_bools() { + local p; local v; local s="$1"; shift + for p in $*; do + config_get_bool v "$s" "$p" + [ "$v" = 1 ] && append_param "$s" "$p" && echo >> "/var/etc/openvpn-$s.conf" + done +} + +append_params() { + local p; local v; local s="$1"; shift + for p in $*; do + config_get v "$s" "$p" + IFS="$LIST_SEP" + for v in $v; do + [ "$v" = "frames_only" ] && [ "$p" = "compress" ] && unset v && append_param "$s" "$p" && echo >> "/var/etc/openvpn-$s.conf" + [ -n "$v" ] && [ "$p" != "push" ] && append_param "$s" "$p" && echo " $v" >> "/var/etc/openvpn-$s.conf" + [ -n "$v" ] && [ "$p" = "push" ] && append_param "$s" "$p" && echo " \"$v\"" >> "/var/etc/openvpn-$s.conf" + done + unset IFS + done +} + +append_list() { + local p; local v; local s="$1"; shift + + list_cb_append() { + v="${v}:$1" + } + + for p in $*; do + unset v + config_list_foreach "$s" "$p" list_cb_append + [ -n "$v" ] && append_param "$s" "$p" && echo " ${v:1}" >> "/var/etc/openvpn-$s.conf" + done +} + +section_enabled() { + config_get_bool enable "$1" 'enable' 0 + config_get_bool enabled "$1" 'enabled' 0 + [ $enable -gt 0 ] || [ $enabled -gt 0 ] +} + +create_temp_file() { + mkdir -p "$(dirname "$1")" + rm -f "$1" + touch "$1" + chown root "$1" + chmod 0600 "$1" +} + +openvpn_get_dev() { + local dev dev_type + local name="$1" + local conf="$2" + + # Do override only for configurations with config_file + config_get config_file "$name" config + [ -n "$config_file" ] || return + + # Check there is someething to override + config_get dev "$name" dev + config_get dev_type "$name" dev_type + [ -n "$dev" ] || return + + # If there is a no dev_type, try to guess it + if [ -z "$dev_type" ]; then + . /lib/functions/openvpn.sh + + local odev odev_type + get_openvpn_option "$conf" odev dev + get_openvpn_option "$conf" odev_type dev-type + [ -n "$odev_type" ] || odev_type="$odev" + + case "$odev_type" in + tun*) dev_type="tun" ;; + tap*) dev_type="tap" ;; + *) return;; + esac + fi + + # Return overrides + echo "--dev-type $dev_type --dev $dev" +} + +openvpn_get_credentials() { + local name="$1" + local ret="" + + config_get cert_password "$name" cert_password + config_get password "$name" password + config_get username "$name" username + + if [ -n "$cert_password" ]; then + create_temp_file /var/run/openvpn.$name.pass + echo "$cert_password" > /var/run/openvpn.$name.pass + ret=" --askpass /var/run/openvpn.$name.pass " + fi + + if [ -n "$username" ]; then + create_temp_file /var/run/openvpn.$name.userpass + echo "$username" > /var/run/openvpn.$name.userpass + echo "$password" >> /var/run/openvpn.$name.userpass + ret=" --auth-user-pass /var/run/openvpn.$name.userpass " + fi + + # Return overrides + echo "$ret" +} + +openvpn_add_instance() { + local name="$1" + local dir="$2" + local conf=$(basename "$3") + local security="$4" + local up="$5" + local down="$6" + local client=$(grep -qEx "client|tls-client" "$dir/$conf" && echo 1) + + procd_open_instance "$name" + procd_set_param command "$PROG" \ + --syslog "openvpn($name)" \ + --status "/var/run/openvpn.$name.status" \ + --cd "$dir" \ + --config "$conf" \ + --up "/usr/libexec/openvpn-hotplug up $name" \ + --down "/usr/libexec/openvpn-hotplug down $name" \ + --route-up "/usr/libexec/openvpn-hotplug route-up $name" \ + --route-pre-down "/usr/libexec/openvpn-hotplug route-pre-down $name" \ + ${client:+--ipchange "/usr/libexec/openvpn-hotplug ipchange $name"} \ + ${up:+--setenv user_up "$up"} \ + ${down:+--setenv user_down "$down"} \ + --script-security "${security:-2}" \ + $(openvpn_get_dev "$name" "$conf") \ + $(openvpn_get_credentials "$name" "$conf") + procd_set_param file "$dir/$conf" + procd_set_param term_timeout 15 + procd_set_param respawn + procd_append_param respawn 3600 + procd_append_param respawn 5 + procd_append_param respawn -1 + procd_close_instance +} + +start_instance() { + local s="$1" + + config_get config "$s" config + config="${config:+$(readlink -f "$config")}" + + section_enabled "$s" || { + append UCI_DISABLED "$config" "$LIST_SEP" + return 1 + } + + local up down script_security + config_get up "$s" up + config_get down "$s" down + config_get script_security "$s" script_security + + [ ! -d "/var/run" ] && mkdir -p "/var/run" + + if [ ! -z "$config" ]; then + append UCI_STARTED "$config" "$LIST_SEP" + [ -n "$up" ] || get_openvpn_option "$config" up up + [ -n "$down" ] || get_openvpn_option "$config" down down + openvpn_add_instance "$s" "${config%/*}" "$config" "$script_security" "$up" "$down" + return + fi + + create_temp_file "/var/etc/openvpn-$s.conf" + + append_bools "$s" $OPENVPN_BOOLS + append_params "$s" $OPENVPN_PARAMS + append_list "$s" $OPENVPN_LIST + + openvpn_add_instance "$s" "/var/etc" "openvpn-$s.conf" "$script_security" "$up" "$down" +} + +start_service() { + local instance="$1" + local instance_found=0 + + config_cb() { + local type="$1" + local name="$2" + if [ "$type" = "openvpn" ]; then + if [ -n "$instance" -a "$instance" = "$name" ]; then + instance_found=1 + fi + fi + } + + . /lib/functions/openvpn.sh + . /usr/share/openvpn/openvpn.options + config_load 'openvpn' + + if [ -n "$instance" ]; then + [ "$instance_found" -gt 0 ] || return + start_instance "$instance" + else + config_foreach start_instance 'openvpn' + + local path name up down + for path in /etc/openvpn/*.conf; do + if [ -f "$path" ]; then + name="${path##*/}"; name="${name%.conf}" + + # don't start configs again that are already started by uci + if echo "$UCI_STARTED" | grep -qxF "$path"; then + continue + + # don't start configs which are set to disabled in uci + elif echo "$UCI_DISABLED" | grep -qxF "$path"; then + logger -t openvpn "$name.conf is disabled in /etc/config/openvpn" + continue + fi + + get_openvpn_option "$path" up up || up="" + get_openvpn_option "$path" down down || down="" + openvpn_add_instance "$name" "${path%/*}" "$path" "" "$up" "$down" + fi + done + fi +} + +service_triggers() { + procd_add_reload_trigger openvpn +} diff --git a/package/network/services/openvpn/files/openvpn.options b/package/network/services/openvpn/files/openvpn.options new file mode 100644 index 0000000000..5a7c756f7d --- /dev/null +++ b/package/network/services/openvpn/files/openvpn.options @@ -0,0 +1,206 @@ +OPENVPN_PARAMS=' +allow_compression +askpass +auth +auth_retry +auth_user_pass +auth_user_pass_verify +bcast_buffers +bind_dev +ca +capath +cd +cert +chroot +cipher +client_config_dir +client_connect +client_disconnect +comp_lzo +compress +connect_freq +connect_retry +connect_retry_max +connect_timeout +crl_verify +data_ciphers_fallback +dev +dev_node +dev_type +dh +ecdh_curve +echo +engine +explicit_exit_notify +extra_certs +fragment +group +hand_window +hash_size +http_proxy +http_proxy_option +http_proxy_timeout +ifconfig +ifconfig_ipv6 +ifconfig_ipv6_pool +ifconfig_ipv6_push +ifconfig_pool +ifconfig_pool_persist +ifconfig_push +inactive +ipchange +iroute +iroute_ipv6 +keepalive +key +key_direction +keysize +learn_address +link_mtu +lladdr +local +log +log_append +lport +management +management_log_cache +max_clients +max_routes_per_client +mode +mssfix +mtu_disc +mute +nice +ping +ping_exit +ping_restart +pkcs12 +plugin +port +port_share +prng +proto +pull_filter +push +rcvbuf +redirect_gateway +remap_usr1 +remote +remote_cert_eku +remote_cert_ku +remote_cert_tls +reneg_bytes +reneg_pkts +reneg_sec +replay_persist +replay_window +resolv_retry +route +route_delay +route_gateway +route_ipv6 +route_metric +route_pre_down +route_up +rport +secret +server +server_bridge +server_ipv6 +server_poll_timeout +setenv +shaper +sndbuf +socks_proxy +status +status_version +syslog +tcp_queue_limit +tls_auth +tls_crypt +tls_crypt_v2 +tls_crypt_v2_verify +tls_export_cert +tls_timeout +tls_verify +tls_version_min +tmp_dir +topology +tran_window +tun_mtu +tun_mtu_extra +txqueuelen +user +verb +verify_client_cert +verify_x509_name +vlan_accept +vlan_pvid +x509_username_field +' + +OPENVPN_BOOLS=' +allow_recursive_routing +auth_nocache +auth_user_pass_optional +bind +block_ipv6 +ccd_exclusive +client +client_to_client +comp_noadapt +disable +disable_occ +down_pre +duplicate_cn +fast_io +float +http_proxy_retry +ifconfig_noexec +ifconfig_nowarn +management_forget_disconnect +management_hold +management_query_passwords +management_signal +mktun +mlock +mtu_test +multihome +mute_replay_warnings +ncp_disable +nobind +opt_verify +passtos +persist_key +persist_local_ip +persist_remote_ip +persist_tun +ping_timer_rem +pull +push_peer_info +push_reset +remote_random +rmtun +route_noexec +route_nopull +single_session +socks_proxy_retry +suppress_timestamps +tcp_nodelay +test_crypto +tls_client +tls_exit +tls_server +up_delay +up_restart +username_as_common_name +vlan_tagging +' + +OPENVPN_LIST=' +data_ciphers +ncp_ciphers +tls_cipher +tls_ciphersuites +tls_groups +' diff --git a/package/network/services/openvpn/files/openvpn.upgrade b/package/network/services/openvpn/files/openvpn.upgrade new file mode 100644 index 0000000000..6ae49d22d0 --- /dev/null +++ b/package/network/services/openvpn/files/openvpn.upgrade @@ -0,0 +1 @@ +/etc/openvpn/ diff --git a/package/network/services/openvpn/files/usr/libexec/openvpn-hotplug b/package/network/services/openvpn/files/usr/libexec/openvpn-hotplug new file mode 100644 index 0000000000..9235fbacfe --- /dev/null +++ b/package/network/services/openvpn/files/usr/libexec/openvpn-hotplug @@ -0,0 +1,10 @@ +#!/bin/sh + +ACTION=$1 +shift +INSTANCE=$1 +shift + +export ACTION=$ACTION +export INSTANCE=$INSTANCE +exec /sbin/hotplug-call openvpn "$@" diff --git a/package/network/services/openvpn/patches/001-reproducible-remove_DATE.patch b/package/network/services/openvpn/patches/001-reproducible-remove_DATE.patch new file mode 100644 index 0000000000..e4e6d39413 --- /dev/null +++ b/package/network/services/openvpn/patches/001-reproducible-remove_DATE.patch @@ -0,0 +1,10 @@ +--- a/src/openvpn/options.c ++++ b/src/openvpn/options.c +@@ -105,7 +105,6 @@ const char title_string[] = + #endif + #endif + " [AEAD]" +- " built on " __DATE__ + ; + + #ifndef ENABLE_SMALL diff --git a/package/network/services/openvpn/patches/002-add-wolfssl-support.patch b/package/network/services/openvpn/patches/002-add-wolfssl-support.patch new file mode 100644 index 0000000000..7311a36eb3 --- /dev/null +++ b/package/network/services/openvpn/patches/002-add-wolfssl-support.patch @@ -0,0 +1,190 @@ +From: Gert Doering + +Support for wolfSSL in OpenVPN + +This patch adds support for wolfSSL in OpenVPN. Support is added by using +wolfSSL's OpenSSL compatibility layer. Function calls are left unchanged +and instead the OpenSSL includes point to wolfSSL headers and OpenVPN is +linked against the wolfSSL library. The wolfSSL installation directory is +detected using pkg-config. + +As requested by OpenVPN maintainers, this patch does not include +wolfssl/options.h on its own. By defining the macro EXTERNAL_OPTS_OPENVPN +in the configure script wolfSSL will include wolfssl/options.h on its own +(change added in wolfSSL/wolfssl#2825). The patch +adds an option '--disable-wolfssl-options-h' in case the user would like +to supply their own settings file for wolfSSL. + +wolfSSL: +Support added in: wolfSSL/wolfssl#2503 + +git clone https://github.com/wolfSSL/wolfssl.git +cd wolfssl +./autogen.sh +./configure --enable-openvpn +make +sudo make install + +OpenVPN: + +autoreconf -i -v -f +./configure --with-crypto-library=wolfssl +make +make check +sudo make install + +Signed-off-by: Juliusz Sosinowicz +Acked-by: Arne Schwabe +Message-Id: <20210317181153.83716-1-juliusz@wolfssl.com> +URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg21686.html +Signed-off-by: Gert Doering +--- + configure.ac | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- + src/openvpn/syshead.h | 3 ++- + 2 files changed, 110 insertions(+), 3 deletions(-) +--- a/configure.ac ++++ b/configure.ac +@@ -271,16 +271,23 @@ AC_ARG_WITH( + + AC_ARG_WITH( + [crypto-library], +- [AS_HELP_STRING([--with-crypto-library=library], [build with the given crypto library, TYPE=openssl|mbedtls @<:@default=openssl@:>@])], ++ [AS_HELP_STRING([--with-crypto-library=library], [build with the given crypto library, TYPE=openssl|mbedtls|wolfssl @<:@default=openssl@:>@])], + [ + case "${withval}" in +- openssl|mbedtls) ;; ++ openssl|mbedtls|wolfssl) ;; + *) AC_MSG_ERROR([bad value ${withval} for --with-crypto-library]) ;; + esac + ], + [with_crypto_library="openssl"] + ) + ++AC_ARG_ENABLE( ++ [wolfssl-options-h], ++ [AS_HELP_STRING([--disable-wolfssl-options-h], [Disable including options.h in wolfSSL @<:@default=yes@:>@])], ++ , ++ [enable_wolfssl_options_h="yes"] ++) ++ + AC_ARG_WITH( + [openssl-engine], + [AS_HELP_STRING([--with-openssl-engine], [enable engine support with OpenSSL. Default enabled for OpenSSL < 3.0, auto,yes,no @<:@default=auto@:>@])], +@@ -1054,6 +1061,105 @@ elif test "${with_crypto_library}" = "mb + AC_DEFINE([ENABLE_CRYPTO_MBEDTLS], [1], [Use mbed TLS library]) + CRYPTO_CFLAGS="${MBEDTLS_CFLAGS}" + CRYPTO_LIBS="${MBEDTLS_LIBS}" ++ ++elif test "${with_crypto_library}" = "wolfssl"; then ++ AC_ARG_VAR([WOLFSSL_CFLAGS], [C compiler flags for wolfssl. The include directory should ++ contain the regular wolfSSL header files but also the ++ wolfSSL OpenSSL header files. Ex: -I/usr/local/include ++ -I/usr/local/include/wolfssl]) ++ AC_ARG_VAR([WOLFSSL_LIBS], [linker flags for wolfssl]) ++ ++ saved_CFLAGS="${CFLAGS}" ++ saved_LIBS="${LIBS}" ++ ++ if test -z "${WOLFSSL_CFLAGS}" -a -z "${WOLFSSL_LIBS}"; then ++ # if the user did not explicitly specify flags, try to autodetect ++ PKG_CHECK_MODULES( ++ [WOLFSSL], ++ [wolfssl], ++ [], ++ [AC_MSG_ERROR([Could not find wolfSSL.])] ++ ) ++ PKG_CHECK_VAR( ++ [WOLFSSL_INCLUDEDIR], ++ [wolfssl], ++ [includedir], ++ [], ++ [AC_MSG_ERROR([Could not find wolfSSL includedir variable.])] ++ ) ++ WOLFSSL_CFLAGS="${WOLFSSL_CFLAGS} -I${WOLFSSL_INCLUDEDIR}/wolfssl" ++ fi ++ saved_CFLAGS="${CFLAGS}" ++ saved_LIBS="${LIBS}" ++ CFLAGS="${CFLAGS} ${WOLFSSL_CFLAGS}" ++ LIBS="${LIBS} ${WOLFSSL_LIBS}" ++ ++ AC_CHECK_LIB( ++ [wolfssl], ++ [wolfSSL_Init], ++ [], ++ [AC_MSG_ERROR([Could not link wolfSSL library.])] ++ ) ++ AC_CHECK_HEADER([wolfssl/options.h],,[AC_MSG_ERROR([wolfSSL header wolfssl/options.h not found!])]) ++ ++ # wolfSSL signal EKM support ++ have_export_keying_material="yes" ++ ++ AC_DEFINE([HAVE_HMAC_CTX_NEW], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_HMAC_CTX_FREE], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_HMAC_CTX_RESET], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_EVP_MD_CTX_NEW], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_EVP_MD_CTX_FREE], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_EVP_MD_CTX_RESET], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_EVP_CIPHER_CTX_RESET], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_OPENSSL_VERSION], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_SSL_CTX_GET_DEFAULT_PASSWD_CB], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_SSL_CTX_GET_DEFAULT_PASSWD_CB_USERDATA], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_SSL_CTX_SET_SECURITY_LEVEL], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_X509_GET0_NOTBEFORE], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_X509_GET0_NOTAFTER], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_X509_GET0_PUBKEY], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_X509_STORE_GET0_OBJECTS], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_X509_OBJECT_FREE], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_X509_OBJECT_GET_TYPE], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_EVP_PKEY_ID], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_EVP_PKEY_GET0_RSA], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_EVP_PKEY_GET0_DSA], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_EVP_PKEY_GET0_EC_KEY], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_SET_FLAGS], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_BITS], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_GET0_KEY], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_SET0_KEY], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_DSA_GET0_PQG], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_DSA_BITS], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_METH_NEW], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_METH_FREE], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_METH_SET_PUB_ENC], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_METH_SET_PUB_DEC], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_METH_SET_PRIV_ENC], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_METH_SET_PRIV_DEC], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_METH_SET_INIT], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_METH_SET_SIGN], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_METH_SET_FINISH], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_METH_SET0_APP_DATA], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_RSA_METH_GET0_APP_DATA], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ AC_DEFINE([HAVE_EC_GROUP_ORDER_BITS], [1], [Emulate AC_CHECK_FUNCS since these are defined as macros]) ++ ++ if test "${enable_wolfssl_options_h}" = "yes"; then ++ AC_DEFINE([EXTERNAL_OPTS_OPENVPN], [1], [Include options.h from wolfSSL library]) ++ else ++ AC_DEFINE([WOLFSSL_USER_SETTINGS], [1], [Use custom user_settings.h file for wolfSSL library]) ++ fi ++ ++ have_export_keying_material="yes" ++ ++ CFLAGS="${saved_CFLAGS}" ++ LIBS="${saved_LIBS}" ++ ++ AC_DEFINE([ENABLE_CRYPTO_WOLFSSL], [1], [Use wolfSSL crypto library]) ++ AC_DEFINE([ENABLE_CRYPTO_OPENSSL], [1], [Use wolfSSL openssl compatibility layer]) ++ CRYPTO_CFLAGS="${WOLFSSL_CFLAGS}" ++ CRYPTO_LIBS="${WOLFSSL_LIBS}" + else + AC_MSG_ERROR([Invalid crypto library: ${with_crypto_library}]) + fi +--- a/src/openvpn/syshead.h ++++ b/src/openvpn/syshead.h +@@ -582,7 +582,8 @@ socket_defined(const socket_descriptor_t + /* + * Do we have CryptoAPI capability? + */ +-#if defined(_WIN32) && defined(ENABLE_CRYPTO_OPENSSL) ++#if defined(_WIN32) && defined(ENABLE_CRYPTO_OPENSSL) && \ ++ !defined(ENABLE_CRYPTO_WOLFSSL) + #define ENABLE_CRYPTOAPI + #endif + diff --git a/package/network/services/openvpn/patches/100-mbedtls-disable-runtime-version-check.patch b/package/network/services/openvpn/patches/100-mbedtls-disable-runtime-version-check.patch new file mode 100644 index 0000000000..42665db872 --- /dev/null +++ b/package/network/services/openvpn/patches/100-mbedtls-disable-runtime-version-check.patch @@ -0,0 +1,11 @@ +--- a/src/openvpn/ssl_mbedtls.c ++++ b/src/openvpn/ssl_mbedtls.c +@@ -1539,7 +1539,7 @@ const char * + get_ssl_library_version(void) + { + static char mbedtls_version[30]; +- unsigned int pv = mbedtls_version_get_number(); ++ unsigned int pv = MBEDTLS_VERSION_NUMBER; + sprintf( mbedtls_version, "mbed TLS %d.%d.%d", + (pv>>24)&0xff, (pv>>16)&0xff, (pv>>8)&0xff ); + return mbedtls_version; diff --git a/package/network/services/openvpn/patches/210-build_always_use_internal_lz4.patch b/package/network/services/openvpn/patches/210-build_always_use_internal_lz4.patch new file mode 100644 index 0000000000..b5f675adec --- /dev/null +++ b/package/network/services/openvpn/patches/210-build_always_use_internal_lz4.patch @@ -0,0 +1,74 @@ +--- a/configure.ac ++++ b/configure.ac +@@ -1211,68 +1211,15 @@ dnl + AC_ARG_VAR([LZ4_CFLAGS], [C compiler flags for lz4]) + AC_ARG_VAR([LZ4_LIBS], [linker flags for lz4]) + if test "$enable_lz4" = "yes" && test "$enable_comp_stub" = "no"; then +- if test -z "${LZ4_CFLAGS}" -a -z "${LZ4_LIBS}"; then +- # if the user did not explicitly specify flags, try to autodetect +- PKG_CHECK_MODULES([LZ4], +- [liblz4 >= 1.7.1 liblz4 < 100], +- [have_lz4="yes"], +- [LZ4_LIBS="-llz4"] # If this fails, we will do another test next. +- # We also add set LZ4_LIBS otherwise the +- # linker will not know about the lz4 library +- ) +- fi + + saved_CFLAGS="${CFLAGS}" + saved_LIBS="${LIBS}" + CFLAGS="${CFLAGS} ${LZ4_CFLAGS}" + LIBS="${LIBS} ${LZ4_LIBS}" + +- # If pkgconfig check failed or LZ4_CFLAGS/LZ4_LIBS env vars +- # are used, check the version directly in the LZ4 include file +- if test "${have_lz4}" != "yes"; then +- AC_CHECK_HEADERS([lz4.h], +- [have_lz4h="yes"], +- []) +- +- if test "${have_lz4h}" = "yes" ; then +- AC_MSG_CHECKING([additionally if system LZ4 version >= 1.7.1]) +- AC_COMPILE_IFELSE( +- [AC_LANG_PROGRAM([[ +-#include +- ]], +- [[ +-/* Version encoding: MMNNPP (Major miNor Patch) - see lz4.h for details */ +-#if LZ4_VERSION_NUMBER < 10701L +-#error LZ4 is too old +-#endif +- ]] +- )], +- [ +- AC_MSG_RESULT([ok]) +- have_lz4="yes" +- ], +- [AC_MSG_RESULT([system LZ4 library is too old])] +- ) +- fi +- fi +- +- # Double check we have a few needed functions +- if test "${have_lz4}" = "yes" ; then +- AC_CHECK_LIB([lz4], +- [LZ4_compress_default], +- [], +- [have_lz4="no"]) +- AC_CHECK_LIB([lz4], +- [LZ4_decompress_safe], +- [], +- [have_lz4="no"]) +- fi +- +- if test "${have_lz4}" != "yes" ; then +- AC_MSG_RESULT([ usable LZ4 library or header not found, using version in src/compat/compat-lz4.*]) +- AC_DEFINE([NEED_COMPAT_LZ4], [1], [use copy of LZ4 source in compat/]) +- LZ4_LIBS="" +- fi ++ AC_MSG_RESULT([ usable LZ4 library or header not found, using version in src/compat/compat-lz4.*]) ++ AC_DEFINE([NEED_COMPAT_LZ4], [1], [use copy of LZ4 source in compat/]) ++ LZ4_LIBS="" + OPTIONAL_LZ4_CFLAGS="${LZ4_CFLAGS}" + OPTIONAL_LZ4_LIBS="${LZ4_LIBS}" + AC_DEFINE(ENABLE_LZ4, [1], [Enable LZ4 compression library]) diff --git a/package/network/services/openvpn/patches/220-disable_des.patch b/package/network/services/openvpn/patches/220-disable_des.patch new file mode 100644 index 0000000000..a49c463c4d --- /dev/null +++ b/package/network/services/openvpn/patches/220-disable_des.patch @@ -0,0 +1,74 @@ +--- a/src/openvpn/syshead.h ++++ b/src/openvpn/syshead.h +@@ -572,7 +572,7 @@ socket_defined(const socket_descriptor_t + /* + * Should we include NTLM proxy functionality + */ +-#define NTLM 1 ++//#define NTLM 1 + + /* + * Should we include proxy digest auth functionality +--- a/src/openvpn/crypto_mbedtls.c ++++ b/src/openvpn/crypto_mbedtls.c +@@ -396,6 +396,7 @@ int + key_des_num_cblocks(const mbedtls_cipher_info_t *kt) + { + int ret = 0; ++#ifdef MBEDTLS_DES_C + if (kt->type == MBEDTLS_CIPHER_DES_CBC) + { + ret = 1; +@@ -408,6 +409,7 @@ key_des_num_cblocks(const mbedtls_cipher + { + ret = 3; + } ++#endif + + dmsg(D_CRYPTO_DEBUG, "CRYPTO INFO: n_DES_cblocks=%d", ret); + return ret; +@@ -416,6 +418,7 @@ key_des_num_cblocks(const mbedtls_cipher + bool + key_des_check(uint8_t *key, int key_len, int ndc) + { ++#ifdef MBEDTLS_DES_C + int i; + struct buffer b; + +@@ -444,11 +447,15 @@ key_des_check(uint8_t *key, int key_len, + + err: + return false; ++#else ++ return true; ++#endif + } + + void + key_des_fixup(uint8_t *key, int key_len, int ndc) + { ++#ifdef MBEDTLS_DES_C + int i; + struct buffer b; + +@@ -463,6 +470,7 @@ key_des_fixup(uint8_t *key, int key_len, + } + mbedtls_des_key_set_parity(key); + } ++#endif + } + + /* +@@ -783,10 +791,12 @@ cipher_des_encrypt_ecb(const unsigned ch + unsigned char *src, + unsigned char *dst) + { ++#ifdef MBEDTLS_DES_C + mbedtls_des_context ctx; + + ASSERT(mbed_ok(mbedtls_des_setkey_enc(&ctx, key))); + ASSERT(mbed_ok(mbedtls_des_crypt_ecb(&ctx, src, dst))); ++#endif + } + + diff --git a/package/network/services/openvpn/test.sh b/package/network/services/openvpn/test.sh new file mode 100755 index 0000000000..71cdc35db1 --- /dev/null +++ b/package/network/services/openvpn/test.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +case "$1" in + "openvpn-mbedtls") + openvpn --version | grep "$2.*SSL (mbed TLS)" + ;; + "openvpn-openssl"|"openvpn-wolfssl") + openvpn --version | grep "$2.*SSL (OpenSSL)" + ;; +esac diff --git a/package/network/services/ppp/Makefile b/package/network/services/ppp/Makefile index 10e9bdfdfe..80d5e46c34 100644 --- a/package/network/services/ppp/Makefile +++ b/package/network/services/ppp/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=ppp -PKG_RELEASE:=3 +PKG_RELEASE:=4 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/paulusmack/ppp @@ -26,6 +26,7 @@ PKG_VERSION:=$(PKG_RELEASE_VERSION).git-$(PKG_SOURCE_DATE) PKG_BUILD_DEPENDS:=libpcap PKG_ASLR_PIE_REGULAR:=1 +PKG_BUILD_FLAGS:=gc-sections lto PKG_BUILD_PARALLEL:=1 PKG_INSTALL:=1 @@ -192,9 +193,6 @@ $(call Build/Configure/Default,, \ $(PKG_BUILD_DIR)/pppd/plugins/pppoatm/linux/ endef -TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto -TARGET_LDFLAGS += -Wl,--gc-sections -flto -fuse-linker-plugin - MAKE_FLAGS += COPTS="$(TARGET_CFLAGS)" \ PRECOMPILED_FILTER=1 \ STAGING_DIR="$(STAGING_DIR)" diff --git a/package/network/services/ppp/files/ppp.sh b/package/network/services/ppp/files/ppp.sh index 7bbc497c43..6d3a8e29ff 100755 --- a/package/network/services/ppp/files/ppp.sh +++ b/package/network/services/ppp/files/ppp.sh @@ -220,9 +220,7 @@ proto_pppoe_setup() { local config="$1" local iface="$2" - for module in slhc ppp_generic pppox pppoe; do - /sbin/insmod $module 2>&- >&- - done + /sbin/modprobe -qa slhc ppp_generic pppox pppoe json_get_var mtu mtu mtu="${mtu:-1492}" @@ -262,9 +260,7 @@ proto_pppoa_setup() { local config="$1" local iface="$2" - for module in slhc ppp_generic pppox pppoatm; do - /sbin/insmod $module 2>&- >&- - done + /sbin/modprobe -qa slhc ppp_generic pppox pppoatm json_get_vars atmdev vci vpi encaps @@ -311,13 +307,8 @@ proto_pptp_setup() { exit 1 } - local load - for module in slhc ppp_generic ppp_async ppp_mppe ip_gre gre pptp; do - grep -q "^$module " /proc/modules && continue - /sbin/insmod $module 2>&- >&- - load=1 - done - [ "$load" = "1" ] && sleep 1 + /sbin/modprobe -qa slhc ppp_generic ppp_async ppp_mppe ip_gre gre pptp + sleep 1 ppp_generic_setup "$config" \ plugin pptp.so \ @@ -335,4 +326,3 @@ proto_pptp_teardown() { [ -f /usr/lib/pppd/*/pppoatm.so ] && add_protocol pppoa [ -f /usr/lib/pppd/*/pptp.so ] && add_protocol pptp } - diff --git a/package/network/utils/pppossh/Makefile b/package/network/services/pppossh/Makefile similarity index 100% rename from package/network/utils/pppossh/Makefile rename to package/network/services/pppossh/Makefile diff --git a/package/network/utils/pppossh/README.md b/package/network/services/pppossh/README.md similarity index 100% rename from package/network/utils/pppossh/README.md rename to package/network/services/pppossh/README.md diff --git a/package/network/utils/pppossh/files/pppossh.sh b/package/network/services/pppossh/files/pppossh.sh similarity index 100% rename from package/network/utils/pppossh/files/pppossh.sh rename to package/network/services/pppossh/files/pppossh.sh diff --git a/package/network/services/relayd/Makefile b/package/network/services/relayd/Makefile index e3a9de21f8..116ef00b31 100644 --- a/package/network/services/relayd/Makefile +++ b/package/network/services/relayd/Makefile @@ -12,9 +12,9 @@ PKG_RELEASE:=1 PKG_SOURCE_URL=$(PROJECT_GIT)/relayd.git PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2020-04-25 -PKG_SOURCE_VERSION:=f4d759be54ceb37714e9a6ca320d5b50c95e9ce9 -PKG_MIRROR_HASH:=b1ff6e99072867be0975ba0be52ba9da3a876c8b8da893d68301e8238243a51e +PKG_SOURCE_DATE:=2023-01-28 +PKG_SOURCE_VERSION:=f646ba40489371e69f624f2dee2fc4e19ceec00e +PKG_MIRROR_HASH:=672d3115728d40ee6897a9f633d269d127496699a7bd45eba11844aa771f2501 PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0 diff --git a/package/network/services/sstp-client/Makefile b/package/network/services/sstp-client/Makefile index 973131794e..7010fba520 100644 --- a/package/network/services/sstp-client/Makefile +++ b/package/network/services/sstp-client/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=sstp-client PKG_VERSION:=1.0.15 -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@SF/sstp-client/$(PKG_VERSION) diff --git a/package/network/services/tor-hs/Makefile b/package/network/services/tor-hs/Makefile new file mode 100644 index 0000000000..047ba3efa5 --- /dev/null +++ b/package/network/services/tor-hs/Makefile @@ -0,0 +1,64 @@ +# +# Copyright (C) 2020-2021 CZ.NIC, z. s. p. o. (https://www.nic.cz/) +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=tor-hs +PKG_VERSION:=0.0.1 +PKG_RELEASE:=3 + +PKG_MAINTAINER:=Jan Pavlinec +PKG_LICENSE:=GPL-3.0-or-later + +include $(INCLUDE_DIR)/package.mk + +define Package/tor-hs + SECTION:=net + CATEGORY:=Network + SUBMENU:=IP Addresses and Names + TITLE:=Tor hidden service configurator + DEPENDS:=+tor +rpcd +endef + +define Package/tor-hs/description + Tor Hidden Service configurator +endef + +define Package/tor-hs/conffiles +/etc/config/tor-hs +endef + +define Build/Compile +endef + +define Build/Install +endef + +define Package/tor-hs/postinst +#!/bin/sh +[ -z "$${IPKG_INSTROOT}" ] && /etc/init.d/rpcd restart +exit 0 +endef + +define Package/tor-hs/postrm +#!/bin/sh +[ -z "$${IPKG_INSTROOT}" ] && /etc/init.d/rpcd restart +exit 0 +endef + +define Package/tor-hs/install + $(INSTALL_DIR) $(1)/etc/config/ + $(CP) ./files/tor-hs.conf $(1)/etc/config/tor-hs + $(INSTALL_DIR) $(1)/etc/init.d/ + $(INSTALL_BIN) ./files/tor-hs.init $(1)/etc/init.d/tor-hs + $(INSTALL_DIR) $(1)/etc/tor/ + $(INSTALL_BIN) ./files/nextcloud-update.sh $(1)/etc/tor/ + $(INSTALL_DIR) $(1)/usr/libexec/rpcd + $(INSTALL_BIN) ./files/tor_rpcd.sh $(1)/usr/libexec/rpcd/tor-hs-rpc +endef + +$(eval $(call BuildPackage,tor-hs)) diff --git a/package/network/services/tor-hs/README.md b/package/network/services/tor-hs/README.md new file mode 100644 index 0000000000..0071f11a1e --- /dev/null +++ b/package/network/services/tor-hs/README.md @@ -0,0 +1,104 @@ +# Tor Hidden service configurator +**tor-hs** packages tries to simplify creating of hidden services on OpenWrt routers. + +## Requirements +To run **tor-hs**, you need Tor package with uci config support (it was added +with [this commit](https://github.com/openwrt/packages/commit/ca6528f002d74445e3d0a336aeb9074fc337307a) ). + +## Instalation +To install package simple run +``` +opkg update +opkg install tor-hs +``` + +## Configuration +Uci configuration is located in **/etc/config/tor-hs** + +### Required section of configuration +There is one required section **common** + +Example of this section +``` +config tor-hs common + option GenConf "/etc/tor/torrc_hs" + option HSDir "/etc/tor/hidden_service" + option RestartTor "true" + option UpdateTorConf "true" +``` + +#### Table with options description +| Type | Name | Default | Description | +| ------ | ------ | ------ | ------ | +| option |GenConf | /etc/tor/torrc_generated|Generated config by tor-hs.| +| option | HSDir |/etc/tor/hidden_service|Directory with meta-data for hidden services (hostname,keys,etc).| +| option | RestartTor | true| It will restart tor after running **/etc/init.d/tor-hs start**.| +| option | UpdateTorConf | true|Update /etc/config/tor with config from **GenConf** option.| + +### Hidden service configuration +If you want to create a new hidden service, you have to add a hidden-service section. For every hidden service, there should be a new **hidden-service** section. + +Example of hidden service section for ssh server: + +``` +config hidden-service + option Name 'sshd' + option Description "Hidden service for ssh" + option Enabled 'false' + option IPv4 '127.0.0.1' + #public port=2222, local port=22 + list PublicLocalPort '2222;22' +``` + +#### Table with options description + +| Type | Name | Example value | Description | +| ------ | ------ | ------ | ------ | +| option | Name | sshd| Name of hidden service. It is used as directory name in **HSDir**| +| option | Description| Hidden service for ssh| Description used in **rpcd** service| +| option | Enabled |false| Enable hidden service after running **tor-hs** init script| +| option |IPv4 |127.0.0.1|Local IPv4 address of service. Service could run on another device, in that case OpenWrt will redirect comunication. | +| list | PublicLocalPort| 2222;22| Public port is port accesible via Tor network. Local port is normal port of service.| +|option| HookScript |'/etc/tor/nextcloud-update.php'| Path to script which is executed after starting tor-hs. Script is executed with paramters **--update-onion** **hostname** . Hostname is replaced with Onion v3 address for given hidden service. + +## Running service + +To enable tor-hs service run +``` +/etc/init.d/tor-hs enable +/etc/init.d/tor-hs start + +``` +In case you enabled option *RestartTor* and *UpdateTorConf* hidden service should be running. +Otherwise, you should also restart tor daemon. + +``` +/etc/init.d/tor restart +``` + +After that you should also restart rpcd daemon, so you can use tor-hs RPCD service. +``` +/etc/init.d/rpcd restart +``` + +### RPCD + +RPCD servis helps users to access basic informations about hidden services on router. After running HS it contains onion url for given hidden service in hostname value. +``` +root@turris:/# ubus call tor-hs-rpc list-hs '{}' +{ + "hs-list": [ + { + "name": "sshd", + "description": "Hidden service for ssh", + "enabled": "1", + "ipv4": "127.0.0.1", + "hostname": "****hidden-service-hostname****.onion", + "ports": [ + "22;22" + ] + } + ] +} +``` + diff --git a/package/network/services/tor-hs/files/nextcloud-update.sh b/package/network/services/tor-hs/files/nextcloud-update.sh new file mode 100755 index 0000000000..3c485e8639 --- /dev/null +++ b/package/network/services/tor-hs/files/nextcloud-update.sh @@ -0,0 +1,44 @@ +#!/bin/sh +# This is example script for tor-hs uci config +# HookScript option. Script is then called after running +# hidden service. +# It disables trusted domain check for nextcloud. + +NEXTCLOUD_CLI_SCRIPT="/srv/www/nextcloud/occ" + +nextcloud_cli() { + sudo -u nobody php-cli "$NEXTCLOUD_CLI_SCRIPT" "$@" +} + + +nextcloud_add_domain() { + onion="$1" + if [ -n "$onion" ] && nextcloud_cli config:system:get trusted_domains |grep "$onion" ; then + echo "Info: Trusted domains already disabled. Nothing to do." >&2 + else + echo "Info: Disabling trusted domains." >&2 + nextcloud_cli config:system:set trusted_domains 1000 --value=$onion + fi +} + +print_help() { + echo "Help" +} + +# Check occ command +[ -f "$NEXTCLOUD_CLI_SCRIPT" ] || { + echo "Error: occ command not found!" >&2 + exit 1 +} + +################################################################ + +case "$1" in +--update-onion) + nextcloud_add_domain "$2" +;; + +*) + print_help +;; +esac diff --git a/package/network/services/tor-hs/files/tor-hs.conf b/package/network/services/tor-hs/files/tor-hs.conf new file mode 100644 index 0000000000..5480685d0f --- /dev/null +++ b/package/network/services/tor-hs/files/tor-hs.conf @@ -0,0 +1,22 @@ +config tor-hs common + #option GenConf "/etc/tor/torrc_hs" + option GenConf "/etc/tor/torrc_generated" + option HSDir "/etc/tor/hidden_service" + option RestartTor "true" + option UpdateTorConf "true" + +#config hidden-service +# option Name 'sshd' +# option Description "Hidden service for ssh" +# option Enabled 'false' +# option IPv4 '127.0.0.1' +# #public port=2222, local port=22 +# list PublicLocalPort '2222;22' + +#config hidden-service +# option Name 'nextcloud' +# option Description "Hidden service for Nextcloud" +# option Enabled 'false' +# option IPv4 '127.0.0.1' +# option HookScript '/etc/tor/nextcloud-update.sh' +# list PublicLocalPort '80;80' diff --git a/package/network/services/tor-hs/files/tor-hs.init b/package/network/services/tor-hs/files/tor-hs.init new file mode 100755 index 0000000000..aab531b1ca --- /dev/null +++ b/package/network/services/tor-hs/files/tor-hs.init @@ -0,0 +1,116 @@ +#!/bin/sh /etc/rc.common + +START=52 +STOP=52 + +USE_PROCD=1 + +TORRC_FILE=/etc/tor/torrc_generated # file with torrc config +HS_DIR_PATH=/etc/tor/hidden_service #hidden service directory path +TOR_USER=tor + +clean_hs() { + local name="" +} + +config_tor() { + local restart_tor update_config + config_get_bool restart_tor "common" RestartTor + config_get_bool update_config "common" UpdateTorConf + + tail_conf=$(uci show tor.conf.tail_include 2>/dev/null) + head_conf=$(uci show tor.conf.head_include 2>/dev/null) + echo "tail_conf $tail_conf" + + if [ "$update_config" = "1" ]; then + if [ -n "$(echo $tail_conf | grep $TORRC_FILE)" ] || [ -n "$(echo $head_conf | grep $TORRC_FILE)" ]; then + echo "Info. Not updating tor configuration" + else + #uci add_list + echo "Info. Updating tor configuration" + uci add_list tor.conf.tail_include="$TORRC_FILE" + uci commit tor + fi + fi + + if [ "$restart_tor" = "1" ]; then + /etc/init.d/tor restart + fi +} + +handle_hs_ports_conf() { + local public_port local_port + local value="$1" + local ipv4="$2" + local name="$3" + + public_port=$(echo "$value"|awk -F';' '{print $1}') + local_port=$(echo "$value"|awk -F';' '{print $2}') + echo "HiddenServicePort $public_port $ipv4:$local_port">>$TORRC_FILE +} + +parse_hs_conf() { + local name public_port local_port enable_hs ipv4 + local config="$1" + + config_get name "$config" Name + config_get description "$config" Description + + config_get_bool enable_hs "$config" Enabled 0 + config_get ipv4 "$config" IPv4 + + if [ "$enable_hs" = "1" ]; then + mkdir -p "$HS_DIR_PATH/$name" + chown "$TOR_USER":"$TOR_USER" "$HS_DIR_PATH/" + chown "$TOR_USER:$TOR_USER" "$HS_DIR_PATH/$name" + chmod 700 "$HS_DIR_PATH/" + chmod 700 "$HS_DIR_PATH/$name/" + + echo "HiddenServiceDir $HS_DIR_PATH/$name" >>$TORRC_FILE + config_list_foreach "$config" PublicLocalPort handle_hs_ports_conf "$ipv4" "$name" + fi +} + +parse_hs_conf_hooks() { + local name hook_script enable_hs hostname_file + local config="$1" + + config_get enable_hs "$config" Enabled 0 + config_get hook_script "$config" HookScript + config_get name "$config" Name + + hostname="$HS_DIR_PATH/$name/hostname" + + # check if we should run hook_script + if [ "$enable_hs" = "true" ] && [ -x "$hook_script" ] && [ -f "$hostname" ] ; then + hostname_uri=$(cat "$hostname") + # call hook script + $hook_script "--update-onion" "$hostname_uri" + fi +} + +parse_common_conf() { + local hs_dir generated_config + config_get generated_config "common" GenConf + config_get hs_dir "common" HSDir + [ -n "$hs_dir" ] && HS_DIR_PATH="$hs_dir" + [ -n "$generated_config" ] && TORRC_FILE="$generated_config" +} + +start_service() { + config_load tor-hs + # clean config + echo "" > $TORRC_FILE # clean config + + # load common config + parse_common_conf + + # load hs service + config_foreach parse_hs_conf hidden-service + + # update tor config + config_tor + + # load and run tor-hs hooks + config_foreach parse_hs_conf_hooks hidden-service +} diff --git a/package/network/services/tor-hs/files/tor_rpcd.sh b/package/network/services/tor-hs/files/tor_rpcd.sh new file mode 100755 index 0000000000..bfcd788017 --- /dev/null +++ b/package/network/services/tor-hs/files/tor_rpcd.sh @@ -0,0 +1,69 @@ +#!/bin/sh + +. /lib/functions.sh + +get_onion_hostname() { + local name="$1" + config_get hs_dir common HSDir + if [ -f "$hs_dir/$name/hostname" ]; then + cat "$hs_dir/$name/hostname" + fi +} + +get_port_list() { + local config="$1" + config_get ports "$config" PublicLocalPort + tmp="$(echo $ports |sed "s| |','|g")" + echo -ne "['$tmp']" +} + +parse_hs_conf() { + local name description public_port local_port enable_bool public_local_port ipv4 + local config="$1" + local custom="$2" + + config_get name "$config" Name + config_get description "$config" Description + + config_get_bool enable_hs "$config" Enabled 0 + config_get ipv4 "$config" IPv4 + + hostname="$(get_onion_hostname $name)" + port_list="$(get_port_list $config)" + echo "{" + echo \"name\":\"$name\", + echo \"description\":\"$description\", + echo \"enabled\":\"$enable_hs\", + echo \"ipv4\":\"$ipv4\", + echo \"hostname\":\"$hostname\", + echo \"ports\":$port_list + echo "}," +} + +get_tor_hs_list() { + config_load tor-hs + echo "{" + echo '"hs-list":[' + config_foreach parse_hs_conf hidden-service + echo "]" + echo "}" +} + + + +case "$1" in + list) + echo '{ "list-hs": { } }' + ;; + call) + case "$2" in + list-hs) + # return json object + get_tor_hs_list + ;; + esac + ;; +esac + + + diff --git a/package/network/services/tor/Makefile b/package/network/services/tor/Makefile new file mode 100644 index 0000000000..2a3c1f9336 --- /dev/null +++ b/package/network/services/tor/Makefile @@ -0,0 +1,185 @@ +# +# Copyright (C) 2008-2019 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=tor +PKG_VERSION:=0.4.8.7 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://dist.torproject.org/ \ + https://archive.torproject.org/tor-package-archive +PKG_HASH:=b20d2b9c74db28a00c07f090ee5b0241b2b684f3afdecccc6b8008931c557491 +PKG_MAINTAINER:=Hauke Mehrtens \ + Peter Wagner +PKG_LICENSE_FILES:=LICENSE +PKG_CPE_ID:=cpe:/a:torproject:tor + +PKG_INSTALL:=1 +PKG_FIXUP:=autoreconf +PKG_BUILD_PARALLEL:=1 +PKG_BUILD_FLAGS:=gc-sections lto + +include $(INCLUDE_DIR)/package.mk + +define Package/tor/Default + SECTION:=net + CATEGORY:=Network + URL:=https://www.torproject.org/ + USERID:=tor=52:tor=52 + DEPENDS:=+libevent2 +libopenssl +libpthread +librt +zlib +libcap + TITLE:=Tor routing daemon +endef + +define Package/tor/Default/description +Tor is a toolset for a wide range of organizations and people that want to +improve their safety and security on the Internet. Using Tor can help you +anonymize web browsing and publishing, instant messaging, IRC, SSH, and +more. Tor also provides a platform on which software developers can build +new applications with built-in anonymity, safety, and privacy features. +endef + +define Package/tor +$(call Package/tor/Default) + TITLE+= (full) + CONFLICTS:=tor-basic + PROVIDES:=tor-basic + VARIANT:=full +endef + +define Package/tor/description +$(call Package/tor/Default/description) + +This package contains the full tor daemon. + +endef + +define Package/tor-basic +$(call Package/tor/Default) + TITLE+= (no bridge/relay support) + VARIANT:=basic +endef + +define Package/tor-basic/description +$(call Package/tor/Default/description) + +This package contains the basic tor daemon, without bridge/relay support. + +endef + +define Package/tor-gencert +$(call Package/tor/Default) + TITLE:=Tor certificate generation + DEPENDS:=tor +endef + +define Package/tor-gencert/description +$(call Package/tor/Default/description) + +Generate certs and keys for Tor directory authorities. + +endef + +define Package/tor-resolve +$(call Package/tor/Default) + TITLE:=tor hostname resolve + DEPENDS:=tor-basic +endef + +define Package/tor-resolve/description +$(call Package/tor/Default/description) + +Resolve a hostname to an IP address via tor. + +endef + +define Package/tor-geoip +$(call Package/tor/Default) + TITLE:=GeoIP db for tor + DEPENDS:=tor-basic +endef + +define Package/tor-geoip/description +$(call Package/tor/Default/description) + +This package contains a GeoIP database mapping IP addresses to countries. + +endef + +define Package/tor/conffiles +/etc/tor/torrc +/var/lib/tor/fingerprint +/var/lib/tor/keys/* +/etc/config/tor +endef + +Package/tor-basic/conffiles = $(Package/tor/conffiles) + +CONFIGURE_ARGS += \ + --with-libevent-dir="$(STAGING_DIR)/usr" \ + --with-openssl-dir="$(STAGING_DIR)/usr" \ + --with-zlib-dir="$(STAGING_DIR)/usr" \ + --disable-asciidoc \ + --disable-html-manual \ + --disable-manpage \ + --disable-seccomp \ + --disable-libscrypt \ + --disable-unittests \ + --disable-lzma \ + --disable-zstd \ + --with-tor-user=tor \ + --with-tor-group=tor \ + --enable-pic + +ifeq ($(BUILD_VARIANT),basic) + CONFIGURE_ARGS += --disable-module-relay +endif + + +TARGET_CFLAGS += $(if $(CONFIG_OPENSSL_ENGINE),,-DDISABLE_ENGINES) + +CONFIGURE_VARS += \ + CROSS_COMPILE="yes" \ + ac_cv_func_mallinfo=no + +define Package/tor/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/tor $(1)/usr/sbin/ + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/tor.init $(1)/etc/init.d/tor + $(INSTALL_DIR) $(1)/etc/tor + $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/tor/torrc.sample $(1)/etc/tor/torrc + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_CONF) ./files/tor.conf $(1)/etc/config/tor +endef + +Package/tor-basic/install = $(Package/tor/install) + +define Package/tor-gencert/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/tor-gencert $(1)/usr/sbin/ +endef + +define Package/tor-resolve/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/tor-resolve $(1)/usr/sbin/ +endef + +define Package/tor-geoip/install + $(INSTALL_DIR) $(1)/usr/share/tor + $(INSTALL_DATA) \ + $(PKG_INSTALL_DIR)/usr/share/tor/geoip \ + $(PKG_INSTALL_DIR)/usr/share/tor/geoip6 \ + $(1)/usr/share/tor/ +endef + +$(eval $(call BuildPackage,tor)) +$(eval $(call BuildPackage,tor-basic)) +$(eval $(call BuildPackage,tor-gencert)) +$(eval $(call BuildPackage,tor-resolve)) +$(eval $(call BuildPackage,tor-geoip)) diff --git a/package/network/services/tor/files/tor.conf b/package/network/services/tor/files/tor.conf new file mode 100644 index 0000000000..32e71e599e --- /dev/null +++ b/package/network/services/tor/files/tor.conf @@ -0,0 +1,5 @@ +config tor conf + option default "/etc/tor/torrc" + option generated "/tmp/torrc" + #list head_include "/full/path/to/file" + #list tail_include "/full/path/to/file" diff --git a/package/network/services/tor/files/tor.init b/package/network/services/tor/files/tor.init new file mode 100644 index 0000000000..cb1cb73c5c --- /dev/null +++ b/package/network/services/tor/files/tor.init @@ -0,0 +1,52 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006-2011 OpenWrt.org + +START=50 +STOP=50 + +USE_PROCD=1 + +TORRC_GEN="/tmp/torrc" + +handle_conf_file() { + local conf_path="$1" + if [ -f "$conf_path" ] || [ -d "$conf_path" ]; then + echo "%include $conf_path" + fi +} + +generate_conf() { + local default_conf generated_conf + + config_load tor + config_get default_conf conf default "/etc/tor/torrc" + config_get generated_conf conf generated "/tmp/torrc" + TORRC_GEN="$generated_conf" + + { + echo "## This file was automatically generated please do not edit here !" + config_list_foreach "conf" head_include handle_conf_file + echo "%include $default_conf" + config_list_foreach "conf" tail_include handle_conf_file + } > "$TORRC_GEN" +} + +reload_service() { + procd_send_signal tor +} + +start_service() { + mkdir -m 0700 -p /var/lib/tor + chown -R tor:tor /var/lib/tor + + mkdir -m 0755 -p /var/log/tor + chown -R tor:tor /var/log/tor + + generate_conf + + procd_open_instance + procd_set_param command /usr/sbin/tor --runasdaemon 0 + procd_append_param command -f "$TORRC_GEN" + procd_set_param respawn + procd_close_instance +} diff --git a/package/network/services/tor/patches/001-torrc.patch b/package/network/services/tor/patches/001-torrc.patch new file mode 100644 index 0000000000..e4c26266af --- /dev/null +++ b/package/network/services/tor/patches/001-torrc.patch @@ -0,0 +1,25 @@ +--- a/src/config/torrc.sample.in ++++ b/src/config/torrc.sample.in +@@ -39,7 +39,7 @@ + ## Send every possible message to @LOCALSTATEDIR@/log/tor/debug.log + #Log debug file @LOCALSTATEDIR@/log/tor/debug.log + ## Use the system log instead of Tor's logfiles +-#Log notice syslog ++Log notice syslog + ## To send all messages to stderr: + #Log debug stderr + +@@ -50,7 +50,7 @@ + + ## The directory for keeping all the keys/etc. By default, we store + ## things in $HOME/.tor on Unix, and in Application Data\tor on Windows. +-#DataDirectory @LOCALSTATEDIR@/lib/tor ++DataDirectory @LOCALSTATEDIR@/lib/tor + + ## The port on which Tor will listen for local connections from Tor + ## controller applications, as documented in control-spec.txt. +@@ -251,3 +251,4 @@ + ## The %include option can be used recursively. + #%include /etc/torrc.d/*.conf + ++User tor diff --git a/package/network/services/torsocks/Makefile b/package/network/services/torsocks/Makefile new file mode 100644 index 0000000000..b0bcbedb14 --- /dev/null +++ b/package/network/services/torsocks/Makefile @@ -0,0 +1,62 @@ +# +# Copyright (C) 2017-2019 CZ.NIC, z. s. p. o. (https://www.nic.cz/) +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=torsocks +PKG_VERSION:=2.3.0 +PKG_RELEASE:=1 + +PKG_SOURCE_URL:=https://people.torproject.org/~dgoulet/torsocks/ +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_HASH:=b9f1b981d6b3fd4e1820de1eee325f8a7038c84765d5a6cd9af12571d5cc3622 + +PKG_MAINTAINER:=Jan Pavlinec +PKG_LICENSE:=GPLv2 +PKG_LICENSE_FILES:=LICENSE + +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 +PKG_FIXUP:=autoreconf + +include $(INCLUDE_DIR)/package.mk + +define Package/torsocks + SECTION:=net + CATEGORY:=Network + SUBMENU:=IP Addresses and Names + TITLE:=torsocks + URL:=https://trac.torproject.org/projects/tor/wiki/doc/torsocks + DEPENDS:=+tor +endef + +define Package/torsocks/description + Torsocks allows you to use most applications in a safe way with Tor. + It ensures that DNS requests are handled safely and explicitly rejects any traffic other than TCP from the application you're using. +endef + +define Build/Configure + $(call Build/Configure/Default) +ifeq ($(CONFIG_USE_UCLIBC),y) + find $(PKG_BUILD_DIR) -name 'Makefile' -exec sed -i 's|--param ssp-buffer-size=1 -fstack-protector-all||' \{\} \+ +endif +endef + +define Package/conffiles +/etc/tor/torsocks.conf +endef + +define Package/torsocks/install + $(INSTALL_DIR) $(1)/etc/tor/ + $(CP) $(PKG_INSTALL_DIR)/etc/tor/torsocks.conf $(1)/etc/tor/ + $(INSTALL_DIR) $(1)/usr/lib/torsocks + $(CP) $(PKG_INSTALL_DIR)/usr/lib/torsocks/libtorsocks.so* $(1)/usr/lib/torsocks/ + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/torsocks $(1)/usr/bin/ +endef + +$(eval $(call BuildPackage,torsocks)) diff --git a/package/network/services/uhttpd/Makefile b/package/network/services/uhttpd/Makefile index 7cbd39e16b..3103525903 100644 --- a/package/network/services/uhttpd/Makefile +++ b/package/network/services/uhttpd/Makefile @@ -12,15 +12,14 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/uhttpd.git -PKG_SOURCE_DATE:=2022-08-12 -PKG_SOURCE_VERSION:=e3395cd90bed9b7b9fc319e79528fedcc0d947fe -PKG_MIRROR_HASH:=14e9df9f85c406b8abbb14427e5f678383782500c549d842c0481cd954fc4ea3 +PKG_SOURCE_DATE:=2023-06-25 +PKG_SOURCE_VERSION:=34a8a74dbdec3c0de38abc1b08f6a73c51263792 +PKG_MIRROR_HASH:=8206885eebed5d1827763bcc5bcf9ca3510ae22b0ad1f6432114f1136c32dde2 PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=ISC PKG_ASLR_PIE_REGULAR:=1 PKG_BUILD_DEPENDS = ustream-ssl -PKG_CONFIG_DEPENDS:= CONFIG_uhttpd_lua CONFIG_uhttpd_ucode include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -44,18 +43,6 @@ define Package/uhttpd/description HTTP daemon. endef -define Package/uhttpd/config - config uhttpd_lua - depends on PACKAGE_uhttpd-mod-lua - bool "Enable Integrated Lua interpreter" - default y - - config uhttpd_ucode - depends on PACKAGE_uhttpd-mod-ucode - bool "Enable Integrated ucode interpreter" - default y -endef - define Package/uhttpd/conffiles /etc/config/uhttpd /etc/uhttpd.crt @@ -101,17 +88,11 @@ ifneq ($(CONFIG_USE_GLIBC),) TARGET_CFLAGS += -D_DEFAULT_SOURCE endif -TARGET_LDFLAGS += -lcrypt - -CMAKE_OPTIONS += -DTLS_SUPPORT=on - define Package/uhttpd/install - $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_DIR) $(1)/etc/init.d $(1)/etc/config $(1)/usr/sbin $(INSTALL_BIN) ./files/uhttpd.init $(1)/etc/init.d/uhttpd - $(INSTALL_DIR) $(1)/etc/config $(INSTALL_CONF) ./files/uhttpd.config $(1)/etc/config/uhttpd $(VERSION_SED_SCRIPT) $(1)/etc/config/uhttpd - $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_BUILD_DIR)/uhttpd $(1)/usr/sbin/uhttpd endef diff --git a/package/network/services/uhttpd/files/uhttpd.init b/package/network/services/uhttpd/files/uhttpd.init index 6422362227..82010f0138 100755 --- a/package/network/services/uhttpd/files/uhttpd.init +++ b/package/network/services/uhttpd/files/uhttpd.init @@ -222,6 +222,7 @@ start_instance() service_triggers() { procd_add_reload_trigger "uhttpd" + procd_add_raw_trigger acme.renew 5000 /etc/init.d/uhttpd reload } start_service() { diff --git a/package/network/services/umdns/Makefile b/package/network/services/umdns/Makefile index 9dd8347bf4..e397ff7fb1 100644 --- a/package/network/services/umdns/Makefile +++ b/package/network/services/umdns/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2014-2021 OpenWrt.org +# Copyright (C) 2014-2023 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=umdns -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=5 PKG_SOURCE_URL=$(PROJECT_GIT)/mdnsd.git PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2021-05-13 -PKG_SOURCE_VERSION:=b777a0b53f7d89ab2a60e3eed7d98036806da9a4 -PKG_MIRROR_HASH:=54992acf7edd32610de7bcb0ea7c58b20f69bf1ac20be69e76abcff41f25e775 +PKG_SOURCE_DATE:=2023-10-19 +PKG_SOURCE_VERSION:=d45c443aa1e6514aab58bbbf9311913e484d31a6 +PKG_MIRROR_HASH:=20d91d867f4f34a37c7b2a600327884375f9f16c1ea9bbb3199347d8b617d856 PKG_MAINTAINER:=John Crispin PKG_LICENSE:=LGPL-2.1 diff --git a/package/network/services/unetd/Makefile b/package/network/services/unetd/Makefile new file mode 100644 index 0000000000..35d219bb17 --- /dev/null +++ b/package/network/services/unetd/Makefile @@ -0,0 +1,113 @@ +# +# Copyright (C) 2022 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=unetd +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL=$(PROJECT_GIT)/unetd.git +PKG_SOURCE_DATE:=2023-05-31 +PKG_SOURCE_VERSION:=7d3986b7a5a20b9af0dacd053b2657210385e7bb +PKG_MIRROR_HASH:=07f0a4cbae3e80c6309bb8aa27fcef19fbc56093a9c7e426e0d527227af09429 + +PKG_LICENSE:=GPL-2.0 +PKG_MAINTAINER:=Felix Fietkau + +PKG_BUILD_DEPENDS:=HAS_BPF_TOOLCHAIN:bpf-headers + +PKG_BUILD_PARALLEL:=1 + +PKG_CONFIG_DEPENDS += CONFIG_UNETD_VXLAN_SUPPORT + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk +include $(INCLUDE_DIR)/bpf.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/unetd + SECTION:=net + CATEGORY:=Network + TITLE:=WireGuard based VPN connection manager for libreCMC + DEPENDS:=+libubox +libubus +libblobmsg-json +libnl-tiny +kmod-wireguard +UNETD_VXLAN_SUPPORT:libbpf +endef + +define Package/unetd/config + config UNETD_VXLAN_SUPPORT + bool "VXLAN support" + depends on PACKAGE_unetd + depends on HAS_BPF_TOOLCHAIN + default y + +endef + +define Package/unet-dht + SECTION:=net + CATEGORY:=Network + DEPENDS:=unetd + TITLE:=unetd DHT discovery support +endef + +define Package/unet-cli + SECTION:=net + CATEGORY:=Network + DEPENDS:=+unetd +ucode +ucode-mod-fs + TITLE:=unetd administration command line utility +endef + +TARGET_CFLAGS += \ + -I$(STAGING_DIR)/usr/include/libnl-tiny \ + -I$(STAGING_DIR)/usr/include + +CMAKE_OPTIONS += \ + -DLIBNL_LIBS=-lnl-tiny \ + -DVXLAN_SUPPORT=$(if $(CONFIG_UNETD_VXLAN_SUPPORT),ON,OFF) + +ifdef CONFIG_UNETD_VXLAN_SUPPORT + define Build/Compile + $(call CompileBPF,$(PKG_BUILD_DIR)/mss-bpf.c) + $(call Build/Compile/Default,) + endef +endif + +define Package/unetd/conffiles +/etc/unetd +endef + +define Package/unetd/install + $(INSTALL_DIR) \ + $(1)/etc/unetd \ + $(1)/lib/bpf \ + $(1)/etc/init.d \ + $(1)/lib/netifd/proto \ + $(1)/usr/sbin \ + $(1)/usr/lib + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libunet.so* $(1)/usr/lib/ + $(INSTALL_BIN) \ + $(PKG_INSTALL_DIR)/usr/sbin/unetd \ + $(PKG_INSTALL_DIR)/usr/sbin/unet-tool \ + $(1)/usr/sbin/ + $(if $(CONFIG_UNETD_VXLAN_SUPPORT),$(INSTALL_DATA) $(PKG_BUILD_DIR)/mss-bpf.o $(1)/lib/bpf/mss.o) + $(INSTALL_BIN) ./files/unetd.init $(1)/etc/init.d/unetd + $(INSTALL_BIN) ./files/unetd.sh $(1)/lib/netifd/proto +endef + +define Package/unet-dht/install + $(INSTALL_DIR) \ + $(1)/etc/init.d \ + $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/unet-dht $(1)/usr/sbin + $(INSTALL_BIN) ./files/unet-dht.init $(1)/etc/init.d/unet-dht +endef + +define Package/unet-cli/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/unet-cli $(1)/usr/sbin +endef + +$(eval $(call BuildPackage,unetd)) +$(eval $(call BuildPackage,unet-dht)) +$(eval $(call BuildPackage,unet-cli)) diff --git a/package/network/services/unetd/files/unet-dht.init b/package/network/services/unetd/files/unet-dht.init new file mode 100644 index 0000000000..272626a933 --- /dev/null +++ b/package/network/services/unetd/files/unet-dht.init @@ -0,0 +1,24 @@ +#!/bin/sh /etc/rc.common +# Copyright (c) 2022 OpenWrt.org + +START=19 + +USE_PROCD=1 +PROG=/usr/sbin/unet-dht + +unet_dht_id() { + cat \ + /sys/class/net/eth?/address \ + /sys/class/ieee80211/phy*/macaddress \ + /etc/board.json | md5sum | awk '{ print $1 }' +} + +start_service() { + mkdir -p /var/run/unetd /etc/unetd + + procd_open_instance + procd_set_param command "$PROG" -u /var/run/unetd/socket -n /var/run/unetd/nodes.dat $(unet_dht_id) + procd_set_param respawn + procd_set_param limits core="unlimited" + procd_close_instance +} diff --git a/package/network/services/unetd/files/unetd.init b/package/network/services/unetd/files/unetd.init new file mode 100644 index 0000000000..c1124821ee --- /dev/null +++ b/package/network/services/unetd/files/unetd.init @@ -0,0 +1,17 @@ +#!/bin/sh /etc/rc.common +# Copyright (c) 2022 OpenWrt.org + +START=19 + +USE_PROCD=1 +PROG=/usr/sbin/unetd + +start_service() { + mkdir -p /var/run/unetd /etc/unetd + + procd_open_instance + procd_set_param command "$PROG" -h /var/run/unetd/hosts -u /var/run/unetd/socket + procd_set_param respawn + procd_set_param limits core="unlimited" + procd_close_instance +} diff --git a/package/network/services/unetd/files/unetd.sh b/package/network/services/unetd/files/unetd.sh new file mode 100644 index 0000000000..2f0f0c478c --- /dev/null +++ b/package/network/services/unetd/files/unetd.sh @@ -0,0 +1,99 @@ +#!/bin/sh + +[ -x /usr/sbin/unetd ] || exit 0 + +. /lib/functions.sh +. /lib/functions/network.sh +. ../netifd-proto.sh + +init_proto "$@" + +proto_unet_init_config() { + proto_config_add_string device + proto_config_add_string type + proto_config_add_string auth_key + proto_config_add_string key + proto_config_add_string file + proto_config_add_int keepalive + proto_config_add_string domain + proto_config_add_boolean dht + proto_config_add_array "tunnels:list(string)" + proto_config_add_array "connect:list(string)" + proto_config_add_array "peer_data:list(string)" + no_device=1 + available=1 + no_proto_task=1 +} + +proto_unet_setup() { + local config="$1" + + local device type key file keepalive domain tunnels + json_get_vars device type auth_key key file keepalive domain dht + json_get_values tunnels tunnels + json_get_values connect connect + json_get_values peer_data peer_data + device="${device:-$config}" + + [ -n "$auth_key" ] && type="${type:-dynamic}" + [ -n "$file" ] && type="${type:-file}" + + json_init + json_add_string name "$device" + json_add_string type "$type" + json_add_string interface "$config" + json_add_string auth_key "$auth_key" + json_add_string key "$key" + json_add_string file "$file" + [ -n "$keepalive" ] && json_add_int keepalive "$keepalive" + [ -n "$dht" ] && json_add_boolean dht "$dht" + json_add_string domain "$domain" + + json_add_object tunnels + for t in $tunnels; do + local ifname="${t%%=*}" + local service="${t#*=}" + [ -n "$ifname" -a -n "$service" -a "$ifname" != "$t" ] || continue + json_add_string "$ifname" "$service" + done + json_close_object + + json_add_array auth_connect + for c in $connect; do + json_add_string "" "$c" + done + json_close_array + + json_add_array peer_data + for c in $peer_data; do + json_add_string "" "$c" + done + json_close_array + + ip link del dev "$device" >/dev/null 2>&1 + ip link add dev "$device" type wireguard || { + echo "Could not create wireguard device $device" + proto_setup_failed "$config" + exit 1 + } + + ubus call unetd network_add "$(json_dump)" +} + +proto_unet_teardown() { + local config="$1" + local iface="$2" + + local device + json_get_vars device + device="${device:-$iface}" + + json_init + json_add_string name "$device" + + ip link del dev "$device" + + ubus call unetd network_del "$(json_dump)" +} + +add_protocol unet diff --git a/package/network/services/ustp/Makefile b/package/network/services/ustp/Makefile index babc2786ea..d830b7d44e 100644 --- a/package/network/services/ustp/Makefile +++ b/package/network/services/ustp/Makefile @@ -19,6 +19,8 @@ PKG_MIRROR_HASH:=0e96edc983cf437b95874e5715d743f30bb826d8757dc3771ff872ab9cf18f3 PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0 +PKG_BUILD_FLAGS:=lto + include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -29,8 +31,7 @@ define Package/ustp DEPENDS:=+libubox +libubus endef -TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include -flto -TARGET_LDFLAGS += -flto -fuse-linker-plugin +TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include define Package/ustp/install $(INSTALL_DIR) $(1)/sbin $(1)/etc/init.d diff --git a/package/network/utils/aria2/Config.in b/package/network/utils/aria2/Config.in new file mode 100644 index 0000000000..c5b0ac898f --- /dev/null +++ b/package/network/utils/aria2/Config.in @@ -0,0 +1,83 @@ +menu "Aria2 Configuration" + depends on PACKAGE_aria2 + +choice + prompt "SSL Library" + default ARIA2_OPENSSL + +config ARIA2_OPENSSL + bool "OpenSSL" + +config ARIA2_GNUTLS + bool "GnuTLS" + +config ARIA2_NOSSL + bool "No SSL Support" + +endchoice + +choice + prompt "Crypto Library" + depends on !ARIA2_OPENSSL + default ARIA2_NOCRYPTO + +config ARIA2_NETTLE + bool "Nettle" + +config ARIA2_LIBGCRYPT + bool "Libgcrypt" + +config ARIA2_NOCRYPTO + bool "No Crypto Library" + +endchoice + +choice + prompt "XML Library" + default ARIA2_NOXML + +config ARIA2_LIBXML2 + bool "Libxml2" + +config ARIA2_EXPAT + bool "Expat" + +config ARIA2_NOXML + bool "No XML Library" + +endchoice + +config ARIA2_GMP + bool "GNU Multiple Precision Arithmetic Library" + depends on ARIA2_NETTLE + default n + +config ARIA2_BITTORRENT + bool "Enable Bittorrent Support" + depends on ARIA2_OPENSSL || ARIA2_LIBGCRYPT || \ + (ARIA2_NETTLE && ARIA2_GMP) + default y + +config ARIA2_METALINK + bool "Enable Metalink Support" + depends on !ARIA2_NOXML + default n + +config ARIA2_SFTP + bool "Enable SFTP Support" + default n + +config ARIA2_ASYNC_DNS + bool "Enable Async DNS Support" + default n + +config ARIA2_COOKIE + bool "Enable Firefox3/Chromium Cookie Support" + default n + +config ARIA2_WEBSOCKET + bool "Enable JSON-RPC over WebSocket Support" + depends on ARIA2_OPENSSL || ARIA2_LIBGCRYPT || ARIA2_NETTLE + default y + +endmenu diff --git a/package/network/utils/aria2/Makefile b/package/network/utils/aria2/Makefile new file mode 100644 index 0000000000..019d0cedd5 --- /dev/null +++ b/package/network/utils/aria2/Makefile @@ -0,0 +1,101 @@ +# +# Copyright (C) 2012-2021 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# +include $(TOPDIR)/rules.mk + +PKG_NAME:=aria2 +PKG_VERSION:=1.36.0 +PKG_RELEASE:=2 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=https://github.com/aria2/aria2/releases/download/release-$(PKG_VERSION)/ +PKG_HASH:=58d1e7608c12404f0229a3d9a4953d0d00c18040504498b483305bcb3de907a5 +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 +PKG_BUILD_FLAGS:=gc-sections lto + +PKG_MAINTAINER:=Imre Kaloz , \ + Hsing-Wang Liao +PKG_LICENSE:=GPLv2 +PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:tatsuhiro_tsujikawa:aria2 + +PKG_CONFIG_DEPENDS := \ + CONFIG_ARIA2_NOSSL \ + CONFIG_ARIA2_OPENSSL \ + CONFIG_ARIA2_NOCRYPTO \ + CONFIG_ARIA2_NETTLE \ + CONFIG_ARIA2_LIBGCRYPT \ + CONFIG_ARIA2_LIBXML2 \ + CONFIG_ARIA2_EXPAT \ + CONFIG_ARIA2_GMP \ + CONFIG_ARIA2_BITTORRENT \ + CONFIG_ARIA2_METALINK \ + CONFIG_ARIA2_SFTP \ + CONFIG_ARIA2_ASYNC_DNS \ + CONFIG_ARIA2_COOKIE \ + CONFIG_ARIA2_WEBSOCKET + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/aria2/config + source "$(SOURCE)/Config.in" +endef + +define Package/aria2 + SECTION:=net + CATEGORY:=Network + SUBMENU:=File Transfer + TITLE:=lightweight download utility + URL:=https://aria2.github.io/ + DEPENDS:=+zlib +libstdcpp +ARIA2_OPENSSL:libopenssl \ + +ARIA2_NETTLE:libnettle +ARIA2_LIBGCRYPT:libgcrypt +ARIA2_GMP:libgmp \ + +ARIA2_LIBXML2:libxml2 +ARIA2_EXPAT:libexpat +ARIA2_SFTP:libssh2 \ + +ARIA2_ASYNC_DNS:libcares +ARIA2_COOKIE:libsqlite3 + USERID:=aria2=6800:aria2=6800 +endef + +define Package/aria2/description + aria2 is a lightweight multi-protocol & multi-source command-line download + utility +endef + +CONFIGURE_ARGS += \ + --disable-nls \ + --without-gnutls \ + $(if $(CONFIG_ARIA2_NOSSL),--disable,--enable)-ssl \ + $(if $(CONFIG_ARIA2_BITTORRENT),--enable,--disable)-bittorrent \ + $(if $(CONFIG_ARIA2_METALINK),--enable,--disable)-metalink \ + $(if $(CONFIG_ARIA2_WEBSOCKET),--enable,--disable)-websocket \ + $(if $(CONFIG_ARIA2_OPENSSL),--with,--without)-openssl \ + $(if $(CONFIG_ARIA2_NETTLE),--with,--without)-libnettle \ + $(if $(CONFIG_ARIA2_LIBGCRYPT),--with,--without)-libgcrypt \ + $(if $(CONFIG_ARIA2_GMP),--with,--without)-libgmp \ + $(if $(CONFIG_ARIA2_LIBXML2),--with,--without)-libxml2 \ + $(if $(CONFIG_ARIA2_EXPAT),--with,--without)-libexpat \ + $(if $(CONFIG_ARIA2_SFTP),--with,--without)-libssh2 \ + $(if $(CONFIG_ARIA2_ASYNC_DNS),--with,--without)-libcares \ + $(if $(CONFIG_ARIA2_COOKIE),--with,--without)-sqlite3 \ + --without-libuv \ + --with-libz + +define Package/aria2/conffiles +/etc/config/aria2 +endef + +define Package/aria2/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/aria2c $(1)/usr/bin + + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/aria2.init $(1)/etc/init.d/aria2 + + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_CONF) ./files/aria2.conf $(1)/etc/config/aria2 +endef + +$(eval $(call BuildPackage,aria2)) diff --git a/package/network/utils/aria2/files/aria2.conf b/package/network/utils/aria2/files/aria2.conf new file mode 100644 index 0000000000..108a30e012 --- /dev/null +++ b/package/network/utils/aria2/files/aria2.conf @@ -0,0 +1,31 @@ + +# You can use most aria2 command-line options, replace '-' with '_'. +# eg. 'rpc-secret' ==> 'rpc_secret' +# +# We do not support all options at this time. But you can add any option +# with 'list extra_settings'. +# +# You can also add new config sections to define multi instance. +# +config aria2 'main' + option enabled '0' + option user 'aria2' + option dir '/mnt/sda1/aria2' + option config_dir '/var/etc/aria2' + option bt_enable_lpd 'true' + option enable_dht 'true' + option follow_torrent 'true' + option file_allocation 'none' + option save_session_interval '30' + + # Add addition Headers here. + # eg. list header 'Content-Encoding: gzip' + list header '' + + # Add BT trackers here. + # eg. list bt_tracker 'http://tracker.example.com/announce' + list bt_tracker '' + + # Add extra settings here. + # eg. list extra_settings 'option=value' + list extra_settings '' diff --git a/package/network/utils/aria2/files/aria2.init b/package/network/utils/aria2/files/aria2.init new file mode 100755 index 0000000000..deef3077fa --- /dev/null +++ b/package/network/utils/aria2/files/aria2.init @@ -0,0 +1,357 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2016-2017 Hsing-wang Liao +# Licensed to the public under the Apache License 2.0. + +START=99 +USE_PROCD=1 + +NAME=aria2 +PROG=/usr/bin/aria2c + +_info() { + logger -p daemon.info -t "$NAME" "$*" +} + +_err() { + logger -p daemon.err -t "$NAME" "$*" +} + +_make_dir() { + local d + for d in "$@"; do + if [ ! -d "$d" ]; then + mkdir -p "$d" 2>/dev/null || return 1 + fi + done + + return 0 +} + +_create_file() { + touch "$@" 2>/dev/null +} + +_change_owner() { + local u="$1"; shift + + local d + for d in "$@"; do + if [ -f "$d" ]; then + chown "$u" "$d" 2>/dev/null || return 1 + elif [ -d "$d" ]; then + chown -R "$u" "$d" 2>/dev/null || return 1 + fi + done + + return 0 +} + +_change_file_mode() { + local mod="$1"; shift + chmod "$mod" "$@" 2>/dev/null +} + +_reset_dir_mode() { + local d + for d in "$@"; do + if [ -d "$d" ]; then + find "$d" -type d -exec chmod 755 {} \; 2>/dev/null + find "$d" -type f -exec chmod 644 {} \; 2>/dev/null + fi + done +} + +append_options() { + local o; local v + for o in "$@"; do + v="$(eval echo "\$$o")" + [ -n "$v" ] && \ + echo "${o//_/-}=$v" >>"$config_file_tmp" + done +} + +append_setting() { + local s="$1" + [ -n "$s" ] && \ + echo "$s" >>"$config_file_tmp" +} + +append_header() { + local h="$1" + [ -n "$h" ] && \ + echo "header=\"$h\"" >>"$config_file_tmp" +} + +aria2_validate() { + uci_load_validate "$NAME" aria2 "$1" "$2" \ + 'enabled:bool:0' \ + 'enable_logging:bool' \ + 'enable_proxy:bool' \ + 'config_dir:string:/var/etc/aria2' \ + 'user:string' \ + 'all_proxy:string' \ + 'all_proxy_passwd:string' \ + 'all_proxy_user:string' \ + 'auto_save_interval:range(0,600)' \ + 'bt_enable_lpd:or("true","false")' \ + 'bt_detach_seed_only:or("true","false")' \ + 'bt_load_saved_metadata:or("true","false")' \ + 'bt_prioritize_piece:string' \ + 'bt_max_open_files:uinteger' \ + 'bt_max_peers:uinteger' \ + 'bt_remove_unselected_file:or("true","false")' \ + 'bt_request_peer_speed_limit:string' \ + 'bt_save_metadata:or("true","false")' \ + 'bt_seed_unverified:or("true","false")' \ + 'bt_stop_timeout:uinteger' \ + 'bt_tracker:list(string)' \ + 'ca_certificate:file' \ + 'certificate:file' \ + 'check_certificate:or("true","false"):true' \ + 'check_integrity:or("true","false")' \ + 'connect_timeout:uinteger' \ + 'dht_listen_port:string' \ + 'dir:string' \ + 'disable_ipv6:or("true","false")' \ + 'disk_cache:string' \ + 'enable_dht:or("true","false"):true' \ + 'enable_dht6:or("true","false")' \ + 'enable_peer_exchange:or("true","false")' \ + 'event_poll:or("epoll","kqueue","port","poll","select")' \ + 'file_allocation:or("none","prealloc","trunc","falloc")' \ + 'follow_torrent:or("true","false","mem")' \ + 'force_save:or("true","false")' \ + 'http_accept_gzip:or("true","false")' \ + 'http_no_cache:or("true","false")' \ + 'listen_port:string' \ + 'log:string' \ + 'log_level:or("debug","info","notice","warn","error")' \ + 'lowest_speed_limit:string' \ + 'max_concurrent_downloads:uinteger' \ + 'max_connection_per_server:uinteger' \ + 'max_download_limit:string' \ + 'max_overall_download_limit:string' \ + 'max_overall_upload_limit:string' \ + 'max_tries:uinteger' \ + 'max_upload_limit:string' \ + 'min_split_size:string' \ + 'pause:or("true","false")' \ + 'pause_metadata:or("true","false")' \ + 'peer_id_prefix:string' \ + 'private_key:file' \ + 'retry_wait:uinteger' \ + 'rpc_auth_method:or("none","user_pass","token")' \ + 'rpc_certificate:file' \ + 'rpc_listen_port:range(1024,65535)' \ + 'rpc_passwd:string' \ + 'rpc_private_key:file' \ + 'rpc_secret:string' \ + 'rpc_secure:or("true","false")' \ + 'rpc_user:string' \ + 'save_session_interval:uinteger' \ + 'seed_ratio:ufloat' \ + 'seed_time:ufloat' \ + 'split:uinteger' \ + 'timeout:uinteger' \ + 'user_agent:string' +} + +aria2_start() { + local section="$1" + [ "$2" = "0" ] || { _err "Validation failed."; return 1; } + + [ "$enabled" = "1" ] || { _info "Instance \"$section\" disabled."; return 1; } + [ -n "$dir" ] || { _err "Please set download dir."; return 1; } + [ -d "$dir" ] || { _err "Please create download dir first."; return 1; } + + config_file="$config_dir/$NAME.conf.$section" + config_file_tmp="$config_dir/$NAME.conf.tmp" + session_file="$config_dir/$NAME.session.$section" + + _make_dir "$config_dir" || { + _err "Can't create config dir: $config_dir" + return 1 + } + + _create_file "$session_file" "$config_file" "$config_file_tmp" || { + _err "Can't create files: $session_file, $config_file, $config_file_tmp" + return 1 + } + + # create tmp file + cat >"$config_file_tmp" <<-EOF + # Auto generated file, changes to this file will be lost. + EOF + + append_setting "dir=$dir" + append_setting "enable-rpc=true" + append_setting "rpc-allow-origin-all=true" + append_setting "rpc-listen-all=true" + append_setting "quiet=true" + append_setting "continue=true" + append_setting "input-file=$session_file" + append_setting "save-session=$session_file" + + if [ -z "$enable_logging" ]; then + append_options "log" "log_level" + elif [ "$enable_logging" = "1" ]; then + log=${log:-"/var/log/aria2.log"} + + local log_dir + log_dir="$(dirname "$log")" + + _make_dir "$log_dir" || { + _err "Can't create log dir: $log_dir" + return 1 + } + + # create or clear log file + echo >"$log" + + append_setting "log=$log" + append_options "log_level" + fi + + if [ -z "$enable_proxy" ] || [ "$enable_proxy" = "1" ]; then + append_options "all_proxy" "all_proxy_user" "all_proxy_passwd" + fi + + unset_auth_method() { + uci -q batch <<-EOF + set $NAME.$section.rpc_auth_method="" + commit $NAME + EOF + } + + if [ -z "$rpc_auth_method" ]; then + if [ -n "$rpc_secret" ]; then + append_setting "rpc-secret=$rpc_secret" + elif [ -n "$rpc_user" ]; then + append_setting "rpc-user=$rpc_user" + append_setting "rpc-passwd=$rpc_passwd" + else + _info "It is recommended to set RPC secret." + fi + elif [ "$rpc_auth_method" = "token" ]; then + if [ -n "$rpc_secret" ]; then + append_setting "rpc-secret=$rpc_secret" + else + unset_auth_method + fi + elif [ "$rpc_auth_method" = "user_pass" ]; then + if [ -n "$rpc_user" ]; then + append_setting "rpc-user=$rpc_user" + append_setting "rpc-passwd=$rpc_passwd" + else + _info "Please set RPC user." + unset_auth_method + fi + fi + + if [ ."$rpc_secure" = ."true" ] && [ -n "$rpc_certificate" ]; then + append_setting "rpc-secure=true" + append_options "rpc_certificate" "rpc_private_key" + fi + + if [ ."$check_certificate" = ."true" ]; then + append_setting "check-certificate=true" + append_options "ca_certificate" + elif [ ."$check_certificate" = ."false" ]; then + append_setting "check-certificate=false" + fi + + if [ ."$enable_dht" = ."true" ]; then + dht_file="$config_dir/dht.dat.$section" + _create_file "$dht_file" || { + _err "Can't create DHT file: $dht_file" + return 1 + } + + append_setting "enable-dht=true" + append_setting "dht-file-path=$dht_file" + fi + + if [ ."$enable_dht6" = ."true" ] && [ ."$disable_ipv6" != ."true" ]; then + dht6_file="$config_dir/dht6.dat.$section" + _create_file "$dht6_file" || { + _err "Can't create DHT6 file: $dht6_file" + return 1 + } + + append_setting "enable-dht6=true" + append_setting "dht-file-path6=$dht6_file" + fi + + if [ -n "$bt_tracker" ]; then + local bt_tracker_list; local t + for t in $bt_tracker; do + if [ -z "$bt_tracker_list" ]; then + bt_tracker_list="$t" + else + bt_tracker_list="$bt_tracker_list,$t" + fi + done + + append_setting "bt-tracker=$bt_tracker_list" + fi + + append_options "auto_save_interval" "bt_enable_lpd" "bt_max_open_files" "bt_max_peers" \ + "bt_remove_unselected_file" "bt_request_peer_speed_limit" "bt_prioritize_piece" \ + "bt_stop_timeout" "bt_detach_seed_only" "bt_save_metadata" "bt_load_saved_metadata" \ + "bt_seed_unverified" "certificate" "check_integrity" "connect_timeout" "dht_listen_port" \ + "disable_ipv6" "disk_cache" "enable_peer_exchange" "event_poll" "file_allocation" \ + "follow_torrent" "force_save" "http_accept_gzip" "http_no_cache" "listen_port" \ + "lowest_speed_limit" "max_concurrent_downloads" "max_connection_per_server" \ + "max_download_limit" "max_overall_download_limit" "max_overall_upload_limit" "max_tries" \ + "max_upload_limit" "min_split_size" "pause" "pause_metadata" "peer_id_prefix" "private_key" \ + "retry_wait" "rpc_listen_port" "save_session_interval" "seed_ratio" "seed_time" "split" "timeout" \ + "user_agent" + + config_list_foreach "$section" "header" append_header + config_list_foreach "$section" "extra_settings" append_setting + + sed '/^$/d' "$config_file_tmp" >"$config_file" + rm -f "$config_file_tmp" + + _reset_dir_mode "$config_dir" + _change_file_mode 600 "$config_file" + + if [ -n "$user" ]; then + if ( user_exists "$user" && _change_owner "$user" "$config_dir" "$log" ); then + _info "Aria2 will run with user '$user'." + if [ "$user" != "root" ]; then + _info "Please make sure user '$user' has write access to download dir: $dir" + fi + else + _info "Setting run user to '$user' failed, default user will be used." + user= + fi + fi + + procd_open_instance "$NAME.$section" + procd_set_param command "$PROG" + procd_append_param command --conf-path="$config_file" + + procd_set_param respawn + procd_set_param stdout 1 + procd_set_param stderr 1 + + procd_set_param file "$config_file" + [ -n "$user" ] && \ + procd_set_param user "$user" + + procd_add_jail "$NAME.$section" log + procd_add_jail_mount "$ca_certificate" "$certificate" "$rpc_certificate" "$rpc_private_key" + procd_add_jail_mount_rw "$dir" "$config_dir" "$log" + procd_close_instance +} + +service_triggers() { + procd_add_reload_trigger "$NAME" + procd_add_validation aria2_validate +} + +start_service() { + config_load "$NAME" + config_foreach aria2_validate "aria2" aria2_start +} diff --git a/package/network/utils/arptables/Makefile b/package/network/utils/arptables/Makefile index 6f06c7037a..5c9866b890 100644 --- a/package/network/utils/arptables/Makefile +++ b/package/network/utils/arptables/Makefile @@ -1,21 +1,20 @@ -# Copyright (C) 2006-2016 OpenWrt.org +# SPDX-License-Identifier: GPL-2.0-only # -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. +# Copyright (C) 2006-2016 OpenWrt.org # include $(TOPDIR)/rules.mk PKG_NAME:=arptables +PKG_VERSION:=0.0.5 PKG_RELEASE:=1 -PKG_SOURCE_URL:=https://git.netfilter.org/arptables -PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2015-05-20 -PKG_SOURCE_VERSION:=f4ab8f63f11a72f14687a6646d04ae1bae3fa45f -PKG_MIRROR_HASH:=84bc660be4c9f70be91046acfd87785add930eceab7c543036058e1a9de2e9d9 +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://netfilter.org/pub/arptables +PKG_HASH:=4f9a0656ce5c90868f551cd4deeb2d04f33899667e1fb2818b64e432fe8f629c PKG_LICENSE:=GPL-2.0 +PKG_LICENSE_FILES:=COPYING include $(INCLUDE_DIR)/package.mk @@ -37,7 +36,7 @@ MAKE_FLAGS += \ define Package/arptables-legacy/install $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/arptables $(1)/usr/sbin/arptables-legacy + $(INSTALL_BIN) $(PKG_BUILD_DIR)/arptables-legacy $(1)/usr/sbin/arptables-legacy endef $(eval $(call BuildPackage,arptables-legacy)) diff --git a/package/network/utils/bpftool/Makefile b/package/network/utils/bpftool/Makefile new file mode 100644 index 0000000000..43fc7bd793 --- /dev/null +++ b/package/network/utils/bpftool/Makefile @@ -0,0 +1,99 @@ +# +# Copyright (C) 2020-2023 Tony Ambardar +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=bpftools +PKG_VERSION:=7.2.0 +PKG_RELEASE:=1 + +PKG_SOURCE_URL:=https://github.com/libbpf/bpftool +PKG_SOURCE_PROTO:=git +PKG_SOURCE_VERSION:=19ff0564980a7429e730f6987a0b0bf418b3c676 +PKG_MIRROR_HASH:=f9b9871f64986dd2e5dab7060bb919398256ba93964da49c62efaf0e6bc9bbc4 + +PKG_MAINTAINER:=Tony Ambardar + +PKG_BUILD_FLAGS:=no-mips16 +PKG_BUILD_PARALLEL:=1 +PKG_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/bpftool/Default + SECTION:=net + CATEGORY:=Network + TITLE:=bpftool - eBPF subsystem utility + LICENSE:=GPL-2.0-only OR BSD-2-Clause + URL:=http://www.kernel.org + DEPENDS:=+libelf +endef + +define Package/bpftool-minimal + $(call Package/bpftool/Default) + TITLE+= (Minimal) + VARIANT:=minimal + DEFAULT_VARIANT:=1 + PROVIDES:=bpftool + ALTERNATIVES:=200:/usr/sbin/bpftool:/usr/libexec/bpftool-minimal +endef + +define Package/bpftool-full + $(call Package/bpftool/Default) + TITLE+= (Full) + VARIANT:=full + PROVIDES:=bpftool + ALTERNATIVES:=300:/usr/sbin/bpftool:/usr/libexec/bpftool-full + DEPENDS+= +libbfd +libopcodes +endef + +define Package/bpftool-minimal/description + A tool for inspection and simple manipulation of eBPF programs and maps. +endef + +define Package/bpftool-full/description + A tool for inspection and simple manipulation of eBPF programs and maps. + This full version uses libbfd and libopcodes to support disassembly of + eBPF programs and jited code. +endef + +TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto +TARGET_LDFLAGS += -Wl,--gc-sections -flto + +ifeq ($(BUILD_VARIANT),full) + full:=1 +else + full:=0 +endif + +MAKE_VARS = \ + EXTRA_CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \ + LDFLAGS="$(TARGET_LDFLAGS)" + +MAKE_FLAGS += \ + OUTPUT="$(PKG_BUILD_DIR)/" \ + prefix="/usr" \ + $(if $(findstring c,$(LIBRECMC_VERBOSE)),V=1,V='') \ + check_feat=0 \ + feature-clang-bpf-co-re=0 \ + feature-libbfd=$(full) \ + feature-llvm=0 \ + feature-libcap=0 \ + feature-disassembler-four-args=1 \ + feature-disassembler-init-styled=1 + +MAKE_PATH = src + +define Package/bpftool-$(BUILD_VARIANT)/install + $(INSTALL_DIR) $(1)/usr/libexec + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/bpftool \ + $(1)/usr/libexec/bpftool-$(BUILD_VARIANT) +endef + +$(eval $(call BuildPackage,bpftool-full)) +$(eval $(call BuildPackage,bpftool-minimal)) diff --git a/package/network/utils/bpftool/patches/001-cflags.patch b/package/network/utils/bpftool/patches/001-cflags.patch new file mode 100644 index 0000000000..b06842a0be --- /dev/null +++ b/package/network/utils/bpftool/patches/001-cflags.patch @@ -0,0 +1,10 @@ +--- a/libbpf/src/Makefile ++++ b/libbpf/src/Makefile +@@ -34,6 +34,7 @@ ALL_CFLAGS := $(INCLUDES) + + SHARED_CFLAGS += -fPIC -fvisibility=hidden -DSHARED + ++CFLAGS = $(EXTRA_CFLAGS) + CFLAGS ?= -g -O2 -Werror -Wall -std=gnu89 + ALL_CFLAGS += $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $(EXTRA_CFLAGS) + ALL_LDFLAGS += $(LDFLAGS) $(EXTRA_LDFLAGS) diff --git a/package/network/utils/bpftool/patches/002-includes.patch b/package/network/utils/bpftool/patches/002-includes.patch new file mode 100644 index 0000000000..ac1b5fcc22 --- /dev/null +++ b/package/network/utils/bpftool/patches/002-includes.patch @@ -0,0 +1,26 @@ +--- a/libbpf/include/linux/list.h ++++ b/libbpf/include/linux/list.h +@@ -3,6 +3,8 @@ + #ifndef __LINUX_LIST_H + #define __LINUX_LIST_H + ++#include ++ + #define LIST_HEAD_INIT(name) { &(name), &(name) } + #define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) +--- a/src/Makefile ++++ b/src/Makefile +@@ -73,10 +73,10 @@ CFLAGS += -W -Wall -Wextra -Wno-unused-p + CFLAGS += $(filter-out -Wswitch-enum -Wnested-externs,$(EXTRA_WARNINGS)) + CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \ + -I$(or $(OUTPUT),.) \ +- -I$(LIBBPF_INCLUDE) \ + -I$(srctree)/src/kernel/bpf/ \ + -I$(srctree)/include \ +- -I$(srctree)/include/uapi ++ -I$(srctree)/include/uapi \ ++ -I$(LIBBPF_INCLUDE) + ifneq ($(BPFTOOL_VERSION),) + CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"' + endif diff --git a/package/network/utils/bpftools/Makefile b/package/network/utils/bpftools/Makefile deleted file mode 100644 index 56422e7902..0000000000 --- a/package/network/utils/bpftools/Makefile +++ /dev/null @@ -1,149 +0,0 @@ -# -# Copyright (C) 2020 Tony Ambardar -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=bpftools -PKG_RELEASE:=1 - -PKG_SOURCE_URL:=https://github.com/libbpf/bpftool -PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2022-03-08 -PKG_SOURCE_VERSION:=04c465fd1f561f67796dc68bbfe1aa7cfa956c3c -PKG_MIRROR_HASH:=e22a954cd186f43228a96586bbdc120b11e6c87360ab88ae96ba37afb9c7cb58 -PKG_ABI_VERSION:=$(call abi_version_str,$(PKG_SOURCE_DATE)) - -PKG_MAINTAINER:=Tony Ambardar - -PKG_USE_MIPS16:=0 -PKG_BUILD_PARALLEL:=1 -PKG_INSTALL:=1 - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/nls.mk - -define Package/bpftool/Default - SECTION:=net - CATEGORY:=Network - TITLE:=bpftool - eBPF subsystem utility - LICENSE:=GPL-2.0-only OR BSD-2-Clause - URL:=http://www.kernel.org - DEPENDS:=+libelf -endef - -define Package/bpftool-minimal - $(call Package/bpftool/Default) - TITLE+= (Minimal) - VARIANT:=minimal - DEFAULT_VARIANT:=1 - PROVIDES:=bpftool - ALTERNATIVES:=200:/usr/sbin/bpftool:/usr/libexec/bpftool-minimal -endef - -define Package/bpftool-full - $(call Package/bpftool/Default) - TITLE+= (Full) - VARIANT:=full - PROVIDES:=bpftool - ALTERNATIVES:=300:/usr/sbin/bpftool:/usr/libexec/bpftool-full - DEPENDS+= +libbfd +libopcodes -endef - -define Package/bpftool-minimal/description - A tool for inspection and simple manipulation of eBPF programs and maps. -endef - -define Package/bpftool-full/description - A tool for inspection and simple manipulation of eBPF programs and maps. - This full version uses libbfd and libopcodes to support disassembly of - eBPF programs and jited code. -endef - -define Package/libbpf - SECTION:=libs - CATEGORY:=Libraries - TITLE:=libbpf - eBPF helper library - VARIANT:=lib - LICENSE:=LGPL-2.1 OR BSD-2-Clause - ABI_VERSION:=$(PKG_ABI_VERSION) - URL:=http://www.kernel.org - DEPENDS:=+libelf -endef - -define Package/libbpf/description - libbpf is a library for loading eBPF programs and reading and manipulating eBPF objects from user-space. -endef - - -# LTO not compatible with DSO using PIC -ifneq ($(BUILD_VARIANT),lib) - TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto - TARGET_LDFLAGS += -Wl,--gc-sections -endif - -ifeq ($(BUILD_VARIANT),full) - full:=1 -else - full:=0 -endif - -MAKE_VARS = \ - EXTRA_CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \ - LDFLAGS="$(TARGET_LDFLAGS)" - -MAKE_FLAGS += \ - OUTPUT="$(PKG_BUILD_DIR)/" \ - prefix="/usr" \ - $(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') \ - LIBSUBDIR=lib \ - check_feat=0 \ - feature-clang-bpf-co-re=0 \ - feature-reallocarray=1 \ - feature-zlib=1 \ - feature-libbfd=$(full) \ - feature-libcap=0 \ - feature-disassembler-four-args=$(full) - -ifeq ($(BUILD_VARIANT),lib) - MAKE_PATH = libbpf/src -else - MAKE_PATH = src -endif - -define Build/InstallDev/libbpf - $(INSTALL_DIR) $(1)/usr/include/bpf - $(CP) $(PKG_INSTALL_DIR)/usr/include/bpf/*.h $(1)/usr/include/bpf/ - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libbpf.{a,so*} \ - $(1)/usr/lib/ - $(INSTALL_DIR) $(1)/usr/lib/pkgconfig - $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libbpf.pc \ - $(1)/usr/lib/pkgconfig/ - $(SED) 's,/usr/include,$$$${prefix}/include,g' \ - $(1)/usr/lib/pkgconfig/libbpf.pc - $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' \ - $(1)/usr/lib/pkgconfig/libbpf.pc -endef - -ifeq ($(BUILD_VARIANT),lib) - Build/InstallDev=$(Build/InstallDev/libbpf) -endif - -define Package/bpftool-$(BUILD_VARIANT)/install - $(INSTALL_DIR) $(1)/usr/libexec - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/bpftool \ - $(1)/usr/libexec/bpftool-$(BUILD_VARIANT) -endef - -define Package/libbpf/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libbpf.so.* $(1)/usr/lib/ -endef - -$(eval $(call BuildPackage,libbpf)) -$(eval $(call BuildPackage,bpftool-full)) -$(eval $(call BuildPackage,bpftool-minimal)) diff --git a/package/network/utils/bpftools/patches/001-cflags.patch b/package/network/utils/bpftools/patches/001-cflags.patch deleted file mode 100644 index 48617e302b..0000000000 --- a/package/network/utils/bpftools/patches/001-cflags.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/libbpf/src/Makefile -+++ b/libbpf/src/Makefile -@@ -25,6 +25,7 @@ ALL_CFLAGS := $(INCLUDES) - - SHARED_CFLAGS += -fPIC -fvisibility=hidden -DSHARED - -+CFLAGS = $(EXTRA_CFLAGS) - CFLAGS ?= -g -O2 -Werror -Wall -std=gnu89 - ALL_CFLAGS += $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 - ALL_LDFLAGS += $(LDFLAGS) diff --git a/package/network/utils/bpftools/patches/002-includes.patch b/package/network/utils/bpftools/patches/002-includes.patch deleted file mode 100644 index 589d71c31e..0000000000 --- a/package/network/utils/bpftools/patches/002-includes.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- a/libbpf/include/linux/list.h -+++ b/libbpf/include/linux/list.h -@@ -3,6 +3,8 @@ - #ifndef __LINUX_LIST_H - #define __LINUX_LIST_H - -+#include -+ - #define LIST_HEAD_INIT(name) { &(name), &(name) } - #define LIST_HEAD(name) \ - struct list_head name = LIST_HEAD_INIT(name) ---- a/src/Makefile -+++ b/src/Makefile -@@ -73,10 +73,10 @@ CFLAGS += -W -Wall -Wextra -Wno-unused-p - CFLAGS += $(filter-out -Wswitch-enum -Wnested-externs,$(EXTRA_WARNINGS)) - CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \ - -I$(if $(OUTPUT),$(OUTPUT),.) \ -- -I$(LIBBPF_INCLUDE) \ - -I$(srctree)/src/kernel/bpf/ \ - -I$(srctree)/include \ -- -I$(srctree)/include/uapi -+ -I$(srctree)/include/uapi \ -+ -I$(LIBBPF_INCLUDE) - ifneq ($(BPFTOOL_VERSION),) - CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"' - endif diff --git a/package/network/utils/comgt/Makefile b/package/network/utils/comgt/Makefile index 24dae2521e..429c938602 100644 --- a/package/network/utils/comgt/Makefile +++ b/package/network/utils/comgt/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=comgt PKG_VERSION:=0.32 -PKG_RELEASE:=34 +PKG_RELEASE:=35 PKG_SOURCE:=$(PKG_NAME).$(PKG_VERSION).tgz PKG_SOURCE_URL:=@SF/comgt @@ -79,6 +79,7 @@ define Package/comgt/install $(INSTALL_DATA) ./files/getcarrier.gcom $(1)/etc/gcom/getcarrier.gcom $(INSTALL_DATA) ./files/getcnum.gcom $(1)/etc/gcom/getcnum.gcom $(INSTALL_DATA) ./files/getimsi.gcom $(1)/etc/gcom/getimsi.gcom + $(INSTALL_DATA) ./files/runcommand.gcom $(1)/etc/gcom/runcommand.gcom $(INSTALL_DIR) $(1)/etc/hotplug.d/tty $(INSTALL_CONF) ./files/3g.usb $(1)/etc/hotplug.d/tty/30-3g $(INSTALL_DIR) $(1)/lib/netifd/proto @@ -96,7 +97,6 @@ endef define Package/comgt-ncm/install $(INSTALL_DIR) $(1)/etc/gcom $(INSTALL_DATA) ./files/ncm.json $(1)/etc/gcom/ncm.json - $(INSTALL_DATA) ./files/runcommand.gcom $(1)/etc/gcom/runcommand.gcom $(INSTALL_DIR) $(1)/lib/netifd/proto $(INSTALL_BIN) ./files/ncm.sh $(1)/lib/netifd/proto/ncm.sh endef diff --git a/package/network/utils/comgt/files/3g.sh b/package/network/utils/comgt/files/3g.sh index 9220cbf5a0..42ba894e59 100644 --- a/package/network/utils/comgt/files/3g.sh +++ b/package/network/utils/comgt/files/3g.sh @@ -72,6 +72,8 @@ proto_3g_setup() { *) CODE="2,2";; esac export MODE="AT^SYSCFG=${CODE},3FFFFFFF,2,4" + elif echo "$cardinfo" | grep -q "MikroTik"; then + COMMAND="AT+CFUN=1" gcom -d "$device" -s /etc/gcom/runcommand.gcom || return 1 fi if [ -n "$pincode" ]; then diff --git a/package/network/utils/comgt/files/ncm.json b/package/network/utils/comgt/files/ncm.json index 7d9a38fe36..5f68b13496 100644 --- a/package/network/utils/comgt/files/ncm.json +++ b/package/network/utils/comgt/files/ncm.json @@ -112,5 +112,29 @@ ], "connect": "AT+ZGACT=1,${profile}", "disconnect": "AT+ZGACT=0,${profile}" + }, + "\"mikrotik\"": { + "configure": [ + "AT+CFUN=4", + "AT+ZGDCONT=${profile},\\\"${pdptype}\\\",\\\"${apn}\\\",0", + "AT+ZDHCPLEASE=10", + "AT+CFUN=1" + ], + "waitforconnect": "\\\"+ZCONSTAT: 1,${context_type}\\\",\\\"+ZGIPDNS: ${context_type}\\\"", + "connect": "AT+ZGACT=1,${context_type}", + "finalize": "AT+ZDHCPLEASE=0", + "disconnect": "AT+ZGACT=0,1" + }, + "spreadtrum": { + "initialize": [ + "AT+CFUN=1", + "AT+CCED=2,8", + "AT+SPTTYROUTER=1" + ], + "configure": [ + "AT+CGDCONT=${profile},\\\"${pdptype}\\\"${apn:+,\\\"$apn\\\"}" + ], + "connect": "AT+SPTZCMD=\\\"Y29ubm1hbmN0bCBuZGlzZGlhbCBBVF5ORElTRFVOPSJ1c2IwIiwxLDE=\\\"", + "disconnect": "AT+SPTZCMD=\\\"Y29ubm1hbmN0bCBuZGlzZGlhbCBBVF5ORElTRFVOPSJ1c2IwIiwwLDE=\\\"" } } diff --git a/package/network/utils/comgt/files/ncm.sh b/package/network/utils/comgt/files/ncm.sh index 2f36697487..dec058712d 100644 --- a/package/network/utils/comgt/files/ncm.sh +++ b/package/network/utils/comgt/files/ncm.sh @@ -86,10 +86,25 @@ proto_ncm_setup() { return 1 } - [ -n "$delay" ] && sleep "$delay" - - manufacturer=$(gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk 'NF && $0 !~ /AT\+CGMI/ { sub(/\+CGMI: /,""); print tolower($1); exit; }') - [ $? -ne 0 -o -z "$manufacturer" ] && { + start=$(date +%s) + while true; do + manufacturer=$(gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk 'NF && $0 !~ /AT\+CGMI/ { sub(/\+CGMI: /,""); print tolower($1); exit; }') + [ "$manufacturer" = "error" ] && { + manufacturer="" + } + [ -n "$manufacturer" ] && { + break + } + [ -z "$delay" ] && { + break + } + sleep 1 + elapsed=$(($(date +%s) - start)) + [ "$elapsed" -gt "$delay" ] && { + break + } + done + [ -z "$manufacturer" ] && { echo "Failed to get modem information" proto_notify_error "$interface" GETINFO_FAILED return 1 diff --git a/package/network/utils/curl/Config.in b/package/network/utils/curl/Config.in new file mode 100644 index 0000000000..29865a87a7 --- /dev/null +++ b/package/network/utils/curl/Config.in @@ -0,0 +1,174 @@ +if PACKAGE_libcurl + +comment "SSL support" + +choice + prompt "Selected SSL library" + default LIBCURL_MBEDTLS + + config LIBCURL_MBEDTLS + bool "mbed TLS" + + config LIBCURL_WOLFSSL + bool "wolfSSL" + + config LIBCURL_OPENSSL + bool "OpenSSL" + + config LIBCURL_GNUTLS + bool "GNUTLS" + + config LIBCURL_NOSSL + bool "No SSL support" + +endchoice + +comment "Supported protocols" + +config LIBCURL_DICT + bool "DICT protocol" + default n + +config LIBCURL_FILE + bool "FILE protocol" + default y + +config LIBCURL_FTP + bool "FTP / FTPS protocol" + default y + +config LIBCURL_GOPHER + bool "Gopher protocol" + default n + +config LIBCURL_HTTP + bool "HTTP / HTTPS protocol" + default y + +config LIBCURL_COOKIES + bool "Enable Cookies support" + depends on LIBCURL_HTTP + default y + +config LIBCURL_IMAP + bool "IMAP / IMAPS protocol" + default n + +config LIBCURL_LDAP + bool "LDAP protocol" + default n + +config LIBCURL_LDAPS + bool "Enable LDAPS support" + depends on LIBCURL_LDAP && !LIBCURL_NOSSL + default y + +config LIBCURL_POP3 + bool "POP3 / POP3S protocol" + default n + +config LIBCURL_RTSP + bool "RTSP protocol" + depends on LIBCURL_HTTP + default n +config LIBCURL_NO_RTSP + string "RTSP require HTTP protocol" + depends on !LIBCURL_HTTP + default "!" + +config LIBCURL_SSH2 + bool "SCP / SFTP protocol" + default n + +config LIBCURL_SMB + bool "SMB protocol (CIFS)" + depends on LIBCURL_CRYPTO_AUTH && (LIBCURL_GNUTLS || LIBCURL_OPENSSL) + default n +config LIBCURL_NO_SMB + string "SMB require 'cryptographic authentication' and either 'GnuTLS' or 'OpenSSL'" + depends on !LIBCURL_CRYPTO_AUTH || (!LIBCURL_GNUTLS && !LIBCURL_OPENSSL) + default "!" + +config LIBCURL_SMTP + bool "SMTP / SMTPS protocol" + default n + +config LIBCURL_TELNET + bool "TELNET protocol" + default n + +config LIBCURL_TFTP + bool "TFTP protocol" + default n + +config LIBCURL_NGHTTP2 + bool "HTTP2 protocol" + default y + +config LIBCURL_NGHTTP3 + bool "HTTP/3 protocol" + depends on LIBCURL_OPENSSL + default n + +config LIBCURL_NGTCP2 + bool "QUIC protocol" + depends on LIBCURL_OPENSSL + default n + +comment "Miscellaneous" + +config LIBCURL_PROXY + bool "Enable proxy support" + default y + +config LIBCURL_CRYPTO_AUTH + bool "Enable cryptographic authentication" + default n + +config LIBCURL_TLS_SRP + bool "Enable TLS-SRP authentication" + default n + +config LIBCURL_LIBIDN2 + bool "Enable IDN2 support" + default n + +config LIBCURL_THREADED_RESOLVER + bool "Enable threaded DNS resolver" + default n + help + Enable POSIX threaded asynchronous DNS resolution + +config LIBCURL_ZLIB + bool "Enable zlib support" + default n + +config LIBCURL_ZSTD + bool "Enable zstd support" + default n + +config LIBCURL_UNIX_SOCKETS + bool "Enable unix domain socket support" + default y + help + Enable HTTP over unix domain sockets. + To use this with the curl command line, you specify the socket path to the new --unix-domain option. + This feature is actually not limited to HTTP, you can do all the TCP-based protocols + except FTP over the unix domain socket, but it is only HTTP that is regularly used this way. + The reason FTP isn't supported is of course its use of two connections + which would be even weirder to do like this. + +config LIBCURL_LIBCURL_OPTION + bool "Enable generation of C code" + default n + +config LIBCURL_VERBOSE + bool "Enable verbose error strings" + default n + +config LIBCURL_NTLM + bool "Enable NTLM support" + depends on LIBCURL_CRYPTO_AUTH && !LIBCURL_NOSSL + default n + +endif diff --git a/package/network/utils/curl/Makefile b/package/network/utils/curl/Makefile new file mode 100644 index 0000000000..2b4d11d31c --- /dev/null +++ b/package/network/utils/curl/Makefile @@ -0,0 +1,186 @@ +# +# Copyright (C) 2007-2020 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/nls.mk + +PKG_NAME:=curl +PKG_VERSION:=8.5.0 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL:=https://github.com/curl/curl/releases/download/curl-$(subst .,_,$(PKG_VERSION))/ \ + https://dl.uxnr.de/mirror/curl/ \ + https://curl.askapache.com/download/ \ + https://curl.se/download/ +PKG_HASH:=ce4b6a6655431147624aaf582632a36fe1ade262d5fab385c60f78942dd8d87b + +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:haxx:libcurl + +PKG_FIXUP:=autoreconf +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 + +PKG_CONFIG_DEPENDS:= \ + CONFIG_IPV6 \ + \ + CONFIG_LIBCURL_WOLFSSL \ + CONFIG_LIBCURL_OPENSSL \ + CONFIG_LIBCURL_MBEDTLS \ + CONFIG_LIBCURL_NOSSL \ + \ + CONFIG_LIBCURL_LIBIDN2 \ + CONFIG_LIBCURL_SSH2 \ + CONFIG_LIBCURL_ZLIB \ + CONFIG_LIBCURL_ZSTD \ + \ + CONFIG_LIBCURL_DICT \ + CONFIG_LIBCURL_FILE \ + CONFIG_LIBCURL_FTP \ + CONFIG_LIBCURL_GOPHER \ + CONFIG_LIBCURL_HTTP \ + CONFIG_LIBCURL_IMAP \ + CONFIG_LIBCURL_LDAPS \ + CONFIG_LIBCURL_POP3 \ + CONFIG_LIBCURL_RTSP \ + CONFIG_LIBCURL_NO_RTSP \ + CONFIG_LIBCURL_SMB \ + CONFIG_LIBCURL_NO_SMB \ + CONFIG_LIBCURL_SMTP \ + CONFIG_LIBCURL_TELNET \ + CONFIG_LIBCURL_TFTP \ + CONFIG_LIBCURL_NGHTTP2 \ + CONFIG_LIBCURL_NGHTTP3 \ + CONFIG_LIBCURL_NGTCP2 \ + \ + CONFIG_LIBCURL_COOKIES \ + CONFIG_LIBCURL_CRYPTO_AUTH \ + CONFIG_LIBCURL_LIBCURL_OPTION \ + CONFIG_LIBCURL_PROXY \ + CONFIG_LIBCURL_THREADED_RESOLVER \ + CONFIG_LIBCURL_TLS_SRP \ + CONFIG_LIBCURL_UNIX_SOCKETS \ + CONFIG_LIBCURL_VERBOSE \ + CONFIG_LIBCURL_NTLM \ + $(if $(CONFIG_LIBCURL_OPENSSL), \ + CONFIG_OPENSSL_ENGINE \ + CONFIG_OPENSSL_WITH_COMPRESSION \ + CONFIG_OPENSSL_WITH_NPN) + +include $(INCLUDE_DIR)/package.mk + +define Package/curl/Default + SECTION:=net + CATEGORY:=Network + URL:=http://curl.se/ + MAINTAINER:=Stan Grishin +endef + +define Package/curl + $(call Package/curl/Default) + SUBMENU:=File Transfer + DEPENDS:=+libcurl + TITLE:=A client-side URL transfer utility +endef + +define Package/libcurl + $(call Package/curl/Default) + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:= +LIBCURL_WOLFSSL:libwolfssl +LIBCURL_OPENSSL:libopenssl +LIBCURL_MBEDTLS:libmbedtls + DEPENDS += +LIBCURL_ZLIB:zlib +LIBCURL_ZSTD:libzstd +LIBCURL_THREADED_RESOLVER:libpthread + DEPENDS += +LIBCURL_LIBIDN2:libidn2 +LIBCURL_SSH2:libssh2 +LIBCURL_NGHTTP2:libnghttp2 +LIBCURL_NGHTTP3:libnghttp3 +LIBCURL_NGTCP2:libngtcp2 +ca-bundle + TITLE:=A client-side URL transfer library + MENU:=1 + ABI_VERSION:=4 +endef + +define Package/libcurl/config + source "$(SOURCE)/Config.in" +endef + +TARGET_CFLAGS += $(FPIC) +TARGET_CPPFLAGS += $(if $(CONFIG_LIBCURL_NTLM),,-DCURL_DISABLE_NTLM) +TARGET_LDFLAGS += -Wl,--gc-sections + +CONFIGURE_ARGS += \ + --disable-debug \ + --disable-ares \ + --enable-shared \ + --enable-static \ + --disable-manual \ + --without-gnutls \ + --without-nss \ + --without-librtmp \ + --without-ca-path \ + --without-libpsl \ + --without-zstd \ + --with-ca-bundle=/etc/ssl/certs/ca-certificates.crt \ + \ + $(call autoconf_bool,CONFIG_IPV6,ipv6) \ + \ + $(if $(CONFIG_LIBCURL_WOLFSSL)$(CONFIG_LIBCURL_OPENSSL)$(CONFIG_LIBCURL_MBEDTLS),,--without-ssl) \ + $(if $(CONFIG_LIBCURL_WOLFSSL),--with-wolfssl="$(STAGING_DIR)/usr",--without-wolfssl) \ + $(if $(CONFIG_LIBCURL_OPENSSL),--with-openssl="$(STAGING_DIR)/usr",--without-openssl) \ + $(if $(CONFIG_LIBCURL_MBEDTLS),--with-mbedtls="$(STAGING_DIR)/usr",--without-mbedtls) \ + \ + $(if $(CONFIG_LIBCURL_LIBIDN2),--with-libidn2="$(STAGING_DIR)/usr",--without-libidn2) \ + $(if $(CONFIG_LIBCURL_SSH2),--with-libssh2="$(STAGING_DIR)/usr",--without-libssh2) \ + $(if $(CONFIG_LIBCURL_ZLIB),--with-zlib="$(STAGING_DIR)/usr",--without-zlib) \ + $(if $(CONFIG_LIBCURL_ZSTD),--with-zstd="$(STAGING_DIR)/usr",--without-zstd) \ + $(if $(CONFIG_LIBCURL_NGHTTP2),--with-nghttp2="$(STAGING_DIR)/usr",--without-nghttp2) \ + $(if $(CONFIG_LIBCURL_NGHTTP3),--with-nghttp3="$(STAGING_DIR)/usr",--without-nghttp3) \ + $(if $(CONFIG_LIBCURL_NGTCP2),--with-ngtcp2="$(STAGING_DIR)/usr",--without-ngtcp2) \ + \ + $(call autoconf_bool,CONFIG_LIBCURL_DICT,dict) \ + $(call autoconf_bool,CONFIG_LIBCURL_FILE,file) \ + $(call autoconf_bool,CONFIG_LIBCURL_FTP,ftp) \ + $(call autoconf_bool,CONFIG_LIBCURL_GOPHER,gopher) \ + $(call autoconf_bool,CONFIG_LIBCURL_HTTP,http) \ + $(call autoconf_bool,CONFIG_LIBCURL_IMAP,imap) \ + $(call autoconf_bool,CONFIG_LIBCURL_LDAPS,ldaps) \ + $(call autoconf_bool,CONFIG_LIBCURL_POP3,pop3) \ + $(call autoconf_bool,CONFIG_LIBCURL_RTSP,rtsp) \ + $(call autoconf_bool,CONFIG_LIBCURL_SMB,smb) \ + $(call autoconf_bool,CONFIG_LIBCURL_SMTP,smtp) \ + $(call autoconf_bool,CONFIG_LIBCURL_TELNET,telnet) \ + $(call autoconf_bool,CONFIG_LIBCURL_TFTP,tftp) \ + \ + $(call autoconf_bool,CONFIG_LIBCURL_COOKIES,cookies) \ + $(call autoconf_bool,CONFIG_LIBCURL_CRYPTO_AUTH,crypto-auth) \ + $(call autoconf_bool,CONFIG_LIBCURL_LIBCURL_OPTION,libcurl-option) \ + $(call autoconf_bool,CONFIG_LIBCURL_PROXY,proxy) \ + $(call autoconf_bool,CONFIG_LIBCURL_THREADED_RESOLVER,threaded-resolver) \ + $(call autoconf_bool,CONFIG_LIBCURL_TLS_SRP,tls-srp) \ + $(call autoconf_bool,CONFIG_LIBCURL_UNIX_SOCKETS,unix-sockets) \ + $(call autoconf_bool,CONFIG_LIBCURL_VERBOSE,verbose) \ + +define Build/InstallDev + $(INSTALL_DIR) $(2)/bin $(1)/usr/bin $(1)/usr/include $(1)/usr/lib $(1)/usr/lib/pkgconfig + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/curl-config $(1)/usr/bin/ + $(CP) $(PKG_INSTALL_DIR)/usr/include/curl $(1)/usr/include/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcurl.{a,so*} $(1)/usr/lib/ + $(CP) $(PKG_BUILD_DIR)/libcurl.pc $(1)/usr/lib/pkgconfig/ + $(SED) 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' $(1)/usr/bin/curl-config + [ -n "$(TARGET_LDFLAGS)" ] && $(SED) 's#$(TARGET_LDFLAGS)##g' $(1)/usr/lib/pkgconfig/libcurl.pc || true + $(LN) $(STAGING_DIR)/usr/bin/curl-config $(2)/bin/ +endef + +define Package/curl/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/curl $(1)/usr/bin/ +endef + +define Package/libcurl/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcurl.so.* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libcurl)) +$(eval $(call BuildPackage,curl)) diff --git a/package/network/utils/curl/patches/200-no_docs_tests.patch b/package/network/utils/curl/patches/200-no_docs_tests.patch new file mode 100644 index 0000000000..38f323e26b --- /dev/null +++ b/package/network/utils/curl/patches/200-no_docs_tests.patch @@ -0,0 +1,20 @@ +--- a/Makefile.am ++++ b/Makefile.am +@@ -134,7 +134,7 @@ CLEANFILES = $(VC14_LIBVCXPROJ) \ + bin_SCRIPTS = curl-config + + SUBDIRS = lib src +-DIST_SUBDIRS = $(SUBDIRS) tests packages scripts include docs ++DIST_SUBDIRS = $(SUBDIRS) packages include + + pkgconfigdir = $(libdir)/pkgconfig + pkgconfig_DATA = libcurl.pc +@@ -248,8 +248,6 @@ cygwinbin: + # We extend the standard install with a custom hook: + install-data-hook: + (cd include && $(MAKE) install) +- (cd docs && $(MAKE) install) +- (cd docs/libcurl && $(MAKE) install) + + # We extend the standard uninstall with a custom hook: + uninstall-hook: diff --git a/package/network/utils/ebtables/Makefile b/package/network/utils/ebtables/Makefile index 67cc14a760..f35b768b43 100644 --- a/package/network/utils/ebtables/Makefile +++ b/package/network/utils/ebtables/Makefile @@ -17,6 +17,7 @@ PKG_SOURCE_VERSION:=48cff25dfea5b37e16ba5dc6601e98ab140f5f99 PKG_MIRROR_HASH:=1327cdc3402e5e3056819e4e9b6f9d4a5bfd401f2c4f58447afb2c3c73fc8aac PKG_LICENSE:=GPL-2.0 +PKG_CPE_ID:=cpe:/a:netfilter:ebtables include $(INCLUDE_DIR)/package.mk diff --git a/package/network/utils/ethtool/Makefile b/package/network/utils/ethtool/Makefile index 5182c55331..10fecd4a9c 100644 --- a/package/network/utils/ethtool/Makefile +++ b/package/network/utils/ethtool/Makefile @@ -8,16 +8,17 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ethtool -PKG_VERSION:=5.16 +PKG_VERSION:=6.3 PKG_RELEASE:=1 PKG_MAINTAINER:=Felix Fietkau PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/software/network/ethtool -PKG_HASH:=aa2fef1936dd4a11755dfa0bdb93f0ec5bea45208d27c9754bc3abe1aa42c1cb +PKG_HASH:=d9425f0a3df138734001fccc4175fe178c025f938460ac25c4ebc39960168822 PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:kernel:ethtool PKG_FIXUP:=autoreconf PKG_INSTALL:=1 diff --git a/package/network/utils/iproute2/Makefile b/package/network/utils/iproute2/Makefile index 88ba57b122..c43d6eeaa9 100644 --- a/package/network/utils/iproute2/Makefile +++ b/package/network/utils/iproute2/Makefile @@ -8,17 +8,19 @@ include $(TOPDIR)/rules.mk PKG_NAME:=iproute2 -PKG_VERSION:=5.15.0 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=6.3.0 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2 -PKG_HASH:=38e3e4a5f9a7f5575c015027a10df097c149111eeb739993128e5b2b35b291ff +PKG_HASH:=dfb2a98db96e7a653cffc6693335a1a466e29a34b6ac528be48f35e1d2766732 PKG_BUILD_PARALLEL:=1 PKG_BUILD_DEPENDS:=iptables PKG_LICENSE:=GPL-2.0 PKG_CPE_ID:=cpe:/a:iproute2_project:iproute2 +PKG_BUILD_FLAGS:=gc-sections lto + include $(INCLUDE_DIR)/kernel.mk include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/nls.mk @@ -171,8 +173,7 @@ define Build/Configure > $(PKG_BUILD_DIR)/include/SNAPSHOT.h endef -TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto -TARGET_LDFLAGS += -Wl,--gc-sections -Wl,--as-needed +TARGET_LDFLAGS += -Wl,--as-needed TARGET_CPPFLAGS += -I$(STAGING_DIR)/usr/include/libnl-tiny MAKE_FLAGS += \ @@ -184,6 +185,7 @@ MAKE_FLAGS += \ HAVE_ELF=$(HAVE_ELF) \ HAVE_MNL=$(HAVE_MNL) \ HAVE_CAP=$(HAVE_CAP) \ + HAVE_TIRPC=n \ IPT_LIB_DIR=/usr/lib/iptables \ XT_LIB_DIR=/usr/lib/iptables \ TC_CONFIG_XT=$(TC_CONFIG_XT) \ diff --git a/package/network/utils/iproute2/patches/100-configure.patch b/package/network/utils/iproute2/patches/100-configure.patch index f3680e2b20..564c7eb3c8 100644 --- a/package/network/utils/iproute2/patches/100-configure.patch +++ b/package/network/utils/iproute2/patches/100-configure.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -34,7 +34,8 @@ int main(int argc, char **argv) { +@@ -36,7 +36,8 @@ int main(int argc, char **argv) { } EOF diff --git a/package/network/utils/iproute2/patches/110-darwin_fixes.patch b/package/network/utils/iproute2/patches/110-darwin_fixes.patch index 1f3eb101ea..06ae59f8b4 100644 --- a/package/network/utils/iproute2/patches/110-darwin_fixes.patch +++ b/package/network/utils/iproute2/patches/110-darwin_fixes.patch @@ -1,6 +1,6 @@ --- a/netem/maketable.c +++ b/netem/maketable.c -@@ -10,7 +10,9 @@ +@@ -11,7 +11,9 @@ #include #include #include @@ -12,7 +12,7 @@ #include --- a/netem/normal.c +++ b/netem/normal.c -@@ -8,8 +8,12 @@ +@@ -9,8 +9,12 @@ #include #include @@ -27,7 +27,7 @@ #define TABLEFACTOR NETEM_DIST_SCALE --- a/netem/pareto.c +++ b/netem/pareto.c -@@ -7,8 +7,12 @@ +@@ -8,8 +8,12 @@ #include #include @@ -42,7 +42,7 @@ #define TABLESIZE 16384 --- a/netem/paretonormal.c +++ b/netem/paretonormal.c -@@ -14,10 +14,13 @@ +@@ -15,10 +15,13 @@ #include #include #include diff --git a/package/network/utils/iproute2/patches/115-add-config-xtlibdir.patch b/package/network/utils/iproute2/patches/115-add-config-xtlibdir.patch index 8702d5fd2d..03df7809f7 100644 --- a/package/network/utils/iproute2/patches/115-add-config-xtlibdir.patch +++ b/package/network/utils/iproute2/patches/115-add-config-xtlibdir.patch @@ -1,6 +1,6 @@ --- a/tc/Makefile +++ b/tc/Makefile -@@ -128,6 +128,9 @@ CFLAGS += -DCONFIG_GACT -DCONFIG_GACT_PR +@@ -127,6 +127,9 @@ CFLAGS += -DCONFIG_GACT -DCONFIG_GACT_PR ifneq ($(IPT_LIB_DIR),) CFLAGS += -DIPT_LIB_DIR=\"$(IPT_LIB_DIR)\" endif diff --git a/package/network/utils/iproute2/patches/130-no_netem_tipc_dcb_man_vdpa.patch b/package/network/utils/iproute2/patches/130-no_netem_tipc_dcb_man_vdpa.patch index 8ddb316744..2a3f9eb90f 100644 --- a/package/network/utils/iproute2/patches/130-no_netem_tipc_dcb_man_vdpa.patch +++ b/package/network/utils/iproute2/patches/130-no_netem_tipc_dcb_man_vdpa.patch @@ -1,11 +1,14 @@ --- a/Makefile +++ b/Makefile -@@ -55,7 +55,7 @@ WFLAGS += -Wmissing-declarations -Wold-s +@@ -65,9 +65,9 @@ WFLAGS += -Wmissing-declarations -Wold-s CFLAGS := $(WFLAGS) $(CCOPTS) -I../include -I../include/uapi $(DEFINES) $(CFLAGS) YACCFLAGS = -d -t -v --SUBDIRS=lib ip tc bridge misc netem genl tipc devlink rdma dcb man vdpa -+SUBDIRS=lib ip tc bridge misc genl devlink rdma +-SUBDIRS=lib ip tc bridge misc netem genl man ++SUBDIRS=lib ip tc bridge misc genl + ifeq ($(HAVE_MNL),y) +-SUBDIRS += tipc devlink rdma dcb vdpa ++SUBDIRS += devlink rdma + endif LIBNETLINK=../lib/libutil.a ../lib/libnetlink.a - LDLIBS += $(LIBNETLINK) diff --git a/package/network/utils/iproute2/patches/140-allow_pfifo_fast.patch b/package/network/utils/iproute2/patches/140-allow_pfifo_fast.patch index 13de48f412..8f5a7d352e 100644 --- a/package/network/utils/iproute2/patches/140-allow_pfifo_fast.patch +++ b/package/network/utils/iproute2/patches/140-allow_pfifo_fast.patch @@ -1,6 +1,6 @@ --- a/tc/q_fifo.c +++ b/tc/q_fifo.c -@@ -95,5 +95,6 @@ struct qdisc_util pfifo_head_drop_qdisc_ +@@ -90,5 +90,6 @@ struct qdisc_util pfifo_head_drop_qdisc_ struct qdisc_util pfifo_fast_qdisc_util = { .id = "pfifo_fast", diff --git a/package/network/utils/iproute2/patches/140-keep_libmnl_optional.patch b/package/network/utils/iproute2/patches/140-keep_libmnl_optional.patch index ff7e9ca4e5..a8cdd103ba 100644 --- a/package/network/utils/iproute2/patches/140-keep_libmnl_optional.patch +++ b/package/network/utils/iproute2/patches/140-keep_libmnl_optional.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -387,7 +387,7 @@ check_selinux() +@@ -411,7 +411,7 @@ check_tirpc() check_mnl() { diff --git a/package/network/utils/iproute2/patches/145-keep_libelf_optional.patch b/package/network/utils/iproute2/patches/145-keep_libelf_optional.patch index 079ca0512e..0c5c3f59ed 100644 --- a/package/network/utils/iproute2/patches/145-keep_libelf_optional.patch +++ b/package/network/utils/iproute2/patches/145-keep_libelf_optional.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -255,7 +255,7 @@ EOF +@@ -266,7 +266,7 @@ EOF check_elf() { diff --git a/package/network/utils/iproute2/patches/150-keep_libcap_optional.patch b/package/network/utils/iproute2/patches/150-keep_libcap_optional.patch index 68e1624166..4cce2c3ca6 100644 --- a/package/network/utils/iproute2/patches/150-keep_libcap_optional.patch +++ b/package/network/utils/iproute2/patches/150-keep_libcap_optional.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -445,7 +445,7 @@ EOF +@@ -469,7 +469,7 @@ EOF check_cap() { diff --git a/package/network/utils/iproute2/patches/155-keep_tirpc_optional.patch b/package/network/utils/iproute2/patches/155-keep_tirpc_optional.patch new file mode 100644 index 0000000000..28ba7e5217 --- /dev/null +++ b/package/network/utils/iproute2/patches/155-keep_tirpc_optional.patch @@ -0,0 +1,11 @@ +--- a/configure ++++ b/configure +@@ -398,7 +398,7 @@ check_selinux() + + check_tirpc() + { +- if ${PKG_CONFIG} libtirpc --exists; then ++ if [ "${HAVE_TIRPC}" = "y" ] && ${PKG_CONFIG} libtirpc --exists; then + echo "HAVE_RPC:=y" >>$CONFIG + echo "yes" + diff --git a/package/network/utils/iproute2/patches/170-ip_tiny.patch b/package/network/utils/iproute2/patches/170-ip_tiny.patch index cd687e7601..71081c36bc 100644 --- a/package/network/utils/iproute2/patches/170-ip_tiny.patch +++ b/package/network/utils/iproute2/patches/170-ip_tiny.patch @@ -1,6 +1,6 @@ --- a/ip/Makefile +++ b/ip/Makefile -@@ -17,6 +17,13 @@ RTMONOBJ=rtmon.o +@@ -19,6 +19,13 @@ RTMONOBJ=rtmon.o include ../config.mk @@ -12,9 +12,9 @@ +STATIC_SYM_SOURCES:=$(filter-out $(STATIC_SYM_FILTER),$(wildcard *.c)) + ALLOBJ=$(IPOBJ) $(RTMONOBJ) - SCRIPTS=ifcfg rtpr routel routef + SCRIPTS=routel TARGETS=ip rtmon -@@ -46,7 +53,7 @@ else +@@ -48,7 +55,7 @@ else ip: static-syms.o static-syms.o: static-syms.h @@ -25,25 +25,25 @@ sed -n '/'$$s'[^ ]* =/{s:.* \([^ ]*'$$s'[^ ]*\) .*:extern char \1[] __attribute__((weak)); if (!strcmp(sym, "\1")) return \1;:;p}' $$files ; \ --- a/ip/ip.c +++ b/ip/ip.c -@@ -64,11 +64,17 @@ static void usage(void) +@@ -61,11 +61,17 @@ static void usage(void) fprintf(stderr, "Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }\n" " ip [ -force ] -batch filename\n" +#ifndef IPROUTE2_TINY - "where OBJECT := { address | addrlabel | fou | help | ila | ioam | l2tp | link |\n" - " macsec | maddress | monitor | mptcp | mroute | mrule |\n" + "where OBJECT := { address | addrlabel | amt | fou | help | ila | ioam | l2tp |\n" + " link | macsec | maddress | monitor | mptcp | mroute | mrule |\n" " neighbor | neighbour | netconf | netns | nexthop | ntable |\n" " ntbl | route | rule | sr | tap | tcpmetrics |\n" " token | tunnel | tuntap | vrf | xfrm }\n" +#else -+ "where OBJECT := { address | ila | link | macsec | maddress | monitor |\n" -+ " mroute | mrule | neighbor | neighbour | netns | route |\n" -+ " rule | sr | token | tunnel | vrf }\n" ++ "where OBJECT := { address | link | maddress | monitor |\n" ++ " neighbor | neighbour | netns | route |\n" ++ " rule | token | tunnel }\n" +#endif " OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n" " -h[uman-readable] | -iec | -j[son] | -p[retty] |\n" " -f[amily] { inet | inet6 | mpls | bridge | link } |\n" -@@ -91,37 +97,51 @@ static const struct cmd { +@@ -88,37 +94,49 @@ static const struct cmd { int (*func)(int argc, char **argv); } cmds[] = { { "address", do_ipaddr }, @@ -63,9 +63,9 @@ +#ifndef IPROUTE2_TINY { "l2tp", do_ipl2tp }, { "fou", do_ipfou }, -+#endif { "ila", do_ipila }, { "macsec", do_ipmacsec }, ++#endif { "tunnel", do_iptunnel }, { "tunl", do_iptunnel }, +#ifndef IPROUTE2_TINY @@ -78,23 +78,21 @@ { "monitor", do_ipmonitor }, +#ifndef IPROUTE2_TINY { "xfrm", do_xfrm }, -+#endif { "mroute", do_multiroute }, { "mrule", do_multirule }, ++#endif { "netns", do_netns }, +#ifndef IPROUTE2_TINY { "netconf", do_ipnetconf }, -+#endif { "vrf", do_ipvrf}, { "sr", do_seg6 }, -+#ifndef IPROUTE2_TINY { "nexthop", do_ipnh }, { "mptcp", do_mptcp }, { "ioam", do_ioam6 }, +#endif { "help", do_help }, + { "stats", do_ipstats }, { 0 } - }; --- a/lib/Makefile +++ b/lib/Makefile @@ -3,6 +3,10 @@ include ../config.mk @@ -107,4 +105,4 @@ + UTILOBJ = utils.o utils_math.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \ inet_proto.o namespace.o json_writer.o json_print.o json_print_math.o \ - names.o color.o bpf_legacy.o bpf_glue.o exec.o fs.o cg_map.o + names.o color.o bpf_legacy.o bpf_glue.o exec.o fs.o cg_map.o ppp_proto.o diff --git a/package/network/utils/iproute2/patches/175-reduce-dynamic-syms.patch b/package/network/utils/iproute2/patches/175-reduce-dynamic-syms.patch index c3892e5a0e..d0914848d5 100644 --- a/package/network/utils/iproute2/patches/175-reduce-dynamic-syms.patch +++ b/package/network/utils/iproute2/patches/175-reduce-dynamic-syms.patch @@ -1,6 +1,6 @@ --- a/tc/Makefile +++ b/tc/Makefile -@@ -114,7 +114,7 @@ LDLIBS += -L. -lm +@@ -113,7 +113,7 @@ LDLIBS += -L. -lm ifeq ($(SHARED_LIBS),y) LDLIBS += -ldl @@ -9,7 +9,7 @@ endif TCLIB := tc_core.o -@@ -144,7 +144,7 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc +@@ -143,7 +143,7 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc all: tc $(TCSO) tc: $(TCOBJ) $(LIBNETLINK) libtc.a @@ -18,7 +18,7 @@ libtc.a: $(TCLIB) $(QUIET_AR)$(AR) rcs $@ $^ -@@ -166,6 +166,7 @@ install: all +@@ -165,6 +165,7 @@ install: all clean: rm -f $(TCOBJ) $(TCLIB) libtc.a tc *.so emp_ematch.tab.h; \ rm -f emp_ematch.tab.* @@ -26,7 +26,7 @@ q_atm.so: q_atm.c $(QUIET_CC)$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -fpic -o q_atm.so q_atm.c -latm -@@ -205,4 +206,16 @@ static-syms.h: $(wildcard *.c) +@@ -204,4 +205,16 @@ static-syms.h: $(wildcard *.c) sed -n '/'$$s'[^ ]* =/{s:.* \([^ ]*'$$s'[^ ]*\) .*:extern char \1[] __attribute__((weak)); if (!strcmp(sym, "\1")) return \1;:;p}' $$files ; \ done > $@ diff --git a/package/network/utils/iproute2/patches/180-drop_FAILED_POLICY.patch b/package/network/utils/iproute2/patches/180-drop_FAILED_POLICY.patch index 07d5230a6e..9ce7dd9a13 100644 --- a/package/network/utils/iproute2/patches/180-drop_FAILED_POLICY.patch +++ b/package/network/utils/iproute2/patches/180-drop_FAILED_POLICY.patch @@ -11,7 +11,7 @@ Subject: [PATCH] add support for dropping with FAILED_POLICY --- a/ip/rtm_map.c +++ b/ip/rtm_map.c -@@ -54,6 +54,8 @@ char *rtnl_rtntype_n2a(int id, char *buf +@@ -49,6 +49,8 @@ char *rtnl_rtntype_n2a(int id, char *buf return "nat"; case RTN_XRESOLVE: return "xresolve"; @@ -20,7 +20,7 @@ Subject: [PATCH] add support for dropping with FAILED_POLICY default: snprintf(buf, len, "%d", id); return buf; -@@ -89,6 +91,8 @@ int rtnl_rtntype_a2n(int *id, char *arg) +@@ -84,6 +86,8 @@ int rtnl_rtntype_a2n(int *id, char *arg) res = RTN_UNICAST; else if (strcmp(arg, "throw") == 0) res = RTN_THROW; @@ -31,7 +31,7 @@ Subject: [PATCH] add support for dropping with FAILED_POLICY if (!end || end == arg || *end || res > 255) --- a/include/uapi/linux/rtnetlink.h +++ b/include/uapi/linux/rtnetlink.h -@@ -256,6 +256,7 @@ enum { +@@ -265,6 +265,7 @@ enum { RTN_THROW, /* Not in this table */ RTN_NAT, /* Translate this address */ RTN_XRESOLVE, /* Use external resolver */ diff --git a/package/network/utils/iproute2/patches/190-fix-nls-rpath-link.patch b/package/network/utils/iproute2/patches/190-fix-nls-rpath-link.patch index 92d02b9a4e..c7fceb2e22 100644 --- a/package/network/utils/iproute2/patches/190-fix-nls-rpath-link.patch +++ b/package/network/utils/iproute2/patches/190-fix-nls-rpath-link.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -279,7 +279,7 @@ int main(int argc, char **argv) { +@@ -290,7 +290,7 @@ int main(int argc, char **argv) { } EOF @@ -9,7 +9,7 @@ local ret=$? rm -f $TMPDIR/libbpf_test.c $TMPDIR/libbpf_test -@@ -297,7 +297,7 @@ int main(int argc, char **argv) { +@@ -308,7 +308,7 @@ int main(int argc, char **argv) { } EOF diff --git a/package/network/utils/iproute2/patches/195-build_variant_ip_tc.patch b/package/network/utils/iproute2/patches/195-build_variant_ip_tc.patch index 13418662ee..141763460d 100644 --- a/package/network/utils/iproute2/patches/195-build_variant_ip_tc.patch +++ b/package/network/utils/iproute2/patches/195-build_variant_ip_tc.patch @@ -1,9 +1,9 @@ --- a/ip/Makefile +++ b/ip/Makefile -@@ -26,7 +26,7 @@ STATIC_SYM_SOURCES:=$(filter-out $(STATI +@@ -28,7 +28,7 @@ STATIC_SYM_SOURCES:=$(filter-out $(STATI ALLOBJ=$(IPOBJ) $(RTMONOBJ) - SCRIPTS=ifcfg rtpr routel routef + SCRIPTS=routel -TARGETS=ip rtmon +TARGETS=$(findstring ip,$(BUILD_VARIANT)) rtmon @@ -11,7 +11,7 @@ --- a/tc/Makefile +++ b/tc/Makefile -@@ -141,7 +141,7 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc +@@ -140,7 +140,7 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc $(QUIET_CC)$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -fpic $< -o $@ diff --git a/package/network/utils/iproute2/patches/200-drop_libbsd_dependency.patch b/package/network/utils/iproute2/patches/200-drop_libbsd_dependency.patch index 12a1ccfa33..d1948860e8 100644 --- a/package/network/utils/iproute2/patches/200-drop_libbsd_dependency.patch +++ b/package/network/utils/iproute2/patches/200-drop_libbsd_dependency.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -431,14 +431,8 @@ EOF +@@ -455,14 +455,8 @@ EOF if $CC -I$INCLUDE -o $TMPDIR/strtest $TMPDIR/strtest.c >/dev/null 2>&1; then echo "no" else diff --git a/package/network/utils/iproute2/patches/300-selinux-configurable.patch b/package/network/utils/iproute2/patches/300-selinux-configurable.patch index b7e61fd3bd..817abf7d17 100644 --- a/package/network/utils/iproute2/patches/300-selinux-configurable.patch +++ b/package/network/utils/iproute2/patches/300-selinux-configurable.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -374,7 +374,7 @@ check_libbpf() +@@ -385,7 +385,7 @@ check_libbpf() check_selinux() # SELinux is a compile time option in the ss utility { diff --git a/package/network/utils/ipset/Makefile b/package/network/utils/ipset/Makefile index 65133d105c..b0aac8fe36 100644 --- a/package/network/utils/ipset/Makefile +++ b/package/network/utils/ipset/Makefile @@ -9,15 +9,16 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=ipset -PKG_VERSION:=7.15 -PKG_RELEASE:=2 +PKG_VERSION:=7.17 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -PKG_SOURCE_URL:=http://ipset.netfilter.org -PKG_HASH:=0a5545aaadb640142c1f888d366a78ddf8724799967fa20686a70053bd621751 +PKG_SOURCE_URL:=https://ipset.netfilter.org +PKG_HASH:=be49c9ff489dd6610cad6541e743c3384eac96e9f24707da7b3929d8f2ac64d8 PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=GPL-2.0 +PKG_CPE_ID:=cpe:/a:netfilter:ipset PKG_FIXUP:=autoreconf PKG_INSTALL:=1 diff --git a/package/network/utils/ipset/patches/0001-lib-ipset-fix-printf-warning.patch b/package/network/utils/ipset/patches/0001-lib-ipset-fix-printf-warning.patch deleted file mode 100644 index 90dfacab8f..0000000000 --- a/package/network/utils/ipset/patches/0001-lib-ipset-fix-printf-warning.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/lib/ipset.c -+++ b/lib/ipset.c -@@ -1847,7 +1847,7 @@ static int ipset_xlate(struct ipset *ips - return -1; - case IPSET_CMD_LIST: - if (!set) { -- printf("list sets %s\n", -+ printf("list sets %s %s\n", - ipset_xlate_family(family), table); - } else { - printf("list set %s %s %s\n", diff --git a/package/network/utils/ipset/patches/0002-Fix-IPv6-sets-nftables-translation.patch b/package/network/utils/ipset/patches/0002-Fix-IPv6-sets-nftables-translation.patch deleted file mode 100644 index 6b29f26d95..0000000000 --- a/package/network/utils/ipset/patches/0002-Fix-IPv6-sets-nftables-translation.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 50ef784944c60cd291970c47e4b831ff7ef9c923 Mon Sep 17 00:00:00 2001 -From: Pablo Neira Ayuso -Date: Mon, 28 Feb 2022 20:02:17 +0100 -Subject: [PATCH] Fix IPv6 sets nftables translation - -The parser assumes the set is an IPv4 ipset because IPSET_OPT_FAMILY is -not set. - - # ipset-translate restore < ./ipset-mwan3_set_connected_ipv6.dump - add table inet global - add set inet global mwan3_connected_v6 { type ipv6_addr; flags interval; } - flush set inet global mwan3_connected_v6 - ipset v7.15: Error in line 4: Syntax error: '64' is out of range 0-32 - -Remove ipset_xlate_type_get(), call ipset_xlate_set_get() instead to -obtain the set type and family. - -Reported-by: Florian Eckert -Fixes: 325af556cd3a ("add ipset to nftables translation infrastructure") -Signed-off-by: Pablo Neira Ayuso ---- - lib/ipset.c | 24 ++++++++++-------------- - tests/xlate/xlate.t | 2 ++ - tests/xlate/xlate.t.nft | 2 ++ - 3 files changed, 14 insertions(+), 14 deletions(-) - ---- a/lib/ipset.c -+++ b/lib/ipset.c -@@ -949,18 +949,6 @@ ipset_xlate_set_get(struct ipset *ipset, - return NULL; - } - --static const struct ipset_type *ipset_xlate_type_get(struct ipset *ipset, -- const char *name) --{ -- const struct ipset_xlate_set *set; -- -- set = ipset_xlate_set_get(ipset, name); -- if (!set) -- return NULL; -- -- return set->type; --} -- - static int - ipset_parser(struct ipset *ipset, int oargc, char *oargv[]) - { -@@ -1282,8 +1270,16 @@ ipset_parser(struct ipset *ipset, int oa - if (!ipset->xlate) { - type = ipset_type_get(session, cmd); - } else { -- type = ipset_xlate_type_get(ipset, arg0); -- ipset_session_data_set(session, IPSET_OPT_TYPE, type); -+ const struct ipset_xlate_set *xlate_set; -+ -+ xlate_set = ipset_xlate_set_get(ipset, arg0); -+ if (xlate_set) { -+ ipset_session_data_set(session, IPSET_OPT_TYPE, -+ xlate_set->type); -+ ipset_session_data_set(session, IPSET_OPT_FAMILY, -+ &xlate_set->family); -+ type = xlate_set->type; -+ } - } - if (type == NULL) - return ipset->standard_error(ipset, p); ---- a/tests/xlate/xlate.t -+++ b/tests/xlate/xlate.t -@@ -53,3 +53,5 @@ create bp1 bitmap:port range 1-1024 - add bp1 22 - create bim1 bitmap:ip,mac range 1.1.1.0/24 - add bim1 1.1.1.1,aa:bb:cc:dd:ee:ff -+create hn6 hash:net family inet6 -+add hn6 fe80::/64 ---- a/tests/xlate/xlate.t.nft -+++ b/tests/xlate/xlate.t.nft -@@ -54,3 +54,5 @@ add set inet global bp1 { type inet_serv - add element inet global bp1 { 22 } - add set inet global bim1 { type ipv4_addr . ether_addr; } - add element inet global bim1 { 1.1.1.1 . aa:bb:cc:dd:ee:ff } -+add set inet global hn6 { type ipv6_addr; flags interval; } -+add element inet global hn6 { fe80::/64 } diff --git a/package/network/utils/iptables/Makefile b/package/network/utils/iptables/Makefile index 5fc2db07fb..45a2b49070 100644 --- a/package/network/utils/iptables/Makefile +++ b/package/network/utils/iptables/Makefile @@ -9,17 +9,18 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=iptables -PKG_VERSION:=1.8.7 -PKG_RELEASE:=7 +PKG_VERSION:=1.8.8 +PKG_RELEASE:=2 PKG_SOURCE_URL:=https://netfilter.org/projects/iptables/files PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -PKG_HASH:=c109c96bb04998cd44156622d36f8e04b140701ec60531a10668cfdff5e8d8f0 +PKG_HASH:=71c75889dc710676631553eb1511da0177bbaaf1b551265b912d236c3f51859f PKG_FIXUP:=autoreconf PKG_FLAGS:=nonshared PKG_INSTALL:=1 +PKG_BUILD_FLAGS:=gc-sections no-lto PKG_BUILD_PARALLEL:=1 PKG_LICENSE:=GPL-2.0 PKG_CPE_ID:=cpe:/a:netfilter_core_team:iptables @@ -150,7 +151,7 @@ Extra iptables nftables nft binaries. endef define Package/iptables-mod-conntrack-extra -$(call Package/iptables/Module, +kmod-ipt-conntrack-extra +kmod-ipt-raw) +$(call Package/iptables/Module, +kmod-ipt-conntrack-extra) TITLE:=Extra connection tracking extensions endef @@ -591,12 +592,8 @@ TARGET_CPPFLAGS := \ TARGET_CFLAGS += \ -I$(PKG_BUILD_DIR)/include \ -I$(LINUX_DIR)/user_headers/include \ - -ffunction-sections -fdata-sections \ -DNO_LEGACY -TARGET_LDFLAGS += \ - -Wl,--gc-sections - CONFIGURE_ARGS += \ --enable-shared \ --enable-static \ @@ -637,7 +634,6 @@ define Build/InstallDev $(CP) $(PKG_BUILD_DIR)/include/iptables/*.h $(1)/usr/include/iptables/ $(CP) $(PKG_BUILD_DIR)/include/iptables.h $(1)/usr/include/ $(CP) $(PKG_BUILD_DIR)/include/ip6tables.h $(1)/usr/include/ - $(CP) $(PKG_BUILD_DIR)/include/libipulog $(1)/usr/include/ $(CP) $(PKG_BUILD_DIR)/include/libiptc $(1)/usr/include/ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/ diff --git a/package/network/utils/iptables/patches/001-xtables-Call-init_extensions6-for-static-builds.patch b/package/network/utils/iptables/patches/001-xtables-Call-init_extensions6-for-static-builds.patch deleted file mode 100644 index 22ccfa533a..0000000000 --- a/package/network/utils/iptables/patches/001-xtables-Call-init_extensions6-for-static-builds.patch +++ /dev/null @@ -1,68 +0,0 @@ -From e727ccad036e2cdba3339536c65c7ceef43c0740 Mon Sep 17 00:00:00 2001 -From: Erik Wilson -Date: Tue, 13 Jul 2021 16:48:23 -0700 -Subject: [PATCH] xtables: Call init_extensions6() for static builds - -Initialize extensions from libext6 for cases where xtables is built statically. - -Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1550 -Signed-off-by: Erik Wilson -Signed-off-by: Florian Westphal ---- - iptables/xtables-monitor.c | 1 + - iptables/xtables-restore.c | 1 + - iptables/xtables-save.c | 1 + - iptables/xtables-standalone.c | 1 + - iptables/xtables-translate.c | 1 + - 5 files changed, 5 insertions(+) - ---- a/iptables/xtables-monitor.c -+++ b/iptables/xtables-monitor.c -@@ -628,6 +628,7 @@ int xtables_monitor_main(int argc, char - #if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) - init_extensions(); - init_extensions4(); -+ init_extensions6(); - #endif - - if (nft_init(&h, AF_INET, xtables_ipv4)) { ---- a/iptables/xtables-restore.c -+++ b/iptables/xtables-restore.c -@@ -364,6 +364,7 @@ xtables_restore_main(int family, const c - #if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) - init_extensions(); - init_extensions4(); -+ init_extensions6(); - #endif - break; - case NFPROTO_ARP: ---- a/iptables/xtables-save.c -+++ b/iptables/xtables-save.c -@@ -202,6 +202,7 @@ xtables_save_main(int family, int argc, - #if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) - init_extensions(); - init_extensions4(); -+ init_extensions6(); - #endif - tables = xtables_ipv4; - d.commit = true; ---- a/iptables/xtables-standalone.c -+++ b/iptables/xtables-standalone.c -@@ -57,6 +57,7 @@ xtables_main(int family, const char *pro - #if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) - init_extensions(); - init_extensions4(); -+ init_extensions6(); - #endif - - if (nft_init(&h, family, xtables_ipv4) < 0) { ---- a/iptables/xtables-translate.c -+++ b/iptables/xtables-translate.c -@@ -469,6 +469,7 @@ static int xtables_xlate_main_common(str - #if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) - init_extensions(); - init_extensions4(); -+ init_extensions6(); - #endif - tables = xtables_ipv4; - break; diff --git a/package/network/utils/iptables/patches/002-xtables-Call-init_extensions_a_b.patch b/package/network/utils/iptables/patches/002-xtables-Call-init_extensions_a_b.patch deleted file mode 100644 index 0d7226ccd5..0000000000 --- a/package/network/utils/iptables/patches/002-xtables-Call-init_extensions_a_b.patch +++ /dev/null @@ -1,107 +0,0 @@ -A modified version of this patch was commited upstream -as part of a fixup series -https://bugzilla.netfilter.org/show_bug.cgi?id=1593 -https://git.netfilter.org/iptables/commit/?id=0836524f093c0fd9c39604a46a949e43d9b47ef2 - ---- a/iptables/xtables-monitor.c -+++ b/iptables/xtables-monitor.c -@@ -629,6 +629,8 @@ int xtables_monitor_main(int argc, char - init_extensions(); - init_extensions4(); - init_extensions6(); -+ init_extensionsa(); -+ init_extensionsb(); - #endif - - if (nft_init(&h, AF_INET, xtables_ipv4)) { ---- a/iptables/xtables-restore.c -+++ b/iptables/xtables-restore.c -@@ -368,9 +368,17 @@ xtables_restore_main(int family, const c - #endif - break; - case NFPROTO_ARP: -+#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) -+ init_extensions(); -+ init_extensionsa(); -+#endif - tables = xtables_arp; - break; - case NFPROTO_BRIDGE: -+#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) -+ init_extensions(); -+ init_extensionsb(); -+#endif - tables = xtables_bridge; - break; - default: ---- a/iptables/xtables-save.c -+++ b/iptables/xtables-save.c -@@ -208,9 +208,17 @@ xtables_save_main(int family, int argc, - d.commit = true; - break; - case NFPROTO_ARP: -+#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) -+ init_extensions(); -+ init_extensionsa(); -+#endif - tables = xtables_arp; - break; - case NFPROTO_BRIDGE: { -+#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) -+ init_extensions(); -+ init_extensionsb(); -+#endif - const char *ctr = getenv("EBTABLES_SAVE_COUNTER"); - - if (!(d.format & FMT_NOCOUNTS)) { ---- a/iptables/xtables-standalone.c -+++ b/iptables/xtables-standalone.c -@@ -58,6 +58,8 @@ xtables_main(int family, const char *pro - init_extensions(); - init_extensions4(); - init_extensions6(); -+ init_extensionsa(); -+ init_extensionsb(); - #endif - - if (nft_init(&h, family, xtables_ipv4) < 0) { ---- a/iptables/xtables-translate.c -+++ b/iptables/xtables-translate.c -@@ -474,9 +474,17 @@ static int xtables_xlate_main_common(str - tables = xtables_ipv4; - break; - case NFPROTO_ARP: -+#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) -+ init_extensions(); -+ init_extensionsa(); -+#endif - tables = xtables_arp; - break; - case NFPROTO_BRIDGE: -+#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) -+ init_extensions(); -+ init_extensionsb(); -+#endif - tables = xtables_bridge; - break; - default: ---- a/iptables/xtables-arp.c -+++ b/iptables/xtables-arp.c -@@ -438,6 +438,7 @@ int nft_init_arp(struct nft_handle *h, c - } - - #if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) -+ init_extensions(); - init_extensionsa(); - #endif - ---- a/iptables/xtables-eb.c -+++ b/iptables/xtables-eb.c -@@ -685,6 +685,7 @@ int nft_init_eb(struct nft_handle *h, co - } - - #if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) -+ init_extensions(); - init_extensionsb(); - #endif - diff --git a/package/network/utils/iptables/patches/020-treewide-use-uint-instead-of-u_int.patch b/package/network/utils/iptables/patches/020-treewide-use-uint-instead-of-u_int.patch new file mode 100644 index 0000000000..e4b0cd92de --- /dev/null +++ b/package/network/utils/iptables/patches/020-treewide-use-uint-instead-of-u_int.patch @@ -0,0 +1,144 @@ +From f319389525b066b7dc6d389c88f16a0df3b8f189 Mon Sep 17 00:00:00 2001 +From: Nick Hainke +Date: Mon, 16 May 2022 18:16:41 +0200 +Subject: treewide: use uint* instead of u_int* + +Gcc complains about missing types. Some commits introduced u_int* instead +of uint*. Use uint treewide. + +Fixes errors in the form of: +In file included from xtables-legacy-multi.c:5: +xshared.h:83:56: error: unknown type name 'u_int16_t'; did you mean 'uint16_t'? + 83 | set_option(unsigned int *options, unsigned int option, u_int16_t *invflg, + | ^~~~~~~~~ + | uint16_t +make[6]: *** [Makefile:712: xtables_legacy_multi-xtables-legacy-multi.o] Error 1 + +Avoid libipq API breakage by adjusting libipq.h include accordingly. For +arpt_mangle.h kernel uAPI header, apply same change as in kernel commit +e91ded8db5747 ("uapi: netfilter_arp: use __u8 instead of u_int8_t"). + +Signed-off-by: Nick Hainke +Signed-off-by: Phil Sutter +--- + extensions/libxt_conntrack.c | 2 +- + include/libipq/libipq.h | 8 ++++---- + include/libiptc/libxtc.h | 2 +- + include/linux/netfilter_arp/arpt_mangle.h | 2 +- + iptables/xshared.c | 2 +- + iptables/xshared.h | 2 +- + libipq/ipq_create_handle.3 | 2 +- + libipq/ipq_set_mode.3 | 2 +- + 8 files changed, 11 insertions(+), 11 deletions(-) + +--- a/extensions/libxt_conntrack.c ++++ b/extensions/libxt_conntrack.c +@@ -778,7 +778,7 @@ matchinfo_print(const void *ip, const st + + static void + conntrack_dump_ports(const char *prefix, const char *opt, +- u_int16_t port_low, u_int16_t port_high) ++ uint16_t port_low, uint16_t port_high) + { + if (port_high == 0 || port_low == port_high) + printf(" %s%s %u", prefix, opt, port_low); +--- a/include/libipq/libipq.h ++++ b/include/libipq/libipq.h +@@ -24,7 +24,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +@@ -48,19 +48,19 @@ typedef unsigned long ipq_id_t; + struct ipq_handle + { + int fd; +- u_int8_t blocking; ++ uint8_t blocking; + struct sockaddr_nl local; + struct sockaddr_nl peer; + }; + +-struct ipq_handle *ipq_create_handle(u_int32_t flags, u_int32_t protocol); ++struct ipq_handle *ipq_create_handle(uint32_t flags, uint32_t protocol); + + int ipq_destroy_handle(struct ipq_handle *h); + + ssize_t ipq_read(const struct ipq_handle *h, + unsigned char *buf, size_t len, int timeout); + +-int ipq_set_mode(const struct ipq_handle *h, u_int8_t mode, size_t len); ++int ipq_set_mode(const struct ipq_handle *h, uint8_t mode, size_t len); + + ipq_packet_msg_t *ipq_get_packet(const unsigned char *buf); + +--- a/include/libiptc/libxtc.h ++++ b/include/libiptc/libxtc.h +@@ -10,7 +10,7 @@ extern "C" { + #endif + + #ifndef XT_MIN_ALIGN +-/* xt_entry has pointers and u_int64_t's in it, so if you align to ++/* xt_entry has pointers and uint64_t's in it, so if you align to + it, you'll also align to any crazy matches and targets someone + might write */ + #define XT_MIN_ALIGN (__alignof__(struct xt_entry)) +--- a/include/linux/netfilter_arp/arpt_mangle.h ++++ b/include/linux/netfilter_arp/arpt_mangle.h +@@ -13,7 +13,7 @@ struct arpt_mangle + union { + struct in_addr tgt_ip; + } u_t; +- u_int8_t flags; ++ __u8 flags; + int target; + }; + +--- a/iptables/xshared.c ++++ b/iptables/xshared.c +@@ -1025,7 +1025,7 @@ static const int inverse_for_options[NUM + }; + + void +-set_option(unsigned int *options, unsigned int option, u_int16_t *invflg, ++set_option(unsigned int *options, unsigned int option, uint16_t *invflg, + bool invert) + { + if (*options & option) +--- a/iptables/xshared.h ++++ b/iptables/xshared.h +@@ -80,7 +80,7 @@ struct xtables_target; + #define IPT_INV_ARPHRD 0x0800 + + void +-set_option(unsigned int *options, unsigned int option, u_int16_t *invflg, ++set_option(unsigned int *options, unsigned int option, uint16_t *invflg, + bool invert); + + /** +--- a/libipq/ipq_create_handle.3 ++++ b/libipq/ipq_create_handle.3 +@@ -24,7 +24,7 @@ ipq_create_handle, ipq_destroy_handle \( + .br + .B #include + .sp +-.BI "struct ipq_handle *ipq_create_handle(u_int32_t " flags ", u_int32_t " protocol ");" ++.BI "struct ipq_handle *ipq_create_handle(uint32_t " flags ", uint32_t " protocol ");" + .br + .BI "int ipq_destroy_handle(struct ipq_handle *" h ); + .SH DESCRIPTION +--- a/libipq/ipq_set_mode.3 ++++ b/libipq/ipq_set_mode.3 +@@ -24,7 +24,7 @@ ipq_set_mode \(em set the ip_queue queui + .br + .B #include + .sp +-.BI "int ipq_set_mode(const struct ipq_handle *" h ", u_int8_t " mode ", size_t " range ); ++.BI "int ipq_set_mode(const struct ipq_handle *" h ", uint8_t " mode ", size_t " range ); + .SH DESCRIPTION + The + .B ipq_set_mode diff --git a/package/network/utils/iptables/patches/030-revert-fix-build-for-missing-ETH_ALEN-definition.patch b/package/network/utils/iptables/patches/030-revert-fix-build-for-missing-ETH_ALEN-definition.patch new file mode 100644 index 0000000000..6c8e3deb5c --- /dev/null +++ b/package/network/utils/iptables/patches/030-revert-fix-build-for-missing-ETH_ALEN-definition.patch @@ -0,0 +1,60 @@ +From 0e7cf0ad306cdf95dc3c28d15a254532206a888e Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Wed, 18 May 2022 16:04:09 +0200 +Subject: Revert "fix build for missing ETH_ALEN definition" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit c5d9a723b5159a28f547b577711787295a14fd84 as it broke +compiling against musl libc. Might be a bug in the latter, but for the +time being try to please both by avoiding the include and instead +defining ETH_ALEN if unset. + +While being at it, move netinet/ether.h include up. + +Fixes: 1bdb5535f561a ("libxtables: Extend MAC address printing/parsing support") +Signed-off-by: Phil Sutter +Reviewed-by: Maciej Å»enczykowski +--- + libxtables/xtables.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +--- a/libxtables/xtables.c ++++ b/libxtables/xtables.c +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -45,7 +46,6 @@ + + #include + #include /* INT_MAX in ip_tables.h/ip6_tables.h */ +-#include /* ETH_ALEN */ + #include + #include + #include +@@ -72,6 +72,10 @@ + #define PROC_SYS_MODPROBE "/proc/sys/kernel/modprobe" + #endif + ++#ifndef ETH_ALEN ++#define ETH_ALEN 6 ++#endif ++ + /* we need this for ip6?tables-restore. ip6?tables-restore.c sets line to the + * current line of the input file, in order to give a more precise error + * message. ip6?tables itself doesn't need this, so it is initialized to the +@@ -2245,8 +2249,6 @@ void xtables_print_num(uint64_t number, + printf(FMT("%4lluT ","%lluT "), (unsigned long long)number); + } + +-#include +- + static const unsigned char mac_type_unicast[ETH_ALEN] = {}; + static const unsigned char msk_type_unicast[ETH_ALEN] = {1}; + static const unsigned char mac_type_multicast[ETH_ALEN] = {1}; diff --git a/package/network/utils/iptables/patches/040-xshared-Fix-build-for-Werror-format-security.patch b/package/network/utils/iptables/patches/040-xshared-Fix-build-for-Werror-format-security.patch new file mode 100644 index 0000000000..f7e5e34c73 --- /dev/null +++ b/package/network/utils/iptables/patches/040-xshared-Fix-build-for-Werror-format-security.patch @@ -0,0 +1,23 @@ +From b72eb12ea5a61df0655ad99d5048994e916be83a Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Fri, 13 May 2022 16:51:58 +0200 +Subject: [PATCH] xshared: Fix build for -Werror=format-security + +Gcc complains about the omitted format string. + +Signed-off-by: Phil Sutter +--- + iptables/xshared.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/iptables/xshared.c ++++ b/iptables/xshared.c +@@ -1307,7 +1307,7 @@ static void check_empty_interface(struct + return; + + if (args->family != NFPROTO_ARP) +- xtables_error(PARAMETER_PROBLEM, msg); ++ xtables_error(PARAMETER_PROBLEM, "%s", msg); + + fprintf(stderr, "%s", msg); + } diff --git a/package/network/utils/iptables/patches/050-build-fix-error-during-out-of-tree-build.patch b/package/network/utils/iptables/patches/050-build-fix-error-during-out-of-tree-build.patch new file mode 100644 index 0000000000..acfca96e0f --- /dev/null +++ b/package/network/utils/iptables/patches/050-build-fix-error-during-out-of-tree-build.patch @@ -0,0 +1,28 @@ +From 0ebf52fc951b2a4d98a166afb34af4f364bbeece Mon Sep 17 00:00:00 2001 +From: Ben Brown +Date: Wed, 25 May 2022 16:26:13 +0100 +Subject: build: Fix error during out of tree build + +Fixes the following error: + + ../../libxtables/xtables.c:52:10: fatal error: libiptc/linux_list.h: No such file or directory + 52 | #include + +Fixes: f58b0d7406451 ("libxtables: Implement notargets hash table") +Signed-off-by: Ben Brown +Signed-off-by: Phil Sutter +--- + libxtables/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/libxtables/Makefile.am ++++ b/libxtables/Makefile.am +@@ -1,7 +1,7 @@ + # -*- Makefile -*- + + AM_CFLAGS = ${regular_CFLAGS} +-AM_CPPFLAGS = ${regular_CPPFLAGS} -I${top_builddir}/include -I${top_srcdir}/include -I${top_srcdir}/iptables ${kinclude_CPPFLAGS} ++AM_CPPFLAGS = ${regular_CPPFLAGS} -I${top_builddir}/include -I${top_srcdir}/include -I${top_srcdir}/iptables -I${top_srcdir} ${kinclude_CPPFLAGS} + + lib_LTLIBRARIES = libxtables.la + libxtables_la_SOURCES = xtables.c xtoptions.c getethertype.c diff --git a/package/network/utils/iptables/patches/060-libxtables-unexport-init_extensions-declarations.patch b/package/network/utils/iptables/patches/060-libxtables-unexport-init_extensions-declarations.patch new file mode 100644 index 0000000000..559b93eea4 --- /dev/null +++ b/package/network/utils/iptables/patches/060-libxtables-unexport-init_extensions-declarations.patch @@ -0,0 +1,82 @@ +From ef108943f69a6e20533d58823740d3f0534ea8ec Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Wed, 1 Jun 2022 19:15:06 +0200 +Subject: libxtables: Unexport init_extensions*() declarations + +The functions are used for static builds to initialize extensions after +libxtables init. Regular library users should not need them, but the +empty declarations introduced in #else case (and therefore present in +user's env) may clash with existing symbol names. + +Avoid problems and guard the whole block declaring the function +prototypes and mangling extensions' _init functions by XTABLES_INTERNAL. + +Reported-by: Nick Hainke +Fixes: 6c689b639cf8e ("Simplify static build extension loading") +Signed-off-by: Phil Sutter +--- + include/xtables.h | 44 ++++++++++++++++++++++---------------------- + 1 file changed, 22 insertions(+), 22 deletions(-) + +--- a/include/xtables.h ++++ b/include/xtables.h +@@ -585,27 +585,6 @@ static inline void xtables_print_mark_ma + xtables_print_val_mask(mark, mask, NULL); + } + +-#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) +-# ifdef _INIT +-# undef _init +-# define _init _INIT +-# endif +- extern void init_extensions(void); +- extern void init_extensions4(void); +- extern void init_extensions6(void); +- extern void init_extensionsa(void); +- extern void init_extensionsb(void); +-#else +-# define _init __attribute__((constructor)) _INIT +-# define EMPTY_FUNC_DEF(x) static inline void x(void) {} +- EMPTY_FUNC_DEF(init_extensions) +- EMPTY_FUNC_DEF(init_extensions4) +- EMPTY_FUNC_DEF(init_extensions6) +- EMPTY_FUNC_DEF(init_extensionsa) +- EMPTY_FUNC_DEF(init_extensionsb) +-# undef EMPTY_FUNC_DEF +-#endif +- + extern const struct xtables_pprot xtables_chain_protos[]; + extern uint16_t xtables_parse_protocol(const char *s); + +@@ -663,9 +642,30 @@ void xtables_announce_chain(const char * + # define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) + # endif + ++#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) ++# ifdef _INIT ++# undef _init ++# define _init _INIT ++# endif ++ extern void init_extensions(void); ++ extern void init_extensions4(void); ++ extern void init_extensions6(void); ++ extern void init_extensionsa(void); ++ extern void init_extensionsb(void); ++#else ++# define _init __attribute__((constructor)) _INIT ++# define EMPTY_FUNC_DEF(x) static inline void x(void) {} ++ EMPTY_FUNC_DEF(init_extensions) ++ EMPTY_FUNC_DEF(init_extensions4) ++ EMPTY_FUNC_DEF(init_extensions6) ++ EMPTY_FUNC_DEF(init_extensionsa) ++ EMPTY_FUNC_DEF(init_extensionsb) ++# undef EMPTY_FUNC_DEF ++#endif ++ + extern void _init(void); + +-#endif ++#endif /* XTABLES_INTERNAL */ + + #ifdef __cplusplus + } /* extern "C" */ diff --git a/package/network/utils/iptables/patches/070-extensions-string-Review-parse_string-function.patch b/package/network/utils/iptables/patches/070-extensions-string-Review-parse_string-function.patch new file mode 100644 index 0000000000..cfcb6c77f3 --- /dev/null +++ b/package/network/utils/iptables/patches/070-extensions-string-Review-parse_string-function.patch @@ -0,0 +1,40 @@ +From da5b32fb4656ab69fe1156eb7e36c7c961839e8a Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Wed, 8 Jun 2022 13:45:13 +0200 +Subject: [PATCH] extensions: string: Review parse_string() function + +* Compare against sizeof(info->pattern) which is more clear than having + to know that this buffer is of size XT_STRING_MAX_PATTERN_SIZE + +* Invert the check and error early to reduce indenting + +* Pass info->patlen to memcpy() to avoid reading past end of 's' + +Signed-off-by: Phil Sutter +--- + extensions/libxt_string.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +--- a/extensions/libxt_string.c ++++ b/extensions/libxt_string.c +@@ -78,14 +78,13 @@ static void string_init(struct xt_entry_ + + static void + parse_string(const char *s, struct xt_string_info *info) +-{ ++{ + /* xt_string does not need \0 at the end of the pattern */ +- if (strlen(s) <= XT_STRING_MAX_PATTERN_SIZE) { +- memcpy(info->pattern, s, XT_STRING_MAX_PATTERN_SIZE); +- info->patlen = strnlen(s, XT_STRING_MAX_PATTERN_SIZE); +- return; +- } +- xtables_error(PARAMETER_PROBLEM, "STRING too long \"%s\"", s); ++ if (strlen(s) > sizeof(info->pattern)) ++ xtables_error(PARAMETER_PROBLEM, "STRING too long \"%s\"", s); ++ ++ info->patlen = strnlen(s, sizeof(info->pattern)); ++ memcpy(info->pattern, s, info->patlen); + } + + static void diff --git a/package/network/utils/iptables/patches/101-remove-check-already.patch b/package/network/utils/iptables/patches/101-remove-check-already.patch index 16afafec2d..bd49224c70 100644 --- a/package/network/utils/iptables/patches/101-remove-check-already.patch +++ b/package/network/utils/iptables/patches/101-remove-check-already.patch @@ -1,6 +1,6 @@ --- a/libxtables/xtables.c +++ b/libxtables/xtables.c -@@ -968,12 +968,6 @@ void xtables_register_match(struct xtabl +@@ -1093,12 +1093,6 @@ void xtables_register_match(struct xtabl struct xtables_match **pos; bool seen_myself = false; @@ -13,7 +13,7 @@ if (me->version == NULL) { fprintf(stderr, "%s: match %s<%u> is missing a version\n", xt_params->program_name, me->name, me->revision); -@@ -1152,12 +1146,6 @@ void xtables_register_target(struct xtab +@@ -1277,12 +1271,6 @@ void xtables_register_target(struct xtab struct xtables_target **pos; bool seen_myself = false; diff --git a/package/network/utils/iptables/patches/102-iptables-disable-modprobe.patch b/package/network/utils/iptables/patches/102-iptables-disable-modprobe.patch index b8e19c781a..710f481cac 100644 --- a/package/network/utils/iptables/patches/102-iptables-disable-modprobe.patch +++ b/package/network/utils/iptables/patches/102-iptables-disable-modprobe.patch @@ -1,6 +1,15 @@ --- a/libxtables/xtables.c +++ b/libxtables/xtables.c -@@ -403,6 +403,7 @@ static char *get_modprobe(void) +@@ -476,7 +476,7 @@ char *xtables_strdup(const char *s) + return dup; + } + +-static char *get_modprobe(void) ++__attribute__((unused)) static char *get_modprobe(void) + { + int procfile; + char *ret; +@@ -511,6 +511,7 @@ static char *get_modprobe(void) int xtables_insmod(const char *modname, const char *modprobe, bool quiet) { @@ -8,7 +17,7 @@ char *buf = NULL; char *argv[4]; int status; -@@ -437,6 +438,7 @@ int xtables_insmod(const char *modname, +@@ -545,6 +546,7 @@ int xtables_insmod(const char *modname, free(buf); if (WIFEXITED(status) && WEXITSTATUS(status) == 0) return 0; diff --git a/package/network/utils/iptables/patches/200-configurable_builtin.patch b/package/network/utils/iptables/patches/200-configurable_builtin.patch index 6d7b5b5822..75c29e1e9c 100644 --- a/package/network/utils/iptables/patches/200-configurable_builtin.patch +++ b/package/network/utils/iptables/patches/200-configurable_builtin.patch @@ -60,7 +60,7 @@ .SECONDARY: -@@ -161,11 +181,11 @@ libext4.a: initext4.o ${libext4_objs} +@@ -163,11 +183,11 @@ libext4.a: initext4.o ${libext4_objs} libext6.a: initext6.o ${libext6_objs} ${AM_VERBOSE_AR} ${AR} crs $@ $^; diff --git a/package/network/utils/iptables/patches/600-shared-libext.patch b/package/network/utils/iptables/patches/600-shared-libext.patch index 819f628f9e..838b1ffa66 100644 --- a/package/network/utils/iptables/patches/600-shared-libext.patch +++ b/package/network/utils/iptables/patches/600-shared-libext.patch @@ -18,7 +18,7 @@ -include .*.d -@@ -164,22 +164,22 @@ xt_connlabel_LIBADD = @libnetfilter_conn +@@ -166,22 +166,22 @@ xt_connlabel_LIBADD = @libnetfilter_conn # handling code in the Makefiles. # lib%.o: ${srcdir}/lib%.c diff --git a/package/network/utils/iptables/patches/700-disable-legacy-revisions.patch b/package/network/utils/iptables/patches/700-disable-legacy-revisions.patch index cc451ef959..09db390006 100644 --- a/package/network/utils/iptables/patches/700-disable-legacy-revisions.patch +++ b/package/network/utils/iptables/patches/700-disable-legacy-revisions.patch @@ -1,6 +1,6 @@ --- a/extensions/libxt_conntrack.c +++ b/extensions/libxt_conntrack.c -@@ -1395,6 +1395,7 @@ static int conntrack3_mt6_xlate(struct x +@@ -1399,6 +1399,7 @@ static int conntrack3_mt6_xlate(struct x } static struct xtables_match conntrack_mt_reg[] = { @@ -8,7 +8,7 @@ { .version = XTABLES_VERSION, .name = "conntrack", -@@ -1470,6 +1471,7 @@ static struct xtables_match conntrack_mt +@@ -1474,6 +1475,7 @@ static struct xtables_match conntrack_mt .alias = conntrack_print_name_alias, .x6_options = conntrack2_mt_opts, }, @@ -16,7 +16,7 @@ { .version = XTABLES_VERSION, .name = "conntrack", -@@ -1502,6 +1504,7 @@ static struct xtables_match conntrack_mt +@@ -1506,6 +1508,7 @@ static struct xtables_match conntrack_mt .x6_options = conntrack3_mt_opts, .xlate = conntrack3_mt6_xlate, }, @@ -24,7 +24,7 @@ { .family = NFPROTO_UNSPEC, .name = "state", -@@ -1532,6 +1535,8 @@ static struct xtables_match conntrack_mt +@@ -1536,6 +1539,8 @@ static struct xtables_match conntrack_mt .x6_parse = state_ct23_parse, .x6_options = state_opts, }, @@ -33,7 +33,7 @@ { .family = NFPROTO_UNSPEC, .name = "state", -@@ -1561,6 +1566,7 @@ static struct xtables_match conntrack_mt +@@ -1565,6 +1570,7 @@ static struct xtables_match conntrack_mt .x6_parse = state_parse, .x6_options = state_opts, }, @@ -77,7 +77,7 @@ void _init(void) --- a/extensions/libxt_multiport.c +++ b/extensions/libxt_multiport.c -@@ -571,6 +571,7 @@ static int multiport_xlate6_v1(struct xt +@@ -591,6 +591,7 @@ static int multiport_xlate6_v1(struct xt } static struct xtables_match multiport_mt_reg[] = { @@ -85,7 +85,7 @@ { .family = NFPROTO_IPV4, .name = "multiport", -@@ -601,6 +602,7 @@ static struct xtables_match multiport_mt +@@ -621,6 +622,7 @@ static struct xtables_match multiport_mt .x6_options = multiport_opts, .xlate = multiport_xlate6, }, diff --git a/package/network/utils/iw/Makefile b/package/network/utils/iw/Makefile index da2b556416..528f6868b2 100644 --- a/package/network/utils/iw/Makefile +++ b/package/network/utils/iw/Makefile @@ -8,15 +8,18 @@ include $(TOPDIR)/rules.mk PKG_NAME:=iw -PKG_VERSION:=5.16 +PKG_VERSION:=5.19 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/software/network/iw -PKG_HASH:=4c44e42762f903f9094ba5a598998c800a97a62afd6fd31ec1e0a799e308659c +PKG_HASH:=f167bbe947dd53bb9ebc0c1dcef5db6ad73ac1d6084f2c6f9376c5c360cc4d4e PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0 +PKG_CPE_ID:=cpe:/a:kernel:iw + +PKG_BUILD_FLAGS:=gc-sections lto include $(INCLUDE_DIR)/package.mk @@ -46,8 +49,7 @@ TARGET_CPPFLAGS:= \ -I$(STAGING_DIR)/usr/include/libnl-tiny \ $(TARGET_CPPFLAGS) \ -DCONFIG_LIBNL20 \ - -D_GNU_SOURCE \ - -flto + -D_GNU_SOURCE ifeq ($(BUILD_VARIANT),full) TARGET_CPPFLAGS += -DIW_FULL @@ -55,8 +57,8 @@ ifeq ($(BUILD_VARIANT),full) endif MAKE_FLAGS += \ - CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -ffunction-sections -fdata-sections" \ - LDFLAGS="$(TARGET_LDFLAGS) -Wl,--gc-sections -flto" \ + CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \ + LDFLAGS="$(TARGET_LDFLAGS)" \ NL1FOUND="" NL2FOUND=Y \ NLLIBNAME="libnl-tiny" \ LIBS="-lm -lnl-tiny" \ diff --git a/package/network/utils/iw/patches/001-nl80211_h_sync.patch b/package/network/utils/iw/patches/001-nl80211_h_sync.patch index 3fb5ca255c..afe27d6f23 100644 --- a/package/network/utils/iw/patches/001-nl80211_h_sync.patch +++ b/package/network/utils/iw/patches/001-nl80211_h_sync.patch @@ -1,137 +1,259 @@ --- a/nl80211.h +++ b/nl80211.h -@@ -301,29 +301,6 @@ +@@ -324,6 +324,17 @@ */ /** -- * DOC: FILS shared key crypto offload -- * -- * This feature is applicable to drivers running in AP mode. -- * -- * FILS shared key crypto offload can be advertised by drivers by setting -- * @NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD flag. The drivers that support -- * FILS shared key crypto offload should be able to encrypt and decrypt -- * association frames for FILS shared key authentication as per IEEE 802.11ai. -- * With this capability, for FILS key derivation, drivers depend on userspace. -- * -- * After FILS key derivation, userspace shares the FILS AAD details with the -- * driver and the driver stores the same to use in decryption of association -- * request and in encryption of association response. The below parameters -- * should be given to the driver in %NL80211_CMD_SET_FILS_AAD. -- * %NL80211_ATTR_MAC - STA MAC address, used for storing FILS AAD per STA -- * %NL80211_ATTR_FILS_KEK - Used for encryption or decryption -- * %NL80211_ATTR_FILS_NONCES - Used for encryption or decryption -- * (STA Nonce 16 bytes followed by AP Nonce 16 bytes) -- * -- * Once the association is done, the driver cleans the FILS AAD data. -- */ -- --/** ++ * DOC: Multi-Link Operation ++ * ++ * In Multi-Link Operation, a connection between to MLDs utilizes multiple ++ * links. To use this in nl80211, various commands and responses now need ++ * to or will include the new %NL80211_ATTR_MLO_LINKS attribute. ++ * Additionally, various commands that need to operate on a specific link ++ * now need to be given the %NL80211_ATTR_MLO_LINK_ID attribute, e.g. to ++ * use %NL80211_CMD_START_AP or similar functions. ++ */ ++ ++/** * enum nl80211_commands - supported nl80211 commands * * @NL80211_CMD_UNSPEC: unspecified command to catch errors -@@ -1226,12 +1203,6 @@ - * @NL80211_CMD_COLOR_CHANGE_COMPLETED: Notify userland that the color change - * has completed +@@ -366,14 +377,22 @@ + * the non-transmitting interfaces are deleted as well. + * + * @NL80211_CMD_GET_KEY: Get sequence counter information for a key specified +- * by %NL80211_ATTR_KEY_IDX and/or %NL80211_ATTR_MAC. ++ * by %NL80211_ATTR_KEY_IDX and/or %NL80211_ATTR_MAC. %NL80211_ATTR_MAC ++ * represents peer's MLD address for MLO pairwise key. For MLO group key, ++ * the link is identified by %NL80211_ATTR_MLO_LINK_ID. + * @NL80211_CMD_SET_KEY: Set key attributes %NL80211_ATTR_KEY_DEFAULT, + * %NL80211_ATTR_KEY_DEFAULT_MGMT, or %NL80211_ATTR_KEY_THRESHOLD. ++ * For MLO connection, the link to set default key is identified by ++ * %NL80211_ATTR_MLO_LINK_ID. + * @NL80211_CMD_NEW_KEY: add a key with given %NL80211_ATTR_KEY_DATA, + * %NL80211_ATTR_KEY_IDX, %NL80211_ATTR_MAC, %NL80211_ATTR_KEY_CIPHER, +- * and %NL80211_ATTR_KEY_SEQ attributes. ++ * and %NL80211_ATTR_KEY_SEQ attributes. %NL80211_ATTR_MAC represents ++ * peer's MLD address for MLO pairwise key. The link to add MLO ++ * group key is identified by %NL80211_ATTR_MLO_LINK_ID. + * @NL80211_CMD_DEL_KEY: delete a key identified by %NL80211_ATTR_KEY_IDX +- * or %NL80211_ATTR_MAC. ++ * or %NL80211_ATTR_MAC. %NL80211_ATTR_MAC represents peer's MLD address ++ * for MLO pairwise key. The link to delete group key is identified by ++ * %NL80211_ATTR_MLO_LINK_ID. + * + * @NL80211_CMD_GET_BEACON: (not used) + * @NL80211_CMD_SET_BEACON: change the beacon on an access point interface +@@ -753,6 +772,13 @@ + * %NL80211_ATTR_CSA_C_OFFSETS_TX is an array of offsets to CSA + * counters which will be updated to the current value. This attribute + * is used during CSA period. ++ * For TX on an MLD, the frequency can be omitted and the link ID be ++ * specified, or if transmitting to a known peer MLD (with MLD addresses ++ * in the frame) both can be omitted and the link will be selected by ++ * lower layers. ++ * For RX notification, %NL80211_ATTR_RX_HW_TIMESTAMP may be included to ++ * indicate the frame RX timestamp and %NL80211_ATTR_TX_HW_TIMESTAMP may ++ * be included to indicate the ack TX timestamp. + * @NL80211_CMD_FRAME_WAIT_CANCEL: When an off-channel TX was requested, this + * command may be used with the corresponding cookie to cancel the wait + * time if it is known that it is no longer necessary. This command is +@@ -763,7 +789,9 @@ + * transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies + * the TX command and %NL80211_ATTR_FRAME includes the contents of the + * frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged +- * the frame. ++ * the frame. %NL80211_ATTR_TX_HW_TIMESTAMP may be included to indicate the ++ * tx timestamp and %NL80211_ATTR_RX_HW_TIMESTAMP may be included to ++ * indicate the ack RX timestamp. + * @NL80211_CMD_ACTION_TX_STATUS: Alias for @NL80211_CMD_FRAME_TX_STATUS for + * backward compatibility. * -- * @NL80211_CMD_SET_FILS_AAD: Set FILS AAD data to the driver using - -- * &NL80211_ATTR_MAC - for STA MAC address -- * &NL80211_ATTR_FILS_KEK - for KEK -- * &NL80211_ATTR_FILS_NONCES - for FILS Nonces -- * (STA Nonce 16 bytes followed by AP Nonce 16 bytes) -- * +@@ -1108,6 +1136,12 @@ + * has been received. %NL80211_ATTR_FRAME is used to specify the + * frame contents. The frame is the raw EAPoL data, without ethernet or + * 802.11 headers. ++ * For an MLD transmitter, the %NL80211_ATTR_MLO_LINK_ID may be given and ++ * its effect will depend on the destination: If the destination is known ++ * to be an MLD, this will be used as a hint to select the link to transmit ++ * the frame on. If the destination is not an MLD, this will select both ++ * the link to transmit on and the source address will be set to the link ++ * address of that link. + * When used as an event indication %NL80211_ATTR_CONTROL_PORT_ETHERTYPE, + * %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT and %NL80211_ATTR_MAC are added + * indicating the protocol type of the received frame; whether the frame +@@ -1237,6 +1271,16 @@ + * to describe the BSSID address of the AP and %NL80211_ATTR_TIMEOUT to + * specify the timeout value. + * ++ * @NL80211_CMD_ADD_LINK: Add a new link to an interface. The ++ * %NL80211_ATTR_MLO_LINK_ID attribute is used for the new link. ++ * @NL80211_CMD_REMOVE_LINK: Remove a link from an interface. This may come ++ * without %NL80211_ATTR_MLO_LINK_ID as an easy way to remove all links ++ * in preparation for e.g. roaming to a regular (non-MLO) AP. ++ * ++ * @NL80211_CMD_ADD_LINK_STA: Add a link to an MLD station ++ * @NL80211_CMD_MODIFY_LINK_STA: Modify a link of an MLD station ++ * @NL80211_CMD_REMOVE_LINK_STA: Remove a link of an MLD station ++ * * @NL80211_CMD_MAX: highest used command number * @__NL80211_CMD_AFTER_LAST: internal use */ -@@ -1472,8 +1443,6 @@ enum nl80211_commands { - NL80211_CMD_COLOR_CHANGE_ABORTED, - NL80211_CMD_COLOR_CHANGE_COMPLETED, +@@ -1481,6 +1525,13 @@ enum nl80211_commands { -- NL80211_CMD_SET_FILS_AAD, -- + NL80211_CMD_ASSOC_COMEBACK, + ++ NL80211_CMD_ADD_LINK, ++ NL80211_CMD_REMOVE_LINK, ++ ++ NL80211_CMD_ADD_LINK_STA, ++ NL80211_CMD_MODIFY_LINK_STA, ++ NL80211_CMD_REMOVE_LINK_STA, ++ /* add new commands above here */ /* used to define NL80211_CMD_MAX below */ -@@ -2639,6 +2608,9 @@ enum nl80211_commands { - * Mandatory parameter for the transmitting interface to enable MBSSID. - * Optional for the non-transmitting interfaces. +@@ -2340,8 +2391,10 @@ enum nl80211_commands { + * + * @NL80211_ATTR_IFTYPE_EXT_CAPA: Nested attribute of the following attributes: + * %NL80211_ATTR_IFTYPE, %NL80211_ATTR_EXT_CAPA, +- * %NL80211_ATTR_EXT_CAPA_MASK, to specify the extended capabilities per +- * interface type. ++ * %NL80211_ATTR_EXT_CAPA_MASK, to specify the extended capabilities and ++ * other interface-type specific capabilities per interface type. For MLO, ++ * %NL80211_ATTR_EML_CAPABILITY and %NL80211_ATTR_MLD_CAPA_AND_OPS are ++ * present. * + * @NL80211_ATTR_MU_MIMO_GROUP_DATA: array of 24 bytes that defines a MU-MIMO + * groupID for monitor mode. +@@ -2663,6 +2716,44 @@ enum nl80211_commands { + * association request when used with NL80211_CMD_NEW_STATION). Can be set + * only if %NL80211_STA_FLAG_WME is set. + * ++ * @NL80211_ATTR_MLO_LINK_ID: A (u8) link ID for use with MLO, to be used with ++ * various commands that need a link ID to operate. ++ * @NL80211_ATTR_MLO_LINKS: A nested array of links, each containing some ++ * per-link information and a link ID. ++ * @NL80211_ATTR_MLD_ADDR: An MLD address, used with various commands such as ++ * authenticate/associate. ++ * ++ * @NL80211_ATTR_MLO_SUPPORT: Flag attribute to indicate user space supports MLO ++ * connection. Used with %NL80211_CMD_CONNECT. If this attribute is not ++ * included in NL80211_CMD_CONNECT drivers must not perform MLO connection. ++ * ++ * @NL80211_ATTR_MAX_NUM_AKM_SUITES: U16 attribute. Indicates maximum number of ++ * AKM suites allowed for %NL80211_CMD_CONNECT, %NL80211_CMD_ASSOCIATE and ++ * %NL80211_CMD_START_AP in %NL80211_CMD_GET_WIPHY response. If this ++ * attribute is not present userspace shall consider maximum number of AKM ++ * suites allowed as %NL80211_MAX_NR_AKM_SUITES which is the legacy maximum ++ * number prior to the introduction of this attribute. ++ * ++ * @NL80211_ATTR_EML_CAPABILITY: EML Capability information (u16) ++ * @NL80211_ATTR_MLD_CAPA_AND_OPS: MLD Capabilities and Operations (u16) ++ * ++ * @NL80211_ATTR_TX_HW_TIMESTAMP: Hardware timestamp for TX operation in ++ * nanoseconds (u64). This is the device clock timestamp so it will ++ * probably reset when the device is stopped or the firmware is reset. ++ * When used with %NL80211_CMD_FRAME_TX_STATUS, indicates the frame TX ++ * timestamp. When used with %NL80211_CMD_FRAME RX notification, indicates ++ * the ack TX timestamp. ++ * @NL80211_ATTR_RX_HW_TIMESTAMP: Hardware timestamp for RX operation in ++ * nanoseconds (u64). This is the device clock timestamp so it will ++ * probably reset when the device is stopped or the firmware is reset. ++ * When used with %NL80211_CMD_FRAME_TX_STATUS, indicates the ack RX ++ * timestamp. When used with %NL80211_CMD_FRAME RX notification, indicates ++ * the incoming frame RX timestamp. ++ * @NL80211_ATTR_TD_BITMAP: Transition Disable bitmap, for subsequent ++ * (re)associations. + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce + * transmit power to stay within regulatory limits. u32, dBi. + * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use -@@ -3145,6 +3117,8 @@ enum nl80211_attrs { - NL80211_ATTR_MBSSID_CONFIG, - NL80211_ATTR_MBSSID_ELEMS, +@@ -3177,6 +3268,23 @@ enum nl80211_attrs { + NL80211_ATTR_DISABLE_EHT, + ++ NL80211_ATTR_MLO_LINKS, ++ NL80211_ATTR_MLO_LINK_ID, ++ NL80211_ATTR_MLD_ADDR, ++ ++ NL80211_ATTR_MLO_SUPPORT, ++ ++ NL80211_ATTR_MAX_NUM_AKM_SUITES, ++ ++ NL80211_ATTR_EML_CAPABILITY, ++ NL80211_ATTR_MLD_CAPA_AND_OPS, ++ ++ NL80211_ATTR_TX_HW_TIMESTAMP, ++ NL80211_ATTR_RX_HW_TIMESTAMP, ++ NL80211_ATTR_TD_BITMAP, ++ + NL80211_ATTR_WIPHY_ANTENNA_GAIN, + /* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST, -@@ -4978,7 +4952,6 @@ enum nl80211_txrate_gi { - * @NL80211_BAND_60GHZ: around 60 GHz band (58.32 - 69.12 GHz) - * @NL80211_BAND_6GHZ: around 6 GHz band (5.9 - 7.2 GHz) - * @NL80211_BAND_S1GHZ: around 900MHz, supported by S1G PHYs -- * @NL80211_BAND_LC: light communication band (placeholder) - * @NUM_NL80211_BANDS: number of bands, avoid using this in userspace - * since newer kernel versions may support more bands +@@ -3231,6 +3339,11 @@ enum nl80211_attrs { + #define NL80211_HE_MIN_CAPABILITY_LEN 16 + #define NL80211_HE_MAX_CAPABILITY_LEN 54 + #define NL80211_MAX_NR_CIPHER_SUITES 5 ++ ++/* ++ * NL80211_MAX_NR_AKM_SUITES is obsolete when %NL80211_ATTR_MAX_NUM_AKM_SUITES ++ * present in %NL80211_CMD_GET_WIPHY response. ++ */ + #define NL80211_MAX_NR_AKM_SUITES 2 + #define NL80211_EHT_MIN_CAPABILITY_LEN 13 + #define NL80211_EHT_MAX_CAPABILITY_LEN 51 +@@ -4853,6 +4966,8 @@ enum nl80211_bss_scan_width { + * Contains a nested array of signal strength attributes (u8, dBm), + * using the nesting index as the antenna number. + * @NL80211_BSS_FREQUENCY_OFFSET: frequency offset in KHz ++ * @NL80211_BSS_MLO_LINK_ID: MLO link ID of the BSS (u8). ++ * @NL80211_BSS_MLD_ADDR: MLD address of this BSS if connected to it. + * @__NL80211_BSS_AFTER_LAST: internal + * @NL80211_BSS_MAX: highest BSS attribute */ -@@ -4988,7 +4961,6 @@ enum nl80211_band { - NL80211_BAND_60GHZ, - NL80211_BAND_6GHZ, - NL80211_BAND_S1GHZ, -- NL80211_BAND_LC, +@@ -4878,6 +4993,8 @@ enum nl80211_bss { + NL80211_BSS_PARENT_BSSID, + NL80211_BSS_CHAIN_SIGNAL, + NL80211_BSS_FREQUENCY_OFFSET, ++ NL80211_BSS_MLO_LINK_ID, ++ NL80211_BSS_MLD_ADDR, - NUM_NL80211_BANDS, - }; -@@ -6046,11 +6018,6 @@ enum nl80211_feature_flags { - * @NL80211_EXT_FEATURE_BSS_COLOR: The driver supports BSS color collision - * detection and change announcemnts. + /* keep last */ + __NL80211_BSS_AFTER_LAST, +@@ -5874,7 +5991,7 @@ enum nl80211_ap_sme_features { + * @NL80211_FEATURE_INACTIVITY_TIMER: This driver takes care of freeing up + * the connected inactive stations in AP mode. + * @NL80211_FEATURE_CELL_BASE_REG_HINTS: This driver has been tested +- * to work properly to suppport receiving regulatory hints from ++ * to work properly to support receiving regulatory hints from + * cellular base stations. + * @NL80211_FEATURE_P2P_DEVICE_NEEDS_CHANNEL: (no longer available, only + * here to reserve the value for API/ABI compatibility) +@@ -6174,6 +6291,14 @@ enum nl80211_feature_flags { + * @NL80211_EXT_FEATURE_RADAR_BACKGROUND: Device supports background radar/CAC + * detection. * -- * @NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD: Driver running in AP mode supports -- * FILS encryption and decryption for (Re)Association Request and Response -- * frames. Userspace has to share FILS AAD details to the driver by using -- * @NL80211_CMD_SET_FILS_AAD. -- * ++ * @NL80211_EXT_FEATURE_POWERED_ADDR_CHANGE: Device can perform a MAC address ++ * change without having to bring the underlying network device down ++ * first. For example, in station mode this can be used to vary the ++ * origin MAC address prior to a connection to a new AP for privacy ++ * or other reasons. Note that certain driver specific restrictions ++ * might apply, e.g. no scans in progress, no offchannel operations ++ * in progress, and no active connections. ++ * * @NUM_NL80211_EXT_FEATURES: number of extended features. * @MAX_NL80211_EXT_FEATURES: highest extended feature index. */ -@@ -6116,7 +6083,6 @@ enum nl80211_ext_feature_index { - NL80211_EXT_FEATURE_SECURE_RTT, - NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE, +@@ -6241,6 +6366,7 @@ enum nl80211_ext_feature_index { NL80211_EXT_FEATURE_BSS_COLOR, -- NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD, + NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD, + NL80211_EXT_FEATURE_RADAR_BACKGROUND, ++ NL80211_EXT_FEATURE_POWERED_ADDR_CHANGE, /* add new features before the definition below */ NUM_NL80211_EXT_FEATURES, -@@ -7424,7 +7390,7 @@ enum nl80211_sar_specs_attrs { - * @NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY: Used by the kernel - * to advertise the maximum profile periodicity supported by the driver - * if EMA is enabled. Driver should indicate EMA support to the userspace -- * by setting wiphy->ema_max_profile_periodicity to -+ * by setting wiphy->mbssid_max_ema_profile_periodicity to - * a non-zero value. - * - * @NL80211_MBSSID_CONFIG_ATTR_INDEX: Mandatory parameter to pass the index of -@@ -7443,7 +7409,7 @@ enum nl80211_sar_specs_attrs { - * - * @NL80211_MBSSID_CONFIG_ATTR_EMA: Flag used to enable EMA AP feature. - * Setting this flag is permitted only if the driver advertises EMA support -- * by setting wiphy->ema_max_profile_periodicity to non-zero. -+ * by setting wiphy->mbssid_max_ema_profile_periodicity to non-zero. - * - * @__NL80211_MBSSID_CONFIG_ATTR_LAST: Internal - * @NL80211_MBSSID_CONFIG_ATTR_MAX: highest attribute ---- a/info.c -+++ b/info.c -@@ -701,7 +701,6 @@ broken_combination: - ext_feat_print(tb, OPERATING_CHANNEL_VALIDATION, "Operating Channel Validation (OCV) support"); - ext_feat_print(tb, 4WAY_HANDSHAKE_AP_PSK, "AP mode PSK offload support"); - ext_feat_print(tb, BSS_COLOR, "BSS coloring support"); -- ext_feat_print(tb, FILS_CRYPTO_OFFLOAD, "FILS crypto offload"); - } - - if (tb_msg[NL80211_ATTR_COALESCE_RULE]) { diff --git a/package/network/utils/iw/patches/200-reduce_size.patch b/package/network/utils/iw/patches/200-reduce_size.patch index d0e837c695..8621994524 100644 --- a/package/network/utils/iw/patches/200-reduce_size.patch +++ b/package/network/utils/iw/patches/200-reduce_size.patch @@ -1,6 +1,6 @@ --- a/event.c +++ b/event.c -@@ -956,6 +956,7 @@ static int print_event(struct nl_msg *ms +@@ -971,6 +971,7 @@ static int print_event(struct nl_msg *ms } switch (gnlh->cmd) { @@ -8,7 +8,7 @@ case NL80211_CMD_NEW_WIPHY: printf("renamed to %s\n", nla_get_string(tb[NL80211_ATTR_WIPHY_NAME])); break; -@@ -991,6 +992,7 @@ static int print_event(struct nl_msg *ms +@@ -1006,6 +1007,7 @@ static int print_event(struct nl_msg *ms case NL80211_CMD_SCHED_SCAN_RESULTS: printf("got scheduled scan results\n"); break; @@ -16,7 +16,7 @@ case NL80211_CMD_WIPHY_REG_CHANGE: case NL80211_CMD_REG_CHANGE: if (gnlh->cmd == NL80211_CMD_WIPHY_REG_CHANGE) -@@ -1073,6 +1075,7 @@ static int print_event(struct nl_msg *ms +@@ -1088,6 +1090,7 @@ static int print_event(struct nl_msg *ms mac_addr_n2a(macbuf, nla_data(tb[NL80211_ATTR_MAC])); printf("del station %s\n", macbuf); break; @@ -24,9 +24,9 @@ case NL80211_CMD_JOIN_IBSS: mac_addr_n2a(macbuf, nla_data(tb[NL80211_ATTR_MAC])); printf("IBSS %s joined\n", macbuf); -@@ -1271,9 +1274,9 @@ static int print_event(struct nl_msg *ms - case NL80211_CMD_CH_SWITCH_NOTIFY: - parse_ch_switch_notify(tb, gnlh->cmd); +@@ -1295,9 +1298,9 @@ static int print_event(struct nl_msg *ms + case NL80211_CMD_ASSOC_COMEBACK: /* 147 */ + parse_assoc_comeback(tb, gnlh->cmd); break; +#endif default: @@ -38,7 +38,7 @@ --- a/info.c +++ b/info.c -@@ -215,6 +215,7 @@ next: +@@ -309,6 +309,7 @@ next: } } @@ -46,7 +46,7 @@ if (tb_band[NL80211_BAND_ATTR_RATES]) { printf("\t\tBitrates (non-HT):\n"); nla_for_each_nested(nl_rate, tb_band[NL80211_BAND_ATTR_RATES], rem_rate) { -@@ -231,6 +232,7 @@ next: +@@ -325,6 +326,7 @@ next: printf("\n"); } } @@ -54,7 +54,7 @@ } } -@@ -296,6 +298,7 @@ next: +@@ -390,6 +392,7 @@ next: printf("\tCoverage class: %d (up to %dm)\n", coverage, 450 * coverage); } @@ -62,7 +62,7 @@ if (tb_msg[NL80211_ATTR_CIPHER_SUITES]) { int num = nla_len(tb_msg[NL80211_ATTR_CIPHER_SUITES]) / sizeof(__u32); int i; -@@ -307,6 +310,7 @@ next: +@@ -401,6 +404,7 @@ next: cipher_name(ciphers[i])); } } @@ -70,7 +70,7 @@ if (tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX] && tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX]) -@@ -324,9 +328,11 @@ next: +@@ -418,9 +422,11 @@ next: print_iftype_list("\tSupported interface modes", "\t\t", tb_msg[NL80211_ATTR_SUPPORTED_IFTYPES]); @@ -82,7 +82,7 @@ if (tb_msg[NL80211_ATTR_INTERFACE_COMBINATIONS]) { struct nlattr *nl_combi; -@@ -416,6 +422,7 @@ broken_combination: +@@ -510,6 +516,7 @@ broken_combination: printf("\tinterface combinations are not supported\n"); } @@ -90,7 +90,7 @@ if (tb_msg[NL80211_ATTR_SUPPORTED_COMMANDS]) { printf("\tSupported commands:\n"); nla_for_each_nested(nl_cmd, tb_msg[NL80211_ATTR_SUPPORTED_COMMANDS], rem_cmd) -@@ -513,6 +520,7 @@ broken_combination: +@@ -607,6 +614,7 @@ broken_combination: printf("\t\t * wake up on TCP connection\n"); } } @@ -98,7 +98,7 @@ if (tb_msg[NL80211_ATTR_ROAM_SUPPORT]) printf("\tDevice supports roaming.\n"); -@@ -551,6 +559,7 @@ broken_combination: +@@ -645,6 +653,7 @@ broken_combination: } } @@ -106,7 +106,7 @@ if (tb_msg[NL80211_ATTR_FEATURE_FLAGS]) { unsigned int features = nla_get_u32(tb_msg[NL80211_ATTR_FEATURE_FLAGS]); -@@ -615,6 +624,7 @@ broken_combination: +@@ -709,6 +718,7 @@ broken_combination: if (features & NL80211_FEATURE_ND_RANDOM_MAC_ADDR) printf("\tDevice supports randomizing MAC-addr in net-detect scans.\n"); } @@ -114,7 +114,7 @@ if (tb_msg[NL80211_ATTR_TDLS_SUPPORT]) printf("\tDevice supports T-DLS.\n"); -@@ -751,6 +761,7 @@ TOPLEVEL(list, NULL, NL80211_CMD_GET_WIP +@@ -774,6 +784,7 @@ TOPLEVEL(list, NULL, NL80211_CMD_GET_WIP "List all wireless devices and their capabilities."); TOPLEVEL(phy, NULL, NL80211_CMD_GET_WIPHY, NLM_F_DUMP, CIB_NONE, handle_info, NULL); @@ -122,7 +122,7 @@ static int handle_commands(struct nl80211_state *state, struct nl_msg *msg, int argc, char **argv, enum id_input id) { -@@ -762,6 +773,7 @@ static int handle_commands(struct nl8021 +@@ -785,6 +796,7 @@ static int handle_commands(struct nl8021 } TOPLEVEL(commands, NULL, NL80211_CMD_GET_WIPHY, 0, CIB_NONE, handle_commands, "list all known commands and their decimal & hex value"); @@ -292,7 +292,7 @@ ifeq ($(NO_PKG_CONFIG),) --- a/station.c +++ b/station.c -@@ -777,10 +777,12 @@ static int handle_station_set_plink(stru +@@ -791,10 +791,12 @@ static int handle_station_set_plink(stru nla_put_failure: return -ENOBUFS; } @@ -305,7 +305,7 @@ static int handle_station_set_vlan(struct nl80211_state *state, struct nl_msg *msg, -@@ -875,11 +877,13 @@ static int handle_station_set_mesh_power +@@ -889,11 +891,13 @@ static int handle_station_set_mesh_power nla_put_failure: return -ENOBUFS; } @@ -321,7 +321,7 @@ struct nl_msg *msg, --- a/interface.c +++ b/interface.c -@@ -627,9 +627,11 @@ static int handle_interface_wds_peer(str +@@ -629,9 +629,11 @@ static int handle_interface_wds_peer(str nla_put_failure: return -ENOBUFS; } @@ -333,7 +333,7 @@ static int set_mcast_rate(struct nl80211_state *state, struct nl_msg *msg, -@@ -719,6 +721,7 @@ static int handle_chan(struct nl80211_st +@@ -721,6 +723,7 @@ static int handle_chan(struct nl80211_st return handle_chanfreq(state, msg, true, argc, argv, id); } @@ -341,7 +341,7 @@ SECTION(switch); COMMAND(switch, freq, " [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] [beacons ] [block-tx]\n" -@@ -990,3 +993,4 @@ COMMAND(set, tidconf, "[peer PKG_LICENSE:=GPL-2.0 -IWINFO_ABI_VERSION:=20210430 +PKG_BUILD_FLAGS:=no-lto + +IWINFO_ABI_VERSION:=20230701 include $(INCLUDE_DIR)/package.mk diff --git a/package/network/utils/layerscape/restool/Makefile b/package/network/utils/layerscape/restool/Makefile index a23ae1463b..5919f42ff2 100644 --- a/package/network/utils/layerscape/restool/Makefile +++ b/package/network/utils/layerscape/restool/Makefile @@ -9,10 +9,10 @@ include $(TOPDIR)/rules.mk PKG_NAME:=restool PKG_VERSION:=21.08 -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=4 PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL:=https://source.codeaurora.org/external/qoriq/qoriq-components/restool +PKG_SOURCE_URL:=https://github.com/nxp-qoriq/restool PKG_SOURCE_VERSION:=LSDK-21.08 PKG_MIRROR_HASH:=0396644927b8f3da20183227562f695c8063d3d4c6bb606e8f31dda450e962e4 diff --git a/package/network/utils/ltq-dsl-base/Makefile b/package/network/utils/ltq-dsl-base/Makefile index 2ff069ca4d..b51851f076 100644 --- a/package/network/utils/ltq-dsl-base/Makefile +++ b/package/network/utils/ltq-dsl-base/Makefile @@ -17,7 +17,7 @@ define Package/ltq-dsl-base CATEGORY:=Network TITLE:=DSL related files for Intel/Lantiq DSL Chipsets URL:=http://openwrt.org/ - DEPENDS:=@TARGET_lantiq +jshn + DEPENDS:=@(TARGET_lantiq||TARGET_ipq40xx) +jshn endef define Package/ltq-dsl-base/description diff --git a/package/network/utils/modemmanager/Makefile b/package/network/utils/modemmanager/Makefile deleted file mode 100644 index 99b4dec0ca..0000000000 --- a/package/network/utils/modemmanager/Makefile +++ /dev/null @@ -1,132 +0,0 @@ -# -# Copyright (C) 2016 Velocloud Inc. -# Copyright (C) 2016 Aleksander Morgado -# -# This is free software, licensed under the GNU General Public License v2. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=modemmanager -PKG_SOURCE_VERSION:=1.18.6 -PKG_RELEASE:=$(AUTORELEASE) - -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL:=https://gitlab.freedesktop.org/mobile-broadband/ModemManager.git -PKG_MIRROR_HASH:=72f1a865153745d05c482ed3a77f2045d24387f1f9a37177fe7bc35ab7663765 - -PKG_MAINTAINER:=Nicholas Smith -PKG_LICENSE:=GPL-2.0-or-later -PKG_LICENSE_FILES:=COPYING - -PKG_INSTALL:=1 -PKG_BUILD_DEPENDS:=glib2/host libxslt/host - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/nls.mk -include $(INCLUDE_DIR)/meson.mk - -TARGET_CFLAGS += -ffunction-sections -fdata-sections -fno-merge-all-constants -fmerge-constants -TARGET_LDFLAGS += -Wl,--gc-sections - -define Package/modemmanager/config - source "$(SOURCE)/Config.in" -endef - -define Package/modemmanager - SECTION:=net - CATEGORY:=Network - TITLE:=Control utility for any kind of mobile broadband modem - URL:=https://www.freedesktop.org/wiki/Software/ModemManager - DEPENDS:= \ - $(INTL_DEPENDS) \ - +glib2 \ - +dbus \ - +ppp \ - +MODEMMANAGER_WITH_MBIM:libmbim \ - +MODEMMANAGER_WITH_QMI:libqmi \ - +MODEMMANAGER_WITH_QRTR:libqrtr-glib -endef - -define Package/modemmanager/description - ModemManager is a D-Bus-activated service which allows controlling mobile - broadband modems. Add kernel modules for your modems as needed. - Select Utilities/usb-modeswitch if needed. -endef - -MESON_ARGS += \ - -Dudev=false \ - -Dudevdir=/lib/udev \ - -Dsystemdsystemunitdir=no \ - -Dsystemd_suspend_resume=false \ - -Dsystemd_journal=false \ - -Dpolkit=no \ - -Dintrospection=false \ - -Dman=false \ - -Dbash_completion=false \ - -Db_lto=true \ - -Dmbim=$(if $(CONFIG_MODEMMANAGER_WITH_MBIM),true,false) \ - -Dqmi=$(if $(CONFIG_MODEMMANAGER_WITH_QMI),true,false) \ - -Dqrtr=$(if $(CONFIG_MODEMMANAGER_WITH_QRTR),true,false) \ - -Dat_command_via_dbus=$(if $(CONFIG_MODEMMANAGER_WITH_AT_COMMAND_VIA_DBUS),true,false) - -define Build/InstallDev - $(INSTALL_DIR) $(1)/usr/include/ModemManager - $(CP) $(PKG_INSTALL_DIR)/usr/include/ModemManager/*.h $(1)/usr/include/ModemManager - $(INSTALL_DIR) $(1)/usr/include/libmm-glib - $(CP) $(PKG_INSTALL_DIR)/usr/include/libmm-glib/*.h $(1)/usr/include/libmm-glib - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmm-glib.so* $(1)/usr/lib - $(INSTALL_DIR) $(1)/usr/lib/pkgconfig - $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/ModemManager.pc $(1)/usr/lib/pkgconfig - $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/mm-glib.pc $(1)/usr/lib/pkgconfig -endef - -define Package/modemmanager/install - $(INSTALL_DIR) $(1)/lib/udev/rules.d - $(INSTALL_DATA) $(PKG_INSTALL_DIR)/lib/udev/rules.d/*.rules $(1)/lib/udev/rules.d - - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ModemManager $(1)/usr/sbin - $(INSTALL_BIN) ./files/usr/sbin/ModemManager-wrapper $(1)/usr/sbin - - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mmcli $(1)/usr/bin - - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmm-glib.so.* $(1)/usr/lib - - $(INSTALL_DIR) $(1)/usr/lib/ModemManager - $(CP) $(PKG_INSTALL_DIR)/usr/lib/ModemManager/libmm-shared-*.so* $(1)/usr/lib/ModemManager - $(CP) $(PKG_INSTALL_DIR)/usr/lib/ModemManager/libmm-plugin-*.so* $(1)/usr/lib/ModemManager - - $(INSTALL_DIR) $(1)/etc/dbus-1/system.d - $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/dbus-1/system.d/org.freedesktop.ModemManager1.conf $(1)/etc/dbus-1/system.d - - $(INSTALL_DIR) $(1)/usr/share/dbus-1/system-services - $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/dbus-1/system-services/org.freedesktop.ModemManager1.service $(1)/usr/share/dbus-1/system-services - - $(INSTALL_DIR) $(1)/usr/share/ModemManager - $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/ModemManager/*.conf $(1)/usr/share/ModemManager - $(INSTALL_DATA) ./files/modemmanager.common $(1)/usr/share/ModemManager - - $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) ./files/modemmanager.init $(1)/etc/init.d/modemmanager - - $(INSTALL_DIR) $(1)/etc/hotplug.d/usb - $(INSTALL_DATA) ./files/25-modemmanager-usb $(1)/etc/hotplug.d/usb - - $(INSTALL_DIR) $(1)/etc/hotplug.d/net - $(INSTALL_DATA) ./files/25-modemmanager-net $(1)/etc/hotplug.d/net - - $(INSTALL_DIR) $(1)/etc/hotplug.d/tty - $(INSTALL_DATA) ./files/25-modemmanager-tty $(1)/etc/hotplug.d/tty - - $(INSTALL_DIR) $(1)/etc/hotplug.d/wwan - $(INSTALL_DATA) ./files/25-modemmanager-wwan $(1)/etc/hotplug.d/wwan - - $(INSTALL_DIR) $(1)/lib/netifd/proto - $(INSTALL_BIN) ./files/modemmanager.proto $(1)/lib/netifd/proto/modemmanager.sh -endef - -$(eval $(call BuildPackage,modemmanager)) diff --git a/package/network/utils/modemmanager/README.md b/package/network/utils/modemmanager/README.md deleted file mode 100644 index c9d880ea4e..0000000000 --- a/package/network/utils/modemmanager/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# OpenWrt ModemManager - -## Description - -Cellular modem control and connectivity - -Optional libraries libmbim and libqmi are available. -Your modem may require additional kernel modules and/or the usb-modeswitch -package. - -## Usage - -Once installed, you can configure the 2G/3G/4G modem connections directly in -/etc/config/network as in the following example: - - config interface 'broadband' - option device '/sys/devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2.1' - option proto 'modemmanager' - option apn 'ac.vodafone.es' - option allowedauth 'pap chap' - option username 'vodafone' - option password 'vodafone' - option pincode '7423' - option iptype 'ipv4' - option lowpower '1' - option signalrate '30' - -Only 'device' and 'proto' are mandatory options, the remaining ones are all -optional. - -The 'allowedauth' option allows limiting the list of authentication protocols. -It is given as a space-separated list of values, including any of the -following: 'pap', 'chap', 'mschap', 'mschapv2' or 'eap'. It will default to -allowing all protocols. - -The 'iptype' option supports any of these values: 'ipv4', 'ipv6' or 'ipv4v6'. -It will default to 'ipv4' if not given. - -The 'signalrate' option set's the signal refresh rate (in seconds) for the device. -You can call signal info with command: mmcli -m 0 --signal-get diff --git a/package/network/utils/modemmanager/files/25-modemmanager-net b/package/network/utils/modemmanager/files/25-modemmanager-net deleted file mode 100644 index e87231e31f..0000000000 --- a/package/network/utils/modemmanager/files/25-modemmanager-net +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# Copyright (C) 2016 Velocloud Inc -# Copyright (C) 2016 Aleksander Morgado - -# Load common utilities -. /usr/share/ModemManager/modemmanager.common - -# We require a interface name -[ -n "${INTERFACE}" ] || exit - -# Always make sure the rundir exists -mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" - -# Report network interface -mm_log "${ACTION} network interface ${INTERFACE}: event processed" -mm_report_event "${ACTION}" "${INTERFACE}" "net" "/sys${DEVPATH}" - -# Look for an associated cdc-wdm interface - -cdcwdm="" - -case "${ACTION}" in - "add") cdcwdm=$(mm_track_cdcwdm "${INTERFACE}") ;; - "remove") cdcwdm=$(mm_untrack_cdcwdm "${INTERFACE}") ;; -esac - -# Report cdc-wdm device, if any -[ -n "${cdcwdm}" ] && { - mm_log "${ACTION} cdc interface ${cdcwdm}: custom event processed" - mm_report_event "${ACTION}" "${cdcwdm}" "usbmisc" "/sys${DEVPATH}" -} diff --git a/package/network/utils/modemmanager/files/25-modemmanager-tty b/package/network/utils/modemmanager/files/25-modemmanager-tty deleted file mode 100644 index c13148a33d..0000000000 --- a/package/network/utils/modemmanager/files/25-modemmanager-tty +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -# Copyright (C) 2016 Velocloud Inc -# Copyright (C) 2016 Aleksander Morgado - -# Load hotplug common utilities -. /usr/share/ModemManager/modemmanager.common - -# We require a device name -[ -n "$DEVNAME" ] || exit - -# Always make sure the rundir exists -mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" - -# Report TTY -mm_log "${ACTION} serial interface ${DEVNAME}: event processed" -mm_report_event "${ACTION}" "${DEVNAME}" "tty" "/sys${DEVPATH}" diff --git a/package/network/utils/modemmanager/files/25-modemmanager-wwan b/package/network/utils/modemmanager/files/25-modemmanager-wwan deleted file mode 100644 index c4dc6b897d..0000000000 --- a/package/network/utils/modemmanager/files/25-modemmanager-wwan +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -# Copyright (C) 2021 Aleksander Morgado - -# Load hotplug common utilities -. /usr/share/ModemManager/modemmanager.common - -# We require a device name -[ -n "$DEVNAME" ] || exit - -# Always make sure the rundir exists -mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" - -# Report wwan -mm_log "${ACTION} wwan control port ${DEVNAME}: event processed" -mm_report_event "${ACTION}" "${DEVNAME}" "wwan" "/sys${DEVPATH}" diff --git a/package/network/utils/modemmanager/files/modemmanager.common b/package/network/utils/modemmanager/files/modemmanager.common deleted file mode 100644 index 6367eb32bb..0000000000 --- a/package/network/utils/modemmanager/files/modemmanager.common +++ /dev/null @@ -1,342 +0,0 @@ -#!/bin/sh -# Copyright (C) 2016 Velocloud Inc -# Copyright (C) 2016 Aleksander Morgado - -################################################################################ - -. /lib/functions.sh -. /lib/netifd/netifd-proto.sh - -################################################################################ -# Runtime state - -MODEMMANAGER_RUNDIR="/var/run/modemmanager" -MODEMMANAGER_PID_FILE="${MODEMMANAGER_RUNDIR}/modemmanager.pid" -MODEMMANAGER_CDCWDM_CACHE="${MODEMMANAGER_RUNDIR}/cdcwdm.cache" -MODEMMANAGER_SYSFS_CACHE="${MODEMMANAGER_RUNDIR}/sysfs.cache" -MODEMMANAGER_EVENTS_CACHE="${MODEMMANAGER_RUNDIR}/events.cache" - -################################################################################ -# Common logging - -mm_log() { - local level="$1"; shift - logger -p "daemon.${level}" -t "ModemManager[$$]" "hotplug: $*" -} - -################################################################################ -# Receives as input argument the full sysfs path of the device -# Returns the physical device sysfs path -# -# NOTE: this method only works when the device exists, i.e. it cannot be used -# on removal hotplug events - -mm_find_physdev_sysfs_path() { - local tmp_path="$1" - - while true; do - tmp_path=$(dirname "${tmp_path}") - - # avoid infinite loops iterating - [ -z "${tmp_path}" ] || [ "${tmp_path}" = "/" ] && return - - # For USB devices, the physical device will be that with a idVendor - # and idProduct pair of files - [ -f "${tmp_path}"/idVendor ] && [ -f "${tmp_path}"/idProduct ] && { - tmp_path=$(readlink -f "$tmp_path") - echo "${tmp_path}" - return - } - - # For PCI devices, the physical device will be that with a vendor - # and device pair of files - [ -f "${tmp_path}"/vendor ] && [ -f "${tmp_path}"/device ] && { - tmp_path=$(readlink -f "$tmp_path") - echo "${tmp_path}" - return - } - done -} - -################################################################################ - -# Returns the cdc-wdm name retrieved from sysfs -mm_track_cdcwdm() { - local wwan="$1" - local cdcwdm - - cdcwdm=$(ls "/sys/class/net/${wwan}/device/usbmisc/") - [ -n "${cdcwdm}" ] || return - - # We have to cache it for later, as we won't be able to get the - # associated cdc-wdm device on a remove event - echo "${wwan} ${cdcwdm}" >> "${MODEMMANAGER_CDCWDM_CACHE}" - - echo "${cdcwdm}" -} - -# Returns the cdc-wdm name retrieved from the cache -mm_untrack_cdcwdm() { - local wwan="$1" - local cdcwdm - - # Look for the cached associated cdc-wdm device - [ -f "${MODEMMANAGER_CDCWDM_CACHE}" ] || return - - cdcwdm=$(awk -v wwan="${wwan}" '!/^#/ && $0 ~ wwan { print $2 }' "${MODEMMANAGER_CDCWDM_CACHE}") - [ -n "${cdcwdm}" ] || return - - # Remove from cache - sed -i "/${wwan} ${cdcwdm}/d" "${MODEMMANAGER_CDCWDM_CACHE}" - - echo "${cdcwdm}" -} - -################################################################################ -# ModemManager needs some time from the ports being added until a modem object -# is exposed in DBus. With the logic here we do an explicit wait of N seconds -# for ModemManager to expose the new modem object, making sure that the wait is -# unique per device (i.e. per physical device sysfs path). - -# Gets the modem wait status as retrieved from the cache -mm_get_modem_wait_status() { - local sysfspath="$1" - - # If no sysfs cache file, we're done - [ -f "${MODEMMANAGER_SYSFS_CACHE}" ] || return - - # Get status of the sysfs path - awk -v sysfspath="${sysfspath}" '!/^#/ && $0 ~ sysfspath { print $2 }' "${MODEMMANAGER_SYSFS_CACHE}" -} - -# Clear the modem wait status from the cache, if any -mm_clear_modem_wait_status() { - local sysfspath="$1" - - local escaped_sysfspath - - [ -f "${MODEMMANAGER_SYSFS_CACHE}" ] && { - # escape '/', '\' and '&' for sed... - escaped_sysfspath=$(echo "$sysfspath" | sed -e 's/[\/&]/\\&/g') - sed -i "/${escaped_sysfspath}/d" "${MODEMMANAGER_SYSFS_CACHE}" - } -} - -# Sets the modem wait status in the cache -mm_set_modem_wait_status() { - local sysfspath="$1" - local status="$2" - - # Remove sysfs line before adding the new one with the new state - mm_clear_modem_wait_status "${sysfspath}" - - # Add the new status - echo "${sysfspath} ${status}" >> "${MODEMMANAGER_SYSFS_CACHE}" -} - -# Callback for config_foreach() -mm_get_modem_config_foreach_cb() { - local cfg="$1" - local sysfspath="$2" - - local proto - config_get proto "${cfg}" proto - [ "${proto}" = modemmanager ] || return 0 - - local dev - dev=$(uci_get network "${cfg}" device) - [ "${dev}" = "${sysfspath}" ] || return 0 - - echo "${cfg}" -} - -# Returns the name of the interface configured for this device -mm_get_modem_config() { - local sysfspath="$1" - - # Look for configuration for the given sysfs path - config_load network - config_foreach mm_get_modem_config_foreach_cb interface "${sysfspath}" -} - -# Wait for a modem in the specified sysfspath -mm_wait_for_modem() { - local cfg="$1" - local sysfspath="$2" - - # TODO: config max wait - local n=45 - local step=5 - - while [ $n -ge 0 ]; do - [ -d "${sysfspath}" ] || { - mm_log "error" "ignoring modem detection request: no device at ${sysfspath}" - proto_set_available "${cfg}" 0 - return 1 - } - - # Check if the modem exists at the given sysfs path - if ! mmcli -m "${sysfspath}" > /dev/null 2>&1 - then - mm_log "error" "modem not detected at sysfs path" - else - mm_log "info" "modem exported successfully at ${sysfspath}" - mm_log "info" "setting interface '${cfg}' as available" - proto_set_available "${cfg}" 1 - return 0 - fi - - sleep $step - n=$((n-step)) - done - - mm_log "error" "timed out waiting for the modem to get exported at ${sysfspath}" - proto_set_available "${cfg}" 0 - return 2 -} - -mm_report_modem_wait() { - local sysfspath=$1 - - local parent_sysfspath status - - parent_sysfspath=$(mm_find_physdev_sysfs_path "$sysfspath") - [ -n "${parent_sysfspath}" ] || { - mm_log "error" "parent device sysfspath not found" - return - } - - status=$(mm_get_modem_wait_status "${parent_sysfspath}") - case "${status}" in - "") - local cfg - - cfg=$(mm_get_modem_config "${parent_sysfspath}") - if [ -n "${cfg}" ]; then - mm_log "info" "interface '${cfg}' is set to configure device '${parent_sysfspath}'" - mm_log "info" "now waiting for modem at sysfs path ${parent_sysfspath}" - mm_set_modem_wait_status "${parent_sysfspath}" "processed" - # Launch subshell for the explicit wait - ( mm_wait_for_modem "${cfg}" "${parent_sysfspath}" ) > /dev/null 2>&1 & - else - mm_log "info" "no need to wait for modem at sysfs path ${parent_sysfspath}" - mm_set_modem_wait_status "${parent_sysfspath}" "ignored" - fi - ;; - "processed") - mm_log "info" "already waiting for modem at sysfs path ${parent_sysfspath}" - ;; - "ignored") - ;; - *) - mm_log "error" "unknown status read for device at sysfs path ${parent_sysfspath}" - ;; - esac -} - -################################################################################ -# Cleanup interfaces - -mm_cleanup_interface_cb() { - local cfg="$1" - - local proto - config_get proto "${cfg}" proto - [ "${proto}" = modemmanager ] || return 0 - - proto_set_available "${cfg}" 0 -} - -mm_cleanup_interfaces() { - config_load network - config_foreach mm_cleanup_interface_cb interface -} - -mm_cleanup_interface_by_sysfspath() { - local dev="$1" - - local cfg - cfg=$(mm_get_modem_config "$dev") - [ -n "${cfg}" ] || return - - mm_log "info" "setting interface '$cfg' as unavailable" - proto_set_available "${cfg}" 0 -} - -################################################################################ -# Event reporting - -# Receives as input the action, the device name and the subsystem -mm_report_event() { - local action="$1" - local name="$2" - local subsystem="$3" - local sysfspath="$4" - - # Track/untrack events in cache - case "${action}" in - "add") - # On add events, store event details in cache (if not exists yet) - grep -qs "${name},${subsystem}" "${MODEMMANAGER_EVENTS_CACHE}" || \ - echo "${action},${name},${subsystem},${sysfspath}" >> "${MODEMMANAGER_EVENTS_CACHE}" - ;; - "remove") - # On remove events, remove old events from cache (match by subsystem+name) - sed -i "/${name},${subsystem}/d" "${MODEMMANAGER_EVENTS_CACHE}" - ;; - esac - - # Report the event - mm_log "debug" "event reported: action=${action}, name=${name}, subsystem=${subsystem}" - mmcli --report-kernel-event="action=${action},name=${name},subsystem=${subsystem}" 1>/dev/null 2>&1 & - - # Wait for added modem if a sysfspath is given - [ -n "${sysfspath}" ] && [ "$action" = "add" ] && mm_report_modem_wait "${sysfspath}" -} - -mm_report_event_from_cache_line() { - local event_line="$1" - - local action name subsystem sysfspath - action=$(echo "${event_line}" | awk -F ',' '{ print $1 }') - name=$(echo "${event_line}" | awk -F ',' '{ print $2 }') - subsystem=$(echo "${event_line}" | awk -F ',' '{ print $3 }') - sysfspath=$(echo "${event_line}" | awk -F ',' '{ print $4 }') - - mm_log "debug" "cached event found: action=${action}, name=${name}, subsystem=${subsystem}, sysfspath=${sysfspath}" - mm_report_event "${action}" "${name}" "${subsystem}" "${sysfspath}" -} - -mm_report_events_from_cache() { - # Remove the sysfs cache - rm -f "${MODEMMANAGER_SYSFS_CACHE}" - - local n=60 - local step=1 - local mmrunning=0 - - # Wait for ModemManager to be available in the bus - while [ $n -ge 0 ]; do - sleep $step - mm_log "info" "checking if ModemManager is available..." - - if ! mmcli -L >/dev/null 2>&1 - then - mm_log "info" "ModemManager not yet available" - else - mmrunning=1 - break - fi - n=$((n-step)) - done - - [ ${mmrunning} -eq 1 ] || { - mm_log "error" "couldn't report initial kernel events: ModemManager not running" - return - } - - # Report cached kernel events - while IFS= read -r event_line; do - mm_report_event_from_cache_line "${event_line}" - done < ${MODEMMANAGER_EVENTS_CACHE} -} diff --git a/package/network/utils/modemmanager/files/modemmanager.proto b/package/network/utils/modemmanager/files/modemmanager.proto deleted file mode 100755 index d24910b984..0000000000 --- a/package/network/utils/modemmanager/files/modemmanager.proto +++ /dev/null @@ -1,550 +0,0 @@ -#!/bin/sh -# Copyright (C) 2016-2019 Aleksander Morgado - -[ -x /usr/bin/mmcli ] || exit 0 -[ -x /usr/sbin/pppd ] || exit 0 - -[ -n "$INCLUDE_ONLY" ] || { - . /lib/functions.sh - . ../netifd-proto.sh - . ./ppp.sh - init_proto "$@" -} - -cdr2mask () -{ - # Number of args to shift, 255..255, first non-255 byte, zeroes - set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0 - if [ "$1" -gt 1 ] - then - shift "$1" - else - shift - fi - echo "${1-0}"."${2-0}"."${3-0}"."${4-0}" -} - -# This method expects as first argument a list of key-value pairs, as returned by mmcli --output-keyvalue -# The second argument must be exactly the name of the field to read -# -# Sample output: -# $ mmcli -m 0 -K -# modem.dbus-path : /org/freedesktop/ModemManager1/Modem/0 -# modem.generic.device-identifier : ed6eff2e3e0f90463da1c2a755b2acacd1335752 -# modem.generic.manufacturer : Dell Inc. -# modem.generic.model : DW5821e Snapdragon X20 LTE -# modem.generic.revision : T77W968.F1.0.0.4.0.GC.009\n026 -# modem.generic.carrier-configuration : GCF -# modem.generic.carrier-configuration-revision : 08E00009 -# modem.generic.hardware-revision : DW5821e Snapdragon X20 LTE -# .... -modemmanager_get_field() { - local list=$1 - local field=$2 - local value="" - - [ -z "${list}" ] || [ -z "${field}" ] && return - - # there is always at least a whitespace after each key, and we use that as part of the - # key matching we do (e.g. to avoid getting 'modem.generic.state-failed-reason' as a result - # when grepping for 'modem.generic.state'. - line=$(echo "${list}" | grep "${field} ") - value=$(echo ${line#*:}) - - # not found? - [ -n "${value}" ] || return 2 - - # only print value if set - [ "${value}" != "--" ] && echo "${value}" - return 0 -} - -# build a comma-separated list of values from the list -modemmanager_get_multivalue_field() { - local list=$1 - local field=$2 - local value="" - local length idx item - - [ -z "${list}" ] || [ -z "${field}" ] && return - - length=$(modemmanager_get_field "${list}" "${field}.length") - [ -n "${length}" ] || return 0 - [ "$length" -ge 1 ] || return 0 - - idx=1 - while [ $idx -le "$length" ]; do - item=$(modemmanager_get_field "${list}" "${field}.value\[$idx\]") - [ -n "${item}" ] && [ "${item}" != "--" ] && { - [ -n "${value}" ] && value="${value}, " - value="${value}${item}" - } - idx=$((idx + 1)) - done - - # nothing built? - [ -n "${value}" ] || return 2 - - # only print value if set - echo "${value}" - return 0 -} - -modemmanager_cleanup_connection() { - local modemstatus="$1" - - local bearercount idx bearerpath - - bearercount=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.length") - - # do nothing if no bearers reported - [ -n "${bearercount}" ] && [ "$bearercount" -ge 1 ] && { - # explicitly disconnect just in case - mmcli --modem="${device}" --simple-disconnect >/dev/null 2>&1 - # and remove all bearer objects, if any found - idx=1 - while [ $idx -le "$bearercount" ]; do - bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[$idx\]") - mmcli --modem "${device}" --delete-bearer="${bearerpath}" >/dev/null 2>&1 - idx=$((idx + 1)) - done - } -} - -modemmanager_connected_method_ppp_ipv4() { - local interface="$1" - local ttyname="$2" - local username="$3" - local password="$4" - local allowedauth="$5" - - # all auth types are allowed unless a user given list is given - local authopts - local pap=1 - local chap=1 - local mschap=1 - local mschapv2=1 - local eap=1 - - [ -n "$allowedauth" ] && { - pap=0 chap=0 mschap=0 mschapv2=0 eap=0 - for auth in $allowedauth; do - case $auth in - "pap") pap=1 ;; - "chap") chap=1 ;; - "mschap") mschap=1 ;; - "mschapv2") mschapv2=1 ;; - "eap") eap=1 ;; - *) ;; - esac - done - } - - [ $pap -eq 1 ] || append authopts "refuse-pap" - [ $chap -eq 1 ] || append authopts "refuse-chap" - [ $mschap -eq 1 ] || append authopts "refuse-mschap" - [ $mschapv2 -eq 1 ] || append authopts "refuse-mschap-v2" - [ $eap -eq 1 ] || append authopts "refuse-eap" - - proto_run_command "${interface}" /usr/sbin/pppd \ - "${ttyname}" \ - 115200 \ - nodetach \ - noaccomp \ - nobsdcomp \ - nopcomp \ - novj \ - noauth \ - $authopts \ - ${username:+ user $username} \ - ${password:+ password $password} \ - lcp-echo-failure 5 \ - lcp-echo-interval 15 \ - lock \ - crtscts \ - nodefaultroute \ - usepeerdns \ - ipparam "${interface}" \ - ip-up-script /lib/netifd/ppp-up \ - ip-down-script /lib/netifd/ppp-down -} - -modemmanager_disconnected_method_ppp_ipv4() { - local interface="$1" - - echo "running disconnection (ppp method)" - - [ -n "${ERROR}" ] && { - local errorstring - errorstring=$(ppp_exitcode_tostring "${ERROR}") - case "$ERROR" in - 0) - ;; - 2) - proto_notify_error "$interface" "$errorstring" - proto_block_restart "$interface" - ;; - *) - proto_notify_error "$interface" "$errorstring" - ;; - esac - } || echo "pppd result code not given" - - proto_kill_command "$interface" -} - -modemmanager_connected_method_dhcp_ipv4() { - local interface="$1" - local wwan="$2" - local metric="$3" - - proto_init_update "${wwan}" 1 - proto_set_keep 1 - proto_send_update "${interface}" - - json_init - json_add_string name "${interface}_4" - json_add_string ifname "@${interface}" - json_add_string proto "dhcp" - proto_add_dynamic_defaults - [ -n "$metric" ] && json_add_int metric "${metric}" - json_close_object - ubus call network add_dynamic "$(json_dump)" -} - -modemmanager_connected_method_static_ipv4() { - local interface="$1" - local wwan="$2" - local address="$3" - local prefix="$4" - local gateway="$5" - local mtu="$6" - local dns1="$7" - local dns2="$8" - local metric="$9" - - local mask="" - - [ -n "${address}" ] || { - proto_notify_error "${interface}" ADDRESS_MISSING - return - } - - [ -n "${prefix}" ] || { - proto_notify_error "${interface}" PREFIX_MISSING - return - } - mask=$(cdr2mask "${prefix}") - - [ -n "${mtu}" ] && /sbin/ip link set dev "${wwan}" mtu "${mtu}" - - proto_init_update "${wwan}" 1 - proto_set_keep 1 - echo "adding IPv4 address ${address}, netmask ${mask}" - proto_add_ipv4_address "${address}" "${mask}" - [ -n "${gateway}" ] && { - echo "adding default IPv4 route via ${gateway}" - proto_add_ipv4_route "0.0.0.0" "0" "${gateway}" "${address}" - } - [ -n "${dns1}" ] && { - echo "adding primary DNS at ${dns1}" - proto_add_dns_server "${dns1}" - } - [ -n "${dns2}" ] && { - echo "adding secondary DNS at ${dns2}" - proto_add_dns_server "${dns2}" - } - [ -n "$metric" ] && json_add_int metric "${metric}" - proto_send_update "${interface}" -} - -modemmanager_connected_method_dhcp_ipv6() { - local interface="$1" - local wwan="$2" - local metric="$3" - - proto_init_update "${wwan}" 1 - proto_set_keep 1 - proto_send_update "${interface}" - - json_init - json_add_string name "${interface}_6" - json_add_string ifname "@${interface}" - json_add_string proto "dhcpv6" - proto_add_dynamic_defaults - json_add_string extendprefix 1 # RFC 7278: Extend an IPv6 /64 Prefix to LAN - [ -n "$metric" ] && json_add_int metric "${metric}" - json_close_object - ubus call network add_dynamic "$(json_dump)" -} - -modemmanager_connected_method_static_ipv6() { - local interface="$1" - local wwan="$2" - local address="$3" - local prefix="$4" - local gateway="$5" - local mtu="$6" - local dns1="$7" - local dns2="$8" - local metric="$9" - - [ -n "${address}" ] || { - proto_notify_error "${interface}" ADDRESS_MISSING - return - } - - [ -n "${prefix}" ] || { - proto_notify_error "${interface}" PREFIX_MISSING - return - } - - [ -n "${mtu}" ] && /sbin/ip link set dev "${wwan}" mtu "${mtu}" - - proto_init_update "${wwan}" 1 - proto_set_keep 1 - echo "adding IPv6 address ${address}, prefix ${prefix}" - proto_add_ipv6_address "${address}" "128" - proto_add_ipv6_prefix "${address}/${prefix}" - [ -n "${gateway}" ] && { - echo "adding default IPv6 route via ${gateway}" - proto_add_ipv6_route "${gateway}" "128" - proto_add_ipv6_route "::0" "0" "${gateway}" "" "" "${address}/${prefix}" - } - [ -n "${dns1}" ] && { - echo "adding primary DNS at ${dns1}" - proto_add_dns_server "${dns1}" - } - [ -n "${dns2}" ] && { - echo "adding secondary DNS at ${dns2}" - proto_add_dns_server "${dns2}" - } - [ -n "$metric" ] && json_add_int metric "${metric}" - proto_send_update "${interface}" -} - -modemmanager_disconnected_method_common() { - local interface="$1" - - echo "running disconnection (common)" - proto_notify_error "${interface}" MM_DISCONNECT_IN_PROGRESS - - proto_init_update "*" 0 - proto_send_update "${interface}" -} - -proto_modemmanager_init_config() { - available=1 - no_device=1 - proto_config_add_string device - proto_config_add_string apn - proto_config_add_string 'allowedauth:list(string)' - proto_config_add_string username - proto_config_add_string password - proto_config_add_string pincode - proto_config_add_string iptype - proto_config_add_int signalrate - proto_config_add_boolean lowpower - proto_config_add_defaults -} - -proto_modemmanager_setup() { - local interface="$1" - - local modempath modemstatus bearercount bearerpath connectargs bearerstatus beareriface - local bearermethod_ipv4 bearermethod_ipv6 auth cliauth - local operatorname operatorid registration accesstech signalquality - - local device apn allowedauth username password pincode iptype metric signalrate - - local address prefix gateway mtu dns1 dns2 - - json_get_vars device apn allowedauth username password pincode iptype metric signalrate - - # validate sysfs path given in config - [ -n "${device}" ] || { - echo "No device specified" - proto_notify_error "${interface}" NO_DEVICE - proto_set_available "${interface}" 0 - return 1 - } - [ -e "${device}" ] || { - echo "Device not found in sysfs" - proto_set_available "${interface}" 0 - return 1 - } - - # validate that ModemManager is handling the modem at the sysfs path - modemstatus=$(mmcli --modem="${device}" --output-keyvalue) - modempath=$(modemmanager_get_field "${modemstatus}" "modem.dbus-path") - [ -n "${modempath}" ] || { - echo "Device not managed by ModemManager" - proto_notify_error "${interface}" DEVICE_NOT_MANAGED - proto_set_available "${interface}" 0 - return 1 - } - echo "modem available at ${modempath}" - - # always cleanup before attempting a new connection, just in case - modemmanager_cleanup_connection "${modemstatus}" - - # if allowedauth list given, build option string - for auth in $allowedauth; do - cliauth="${cliauth}${cliauth:+|}$auth" - done - - # setup connect args; APN mandatory (even if it may be empty) - echo "starting connection with apn '${apn}'..." - proto_notify_error "${interface}" MM_CONNECT_IN_PROGRESS - - connectargs="apn=${apn}${iptype:+,ip-type=${iptype}}${cliauth:+,allowed-auth=${cliauth}}${username:+,user=${username}}${password:+,password=${password}}${pincode:+,pin=${pincode}}" - mmcli --modem="${device}" --timeout 120 --simple-connect="${connectargs}" || { - proto_notify_error "${interface}" MM_CONNECT_FAILED - proto_block_restart "${interface}" - return 1 - } - - # check if Signal refresh rate is set - if [ -n "${signalrate}" ] && [ "${signalrate}" -eq "${signalrate}" ] 2>/dev/null; then - echo "setting signal refresh rate to ${signalrate} seconds" - mmcli --modem="${device}" --signal-setup="${signalrate}" - else - echo "signal refresh rate is not set" - fi - - # log additional useful information - modemstatus=$(mmcli --modem="${device}" --output-keyvalue) - operatorname=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.operator-name") - [ -n "${operatorname}" ] && echo "network operator name: ${operatorname}" - operatorid=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.operator-code") - [ -n "${operatorid}" ] && echo "network operator MCCMNC: ${operatorid}" - registration=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.registration-state") - [ -n "${registration}" ] && echo "registration type: ${registration}" - accesstech=$(modemmanager_get_multivalue_field "${modemstatus}" "modem.generic.access-technologies") - [ -n "${accesstech}" ] && echo "access technology: ${accesstech}" - signalquality=$(modemmanager_get_field "${modemstatus}" "modem.generic.signal-quality.value") - [ -n "${signalquality}" ] && echo "signal quality: ${signalquality}%" - - # we won't like it if there are more than one bearers, as that would mean the - # user manually created them, and that's unsupported by this proto - bearercount=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.length") - [ -n "${bearercount}" ] && [ "$bearercount" -eq 1 ] || { - proto_notify_error "${interface}" INVALID_BEARER_LIST - return 1 - } - - # load connected bearer information - bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[1\]") - bearerstatus=$(mmcli --bearer "${bearerpath}" --output-keyvalue) - - # load network interface and method information - beareriface=$(modemmanager_get_field "${bearerstatus}" "bearer.status.interface") - bearermethod_ipv4=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.method") - bearermethod_ipv6=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.method") - - # setup IPv4 - [ -n "${bearermethod_ipv4}" ] && { - echo "IPv4 connection setup required in interface ${interface}: ${bearermethod_ipv4}" - case "${bearermethod_ipv4}" in - "dhcp") - modemmanager_connected_method_dhcp_ipv4 "${interface}" "${beareriface}" "${metric}" - ;; - "static") - address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.address") - prefix=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.prefix") - gateway=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.gateway") - mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.mtu") - dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[1\]") - dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[2\]") - modemmanager_connected_method_static_ipv4 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}" - ;; - "ppp") - modemmanager_connected_method_ppp_ipv4 "${interface}" "${beareriface}" "${username}" "${password}" "${allowedauth}" - ;; - *) - proto_notify_error "${interface}" UNKNOWN_METHOD - return 1 - ;; - esac - } - - # setup IPv6 - # note: if using ipv4v6, both IPv4 and IPv6 settings will have the same MTU and metric values reported - [ -n "${bearermethod_ipv6}" ] && { - echo "IPv6 connection setup required in interface ${interface}: ${bearermethod_ipv6}" - case "${bearermethod_ipv6}" in - "dhcp") - modemmanager_connected_method_dhcp_ipv6 "${interface}" "${beareriface}" "${metric}" - ;; - "static") - address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.address") - prefix=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.prefix") - gateway=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.gateway") - mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.mtu") - dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[1\]") - dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[2\]") - modemmanager_connected_method_static_ipv6 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}" - ;; - "ppp") - proto_notify_error "${interface}" "unsupported method" - return 1 - ;; - *) - proto_notify_error "${interface}" UNKNOWN_METHOD - return 1 - ;; - esac - } - - return 0 -} - -proto_modemmanager_teardown() { - local interface="$1" - - local modemstatus bearerpath errorstring - local bearermethod_ipv4 bearermethod_ipv6 - - local device lowpower iptype - json_get_vars device lowpower iptype - - echo "stopping network" - proto_notify_error "${interface}" MM_TEARDOWN_IN_PROGRESS - - # load connected bearer information, just the first one should be ok - modemstatus=$(mmcli --modem="${device}" --output-keyvalue) - bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[1\]") - [ -n "${bearerpath}" ] || { - echo "couldn't load bearer path" - return - } - - # load bearer connection methods - bearerstatus=$(mmcli --bearer "${bearerpath}" --output-keyvalue) - bearermethod_ipv4=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.method") - [ -n "${bearermethod_ipv4}" ] && - echo "IPv4 connection teardown required in interface ${interface}: ${bearermethod_ipv4}" - bearermethod_ipv6=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.method") - [ -n "${bearermethod_ipv6}" ] && - echo "IPv6 connection teardown required in interface ${interface}: ${bearermethod_ipv6}" - - # disconnection handling only requires special treatment in IPv4/PPP - [ "${bearermethod_ipv4}" = "ppp" ] && modemmanager_disconnected_method_ppp_ipv4 "${interface}" - modemmanager_disconnected_method_common "${interface}" - - # disconnect - mmcli --modem="${device}" --simple-disconnect || - proto_notify_error "${interface}" DISCONNECT_FAILED - - # disable - mmcli --modem="${device}" --disable - proto_notify_error "${interface}" MM_MODEM_DISABLED - - # low power, only if requested - [ "${lowpower:-0}" -lt 1 ] || - mmcli --modem="${device}" --set-power-state-low -} - -[ -n "$INCLUDE_ONLY" ] || { - add_protocol modemmanager -} diff --git a/package/network/utils/modemmanager/patches/001-plugins-Fix-port-enums-includes.patch b/package/network/utils/modemmanager/patches/001-plugins-Fix-port-enums-includes.patch deleted file mode 100644 index 0b54cb22dc..0000000000 --- a/package/network/utils/modemmanager/patches/001-plugins-Fix-port-enums-includes.patch +++ /dev/null @@ -1,88 +0,0 @@ ---- a/plugins/broadmobi/mm-plugin-broadmobi.c -+++ b/plugins/broadmobi/mm-plugin-broadmobi.c -@@ -19,7 +19,6 @@ - #define _LIBMM_INSIDE_MM - #include - --#include "mm-port-enums-types.h" - #include "mm-log-object.h" - #include "mm-plugin-broadmobi.h" - #include "mm-broadband-modem.h" ---- a/plugins/dlink/mm-plugin-dlink.c -+++ b/plugins/dlink/mm-plugin-dlink.c -@@ -19,7 +19,6 @@ - #define _LIBMM_INSIDE_MM - #include - --#include "mm-port-enums-types.h" - #include "mm-log-object.h" - #include "mm-plugin-dlink.h" - #include "mm-broadband-modem.h" ---- a/plugins/meson.build -+++ b/plugins/meson.build -@@ -461,7 +461,7 @@ if plugins_options['huawei'] - plugins += {'plugin-huawei': { - 'plugin': true, - 'helper': {'sources': files('huawei/mm-modem-helpers-huawei.c'), 'include_directories': plugins_incs + [huawei_inc], 'c_args': common_c_args + ['-DMM_MODULE_NAME="huawei"']}, -- 'module': {'sources': sources + enums_sources, 'include_directories': plugins_incs + [huawei_inc], 'c_args': common_c_args + ['-DMM_MODULE_NAME="huawei"']}, -+ 'module': {'sources': sources + enums_sources + port_enums_sources, 'include_directories': plugins_incs + [huawei_inc], 'c_args': common_c_args + ['-DMM_MODULE_NAME="huawei"']}, - 'test': {'sources': files('huawei/tests/test-modem-helpers-huawei.c') + enums_sources, 'include_directories': huawei_inc, 'dependencies': libhelpers_dep}, - }} - ---- a/plugins/telit/mm-plugin-telit.c -+++ b/plugins/telit/mm-plugin-telit.c -@@ -21,7 +21,6 @@ - #define _LIBMM_INSIDE_MM - #include - --#include "mm-port-enums-types.h" - #include "mm-log-object.h" - #include "mm-modem-helpers.h" - #include "mm-plugin-telit.h" ---- a/plugins/tplink/mm-plugin-tplink.c -+++ b/plugins/tplink/mm-plugin-tplink.c -@@ -19,7 +19,6 @@ - #define _LIBMM_INSIDE_MM - #include - --#include "mm-port-enums-types.h" - #include "mm-log-object.h" - #include "mm-plugin-tplink.h" - #include "mm-broadband-modem.h" ---- a/src/meson.build -+++ b/src/meson.build -@@ -147,15 +147,15 @@ endif - - enums_types = 'mm-port-enums-types' - --enums_sources = [] --enums_sources += gnome.mkenums( -+port_enums_sources = [] -+port_enums_sources += gnome.mkenums( - enums_types + '.c', - sources: headers, - c_template: build_aux_dir / enums_types + '.c.template', - fhead: '#include "mm-port-enums-types.h"', - ) - --enums_sources += gnome.mkenums( -+port_enums_sources += gnome.mkenums( - enums_types + '.h', - sources: headers, - h_template: build_aux_dir / enums_types + '.h.template', -@@ -165,13 +165,13 @@ enums_sources += gnome.mkenums( - - libport = static_library( - 'port', -- sources: sources + enums_sources, -+ sources: sources + port_enums_sources, - include_directories: top_inc, - dependencies: deps + private_deps, - ) - - libport_dep = declare_dependency( -- sources: enums_sources[1], -+ sources: port_enums_sources[1], - include_directories: '.', - dependencies: deps, - link_with: libport, diff --git a/package/network/utils/modemmanager/patches/002-build-meson-Fix-daemon-enums-dependencies.patch b/package/network/utils/modemmanager/patches/002-build-meson-Fix-daemon-enums-dependencies.patch deleted file mode 100644 index 8ca5cb835e..0000000000 --- a/package/network/utils/modemmanager/patches/002-build-meson-Fix-daemon-enums-dependencies.patch +++ /dev/null @@ -1,96 +0,0 @@ ---- a/plugins/meson.build -+++ b/plugins/meson.build -@@ -88,7 +88,7 @@ if plugins_shared['icera'] - plugins += {'shared-icera': { - 'plugin': false, - 'helper': {'sources': files('icera/mm-modem-helpers-icera.c'), 'include_directories': plugins_incs, 'c_args': common_c_args}, -- 'module': {'sources': sources, 'include_directories': plugins_incs, 'c_args': common_c_args}, -+ 'module': {'sources': sources + daemon_enums_sources, 'include_directories': plugins_incs, 'c_args': common_c_args}, - 'test': {'sources': files('icera/tests/test-modem-helpers-icera.c'), 'include_directories': plugins_incs + [icera_inc], 'dependencies': libhelpers_dep}, - }} - endif -@@ -185,7 +185,7 @@ if plugins_shared['telit'] - plugins += {'shared-telit': { - 'plugin': false, - 'helper': {'sources': files('telit/mm-modem-helpers-telit.c'), 'include_directories': plugins_incs, 'c_args': common_c_args}, -- 'module': {'sources': sources, 'include_directories': plugins_incs + [telit_inc], 'c_args': common_c_args}, -+ 'module': {'sources': sources + daemon_enums_sources, 'include_directories': plugins_incs + [telit_inc], 'c_args': common_c_args}, - 'test': {'sources': files('telit/tests/test-mm-modem-helpers-telit.c'), 'include_directories': telit_inc, 'dependencies': libmm_test_common_dep}, - }} - endif -@@ -285,7 +285,7 @@ if plugins_options['cinterion'] - plugins += {'plugin-cinterion': { - 'plugin': true, - 'helper': {'sources': files('cinterion/mm-modem-helpers-cinterion.c'), 'include_directories': plugins_incs, 'c_args': common_c_args}, -- 'module': {'sources': sources, 'include_directories': plugins_incs, 'c_args': common_c_args}, -+ 'module': {'sources': sources + daemon_enums_sources, 'include_directories': plugins_incs, 'c_args': common_c_args}, - 'test': {'sources': files('cinterion/tests/test-modem-helpers-cinterion.c'), 'include_directories': plugins_incs + [include_directories('cinterion')], 'dependencies': libport_dep}, - }} - -@@ -460,8 +460,8 @@ if plugins_options['huawei'] - - plugins += {'plugin-huawei': { - 'plugin': true, -- 'helper': {'sources': files('huawei/mm-modem-helpers-huawei.c'), 'include_directories': plugins_incs + [huawei_inc], 'c_args': common_c_args + ['-DMM_MODULE_NAME="huawei"']}, -- 'module': {'sources': sources + enums_sources + port_enums_sources, 'include_directories': plugins_incs + [huawei_inc], 'c_args': common_c_args + ['-DMM_MODULE_NAME="huawei"']}, -+ 'helper': {'sources': files('huawei/mm-modem-helpers-huawei.c') + daemon_enums_sources, 'include_directories': plugins_incs + [huawei_inc], 'c_args': common_c_args + ['-DMM_MODULE_NAME="huawei"']}, -+ 'module': {'sources': sources + enums_sources + port_enums_sources + daemon_enums_sources, 'include_directories': plugins_incs + [huawei_inc], 'c_args': common_c_args + ['-DMM_MODULE_NAME="huawei"']}, - 'test': {'sources': files('huawei/tests/test-modem-helpers-huawei.c') + enums_sources, 'include_directories': huawei_inc, 'dependencies': libhelpers_dep}, - }} - -@@ -534,7 +534,7 @@ if plugins_options['mbm'] - plugins += {'plugin-ericsson-mbm': { - 'plugin': true, - 'helper': {'sources': files('mbm/mm-modem-helpers-mbm.c'), 'include_directories': plugins_incs, 'c_args': common_c_args + ['-DMM_MODULE_NAME="ericsson-mbm"']}, -- 'module': {'sources': sources, 'include_directories': plugins_incs, 'c_args': common_c_args + ['-DMM_MODULE_NAME="ericsson-mbm"']}, -+ 'module': {'sources': sources + daemon_enums_sources, 'include_directories': plugins_incs, 'c_args': common_c_args + ['-DMM_MODULE_NAME="ericsson-mbm"']}, - 'test': {'sources': files('mbm/tests/test-modem-helpers-mbm.c'), 'include_directories': plugins_incs + [include_directories('mbm')], 'dependencies': libhelpers_dep}, - }} - -@@ -644,7 +644,7 @@ if plugins_options['option-hso'] - - plugins += {'plugin-option-hso': { - 'plugin': true, -- 'module': {'sources': sources, 'include_directories': plugins_incs, 'c_args': '-DMM_MODULE_NAME="option-hso"'}, -+ 'module': {'sources': sources + daemon_enums_sources, 'include_directories': plugins_incs, 'c_args': '-DMM_MODULE_NAME="option-hso"'}, - }} - endif - -@@ -852,7 +852,7 @@ if plugins_options['ublox'] - plugins += {'plugin-ublox': { - 'plugin': true, - 'helper': {'sources': files('ublox/mm-modem-helpers-ublox.c'), 'include_directories': plugins_incs, 'c_args': common_c_args}, -- 'module': {'sources': sources, 'include_directories': plugins_incs + [ublox_inc], 'c_args': common_c_args}, -+ 'module': {'sources': sources + daemon_enums_sources, 'include_directories': plugins_incs + [ublox_inc], 'c_args': common_c_args}, - 'test': {'sources': files('ublox/tests/test-modem-helpers-ublox.c'), 'include_directories': ublox_inc, 'dependencies': libmm_test_common_dep}, - }} - ---- a/src/meson.build -+++ b/src/meson.build -@@ -225,14 +225,15 @@ sources = files( - - enums_types = 'mm-daemon-enums-types' - --sources += gnome.mkenums( -+daemon_enums_sources = [] -+daemon_enums_sources += gnome.mkenums( - enums_types + '.c', - sources: headers, - c_template: build_aux_dir / enums_types + '.c.template', - fhead: '#include "mm-daemon-enums-types.h"', - ) - --sources += gnome.mkenums( -+daemon_enums_sources += gnome.mkenums( - enums_types + '.h', - sources: headers, - h_template: build_aux_dir / enums_types + '.h.template', -@@ -296,7 +297,7 @@ endif - - executable( - 'ModemManager', -- sources: sources, -+ sources: sources + daemon_enums_sources, - include_directories: top_inc, - dependencies: deps, - c_args: c_args, diff --git a/package/network/utils/net-snmp/Makefile b/package/network/utils/net-snmp/Makefile deleted file mode 100644 index 6205736cbc..0000000000 --- a/package/network/utils/net-snmp/Makefile +++ /dev/null @@ -1,291 +0,0 @@ -# -# Copyright (C) 2006-2017 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=net-snmp -PKG_VERSION:=5.9.1 -PKG_RELEASE:=$(AUTORELEASE) - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=@SF/net-snmp -PKG_HASH:=eb7fd4a44de6cddbffd9a92a85ad1309e5c1054fb9d5a7dd93079c8953f48c3f -PKG_MAINTAINER:=Stijn Tintel -PKG_LICENSE:=MIT BSD-3-Clause-Clear -PKG_CPE_ID:=cpe:/a:net-snmp:net-snmp - -PKG_FIXUP:=autoreconf - -include $(INCLUDE_DIR)/package.mk - -define Package/net-snmp/Default - SECTION:=net - CATEGORY:=Network - URL:=http://www.net-snmp.org/ -endef - -define Package/net-snmp/Default/description - Simple Network Management Protocol (SNMP) is a widely used protocol for - monitoring the health and welfare of network equipment (eg. routers), - computer equipment and even devices like UPSs. Net-SNMP is a suite of - applications used to implement SNMP v1, SNMP v2c and SNMP v3 using both - IPv4 and IPv6. -endef - - -define Package/libnetsnmp -$(call Package/net-snmp/Default) - SECTION:=libs - CATEGORY:=Libraries - DEPENDS:=+libnl-tiny +libpci +libpcre - TITLE:=Open source SNMP implementation (libraries) -endef - -define Package/libnetsnmp/description -$(call Package/net-snmp/Default/description) - . - This package contains shared libraries, needed by other programs. -endef - - -define Package/snmp-mibs -$(call Package/net-snmp/Default) - TITLE:=Open source SNMP implementation (MIB-files) -endef - -define Package/snmp-mibs/description -$(call Package/net-snmp/Default/description) - . - This package contains SNMP MIB-Files. -endef - - -define Package/snmp-utils -$(call Package/net-snmp/Default) - DEPENDS:=+libnetsnmp - TITLE:=Open source SNMP implementation (utilities) -endef - -define Package/snmp-utils/description -$(call Package/net-snmp/Default/description) - . - This package contains SNMP client utilities: - - snmpget - - snmpset - - snmpstatus - - snmptest - - snmptrap - - snmpwalk -endef - - -define Package/snmpd -$(call Package/net-snmp/Default) - DEPENDS:=+libnetsnmp - TITLE:=Open source SNMP implementation (daemon) -endef - -define Package/snmpd/description -$(call Package/net-snmp/Default/description) - . - This package contains the SNMP agent, dynamically linked. -endef - - -define Package/snmpd-static -$(call Package/net-snmp/Default) - DEPENDS:=+snmpd - TITLE:=Open source SNMP implementation (daemon) - BUILDONLY:=1 -endef - - -define Package/snmptrapd -$(call Package/net-snmp/Default) - DEPENDS:=+libnetsnmp - TITLE:=Open source SNMP implementation (notification receiver) -endef - -define Package/snmptrapd/description -$(call Package/net-snmp/Default/description) - . - This package contains the SNMP notification receiver. -endef - - -SNMP_MIB_MODULES_INCLUDED = \ - agent/extend \ - agentx \ - host/hr_device \ - host/hr_disk \ - host/hr_filesys \ - host/hr_network \ - host/hr_partition \ - host/hr_proc \ - host/hr_storage \ - host/hr_system \ - ieee802dot11 \ - if-mib/ifXTable \ - ip-mib/inetNetToMediaTable \ - mibII/at \ - mibII/icmp \ - mibII/ifTable \ - mibII/ip \ - mibII/snmp_mib \ - mibII/sysORTable \ - mibII/system_mib \ - mibII/tcp \ - mibII/udp \ - mibII/vacm_context \ - mibII/vacm_vars \ - snmpv3/snmpEngine \ - snmpv3/snmpMPDStats \ - snmpv3/usmConf \ - snmpv3/usmStats \ - snmpv3/usmUser \ - tunnel \ - ucd-snmp/disk \ - ucd-snmp/dlmod \ - ucd-snmp/extensible \ - ucd-snmp/loadave \ - ucd-snmp/memory \ - ucd-snmp/pass \ - ucd-snmp/pass_persist \ - ucd-snmp/proc \ - ucd-snmp/vmstat \ - util_funcs \ - utilities/execute \ - -SNMP_MIB_MODULES_EXCLUDED = \ - agent_mibs \ - disman/event \ - disman/schedule \ - hardware \ - host \ - if-mib \ - ip-mib \ - mibII \ - notification \ - notification-log-mib \ - snmpv3mibs \ - target \ - tcp-mib \ - ucd_snmp \ - udp-mib \ - utilities \ - -SNMP_TRANSPORTS_INCLUDED = Callback UDP Unix - -SNMP_TRANSPORTS_EXCLUDED = TCP TCPIPv6 - -TARGET_CFLAGS += $(FPIC) -TARGET_CPPFLAGS += -I$(STAGING_DIR)/usr/include/libnl-tiny - -CONFIGURE_ARGS += \ - --enable-mfd-rewrites \ - --enable-shared \ - --enable-static \ - --with-endianness=$(if $(CONFIG_BIG_ENDIAN),big,little) \ - --with-logfile=/var/log/snmpd.log \ - --with-persistent-directory=/usr/lib/snmp/ \ - --with-default-snmp-version=1 \ - --with-sys-contact=root@localhost \ - --with-sys-location=Unknown \ - --enable-applications \ - --disable-debugging \ - --disable-manuals \ - --disable-scripts \ - --with-out-mib-modules="$(SNMP_MIB_MODULES_EXCLUDED)" \ - --with-mib-modules="$(SNMP_MIB_MODULES_INCLUDED)" \ - --with-out-transports="$(SNMP_TRANSPORTS_EXCLUDED)" \ - --with-transports="$(SNMP_TRANSPORTS_INCLUDED)" \ - --without-openssl \ - --without-libwrap \ - --without-mysql \ - --without-rpm \ - --without-zlib \ - --with-nl \ - $(call autoconf_bool,CONFIG_IPV6,ipv6) \ - --disable-perl-cc-checks \ - --disable-embedded-perl \ - --without-perl-modules - -CONFIGURE_VARS += \ - ac_cv_header_netlink_netlink_h=yes \ - netsnmp_cv_func_nl_connect_LIBS=-lnl-tiny \ - -ifeq ($(CONFIG_IPV6),y) -SNMP_TRANSPORTS_INCLUDED+= UDPIPv6 -endif - -TARGET_LDFLAGS += -L$(TOOLCHAIN_DIR)/usr/lib - -define Build/Compile - $(MAKE) -C $(PKG_BUILD_DIR) \ - INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \ - LDFLAGS="$(TARGET_LDFLAGS) -lm -lc" \ - all install -endef - -define Build/InstallDev - $(INSTALL_DIR) $(2)/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/net-snmp-config $(2)/bin/ - $(SED) 's,=/usr,=$(STAGING_DIR)/usr,g' $(2)/bin/net-snmp-config - $(INSTALL_DIR) $(STAGING_DIR)/usr/bin - $(LN) $(STAGING_DIR)/host/bin/net-snmp-config $(STAGING_DIR)/usr/bin/ - - $(INSTALL_DIR) $(1)/usr/include - $(CP) $(PKG_INSTALL_DIR)/usr/include/net-snmp $(1)/usr/include/ - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnetsnmp{,agent,helpers,mibs}.{a,so*} $(1)/usr/lib/ -endef - -define Package/libnetsnmp/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnetsnmp{,agent,helpers,mibs}.so.* $(1)/usr/lib/ -endef - -define Package/snmp-mibs/install - $(INSTALL_DIR) $(1)/usr/share/snmp/mibs - $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/snmp/mibs/* $(1)/usr/share/snmp/mibs/ -endef - -define Package/snmp-utils/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/snmp{get,set,status,test,trap,walk} $(1)/usr/bin/ -endef - -define Package/snmpd/conffiles -/etc/config/snmpd -endef - -define Package/snmpd/install - $(INSTALL_DIR) $(1)/etc/config - $(INSTALL_DATA) ./files/snmpd.conf $(1)/etc/config/snmpd - $(INSTALL_DIR) $(1)/etc/snmp - $(LN) /var/run/snmpd.conf $(1)/etc/snmp/ - $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) ./files/snmpd.init $(1)/etc/init.d/snmpd - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/snmpd $(1)/usr/sbin/snmpd -endef - -define Package/snmptrapd/install - $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) ./files/snmptrapd.init $(1)/etc/init.d/snmptrapd - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnetsnmptrapd.so.* $(1)/usr/lib/ - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/snmptrapd $(1)/usr/sbin/ -endef - -$(eval $(call BuildPackage,libnetsnmp)) -$(eval $(call BuildPackage,snmp-mibs)) -$(eval $(call BuildPackage,snmp-utils)) -$(eval $(call BuildPackage,snmpd)) -$(eval $(call BuildPackage,snmpd-static)) -$(eval $(call BuildPackage,snmptrapd)) diff --git a/package/network/utils/net-snmp/files/snmpd.init b/package/network/utils/net-snmp/files/snmpd.init deleted file mode 100644 index 158871041c..0000000000 --- a/package/network/utils/net-snmp/files/snmpd.init +++ /dev/null @@ -1,359 +0,0 @@ -#!/bin/sh /etc/rc.common -# Copyright (C) 2008 OpenWrt.org -START=99 - -USE_PROCD=1 -PROG="/usr/sbin/snmpd" - -CONFIGFILE="/var/run/snmpd.conf" - -snmpd_agent_add() { - local cfg="$1" - - config_get agentaddress "$cfg" agentaddress - [ -n "$agentaddress" ] || return 0 - echo "agentaddress $agentaddress" >> $CONFIGFILE -} - -snmpd_agentx_add() { - local cfg="$1" - echo "master agentx" >> $CONFIGFILE - config_get agentxsocket "$cfg" agentxsocket - [ -n "$agentxsocket" ] && echo "agentXSocket $agentxsocket" >> $CONFIGFILE -} - -snmpd_system_add() { - local cfg="$1" - config_get syslocation "$cfg" sysLocation - [ -n "$syslocation" ] && echo "sysLocation $syslocation" >> $CONFIGFILE - config_get syscontact "$cfg" sysContact - [ -n "$syscontact" ] && echo "sysContact $syscontact" >> $CONFIGFILE - config_get sysname "$cfg" sysName - [ -n "$sysname" ] && echo "sysName $sysname" >> $CONFIGFILE - config_get sysservice "$cfg" sysService - [ -n "$sysservice" ] && echo "sysService $sysservice" >> $CONFIGFILE - config_get sysdescr "$cfg" sysDescr - [ -n "$sysdescr" ] && echo "sysDescr $sysdescr" >> $CONFIGFILE - config_get sysobjectid "$cfg" sysObjectID - [ -n "$sysobjectid" ] && echo "sysObjectID $sysobjectid" >> $CONFIGFILE -} - -snmpd_com2sec_add() { - local cfg="$1" - config_get secname "$cfg" secname - [ -n "$secname" ] || return 0 - config_get source "$cfg" source - [ -n "$source" ] || return 0 - config_get community "$cfg" community - [ -n "$community" ] || return 0 - echo "com2sec $secname $source $community" >> $CONFIGFILE -} - -snmpd_com2sec6_add() { - local cfg="$1" - config_get secname "$cfg" secname - [ -n "$secname" ] || return 0 - config_get source "$cfg" source - [ -n "$source" ] || return 0 - config_get community "$cfg" community - [ -n "$community" ] || return 0 - echo "com2sec6 $secname $source $community" >> $CONFIGFILE -} - -snmpd_group_add() { - local cfg="$1" - config_get group "$cfg" group - [ -n "$group" ] || return 0 - config_get version "$cfg" version - [ -n "$version" ] || return 0 - config_get secname "$cfg" secname - [ -n "$secname" ] || return 0 - echo "group $group $version $secname" >> $CONFIGFILE -} - -snmpd_view_add() { - local cfg="$1" - config_get viewname "$cfg" viewname - [ -n "$viewname" ] || return 0 - config_get type "$cfg" type - [ -n "$type" ] || return 0 - config_get oid "$cfg" oid - [ -n "$oid" ] || return 0 - # optional mask - config_get mask "$cfg" mask - echo "view $viewname $type $oid $mask" >> $CONFIGFILE -} - -snmpd_access_add() { - local cfg="$1" - config_get group "$cfg" group - [ -n "$group" ] || return 0 - config_get context "$cfg" context - [ -n $context ] || return 0 - [ "$context" == "none" ] && context='""' - config_get version "$cfg" version - [ -n "$version" ] || return 0 - config_get level "$cfg" level - [ -n "$level" ] || return 0 - config_get prefix "$cfg" prefix - [ -n "$prefix" ] || return 0 - config_get read "$cfg" read - [ -n "$read" ] || return 0 - config_get write "$cfg" write - [ -n "$write" ] || return 0 - config_get notify "$cfg" notify - [ -n "$notify" ] || return 0 - echo "access $group $context $version $level $prefix $read $write $notify" >> $CONFIGFILE -} - -snmpd_trap_hostname_add() { - local cfg="$1" - config_get hostname "$cfg" HostName - config_get port "$cfg" Port - config_get community "$cfg" Community - config_get type "$cfg" Type - echo "$type $hostname $community $port" >> $CONFIGFILE -} - -snmpd_trap_ip_add() { - local cfg="$1" - config_get host_ip "$cfg" HostIP - config_get port "$cfg" Port - config_get community "$cfg" Community - config_get type "$cfg" Type - echo "$type $host_ip $community $port" >> $CONFIGFILE -} - -snmpd_access_default_add() { - local cfg="$1" - config_get mode "$cfg" Mode - config_get community "$cfg" CommunityName - config_get oidrestrict "$cfg" RestrictOID - config_get oid "$cfg" RestrictedOID - echo -n "$mode $community default" >> $CONFIGFILE - [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE - [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE -} - -snmpd_access_HostName_add() { - local cfg="$1" - config_get hostname "$cfg" HostName - config_get mode "$cfg" Mode - config_get community "$cfg" CommunityName - config_get oidrestrict "$cfg" RestrictOID - config_get oid "$cfg" RestrictedOID - echo -n "$mode $community $hostname" >> $CONFIGFILE - [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE - [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE -} - -snmpd_access_HostIP_add() { - local cfg="$1" - config_get host_ip "$cfg" HostIP - config_get ip_mask "$cfg" IPMask - config_get mode "$cfg" Mode - config_get community "$cfg" CommunityName - config_get oidrestrict "$cfg" RestrictOID - config_get oid "$cfg" RestrictedOID - echo -n "$mode $community $host_ip/$ip_mask" >> $CONFIGFILE - [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE - [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE -} - -snmpd_pass_add() { - local cfg="$1" - local pass='pass' - - config_get miboid "$cfg" miboid - [ -n "$miboid" ] || return 0 - config_get prog "$cfg" prog - [ -n "$prog" ] || return 0 - config_get_bool persist "$cfg" persist 0 - [ $persist -ne 0 ] && pass='pass_persist' - config_get priority "$cfg" priority - priority=${priority:+-p $priority} - echo "$pass $priority $miboid $prog" >> $CONFIGFILE -} - -snmpd_exec_add() { - local cfg="$1" - - config_get name "$cfg" name - [ -n "$name" ] || return 0 - config_get prog "$cfg" prog - [ -n "$prog" ] || return 0 - config_get args "$cfg" args - config_get miboid "$cfg" miboid - echo "exec $miboid $name $prog $args" >> $CONFIGFILE -} - -snmpd_extend_add() { - local cfg="$1" - - config_get name "$cfg" name - [ -n "$name" ] || return 0 - config_get prog "$cfg" prog - [ -n "$prog" ] || return 0 - config_get args "$cfg" args - config_get miboid "$cfg" miboid - echo "extend $miboid $name $prog $args" >> $CONFIGFILE -} - -snmpd_disk_add() { - local cfg="$1" - local disk='disk' - - config_get partition "$cfg" partition - [ -n "$partition" ] || return 0 - config_get size "$cfg" size - [ -n "$size" ] || return 0 - echo "$disk $partition $size" >> $CONFIGFILE -} - -snmpd_engineid_add() { - local cfg="$1" - - config_get engineid "$cfg" engineid - [ -n "$engineid" ] && echo "engineID $engineid" >> $CONFIGFILE - config_get engineidtype "$cfg" engineidtype - [ "$engineidtype" -ge 1 -a "$engineidtype" -le 3 ] && \ - echo "engineIDType $engineidtype" >> $CONFIGFILE - config_get engineidnic "$cfg" engineidnic - [ -n "$engineidnic" ] && echo "engineIDNic $engineidnic" >> $CONFIGFILE -} - -snmpd_sink_add() { - local cfg="$1" - local section="$2" - local community - local port - local host - - config_get host "$cfg" host - [ -n "section" -a -n "$host" ] || return 0 - # optional community - config_get community "$cfg" community - # optional port - config_get port "$cfg" port - port=${port:+:$port} - echo "$section $host$port $community" >> $CONFIGFILE -} - -append_parm() { - local section="$1" - local option="$2" - local switch="$3" - local _loctmp - config_get _loctmp "$section" "$option" - [ -z "$_loctmp" ] && return 0 - echo "$switch $_loctmp" >> $CONFIGFILE -} - -append_authtrapenable() { - local section="$1" - local option="$2" - local switch="$3" - local _loctmp - config_get_bool _loctmp "$section" "$option" - [ -z "$_loctmp" ] && return 0 - [ "$_loctmp" -gt 0 ] && echo "$switch $_loctmp" >> $CONFIGFILE -} - -snmpd_setup_fw_rules() { - local net="$1" - local zone - - zone=$(fw3 -q network "$net" 2>/dev/null) - - local handled_zone - for handled_zone in $HANDLED_SNMP_ZONES; do - [ "$handled_zone" = "$zone" ] && return - done - - json_add_object "" - json_add_string type rule - json_add_string src "$zone" - json_add_string proto udp - json_add_string dest_port 161 - json_add_string target ACCEPT - json_close_object - - HANDLED_SNMP_ZONES="$HANDLED_SNMP_ZONES $zone" -} - -start_service() { - [ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE" - - config_load snmpd - - config_get_bool snmp_enabled general enabled 1 - [ "$snmp_enabled" -eq 0 ] && return - - procd_open_instance - - config_foreach snmpd_agent_add agent - config_foreach snmpd_agentx_add agentx - config_foreach snmpd_system_add system - config_foreach snmpd_com2sec_add com2sec - config_foreach snmpd_com2sec6_add com2sec6 - config_foreach snmpd_group_add group - config_foreach snmpd_view_add view - config_foreach snmpd_access_add access - config_foreach snmpd_trap_hostname_add trap_HostName - config_foreach snmpd_trap_ip_add trap_HostIP - config_foreach snmpd_access_default_add access_default - config_foreach snmpd_access_HostName_add access_HostName - config_foreach snmpd_access_HostIP_add access_HostIP - config_foreach snmpd_pass_add pass - config_foreach snmpd_exec_add exec - config_foreach snmpd_extend_add extend - config_foreach snmpd_disk_add disk - config_foreach snmpd_engineid_add engineid - append_parm trapcommunity community trapcommunity - config_foreach snmpd_sink_add trapsink trapsink - config_foreach snmpd_sink_add trap2sink trap2sink - config_foreach snmpd_sink_add informsink informsink - append_authtrapenable authtrapenable enable authtrapenable - append_parm v1trapaddress host v1trapaddress - append_parm trapsess trapsess trapsess - - procd_set_param command $PROG -Lf /dev/null -f -r - procd_set_param file $CONFIGFILE - procd_set_param respawn - - for iface in $(ls /sys/class/net 2>/dev/null); do - procd_append_param netdev "$iface" - done - - procd_open_data - - json_add_array firewall - config_list_foreach general network snmpd_setup_fw_rules - json_close_array - - procd_close_data - - procd_close_instance -} - -stop_service() { - [ -f "$CONFIGFILE" ] || return - rm -f "$CONFIGFILE" - procd_set_config_changed firewall -} - -service_triggers(){ - local script=$(readlink "$initscript") - local name=$(basename ${script:-$initscript}) - - procd_open_trigger - procd_add_raw_trigger "interface.*" 2000 /etc/init.d/$name reload - procd_close_trigger - - procd_add_reload_trigger 'snmpd' -} - -service_started() { - [ "$snmp_enabled" -eq 0 ] && return - procd_set_config_changed firewall -} diff --git a/package/network/utils/nftables/Makefile b/package/network/utils/nftables/Makefile index b9e896a9f7..3078f5605f 100644 --- a/package/network/utils/nftables/Makefile +++ b/package/network/utils/nftables/Makefile @@ -1,24 +1,27 @@ -# Copyright (C) 2015 OpenWrt.org +# SPDX-License-Identifier: GPL-2.0-only # -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. +# Copyright (C) 2015 OpenWrt.org # include $(TOPDIR)/rules.mk PKG_NAME:=nftables -PKG_VERSION:=1.0.2 -PKG_RELEASE:=2.1 +PKG_VERSION:=1.0.8 +PKG_RELEASE:=1 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://netfilter.org/projects/$(PKG_NAME)/files -PKG_HASH:=0b28a36ffcf4567b841de7bd3f37918b1fed27859eb48bdec51e1f7a83954c02 +PKG_HASH:=9373740de41a82dbc98818e0a46a073faeb8a8d0689fa4fa1a74399c32bf3d50 + PKG_MAINTAINER:= PKG_LICENSE:=GPL-2.0 +PKG_LICENSE_FILES:=COPYING PKG_FIXUP:=autoreconf PKG_INSTALL:=1 +PKG_BUILD_FLAGS:=lto + include $(INCLUDE_DIR)/package.mk DISABLE_NLS:= @@ -59,9 +62,6 @@ ifeq ($(BUILD_VARIANT),json) CONFIGURE_ARGS += --with-json endif -TARGET_CFLAGS += -flto -TARGET_LDFLAGS += -flto - define Build/InstallDev $(INSTALL_DIR) $(1)/usr/lib $(1)/usr/include $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/ diff --git a/package/network/utils/nftables/patches/0001-meta-don-t-use-non-POSIX-formats-in-strptime.patch b/package/network/utils/nftables/patches/0001-meta-don-t-use-non-POSIX-formats-in-strptime.patch deleted file mode 100644 index 12cac8cc06..0000000000 --- a/package/network/utils/nftables/patches/0001-meta-don-t-use-non-POSIX-formats-in-strptime.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 1af8aabccd65e11caa397c4706353075f623cd01 Mon Sep 17 00:00:00 2001 -From: Jo-Philipp Wich -Date: Mon, 8 Aug 2022 23:57:03 +0200 -Subject: [PATCH] meta: don't use non-POSIX formats in strptime() - -The current strptime() invocations in meta.c use the `%F` format which -is not specified by POSIX and thus unimplemented by some libc flavors -such as musl libc. - -Replace all occurrences of `%F` with an equivalent `%Y-%m-%d` format -in order to be able to properly parse user supplied dates in such -environments. - -Signed-off-by: Jo-Philipp Wich ---- - src/meta.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - ---- a/src/meta.c -+++ b/src/meta.c -@@ -399,7 +399,7 @@ static void date_type_print(const struct - tstamp += cur_tm->tm_gmtoff; - - if ((tm = gmtime((time_t *) &tstamp)) != NULL && -- strftime(timestr, sizeof(timestr) - 1, "%F %T", tm)) -+ strftime(timestr, sizeof(timestr) - 1, "%Y-%m-%d %T", tm)) - nft_print(octx, "\"%s\"", timestr); - else - nft_print(octx, "Error converting timestamp to printed time"); -@@ -412,11 +412,11 @@ static time_t parse_iso_date(const char - - memset(&tm, 0, sizeof(struct tm)); - -- if (strptime(sym, "%F %T", &tm)) -+ if (strptime(sym, "%Y-%m-%d %T", &tm)) - goto success; -- if (strptime(sym, "%F %R", &tm)) -+ if (strptime(sym, "%Y-%m-%d %R", &tm)) - goto success; -- if (strptime(sym, "%F", &tm)) -+ if (strptime(sym, "%Y-%m-%d", &tm)) - goto success; - - return -1; diff --git a/package/network/utils/nftables/patches/001-examples-compile-with-make-check.patch b/package/network/utils/nftables/patches/001-examples-compile-with-make-check.patch deleted file mode 100644 index 6a4430d86f..0000000000 --- a/package/network/utils/nftables/patches/001-examples-compile-with-make-check.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 18a08fb7f0443f8bde83393bd6f69e23a04246b3 Mon Sep 17 00:00:00 2001 -From: Pablo Neira Ayuso -Date: Tue, 22 Feb 2022 00:56:36 +0100 -Subject: examples: compile with `make check' and add AM_CPPFLAGS - -Compile examples via `make check' like libnftnl does. Use AM_CPPFLAGS to -specify local headers via -I. - -Unfortunately, `make distcheck' did not catch this compile time error in -my system, since it was using the nftables/libnftables.h file of the -previous nftables release. - -Fixes: 5b364657a35f ("build: missing SUBIRS update") -Fixes: caf2a6ad2d22 ("examples: add libnftables example program") -Signed-off-by: Pablo Neira Ayuso ---- - examples/Makefile.am | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - ---- a/examples/Makefile.am -+++ b/examples/Makefile.am -@@ -1,4 +1,6 @@ --noinst_PROGRAMS = nft-buffer \ -+check_PROGRAMS = nft-buffer \ - nft-json-file - -+AM_CPPFLAGS = -I$(top_srcdir)/include -+ - LDADD = $(top_builddir)/src/libnftables.la diff --git a/package/network/utils/rssileds/Makefile b/package/network/utils/rssileds/Makefile index 2282d8c5b1..5adc25e8d8 100644 --- a/package/network/utils/rssileds/Makefile +++ b/package/network/utils/rssileds/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=rssileds -PKG_RELEASE:=3 +PKG_RELEASE:=4 PKG_LICNESE:=GPL-2.0+ include $(INCLUDE_DIR)/package.mk diff --git a/package/network/utils/tcpdump/Makefile b/package/network/utils/tcpdump/Makefile index f14f86e9a3..d2e933a1a1 100644 --- a/package/network/utils/tcpdump/Makefile +++ b/package/network/utils/tcpdump/Makefile @@ -8,18 +8,19 @@ include $(TOPDIR)/rules.mk PKG_NAME:=tcpdump -PKG_VERSION:=4.9.3 -PKG_RELEASE:=4 +PKG_VERSION:=4.99.4 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=http://www.tcpdump.org/release/ -PKG_HASH:=2cd47cb3d460b6ff75f4a9940f594317ad456cfbf2bd2c8e5151e16559db6410 +PKG_SOURCE_URL:=https://www.tcpdump.org/release/ +PKG_HASH:=0232231bb2f29d6bf2426e70a08a7e0c63a0d59a9b44863b7f5e2357a6e49fea PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=BSD-3-Clause PKG_CPE_ID:=cpe:/a:tcpdump:tcpdump PKG_INSTALL:=1 +PKG_BUILD_FLAGS:=gc-sections PKG_BUILD_PARALLEL:=1 include $(INCLUDE_DIR)/package.mk @@ -48,9 +49,6 @@ CONFIGURE_ARGS += \ --without-crypto \ $(call autoconf_bool,CONFIG_IPV6,ipv6) -TARGET_CFLAGS += -ffunction-sections -fdata-sections -TARGET_LDFLAGS += -Wl,--gc-sections - ifeq ($(BUILD_VARIANT),mini) TARGET_CFLAGS += -DTCPDUMP_MINI CONFIGURE_ARGS += --disable-smb @@ -58,8 +56,8 @@ ifeq ($(BUILD_VARIANT),mini) endif define Package/tcpdump/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/tcpdump $(1)/usr/sbin/ + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/tcpdump $(1)/usr/bin/ endef Package/tcpdump-mini/install = $(Package/tcpdump/install) diff --git a/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch b/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch index 3da979dd35..1988587029 100644 --- a/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch +++ b/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch @@ -1,8 +1,8 @@ --- a/configure +++ b/configure -@@ -6183,97 +6183,6 @@ $as_echo "no" >&6; } - fi - fi +@@ -6568,97 +6568,6 @@ fi + + -# -# Check for special debugging functions diff --git a/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch b/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch index 17477d2799..8a014cabf0 100644 --- a/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch +++ b/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch @@ -1,13 +1,14 @@ --- a/Makefile.in +++ b/Makefile.in -@@ -72,6 +72,80 @@ DEPENDENCY_CFLAG = @DEPENDENCY_CFLAG@ +@@ -73,6 +73,86 @@ DEPENDENCY_CFLAG = @DEPENDENCY_CFLAG@ - CSRC = setsignal.c tcpdump.c + CSRC = fptype.c tcpdump.c +ifdef TCPDUMP_MINI + +LIBNETDISSECT_SRC=\ + netdissect.c \ ++ netdissect-alloc.c \ + addrtoname.c \ + addrtostr.c \ + af.c \ @@ -15,17 +16,18 @@ + checksum.c \ + cpack.c \ + gmpls.c \ -+ gmt2local.c \ + in_cksum.c \ + ipproto.c \ + l2vpn.c \ + machdep.c \ ++ ntp.c \ + nlpid.c \ + oui.c \ + parsenfsfh.c \ + print.c \ + print-802_11.c \ + print-aodv.c \ ++ print-arista.c \ + print-arp.c \ + print-ascii.c \ + print-bootp.c \ @@ -39,6 +41,7 @@ + print-icmp.c \ + print-icmp6.c \ + print-igmp.c \ ++ print-ip-demux.c \ + print-ip.c \ + print-ip6.c \ + print-ip6opts.c \ @@ -47,6 +50,7 @@ + print-llc.c \ + print-lldp.c \ + print-loopback.c \ ++ print-macsec.c \ + print-nfs.c \ + print-ntp.c \ + print-null.c \ @@ -72,6 +76,8 @@ + print-telnet.c \ + print-tftp.c \ + print-udp.c \ ++ print-unsupported.c \ ++ print-whois.c \ + signature.c \ + strtoaddr.c \ + util-print.c @@ -81,19 +87,19 @@ LIBNETDISSECT_SRC=\ addrtoname.c \ addrtostr.c \ -@@ -237,6 +311,8 @@ LIBNETDISSECT_SRC=\ +@@ -254,6 +334,8 @@ LIBNETDISSECT_SRC=\ strtoaddr.c \ util-print.c +endif + LOCALSRC = @LOCALSRC@ - GENSRC = version.c LIBOBJS = @LIBOBJS@ + --- a/addrtoname.c +++ b/addrtoname.c -@@ -578,8 +578,10 @@ linkaddr_string(netdissect_options *ndo, - if (type == LINKADDR_ETHER && len == ETHER_ADDR_LEN) +@@ -680,8 +680,10 @@ linkaddr_string(netdissect_options *ndo, + if (type == LINKADDR_ETHER && len == MAC_ADDR_LEN) return (etheraddr_string(ndo, ep)); +#ifndef TCPDUMP_MINI @@ -103,7 +109,7 @@ tp = lookup_bytestring(ndo, ep, len); if (tp->bs_name) -@@ -1214,6 +1216,7 @@ init_addrtoname(netdissect_options *ndo, +@@ -1260,6 +1262,7 @@ init_addrtoname(netdissect_options *ndo, init_ipxsaparray(ndo); } @@ -111,7 +117,7 @@ const char * dnaddr_string(netdissect_options *ndo, u_short dnaddr) { -@@ -1230,6 +1233,7 @@ dnaddr_string(netdissect_options *ndo, u +@@ -1276,6 +1279,7 @@ dnaddr_string(netdissect_options *ndo, u return(tp->name); } @@ -119,138 +125,45 @@ /* Return a zero'ed hnamemem struct and cuts down on calloc() overhead */ struct hnamemem * ---- a/print.c -+++ b/print.c -@@ -48,6 +48,7 @@ static const struct printer printers[] = - #ifdef DLT_IPNET - { ipnet_if_print, DLT_IPNET }, - #endif -+#ifndef TCPDUMP_MINI - #ifdef DLT_IEEE802_15_4 - { ieee802_15_4_if_print, DLT_IEEE802_15_4 }, - #endif -@@ -57,12 +58,14 @@ static const struct printer printers[] = - #ifdef DLT_PPI - { ppi_if_print, DLT_PPI }, - #endif -+#endif - #ifdef DLT_NETANALYZER - { netanalyzer_if_print, DLT_NETANALYZER }, - #endif - #ifdef DLT_NETANALYZER_TRANSPARENT - { netanalyzer_transparent_if_print, DLT_NETANALYZER_TRANSPARENT }, - #endif -+#ifndef TCPDUMP_MINI - #if defined(DLT_NFLOG) && defined(HAVE_PCAP_NFLOG_H) - { nflog_if_print, DLT_NFLOG}, - #endif -@@ -75,10 +78,12 @@ static const struct printer printers[] = - #ifdef DLT_IP_OVER_FC - { ipfc_if_print, DLT_IP_OVER_FC }, - #endif -+#endif - { null_if_print, DLT_NULL }, - #ifdef DLT_LOOP - { null_if_print, DLT_LOOP }, - #endif -+#ifndef TCPDUMP_MINI - #ifdef DLT_APPLE_IP_OVER_IEEE1394 - { ap1394_if_print, DLT_APPLE_IP_OVER_IEEE1394 }, - #endif -@@ -92,7 +97,9 @@ static const struct printer printers[] = - #ifdef DLT_ARCNET_LINUX - { arcnet_linux_if_print, DLT_ARCNET_LINUX }, - #endif -+#endif - { raw_if_print, DLT_RAW }, -+#ifndef TCPDUMP_MINI - #ifdef DLT_IPV4 - { raw_if_print, DLT_IPV4 }, - #endif -@@ -116,17 +123,21 @@ static const struct printer printers[] = - #ifdef DLT_HDLC - { chdlc_if_print, DLT_HDLC }, - #endif -+#endif - #ifdef DLT_PPP_ETHER - { pppoe_if_print, DLT_PPP_ETHER }, - #endif -+#ifndef TCPDUMP_MINI - #if defined(DLT_PFLOG) && defined(HAVE_NET_IF_PFLOG_H) - { pflog_if_print, DLT_PFLOG }, - #endif - { token_if_print, DLT_IEEE802 }, - { fddi_if_print, DLT_FDDI }, -+#endif - #ifdef DLT_LINUX_SLL - { sll_if_print, DLT_LINUX_SLL }, - #endif -+#ifndef TCPDUMP_MINI - #ifdef DLT_FR - { fr_if_print, DLT_FR }, - #endif -@@ -198,6 +209,7 @@ static const struct printer printers[] = - #ifdef DLT_PKTAP - { pktap_if_print, DLT_PKTAP }, - #endif -+#endif - #ifdef DLT_IEEE802_11_RADIO - { ieee802_11_radio_if_print, DLT_IEEE802_11_RADIO }, - #endif -@@ -214,12 +226,14 @@ static const struct printer printers[] = - #ifdef DLT_PPP_WITHDIRECTION - { ppp_if_print, DLT_PPP_WITHDIRECTION }, - #endif -+#ifndef TCPDUMP_MINI - #ifdef DLT_PPP_BSDOS - { ppp_bsdos_if_print, DLT_PPP_BSDOS }, - #endif - #ifdef DLT_PPP_SERIAL - { ppp_hdlc_if_print, DLT_PPP_SERIAL }, - #endif -+#endif - { NULL, 0 }, - }; - --- a/print-ether.c +++ b/print-ether.c -@@ -342,6 +342,7 @@ ethertype_print(netdissect_options *ndo, - arp_print(ndo, p, length, caplen); +@@ -545,6 +545,7 @@ ethertype_print(netdissect_options *ndo, + arp_print(ndo, p, length, caplen); return (1); +#ifndef TCPDUMP_MINI case ETHERTYPE_DN: decnet_print(ndo, p, length, caplen); return (1); -@@ -368,6 +369,7 @@ ethertype_print(netdissect_options *ndo, - } +@@ -575,6 +576,7 @@ ethertype_print(netdissect_options *ndo, + ND_TCHECK_LEN(p, 1); isoclns_print(ndo, p + 1, length - 1); return(1); +#endif case ETHERTYPE_PPPOED: case ETHERTYPE_PPPOES: -@@ -380,9 +382,11 @@ ethertype_print(netdissect_options *ndo, - eap_print(ndo, p, length); +@@ -587,9 +589,11 @@ ethertype_print(netdissect_options *ndo, + eapol_print(ndo, p); return (1); +#ifndef TCPDUMP_MINI - case ETHERTYPE_RRCP: - rrcp_print(ndo, p, length, src, dst); + case ETHERTYPE_REALTEK: + rtl_print(ndo, p, length, src, dst); return (1); +#endif case ETHERTYPE_PPP: if (length) { -@@ -391,6 +395,7 @@ ethertype_print(netdissect_options *ndo, +@@ -598,6 +602,7 @@ ethertype_print(netdissect_options *ndo, } return (1); +#ifndef TCPDUMP_MINI case ETHERTYPE_MPCP: - mpcp_print(ndo, p, length); + mpcp_print(ndo, p, length); return (1); -@@ -403,6 +408,7 @@ ethertype_print(netdissect_options *ndo, +@@ -610,19 +615,23 @@ ethertype_print(netdissect_options *ndo, case ETHERTYPE_CFM_OLD: cfm_print(ndo, p, length); return (1); @@ -258,17 +171,25 @@ case ETHERTYPE_LLDP: lldp_print(ndo, p, length); -@@ -412,6 +418,7 @@ ethertype_print(netdissect_options *ndo, + return (1); + ++#ifndef TCPDUMP_MINI + case ETHERTYPE_NSH: + nsh_print(ndo, p, length); + return (1); ++#endif + + case ETHERTYPE_LOOPBACK: loopback_print(ndo, p, length); - return (1); + return (1); +#ifndef TCPDUMP_MINI case ETHERTYPE_MPLS: case ETHERTYPE_MPLS_MULTI: mpls_print(ndo, p, length); -@@ -441,6 +448,7 @@ ethertype_print(netdissect_options *ndo, - case ETHERTYPE_MEDSA: - medsa_print(ndo, p, length, caplen, src, dst); +@@ -652,6 +661,7 @@ ethertype_print(netdissect_options *ndo, + case ETHERTYPE_PTP: + ptp_print(ndo, p, length); return (1); +#endif @@ -276,7 +197,7 @@ case ETHERTYPE_SCA: --- a/print-gre.c +++ b/print-gre.c -@@ -216,6 +216,7 @@ gre_print_0(netdissect_options *ndo, con +@@ -207,6 +207,7 @@ gre_print_0(netdissect_options *ndo, con case ETHERTYPE_IPV6: ip6_print(ndo, bp, len); break; @@ -284,104 +205,63 @@ case ETHERTYPE_MPLS: mpls_print(ndo, bp, len); break; -@@ -231,6 +232,7 @@ gre_print_0(netdissect_options *ndo, con +@@ -219,6 +220,7 @@ gre_print_0(netdissect_options *ndo, con + case ETHERTYPE_GRE_ISO: + isoclns_print(ndo, bp, len); + break; ++#endif case ETHERTYPE_TEB: - ether_print(ndo, bp, len, ndo->ndo_snapend - bp, NULL, NULL); + ether_print(ndo, bp, len, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL); break; +--- a/print-icmp6.c ++++ b/print-icmp6.c +@@ -1371,7 +1371,7 @@ get_upperlayer(netdissect_options *ndo, + nh = GET_U_1(fragh->ip6f_nxt); + hlen = sizeof(struct ip6_frag); + break; +- ++#ifndef TCPDUMP_MINI + case IPPROTO_AH: + ah = (const struct ah *)bp; + if (!ND_TTEST_1(ah->ah_len)) +@@ -1379,7 +1379,7 @@ get_upperlayer(netdissect_options *ndo, + nh = GET_U_1(ah->ah_nxt); + hlen = (GET_U_1(ah->ah_len) + 2) << 2; + break; +- +#endif - default: - ND_PRINT((ndo, "gre-proto-0x%x", prot)); - } + default: /* unknown or undecodable header */ + *prot = nh; /* meaningless, but set here anyway */ + return(NULL); --- a/print-igmp.c +++ b/print-igmp.c -@@ -306,6 +306,7 @@ igmp_print(netdissect_options *ndo, - ND_TCHECK2(bp[4], 4); - ND_PRINT((ndo, "igmp leave %s", ipaddr_string(ndo, &bp[4]))); +@@ -269,6 +269,7 @@ igmp_print(netdissect_options *ndo, + case 0x17: + ND_PRINT("igmp leave %s", GET_IPADDR_STRING(bp + 4)); break; +#ifndef TCPDUMP_MINI case 0x13: - ND_PRINT((ndo, "igmp dvmrp")); + ND_PRINT("igmp dvmrp"); if (len < 8) -@@ -317,6 +318,7 @@ igmp_print(netdissect_options *ndo, - ND_PRINT((ndo, "igmp pimv1")); +@@ -280,6 +281,7 @@ igmp_print(netdissect_options *ndo, + ND_PRINT("igmp pimv1"); pimv1_print(ndo, bp, len); break; +#endif case 0x1e: - print_mresp(ndo, bp, len); + print_mtrace(ndo, "mresp", bp, len); break; ---- a/print-ip6.c -+++ b/print-ip6.c -@@ -305,6 +305,7 @@ ip6_print(netdissect_options *ndo, const - return; - nh = *cp; - break; -+#ifndef TCPDUMP_MINI - case IPPROTO_FRAGMENT: - advance = frag6_print(ndo, cp, (const u_char *)ip6); - if (advance < 0 || ndo->ndo_snapend <= cp + advance) -@@ -328,6 +329,7 @@ ip6_print(netdissect_options *ndo, const - return; - nh = *cp; - return; -+#endif - case IPPROTO_ROUTING: - ND_TCHECK(*cp); - advance = rt6_print(ndo, cp, (const u_char *)ip6); -@@ -335,12 +337,14 @@ ip6_print(netdissect_options *ndo, const - return; - nh = *cp; - break; -+#ifndef TCPDUMP_MINI - case IPPROTO_SCTP: - sctp_print(ndo, cp, (const u_char *)ip6, len); - return; - case IPPROTO_DCCP: - dccp_print(ndo, cp, (const u_char *)ip6, len); - return; -+#endif - case IPPROTO_TCP: - tcp_print(ndo, cp, len, (const u_char *)ip6, fragmented); - return; -@@ -350,6 +354,7 @@ ip6_print(netdissect_options *ndo, const - case IPPROTO_ICMPV6: - icmp6_print(ndo, cp, len, (const u_char *)ip6, fragmented); - return; -+#ifndef TCPDUMP_MINI - case IPPROTO_AH: - advance = ah_print(ndo, cp); - if (advance < 0) -@@ -382,6 +387,7 @@ ip6_print(netdissect_options *ndo, const - case IPPROTO_PIM: - pim_print(ndo, cp, len, (const u_char *)ip6); - return; -+#endif - - case IPPROTO_OSPF: - ospf6_print(ndo, cp, len); -@@ -395,9 +401,11 @@ ip6_print(netdissect_options *ndo, const - ip_print(ndo, cp, len); - return; - -+#ifndef TCPDUMP_MINI - case IPPROTO_PGM: - pgm_print(ndo, cp, len, (const u_char *)ip6); - return; -+#endif - - case IPPROTO_GRE: - gre_print(ndo, cp, len); ---- a/print-ip.c -+++ b/print-ip.c -@@ -344,6 +344,7 @@ ip_print_demux(netdissect_options *ndo, +--- a/print-ip-demux.c ++++ b/print-ip-demux.c +@@ -48,6 +48,7 @@ ip_demux_print(netdissect_options *ndo, again: - switch (ipds->nh) { + switch (nh) { +#ifndef TCPDUMP_MINI case IPPROTO_AH: - if (!ND_TTEST(*ipds->cp)) { - ND_PRINT((ndo, "[|AH]")); -@@ -382,7 +383,9 @@ again: + if (!ND_TTEST_1(bp)) { + ndo->ndo_protocol = "ah"; +@@ -85,7 +86,9 @@ again: */ break; } @@ -389,61 +269,94 @@ +#ifndef TCPDUMP_MINI case IPPROTO_SCTP: - sctp_print(ndo, ipds->cp, (const u_char *)ipds->ip, ipds->len); + sctp_print(ndo, bp, iph, length); break; -@@ -390,6 +393,7 @@ again: +@@ -93,7 +96,7 @@ again: case IPPROTO_DCCP: - dccp_print(ndo, ipds->cp, (const u_char *)ipds->ip, ipds->len); + dccp_print(ndo, bp, iph, length); break; +- +#endif - case IPPROTO_TCP: - /* pass on the MF bit plus the offset to detect fragments */ -@@ -409,6 +413,7 @@ again: - ipds->off & (IP_MF|IP_OFFMASK)); + tcp_print(ndo, bp, length, iph, fragmented); + break; +@@ -122,6 +125,7 @@ again: + } break; +#ifndef TCPDUMP_MINI case IPPROTO_PIGP: /* * XXX - the current IANA protocol number assignments -@@ -429,14 +434,17 @@ again: +@@ -142,14 +146,17 @@ again: case IPPROTO_EIGRP: - eigrp_print(ndo, ipds->cp, ipds->len); + eigrp_print(ndo, bp, length); break; +#endif case IPPROTO_ND: - ND_PRINT((ndo, " nd %d", ipds->len)); + ND_PRINT(" nd %u", length); break; +#ifndef TCPDUMP_MINI case IPPROTO_EGP: - egp_print(ndo, ipds->cp, ipds->len); + egp_print(ndo, bp, length); break; +#endif case IPPROTO_OSPF: - ospf_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip); -@@ -469,6 +477,7 @@ again: - gre_print(ndo, ipds->cp, ipds->len); + if (ver == 6) +@@ -186,6 +193,7 @@ again: + gre_print(ndo, bp, length); break; +#ifndef TCPDUMP_MINI case IPPROTO_MOBILE: - mobile_print(ndo, ipds->cp, ipds->len); + mobile_print(ndo, bp, length); break; -@@ -497,6 +506,7 @@ again: +@@ -205,6 +213,7 @@ again: case IPPROTO_PGM: - pgm_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip); + pgm_print(ndo, bp, length, iph); break; +#endif - default: - if (ndo->ndo_nflag==0 && (p_name = netdb_protoname(ipds->nh)) != NULL) + case IPPROTO_ETHERNET: + if (ver == 6) +--- a/print-ip6.c ++++ b/print-ip6.c +@@ -135,10 +135,11 @@ ip6_finddst(netdissect_options *ndo, nd_ + * Only one routing header to a customer. + */ + goto done; +- ++#ifndef TCPDUMP_MINI + case IPPROTO_AH: + case IPPROTO_ESP: + case IPPROTO_IPCOMP: ++#endif + default: + /* + * AH and ESP are, in the RFCs that describe them, +@@ -375,6 +376,7 @@ ip6_print(netdissect_options *ndo, const + nh = GET_U_1(cp); + break; + ++#ifndef TCPDUMP_MINI + case IPPROTO_FRAGMENT: + advance = frag6_print(ndo, cp, (const u_char *)ip6); + if (advance < 0 || ndo->ndo_snapend <= cp + advance) { +@@ -405,7 +407,7 @@ ip6_print(netdissect_options *ndo, const + nh = GET_U_1(cp); + nd_pop_packet_info(ndo); + return; +- ++#endif + case IPPROTO_ROUTING: + ND_TCHECK_1(cp); + advance = rt6_print(ndo, cp, (const u_char *)ip6); --- a/print-llc.c +++ b/print-llc.c -@@ -206,6 +206,7 @@ llc_print(netdissect_options *ndo, const +@@ -207,6 +207,7 @@ llc_print(netdissect_options *ndo, const hdrlen = 4; /* DSAP, SSAP, 2-byte control field */ } @@ -451,7 +364,7 @@ if (ssap_field == LLCSAP_GLOBAL && dsap_field == LLCSAP_GLOBAL) { /* * This is an Ethernet_802.3 IPX frame; it has an -@@ -228,6 +229,7 @@ llc_print(netdissect_options *ndo, const +@@ -229,6 +230,7 @@ llc_print(netdissect_options *ndo, const ipx_print(ndo, p, length); return (0); /* no LLC header */ } @@ -459,7 +372,7 @@ dsap = dsap_field & ~LLC_IG; ssap = ssap_field & ~LLC_GSAP; -@@ -291,6 +293,7 @@ llc_print(netdissect_options *ndo, const +@@ -292,6 +294,7 @@ llc_print(netdissect_options *ndo, const return (hdrlen); } @@ -467,7 +380,7 @@ if (ssap == LLCSAP_IPX && dsap == LLCSAP_IPX && control == LLC_UI) { /* -@@ -304,6 +307,7 @@ llc_print(netdissect_options *ndo, const +@@ -305,6 +308,7 @@ llc_print(netdissect_options *ndo, const ipx_print(ndo, p, length); return (hdrlen); } @@ -475,7 +388,7 @@ #ifdef ENABLE_SMB if (ssap == LLCSAP_NETBEUI && dsap == LLCSAP_NETBEUI -@@ -322,12 +326,13 @@ llc_print(netdissect_options *ndo, const +@@ -323,12 +327,13 @@ llc_print(netdissect_options *ndo, const return (hdrlen); } #endif @@ -490,15 +403,15 @@ if (!ndo->ndo_eflag) { if (ssap == dsap) { if (src == NULL || dst == NULL) -@@ -480,6 +485,7 @@ snap_print(netdissect_options *ndo, cons +@@ -484,6 +489,7 @@ snap_print(netdissect_options *ndo, cons case OUI_CISCO: switch (et) { +#ifndef TCPDUMP_MINI case PID_CISCO_CDP: - cdp_print(ndo, p, length, caplen); + cdp_print(ndo, p, length); return (1); -@@ -492,6 +498,7 @@ snap_print(netdissect_options *ndo, cons +@@ -496,6 +502,7 @@ snap_print(netdissect_options *ndo, cons case PID_CISCO_VTP: vtp_print(ndo, p, length); return (1); @@ -506,7 +419,7 @@ case PID_CISCO_PVST: case PID_CISCO_VLANBRIDGE: stp_print(ndo, p, length); -@@ -504,6 +511,7 @@ snap_print(netdissect_options *ndo, cons +@@ -508,6 +515,7 @@ snap_print(netdissect_options *ndo, cons case OUI_RFC2684: switch (et) { @@ -514,7 +427,7 @@ case PID_RFC2684_ETH_FCS: case PID_RFC2684_ETH_NOFCS: /* -@@ -565,6 +573,7 @@ snap_print(netdissect_options *ndo, cons +@@ -569,6 +577,7 @@ snap_print(netdissect_options *ndo, cons */ fddi_print(ndo, p, length, caplen); return (1); @@ -542,25 +455,25 @@ /* unknown AF_ value */ --- a/print-ppp.c +++ b/print-ppp.c -@@ -1367,6 +1367,7 @@ trunc: - return 0; - } - +@@ -1355,6 +1355,7 @@ trunc: + * The length argument is the on-the-wire length, not the captured + * length; we can only un-escape the captured part. + */ +#ifndef TCPDUMP_MINI static void ppp_hdlc(netdissect_options *ndo, - const u_char *p, int length) -@@ -1445,6 +1446,7 @@ trunc: - free(b); - ND_PRINT((ndo, "[|ppp]")); + const u_char *p, u_int length) +@@ -1451,17 +1452,19 @@ trunc: + ndo->ndo_snapend = se; + nd_print_trunc(ndo); } +- +#endif - /* PPP */ -@@ -1452,10 +1454,12 @@ static void + static void handle_ppp(netdissect_options *ndo, - u_int proto, const u_char *p, int length) + u_int proto, const u_char *p, u_int length) { +#ifndef TCPDUMP_MINI if ((proto & 0xff00) == 0x7e00) { /* is this an escape code ? */ @@ -571,7 +484,7 @@ switch (proto) { case PPP_LCP: /* fall through */ -@@ -1488,6 +1492,7 @@ handle_ppp(netdissect_options *ndo, +@@ -1494,6 +1497,7 @@ handle_ppp(netdissect_options *ndo, case PPP_IPV6: ip6_print(ndo, p, length); break; @@ -579,33 +492,30 @@ case ETHERTYPE_IPX: /*XXX*/ case PPP_IPX: ipx_print(ndo, p, length); -@@ -1499,6 +1504,7 @@ handle_ppp(netdissect_options *ndo, +@@ -1505,6 +1509,7 @@ handle_ppp(netdissect_options *ndo, case PPP_MPLS_MCAST: mpls_print(ndo, p, length); break; +#endif case PPP_COMP: - ND_PRINT((ndo, "compressed PPP data")); + ND_PRINT("compressed PPP data"); break; -@@ -1639,6 +1645,7 @@ ppp_if_print(netdissect_options *ndo, - return (0); +@@ -1652,6 +1657,7 @@ ppp_if_print(netdissect_options *ndo, + ppp_print(ndo, p, length); } +#ifndef TCPDUMP_MINI /* * PPP I/F printer to use if we know that RFC 1662-style PPP in HDLC-like * framing, or Cisco PPP with HDLC framing as per section 4.3.1 of RFC 1547, -@@ -1866,6 +1873,7 @@ printx: +@@ -1895,3 +1901,4 @@ printx: #endif /* __bsdi__ */ - return (hdrlength); + ndo->ndo_ll_hdr_len += hdrlength; } +#endif - - - /* --- a/print-sll.c +++ b/print-sll.c -@@ -249,12 +249,14 @@ recurse: +@@ -465,12 +465,14 @@ recurse: */ switch (ether_type) { @@ -622,22 +532,24 @@ /* --- a/print-tcp.c +++ b/print-tcp.c -@@ -589,12 +589,14 @@ tcp_print(netdissect_options *ndo, - ND_PRINT((ndo, " %u", utoval)); +@@ -614,6 +614,7 @@ tcp_print(netdissect_options *ndo, + ND_PRINT(" %u", utoval); break; +#ifndef TCPDUMP_MINI case TCPOPT_MPTCP: - datalen = len - 2; - LENCHECK(datalen); - if (!mptcp_print(ndo, cp-2, len, flags)) + { + const u_char *snapend_save; +@@ -637,7 +638,7 @@ tcp_print(netdissect_options *ndo, goto bad; break; + } +- +#endif - case TCPOPT_FASTOPEN: datalen = len - 2; -@@ -670,6 +672,7 @@ tcp_print(netdissect_options *ndo, + LENCHECK(datalen); +@@ -722,6 +723,7 @@ tcp_print(netdissect_options *ndo, return; } @@ -645,7 +557,7 @@ if (ndo->ndo_packettype) { switch (ndo->ndo_packettype) { case PT_ZMTP1: -@@ -681,28 +684,36 @@ tcp_print(netdissect_options *ndo, +@@ -737,6 +739,7 @@ tcp_print(netdissect_options *ndo, } return; } @@ -653,9 +565,10 @@ if (IS_SRC_OR_DST_PORT(TELNET_PORT)) { telnet_print(ndo, bp, length); - } else if (IS_SRC_OR_DST_PORT(SMTP_PORT)) { - ND_PRINT((ndo, ": ")); - smtp_print(ndo, bp, length); +@@ -746,24 +749,31 @@ tcp_print(netdissect_options *ndo, + } else if (IS_SRC_OR_DST_PORT(WHOIS_PORT)) { + ND_PRINT(": "); + whois_print(ndo, bp, length); - } else if (IS_SRC_OR_DST_PORT(BGP_PORT)) + } +#ifndef TCPDUMP_MINI @@ -667,12 +580,14 @@ +#ifndef TCPDUMP_MINI else if (IS_SRC_OR_DST_PORT(REDIS_PORT)) resp_print(ndo, bp, length); + else if (IS_SRC_OR_DST_PORT(SSH_PORT)) + ssh_print(ndo, bp, length); +#endif #ifdef ENABLE_SMB else if (IS_SRC_OR_DST_PORT(NETBIOS_SSN_PORT)) nbt_tcp_print(ndo, bp, length); - else if (IS_SRC_OR_DST_PORT(SMB_PORT)) - smb_tcp_print(ndo, bp, length); + else if (IS_SRC_OR_DST_PORT(SMB_PORT)) + smb_tcp_print(ndo, bp, length); #endif +#ifndef TCPDUMP_MINI else if (IS_SRC_OR_DST_PORT(BEEP_PORT)) @@ -681,41 +596,40 @@ openflow_print(ndo, bp, length); +#endif else if (IS_SRC_OR_DST_PORT(FTP_PORT)) { - ND_PRINT((ndo, ": ")); + ND_PRINT(": "); ftp_print(ndo, bp, length); -@@ -725,6 +736,7 @@ tcp_print(netdissect_options *ndo, - * XXX packet could be unaligned, it can go strange - */ - ns_print(ndo, bp + 2, length - 2, 0); +@@ -776,12 +786,14 @@ tcp_print(netdissect_options *ndo, + } else if (IS_SRC_OR_DST_PORT(NAMESERVER_PORT)) { + /* over_tcp: TRUE, is_mdns: FALSE */ + domain_print(ndo, bp, length, TRUE, FALSE); +#ifndef TCPDUMP_MINI } else if (IS_SRC_OR_DST_PORT(MSDP_PORT)) { msdp_print(ndo, bp, length); } else if (IS_SRC_OR_DST_PORT(RPKI_RTR_PORT)) { -@@ -732,6 +744,7 @@ tcp_print(netdissect_options *ndo, - } - else if (length > 0 && (IS_SRC_OR_DST_PORT(LDP_PORT))) { + rpki_rtr_print(ndo, bp, length); + } else if (IS_SRC_OR_DST_PORT(LDP_PORT)) { ldp_print(ndo, bp, length); +#endif - } - else if ((IS_SRC_OR_DST_PORT(NFS_PORT)) && - length >= 4 && ND_TTEST2(*bp, 4)) { + } else if ((IS_SRC_OR_DST_PORT(NFS_PORT)) && + length >= 4 && ND_TTEST_4(bp)) { + /* --- a/print-udp.c +++ b/print-udp.c -@@ -430,10 +430,12 @@ udp_print(netdissect_options *ndo, regis - vat_print(ndo, (const void *)(up + 1), up); +@@ -435,10 +435,12 @@ udp_print(netdissect_options *ndo, const + vat_print(ndo, cp, length); break; +#ifndef TCPDUMP_MINI case PT_WB: udpipaddr_print(ndo, ip, sport, dport); - wb_print(ndo, (const void *)(up + 1), length); + wb_print(ndo, cp, length); break; +#endif case PT_RPC: - rp = (const struct sunrpc_msg *)(up + 1); -@@ -462,10 +464,12 @@ udp_print(netdissect_options *ndo, regis - snmp_print(ndo, (const u_char *)(up + 1), length); + rp = (const struct sunrpc_msg *)cp; +@@ -467,10 +469,12 @@ udp_print(netdissect_options *ndo, const + snmp_print(ndo, cp, length); break; +#ifndef TCPDUMP_MINI @@ -727,131 +641,221 @@ case PT_TFTP: udpipaddr_print(ndo, ip, sport, dport); -@@ -483,6 +487,7 @@ udp_print(netdissect_options *ndo, regis +@@ -488,6 +492,7 @@ udp_print(netdissect_options *ndo, const radius_print(ndo, cp, length); break; +#ifndef TCPDUMP_MINI case PT_VXLAN: udpipaddr_print(ndo, ip, sport, dport); - vxlan_print(ndo, (const u_char *)(up + 1), length); -@@ -497,6 +502,7 @@ udp_print(netdissect_options *ndo, regis + vxlan_print(ndo, cp, length); +@@ -510,6 +515,7 @@ udp_print(netdissect_options *ndo, const udpipaddr_print(ndo, ip, sport, dport); - lmp_print(ndo, cp, length); + someip_print(ndo, cp, length); break; +#endif - } - return; - } -@@ -574,31 +580,40 @@ udp_print(netdissect_options *ndo, regis - ns_print(ndo, (const u_char *)(up + 1), length, 0); + case PT_DOMAIN: + udpipaddr_print(ndo, ip, sport, dport); + /* over_tcp: FALSE, is_mdns: FALSE */ +@@ -596,29 +602,37 @@ udp_print(netdissect_options *ndo, const else if (IS_SRC_OR_DST_PORT(MULTICASTDNS_PORT)) - ns_print(ndo, (const u_char *)(up + 1), length, 1); + /* over_tcp: FALSE, is_mdns: TRUE */ + domain_print(ndo, cp, length, FALSE, TRUE); +#ifndef TCPDUMP_MINI else if (IS_SRC_OR_DST_PORT(TIMED_PORT)) - timed_print(ndo, (const u_char *)(up + 1)); + timed_print(ndo, (const u_char *)cp); +#endif else if (IS_SRC_OR_DST_PORT(TFTP_PORT)) - tftp_print(ndo, (const u_char *)(up + 1), length); + tftp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(BOOTPC_PORT) || IS_SRC_OR_DST_PORT(BOOTPS_PORT)) - bootp_print(ndo, (const u_char *)(up + 1), length); + bootp_print(ndo, cp, length); +#ifndef TCPDUMP_MINI else if (IS_SRC_OR_DST_PORT(RIP_PORT)) - rip_print(ndo, (const u_char *)(up + 1), length); + rip_print(ndo, cp, length); +#endif else if (IS_SRC_OR_DST_PORT(AODV_PORT)) - aodv_print(ndo, (const u_char *)(up + 1), length, + aodv_print(ndo, cp, length, ip6 != NULL); +#ifndef TCPDUMP_MINI - else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT)) - isakmp_print(ndo, (const u_char *)(up + 1), length, bp2); -+ - else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_NATT)) - isakmp_rfc3948_print(ndo, (const u_char *)(up + 1), length, bp2); - #if 1 /*???*/ - else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER1) || IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER2)) - isakmp_print(ndo, (const u_char *)(up + 1), length, bp2); - #endif + else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT)) + isakmp_print(ndo, cp, length, bp2); + else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_NATT)) + isakmp_rfc3948_print(ndo, cp, length, bp2, IP_V(ip), fragmented, ttl_hl); + else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER1) || IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER2)) + isakmp_print(ndo, cp, length, bp2); +#endif else if (IS_SRC_OR_DST_PORT(SNMP_PORT) || IS_SRC_OR_DST_PORT(SNMPTRAP_PORT)) - snmp_print(ndo, (const u_char *)(up + 1), length); + snmp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(NTP_PORT)) - ntp_print(ndo, (const u_char *)(up + 1), length); + ntp_print(ndo, cp, length); +#ifndef TCPDUMP_MINI else if (IS_SRC_OR_DST_PORT(KERBEROS_PORT) || IS_SRC_OR_DST_PORT(KERBEROS_SEC_PORT)) - krb_print(ndo, (const void *)(up + 1)); + krb_print(ndo, (const u_char *)cp); +#endif else if (IS_SRC_OR_DST_PORT(L2TP_PORT)) - l2tp_print(ndo, (const u_char *)(up + 1), length); + l2tp_print(ndo, cp, length); #ifdef ENABLE_SMB -@@ -609,6 +624,7 @@ udp_print(netdissect_options *ndo, regis +@@ -629,6 +643,7 @@ udp_print(netdissect_options *ndo, const #endif else if (dport == VAT_PORT) - vat_print(ndo, (const void *)(up + 1), up); + vat_print(ndo, cp, length); +#ifndef TCPDUMP_MINI else if (IS_SRC_OR_DST_PORT(ZEPHYR_SRV_PORT) || IS_SRC_OR_DST_PORT(ZEPHYR_CLT_PORT)) - zephyr_print(ndo, (const void *)(up + 1), length); + zephyr_print(ndo, cp, length); /* -@@ -621,8 +637,11 @@ udp_print(netdissect_options *ndo, regis +@@ -641,8 +656,11 @@ udp_print(netdissect_options *ndo, const (const u_char *) ip); else if (IS_SRC_OR_DST_PORT(RIPNG_PORT)) - ripng_print(ndo, (const u_char *)(up + 1), length); + ripng_print(ndo, cp, length); +#endif + else if (IS_SRC_OR_DST_PORT(DHCP6_SERV_PORT) || IS_SRC_OR_DST_PORT(DHCP6_CLI_PORT)) - dhcp6_print(ndo, (const u_char *)(up + 1), length); + dhcp6_print(ndo, cp, length); +#ifndef TCPDUMP_MINI else if (IS_SRC_OR_DST_PORT(AHCP_PORT)) - ahcp_print(ndo, (const u_char *)(up + 1), length); + ahcp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(BABEL_PORT) || IS_SRC_OR_DST_PORT(BABEL_PORT_OLD)) -@@ -636,6 +655,7 @@ udp_print(netdissect_options *ndo, regis - wb_print(ndo, (const void *)(up + 1), length); +@@ -656,6 +674,7 @@ udp_print(netdissect_options *ndo, const + wb_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(CISCO_AUTORP_PORT)) - cisco_autorp_print(ndo, (const void *)(up + 1), length); + cisco_autorp_print(ndo, cp, length); +#endif else if (IS_SRC_OR_DST_PORT(RADIUS_PORT) || IS_SRC_OR_DST_PORT(RADIUS_NEW_PORT) || IS_SRC_OR_DST_PORT(RADIUS_ACCOUNTING_PORT) || -@@ -643,15 +663,18 @@ udp_print(netdissect_options *ndo, regis +@@ -663,15 +682,18 @@ udp_print(netdissect_options *ndo, const IS_SRC_OR_DST_PORT(RADIUS_CISCO_COA_PORT) || IS_SRC_OR_DST_PORT(RADIUS_COA_PORT) ) - radius_print(ndo, (const u_char *)(up+1), length); + radius_print(ndo, cp, length); +#ifndef TCPDUMP_MINI else if (dport == HSRP_PORT) - hsrp_print(ndo, (const u_char *)(up + 1), length); + hsrp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(LWRES_PORT)) - lwres_print(ndo, (const u_char *)(up + 1), length); + lwres_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(LDP_PORT)) - ldp_print(ndo, (const u_char *)(up + 1), length); + ldp_print(ndo, cp, length); +#endif else if (IS_SRC_OR_DST_PORT(OLSR_PORT)) - olsr_print(ndo, (const u_char *)(up + 1), length, + olsr_print(ndo, cp, length, (IP_V(ip) == 6) ? 1 : 0); +#ifndef TCPDUMP_MINI else if (IS_SRC_OR_DST_PORT(MPLS_LSP_PING_PORT)) - lspping_print(ndo, (const u_char *)(up + 1), length); - else if (dport == BFD_CONTROL_PORT || -@@ -669,10 +692,12 @@ udp_print(netdissect_options *ndo, regis - lwapp_control_print(ndo, (const u_char *)(up + 1), length, 0); - else if (IS_SRC_OR_DST_PORT(LWAPP_DATA_PORT)) - lwapp_data_print(ndo, (const u_char *)(up + 1), length); -+#endif - else if (IS_SRC_OR_DST_PORT(SIP_PORT)) - sip_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(SYSLOG_PORT)) - syslog_print(ndo, (const u_char *)(up + 1), length); -+#ifndef TCPDUMP_MINI - else if (IS_SRC_OR_DST_PORT(OTV_PORT)) - otv_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(VXLAN_PORT)) -@@ -689,7 +714,9 @@ udp_print(netdissect_options *ndo, regis - if (ndo->ndo_vflag) - ND_PRINT((ndo, "kip ")); - llap_print(ndo, cp, length); -- } else { -+ } -+#endif -+ else { - if (ulen > length) - ND_PRINT((ndo, "UDP, bad length %u > %u", - ulen, length)); + lspping_print(ndo, cp, length); + else if (sport == BCM_LI_PORT) +@@ -693,10 +715,12 @@ udp_print(netdissect_options *ndo, const + lwapp_control_print(ndo, cp, length, 0); + else if (IS_SRC_OR_DST_PORT(LWAPP_DATA_PORT)) + lwapp_data_print(ndo, cp, length); ++#endif + else if (IS_SRC_OR_DST_PORT(SIP_PORT)) + sip_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(SYSLOG_PORT)) + syslog_print(ndo, cp, length); ++#ifndef TCPDUMP_MINI + else if (IS_SRC_OR_DST_PORT(OTV_PORT)) + otv_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(VXLAN_PORT)) +@@ -722,6 +746,7 @@ udp_print(netdissect_options *ndo, const + ptp_print(ndo, cp, length); + } else if (IS_SRC_OR_DST_PORT(SOMEIP_PORT)) + someip_print(ndo, cp, length); ++#endif + else { + if (ulen > length && !fragmented) + ND_PRINT("UDP, bad length %u > %u", +--- a/print.c ++++ b/print.c +@@ -48,6 +48,7 @@ struct printer { + }; + + static const struct printer printers[] = { ++#ifndef TCPDUMP_MINI + #ifdef DLT_APPLE_IP_OVER_IEEE1394 + { ap1394_if_print, DLT_APPLE_IP_OVER_IEEE1394 }, + #endif +@@ -86,7 +87,9 @@ static const struct printer printers[] = + #ifdef DLT_ENC + { enc_if_print, DLT_ENC }, + #endif ++#endif + { ether_if_print, DLT_EN10MB }, ++#ifndef TCPDUMP_MINI + { fddi_if_print, DLT_FDDI }, + #ifdef DLT_FR + { fr_if_print, DLT_FR }, +@@ -94,6 +97,7 @@ static const struct printer printers[] = + #ifdef DLT_FRELAY + { fr_if_print, DLT_FRELAY }, + #endif ++#endif + #ifdef DLT_IEEE802_11 + { ieee802_11_if_print, DLT_IEEE802_11}, + #endif +@@ -103,6 +107,7 @@ static const struct printer printers[] = + #ifdef DLT_IEEE802_11_RADIO + { ieee802_11_radio_if_print, DLT_IEEE802_11_RADIO }, + #endif ++#ifndef TCPDUMP_MINI + #ifdef DLT_IEEE802_15_4 + { ieee802_15_4_if_print, DLT_IEEE802_15_4 }, + #endif +@@ -115,9 +120,11 @@ static const struct printer printers[] = + #ifdef DLT_IP_OVER_FC + { ipfc_if_print, DLT_IP_OVER_FC }, + #endif ++#endif + #ifdef DLT_IPNET + { ipnet_if_print, DLT_IPNET }, + #endif ++#ifndef TCPDUMP_MINI + #ifdef DLT_IPOIB + { ipoib_if_print, DLT_IPOIB }, + #endif +@@ -172,19 +179,23 @@ static const struct printer printers[] = + #ifdef DLT_MFR + { mfr_if_print, DLT_MFR }, + #endif ++#endif + #ifdef DLT_NETANALYZER + { netanalyzer_if_print, DLT_NETANALYZER }, + #endif + #ifdef DLT_NETANALYZER_TRANSPARENT + { netanalyzer_transparent_if_print, DLT_NETANALYZER_TRANSPARENT }, + #endif ++#ifndef TCPDUMP_MINI + #ifdef DLT_NFLOG + { nflog_if_print, DLT_NFLOG}, + #endif ++#endif + { null_if_print, DLT_NULL }, + #ifdef DLT_LOOP + { null_if_print, DLT_LOOP }, + #endif ++#ifndef TCPDUMP_MINI + #ifdef DLT_PFLOG + { pflog_if_print, DLT_PFLOG }, + #endif +@@ -200,6 +211,7 @@ static const struct printer printers[] = + #ifdef DLT_PPP_SERIAL + { ppp_hdlc_if_print, DLT_PPP_SERIAL }, + #endif ++#endif + { ppp_if_print, DLT_PPP }, + #ifdef DLT_PPP_PPPD + { ppp_if_print, DLT_PPP_PPPD }, +@@ -211,6 +223,7 @@ static const struct printer printers[] = + { prism_if_print, DLT_PRISM_HEADER }, + #endif + { raw_if_print, DLT_RAW }, ++#ifndef TCPDUMP_MINI + #ifdef DLT_IPV4 + { raw_if_print, DLT_IPV4 }, + #endif +@@ -243,6 +256,7 @@ static const struct printer printers[] = + #ifdef DLT_VSOCK + { vsock_if_print, DLT_VSOCK }, + #endif ++#endif + { NULL, 0 }, + }; + diff --git a/package/network/utils/tcpdump/patches/101-CVE-2020-8037.patch b/package/network/utils/tcpdump/patches/101-CVE-2020-8037.patch deleted file mode 100644 index 281854777d..0000000000 --- a/package/network/utils/tcpdump/patches/101-CVE-2020-8037.patch +++ /dev/null @@ -1,47 +0,0 @@ ---- a/print-ppp.c -+++ b/print-ppp.c -@@ -1368,19 +1368,29 @@ trunc: - } - - #ifndef TCPDUMP_MINI -+/* -+ * Un-escape RFC 1662 PPP in HDLC-like framing, with octet escapes. -+ * The length argument is the on-the-wire length, not the captured -+ * length; we can only un-escape the captured part. -+ */ - static void - ppp_hdlc(netdissect_options *ndo, - const u_char *p, int length) - { -+ u_int caplen = ndo->ndo_snapend - p; - u_char *b, *t, c; - const u_char *s; -- int i, proto; -+ u_int i; -+ int proto; - const void *se; - -+ if (caplen == 0) -+ return; -+ - if (length <= 0) - return; - -- b = (u_char *)malloc(length); -+ b = (u_char *)malloc(caplen); - if (b == NULL) - return; - -@@ -1389,10 +1399,10 @@ ppp_hdlc(netdissect_options *ndo, - * Do this so that we dont overwrite the original packet - * contents. - */ -- for (s = p, t = b, i = length; i > 0 && ND_TTEST(*s); i--) { -+ for (s = p, t = b, i = caplen; i != 0; i--) { - c = *s++; - if (c == 0x7d) { -- if (i <= 1 || !ND_TTEST(*s)) -+ if (i <= 1) - break; - i--; - c = *s++ ^ 0x20; diff --git a/package/network/utils/tcpdump/patches/102-CVE-2018-16301.patch b/package/network/utils/tcpdump/patches/102-CVE-2018-16301.patch deleted file mode 100644 index 39cd368915..0000000000 --- a/package/network/utils/tcpdump/patches/102-CVE-2018-16301.patch +++ /dev/null @@ -1,101 +0,0 @@ -From 8ab211a7ec728bb0ad8c766c8eeb12deb0a13b86 Mon Sep 17 00:00:00 2001 -From: Guy Harris -Date: Wed, 30 Sep 2020 11:37:30 -0700 -Subject: [PATCH] Handle very large -f files by rejecting them. - -_read(), on Windows, has a 32-bit size argument and a 32-bit return -value, so reject -f files that have more than 2^31-1 characters. - -Add some #defines so that, on Windows, we use _fstati64 to get the size -of that file, to handle large files. - -Don't assume that our definition for ssize_t is the same size as size_t; -by the time we want to print the return value of the read, we know it'll -fit into an int, so just cast it to int and print it with %d. - -(cherry picked from commit faf8fb70af3a013e5d662b8283dec742fd6b1a77) ---- - netdissect-stdinc.h | 16 +++++++++++++++- - tcpdump.c | 15 ++++++++++++--- - 2 files changed, 27 insertions(+), 4 deletions(-) - ---- a/netdissect-stdinc.h -+++ b/netdissect-stdinc.h -@@ -149,10 +149,17 @@ - #ifdef _MSC_VER - #define stat _stat - #define open _open --#define fstat _fstat - #define read _read - #define close _close - #define O_RDONLY _O_RDONLY -+ -+/* -+ * We define our_fstat64 as _fstati64, and define our_statb as -+ * struct _stati64, so we get 64-bit file sizes. -+ */ -+#define our_fstat _fstati64 -+#define our_statb struct _stati64 -+ - #endif /* _MSC_VER */ - - /* -@@ -211,6 +218,13 @@ typedef char* caddr_t; - - #include - -+/* -+ * We should have large file support enabled, if it's available, -+ * so just use fstat as our_fstat and struct stat as our_statb. -+ */ -+#define our_fstat fstat -+#define our_statb struct stat -+ - #endif /* _WIN32 */ - - #ifndef HAVE___ATTRIBUTE__ ---- a/tcpdump.c -+++ b/tcpdump.c -@@ -108,6 +108,7 @@ The Regents of the University of Califor - #endif /* HAVE_CAP_NG_H */ - #endif /* HAVE_LIBCAP_NG */ - -+#include "netdissect-stdinc.h" - #include "netdissect.h" - #include "interface.h" - #include "addrtoname.h" -@@ -861,15 +862,22 @@ read_infile(char *fname) - { - register int i, fd, cc; - register char *cp; -- struct stat buf; -+ our_statb buf; - - fd = open(fname, O_RDONLY|O_BINARY); - if (fd < 0) - error("can't open %s: %s", fname, pcap_strerror(errno)); - -- if (fstat(fd, &buf) < 0) -+ if (our_fstat(fd, &buf) < 0) - error("can't stat %s: %s", fname, pcap_strerror(errno)); - -+ /* -+ * Reject files whose size doesn't fit into an int; a filter -+ * *that* large will probably be too big. -+ */ -+ if (buf.st_size > INT_MAX) -+ error("%s is too large", fname); -+ - cp = malloc((u_int)buf.st_size + 1); - if (cp == NULL) - error("malloc(%d) for %s: %s", (u_int)buf.st_size + 1, -@@ -878,7 +886,8 @@ read_infile(char *fname) - if (cc < 0) - error("read %s: %s", fname, pcap_strerror(errno)); - if (cc != buf.st_size) -- error("short read %s (%d != %d)", fname, cc, (int)buf.st_size); -+ error("short read %s (%d != %d)", fname, (int) cc, -+ (int)buf.st_size); - - close(fd); - /* replace "# comment" with spaces */ diff --git a/package/network/utils/umbim/Makefile b/package/network/utils/umbim/Makefile index eeec0d0870..106d68fe77 100644 --- a/package/network/utils/umbim/Makefile +++ b/package/network/utils/umbim/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=umbim -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=24 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/umbim.git @@ -14,6 +14,7 @@ PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:= PKG_FLAGS:=nonshared +PKG_BUILD_FLAGS:=gc-sections include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -32,9 +33,7 @@ define Package/umbim/description endef TARGET_CFLAGS += \ - -I$(STAGING_DIR)/usr/include -ffunction-sections -fdata-sections - -TARGET_LDFLAGS += -Wl,--gc-sections + -I$(STAGING_DIR)/usr/include define Package/umbim/install $(INSTALL_DIR) $(1)/sbin diff --git a/package/network/utils/umbim/files/lib/netifd/proto/mbim.sh b/package/network/utils/umbim/files/lib/netifd/proto/mbim.sh index 64bb8176a0..50913e7fa0 100755 --- a/package/network/utils/umbim/files/lib/netifd/proto/mbim.sh +++ b/package/network/utils/umbim/files/lib/netifd/proto/mbim.sh @@ -19,16 +19,37 @@ proto_mbim_init_config() { proto_config_add_string auth proto_config_add_string username proto_config_add_string password + [ -e /proc/sys/net/ipv6 ] && proto_config_add_string ipv6 + proto_config_add_string dhcp + proto_config_add_string dhcpv6 + proto_config_add_string pdptype + proto_config_add_int mtu proto_config_add_defaults } +_proto_mbim_get_field() { + local field="$1" + shift + local mbimconfig="$@" + echo "$mbimconfig" | while read -r line; do + variable=${line%%:*} + [ "$variable" = "$field" ] || continue; + value=${line##* } + echo -n "$value " + done +} + _proto_mbim_setup() { local interface="$1" local tid=2 local ret - local device apn pincode delay allow_roaming allow_partner $PROTO_DEFAULT_OPTIONS - json_get_vars device apn pincode delay auth username password allow_roaming allow_partner $PROTO_DEFAULT_OPTIONS + local device apn pincode delay auth username password allow_roaming allow_partner + local dhcp dhcpv6 pdptype ip4table ip6table mtu $PROTO_DEFAULT_OPTIONS + json_get_vars device apn pincode delay auth username password allow_roaming allow_partner + json_get_vars dhcp dhcpv6 pdptype ip4table ip6table mtu $PROTO_DEFAULT_OPTIONS + + [ ! -e /proc/sys/net/ipv6 ] && ipv6=0 || json_get_var ipv6 ipv6 [ -n "$ctl_device" ] && device=$ctl_device @@ -146,35 +167,133 @@ _proto_mbim_setup() { } tid=$((tid + 1)) + pdptype=$(echo "$pdptype" | awk '{print tolower($0)}') + [ "$ipv6" = 0 ] && pdptype="ipv4" + + local req_pdptype="" # Pass "default" PDP type to umbim if unconfigured + [ "$pdptype" = "ipv4" -o "$pdptype" = "ipv6" -o "$pdptype" = "ipv4v6" ] && req_pdptype="$pdptype:" + + local connect_state echo "mbim[$$]" "Connect to network" - while ! umbim $DBG -n -t $tid -d $device connect "$apn" "$auth" "$username" "$password"; do + connect_state=$(umbim $DBG -n -t $tid -d $device connect "$req_pdptype$apn" "$auth" "$username" "$password") || { + echo "mbim[$$]" "Failed to connect bearer" tid=$((tid + 1)) - sleep 1; - done + umbim $DBG -t $tid -d "$device" disconnect + proto_notify_error "$interface" CONNECT_FAILED + return 1 + } tid=$((tid + 1)) - uci_set_state network $interface tid "$tid" + echo "$connect_state" + local iptype="$(echo "$connect_state" | grep iptype: | awk '{print $4}')" + + echo "mbim[$$]" "Connected" + + local zone="$(fw3 -q network "$interface" 2>/dev/null)" + + echo "mbim[$$]" "Setting up $ifname" + local mbimconfig="$(umbim $DBG -n -t $tid -d $device config)" + echo "$mbimconfig" + tid=$((tid + 1)) - echo "mbim[$$]" "Connected, starting DHCP" proto_init_update "$ifname" 1 proto_send_update "$interface" - json_init - json_add_string name "${interface}_4" - json_add_string ifname "@$interface" - json_add_string proto "dhcp" - proto_add_dynamic_defaults - json_close_object - ubus call network add_dynamic "$(json_dump)" - - json_init - json_add_string name "${interface}_6" - json_add_string ifname "@$interface" - json_add_string proto "dhcpv6" - json_add_string extendprefix 1 - proto_add_dynamic_defaults - json_close_object - ubus call network add_dynamic "$(json_dump)" + [ -z "$dhcp" ] && dhcp="auto" + [ -z "$dhcpv6" ] && dhcpv6="auto" + + [ "$iptype" != "ipv6" ] && { + json_init + json_add_string name "${interface}_4" + json_add_string ifname "@$interface" + ipv4address=$(_proto_mbim_get_field ipv4address "$mbimconfig") + if [ -n "$ipv4address" -a "$dhcp" != 1 ]; then + json_add_string proto "static" + + json_add_array ipaddr + for address in $ipv4address; do + json_add_string "" "$address" + done + json_close_array + + json_add_string gateway $(_proto_mbim_get_field ipv4gateway "$mbimconfig") + elif [ "$dhcp" != 0 ]; then + echo "mbim[$$]" "Starting DHCP on $ifname" + json_add_string proto "dhcp" + fi + + [ "$peerdns" = 0 -a "$dhcp" != 1 ] || { + json_add_array dns + for server in $(_proto_mbim_get_field ipv4dnsserver "$mbimconfig"); do + json_add_string "" "$server" + done + json_close_array + } + + proto_add_dynamic_defaults + [ -n "$zone" ] && json_add_string zone "$zone" + [ -n "$ip4table" ] && json_add_string ip4table "$ip4table" + json_close_object + ubus call network add_dynamic "$(json_dump)" + } + + [ "$iptype" != "ipv4" ] && { + json_init + json_add_string name "${interface}_6" + json_add_string ifname "@$interface" + ipv6address=$(_proto_mbim_get_field ipv6address "$mbimconfig") + if [ -n "$ipv6address" -a "$dhcpv6" != 1 ]; then + json_add_string proto "static" + + json_add_array ip6addr + for address in $ipv6address; do + json_add_string "" "$address" + done + json_close_array + + json_add_array ip6prefix + for address in $ipv6address; do + json_add_string "" "$address" + done + json_close_array + + json_add_string ip6gw $(_proto_mbim_get_field ipv6gateway "$mbimconfig") + + elif [ "$dhcpv6" != 0 ]; then + echo "mbim[$$]" "Starting DHCPv6 on $ifname" + json_add_string proto "dhcpv6" + json_add_string extendprefix 1 + fi + + [ "$peerdns" = 0 -a "$dhcpv6" != 1 ] || { + json_add_array dns + for server in $(_proto_mbim_get_field ipv6dnsserver "$mbimconfig"); do + json_add_string "" "$server" + done + json_close_array + } + + proto_add_dynamic_defaults + [ -n "$zone" ] && json_add_string zone "$zone" + [ -n "$ip6table" ] && json_add_string ip6table "$ip6table" + json_close_object + ubus call network add_dynamic "$(json_dump)" + } + + [ -z "$mtu" ] && { + local ipv4mtu=$(_proto_mbim_get_field ipv4mtu "$mbimconfig") + ipv4mtu="${ipv4mtu:-0}" + local ipv6mtu=$(_proto_mbim_get_field ipv6mtu "$mbimconfig") + ipv6mtu="${ipv6mtu:-0}" + + mtu=$((ipv6mtu > ipv4mtu ? ipv6mtu : ipv4mtu)) + } + [ -n "$mtu" -a "$mtu" != 0 ] && { + echo Setting MTU of $ifname to $mtu + /sbin/ip link set dev $ifname mtu $mtu + } + + uci_set_state network $interface tid "$tid" } proto_mbim_setup() { diff --git a/package/network/utils/uqmi/Makefile b/package/network/utils/uqmi/Makefile index 66989c2a73..1257b1def7 100644 --- a/package/network/utils/uqmi/Makefile +++ b/package/network/utils/uqmi/Makefile @@ -1,19 +1,20 @@ include $(TOPDIR)/rules.mk PKG_NAME:=uqmi -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/uqmi.git -PKG_SOURCE_DATE:=2022-05-04 -PKG_SOURCE_VERSION:=56cb2d4056fef132ccf78dfb6f3074ae5d109992 -PKG_MIRROR_HASH:=cc832b5318805df8c8387a3650f250dee72d5f1dbda4e4866b5503e186b2210c +PKG_SOURCE_DATE:=2022-10-20 +PKG_SOURCE_VERSION:=c8c9f105aa2d03146664fa1cc1bd2c837aa4aadd +PKG_MIRROR_HASH:=5fd1b3c8f5e7c4b52ed81a0c69504fbf39e69c0ecd1f8278969cf22f57fdb2a9 PKG_MAINTAINER:=Matti Laakso PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:= PKG_FLAGS:=nonshared +PKG_BUILD_FLAGS:=gc-sections include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -32,9 +33,9 @@ define Package/uqmi/description endef TARGET_CFLAGS += \ - -I$(STAGING_DIR)/usr/include -ffunction-sections -fdata-sections - -TARGET_LDFLAGS += -Wl,--gc-sections + -I$(STAGING_DIR)/usr/include \ + -Wno-error=dangling-pointer \ + -Wno-error=maybe-uninitialized CMAKE_OPTIONS += \ -DDEBUG=1 diff --git a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh index c2c5fc1eca..eab7f1ea13 100755 --- a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh +++ b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh @@ -11,6 +11,7 @@ proto_qmi_init_config() { no_device=1 proto_config_add_string "device:device" proto_config_add_string apn + proto_config_add_string v6apn proto_config_add_string auth proto_config_add_string username proto_config_add_string password @@ -19,6 +20,7 @@ proto_qmi_init_config() { proto_config_add_string modes proto_config_add_string pdptype proto_config_add_int profile + proto_config_add_int v6profile proto_config_add_boolean dhcp proto_config_add_boolean dhcpv6 proto_config_add_boolean autoconnect @@ -31,14 +33,14 @@ proto_qmi_init_config() { proto_qmi_setup() { local interface="$1" local dataformat connstat plmn_mode mcc mnc - local device apn auth username password pincode delay modes pdptype - local profile dhcp dhcpv6 autoconnect plmn timeout mtu $PROTO_DEFAULT_OPTIONS + local device apn v6apn auth username password pincode delay modes pdptype + local profile v6profile dhcp dhcpv6 autoconnect plmn timeout mtu $PROTO_DEFAULT_OPTIONS local ip4table ip6table local cid_4 pdh_4 cid_6 pdh_6 local ip_6 ip_prefix_length gateway_6 dns1_6 dns2_6 - json_get_vars device apn auth username password pincode delay modes - json_get_vars pdptype profile dhcp dhcpv6 autoconnect plmn ip4table + json_get_vars device apn v6apn auth username password pincode delay modes + json_get_vars pdptype profile v6profile dhcp dhcpv6 autoconnect plmn ip4table json_get_vars ip6table timeout mtu $PROTO_DEFAULT_OPTIONS [ "$timeout" = "" ] && timeout="10" @@ -81,6 +83,8 @@ proto_qmi_setup() { echo "Waiting for SIM initialization" local uninitialized_timeout=0 + # timeout 3s for first call to avoid hanging uqmi + uqmi -d "$device" --get-pin-status -t 3000 > /dev/null 2>&1 while uqmi -s -d "$device" --get-pin-status | grep '"UIM uninitialized"' > /dev/null; do [ -e "$device" ] || return 1 if [ "$uninitialized_timeout" -lt "$timeout" -o "$timeout" = "0" ]; then @@ -192,6 +196,7 @@ proto_qmi_setup() { # Cleanup current state if any uqmi -s -d "$device" --stop-network 0xffffffff --autoconnect > /dev/null 2>&1 + uqmi -s -d "$device" --set-ip-family ipv6 --stop-network 0xffffffff --autoconnect > /dev/null 2>&1 # Go online uqmi -s -d "$device" --set-device-operating-mode online > /dev/null 2>&1 @@ -308,10 +313,13 @@ proto_qmi_setup() { uqmi -s -d "$device" --set-client-id wds,"$cid_6" --set-ip-family ipv6 > /dev/null 2>&1 + : "${v6apn:=${apn}}" + : "${v6profile:=${profile}}" + pdh_6=$(uqmi -s -d "$device" --set-client-id wds,"$cid_6" \ --start-network \ - ${apn:+--apn $apn} \ - ${profile:+--profile $profile} \ + ${v6apn:+--apn $v6apn} \ + ${v6profile:+--profile $v6profile} \ ${auth:+--auth-type $auth} \ ${username:+--username $username} \ ${password:+--password $password} \ @@ -326,7 +334,7 @@ proto_qmi_setup() { fi # Check data connection state - connstat=$(uqmi -s -d "$device" --set-client-id wds,"$cid_6" --get-data-status) + connstat=$(uqmi -s -d "$device" --set-client-id wds,"$cid_6" --set-ip-family ipv6 --get-data-status) [ "$connstat" == '"connected"' ] || { echo "No data link!" uqmi -s -d "$device" --set-client-id wds,"$cid_6" --release-client-id wds > /dev/null 2>&1 @@ -382,6 +390,7 @@ proto_qmi_setup() { json_init json_add_string name "${interface}_6" json_add_string ifname "@$interface" + [ "$pdptype" = "ipv4v6" ] && json_add_string iface_464xlat "0" json_add_string proto "dhcpv6" [ -n "$ip6table" ] && json_add_string ip6table "$ip6table" proto_add_dynamic_defaults diff --git a/package/network/utils/wireguard-tools/Makefile b/package/network/utils/wireguard-tools/Makefile index 717ec2bbb1..5b1fab057d 100644 --- a/package/network/utils/wireguard-tools/Makefile +++ b/package/network/utils/wireguard-tools/Makefile @@ -7,16 +7,15 @@ # See /LICENSE for more information. include $(TOPDIR)/rules.mk -include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=wireguard-tools -PKG_VERSION:=1.0.20210424 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=1.0.20210914 +PKG_RELEASE:=2 PKG_SOURCE:=wireguard-tools-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://git.zx2c4.com/wireguard-tools/snapshot/ -PKG_HASH:=b288b0c43871d919629d7e77846ef0b47f8eeaa9ebc9cedeee8233fc6cc376ad +PKG_HASH:=97ff31489217bb265b7ae850d3d0f335ab07d2652ba1feec88b734bc96bd05ac PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:=COPYING @@ -24,7 +23,6 @@ PKG_LICENSE_FILES:=COPYING PKG_BUILD_PARALLEL:=1 include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/package-defaults.mk MAKE_PATH:=src MAKE_VARS += PLATFORM=linux diff --git a/package/network/utils/wpan-tools/Makefile b/package/network/utils/wpan-tools/Makefile index 060aaf5046..7b2cfe7a60 100644 --- a/package/network/utils/wpan-tools/Makefile +++ b/package/network/utils/wpan-tools/Makefile @@ -1,18 +1,17 @@ +# SPDX-License-Identifier: GPL-2.0-only # # Copyright (C) 2015 OpenWrt.org # -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# include $(TOPDIR)/rules.mk PKG_NAME:=wpan-tools -PKG_VERSION:=0.7 +PKG_VERSION:=0.9 +PKG_RELEASE=1 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=http://wpan.cakelab.org/releases/ -PKG_HASH:=c16de9d7861c2d9b6a4436a0fac730f9f545ee290b92bc770c538ec6a3f22309 +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/linux-wpan/wpan-tools/releases/download/$(PKG_NAME)-$(PKG_VERSION)/$(PKG_NAME)-$(PKG_VERSION).tar.gz? +PKG_HASH:=fa76d9c1874220e4b1f91c226f42baf1e372ea8ccf4b892effaf0d164448f608 include $(INCLUDE_DIR)/package.mk @@ -20,7 +19,7 @@ define Package/wpan-tools SECTION:=net CATEGORY:=Network TITLE:=cfg802154 interface configuration utility - URL:=http://wpan.cakelab.org/ + URL:=https://linux-wpan.org/wpan-tools.html DEPENDS:= +libnl endef diff --git a/package/network/utils/wpan-tools/patches/001-src-nl_extras.h-fix-compatibility-with-libnl-3.3.0.patch b/package/network/utils/wpan-tools/patches/001-src-nl_extras.h-fix-compatibility-with-libnl-3.3.0.patch deleted file mode 100644 index 1370854b6b..0000000000 --- a/package/network/utils/wpan-tools/patches/001-src-nl_extras.h-fix-compatibility-with-libnl-3.3.0.patch +++ /dev/null @@ -1,44 +0,0 @@ -From bb522bd584f05e6658d5dba97f48ca018f46394c Mon Sep 17 00:00:00 2001 -From: Thomas Petazzoni -Date: Sat, 6 May 2017 14:36:08 +0200 -Subject: [PATCH] src/nl_extras.h: fix compatibility with libnl 3.3.0 - -nl_extras.h defines a set of nla_set_s*() functions if not provided by -libnl. They are provided by libnl since version 3.2.26. The test -(LIBNL_VER_MIC <= 26) was working fine while libnl was in the 3.2.x -series, but now that they have incremented the minor version, the -micro version was reset to 0, with the latest libnl version being -3.3.0. - -Due to this, the condition (LIBNL_VER_MIC <= 26) is true, and we get -redefinition errors because nl_extras.h redefines functions already -provided by libnl. - -This commit improves the condition so that nl_extras.h provides the -missing functions only if the minor version is < 2, or if minor is 2 -and micro is < 26. - -Signed-off-by: Thomas Petazzoni ---- - src/nl_extras.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/src/nl_extras.h -+++ b/src/nl_extras.h -@@ -1,7 +1,7 @@ - #ifndef __NL_EXTRAS_H - #define __NL_EXTRAS_H - --#if LIBNL_VER_MIC <= 26 -+#if (LIBNL_VER_MIN < 2) || (LIBNL_VER_MIN == 2) && (LIBNL_VER_MIC <= 26) - - #ifndef NLA_S8 - -@@ -45,6 +45,6 @@ static inline int32_t nla_get_s32(struct - - #endif /* NLA_S64 */ - --#endif /* LIBNL_VER_MIC */ -+#endif /* LIBNL_VER_* */ - - #endif /* __NL_EXTRAS_H */ diff --git a/package/network/utils/wwan/Makefile b/package/network/utils/wwan/Makefile index 268a0e58cf..f48d16662b 100644 --- a/package/network/utils/wwan/Makefile +++ b/package/network/utils/wwan/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=wwan PKG_VERSION:=2019-04-29 -PKG_RELEASE=5 +PKG_RELEASE=6 PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:= diff --git a/package/network/utils/wwan/files/data/0e8d-00a5 b/package/network/utils/wwan/files/data/0e8d-00a5 new file mode 100644 index 0000000000..23a7ce3616 --- /dev/null +++ b/package/network/utils/wwan/files/data/0e8d-00a5 @@ -0,0 +1,5 @@ +{ + "desc": "Medion S4222", + "control": 2, + "data": 0 +} diff --git a/package/network/utils/xdp-tools/Makefile b/package/network/utils/xdp-tools/Makefile new file mode 100644 index 0000000000..3cc7980cf6 --- /dev/null +++ b/package/network/utils/xdp-tools/Makefile @@ -0,0 +1,139 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=xdp-tools +PKG_RELEASE:=1 +PKG_VERSION:=1.2.9 +PKG_HASH:=159ed8d3c8195d812ec3cde83bd736245a72743af372998320d39c2ba69ab142 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/xdp-project/xdp-tools/tar.gz/v$(PKG_VERSION)? +PKG_ABI_VERSION:=$(call abi_version_str,$(PKG_VERSION)) + +PKG_MAINTAINER:=Daniel Golle + +PKG_BUILD_DEPENDS:=bpf-headers +PKG_FLAGS:=nonshared + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/bpf.mk +include $(INCLUDE_DIR)/nls.mk + +PKG_BUILD_PARALLEL:=1 +PKG_INSTALL:=1 + +define Package/libxdp + SECTION:=libs + CATEGORY:=Libraries + TITLE:=libxdp - Library for use with XDP + LICENSE:=LGPL-2.1 OR BSD-2-Clause + ABI_VERSION:=$(PKG_ABI_VERSION) + URL:=https://github.com/xdp-project/xdp-tools/ + DEPENDS:=+libbpf $(BPF_DEPENDS) +endef + +define Package/libxdp/description +libxdp - library for attaching XDP programs and using AF_XDP sockets +endef + +define Package/xdp-tools/Default + SECTION:=net + CATEGORY:=Network + LICENSE:=GPL-2.0-only + URL:=https://github.com/xdp-project/xdp-tools/ + DEPENDS:=+libxdp +endef + +define Package/xdp-filter +$(call Package/xdp-tools/Default) + TITLE:=xdp-filter - a simple XDP-powered packet filter +endef + +define Package/xdp-filter/description +xdp-filter is a packet filtering utility powered by XDP. It is deliberately +simple and so does not have the same matching capabilities as, e.g., +netfilter. Instead, thanks to XDP, it can achieve very high drop rates: +tens of millions of packets per second on a single CPU core. +endef + + +define Package/xdp-loader +$(call Package/xdp-tools/Default) + TITLE:=xdp-loader - an XDP program loader +endef + +define Package/xdp-loader/description +xdp-loader is a simple loader for XDP programs with support for attaching +multiple programs to the same interface. To achieve this it exposes the same +load and unload semantics exposed by the libxdp library. +endef + +define Package/xdpdump +$(call Package/xdp-tools/Default) + TITLE:=xdpdump - tool for capturing packets at the XDP layer + DEPENDS+=+libpcap +endef + +define Package/xdpdump/description +xdpdump - a simple tcpdump like tool for capturing packets at the XDP layer +endef + +TARGET_LDFLAGS += $(INTL_LDFLAGS) + +CONFIGURE_VARS += \ + FORCE_SYSTEM_LIBBPF=1 \ + CC="$(TARGET_CC)" \ + CFLAGS="$(TARGET_CFLAGS)" \ + LDFLAGS="$(TARGET_LDFLAGS)" \ + CLANG="$(CLANG)" \ + BPF_TARGET="$(BPF_TARGET)" \ + LLC="$(LLVM_LLC)" + +MAKE_VARS += \ + PREFIX=/usr \ + RUNDIR=/tmp/run + +define Build/Configure + $(call Build/Configure/Default) + echo "BPF_CFLAGS += -I$(BPF_HEADERS_DIR)/tools/lib" >> $(PKG_BUILD_DIR)/config.mk +endef + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include/xdp + $(CP) $(PKG_INSTALL_DIR)/usr/include/xdp/*.h $(1)/usr/include/xdp/ + $(INSTALL_DIR) $(1)/usr/lib/bpf + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libxdp.{a,so*} $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/bpf/*.o $(1)/usr/lib/bpf + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libxdp.pc \ + $(1)/usr/lib/pkgconfig/ + $(SED) 's,/usr/include,$$$${prefix}/include,g' \ + $(1)/usr/lib/pkgconfig/libxdp.pc + $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' \ + $(1)/usr/lib/pkgconfig/libxdp.pc +endef + +define Package/xdp-filter/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/xdp-filter $(1)/usr/sbin +endef + +define Package/xdp-loader/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/xdp-loader $(1)/usr/sbin +endef + +define Package/xdpdump/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/xdpdump $(1)/usr/sbin +endef + +define Package/libxdp/install + $(INSTALL_DIR) $(1)/usr/lib/bpf + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libxdp.so.* $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/bpf/*.o $(1)/usr/lib/bpf +endef + +$(eval $(call BuildPackage,libxdp)) +$(eval $(call BuildPackage,xdp-filter)) +$(eval $(call BuildPackage,xdp-loader)) +$(eval $(call BuildPackage,xdpdump)) diff --git a/package/network/utils/xdp-tools/patches/010-configure-respect-LDFLAGS.patch b/package/network/utils/xdp-tools/patches/010-configure-respect-LDFLAGS.patch new file mode 100644 index 0000000000..e2fbfa57dc --- /dev/null +++ b/package/network/utils/xdp-tools/patches/010-configure-respect-LDFLAGS.patch @@ -0,0 +1,29 @@ +--- a/configure ++++ b/configure +@@ -174,7 +174,7 @@ int main(int argc, char **argv) { + return 0; + } + EOF +- libpcap_err=$($CC -o $TMPDIR/libpcaptest $TMPDIR/libpcaptest.c $LIBPCAP_CFLAGS $LIBPCAP_LDLIBS 2>&1) ++ libpcap_err=$($CC -o $TMPDIR/libpcaptest $TMPDIR/libpcaptest.c $LIBPCAP_CFLAGS $LIBPCAP_LDLIBS $LDFLAGS 2>&1) + if [ "$?" -eq "0" ]; then + echo "HAVE_PCAP:=y" >>$CONFIG + [ -n "$LIBPCAP_CFLAGS" ] && echo 'CFLAGS += ' $LIBPCAP_CFLAGS >> $CONFIG +@@ -222,7 +222,7 @@ int main(int argc, char **argv) { + return 0; + } + EOF +- libbpf_err=$($CC -o $TMPDIR/libbpftest $TMPDIR/libbpftest.c -Werror $LIBBPF_CFLAGS $LIBBPF_LDLIBS 2>&1) ++ libbpf_err=$($CC -o $TMPDIR/libbpftest $TMPDIR/libbpftest.c -Werror $LIBBPF_CFLAGS $LIBBPF_LDLIBS $LDFLAGS 2>&1) + if [ "$?" -eq "0" ]; then + echo "HAVE_FEATURES+=${config_var}" >>"$CONFIG" + echo "yes" +@@ -289,7 +289,7 @@ int main(int argc, char **argv) { + } + EOF + +- libbpf_err=$($CC -o $TMPDIR/libbpftest $TMPDIR/libbpftest.c -Werror $LIBBPF_CFLAGS $LIBBPF_LDLIBS 2>&1) ++ libbpf_err=$($CC -o $TMPDIR/libbpftest $TMPDIR/libbpftest.c -Werror $LIBBPF_CFLAGS $LIBBPF_LDLIBS $LDFLAGS 2>&1) + if [ "$?" -eq "0" ]; then + echo "SYSTEM_LIBBPF:=y" >>$CONFIG + echo "LIBBPF_VERSION=$LIBBPF_VERSION" >>$CONFIG diff --git a/package/system/ca-certificates/Makefile b/package/system/ca-certificates/Makefile index 9fac32e7e3..ec588cc65b 100644 --- a/package/system/ca-certificates/Makefile +++ b/package/system/ca-certificates/Makefile @@ -7,17 +7,20 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ca-certificates -PKG_VERSION:=20211016 +PKG_VERSION:=20230311 PKG_RELEASE:=1 PKG_MAINTAINER:= PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@DEBIAN/pool/main/c/ca-certificates -PKG_HASH:=2ae9b6dc5f40c25d6d7fe55e07b54f12a8967d1955d3b7b2f42ee46266eeef88 +PKG_HASH:=83de934afa186e279d1ed08ea0d73f5cf43a6fbfb5f00874b6db3711c64576f3 PKG_INSTALL:=1 include $(INCLUDE_DIR)/package.mk +TAR_OPTIONS+= --strip-components 1 +TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS) + define Package/ca-certificates SECTION:=base CATEGORY:=Base system @@ -34,13 +37,6 @@ define Package/ca-bundle PROVIDES:=ca-certs endef -define Build/Prepare - $(DECOMPRESS_CMD) $(HOST_TAR) -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) - $(Build/Patch) -endef - -MAKE_PATH := work - define Build/Install mkdir -p \ $(PKG_INSTALL_DIR)/usr/sbin \ diff --git a/package/system/ca-certificates/patches/0001-ca-certificates-fix-python3-cryptography-woes-in-cer.patch b/package/system/ca-certificates/patches/0001-ca-certificates-fix-python3-cryptography-woes-in-cer.patch index add01f42c0..09092617f1 100644 --- a/package/system/ca-certificates/patches/0001-ca-certificates-fix-python3-cryptography-woes-in-cer.patch +++ b/package/system/ca-certificates/patches/0001-ca-certificates-fix-python3-cryptography-woes-in-cer.patch @@ -18,8 +18,8 @@ Reported-by: Chen Minqiang Reported-by: Shane Synan Signed-off-by: Christian Lamparter --- ---- a/work/mozilla/certdata2pem.py -+++ b/work/mozilla/certdata2pem.py +--- a/mozilla/certdata2pem.py ++++ b/mozilla/certdata2pem.py @@ -21,16 +21,12 @@ # USA. @@ -42,8 +42,8 @@ Signed-off-by: Christian Lamparter if not obj['CKA_LABEL'] in trust or not trust[obj['CKA_LABEL']]: continue - -- cert = x509.load_der_x509_certificate(obj['CKA_VALUE']) -- if cert.not_valid_after < datetime.datetime.now(): +- cert = x509.load_der_x509_certificate(bytes(obj['CKA_VALUE'])) +- if cert.not_valid_after < datetime.datetime.utcnow(): - print('!'*74) - print('Trusted but expired certificate found: %s' % obj['CKA_LABEL']) - print('!'*74) diff --git a/package/system/fstools/Makefile b/package/system/fstools/Makefile index 85012d9987..272e8a1f14 100644 --- a/package/system/fstools/Makefile +++ b/package/system/fstools/Makefile @@ -8,19 +8,19 @@ include $(TOPDIR)/rules.mk PKG_NAME:=fstools -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/fstools.git -PKG_MIRROR_HASH:=1b16e5ef533c7b30b3ccc4b7001c18b23c44890021aa4ae54850dbec56e7dc7c -PKG_SOURCE_DATE:=2022-06-02 -PKG_SOURCE_VERSION:=93369be040612c906bcbb1631f44a92fa4122d24 +PKG_MIRROR_HASH:=4ec370a1cdc9fa69131f1403b064d2e05d54ee865411917410d7540454265319 +PKG_SOURCE_DATE:=2023-02-28 +PKG_SOURCE_VERSION:=bfe882d5ff4eeebb8f57c8a0f9b9e767a57870d8 CMAKE_INSTALL:=1 PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:= -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 PKG_FLAGS:=nonshared PKG_BUILD_DEPENDS := util-linux @@ -31,7 +31,6 @@ PKG_MAINTAINER:=John Crispin include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk -TARGET_LDFLAGS += $(if $(CONFIG_USE_GLIBC),-lrt) CMAKE_OPTIONS += $(if $(CONFIG_FSTOOLS_UBIFS_EXTROOT),-DCMAKE_UBIFS_EXTROOT=y) CMAKE_OPTIONS += $(if $(CONFIG_FSTOOLS_OVL_MOUNT_FULL_ACCESS_TIME),-DCMAKE_OVL_MOUNT_FULL_ACCESS_TIME=y) CMAKE_OPTIONS += $(if $(CONFIG_FSTOOLS_OVL_MOUNT_COMPRESS_ZLIB),-DCMAKE_OVL_MOUNT_COMPRESS_ZLIB=y) @@ -39,7 +38,7 @@ CMAKE_OPTIONS += $(if $(CONFIG_FSTOOLS_OVL_MOUNT_COMPRESS_ZLIB),-DCMAKE_OVL_MOUN define Package/fstools SECTION:=base CATEGORY:=Base system - DEPENDS:=+ubox +USE_GLIBC:librt +NAND_SUPPORT:ubi-utils + DEPENDS:=+ubox +NAND_SUPPORT:ubi-utils TITLE:=libreCMC filesystem tools MENU:=1 endef diff --git a/package/system/gpio-cdev/nu801/Makefile b/package/system/gpio-cdev/nu801/Makefile new file mode 100644 index 0000000000..67b2a771ec --- /dev/null +++ b/package/system/gpio-cdev/nu801/Makefile @@ -0,0 +1,39 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +include $(TOPDIR)/rules.mk + +PKG_NAME:=nu801 +PKG_RELEASE:=1 + +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://github.com/chunkeey/nu801.git +PKG_SOURCE_VERSION:=f623879a393d0315f29095fe46b19cd2246d10d7 +PKG_MIRROR_HASH:=db21671a1c14f0bfeb65525cbfd0576d2d5bbebf3901e35e64f9bf92a9a53b0d +PKG_MAINTAINER:=Christian Lamparter +PKG_LICENSE:=GPL-3.0-or-later +PKG_LICENSE_FILES:=LICENSE + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/nu801 + SECTION:=utils + CATEGORY:=Utilities + SUBMENU:=Userspace GPIO Drivers + DEPENDS:=@(TARGET_ath79_nand||TARGET_bcm53xx||TARGET_x86) + KCONFIG:=CONFIG_GPIO_CDEV=y + TITLE:=NU801 LED Driver +endef + +define Package/nu801/description +This package contains a userspace driver to power the NUMEN Tech. NU801 LED Driver. +endef + +define Package/nu801/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/nu801 $(1)/usr/sbin/ + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/nu801.init $(1)/etc/init.d/nu801 +endef + +$(eval $(call BuildPackage,nu801)) diff --git a/package/system/gpio-cdev/nu801/files/nu801.init b/package/system/gpio-cdev/nu801/files/nu801.init new file mode 100755 index 0000000000..a29554ae30 --- /dev/null +++ b/package/system/gpio-cdev/nu801/files/nu801.init @@ -0,0 +1,14 @@ +#!/bin/sh /etc/rc.common +# SPDX-License-Identifier: GPL-2.0-or-later + +START=11 + +boot() { + . /lib/functions.sh + /usr/sbin/nu801 "$(board_name)" + + # Because this is a userspace driver, we need to trigger diag.sh after + # we start the driver, but before boot is complete so we blink. + . /etc/diag.sh + set_state preinit_regular +} diff --git a/package/system/iucode-tool/Makefile b/package/system/iucode-tool/Makefile index d7c85b2d42..c2ea37a5c5 100644 --- a/package/system/iucode-tool/Makefile +++ b/package/system/iucode-tool/Makefile @@ -14,6 +14,7 @@ PKG_RELEASE:=2 PKG_SOURCE:=iucode-tool_$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://gitlab.com/iucode-tool/releases/raw/latest PKG_HASH:=12b88efa4d0d95af08db05a50b3dcb217c0eb2bfc67b483779e33d498ddb2f95 +PKG_CPE_ID:=cpe:/a:iucode-tool_project:iucode-tool PKG_BUILD_DEPENDS:=USE_UCLIBC:argp-standalone USE_MUSL:argp-standalone HOST_BUILD_DEPENDS:=HOST_OS_MACOS:argp-standalone/host diff --git a/package/system/iucode-tool/patches/001-iucode_tool-add-missing-limits.h-for-USE_CPUID_DEVIC.patch b/package/system/iucode-tool/patches/001-iucode_tool-add-missing-limits.h-for-USE_CPUID_DEVIC.patch new file mode 100644 index 0000000000..ef9e5ab2f8 --- /dev/null +++ b/package/system/iucode-tool/patches/001-iucode_tool-add-missing-limits.h-for-USE_CPUID_DEVIC.patch @@ -0,0 +1,29 @@ +From e1137cdafc97c0a8b2a0717a771823f3c4320087 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Tue, 29 Nov 2022 19:37:03 +0100 +Subject: [PATCH] iucode_tool: add missing limits.h for USE_CPUID_DEVICE + +If USE_CPUID_DEVICE is enabled, compilation fails for missing define. +Add the missing include to fix compilation error with USE_CPUID_DEVICE +define. + +Signed-off-by: Christian Marangi +--- + iucode_tool.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/iucode_tool.c b/iucode_tool.c +index 4bba5db..0246035 100644 +--- a/iucode_tool.c ++++ b/iucode_tool.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + #include + #include + #include +-- +2.37.2 + diff --git a/package/system/librecmc-keyring/Makefile b/package/system/librecmc-keyring/Makefile old mode 100755 new mode 100644 diff --git a/package/system/mtd/Makefile b/package/system/mtd/Makefile index 2ab4193ed2..df60f8eeda 100644 --- a/package/system/mtd/Makefile +++ b/package/system/mtd/Makefile @@ -18,6 +18,7 @@ PKG_LICENSE:=GPL-2.0+ PKG_LICENSE_FILES:= PKG_FLAGS:=nonshared +PKG_BUILD_FLAGS:=lto include $(INCLUDE_DIR)/package.mk @@ -36,8 +37,7 @@ endef target=$(firstword $(subst -, ,$(BOARD))) MAKE_FLAGS += TARGET="$(target)" -TARGET_CFLAGS += -Dtarget_$(target)=1 -Wall -flto -TARGET_LDFLAGS += -flto=jobserver +TARGET_CFLAGS += -Dtarget_$(target)=1 -Wall ifdef CONFIG_MTD_REDBOOT_PARTS MAKE_FLAGS += FIS_SUPPORT=1 diff --git a/package/system/openwrt-keyring/Makefile b/package/system/openwrt-keyring/Makefile index 7903c3cd37..2d00729b68 100644 --- a/package/system/openwrt-keyring/Makefile +++ b/package/system/openwrt-keyring/Makefile @@ -3,7 +3,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=openwrt-keyring -PKG_RELEASE:=3 +PKG_RELEASE:=2 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/keyring.git @@ -32,8 +32,8 @@ Build/Compile= define Package/openwrt-keyring/install $(INSTALL_DIR) $(1)/etc/opkg/keys/ - # Public usign key for 22.03 release builds - $(INSTALL_DATA) $(PKG_BUILD_DIR)/usign/4d017e6f1ed5d616 $(1)/etc/opkg/keys/ + # Public usign key for unattended snapshot builds + $(INSTALL_DATA) $(PKG_BUILD_DIR)/usign/b5043e70f9a75cde $(1)/etc/opkg/keys/ endef $(eval $(call BuildPackage,openwrt-keyring)) diff --git a/package/system/opkg/Makefile b/package/system/opkg/Makefile index f73ad06054..589e54954a 100644 --- a/package/system/opkg/Makefile +++ b/package/system/opkg/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=opkg -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=2 PKG_FLAGS:=essential PKG_SOURCE_PROTO:=git @@ -28,6 +28,8 @@ PKG_CONFIG_DEPENDS += \ HOST_BUILD_DEPENDS:=libubox/host +PKG_BUILD_FLAGS:=gc-sections + include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/cmake.mk @@ -57,7 +59,6 @@ define Package/opkg/conffiles /etc/opkg/customfeeds.conf endef -TARGET_CFLAGS += -ffunction-sections -fdata-sections EXTRA_CFLAGS += $(TARGET_CPPFLAGS) CMAKE_OPTIONS += \ diff --git a/package/system/procd/Makefile b/package/system/procd/Makefile index 6e4ff592ed..9fa3df3938 100644 --- a/package/system/procd/Makefile +++ b/package/system/procd/Makefile @@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=procd -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=2 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/procd.git -PKG_MIRROR_HASH:=0d9b82919492e1ec0df4011b932a210b6256774d0cb1f1e3de24b6dbf36c6a77 -PKG_SOURCE_DATE:=2022-06-01 -PKG_SOURCE_VERSION:=7a0096853594874d4c60266ec338ac23728017df +PKG_MIRROR_HASH:=a7e42525ae65eb1342e593a714e88bc59e46467cbb5a7fd7d7aca4a9815b7c0d +PKG_SOURCE_DATE:=2023-06-25 +PKG_SOURCE_VERSION:=2db836553e8fc318143b38dbc6e12b8625cf5c33 CMAKE_INSTALL:=1 PKG_LICENSE:=GPL-2.0 @@ -22,6 +22,7 @@ PKG_LICENSE_FILES:= PKG_MAINTAINER:=John Crispin +PKG_BUILD_FLAGS:=lto PKG_ASLR_PIE_REGULAR:=1 PKG_CONFIG_DEPENDS:= \ CONFIG_TARGET_INIT_PATH CONFIG_KERNEL_SECCOMP CONFIG_PROCD_SHOW_BOOT \ @@ -35,15 +36,11 @@ ifeq ($(DUMP),) endif CMAKE_OPTIONS += -DEARLY_PATH="$(TARGET_INIT_PATH)" -TARGET_LDFLAGS += $(if $(CONFIG_USE_GLIBC),-lrt) - -TARGET_CFLAGS += -flto -TARGET_LDFLAGS += -flto define Package/procd/Default SECTION:=base CATEGORY:=Base system - DEPENDS:=+ubusd +ubus +libjson-script +ubox +USE_GLIBC:librt +libubox \ + DEPENDS:=+ubusd +ubus +libjson-script +ubox +libubox \ +libubus +libblobmsg-json +libjson-c +jshn TITLE:=libreCMC system process manager USERID:=:dialout=20 :audio=29 @@ -55,6 +52,14 @@ define Package/procd CONFLICTS:=procd-selinux endef +define Package/procd-selinux + $(call Package/procd/Default) + DEPENDS += +libselinux + TITLE += with SELinux support + PROVIDES:=procd + VARIANT:=selinux +endef + define Package/procd-ujail SECTION:=base CATEGORY:=Base system @@ -80,7 +85,7 @@ endef define Package/procd/config menu "Configuration" - depends on PACKAGE_procd + depends on PACKAGE_procd || PACKAGE_procd-selinux config PROCD_SHOW_BOOT bool @@ -90,6 +95,10 @@ config PROCD_SHOW_BOOT endmenu endef +ifeq ($(BUILD_VARIANT),selinux) + CMAKE_OPTIONS += -DSELINUX=1 +endif + ifeq ($(CONFIG_PROCD_SHOW_BOOT),y) CMAKE_OPTIONS += -DSHOW_BOOT_ON_CONSOLE=1 endif @@ -112,6 +121,8 @@ define Package/procd/install $(INSTALL_BIN) ./files/service $(1)/sbin/service endef +Package/procd-selinux/install = $(Package/procd/install) + define Package/procd-ujail/install $(INSTALL_DIR) $(1)/sbin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ujail $(1)/sbin/ @@ -137,6 +148,7 @@ define Package/uxc/install endef $(eval $(call BuildPackage,procd)) +$(eval $(call BuildPackage,procd-selinux)) $(eval $(call BuildPackage,procd-ujail)) $(eval $(call BuildPackage,procd-seccomp)) $(eval $(call BuildPackage,uxc)) diff --git a/package/system/procd/files/hotplug.json b/package/system/procd/files/hotplug.json index b930b307a4..9fecddae6b 100644 --- a/package/system/procd/files/hotplug.json +++ b/package/system/procd/files/hotplug.json @@ -11,6 +11,7 @@ [ "eq", "DEVNAME", "null" ], [ [ "makedev", "/dev/%DEVNAME%", "0666" ], + [ "exec", "/bin/ln", "-s", "/proc/self/fd", "/dev/fd" ], [ "exec", "/bin/ln", "-s", "/proc/self/fd/0", "/dev/stdin" ], [ "exec", "/bin/ln", "-s", "/proc/self/fd/1", "/dev/stdout" ], [ "exec", "/bin/ln", "-s", "/proc/self/fd/2", "/dev/stderr" ], diff --git a/package/system/refpolicy/Makefile b/package/system/refpolicy/Makefile new file mode 100644 index 0000000000..a431770955 --- /dev/null +++ b/package/system/refpolicy/Makefile @@ -0,0 +1,80 @@ +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=refpolicy +PKG_VERSION:=2.20200229 +PKG_RELEASE:=3 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL:=https://github.com/SELinuxProject/refpolicy/releases/download/RELEASE_2_20200229 +PKG_HASH:=dec854512ed00cd057408f330c2cea4de7a4405f7a147458f59c994bf578e4b0 +PKG_INSTALL:=1 +PKG_BUILD_DEPENDS:=checkpolicy/host policycoreutils/host + +PKG_MAINTAINER:=Thomas Petazzoni +PKG_CPE_ID:=cpe:/a:tresys:refpolicy +PKG_LICENSE:=GPL-2.0-or-later +PKG_LICENSE_FILES:=COPYING + +TAR_OPTIONS:=--transform='s%^refpolicy%$(PKG_NAME)-$(PKG_VERSION)%' -xf - + +include $(INCLUDE_DIR)/package.mk + +define Package/refpolicy + SECTION:=system + CATEGORY:=Base system + TITLE:=SELinux reference policy + URL:=http://selinuxproject.org/page/Main_Page + PKGARCH:=all +endef + +define Package/refpolicy/description + The SELinux Reference Policy project (refpolicy) is a + complete SELinux policy that can be used as the system + policy for a variety of systems and used as the basis for + creating other policies. Reference Policy was originally + based on the NSA example policy, but aims to accomplish many + additional goals. + + The current refpolicy does not fully support OpenWRT and + needs modifications to work with the default system file + layout. These changes should be added as patches to the + refpolicy that modify a single SELinux policy. + + The refpolicy works for the most part in permissive + mode. Only the basic set of utilities are enabled in the + example policy config and some of the pathing in the + policies is not correct. Individual policies would need to + be tweaked to get everything functioning properly. +endef + +# Yes, we want CC=$(HOSTCC) because the only code that checkpolicy +# builds is a small host tool that gets run as part of the build +# process. +MAKE_FLAGS += \ + SETFILES="$(STAGING_DIR_HOST)/bin/setfiles" \ + CHECKPOLICY="$(STAGING_DIR_HOSTPKG)/bin/checkpolicy" \ + CC="$(HOSTCC)" \ + CFLAGS="$(HOST_CFLAGS)" + +define Build/Configure + $(SED) "/MONOLITHIC/c\MONOLITHIC = y" $(PKG_BUILD_DIR)/build.conf + $(SED) "/NAME/c\NAME = targeted" $(PKG_BUILD_DIR)/build.conf + $(call Build/Compile/Default,conf) +endef + +define Package/refpolicy/conffiles +/etc/selinux/config +endef + +define Package/refpolicy/install + $(INSTALL_DIR) $(1)/etc/selinux + $(CP) $(PKG_INSTALL_DIR)/etc/selinux/* $(1)/etc/selinux/ + $(CP) ./files/selinux-config $(1)/etc/selinux/config +endef + +$(eval $(call BuildPackage,refpolicy)) diff --git a/package/system/refpolicy/files/selinux-config b/package/system/refpolicy/files/selinux-config new file mode 100644 index 0000000000..2ae174d297 --- /dev/null +++ b/package/system/refpolicy/files/selinux-config @@ -0,0 +1,7 @@ +# This file controls the state of SELinux on the system. +# SELINUX= can take one of these three values: +# enforcing - SELinux security policy is enforced. +# permissive - SELinux prints warnings instead of enforcing. +# disabled - No SELinux policy is loaded. +SELINUX=permissive +SELINUXTYPE=targeted diff --git a/package/system/refpolicy/patches/100-no-docs.patch b/package/system/refpolicy/patches/100-no-docs.patch new file mode 100644 index 0000000000..21767951a4 --- /dev/null +++ b/package/system/refpolicy/patches/100-no-docs.patch @@ -0,0 +1,12 @@ +Index: refpolicy-2.20200229/Makefile +=================================================================== +--- refpolicy-2.20200229.orig/Makefile ++++ refpolicy-2.20200229/Makefile +@@ -648,6 +648,6 @@ ifneq ($(generated_fc),) + endif + endif + +-.PHONY: install-src install-appconfig install-headers generate xml conf html bare tags ++.PHONY: install-src install-appconfig install-headers generate conf bare tags + .SUFFIXES: + .SUFFIXES: .c diff --git a/package/system/rpcd/Makefile b/package/system/rpcd/Makefile index 0347e18d4f..8a416f299e 100644 --- a/package/system/rpcd/Makefile +++ b/package/system/rpcd/Makefile @@ -12,9 +12,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/rpcd.git -PKG_MIRROR_HASH:=18137fa6904b1a7aec03a16a4c25fd9b9689b24ee14d431bacdda9f093339071 -PKG_SOURCE_DATE:=2022-09-21 -PKG_SOURCE_VERSION:=8c852b656bf1622dee1ae2cfa4c083f730c1c539 +PKG_MIRROR_HASH:=76467ff072b50190f93d071b7792ade7c717674397a2547e995a8f819a48954e +PKG_SOURCE_DATE:=2023-07-01 +PKG_SOURCE_VERSION:=c07ab2f91061ad64209e9aaa1fb1b77061a1af25 PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=ISC @@ -68,8 +68,9 @@ endef # 1: plugin name -# 2: extra dependencies +# 2: additional dependencies # 3: plugin title/description +# 4: extra dependencies define BuildPlugin PKG_CONFIG_DEPENDS += CONFIG_PACKAGE_rpcd-mod-$(1) @@ -78,6 +79,7 @@ define BuildPlugin $(Package/rpcd/default) TITLE+= ($(1) plugin) DEPENDS+=rpcd $(2) + EXTRA_DEPENDS:=$(4) endef define Package/rpcd-mod-$(1)/description @@ -101,5 +103,5 @@ endef $(eval $(call BuildPackage,rpcd)) $(eval $(call BuildPlugin,file,,Provides ubus calls for file and directory operations.)) $(eval $(call BuildPlugin,rpcsys,,Provides ubus calls for sysupgrade and password changing.)) -$(eval $(call BuildPlugin,iwinfo,+libiwinfo,Provides ubus calls for accessing iwinfo data.)) +$(eval $(call BuildPlugin,iwinfo,+libiwinfo,Provides ubus calls for accessing iwinfo data.,libiwinfo (>= 2023-01-21))) $(eval $(call BuildPlugin,ucode,+libucode,Allows implementing plugins using ucode scripts.)) diff --git a/package/system/selinux-policy/Makefile b/package/system/selinux-policy/Makefile new file mode 100644 index 0000000000..933522b33e --- /dev/null +++ b/package/system/selinux-policy/Makefile @@ -0,0 +1,54 @@ +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=selinux-policy +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://git.defensec.nl/selinux-policy.git +PKG_VERSION:=1.2.5 +PKG_MIRROR_HASH:=81ac6e31d2f1febddbe594f3578a9c40444fc0e349075ab6abd3d3ee014a988e +PKG_SOURCE_VERSION:=v$(PKG_VERSION) +PKG_BUILD_DEPENDS:=secilc/host policycoreutils/host + +PKG_MAINTAINER:=Dominick Grift +PKG_CPE_ID:=cpe:/a:defensec:selinux-policy +PKG_LICENSE:=Unlicense +PKG_LICENSE_FILES:=LICENSE + +include $(INCLUDE_DIR)/package.mk + +define Package/selinux-policy + SECTION:=system + CATEGORY:=Base system + TITLE:=SELinux security policy for libreCMC + URL:=https://git.defensec.nl/?p=selinux-policy.git;a=summary + PKGARCH:=all +endef + +define Package/selinux-policy/description + Basic SELinux Security Policy designed specifically for + libreCMC and written in Common Intermediate Language. +endef + +define Build/Compile + $(call Build/Compile/Default,policy) +endef + +define Package/selinux-policy/conffiles +/etc/selinux/config +endef + +define Package/selinux-policy/install + $(INSTALL_DIR) $(1)/etc/selinux/$(PKG_NAME)/contexts/files/ + $(INSTALL_DIR) $(1)/etc/selinux/$(PKG_NAME)/policy/ + $(INSTALL_DATA) $(PKG_BUILD_DIR)/customizable_types $(1)/etc/selinux/$(PKG_NAME)/contexts/ + $(INSTALL_DATA) $(PKG_BUILD_DIR)/file_contexts.subs_dist $(1)/etc/selinux/$(PKG_NAME)/contexts/files/ + $(INSTALL_DATA) $(PKG_BUILD_DIR)/file_contexts $(1)/etc/selinux/$(PKG_NAME)/contexts/files/ + $(INSTALL_CONF) $(PKG_BUILD_DIR)/policy.* $(1)/etc/selinux/$(PKG_NAME)/policy/ + $(INSTALL_DATA) ./files/selinux-config $(1)/etc/selinux/config +endef + +$(eval $(call BuildPackage,selinux-policy)) diff --git a/package/system/selinux-policy/files/selinux-config b/package/system/selinux-policy/files/selinux-config new file mode 100644 index 0000000000..ae5188a839 --- /dev/null +++ b/package/system/selinux-policy/files/selinux-config @@ -0,0 +1,2 @@ +SELINUX=enforcing +SELINUXTYPE=selinux-policy diff --git a/package/system/ubox/Makefile b/package/system/ubox/Makefile index 0ee71e0c09..f80630293e 100644 --- a/package/system/ubox/Makefile +++ b/package/system/ubox/Makefile @@ -5,9 +5,9 @@ PKG_RELEASE:=2 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/ubox.git -PKG_SOURCE_DATE:=2021-08-03 -PKG_SOURCE_VERSION:=205defb597295a4a8966db3e618cfe41a29bed99 -PKG_MIRROR_HASH:=22da1601424c13af8751424b4216f32910a26da49408b6f309158ed8cee93034 +PKG_SOURCE_DATE:=2022-08-13 +PKG_SOURCE_VERSION:=4c7b720b9c63b826fb9404e454ae54f2ef5649d5 +PKG_MIRROR_HASH:=35178148034dfef36c5fda2bc8217617920bc1a3b86f72efbe87e85048a6a2a8 CMAKE_INSTALL:=1 PKG_LICENSE:=GPL-2.0 @@ -18,12 +18,10 @@ PKG_MAINTAINER:=John Crispin include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk -TARGET_LDFLAGS += $(if $(CONFIG_USE_GLIBC),-lrt) - define Package/ubox SECTION:=base CATEGORY:=Base system - DEPENDS:=+libubox +ubusd +ubus +libubus +libuci +USE_GLIBC:librt + DEPENDS:=+libubox +ubusd +ubus +libubus +libuci TITLE:=libreCMC system helper toolbox ALTERNATIVES:=\ 100:/sbin/rmmod:/sbin/kmodloader \ @@ -33,6 +31,10 @@ define Package/ubox 100:/sbin/modprobe:/sbin/kmodloader endef +define Package/ubox/conffiles +/etc/modules.conf +endef + define Package/getrandom SECTION:=base CATEGORY:=Base system @@ -42,7 +44,7 @@ endef define Package/logd SECTION:=base CATEGORY:=Base system - DEPENDS:=+libubox +libubus +libblobmsg-json +USE_GLIBC:librt + DEPENDS:=+libubox +libubus +libblobmsg-json TITLE:=libreCMC system log implementation USERID:=logd=514:logd=514 endef @@ -53,10 +55,11 @@ define Package/getrandom/install endef define Package/ubox/install - $(INSTALL_DIR) $(1)/sbin $(1)/usr/sbin $(1)/lib $(1)/usr/bin + $(INSTALL_DIR) $(1)/sbin $(1)/usr/sbin $(1)/lib $(1)/usr/bin $(1)/etc $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/{kmodloader,validate_data} $(1)/sbin/ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libvalidate.so $(1)/lib + $(INSTALL_DATA) ./files/modules.conf $(1)/etc/modules.conf endef define Package/logd/install diff --git a/package/system/ubox/files/modules.conf b/package/system/ubox/files/modules.conf new file mode 100644 index 0000000000..f54345fe4f --- /dev/null +++ b/package/system/ubox/files/modules.conf @@ -0,0 +1,3 @@ +# examples: +# options mod1 option=val +# blacklist mod2 diff --git a/package/system/ubus/Makefile b/package/system/ubus/Makefile index 41575b4eb9..eee84e4a3b 100644 --- a/package/system/ubus/Makefile +++ b/package/system/ubus/Makefile @@ -5,9 +5,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/ubus.git -PKG_SOURCE_DATE:=2022-06-01 -PKG_SOURCE_VERSION:=2bebf93cd3343fe49f22a05ef935e460d2d44f67 -PKG_MIRROR_HASH:=4efd873928089c086bbac02f3ca5bae55904500b6e6f1c4c377181a00b67147f +PKG_SOURCE_DATE:=2023-06-05 +PKG_SOURCE_VERSION:=f787c97b34894a38b15599886cacbca01271684f +PKG_MIRROR_HASH:=f4e898eb9207f069652f1767835f6aa9f015df2282d51e50ab57a0c3736f36e3 PKG_ABI_VERSION:=$(call abi_version_str,$(PKG_SOURCE_DATE)) CMAKE_INSTALL:=1 @@ -15,6 +15,7 @@ PKG_LICENSE:=LGPL-2.1 PKG_LICENSE_FILES:= PKG_MAINTAINER:=Felix Fietkau +PKG_BUILD_FLAGS:=lto PKG_ASLR_PIE_REGULAR:=1 include $(INCLUDE_DIR)/package.mk @@ -50,8 +51,7 @@ define Package/libubus-lua TITLE:=Lua binding for the libreCMC RPC client endef -TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include -flto -TARGET_LDFLAGS += -flto +TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include CMAKE_OPTIONS += \ -DLUAPATH=/usr/lib/lua \ diff --git a/package/system/uci/Makefile b/package/system/uci/Makefile index e2e5ee6038..6d35ba90c8 100644 --- a/package/system/uci/Makefile +++ b/package/system/uci/Makefile @@ -9,13 +9,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=uci -PKG_RELEASE:=6 +PKG_RELEASE:=1 PKG_SOURCE_URL=$(PROJECT_GIT)/uci.git PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE=2021-10-22 -PKG_SOURCE_VERSION:=f84f49f00fb70364f58b4cce72f1796a7190d370 -PKG_MIRROR_HASH:=9f4747a029976b43fcea9919643ce71e587e515edc21b280163f7262360d847f +PKG_SOURCE_DATE=2023-08-10 +PKG_SOURCE_VERSION:=5781664d5087ccc4b5ab58505883231212dbedbc +PKG_MIRROR_HASH:=2d60a8543fa00cfc75df6417354b004abf58f672c91bf0a3bffe3ea1dbf84a4b PKG_LICENSE:=LGPL-2.1 PKG_LICENSE_FILES:= diff --git a/package/system/urngd/Makefile b/package/system/urngd/Makefile index f01a31213e..a3c58c68d6 100644 --- a/package/system/urngd/Makefile +++ b/package/system/urngd/Makefile @@ -5,9 +5,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/urngd.git -PKG_SOURCE_DATE:=2020-01-21 -PKG_SOURCE_VERSION:=c7f7b6b65b82eda4675b42d8cd28d76ea7aebf1a -PKG_MIRROR_HASH:=2d31025b79fe130c579d6c3f4bf4dc12abc43a7319b20a5cdca24ae363ec70f3 +PKG_SOURCE_DATE:=2023-11-01 +PKG_SOURCE_VERSION:=44365eb1e1165f2a44cb31f404b04cf85031718e +PKG_MIRROR_HASH:=743bdfacf1f1e779047a55fe8f388aaf31f6e55e8a4d0a00fcabffb68af2202e PKG_LICENSE:=GPL-2.0 BSD-3-Clause PKG_LICENSE_FILES:= diff --git a/package/system/usign/Makefile b/package/system/usign/Makefile index 61166be441..e0996e90c0 100644 --- a/package/system/usign/Makefile +++ b/package/system/usign/Makefile @@ -10,7 +10,7 @@ PKG_SOURCE_VERSION:=f1f65026a94137c91b5466b149ef3ea3f20091e9 PKG_MIRROR_HASH:=3f6569a5e63fdfd032976ac0f79d736d3935101ac1b97fb370514b013c5e6bb6 CMAKE_INSTALL:=1 PKG_CHECK_FORMAT_SECURITY:=1 -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 lto PKG_LICENSE:=ISC PKG_LICENSE_FILES:= @@ -30,9 +30,6 @@ define Package/usign TITLE:=libreCMC signature verification utility endef -TARGET_CFLAGS += -flto -TARGET_LDFLAGS += -flto=jobserver - CMAKE_OPTIONS += \ -DUSE_LIBUBOX=on diff --git a/package/system/zram-swap/Makefile b/package/system/zram-swap/Makefile index d0d1baddd1..6e7e353f6f 100644 --- a/package/system/zram-swap/Makefile +++ b/package/system/zram-swap/Makefile @@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=zram-swap -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=32 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) diff --git a/package/utils/acl/Makefile b/package/utils/acl/Makefile new file mode 100644 index 0000000000..69caa54ed6 --- /dev/null +++ b/package/utils/acl/Makefile @@ -0,0 +1,85 @@ +# +# Copyright (C) 2014-2016 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=acl +PKG_VERSION:=2.3.1 +PKG_RELEASE:=2 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://git.savannah.nongnu.org/cgit/acl.git/snapshot +PKG_HASH:=8cad1182cc5703c3e8bf7a220fc267f146246f088d1ba5dd72d8b02736deedcc +PKG_MAINTAINER:=Maxim Storchak + +PKG_LICENSE:=LGPL-2.1 GPL-2.0 +PKG_LICENSE_FILES:=doc/COPYING doc/COPYING.LGPL + +PKG_INSTALL:=1 +PKG_FIXUP:=autoreconf + +include $(INCLUDE_DIR)/package.mk + +define Package/acl/Default + TITLE:=Access control list (ACL) manipulation + URL:=https://savannah.nongnu.org/projects/acl + SUBMENU:=Filesystem +endef + +define Package/acl/Default/description + Access control list support +endef + +define Package/acl +$(call Package/acl/Default) + SECTION:=utils + CATEGORY:=Utilities + TITLE+=utils + DEPENDS:=+libacl +endef + +define Package/libacl +$(call Package/acl/Default) + SECTION:=libs + CATEGORY:=Libraries + TITLE+=library + DEPENDS:=+libattr +endef + +define Package/libacl/description +$(call Package/acl/Default/description) + This package provides libacl +endef + +define Package/acl/description +$(call Package/acl/Default/description) + This package provides ACL manipulation utilities + - chacl + - getfacl + - setfacl +endef + +CONFIGURE_ARGS += --enable-static --enable-shared + +define Package/acl/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/ +endef + +define Package/libacl/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/ +endef + +define Build/InstallDev + mkdir -p $(1)/usr/include + mkdir -p $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/{include,lib} $(1)/usr/ +endef + +$(eval $(call BuildPackage,acl)) +$(eval $(call BuildPackage,libacl)) diff --git a/package/utils/acl/patches/100-no-gettext_configure.patch b/package/utils/acl/patches/100-no-gettext_configure.patch new file mode 100644 index 0000000000..12f421ae2a --- /dev/null +++ b/package/utils/acl/patches/100-no-gettext_configure.patch @@ -0,0 +1,19 @@ +--- a/configure.ac ++++ b/configure.ac +@@ -33,9 +33,6 @@ AC_SYS_LARGEFILE + AM_PROG_AR + LT_INIT + +-AM_GNU_GETTEXT_VERSION([0.18.2]) +-AM_GNU_GETTEXT([external]) +- + AC_ARG_ENABLE([debug], + [AS_HELP_STRING([--enable-debug], [Enable extra debugging])]) + AS_IF([test "x$enable_debug" = "xyes"], +@@ -67,6 +64,5 @@ AC_CONFIG_COMMANDS([include/sys], + AC_CONFIG_FILES([ + libacl.pc + Makefile +- po/Makefile.in + ]) + AC_OUTPUT diff --git a/package/utils/acl/patches/101-no-gettext_autogen.patch b/package/utils/acl/patches/101-no-gettext_autogen.patch new file mode 100644 index 0000000000..e9a8c8c3f2 --- /dev/null +++ b/package/utils/acl/patches/101-no-gettext_autogen.patch @@ -0,0 +1,7 @@ +--- a/autogen.sh ++++ b/autogen.sh +@@ -1,4 +1,2 @@ + #!/bin/sh -ex +-po/update-potfiles +-autopoint --force + exec autoreconf -f -i diff --git a/package/utils/acl/patches/102-no-gettext_Makefile.patch b/package/utils/acl/patches/102-no-gettext_Makefile.patch new file mode 100644 index 0000000000..4d562b9728 --- /dev/null +++ b/package/utils/acl/patches/102-no-gettext_Makefile.patch @@ -0,0 +1,11 @@ +--- a/Makefile.am ++++ b/Makefile.am +@@ -3,8 +3,6 @@ ACLOCAL_AMFLAGS = -I m4 + EXTRA_DIST = \ + exports + +-SUBDIRS = po +- + AM_CPPFLAGS = \ + -I$(top_builddir)/include \ + -I$(top_srcdir)/include \ diff --git a/package/utils/acl/patches/103-chacl-Use-portable-version-of-dirent-and-readdir.patch b/package/utils/acl/patches/103-chacl-Use-portable-version-of-dirent-and-readdir.patch new file mode 100644 index 0000000000..66bd86c64e --- /dev/null +++ b/package/utils/acl/patches/103-chacl-Use-portable-version-of-dirent-and-readdir.patch @@ -0,0 +1,33 @@ +From 2b42f64737adf6a2ddd491213580d6e9cdd2f5af Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Thu, 10 Nov 2022 18:04:15 -0800 +Subject: [PATCH] chacl: Use portable version of dirent and readdir + +Using 64bit versions on 32bit architectures should be enabled with +--enable-largefile, this makes it portable across musl and glibc + +Signed-off-by: Khem Raj +--- + tools/chacl.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/tools/chacl.c ++++ b/tools/chacl.c +@@ -320,7 +320,7 @@ walk_dir(acl_t acl, acl_t dacl, const ch + { + int failed = 0; + DIR *dir; +- struct dirent64 *d; ++ struct dirent *d; + char *name; + + if ((dir = opendir(fname)) == NULL) { +@@ -332,7 +332,7 @@ walk_dir(acl_t acl, acl_t dacl, const ch + return(0); /* got a file, not an error */ + } + +- while ((d = readdir64(dir)) != NULL) { ++ while ((d = readdir(dir)) != NULL) { + /* skip "." and ".." entries */ + if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) + continue; diff --git a/package/utils/adb/Makefile b/package/utils/adb/Makefile index 0482a40da1..c207c333b2 100644 --- a/package/utils/adb/Makefile +++ b/package/utils/adb/Makefile @@ -13,6 +13,7 @@ PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION) PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.xz PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR) PKG_MAINTAINER:=Henryk Heisig +PKG_CPE_ID:=cpe:/a:google:android_debug_bridge include $(INCLUDE_DIR)/package.mk diff --git a/package/utils/attr/Makefile b/package/utils/attr/Makefile index 88ca5c19f5..e23740f71f 100644 --- a/package/utils/attr/Makefile +++ b/package/utils/attr/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=attr PKG_VERSION:=2.5.1 -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=http://git.savannah.nongnu.org/cgit/attr.git/snapshot diff --git a/package/utils/bcm4908img/Makefile b/package/utils/bcm4908img/Makefile deleted file mode 100644 index fbb91fba73..0000000000 --- a/package/utils/bcm4908img/Makefile +++ /dev/null @@ -1,54 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only - -include $(TOPDIR)/rules.mk - -PKG_NAME:=bcm4908img -PKG_RELEASE:=3 - -PKG_FLAGS:=nonshared - -PKG_BUILD_DEPENDS := bcm4908img/host - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/host-build.mk - -define Package/bcm4908img - SECTION:=utils - CATEGORY:=Base system - TITLE:=Utility handling BCM4908 images - MAINTAINER:=Rafał Miłecki - DEPENDS:=@TARGET_bcm4908 -endef - -define Package/bcm4908img/description - CFE bootloader for BCM4908 uses custom image format. It consists of: - 1. Optional cferom image - 2. bootfs JFFS2 partition (cferam, kernel, DTB and optional helper files) - 3. padding - 4. rootfs simply appended to the bootfs + padding - 5. tail with checksum and basic device info - - This util allows creating, modifying and extracting from BCM4908 images. -endef - -define Host/Prepare - $(CP) ./src/* $(HOST_BUILD_DIR) -endef - -define Build/Compile - $(MAKE) -C $(PKG_BUILD_DIR) \ - CC="$(TARGET_CC)" \ - CFLAGS="$(TARGET_CFLAGS) -Wall" -endef - -define Package/bcm4908img/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/bcm4908img $(1)/usr/bin/ -endef - -define Host/Install - $(INSTALL_BIN) $(HOST_BUILD_DIR)/bcm4908img $(STAGING_DIR_HOST)/bin/ -endef - -$(eval $(call BuildPackage,bcm4908img)) -$(eval $(call HostBuild)) diff --git a/package/utils/bcm4908img/src/Makefile b/package/utils/bcm4908img/src/Makefile deleted file mode 100644 index 72f8e30d68..0000000000 --- a/package/utils/bcm4908img/src/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: bcm4908img - -bcm4908img: - $(CC) $(CFLAGS) -o $@ bcm4908img.c -Wall - -clean: - rm -f bcm4908img diff --git a/package/utils/bcm4908img/src/bcm4908img.c b/package/utils/bcm4908img/src/bcm4908img.c deleted file mode 100644 index 240fe895d9..0000000000 --- a/package/utils/bcm4908img/src/bcm4908img.c +++ /dev/null @@ -1,1022 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * Copyright (C) 2021 Rafał Miłecki - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if !defined(__BYTE_ORDER) -#error "Unknown byte order" -#endif - -#if __BYTE_ORDER == __BIG_ENDIAN -#define cpu_to_le32(x) bswap_32(x) -#define le32_to_cpu(x) bswap_32(x) -#define cpu_to_be32(x) (x) -#define be32_to_cpu(x) (x) -#define cpu_to_le16(x) bswap_16(x) -#define le16_to_cpu(x) bswap_16(x) -#define cpu_to_be16(x) (x) -#define be16_to_cpu(x) (x) -#elif __BYTE_ORDER == __LITTLE_ENDIAN -#define cpu_to_le32(x) (x) -#define le32_to_cpu(x) (x) -#define cpu_to_be32(x) bswap_32(x) -#define be32_to_cpu(x) bswap_32(x) -#define cpu_to_le16(x) (x) -#define le16_to_cpu(x) (x) -#define cpu_to_be16(x) bswap_16(x) -#define be16_to_cpu(x) bswap_16(x) -#else -#error "Unsupported endianness" -#endif - -#define WFI_VERSION 0x00005732 -#define WFI_VERSION_NAND_1MB_DATA 0x00005731 - -#define WFI_NOR_FLASH 1 -#define WFI_NAND16_FLASH 2 -#define WFI_NAND128_FLASH 3 -#define WFI_NAND256_FLASH 4 -#define WFI_NAND512_FLASH 5 -#define WFI_NAND1024_FLASH 6 -#define WFI_NAND2048_FLASH 7 - -#define WFI_FLAG_HAS_PMC 0x1 -#define WFI_FLAG_SUPPORTS_BTRM 0x2 - -#define UBI_EC_HDR_MAGIC 0x55424923 - -static int debug; - -struct bcm4908img_tail { - uint32_t crc32; - uint32_t version; - uint32_t chip_id; - uint32_t flash_type; - uint32_t flags; -}; - -/** - * struct bcm4908img_info - info about BCM4908 image - * - * Standard BCM4908 image consists of: - * 1. (Optional) vedor header - * 2. (Optional) cferom - * 3. bootfs ─┐ - * 4. padding ├─ firmware - * 5. rootfs ─┘ - * 6. BCM4908 tail - * 7. (Optional) vendor tail - */ -struct bcm4908img_info { - size_t cferom_offset; - size_t bootfs_offset; - size_t padding_offset; - size_t rootfs_offset; - size_t tail_offset; - uint32_t crc32; /* Calculated checksum */ - struct bcm4908img_tail tail; -}; - -char *pathname; - -static inline size_t bcm4908img_min(size_t x, size_t y) { - return x < y ? x : y; -} - -/************************************************** - * CRC32 - **************************************************/ - -static const uint32_t crc32_tbl[] = { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, - 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, - 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, - 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, - 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, - 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, - 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, - 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, - 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, - 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, - 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, - 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, - 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, - 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, - 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, - 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, - 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, - 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, - 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, - 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, - 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, - 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, - 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, - 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, - 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, - 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, - 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, - 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, - 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, - 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, - 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, - 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, - 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, - 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, - 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, -}; - -uint32_t bcm4908img_crc32(uint32_t crc, const void *buf, size_t len) { - const uint8_t *in = buf; - - while (len) { - crc = crc32_tbl[(crc ^ *in) & 0xff] ^ (crc >> 8); - in++; - len--; - } - - return crc; -} - -/************************************************** - * Helpers - **************************************************/ - -static FILE *bcm4908img_open(const char *pathname, const char *mode) { - struct stat st; - - if (pathname) - return fopen(pathname, mode); - - if (isatty(fileno(stdin))) { - fprintf(stderr, "Reading from TTY stdin is unsupported\n"); - return NULL; - } - - if (fstat(fileno(stdin), &st)) { - fprintf(stderr, "Failed to fstat stdin: %d\n", -errno); - return NULL; - } - - if (S_ISFIFO(st.st_mode)) { - fprintf(stderr, "Reading from pipe stdin is unsupported\n"); - return NULL; - } - - return stdin; -} - -static void bcm4908img_close(FILE *fp) { - if (fp != stdin) - fclose(fp); -} - -static int bcm4908img_calc_crc32(FILE *fp, struct bcm4908img_info *info) { - uint8_t buf[1024]; - size_t length; - size_t bytes; - - /* Start with cferom (or bootfs) - skip vendor header */ - fseek(fp, info->cferom_offset, SEEK_SET); - - info->crc32 = 0xffffffff; - length = info->tail_offset - info->cferom_offset; - while (length && (bytes = fread(buf, 1, bcm4908img_min(sizeof(buf), length), fp)) > 0) { - info->crc32 = bcm4908img_crc32(info->crc32, buf, bytes); - length -= bytes; - } - if (length) { - fprintf(stderr, "Failed to read last %zd B of data\n", length); - return -EIO; - } - - return 0; -} - -/************************************************** - * Existing firmware parser - **************************************************/ - -struct chk_header { - uint32_t magic; - uint32_t header_len; - uint8_t reserved[8]; - uint32_t kernel_chksum; - uint32_t rootfs_chksum; - uint32_t kernel_len; - uint32_t rootfs_len; - uint32_t image_chksum; - uint32_t header_chksum; - char board_id[0]; -}; - -struct linksys_tail { - char magic[9]; - uint8_t version[8]; - char model[15]; - uint32_t crc32; - uint8_t padding[9]; - uint8_t signature[16]; - uint8_t reserved[192]; -}; - -static bool bcm4908img_is_all_ff(const void *buf, size_t length) -{ - const uint8_t *in = buf; - int i; - - for (i = 0; i < length; i++) { - if (in[i] != 0xff) - return false; - } - - return true; -} - -static int bcm4908img_parse(FILE *fp, struct bcm4908img_info *info) { - struct bcm4908img_tail *tail = &info->tail; - struct linksys_tail *linksys; - struct chk_header *chk; - struct stat st; - uint8_t buf[1024]; - size_t file_size; - uint16_t tmp16; - size_t length; - size_t bytes; - int err = 0; - - memset(info, 0, sizeof(*info)); - - /* File size */ - - if (fstat(fileno(fp), &st)) { - err = -errno; - fprintf(stderr, "Failed to fstat: %d\n", err); - return err; - } - file_size = st.st_size; - - info->tail_offset = file_size - sizeof(*tail); - - /* Vendor formats */ - - rewind(fp); - if (fread(buf, 1, sizeof(buf), fp) != sizeof(buf)) { - fprintf(stderr, "Failed to read file header\n"); - return -EIO; - } - chk = (void *)buf; - if (be32_to_cpu(chk->magic) == 0x2a23245e) - info->cferom_offset = be32_to_cpu(chk->header_len); - - fseek(fp, -sizeof(buf), SEEK_END); - if (fread(buf, 1, sizeof(buf), fp) != sizeof(buf)) { - fprintf(stderr, "Failed to read file header\n"); - return -EIO; - } - linksys = (void *)(buf + sizeof(buf) - sizeof(*linksys)); - if (!memcmp(linksys->magic, ".LINKSYS.", sizeof(linksys->magic))) { - info->tail_offset -= sizeof(*linksys); - } - - /* Offsets */ - - for (info->bootfs_offset = info->cferom_offset; - info->bootfs_offset < info->tail_offset; - info->bootfs_offset += 0x20000) { - if (fseek(fp, info->bootfs_offset, SEEK_SET)) { - err = -errno; - fprintf(stderr, "Failed to fseek to the 0x%zx\n", info->bootfs_offset); - return err; - } - if (fread(&tmp16, 1, sizeof(tmp16), fp) != sizeof(tmp16)) { - fprintf(stderr, "Failed to read while looking for JFFS2\n"); - return -EIO; - } - if (be16_to_cpu(tmp16) == 0x8519) - break; - } - if (info->bootfs_offset >= info->tail_offset) { - fprintf(stderr, "Failed to find bootfs offset\n"); - return -EPROTO; - } - - for (info->rootfs_offset = info->bootfs_offset; - info->rootfs_offset < info->tail_offset; - info->rootfs_offset += 0x20000) { - uint32_t *magic = (uint32_t *)&buf[0]; - - if (fseek(fp, info->rootfs_offset, SEEK_SET)) { - err = -errno; - fprintf(stderr, "Failed to fseek: %d\n", err); - return err; - } - - length = info->padding_offset ? sizeof(*magic) : 256; - bytes = fread(buf, 1, length, fp); - if (bytes != length) { - fprintf(stderr, "Failed to read %zu bytes\n", length); - return -EIO; - } - - if (!info->padding_offset && bcm4908img_is_all_ff(buf, length)) - info->padding_offset = info->rootfs_offset; - - if (be32_to_cpu(*magic) == UBI_EC_HDR_MAGIC) - break; - } - if (info->rootfs_offset >= info->tail_offset) { - fprintf(stderr, "Failed to find rootfs offset\n"); - return -EPROTO; - } - - /* CRC32 */ - - /* Start with cferom (or bootfs) - skip vendor header */ - fseek(fp, info->cferom_offset, SEEK_SET); - - info->crc32 = 0xffffffff; - length = info->tail_offset - info->cferom_offset; - while (length && (bytes = fread(buf, 1, bcm4908img_min(sizeof(buf), length), fp)) > 0) { - info->crc32 = bcm4908img_crc32(info->crc32, buf, bytes); - length -= bytes; - } - if (length) { - fprintf(stderr, "Failed to read last %zd B of data\n", length); - return -EIO; - } - - /* Tail */ - - if (fread(tail, 1, sizeof(*tail), fp) != sizeof(*tail)) { - fprintf(stderr, "Failed to read BCM4908 image tail\n"); - return -EIO; - } - - /* Standard validation */ - - if (info->crc32 != le32_to_cpu(tail->crc32)) { - fprintf(stderr, "Invalid data crc32: 0x%08x instead of 0x%08x\n", info->crc32, le32_to_cpu(tail->crc32)); - return -EPROTO; - } - - return 0; -} - -/************************************************** - * Info - **************************************************/ - -static int bcm4908img_info(int argc, char **argv) { - struct bcm4908img_info info; - const char *pathname = NULL; - FILE *fp; - int c; - int err = 0; - - while ((c = getopt(argc, argv, "i:")) != -1) { - switch (c) { - case 'i': - pathname = optarg; - break; - } - } - - fp = bcm4908img_open(pathname, "r"); - if (!fp) { - fprintf(stderr, "Failed to open BCM4908 image\n"); - err = -EACCES; - goto out; - } - - err = bcm4908img_parse(fp, &info); - if (err) { - fprintf(stderr, "Failed to parse BCM4908 image\n"); - goto err_close; - } - - if (info.bootfs_offset != info.cferom_offset) - printf("cferom offset:\t%zu\n", info.cferom_offset); - printf("bootfs offset:\t0x%zx\n", info.bootfs_offset); - if (info.padding_offset) - printf("padding offset:\t0x%zx\n", info.padding_offset); - printf("rootfs offset:\t0x%zx\n", info.rootfs_offset); - printf("Checksum:\t0x%08x\n", info.crc32); - -err_close: - bcm4908img_close(fp); -out: - return err; -} - -/************************************************** - * Create - **************************************************/ - -static ssize_t bcm4908img_create_append_file(FILE *trx, const char *in_path, uint32_t *crc32) { - FILE *in; - size_t bytes; - ssize_t length = 0; - uint8_t buf[1024]; - - in = fopen(in_path, "r"); - if (!in) { - fprintf(stderr, "Failed to open %s\n", in_path); - return -EACCES; - } - - while ((bytes = fread(buf, 1, sizeof(buf), in)) > 0) { - if (fwrite(buf, 1, bytes, trx) != bytes) { - fprintf(stderr, "Failed to write %zu B to %s\n", bytes, pathname); - length = -EIO; - break; - } - *crc32 = bcm4908img_crc32(*crc32, buf, bytes); - length += bytes; - } - - fclose(in); - - return length; -} - -static ssize_t bcm4908img_create_append_zeros(FILE *trx, size_t length) { - uint8_t *buf; - - buf = malloc(length); - if (!buf) - return -ENOMEM; - memset(buf, 0, length); - - if (fwrite(buf, 1, length, trx) != length) { - fprintf(stderr, "Failed to write %zu B to %s\n", length, pathname); - free(buf); - return -EIO; - } - - free(buf); - - return length; -} - -static ssize_t bcm4908img_create_align(FILE *trx, size_t cur_offset, size_t alignment) { - if (cur_offset & (alignment - 1)) { - size_t length = alignment - (cur_offset % alignment); - return bcm4908img_create_append_zeros(trx, length); - } - - return 0; -} - -static int bcm4908img_create(int argc, char **argv) { - struct bcm4908img_tail tail = { - .version = cpu_to_le32(WFI_VERSION), - .chip_id = cpu_to_le32(0x4908), - .flash_type = cpu_to_le32(WFI_NAND128_FLASH), - .flags = cpu_to_le32(WFI_FLAG_SUPPORTS_BTRM), - }; - uint32_t crc32 = 0xffffffff; - size_t cur_offset = 0; - ssize_t bytes; - FILE *fp; - int c; - int err = 0; - - if (argc < 3) { - fprintf(stderr, "No BCM4908 image pathname passed\n"); - err = -EINVAL; - goto out; - } - pathname = argv[2]; - - fp = fopen(pathname, "w+"); - if (!fp) { - fprintf(stderr, "Failed to open %s\n", pathname); - err = -EACCES; - goto out; - } - - optind = 3; - while ((c = getopt(argc, argv, "f:a:A:")) != -1) { - switch (c) { - case 'f': - bytes = bcm4908img_create_append_file(fp, optarg, &crc32); - if (bytes < 0) { - fprintf(stderr, "Failed to append file %s\n", optarg); - } else { - cur_offset += bytes; - } - break; - case 'a': - bytes = bcm4908img_create_align(fp, cur_offset, strtol(optarg, NULL, 0)); - if (bytes < 0) - fprintf(stderr, "Failed to append zeros\n"); - else - cur_offset += bytes; - break; - case 'A': - bytes = strtol(optarg, NULL, 0) - cur_offset; - if (bytes < 0) { - fprintf(stderr, "Current BCM4908 image length is 0x%zx, can't pad it with zeros to 0x%lx\n", cur_offset, strtol(optarg, NULL, 0)); - } else { - bytes = bcm4908img_create_append_zeros(fp, bytes); - if (bytes < 0) - fprintf(stderr, "Failed to append zeros\n"); - else - cur_offset += bytes; - } - break; - } - if (err) - goto err_close; - } - - tail.crc32 = cpu_to_le32(crc32); - - bytes = fwrite(&tail, 1, sizeof(tail), fp); - if (bytes != sizeof(tail)) { - fprintf(stderr, "Failed to write BCM4908 image tail to %s\n", pathname); - return -EIO; - } - -err_close: - fclose(fp); -out: - return err; -} - -/************************************************** - * Extract - **************************************************/ - -static int bcm4908img_extract(int argc, char **argv) { - struct bcm4908img_info info; - const char *pathname = NULL; - const char *type = NULL; - uint8_t buf[1024]; - size_t offset; - size_t length; - size_t bytes; - FILE *fp; - int c; - int err = 0; - - while ((c = getopt(argc, argv, "i:t:")) != -1) { - switch (c) { - case 'i': - pathname = optarg; - break; - case 't': - type = optarg; - break; - } - } - - fp = bcm4908img_open(pathname, "r"); - if (!fp) { - fprintf(stderr, "Failed to open BCM4908 image\n"); - err = -EACCES; - goto err_out; - } - - err = bcm4908img_parse(fp, &info); - if (err) { - fprintf(stderr, "Failed to parse BCM4908 image\n"); - goto err_close; - } - - if (!type) { - err = -EINVAL; - fprintf(stderr, "No data to extract specified\n"); - goto err_close; - } else if (!strcmp(type, "cferom")) { - offset = info.cferom_offset; - length = info.bootfs_offset - offset; - if (!length) { - err = -ENOENT; - fprintf(stderr, "This BCM4908 image doesn't contain cferom\n"); - goto err_close; - } - } else if (!strcmp(type, "bootfs")) { - offset = info.bootfs_offset; - length = (info.padding_offset ? info.padding_offset : info.rootfs_offset) - offset; - } else if (!strcmp(type, "rootfs")) { - offset = info.rootfs_offset; - length = info.tail_offset - offset; - } else if (!strcmp(type, "firmware")) { - offset = info.bootfs_offset; - length = info.tail_offset - offset; - } else { - err = -EINVAL; - fprintf(stderr, "Unsupported extract type: %s\n", type); - goto err_close; - } - - if (!length) { - err = -EINVAL; - fprintf(stderr, "Failed to find requested data in input image\n"); - goto err_close; - } - - fseek(fp, offset, SEEK_SET); - while (length && (bytes = fread(buf, 1, bcm4908img_min(sizeof(buf), length), fp)) > 0) { - fwrite(buf, bytes, 1, stdout); - length -= bytes; - } - if (length) { - err = -EIO; - fprintf(stderr, "Failed to read last %zd B of data\n", length); - goto err_close; - } - -err_close: - bcm4908img_close(fp); -err_out: - return err; -} - -/************************************************** - * bootfs - **************************************************/ - -#define JFFS2_MAGIC_BITMASK 0x1985 - -#define JFFS2_COMPR_NONE 0x00 -#define JFFS2_COMPR_ZERO 0x01 -#define JFFS2_COMPR_RTIME 0x02 -#define JFFS2_COMPR_RUBINMIPS 0x03 -#define JFFS2_COMPR_COPY 0x04 -#define JFFS2_COMPR_DYNRUBIN 0x05 -#define JFFS2_COMPR_ZLIB 0x06 -#define JFFS2_COMPR_LZO 0x07 -/* Compatibility flags. */ -#define JFFS2_COMPAT_MASK 0xc000 /* What do to if an unknown nodetype is found */ -#define JFFS2_NODE_ACCURATE 0x2000 -/* INCOMPAT: Fail to mount the filesystem */ -#define JFFS2_FEATURE_INCOMPAT 0xc000 -/* ROCOMPAT: Mount read-only */ -#define JFFS2_FEATURE_ROCOMPAT 0x8000 -/* RWCOMPAT_COPY: Mount read/write, and copy the node when it's GC'd */ -#define JFFS2_FEATURE_RWCOMPAT_COPY 0x4000 -/* RWCOMPAT_DELETE: Mount read/write, and delete the node when it's GC'd */ -#define JFFS2_FEATURE_RWCOMPAT_DELETE 0x0000 - -#define JFFS2_NODETYPE_DIRENT (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 1) - -typedef struct { - uint32_t v32; -} __attribute__((packed)) jint32_t; - -typedef struct { - uint16_t v16; -} __attribute__((packed)) jint16_t; - -struct jffs2_unknown_node -{ - /* All start like this */ - jint16_t magic; - jint16_t nodetype; - jint32_t totlen; /* So we can skip over nodes we don't grok */ - jint32_t hdr_crc; -}; - -struct jffs2_raw_dirent -{ - jint16_t magic; - jint16_t nodetype; /* == JFFS2_NODETYPE_DIRENT */ - jint32_t totlen; - jint32_t hdr_crc; - jint32_t pino; - jint32_t version; - jint32_t ino; /* == zero for unlink */ - jint32_t mctime; - uint8_t nsize; - uint8_t type; - uint8_t unused[2]; - jint32_t node_crc; - jint32_t name_crc; - uint8_t name[0]; -}; - -#define je16_to_cpu(x) ((x).v16) -#define je32_to_cpu(x) ((x).v32) - -static int bcm4908img_bootfs_ls(FILE *fp, struct bcm4908img_info *info) { - struct jffs2_unknown_node node; - struct jffs2_raw_dirent dirent; - size_t offset; - size_t bytes; - int err = 0; - - for (offset = info->bootfs_offset; ; offset += (je32_to_cpu(node.totlen) + 0x03) & ~0x03) { - char name[FILENAME_MAX + 1]; - - if (fseek(fp, offset, SEEK_SET)) { - err = -errno; - fprintf(stderr, "Failed to fseek: %d\n", err); - return err; - } - - bytes = fread(&node, 1, sizeof(node), fp); - if (bytes != sizeof(node)) { - fprintf(stderr, "Failed to read %zu bytes\n", sizeof(node)); - return -EIO; - } - - if (je16_to_cpu(node.magic) != JFFS2_MAGIC_BITMASK) { - break; - } - - if (je16_to_cpu(node.nodetype) != JFFS2_NODETYPE_DIRENT) { - continue; - } - - memcpy(&dirent, &node, sizeof(node)); - bytes += fread((uint8_t *)&dirent + sizeof(node), 1, sizeof(dirent) - sizeof(node), fp); - if (bytes != sizeof(dirent)) { - fprintf(stderr, "Failed to read %zu bytes\n", sizeof(node)); - return -EIO; - } - - if (dirent.nsize + 1 > sizeof(name)) { - /* Keep reading & printing BUT exit with error code */ - fprintf(stderr, "Too long filename\n"); - err = -ENOMEM; - continue; - } - - bytes = fread(name, 1, dirent.nsize, fp); - if (bytes != dirent.nsize) { - fprintf(stderr, "Failed to read filename\n"); - return -EIO; - } - name[bytes] = '\0'; - - printf("%s\n", name); - } - - return err; -} - -static int bcm4908img_bootfs_mv(FILE *fp, struct bcm4908img_info *info, int argc, char **argv) { - struct jffs2_unknown_node node; - struct jffs2_raw_dirent dirent; - const char *oldname; - const char *newname; - size_t offset; - size_t bytes; - int err = -ENOENT; - - if (argc - optind < 2) { - fprintf(stderr, "No enough arguments passed\n"); - return -EINVAL; - } - oldname = argv[optind++]; - newname = argv[optind++]; - - if (strlen(newname) != strlen(oldname)) { - fprintf(stderr, "New filename must have the same length as the old one\n"); - return -EINVAL; - } - - for (offset = info->bootfs_offset; ; offset += (je32_to_cpu(node.totlen) + 0x03) & ~0x03) { - char name[FILENAME_MAX]; - uint32_t crc32; - - if (fseek(fp, offset, SEEK_SET)) { - err = -errno; - fprintf(stderr, "Failed to fseek: %d\n", err); - return err; - } - - bytes = fread(&node, 1, sizeof(node), fp); - if (bytes != sizeof(node)) { - fprintf(stderr, "Failed to read %zu bytes\n", sizeof(node)); - return -EIO; - } - - if (je16_to_cpu(node.magic) != JFFS2_MAGIC_BITMASK) { - break; - } - - if (je16_to_cpu(node.nodetype) != JFFS2_NODETYPE_DIRENT) { - continue; - } - - bytes += fread((uint8_t *)&dirent + sizeof(node), 1, sizeof(dirent) - sizeof(node), fp); - if (bytes != sizeof(dirent)) { - fprintf(stderr, "Failed to read %zu bytes\n", sizeof(node)); - return -EIO; - } - - if (dirent.nsize + 1 > sizeof(name)) { - fprintf(stderr, "Too long filename\n"); - err = -ENOMEM; - continue; - } - - bytes = fread(name, 1, dirent.nsize, fp); - if (bytes != dirent.nsize) { - fprintf(stderr, "Failed to read filename\n"); - return -EIO; - } - name[bytes] = '\0'; - - if (debug) - printf("offset:%08zx name_crc:%04x filename:%s\n", offset, je32_to_cpu(dirent.name_crc), name); - - if (strcmp(name, oldname)) { - continue; - } - - if (fseek(fp, offset + offsetof(struct jffs2_raw_dirent, name_crc), SEEK_SET)) { - err = -errno; - fprintf(stderr, "Failed to fseek: %d\n", err); - return err; - } - crc32 = bcm4908img_crc32(0, newname, dirent.nsize); - bytes = fwrite(&crc32, 1, sizeof(crc32), fp); - if (bytes != sizeof(crc32)) { - fprintf(stderr, "Failed to write new CRC32\n"); - return -EIO; - } - - if (fseek(fp, offset + offsetof(struct jffs2_raw_dirent, name), SEEK_SET)) { - err = -errno; - fprintf(stderr, "Failed to fseek: %d\n", err); - return err; - } - bytes = fwrite(newname, 1, dirent.nsize, fp); - if (bytes != dirent.nsize) { - fprintf(stderr, "Failed to write new filename\n"); - return -EIO; - } - - /* Calculate new BCM4908 image checksum */ - - err = bcm4908img_calc_crc32(fp, info); - if (err) { - fprintf(stderr, "Failed to write new filename\n"); - return err; - } - - info->tail.crc32 = cpu_to_le32(info->crc32); - if (fseek(fp, -sizeof(struct bcm4908img_tail), SEEK_END)) { - err = -errno; - fprintf(stderr, "Failed to write new filename\n"); - return err; - } - - if (fwrite(&info->tail, 1, sizeof(struct bcm4908img_tail), fp) != sizeof(struct bcm4908img_tail)) { - fprintf(stderr, "Failed to write updated tail\n"); - return -EIO; - } - - printf("Successfully renamed %s to the %s\n", oldname, newname); - - return 0; - } - - fprintf(stderr, "Failed to find %s\n", oldname); - - return -ENOENT; -} - -static int bcm4908img_bootfs(int argc, char **argv) { - struct bcm4908img_info info; - const char *pathname = NULL; - const char *mode; - const char *cmd; - FILE *fp; - int c; - int err = 0; - - while ((c = getopt(argc, argv, "i:")) != -1) { - switch (c) { - case 'i': - pathname = optarg; - break; - } - } - - if (argc - optind < 1) { - fprintf(stderr, "No bootfs command specified\n"); - err = -EINVAL; - goto out; - } - cmd = argv[optind++]; - - mode = strcmp(cmd, "mv") ? "r" : "r+"; - fp = bcm4908img_open(pathname, mode); - if (!fp) { - fprintf(stderr, "Failed to open BCM4908 image\n"); - err = -EACCES; - goto out; - } - - err = bcm4908img_parse(fp, &info); - if (err) { - fprintf(stderr, "Failed to parse BCM4908 image\n"); - goto err_close; - } - - if (!strcmp(cmd, "ls")) { - err = bcm4908img_bootfs_ls(fp, &info); - } else if (!strcmp(cmd, "mv")) { - err = bcm4908img_bootfs_mv(fp, &info, argc, argv); - } else { - err = -EINVAL; - fprintf(stderr, "Unsupported bootfs command: %s\n", cmd); - } - -err_close: - bcm4908img_close(fp); -out: - return err; -} - -/************************************************** - * Start - **************************************************/ - -static void usage() { - printf("Usage:\n"); - printf("\n"); - printf("Info about a BCM4908 image:\n"); - printf("\tbcm4908img info \n"); - printf("\t-i \t\t\t\tinput BCM490 image\n"); - printf("\n"); - printf("Creating a new BCM4908 image:\n"); - printf("\tbcm4908img create [options]\n"); - printf("\t-f file\t\t\t\tadd data from specified file\n"); - printf("\t-a alignment\t\t\tpad image with zeros to specified alignment\n"); - printf("\t-A offset\t\t\t\tappend zeros until reaching specified offset\n"); - printf("\n"); - printf("Extracting from a BCM4908 image:\n"); - printf("\tbcm4908img extract \n"); - printf("\t-i \t\t\t\tinput BCM490 image\n"); - printf("\t-t \t\t\t\tone of: cferom, bootfs, rootfs, firmware\n"); - printf("\n"); - printf("Access bootfs in a BCM4908 image:\n"); - printf("\tbcm4908img bootfs \n"); - printf("\t-i \t\t\t\tinput BCM490 image\n"); - printf("\tls\t\t\t\t\tlist bootfs files\n"); - printf("\tmv \t\t\trename bootfs file\n"); -} - -int main(int argc, char **argv) { - if (argc > 1) { - optind++; - if (!strcmp(argv[1], "info")) - return bcm4908img_info(argc, argv); - else if (!strcmp(argv[1], "create")) - return bcm4908img_create(argc, argv); - else if (!strcmp(argv[1], "extract")) - return bcm4908img_extract(argc, argv); - else if (!strcmp(argv[1], "bootfs")) - return bcm4908img_bootfs(argc, argv); - } - - usage(); - return 0; -} diff --git a/package/utils/bsdiff/Makefile b/package/utils/bsdiff/Makefile index db1f320872..d86be2dc0c 100644 --- a/package/utils/bsdiff/Makefile +++ b/package/utils/bsdiff/Makefile @@ -9,15 +9,16 @@ include $(TOPDIR)/rules.mk PKG_NAME:=bsdiff PKG_VERSION:=4.3 -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=http://www.daemonology.net/bsdiff/ +PKG_SOURCE_URL:=https://www.daemonology.net/bsdiff/ PKG_HASH:=18821588b2dc5bf159aa37d3bcb7b885d85ffd1e19f23a0c57a58723fea85f48 PKG_MAINTAINER:=Hauke Mehrtens HOST_BUILD_DEPENDS:=bzip2/host PKG_LICENSE:=BSD-2-Clause +PKG_CPE_ID:=cpe:/a:daemonology:bsdiff include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/package.mk @@ -27,7 +28,7 @@ define Package/bsdiff CATEGORY:=Utilities DEPENDS:=+libbz2 TITLE:=Binary diff tool - URL:=http://www.daemonology.net/bsdiff/ + URL:=https://www.daemonology.net/bsdiff/ endef define Package/bspatch @@ -35,7 +36,7 @@ define Package/bspatch CATEGORY:=Utilities DEPENDS:=+libbz2 TITLE:=Binary patch tool - URL:=http://www.daemonology.net/bsdiff/ + URL:=https://www.daemonology.net/bsdiff/ endef diff --git a/package/utils/bsdiff/patches/001-musl.patch b/package/utils/bsdiff/patches/001-musl.patch index 5232bc1fe7..1eeb1140c0 100644 --- a/package/utils/bsdiff/patches/001-musl.patch +++ b/package/utils/bsdiff/patches/001-musl.patch @@ -1,6 +1,6 @@ ---- a/bsdiff.c 2005-08-17 00:13:52.000000000 +0200 -+++ b/bsdiff.c 2016-02-21 01:39:31.157915765 +0100 -@@ -101,7 +101,7 @@ +--- a/bsdiff.c ++++ b/bsdiff.c +@@ -101,7 +101,7 @@ static void split(off_t *I,off_t *V,off_ if(start+len>kk) split(I,V,kk,start+len-kk,h); } @@ -9,7 +9,7 @@ { off_t buckets[256]; off_t i,h,len; -@@ -139,7 +139,7 @@ +@@ -139,7 +139,7 @@ static void qsufsort(off_t *I,off_t *V,u for(i=0;i #include @@ -71,7 +71,7 @@ { off_t y; -@@ -62,8 +62,8 @@ +@@ -62,8 +62,8 @@ int main(int argc,char * argv[]) int fd; ssize_t oldsize,newsize; ssize_t bzctrllen,bzdatalen; diff --git a/package/utils/bsdiff/patches/020-CVE-2014-9862.patch b/package/utils/bsdiff/patches/020-CVE-2014-9862.patch new file mode 100644 index 0000000000..98a49312f3 --- /dev/null +++ b/package/utils/bsdiff/patches/020-CVE-2014-9862.patch @@ -0,0 +1,37 @@ +From: The FreeBSD Project +Bug: https://security-tracker.debian.org/tracker/CVE-2014-9862 +Subject: CVE-2014-9862 - check for a negative value on numbers of bytes + The implementation of bspatch does not check for a negative value on numbers + of bytes read from the diff and extra streams, allowing an attacker who + can control the patch file to write at arbitrary locations in the heap. + . + bspatch's main loop reads three numbers from the "control" stream in + the patch: X, Y and Z. The first two are the number of bytes to read + from "diff" and "extra" (and thus only non-negative), while the + third one could be positive or negative and moves the oldpos pointer + on the source image. These 3 values are 64bits signed ints (encoded + somehow on the file) that are later passed the function that reads + from the streams, but those values are not verified to be + non-negative. + . + Official report https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-9862 + The patch was downloaded from a link pointed by + https://security.freebsd.org/advisories/FreeBSD-SA-16:25.bsp + +--- + bspatch.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/bspatch.c ++++ b/bspatch.c +@@ -152,6 +152,10 @@ int main(int argc,char * argv[]) + }; + + /* Sanity-check */ ++ if ((ctrl[0] < 0) || (ctrl[1] < 0)) ++ errx(1,"Corrupt patch\n"); ++ ++ /* Sanity-check */ + if(newpos+ctrl[0]>newsize) + errx(1,"Corrupt patch\n"); + diff --git a/package/utils/bsdiff/patches/033-CVE-2020-14315.patch b/package/utils/bsdiff/patches/033-CVE-2020-14315.patch new file mode 100644 index 0000000000..975cb181dc --- /dev/null +++ b/package/utils/bsdiff/patches/033-CVE-2020-14315.patch @@ -0,0 +1,383 @@ +Description: patch for CVE-2020-14315 + A memory corruption vulnerability is present in bspatch as shipped in + Colin Percival’s bsdiff tools version 4.3. Insufficient checks when + handling external inputs allows an attacker to bypass the sanity checks + in place and write out of a dynamically allocated buffer boundaries. +Source: https://svnweb.freebsd.org/base/head/usr.bin/bsdiff/bspatch/bspatch.c?revision=352742&view=co +Author: tony mancill +Comment: The patch was created by comparing the Debian sources to the + "Confirmed Patched Version" [1] documented in the + X41 D-SEC GmbH Security Advisory: X41-2020-006 [2]. + References to FreeBSD capsicum have been dropped. Definitions for + TYPE_MINIMUM and TYPE_MAXIMUM have been borrowed from the Debian + coreutils package sources but originate in gnulib [3] and are used to + define OFF_MIN and OFF_MAX (limits of off_t). Whitespace changes from + the confirmed patched version are also included and keep the difference + between the Debian sources and the confirmed patched version minimal. + . + [1] https://svnweb.freebsd.org/base/head/usr.bin/bsdiff/bspatch/bspatch.c?revision=352742&view=co + [2] https://www.openwall.com/lists/oss-security/2020/07/09/2 + [3] https://www.gnu.org/software/gnulib/ +Last-Update: 2021-04-03 +Forwarded: not-needed +Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=964796 + +--- a/bspatch.c ++++ b/bspatch.c +@@ -1,4 +1,6 @@ + /*- ++ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD ++ * + * Copyright 2003-2005 Colin Percival + * All rights reserved + * +@@ -25,55 +27,147 @@ + */ + + #if 0 +-__FBSDID("$FreeBSD: src/usr.bin/bsdiff/bspatch/bspatch.c,v 1.1 2005/08/06 01:59:06 cperciva Exp $"); ++__FBSDID("$FreeBSD$"); + #endif + + #include +-#include ++#include ++#include ++#include ++#include ++#include + #include ++#include + #include +-#include + #include +-#include ++ ++#ifndef O_BINARY ++#define O_BINARY 0 ++#endif ++#define HEADER_SIZE 32 ++ ++/* TYPE_MINIMUM and TYPE_MAXIMUM taken from coreutils */ ++#ifndef TYPE_MINIMUM ++#define TYPE_MINIMUM(t) \ ++ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t))) ++#endif ++#ifndef TYPE_MAXIMUM ++#define TYPE_MAXIMUM(t) \ ++ ((t) ((t) 0 < (t) -1 \ ++ ? (t) -1 \ ++ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) ++#endif ++ ++#ifndef OFF_MAX ++#define OFF_MAX TYPE_MAXIMUM(off_t) ++#endif ++ ++#ifndef OFF_MIN ++#define OFF_MIN TYPE_MINIMUM(off_t) ++#endif ++ ++static char *newfile; ++static int dirfd = -1; ++ ++static void ++exit_cleanup(void) ++{ ++ ++ if (dirfd != -1 && newfile != NULL) ++ if (unlinkat(dirfd, newfile, 0)) ++ warn("unlinkat"); ++} ++ ++static inline off_t ++add_off_t(off_t a, off_t b) ++{ ++ off_t result; ++ ++#if __GNUC__ >= 5 || \ ++ (defined(__has_builtin) && __has_builtin(__builtin_add_overflow)) ++ if (__builtin_add_overflow(a, b, &result)) ++ errx(1, "Corrupt patch"); ++#else ++ if ((b > 0 && a > OFF_MAX - b) || (b < 0 && a < OFF_MIN - b)) ++ errx(1, "Corrupt patch"); ++ result = a + b; ++#endif ++ return result; ++} + + static off_t offtin(unsigned char *buf) + { + off_t y; + +- y=buf[7]&0x7F; +- y=y*256;y+=buf[6]; +- y=y*256;y+=buf[5]; +- y=y*256;y+=buf[4]; +- y=y*256;y+=buf[3]; +- y=y*256;y+=buf[2]; +- y=y*256;y+=buf[1]; +- y=y*256;y+=buf[0]; ++ y = buf[7] & 0x7F; ++ y = y * 256; y += buf[6]; ++ y = y * 256; y += buf[5]; ++ y = y * 256; y += buf[4]; ++ y = y * 256; y += buf[3]; ++ y = y * 256; y += buf[2]; ++ y = y * 256; y += buf[1]; ++ y = y * 256; y += buf[0]; + +- if(buf[7]&0x80) y=-y; ++ if (buf[7] & 0x80) ++ y = -y; + +- return y; ++ return (y); + } + +-int main(int argc,char * argv[]) ++static void ++usage(void) + { +- FILE * f, * cpf, * dpf, * epf; +- BZFILE * cpfbz2, * dpfbz2, * epfbz2; ++ ++ fprintf(stderr, "usage: bspatch oldfile newfile patchfile\n"); ++ exit(1); ++} ++ ++int main(int argc, char *argv[]) ++{ ++ FILE *f, *cpf, *dpf, *epf; ++ BZFILE *cpfbz2, *dpfbz2, *epfbz2; ++ char *directory, *namebuf; + int cbz2err, dbz2err, ebz2err; +- int fd; +- ssize_t oldsize,newsize; +- ssize_t bzctrllen,bzdatalen; +- unsigned char header[32],buf[8]; ++ int newfd, oldfd; ++ off_t oldsize, newsize; ++ off_t bzctrllen, bzdatalen; ++ unsigned char header[HEADER_SIZE], buf[8]; + unsigned char *old, *new; +- off_t oldpos,newpos; ++ off_t oldpos, newpos; + off_t ctrl[3]; +- off_t lenread; +- off_t i; ++ off_t i, lenread, offset; + +- if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]); ++ if (argc != 4) ++ usage(); + + /* Open patch file */ +- if ((f = fopen(argv[3], "r")) == NULL) ++ if ((f = fopen(argv[3], "rb")) == NULL) ++ err(1, "fopen(%s)", argv[3]); ++ /* Open patch file for control block */ ++ if ((cpf = fopen(argv[3], "rb")) == NULL) ++ err(1, "fopen(%s)", argv[3]); ++ /* open patch file for diff block */ ++ if ((dpf = fopen(argv[3], "rb")) == NULL) + err(1, "fopen(%s)", argv[3]); ++ /* open patch file for extra block */ ++ if ((epf = fopen(argv[3], "rb")) == NULL) ++ err(1, "fopen(%s)", argv[3]); ++ /* open oldfile */ ++ if ((oldfd = open(argv[1], O_RDONLY | O_BINARY, 0)) < 0) ++ err(1, "open(%s)", argv[1]); ++ /* open directory where we'll write newfile */ ++ if ((namebuf = strdup(argv[2])) == NULL || ++ (directory = dirname(namebuf)) == NULL || ++ (dirfd = open(directory, O_DIRECTORY)) < 0) ++ err(1, "open %s", argv[2]); ++ free(namebuf); ++ if ((newfile = basename(argv[2])) == NULL) ++ err(1, "basename"); ++ /* open newfile */ ++ if ((newfd = openat(dirfd, newfile, ++ O_CREAT | O_TRUNC | O_WRONLY | O_BINARY, 0666)) < 0) ++ err(1, "open(%s)", argv[2]); ++ atexit(exit_cleanup); + + /* + File format: +@@ -90,104 +184,104 @@ int main(int argc,char * argv[]) + */ + + /* Read header */ +- if (fread(header, 1, 32, f) < 32) { ++ if (fread(header, 1, HEADER_SIZE, f) < HEADER_SIZE) { + if (feof(f)) +- errx(1, "Corrupt patch\n"); ++ errx(1, "Corrupt patch"); + err(1, "fread(%s)", argv[3]); + } + + /* Check for appropriate magic */ + if (memcmp(header, "BSDIFF40", 8) != 0) +- errx(1, "Corrupt patch\n"); ++ errx(1, "Corrupt patch"); + + /* Read lengths from header */ +- bzctrllen=offtin(header+8); +- bzdatalen=offtin(header+16); +- newsize=offtin(header+24); +- if((bzctrllen<0) || (bzdatalen<0) || (newsize<0)) +- errx(1,"Corrupt patch\n"); ++ bzctrllen = offtin(header + 8); ++ bzdatalen = offtin(header + 16); ++ newsize = offtin(header + 24); ++ if (bzctrllen < 0 || bzctrllen > OFF_MAX - HEADER_SIZE || ++ bzdatalen < 0 || bzctrllen + HEADER_SIZE > OFF_MAX - bzdatalen || ++ newsize < 0 || newsize > SSIZE_MAX) ++ errx(1, "Corrupt patch"); + + /* Close patch file and re-open it via libbzip2 at the right places */ + if (fclose(f)) + err(1, "fclose(%s)", argv[3]); +- if ((cpf = fopen(argv[3], "r")) == NULL) +- err(1, "fopen(%s)", argv[3]); +- if (fseeko(cpf, 32, SEEK_SET)) +- err(1, "fseeko(%s, %lld)", argv[3], +- (long long)32); ++ offset = HEADER_SIZE; ++ if (fseeko(cpf, offset, SEEK_SET)) ++ err(1, "fseeko(%s, %jd)", argv[3], (intmax_t)offset); + if ((cpfbz2 = BZ2_bzReadOpen(&cbz2err, cpf, 0, 0, NULL, 0)) == NULL) + errx(1, "BZ2_bzReadOpen, bz2err = %d", cbz2err); +- if ((dpf = fopen(argv[3], "r")) == NULL) +- err(1, "fopen(%s)", argv[3]); +- if (fseeko(dpf, 32 + bzctrllen, SEEK_SET)) +- err(1, "fseeko(%s, %lld)", argv[3], +- (long long)(32 + bzctrllen)); ++ offset = add_off_t(offset, bzctrllen); ++ if (fseeko(dpf, offset, SEEK_SET)) ++ err(1, "fseeko(%s, %jd)", argv[3], (intmax_t)offset); + if ((dpfbz2 = BZ2_bzReadOpen(&dbz2err, dpf, 0, 0, NULL, 0)) == NULL) + errx(1, "BZ2_bzReadOpen, bz2err = %d", dbz2err); +- if ((epf = fopen(argv[3], "r")) == NULL) +- err(1, "fopen(%s)", argv[3]); +- if (fseeko(epf, 32 + bzctrllen + bzdatalen, SEEK_SET)) +- err(1, "fseeko(%s, %lld)", argv[3], +- (long long)(32 + bzctrllen + bzdatalen)); ++ offset = add_off_t(offset, bzdatalen); ++ if (fseeko(epf, offset, SEEK_SET)) ++ err(1, "fseeko(%s, %jd)", argv[3], (intmax_t)offset); + if ((epfbz2 = BZ2_bzReadOpen(&ebz2err, epf, 0, 0, NULL, 0)) == NULL) + errx(1, "BZ2_bzReadOpen, bz2err = %d", ebz2err); + +- if(((fd=open(argv[1],O_RDONLY,0))<0) || +- ((oldsize=lseek(fd,0,SEEK_END))==-1) || +- ((old=malloc(oldsize+1))==NULL) || +- (lseek(fd,0,SEEK_SET)!=0) || +- (read(fd,old,oldsize)!=oldsize) || +- (close(fd)==-1)) err(1,"%s",argv[1]); +- if((new=malloc(newsize+1))==NULL) err(1,NULL); +- +- oldpos=0;newpos=0; +- while(newpos SSIZE_MAX || ++ (old = malloc(oldsize)) == NULL || ++ lseek(oldfd, 0, SEEK_SET) != 0 || ++ read(oldfd, old, oldsize) != oldsize || ++ close(oldfd) == -1) ++ err(1, "%s", argv[1]); ++ if ((new = malloc(newsize)) == NULL) ++ err(1, NULL); ++ ++ oldpos = 0; ++ newpos = 0; ++ while (newpos < newsize) { + /* Read control data */ +- for(i=0;i<=2;i++) { ++ for (i = 0; i <= 2; i++) { + lenread = BZ2_bzRead(&cbz2err, cpfbz2, buf, 8); + if ((lenread < 8) || ((cbz2err != BZ_OK) && + (cbz2err != BZ_STREAM_END))) +- errx(1, "Corrupt patch\n"); +- ctrl[i]=offtin(buf); +- }; ++ errx(1, "Corrupt patch"); ++ ctrl[i] = offtin(buf); ++ } + + /* Sanity-check */ +- if ((ctrl[0] < 0) || (ctrl[1] < 0)) +- errx(1,"Corrupt patch\n"); ++ if (ctrl[0] < 0 || ctrl[0] > INT_MAX || ++ ctrl[1] < 0 || ctrl[1] > INT_MAX) ++ errx(1, "Corrupt patch"); + + /* Sanity-check */ +- if(newpos+ctrl[0]>newsize) +- errx(1,"Corrupt patch\n"); ++ if (add_off_t(newpos, ctrl[0]) > newsize) ++ errx(1, "Corrupt patch"); + + /* Read diff string */ + lenread = BZ2_bzRead(&dbz2err, dpfbz2, new + newpos, ctrl[0]); + if ((lenread < ctrl[0]) || + ((dbz2err != BZ_OK) && (dbz2err != BZ_STREAM_END))) +- errx(1, "Corrupt patch\n"); ++ errx(1, "Corrupt patch"); + + /* Add old data to diff string */ +- for(i=0;i=0) && (oldpos+inewsize) +- errx(1,"Corrupt patch\n"); ++ if (add_off_t(newpos, ctrl[1]) > newsize) ++ errx(1, "Corrupt patch"); + + /* Read extra string */ + lenread = BZ2_bzRead(&ebz2err, epfbz2, new + newpos, ctrl[1]); + if ((lenread < ctrl[1]) || + ((ebz2err != BZ_OK) && (ebz2err != BZ_STREAM_END))) +- errx(1, "Corrupt patch\n"); ++ errx(1, "Corrupt patch"); + + /* Adjust pointers */ +- newpos+=ctrl[1]; +- oldpos+=ctrl[2]; +- }; ++ newpos = add_off_t(newpos, ctrl[1]); ++ oldpos = add_off_t(oldpos, ctrl[2]); ++ } + + /* Clean up the bzip2 reads */ + BZ2_bzReadClose(&cbz2err, cpfbz2); +@@ -197,12 +291,13 @@ int main(int argc,char * argv[]) + err(1, "fclose(%s)", argv[3]); + + /* Write the new file */ +- if(((fd=open(argv[2],O_CREAT|O_TRUNC|O_WRONLY,0666))<0) || +- (write(fd,new,newsize)!=newsize) || (close(fd)==-1)) +- err(1,"%s",argv[2]); ++ if (write(newfd, new, newsize) != newsize || close(newfd) == -1) ++ err(1, "%s", argv[2]); ++ /* Disable atexit cleanup */ ++ newfile = NULL; + + free(new); + free(old); + +- return 0; ++ return (0); + } diff --git a/package/utils/busybox/Config-defaults.in b/package/utils/busybox/Config-defaults.in index abe6d5431a..b3c3f9a0b2 100644 --- a/package/utils/busybox/Config-defaults.in +++ b/package/utils/busybox/Config-defaults.in @@ -208,6 +208,15 @@ config BUSYBOX_DEFAULT_PASSWORD_MINLEN config BUSYBOX_DEFAULT_MD5_SMALL int default 1 +config BUSYBOX_DEFAULT_SHA1_SMALL + int + default 3 +config BUSYBOX_DEFAULT_SHA1_HWACCEL + bool + default y +config BUSYBOX_DEFAULT_SHA256_HWACCEL + bool + default y config BUSYBOX_DEFAULT_SHA3_SMALL int default 1 @@ -298,6 +307,15 @@ config BUSYBOX_DEFAULT_UNICODE_NEUTRAL_TABLE config BUSYBOX_DEFAULT_UNICODE_PRESERVE_BROKEN bool default n +config BUSYBOX_DEFAULT_LOOP_CONFIGURE + bool + default n +config BUSYBOX_DEFAULT_NO_LOOP_CONFIGURE + bool + default n +config BUSYBOX_DEFAULT_TRY_LOOP_CONFIGURE + bool + default y config BUSYBOX_DEFAULT_FEATURE_SEAMLESS_XZ bool default n @@ -860,6 +878,9 @@ config BUSYBOX_DEFAULT_TRUNCATE bool default y if TARGET_bcm53xx default n +config BUSYBOX_DEFAULT_TSORT + bool + default n config BUSYBOX_DEFAULT_TTY bool default n @@ -961,7 +982,7 @@ config BUSYBOX_DEFAULT_RESET default y config BUSYBOX_DEFAULT_RESIZE bool - default n + default y config BUSYBOX_DEFAULT_FEATURE_RESIZE_PRINT bool default n @@ -1801,13 +1822,13 @@ config BUSYBOX_DEFAULT_SWITCH_ROOT default y config BUSYBOX_DEFAULT_TASKSET bool - default n + default y config BUSYBOX_DEFAULT_FEATURE_TASKSET_FANCY bool - default n + default y config BUSYBOX_DEFAULT_FEATURE_TASKSET_CPULIST bool - default n + default y config BUSYBOX_DEFAULT_UEVENT bool default n @@ -2162,6 +2183,9 @@ config BUSYBOX_DEFAULT_RUNLEVEL config BUSYBOX_DEFAULT_RX bool default n +config BUSYBOX_DEFAULT_SEEDRNG + bool + default n config BUSYBOX_DEFAULT_SETFATTR bool default n @@ -2174,6 +2198,9 @@ config BUSYBOX_DEFAULT_STRINGS config BUSYBOX_DEFAULT_TIME bool default y +config BUSYBOX_DEFAULT_TREE + bool + default n config BUSYBOX_DEFAULT_TS bool default n @@ -2682,6 +2709,9 @@ config BUSYBOX_DEFAULT_FEATURE_UDHCPC_SANITIZEOPT config BUSYBOX_DEFAULT_UDHCPC_DEFAULT_SCRIPT string default "/usr/share/udhcpc/default.script" +config BUSYBOX_DEFAULT_UDHCPC6_DEFAULT_SCRIPT + string + default "" config BUSYBOX_DEFAULT_UDHCPC6 bool default n @@ -2993,7 +3023,7 @@ config BUSYBOX_DEFAULT_ASH_ALIAS default y config BUSYBOX_DEFAULT_ASH_RANDOM_SUPPORT bool - default n + default y config BUSYBOX_DEFAULT_ASH_EXPAND_PRMT bool default y @@ -3012,6 +3042,9 @@ config BUSYBOX_DEFAULT_ASH_PRINTF config BUSYBOX_DEFAULT_ASH_TEST bool default y +config BUSYBOX_DEFAULT_ASH_SLEEP + bool + default n config BUSYBOX_DEFAULT_ASH_HELP bool default n diff --git a/package/utils/busybox/Makefile b/package/utils/busybox/Makefile index 751b4cd468..e40f18cf89 100644 --- a/package/utils/busybox/Makefile +++ b/package/utils/busybox/Makefile @@ -5,17 +5,18 @@ include $(TOPDIR)/rules.mk PKG_NAME:=busybox -PKG_VERSION:=1.35.0 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=1.36.1 +PKG_RELEASE:=1 PKG_FLAGS:=essential PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=https://www.busybox.net/downloads \ http://sources.buildroot.net -PKG_HASH:=faeeb244c35a348a334f4a59e44626ee870fb07b6884d68c10ae8bc19f83a694 +PKG_HASH:=b8cc24c9574d809e7279c3be349795c5d5ceb6fdf19ca709f80cde50e47de314 PKG_BUILD_DEPENDS:=BUSYBOX_CONFIG_PAM:libpam PKG_BUILD_PARALLEL:=1 +PKG_BUILD_FLAGS:=lto PKG_CHECK_FORMAT_SECURITY:=0 PKG_LICENSE:=GPL-2.0 @@ -53,6 +54,14 @@ define Package/busybox VARIANT:=default endef +define Package/busybox-selinux + $(call Package/busybox/Default) + TITLE += with SELinux support + DEPENDS += +libselinux + VARIANT:=selinux + PROVIDES:=busybox +endef + define Package/busybox/description The Swiss Army Knife of embedded Linux. It slices, it dices, it makes Julian Fries. @@ -79,6 +88,7 @@ $(Package/busybox/conffiles/syslog) $(Package/busybox/conffiles/crond) endef +Package/busybox-selinux/conffiles = $(Package/busybox/conffiles) ifndef CONFIG_USE_MUSL LDLIBS:=m crypt @@ -90,8 +100,9 @@ ifeq ($(CONFIG_USE_GLIBC),y) LDLIBS += $(call BUSYBOX_IF_ENABLED,NSLOOKUP,resolv) endif -TARGET_CFLAGS += -flto -TARGET_LDFLAGS += -flto=jobserver -fuse-linker-plugin +ifeq ($(BUILD_VARIANT),selinux) + LDLIBS += selinux sepol +endif MAKE_VARS := MAKE_FLAGS += \ @@ -109,6 +120,9 @@ define Build/Configure touch $(PKG_BUILD_DIR)/.config ifeq ($(DEVICE_TYPE),nas) echo "CONFIG_HDPARM=y" >> $(PKG_BUILD_DIR)/.config +endif +ifeq ($(BUILD_VARIANT),selinux) + cat $(TOPDIR)/$(SOURCE)/selinux.config >> $(PKG_BUILD_DIR)/.config endif grep 'CONFIG_BUSYBOX_$(BUSYBOX_SYM)' $(TOPDIR)/.config | sed -e "s,\\(# \)\\?CONFIG_BUSYBOX_$(BUSYBOX_SYM)_\\(.*\\),\\1CONFIG_\\2,g" >> $(PKG_BUILD_DIR)/.config yes 'n' | $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_FLAGS) oldconfig @@ -142,5 +156,7 @@ endif -rm -rf $(1)/lib64 endef +Package/busybox-selinux/install = $(Package/busybox/install) $(eval $(call BuildPackage,busybox)) +$(eval $(call BuildPackage,busybox-selinux)) diff --git a/package/utils/busybox/config/coreutils/Config.in b/package/utils/busybox/config/coreutils/Config.in index 835ce7950a..983740be6e 100644 --- a/package/utils/busybox/config/coreutils/Config.in +++ b/package/utils/busybox/config/coreutils/Config.in @@ -653,7 +653,7 @@ config BUSYBOX_CONFIG_SORT sort is used to sort lines of text in specified files. config BUSYBOX_CONFIG_FEATURE_SORT_BIG - bool "Full SuSv3 compliant sort (support -ktcbdfiogM)" + bool "Full SuSv3 compliant sort (support -ktcbdfioghM)" default BUSYBOX_DEFAULT_FEATURE_SORT_BIG depends on BUSYBOX_CONFIG_SORT help @@ -851,6 +851,11 @@ config BUSYBOX_CONFIG_TRUNCATE help truncate truncates files to a given size. If a file does not exist, it is created unless told otherwise. +config BUSYBOX_CONFIG_TSORT + bool "tsort (0.7 kb)" + default BUSYBOX_DEFAULT_TSORT + help + tsort performs a topological sort. config BUSYBOX_CONFIG_TTY bool "tty (3.6 kb)" default BUSYBOX_DEFAULT_TTY diff --git a/package/utils/busybox/config/libbb/Config.in b/package/utils/busybox/config/libbb/Config.in index e050c4a915..b3a83b9b08 100644 --- a/package/utils/busybox/config/libbb/Config.in +++ b/package/utils/busybox/config/libbb/Config.in @@ -98,21 +98,47 @@ config BUSYBOX_CONFIG_MD5_SMALL default BUSYBOX_DEFAULT_MD5_SMALL # all "fast or small" options default to small range 0 3 help - Trade binary size versus speed for the md5sum algorithm. + Trade binary size versus speed for the md5 algorithm. Approximate values running uClibc and hashing linux-2.4.4.tar.bz2 were: - value user times (sec) text size (386) - 0 (fastest) 1.1 6144 - 1 1.4 5392 - 2 3.0 5088 - 3 (smallest) 5.1 4912 + value user times (sec) text size (386) + 0 (fastest) 1.1 6144 + 1 1.4 5392 + 2 3.0 5088 + 3 (smallest) 5.1 4912 + +config BUSYBOX_CONFIG_SHA1_SMALL + int "SHA1: Trade bytes for speed (0:fast, 3:slow)" + default BUSYBOX_DEFAULT_SHA1_SMALL # all "fast or small" options default to small + range 0 3 + help + Trade binary size versus speed for the sha1 algorithm. + With FEATURE_COPYBUF_KB=64: + throughput MB/s size of sha1_process_block64 + value 486 x86-64 486 x86-64 + 0 440 485 3481 3502 + 1 265 265 641 696 + 2,3 220 210 342 364 + +config BUSYBOX_CONFIG_SHA1_HWACCEL + bool "SHA1: Use hardware accelerated instructions if possible" + default BUSYBOX_DEFAULT_SHA1_HWACCEL + help + On x86, this adds ~590 bytes of code. Throughput + is about twice as fast as fully-unrolled generic code. + +config BUSYBOX_CONFIG_SHA256_HWACCEL + bool "SHA256: Use hardware accelerated instructions if possible" + default BUSYBOX_DEFAULT_SHA256_HWACCEL + help + On x86, this adds ~1k bytes of code. config BUSYBOX_CONFIG_SHA3_SMALL int "SHA3: Trade bytes for speed (0:fast, 1:slow)" default BUSYBOX_DEFAULT_SHA3_SMALL # all "fast or small" options default to small range 0 1 help - Trade binary size versus speed for the sha3sum algorithm. + Trade binary size versus speed for the sha3 algorithm. SHA3_SMALL=0 compared to SHA3_SMALL=1 (approximate): 64-bit x86: +270 bytes of code, 45% faster 32-bit x86: +450 bytes of code, 75% faster @@ -399,3 +425,25 @@ config BUSYBOX_CONFIG_UNICODE_PRESERVE_BROKEN For example, this means that entering 'l', 's', ' ', 0xff, [Enter] at shell prompt will list file named 0xff (single char name with char value 255), not file named '?'. + +choice + prompt "Use LOOP_CONFIGURE for losetup and loop mounts" + default BUSYBOX_CONFIG_TRY_LOOP_CONFIGURE + help + LOOP_CONFIGURE is added to Linux 5.8 + https://lwn.net/Articles/820408/ + This allows userspace to completely setup a loop device with a single + ioctl, removing the in-between state where the device can be partially + configured - eg the loop device has a backing file associated with it, + but is reading from the wrong offset. + +config BUSYBOX_CONFIG_LOOP_CONFIGURE + bool "use LOOP_CONFIGURE, needs kernel >= 5.8" + +config BUSYBOX_CONFIG_NO_LOOP_CONFIGURE + bool "use LOOP_SET_FD + LOOP_SET_STATUS" + +config BUSYBOX_CONFIG_TRY_LOOP_CONFIGURE + bool "try LOOP_CONFIGURE, fall back to LOOP_SET_FD + LOOP_SET_STATUS" + +endchoice diff --git a/package/utils/busybox/config/miscutils/Config.in b/package/utils/busybox/config/miscutils/Config.in index ecb83d9647..e15e318fe0 100644 --- a/package/utils/busybox/config/miscutils/Config.in +++ b/package/utils/busybox/config/miscutils/Config.in @@ -704,6 +704,13 @@ config BUSYBOX_CONFIG_RX default BUSYBOX_DEFAULT_RX help Receive files using the Xmodem protocol. +config BUSYBOX_CONFIG_SEEDRNG + bool "seedrng (1.3 kb)" + default BUSYBOX_DEFAULT_SEEDRNG + help + Seed the kernel RNG from seed files, meant to be called + once during startup, once during shutdown, and optionally + at some periodic interval in between. config BUSYBOX_CONFIG_SETFATTR bool "setfattr (3.7 kb)" default BUSYBOX_DEFAULT_SETFATTR @@ -727,6 +734,11 @@ config BUSYBOX_CONFIG_TIME The time command runs the specified program with the given arguments. When the command finishes, time writes a message to standard output giving timing statistics about this program run. +config BUSYBOX_CONFIG_TREE + bool "tree (0.6 kb)" + default BUSYBOX_DEFAULT_TREE + help + List files and directories in a tree structure. config BUSYBOX_CONFIG_TS bool "ts (450 bytes)" default BUSYBOX_DEFAULT_TS diff --git a/package/utils/busybox/config/networking/udhcp/Config.in b/package/utils/busybox/config/networking/udhcp/Config.in index ecfa283e23..6757f1efc9 100644 --- a/package/utils/busybox/config/networking/udhcp/Config.in +++ b/package/utils/busybox/config/networking/udhcp/Config.in @@ -93,12 +93,17 @@ config BUSYBOX_CONFIG_FEATURE_UDHCPC_SANITIZEOPT config BUSYBOX_CONFIG_UDHCPC_DEFAULT_SCRIPT string "Absolute path to config script" default BUSYBOX_DEFAULT_UDHCPC_DEFAULT_SCRIPT - depends on BUSYBOX_CONFIG_UDHCPC || BUSYBOX_CONFIG_UDHCPC6 + depends on BUSYBOX_CONFIG_UDHCPC help This script is called after udhcpc receives an answer. See examples/udhcp for a working example. Normally it is safe to leave this untouched. +config BUSYBOX_CONFIG_UDHCPC6_DEFAULT_SCRIPT + string "Absolute path to config script for IPv6" + default BUSYBOX_DEFAULT_UDHCPC6_DEFAULT_SCRIPT + depends on BUSYBOX_CONFIG_UDHCPC6 + # udhcpc6 config is inserted here: config BUSYBOX_CONFIG_UDHCPC6 bool "udhcpc6 (21 kb)" diff --git a/package/utils/busybox/config/shell/Config.in b/package/utils/busybox/config/shell/Config.in index 2b07812109..a68e9114ef 100644 --- a/package/utils/busybox/config/shell/Config.in +++ b/package/utils/busybox/config/shell/Config.in @@ -201,6 +201,11 @@ config BUSYBOX_CONFIG_ASH_TEST default BUSYBOX_DEFAULT_ASH_TEST depends on BUSYBOX_CONFIG_SHELL_ASH +config BUSYBOX_CONFIG_ASH_SLEEP + bool "sleep builtin" + default BUSYBOX_DEFAULT_ASH_SLEEP + depends on BUSYBOX_CONFIG_SHELL_ASH + config BUSYBOX_CONFIG_ASH_HELP bool "help builtin" default BUSYBOX_DEFAULT_ASH_HELP diff --git a/package/utils/busybox/patches/001-CVE-2022-30065-awk-fix-use-after-free.patch b/package/utils/busybox/patches/001-CVE-2022-30065-awk-fix-use-after-free.patch deleted file mode 100644 index 7dcb9dff3f..0000000000 --- a/package/utils/busybox/patches/001-CVE-2022-30065-awk-fix-use-after-free.patch +++ /dev/null @@ -1,42 +0,0 @@ -From e63d7cdfdac78c6fd27e9e63150335767592b85e Mon Sep 17 00:00:00 2001 -From: Natanael Copa -Date: Fri, 17 Jun 2022 17:45:34 +0200 -Subject: awk: fix use after free (CVE-2022-30065) - -fixes https://bugs.busybox.net/show_bug.cgi?id=14781 - -function old new delta -evaluate 3343 3357 +14 - -Signed-off-by: Natanael Copa -Signed-off-by: Denys Vlasenko ---- - editors/awk.c | 3 +++ - testsuite/awk.tests | 6 ++++++ - 2 files changed, 9 insertions(+) - ---- a/editors/awk.c -+++ b/editors/awk.c -@@ -3114,6 +3114,9 @@ static var *evaluate(node *op, var *res) - - case XC( OC_MOVE ): - debug_printf_eval("MOVE\n"); -+ /* make sure that we never return a temp var */ -+ if (L.v == TMPVAR0) -+ L.v = res; - /* if source is a temporary string, jusk relink it to dest */ - if (R.v == TMPVAR1 - && !(R.v->type & VF_NUMBER) ---- a/testsuite/awk.tests -+++ b/testsuite/awk.tests -@@ -469,4 +469,10 @@ testing 'awk printf %% prints one %' \ - "%\n" \ - '' '' - -+testing 'awk assign while test' \ -+ "awk '\$1==\$1=\"foo\" {print \$1}'" \ -+ "foo\n" \ -+ "" \ -+ "foo" -+ - exit $FAILCOUNT diff --git a/package/utils/checkpolicy/Makefile b/package/utils/checkpolicy/Makefile new file mode 100644 index 0000000000..4ebf97bb3f --- /dev/null +++ b/package/utils/checkpolicy/Makefile @@ -0,0 +1,52 @@ +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=checkpolicy +PKG_VERSION:=3.5 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/SELinuxProject/selinux/releases/download/$(PKG_VERSION) +PKG_HASH:=7aa48ab2222a0b9881111d6d7f70c3014d3d9338827d9e02df105a68c0df5dbc +PKG_INSTALL:=1 +PKG_BUILD_DEPENDS:=libselinux +HOST_BUILD_DEPENDS:=libselinux/host + +PKG_MAINTAINER:=Thomas Petazzoni +PKG_CPE_ID:=cpe:/a:selinuxproject:checkpolicy +PKG_LICENSE:=GPL-2.0-or-later +PKG_LICENSE_FILES:=COPYING + +include $(INCLUDE_DIR)/package.mk + +define Package/checkpolicy + SECTION:=utils + CATEGORY:=Utilities + TITLE:=SELinux policy compiler + URL:=http://selinuxproject.org/page/Main_Page +endef + +define Package/checkpolicy/description + checkpolicy is the SELinux policy compiler. It uses libsepol + to generate the binary policy. checkpolicy uses the static + libsepol since it deals with low level details of the policy + that have not been encapsulated/abstracted by a proper + shared library interface. +endef + +include $(INCLUDE_DIR)/host-build.mk + +HOST_MAKE_FLAGS += \ + PREFIX=$(STAGING_DIR_HOSTPKG) + +define Package/checkpolicy/install + $(INSTALL_DIR) $(1)/usr/bin + $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/ +endef + +$(eval $(call HostBuild)) +$(eval $(call BuildPackage,checkpolicy)) diff --git a/package/utils/coreutils/Makefile b/package/utils/coreutils/Makefile new file mode 100644 index 0000000000..620707b53e --- /dev/null +++ b/package/utils/coreutils/Makefile @@ -0,0 +1,153 @@ +# +# Copyright (C) 2008-2014 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=coreutils +PKG_VERSION:=9.3 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=@GNU/coreutils +PKG_HASH:=adbcfcfe899235b71e8768dcf07cd532520b7f54f9a8064843f8d199a904bbaa + +PKG_MAINTAINER:=Jo-Philipp Wich +PKG_LICENSE:=GPL-3.0-or-later +PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:gnu:coreutils + +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk + +COREUTILS_APPLETS := \ + base32 base64 basename basenc b2sum cat chcon chgrp chmod chown chroot \ + cksum comm cp csplit cut date dd df dir dircolors dirname du echo env \ + expand expr factor false fmt fold groups head hostid id install join \ + kill link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl \ + nohup nproc numfmt od paste pathchk pinky pr printenv printf ptx pwd \ + readlink realpath rm rmdir runcon seq sha1sum sha224sum sha256sum \ + sha384sum sha512sum shred shuf sleep sort split stat stdbuf stty sum \ + sync tac tail tee test timeout touch tr true truncate tsort tty uname \ + unexpand uniq unlink uptime users vdir wc who whoami yes + +DIR_BIN := \ + base64 cat chgrp chmod chown cp date dd df echo false kill link ln ls \ + mkdir mknod mktemp mv nice printenv pwd rm rmdir sleep stat stty sync \ + touch true uname + +DIR_USR_BIN := \ + basename chcon cksum comm cut dirname du env expand expr factor fold \ + groups head hostid id install logname md5sum mkfifo nl nohup nproc od \ + paste printf readlink realpath runcon seq sha1sum sha256sum sha512sum \ + shred shuf sort split sum tac tail tee test timeout tr truncate tty \ + unexpand uniq unlink uptime users wc who whoami yes + +DIR_USR_SBIN := \ + chroot + +# BusyBox does not provide these yet +DIR_OTHERS := \ + base32 b2sum basenc csplit dir dircolors fmt join numfmt pathchk pinky \ + pr ptx sha224sum sha384sum stdbuf tsort vdir + +$(eval $(foreach a,$(DIR_BIN),ALTS_$(a):=300:/bin/$(a):/usr/libexec/$(a)-coreutils$(newline))) +$(eval $(foreach a,$(DIR_USR_BIN),ALTS_$(a):=300:/usr/bin/$(a):/usr/libexec/$(a)-coreutils$(newline))) +$(eval $(foreach a,$(DIR_USR_SBIN),ALTS_$(a):=300:/usr/sbin/$(a):/usr/libexec/$(a)-coreutils$(newline))) + +DEPENDS_sort = +libpthread +DEPENDS_timeout = +librt +DEPENDS_expr = +libgmp +DEPENDS_factor = +libgmp +DEPENDS_cp = +libacl +DEPENDS_dir = +libacl +libcap +DEPENDS_install = +libacl +DEPENDS_ls = +libacl +libcap +DEPENDS_mv = +libacl +DEPENDS_vdir = +libacl +libcap + +FILES_stdbuf := usr/lib/coreutils/libstdbuf.so + +define Package/coreutils/Default + SECTION:=utils + CATEGORY:=Utilities + TITLE:=The GNU core utilities + URL:=http://www.gnu.org/software/coreutils/ +endef + +define Package/coreutils + $(call Package/coreutils/Default) + TITLE:=The GNU core utilities + MENU:=1 +endef + +define Package/coreutils/description + Full versions of standard GNU utilities. If an equivalent Busybox applet is + available, you should consider compiling that instead as Busybox applets are + usually smaller, at the expense of reduced functionality. +endef + +define GenPlugin + define Package/$(1) + $(call Package/coreutils/Default) + DEPENDS:=coreutils $(DEPENDS_$(2)) + TITLE:=Utility $(2) from the GNU core utilities + ALTERNATIVES:=$(ALTS_$(2)) + endef + + define Package/$(1)/description + Full version of standard GNU $(2) utility. + endef +endef + +$(foreach a,$(COREUTILS_APPLETS),$(eval $(call GenPlugin,coreutils-$(a),$(a)))) + +CONFIGURE_VARS += \ + gl_cv_func_mbrtowc_incomplete_state=yes \ + gl_cv_func_mbrtowc_retval=yes \ + gl_cv_func_wcrtomb_retval=yes \ + ac_cv_header_selinux_context_h=no \ + ac_cv_header_selinux_flash_h=no \ + ac_cv_header_selinux_selinux_h=no \ + ac_cv_search_setfilecon=no + +CONFIGURE_ARGS += \ + --disable-xattr \ + --enable-install-program=su \ + --enable-threads=posix \ + --enable-acl \ + --disable-assert \ + --disable-rpath \ + --disable-libsmack \ + --enable-libcap \ + --without-linux-crypto \ + --without-openssl \ + --$(if $(CONFIG_USE_MUSL),with,without)-included-regex \ + --without-selinux \ + --with-gmp + +define Package/coreutils/install + true +endef + +define BuildPlugin + define Package/$(1)/install + $(INSTALL_DIR) $$(1)/usr/$(if $(ALTS_$(2)),libexec,bin) + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(2) $$(1)/usr/$(if $(ALTS_$(2)),libexec/$(2)-coreutils,bin/$(2)) + $(foreach f,$(FILES_$(2)), + $(INSTALL_DIR) $$(1)/$(dir $(f)) + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/$(f) $$(1)/$(f) + ) + endef + + $$(eval $$(call BuildPackage,$(1))) +endef + +$(eval $(call BuildPackage,coreutils)) + +$(foreach a,$(COREUTILS_APPLETS),$(eval $(call BuildPlugin,coreutils-$(a),$(a)))) diff --git a/package/utils/coreutils/patches/001-no_docs_man_tests.patch b/package/utils/coreutils/patches/001-no_docs_man_tests.patch new file mode 100644 index 0000000000..2bcd8fc1b9 --- /dev/null +++ b/package/utils/coreutils/patches/001-no_docs_man_tests.patch @@ -0,0 +1,93 @@ +--- a/Makefile.am ++++ b/Makefile.am +@@ -17,7 +17,7 @@ + + ALL_RECURSIVE_TARGETS = + +-SUBDIRS = po . gnulib-tests ++SUBDIRS = po + + EXTRA_DIST = \ + .mailmap \ +@@ -211,6 +211,3 @@ AM_CPPFLAGS = -Ilib -I$(top_srcdir)/lib + + include $(top_srcdir)/lib/local.mk + include $(top_srcdir)/src/local.mk +-include $(top_srcdir)/doc/local.mk +-include $(top_srcdir)/man/local.mk +-include $(top_srcdir)/tests/local.mk +--- a/Makefile.in ++++ b/Makefile.in +@@ -4149,11 +4149,7 @@ RECURSIVE_TARGETS = all-recursive check- + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +-am__can_run_installinfo = \ +- case $$AM_UPDATE_INFO_DIR in \ +- n|no|NO) false;; \ +- *) (install-info --version) >/dev/null 2>&1;; \ +- esac ++am__can_run_installinfo = false + am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; + am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ +@@ -4403,10 +4399,10 @@ am__DIST_COMMON = $(doc_coreutils_TEXINF + $(top_srcdir)/build-aux/missing \ + $(top_srcdir)/build-aux/test-driver \ + $(top_srcdir)/build-aux/texinfo.tex \ +- $(top_srcdir)/build-aux/ylwrap $(top_srcdir)/doc/local.mk \ +- $(top_srcdir)/lib/alloca.c $(top_srcdir)/lib/config.hin \ +- $(top_srcdir)/lib/local.mk $(top_srcdir)/man/local.mk \ +- $(top_srcdir)/src/local.mk $(top_srcdir)/src/single-binary.mk \ ++ $(top_srcdir)/build-aux/ylwrap \ ++ $(top_srcdir)/lib/alloca.c \ ++ $(top_srcdir)/lib/local.mk \ ++ $(top_srcdir)/src/local.mk \ + $(top_srcdir)/tests/local.mk ABOUT-NLS AUTHORS COPYING \ + ChangeLog INSTALL NEWS README THANKS TODO build-aux/compile \ + build-aux/config.guess build-aux/config.rpath \ +@@ -4520,7 +4516,7 @@ ERROR_H = @ERROR_H@ + ETAGS = @ETAGS@ + EUIDACCESS_LIBGEN = @EUIDACCESS_LIBGEN@ + EXEEXT = @EXEEXT@ +-EXTRA_MANS = @EXTRA_MANS@ ++EXTRA_MANS = + FDATASYNC_LIB = @FDATASYNC_LIB@ + FILE_HAS_ACL_LIB = @FILE_HAS_ACL_LIB@ + FLOAT_H = @FLOAT_H@ +@@ -6181,7 +6177,7 @@ localedir_c_make = @localedir_c_make@ + localstatedir = @localstatedir@ + localstatedir_c = @localstatedir_c@ + localstatedir_c_make = @localstatedir_c_make@ +-man1_MANS = @man1_MANS@ ++man1_MANS = + mandir = @mandir@ + mandir_c = @mandir_c@ + mandir_c_make = @mandir_c_make@ +@@ -6230,7 +6226,7 @@ top_build_prefix = @top_build_prefix@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + ALL_RECURSIVE_TARGETS = distcheck-hook check-root +-SUBDIRS = po . gnulib-tests ++SUBDIRS = po + + #if GNU_MAKE + # [nicer features that work only with GNU Make] +@@ -8437,7 +8433,7 @@ all: $(BUILT_SOURCES) + .SUFFIXES: .1 .c .dvi .log .o .obj .pl .pl$(EXEEXT) .ps .sh .sh$(EXEEXT) .trs .x .xpl .xpl$(EXEEXT) .y + am--refresh: Makefile + @: +-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(top_srcdir)/doc/local.mk $(top_srcdir)/man/local.mk $(top_srcdir)/tests/local.mk $(am__configure_deps) ++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ +@@ -8459,7 +8455,7 @@ Makefile: $(srcdir)/Makefile.in $(top_bu + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ + esac; +-$(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(top_srcdir)/doc/local.mk $(top_srcdir)/man/local.mk $(top_srcdir)/tests/local.mk $(am__empty): ++$(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(am__empty): + + $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck diff --git a/package/utils/ct-bugcheck/Makefile b/package/utils/ct-bugcheck/Makefile new file mode 100644 index 0000000000..5deb1e0d35 --- /dev/null +++ b/package/utils/ct-bugcheck/Makefile @@ -0,0 +1,52 @@ +# +# Copyright (C) 2016 OpenWrt.org +# +# 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:=ct-bugcheck +PKG_RELEASE:=2016-07-21 + +include $(INCLUDE_DIR)/package.mk + +define Package/ct-bugcheck + SECTION:=utils + CATEGORY:=Utilities + TITLE:=Bug checking and reporting utility + VERSION:=$(PKG_RELEASE) + MAINTAINER:=Ben Greear +endef + +define Package/ct-bugcheck/description + Scripts to check for bugs (like firmware crashes) and package them for reporting. + Currently this script only checks for ath10k firmware crashes. + Once installed, you can enable this tool by creating a file called + /etc/config/bugcheck with the following contents: + DO_BUGCHECK=1 + export DO_BUGCHECK + +endef + +define Build/Prepare + $(CP) src/bugcheck.sh $(PKG_BUILD_DIR)/ + $(CP) src/bugchecker.sh $(PKG_BUILD_DIR)/ + $(CP) src/bugcheck.initd $(PKG_BUILD_DIR)/ +endef + +define Build/Compile + true +endef + +define Package/ct-bugcheck/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) $(PKG_BUILD_DIR)/bugcheck.sh $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/bugchecker.sh $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/bugcheck.initd $(1)/etc/init.d/bugcheck +endef + +$(eval $(call BuildPackage,ct-bugcheck)) diff --git a/package/utils/ct-bugcheck/src/bugcheck.initd b/package/utils/ct-bugcheck/src/bugcheck.initd new file mode 100644 index 0000000000..b97a415bbf --- /dev/null +++ b/package/utils/ct-bugcheck/src/bugcheck.initd @@ -0,0 +1,16 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2016 OpenWrt.org + +START=99 + +USE_PROCD=1 +PROG=/usr/bin/bugchecker.sh + +# To actually make bugchecker.sh run, see comments +# at top of its file. + +start_service () { + procd_open_instance + procd_set_param command "$PROG" + procd_close_instance +} diff --git a/package/utils/ct-bugcheck/src/bugcheck.sh b/package/utils/ct-bugcheck/src/bugcheck.sh new file mode 100755 index 0000000000..8adb0358be --- /dev/null +++ b/package/utils/ct-bugcheck/src/bugcheck.sh @@ -0,0 +1,115 @@ +#!/bin/sh + +# Check for ath10k (and maybe other) bugs, package them up, +# and let user know what to do with them. + +TMPLOC=/tmp +CRASHDIR=$TMPLOC/bugcheck +FOUND_BUG=0 + +# set -x + +bugcheck_generic() +{ + echo "libreCMC crashlog report" > $CRASHDIR/info.txt + date >> $CRASHDIR/info.txt + echo >> $CRASHDIR/info.txt + echo "uname" >> $CRASHDIR/info.txt + uname -a >> $CRASHDIR/info.txt + echo >> $CRASHDIR/info.txt + echo "os-release" >> $CRASHDIR/info.txt + cat /etc/os-release >> $CRASHDIR/info.txt + echo >> $CRASHDIR/info.txt + echo "os-release" >> $CRASHDIR/info.txt + cat /etc/os-release >> $CRASHDIR/info.txt + echo >> $CRASHDIR/info.txt + echo "dmesg output" >> $CRASHDIR/info.txt + dmesg >> $CRASHDIR/info.txt + if [ -x /usr/bin/lspci ] + then + echo >> $CRASHDIR/info.txt + echo "lspci" >> $CRASHDIR/info.txt + lspci >> $CRASHDIR/info.txt + fi + echo >> $CRASHDIR/info.txt + echo "cpuinfo" >> $CRASHDIR/info.txt + cat /proc/cpuinfo >> $CRASHDIR/info.txt + echo >> $CRASHDIR/info.txt + echo "meminfo" >> $CRASHDIR/info.txt + cat /proc/cpuinfo >> $CRASHDIR/info.txt + echo >> $CRASHDIR/info.txt + echo "cmdline" >> $CRASHDIR/info.txt + cat /proc/cmdline >> $CRASHDIR/info.txt + echo >> $CRASHDIR/info.txt + echo "lsmod" >> $CRASHDIR/info.txt + lsmod >> $CRASHDIR/info.txt +} + +roll_crashes() +{ + # Roll any existing crashes + if [ -d $CRASHDIR ] + then + if [ -d $CRASHDIR.1 ] + then + rm -fr $CRASHDIR.1 + fi + mv $CRASHDIR $CRASHDIR.1 + fi + + # Prepare location + mkdir -p $CRASHDIR +} + +# ath10k, check debugfs entries. +for i in /sys/kernel/debug/ieee80211/*/ath10k/fw_crash_dump +do + #echo "Checking $i" + if cat $i > $TMPLOC/ath10k_crash.bin 2>&1 + then + FOUND_BUG=1 + + #echo "Found ath10k crash data in $i" + roll_crashes + + ADIR=${i/fw_crash_dump/} + + CTFW=0 + if grep -- -ct- $TMPLOC/ath10k_crash.bin > /dev/null 2>&1 + then + CTFW=1 + fi + + echo "Send bug reports to:" > $CRASHDIR/report_to.txt + if [ -f $ADIR/ct_special -o $CTFW == "1" ] + then + # Looks like this is CT firmware or driver... + echo "greearb@candelatech.com" >> $CRASHDIR/report_to.txt + echo "and/or report or check for duplicates here:" >> $CRASHDIR/report_to.txt + echo "https://github.com/greearb/ath10k-ct/issues" >> $CRASHDIR/report_to.txt + else + # Not sure who would want these bug reports for upstream... + echo "https://openwrt.org/" >> $CRASHDIR/report_to.txt + fi + echo >> $CRASHDIR/report_to.txt + echo "Please attach all files in this directory to bug reports." >> $CRASHDIR/report_to.txt + + mv $TMPLOC/ath10k_crash.bin $CRASHDIR + + # Add any more ath10k specific stuff here. + + # And call generic bug reporting logic + bugcheck_generic + fi +done + +if [ $FOUND_BUG == "1" ] + then + # Notify LUCI somehow? + echo "bugcheck.sh found an issue to be reported" > /dev/kmsg + echo "See $CRASHDIR for details on how to report this" > /dev/kmsg + # Let calling code know something was wrong. + exit 1 +fi + +exit 0 diff --git a/package/utils/ct-bugcheck/src/bugchecker.sh b/package/utils/ct-bugcheck/src/bugchecker.sh new file mode 100755 index 0000000000..be305af390 --- /dev/null +++ b/package/utils/ct-bugcheck/src/bugchecker.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +# Periodically call bugcheck.sh script + +CHECKER=bugcheck.sh +SLEEPFOR=60 + +DO_BUGCHECK=0 + +# So, to enable this, you create an /etc/config/bugcheck file +# with contents like: +# DO_BUGCHECK=1 +# export DO_BUGCHECK + +if [ -f /etc/config/bugcheck ] + then + . /etc/config/bugcheck +fi + +if [ $DO_BUGCHECK == 0 ] +then + exit 0 +fi + +while true + do + $CHECKER + sleep $SLEEPFOR +done diff --git a/package/utils/dbus/Makefile b/package/utils/dbus/Makefile index 40ae4c1eba..e7db64debf 100644 --- a/package/utils/dbus/Makefile +++ b/package/utils/dbus/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=dbus PKG_VERSION:=1.13.18 -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=12 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://dbus.freedesktop.org/releases/dbus diff --git a/package/utils/dtc/Makefile b/package/utils/dtc/Makefile index 94534b9c5e..dc10e9c519 100644 --- a/package/utils/dtc/Makefile +++ b/package/utils/dtc/Makefile @@ -5,16 +5,17 @@ include $(TOPDIR)/rules.mk PKG_NAME:=dtc -PKG_VERSION:=1.6.1 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=1.7.0 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_HASH:=65cec529893659a49a89740bb362f507a3b94fc8cd791e76a8d6a2b6f3203473 +PKG_HASH:=29edce3d302a15563d8663198bbc398c5a0554765c83830d0d4c0409d21a16c4 PKG_SOURCE_URL:=@KERNEL/software/utils/dtc PKG_MAINTAINER:=Yousong Zhou PKG_LICENSE:=GPL-2.0-only PKG_LICENSE_FILES:=GPL +PKG_CPE_ID:=cpe:/a:dtc_project:dtc PKG_INSTALL:=1 diff --git a/package/utils/dtc/patches/0001-Support-r-format-for-printing-raw-bytes-with-fdtget.patch b/package/utils/dtc/patches/0001-Support-r-format-for-printing-raw-bytes-with-fdtget.patch deleted file mode 100644 index f7731f1a9d..0000000000 --- a/package/utils/dtc/patches/0001-Support-r-format-for-printing-raw-bytes-with-fdtget.patch +++ /dev/null @@ -1,137 +0,0 @@ -From 17739b7ef510917471409d71fb45d8eaf6a1e1fb Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 9 Dec 2021 07:14:20 +0100 -Subject: [PATCH] Support 'r' format for printing raw bytes with fdtget -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -FT is sometimes used for storing raw data. That is quite common for -U-Boot FIT images. - -Extracting such data is not trivial currently. Using type 's' (string) -will replace every 0x00 (NUL) with 0x20 (space). Using type 'x' will -print bytes but in xxd incompatible format. - -This commit adds support for 'r' (raw) format. Example usage: -fdtget -t r firmware.itb /images/foo data > image.raw - -Support for encoding isn't added as there isn't any clean way of passing -binary data as command line argument. - -Signed-off-by: Rafał Miłecki -Message-Id: <20211209061420.29466-1-zajec5@gmail.com> -Signed-off-by: David Gibson ---- - Documentation/manual.txt | 2 +- - fdtget.c | 5 +++++ - fdtput.c | 2 ++ - tests/run_tests.sh | 2 ++ - tests/utilfdt_test.c | 5 ++++- - util.c | 4 ++-- - util.h | 3 ++- - 7 files changed, 18 insertions(+), 5 deletions(-) - ---- a/Documentation/manual.txt -+++ b/Documentation/manual.txt -@@ -712,7 +712,7 @@ The syntax of the fdtget command is: - - where options are: - -- s=string, i=int, u=unsigned, x=hex -+ s=string, i=int, u=unsigned, x=hex, r=raw - Optional modifier prefix: - hh or b=byte, h=2 byte, l=4 byte (default) - ---- a/fdtget.c -+++ b/fdtget.c -@@ -91,6 +91,11 @@ static int show_data(struct display_info - if (len == 0) - return 0; - -+ if (disp->type == 'r') { -+ fwrite(data, 1, len, stdout); -+ return 0; -+ } -+ - is_string = (disp->type) == 's' || - (!disp->type && util_is_printable_string(data, len)); - if (is_string) { ---- a/fdtput.c -+++ b/fdtput.c -@@ -433,6 +433,8 @@ int main(int argc, char *argv[]) - if (utilfdt_decode_type(optarg, &disp.type, - &disp.size)) - usage("Invalid type string"); -+ if (disp.type == 'r') -+ usage("Unsupported raw data type"); - break; - - case 'v': ---- a/tests/run_tests.sh -+++ b/tests/run_tests.sh -@@ -852,6 +852,8 @@ fdtget_tests () { - run_fdtget_test 8000 -tx $dtb /cpus/PowerPC,970@1 d-cache-size - run_fdtget_test "61 62 63 0" -tbx $dtb /randomnode tricky1 - run_fdtget_test "a b c d de ea ad be ef" -tbx $dtb /randomnode blob -+ run_fdtget_test "MyBoardName\0MyBoardFamilyName\0" -tr $dtb / compatible -+ run_fdtget_test "\x0a\x0b\x0c\x0d\xde\xea\xad\xbe\xef" -tr $dtb /randomnode blob - - # Here the property size is not a multiple of 4 bytes, so it should fail - run_wrap_error_test $DTGET -tlx $dtb /randomnode mixed ---- a/tests/utilfdt_test.c -+++ b/tests/utilfdt_test.c -@@ -73,6 +73,9 @@ static void check_sizes(char *modifier, - - *ptr = 's'; - check(fmt, 's', -1); -+ -+ *ptr = 'r'; -+ check(fmt, 'r', -1); - } - - static void test_utilfdt_decode_type(void) -@@ -90,7 +93,7 @@ static void test_utilfdt_decode_type(voi - /* try every other character */ - checkfail(""); - for (ch = ' '; ch < 127; ch++) { -- if (!strchr("iuxs", ch)) { -+ if (!strchr("iuxsr", ch)) { - *fmt = ch; - fmt[1] = '\0'; - checkfail(fmt); ---- a/util.c -+++ b/util.c -@@ -353,11 +353,11 @@ int utilfdt_decode_type(const char *fmt, - } - - /* we should now have a type */ -- if ((*fmt == '\0') || !strchr("iuxs", *fmt)) -+ if ((*fmt == '\0') || !strchr("iuxsr", *fmt)) - return -1; - - /* convert qualifier (bhL) to byte size */ -- if (*fmt != 's') -+ if (*fmt != 's' && *fmt != 'r') - *size = qualifier == 'b' ? 1 : - qualifier == 'h' ? 2 : - qualifier == 'l' ? 4 : -1; ---- a/util.h -+++ b/util.h -@@ -143,6 +143,7 @@ int utilfdt_write_err(const char *filena - * i signed integer - * u unsigned integer - * x hex -+ * r raw - * - * TODO: Implement ll modifier (8 bytes) - * TODO: Implement o type (octal) -@@ -160,7 +161,7 @@ int utilfdt_decode_type(const char *fmt, - */ - - #define USAGE_TYPE_MSG \ -- "\ts=string, i=int, u=unsigned, x=hex\n" \ -+ "\ts=string, i=int, u=unsigned, x=hex, r=raw\n" \ - "\tOptional modifier prefix:\n" \ - "\t\thh or b=byte, h=2 byte, l=4 byte (default)"; - diff --git a/package/utils/e2fsprogs/Makefile b/package/utils/e2fsprogs/Makefile index 77532d1591..38bc7c5b7b 100644 --- a/package/utils/e2fsprogs/Makefile +++ b/package/utils/e2fsprogs/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=e2fsprogs -PKG_VERSION:=1.46.5 +PKG_VERSION:=1.47.0 PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/linux/kernel/people/tytso/e2fsprogs/v$(PKG_VERSION)/ -PKG_HASH:=2f16c9176704cf645dc69d5b15ff704ae722d665df38b2ed3cfc249757d8d81e +PKG_HASH:=144af53f2bbd921cef6f8bea88bb9faddca865da3fbc657cc9b4d2001097d5db PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:=NOTICE @@ -23,6 +23,7 @@ PKG_BUILD_DEPENDS:=util-linux e2fsprogs/host PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 +PKG_BUILD_FLAGS:=gc-sections lto include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/host-build.mk @@ -142,10 +143,7 @@ $(call Package/e2fsprogs) DEPENDS:= +e2fsprogs endef -TARGET_CFLAGS += $(FPIC) -ffunction-sections -fdata-sections -flto - -TARGET_LDFLAGS += $(if $(CONFIG_USE_GLIBC),-lrt) -TARGET_LDFLAGS += -flto +TARGET_CFLAGS += $(FPIC) CONFIGURE_ARGS += \ --disable-testio-debug \ @@ -158,6 +156,10 @@ CONFIGURE_ARGS += \ --disable-rpath \ --disable-fuse2fs +ifneq ($(CONFIG_USE_MUSL),) + CONFIGURE_VARS += ac_cv_func_lseek64=yes +endif + define Build/Prepare $(call Build/Prepare/Default) $(CP) $(SCRIPT_DIR)/config.{guess,sub} $(PKG_BUILD_DIR)/config/ @@ -172,7 +174,6 @@ define Build/Compile V=$(if $(findstring c,$(LIBRECMC_VERBOSE)),1,) \ subst +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \ - LDFLAGS=-Wl,--gc-sections \ BUILDCC="$(HOSTCC)" \ DESTDIR="$(PKG_INSTALL_DIR)" \ ELF_OTHER_LIBS="$(TARGET_LDFLAGS) -luuid" \ @@ -266,7 +267,6 @@ endef define Package/tune2fs/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/tune2fs $(1)/usr/sbin/ - $(LN) tune2fs $(1)/usr/sbin/findfs endef define Package/resize2fs/install diff --git a/package/utils/e2fsprogs/patches/004-CVE-2022-1304-libext2fs-add-sanity-check-to-extent-manipulation.patch b/package/utils/e2fsprogs/patches/004-CVE-2022-1304-libext2fs-add-sanity-check-to-extent-manipulation.patch deleted file mode 100644 index e5a76161f2..0000000000 --- a/package/utils/e2fsprogs/patches/004-CVE-2022-1304-libext2fs-add-sanity-check-to-extent-manipulation.patch +++ /dev/null @@ -1,50 +0,0 @@ -From ab51d587bb9b229b1fade1afd02e1574c1ba5c76 Mon Sep 17 00:00:00 2001 -From: Lukas Czerner -Date: Thu, 21 Apr 2022 19:31:48 +0200 -Subject: libext2fs: add sanity check to extent manipulation - -It is possible to have a corrupted extent tree in such a way that a leaf -node contains zero extents in it. Currently if that happens and we try -to traverse the tree we can end up accessing wrong data, or possibly -even uninitialized memory. Make sure we don't do that. - -Additionally make sure that we have a sane number of bytes passed to -memmove() in ext2fs_extent_delete(). - -Note that e2fsck is currently unable to spot and fix such corruption in -pass1. - -Signed-off-by: Lukas Czerner -Reported-by: Nils Bars -Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2068113 -Addresses: CVE-2022-1304 -Addresses-Debian-Bug: #1010263 -Signed-off-by: Theodore Ts'o ---- - lib/ext2fs/extent.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - ---- a/lib/ext2fs/extent.c -+++ b/lib/ext2fs/extent.c -@@ -495,6 +495,10 @@ retry: - ext2fs_le16_to_cpu(eh->eh_entries); - newpath->max_entries = ext2fs_le16_to_cpu(eh->eh_max); - -+ /* Make sure there is at least one extent present */ -+ if (newpath->left <= 0) -+ return EXT2_ET_EXTENT_NO_DOWN; -+ - if (path->left > 0) { - ix++; - newpath->end_blk = ext2fs_le32_to_cpu(ix->ei_block); -@@ -1630,6 +1634,10 @@ errcode_t ext2fs_extent_delete(ext2_exte - - cp = path->curr; - -+ /* Sanity check before memmove() */ -+ if (path->left < 0) -+ return EXT2_ET_EXTENT_LEAF_BAD; -+ - if (path->left) { - memmove(cp, cp + sizeof(struct ext3_extent_idx), - path->left * sizeof(struct ext3_extent_idx)); diff --git a/package/utils/f2fs-tools/Makefile b/package/utils/f2fs-tools/Makefile index aec51dcf00..27a6fd2248 100644 --- a/package/utils/f2fs-tools/Makefile +++ b/package/utils/f2fs-tools/Makefile @@ -8,16 +8,17 @@ include $(TOPDIR)/rules.mk PKG_NAME:=f2fs-tools -PKG_VERSION:=1.14.0 -PKG_RELEASE:=3 +PKG_VERSION:=1.16.0 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git/snapshot/ -PKG_HASH:=619263d4e2022152a1472c1d912eaae104f20bd227ce0bb9d41d1d6608094bd1 +PKG_HASH:=208c7a07e95383fbd7b466b5681590789dcb41f41bf197369c41a95383b57c5e PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0-only PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:f2fs-tools_project:f2fs-tools PKG_FIXUP:=autoreconf PKG_BUILD_PARALLEL:=1 @@ -34,18 +35,37 @@ define Package/f2fs-tools/Default VARIANT:=default endef +define Package/f2fs-tools/SELinux + SECTION:=utils + CATEGORY:=Utilities + SUBMENU:=Filesystem + DEPENDS:=+libf2fs-selinux +libselinux + URL:=http://git.kernel.org/cgit/linux/kernel/git/jaegeuk/f2fs-tools.git + VARIANT:=selinux +endef + define Package/mkf2fs $(Package/f2fs-tools/Default) TITLE:=Utility for creating a Flash-Friendly File System (F2FS) CONFLICTS:=mkf2fs-selinux endef +define Package/mkf2fs-selinux + $(Package/f2fs-tools/SELinux) + TITLE:=Utility for creating a Flash-Friendly File System (F2FS) with SELinux support +endef + define Package/f2fsck $(Package/f2fs-tools/Default) TITLE:=Utility for checking/repairing a Flash-Friendly File System (F2FS) CONFLICTS:=f2fsck-selinux endef +define Package/f2fsck-selinux + $(Package/f2fs-tools/SELinux) + TITLE:=Utility for checking/repairing a Flash-Friendly File System (F2FS) with SELinux support +endef + define Package/f2fs-tools $(Package/f2fs-tools/Default) TITLE:=Tools for Flash-Friendly File System (F2FS) @@ -53,6 +73,12 @@ define Package/f2fs-tools CONFLICTS:=f2fs-tools-selinux endef +define Package/f2fs-tools-selinux + $(Package/f2fs-tools/SELinux) + TITLE:=Tools for Flash-Friendly File System (F2FS) with SELinux support + DEPENDS += +mkf2fs-selinux +f2fsck-selinux +endef + define Package/libf2fs SECTION:=libs CATEGORY:=Libraries @@ -63,25 +89,47 @@ define Package/libf2fs VARIANT:=default endef +define Package/libf2fs-selinux + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Library for Flash-Friendly File System (F2FS) tools with SELinux support + DEPENDS:=+libuuid +libselinux + ABI_VERSION:=6 + VARIANT:=selinux +endef + CONFIGURE_ARGS += \ --disable-static \ --without-blkid \ - --without-selinux + --without-lzo2 \ + --without-lz4 + +ifneq ($(BUILD_VARIANT),selinux) + CONFIGURE_ARGS += --without-selinux +endif CONFIGURE_VARS += \ ac_cv_file__git=no +ifneq ($(CONFIG_USE_MUSL),) + CONFIGURE_VARS += ac_cv_func_lseek64=yes +endif + define Package/libf2fs/install $(INSTALL_DIR) $(1)/usr/lib $(CP) \ $(PKG_INSTALL_DIR)/usr/lib/libf2fs.so.* $(1)/usr/lib/ endef +Package/libf2fs-selinux/install = $(Package/libf2fs/install) + define Package/mkf2fs/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/mkfs.f2fs $(1)/usr/sbin endef +Package/mkf2fs-selinux/install = $(Package/mkf2fs/install) + define Package/f2fsck/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/fsck.f2fs $(1)/usr/sbin @@ -91,14 +139,21 @@ define Package/f2fsck/install ln -s /usr/sbin/fsck.f2fs $(1)/usr/sbin/resize.f2fs endef +Package/f2fsck-selinux/install = $(Package/f2fsck/install) + define Package/f2fs-tools/install $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/f2fstat $(1)/usr/sbin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/fibmap.f2fs $(1)/usr/sbin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/parse.f2fs $(1)/usr/sbin endef +Package/f2fs-tools-selinux/install = $(Package/f2fs-tools/install) + $(eval $(call BuildPackage,libf2fs)) +$(eval $(call BuildPackage,libf2fs-selinux)) $(eval $(call BuildPackage,mkf2fs)) +$(eval $(call BuildPackage,mkf2fs-selinux)) $(eval $(call BuildPackage,f2fsck)) +$(eval $(call BuildPackage,f2fsck-selinux)) $(eval $(call BuildPackage,f2fs-tools)) +$(eval $(call BuildPackage,f2fs-tools-selinux)) diff --git a/package/utils/f2fs-tools/patches/200-resize_f2fs-fix_wrong_ovp_calculation.patch b/package/utils/f2fs-tools/patches/200-resize_f2fs-fix_wrong_ovp_calculation.patch deleted file mode 100644 index 0b433f76c4..0000000000 --- a/package/utils/f2fs-tools/patches/200-resize_f2fs-fix_wrong_ovp_calculation.patch +++ /dev/null @@ -1,46 +0,0 @@ -From f056fbeff08d30a6d9acdb9e06704461ceee3500 Mon Sep 17 00:00:00 2001 -From: Jaegeuk Kim -Date: Thu, 1 Apr 2021 20:13:55 -0700 -Subject: resize.f2fs: fix wrong ovp calculation - -beroal reported a mount failure due to broken valid_user_blocks. -[ 6890.647749] F2FS-fs (loop0): Wrong valid_user_blocks: 16040048, -user_block_count: 10016768 - -From fsck, - -segment_count_main [0x 9a95 : 39573] --> 39573 * 2MB = 78GB as user space - -overprov_segment_count [0x 4e29 : 20009] --> 20009 * 2MB = 40GB as overprovisioned space which user can't see. - -But, -[FSCK] valid_block_count matching with CP [Ok..] [0xf4c070] --> 0xf4c070 = 16040048 - -valid_block_count [0x f4c070 : 16040048] --> So, this is correct. - -It turns out resize.f2fs gave very large and wrong overprovisioning space -result in shortage of user blocks. The root cause was f2fs_get_usable_segments() -didn't consider resize case which needs segment_count_main from new superblock. - -Fixes: f8410857b7a8 ("f2fs-tools: zns zone-capacity support") -Signed-off-by: Jaegeuk Kim ---- - lib/libf2fs_zoned.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/lib/libf2fs_zoned.c -+++ b/lib/libf2fs_zoned.c -@@ -495,6 +495,9 @@ uint32_t f2fs_get_usable_segments(struct - int i, j; - uint32_t usable_segs = 0, zone_segs; - -+ if (c.func == RESIZE) -+ return get_sb(segment_count_main); -+ - for (i = 0; i < c.ndevs; i++) { - if (c.devices[i].zoned_model != F2FS_ZONED_HM) { - usable_segs += c.devices[i].total_segments; diff --git a/package/utils/fbtest/Makefile b/package/utils/fbtest/Makefile new file mode 100644 index 0000000000..464b34f9f2 --- /dev/null +++ b/package/utils/fbtest/Makefile @@ -0,0 +1,39 @@ +# +# Copyright (C) 2012 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=fbtest +PKG_RELEASE:=1 + +PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/fbtest + SECTION:=utils + CATEGORY:=Utilities + TITLE:=Frame buffer device testing tool + DEPENDS:=@DISPLAY_SUPPORT +endef + +define Build/Configure +endef + +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR) \ + CC="$(TARGET_CC)" \ + CFLAGS="$(TARGET_CFLAGS) -Wall" \ + LDFLAGS="$(TARGET_LDFLAGS)" +endef + +define Package/fbtest/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/fbtest $(1)/usr/sbin/ +endef + +$(eval $(call BuildPackage,fbtest)) diff --git a/package/utils/fbtest/src/Makefile b/package/utils/fbtest/src/Makefile new file mode 100644 index 0000000000..f7c9f86a87 --- /dev/null +++ b/package/utils/fbtest/src/Makefile @@ -0,0 +1,14 @@ +CC = gcc +CFLAGS = -Wall +OBJS = fbtest.o + +all: fbtest + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +fbtest: $(OBJS) + $(CC) -o $@ $(OBJS) + +clean: + rm -f fbtest *.o diff --git a/package/utils/fbtest/src/fbtest.c b/package/utils/fbtest/src/fbtest.c new file mode 100644 index 0000000000..021b80303c --- /dev/null +++ b/package/utils/fbtest/src/fbtest.c @@ -0,0 +1,446 @@ +/****************************************************************************** + * fbtest - fbtest.c + * test program for the tuxbox-framebuffer device + * tests all GTX/eNX supported modes + * + * (c) 2003 Carsten Juttner (carjay@gmx.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * The Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + ****************************************************************************** + * $Id: fbtest.c,v 1.5 2005/01/14 23:14:41 carjay Exp $ + ******************************************************************************/ + +// TODO: - should restore the colour map and mode to what it was before +// - is colour map handled correctly? + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#define FBDEV "/dev/fb0" + +struct vidsize{ + int width; + int height; +}; +static +const struct vidsize vidsizetable[]={ // all supported sizes + {720,576},{720,480},{720,288},{720,240}, + {640,576},{640,480},{640,288},{640,240}, + {360,576},{360,480},{360,288},{360,240}, + {320,576},{320,480},{320,288},{320,240} +}; +#define VIDSIZENUM (sizeof(vidsizetable)/sizeof(struct vidsize)) + +enum pixenum{ // keep in sync with pixname ! + CLUT4=0, + CLUT8, + RGB565, + ARGB1555, + ARGB +}; +const char *pixname[] = { + "CLUT4", + "CLUT8", + "RGB565", + "ARGB1555", + "ARGB" +}; + +struct pixelformat{ + char *name; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + char bpp; + char pixenum; +}; + +static // so far these are all modes supported by the eNX (only partially by GTX) +const struct pixelformat pixelformattable[] = { + { .name = "CLUT4 ARGB8888", // CLUT4 (ARGB8888) + .bpp = 4, .pixenum = CLUT4, + .red = { .offset = 0, .length=8, .msb_right =0 }, + .green = { .offset = 0, .length=8, .msb_right =0 }, + .blue = { .offset = 0, .length=8, .msb_right =0 }, + .transp= { .offset = 0, .length=8, .msb_right =0 } + }, + { .name = "CLUT4 ARGB1555", // CLUT4 (ARGB1555) + .bpp = 4, .pixenum = CLUT4, + .red = { .offset = 0, .length=5, .msb_right =0 }, + .green = { .offset = 0, .length=5, .msb_right =0 }, + .blue = { .offset = 0, .length=5, .msb_right =0 }, + .transp= { .offset = 0, .length=1, .msb_right =0 } + }, + { .name = "CLUT8 ARGB8888", // CLUT8 (ARGB8888) + .bpp = 8, .pixenum = CLUT8, + .red = { .offset = 0, .length=8, .msb_right =0 }, + .green = { .offset = 0, .length=8, .msb_right =0 }, + .blue = { .offset = 0, .length=8, .msb_right =0 }, + .transp= { .offset = 0, .length=8, .msb_right =0 } + }, + { .name = "CLUT8 ARGB1555", // CLUT8 (ARGB1555) + .bpp = 8, .pixenum = CLUT8, + .red = { .offset = 0, .length=5, .msb_right =0 }, + .green = { .offset = 0, .length=5, .msb_right =0 }, + .blue = { .offset = 0, .length=5, .msb_right =0 }, + .transp= { .offset = 0, .length=1, .msb_right =0 } + }, + { .name = "ARGB1555", // ARGB1555 + .bpp = 16, .pixenum = ARGB1555, + .red = { .offset = 10, .length=5, .msb_right =0 }, + .green = { .offset = 5, .length=5, .msb_right =0 }, + .blue = { .offset = 0, .length=5, .msb_right =0 }, + .transp= { .offset = 15, .length=1, .msb_right =0 } + }, + { .name = "RGB565", // RGB565 + .bpp = 16, .pixenum = RGB565, + .red = { .offset = 11, .length=5, .msb_right =0 }, + .green = { .offset = 5, .length=6, .msb_right =0 }, + .blue = { .offset = 0, .length=5, .msb_right =0 }, + .transp= { .offset = 0, .length=0, .msb_right =0 } + }, + { .name = "ARGB", // 32 f*cking bits, the real McCoy :) + .bpp = 32, .pixenum = ARGB, + .red = { .offset = 16, .length=8, .msb_right =0 }, + .green = { .offset = 8, .length=8, .msb_right =0 }, + .blue = { .offset = 0, .length=8, .msb_right =0 }, + .transp= { .offset = 24, .length=8, .msb_right =0 } + } +}; +#define PIXELFORMATNUM (sizeof(pixelformattable)/sizeof(struct pixelformat)) + +struct colour { + __u16 r; + __u16 g; + __u16 b; + __u16 a; +}; +static +struct colour colourtable[] = { + {.r =0xffff, .g = 0xffff, .b=0xffff, .a=0xffff}, // fully transparent white + {.r =0xffff, .g = 0x0000, .b=0x0000, .a=0x0000}, // red + {.r =0x0000, .g = 0xffff, .b=0x0000, .a=0x0000}, // green + {.r =0x0000, .g = 0x0000, .b=0xffff, .a=0x0000}, // blue + {.r =0x0000, .g = 0x0000, .b=0x0000, .a=0x0000} // black +}; +#define COLOURNUM (sizeof(colourtable)/sizeof(struct colour)) + +struct rect{ + int x; + int y; + int width; + int height; + const struct colour *col; +}; +struct pixel{ // up to 32 bits of pixel information + char byte[4]; +}; + +void col2pixel (struct pixel *pix, const struct pixelformat *pixf, const struct colour *col){ + switch (pixf->pixenum){ + case RGB565: + pix->byte[0]=(col->r&0xf8)|(col->g&0xfc)>>5; + pix->byte[1]=(col->g&0xfc)<<3|(col->b&0xf8)>>3; + break; + case ARGB1555: + pix->byte[0]=(col->a&0x80)|(col->r&0xf8)>>1|(col->g&0xf8)>>6; + pix->byte[1]=(col->g&0xf8)<<2|(col->b&0xf8)>>3; + break; + case ARGB: + pix->byte[0]=col->a; + pix->byte[1]=col->r; + pix->byte[2]=col->g; + pix->byte[3]=col->b; + break; + default: + printf ("unknown pixelformat\n"); + exit(1); + } +} + +int setmode(int fbd, const struct pixelformat *pixf,const struct vidsize *vids){ + struct fb_var_screeninfo var; + int stat; + stat = ioctl (fbd, FBIOGET_VSCREENINFO,&var); + if (stat<0) return -2; + + var.xres= vids->width; + var.xres_virtual = vids->width; + var.yres= vids->height; + var.yres_virtual = vids->height; + + var.bits_per_pixel = pixf->bpp; + var.red = pixf->red; + var.green = pixf->green; + var.blue = pixf->blue; + var.transp = pixf->transp; + + stat = ioctl (fbd, FBIOPUT_VSCREENINFO,&var); + if (stat<0) return -1; + return 0; +} + +// unefficient implementation, do NOT use it for your next ego shooter, please :) +// for 4-Bit only rectangles with even width are supported +// CLUT-modes use value of red component as index +void drawrect(void *videoram, struct rect *r, const struct pixelformat *pixf, const struct vidsize *vids){ + int x,y,corwidth, bpp = 0, tocopy = 1; + struct pixel pix; + unsigned char *pmem = videoram; + corwidth = r->width; // actually only "corrected" for 4 Bit + + if (pixf->pixenum!=CLUT4&&pixf->pixenum!=CLUT8){ + switch (pixf->pixenum){ + case ARGB1555: + case RGB565: + bpp = 16; + tocopy = 2; + break; + case ARGB: + bpp = 32; + tocopy = 4; + break; + default: + printf ("drawrect: unknown pixelformat(%d) bpp:%d\n",pixf->pixenum,pixf->bpp); + exit(1); + } + col2pixel(&pix,pixf,r->col); + } else { + switch (pixf->pixenum){ // CLUT = Colour LookUp Table (palette) + case CLUT4: // take red value as index in this case + pix.byte[0]=(r->col->r)<<4|(r->col->r&0xf); // slightly cryptic... "rect->colour->red" + corwidth>>=1; // we copy bytes + bpp=4; + tocopy=1; + break; + case CLUT8: + pix.byte[0]=(r->col->r&0xff); + bpp=8; + tocopy=1; + break; + } + } + pmem=videoram+((((r->y*vids->width)+r->x)*bpp)>>3); + for (y=0;yheight;y++){ + int offset = 0; + for (x=0;xwidth*bpp)>>3); // skip one whole line, actually should be taken from "fix-info" + } +} + +// create quick little test image, 4 colours from table +void draw4field(void *videoram, const struct pixelformat *pixf, const struct vidsize *vids){ + struct rect r; + struct colour c; + int height, width; + c.r = 1; // only used for the indexed modes, r is taken as index + height = vids->height; + width = vids->width; + + r.height = height>>1; + r.width = width>>1; + r.x = 0; r.y = 0; + if (pixf->pixenum==CLUT4||pixf->pixenum==CLUT8) r.col = &c; + else r.col = &colourtable[1]; + drawrect (videoram, &r, pixf, vids); + + r.x = width/2; r.y = 0; + if (pixf->pixenum==CLUT4||pixf->pixenum==CLUT8) c.r = 2; + else r.col = &colourtable[2]; + drawrect (videoram, &r, pixf, vids); + + r.x = 0; r.y = height/2; + if (pixf->pixenum==CLUT4||pixf->pixenum==CLUT8) c.r = 3; + else r.col = &colourtable[3]; + drawrect (videoram, &r, pixf, vids); + + r.x = width/2; r.y = height/2; + if (pixf->pixenum==CLUT4||pixf->pixenum==CLUT8) c.r = 0; + else r.col = &colourtable[0]; + drawrect (videoram, &r, pixf, vids); +} + +void usage(char *name){ + printf ("Usage: %s [options]\n" + "Options: -f\n" + " where format is one of:\n" + " CLUT4,CLUT8,ARGB1555,RGB565,ARGB\n" + " -sx\n" + " where width is either 720,640,360,320\n" + " and height is either 288,240,480,576\n" + " -n\n" + " disables clearing the framebuffer after drawing\n" + " the testimage. This can be useful to keep the last\n" + " drawn image onscreen.\n" + "\nExample: %s -fRGB322\n",name,name); + exit(0); +} + +int main (int argc,char **argv){ + struct fb_fix_screeninfo fix; + struct fb_var_screeninfo var; + struct fb_cmap cmap; + struct rect r; + int fbd; + unsigned char *pfb; + int stat; + int optchar,fmode=-1,smode=-1,clear=1; + int i_cmap,i_size,i_pix; + extern char *optarg; + + if (argc!=0&&argc>4) usage(argv[0]); + while ( (optchar = getopt (argc,argv,"f:s:n"))!= -1){ + int i,height,width; + switch (optchar){ + case 'f': + for (i=0;i<(sizeof(pixname)/sizeof(char*));i++){ + if (!strncmp (optarg,pixname[i],strlen(pixname[i]))){ + fmode=i; + printf ("displaying only %s-modes\n",pixname[i]); + break; + } + } + if (fmode==-1){ + printf ("unknown pixelformat\n"); + exit(0); + } + break; + case 's': + if (sscanf (optarg,"%dx%d",&width,&height)!=2){ + printf ("parsing size failed\n"); + exit(0); + } else { + printf ("requested size %dx%d\n",width,height); + for (i=0;i + * + * Based on zpipe, which is an example of proper use of zlib's inflate(). + * that is Not copyrighted -- provided to the public domain + * Version 1.4 11 December 2005 Mark Adler + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "zlib.h" + +#define CHUNK 1024 + +static inline size_t special_min(size_t a, size_t b) +{ + return a == 0 ? b : (a < b ? a : b); +} + +/* Decompress from file source to file dest until stream ends or EOF. + inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_DATA_ERROR if the deflate data is + invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and + the version of the library linked do not match, or Z_ERRNO if there + is an error reading or writing the files. */ +static int inf(FILE *source, FILE *dest, size_t limit, size_t skip) +{ + int ret; + size_t have; + z_stream strm; + unsigned char in[CHUNK]; + unsigned char out[CHUNK]; + + /* allocate inflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); + if (ret != Z_OK) + return ret; + + /* decompress until deflate stream ends or end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK, source); + if (ferror(source)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + if (strm.avail_in == 0) + break; + strm.next_in = in; + + /* run inflate() on input until output buffer not full */ + do { + strm.avail_out = CHUNK; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ + switch (ret) { + case Z_NEED_DICT: + ret = Z_DATA_ERROR; /* and fall through */ + case Z_DATA_ERROR: + case Z_MEM_ERROR: + (void)inflateEnd(&strm); + return ret; + } + have = special_min(limit, CHUNK - strm.avail_out) - skip; + if (fwrite(&out[skip], have, 1, dest) != 1 || ferror(dest)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + skip = 0; + limit -= have; + } while (strm.avail_out == 0 && limit > 0); + + /* done when inflate() says it's done */ + } while (ret != Z_STREAM_END && limit > 0); + + /* clean up and return */ + (void)inflateEnd(&strm); + return (limit == 0 ? Z_OK : (ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR)); +} + +/* report a zlib or i/o error */ +static void zerr(int ret) +{ + switch (ret) { + case Z_ERRNO: + if (ferror(stdin)) + fputs("error reading stdin\n", stderr); + if (ferror(stdout)) + fputs("error writing stdout\n", stderr); + break; + case Z_STREAM_ERROR: + fputs("invalid compression level\n", stderr); + break; + case Z_DATA_ERROR: + fputs("invalid or incomplete deflate data\n", stderr); + break; + case Z_MEM_ERROR: + fputs("out of memory\n", stderr); + break; + case Z_VERSION_ERROR: + fputs("zlib version mismatch!\n", stderr); + } +} + +static unsigned int get_num(char *str) +{ + if (!strncmp("0x", str, 2)) + return strtoul(str+2, NULL, 16); + else + return strtoul(str, NULL, 10); +} + +static void usage(void) +{ + fprintf(stderr, "Usage: fritz_cal_extract [-s seek offset] [-i skip] [-o output file] [-l limit] [infile] -e entry_id\n" + "Finds and extracts zlib compressed calibration data in the EVA loader\n"); + exit(EXIT_FAILURE); +} + +struct cal_entry { + uint16_t id; + uint16_t len; +} __attribute__((packed)); + +/* compress or decompress from stdin to stdout */ +int main(int argc, char **argv) +{ + struct cal_entry cal = { .len = 0 }; + FILE *in = stdin; + FILE *out = stdout; + size_t limit = 0, skip = 0; + int initial_offset = 0; + int entry = -1; + int ret; + int opt; + + while ((opt = getopt(argc, argv, "s:e:o:l:i:")) != -1) { + switch (opt) { + case 's': + initial_offset = (int)get_num(optarg); + if (errno) { + perror("Failed to parse seek offset"); + goto out_bad; + } + break; + case 'e': + entry = (int) htobe16(get_num(optarg)); + if (errno) { + perror("Failed to entry id"); + goto out_bad; + } + break; + case 'o': + out = fopen(optarg, "w"); + if (!out) { + perror("Failed to create output file"); + goto out_bad; + } + break; + case 'l': + limit = (size_t)get_num(optarg); + if (errno) { + perror("Failed to parse limit"); + goto out_bad; + } + break; + case 'i': + skip = (size_t)get_num(optarg); + if (errno) { + perror("Failed to parse skip"); + goto out_bad; + } + break; + default: /* '?' */ + usage(); + } + } + + if (entry == -1) + usage(); + + if (argc > 1 && optind <= argc) { + in = fopen(argv[optind], "r"); + if (!in) { + perror("Failed to open input file"); + goto out_bad; + } + } + + if (initial_offset) { + ret = fseek(in, initial_offset, SEEK_CUR); + if (ret) { + perror("Failed to seek to calibration table"); + goto out_bad; + } + } + + do { + ret = fseek(in, be16toh(cal.len), SEEK_CUR); + if (feof(in)) { + fprintf(stderr, "Reached end of file, but didn't find the matching entry\n"); + goto out_bad; + } else if (ferror(in)) { + perror("Failure during seek"); + goto out_bad; + } + + ret = fread(&cal, 1, sizeof cal, in); + if (ret != sizeof cal) + goto out_bad; + } while (entry != cal.id || cal.id == 0xffff); + + if (cal.id == 0xffff) { + fprintf(stderr, "Reached end of filesystem, but didn't find the matching entry\n"); + goto out_bad; + } + + ret = inf(in, out, limit, skip); + if (ret == Z_OK) + goto out; + + zerr(ret); + +out_bad: + ret = EXIT_FAILURE; + +out: + if (in) + fclose(in); + if (out) + fclose(out); + return ret; +} diff --git a/package/utils/fritz-tools/src/fritz_tffs_nand_read.c b/package/utils/fritz-tools/src/fritz_tffs_nand_read.c new file mode 100644 index 0000000000..6962414500 --- /dev/null +++ b/package/utils/fritz-tools/src/fritz_tffs_nand_read.c @@ -0,0 +1,587 @@ +/* + * A tool for reading the TFFS partitions (a name-value storage usually + * found in AVM Fritz!Box based devices) on nand flash. + * + * Copyright (c) 2018 Valentin Spreckels + * + * Based on the fritz_tffs_read tool: + * Copyright (c) 2015-2016 Martin Blumenstingl + * and on the TFFS 2.0 kernel driver from AVM: + * Copyright (c) 2004-2007 AVM GmbH + * and the TFFS 3.0 kernel driver from AVM: + * Copyright (C) 2004-2014 AVM GmbH + * and the libreCMC TFFS kernel driver: + * Copyright (c) 2013 John Crispin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DEFAULT_TFFS_SIZE (256 * 1024) + +#define TFFS_ID_END 0xffffffff +#define TFFS_ID_TABLE_NAME 0x000001ff + +#define TFFS_BLOCK_HEADER_MAGIC 0x41564d5f54464653ULL +#define TFFS_VERSION 0x0003 +#define TFFS_ENTRY_HEADER_SIZE 0x18 +#define TFFS_MAXIMUM_SEGMENT_SIZE (0x800 - TFFS_ENTRY_HEADER_SIZE) + +#define TFFS_SECTOR_SIZE 0x0800 +#define TFFS_SECTOR_OOB_SIZE 0x0040 +#define TFFS_SECTORS_PER_PAGE 2 + +#define TFFS_SEGMENT_CLEARED 0xffffffff + +static char *progname; +static char *mtddev; +static char *name_filter = NULL; +static bool show_all = false; +static bool print_all_key_names = false; +static bool read_oob_sector_health = false; +static bool swap_bytes = false; +static uint8_t readbuf[TFFS_SECTOR_SIZE]; +static uint8_t oobbuf[TFFS_SECTOR_OOB_SIZE]; +static uint32_t blocksize; +static int mtdfd; +static uint32_t num_sectors; +static uint8_t *sectors; +static uint32_t *sector_ids; + +static inline void sector_mark_bad(int num) +{ + sectors[num / 8] &= ~(0x80 >> (num % 8)); +}; + +static inline uint8_t sector_get_good(int num) +{ + return sectors[num / 8] & 0x80 >> (num % 8); +}; + +struct tffs_entry_segment { + uint32_t len; + void *val; +}; + +struct tffs_entry { + uint32_t len; + void *val; +}; + +struct tffs_name_table_entry { + uint32_t id; + char *val; +}; + +struct tffs_key_name_table { + uint32_t size; + struct tffs_name_table_entry *entries; +}; + +static inline uint8_t read_uint8(void *buf, ptrdiff_t off) +{ + return *(uint8_t *)(buf + off); +} + +static inline uint32_t read_uint32(void *buf, ptrdiff_t off) +{ + uint32_t tmp = *(uint32_t *)(buf + off); + if (swap_bytes) { + tmp = be32toh(tmp); + } + return tmp; +} + +static inline uint64_t read_uint64(void *buf, ptrdiff_t off) +{ + uint64_t tmp = *(uint64_t *)(buf + off); + if (swap_bytes) { + tmp = be64toh(tmp); + } + return tmp; +} + +static int read_sector(off_t pos) +{ + if (pread(mtdfd, readbuf, TFFS_SECTOR_SIZE, pos) != TFFS_SECTOR_SIZE) { + return -1; + } + + sector_ids[pos / TFFS_SECTOR_SIZE] = read_uint32(readbuf, 0x00); + + return 0; +} + +static int read_sectoroob(off_t pos) +{ + struct mtd_oob_buf oob = { + .start = pos, + .length = TFFS_SECTOR_OOB_SIZE, + .ptr = oobbuf + }; + + if (ioctl(mtdfd, MEMREADOOB, &oob) < 0) { + return -1; + } + + return 0; +} + +static inline uint32_t get_walk_size(uint32_t entry_len) +{ + return (entry_len + 3) & ~0x03; +} + +static void print_entry_value(const struct tffs_entry *entry) +{ + /* These are NOT NULL terminated. */ + fwrite(entry->val, 1, entry->len, stdout); +} + +static int find_entry(uint32_t id, struct tffs_entry *entry) +{ + uint32_t rev = 0; + uint32_t num_segments = 0; + struct tffs_entry_segment *segments = NULL; + + off_t pos = 0; + uint8_t block_end = 0; + for (uint32_t sector = 0; sector < num_sectors; sector++, pos += TFFS_SECTOR_SIZE) { + if (block_end) { + if (pos % blocksize == 0) { + block_end = 0; + } + } else if (sector_get_good(sector)) { + if (sector_ids[sector]) { + if (sector_ids[sector] == TFFS_ID_END) { + /* no more entries in this block */ + block_end = 1; + continue; + } + + if (sector_ids[sector] != id) + continue; + } + + if (read_sectoroob(pos) || read_sector(pos)) { + fprintf(stderr, "ERROR: sector isn't readable, but has been previously!\n"); + exit(EXIT_FAILURE); + } + uint32_t read_id = read_uint32(readbuf, 0x00); + uint32_t read_len = read_uint32(readbuf, 0x04); + uint32_t read_rev = read_uint32(readbuf, 0x0c); + if (read_oob_sector_health) { + uint32_t oob_id = read_uint32(oobbuf, 0x02); + uint32_t oob_len = read_uint32(oobbuf, 0x06); + uint32_t oob_rev = read_uint32(oobbuf, 0x0a); + + if (oob_id != read_id || oob_len != read_len || oob_rev != read_rev) { + fprintf(stderr, "Warning: sector has inconsistent metadata\n"); + continue; + } + } + if (read_id == TFFS_ID_END) { + /* no more entries in this block */ + block_end = 1; + continue; + } + if (read_len > TFFS_MAXIMUM_SEGMENT_SIZE) { + fprintf(stderr, "Warning: segment is longer than possible\n"); + continue; + } + if (read_id == id) { + if (read_rev < rev) { + /* obsolete revision => ignore this */ + continue; + } + if (read_rev > rev) { + /* newer revision => clear old data */ + for (uint32_t i = 0; i < num_segments; i++) { + free(segments[i].val); + } + free (segments); + rev = read_rev; + num_segments = 0; + segments = NULL; + } + + uint32_t seg = read_uint32(readbuf, 0x10); + + if (seg == TFFS_SEGMENT_CLEARED) { + continue; + } + + uint32_t next_seg = read_uint32(readbuf, 0x14); + + uint32_t new_num_segs = next_seg == 0 ? seg + 1 : next_seg + 1; + if (new_num_segs > num_segments) { + segments = realloc(segments, new_num_segs * sizeof(struct tffs_entry_segment)); + memset(segments + (num_segments * sizeof(struct tffs_entry_segment)), 0x0, + (new_num_segs - num_segments) * sizeof(struct tffs_entry_segment)); + num_segments = new_num_segs; + } + segments[seg].len = read_len; + segments[seg].val = malloc(read_len); + memcpy(segments[seg].val, readbuf + TFFS_ENTRY_HEADER_SIZE, read_len); + } + } + } + + if (num_segments == 0) { + return 0; + } + + assert (segments != NULL); + + uint32_t len = 0; + for (uint32_t i = 0; i < num_segments; i++) { + if (segments[i].val == NULL) { + /* missing segment */ + return 0; + } + + len += segments[i].len; + } + + void *p = malloc(len); + entry->val = p; + entry->len = len; + for (uint32_t i = 0; i < num_segments; i++) { + memcpy(p, segments[i].val, segments[i].len); + p += segments[i].len; + } + + return 1; +} + +static void parse_key_names(struct tffs_entry *names_entry, + struct tffs_key_name_table *key_names) +{ + uint32_t pos = 0, i = 0; + struct tffs_name_table_entry *name_item; + + key_names->entries = NULL; + + do { + key_names->entries = realloc(key_names->entries, + sizeof(struct tffs_name_table_entry) * (i + 1)); + if (key_names->entries == NULL) { + fprintf(stderr, "ERROR: memory allocation failed!\n"); + exit(EXIT_FAILURE); + } + name_item = &key_names->entries[i]; + + name_item->id = read_uint32(names_entry->val, pos); + pos += sizeof(uint32_t); + name_item->val = strdup((const char *)(names_entry->val + pos)); + + /* + * There is no "length" field because the string values are + * simply NULL-terminated -> strlen() gives us the size. + */ + pos += get_walk_size(strlen(name_item->val) + 1); + + ++i; + } while (pos < names_entry->len); + + key_names->size = i; +} + +static void show_all_key_names(struct tffs_key_name_table *key_names) +{ + for (uint32_t i = 0; i < key_names->size; i++) + printf("%s\n", key_names->entries[i].val); +} + +static int show_all_key_value_pairs(struct tffs_key_name_table *key_names) +{ + uint8_t has_value = 0; + struct tffs_entry tmp; + + for (uint32_t i = 0; i < key_names->size; i++) { + if (find_entry(key_names->entries[i].id, &tmp)) { + printf("%s=", (const char *)key_names->entries[i].val); + print_entry_value(&tmp); + printf("\n"); + has_value++; + free(tmp.val); + } + } + + if (!has_value) { + fprintf(stderr, "ERROR: no values found!\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +static int show_matching_key_value(struct tffs_key_name_table *key_names) +{ + struct tffs_entry tmp; + const char *name; + + for (uint32_t i = 0; i < key_names->size; i++) { + name = key_names->entries[i].val; + + if (strcmp(name, name_filter) == 0) { + if (find_entry(key_names->entries[i].id, &tmp)) { + print_entry_value(&tmp); + printf("\n"); + free(tmp.val); + return EXIT_SUCCESS; + } else { + fprintf(stderr, + "ERROR: no value found for name %s!\n", + name); + return EXIT_FAILURE; + } + } + } + + fprintf(stderr, "ERROR: Unknown key name %s!\n", name_filter); + return EXIT_FAILURE; +} + +static int check_sector(off_t pos) +{ + if (!read_oob_sector_health) { + return 1; + } + if (read_sectoroob(pos)) { + return 0; + } + if (read_uint8(oobbuf, 0x00) != 0xff) { + /* block is bad */ + return 0; + } + if (read_uint8(oobbuf, 0x01) != 0xff) { + /* sector is bad */ + return 0; + } + return 1; +} + +static int check_block(off_t pos, uint32_t sector) +{ + if (!check_sector(pos)) { + return 0; + } + if (read_sector(pos)) { + return 0; + } + if (read_uint64(readbuf, 0x00) != TFFS_BLOCK_HEADER_MAGIC) { + fprintf(stderr, "Warning: block without magic header. Skipping block\n"); + return 0; + } + if (read_uint32(readbuf, 0x0c) != TFFS_SECTORS_PER_PAGE) { + fprintf(stderr, "Warning: block with wrong number of sectors per page. Skipping block\n"); + return 0; + } + + uint32_t num_hdr_bad = read_uint32(readbuf, 0x0c); + for (uint32_t i = 0; i < num_hdr_bad; i++) { + uint32_t bad = sector + read_uint64(readbuf, 0x1c + sizeof(uint64_t)*i); + sector_mark_bad(bad); + } + + return 1; +} + +static int scan_mtd(void) +{ + struct mtd_info_user info; + + if (ioctl(mtdfd, MEMGETINFO, &info)) { + return 0; + } + + blocksize = info.erasesize; + + num_sectors = info.size / TFFS_SECTOR_SIZE; + sectors = malloc((num_sectors + 7) / 8); + sector_ids = calloc(num_sectors, sizeof(uint32_t)); + if (!sectors || !sector_ids) { + fprintf(stderr, "ERROR: memory allocation failed!\n"); + exit(EXIT_FAILURE); + } + memset(sectors, 0xff, (num_sectors + 7) / 8); + + uint32_t sector = 0, valid_blocks = 0; + uint8_t block_ok = 0; + for (off_t pos = 0; pos < info.size; sector++, pos += TFFS_SECTOR_SIZE) { + if (pos % info.erasesize == 0) { + block_ok = check_block(pos, sector); + /* first sector of the block contains metadata + => handle it like a bad sector */ + sector_mark_bad(sector); + if (block_ok) { + valid_blocks++; + } + } else if (!block_ok || !sector_get_good(sector) || !check_sector(pos)) { + sector_mark_bad(sector); + } + } + + return valid_blocks; +} + +static void usage(int status) +{ + FILE *stream = (status != EXIT_SUCCESS) ? stderr : stdout; + + fprintf(stream, "Usage: %s [OPTIONS...]\n", progname); + fprintf(stream, + "\n" + "Options:\n" + " -a list all key value pairs found in the TFFS file/device\n" + " -d inspect the TFFS on mtd device \n" + " -h show this screen\n" + " -l list all supported keys\n" + " -n display the value of the given key\n" + " -o read OOB information about sector health\n" + ); + + exit(status); +} + +static void parse_options(int argc, char *argv[]) +{ + while (1) { + int c; + + c = getopt(argc, argv, "abd:hln:o"); + if (c == -1) + break; + + switch (c) { + case 'a': + show_all = true; + name_filter = NULL; + print_all_key_names = false; + break; + case 'b': + swap_bytes = 1; + break; + case 'd': + mtddev = optarg; + break; + case 'h': + usage(EXIT_SUCCESS); + break; + case 'l': + print_all_key_names = true; + show_all = false; + name_filter = NULL; + break; + case 'n': + name_filter = optarg; + show_all = false; + print_all_key_names = false; + break; + case 'o': + read_oob_sector_health = true; + break; + default: + usage(EXIT_FAILURE); + break; + } + } + + if (!mtddev) { + fprintf(stderr, "ERROR: No input file (-d ) given!\n"); + usage(EXIT_FAILURE); + } + + if (!show_all && !name_filter && !print_all_key_names) { + fprintf(stderr, + "ERROR: either -l, -a or -n is required!\n"); + usage(EXIT_FAILURE); + } +} + +int main(int argc, char *argv[]) +{ + int ret = EXIT_FAILURE; + struct tffs_entry name_table; + struct tffs_key_name_table key_names; + + progname = basename(argv[0]); + + parse_options(argc, argv); + + mtdfd = open(mtddev, O_RDONLY); + if (mtdfd < 0) { + fprintf(stderr, "ERROR: Failed to open tffs device %s\n", + mtddev); + goto out; + } + + if (!scan_mtd()) { + fprintf(stderr, "ERROR: Parsing blocks from tffs device %s failed\n", mtddev); + fprintf(stderr, " Is byte-swapping (-b) required?\n"); + goto out_close; + } + + if (!find_entry(TFFS_ID_TABLE_NAME, &name_table)) { + fprintf(stderr, "ERROR: No name table found on tffs device %s\n", + mtddev); + goto out_free_sectors; + } + + parse_key_names(&name_table, &key_names); + if (key_names.size < 1) { + fprintf(stderr, "ERROR: No name table found on tffs device %s\n", + mtddev); + goto out_free_entry; + } + + if (print_all_key_names) { + show_all_key_names(&key_names); + ret = EXIT_SUCCESS; + } else if (show_all) { + ret = show_all_key_value_pairs(&key_names); + } else { + ret = show_matching_key_value(&key_names); + } + + free(key_names.entries); +out_free_entry: + free(name_table.val); +out_free_sectors: + free(sector_ids); + free(sectors); +out_close: + close(mtdfd); +out: + return ret; +} diff --git a/package/utils/fritz-tools/src/fritz_tffs_read.c b/package/utils/fritz-tools/src/fritz_tffs_read.c new file mode 100644 index 0000000000..666e6c48a6 --- /dev/null +++ b/package/utils/fritz-tools/src/fritz_tffs_read.c @@ -0,0 +1,379 @@ +/* + * A tool for reading the TFFS partitions (a name-value storage usually + * found in AVM Fritz!Box based devices). + * + * Copyright (c) 2015-2016 Martin Blumenstingl + * + * Based on the TFFS 2.0 kernel driver from AVM: + * Copyright (c) 2004-2007 AVM GmbH + * and the libreCMC TFFS kernel driver: + * Copyright (c) 2013 John Crispin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TFFS_ID_END 0xffff +#define TFFS_ID_TABLE_NAME 0x01ff + +static char *progname; +static char *input_file; +static unsigned long tffs_size; +static char *name_filter = NULL; +static bool show_all = false; +static bool print_all_key_names = false; +static bool swap_bytes = false; + +struct tffs_entry_header { + uint16_t id; + uint16_t len; +}; + +struct tffs_entry { + const struct tffs_entry_header *header; + char *name; + uint8_t *val; +}; + +struct tffs_name_table_entry { + const uint32_t *id; + const char *val; +}; + +struct tffs_key_name_table { + uint32_t size; + struct tffs_name_table_entry *entries; +}; + +static inline uint16_t get_header_len(const struct tffs_entry_header *header) +{ + if (swap_bytes) + return ntohs(header->len); + + return header->len; +} + +static inline uint16_t get_header_id(const struct tffs_entry_header *header) +{ + if (swap_bytes) + return ntohs(header->id); + + return header->id; +} + +static inline uint16_t to_entry_header_id(uint32_t name_id) +{ + if (swap_bytes) + return ntohl(name_id) & 0xffff; + + return name_id & 0xffff; +} + +static inline uint32_t get_walk_size(uint32_t entry_len) +{ + return (entry_len + 3) & ~0x03; +} + +static void print_entry_value(const struct tffs_entry *entry) +{ + int i; + + /* These are NOT NULL terminated. */ + for (i = 0; i < get_header_len(entry->header); i++) + fprintf(stdout, "%c", entry->val[i]); +} + +static void parse_entry(uint8_t *buffer, uint32_t pos, + struct tffs_entry *entry) +{ + entry->header = (struct tffs_entry_header *) &buffer[pos]; + entry->val = &buffer[pos + sizeof(struct tffs_entry_header)]; +} + +static int find_entry(uint8_t *buffer, uint16_t id, struct tffs_entry *entry) +{ + uint32_t pos = 0; + + do { + parse_entry(buffer, pos, entry); + + if (get_header_id(entry->header) == id) + return 1; + + pos += sizeof(struct tffs_entry_header); + pos += get_walk_size(get_header_len(entry->header)); + } while (pos < tffs_size && entry->header->id != TFFS_ID_END); + + return 0; +} + +static void parse_key_names(struct tffs_entry *names_entry, + struct tffs_key_name_table *key_names) +{ + uint32_t pos = 0, i = 0; + struct tffs_name_table_entry *name_item; + + key_names->entries = calloc(sizeof(*name_item), 1); + + do { + name_item = &key_names->entries[i]; + + name_item->id = (uint32_t *) &names_entry->val[pos]; + pos += sizeof(*name_item->id); + name_item->val = (const char *) &names_entry->val[pos]; + + /* + * There is no "length" field because the string values are + * simply NULL-terminated -> strlen() gives us the size. + */ + pos += get_walk_size(strlen(name_item->val) + 1); + + ++i; + key_names->entries = realloc(key_names->entries, + sizeof(*name_item) * (i + 1)); + } while (pos < get_header_len(names_entry->header)); + + key_names->size = i; +} + +static void show_all_key_names(struct tffs_key_name_table *key_names) +{ + int i; + + for (i = 0; i < key_names->size; i++) + printf("%s\n", key_names->entries[i].val); +} + +static int show_all_key_value_pairs(uint8_t *buffer, + struct tffs_key_name_table *key_names) +{ + int i, has_value = 0; + uint16_t id; + struct tffs_entry tmp; + + for (i = 0; i < key_names->size; i++) { + id = to_entry_header_id(*key_names->entries[i].id); + + if (find_entry(buffer, id, &tmp)) { + printf("%s=", key_names->entries[i].val); + print_entry_value(&tmp); + printf("\n"); + has_value++; + } + } + + if (!has_value) { + fprintf(stderr, "ERROR: no values found!\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +static int show_matching_key_value(uint8_t *buffer, + struct tffs_key_name_table *key_names) +{ + int i; + uint16_t id; + struct tffs_entry tmp; + const char *name; + + for (i = 0; i < key_names->size; i++) { + name = key_names->entries[i].val; + + if (strcmp(name, name_filter) == 0) { + id = to_entry_header_id(*key_names->entries[i].id); + + if (find_entry(buffer, id, &tmp)) { + print_entry_value(&tmp); + printf("\n"); + return EXIT_SUCCESS; + } else { + fprintf(stderr, + "ERROR: no value found for name %s!\n", + name); + return EXIT_FAILURE; + } + } + } + + fprintf(stderr, "ERROR: Unknown key name %s!\n", name_filter); + return EXIT_FAILURE; +} + +static void usage(int status) +{ + FILE *stream = (status != EXIT_SUCCESS) ? stderr : stdout; + + fprintf(stream, "Usage: %s [OPTIONS...]\n", progname); + fprintf(stream, + "\n" + "Options:\n" + " -a list all key value pairs found in the TFFS file/device\n" + " -b swap bytes while parsing the TFFS file/device\n" + " -h show this screen\n" + " -i inspect the given TFFS file/device \n" + " -l list all supported keys\n" + " -n display the value of the given key\n" + " -s the (max) size of the TFFS file/device \n" + ); + + exit(status); +} + +static int file_exist(char *filename) +{ + struct stat buffer; + + return stat(filename, &buffer) == 0; +} + +static void parse_options(int argc, char *argv[]) +{ + while (1) + { + int c; + + c = getopt(argc, argv, "abhi:ln:s:"); + if (c == -1) + break; + + switch (c) { + case 'a': + show_all = true; + name_filter = NULL; + print_all_key_names = false; + break; + case 'b': + swap_bytes = 1; + break; + case 'h': + usage(EXIT_SUCCESS); + break; + case 'i': + input_file = optarg; + break; + case 'l': + print_all_key_names = true; + show_all = false; + name_filter = NULL; + break; + case 'n': + name_filter = optarg; + show_all = false; + print_all_key_names = false; + break; + case 's': + tffs_size = strtoul(optarg, NULL, 0); + break; + default: + usage(EXIT_FAILURE); + break; + } + } + + if (!input_file) { + fprintf(stderr, "ERROR: No input file (-i ) given!\n"); + exit(EXIT_FAILURE); + } + + if (!file_exist(input_file)) { + fprintf(stderr, "ERROR: %s does not exist\n", input_file); + exit(EXIT_FAILURE); + } + + if (!show_all && !name_filter && !print_all_key_names) { + fprintf(stderr, + "ERROR: either -l, -a or -n is required!\n"); + exit(EXIT_FAILURE); + } +} + +int main(int argc, char *argv[]) +{ + int ret = EXIT_FAILURE; + uint8_t *buffer; + FILE *fp; + struct tffs_entry name_table; + struct tffs_key_name_table key_names; + + progname = basename(argv[0]); + + parse_options(argc, argv); + + fp = fopen(input_file, "r"); + + if (!fp) { + fprintf(stderr, "ERROR: Failed to open tffs input file %s\n", + input_file); + goto out; + } + + if (tffs_size == 0) { + fseek(fp, 0L, SEEK_END); + tffs_size = ftell(fp); + fseek(fp, 0L, SEEK_SET); + } + + buffer = malloc(tffs_size); + + if (fread(buffer, 1, tffs_size, fp) != tffs_size) { + fprintf(stderr, "ERROR: Failed read tffs file %s\n", + input_file); + goto out_free; + } + + if (!find_entry(buffer, TFFS_ID_TABLE_NAME, &name_table)) { + fprintf(stderr,"ERROR: No name table found in tffs file %s\n", + input_file); + fprintf(stderr," Is byte-swapping (-b) required?\n"); + goto out_free; + } + + parse_key_names(&name_table, &key_names); + if (key_names.size < 1) { + fprintf(stderr, "ERROR: No name table found in tffs file %s\n", + input_file); + goto out_free_names; + } + + if (print_all_key_names) { + show_all_key_names(&key_names); + ret = EXIT_SUCCESS; + } else if (show_all) { + ret = show_all_key_value_pairs(buffer, &key_names); + } else { + ret = show_matching_key_value(buffer, &key_names); + } + +out_free_names: + free(key_names.entries); +out_free: + fclose(fp); + free(buffer); +out: + return ret; +} diff --git a/package/utils/gawk/Makefile b/package/utils/gawk/Makefile new file mode 100644 index 0000000000..42deed8e67 --- /dev/null +++ b/package/utils/gawk/Makefile @@ -0,0 +1,46 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=gawk +PKG_VERSION:=5.2.1 +PKG_RELEASE:=2 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=@GNU/gawk +PKG_HASH:=673553b91f9e18cc5792ed51075df8d510c9040f550a6f74e09c9add243a7e4f + +PKG_MAINTAINER:=Daniel Golle +PKG_LICENSE:=GPL-3.0-or-later +PKG_LICENSE_FILES:=COPYING + +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/gawk + SECTION:=utils + CATEGORY:=Utilities + URL:=https://www.gnu.org/software/gawk/ + TITLE:=GNU awk + DEPENDS:=+libncursesw +libreadline +endef + +CONFIGURE_ARGS+= --disable-mpfr + +define Package/gawk/install + $(INSTALL_DIR) $(1)/usr/bin + $(CP) $(PKG_INSTALL_DIR)/usr/bin/gawk $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/usr/lib/gawk + $(CP) $(PKG_INSTALL_DIR)/usr/lib/gawk/* $(1)/usr/lib/gawk/ + $(INSTALL_DIR) $(1)/usr/lib/awk + $(CP) $(PKG_INSTALL_DIR)/usr/lib/awk/* $(1)/usr/lib/awk/ + $(INSTALL_DIR) $(1)/usr/share/awk + $(CP) $(PKG_INSTALL_DIR)/usr/share/awk/* $(1)/usr/share/awk/ +endef + +$(eval $(call BuildPackage,gawk)) + diff --git a/package/utils/grep/Makefile b/package/utils/grep/Makefile new file mode 100644 index 0000000000..1221d7bf8f --- /dev/null +++ b/package/utils/grep/Makefile @@ -0,0 +1,55 @@ +# +# Copyright (C) 2010-2016 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=grep +PKG_VERSION:=3.8 +PKG_RELEASE:=2 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=@GNU/grep +PKG_HASH:=498d7cc1b4fb081904d87343febb73475cf771e424fb7e6141aff66013abc382 + +PKG_MAINTAINER:=Julen Landa Alustiza +PKG_LICENSE:=GPL-3.0-or-later +PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:gnu:grep + +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 + +MAKE_FLAGS += SHELL="/bin/sh" + +include $(INCLUDE_DIR)/package.mk + +define Package/grep + SECTION:=utils + CATEGORY:=Utilities + TITLE:=grep search utility - full version + DEPENDS:=+libpcre2 + URL:=https://www.gnu.org/software/grep/ + ALTERNATIVES:=\ + 300:/bin/egrep:/usr/libexec/egrep-gnu \ + 300:/bin/fgrep:/usr/libexec/fgrep-gnu \ + 300:/bin/grep:/usr/libexec/grep-gnu +endef + +define Package/grep/description +The grep command searches one or more input files for lines +containing a match to a specified pattern. By default, grep +prints the matching lines. +endef + +define Package/grep/install + $(INSTALL_DIR) $(1)/usr/libexec + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/egrep $(1)/usr/libexec/egrep-gnu + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/fgrep $(1)/usr/libexec/fgrep-gnu + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/grep $(1)/usr/libexec/grep-gnu +endef + +$(eval $(call BuildPackage,grep)) diff --git a/package/utils/grep/patches/ppc-musl.patch b/package/utils/grep/patches/ppc-musl.patch new file mode 100644 index 0000000000..aeb026689d --- /dev/null +++ b/package/utils/grep/patches/ppc-musl.patch @@ -0,0 +1,15 @@ +https://github.com/void-linux/void-packages/commit/0d9556b8593d6e67027fb1c83d176b7f899547e5 +--- a/lib/sigsegv.c ++++ b/lib/sigsegv.c +@@ -246,8 +246,10 @@ int libsigsegv_version = LIBSIGSEGV_VERS + /* Because of the union, both definitions should be equivalent. */ + # if 0 + # define SIGSEGV_FAULT_STACKPOINTER ((ucontext_t *) ucp)->uc_mcontext.regs->gpr[1] +-# else ++# elif defined(__GLIBC__) + # define SIGSEGV_FAULT_STACKPOINTER ((ucontext_t *) ucp)->uc_mcontext.uc_regs->gregs[1] ++# else ++# define SIGSEGV_FAULT_STACKPOINTER ((ucontext_t *) ucp)->uc_mcontext.gregs[1] + # endif + # endif + # endif diff --git a/package/utils/jboot-tools/Makefile b/package/utils/jboot-tools/Makefile new file mode 100644 index 0000000000..ce9758ba3a --- /dev/null +++ b/package/utils/jboot-tools/Makefile @@ -0,0 +1,28 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=jboot-tools +PKG_RELEASE:=1 +CMAKE_INSTALL:=1 +PKG_FLAGS:=nonshared + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/jboot-tools + SECTION:=firmware + CATEGORY:=Firmware + DEPENDS:=@TARGET_ramips + TITLE:=Utilites for accessing JBOOT based D-Link devices Calibration data +endef + +define Package/jboot-tools/description + This package contains: + jboot_config_read.c: partially read the config partition of JBOOT based D-Link devices. +endef + +define Package/jboot-tools/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/jboot_config_read $(1)/usr/bin/ +endef + +$(eval $(call BuildPackage,jboot-tools)) diff --git a/package/utils/jboot-tools/README.md b/package/utils/jboot-tools/README.md new file mode 100644 index 0000000000..0d1aeac9d1 --- /dev/null +++ b/package/utils/jboot-tools/README.md @@ -0,0 +1,46 @@ +Userspace utilties for jboot based devices config partition read + +## Building + +``` +mkdir build +cd build +cmake /path/to/jboot-tools +make +``` + +## Usage + +All command line parameters are documented: +``` +jboot_config_read -h +``` + +Show all stored MACs: +``` +jboot_config_read -m -i PATH_TO_CONFIG_PARTITIO +``` + +Extract wifi eeprom data: +``` +jboot_config_read -i PATH_TO_CONFIG_PARTITION -e OUTPUT_PATH +``` + + +## LICENSE + +See `LICENSE`: + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/package/utils/jboot-tools/src/CMakeLists.txt b/package/utils/jboot-tools/src/CMakeLists.txt new file mode 100644 index 0000000000..98fbab38dc --- /dev/null +++ b/package/utils/jboot-tools/src/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 2.6) + +PROJECT(jboot-tools C) +ADD_DEFINITIONS(-Wall -Werror --std=gnu99 -Wmissing-declarations) + +SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") + +ADD_EXECUTABLE(jboot_config_read jboot_config_read.c) +TARGET_LINK_LIBRARIES(jboot_config_read) + +INSTALL(TARGETS jboot_config_read RUNTIME DESTINATION bin) diff --git a/package/utils/jboot-tools/src/jboot_config_read.c b/package/utils/jboot-tools/src/jboot_config_read.c new file mode 100644 index 0000000000..c65b0917a1 --- /dev/null +++ b/package/utils/jboot-tools/src/jboot_config_read.c @@ -0,0 +1,427 @@ +/* + * jboot_config_read + * + * Copyright (C) 2018 Paweł Dembicki + * + * This tool is based on mkdlinkfw. + * Copyright (C) 2018 Paweł Dembicki + * Copyright (C) 2009 Gabor Juhos + * Copyright (C) 2008,2009 Wang Jian + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + */ + +#include +#include +#include +#include +#include /* for unlink() */ +#include +#include /* for getopt() */ +#include +#include +#include +#include +#include + + + +#define ERR(fmt, ...) do { \ + fflush(0); \ + fprintf(stderr, "[%s] *** error: " fmt "\n", \ + progname, ## __VA_ARGS__); \ +} while (0) + +#define ERRS(fmt, ...) do { \ + int save = errno; \ + fflush(0); \ + fprintf(stderr, "[%s] *** error: " fmt ": %s\n", \ + progname, ## __VA_ARGS__, strerror(save)); \ +} while (0) + +#define VERBOSE(fmt, ...) do { \ + if (verbose) { \ + fprintf(stdout, "[%s] " fmt "\n", progname, ## __VA_ARGS__); \ + } \ +} while (0) + +#define STAG_SIZE 16 +#define STAG_MAGIC 0x2B24 +#define STAG_ID 0x02 + +#define CSXF_SIZE 16 +#define CSXF_MAGIC 0x5343 + +#define MAX_DATA_HEADER 128 +#define DATA_HEADER_UNKNOWN 0x8000 +#define DATA_HEADER_EEPROM 0xF5 +#define DATA_HEADER_CONFIG 0x42 +#define DATA_HEADER_SIZE 6 + +#define DATA_HEADER_ID_MAC 0x30 +#define DATA_HEADER_ID_CAL 0x0 + +/* ARM update header 2.0 + * used only in factory images to erase and flash selected area + */ +struct stag_header { /* used only of sch2 wrapped kernel data */ + uint8_t cmark; /* in factory 0xFF ,in sysuograde must be the same as id */ + uint8_t id; /* 0x04 */ + uint16_t magic; /* magic 0x2B24 */ + uint32_t time_stamp; /* timestamp calculated in jboot way */ + uint32_t image_length; /* lentgh of kernel + sch2 header */ + uint16_t image_checksum; /* negated jboot_checksum of sch2 + kernel */ + uint16_t tag_checksum; /* negated jboot_checksum of stag header data */ +}; + +struct csxf_header { + uint16_t magic; /* 0x5343, 'CS' in little endian */ + uint16_t checksum; /* checksum, include header & body */ + uint32_t body_length; /* length of body */ + uint8_t body_encoding; /* encoding method of body */ + uint8_t reserved[3]; + uint32_t raw_length; /* length of body before encoded */ +}; + +struct data_header { + uint8_t id; + uint8_t type; /* 0x42xx for config 0xF5xx for eeprom */ + uint16_t unknown; + uint16_t length; /* length of body */ + uint8_t data[]; /* encoding method of body */ +}; + +/* globals */ + +char *ofname; +char *ifname; +char *progname; + +uint8_t *buffer; +uint32_t config_size; + +uint32_t start_offset; +uint8_t mac_duplicate; +uint8_t mac_print; +uint8_t print_data; +uint8_t verbose; + +static void usage(int status) +{ + fprintf(stderr, "Usage: %s [OPTIONS...]\n", progname); + fprintf(stderr, + "\n" + "Options:\n" + " -i config partition file \n" + " -m print mac address\n" + " -e save eeprom calibration data image to the file \n" + " -o set start offset to \n" + " -p print config data\n" + " -v verbose\n" + " -h show this screen\n"); + + exit(status); +} + +static void print_data_header(struct data_header *printed_header) +{ + printf("id: 0x%02X " + "type: 0x%02X " + "unknown: 0x%04X " + "length: 0x%04X\n" + "data: ", + printed_header->id, + printed_header->type, + printed_header->unknown, printed_header->length); + + for (uint16_t i = 0; i < printed_header->length; i++) + printf("%02X ", printed_header->data[i]); + + printf("\n"); + +} + +static uint16_t jboot_checksum(uint16_t start_val, uint16_t *data, int size) +{ + uint32_t counter = start_val; + uint16_t *ptr = data; + + while (size > 1) { + counter += *ptr; + ++ptr; + while (counter >> 16) + counter = (uint16_t) counter + (counter >> 16); + size -= 2; + } + if (size > 0) { + counter += *(uint8_t *) ptr; + counter -= 0xFF; + } + while (counter >> 16) + counter = (uint16_t) counter + (counter >> 16); + return counter; +} + +static int find_header(uint8_t *buf, uint32_t buf_size, + struct data_header **data_table) +{ + uint8_t *tmp_buf = buf + start_offset; + uint8_t tmp_hdr[4] = { STAG_ID, STAG_ID, (STAG_MAGIC & 0xFF), (STAG_MAGIC >> 8) }; + struct csxf_header *tmp_csxf_header; + uint16_t tmp_checksum = 0; + uint16_t data_header_counter = 0; + int ret = EXIT_FAILURE; + + VERBOSE("Looking for STAG header!"); + + while ((uint32_t) tmp_buf - (uint32_t) buf <= buf_size) { + if (!memcmp(tmp_buf, tmp_hdr, 4)) { + if (((struct stag_header *)tmp_buf)->tag_checksum == + (uint16_t) ~jboot_checksum(0, (uint16_t *) tmp_buf, + STAG_SIZE - 2)) { + VERBOSE("Found proper STAG header at: 0x%X.", + tmp_buf - buf); + break; + } + } + tmp_buf++; + } + + tmp_csxf_header = (struct csxf_header *)(tmp_buf + STAG_SIZE); + if (tmp_csxf_header->magic != CSXF_MAGIC) { + ERR("CSXF magic incorrect! 0x%X != 0x%X", + tmp_csxf_header->magic, CSXF_MAGIC); + goto out; + } + VERBOSE("CSXF magic ok."); + tmp_checksum = tmp_csxf_header->checksum; + tmp_csxf_header->checksum = 0; + + tmp_csxf_header->checksum = + (uint16_t) ~jboot_checksum(0, (uint16_t *) (tmp_buf + STAG_SIZE), + tmp_csxf_header->raw_length + + CSXF_SIZE); + + if (tmp_checksum != tmp_csxf_header->checksum) { + ERR("CSXF checksum incorrect! Stored: 0x%X Calculated: 0x%X", + tmp_checksum, tmp_csxf_header->checksum); + goto out; + } + VERBOSE("CSXF image checksum ok."); + + tmp_buf = tmp_buf + STAG_SIZE + CSXF_SIZE; + + while ((uint32_t) tmp_buf - (uint32_t) buf <= buf_size) { + + struct data_header *tmp_data_header = + (struct data_header *)tmp_buf; + + if (tmp_data_header->unknown != DATA_HEADER_UNKNOWN) { + tmp_buf++; + continue; + } + if (tmp_data_header->type != DATA_HEADER_EEPROM + && tmp_data_header->type != DATA_HEADER_CONFIG) { + tmp_buf++; + continue; + } + + data_table[data_header_counter] = tmp_data_header; + tmp_buf += + DATA_HEADER_SIZE + data_table[data_header_counter]->length; + data_header_counter++; + + } + + ret = data_header_counter; + + out: + return ret; +} + +static int read_file(char *file_name) +{ + int ret = EXIT_FAILURE; + uint32_t file_size = 0; + FILE *fp; + + fp = fopen(file_name, "r"); + + if (!fp) { + ERR("Failed to open config input file %s", file_name); + goto out; + } + + fseek(fp, 0L, SEEK_END); + file_size = ftell(fp); + fseek(fp, 0L, SEEK_SET); + + buffer = malloc(file_size); + VERBOSE("Allocated %d bytes.", file_size); + + if (fread(buffer, 1, file_size, fp) != file_size) { + ERR("Failed to read config input file %s", file_name); + goto out_free_buf; + } + + VERBOSE("Read %d bytes of config input file %s", file_size, file_name); + config_size = file_size; + ret = EXIT_SUCCESS; + goto out; + + out_free_buf: + free(buffer); + fclose(fp); + out: + return ret; +} + +static int write_file(const char *ofname, const uint8_t *data, int len) +{ + FILE *f; + int ret = EXIT_FAILURE; + + f = fopen(ofname, "w"); + if (f == NULL) { + ERRS("could not open \"%s\" for writing", ofname); + goto out; + } + + errno = 0; + fwrite(data, len, 1, f); + if (errno) { + ERRS("unable to write output file"); + goto out_flush; + } + + VERBOSE("firmware file \"%s\" completed", ofname); + + ret = EXIT_SUCCESS; + + out_flush: + fflush(f); + fclose(f); + if (ret != EXIT_SUCCESS) + unlink(ofname); + out: + return ret; +} + +static void print_mac(struct data_header **data_table, int cnt) +{ + + for (int i = 0; i < cnt; i++) { + if (data_table[i]->type == DATA_HEADER_CONFIG + && data_table[i]->id == DATA_HEADER_ID_MAC) { + int j; + for (j = 0; j < 5; j++) + printf("%02x:", data_table[i]->data[j]); + printf("%02x\n", data_table[i]->data[j]); + } + + } + +} + +static int write_eeprom(struct data_header **data_table, int cnt) +{ + int ret = EXIT_FAILURE; + + for (int i = 0; i < cnt; i++) { + if (data_table[i]->type == DATA_HEADER_EEPROM + && data_table[i]->id == DATA_HEADER_ID_CAL) { + ret = + write_file(ofname, data_table[i]->data, + data_table[i]->length); + break; + } + + } + + return ret; +} + +int main(int argc, char *argv[]) +{ + int ret = EXIT_FAILURE; + int configs_counter = 0; + struct data_header *configs_table[MAX_DATA_HEADER]; + buffer = NULL; + config_size = 0; + + progname = basename(argv[0]); + start_offset = 0; + mac_print = 0; + print_data = 0; + verbose = 0; + ofname = NULL; + ifname = NULL; + + while (1) { + int c; + + c = getopt(argc, argv, "de:hi:mo:pv"); + if (c == -1) + break; + + switch (c) { + case 'm': + mac_print = 1; + break; + case 'i': + ifname = optarg; + break; + case 'e': + ofname = optarg; + break; + case 'o': + sscanf(optarg, "0x%x", &start_offset); + break; + case 'p': + print_data = 1; + break; + case 'v': + verbose = 1; + VERBOSE("Enable verbose!"); + break; + default: + usage(EXIT_FAILURE); + break; + } + } + + if (!ifname) + usage(EXIT_FAILURE); + + ret = read_file(ifname); + + if (ret || config_size <= 0) + goto out; + + configs_counter = find_header(buffer, config_size, configs_table); + + if (configs_counter <= 0) + goto out_free_buf; + + if (print_data || verbose) { + for (int i = 0; i < configs_counter; i++) + print_data_header(configs_table[i]); + } + + if (mac_print) + print_mac(configs_table, configs_counter); + + ret = EXIT_SUCCESS; + + if (ofname) + ret = write_eeprom(configs_table, configs_counter); + + out_free_buf: + free(buffer); + out: + return ret; + +} diff --git a/package/utils/kmod/Makefile b/package/utils/kmod/Makefile index 916839656f..4b10747189 100644 --- a/package/utils/kmod/Makefile +++ b/package/utils/kmod/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=kmod -PKG_VERSION:=27 -PKG_RELEASE:=2 +PKG_VERSION:=31 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/linux/utils/kernel/kmod -PKG_HASH:=c1d3fbf16ca24b95f334c1de1b46f17bbe5a10b0e81e72668bdc922ebffbbc0c +PKG_HASH:=f5a6949043cc72c001b728d8c218609c5a15f3c33d75614b78c79418fcf00d80 PKG_MAINTAINER:=Jeff Waugh PKG_LICENSE:=LGPL-2.1-or-later diff --git a/package/utils/lua/Makefile b/package/utils/lua/Makefile index 279759e972..46e7bb0dcd 100644 --- a/package/utils/lua/Makefile +++ b/package/utils/lua/Makefile @@ -12,13 +12,16 @@ PKG_VERSION:=5.1.5 PKG_RELEASE:=10 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=http://www.lua.org/ftp/ \ - http://www.tecgraf.puc-rio.br/lua/ftp/ +PKG_SOURCE_URL:=https://www.lua.org/ftp/ \ + https://www.tecgraf.puc-rio.br/lua/ftp/ PKG_HASH:=2640fc56a795f29d28ef15e13c34a47e223960b0240e8cb0a82d9b0738695333 PKG_BUILD_PARALLEL:=1 PKG_LICENSE:=MIT PKG_LICENSE_FILES:=COPYRIGHT +PKG_CPE_ID:=cpe:/a:lua:lua + +PKG_BUILD_FLAGS:=no-lto HOST_PATCH_DIR := ./patches-host @@ -30,7 +33,7 @@ define Package/lua/Default SECTION:=lang CATEGORY:=Languages TITLE:=Lua programming language - URL:=http://www.lua.org/ + URL:=https://www.lua.org/ MAINTAINER:=Jo-Philipp Wich endef @@ -99,7 +102,7 @@ define Build/Compile RANLIB="$(TARGET_CROSS)ranlib" \ INSTALL_ROOT=/usr \ CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \ - MYLDFLAGS="$(TARGET_LDFLAGS) $(if $(CONFIG_USE_GLIBC),-lm -ldl)" \ + MYLDFLAGS="$(TARGET_LDFLAGS)" \ PKG_VERSION=$(PKG_VERSION) \ linux rm -rf $(PKG_INSTALL_DIR) diff --git a/package/utils/lua/patches-host/010-lua-5.1.3-lnum-full-260308.patch b/package/utils/lua/patches-host/010-lua-5.1.3-lnum-full-260308.patch index 4530edd181..fd398c28d1 100644 --- a/package/utils/lua/patches-host/010-lua-5.1.3-lnum-full-260308.patch +++ b/package/utils/lua/patches-host/010-lua-5.1.3-lnum-full-260308.patch @@ -1600,18 +1600,18 @@ + * (and doing them). + */ +int try_addint( lua_Integer *r, lua_Integer ib, lua_Integer ic ) { -+ lua_Integer v= ib+ic; /* may overflow */ -+ if (ib>0 && ic>0) { if (v < 0) return 0; /*overflow, use floats*/ } -+ else if (ib<0 && ic<0) { if (v >= 0) return 0; } -+ *r= v; ++ /* Signed int overflow is undefined behavior, so catch it without causing it. */ ++ if (ic>0) { if (ib > LUA_INTEGER_MAX - ic) return 0; /*overflow, use floats*/ } ++ else { if (ib < LUA_INTEGER_MIN - ic) return 0; } ++ *r = ib + ic; + return 1; +} + +int try_subint( lua_Integer *r, lua_Integer ib, lua_Integer ic ) { -+ lua_Integer v= ib-ic; /* may overflow */ -+ if (ib>=0 && ic<0) { if (v < 0) return 0; /*overflow, use floats*/ } -+ else if (ib<0 && ic>0) { if (v >= 0) return 0; } -+ *r= v; ++ /* Signed int overflow is undefined behavior, so catch it without causing it. */ ++ if (ic>0) { if (ib < LUA_INTEGER_MIN + ic) return 0; /*overflow, use floats*/ } ++ else { if (ib > LUA_INTEGER_MAX + ic) return 0; } ++ *r = ib - ic; + return 1; +} + diff --git a/package/utils/lua/patches/010-lua-5.1.3-lnum-full-260308.patch b/package/utils/lua/patches/010-lua-5.1.3-lnum-full-260308.patch index ac0722c707..58cc894e1c 100644 --- a/package/utils/lua/patches/010-lua-5.1.3-lnum-full-260308.patch +++ b/package/utils/lua/patches/010-lua-5.1.3-lnum-full-260308.patch @@ -1589,18 +1589,18 @@ + * (and doing them). + */ +int try_addint( lua_Integer *r, lua_Integer ib, lua_Integer ic ) { -+ lua_Integer v= ib+ic; /* may overflow */ -+ if (ib>0 && ic>0) { if (v < 0) return 0; /*overflow, use floats*/ } -+ else if (ib<0 && ic<0) { if (v >= 0) return 0; } -+ *r= v; ++ /* Signed int overflow is undefined behavior, so catch it without causing it. */ ++ if (ic>0) { if (ib > LUA_INTEGER_MAX - ic) return 0; /*overflow, use floats*/ } ++ else { if (ib < LUA_INTEGER_MIN - ic) return 0; } ++ *r = ib + ic; + return 1; +} + +int try_subint( lua_Integer *r, lua_Integer ib, lua_Integer ic ) { -+ lua_Integer v= ib-ic; /* may overflow */ -+ if (ib>=0 && ic<0) { if (v < 0) return 0; /*overflow, use floats*/ } -+ else if (ib<0 && ic>0) { if (v >= 0) return 0; } -+ *r= v; ++ /* Signed int overflow is undefined behavior, so catch it without causing it. */ ++ if (ic>0) { if (ib < LUA_INTEGER_MIN + ic) return 0; /*overflow, use floats*/ } ++ else { if (ib > LUA_INTEGER_MAX + ic) return 0; } ++ *r = ib - ic; + return 1; +} + diff --git a/package/utils/lua5.3/Makefile b/package/utils/lua5.3/Makefile index 19f3b4dfda..d43ac59ed4 100644 --- a/package/utils/lua5.3/Makefile +++ b/package/utils/lua5.3/Makefile @@ -12,13 +12,14 @@ PKG_VERSION:=5.3.5 PKG_RELEASE:=5 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=http://www.lua.org/ftp/ \ - http://www.tecgraf.puc-rio.br/lua/ftp/ +PKG_SOURCE_URL:=https://www.lua.org/ftp/ \ + https://www.tecgraf.puc-rio.br/lua/ftp/ PKG_HASH:=0c2eed3f960446e1a3e4b9a1ca2f3ff893b6ce41942cf54d5dd59ab4b3b058ac PKG_BUILD_PARALLEL:=1 PKG_LICENSE:=MIT PKG_LICENSE_FILES:=COPYRIGHT +PKG_CPE_ID:=cpe:/a:lua:lua HOST_PATCH_DIR := ./patches-host @@ -30,7 +31,7 @@ define Package/lua5.3/Default SECTION:=lang CATEGORY:=Languages TITLE:=Lua programming language - URL:=http://www.lua.org/ + URL:=https://www.lua.org/ MAINTAINER:=Jo-Philipp Wich endef diff --git a/package/utils/mdadm/Makefile b/package/utils/mdadm/Makefile index f6696bf21c..8070003394 100644 --- a/package/utils/mdadm/Makefile +++ b/package/utils/mdadm/Makefile @@ -8,17 +8,18 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mdadm -PKG_VERSION:=4.1 +PKG_VERSION:=4.2 PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/linux/utils/raid/mdadm -PKG_HASH:=ab7688842908d3583a704d491956f31324c3a5fc9f6a04653cb75d19f1934f4a +PKG_HASH:=461c215670864bb74a4d1a3620684aa2b2f8296dffa06743f26dda5557acf01d PKG_MAINTAINER:=Felix Fietkau PKG_CPE_ID:=cpe:/a:mdadm_project:mdadm PKG_BUILD_PARALLEL:=1 +PKG_BUILD_FLAGS:=gc-sections include $(INCLUDE_DIR)/package.mk @@ -43,16 +44,19 @@ define Package/mdadm/conffiles endef TARGET_CFLAGS += \ - -ffunction-sections -fdata-sections \ -DHAVE_STDINT_H -DNO_COROSYNC -DNO_DLM -DUSE_PTHREADS \ -DCONFFILE='\"/var/etc/mdadm.conf\"' \ -DMAP_DIR='\"/var/run/mdadm\"' \ -DMDMON_DIR='\"/var/run/mdadm\"' \ - -DFAILED_SLOTS_DIR='\"/var/run/mdadm/failed-slots\"' + -DFAILED_SLOTS_DIR='\"/var/run/mdadm/failed-slots\"' \ + -DNO_LIBUDEV \ + -D_LARGEFILE64_SOURCE -TARGET_LDFLAGS += -Wl,--gc-sections +TARGET_CXFLAGS = -DNO_LIBUDEV -MAKE_FLAGS += CHECK_RUN_DIR=0 +MAKE_FLAGS += \ + CHECK_RUN_DIR=0 \ + CXFLAGS="$(TARGET_CXFLAGS)" define Build/Compile $(call Build/Compile/Default,mdadm) diff --git a/package/utils/mdadm/patches/100-cross_compile.patch b/package/utils/mdadm/patches/100-cross_compile.patch index 0a5fa017c6..790d7755b0 100644 --- a/package/utils/mdadm/patches/100-cross_compile.patch +++ b/package/utils/mdadm/patches/100-cross_compile.patch @@ -1,6 +1,6 @@ --- a/Makefile +++ b/Makefile -@@ -97,7 +97,7 @@ DLM:=$(shell [ -f /usr/include/libdlm.h +@@ -99,7 +99,7 @@ DLM:=$(shell [ -f /usr/include/libdlm.h DIRFLAGS = -DMAP_DIR=\"$(MAP_DIR)\" -DMAP_FILE=\"$(MAP_FILE)\" DIRFLAGS += -DMDMON_DIR=\"$(MDMON_DIR)\" DIRFLAGS += -DFAILED_SLOTS_DIR=\"$(FAILED_SLOTS_DIR)\" diff --git a/package/utils/mdadm/patches/101-mdadm.h-Undefine-dprintf-before-redefining.patch b/package/utils/mdadm/patches/101-mdadm.h-Undefine-dprintf-before-redefining.patch deleted file mode 100644 index 356d0deec8..0000000000 --- a/package/utils/mdadm/patches/101-mdadm.h-Undefine-dprintf-before-redefining.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 6d369e8f226594632ce4260129509daf7030de0a Mon Sep 17 00:00:00 2001 -From: Khem Raj -Date: Mon, 9 May 2016 22:03:57 +0000 -Subject: [PATCH] mdadm.h: Undefine dprintf before redefining - -dprintf is also defined in libc see -usr/include/bits/stdio2.h, this comes into -play especially when fortify sources is enabled -and compilers like clang reports the override - -In file included from policy.c:25: -./mdadm.h:1562:9: error: 'dprintf' macro redefined [-Werror,-Wmacro-redefined] - ^ -/mnt/oe/openembedded-core/build/tmp-glibc/sysroots/qemux86/usr/include/bits/stdio2.h:145:12: note: previous definition is here - -Signed-off-by: Khem Raj ---- -Upstream-Status: Pending - - mdadm.h | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/mdadm.h -+++ b/mdadm.h -@@ -1649,11 +1649,13 @@ static inline char *to_subarray(struct m - } - - #ifdef DEBUG -+#undef dprintf - #define dprintf(fmt, arg...) \ - fprintf(stderr, "%s: %s: "fmt, Name, __func__, ##arg) - #define dprintf_cont(fmt, arg...) \ - fprintf(stderr, fmt, ##arg) - #else -+#undef dprintf - #define dprintf(fmt, arg...) \ - ({ if (0) fprintf(stderr, "%s: %s: " fmt, Name, __func__, ##arg); 0; }) - #define dprintf_cont(fmt, arg...) \ diff --git a/package/utils/mdadm/patches/102-Add-missing-include-file-sys-sysmacros.h.patch b/package/utils/mdadm/patches/102-Add-missing-include-file-sys-sysmacros.h.patch deleted file mode 100644 index 891b5c62f0..0000000000 --- a/package/utils/mdadm/patches/102-Add-missing-include-file-sys-sysmacros.h.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 452dc4d13a012cdcb05088c0dbc699959c4d6c73 Mon Sep 17 00:00:00 2001 -From: Baruch Siach -Date: Tue, 6 Aug 2019 16:05:23 +0300 -Subject: mdadm.h: include sysmacros.h unconditionally - -musl libc now also requires sys/sysmacros.h for the major/minor macros. -All supported libc implementations carry sys/sysmacros.h, including -diet-libc, klibc, and uclibc-ng. - -Cc: Hauke Mehrtens -Signed-off-by: Baruch Siach -Signed-off-by: Jes Sorensen ---- - mdadm.h | 2 -- - 1 file changed, 2 deletions(-) - ---- a/mdadm.h -+++ b/mdadm.h -@@ -45,10 +45,8 @@ extern __off64_t lseek64 __P ((int __fd, - #include - #include - #include --#ifdef __GLIBC__ - /* Newer glibc requires sys/sysmacros.h directly for makedev() */ - #include --#endif - #ifdef __dietlibc__ - #include - /* dietlibc has deprecated random and srandom!! */ diff --git a/package/utils/mdadm/patches/200-reduce_size.patch b/package/utils/mdadm/patches/200-reduce_size.patch index 6905c2ccfe..163e125c22 100644 --- a/package/utils/mdadm/patches/200-reduce_size.patch +++ b/package/utils/mdadm/patches/200-reduce_size.patch @@ -1,19 +1,19 @@ --- a/Incremental.c +++ b/Incremental.c -@@ -1619,6 +1619,10 @@ static int Incremental_container(struct - if (ra_all == ra_blocked) - return 0; +@@ -983,6 +983,10 @@ static int array_try_spare(char *devname + goto next; + } -+#ifndef MDADM_FULL -+ return 0; -+#endif ++ #ifndef MDADM_FULL ++ return 0; ++ #endif + - /* Now move all suitable spares from spare container */ - domains = domain_from_array(list, st->ss->name); - memcpy(suuid, uuid_zero, sizeof(int[4])); + dl = domain_from_array(sra, st2->ss->name); + if (domain_test(dl, pol, st2->ss->name) != 1) { + /* domain test fails */ --- a/util.c +++ b/util.c -@@ -1220,7 +1220,9 @@ void wait_for(char *dev, int fd) +@@ -1147,7 +1147,9 @@ void wait_for(char *dev, int fd) struct superswitch *superlist[] = { &super0, &super1, diff --git a/package/utils/mtd-utils/Makefile b/package/utils/mtd-utils/Makefile index 74380022a5..bd53e071d5 100644 --- a/package/utils/mtd-utils/Makefile +++ b/package/utils/mtd-utils/Makefile @@ -8,22 +8,24 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mtd-utils -PKG_VERSION:=2.1.4 +PKG_VERSION:=2.1.5 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=https://infraroot.at/pub/mtd/ -PKG_HASH:=2c6711d15d282c47cb3867b6857340597e26d332c238465134c602e5eef71b99 +PKG_HASH:=386e27fd121699b6b729bc2e8e04dda987b31cca6b16e12fb6cc6dcf26449f46 PKG_INSTALL:=1 PKG_FIXUP:=autoreconf PKG_FLAGS:=nonshared +PKG_BUILD_FLAGS:=gc-sections PKG_BUILD_DEPENDS:=util-linux PKG_LICENSE:=GPLv2 PKG_LICENSE_FILES:= +PKG_CPE_ID:=cpe:/a:mtd-utils_project:mtd-utils PKG_MAINTAINER:=John Crispin @@ -63,9 +65,6 @@ CONFIGURE_ARGS += \ --without-zstd \ --without-lzo -TARGET_CFLAGS += -ffunction-sections -fdata-sections -TARGET_LDFLAGS += -Wl,--gc-sections - define Package/ubi-utils/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) \ diff --git a/package/utils/mtd-utils/patches/130-lzma_jffs2.patch b/package/utils/mtd-utils/patches/130-lzma_jffs2.patch index 55930ddc86..db683063d5 100644 --- a/package/utils/mtd-utils/patches/130-lzma_jffs2.patch +++ b/package/utils/mtd-utils/patches/130-lzma_jffs2.patch @@ -5020,7 +5020,7 @@ +} --- a/jffsX-utils/mkfs.jffs2.c +++ b/jffsX-utils/mkfs.jffs2.c -@@ -1667,11 +1667,11 @@ int main(int argc, char **argv) +@@ -1668,11 +1668,11 @@ int main(int argc, char **argv) } erase_block_size *= units; diff --git a/package/utils/nvram/files/nvram-bcm53xx.init b/package/utils/nvram/files/nvram-bcm53xx.init index 0502cd28b6..4319c761bb 100755 --- a/package/utils/nvram/files/nvram-bcm53xx.init +++ b/package/utils/nvram/files/nvram-bcm53xx.init @@ -9,6 +9,7 @@ clear_partialboots() { # clear partialboots case $(board_name) in + linksys,ea9200|\ linksys,panamera) COMMIT=1 nvram set partialboots=0 diff --git a/package/utils/otrx/Makefile b/package/utils/otrx/Makefile deleted file mode 100644 index 0559db3d87..0000000000 --- a/package/utils/otrx/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -# -# Copyright (C) 2015 Rafał Miłecki -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=otrx -PKG_RELEASE:=1 - -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL=$(PROJECT_GIT)/firmware-utils.git -PKG_SOURCE_DATE:=2021-12-02 -PKG_SOURCE_VERSION:=56e8e19151743c923f48604c457850cf8eb52076 -PKG_MIRROR_HASH:=2a40ac73e8eab0a7a4474cb331b8e2fc972635314b0b5e02a9f2b9a32c5d5f3b - -include $(INCLUDE_DIR)/package.mk - -define Package/otrx - SECTION:=utils - CATEGORY:=Base system - TITLE:=Utility for opening (analyzing) TRX firmware images - MAINTAINER:=Rafał Miłecki - DEPENDS:=@(TARGET_bcm47xx||TARGET_bcm53xx) -endef - -define Package/otrx/description - This package contains an utility that allows validating TRX images. -endef - -TARGET_CFLAGS += -Wall - -define Build/Compile - $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) \ - -o $(PKG_BUILD_DIR)/otrx \ - $(PKG_BUILD_DIR)/src/otrx.c -endef - -define Package/otrx/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/otrx $(1)/usr/bin/ -endef - -$(eval $(call BuildPackage,otrx)) diff --git a/package/utils/pciutils/Makefile b/package/utils/pciutils/Makefile index 870ffae3ec..0eaea53423 100644 --- a/package/utils/pciutils/Makefile +++ b/package/utils/pciutils/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=pciutils -PKG_VERSION:=3.8.0 -PKG_RELEASE:=2 +PKG_VERSION:=3.10.0 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/software/utils/pciutils -PKG_HASH:=91edbd0429a84705c9ad156d4ff38ccc724d41ea54c4c5b88e38e996f8a34f05 +PKG_HASH:=238a2e27166730e53a17fe07bfad229e07fa39b618117e5944b6d7eda9fbb0e9 PKG_MAINTAINER:=Lucian Cristian PKG_LICENSE:=GPL-2.0 diff --git a/package/utils/pciutils/patches/101-no-strip.patch b/package/utils/pciutils/patches/101-no-strip.patch index 827a4531cc..9fdfc7e570 100644 --- a/package/utils/pciutils/patches/101-no-strip.patch +++ b/package/utils/pciutils/patches/101-no-strip.patch @@ -1,13 +1,13 @@ --- a/Makefile +++ b/Makefile -@@ -131,8 +131,8 @@ distclean: clean +@@ -149,8 +149,8 @@ distclean: clean install: all # -c is ignored on Linux, but required on FreeBSD - $(DIRINSTALL) -m 755 $(DESTDIR)$(BINDIR) $(DESTDIR)$(SBINDIR) $(DESTDIR)$(IDSDIR) $(DESTDIR)$(MANDIR)/man8 $(DESTDIR)$(MANDIR)/man7 $(DESTDIR)/$(MANDIR)/man5 + $(DIRINSTALL) -m 755 $(DESTDIR)$(BINDIR) $(DESTDIR)$(SBINDIR) $(DESTDIR)$(IDSDIR) $(DESTDIR)$(MANDIR)/man8 $(DESTDIR)$(MANDIR)/man7 $(DESTDIR)$(MANDIR)/man5 - $(INSTALL) -c -m 755 $(STRIP) lspci$(EXEEXT) $(DESTDIR)$(LSPCIDIR) - $(INSTALL) -c -m 755 $(STRIP) setpci$(EXEEXT) $(DESTDIR)$(SBINDIR) + $(INSTALL) -c -m 755 lspci$(EXEEXT) $(DESTDIR)$(LSPCIDIR) + $(INSTALL) -c -m 755 setpci$(EXEEXT) $(DESTDIR)$(SBINDIR) $(INSTALL) -c -m 755 update-pciids $(DESTDIR)$(SBINDIR) + ifneq ($(IDSDIR),) $(INSTALL) -c -m 644 $(PCI_IDS) $(DESTDIR)$(IDSDIR) - $(INSTALL) -c -m 644 lspci.8 setpci.8 update-pciids.8 $(DESTDIR)$(MANDIR)/man8 diff --git a/package/utils/pciutils/patches/107-avoid-addng-multiple-version-tags.patch b/package/utils/pciutils/patches/107-avoid-addng-multiple-version-tags.patch deleted file mode 100644 index 74b5782881..0000000000 --- a/package/utils/pciutils/patches/107-avoid-addng-multiple-version-tags.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 0478e1f3928bfaa34eb910ba2cbaf1dda8f84aab Mon Sep 17 00:00:00 2001 -From: Martin Mares -Date: Wed, 10 Aug 2022 13:34:28 +0700 -Subject: [PATCH] Avoid adding multiple version tags to the same symbol - -This is apparently forbidden in most versions of binutils. ---- - lib/filter.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - ---- a/lib/filter.c -+++ b/lib/filter.c -@@ -303,21 +303,25 @@ pci_filter_match_v30(struct pci_filter_v - // (their positions in struct pci_filter were declared as RFU). - - STATIC_ALIAS(void pci_filter_init(struct pci_access *a, struct pci_filter *f), pci_filter_init_v38(a, f)); -+DEFINE_ALIAS(void pci_filter_init_v33(struct pci_access *a, struct pci_filter *f), pci_filter_init_v38); - SYMBOL_VERSION(pci_filter_init_v30, pci_filter_init@LIBPCI_3.0); --SYMBOL_VERSION(pci_filter_init_v38, pci_filter_init@LIBPCI_3.3); -+SYMBOL_VERSION(pci_filter_init_v33, pci_filter_init@LIBPCI_3.3); - SYMBOL_VERSION(pci_filter_init_v38, pci_filter_init@@LIBPCI_3.8); - - STATIC_ALIAS(char *pci_filter_parse_slot(struct pci_filter *f, char *str), pci_filter_parse_slot_v38(f, str)); -+DEFINE_ALIAS(char *pci_filter_parse_slot_v33(struct pci_filter *f, char *str), pci_filter_parse_slot_v38); - SYMBOL_VERSION(pci_filter_parse_slot_v30, pci_filter_parse_slot@LIBPCI_3.0); --SYMBOL_VERSION(pci_filter_parse_slot_v38, pci_filter_parse_slot@LIBPCI_3.3); -+SYMBOL_VERSION(pci_filter_parse_slot_v33, pci_filter_parse_slot@LIBPCI_3.3); - SYMBOL_VERSION(pci_filter_parse_slot_v38, pci_filter_parse_slot@@LIBPCI_3.8); - - STATIC_ALIAS(char *pci_filter_parse_id(struct pci_filter *f, char *str), pci_filter_parse_id_v38(f, str)); -+DEFINE_ALIAS(char *pci_filter_parse_id_v33(struct pci_filter *f, char *str), pci_filter_parse_id_v38); - SYMBOL_VERSION(pci_filter_parse_id_v30, pci_filter_parse_id@LIBPCI_3.0); --SYMBOL_VERSION(pci_filter_parse_id_v38, pci_filter_parse_id@LIBPCI_3.3); -+SYMBOL_VERSION(pci_filter_parse_id_v33, pci_filter_parse_id@LIBPCI_3.3); - SYMBOL_VERSION(pci_filter_parse_id_v38, pci_filter_parse_id@@LIBPCI_3.8); - - STATIC_ALIAS(int pci_filter_match(struct pci_filter *f, struct pci_dev *d), pci_filter_match_v38(f, d)); -+DEFINE_ALIAS(int pci_filter_match_v33(struct pci_filter *f, struct pci_dev *d), pci_filter_match_v38); - SYMBOL_VERSION(pci_filter_match_v30, pci_filter_match@LIBPCI_3.0); --SYMBOL_VERSION(pci_filter_match_v38, pci_filter_match@LIBPCI_3.3); -+SYMBOL_VERSION(pci_filter_match_v33, pci_filter_match@LIBPCI_3.3); - SYMBOL_VERSION(pci_filter_match_v38, pci_filter_match@@LIBPCI_3.8); diff --git a/package/utils/policycoreutils/Makefile b/package/utils/policycoreutils/Makefile new file mode 100644 index 0000000000..f5027c5ece --- /dev/null +++ b/package/utils/policycoreutils/Makefile @@ -0,0 +1,146 @@ +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=policycoreutils +PKG_VERSION:=3.5 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/SELinuxProject/selinux/releases/download/$(PKG_VERSION) +PKG_HASH:=78453e1529fbbf800e88860094d555e781ce1fba11a7ef77b5aabb43e1173276 +PKG_INSTALL:=1 +HOST_BUILD_DEPENDS:=libsemanage/host gettext-full/host +PKG_BUILD_DEPENDS:=BUSYBOX_CONFIG_PAM:libpam gettext-full/host + +PKG_MAINTAINER:=Thomas Petazzoni +PKG_CPE_ID:=cpe:/a:selinuxproject:policycoreutils +PKG_LICENSE:=GPL-2.0-or-later +PKG_LICENSE_FILES:=COPYING + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/nls.mk +include $(INCLUDE_DIR)/host-build.mk + +DIR_USR_BIN:= \ + newrole \ + secon \ + sestatus + +DIR_USR_SBIN:= \ + load_policy \ + setsebool + +LIBEXEC_UTILS := \ + pp + +SBIN_UTILS:= \ + restorecon_xattr \ + setfiles + +USR_BIN_UTILS:= \ + newrole \ + secon \ + sestatus + +USR_SBIN_UTILS:= \ + fixfiles \ + genhomedircon \ + open_init_pty \ + run_init \ + semodule \ + load_policy \ + setsebool + +TARGET_LDFLAGS += $(INTL_LDFLAGS) $(if $(INTL_FULL),-lintl) + +MAKE_FLAGS += \ + PAMH=$(CONFIG_BUSYBOX_CONFIG_PAM) + +HOST_MAKE_FLAGS += \ + PAMH=$(CONFIG_BUSYBOX_CONFIG_PAM) \ + DESTDIR=$(STAGING_DIR_HOST) \ + PREFIX= \ + SBINDIR=/bin + +HOST_LDFLAGS += -Wl,-rpath=$(STAGING_DIR_HOSTPKG)/lib + +$(eval $(foreach a,$(DIR_SBIN),ALTS_$(a):=300:/sbin/$(a):/sbin/policycoreutils-$(a)$(newline))) +$(eval $(foreach a,$(DIR_USR_BIN),ALTS_$(a):=300:/usr/bin/$(a):/usr/bin/policycoreutils-$(a)$(newline))) +$(eval $(foreach a,$(DIR_USR_SBIN),ALTS_$(a):=300:/usr/sbin/$(a):/usr/sbin/policycoreutils-$(a)$(newline))) +ALTS_setfiles:=300:/sbin/restorecon:/sbin/policycoreutils-setfiles 300:/sbin/setfiles:/sbin/policycoreutils-setfiles + +DEPENDS_genhomedircon:=+libsemanage $(INTL_DEPENDS) +DEPENDS_load_policy:=+libselinux $(INTL_DEPENDS) +DEPENDS_newrole:=+libselinux +libaudit +BUSYBOX_CONFIG_PAM:libpam $(INTL_DEPENDS) +DEPENDS_open_init_pty:=$(INTL_DEPENDS) +DEPENDS_pp:=+libsepol $(INTL_DEPENDS) +DEPENDS_restorecon_xattr:=+libselinux +libsepol +libaudit $(INTL_DEPENDS) +DEPENDS_run_init:=+libselinux +libaudit +BUSYBOX_CONFIG_PAM:libpam $(INTL_DEPENDS) +DEPENDS_secon:=+libselinux $(INTL_DEPENDS) +DEPENDS_semanage:=+libsemanage +DEPENDS_semodule:=+libsemanage $(INTL_DEPENDS) +DEPENDS_sestatus:=+libselinux $(INTL_DEPENDS) +DEPENDS_setfiles:=+libselinux +libsepol +libaudit $(INTL_DEPENDS) +DEPENDS_setsebool:=+libsemanage $(INTL_DEPENDS) + +define Package/policycoreutils/Default + SECTION:=utils + CATEGORY:=Utilities + TITLE:=SELinux policy utility + URL:=http://selinuxproject.org/page/Main_Page +endef + +define Package/policycoreutils + $(call Package/policycoreutils/Default) + MENU:=1 + TITLE+= common files +endef + +define GenUtilPkg + define Package/$(1) + $(call Package/policycoreutils/Default) + DEPENDS+= policycoreutils $(DEPENDS_$(2)) + TITLE+= $(2) + ALTERNATIVES:=$(ALTS_$(2)) + endef + + define Package/$(1)/description +Policycoreutils is a collection of policy utilities +(originally the "core" set of utilities needed to use +SELinux, although it has grown a bit over time). + +This package provides the $(2) utility. + endef +endef + +$(foreach a,$(LIBEXEC_UTILS) $(SBIN_UTILS) $(USR_BIN_UTILS) $(USR_SBIN_UTILS),$(eval $(call GenUtilPkg,policycoreutils-$(a),$(a)))) + +define Package/policycoreutils/install + $(INSTALL_DIR) $(1)/etc + $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/sestatus.conf $(1)/etc +ifdef CONFIG_BUSYBOX_CONFIG_PAM + $(INSTALL_DIR) $(1)/etc/pam.d + $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/pam.d/run_init $(1)/etc/pam.d + $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/pam.d/newrole $(1)/etc/pam.d +endif +endef + +define BuildUtil + define Package/$(1)/install + $(INSTALL_DIR) $$(1)$(2) + $(INSTALL_BIN) $$(PKG_INSTALL_DIR)$(2)/$(3) $$(1)$(2)/$(if $(ALTS_$(3)),policycoreutils-$(3),$(3)) + endef + + $$(eval $$(call BuildPackage,$(1))) +endef + +$(eval $(call BuildPackage,policycoreutils)) +$(foreach a,$(SBIN_UTILS),$(eval $(call BuildUtil,policycoreutils-$(a),/sbin,$(a)))) +$(foreach a,$(USR_BIN_UTILS),$(eval $(call BuildUtil,policycoreutils-$(a),/usr/bin,$(a)))) +$(foreach a,$(USR_SBIN_UTILS),$(eval $(call BuildUtil,policycoreutils-$(a),/usr/sbin,$(a)))) +$(foreach a,$(LIBEXEC_UTILS),$(eval $(call BuildUtil,policycoreutils-$(a),/usr/libexec/selinux/hll,$(a)))) +$(eval $(call HostBuild)) diff --git a/package/utils/px5g-mbedtls/Makefile b/package/utils/px5g-mbedtls/Makefile index 42ffd39ce3..14c9f684a9 100644 --- a/package/utils/px5g-mbedtls/Makefile +++ b/package/utils/px5g-mbedtls/Makefile @@ -8,10 +8,10 @@ include $(TOPDIR)/rules.mk PKG_NAME:=px5g-mbedtls -PKG_RELEASE:=9 +PKG_RELEASE:=10 PKG_LICENSE:=LGPL-2.1 -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 PKG_MAINTAINER:=Jo-Philipp Wich diff --git a/package/utils/px5g-mbedtls/px5g-mbedtls.c b/package/utils/px5g-mbedtls/px5g-mbedtls.c index 0b72154509..85abe7dc73 100644 --- a/package/utils/px5g-mbedtls/px5g-mbedtls.c +++ b/package/utils/px5g-mbedtls/px5g-mbedtls.c @@ -20,6 +20,7 @@ */ #include +#include #include #include @@ -29,8 +30,10 @@ #include #include #include +#include #include +#include #include #include #include @@ -40,19 +43,26 @@ #define PX5G_COPY "Copyright (c) 2009 Steven Barth " #define PX5G_LICENSE "Licensed under the GNU Lesser General Public License v2.1" -static int urandom_fd; static char buf[16384]; static int _urandom(void *ctx, unsigned char *out, size_t len) { - read(urandom_fd, out, len); + ssize_t ret; + + ret = getrandom(out, len, 0); + if (ret < 0 || (size_t)ret != len) + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + return 0; } -static void write_file(const char *path, int len, bool pem) +static void write_file(const char *path, size_t len, bool pem, bool cert) { - FILE *f = stdout; + mode_t mode = S_IRUSR | S_IWUSR; const char *buf_start = buf; + int fd = STDERR_FILENO; + ssize_t written; + int err; if (!pem) buf_start += sizeof(buf) - len; @@ -61,17 +71,30 @@ static void write_file(const char *path, int len, bool pem) fprintf(stderr, "No data to write\n"); exit(1); } + + if (cert) + mode |= S_IRGRP | S_IROTH; - if (!f) { + if (path) + fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, mode); + + if (fd < 0) { fprintf(stderr, "error: I/O error\n"); exit(1); } + written = write(fd, buf_start, len); + if (written != len) { + fprintf(stderr, "writing key failed with: %s\n", strerror(errno)); + exit(1); + } + err = fsync(fd); + if (err < 0) { + fprintf(stderr, "syncing key failed with: %s\n", strerror(errno)); + exit(1); + } if (path) - f = fopen(path, "w"); - - fwrite(buf_start, 1, len, f); - fclose(f); + close(fd); } static mbedtls_ecp_group_id ecp_curve(const char *name) @@ -104,7 +127,7 @@ static void write_key(mbedtls_pk_context *key, const char *path, bool pem) len = 0; } - write_file(path, len, pem); + write_file(path, len, pem, false); } static void gen_key(mbedtls_pk_context *key, bool rsa, int ksize, int exp, @@ -295,7 +318,7 @@ int selfsigned(char **arg) return 1; } } - write_file(certpath, len, pem); + write_file(certpath, len, pem, true); mbedtls_x509write_crt_free(&cert); mbedtls_mpi_free(&serial); @@ -306,8 +329,6 @@ int selfsigned(char **arg) int main(int argc, char *argv[]) { - urandom_fd = open("/dev/urandom", O_RDONLY); - if (!argv[1]) { //Usage } else if (!strcmp(argv[1], "eckey")) { diff --git a/package/utils/px5g-wolfssl/Makefile b/package/utils/px5g-wolfssl/Makefile index ea805acd8b..ba208f6ca5 100644 --- a/package/utils/px5g-wolfssl/Makefile +++ b/package/utils/px5g-wolfssl/Makefile @@ -5,10 +5,10 @@ include $(TOPDIR)/rules.mk PKG_NAME:=px5g-wolfssl -PKG_RELEASE:=$(COMMITCOUNT).1 +PKG_RELEASE:=9 PKG_LICENSE:=GPL-2.0-or-later -PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 PKG_MAINTAINER:=Paul Spooren diff --git a/package/utils/px5g-wolfssl/px5g-wolfssl.c b/package/utils/px5g-wolfssl/px5g-wolfssl.c index 86227d6afd..755d370ba2 100644 --- a/package/utils/px5g-wolfssl/px5g-wolfssl.c +++ b/package/utils/px5g-wolfssl/px5g-wolfssl.c @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include #include #include @@ -24,27 +26,38 @@ enum { RSA_KEY_TYPE = 1, }; -int write_file(byte *buf, int bufSz, char *path) { - int ret; - FILE *file; +int write_file(byte *buf, int bufSz, char *path, bool cert) { + mode_t mode = S_IRUSR | S_IWUSR; + ssize_t written; + int err; + int fd; + + if (cert) + mode |= S_IRGRP | S_IROTH; + if (path) { - file = fopen(path, "wb"); - if (file == NULL) { + fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, mode); + if (fd < 0) { perror("Error opening file"); exit(1); } } else { - file = stdout; + fd = STDERR_FILENO; } - ret = (int)fwrite(buf, 1, bufSz, file); - if (path) { - fclose(file); + written = write(fd, buf, bufSz); + if (written != bufSz) { + perror("Error write file"); + exit(1); } - if (ret > 0) { - /* ret > 0 indicates a successful file write, set to zero for return */ - ret = 0; + err = fsync(fd); + if (err < 0) { + perror("Error fsync file"); + exit(1); } - return ret; + if (path) { + close(fd); + } + return 0; } int write_key(ecc_key *ecKey, RsaKey *rsaKey, int type, int keySz, char *fName, @@ -73,9 +86,9 @@ int write_key(ecc_key *ecKey, RsaKey *rsaKey, int type, int keySz, char *fName, fprintf(stderr, "DER to PEM failed: %d\n", ret); } pemSz = ret; - ret = write_file(pem, pemSz, fName); + ret = write_file(pem, pemSz, fName, false); } else { - ret = write_file(der, derSz, fName); + ret = write_file(der, derSz, fName, false); } return ret; } @@ -142,42 +155,42 @@ int selfsigned(WC_RNG *rng, char **arg) { newCert.isCA = 0; while (*arg && **arg == '-') { - if (!strncmp(*arg, "-der", 4)) { + if (!strcmp(*arg, "-der")) { pem = false; - } else if (!strncmp(*arg, "-newkey", 6) && arg[1]) { + } else if (!strcmp(*arg, "-newkey") && arg[1]) { if (!strncmp(arg[1], "rsa:", 4)) { type = RSA_KEY_TYPE; - keySz = (unsigned int)atoi(arg[1] + 4); - } else if (!strncmp(arg[1], "ec", 2)) { + keySz = atoi(arg[1] + 4); + } else if (!strcmp(arg[1], "ec")) { type = EC_KEY_TYPE; } else { fprintf(stderr, "error: invalid algorithm\n"); return 1; } arg++; - } else if (!strncmp(*arg, "-days", 5) && arg[1]) { + } else if (!strcmp(*arg, "-days") && arg[1]) { days = (unsigned int)atoi(arg[1]); arg++; - } else if (!strncmp(*arg, "-pkeyopt", 8) && arg[1]) { + } else if (!strcmp(*arg, "-pkeyopt") && arg[1]) { if (strncmp(arg[1], "ec_paramgen_curve:", 18)) { fprintf(stderr, "error: invalid pkey option: %s\n", arg[1]); return 1; } - if (!strncmp(arg[1] + 18, "P-256:", 5)) { + if (!strcmp(arg[1] + 18, "P-256")) { curve = ECC_SECP256R1; - } else if (!strncmp(arg[1] + 18, "P-384:", 5)) { + } else if (!strcmp(arg[1] + 18, "P-384")) { curve = ECC_SECP384R1; - } else if (!strncmp(arg[1] + 18, "P-521:", 5)) { + } else if (!strcmp(arg[1] + 18, "P-521")) { curve = ECC_SECP521R1; } else { fprintf(stderr, "error: invalid curve name: %s\n", arg[1] + 18); return 1; } arg++; - } else if (!strncmp(*arg, "-keyout", 7) && arg[1]) { + } else if (!strcmp(*arg, "-keyout") && arg[1]) { keypath = arg[1]; arg++; - } else if (!strncmp(*arg, "-out", 4) && arg[1]) { + } else if (!strcmp(*arg, "-out") && arg[1]) { certpath = arg[1]; arg++; } else if (!strcmp(*arg, "-subj") && arg[1]) { @@ -281,7 +294,7 @@ int selfsigned(WC_RNG *rng, char **arg) { } pemSz = ret; - ret = write_file(pemBuf, pemSz, certpath); + ret = write_file(pemBuf, pemSz, certpath, true); if (ret != 0) { fprintf(stderr, "Write Cert failed: %d\n", ret); return ret; @@ -306,25 +319,25 @@ int dokey(WC_RNG *rng, int type, char **arg) { bool pem = true; while (*arg && **arg == '-') { - if (!strncmp(*arg, "-out", 4) && arg[1]) { + if (!strcmp(*arg, "-out") && arg[1]) { path = arg[1]; arg++; - } else if (!strncmp(*arg, "-3", 2)) { + } else if (!strcmp(*arg, "-3")) { exp = 3; - } else if (!strncmp(*arg, "-der", 4)) { + } else if (!strcmp(*arg, "-der")) { pem = false; } arg++; } if (*arg && type == RSA_KEY_TYPE) { - keySz = (unsigned int)atoi(*arg); + keySz = atoi(*arg); } else if (*arg) { - if (!strncmp(*arg, "P-256", 5)) { + if (!strcmp(*arg, "P-256")) { curve = ECC_SECP256R1; - } else if (!strncmp(*arg, "P-384", 5)) { + } else if (!strcmp(*arg, "P-384")) { curve = ECC_SECP384R1; - } else if (!strncmp(*arg, "P-521", 5)) { + } else if (!strcmp(*arg, "P-521")) { curve = ECC_SECP521R1; } else { fprintf(stderr, "Invalid Curve Name: %s\n", *arg); @@ -356,13 +369,13 @@ int main(int argc, char *argv[]) { } if (argv[1]) { - if (!strncmp(argv[1], "eckey", 5)) + if (!strcmp(argv[1], "eckey")) return dokey(&rng, EC_KEY_TYPE, argv + 2); - if (!strncmp(argv[1], "rsakey", 5)) + if (!strcmp(argv[1], "rsakey")) return dokey(&rng, RSA_KEY_TYPE, argv + 2); - if (!strncmp(argv[1], "selfsigned", 10)) + if (!strcmp(argv[1], "selfsigned")) return selfsigned(&rng, argv + 2); } diff --git a/package/utils/secilc/Makefile b/package/utils/secilc/Makefile index 6f059bfc81..5469039e22 100644 --- a/package/utils/secilc/Makefile +++ b/package/utils/secilc/Makefile @@ -6,12 +6,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=secilc -PKG_VERSION:=3.3 +PKG_VERSION:=3.5 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/SELinuxProject/selinux/releases/download/$(PKG_VERSION) -PKG_HASH:=2c5e1a5d417baf1d2aa3eac294e12c3aac7184a5ef6a779dcbe469ed756e8651 +PKG_HASH:=3eebc5a1f97847fa530cf90654b9f3b8f21a13c9ea3d07495325651580cd3373 HOST_BUILD_DEPENDS:=libsepol/host PKG_MAINTAINER:=Dominick Grift diff --git a/package/utils/sed/Makefile b/package/utils/sed/Makefile new file mode 100644 index 0000000000..895e0a88d3 --- /dev/null +++ b/package/utils/sed/Makefile @@ -0,0 +1,53 @@ +# +# Copyright (C) 2010-2016 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=sed +PKG_VERSION:=4.9 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=@GNU/sed +PKG_HASH:=6e226b732e1cd739464ad6862bd1a1aba42d7982922da7a53519631d24975181 + +PKG_MAINTAINER:=Russell Senior +PKG_LICENSE:=GPL-3.0-or-later +PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:gnu:sed + +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/sed + SECTION:=utils + CATEGORY:=Utilities + TITLE:=sed stream editor utility - full version + URL:=https://www.gnu.org/software/sed/ + ALTERNATIVES:=300:/bin/sed:/usr/libexec/sed-gnu +endef + +define Package/sed/description +sed (stream editor) is a non-interactive command-line text editor. sed is commonly +used to filter text, i.e., it takes text input, performs some operation (or set of +operations) on it, and outputs the modified text. sed is typically used for +extracting part of a file using pattern matching or substituting multiple +occurrences of a string within a file. +endef + +CONFIGURE_ARGS += \ + --disable-acl \ + --without-selinux + +define Package/sed/install + $(INSTALL_DIR) $(1)/usr/libexec + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sed $(1)/usr/libexec/sed-gnu +endef + +$(eval $(call BuildPackage,sed)) diff --git a/package/utils/ucode-mod-bpf/Makefile b/package/utils/ucode-mod-bpf/Makefile new file mode 100644 index 0000000000..a748b9dbbd --- /dev/null +++ b/package/utils/ucode-mod-bpf/Makefile @@ -0,0 +1,40 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=ucode-mod-bpf +PKG_RELEASE:=1 +PKG_LICENSE:=ISC +PKG_MAINTAINER:=Felix Fietkau + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/ucode-mod-bpf + SECTION:=utils + CATEGORY:=Utilities + TITLE:=ucode eBPF module + DEPENDS:=+libucode +libbpf +endef + +define Package/ucode-mod-bpf/description +The bpf plugin provides functionality for loading and interacting with +eBPF modules. + +It allows loading full modules and pinned maps/programs and supports +interacting with maps and attaching programs as tc classifiers. +endef + +define Package/ucode-mod-bpf/install + $(INSTALL_DIR) $(1)/usr/lib/ucode + $(CP) $(PKG_BUILD_DIR)/bpf.so $(1)/usr/lib/ucode/ +endef + +define Build/Configure +endef + +define Build/Compile + $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) $(FPIC) \ + -Wall -ffunction-sections -Wl,--gc-sections -shared -Wl,--no-as-needed -lbpf \ + -o $(PKG_BUILD_DIR)/bpf.so $(PKG_BUILD_DIR)/bpf.c +endef + +$(eval $(call BuildPackage,ucode-mod-bpf)) diff --git a/package/utils/ucode-mod-bpf/src/bpf.c b/package/utils/ucode-mod-bpf/src/bpf.c new file mode 100644 index 0000000000..415215e54e --- /dev/null +++ b/package/utils/ucode-mod-bpf/src/bpf.c @@ -0,0 +1,814 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "ucode/module.h" + +#define err_return_int(err, ...) do { set_error(err, __VA_ARGS__); return -1; } while(0) +#define err_return(err, ...) do { set_error(err, __VA_ARGS__); return NULL; } while(0) +#define TRUE ucv_boolean_new(true) + +static uc_resource_type_t *module_type, *map_type, *map_iter_type, *program_type; +static uc_value_t *registry; +static uc_vm_t *debug_vm; + +static struct { + int code; + char *msg; +} last_error; + +struct uc_bpf_fd { + int fd; + bool close; +}; + +struct uc_bpf_map { + struct uc_bpf_fd fd; /* must be first */ + unsigned int key_size, val_size; +}; + +struct uc_bpf_map_iter { + int fd; + unsigned int key_size; + bool has_next; + uint8_t key[]; +}; + +__attribute__((format(printf, 2, 3))) static void +set_error(int errcode, const char *fmt, ...) +{ + va_list ap; + + free(last_error.msg); + + last_error.code = errcode; + last_error.msg = NULL; + + if (fmt) { + va_start(ap, fmt); + xvasprintf(&last_error.msg, fmt, ap); + va_end(ap); + } +} + +static void init_env(void) +{ + static bool init_done = false; + struct rlimit limit = { + .rlim_cur = RLIM_INFINITY, + .rlim_max = RLIM_INFINITY, + }; + + if (init_done) + return; + + setrlimit(RLIMIT_MEMLOCK, &limit); + init_done = true; +} + +static uc_value_t * +uc_bpf_error(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *numeric = uc_fn_arg(0); + const char *msg = last_error.msg; + int code = last_error.code; + uc_stringbuf_t *buf; + const char *s; + + if (last_error.code == 0) + return NULL; + + set_error(0, NULL); + + if (ucv_is_truish(numeric)) + return ucv_int64_new(code); + + buf = ucv_stringbuf_new(); + if (code < 0 && msg) { + ucv_stringbuf_addstr(buf, msg, strlen(msg)); + } else { + s = strerror(code); + ucv_stringbuf_addstr(buf, s, strlen(s)); + if (msg) + ucv_stringbuf_printf(buf, ": %s", msg); + } + + return ucv_stringbuf_finish(buf); +} + +static int +uc_bpf_module_set_opts(struct bpf_object *obj, uc_value_t *opts) +{ + uc_value_t *val; + + if (!opts) + return 0; + + if (ucv_type(opts) != UC_OBJECT) + err_return_int(EINVAL, "options argument"); + + if ((val = ucv_object_get(opts, "rodata", NULL)) != NULL) { + struct bpf_map *map = NULL; + + if (ucv_type(val) != UC_STRING) + err_return_int(EINVAL, "rodata type"); + + while ((map = bpf_object__next_map(obj, map)) != NULL) { + if (!strstr(bpf_map__name(map), ".rodata")) + continue; + + break; + } + + if (!map) + err_return_int(errno, "rodata map"); + + if (bpf_map__set_initial_value(map, ucv_string_get(val), + ucv_string_length(val))) + err_return_int(errno, "rodata"); + } + + if ((val = ucv_object_get(opts, "program-type", NULL)) != NULL) { + if (ucv_type(val) != UC_OBJECT) + err_return_int(EINVAL, "prog_types argument"); + + ucv_object_foreach(val, name, type) { + struct bpf_program *prog; + + if (ucv_type(type) != UC_INTEGER) + err_return_int(EINVAL, "program %s type", name); + + prog = bpf_object__find_program_by_name(obj, name); + if (!prog) + err_return_int(-1, "program %s not found", name); + + bpf_program__set_type(prog, ucv_int64_get(type)); + } + } + + return 0; +} + +static uc_value_t * +uc_bpf_open_module(uc_vm_t *vm, size_t nargs) +{ + DECLARE_LIBBPF_OPTS(bpf_object_open_opts, bpf_opts); + uc_value_t *path = uc_fn_arg(0); + uc_value_t *opts = uc_fn_arg(1); + struct bpf_object *obj; + + if (ucv_type(path) != UC_STRING) + err_return(EINVAL, "module path"); + + init_env(); + obj = bpf_object__open_file(ucv_string_get(path), &bpf_opts); + if (libbpf_get_error(obj)) + err_return(errno, NULL); + + if (uc_bpf_module_set_opts(obj, opts)) { + bpf_object__close(obj); + return NULL; + } + + if (bpf_object__load(obj)) { + bpf_object__close(obj); + err_return(errno, NULL); + } + + return uc_resource_new(module_type, obj); +} + +static uc_value_t * +uc_bpf_map_create(int fd, unsigned int key_size, unsigned int val_size, bool close) +{ + struct uc_bpf_map *uc_map; + + uc_map = xalloc(sizeof(*uc_map)); + uc_map->fd.fd = fd; + uc_map->key_size = key_size; + uc_map->val_size = val_size; + uc_map->fd.close = close; + + return uc_resource_new(map_type, uc_map); +} + +static uc_value_t * +uc_bpf_open_map(uc_vm_t *vm, size_t nargs) +{ + struct bpf_map_info info; + uc_value_t *path = uc_fn_arg(0); + __u32 len = sizeof(info); + int err; + int fd; + + if (ucv_type(path) != UC_STRING) + err_return(EINVAL, "module path"); + + fd = bpf_obj_get(ucv_string_get(path)); + if (fd < 0) + err_return(errno, NULL); + + err = bpf_obj_get_info_by_fd(fd, &info, &len); + if (err) { + close(fd); + err_return(errno, NULL); + } + + return uc_bpf_map_create(fd, info.key_size, info.value_size, true); +} + +static uc_value_t * +uc_bpf_open_program(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *path = uc_fn_arg(0); + struct uc_bpf_fd *f; + int fd; + + if (ucv_type(path) != UC_STRING) + err_return(EINVAL, "module path"); + + fd = bpf_obj_get(ucv_string_get(path)); + if (fd < 0) + err_return(errno, NULL); + + f = xalloc(sizeof(*f)); + f->fd = fd; + f->close = true; + + return uc_resource_new(program_type, f); +} + +static uc_value_t * +uc_bpf_module_get_maps(uc_vm_t *vm, size_t nargs) +{ + struct bpf_object *obj = uc_fn_thisval("bpf.module"); + struct bpf_map *map = NULL; + uc_value_t *rv; + int i = 0; + + if (!obj) + err_return(EINVAL, NULL); + + rv = ucv_array_new(vm); + bpf_object__for_each_map(map, obj) + ucv_array_set(rv, i++, ucv_string_new(bpf_map__name(map))); + + return rv; +} + +static uc_value_t * +uc_bpf_module_get_map(uc_vm_t *vm, size_t nargs) +{ + struct bpf_object *obj = uc_fn_thisval("bpf.module"); + struct bpf_map *map; + uc_value_t *name = uc_fn_arg(0); + int fd; + + if (!obj || ucv_type(name) != UC_STRING) + err_return(EINVAL, NULL); + + map = bpf_object__find_map_by_name(obj, ucv_string_get(name)); + if (!map) + err_return(errno, NULL); + + fd = bpf_map__fd(map); + if (fd < 0) + err_return(EINVAL, NULL); + + return uc_bpf_map_create(fd, bpf_map__key_size(map), bpf_map__value_size(map), false); +} + +static uc_value_t * +uc_bpf_module_get_programs(uc_vm_t *vm, size_t nargs) +{ + struct bpf_object *obj = uc_fn_thisval("bpf.module"); + struct bpf_program *prog = NULL; + uc_value_t *rv; + int i = 0; + + if (!obj) + err_return(EINVAL, NULL); + + rv = ucv_array_new(vm); + bpf_object__for_each_program(prog, obj) + ucv_array_set(rv, i++, ucv_string_new(bpf_program__name(prog))); + + return rv; +} + +static uc_value_t * +uc_bpf_module_get_program(uc_vm_t *vm, size_t nargs) +{ + struct bpf_object *obj = uc_fn_thisval("bpf.module"); + struct bpf_program *prog; + uc_value_t *name = uc_fn_arg(0); + struct uc_bpf_fd *f; + int fd; + + if (!obj || !name || ucv_type(name) != UC_STRING) + err_return(EINVAL, NULL); + + prog = bpf_object__find_program_by_name(obj, ucv_string_get(name)); + if (!prog) + err_return(errno, NULL); + + fd = bpf_program__fd(prog); + if (fd < 0) + err_return(EINVAL, NULL); + + f = xalloc(sizeof(*f)); + f->fd = fd; + + return uc_resource_new(program_type, f); +} + +static void * +uc_bpf_map_arg(uc_value_t *val, const char *kind, unsigned int size) +{ + static union { + uint32_t u32; + uint64_t u64; + } val_int; + + switch (ucv_type(val)) { + case UC_INTEGER: + if (size == 4) + val_int.u32 = ucv_int64_get(val); + else if (size == 8) + val_int.u64 = ucv_int64_get(val); + else + break; + + return &val_int; + case UC_STRING: + if (size != ucv_string_length(val)) + break; + + return ucv_string_get(val); + default: + err_return(EINVAL, "%s type", kind); + } + + err_return(EINVAL, "%s size mismatch (expected: %d)", kind, size); +} + +static uc_value_t * +uc_bpf_map_get(uc_vm_t *vm, size_t nargs) +{ + struct uc_bpf_map *map = uc_fn_thisval("bpf.map"); + uc_value_t *a_key = uc_fn_arg(0); + void *key, *val; + + if (!map) + err_return(EINVAL, NULL); + + key = uc_bpf_map_arg(a_key, "key", map->key_size); + if (!key) + return NULL; + + val = alloca(map->val_size); + if (bpf_map_lookup_elem(map->fd.fd, key, val)) + return NULL; + + return ucv_string_new_length(val, map->val_size); +} + +static uc_value_t * +uc_bpf_map_set(uc_vm_t *vm, size_t nargs) +{ + struct uc_bpf_map *map = uc_fn_thisval("bpf.map"); + uc_value_t *a_key = uc_fn_arg(0); + uc_value_t *a_val = uc_fn_arg(1); + uc_value_t *a_flags = uc_fn_arg(2); + uint64_t flags; + void *key, *val; + + if (!map) + err_return(EINVAL, NULL); + + key = uc_bpf_map_arg(a_key, "key", map->key_size); + if (!key) + return NULL; + + val = uc_bpf_map_arg(a_val, "value", map->val_size); + if (!val) + return NULL; + + if (!a_flags) + flags = BPF_ANY; + else if (ucv_type(a_flags) != UC_INTEGER) + err_return(EINVAL, "flags"); + else + flags = ucv_int64_get(a_flags); + + if (bpf_map_update_elem(map->fd.fd, key, val, flags)) + return NULL; + + return ucv_string_new_length(val, map->val_size); +} + +static uc_value_t * +uc_bpf_map_delete(uc_vm_t *vm, size_t nargs) +{ + struct uc_bpf_map *map = uc_fn_thisval("bpf.map"); + uc_value_t *a_key = uc_fn_arg(0); + uc_value_t *a_return = uc_fn_arg(1); + void *key, *val = NULL; + int ret; + + if (!map) + err_return(EINVAL, NULL); + + key = uc_bpf_map_arg(a_key, "key", map->key_size); + if (!key) + return NULL; + + if (!ucv_is_truish(a_return)) { + ret = bpf_map_delete_elem(map->fd.fd, key); + + return ucv_boolean_new(ret == 0); + } + + val = alloca(map->val_size); + if (bpf_map_lookup_and_delete_elem(map->fd.fd, key, val)) + return NULL; + + return ucv_string_new_length(val, map->val_size); +} + +static uc_value_t * +uc_bpf_map_delete_all(uc_vm_t *vm, size_t nargs) +{ + struct uc_bpf_map *map = uc_fn_thisval("bpf.map"); + uc_value_t *filter = uc_fn_arg(0); + bool has_next; + void *key, *next; + + if (!map) + err_return(EINVAL, NULL); + + key = alloca(map->key_size); + next = alloca(map->key_size); + has_next = !bpf_map_get_next_key(map->fd.fd, NULL, next); + while (has_next) { + bool skip = false; + + memcpy(key, next, map->key_size); + has_next = !bpf_map_get_next_key(map->fd.fd, next, next); + + if (ucv_is_callable(filter)) { + uc_value_t *rv; + + uc_value_push(ucv_get(filter)); + uc_value_push(ucv_string_new_length((const char *)key, map->key_size)); + if (uc_call(1) != EXCEPTION_NONE) + break; + + rv = uc_vm_stack_pop(vm); + if (!rv) + break; + + skip = !ucv_is_truish(rv); + ucv_put(rv); + } + + if (!skip) + bpf_map_delete_elem(map->fd.fd, key); + } + + return TRUE; +} + +static uc_value_t * +uc_bpf_map_iterator(uc_vm_t *vm, size_t nargs) +{ + struct uc_bpf_map *map = uc_fn_thisval("bpf.map"); + struct uc_bpf_map_iter *iter; + + if (!map) + err_return(EINVAL, NULL); + + iter = xalloc(sizeof(*iter) + map->key_size); + iter->fd = map->fd.fd; + iter->key_size = map->key_size; + iter->has_next = !bpf_map_get_next_key(iter->fd, NULL, &iter->key); + + return uc_resource_new(map_iter_type, iter); +} + +static uc_value_t * +uc_bpf_map_iter_next(uc_vm_t *vm, size_t nargs) +{ + struct uc_bpf_map_iter *iter = uc_fn_thisval("bpf.map_iter"); + uc_value_t *rv; + + if (!iter->has_next) + return NULL; + + rv = ucv_string_new_length((const char *)iter->key, iter->key_size); + iter->has_next = !bpf_map_get_next_key(iter->fd, &iter->key, &iter->key); + + return rv; +} + +static uc_value_t * +uc_bpf_map_iter_next_int(uc_vm_t *vm, size_t nargs) +{ + struct uc_bpf_map_iter *iter = uc_fn_thisval("bpf.map_iter"); + uint64_t intval; + uc_value_t *rv; + + if (!iter->has_next) + return NULL; + + if (iter->key_size == 4) + intval = *(uint32_t *)iter->key; + else if (iter->key_size == 8) + intval = *(uint64_t *)iter->key; + else + return NULL; + + rv = ucv_int64_new(intval); + iter->has_next = !bpf_map_get_next_key(iter->fd, &iter->key, &iter->key); + + return rv; +} + +static uc_value_t * +uc_bpf_map_foreach(uc_vm_t *vm, size_t nargs) +{ + struct uc_bpf_map *map = uc_fn_thisval("bpf.map"); + uc_value_t *func = uc_fn_arg(0); + bool has_next; + void *key, *next; + bool ret = false; + + key = alloca(map->key_size); + next = alloca(map->key_size); + has_next = !bpf_map_get_next_key(map->fd.fd, NULL, next); + + while (has_next) { + uc_value_t *rv; + bool stop; + + memcpy(key, next, map->key_size); + has_next = !bpf_map_get_next_key(map->fd.fd, next, next); + + uc_value_push(ucv_get(func)); + uc_value_push(ucv_string_new_length((const char *)key, map->key_size)); + + if (uc_call(1) != EXCEPTION_NONE) + break; + + rv = uc_vm_stack_pop(vm); + stop = (ucv_type(rv) == UC_BOOLEAN && !ucv_boolean_get(rv)); + ucv_put(rv); + + if (stop) + break; + + ret = true; + } + + return ucv_boolean_new(ret); +} + +static uc_value_t * +uc_bpf_obj_pin(uc_vm_t *vm, size_t nargs, const char *type) +{ + struct uc_bpf_fd *f = uc_fn_thisval(type); + uc_value_t *path = uc_fn_arg(0); + + if (ucv_type(path) != UC_STRING) + err_return(EINVAL, NULL); + + if (bpf_obj_pin(f->fd, ucv_string_get(path))) + err_return(errno, NULL); + + return TRUE; +} + +static uc_value_t * +uc_bpf_program_pin(uc_vm_t *vm, size_t nargs) +{ + return uc_bpf_obj_pin(vm, nargs, "bpf.program"); +} + +static uc_value_t * +uc_bpf_map_pin(uc_vm_t *vm, size_t nargs) +{ + return uc_bpf_obj_pin(vm, nargs, "bpf.map"); +} + +static uc_value_t * +uc_bpf_set_tc_hook(uc_value_t *ifname, uc_value_t *type, uc_value_t *prio, + int fd) +{ + DECLARE_LIBBPF_OPTS(bpf_tc_hook, hook); + DECLARE_LIBBPF_OPTS(bpf_tc_opts, attach_tc, + .handle = 1); + const char *type_str; + uint64_t prio_val; + + if (ucv_type(ifname) != UC_STRING || ucv_type(type) != UC_STRING || + ucv_type(prio) != UC_INTEGER) + err_return(EINVAL, NULL); + + prio_val = ucv_int64_get(prio); + if (prio_val > 0xffff) + err_return(EINVAL, NULL); + + type_str = ucv_string_get(type); + if (!strcmp(type_str, "ingress")) + hook.attach_point = BPF_TC_INGRESS; + else if (!strcmp(type_str, "egress")) + hook.attach_point = BPF_TC_EGRESS; + else + err_return(EINVAL, NULL); + + hook.ifindex = if_nametoindex(ucv_string_get(ifname)); + if (!hook.ifindex) + goto error; + + bpf_tc_hook_create(&hook); + attach_tc.priority = prio_val; + if (bpf_tc_detach(&hook, &attach_tc) < 0 && fd < 0) + goto error; + + if (fd < 0) + goto out; + + attach_tc.prog_fd = fd; + if (bpf_tc_attach(&hook, &attach_tc) < 0) + goto error; + +out: + return TRUE; + +error: + if (fd >= 0) + err_return(ENOENT, NULL); + return NULL; +} + +static uc_value_t * +uc_bpf_program_tc_attach(uc_vm_t *vm, size_t nargs) +{ + struct uc_bpf_fd *f = uc_fn_thisval("bpf.program"); + uc_value_t *ifname = uc_fn_arg(0); + uc_value_t *type = uc_fn_arg(1); + uc_value_t *prio = uc_fn_arg(2); + + if (!f) + err_return(EINVAL, NULL); + + return uc_bpf_set_tc_hook(ifname, type, prio, f->fd); +} + +static uc_value_t * +uc_bpf_tc_detach(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *ifname = uc_fn_arg(0); + uc_value_t *type = uc_fn_arg(1); + uc_value_t *prio = uc_fn_arg(2); + + return uc_bpf_set_tc_hook(ifname, type, prio, -1); +} + +static int +uc_bpf_debug_print(enum libbpf_print_level level, const char *format, + va_list args) +{ + char buf[256], *str = NULL; + uc_value_t *val; + va_list ap; + int size; + + va_copy(ap, args); + size = vsnprintf(buf, sizeof(buf), format, ap); + va_end(ap); + + if (size > 0 && (unsigned long)size < ARRAY_SIZE(buf) - 1) { + val = ucv_string_new(buf); + goto out; + } + + if (vasprintf(&str, format, args) < 0) + return 0; + + val = ucv_string_new(str); + free(str); + +out: + uc_vm_stack_push(debug_vm, ucv_get(ucv_array_get(registry, 0))); + uc_vm_stack_push(debug_vm, ucv_int64_new(level)); + uc_vm_stack_push(debug_vm, val); + if (uc_vm_call(debug_vm, false, 2) == EXCEPTION_NONE) + ucv_put(uc_vm_stack_pop(debug_vm)); + + return 0; +} + +static uc_value_t * +uc_bpf_set_debug_handler(uc_vm_t *vm, size_t nargs) +{ + uc_value_t *handler = uc_fn_arg(0); + + if (handler && !ucv_is_callable(handler)) + err_return(EINVAL, NULL); + + debug_vm = vm; + libbpf_set_print(handler ? uc_bpf_debug_print : NULL); + + ucv_array_set(registry, 0, ucv_get(handler)); + + return NULL; +} + +static void +register_constants(uc_vm_t *vm, uc_value_t *scope) +{ +#define ADD_CONST(x) ucv_object_add(scope, #x, ucv_int64_new(x)) + ADD_CONST(BPF_PROG_TYPE_SCHED_CLS); + ADD_CONST(BPF_PROG_TYPE_SCHED_ACT); + + ADD_CONST(BPF_ANY); + ADD_CONST(BPF_NOEXIST); + ADD_CONST(BPF_EXIST); + ADD_CONST(BPF_F_LOCK); +} + +static const uc_function_list_t module_fns[] = { + { "get_map", uc_bpf_module_get_map }, + { "get_maps", uc_bpf_module_get_maps }, + { "get_programs", uc_bpf_module_get_programs }, + { "get_program", uc_bpf_module_get_program }, +}; + +static void module_free(void *ptr) +{ + struct bpf_object *obj = ptr; + + bpf_object__close(obj); +} + +static const uc_function_list_t map_fns[] = { + { "pin", uc_bpf_map_pin }, + { "get", uc_bpf_map_get }, + { "set", uc_bpf_map_set }, + { "delete", uc_bpf_map_delete }, + { "delete_all", uc_bpf_map_delete_all }, + { "foreach", uc_bpf_map_foreach }, + { "iterator", uc_bpf_map_iterator }, +}; + +static void uc_bpf_fd_free(void *ptr) +{ + struct uc_bpf_fd *f = ptr; + + if (f->close) + close(f->fd); + free(f); +} + +static const uc_function_list_t map_iter_fns[] = { + { "next", uc_bpf_map_iter_next }, + { "next_int", uc_bpf_map_iter_next_int }, +}; + +static const uc_function_list_t prog_fns[] = { + { "pin", uc_bpf_program_pin }, + { "tc_attach", uc_bpf_program_tc_attach }, +}; + +static const uc_function_list_t global_fns[] = { + { "error", uc_bpf_error }, + { "set_debug_handler", uc_bpf_set_debug_handler }, + { "open_module", uc_bpf_open_module }, + { "open_map", uc_bpf_open_map }, + { "open_program", uc_bpf_open_program }, + { "tc_detach", uc_bpf_tc_detach }, +}; + +void uc_module_init(uc_vm_t *vm, uc_value_t *scope) +{ + uc_function_list_register(scope, global_fns); + register_constants(vm, scope); + + registry = ucv_array_new(vm); + uc_vm_registry_set(vm, "bpf.registry", registry); + + module_type = uc_type_declare(vm, "bpf.module", module_fns, module_free); + map_type = uc_type_declare(vm, "bpf.map", map_fns, uc_bpf_fd_free); + map_iter_type = uc_type_declare(vm, "bpf.map_iter", map_iter_fns, free); + program_type = uc_type_declare(vm, "bpf.program", prog_fns, uc_bpf_fd_free); +} diff --git a/package/utils/ucode/Makefile b/package/utils/ucode/Makefile index a7ba63a6da..75272600bd 100644 --- a/package/utils/ucode/Makefile +++ b/package/utils/ucode/Makefile @@ -12,21 +12,31 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=https://github.com/jow-/ucode.git -PKG_SOURCE_DATE:=2022-12-02 -PKG_SOURCE_VERSION:=46d93c9cc5da6fce581df86159bd0fc4357de41c -PKG_MIRROR_HASH:=970a47f1bef719f056d40d17398db492bd4de92b98ef9aba4582cb18b4c9b270 +PKG_SOURCE_DATE:=2023-11-07 +PKG_SOURCE_VERSION:=a6e75e02528e36f3610a7f0073453018336def2e +PKG_MIRROR_HASH:=e1a0f98ba865ed5911d5db3bfca55a2f1b825992bf5f7c7e324928d9412d7ae2 PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=ISC -PKG_ABI_VERSION:=20220812 +PKG_ABI_VERSION:=20230711 include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/cmake.mk CMAKE_OPTIONS += -DSOVERSION=$(PKG_ABI_VERSION) + +ifeq ($(HOST_OS),Darwin) + CMAKE_HOST_OPTIONS += \ + -DCMAKE_SKIP_RPATH=FALSE \ + -DCMAKE_MACOSX_RPATH=1 \ + -DCMAKE_INSTALL_RPATH="${STAGING_DIR_HOSTPKG}/lib" +else + CMAKE_HOST_OPTIONS += \ + -DSOVERSION=$(PKG_ABI_VERSION) +endif + CMAKE_HOST_OPTIONS += \ - -DSOVERSION=$(PKG_ABI_VERSION) \ -DFS_SUPPORT=ON \ -DMATH_SUPPORT=ON \ -DNL80211_SUPPORT=OFF \ @@ -35,13 +45,16 @@ CMAKE_HOST_OPTIONS += \ -DSTRUCT_SUPPORT=ON \ -DUBUS_SUPPORT=OFF \ -DUCI_SUPPORT=OFF \ - -DULOOP_SUPPORT=OFF + -DULOOP_SUPPORT=OFF \ + -DDEBUG_SUPPORT=ON \ + -DLOG_SUPPORT=OFF define Package/ucode/default - SECTION:=utils - CATEGORY:=Utilities - TITLE:=ucode - Tiny scripting and templating language + SUBMENU:=ucode + SECTION:=lang + CATEGORY:=Languages + TITLE:=Tiny scripting and templating language endef define Package/ucode @@ -57,7 +70,10 @@ endef define Package/libucode $(Package/ucode/default) - TITLE+= - runtime library + SUBMENU:= + SECTION:=libs + CATEGORY:=Libraries + TITLE+= (library) ABI_VERSION:=$(PKG_ABI_VERSION) DEPENDS:=+libjson-c endef @@ -66,105 +82,29 @@ define Package/libucode/description The libucode package provides the shared runtime library for the ucode interpreter. endef +# 1: name +# 2: cmake symbol +# 3: depends +# 4: description +define UcodeModule + UCODE_MODULES += ucode-mod-$(strip $(1)) + CMAKE_OPTIONS += -D$(strip $(2))=$(if $(CONFIG_PACKAGE_ucode-mod-$(strip $(1))),ON,OFF) + PKG_CONFIG_DEPENDS += CONFIG_PACKAGE_ucode-mod-$(strip $(1)) -define Package/ucode-mod-fs - $(Package/ucode/default) - TITLE+= (filesystem module) - DEPENDS:=ucode -endef - -define Package/ucode-mod-fs/description - The filesystem plugin module allows interaction with the local file system. -endef - - -define Package/ucode-mod-math - $(Package/ucode/default) - TITLE+= (math module) - DEPENDS:=ucode -endef - -define Package/ucode-mod-math/description - The math plugin provides access to various procedures. -endef - - -define Package/ucode-mod-nl80211 - $(Package/ucode/default) - TITLE+= (nl80211 module) - DEPENDS:=ucode +libnl-tiny -endef - -define Package/ucode-mod-nl80211/description - The nl80211 plugin provides access to the Linux wireless 802.11 netlink API. -endef - - -define Package/ucode-mod-resolv - $(Package/ucode/default) - TITLE+= (resolv module) - DEPENDS:=ucode -endef - -define Package/ucode-mod-resolv/description - The resolv plugin implements simple DNS resolving. -endef - - -define Package/ucode-mod-rtnl - $(Package/ucode/default) - TITLE+= (rtnl module) - DEPENDS:=ucode +libnl-tiny -endef - -define Package/ucode-mod-rtnl/description - The rtnl plugin provides access to the Linux routing netlink API. -endef - - -define Package/ucode-mod-struct + define Package/ucode-mod-$(strip $(1)) $(Package/ucode/default) - TITLE+= (struct module) - DEPENDS:=ucode -endef - -define Package/ucode-mod-struct/description - The struct plugin implemnts Python 3 compatible struct.pack/unpack functionality. -endef - - -define Package/ucode-mod-ubus - $(Package/ucode/default) - TITLE+= (ubus module) - DEPENDS:=ucode +libubus +libblobmsg-json -endef - -define Package/ucode-mod-ubus/description - The ubus module allows ucode template scripts to enumerate and invoke ubus - procedures. -endef - - -define Package/ucode-mod-uci - $(Package/ucode/default) - TITLE+= (uci module) - DEPENDS:=ucode +libuci -endef - -define Package/ucode-mod-uci/description - The uci module allows templates to read and modify uci configuration. -endef - + TITLE+= ($(strip $(1)) module) + DEPENDS:=+ucode $(3) + endef -define Package/ucode-mod-uloop - $(Package/ucode/default) - TITLE+= (uloop module) - DEPENDS:=ucode +libubox -endef + define Package/ucode-mod-$(strip $(1))/description + $(strip $(4)) + endef -define Package/ucode-mod-uloop/description - The uloop module allows ucode scripts to interact with libreCMC uloop event - loop implementation. + define Package/ucode-mod-$(strip $(1))/install + $(INSTALL_DIR) $$(1)/usr/lib/ucode + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ucode/$(strip $(1)).so $$(1)/usr/lib/ucode/ + endef endef @@ -185,60 +125,55 @@ define Package/libucode/install $(CP) $(PKG_INSTALL_DIR)/usr/lib/libucode.so.* $(1)/usr/lib/ endef -define Package/ucode-mod-fs/install - $(INSTALL_DIR) $(1)/usr/lib/ucode - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ucode/fs.so $(1)/usr/lib/ucode/ -endef -define Package/ucode-mod-math/install - $(INSTALL_DIR) $(1)/usr/lib/ucode - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ucode/math.so $(1)/usr/lib/ucode/ -endef +$(eval $(call UcodeModule, \ + debug, DEBUG_SUPPORT, +libubox +libucode, \ + The debug plugin module provides runtime debugging and introspection facilities.)) -define Package/ucode-mod-nl80211/install - $(INSTALL_DIR) $(1)/usr/lib/ucode - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ucode/nl80211.so $(1)/usr/lib/ucode/ -endef +$(eval $(call UcodeModule, \ + fs, FS_SUPPORT, , \ + The filesystem plugin module allows interaction with the local file system.)) -define Package/ucode-mod-resolv/install - $(INSTALL_DIR) $(1)/usr/lib/ucode - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ucode/resolv.so $(1)/usr/lib/ucode/ -endef +$(eval $(call UcodeModule, \ + log, LOG_SUPPORT, +libubox, \ + The log plugin module provides access to the syslog and libubox ulog APIs.)) -define Package/ucode-mod-rtnl/install - $(INSTALL_DIR) $(1)/usr/lib/ucode - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ucode/rtnl.so $(1)/usr/lib/ucode/ -endef +$(eval $(call UcodeModule, \ + math, MATH_SUPPORT, , \ + The math plugin provides access to various procedures.)) -define Package/ucode-mod-struct/install - $(INSTALL_DIR) $(1)/usr/lib/ucode - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ucode/struct.so $(1)/usr/lib/ucode/ -endef +$(eval $(call UcodeModule, \ + nl80211, NL80211_SUPPORT, +libnl-tiny +libubox, \ + The nl80211 plugin provides access to the Linux wireless 802.11 netlink API.)) -define Package/ucode-mod-ubus/install - $(INSTALL_DIR) $(1)/usr/lib/ucode - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ucode/ubus.so $(1)/usr/lib/ucode/ -endef +$(eval $(call UcodeModule, \ + resolv, RESOLV_SUPPORT, , \ + The resolv plugin implements simple DNS resolving.)) -define Package/ucode-mod-uci/install - $(INSTALL_DIR) $(1)/usr/lib/ucode - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ucode/uci.so $(1)/usr/lib/ucode/ -endef +$(eval $(call UcodeModule, \ + rtnl, RTNL_SUPPORT, +libnl-tiny +libubox, \ + The rtnl plugin provides access to the Linux routing netlink API.)) -define Package/ucode-mod-uloop/install - $(INSTALL_DIR) $(1)/usr/lib/ucode - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ucode/uloop.so $(1)/usr/lib/ucode/ -endef +$(eval $(call UcodeModule, \ + struct, STRUCT_SUPPORT, , \ + The struct plugin implements Python 3 compatible struct.pack/unpack functionality.)) + +$(eval $(call UcodeModule, \ + ubus, UBUS_SUPPORT, +libubus +libblobmsg-json, \ + The ubus module allows ucode template scripts to enumerate and invoke ubus procedures.)) + +$(eval $(call UcodeModule, \ + uci, UCI_SUPPORT, +libuci, \ + The uci module allows templates to read and modify uci configuration.)) + +$(eval $(call UcodeModule, \ + uloop, ULOOP_SUPPORT, +libubox, \ + The uloop module allows ucode scripts to interact with libreCMC uloop event loop implementation.)) $(eval $(call BuildPackage,libucode)) $(eval $(call BuildPackage,ucode)) -$(eval $(call BuildPackage,ucode-mod-fs)) -$(eval $(call BuildPackage,ucode-mod-math)) -$(eval $(call BuildPackage,ucode-mod-nl80211)) -$(eval $(call BuildPackage,ucode-mod-resolv)) -$(eval $(call BuildPackage,ucode-mod-rtnl)) -$(eval $(call BuildPackage,ucode-mod-struct)) -$(eval $(call BuildPackage,ucode-mod-ubus)) -$(eval $(call BuildPackage,ucode-mod-uci)) -$(eval $(call BuildPackage,ucode-mod-uloop)) + +$(foreach mod,$(UCODE_MODULES), \ + $(eval $(call BuildPackage,$(mod)))) + $(eval $(call HostBuild)) diff --git a/package/utils/uencrypt/Makefile b/package/utils/uencrypt/Makefile index dc08f6672a..70ca655b6e 100644 --- a/package/utils/uencrypt/Makefile +++ b/package/utils/uencrypt/Makefile @@ -4,54 +4,82 @@ include $(TOPDIR)/rules.mk PKG_NAME:=uencrypt -PKG_RELEASE:=2 +PKG_RELEASE:=5 -PKG_FLAGS:=nonshared PKG_LICENSE:=GPL-2.0-or-later PKG_MAINTAINER:=Eneas U de Queiroz -PKG_CONFIG_DEPENDS:=\ - CONFIG_UENCRYPT_OPENSSL \ - CONFIG_UENCRYPT_WOLFSSL include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk CMAKE_INSTALL:=1 -CMAKE_OPTIONS+=$(if $(CONFIG_UENCRYPT_WOLFSSL),-DUSE_WOLFSSL=1) +ifeq ($(BUILD_VARIANT),mbedtls) + CMAKE_OPTIONS+=-DUSE_MBEDTLS=1 +else ifeq ($(BUILD_VARIANT),wolfssl) + CMAKE_OPTIONS+=-DUSE_WOLFSSL=1 +endif -define Package/uencrypt +TARGET_CFLAGS+=-Wall + +define Package/uencrypt/default SECTION:=utils CATEGORY:=Base system - TITLE:=Decryption utility for Arcadyan WG4xx223 - DEPENDS:=@TARGET_ramips_mt7621 +UENCRYPT_WOLFSSL:libwolfssl +UENCRYPT_OPENSSL:libopenssl + TITLE:=Small Decryption utility +endef + +define Package/uencrypt/default/description + This is a small encrypton/decryption program. It defaults + to AES-128-CBC, but supports any encryption provided by + the crypto library. Even though it can be used for + non-critical* regular encryption and decryption operations, + it is included here to unencrypt the configuration from mtd + on some devices. + + * Key and IV are exposed on cmdline + + This variant uses $(1) as crypto provider endef -define Package/uencrypt/description - This is a small AES-128-CBC encrypton/decryption program. - Even though it can be used for regular encryption and - decryption operations using AES-128-CBC, it is included - here to unencrypt the configuration from mtd on Arcadyan - WG430223 and WG443223 routers. +define Package/uencrypt-mbedtls + $(Package/uencrypt/default) + VARIANT:=mbedtls + TITLE+= using mbedTLS + DEPENDS:=+libmbedtls + CONFLICTS:=uencrypt-openssl uencrypt-wolfssl endef -define Package/uencrypt/config - if PACKAGE_uencrypt - choice - prompt "Crypto provider" - default UENCRYPT_WOLFSSL +Package/uencrypt-mbedtls/description= \ + $(call Package/uencrypt/default/description,mbedTLS) + +define Package/uencrypt-openssl + $(Package/uencrypt/default) + VARIANT:=openssl + TITLE+= using OpenSSL + DEPENDS:=+libopenssl + CONFLICTS:=uencrypt-wolfssl +endef - config UENCRYPT_OPENSSL - bool "OpenSSL" +Package/uencrypt-openssl/description= \ + $(call Package/uencrypt/default/description,OpenSSL) - config UENCRYPT_WOLFSSL - bool "wolfSSL" - endchoice - endif +define Package/uencrypt-wolfssl + $(Package/uencrypt/default) + VARIANT:=wolfssl + TITLE+= using wolfSSL + DEPENDS:=+libwolfssl endef -define Package/uencrypt/install +Package/uencrypt-wolfssl/description= \ + $(call Package/uencrypt/default/description,wolfSSL) + +define Package/uencrypt/default/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/uencrypt $(1)/usr/bin endef +Package/uencrypt-openssl/install = $(Package/uencrypt/default/install) +Package/uencrypt-wolfssl/install = $(Package/uencrypt/default/install) +Package/uencrypt-mbedtls/install = $(Package/uencrypt/default/install) -$(eval $(call BuildPackage,uencrypt)) +$(eval $(call BuildPackage,uencrypt-mbedtls)) +$(eval $(call BuildPackage,uencrypt-openssl)) +$(eval $(call BuildPackage,uencrypt-wolfssl)) diff --git a/package/utils/uencrypt/src/CMakeLists.txt b/package/utils/uencrypt/src/CMakeLists.txt index cd25d2f12f..5e09954f0a 100644 --- a/package/utils/uencrypt/src/CMakeLists.txt +++ b/package/utils/uencrypt/src/CMakeLists.txt @@ -5,16 +5,28 @@ cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) project(uencrypt LANGUAGES C) option(USE_WOLFSSL "Use WolfSSL as crypto provider" OFF) -if (USE_WOLFSSL) - add_definitions(-DUSE_WOLFSSL) - find_library(WOLFSSL_LIBRARY wolfssl REQUIRED) - set(CRYPTO_LIBRARIES ${WOLFSSL_LIBRARY}) +option(USE_MBEDTLS "Use mbedTLS as crypto provider" OFF) +if (USE_MBEDTLS) + if (USE_WOLFSSL) + message(WARNING "USE_MBEDTLS and USE_WOLFSSL are both set. Building with USE_MBEDTLS.") + endif() + add_definitions(-DUSE_MBEDTLS) + find_library(MBEDCRYPTO_LIBRARY mbedcrypto REQUIRED) + set(CRYPTO_LIBRARIES ${MBEDCRYPTO_LIBRARY}) + set(CRYPTO_SOURCES ${PROJECT_NAME}-mbedtls.c) else() - find_package(OpenSSL REQUIRED) - set(CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY}) + set(CRYPTO_SOURCES ${PROJECT_NAME}-openssl.c) + if (USE_WOLFSSL) + add_definitions(-DUSE_WOLFSSL) + find_library(WOLFSSL_LIBRARY wolfssl REQUIRED) + set(CRYPTO_LIBRARIES ${WOLFSSL_LIBRARY}) + else() + find_package(OpenSSL REQUIRED) + set(CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY}) + endif() endif() +add_executable(${PROJECT_NAME} ${PROJECT_NAME}.c ${PROJECT_NAME}.h ${CRYPTO_SOURCES}) -add_executable(${PROJECT_NAME} ${PROJECT_NAME}.c) target_link_libraries(${PROJECT_NAME} ${CRYPTO_LIBRARIES}) install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) diff --git a/package/utils/uencrypt/src/uencrypt-mbedtls.c b/package/utils/uencrypt/src/uencrypt-mbedtls.c new file mode 100644 index 0000000000..34851261b7 --- /dev/null +++ b/package/utils/uencrypt/src/uencrypt-mbedtls.c @@ -0,0 +1,186 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later + * Copyright (C) 2023 Eneas Ulir de Queiroz + */ + +#include +#include +#include +#include +#include +#include "uencrypt.h" + +unsigned char *hexstr2buf(const char *str, long *len) +{ + unsigned char *buf; + long inlen = strlen(str); + + *len = 0; + if (inlen % 2) + return NULL; + + *len = inlen >> 1; + buf = malloc(*len); + for (long x = 0; x < *len; x++) + sscanf(str + x * 2, "%2hhx", buf + x); + return buf; +} + +const cipher_t *get_default_cipher(void) +{ + return mbedtls_cipher_info_from_type (MBEDTLS_CIPHER_AES_128_CBC); +} + +static char* upperstr(char *str) { + for (char *s = str; *s; s++) + *s = toupper((unsigned char) *s); + return str; +} + +const cipher_t *get_cipher_or_print_error(char *name) +{ + const mbedtls_cipher_info_t *cipher; + + cipher = mbedtls_cipher_info_from_string(upperstr(name)); + if (cipher) + return cipher; + + fprintf(stderr, "Error: invalid cipher: %s.\n", name); + fprintf(stderr, "Supported ciphers: \n"); + for (const int *list = mbedtls_cipher_list(); *list; list++) { + cipher = mbedtls_cipher_info_from_type(*list); + if (!cipher) + continue; + fprintf(stderr, "\t%s\n", cipher->name); + } + return NULL; +} + +int get_cipher_ivsize(const cipher_t *cipher) +{ + const mbedtls_cipher_info_t *c = cipher; + + return c->iv_size; +} + +int get_cipher_keysize(const cipher_t *cipher) +{ + const mbedtls_cipher_info_t *c = cipher; + + return c->key_bitlen >> 3; +} + +ctx_t *create_ctx(const cipher_t *cipher, const unsigned char *key, + const unsigned char *iv, int enc, int padding) +{ + mbedtls_cipher_context_t *ctx; + const mbedtls_cipher_info_t *cipher_info=cipher; + int ret; + + ctx = malloc(sizeof (mbedtls_cipher_context_t)); + if (!ctx) { + fprintf (stderr, "Error: create_ctx: out of memory.\n"); + return NULL; + } + + mbedtls_cipher_init(ctx); + ret = mbedtls_cipher_setup(ctx, cipher_info); + if (ret) { + fprintf(stderr, "Error: mbedtls_cipher_setup: %d\n", ret); + goto abort; + } + ret = mbedtls_cipher_setkey(ctx, key, + (int) mbedtls_cipher_get_key_bitlen(ctx), + enc ? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT); + if (ret) { + fprintf(stderr, "Error: mbedtls_cipher_setkey: %d\n", ret); + goto abort; + } + if (iv) { + ret = mbedtls_cipher_set_iv(ctx, iv, mbedtls_cipher_get_iv_size(ctx)); + if (ret) { + fprintf(stderr, "Error: mbedtls_cipher_set_iv: %d\n", ret); + goto abort; + } + } + + if (cipher_info->mode == MBEDTLS_MODE_CBC) { + ret = mbedtls_cipher_set_padding_mode(ctx, padding ? + MBEDTLS_PADDING_PKCS7 : + MBEDTLS_PADDING_NONE); + if (ret) { + fprintf(stderr, "Error: mbedtls_cipher_set_padding_mode: %d\n", + ret); + goto abort; + } + } else { + if (cipher_info->block_size > 1 && padding) { + fprintf(stderr, + "Error: mbedTLS only allows padding with CBC ciphers.\n"); + goto abort; + } + } + + ret = mbedtls_cipher_reset(ctx); + if (ret) { + fprintf(stderr, "Error: mbedtls_cipher_reset: %d\n", ret); + goto abort; + } + return ctx; + +abort: + free_ctx(ctx); + return NULL; +} + +int do_crypt(FILE *infile, FILE *outfile, ctx_t *ctx) +{ + unsigned char inbuf[CRYPT_BUF_SIZE]; + unsigned char outbuf[CRYPT_BUF_SIZE + MBEDTLS_MAX_BLOCK_LENGTH]; + size_t inlen, outlen, step; + int ret; + + if (mbedtls_cipher_get_cipher_mode(ctx) == MBEDTLS_MODE_ECB) { + step = mbedtls_cipher_get_block_size(ctx); + if (step > CRYPT_BUF_SIZE) { + step = CRYPT_BUF_SIZE; + } + } else { + step = CRYPT_BUF_SIZE; + } + + for (;;) { + inlen = fread(inbuf, 1, step, infile); + if (inlen <= 0) + break; + ret = mbedtls_cipher_update(ctx, inbuf, inlen, outbuf, &outlen); + if (ret) { + fprintf(stderr, "Error: mbedtls_cipher_update: %d\n", ret); + return ret; + } + ret = fwrite(outbuf, 1, outlen, outfile); + if (ret != outlen) { + fprintf(stderr, "Error: cipher_update short write.\n"); + return ret - outlen; + } + } + ret = mbedtls_cipher_finish(ctx, outbuf, &outlen); + if (ret) { + fprintf(stderr, "Error: mbedtls_cipher_finish: %d\n", ret); + return ret; + } + ret = fwrite(outbuf, 1, outlen, outfile); + if (ret != outlen) { + fprintf(stderr, "Error: cipher_finish short write.\n"); + return ret - outlen; + } + + return 0; +} + +void free_ctx(ctx_t *ctx) +{ + if (ctx) { + mbedtls_cipher_free(ctx); + free(ctx); + } +} diff --git a/package/utils/uencrypt/src/uencrypt-openssl.c b/package/utils/uencrypt/src/uencrypt-openssl.c new file mode 100644 index 0000000000..d9182be2ba --- /dev/null +++ b/package/utils/uencrypt/src/uencrypt-openssl.c @@ -0,0 +1,116 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later + * Copyright (C) 2022-2023 Eneas Ulir de Queiroz + */ + +#include +#include +#include +#include +#include "uencrypt.h" + +const cipher_t *get_default_cipher(void) +{ + return EVP_aes_128_cbc(); +} + +#ifndef USE_WOLFSSL +static void print_ciphers(const OBJ_NAME *name,void *arg) { + fprintf(arg, "\t%s\n", name->name); +} +#endif + +const cipher_t *get_cipher_or_print_error(char *name) +{ + const EVP_CIPHER *cipher; + + if ((cipher = EVP_get_cipherbyname(name))) + return cipher; + + fprintf(stderr, "Error: invalid cipher: %s.\n", name); +#ifndef USE_WOLFSSL + fprintf(stderr, "Supported ciphers: \n"); + OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, print_ciphers, stderr); +#endif + return NULL; +} + +int get_cipher_ivsize(const cipher_t *cipher) +{ + return EVP_CIPHER_iv_length(cipher); +} + +int get_cipher_keysize(const cipher_t *cipher) +{ + return EVP_CIPHER_key_length(cipher); +} + +ctx_t *create_ctx(const cipher_t *cipher, const unsigned char *key, + const unsigned char *iv, int enc, int padding) +{ + EVP_CIPHER_CTX *ctx; + int ret; + + ctx = EVP_CIPHER_CTX_new(); + if (!ctx) { + fprintf (stderr, "Error: create_ctx: out of memory.\n"); + return NULL; + } + ret = EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, enc); + if (!ret) { + fprintf(stderr, "Error:EVP_CipherInit_ex: %d\n", ret); + goto abort; + } + ret = EVP_CIPHER_CTX_set_padding(ctx, padding); + if (!ret) { + fprintf(stderr, "Error:EVP_CIPHER_CTX_set_padding: %d\n", ret); + goto abort; + } + + return ctx; + +abort: + free_ctx(ctx); + return NULL; +} + + +int do_crypt(FILE *infile, FILE *outfile, ctx_t *ctx) +{ + unsigned char inbuf[CRYPT_BUF_SIZE]; + unsigned char outbuf[CRYPT_BUF_SIZE + EVP_MAX_BLOCK_LENGTH]; + int inlen, outlen; + int ret; + + for (;;) { + inlen = fread(inbuf, 1, CRYPT_BUF_SIZE, infile); + if (inlen <= 0) + break; + ret = EVP_CipherUpdate(ctx, outbuf, &outlen, inbuf, inlen); + if (!ret) { + fprintf(stderr, "Error: EVP_CipherUpdate: %d\n", ret); + return ret; + } + ret = fwrite(outbuf, 1, outlen, outfile); + if (ret != outlen) { + fprintf(stderr, "Error: CipherUpdate short write.\n"); + return ret - outlen; + } + } + ret = EVP_CipherFinal_ex(ctx, outbuf, &outlen); + if (!ret) { + fprintf(stderr, "Error: EVP_CipherFinal: %d\n", ret); + return ret; + } + ret = fwrite(outbuf, 1, outlen, outfile); + if (ret != outlen) { + fprintf(stderr, "Error: CipherFinal short write.\n"); + return ret - outlen; + } + + return 0; +} + +void free_ctx(ctx_t *ctx) +{ + EVP_CIPHER_CTX_free(ctx); +} diff --git a/package/utils/uencrypt/src/uencrypt.c b/package/utils/uencrypt/src/uencrypt.c index c4199b057a..36e17e220b 100644 --- a/package/utils/uencrypt/src/uencrypt.c +++ b/package/utils/uencrypt/src/uencrypt.c @@ -1,49 +1,14 @@ /* SPDX-License-Identifier: GPL-2.0-or-later - * Copyright (C) 2022 Eneas Ulir de Queiroz + * Copyright (C) 2023 Eneas Ulir de Queiroz */ #include #include #include +#include #include -#ifdef USE_WOLFSSL -# include -# include -#else -# include -#endif - -int do_crypt(FILE *infile, FILE *outfile, const char *key, const char *iv, - int enc, int padding) -{ - EVP_CIPHER_CTX *ctx; - unsigned char inbuf[1024], outbuf[1024 + EVP_MAX_BLOCK_LENGTH]; - int inlen, outlen; - - ctx = EVP_CIPHER_CTX_new(); - EVP_CipherInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv, enc); - EVP_CIPHER_CTX_set_padding(ctx, padding); - - for (;;) { - inlen = fread(inbuf, 1, 1024, infile); - if (inlen <= 0) - break; - if (!EVP_CipherUpdate(ctx, outbuf, &outlen, inbuf, inlen)) { - EVP_CIPHER_CTX_free(ctx); - return -1; - } - fwrite(outbuf, 1, outlen, outfile); - } - if (!EVP_CipherFinal_ex(ctx, outbuf, &outlen)) { - EVP_CIPHER_CTX_free(ctx); - return -1; - } - fwrite(outbuf, 1, outlen, outfile); - - EVP_CIPHER_CTX_free(ctx); - return 0; -} +#include "uencrypt.h" static void check_enc_dec(const int enc) { @@ -55,22 +20,36 @@ static void check_enc_dec(const int enc) static void show_usage(const char* name) { - fprintf(stderr, "Usage: %s: [-d | -e] [-n] -k key -i iv\n" + fprintf(stderr, "Usage: %s: [-d | -e] [-n] -k key [-i iv] [-c cipher]\n" "-d = decrypt; -e = encrypt; -n = no padding\n", name); } +static void uencrypt_clear_free(void *ptr, size_t len) +{ + if (ptr) { + memset(ptr, 0, len); + free(ptr); + } +} + int main(int argc, char *argv[]) { int enc = -1; unsigned char *iv = NULL; unsigned char *key = NULL; - long len; + long keylen = 0, ivlen = 0; int opt; int padding = 1; - int ret; + const cipher_t *cipher = get_default_cipher(); + ctx_t* ctx; + int ret = EXIT_FAILURE; - while ((opt = getopt(argc, argv, "dei:k:n")) != -1) { + while ((opt = getopt(argc, argv, "c:dei:k:n")) != -1) { switch (opt) { + case 'c': + if (!(cipher = get_cipher_or_print_error(optarg))) + exit(EXIT_FAILURE); + break; case 'd': check_enc_dec(enc); enc = 0; @@ -80,20 +59,22 @@ int main(int argc, char *argv[]) enc = 1; break; case 'i': - iv = OPENSSL_hexstr2buf((const char *)optarg, &len); - if (iv == NULL || len != 16) { - fprintf(stderr, "Error setting IV to %s. The IV should be 16 bytes, encoded in hex.\n", + iv = hexstr2buf(optarg, &ivlen); + if (iv == NULL) { + fprintf(stderr, "Error setting IV to %s. The IV should be encoded in hex.\n", optarg); exit(EINVAL); } + memset(optarg, '*', strlen(optarg)); break; case 'k': - key = OPENSSL_hexstr2buf((const char *)optarg, &len); - if (key == NULL || len != 16) { - fprintf(stderr, "Error setting key to %s. The key should be 16 bytes, encoded in hex.\n", + key = hexstr2buf(optarg, &keylen); + if (key == NULL) { + fprintf(stderr, "Error setting key to %s. The key should be encoded in hex.\n", optarg); exit(EINVAL); } + memset(optarg, '*', strlen(optarg)); break; case 'n': padding = 0; @@ -103,15 +84,22 @@ int main(int argc, char *argv[]) exit(EINVAL); } } - if (iv == NULL || key == NULL) { - fprintf(stderr, "Error: %s not set.\n", key ? "iv" : (iv ? "key" : "key and iv")); - show_usage(argv[0]); + if (ivlen != get_cipher_ivsize(cipher)) { + fprintf(stderr, "Error: IV must be %d bytes; given IV is %zd bytes.\n", + get_cipher_ivsize(cipher), ivlen); + exit(EXIT_FAILURE); + } + if (keylen != get_cipher_keysize(cipher)) { + fprintf(stderr, "Error: key must be %d bytes; given key is %zd bytes.\n", + get_cipher_keysize(cipher), keylen); exit(EXIT_FAILURE); } - ret = do_crypt(stdin, stdout, key, iv, !!enc, padding); - if (ret) - fprintf(stderr, "Error during crypt operation.\n"); - OPENSSL_free(iv); - OPENSSL_free(key); + ctx = create_ctx(cipher, key, iv, !!enc, padding); + if (ctx) { + ret = do_crypt(stdin, stdout, ctx); + free_ctx(ctx); + } + uencrypt_clear_free(iv, ivlen); + uencrypt_clear_free(key, keylen); return ret; } diff --git a/package/utils/uencrypt/src/uencrypt.h b/package/utils/uencrypt/src/uencrypt.h new file mode 100644 index 0000000000..a4fe1f3376 --- /dev/null +++ b/package/utils/uencrypt/src/uencrypt.h @@ -0,0 +1,49 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later + * Copyright (C) 2022-2023 Eneas Ulir de Queiroz + */ + +#include + +#define CRYPT_BUF_SIZE 1024 + +#ifdef USE_MBEDTLS +# include + +# if defined(MBEDTLS_MAX_BLOCK_LENGTH) \ + && MBEDTLS_MAX_BLOCK_LENGTH > CRYPT_BUF_SIZE +# undef CRYPT_BUF_SIZE +# define CRYPT_BUF_SIZE MAX_BLOCK_LENGTH +# endif + +unsigned char *hexstr2buf(const char* str, long *len); + +#else /* USE_MBEDTLS */ +# ifdef USE_WOLFSSL +# include +# include +# else +# include +# endif + +# if defined(EVP_MAX_BLOCK_LENGTH) \ + && EVP_MAX_BLOCK_LENGTH > CRYPT_BUF_SIZE +# undef CRYPT_BUF_SIZE +# define CRYPT_BUF_SIZE EVP_MAX_BLOCK_LENGTH +# endif + +# define hexstr2buf OPENSSL_hexstr2buf + +#endif /* USE_MBEDTLS */ + +typedef void cipher_t; +typedef void ctx_t; + +const cipher_t *get_default_cipher(void); +const cipher_t *get_cipher_or_print_error(char *name); +int get_cipher_ivsize(const cipher_t *cipher); +int get_cipher_keysize(const cipher_t *cipher); + +ctx_t *create_ctx(const cipher_t *cipher, const unsigned char *key, + const unsigned char *iv, int enc, int padding); +int do_crypt(FILE *infile, FILE *outfile, ctx_t *ctx); +void free_ctx(ctx_t *ctx); diff --git a/package/utils/ugps/Makefile b/package/utils/ugps/Makefile index 79ea5575d3..265d9cd352 100644 --- a/package/utils/ugps/Makefile +++ b/package/utils/ugps/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ugps -PKG_RELEASE:=$(AUTORELEASE) +PKG_RELEASE:=2 PKG_SOURCE_URL=$(PROJECT_GIT)/ugps.git PKG_SOURCE_PROTO:=git diff --git a/package/utils/util-linux/Makefile b/package/utils/util-linux/Makefile index 446ad716a6..90724eb3f6 100644 --- a/package/utils/util-linux/Makefile +++ b/package/utils/util-linux/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=util-linux -PKG_VERSION:=2.37.4 -PKG_RELEASE:=$(AUTORELEASE) +PKG_VERSION:=2.39 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=@KERNEL/linux/utils/$(PKG_NAME)/v2.37 -PKG_HASH:=634e6916ad913366c3536b6468e7844769549b99a7b2bf80314de78ab5655b83 +PKG_SOURCE_URL:=@KERNEL/linux/utils/$(PKG_NAME)/v2.39 +PKG_HASH:=32b30a336cda903182ed61feb3e9b908b762a5e66fe14e43efb88d37162075cb PKG_CPE_ID:=cpe:/a:kernel:util-linux PKG_LICENSE:=GPL-2.0-only @@ -25,14 +25,10 @@ PKG_LICENSE_FILES:= COPYING \ libuuid/COPYING \ Documentation/licenses/COPYING.BSD-3 -PKG_BUILD_PARALLEL:=1 - -PKG_FIXUP:=autoreconf PKG_INSTALL:=1 -DISABLE_NLS:=--disable-nls - include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/meson.mk define Package/util-linux/Default SECTION:=utils @@ -178,6 +174,17 @@ define Package/cfdisk/description cfdisk is a curses-based program for partitioning any hard disk drive endef +define Package/colrm +$(call Package/util-linux/Default) + TITLE:=colrm removes selected columns from a file + DEPENDS:= +endef + +define Package/colrm/description + colrm removes selected columns from a file. Input is taken from + standard input. Output is sent to standard output. +endef + define Package/dmesg $(call Package/util-linux/Default) TITLE:=print or control the kernel ring buffer @@ -419,6 +426,17 @@ define Package/rename/description expression in their name by replacement endef +define Package/rev +$(call Package/util-linux/Default) + TITLE:=Reverse lines characterwise +endef + +define Package/rev/description + rev utility copies the specified files to the standard output, reversing the + order of characters in every line. If no files are specified, the standard + input is read. +endef + define Package/partx-utils $(call Package/util-linux/Default) TITLE:=inform kernel about the presence and numbering of on-disk partitions @@ -478,6 +496,7 @@ endef define Package/taskset $(call Package/util-linux/Default) TITLE:=set or retrieve a process's CPU affinity + ALTERNATIVES:=200:/usr/bin/taskset:/usr/bin/util-linux-taskset endef define Package/taskset/description @@ -552,44 +571,69 @@ define Package/wipefs/description libblkid. endef -CONFIGURE_ARGS += \ - --disable-use-tty-group \ - --disable-rpath \ - --disable-tls \ - --disable-su \ - --disable-sulogin \ - --disable-makeinstall-chown \ - --disable-login \ - --disable-nologin \ - --disable-lslogins \ - --disable-runuser \ - --disable-chfn-chsh \ - --disable-raw \ - --without-python \ - --without-udev \ - --without-readline \ - --without-libmagic \ - --with-ncursesw - -TARGET_CFLAGS += $(FPIC) -std=gnu99 +MESON_ARGS += \ + -Dsystemd=disabled \ + -Dtinfo=disabled \ + -Dcryptsetup=disabled \ + -Dlibutil=disabled \ + -Dlibutempter=disabled \ + -Dlibpcre2-posix=disabled \ + -Dlibuser=disabled \ + -Duse-tty-group=false \ + -Duse-tls=false \ + -Dbuild-python=disabled \ + -Dbuild-zramctl=disabled \ + -Dbuild-fsck=disabled \ + -Dbuild-wipefs=disabled \ + -Dbuild-fallocate=disabled \ + -Dbuild-setpriv=disabled \ + -Dbuild-hardlink=disabled \ + -Dbuild-cramfs=disabled \ + -Dbuild-bfs=disabled \ + -Dbuild-minix=disabled \ + -Dbuild-fdformat=disabled \ + -Dbuild-lslogins=disabled \ + -Dbuild-wdctl=disabled \ + -Dbuild-cal=disabled \ + -Dbuild-switch_root=disabled \ + -Dbuild-pivot_root=disabled \ + -Dbuild-lsmem=disabled \ + -Dbuild-lsirq=disabled \ + -Dbuild-irqtop=disabled \ + -Dbuild-chmem=disabled \ + -Dbuild-ipcrm=disabled \ + -Dbuild-rfkill=disabled \ + -Dbuild-tunelp=disabled \ + -Dbuild-kill=disabled \ + -Dbuild-last=disabled \ + -Dbuild-utmpdump=disabled \ + -Dbuild-line=disabled \ + -Dbuild-mesg=disabled \ + -Dbuild-raw=disabled \ + -Dbuild-vipw=disabled \ + -Dbuild-newgrp=disabled \ + -Dbuild-chfn-chsh=disabled \ + -Dbuild-login=disabled \ + -Dbuild-nologin=disabled \ + -Dbuild-sulogin=disabled \ + -Dbuild-su=disabled \ + -Dbuild-runuser=disabled \ + -Dbuild-ul=disabled \ + -Dbuild-pg=disabled \ + -Dbuild-write=disabled \ + -Dbuild-bash-completion=disabled \ + -Dbuild-pylibmount=disabled \ + -Dreadline=disabled \ + -Dmagic=disabled \ + -Dncursesw=enabled define Build/InstallDev $(INSTALL_DIR) $(1)/usr/lib/pkgconfig $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/blkid.pc $(1)/usr/lib/pkgconfig - $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/blkid.pc - $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/blkid.pc $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/fdisk.pc $(1)/usr/lib/pkgconfig - $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/fdisk.pc - $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/fdisk.pc $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/mount.pc $(1)/usr/lib/pkgconfig - $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/mount.pc - $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/mount.pc $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/smartcols.pc $(1)/usr/lib/pkgconfig - $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/smartcols.pc - $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/smartcols.pc $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/uuid.pc $(1)/usr/lib/pkgconfig - $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/uuid.pc - $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/uuid.pc $(INSTALL_DIR) $(1)/usr/include/blkid $(CP) $(PKG_INSTALL_DIR)/usr/include/blkid/blkid.h $(1)/usr/include/blkid @@ -603,43 +647,37 @@ define Build/InstallDev $(CP) $(PKG_INSTALL_DIR)/usr/include/libsmartcols/libsmartcols.h $(1)/usr/include/libsmartcols $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/lib/libblkid.so* $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/lib/libfdisk.so* $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/lib/libmount.so* $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/lib/libuuid.so* $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/lib/libsmartcols.so* $(1)/usr/lib - - $(LN) libblkid.so.1 $(1)/usr/lib/libblkid.so - $(LN) libfdisk.so.1 $(1)/usr/lib/libfdisk.so - $(LN) libmount.so.1 $(1)/usr/lib/libmount.so - $(LN) libuuid.so.1 $(1)/usr/lib/libuuid.so - $(LN) libsmartcols.so.1 $(1)/usr/lib/libsmartcols.so + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libblkid.so* $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfdisk.so* $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmount.so* $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libuuid.so* $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsmartcols.so* $(1)/usr/lib endef define Package/libfdisk/install $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/lib/libfdisk.so.* $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfdisk.so.* $(1)/usr/lib/ endef define Package/libblkid/install $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/lib/libblkid.so.* $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libblkid.so.* $(1)/usr/lib/ endef define Package/libmount/install $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/lib/libmount.so.* $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmount.so.* $(1)/usr/lib/ endef define Package/libsmartcols/install $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/lib/libsmartcols.so.* $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsmartcols.so.* $(1)/usr/lib/ endef define Package/libuuid/install $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/lib/libuuid.so.* $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libuuid.so.* $(1)/usr/lib/ endef define Package/agetty/install @@ -672,6 +710,11 @@ define Package/cfdisk/install $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/cfdisk $(1)/usr/sbin/ endef +define Package/colrm/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/colrm $(1)/usr/bin/ +endef + define Package/dmesg/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dmesg $(1)/usr/bin/ @@ -789,6 +832,11 @@ define Package/rename/install $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/rename $(1)/usr/bin/ endef +define Package/rev/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/rev $(1)/usr/bin/ +endef + define Package/partx-utils/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/partx $(1)/usr/sbin/ @@ -820,7 +868,7 @@ endef define Package/taskset/install $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/taskset $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/taskset $(1)/usr/bin/util-linux-taskset endef define Package/unshare/install @@ -866,6 +914,7 @@ $(eval $(call BuildPackage,blkid)) $(eval $(call BuildPackage,blockdev)) $(eval $(call BuildPackage,cal)) $(eval $(call BuildPackage,cfdisk)) +$(eval $(call BuildPackage,colrm)) $(eval $(call BuildPackage,dmesg)) $(eval $(call BuildPackage,eject)) $(eval $(call BuildPackage,fdisk)) @@ -889,6 +938,7 @@ $(eval $(call BuildPackage,namei)) $(eval $(call BuildPackage,nsenter)) $(eval $(call BuildPackage,prlimit)) $(eval $(call BuildPackage,rename)) +$(eval $(call BuildPackage,rev)) $(eval $(call BuildPackage,partx-utils)) $(eval $(call BuildPackage,script-utils)) $(eval $(call BuildPackage,setterm)) diff --git a/package/utils/util-linux/patches/0001-test_enosys-add-support-for-mips.patch b/package/utils/util-linux/patches/0001-test_enosys-add-support-for-mips.patch new file mode 100644 index 0000000000..f8c8f851ec --- /dev/null +++ b/package/utils/util-linux/patches/0001-test_enosys-add-support-for-mips.patch @@ -0,0 +1,36 @@ +From 2558932c65524d953e4c86d7fda2282a582aa5ec Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= +Date: Wed, 17 May 2023 16:50:47 +0200 +Subject: [PATCH] test_enosys: add support for mips, powerpc and arc +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Thomas Weißschuh +--- + tests/helpers/test_enosys.c | 14 ++ + 1 file changed, 2 insertions(+) + +--- a/tests/helpers/test_enosys.c ++++ b/tests/helpers/test_enosys.c +@@ -53,6 +53,20 @@ + # else + # define SECCOMP_ARCH_NATIVE AUDIT_ARCH_PPC64LE + # endif ++#elif __powerpc__ ++# define SECCOMP_ARCH_NATIVE AUDIT_ARCH_PPC ++#elif __mips__ ++# if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ++# define SECCOMP_ARCH_NATIVE AUDIT_ARCH_MIPS ++# else ++# define SECCOMP_ARCH_NATIVE AUDIT_ARCH_MIPSEL ++# endif ++#elif __arc__ ++# if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ++# define SECCOMP_ARCH_NATIVE AUDIT_ARCH_ARCV2BE ++# else ++# define SECCOMP_ARCH_NATIVE AUDIT_ARCH_ARCV2 ++# endif + #else + # error Unknown target architecture + #endif diff --git a/package/utils/util-linux/patches/100-use_urandom.patch b/package/utils/util-linux/patches/100-use_urandom.patch deleted file mode 100644 index 5817209885..0000000000 --- a/package/utils/util-linux/patches/100-use_urandom.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/lib/randutils.c -+++ b/lib/randutils.c -@@ -26,6 +26,11 @@ - #define THREAD_LOCAL static - #endif - -+/* force /dev/urandom to avoid hanging on early boot */ -+#undef HAVE_GETRANDOM -+#undef SYS_getrandom -+#undef __NR_getrandom -+ - #ifdef HAVE_GETRANDOM - # include - #elif defined (__linux__) diff --git a/package/utils/util-linux/patches/200-meson-no-po.patch b/package/utils/util-linux/patches/200-meson-no-po.patch new file mode 100644 index 0000000000..4d94f6b89a --- /dev/null +++ b/package/utils/util-linux/patches/200-meson-no-po.patch @@ -0,0 +1,10 @@ +--- a/meson.build ++++ b/meson.build +@@ -874,7 +874,6 @@ subdir('disk-utils') + subdir('misc-utils') + subdir('text-utils') + subdir('term-utils') +-subdir('po') + + includes = [dir_include, + dir_libblkid, diff --git a/package/utils/xz/Makefile b/package/utils/xz/Makefile index e8d01626e1..8d83b154e7 100644 --- a/package/utils/xz/Makefile +++ b/package/utils/xz/Makefile @@ -9,12 +9,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=xz -PKG_VERSION:=5.2.9 +PKG_VERSION:=5.4.4 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=@SF/lzmautils -PKG_HASH:=b194507fba3a462a753c553149ccdaa168337bcb7deefddd067ba987c83dfce6 +PKG_HASH:=0b6fcde1ac38e90433a2556f500c065950b9bcd2d602006efc334782bdfe6296 PKG_MAINTAINER:= PKG_LICENSE:=Public-Domain LGPL-2.1-or-later GPL-2.0-or-later GPL-3.0-or-later @@ -23,6 +23,7 @@ PKG_CPE_ID:=cpe:/a:tukaani:xz PKG_BUILD_PARALLEL:=1 PKG_INSTALL:=1 +PKG_BUILD_FLAGS:=lto include $(INCLUDE_DIR)/package.mk @@ -71,7 +72,7 @@ define BuildSubPackage $$(eval $$(call BuildPackage,$(1))) endef -TARGET_LDFLAGS += -Wl,--gc-sections -flto +TARGET_LDFLAGS += -Wl,--gc-sections CONFIGURE_ARGS += \ --enable-small \ diff --git a/package/utils/yafut/Makefile b/package/utils/yafut/Makefile new file mode 100644 index 0000000000..ef16404c33 --- /dev/null +++ b/package/utils/yafut/Makefile @@ -0,0 +1,36 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=yafut +PKG_RELEASE:=1 + +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL=https://github.com/kempniu/yafut.git +PKG_MIRROR_HASH:=6eece622d1df99ffee1a18d162d36292f32bf2d5e514663a6b61fd82c2ecbcba +PKG_SOURCE_DATE:=2023-03-31 +PKG_SOURCE_VERSION:=16435e89d449f953712983315e1a89cdb678620d + +PKG_LICENSE:=GPL-2.0 +PKG_LICENSE_FILES:=LICENSE + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +CMAKE_INSTALL:=1 + +define Package/yafut + SECTION:=utils + CATEGORY:=Utilities + TITLE:=Yet Another File UTility + DEPENDS:=@NAND_SUPPORT +endef + +define Package/yafut/description + A program for copying files from/to Yaffs file systems from userspace. +endef + +define Package/yafut/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/yafut $(1)/usr/bin +endef + +$(eval $(call BuildPackage,yafut)) diff --git a/package/utils/zstd/Makefile b/package/utils/zstd/Makefile new file mode 100644 index 0000000000..359bd7ab9a --- /dev/null +++ b/package/utils/zstd/Makefile @@ -0,0 +1,98 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=zstd +PKG_VERSION:=1.5.2 +PKG_RELEASE:=2 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/facebook/zstd/releases/download/v$(PKG_VERSION) +PKG_HASH:=7c42d56fac126929a6a85dbc73ff1db2411d04f104fae9bdea51305663a83fd0 + +PKG_MAINTAINER:= +PKG_LICENSE:=GPL-2.0-or-later +PKG_LICENSE_FILES:=COPYING + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/meson.mk + +MESON_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/build/meson/openwrt-build + +define Package/zstd/Default + SUBMENU:=Compression + URL:=https://github.com/facebook/zstd +endef + +define Package/libzstd +$(call Package/zstd/Default) + SECTION:=libs + CATEGORY:=Libraries + TITLE:=zstd library. + MENU:=1 +endef + +define Package/libzstd/description + Zstandard - Fast real-time compression algorithm. + This package provides libzstd library. +endef + +define Package/libzstd/config + config ZSTD_OPTIMIZE_O3 + bool "Use all optimizations (-O3)" + depends on PACKAGE_libzstd + default y + help + This enables additional optmizations using the -O3 compilation flag. +endef + +define Package/zstd +$(call Package/zstd/Default) + SECTION:=utils + CATEGORY:=Utilities + DEPENDS:=+libzstd + TITLE:=Fast real-time compression algorithm. +endef + +define Package/zstd/description + Zstandard - Fast real-time compression algorithm. + This package provides the zstd binaries. +endef + +ifeq ($(CONFIG_ZSTD_OPTIMIZE_O3),y) +TARGET_CFLAGS:= $(filter-out -O%,$(TARGET_CFLAGS)) -O3 +endif + +MESON_ARGS += \ + -Dlegacy_level=7 \ + -Ddebug_level=0 \ + -Dbacktrace=false \ + -Dstatic_runtime=false \ + -Dbin_programs=true \ + -Dbin_tests=false \ + -Dbin_contrib=false \ + -Dmulti_thread=enabled \ + -Dzlib=disabled \ + -Dlzma=disabled \ + -Dlz4=disabled \ + -Db_lto=true + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libzstd.so* $(1)/usr/lib + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libzstd.pc $(1)/usr/lib/pkgconfig +endef + +define Package/libzstd/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libzstd.so* $(1)/usr/lib +endef + +define Package/zstd/install + $(INSTALL_DIR) $(1)/usr/bin + $(CP) $(PKG_INSTALL_DIR)/usr/bin/{unzstd,zstd,zstdcat,zstdgrep,zstdless,zstdmt} $(1)/usr/bin +endef + +$(eval $(call BuildPackage,libzstd)) +$(eval $(call BuildPackage,zstd)) diff --git a/rules.mk b/rules.mk index 4a2a5e0ac3..5f127a92e3 100644 --- a/rules.mk +++ b/rules.mk @@ -109,7 +109,7 @@ $(foreach t,$(DEFAULT_SUBDIR_TARGETS) $(1), ) endef -DL_DIR:=$(if $(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(TOPDIR)/dl) +DL_DIR=$(if $(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(TOPDIR)/dl)$(if $(DL_SUBDIR),/$(DL_SUBDIR)) OUTPUT_DIR:=$(if $(call qstrip,$(CONFIG_BINARY_FOLDER)),$(call qstrip,$(CONFIG_BINARY_FOLDER)),$(TOPDIR)/bin) BIN_DIR:=$(OUTPUT_DIR)/targets/$(BOARD)/$(SUBTARGET) INCLUDE_DIR:=$(TOPDIR)/include @@ -156,8 +156,8 @@ BUILD_LOG_DIR:=$(if $(call qstrip,$(CONFIG_BUILD_LOG_DIR)),$(call qstrip,$(CONFI PKG_INFO_DIR := $(STAGING_DIR)/pkginfo BUILD_DIR_HOST:=$(if $(IS_PACKAGE_BUILD),$(BUILD_DIR_BASE)/hostpkg,$(BUILD_DIR_BASE)/host) -STAGING_DIR_HOST:=$(TOPDIR)/staging_dir/host -STAGING_DIR_HOSTPKG:=$(TOPDIR)/staging_dir/hostpkg +STAGING_DIR_HOST:=$(abspath $(STAGING_DIR)/../host) +STAGING_DIR_HOSTPKG:=$(abspath $(STAGING_DIR)/../hostpkg) TARGET_PATH:=$(subst $(space),:,$(filter-out .,$(filter-out ./,$(subst :,$(space),$(PATH))))) TARGET_INIT_PATH:=$(call qstrip,$(CONFIG_TARGET_INIT_PATH)) @@ -184,7 +184,7 @@ ifndef DUMP -include $(TOOLCHAIN_DIR)/info.mk export GCC_HONOUR_COPTS:=0 TARGET_CROSS:=$(if $(TARGET_CROSS),$(TARGET_CROSS),$(OPTIMIZE_FOR_CPU)-librecmc-linux$(if $(TARGET_SUFFIX),-$(TARGET_SUFFIX))-) - TARGET_CFLAGS+= -fhonour-copts -Wno-error=unused-but-set-variable -Wno-error=unused-result + TARGET_CFLAGS+= -fhonour-copts TARGET_CPPFLAGS+= -I$(TOOLCHAIN_DIR)/usr/include ifeq ($(CONFIG_USE_MUSL),y) TARGET_CPPFLAGS+= -I$(TOOLCHAIN_DIR)/include/fortify @@ -227,6 +227,7 @@ else endif endif +export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH)) export PATH:=$(TARGET_PATH) export STAGING_DIR STAGING_DIR_HOST STAGING_DIR_HOSTPKG export SH_FUNC:=. $(INCLUDE_DIR)/shell.sh; @@ -252,14 +253,12 @@ TARGET_NM:=$(TARGET_CROSS)gcc-nm TARGET_CC:=$(TARGET_CROSS)gcc TARGET_CXX:=$(TARGET_CROSS)g++ KPATCH:=$(SCRIPT_DIR)/patch-kernel.sh +FILECMD:=$(STAGING_DIR_HOST)/bin/file SED:=$(STAGING_DIR_HOST)/bin/sed -i -e ESED:=$(STAGING_DIR_HOST)/bin/sed -E -i -e MKHASH:=$(STAGING_DIR_HOST)/bin/mkhash # MKHASH is used in /scripts, so we export it here. export MKHASH -# DOWNLOAD_CHECK_CERTIFICATE is used in /scripts, so we export it here. -DOWNLOAD_CHECK_CERTIFICATE:=$(CONFIG_DOWNLOAD_CHECK_CERTIFICATE) -export DOWNLOAD_CHECK_CERTIFICATE CP:=cp -fpR LN:=ln -sf XARGS:=xargs -r @@ -270,6 +269,14 @@ FIND:=find PATCH:=patch PYTHON:=python3 +ifeq ($(HOST_OS),Darwin) + TRUE:=/usr/bin/env gtrue + FALSE:=/usr/bin/env gfalse +else + TRUE:=/usr/bin/env true + FALSE:=/usr/bin/env false +endif + INSTALL_BIN:=install -m0755 INSTALL_SUID:=install -m4755 INSTALL_DIR:=install -d -m0755 @@ -286,8 +293,8 @@ export HOSTCC_NOCACHE export HOSTCXX_NOCACHE ifneq ($(CONFIG_CCACHE),) - TARGET_CC:= ccache_cc - TARGET_CXX:= ccache_cxx + TARGET_CC:= ccache $(TARGET_CC) + TARGET_CXX:= ccache $(TARGET_CXX) HOSTCC:= ccache $(HOSTCC) HOSTCXX:= ccache $(HOSTCXX) export CCACHE_BASEDIR:=$(TOPDIR) @@ -352,6 +359,7 @@ ifeq ($(CONFIG_BUILD_LOG),y) endif export BISON_PKGDATADIR:=$(STAGING_DIR_HOST)/share/bison +export HOST_GNULIB_SRCDIR:=$(STAGING_DIR_HOST)/share/gnulib export M4:=$(STAGING_DIR_HOST)/bin/m4 define shvar @@ -412,7 +420,7 @@ $(shell \ if git log -1 >/dev/null 2>/dev/null; then \ if [ -n "$(1)" ]; then \ last_bump="$$(git log --pretty=format:'%h %s' . | \ - grep --max-count=1 -e ': [uU]pdate to ' -e ': [bB]ump to ' | \ + grep -m 1 -e ': [uU]pdate to ' -e ': [bB]ump to ' | \ cut -f 1 -d ' ')"; \ fi; \ if [ -n "$$last_bump" ]; then \ diff --git a/scripts/cfe-partition-tag.py b/scripts/cfe-partition-tag.py index a2605d5205..41495a9af0 100755 --- a/scripts/cfe-partition-tag.py +++ b/scripts/cfe-partition-tag.py @@ -17,175 +17,123 @@ CFE Partition Tag import argparse import os import struct +import binascii + PART_NAME_SIZE = 33 PART_VERSION_SIZE = 21 -CRC32_INIT = 0xFFFFFFFF -CRC32_TABLE = [ - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D -] def auto_int(x): - return int(x, 0) + return int(x, 0) -def crc32(bytes, size, crc): - i = 0 - while (i < size): - crc = (crc >> 8) ^ CRC32_TABLE[(crc ^ bytes[i]) & 0xff] - i += 1 - return crc def str_to_bytes_pad(string, size): - str_bytes = string.encode() - num_bytes = len(str_bytes) - if (num_bytes >= size): - str_bytes = str_bytes[:size - 1] + '\0'.encode() - else: - str_bytes += '\0'.encode() * (size - num_bytes) - return str_bytes + str_bytes = string.encode() + num_bytes = len(str_bytes) + if num_bytes >= size: + str_bytes = str_bytes[: size - 1] + "\0".encode() + else: + str_bytes += "\0".encode() * (size - num_bytes) + return str_bytes + def create_tag(args, in_bytes, size): - crc = crc32(in_bytes, size, CRC32_INIT) + # JAM CRC32 is bitwise not and unsigned + crc = ~binascii.crc32(in_bytes) & 0xFFFFFFFF + + tag = bytearray() + tag += struct.pack(">I", args.part_id) + tag += struct.pack(">I", size) + tag += struct.pack(">H", args.part_flags) + tag += str_to_bytes_pad(args.part_name, PART_NAME_SIZE) + tag += str_to_bytes_pad(args.part_version, PART_VERSION_SIZE) + tag += struct.pack(">I", crc) - tag = bytearray() - tag += struct.pack('>I', args.part_id) - tag += struct.pack('>I', size) - tag += struct.pack('>H', args.part_flags) - tag += str_to_bytes_pad(args.part_name, PART_NAME_SIZE) - tag += str_to_bytes_pad(args.part_version, PART_VERSION_SIZE) - tag += struct.pack('>I', crc) + return tag - return tag def create_output(args): - in_st = os.stat(args.input_file) - in_size = in_st.st_size + in_st = os.stat(args.input_file) + in_size = in_st.st_size - in_f = open(args.input_file, 'r+b') - in_bytes = in_f.read(in_size) - in_f.close() + in_f = open(args.input_file, "r+b") + in_bytes = in_f.read(in_size) + in_f.close() - tag = create_tag(args, in_bytes, in_size) + tag = create_tag(args, in_bytes, in_size) + + out_f = open(args.output_file, "w+b") + out_f.write(tag) + out_f.close() - out_f = open(args.output_file, 'w+b') - out_f.write(tag) - out_f.close() def main(): - global args - - parser = argparse.ArgumentParser(description='') - - parser.add_argument('--flags', - dest='part_flags', - action='store', - type=auto_int, - help='Partition Flags') - - parser.add_argument('--id', - dest='part_id', - action='store', - type=auto_int, - help='Partition ID') - - parser.add_argument('--input-file', - dest='input_file', - action='store', - type=str, - help='Input file') - - parser.add_argument('--output-file', - dest='output_file', - action='store', - type=str, - help='Output file') - - parser.add_argument('--name', - dest='part_name', - action='store', - type=str, - help='Partition Name') - - parser.add_argument('--version', - dest='part_version', - action='store', - type=str, - help='Partition Version') - - args = parser.parse_args() - - if ((not args.part_flags) or - (not args.part_id) or - (not args.input_file) or - (not args.output_file) or - (not args.part_name) or - (not args.part_version)): - parser.print_help() - else: - create_output(args) + global args + + parser = argparse.ArgumentParser(description="") + + parser.add_argument( + "--flags", + dest="part_flags", + action="store", + type=auto_int, + help="Partition Flags", + ) + + parser.add_argument( + "--id", + dest="part_id", + action="store", + type=auto_int, + help="Partition ID", + ) + + parser.add_argument( + "--input-file", + dest="input_file", + action="store", + type=str, + help="Input file", + ) + + parser.add_argument( + "--output-file", + dest="output_file", + action="store", + type=str, + help="Output file", + ) + + parser.add_argument( + "--name", + dest="part_name", + action="store", + type=str, + help="Partition Name", + ) + + parser.add_argument( + "--version", + dest="part_version", + action="store", + type=str, + help="Partition Version", + ) + + args = parser.parse_args() + + if ( + (not args.part_flags) + or (not args.part_id) + or (not args.input_file) + or (not args.output_file) + or (not args.part_name) + or (not args.part_version) + ): + parser.print_help() + else: + create_output(args) + main() diff --git a/scripts/cfe-wfi-tag.py b/scripts/cfe-wfi-tag.py index 78ae869f1d..5fac8ee475 100755 --- a/scripts/cfe-wfi-tag.py +++ b/scripts/cfe-wfi-tag.py @@ -43,158 +43,107 @@ Flags: import argparse import os import struct +import binascii -CRC32_INIT = 0xFFFFFFFF -CRC32_TABLE = [ - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D -] def auto_int(x): - return int(x, 0) + return int(x, 0) -def crc32(bytes, size, crc): - i = 0 - while (i < size): - crc = (crc >> 8) ^ CRC32_TABLE[(crc ^ bytes[i]) & 0xff] - i += 1 - return crc -def create_tag(args, in_bytes, size): - crc = crc32(in_bytes, size, CRC32_INIT) - tag = struct.pack('>IIIII', crc, args.tag_version, args.chip_id, args.flash_type, args.flags) - return tag +def create_tag(args, in_bytes): + # JAM CRC32 is bitwise not and unsigned + crc = ~binascii.crc32(in_bytes) & 0xFFFFFFFF + tag = struct.pack( + ">IIIII", + crc, + args.tag_version, + args.chip_id, + args.flash_type, + args.flags, + ) + return tag + def create_output(args): - in_st = os.stat(args.input_file) - in_size = in_st.st_size + in_st = os.stat(args.input_file) + in_size = in_st.st_size + + in_f = open(args.input_file, "r+b") + in_bytes = in_f.read(in_size) + in_f.close() - in_f = open(args.input_file, 'r+b') - in_bytes = in_f.read(in_size) - in_f.close() + tag = create_tag(args, in_bytes) - tag = create_tag(args, in_bytes, in_size) + out_f = open(args.output_file, "w+b") + out_f.write(in_bytes) + out_f.write(tag) + out_f.close() - out_f = open(args.output_file, 'w+b') - out_f.write(in_bytes) - out_f.write(tag) - out_f.close() def main(): - global args - - parser = argparse.ArgumentParser(description='') - - parser.add_argument('--input-file', - dest='input_file', - action='store', - type=str, - help='Input file') - - parser.add_argument('--output-file', - dest='output_file', - action='store', - type=str, - help='Output file') - - parser.add_argument('--version', - dest='tag_version', - action='store', - type=auto_int, - help='WFI Tag Version') - - parser.add_argument('--chip-id', - dest='chip_id', - action='store', - type=auto_int, - help='WFI Chip ID') - - parser.add_argument('--flash-type', - dest='flash_type', - action='store', - type=auto_int, - help='WFI Flash Type') - - parser.add_argument('--flags', - dest='flags', - action='store', - type=auto_int, - help='WFI Flags') - - args = parser.parse_args() - - if not args.flags: - args.flags = 0 - - if ((not args.input_file) or - (not args.output_file) or - (not args.tag_version) or - (not args.chip_id) or - (not args.flash_type)): - parser.print_help() - else: - create_output(args) + global args + + parser = argparse.ArgumentParser(description="") + + parser.add_argument( + "--input-file", + dest="input_file", + action="store", + type=str, + help="Input file", + ) + + parser.add_argument( + "--output-file", + dest="output_file", + action="store", + type=str, + help="Output file", + ) + + parser.add_argument( + "--version", + dest="tag_version", + action="store", + type=auto_int, + help="WFI Tag Version", + ) + + parser.add_argument( + "--chip-id", + dest="chip_id", + action="store", + type=auto_int, + help="WFI Chip ID", + ) + + parser.add_argument( + "--flash-type", + dest="flash_type", + action="store", + type=auto_int, + help="WFI Flash Type", + ) + + parser.add_argument( + "--flags", dest="flags", action="store", type=auto_int, help="WFI Flags" + ) + + args = parser.parse_args() + + if not args.flags: + args.flags = 0 + + if ( + (not args.input_file) + or (not args.output_file) + or (not args.tag_version) + or (not args.chip_id) + or (not args.flash_type) + ): + parser.print_help() + else: + create_output(args) + main() diff --git a/scripts/dl_cleanup.py b/scripts/dl_cleanup.py index 2b074b12f1..e889b2bef4 100755 --- a/scripts/dl_cleanup.py +++ b/scripts/dl_cleanup.py @@ -13,6 +13,7 @@ import sys import os import re import getopt +import shutil # Commandline options opt_dryrun = False @@ -119,8 +120,10 @@ versionRegex = ( (re.compile(r"(.+)[-_](\d\d\d\d)-?(\d\d)-?(\d\d)"), parseVer_ymd), # xxx-YYYY-MM-DD (re.compile(r"(.+)[-_]([0-9a-fA-F]{40,40})"), parseVer_GIT), # xxx-GIT_SHASUM (re.compile(r"(.+)[-_](\d+)\.(\d+)\.(\d+)(\w?)"), parseVer_123), # xxx-1.2.3a + (re.compile(r"(.+)[-_]v(\d+)\.(\d+)\.(\d+)(\w?)"), parseVer_123), # xxx-v1.2.3a (re.compile(r"(.+)[-_](\d+)_(\d+)_(\d+)"), parseVer_123), # xxx-1_2_3 (re.compile(r"(.+)[-_](\d+)\.(\d+)(\w?)"), parseVer_12), # xxx-1.2a + (re.compile(r"(.+)[-_]v(\d+)\.(\d+)(\w?)"), parseVer_12), # xxx-v1.2a (re.compile(r"(.+)[-_]r?(\d+)"), parseVer_r), # xxx-r1111 ) @@ -138,20 +141,26 @@ class EntryParseError(Exception): class Entry: - def __init__(self, directory, filename): + def __init__(self, directory, builddir, filename): self.directory = directory self.filename = filename + self.builddir = builddir self.progname = "" self.fileext = "" + self.filenoext = "" - for ext in extensions: - if filename.endswith(ext): - filename = filename[0 : 0 - len(ext)] - self.fileext = ext - break + if os.path.isdir(self.getPath()): + self.filenoext = filename else: - print(self.filename, "has an unknown file-extension") - raise EntryParseError("ext") + for ext in extensions: + if filename.endswith(ext): + filename = filename[0 : 0 - len(ext)] + self.filenoext = filename + self.fileext = ext + break + else: + print(self.filename, "has an unknown file-extension") + raise EntryParseError("ext") for (regex, parseVersion) in versionRegex: match = regex.match(filename) if match: @@ -166,11 +175,29 @@ class Entry: def getPath(self): return (self.directory + "/" + self.filename).replace("//", "/") + def getBuildPaths(self): + paths = [] + for subdir in os.scandir(self.builddir): + package_build_dir = os.path.join(subdir.path, self.filenoext) + if os.path.exists(package_build_dir): + paths.append(package_build_dir) + return paths + def deleteFile(self): path = self.getPath() print("Deleting", path) if not opt_dryrun: - os.unlink(path) + if os.path.isdir(path): + shutil.rmtree(path) + else: + os.unlink(path) + + def deleteBuildDir(self): + paths = self.getBuildPaths() + for path in paths: + print("Deleting BuildDir", path) + if not opt_dryrun: + shutil.rmtree(path) def __ge__(self, y): return self.version >= y.version @@ -183,6 +210,12 @@ def usage(): print(" -d|--dry-run Do a dry-run. Don't delete any files") print(" -B|--show-blacklist Show the blacklist and exit") print(" -w|--whitelist ITEM Remove ITEM from blacklist") + print( + " -D|--download-dir Provide path to dl dir to clean also the build directory" + ) + print( + " -b|--build-dir Provide path to build dir to clean also the build directory" + ) def main(argv): @@ -191,25 +224,22 @@ def main(argv): try: (opts, args) = getopt.getopt( argv[1:], - "hdBw:", + "hdBw:D:b:", [ "help", "dry-run", "show-blacklist", "whitelist=", + "download-dir=", + "build-dir=", ], ) - if len(args) != 1: - usage() - return 1 except getopt.GetoptError as e: usage() return 1 - directory = args[0] - if not os.path.exists(directory): - print("Can't find dl path", directory) - return 1 + directory = "dl/" + builddir = "build_dir/" for (o, v) in opts: if o in ("-h", "--help"): @@ -233,6 +263,21 @@ def main(argv): sep = "\t" print("%s%s(%s)" % (name, sep, regex.pattern)) return 0 + if o in ("-D", "--download-dir"): + directory = v + if o in ("-b", "--build-dir"): + builddir = v + + if args: + directory = args[0] + + if not os.path.exists(directory): + print("Can't find download directory", directory) + return 1 + + if not os.path.exists(builddir): + print("Can't find build directory", builddir) + return 1 # Create a directory listing and parse the file names. entries = [] @@ -246,7 +291,7 @@ def main(argv): break else: try: - entries.append(Entry(directory, filename)) + entries.append(Entry(directory, builddir, filename)) except EntryParseError as e: pass @@ -265,12 +310,17 @@ def main(argv): lastVersion = None versions = progmap[prog] for version in versions: + if lastVersion: + if os.path.isdir(lastVersion.getPath()) and not os.path.isdir(version.getPath()): + continue if lastVersion is None or version >= lastVersion: lastVersion = version if lastVersion: for version in versions: if version is not lastVersion: version.deleteFile() + if builddir: + version.deleteBuildDir() if opt_dryrun: print("Keeping", lastVersion.getPath()) diff --git a/scripts/dl_github_archive.py b/scripts/dl_github_archive.py index 0756c4641e..c9815f4991 100755 --- a/scripts/dl_github_archive.py +++ b/scripts/dl_github_archive.py @@ -133,7 +133,7 @@ class Path(object): def tar(path, subdir, into=None, ts=None): """Pack ``path`` into tarball ``into``.""" # --sort=name requires a recent build of GNU tar - args = ['tar', '--numeric-owner', '--owner=0', '--group=0', '--sort=name'] + args = ['tar', '--numeric-owner', '--owner=0', '--group=0', '--sort=name', '--mode=a-s'] args += ['-C', path, '-cf', into, subdir] envs = os.environ.copy() if ts is not None: diff --git a/scripts/download.pl b/scripts/download.pl index 063c07d7f5..a8465ca6f4 100755 --- a/scripts/download.pl +++ b/scripts/download.pl @@ -25,6 +25,8 @@ my @mirrors; my $ok; my $check_certificate = $ENV{DOWNLOAD_CHECK_CERTIFICATE} eq "y"; +my $custom_tool = $ENV{DOWNLOAD_TOOL_CUSTOM}; +my $download_tool; $url_filename or $url_filename = $filename; @@ -70,27 +72,70 @@ sub hash_cmd() { return undef; } -sub download_cmd($) { - my $url = shift; - my $have_curl = 0; +sub tool_present { + my $tool_name = shift; + my $compare_line = shift; + my $present = 0; - if (open CURL, "curl --version 2>/dev/null |") { - if (defined(my $line = readline CURL)) { - $have_curl = 1 if $line =~ /^curl /; + if (open TOOL, "$tool_name --version 2>/dev/null |") { + if (defined(my $line = readline TOOL)) { + $present = 1 if $line =~ /^$compare_line /; } - close CURL; + close TOOL; + } + + return $present +} + +sub select_tool { + $custom_tool =~ tr/"//d; + if ($custom_tool) { + return $custom_tool; + } + + # Try to use curl if available + if (tool_present("curl", "curl")) { + return "curl"; } - return $have_curl - ? (qw(curl -f --connect-timeout 20 --retry 5 --location), + # No tool found, fallback to wget + return "wget"; +} + +sub download_cmd { + my $url = shift; + my $filename = shift; + + if ($download_tool eq "curl") { + return (qw(curl -f --connect-timeout 20 --retry 5 --location), $check_certificate ? () : '--insecure', shellwords($ENV{CURL_OPTIONS} || ''), - $url) - : (qw(wget --tries=5 --timeout=20 --output-document=-), + $url); + } elsif ($download_tool eq "wget") { + return (qw(wget --tries=5 --timeout=20 --output-document=-), $check_certificate ? () : '--no-check-certificate', shellwords($ENV{WGET_OPTIONS} || ''), - $url) - ; + $url); + } elsif ($download_tool eq "aria2c") { + my $additional_mirrors = join(" ", map "$_/$filename", @_); + my @chArray = ('a'..'z', 'A'..'Z', 0..9); + my $rfn = join '', "${filename}_", map{ $chArray[int rand @chArray] } 0..9; + + @mirrors=(); + + return join(" ", "[ -d $ENV{'TMPDIR'}/aria2c ] || mkdir $ENV{'TMPDIR'}/aria2c;", + "touch $ENV{'TMPDIR'}/aria2c/${rfn}_spp;", + qw(aria2c --stderr -c -x2 -s10 -j10 -k1M), $url, $additional_mirrors, + $check_certificate ? () : '--check-certificate=false', + "--server-stat-of=$ENV{'TMPDIR'}/aria2c/${rfn}_spp", + "--server-stat-if=$ENV{'TMPDIR'}/aria2c/${rfn}_spp", + "--daemon=false --no-conf", shellwords($ENV{ARIA2C_OPTIONS} || ''), + "-d $ENV{'TMPDIR'}/aria2c -o $rfn;", + "cat $ENV{'TMPDIR'}/aria2c/$rfn;", + "rm $ENV{'TMPDIR'}/aria2c/$rfn $ENV{'TMPDIR'}/aria2c/${rfn}_spp"); + } else { + return join(" ", $download_tool, $url); + } } my $hash_cmd = hash_cmd(); @@ -100,6 +145,7 @@ sub download { my $mirror = shift; my $download_filename = shift; + my @additional_mirrors = @_; $mirror =~ s!/$!!; @@ -146,9 +192,9 @@ sub download } }; } else { - my @cmd = download_cmd("$mirror/$download_filename"); + my @cmd = download_cmd("$mirror/$download_filename", $download_filename, @additional_mirrors); print STDERR "+ ".join(" ",@cmd)."\n"; - open(FETCH_FD, '-|', @cmd) or die "Cannot launch curl or wget.\n"; + open(FETCH_FD, '-|', @cmd) or die "Cannot launch aria2c, curl or wget.\n"; $hash_cmd and do { open MD5SUM, "| $hash_cmd > '$target/$filename.hash'" or die "Cannot launch $hash_cmd.\n"; }; @@ -206,7 +252,10 @@ foreach my $mirror (@ARGV) { push @mirrors, "https://ftp.debian.org/debian/$1"; push @mirrors, "https://mirror.leaseweb.com/debian/$1"; push @mirrors, "https://mirror.netcologne.de/debian/$1"; + push @mirrors, "https://mirrors.tuna.tsinghua.edu.cn/debian/$1"; + push @mirrors, "https://mirrors.ustc.edu.cn/debian/$1" } elsif ($mirror =~ /^\@APACHE\/(.+)$/) { + push @mirrors, "https://dlcdn.apache.org/$1"; push @mirrors, "https://mirror.netcologne.de/apache.org/$1"; push @mirrors, "https://mirror.aarnet.edu.au/pub/apache/$1"; push @mirrors, "https://mirror.csclub.uwaterloo.ca/apache/$1"; @@ -216,6 +265,8 @@ foreach my $mirror (@ARGV) { push @mirrors, "http://ftp.jaist.ac.jp/pub/apache/$1"; push @mirrors, "ftp://apache.cs.utah.edu/apache.org/$1"; push @mirrors, "ftp://apache.mirrors.ovh.net/ftp.apache.org/dist/$1"; + push @mirrors, "https://mirrors.tuna.tsinghua.edu.cn/apache/$1"; + push @mirrors, "https://mirrors.ustc.edu.cn/apache/$1"; } elsif ($mirror =~ /^\@GITHUB\/(.+)$/) { # give github a few more tries (different mirrors) for (1 .. 5) { @@ -231,6 +282,8 @@ foreach my $mirror (@ARGV) { push @mirrors, "ftp://mirrors.rit.edu/gnu/$1"; push @mirrors, "ftp://download.xs4all.nl/pub/gnu/$1"; push @mirrors, "https://ftp.gnu.org/gnu/$1"; + push @mirrors, "https://mirrors.tuna.tsinghua.edu.cn/gnu/$1"; + push @mirrors, "https://mirrors.ustc.edu.cn/gnu/$1"; } elsif ($mirror =~ /^\@SAVANNAH\/(.+)$/) { push @mirrors, "https://mirror.netcologne.de/savannah/$1"; push @mirrors, "https://mirror.csclub.uwaterloo.ca/nongnu/$1"; @@ -254,6 +307,8 @@ foreach my $mirror (@ARGV) { push @mirrors, "http://www.ring.gr.jp/archives/linux/kernel.org/$dir"; push @mirrors, "ftp://ftp.riken.jp/Linux/kernel.org/$dir"; push @mirrors, "ftp://www.mirrorservice.org/sites/ftp.kernel.org/pub/$dir"; + push @mirrors, "https://mirrors.tuna.tsinghua.edu.cn/kernel/$dir"; + push @mirrors, "https://mirrors.ustc.edu.cn/kernel.org/$dir"; } } elsif ($mirror =~ /^\@KERNEL_LIBRE\/(.+)$/) { my @extra = ( $1 ); @@ -276,6 +331,7 @@ foreach my $mirror (@ARGV) { push @mirrors, "http://ftp.belnet.be/ftp.gnome.org/sources/$1"; push @mirrors, "ftp://ftp.cse.buffalo.edu/pub/Gnome/sources/$1"; push @mirrors, "ftp://ftp.nara.wide.ad.jp/pub/X11/GNOME/sources/$1"; + push @mirrors, "https://mirrors.ustc.edu.cn/gnome/sources/$1"; } else { push @mirrors, $mirror; } @@ -301,13 +357,15 @@ if (-f "$target/$filename") { }; } +$download_tool = select_tool(); + while (!-f "$target/$filename") { my $mirror = shift @mirrors; $mirror or die "No more mirrors to try - giving up.\n"; - download($mirror, $url_filename); + download($mirror, $url_filename, @mirrors); if (!-f "$target/$filename" && $url_filename ne $filename) { - download($mirror, $filename); + download($mirror, $filename, @mirrors); } } diff --git a/scripts/dump-target-info.pl b/scripts/dump-target-info.pl index 0e4af17fe0..eec06ed6c4 100755 --- a/scripts/dump-target-info.pl +++ b/scripts/dump-target-info.pl @@ -4,7 +4,7 @@ use strict; use warnings; use Cwd; -my (%targets, %architectures, %kernels); +my (%targets, %architectures, %kernels, %devices); $ENV{'TOPDIR'} = Cwd::getcwd(); @@ -56,6 +56,68 @@ sub parse_targetinfo { } } +sub parse_devices { + my ($target_dir, $subtarget) = @_; + + if (open M, "make -C '$target_dir' --no-print-directory DUMP=1 TARGET_BUILD=1 SUBTARGET='$subtarget' V=s |") { + my ($device_profile, $device_name, @device_alt_names, $device_is_alt); + while (defined(my $line = readline M)) { + chomp $line; + + if ($line =~ /^Target-Profile-Name: (.+)$/) { + $device_name = $1; + } + elsif ($line =~ /^Target-Profile: DEVICE_(.+)$/) { + $device_profile = $1; + } + # Logic behind this. + # DUMP duplicate info for each alternative device name and + # the alternative device name are printed first before the + # primary device name + # Alternative device titles always have the full list of + # all the alternative device name. + # The device name pattern for an alternative device name is + # Target-Profile-Name: ALT_NAME (PRIMARY_NAME) + # We compare the detected device name and check if it does + # match the alternative device name pattern with one of + # the alternative device name in Alternative device titles: + # If an alternative device name is detected, + # alternative device is skipped. + elsif ($line =~ /^Alternative device titles:$/) { + while (defined($line = readline M)) { + if ($line =~ /^- (.+)$/) { + if ($device_name =~ /^\Q$1\E \((.+)\)$/) { + $device_is_alt = 1; + last; + } + push @device_alt_names, $1; + } + else { + last; + } + } + } + if ($line =~ /^@\@$/) { + if ($device_name && $device_profile && ! $device_is_alt) { + push @{$devices{$device_profile}}, $device_name; + + if (scalar @device_alt_names) { + foreach my $device_alt_name (sort values @device_alt_names) { + push @{$devices{$device_profile}}, $device_alt_name; + } + } + } + + undef $device_name; + undef $device_profile; + undef $device_is_alt; + @device_alt_names = (); + } + } + close M; + } +} + sub get_targetinfo { foreach my $target_makefile (glob "target/linux/*/Makefile") { my ($target_dir) = $target_makefile =~ m!^(.+)/Makefile$!; @@ -86,6 +148,15 @@ sub get_targetinfo { } } +sub get_devices { + my ($target_subtarget) = @_; + my ($target, $subtarget) = split /\//, $target_subtarget; + + my ($target_dir) = "target/linux/" . $target; + + parse_devices($target_dir, $subtarget) +} + if (@ARGV == 1 && $ARGV[0] eq 'targets') { get_targetinfo(); foreach my $target_name (sort keys %targets) { @@ -104,8 +175,15 @@ elsif (@ARGV == 1 && $ARGV[0] eq 'kernels') { printf "%s %s\n", $target_name, join ' ', @{$kernels{$target_name}}; } } +elsif (@ARGV == 2 && $ARGV[0] eq 'devices') { + get_devices($ARGV[1]); + foreach my $device (sort keys %devices) { + printf "%s \"%s\"\n", $device, join '" "', @{$devices{$device}}; + } +} else { print "Usage: $0 targets\n"; print "Usage: $0 architectures\n"; print "Usage: $0 kernels\n"; + print "Usage: $0 devices \n"; } diff --git a/scripts/ext-tools.sh b/scripts/ext-tools.sh index bf56f4d9ed..b58296be10 100755 --- a/scripts/ext-tools.sh +++ b/scripts/ext-tools.sh @@ -5,16 +5,14 @@ HOST_BUILD_DIR=$(pwd)/"build_dir/host" HOST_STAGING_DIR_STAMP=$(pwd)/"staging_dir/host/stamp" refresh_timestamps() { - find "$1" -not -type l -print0 | xargs -0 touch + find -H "$1" -not -type l -print0 | xargs -0 touch } extract_prebuilt_tar() { tar -xf "$1" } -install_prebuilt_tools() { - extract_prebuilt_tar "$TOOLS_TAR" - +refresh_prebuilt_tools() { if [ ! -d "$HOST_BUILD_DIR" ]; then echo "Can't find Host Build Dir "$HOST_BUILD_DIR"" >&2 exit 1 @@ -33,6 +31,14 @@ install_prebuilt_tools() { return 0 } +install_prebuilt_tools() { + extract_prebuilt_tar "$TOOLS_TAR" + + refresh_prebuilt_tools + + return 0 +} + while [ -n "$1" ]; do arg="$1"; shift case "$arg" in @@ -63,6 +69,12 @@ while [ -n "$1" ]; do exit $? ;; + --refresh) + refresh_prebuilt_tools + + exit $? + ;; + -h|--help) me="$(basename "$0")" echo -e "\nUsage:\n" >&2 @@ -81,8 +93,12 @@ while [ -n "$1" ]; do echo -e " $me --tools {tar}" >&2 echo -e " Install the prebuilt tools present in the passed" >&2 echo -e " tar and prepare them." >&2 - echo -e " To correctly use them it's needed to update the." >&2 + echo -e " To correctly use them it's needed to update the" >&2 echo -e " timestamp of each tools to skip recompilation.\n" >&2 + echo -e " $me --refresh" >&2 + echo -e " Refresh timestamps of already extracted prebuilt" >&2 + echo -e " tools to correctly use them and skip" >&2 + echo -e " recompilation.\n" >&2 echo -e " $me --help" >&2 echo -e " Display this help text and exit.\n\n" >&2 exit 1 diff --git a/scripts/gen_image_generic.sh b/scripts/gen_image_generic.sh index ef13624402..11e40f3886 100755 --- a/scripts/gen_image_generic.sh +++ b/scripts/gen_image_generic.sh @@ -9,8 +9,10 @@ fi OUTPUT="$1" KERNELSIZE="$2" KERNELDIR="$3" +KERNELPARTTYPE=${KERNELPARTTYPE:-83} ROOTFSSIZE="$4" ROOTFSIMAGE="$5" +ROOTFSPARTTYPE=${ROOTFSPARTTYPE:-83} ALIGN="$6" rm -f "$OUTPUT" @@ -19,7 +21,7 @@ head=16 sect=63 # create partition table -set $(ptgen -o "$OUTPUT" -h $head -s $sect ${GUID:+-g} -p "${KERNELSIZE}m" -p "${ROOTFSSIZE}m" ${ALIGN:+-l $ALIGN} ${SIGNATURE:+-S 0x$SIGNATURE} ${GUID:+-G $GUID}) +set $(ptgen -o "$OUTPUT" -h $head -s $sect ${GUID:+-g} -t "${KERNELPARTTYPE}" -p "${KERNELSIZE}m${PARTOFFSET:+@$PARTOFFSET}" -t "${ROOTFSPARTTYPE}" -p "${ROOTFSSIZE}m" ${ALIGN:+-l $ALIGN} ${SIGNATURE:+-S 0x$SIGNATURE} ${GUID:+-G $GUID}) KERNELOFFSET="$(($1 / 512))" KERNELSIZE="$2" diff --git a/scripts/getver.sh b/scripts/getver.sh index 49260a2260..61906040b1 100755 --- a/scripts/getver.sh +++ b/scripts/getver.sh @@ -21,7 +21,7 @@ try_git() { r*) GET_REV="$(echo $GET_REV | tr -d 'r')" BASE_REV="$(git rev-list ${REBOOT}..HEAD 2>/dev/null | wc -l | awk '{print $1}')" - REV="$(git rev-parse HEAD~$((BASE_REV - GET_REV)))" + [ $((BASE_REV - GET_REV)) -ge 0 ] && REV="$(git rev-parse HEAD~$((BASE_REV - GET_REV)))" ;; *) BRANCH="$(git rev-parse --abbrev-ref HEAD)" diff --git a/scripts/ipkg-build b/scripts/ipkg-build index 19df621048..122cca2cb4 100755 --- a/scripts/ipkg-build +++ b/scripts/ipkg-build @@ -179,20 +179,20 @@ for file_mode in $file_modes; do chown "$uid:$gid" "$pkg_dir/$path" chmod "$mode" "$pkg_dir/$path" done -$TAR -X "$tmp_dir"/tarX --format=gnu --sort=name -cpf - --mtime="$TIMESTAMP" . | gzip -n - > "$tmp_dir"/data.tar.gz +$TAR -X "$tmp_dir"/tarX --format=gnu --numeric-owner --sort=name -cpf - --mtime="$TIMESTAMP" . | gzip -n - > "$tmp_dir"/data.tar.gz installed_size=$(stat -c "%s" "$tmp_dir"/data.tar.gz) sed -i -e "s/^Installed-Size: .*/Installed-Size: $installed_size/" \ "$pkg_dir"/$CONTROL/control -( cd "$pkg_dir"/$CONTROL && $TAR --format=gnu --sort=name -cf - --mtime="$TIMESTAMP" . | gzip -n - > "$tmp_dir"/control.tar.gz ) +( cd "$pkg_dir"/$CONTROL && $TAR --format=gnu --numeric-owner --sort=name -cf - --mtime="$TIMESTAMP" . | gzip -n - > "$tmp_dir"/control.tar.gz ) rm "$tmp_dir"/tarX echo "2.0" > "$tmp_dir"/debian-binary pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk rm -f "$pkg_file" -( cd "$tmp_dir" && $TAR --format=gnu --sort=name -cf - --mtime="$TIMESTAMP" ./debian-binary ./data.tar.gz ./control.tar.gz | gzip -n - > "$pkg_file" ) +( cd "$tmp_dir" && $TAR --format=gnu --numeric-owner --sort=name -cf - --mtime="$TIMESTAMP" ./debian-binary ./data.tar.gz ./control.tar.gz | gzip -n - > "$pkg_file" ) rm "$tmp_dir"/debian-binary "$tmp_dir"/data.tar.gz "$tmp_dir"/control.tar.gz rmdir "$tmp_dir" diff --git a/scripts/json_add_image_info.py b/scripts/json_add_image_info.py index 9aa2a19e45..aded743bcc 100755 --- a/scripts/json_add_image_info.py +++ b/scripts/json_add_image_info.py @@ -13,7 +13,6 @@ if len(argv) != 2: json_path = Path(argv[1]) file_path = Path(getenv("FILE_DIR")) / getenv("FILE_NAME") - if not file_path.is_file(): print("Skip JSON creation for non existing file", file_path) exit(0) @@ -21,7 +20,7 @@ if not file_path.is_file(): def get_titles(): titles = [] - for prefix in ["", "ALT0_", "ALT1_", "ALT2_"]: + for prefix in ["", "ALT0_", "ALT1_", "ALT2_", "ALT3_", "ALT4_"]: title = {} for var in ["vendor", "model", "variant"]: if getenv("DEVICE_{}{}".format(prefix, var.upper())): @@ -37,7 +36,14 @@ def get_titles(): device_id = getenv("DEVICE_ID") -hash_file = hashlib.sha256(file_path.read_bytes()).hexdigest() + +sha256_hash = hashlib.sha256() +with open(str(file_path),"rb") as f: + # Read and update hash string value in blocks of 4K + for byte_block in iter(lambda: f.read(4096),b""): + sha256_hash.update(byte_block) + +hash_file = sha256_hash.hexdigest() if file_path.with_suffix(file_path.suffix + ".sha256sum").exists(): hash_unsigned = ( diff --git a/scripts/linksys-image.sh b/scripts/linksys-image.sh index c3baf44844..d251b5da8e 100755 --- a/scripts/linksys-image.sh +++ b/scripts/linksys-image.sh @@ -14,10 +14,9 @@ # The version number of upgrade. Not checked so use arbitrary value (8 bytes) # Model of target device, padded (0x20) to (15 bytes) # CRC checksum of the image to flash (8 byte) -# Padding (0x20) (7 bytes) +# Padding ('0' + 0x20 *7) (8 bytes) # Signature of signer. Not checked so use arbitrary value (16 bytes) # Padding (0x00) (192 bytes) -# 0x0A (1 byte) ## version history # * version 1: initial commit @@ -58,10 +57,8 @@ IMG_OUT="${IMG_IN}.new" dd if="${IMG_IN}" of="${IMG_TMP_OUT}" CRC=$(printf "%08X" $(dd if="${IMG_IN}" bs=$(stat -c%s "${IMG_IN}") count=1|cksum| cut -d ' ' -f1)) -printf ".LINKSYS.01000409%-15s%-8s%-7s%-16s" "${TYPE}" "${CRC}" "" "K0000000F0246434" >> "${IMG_TMP_OUT}" +printf ".LINKSYS.01000409%-15s%-8s%-8s%-16s" "${TYPE}" "${CRC}" "0" "K0000000F0246434" >> "${IMG_TMP_OUT}" dd if=/dev/zero bs=1 count=192 conv=notrunc >> "${IMG_TMP_OUT}" -printf '\12' >> "${IMG_TMP_OUT}" - cp "${IMG_TMP_OUT}" "${IMG_OUT}" diff --git a/scripts/metadata.pm b/scripts/metadata.pm index ee5a2945ca..587ce7207d 100644 --- a/scripts/metadata.pm +++ b/scripts/metadata.pm @@ -2,7 +2,7 @@ package metadata; use base 'Exporter'; use strict; use warnings; -our @EXPORT = qw(%package %vpackage %srcpackage %category %overrides clear_packages parse_package_metadata parse_target_metadata get_multiline @ignore %usernames %groupnames); +our @EXPORT = qw(%package %vpackage %srcpackage %category %overrides clear_packages parse_package_metadata parse_package_manifest_metadata parse_target_metadata get_multiline @ignore %usernames %groupnames); our %package; our %vpackage; @@ -256,6 +256,8 @@ sub parse_package_metadata($) { /^Source: \s*(.+)\s*$/ and $pkg->{source} = $1; /^License: \s*(.+)\s*$/ and $pkg->{license} = $1; /^LicenseFiles: \s*(.+)\s*$/ and $pkg->{licensefiles} = $1; + /^CPE-ID: \s*(.+)\s*$/ and $pkg->{cpe_id} = $1; + /^ABI-Version: \s*(.+)\s*$/ and $pkg->{abi_version} = $1; /^Default: \s*(.+)\s*$/ and $pkg->{default} = $1; /^Provides: \s*(.+)\s*$/ and do { my @vpkg = split /\s+/, $1; @@ -315,4 +317,42 @@ sub parse_package_metadata($) { return 1; } +sub parse_package_manifest_metadata($) { + my $file = shift; + my $pkg; + my %pkgs; + + open FILE, "<$file" or do { + warn "Cannot open '$file': $!\n"; + return undef; + }; + + while () { + chomp; + /^Package:\s*(.+?)\s*$/ and do { + $pkg = {}; + $pkg->{name} = $1; + $pkg->{depends} = []; + $pkgs{$1} = $pkg; + }; + /^Version:\s*(.+)\s*$/ and $pkg->{version} = $1; + /^Depends:\s*(.+)\s*$/ and $pkg->{depends} = [ split /\s+/, $1 ]; + /^Source:\s*(.+)\s*$/ and $pkg->{source} = $1; + /^SourceName:\s*(.+)\s*$/ and $pkg->{sourcename} = $1; + /^License:\s*(.+)\s*$/ and $pkg->{license} = $1; + /^LicenseFiles:\s*(.+)\s*$/ and $pkg->{licensefiles} = $1; + /^Section:\s*(.+)\s*$/ and $pkg->{section} = $1; + /^SourceDateEpoch: \s*(.+)\s*$/ and $pkg->{sourcedateepoch} = $1; + /^CPE-ID:\s*(.+)\s*$/ and $pkg->{cpe_id} = $1; + /^Architecture:\s*(.+)\s*$/ and $pkg->{architecture} = $1; + /^Installed-Size:\s*(.+)\s*$/ and $pkg->{installedsize} = $1; + /^Filename:\s*(.+)\s*$/ and $pkg->{filename} = $1; + /^Size:\s*(\d+)\s*$/ and $pkg->{size} = $1; + /^SHA256sum:\s*(.*)\s*$/ and $pkg->{sha256sum} = $1; + } + + close FILE; + return %pkgs; +} + 1; diff --git a/scripts/mkits-zyxel-fit-filogic.sh b/scripts/mkits-zyxel-fit-filogic.sh new file mode 100755 index 0000000000..319e187f5a --- /dev/null +++ b/scripts/mkits-zyxel-fit-filogic.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# +# Licensed under the terms of the GNU GPL License version 2 or later. +# Author: David Bauer , based on mkits-zyxel-factory.sh. + +usage() { + echo "Usage: `basename $0` output file compat-models" + exit 1 +} + +# We need at least 3 arguments +[ "$#" -lt 3 ] && usage + +# Target output file +OUTPUT="$1"; shift +FILE="$1"; shift +MODELS="$1"; shift + +# Create a default, fully populated DTS file +echo "\ +/dts-v1/; + +/ { + timestamp = <0x684090B4>; + description = \"Zyxel FIT (Flattened Image Tree)\"; + compat-models = [${MODELS}]; + fw_version = \"9.99(###.1)\"; + #address-cells = <1>; + + images { + ubi { + data = /incbin/(\"${FILE}\"); + type = \"firmware\"; + compression = \"none\"; + hash { + algo = \"sha256\"; + }; + }; + }; +};" > ${OUTPUT} diff --git a/scripts/mkits.sh b/scripts/mkits.sh index 86f39823ac..ace86a0477 100755 --- a/scripts/mkits.sh +++ b/scripts/mkits.sh @@ -35,6 +35,7 @@ usage() { printf "\n\t-l ==> legacy mode character (@ etc otherwise -)" printf "\n\t-o ==> create output file 'its_file'" printf "\n\t-O ==> create config with dt overlay 'name:dtb'" + printf "\n\t-s ==> set FDT load address to 'addr' (hex)" printf "\n\t\t(can be specified more than once)\n" exit 1 } @@ -48,7 +49,7 @@ LOADABLES= DTOVERLAY= DTADDR= -while getopts ":A:a:c:C:D:d:e:f:i:k:l:n:o:O:v:r:H:" OPTION +while getopts ":A:a:c:C:D:d:e:f:i:k:l:n:o:O:v:r:s:H:" OPTION do case $OPTION in A ) ARCH=$OPTARG;; @@ -66,6 +67,7 @@ do o ) OUTPUT=$OPTARG;; O ) DTOVERLAY="$DTOVERLAY ${OPTARG}";; r ) ROOTFS=$OPTARG;; + s ) FDTADDR=$OPTARG;; H ) HASH=$OPTARG;; v ) VERSION=$OPTARG;; * ) echo "Invalid option passed to '$0' (options:$*)" @@ -86,9 +88,8 @@ if [ -n "${COMPATIBLE}" ]; then COMPATIBLE_PROP="compatible = \"${COMPATIBLE}\";" fi -[ "$DTOVERLAY" ] && { - dtbsize=$(wc -c "$DTB" | cut -d' ' -f1) - DTADDR=$(printf "0x%08x" $(($LOAD_ADDR - $dtbsize)) ) +[ "$FDTADDR" ] && { + DTADDR="$FDTADDR" } # Conditionally create fdt information @@ -102,10 +103,10 @@ if [ -n "${DTB}" ]; then ${DTADDR:+load = <${DTADDR}>;} arch = \"${ARCH}\"; compression = \"none\"; - hash@1 { + hash${REFERENCE_CHAR}1 { algo = \"crc32\"; }; - hash@2 { + hash${REFERENCE_CHAR}2 { algo = \"${HASH}\"; }; }; @@ -122,10 +123,10 @@ if [ -n "${INITRD}" ]; then type = \"ramdisk\"; arch = \"${ARCH}\"; os = \"linux\"; - hash@1 { + hash${REFERENCE_CHAR}1 { algo = \"crc32\"; }; - hash@2 { + hash${REFERENCE_CHAR}2 { algo = \"${HASH}\"; }; }; @@ -144,10 +145,10 @@ if [ -n "${ROOTFS}" ]; then type = \"filesystem\"; arch = \"${ARCH}\"; compression = \"none\"; - hash@1 { + hash${REFERENCE_CHAR}1 { algo = \"crc32\"; }; - hash@2 { + hash${REFERENCE_CHAR}2 { algo = \"${HASH}\"; }; }; @@ -162,9 +163,8 @@ OVCONFIGS="" overlay_blob=${overlay##*:} ovname=${overlay%%:*} ovnode="fdt-$ovname" - ovsize=$(wc -c "$overlay_blob" | cut -d' ' -f1) + ovsize=$(wc -c "$overlay_blob" | awk '{print $1}') echo "$ovname ($overlay_blob) : $ovsize" >&2 - DTADDR=$(printf "0x%08x" $(($DTADDR - $ovsize))) FDTOVERLAY_NODE="$FDTOVERLAY_NODE $ovnode { @@ -173,25 +173,21 @@ OVCONFIGS="" data = /incbin/(\"${overlay_blob}\"); type = \"flat_dt\"; arch = \"${ARCH}\"; - load = <${DTADDR}>; compression = \"none\"; - hash@1 { + hash${REFERENCE_CHAR}1 { algo = \"crc32\"; }; - hash@2 { + hash${REFERENCE_CHAR}2 { algo = \"${HASH}\"; }; }; " OVCONFIGS="$OVCONFIGS - config-$ovname { - description = \"libreCMC ${DEVICE} with $ovname\"; - kernel = \"kernel${REFERENCE_CHAR}1\"; - fdt = \"fdt${REFERENCE_CHAR}$FDTNUM\", \"$ovnode\"; - ${LOADABLES:+loadables = ${LOADABLES};} + $ovname { + description = \"libreCMC ${DEVICE} overlay $ovname\"; + fdt = \"$ovnode\"; ${COMPATIBLE_PROP} - ${INITRD_PROP} }; " done @@ -213,10 +209,10 @@ DATA="/dts-v1/; compression = \"${COMPRESS}\"; load = <${LOAD_ADDR}>; entry = <${ENTRY_ADDR}>; - hash@1 { + hash${REFERENCE_CHAR}1 { algo = \"crc32\"; }; - hash@2 { + hash${REFERENCE_CHAR}2 { algo = \"$HASH\"; }; }; diff --git a/scripts/netgear-encrypted-factory.py b/scripts/netgear-encrypted-factory.py index b6bb72f3b8..40cfd9df0d 100755 --- a/scripts/netgear-encrypted-factory.py +++ b/scripts/netgear-encrypted-factory.py @@ -14,6 +14,8 @@ def main(): parser.add_argument('--model', type=str, required=True) parser.add_argument('--region', type=str, required=True) parser.add_argument('--version', type=str, required=True) + parser.add_argument('--hw-id-list', type=str) + parser.add_argument('--model-list', type=str) parser.add_argument('--encryption-block-size', type=str, required=True) parser.add_argument('--openssl-bin', type=str, required=True) parser.add_argument('--key', type=str, required=True) @@ -26,6 +28,10 @@ def main(): assert (encryption_block_size > 0 and encryption_block_size % 16 == 0), 'Encryption block size must be a multiple of the AES block size (16)' + hw_id_list = args.hw_id_list.split(';') if args.hw_id_list else [] + model_list = args.model_list.split(';') if args.model_list else [] + hw_info = ';'.join(hw_id_list + model_list) + image = open(args.input_file, 'rb').read() image_enc = [] for i in range(0, len(image), encryption_block_size): @@ -45,13 +51,18 @@ def main(): image_enc = b''.join(image_enc) image_with_header = struct.pack( - '>32s32s64s64s64s256s12sII', + '>32s32s64s64sIBBB13s200s100s12sII', args.model.encode('ascii'), args.region.encode('ascii'), args.version.encode('ascii'), b'Thu Jan 1 00:00:00 1970', # static date for reproducibility + 0, # product hw model + 0, # model index + len(hw_id_list), + len(model_list), + b'', # reserved + hw_info.encode('ascii'), b'', # reserved - b'', # RSA signature - omitted for now b'encrpted_img', len(image_enc), encryption_block_size, diff --git a/scripts/package-metadata.pl b/scripts/package-metadata.pl index 6288584d65..bc61577d22 100755 --- a/scripts/package-metadata.pl +++ b/scripts/package-metadata.pl @@ -4,6 +4,8 @@ use lib "$FindBin::Bin"; use strict; use metadata; use Getopt::Long; +use Time::Piece; +use JSON::PP; my %board; @@ -609,6 +611,7 @@ ${json}{ "version":"$pkg->{version}", "category":"$pkg->{category}", "license":"$pkg->{license}", +"cpe_id":"$pkg->{cpe_id}", "maintainer": [$pkg_maintainer], "depends":[$pkg_deps]}, END_JSON @@ -619,6 +622,173 @@ END_JSON print "[$json]"; } +sub image_manifest_packages($) +{ + my %packages; + my $imgmanifest = shift; + + open FILE, "<$imgmanifest" or return; + while () { + /^(.+?) - (.+)$/ and $packages{$1} = $2; + } + close FILE; + + return %packages; +} + +sub dump_cyclonedxsbom_json { + my (@components) = @_; + + my $uuid = sprintf( + "%04x%04x-%04x-%04x-%04x-%04x%04x%04x", + rand(0xffff), rand(0xffff), rand(0xffff), + rand(0x0fff) | 0x4000, + rand(0x3fff) | 0x8000, + rand(0xffff), rand(0xffff), rand(0xffff) + ); + + my $cyclonedx = { + bomFormat => "CycloneDX", + specVersion => "1.4", + serialNumber => "urn:uuid:$uuid", + version => 1, + metadata => { + timestamp => gmtime->datetime, + }, + "components" => [@components], + }; + + return encode_json($cyclonedx); +} + +sub gen_image_cyclonedxsbom() { + my $pkginfo = shift @ARGV; + my $imgmanifest = shift @ARGV; + my @components; + my %image_packages; + + %image_packages = image_manifest_packages($imgmanifest); + %image_packages or exit 1; + parse_package_metadata($pkginfo) or exit 1; + + $package{"kernel"} = { + license => "GPL-2.0", + cpe_id => "cpe:/o:linux:linux_kernel", + name => "kernel", + }; + + my %abimap; + my @abipkgs = grep { defined $package{$_}->{abi_version} } keys %package; + foreach my $name (@abipkgs) { + my $pkg = $package{$name}; + my $abipkg = $name . $pkg->{abi_version}; + $abimap{$abipkg} = $name; + } + + foreach my $name (sort {uc($a) cmp uc($b)} keys %image_packages) { + my $pkg = $package{$name}; + if (!$pkg) { + $pkg = $package{$abimap{$name}}; + next if !$pkg; + } + + my @licenses; + my @license = split(/\s+/, $pkg->{license}); + foreach my $lic (@license) { + push @licenses, ( + { "license" => { "name" => $lic } } + ); + } + my $type; + if ($pkg->{category}) { + my $category = $pkg->{category}; + my %cat_type = ( + "Firmware" => "firmware", + "Libraries" => "library" + ); + + if ($cat_type{$category}) { + $type = $cat_type{$category}; + } else { + $type = "application"; + } + } + + my $version = $pkg->{version}; + if ($image_packages{$name}) { + $version = $image_packages{$name}; + } + $version =~ s/-\d+$// if $version; + if ($name =~ /^(kernel|kmod-)/ and $version =~ /^(\d+\.\d+\.\d+)/) { + $version = $1; + } + + push @components, { + name => $pkg->{name}, + version => $version, + @licenses > 0 ? (licenses => [ @licenses ]) : (), + $pkg->{cpe_id} ? (cpe => $pkg->{cpe_id}.":".$version) : (), + $type ? (type => $type) : (), + $version ? (version => $version) : (), + }; + } + + print dump_cyclonedxsbom_json(@components); +} + +sub gen_package_cyclonedxsbom() { + my $pkgmanifest = shift @ARGV; + my @components; + my %mpkgs; + + %mpkgs = parse_package_manifest_metadata($pkgmanifest); + %mpkgs or exit 1; + + foreach my $name (sort {uc($a) cmp uc($b)} keys %mpkgs) { + my $pkg = $mpkgs{$name}; + + my @licenses; + my @license = split(/\s+/, $pkg->{license}); + foreach my $lic (@license) { + push @licenses, ( + { "license" => { "name" => $lic } } + ); + } + + my $type; + if ($pkg->{section}) { + my $section = $pkg->{section}; + my %section_type = ( + "firmware" => "firmware", + "libs" => "library" + ); + + if ($section_type{$section}) { + $type = $section_type{$section}; + } else { + $type = "application"; + } + } + + my $version = $pkg->{version}; + $version =~ s/-\d+$// if $version; + if ($name =~ /^(kernel|kmod-)/ and $version =~ /^(\d+\.\d+\.\d+)/) { + $version = $1; + } + + push @components, { + name => $name, + version => $version, + @licenses > 0 ? (licenses => [ @licenses ]) : (), + $pkg->{cpe_id} ? (cpe => $pkg->{cpe_id}.":".$version) : (), + $type ? (type => $type) : (), + $version ? (version => $version) : (), + }; + } + + print dump_cyclonedxsbom_json(@components); +} + sub parse_command() { GetOptions("ignore=s", \@ignore); my $cmd = shift @ARGV; @@ -629,6 +799,8 @@ sub parse_command() { /^source$/ and return gen_package_source(); /^pkgaux$/ and return gen_package_auxiliary(); /^pkgmanifestjson$/ and return gen_package_manifest_json(); + /^imgcyclonedxsbom$/ and return gen_image_cyclonedxsbom(); + /^pkgcyclonedxsbom$/ and return gen_package_cyclonedxsbom(); /^license$/ and return gen_package_license(0); /^licensefull$/ and return gen_package_license(1); /^usergroup$/ and return gen_usergroup_list(); @@ -636,15 +808,17 @@ sub parse_command() { } die < [manifest] Image package manifest in CycloneDX SBOM JSON format + $0 pkgcyclonedxsbom Package manifest in CycloneDX SBOM JSON format + $0 license [file] Package license information $0 licensefull [file] Package license information (full list) - $0 usergroup [file] Package usergroup allocation list + $0 usergroup [file] Package usergroup allocation list $0 version_filter [patchver] [list...] Filter list of version tagged strings Options: diff --git a/scripts/qemustart b/scripts/qemustart index 275fee8786..d98e0776d6 100755 --- a/scripts/qemustart +++ b/scripts/qemustart @@ -109,10 +109,10 @@ Examples $SELF malta be -m 64 $SELF malta le64 $SELF malta be-glibc - $SELF armvirt 32 \\ + $SELF armsr armv7 \\ --machine virt,highmem=off \\ - --kernel bin/targets/armvirt/32/librecmc-armvirt-32-zImage \\ - --rootfs bin/targets/armvirt/32/librecmc-armvirt-32-root.ext4 + --kernel bin/targets/armsr/armv7/librecmc-armsr-armv7-generic-kernel.bin \\ + --rootfs bin/targets/armsr/armv7/librecmc-armsr-armv7-generic-ext4-rootfs.img EOF } @@ -158,10 +158,11 @@ parse_args() { return 1 } [ -n "$o_subtarget" ] || o_subtarget="generic" - o_bindir="bin/targets/$o_target/$o_subtarget" + eval "$(grep ^CONFIG_BINARY_FOLDER= .config 2>/dev/null)" + o_bindir="${CONFIG_BINARY_FOLDER:-bin}/targets/$o_target/$o_subtarget" } -start_qemu_armvirt() { +start_qemu_armsr() { local kernel="$o_kernel" local rootfs="$o_rootfs" local mach="${o_mach:-virt}" @@ -169,15 +170,15 @@ start_qemu_armvirt() { local qemu_exe case "${o_subtarget%-*}" in - 32) + armv7) qemu_exe="qemu-system-arm" cpu="cortex-a15" - [ -n "$kernel" ] || kernel="$o_bindir/librecmc-$o_target-${o_subtarget%-*}-zImage-initramfs" + [ -n "$kernel" ] || kernel="$o_bindir/librecmc-$o_target-${o_subtarget%-*}-generic-initramfs-kernel.bin" ;; - 64) + armv8) qemu_exe="qemu-system-aarch64" cpu="cortex-a57" - [ -n "$kernel" ] || kernel="$o_bindir/librecmc-$o_target-${o_subtarget%-*}-Image-initramfs" + [ -n "$kernel" ] || kernel="$o_bindir/librecmc-$o_target-${o_subtarget%-*}-generic-initramfs-kernel.bin" ;; *) __errmsg "target $o_target: unknown subtarget $o_subtarget" @@ -308,12 +309,12 @@ start_qemu_x86() { # To use AHCI interface # # -device ich9-ahci,id=ahci \ - # -device ide-drive,drive=drv0,bus=ahci.0 \ + # -device ide-hd,drive=drv0,bus=ahci.0 \ # -drive "file=$rootfs,format=raw,id=drv0,if=none" \ # # [1] https://dev.openwrt.org/ticket/17947 "$qemu_exe" -machine "$mach" -nographic \ - -device ide-drive,drive=drv0 \ + -device ide-hd,drive=drv0 \ -drive "file=$rootfs,format=raw,id=drv0,if=none" \ "${o_qemu_extra[@]}" ;; @@ -327,7 +328,7 @@ start_qemu_x86() { start_qemu() { case "$o_target" in - armvirt) start_qemu_armvirt ;; + armsr) start_qemu_armsr ;; malta) start_qemu_malta ;; x86) start_qemu_x86 ;; *) diff --git a/scripts/sercomm-kernel-header.py b/scripts/sercomm-kernel-header.py new file mode 100755 index 0000000000..40bcbb1385 --- /dev/null +++ b/scripts/sercomm-kernel-header.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 +""" +# SPDX-License-Identifier: GPL-2.0-or-later +# +# sercomm-kernel-header.py: Creates Sercomm kernel header +# +# Copyright © 2022 Mikhail Zhilkin +""" + +import argparse +import binascii +import os +import struct + +KERNEL_HEADER_SIZE = 0x100 +PADDING = 0xff +ROOTFS_FAKE_HEADER = "UBI#" + +def auto_int(x): + return int(x, 0) + +def create_kernel_header(args): + out_file = open(args.header_file, "wb") + header = get_kernel_header(args) + out_file.write(header) + out_file.close() + +def get_kernel_header(args): + header = bytearray([PADDING] * KERNEL_HEADER_SIZE) + + struct.pack_into('14s', buf, 0x0, enc) + else: + enc = args.hw_version.rjust(8, '0').encode('ascii') + struct.pack_into('>8s', buf, 0x0, enc) + + enc = binascii.hexlify(args.hw_id.encode()) + struct.pack_into('>6s', buf, 0x8, enc) + + enc = args.sw_version.rjust(4, '0').encode('ascii') + struct.pack_into('>4s', buf, 0x64, enc) + + if (args.extra_padd_size): + tail = bytearray([PADDING_TAIL] * args.extra_padd_size) + if (args.extra_padd_byte): + struct.pack_into ('/dev/null \ +)" CONFIG_PACKAGES=$(sed -n 's/^CONFIG_PACKAGE_\(.*\)=y$/\1/p' .config | tr '\n' ' ') -CONFIG_BIN_DIR=$(sed -n 's/^CONFIG_BINARY_DIR="\(.*\)"$/\1/p' .config) -TARGET=${TARGET:-$CONFIG_TARGET} -SUBTARGET=${SUBTARGET:-$CONFIG_SUBTARGET} -ARCH=${ARCH:-$CONFIG_ARCH} +TARGET=${TARGET:-$CONFIG_TARGET_BOARD} +SUBTARGET=${SUBTARGET:-$CONFIG_TARGET_SUBTARGET} +ARCH=${ARCH:-$CONFIG_TARGET_ARCH_PACKAGES} PACKAGES=${PACKAGES:-$CONFIG_PACKAGES} -BIN_DIR=${CONFIG_BIN_DIR:-./bin} +BIN_DIR=${CONFIG_BINARY_FOLDER:-./bin} BASE_URL="${BASE_URL:-https://downloads.openwrt.org/snapshots}" CHECK_INSTALLED="${CHECK_INSTALLED:-y}" @@ -72,6 +75,7 @@ package_size () { } compare_sizes () { + TOTAL_DIFF="0" for PACKAGE in $PACKAGES; do if [ "$PACKAGE" = "libc" ]; then continue @@ -89,7 +93,8 @@ compare_sizes () { SIZE_LOCAL=$(tar tzvf "$PACKAGE_FILE" ./data.tar.gz | awk '{ print $3 }') fi SIZE_UPSTREAM=$(package_size "$TMP_INDEX" "$PACKAGE") - SIZE_DIFF="$((SIZE_LOCAL-SIZE_UPSTREAM))" + SIZE_DIFF="$((SIZE_LOCAL - SIZE_UPSTREAM))" + TOTAL_DIFF="$((TOTAL_DIFF + SIZE_DIFF))" if [ "$SIZE_DIFF" -gt 0 ]; then SIZE_DIFF="+$SIZE_DIFF" fi @@ -99,6 +104,7 @@ compare_sizes () { echo "$PACKAGE is missing upstream" fi done + echo "~~~~~~~ total change ${TOTAL_DIFF}" } if [ "$1" = "-h" ]; then diff --git a/target/Config.in b/target/Config.in index a6b3351a61..ac0f1f9826 100644 --- a/target/Config.in +++ b/target/Config.in @@ -184,6 +184,10 @@ config powerpc64 select ARCH_64BIT bool +config riscv64 + select ARCH_64BIT + bool + config sh3 bool @@ -223,6 +227,7 @@ config ARCH default "mips64el" if mips64el default "powerpc" if powerpc default "powerpc64" if powerpc64 + default "riscv64" if riscv64 default "sh3" if sh3 default "sh3eb" if sh3eb default "sh4" if sh4 diff --git a/target/imagebuilder/files/Makefile b/target/imagebuilder/files/Makefile index 4d3e139bec..7410f4aa4b 100644 --- a/target/imagebuilder/files/Makefile +++ b/target/imagebuilder/files/Makefile @@ -13,6 +13,7 @@ export TOPDIR LC_ALL LANG export LIBRECMC_VERBOSE=s all: help +export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH)) export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH) ifneq ($(LIBRECMC_BUILD),1) @@ -35,8 +36,11 @@ Available Commands: info: Show a list of available target profiles clean: Remove images and temporary build files image: Build an image (see below for more information). + manifest: Show all package that will be installed into the image + package_whatdepends: Show which packages have a dependency on this + package_depends: Show installation dependency of the package -Building images: +image: By default 'make image' will create an image with the default target profile and package set. You can use the following parameters to change that: @@ -50,7 +54,7 @@ Building images: make image ADD_LOCAL_KEY=1 # store locally generated signing key in built images make image ROOTFS_PARTSIZE="" # override the default rootfs partition size in MegaBytes -Print manifest: +manifest: List "all" packages which get installed into the image. You can use the following parameters: @@ -58,6 +62,19 @@ Print manifest: make manifest PACKAGES=" [ [ ...]]" # include extra packages make manifest STRIP_ABI=1 # remove ABI version from printed package names + +package_whatdepends: + List "all" packages that have a dependency on this package + You can use the following parameters: + + make package_whatdepends PACKAGE="" + +package_depends: + List "all" packages dependency of the package + You can use the following parameters: + + make package_depends PACKAGE="" + endef $(eval $(call shexport,Helptext)) @@ -110,9 +127,11 @@ _call_info: FORCE echo 'Available Profiles:' echo; $(PROFILE_LIST) -BUILD_PACKAGES:=$(USER_PACKAGES) $(sort $(DEFAULT_PACKAGES) $($(USER_PROFILE)_PACKAGES) kernel) +BUILD_PACKAGES:=$(sort $(DEFAULT_PACKAGES) $($(USER_PROFILE)_PACKAGES) kernel) # "-pkgname" in the package list means remove "pkgname" from the package list BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES)) +BUILD_PACKAGES:=$(USER_PACKAGES) $(BUILD_PACKAGES) +BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES)) PACKAGES:= _call_image: staging_dir/host/.prereq-build @@ -257,7 +276,7 @@ manifest: FORCE $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER)") \ $(if $(PACKAGES),USER_PACKAGES="$(PACKAGES)")) -whatdepends: FORCE +package_whatdepends: FORCE ifeq ($(PACKAGE),) @echo 'Variable `PACKAGE` is not set but required by `whatdepends`' @exit 1 @@ -265,4 +284,13 @@ endif @$(MAKE) -s package_reload @$(OPKG) whatdepends -A $(PACKAGE) -.SILENT: help info image manifest whatdepends +package_depends: FORCE +ifeq ($(PACKAGE),) + @echo 'Variable `PACKAGE` is not set but required by `package_depends`' + @exit 1 +endif + @$(MAKE) -s package_reload + @$(OPKG) depends -A $(PACKAGE) + + +.SILENT: help info image manifest package_whatdepends package_depends diff --git a/target/linux/ath79/Makefile b/target/linux/ath79/Makefile index 035299670f..48c082cc3c 100644 --- a/target/linux/ath79/Makefile +++ b/target/linux/ath79/Makefile @@ -4,11 +4,11 @@ ARCH:=mips BOARD:=ath79 BOARDNAME:=Atheros ATH79 CPU_TYPE:=24kc -SUBTARGETS:=generic nand +SUBTARGETS:=generic nand tiny FEATURES:=ramdisk squashfs usbgadget -KERNEL_PATCHVER:=5.10 +KERNEL_PATCHVER:=5.15 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/ath79/config-5.10 b/target/linux/ath79/config-5.10 deleted file mode 100644 index dcbc5d4570..0000000000 --- a/target/linux/ath79/config-5.10 +++ /dev/null @@ -1,205 +0,0 @@ -CONFIG_AG71XX=y -# CONFIG_AG71XX_DEBUG is not set -CONFIG_AG71XX_DEBUG_FS=y -CONFIG_AR8216_PHY=y -CONFIG_AR8216_PHY_LEDS=y -CONFIG_ARCH_32BIT_OFF_T=y -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -CONFIG_ARCH_MMAP_RND_BITS_MAX=15 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=15 -CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_AT803X_PHY=y -CONFIG_ATH79=y -CONFIG_ATH79_WDT=y -CONFIG_BLK_MQ_PCI=y -CONFIG_CEVT_R4K=y -CONFIG_CLKDEV_LOOKUP=y -CONFIG_CLONE_BACKWARDS=y -CONFIG_CMDLINE="rootfstype=squashfs,jffs2" -CONFIG_CMDLINE_BOOL=y -# CONFIG_CMDLINE_OVERRIDE is not set -CONFIG_COMMON_CLK=y -# CONFIG_COMMON_CLK_BOSTON is not set -CONFIG_COMPAT_32BIT_TIME=y -CONFIG_CPU_BIG_ENDIAN=y -CONFIG_CPU_GENERIC_DUMP_TLB=y -CONFIG_CPU_HAS_DIEI=y -CONFIG_CPU_HAS_PREFETCH=y -CONFIG_CPU_HAS_RIXI=y -CONFIG_CPU_HAS_SYNC=y -CONFIG_CPU_MIPS32=y -CONFIG_CPU_MIPS32_R2=y -CONFIG_CPU_MIPSR2=y -CONFIG_CPU_NEEDS_NO_SMARTMIPS_OR_MICROMIPS=y -CONFIG_CPU_R4K_CACHE_TLB=y -CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y -CONFIG_CPU_SUPPORTS_HIGHMEM=y -CONFIG_CPU_SUPPORTS_MSA=y -CONFIG_CRYPTO_BLAKE2S=y -# CONFIG_CRYPTO_CHACHA_MIPS is not set -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=2 -# CONFIG_CRYPTO_POLY1305_MIPS is not set -CONFIG_CRYPTO_RNG2=y -CONFIG_CSRC_R4K=y -CONFIG_DMA_NONCOHERENT=y -CONFIG_DTC=y -CONFIG_EARLY_PRINTK=y -CONFIG_ETHERNET_PACKET_MANGLE=y -CONFIG_FIXED_PHY=y -CONFIG_FW_LOADER_PAGED_BUF=y -CONFIG_GENERIC_ATOMIC64=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_GENERIC_CMOS_UPDATE=y -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_IOMAP=y -CONFIG_GENERIC_IRQ_CHIP=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_LIB_ASHLDI3=y -CONFIG_GENERIC_LIB_ASHRDI3=y -CONFIG_GENERIC_LIB_CMPDI2=y -CONFIG_GENERIC_LIB_LSHRDI3=y -CONFIG_GENERIC_LIB_UCMPDI2=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_GENERIC_PHY=y -CONFIG_GENERIC_PINCONF=y -CONFIG_GENERIC_PINCTRL_GROUPS=y -CONFIG_GENERIC_PINMUX_FUNCTIONS=y -CONFIG_GENERIC_SCHED_CLOCK=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_IRQCHIP=y -CONFIG_GPIO_74X164=y -CONFIG_GPIO_ATH79=y -CONFIG_GPIO_GENERIC=y -# CONFIG_GPIO_LATCH is not set -# CONFIG_GPIO_RB91X_KEY is not set -CONFIG_HANDLE_DOMAIN_IRQ=y -CONFIG_HARDWARE_WATCHPOINTS=y -CONFIG_HAS_DMA=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HZ_PERIODIC=y -CONFIG_IMAGE_CMDLINE_HACK=y -CONFIG_INITRAMFS_SOURCE="" -CONFIG_IRQCHIP=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_IRQ_MIPS_CPU=y -CONFIG_IRQ_WORK=y -# CONFIG_KERNEL_ZSTD is not set -CONFIG_LEDS_GPIO=y -# CONFIG_LEDS_RESET is not set -CONFIG_LIBFDT=y -CONFIG_LOCK_DEBUGGING_SUPPORT=y -CONFIG_MDIO_BITBANG=y -CONFIG_MDIO_BUS=y -CONFIG_MDIO_DEVICE=y -CONFIG_MDIO_GPIO=y -CONFIG_MEMFD_CREATE=y -# CONFIG_MFD_RB4XX_CPLD is not set -CONFIG_MFD_SYSCON=y -CONFIG_MIGRATION=y -CONFIG_MIPS=y -CONFIG_MIPS_ASID_BITS=8 -CONFIG_MIPS_ASID_SHIFT=0 -CONFIG_MIPS_CBPF_JIT=y -CONFIG_MIPS_CLOCK_VSYSCALL=y -# CONFIG_MIPS_CMDLINE_BUILTIN_EXTEND is not set -# CONFIG_MIPS_CMDLINE_DTB_EXTEND is not set -# CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER is not set -CONFIG_MIPS_CMDLINE_FROM_DTB=y -# CONFIG_MIPS_ELF_APPENDED_DTB is not set -# CONFIG_MIPS_GENERIC_KERNEL is not set -CONFIG_MIPS_L1_CACHE_SHIFT=5 -CONFIG_MIPS_LD_CAN_LINK_VDSO=y -# CONFIG_MIPS_NO_APPENDED_DTB is not set -CONFIG_MIPS_RAW_APPENDED_DTB=y -CONFIG_MIPS_SPRAM=y -CONFIG_MODULES_USE_ELF_REL=y -CONFIG_MTD_CFI_ADV_OPTIONS=y -CONFIG_MTD_CFI_GEOMETRY=y -# CONFIG_MTD_CFI_I2 is not set -# CONFIG_MTD_CFI_INTELEXT is not set -CONFIG_MTD_CMDLINE_PARTS=y -# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set -# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set -CONFIG_MTD_PARSER_CYBERTAN=y -# CONFIG_MTD_PARSER_TPLINK_SAFELOADER is not set -CONFIG_MTD_PHYSMAP=y -CONFIG_MTD_SPI_NOR=y -CONFIG_MTD_SPLIT_ELF_FW=y -CONFIG_MTD_SPLIT_LZMA_FW=y -CONFIG_MTD_SPLIT_SEAMA_FW=y -CONFIG_MTD_SPLIT_TPLINK_FW=y -CONFIG_MTD_SPLIT_UIMAGE_FW=y -CONFIG_MTD_SPLIT_WRGG_FW=y -CONFIG_MTD_VIRT_CONCAT=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_NEED_PER_CPU_KM=y -CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y -CONFIG_NVMEM=y -CONFIG_OF=y -CONFIG_OF_ADDRESS=y -CONFIG_OF_EARLY_FLATTREE=y -CONFIG_OF_FLATTREE=y -CONFIG_OF_GPIO=y -CONFIG_OF_IRQ=y -CONFIG_OF_KOBJ=y -CONFIG_OF_MDIO=y -CONFIG_OF_NET=y -CONFIG_PCI=y -CONFIG_PCI_AR71XX=y -CONFIG_PCI_AR724X=y -CONFIG_PCI_DISABLE_COMMON_QUIRKS=y -CONFIG_PCI_DOMAINS=y -CONFIG_PCI_DRIVERS_LEGACY=y -CONFIG_PERF_USE_VMALLOC=y -CONFIG_PGTABLE_LEVELS=2 -CONFIG_PHYLIB=y -# CONFIG_PHY_AR7100_USB is not set -# CONFIG_PHY_AR7200_USB is not set -# CONFIG_PHY_ATH79_USB is not set -CONFIG_PINCTRL=y -CONFIG_RATIONAL=y -CONFIG_REGMAP=y -CONFIG_REGMAP_MMIO=y -CONFIG_REGULATOR=y -CONFIG_RESET_ATH79=y -CONFIG_RESET_CONTROLLER=y -CONFIG_SERIAL_8250_NR_UARTS=1 -CONFIG_SERIAL_8250_RUNTIME_UARTS=1 -CONFIG_SERIAL_AR933X=y -CONFIG_SERIAL_AR933X_CONSOLE=y -CONFIG_SERIAL_AR933X_NR_UARTS=2 -CONFIG_SERIAL_MCTRL_GPIO=y -CONFIG_SERIAL_OF_PLATFORM=y -CONFIG_SPI=y -CONFIG_SPI_AR934X=y -CONFIG_SPI_ATH79=y -CONFIG_SPI_BITBANG=y -CONFIG_SPI_GPIO=y -CONFIG_SPI_MASTER=y -CONFIG_SPI_MEM=y -# CONFIG_SPI_RB4XX is not set -CONFIG_SRCU=y -CONFIG_SWCONFIG=y -CONFIG_SWCONFIG_LEDS=y -CONFIG_SWPHY=y -CONFIG_SYSCTL_EXCEPTION_TRACE=y -CONFIG_SYS_HAS_CPU_MIPS32_R2=y -CONFIG_SYS_HAS_EARLY_PRINTK=y -CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y -CONFIG_SYS_SUPPORTS_ARBIT_HZ=y -CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y -CONFIG_SYS_SUPPORTS_MIPS16=y -CONFIG_SYS_SUPPORTS_ZBOOT=y -CONFIG_SYS_SUPPORTS_ZBOOT_UART_PROM=y -CONFIG_TARGET_ISA_REV=2 -CONFIG_TICK_CPU_ACCOUNTING=y -CONFIG_TINY_SRCU=y -CONFIG_USB_SUPPORT=y -CONFIG_USE_OF=y diff --git a/target/linux/ath79/config-5.15 b/target/linux/ath79/config-5.15 new file mode 100644 index 0000000000..ce987c5539 --- /dev/null +++ b/target/linux/ath79/config-5.15 @@ -0,0 +1,202 @@ +CONFIG_AG71XX=y +# CONFIG_AG71XX_DEBUG is not set +CONFIG_AG71XX_DEBUG_FS=y +CONFIG_AR8216_PHY=y +CONFIG_AR8216_PHY_LEDS=y +CONFIG_ARCH_32BIT_OFF_T=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_ARCH_MMAP_RND_BITS_MAX=15 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=15 +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_AT803X_PHY=y +CONFIG_ATH79=y +CONFIG_ATH79_WDT=y +CONFIG_BLK_MQ_PCI=y +CONFIG_CEVT_R4K=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_CMDLINE="rootfstype=squashfs,jffs2" +CONFIG_CMDLINE_BOOL=y +# CONFIG_CMDLINE_OVERRIDE is not set +CONFIG_COMMON_CLK=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_CPU_BIG_ENDIAN=y +CONFIG_CPU_GENERIC_DUMP_TLB=y +CONFIG_CPU_HAS_DIEI=y +CONFIG_CPU_HAS_PREFETCH=y +CONFIG_CPU_HAS_RIXI=y +CONFIG_CPU_HAS_SYNC=y +CONFIG_CPU_MIPS32=y +CONFIG_CPU_MIPS32_R2=y +CONFIG_CPU_MIPSR2=y +CONFIG_CPU_NEEDS_NO_SMARTMIPS_OR_MICROMIPS=y +CONFIG_CPU_R4K_CACHE_TLB=y +CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y +CONFIG_CPU_SUPPORTS_HIGHMEM=y +CONFIG_CPU_SUPPORTS_MSA=y +CONFIG_CRYPTO_BLAKE2S=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=2 +CONFIG_CRYPTO_RNG2=y +CONFIG_CSRC_R4K=y +CONFIG_DMA_NONCOHERENT=y +CONFIG_DTC=y +CONFIG_EARLY_PRINTK=y +CONFIG_FIXED_PHY=y +CONFIG_FWNODE_MDIO=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_GENERIC_ATOMIC64=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CMOS_UPDATE=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_IOMAP=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_LIB_ASHLDI3=y +CONFIG_GENERIC_LIB_ASHRDI3=y +CONFIG_GENERIC_LIB_CMPDI2=y +CONFIG_GENERIC_LIB_LSHRDI3=y +CONFIG_GENERIC_LIB_UCMPDI2=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_PHY=y +CONFIG_GENERIC_PINCONF=y +CONFIG_GENERIC_PINCTRL_GROUPS=y +CONFIG_GENERIC_PINMUX_FUNCTIONS=y +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GPIOLIB_IRQCHIP=y +CONFIG_GPIO_74X164=y +CONFIG_GPIO_ATH79=y +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_GENERIC=y +# CONFIG_GPIO_LATCH is not set +# CONFIG_GPIO_RB91X_KEY is not set +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_HARDWARE_WATCHPOINTS=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HZ_PERIODIC=y +CONFIG_IMAGE_CMDLINE_HACK=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_IRQCHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_MIPS_CPU=y +CONFIG_IRQ_WORK=y +CONFIG_LEDS_GPIO=y +# CONFIG_LEDS_RESET is not set +CONFIG_LIBFDT=y +CONFIG_LOCK_DEBUGGING_SUPPORT=y +CONFIG_MDIO_BITBANG=y +CONFIG_MDIO_BUS=y +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_DEVRES=y +CONFIG_MDIO_GPIO=y +CONFIG_MEMFD_CREATE=y +# CONFIG_MFD_RB4XX_CPLD is not set +CONFIG_MFD_SYSCON=y +CONFIG_MIGRATION=y +CONFIG_MIPS=y +CONFIG_MIPS_ASID_BITS=8 +CONFIG_MIPS_ASID_SHIFT=0 +CONFIG_MIPS_CLOCK_VSYSCALL=y +# CONFIG_MIPS_CMDLINE_BUILTIN_EXTEND is not set +# CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER is not set +CONFIG_MIPS_CMDLINE_FROM_DTB=y +CONFIG_MIPS_EBPF_JIT=y +CONFIG_MIPS_L1_CACHE_SHIFT=5 +CONFIG_MIPS_LD_CAN_LINK_VDSO=y +# CONFIG_MIPS_NO_APPENDED_DTB is not set +CONFIG_MIPS_RAW_APPENDED_DTB=y +CONFIG_MIPS_SPRAM=y +CONFIG_MODULES_USE_ELF_REL=y +CONFIG_MTD_CFI_ADV_OPTIONS=y +CONFIG_MTD_CFI_GEOMETRY=y +# CONFIG_MTD_CFI_I2 is not set +# CONFIG_MTD_CFI_INTELEXT is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set +CONFIG_MTD_PARSER_CYBERTAN=y +# CONFIG_MTD_PARSER_TPLINK_SAFELOADER is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_SPI_NOR=y +CONFIG_MTD_SPLIT_ELF_FW=y +CONFIG_MTD_SPLIT_LZMA_FW=y +CONFIG_MTD_SPLIT_SEAMA_FW=y +CONFIG_MTD_SPLIT_TPLINK_FW=y +CONFIG_MTD_SPLIT_UIMAGE_FW=y +CONFIG_MTD_SPLIT_WRGG_FW=y +CONFIG_MTD_VIRT_CONCAT=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEED_PER_CPU_KM=y +CONFIG_NET_SELFTESTS=y +CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y +CONFIG_NVMEM=y +CONFIG_OF=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_FLATTREE=y +CONFIG_OF_GPIO=y +CONFIG_OF_IRQ=y +CONFIG_OF_KOBJ=y +CONFIG_OF_MDIO=y +CONFIG_PCI=y +CONFIG_PCI_AR71XX=y +CONFIG_PCI_AR724X=y +CONFIG_PCI_DISABLE_COMMON_QUIRKS=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DRIVERS_LEGACY=y +CONFIG_PERF_USE_VMALLOC=y +CONFIG_PGTABLE_LEVELS=2 +CONFIG_PHYLIB=y +# CONFIG_PHY_AR7100_USB is not set +# CONFIG_PHY_AR7200_USB is not set +# CONFIG_PHY_ATH79_USB is not set +CONFIG_PINCTRL=y +# CONFIG_PINCTRL_PISTACHIO is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y +CONFIG_RATIONAL=y +CONFIG_REGMAP=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGULATOR=y +CONFIG_RESET_ATH79=y +CONFIG_RESET_CONTROLLER=y +CONFIG_SERIAL_8250_NR_UARTS=1 +CONFIG_SERIAL_8250_RUNTIME_UARTS=1 +CONFIG_SERIAL_AR933X=y +CONFIG_SERIAL_AR933X_CONSOLE=y +CONFIG_SERIAL_AR933X_NR_UARTS=2 +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SPI=y +CONFIG_SPI_AR934X=y +CONFIG_SPI_ATH79=y +CONFIG_SPI_BITBANG=y +CONFIG_SPI_GPIO=y +CONFIG_SPI_MASTER=y +CONFIG_SPI_MEM=y +# CONFIG_SPI_RB4XX is not set +CONFIG_SRCU=y +CONFIG_SWCONFIG=y +CONFIG_SWCONFIG_LEDS=y +CONFIG_SWPHY=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_SYS_HAS_CPU_MIPS32_R2=y +CONFIG_SYS_HAS_EARLY_PRINTK=y +CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y +CONFIG_SYS_SUPPORTS_ARBIT_HZ=y +CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y +CONFIG_SYS_SUPPORTS_MIPS16=y +CONFIG_SYS_SUPPORTS_ZBOOT=y +CONFIG_SYS_SUPPORTS_ZBOOT_UART_PROM=y +CONFIG_TARGET_ISA_REV=2 +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TINY_SRCU=y +CONFIG_USB_SUPPORT=y +CONFIG_USE_OF=y diff --git a/target/linux/ath79/dts/ar7100.dtsi b/target/linux/ath79/dts/ar7100.dtsi index 12ab7e5039..a03f282a0f 100644 --- a/target/linux/ath79/dts/ar7100.dtsi +++ b/target/linux/ath79/dts/ar7100.dtsi @@ -21,6 +21,13 @@ }; }; + extosc: ref { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-output-names = "ref"; + clock-frequency = <40000000>; + }; + ahb { apb { ddr_ctrl: memory-controller@18000000 { @@ -73,8 +80,8 @@ compatible = "qca,ar7100-pll", "syscon"; reg = <0x18050000 0x20>; + clocks = <&extosc>; clock-names = "ref"; - /* The board must provides the ref clock */ #clock-cells = <1>; clock-output-names = "cpu", "ddr", "ahb"; @@ -149,6 +156,11 @@ #address-cells = <1>; #size-cells = <0>; + + usb_ehci_port: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; usb1: usb@1c000000 { @@ -165,6 +177,11 @@ #address-cells = <1>; #size-cells = <0>; + + usb_ohci_port: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; spi: spi@1f000000 { diff --git a/target/linux/ath79/dts/ar7100_mikrotik_routerboard-4xx.dtsi b/target/linux/ath79/dts/ar7100_mikrotik_routerboard-4xx.dtsi index c6cbe2fda1..6ec700f179 100644 --- a/target/linux/ath79/dts/ar7100_mikrotik_routerboard-4xx.dtsi +++ b/target/linux/ath79/dts/ar7100_mikrotik_routerboard-4xx.dtsi @@ -84,12 +84,10 @@ }; hard_config { - label = "hard_config"; read-only; }; bios { - label = "bios"; size = <0x1000>; read-only; }; @@ -100,7 +98,6 @@ }; soft_config { - label = "soft_config"; }; }; }; diff --git a/target/linux/ath79/dts/ar7161_adtran_bsap1880.dtsi b/target/linux/ath79/dts/ar7161_adtran_bsap1880.dtsi index 5b4b6e3dda..d7b961d8f6 100644 --- a/target/linux/ath79/dts/ar7161_adtran_bsap1880.dtsi +++ b/target/linux/ath79/dts/ar7161_adtran_bsap1880.dtsi @@ -58,8 +58,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x1>; - phy0: ethernet-phy@0 { reg = <0>; }; @@ -87,7 +85,8 @@ partitions { #address-cells = <1>; #size-cells = <1>; - compatible = "ecoscentric,redboot-fis-partitions"; + compatible = "redboot-fis"; + fis-index-block = <0xfd>; }; }; }; diff --git a/target/linux/ath79/dts/ar7161_aruba_ap-105.dts b/target/linux/ath79/dts/ar7161_aruba_ap-105.dts index 8180e0d6bd..949d70ec07 100644 --- a/target/linux/ath79/dts/ar7161_aruba_ap-105.dts +++ b/target/linux/ath79/dts/ar7161_aruba_ap-105.dts @@ -21,13 +21,6 @@ label-mac-device = ð0; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-output-names = "ref"; - clock-frequency = <40000000>; - }; - leds { compatible = "gpio-leds"; @@ -125,8 +118,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x1>; - phy0: ethernet-phy@0 { reg = <0>; }; diff --git a/target/linux/ath79/dts/ar7161_aruba_ap-175.dts b/target/linux/ath79/dts/ar7161_aruba_ap-175.dts new file mode 100644 index 0000000000..dd29a687ba --- /dev/null +++ b/target/linux/ath79/dts/ar7161_aruba_ap-175.dts @@ -0,0 +1,244 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar7100.dtsi" + +#include +#include + +/ { + compatible = "aruba,ap-175", "qca,ar7161"; + model = "Aruba AP-175"; + + chosen { + bootargs = "console=ttyS0,115200"; + }; + + aliases { + led-boot = &led_power_amber; + led-failsafe = &led_power_amber; + led-upgrade = &led_power_amber; + label-mac-device = ð0; + }; + + leds { + compatible = "gpio-leds"; + + /* These internal LEDs cannot be seen when case is closed */ + internal_2g_green { + label = "green:internal_2g"; + gpios = <&gpio 3 GPIO_ACTIVE_HIGH>; + }; + + internal_5g_green { + label = "green:internal_5g"; + gpios = <&gpio 4 GPIO_ACTIVE_HIGH>; + }; + + /* These external LEDs are visible from the bottom panel */ + + led_power_amber: power_amber { + label = "amber:power"; + gpios = <&gpio_ext 5 GPIO_ACTIVE_HIGH>; + panic-indicator; + }; + + r1_act_blue { + label = "blue:r1_act"; + gpios = <&gpio_ext 0 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "phy1tpt"; + }; + + r1_rssi1_blue { + label = "blue:r1_rssi1"; + gpios = <&gpio_ext 1 GPIO_ACTIVE_HIGH>; + }; + + r1_rssi2_blue { + label = "blue:r1_rssi2"; + gpios = <&gpio_ext 2 GPIO_ACTIVE_HIGH>; + }; + + r1_rssi3_blue { + label = "blue:r1_rssi3"; + gpios = <&gpio_ext 3 GPIO_ACTIVE_HIGH>; + }; + + r1_rssi4_blue { + label = "blue:r1_rssi4"; + gpios = <&gpio_ext 4 GPIO_ACTIVE_HIGH>; + }; + + r0_act_amber { + label = "amber:r0_act"; + gpios = <&gpio_ext 8 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "phy0tpt"; + }; + + r0_rssi1_amber { + label = "amber:r0_rssi1"; + gpios = <&gpio_ext 9 GPIO_ACTIVE_HIGH>; + }; + + r0_rssi2_amber { + label = "amber:r0_rssi2"; + gpios = <&gpio_ext 10 GPIO_ACTIVE_HIGH>; + }; + + r0_rssi3_amber { + label = "amber:r0_rssi3"; + gpios = <&gpio_ext 11 GPIO_ACTIVE_HIGH>; + }; + + r0_rssi4_amber { + label = "amber:r0_rssi4"; + gpios = <&gpio_ext 12 GPIO_ACTIVE_HIGH>; + }; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 6 GPIO_ACTIVE_LOW>; + }; + }; + + i2c0: i2c { + compatible = "i2c-gpio"; + i2c-gpio,delay-us = <10>; + i2c-gpio,timeout-ms = <1>; + sda-gpios = <&gpio 1 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; + scl-gpios = <&gpio 2 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; + + #address-cells = <1>; + #size-cells = <0>; + }; +}; + +&pcie0 { + status = "okay"; + + ath9k0: wifi@0,11 { + compatible = "pci168c,0029"; + nvmem-cells = <&macaddr_hwinfo_1c>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <1>; + reg = <0x8800 0 0 0 0>; + #gpio-cells = <2>; + gpio-controller; + }; + + ath9k1: wifi@0,12 { + compatible = "pci168c,0029"; + nvmem-cells = <&macaddr_hwinfo_1c>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <2>; + reg = <0x9000 0 0 0 0>; + #gpio-cells = <2>; + gpio-controller; + }; +}; + +&mdio0 { + status = "okay"; + + phy1: ethernet-phy@1 { + reg = <0x1>; + }; +}; + +ð0 { + status = "okay"; + nvmem-cells = <&macaddr_hwinfo_1c>; + nvmem-cell-names = "mac-address"; + + phy-mode = "rgmii"; + phy-handle = <&phy1>; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x000000 0x40000>; + read-only; + }; + + partition@40000 { + label = "firmware"; + reg = <0x40000 0xfa0000>; + compatible = "denx,uimage"; + }; + + hwinfo: partition@fe0000 { + label = "hwinfo"; + reg = <0xfe0000 0x10000>; + read-only; + }; + + partition@ff0000 { + label = "u-boot-env"; + reg = <0xff0000 0x10000>; + read-only; + }; + }; + }; +}; + +&hwinfo { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_hwinfo_1c: macaddr@1c { + reg = <0x1c 0x6>; + }; +}; + +&i2c0 { + gpio_ext: gpio@21 { + status = "okay"; + + compatible = "ti,tca6416"; + reg = <0x21>; + + #address-cells = <1>; + #size-cells = <0>; + + gpio-controller; + #gpio-cells = <2>; + }; + + temp-sensor@4a { + compatible = "national,lm75"; + reg = <0x4a>; + }; + + eeprom@50 { /* 24lc2561 */ + compatible = "atmel,24c256","at24"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x50>; + size = <256>; + }; + + ds1374c: rtc@68 { + status = "okay"; + + compatible = "dallas,ds1374"; + reg = <0x68>; + }; +}; diff --git a/target/linux/ath79/dts/ar7161_buffalo_wzr-hp-ag300h.dtsi b/target/linux/ath79/dts/ar7161_buffalo_wzr-hp-ag300h.dtsi index 35e083bc61..6e1ba2d47e 100644 --- a/target/linux/ath79/dts/ar7161_buffalo_wzr-hp-ag300h.dtsi +++ b/target/linux/ath79/dts/ar7161_buffalo_wzr-hp-ag300h.dtsi @@ -12,13 +12,6 @@ led-upgrade = &led_diag; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-output-names = "ref"; - clock-frequency = <40000000>; - }; - leds { compatible = "gpio-leds"; @@ -177,25 +170,11 @@ }; &usb1 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - usb_ohci_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb2 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - usb_ehci_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &pcie0 { @@ -218,10 +197,6 @@ }; }; -&pll { - clocks = <&extosc>; -}; - &spi { status = "okay"; diff --git a/target/linux/ath79/dts/ar7161_dlink_dir-825-b1.dts b/target/linux/ath79/dts/ar7161_dlink_dir-825-b1.dts deleted file mode 100644 index 30c7e0edb9..0000000000 --- a/target/linux/ath79/dts/ar7161_dlink_dir-825-b1.dts +++ /dev/null @@ -1,244 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later OR MIT - -#include "ar7100.dtsi" - -#include -#include - -/ { - compatible = "dlink,dir-825-b1", "qca,ar7161"; - model = "D-Link DIR825B1"; - - aliases { - led-boot = &led_power_orange; - led-failsafe = &led_power_orange; - led-running = &led_power_blue; - led-upgrade = &led_power_orange; - }; - - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-output-names = "ref"; - clock-frequency = <40000000>; - }; - - leds { - compatible = "gpio-leds"; - - usb { - label = "blue:usb"; - gpios = <&gpio 0 GPIO_ACTIVE_LOW>; - trigger-sources = <&usb_ohci_port>, <&usb_ehci_port>; - linux,default-trigger = "usbport"; - }; - - led_power_orange: power_orange { - label = "orange:power"; - gpios = <&gpio 1 GPIO_ACTIVE_LOW>; - default-state = "on"; - }; - - led_power_blue: power_blue { - label = "blue:power"; - gpios = <&gpio 2 GPIO_ACTIVE_LOW>; - }; - - wps { - label = "blue:wps"; - gpios = <&gpio 4 GPIO_ACTIVE_LOW>; - }; - - planet_orange { - label = "orange:planet"; - gpios = <&gpio 6 GPIO_ACTIVE_LOW>; - }; - - planet_blue { - label = "blue:planet"; - gpios = <&gpio 11 GPIO_ACTIVE_LOW>; - }; - }; - - ath9k-leds { - compatible = "gpio-leds"; - - wlan2g { - label = "blue:wlan2g"; - gpios = <&ath9k0 5 GPIO_ACTIVE_LOW>; - linux,default-trigger = "phy0tpt"; - }; - - wlan5g { - label = "blue:wlan5g"; - gpios = <&ath9k1 5 GPIO_ACTIVE_LOW>; - linux,default-trigger = "phy1tpt"; - }; - }; - - keys { - compatible = "gpio-keys"; - - reset { - label = "reset"; - linux,code = ; - gpios = <&gpio 3 GPIO_ACTIVE_LOW>; - }; - - wps { - label = "wps"; - linux,code = ; - gpios = <&gpio 8 GPIO_ACTIVE_LOW>; - }; - }; - - rtl8366s { - compatible = "realtek,rtl8366s"; - gpio-sda = <&gpio 5 GPIO_ACTIVE_HIGH>; - gpio-sck = <&gpio 7 GPIO_ACTIVE_HIGH>; - realtek,initvals = <0x06 0x0108>; - - mdio-bus { - #address-cells = <1>; - #size-cells = <0>; - status = "okay"; - - phy-mask = <0x10>; - - phy4: ethernet-phy@4 { - reg = <4>; - phy-mode = "rgmii"; - }; - }; - }; - - virtual_flash { - compatible = "mtd-concat"; - devices = <&fwconcat0 &fwconcat1>; - - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@0 { - compatible = "denx,uimage"; - label = "firmware"; - reg = <0x0 0x0>; - }; - }; - }; -}; - -&usb1 { - #address-cells = <1>; - #size-cells = <0>; - status = "okay"; - - usb_ohci_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; -}; - -&usb2 { - #address-cells = <1>; - #size-cells = <0>; - status = "okay"; - - usb_ehci_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; -}; - -&usb_phy { - status = "okay"; -}; - -&pcie0 { - status = "okay"; - - ath9k0: wifi@0,11 { - compatible = "pci168c,0029"; - reg = <0x8800 0 0 0 0>; - qca,no-eeprom; - #gpio-cells = <2>; - gpio-controller; - }; - - ath9k1: wifi@0,12 { - compatible = "pci168c,0029"; - reg = <0x9000 0 0 0 0>; - qca,no-eeprom; - #gpio-cells = <2>; - gpio-controller; - }; -}; - -&pll { - clocks = <&extosc>; -}; - -&spi { - status = "okay"; - - flash@0 { - compatible = "jedec,spi-nor"; - reg = <0>; - spi-max-frequency = <25000000>; - - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@0 { - label = "u-boot"; - reg = <0x000000 0x040000>; - read-only; - }; - - partition@40000 { - label = "config"; - reg = <0x040000 0x010000>; - read-only; - }; - - fwconcat0: partition@50000 { - label = "fwconcat0"; - reg = <0x050000 0x610000>; - }; - - partition@660000 { - label = "caldata"; - reg = <0x660000 0x010000>; - read-only; - }; - - fwconcat1: partition@670000 { - label = "fwconcat1"; - reg = <0x670000 0x190000>; - }; - }; - }; -}; - -ð0 { - status = "okay"; - - pll-data = <0x11110000 0x00001099 0x00991099>; - - fixed-link { - speed = <1000>; - full-duplex; - }; -}; - -ð1 { - status = "okay"; - - pll-data = <0x11110000 0x00001099 0x00991099>; - - phy-handle = <&phy4>; -}; diff --git a/target/linux/ath79/dts/ar7161_jjplus_ja76pf2.dts b/target/linux/ath79/dts/ar7161_jjplus_ja76pf2.dts index 7c15f60976..b7012596ad 100644 --- a/target/linux/ath79/dts/ar7161_jjplus_ja76pf2.dts +++ b/target/linux/ath79/dts/ar7161_jjplus_ja76pf2.dts @@ -26,11 +26,17 @@ led-upgrade = &led_d2; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-output-names = "ref"; - clock-frequency = <40000000>; + i2c { + compatible = "i2c-gpio"; + sda-gpios = <&gpio 1 GPIO_ACTIVE_HIGH>; + scl-gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + #address-cells = <1>; + #size-cells = <0>; + + sensor@48 { + compatible = "microchip,tcn75"; + reg = <0x48>; + }; }; leds { @@ -74,8 +80,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x1>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "rgmii"; diff --git a/target/linux/ath79/dts/ar7161_meraki_mr16.dts b/target/linux/ath79/dts/ar7161_meraki_mr16.dts index d672364e56..7a19da82e3 100644 --- a/target/linux/ath79/dts/ar7161_meraki_mr16.dts +++ b/target/linux/ath79/dts/ar7161_meraki_mr16.dts @@ -16,13 +16,6 @@ led-upgrade = &led_power_orange; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-output-names = "ref"; - clock-frequency = <40000000>; - }; - leds { compatible = "gpio-leds"; @@ -100,15 +93,9 @@ }; }; -&pll { - clocks = <&extosc>; -}; - &mdio0 { status = "okay"; - phy-mask = <0x1>; - phy0: ethernet-phy@0 { reg = <0>; }; diff --git a/target/linux/ath79/dts/ar7161_netgear_wndap360.dts b/target/linux/ath79/dts/ar7161_netgear_wndap360.dts index aeb7c56773..21dc423c35 100644 --- a/target/linux/ath79/dts/ar7161_netgear_wndap360.dts +++ b/target/linux/ath79/dts/ar7161_netgear_wndap360.dts @@ -16,13 +16,6 @@ led-upgrade = &led_power_orange; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-output-names = "ref"; - clock-frequency = <40000000>; - }; - leds { compatible = "gpio-leds"; @@ -62,7 +55,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x0f>; phy1: ethernet-phy@1 { reg = <0x1>; }; @@ -115,10 +107,34 @@ read-only; }; - art: partition@7f0000 { + partition@7f0000 { label = "art"; reg = <0x7f0000 0x010000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + macaddr_art_120c: macaddr@120c { + reg = <0x120c 0x6>; + }; + + macaddr_art_520c: macaddr@520c { + reg = <0x520c 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0xeb8>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0xeb8>; + }; }; }; }; @@ -130,9 +146,8 @@ ath9k0: wifi@0,11 { compatible = "pci168c,0029"; reg = <0x8800 0 0 0 0>; - qca,no-eeprom; - nvmem-cells = <&macaddr_art_120c>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_120c>, <&calibration_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; #gpio-cells = <2>; gpio-controller; }; @@ -140,30 +155,10 @@ ath9k1: wifi@0,12 { compatible = "pci168c,0029"; reg = <0x9000 0 0 0 0>; - qca,no-eeprom; - nvmem-cells = <&macaddr_art_520c>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_520c>, <&calibration_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <1>; #gpio-cells = <2>; gpio-controller; }; }; - - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; - - macaddr_art_120c: macaddr@120c { - reg = <0x120c 0x6>; - }; - - macaddr_art_520c: macaddr@520c { - reg = <0x520c 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/ar7161_netgear_wndr.dtsi b/target/linux/ath79/dts/ar7161_netgear_wndr.dtsi index afbccb8016..296ecc8c4e 100644 --- a/target/linux/ath79/dts/ar7161_netgear_wndr.dtsi +++ b/target/linux/ath79/dts/ar7161_netgear_wndr.dtsi @@ -14,13 +14,6 @@ led-upgrade = &led_power_orange; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-output-names = "ref"; - clock-frequency = <40000000>; - }; - reset-leds { compatible = "reset-leds"; @@ -110,8 +103,6 @@ #size-cells = <0>; status = "okay"; - phy-mask = <0x10>; - phy4: ethernet-phy@4 { reg = <4>; phy-mode = "rgmii"; @@ -125,25 +116,11 @@ }; &usb1 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - usb_ohci_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb2 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - usb_ehci_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &pcie0 { diff --git a/target/linux/ath79/dts/ar7161_ruckus_gd11.dtsi b/target/linux/ath79/dts/ar7161_ruckus_gd11.dtsi new file mode 100644 index 0000000000..437556b196 --- /dev/null +++ b/target/linux/ath79/dts/ar7161_ruckus_gd11.dtsi @@ -0,0 +1,243 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar7100.dtsi" + +#include +#include + +/ { + compatible = "ruckus,gd11", "qca,ar7161"; + + aliases { + led-boot = &led_power_green; + led-failsafe = &led_power_red; + led-running = &led_power_green; + led-upgrade = &led_power_red; + label-mac-device = ð0; + }; + + keys: keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 8 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + }; + + leds { + compatible = "gpio-leds"; + dir-green { + label = "green:dir"; + gpios = <&gpio 6 GPIO_ACTIVE_HIGH>; + }; + + opt-green { + label = "green:opt"; + gpios = <&gpio 7 GPIO_ACTIVE_HIGH>; + }; + + led_power_green: power-green { + label = "green:power"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + default-state = "on"; + }; + + led_power_red: power-red { + label = "red:power"; + gpios = <&gpio 1 GPIO_ACTIVE_HIGH>; + panic-indicator; + }; + + wlan2g-green { + label = "green:wlan2g"; + gpios = <&gpio 2 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "phy0assoc"; + }; + + wlan2g-yellow { + label = "yellow:wlan2g"; + gpios = <&gpio 3 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "phy0tpt"; + }; + + wlan5g-green { + label = "green:wlan5g"; + gpios = <&gpio 4 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "phy1assoc"; + }; + + wlan5g-yellow { + label = "yellow:wlan5g"; + gpios = <&gpio 5 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "phy1tpt"; + }; + }; + + reserved-memory { + #address-cells = <1>; + #size-cells = <1>; + ranges; + + ruckus-himem@3ff0000 { + /* Ruckus Himem area used to control + * redundant boot image selection + */ + compatible = "nvmem-rmem"; + reg = <0x3ff0000 0x10000>; + no-map; + }; + }; + + beamforming-2g-spi { + compatible = "spi-gpio"; + mosi-gpios = <&ath9k0 5 GPIO_ACTIVE_HIGH>; + sck-gpios = <&ath9k0 6 GPIO_ACTIVE_HIGH>; + num-chipselects = <0>; + #address-cells = <1>; + #size-cells = <0>; + + beamforming_2g_gpio: beamforming-2g-gpio@0 { + compatible = "fairchild,74hc595"; + reg = <0>; + registers-number = <1>; + spi-max-frequency = <24000000>; + gpio-controller; + #gpio-cells = <2>; + }; + }; + + beamforming-5g-spi { + compatible = "spi-gpio"; + mosi-gpios = <&ath9k1 5 GPIO_ACTIVE_HIGH>; + sck-gpios = <&ath9k1 6 GPIO_ACTIVE_HIGH>; + num-chipselects = <0>; + #address-cells = <1>; + #size-cells = <0>; + + beamforming_5g_gpio: beamforming-5g-gpio@0 { + compatible = "fairchild,74hc595"; + reg = <0>; + registers-number = <1>; + spi-max-frequency = <24000000>; + gpio-controller; + #gpio-cells = <2>; + }; + }; +}; + +&pcie0 { + status = "okay"; + + ath9k0: wifi@0,11 { /* 2.4 GHz */ + compatible = "pci168c,0029"; + reg = <0x8800 0 0 0 0>; + nvmem-cells = <&macaddr_bdata_60>; + nvmem-cell-names = "mac-address"; + #gpio-cells = <2>; + gpio-controller; + }; + + ath9k1: wifi@0,12 { /* 5 GHz */ + compatible = "pci168c,0029"; + reg = <0x9000 0 0 0 0>; + nvmem-cells = <&macaddr_bdata_76>; + nvmem-cell-names = "mac-address"; + #gpio-cells = <2>; + gpio-controller; + }; +}; + +&mdio0 { + status = "okay"; + + phy0: ethernet-phy@1e { + reg = <0x1e>; + }; +}; + +ð0 { + status = "okay"; + nvmem-cells = <&macaddr_bdata_66>; + nvmem-cell-names = "mac-address"; + + pll-data = <0x00110000 0x00001099 0x00991099>; + phy-handle = <&phy0>; + phy-mode = "rgmii-id"; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <104000000>; + m25p,fast-read; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + reg = <0x0 0x40000>; + label = "u-boot"; + read-only; + }; + + /* On stock FW this encompasses rcks_wlan.main, + * rcks_wlan.bkup and datafs partitions + */ + partition@40000 { + compatible = "librecmc,uimage", "denx,uimage"; + reg = <0x40000 0xf40000>; + label = "firmware"; + }; + + partition@f80000 { + compatible = "u-boot,env"; + reg = <0xf80000 0x40000>; + label = "u-boot-env"; + }; + + board_data: partition@fc0000 { + reg = <0xfc0000 0x40000>; + label = "board-data"; + read-only; + }; + }; + }; +}; + +&usb1 { + status = "okay"; +}; + +&usb2 { + status = "okay"; +}; + +&usb_phy { + status = "okay"; +}; + +&board_data { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_bdata_60: macaddr@60 { + reg = <0x60 0x6>; + }; + + macaddr_bdata_66: macaddr@66 { + reg = <0x66 0x6>; + }; + + macaddr_bdata_76: macaddr@76 { + reg = <0x76 0x6>; + }; +}; diff --git a/target/linux/ath79/dts/ar7161_ruckus_zf7341.dts b/target/linux/ath79/dts/ar7161_ruckus_zf7341.dts new file mode 100644 index 0000000000..17735e596f --- /dev/null +++ b/target/linux/ath79/dts/ar7161_ruckus_zf7341.dts @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar7161_ruckus_zf734x.dtsi" + +/ { + model = "Ruckus ZoneFlex 7341[-U]"; + compatible = "ruckus,zf7341", "qca,ar7161"; +}; diff --git a/target/linux/ath79/dts/ar7161_ruckus_zf734x.dtsi b/target/linux/ath79/dts/ar7161_ruckus_zf734x.dtsi new file mode 100644 index 0000000000..8861b09d1b --- /dev/null +++ b/target/linux/ath79/dts/ar7161_ruckus_zf734x.dtsi @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar7161_ruckus_gd11.dtsi" + +&keys { + opt { + /* Not used by stock firmware */ + label = "opt"; + linux,code = ; + gpios = <&gpio 11 GPIO_ACTIVE_HIGH>; + debounce-interval = <60>; + }; +}; + +&beamforming_2g_gpio { + /* Default beamforming switches configuration from stock firmware, + * the AP is started and for broadcast frames - all outputs high */ + lb0 { + line-name = "beamforming:2g:lb0"; + gpios = <0 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + lb1 { + line-name = "beamforming:2g:lb1"; + gpios = <1 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + lb2 { + line-name = "beamforming:2g:lb2"; + gpios = <2 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + lb3 { + line-name = "beamforming:2g:lb3"; + gpios = <3 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + lb4 { + line-name = "beamforming:2g:lb4"; + gpios = <4 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + lb5 { + line-name = "beamforming:2g:lb5"; + gpios = <5 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + lb6 { + line-name = "beamforming:2g:lb6"; + gpios = <6 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + lb7 { + line-name = "beamforming:2g:lb7"; + gpios = <7 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; +}; + +&beamforming_5g_gpio { + /* Default beamforming switches configuration from stock firmware, + * the AP is started and for broadcast frames - all outputs high */ + hb0 { + line-name = "beamforming:5g:hb0"; + gpios = <0 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + hb1 { + line-name = "beamforming:5g:hb1"; + gpios = <1 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + hb2 { + line-name = "beamforming:5g:hb2"; + gpios = <2 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + hb3 { + line-name = "beamforming:5g:hb3"; + gpios = <3 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + hb4 { + line-name = "beamforming:5g:hb4"; + gpios = <4 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; + + hb5 { + line-name = "beamforming:5g:hb5"; + gpios = <5 GPIO_ACTIVE_LOW>; + output-high; + gpio-hog; + }; +}; diff --git a/target/linux/ath79/dts/ar7161_ruckus_zf7351.dts b/target/linux/ath79/dts/ar7161_ruckus_zf7351.dts new file mode 100644 index 0000000000..37ea305790 --- /dev/null +++ b/target/linux/ath79/dts/ar7161_ruckus_zf7351.dts @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar7161_ruckus_gd11.dtsi" + +/ { + model = "Ruckus ZoneFlex 7351[-U]"; + compatible = "ruckus,zf7351", "qca,ar7161"; + +}; + +&beamforming_2g_gpio { + /* Default beamforming switches configuration from stock firmware, + * the AP is started and for broadcast frames - all outputs high */ + lb0 { + line-name = "beamforming:2g:lb0"; + gpios = <0 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + lb1 { + line-name = "beamforming:2g:lb1"; + gpios = <1 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + lb2 { + line-name = "beamforming:2g:lb2"; + gpios = <2 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + lb3 { + line-name = "beamforming:2g:lb3"; + gpios = <4 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + lb4 { + line-name = "beamforming:2g:lb4"; + gpios = <5 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + lb5 { + line-name = "beamforming:2g:lb5"; + gpios = <6 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; +}; + +&beamforming_5g_gpio { + /* Default beamforming switches configuration from stock firmware, + * the AP is started and for broadcast frames - all outputs high */ + hb0 { + line-name = "beamforming:5g:hb0"; + gpios = <0 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + hb1 { + line-name = "beamforming:5g:hb1"; + gpios = <1 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + hb2 { + line-name = "beamforming:5g:hb2"; + gpios = <2 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + hb3 { + line-name = "beamforming:5g:hb3"; + gpios = <3 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + hb4 { + line-name = "beamforming:5g:hb4"; + gpios = <4 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + hb5 { + line-name = "beamforming:5g:hb5"; + gpios = <5 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + hb6 { + line-name = "beamforming:5g:hb6"; + gpios = <6 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; + + hb7 { + line-name = "beamforming:5g:hb7"; + gpios = <7 GPIO_ACTIVE_HIGH>; + output-high; + gpio-hog; + }; +}; diff --git a/target/linux/ath79/dts/ar7161_ruckus_zf7363.dts b/target/linux/ath79/dts/ar7161_ruckus_zf7363.dts new file mode 100644 index 0000000000..4ece56dd0a --- /dev/null +++ b/target/linux/ath79/dts/ar7161_ruckus_zf7363.dts @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar7161_ruckus_zf734x.dtsi" + +/ { + model = "Ruckus ZoneFlex 7343/7363[-U]"; + compatible = "ruckus,zf7363", "qca,ar7161"; +}; + +&mdio0 { + ethernet-phy@0 { + reg = <0x0>; + max-speed = <100>; + }; + + ethernet-phy@1 { + reg = <0x1>; + max-speed = <100>; + }; +}; + +ð1 { + status = "okay"; + pll-data = <0x00110000 0x00001099 0x00991099>; + nvmem-cells = <&macaddr_bdata_6c>; + nvmem-cell-names = "mac-address"; + phy-mode = "rgmii-id"; + + fixed-link { + speed = <100>; + full-duplex; + }; +}; + +&board_data { + macaddr_bdata_6c: macaddr@6c { + reg = <0x6c 0x6>; + }; +}; diff --git a/target/linux/ath79/dts/ar7161_siemens_ws-ap3610.dts b/target/linux/ath79/dts/ar7161_siemens_ws-ap3610.dts index 2cdcce0d15..56a2cfab67 100644 --- a/target/linux/ath79/dts/ar7161_siemens_ws-ap3610.dts +++ b/target/linux/ath79/dts/ar7161_siemens_ws-ap3610.dts @@ -17,13 +17,6 @@ label-mac-device = ð0; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-output-names = "ref"; - clock-frequency = <40000000>; - }; - leds { compatible = "gpio-leds"; diff --git a/target/linux/ath79/dts/ar7161_trendnet_tew-673gru.dts b/target/linux/ath79/dts/ar7161_trendnet_tew-673gru.dts index 8657e291bd..a770ca04a8 100644 --- a/target/linux/ath79/dts/ar7161_trendnet_tew-673gru.dts +++ b/target/linux/ath79/dts/ar7161_trendnet_tew-673gru.dts @@ -16,13 +16,6 @@ led-upgrade = &led_wps; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-output-names = "ref"; - clock-frequency = <40000000>; - }; - leds { compatible = "gpio-leds"; @@ -65,7 +58,7 @@ }; }; }; - + virtual_flash { compatible = "mtd-concat"; devices = <&fwconcat0 &fwconcat1>; @@ -112,10 +105,6 @@ }; }; -&pll { - clocks = <&extosc>; -}; - &spi { status = "okay"; diff --git a/target/linux/ath79/dts/ar7161_ubnt_routerstation.dtsi b/target/linux/ath79/dts/ar7161_ubnt_routerstation.dtsi index 29550f2f6b..1899b90d90 100644 --- a/target/linux/ath79/dts/ar7161_ubnt_routerstation.dtsi +++ b/target/linux/ath79/dts/ar7161_ubnt_routerstation.dtsi @@ -14,13 +14,6 @@ led-upgrade = &led_rf; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-output-names = "ref"; - clock-frequency = <40000000>; - }; - leds { compatible = "gpio-leds"; @@ -106,22 +99,8 @@ &usb1 { status = "okay"; - #address-cells = <1>; - #size-cells = <0>; - - usb_ohci_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb2 { status = "okay"; - #address-cells = <1>; - #size-cells = <0>; - - usb_ehci_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; diff --git a/target/linux/ath79/dts/ar7240.dtsi b/target/linux/ath79/dts/ar7240.dtsi index 425d75f0d7..afbae33a80 100644 --- a/target/linux/ath79/dts/ar7240.dtsi +++ b/target/linux/ath79/dts/ar7240.dtsi @@ -32,6 +32,11 @@ #address-cells = <1>; #size-cells = <0>; + + hub_port: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; }; diff --git a/target/linux/ath79/dts/ar7240_openmesh_om2p-v1.dts b/target/linux/ath79/dts/ar7240_openmesh_om2p-v1.dts index 456724a750..a66d914015 100644 --- a/target/linux/ath79/dts/ar7240_openmesh_om2p-v1.dts +++ b/target/linux/ath79/dts/ar7240_openmesh_om2p-v1.dts @@ -122,10 +122,26 @@ reg = <0x8c0000 0x700000>; }; - art: partition@fc0000 { + partition@fc0000 { label = "ART"; reg = <0xfc0000 0x040000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + macaddr_art_6: macaddr@6 { + reg = <0x6 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; }; }; }; @@ -149,22 +165,9 @@ wifi@0,0 { compatible = "pci168c,002a"; reg = <0x0000 0 0 0 0>; - qca,no-eeprom; + nvmem-cells = <&calibration_art_1000>; + nvmem-cell-names = "calibration"; #gpio-cells = <2>; gpio-controller; }; }; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; - - macaddr_art_6: macaddr@6 { - reg = <0x6 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/ar7240_ruckus_zf7025.dts b/target/linux/ath79/dts/ar7240_ruckus_zf7025.dts new file mode 100644 index 0000000000..d2ecaed8db --- /dev/null +++ b/target/linux/ath79/dts/ar7240_ruckus_zf7025.dts @@ -0,0 +1,196 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar7240.dtsi" + +#include +#include + + +/ { + model = "Ruckus ZoneFlex 7025"; + compatible = "ruckus,zf7025", "qca,ar7240"; + + aliases { + led-boot = &led_power_green; + led-failsafe = &led_power_red; + led-running = &led_power_green; + led-upgrade = &led_power_red; + label-mac-device = ð0; + }; + + keys { + compatible = "gpio-keys"; + + hard-reset { + label = "hard-reset"; + linux,code = ; + gpios = <&gpio 12 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + }; + + leds: leds { + compatible = "gpio-leds"; + + pinctrl-names = "default"; + pinctrl-0 = <&jtag_disable_pins &switch_led_disable_pins &clks_disable_pins>; + + dir { + label = "green:dir"; + gpios = <&gpio 1 GPIO_ACTIVE_LOW>; + }; + + lan1 { + label = "green:lan1"; + gpios = <&gpio 16 GPIO_ACTIVE_LOW>; + }; + + lan2 { + label = "green:lan2"; + gpios = <&gpio 15 GPIO_ACTIVE_LOW>; + }; + + lan3 { + label = "green:lan3"; + gpios = <&gpio 14 GPIO_ACTIVE_LOW>; + }; + + lan4 { + label = "green:lan4"; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + }; + + lan5 { + label = "green:lan5"; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + }; + + opt { + label = "green:opt"; + gpios = <&gpio 8 GPIO_ACTIVE_LOW>; + }; + + led_power_red: power-red { + label = "red:power"; + gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + panic-indicator; + }; + + led_power_green: power-green { + label = "green:power"; + gpios = <&gpio 7 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + + wlan-green { + label = "green:wlan"; + gpios = <&gpio 0 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0assoc"; + }; + + wlan-yellow { + label = "yellow:wlan"; + gpios = <&gpio 6 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + }; + + reserved-memory { + #address-cells = <1>; + #size-cells = <1>; + ranges; + + ruckus-himem@3ff0000 { + /* Ruckus Himem area used to control + * redundant boot image selection + */ + compatible = "nvmem-rmem"; + reg = <0x3ff0000 0x10000>; + no-map; + }; + }; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <104000000>; + m25p,fast-read; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + reg = <0x0 0x40000>; + label = "u-boot"; + read-only; + }; + + /* On stock FW this encompasses rcks_wlan.main, + * rcks_wlan.bkup and datafs partitions + */ + partition@40000 { + compatible = "librecmc,uimage", "denx,uimage"; + reg = <0x40000 0xf40000>; + label = "firmware"; + }; + + partition@f80000 { + compatible = "u-boot,env"; + reg = <0xf80000 0x40000>; + label = "u-boot-env"; + }; + + board_data: partition@fc0000 { + reg = <0xfc0000 0x40000>; + label = "board-data"; + read-only; + }; + }; + }; +}; + +ð0 { + nvmem-cells = <&macaddr_board_data_66>; + nvmem-cell-names = "mac-address"; +}; + +ð1 { + status = "okay"; + nvmem-cells = <&macaddr_board_data_6c>; + nvmem-cell-names = "mac-address"; +}; + +&pcie { + status = "okay"; + + ath9k: wifi@0,0 { + compatible = "pci168c,002b"; + reg = <0x0000 0 0 0 0>; + nvmem-cells = <&macaddr_board_data_60>; + nvmem-cell-names = "mac-address"; + }; +}; + +&board_data { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_board_data_60: macaddr@60 { + reg = <0x60 0x6>; + }; + + macaddr_board_data_66: macaddr@66 { + reg = <0x66 0x6>; + }; + + macaddr_board_data_6c: macaddr@6c { + reg = <0x6c 0x6>; + }; +}; diff --git a/target/linux/ath79/dts/ar7241.dtsi b/target/linux/ath79/dts/ar7241.dtsi index ff7a61f921..8d0e60da40 100644 --- a/target/linux/ath79/dts/ar7241.dtsi +++ b/target/linux/ath79/dts/ar7241.dtsi @@ -39,6 +39,11 @@ #address-cells = <1>; #size-cells = <0>; + + hub_port: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; }; diff --git a/target/linux/ath79/dts/ar7241_netgear_wnr2200.dtsi b/target/linux/ath79/dts/ar7241_netgear_wnr2200.dtsi index 6119af4a03..e17a485396 100644 --- a/target/linux/ath79/dts/ar7241_netgear_wnr2200.dtsi +++ b/target/linux/ath79/dts/ar7241_netgear_wnr2200.dtsi @@ -183,12 +183,5 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; diff --git a/target/linux/ath79/dts/ar7241_tplink_tl-mr3x20.dtsi b/target/linux/ath79/dts/ar7241_tplink_tl-mr3x20.dtsi index 218ea5e429..a4bda13bce 100644 --- a/target/linux/ath79/dts/ar7241_tplink_tl-mr3x20.dtsi +++ b/target/linux/ath79/dts/ar7241_tplink_tl-mr3x20.dtsi @@ -25,14 +25,7 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/ar7241_tplink_tl-wr842n-v1.dts b/target/linux/ath79/dts/ar7241_tplink_tl-wr842n-v1.dts index df77ca0fdc..6ee7d9ec4f 100644 --- a/target/linux/ath79/dts/ar7241_tplink_tl-wr842n-v1.dts +++ b/target/linux/ath79/dts/ar7241_tplink_tl-wr842n-v1.dts @@ -78,14 +78,7 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/ar7241_ubnt_unifi-ap-lr.dts b/target/linux/ath79/dts/ar7241_ubnt_unifi-ap-lr.dts new file mode 100644 index 0000000000..ab2b455228 --- /dev/null +++ b/target/linux/ath79/dts/ar7241_ubnt_unifi-ap-lr.dts @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar7241_ubnt_unifi-ap.dtsi" + +/ { + compatible = "ubnt,unifi", "qca,ar7241"; + model = "Ubiquiti UniFi AP LR"; +}; diff --git a/target/linux/ath79/dts/ar7241_ubnt_unifi-ap-outdoor-plus.dts b/target/linux/ath79/dts/ar7241_ubnt_unifi-ap-outdoor-plus.dts index 9ccbdbd450..3f965ec9de 100644 --- a/target/linux/ath79/dts/ar7241_ubnt_unifi-ap-outdoor-plus.dts +++ b/target/linux/ath79/dts/ar7241_ubnt_unifi-ap-outdoor-plus.dts @@ -41,7 +41,7 @@ #address-cells = <1>; #size-cells = <1>; - uboot: partition@0 { + partition@0 { label = "u-boot"; reg = <0x0 0x40000>; read-only; @@ -82,10 +82,26 @@ read-only; }; - art: partition@ff0000 { + partition@ff0000 { label = "art"; reg = <0xff0000 0x10000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + macaddr_art_6: macaddr@6 { + reg = <0x6 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0xeb8>; + }; }; }; }; @@ -105,18 +121,6 @@ &wifi { ubnt,hsr; -}; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; - - macaddr_art_6: macaddr@6 { - reg = <0x6 0x6>; - }; + nvmem-cells = <&calibration_art_1000>; + nvmem-cell-names = "calibration"; }; diff --git a/target/linux/ath79/dts/ar7241_ubnt_unifi-ap.dts b/target/linux/ath79/dts/ar7241_ubnt_unifi-ap.dts new file mode 100644 index 0000000000..e9f57c0bbe --- /dev/null +++ b/target/linux/ath79/dts/ar7241_ubnt_unifi-ap.dts @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar7241_ubnt_unifi-ap.dtsi" + +/ { + compatible = "ubnt,unifi", "qca,ar7241"; + model = "Ubiquiti UniFi AP"; +}; diff --git a/target/linux/ath79/dts/ar7241_ubnt_unifi-ap.dtsi b/target/linux/ath79/dts/ar7241_ubnt_unifi-ap.dtsi new file mode 100644 index 0000000000..02166a26eb --- /dev/null +++ b/target/linux/ath79/dts/ar7241_ubnt_unifi-ap.dtsi @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar7241_ubnt_unifi.dtsi" + +/ { + aliases { + led-boot = &led_dome_green; + led-failsafe = &led_dome_green; + led-running = &led_dome_green; + led-upgrade = &led_dome_green; + }; + + leds { + compatible = "gpio-leds"; + + led_dome_green: dome_green { + label = "green:dome"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + }; + + dome_orange { + label = "orange:dome"; + gpios = <&gpio 1 GPIO_ACTIVE_HIGH>; + }; + }; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x000000 0x040000>; + read-only; + }; + + partition@40000 { + label = "u-boot-env"; + reg = <0x040000 0x010000>; + read-only; + }; + + partition@50000 { + compatible = "denx,uimage"; + label = "firmware"; + reg = <0x050000 0x750000>; + }; + + partition@7a0000 { + label = "board_config"; + reg = <0x7a0000 0x010000>; + read-only; + }; + + partition@7b0000 { + label = "cfg"; + reg = <0x7b0000 0x040000>; + read-only; + }; + + partition@7f0000 { + label = "art"; + reg = <0x7f0000 0x010000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + }; + }; + }; +}; + +&wifi { + nvmem-cells = <&calibration_art_1000>; + nvmem-cell-names = "calibration"; +}; + +ð0 { + nvmem-cells = <&macaddr_art_0>; + nvmem-cell-names = "mac-address"; +}; + +ð1 { + compatible = "syscon", "simple-mfd"; +}; diff --git a/target/linux/ath79/dts/ar7241_ubnt_unifi.dts b/target/linux/ath79/dts/ar7241_ubnt_unifi.dts deleted file mode 100644 index 3c50e89d01..0000000000 --- a/target/linux/ath79/dts/ar7241_ubnt_unifi.dts +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later OR MIT - -#include "ar7241_ubnt_unifi.dtsi" - -/ { - compatible = "ubnt,unifi", "qca,ar7241"; - model = "Ubiquiti UniFi AP"; - - aliases { - led-boot = &led_dome_green; - led-failsafe = &led_dome_green; - led-running = &led_dome_green; - led-upgrade = &led_dome_green; - }; - - leds { - compatible = "gpio-leds"; - - led_dome_green: dome_green { - label = "green:dome"; - gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; - }; - - dome_orange { - label = "orange:dome"; - gpios = <&gpio 1 GPIO_ACTIVE_HIGH>; - }; - }; -}; - -&spi { - status = "okay"; - - flash@0 { - compatible = "jedec,spi-nor"; - reg = <0>; - spi-max-frequency = <25000000>; - - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@0 { - label = "u-boot"; - reg = <0x000000 0x040000>; - read-only; - }; - - partition@40000 { - label = "u-boot-env"; - reg = <0x040000 0x010000>; - read-only; - }; - - partition@50000 { - compatible = "denx,uimage"; - label = "firmware"; - reg = <0x050000 0x750000>; - }; - - partition@7a0000 { - label = "board_config"; - reg = <0x7a0000 0x010000>; - read-only; - }; - - partition@7b0000 { - label = "cfg"; - reg = <0x7b0000 0x040000>; - read-only; - }; - - art: partition@7f0000 { - label = "art"; - reg = <0x7f0000 0x010000>; - read-only; - }; - }; - }; -}; - -ð0 { - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; -}; - -ð1 { - compatible = "syscon", "simple-mfd"; -}; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/ar7241_ubnt_unifi.dtsi b/target/linux/ath79/dts/ar7241_ubnt_unifi.dtsi index d05ed080a8..fa6c233733 100644 --- a/target/linux/ath79/dts/ar7241_ubnt_unifi.dtsi +++ b/target/linux/ath79/dts/ar7241_ubnt_unifi.dtsi @@ -10,12 +10,6 @@ label-mac-device = ð0; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <40000000>; - }; - keys { compatible = "gpio-keys"; @@ -27,16 +21,11 @@ }; }; -&pll { - clocks = <&extosc>; -}; - &pcie { status = "okay"; wifi: wifi@0,0 { reg = <0x0000 0 0 0 0>; - qca,no-eeprom; }; }; diff --git a/target/linux/ath79/dts/ar7242.dtsi b/target/linux/ath79/dts/ar7242.dtsi index eda1b16309..96b0442614 100644 --- a/target/linux/ath79/dts/ar7242.dtsi +++ b/target/linux/ath79/dts/ar7242.dtsi @@ -39,6 +39,11 @@ #address-cells = <1>; #size-cells = <0>; + + hub_port: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; }; diff --git a/target/linux/ath79/dts/ar7242_buffalo_wzr-bhr.dtsi b/target/linux/ath79/dts/ar7242_buffalo_wzr-bhr.dtsi index df28111598..15a808ad2a 100644 --- a/target/linux/ath79/dts/ar7242_buffalo_wzr-bhr.dtsi +++ b/target/linux/ath79/dts/ar7242_buffalo_wzr-bhr.dtsi @@ -12,12 +12,6 @@ led-upgrade = &led_diag; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <40000000>; - }; - keys: keys { compatible = "gpio-keys"; @@ -123,8 +117,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x1>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "rgmii"; @@ -138,21 +130,10 @@ phy-handle = <&phy0>; }; -&pll { - clocks = <&extosc>; -}; - &usb_phy { status = "okay"; }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; diff --git a/target/linux/ath79/dts/ar7242_buffalo_wzr-hp-g302h-a1a0.dts b/target/linux/ath79/dts/ar7242_buffalo_wzr-hp-g302h-a1a0.dts index fa3c47354e..4a2f749cc4 100644 --- a/target/linux/ath79/dts/ar7242_buffalo_wzr-hp-g302h-a1a0.dts +++ b/target/linux/ath79/dts/ar7242_buffalo_wzr-hp-g302h-a1a0.dts @@ -15,12 +15,6 @@ led-upgrade = &led_diag; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <40000000>; - }; - keys { compatible = "gpio-keys"; @@ -139,10 +133,22 @@ label = "u-boot-env"; }; - art: partition@50000 { + partition@50000 { reg = <0x50000 0x10000>; label = "art"; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_120c: macaddr@120c { + reg = <0x120c 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0xeb8>; + }; }; partition@60000 { @@ -179,8 +185,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x1>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "rgmii"; @@ -205,39 +209,17 @@ ath9k: wifi@0,0 { compatible = "pci168c,002a"; reg = <0x0000 0 0 0 0>; - nvmem-cells = <&macaddr_art_120c>; - nvmem-cell-names = "mac-address"; - qca,no-eeprom; + nvmem-cells = <&macaddr_art_120c>, <&calibration_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; #gpio-cells = <2>; gpio-controller; }; }; -&pll { - clocks = <&extosc>; -}; - &usb_phy { status = "okay"; }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; -}; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_120c: macaddr@120c { - reg = <0x120c 0x6>; - }; }; diff --git a/target/linux/ath79/dts/ar7242_meraki_mr12.dts b/target/linux/ath79/dts/ar7242_meraki_mr12.dts index 5e82b5bb6b..42b4966e74 100644 --- a/target/linux/ath79/dts/ar7242_meraki_mr12.dts +++ b/target/linux/ath79/dts/ar7242_meraki_mr12.dts @@ -16,13 +16,6 @@ led-upgrade = &led_power_orange; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-output-names = "ref"; - clock-frequency = <40000000>; - }; - leds { compatible = "gpio-leds"; @@ -87,10 +80,6 @@ }; }; -&pll { - clocks = <&extosc>; -}; - &mdio0 { status = "okay"; diff --git a/target/linux/ath79/dts/ar7242_tplink_tl-wr2543-v1.dts b/target/linux/ath79/dts/ar7242_tplink_tl-wr2543-v1.dts index ae4867521a..e250f2a5b4 100644 --- a/target/linux/ath79/dts/ar7242_tplink_tl-wr2543-v1.dts +++ b/target/linux/ath79/dts/ar7242_tplink_tl-wr2543-v1.dts @@ -21,12 +21,6 @@ bootargs = "console=ttyS0,115200n8"; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <40000000>; - }; - keys { compatible = "gpio-keys"; @@ -95,10 +89,6 @@ }; }; -&pll { - clocks = <&extosc>; -}; - &spi { status = "okay"; @@ -125,7 +115,7 @@ reg = <0x020000 0x7d0000>; }; - partition@7f0000 { + art: partition@7f0000 { label = "art"; reg = <0x7f0000 0x010000>; read-only; @@ -135,14 +125,7 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { @@ -156,9 +139,8 @@ reg = <0x0000 0 0 0 0>; #gpio-cells = <2>; gpio-controller; - qca,no-eeprom; - nvmem-cells = <&macaddr_uboot_1fc00>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_uboot_1fc00>, <&cal_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; }; }; @@ -185,3 +167,13 @@ reg = <0x1fc00 0x6>; }; }; + +&art { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + cal_art_1000: cal@1000 { + reg = <0x1000 0x440>; + }; +}; diff --git a/target/linux/ath79/dts/ar7242_ubnt_edgeswitch-8xp.dts b/target/linux/ath79/dts/ar7242_ubnt_edgeswitch-8xp.dts index 0c2fe394d4..2ee7ab56c5 100644 --- a/target/linux/ath79/dts/ar7242_ubnt_edgeswitch-8xp.dts +++ b/target/linux/ath79/dts/ar7242_ubnt_edgeswitch-8xp.dts @@ -110,8 +110,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x10>; - ethernet-switch@1e { compatible = "brcm,bcm53128"; reg = <0x1e>; @@ -162,7 +160,6 @@ phy0: port8@8 { reg = <8>; - label = "cpu"; ethernet = <ð0>; fixed-link { diff --git a/target/linux/ath79/dts/ar7242_ubnt_sw.dtsi b/target/linux/ath79/dts/ar7242_ubnt_sw.dtsi index c776c8ef6e..0268146b06 100644 --- a/target/linux/ath79/dts/ar7242_ubnt_sw.dtsi +++ b/target/linux/ath79/dts/ar7242_ubnt_sw.dtsi @@ -114,14 +114,7 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &pcie { diff --git a/target/linux/ath79/dts/ar724x.dtsi b/target/linux/ath79/dts/ar724x.dtsi index 882b0bc51a..c090eb5e0f 100644 --- a/target/linux/ath79/dts/ar724x.dtsi +++ b/target/linux/ath79/dts/ar724x.dtsi @@ -24,6 +24,13 @@ }; }; + extosc: ref { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-output-names = "ref"; + clock-frequency = <40000000>; + }; + ahb: ahb { apb { ddr_ctrl: memory-controller@18000000 { @@ -89,8 +96,8 @@ compatible = "qca,ar7240-pll", "syscon"; reg = <0x18050000 0x3c>; + clocks = <&extosc>; clock-names = "ref"; - /* The board must provides the ref clock */ #clock-cells = <1>; clock-output-names = "cpu", "ddr", "ahb"; diff --git a/target/linux/ath79/dts/ar9132.dtsi b/target/linux/ath79/dts/ar9132.dtsi index 44a5870ad7..71181c46de 100644 --- a/target/linux/ath79/dts/ar9132.dtsi +++ b/target/linux/ath79/dts/ar9132.dtsi @@ -24,6 +24,13 @@ }; }; + extosc: ref { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-output-names = "ref"; + clock-frequency = <40000000>; + }; + cpuintc: interrupt-controller { compatible = "qca,ar9132-cpu-intc", "qca,ar7100-cpu-intc"; @@ -94,8 +101,8 @@ "qca,ar9130-pll", "syscon"; reg = <0x18050000 0x20>; + clocks = <&extosc>; clock-names = "ref"; - /* The board must provides the ref clock */ #clock-cells = <1>; clock-output-names = "cpu", "ddr", "ahb"; @@ -145,6 +152,14 @@ phys = <&usb_phy>; status = "disabled"; + + #address-cells = <1>; + #size-cells = <0>; + + hub_port: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; spi: spi@1f000000 { diff --git a/target/linux/ath79/dts/ar9132_buffalo_wzr-hp-g300nh.dtsi b/target/linux/ath79/dts/ar9132_buffalo_wzr-hp-g300nh.dtsi index 7b0c09f68e..ac3af13457 100644 --- a/target/linux/ath79/dts/ar9132_buffalo_wzr-hp-g300nh.dtsi +++ b/target/linux/ath79/dts/ar9132_buffalo_wzr-hp-g300nh.dtsi @@ -11,12 +11,6 @@ led-upgrade = &led_diag; }; - clock40mhz: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <40000000>; - }; - /* There is a GPIO driven NXP 74HC153 dual 4-way multiplexer on board * used for buttons that are on top of the the device. */ @@ -184,14 +178,12 @@ gpio-sda = <&gpio 19 GPIO_ACTIVE_HIGH>; gpio-sck = <&gpio 20 GPIO_ACTIVE_HIGH>; - mii-bus = <&mdio0>; mdio-bus { status = "okay"; #address-cells = <1>; #size-cells = <0>; - phy-mask = <0x10>; phy4: ethernet-phy@4 { reg = <4>; @@ -251,20 +243,8 @@ status = "okay"; }; -&pll { - clocks = <&clock40mhz>; -}; - &usb { status = "okay"; - - #address-cells = <1>; - #size-cells = <0>; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/ar9132_tplink_tl-wa901nd-v2.dts b/target/linux/ath79/dts/ar9132_tplink_tl-wa901nd-v2.dts index 354213c440..fd4a6c7a4d 100644 --- a/target/linux/ath79/dts/ar9132_tplink_tl-wa901nd-v2.dts +++ b/target/linux/ath79/dts/ar9132_tplink_tl-wa901nd-v2.dts @@ -17,12 +17,6 @@ label-mac-device = ð0; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <40000000>; - }; - keys { compatible = "gpio-keys"; @@ -62,10 +56,6 @@ }; }; -&pll { - clocks = <&extosc>; -}; - &spi { status = "okay"; diff --git a/target/linux/ath79/dts/ar9132_tplink_tl-wr1043nd-v1.dts b/target/linux/ath79/dts/ar9132_tplink_tl-wr1043nd-v1.dts index 12e417d3a4..6eb2a0acb5 100644 --- a/target/linux/ath79/dts/ar9132_tplink_tl-wr1043nd-v1.dts +++ b/target/linux/ath79/dts/ar9132_tplink_tl-wr1043nd-v1.dts @@ -17,12 +17,6 @@ label-mac-device = ð0; }; - extosc: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <40000000>; - }; - keys { compatible = "gpio-keys"; @@ -79,19 +73,8 @@ }; }; -&pll { - clocks = <&extosc>; -}; - &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/ar9132_tplink_tl-wr941-v2.dts b/target/linux/ath79/dts/ar9132_tplink_tl-wr941-v2.dts index 58586eb036..106ca56e7e 100644 --- a/target/linux/ath79/dts/ar9132_tplink_tl-wr941-v2.dts +++ b/target/linux/ath79/dts/ar9132_tplink_tl-wr941-v2.dts @@ -99,7 +99,6 @@ port@5 { reg = <5>; - label = "cpu"; ethernet = <ð0>; }; }; diff --git a/target/linux/ath79/dts/ar9330.dtsi b/target/linux/ath79/dts/ar9330.dtsi index aed8e205ad..466e0fb25d 100644 --- a/target/linux/ath79/dts/ar9330.dtsi +++ b/target/linux/ath79/dts/ar9330.dtsi @@ -28,6 +28,12 @@ bootargs = "console=ttyATH0,115200"; }; + ref: ref { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-output-names = "ref"; + }; + ahb { apb { ddr_ctrl: memory-controller@18000000 { @@ -83,7 +89,11 @@ compatible = "qca,ar9330-pll"; reg = <0x18050000 0x100>; + clocks = <&ref>; + clock-names = "ref"; + #clock-cells = <1>; + clock-output-names = "cpu", "ddr", "ahb"; }; wdt: wdt@18060008 { @@ -119,6 +129,11 @@ #address-cells = <1>; #size-cells = <0>; + + hub_port: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; spi: spi@1f000000 { diff --git a/target/linux/ath79/dts/ar9331.dtsi b/target/linux/ath79/dts/ar9331.dtsi index 2141f33863..d363130278 100644 --- a/target/linux/ath79/dts/ar9331.dtsi +++ b/target/linux/ath79/dts/ar9331.dtsi @@ -4,9 +4,4 @@ / { compatible = "qca,ar9331"; - - ref: ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - }; }; diff --git a/target/linux/ath79/dts/ar9331_arduino_yun.dts b/target/linux/ath79/dts/ar9331_arduino_yun.dts index 389a83dd22..bf3a46f962 100644 --- a/target/linux/ath79/dts/ar9331_arduino_yun.dts +++ b/target/linux/ath79/dts/ar9331_arduino_yun.dts @@ -57,7 +57,7 @@ usb { label = "white:usb"; gpios = <&gpio 1 GPIO_ACTIVE_HIGH>; - trigger-sources = <&hub_port1>; + trigger-sources = <&hub_port>; linux,default-trigger = "usbport"; }; }; @@ -125,22 +125,8 @@ &usb { status = "okay"; - #address-cells = <1>; - #size-cells = <0>; dr_mode = "host"; vbus-supply = <®_usb_vbus>; - - port@1 { - #address-cells = <1>; - #size-cells = <0>; - reg = <1>; - #trigger-source-cells = <0>; - - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/ar9331_hiwifi_hc6361.dts b/target/linux/ath79/dts/ar9331_hiwifi_hc6361.dts new file mode 100644 index 0000000000..05d3f6730e --- /dev/null +++ b/target/linux/ath79/dts/ar9331_hiwifi_hc6361.dts @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9331.dtsi" + +#include +#include + +/ { + model = "HiWiFi HC6361"; + compatible = "hiwifi,hc6361", "qca,ar9331"; + + aliases { + serial0 = &uart; + led-boot = &led_system; + led-failsafe = &led_system; + led-running = &led_system; + led-upgrade = &led_system; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + }; + + leds { + compatible = "gpio-leds"; + + led_system: system { + label = "blue:system"; + gpios = <&gpio 1 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + wlan { + label = "blue:wlan"; + gpios = <&gpio 0 GPIO_ACTIVE_LOW>; + }; + wan { + label = "blue:wan"; + gpios = <&gpio 27 GPIO_ACTIVE_LOW>; + }; + }; + + reg_usb_vbus: regulator { + compatible = "regulator-fixed"; + regulator-name = "usb_vbus"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + enable-active-high; + gpio = <&gpio 20 GPIO_ACTIVE_HIGH>; + }; +}; + +&spi { + status = "okay"; + num-cs = <1>; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + uboot: partition@0 { + reg = <0x0 0x10000>; + label = "u-boot"; + read-only; + }; + + bdinfo: partition@10000 { + reg = <0x10000 0x10000>; + label = "bdinfo"; + read-only; + }; + + firmware: partition@20000 { + compatible = "denx,uimage"; + reg = <0x20000 0xfc0000>; + label = "firmware"; + }; + + backup: partition@fe0000 { + reg = <0xfe0000 0x10000>; + label = "backup"; + read-only; + }; + + art: partition@ff0000 { + reg = <0xff0000 0x10000>; + label = "art"; + read-only; + }; + }; + }; +}; + +&gpio { + status = "okay"; +}; + +&uart { + status = "okay"; +}; + +&usb { + status = "okay"; + dr_mode = "host"; + vbus-supply = <®_usb_vbus>; +}; + +&usb_phy { + status = "okay"; +}; + +ð0 { + status = "okay"; + + nvmem-cells = <&macaddr_bdinfo_18a>; + nvmem-cell-names = "mac-address-ascii"; + mac-address-increment = <1>; +}; + +ð1 { + status = "okay"; + + nvmem-cells = <&macaddr_bdinfo_18a>; + nvmem-cell-names = "mac-address-ascii"; +}; + +&wmac { + status = "okay"; + mtd-cal-data = <&art 0x1000>; + + nvmem-cells = <&macaddr_bdinfo_18a>; + nvmem-cell-names = "mac-address-ascii"; + mac-address-increment = <2>; +}; + +&bdinfo { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_bdinfo_18a: macaddr@18a { + reg = <0x18a 0x11>; + }; +}; diff --git a/target/linux/ath79/dts/ar9331_tplink_tl-mr3020-v1.dts b/target/linux/ath79/dts/ar9331_tplink_tl-mr3020-v1.dts index c420c1a4cd..c23e5dac51 100644 --- a/target/linux/ath79/dts/ar9331_tplink_tl-mr3020-v1.dts +++ b/target/linux/ath79/dts/ar9331_tplink_tl-mr3020-v1.dts @@ -86,16 +86,9 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; dr_mode = "host"; vbus-supply = <®_usb_vbus>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/ar9331_tplink_tl-mr3040-v2.dts b/target/linux/ath79/dts/ar9331_tplink_tl-mr3040-v2.dts index 619fd09ee9..b0f24bbfa7 100644 --- a/target/linux/ath79/dts/ar9331_tplink_tl-mr3040-v2.dts +++ b/target/linux/ath79/dts/ar9331_tplink_tl-mr3040-v2.dts @@ -82,16 +82,9 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; dr_mode = "host"; vbus-supply = <®_usb_vbus>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/ar9341_tplink_tl-mr3420-v2.dts b/target/linux/ath79/dts/ar9341_tplink_tl-mr3420-v2.dts index f86c4423bf..2ccd50d783 100644 --- a/target/linux/ath79/dts/ar9341_tplink_tl-mr3420-v2.dts +++ b/target/linux/ath79/dts/ar9341_tplink_tl-mr3420-v2.dts @@ -82,14 +82,7 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/ar9341_tplink_tl-wr842n-v2.dts b/target/linux/ath79/dts/ar9341_tplink_tl-wr842n-v2.dts index 5d20df9261..0fc3488445 100644 --- a/target/linux/ath79/dts/ar9341_tplink_tl-wr842n-v2.dts +++ b/target/linux/ath79/dts/ar9341_tplink_tl-wr842n-v2.dts @@ -83,14 +83,7 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/ar9341_tplink_tl-wr941nd-v5.dts b/target/linux/ath79/dts/ar9341_tplink_tl-wr941nd-v5.dts new file mode 100644 index 0000000000..a61f4a381e --- /dev/null +++ b/target/linux/ath79/dts/ar9341_tplink_tl-wr941nd-v5.dts @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9341_tplink.dtsi" + +/ { + model = "TP-Link TL-WR941ND v5"; + compatible = "tplink,tl-wr941nd-v5", "qca,ar9341"; + + aliases { + label-mac-device = &wmac; + }; + + keys { + compatible = "gpio-keys"; + + rfkill { + label = "WiFi"; + linux,code = ; + gpios = <&gpio 16 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + + reset { + label = "Reset/WPS"; + linux,code = ; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + }; +}; + +&leds { + + lan3 { + gpios = <&gpio 2 GPIO_ACTIVE_LOW>; + }; + + lan4 { + gpios = <&gpio 3 GPIO_ACTIVE_LOW>; + }; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + uboot: partition@0 { + label = "u-boot"; + reg = <0x000000 0x020000>; + read-only; + }; + + partition@20000 { + compatible = "tplink,firmware"; + label = "firmware"; + reg = <0x020000 0x3d0000>; + }; + + art: partition@3f0000 { + label = "art"; + reg = <0x3f0000 0x010000>; + read-only; + }; + }; + }; +}; + +ð0 { // WAN port, initialized last as eth1 + nvmem-cells = <&macaddr_uboot_1fc00>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <1>; +}; + +ð1 { // LAN ports, initialized first as eth0 + nvmem-cells = <&macaddr_uboot_1fc00>; + nvmem-cell-names = "mac-address"; +}; + +&wmac { + mtd-cal-data = <&art 0x1000>; + + nvmem-cells = <&macaddr_uboot_1fc00>; + nvmem-cell-names = "mac-address"; +}; + +&uboot { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_uboot_1fc00: macaddr@1fc00 { + reg = <0x1fc00 0x6>; + }; +}; diff --git a/target/linux/ath79/dts/ar9342_ubnt_aircube-ac.dts b/target/linux/ath79/dts/ar9342_ubnt_aircube-ac.dts index 15e23f2421..49cf39062a 100644 --- a/target/linux/ath79/dts/ar9342_ubnt_aircube-ac.dts +++ b/target/linux/ath79/dts/ar9342_ubnt_aircube-ac.dts @@ -58,10 +58,26 @@ read-only; }; - art: partition@ff0000 { + partition@ff0000 { label = "art"; reg = <0xff0000 0x010000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x844>; + }; }; }; }; @@ -73,12 +89,18 @@ &pcie { status = "okay"; + + wifi@0,0 { + compatible = "qcom,ath10k"; + reg = <0x0 0 0 0 0>; + nvmem-cells = <&calibration_art_5000>; + nvmem-cell-names = "calibration"; + }; }; &mdio0 { status = "okay"; - phy-mask = <4>; phy0: ethernet-phy@0 { phy-mode = "rgmii"; reg = <0>; @@ -110,15 +132,6 @@ &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; -}; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; + nvmem-cells = <&calibration_art_1000>; + nvmem-cell-names = "calibration"; }; diff --git a/target/linux/ath79/dts/ar9342_ubnt_bullet-m-xw.dts b/target/linux/ath79/dts/ar9342_ubnt_bullet-m-xw.dts index 0101820ecd..c448ac4e61 100644 --- a/target/linux/ath79/dts/ar9342_ubnt_bullet-m-xw.dts +++ b/target/linux/ath79/dts/ar9342_ubnt_bullet-m-xw.dts @@ -10,7 +10,6 @@ &mdio0 { status = "okay"; - phy-mask = <4>; phy4: ethernet-phy@4 { phy-mode = "rgmii"; reg = <4>; diff --git a/target/linux/ath79/dts/ar9342_ubnt_nanobeam-m5-xw.dts b/target/linux/ath79/dts/ar9342_ubnt_nanobeam-m5-xw.dts index 86a5e3a751..9b9b217f24 100644 --- a/target/linux/ath79/dts/ar9342_ubnt_nanobeam-m5-xw.dts +++ b/target/linux/ath79/dts/ar9342_ubnt_nanobeam-m5-xw.dts @@ -10,8 +10,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x1>; - phy1: ethernet-phy@1 { reg = <1>; phy-mode = "mii"; diff --git a/target/linux/ath79/dts/ar9342_ubnt_nanostation-loco-m-xw.dts b/target/linux/ath79/dts/ar9342_ubnt_nanostation-loco-m-xw.dts index 5a7448eb19..c71cf11dd2 100644 --- a/target/linux/ath79/dts/ar9342_ubnt_nanostation-loco-m-xw.dts +++ b/target/linux/ath79/dts/ar9342_ubnt_nanostation-loco-m-xw.dts @@ -10,8 +10,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x1>; - phy1: ethernet-phy@1 { reg = <1>; phy-mode = "mii"; diff --git a/target/linux/ath79/dts/ar9342_ubnt_nanostation-m-xw.dts b/target/linux/ath79/dts/ar9342_ubnt_nanostation-m-xw.dts index c8e153e54f..e359297661 100644 --- a/target/linux/ath79/dts/ar9342_ubnt_nanostation-m-xw.dts +++ b/target/linux/ath79/dts/ar9342_ubnt_nanostation-m-xw.dts @@ -11,7 +11,6 @@ status = "okay"; phy4-mii-enable; - phy-mask = <0x23>; phy0: ethernet-phy@0 { reg = <0>; diff --git a/target/linux/ath79/dts/ar9342_ubnt_powerbeam-m2-xw.dts b/target/linux/ath79/dts/ar9342_ubnt_powerbeam-m2-xw.dts index 046715b00a..762a17b177 100644 --- a/target/linux/ath79/dts/ar9342_ubnt_powerbeam-m2-xw.dts +++ b/target/linux/ath79/dts/ar9342_ubnt_powerbeam-m2-xw.dts @@ -10,8 +10,6 @@ &mdio0 { status = "okay"; - phy-mask = <4>; - phy1: ethernet-phy@1 { reg = <1>; }; diff --git a/target/linux/ath79/dts/ar9342_ubnt_powerbeam-m5-xw.dts b/target/linux/ath79/dts/ar9342_ubnt_powerbeam-m5-xw.dts index e5a9af3905..978a05fed6 100644 --- a/target/linux/ath79/dts/ar9342_ubnt_powerbeam-m5-xw.dts +++ b/target/linux/ath79/dts/ar9342_ubnt_powerbeam-m5-xw.dts @@ -10,8 +10,6 @@ &mdio0 { status = "okay"; - phy-mask = <4>; - phy4: ethernet-phy@4 { reg = <4>; }; diff --git a/target/linux/ath79/dts/ar9342_ubnt_wa_1port.dtsi b/target/linux/ath79/dts/ar9342_ubnt_wa_1port.dtsi index 045cbe8985..2b943fe7ea 100644 --- a/target/linux/ath79/dts/ar9342_ubnt_wa_1port.dtsi +++ b/target/linux/ath79/dts/ar9342_ubnt_wa_1port.dtsi @@ -5,8 +5,6 @@ &mdio0 { status = "okay"; - phy-mask = <4>; - phy4: ethernet-phy@4 { reg = <4>; }; diff --git a/target/linux/ath79/dts/ar9342_ubnt_wa_2port.dtsi b/target/linux/ath79/dts/ar9342_ubnt_wa_2port.dtsi index 2567c77759..13ddd800d3 100644 --- a/target/linux/ath79/dts/ar9342_ubnt_wa_2port.dtsi +++ b/target/linux/ath79/dts/ar9342_ubnt_wa_2port.dtsi @@ -5,8 +5,6 @@ &mdio0 { status = "okay"; - phy-mask = <4>; - phy0: ethernet-phy@0 { phy-mode = "rgmii"; reg = <0>; diff --git a/target/linux/ath79/dts/ar9342_zyxel_nwa1100-nh.dts b/target/linux/ath79/dts/ar9342_zyxel_nwa1100-nh.dts new file mode 100644 index 0000000000..fd438059e5 --- /dev/null +++ b/target/linux/ath79/dts/ar9342_zyxel_nwa1100-nh.dts @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9342_zyxel_nwa11xx.dtsi" + +/ { + compatible = "zyxel,nwa1100-nh", "qca,ar9342"; + model = "Zyxel NWA1100-NH"; + + aliases { + label-mac-device = ð0; + led-boot = &led_status_green; + led-failsafe = &led_status_red; + led-running = &led_status_green; + led-upgrade = &led_status_red; + }; + leds { + compatible = "gpio-leds"; + + led_status_green: status_green { + label = "green:status"; + gpios = <&gpio 12 GPIO_ACTIVE_HIGH>; + default-state = "on"; + }; + + led_status_red: status_red { + label = "red:status"; + gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + }; + + led_wlan_green: wlan_green { + label = "green:wlan"; + gpios = <&gpio 15 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + + led_lan_green: lan_green { + label = "green:lan"; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + }; + + led_lan_amber: lan_amber { + label = "amber:lan"; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + }; + }; +}; diff --git a/target/linux/ath79/dts/ar9342_zyxel_nwa1121-ni.dts b/target/linux/ath79/dts/ar9342_zyxel_nwa1121-ni.dts new file mode 100644 index 0000000000..65dc8c0440 --- /dev/null +++ b/target/linux/ath79/dts/ar9342_zyxel_nwa1121-ni.dts @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9342_zyxel_nwa11xx.dtsi" + +/ { + compatible = "zyxel,nwa1121-ni", "qca,ar9342"; + model = "Zyxel NWA1121-NI"; + + aliases { + label-mac-device = ð0; + led-boot = &led_status_green; + led-failsafe = &led_status_amber; + led-running = &led_status_green; + led-upgrade = &led_status_amber; + }; + + leds { + compatible = "gpio-leds"; + + led_status_green: status_green { + label = "green:status"; + gpios = <&gpio 12 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + + led_status_amber: status_amber { + label = "amber:status"; + gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + }; + }; +}; diff --git a/target/linux/ath79/dts/ar9342_zyxel_nwa1123-ni.dts b/target/linux/ath79/dts/ar9342_zyxel_nwa1123-ni.dts new file mode 100644 index 0000000000..b999c960c4 --- /dev/null +++ b/target/linux/ath79/dts/ar9342_zyxel_nwa1123-ni.dts @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9342_zyxel_nwa11xx.dtsi" + +/ { + compatible = "zyxel,nwa1123-ni", "qca,ar9342"; + model = "Zyxel NWA1123-NI"; + + aliases { + label-mac-device = ð0; + led-boot = &led_status_green; + led-failsafe = &led_status_amber; + led-running = &led_status_green; + led-upgrade = &led_status_amber; + }; + + leds { + compatible = "gpio-leds"; + + led_status_green: status_green { + label = "green:status"; + gpios = <&gpio 12 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + + led_status_amber: status_amber { + label = "amber:status"; + gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + }; + }; +}; + +&pcie { + status = "okay"; +}; diff --git a/target/linux/ath79/dts/ar9342_zyxel_nwa11xx.dtsi b/target/linux/ath79/dts/ar9342_zyxel_nwa11xx.dtsi new file mode 100644 index 0000000000..2bf680703c --- /dev/null +++ b/target/linux/ath79/dts/ar9342_zyxel_nwa11xx.dtsi @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9344.dtsi" + +#include +#include +#include + +/ { + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 4 GPIO_ACTIVE_LOW>; + }; + }; + + virtual_flash { + compatible = "mtd-concat"; + + devices = <&fwconcat0 &fwconcat1>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + compatible = "librecmc,uimage", "denx,uimage"; + librecmc,ih-magic = ; + label = "firmware"; + reg = <0x0 0x0>; + }; + }; + }; +}; + +&ref { + clock-frequency = <40000000>; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <50000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x000000 0x040000>; + read-only; + }; + + partition@40000 { + label = "u-boot-env"; + reg = <0x040000 0x010000>; + }; + + fwconcat0: partition@50000 { + label = "fwconcat0"; + reg = <0x050000 0x800000>; + }; + + partition@850000 { + label = "loader"; + reg = <0x850000 0x010000>; + read-only; + }; + + fwconcat1: partition@860000 { + label = "fwconcat1"; + reg = <0x860000 0x740000>; + }; + + partition@fa0000 { + label = "config"; + reg = <0xfa0000 0x040000>; + read-only; + }; + + partition@fe0000 { + label = "mib0"; + reg = <0xfe0000 0x010000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_mib0_4b: macaddr@4b { + reg = <0x4b 0x11>; + }; + + macaddr_mib0_66: macaddr@66 { + reg = <0x66 0x11>; + }; + }; + + art: partition@ff0000 { + label = "art"; + reg = <0xff0000 0x010000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + calibration_ath9k: calibration@1000 { + reg = <0x1000 0x440>; + }; + + macaddr_art_1002: macaddr@1002 { + reg = <0x1002 0x6>; + }; + }; + }; + }; +}; + +&mdio0 { + status = "okay"; + + phy0: ethernet-phy@0 { + reg = <0>; + phy-mode = "rgmii"; + }; +}; + +ð0 { + status = "okay"; + + pll-data = <0x06000000 0x00000101 0x00001313>; + + nvmem-cells = <&macaddr_art_1002>; + nvmem-cell-names = "mac-address"; + + phy-mode = "rgmii-id"; + phy-handle = <&phy0>; + + gmac-config { + device = <&gmac>; + rxdv-delay = <3>; + rxd-delay = <3>; + txen-delay = <3>; + txd-delay = <3>; + rgmii-gmac0 = <1>; + }; +}; + +&wmac { + status = "okay"; + + ieee80211-freq-limit = <2402000 2482000>; + + nvmem-cells = <&macaddr_mib0_4b>, <&calibration_ath9k>; + nvmem-cell-names = "mac-address-ascii", "calibration"; +}; diff --git a/target/linux/ath79/dts/ar9344_araknis_an-300-ap-i-n.dts b/target/linux/ath79/dts/ar9344_araknis_an-300-ap-i-n.dts index a886b4c001..ac39a62679 100644 --- a/target/linux/ath79/dts/ar9344_araknis_an-300-ap-i-n.dts +++ b/target/linux/ath79/dts/ar9344_araknis_an-300-ap-i-n.dts @@ -87,11 +87,10 @@ ath9k: wifi@0,0,0 { compatible = "pci168c,0030"; reg = <0x0 0 0 0 0>; - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_0>, <&calibration_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <1>; - qca,disable-5ghz; - qca,no-eeprom; + ieee80211-freq-limit = <2402000 2482000>; #gpio-cells = <2>; gpio-controller; }; @@ -100,12 +99,10 @@ &wmac { status = "okay"; - qca,disable-2ghz; + ieee80211-freq-limit = <4900000 5990000>; - mtd-cal-data = <&art 0x1000>; - - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_0>, <&calibration_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <2>; }; @@ -117,4 +114,12 @@ macaddr_art_0: macaddr@0 { reg = <0x0 0x6>; }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x440>; + }; }; diff --git a/target/linux/ath79/dts/ar9344_atheros_db120.dts b/target/linux/ath79/dts/ar9344_atheros_db120.dts index 9198983b36..e11e3eb4bf 100644 --- a/target/linux/ath79/dts/ar9344_atheros_db120.dts +++ b/target/linux/ath79/dts/ar9344_atheros_db120.dts @@ -41,7 +41,7 @@ usb { label = "green:usb"; gpios = <&gpio 11 GPIO_ACTIVE_LOW>; - trigger-sources = <&hub_port1>; + trigger-sources = <&hub_port>; linux,default-trigger = "usbport"; }; }; @@ -135,10 +135,30 @@ reg = <0x7e0000 0x010000>; }; - art: partition@7f0000 { + partition@7f0000 { label = "art"; reg = <0x7f0000 0x010000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + macaddr_art_6: macaddr@6 { + reg = <0x6 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x440>; + }; }; }; }; @@ -159,8 +179,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; @@ -206,7 +224,8 @@ ath9k: wifi@0,0 { compatible = "pci168c,0030"; reg = <0x0000 0 0 0 0>; - qca,no-eeprom; + nvmem-cells = <&calibration_art_5000>; + nvmem-cell-names = "calibration"; ieee80211-freq-limit = <4900000 5990000>; #gpio-cells = <2>; gpio-controller; @@ -216,35 +235,14 @@ &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; + nvmem-cells = <&calibration_art_1000>; + nvmem-cell-names = "calibration"; }; &usb { status = "okay"; - - #address-cells = <1>; - #size-cells = <0>; - - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { status = "okay"; }; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; - - macaddr_art_6: macaddr@6 { - reg = <0x6 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/ar9344_compex_wpj344-16m.dts b/target/linux/ath79/dts/ar9344_compex_wpj344-16m.dts index 8d42f0c211..e456f1f0e5 100644 --- a/target/linux/ath79/dts/ar9344_compex_wpj344-16m.dts +++ b/target/linux/ath79/dts/ar9344_compex_wpj344-16m.dts @@ -116,8 +116,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "rgmii"; diff --git a/target/linux/ath79/dts/ar9344_dlink_dir-825-c1.dts b/target/linux/ath79/dts/ar9344_dlink_dir-825-c1.dts index e6f18cea69..35d0e26d85 100644 --- a/target/linux/ath79/dts/ar9344_dlink_dir-825-c1.dts +++ b/target/linux/ath79/dts/ar9344_dlink_dir-825-c1.dts @@ -28,7 +28,7 @@ label = "blue:usb"; gpios = <&gpio 11 GPIO_ACTIVE_LOW>; linux,default-trigger = "usbport"; - trigger-sources = <&hub_port1>; + trigger-sources = <&hub_port>; }; wan_blue { diff --git a/target/linux/ath79/dts/ar9344_dlink_dir-8x5.dtsi b/target/linux/ath79/dts/ar9344_dlink_dir-8x5.dtsi index e591ecd1b8..8e21b0dd9e 100644 --- a/target/linux/ath79/dts/ar9344_dlink_dir-8x5.dtsi +++ b/target/linux/ath79/dts/ar9344_dlink_dir-8x5.dtsi @@ -29,6 +29,9 @@ /* default for ar934x, except for 1000M */ pll-data = <0x06000000 0x00000101 0x00001616>; + nvmem-cells = <&macaddr_lan>; + nvmem-cell-names = "mac-address-ascii"; + phy-mode = "rgmii"; phy-handle = <&phy0>; }; @@ -36,8 +39,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; qca,ar8327-initvals = < @@ -57,7 +58,13 @@ ath9k: wifi@0,0 { compatible = "pci168c,0030"; reg = <0x0000 0 0 0 0>; - qca,no-eeprom; + /* "mac-address-ascii" currently does not work for + ath9k pci devices. these below are retained for future + improvements. */ + /* nvmem-cells = <&macaddr_wan>, <&cal_art_5000>; + nvmem-cell-names = "mac-address-ascii", "calibration"; + mac-address-increment = <1>; */ + qca,no-eeprom; /* remove this when "mac-address-ascii" works */ gpio-controller; #gpio-cells = <2>; }; @@ -104,16 +111,40 @@ read-only; }; - partition@fe0000 { + mac: partition@fe0000 { label = "mac"; reg = <0xfe0000 0x010000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_lan: macaddr@4 { + reg = <0x4 0x11>; + }; + + macaddr_wan: macaddr@18 { + reg = <0x18 0x11>; + }; }; - partition@ff0000 { + art: partition@ff0000 { label = "art"; reg = <0xff0000 0x010000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + cal_art_1000: cal@1000 { + reg = <0x1000 0x440>; + }; + + cal_art_5000: cal@5000 { + reg = <0x5000 0x440>; + }; }; }; }; @@ -121,13 +152,6 @@ &usb { status = "okay"; - #address-cells = <1>; - #size-cells = <0>; - - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { @@ -136,5 +160,6 @@ &wmac { status = "okay"; - qca,no-eeprom; + nvmem-cells = <&macaddr_lan>, <&cal_art_1000>; + nvmem-cell-names = "mac-address-ascii", "calibration"; }; diff --git a/target/linux/ath79/dts/ar9344_engenius_eap600.dts b/target/linux/ath79/dts/ar9344_engenius_eap600.dts index 5ad8078f83..618660802c 100644 --- a/target/linux/ath79/dts/ar9344_engenius_eap600.dts +++ b/target/linux/ath79/dts/ar9344_engenius_eap600.dts @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later OR MIT -#include "ar9344_engenius_exx600.dtsi" +#include "ar9344_senao_ap-dual.dtsi" / { model = "EnGenius EAP600"; @@ -36,14 +36,14 @@ &pcie { wifi@0,0,0 { - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_0>, <&calibration_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; }; }; &wmac { - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_0>, <&calibration_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <(-1)>; }; @@ -55,4 +55,12 @@ macaddr_art_0: macaddr@0 { reg = <0x0 0x6>; }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x440>; + }; }; diff --git a/target/linux/ath79/dts/ar9344_engenius_ecb600.dts b/target/linux/ath79/dts/ar9344_engenius_ecb600.dts index e064994dba..5f6ffb130d 100644 --- a/target/linux/ath79/dts/ar9344_engenius_ecb600.dts +++ b/target/linux/ath79/dts/ar9344_engenius_ecb600.dts @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later OR MIT -#include "ar9344_engenius_exx600.dtsi" +#include "ar9344_senao_ap-dual.dtsi" / { model = "EnGenius ECB600"; @@ -30,15 +30,15 @@ &pcie { wifi@0,0,0 { - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_0>, <&calibration_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <(-2)>; }; }; &wmac { - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_0>, <&calibration_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <(-1)>; }; @@ -50,4 +50,12 @@ macaddr_art_0: macaddr@0 { reg = <0x0 0x6>; }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x440>; + }; }; diff --git a/target/linux/ath79/dts/ar9344_engenius_exx600.dtsi b/target/linux/ath79/dts/ar9344_engenius_exx600.dtsi deleted file mode 100644 index 09dc5806d7..0000000000 --- a/target/linux/ath79/dts/ar9344_engenius_exx600.dtsi +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later OR MIT - -#include "ar9344.dtsi" -#include "ar934x_senao_loader.dtsi" - -#include -#include - -/ { - aliases { - label-mac-device = ð0; - led-boot = &led_power; - led-failsafe = &led_power; - led-running = &led_power; - led-upgrade = &led_power; - }; - - keys { - compatible = "gpio-keys"; - - reset { - label = "reset"; - gpios = <&gpio 17 GPIO_ACTIVE_LOW>; - debounce-interval = <60>; - linux,code = ; - }; - }; - - ath9k-leds { - compatible = "gpio-leds"; - - wifi2g { - label = "blue:wifi2g"; - gpios = <&ath9k 0 GPIO_ACTIVE_LOW>; - linux,default-trigger = "phy1tpt"; - }; - }; -}; - -&mdio0 { - status = "okay"; - - phy0: ethernet-phy@0 { - reg = <0>; - eee-broken-100tx; - eee-broken-1000t; - }; -}; - -ð0 { - status = "okay"; - - phy-handle = <&phy0>; - phy-mode = "rgmii-id"; - - pll-data = <0x02000000 0x00000101 0x00001313>; - - gmac-config { - device = <&gmac>; - rgmii-gmac0 = <1>; - rxdv-delay = <3>; - rxd-delay = <3>; - }; -}; - -&pcie { - status = "okay"; - - ath9k: wifi@0,0,0 { - compatible = "pci168c,0030"; - reg = <0x0 0 0 0 0>; - ieee80211-freq-limit = <2402000 2482000>; - qca,no-eeprom; - #gpio-cells = <2>; - gpio-controller; - }; -}; - -&wmac { - status = "okay"; - - ieee80211-freq-limit = <4900000 5990000>; - - mtd-cal-data = <&art 0x1000>; -}; diff --git a/target/linux/ath79/dts/ar9344_fortinet_ap-dual.dtsi b/target/linux/ath79/dts/ar9344_fortinet_ap-dual.dtsi new file mode 100644 index 0000000000..d5275c496e --- /dev/null +++ b/target/linux/ath79/dts/ar9344_fortinet_ap-dual.dtsi @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9344.dtsi" +#include "ar934x_fortinet_loader.dtsi" + +#include +#include + +/ { + aliases { + led-boot = &led_power; + led-failsafe = &led_power; + led-running = &led_power; + led-upgrade = &led_power; + }; + + chosen { + bootargs = "console=ttyS0,9600"; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + linux,code = ; + }; + }; +}; + +&ref { + clock-frequency = <25000000>; +}; + +&mdio0 { + status = "okay"; + + phy0: ethernet-phy@0 { + reg = <0>; + eee-broken-100tx; + eee-broken-1000t; + }; +}; + +ð0 { + status = "okay"; + + phy-handle = <&phy0>; + phy-mode = "rgmii-txid"; + + pll-data = <0x02000000 0x00000101 0x00001313>; +}; + +&pcie { + status = "okay"; + + ath9k: wifi@0,0,0 { + compatible = "pci168c,0030"; + reg = <0x0 0 0 0 0>; + }; +}; + +&wmac { + status = "okay"; +}; diff --git a/target/linux/ath79/dts/ar9344_fortinet_fap-221-b.dts b/target/linux/ath79/dts/ar9344_fortinet_fap-221-b.dts new file mode 100644 index 0000000000..b78a588f5c --- /dev/null +++ b/target/linux/ath79/dts/ar9344_fortinet_fap-221-b.dts @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9344_fortinet_ap-dual.dtsi" + +/ { + compatible = "fortinet,fap-221-b", "qca,ar9344"; + model = "Fortinet FAP-221-B"; + + leds { + compatible = "gpio-leds"; + + led_power: power_green { + label = "green:power"; + gpios = <&gpio 12 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + + power_amber { + label = "amber:power"; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + }; + + eth_green { + label = "green:eth"; + gpios = <&gpio 14 GPIO_ACTIVE_LOW>; + }; + + eth_amber { + label = "amber:eth"; + gpios = <&gpio 15 GPIO_ACTIVE_LOW>; + }; + + wifi5g { + label = "green:wifi5g"; + gpios = <&gpio 18 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + + wifi2g { + label = "amber:wifi2g"; + gpios = <&gpio 19 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy1tpt"; + }; + }; + + virtual_flash { + devices = <&fwconcat0 &fwconcat1 &fwconcat2>; + }; +}; + +&ath9k { + ieee80211-freq-limit = <2402000 2482000>; + + nvmem-cells = <&calibration_pcie>; + nvmem-cell-names = "calibration"; +}; + +&wmac { + ieee80211-freq-limit = <2402000 2482000 4900000 5990000>; + + nvmem-cells = <&calibration_wmac>; + nvmem-cell-names = "calibration"; +}; + +&art { + compatible = "nvmem-cells"; + + calibration_wmac: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_pcie: calibration@5000 { + reg = <0x5000 0x440>; + }; +}; diff --git a/target/linux/ath79/dts/ar9344_mikrotik_routerboard-16m-nor.dtsi b/target/linux/ath79/dts/ar9344_mikrotik_routerboard-16m-nor.dtsi index 840bc3b436..b915dd5a72 100644 --- a/target/linux/ath79/dts/ar9344_mikrotik_routerboard-16m-nor.dtsi +++ b/target/linux/ath79/dts/ar9344_mikrotik_routerboard-16m-nor.dtsi @@ -1,7 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-or-later OR MIT -#include "ar9344.dtsi" - &spi { status = "okay"; @@ -28,7 +26,7 @@ read-only; }; - hard_config: hard_config { + hard_config { read-only; }; @@ -44,7 +42,6 @@ }; soft_config { - label = "soft_config"; }; }; @@ -56,9 +53,3 @@ }; }; }; - -&wmac { - status = "okay"; - - qca,no-eeprom; -}; diff --git a/target/linux/ath79/dts/ar9344_mikrotik_routerboard-951x-2hnd.dtsi b/target/linux/ath79/dts/ar9344_mikrotik_routerboard-951x-2hnd.dtsi new file mode 100644 index 0000000000..5d135f1ca6 --- /dev/null +++ b/target/linux/ath79/dts/ar9344_mikrotik_routerboard-951x-2hnd.dtsi @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9344_mikrotik_routerboard.dtsi" + +&gpio { + nand_power { + gpio-hog; + gpios = <14 GPIO_ACTIVE_LOW>; + output-high; + }; +}; + +&nand { + status = "okay"; + + nand-ecc-mode = "soft"; + qca,nand-swap-dma; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "booter"; + reg = <0x0000000 0x0040000>; + read-only; + }; + + partition@40000 { + label = "kernel"; + reg = <0x0040000 0x03c0000>; + }; + + partition@400000 { + label = "ubi"; + reg = <0x0400000 0x7c00000>; + }; + }; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "mikrotik,routerboot-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "routerboot"; + reg = <0x0 0x0>; + read-only; + }; + + hard_config: hard_config { + read-only; + }; + + bios { + size = <0x1000>; + read-only; + }; + + soft_config { + }; + }; + }; +}; + +&usb { + status = "okay"; +}; + +&usb_phy { + status = "okay"; +}; diff --git a/target/linux/ath79/dts/ar9344_mikrotik_routerboard-sxt-5n.dtsi b/target/linux/ath79/dts/ar9344_mikrotik_routerboard-sxt-5n.dtsi deleted file mode 100644 index 86136289de..0000000000 --- a/target/linux/ath79/dts/ar9344_mikrotik_routerboard-sxt-5n.dtsi +++ /dev/null @@ -1,185 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later OR MIT - -#include "ar9344.dtsi" - -#include -#include - -/ { - compatible = "mikrotik,routerboard-sxt-5n", "qca,ar9344"; - model = "MikroTik SXT 5N platform"; - - aliases { - led-boot = &led_user; - led-failsafe = &led_user; - led-running = &led_user; - led-upgrade = &led_user; - }; - - leds { - compatible = "gpio-leds"; - - power { - label = "green:power"; - gpios = <&gpio 11 GPIO_ACTIVE_HIGH>; - default-state = "on"; - }; - - rssilow { - label = "green:rssilow"; - gpios = <&gpio 13 GPIO_ACTIVE_LOW>; - }; - - rssimediumlow { - label = "green:rssimediumlow"; - gpios = <&gpio 12 GPIO_ACTIVE_LOW>; - }; - - rssimedium { - label = "green:rssimedium"; - gpios = <&gpio 4 GPIO_ACTIVE_LOW>; - }; - - rssimediumhigh { - label = "green:rssimediumhigh"; - gpios = <&gpio 21 GPIO_ACTIVE_LOW>; - }; - - rssihigh { - label = "green:rssihigh"; - gpios = <&gpio 18 GPIO_ACTIVE_LOW>; - }; - - led_user: user { - label = "green:user"; - gpios = <&gpio 3 GPIO_ACTIVE_LOW>; - }; - }; - - keys { - compatible = "gpio-keys"; - - reset { - label = "reset"; - linux,code = ; - gpios = <&gpio 15 GPIO_ACTIVE_LOW>; - debounce-interval = <60>; - }; - }; - - gpio-export { - compatible = "gpio-export"; - - gpio_nand_power { - gpio-export,name = "sxt5n:power:nand"; - gpio-export,output = <0>; - gpios = <&gpio 14 GPIO_ACTIVE_LOW>; - }; - }; - - beeper { - compatible = "gpio-beeper"; - gpios = <&gpio 19 GPIO_ACTIVE_HIGH>; - }; -}; - -&spi { - status = "okay"; - - flash@0 { - compatible = "jedec,spi-nor"; - reg = <0>; - spi-max-frequency = <40000000>; - - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@0 { - label = "RouterBoot"; - reg = <0x0 0x20000>; - compatible = "mikrotik,routerboot-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@0 { - label = "bootloader1"; - reg = <0x0 0x0>; - read-only; - }; - - hard_config: hard_config { - read-only; - }; - - bios { - size = <0x1000>; - read-only; - }; - - soft_config { - }; - - partition@10000 { - label = "bootloader2"; - reg = <0x10000 0x10000>; - read-only; - }; - }; - }; - }; -}; - -&nand { - status = "okay"; - - nand-ecc-mode = "soft"; - qca,nand-swap-dma; - qca,nand-scan-fixup; - - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@0 { - label = "booter"; - reg = <0x0000000 0x0040000>; - read-only; - }; - - partition@40000 { - label = "kernel"; - reg = <0x0040000 0x03c0000>; - }; - - partition@400000 { - label = "ubi"; - reg = <0x0400000 0x7c00000>; - }; - }; -}; - -ð0 { - status = "okay"; - - phy-handle = <&swphy0>; - - gmac-config { - device = <&gmac>; - switch-phy-swap = <1>; - }; -}; - -ð1 { - status = "okay"; - - compatible = "syscon", "simple-mfd"; -}; - -&wmac { - status = "okay"; - - qca,no-eeprom; -}; diff --git a/target/linux/ath79/dts/ar9344_mikrotik_routerboard.dtsi b/target/linux/ath79/dts/ar9344_mikrotik_routerboard.dtsi new file mode 100644 index 0000000000..10233e3d4e --- /dev/null +++ b/target/linux/ath79/dts/ar9344_mikrotik_routerboard.dtsi @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9344.dtsi" + +#include +#include + +/ { + aliases { + led-boot = &led_user; + led-failsafe = &led_user; + led-running = &led_user; + led-upgrade = &led_user; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 15 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + }; + + leds: leds { + compatible = "gpio-leds"; + + rssilow { + label = "green:rssilow"; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + }; + + rssimediumlow { + label = "green:rssimediumlow"; + gpios = <&gpio 12 GPIO_ACTIVE_LOW>; + }; + + rssimedium { + label = "green:rssimedium"; + gpios = <&gpio 4 GPIO_ACTIVE_LOW>; + }; + + rssimediumhigh { + label = "green:rssimediumhigh"; + gpios = <&gpio 21 GPIO_ACTIVE_LOW>; + }; + + rssihigh { + label = "green:rssihigh"; + gpios = <&gpio 18 GPIO_ACTIVE_LOW>; + }; + }; +}; + +ð0 { + status = "okay"; + + phy-handle = <&swphy0>; + + gmac-config { + device = <&gmac>; + switch-phy-swap = <1>; + }; +}; + +ð1 { + status = "okay"; + + compatible = "syscon", "simple-mfd"; +}; + +&wmac { + status = "okay"; + + qca,no-eeprom; +}; diff --git a/target/linux/ath79/dts/ar9344_netgear_pgzng1.dts b/target/linux/ath79/dts/ar9344_netgear_pgzng1.dts new file mode 100644 index 0000000000..5b91dd1e4d --- /dev/null +++ b/target/linux/ath79/dts/ar9344_netgear_pgzng1.dts @@ -0,0 +1,333 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include "ar9344.dtsi" + +#include +#include +#include +#include + +/ { + model = "Netgear PGZNG1"; + compatible = "netgear,pgzng1", "qca,ar9344"; + + aliases { + led-boot = &led_power_green; + led-failsafe = &led_power_red; + led-running = &led_power_green; + led-upgrade = &led_power_green; + label-mac-device = ð0; + }; + + chosen { + bootargs = "console=ttyS0,115200"; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "Reset button"; + linux,code = ; + gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + }; + + i2c { + compatible = "i2c-gpio"; + sda-gpios = <&gpio 14 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; + scl-gpios = <&gpio 13 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; + #address-cells = <1>; + #size-cells = <0>; + + expander0: pca9551@60 { + compatible = "nxp,pca9551"; + reg = <0x60>; + #address-cells = <1>; + #size-cells = <0>; + + led_power_green: led@0 { + reg = <0>; + color = ; + function = LED_FUNCTION_BOOT; + type = ; + chan-name = "green:boot"; + }; + + led_power_red: led@1 { + reg = <1>; + color = ; + function = LED_FUNCTION_BOOT; + type = ; + chan-name = "red:boot"; + }; + + led@2 { + reg = <2>; + color = ; + function = LED_FUNCTION_WAN; + function-enumerator = <1>; + type = ; + }; + + led@3 { + reg = <3>; + color = ; + function = LED_FUNCTION_WAN; + type = ; + }; + + led@4 { + reg = <4>; + color = ; + function = LED_FUNCTION_WLAN; + type = ; + }; + + led@5 { + reg = <5>; + color = ; + function = LED_FUNCTION_WLAN; + type = ; + }; + + led@6 { + reg = <6>; + color = ; + function = LED_FUNCTION_INDICATOR; + type = ; + }; + + led@7 { + reg = <7>; + color = ; + function = LED_FUNCTION_INDICATOR; + type = ; + }; + }; + + expander1: pca9551@61 { + compatible = "nxp,pca9551"; + reg = <0x61>; + #address-cells = <1>; + #size-cells = <0>; + + gpio-controller; + #gpio-cells = <2>; + + /* zwave_rst - Resets ZWave */ + gpio@4 { + reg = <4>; + type = ; + }; + + /* em_rst - Unknown */ + gpio@5 { + reg = <5>; + type = ; + }; + + /* tp34 - Test point on PCB? */ + gpio@6 { + reg = <6>; + type = ; + }; + + /* sw_rst - resets SoC */ + gpio@7 { + reg = <7>; + type = ; + }; + }; + + rtc@6f { + compatible = "isil,isl1208"; + reg = <0x6f>; + }; + }; + + leds { + compatible = "gpio-leds"; + + eth1_link { + color = ; + function = LED_FUNCTION_LAN; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + }; + + eth1_act { + color = ; + function = LED_FUNCTION_LAN; + gpios = <&gpio 1 GPIO_ACTIVE_LOW>; + }; + + eth0_link { + color = ; + function = LED_FUNCTION_WAN; + function-enumerator = <0>; + gpios = <&gpio 2 GPIO_ACTIVE_HIGH>; + }; + + eth0_act { + color = ; + function = LED_FUNCTION_WAN; + gpios = <&gpio 3 GPIO_ACTIVE_LOW>; + }; + }; +}; + +ð0 { + status = "okay"; + phy-handle = <&swphy0>; + + nvmem-cells = <&macaddr_caldata_6>; + nvmem-cell-names = "mac-address"; +}; + +ð1 { + status = "okay"; + phy-handle = <&swphy4>; + + nvmem-cells = <&macaddr_caldata_0>; + nvmem-cell-names = "mac-address"; + + gmac-config { + device = <&gmac>; + switch-phy-swap = <1>; + switch-only-mode = <1>; + }; +}; + +&gpio { + gpio_ext_lna0 { + gpio-hog; + line-name = "ext:lna0"; + gpios = <18 GPIO_ACTIVE_HIGH>; + output-high; + }; + + gpio_ext_lna1 { + gpio-hog; + line-name = "ext:lna1"; + gpios = <19 GPIO_ACTIVE_HIGH>; + output-high; + }; + + gpio_enable_rs422 { + gpio-hog; + line-name = "power:rs422"; + gpios = <20 GPIO_ACTIVE_HIGH>; + output-high; + }; +}; + +&nand { + status = "okay"; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x0 0x40000>; + read-only; + }; + + partition@40000 { + label = "u-boot-env"; + reg = <0x40000 0x40000>; + read-only; + }; + + /* factory kernel used to be reg = <0x80000 0x200000> */ + partition@80000 { + label = "kernel"; + reg = <0x80000 0x500000>; + }; + + /* factory rootfs used to be reg = <0x280000 0x5000000> */ + partition@580000 { + label = "ubi"; + reg = <0x580000 0x4d00000>; + }; + + partition@5280000 { + label = "uImage2"; + reg = <0x5280000 0x200000>; + read-only; + }; + + partition@5480000 { + label = "rootfs_bak"; + reg = <0x5480000 0x5000000>; + read-only; + }; + + partition@a480000 { + label = "config"; + reg = <0xa480000 0x1400000>; + read-only; + }; + + partition@b880000 { + label = "storage"; + reg = <0xb880000 0x4700000>; + read-only; + }; + + partition@ff80000 { + label = "dummy"; + reg = <0xff80000 0x60000>; + read-only; + }; + + caldata: partition@ffe0000 { + label = "caldata"; + reg = <0xffe0000 0x20000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_caldata_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + macaddr_caldata_6: macaddr@6 { + reg = <0x6 0x6>; + }; + + cal_caldata_1000: cal@1000 { + reg = <0x1000 0x440>; + }; + }; + }; +}; + +&ref { + clock-frequency = <40000000>; +}; + +/* zWave is wired up via SPI and UART1 (no idea on pins sadly) */ +&spi { + status = "okay"; +}; + +&wmac { + status = "okay"; + + nvmem-cells = <&cal_caldata_1000>; + nvmem-cell-names = "calibration"; +}; + +&usb { + status = "okay"; +}; + +&usb_phy { + status = "okay"; +}; diff --git a/target/linux/ath79/dts/ar9344_netgear_wndr.dtsi b/target/linux/ath79/dts/ar9344_netgear_wndr.dtsi index 2119dcf987..a8b3a6abd4 100644 --- a/target/linux/ath79/dts/ar9344_netgear_wndr.dtsi +++ b/target/linux/ath79/dts/ar9344_netgear_wndr.dtsi @@ -192,8 +192,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "rgmii"; @@ -245,9 +243,8 @@ &wmac { status = "okay"; - nvmem-cells = <&macaddr_caldata_0>; - nvmem-cell-names = "mac-address"; - qca,no-eeprom; + nvmem-cells = <&macaddr_caldata_0>, <&cal_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; }; &pcie { @@ -256,9 +253,8 @@ ath9k: wifi@0,0 { compatible = "pci168c,0033"; reg = <0x0000 0 0 0 0>; - nvmem-cells = <&macaddr_caldata_c>; - nvmem-cell-names = "mac-address"; - qca,no-eeprom; + nvmem-cells = <&macaddr_caldata_c>, <&cal_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; #gpio-cells = <2>; gpio-controller; }; @@ -276,4 +272,12 @@ macaddr_caldata_c: macaddr@c { reg = <0xc 0x6>; }; + + cal_art_1000: cal@1000 { + reg = <0x1000 0x440>; + }; + + cal_art_5000: cal@5000 { + reg = <0x5000 0x440>; + }; }; diff --git a/target/linux/ath79/dts/ar9344_netgear_wndr_usb.dtsi b/target/linux/ath79/dts/ar9344_netgear_wndr_usb.dtsi index 0ca3b761bf..bd1eb59f4f 100644 --- a/target/linux/ath79/dts/ar9344_netgear_wndr_usb.dtsi +++ b/target/linux/ath79/dts/ar9344_netgear_wndr_usb.dtsi @@ -24,11 +24,4 @@ &usb { status = "okay"; - #address-cells = <1>; - #size-cells = <0>; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; diff --git a/target/linux/ath79/dts/ar9344_ocedo_raccoon.dts b/target/linux/ath79/dts/ar9344_ocedo_raccoon.dts index 0bbeb2b533..11205413f4 100644 --- a/target/linux/ath79/dts/ar9344_ocedo_raccoon.dts +++ b/target/linux/ath79/dts/ar9344_ocedo_raccoon.dts @@ -79,7 +79,7 @@ #address-cells = <1>; #size-cells = <1>; - uboot: partition@0 { + partition@0 { label = "u-boot"; reg = <0x000000 0x040000>; read-only; @@ -91,15 +91,10 @@ }; partition@50000 { + /* Dual-Flash layout combined */ compatible = "denx,uimage"; label = "firmware"; - reg = <0x050000 0x740000>; - }; - - partition@790000 { - label = "vendor"; - reg = <0x790000 0x740000>; - read-only; + reg = <0x050000 0xe80000>; }; partition@ed0000 { @@ -114,10 +109,34 @@ read-only; }; - art: partition@ff0000 { + partition@ff0000 { label = "art"; reg = <0xff0000 0x010000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + macaddr_art_6: macaddr@6 { + reg = <0x6 0x6>; + }; + + macaddr_art_c: macaddr@c { + reg = <0xc 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x440>; + }; }; }; }; @@ -129,9 +148,8 @@ ath9k: wifi@0,0 { compatible = "pci168c,0030"; reg = <0x0000 0 0 0 0>; - nvmem-cells = <&macaddr_art_c>; - nvmem-cell-names = "mac-address"; - qca,no-eeprom; + nvmem-cells = <&macaddr_art_c>, <&calibration_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; #gpio-cells = <2>; gpio-controller; }; @@ -140,16 +158,13 @@ &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; - nvmem-cells = <&macaddr_art_6>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_6>, <&calibration_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; }; &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; eee-broken-100tx; @@ -177,21 +192,3 @@ txd-delay = <0>; }; }; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; - - macaddr_art_6: macaddr@6 { - reg = <0x6 0x6>; - }; - - macaddr_art_c: macaddr@c { - reg = <0xc 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/ar9344_openmesh_mr600.dtsi b/target/linux/ath79/dts/ar9344_openmesh_mr600.dtsi index bbbcc3e0b6..b35d699bdc 100644 --- a/target/linux/ath79/dts/ar9344_openmesh_mr600.dtsi +++ b/target/linux/ath79/dts/ar9344_openmesh_mr600.dtsi @@ -70,10 +70,26 @@ reg = <0x850000 0x7a0000>; }; - art: partition@ff0000 { + partition@ff0000 { label = "ART"; reg = <0xff0000 0x010000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x440>; + }; }; }; }; @@ -82,8 +98,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x1>; - phy0: ethernet-phy@0 { reg = <0>; eee-broken-100tx; @@ -113,9 +127,8 @@ &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_0>, <&calibration_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <1>; }; @@ -125,22 +138,11 @@ ath9k: wifi@0,0 { compatible = "pci168c,0030"; reg = <0x0000 0 0 0 0>; - qca,no-eeprom; - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_0>, <&calibration_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <8>; gpio-controller; #gpio-cells = <2>; }; }; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/ar9344_openmesh_om5p-an.dts b/target/linux/ath79/dts/ar9344_openmesh_om5p-an.dts index e15e296f82..6fab2b3219 100644 --- a/target/linux/ath79/dts/ar9344_openmesh_om5p-an.dts +++ b/target/linux/ath79/dts/ar9344_openmesh_om5p-an.dts @@ -148,10 +148,26 @@ reg = <0x850000 0x7a0000>; }; - art: partition@ff0000 { + partition@ff0000 { label = "ART"; reg = <0xff0000 0x010000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x440>; + }; }; }; }; @@ -160,8 +176,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x80>; - phy7: ethernet-phy@7 { reg = <7>; eee-broken-100tx; @@ -200,9 +214,8 @@ &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_0>, <&calibration_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <2>; }; @@ -212,19 +225,8 @@ wifi@0,0 { compatible = "pci168c,0030"; reg = <0x0000 0 0 0 0>; - qca,no-eeprom; - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_art_0>, <&calibration_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <16>; }; }; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/ar9344_pcs_cap324.dts b/target/linux/ath79/dts/ar9344_pcs_cap324.dts index 6ebd6a43bb..ea7077d2c8 100644 --- a/target/linux/ath79/dts/ar9344_pcs_cap324.dts +++ b/target/linux/ath79/dts/ar9344_pcs_cap324.dts @@ -142,8 +142,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "rgmii"; diff --git a/target/linux/ath79/dts/ar9344_pcs_cr5000.dts b/target/linux/ath79/dts/ar9344_pcs_cr5000.dts index 7b99ef7373..b5fef91eac 100644 --- a/target/linux/ath79/dts/ar9344_pcs_cr5000.dts +++ b/target/linux/ath79/dts/ar9344_pcs_cr5000.dts @@ -106,13 +106,6 @@ &usb { status = "okay"; - #address-cells = <1>; - #size-cells = <0>; - - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { @@ -135,8 +128,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "rgmii"; diff --git a/target/linux/ath79/dts/ar9344_qxwlan_e750g-v8-16m.dts b/target/linux/ath79/dts/ar9344_qxwlan_e750g-v8-16m.dts index 195ab9db20..ecc3d8b8cd 100644 --- a/target/linux/ath79/dts/ar9344_qxwlan_e750g-v8-16m.dts +++ b/target/linux/ath79/dts/ar9344_qxwlan_e750g-v8-16m.dts @@ -10,8 +10,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "rgmii"; diff --git a/target/linux/ath79/dts/ar9344_qxwlan_e750g-v8-8m.dts b/target/linux/ath79/dts/ar9344_qxwlan_e750g-v8-8m.dts index b81a7f7778..e2152ff464 100644 --- a/target/linux/ath79/dts/ar9344_qxwlan_e750g-v8-8m.dts +++ b/target/linux/ath79/dts/ar9344_qxwlan_e750g-v8-8m.dts @@ -10,8 +10,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "rgmii"; diff --git a/target/linux/ath79/dts/ar9344_ruckus_zf7372.dts b/target/linux/ath79/dts/ar9344_ruckus_zf7372.dts index 4bf7276db5..2cf7240931 100644 --- a/target/linux/ath79/dts/ar9344_ruckus_zf7372.dts +++ b/target/linux/ath79/dts/ar9344_ruckus_zf7372.dts @@ -63,6 +63,8 @@ mosi-gpios = <&gpio 15 GPIO_ACTIVE_HIGH>; sck-gpios = <&gpio 14 GPIO_ACTIVE_HIGH>; num-chipselects = <0>; + #address-cells = <1>; + #size-cells = <0>; beamforming-2g-gpio@0 { compatible = "fairchild,74hc595"; @@ -79,6 +81,8 @@ mosi-gpios = <&ath9k 15 GPIO_ACTIVE_HIGH>; sck-gpios = <&ath9k 14 GPIO_ACTIVE_HIGH>; num-chipselects = <0>; + #address-cells = <1>; + #size-cells = <0>; beamforming-5g-gpio@0 { compatible = "fairchild,74hc595"; diff --git a/target/linux/ath79/dts/ar9344_senao_ap-dual.dtsi b/target/linux/ath79/dts/ar9344_senao_ap-dual.dtsi new file mode 100644 index 0000000000..c0e95065d5 --- /dev/null +++ b/target/linux/ath79/dts/ar9344_senao_ap-dual.dtsi @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9344.dtsi" +#include "ar934x_senao_loader.dtsi" + +#include +#include + +/ { + aliases { + label-mac-device = ð0; + led-boot = &led_power; + led-failsafe = &led_power; + led-running = &led_power; + led-upgrade = &led_power; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + linux,code = ; + }; + }; + + ath9k-leds { + compatible = "gpio-leds"; + + wifi2g { + label = "blue:wifi2g"; + gpios = <&ath9k 0 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy1tpt"; + }; + }; +}; + +&mdio0 { + status = "okay"; + + phy0: ethernet-phy@0 { + reg = <0>; + eee-broken-100tx; + eee-broken-1000t; + }; +}; + +ð0 { + status = "okay"; + + phy-handle = <&phy0>; + phy-mode = "rgmii-txid"; + + pll-data = <0x02000000 0x00000101 0x00001313>; +}; + +&pcie { + status = "okay"; + + ath9k: wifi@0,0,0 { + compatible = "pci168c,0030"; + reg = <0x0 0 0 0 0>; + ieee80211-freq-limit = <2402000 2482000>; + #gpio-cells = <2>; + gpio-controller; + }; +}; + +&wmac { + status = "okay"; + + ieee80211-freq-limit = <4900000 5990000>; +}; diff --git a/target/linux/ath79/dts/ar9344_teltonika_rut9xx.dtsi b/target/linux/ath79/dts/ar9344_teltonika_rut9xx.dtsi index c989a30b10..937095959c 100644 --- a/target/linux/ath79/dts/ar9344_teltonika_rut9xx.dtsi +++ b/target/linux/ath79/dts/ar9344_teltonika_rut9xx.dtsi @@ -113,29 +113,26 @@ }; &usb { + status = "okay"; +}; + +&hub_port { #address-cells = <1>; #size-cells = <0>; - status = "okay"; port@1 { - #address-cells = <1>; - #size-cells = <0>; + compatible = "usb-a-connector"; reg = <1>; + }; - port@1 { - compatible = "usb-a-connector"; - reg = <1>; - }; - - port@3 { - label = "RS-232 serial adapter"; - reg = <3>; - }; + port@3 { + label = "RS-232 serial adapter"; + reg = <3>; + }; - port@4 { - label = "internal wwan modem"; - reg = <4>; - }; + port@4 { + label = "internal wwan modem"; + reg = <4>; }; }; diff --git a/target/linux/ath79/dts/ar9344_tplink_cpe605-v1.dts b/target/linux/ath79/dts/ar9344_tplink_cpe605-v1.dts new file mode 100644 index 0000000000..0c6eee7ba6 --- /dev/null +++ b/target/linux/ath79/dts/ar9344_tplink_cpe605-v1.dts @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9344_tplink_cpe.dtsi" + +/ { + model = "TP-Link CPE605 v1"; + compatible = "tplink,cpe605-v1", "qca,ar9344"; + + aliases { + led-boot = &led_lan; + led-failsafe = &led_lan; + led-upgrade = &led_lan; + }; + + leds { + compatible = "gpio-leds"; + + led_lan: lan { + label = "green:lan"; + gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + }; + + wlan5g { + label = "green:wlan5g"; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + }; +}; + +ð1 { + compatible = "syscon", "simple-mfd"; +}; diff --git a/target/linux/ath79/dts/ar9344_tplink_tl-wdr3500-v1.dts b/target/linux/ath79/dts/ar9344_tplink_tl-wdr3500-v1.dts index 6c5d013ccd..1600e12b64 100644 --- a/target/linux/ath79/dts/ar9344_tplink_tl-wdr3500-v1.dts +++ b/target/linux/ath79/dts/ar9344_tplink_tl-wdr3500-v1.dts @@ -42,14 +42,7 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { @@ -57,16 +50,9 @@ }; &ath9k { - nvmem-cells = <&macaddr_uboot_1fc00>; - nvmem-cell-names = "mac-address"; mac-address-increment = <1>; }; -&wmac { - nvmem-cells = <&macaddr_uboot_1fc00>; - nvmem-cell-names = "mac-address"; -}; - ð1 { status = "okay"; @@ -90,13 +76,3 @@ nvmem-cell-names = "mac-address"; mac-address-increment = <2>; }; - -&uboot { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_uboot_1fc00: macaddr@1fc00 { - reg = <0x1fc00 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/ar9344_tplink_tl-wdr4300.dtsi b/target/linux/ath79/dts/ar9344_tplink_tl-wdr4300.dtsi index 262c6f713e..d2791aee70 100644 --- a/target/linux/ath79/dts/ar9344_tplink_tl-wdr4300.dtsi +++ b/target/linux/ath79/dts/ar9344_tplink_tl-wdr4300.dtsi @@ -53,25 +53,21 @@ }; &usb { + status = "okay"; +}; + +&hub_port { #address-cells = <1>; #size-cells = <0>; - status = "okay"; - port@1 { - #address-cells = <1>; - #size-cells = <0>; + hub_port1: port@1 { reg = <1>; #trigger-source-cells = <0>; + }; - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; - - hub_port2: port@2 { - reg = <2>; - #trigger-source-cells = <0>; - }; + hub_port2: port@2 { + reg = <2>; + #trigger-source-cells = <0>; }; }; @@ -79,22 +75,13 @@ status = "okay"; }; -&ath9k { - nvmem-cells = <&macaddr_uboot_1fc00>; - nvmem-cell-names = "mac-address"; -}; - &wmac { - nvmem-cells = <&macaddr_uboot_1fc00>; - nvmem-cell-names = "mac-address"; mac-address-increment = <(-1)>; }; &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "rgmii"; @@ -123,13 +110,3 @@ phy-mode = "rgmii"; phy-handle = <&phy0>; }; - -&uboot { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_uboot_1fc00: macaddr@1fc00 { - reg = <0x1fc00 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/ar9344_tplink_tl-wdrxxxx.dtsi b/target/linux/ath79/dts/ar9344_tplink_tl-wdrxxxx.dtsi index a3f4dc036d..a2649d19e9 100644 --- a/target/linux/ath79/dts/ar9344_tplink_tl-wdrxxxx.dtsi +++ b/target/linux/ath79/dts/ar9344_tplink_tl-wdrxxxx.dtsi @@ -106,14 +106,39 @@ ath9k: wifi@0,0 { compatible = "pci168c,0033"; reg = <0x0000 0 0 0 0>; - qca,no-eeprom; #gpio-cells = <2>; gpio-controller; + nvmem-cells = <&macaddr_uboot_1fc00>, <&cal_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; }; }; &wmac { status = "okay"; + nvmem-cells = <&macaddr_uboot_1fc00>, <&cal_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; +}; + +&uboot { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_uboot_1fc00: macaddr@1fc00 { + reg = <0x1fc00 0x6>; + }; +}; - mtd-cal-data = <&art 0x1000>; +&art { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + cal_art_1000: cal@1000 { + reg = <0x1000 0x440>; + }; + + cal_art_5000: cal@5000 { + reg = <0x5000 0x440>; + }; }; diff --git a/target/linux/ath79/dts/ar9344_tplink_tl-wr841hp-v2.dts b/target/linux/ath79/dts/ar9344_tplink_tl-wr841hp-v2.dts index 360443565b..49526fb6d2 100644 --- a/target/linux/ath79/dts/ar9344_tplink_tl-wr841hp-v2.dts +++ b/target/linux/ath79/dts/ar9344_tplink_tl-wr841hp-v2.dts @@ -16,7 +16,7 @@ led-upgrade = &led_system; label-mac-device = &wmac; }; - + keys { compatible = "gpio-keys"; @@ -26,7 +26,7 @@ debounce-interval = <60>; }; }; - + leds { compatible = "gpio-leds"; @@ -54,12 +54,12 @@ label = "green:lan4"; gpios = <&gpio 15 GPIO_ACTIVE_LOW>; }; - + wps { label = "green:wps"; gpios = <&gpio 16 GPIO_ACTIVE_LOW>; }; - + wlan { label = "green:wlan"; gpios = <&gpio 21 GPIO_ACTIVE_LOW>; @@ -130,16 +130,16 @@ &wmac { status = "okay"; - + mtd-cal-data = <&art 0x1000>; - + nvmem-cells = <&macaddr_uboot_1fc00>; nvmem-cell-names = "mac-address"; }; ð0 { status = "okay"; - + phy-handle = <&swphy0>; nvmem-cells = <&macaddr_uboot_1fc00>; @@ -152,7 +152,7 @@ nvmem-cells = <&macaddr_uboot_1fc00>; nvmem-cell-names = "mac-address"; - + gmac-config { device = <&gmac>; switch-phy-swap = <1>; diff --git a/target/linux/ath79/dts/ar9344_ubnt_unifi-ap-pro.dts b/target/linux/ath79/dts/ar9344_ubnt_unifi-ap-pro.dts index 8471be9b6b..55626c4299 100644 --- a/target/linux/ath79/dts/ar9344_ubnt_unifi-ap-pro.dts +++ b/target/linux/ath79/dts/ar9344_ubnt_unifi-ap-pro.dts @@ -100,10 +100,26 @@ read-only; }; - art: partition@ff0000 { + partition@ff0000 { label = "art"; reg = <0xff0000 0x10000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x440>; + }; }; }; }; @@ -115,14 +131,16 @@ wifi@0,0 { compatible = "pci168c,0033"; reg = <0 0 0 0 0>; - qca,no-eeprom; + nvmem-cells = <&calibration_art_5000>; + nvmem-cell-names = "calibration"; }; }; &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; + nvmem-cells = <&calibration_art_1000>; + nvmem-cell-names = "calibration"; }; &mdio0 { @@ -150,13 +168,3 @@ phy-mode = "rgmii"; phy-handle = <&phy0>; }; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/ar9344_watchguard_ap100.dts b/target/linux/ath79/dts/ar9344_watchguard_ap100.dts new file mode 100644 index 0000000000..0ab10c36ce --- /dev/null +++ b/target/linux/ath79/dts/ar9344_watchguard_ap100.dts @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9344_senao_ap-dual.dtsi" + +/ { + compatible = "watchguard,ap100", "qca,ar9344"; + model = "WatchGuard AP100"; + + aliases { + led-boot = &led_power_amber; + led-failsafe = &led_power_amber; + led-running = &led_power_green; + led-upgrade = &led_power_amber; + }; + + leds { + compatible = "gpio-leds"; + + led_power_amber: power_amber { + label = "amber:power"; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + }; + + led_power_green: power_green { + label = "green:power"; + gpios = <&gpio 12 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + + lan_data { + label = "orange:lan_data"; + gpios = <&gpio 15 GPIO_ACTIVE_LOW>; + }; + + lan_link { + label = "green:lan_link"; + gpios = <&gpio 14 GPIO_ACTIVE_LOW>; + }; + + wifi_amber { + label = "amber:wifi"; + gpios = <&gpio 19 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy1tpt"; + }; + + wifi_green { + label = "green:wifi"; + gpios = <&gpio 18 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + }; +}; + +&ref { + clock-frequency = <25000000>; +}; + +ð0 { + nvmem-cells = <&macaddr_art_0>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <(-2)>; +}; + +&pcie { + status = "disabled"; + + wifi@0,0,0 { + nvmem-cells = <&calibration_art_5000>; + nvmem-cell-names = "calibration"; + }; +}; + +&wmac { + /delete-property/ ieee80211-freq-limit; + + nvmem-cells = <&macaddr_art_0>, <&calibration_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; + mac-address-increment = <(-2)>; +}; + +&art { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x440>; + }; +}; diff --git a/target/linux/ath79/dts/ar9344_watchguard_ap200.dts b/target/linux/ath79/dts/ar9344_watchguard_ap200.dts new file mode 100644 index 0000000000..88c7637fc9 --- /dev/null +++ b/target/linux/ath79/dts/ar9344_watchguard_ap200.dts @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar9344_senao_ap-dual.dtsi" + +/ { + compatible = "watchguard,ap200", "qca,ar9344"; + model = "WatchGuard AP200"; + + aliases { + led-boot = &led_power_amber; + led-failsafe = &led_power_amber; + led-running = &led_power_green; + led-upgrade = &led_power_amber; + }; + + leds { + compatible = "gpio-leds"; + + led_power_amber: power_amber { + label = "amber:power"; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + }; + + led_power_green: power_green { + label = "green:power"; + gpios = <&gpio 12 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + + lan_data { + label = "orange:lan_data"; + gpios = <&gpio 15 GPIO_ACTIVE_LOW>; + }; + + lan_link { + label = "green:lan_link"; + gpios = <&gpio 14 GPIO_ACTIVE_LOW>; + }; + + wifi_amber { + label = "amber:wifi"; + gpios = <&gpio 19 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy1tpt"; + }; + + wifi_green { + label = "green:wifi"; + gpios = <&gpio 18 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + }; +}; + +&ref { + clock-frequency = <25000000>; +}; + +ð0 { + nvmem-cells = <&macaddr_art_0>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <(-2)>; +}; + +&pcie { + wifi@0,0,0 { + nvmem-cells = <&macaddr_art_0>, <&calibration_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; + mac-address-increment = <(-1)>; + }; +}; + +&wmac { + nvmem-cells = <&macaddr_art_0>, <&calibration_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; + mac-address-increment = <(-2)>; +}; + +&art { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x440>; + }; +}; diff --git a/target/linux/ath79/dts/ar9344_wd_mynet-n600.dts b/target/linux/ath79/dts/ar9344_wd_mynet-n600.dts index 81788fb348..3c0e9c56a1 100644 --- a/target/linux/ath79/dts/ar9344_wd_mynet-n600.dts +++ b/target/linux/ath79/dts/ar9344_wd_mynet-n600.dts @@ -18,27 +18,27 @@ compatible = "gpio-leds"; led-0 { - color = ; - function = LED_FUNCTION_WLAN; + color = ; + function = LED_FUNCTION_WLAN; gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; }; led_power: led-1 { label = "blue:power"; - color = ; - function = LED_FUNCTION_POWER; + color = ; + function = LED_FUNCTION_POWER; gpios = <&gpio 11 GPIO_ACTIVE_HIGH>; }; led-2 { - color = ; - function = LED_FUNCTION_WAN; + color = ; + function = LED_FUNCTION_WAN; gpios = <&gpio 12 GPIO_ACTIVE_HIGH>; }; led-3 { - color = ; - function = LED_FUNCTION_WPS; + color = ; + function = LED_FUNCTION_WPS; gpios = <&gpio 13 GPIO_ACTIVE_HIGH>; }; }; diff --git a/target/linux/ath79/dts/ar9344_wd_mynet-n750.dts b/target/linux/ath79/dts/ar9344_wd_mynet-n750.dts index d1f63c5064..d18ffff34d 100644 --- a/target/linux/ath79/dts/ar9344_wd_mynet-n750.dts +++ b/target/linux/ath79/dts/ar9344_wd_mynet-n750.dts @@ -69,33 +69,12 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - port@1 { - #address-cells = <1>; - #size-cells = <0>; - reg = <1>; - #trigger-source-cells = <0>; - - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; - - hub_port2: port@2 { - reg = <2>; - #trigger-source-cells = <0>; - }; - }; }; &mdio0 { status = "okay"; - phy-mask = <0>; - switch0@1f { compatible = "qca,ar8327"; reg = <0x1f>; diff --git a/target/linux/ath79/dts/ar9344_wd_mynet-wifi-rangeextender.dts b/target/linux/ath79/dts/ar9344_wd_mynet-wifi-rangeextender.dts index 7313e9acc2..20dad6a675 100644 --- a/target/linux/ath79/dts/ar9344_wd_mynet-wifi-rangeextender.dts +++ b/target/linux/ath79/dts/ar9344_wd_mynet-wifi-rangeextender.dts @@ -134,8 +134,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x10>; - phy4: ethernet-phy@4 { reg = <4>; }; diff --git a/target/linux/ath79/dts/ar9344_winchannel_wb2000.dts b/target/linux/ath79/dts/ar9344_winchannel_wb2000.dts index 2586a174cb..cbde191ac7 100644 --- a/target/linux/ath79/dts/ar9344_winchannel_wb2000.dts +++ b/target/linux/ath79/dts/ar9344_winchannel_wb2000.dts @@ -46,7 +46,7 @@ usb { label = "green:usb"; gpios = <&gpio 21 GPIO_ACTIVE_HIGH>; - trigger-sources = <&hub_port1>, <&hub_port2>; + trigger-sources = <&hub_port>; linux,default-trigger = "usbport"; }; @@ -119,16 +119,36 @@ read-only; }; - art: partition@fe0000 { + partition@fe0000 { label = "art"; reg = <0xfe0000 0x10000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x440>; + }; }; - addr: partition@ff0000 { + partition@ff0000 { label = "addr"; reg = <0xff0000 0x10000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_addr_0: macaddr@0 { + reg = <0x0 0x6>; + }; }; }; }; @@ -140,9 +160,8 @@ ath9k: wifi@0,0 { compatible = "pci168c,0030"; reg = <0x0000 0 0 0 0>; - qca,no-eeprom; - nvmem-cells = <&macaddr_addr_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_addr_0>, <&calibration_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <0x10>; #gpio-cells = <2>; gpio-controller; @@ -150,26 +169,7 @@ }; &usb { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - port@1 { - #address-cells = <1>; - #size-cells = <0>; - reg = <1>; - #trigger-source-cells = <0>; - - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; - - hub_port2: port@2 { - reg = <2>; - #trigger-source-cells = <0>; - }; - }; }; &usb_phy { @@ -179,16 +179,13 @@ &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; - nvmem-cells = <&macaddr_addr_0>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_addr_0>, <&calibration_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; }; &mdio0 { status = "okay"; - phy-mask = <0x10>; - phy4: ethernet-phy@4 { reg = <4>; }; @@ -214,12 +211,3 @@ }; }; -&addr { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_addr_0: macaddr@0 { - reg = <0x0 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/ar9344_zbtlink_zbt-wd323.dts b/target/linux/ath79/dts/ar9344_zbtlink_zbt-wd323.dts index 8fc21be1dc..8dc1ceb666 100644 --- a/target/linux/ath79/dts/ar9344_zbtlink_zbt-wd323.dts +++ b/target/linux/ath79/dts/ar9344_zbtlink_zbt-wd323.dts @@ -59,6 +59,14 @@ gpios = <&gpio 22 GPIO_ACTIVE_LOW>; }; }; + + watchdog { + compatible = "linux,wdt-gpio"; + gpios = <&gpio 21 GPIO_ACTIVE_HIGH>; + hw_algo = "toggle"; + hw_margin_ms = <30000>; + always-running; + }; }; &wdt { diff --git a/target/linux/ath79/dts/ar934x.dtsi b/target/linux/ath79/dts/ar934x.dtsi index d88c7bfabc..94dfde4125 100644 --- a/target/linux/ath79/dts/ar934x.dtsi +++ b/target/linux/ath79/dts/ar934x.dtsi @@ -178,6 +178,11 @@ #address-cells = <1>; #size-cells = <0>; + + hub_port: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; nand: nand@1b000200 { diff --git a/target/linux/ath79/dts/ar934x_fortinet_loader.dtsi b/target/linux/ath79/dts/ar934x_fortinet_loader.dtsi new file mode 100644 index 0000000000..59117dd5e0 --- /dev/null +++ b/target/linux/ath79/dts/ar934x_fortinet_loader.dtsi @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include + +/ { + virtual_flash { + compatible = "mtd-concat"; + + devices = <&fwconcat0 &fwconcat1>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + compatible = "librecmc,uimage", "denx,uimage"; + librecmc,ih-magic = <0x73714f4b>; + label = "firmware"; + reg = <0x0 0x0>; + }; + }; + }; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <40000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x000000 0x040000>; + read-only; + }; + + fwconcat0: partition@40000 { + label = "fwconcat0"; + reg = <0x040000 0x900000>; + }; + + partition@940000 { + label = "loader"; + reg = <0x940000 0x010000>; + }; + + fwconcat1: partition@950000 { + label = "fwconcat1"; + reg = <0x950000 0x1a0000>; + }; + + fwconcat2: partition@af0000 { + label = "reserved"; + reg = <0xaf0000 0x500000>; + }; + + art: partition@ff0000 { + label = "art"; + reg = <0xff0000 0x010000>; + read-only; + }; + }; + }; +}; diff --git a/target/linux/ath79/dts/qca9531_alcatel_hh40v.dts b/target/linux/ath79/dts/qca9531_alcatel_hh40v.dts new file mode 100644 index 0000000000..7873f75528 --- /dev/null +++ b/target/linux/ath79/dts/qca9531_alcatel_hh40v.dts @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca953x.dtsi" + +#include +#include + +/ { + compatible = "alcatel,hh40v", "qca,qca9531"; + model = "Alcatel HH40V"; + + aliases { + label-mac-device = &wmac; + led-boot = &led_lan_link; + led-failsafe = &led_lan_link; + led-upgrade = &led_lan_link; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + }; + + wps { + label = "wps"; + linux,code = ; + gpios = <&gpio 16 GPIO_ACTIVE_LOW>; + }; + + }; + + leds { + compatible = "gpio-leds"; + + pinctrl-names = "default"; + pinctrl-0 = <&jtag_disable_pins>; + + lan_active { + label = "green:lan"; + gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + }; + + led_lan_link: lan_link { + label = "orange:lan"; + gpios = <&gpio 12 GPIO_ACTIVE_LOW>; + }; + + wan_active { + label = "green:wan"; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + }; + + wan_link { + label = "orange:wan"; + gpios = <&gpio 14 GPIO_ACTIVE_LOW>; + }; + + wifi { + label = "blue:wifi"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "phy0tpt"; + }; + }; +}; + +&usb0 { + status = "okay"; + + dr_mode = "host"; +}; + +&usb_phy { + status = "okay"; +}; + +&spi { + status = "okay"; + + /* Winbond W25Q256 SPI flash */ + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x000000 0x040000>; + read-only; + }; + + partition@40000 { + label = "u-boot-env"; + reg = <0x040000 0x010000>; + }; + + partition@50000 { + label = "oem"; + reg = <0x050000 0x100000>; + read-only; + }; + + partition@150000 { + compatible = "denx,uimage"; + label = "firmware"; + reg = <0x150000 0xea0000>; + }; + + art: partition@ff0000 { + label = "art"; + reg = <0xff0000 0x010000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + cal_art_1000: cal@1000 { + reg = <0x1000 0x440>; + }; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + macaddr_art_6: macaddr@6 { + reg = <0x6 0x6>; + }; + + macaddr_art_1002: macaddr@1002 { + reg = <0x1002 0x6>; + }; + }; + }; + }; +}; + +&mdio0 { + status = "okay"; +}; + + +ð0 { + status = "okay"; + + nvmem-cells = <&macaddr_art_0>; + nvmem-cell-names = "mac-address"; + + phy-handle = <&swphy4>; +}; + +ð1 { + compatible = "qca,qca9530-eth", "syscon", "simple-mfd"; + + nvmem-cells = <&macaddr_art_6>; + nvmem-cell-names = "mac-address"; +}; + +&wmac { + status = "okay"; + + nvmem-cells = <&cal_art_1000>, <&macaddr_art_1002>; + nvmem-cell-names = "calibration", "mac-address"; +}; diff --git a/target/linux/ath79/dts/qca9531_alfa-network_r36a.dtsi b/target/linux/ath79/dts/qca9531_alfa-network_r36a.dtsi index 9704e69211..406985d576 100644 --- a/target/linux/ath79/dts/qca9531_alfa-network_r36a.dtsi +++ b/target/linux/ath79/dts/qca9531_alfa-network_r36a.dtsi @@ -111,14 +111,6 @@ &usb0 { status = "okay"; - - #address-cells = <1>; - #size-cells = <0>; - - hub_port0: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/qca9531_comfast_cf-e314n-v2.dts b/target/linux/ath79/dts/qca9531_comfast_cf-e314n-v2.dts index c182390b21..9288126788 100644 --- a/target/linux/ath79/dts/qca9531_comfast_cf-e314n-v2.dts +++ b/target/linux/ath79/dts/qca9531_comfast_cf-e314n-v2.dts @@ -33,23 +33,23 @@ }; rssilow { - label = "red:signal1"; + label = "red:rssilow"; gpios = <&gpio 11 GPIO_ACTIVE_LOW>; }; rssimediumlow { - label = "red:signal2"; + label = "red:rssimediumlow"; gpios = <&gpio 12 GPIO_ACTIVE_LOW>; }; rssimediumhigh { - label = "green:signal3"; - gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + label = "green:rssimediumhigh"; + gpios = <&gpio 14 GPIO_ACTIVE_LOW>; }; led_rssihigh: rssihigh { - label = "green:signal4"; - gpios = <&gpio 14 GPIO_ACTIVE_LOW>; + label = "green:rssihigh"; + gpios = <&gpio 16 GPIO_ACTIVE_LOW>; }; wlan { diff --git a/target/linux/ath79/dts/qca9531_comfast_cf-e5.dts b/target/linux/ath79/dts/qca9531_comfast_cf-e5.dts index d839725258..17cbe1df14 100644 --- a/target/linux/ath79/dts/qca9531_comfast_cf-e5.dts +++ b/target/linux/ath79/dts/qca9531_comfast_cf-e5.dts @@ -62,14 +62,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/qca9531_dlink_dch-g020-a1.dts b/target/linux/ath79/dts/qca9531_dlink_dch-g020-a1.dts new file mode 100644 index 0000000000..9a4db6f9fc --- /dev/null +++ b/target/linux/ath79/dts/qca9531_dlink_dch-g020-a1.dts @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca953x.dtsi" + +#include +#include + +/ { + compatible = "dlink,dch-g020-a1", "qca,qca9531"; + model = "D-Link DCH-G020 A1"; + + aliases { + led-boot = &led_power; + led-failsafe = &led_power; + led-running = &led_power; + led-upgrade = &led_power; + }; + + i2c { + compatible = "i2c-gpio"; + #address-cells = <1>; + #size-cells = <0>; + + sda-gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + scl-gpios = <&gpio 1 GPIO_ACTIVE_HIGH>; + + gpio_ext: gpio_ext@38 { + compatible = "nxp,pca9554"; + reg = <0x38 0x1>; + + gpio-controller; + #gpio-cells = <2>; + }; + + rtc@30 { + compatible = "pericom,pt7c43390"; + reg = <0x30 0x8>; + }; + }; + + gpio-export { + compatible = "gpio-export"; + + usb_power { + label = "power:usb"; + gpio-export,name = "d-link:power:usb"; + gpio-export,output = <0>; + gpios = <&gpio_ext 3 GPIO_ACTIVE_LOW>; + }; + + zwave_power { + label = "power:zwave"; + gpio-export,name = "d-link:power:zwave"; + gpio-export,output = <0>; + gpios = <&gpio_ext 1 GPIO_ACTIVE_LOW>; + }; + }; + + keys { + compatible = "gpio-keys"; + + wps { + label = "wps"; + linux,code = ; + gpios = <&gpio 3 GPIO_ACTIVE_LOW>; + }; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + }; + }; + + leds { + compatible = "gpio-leds"; + + led_power: power { + label = "green:power"; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + }; + + status { + label = "red:status"; + gpios = <&gpio 14 GPIO_ACTIVE_LOW>; + }; + }; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <50000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x0 0x10000>; + read-only; + }; + + art: partition@10000 { + label = "art"; + reg = <0x10000 0x10000>; + read-only; + }; + + partition@20000 { + label = "mp"; + reg = <0x20000 0x10000>; + read-only; + }; + + partition@30000 { + label = "config"; + reg = <0x30000 0x10000>; + read-only; + }; + + partition@40000 { + label = "bootarg"; + reg = <0x40000 0x10000>; + read-only; + }; + + partition@50000 { + label = "firmware"; + reg = <0x50000 0xe70000>; + compatible = "denx,uimage"; + }; + + partition@ec0000 { + label = "dlink"; + reg = <0xec0000 0x140000>; + read-only; + }; + }; + }; +}; + +&usb0 { + status = "okay"; +}; + +&usb_phy { + status = "okay"; +}; + +ð0 { + status = "okay"; +}; + +&wmac { + status = "okay"; + + mtd-cal-data = <&art 0x1000>; +}; diff --git a/target/linux/ath79/dts/qca9531_glinet_gl-ar300m.dtsi b/target/linux/ath79/dts/qca9531_glinet_gl-ar300m.dtsi index b6ea1080a4..667f779b17 100644 --- a/target/linux/ath79/dts/qca9531_glinet_gl-ar300m.dtsi +++ b/target/linux/ath79/dts/qca9531_glinet_gl-ar300m.dtsi @@ -142,8 +142,6 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; }; diff --git a/target/linux/ath79/dts/qca9531_glinet_gl-xe300.dts b/target/linux/ath79/dts/qca9531_glinet_gl-xe300.dts deleted file mode 100644 index 9c2760398b..0000000000 --- a/target/linux/ath79/dts/qca9531_glinet_gl-xe300.dts +++ /dev/null @@ -1,168 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later OR MIT - -#include "qca953x.dtsi" - -#include -#include - -/ { - compatible = "glinet,gl-xe300", "qca,qca9531"; - model = "GL.iNet GL-XE300"; - - gpio-export { - compatible = "gpio-export"; - - gpio_lte_power { - gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; - gpio-export,name = "lte_power"; - gpio-export,output = <1>; - }; - - gpio_sd_detect { - gpios = <&gpio 17 GPIO_ACTIVE_LOW>; - gpio-export,name = "sd_detect"; - gpio-export,output = <0>; - }; - }; - - keys { - compatible = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&jtag_disable_pins>; - - reset { - label = "reset"; - linux,code = ; - gpios = <&gpio 3 GPIO_ACTIVE_LOW>; - }; - }; - - leds { - compatible = "gpio-leds"; - - lan { - gpios = <&gpio 10 GPIO_ACTIVE_LOW>; - label = "green:lan"; - }; - - wan { - gpios = <&gpio 1 GPIO_ACTIVE_LOW>; - label = "green:wan"; - }; - - wlan { - gpios = <&gpio 12 GPIO_ACTIVE_LOW>; - label = "green:wlan"; - linux,default-trigger = "phy0tpt"; - }; - - lte { - gpios = <&gpio 13 GPIO_ACTIVE_LOW>; - label = "green:lte"; - }; - }; -}; - -&pcie0 { - status = "okay"; -}; - -&usb0 { - status = "okay"; -}; - -&usb_phy { - status = "okay"; -}; - -&spi { - status = "okay"; - - flash@0 { - compatible = "jedec,spi-nor"; - reg = <0>; - spi-max-frequency = <25000000>; - - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@0 { - label = "u-boot"; - reg = <0x0 0x40000>; - read-only; - }; - - partition@40000 { - label = "u-boot-env"; - reg = <0x40000 0x10000>; - }; - - art: partition@50000 { - label = "art"; - reg = <0x50000 0x10000>; - read-only; - }; - - partition@60000 { - label = "kernel"; - reg = <0x60000 0x400000>; - }; - - partition@460000 { - label = "nor_reserved"; - reg = <0x460000 0xba0000>; - }; - }; - }; - - flash@1 { - compatible = "spi-nand"; - reg = <1>; - spi-max-frequency = <25000000>; - - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@0 { - label = "ubi"; - reg = <0x0 0x8000000>; - }; - }; - }; -}; - -ð0 { - status = "okay"; - - phy-handle = <&swphy4>; - - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; -}; - -ð1 { - nvmem-cells = <&macaddr_art_0>; - nvmem-cell-names = "mac-address"; - mac-address-increment = <1>; -}; - -&wmac { - status = "okay"; - - mtd-cal-data = <&art 0x1000>; -}; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/qca9531_letv_lba-047-ch.dts b/target/linux/ath79/dts/qca9531_letv_lba-047-ch.dts index 48d9668cc0..98d66515d0 100644 --- a/target/linux/ath79/dts/qca9531_letv_lba-047-ch.dts +++ b/target/linux/ath79/dts/qca9531_letv_lba-047-ch.dts @@ -4,6 +4,7 @@ #include #include +#include #include / { @@ -11,11 +12,11 @@ compatible = "letv,lba-047-ch", "qca,qca9531"; aliases { - led-boot = &led_status_red; - led-failsafe = &led_status_red; - led-running = &led_status_blue; - led-upgrade = &led_status_red; label-mac-device = ð0; + led-boot = &led_status_red; + led-failsafe = &led_status_blue; + led-running = &led_status_green; + led-upgrade = &led_status_blue; }; keys { @@ -31,16 +32,24 @@ leds { compatible = "gpio-leds"; - pinctrl-names = "default"; - pinctrl-0 = <&led_wan_pin>; - - led_status_blue: status_blue { + led_status_blue: led-0 { label = "blue:status"; + color = ; + function = LED_FUNCTION_STATUS; gpios = <&gpio 13 GPIO_ACTIVE_LOW>; }; - led_status_red: status_red { + led_status_green: led-1 { + label = "green:status"; + color = ; + function = LED_FUNCTION_STATUS; + gpios = <&gpio 4 GPIO_ACTIVE_LOW>; + }; + + led_status_red: led-2 { label = "red:status"; + color = ; + function = LED_FUNCTION_STATUS; gpios = <&gpio 11 GPIO_ACTIVE_LOW>; }; }; @@ -64,20 +73,13 @@ }; }; -&pinmux { - /* GPIO 4: LED_LINK_5 (WAN) */ - led_wan_pin: pinmux_led_wan_pin { - pinctrl-single,bits = <0x04 0x0000002d 0x000000ff>; - }; -}; - &spi { status = "okay"; flash@0 { compatible = "jedec,spi-nor"; reg = <0>; - spi-max-frequency = <50000000>; + spi-max-frequency = <30000000>; m25p,fast-read; partitions { @@ -112,10 +114,26 @@ reg = <0xe90000 0x160000>; }; - art: partition@ff0000 { + partition@ff0000 { label = "art"; reg = <0xff0000 0x10000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_art_0: macaddr@0 { + reg = <0x0 0x6>; + }; + + macaddr_art_6: macaddr@6 { + reg = <0x6 0x6>; + }; + + cal_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; }; }; }; @@ -140,19 +158,6 @@ &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; -}; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_0: macaddr@0 { - reg = <0x0 0x6>; - }; - - macaddr_art_6: macaddr@6 { - reg = <0x6 0x6>; - }; + nvmem-cells = <&cal_art_1000>; + nvmem-cell-names = "calibration"; }; diff --git a/target/linux/ath79/dts/qca9531_teltonika_rut300.dts b/target/linux/ath79/dts/qca9531_teltonika_rut300.dts new file mode 100644 index 0000000000..f79be8dca5 --- /dev/null +++ b/target/linux/ath79/dts/qca9531_teltonika_rut300.dts @@ -0,0 +1,157 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/dts-v1/; + +#include +#include +#include "qca953x.dtsi" + +/ { + compatible = "teltonika,rut300", "teltonika,rut30x", "qca,qca9531"; + model = "TELTONIKA RUT300"; + + aliases { + label-mac-device = ð1; + led-boot = &led_wan; + led-failsafe = &led_wan; + led-running = &led_wan; + led-upgrade = &led_wan; + serial0 = &uart; + }; + + leds { + compatible = "gpio-leds"; + pinctrl-names = "default"; + pinctrl-0 = <&pmx_leds_switch>, <&jtag_disable_pins>; + + led_wan: wan { + label = "yellow:wan"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + }; + + lan1 { + label = "yellow:lan1"; + gpios = <&gpio 4 GPIO_ACTIVE_HIGH>; + }; + + lan2 { + label = "yellow:lan2"; + gpios = <&gpio 3 GPIO_ACTIVE_HIGH>; + }; + + lan3 { + label = "yellow:lan3"; + gpios = <&gpio 2 GPIO_ACTIVE_HIGH>; + }; + + lan4 { + label = "yellow:lan4"; + gpios = <&gpio 1 GPIO_ACTIVE_HIGH>; + }; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + }; + }; +}; + +&spi { + status = "okay"; + num-cs = <1>; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x000000 0x020000>; + read-only; + }; + + config: partition@20000 { + label = "config"; + reg = <0x020000 0x010000>; + read-only; + }; + + partition@30000 { + label = "art"; + reg = <0x030000 0x010000>; + read-only; + }; + + partition@40000 { + compatible = "denx,uimage"; + label = "firmware"; + reg = <0x040000 0xf30000>; + }; + + partition@f70000 { + label = "event-log"; + reg = <0xf70000 0x090000>; + }; + }; + }; +}; + +&usb0 { + status = "okay"; +}; + +&usb_phy { + status = "okay"; +}; + +&uart { + status = "okay"; +}; + +&config { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_config_0: macaddr@0 { + reg = <0x0 0x6>; + }; +}; + +ð0 { + status = "okay"; + phy-handle = <&swphy0>; + + nvmem-cells = <&macaddr_config_0>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <1>; +}; + +ð1 { + phy-handle = <&swphy4>; + nvmem-cells = <&macaddr_config_0>; + nvmem-cell-names = "mac-address"; + + gmac-config { + device = <&gmac>; + switch-phy-swap = <1>; + }; +}; + +&pinmux { + pmx_leds_switch: leds_switch { + // switch port LEDs on GPIO 0~4 + pinctrl-single,bits = <0x0 0x00000000 0xffffffff>, + <0x4 0x00000000 0x000000ff>; + }; +}; diff --git a/target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200-nand.dts b/target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200-nand.dts new file mode 100644 index 0000000000..0d4a71b5a6 --- /dev/null +++ b/target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200-nand.dts @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca9531_glinet_gl-ar300m.dtsi" + +/ { + compatible = "thinkpenguin,tpe-r1200-nand", "qca,qca9531"; + model = "ThinkPenguin TPE-R1200 (NAND)"; +}; + +&nand_kernel { + label = "kernel"; +}; + +&nand_ubi { + label = "ubi"; +}; diff --git a/target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200-nor.dts b/target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200-nor.dts new file mode 100644 index 0000000000..6dee84f095 --- /dev/null +++ b/target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200-nor.dts @@ -0,0 +1,11 @@ +#include "qca9531_glinet_gl-ar300m.dtsi" + +/ { + compatible = "thinkpenguin,tpe-r1200-nor", "qca,qca9531"; + model = "ThinkPenguin TPE-R1200 (NOR)"; +}; + +&nor_firmware { + compatible = "denx,uimage"; + label = "firmware"; +}; diff --git a/target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200.dts b/target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200.dts new file mode 100644 index 0000000000..6dee84f095 --- /dev/null +++ b/target/linux/ath79/dts/qca9531_thinkpenguin_tpe-r1200.dts @@ -0,0 +1,11 @@ +#include "qca9531_glinet_gl-ar300m.dtsi" + +/ { + compatible = "thinkpenguin,tpe-r1200-nor", "qca,qca9531"; + model = "ThinkPenguin TPE-R1200 (NOR)"; +}; + +&nor_firmware { + compatible = "denx,uimage"; + label = "firmware"; +}; diff --git a/target/linux/ath79/dts/qca9531_tplink_tl-mr3420-v3.dts b/target/linux/ath79/dts/qca9531_tplink_tl-mr3420-v3.dts index 818ec77695..e6fb852596 100644 --- a/target/linux/ath79/dts/qca9531_tplink_tl-mr3420-v3.dts +++ b/target/linux/ath79/dts/qca9531_tplink_tl-mr3420-v3.dts @@ -102,7 +102,7 @@ usb { label = "green:usb"; gpios = <&led_gpio 7 GPIO_ACTIVE_LOW>; - trigger-sources = <&hub_port>; + trigger-sources = <&hub_port0>; linux,default-trigger = "usbport"; }; @@ -190,14 +190,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/qca9531_tplink_tl-mr6400-v1.dts b/target/linux/ath79/dts/qca9531_tplink_tl-mr6400-v1.dts index ca7832ebd4..5a990fff02 100644 --- a/target/linux/ath79/dts/qca9531_tplink_tl-mr6400-v1.dts +++ b/target/linux/ath79/dts/qca9531_tplink_tl-mr6400-v1.dts @@ -148,14 +148,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/qca9533_dlink_dap-1330-a1.dts b/target/linux/ath79/dts/qca9533_dlink_dap-1330-a1.dts new file mode 100644 index 0000000000..3a1d4f9af7 --- /dev/null +++ b/target/linux/ath79/dts/qca9533_dlink_dap-1330-a1.dts @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca9533_dlink_dap-13xx.dtsi" + +/ { + compatible = "dlink,dap-1330-a1", "qca,qca9533"; + model = "D-Link DAP-1330 A1"; +}; diff --git a/target/linux/ath79/dts/qca9533_dlink_dap-1365-a1.dts b/target/linux/ath79/dts/qca9533_dlink_dap-1365-a1.dts new file mode 100644 index 0000000000..5c118e73f3 --- /dev/null +++ b/target/linux/ath79/dts/qca9533_dlink_dap-1365-a1.dts @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca9533_dlink_dap-13xx.dtsi" + +/ { + compatible = "dlink,dap-1365-a1", "qca,qca9533"; + model = "D-Link DAP-1365 A1"; +}; diff --git a/target/linux/ath79/dts/qca9533_dlink_dap-2230-a1.dts b/target/linux/ath79/dts/qca9533_dlink_dap-2230-a1.dts index 3717a35ae3..90383690b9 100644 --- a/target/linux/ath79/dts/qca9533_dlink_dap-2230-a1.dts +++ b/target/linux/ath79/dts/qca9533_dlink_dap-2230-a1.dts @@ -46,10 +46,4 @@ reg = <0xf50000 0xa0000>; read-only; }; - - art: partition@ff0000 { - label = "art"; - reg = <0xff0000 0x10000>; - read-only; - }; }; diff --git a/target/linux/ath79/dts/qca9533_dlink_dap-3320-a1.dts b/target/linux/ath79/dts/qca9533_dlink_dap-3320-a1.dts index c186a7ee44..5758b0d2a3 100644 --- a/target/linux/ath79/dts/qca9533_dlink_dap-3320-a1.dts +++ b/target/linux/ath79/dts/qca9533_dlink_dap-3320-a1.dts @@ -46,10 +46,4 @@ reg = <0xf60000 0x90000>; read-only; }; - - art: partition@ff0000 { - label = "art"; - reg = <0xff0000 0x10000>; - read-only; - }; }; diff --git a/target/linux/ath79/dts/qca9533_kuwfi_c910.dts b/target/linux/ath79/dts/qca9533_kuwfi_c910.dts new file mode 100644 index 0000000000..f2086d4176 --- /dev/null +++ b/target/linux/ath79/dts/qca9533_kuwfi_c910.dts @@ -0,0 +1,194 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca953x.dtsi" + +#include +#include +#include + +/ { + compatible = "kuwfi,c910", "qca,qca9533"; + model = "KuWFi C910"; + + aliases { + label-mac-device = ð1; + led-boot = &internet_red; + led-failsafe = &internet_red; + led-upgrade = &internet_red; + }; + + virtual_flash { + compatible = "mtd-concat"; + devices = <&fwconcat0 &fwconcat1>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + reg = <0x0 0x0>; + label = "firmware"; + compatible = "librecmc,uimage", "denx,uimage"; + librecmc,ih-magic = ; + }; + }; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + }; + + leds { + compatible = "gpio-leds"; + + internet_blue { + label = "blue:internet"; + gpios = <&gpio 1 GPIO_ACTIVE_LOW>; + }; + + wifi { + label = "white:wifi"; + gpios = <&gpio 2 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + + internet_green { + label = "green:internet"; + gpios = <&gpio 3 GPIO_ACTIVE_LOW>; + }; + + wan { + label = "white:wan"; + gpios = <&gpio 4 GPIO_ACTIVE_LOW>; + }; + + lan2 { + label = "white:lan2"; + gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + }; + + // gpio 12 enables or disables LTE (Quectel EC200T) + + internet_red: internet_red { + label = "red:internet"; + gpios = <&gpio 14 GPIO_ACTIVE_LOW>; + }; + + lan1 { + label = "white:lan1"; + gpios = <&gpio 15 GPIO_ACTIVE_LOW>; + }; + }; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "winbond,w25q128", "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x000000 0x020000>; + read-only; + }; + + partition@20000 { + label = "u-boot-env"; + reg = <0x020000 0x010000>; + read-only; + }; + + partition@30000 { + label = "config"; + reg = <0x030000 0x020000>; + read-only; + }; + + fwconcat0: partition@50000 { + label = "fwconcat0"; + reg = <0x050000 0xe30000>; + }; + + partition@e80000 { + label = "loader"; + reg = <0xe80000 0x10000>; + }; + + fwconcat1: partition@e90000 { + label = "fwconcat1"; + reg = <0xe90000 0x160000>; + }; + + partition@ff0000 { + label = "art"; + reg = <0xff0000 0x010000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + calibration_art_1000: macaddr@1000 { + reg = <0x1000 0x440>; + }; + + macaddr_art_1002: macaddr@1002 { + reg = <0x1002 0x6>; + }; + }; + }; + }; +}; + +&usb0 { + status = "okay"; +}; + +&usb_phy { + status = "okay"; +}; + +ð0 { + status = "okay"; + + phy-handle = <&swphy0>; + + nvmem-cells = <&macaddr_art_1002>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <1>; +}; + +ð1 { + phy-handle = <&swphy4>; + + nvmem-cells = <&macaddr_art_1002>; + nvmem-cell-names = "mac-address"; + + gmac-config { + device = <&gmac>; + switch-phy-swap = <1>; + }; +}; + +&wmac { + status = "okay"; + + nvmem-cells = <&calibration_art_1000>; + nvmem-cell-names = "calibration"; +}; diff --git a/target/linux/ath79/dts/qca9533_mikrotik_routerboard-16m.dtsi b/target/linux/ath79/dts/qca9533_mikrotik_routerboard-16m.dtsi index dbbe67d33d..e9bd05487c 100644 --- a/target/linux/ath79/dts/qca9533_mikrotik_routerboard-16m.dtsi +++ b/target/linux/ath79/dts/qca9533_mikrotik_routerboard-16m.dtsi @@ -48,7 +48,7 @@ read-only; }; - hard_config: hard_config { + hard_config { read-only; }; @@ -64,7 +64,6 @@ }; soft_config { - label = "soft_config"; }; }; diff --git a/target/linux/ath79/dts/qca9533_tplink_tl-wr842n-v3.dts b/target/linux/ath79/dts/qca9533_tplink_tl-wr842n-v3.dts index e171984511..2d00159909 100644 --- a/target/linux/ath79/dts/qca9533_tplink_tl-wr842n-v3.dts +++ b/target/linux/ath79/dts/qca9533_tplink_tl-wr842n-v3.dts @@ -71,7 +71,7 @@ label = "green:usb"; gpios = <&gpio 16 GPIO_ACTIVE_LOW>; linux,default-trigger = "usbport"; - trigger-sources = <&hub_port>; + trigger-sources = <&hub_port0>; }; }; @@ -95,14 +95,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy { diff --git a/target/linux/ath79/dts/qca953x.dtsi b/target/linux/ath79/dts/qca953x.dtsi index 745c736b74..4300c741ad 100644 --- a/target/linux/ath79/dts/qca953x.dtsi +++ b/target/linux/ath79/dts/qca953x.dtsi @@ -104,7 +104,9 @@ #clock-cells = <1>; clock-output-names = "cpu", "ddr", "ahb"; + clocks = <&extosc>; + clock-names = "ref"; }; wdt: wdt@18060008 { @@ -204,6 +206,11 @@ #address-cells = <1>; #size-cells = <0>; + + hub_port0: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; spi: spi@1f000000 { diff --git a/target/linux/ath79/dts/qca953x_dlink_dap-2xxx.dtsi b/target/linux/ath79/dts/qca953x_dlink_dap-2xxx.dtsi index 71d9fffbe3..13d41f7bd5 100644 --- a/target/linux/ath79/dts/qca953x_dlink_dap-2xxx.dtsi +++ b/target/linux/ath79/dts/qca953x_dlink_dap-2xxx.dtsi @@ -41,6 +41,20 @@ reg = <0x60000 0x10000>; read-only; }; + + partition@ff0000 { + label = "art"; + reg = <0xff0000 0x10000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + cal_ath9k: calibration@1000 { + reg = <0x1000 0x440>; + }; + }; }; }; }; @@ -48,5 +62,6 @@ &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; + nvmem-cells = <&cal_ath9k>; + nvmem-cell-names = "calibration"; }; diff --git a/target/linux/ath79/dts/qca9557_8dev_rambutan.dts b/target/linux/ath79/dts/qca9557_8dev_rambutan.dts index 2724c3a1b6..a816874692 100644 --- a/target/linux/ath79/dts/qca9557_8dev_rambutan.dts +++ b/target/linux/ath79/dts/qca9557_8dev_rambutan.dts @@ -110,9 +110,6 @@ &usb0 { status = "okay"; - - #address-cells = <1>; - #size-cells = <0>; }; &usb_phy1 { @@ -121,9 +118,6 @@ &usb1 { status = "okay"; - - #address-cells = <1>; - #size-cells = <0>; }; &art { diff --git a/target/linux/ath79/dts/qca9557_meraki_mr18.dts b/target/linux/ath79/dts/qca9557_meraki_mr18.dts new file mode 100644 index 0000000000..a88e2bcd37 --- /dev/null +++ b/target/linux/ath79/dts/qca9557_meraki_mr18.dts @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca955x.dtsi" + +#include +#include +#include + +/ { + compatible = "meraki,mr18", "qca,qca9558"; + model = "Meraki MR18"; + + aliases { + label-mac-device = ð0; + led-boot = &white; + led-failsafe = &orange; + led-running = &green; + led-upgrade = &white; + }; + + leds { + compatible = "gpio-leds"; + + white: white { + label = "white:power"; + gpios = <&gpio 18 GPIO_ACTIVE_LOW>; + }; + + orange: orange { + label = "orange:power"; + gpios = <&gpio 21 GPIO_ACTIVE_HIGH>; + panic-indicator; + }; + }; + + uleds { + compatible = "virtual-leds"; +#if 0 + /* + * RGB leds are not supported by uleds driver. + * but this is what the definitions for a as + * of yet unwritten leds_nu801 would look like. + */ + + rgbled-0 { + function = LED_FUNCTION_POWER; + color = ; + #address-cells = <1>; + #size-cells = <0>; + + led@0 { + reg = <0>; + color = ; + }; + + green: led@1 { + reg = <1>; + color = ; + }; + + led@2 { + reg = <2>; + color = ; + }; + }; + +#else + red { + label = "red:tricolor"; + color = ; + }; + + green: green { + label = "green:tricolor"; + color = ; + }; + + blue { + label = "blue:tricolor"; + color = ; + }; +#endif + }; + + button { + compatible = "gpio-keys"; + + reset { + label = "Reset"; + linux,code = ; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + + }; +}; + +&nand { + status = "okay"; + + nand-ecc-mode = "soft"; + nand-ecc-algo = "bch"; + nand-ecc-strength = <4>; + nand-ecc-step-size = <512>; + nand-is-boot-medium; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "nandloader"; + reg = <0x0 0x80000>; + read-only; + }; + + partition@80000 { + label = "kernel"; + reg = <0x80000 0x800000>; + }; + + partition@880000 { + label = "recovery"; + reg = <0x880000 0x800000>; + }; + + partition@1080000 { + label = "ubi"; + reg = <0x1080000 0x6f00000>; + }; + + partition@7fe0000 { + /* + * This is not always present. And if + * it is, then Meraki (or contractor) + * used a different ecc method than + * the one we need for the UBI partition. + * Reading this causes various reading + * errors. + * + * As a result: Please don't convert + * this to nvmem-cells. Instead there's + * a ubi-volume "caldata" that has the + * necessary data. + */ + + label = "odm-caldata"; + reg = <0x7fe0000 0x20000>; + read-only; + }; + }; +}; + +&pcie0 { + status = "okay"; + + wifi@0,0 { + compatible = "pci168c,0033"; + reg = <0x0000 0 0 0 0>; + qca,no-eeprom; + }; +}; + +&pcie1 { + status = "okay"; + + wifi@0,0 { + compatible = "pci168c,0033"; + reg = <0x0000 0 0 0 0>; + qca,no-eeprom; + }; +}; + +&uart { + status = "okay"; +}; + +&mdio0 { + status = "okay"; + + phy: ethernet-phy@3 { + reg = <3>; + }; +}; + +ð0 { + status = "okay"; + pll-data = <0xa6000000 0xa0000101 0x80001313>; + phy-handle = <&phy>; + + gmac-config { + device = <&gmac>; + rgmii-enabled = <1>; + rxd-delay = <3>; + rxdv-delay = <3>; + }; +}; + +&wmac { + status = "okay"; + qca,no-eeprom; +}; diff --git a/target/linux/ath79/dts/qca9558_aruba_ap-115.dts b/target/linux/ath79/dts/qca9558_aruba_ap-115.dts new file mode 100644 index 0000000000..fbd65ccac7 --- /dev/null +++ b/target/linux/ath79/dts/qca9558_aruba_ap-115.dts @@ -0,0 +1,239 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca955x.dtsi" + +#include +#include + +/ { + compatible = "aruba,ap-115", "qca,qca9558"; + model = "Aruba AP-115"; + + aliases { + led-boot = &led_power_green; + led-failsafe = &led_power_red; + led-running = &led_power_green; + led-upgrade = &led_power_red; + label-mac-device = ð0; + }; + + chosen { + bootargs = "console=ttyS0,9600n8"; + }; + + /** + * Currently unused GPIOs in libreCMC: + * + * TPM-CLK: 19 + * TPM-IO: 20 + * ETH-PHY-Interrupt: 11 + * Power-DC: 22 + * Power-PoE: 23 + * Power-PoE-8023af: 17 + */ + + leds { + compatible = "gpio-leds"; + + led_power_green: power-green { + label = "green:power"; + gpios = <&gpio 4 GPIO_ACTIVE_LOW>; + }; + + led_power_red: power-red { + label = "red:power"; + gpios = <&gpio 2 GPIO_ACTIVE_LOW>; + }; + + radio-24-green { + label = "green:radio-24"; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + + radio-24-amber { + label = "amber:radio-24"; + gpios = <&gpio 0 GPIO_ACTIVE_LOW>; + }; + + radio-5-green { + label = "green:radio-5"; + gpios = <&gpio 1 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy1tpt"; + }; + + radio-5-amber { + label = "amber:radio-5"; + gpios = <&gpio 21 GPIO_ACTIVE_LOW>; + }; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 18 GPIO_ACTIVE_LOW>; + }; + }; + + reg_usb_vbus { + compatible = "regulator-fixed"; + regulator-name = "usb_vbus"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + gpio = <&gpio 3 GPIO_ACTIVE_HIGH>; + enable-active-high; + regulator-always-on; + }; +}; + +&pcie0 { + status = "okay"; + + ath9k: wifi@0,0 { + compatible = "pci168c,0033"; + reg = <0x0000 0 0 0 0>; + qca,no-eeprom; + + nvmem-cells = <&macaddr_oemdata_1d>; + nvmem-cell-names = "mac-address"; + + mac-address-increment = <1>; + }; +}; + +&pinmux { + /** + * Ugly hack ahead! + * + * GPIO05: Bank1-CS / Bank2-CLK + * GPIO14: Bank1-CLK / Bank2-CS + * + * We can not support this with libreCMC, as this + * would require us to influence the pinmux based on the CS. + * + * We force-select Bank 1. Remember to blame Aruba for that. + */ + cs0_pin5: spi-cs0-pin5 { + pinctrl-single,bits = <0x4 0x900 0xff00>; + }; + + clk_pin14: spi-cs1-pin14 { + pinctrl-single,bits = <0xc 0x0a0000 0xff0000>; + }; +}; + +&spi { + pinctrl-names = "default"; + pinctrl-0 = <&cs0_pin5 &clk_pin14>; + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@1 { + label = "flash-full"; + reg = <0x0 0x1000000>; + read-only; + }; + + uboot: partition@0 { + label = "u-boot"; + reg = <0x000000 0x040000>; + read-only; + }; + + /* Here be dragons */ + + partition@100000 { + compatible = "denx,uimage"; + label = "firmware"; + reg = <0x100000 0xe00000>; + }; + + oemdata: partition@fe0000 { + label = "oemdata"; + reg = <0xfe0000 0x010000>; + read-only; + }; + + partition@ff0000 { + label = "u-boot-env"; + reg = <0xff0000 0x10000>; + }; + }; + }; +}; + +&wmac { + status = "okay"; + + qca,no-eeprom; + nvmem-cells = <&macaddr_oemdata_1d>; + nvmem-cell-names = "mac-address"; +}; + +&mdio0 { + status = "okay"; + + phy0: ethernet-phy@0 { + reg = <0>; + + reset-gpios = <&gpio 12 GPIO_ACTIVE_LOW>; + reset-assert-us = <10000>; + reset-deassert-us = <10000>; + + eee-broken-100tx; + eee-broken-1000t; + }; +}; + +ð0 { + status = "okay"; + + nvmem-cells = <&macaddr_oemdata_1d>; + nvmem-cell-names = "mac-address"; + + phy-handle = <&phy0>; + phy-mode = "rgmii-id"; + + pll-data = <0xa6000000 0xa0000101 0xa0001313>; + + gmac-config { + device = <&gmac>; + ge0-sgmii = <0>; + txen-delay = <3>; + txd-delay = <3>; + rxdv-delay = <3>; + rxd-delay = <3>; + rgmii-enabled = <1>; + }; +}; + +&oemdata { + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_oemdata_1d: macaddr@1d { + reg = <0x1d 0x6>; + }; +}; + +&usb_phy0 { + status = "okay"; +}; + +&usb0 { + dr_mode = "host"; + status = "okay"; +}; diff --git a/target/linux/ath79/dts/qca9558_dlink_dir-629-a1.dts b/target/linux/ath79/dts/qca9558_dlink_dir-629-a1.dts new file mode 100644 index 0000000000..41b0039e93 --- /dev/null +++ b/target/linux/ath79/dts/qca9558_dlink_dir-629-a1.dts @@ -0,0 +1,170 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca955x.dtsi" + +#include +#include +#include + +/ { + compatible = "dlink,dir-629-a1", "qca,qca9558"; + model = "D-Link DIR-629 A1"; + + aliases { + label-mac-device = ð0; + led-boot = &led_power; + led-failsafe = &led_power; + led-running = &led_power; + led-upgrade = &led_power; + serial0 = &uart; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + }; + + wps { + label = "wps"; + linux,code = ; + gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + }; + }; + + leds { + compatible = "gpio-leds"; + + led-0 { + color = ; + function = LED_FUNCTION_WLAN; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + + led_power: led-1 { + label = "green:power"; + color = ; + function = LED_FUNCTION_POWER; + gpios = <&gpio 21 GPIO_ACTIVE_LOW>; + }; + + led-2 { + color = ; + function = LED_FUNCTION_WPS; + gpios = <&gpio 23 GPIO_ACTIVE_LOW>; + }; + }; +}; + +ð0 { + status = "okay"; + + phy-mode = "mii"; + + nvmem-cells = <&macaddr_mfcdata_35>; + nvmem-cell-names = "mac-address-ascii"; + + fixed-link { + speed = <100>; + full-duplex; + }; +}; + +&mdio0 { + status = "okay"; + + switch0@1f { + compatible = "qca,ar8236"; + reg = <0x1f>; + }; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <30000000>; + m25p,fast-read; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x000000 0x040000>; + read-only; + }; + + partition@40000 { + label = "u-boot-env"; + reg = <0x040000 0x008000>; + read-only; + }; + + partition@48000 { + label = "mfcdata"; + reg = <0x048000 0x008000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_mfcdata_35: macaddr@35 { + reg = <0x35 0x11>; + }; + + macaddr_mfcdata_51: macaddr@51 { + reg = <0x51 0x11>; + }; + }; + + partition@50000 { + label = "devconf"; + reg = <0x050000 0x010000>; + read-only; + }; + + partition@60000 { + label = "langpack"; + reg = <0x060000 0x020000>; + read-only; + }; + + partition@80000 { + label = "art"; + reg = <0x080000 0x010000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + cal_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + }; + + partition@90000 { + compatible = "seama"; + label = "firmware"; + reg = <0x090000 0x770000>; + }; + }; + }; +}; + +&wmac { + status = "okay"; + + nvmem-cells = <&cal_art_1000>, <&macaddr_mfcdata_51>; + nvmem-cell-names = "calibration", "mac-address-ascii"; +}; diff --git a/target/linux/ath79/dts/qca9558_engenius_esr900.dts b/target/linux/ath79/dts/qca9558_engenius_esr900.dts new file mode 100644 index 0000000000..269f743223 --- /dev/null +++ b/target/linux/ath79/dts/qca9558_engenius_esr900.dts @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca955x_senao_router-dual.dtsi" + +/ { + compatible = "engenius,esr900", "qca,qca9558"; + model = "EnGenius ESR900"; + + aliases { + led-boot = &led_power; + led-failsafe = &led_power; + led-running = &led_power; + led-upgrade = &led_power; + }; + + leds { + compatible = "gpio-leds"; + + led_power: power { + label = "amber:power"; + gpios = <&gpio 2 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + + wlan2g { + label = "blue:wlan2g"; + gpios = <&gpio 13 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy1tpt"; + }; + + wlan5g { + label = "blue:wlan5g"; + gpios = <&gpio 23 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + + wps_amber { + label = "amber:wps"; + gpios = <&gpio 22 GPIO_ACTIVE_LOW>; + }; + + wps_blue { + label = "blue:wps"; + gpios = <&gpio 19 GPIO_ACTIVE_LOW>; + }; + }; +}; + +&phy0 { + qca,mib-poll-interval = <500>; + + qca,ar8327-initvals = < + 0x04 0x07680000 /* PORT0 PAD MODE CTRL */ + 0x10 0x40000000 /* POWER_ON_STRAP */ + 0x50 0xcf35cf35 /* LED_CTRL0 */ + 0x54 0xcf35cf35 /* LED_CTRL1 */ + 0x58 0xcf35cf35 /* LED_CTRL2 */ + 0x5c 0x03ffff00 /* LED_CTRL3 */ + 0x7c 0x0000007e /* PORT0_STATUS */ + >; +}; + +&usb_phy1 { + status = "okay"; +}; + +&usb1 { + status = "okay"; +}; + +&wmac { + nvmem-cells = <&calibration_art_1000>; + nvmem-cell-names = "calibration"; +}; + +&pcie0 { + status = "okay"; + + wifi@0,0,0 { + compatible = "pci168c,0033"; + reg = <0x0000 0 0 0 0>; + nvmem-cells = <&calibration_art_5000>; + nvmem-cell-names = "calibration"; + }; +}; diff --git a/target/linux/ath79/dts/qca9558_librerouter_librerouter-v1.dts b/target/linux/ath79/dts/qca9558_librerouter_librerouter-v1.dts index a9c03b7eda..b3447f8be3 100644 --- a/target/linux/ath79/dts/qca9558_librerouter_librerouter-v1.dts +++ b/target/linux/ath79/dts/qca9558_librerouter_librerouter-v1.dts @@ -84,8 +84,6 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; }; @@ -94,8 +92,6 @@ }; &usb1 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; }; diff --git a/target/linux/ath79/dts/qca9558_mikrotik_routerboard-92x.dtsi b/target/linux/ath79/dts/qca9558_mikrotik_routerboard-92x.dtsi index d71c12c1fd..d668259b1b 100644 --- a/target/linux/ath79/dts/qca9558_mikrotik_routerboard-92x.dtsi +++ b/target/linux/ath79/dts/qca9558_mikrotik_routerboard-92x.dtsi @@ -131,7 +131,7 @@ read-only; }; - hard_config: hard_config { + hard_config { read-only; }; @@ -150,6 +150,7 @@ status = "okay"; nand-ecc-mode = "soft"; + nand-ecc-step-size = <2048>; qca,nand-swap-dma; qca,nand-scan-fixup; diff --git a/target/linux/ath79/dts/qca9558_netgear_ex7300.dtsi b/target/linux/ath79/dts/qca9558_netgear_ex7300.dtsi deleted file mode 100644 index 6c5ed4defb..0000000000 --- a/target/linux/ath79/dts/qca9558_netgear_ex7300.dtsi +++ /dev/null @@ -1,228 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later OR MIT - -#include "qca955x.dtsi" - -#include -#include - -/ { - aliases { - led-boot = &led_power_green; - led-failsafe = &led_power_amber; - led-running = &led_power_green; - led-upgrade = &led_power_amber; - label-mac-device = ð0; - }; - - led_spi { - compatible = "spi-gpio"; - #address-cells = <1>; - #size-cells = <0>; - - sck-gpios = <&gpio 18 GPIO_ACTIVE_HIGH>; - mosi-gpios = <&gpio 15 GPIO_ACTIVE_HIGH>; - num-chipselects = <0>; - - led_gpio: led_gpio@0 { - compatible = "nxp,74lvc594"; - reg = <0>; - gpio-controller; - #gpio-cells = <2>; - registers-number = <1>; - spi-max-frequency = <500000>; - - gpio_latch_bit { - gpio-hog; - gpios = <4 GPIO_ACTIVE_HIGH>; - output-high; - line-name = "gpio-latch-bit"; - }; - }; - }; - - leds { - compatible = "gpio-leds"; - - led_power_green: power_green { - label = "green:power"; - gpios = <&gpio 19 GPIO_ACTIVE_LOW>; - }; - - led_power_amber: power_amber { - label = "amber:power"; - gpios = <&gpio 20 GPIO_ACTIVE_LOW>; - }; - - left_blue { - label = "blue:left"; - gpios = <&led_gpio 7 GPIO_ACTIVE_LOW>; - }; - - right_blue { - label = "blue:right"; - gpios = <&led_gpio 6 GPIO_ACTIVE_LOW>; - }; - - wps_green { - label = "green:wps"; - gpios = <&led_gpio 5 GPIO_ACTIVE_LOW>; - }; - - client_red { - label = "red:client"; - gpios = <&led_gpio 3 GPIO_ACTIVE_LOW>; - }; - - client_green { - label = "green:client"; - gpios = <&led_gpio 2 GPIO_ACTIVE_LOW>; - }; - - router_red { - label = "red:router"; - gpios = <&led_gpio 1 GPIO_ACTIVE_LOW>; - }; - - router_green { - label = "green:router"; - gpios = <&led_gpio 0 GPIO_ACTIVE_LOW>; - }; - }; - - keys { - compatible = "gpio-keys"; - - reset { - label = "Reset button"; - linux,code = ; - gpios = <&gpio 11 GPIO_ACTIVE_LOW>; - debounce-interval = <60>; - }; - - wps { - label = "WPS button"; - linux,code = ; - gpios = <&gpio 22 GPIO_ACTIVE_LOW>; - debounce-interval = <60>; - }; - - extender_apmode { - label = "EXTENDER/APMODE switch"; - gpios = <&gpio 23 GPIO_ACTIVE_LOW>; - linux,code = ; - linux,input-type = ; - debounce-interval = <60>; - }; - }; -}; - -&pcie0 { - status = "okay"; -}; - -&pll { - clocks = <&extosc>; -}; - -&spi { - status = "okay"; - - flash@0 { - compatible = "jedec,spi-nor"; - reg = <0>; - spi-max-frequency = <25000000>; - - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - uboot: partition@0 { - label = "u-boot"; - reg = <0x000000 0x040000>; - read-only; - }; - - partition@40000 { - label = "u-boot-env"; - reg = <0x040000 0x010000>; - }; - - caldata: partition@50000 { - label = "caldata"; - reg = <0x050000 0x010000>; - read-only; - }; - - partition@60000 { - label = "caldata-backup"; - reg = <0x060000 0x010000>; - read-only; - }; - - partition@70000 { - label = "config"; - reg = <0x070000 0x010000>; - }; - - partition@80000 { - label = "pot"; - reg = <0x080000 0x010000>; - }; - - partition@90000 { - label = "firmware"; - reg = <0x090000 0xf30000>; - compatible = "denx,uimage"; - }; - - partition@fc0000 { - label = "language"; - reg = <0xfc0000 0x040000>; - }; - }; - }; -}; - -&wmac { - status = "okay"; - - mtd-cal-data = <&caldata 0x1000>; - nvmem-cells = <&macaddr_caldata_6>; - nvmem-cell-names = "mac-address"; -}; - -&mdio0 { - status = "okay"; - - phy4: ethernet-phy@4 { - reg = <4>; - phy-mode = "rgmii"; - }; -}; - -ð0 { - status = "okay"; - - nvmem-cells = <&macaddr_caldata_0>; - nvmem-cell-names = "mac-address"; - - phy-handle = <&phy4>; - phy-mode = "rgmii-rxid"; - - pll-data = <0x86000000 0x80000101 0x80001313>; -}; - -&caldata { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_caldata_0: macaddr@0 { - reg = <0x0 0x6>; - }; - - macaddr_caldata_6: macaddr@6 { - reg = <0x6 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/qca9558_ocedo_ursus.dts b/target/linux/ath79/dts/qca9558_ocedo_ursus.dts index 2dc4c07e91..be958d19a0 100644 --- a/target/linux/ath79/dts/qca9558_ocedo_ursus.dts +++ b/target/linux/ath79/dts/qca9558_ocedo_ursus.dts @@ -30,10 +30,6 @@ status = "okay"; }; -&pll { - clocks = <&extosc>; -}; - &spi { status = "okay"; @@ -59,15 +55,10 @@ }; partition@50000 { + /* Dual-Flash layout combined */ compatible = "denx,uimage"; label = "firmware"; - reg = <0x050000 0x740000>; - }; - - partition@790000 { - label = "vendor"; - reg = <0x790000 0x740000>; - read-only; + reg = <0x050000 0xe80000>; }; partition@ed0000 { diff --git a/target/linux/ath79/dts/qca9558_openmesh_a60.dtsi b/target/linux/ath79/dts/qca9558_openmesh_a60.dtsi index 05d3a4f341..c2062a800a 100644 --- a/target/linux/ath79/dts/qca9558_openmesh_a60.dtsi +++ b/target/linux/ath79/dts/qca9558_openmesh_a60.dtsi @@ -119,8 +119,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x6>; - phy1: ethernet-phy@1 { reg = <1>; eee-broken-100tx; diff --git a/target/linux/ath79/dts/qca9558_openmesh_mr.dtsi b/target/linux/ath79/dts/qca9558_openmesh_mr.dtsi index 8c4856f1ea..8e11760daf 100644 --- a/target/linux/ath79/dts/qca9558_openmesh_mr.dtsi +++ b/target/linux/ath79/dts/qca9558_openmesh_mr.dtsi @@ -127,8 +127,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x20>; - phy5: ethernet-phy@5 { reg = <5>; eee-broken-100tx; diff --git a/target/linux/ath79/dts/qca9558_sophos_ap.dtsi b/target/linux/ath79/dts/qca9558_sophos_ap.dtsi index 5c79d19de0..3d38ca79fe 100644 --- a/target/linux/ath79/dts/qca9558_sophos_ap.dtsi +++ b/target/linux/ath79/dts/qca9558_sophos_ap.dtsi @@ -121,8 +121,6 @@ &mdio0 { status = "okay"; - phy-mask = <0x10>; - phy4: ethernet-phy@4 { reg = <4>; eee-broken-100tx; @@ -171,9 +169,4 @@ &usb0 { vbus-supply = <®_usb_vbus>; - - hub_port0: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; diff --git a/target/linux/ath79/dts/qca9558_tplink_archer-c.dtsi b/target/linux/ath79/dts/qca9558_tplink_archer-c.dtsi index f629838f1a..221582e66d 100644 --- a/target/linux/ath79/dts/qca9558_tplink_archer-c.dtsi +++ b/target/linux/ath79/dts/qca9558_tplink_archer-c.dtsi @@ -85,14 +85,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port0: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy1 { @@ -100,14 +93,7 @@ }; &usb1 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &spi { diff --git a/target/linux/ath79/dts/qca9558_tplink_archer-c7-v2.dts b/target/linux/ath79/dts/qca9558_tplink_archer-c7-v2.dts index b7ac902003..1b860dbf2d 100644 --- a/target/linux/ath79/dts/qca9558_tplink_archer-c7-v2.dts +++ b/target/linux/ath79/dts/qca9558_tplink_archer-c7-v2.dts @@ -13,10 +13,11 @@ &keys { rfkill { + label = "rfkill"; gpios = <&gpio 23 GPIO_ACTIVE_LOW>; linux,code = ; linux,input-type = ; - debounce-interval = <60>; + debounce-interval = <1000>; }; }; diff --git a/target/linux/ath79/dts/qca9558_tplink_archer-d7.dtsi b/target/linux/ath79/dts/qca9558_tplink_archer-d7.dtsi index f9e8adcc9e..c4d910bf1e 100644 --- a/target/linux/ath79/dts/qca9558_tplink_archer-d7.dtsi +++ b/target/linux/ath79/dts/qca9558_tplink_archer-d7.dtsi @@ -141,16 +141,9 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; dr_mode = "host"; vbus-supply = <®_usb0_vbus>; status = "okay"; - - hub_port0: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy1 { @@ -158,14 +151,7 @@ }; &usb1 { - #address-cells = <1>; - #size-cells = <0>; dr_mode = "host"; vbus-supply = <®_usb1_vbus>; status = "okay"; - - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; diff --git a/target/linux/ath79/dts/qca9558_tplink_tl-wdr4900-v2.dts b/target/linux/ath79/dts/qca9558_tplink_tl-wdr4900-v2.dts index 5b69a1708e..c6b9b077da 100644 --- a/target/linux/ath79/dts/qca9558_tplink_tl-wdr4900-v2.dts +++ b/target/linux/ath79/dts/qca9558_tplink_tl-wdr4900-v2.dts @@ -96,10 +96,9 @@ ath9k: wifi@0,0 { compatible = "pci168c,0033"; reg = <0x0000 0 0 0 0>; - nvmem-cells = <&macaddr_uboot_1fc00>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_uboot_1fc00>, <&cal_ath9k_pci>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <(-2)>; - qca,no-eeprom; #gpio-cells = <2>; gpio-controller; }; @@ -110,14 +109,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port0: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy1 { @@ -125,14 +117,7 @@ }; &usb1 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &spi { @@ -152,6 +137,14 @@ label = "u-boot"; reg = <0x000000 0x020000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_uboot_1fc00: macaddr@1fc00 { + reg = <0x1fc00 0x6>; + }; }; partition@20000 { @@ -164,6 +157,18 @@ label = "art"; reg = <0x7f0000 0x010000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + cal_ath9k_soc: cal_ath9k@1000 { + reg = <0x1000 0x440>; + }; + + cal_ath9k_pci: cal_ath9k@5000 { + reg = <0x5000 0x440>; + }; }; }; }; @@ -219,18 +224,7 @@ &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; - nvmem-cells = <&macaddr_uboot_1fc00>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_uboot_1fc00>, <&cal_ath9k_soc>; + nvmem-cell-names = "mac-address", "calibration"; mac-address-increment = <(-1)>; }; - -&uboot { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_uboot_1fc00: macaddr@1fc00 { - reg = <0x1fc00 0x6>; - }; -}; diff --git a/target/linux/ath79/dts/qca9558_tplink_tl-wr1043nd.dtsi b/target/linux/ath79/dts/qca9558_tplink_tl-wr1043nd.dtsi index ff7ea7da03..52996bba34 100644 --- a/target/linux/ath79/dts/qca9558_tplink_tl-wr1043nd.dtsi +++ b/target/linux/ath79/dts/qca9558_tplink_tl-wr1043nd.dtsi @@ -77,14 +77,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port0: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &spi { diff --git a/target/linux/ath79/dts/qca9558_ubnt_nanobeam-ac-xc.dts b/target/linux/ath79/dts/qca9558_ubnt_nanobeam-ac-xc.dts index 14388079b6..91675ff615 100644 --- a/target/linux/ath79/dts/qca9558_ubnt_nanobeam-ac-xc.dts +++ b/target/linux/ath79/dts/qca9558_ubnt_nanobeam-ac-xc.dts @@ -5,7 +5,7 @@ * Copyright (C) 2022 Daniel González Cabanelas * based on device tree from qca9558_ubnt_powerbeam-5ac-500.dts */ - + #include "qca955x_ubnt_xc.dtsi" / { @@ -81,7 +81,6 @@ &mdio0 { status = "okay"; - phy-mask = <4>; phy4: ethernet-phy@4 { phy-mode = "sgmii"; reg = <4>; diff --git a/target/linux/ath79/dts/qca9558_ubnt_powerbeam-5ac-500.dts b/target/linux/ath79/dts/qca9558_ubnt_powerbeam-5ac-500.dts index 9d3d1395f9..3827a94b24 100644 --- a/target/linux/ath79/dts/qca9558_ubnt_powerbeam-5ac-500.dts +++ b/target/linux/ath79/dts/qca9558_ubnt_powerbeam-5ac-500.dts @@ -21,7 +21,6 @@ &mdio0 { status = "okay"; - phy-mask = <4>; phy4: ethernet-phy@4 { phy-mode = "sgmii"; reg = <4>; diff --git a/target/linux/ath79/dts/qca9558_ubnt_rocket-5ac-lite.dts b/target/linux/ath79/dts/qca9558_ubnt_rocket-5ac-lite.dts index 0458fcaa4d..836211ccd5 100644 --- a/target/linux/ath79/dts/qca9558_ubnt_rocket-5ac-lite.dts +++ b/target/linux/ath79/dts/qca9558_ubnt_rocket-5ac-lite.dts @@ -21,7 +21,6 @@ &mdio0 { status = "okay"; - phy-mask = <4>; phy4: ethernet-phy@4 { phy-mode = "sgmii"; reg = <4>; diff --git a/target/linux/ath79/dts/qca955x.dtsi b/target/linux/ath79/dts/qca955x.dtsi index b6e08f9f12..e7daa9d827 100644 --- a/target/linux/ath79/dts/qca955x.dtsi +++ b/target/linux/ath79/dts/qca955x.dtsi @@ -119,6 +119,7 @@ clock-output-names = "cpu", "ddr", "ahb"; clocks = <&extosc>; + clock-names = "ref"; }; wdt: wdt@18060008 { @@ -267,6 +268,11 @@ #address-cells = <1>; #size-cells = <0>; + + hub_port0: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; usb1: usb@1b400000 { @@ -288,6 +294,11 @@ #address-cells = <1>; #size-cells = <0>; + + hub_port1: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; nand: nand@1b800200 { diff --git a/target/linux/ath79/dts/qca955x_dlink_dap-2xxx.dtsi b/target/linux/ath79/dts/qca955x_dlink_dap-2xxx.dtsi index 1047dfddeb..3e254fa494 100644 --- a/target/linux/ath79/dts/qca955x_dlink_dap-2xxx.dtsi +++ b/target/linux/ath79/dts/qca955x_dlink_dap-2xxx.dtsi @@ -41,6 +41,20 @@ reg = <0x60000 0x10000>; read-only; }; + + art: partition@ff0000 { + label = "art"; + reg = <0xff0000 0x10000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + cal_ath9k: calibration@1000 { + reg = <0x1000 0x440>; + }; + }; }; }; }; @@ -48,5 +62,6 @@ &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; + nvmem-cells = <&cal_ath9k>; + nvmem-cell-names = "calibration"; }; diff --git a/target/linux/ath79/dts/qca955x_senao_loader.dtsi b/target/linux/ath79/dts/qca955x_senao_loader.dtsi index fc4f23fefd..004ad2bf5b 100644 --- a/target/linux/ath79/dts/qca955x_senao_loader.dtsi +++ b/target/linux/ath79/dts/qca955x_senao_loader.dtsi @@ -26,14 +26,19 @@ }; &pcie0 { - status = "okay"; - - wifi@0,0,0 { + ath10k_0: wifi@0,0,0 { compatible = "qcom,ath10k"; reg = <0x0 0 0 0 0>; }; }; +&pcie1 { + ath10k_1: wifi@0,1,0 { + compatible = "qcom,ath10k"; + reg = <0x0 1 0 0 0>; + }; +}; + &spi { status = "okay"; diff --git a/target/linux/ath79/dts/qca955x_senao_router-dual.dtsi b/target/linux/ath79/dts/qca955x_senao_router-dual.dtsi new file mode 100644 index 0000000000..e1b76bcbd1 --- /dev/null +++ b/target/linux/ath79/dts/qca955x_senao_router-dual.dtsi @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca955x.dtsi" + +#include +#include + +/ { + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 17 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + + wps { + label = "wps"; + linux,code = ; + gpios = <&gpio 16 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + }; +}; + +ð0 { + status = "okay"; + + phy-handle = <&phy0>; + pll-data = <0xa6000000 0x00000101 0x00001616>; +}; + +&mdio0 { + status = "okay"; + + phy0: ethernet-phy@0 { + reg = <0>; + }; +}; + +&pcie0 { + status = "okay"; + + ath10k_0: wifi@0,0,0 { + compatible = "qcom,ath10k"; + reg = <0x0000 0 0 0 0>; + }; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <40000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x000000 0x030000>; + read-only; + }; + + partition@30000 { + label = "u-boot-env"; + reg = <0x030000 0x010000>; + read-only; + }; + + partition@40000 { + compatible = "denx,uimage"; + label = "firmware"; + reg = <0x040000 0xe50000>; + }; + + partition@e90000 { + label = "manufacture"; + reg = <0xe90000 0x100000>; + read-only; + }; + + partition@f90000 { + label = "backup"; + reg = <0xf90000 0x010000>; + read-only; + }; + + partition@fa0000 { + label = "storage"; + reg = <0xfa0000 0x050000>; + read-only; + }; + + art: partition@ff0000 { + label = "art"; + reg = <0xff0000 0x010000>; + read-only; + + compatible = "nvmem-cells"; + + calibration_art_1000: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_art_5000: calibration@5000 { + reg = <0x5000 0x844>; + }; + }; + }; + }; +}; + +&wmac { + status = "okay"; +}; diff --git a/target/linux/ath79/dts/qca955x_zyxel_nbg6x16.dtsi b/target/linux/ath79/dts/qca955x_zyxel_nbg6x16.dtsi index 9e1ce89c46..7de1c4fa69 100644 --- a/target/linux/ath79/dts/qca955x_zyxel_nbg6x16.dtsi +++ b/target/linux/ath79/dts/qca955x_zyxel_nbg6x16.dtsi @@ -116,19 +116,8 @@ &usb0 { status = "okay"; - - hub_port0: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; - }; &usb1 { status = "okay"; - - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; diff --git a/target/linux/ath79/dts/qca9563_compex_wpj563.dts b/target/linux/ath79/dts/qca9563_compex_wpj563.dts index ba31f40fe2..407e912ad2 100644 --- a/target/linux/ath79/dts/qca9563_compex_wpj563.dts +++ b/target/linux/ath79/dts/qca9563_compex_wpj563.dts @@ -99,8 +99,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "sgmii"; @@ -132,6 +130,14 @@ status = "okay"; }; +&usb_phy1 { + status = "okay"; +}; + +&usb1 { + status = "okay"; +}; + &wmac { status = "okay"; diff --git a/target/linux/ath79/dts/qca9563_dlink_dir-842-c.dtsi b/target/linux/ath79/dts/qca9563_dlink_dir-842-c.dtsi index 1366e68a8f..a42deaddaf 100644 --- a/target/linux/ath79/dts/qca9563_dlink_dir-842-c.dtsi +++ b/target/linux/ath79/dts/qca9563_dlink_dir-842-c.dtsi @@ -121,8 +121,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; qca,mib-poll-interval = <500>; diff --git a/target/linux/ath79/dts/qca9563_dlink_dir-8x9-a1.dtsi b/target/linux/ath79/dts/qca9563_dlink_dir-8x9-a1.dtsi new file mode 100644 index 0000000000..3fd9790c4a --- /dev/null +++ b/target/linux/ath79/dts/qca9563_dlink_dir-8x9-a1.dtsi @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qca956x.dtsi" + +#include +#include + +/ { + keys { + compatible = "gpio-keys"; + + wps { + label = "wps"; + linux,code = ; + gpios = <&gpio 1 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 2 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + }; +}; + +&pcie { + status = "okay"; + + ath10k: wifi@0,0 { + compatible = "qcom,ath10k"; + reg = <0x0000 0 0 0 0>; + + nvmem-cells = <&calibration_ath10k>, <&macaddr_devdata_94>; + nvmem-cell-names = "calibration", "mac-address-ascii"; + }; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "bootloader"; + reg = <0x000000 0x040000>; + read-only; + }; + + bdcfg: partition@40000 { + compatible = "u-boot,env"; + label = "bdcfg"; + reg = <0x040000 0x010000>; + }; + + partition@50000 { + label = "devdata"; + reg = <0x050000 0x010000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_devdata_94: macaddr@94 { + reg = <0x94 0x11>; + }; + + macaddr_devdata_b0: macaddr@b0 { + reg = <0xb0 0x11>; + }; + }; + + partition@60000 { + label = "devconf"; + reg = <0x060000 0x010000>; + read-only; + }; + + partition@70000 { + compatible = "seama"; + label = "firmware"; + reg = <0x070000 0xf80000>; + }; + + partition@ff0000 { + label = "art"; + reg = <0xff0000 0x010000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + calibration_ath9k: calibration@1000 { + reg = <0x1000 0x440>; + }; + + calibration_ath10k: calibration@5000 { + reg = <0x5000 0x844>; + }; + }; + }; + }; +}; + +&mdio0 { + status = "okay"; + + phy0: ethernet-phy@0 { + reg = <0>; + phy-mode = "sgmii"; + qca,mib-poll-interval = <500>; + + reset-gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + + qca,ar8327-initvals = < + 0x04 0x00080080 /* PORT0 PAD MODE CTRL */ + 0x10 0x81000080 /* POWER_ON_STRAP */ + 0x50 0xcc35cc35 /* LED_CTRL0 */ + 0x54 0xcb37cb37 /* LED_CTRL1 */ + 0x58 0x00000000 /* LED_CTRL2 */ + 0x5c 0x00f3cf00 /* LED_CTRL3 */ + 0x7c 0x0000007e /* PORT0_STATUS */ + >; + }; +}; + +ð0 { + status = "okay"; + + pll-data = <0x03000101 0x00000101 0x00001919>; + + phy-mode = "sgmii"; + phy-handle = <&phy0>; +}; + +&wmac { + status = "okay"; + + nvmem-cells = <&calibration_ath9k>, <&macaddr_devdata_b0>; + nvmem-cell-names = "calibration", "mac-address-ascii"; +}; diff --git a/target/linux/ath79/dts/qca9563_elecom_wrc-300ghbk2-i.dts b/target/linux/ath79/dts/qca9563_elecom_wrc-300ghbk2-i.dts index 28ffce6434..5ffff57b48 100644 --- a/target/linux/ath79/dts/qca9563_elecom_wrc-300ghbk2-i.dts +++ b/target/linux/ath79/dts/qca9563_elecom_wrc-300ghbk2-i.dts @@ -38,6 +38,18 @@ label = "art"; reg = <0x7f0000 0x010000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + cal_art_1000: cal@1000 { + reg = <0x1000 0x440>; + }; + + macaddr_art_1002: macaddr@1002 { + reg = <0x1002 0x6>; + }; }; }; @@ -48,15 +60,6 @@ }; &wmac { - mtd-cal-data = <&art 0x1000>; -}; - -&art { - compatible = "nvmem-cells"; - #address-cells = <1>; - #size-cells = <1>; - - macaddr_art_1002: macaddr@1002 { - reg = <0x1002 0x6>; - }; + nvmem-cells = <&cal_art_1000>; + nvmem-cell-names = "calibration"; }; diff --git a/target/linux/ath79/dts/qca9563_netgear_wndr.dtsi b/target/linux/ath79/dts/qca9563_netgear_wndr.dtsi index 6090fdf527..799297f4e1 100644 --- a/target/linux/ath79/dts/qca9563_netgear_wndr.dtsi +++ b/target/linux/ath79/dts/qca9563_netgear_wndr.dtsi @@ -90,6 +90,22 @@ linux,default-trigger = "phy1tpt"; }; }; + + ubi-concat { + compatible = "mtd-concat"; + devices = <&ubiconcat0 &ubiconcat1>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "ubi"; + reg = <0x0 0x0>; + }; + }; + }; }; &spi { @@ -165,10 +181,20 @@ reg = <0x0 0x400000>; }; - partition@400000 { - label = "ubi"; - reg = <0x400000 0x7c00000>; + ubiconcat0: partition@400000 { + label = "ubiconcat0"; + reg = <0x400000 0x5c00000>; }; + + ubiconcat1: partition@6020000 { + label = "ubiconcat1"; + reg = <0x6020000 0x1f60000>; + }; + /* + * U-boot always unconditionally marks block 768, 1020 - 1023 as + * bad blocks on each boot. To avoid conflicts with the nand + * driver, manually skip them. + */ }; }; }; @@ -176,8 +202,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "sgmii"; @@ -211,9 +235,8 @@ &wmac { status = "okay"; - nvmem-cells = <&macaddr_caldata_0>; - nvmem-cell-names = "mac-address"; - qca,no-eeprom; + nvmem-cells = <&macaddr_caldata_0>, <&cal_art_1000>; + nvmem-cell-names = "mac-address", "calibration"; }; &pcie { @@ -223,9 +246,8 @@ /* chip is AR9580, override bogus PCI ID 168c:abcd */ compatible = "pci168c,0033"; reg = <0x0000 0 0 0 0>; - nvmem-cells = <&macaddr_caldata_c>; - nvmem-cell-names = "mac-address"; - qca,no-eeprom; + nvmem-cells = <&macaddr_caldata_c>, <&cal_art_5000>; + nvmem-cell-names = "mac-address", "calibration"; qca,gpio-mask=<0xf6ff>; /* unmask pin 9 for RFKILL button */ #gpio-cells = <2>; gpio-controller; @@ -237,14 +259,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port0: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &caldata { @@ -259,4 +274,12 @@ macaddr_caldata_c: macaddr@c { reg = <0xc 0x6>; }; + + cal_art_1000: cal@1000 { + reg = <0x1000 0x440>; + }; + + cal_art_5000: cal@5000 { + reg = <0x5000 0x440>; + }; }; diff --git a/target/linux/ath79/dts/qca9563_netgear_wndr4500-v3.dts b/target/linux/ath79/dts/qca9563_netgear_wndr4500-v3.dts index 6e25215501..4c33c0197f 100644 --- a/target/linux/ath79/dts/qca9563_netgear_wndr4500-v3.dts +++ b/target/linux/ath79/dts/qca9563_netgear_wndr4500-v3.dts @@ -28,12 +28,5 @@ }; &usb1 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port1: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; diff --git a/target/linux/ath79/dts/qca9563_qxwlan_e1700ac.dtsi b/target/linux/ath79/dts/qca9563_qxwlan_e1700ac.dtsi index 91c73567d8..c6c610dbee 100644 --- a/target/linux/ath79/dts/qca9563_qxwlan_e1700ac.dtsi +++ b/target/linux/ath79/dts/qca9563_qxwlan_e1700ac.dtsi @@ -96,8 +96,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "sgmii"; @@ -127,14 +125,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port0: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy1 { diff --git a/target/linux/ath79/dts/qca9563_rosinson_wr818.dts b/target/linux/ath79/dts/qca9563_rosinson_wr818.dts index c08291560b..c73d5a6e58 100644 --- a/target/linux/ath79/dts/qca9563_rosinson_wr818.dts +++ b/target/linux/ath79/dts/qca9563_rosinson_wr818.dts @@ -92,7 +92,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; phy0: ethernet-phy@0 { reg = <0>; phy-mode = "sgmii"; @@ -124,14 +123,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &usb_phy1 { @@ -139,14 +131,7 @@ }; &usb1 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - port@2 { - reg = <2>; - #trigger-source-cells = <0>; - }; }; &info { diff --git a/target/linux/ath79/dts/qca9563_tplink_archer-x6-v2.dtsi b/target/linux/ath79/dts/qca9563_tplink_archer-x6-v2.dtsi index fc6206d891..34f639f40b 100644 --- a/target/linux/ath79/dts/qca9563_tplink_archer-x6-v2.dtsi +++ b/target/linux/ath79/dts/qca9563_tplink_archer-x6-v2.dtsi @@ -12,8 +12,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "sgmii"; diff --git a/target/linux/ath79/dts/qca9563_tplink_archer-x7-v5.dtsi b/target/linux/ath79/dts/qca9563_tplink_archer-x7-v5.dtsi index 6763fe9d3d..f6a959903f 100644 --- a/target/linux/ath79/dts/qca9563_tplink_archer-x7-v5.dtsi +++ b/target/linux/ath79/dts/qca9563_tplink_archer-x7-v5.dtsi @@ -108,14 +108,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port0: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; &spi { @@ -137,8 +130,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "sgmii"; diff --git a/target/linux/ath79/dts/qca9563_tplink_eap2x5-1port.dtsi b/target/linux/ath79/dts/qca9563_tplink_eap2x5-1port.dtsi index cd10cfac3c..c04e2a42cd 100644 --- a/target/linux/ath79/dts/qca9563_tplink_eap2x5-1port.dtsi +++ b/target/linux/ath79/dts/qca9563_tplink_eap2x5-1port.dtsi @@ -81,6 +81,14 @@ label = "art"; reg = <0xff0000 0x010000>; read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + calibration_ath9k: calibration@1000 { + reg = <0x1000 0x440>; + }; }; }; }; @@ -98,20 +106,11 @@ pinctrl-names = "default"; pinctrl-0 = <&mdio_pins>; - - phy-mask = <0x10>; - - phy4: ethernet-phy@4 { - reg = <4>; - reset-gpios = <&gpio 11 GPIO_ACTIVE_LOW>; - }; }; ð0 { status = "okay"; - phy-handle = <&phy4>; - phy-mode = "sgmii"; pll-data = <0x03000000 0x00000101 0x00001313>; nvmem-cells = <&macaddr_info_8>; @@ -127,9 +126,8 @@ &wmac { status = "okay"; - mtd-cal-data = <&art 0x1000>; - nvmem-cells = <&macaddr_info_8>; - nvmem-cell-names = "mac-address"; + nvmem-cells = <&macaddr_info_8>, <&calibration_ath9k>; + nvmem-cell-names = "mac-address", "calibration"; }; &info { diff --git a/target/linux/ath79/dts/qca9563_tplink_tl-wpa8630.dtsi b/target/linux/ath79/dts/qca9563_tplink_tl-wpa8630.dtsi index 431c990815..560aae9694 100644 --- a/target/linux/ath79/dts/qca9563_tplink_tl-wpa8630.dtsi +++ b/target/linux/ath79/dts/qca9563_tplink_tl-wpa8630.dtsi @@ -105,8 +105,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "sgmii"; diff --git a/target/linux/ath79/dts/qca9563_tplink_tl-wr1043n.dtsi b/target/linux/ath79/dts/qca9563_tplink_tl-wr1043n.dtsi index b99412eb79..2e3ac952e2 100644 --- a/target/linux/ath79/dts/qca9563_tplink_tl-wr1043n.dtsi +++ b/target/linux/ath79/dts/qca9563_tplink_tl-wr1043n.dtsi @@ -86,7 +86,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; phy0: ethernet-phy@0 { reg = <0>; phy-mode = "sgmii"; diff --git a/target/linux/ath79/dts/qca9563_tplink_tl-wr1043nd-v4.dts b/target/linux/ath79/dts/qca9563_tplink_tl-wr1043nd-v4.dts index bf01f06de6..80a63f6efc 100644 --- a/target/linux/ath79/dts/qca9563_tplink_tl-wr1043nd-v4.dts +++ b/target/linux/ath79/dts/qca9563_tplink_tl-wr1043nd-v4.dts @@ -94,14 +94,7 @@ }; &usb0 { - #address-cells = <1>; - #size-cells = <0>; status = "okay"; - - hub_port0: port@1 { - reg = <1>; - #trigger-source-cells = <0>; - }; }; ð0 { diff --git a/target/linux/ath79/dts/qca9563_ubnt_unifiac-lite.dtsi b/target/linux/ath79/dts/qca9563_ubnt_unifiac-lite.dtsi index 5eb358014b..c6438d8d15 100644 --- a/target/linux/ath79/dts/qca9563_ubnt_unifiac-lite.dtsi +++ b/target/linux/ath79/dts/qca9563_ubnt_unifiac-lite.dtsi @@ -11,7 +11,6 @@ &mdio0 { status = "okay"; - phy-mask = <4>; phy4: ethernet-phy@4 { phy-mode = "sgmii"; reg = <4>; diff --git a/target/linux/ath79/dts/qca9563_ubnt_unifiac-pro.dtsi b/target/linux/ath79/dts/qca9563_ubnt_unifiac-pro.dtsi index dbf6c27146..bb00643377 100644 --- a/target/linux/ath79/dts/qca9563_ubnt_unifiac-pro.dtsi +++ b/target/linux/ath79/dts/qca9563_ubnt_unifiac-pro.dtsi @@ -10,7 +10,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; phy0: ethernet-phy@0 { reg = <0>; diff --git a/target/linux/ath79/dts/qca9563_ubnt_unifiac.dtsi b/target/linux/ath79/dts/qca9563_ubnt_unifiac.dtsi index 2e407c3486..6704ec983b 100644 --- a/target/linux/ath79/dts/qca9563_ubnt_unifiac.dtsi +++ b/target/linux/ath79/dts/qca9563_ubnt_unifiac.dtsi @@ -69,17 +69,12 @@ }; partition@70000 { + /* Combine kernel0 & kernel1 */ label = "firmware"; - reg = <0x070000 0x790000>; + reg = <0x070000 0xf20000>; compatible = "denx,uimage"; }; - partition@800000 { - label = "kernel1"; - reg = <0x800000 0x790000>; - read-only; - }; - partition@f90000 { label = "bs"; reg = <0xf90000 0x020000>; diff --git a/target/linux/ath79/dts/qca9563_yuncore_xd4200.dtsi b/target/linux/ath79/dts/qca9563_yuncore_xd4200.dtsi index f8dec2bc6b..6f729a21fe 100644 --- a/target/linux/ath79/dts/qca9563_yuncore_xd4200.dtsi +++ b/target/linux/ath79/dts/qca9563_yuncore_xd4200.dtsi @@ -35,8 +35,6 @@ &mdio0 { status = "okay"; - phy-mask = <0>; - phy0: ethernet-phy@0 { reg = <0>; phy-mode = "sgmii"; diff --git a/target/linux/ath79/dts/qca9563_zte_mf28x.dtsi b/target/linux/ath79/dts/qca9563_zte_mf28x.dtsi new file mode 100644 index 0000000000..1edcd7e5ea --- /dev/null +++ b/target/linux/ath79/dts/qca9563_zte_mf28x.dtsi @@ -0,0 +1,136 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +// Copyright (c) 2021 Cezary Jackiewicz +// Copyright (c) 2021, 2022 Lech Perczak +#include "qca956x.dtsi" + +#include +#include +#include + +/ { + aliases { + led-boot = &led_debug; + led-failsafe = &led_debug; + led-running = &led_debug; + led-upgrade = &led_debug; + label-mac-device = ð0; + }; + + leds { + compatible = "gpio-leds"; + + /* Hidden SMD LED below signal strength LEDs. + * Visible through slits underside of the case, + * and slightly through the case below signal state LEDs + */ + led_debug: led-0 { + function = LED_FUNCTION_DEBUG; + gpios = <&gpio 7 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 2 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + + wps { + label = "wps"; + linux,code = ; + gpios = <&gpio 1 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + }; + + /* This GPIO is used to reset whole board _including_ the modem */ + gpio-restart { + compatible = "gpio-restart"; + gpios = <&gpio 5 GPIO_ACTIVE_HIGH>; + active-delay = <3000>; + inactive-delay = <1000>; + }; +}; + +&spi { + status = "okay"; + + boot_flash: flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + }; + }; + + system_flash: flash@1 { + compatible = "spi-nand"; + reg = <1>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + }; + }; +}; + +&mdio0 { + status = "okay"; + + phy0: ethernet-phy@0 { + reg = <0>; + phy-mode = "sgmii"; + + qca,ar8327-initvals = < + 0x04 0x00080080 /* PORT0 PAD MODE CTRL */ + 0x7c 0x0000007e /* PORT0_STATUS */ + >; + }; +}; + +ð0 { + status = "okay"; + + phy-mode = "sgmii"; + phy-handle = <&phy0>; +}; + +&pcie { + status = "okay"; + + wifi_ath10k: wifi@0,0 { + compatible = "qcom,ath10k"; + reg = <0x0 0 0 0 0>; + }; +}; + +&wmac { + status = "okay"; +}; + +&usb_phy0 { + status = "okay"; +}; + +&usb0 { + status = "okay"; +}; + +&usb_phy1 { + status = "okay"; +}; + +&usb1 { + status = "okay"; +}; diff --git a/target/linux/ath79/dts/qca956x.dtsi b/target/linux/ath79/dts/qca956x.dtsi index f2452e9dc7..e46f0676e2 100644 --- a/target/linux/ath79/dts/qca956x.dtsi +++ b/target/linux/ath79/dts/qca956x.dtsi @@ -95,6 +95,7 @@ clock-output-names = "cpu", "ddr", "ahb"; clocks = <&extosc>; + clock-names = "ref"; }; wdt: wdt@18060008 { @@ -203,6 +204,11 @@ #address-cells = <1>; #size-cells = <0>; + + hub_port0: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; usb1: usb@1b400000 { @@ -225,6 +231,11 @@ #address-cells = <1>; #size-cells = <0>; + + hub_port1: port@1 { + reg = <1>; + #trigger-source-cells = <0>; + }; }; spi: spi@1f000000 { diff --git a/target/linux/ath79/files/drivers/gpio/gpio-latch.c b/target/linux/ath79/files/drivers/gpio/gpio-latch.c index 976e683230..68f9290b2a 100644 --- a/target/linux/ath79/files/drivers/gpio/gpio-latch.c +++ b/target/linux/ath79/files/drivers/gpio/gpio-latch.c @@ -134,7 +134,7 @@ static int gpio_latch_probe(struct platform_device *pdev) GPIOD_OUT_LOW); if (IS_ERR(glc->gpios[i])) { if (PTR_ERR(glc->gpios[i]) != -EPROBE_DEFER) { - dev_err(dev, "failed to get gpio %d: %d\n", i, + dev_err(dev, "failed to get gpio %d: %ld\n", i, PTR_ERR(glc->gpios[i])); } return PTR_ERR(glc->gpios[i]); diff --git a/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c b/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c index fafb3f56b8..28bdcb066d 100644 --- a/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c +++ b/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c @@ -1325,10 +1325,10 @@ static int ar934x_nfc_attach_chip(struct nand_chip *nand) if (ret) return ret; - if (mtd->writesize == 2048) - nand->options |= NAND_NO_SUBPAGE_WRITE; - if (nand->ecc.engine_type == NAND_ECC_ENGINE_TYPE_ON_HOST) { + if (mtd->writesize == 2048) + nand->options |= NAND_NO_SUBPAGE_WRITE; + ret = ar934x_nfc_setup_hwecc(nfc); if (ret) return ret; diff --git a/target/linux/ath79/files/drivers/mtd/nand/raw/rb91x_nand.c b/target/linux/ath79/files/drivers/mtd/nand/raw/rb91x_nand.c index 244fd27590..c502f4a064 100644 --- a/target/linux/ath79/files/drivers/mtd/nand/raw/rb91x_nand.c +++ b/target/linux/ath79/files/drivers/mtd/nand/raw/rb91x_nand.c @@ -286,7 +286,7 @@ static int rb91x_nand_probe(struct platform_device *pdev) gpios = gpiod_get_array(dev, NULL, GPIOD_OUT_LOW); if (IS_ERR(gpios)) { if (PTR_ERR(gpios) != -EPROBE_DEFER) { - dev_err(dev, "failed to get gpios: %d\n", + dev_err(dev, "failed to get gpios: %ld\n", PTR_ERR(gpios)); } return PTR_ERR(gpios); diff --git a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/Kconfig b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/Kconfig index 4df2d21e34..dfcedcf70e 100644 --- a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/Kconfig +++ b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/Kconfig @@ -10,14 +10,12 @@ if AG71XX config AG71XX_DEBUG bool "Atheros AR71xx built-in ethernet driver debugging" - default n help Atheros AR71xx built-in ethernet driver debugging messages. config AG71XX_DEBUG_FS bool "Atheros AR71xx built-in ethernet driver debugfs support" depends on DEBUG_FS - default n help Say Y, if you need access to various statistics provided by the ag71xx driver. diff --git a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h index 1955cd288f..0773f1a5af 100644 --- a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h +++ b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h @@ -65,7 +65,7 @@ #define AG71XX_TX_RING_SIZE_DEFAULT 128 #define AG71XX_RX_RING_SIZE_DEFAULT 256 -#define AG71XX_TX_RING_SIZE_MAX 128 +#define AG71XX_TX_RING_SIZE_MAX 256 #define AG71XX_RX_RING_SIZE_MAX 256 #ifdef CONFIG_AG71XX_DEBUG diff --git a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c index 2fc18d5979..06ebbd8ea3 100644 --- a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c +++ b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c @@ -34,7 +34,7 @@ MODULE_PARM_DESC(msg_level, "Message level (-1=defaults,0=none,...,16=all)"); #define ETH_SWITCH_HEADER_LEN 2 -static int ag71xx_tx_packets(struct ag71xx *ag, bool flush); +static int ag71xx_tx_packets(struct ag71xx *ag, bool flush, int budget); static inline unsigned int ag71xx_max_frame_len(unsigned int mtu) { @@ -478,7 +478,7 @@ static void ag71xx_fast_reset(struct ag71xx *ag) mii_reg = ag71xx_rr(ag, AG71XX_REG_MII_CFG); rx_ds = ag71xx_rr(ag, AG71XX_REG_RX_DESC); - ag71xx_tx_packets(ag, true); + ag71xx_tx_packets(ag, true, 0); reset_control_assert(ag->mac_reset); udelay(10); @@ -1245,7 +1245,7 @@ static bool ag71xx_check_dma_stuck(struct ag71xx *ag) return false; } -static int ag71xx_tx_packets(struct ag71xx *ag, bool flush) +static int ag71xx_tx_packets(struct ag71xx *ag, bool flush, int budget) { struct ag71xx_ring *ring = &ag->tx_ring; bool dma_stuck = false; @@ -1278,7 +1278,7 @@ static int ag71xx_tx_packets(struct ag71xx *ag, bool flush) if (!skb) continue; - dev_kfree_skb_any(skb); + napi_consume_skb(skb, budget); ring->buf[i].skb = NULL; bytes_compl += ring->buf[i].len; @@ -1352,7 +1352,7 @@ static int ag71xx_rx_packets(struct ag71xx *ag, int limit) dev->stats.rx_packets++; dev->stats.rx_bytes += pktlen; - skb = build_skb(ring->buf[i].rx_buf, ag71xx_buffer_size(ag)); + skb = napi_build_skb(ring->buf[i].rx_buf, ag71xx_buffer_size(ag)); if (!skb) { skb_free_frag(ring->buf[i].rx_buf); goto next; @@ -1400,7 +1400,7 @@ static int ag71xx_poll(struct napi_struct *napi, int limit) int tx_done; int rx_done; - tx_done = ag71xx_tx_packets(ag, false); + tx_done = ag71xx_tx_packets(ag, false, limit); DBG("%s: processing RX ring\n", dev->name); rx_done = ag71xx_rx_packets(ag, limit); diff --git a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_mdio.c b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_mdio.c index a58ee3346b..fd05dbd0ca 100644 --- a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_mdio.c +++ b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_mdio.c @@ -201,10 +201,6 @@ static int ag71xx_mdio_probe(struct platform_device *pdev) mii_bus->parent = amdev; snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%s.%d", np->name, bus_count++); - if (!builtin_switch && - of_property_read_u32(np, "phy-mask", &mii_bus->phy_mask)) - mii_bus->phy_mask = 0; - for (i = 0; i < PHY_MAX_ADDR; i++) mii_bus->irq[i] = PHY_POLL; diff --git a/target/linux/ath79/generic/base-files/etc/board.d/01_leds b/target/linux/ath79/generic/base-files/etc/board.d/01_leds index 48335842ca..df27036cc7 100644 --- a/target/linux/ath79/generic/base-files/etc/board.d/01_leds +++ b/target/linux/ath79/generic/base-files/etc/board.d/01_leds @@ -10,6 +10,12 @@ case "$board" in ucidef_set_led_netdev "lan" "LAN" "orange:eth0" "eth0" ucidef_set_led_switch "wan" "WAN" "orange:eth1" "switch0" "0x04" ;; +alcatel,hh40v) + ucidef_set_led_netdev "lan_data" "LAN Data" "green:lan" "eth1" "tx rx" + ucidef_set_led_netdev "lan_link" "LAN Link" "orange:lan" "eth1" "link" + ucidef_set_led_netdev "wan_data" "WAN Data" "green:wan" "eth0" "tx rx" + ucidef_set_led_netdev "wan_link" "WAN Link" "orange:wan" "eth0" "link" + ;; alfa-network,ap121f|\ alfa-network,ap121fe|\ avm,fritz450e|\ @@ -18,6 +24,9 @@ glinet,6416|\ glinet,gl-ar300m-lite|\ glinet,gl-ar300m16|\ pcs,cap324|\ +thinkpenguin,tpe-r1200|\ +thinkpenguin,tpe-r1300|\ +tplink,cpe605-v1|\ tplink,cpe610-v1|\ tplink,cpe610-v2|\ tplink,tl-wa1201-v2) @@ -40,7 +49,10 @@ alfa-network,n5q) ucidef_set_led_rssi "signal3" "SIGNAL3" "green:signal3" "wlan0" "50" "100" ucidef_set_led_rssi "signal4" "SIGNAL4" "green:signal4" "wlan0" "75" "100" ;; -alfa-network,pi-wifi4) +alfa-network,pi-wifi4|\ +watchguard,ap100|\ +watchguard,ap200|\ +watchguard,ap300) ucidef_set_led_netdev "lan_data" "LAN_DATA" "orange:lan_data" "eth0" "tx rx" ucidef_set_led_netdev "lan_link" "LAN_LINK" "green:lan_link" "eth0" "link" ;; @@ -56,6 +68,16 @@ alfa-network,tube-2hq) ucidef_set_led_rssi "signal3" "SIGNAL3" "green:signal3" "wlan0" "50" "100" ucidef_set_led_rssi "signal4" "SIGNAL4" "green:signal4" "wlan0" "75" "100" ;; +asus,pl-ac56) + ucidef_set_led_switch "lan" "LAN" "green:lan" "switch0" "0x3e" + ucidef_set_led_netdev "wlan2g" "WLAN2G" "green:wlan2g" "wlan1" "link" + ucidef_set_led_netdev "wlan5g" "WLAN5G" "green:wlan5g" "wlan0" "link" + ;; +asus,rp-ac51) + ucidef_set_led_netdev "lan" "LAN" "blue:lan" "eth0" + ucidef_set_led_netdev "wlan2g" "WLAN2G" "blue:wlan2G" "wlan1" "link" + ucidef_set_led_netdev "wlan5g" "WLAN5G" "blue:wlan5G" "wlan0" "link" + ;; asus,rp-ac66) ucidef_set_rssimon "wlan0" "200000" "1" ucidef_set_rssimon "wlan1" "200000" "1" @@ -214,6 +236,9 @@ dlink,dap-1365-a1) dlink,dir-859-a1) ucidef_set_led_switch "internet" "WAN" "green:internet" "switch0" "0x20" ;; +dlink,dir-859-a3) + ucidef_set_led_switch "wan" "WAN" "green:wan" "switch0" "0x20" + ;; engenius,ens202ext-v1|\ engenius,enstationac-v1) ucidef_set_rssimon "wlan0" "200000" "1" @@ -246,6 +271,15 @@ glinet,gl-x750) hak5,lan-turtle) ucidef_set_led_netdev "wan" "WAN" "orange:system" "eth1" ;; +hiwifi,hc6361) + ucidef_set_led_netdev "wan" "WAN" "blue:wan" "eth1" + ucidef_set_led_wlan "wlan" "WLAN" "blue:wlan" "phy0tpt" + ;; +kuwfi,c910) + ucidef_set_led_netdev "wan" "WAN" "white:wan" "eth1" + ucidef_set_led_switch "lan1" "LAN1" "white:lan1" "switch0" "0x10" + ucidef_set_led_switch "lan2" "LAN2" "white:lan2" "switch0" "0x02" + ;; meraki,mr12|\ tplink,cpe210-v2|\ tplink,cpe210-v3) @@ -306,6 +340,13 @@ qca,ap143-16m) qihoo,c301) ucidef_set_led_wlan "wlan" "WLAN" "green:wlan" "phy0tpt" ;; +ruckus,zf7025) + ucidef_set_led_netdev "lan" "LAN5" "green:lan5" "eth0" + ucidef_set_led_switch "lan1" "LAN1" "green:lan1" "switch0" "0x10" + ucidef_set_led_switch "lan2" "LAN2" "green:lan2" "switch0" "0x08" + ucidef_set_led_switch "lan3" "LAN3" "green:lan3" "switch0" "0x04" + ucidef_set_led_switch "lan4" "LAN4" "green:lan4" "switch0" "0x02" + ;; ruckus,zf7372) ucidef_set_led_switch "lan" "LAN" "green:eth1" "switch0" "0x02" ;; @@ -316,6 +357,13 @@ teltonika,rut230-v1) ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth1" ucidef_set_led_switch "lan" "LAN" "green:lan" "switch0" "0x04" ;; +teltonika,rut300) + ucidef_set_led_netdev "wan" "WAN" "yellow:wan" "eth1" + ucidef_set_led_switch "lan1" "LAN1" "yellow:lan1" "switch0" "0x02" + ucidef_set_led_switch "lan2" "LAN2" "yellow:lan2" "switch0" "0x10" + ucidef_set_led_switch "lan3" "LAN3" "yellow:lan3" "switch0" "0x08" + ucidef_set_led_switch "lan4" "LAN4" "yellow:lan4" "switch0" "0x04" + ;; tplink,archer-a7-v5|\ tplink,archer-c7-v4|\ tplink,archer-c7-v5) @@ -435,7 +483,9 @@ ubnt,bullet-m-xw|\ ubnt,nanostation-loco-m-xw|\ ubnt,nanostation-m-xw|\ ubnt,powerbeam-m2-xw|\ -ubnt,powerbeam-m5-xw) +ubnt,powerbeam-m5-xw|\ +ubnt,powerbridge-m|\ +ubnt,rocket-m) ucidef_set_rssimon "wlan0" "200000" "1" ucidef_set_led_rssi "rssilow" "RSSILOW" "red:link1" "wlan0" "1" "100" ucidef_set_led_rssi "rssimediumlow" "RSSIMEDIUMLOW" "orange:link2" "wlan0" "26" "100" @@ -469,6 +519,9 @@ zbtlink,zbt-wd323) ucidef_set_led_switch "lan1" "LAN1" "orange:lan1" "switch0" "0x10" ucidef_set_led_switch "lan2" "LAN2" "orange:lan2" "switch0" "0x08" ;; +zyxel,nwa1100-nh) + ucidef_set_led_netdev "lan_data" "LAN_DATA" "amber:lan" "eth0" "tx rx" + ucidef_set_led_netdev "lan_link" "LAN_LINK" "green:lan" "eth0" "link" esac board_config_flush diff --git a/target/linux/ath79/generic/base-files/etc/board.d/02_network b/target/linux/ath79/generic/base-files/etc/board.d/02_network index 8f9516b8c6..0d7396a04d 100644 --- a/target/linux/ath79/generic/base-files/etc/board.d/02_network +++ b/target/linux/ath79/generic/base-files/etc/board.d/02_network @@ -19,6 +19,8 @@ ath79_setup_interfaces() araknis,an-700-ap-i-ac|\ arduino,yun|\ aruba,ap-105|\ + aruba,ap-175|\ + asus,rp-ac51|\ asus,rp-ac66|\ avm,fritz1750e|\ avm,fritz300e|\ @@ -37,17 +39,18 @@ ath79_setup_interfaces() dlink,dap-3320-a1|\ dlink,dir-505|\ engenius,eap1200h|\ + engenius,eap1750h|\ engenius,eap600|\ engenius,ecb1200|\ engenius,ecb1750|\ engenius,ecb600|\ enterasys,ws-ap3705i|\ extreme-networks,ws-ap3805i|\ + fortinet,fap-221-b|\ glinet,gl-ar300m-lite|\ glinet,gl-usb150|\ hak5,wifi-pineapple-nano|\ meraki,mr16|\ - netgear,ex6400|\ netgear,ex7300|\ netgear,ex7300-v2|\ netgear,wndap360|\ @@ -65,7 +68,10 @@ ath79_setup_interfaces() pisen,wmb001n|\ pisen,wmm003n|\ ruckus,zf7321|\ + ruckus,zf7341|\ + ruckus,zf7351|\ siemens,ws-ap3610|\ + sophos,ap15|\ sophos,ap55|\ sophos,ap55c|\ sophos,ap100|\ @@ -74,12 +80,15 @@ ath79_setup_interfaces() tplink,cpe210-v3|\ tplink,cpe510-v2|\ tplink,cpe510-v3|\ + tplink,cpe605-v1|\ tplink,cpe610-v1|\ tplink,cpe610-v2|\ tplink,cpe710-v1|\ tplink,eap225-outdoor-v1|\ + tplink,eap225-outdoor-v3|\ tplink,eap225-v1|\ tplink,eap225-v3|\ + tplink,eap225-v4|\ tplink,eap245-v1|\ tplink,re350k-v1|\ tplink,re355-v1|\ @@ -101,13 +110,22 @@ ath79_setup_interfaces() ubnt,powerbeam-5ac-gen2|\ ubnt,powerbeam-m2-xw|\ ubnt,powerbeam-m5-xw|\ + ubnt,powerbridge-m|\ ubnt,rocket-5ac-lite|\ + ubnt,rocket-m|\ ubnt,unifiac-lite|\ ubnt,unifiac-lr|\ ubnt,unifiac-mesh|\ ubnt,unifi|\ + watchguard,ap100|\ + watchguard,ap200|\ + watchguard,ap300|\ wd,mynet-wifi-rangeextender|\ - winchannel,wb2000) + winchannel,wb2000|\ + zyxel,nwa1100-nh|\ + zyxel,nwa1121-ni|\ + zyxel,nwa1123-ac|\ + zyxel,nwa1123-ni) ucidef_set_interface_lan "eth0" ;; airtight,c-75) @@ -123,11 +141,18 @@ ath79_setup_interfaces() devolo,dvl1750e|\ engenius,enstationac-v1|\ engenius,ews511ap|\ + engenius,ews660ap|\ ocedo,ursus|\ + ruckus,zf7363|\ ruckus,zf7372|\ ubnt,unifi-ap-outdoor-plus) ucidef_set_interface_lan "eth0 eth1" ;; + asus,pl-ac56) + # port 6 (internal) is the power-line port + ucidef_add_switch "switch0" \ + "0@eth0" "1:lan:1" "2:lan:2" "3:lan:3" "6:lan:4" + ;; atheros,db120) ucidef_add_switch "switch0" \ "0@eth0" "2:lan" "3:lan" "4:lan" "5:lan" "1:wan" @@ -177,6 +202,11 @@ ath79_setup_interfaces() ucidef_add_switch "switch0" \ "0@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" ;; + teltonika,rut300) + ucidef_set_interface_wan "eth1" + ucidef_add_switch "switch0" \ + "0@eth0" "1:lan:1" "2:lan:4" "3:lan:3" "4:lan:2" + ;; buffalo,wzr-hp-g300nh-rb|\ buffalo,wzr-hp-g300nh-s|\ dlink,dir-825-b1|\ @@ -189,6 +219,7 @@ ath79_setup_interfaces() ucidef_add_switch "switch0" \ "0@eth0" "1:lan:1" "3:lan:4" "4:lan:3" "5:lan:2" "2:wan" ;; + alcatel,hh40v|\ comfast,cf-e110n-v2|\ comfast,cf-e120a-v3|\ comfast,cf-e314n-v2|\ @@ -255,13 +286,19 @@ ath79_setup_interfaces() ucidef_add_switch "switch0" \ "0@eth0" "1:lan:2" "2:lan:1" ;; + dlink,dir-629-a1|\ dlink,dir-825-c1|\ dlink,dir-835-a1|\ dlink,dir-842-c1|\ dlink,dir-842-c2|\ dlink,dir-842-c3|\ dlink,dir-859-a1|\ + dlink,dir-859-a3|\ + dlink,dir-869-a1|\ engenius,epg5000|\ + engenius,esr1200|\ + engenius,esr1750|\ + engenius,esr900|\ sitecom,wlr-7100|\ tplink,archer-c2-v3|\ tplink,tl-wr1043nd-v4|\ @@ -324,6 +361,11 @@ ath79_setup_interfaces() ucidef_add_switch "switch0" \ "0@eth0" "2:lan:3" "3:lan:2" "4:lan:1" ;; + kuwfi,c910) + ucidef_set_interface_wan "eth1" + ucidef_add_switch "switch0" \ + "0@eth0" "1:lan:2" "4:lan:1" + ;; letv,lba-047-ch) ucidef_set_interface_wan "eth0" ucidef_add_switch "switch0" \ @@ -413,6 +455,11 @@ ath79_setup_interfaces() ucidef_add_switch "switch0" \ "0@eth0" "1:lan" "2:lan" "3:wan" ;; + ruckus,zf7025) + ucidef_set_interface_lan "eth0 eth1" + ucidef_add_switch "switch0" \ + "0u@eth1" "4:lan:1" "3:lan:2" "2:lan:3" "1:lan:4" + ;; teltonika,rut955|\ teltonika,rut955-h7v3c0) ucidef_set_interface_wan "eth1" @@ -504,10 +551,12 @@ ath79_setup_interfaces() ucidef_add_switch "switch0" \ "0@eth0" "1:lan" "2:lan" ;; - tplink,deco-m4r-v1) + tplink,deco-m4r-v1|\ + tplink,deco-s4-v2) ucidef_add_switch "switch0" \ "0@eth0" "3:lan:1" "5:lan:2" ;; + hiwifi,hc6361|\ xiaomi,mi-router-4q|\ zbtlink,zbt-wd323) ucidef_set_interface_wan "eth1" @@ -588,7 +637,9 @@ ath79_setup_macs() dlink,dap-3662-a1) label_mac=$(mtd_get_mac_ascii bdcfg "wlanmac") ;; - dlink,dir-825-b1|\ + dlink,dir-629-a1) + wan_mac=$(mtd_get_mac_text "mfcdata" 0x6a) + ;; trendnet,tew-673gru) lan_mac=$(mtd_get_mac_text "caldata" 0xffa0) wan_mac=$(mtd_get_mac_text "caldata" 0xffb4) @@ -599,7 +650,6 @@ ath79_setup_macs() ;; dlink,dir-825-c1|\ dlink,dir-835-a1) - lan_mac=$(mtd_get_mac_text "mac" 0x4) wan_mac=$(mtd_get_mac_text "mac" 0x18) ;; dlink,dir-842-c1|\ @@ -610,6 +660,14 @@ ath79_setup_macs() label_mac=$lan_mac ;; dlink,dir-859-a1|\ + dlink,dir-869-a1) + lan_mac=$(mtd_get_mac_text "devdata" 0xc9) + wan_mac=$(mtd_get_mac_text "devdata" 0x79) + ;; + dlink,dir-859-a3) + lan_mac=$(get_mac_label) + wan_mac=$(macaddr_add "$lan_mac" 3) + ;; qihoo,c301|\ wd,mynet-n600|\ wd,mynet-n750) @@ -618,14 +676,18 @@ ath79_setup_macs() ;; elecom,wrc-1750ghbk2-i|\ elecom,wrc-300ghbk2-i) - wan_mac=$(macaddr_add "$(mtd_get_mac_binary art 0x1002)" -2) + wan_mac=$(mtd_get_mac_ascii hwconfig "HW.WAN.MAC.Address") + label_mac=$wan_mac ;; engenius,ecb1200|\ engenius,ecb1750) lan_mac=$(mtd_get_mac_ascii u-boot-env ethaddr) label_mac=$lan_mac ;; - engenius,epg5000) + engenius,epg5000|\ + engenius,esr1200|\ + engenius,esr1750|\ + engenius,esr900) lan_mac=$(mtd_get_mac_ascii u-boot-env ethaddr) wan_mac=$(mtd_get_mac_ascii u-boot-env wanaddr) ;; @@ -638,6 +700,10 @@ ath79_setup_macs() enterasys,ws-ap3705i) label_mac=$(mtd_get_mac_ascii u-boot-env0 ethaddr) ;; + fortinet,fap-221-b) + lan_mac=$(mtd_get_mac_text u-boot 0x3ff80 12) + label_mac=$lan_mac + ;; hak5,lan-turtle|\ hak5,packet-squirrel) label_mac=$(mtd_get_mac_binary u-boot 0x1fc00) @@ -662,6 +728,10 @@ ath79_setup_macs() base_mac=$(mtd_get_mac_binary u-boot 0x1fc00) wan_mac=$(macaddr_add "$base_mac" 1) ;; + tplink,deco-s4-v2) + lan_mac=$(mtd_get_mac_encrypted_deco $(find_mtd_part config)) + label_mac=$lan_mac + ;; nec,wf1200cr|\ nec,wg1200cr) lan_mac=$(mtd_get_mac_ascii devdata "lanmac") @@ -688,7 +758,11 @@ ath79_setup_macs() wan_mac=$(mtd_get_mac_binary factory 0x0) lan_mac=$(macaddr_setbit_la "$wan_mac") ;; + ruckus,zf7025|\ ruckus,zf7321|\ + ruckus,zf7341|\ + ruckus,zf7351|\ + ruckus,zf7363|\ ruckus,zf7372) lan_mac=$(mtd_get_mac_binary board-data 0x807E) label_mac=$lan_mac @@ -713,6 +787,8 @@ ath79_setup_macs() wan_mac=$(mtd_get_mac_text mac 0x18) label_mac=$wan_mac ;; + ubnt,powerbridge-m|\ + ubnt,rocket-m|\ ubnt,unifi) label_mac=$(cat /sys/class/ieee80211/phy0/macaddress) ;; diff --git a/target/linux/ath79/generic/base-files/etc/board.d/03_gpio_switches b/target/linux/ath79/generic/base-files/etc/board.d/03_gpio_switches index ca7d8c633c..899a8ba97e 100644 --- a/target/linux/ath79/generic/base-files/etc/board.d/03_gpio_switches +++ b/target/linux/ath79/generic/base-files/etc/board.d/03_gpio_switches @@ -24,6 +24,9 @@ adtran,bsap1840) ucidef_add_gpio_switch "wifi0_ext_c" "2.4GHz External Antenna C" "509" "1" ucidef_add_gpio_switch "wifi0_int_c" "2.4GHz Internal Antenna C" "510" ;; +asus,pl-ac56) + ucidef_add_gpio_switch "plc_enable" "PLC enable" "14" "1" + ;; comfast,cf-e5|\ telco,t1) ucidef_add_gpio_switch "lte_power" "LTE Power" "14" "1" diff --git a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom index 9c4ff9f9da..f4c2b26d68 100644 --- a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom +++ b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom @@ -12,6 +12,11 @@ case "$FIRMWARE" in 8dev,lima) caldata_extract "art" 0x1000 0x800 ;; + aruba,ap-115) + caldata_extract "oemdata" 0x1000 0x440 + ;; + asus,pl-ac56|\ + asus,rp-ac51|\ asus,rp-ac66) caldata_extract "art" 0x1000 0x440 ;; @@ -21,16 +26,13 @@ case "$FIRMWARE" in avm,fritzdvbc) caldata_extract_reverse "urlader" 0x1541 0x440 ;; - dlink,dir-505|\ - dlink,dir-825-c1|\ - dlink,dir-835-a1) + dlink,dir-505) caldata_extract "art" 0x1000 0x440 ath9k_patch_mac $(mtd_get_mac_text "mac" 0x4) ;; dlink,dir-842-c1|\ dlink,dir-842-c2|\ dlink,dir-842-c3|\ - dlink,dir-859-a1|\ nec,wf1200cr|\ nec,wg1200cr|\ wd,mynet-n600|\ @@ -43,7 +45,14 @@ case "$FIRMWARE" in caldata_extract "art" 0x1000 0x440 ath9k_patch_mac $(macaddr_add $(mtd_get_mac_ascii u-boot-env athaddr) 1) ;; - engenius,epg5000|\ + enterasys,ws-ap3705i) + caldata_extract "calibrate" 0x1000 0x440 + ath9k_patch_mac $(mtd_get_mac_ascii u-boot-env0 RADIOADDR1) + ;; + extreme-networks,ws-ap3805i) + caldata_extract "art" 0x1000 0x440 + ath9k_patch_mac $(mtd_get_mac_ascii cfg1 RADIOADDR1) + ;; iodata,wn-ac1167dgr|\ iodata,wn-ac1600dgr|\ iodata,wn-ac1600dgr2|\ @@ -53,14 +62,6 @@ case "$FIRMWARE" in caldata_extract "art" 0x1000 0x440 ath9k_patch_mac $(mtd_get_mac_ascii u-boot-env ethaddr) ;; - enterasys,ws-ap3705i) - caldata_extract "calibrate" 0x1000 0x440 - ath9k_patch_mac $(mtd_get_mac_ascii u-boot-env0 RADIOADDR1) - ;; - extreme-networks,ws-ap3805i) - caldata_extract "art" 0x1000 0x440 - ath9k_patch_mac $(mtd_get_mac_ascii cfg1 RADIOADDR1) - ;; nec,wg800hp) caldata_extract "art" 0x1000 0x440 ath9k_patch_mac $(mtd_get_mac_text board_data 0x680) @@ -69,6 +70,11 @@ case "$FIRMWARE" in caldata_extract "radiocfg" 0x1000 0x440 ath9k_patch_mac $(mtd_get_mac_ascii devdata "wlan24mac") ;; + tplink,deco-s4-v2) + caldata_extract "art" 0x1000 0x440 + base_mac=$(mtd_get_mac_encrypted_deco $(find_mtd_part config)) + ath9k_patch_mac $(macaddr_add $base_mac 1) + ;; *) caldata_die "board $board is not supported yet" ;; @@ -76,31 +82,14 @@ case "$FIRMWARE" in ;; "ath9k-eeprom-pci-0000:00:00.0.bin") case $board in - araknis,an-300-ap-i-n|\ - atheros,db120|\ - engenius,eap600|\ - engenius,ecb600|\ - mercury,mw4530r-v1|\ - ocedo,raccoon|\ - tplink,tl-wdr3500-v1|\ - tplink,tl-wdr3600-v1|\ - tplink,tl-wdr4300-v1|\ - tplink,tl-wdr4300-v1-il|\ - tplink,tl-wdr4310-v1|\ - tplink,tl-wdr4900-v2|\ - ubnt,unifi-ap-pro|\ - winchannel,wb2000) - caldata_extract "art" 0x5000 0x440 + aruba,ap-115) + caldata_extract "oemdata" 0x5000 0x440 ;; avm,fritz300e) caldata_extract_reverse "urloader" 0x1541 0x440 ;; - buffalo,wzr-hp-g302h-a1a0|\ - ubnt,unifi-ap-outdoor-plus) - caldata_extract "art" 0x1000 0xeb8 - ;; buffalo,wzr-hp-g450h|\ - ubnt,unifi) + pcs,cap324) caldata_extract "art" 0x1000 0x440 ;; dlink,dir-825-c1|\ @@ -117,18 +106,12 @@ case "$FIRMWARE" in ;; netgear,wnr2200-8m|\ netgear,wnr2200-16m|\ - pcs,cap324|\ - tplink,tl-wr2543-v1|\ tplink,tl-wr842n-v1) - caldata_extract "art" 0x1000 0x1000 - ;; - openmesh,mr600-v1|\ - openmesh,mr600-v2|\ - openmesh,om5p-an) - caldata_extract "ART" 0x5000 0x440 + caldata_extract "art" 0x1000 0x3e0 ;; - openmesh,om2p-v1) - caldata_extract "ART" 0x1000 0x440 + ubnt,powerbridge-m|\ + ubnt,rocket-m) + caldata_extract "art" 0x1000 0x1000 ;; wd,mynet-n600|\ wd,mynet-n750) @@ -136,7 +119,7 @@ case "$FIRMWARE" in ath9k_patch_mac $(mtd_get_mac_ascii devdata "wlan5mac") ;; wd,mynet-wifi-rangeextender) - caldata_extract "art" 0x1000 0x1000 + caldata_extract "art" 0x1000 0x440 ath9k_patch_mac $(nvram get wl0_hwaddr) ;; *) @@ -147,11 +130,9 @@ case "$FIRMWARE" in "ath9k-eeprom-pci-0000:00:11.0.bin") case $board in buffalo,wzr-600dhp|\ - buffalo,wzr-hp-ag300h|\ - netgear,wndap360) + buffalo,wzr-hp-ag300h) caldata_extract "art" 0x1000 0xeb8 ;; - dlink,dir-825-b1|\ trendnet,tew-673gru) caldata_extract "caldata" 0x1000 0xeb8 ath9k_patch_mac_crc $(mtd_get_mac_text "caldata" 0xffa0) 0x20c @@ -167,11 +148,9 @@ case "$FIRMWARE" in "ath9k-eeprom-pci-0000:00:12.0.bin") case $board in buffalo,wzr-600dhp|\ - buffalo,wzr-hp-ag300h|\ - netgear,wndap360) + buffalo,wzr-hp-ag300h) caldata_extract "art" 0x5000 0xeb8 ;; - dlink,dir-825-b1|\ trendnet,tew-673gru) caldata_extract "caldata" 0x5000 0xeb8 ath9k_patch_mac_crc $(macaddr_add $(mtd_get_mac_text "caldata" 0xffb4) 1) 0x20c diff --git a/target/linux/ath79/generic/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac b/target/linux/ath79/generic/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac index a4f82c54e2..5d74208a5d 100644 --- a/target/linux/ath79/generic/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac +++ b/target/linux/ath79/generic/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac @@ -30,9 +30,20 @@ case "$board" in dlink,dap-2680-a1|\ dlink,dap-2695-a1|\ dlink,dap-3662-a1) + [ "$PHYNBR" -eq 0 ] && \ + mtd_get_mac_ascii bdcfg "wlanmac_a" > /sys${DEVPATH}/macaddress [ "$PHYNBR" -eq 1 ] && \ mtd_get_mac_ascii bdcfg "wlanmac" > /sys${DEVPATH}/macaddress ;; + engenius,epg5000|\ + engenius,esr1200|\ + engenius,esr1750|\ + engenius,esr900) + macaddr_add "$(mtd_get_mac_ascii u-boot-env ethaddr)" "$PHYNBR" > /sys${DEVPATH}/macaddress + ;; + fortinet,fap-221-b) + macaddr_add "$(mtd_get_mac_text u-boot 0x3ff80 12)" $((PHYNBR*7+1)) > /sys${DEVPATH}/macaddress + ;; iodata,wn-ac1600dgr) # There is no eeprom data for 5 GHz wlan in "art" partition # which would allow to patch the macaddress @@ -66,4 +77,12 @@ case "$board" in [ "$PHYNBR" -eq 1 ] && \ mtd_get_mac_ascii u-boot-env ethaddr > /sys${DEVPATH}/macaddress ;; + zyxel,nwa1123-ac) + [ "$PHYNBR" -eq 0 ] && \ + mtd_get_mac_text mib0 0x66 > /sys${DEVPATH}/macaddress + ;; + zyxel,nwa1123-ni) + [ "$PHYNBR" -eq 1 ] && \ + mtd_get_mac_text mib0 0x66 > /sys${DEVPATH}/macaddress + ;; esac diff --git a/target/linux/ath79/generic/base-files/etc/uci-defaults/09_fix-checksum b/target/linux/ath79/generic/base-files/etc/uci-defaults/09_fix-checksum index 92048fd810..0ea81a8dc3 100644 --- a/target/linux/ath79/generic/base-files/etc/uci-defaults/09_fix-checksum +++ b/target/linux/ath79/generic/base-files/etc/uci-defaults/09_fix-checksum @@ -21,6 +21,10 @@ dlink,dap-3320-a1|\ dlink,dap-3662-a1) fixwrgg ;; +dlink,dir-629-a1|\ +dlink,dir-859-a1|\ +dlink,dir-859-a3|\ +dlink,dir-869-a1|\ qihoo,c301) fix_seama_header ;; diff --git a/target/linux/ath79/generic/base-files/lib/preinit/02_sysinfo_fixup b/target/linux/ath79/generic/base-files/lib/preinit/02_sysinfo_fixup new file mode 100644 index 0000000000..e01469f0d9 --- /dev/null +++ b/target/linux/ath79/generic/base-files/lib/preinit/02_sysinfo_fixup @@ -0,0 +1,42 @@ +. /lib/functions.sh + +do_sysinfo_ath79_fixup() { + local model="" + + case $(board_name) in + netgear,ex7300) + local part=$(find_mtd_part caldata) + local board_hw_id=$(dd if=$part bs=1 skip=67 count=10 2>/dev/null) + case "$board_hw_id" in + 5508013406) + model="Netgear EX6400" + ;; + 5508013271) + model="Netgear EX7300" + ;; + esac + ;; + netgear,ex7300-v2) + local part=$(find_mtd_part artmtd) + local antenna_cfg=$(dd if=$part bs=1 skip=59 count=7 2>/dev/null) + local board_hw_id=$(dd if=$part bs=1 skip=67 count=6 2>/dev/null) + case "$antenna_cfg" in + 3X3+3X3) + model="Netgear EX6250" + ;; + 3X3+4X4) + # EX6400 v2, EX6410, EX6420 + model="Netgear ${board_hw_id:-EX6400 v2}" + ;; + 4X4+4X4) + # EX7300 v2, EX7320 + model="Netgear ${board_hw_id:-EX7300 v2}" + ;; + esac + ;; + esac + + [ -n "$model" ] && echo "$model" > /tmp/sysinfo/model +} + +boot_hook_add preinit_main do_sysinfo_ath79_fixup diff --git a/target/linux/ath79/generic/base-files/lib/preinit/10_fix_eth_mac.sh b/target/linux/ath79/generic/base-files/lib/preinit/10_fix_eth_mac.sh index d9cb8d2b82..5fa23e8eb6 100644 --- a/target/linux/ath79/generic/base-files/lib/preinit/10_fix_eth_mac.sh +++ b/target/linux/ath79/generic/base-files/lib/preinit/10_fix_eth_mac.sh @@ -1,4 +1,4 @@ -. /lib/functions.sh +. /lib/functions/system.sh preinit_set_mac_address() { case $(board_name) in @@ -12,6 +12,12 @@ preinit_set_mac_address() { ip link set dev eth0 address $(mtd_get_mac_ascii bdcfg "lanmac") ip link set dev eth1 address $(mtd_get_mac_ascii bdcfg "wanmac") ;; + engenius,epg5000|\ + engenius,esr1200|\ + engenius,esr1750|\ + engenius,esr900) + ip link set dev eth0 address $(mtd_get_mac_ascii u-boot-env ethaddr) + ;; enterasys,ws-ap3705i) ip link set dev eth0 address $(mtd_get_mac_ascii u-boot-env0 ethaddr) ;; @@ -19,6 +25,13 @@ preinit_set_mac_address() { siemens,ws-ap3610) ip link set dev eth0 address $(mtd_get_mac_ascii cfg1 ethaddr) ;; + fortinet,fap-221-b) + ip link set dev eth0 address $(mtd_get_mac_text u-boot 0x3ff80 12) + ;; + tplink,deco-s4-v2) + base_mac=$(mtd_get_mac_encrypted_deco $(find_mtd_part config)) + ip link set dev eth0 address $base_mac + ;; zyxel,nbg6616) ethaddr=$(mtd_get_mac_ascii u-boot-env ethaddr) ip link set dev eth0 address $(macaddr_add $ethaddr 2) diff --git a/target/linux/ath79/generic/base-files/lib/upgrade/failsafe_datachk.sh b/target/linux/ath79/generic/base-files/lib/upgrade/failsafe_datachk.sh index de84233de1..23847a1aae 100644 --- a/target/linux/ath79/generic/base-files/lib/upgrade/failsafe_datachk.sh +++ b/target/linux/ath79/generic/base-files/lib/upgrade/failsafe_datachk.sh @@ -8,8 +8,6 @@ # So the kernel check is for the loader, the rootfs check is for kernel + rootfs platform_do_upgrade_failsafe_datachk() { - local setenv_script="/tmp/fw_env_upgrade" - local flash_base=0x9f000000 local kernel_mtd=$(find_mtd_index ${KERNEL_PART:-kernel}) @@ -34,31 +32,33 @@ platform_do_upgrade_failsafe_datachk() { local rootfs_md5=$($IMAGE_CMD $ROOTFS_FILE | dd bs=4k count=$rootfs_blocks iflag=fullblock | md5sum | cut -d ' ' -f1) # prepare new u-boot-env vars - printf "vmlinux_start_addr 0x%08x\n" $((flash_base + kernel_offset)) >> $setenv_script - printf "vmlinux_size 0x%08x\n" ${kernel_size} >> $setenv_script - printf "vmlinux_checksum %s\n" ${kernel_md5} >> $setenv_script + printf "vmlinux_start_addr 0x%08x\n" $((flash_base + kernel_offset)) >> $ENV_SCRIPT + printf "vmlinux_size 0x%08x\n" ${kernel_size} >> $ENV_SCRIPT + printf "vmlinux_checksum %s\n" ${kernel_md5} >> $ENV_SCRIPT - printf "rootfs_start_addr 0x%08x\n" $((flash_base + rootfs_offset)) >> $setenv_script - printf "rootfs_size 0x%08x\n" ${rootfs_size} >> $setenv_script - printf "rootfs_checksum %s\n" ${rootfs_md5} >> $setenv_script + printf "rootfs_start_addr 0x%08x\n" $((flash_base + rootfs_offset)) >> $ENV_SCRIPT + printf "rootfs_size 0x%08x\n" ${rootfs_size} >> $ENV_SCRIPT + printf "rootfs_checksum %s\n" ${rootfs_md5} >> $ENV_SCRIPT # store u-boot-env mkdir -p /var/lock - fw_setenv -s $setenv_script || { + [ -n "$SKIP_HASH" ] || fw_setenv -s $ENV_SCRIPT || { echo 'failed to update U-Boot environment' exit 1 } # sysupgrade - sleep 2 - sync - echo 3 > /proc/sys/vm/drop_caches + sleep 2 && sync && echo 3 > /proc/sys/vm/drop_caches + $IMAGE_CMD $KERNEL_FILE | mtd $MTD_ARGS write - ${KERNEL_PART:-kernel} - sleep 2 - sync + + sleep 2 && sync && echo 3 > /proc/sys/vm/drop_caches + if [ -n "$UPGRADE_BACKUP" ]; then $IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS $MTD_CONFIG_ARGS -j $UPGRADE_BACKUP write - ${ROOTFS_PART:-rootfs} else $IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS write - ${ROOTFS_PART:-rootfs} fi + + sync } diff --git a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh index f161540a68..67a3635075 100644 --- a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh +++ b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh @@ -36,11 +36,28 @@ platform_do_upgrade() { araknis,an-500-ap-i-ac|\ araknis,an-700-ap-i-ac|\ engenius,eap1200h|\ + engenius,eap1750h|\ engenius,eap300-v2|\ engenius,eap600|\ engenius,ecb600|\ engenius,ens202ext-v1|\ - engenius,enstationac-v1) + engenius,enstationac-v1|\ + engenius,ews660ap|\ + watchguard,ap100|\ + watchguard,ap200|\ + watchguard,ap300) + ENV_SCRIPT="/tmp/fw_env" + IMAGE_LIST="tar tzf $1" + IMAGE_CMD="tar xzOf $1" + KERNEL_PART="loader" + ROOTFS_PART="fwconcat0" + KERNEL_FILE="uImage-lzma.bin" + ROOTFS_FILE="root.squashfs" + platform_do_upgrade_failsafe_datachk "$1" + ;; + fortinet,fap-221-b) + SKIP_HASH="1" + ENV_SCRIPT="/dev/null" IMAGE_LIST="tar tzf $1" IMAGE_CMD="tar xzOf $1" KERNEL_PART="loader" diff --git a/target/linux/ath79/generic/config-default b/target/linux/ath79/generic/config-default index 0ac756642f..06f264b626 100644 --- a/target/linux/ath79/generic/config-default +++ b/target/linux/ath79/generic/config-default @@ -13,15 +13,13 @@ CONFIG_IP17XX_PHY=y CONFIG_LEDS_RESET=y CONFIG_MARVELL_PHY=y CONFIG_MICREL_PHY=y -CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-3 CONFIG_MTD_REDBOOT_PARTS=y CONFIG_MTD_SPLIT_EVA_FW=y +CONFIG_NVMEM_SYSFS=y +CONFIG_NVMEM_U_BOOT_ENV=y CONFIG_PHY_AR7100_USB=y CONFIG_PHY_AR7200_USB=y +CONFIG_REALTEK_PHY=y CONFIG_REGULATOR_FIXED_VOLTAGE=y -CONFIG_RTL8366RB_PHY=y -CONFIG_RTL8366S_PHY=y -CONFIG_RTL8366_SMI=y -CONFIG_RTL8367_PHY=y CONFIG_VITESSE_PHY=y CONFIG_WATCHDOG_CORE=y diff --git a/target/linux/ath79/generic/target.mk b/target/linux/ath79/generic/target.mk index 4e53c89260..27c3365a29 100644 --- a/target/linux/ath79/generic/target.mk +++ b/target/linux/ath79/generic/target.mk @@ -1,6 +1,6 @@ BOARDNAME:=Generic -DEFAULT_PACKAGES += wpad-basic-wolfssl +DEFAULT_PACKAGES += wpad-basic-mbedtls define Target/Description Build firmware images for generic Atheros AR71xx/AR913x/AR934x based boards. diff --git a/target/linux/ath79/image/Makefile b/target/linux/ath79/image/Makefile index 39adf68168..0cda8990cb 100644 --- a/target/linux/ath79/image/Makefile +++ b/target/linux/ath79/image/Makefile @@ -83,7 +83,7 @@ define Device/loader-okli-uimage LOADER_TYPE := bin COMPILE := loader-$(1).bin loader-$(1).uImage COMPILE/loader-$(1).bin := loader-okli-compile - COMPILE/loader-$(1).uImage := append-loader-okli $(1) | pad-to 64k | \ + COMPILE/loader-$(1).uImage := loader-okli-compile | pad-to 64k | \ lzma | uImage lzma endef @@ -93,4 +93,10 @@ ifeq ($(SUBTARGET),generic) include generic-tp-link.mk endif +ifeq ($(SUBTARGET),tiny) +include tiny-netgear.mk +include tiny-tp-link.mk +include tiny-ubnt.mk +endif + $(eval $(call BuildImage)) diff --git a/target/linux/ath79/image/common-netgear.mk b/target/linux/ath79/image/common-netgear.mk index 5a61caf1f6..c3b20cf1dc 100644 --- a/target/linux/ath79/image/common-netgear.mk +++ b/target/linux/ath79/image/common-netgear.mk @@ -12,7 +12,7 @@ define Build/netgear-squashfs rm -rf $@.fs $@.squashfs mkdir -p $@.fs/image cp $@ $@.fs/image/uImage - $(STAGING_DIR_HOST)/bin/mksquashfs-lzma \ + $(STAGING_DIR_HOST)/bin/mksquashfs3-lzma \ $@.fs $@.squashfs -be \ -noappend -root-owned -b 65536 \ $(if $(SOURCE_DATE_EPOCH),-fixed-time $(SOURCE_DATE_EPOCH)) diff --git a/target/linux/ath79/image/common-senao.mk b/target/linux/ath79/image/common-senao.mk index 014fdd1a13..2e6f66932a 100644 --- a/target/linux/ath79/image/common-senao.mk +++ b/target/linux/ath79/image/common-senao.mk @@ -1,4 +1,4 @@ -DEVICE_VARS += SENAO_IMGNAME +DEVICE_VARS += SENAO_IMGNAME WATCHGUARD_MAGIC # This needs to make OEM config archive 'sysupgrade.tgz' an empty file prior to OEM # sysupgrade, as otherwise it will implant the old configuration from @@ -27,6 +27,13 @@ define Build/senao-tar-gz rm -rf $@.tmp $@.len $@.md5 endef +define Build/watchguard-cksum + -echo -n $(word 1,$(1)) | cat $@ - | md5sum | \ + cut -d ' ' -f1 | tr -d '\n' > $@.md5 && \ + cat $@.md5 >> $@ && \ + rm -rf $@.md5 +endef + define Device/senao_loader_okli $(Device/loader-okli-uimage) KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x73714f4b diff --git a/target/linux/ath79/image/common-ubnt.mk b/target/linux/ath79/image/common-ubnt.mk index 625f0b4f3f..76d6de000b 100644 --- a/target/linux/ath79/image/common-ubnt.mk +++ b/target/linux/ath79/image/common-ubnt.mk @@ -10,7 +10,7 @@ UBNT_REVISION := $(VERSION_DIST)-$(REVISION) define Build/mkubntimage -$(STAGING_DIR_HOST)/bin/mkfwimage -B $(UBNT_BOARD) \ -v $(UBNT_TYPE).$(UBNT_CHIP).v6.0.0-$(VERSION_DIST)-$(REVISION) \ - -k $(IMAGE_KERNEL) -r $@ -o $@ + -k $(if $(1),$(1),$(IMAGE_KERNEL)) -r $@ -o $@ endef define Build/mkubntimage2 diff --git a/target/linux/ath79/image/generic-tp-link.mk b/target/linux/ath79/image/generic-tp-link.mk index 528214d473..dabe660a3b 100644 --- a/target/linux/ath79/image/generic-tp-link.mk +++ b/target/linux/ath79/image/generic-tp-link.mk @@ -1,9 +1,5 @@ include ./common-tp-link.mk - - - - define Device/tplink_archer-c5-v1 $(Device/tplink-16mlzma) SOC := qca9558 @@ -15,14 +11,6 @@ define Device/tplink_archer-c5-v1 endef TARGET_DEVICES += tplink_archer-c5-v1 - - - - - - - - define Device/tplink_archer-c7-v1 $(Device/tplink-8mlzma) SOC := qca9558 @@ -48,11 +36,6 @@ define Device/tplink_archer-c7-v2 endef TARGET_DEVICES += tplink_archer-c7-v2 - - - - - define Device/tplink_cpe210-v1 $(Device/tplink-safeloader-okli) SOC := ar9344 @@ -149,6 +132,16 @@ define Device/tplink_cpe510-v3 endef TARGET_DEVICES += tplink_cpe510-v3 +define Device/tplink_cpe605-v1 + $(Device/tplink-safeloader-okli) + SOC := ar9344 + IMAGE_SIZE := 7680k + DEVICE_MODEL := CPE605 + DEVICE_VARIANT := v1 + TPLINK_BOARD_ID := CPE605V1 +endef +TARGET_DEVICES += tplink_cpe605-v1 + define Device/tplink_cpe610-v1 $(Device/tplink-safeloader-okli) SOC := ar9344 @@ -169,19 +162,14 @@ define Device/tplink_cpe610-v2 endef TARGET_DEVICES += tplink_cpe610-v2 - - - - - - - - - - - - - +define Device/tplink-eap2x5 + $(Device/tplink-safeloader) + LOADER_TYPE := elf + KERNEL := kernel-bin | append-dtb | lzma | loader-kernel + KERNEL_INITRAMFS := $$(KERNEL) + IMAGE/factory.bin := append-rootfs | tplink-safeloader factory | \ + pad-extra 128 +endef define Device/tplink_tl-mr6400-v1 $(Device/tplink-8mlzma) @@ -195,7 +183,6 @@ define Device/tplink_tl-mr6400-v1 endef TARGET_DEVICES += tplink_tl-mr6400-v1 - define Device/tplink_tl-wdr3500-v1 $(Device/tplink-8mlzma) SOC := ar9344 @@ -262,16 +249,15 @@ define Device/tplink_tl-wdr4900-v2 endef TARGET_DEVICES += tplink_tl-wdr4900-v2 - - define Device/tplink_tl-wr1043nd-v1 $(Device/tplink-8m) SOC := ar9132 DEVICE_MODEL := TL-WR1043N/ND DEVICE_VARIANT := v1 - DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport + DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport kmod-switch-rtl8366rb TPLINK_HWID := 0x10430001 SUPPORTED_DEVICES += tl-wr1043nd + DEFAULT := n endef TARGET_DEVICES += tplink_tl-wr1043nd-v1 @@ -337,7 +323,7 @@ define Device/tplink_tl-wr2543-v1 SOC := ar7242 DEVICE_MODEL := TL-WR2543N/ND DEVICE_VARIANT := v1 - DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport + DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport kmod-switch-rtl8367 TPLINK_HWID := 0x25430001 IMAGE/sysupgrade.bin := tplink-v1-image sysupgrade -v 3.13.99 | \ check-size | append-metadata @@ -354,6 +340,7 @@ define Device/tplink_tl-wr710n-v1 DEVICE_PACKAGES := kmod-usb-chipidea2 kmod-usb-ledtrig-usbport TPLINK_HWID := 0x07100001 SUPPORTED_DEVICES += tl-wr710n + DEFAULT := n endef TARGET_DEVICES += tplink_tl-wr710n-v1 @@ -366,6 +353,7 @@ define Device/tplink_tl-wr710n-v2.1 TPLINK_HWID := 0x07100002 TPLINK_HWREV := 0x2 SUPPORTED_DEVICES += tl-wr710n + DEFAULT := n endef TARGET_DEVICES += tplink_tl-wr710n-v2.1 @@ -387,6 +375,7 @@ define Device/tplink_tl-wr810n-v2 DEVICE_VARIANT := v2 TPLINK_HWID := 0x8100002 SUPPORTED_DEVICES += tl-wr810n-v2 + DEFAULT := n endef TARGET_DEVICES += tplink_tl-wr810n-v2 @@ -416,6 +405,7 @@ define Device/tplink_tl-wr842n-v1 DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport TPLINK_HWID := 0x8420001 SUPPORTED_DEVICES += tl-mr3420 + DEFAULT := n endef TARGET_DEVICES += tplink_tl-wr842n-v1 @@ -427,6 +417,7 @@ define Device/tplink_tl-wr842n-v2 DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport TPLINK_HWID := 0x8420002 SUPPORTED_DEVICES += tl-wr842n-v2 + DEFAULT := n endef TARGET_DEVICES += tplink_tl-wr842n-v2 diff --git a/target/linux/ath79/image/generic.mk b/target/linux/ath79/image/generic.mk index 605c067946..e57ae6891a 100644 --- a/target/linux/ath79/image/generic.mk +++ b/target/linux/ath79/image/generic.mk @@ -9,25 +9,8 @@ DEVICE_VARS += ADDPATTERN_ID ADDPATTERN_VERSION DEVICE_VARS += SEAMA_SIGNATURE SEAMA_MTDBLOCK DEVICE_VARS += KERNEL_INITRAMFS_PREFIX DAP_SIGNATURE DEVICE_VARS += EDIMAX_HEADER_MAGIC EDIMAX_HEADER_MODEL -DEVICE_VARS += OPENMESH_CE_TYPE - -define Build/add-elecom-factory-initramfs - $(eval edimax_model=$(word 1,$(1))) - $(eval product=$(word 2,$(1))) - - $(STAGING_DIR_HOST)/bin/mkedimaximg \ - -b -s CSYS -m $(edimax_model) \ - -f 0x70000 -S 0x01100000 \ - -i $@ -o $@.factory - - $(call Build/elecom-product-header,$(product) $@.factory) - - if [ "$$(stat -c%s $@.factory)" -le $$(($(subst k,* 1024,$(subst m, * 1024k,$(IMAGE_SIZE))))) ]; then \ - mv $@.factory $(BIN_DIR)/$(KERNEL_INITRAMFS_PREFIX)-factory.bin; \ - else \ - echo "WARNING: initramfs kernel image too big, cannot generate factory image" >&2; \ - fi -endef +DEVICE_VARS += OPENMESH_CE_TYPE ZYXEL_MODEL_STRING +DEVICE_VARS += SUPPORTED_TELTONIKA_DEVICES define Build/addpattern -$(STAGING_DIR_HOST)/bin/addpattern -B $(ADDPATTERN_ID) \ @@ -157,10 +140,46 @@ define Build/teltonika-v1-header @mv $@.new $@ endef +metadata_json_teltonika = \ + '{ $(if $(IMAGE_METADATA),$(IMAGE_METADATA)$(comma)) \ + "metadata_version": "1.1", \ + "compat_version": "$(call json_quote,$(compat_version))", \ + "version":"$(call json_quote,$(VERSION_DIST))-$(call json_quote,$(VERSION_NUMBER))-$(call json_quote,$(REVISION))", \ + "device_code": [".*"], \ + "hwver": [".*"], \ + "batch": [".*"], \ + "serial": [".*"], \ + $(if $(DEVICE_COMPAT_MESSAGE),"compat_message": "$(call json_quote,$(DEVICE_COMPAT_MESSAGE))"$(comma)) \ + $(if $(filter-out 1.0,$(compat_version)),"new_supported_devices": \ + [$(call metadata_devices,$(SUPPORTED_TELTONIKA_DEVICES))]$(comma) \ + "supported_devices": ["$(call json_quote,$(legacy_supported_message))"]$(comma)) \ + $(if $(filter 1.0,$(compat_version)),"supported_devices":[$(call metadata_devices,$(SUPPORTED_TELTONIKA_DEVICES))]$(comma)) \ + "version_wrt": { \ + "dist": "$(call json_quote,$(VERSION_DIST))", \ + "version": "$(call json_quote,$(VERSION_NUMBER))", \ + "revision": "$(call json_quote,$(REVISION))", \ + "target": "$(call json_quote,$(TARGETID))", \ + "board": "$(call json_quote,$(if $(BOARD_NAME),$(BOARD_NAME),$(DEVICE_NAME)))" \ + }, \ + "hw_support": {}, \ + "hw_mods": {} \ + }' + +define Build/append-metadata-teltonika + echo $(call metadata_json_teltonika) | fwtool -I - $@ +endef + define Build/wrgg-pad-rootfs $(STAGING_DIR_HOST)/bin/padjffs2 $(IMAGE_ROOTFS) -c 64 >>$@ endef +define Build/zyxel-tar-bz2 + mkdir -p $@.tmp + mv $@ $@.tmp/$(word 2,$(1)) + cp $(KDIR)/loader-$(DEVICE_NAME).uImage $@.tmp/$(word 1,$(1)).lzma.uImage + $(TAR) -cjf $@ -C $@.tmp . + rm -rf $@.tmp +endef define Device/seama KERNEL := kernel-bin | append-dtb | relocate-kernel | lzma @@ -227,6 +246,18 @@ define Device/adtran_bsap1840 endef TARGET_DEVICES += adtran_bsap1840 +define Device/alcatel_hh40v + SOC := qca9531 + DEVICE_VENDOR := Alcatel + DEVICE_MODEL := HH40V + DEVICE_PACKAGES := kmod-usb2 kmod-usb-serial-option kmod-usb-net-rndis + IMAGE_SIZE := 14976k + IMAGES += factory.bin + IMAGE/factory.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | \ + append-rootfs | pad-rootfs +endef +TARGET_DEVICES += alcatel_hh40v + define Device/alfa-network_ap121f SOC := ar9331 @@ -327,9 +358,47 @@ define Device/aruba_ap-105 DEVICE_MODEL := AP-105 IMAGE_SIZE := 16000k DEVICE_PACKAGES := kmod-i2c-gpio kmod-tpm-i2c-atmel + LOADER_TYPE := bin + LOADER_FLASH_OFFS := 0x42000 + COMPILE := loader-$(1).bin + COMPILE/loader-$(1).bin := loader-okli-compile + KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x4f4b4c49 | loader-okli $(1) 8128 | uImage none + KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | loader-kernel | uImage none endef TARGET_DEVICES += aruba_ap-105 +define Device/aruba_ap-115 + SOC := qca9558 + DEVICE_VENDOR := Aruba + DEVICE_MODEL := AP-115 + IMAGE_SIZE := 16000k + DEVICE_PACKAGES := kmod-usb2 + LOADER_TYPE := bin + LOADER_FLASH_OFFS := 0x102000 + COMPILE := loader-$(1).bin + COMPILE/loader-$(1).bin := loader-okli-compile + KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x4f4b4c49 | loader-okli $(1) 8128 | uImage none + KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | loader-kernel +endef +TARGET_DEVICES += aruba_ap-115 + +define Device/aruba_ap-175 + SOC := ar7161 + DEVICE_VENDOR := Aruba + DEVICE_MODEL := AP-175 + IMAGE_SIZE := 16000k + DEVICE_PACKAGES := kmod-gpio-pca953x kmod-hwmon-lm75 kmod-i2c-gpio kmod-rtc-ds1374 + LOADER_TYPE := bin + LOADER_FLASH_OFFS := 0x42000 + COMPILE := loader-$(1).bin + COMPILE/loader-$(1).bin := loader-okli-compile + KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x4f4b4c49 | loader-okli $(1) 8128 | uImage none + KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | loader-kernel | uImage none +endef +TARGET_DEVICES += aruba_ap-175 + + + define Device/atheros_db120 $(Device/loader-okli-uimage) @@ -358,7 +427,6 @@ define Device/avm DEVICE_PACKAGES := fritz-tffs endef - define Device/avm_fritz300e $(Device/avm) SOC := ar7242 @@ -387,10 +455,6 @@ define Device/avm_fritz450e endef TARGET_DEVICES += avm_fritz450e - - - - define Device/buffalo_bhr-4grv $(Device/buffalo_common) SOC := ar7242 @@ -446,12 +510,14 @@ endef define Device/buffalo_wzr-hp-g300nh-rb $(Device/buffalo_wzr-hp-g300nh) DEVICE_MODEL := WZR-HP-G300NH (RTL8366RB switch) + DEVICE_PACKAGES += kmod-switch-rtl8366rb endef TARGET_DEVICES += buffalo_wzr-hp-g300nh-rb define Device/buffalo_wzr-hp-g300nh-s $(Device/buffalo_wzr-hp-g300nh) DEVICE_MODEL := WZR-HP-G300NH (RTL8366S switch) + DEVICE_PACKAGES += kmod-switch-rtl8366s endef TARGET_DEVICES += buffalo_wzr-hp-g300nh-s @@ -520,7 +586,6 @@ define Device/comfast_cf-e314n-v2 endef TARGET_DEVICES += comfast_cf-e314n-v2 - define Device/comfast_cf-e5 SOC := qca9531 DEVICE_VENDOR := COMFAST @@ -531,11 +596,6 @@ define Device/comfast_cf-e5 endef TARGET_DEVICES += comfast_cf-e5 - - - - - define Device/compex_wpj344-16m SOC := ar9344 DEVICE_PACKAGES := kmod-usb2 @@ -591,14 +651,6 @@ define Device/compex_wpj563 endef TARGET_DEVICES += compex_wpj563 - - - - - - - - define Device/dlink_dap-13xx SOC := qca9533 DEVICE_VENDOR := D-Link @@ -631,9 +683,6 @@ define Device/dlink_dap-2230-a1 endef TARGET_DEVICES += dlink_dap-2230-a1 - - - define Device/dlink_dap-3320-a1 $(Device/dlink_dap-2xxx) SOC := qca9533 @@ -645,7 +694,6 @@ define Device/dlink_dap-3320-a1 endef TARGET_DEVICES += dlink_dap-3320-a1 - define Device/dlink_dir-505 SOC := ar9330 DEVICE_VENDOR := D-Link @@ -656,6 +704,19 @@ define Device/dlink_dir-505 endef TARGET_DEVICES += dlink_dir-505 +define Device/dlink_dir-629-a1 + $(Device/seama) + SOC := qca9558 + IMAGE_SIZE := 7616k + DEVICE_VENDOR := D-Link + DEVICE_MODEL := DIR-629 + DEVICE_VARIANT := A1 + DEVICE_PACKAGES := -uboot-envtools + SEAMA_MTDBLOCK := 6 + SEAMA_SIGNATURE := wrgn83_dlob.hans_dir629 +endef +TARGET_DEVICES += dlink_dir-629-a1 + define Device/dlink_dir-825-c1 SOC := ar9344 DEVICE_VENDOR := D-Link @@ -691,18 +752,17 @@ define Device/dlink_dir-835-a1 endef TARGET_DEVICES += dlink_dir-835-a1 - - - - - define Device/elecom_wrc-300ghbk2-i SOC := qca9563 DEVICE_VENDOR := ELECOM DEVICE_MODEL := WRC-300GHBK2-I IMAGE_SIZE := 7616k - KERNEL_INITRAMFS := $$(KERNEL) | pad-to 2 | \ - add-elecom-factory-initramfs RN51 WRC-300GHBK2-I +ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),) + ARTIFACTS := initramfs-factory.bin + ARTIFACT/initramfs-factory.bin := append-image initramfs-kernel.bin | \ + pad-to 2 | edimax-header -b -s CSYS -m RN51 -f 0x70000 -S 0x01100000 | \ + elecom-product-header WRC-300GHBK2-I | check-size +endif endef TARGET_DEVICES += elecom_wrc-300ghbk2-i @@ -724,7 +784,6 @@ define Device/embeddedwireless_dorin endef TARGET_DEVICES += embeddedwireless_dorin - define Device/engenius_eap300-v2 $(Device/senao_loader_okli) SOC := ar9341 @@ -748,8 +807,6 @@ define Device/engenius_eap600 endef TARGET_DEVICES += engenius_eap600 - - define Device/engenius_ecb600 $(Device/senao_loader_okli) SOC := ar9344 @@ -774,8 +831,19 @@ define Device/engenius_ens202ext-v1 endef TARGET_DEVICES += engenius_ens202ext-v1 - - +define Device/engenius_esr900 + SOC := qca9558 + DEVICE_VENDOR := EnGenius + DEVICE_MODEL := ESR900 + DEVICE_PACKAGES := kmod-usb2 + IMAGE_SIZE := 14656k + IMAGES += factory.dlf + IMAGE/factory.dlf := append-kernel | pad-to $$$$(BLOCKSIZE) | \ + append-rootfs | pad-rootfs | check-size | \ + senao-header -r 0x101 -p 0x4e -t 2 + SUPPORTED_DEVICES += esr900 +endef +TARGET_DEVICES += engenius_esr900 define Device/enterasys_ws-ap3705i SOC := ar9344 @@ -796,6 +864,21 @@ define Device/etactica_eg200 endef TARGET_DEVICES += etactica_eg200 +define Device/fortinet_fap-221-b + $(Device/senao_loader_okli) + SOC := ar9344 + DEVICE_VENDOR := Fortinet + DEVICE_MODEL := FAP-221-B + FACTORY_IMG_NAME := FP221B-9.99-AP-build999-999999-patch99 + IMAGE_SIZE := 9216k + LOADER_FLASH_OFFS := 0x040000 + IMAGE/factory.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | \ + append-rootfs | pad-rootfs | \ + check-size | pad-to $$$$(IMAGE_SIZE) | \ + append-loader-okli-uimage $(1) | pad-to 10944k | \ + gzip-filename $$$$(FACTORY_IMG_NAME) +endef +TARGET_DEVICES += fortinet_fap-221-b define Device/glinet_6408 $(Device/tplink-8mlzma) @@ -854,7 +937,6 @@ define Device/glinet_gl-ar300m16 endef TARGET_DEVICES += glinet_gl-ar300m16 - define Device/glinet_gl-mifi SOC := ar9331 DEVICE_VENDOR := GL.iNET @@ -883,7 +965,6 @@ define Device/glinet_gl-x300b endef TARGET_DEVICES += glinet_gl-x300b - define Device/hak5_lan-turtle $(Device/tplink-16mlzma) SOC := ar9331 @@ -892,7 +973,7 @@ define Device/hak5_lan-turtle TPLINK_HWID := 0x5348334c IMAGES := sysupgrade.bin DEVICE_PACKAGES := kmod-usb-chipidea2 -iwinfo -kmod-ath9k -swconfig \ - -uboot-envtools -wpad-basic-wolfssl + -uboot-envtools -wpad-basic-mbedtls SUPPORTED_DEVICES += lan-turtle endef TARGET_DEVICES += hak5_lan-turtle @@ -905,7 +986,7 @@ define Device/hak5_packet-squirrel TPLINK_HWID := 0x5351524c IMAGES := sysupgrade.bin DEVICE_PACKAGES := kmod-usb-chipidea2 -iwinfo -kmod-ath9k -swconfig \ - -uboot-envtools -wpad-basic-wolfssl + -uboot-envtools -wpad-basic-mbedtls SUPPORTED_DEVICES += packet-squirrel endef TARGET_DEVICES += hak5_packet-squirrel @@ -923,18 +1004,27 @@ define Device/hak5_wifi-pineapple-nano endef TARGET_DEVICES += hak5_wifi-pineapple-nano +define Device/hiwifi_hc6361 + SOC := ar9331 + DEVICE_VENDOR := HiWiFi + DEVICE_MODEL := HC6361 + DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-chipidea2 kmod-usb-storage \ + kmod-fs-ext4 kmod-nls-iso8859-1 e2fsprogs + BOARDNAME := HiWiFi-HC6361 + KERNEL := kernel-bin | append-dtb | lzma | uImage lzma | pad-to $$(BLOCKSIZE) + IMAGE_SIZE := 16128k +endef +TARGET_DEVICES += hiwifi_hc6361 + define Device/iodata_etg3-r SOC := ar9342 DEVICE_VENDOR := I-O DATA DEVICE_MODEL := ETG3-R IMAGE_SIZE := 7680k - DEVICE_PACKAGES := -iwinfo -kmod-ath9k -wpad-basic-wolfssl + DEVICE_PACKAGES := -iwinfo -kmod-ath9k -wpad-basic-mbedtls endef TARGET_DEVICES += iodata_etg3-r - - - define Device/iodata_wn-ag300dgr SOC := ar1022 DEVICE_VENDOR := I-O DATA @@ -952,7 +1042,7 @@ define Device/jjplus_ja76pf2 SOC := ar7161 DEVICE_VENDOR := jjPlus DEVICE_MODEL := JA76PF2 - DEVICE_PACKAGES += -kmod-ath9k -swconfig -wpad-basic-wolfssl -uboot-envtools fconfig + DEVICE_PACKAGES += -kmod-ath9k -swconfig -wpad-basic-mbedtls -uboot-envtools fconfig kmod-hwmon-lm75 LOADER_TYPE := bin LOADER_FLASH_OFFS := 0x60000 COMPILE := loader-$(1).bin @@ -982,19 +1072,36 @@ define Device/jjplus_jwap230 endef TARGET_DEVICES += jjplus_jwap230 +define Device/kuwfi_c910 + $(Device/loader-okli-uimage) + SOC := qca9533 + DEVICE_VENDOR := KuWFi + DEVICE_MODEL := C910 + DEVICE_PACKAGES := kmod-usb2 kmod-usb-net-cdc-ether comgt-ncm + LOADER_FLASH_OFFS := 0x50000 + KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x4f4b4c49 + IMAGE_SIZE := 15936k + IMAGES += factory.bin + IMAGE/factory.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | \ + append-rootfs | pad-rootfs | check-size | pad-to 14528k | \ + append-loader-okli-uimage $(1) | pad-to 64k +endef +TARGET_DEVICES += kuwfi_c910 define Device/letv_lba-047-ch $(Device/loader-okli-uimage) SOC := qca9531 DEVICE_VENDOR := Letv DEVICE_MODEL := LBA-047-CH + DEVICE_PACKAGES := -uboot-envtools + FACTORY_SIZE := 14528k IMAGE_SIZE := 15936k LOADER_FLASH_OFFS := 0x50000 KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x4f4b4c49 - IMAGES += factory.bin - IMAGE/factory.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | \ - append-rootfs | pad-rootfs | check-size | pad-to 14528k | \ - append-loader-okli-uimage $(1) | pad-to 64k + IMAGES += kernel.bin rootfs.bin + IMAGE/kernel.bin := append-loader-okli-uimage $(1) | pad-to 64k + IMAGE/rootfs.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | \ + append-rootfs | pad-rootfs | check-size $$$$(FACTORY_SIZE) endef TARGET_DEVICES += letv_lba-047-ch @@ -1053,17 +1160,11 @@ define Device/mercury_mw4530r-v1 endef TARGET_DEVICES += mercury_mw4530r-v1 - - - - - - define Device/netgear_wndap360 $(Device/netgear_generic) SOC := ar7161 DEVICE_MODEL := WNDAP360 - DEVICE_PACKAGES := kmod-leds-reset kmod-owl-loader + DEVICE_PACKAGES := kmod-leds-reset IMAGE_SIZE := 7744k BLOCKSIZE := 256k KERNEL := kernel-bin | append-dtb | gzip | uImage gzip @@ -1078,7 +1179,7 @@ define Device/netgear_wndr3x00 $(Device/netgear_generic) SOC := ar7161 DEVICE_PACKAGES := kmod-usb-ohci kmod-usb2 kmod-usb-ledtrig-usbport \ - kmod-leds-reset kmod-owl-loader + kmod-leds-reset kmod-owl-loader kmod-switch-rtl8366s endef define Device/netgear_wndr3700 @@ -1185,16 +1286,14 @@ define Device/netgear_wnr2200-16m endef TARGET_DEVICES += netgear_wnr2200-16m - define Device/ocedo_raccoon SOC := ar9344 DEVICE_VENDOR := Ocedo DEVICE_MODEL := Raccoon - IMAGE_SIZE := 7424k + IMAGE_SIZE := 14848k endef TARGET_DEVICES += ocedo_raccoon - define Device/onion_omega $(Device/tplink-16mlzma) SOC := ar9331 @@ -1231,8 +1330,6 @@ define Device/openmesh_common_256k openmesh-image ce_type=$$$$(OPENMESH_CE_TYPE) | append-metadata endef - - define Device/openmesh_mr600-v1 $(Device/openmesh_common_64k) SOC := ar9344 @@ -1273,8 +1370,6 @@ define Device/openmesh_mr900-v2 endef TARGET_DEVICES += openmesh_mr900-v2 - - define Device/openmesh_om2p-v1 $(Device/openmesh_common_256k) SOC := ar7240 @@ -1363,8 +1458,6 @@ define Device/openmesh_om5p endef TARGET_DEVICES += openmesh_om5p - - define Device/openmesh_om5p-an $(Device/openmesh_common_64k) SOC := ar9344 @@ -1402,7 +1495,6 @@ define Device/pcs_cr5000 endef TARGET_DEVICES += pcs_cr5000 - define Device/pisen_ts-d084 $(Device/tplink-8mlzma) SOC := ar9331 @@ -1493,9 +1585,6 @@ define Device/qca_ap143-16m endef TARGET_DEVICES += qca_ap143-16m - - - define Device/qxwlan_e558-v2 SOC := qca9558 DEVICE_VENDOR := Qxwlan @@ -1540,8 +1629,6 @@ define Device/qxwlan_e600g-v2-8m endef TARGET_DEVICES += qxwlan_e600g-v2-8m - - define Device/qxwlan_e750a-v4 SOC := ar9344 DEVICE_VENDOR := Qxwlan @@ -1595,15 +1682,58 @@ define Device/rosinson_wr818 endef TARGET_DEVICES += rosinson_wr818 -define Device/ruckus_zf73xx_common +define Device/ruckus_common DEVICE_VENDOR := Ruckus - DEVICE_PACKAGES := -swconfig kmod-usb2 kmod-usb-chipidea2 - IMAGE_SIZE := 31744k LOADER_TYPE := bin KERNEL := kernel-bin | append-dtb | lzma | loader-kernel | uImage none KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | loader-kernel | uImage none endef +define Device/ruckus_zf7025 + $(Device/ruckus_common) + SOC := ar7240 + DEVICE_MODEL := ZoneFlex 7025 + IMAGE_SIZE := 15616k + BLOCKSIZE := 256k +endef +TARGET_DEVICES += ruckus_zf7025 + +define Device/ruckus_gd11_common + $(Device/ruckus_common) + SOC := ar7161 + IMAGE_SIZE := 15616k + BLOCKSIZE := 256k + DEVICE_PACKAGES := kmod-usb2 kmod-usb-chipidea2 +endef + +define Device/ruckus_zf7341 + $(Device/ruckus_gd11_common) + DEVICE_MODEL := ZoneFlex 7341[-U] + DEVICE_PACKAGES += -swconfig +endef +TARGET_DEVICES += ruckus_zf7341 + +define Device/ruckus_zf7351 + $(Device/ruckus_gd11_common) + DEVICE_MODEL := ZoneFlex 7351[-U] + DEVICE_PACKAGES += -swconfig +endef +TARGET_DEVICES += ruckus_zf7351 + +define Device/ruckus_zf7363 + $(Device/ruckus_gd11_common) + DEVICE_MODEL := ZoneFlex 7363[-U] + DEVICE_ALT0_VENDOR := Ruckus + DEVICE_ALT0_MODEL := ZoneFlex 7343[-U] +endef +TARGET_DEVICES += ruckus_zf7363 + +define Device/ruckus_zf73xx_common + $(Device/ruckus_common) + DEVICE_PACKAGES := -swconfig kmod-usb2 kmod-usb-chipidea2 + IMAGE_SIZE := 31744k +endef + define Device/ruckus_zf7321 $(Device/ruckus_zf73xx_common) SOC := ar9342 @@ -1643,12 +1773,6 @@ define Device/siemens_ws-ap3610 endef TARGET_DEVICES += siemens_ws-ap3610 - - - - - - define Device/telco_t1 SOC := qca9531 DEVICE_VENDOR := Telco @@ -1682,6 +1806,23 @@ define Device/teltonika_rut230-v1 endef TARGET_DEVICES += teltonika_rut230-v1 +define Device/teltonika_rut300 + SOC := qca9531 + DEVICE_VENDOR := Teltonika + DEVICE_MODEL := RUT300 + SUPPORTED_TELTONIKA_DEVICES := teltonika,rut30x + DEVICE_PACKAGES := -kmod-ath9k -uboot-envtools -wpad-basic-mbedtls kmod-usb2 + IMAGE_SIZE := 15552k + IMAGES += factory.bin + IMAGE/factory.bin = append-kernel | pad-to $$$$(BLOCKSIZE) | \ + append-rootfs | pad-rootfs | append-metadata-teltonika | \ + check-size $$$$(IMAGE_SIZE) + IMAGE/sysupgrade.bin = append-kernel | pad-to $$$$(BLOCKSIZE) | \ + append-rootfs | pad-rootfs | append-metadata | \ + check-size $$$$(IMAGE_SIZE) +endef +TARGET_DEVICES += teltonika_rut300 + define Device/teltonika_rut955 SOC := ar9344 DEVICE_VENDOR := Teltonika @@ -1719,6 +1860,16 @@ define Device/thinkpenguin_tpe-r1100 endef TARGET_DEVICES += thinkpenguin_tpe-r1100 +define Device/thinkpenguin_tpe-r1200 + SOC := qca9531 + DEVICE_VENDOR := ThinkPenguin + DEVICE_MODEL := TPE-R1200 + DEVICE_PACKAGES := kmod-usb2 + IMAGE_SIZE := 16000k + SUPPORTED_DEVICES += tpe-r1200 +endef +TARGET_DEVICES += thinkpenguin_tpe-r1200 + define Device/thinkpenguin_tpe-r1300 SOC := qca9531 DEVICE_VENDOR := ThinkPenguin @@ -1739,6 +1890,34 @@ define Device/wallys_dr531 endef TARGET_DEVICES += wallys_dr531 +define Device/watchguard_ap100 + $(Device/senao_loader_okli) + SOC := ar9344 + DEVICE_VENDOR := WatchGuard + DEVICE_MODEL := AP100 + IMAGE_SIZE := 12096k + LOADER_FLASH_OFFS := 0x220000 + SENAO_IMGNAME := senao-ap100 + WATCHGUARD_MAGIC := 82kdlzk2 + IMAGE/factory.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | append-rootfs | pad-rootfs | \ + check-size | senao-tar-gz $$$$(SENAO_IMGNAME) | watchguard-cksum $$$$(WATCHGUARD_MAGIC) +endef +TARGET_DEVICES += watchguard_ap100 + +define Device/watchguard_ap200 + $(Device/senao_loader_okli) + SOC := ar9344 + DEVICE_VENDOR := WatchGuard + DEVICE_MODEL := AP200 + IMAGE_SIZE := 12096k + LOADER_FLASH_OFFS := 0x220000 + SENAO_IMGNAME := senao-ap200 + WATCHGUARD_MAGIC := 82kdlzk2 + IMAGE/factory.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | append-rootfs | pad-rootfs | \ + check-size | senao-tar-gz $$$$(SENAO_IMGNAME) | watchguard-cksum $$$$(WATCHGUARD_MAGIC) +endef +TARGET_DEVICES += watchguard_ap200 + define Device/wd_mynet-n600 $(Device/seama) SOC := ar9344 @@ -1774,6 +1953,7 @@ define Device/wd_mynet-wifi-rangeextender IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | cybertan-trx | \ addpattern | append-metadata SUPPORTED_DEVICES += mynet-rext + DEFAULT := n endef TARGET_DEVICES += wd_mynet-wifi-rangeextender @@ -1796,8 +1976,6 @@ define Device/xiaomi_mi-router-4q endef TARGET_DEVICES += xiaomi_mi-router-4q - - define Device/yuncore_a930 SOC := qca9533 DEVICE_VENDOR := YunCore @@ -1808,14 +1986,13 @@ define Device/yuncore_a930 endef TARGET_DEVICES += yuncore_a930 - - define Device/ziking_cpe46b SOC := ar9330 DEVICE_VENDOR := ZiKing DEVICE_MODEL := CPE46B IMAGE_SIZE := 8000k DEVICE_PACKAGES := kmod-i2c-gpio + DEFAULT := n endef TARGET_DEVICES += ziking_cpe46b @@ -1829,3 +2006,40 @@ define Device/zbtlink_zbt-wd323 endef TARGET_DEVICES += zbtlink_zbt-wd323 +define Device/zyxel_nwa11xx + $(Device/loader-okli-uimage) + SOC := ar9342 + DEVICE_VENDOR := ZyXEL + LOADER_FLASH_OFFS := 0x050000 + KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x4f4b4c49 + IMAGE_SIZE := 8192k + IMAGES += factory-$$$$(ZYXEL_MODEL_STRING).bin + IMAGE/factory-$$$$(ZYXEL_MODEL_STRING).bin := \ + append-kernel | pad-to $$$$(BLOCKSIZE) | append-rootfs | \ + pad-rootfs | pad-to 8192k | check-size | zyxel-tar-bz2 \ + vmlinux_mi124_f1e mi124_f1e-jffs2 | append-md5sum-bin +endef + +define Device/zyxel_nwa1100-nh + $(Device/zyxel_nwa11xx) + DEVICE_MODEL := NWA1100 + DEVICE_VARIANT := NH + ZYXEL_MODEL_STRING := AASI +endef +TARGET_DEVICES += zyxel_nwa1100-nh + +define Device/zyxel_nwa1121-ni + $(Device/zyxel_nwa11xx) + DEVICE_MODEL := NWA1121 + DEVICE_VARIANT := NI + ZYXEL_MODEL_STRING := AABJ +endef +TARGET_DEVICES += zyxel_nwa1121-ni + +define Device/zyxel_nwa1123-ni + $(Device/zyxel_nwa11xx) + DEVICE_MODEL := NWA1123 + DEVICE_VARIANT := NI + ZYXEL_MODEL_STRING := AAEO +endef +TARGET_DEVICES += zyxel_nwa1123-ni diff --git a/target/linux/ath79/image/lzma-loader/src/ar71xx_regs.h b/target/linux/ath79/image/lzma-loader/src/ar71xx_regs.h index 19a4785bb4..245042fdab 100644 --- a/target/linux/ath79/image/lzma-loader/src/ar71xx_regs.h +++ b/target/linux/ath79/image/lzma-loader/src/ar71xx_regs.h @@ -128,6 +128,17 @@ #define AR9300_OTP_STATUS_SM_BUSY 0x1 #define AR9300_OTP_READ_DATA 0x15f1c +#define QCA955X_OTP_BASE (AR71XX_APB_BASE + 0x00130000) +#define QCA955X_OTP_REG_MEM_0 0x0000 +#define QCA955X_OTP_REG_INTF2 0x1008 +#define QCA955X_OTP_REG_STATUS0 0x1018 +#define QCA955X_OTP_STATUS0_EFUSE_VALID BIT(2) + +#define QCA955X_OTP_REG_STATUS1 0x101c +#define QCA955X_OTP_REG_LDO_CTRL 0x1024 +#define QCA955X_OTP_REG_LDO_STATUS 0x102c +#define QCA955X_OTP_LDO_STATUS_POWER_ON BIT(0) + /* * DDR_CTRL block */ @@ -344,6 +355,7 @@ #define QCA955X_RESET_REG_BOOTSTRAP 0xb0 #define QCA955X_RESET_REG_EXT_INT_STATUS 0xac +#define QCA955X_RESET_REG_RESET_MODULE 0x1c #define MISC_INT_ETHSW BIT(12) #define MISC_INT_TIMER4 BIT(10) @@ -436,6 +448,9 @@ #define AR934X_RESET_MBOX BIT(1) #define AR934X_RESET_I2S BIT(0) +#define QCA955X_RESET_SGMII_ANALOG BIT(12) +#define QCA955X_RESET_SGMII BIT(8) + #define AR933X_BOOTSTRAP_MDIO_GPIO_EN BIT(18) #define AR933X_BOOTSTRAP_EEPBUSY BIT(4) #define AR933X_BOOTSTRAP_REF_CLK_40 BIT(0) @@ -722,4 +737,6 @@ #define QCA955X_ETH_CFG_RGMII_GMAC0 BIT(0) #define QCA955X_ETH_CFG_SGMII_GMAC0 BIT(6) +#define QCA955X_GMAC_REG_SGMII_SERDES 0x0018 + #endif /* __ASM_MACH_AR71XX_REGS_H */ diff --git a/target/linux/ath79/image/lzma-loader/src/board.c b/target/linux/ath79/image/lzma-loader/src/board.c index 2f4dd6b1f6..7b1e110ee2 100644 --- a/target/linux/ath79/image/lzma-loader/src/board.c +++ b/target/linux/ath79/image/lzma-loader/src/board.c @@ -10,6 +10,7 @@ #include #include "config.h" +#include "printf.h" #include "ar71xx_regs.h" #define READREG(r) *(volatile unsigned int *)(r) @@ -50,7 +51,139 @@ static void tlwr1043nd_init(void) static inline void tlwr1043nd_init(void) {} #endif +#ifdef CONFIG_BOARD_MERAKI_MR18 + +static int mr18_extract_sgmii_res_cal(void) +{ + unsigned int base; + unsigned int reversed_sgmii_value; + + unsigned int otp_value, otp_per_val, rbias_per, read_data; + unsigned int rbias_pos_or_neg; + unsigned int sgmii_res_cal_value; + int res_cal_val; + + base = KSEG1ADDR(QCA955X_OTP_BASE); + + WRITEREG(base + QCA955X_OTP_REG_INTF2, 0x7d); + WRITEREG(base + QCA955X_OTP_REG_LDO_CTRL, 0x00); + + while (READREG(base + QCA955X_OTP_REG_LDO_STATUS) & + QCA955X_OTP_LDO_STATUS_POWER_ON) + ; + + READREG(base + QCA955X_OTP_REG_MEM_0 + 4); + + while (!(READREG(base + QCA955X_OTP_REG_STATUS0) & + QCA955X_OTP_STATUS0_EFUSE_VALID)) + ; + + read_data = READREG(base + QCA955X_OTP_REG_STATUS1); + + if (!(read_data & 0x1fff)) + return 0; + + if (read_data & 0x00001000) + otp_value = (read_data & 0xfc0) >> 6; + else + otp_value = read_data & 0x3f; + + if (otp_value > 31) { + otp_per_val = 63 - otp_value; + rbias_pos_or_neg = 1; + } else { + otp_per_val = otp_value; + rbias_pos_or_neg = 0; + } + + rbias_per = otp_per_val * 15; + + if (rbias_pos_or_neg == 1) + res_cal_val = (rbias_per + 34) / 21; + else if (rbias_per > 34) + res_cal_val = -((rbias_per - 34) / 21); + else + res_cal_val = (34 - rbias_per) / 21; + + sgmii_res_cal_value = (8 + res_cal_val) & 0xf; + + reversed_sgmii_value = (sgmii_res_cal_value & 8) >> 3; + reversed_sgmii_value |= (sgmii_res_cal_value & 4) >> 1; + reversed_sgmii_value |= (sgmii_res_cal_value & 2) << 1; + reversed_sgmii_value |= (sgmii_res_cal_value & 1) << 3; + printf("SGMII cal value = 0x%x\n", reversed_sgmii_value); + return reversed_sgmii_value; +} + +#define QCA955X_SGMII_SERDES_RES_CALIBRATION BIT(23) +#define QCA955X_SGMII_SERDES_RES_CALIBRATION_MASK 0xf +#define QCA955X_SGMII_SERDES_RES_CALIBRATION_SHIFT 23 +#define QCA955X_SGMII_SERDES_LOCK_DETECT_STATUS BIT(15) +#define QCA955X_PLL_ETH_SGMII_SERDES_LOCK_DETECT BIT(2) +#define QCA955X_PLL_ETH_SGMII_SERDES_PLL_REFCLK BIT(1) +#define QCA955X_PLL_ETH_SGMII_SERDES_EN_PLL BIT(0) +#define QCA955X_PLL_CLK_CTRL_REG 0x08 +#define QCA955X_PLL_ETH_XMII_CONTROL_REG 0x28 +#define QCA955X_PLL_ETH_SGMII_CONTROL_REG 0x48 +#define QCA955X_PLL_ETH_SGMII_SERDES_REG 0x4c + +static void qca955x_device_reset_clear(unsigned int mask) +{ + unsigned int t, reg; + + reg = KSEG1ADDR(AR71XX_RESET_BASE + + QCA955X_RESET_REG_RESET_MODULE); + + t = READREG(reg); + WRITEREG(reg, t & ~mask); +} + +static void mr18_setup_qca955x_eth_serdes_cal(unsigned int sgmii_value) +{ + unsigned int ethbase, pllbase, t; + + ethbase = KSEG1ADDR(QCA955X_GMAC_BASE); + pllbase = KSEG1ADDR(AR71XX_PLL_BASE); + + /* To Check the locking of the SGMII PLL */ + t = READREG(ethbase + QCA955X_GMAC_REG_SGMII_SERDES); + t &= ~(QCA955X_SGMII_SERDES_RES_CALIBRATION_MASK << + QCA955X_SGMII_SERDES_RES_CALIBRATION_SHIFT); + t |= (sgmii_value & QCA955X_SGMII_SERDES_RES_CALIBRATION_MASK) << + QCA955X_SGMII_SERDES_RES_CALIBRATION_SHIFT; + WRITEREG(ethbase + QCA955X_GMAC_REG_SGMII_SERDES, t); + + WRITEREG(pllbase + QCA955X_PLL_ETH_SGMII_SERDES_REG, + QCA955X_PLL_ETH_SGMII_SERDES_LOCK_DETECT | + QCA955X_PLL_ETH_SGMII_SERDES_PLL_REFCLK | + QCA955X_PLL_ETH_SGMII_SERDES_EN_PLL) + ; + + qca955x_device_reset_clear(QCA955X_RESET_SGMII_ANALOG); + qca955x_device_reset_clear(QCA955X_RESET_SGMII); + + while (!(READREG(ethbase + QCA955X_GMAC_REG_SGMII_SERDES) & + QCA955X_SGMII_SERDES_LOCK_DETECT_STATUS)) + ; +} + +static inline void mr18_init(void) +{ + int res; + + printf("Meraki MR18\n"); + + res = mr18_extract_sgmii_res_cal(); + if (res >= 0) + mr18_setup_qca955x_eth_serdes_cal(res); + +} +#else +static inline void mr18_init(void) { } +#endif + void board_init(void) { tlwr1043nd_init(); + mr18_init(); } diff --git a/target/linux/ath79/image/nand.mk b/target/linux/ath79/image/nand.mk index dffb793a48..e8ff5d0ca7 100644 --- a/target/linux/ath79/image/nand.mk +++ b/target/linux/ath79/image/nand.mk @@ -11,6 +11,14 @@ define Build/dongwon-header mv $@.tmp $@ endef +define Build/meraki-header + -$(STAGING_DIR_HOST)/bin/mkmerakifw \ + -B $(1) -s \ + -i $@ \ + -o $@.new + @mv $@.new $@ +endef + # attention: only zlib compression is allowed for the boot fs define Build/zyxel-buildkerneljffs mkdir -p $@.tmp/boot @@ -71,9 +79,6 @@ define Device/aerohive_hiveap-121 endef TARGET_DEVICES += aerohive_hiveap-121 - - - define Device/glinet_gl-ar300m-common-nand SOC := qca9531 DEVICE_VENDOR := GL.iNet @@ -103,25 +108,6 @@ define Device/glinet_gl-ar300m-nor endef TARGET_DEVICES += glinet_gl-ar300m-nor - - - -define Device/glinet_gl-xe300 - SOC := qca9531 - DEVICE_VENDOR := GL.iNet - DEVICE_MODEL := GL-XE300 - DEVICE_PACKAGES := kmod-usb2 block-mount kmod-usb-serial-ch341 - KERNEL_SIZE := 4096k - IMAGE_SIZE := 131072k - PAGESIZE := 2048 - VID_HDR_OFFSET := 2048 - BLOCKSIZE := 128k - IMAGES += factory.img - IMAGE/factory.img := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-ubi - IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata -endef -TARGET_DEVICES += glinet_gl-xe300 - define Device/linksys_ea4500-v3 SOC := qca9558 DEVICE_VENDOR := Linksys @@ -141,7 +127,24 @@ define Device/linksys_ea4500-v3 endef TARGET_DEVICES += linksys_ea4500-v3 -# fake rootfs is mandatory, pad-offset 129 equals (2 * uimage_header + 0xff) +define Device/meraki_mr18 + SOC := qca9557 + DEVICE_VENDOR := Meraki + DEVICE_MODEL := MR18 + DEVICE_PACKAGES := kmod-leds-uleds kmod-spi-gpio nu801 + KERNEL_SIZE := 8m + BLOCKSIZE := 128k + PAGESIZE := 2048 + LOADER_TYPE := bin + KERNEL := kernel-bin | append-dtb | lzma | loader-kernel | meraki-header MR18 +# Initramfs-build fails due to size issues +# KERNEL_INITRAMFS := $$(KERNEL) + KERNEL_INITRAMFS := + IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata +endef +TARGET_DEVICES += meraki_mr18 + +# fake rootfs is mandatory, pad-offset 129 equals (2 * uimage_header + '\0') define Device/netgear_ath79_nand DEVICE_VENDOR := NETGEAR DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport @@ -149,18 +152,31 @@ define Device/netgear_ath79_nand BLOCKSIZE := 128k PAGESIZE := 2048 IMAGE_SIZE := 25600k - KERNEL := kernel-bin | append-dtb | lzma -d20 | \ - pad-offset $$(KERNEL_SIZE) 129 | uImage lzma | \ - append-string -e '\xff' | \ + KERNEL := kernel-bin | append-dtb | lzma | \ + pad-offset $$(BLOCKSIZE) 129 | uImage lzma | pad-extra 1 | \ append-uImage-fakehdr filesystem $$(UIMAGE_MAGIC) - KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma -d20 | uImage lzma IMAGES := sysupgrade.bin factory.img - IMAGE/factory.img := append-kernel | append-ubi | netgear-dni | \ - check-size - IMAGE/sysupgrade.bin := sysupgrade-tar | check-size | append-metadata + IMAGE/factory.img := append-kernel | pad-to $$$$(KERNEL_SIZE) | \ + append-ubi | check-size | netgear-dni + IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata UBINIZE_OPTS := -E 5 endef +define Device/netgear_pgzng1 + SOC := ar9344 + DEVICE_MODEL := PGZNG1 + DEVICE_VENDOR := NETGEAR + DEVICE_ALT0_MODEL := Pulse Gateway + DEVICE_ALT0_VENDOR := ADT + DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport kmod-i2c-gpio \ + kmod-leds-pca955x kmod-rtc-isl1208 kmod-spi-dev + KERNEL_SIZE := 5120k + IMAGE_SIZE := 83968k + PAGESIZE := 2048 + BLOCKSIZE := 128k + IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata +endef +TARGET_DEVICES += netgear_pgzng1 define Device/netgear_wndr3700-v4 SOC := ar9344 @@ -205,6 +221,9 @@ TARGET_DEVICES += netgear_wndr4300tn define Device/netgear_wndr4300-v2 SOC := qca9563 + DEVICE_COMPAT_VERSION := 1.1 + DEVICE_COMPAT_MESSAGE := Partition table has been changed to fix the \ + first reboot issue. Please reflash factory image with nmrp or tftp. DEVICE_MODEL := WNDR4300 DEVICE_VARIANT := v2 UIMAGE_MAGIC := 0x27051956 @@ -216,6 +235,9 @@ TARGET_DEVICES += netgear_wndr4300-v2 define Device/netgear_wndr4500-v3 SOC := qca9563 + DEVICE_COMPAT_VERSION := 1.1 + DEVICE_COMPAT_MESSAGE := Partition table has been changed to fix the \ + first reboot issue. Please reflash factory image with nmrp or tftp. DEVICE_MODEL := WNDR4500 DEVICE_VARIANT := v3 UIMAGE_MAGIC := 0x27051956 @@ -225,8 +247,31 @@ define Device/netgear_wndr4500-v3 endef TARGET_DEVICES += netgear_wndr4500-v3 +define Device/thinkpenguin_tpe-r1200-common-nand + SOC := qca9531 + DEVICE_VENDOR := ThinkPenguin + DEVICE_MODEL := TPE-R1200 + DEVICE_PACKAGES := kmod-usb2 + KERNEL_SIZE := 4096k + IMAGE_SIZE := 16000k + PAGESIZE := 2048 + VID_HDR_OFFSET := 2048 +endef +define Device/thinkpenguin_tpe-r1200-nand + $(Device/thinkpenguin_tpe-r1200-common-nand) + DEVICE_VARIANT := NAND + BLOCKSIZE := 128k + IMAGES += factory.img + IMAGE/factory.img := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-ubi + IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata + SUPPORTED_DEVICES += thinkpenguin,tpe-r1200-nor +endef +TARGET_DEVICES += thinkpenguin_tpe-r1200-nand - - - +define Device/thinkpenguin_tpe-r1200-nor + $(Device/thinkpenguin_tpe-r1200-common-nand) + DEVICE_VARIANT := NOR + SUPPORTED_DEVICES += thinkpenguin,tpe-r1200-nand tpe-r1200 +endef +TARGET_DEVICES += thinkpenguin_tpe-r1200-nor diff --git a/target/linux/ath79/image/tiny-netgear.mk b/target/linux/ath79/image/tiny-netgear.mk new file mode 100644 index 0000000000..080827c08d --- /dev/null +++ b/target/linux/ath79/image/tiny-netgear.mk @@ -0,0 +1,59 @@ +include ./common-netgear.mk + +define Device/netgear_wnr612-v2 + $(Device/netgear_generic) + SOC := ar7240 + DEVICE_MODEL := WNR612 + DEVICE_VARIANT := v2 + DEVICE_DTS := ar7240_netgear_wnr612-v2 + UIMAGE_MAGIC := 0x32303631 + NETGEAR_BOARD_ID := REALWNR612V2 + IMAGE_SIZE := 3712k + SUPPORTED_DEVICES += wnr612-v2 + DEFAULT := n +endef +TARGET_DEVICES += netgear_wnr612-v2 + +define Device/on_n150r + $(Device/netgear_generic) + SOC := ar7240 + DEVICE_VENDOR := On Networks + DEVICE_MODEL := N150R + UIMAGE_MAGIC := 0x32303631 + NETGEAR_BOARD_ID := N150R + IMAGE_SIZE := 3712k + SUPPORTED_DEVICES += n150r + DEFAULT := n +endef +TARGET_DEVICES += on_n150r + +define Device/netgear_wnr1000-v2 + $(Device/netgear_generic) + SOC := ar7240 + DEVICE_MODEL := WNR1000 + DEVICE_VARIANT := v2 + UIMAGE_MAGIC := 0x31303031 + NETGEAR_BOARD_ID := WNR1000V2 + NETGEAR_HW_ID := 29763331+4+32 + IMAGE_SIZE := 3712k + SUPPORTED_DEVICES += wnr1000-v2 + DEFAULT := n +endef +TARGET_DEVICES += netgear_wnr1000-v2 + +define Device/netgear_wnr2000-v3 + $(Device/netgear_generic) + SOC := ar7241 + DEVICE_MODEL := WNR2000 + DEVICE_VARIANT := v3 + UIMAGE_MAGIC := 0x32303033 + NETGEAR_BOARD_ID := WNR2000V3 + NETGEAR_HW_ID := 29763551+04+32 + IMAGE_SIZE := 3712k + IMAGES += factory-NA.img + IMAGE/factory-NA.img := $$(IMAGE/default) | netgear-dni NA | \ + check-size + SUPPORTED_DEVICES += wnr2000-v3 + DEFAULT := n +endef +TARGET_DEVICES += netgear_wnr2000-v3 diff --git a/target/linux/ath79/image/tiny-tp-link.mk b/target/linux/ath79/image/tiny-tp-link.mk new file mode 100644 index 0000000000..865808aa69 --- /dev/null +++ b/target/linux/ath79/image/tiny-tp-link.mk @@ -0,0 +1,498 @@ +include ./common-tp-link.mk + +define Device/tplink_tl-mr10u + $(Device/tplink-4mlzma) + SOC := ar9331 + DEVICE_MODEL := TL-MR10U + DEVICE_PACKAGES := kmod-usb-chipidea2 + TPLINK_HWID := 0x00100101 + SUPPORTED_DEVICES += tl-mr10u +endef +TARGET_DEVICES += tplink_tl-mr10u + +define Device/tplink_tl-mr3020-v1 + $(Device/tplink-4mlzma) + IMAGE_SIZE := 3840k + SOC := ar9331 + DEVICE_MODEL := TL-MR3020 + DEVICE_VARIANT := v1 + DEVICE_PACKAGES := kmod-usb-chipidea2 kmod-usb-ledtrig-usbport + TPLINK_HWID := 0x30200001 + SUPPORTED_DEVICES += tl-mr3020 +endef +TARGET_DEVICES += tplink_tl-mr3020-v1 + +define Device/tplink_tl-mr3040-v2 + $(Device/tplink-4mlzma) + SOC := ar9331 + DEVICE_MODEL := TL-MR3040 + DEVICE_VARIANT := v2 + DEVICE_PACKAGES := kmod-usb-chipidea2 kmod-usb-ledtrig-usbport + TPLINK_HWID := 0x30400002 + SUPPORTED_DEVICES += tl-mr3040-v2 +endef +TARGET_DEVICES += tplink_tl-mr3040-v2 + +define Device/tplink_tl-mr3220-v1 + $(Device/tplink-4m) + SOC := ar7241 + DEVICE_MODEL := TL-MR3220 + DEVICE_VARIANT := v1 + TPLINK_HWID := 0x32200001 + DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport + SUPPORTED_DEVICES += tl-mr3220 +endef +TARGET_DEVICES += tplink_tl-mr3220-v1 + +define Device/tplink_tl-mr3420-v1 + $(Device/tplink-4m) + SOC := ar7241 + DEVICE_MODEL := TL-MR3420 + DEVICE_VARIANT := v1 + TPLINK_HWID := 0x34200001 + DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport + SUPPORTED_DEVICES += tl-mr3420 +endef +TARGET_DEVICES += tplink_tl-mr3420-v1 + +define Device/tplink_tl-mr3420-v2 + $(Device/tplink-4mlzma) + SOC := ar9341 + DEVICE_MODEL := TL-MR3420 + DEVICE_VARIANT := v2 + TPLINK_HWID := 0x34200002 + DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport + SUPPORTED_DEVICES += tl-mr3420-v2 +endef +TARGET_DEVICES += tplink_tl-mr3420-v2 + +define Device/tplink_tl-mr3420-v3 + $(Device/tplink-4mlzma) + SOC := qca9531 + DEVICE_MODEL := TL-MR3420 + DEVICE_VARIANT := v3 + TPLINK_HWID := 0x34200003 + DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport +endef +TARGET_DEVICES += tplink_tl-mr3420-v3 + +define Device/tplink_tl-wa701nd-v1 + $(Device/tplink-4m) + SOC := ar7240 + DEVICE_MODEL := TL-WA701ND + DEVICE_VARIANT := v1 + TPLINK_HWID := 0x07010001 + SUPPORTED_DEVICES += tl-wa901nd +endef +TARGET_DEVICES += tplink_tl-wa701nd-v1 + +define Device/tplink_tl-wa730re-v1 + $(Device/tplink-4m) + SOC := ar7240 + DEVICE_MODEL := TL-WA730RE + DEVICE_VARIANT := v1 + TPLINK_HWID := 0x07300001 + SUPPORTED_DEVICES += tl-wa901nd +endef +TARGET_DEVICES += tplink_tl-wa730re-v1 + +define Device/tplink_tl-wa801nd-v1 + $(Device/tplink-4m) + SOC := ar7240 + DEVICE_MODEL := TL-WA801ND + DEVICE_VARIANT := v1 + TPLINK_HWID := 0x08010001 + SUPPORTED_DEVICES += tl-wa901nd +endef +TARGET_DEVICES += tplink_tl-wa801nd-v1 + +define Device/tplink_tl-wa801nd-v3 + $(Device/tplink-4mlzma) + SOC := qca9533 + DEVICE_MODEL := TL-WA801ND + DEVICE_VARIANT := v3 + TPLINK_HWID := 0x08010003 + SUPPORTED_DEVICES += tl-wa801nd-v3 +endef +TARGET_DEVICES += tplink_tl-wa801nd-v3 + +define Device/tplink_tl-wa801nd-v4 + $(Device/tplink-4mlzma) + SOC := qca9533 + DEVICE_MODEL := TL-WA801ND + DEVICE_VARIANT := v4 + TPLINK_HWID := 0x08010004 + SUPPORTED_DEVICES += tl-wa801nd-v3 +endef +TARGET_DEVICES += tplink_tl-wa801nd-v4 + +define Device/tplink_tl-wa830re-v1 + $(Device/tplink-4m) + SOC := ar7240 + DEVICE_MODEL := TL-WA830RE + DEVICE_VARIANT := v1 + TPLINK_HWID := 0x08300010 + SUPPORTED_DEVICES += tl-wa901nd +endef +TARGET_DEVICES += tplink_tl-wa830re-v1 + +define Device/tplink_tl-wa850re-v1 + $(Device/tplink-4mlzma) + SOC := ar9341 + DEVICE_MODEL := TL-WA850RE + DEVICE_VARIANT := v1 + TPLINK_HWID := 0x08500001 + DEVICE_PACKAGES := rssileds + SUPPORTED_DEVICES += tl-wa850re +endef +TARGET_DEVICES += tplink_tl-wa850re-v1 + +define Device/tplink_tl-wa850re-v2 + $(Device/tplink-safeloader) + SOC := qca9533 + IMAGE_SIZE := 3648k + DEVICE_MODEL := TL-WA850RE + DEVICE_VARIANT := v2 + TPLINK_BOARD_ID := TLWA850REV2 + TPLINK_HWID := 0x08500002 + DEVICE_PACKAGES := rssileds + SUPPORTED_DEVICES += tl-wa850re-v2 + DEFAULT := n +endef +TARGET_DEVICES += tplink_tl-wa850re-v2 + +define Device/tplink_tl-wa860re-v1 + $(Device/tplink-4mlzma) + SOC := ar9341 + DEVICE_MODEL := TL-WA860RE + DEVICE_VARIANT := v1 + TPLINK_HWID := 0x08600001 + SUPPORTED_DEVICES += tl-wa860re +endef +TARGET_DEVICES += tplink_tl-wa860re-v1 + +define Device/tplink_tl-wa901nd-v1 + $(Device/tplink-4m) + SOC := ar7240 + DEVICE_MODEL := TL-WA901ND + DEVICE_VARIANT := v1 + TPLINK_HWID := 0x09010001 + SUPPORTED_DEVICES += tl-wa901nd +endef +TARGET_DEVICES += tplink_tl-wa901nd-v1 + +define Device/tplink_tl-wa901nd-v2 + $(Device/tplink-4m) + SOC := ar9132 + DEVICE_MODEL := TL-WA901ND + DEVICE_VARIANT := v2 + TPLINK_HWID := 0x09010002 + SUPPORTED_DEVICES += tl-wa901nd-v2 +endef +TARGET_DEVICES += tplink_tl-wa901nd-v2 + +define Device/tplink_tl-wa901nd-v3 + $(Device/tplink-4mlzma) + SOC := ar9341 + DEVICE_MODEL := TL-WA901ND + DEVICE_VARIANT := v3 + TPLINK_HWID := 0x09010003 + SUPPORTED_DEVICES += tl-wa901nd-v3 +endef +TARGET_DEVICES += tplink_tl-wa901nd-v3 + +define Device/tplink_tl-wa901nd-v4 + $(Device/tplink-4mlzma) + SOC := tp9343 + DEVICE_MODEL := TL-WA901ND + DEVICE_VARIANT := v4 + TPLINK_HWID := 0x09010004 + SUPPORTED_DEVICES += tl-wa901nd-v4 + IMAGE/factory.bin := tplink-v1-image factory -C EU +endef +TARGET_DEVICES += tplink_tl-wa901nd-v4 + +define Device/tplink_tl-wa901nd-v5 + $(Device/tplink-4mlzma) + SOC := tp9343 + DEVICE_MODEL := TL-WA901ND + DEVICE_VARIANT := v5 + TPLINK_HWID := 0x09010005 + SUPPORTED_DEVICES += tl-wa901nd-v5 + IMAGE/factory.bin := tplink-v1-image factory -C EU +endef +TARGET_DEVICES += tplink_tl-wa901nd-v5 + +define Device/tplink_tl-wr703n + $(Device/tplink-4mlzma) + SOC := ar9331 + DEVICE_MODEL := TL-WR703N + DEVICE_PACKAGES := kmod-usb-chipidea2 + TPLINK_HWID := 0x07030101 + SUPPORTED_DEVICES += tl-wr703n +endef +TARGET_DEVICES += tplink_tl-wr703n + +define Device/tplink_tl-wr740n-v1 + $(Device/tplink-4m) + SOC := ar7240 + DEVICE_MODEL := TL-WR740N + DEVICE_VARIANT := v1/v2 + TPLINK_HWID := 0x07400001 + SUPPORTED_DEVICES += tl-wr741nd +endef +TARGET_DEVICES += tplink_tl-wr740n-v1 + +define Device/tplink_tl-wr740n-v3 + $(Device/tplink-4m) + SOC := ar7240 + DEVICE_MODEL := TL-WR740N + DEVICE_VARIANT := v3 + TPLINK_HWID := 0x07400003 + SUPPORTED_DEVICES += tl-wr741nd +endef +TARGET_DEVICES += tplink_tl-wr740n-v3 + +define Device/tplink_tl-wr740n-v4 + $(Device/tplink-4mlzma) + SOC := ar9331 + DEVICE_MODEL := TL-WR740N + DEVICE_VARIANT := v4 + TPLINK_HWID := 0x07400004 + SUPPORTED_DEVICES += tl-wr741nd-v4 +endef +TARGET_DEVICES += tplink_tl-wr740n-v4 + +define Device/tplink_tl-wr740n-v5 + $(Device/tplink-4mlzma) + SOC := ar9331 + DEVICE_MODEL := TL-WR740N + DEVICE_VARIANT := v5 + TPLINK_HWID := 0x07400005 + SUPPORTED_DEVICES += tl-wr741nd-v4 +endef +TARGET_DEVICES += tplink_tl-wr740n-v5 + +define Device/tplink_tl-wr741-v1 + $(Device/tplink-4m) + SOC := ar7240 + DEVICE_MODEL := TL-WR741N/ND + DEVICE_VARIANT := v1/v2 + TPLINK_HWID := 0x07410001 + SUPPORTED_DEVICES += tl-wr741nd +endef +TARGET_DEVICES += tplink_tl-wr741-v1 + +define Device/tplink_tl-wr741nd-v4 + $(Device/tplink-4mlzma) + SOC := ar9331 + DEVICE_MODEL := TL-WR741N/ND + DEVICE_VARIANT := v4 + TPLINK_HWID := 0x07410004 + SUPPORTED_DEVICES += tl-wr741nd-v4 +endef +TARGET_DEVICES += tplink_tl-wr741nd-v4 + +define Device/tplink_tl-wr743nd-v1 + $(Device/tplink-4m) + SOC := ar7240 + DEVICE_MODEL := TL-WR743ND + DEVICE_VARIANT := v1 + TPLINK_HWID := 0x07430001 + SUPPORTED_DEVICES += tl-wr741nd +endef +TARGET_DEVICES += tplink_tl-wr743nd-v1 + +define Device/tplink_tl-wr802n-v1 + $(Device/tplink-4mlzma) + SOC := qca9533 + DEVICE_MODEL := TL-WR802N + DEVICE_VARIANT := v1 + TPLINK_HWID := 0x08020001 + SUPPORTED_DEVICES += tl-wr802n-v1 +endef +TARGET_DEVICES += tplink_tl-wr802n-v1 + +define Device/tplink_tl-wr802n-v2 + $(Device/tplink-4mlzma) + SOC := qca9533 + DEVICE_MODEL := TL-WR802N + DEVICE_VARIANT := v2 + TPLINK_HWID := 0x08020002 + TPLINK_HWREV := 2 + SUPPORTED_DEVICES += tl-wr802n-v2 + IMAGES += factory-us.bin factory-eu.bin + IMAGE/factory-us.bin := tplink-v1-image factory -C US + IMAGE/factory-eu.bin := tplink-v1-image factory -C EU +endef +TARGET_DEVICES += tplink_tl-wr802n-v2 + +define Device/tplink_tl-wr841-v5 + $(Device/tplink-4m) + SOC := ar7240 + DEVICE_MODEL := TL-WR841N/ND + DEVICE_VARIANT := v5/v6 + TPLINK_HWID := 0x08410005 + SUPPORTED_DEVICES += tl-wr741nd +endef +TARGET_DEVICES += tplink_tl-wr841-v5 + +define Device/tplink_tl-wr841-v7 + $(Device/tplink-4m) + SOC := ar7241 + DEVICE_MODEL := TL-WR841N/ND + DEVICE_VARIANT := v7 + TPLINK_HWID := 0x08410007 + SUPPORTED_DEVICES += tl-wr841n-v7 +endef +TARGET_DEVICES += tplink_tl-wr841-v7 + +define Device/tplink_tl-wr841-v8 + $(Device/tplink-4mlzma) + SOC := ar9341 + DEVICE_MODEL := TL-WR841N/ND + DEVICE_VARIANT := v8 + TPLINK_HWID := 0x08410008 + SUPPORTED_DEVICES += tl-wr841n-v8 +endef +TARGET_DEVICES += tplink_tl-wr841-v8 + +define Device/tplink_tl-wr841-v9 + $(Device/tplink-4mlzma) + SOC := qca9533 + DEVICE_MODEL := TL-WR841N/ND + DEVICE_VARIANT := v9 + TPLINK_HWID := 0x08410009 + SUPPORTED_DEVICES += tl-wr841n-v9 +endef +TARGET_DEVICES += tplink_tl-wr841-v9 + +define Device/tplink_tl-wr841-v10 + $(Device/tplink-4mlzma) + SOC := qca9533 + DEVICE_MODEL := TL-WR841N/ND + DEVICE_VARIANT := v10 + TPLINK_HWID := 0x08410010 + SUPPORTED_DEVICES += tl-wr841n-v9 +endef +TARGET_DEVICES += tplink_tl-wr841-v10 + +define Device/tplink_tl-wr841-v11 + $(Device/tplink-4mlzma) + SOC := qca9533 + DEVICE_MODEL := TL-WR841N/ND + DEVICE_VARIANT := v11 + TPLINK_HWID := 0x08410011 + SUPPORTED_DEVICES += tl-wr841n-v11 + IMAGES += factory-us.bin factory-eu.bin + IMAGE/factory-us.bin := tplink-v1-image factory -C US + IMAGE/factory-eu.bin := tplink-v1-image factory -C EU +endef +TARGET_DEVICES += tplink_tl-wr841-v11 + +define Device/tplink_tl-wr841-v12 + $(Device/tplink-4mlzma) + SOC := qca9533 + DEVICE_MODEL := TL-WR841N/ND + DEVICE_VARIANT := v12 + TPLINK_HWID := 0x08410012 + SUPPORTED_DEVICES += tl-wr841n-v11 + IMAGES += factory-us.bin factory-eu.bin + IMAGE/factory-us.bin := tplink-v1-image factory -C US + IMAGE/factory-eu.bin := tplink-v1-image factory -C EU +endef +TARGET_DEVICES += tplink_tl-wr841-v12 + +define Device/tplink_tl-wr940n-v3 + $(Device/tplink-4mlzma) + SOC := tp9343 + DEVICE_MODEL := TL-WR940N + DEVICE_VARIANT := v3 + TPLINK_HWID := 0x09410006 + SUPPORTED_DEVICES += tl-wr941nd-v6 +endef +TARGET_DEVICES += tplink_tl-wr940n-v3 + +define Device/tplink_tl-wr940n-v4 + $(Device/tplink-4mlzma) + SOC := tp9343 + DEVICE_MODEL := TL-WR940N + DEVICE_VARIANT := v4 + TPLINK_HWID := 0x09400004 + SUPPORTED_DEVICES += tl-wr940n-v4 + IMAGES += factory-us.bin factory-eu.bin factory-br.bin + IMAGE/factory-us.bin := tplink-v1-image factory -C US + IMAGE/factory-eu.bin := tplink-v1-image factory -C EU + IMAGE/factory-br.bin := tplink-v1-image factory -C BR +endef +TARGET_DEVICES += tplink_tl-wr940n-v4 + +define Device/tplink_tl-wr940n-v6 + $(Device/tplink-4mlzma) + SOC := tp9343 + DEVICE_MODEL := TL-WR940N + DEVICE_VARIANT := v6 + TPLINK_HWID := 0x09400006 + SUPPORTED_DEVICES += tl-wr940n-v6 + IMAGES += factory-us.bin factory-eu.bin factory-br.bin + IMAGE/factory-us.bin := tplink-v1-image factory -C US + IMAGE/factory-eu.bin := tplink-v1-image factory -C EU + IMAGE/factory-br.bin := tplink-v1-image factory -C BR +endef +TARGET_DEVICES += tplink_tl-wr940n-v6 + +define Device/tplink_tl-wr941-v2 + $(Device/tplink-4m) + SOC := ar9132 + DEVICE_MODEL := TL-WR941ND + DEVICE_VARIANT := v2/v3 + DEVICE_ALT0_VENDOR := TP-Link + DEVICE_ALT0_MODEL := TL-WR941N + DEVICE_ALT0_VARIANT := v2/v3 + TPLINK_HWID := 0x09410002 + TPLINK_HWREV := 2 + SUPPORTED_DEVICES += tl-wr941nd +endef +TARGET_DEVICES += tplink_tl-wr941-v2 + +define Device/tplink_tl-wr941-v4 + $(Device/tplink-4m) + SOC := ar7240 + DEVICE_MODEL := TL-WR941ND + DEVICE_VARIANT := v4 + DEVICE_ALT0_VENDOR := TP-Link + DEVICE_ALT0_MODEL := TL-WR941N + DEVICE_ALT0_VARIANT := v4 + TPLINK_HWID := 0x09410004 + SUPPORTED_DEVICES += tl-wr741nd +endef +TARGET_DEVICES += tplink_tl-wr941-v4 + +define Device/tplink_tl-wr941nd-v5 + $(Device/tplink-4mlzma) + SOC := ar9341 + DEVICE_MODEL := TL-WR941ND + DEVICE_VARIANT := v5 + TPLINK_HWID := 0x09410005 + SUPPORTED_DEVICES += tl-wr941nd-v5 +endef +TARGET_DEVICES += tplink_tl-wr941nd-v5 + +define Device/tplink_tl-wr941nd-v6 + $(Device/tplink-4mlzma) + SOC := tp9343 + DEVICE_MODEL := TL-WR941ND + DEVICE_VARIANT := v6 + TPLINK_HWID := 0x09410006 + SUPPORTED_DEVICES += tl-wr941nd-v6 +endef +TARGET_DEVICES += tplink_tl-wr941nd-v6 + +define Device/tplink_tl-wr941n-v7-cn + $(Device/tplink-4mlzma) + SOC := qca9558 + DEVICE_MODEL := TL-WR941N + DEVICE_VARIANT := v7 (CN) + TPLINK_HWID := 0x09410007 +endef +TARGET_DEVICES += tplink_tl-wr941n-v7-cn diff --git a/target/linux/ath79/image/tiny-ubnt.mk b/target/linux/ath79/image/tiny-ubnt.mk new file mode 100644 index 0000000000..77940ed875 --- /dev/null +++ b/target/linux/ath79/image/tiny-ubnt.mk @@ -0,0 +1,72 @@ +include ./common-ubnt.mk + +define Device/ubnt_airrouter + $(Device/ubnt-xm) + SOC := ar7241 + DEVICE_MODEL := AirRouter + SUPPORTED_DEVICES += airrouter + DEFAULT := n +endef +TARGET_DEVICES += ubnt_airrouter + +define Device/ubnt_nanobridge-m + $(Device/ubnt-xm) + SOC := ar7241 + DEVICE_MODEL := NanoBridge M + DEVICE_PACKAGES += rssileds + SUPPORTED_DEVICES += bullet-m + DEFAULT := n +endef +TARGET_DEVICES += ubnt_nanobridge-m + +define Device/ubnt_bullet-m-ar7240 + $(Device/ubnt-xm) + SOC := ar7240 + DEVICE_MODEL := Bullet M + DEVICE_VARIANT := XM (AR7240) + DEVICE_PACKAGES += rssileds + SUPPORTED_DEVICES += bullet-m + DEFAULT := n +endef +TARGET_DEVICES += ubnt_bullet-m-ar7240 + +define Device/ubnt_bullet-m-ar7241 + $(Device/ubnt-xm) + SOC := ar7241 + DEVICE_MODEL := Bullet M + DEVICE_VARIANT := XM (AR7241) + DEVICE_PACKAGES += rssileds + SUPPORTED_DEVICES += bullet-m ubnt,bullet-m + DEFAULT := n +endef +TARGET_DEVICES += ubnt_bullet-m-ar7241 + +define Device/ubnt_picostation-m + $(Device/ubnt-xm) + SOC := ar7241 + DEVICE_MODEL := Picostation M + DEVICE_PACKAGES += rssileds + SUPPORTED_DEVICES += bullet-m + DEFAULT := n +endef +TARGET_DEVICES += ubnt_picostation-m + +define Device/ubnt_nanostation-m + $(Device/ubnt-xm) + SOC := ar7241 + DEVICE_MODEL := Nanostation M + DEVICE_PACKAGES += rssileds + SUPPORTED_DEVICES += nanostation-m + DEFAULT := n +endef +TARGET_DEVICES += ubnt_nanostation-m + +define Device/ubnt_nanostation-loco-m + $(Device/ubnt-xm) + SOC := ar7241 + DEVICE_MODEL := Nanostation Loco M + DEVICE_PACKAGES += rssileds + SUPPORTED_DEVICES += bullet-m + DEFAULT := n +endef +TARGET_DEVICES += ubnt_nanostation-loco-m diff --git a/target/linux/ath79/image/tiny.mk b/target/linux/ath79/image/tiny.mk new file mode 100644 index 0000000000..6baa3afff7 --- /dev/null +++ b/target/linux/ath79/image/tiny.mk @@ -0,0 +1,81 @@ +include ./common-buffalo.mk +include ./common-senao.mk + +define Device/buffalo_whr-g301n + $(Device/buffalo_common) + SOC := ar7240 + DEVICE_MODEL := WHR-G301N + BUFFALO_PRODUCT := WHR-G301N + IMAGE_SIZE := 3712k + SUPPORTED_DEVICES += whr-g301n + DEFAULT := n +endef +TARGET_DEVICES += buffalo_whr-g301n + +define Device/dlink_dir-615-e4 + SOC := ar7240 + DEVICE_VENDOR := D-Link + DEVICE_MODEL := DIR-615 + DEVICE_VARIANT := E4 + IMAGE_SIZE := 3776k + FACTORY_IMAGE_SIZE := 3456k + IMAGES += factory.bin + IMAGE/default := append-kernel | append-rootfs | pad-rootfs + IMAGE/sysupgrade.bin := $$(IMAGE/default) | check-size | append-metadata + IMAGE/factory.bin := $$(IMAGE/default) | \ + check-size $$$$(FACTORY_IMAGE_SIZE) | pad-to $$$$(FACTORY_IMAGE_SIZE) | \ + append-string "AP99-AR7240-RT-091105-05" + SUPPORTED_DEVICES += dir-615-e4 + DEFAULT := n +endef +TARGET_DEVICES += dlink_dir-615-e4 + +define Device/engenius_eap350-v1 + $(Device/senao_loader_okli) + BLOCKSIZE := 4k + SOC := ar7242 + DEVICE_VENDOR := EnGenius + DEVICE_MODEL := EAP350 + DEVICE_VARIANT := v1 + IMAGE_SIZE := 4928k + LOADER_FLASH_OFFS := 0x1a0000 + SENAO_IMGNAME := senao-eap350 +endef +TARGET_DEVICES += engenius_eap350-v1 + +define Device/engenius_ecb350-v1 + $(Device/senao_loader_okli) + BLOCKSIZE := 4k + SOC := ar7242 + DEVICE_VENDOR := EnGenius + DEVICE_MODEL := ECB350 + DEVICE_VARIANT := v1 + IMAGE_SIZE := 4928k + LOADER_FLASH_OFFS := 0x1a0000 + SENAO_IMGNAME := senao-ecb350 +endef +TARGET_DEVICES += engenius_ecb350-v1 + +define Device/engenius_enh202-v1 + $(Device/senao_loader_okli) + SOC := ar7240 + DEVICE_VENDOR := EnGenius + DEVICE_MODEL := ENH202 + DEVICE_VARIANT := v1 + DEVICE_PACKAGES := rssileds + IMAGE_SIZE := 4928k + LOADER_FLASH_OFFS := 0x1a0000 + SENAO_IMGNAME := senao-enh202 +endef +TARGET_DEVICES += engenius_enh202-v1 + +define Device/pqi_air-pen + SOC := ar9330 + DEVICE_VENDOR := PQI + DEVICE_MODEL := Air-Pen + DEVICE_PACKAGES := kmod-usb-chipidea2 + IMAGE_SIZE := 7680k + SUPPORTED_DEVICES += pqi-air-pen + DEFAULT := n +endef +TARGET_DEVICES += pqi_air-pen diff --git a/target/linux/ath79/nand/base-files/etc/board.d/01_leds b/target/linux/ath79/nand/base-files/etc/board.d/01_leds index e493298457..ce22d0e3ce 100644 --- a/target/linux/ath79/nand/base-files/etc/board.d/01_leds +++ b/target/linux/ath79/nand/base-files/etc/board.d/01_leds @@ -17,6 +17,15 @@ glinet,gl-ar300m-nor) glinet,gl-xe300) ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth1" ucidef_set_led_switch "lan" "LAN" "green:lan" "switch0" "0x10" + ucidef_set_led_netdev "3gnet" "LTE" "green:lte" "wwan0" + ;; +netgear,pgzng1) + ucidef_set_led_wlan "wlan" "WLAN" "green:wlan" "phy0tpt" + ucidef_set_led_switch "wan" "WAN" "green:wan-1" "switch0" "0x02" "0xf" "link tx rx" + ucidef_set_led_switch "wan-green" "wan link" "green:wan-0" "switch0" "0x02" "0xf" "link" + ucidef_set_led_switch "wan-amber" "wan act" "amber:wan" "switch0" "0x02" "0xf" "tx rx" + ucidef_set_led_netdev "lan-green" "lan link" "green:lan" "eth1" "link" + ucidef_set_led_netdev "lan-amber" "lan act" "amber:lan" "eth1" "tx rx" ;; netgear,r6100) ucidef_set_led_netdev "wan-green" "WAN (green)" "green:wan" "eth1" diff --git a/target/linux/ath79/nand/base-files/etc/board.d/02_network b/target/linux/ath79/nand/base-files/etc/board.d/02_network index 3c5627e2a4..60f085d378 100644 --- a/target/linux/ath79/nand/base-files/etc/board.d/02_network +++ b/target/linux/ath79/nand/base-files/etc/board.d/02_network @@ -8,7 +8,8 @@ ath79_setup_interfaces() case "$board" in aerohive,hiveap-121|\ - glinet,gl-e750) + glinet,gl-e750|\ + meraki,mr18) ucidef_set_interface_lan "eth0" ;; domywifi,dw33d) @@ -30,10 +31,18 @@ ath79_setup_interfaces() ucidef_add_switch "switch0" \ "0@eth0" "4:lan" ;; + glinet,gl-x1200-nor|\ + glinet,gl-x1200-nor-nand) + ucidef_add_switch "switch0" \ + "0@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "5:wan" + ;; linksys,ea4500-v3) ucidef_add_switch "switch0" \ "6@eth1" "1:lan" "2:lan" "3:lan" "4:lan" "5:wan" "0@eth0" ;; + netgear,pgzng1) + ucidef_set_interfaces_lan_wan "eth1" "eth0" + ;; netgear,r6100) ucidef_set_interface_wan "eth1" ucidef_add_switch "switch0" \ @@ -58,6 +67,10 @@ ath79_setup_interfaces() ucidef_add_switch "switch0" \ "0@eth0" "5:lan" ;; + zte,mf282) + ucidef_set_interface_lan "eth0" + ucidef_set_interface "wan" device "/dev/cdc-wdm0" protocol "qmi" + ;; zte,mf286|\ zte,mf286a|\ zte,mf286r) @@ -85,6 +98,14 @@ ath79_setup_macs() wan_mac=$(mtd_get_mac_binary art 0x0) label_mac=$wan_mac ;; + glinet,gl-x1200-nor|\ + glinet,gl-x1200-nor-nand) + wan_mac=$(mtd_get_mac_binary art 0x0) + lan_mac=$(macaddr_add "$wan_mac" 1) + ;; + meraki,mr18) + lan_mac=$(mtd_get_mac_binary_ubi board-config 102) + ;; netgear,wndr3700-v4|\ netgear,wndr4300|\ netgear,wndr4300sw|\ diff --git a/target/linux/ath79/nand/base-files/etc/board.d/05_compat-version b/target/linux/ath79/nand/base-files/etc/board.d/05_compat-version new file mode 100644 index 0000000000..238927aa7b --- /dev/null +++ b/target/linux/ath79/nand/base-files/etc/board.d/05_compat-version @@ -0,0 +1,15 @@ +. /lib/functions.sh +. /lib/functions/uci-defaults.sh + +board_config_update + +case "$(board_name)" in + netgear,wndr4300-v2|\ + netgear,wndr4500-v3) + ucidef_set_compat_version "1.1" + ;; +esac + +board_config_flush + +exit 0 diff --git a/target/linux/ath79/nand/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/ath79/nand/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom index cac955905a..c4ccb04f5b 100644 --- a/target/linux/ath79/nand/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom +++ b/target/linux/ath79/nand/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom @@ -12,13 +12,15 @@ case "$FIRMWARE" in 8dev,rambutan) caldata_extract "caldata" 0x1000 0x800 ;; - netgear,wndr3700-v4|\ - netgear,wndr4300|\ - netgear,wndr4300sw|\ - netgear,wndr4300tn|\ - netgear,wndr4300-v2|\ - netgear,wndr4500-v3) - caldata_extract "caldata" 0x1000 0x440 + meraki,mr18) + . /lib/upgrade/nand.sh + + if [ -n "$(nand_find_volume ubi0 caldata)" ]; then + caldata_extract_ubi "caldata" 0x1000 0x440 + else + caldata_extract "odm-caldata" 0x1000 0x440 + fi + ath9k_patch_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) 1) ;; *) caldata_die "board $board is not supported yet" @@ -27,13 +29,32 @@ case "$FIRMWARE" in ;; "ath9k-eeprom-pci-0000:00:00.0.bin") case $board in - netgear,wndr3700-v4|\ - netgear,wndr4300|\ - netgear,wndr4300sw|\ - netgear,wndr4300tn|\ - netgear,wndr4300-v2|\ - netgear,wndr4500-v3) - caldata_extract "caldata" 0x5000 0x440 + meraki,mr18) + . /lib/upgrade/nand.sh + + if [ -n "$(nand_find_volume ubi0 caldata)" ]; then + caldata_extract_ubi "caldata" 0x5000 0x440 + else + caldata_extract "odm-caldata" 0x5000 0x440 + fi + ath9k_patch_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) 2) + ;; + *) + caldata_die "board $board is not supported yet" + ;; + esac + ;; +"ath9k-eeprom-pci-0000:01:00.0.bin") + case $board in + meraki,mr18) + . /lib/upgrade/nand.sh + + if [ -n "$(nand_find_volume ubi0 caldata)" ]; then + caldata_extract_ubi "caldata" 0x9000 0x440 + else + caldata_extract "odm-caldata" 0x9000 0x440 + fi + ath9k_patch_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) 3) ;; *) caldata_die "board $board is not supported yet" diff --git a/target/linux/ath79/nand/base-files/etc/init.d/boot-leds b/target/linux/ath79/nand/base-files/etc/init.d/boot-leds new file mode 100644 index 0000000000..f2a1cc13b8 --- /dev/null +++ b/target/linux/ath79/nand/base-files/etc/init.d/boot-leds @@ -0,0 +1,17 @@ +#!/bin/sh /etc/rc.common +# SPDX-License-Identifier: GPL-2.0-only + +START=11 + +# To support LEDs on boards that have drivers loaded after rootfs, let's +# re-run diag.sh AFTER kmodloader has finished, but before boot is complete. +# This is useful for userspace LED drivers, LEDs that rely on i2c, etc. + +boot() { + case $(board_name) in + netgear,pgzng1) + . /etc/diag.sh + set_led_state preinit_regular + ;; + esac +} diff --git a/target/linux/ath79/nand/base-files/lib/upgrade/platform.sh b/target/linux/ath79/nand/base-files/lib/upgrade/platform.sh index ea77345b06..5a4f76ba51 100644 --- a/target/linux/ath79/nand/base-files/lib/upgrade/platform.sh +++ b/target/linux/ath79/nand/base-files/lib/upgrade/platform.sh @@ -19,7 +19,9 @@ platform_do_upgrade() { glinet_nand_nor_do_upgrade "$1" ;; glinet,gl-ar750s-nor|\ - glinet,gl-ar750s-nor-nand) + glinet,gl-ar750s-nor-nand|\ + glinet,gl-x1200-nor|\ + glinet,gl-x1200-nor-nand) nand_nor_do_upgrade "$1" ;; *) diff --git a/target/linux/ath79/nand/config-default b/target/linux/ath79/nand/config-default index c04a3d1990..3072feea2f 100644 --- a/target/linux/ath79/nand/config-default +++ b/target/linux/ath79/nand/config-default @@ -8,6 +8,7 @@ CONFIG_LZO_DECOMPRESS=y CONFIG_MTD_NAND=y CONFIG_MTD_NAND_AR934X=y CONFIG_MTD_NAND_CORE=y +CONFIG_MTD_NAND_ECC_SW_BCH=y CONFIG_MTD_RAW_NAND=y CONFIG_MTD_SPI_NAND=y CONFIG_MTD_UBI=y diff --git a/target/linux/ath79/nand/target.mk b/target/linux/ath79/nand/target.mk index 7ea9b57f45..e0900abfe4 100644 --- a/target/linux/ath79/nand/target.mk +++ b/target/linux/ath79/nand/target.mk @@ -2,7 +2,7 @@ BOARDNAME := Generic devices with NAND flash FEATURES += nand -DEFAULT_PACKAGES += wpad-basic-wolfssl +DEFAULT_PACKAGES += wpad-basic-mbedtls define Target/Description Firmware for boards using Qualcomm Atheros, MIPS-based SoCs diff --git a/target/linux/ath79/patches-5.10/0003-leds-add-reset-controller-based-driver.patch b/target/linux/ath79/patches-5.10/0003-leds-add-reset-controller-based-driver.patch deleted file mode 100644 index c1fa96ab44..0000000000 --- a/target/linux/ath79/patches-5.10/0003-leds-add-reset-controller-based-driver.patch +++ /dev/null @@ -1,186 +0,0 @@ -From ecbd9c87f073f097d9fe56390353e64e963e866a Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Tue, 6 Mar 2018 10:03:03 +0100 -Subject: [PATCH 03/27] leds: add reset-controller based driver - -Signed-off-by: John Crispin ---- - drivers/leds/Kconfig | 11 ++++ - drivers/leds/Makefile | 1 + - drivers/leds/leds-reset.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 149 insertions(+) - create mode 100644 drivers/leds/leds-reset.c - ---- a/drivers/leds/Kconfig -+++ b/drivers/leds/Kconfig -@@ -941,6 +941,17 @@ config LEDS_UBNT_LEDBAR - To compile this driver as a module, choose M here: the module - will be called leds-ubnt-ledbar. - -+config LEDS_RESET -+ tristate "LED support for reset-controller API" -+ depends on LEDS_CLASS -+ depends on RESET_CONTROLLER -+ help -+ This option enables support for LEDs connected to pins driven by reset -+ controllers. Yes, DNI actual built HW like that. -+ -+ To compile this driver as a module, choose M here: the module -+ will be called leds-reset. -+ - comment "LED Triggers" - source "drivers/leds/trigger/Kconfig" - ---- /dev/null -+++ b/drivers/leds/leds-reset.c -@@ -0,0 +1,140 @@ -+/* -+ * Copyright (C) 2018 John Crispin -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+struct reset_led_data { -+ struct led_classdev cdev; -+ struct reset_control *rst; -+}; -+ -+static inline struct reset_led_data * -+ cdev_to_reset_led_data(struct led_classdev *led_cdev) -+{ -+ return container_of(led_cdev, struct reset_led_data, cdev); -+} -+ -+static void reset_led_set(struct led_classdev *led_cdev, -+ enum led_brightness value) -+{ -+ struct reset_led_data *led_dat = cdev_to_reset_led_data(led_cdev); -+ -+ if (value == LED_OFF) -+ reset_control_assert(led_dat->rst); -+ else -+ reset_control_deassert(led_dat->rst); -+} -+ -+struct reset_leds_priv { -+ int num_leds; -+ struct reset_led_data leds[]; -+}; -+ -+static inline int sizeof_reset_leds_priv(int num_leds) -+{ -+ return sizeof(struct reset_leds_priv) + -+ (sizeof(struct reset_led_data) * num_leds); -+} -+ -+static struct reset_leds_priv *reset_leds_create(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct fwnode_handle *child; -+ struct reset_leds_priv *priv; -+ int count, ret; -+ -+ count = device_get_child_node_count(dev); -+ if (!count) -+ return ERR_PTR(-ENODEV); -+ -+ priv = devm_kzalloc(dev, sizeof_reset_leds_priv(count), GFP_KERNEL); -+ if (!priv) -+ return ERR_PTR(-ENOMEM); -+ -+ device_for_each_child_node(dev, child) { -+ struct reset_led_data *led = &priv->leds[priv->num_leds]; -+ struct device_node *np = to_of_node(child); -+ -+ ret = fwnode_property_read_string(child, "label", &led->cdev.name); -+ if (!led->cdev.name) { -+ fwnode_handle_put(child); -+ return ERR_PTR(-EINVAL); -+ } -+ led->rst = __of_reset_control_get(np, NULL, 0, 0, 0, true); -+ if (IS_ERR(led->rst)) -+ return ERR_PTR(-EINVAL); -+ -+ fwnode_property_read_string(child, "linux,default-trigger", -+ &led->cdev.default_trigger); -+ -+ led->cdev.brightness_set = reset_led_set; -+ ret = devm_led_classdev_register(&pdev->dev, &led->cdev); -+ if (ret < 0) -+ return ERR_PTR(ret); -+ led->cdev.dev->of_node = np; -+ priv->num_leds++; -+ } -+ -+ return priv; -+} -+ -+static const struct of_device_id of_reset_leds_match[] = { -+ { .compatible = "reset-leds", }, -+ {}, -+}; -+ -+MODULE_DEVICE_TABLE(of, of_reset_leds_match); -+ -+static int reset_led_probe(struct platform_device *pdev) -+{ -+ struct reset_leds_priv *priv; -+ -+ priv = reset_leds_create(pdev); -+ if (IS_ERR(priv)) -+ return PTR_ERR(priv); -+ -+ platform_set_drvdata(pdev, priv); -+ -+ return 0; -+} -+ -+static void reset_led_shutdown(struct platform_device *pdev) -+{ -+ struct reset_leds_priv *priv = platform_get_drvdata(pdev); -+ int i; -+ -+ for (i = 0; i < priv->num_leds; i++) { -+ struct reset_led_data *led = &priv->leds[i]; -+ -+ if (!(led->cdev.flags & LED_RETAIN_AT_SHUTDOWN)) -+ reset_led_set(&led->cdev, LED_OFF); -+ } -+} -+ -+static struct platform_driver reset_led_driver = { -+ .probe = reset_led_probe, -+ .shutdown = reset_led_shutdown, -+ .driver = { -+ .name = "leds-reset", -+ .of_match_table = of_reset_leds_match, -+ }, -+}; -+ -+module_platform_driver(reset_led_driver); -+ -+MODULE_AUTHOR("John Crispin "); -+MODULE_DESCRIPTION("reset controller LED driver"); -+MODULE_LICENSE("GPL"); -+MODULE_ALIAS("platform:leds-reset"); ---- a/drivers/leds/Makefile -+++ b/drivers/leds/Makefile -@@ -80,6 +80,7 @@ obj-$(CONFIG_LEDS_PM8058) += leds-pm805 - obj-$(CONFIG_LEDS_POWERNV) += leds-powernv.o - obj-$(CONFIG_LEDS_PWM) += leds-pwm.o - obj-$(CONFIG_LEDS_REGULATOR) += leds-regulator.o -+obj-$(CONFIG_LEDS_RESET) += leds-reset.o - obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o - obj-$(CONFIG_LEDS_SC27XX_BLTC) += leds-sc27xx-bltc.o - obj-$(CONFIG_LEDS_SGM3140) += leds-sgm3140.o diff --git a/target/linux/ath79/patches-5.10/0004-phy-add-ath79-usb-phys.patch b/target/linux/ath79/patches-5.10/0004-phy-add-ath79-usb-phys.patch deleted file mode 100644 index 56c3d61887..0000000000 --- a/target/linux/ath79/patches-5.10/0004-phy-add-ath79-usb-phys.patch +++ /dev/null @@ -1,333 +0,0 @@ -From 08c9d6ceef01893678a5d2e8a15517c745417f21 Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Tue, 6 Mar 2018 10:04:05 +0100 -Subject: [PATCH 04/27] phy: add ath79 usb phys - -Signed-off-by: John Crispin ---- - drivers/phy/Kconfig | 16 ++++++ - drivers/phy/Makefile | 2 + - drivers/phy/phy-ar7100-usb.c | 124 +++++++++++++++++++++++++++++++++++++++++++ - drivers/phy/phy-ar7200-usb.c | 108 +++++++++++++++++++++++++++++++++++++ - 4 files changed, 250 insertions(+) - create mode 100644 drivers/phy/phy-ar7100-usb.c - create mode 100644 drivers/phy/phy-ar7200-usb.c - ---- a/drivers/phy/Kconfig -+++ b/drivers/phy/Kconfig -@@ -24,6 +24,22 @@ config GENERIC_PHY_MIPI_DPHY - Provides a number of helpers a core functions for MIPI D-PHY - drivers to us. - -+config PHY_AR7100_USB -+ tristate "Atheros AR7100 USB PHY driver" -+ depends on ATH79 || COMPILE_TEST -+ default y if USB_EHCI_HCD_PLATFORM -+ select GENERIC_PHY -+ help -+ Enable this to support the USB PHY on Atheros AR7100 SoCs. -+ -+config PHY_AR7200_USB -+ tristate "Atheros AR7200 USB PHY driver" -+ depends on ATH79 || COMPILE_TEST -+ default y if USB_EHCI_HCD_PLATFORM -+ select GENERIC_PHY -+ help -+ Enable this to support the USB PHY on Atheros AR7200 SoCs. -+ - config PHY_LPC18XX_USB_OTG - tristate "NXP LPC18xx/43xx SoC USB OTG PHY driver" - depends on OF && (ARCH_LPC18XX || COMPILE_TEST) ---- a/drivers/phy/Makefile -+++ b/drivers/phy/Makefile -@@ -4,6 +4,8 @@ - # - - obj-$(CONFIG_GENERIC_PHY) += phy-core.o -+obj-$(CONFIG_PHY_AR7100_USB) += phy-ar7100-usb.o -+obj-$(CONFIG_PHY_AR7200_USB) += phy-ar7200-usb.o - obj-$(CONFIG_GENERIC_PHY_MIPI_DPHY) += phy-core-mipi-dphy.o - obj-$(CONFIG_PHY_LPC18XX_USB_OTG) += phy-lpc18xx-usb-otg.o - obj-$(CONFIG_PHY_XGENE) += phy-xgene.o ---- /dev/null -+++ b/drivers/phy/phy-ar7100-usb.c -@@ -0,0 +1,140 @@ -+/* -+ * Copyright (C) 2018 John Crispin -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+struct ar7100_usb_phy { -+ struct reset_control *rst_phy; -+ struct reset_control *rst_host; -+ struct reset_control *rst_ohci_dll; -+ void __iomem *io_base; -+ struct phy *phy; -+ int gpio; -+}; -+ -+static int ar7100_usb_phy_power_off(struct phy *phy) -+{ -+ struct ar7100_usb_phy *priv = phy_get_drvdata(phy); -+ int err = 0; -+ -+ err |= reset_control_assert(priv->rst_host); -+ err |= reset_control_assert(priv->rst_phy); -+ err |= reset_control_assert(priv->rst_ohci_dll); -+ -+ return err; -+} -+ -+static int ar7100_usb_phy_power_on(struct phy *phy) -+{ -+ struct ar7100_usb_phy *priv = phy_get_drvdata(phy); -+ int err = 0; -+ -+ err |= ar7100_usb_phy_power_off(phy); -+ mdelay(100); -+ err |= reset_control_deassert(priv->rst_ohci_dll); -+ err |= reset_control_deassert(priv->rst_phy); -+ err |= reset_control_deassert(priv->rst_host); -+ mdelay(500); -+ iowrite32(0xf0000, priv->io_base + AR71XX_USB_CTRL_REG_CONFIG); -+ iowrite32(0x20c00, priv->io_base + AR71XX_USB_CTRL_REG_FLADJ); -+ -+ return err; -+} -+ -+static const struct phy_ops ar7100_usb_phy_ops = { -+ .power_on = ar7100_usb_phy_power_on, -+ .power_off = ar7100_usb_phy_power_off, -+ .owner = THIS_MODULE, -+}; -+ -+static int ar7100_usb_phy_probe(struct platform_device *pdev) -+{ -+ struct phy_provider *phy_provider; -+ struct resource *res; -+ struct ar7100_usb_phy *priv; -+ -+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); -+ if (!priv) -+ return -ENOMEM; -+ -+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ priv->io_base = devm_ioremap_resource(&pdev->dev, res); -+ if (IS_ERR(priv->io_base)) -+ return PTR_ERR(priv->io_base); -+ -+ priv->rst_phy = devm_reset_control_get(&pdev->dev, "usb-phy"); -+ if (IS_ERR(priv->rst_phy)) { -+ dev_err(&pdev->dev, "phy reset is missing\n"); -+ return PTR_ERR(priv->rst_phy); -+ } -+ -+ priv->rst_host = devm_reset_control_get(&pdev->dev, "usb-host"); -+ if (IS_ERR(priv->rst_host)) { -+ dev_err(&pdev->dev, "host reset is missing\n"); -+ return PTR_ERR(priv->rst_host); -+ } -+ -+ priv->rst_ohci_dll = devm_reset_control_get(&pdev->dev, "usb-ohci-dll"); -+ if (IS_ERR(priv->rst_ohci_dll)) { -+ dev_err(&pdev->dev, "ohci-dll reset is missing\n"); -+ return PTR_ERR(priv->rst_host); -+ } -+ -+ priv->phy = devm_phy_create(&pdev->dev, NULL, &ar7100_usb_phy_ops); -+ if (IS_ERR(priv->phy)) { -+ dev_err(&pdev->dev, "failed to create PHY\n"); -+ return PTR_ERR(priv->phy); -+ } -+ -+ priv->gpio = of_get_gpio(pdev->dev.of_node, 0); -+ if (priv->gpio >= 0) { -+ int ret = devm_gpio_request(&pdev->dev, priv->gpio, dev_name(&pdev->dev)); -+ -+ if (ret) { -+ dev_err(&pdev->dev, "failed to request gpio\n"); -+ return ret; -+ } -+ gpio_export_with_name(priv->gpio, 0, dev_name(&pdev->dev)); -+ gpio_set_value(priv->gpio, 1); -+ } -+ -+ phy_set_drvdata(priv->phy, priv); -+ -+ phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); -+ -+ -+ return PTR_ERR_OR_ZERO(phy_provider); -+} -+ -+static const struct of_device_id ar7100_usb_phy_of_match[] = { -+ { .compatible = "qca,ar7100-usb-phy" }, -+ {} -+}; -+MODULE_DEVICE_TABLE(of, ar7100_usb_phy_of_match); -+ -+static struct platform_driver ar7100_usb_phy_driver = { -+ .probe = ar7100_usb_phy_probe, -+ .driver = { -+ .of_match_table = ar7100_usb_phy_of_match, -+ .name = "ar7100-usb-phy", -+ } -+}; -+module_platform_driver(ar7100_usb_phy_driver); -+ -+MODULE_DESCRIPTION("ATH79 USB PHY driver"); -+MODULE_AUTHOR("Alban Bedel "); -+MODULE_LICENSE("GPL"); ---- /dev/null -+++ b/drivers/phy/phy-ar7200-usb.c -@@ -0,0 +1,136 @@ -+/* -+ * Copyright (C) 2015 Alban Bedel -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+struct ar7200_usb_phy { -+ struct reset_control *rst_phy; -+ struct reset_control *rst_phy_analog; -+ struct reset_control *suspend_override; -+ struct phy *phy; -+ int gpio; -+}; -+ -+static int ar7200_usb_phy_power_on(struct phy *phy) -+{ -+ struct ar7200_usb_phy *priv = phy_get_drvdata(phy); -+ int err = 0; -+ -+ if (priv->suspend_override) -+ err = reset_control_assert(priv->suspend_override); -+ if (priv->rst_phy) -+ err |= reset_control_deassert(priv->rst_phy); -+ if (priv->rst_phy_analog) -+ err |= reset_control_deassert(priv->rst_phy_analog); -+ -+ return err; -+} -+ -+static int ar7200_usb_phy_power_off(struct phy *phy) -+{ -+ struct ar7200_usb_phy *priv = phy_get_drvdata(phy); -+ int err = 0; -+ -+ if (priv->suspend_override) -+ err = reset_control_deassert(priv->suspend_override); -+ if (priv->rst_phy) -+ err |= reset_control_assert(priv->rst_phy); -+ if (priv->rst_phy_analog) -+ err |= reset_control_assert(priv->rst_phy_analog); -+ -+ return err; -+} -+ -+static const struct phy_ops ar7200_usb_phy_ops = { -+ .power_on = ar7200_usb_phy_power_on, -+ .power_off = ar7200_usb_phy_power_off, -+ .owner = THIS_MODULE, -+}; -+ -+static int ar7200_usb_phy_probe(struct platform_device *pdev) -+{ -+ struct phy_provider *phy_provider; -+ struct ar7200_usb_phy *priv; -+ -+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); -+ if (!priv) -+ return -ENOMEM; -+ -+ priv->rst_phy = devm_reset_control_get(&pdev->dev, "usb-phy"); -+ if (IS_ERR(priv->rst_phy)) { -+ if (PTR_ERR(priv->rst_phy) != -EPROBE_DEFER) -+ dev_err(&pdev->dev, "phy reset is missing\n"); -+ return PTR_ERR(priv->rst_phy); -+ } -+ -+ priv->rst_phy_analog = devm_reset_control_get_optional( -+ &pdev->dev, "usb-phy-analog"); -+ if (IS_ERR(priv->rst_phy_analog)) { -+ if (PTR_ERR(priv->rst_phy_analog) == -ENOENT) -+ priv->rst_phy_analog = NULL; -+ else -+ return PTR_ERR(priv->rst_phy_analog); -+ } -+ -+ priv->suspend_override = devm_reset_control_get_optional( -+ &pdev->dev, "usb-suspend-override"); -+ if (IS_ERR(priv->suspend_override)) { -+ if (PTR_ERR(priv->suspend_override) == -ENOENT) -+ priv->suspend_override = NULL; -+ else -+ return PTR_ERR(priv->suspend_override); -+ } -+ -+ priv->phy = devm_phy_create(&pdev->dev, NULL, &ar7200_usb_phy_ops); -+ if (IS_ERR(priv->phy)) { -+ dev_err(&pdev->dev, "failed to create PHY\n"); -+ return PTR_ERR(priv->phy); -+ } -+ -+ priv->gpio = of_get_gpio(pdev->dev.of_node, 0); -+ if (priv->gpio >= 0) { -+ int ret = devm_gpio_request(&pdev->dev, priv->gpio, dev_name(&pdev->dev)); -+ -+ if (ret) { -+ dev_err(&pdev->dev, "failed to request gpio\n"); -+ return ret; -+ } -+ gpio_export_with_name(priv->gpio, 0, dev_name(&pdev->dev)); -+ gpio_set_value(priv->gpio, 1); -+ } -+ -+ phy_set_drvdata(priv->phy, priv); -+ -+ phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); -+ -+ return PTR_ERR_OR_ZERO(phy_provider); -+} -+ -+static const struct of_device_id ar7200_usb_phy_of_match[] = { -+ { .compatible = "qca,ar7200-usb-phy" }, -+ {} -+}; -+MODULE_DEVICE_TABLE(of, ar7200_usb_phy_of_match); -+ -+static struct platform_driver ar7200_usb_phy_driver = { -+ .probe = ar7200_usb_phy_probe, -+ .driver = { -+ .of_match_table = ar7200_usb_phy_of_match, -+ .name = "ar7200-usb-phy", -+ } -+}; -+module_platform_driver(ar7200_usb_phy_driver); -+ -+MODULE_DESCRIPTION("ATH79 USB PHY driver"); -+MODULE_AUTHOR("Alban Bedel "); -+MODULE_LICENSE("GPL"); diff --git a/target/linux/ath79/patches-5.10/0018-MIPS-pci-ar71xx-convert-to-OF.patch b/target/linux/ath79/patches-5.10/0018-MIPS-pci-ar71xx-convert-to-OF.patch deleted file mode 100644 index e600a4f0d9..0000000000 --- a/target/linux/ath79/patches-5.10/0018-MIPS-pci-ar71xx-convert-to-OF.patch +++ /dev/null @@ -1,202 +0,0 @@ -From 1855ab6b1d27f5b38a648baf57ff6a534afec26d Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Sat, 23 Jun 2018 15:07:23 +0200 -Subject: [PATCH 18/33] MIPS: pci-ar71xx: convert to OF - -With the ath79 target getting converted to pure OF, we can drop all the -platform data code and add the missing OF bits to the driver. We also add -a irq domain for the PCI/e controllers cascade, thus making it usable from -dts files. - -Signed-off-by: John Crispin ---- - arch/mips/pci/pci-ar71xx.c | 82 +++++++++++++++++++++++----------------------- - 1 file changed, 41 insertions(+), 41 deletions(-) - ---- a/arch/mips/pci/pci-ar71xx.c -+++ b/arch/mips/pci/pci-ar71xx.c -@@ -15,8 +15,11 @@ - #include - #include - #include -+#include - #include - #include -+#include -+#include - - #include - #include -@@ -46,12 +49,13 @@ - #define AR71XX_PCI_IRQ_COUNT 5 - - struct ar71xx_pci_controller { -+ struct device_node *np; - void __iomem *cfg_base; - int irq; -- int irq_base; - struct pci_controller pci_ctrl; - struct resource io_res; - struct resource mem_res; -+ struct irq_domain *domain; - }; - - /* Byte lane enable bits */ -@@ -225,29 +229,30 @@ static struct pci_ops ar71xx_pci_ops = { - - static void ar71xx_pci_irq_handler(struct irq_desc *desc) - { -- struct ar71xx_pci_controller *apc; - void __iomem *base = ath79_reset_base; -+ struct irq_chip *chip = irq_desc_get_chip(desc); -+ struct ar71xx_pci_controller *apc = irq_desc_get_handler_data(desc); - u32 pending; - -- apc = irq_desc_get_handler_data(desc); -- -+ chained_irq_enter(chip, desc); - pending = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_STATUS) & - __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); - - if (pending & AR71XX_PCI_INT_DEV0) -- generic_handle_irq(apc->irq_base + 0); -+ generic_handle_irq(irq_linear_revmap(apc->domain, 1)); - - else if (pending & AR71XX_PCI_INT_DEV1) -- generic_handle_irq(apc->irq_base + 1); -+ generic_handle_irq(irq_linear_revmap(apc->domain, 2)); - - else if (pending & AR71XX_PCI_INT_DEV2) -- generic_handle_irq(apc->irq_base + 2); -+ generic_handle_irq(irq_linear_revmap(apc->domain, 3)); - - else if (pending & AR71XX_PCI_INT_CORE) -- generic_handle_irq(apc->irq_base + 4); -+ generic_handle_irq(irq_linear_revmap(apc->domain, 4)); - - else - spurious_interrupt(); -+ chained_irq_exit(chip, desc); - } - - static void ar71xx_pci_irq_unmask(struct irq_data *d) -@@ -258,7 +263,7 @@ static void ar71xx_pci_irq_unmask(struct - u32 t; - - apc = irq_data_get_irq_chip_data(d); -- irq = d->irq - apc->irq_base; -+ irq = irq_linear_revmap(apc->domain, d->irq); - - t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); - __raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); -@@ -275,7 +280,7 @@ static void ar71xx_pci_irq_mask(struct i - u32 t; - - apc = irq_data_get_irq_chip_data(d); -- irq = d->irq - apc->irq_base; -+ irq = irq_linear_revmap(apc->domain, d->irq); - - t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); - __raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); -@@ -291,24 +296,31 @@ static struct irq_chip ar71xx_pci_irq_ch - .irq_mask_ack = ar71xx_pci_irq_mask, - }; - -+static int ar71xx_pci_irq_map(struct irq_domain *d, -+ unsigned int irq, irq_hw_number_t hw) -+{ -+ struct ar71xx_pci_controller *apc = d->host_data; -+ -+ irq_set_chip_and_handler(irq, &ar71xx_pci_irq_chip, handle_level_irq); -+ irq_set_chip_data(irq, apc); -+ -+ return 0; -+} -+ -+static const struct irq_domain_ops ar71xx_pci_domain_ops = { -+ .xlate = irq_domain_xlate_onecell, -+ .map = ar71xx_pci_irq_map, -+}; -+ - static void ar71xx_pci_irq_init(struct ar71xx_pci_controller *apc) - { - void __iomem *base = ath79_reset_base; -- int i; - - __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_ENABLE); - __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_STATUS); - -- BUILD_BUG_ON(ATH79_PCI_IRQ_COUNT < AR71XX_PCI_IRQ_COUNT); -- -- apc->irq_base = ATH79_PCI_IRQ_BASE; -- for (i = apc->irq_base; -- i < apc->irq_base + AR71XX_PCI_IRQ_COUNT; i++) { -- irq_set_chip_and_handler(i, &ar71xx_pci_irq_chip, -- handle_level_irq); -- irq_set_chip_data(i, apc); -- } -- -+ apc->domain = irq_domain_add_linear(apc->np, AR71XX_PCI_IRQ_COUNT, -+ &ar71xx_pci_domain_ops, apc); - irq_set_chained_handler_and_data(apc->irq, ar71xx_pci_irq_handler, - apc); - } -@@ -325,6 +337,11 @@ static void ar71xx_pci_reset(void) - mdelay(100); - } - -+static const struct of_device_id ar71xx_pci_ids[] = { -+ { .compatible = "qca,ar7100-pci" }, -+ {}, -+}; -+ - static int ar71xx_pci_probe(struct platform_device *pdev) - { - struct ar71xx_pci_controller *apc; -@@ -345,26 +362,6 @@ static int ar71xx_pci_probe(struct platf - if (apc->irq < 0) - return -EINVAL; - -- res = platform_get_resource_byname(pdev, IORESOURCE_IO, "io_base"); -- if (!res) -- return -EINVAL; -- -- apc->io_res.parent = res; -- apc->io_res.name = "PCI IO space"; -- apc->io_res.start = res->start; -- apc->io_res.end = res->end; -- apc->io_res.flags = IORESOURCE_IO; -- -- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mem_base"); -- if (!res) -- return -EINVAL; -- -- apc->mem_res.parent = res; -- apc->mem_res.name = "PCI memory space"; -- apc->mem_res.start = res->start; -- apc->mem_res.end = res->end; -- apc->mem_res.flags = IORESOURCE_MEM; -- - ar71xx_pci_reset(); - - /* setup COMMAND register */ -@@ -377,9 +374,11 @@ static int ar71xx_pci_probe(struct platf - - ar71xx_pci_irq_init(apc); - -+ apc->np = pdev->dev.of_node; - apc->pci_ctrl.pci_ops = &ar71xx_pci_ops; - apc->pci_ctrl.mem_resource = &apc->mem_res; - apc->pci_ctrl.io_resource = &apc->io_res; -+ pci_load_of_ranges(&apc->pci_ctrl, pdev->dev.of_node); - - register_pci_controller(&apc->pci_ctrl); - -@@ -390,6 +389,7 @@ static struct platform_driver ar71xx_pci - .probe = ar71xx_pci_probe, - .driver = { - .name = "ar71xx-pci", -+ .of_match_table = of_match_ptr(ar71xx_pci_ids), - }, - }; - diff --git a/target/linux/ath79/patches-5.10/0020-MIPS-pci-ar724x-convert-to-OF.patch b/target/linux/ath79/patches-5.10/0020-MIPS-pci-ar724x-convert-to-OF.patch deleted file mode 100644 index 2772c53392..0000000000 --- a/target/linux/ath79/patches-5.10/0020-MIPS-pci-ar724x-convert-to-OF.patch +++ /dev/null @@ -1,205 +0,0 @@ -From a522ee0199d5d3ea114ca2e211f6ac398d3e8e0b Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Sat, 23 Jun 2018 15:07:37 +0200 -Subject: [PATCH 20/33] MIPS: pci-ar724x: convert to OF - -With the ath79 target getting converted to pure OF, we can drop all the -platform data code and add the missing OF bits to the driver. We also add -a irq domain for the PCI/e controllers cascade, thus making it usable from -dts files. - -Signed-off-by: John Crispin ---- - arch/mips/pci/pci-ar724x.c | 88 ++++++++++++++++++++++------------------------ - 1 file changed, 42 insertions(+), 46 deletions(-) - ---- a/arch/mips/pci/pci-ar724x.c -+++ b/arch/mips/pci/pci-ar724x.c -@@ -11,8 +11,11 @@ - #include - #include - #include -+#include - #include - #include -+#include -+#include - - #define AR724X_PCI_REG_APP 0x00 - #define AR724X_PCI_REG_RESET 0x18 -@@ -42,17 +45,20 @@ struct ar724x_pci_controller { - void __iomem *crp_base; - - int irq; -- int irq_base; - - bool link_up; - bool bar0_is_cached; - u32 bar0_value; - -+ struct device_node *np; - struct pci_controller pci_controller; -+ struct irq_domain *domain; - struct resource io_res; - struct resource mem_res; - }; - -+static struct irq_chip ar724x_pci_irq_chip; -+ - static inline bool ar724x_pci_check_link(struct ar724x_pci_controller *apc) - { - u32 reset; -@@ -228,35 +234,31 @@ static struct pci_ops ar724x_pci_ops = { - - static void ar724x_pci_irq_handler(struct irq_desc *desc) - { -- struct ar724x_pci_controller *apc; -- void __iomem *base; -+ struct irq_chip *chip = irq_desc_get_chip(desc); -+ struct ar724x_pci_controller *apc = irq_desc_get_handler_data(desc); - u32 pending; - -- apc = irq_desc_get_handler_data(desc); -- base = apc->ctrl_base; -- -- pending = __raw_readl(base + AR724X_PCI_REG_INT_STATUS) & -- __raw_readl(base + AR724X_PCI_REG_INT_MASK); -+ chained_irq_enter(chip, desc); -+ pending = __raw_readl(apc->ctrl_base + AR724X_PCI_REG_INT_STATUS) & -+ __raw_readl(apc->ctrl_base + AR724X_PCI_REG_INT_MASK); - - if (pending & AR724X_PCI_INT_DEV0) -- generic_handle_irq(apc->irq_base + 0); -- -+ generic_handle_irq(irq_linear_revmap(apc->domain, 1)); - else - spurious_interrupt(); -+ chained_irq_exit(chip, desc); - } - - static void ar724x_pci_irq_unmask(struct irq_data *d) - { - struct ar724x_pci_controller *apc; - void __iomem *base; -- int offset; - u32 t; - - apc = irq_data_get_irq_chip_data(d); - base = apc->ctrl_base; -- offset = apc->irq_base - d->irq; - -- switch (offset) { -+ switch (irq_linear_revmap(apc->domain, d->irq)) { - case 0: - t = __raw_readl(base + AR724X_PCI_REG_INT_MASK); - __raw_writel(t | AR724X_PCI_INT_DEV0, -@@ -270,14 +272,12 @@ static void ar724x_pci_irq_mask(struct i - { - struct ar724x_pci_controller *apc; - void __iomem *base; -- int offset; - u32 t; - - apc = irq_data_get_irq_chip_data(d); - base = apc->ctrl_base; -- offset = apc->irq_base - d->irq; - -- switch (offset) { -+ switch (irq_linear_revmap(apc->domain, d->irq)) { - case 0: - t = __raw_readl(base + AR724X_PCI_REG_INT_MASK); - __raw_writel(t & ~AR724X_PCI_INT_DEV0, -@@ -302,26 +302,34 @@ static struct irq_chip ar724x_pci_irq_ch - .irq_mask_ack = ar724x_pci_irq_mask, - }; - -+static int ar724x_pci_irq_map(struct irq_domain *d, -+ unsigned int irq, irq_hw_number_t hw) -+{ -+ struct ar724x_pci_controller *apc = d->host_data; -+ -+ irq_set_chip_and_handler(irq, &ar724x_pci_irq_chip, handle_level_irq); -+ irq_set_chip_data(irq, apc); -+ -+ return 0; -+} -+ -+static const struct irq_domain_ops ar724x_pci_domain_ops = { -+ .xlate = irq_domain_xlate_onecell, -+ .map = ar724x_pci_irq_map, -+}; -+ - static void ar724x_pci_irq_init(struct ar724x_pci_controller *apc, - int id) - { - void __iomem *base; -- int i; - - base = apc->ctrl_base; - - __raw_writel(0, base + AR724X_PCI_REG_INT_MASK); - __raw_writel(0, base + AR724X_PCI_REG_INT_STATUS); - -- apc->irq_base = ATH79_PCI_IRQ_BASE + (id * AR724X_PCI_IRQ_COUNT); -- -- for (i = apc->irq_base; -- i < apc->irq_base + AR724X_PCI_IRQ_COUNT; i++) { -- irq_set_chip_and_handler(i, &ar724x_pci_irq_chip, -- handle_level_irq); -- irq_set_chip_data(i, apc); -- } -- -+ apc->domain = irq_domain_add_linear(apc->np, 2, -+ &ar724x_pci_domain_ops, apc); - irq_set_chained_handler_and_data(apc->irq, ar724x_pci_irq_handler, - apc); - } -@@ -388,29 +396,11 @@ static int ar724x_pci_probe(struct platf - if (apc->irq < 0) - return -EINVAL; - -- res = platform_get_resource_byname(pdev, IORESOURCE_IO, "io_base"); -- if (!res) -- return -EINVAL; -- -- apc->io_res.parent = res; -- apc->io_res.name = "PCI IO space"; -- apc->io_res.start = res->start; -- apc->io_res.end = res->end; -- apc->io_res.flags = IORESOURCE_IO; -- -- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mem_base"); -- if (!res) -- return -EINVAL; -- -- apc->mem_res.parent = res; -- apc->mem_res.name = "PCI memory space"; -- apc->mem_res.start = res->start; -- apc->mem_res.end = res->end; -- apc->mem_res.flags = IORESOURCE_MEM; -- -+ apc->np = pdev->dev.of_node; - apc->pci_controller.pci_ops = &ar724x_pci_ops; - apc->pci_controller.io_resource = &apc->io_res; - apc->pci_controller.mem_resource = &apc->mem_res; -+ pci_load_of_ranges(&apc->pci_controller, pdev->dev.of_node); - - /* - * Do the full PCIE Root Complex Initialization Sequence if the PCIe -@@ -432,10 +422,16 @@ static int ar724x_pci_probe(struct platf - return 0; - } - -+static const struct of_device_id ar724x_pci_ids[] = { -+ { .compatible = "qcom,ar7240-pci" }, -+ {}, -+}; -+ - static struct platform_driver ar724x_pci_driver = { - .probe = ar724x_pci_probe, - .driver = { - .name = "ar724x-pci", -+ .of_match_table = of_match_ptr(ar724x_pci_ids), - }, - }; - diff --git a/target/linux/ath79/patches-5.10/0032-MIPS-ath79-sanitize-symbols.patch b/target/linux/ath79/patches-5.10/0032-MIPS-ath79-sanitize-symbols.patch deleted file mode 100644 index 40cd1689a0..0000000000 --- a/target/linux/ath79/patches-5.10/0032-MIPS-ath79-sanitize-symbols.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 3fc8585cf76022dba7496627074d42af88c30718 Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Sat, 23 Jun 2018 15:16:55 +0200 -Subject: [PATCH 32/33] MIPS: ath79: sanitize symbols - -We no longer need to select which SoCs are supported as the whole arch -code is always built. So lets drop all the SoC symbols - -Signed-off-by: John Crispin ---- - arch/mips/Kconfig | 2 ++ - arch/mips/ath79/Kconfig | 44 +++++--------------------------------------- - arch/mips/pci/Makefile | 2 +- - 3 files changed, 8 insertions(+), 40 deletions(-) - ---- a/arch/mips/Kconfig -+++ b/arch/mips/Kconfig -@@ -245,6 +245,8 @@ config ATH79 - select SYS_SUPPORTS_BIG_ENDIAN - select SYS_SUPPORTS_MIPS16 - select SYS_SUPPORTS_ZBOOT_UART_PROM -+ select HAVE_PCI -+ select USB_ARCH_HAS_EHCI - select USE_OF - select USB_EHCI_ROOT_HUB_TT if USB_EHCI_HCD_PLATFORM - help ---- a/arch/mips/ath79/Kconfig -+++ b/arch/mips/ath79/Kconfig -@@ -1,48 +1,14 @@ - # SPDX-License-Identifier: GPL-2.0 - if ATH79 - --config SOC_AR71XX -- select HAVE_PCI -- def_bool n -- --config SOC_AR724X -- select HAVE_PCI -- select PCI_AR724X if PCI -- def_bool n -- --config SOC_AR913X -- def_bool n -- --config SOC_AR933X -- def_bool n -- --config SOC_AR934X -- select HAVE_PCI -- select PCI_AR724X if PCI -- def_bool n -- --config SOC_QCA955X -- select HAVE_PCI -- select PCI_AR724X if PCI -+config PCI_AR71XX -+ bool "PCI support for AR7100 type SoCs" -+ depends on PCI - def_bool n - - config PCI_AR724X -- def_bool n -- --config ATH79_DEV_GPIO_BUTTONS -- def_bool n -- --config ATH79_DEV_LEDS_GPIO -- def_bool n -- --config ATH79_DEV_SPI -- def_bool n -- --config ATH79_DEV_USB -- def_bool n -- --config ATH79_DEV_WMAC -- depends on (SOC_AR913X || SOC_AR933X || SOC_AR934X || SOC_QCA955X) -+ bool "PCI support for AR724x type SoCs" -+ depends on PCI - def_bool n - - endif ---- a/arch/mips/pci/Makefile -+++ b/arch/mips/pci/Makefile -@@ -21,7 +21,7 @@ obj-$(CONFIG_BCM63XX) += pci-bcm63xx.o - ops-bcm63xx.o - obj-$(CONFIG_MIPS_ALCHEMY) += pci-alchemy.o - obj-$(CONFIG_PCI_AR2315) += pci-ar2315.o --obj-$(CONFIG_SOC_AR71XX) += pci-ar71xx.o -+obj-$(CONFIG_PCI_AR71XX) += pci-ar71xx.o - obj-$(CONFIG_PCI_AR724X) += pci-ar724x.o - obj-$(CONFIG_PCI_XTALK_BRIDGE) += pci-xtalk-bridge.o - # diff --git a/target/linux/ath79/patches-5.10/0033-spi-ath79-drop-pdata-support.patch b/target/linux/ath79/patches-5.10/0033-spi-ath79-drop-pdata-support.patch deleted file mode 100644 index 162a82bda3..0000000000 --- a/target/linux/ath79/patches-5.10/0033-spi-ath79-drop-pdata-support.patch +++ /dev/null @@ -1,70 +0,0 @@ -From c4e197bbcecc7233aa9e553e7047fa50e4e1fe77 Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Mon, 25 Jun 2018 15:52:34 +0200 -Subject: [PATCH 33/33] spi: ath79: drop pdata support - -The target is being converted to pure OF. We can therefore drop all of the -platform data code from the driver. - -Cc: linux-spi@vger.kernel.org -Acked-by: Mark Brown -Signed-off-by: John Crispin ---- - include/linux/platform_data/spi-ath79.h | 16 ------------------- - drivers/spi/spi-ath79.c | 8 -------- - 2 files changed, 27 deletions(-) - delete mode 100644 arch/mips/include/asm/mach-ath79/ath79_spi_platform.h - ---- a/include/linux/platform_data/spi-ath79.h -+++ /dev/null -@@ -1,16 +0,0 @@ --/* SPDX-License-Identifier: GPL-2.0-only */ --/* -- * Platform data definition for Atheros AR71XX/AR724X/AR913X SPI controller -- * -- * Copyright (C) 2008-2010 Gabor Juhos -- */ -- --#ifndef _ATH79_SPI_PLATFORM_H --#define _ATH79_SPI_PLATFORM_H -- --struct ath79_spi_platform_data { -- unsigned bus_num; -- unsigned num_chipselect; --}; -- --#endif /* _ATH79_SPI_PLATFORM_H */ ---- a/drivers/spi/spi-ath79.c -+++ b/drivers/spi/spi-ath79.c -@@ -19,7 +19,6 @@ - #include - #include - #include --#include - - #define DRV_NAME "ath79-spi" - -@@ -138,7 +137,6 @@ static int ath79_spi_probe(struct platfo - { - struct spi_master *master; - struct ath79_spi *sp; -- struct ath79_spi_platform_data *pdata; - unsigned long rate; - int ret; - -@@ -152,15 +150,9 @@ static int ath79_spi_probe(struct platfo - master->dev.of_node = pdev->dev.of_node; - platform_set_drvdata(pdev, sp); - -- pdata = dev_get_platdata(&pdev->dev); -- - master->use_gpio_descriptors = true; - master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32); - master->flags = SPI_MASTER_GPIO_SS; -- if (pdata) { -- master->bus_num = pdata->bus_num; -- master->num_chipselect = pdata->num_chipselect; -- } - - sp->bitbang.master = master; - sp->bitbang.chipselect = ath79_spi_chipselect; diff --git a/target/linux/ath79/patches-5.10/0034-MIPS-ath79-ath9k-exports.patch b/target/linux/ath79/patches-5.10/0034-MIPS-ath79-ath9k-exports.patch deleted file mode 100644 index 71acc22210..0000000000 --- a/target/linux/ath79/patches-5.10/0034-MIPS-ath79-ath9k-exports.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- a/arch/mips/ath79/common.c -+++ b/arch/mips/ath79/common.c -@@ -31,11 +31,13 @@ EXPORT_SYMBOL_GPL(ath79_ddr_freq); - - enum ath79_soc_type ath79_soc; - unsigned int ath79_soc_rev; -+EXPORT_SYMBOL_GPL(ath79_soc_rev); - - void __iomem *ath79_pll_base; - void __iomem *ath79_reset_base; - EXPORT_SYMBOL_GPL(ath79_reset_base); --static void __iomem *ath79_ddr_base; -+void __iomem *ath79_ddr_base; -+EXPORT_SYMBOL_GPL(ath79_ddr_base); - static void __iomem *ath79_ddr_wb_flush_base; - static void __iomem *ath79_ddr_pci_win_base; - ---- a/arch/mips/include/asm/mach-ath79/ath79.h -+++ b/arch/mips/include/asm/mach-ath79/ath79.h -@@ -149,6 +149,7 @@ void ath79_ddr_wb_flush(unsigned int reg - void ath79_ddr_set_pci_windows(void); - - extern void __iomem *ath79_pll_base; -+extern void __iomem *ath79_ddr_base; - extern void __iomem *ath79_reset_base; - - static inline void ath79_pll_wr(unsigned reg, u32 val) diff --git a/target/linux/ath79/patches-5.10/0036-MIPS-ath79-remove-irq-code-from-pci.patch b/target/linux/ath79/patches-5.10/0036-MIPS-ath79-remove-irq-code-from-pci.patch deleted file mode 100644 index 80fcd0a7f5..0000000000 --- a/target/linux/ath79/patches-5.10/0036-MIPS-ath79-remove-irq-code-from-pci.patch +++ /dev/null @@ -1,139 +0,0 @@ ---- a/arch/mips/pci/pci-ar71xx.c -+++ b/arch/mips/pci/pci-ar71xx.c -@@ -51,11 +51,9 @@ - struct ar71xx_pci_controller { - struct device_node *np; - void __iomem *cfg_base; -- int irq; - struct pci_controller pci_ctrl; - struct resource io_res; - struct resource mem_res; -- struct irq_domain *domain; - }; - - /* Byte lane enable bits */ -@@ -227,104 +225,6 @@ static struct pci_ops ar71xx_pci_ops = { - .write = ar71xx_pci_write_config, - }; - --static void ar71xx_pci_irq_handler(struct irq_desc *desc) --{ -- void __iomem *base = ath79_reset_base; -- struct irq_chip *chip = irq_desc_get_chip(desc); -- struct ar71xx_pci_controller *apc = irq_desc_get_handler_data(desc); -- u32 pending; -- -- chained_irq_enter(chip, desc); -- pending = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_STATUS) & -- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); -- -- if (pending & AR71XX_PCI_INT_DEV0) -- generic_handle_irq(irq_linear_revmap(apc->domain, 1)); -- -- else if (pending & AR71XX_PCI_INT_DEV1) -- generic_handle_irq(irq_linear_revmap(apc->domain, 2)); -- -- else if (pending & AR71XX_PCI_INT_DEV2) -- generic_handle_irq(irq_linear_revmap(apc->domain, 3)); -- -- else if (pending & AR71XX_PCI_INT_CORE) -- generic_handle_irq(irq_linear_revmap(apc->domain, 4)); -- -- else -- spurious_interrupt(); -- chained_irq_exit(chip, desc); --} -- --static void ar71xx_pci_irq_unmask(struct irq_data *d) --{ -- struct ar71xx_pci_controller *apc; -- unsigned int irq; -- void __iomem *base = ath79_reset_base; -- u32 t; -- -- apc = irq_data_get_irq_chip_data(d); -- irq = irq_linear_revmap(apc->domain, d->irq); -- -- t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); -- __raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); -- -- /* flush write */ -- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); --} -- --static void ar71xx_pci_irq_mask(struct irq_data *d) --{ -- struct ar71xx_pci_controller *apc; -- unsigned int irq; -- void __iomem *base = ath79_reset_base; -- u32 t; -- -- apc = irq_data_get_irq_chip_data(d); -- irq = irq_linear_revmap(apc->domain, d->irq); -- -- t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); -- __raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); -- -- /* flush write */ -- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); --} -- --static struct irq_chip ar71xx_pci_irq_chip = { -- .name = "AR71XX PCI", -- .irq_mask = ar71xx_pci_irq_mask, -- .irq_unmask = ar71xx_pci_irq_unmask, -- .irq_mask_ack = ar71xx_pci_irq_mask, --}; -- --static int ar71xx_pci_irq_map(struct irq_domain *d, -- unsigned int irq, irq_hw_number_t hw) --{ -- struct ar71xx_pci_controller *apc = d->host_data; -- -- irq_set_chip_and_handler(irq, &ar71xx_pci_irq_chip, handle_level_irq); -- irq_set_chip_data(irq, apc); -- -- return 0; --} -- --static const struct irq_domain_ops ar71xx_pci_domain_ops = { -- .xlate = irq_domain_xlate_onecell, -- .map = ar71xx_pci_irq_map, --}; -- --static void ar71xx_pci_irq_init(struct ar71xx_pci_controller *apc) --{ -- void __iomem *base = ath79_reset_base; -- -- __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_ENABLE); -- __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_STATUS); -- -- apc->domain = irq_domain_add_linear(apc->np, AR71XX_PCI_IRQ_COUNT, -- &ar71xx_pci_domain_ops, apc); -- irq_set_chained_handler_and_data(apc->irq, ar71xx_pci_irq_handler, -- apc); --} -- - static void ar71xx_pci_reset(void) - { - ath79_device_reset_set(AR71XX_RESET_PCI_BUS | AR71XX_RESET_PCI_CORE); -@@ -358,10 +258,6 @@ static int ar71xx_pci_probe(struct platf - if (IS_ERR(apc->cfg_base)) - return PTR_ERR(apc->cfg_base); - -- apc->irq = platform_get_irq(pdev, 0); -- if (apc->irq < 0) -- return -EINVAL; -- - ar71xx_pci_reset(); - - /* setup COMMAND register */ -@@ -372,8 +268,6 @@ static int ar71xx_pci_probe(struct platf - /* clear bus errors */ - ar71xx_pci_check_error(apc, 1); - -- ar71xx_pci_irq_init(apc); -- - apc->np = pdev->dev.of_node; - apc->pci_ctrl.pci_ops = &ar71xx_pci_ops; - apc->pci_ctrl.mem_resource = &apc->mem_res; diff --git a/target/linux/ath79/patches-5.10/0037-missing-registers.patch b/target/linux/ath79/patches-5.10/0037-missing-registers.patch deleted file mode 100644 index 9067e4ca7b..0000000000 --- a/target/linux/ath79/patches-5.10/0037-missing-registers.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit f3ffac90bc7266b7d917616f3233f58e8c08a196 -Author: Christian Lamparter -Date: Fri Aug 10 23:24:47 2018 +0200 - - ath79: gmac: add parsers for rxd(v)- and tx(d|en)-delay for AR9344 - - Signed-off-by: Christian Lamparter - ---- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -+++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -@@ -1226,6 +1226,10 @@ - #define AR934X_ETH_CFG_RDV_DELAY BIT(16) - #define AR934X_ETH_CFG_RDV_DELAY_MASK 0x3 - #define AR934X_ETH_CFG_RDV_DELAY_SHIFT 16 -+#define AR934X_ETH_CFG_TXD_DELAY_MASK 0x3 -+#define AR934X_ETH_CFG_TXD_DELAY_SHIFT 18 -+#define AR934X_ETH_CFG_TXE_DELAY_MASK 0x3 -+#define AR934X_ETH_CFG_TXE_DELAY_SHIFT 20 - - /* - * QCA953X GMAC Interface diff --git a/target/linux/ath79/patches-5.10/0039-MIPS-ath79-export-UART1-reference-clock.patch b/target/linux/ath79/patches-5.10/0039-MIPS-ath79-export-UART1-reference-clock.patch deleted file mode 100644 index edf888c7e7..0000000000 --- a/target/linux/ath79/patches-5.10/0039-MIPS-ath79-export-UART1-reference-clock.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- a/arch/mips/ath79/clock.c -+++ b/arch/mips/ath79/clock.c -@@ -40,6 +40,7 @@ static const char * const clk_names[ATH7 - [ATH79_CLK_AHB] = "ahb", - [ATH79_CLK_REF] = "ref", - [ATH79_CLK_MDIO] = "mdio", -+ [ATH79_CLK_UART1] = "uart1", - }; - - static const char * __init ath79_clk_name(int type) -@@ -344,6 +345,9 @@ static void __init ar934x_clocks_init(vo - if (clk_ctrl & AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL) - ath79_set_clk(ATH79_CLK_MDIO, 100 * 1000 * 1000); - -+ if (clk_ctrl & AR934X_PLL_SWITCH_CLOCK_CONTROL_UART1_CLK_SEL) -+ ath79_set_clk(ATH79_CLK_UART1, 100 * 1000 * 1000); -+ - iounmap(dpll_base); - } - -@@ -649,6 +653,9 @@ static void __init ath79_clocks_init_dt( - if (!clks[ATH79_CLK_MDIO]) - clks[ATH79_CLK_MDIO] = clks[ATH79_CLK_REF]; - -+ if (!clks[ATH79_CLK_UART1]) -+ clks[ATH79_CLK_UART1] = clks[ATH79_CLK_REF]; -+ - if (of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data)) { - pr_err("%pOF: could not register clk provider\n", np); - goto err_iounmap; ---- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -+++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -@@ -348,6 +348,7 @@ - #define AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL BIT(24) - - #define AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL BIT(6) -+#define AR934X_PLL_SWITCH_CLOCK_CONTROL_UART1_CLK_SEL BIT(7) - - #define QCA953X_PLL_CPU_CONFIG_REG 0x00 - #define QCA953X_PLL_DDR_CONFIG_REG 0x04 ---- a/include/dt-bindings/clock/ath79-clk.h -+++ b/include/dt-bindings/clock/ath79-clk.h -@@ -11,7 +11,8 @@ - #define ATH79_CLK_AHB 2 - #define ATH79_CLK_REF 3 - #define ATH79_CLK_MDIO 4 -+#define ATH79_CLK_UART1 5 - --#define ATH79_CLK_END 5 -+#define ATH79_CLK_END 6 - - #endif /* __DT_BINDINGS_ATH79_CLK_H */ diff --git a/target/linux/ath79/patches-5.10/004-register_gpio_driver_earlier.patch b/target/linux/ath79/patches-5.10/004-register_gpio_driver_earlier.patch deleted file mode 100644 index 4a2a3b741d..0000000000 --- a/target/linux/ath79/patches-5.10/004-register_gpio_driver_earlier.patch +++ /dev/null @@ -1,18 +0,0 @@ -HACK: register the GPIO driver earlier to ensure that gpio_request calls -from mach files succeed. - ---- a/drivers/gpio/gpio-ath79.c -+++ b/drivers/gpio/gpio-ath79.c -@@ -306,7 +306,11 @@ static struct platform_driver ath79_gpio - .probe = ath79_gpio_probe, - }; - --module_platform_driver(ath79_gpio_driver); -+static int __init ath79_gpio_init(void) -+{ -+ return platform_driver_register(&ath79_gpio_driver); -+} -+postcore_initcall(ath79_gpio_init); - - MODULE_DESCRIPTION("Atheros AR71XX/AR724X/AR913X GPIO API support"); - MODULE_LICENSE("GPL v2"); diff --git a/target/linux/ath79/patches-5.10/0040-ath79-sgmii-config.patch b/target/linux/ath79/patches-5.10/0040-ath79-sgmii-config.patch deleted file mode 100644 index bf7cbf2716..0000000000 --- a/target/linux/ath79/patches-5.10/0040-ath79-sgmii-config.patch +++ /dev/null @@ -1,9 +0,0 @@ ---- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -+++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -@@ -1376,5 +1376,6 @@ - - #define QCA956X_SGMII_CONFIG_MODE_CTRL_SHIFT 0 - #define QCA956X_SGMII_CONFIG_MODE_CTRL_MASK 0x7 -+#define QCA956X_SGMII_CONFIG_MODE_CTRL_SGMII_MAC 0x2 - - #endif /* __ASM_MACH_AR71XX_REGS_H */ diff --git a/target/linux/ath79/patches-5.10/0052-mtd-spi-nor-use-4-bit-locking-for-MX25L12805D.patch b/target/linux/ath79/patches-5.10/0052-mtd-spi-nor-use-4-bit-locking-for-MX25L12805D.patch deleted file mode 100644 index e99d067c48..0000000000 --- a/target/linux/ath79/patches-5.10/0052-mtd-spi-nor-use-4-bit-locking-for-MX25L12805D.patch +++ /dev/null @@ -1,33 +0,0 @@ -From a449cd03db4d0e1d292b3734f7676634cfd94f53 Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Sun, 25 Oct 2020 01:14:22 +0200 -Subject: [PATCH] mtd: spi-nor: use 4 bit locking for MX25L12805D - -Macronix MX25L12805D supports locking with 4 block -protection bits in its status register. Add the corresponding -flag in order to clear these bits when unloking the flash. - -Otherwise, the flash might not be writable depending on the state -left by the bootloader. - -Tested-on: Ubiquiti UniFi AC Lite (ath79) - -Fixes commit 62593cf40b23 ("mtd: spi-nor: refactor block protection functions") - -Signed-off-by: David Bauer ---- - drivers/mtd/spi-nor/macronix.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - ---- a/drivers/mtd/spi-nor/macronix.c -+++ b/drivers/mtd/spi-nor/macronix.c -@@ -51,7 +51,8 @@ static const struct flash_info macronix_ - { "mx25u4035", INFO(0xc22533, 0, 64 * 1024, 8, SECT_4K) }, - { "mx25u8035", INFO(0xc22534, 0, 64 * 1024, 16, SECT_4K) }, - { "mx25u6435f", INFO(0xc22537, 0, 64 * 1024, 128, SECT_4K) }, -- { "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, SECT_4K) }, -+ { "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, SECT_4K | -+ SPI_NOR_HAS_LOCK | SPI_NOR_4BIT_BP) }, - { "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) }, - { "mx25r1635f", INFO(0xc22815, 0, 64 * 1024, 32, - SECT_4K | SPI_NOR_DUAL_READ | diff --git a/target/linux/ath79/patches-5.10/0062-MIPS-pci-ar724x-add-QCA9550-reset-sequence.patch b/target/linux/ath79/patches-5.10/0062-MIPS-pci-ar724x-add-QCA9550-reset-sequence.patch deleted file mode 100644 index f596ddb733..0000000000 --- a/target/linux/ath79/patches-5.10/0062-MIPS-pci-ar724x-add-QCA9550-reset-sequence.patch +++ /dev/null @@ -1,130 +0,0 @@ -From: David Bauer -Date: Sat, 11 Apr 2020 14:03:12 +0200 -Subject: MIPS: pci-ar724x: add QCA9550 reset sequence - -The QCA9550 family of SoCs have a slightly different reset -sequence compared to older chips. - -Normally the bootloader performs this sequence, however -some bootloader implementation expect the operating system -to clear the reset. - -Also get the resets from OF to support handling of the second -PCIe root-complex on the QCA9558. - -Signed-off-by: David Bauer - ---- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -+++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -@@ -391,6 +391,7 @@ - #define QCA955X_PLL_CPU_CONFIG_REG 0x00 - #define QCA955X_PLL_DDR_CONFIG_REG 0x04 - #define QCA955X_PLL_CLK_CTRL_REG 0x08 -+#define QCA955X_PLL_PCIE_CONFIG_REG 0x0c - #define QCA955X_PLL_ETH_XMII_CONTROL_REG 0x28 - #define QCA955X_PLL_ETH_SGMII_CONTROL_REG 0x48 - #define QCA955X_PLL_ETH_SGMII_SERDES_REG 0x4c -@@ -476,6 +477,9 @@ - #define QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_CPUPLL BIT(21) - #define QCA956X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL BIT(24) - -+#define QCA955X_PLL_PCIE_CONFIG_PLL_PWD BIT(30) -+#define QCA955X_PLL_PCIE_CONFIG_PLL_BYPASS BIT(16) -+ - #define QCA956X_PLL_SWITCH_CLOCK_SPARE_I2C_CLK_SELB BIT(5) - #define QCA956X_PLL_SWITCH_CLOCK_SPARE_MDIO_CLK_SEL0_1 BIT(6) - #define QCA956X_PLL_SWITCH_CLOCK_SPARE_UART1_CLK_SEL BIT(7) ---- a/arch/mips/pci/pci-ar724x.c -+++ b/arch/mips/pci/pci-ar724x.c -@@ -8,6 +8,7 @@ - - #include - #include -+#include - #include - #include - #include -@@ -55,6 +56,9 @@ struct ar724x_pci_controller { - struct irq_domain *domain; - struct resource io_res; - struct resource mem_res; -+ -+ struct reset_control *hc_reset; -+ struct reset_control *phy_reset; - }; - - static struct irq_chip ar724x_pci_irq_chip; -@@ -340,18 +344,30 @@ static void ar724x_pci_hw_init(struct ar - int wait = 0; - - /* deassert PCIe host controller and PCIe PHY reset */ -- ath79_device_reset_clear(AR724X_RESET_PCIE); -- ath79_device_reset_clear(AR724X_RESET_PCIE_PHY); -+ reset_control_deassert(apc->hc_reset); -+ reset_control_deassert(apc->phy_reset); - -- /* remove the reset of the PCIE PLL */ -- ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG); -- ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_RESET; -- ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl); -- -- /* deassert bypass for the PCIE PLL */ -- ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG); -- ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_BYPASS; -- ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl); -+ if (of_device_is_compatible(apc->np, "qcom,qca9550-pci")) { -+ /* remove the reset of the PCIE PLL */ -+ ppl = ath79_pll_rr(QCA955X_PLL_PCIE_CONFIG_REG); -+ ppl &= ~QCA955X_PLL_PCIE_CONFIG_PLL_PWD; -+ ath79_pll_wr(QCA955X_PLL_PCIE_CONFIG_REG, ppl); -+ -+ /* deassert bypass for the PCIE PLL */ -+ ppl = ath79_pll_rr(QCA955X_PLL_PCIE_CONFIG_REG); -+ ppl &= ~QCA955X_PLL_PCIE_CONFIG_PLL_BYPASS; -+ ath79_pll_wr(QCA955X_PLL_PCIE_CONFIG_REG, ppl); -+ } else { -+ /* remove the reset of the PCIE PLL */ -+ ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG); -+ ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_RESET; -+ ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl); -+ -+ /* deassert bypass for the PCIE PLL */ -+ ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG); -+ ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_BYPASS; -+ ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl); -+ } - - /* set PCIE Application Control to ready */ - app = __raw_readl(apc->ctrl_base + AR724X_PCI_REG_APP); -@@ -396,6 +412,14 @@ static int ar724x_pci_probe(struct platf - if (apc->irq < 0) - return -EINVAL; - -+ apc->hc_reset = devm_reset_control_get_exclusive(&pdev->dev, "hc"); -+ if (IS_ERR(apc->hc_reset)) -+ return PTR_ERR(apc->hc_reset); -+ -+ apc->phy_reset = devm_reset_control_get_exclusive(&pdev->dev, "phy"); -+ if (IS_ERR(apc->phy_reset)) -+ return PTR_ERR(apc->phy_reset); -+ - apc->np = pdev->dev.of_node; - apc->pci_controller.pci_ops = &ar724x_pci_ops; - apc->pci_controller.io_resource = &apc->io_res; -@@ -406,7 +430,7 @@ static int ar724x_pci_probe(struct platf - * Do the full PCIE Root Complex Initialization Sequence if the PCIe - * host controller is in reset. - */ -- if (ath79_reset_rr(AR724X_RESET_REG_RESET_MODULE) & AR724X_RESET_PCIE) -+ if (reset_control_status(apc->hc_reset)) - ar724x_pci_hw_init(apc); - - apc->link_up = ar724x_pci_check_link(apc); -@@ -424,6 +448,7 @@ static int ar724x_pci_probe(struct platf - - static const struct of_device_id ar724x_pci_ids[] = { - { .compatible = "qcom,ar7240-pci" }, -+ { .compatible = "qcom,qca9550-pci" }, - {}, - }; - diff --git a/target/linux/ath79/patches-5.10/401-mtd-nor-support-mtd-name-from-device-tree.patch b/target/linux/ath79/patches-5.10/401-mtd-nor-support-mtd-name-from-device-tree.patch deleted file mode 100644 index 2df15d0ce9..0000000000 --- a/target/linux/ath79/patches-5.10/401-mtd-nor-support-mtd-name-from-device-tree.patch +++ /dev/null @@ -1,54 +0,0 @@ -From f32bc2aa01edcba2f2ed5db151cf183eac9ef919 Mon Sep 17 00:00:00 2001 -From: Abhimanyu Vishwakarma -Date: Sat, 25 Feb 2017 16:42:50 +0000 -Subject: mtd: nor: support mtd name from device tree - -Signed-off-by: Abhimanyu Vishwakarma ---- - drivers/mtd/spi-nor/spi-nor.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - ---- a/drivers/mtd/spi-nor/core.c -+++ b/drivers/mtd/spi-nor/core.c -@@ -3168,6 +3168,7 @@ int spi_nor_scan(struct spi_nor *nor, co - struct device *dev = nor->dev; - struct mtd_info *mtd = &nor->mtd; - struct device_node *np = spi_nor_get_flash_node(nor); -+ const char __maybe_unused *of_mtd_name = NULL; - int ret; - int i; - -@@ -3222,7 +3223,12 @@ int spi_nor_scan(struct spi_nor *nor, co - if (ret) - return ret; - -- if (!mtd->name) -+#ifdef CONFIG_MTD_OF_PARTS -+ of_property_read_string(np, "linux,mtd-name", &of_mtd_name); -+#endif -+ if (of_mtd_name) -+ mtd->name = of_mtd_name; -+ else if (!mtd->name) - mtd->name = dev_name(dev); - mtd->priv = nor; - mtd->type = MTD_NORFLASH; ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -850,6 +850,17 @@ out_error: - */ - static void mtd_set_dev_defaults(struct mtd_info *mtd) - { -+#ifdef CONFIG_MTD_OF_PARTS -+ const char __maybe_unused *of_mtd_name = NULL; -+ struct device_node *np; -+ -+ np = mtd_get_of_node(mtd); -+ if (np && !mtd->name) { -+ of_property_read_string(np, "linux,mtd-name", &of_mtd_name); -+ if (of_mtd_name) -+ mtd->name = of_mtd_name; -+ } else -+#endif - if (mtd->dev.parent) { - if (!mtd->owner && mtd->dev.parent->driver) - mtd->owner = mtd->dev.parent->driver->owner; diff --git a/target/linux/ath79/patches-5.10/404-mtd-cybertan-trx-parser.patch b/target/linux/ath79/patches-5.10/404-mtd-cybertan-trx-parser.patch deleted file mode 100644 index 540e134ef0..0000000000 --- a/target/linux/ath79/patches-5.10/404-mtd-cybertan-trx-parser.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- a/drivers/mtd/parsers/Makefile -+++ b/drivers/mtd/parsers/Makefile -@@ -8,6 +8,7 @@ obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o - ofpart-y += ofpart_core.o - ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += ofpart_bcm4908.o - ofpart-$(CONFIG_MTD_OF_PARTS_LINKSYS_NS)+= ofpart_linksys_ns.o -+obj-$(CONFIG_MTD_PARSER_CYBERTAN) += parser_cybertan.o - obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o - obj-$(CONFIG_MTD_AFS_PARTS) += afs.o - obj-$(CONFIG_MTD_PARSER_TPLINK_SAFELOADER) += tplink_safeloader.o ---- a/drivers/mtd/parsers/Kconfig -+++ b/drivers/mtd/parsers/Kconfig -@@ -102,6 +102,14 @@ config MTD_OF_PARTS_LINKSYS_NS - two "firmware" partitions. Currently used firmware has to be detected - using CFE environment variable. - -+config MTD_PARSER_CYBERTAN -+ tristate "Parser for Cybertan format partitions" -+ depends on MTD && (ATH79 || COMPILE_TEST) -+ help -+ Cybertan has a proprietory header than encompasses a Broadcom trx -+ header. This driver will parse the header and take care of the -+ special offsets that result in the extra headers. -+ - config MTD_PARSER_IMAGETAG - tristate "Parser for BCM963XX Image Tag format partitions" - depends on BCM63XX || BMIPS_GENERIC || COMPILE_TEST diff --git a/target/linux/ath79/patches-5.10/408-mtd-redboot_partition_scan.patch b/target/linux/ath79/patches-5.10/408-mtd-redboot_partition_scan.patch deleted file mode 100644 index ad5257fabd..0000000000 --- a/target/linux/ath79/patches-5.10/408-mtd-redboot_partition_scan.patch +++ /dev/null @@ -1,44 +0,0 @@ ---- a/drivers/mtd/parsers/redboot.c -+++ b/drivers/mtd/parsers/redboot.c -@@ -91,12 +91,18 @@ static int parse_redboot_partitions(stru - - parse_redboot_of(master); - -+ buf = vmalloc(master->erasesize); -+ if (!buf) -+ return -ENOMEM; -+ -+ restart: - if ( directory < 0 ) { - offset = master->size + directory * master->erasesize; - while (mtd_block_isbad(master, offset)) { - if (!offset) { - nogood: - printk(KERN_NOTICE "Failed to find a non-bad block to check for RedBoot partition table\n"); -+ vfree(buf); - return -EIO; - } - offset -= master->erasesize; -@@ -109,10 +115,6 @@ static int parse_redboot_partitions(stru - goto nogood; - } - } -- buf = vmalloc(master->erasesize); -- -- if (!buf) -- return -ENOMEM; - - printk(KERN_NOTICE "Searching for RedBoot partition table in %s at offset 0x%lx\n", - master->name, offset); -@@ -185,6 +187,11 @@ static int parse_redboot_partitions(stru - } - if (i == numslots) { - /* Didn't find it */ -+ if (offset + master->erasesize < master->size) { -+ /* not at the end of the flash yet, maybe next block :) */ -+ directory++; -+ goto restart; -+ } - printk(KERN_NOTICE "No RedBoot partition table detected in %s\n", - master->name); - ret = 0; diff --git a/target/linux/ath79/patches-5.10/410-spi-ath79-Implement-the-spi_mem-interface.patch b/target/linux/ath79/patches-5.10/410-spi-ath79-Implement-the-spi_mem-interface.patch deleted file mode 100644 index 51a71c6ef2..0000000000 --- a/target/linux/ath79/patches-5.10/410-spi-ath79-Implement-the-spi_mem-interface.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 8d8cdb4a6ccee5b62cc0dc64651c3946364514dc Mon Sep 17 00:00:00 2001 -From: Luiz Angelo Daros de Luca -Date: Mon, 10 Feb 2020 16:11:27 -0300 -Subject: [PATCH] spi: ath79: Implement the spi_mem interface - -Signed-off-by: Luiz Angelo Daros de Luca ---- - drivers/spi/spi-ath79.c | 35 +++++++++++++++++++++++++++++++++++ - 1 file changed, 35 insertions(+) - ---- a/drivers/spi/spi-ath79.c -+++ b/drivers/spi/spi-ath79.c -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -133,6 +134,39 @@ static u32 ath79_spi_txrx_mode0(struct s - return ath79_spi_rr(sp, AR71XX_SPI_REG_RDS); - } - -+static int ath79_exec_mem_op(struct spi_mem *mem, -+ const struct spi_mem_op *op) -+{ -+ struct ath79_spi *sp = ath79_spidev_to_sp(mem->spi); -+ -+ /* Ensures that reading is performed on device connected -+ to hardware cs0 */ -+ if (mem->spi->chip_select || mem->spi->cs_gpiod) -+ return -ENOTSUPP; -+ -+ /* Only use for fast-read op. */ -+ if (op->cmd.opcode != 0x0b || op->data.dir != SPI_MEM_DATA_IN || -+ op->addr.nbytes != 3 || op->dummy.nbytes != 1) -+ return -ENOTSUPP; -+ -+ /* disable GPIO mode */ -+ ath79_spi_wr(sp, AR71XX_SPI_REG_FS, 0); -+ -+ memcpy_fromio(op->data.buf.in, sp->base + op->addr.val, op->data.nbytes); -+ -+ /* enable GPIO mode */ -+ ath79_spi_wr(sp, AR71XX_SPI_REG_FS, AR71XX_SPI_FS_GPIO); -+ -+ /* restore IOC register */ -+ ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); -+ -+ return 0; -+} -+ -+static const struct spi_controller_mem_ops ath79_mem_ops = { -+ .exec_op = ath79_exec_mem_op, -+}; -+ - static int ath79_spi_probe(struct platform_device *pdev) - { - struct spi_master *master; -@@ -164,6 +198,7 @@ static int ath79_spi_probe(struct platfo - ret = PTR_ERR(sp->base); - goto err_put_master; - } -+ master->mem_ops = &ath79_mem_ops; - - sp->clk = devm_clk_get(&pdev->dev, "ahb"); - if (IS_ERR(sp->clk)) { diff --git a/target/linux/ath79/patches-5.10/412-spi-ath79-set-number-of-chipselect-lines.patch b/target/linux/ath79/patches-5.10/412-spi-ath79-set-number-of-chipselect-lines.patch deleted file mode 100644 index 614bcbcded..0000000000 --- a/target/linux/ath79/patches-5.10/412-spi-ath79-set-number-of-chipselect-lines.patch +++ /dev/null @@ -1,26 +0,0 @@ -From e2e9f6d9f9bd7449ff113c157b639ce1a24b9d3f Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Sat, 24 Apr 2021 16:14:48 +0200 -Subject: [PATCH 2/2] spi: ath79: set number of chipselect lines - -All chipsets from AR7100 up to QCA9563 have three dedicated chipselect -lines for the integrated SPI controller. Remove the number of -chipselects from the platform data, as there is no need to manually set -this to a different value. - -Signed-off-by: David Bauer ---- - drivers/spi/spi-ath79.c | 2 +- - include/linux/platform_data/spi-ath79.h | 1 - - 2 files changed, 1 insertion(+), 2 deletions(-) - ---- a/drivers/spi/spi-ath79.c -+++ b/drivers/spi/spi-ath79.c -@@ -187,6 +187,7 @@ static int ath79_spi_probe(struct platfo - master->use_gpio_descriptors = true; - master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32); - master->flags = SPI_MASTER_GPIO_SS; -+ master->num_chipselect = 3; - - sp->bitbang.master = master; - sp->bitbang.chipselect = ath79_spi_chipselect; diff --git a/target/linux/ath79/patches-5.10/420-net-use-downstream-ag71xx.patch b/target/linux/ath79/patches-5.10/420-net-use-downstream-ag71xx.patch deleted file mode 100644 index 7ce3f0d29c..0000000000 --- a/target/linux/ath79/patches-5.10/420-net-use-downstream-ag71xx.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- a/drivers/net/ethernet/atheros/Kconfig -+++ b/drivers/net/ethernet/atheros/Kconfig -@@ -17,13 +17,7 @@ config NET_VENDOR_ATHEROS - - if NET_VENDOR_ATHEROS - --config AG71XX -- tristate "Atheros AR7XXX/AR9XXX built-in ethernet mac support" -- depends on ATH79 -- select PHYLINK -- help -- If you wish to compile a kernel for AR7XXX/91XXX and enable -- ethernet support, then you should always answer Y to this. -+source "drivers/net/ethernet/atheros/ag71xx/Kconfig" - - config ATL2 - tristate "Atheros L2 Fast Ethernet support" ---- a/drivers/net/ethernet/atheros/Makefile -+++ b/drivers/net/ethernet/atheros/Makefile -@@ -3,7 +3,7 @@ - # Makefile for the Atheros network device drivers. - # - --obj-$(CONFIG_AG71XX) += ag71xx.o -+obj-$(CONFIG_AG71XX) += ag71xx/ - obj-$(CONFIG_ATL1) += atlx/ - obj-$(CONFIG_ATL2) += atlx/ - obj-$(CONFIG_ATL1E) += atl1e/ diff --git a/target/linux/ath79/patches-5.10/425-at803x-allow-sgmii-aneg-override.patch b/target/linux/ath79/patches-5.10/425-at803x-allow-sgmii-aneg-override.patch deleted file mode 100644 index bf224b5f47..0000000000 --- a/target/linux/ath79/patches-5.10/425-at803x-allow-sgmii-aneg-override.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -830,6 +830,13 @@ static int at803x_aneg_done(struct phy_d - if (!(phy_read(phydev, AT803X_PSSR) & AT803X_PSSR_MR_AN_COMPLETE)) { - phydev_warn(phydev, "803x_aneg_done: SGMII link is not ok\n"); - aneg_done = 0; -+#ifdef CONFIG_OF_MDIO -+ if (phydev->mdio.dev.of_node && -+ of_property_read_bool(phydev->mdio.dev.of_node, -+ "at803x-override-sgmii-link-check")) { -+ aneg_done = 1; -+ } -+#endif - } - /* switch back to copper page */ - phy_write(phydev, AT803X_REG_CHIP_CONFIG, ccr | AT803X_BT_BX_REG_SEL); diff --git a/target/linux/ath79/patches-5.10/430-drivers-link-spi-before-mtd.patch b/target/linux/ath79/patches-5.10/430-drivers-link-spi-before-mtd.patch deleted file mode 100644 index 7590793dc9..0000000000 --- a/target/linux/ath79/patches-5.10/430-drivers-link-spi-before-mtd.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/drivers/Makefile -+++ b/drivers/Makefile -@@ -81,8 +81,8 @@ obj-y += scsi/ - obj-y += nvme/ - obj-$(CONFIG_ATA) += ata/ - obj-$(CONFIG_TARGET_CORE) += target/ --obj-$(CONFIG_MTD) += mtd/ - obj-$(CONFIG_SPI) += spi/ -+obj-$(CONFIG_MTD) += mtd/ - obj-$(CONFIG_SPMI) += spmi/ - obj-$(CONFIG_HSI) += hsi/ - obj-$(CONFIG_SLIMBUS) += slimbus/ diff --git a/target/linux/ath79/patches-5.10/440-mtd-ar934x-nand-driver.patch b/target/linux/ath79/patches-5.10/440-mtd-ar934x-nand-driver.patch deleted file mode 100644 index 1e2d573ebf..0000000000 --- a/target/linux/ath79/patches-5.10/440-mtd-ar934x-nand-driver.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- a/drivers/mtd/nand/raw/Kconfig -+++ b/drivers/mtd/nand/raw/Kconfig -@@ -556,4 +556,12 @@ config MTD_NAND_DISKONCHIP_BBTWRITE - load time (assuming you build diskonchip as a module) with the module - parameter "inftl_bbt_write=1". - -+config MTD_NAND_AR934X -+ tristate "Support for NAND controller on Qualcomm Atheros AR934x/QCA955x SoCs" -+ depends on ATH79 || COMPILE_TEST -+ depends on HAS_IOMEM -+ help -+ Enables support for NAND controller on Qualcomm Atheros SoCs. -+ This controller is found on AR934x and QCA955x SoCs. -+ - endif # MTD_RAW_NAND ---- a/drivers/mtd/nand/raw/Makefile -+++ b/drivers/mtd/nand/raw/Makefile -@@ -58,6 +58,7 @@ obj-$(CONFIG_MTD_NAND_STM32_FMC2) += stm - obj-$(CONFIG_MTD_NAND_MESON) += meson_nand.o - obj-$(CONFIG_MTD_NAND_CADENCE) += cadence-nand-controller.o - obj-$(CONFIG_MTD_NAND_ARASAN) += arasan-nand-controller.o -+obj-$(CONFIG_MTD_NAND_AR934X) += ar934x_nand.o - - nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o - nand-objs += nand_onfi.o diff --git a/target/linux/ath79/patches-5.10/470-MIPS-ath79-swizzle-pci-address-for-ar71xx.patch b/target/linux/ath79/patches-5.10/470-MIPS-ath79-swizzle-pci-address-for-ar71xx.patch deleted file mode 100644 index 924faec509..0000000000 --- a/target/linux/ath79/patches-5.10/470-MIPS-ath79-swizzle-pci-address-for-ar71xx.patch +++ /dev/null @@ -1,98 +0,0 @@ ---- /dev/null -+++ b/arch/mips/include/asm/mach-ath79/mangle-port.h -@@ -0,0 +1,37 @@ -+/* -+ * Copyright (C) 2012 Gabor Juhos -+ * -+ * This file was derived from: inlude/asm-mips/mach-generic/mangle-port.h -+ * Copyright (C) 2003, 2004 Ralf Baechle -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License version 2 as published -+ * by the Free Software Foundation. -+ */ -+ -+#ifndef __ASM_MACH_ATH79_MANGLE_PORT_H -+#define __ASM_MACH_ATH79_MANGLE_PORT_H -+ -+#ifdef CONFIG_PCI_AR71XX -+extern unsigned long (ath79_pci_swizzle_b)(unsigned long port); -+extern unsigned long (ath79_pci_swizzle_w)(unsigned long port); -+#else -+#define ath79_pci_swizzle_b(port) (port) -+#define ath79_pci_swizzle_w(port) (port) -+#endif -+ -+#define __swizzle_addr_b(port) ath79_pci_swizzle_b(port) -+#define __swizzle_addr_w(port) ath79_pci_swizzle_w(port) -+#define __swizzle_addr_l(port) (port) -+#define __swizzle_addr_q(port) (port) -+ -+# define ioswabb(a, x) (x) -+# define __mem_ioswabb(a, x) (x) -+# define ioswabw(a, x) (x) -+# define __mem_ioswabw(a, x) cpu_to_le16(x) -+# define ioswabl(a, x) (x) -+# define __mem_ioswabl(a, x) cpu_to_le32(x) -+# define ioswabq(a, x) (x) -+# define __mem_ioswabq(a, x) cpu_to_le64(x) -+ -+#endif /* __ASM_MACH_ATH79_MANGLE_PORT_H */ ---- a/arch/mips/pci/pci-ar71xx.c -+++ b/arch/mips/pci/pci-ar71xx.c -@@ -68,6 +68,45 @@ static const u32 ar71xx_pci_read_mask[8] - 0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0 - }; - -+static unsigned long (*__ath79_pci_swizzle_b)(unsigned long port); -+static unsigned long (*__ath79_pci_swizzle_w)(unsigned long port); -+ -+static inline bool ar71xx_is_pci_addr(unsigned long port) -+{ -+ unsigned long phys = CPHYSADDR(port); -+ -+ return (phys >= AR71XX_PCI_MEM_BASE && -+ phys < AR71XX_PCI_MEM_BASE + AR71XX_PCI_MEM_SIZE); -+} -+ -+static unsigned long ar71xx_pci_swizzle_b(unsigned long port) -+{ -+ return ar71xx_is_pci_addr(port) ? port ^ 3 : port; -+} -+ -+static unsigned long ar71xx_pci_swizzle_w(unsigned long port) -+{ -+ return ar71xx_is_pci_addr(port) ? port ^ 2 : port; -+} -+ -+unsigned long ath79_pci_swizzle_b(unsigned long port) -+{ -+ if (__ath79_pci_swizzle_b) -+ return __ath79_pci_swizzle_b(port); -+ -+ return port; -+} -+EXPORT_SYMBOL(ath79_pci_swizzle_b); -+ -+unsigned long ath79_pci_swizzle_w(unsigned long port) -+{ -+ if (__ath79_pci_swizzle_w) -+ return __ath79_pci_swizzle_w(port); -+ -+ return port; -+} -+EXPORT_SYMBOL(ath79_pci_swizzle_w); -+ - static inline u32 ar71xx_pci_get_ble(int where, int size, int local) - { - u32 t; -@@ -276,6 +315,9 @@ static int ar71xx_pci_probe(struct platf - - register_pci_controller(&apc->pci_ctrl); - -+ __ath79_pci_swizzle_b = ar71xx_pci_swizzle_b; -+ __ath79_pci_swizzle_w = ar71xx_pci_swizzle_w; -+ - return 0; - } - diff --git a/target/linux/ath79/patches-5.10/900-mdio_bitbang_ignore_ta_value.patch b/target/linux/ath79/patches-5.10/900-mdio_bitbang_ignore_ta_value.patch deleted file mode 100644 index 928f241abd..0000000000 --- a/target/linux/ath79/patches-5.10/900-mdio_bitbang_ignore_ta_value.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- a/drivers/net/mdio/mdio-bitbang.c -+++ b/drivers/net/mdio/mdio-bitbang.c -@@ -152,7 +152,7 @@ static int mdiobb_cmd_addr(struct mdiobb - static int mdiobb_read(struct mii_bus *bus, int phy, int reg) - { - struct mdiobb_ctrl *ctrl = bus->priv; -- int ret, i; -+ int ret; - - if (reg & MII_ADDR_C45) { - reg = mdiobb_cmd_addr(ctrl, phy, reg); -@@ -162,19 +162,7 @@ static int mdiobb_read(struct mii_bus *b - - ctrl->ops->set_mdio_dir(ctrl, 0); - -- /* check the turnaround bit: the PHY should be driving it to zero, if this -- * PHY is listed in phy_ignore_ta_mask as having broken TA, skip that -- */ -- if (mdiobb_get_bit(ctrl) != 0 && -- !(bus->phy_ignore_ta_mask & (1 << phy))) { -- /* PHY didn't drive TA low -- flush any bits it -- * may be trying to send. -- */ -- for (i = 0; i < 32; i++) -- mdiobb_get_bit(ctrl); -- -- return 0xffff; -- } -+ mdiobb_get_bit(ctrl); - - ret = mdiobb_get_num(ctrl, 16); - mdiobb_get_bit(ctrl); diff --git a/target/linux/ath79/patches-5.10/901-phy-mdio-bitbang-prevent-rescheduling-during-command.patch b/target/linux/ath79/patches-5.10/901-phy-mdio-bitbang-prevent-rescheduling-during-command.patch deleted file mode 100644 index e6fae3349d..0000000000 --- a/target/linux/ath79/patches-5.10/901-phy-mdio-bitbang-prevent-rescheduling-during-command.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 66e584435ac0de6e0abeb6d7166fe4fe25d6bb73 Mon Sep 17 00:00:00 2001 -From: Jonas Gorski -Date: Tue, 16 Jun 2015 13:15:08 +0200 -Subject: [PATCH] phy/mdio-bitbang: prevent rescheduling during command - -It seems some phys have some maximum timings for accessing the MDIO line, -resulting in bit errors under cpu stress. Prevent this from happening by -disabling interrupts when sending commands. - -Signed-off-by: Jonas Gorski ---- - drivers/net/mdio/mdio-bitbang.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - ---- a/drivers/net/mdio/mdio-bitbang.c -+++ b/drivers/net/mdio/mdio-bitbang.c -@@ -15,6 +15,7 @@ - */ - - #include -+#include - #include - #include - #include -@@ -153,7 +154,9 @@ static int mdiobb_read(struct mii_bus *b - { - struct mdiobb_ctrl *ctrl = bus->priv; - int ret; -+ unsigned long flags; - -+ local_irq_save(flags); - if (reg & MII_ADDR_C45) { - reg = mdiobb_cmd_addr(ctrl, phy, reg); - mdiobb_cmd(ctrl, MDIO_C45_READ, phy, reg); -@@ -166,13 +169,17 @@ static int mdiobb_read(struct mii_bus *b - - ret = mdiobb_get_num(ctrl, 16); - mdiobb_get_bit(ctrl); -+ local_irq_restore(flags); -+ - return ret; - } - - static int mdiobb_write(struct mii_bus *bus, int phy, int reg, u16 val) - { - struct mdiobb_ctrl *ctrl = bus->priv; -+ unsigned long flags; - -+ local_irq_save(flags); - if (reg & MII_ADDR_C45) { - reg = mdiobb_cmd_addr(ctrl, phy, reg); - mdiobb_cmd(ctrl, MDIO_C45_WRITE, phy, reg); -@@ -187,6 +194,8 @@ static int mdiobb_write(struct mii_bus * - - ctrl->ops->set_mdio_dir(ctrl, 0); - mdiobb_get_bit(ctrl); -+ local_irq_restore(flags); -+ - return 0; - } - diff --git a/target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch b/target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch deleted file mode 100644 index aa60c0523e..0000000000 --- a/target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch +++ /dev/null @@ -1,869 +0,0 @@ ---- a/arch/mips/include/asm/checksum.h -+++ b/arch/mips/include/asm/checksum.h -@@ -100,26 +100,30 @@ static inline __sum16 ip_fast_csum(const - const unsigned int *stop = word + ihl; - unsigned int csum; - int carry; -+ unsigned int w; - -- csum = word[0]; -- csum += word[1]; -- carry = (csum < word[1]); -+ csum = net_hdr_word(word++); -+ -+ w = net_hdr_word(word++); -+ csum += w; -+ carry = (csum < w); - csum += carry; - -- csum += word[2]; -- carry = (csum < word[2]); -+ w = net_hdr_word(word++); -+ csum += w; -+ carry = (csum < w); - csum += carry; - -- csum += word[3]; -- carry = (csum < word[3]); -+ w = net_hdr_word(word++); -+ csum += w; -+ carry = (csum < w); - csum += carry; - -- word += 4; - do { -- csum += *word; -- carry = (csum < *word); -+ w = net_hdr_word(word++); -+ csum += w; -+ carry = (csum < w); - csum += carry; -- word++; - } while (word != stop); - - return csum_fold(csum); -@@ -180,73 +184,6 @@ static inline __sum16 ip_compute_csum(co - return csum_fold(csum_partial(buff, len, 0)); - } - --#define _HAVE_ARCH_IPV6_CSUM --static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr, -- const struct in6_addr *daddr, -- __u32 len, __u8 proto, -- __wsum sum) --{ -- __wsum tmp; -- -- __asm__( -- " .set push # csum_ipv6_magic\n" -- " .set noreorder \n" -- " .set noat \n" -- " addu %0, %5 # proto (long in network byte order)\n" -- " sltu $1, %0, %5 \n" -- " addu %0, $1 \n" -- -- " addu %0, %6 # csum\n" -- " sltu $1, %0, %6 \n" -- " lw %1, 0(%2) # four words source address\n" -- " addu %0, $1 \n" -- " addu %0, %1 \n" -- " sltu $1, %0, %1 \n" -- -- " lw %1, 4(%2) \n" -- " addu %0, $1 \n" -- " addu %0, %1 \n" -- " sltu $1, %0, %1 \n" -- -- " lw %1, 8(%2) \n" -- " addu %0, $1 \n" -- " addu %0, %1 \n" -- " sltu $1, %0, %1 \n" -- -- " lw %1, 12(%2) \n" -- " addu %0, $1 \n" -- " addu %0, %1 \n" -- " sltu $1, %0, %1 \n" -- -- " lw %1, 0(%3) \n" -- " addu %0, $1 \n" -- " addu %0, %1 \n" -- " sltu $1, %0, %1 \n" -- -- " lw %1, 4(%3) \n" -- " addu %0, $1 \n" -- " addu %0, %1 \n" -- " sltu $1, %0, %1 \n" -- -- " lw %1, 8(%3) \n" -- " addu %0, $1 \n" -- " addu %0, %1 \n" -- " sltu $1, %0, %1 \n" -- -- " lw %1, 12(%3) \n" -- " addu %0, $1 \n" -- " addu %0, %1 \n" -- " sltu $1, %0, %1 \n" -- -- " addu %0, $1 # Add final carry\n" -- " .set pop" -- : "=&r" (sum), "=&r" (tmp) -- : "r" (saddr), "r" (daddr), -- "0" (htonl(len)), "r" (htonl(proto)), "r" (sum)); -- -- return csum_fold(sum); --} -- - #include - #endif /* CONFIG_GENERIC_CSUM */ - ---- a/include/uapi/linux/ip.h -+++ b/include/uapi/linux/ip.h -@@ -106,7 +106,7 @@ struct iphdr { - __be32 daddr; - ); - /*The options start here. */ --}; -+} __attribute__((packed, aligned(2))); - - - struct ip_auth_hdr { ---- a/include/uapi/linux/ipv6.h -+++ b/include/uapi/linux/ipv6.h -@@ -135,7 +135,7 @@ struct ipv6hdr { - struct in6_addr saddr; - struct in6_addr daddr; - ); --}; -+} __attribute__((packed, aligned(2))); - - - /* index values for the variables in ipv6_devconf */ ---- a/include/uapi/linux/tcp.h -+++ b/include/uapi/linux/tcp.h -@@ -55,7 +55,7 @@ struct tcphdr { - __be16 window; - __sum16 check; - __be16 urg_ptr; --}; -+} __attribute__((packed, aligned(2))); - - /* - * The union cast uses a gcc extension to avoid aliasing problems -@@ -65,7 +65,7 @@ struct tcphdr { - union tcp_word_hdr { - struct tcphdr hdr; - __be32 words[5]; --}; -+} __attribute__((packed, aligned(2))); - - #define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3]) - ---- a/include/uapi/linux/udp.h -+++ b/include/uapi/linux/udp.h -@@ -25,7 +25,7 @@ struct udphdr { - __be16 dest; - __be16 len; - __sum16 check; --}; -+} __attribute__((packed, aligned(2))); - - /* UDP socket options */ - #define UDP_CORK 1 /* Never send partially complete segments */ ---- a/net/netfilter/nf_conntrack_core.c -+++ b/net/netfilter/nf_conntrack_core.c -@@ -271,8 +271,8 @@ nf_ct_get_tuple(const struct sk_buff *sk - - switch (l3num) { - case NFPROTO_IPV4: -- tuple->src.u3.ip = ap[0]; -- tuple->dst.u3.ip = ap[1]; -+ tuple->src.u3.ip = net_hdr_word(ap++); -+ tuple->dst.u3.ip = net_hdr_word(ap); - break; - case NFPROTO_IPV6: - memcpy(tuple->src.u3.ip6, ap, sizeof(tuple->src.u3.ip6)); ---- a/include/uapi/linux/icmp.h -+++ b/include/uapi/linux/icmp.h -@@ -83,7 +83,7 @@ struct icmphdr { - } frag; - __u8 reserved[4]; - } un; --}; -+} __attribute__((packed, aligned(2))); - - - /* ---- a/include/uapi/linux/in6.h -+++ b/include/uapi/linux/in6.h -@@ -43,7 +43,7 @@ struct in6_addr { - #define s6_addr16 in6_u.u6_addr16 - #define s6_addr32 in6_u.u6_addr32 - #endif --}; -+} __attribute__((packed, aligned(2))); - #endif /* __UAPI_DEF_IN6_ADDR */ - - #if __UAPI_DEF_SOCKADDR_IN6 ---- a/net/ipv6/tcp_ipv6.c -+++ b/net/ipv6/tcp_ipv6.c -@@ -35,6 +35,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -927,10 +928,10 @@ static void tcp_v6_send_response(const s - topt = (__be32 *)(t1 + 1); - - if (tsecr) { -- *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | -- (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP); -- *topt++ = htonl(tsval); -- *topt++ = htonl(tsecr); -+ put_unaligned_be32((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | -+ (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP, topt++); -+ put_unaligned_be32(tsval, topt++); -+ put_unaligned_be32(tsecr, topt++); - } - - #ifdef CONFIG_TCP_MD5SIG ---- a/include/linux/ipv6.h -+++ b/include/linux/ipv6.h -@@ -6,6 +6,7 @@ - - #define ipv6_optlen(p) (((p)->hdrlen+1) << 3) - #define ipv6_authlen(p) (((p)->hdrlen+2) << 2) -+ - /* - * This structure contains configuration options per IPv6 link. - */ ---- a/net/ipv6/datagram.c -+++ b/net/ipv6/datagram.c -@@ -492,7 +492,7 @@ int ipv6_recv_error(struct sock *sk, str - ipv6_iface_scope_id(&sin->sin6_addr, - IP6CB(skb)->iif); - } else { -- ipv6_addr_set_v4mapped(*(__be32 *)(nh + serr->addr_offset), -+ ipv6_addr_set_v4mapped(net_hdr_word(nh + serr->addr_offset), - &sin->sin6_addr); - sin->sin6_scope_id = 0; - } -@@ -846,12 +846,12 @@ int ip6_datagram_send_ctl(struct net *ne - } - - if (fl6->flowlabel&IPV6_FLOWINFO_MASK) { -- if ((fl6->flowlabel^*(__be32 *)CMSG_DATA(cmsg))&~IPV6_FLOWINFO_MASK) { -+ if ((fl6->flowlabel^net_hdr_word(CMSG_DATA(cmsg)))&~IPV6_FLOWINFO_MASK) { - err = -EINVAL; - goto exit_f; - } - } -- fl6->flowlabel = IPV6_FLOWINFO_MASK & *(__be32 *)CMSG_DATA(cmsg); -+ fl6->flowlabel = IPV6_FLOWINFO_MASK & net_hdr_word(CMSG_DATA(cmsg)); - break; - - case IPV6_2292HOPOPTS: ---- a/net/ipv6/exthdrs.c -+++ b/net/ipv6/exthdrs.c -@@ -948,7 +948,7 @@ static bool ipv6_hop_jumbo(struct sk_buf - goto drop; - } - -- pkt_len = ntohl(*(__be32 *)(nh + optoff + 2)); -+ pkt_len = ntohl(net_hdr_word(nh + optoff + 2)); - if (pkt_len <= IPV6_MAXPLEN) { - __IP6_INC_STATS(net, idev, IPSTATS_MIB_INHDRERRORS); - icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2); ---- a/include/linux/types.h -+++ b/include/linux/types.h -@@ -227,5 +227,11 @@ typedef void (*swap_func_t)(void *a, voi - typedef int (*cmp_r_func_t)(const void *a, const void *b, const void *priv); - typedef int (*cmp_func_t)(const void *a, const void *b); - -+struct net_hdr_word { -+ u32 words[1]; -+} __attribute__((packed, aligned(2))); -+ -+#define net_hdr_word(_p) (((struct net_hdr_word *) (_p))->words[0]) -+ - #endif /* __ASSEMBLY__ */ - #endif /* _LINUX_TYPES_H */ ---- a/net/ipv4/af_inet.c -+++ b/net/ipv4/af_inet.c -@@ -1469,8 +1469,8 @@ struct sk_buff *inet_gro_receive(struct - if (unlikely(ip_fast_csum((u8 *)iph, 5))) - goto out_unlock; - -- id = ntohl(*(__be32 *)&iph->id); -- flush = (u16)((ntohl(*(__be32 *)iph) ^ skb_gro_len(skb)) | (id & ~IP_DF)); -+ id = ntohl(net_hdr_word(&iph->id)); -+ flush = (u16)((ntohl(net_hdr_word(iph)) ^ skb_gro_len(skb)) | (id & ~IP_DF)); - id >>= 16; - - list_for_each_entry(p, head, list) { ---- a/net/ipv4/tcp_output.c -+++ b/net/ipv4/tcp_output.c -@@ -609,48 +609,53 @@ static void tcp_options_write(__be32 *pt - u16 options = opts->options; /* mungable copy */ - - if (unlikely(OPTION_MD5 & options)) { -- *ptr++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | -- (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG); -+ net_hdr_word(ptr++) = -+ htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | -+ (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG); - /* overload cookie hash location */ - opts->hash_location = (__u8 *)ptr; - ptr += 4; - } - - if (unlikely(opts->mss)) { -- *ptr++ = htonl((TCPOPT_MSS << 24) | -- (TCPOLEN_MSS << 16) | -- opts->mss); -+ net_hdr_word(ptr++) = -+ htonl((TCPOPT_MSS << 24) | (TCPOLEN_MSS << 16) | -+ opts->mss); - } - - if (likely(OPTION_TS & options)) { - if (unlikely(OPTION_SACK_ADVERTISE & options)) { -- *ptr++ = htonl((TCPOPT_SACK_PERM << 24) | -- (TCPOLEN_SACK_PERM << 16) | -- (TCPOPT_TIMESTAMP << 8) | -- TCPOLEN_TIMESTAMP); -+ net_hdr_word(ptr++) = -+ htonl((TCPOPT_SACK_PERM << 24) | -+ (TCPOLEN_SACK_PERM << 16) | -+ (TCPOPT_TIMESTAMP << 8) | -+ TCPOLEN_TIMESTAMP); - options &= ~OPTION_SACK_ADVERTISE; - } else { -- *ptr++ = htonl((TCPOPT_NOP << 24) | -- (TCPOPT_NOP << 16) | -- (TCPOPT_TIMESTAMP << 8) | -- TCPOLEN_TIMESTAMP); -+ net_hdr_word(ptr++) = -+ htonl((TCPOPT_NOP << 24) | -+ (TCPOPT_NOP << 16) | -+ (TCPOPT_TIMESTAMP << 8) | -+ TCPOLEN_TIMESTAMP); - } -- *ptr++ = htonl(opts->tsval); -- *ptr++ = htonl(opts->tsecr); -+ net_hdr_word(ptr++) = htonl(opts->tsval); -+ net_hdr_word(ptr++) = htonl(opts->tsecr); - } - - if (unlikely(OPTION_SACK_ADVERTISE & options)) { -- *ptr++ = htonl((TCPOPT_NOP << 24) | -- (TCPOPT_NOP << 16) | -- (TCPOPT_SACK_PERM << 8) | -- TCPOLEN_SACK_PERM); -+ net_hdr_word(ptr++) = -+ htonl((TCPOPT_NOP << 24) | -+ (TCPOPT_NOP << 16) | -+ (TCPOPT_SACK_PERM << 8) | -+ TCPOLEN_SACK_PERM); - } - - if (unlikely(OPTION_WSCALE & options)) { -- *ptr++ = htonl((TCPOPT_NOP << 24) | -- (TCPOPT_WINDOW << 16) | -- (TCPOLEN_WINDOW << 8) | -- opts->ws); -+ net_hdr_word(ptr++) = -+ htonl((TCPOPT_NOP << 24) | -+ (TCPOPT_WINDOW << 16) | -+ (TCPOLEN_WINDOW << 8) | -+ opts->ws); - } - - if (unlikely(opts->num_sack_blocks)) { -@@ -658,16 +663,17 @@ static void tcp_options_write(__be32 *pt - tp->duplicate_sack : tp->selective_acks; - int this_sack; - -- *ptr++ = htonl((TCPOPT_NOP << 24) | -- (TCPOPT_NOP << 16) | -- (TCPOPT_SACK << 8) | -- (TCPOLEN_SACK_BASE + (opts->num_sack_blocks * -+ net_hdr_word(ptr++) = -+ htonl((TCPOPT_NOP << 24) | -+ (TCPOPT_NOP << 16) | -+ (TCPOPT_SACK << 8) | -+ (TCPOLEN_SACK_BASE + (opts->num_sack_blocks * - TCPOLEN_SACK_PERBLOCK))); - - for (this_sack = 0; this_sack < opts->num_sack_blocks; - ++this_sack) { -- *ptr++ = htonl(sp[this_sack].start_seq); -- *ptr++ = htonl(sp[this_sack].end_seq); -+ net_hdr_word(ptr++) = htonl(sp[this_sack].start_seq); -+ net_hdr_word(ptr++) = htonl(sp[this_sack].end_seq); - } - - tp->rx_opt.dsack = 0; -@@ -680,13 +686,14 @@ static void tcp_options_write(__be32 *pt - - if (foc->exp) { - len = TCPOLEN_EXP_FASTOPEN_BASE + foc->len; -- *ptr = htonl((TCPOPT_EXP << 24) | (len << 16) | -+ net_hdr_word(ptr) = -+ htonl((TCPOPT_EXP << 24) | (len << 16) | - TCPOPT_FASTOPEN_MAGIC); - p += TCPOLEN_EXP_FASTOPEN_BASE; - } else { - len = TCPOLEN_FASTOPEN_BASE + foc->len; -- *p++ = TCPOPT_FASTOPEN; -- *p++ = len; -+ net_hdr_word(p++) = TCPOPT_FASTOPEN; -+ net_hdr_word(p++) = len; - } - - memcpy(p, foc->val, foc->len); ---- a/include/uapi/linux/igmp.h -+++ b/include/uapi/linux/igmp.h -@@ -33,7 +33,7 @@ struct igmphdr { - __u8 code; /* For newer IGMP */ - __sum16 csum; - __be32 group; --}; -+} __attribute__((packed, aligned(2))); - - /* V3 group record types [grec_type] */ - #define IGMPV3_MODE_IS_INCLUDE 1 -@@ -49,7 +49,7 @@ struct igmpv3_grec { - __be16 grec_nsrcs; - __be32 grec_mca; - __be32 grec_src[0]; --}; -+} __attribute__((packed, aligned(2))); - - struct igmpv3_report { - __u8 type; -@@ -58,7 +58,7 @@ struct igmpv3_report { - __be16 resv2; - __be16 ngrec; - struct igmpv3_grec grec[0]; --}; -+} __attribute__((packed, aligned(2))); - - struct igmpv3_query { - __u8 type; -@@ -79,7 +79,7 @@ struct igmpv3_query { - __u8 qqic; - __be16 nsrcs; - __be32 srcs[0]; --}; -+} __attribute__((packed, aligned(2))); - - #define IGMP_HOST_MEMBERSHIP_QUERY 0x11 /* From RFC1112 */ - #define IGMP_HOST_MEMBERSHIP_REPORT 0x12 /* Ditto */ ---- a/net/core/flow_dissector.c -+++ b/net/core/flow_dissector.c -@@ -128,7 +128,7 @@ __be32 __skb_flow_get_ports(const struct - ports = __skb_header_pointer(skb, thoff + poff, - sizeof(_ports), data, hlen, &_ports); - if (ports) -- return *ports; -+ return (__be32)net_hdr_word(ports); - } - - return 0; ---- a/include/uapi/linux/icmpv6.h -+++ b/include/uapi/linux/icmpv6.h -@@ -78,7 +78,7 @@ struct icmp6hdr { - #define icmp6_addrconf_other icmp6_dataun.u_nd_ra.other - #define icmp6_rt_lifetime icmp6_dataun.u_nd_ra.rt_lifetime - #define icmp6_router_pref icmp6_dataun.u_nd_ra.router_pref --}; -+} __attribute__((packed, aligned(2))); - - - #define ICMPV6_ROUTER_PREF_LOW 0x3 ---- a/include/net/ndisc.h -+++ b/include/net/ndisc.h -@@ -93,7 +93,7 @@ struct ra_msg { - struct icmp6hdr icmph; - __be32 reachable_time; - __be32 retrans_timer; --}; -+} __attribute__((packed, aligned(2))); - - struct rd_msg { - struct icmp6hdr icmph; -@@ -372,10 +372,10 @@ static inline u32 ndisc_hashfn(const voi - { - const u32 *p32 = pkey; - -- return (((p32[0] ^ hash32_ptr(dev)) * hash_rnd[0]) + -- (p32[1] * hash_rnd[1]) + -- (p32[2] * hash_rnd[2]) + -- (p32[3] * hash_rnd[3])); -+ return (((net_hdr_word(&p32[0]) ^ hash32_ptr(dev)) * hash_rnd[0]) + -+ (net_hdr_word(&p32[1]) * hash_rnd[1]) + -+ (net_hdr_word(&p32[2]) * hash_rnd[2]) + -+ (net_hdr_word(&p32[3]) * hash_rnd[3])); - } - - static inline struct neighbour *__ipv6_neigh_lookup_noref(struct net_device *dev, const void *pkey) ---- a/net/sched/cls_u32.c -+++ b/net/sched/cls_u32.c -@@ -155,7 +155,7 @@ next_knode: - data = skb_header_pointer(skb, toff, 4, &hdata); - if (!data) - goto out; -- if ((*data ^ key->val) & key->mask) { -+ if ((net_hdr_word(data) ^ key->val) & key->mask) { - n = rcu_dereference_bh(n->next); - goto next_knode; - } -@@ -206,8 +206,8 @@ check_terminal: - &hdata); - if (!data) - goto out; -- sel = ht->divisor & u32_hash_fold(*data, &n->sel, -- n->fshift); -+ sel = ht->divisor & u32_hash_fold(net_hdr_word(data), -+ &n->sel, n->fshift); - } - if (!(n->sel.flags & (TC_U32_VAROFFSET | TC_U32_OFFSET | TC_U32_EAT))) - goto next_ht; ---- a/net/ipv6/ip6_offload.c -+++ b/net/ipv6/ip6_offload.c -@@ -240,7 +240,7 @@ INDIRECT_CALLABLE_SCOPE struct sk_buff * - continue; - - iph2 = (struct ipv6hdr *)(p->data + off); -- first_word = *(__be32 *)iph ^ *(__be32 *)iph2; -+ first_word = net_hdr_word(iph) ^ net_hdr_word(iph2); - - /* All fields must match except length and Traffic Class. - * XXX skbs on the gro_list have all been parsed and pulled ---- a/include/net/addrconf.h -+++ b/include/net/addrconf.h -@@ -47,7 +47,7 @@ struct prefix_info { - __be32 reserved2; - - struct in6_addr prefix; --}; -+} __attribute__((packed, aligned(2))); - - #include - #include ---- a/include/net/inet_ecn.h -+++ b/include/net/inet_ecn.h -@@ -140,9 +140,9 @@ static inline int IP6_ECN_set_ce(struct - if (INET_ECN_is_not_ect(ipv6_get_dsfield(iph))) - return 0; - -- from = *(__be32 *)iph; -+ from = net_hdr_word(iph); - to = from | htonl(INET_ECN_CE << 20); -- *(__be32 *)iph = to; -+ net_hdr_word(iph) = to; - if (skb->ip_summed == CHECKSUM_COMPLETE) - skb->csum = csum_add(csum_sub(skb->csum, (__force __wsum)from), - (__force __wsum)to); ---- a/include/net/ipv6.h -+++ b/include/net/ipv6.h -@@ -146,7 +146,7 @@ struct frag_hdr { - __u8 reserved; - __be16 frag_off; - __be32 identification; --}; -+} __attribute__((packed, aligned(2))); - - #define IP6_MF 0x0001 - #define IP6_OFFSET 0xFFF8 -@@ -560,8 +560,8 @@ static inline void __ipv6_addr_set_half( - } - #endif - #endif -- addr[0] = wh; -- addr[1] = wl; -+ net_hdr_word(&addr[0]) = wh; -+ net_hdr_word(&addr[1]) = wl; - } - - static inline void ipv6_addr_set(struct in6_addr *addr, -@@ -620,6 +620,8 @@ static inline bool ipv6_prefix_equal(con - const __be32 *a1 = addr1->s6_addr32; - const __be32 *a2 = addr2->s6_addr32; - unsigned int pdw, pbi; -+ /* Used for last <32-bit fraction of prefix */ -+ u32 pbia1, pbia2; - - /* check complete u32 in prefix */ - pdw = prefixlen >> 5; -@@ -628,7 +630,9 @@ static inline bool ipv6_prefix_equal(con - - /* check incomplete u32 in prefix */ - pbi = prefixlen & 0x1f; -- if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi)))) -+ pbia1 = net_hdr_word(&a1[pdw]); -+ pbia2 = net_hdr_word(&a2[pdw]); -+ if (pbi && ((pbia1 ^ pbia2) & htonl((0xffffffff) << (32 - pbi)))) - return false; - - return true; -@@ -749,13 +753,13 @@ static inline void ipv6_addr_set_v4mappe - */ - static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen) - { -- const __be32 *a1 = token1, *a2 = token2; -+ const struct in6_addr *a1 = token1, *a2 = token2; - int i; - - addrlen >>= 2; - - for (i = 0; i < addrlen; i++) { -- __be32 xb = a1[i] ^ a2[i]; -+ __be32 xb = a1->s6_addr32[i] ^ a2->s6_addr32[i]; - if (xb) - return i * 32 + 31 - __fls(ntohl(xb)); - } -@@ -941,17 +945,18 @@ static inline int ip6_multipath_hash_pol - static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass, - __be32 flowlabel) - { -- *(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | flowlabel; -+ net_hdr_word((__be32 *)hdr) = -+ htonl(0x60000000 | (tclass << 20)) | flowlabel; - } - - static inline __be32 ip6_flowinfo(const struct ipv6hdr *hdr) - { -- return *(__be32 *)hdr & IPV6_FLOWINFO_MASK; -+ return net_hdr_word((__be32 *)hdr) & IPV6_FLOWINFO_MASK; - } - - static inline __be32 ip6_flowlabel(const struct ipv6hdr *hdr) - { -- return *(__be32 *)hdr & IPV6_FLOWLABEL_MASK; -+ return net_hdr_word((__be32 *)hdr) & IPV6_FLOWLABEL_MASK; - } - - static inline u8 ip6_tclass(__be32 flowinfo) ---- a/include/net/secure_seq.h -+++ b/include/net/secure_seq.h -@@ -3,6 +3,7 @@ - #define _NET_SECURE_SEQ - - #include -+#include - - u64 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport); - u64 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, ---- a/include/uapi/linux/in.h -+++ b/include/uapi/linux/in.h -@@ -88,7 +88,7 @@ enum { - /* Internet address. */ - struct in_addr { - __be32 s_addr; --}; -+} __attribute__((packed, aligned(2))); - #endif - - #define IP_TOS 1 ---- a/net/ipv6/ip6_fib.c -+++ b/net/ipv6/ip6_fib.c -@@ -140,7 +140,7 @@ static __be32 addr_bit_set(const void *t - * See include/asm-generic/bitops/le.h. - */ - return (__force __be32)(1 << ((~fn_bit ^ BITOP_BE32_SWIZZLE) & 0x1f)) & -- addr[fn_bit >> 5]; -+ net_hdr_word(&addr[fn_bit >> 5]); - } - - struct fib6_info *fib6_info_alloc(gfp_t gfp_flags, bool with_fib6_nh) ---- a/net/netfilter/nf_conntrack_proto_tcp.c -+++ b/net/netfilter/nf_conntrack_proto_tcp.c -@@ -415,7 +415,7 @@ static void tcp_sack(const struct sk_buf - - /* Fast path for timestamp-only option */ - if (length == TCPOLEN_TSTAMP_ALIGNED -- && *(__be32 *)ptr == htonl((TCPOPT_NOP << 24) -+ && net_hdr_word(ptr) == htonl((TCPOPT_NOP << 24) - | (TCPOPT_NOP << 16) - | (TCPOPT_TIMESTAMP << 8) - | TCPOLEN_TIMESTAMP)) ---- a/net/xfrm/xfrm_input.c -+++ b/net/xfrm/xfrm_input.c -@@ -165,8 +165,8 @@ int xfrm_parse_spi(struct sk_buff *skb, - if (!pskb_may_pull(skb, hlen)) - return -EINVAL; - -- *spi = *(__be32 *)(skb_transport_header(skb) + offset); -- *seq = *(__be32 *)(skb_transport_header(skb) + offset_seq); -+ *spi = net_hdr_word(skb_transport_header(skb) + offset); -+ *seq = net_hdr_word(skb_transport_header(skb) + offset_seq); - return 0; - } - EXPORT_SYMBOL(xfrm_parse_spi); ---- a/net/ipv4/tcp_input.c -+++ b/net/ipv4/tcp_input.c -@@ -4128,14 +4128,16 @@ static bool tcp_parse_aligned_timestamp( - { - const __be32 *ptr = (const __be32 *)(th + 1); - -- if (*ptr == htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) -- | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { -+ if (net_hdr_word(ptr) == -+ htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | -+ (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { - tp->rx_opt.saw_tstamp = 1; - ++ptr; -- tp->rx_opt.rcv_tsval = ntohl(*ptr); -+ tp->rx_opt.rcv_tsval = get_unaligned_be32(ptr); - ++ptr; -- if (*ptr) -- tp->rx_opt.rcv_tsecr = ntohl(*ptr) - tp->tsoffset; -+ if (net_hdr_word(ptr)) -+ tp->rx_opt.rcv_tsecr = get_unaligned_be32(ptr) - -+ tp->tsoffset; - else - tp->rx_opt.rcv_tsecr = 0; - return true; ---- a/include/uapi/linux/if_pppox.h -+++ b/include/uapi/linux/if_pppox.h -@@ -51,6 +51,7 @@ struct pppoe_addr { - */ - struct pptp_addr { - __u16 call_id; -+ __u16 pad; - struct in_addr sin_addr; - }; - ---- a/net/ipv6/netfilter/nf_log_ipv6.c -+++ b/net/ipv6/netfilter/nf_log_ipv6.c -@@ -63,9 +63,9 @@ static void dump_ipv6_packet(struct net - /* Max length: 44 "LEN=65535 TC=255 HOPLIMIT=255 FLOWLBL=FFFFF " */ - nf_log_buf_add(m, "LEN=%zu TC=%u HOPLIMIT=%u FLOWLBL=%u ", - ntohs(ih->payload_len) + sizeof(struct ipv6hdr), -- (ntohl(*(__be32 *)ih) & 0x0ff00000) >> 20, -+ (ntohl(net_hdr_word(ih)) & 0x0ff00000) >> 20, - ih->hop_limit, -- (ntohl(*(__be32 *)ih) & 0x000fffff)); -+ (ntohl(net_hdr_word(ih)) & 0x000fffff)); - - fragment = 0; - ptr = ip6hoff + sizeof(struct ipv6hdr); ---- a/include/net/neighbour.h -+++ b/include/net/neighbour.h -@@ -275,8 +275,10 @@ static inline bool neigh_key_eq128(const - const u32 *n32 = (const u32 *)n->primary_key; - const u32 *p32 = pkey; - -- return ((n32[0] ^ p32[0]) | (n32[1] ^ p32[1]) | -- (n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0; -+ return ((n32[0] ^ net_hdr_word(&p32[0])) | -+ (n32[1] ^ net_hdr_word(&p32[1])) | -+ (n32[2] ^ net_hdr_word(&p32[2])) | -+ (n32[3] ^ net_hdr_word(&p32[3]))) == 0; - } - - static inline struct neighbour *___neigh_lookup_noref( ---- a/include/uapi/linux/netfilter_arp/arp_tables.h -+++ b/include/uapi/linux/netfilter_arp/arp_tables.h -@@ -70,7 +70,7 @@ struct arpt_arp { - __u8 flags; - /* Inverse flags */ - __u16 invflags; --}; -+} __attribute__((aligned(4))); - - /* Values for "flag" field in struct arpt_ip (general arp structure). - * No flags defined yet. ---- a/net/core/utils.c -+++ b/net/core/utils.c -@@ -460,8 +460,14 @@ void inet_proto_csum_replace16(__sum16 * - bool pseudohdr) - { - __be32 diff[] = { -- ~from[0], ~from[1], ~from[2], ~from[3], -- to[0], to[1], to[2], to[3], -+ ~net_hdr_word(&from[0]), -+ ~net_hdr_word(&from[1]), -+ ~net_hdr_word(&from[2]), -+ ~net_hdr_word(&from[3]), -+ net_hdr_word(&to[0]), -+ net_hdr_word(&to[1]), -+ net_hdr_word(&to[2]), -+ net_hdr_word(&to[3]), - }; - if (skb->ip_summed != CHECKSUM_PARTIAL) { - *sum = csum_fold(csum_partial(diff, sizeof(diff), ---- a/include/linux/etherdevice.h -+++ b/include/linux/etherdevice.h -@@ -499,7 +499,7 @@ static inline bool is_etherdev_addr(cons - * @b: Pointer to Ethernet header - * - * Compare two Ethernet headers, returns 0 if equal. -- * This assumes that the network header (i.e., IP header) is 4-byte -+ * This assumes that the network header (i.e., IP header) is 2-byte - * aligned OR the platform can handle unaligned access. This is the - * case for all packets coming into netif_receive_skb or similar - * entry points. -@@ -522,11 +522,12 @@ static inline unsigned long compare_ethe - fold |= *(unsigned long *)(a + 6) ^ *(unsigned long *)(b + 6); - return fold; - #else -- u32 *a32 = (u32 *)((u8 *)a + 2); -- u32 *b32 = (u32 *)((u8 *)b + 2); -+ const u16 *a16 = a; -+ const u16 *b16 = b; - -- return (*(u16 *)a ^ *(u16 *)b) | (a32[0] ^ b32[0]) | -- (a32[1] ^ b32[1]) | (a32[2] ^ b32[2]); -+ return (a16[0] ^ b16[0]) | (a16[1] ^ b16[1]) | (a16[2] ^ b16[2]) | -+ (a16[3] ^ b16[3]) | (a16[4] ^ b16[4]) | (a16[5] ^ b16[5]) | -+ (a16[6] ^ b16[6]); - #endif - } - ---- a/net/ipv4/tcp_offload.c -+++ b/net/ipv4/tcp_offload.c -@@ -223,7 +223,7 @@ struct sk_buff *tcp_gro_receive(struct l - - th2 = tcp_hdr(p); - -- if (*(u32 *)&th->source ^ *(u32 *)&th2->source) { -+ if (net_hdr_word(&th->source) ^ net_hdr_word(&th2->source)) { - NAPI_GRO_CB(p)->same_flow = 0; - continue; - } -@@ -241,8 +241,8 @@ found: - ~(TCP_FLAG_CWR | TCP_FLAG_FIN | TCP_FLAG_PSH)); - flush |= (__force int)(th->ack_seq ^ th2->ack_seq); - for (i = sizeof(*th); i < thlen; i += 4) -- flush |= *(u32 *)((u8 *)th + i) ^ -- *(u32 *)((u8 *)th2 + i); -+ flush |= net_hdr_word((u8 *)th + i) ^ -+ net_hdr_word((u8 *)th2 + i); - - /* When we receive our second frame we can made a decision on if we - * continue this flow as an atomic flow with a fixed ID or if we use ---- a/net/ipv6/netfilter/ip6table_mangle.c -+++ b/net/ipv6/netfilter/ip6table_mangle.c -@@ -47,7 +47,7 @@ ip6t_mangle_out(struct sk_buff *skb, con - hop_limit = ipv6_hdr(skb)->hop_limit; - - /* flowlabel and prio (includes version, which shouldn't change either */ -- flowlabel = *((u_int32_t *)ipv6_hdr(skb)); -+ flowlabel = net_hdr_word(ipv6_hdr(skb)); - - ret = ip6t_do_table(skb, state, state->net->ipv6.ip6table_mangle); - -@@ -56,7 +56,7 @@ ip6t_mangle_out(struct sk_buff *skb, con - !ipv6_addr_equal(&ipv6_hdr(skb)->daddr, &daddr) || - skb->mark != mark || - ipv6_hdr(skb)->hop_limit != hop_limit || -- flowlabel != *((u_int32_t *)ipv6_hdr(skb)))) { -+ flowlabel != net_hdr_word(ipv6_hdr(skb)))) { - err = ip6_route_me_harder(state->net, state->sk, skb); - if (err < 0) - ret = NF_DROP_ERR(err); diff --git a/target/linux/ath79/patches-5.10/920-mikrotik-rb4xx.patch b/target/linux/ath79/patches-5.10/920-mikrotik-rb4xx.patch deleted file mode 100644 index 4ed13deb5c..0000000000 --- a/target/linux/ath79/patches-5.10/920-mikrotik-rb4xx.patch +++ /dev/null @@ -1,76 +0,0 @@ ---- a/drivers/mfd/Kconfig -+++ b/drivers/mfd/Kconfig -@@ -2142,6 +2142,14 @@ config RAVE_SP_CORE - Select this to get support for the Supervisory Processor - device found on several devices in RAVE line of hardware. - -+config MFD_RB4XX_CPLD -+ tristate "CPLD driver for Mikrotik RB4xx series boards" -+ select MFD_CORE -+ depends on ATH79 || COMPILE_TEST -+ help -+ Enables support for the CPLD chip (NAND & GPIO) on Mikrotik -+ Routerboard RB4xx series. -+ - config SGI_MFD_IOC3 - tristate "SGI IOC3 core driver" - depends on PCI && MIPS && 64BIT ---- a/drivers/mfd/Makefile -+++ b/drivers/mfd/Makefile -@@ -264,6 +264,7 @@ obj-$(CONFIG_MFD_ROHM_BD718XX) += rohm-b - obj-$(CONFIG_MFD_STMFX) += stmfx.o - obj-$(CONFIG_MFD_KHADAS_MCU) += khadas-mcu.o - -+obj-$(CONFIG_MFD_RB4XX_CPLD) += rb4xx-cpld.o - obj-$(CONFIG_SGI_MFD_IOC3) += ioc3.o - obj-$(CONFIG_MFD_SIMPLE_MFD_I2C) += simple-mfd-i2c.o - obj-$(CONFIG_MFD_INTEL_M10_BMC) += intel-m10-bmc.o ---- a/drivers/gpio/Kconfig -+++ b/drivers/gpio/Kconfig -@@ -1520,6 +1520,12 @@ config GPIO_SODAVILLE - help - Say Y here to support Intel Sodaville GPIO. - -+config GPIO_RB4XX -+ tristate "GPIO expander for Mikrotik RB4xx series boards" -+ depends on MFD_RB4XX_CPLD -+ help -+ GPIO driver for Mikrotik Routerboard RB4xx series. -+ - endmenu - - menu "SPI GPIO expanders" ---- a/drivers/gpio/Makefile -+++ b/drivers/gpio/Makefile -@@ -121,6 +121,7 @@ obj-$(CONFIG_GPIO_PL061) += gpio-pl061. - obj-$(CONFIG_GPIO_PMIC_EIC_SPRD) += gpio-pmic-eic-sprd.o - obj-$(CONFIG_GPIO_PXA) += gpio-pxa.o - obj-$(CONFIG_GPIO_RASPBERRYPI_EXP) += gpio-raspberrypi-exp.o -+obj-$(CONFIG_GPIO_RB4XX) += gpio-rb4xx.o - obj-$(CONFIG_GPIO_RC5T583) += gpio-rc5t583.o - obj-$(CONFIG_GPIO_RCAR) += gpio-rcar.o - obj-$(CONFIG_GPIO_RDA) += gpio-rda.o ---- a/drivers/mtd/nand/raw/Kconfig -+++ b/drivers/mtd/nand/raw/Kconfig -@@ -564,4 +564,11 @@ config MTD_NAND_AR934X - Enables support for NAND controller on Qualcomm Atheros SoCs. - This controller is found on AR934x and QCA955x SoCs. - -+config MTD_NAND_RB4XX -+ tristate "Support for NAND driver for Mikrotik RB4xx series boards" -+ depends on MFD_RB4XX_CPLD -+ help -+ Enables support for the NAND flash chip on Mikrotik Routerboard -+ RB4xx series. -+ - endif # MTD_RAW_NAND ---- a/drivers/mtd/nand/raw/Makefile -+++ b/drivers/mtd/nand/raw/Makefile -@@ -59,6 +59,7 @@ obj-$(CONFIG_MTD_NAND_MESON) += meson_n - obj-$(CONFIG_MTD_NAND_CADENCE) += cadence-nand-controller.o - obj-$(CONFIG_MTD_NAND_ARASAN) += arasan-nand-controller.o - obj-$(CONFIG_MTD_NAND_AR934X) += ar934x_nand.o -+obj-$(CONFIG_MTD_NAND_RB4XX) += nand_rb4xx.o - - nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o - nand-objs += nand_onfi.o diff --git a/target/linux/ath79/patches-5.10/939-mikrotik-rb91x.patch b/target/linux/ath79/patches-5.10/939-mikrotik-rb91x.patch deleted file mode 100644 index 4cf6bb08df..0000000000 --- a/target/linux/ath79/patches-5.10/939-mikrotik-rb91x.patch +++ /dev/null @@ -1,68 +0,0 @@ ---- a/drivers/gpio/Kconfig -+++ b/drivers/gpio/Kconfig -@@ -341,6 +341,13 @@ config GPIO_IXP4XX - IXP4xx series of chips. - - If unsure, say N. -+ -+config GPIO_LATCH -+ tristate "MikroTik RouterBOARD GPIO latch support" -+ depends on ATH79 -+ help -+ GPIO driver for latch on some MikroTik RouterBOARDs. -+ - config GPIO_LOGICVC - tristate "Xylon LogiCVC GPIO support" - depends on MFD_SYSCON && OF -@@ -495,6 +502,10 @@ config GPIO_REG - A 32-bit single register GPIO fixed in/out implementation. This - can be used to represent any register as a set of GPIO signals. - -+config GPIO_RB91X_KEY -+ tristate "MikroTik RB91x board series reset key support" -+ depends on ATH79 -+ - config GPIO_SAMA5D2_PIOBU - tristate "SAMA5D2 PIOBU GPIO support" - depends on MFD_SYSCON ---- a/drivers/gpio/Makefile -+++ b/drivers/gpio/Makefile -@@ -73,6 +73,7 @@ obj-$(CONFIG_GPIO_IT87) += gpio-it87.o - obj-$(CONFIG_GPIO_IXP4XX) += gpio-ixp4xx.o - obj-$(CONFIG_GPIO_JANZ_TTL) += gpio-janz-ttl.o - obj-$(CONFIG_GPIO_KEMPLD) += gpio-kempld.o -+obj-$(CONFIG_GPIO_LATCH) += gpio-latch.o - obj-$(CONFIG_GPIO_LOGICVC) += gpio-logicvc.o - obj-$(CONFIG_GPIO_LOONGSON1) += gpio-loongson1.o - obj-$(CONFIG_GPIO_LOONGSON) += gpio-loongson.o -@@ -122,6 +123,7 @@ obj-$(CONFIG_GPIO_PMIC_EIC_SPRD) += gpio - obj-$(CONFIG_GPIO_PXA) += gpio-pxa.o - obj-$(CONFIG_GPIO_RASPBERRYPI_EXP) += gpio-raspberrypi-exp.o - obj-$(CONFIG_GPIO_RB4XX) += gpio-rb4xx.o -+obj-$(CONFIG_GPIO_RB91X_KEY) += gpio-rb91x-key.o - obj-$(CONFIG_GPIO_RC5T583) += gpio-rc5t583.o - obj-$(CONFIG_GPIO_RCAR) += gpio-rcar.o - obj-$(CONFIG_GPIO_RDA) += gpio-rda.o ---- a/drivers/mtd/nand/raw/Kconfig -+++ b/drivers/mtd/nand/raw/Kconfig -@@ -571,4 +571,10 @@ config MTD_NAND_RB4XX - Enables support for the NAND flash chip on Mikrotik Routerboard - RB4xx series. - -+config MTD_NAND_RB91X -+ tristate "MikroTik RB91x NAND driver support" -+ depends on ATH79 && MTD_RAW_NAND -+ help -+ Enables support for the NAND flash chip on MikroTik RB91x series. -+ - endif # MTD_RAW_NAND ---- a/drivers/mtd/nand/raw/Makefile -+++ b/drivers/mtd/nand/raw/Makefile -@@ -60,6 +60,7 @@ obj-$(CONFIG_MTD_NAND_CADENCE) += caden - obj-$(CONFIG_MTD_NAND_ARASAN) += arasan-nand-controller.o - obj-$(CONFIG_MTD_NAND_AR934X) += ar934x_nand.o - obj-$(CONFIG_MTD_NAND_RB4XX) += nand_rb4xx.o -+obj-$(CONFIG_MTD_NAND_RB91X) += rb91x_nand.o - - nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o - nand-objs += nand_onfi.o diff --git a/target/linux/ath79/patches-5.15/0003-leds-add-reset-controller-based-driver.patch b/target/linux/ath79/patches-5.15/0003-leds-add-reset-controller-based-driver.patch new file mode 100644 index 0000000000..7122756c52 --- /dev/null +++ b/target/linux/ath79/patches-5.15/0003-leds-add-reset-controller-based-driver.patch @@ -0,0 +1,186 @@ +From ecbd9c87f073f097d9fe56390353e64e963e866a Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Tue, 6 Mar 2018 10:03:03 +0100 +Subject: [PATCH 03/27] leds: add reset-controller based driver + +Signed-off-by: John Crispin +--- + drivers/leds/Kconfig | 11 ++++ + drivers/leds/Makefile | 1 + + drivers/leds/leds-reset.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 149 insertions(+) + create mode 100644 drivers/leds/leds-reset.c + +--- a/drivers/leds/Kconfig ++++ b/drivers/leds/Kconfig +@@ -876,6 +876,17 @@ source "drivers/leds/blink/Kconfig" + comment "Flash and Torch LED drivers" + source "drivers/leds/flash/Kconfig" + ++config LEDS_RESET ++ tristate "LED support for reset-controller API" ++ depends on LEDS_CLASS ++ depends on RESET_CONTROLLER ++ help ++ This option enables support for LEDs connected to pins driven by reset ++ controllers. Yes, DNI actual built HW like that. ++ ++ To compile this driver as a module, choose M here: the module ++ will be called leds-reset. ++ + comment "LED Triggers" + source "drivers/leds/trigger/Kconfig" + +--- /dev/null ++++ b/drivers/leds/leds-reset.c +@@ -0,0 +1,140 @@ ++/* ++ * Copyright (C) 2018 John Crispin ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++struct reset_led_data { ++ struct led_classdev cdev; ++ struct reset_control *rst; ++}; ++ ++static inline struct reset_led_data * ++ cdev_to_reset_led_data(struct led_classdev *led_cdev) ++{ ++ return container_of(led_cdev, struct reset_led_data, cdev); ++} ++ ++static void reset_led_set(struct led_classdev *led_cdev, ++ enum led_brightness value) ++{ ++ struct reset_led_data *led_dat = cdev_to_reset_led_data(led_cdev); ++ ++ if (value == LED_OFF) ++ reset_control_assert(led_dat->rst); ++ else ++ reset_control_deassert(led_dat->rst); ++} ++ ++struct reset_leds_priv { ++ int num_leds; ++ struct reset_led_data leds[]; ++}; ++ ++static inline int sizeof_reset_leds_priv(int num_leds) ++{ ++ return sizeof(struct reset_leds_priv) + ++ (sizeof(struct reset_led_data) * num_leds); ++} ++ ++static struct reset_leds_priv *reset_leds_create(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct fwnode_handle *child; ++ struct reset_leds_priv *priv; ++ int count, ret; ++ ++ count = device_get_child_node_count(dev); ++ if (!count) ++ return ERR_PTR(-ENODEV); ++ ++ priv = devm_kzalloc(dev, sizeof_reset_leds_priv(count), GFP_KERNEL); ++ if (!priv) ++ return ERR_PTR(-ENOMEM); ++ ++ device_for_each_child_node(dev, child) { ++ struct reset_led_data *led = &priv->leds[priv->num_leds]; ++ struct device_node *np = to_of_node(child); ++ ++ ret = fwnode_property_read_string(child, "label", &led->cdev.name); ++ if (!led->cdev.name) { ++ fwnode_handle_put(child); ++ return ERR_PTR(-EINVAL); ++ } ++ led->rst = __of_reset_control_get(np, NULL, 0, 0, 0, true); ++ if (IS_ERR(led->rst)) ++ return ERR_PTR(-EINVAL); ++ ++ fwnode_property_read_string(child, "linux,default-trigger", ++ &led->cdev.default_trigger); ++ ++ led->cdev.brightness_set = reset_led_set; ++ ret = devm_led_classdev_register(&pdev->dev, &led->cdev); ++ if (ret < 0) ++ return ERR_PTR(ret); ++ led->cdev.dev->of_node = np; ++ priv->num_leds++; ++ } ++ ++ return priv; ++} ++ ++static const struct of_device_id of_reset_leds_match[] = { ++ { .compatible = "reset-leds", }, ++ {}, ++}; ++ ++MODULE_DEVICE_TABLE(of, of_reset_leds_match); ++ ++static int reset_led_probe(struct platform_device *pdev) ++{ ++ struct reset_leds_priv *priv; ++ ++ priv = reset_leds_create(pdev); ++ if (IS_ERR(priv)) ++ return PTR_ERR(priv); ++ ++ platform_set_drvdata(pdev, priv); ++ ++ return 0; ++} ++ ++static void reset_led_shutdown(struct platform_device *pdev) ++{ ++ struct reset_leds_priv *priv = platform_get_drvdata(pdev); ++ int i; ++ ++ for (i = 0; i < priv->num_leds; i++) { ++ struct reset_led_data *led = &priv->leds[i]; ++ ++ if (!(led->cdev.flags & LED_RETAIN_AT_SHUTDOWN)) ++ reset_led_set(&led->cdev, LED_OFF); ++ } ++} ++ ++static struct platform_driver reset_led_driver = { ++ .probe = reset_led_probe, ++ .shutdown = reset_led_shutdown, ++ .driver = { ++ .name = "leds-reset", ++ .of_match_table = of_reset_leds_match, ++ }, ++}; ++ ++module_platform_driver(reset_led_driver); ++ ++MODULE_AUTHOR("John Crispin "); ++MODULE_DESCRIPTION("reset controller LED driver"); ++MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:leds-reset"); +--- a/drivers/leds/Makefile ++++ b/drivers/leds/Makefile +@@ -87,6 +87,7 @@ obj-$(CONFIG_LEDS_TURRIS_OMNIA) += leds + obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o + obj-$(CONFIG_LEDS_WM8350) += leds-wm8350.o + obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o ++obj-$(CONFIG_LEDS_RESET) += leds-reset.o + + # LED SPI Drivers + obj-$(CONFIG_LEDS_CR0014114) += leds-cr0014114.o diff --git a/target/linux/ath79/patches-5.15/0004-phy-add-ath79-usb-phys.patch b/target/linux/ath79/patches-5.15/0004-phy-add-ath79-usb-phys.patch new file mode 100644 index 0000000000..21b655a109 --- /dev/null +++ b/target/linux/ath79/patches-5.15/0004-phy-add-ath79-usb-phys.patch @@ -0,0 +1,333 @@ +From 08c9d6ceef01893678a5d2e8a15517c745417f21 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Tue, 6 Mar 2018 10:04:05 +0100 +Subject: [PATCH 04/27] phy: add ath79 usb phys + +Signed-off-by: John Crispin +--- + drivers/phy/Kconfig | 16 ++++++ + drivers/phy/Makefile | 2 + + drivers/phy/phy-ar7100-usb.c | 124 +++++++++++++++++++++++++++++++++++++++++++ + drivers/phy/phy-ar7200-usb.c | 108 +++++++++++++++++++++++++++++++++++++ + 4 files changed, 250 insertions(+) + create mode 100644 drivers/phy/phy-ar7100-usb.c + create mode 100644 drivers/phy/phy-ar7200-usb.c + +--- a/drivers/phy/Kconfig ++++ b/drivers/phy/Kconfig +@@ -24,6 +24,22 @@ config GENERIC_PHY_MIPI_DPHY + Provides a number of helpers a core functions for MIPI D-PHY + drivers to us. + ++config PHY_AR7100_USB ++ tristate "Atheros AR7100 USB PHY driver" ++ depends on ATH79 || COMPILE_TEST ++ default y if USB_EHCI_HCD_PLATFORM ++ select GENERIC_PHY ++ help ++ Enable this to support the USB PHY on Atheros AR7100 SoCs. ++ ++config PHY_AR7200_USB ++ tristate "Atheros AR7200 USB PHY driver" ++ depends on ATH79 || COMPILE_TEST ++ default y if USB_EHCI_HCD_PLATFORM ++ select GENERIC_PHY ++ help ++ Enable this to support the USB PHY on Atheros AR7200 SoCs. ++ + config PHY_LPC18XX_USB_OTG + tristate "NXP LPC18xx/43xx SoC USB OTG PHY driver" + depends on OF && (ARCH_LPC18XX || COMPILE_TEST) +--- a/drivers/phy/Makefile ++++ b/drivers/phy/Makefile +@@ -4,6 +4,8 @@ + # + + obj-$(CONFIG_GENERIC_PHY) += phy-core.o ++obj-$(CONFIG_PHY_AR7100_USB) += phy-ar7100-usb.o ++obj-$(CONFIG_PHY_AR7200_USB) += phy-ar7200-usb.o + obj-$(CONFIG_GENERIC_PHY_MIPI_DPHY) += phy-core-mipi-dphy.o + obj-$(CONFIG_PHY_CAN_TRANSCEIVER) += phy-can-transceiver.o + obj-$(CONFIG_PHY_LPC18XX_USB_OTG) += phy-lpc18xx-usb-otg.o +--- /dev/null ++++ b/drivers/phy/phy-ar7100-usb.c +@@ -0,0 +1,140 @@ ++/* ++ * Copyright (C) 2018 John Crispin ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++struct ar7100_usb_phy { ++ struct reset_control *rst_phy; ++ struct reset_control *rst_host; ++ struct reset_control *rst_ohci_dll; ++ void __iomem *io_base; ++ struct phy *phy; ++ int gpio; ++}; ++ ++static int ar7100_usb_phy_power_off(struct phy *phy) ++{ ++ struct ar7100_usb_phy *priv = phy_get_drvdata(phy); ++ int err = 0; ++ ++ err |= reset_control_assert(priv->rst_host); ++ err |= reset_control_assert(priv->rst_phy); ++ err |= reset_control_assert(priv->rst_ohci_dll); ++ ++ return err; ++} ++ ++static int ar7100_usb_phy_power_on(struct phy *phy) ++{ ++ struct ar7100_usb_phy *priv = phy_get_drvdata(phy); ++ int err = 0; ++ ++ err |= ar7100_usb_phy_power_off(phy); ++ mdelay(100); ++ err |= reset_control_deassert(priv->rst_ohci_dll); ++ err |= reset_control_deassert(priv->rst_phy); ++ err |= reset_control_deassert(priv->rst_host); ++ mdelay(500); ++ iowrite32(0xf0000, priv->io_base + AR71XX_USB_CTRL_REG_CONFIG); ++ iowrite32(0x20c00, priv->io_base + AR71XX_USB_CTRL_REG_FLADJ); ++ ++ return err; ++} ++ ++static const struct phy_ops ar7100_usb_phy_ops = { ++ .power_on = ar7100_usb_phy_power_on, ++ .power_off = ar7100_usb_phy_power_off, ++ .owner = THIS_MODULE, ++}; ++ ++static int ar7100_usb_phy_probe(struct platform_device *pdev) ++{ ++ struct phy_provider *phy_provider; ++ struct resource *res; ++ struct ar7100_usb_phy *priv; ++ ++ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ priv->io_base = devm_ioremap_resource(&pdev->dev, res); ++ if (IS_ERR(priv->io_base)) ++ return PTR_ERR(priv->io_base); ++ ++ priv->rst_phy = devm_reset_control_get(&pdev->dev, "usb-phy"); ++ if (IS_ERR(priv->rst_phy)) { ++ dev_err(&pdev->dev, "phy reset is missing\n"); ++ return PTR_ERR(priv->rst_phy); ++ } ++ ++ priv->rst_host = devm_reset_control_get(&pdev->dev, "usb-host"); ++ if (IS_ERR(priv->rst_host)) { ++ dev_err(&pdev->dev, "host reset is missing\n"); ++ return PTR_ERR(priv->rst_host); ++ } ++ ++ priv->rst_ohci_dll = devm_reset_control_get(&pdev->dev, "usb-ohci-dll"); ++ if (IS_ERR(priv->rst_ohci_dll)) { ++ dev_err(&pdev->dev, "ohci-dll reset is missing\n"); ++ return PTR_ERR(priv->rst_host); ++ } ++ ++ priv->phy = devm_phy_create(&pdev->dev, NULL, &ar7100_usb_phy_ops); ++ if (IS_ERR(priv->phy)) { ++ dev_err(&pdev->dev, "failed to create PHY\n"); ++ return PTR_ERR(priv->phy); ++ } ++ ++ priv->gpio = of_get_gpio(pdev->dev.of_node, 0); ++ if (priv->gpio >= 0) { ++ int ret = devm_gpio_request(&pdev->dev, priv->gpio, dev_name(&pdev->dev)); ++ ++ if (ret) { ++ dev_err(&pdev->dev, "failed to request gpio\n"); ++ return ret; ++ } ++ gpio_export_with_name(priv->gpio, 0, dev_name(&pdev->dev)); ++ gpio_set_value(priv->gpio, 1); ++ } ++ ++ phy_set_drvdata(priv->phy, priv); ++ ++ phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); ++ ++ ++ return PTR_ERR_OR_ZERO(phy_provider); ++} ++ ++static const struct of_device_id ar7100_usb_phy_of_match[] = { ++ { .compatible = "qca,ar7100-usb-phy" }, ++ {} ++}; ++MODULE_DEVICE_TABLE(of, ar7100_usb_phy_of_match); ++ ++static struct platform_driver ar7100_usb_phy_driver = { ++ .probe = ar7100_usb_phy_probe, ++ .driver = { ++ .of_match_table = ar7100_usb_phy_of_match, ++ .name = "ar7100-usb-phy", ++ } ++}; ++module_platform_driver(ar7100_usb_phy_driver); ++ ++MODULE_DESCRIPTION("ATH79 USB PHY driver"); ++MODULE_AUTHOR("Alban Bedel "); ++MODULE_LICENSE("GPL"); +--- /dev/null ++++ b/drivers/phy/phy-ar7200-usb.c +@@ -0,0 +1,136 @@ ++/* ++ * Copyright (C) 2015 Alban Bedel ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++struct ar7200_usb_phy { ++ struct reset_control *rst_phy; ++ struct reset_control *rst_phy_analog; ++ struct reset_control *suspend_override; ++ struct phy *phy; ++ int gpio; ++}; ++ ++static int ar7200_usb_phy_power_on(struct phy *phy) ++{ ++ struct ar7200_usb_phy *priv = phy_get_drvdata(phy); ++ int err = 0; ++ ++ if (priv->suspend_override) ++ err = reset_control_assert(priv->suspend_override); ++ if (priv->rst_phy) ++ err |= reset_control_deassert(priv->rst_phy); ++ if (priv->rst_phy_analog) ++ err |= reset_control_deassert(priv->rst_phy_analog); ++ ++ return err; ++} ++ ++static int ar7200_usb_phy_power_off(struct phy *phy) ++{ ++ struct ar7200_usb_phy *priv = phy_get_drvdata(phy); ++ int err = 0; ++ ++ if (priv->suspend_override) ++ err = reset_control_deassert(priv->suspend_override); ++ if (priv->rst_phy) ++ err |= reset_control_assert(priv->rst_phy); ++ if (priv->rst_phy_analog) ++ err |= reset_control_assert(priv->rst_phy_analog); ++ ++ return err; ++} ++ ++static const struct phy_ops ar7200_usb_phy_ops = { ++ .power_on = ar7200_usb_phy_power_on, ++ .power_off = ar7200_usb_phy_power_off, ++ .owner = THIS_MODULE, ++}; ++ ++static int ar7200_usb_phy_probe(struct platform_device *pdev) ++{ ++ struct phy_provider *phy_provider; ++ struct ar7200_usb_phy *priv; ++ ++ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ priv->rst_phy = devm_reset_control_get(&pdev->dev, "usb-phy"); ++ if (IS_ERR(priv->rst_phy)) { ++ if (PTR_ERR(priv->rst_phy) != -EPROBE_DEFER) ++ dev_err(&pdev->dev, "phy reset is missing\n"); ++ return PTR_ERR(priv->rst_phy); ++ } ++ ++ priv->rst_phy_analog = devm_reset_control_get_optional( ++ &pdev->dev, "usb-phy-analog"); ++ if (IS_ERR(priv->rst_phy_analog)) { ++ if (PTR_ERR(priv->rst_phy_analog) == -ENOENT) ++ priv->rst_phy_analog = NULL; ++ else ++ return PTR_ERR(priv->rst_phy_analog); ++ } ++ ++ priv->suspend_override = devm_reset_control_get_optional( ++ &pdev->dev, "usb-suspend-override"); ++ if (IS_ERR(priv->suspend_override)) { ++ if (PTR_ERR(priv->suspend_override) == -ENOENT) ++ priv->suspend_override = NULL; ++ else ++ return PTR_ERR(priv->suspend_override); ++ } ++ ++ priv->phy = devm_phy_create(&pdev->dev, NULL, &ar7200_usb_phy_ops); ++ if (IS_ERR(priv->phy)) { ++ dev_err(&pdev->dev, "failed to create PHY\n"); ++ return PTR_ERR(priv->phy); ++ } ++ ++ priv->gpio = of_get_gpio(pdev->dev.of_node, 0); ++ if (priv->gpio >= 0) { ++ int ret = devm_gpio_request(&pdev->dev, priv->gpio, dev_name(&pdev->dev)); ++ ++ if (ret) { ++ dev_err(&pdev->dev, "failed to request gpio\n"); ++ return ret; ++ } ++ gpio_export_with_name(priv->gpio, 0, dev_name(&pdev->dev)); ++ gpio_set_value(priv->gpio, 1); ++ } ++ ++ phy_set_drvdata(priv->phy, priv); ++ ++ phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); ++ ++ return PTR_ERR_OR_ZERO(phy_provider); ++} ++ ++static const struct of_device_id ar7200_usb_phy_of_match[] = { ++ { .compatible = "qca,ar7200-usb-phy" }, ++ {} ++}; ++MODULE_DEVICE_TABLE(of, ar7200_usb_phy_of_match); ++ ++static struct platform_driver ar7200_usb_phy_driver = { ++ .probe = ar7200_usb_phy_probe, ++ .driver = { ++ .of_match_table = ar7200_usb_phy_of_match, ++ .name = "ar7200-usb-phy", ++ } ++}; ++module_platform_driver(ar7200_usb_phy_driver); ++ ++MODULE_DESCRIPTION("ATH79 USB PHY driver"); ++MODULE_AUTHOR("Alban Bedel "); ++MODULE_LICENSE("GPL"); diff --git a/target/linux/ath79/patches-5.10/0005-usb-add-more-OF-quirk-properties.patch b/target/linux/ath79/patches-5.15/0005-usb-add-more-OF-quirk-properties.patch similarity index 100% rename from target/linux/ath79/patches-5.10/0005-usb-add-more-OF-quirk-properties.patch rename to target/linux/ath79/patches-5.15/0005-usb-add-more-OF-quirk-properties.patch diff --git a/target/linux/ath79/patches-5.10/0007-irqchip-irq-ath79-intc-add-irq-cascade-driver-for-QC.patch b/target/linux/ath79/patches-5.15/0007-irqchip-irq-ath79-intc-add-irq-cascade-driver-for-QC.patch similarity index 100% rename from target/linux/ath79/patches-5.10/0007-irqchip-irq-ath79-intc-add-irq-cascade-driver-for-QC.patch rename to target/linux/ath79/patches-5.15/0007-irqchip-irq-ath79-intc-add-irq-cascade-driver-for-QC.patch diff --git a/target/linux/ath79/patches-5.10/0008-irqchip-irq-ath79-cpu-drop-OF-init-helper.patch b/target/linux/ath79/patches-5.15/0008-irqchip-irq-ath79-cpu-drop-OF-init-helper.patch similarity index 100% rename from target/linux/ath79/patches-5.10/0008-irqchip-irq-ath79-cpu-drop-OF-init-helper.patch rename to target/linux/ath79/patches-5.15/0008-irqchip-irq-ath79-cpu-drop-OF-init-helper.patch diff --git a/target/linux/ath79/patches-5.10/0017-dt-bindings-PCI-qcom-ar7100-adds-binding-doc.patch b/target/linux/ath79/patches-5.15/0017-dt-bindings-PCI-qcom-ar7100-adds-binding-doc.patch similarity index 100% rename from target/linux/ath79/patches-5.10/0017-dt-bindings-PCI-qcom-ar7100-adds-binding-doc.patch rename to target/linux/ath79/patches-5.15/0017-dt-bindings-PCI-qcom-ar7100-adds-binding-doc.patch diff --git a/target/linux/ath79/patches-5.15/0018-MIPS-pci-ar71xx-convert-to-OF.patch b/target/linux/ath79/patches-5.15/0018-MIPS-pci-ar71xx-convert-to-OF.patch new file mode 100644 index 0000000000..9a315aed0b --- /dev/null +++ b/target/linux/ath79/patches-5.15/0018-MIPS-pci-ar71xx-convert-to-OF.patch @@ -0,0 +1,206 @@ +From 1855ab6b1d27f5b38a648baf57ff6a534afec26d Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Sat, 23 Jun 2018 15:07:23 +0200 +Subject: [PATCH 18/33] MIPS: pci-ar71xx: convert to OF + +With the ath79 target getting converted to pure OF, we can drop all the +platform data code and add the missing OF bits to the driver. We also add +a irq domain for the PCI/e controllers cascade, thus making it usable from +dts files. + +Signed-off-by: John Crispin +--- + arch/mips/pci/pci-ar71xx.c | 82 +++++++++++++++++++++++----------------------- + 1 file changed, 41 insertions(+), 41 deletions(-) + +--- a/arch/mips/pci/pci-ar71xx.c ++++ b/arch/mips/pci/pci-ar71xx.c +@@ -15,8 +15,11 @@ + #include + #include + #include ++#include + #include + #include ++#include ++#include + + #include + #include +@@ -46,12 +49,13 @@ + #define AR71XX_PCI_IRQ_COUNT 5 + + struct ar71xx_pci_controller { ++ struct device_node *np; + void __iomem *cfg_base; + int irq; +- int irq_base; + struct pci_controller pci_ctrl; + struct resource io_res; + struct resource mem_res; ++ struct irq_domain *domain; + }; + + /* Byte lane enable bits */ +@@ -225,29 +229,30 @@ static struct pci_ops ar71xx_pci_ops = { + + static void ar71xx_pci_irq_handler(struct irq_desc *desc) + { +- struct ar71xx_pci_controller *apc; + void __iomem *base = ath79_reset_base; ++ struct irq_chip *chip = irq_desc_get_chip(desc); ++ struct ar71xx_pci_controller *apc = irq_desc_get_handler_data(desc); + u32 pending; + +- apc = irq_desc_get_handler_data(desc); +- ++ chained_irq_enter(chip, desc); + pending = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_STATUS) & + __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); + + if (pending & AR71XX_PCI_INT_DEV0) +- generic_handle_irq(apc->irq_base + 0); ++ generic_handle_irq(irq_linear_revmap(apc->domain, 1)); + + else if (pending & AR71XX_PCI_INT_DEV1) +- generic_handle_irq(apc->irq_base + 1); ++ generic_handle_irq(irq_linear_revmap(apc->domain, 2)); + + else if (pending & AR71XX_PCI_INT_DEV2) +- generic_handle_irq(apc->irq_base + 2); ++ generic_handle_irq(irq_linear_revmap(apc->domain, 3)); + + else if (pending & AR71XX_PCI_INT_CORE) +- generic_handle_irq(apc->irq_base + 4); ++ generic_handle_irq(irq_linear_revmap(apc->domain, 4)); + + else + spurious_interrupt(); ++ chained_irq_exit(chip, desc); + } + + static void ar71xx_pci_irq_unmask(struct irq_data *d) +@@ -258,7 +263,7 @@ static void ar71xx_pci_irq_unmask(struct + u32 t; + + apc = irq_data_get_irq_chip_data(d); +- irq = d->irq - apc->irq_base; ++ irq = irq_linear_revmap(apc->domain, d->irq); + + t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); + __raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); +@@ -275,7 +280,7 @@ static void ar71xx_pci_irq_mask(struct i + u32 t; + + apc = irq_data_get_irq_chip_data(d); +- irq = d->irq - apc->irq_base; ++ irq = irq_linear_revmap(apc->domain, d->irq); + + t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); + __raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); +@@ -291,24 +296,31 @@ static struct irq_chip ar71xx_pci_irq_ch + .irq_mask_ack = ar71xx_pci_irq_mask, + }; + ++static int ar71xx_pci_irq_map(struct irq_domain *d, ++ unsigned int irq, irq_hw_number_t hw) ++{ ++ struct ar71xx_pci_controller *apc = d->host_data; ++ ++ irq_set_chip_and_handler(irq, &ar71xx_pci_irq_chip, handle_level_irq); ++ irq_set_chip_data(irq, apc); ++ ++ return 0; ++} ++ ++static const struct irq_domain_ops ar71xx_pci_domain_ops = { ++ .xlate = irq_domain_xlate_onecell, ++ .map = ar71xx_pci_irq_map, ++}; ++ + static void ar71xx_pci_irq_init(struct ar71xx_pci_controller *apc) + { + void __iomem *base = ath79_reset_base; +- int i; + + __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_ENABLE); + __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_STATUS); + +- BUILD_BUG_ON(ATH79_PCI_IRQ_COUNT < AR71XX_PCI_IRQ_COUNT); +- +- apc->irq_base = ATH79_PCI_IRQ_BASE; +- for (i = apc->irq_base; +- i < apc->irq_base + AR71XX_PCI_IRQ_COUNT; i++) { +- irq_set_chip_and_handler(i, &ar71xx_pci_irq_chip, +- handle_level_irq); +- irq_set_chip_data(i, apc); +- } +- ++ apc->domain = irq_domain_add_linear(apc->np, AR71XX_PCI_IRQ_COUNT, ++ &ar71xx_pci_domain_ops, apc); + irq_set_chained_handler_and_data(apc->irq, ar71xx_pci_irq_handler, + apc); + } +@@ -325,10 +337,14 @@ static void ar71xx_pci_reset(void) + mdelay(100); + } + ++static const struct of_device_id ar71xx_pci_ids[] = { ++ { .compatible = "qca,ar7100-pci" }, ++ {}, ++}; ++ + static int ar71xx_pci_probe(struct platform_device *pdev) + { + struct ar71xx_pci_controller *apc; +- struct resource *res; + u32 t; + + apc = devm_kzalloc(&pdev->dev, sizeof(struct ar71xx_pci_controller), +@@ -345,26 +361,6 @@ static int ar71xx_pci_probe(struct platf + if (apc->irq < 0) + return -EINVAL; + +- res = platform_get_resource_byname(pdev, IORESOURCE_IO, "io_base"); +- if (!res) +- return -EINVAL; +- +- apc->io_res.parent = res; +- apc->io_res.name = "PCI IO space"; +- apc->io_res.start = res->start; +- apc->io_res.end = res->end; +- apc->io_res.flags = IORESOURCE_IO; +- +- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mem_base"); +- if (!res) +- return -EINVAL; +- +- apc->mem_res.parent = res; +- apc->mem_res.name = "PCI memory space"; +- apc->mem_res.start = res->start; +- apc->mem_res.end = res->end; +- apc->mem_res.flags = IORESOURCE_MEM; +- + ar71xx_pci_reset(); + + /* setup COMMAND register */ +@@ -377,9 +373,11 @@ static int ar71xx_pci_probe(struct platf + + ar71xx_pci_irq_init(apc); + ++ apc->np = pdev->dev.of_node; + apc->pci_ctrl.pci_ops = &ar71xx_pci_ops; + apc->pci_ctrl.mem_resource = &apc->mem_res; + apc->pci_ctrl.io_resource = &apc->io_res; ++ pci_load_of_ranges(&apc->pci_ctrl, pdev->dev.of_node); + + register_pci_controller(&apc->pci_ctrl); + +@@ -390,6 +388,7 @@ static struct platform_driver ar71xx_pci + .probe = ar71xx_pci_probe, + .driver = { + .name = "ar71xx-pci", ++ .of_match_table = of_match_ptr(ar71xx_pci_ids), + }, + }; + diff --git a/target/linux/ath79/patches-5.10/0019-dt-bindings-PCI-qcom-ar7240-adds-binding-doc.patch b/target/linux/ath79/patches-5.15/0019-dt-bindings-PCI-qcom-ar7240-adds-binding-doc.patch similarity index 100% rename from target/linux/ath79/patches-5.10/0019-dt-bindings-PCI-qcom-ar7240-adds-binding-doc.patch rename to target/linux/ath79/patches-5.15/0019-dt-bindings-PCI-qcom-ar7240-adds-binding-doc.patch diff --git a/target/linux/ath79/patches-5.15/0020-MIPS-pci-ar724x-convert-to-OF.patch b/target/linux/ath79/patches-5.15/0020-MIPS-pci-ar724x-convert-to-OF.patch new file mode 100644 index 0000000000..7927c1cbf5 --- /dev/null +++ b/target/linux/ath79/patches-5.15/0020-MIPS-pci-ar724x-convert-to-OF.patch @@ -0,0 +1,213 @@ +From a522ee0199d5d3ea114ca2e211f6ac398d3e8e0b Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Sat, 23 Jun 2018 15:07:37 +0200 +Subject: [PATCH 20/33] MIPS: pci-ar724x: convert to OF + +With the ath79 target getting converted to pure OF, we can drop all the +platform data code and add the missing OF bits to the driver. We also add +a irq domain for the PCI/e controllers cascade, thus making it usable from +dts files. + +Signed-off-by: John Crispin +--- + arch/mips/pci/pci-ar724x.c | 88 ++++++++++++++++++++++------------------------ + 1 file changed, 42 insertions(+), 46 deletions(-) + +--- a/arch/mips/pci/pci-ar724x.c ++++ b/arch/mips/pci/pci-ar724x.c +@@ -11,8 +11,11 @@ + #include + #include + #include ++#include + #include + #include ++#include ++#include + + #define AR724X_PCI_REG_APP 0x00 + #define AR724X_PCI_REG_RESET 0x18 +@@ -42,17 +45,20 @@ struct ar724x_pci_controller { + void __iomem *crp_base; + + int irq; +- int irq_base; + + bool link_up; + bool bar0_is_cached; + u32 bar0_value; + ++ struct device_node *np; + struct pci_controller pci_controller; ++ struct irq_domain *domain; + struct resource io_res; + struct resource mem_res; + }; + ++static struct irq_chip ar724x_pci_irq_chip; ++ + static inline bool ar724x_pci_check_link(struct ar724x_pci_controller *apc) + { + u32 reset; +@@ -228,35 +234,31 @@ static struct pci_ops ar724x_pci_ops = { + + static void ar724x_pci_irq_handler(struct irq_desc *desc) + { +- struct ar724x_pci_controller *apc; +- void __iomem *base; ++ struct irq_chip *chip = irq_desc_get_chip(desc); ++ struct ar724x_pci_controller *apc = irq_desc_get_handler_data(desc); + u32 pending; + +- apc = irq_desc_get_handler_data(desc); +- base = apc->ctrl_base; +- +- pending = __raw_readl(base + AR724X_PCI_REG_INT_STATUS) & +- __raw_readl(base + AR724X_PCI_REG_INT_MASK); ++ chained_irq_enter(chip, desc); ++ pending = __raw_readl(apc->ctrl_base + AR724X_PCI_REG_INT_STATUS) & ++ __raw_readl(apc->ctrl_base + AR724X_PCI_REG_INT_MASK); + + if (pending & AR724X_PCI_INT_DEV0) +- generic_handle_irq(apc->irq_base + 0); +- ++ generic_handle_irq(irq_linear_revmap(apc->domain, 1)); + else + spurious_interrupt(); ++ chained_irq_exit(chip, desc); + } + + static void ar724x_pci_irq_unmask(struct irq_data *d) + { + struct ar724x_pci_controller *apc; + void __iomem *base; +- int offset; + u32 t; + + apc = irq_data_get_irq_chip_data(d); + base = apc->ctrl_base; +- offset = apc->irq_base - d->irq; + +- switch (offset) { ++ switch (irq_linear_revmap(apc->domain, d->irq)) { + case 0: + t = __raw_readl(base + AR724X_PCI_REG_INT_MASK); + __raw_writel(t | AR724X_PCI_INT_DEV0, +@@ -270,14 +272,12 @@ static void ar724x_pci_irq_mask(struct i + { + struct ar724x_pci_controller *apc; + void __iomem *base; +- int offset; + u32 t; + + apc = irq_data_get_irq_chip_data(d); + base = apc->ctrl_base; +- offset = apc->irq_base - d->irq; + +- switch (offset) { ++ switch (irq_linear_revmap(apc->domain, d->irq)) { + case 0: + t = __raw_readl(base + AR724X_PCI_REG_INT_MASK); + __raw_writel(t & ~AR724X_PCI_INT_DEV0, +@@ -302,26 +302,34 @@ static struct irq_chip ar724x_pci_irq_ch + .irq_mask_ack = ar724x_pci_irq_mask, + }; + ++static int ar724x_pci_irq_map(struct irq_domain *d, ++ unsigned int irq, irq_hw_number_t hw) ++{ ++ struct ar724x_pci_controller *apc = d->host_data; ++ ++ irq_set_chip_and_handler(irq, &ar724x_pci_irq_chip, handle_level_irq); ++ irq_set_chip_data(irq, apc); ++ ++ return 0; ++} ++ ++static const struct irq_domain_ops ar724x_pci_domain_ops = { ++ .xlate = irq_domain_xlate_onecell, ++ .map = ar724x_pci_irq_map, ++}; ++ + static void ar724x_pci_irq_init(struct ar724x_pci_controller *apc, + int id) + { + void __iomem *base; +- int i; + + base = apc->ctrl_base; + + __raw_writel(0, base + AR724X_PCI_REG_INT_MASK); + __raw_writel(0, base + AR724X_PCI_REG_INT_STATUS); + +- apc->irq_base = ATH79_PCI_IRQ_BASE + (id * AR724X_PCI_IRQ_COUNT); +- +- for (i = apc->irq_base; +- i < apc->irq_base + AR724X_PCI_IRQ_COUNT; i++) { +- irq_set_chip_and_handler(i, &ar724x_pci_irq_chip, +- handle_level_irq); +- irq_set_chip_data(i, apc); +- } +- ++ apc->domain = irq_domain_add_linear(apc->np, 2, ++ &ar724x_pci_domain_ops, apc); + irq_set_chained_handler_and_data(apc->irq, ar724x_pci_irq_handler, + apc); + } +@@ -360,7 +368,6 @@ static void ar724x_pci_hw_init(struct ar + static int ar724x_pci_probe(struct platform_device *pdev) + { + struct ar724x_pci_controller *apc; +- struct resource *res; + int id; + + id = pdev->id; +@@ -388,29 +395,11 @@ static int ar724x_pci_probe(struct platf + if (apc->irq < 0) + return -EINVAL; + +- res = platform_get_resource_byname(pdev, IORESOURCE_IO, "io_base"); +- if (!res) +- return -EINVAL; +- +- apc->io_res.parent = res; +- apc->io_res.name = "PCI IO space"; +- apc->io_res.start = res->start; +- apc->io_res.end = res->end; +- apc->io_res.flags = IORESOURCE_IO; +- +- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mem_base"); +- if (!res) +- return -EINVAL; +- +- apc->mem_res.parent = res; +- apc->mem_res.name = "PCI memory space"; +- apc->mem_res.start = res->start; +- apc->mem_res.end = res->end; +- apc->mem_res.flags = IORESOURCE_MEM; +- ++ apc->np = pdev->dev.of_node; + apc->pci_controller.pci_ops = &ar724x_pci_ops; + apc->pci_controller.io_resource = &apc->io_res; + apc->pci_controller.mem_resource = &apc->mem_res; ++ pci_load_of_ranges(&apc->pci_controller, pdev->dev.of_node); + + /* + * Do the full PCIE Root Complex Initialization Sequence if the PCIe +@@ -432,10 +421,16 @@ static int ar724x_pci_probe(struct platf + return 0; + } + ++static const struct of_device_id ar724x_pci_ids[] = { ++ { .compatible = "qcom,ar7240-pci" }, ++ {}, ++}; ++ + static struct platform_driver ar724x_pci_driver = { + .probe = ar724x_pci_probe, + .driver = { + .name = "ar724x-pci", ++ .of_match_table = of_match_ptr(ar724x_pci_ids), + }, + }; + diff --git a/target/linux/ath79/patches-5.15/0032-MIPS-ath79-sanitize-symbols.patch b/target/linux/ath79/patches-5.15/0032-MIPS-ath79-sanitize-symbols.patch new file mode 100644 index 0000000000..5eb23ba6c6 --- /dev/null +++ b/target/linux/ath79/patches-5.15/0032-MIPS-ath79-sanitize-symbols.patch @@ -0,0 +1,93 @@ +From 3fc8585cf76022dba7496627074d42af88c30718 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Sat, 23 Jun 2018 15:16:55 +0200 +Subject: [PATCH 32/33] MIPS: ath79: sanitize symbols + +We no longer need to select which SoCs are supported as the whole arch +code is always built. So lets drop all the SoC symbols + +Signed-off-by: John Crispin +--- + arch/mips/Kconfig | 2 ++ + arch/mips/ath79/Kconfig | 44 +++++--------------------------------------- + arch/mips/pci/Makefile | 2 +- + 3 files changed, 8 insertions(+), 40 deletions(-) + +--- a/arch/mips/Kconfig ++++ b/arch/mips/Kconfig +@@ -258,6 +258,8 @@ config ATH79 + select SYS_SUPPORTS_BIG_ENDIAN + select SYS_SUPPORTS_MIPS16 + select SYS_SUPPORTS_ZBOOT_UART_PROM ++ select HAVE_PCI ++ select USB_ARCH_HAS_EHCI + select USE_OF + select USB_EHCI_ROOT_HUB_TT if USB_EHCI_HCD_PLATFORM + help +--- a/arch/mips/ath79/Kconfig ++++ b/arch/mips/ath79/Kconfig +@@ -1,48 +1,14 @@ + # SPDX-License-Identifier: GPL-2.0 + if ATH79 + +-config SOC_AR71XX +- select HAVE_PCI +- def_bool n +- +-config SOC_AR724X +- select HAVE_PCI +- select PCI_AR724X if PCI +- def_bool n +- +-config SOC_AR913X +- def_bool n +- +-config SOC_AR933X +- def_bool n +- +-config SOC_AR934X +- select HAVE_PCI +- select PCI_AR724X if PCI +- def_bool n +- +-config SOC_QCA955X +- select HAVE_PCI +- select PCI_AR724X if PCI ++config PCI_AR71XX ++ bool "PCI support for AR7100 type SoCs" ++ depends on PCI + def_bool n + + config PCI_AR724X +- def_bool n +- +-config ATH79_DEV_GPIO_BUTTONS +- def_bool n +- +-config ATH79_DEV_LEDS_GPIO +- def_bool n +- +-config ATH79_DEV_SPI +- def_bool n +- +-config ATH79_DEV_USB +- def_bool n +- +-config ATH79_DEV_WMAC +- depends on (SOC_AR913X || SOC_AR933X || SOC_AR934X || SOC_QCA955X) ++ bool "PCI support for AR724x type SoCs" ++ depends on PCI + def_bool n + + endif +--- a/arch/mips/pci/Makefile ++++ b/arch/mips/pci/Makefile +@@ -21,7 +21,7 @@ obj-$(CONFIG_BCM63XX) += pci-bcm63xx.o + ops-bcm63xx.o + obj-$(CONFIG_MIPS_ALCHEMY) += pci-alchemy.o + obj-$(CONFIG_PCI_AR2315) += pci-ar2315.o +-obj-$(CONFIG_SOC_AR71XX) += pci-ar71xx.o ++obj-$(CONFIG_PCI_AR71XX) += pci-ar71xx.o + obj-$(CONFIG_PCI_AR724X) += pci-ar724x.o + obj-$(CONFIG_PCI_XTALK_BRIDGE) += pci-xtalk-bridge.o + # diff --git a/target/linux/ath79/patches-5.15/0034-MIPS-ath79-ath9k-exports.patch b/target/linux/ath79/patches-5.15/0034-MIPS-ath79-ath9k-exports.patch new file mode 100644 index 0000000000..e460fe58f3 --- /dev/null +++ b/target/linux/ath79/patches-5.15/0034-MIPS-ath79-ath9k-exports.patch @@ -0,0 +1,36 @@ +From: John Crispin +Subject: [PATCH] ath79: make ahb wifi work + +Submitted-by: John Crispin +--- + arch/mips/ath79/common.c | 3 +++ + mips/include/asm/mach-ath79/ath79.h | 1+ + 1 file changed, 4 insertions(+) + +--- a/arch/mips/ath79/common.c ++++ b/arch/mips/ath79/common.c +@@ -31,11 +31,13 @@ EXPORT_SYMBOL_GPL(ath79_ddr_freq); + + enum ath79_soc_type ath79_soc; + unsigned int ath79_soc_rev; ++EXPORT_SYMBOL_GPL(ath79_soc_rev); + + void __iomem *ath79_pll_base; + void __iomem *ath79_reset_base; + EXPORT_SYMBOL_GPL(ath79_reset_base); +-static void __iomem *ath79_ddr_base; ++void __iomem *ath79_ddr_base; ++EXPORT_SYMBOL_GPL(ath79_ddr_base); + static void __iomem *ath79_ddr_wb_flush_base; + static void __iomem *ath79_ddr_pci_win_base; + +--- a/arch/mips/include/asm/mach-ath79/ath79.h ++++ b/arch/mips/include/asm/mach-ath79/ath79.h +@@ -149,6 +149,7 @@ void ath79_ddr_wb_flush(unsigned int reg + void ath79_ddr_set_pci_windows(void); + + extern void __iomem *ath79_pll_base; ++extern void __iomem *ath79_ddr_base; + extern void __iomem *ath79_reset_base; + + static inline void ath79_pll_wr(unsigned reg, u32 val) diff --git a/target/linux/ath79/patches-5.15/0036-MIPS-ath79-remove-irq-code-from-pci.patch b/target/linux/ath79/patches-5.15/0036-MIPS-ath79-remove-irq-code-from-pci.patch new file mode 100644 index 0000000000..01549eec68 --- /dev/null +++ b/target/linux/ath79/patches-5.15/0036-MIPS-ath79-remove-irq-code-from-pci.patch @@ -0,0 +1,149 @@ +From: John Crispin +Subject: ath79: fix remove irq code from pci driver patch + +This patch got mangled in the void while rebasing it. + +Submitted-by: John Crispin +--- + arch/mips/pci/pci-ar71xx.c | 107 ------------------ + 1 file changed, 141 deletions(-) + +--- a/arch/mips/pci/pci-ar71xx.c ++++ b/arch/mips/pci/pci-ar71xx.c +@@ -51,11 +51,9 @@ + struct ar71xx_pci_controller { + struct device_node *np; + void __iomem *cfg_base; +- int irq; + struct pci_controller pci_ctrl; + struct resource io_res; + struct resource mem_res; +- struct irq_domain *domain; + }; + + /* Byte lane enable bits */ +@@ -227,104 +225,6 @@ static struct pci_ops ar71xx_pci_ops = { + .write = ar71xx_pci_write_config, + }; + +-static void ar71xx_pci_irq_handler(struct irq_desc *desc) +-{ +- void __iomem *base = ath79_reset_base; +- struct irq_chip *chip = irq_desc_get_chip(desc); +- struct ar71xx_pci_controller *apc = irq_desc_get_handler_data(desc); +- u32 pending; +- +- chained_irq_enter(chip, desc); +- pending = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_STATUS) & +- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); +- +- if (pending & AR71XX_PCI_INT_DEV0) +- generic_handle_irq(irq_linear_revmap(apc->domain, 1)); +- +- else if (pending & AR71XX_PCI_INT_DEV1) +- generic_handle_irq(irq_linear_revmap(apc->domain, 2)); +- +- else if (pending & AR71XX_PCI_INT_DEV2) +- generic_handle_irq(irq_linear_revmap(apc->domain, 3)); +- +- else if (pending & AR71XX_PCI_INT_CORE) +- generic_handle_irq(irq_linear_revmap(apc->domain, 4)); +- +- else +- spurious_interrupt(); +- chained_irq_exit(chip, desc); +-} +- +-static void ar71xx_pci_irq_unmask(struct irq_data *d) +-{ +- struct ar71xx_pci_controller *apc; +- unsigned int irq; +- void __iomem *base = ath79_reset_base; +- u32 t; +- +- apc = irq_data_get_irq_chip_data(d); +- irq = irq_linear_revmap(apc->domain, d->irq); +- +- t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); +- __raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); +- +- /* flush write */ +- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); +-} +- +-static void ar71xx_pci_irq_mask(struct irq_data *d) +-{ +- struct ar71xx_pci_controller *apc; +- unsigned int irq; +- void __iomem *base = ath79_reset_base; +- u32 t; +- +- apc = irq_data_get_irq_chip_data(d); +- irq = irq_linear_revmap(apc->domain, d->irq); +- +- t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); +- __raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); +- +- /* flush write */ +- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); +-} +- +-static struct irq_chip ar71xx_pci_irq_chip = { +- .name = "AR71XX PCI", +- .irq_mask = ar71xx_pci_irq_mask, +- .irq_unmask = ar71xx_pci_irq_unmask, +- .irq_mask_ack = ar71xx_pci_irq_mask, +-}; +- +-static int ar71xx_pci_irq_map(struct irq_domain *d, +- unsigned int irq, irq_hw_number_t hw) +-{ +- struct ar71xx_pci_controller *apc = d->host_data; +- +- irq_set_chip_and_handler(irq, &ar71xx_pci_irq_chip, handle_level_irq); +- irq_set_chip_data(irq, apc); +- +- return 0; +-} +- +-static const struct irq_domain_ops ar71xx_pci_domain_ops = { +- .xlate = irq_domain_xlate_onecell, +- .map = ar71xx_pci_irq_map, +-}; +- +-static void ar71xx_pci_irq_init(struct ar71xx_pci_controller *apc) +-{ +- void __iomem *base = ath79_reset_base; +- +- __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_ENABLE); +- __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_STATUS); +- +- apc->domain = irq_domain_add_linear(apc->np, AR71XX_PCI_IRQ_COUNT, +- &ar71xx_pci_domain_ops, apc); +- irq_set_chained_handler_and_data(apc->irq, ar71xx_pci_irq_handler, +- apc); +-} +- + static void ar71xx_pci_reset(void) + { + ath79_device_reset_set(AR71XX_RESET_PCI_BUS | AR71XX_RESET_PCI_CORE); +@@ -357,10 +257,6 @@ static int ar71xx_pci_probe(struct platf + if (IS_ERR(apc->cfg_base)) + return PTR_ERR(apc->cfg_base); + +- apc->irq = platform_get_irq(pdev, 0); +- if (apc->irq < 0) +- return -EINVAL; +- + ar71xx_pci_reset(); + + /* setup COMMAND register */ +@@ -371,8 +267,6 @@ static int ar71xx_pci_probe(struct platf + /* clear bus errors */ + ar71xx_pci_check_error(apc, 1); + +- ar71xx_pci_irq_init(apc); +- + apc->np = pdev->dev.of_node; + apc->pci_ctrl.pci_ops = &ar71xx_pci_ops; + apc->pci_ctrl.mem_resource = &apc->mem_res; diff --git a/target/linux/ath79/patches-5.15/0037-missing-registers.patch b/target/linux/ath79/patches-5.15/0037-missing-registers.patch new file mode 100644 index 0000000000..0e6ac52ade --- /dev/null +++ b/target/linux/ath79/patches-5.15/0037-missing-registers.patch @@ -0,0 +1,20 @@ +From: Christian Lamparter +Subject: [PATCH] ath79: gmac: add parsers for rxd(v)- and tx(d|en)-delay for + + ath79: gmac: add parsers for rxd(v)- and tx(d|en)-delay for AR9344 + + Signed-off-by: Christian Lamparter + +--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h ++++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h +@@ -1226,6 +1226,10 @@ + #define AR934X_ETH_CFG_RDV_DELAY BIT(16) + #define AR934X_ETH_CFG_RDV_DELAY_MASK 0x3 + #define AR934X_ETH_CFG_RDV_DELAY_SHIFT 16 ++#define AR934X_ETH_CFG_TXD_DELAY_MASK 0x3 ++#define AR934X_ETH_CFG_TXD_DELAY_SHIFT 18 ++#define AR934X_ETH_CFG_TXE_DELAY_MASK 0x3 ++#define AR934X_ETH_CFG_TXE_DELAY_SHIFT 20 + + /* + * QCA953X GMAC Interface diff --git a/target/linux/ath79/patches-5.10/0038-MIPS-ath79-add-missing-QCA955x-GMAC-registers.patch b/target/linux/ath79/patches-5.15/0038-MIPS-ath79-add-missing-QCA955x-GMAC-registers.patch similarity index 100% rename from target/linux/ath79/patches-5.10/0038-MIPS-ath79-add-missing-QCA955x-GMAC-registers.patch rename to target/linux/ath79/patches-5.15/0038-MIPS-ath79-add-missing-QCA955x-GMAC-registers.patch diff --git a/target/linux/ath79/patches-5.15/0039-MIPS-ath79-export-UART1-reference-clock.patch b/target/linux/ath79/patches-5.15/0039-MIPS-ath79-export-UART1-reference-clock.patch new file mode 100644 index 0000000000..b24ff21692 --- /dev/null +++ b/target/linux/ath79/patches-5.15/0039-MIPS-ath79-export-UART1-reference-clock.patch @@ -0,0 +1,67 @@ +From: Daniel Golle +Subject: [PATCH] ath79: add support for Atheros AR934x HS UART + +AR934x chips also got the 'old' qca,ar9330-uart in addition to the +'new' ns16550a compatible one. Add support for UART1 clock selector as +well as device-tree bindings in ar934x.dtsi to make use of that uart. + +Reported-by: Piotr Dymacz +Submitted-by: Daniel Golle +--- + arch/mips/ath79/clock.c | 7 +++++++ + .../mips/include/asm/mach-ath79/ar71xx_regs.h | 1 + + include/dt-bindings/clock/ath79-clk.h | 3 ++- + 3 files changed, 10 insertions(+), 1 deletion(-) + +--- a/arch/mips/ath79/clock.c ++++ b/arch/mips/ath79/clock.c +@@ -40,6 +40,7 @@ static const char * const clk_names[ATH7 + [ATH79_CLK_AHB] = "ahb", + [ATH79_CLK_REF] = "ref", + [ATH79_CLK_MDIO] = "mdio", ++ [ATH79_CLK_UART1] = "uart1", + }; + + static const char * __init ath79_clk_name(int type) +@@ -344,6 +345,9 @@ static void __init ar934x_clocks_init(vo + if (clk_ctrl & AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL) + ath79_set_clk(ATH79_CLK_MDIO, 100 * 1000 * 1000); + ++ if (clk_ctrl & AR934X_PLL_SWITCH_CLOCK_CONTROL_UART1_CLK_SEL) ++ ath79_set_clk(ATH79_CLK_UART1, 100 * 1000 * 1000); ++ + iounmap(dpll_base); + } + +@@ -649,6 +653,9 @@ static void __init ath79_clocks_init_dt( + if (!clks[ATH79_CLK_MDIO]) + clks[ATH79_CLK_MDIO] = clks[ATH79_CLK_REF]; + ++ if (!clks[ATH79_CLK_UART1]) ++ clks[ATH79_CLK_UART1] = clks[ATH79_CLK_REF]; ++ + if (of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data)) { + pr_err("%pOF: could not register clk provider\n", np); + goto err_iounmap; +--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h ++++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h +@@ -348,6 +348,7 @@ + #define AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL BIT(24) + + #define AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL BIT(6) ++#define AR934X_PLL_SWITCH_CLOCK_CONTROL_UART1_CLK_SEL BIT(7) + + #define QCA953X_PLL_CPU_CONFIG_REG 0x00 + #define QCA953X_PLL_DDR_CONFIG_REG 0x04 +--- a/include/dt-bindings/clock/ath79-clk.h ++++ b/include/dt-bindings/clock/ath79-clk.h +@@ -11,7 +11,8 @@ + #define ATH79_CLK_AHB 2 + #define ATH79_CLK_REF 3 + #define ATH79_CLK_MDIO 4 ++#define ATH79_CLK_UART1 5 + +-#define ATH79_CLK_END 5 ++#define ATH79_CLK_END 6 + + #endif /* __DT_BINDINGS_ATH79_CLK_H */ diff --git a/target/linux/ath79/patches-5.15/004-register_gpio_driver_earlier.patch b/target/linux/ath79/patches-5.15/004-register_gpio_driver_earlier.patch new file mode 100644 index 0000000000..a8680ceac4 --- /dev/null +++ b/target/linux/ath79/patches-5.15/004-register_gpio_driver_earlier.patch @@ -0,0 +1,26 @@ +From: John Crispin +Subject: ath79: Register GPIO driver earlier + +HACK: register the GPIO driver earlier to ensure that gpio_request calls +from mach files succeed. + +Submitted-by: John Crispin +--- + drivers/gpio/gpio-ath79.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +--- a/drivers/gpio/gpio-ath79.c ++++ b/drivers/gpio/gpio-ath79.c +@@ -297,7 +297,11 @@ static struct platform_driver ath79_gpio + .probe = ath79_gpio_probe, + }; + +-module_platform_driver(ath79_gpio_driver); ++static int __init ath79_gpio_init(void) ++{ ++ return platform_driver_register(&ath79_gpio_driver); ++} ++postcore_initcall(ath79_gpio_init); + + MODULE_DESCRIPTION("Atheros AR71XX/AR724X/AR913X GPIO API support"); + MODULE_LICENSE("GPL v2"); diff --git a/target/linux/ath79/patches-5.15/0040-ath79-sgmii-config.patch b/target/linux/ath79/patches-5.15/0040-ath79-sgmii-config.patch new file mode 100644 index 0000000000..4c2b94899a --- /dev/null +++ b/target/linux/ath79/patches-5.15/0040-ath79-sgmii-config.patch @@ -0,0 +1,30 @@ +From: David Bauer +Subject: [PATCH] ath79: force SGMII SerDes mode to MAC operation + +The mode on the SGMII SerDes on the QCA9563 is 1000 Base-X by default. +This only allows for 1000 Mbit/s links, however when used with an SGMII +PHY in 100 Mbit/s link mode, the link remains dead. + +This strictly has nothing to do with the SerDes calibration, however it +is done at the same point in the QCA reference U-Boot which is the +blueprint for everything happening here. As the current state is more or +less a hack, this should be fine. + +This fixes the issues outlined above on a TP-Link EAP-225 Outdoor. + +Reported-by: Tom Herbers +Tested-by: Tom Herbers +Submitted-by: David Bauer +--- + arch/mips/include/asm/mach-ath79/ar71xx_regs.h | 1 + + 1 files changed, 1 insertion(+) + +--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h ++++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h +@@ -1376,5 +1376,6 @@ + + #define QCA956X_SGMII_CONFIG_MODE_CTRL_SHIFT 0 + #define QCA956X_SGMII_CONFIG_MODE_CTRL_MASK 0x7 ++#define QCA956X_SGMII_CONFIG_MODE_CTRL_SGMII_MAC 0x2 + + #endif /* __ASM_MACH_AR71XX_REGS_H */ diff --git a/target/linux/ath79/patches-5.15/0062-MIPS-pci-ar724x-add-QCA9550-reset-sequence.patch b/target/linux/ath79/patches-5.15/0062-MIPS-pci-ar724x-add-QCA9550-reset-sequence.patch new file mode 100644 index 0000000000..1949a9f886 --- /dev/null +++ b/target/linux/ath79/patches-5.15/0062-MIPS-pci-ar724x-add-QCA9550-reset-sequence.patch @@ -0,0 +1,130 @@ +From: David Bauer +Date: Sat, 11 Apr 2020 14:03:12 +0200 +Subject: MIPS: pci-ar724x: add QCA9550 reset sequence + +The QCA9550 family of SoCs have a slightly different reset +sequence compared to older chips. + +Normally the bootloader performs this sequence, however +some bootloader implementation expect the operating system +to clear the reset. + +Also get the resets from OF to support handling of the second +PCIe root-complex on the QCA9558. + +Signed-off-by: David Bauer + +--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h ++++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h +@@ -391,6 +391,7 @@ + #define QCA955X_PLL_CPU_CONFIG_REG 0x00 + #define QCA955X_PLL_DDR_CONFIG_REG 0x04 + #define QCA955X_PLL_CLK_CTRL_REG 0x08 ++#define QCA955X_PLL_PCIE_CONFIG_REG 0x0c + #define QCA955X_PLL_ETH_XMII_CONTROL_REG 0x28 + #define QCA955X_PLL_ETH_SGMII_CONTROL_REG 0x48 + #define QCA955X_PLL_ETH_SGMII_SERDES_REG 0x4c +@@ -476,6 +477,9 @@ + #define QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_CPUPLL BIT(21) + #define QCA956X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL BIT(24) + ++#define QCA955X_PLL_PCIE_CONFIG_PLL_PWD BIT(30) ++#define QCA955X_PLL_PCIE_CONFIG_PLL_BYPASS BIT(16) ++ + #define QCA956X_PLL_SWITCH_CLOCK_SPARE_I2C_CLK_SELB BIT(5) + #define QCA956X_PLL_SWITCH_CLOCK_SPARE_MDIO_CLK_SEL0_1 BIT(6) + #define QCA956X_PLL_SWITCH_CLOCK_SPARE_UART1_CLK_SEL BIT(7) +--- a/arch/mips/pci/pci-ar724x.c ++++ b/arch/mips/pci/pci-ar724x.c +@@ -8,6 +8,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -55,6 +56,9 @@ struct ar724x_pci_controller { + struct irq_domain *domain; + struct resource io_res; + struct resource mem_res; ++ ++ struct reset_control *hc_reset; ++ struct reset_control *phy_reset; + }; + + static struct irq_chip ar724x_pci_irq_chip; +@@ -340,18 +344,30 @@ static void ar724x_pci_hw_init(struct ar + int wait = 0; + + /* deassert PCIe host controller and PCIe PHY reset */ +- ath79_device_reset_clear(AR724X_RESET_PCIE); +- ath79_device_reset_clear(AR724X_RESET_PCIE_PHY); ++ reset_control_deassert(apc->hc_reset); ++ reset_control_deassert(apc->phy_reset); + +- /* remove the reset of the PCIE PLL */ +- ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG); +- ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_RESET; +- ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl); +- +- /* deassert bypass for the PCIE PLL */ +- ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG); +- ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_BYPASS; +- ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl); ++ if (of_device_is_compatible(apc->np, "qcom,qca9550-pci")) { ++ /* remove the reset of the PCIE PLL */ ++ ppl = ath79_pll_rr(QCA955X_PLL_PCIE_CONFIG_REG); ++ ppl &= ~QCA955X_PLL_PCIE_CONFIG_PLL_PWD; ++ ath79_pll_wr(QCA955X_PLL_PCIE_CONFIG_REG, ppl); ++ ++ /* deassert bypass for the PCIE PLL */ ++ ppl = ath79_pll_rr(QCA955X_PLL_PCIE_CONFIG_REG); ++ ppl &= ~QCA955X_PLL_PCIE_CONFIG_PLL_BYPASS; ++ ath79_pll_wr(QCA955X_PLL_PCIE_CONFIG_REG, ppl); ++ } else { ++ /* remove the reset of the PCIE PLL */ ++ ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG); ++ ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_RESET; ++ ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl); ++ ++ /* deassert bypass for the PCIE PLL */ ++ ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG); ++ ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_BYPASS; ++ ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl); ++ } + + /* set PCIE Application Control to ready */ + app = __raw_readl(apc->ctrl_base + AR724X_PCI_REG_APP); +@@ -395,6 +411,14 @@ static int ar724x_pci_probe(struct platf + if (apc->irq < 0) + return -EINVAL; + ++ apc->hc_reset = devm_reset_control_get_exclusive(&pdev->dev, "hc"); ++ if (IS_ERR(apc->hc_reset)) ++ return PTR_ERR(apc->hc_reset); ++ ++ apc->phy_reset = devm_reset_control_get_exclusive(&pdev->dev, "phy"); ++ if (IS_ERR(apc->phy_reset)) ++ return PTR_ERR(apc->phy_reset); ++ + apc->np = pdev->dev.of_node; + apc->pci_controller.pci_ops = &ar724x_pci_ops; + apc->pci_controller.io_resource = &apc->io_res; +@@ -405,7 +429,7 @@ static int ar724x_pci_probe(struct platf + * Do the full PCIE Root Complex Initialization Sequence if the PCIe + * host controller is in reset. + */ +- if (ath79_reset_rr(AR724X_RESET_REG_RESET_MODULE) & AR724X_RESET_PCIE) ++ if (reset_control_status(apc->hc_reset)) + ar724x_pci_hw_init(apc); + + apc->link_up = ar724x_pci_check_link(apc); +@@ -423,6 +447,7 @@ static int ar724x_pci_probe(struct platf + + static const struct of_device_id ar724x_pci_ids[] = { + { .compatible = "qcom,ar7240-pci" }, ++ { .compatible = "qcom,qca9550-pci" }, + {}, + }; + diff --git a/target/linux/ath79/patches-5.15/401-mtd-nor-support-mtd-name-from-device-tree.patch b/target/linux/ath79/patches-5.15/401-mtd-nor-support-mtd-name-from-device-tree.patch new file mode 100644 index 0000000000..36f5331bd0 --- /dev/null +++ b/target/linux/ath79/patches-5.15/401-mtd-nor-support-mtd-name-from-device-tree.patch @@ -0,0 +1,54 @@ +From f32bc2aa01edcba2f2ed5db151cf183eac9ef919 Mon Sep 17 00:00:00 2001 +From: Abhimanyu Vishwakarma +Date: Sat, 25 Feb 2017 16:42:50 +0000 +Subject: mtd: nor: support mtd name from device tree + +Signed-off-by: Abhimanyu Vishwakarma +--- + drivers/mtd/spi-nor/spi-nor.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +--- a/drivers/mtd/spi-nor/core.c ++++ b/drivers/mtd/spi-nor/core.c +@@ -3108,6 +3108,7 @@ int spi_nor_scan(struct spi_nor *nor, co + struct device *dev = nor->dev; + struct mtd_info *mtd = &nor->mtd; + struct device_node *np = spi_nor_get_flash_node(nor); ++ const char __maybe_unused *of_mtd_name = NULL; + int ret; + int i; + +@@ -3162,7 +3163,12 @@ int spi_nor_scan(struct spi_nor *nor, co + if (ret) + return ret; + +- if (!mtd->name) ++#ifdef CONFIG_MTD_OF_PARTS ++ of_property_read_string(np, "linux,mtd-name", &of_mtd_name); ++#endif ++ if (of_mtd_name) ++ mtd->name = of_mtd_name; ++ else if (!mtd->name) + mtd->name = dev_name(dev); + mtd->priv = nor; + mtd->type = MTD_NORFLASH; +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -870,6 +870,17 @@ out_error: + */ + static void mtd_set_dev_defaults(struct mtd_info *mtd) + { ++#ifdef CONFIG_MTD_OF_PARTS ++ const char __maybe_unused *of_mtd_name = NULL; ++ struct device_node *np; ++ ++ np = mtd_get_of_node(mtd); ++ if (np && !mtd->name) { ++ of_property_read_string(np, "linux,mtd-name", &of_mtd_name); ++ if (of_mtd_name) ++ mtd->name = of_mtd_name; ++ } else ++#endif + if (mtd->dev.parent) { + if (!mtd->owner && mtd->dev.parent->driver) + mtd->owner = mtd->dev.parent->driver->owner; diff --git a/target/linux/ath79/patches-5.10/402-v5.17-spi-ar934x-fix-transfer-and-word-delays.patch b/target/linux/ath79/patches-5.15/402-v5.17-spi-ar934x-fix-transfer-and-word-delays.patch similarity index 100% rename from target/linux/ath79/patches-5.10/402-v5.17-spi-ar934x-fix-transfer-and-word-delays.patch rename to target/linux/ath79/patches-5.15/402-v5.17-spi-ar934x-fix-transfer-and-word-delays.patch diff --git a/target/linux/ath79/patches-5.10/403-v5.17-spi-ar934x-fix-transfer-size.patch b/target/linux/ath79/patches-5.15/403-v5.17-spi-ar934x-fix-transfer-size.patch similarity index 100% rename from target/linux/ath79/patches-5.10/403-v5.17-spi-ar934x-fix-transfer-size.patch rename to target/linux/ath79/patches-5.15/403-v5.17-spi-ar934x-fix-transfer-size.patch diff --git a/target/linux/ath79/patches-5.15/404-mtd-cybertan-trx-parser.patch b/target/linux/ath79/patches-5.15/404-mtd-cybertan-trx-parser.patch new file mode 100644 index 0000000000..4e8e536e29 --- /dev/null +++ b/target/linux/ath79/patches-5.15/404-mtd-cybertan-trx-parser.patch @@ -0,0 +1,45 @@ +From: Christian Lamparter +Subject: [PATCH] ath79: port cybertan_part from ar71xx + +This patch ports the cybertan_part code from ar71xx and converts the +driver to a DT-supported mtd parser. As a result, it will no longer +add the u-boot, nvram and art partitions, which were never part of +the special Cybertan header. + +Instead these partitions have to be specified in the DT, which has the +upside of making it possible to add properties (i.e.: read-only), labels +and references to these important partitions. + +Submitted-by: Christian Lamparter +--- + drivers/mtd/parsers/Makefile | 1 + + drivers/mtd/parsers/Kconfig | 8 ++++++++ + 2 files changed, 9 insertions(+) + +--- a/drivers/mtd/parsers/Makefile ++++ b/drivers/mtd/parsers/Makefile +@@ -8,6 +8,7 @@ obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o + ofpart-y += ofpart_core.o + ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += ofpart_bcm4908.o + ofpart-$(CONFIG_MTD_OF_PARTS_LINKSYS_NS)+= ofpart_linksys_ns.o ++obj-$(CONFIG_MTD_PARSER_CYBERTAN) += parser_cybertan.o + obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o + obj-$(CONFIG_MTD_AFS_PARTS) += afs.o + obj-$(CONFIG_MTD_PARSER_TPLINK_SAFELOADER) += tplink_safeloader.o +--- a/drivers/mtd/parsers/Kconfig ++++ b/drivers/mtd/parsers/Kconfig +@@ -102,6 +102,14 @@ config MTD_OF_PARTS_LINKSYS_NS + two "firmware" partitions. Currently used firmware has to be detected + using CFE environment variable. + ++config MTD_PARSER_CYBERTAN ++ tristate "Parser for Cybertan format partitions" ++ depends on MTD && (ATH79 || COMPILE_TEST) ++ help ++ Cybertan has a proprietory header than encompasses a Broadcom trx ++ header. This driver will parse the header and take care of the ++ special offsets that result in the extra headers. ++ + config MTD_PARSER_IMAGETAG + tristate "Parser for BCM963XX Image Tag format partitions" + depends on BCM63XX || BMIPS_GENERIC || COMPILE_TEST diff --git a/target/linux/ath79/patches-5.15/410-spi-ath79-Implement-the-spi_mem-interface.patch b/target/linux/ath79/patches-5.15/410-spi-ath79-Implement-the-spi_mem-interface.patch new file mode 100644 index 0000000000..5746a889e8 --- /dev/null +++ b/target/linux/ath79/patches-5.15/410-spi-ath79-Implement-the-spi_mem-interface.patch @@ -0,0 +1,68 @@ +From 8d8cdb4a6ccee5b62cc0dc64651c3946364514dc Mon Sep 17 00:00:00 2001 +From: Luiz Angelo Daros de Luca +Date: Mon, 10 Feb 2020 16:11:27 -0300 +Subject: [PATCH] spi: ath79: Implement the spi_mem interface + +Signed-off-by: Luiz Angelo Daros de Luca +--- + drivers/spi/spi-ath79.c | 35 +++++++++++++++++++++++++++++++++++ + 1 file changed, 35 insertions(+) + +--- a/drivers/spi/spi-ath79.c ++++ b/drivers/spi/spi-ath79.c +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -133,6 +134,39 @@ static u32 ath79_spi_txrx_mode0(struct s + return ath79_spi_rr(sp, AR71XX_SPI_REG_RDS); + } + ++static int ath79_exec_mem_op(struct spi_mem *mem, ++ const struct spi_mem_op *op) ++{ ++ struct ath79_spi *sp = ath79_spidev_to_sp(mem->spi); ++ ++ /* Ensures that reading is performed on device connected ++ to hardware cs0 */ ++ if (mem->spi->chip_select || mem->spi->cs_gpiod) ++ return -ENOTSUPP; ++ ++ /* Only use for fast-read op. */ ++ if (op->cmd.opcode != 0x0b || op->data.dir != SPI_MEM_DATA_IN || ++ op->addr.nbytes != 3 || op->dummy.nbytes != 1) ++ return -ENOTSUPP; ++ ++ /* disable GPIO mode */ ++ ath79_spi_wr(sp, AR71XX_SPI_REG_FS, 0); ++ ++ memcpy_fromio(op->data.buf.in, sp->base + op->addr.val, op->data.nbytes); ++ ++ /* enable GPIO mode */ ++ ath79_spi_wr(sp, AR71XX_SPI_REG_FS, AR71XX_SPI_FS_GPIO); ++ ++ /* restore IOC register */ ++ ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); ++ ++ return 0; ++} ++ ++static const struct spi_controller_mem_ops ath79_mem_ops = { ++ .exec_op = ath79_exec_mem_op, ++}; ++ + static int ath79_spi_probe(struct platform_device *pdev) + { + struct spi_master *master; +@@ -165,6 +199,7 @@ static int ath79_spi_probe(struct platfo + ret = PTR_ERR(sp->base); + goto err_put_master; + } ++ master->mem_ops = &ath79_mem_ops; + + sp->clk = devm_clk_get(&pdev->dev, "ahb"); + if (IS_ERR(sp->clk)) { diff --git a/target/linux/ath79/patches-5.15/420-net-use-downstream-ag71xx.patch b/target/linux/ath79/patches-5.15/420-net-use-downstream-ag71xx.patch new file mode 100644 index 0000000000..54e64fb11c --- /dev/null +++ b/target/linux/ath79/patches-5.15/420-net-use-downstream-ag71xx.patch @@ -0,0 +1,42 @@ +From: John Crispin +Subject: [PATCH] ath79: add new OF only target for QCA MIPS silicon + +This target aims to replace ar71xx mid-term. The big part that is still +missing is making the MMIO/AHB wifi work using OF. NAND and mikrotik +subtargets will follow. + +Submitted-by: John Crispin +--- + drivers/net/ethernet/atheros/Kconfig | 8 +------- + drivers/net/ethernet/atheros/Makefile | 2 +- + 2 files changed, 2 insertions(+), 8 deletions(-) + +--- a/drivers/net/ethernet/atheros/Kconfig ++++ b/drivers/net/ethernet/atheros/Kconfig +@@ -17,14 +17,7 @@ config NET_VENDOR_ATHEROS + + if NET_VENDOR_ATHEROS + +-config AG71XX +- tristate "Atheros AR7XXX/AR9XXX built-in ethernet mac support" +- depends on ATH79 +- select PHYLINK +- imply NET_SELFTESTS +- help +- If you wish to compile a kernel for AR7XXX/91XXX and enable +- ethernet support, then you should always answer Y to this. ++source "drivers/net/ethernet/atheros/ag71xx/Kconfig" + + config ATL2 + tristate "Atheros L2 Fast Ethernet support" +--- a/drivers/net/ethernet/atheros/Makefile ++++ b/drivers/net/ethernet/atheros/Makefile +@@ -3,7 +3,7 @@ + # Makefile for the Atheros network device drivers. + # + +-obj-$(CONFIG_AG71XX) += ag71xx.o ++obj-$(CONFIG_AG71XX) += ag71xx/ + obj-$(CONFIG_ATL1) += atlx/ + obj-$(CONFIG_ATL2) += atlx/ + obj-$(CONFIG_ATL1E) += atl1e/ diff --git a/target/linux/ath79/patches-5.15/430-drivers-link-spi-before-mtd.patch b/target/linux/ath79/patches-5.15/430-drivers-link-spi-before-mtd.patch new file mode 100644 index 0000000000..0cd96909eb --- /dev/null +++ b/target/linux/ath79/patches-5.15/430-drivers-link-spi-before-mtd.patch @@ -0,0 +1,20 @@ +From: Gabor Juhos +Subject: [PATCH] ar71xx: Link SPI before MTD + +SVN-Revision: 22863 +--- + drivers/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/Makefile ++++ b/drivers/Makefile +@@ -80,8 +80,8 @@ obj-y += scsi/ + obj-y += nvme/ + obj-$(CONFIG_ATA) += ata/ + obj-$(CONFIG_TARGET_CORE) += target/ +-obj-$(CONFIG_MTD) += mtd/ + obj-$(CONFIG_SPI) += spi/ ++obj-$(CONFIG_MTD) += mtd/ + obj-$(CONFIG_SPMI) += spmi/ + obj-$(CONFIG_HSI) += hsi/ + obj-$(CONFIG_SLIMBUS) += slimbus/ diff --git a/target/linux/ath79/patches-5.15/440-mtd-ar934x-nand-driver.patch b/target/linux/ath79/patches-5.15/440-mtd-ar934x-nand-driver.patch new file mode 100644 index 0000000000..63bc98e14c --- /dev/null +++ b/target/linux/ath79/patches-5.15/440-mtd-ar934x-nand-driver.patch @@ -0,0 +1,34 @@ +From: Gabor Juhos +Subject: ar71xx: ar934x_nfc: experimental NAND Flash Controller driver for AR934x + +SVN-Revision: 33385 +--- + drivers/mtd/nand/raw/Kconfig | 8 ++++++++ + drivers/mtd/nand/raw/Makefile | 1 + + 2 files changed, 9 insertions(+) + +--- a/drivers/mtd/nand/raw/Kconfig ++++ b/drivers/mtd/nand/raw/Kconfig +@@ -555,4 +555,12 @@ config MTD_NAND_DISKONCHIP_BBTWRITE + load time (assuming you build diskonchip as a module) with the module + parameter "inftl_bbt_write=1". + ++config MTD_NAND_AR934X ++ tristate "Support for NAND controller on Qualcomm Atheros AR934x/QCA955x SoCs" ++ depends on ATH79 || COMPILE_TEST ++ depends on HAS_IOMEM ++ help ++ Enables support for NAND controller on Qualcomm Atheros SoCs. ++ This controller is found on AR934x and QCA955x SoCs. ++ + endif # MTD_RAW_NAND +--- a/drivers/mtd/nand/raw/Makefile ++++ b/drivers/mtd/nand/raw/Makefile +@@ -58,6 +58,7 @@ obj-$(CONFIG_MTD_NAND_ARASAN) += arasan + obj-$(CONFIG_MTD_NAND_INTEL_LGM) += intel-nand-controller.o + obj-$(CONFIG_MTD_NAND_ROCKCHIP) += rockchip-nand-controller.o + obj-$(CONFIG_MTD_NAND_PL35X) += pl35x-nand-controller.o ++obj-$(CONFIG_MTD_NAND_AR934X) += ar934x_nand.o + + nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o + nand-objs += nand_onfi.o diff --git a/target/linux/ath79/patches-5.15/470-MIPS-ath79-swizzle-pci-address-for-ar71xx.patch b/target/linux/ath79/patches-5.15/470-MIPS-ath79-swizzle-pci-address-for-ar71xx.patch new file mode 100644 index 0000000000..1e2715b84c --- /dev/null +++ b/target/linux/ath79/patches-5.15/470-MIPS-ath79-swizzle-pci-address-for-ar71xx.patch @@ -0,0 +1,109 @@ +From: Gabor Juhos +Subject: [PATCH] ar71xx: swizzle address for PCI byte/word access on AR71xx + +Closes #11683. + +SVN-Revision: 32639 +--- + .../mips/include/asm/mach-ath79/mangle-port.h | 111 ++++++++++++++++++ + 1 file changed, 111 insertions(+) + create mode 100644 arch/mips/include/asm/mach-ath79/mangle-port.h + +--- /dev/null ++++ b/arch/mips/include/asm/mach-ath79/mangle-port.h +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (C) 2012 Gabor Juhos ++ * ++ * This file was derived from: inlude/asm-mips/mach-generic/mangle-port.h ++ * Copyright (C) 2003, 2004 Ralf Baechle ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 as published ++ * by the Free Software Foundation. ++ */ ++ ++#ifndef __ASM_MACH_ATH79_MANGLE_PORT_H ++#define __ASM_MACH_ATH79_MANGLE_PORT_H ++ ++#ifdef CONFIG_PCI_AR71XX ++extern unsigned long (ath79_pci_swizzle_b)(unsigned long port); ++extern unsigned long (ath79_pci_swizzle_w)(unsigned long port); ++#else ++#define ath79_pci_swizzle_b(port) (port) ++#define ath79_pci_swizzle_w(port) (port) ++#endif ++ ++#define __swizzle_addr_b(port) ath79_pci_swizzle_b(port) ++#define __swizzle_addr_w(port) ath79_pci_swizzle_w(port) ++#define __swizzle_addr_l(port) (port) ++#define __swizzle_addr_q(port) (port) ++ ++# define ioswabb(a, x) (x) ++# define __mem_ioswabb(a, x) (x) ++# define ioswabw(a, x) (x) ++# define __mem_ioswabw(a, x) cpu_to_le16(x) ++# define ioswabl(a, x) (x) ++# define __mem_ioswabl(a, x) cpu_to_le32(x) ++# define ioswabq(a, x) (x) ++# define __mem_ioswabq(a, x) cpu_to_le64(x) ++ ++#endif /* __ASM_MACH_ATH79_MANGLE_PORT_H */ +--- a/arch/mips/pci/pci-ar71xx.c ++++ b/arch/mips/pci/pci-ar71xx.c +@@ -68,6 +68,45 @@ static const u32 ar71xx_pci_read_mask[8] + 0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0 + }; + ++static unsigned long (*__ath79_pci_swizzle_b)(unsigned long port); ++static unsigned long (*__ath79_pci_swizzle_w)(unsigned long port); ++ ++static inline bool ar71xx_is_pci_addr(unsigned long port) ++{ ++ unsigned long phys = CPHYSADDR(port); ++ ++ return (phys >= AR71XX_PCI_MEM_BASE && ++ phys < AR71XX_PCI_MEM_BASE + AR71XX_PCI_MEM_SIZE); ++} ++ ++static unsigned long ar71xx_pci_swizzle_b(unsigned long port) ++{ ++ return ar71xx_is_pci_addr(port) ? port ^ 3 : port; ++} ++ ++static unsigned long ar71xx_pci_swizzle_w(unsigned long port) ++{ ++ return ar71xx_is_pci_addr(port) ? port ^ 2 : port; ++} ++ ++unsigned long ath79_pci_swizzle_b(unsigned long port) ++{ ++ if (__ath79_pci_swizzle_b) ++ return __ath79_pci_swizzle_b(port); ++ ++ return port; ++} ++EXPORT_SYMBOL(ath79_pci_swizzle_b); ++ ++unsigned long ath79_pci_swizzle_w(unsigned long port) ++{ ++ if (__ath79_pci_swizzle_w) ++ return __ath79_pci_swizzle_w(port); ++ ++ return port; ++} ++EXPORT_SYMBOL(ath79_pci_swizzle_w); ++ + static inline u32 ar71xx_pci_get_ble(int where, int size, int local) + { + u32 t; +@@ -275,6 +314,9 @@ static int ar71xx_pci_probe(struct platf + + register_pci_controller(&apc->pci_ctrl); + ++ __ath79_pci_swizzle_b = ar71xx_pci_swizzle_b; ++ __ath79_pci_swizzle_w = ar71xx_pci_swizzle_w; ++ + return 0; + } + diff --git a/target/linux/ath79/patches-5.15/900-mdio_bitbang_ignore_ta_value.patch b/target/linux/ath79/patches-5.15/900-mdio_bitbang_ignore_ta_value.patch new file mode 100644 index 0000000000..5363bb37b0 --- /dev/null +++ b/target/linux/ath79/patches-5.15/900-mdio_bitbang_ignore_ta_value.patch @@ -0,0 +1,44 @@ +From: Jonas Gorski +Subject: ar71xx: add a workaround for ar8316 not always driving the TA bit to low + +AR8316 behind a GPIO bitbanged MDIO bus fails to drive the turnaround bit +to low despite returning a valid value. Ignore it and just use the +returned value anyway. + +SVN-Revision: 28422 +--- + drivers/net/mdio/mdio-bitbang.c | 16 ++----------------- + 1 file changed, 2 insertions(+), 14 deletions(-) + +--- a/drivers/net/mdio/mdio-bitbang.c ++++ b/drivers/net/mdio/mdio-bitbang.c +@@ -152,7 +152,7 @@ static int mdiobb_cmd_addr(struct mdiobb + int mdiobb_read(struct mii_bus *bus, int phy, int reg) + { + struct mdiobb_ctrl *ctrl = bus->priv; +- int ret, i; ++ int ret; + + if (reg & MII_ADDR_C45) { + reg = mdiobb_cmd_addr(ctrl, phy, reg); +@@ -162,19 +162,7 @@ int mdiobb_read(struct mii_bus *bus, int + + ctrl->ops->set_mdio_dir(ctrl, 0); + +- /* check the turnaround bit: the PHY should be driving it to zero, if this +- * PHY is listed in phy_ignore_ta_mask as having broken TA, skip that +- */ +- if (mdiobb_get_bit(ctrl) != 0 && +- !(bus->phy_ignore_ta_mask & (1 << phy))) { +- /* PHY didn't drive TA low -- flush any bits it +- * may be trying to send. +- */ +- for (i = 0; i < 32; i++) +- mdiobb_get_bit(ctrl); +- +- return 0xffff; +- } ++ mdiobb_get_bit(ctrl); + + ret = mdiobb_get_num(ctrl, 16); + mdiobb_get_bit(ctrl); diff --git a/target/linux/ath79/patches-5.15/901-phy-mdio-bitbang-prevent-rescheduling-during-command.patch b/target/linux/ath79/patches-5.15/901-phy-mdio-bitbang-prevent-rescheduling-during-command.patch new file mode 100644 index 0000000000..e37d9a1f63 --- /dev/null +++ b/target/linux/ath79/patches-5.15/901-phy-mdio-bitbang-prevent-rescheduling-during-command.patch @@ -0,0 +1,61 @@ +From 66e584435ac0de6e0abeb6d7166fe4fe25d6bb73 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski +Date: Tue, 16 Jun 2015 13:15:08 +0200 +Subject: [PATCH] phy/mdio-bitbang: prevent rescheduling during command + +It seems some phys have some maximum timings for accessing the MDIO line, +resulting in bit errors under cpu stress. Prevent this from happening by +disabling interrupts when sending commands. + +Signed-off-by: Jonas Gorski +--- + drivers/net/mdio/mdio-bitbang.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/drivers/net/mdio/mdio-bitbang.c ++++ b/drivers/net/mdio/mdio-bitbang.c +@@ -14,6 +14,7 @@ + * Vitaly Bordug + */ + ++#include + #include + #include + #include +@@ -153,7 +154,9 @@ int mdiobb_read(struct mii_bus *bus, int + { + struct mdiobb_ctrl *ctrl = bus->priv; + int ret; ++ unsigned long flags; + ++ local_irq_save(flags); + if (reg & MII_ADDR_C45) { + reg = mdiobb_cmd_addr(ctrl, phy, reg); + mdiobb_cmd(ctrl, MDIO_C45_READ, phy, reg); +@@ -166,6 +169,7 @@ int mdiobb_read(struct mii_bus *bus, int + + ret = mdiobb_get_num(ctrl, 16); + mdiobb_get_bit(ctrl); ++ local_irq_restore(flags); + return ret; + } + EXPORT_SYMBOL(mdiobb_read); +@@ -173,7 +177,9 @@ EXPORT_SYMBOL(mdiobb_read); + int mdiobb_write(struct mii_bus *bus, int phy, int reg, u16 val) + { + struct mdiobb_ctrl *ctrl = bus->priv; ++ unsigned long flags; + ++ local_irq_save(flags); + if (reg & MII_ADDR_C45) { + reg = mdiobb_cmd_addr(ctrl, phy, reg); + mdiobb_cmd(ctrl, MDIO_C45_WRITE, phy, reg); +@@ -188,6 +194,8 @@ int mdiobb_write(struct mii_bus *bus, in + + ctrl->ops->set_mdio_dir(ctrl, 0); + mdiobb_get_bit(ctrl); ++ local_irq_restore(flags); ++ + return 0; + } + EXPORT_SYMBOL(mdiobb_write); diff --git a/target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch b/target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch new file mode 100644 index 0000000000..7bd6ae8b56 --- /dev/null +++ b/target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch @@ -0,0 +1,899 @@ +From: Felix Fietkau +Subject: [PATCH] ar71xx: fix unaligned access in a few more places + +SVN-Revision: 35130 +--- + arch/mips/include/asm/checksum.h | 83 +++--------------- + include/uapi/linux/ip.h | 2 +- + include/uapi/linux/ipv6.h | 2 +- + include/uapi/linux/tcp.h | 4 ++-- + include/uapi/linux/udp.h | 2 +- + net/netfilter/nf_conntrack_core.c | 4 ++-- + include/uapi/linux/icmp.h | 2 +- + include/uapi/linux/in6.h | 2 +- + net/ipv6/tcp_ipv6.c | 9 +++-- + net/ipv6/datagram.c | 6 ++-- + net/ipv6/exthdrs.c | 2 +- + include/linux/types.h | 5 +++ + net/ipv4/af_inet.c | 4 ++-- + net/ipv4/tcp_output.c | 69 +++++++++-------- + include/uapi/linux/igmp.h | 8 +++--- + net/core/flow_dissector.c | 2 +- + include/uapi/linux/icmpv6.h | 2 +- + include/net/ndisc.h | 10 ++++---- + net/sched/cls_u32.c | 6 +++--- + net/ipv6/ip6_offload.c | 2 +- + include/net/addrconf.h | 2 +- + include/net/inet_ecn.h | 4 ++-- + include/net/ipv6.h | 23 +++++---- + include/net/secure_seq.h | 1 + + include/uapi/linux/in.h | 2 +- + net/ipv6/ip6_fib.h | 2 +- + net/netfilter/nf_conntrack_proto_tcp.c | 2 +- + net/xfrm/xfrm_input.c | 4 ++-- + net/ipv4/tcp_input.c | 12 ++++--- + include/uapi/linux/if_pppox.h | 1 + + net/ipv6/netfilter/nf_log_ipv6.c | 4 ++-- + include/net/neighbour.h | 6 +++-- + include/uapi/linux/netfilter_arp/arp_tables.h | 2 +- + net/core/utils.c | 10 +++++-- + include/linux/etherdevice.h | 11 ++++--- + net/ipv4/tcp_offload.c | 6 +++--- + net/ipv6/netfilter/ip6table_mangle.c | 4 ++-- + 37 file changed, 171 insertions(+), 141 deletions(-) + +--- a/arch/mips/include/asm/checksum.h ++++ b/arch/mips/include/asm/checksum.h +@@ -100,26 +100,30 @@ static inline __sum16 ip_fast_csum(const + const unsigned int *stop = word + ihl; + unsigned int csum; + int carry; ++ unsigned int w; + +- csum = word[0]; +- csum += word[1]; +- carry = (csum < word[1]); ++ csum = net_hdr_word(word++); ++ ++ w = net_hdr_word(word++); ++ csum += w; ++ carry = (csum < w); + csum += carry; + +- csum += word[2]; +- carry = (csum < word[2]); ++ w = net_hdr_word(word++); ++ csum += w; ++ carry = (csum < w); + csum += carry; + +- csum += word[3]; +- carry = (csum < word[3]); ++ w = net_hdr_word(word++); ++ csum += w; ++ carry = (csum < w); + csum += carry; + +- word += 4; + do { +- csum += *word; +- carry = (csum < *word); ++ w = net_hdr_word(word++); ++ csum += w; ++ carry = (csum < w); + csum += carry; +- word++; + } while (word != stop); + + return csum_fold(csum); +@@ -182,73 +186,6 @@ static inline __sum16 ip_compute_csum(co + return csum_fold(csum_partial(buff, len, 0)); + } + +-#define _HAVE_ARCH_IPV6_CSUM +-static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr, +- const struct in6_addr *daddr, +- __u32 len, __u8 proto, +- __wsum sum) +-{ +- __wsum tmp; +- +- __asm__( +- " .set push # csum_ipv6_magic\n" +- " .set noreorder \n" +- " .set noat \n" +- " addu %0, %5 # proto (long in network byte order)\n" +- " sltu $1, %0, %5 \n" +- " addu %0, $1 \n" +- +- " addu %0, %6 # csum\n" +- " sltu $1, %0, %6 \n" +- " lw %1, 0(%2) # four words source address\n" +- " addu %0, $1 \n" +- " addu %0, %1 \n" +- " sltu $1, %0, %1 \n" +- +- " lw %1, 4(%2) \n" +- " addu %0, $1 \n" +- " addu %0, %1 \n" +- " sltu $1, %0, %1 \n" +- +- " lw %1, 8(%2) \n" +- " addu %0, $1 \n" +- " addu %0, %1 \n" +- " sltu $1, %0, %1 \n" +- +- " lw %1, 12(%2) \n" +- " addu %0, $1 \n" +- " addu %0, %1 \n" +- " sltu $1, %0, %1 \n" +- +- " lw %1, 0(%3) \n" +- " addu %0, $1 \n" +- " addu %0, %1 \n" +- " sltu $1, %0, %1 \n" +- +- " lw %1, 4(%3) \n" +- " addu %0, $1 \n" +- " addu %0, %1 \n" +- " sltu $1, %0, %1 \n" +- +- " lw %1, 8(%3) \n" +- " addu %0, $1 \n" +- " addu %0, %1 \n" +- " sltu $1, %0, %1 \n" +- +- " lw %1, 12(%3) \n" +- " addu %0, $1 \n" +- " addu %0, %1 \n" +- " sltu $1, %0, %1 \n" +- +- " addu %0, $1 # Add final carry\n" +- " .set pop" +- : "=&r" (sum), "=&r" (tmp) +- : "r" (saddr), "r" (daddr), +- "0" (htonl(len)), "r" (htonl(proto)), "r" (sum)); +- +- return csum_fold(sum); +-} +- + #include + #endif /* CONFIG_GENERIC_CSUM */ + +--- a/include/uapi/linux/ip.h ++++ b/include/uapi/linux/ip.h +@@ -106,7 +106,7 @@ struct iphdr { + __be32 daddr; + ); + /*The options start here. */ +-}; ++} __attribute__((packed, aligned(2))); + + + struct ip_auth_hdr { +--- a/include/uapi/linux/ipv6.h ++++ b/include/uapi/linux/ipv6.h +@@ -135,7 +135,7 @@ struct ipv6hdr { + struct in6_addr saddr; + struct in6_addr daddr; + ); +-}; ++} __attribute__((packed, aligned(2))); + + + /* index values for the variables in ipv6_devconf */ +--- a/include/uapi/linux/tcp.h ++++ b/include/uapi/linux/tcp.h +@@ -55,7 +55,7 @@ struct tcphdr { + __be16 window; + __sum16 check; + __be16 urg_ptr; +-}; ++} __attribute__((packed, aligned(2))); + + /* + * The union cast uses a gcc extension to avoid aliasing problems +@@ -65,7 +65,7 @@ struct tcphdr { + union tcp_word_hdr { + struct tcphdr hdr; + __be32 words[5]; +-}; ++} __attribute__((packed, aligned(2))); + + #define tcp_flag_word(tp) (((union tcp_word_hdr *)(tp))->words[3]) + +--- a/include/uapi/linux/udp.h ++++ b/include/uapi/linux/udp.h +@@ -25,7 +25,7 @@ struct udphdr { + __be16 dest; + __be16 len; + __sum16 check; +-}; ++} __attribute__((packed, aligned(2))); + + /* UDP socket options */ + #define UDP_CORK 1 /* Never send partially complete segments */ +--- a/net/netfilter/nf_conntrack_core.c ++++ b/net/netfilter/nf_conntrack_core.c +@@ -308,8 +308,8 @@ nf_ct_get_tuple(const struct sk_buff *sk + + switch (l3num) { + case NFPROTO_IPV4: +- tuple->src.u3.ip = ap[0]; +- tuple->dst.u3.ip = ap[1]; ++ tuple->src.u3.ip = net_hdr_word(ap++); ++ tuple->dst.u3.ip = net_hdr_word(ap); + break; + case NFPROTO_IPV6: + memcpy(tuple->src.u3.ip6, ap, sizeof(tuple->src.u3.ip6)); +--- a/include/uapi/linux/icmp.h ++++ b/include/uapi/linux/icmp.h +@@ -102,7 +102,7 @@ struct icmphdr { + } frag; + __u8 reserved[4]; + } un; +-}; ++} __attribute__((packed, aligned(2))); + + + /* +--- a/include/uapi/linux/in6.h ++++ b/include/uapi/linux/in6.h +@@ -43,7 +43,7 @@ struct in6_addr { + #define s6_addr16 in6_u.u6_addr16 + #define s6_addr32 in6_u.u6_addr32 + #endif +-}; ++} __attribute__((packed, aligned(2))); + #endif /* __UAPI_DEF_IN6_ADDR */ + + #if __UAPI_DEF_SOCKADDR_IN6 +--- a/net/ipv6/tcp_ipv6.c ++++ b/net/ipv6/tcp_ipv6.c +@@ -35,6 +35,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -944,10 +945,10 @@ static void tcp_v6_send_response(const s + topt = (__be32 *)(t1 + 1); + + if (tsecr) { +- *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | +- (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP); +- *topt++ = htonl(tsval); +- *topt++ = htonl(tsecr); ++ put_unaligned_be32((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | ++ (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP, topt++); ++ put_unaligned_be32(tsval, topt++); ++ put_unaligned_be32(tsecr, topt++); + } + + if (mrst) +--- a/include/linux/ipv6.h ++++ b/include/linux/ipv6.h +@@ -6,6 +6,7 @@ + + #define ipv6_optlen(p) (((p)->hdrlen+1) << 3) + #define ipv6_authlen(p) (((p)->hdrlen+2) << 2) ++ + /* + * This structure contains configuration options per IPv6 link. + */ +--- a/net/ipv6/datagram.c ++++ b/net/ipv6/datagram.c +@@ -492,7 +492,7 @@ int ipv6_recv_error(struct sock *sk, str + ipv6_iface_scope_id(&sin->sin6_addr, + IP6CB(skb)->iif); + } else { +- ipv6_addr_set_v4mapped(*(__be32 *)(nh + serr->addr_offset), ++ ipv6_addr_set_v4mapped(net_hdr_word(nh + serr->addr_offset), + &sin->sin6_addr); + sin->sin6_scope_id = 0; + } +@@ -846,12 +846,12 @@ int ip6_datagram_send_ctl(struct net *ne + } + + if (fl6->flowlabel&IPV6_FLOWINFO_MASK) { +- if ((fl6->flowlabel^*(__be32 *)CMSG_DATA(cmsg))&~IPV6_FLOWINFO_MASK) { ++ if ((fl6->flowlabel^net_hdr_word(CMSG_DATA(cmsg)))&~IPV6_FLOWINFO_MASK) { + err = -EINVAL; + goto exit_f; + } + } +- fl6->flowlabel = IPV6_FLOWINFO_MASK & *(__be32 *)CMSG_DATA(cmsg); ++ fl6->flowlabel = IPV6_FLOWINFO_MASK & net_hdr_word(CMSG_DATA(cmsg)); + break; + + case IPV6_2292HOPOPTS: +--- a/net/ipv6/exthdrs.c ++++ b/net/ipv6/exthdrs.c +@@ -1002,7 +1002,7 @@ static bool ipv6_hop_jumbo(struct sk_buf + goto drop; + } + +- pkt_len = ntohl(*(__be32 *)(nh + optoff + 2)); ++ pkt_len = ntohl(net_hdr_word(nh + optoff + 2)); + if (pkt_len <= IPV6_MAXPLEN) { + __IP6_INC_STATS(net, idev, IPSTATS_MIB_INHDRERRORS); + icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2); +--- a/include/linux/types.h ++++ b/include/linux/types.h +@@ -231,5 +231,11 @@ typedef void (*swap_func_t)(void *a, voi + typedef int (*cmp_r_func_t)(const void *a, const void *b, const void *priv); + typedef int (*cmp_func_t)(const void *a, const void *b); + ++struct net_hdr_word { ++ u32 words[1]; ++} __attribute__((packed, aligned(2))); ++ ++#define net_hdr_word(_p) (((struct net_hdr_word *) (_p))->words[0]) ++ + #endif /* __ASSEMBLY__ */ + #endif /* _LINUX_TYPES_H */ +--- a/net/ipv4/af_inet.c ++++ b/net/ipv4/af_inet.c +@@ -1477,8 +1477,8 @@ struct sk_buff *inet_gro_receive(struct + if (unlikely(ip_fast_csum((u8 *)iph, 5))) + goto out_unlock; + +- id = ntohl(*(__be32 *)&iph->id); +- flush = (u16)((ntohl(*(__be32 *)iph) ^ skb_gro_len(skb)) | (id & ~IP_DF)); ++ id = ntohl(net_hdr_word(&iph->id)); ++ flush = (u16)((ntohl(net_hdr_word(iph)) ^ skb_gro_len(skb)) | (id & ~IP_DF)); + id >>= 16; + + list_for_each_entry(p, head, list) { +--- a/net/ipv4/tcp_output.c ++++ b/net/ipv4/tcp_output.c +@@ -609,48 +609,53 @@ static void tcp_options_write(__be32 *pt + u16 options = opts->options; /* mungable copy */ + + if (unlikely(OPTION_MD5 & options)) { +- *ptr++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | +- (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG); ++ net_hdr_word(ptr++) = ++ htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | ++ (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG); + /* overload cookie hash location */ + opts->hash_location = (__u8 *)ptr; + ptr += 4; + } + + if (unlikely(opts->mss)) { +- *ptr++ = htonl((TCPOPT_MSS << 24) | +- (TCPOLEN_MSS << 16) | +- opts->mss); ++ net_hdr_word(ptr++) = ++ htonl((TCPOPT_MSS << 24) | (TCPOLEN_MSS << 16) | ++ opts->mss); + } + + if (likely(OPTION_TS & options)) { + if (unlikely(OPTION_SACK_ADVERTISE & options)) { +- *ptr++ = htonl((TCPOPT_SACK_PERM << 24) | +- (TCPOLEN_SACK_PERM << 16) | +- (TCPOPT_TIMESTAMP << 8) | +- TCPOLEN_TIMESTAMP); ++ net_hdr_word(ptr++) = ++ htonl((TCPOPT_SACK_PERM << 24) | ++ (TCPOLEN_SACK_PERM << 16) | ++ (TCPOPT_TIMESTAMP << 8) | ++ TCPOLEN_TIMESTAMP); + options &= ~OPTION_SACK_ADVERTISE; + } else { +- *ptr++ = htonl((TCPOPT_NOP << 24) | +- (TCPOPT_NOP << 16) | +- (TCPOPT_TIMESTAMP << 8) | +- TCPOLEN_TIMESTAMP); ++ net_hdr_word(ptr++) = ++ htonl((TCPOPT_NOP << 24) | ++ (TCPOPT_NOP << 16) | ++ (TCPOPT_TIMESTAMP << 8) | ++ TCPOLEN_TIMESTAMP); + } +- *ptr++ = htonl(opts->tsval); +- *ptr++ = htonl(opts->tsecr); ++ net_hdr_word(ptr++) = htonl(opts->tsval); ++ net_hdr_word(ptr++) = htonl(opts->tsecr); + } + + if (unlikely(OPTION_SACK_ADVERTISE & options)) { +- *ptr++ = htonl((TCPOPT_NOP << 24) | +- (TCPOPT_NOP << 16) | +- (TCPOPT_SACK_PERM << 8) | +- TCPOLEN_SACK_PERM); ++ net_hdr_word(ptr++) = ++ htonl((TCPOPT_NOP << 24) | ++ (TCPOPT_NOP << 16) | ++ (TCPOPT_SACK_PERM << 8) | ++ TCPOLEN_SACK_PERM); + } + + if (unlikely(OPTION_WSCALE & options)) { +- *ptr++ = htonl((TCPOPT_NOP << 24) | +- (TCPOPT_WINDOW << 16) | +- (TCPOLEN_WINDOW << 8) | +- opts->ws); ++ net_hdr_word(ptr++) = ++ htonl((TCPOPT_NOP << 24) | ++ (TCPOPT_WINDOW << 16) | ++ (TCPOLEN_WINDOW << 8) | ++ opts->ws); + } + + if (unlikely(opts->num_sack_blocks)) { +@@ -658,16 +663,17 @@ static void tcp_options_write(__be32 *pt + tp->duplicate_sack : tp->selective_acks; + int this_sack; + +- *ptr++ = htonl((TCPOPT_NOP << 24) | +- (TCPOPT_NOP << 16) | +- (TCPOPT_SACK << 8) | +- (TCPOLEN_SACK_BASE + (opts->num_sack_blocks * ++ net_hdr_word(ptr++) = ++ htonl((TCPOPT_NOP << 24) | ++ (TCPOPT_NOP << 16) | ++ (TCPOPT_SACK << 8) | ++ (TCPOLEN_SACK_BASE + (opts->num_sack_blocks * + TCPOLEN_SACK_PERBLOCK))); + + for (this_sack = 0; this_sack < opts->num_sack_blocks; + ++this_sack) { +- *ptr++ = htonl(sp[this_sack].start_seq); +- *ptr++ = htonl(sp[this_sack].end_seq); ++ net_hdr_word(ptr++) = htonl(sp[this_sack].start_seq); ++ net_hdr_word(ptr++) = htonl(sp[this_sack].end_seq); + } + + tp->rx_opt.dsack = 0; +@@ -680,13 +686,14 @@ static void tcp_options_write(__be32 *pt + + if (foc->exp) { + len = TCPOLEN_EXP_FASTOPEN_BASE + foc->len; +- *ptr = htonl((TCPOPT_EXP << 24) | (len << 16) | ++ net_hdr_word(ptr) = ++ htonl((TCPOPT_EXP << 24) | (len << 16) | + TCPOPT_FASTOPEN_MAGIC); + p += TCPOLEN_EXP_FASTOPEN_BASE; + } else { + len = TCPOLEN_FASTOPEN_BASE + foc->len; +- *p++ = TCPOPT_FASTOPEN; +- *p++ = len; ++ net_hdr_word(p++) = TCPOPT_FASTOPEN; ++ net_hdr_word(p++) = len; + } + + memcpy(p, foc->val, foc->len); +--- a/include/uapi/linux/igmp.h ++++ b/include/uapi/linux/igmp.h +@@ -33,7 +33,7 @@ struct igmphdr { + __u8 code; /* For newer IGMP */ + __sum16 csum; + __be32 group; +-}; ++} __attribute__((packed, aligned(2))); + + /* V3 group record types [grec_type] */ + #define IGMPV3_MODE_IS_INCLUDE 1 +@@ -49,7 +49,7 @@ struct igmpv3_grec { + __be16 grec_nsrcs; + __be32 grec_mca; + __be32 grec_src[0]; +-}; ++} __attribute__((packed, aligned(2))); + + struct igmpv3_report { + __u8 type; +@@ -58,7 +58,7 @@ struct igmpv3_report { + __be16 resv2; + __be16 ngrec; + struct igmpv3_grec grec[0]; +-}; ++} __attribute__((packed, aligned(2))); + + struct igmpv3_query { + __u8 type; +@@ -79,7 +79,7 @@ struct igmpv3_query { + __u8 qqic; + __be16 nsrcs; + __be32 srcs[0]; +-}; ++} __attribute__((packed, aligned(2))); + + #define IGMP_HOST_MEMBERSHIP_QUERY 0x11 /* From RFC1112 */ + #define IGMP_HOST_MEMBERSHIP_REPORT 0x12 /* Ditto */ +--- a/net/core/flow_dissector.c ++++ b/net/core/flow_dissector.c +@@ -129,7 +129,7 @@ __be32 __skb_flow_get_ports(const struct + ports = __skb_header_pointer(skb, thoff + poff, + sizeof(_ports), data, hlen, &_ports); + if (ports) +- return *ports; ++ return (__be32)net_hdr_word(ports); + } + + return 0; +--- a/include/uapi/linux/icmpv6.h ++++ b/include/uapi/linux/icmpv6.h +@@ -78,7 +78,7 @@ struct icmp6hdr { + #define icmp6_addrconf_other icmp6_dataun.u_nd_ra.other + #define icmp6_rt_lifetime icmp6_dataun.u_nd_ra.rt_lifetime + #define icmp6_router_pref icmp6_dataun.u_nd_ra.router_pref +-}; ++} __attribute__((packed, aligned(2))); + + + #define ICMPV6_ROUTER_PREF_LOW 0x3 +--- a/include/net/ndisc.h ++++ b/include/net/ndisc.h +@@ -93,7 +93,7 @@ struct ra_msg { + struct icmp6hdr icmph; + __be32 reachable_time; + __be32 retrans_timer; +-}; ++} __attribute__((packed, aligned(2))); + + struct rd_msg { + struct icmp6hdr icmph; +@@ -372,10 +372,10 @@ static inline u32 ndisc_hashfn(const voi + { + const u32 *p32 = pkey; + +- return (((p32[0] ^ hash32_ptr(dev)) * hash_rnd[0]) + +- (p32[1] * hash_rnd[1]) + +- (p32[2] * hash_rnd[2]) + +- (p32[3] * hash_rnd[3])); ++ return (((net_hdr_word(&p32[0]) ^ hash32_ptr(dev)) * hash_rnd[0]) + ++ (net_hdr_word(&p32[1]) * hash_rnd[1]) + ++ (net_hdr_word(&p32[2]) * hash_rnd[2]) + ++ (net_hdr_word(&p32[3]) * hash_rnd[3])); + } + + static inline struct neighbour *__ipv6_neigh_lookup_noref(struct net_device *dev, const void *pkey) +--- a/net/sched/cls_u32.c ++++ b/net/sched/cls_u32.c +@@ -155,7 +155,7 @@ next_knode: + data = skb_header_pointer(skb, toff, 4, &hdata); + if (!data) + goto out; +- if ((*data ^ key->val) & key->mask) { ++ if ((net_hdr_word(data) ^ key->val) & key->mask) { + n = rcu_dereference_bh(n->next); + goto next_knode; + } +@@ -206,8 +206,8 @@ check_terminal: + &hdata); + if (!data) + goto out; +- sel = ht->divisor & u32_hash_fold(*data, &n->sel, +- n->fshift); ++ sel = ht->divisor & u32_hash_fold(net_hdr_word(data), ++ &n->sel, n->fshift); + } + if (!(n->sel.flags & (TC_U32_VAROFFSET | TC_U32_OFFSET | TC_U32_EAT))) + goto next_ht; +--- a/net/ipv6/ip6_offload.c ++++ b/net/ipv6/ip6_offload.c +@@ -241,7 +241,7 @@ INDIRECT_CALLABLE_SCOPE struct sk_buff * + continue; + + iph2 = (struct ipv6hdr *)(p->data + off); +- first_word = *(__be32 *)iph ^ *(__be32 *)iph2; ++ first_word = net_hdr_word(iph) ^ net_hdr_word(iph2); + + /* All fields must match except length and Traffic Class. + * XXX skbs on the gro_list have all been parsed and pulled +--- a/include/net/addrconf.h ++++ b/include/net/addrconf.h +@@ -52,7 +52,7 @@ struct prefix_info { + __be32 reserved2; + + struct in6_addr prefix; +-}; ++} __attribute__((packed, aligned(2))); + + /* rfc4861 4.6.2: IPv6 PIO is 32 bytes in size */ + static_assert(sizeof(struct prefix_info) == 32); +--- a/include/net/inet_ecn.h ++++ b/include/net/inet_ecn.h +@@ -138,9 +138,9 @@ static inline int IP6_ECN_set_ce(struct + if (INET_ECN_is_not_ect(ipv6_get_dsfield(iph))) + return 0; + +- from = *(__be32 *)iph; ++ from = net_hdr_word(iph); + to = from | htonl(INET_ECN_CE << 20); +- *(__be32 *)iph = to; ++ net_hdr_word(iph) = to; + if (skb->ip_summed == CHECKSUM_COMPLETE) + skb->csum = csum_add(csum_sub(skb->csum, (__force __wsum)from), + (__force __wsum)to); +--- a/include/net/ipv6.h ++++ b/include/net/ipv6.h +@@ -147,7 +147,7 @@ struct frag_hdr { + __u8 reserved; + __be16 frag_off; + __be32 identification; +-}; ++} __attribute__((packed, aligned(2))); + + #define IP6_MF 0x0001 + #define IP6_OFFSET 0xFFF8 +@@ -561,8 +561,8 @@ static inline void __ipv6_addr_set_half( + } + #endif + #endif +- addr[0] = wh; +- addr[1] = wl; ++ net_hdr_word(&addr[0]) = wh; ++ net_hdr_word(&addr[1]) = wl; + } + + static inline void ipv6_addr_set(struct in6_addr *addr, +@@ -621,6 +621,8 @@ static inline bool ipv6_prefix_equal(con + const __be32 *a1 = addr1->s6_addr32; + const __be32 *a2 = addr2->s6_addr32; + unsigned int pdw, pbi; ++ /* Used for last <32-bit fraction of prefix */ ++ u32 pbia1, pbia2; + + /* check complete u32 in prefix */ + pdw = prefixlen >> 5; +@@ -629,7 +631,9 @@ static inline bool ipv6_prefix_equal(con + + /* check incomplete u32 in prefix */ + pbi = prefixlen & 0x1f; +- if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi)))) ++ pbia1 = net_hdr_word(&a1[pdw]); ++ pbia2 = net_hdr_word(&a2[pdw]); ++ if (pbi && ((pbia1 ^ pbia2) & htonl((0xffffffff) << (32 - pbi)))) + return false; + + return true; +@@ -746,13 +750,13 @@ static inline void ipv6_addr_set_v4mappe + */ + static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen) + { +- const __be32 *a1 = token1, *a2 = token2; ++ const struct in6_addr *a1 = token1, *a2 = token2; + int i; + + addrlen >>= 2; + + for (i = 0; i < addrlen; i++) { +- __be32 xb = a1[i] ^ a2[i]; ++ __be32 xb = a1->s6_addr32[i] ^ a2->s6_addr32[i]; + if (xb) + return i * 32 + 31 - __fls(ntohl(xb)); + } +@@ -946,17 +950,18 @@ static inline u32 ip6_multipath_hash_fie + static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass, + __be32 flowlabel) + { +- *(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | flowlabel; ++ net_hdr_word((__be32 *)hdr) = ++ htonl(0x60000000 | (tclass << 20)) | flowlabel; + } + + static inline __be32 ip6_flowinfo(const struct ipv6hdr *hdr) + { +- return *(__be32 *)hdr & IPV6_FLOWINFO_MASK; ++ return net_hdr_word((__be32 *)hdr) & IPV6_FLOWINFO_MASK; + } + + static inline __be32 ip6_flowlabel(const struct ipv6hdr *hdr) + { +- return *(__be32 *)hdr & IPV6_FLOWLABEL_MASK; ++ return net_hdr_word((__be32 *)hdr) & IPV6_FLOWLABEL_MASK; + } + + static inline u8 ip6_tclass(__be32 flowinfo) +--- a/include/net/secure_seq.h ++++ b/include/net/secure_seq.h +@@ -3,6 +3,7 @@ + #define _NET_SECURE_SEQ + + #include ++#include + + u64 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport); + u64 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, +--- a/include/uapi/linux/in.h ++++ b/include/uapi/linux/in.h +@@ -88,7 +88,7 @@ enum { + /* Internet address. */ + struct in_addr { + __be32 s_addr; +-}; ++} __attribute__((packed, aligned(2))); + #endif + + #define IP_TOS 1 +--- a/net/ipv6/ip6_fib.c ++++ b/net/ipv6/ip6_fib.c +@@ -141,7 +141,7 @@ static __be32 addr_bit_set(const void *t + * See include/asm-generic/bitops/le.h. + */ + return (__force __be32)(1 << ((~fn_bit ^ BITOP_BE32_SWIZZLE) & 0x1f)) & +- addr[fn_bit >> 5]; ++ net_hdr_word(&addr[fn_bit >> 5]); + } + + struct fib6_info *fib6_info_alloc(gfp_t gfp_flags, bool with_fib6_nh) +--- a/net/netfilter/nf_conntrack_proto_tcp.c ++++ b/net/netfilter/nf_conntrack_proto_tcp.c +@@ -400,7 +400,7 @@ static void tcp_sack(const struct sk_buf + + /* Fast path for timestamp-only option */ + if (length == TCPOLEN_TSTAMP_ALIGNED +- && *(__be32 *)ptr == htonl((TCPOPT_NOP << 24) ++ && net_hdr_word(ptr) == htonl((TCPOPT_NOP << 24) + | (TCPOPT_NOP << 16) + | (TCPOPT_TIMESTAMP << 8) + | TCPOLEN_TIMESTAMP)) +--- a/net/xfrm/xfrm_input.c ++++ b/net/xfrm/xfrm_input.c +@@ -167,8 +167,8 @@ int xfrm_parse_spi(struct sk_buff *skb, + if (!pskb_may_pull(skb, hlen)) + return -EINVAL; + +- *spi = *(__be32 *)(skb_transport_header(skb) + offset); +- *seq = *(__be32 *)(skb_transport_header(skb) + offset_seq); ++ *spi = net_hdr_word(skb_transport_header(skb) + offset); ++ *seq = net_hdr_word(skb_transport_header(skb) + offset_seq); + return 0; + } + EXPORT_SYMBOL(xfrm_parse_spi); +--- a/net/ipv4/tcp_input.c ++++ b/net/ipv4/tcp_input.c +@@ -4175,14 +4175,16 @@ static bool tcp_parse_aligned_timestamp( + { + const __be32 *ptr = (const __be32 *)(th + 1); + +- if (*ptr == htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) +- | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { ++ if (net_hdr_word(ptr) == ++ htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | ++ (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { + tp->rx_opt.saw_tstamp = 1; + ++ptr; +- tp->rx_opt.rcv_tsval = ntohl(*ptr); ++ tp->rx_opt.rcv_tsval = get_unaligned_be32(ptr); + ++ptr; +- if (*ptr) +- tp->rx_opt.rcv_tsecr = ntohl(*ptr) - tp->tsoffset; ++ if (net_hdr_word(ptr)) ++ tp->rx_opt.rcv_tsecr = get_unaligned_be32(ptr) - ++ tp->tsoffset; + else + tp->rx_opt.rcv_tsecr = 0; + return true; +--- a/include/uapi/linux/if_pppox.h ++++ b/include/uapi/linux/if_pppox.h +@@ -51,6 +51,7 @@ struct pppoe_addr { + */ + struct pptp_addr { + __u16 call_id; ++ __u16 pad; + struct in_addr sin_addr; + }; + +--- a/include/net/neighbour.h ++++ b/include/net/neighbour.h +@@ -270,8 +270,10 @@ static inline bool neigh_key_eq128(const + const u32 *n32 = (const u32 *)n->primary_key; + const u32 *p32 = pkey; + +- return ((n32[0] ^ p32[0]) | (n32[1] ^ p32[1]) | +- (n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0; ++ return ((n32[0] ^ net_hdr_word(&p32[0])) | ++ (n32[1] ^ net_hdr_word(&p32[1])) | ++ (n32[2] ^ net_hdr_word(&p32[2])) | ++ (n32[3] ^ net_hdr_word(&p32[3]))) == 0; + } + + static inline struct neighbour *___neigh_lookup_noref( +--- a/include/uapi/linux/netfilter_arp/arp_tables.h ++++ b/include/uapi/linux/netfilter_arp/arp_tables.h +@@ -70,7 +70,7 @@ struct arpt_arp { + __u8 flags; + /* Inverse flags */ + __u16 invflags; +-}; ++} __attribute__((aligned(4))); + + /* Values for "flag" field in struct arpt_ip (general arp structure). + * No flags defined yet. +--- a/net/core/utils.c ++++ b/net/core/utils.c +@@ -460,8 +460,14 @@ void inet_proto_csum_replace16(__sum16 * + bool pseudohdr) + { + __be32 diff[] = { +- ~from[0], ~from[1], ~from[2], ~from[3], +- to[0], to[1], to[2], to[3], ++ ~net_hdr_word(&from[0]), ++ ~net_hdr_word(&from[1]), ++ ~net_hdr_word(&from[2]), ++ ~net_hdr_word(&from[3]), ++ net_hdr_word(&to[0]), ++ net_hdr_word(&to[1]), ++ net_hdr_word(&to[2]), ++ net_hdr_word(&to[3]), + }; + if (skb->ip_summed != CHECKSUM_PARTIAL) { + *sum = csum_fold(csum_partial(diff, sizeof(diff), +--- a/include/linux/etherdevice.h ++++ b/include/linux/etherdevice.h +@@ -525,7 +525,7 @@ static inline bool is_etherdev_addr(cons + * @b: Pointer to Ethernet header + * + * Compare two Ethernet headers, returns 0 if equal. +- * This assumes that the network header (i.e., IP header) is 4-byte ++ * This assumes that the network header (i.e., IP header) is 2-byte + * aligned OR the platform can handle unaligned access. This is the + * case for all packets coming into netif_receive_skb or similar + * entry points. +@@ -548,11 +548,12 @@ static inline unsigned long compare_ethe + fold |= *(unsigned long *)(a + 6) ^ *(unsigned long *)(b + 6); + return fold; + #else +- u32 *a32 = (u32 *)((u8 *)a + 2); +- u32 *b32 = (u32 *)((u8 *)b + 2); ++ const u16 *a16 = a; ++ const u16 *b16 = b; + +- return (*(u16 *)a ^ *(u16 *)b) | (a32[0] ^ b32[0]) | +- (a32[1] ^ b32[1]) | (a32[2] ^ b32[2]); ++ return (a16[0] ^ b16[0]) | (a16[1] ^ b16[1]) | (a16[2] ^ b16[2]) | ++ (a16[3] ^ b16[3]) | (a16[4] ^ b16[4]) | (a16[5] ^ b16[5]) | ++ (a16[6] ^ b16[6]); + #endif + } + +--- a/net/ipv4/tcp_offload.c ++++ b/net/ipv4/tcp_offload.c +@@ -223,7 +223,7 @@ struct sk_buff *tcp_gro_receive(struct l + + th2 = tcp_hdr(p); + +- if (*(u32 *)&th->source ^ *(u32 *)&th2->source) { ++ if (net_hdr_word(&th->source) ^ net_hdr_word(&th2->source)) { + NAPI_GRO_CB(p)->same_flow = 0; + continue; + } +@@ -241,8 +241,8 @@ found: + ~(TCP_FLAG_CWR | TCP_FLAG_FIN | TCP_FLAG_PSH)); + flush |= (__force int)(th->ack_seq ^ th2->ack_seq); + for (i = sizeof(*th); i < thlen; i += 4) +- flush |= *(u32 *)((u8 *)th + i) ^ +- *(u32 *)((u8 *)th2 + i); ++ flush |= net_hdr_word((u8 *)th + i) ^ ++ net_hdr_word((u8 *)th2 + i); + + /* When we receive our second frame we can made a decision on if we + * continue this flow as an atomic flow with a fixed ID or if we use +--- a/net/ipv6/netfilter/ip6table_mangle.c ++++ b/net/ipv6/netfilter/ip6table_mangle.c +@@ -44,7 +44,7 @@ ip6t_mangle_out(struct sk_buff *skb, con + hop_limit = ipv6_hdr(skb)->hop_limit; + + /* flowlabel and prio (includes version, which shouldn't change either */ +- flowlabel = *((u_int32_t *)ipv6_hdr(skb)); ++ flowlabel = net_hdr_word(ipv6_hdr(skb)); + + ret = ip6t_do_table(skb, state, priv); + +@@ -53,7 +53,7 @@ ip6t_mangle_out(struct sk_buff *skb, con + !ipv6_addr_equal(&ipv6_hdr(skb)->daddr, &daddr) || + skb->mark != mark || + ipv6_hdr(skb)->hop_limit != hop_limit || +- flowlabel != *((u_int32_t *)ipv6_hdr(skb)))) { ++ flowlabel != net_hdr_word(ipv6_hdr(skb)))) { + err = ip6_route_me_harder(state->net, state->sk, skb); + if (err < 0) + ret = NF_DROP_ERR(err); diff --git a/target/linux/ath79/patches-5.15/920-mikrotik-rb4xx.patch b/target/linux/ath79/patches-5.15/920-mikrotik-rb4xx.patch new file mode 100644 index 0000000000..4743ad46e2 --- /dev/null +++ b/target/linux/ath79/patches-5.15/920-mikrotik-rb4xx.patch @@ -0,0 +1,121 @@ +From: Christopher Hill +Subject: [PATCH] ath79: add Mikrotik rb4xx series drivers + +This adds 3 Mikrotik rb4xx series drivers as follows: + +rb4xx-cpld: This is in the mfd subsystem, and is the parent CPLD device +that interfaces between the SoC SPI bus and its two children below. +rb4xx-gpio: This is the GPIO expander. +rb4xx-nand: This is the NAND driver. + +The history of this code comes in three phases. + +1. The first is a May 2015 attempt to push the equivalient ar71xx rb4xx +drivers upstream. See https://lore.kernel.org/patchwork/patch/940880/. + +Module-author: Gabor Juhos +Module-author: Imre Kaloz +Module-author: Bert Vermeulen + +2. Next several ar71xx patches were applied bringing the code current. + +commit 7bbf4117c6fe4b764d9d7c62fb2bcf6dd93bff2c +Submitted-by: Hauke Mehrtens + +commit af79fdbe4af32a287798b579141204bda056b8aa +commit 889272d92db689fd9c910243635e44c9d8323095 +commit e21cb649a235180563363b8af5ba8296b9ac0baa +commit 7c09fa4a7492ca436f2c94bd9a465b7c5bbeed6f +Submitted-by: Felix Fietkau + +3. Finally a heavy refactor to split the driver into the three new +subsystems, and updated to work with the device tree configuration, plus +updates and review feedback incorporated + +Reviewed-by: Thibaut VARÈNE +Submitted-by: Christopher Hill +--- + drivers/mfd/Kconfig | 8 ++++++++ + drivers/mfd/Makefile | 1 + + drivers/gpio/Kconfig | 6 ++++++ + drivers/gpio/Makefile | 1 + + drivers/mtd/nand/raw/Kconfig | 7 +++++++ + drivers/mtd/nand/raw/Makefile | 1 + + 6 files changed, 24 insertions(+) + +--- a/drivers/mfd/Kconfig ++++ b/drivers/mfd/Kconfig +@@ -2176,6 +2176,14 @@ config RAVE_SP_CORE + Select this to get support for the Supervisory Processor + device found on several devices in RAVE line of hardware. + ++config MFD_RB4XX_CPLD ++ tristate "CPLD driver for Mikrotik RB4xx series boards" ++ select MFD_CORE ++ depends on ATH79 || COMPILE_TEST ++ help ++ Enables support for the CPLD chip (NAND & GPIO) on Mikrotik ++ Routerboard RB4xx series. ++ + config SGI_MFD_IOC3 + bool "SGI IOC3 core driver" + depends on PCI && MIPS && 64BIT +--- a/drivers/mfd/Makefile ++++ b/drivers/mfd/Makefile +@@ -267,6 +267,7 @@ obj-$(CONFIG_MFD_KHADAS_MCU) += khadas- + obj-$(CONFIG_MFD_ACER_A500_EC) += acer-ec-a500.o + obj-$(CONFIG_MFD_QCOM_PM8008) += qcom-pm8008.o + ++obj-$(CONFIG_MFD_RB4XX_CPLD) += rb4xx-cpld.o + obj-$(CONFIG_SGI_MFD_IOC3) += ioc3.o + obj-$(CONFIG_MFD_SIMPLE_MFD_I2C) += simple-mfd-i2c.o + obj-$(CONFIG_MFD_INTEL_M10_BMC) += intel-m10-bmc.o +--- a/drivers/gpio/Kconfig ++++ b/drivers/gpio/Kconfig +@@ -1574,6 +1574,12 @@ config GPIO_SODAVILLE + help + Say Y here to support Intel Sodaville GPIO. + ++config GPIO_RB4XX ++ tristate "GPIO expander for Mikrotik RB4xx series boards" ++ depends on MFD_RB4XX_CPLD ++ help ++ GPIO driver for Mikrotik Routerboard RB4xx series. ++ + endmenu + + menu "SPI GPIO expanders" +--- a/drivers/gpio/Makefile ++++ b/drivers/gpio/Makefile +@@ -122,6 +122,7 @@ obj-$(CONFIG_GPIO_PL061) += gpio-pl061. + obj-$(CONFIG_GPIO_PMIC_EIC_SPRD) += gpio-pmic-eic-sprd.o + obj-$(CONFIG_GPIO_PXA) += gpio-pxa.o + obj-$(CONFIG_GPIO_RASPBERRYPI_EXP) += gpio-raspberrypi-exp.o ++obj-$(CONFIG_GPIO_RB4XX) += gpio-rb4xx.o + obj-$(CONFIG_GPIO_RC5T583) += gpio-rc5t583.o + obj-$(CONFIG_GPIO_RCAR) += gpio-rcar.o + obj-$(CONFIG_GPIO_RDA) += gpio-rda.o +--- a/drivers/mtd/nand/raw/Kconfig ++++ b/drivers/mtd/nand/raw/Kconfig +@@ -563,4 +563,11 @@ config MTD_NAND_AR934X + Enables support for NAND controller on Qualcomm Atheros SoCs. + This controller is found on AR934x and QCA955x SoCs. + ++config MTD_NAND_RB4XX ++ tristate "Support for NAND driver for Mikrotik RB4xx series boards" ++ depends on MFD_RB4XX_CPLD ++ help ++ Enables support for the NAND flash chip on Mikrotik Routerboard ++ RB4xx series. ++ + endif # MTD_RAW_NAND +--- a/drivers/mtd/nand/raw/Makefile ++++ b/drivers/mtd/nand/raw/Makefile +@@ -59,6 +59,7 @@ obj-$(CONFIG_MTD_NAND_INTEL_LGM) += inte + obj-$(CONFIG_MTD_NAND_ROCKCHIP) += rockchip-nand-controller.o + obj-$(CONFIG_MTD_NAND_PL35X) += pl35x-nand-controller.o + obj-$(CONFIG_MTD_NAND_AR934X) += ar934x_nand.o ++obj-$(CONFIG_MTD_NAND_RB4XX) += nand_rb4xx.o + + nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o + nand-objs += nand_onfi.o diff --git a/target/linux/ath79/patches-5.10/930-ar8216-make-reg-access-atomic.patch b/target/linux/ath79/patches-5.15/930-ar8216-make-reg-access-atomic.patch similarity index 100% rename from target/linux/ath79/patches-5.10/930-ar8216-make-reg-access-atomic.patch rename to target/linux/ath79/patches-5.15/930-ar8216-make-reg-access-atomic.patch diff --git a/target/linux/ath79/patches-5.15/939-mikrotik-rb91x.patch b/target/linux/ath79/patches-5.15/939-mikrotik-rb91x.patch new file mode 100644 index 0000000000..94967bf674 --- /dev/null +++ b/target/linux/ath79/patches-5.15/939-mikrotik-rb91x.patch @@ -0,0 +1,97 @@ +From: Denis Kalashnikov +Subject: [PATCH] ath79: add support for reset key on MikroTik RB912UAG-2HPnD + +On MikroTik RB91x board series a reset key shares SoC gpio +line #15 with NAND ALE and NAND IO7. So we need a custom +gpio driver to manage this non-trivial connection schema. +Also rb91x-nand needs to have an ability to disable a polling +of the key while it works with NAND. + +While we've been integrating rb91x-key into a firmware, we've +figured out that: +* In the gpio-latch driver we need to add a "cansleep" suffix to +several gpiolib calls, +* When gpio-latch and rb91x-nand fail to get a gpio and an error +is -EPROBE_DEFER, they shouldn't report about this, since this +actually is not an error and occurs when the gpio-latch probe +function is called before the rb91x-key probe. +We fix these related things here too. + +Submitted-by: Denis Kalashnikov +Reviewed-by: Sergey Ryazanov +Tested-by: Koen Vandeputte +--- + drivers/gpio/Kconfig | 11 +++++++++++ + drivers/gpio/Makefile | 2 ++ + drivers/mtd/nand/raw/Kconfig | 6 ++++++ + drivers/mtd/nand/raw/Makefile | 1 + + 7 files changed, 20 insertions(+) + +--- a/drivers/gpio/Kconfig ++++ b/drivers/gpio/Kconfig +@@ -353,6 +353,13 @@ config GPIO_IXP4XX + IXP4xx series of chips. + + If unsure, say N. ++ ++config GPIO_LATCH ++ tristate "MikroTik RouterBOARD GPIO latch support" ++ depends on ATH79 ++ help ++ GPIO driver for latch on some MikroTik RouterBOARDs. ++ + config GPIO_LOGICVC + tristate "Xylon LogiCVC GPIO support" + depends on MFD_SYSCON && OF +@@ -529,6 +536,10 @@ config GPIO_ROCKCHIP + help + Say yes here to support GPIO on Rockchip SoCs. + ++config GPIO_RB91X_KEY ++ tristate "MikroTik RB91x board series reset key support" ++ depends on ATH79 ++ + config GPIO_SAMA5D2_PIOBU + tristate "SAMA5D2 PIOBU GPIO support" + depends on MFD_SYSCON +--- a/drivers/gpio/Makefile ++++ b/drivers/gpio/Makefile +@@ -75,6 +75,7 @@ obj-$(CONFIG_GPIO_IT87) += gpio-it87.o + obj-$(CONFIG_GPIO_IXP4XX) += gpio-ixp4xx.o + obj-$(CONFIG_GPIO_JANZ_TTL) += gpio-janz-ttl.o + obj-$(CONFIG_GPIO_KEMPLD) += gpio-kempld.o ++obj-$(CONFIG_GPIO_LATCH) += gpio-latch.o + obj-$(CONFIG_GPIO_LOGICVC) += gpio-logicvc.o + obj-$(CONFIG_GPIO_LOONGSON1) += gpio-loongson1.o + obj-$(CONFIG_GPIO_LOONGSON) += gpio-loongson.o +@@ -123,6 +124,7 @@ obj-$(CONFIG_GPIO_PMIC_EIC_SPRD) += gpio + obj-$(CONFIG_GPIO_PXA) += gpio-pxa.o + obj-$(CONFIG_GPIO_RASPBERRYPI_EXP) += gpio-raspberrypi-exp.o + obj-$(CONFIG_GPIO_RB4XX) += gpio-rb4xx.o ++obj-$(CONFIG_GPIO_RB91X_KEY) += gpio-rb91x-key.o + obj-$(CONFIG_GPIO_RC5T583) += gpio-rc5t583.o + obj-$(CONFIG_GPIO_RCAR) += gpio-rcar.o + obj-$(CONFIG_GPIO_RDA) += gpio-rda.o +--- a/drivers/mtd/nand/raw/Kconfig ++++ b/drivers/mtd/nand/raw/Kconfig +@@ -570,4 +570,10 @@ config MTD_NAND_RB4XX + Enables support for the NAND flash chip on Mikrotik Routerboard + RB4xx series. + ++config MTD_NAND_RB91X ++ tristate "MikroTik RB91x NAND driver support" ++ depends on ATH79 && MTD_RAW_NAND ++ help ++ Enables support for the NAND flash chip on MikroTik RB91x series. ++ + endif # MTD_RAW_NAND +--- a/drivers/mtd/nand/raw/Makefile ++++ b/drivers/mtd/nand/raw/Makefile +@@ -60,6 +60,7 @@ obj-$(CONFIG_MTD_NAND_ROCKCHIP) += rock + obj-$(CONFIG_MTD_NAND_PL35X) += pl35x-nand-controller.o + obj-$(CONFIG_MTD_NAND_AR934X) += ar934x_nand.o + obj-$(CONFIG_MTD_NAND_RB4XX) += nand_rb4xx.o ++obj-$(CONFIG_MTD_NAND_RB91X) += rb91x_nand.o + + nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o + nand-objs += nand_onfi.o diff --git a/target/linux/ath79/patches-5.10/940-ath79-add-support-for-booting-QCN550x.patch b/target/linux/ath79/patches-5.15/940-ath79-add-support-for-booting-QCN550x.patch similarity index 100% rename from target/linux/ath79/patches-5.10/940-ath79-add-support-for-booting-QCN550x.patch rename to target/linux/ath79/patches-5.15/940-ath79-add-support-for-booting-QCN550x.patch diff --git a/target/linux/ath79/tiny/base-files/etc/board.d/01_leds b/target/linux/ath79/tiny/base-files/etc/board.d/01_leds new file mode 100644 index 0000000000..07e48ec49f --- /dev/null +++ b/target/linux/ath79/tiny/base-files/etc/board.d/01_leds @@ -0,0 +1,130 @@ + +. /lib/functions/uci-defaults.sh + +board_config_update + +board=$(board_name) + +case "$board" in +buffalo,whr-g301n|\ +dlink,dir-615-e4|\ +tplink,tl-wr740n-v1|\ +tplink,tl-wr740n-v3|\ +tplink,tl-wr741-v1|\ +tplink,tl-wr743nd-v1|\ +tplink,tl-wr841-v5|\ +tplink,tl-wr941-v4) + ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth0" + ucidef_set_led_switch "lan1" "LAN1" "green:lan1" "switch0" "0x02" + ucidef_set_led_switch "lan2" "LAN2" "green:lan2" "switch0" "0x04" + ucidef_set_led_switch "lan3" "LAN3" "green:lan3" "switch0" "0x08" + ucidef_set_led_switch "lan4" "LAN4" "green:lan4" "switch0" "0x10" + ;; +engenius,enh202-v1) + ucidef_set_led_switch "lan" "LAN" "amber:lan" "switch0" "0x10" + ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth0" + ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "red:rssilow" "wlan0" "1" "100" + ucidef_set_led_rssi "rssimedium" "RSSIMEDIUM" "amber:rssimedium" "wlan0" "33" "100" + ucidef_set_led_rssi "rssihigh" "RSSIHIGH" "green:rssihigh" "wlan0" "67" "100" + ;; +netgear,wnr1000-v2|\ +netgear,wnr2000-v3) + ucidef_set_led_netdev "wan-amber" "WAN (amber)" "amber:wan" "eth0" + ucidef_set_led_switch "lan1green" "LAN1 (green)" "green:lan1" "switch0" "0x02" "0x04" + ucidef_set_led_switch "lan2green" "LAN2 (green)" "green:lan2" "switch0" "0x04" "0x04" + ucidef_set_led_switch "lan3green" "LAN3 (green)" "green:lan3" "switch0" "0x08" "0x04" + ucidef_set_led_switch "lan4green" "LAN4 (green)" "green:lan4" "switch0" "0x10" "0x04" + ucidef_set_led_switch "lan1amber" "LAN1 (amber)" "amber:lan1" "switch0" "0x02" "0x02" + ucidef_set_led_switch "lan2amber" "LAN2 (amber)" "amber:lan2" "switch0" "0x04" "0x02" + ucidef_set_led_switch "lan3amber" "LAN3 (amber)" "amber:lan3" "switch0" "0x08" "0x02" + ucidef_set_led_switch "lan4amber" "LAN4 (amber)" "amber:lan4" "switch0" "0x10" "0x02" + ;; +netgear,wnr612-v2|\ +on,n150r) + ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth0" + ucidef_set_led_switch "lan1" "LAN1" "green:lan1" "switch0" "0x02" "0x0f" + ucidef_set_led_switch "lan2" "LAN2" "green:lan2" "switch0" "0x04" "0x0f" + ;; +tplink,tl-mr3020-v1|\ +tplink,tl-mr3040-v2|\ +tplink,tl-wa701nd-v1|\ +tplink,tl-wa730re-v1|\ +tplink,tl-wa801nd-v1|\ +tplink,tl-wa801nd-v3|\ +tplink,tl-wa801nd-v4|\ +tplink,tl-wa830re-v1|\ +tplink,tl-wa860re-v1|\ +tplink,tl-wa901nd-v1|\ +tplink,tl-wa901nd-v3|\ +tplink,tl-wa901nd-v4|\ +tplink,tl-wa901nd-v5) + ucidef_set_led_netdev "lan" "LAN" "green:lan" "eth0" + ;; +tplink,tl-mr3420-v2|\ +tplink,tl-wr740n-v4|\ +tplink,tl-wr740n-v5|\ +tplink,tl-wr741nd-v4|\ +tplink,tl-wr841-v8|\ +tplink,tl-wr941nd-v5) + ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth1" + ucidef_set_led_switch "lan1" "LAN1" "green:lan1" "switch0" "0x04" + ucidef_set_led_switch "lan2" "LAN2" "green:lan2" "switch0" "0x08" + ucidef_set_led_switch "lan3" "LAN3" "green:lan3" "switch0" "0x10" + ucidef_set_led_switch "lan4" "LAN4" "green:lan4" "switch0" "0x02" + ;; +tplink,tl-mr3420-v3|\ +tplink,tl-wr841-v9|\ +tplink,tl-wr841-v10|\ +tplink,tl-wr841-v11|\ +tplink,tl-wr841-v12) + ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth1" + ucidef_set_led_switch "lan1" "LAN1" "green:lan1" "switch0" "0x10" + ucidef_set_led_switch "lan2" "LAN2" "green:lan2" "switch0" "0x08" + ucidef_set_led_switch "lan3" "LAN3" "green:lan3" "switch0" "0x04" + ucidef_set_led_switch "lan4" "LAN4" "green:lan4" "switch0" "0x02" + ;; +tplink,tl-wa850re-v1|\ +tplink,tl-wa850re-v2) + ucidef_set_led_netdev "lan" "LAN" "blue:lan" "eth0" + ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "blue:signal1" "wlan0" "1" "100" + ucidef_set_led_rssi "rssimediumlow" "RSSIMEDIUMLOW" "blue:signal2" "wlan0" "20" "100" + ucidef_set_led_rssi "rssimedium" "RSSIMEDIUM" "blue:signal3" "wlan0" "40" "100" + ucidef_set_led_rssi "rssimediumhigh" "RSSIMEDIUMHIGH" "blue:signal4" "wlan0" "60" "100" + ucidef_set_led_rssi "rssihigh" "RSSIHIGH" "blue:signal5" "wlan0" "80" "100" + ;; +tplink,tl-wpa8630p-v2-int|\ +tplink,tl-wpa8630p-v2.0-eu|\ +tplink,tl-wpa8630p-v2.1-eu) + ucidef_set_led_switch "lan" "LAN" "green:lan" "switch0" "0x3c" + ;; +tplink,tl-wr940n-v3|\ +tplink,tl-wr940n-v4|\ +tplink,tl-wr941nd-v6) + ucidef_set_led_netdev "wan" "WAN" "blue:wan" "eth1" + ucidef_set_led_switch "lan1" "LAN1" "blue:lan1" "switch0" "0x10" + ucidef_set_led_switch "lan2" "LAN2" "blue:lan2" "switch0" "0x08" + ucidef_set_led_switch "lan3" "LAN3" "blue:lan3" "switch0" "0x04" + ucidef_set_led_switch "lan4" "LAN4" "blue:lan4" "switch0" "0x02" + ;; +tplink,tl-wr940n-v6) + ucidef_set_led_netdev "wan" "WAN" "blue:wan" "eth1" + ;; +ubnt,bullet-m-ar7240|\ +ubnt,bullet-m-ar7241|\ +ubnt,nanobridge-m|\ +ubnt,nanostation-loco-m|\ +ubnt,nanostation-m|\ +ubnt,picostation-m) + ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "red:link1" "wlan0" "1" "100" + ucidef_set_led_rssi "rssimediumlow" "RSSIMEDIUMLOW" "orange:link2" "wlan0" "26" "100" + ucidef_set_led_rssi "rssimediumhigh" "RSSIMEDIUMHIGH" "green:link3" "wlan0" "51" "100" + ucidef_set_led_rssi "rssihigh" "RSSIHIGH" "green:link4" "wlan0" "76" "100" + ;; +esac + +board_config_flush + +exit 0 diff --git a/target/linux/ath79/tiny/base-files/etc/board.d/02_network b/target/linux/ath79/tiny/base-files/etc/board.d/02_network new file mode 100644 index 0000000000..836d119867 --- /dev/null +++ b/target/linux/ath79/tiny/base-files/etc/board.d/02_network @@ -0,0 +1,157 @@ + +. /lib/functions/system.sh +. /lib/functions/uci-defaults.sh + +ath79_setup_interfaces() +{ + local board="$1" + + case "$board" in + buffalo,whr-g301n) + ucidef_set_interface_wan "eth0" + ucidef_add_switch "switch0" \ + "0@eth1" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" + ;; + dlink,dir-615-e4|\ + netgear,wnr1000-v2|\ + netgear,wnr2000-v3|\ + netgear,wnr612-v2|\ + on,n150r|\ + tplink,tl-wr740n-v1|\ + tplink,tl-wr740n-v3|\ + tplink,tl-wr741-v1|\ + tplink,tl-wr743nd-v1|\ + tplink,tl-wr841-v5|\ + tplink,tl-wr941-v4) + ucidef_set_interface_wan "eth0" + ucidef_add_switch "switch0" \ + "0@eth1" "1:lan" "2:lan" "3:lan" "4:lan" + ;; + engenius,eap350-v1|\ + engenius,ecb350-v1|\ + pqi,air-pen|\ + tplink,tl-mr10u|\ + tplink,tl-mr3020-v1|\ + tplink,tl-mr3040-v2|\ + tplink,tl-wa701nd-v1|\ + tplink,tl-wa730re-v1|\ + tplink,tl-wa801nd-v1|\ + tplink,tl-wa801nd-v3|\ + tplink,tl-wa801nd-v4|\ + tplink,tl-wa830re-v1|\ + tplink,tl-wa850re-v1|\ + tplink,tl-wa850re-v2|\ + tplink,tl-wa860re-v1|\ + tplink,tl-wa901nd-v1|\ + tplink,tl-wa901nd-v2|\ + tplink,tl-wa901nd-v3|\ + tplink,tl-wa901nd-v4|\ + tplink,tl-wa901nd-v5|\ + tplink,tl-wr703n|\ + tplink,tl-wr802n-v1|\ + tplink,tl-wr802n-v2|\ + ubnt,bullet-m-ar7240|\ + ubnt,bullet-m-ar7241|\ + ubnt,nanobridge-m|\ + ubnt,picostation-m|\ + ubnt,nanostation-loco-m) + ucidef_set_interface_lan "eth0" + ;; + engenius,enh202-v1) + ucidef_set_interface_lan "eth0" + ucidef_add_switch "switch0" \ + "0@eth1" "4:lan:1" + ;; + tplink,tl-mr3220-v1|\ + tplink,tl-mr3420-v1|\ + tplink,tl-mr3420-v3|\ + tplink,tl-wr841-v7|\ + tplink,tl-wr841-v9|\ + tplink,tl-wr841-v10|\ + tplink,tl-wr841-v11|\ + tplink,tl-wr841-v12|\ + tplink,tl-wr940n-v3|\ + tplink,tl-wr940n-v4|\ + tplink,tl-wr940n-v6|\ + tplink,tl-wr941nd-v6) + ucidef_set_interface_wan "eth1" + ucidef_add_switch "switch0" \ + "0@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" + ;; + tplink,tl-mr3420-v2|\ + tplink,tl-wr740n-v4|\ + tplink,tl-wr740n-v5|\ + tplink,tl-wr741nd-v4|\ + tplink,tl-wr841-v8|\ + tplink,tl-wr941nd-v5) + ucidef_set_interface_wan "eth1" + ucidef_add_switch "switch0" \ + "0@eth0" "1:lan:4" "2:lan:1" "3:lan:2" "4:lan:3" + ;; + tplink,tl-wpa8630p-v2-int|\ + tplink,tl-wpa8630p-v2.0-eu|\ + tplink,tl-wpa8630p-v2.1-eu) + # port 5 (internal) is the power-line port + ucidef_add_switch "switch0" \ + "0@eth0" "2:lan:3" "3:lan:2" "4:lan:1" "5:lan:4" + ;; + tplink,tl-wr941-v2) + ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" "wan" + ;; + tplink,tl-wr941n-v7-cn) + ucidef_add_switch "switch0" \ + "0@eth0" "2:lan:1" "3:lan:2" "4:lan:3" "5:lan:4" "1:wan" + ;; + ubnt,airrouter) + ucidef_set_interface_wan "eth1" + ucidef_add_switch "switch0" \ + "0@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" + ;; + ubnt,nanostation-m) + ucidef_set_interfaces_lan_wan "eth1" "eth0" + ;; + *) + ucidef_set_interfaces_lan_wan "eth0" "eth1" + ;; + esac +} + +ath79_setup_macs() +{ + local board="$1" + + case "$board" in + dlink,dir-615-e4) + lan_mac=$(mtd_get_mac_ascii "nvram" "lan_mac") + wan_mac=$(mtd_get_mac_ascii "nvram" "wan_mac") + label_mac=$wan_mac + ;; + engenius,enh202-v1|\ + ubnt,airrouter|\ + ubnt,bullet-m-ar7240|\ + ubnt,bullet-m-ar7241|\ + ubnt,nanobridge-m|\ + ubnt,nanostation-loco-m|\ + ubnt,nanostation-m|\ + ubnt,picostation-m) + label_mac=$(cat /sys/class/ieee80211/phy0/macaddress) + ;; + tplink,tl-wr941-v2|\ + tplink,tl-wr941n-v7-cn) + base_mac=$(mtd_get_mac_binary u-boot 0x1fc00) + wan_mac=$(macaddr_add "$base_mac" 1) + ;; + esac + + [ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" $lan_mac + [ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" $wan_mac + [ -n "$label_mac" ] && ucidef_set_label_macaddr $label_mac +} + +board_config_update +board=$(board_name) +ath79_setup_interfaces $board +ath79_setup_macs $board +board_config_flush + +exit 0 diff --git a/target/linux/ath79/tiny/base-files/etc/board.d/05_compat-version b/target/linux/ath79/tiny/base-files/etc/board.d/05_compat-version new file mode 100644 index 0000000000..b6c2ae48f7 --- /dev/null +++ b/target/linux/ath79/tiny/base-files/etc/board.d/05_compat-version @@ -0,0 +1,20 @@ +# +# Copyright (C) 2020 OpenWrt.org +# + +. /lib/functions.sh +. /lib/functions/uci-defaults.sh + +board_config_update + +case "$(board_name)" in + tplink,tl-wpa8630p-v2-int|\ + tplink,tl-wpa8630p-v2.0-eu|\ + tplink,tl-wpa8630p-v2.1-eu) + ucidef_set_compat_version "2.0" + ;; +esac + +board_config_flush + +exit 0 diff --git a/target/linux/ath79/tiny/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/ath79/tiny/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom new file mode 100644 index 0000000000..d424b9fe2c --- /dev/null +++ b/target/linux/ath79/tiny/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom @@ -0,0 +1,57 @@ +#!/bin/sh + +[ -e /lib/firmware/$FIRMWARE ] && exit 0 + +. /lib/functions/caldata.sh + +board=$(board_name) + +case "$FIRMWARE" in +"ath9k-eeprom-pci-0000:00:00.0.bin") + case $board in + buffalo,whr-g301n|\ + engenius,eap350-v1|\ + engenius,ecb350-v1|\ + engenius,enh202-v1|\ + tplink,tl-wa701nd-v1|\ + tplink,tl-wa730re-v1|\ + tplink,tl-wa801nd-v1|\ + tplink,tl-wa830re-v1|\ + tplink,tl-wa901nd-v1|\ + tplink,tl-wr841-v5|\ + tplink,tl-wr941-v4) + caldata_extract "art" 0x1000 0xeb8 + ;; + dlink,dir-615-e4) + caldata_extract "art" 0x1000 0x1000 + ath9k_patch_mac_crc $(mtd_get_mac_ascii "nvram" "lan_mac") 0x10c + ;; + netgear,wnr1000-v2|\ + netgear,wnr2000-v3|\ + netgear,wnr612-v2|\ + on,n150r|\ + tplink,tl-mr3220-v1|\ + tplink,tl-mr3420-v1|\ + tplink,tl-wr740n-v1|\ + tplink,tl-wr740n-v3|\ + tplink,tl-wr741-v1|\ + tplink,tl-wr743nd-v1|\ + tplink,tl-wr841-v7|\ + ubnt,airrouter|\ + ubnt,bullet-m-ar7240|\ + ubnt,bullet-m-ar7241|\ + ubnt,nanobridge-m|\ + ubnt,nanostation-loco-m|\ + ubnt,nanostation-m|\ + ubnt,picostation-m) + caldata_extract "art" 0x1000 0x1000 + ;; + pqi,air-pen) + caldata_extract "art" 0x1000 0x7d2 + ;; + *) + caldata_die "board $board is not supported yet" + ;; + esac + ;; +esac diff --git a/target/linux/ath79/tiny/base-files/etc/uci-defaults/04_led_migration b/target/linux/ath79/tiny/base-files/etc/uci-defaults/04_led_migration new file mode 100644 index 0000000000..9850ed2293 --- /dev/null +++ b/target/linux/ath79/tiny/base-files/etc/uci-defaults/04_led_migration @@ -0,0 +1,16 @@ +. /lib/functions.sh +. /lib/functions/migrations.sh + +board=$(board_name) + +case "$board" in +tplink,tl-wr802n-v1) + migrate_leds "blue:=green:" + ;; +esac + +remove_devicename_leds + +migrations_apply system + +exit 0 diff --git a/target/linux/ath79/tiny/base-files/lib/upgrade/failsafe_datachk.sh b/target/linux/ath79/tiny/base-files/lib/upgrade/failsafe_datachk.sh new file mode 100644 index 0000000000..23847a1aae --- /dev/null +++ b/target/linux/ath79/tiny/base-files/lib/upgrade/failsafe_datachk.sh @@ -0,0 +1,64 @@ +# U-Boot with the datachk patchset requires image sizes, offsets, +# and checksums to be provided in the U-Boot environment. +# This script is based on the dualboot version for devices that come with 2 OS partitions. +# For Senao boards with a "failsafe" partition image, the process is almost the same. +# Instead of booting a secondary instalation on checksum failure, +# the failsafe image is booted instead. +# These boards also use the OKLI lzma kernel loader and mtd-concat +# So the kernel check is for the loader, the rootfs check is for kernel + rootfs + +platform_do_upgrade_failsafe_datachk() { + local flash_base=0x9f000000 + + local kernel_mtd=$(find_mtd_index ${KERNEL_PART:-kernel}) + local rootfs_mtd=$(find_mtd_index ${ROOTFS_PART:-rootfs}) + + local kernel_offset=$(cat /sys/class/mtd/mtd${kernel_mtd}/offset) + local rootfs_offset=$(cat /sys/class/mtd/mtd${rootfs_mtd}/offset) + + if [ -n "$IMAGE_LIST" ]; then + KERNEL_FILE=$($IMAGE_LIST | grep $KERNEL_FILE) + ROOTFS_FILE=$($IMAGE_LIST | grep $ROOTFS_FILE) + fi + + local kernel_size=$($IMAGE_CMD $KERNEL_FILE | wc -c) + local rootfs_size=$($IMAGE_CMD $ROOTFS_FILE | wc -c) + + # rootfs without JFFS2 + local rootfs_blocks=$((rootfs_size / 4096)) + rootfs_size=$((rootfs_blocks * 4096)) + + local kernel_md5=$($IMAGE_CMD $KERNEL_FILE | md5sum | cut -d ' ' -f1) + local rootfs_md5=$($IMAGE_CMD $ROOTFS_FILE | dd bs=4k count=$rootfs_blocks iflag=fullblock | md5sum | cut -d ' ' -f1) + + # prepare new u-boot-env vars + printf "vmlinux_start_addr 0x%08x\n" $((flash_base + kernel_offset)) >> $ENV_SCRIPT + printf "vmlinux_size 0x%08x\n" ${kernel_size} >> $ENV_SCRIPT + printf "vmlinux_checksum %s\n" ${kernel_md5} >> $ENV_SCRIPT + + printf "rootfs_start_addr 0x%08x\n" $((flash_base + rootfs_offset)) >> $ENV_SCRIPT + printf "rootfs_size 0x%08x\n" ${rootfs_size} >> $ENV_SCRIPT + printf "rootfs_checksum %s\n" ${rootfs_md5} >> $ENV_SCRIPT + + # store u-boot-env + mkdir -p /var/lock + [ -n "$SKIP_HASH" ] || fw_setenv -s $ENV_SCRIPT || { + echo 'failed to update U-Boot environment' + exit 1 + } + + # sysupgrade + sleep 2 && sync && echo 3 > /proc/sys/vm/drop_caches + + $IMAGE_CMD $KERNEL_FILE | mtd $MTD_ARGS write - ${KERNEL_PART:-kernel} + + sleep 2 && sync && echo 3 > /proc/sys/vm/drop_caches + + if [ -n "$UPGRADE_BACKUP" ]; then + $IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS $MTD_CONFIG_ARGS -j $UPGRADE_BACKUP write - ${ROOTFS_PART:-rootfs} + else + $IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS write - ${ROOTFS_PART:-rootfs} + fi + + sync +} diff --git a/target/linux/ath79/tiny/base-files/lib/upgrade/platform.sh b/target/linux/ath79/tiny/base-files/lib/upgrade/platform.sh new file mode 100644 index 0000000000..eb8441c6d2 --- /dev/null +++ b/target/linux/ath79/tiny/base-files/lib/upgrade/platform.sh @@ -0,0 +1,35 @@ +# +# Copyright (C) 2011 OpenWrt.org +# + +PART_NAME=firmware +REQUIRE_IMAGE_METADATA=1 + +RAMFS_COPY_BIN='fw_setenv' +RAMFS_COPY_DATA='/etc/fw_env.config' + +platform_check_image() { + return 0 +} + +platform_do_upgrade() { + local board=$(board_name) + + case "$board" in + engenius,eap350-v1|\ + engenius,ecb350-v1|\ + engenius,enh202-v1) + ENV_SCRIPT="/tmp/fw_env" + IMAGE_LIST="tar tzf $1" + IMAGE_CMD="tar xzOf $1" + KERNEL_PART="loader" + ROOTFS_PART="fwconcat0" + KERNEL_FILE="uImage-lzma.bin" + ROOTFS_FILE="root.squashfs" + platform_do_upgrade_failsafe_datachk "$1" + ;; + *) + default_do_upgrade "$1" + ;; + esac +} diff --git a/target/linux/ath79/tiny/config-default b/target/linux/ath79/tiny/config-default new file mode 100644 index 0000000000..fbf08eb066 --- /dev/null +++ b/target/linux/ath79/tiny/config-default @@ -0,0 +1,12 @@ +CONFIG_LEDS_RESET=y +CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y +CONFIG_NET_DEVLINK=y +CONFIG_NET_DSA=y +CONFIG_NET_DSA_MV88E6060=y +# CONFIG_NET_DSA_TAG_QCA is not set +CONFIG_NET_DSA_TAG_TRAILER=y +CONFIG_NET_SWITCHDEV=y +CONFIG_PHYLINK=y +CONFIG_PHY_AR7100_USB=y +CONFIG_PHY_AR7200_USB=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y diff --git a/target/linux/ath79/tiny/target.mk b/target/linux/ath79/tiny/target.mk new file mode 100644 index 0000000000..fef82fdd7f --- /dev/null +++ b/target/linux/ath79/tiny/target.mk @@ -0,0 +1,8 @@ +BOARDNAME:=Devices with small flash +FEATURES += low_mem small_flash + +DEFAULT_PACKAGES += wpad-basic-mbedtls + +define Target/Description + Build firmware images for Atheros AR71xx/AR913x/AR934x based boards with small flash +endef diff --git a/target/linux/generic/backport-5.10/010-Kbuild-don-t-hardcode-path-to-awk-in-scripts-ld-vers.patch b/target/linux/generic/backport-5.10/010-Kbuild-don-t-hardcode-path-to-awk-in-scripts-ld-vers.patch deleted file mode 100644 index 7ac4f9d240..0000000000 --- a/target/linux/generic/backport-5.10/010-Kbuild-don-t-hardcode-path-to-awk-in-scripts-ld-vers.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 13b1ecc3401653a355798eb1dee10cc1608202f4 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Mon, 18 Jan 2016 12:27:49 +0100 -Subject: [PATCH 33/34] Kbuild: don't hardcode path to awk in - scripts/ld-version.sh - -On some systems /usr/bin/awk does not exist, or is broken. Find it via -$PATH instead. - -Signed-off-by: Felix Fietkau ---- - scripts/ld-version.sh | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - ---- a/scripts/ld-version.sh -+++ b/scripts/ld-version.sh -@@ -1,6 +1,7 @@ --#!/usr/bin/awk -f -+#!/bin/sh - # SPDX-License-Identifier: GPL-2.0 - # extract linker version number from stdin and turn into single number -+exec awk ' - { - gsub(".*\\)", ""); - gsub(".*version ", ""); -@@ -9,3 +10,4 @@ - print a[1]*100000000 + a[2]*1000000 + a[3]*10000; - exit - } -+' diff --git a/target/linux/generic/backport-5.10/011-kbuild-export-SUBARCH.patch b/target/linux/generic/backport-5.10/011-kbuild-export-SUBARCH.patch deleted file mode 100644 index efdba3bece..0000000000 --- a/target/linux/generic/backport-5.10/011-kbuild-export-SUBARCH.patch +++ /dev/null @@ -1,21 +0,0 @@ -From 173019b66dcc9d68ad9333aa744dad1e369b5aa8 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sun, 9 Jul 2017 00:26:53 +0200 -Subject: [PATCH 34/34] kernel: add compile fix for linux 4.9 on x86 - -Signed-off-by: Felix Fietkau ---- - Makefile | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/Makefile -+++ b/Makefile -@@ -516,7 +516,7 @@ KBUILD_LDFLAGS_MODULE := - KBUILD_LDFLAGS := - CLANG_FLAGS := - --export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC -+export ARCH SRCARCH SUBARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC - export CPP AR NM STRIP OBJCOPY OBJDUMP READELF PAHOLE RESOLVE_BTFIDS LEX YACC AWK INSTALLKERNEL - export PERL PYTHON PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX - export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD diff --git a/target/linux/generic/backport-5.10/026-power-reset-linkstation-poweroff-add-missing-put_dev.patch b/target/linux/generic/backport-5.10/026-power-reset-linkstation-poweroff-add-missing-put_dev.patch deleted file mode 100644 index 66e75bf514..0000000000 --- a/target/linux/generic/backport-5.10/026-power-reset-linkstation-poweroff-add-missing-put_dev.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 1027a42c25cbf8cfc4ade6503c5110aae04866af Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Daniel=20Gonz=C3=A1lez=20Cabanelas?= -Date: Fri, 16 Oct 2020 20:22:37 +0200 -Subject: [PATCH] power: reset: linkstation-poweroff: add missing put_device() -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The of_mdio_find_bus() takes a reference to the underlying device -structure, we should release that reference using a put_device() call. - -Signed-off-by: Daniel González Cabanelas -Signed-off-by: Sebastian Reichel ---- - drivers/power/reset/linkstation-poweroff.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/power/reset/linkstation-poweroff.c -+++ b/drivers/power/reset/linkstation-poweroff.c -@@ -113,6 +113,7 @@ static int __init linkstation_poweroff_i - return -EPROBE_DEFER; - - phydev = phy_find_first(bus); -+ put_device(&bus->dev); - if (!phydev) - return -EPROBE_DEFER; - diff --git a/target/linux/generic/backport-5.10/050-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch b/target/linux/generic/backport-5.10/050-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch deleted file mode 100644 index 10685c5f3c..0000000000 --- a/target/linux/generic/backport-5.10/050-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch +++ /dev/null @@ -1,61 +0,0 @@ -From: Johan Almbladh -Date: Tue, 5 Oct 2021 18:54:07 +0200 -Subject: [PATCH] mips: bpf: Enable eBPF JITs - -This patch enables the new eBPF JITs for 32-bit and 64-bit MIPS. It also -disables the old cBPF JIT to so cBPF programs are converted to use the -new JIT. - -Workarounds for R4000 CPU errata are not implemented by the JIT, so the -JIT is disabled if any of those workarounds are configured. - -Signed-off-by: Johan Almbladh ---- - ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -3294,6 +3294,7 @@ S: Supported - F: arch/arm64/net/ - - BPF JIT for MIPS (32-BIT AND 64-BIT) -+M: Johan Almbladh - M: Paul Burton - L: netdev@vger.kernel.org - L: bpf@vger.kernel.org ---- a/arch/mips/Kconfig -+++ b/arch/mips/Kconfig -@@ -49,7 +49,6 @@ config MIPS - select HAVE_ARCH_TRACEHOOK - select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES - select HAVE_ASM_MODVERSIONS -- select HAVE_CBPF_JIT if !64BIT && !CPU_MICROMIPS - select HAVE_CONTEXT_TRACKING - select HAVE_TIF_NOHZ - select HAVE_C_RECORDMCOUNT -@@ -57,7 +56,10 @@ config MIPS - select HAVE_DEBUG_STACKOVERFLOW - select HAVE_DMA_CONTIGUOUS - select HAVE_DYNAMIC_FTRACE -- select HAVE_EBPF_JIT if 64BIT && !CPU_MICROMIPS && TARGET_ISA_REV >= 2 -+ select HAVE_EBPF_JIT if !CPU_MICROMIPS && \ -+ !CPU_DADDI_WORKAROUNDS && \ -+ !CPU_R4000_WORKAROUNDS && \ -+ !CPU_R4400_WORKAROUNDS - select HAVE_EXIT_THREAD - select HAVE_FAST_GUP - select HAVE_FTRACE_MCOUNT_RECORD ---- a/arch/mips/net/Makefile -+++ b/arch/mips/net/Makefile -@@ -2,9 +2,10 @@ - # MIPS networking code - - obj-$(CONFIG_MIPS_CBPF_JIT) += bpf_jit.o bpf_jit_asm.o -+obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp.o - - ifeq ($(CONFIG_32BIT),y) -- obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp.o bpf_jit_comp32.o -+ obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp32.o - else -- obj-$(CONFIG_MIPS_EBPF_JIT) += ebpf_jit.o -+ obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp64.o - endif diff --git a/target/linux/generic/backport-5.10/071-crypto-arm-chacha-neon-optimize-for-non-block-size-m.patch b/target/linux/generic/backport-5.10/071-crypto-arm-chacha-neon-optimize-for-non-block-size-m.patch deleted file mode 100644 index b1f46e9af8..0000000000 --- a/target/linux/generic/backport-5.10/071-crypto-arm-chacha-neon-optimize-for-non-block-size-m.patch +++ /dev/null @@ -1,272 +0,0 @@ -From 03662fcd41f4b764857f17b95f9a2a63c24bddd4 Mon Sep 17 00:00:00 2001 -From: Ard Biesheuvel -Date: Tue, 3 Nov 2020 17:28:09 +0100 -Subject: [PATCH 1/2] crypto: arm/chacha-neon - optimize for non-block size - multiples - -commit 86cd97ec4b943af35562a74688bc4e909b32c3d1 upstream. - -The current NEON based ChaCha implementation for ARM is optimized for -multiples of 4x the ChaCha block size (64 bytes). This makes sense for -block encryption, but given that ChaCha is also often used in the -context of networking, it makes sense to consider arbitrary length -inputs as well. - -For example, WireGuard typically uses 1420 byte packets, and performing -ChaCha encryption involves 5 invocations of chacha_4block_xor_neon() -and 3 invocations of chacha_block_xor_neon(), where the last one also -involves a memcpy() using a buffer on the stack to process the final -chunk of 1420 % 64 == 12 bytes. - -Let's optimize for this case as well, by letting chacha_4block_xor_neon() -deal with any input size between 64 and 256 bytes, using NEON permutation -instructions and overlapping loads and stores. This way, the 140 byte -tail of a 1420 byte input buffer can simply be processed in one go. - -This results in the following performance improvements for 1420 byte -blocks, without significant impact on power-of-2 input sizes. (Note -that Raspberry Pi is widely used in combination with a 32-bit kernel, -even though the core is 64-bit capable) - - Cortex-A8 (BeagleBone) : 7% - Cortex-A15 (Calxeda Midway) : 21% - Cortex-A53 (Raspberry Pi 3) : 3% - Cortex-A72 (Raspberry Pi 4) : 19% - -Cc: Eric Biggers -Cc: "Jason A . Donenfeld" -Signed-off-by: Ard Biesheuvel -Signed-off-by: Herbert Xu -Signed-off-by: Jason A. Donenfeld ---- - arch/arm/crypto/chacha-glue.c | 34 +++++------ - arch/arm/crypto/chacha-neon-core.S | 97 +++++++++++++++++++++++++++--- - 2 files changed, 107 insertions(+), 24 deletions(-) - ---- a/arch/arm/crypto/chacha-glue.c -+++ b/arch/arm/crypto/chacha-glue.c -@@ -23,7 +23,7 @@ - asmlinkage void chacha_block_xor_neon(const u32 *state, u8 *dst, const u8 *src, - int nrounds); - asmlinkage void chacha_4block_xor_neon(const u32 *state, u8 *dst, const u8 *src, -- int nrounds); -+ int nrounds, unsigned int nbytes); - asmlinkage void hchacha_block_arm(const u32 *state, u32 *out, int nrounds); - asmlinkage void hchacha_block_neon(const u32 *state, u32 *out, int nrounds); - -@@ -42,24 +42,24 @@ static void chacha_doneon(u32 *state, u8 - { - u8 buf[CHACHA_BLOCK_SIZE]; - -- while (bytes >= CHACHA_BLOCK_SIZE * 4) { -- chacha_4block_xor_neon(state, dst, src, nrounds); -- bytes -= CHACHA_BLOCK_SIZE * 4; -- src += CHACHA_BLOCK_SIZE * 4; -- dst += CHACHA_BLOCK_SIZE * 4; -- state[12] += 4; -- } -- while (bytes >= CHACHA_BLOCK_SIZE) { -- chacha_block_xor_neon(state, dst, src, nrounds); -- bytes -= CHACHA_BLOCK_SIZE; -- src += CHACHA_BLOCK_SIZE; -- dst += CHACHA_BLOCK_SIZE; -- state[12]++; -+ while (bytes > CHACHA_BLOCK_SIZE) { -+ unsigned int l = min(bytes, CHACHA_BLOCK_SIZE * 4U); -+ -+ chacha_4block_xor_neon(state, dst, src, nrounds, l); -+ bytes -= l; -+ src += l; -+ dst += l; -+ state[12] += DIV_ROUND_UP(l, CHACHA_BLOCK_SIZE); - } - if (bytes) { -- memcpy(buf, src, bytes); -- chacha_block_xor_neon(state, buf, buf, nrounds); -- memcpy(dst, buf, bytes); -+ const u8 *s = src; -+ u8 *d = dst; -+ -+ if (bytes != CHACHA_BLOCK_SIZE) -+ s = d = memcpy(buf, src, bytes); -+ chacha_block_xor_neon(state, d, s, nrounds); -+ if (d != dst) -+ memcpy(dst, buf, bytes); - } - } - ---- a/arch/arm/crypto/chacha-neon-core.S -+++ b/arch/arm/crypto/chacha-neon-core.S -@@ -47,6 +47,7 @@ - */ - - #include -+#include - - .text - .fpu neon -@@ -205,7 +206,7 @@ ENDPROC(hchacha_block_neon) - - .align 5 - ENTRY(chacha_4block_xor_neon) -- push {r4-r5} -+ push {r4, lr} - mov r4, sp // preserve the stack pointer - sub ip, sp, #0x20 // allocate a 32 byte buffer - bic ip, ip, #0x1f // aligned to 32 bytes -@@ -229,10 +230,10 @@ ENTRY(chacha_4block_xor_neon) - vld1.32 {q0-q1}, [r0] - vld1.32 {q2-q3}, [ip] - -- adr r5, .Lctrinc -+ adr lr, .Lctrinc - vdup.32 q15, d7[1] - vdup.32 q14, d7[0] -- vld1.32 {q4}, [r5, :128] -+ vld1.32 {q4}, [lr, :128] - vdup.32 q13, d6[1] - vdup.32 q12, d6[0] - vdup.32 q11, d5[1] -@@ -455,7 +456,7 @@ ENTRY(chacha_4block_xor_neon) - - // Re-interleave the words in the first two rows of each block (x0..7). - // Also add the counter values 0-3 to x12[0-3]. -- vld1.32 {q8}, [r5, :128] // load counter values 0-3 -+ vld1.32 {q8}, [lr, :128] // load counter values 0-3 - vzip.32 q0, q1 // => (0 1 0 1) (0 1 0 1) - vzip.32 q2, q3 // => (2 3 2 3) (2 3 2 3) - vzip.32 q4, q5 // => (4 5 4 5) (4 5 4 5) -@@ -493,6 +494,8 @@ ENTRY(chacha_4block_xor_neon) - - // Re-interleave the words in the last two rows of each block (x8..15). - vld1.32 {q8-q9}, [sp, :256] -+ mov sp, r4 // restore original stack pointer -+ ldr r4, [r4, #8] // load number of bytes - vzip.32 q12, q13 // => (12 13 12 13) (12 13 12 13) - vzip.32 q14, q15 // => (14 15 14 15) (14 15 14 15) - vzip.32 q8, q9 // => (8 9 8 9) (8 9 8 9) -@@ -520,41 +523,121 @@ ENTRY(chacha_4block_xor_neon) - // XOR the rest of the data with the keystream - - vld1.8 {q0-q1}, [r2]! -+ subs r4, r4, #96 - veor q0, q0, q8 - veor q1, q1, q12 -+ ble .Lle96 - vst1.8 {q0-q1}, [r1]! - - vld1.8 {q0-q1}, [r2]! -+ subs r4, r4, #32 - veor q0, q0, q2 - veor q1, q1, q6 -+ ble .Lle128 - vst1.8 {q0-q1}, [r1]! - - vld1.8 {q0-q1}, [r2]! -+ subs r4, r4, #32 - veor q0, q0, q10 - veor q1, q1, q14 -+ ble .Lle160 - vst1.8 {q0-q1}, [r1]! - - vld1.8 {q0-q1}, [r2]! -+ subs r4, r4, #32 - veor q0, q0, q4 - veor q1, q1, q5 -+ ble .Lle192 - vst1.8 {q0-q1}, [r1]! - - vld1.8 {q0-q1}, [r2]! -+ subs r4, r4, #32 - veor q0, q0, q9 - veor q1, q1, q13 -+ ble .Lle224 - vst1.8 {q0-q1}, [r1]! - - vld1.8 {q0-q1}, [r2]! -+ subs r4, r4, #32 - veor q0, q0, q3 - veor q1, q1, q7 -+ blt .Llt256 -+.Lout: - vst1.8 {q0-q1}, [r1]! - - vld1.8 {q0-q1}, [r2] -- mov sp, r4 // restore original stack pointer - veor q0, q0, q11 - veor q1, q1, q15 - vst1.8 {q0-q1}, [r1] - -- pop {r4-r5} -- bx lr -+ pop {r4, pc} -+ -+.Lle192: -+ vmov q4, q9 -+ vmov q5, q13 -+ -+.Lle160: -+ // nothing to do -+ -+.Lfinalblock: -+ // Process the final block if processing less than 4 full blocks. -+ // Entered with 32 bytes of ChaCha cipher stream in q4-q5, and the -+ // previous 32 byte output block that still needs to be written at -+ // [r1] in q0-q1. -+ beq .Lfullblock -+ -+.Lpartialblock: -+ adr lr, .Lpermute + 32 -+ add r2, r2, r4 -+ add lr, lr, r4 -+ add r4, r4, r1 -+ -+ vld1.8 {q2-q3}, [lr] -+ vld1.8 {q6-q7}, [r2] -+ -+ add r4, r4, #32 -+ -+ vtbl.8 d4, {q4-q5}, d4 -+ vtbl.8 d5, {q4-q5}, d5 -+ vtbl.8 d6, {q4-q5}, d6 -+ vtbl.8 d7, {q4-q5}, d7 -+ -+ veor q6, q6, q2 -+ veor q7, q7, q3 -+ -+ vst1.8 {q6-q7}, [r4] // overlapping stores -+ vst1.8 {q0-q1}, [r1] -+ pop {r4, pc} -+ -+.Lfullblock: -+ vmov q11, q4 -+ vmov q15, q5 -+ b .Lout -+.Lle96: -+ vmov q4, q2 -+ vmov q5, q6 -+ b .Lfinalblock -+.Lle128: -+ vmov q4, q10 -+ vmov q5, q14 -+ b .Lfinalblock -+.Lle224: -+ vmov q4, q3 -+ vmov q5, q7 -+ b .Lfinalblock -+.Llt256: -+ vmov q4, q11 -+ vmov q5, q15 -+ b .Lpartialblock - ENDPROC(chacha_4block_xor_neon) -+ -+ .align L1_CACHE_SHIFT -+.Lpermute: -+ .byte 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 -+ .byte 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f -+ .byte 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 -+ .byte 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f -+ .byte 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 -+ .byte 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f -+ .byte 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 -+ .byte 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f diff --git a/target/linux/generic/backport-5.10/072-crypto-arm-chacha-neon-add-missing-counter-increment.patch b/target/linux/generic/backport-5.10/072-crypto-arm-chacha-neon-add-missing-counter-increment.patch deleted file mode 100644 index 1e4d2041e5..0000000000 --- a/target/linux/generic/backport-5.10/072-crypto-arm-chacha-neon-add-missing-counter-increment.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 7f63462faf9eab69132bea9abd48c2c05a93145b Mon Sep 17 00:00:00 2001 -From: Ard Biesheuvel -Date: Sun, 13 Dec 2020 15:39:29 +0100 -Subject: [PATCH 2/2] crypto: arm/chacha-neon - add missing counter increment - -commit fd16931a2f518a32753920ff20895e5cf04c8ff1 upstream. - -Commit 86cd97ec4b943af3 ("crypto: arm/chacha-neon - optimize for non-block -size multiples") refactored the chacha block handling in the glue code in -a way that may result in the counter increment to be omitted when calling -chacha_block_xor_neon() to process a full block. This violates the skcipher -API, which requires that the output IV is suitable for handling more input -as long as the preceding input has been presented in round multiples of the -block size. Also, the same code is exposed via the chacha library interface -whose callers may actually rely on this increment to occur even for final -blocks that are smaller than the chacha block size. - -So increment the counter after calling chacha_block_xor_neon(). - -Fixes: 86cd97ec4b943af3 ("crypto: arm/chacha-neon - optimize for non-block size multiples") -Reported-by: Eric Biggers -Signed-off-by: Ard Biesheuvel -Signed-off-by: Herbert Xu -Signed-off-by: Jason A. Donenfeld ---- - arch/arm/crypto/chacha-glue.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/arch/arm/crypto/chacha-glue.c -+++ b/arch/arm/crypto/chacha-glue.c -@@ -60,6 +60,7 @@ static void chacha_doneon(u32 *state, u8 - chacha_block_xor_neon(state, d, s, nrounds); - if (d != dst) - memcpy(dst, buf, bytes); -+ state[12]++; - } - } - diff --git a/target/linux/generic/backport-5.10/080-wireguard-peer-put-frequently-used-members-above-cac.patch b/target/linux/generic/backport-5.10/080-wireguard-peer-put-frequently-used-members-above-cac.patch deleted file mode 100644 index 444fd677b4..0000000000 --- a/target/linux/generic/backport-5.10/080-wireguard-peer-put-frequently-used-members-above-cac.patch +++ /dev/null @@ -1,42 +0,0 @@ -From a13827e9091c07e25cdeec9a402d74a27e2a1111 Mon Sep 17 00:00:00 2001 -From: "Jason A. Donenfeld" -Date: Mon, 22 Feb 2021 17:25:46 +0100 -Subject: [PATCH] wireguard: peer: put frequently used members above cache - lines - -commit 5a0598695634a6bb4126818902dd9140cd9df8b6 upstream. - -The is_dead boolean is checked for every single packet, while the -internal_id member is used basically only for pr_debug messages. So it -makes sense to hoist up is_dead into some space formerly unused by a -struct hole, while demoting internal_api to below the lowest struct -cache line. - -Signed-off-by: Jason A. Donenfeld -Signed-off-by: Jakub Kicinski -Signed-off-by: Jason A. Donenfeld ---- - drivers/net/wireguard/peer.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/drivers/net/wireguard/peer.h -+++ b/drivers/net/wireguard/peer.h -@@ -39,6 +39,7 @@ struct wg_peer { - struct prev_queue tx_queue, rx_queue; - struct sk_buff_head staged_packet_queue; - int serial_work_cpu; -+ bool is_dead; - struct noise_keypairs keypairs; - struct endpoint endpoint; - struct dst_cache endpoint_cache; -@@ -61,9 +62,8 @@ struct wg_peer { - struct rcu_head rcu; - struct list_head peer_list; - struct list_head allowedips_list; -- u64 internal_id; - struct napi_struct napi; -- bool is_dead; -+ u64 internal_id; - }; - - struct wg_peer *wg_peer_create(struct wg_device *wg, diff --git a/target/linux/generic/backport-5.10/081-net-next-regmap-allow-to-define-reg_update_bits-for-no-bus.patch b/target/linux/generic/backport-5.10/081-net-next-regmap-allow-to-define-reg_update_bits-for-no-bus.patch deleted file mode 100644 index 6e274acb1f..0000000000 --- a/target/linux/generic/backport-5.10/081-net-next-regmap-allow-to-define-reg_update_bits-for-no-bus.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 02d6fdecb9c38de19065f6bed8d5214556fd061d Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Thu, 4 Nov 2021 16:00:40 +0100 -Subject: regmap: allow to define reg_update_bits for no bus configuration - -Some device requires a special handling for reg_update_bits and can't use -the normal regmap read write logic. An example is when locking is -handled by the device and rmw operations requires to do atomic operations. -Allow to declare a dedicated function in regmap_config for -reg_update_bits in no bus configuration. - -Signed-off-by: Ansuel Smith -Link: https://lore.kernel.org/r/20211104150040.1260-1-ansuelsmth@gmail.com -Signed-off-by: Mark Brown ---- - drivers/base/regmap/regmap.c | 1 + - include/linux/regmap.h | 7 +++++++ - 2 files changed, 8 insertions(+) - ---- a/drivers/base/regmap/regmap.c -+++ b/drivers/base/regmap/regmap.c -@@ -842,6 +842,7 @@ struct regmap *__regmap_init(struct devi - if (!bus) { - map->reg_read = config->reg_read; - map->reg_write = config->reg_write; -+ map->reg_update_bits = config->reg_update_bits; - - map->defer_caching = false; - goto skip_format_initialization; ---- a/include/linux/regmap.h -+++ b/include/linux/regmap.h -@@ -289,6 +289,11 @@ typedef void (*regmap_unlock)(void *); - * read operation on a bus such as SPI, I2C, etc. Most of the - * devices do not need this. - * @reg_write: Same as above for writing. -+ * @reg_update_bits: Optional callback that if filled will be used to perform -+ * all the update_bits(rmw) operation. Should only be provided -+ * if the function require special handling with lock and reg -+ * handling and the operation cannot be represented as a simple -+ * update_bits operation on a bus such as SPI, I2C, etc. - * @fast_io: Register IO is fast. Use a spinlock instead of a mutex - * to perform locking. This field is ignored if custom lock/unlock - * functions are used (see fields lock/unlock of struct regmap_config). -@@ -366,6 +371,8 @@ struct regmap_config { - - int (*reg_read)(void *context, unsigned int reg, unsigned int *val); - int (*reg_write)(void *context, unsigned int reg, unsigned int val); -+ int (*reg_update_bits)(void *context, unsigned int reg, -+ unsigned int mask, unsigned int val); - - bool fast_io; - diff --git a/target/linux/generic/backport-5.10/103-v5.13-MIPS-select-CPU_MIPS64-for-remaining-MIPS64-CPUs.patch b/target/linux/generic/backport-5.10/103-v5.13-MIPS-select-CPU_MIPS64-for-remaining-MIPS64-CPUs.patch deleted file mode 100644 index fafe530ac5..0000000000 --- a/target/linux/generic/backport-5.10/103-v5.13-MIPS-select-CPU_MIPS64-for-remaining-MIPS64-CPUs.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 6523061868212473f63812a0c477a161742bed42 Mon Sep 17 00:00:00 2001 -From: "Jason A. Donenfeld" -Date: Sat, 27 Feb 2021 13:20:24 +0100 -Subject: [PATCH] MIPS: select CPU_MIPS64 for remaining MIPS64 CPUs - -The CPU_MIPS64 and CPU_MIPS32 variables are supposed to be able to -distinguish broadly between 64-bit and 32-bit MIPS CPUs. However, they -weren't selected by the specialty CPUs, Octeon and Loongson, which meant -it was possible to hit a weird state of: - - MIPS=y, CONFIG_64BIT=y, CPU_MIPS64=n - -This commit rectifies the issue by having CPU_MIPS64 be selected when -the missing Octeon or Loongson models are selected. - -Cc: Thomas Bogendoerfer -Cc: Ralf Baechle -Cc: George Cherian -Cc: Huacai Chen -Cc: Jiaxun Yang -Signed-off-by: Jason A. Donenfeld ---- - arch/mips/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/mips/Kconfig -+++ b/arch/mips/Kconfig -@@ -2088,7 +2088,7 @@ config CPU_MIPS32 - config CPU_MIPS64 - bool - default y if CPU_MIPS64_R1 || CPU_MIPS64_R2 || CPU_MIPS64_R5 || \ -- CPU_MIPS64_R6 -+ CPU_MIPS64_R6 || CPU_LOONGSON64 || CPU_CAVIUM_OCTEON - - # - # These indicate the revision of the architecture diff --git a/target/linux/generic/backport-5.10/311-v5.11-MIPS-zboot-put-appended-dtb-into-a-section.patch b/target/linux/generic/backport-5.10/311-v5.11-MIPS-zboot-put-appended-dtb-into-a-section.patch deleted file mode 100644 index 3f8808f702..0000000000 --- a/target/linux/generic/backport-5.10/311-v5.11-MIPS-zboot-put-appended-dtb-into-a-section.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 7d1531c81c0fb4c93bea8dc316043ad0e4d0c270 Mon Sep 17 00:00:00 2001 -From: Chuanhong Guo -Date: Sun, 25 Oct 2020 23:19:40 +0800 -Subject: [PATCH] MIPS: zboot: put appended dtb into a section - -This will make a separated section for dtb appear in ELF, and we can -then use objcopy to patch a dtb into vmlinuz when RAW_APPENDED_DTB -is set in kernel config. - -command to patch a dtb: -objcopy --set-section-flags=.appended_dtb=alloc,contents \ - --update-section=.appended_dtb=.dtb vmlinuz vmlinuz-dtb - -Signed-off-by: Chuanhong Guo ---- - arch/mips/boot/compressed/ld.script | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - ---- a/arch/mips/boot/compressed/ld.script -+++ b/arch/mips/boot/compressed/ld.script -@@ -31,9 +31,12 @@ SECTIONS - CONSTRUCTORS - . = ALIGN(16); - } -- __appended_dtb = .; -- /* leave space for appended DTB */ -- . += 0x100000; -+ -+ .appended_dtb : { -+ __appended_dtb = .; -+ /* leave space for appended DTB */ -+ . += 0x100000; -+ } - - _edata = .; - /* End of data section */ diff --git a/target/linux/generic/backport-5.10/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch b/target/linux/generic/backport-5.10/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch deleted file mode 100644 index d300af3342..0000000000 --- a/target/linux/generic/backport-5.10/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch +++ /dev/null @@ -1,106 +0,0 @@ -From: Pablo Neira Ayuso -Date: Thu, 25 Jan 2018 12:58:55 +0100 -Subject: [PATCH] netfilter: nft_flow_offload: handle netdevice events from - nf_flow_table - -Move the code that deals with device events to the core. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -576,13 +576,41 @@ void nf_flow_table_free(struct nf_flowta - } - EXPORT_SYMBOL_GPL(nf_flow_table_free); - -+static int nf_flow_table_netdev_event(struct notifier_block *this, -+ unsigned long event, void *ptr) -+{ -+ struct net_device *dev = netdev_notifier_info_to_dev(ptr); -+ -+ if (event != NETDEV_DOWN) -+ return NOTIFY_DONE; -+ -+ nf_flow_table_cleanup(dev); -+ -+ return NOTIFY_DONE; -+} -+ -+static struct notifier_block flow_offload_netdev_notifier = { -+ .notifier_call = nf_flow_table_netdev_event, -+}; -+ - static int __init nf_flow_table_module_init(void) - { -- return nf_flow_table_offload_init(); -+ int ret; -+ -+ ret = nf_flow_table_offload_init(); -+ if (ret) -+ return ret; -+ -+ ret = register_netdevice_notifier(&flow_offload_netdev_notifier); -+ if (ret) -+ nf_flow_table_offload_exit(); -+ -+ return ret; - } - - static void __exit nf_flow_table_module_exit(void) - { -+ unregister_netdevice_notifier(&flow_offload_netdev_notifier); - nf_flow_table_offload_exit(); - } - ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -237,47 +237,14 @@ static struct nft_expr_type nft_flow_off - .owner = THIS_MODULE, - }; - --static int flow_offload_netdev_event(struct notifier_block *this, -- unsigned long event, void *ptr) --{ -- struct net_device *dev = netdev_notifier_info_to_dev(ptr); -- -- if (event != NETDEV_DOWN) -- return NOTIFY_DONE; -- -- nf_flow_table_cleanup(dev); -- -- return NOTIFY_DONE; --} -- --static struct notifier_block flow_offload_netdev_notifier = { -- .notifier_call = flow_offload_netdev_event, --}; -- - static int __init nft_flow_offload_module_init(void) - { -- int err; -- -- err = register_netdevice_notifier(&flow_offload_netdev_notifier); -- if (err) -- goto err; -- -- err = nft_register_expr(&nft_flow_offload_type); -- if (err < 0) -- goto register_expr; -- -- return 0; -- --register_expr: -- unregister_netdevice_notifier(&flow_offload_netdev_notifier); --err: -- return err; -+ return nft_register_expr(&nft_flow_offload_type); - } - - static void __exit nft_flow_offload_module_exit(void) - { - nft_unregister_expr(&nft_flow_offload_type); -- unregister_netdevice_notifier(&flow_offload_netdev_notifier); - } - - module_init(nft_flow_offload_module_init); diff --git a/target/linux/generic/backport-5.10/401-v5.11-dt-bindings-mtd-convert-fixed-partitions-to-the-json.patch b/target/linux/generic/backport-5.10/401-v5.11-dt-bindings-mtd-convert-fixed-partitions-to-the-json.patch deleted file mode 100644 index 8aded43526..0000000000 --- a/target/linux/generic/backport-5.10/401-v5.11-dt-bindings-mtd-convert-fixed-partitions-to-the-json.patch +++ /dev/null @@ -1,324 +0,0 @@ -From 04e9ab75267489224364fa510a88ada83e11c325 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 10 Dec 2020 18:23:52 +0100 -Subject: [PATCH] dt-bindings: mtd: convert "fixed-partitions" to the - json-schema -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This standardizes its documentation, allows validating with Makefile -checks and helps writing DTS files. - -Noticeable changes: -1. Dropped "Partitions can be represented by sub-nodes of a flash - device." as we also support subpartitions (don't have to be part of - flash device node) -2. Dropped "to Linux" as bindings are meant to be os agnostic. - -Signed-off-by: Rafał Miłecki -Link: https://lore.kernel.org/r/20201210172352.31632-1-zajec5@gmail.com -Signed-off-by: Rob Herring ---- - .../devicetree/bindings/mtd/partition.txt | 131 +-------------- - .../mtd/partitions/fixed-partitions.yaml | 152 ++++++++++++++++++ - 2 files changed, 154 insertions(+), 129 deletions(-) - create mode 100644 Documentation/devicetree/bindings/mtd/partitions/fixed-partitions.yaml - ---- a/Documentation/devicetree/bindings/mtd/partition.txt -+++ b/Documentation/devicetree/bindings/mtd/partition.txt -@@ -24,137 +24,10 @@ another partitioning method. - Available bindings are listed in the "partitions" subdirectory. - - --Fixed Partitions --================ -- --Partitions can be represented by sub-nodes of a flash device. This can be used --on platforms which have strong conventions about which portions of a flash are --used for what purposes, but which don't use an on-flash partition table such --as RedBoot. -- --The partition table should be a subnode of the flash node and should be named --'partitions'. This node should have the following property: --- compatible : (required) must be "fixed-partitions" --Partitions are then defined in subnodes of the partitions node. -+Deprecated: partitions defined in flash node -+============================================ - - For backwards compatibility partitions as direct subnodes of the flash device are - supported. This use is discouraged. - NOTE: also for backwards compatibility, direct subnodes that have a compatible - string are not considered partitions, as they may be used for other bindings. -- --#address-cells & #size-cells must both be present in the partitions subnode of the --flash device. There are two valid values for both: --<1>: for partitions that require a single 32-bit cell to represent their -- size/address (aka the value is below 4 GiB) --<2>: for partitions that require two 32-bit cells to represent their -- size/address (aka the value is 4 GiB or greater). -- --Required properties: --- reg : The partition's offset and size within the flash -- --Optional properties: --- label : The label / name for this partition. If omitted, the label is taken -- from the node name (excluding the unit address). --- read-only : This parameter, if present, is a hint to Linux that this -- partition should only be mounted read-only. This is usually used for flash -- partitions containing early-boot firmware images or data which should not be -- clobbered. --- lock : Do not unlock the partition at initialization time (not supported on -- all devices) --- slc-mode: This parameter, if present, allows one to emulate SLC mode on a -- partition attached to an MLC NAND thus making this partition immune to -- paired-pages corruptions -- --Examples: -- -- --flash@0 { -- partitions { -- compatible = "fixed-partitions"; -- #address-cells = <1>; -- #size-cells = <1>; -- -- partition@0 { -- label = "u-boot"; -- reg = <0x0000000 0x100000>; -- read-only; -- }; -- -- uimage@100000 { -- reg = <0x0100000 0x200000>; -- }; -- }; --}; -- --flash@1 { -- partitions { -- compatible = "fixed-partitions"; -- #address-cells = <1>; -- #size-cells = <2>; -- -- /* a 4 GiB partition */ -- partition@0 { -- label = "filesystem"; -- reg = <0x00000000 0x1 0x00000000>; -- }; -- }; --}; -- --flash@2 { -- partitions { -- compatible = "fixed-partitions"; -- #address-cells = <2>; -- #size-cells = <2>; -- -- /* an 8 GiB partition */ -- partition@0 { -- label = "filesystem #1"; -- reg = <0x0 0x00000000 0x2 0x00000000>; -- }; -- -- /* a 4 GiB partition */ -- partition@200000000 { -- label = "filesystem #2"; -- reg = <0x2 0x00000000 0x1 0x00000000>; -- }; -- }; --}; -- --flash@3 { -- partitions { -- compatible = "fixed-partitions"; -- #address-cells = <1>; -- #size-cells = <1>; -- -- partition@0 { -- label = "bootloader"; -- reg = <0x000000 0x100000>; -- read-only; -- }; -- -- firmware@100000 { -- label = "firmware"; -- reg = <0x100000 0xe00000>; -- compatible = "brcm,trx"; -- }; -- -- calibration@f00000 { -- label = "calibration"; -- reg = <0xf00000 0x100000>; -- compatible = "fixed-partitions"; -- ranges = <0 0xf00000 0x100000>; -- #address-cells = <1>; -- #size-cells = <1>; -- -- partition@0 { -- label = "wifi0"; -- reg = <0x000000 0x080000>; -- }; -- -- partition@80000 { -- label = "wifi1"; -- reg = <0x080000 0x080000>; -- }; -- }; -- }; --}; ---- /dev/null -+++ b/Documentation/devicetree/bindings/mtd/partitions/fixed-partitions.yaml -@@ -0,0 +1,152 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/mtd/partitions/fixed-partitions.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Fixed partitions -+ -+description: | -+ This binding can be used on platforms which have strong conventions about -+ which portions of a flash are used for what purposes, but which don't use an -+ on-flash partition table such as RedBoot. -+ -+ The partition table should be a node named "partitions". Partitions are then -+ defined as subnodes. -+ -+maintainers: -+ - Rafał Miłecki -+ -+properties: -+ compatible: -+ const: fixed-partitions -+ -+ "#address-cells": true -+ -+ "#size-cells": true -+ -+patternProperties: -+ "@[0-9a-f]+$": -+ description: node describing a single flash partition -+ type: object -+ -+ properties: -+ reg: -+ description: partition's offset and size within the flash -+ maxItems: 1 -+ -+ label: -+ description: The label / name for this partition. If omitted, the label -+ is taken from the node name (excluding the unit address). -+ -+ read-only: -+ description: This parameter, if present, is a hint that this partition -+ should only be mounted read-only. This is usually used for flash -+ partitions containing early-boot firmware images or data which should -+ not be clobbered. -+ type: boolean -+ -+ lock: -+ description: Do not unlock the partition at initialization time (not -+ supported on all devices) -+ type: boolean -+ -+ slc-mode: -+ description: This parameter, if present, allows one to emulate SLC mode -+ on a partition attached to an MLC NAND thus making this partition -+ immune to paired-pages corruptions -+ type: boolean -+ -+ required: -+ - reg -+ -+required: -+ - "#address-cells" -+ - "#size-cells" -+ -+additionalProperties: true -+ -+examples: -+ - | -+ partitions { -+ compatible = "fixed-partitions"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ partition@0 { -+ label = "u-boot"; -+ reg = <0x0000000 0x100000>; -+ read-only; -+ }; -+ -+ uimage@100000 { -+ reg = <0x0100000 0x200000>; -+ }; -+ }; -+ - | -+ partitions { -+ compatible = "fixed-partitions"; -+ #address-cells = <1>; -+ #size-cells = <2>; -+ -+ /* a 4 GiB partition */ -+ partition@0 { -+ label = "filesystem"; -+ reg = <0x00000000 0x1 0x00000000>; -+ }; -+ }; -+ - | -+ partitions { -+ compatible = "fixed-partitions"; -+ #address-cells = <2>; -+ #size-cells = <2>; -+ -+ /* an 8 GiB partition */ -+ partition@0 { -+ label = "filesystem #1"; -+ reg = <0x0 0x00000000 0x2 0x00000000>; -+ }; -+ -+ /* a 4 GiB partition */ -+ partition@200000000 { -+ label = "filesystem #2"; -+ reg = <0x2 0x00000000 0x1 0x00000000>; -+ }; -+ }; -+ - | -+ partitions { -+ compatible = "fixed-partitions"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ partition@0 { -+ label = "bootloader"; -+ reg = <0x000000 0x100000>; -+ read-only; -+ }; -+ -+ firmware@100000 { -+ compatible = "brcm,trx"; -+ label = "firmware"; -+ reg = <0x100000 0xe00000>; -+ }; -+ -+ calibration@f00000 { -+ compatible = "fixed-partitions"; -+ label = "calibration"; -+ reg = <0xf00000 0x100000>; -+ ranges = <0 0xf00000 0x100000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ partition@0 { -+ label = "wifi0"; -+ reg = <0x000000 0x080000>; -+ }; -+ -+ partition@80000 { -+ label = "wifi1"; -+ reg = <0x080000 0x080000>; -+ }; -+ }; -+ }; diff --git a/target/linux/generic/backport-5.10/402-v5.12-0001-dt-bindings-mtd-move-partition-binding-to-its-own-fi.patch b/target/linux/generic/backport-5.10/402-v5.12-0001-dt-bindings-mtd-move-partition-binding-to-its-own-fi.patch deleted file mode 100644 index f3b1179ecd..0000000000 --- a/target/linux/generic/backport-5.10/402-v5.12-0001-dt-bindings-mtd-move-partition-binding-to-its-own-fi.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 6418522022c706fd867b00b2571edba48b8fa8c7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 11 Feb 2021 23:04:25 +0100 -Subject: [PATCH] dt-bindings: mtd: move partition binding to its own file -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Single partition binding is quite common and may be: -1. Used by multiple parsers -2. Extended for more specific cases - -Move it to separated file to avoid code duplication. - -Signed-off-by: Rafał Miłecki -Reviewed-by: Rob Herring -Signed-off-by: Richard Weinberger ---- - .../mtd/partitions/fixed-partitions.yaml | 33 +------------ - .../bindings/mtd/partitions/partition.yaml | 47 +++++++++++++++++++ - 2 files changed, 48 insertions(+), 32 deletions(-) - create mode 100644 Documentation/devicetree/bindings/mtd/partitions/partition.yaml - ---- a/Documentation/devicetree/bindings/mtd/partitions/fixed-partitions.yaml -+++ b/Documentation/devicetree/bindings/mtd/partitions/fixed-partitions.yaml -@@ -27,38 +27,7 @@ properties: - - patternProperties: - "@[0-9a-f]+$": -- description: node describing a single flash partition -- type: object -- -- properties: -- reg: -- description: partition's offset and size within the flash -- maxItems: 1 -- -- label: -- description: The label / name for this partition. If omitted, the label -- is taken from the node name (excluding the unit address). -- -- read-only: -- description: This parameter, if present, is a hint that this partition -- should only be mounted read-only. This is usually used for flash -- partitions containing early-boot firmware images or data which should -- not be clobbered. -- type: boolean -- -- lock: -- description: Do not unlock the partition at initialization time (not -- supported on all devices) -- type: boolean -- -- slc-mode: -- description: This parameter, if present, allows one to emulate SLC mode -- on a partition attached to an MLC NAND thus making this partition -- immune to paired-pages corruptions -- type: boolean -- -- required: -- - reg -+ $ref: "partition.yaml#" - - required: - - "#address-cells" ---- /dev/null -+++ b/Documentation/devicetree/bindings/mtd/partitions/partition.yaml -@@ -0,0 +1,47 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/mtd/partitions/partition.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Partition -+ -+description: | -+ This binding describes a single flash partition. Each partition must have its -+ relative offset and size specified. Depending on partition function extra -+ properties can be used. -+ -+maintainers: -+ - Rafał Miłecki -+ -+properties: -+ reg: -+ description: partition's offset and size within the flash -+ maxItems: 1 -+ -+ label: -+ description: The label / name for this partition. If omitted, the label -+ is taken from the node name (excluding the unit address). -+ -+ read-only: -+ description: This parameter, if present, is a hint that this partition -+ should only be mounted read-only. This is usually used for flash -+ partitions containing early-boot firmware images or data which should -+ not be clobbered. -+ type: boolean -+ -+ lock: -+ description: Do not unlock the partition at initialization time (not -+ supported on all devices) -+ type: boolean -+ -+ slc-mode: -+ description: This parameter, if present, allows one to emulate SLC mode -+ on a partition attached to an MLC NAND thus making this partition -+ immune to paired-pages corruptions -+ type: boolean -+ -+required: -+ - reg -+ -+additionalProperties: true diff --git a/target/linux/generic/backport-5.10/402-v5.12-0002-dt-bindings-mtd-add-binding-for-BCM4908-partitions.patch b/target/linux/generic/backport-5.10/402-v5.12-0002-dt-bindings-mtd-add-binding-for-BCM4908-partitions.patch deleted file mode 100644 index 8576c7d78d..0000000000 --- a/target/linux/generic/backport-5.10/402-v5.12-0002-dt-bindings-mtd-add-binding-for-BCM4908-partitions.patch +++ /dev/null @@ -1,92 +0,0 @@ -From 6e9dff6fe3fbc452f16566e4a7e293b0decefdba Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 11 Feb 2021 23:04:26 +0100 -Subject: [PATCH] dt-bindings: mtd: add binding for BCM4908 partitions -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -BCM4908 uses fixed partitions layout but function of some partitions may -vary. Some devices use multiple firmware partitions and those partitions -should be marked to let system discover their purpose. - -Signed-off-by: Rafał Miłecki -Signed-off-by: Richard Weinberger ---- - .../partitions/brcm,bcm4908-partitions.yaml | 70 +++++++++++++++++++ - 1 file changed, 70 insertions(+) - create mode 100644 Documentation/devicetree/bindings/mtd/partitions/brcm,bcm4908-partitions.yaml - ---- /dev/null -+++ b/Documentation/devicetree/bindings/mtd/partitions/brcm,bcm4908-partitions.yaml -@@ -0,0 +1,70 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/mtd/partitions/brcm,bcm4908-partitions.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Broadcom BCM4908 partitioning -+ -+description: | -+ Broadcom BCM4908 CFE bootloader supports two firmware partitions. One is used -+ for regular booting, the other is treated as fallback. -+ -+ This binding allows defining all fixed partitions and marking those containing -+ firmware. System can use that information e.g. for booting or flashing -+ purposes. -+ -+maintainers: -+ - Rafał Miłecki -+ -+properties: -+ compatible: -+ const: brcm,bcm4908-partitions -+ -+ "#address-cells": -+ enum: [ 1, 2 ] -+ -+ "#size-cells": -+ enum: [ 1, 2 ] -+ -+patternProperties: -+ "^partition@[0-9a-f]+$": -+ $ref: "partition.yaml#" -+ properties: -+ compatible: -+ const: brcm,bcm4908-firmware -+ unevaluatedProperties: false -+ -+required: -+ - "#address-cells" -+ - "#size-cells" -+ -+additionalProperties: false -+ -+examples: -+ - | -+ partitions { -+ compatible = "brcm,bcm4908-partitions"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ partition@0 { -+ label = "cferom"; -+ reg = <0x0 0x100000>; -+ }; -+ -+ partition@100000 { -+ compatible = "brcm,bcm4908-firmware"; -+ reg = <0x100000 0xf00000>; -+ }; -+ -+ partition@1000000 { -+ compatible = "brcm,bcm4908-firmware"; -+ reg = <0x1000000 0xf00000>; -+ }; -+ -+ partition@1f00000 { -+ label = "calibration"; -+ reg = <0x1f00000 0x100000>; -+ }; -+ }; diff --git a/target/linux/generic/backport-5.10/403-v5.13-mtd-parsers-ofpart-support-BCM4908-fixed-partitions.patch b/target/linux/generic/backport-5.10/403-v5.13-mtd-parsers-ofpart-support-BCM4908-fixed-partitions.patch deleted file mode 100644 index d3891228e2..0000000000 --- a/target/linux/generic/backport-5.10/403-v5.13-mtd-parsers-ofpart-support-BCM4908-fixed-partitions.patch +++ /dev/null @@ -1,654 +0,0 @@ -From afbef8efb591792579c633a7c545f914c6165f82 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 11 Feb 2021 23:04:27 +0100 -Subject: [PATCH] mtd: parsers: ofpart: support BCM4908 fixed partitions -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Some devices use fixed partitioning with some partitions requiring some -extra logic. E.g. BCM4908 may have multiple firmware partitions but -detecting currently used one requires checking bootloader parameters. - -To support such cases without duplicating a lot of code (without copying -most of the ofpart.c code) support for post-parsing callback was added. - -BCM4908 support in ofpart can be enabled using config option and results -in compiling & executing a specific callback. It simply reads offset of -currently used firmware partition from the DT. Bootloader specifies it -using the "brcm_blparms" property. - -Signed-off-by: Rafał Miłecki ---- - drivers/mtd/parsers/Kconfig | 9 +++ - drivers/mtd/parsers/Makefile | 2 + - drivers/mtd/parsers/ofpart_bcm4908.c | 64 +++++++++++++++++++ - drivers/mtd/parsers/ofpart_bcm4908.h | 15 +++++ - .../mtd/parsers/{ofpart.c => ofpart_core.c} | 28 +++++++- - 5 files changed, 116 insertions(+), 2 deletions(-) - create mode 100644 drivers/mtd/parsers/ofpart_bcm4908.c - create mode 100644 drivers/mtd/parsers/ofpart_bcm4908.h - rename drivers/mtd/parsers/{ofpart.c => ofpart_core.c} (88%) - ---- a/drivers/mtd/parsers/Kconfig -+++ b/drivers/mtd/parsers/Kconfig -@@ -67,6 +67,15 @@ config MTD_OF_PARTS - flash memory node, as described in - Documentation/devicetree/bindings/mtd/partition.txt. - -+config MTD_OF_PARTS_BCM4908 -+ bool "BCM4908 partitioning support" -+ depends on MTD_OF_PARTS && (ARCH_BCM4908 || COMPILE_TEST) -+ default ARCH_BCM4908 -+ help -+ This provides partitions parser for BCM4908 family devices -+ that can have multiple "firmware" partitions. It takes care of -+ finding currently used one and backup ones. -+ - config MTD_PARSER_IMAGETAG - tristate "Parser for BCM963XX Image Tag format partitions" - depends on BCM63XX || BMIPS_GENERIC || COMPILE_TEST ---- a/drivers/mtd/parsers/Makefile -+++ b/drivers/mtd/parsers/Makefile -@@ -4,6 +4,8 @@ obj-$(CONFIG_MTD_BCM47XX_PARTS) += bcm4 - obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63xxpart.o - obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o - obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o -+ofpart-y += ofpart_core.o -+ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += ofpart_bcm4908.o - obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o - obj-$(CONFIG_MTD_AFS_PARTS) += afs.o - obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o ---- /dev/null -+++ b/drivers/mtd/parsers/ofpart_bcm4908.c -@@ -0,0 +1,64 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2021 Rafał Miłecki -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "ofpart_bcm4908.h" -+ -+#define BLPARAMS_FW_OFFSET "NAND_RFS_OFS" -+ -+static long long bcm4908_partitions_fw_offset(void) -+{ -+ struct device_node *root; -+ struct property *prop; -+ const char *s; -+ -+ root = of_find_node_by_path("/"); -+ if (!root) -+ return -ENOENT; -+ -+ of_property_for_each_string(root, "brcm_blparms", prop, s) { -+ size_t len = strlen(BLPARAMS_FW_OFFSET); -+ unsigned long offset; -+ int err; -+ -+ if (strncmp(s, BLPARAMS_FW_OFFSET, len) || s[len] != '=') -+ continue; -+ -+ err = kstrtoul(s + len + 1, 0, &offset); -+ if (err) { -+ pr_err("failed to parse %s\n", s + len + 1); -+ return err; -+ } -+ -+ return offset << 10; -+ } -+ -+ return -ENOENT; -+} -+ -+int bcm4908_partitions_post_parse(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts) -+{ -+ long long fw_offset; -+ int i; -+ -+ fw_offset = bcm4908_partitions_fw_offset(); -+ -+ for (i = 0; i < nr_parts; i++) { -+ if (of_device_is_compatible(parts[i].of_node, "brcm,bcm4908-firmware")) { -+ if (fw_offset < 0 || parts[i].offset == fw_offset) -+ parts[i].name = "firmware"; -+ else -+ parts[i].name = "backup"; -+ } -+ } -+ -+ return 0; -+} ---- /dev/null -+++ b/drivers/mtd/parsers/ofpart_bcm4908.h -@@ -0,0 +1,15 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+#ifndef __BCM4908_PARTITIONS_H -+#define __BCM4908_PARTITIONS_H -+ -+#ifdef CONFIG_MTD_OF_PARTS_BCM4908 -+int bcm4908_partitions_post_parse(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts); -+#else -+static inline int bcm4908_partitions_post_parse(struct mtd_info *mtd, struct mtd_partition *parts, -+ int nr_parts) -+{ -+ return -EOPNOTSUPP; -+} -+#endif -+ -+#endif ---- a/drivers/mtd/parsers/ofpart.c -+++ /dev/null -@@ -1,239 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0-or-later --/* -- * Flash partitions described by the OF (or flattened) device tree -- * -- * Copyright © 2006 MontaVista Software Inc. -- * Author: Vitaly Wool -- * -- * Revised to handle newer style flash binding by: -- * Copyright © 2007 David Gibson, IBM Corporation. -- */ -- --#include --#include --#include --#include --#include --#include -- --static bool node_has_compatible(struct device_node *pp) --{ -- return of_get_property(pp, "compatible", NULL); --} -- --static int parse_fixed_partitions(struct mtd_info *master, -- const struct mtd_partition **pparts, -- struct mtd_part_parser_data *data) --{ -- struct mtd_partition *parts; -- struct device_node *mtd_node; -- struct device_node *ofpart_node; -- const char *partname; -- struct device_node *pp; -- int nr_parts, i, ret = 0; -- bool dedicated = true; -- -- -- /* Pull of_node from the master device node */ -- mtd_node = mtd_get_of_node(master); -- if (!mtd_node) -- return 0; -- -- ofpart_node = of_get_child_by_name(mtd_node, "partitions"); -- if (!ofpart_node) { -- /* -- * We might get here even when ofpart isn't used at all (e.g., -- * when using another parser), so don't be louder than -- * KERN_DEBUG -- */ -- pr_debug("%s: 'partitions' subnode not found on %pOF. Trying to parse direct subnodes as partitions.\n", -- master->name, mtd_node); -- ofpart_node = mtd_node; -- dedicated = false; -- } else if (!of_device_is_compatible(ofpart_node, "fixed-partitions")) { -- /* The 'partitions' subnode might be used by another parser */ -- return 0; -- } -- -- /* First count the subnodes */ -- nr_parts = 0; -- for_each_child_of_node(ofpart_node, pp) { -- if (!dedicated && node_has_compatible(pp)) -- continue; -- -- nr_parts++; -- } -- -- if (nr_parts == 0) -- return 0; -- -- parts = kcalloc(nr_parts, sizeof(*parts), GFP_KERNEL); -- if (!parts) -- return -ENOMEM; -- -- i = 0; -- for_each_child_of_node(ofpart_node, pp) { -- const __be32 *reg; -- int len; -- int a_cells, s_cells; -- -- if (!dedicated && node_has_compatible(pp)) -- continue; -- -- reg = of_get_property(pp, "reg", &len); -- if (!reg) { -- if (dedicated) { -- pr_debug("%s: ofpart partition %pOF (%pOF) missing reg property.\n", -- master->name, pp, -- mtd_node); -- goto ofpart_fail; -- } else { -- nr_parts--; -- continue; -- } -- } -- -- a_cells = of_n_addr_cells(pp); -- s_cells = of_n_size_cells(pp); -- if (len / 4 != a_cells + s_cells) { -- pr_debug("%s: ofpart partition %pOF (%pOF) error parsing reg property.\n", -- master->name, pp, -- mtd_node); -- goto ofpart_fail; -- } -- -- parts[i].offset = of_read_number(reg, a_cells); -- parts[i].size = of_read_number(reg + a_cells, s_cells); -- parts[i].of_node = pp; -- -- partname = of_get_property(pp, "label", &len); -- if (!partname) -- partname = of_get_property(pp, "name", &len); -- parts[i].name = partname; -- -- if (of_get_property(pp, "read-only", &len)) -- parts[i].mask_flags |= MTD_WRITEABLE; -- -- if (of_get_property(pp, "lock", &len)) -- parts[i].mask_flags |= MTD_POWERUP_LOCK; -- -- if (of_property_read_bool(pp, "slc-mode")) -- parts[i].add_flags |= MTD_SLC_ON_MLC_EMULATION; -- -- i++; -- } -- -- if (!nr_parts) -- goto ofpart_none; -- -- *pparts = parts; -- return nr_parts; -- --ofpart_fail: -- pr_err("%s: error parsing ofpart partition %pOF (%pOF)\n", -- master->name, pp, mtd_node); -- ret = -EINVAL; --ofpart_none: -- of_node_put(pp); -- kfree(parts); -- return ret; --} -- --static const struct of_device_id parse_ofpart_match_table[] = { -- { .compatible = "fixed-partitions" }, -- {}, --}; --MODULE_DEVICE_TABLE(of, parse_ofpart_match_table); -- --static struct mtd_part_parser ofpart_parser = { -- .parse_fn = parse_fixed_partitions, -- .name = "fixed-partitions", -- .of_match_table = parse_ofpart_match_table, --}; -- --static int parse_ofoldpart_partitions(struct mtd_info *master, -- const struct mtd_partition **pparts, -- struct mtd_part_parser_data *data) --{ -- struct mtd_partition *parts; -- struct device_node *dp; -- int i, plen, nr_parts; -- const struct { -- __be32 offset, len; -- } *part; -- const char *names; -- -- /* Pull of_node from the master device node */ -- dp = mtd_get_of_node(master); -- if (!dp) -- return 0; -- -- part = of_get_property(dp, "partitions", &plen); -- if (!part) -- return 0; /* No partitions found */ -- -- pr_warn("Device tree uses obsolete partition map binding: %pOF\n", dp); -- -- nr_parts = plen / sizeof(part[0]); -- -- parts = kcalloc(nr_parts, sizeof(*parts), GFP_KERNEL); -- if (!parts) -- return -ENOMEM; -- -- names = of_get_property(dp, "partition-names", &plen); -- -- for (i = 0; i < nr_parts; i++) { -- parts[i].offset = be32_to_cpu(part->offset); -- parts[i].size = be32_to_cpu(part->len) & ~1; -- /* bit 0 set signifies read only partition */ -- if (be32_to_cpu(part->len) & 1) -- parts[i].mask_flags = MTD_WRITEABLE; -- -- if (names && (plen > 0)) { -- int len = strlen(names) + 1; -- -- parts[i].name = names; -- plen -= len; -- names += len; -- } else { -- parts[i].name = "unnamed"; -- } -- -- part++; -- } -- -- *pparts = parts; -- return nr_parts; --} -- --static struct mtd_part_parser ofoldpart_parser = { -- .parse_fn = parse_ofoldpart_partitions, -- .name = "ofoldpart", --}; -- --static int __init ofpart_parser_init(void) --{ -- register_mtd_parser(&ofpart_parser); -- register_mtd_parser(&ofoldpart_parser); -- return 0; --} -- --static void __exit ofpart_parser_exit(void) --{ -- deregister_mtd_parser(&ofpart_parser); -- deregister_mtd_parser(&ofoldpart_parser); --} -- --module_init(ofpart_parser_init); --module_exit(ofpart_parser_exit); -- --MODULE_LICENSE("GPL"); --MODULE_DESCRIPTION("Parser for MTD partitioning information in device tree"); --MODULE_AUTHOR("Vitaly Wool, David Gibson"); --/* -- * When MTD core cannot find the requested parser, it tries to load the module -- * with the same name. Since we provide the ofoldpart parser, we should have -- * the corresponding alias. -- */ --MODULE_ALIAS("fixed-partitions"); --MODULE_ALIAS("ofoldpart"); ---- /dev/null -+++ b/drivers/mtd/parsers/ofpart_core.c -@@ -0,0 +1,263 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Flash partitions described by the OF (or flattened) device tree -+ * -+ * Copyright © 2006 MontaVista Software Inc. -+ * Author: Vitaly Wool -+ * -+ * Revised to handle newer style flash binding by: -+ * Copyright © 2007 David Gibson, IBM Corporation. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "ofpart_bcm4908.h" -+ -+struct fixed_partitions_quirks { -+ int (*post_parse)(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts); -+}; -+ -+struct fixed_partitions_quirks bcm4908_partitions_quirks = { -+ .post_parse = bcm4908_partitions_post_parse, -+}; -+ -+static const struct of_device_id parse_ofpart_match_table[]; -+ -+static bool node_has_compatible(struct device_node *pp) -+{ -+ return of_get_property(pp, "compatible", NULL); -+} -+ -+static int parse_fixed_partitions(struct mtd_info *master, -+ const struct mtd_partition **pparts, -+ struct mtd_part_parser_data *data) -+{ -+ const struct fixed_partitions_quirks *quirks; -+ const struct of_device_id *of_id; -+ struct mtd_partition *parts; -+ struct device_node *mtd_node; -+ struct device_node *ofpart_node; -+ const char *partname; -+ struct device_node *pp; -+ int nr_parts, i, ret = 0; -+ bool dedicated = true; -+ -+ /* Pull of_node from the master device node */ -+ mtd_node = mtd_get_of_node(master); -+ if (!mtd_node) -+ return 0; -+ -+ ofpart_node = of_get_child_by_name(mtd_node, "partitions"); -+ if (!ofpart_node) { -+ /* -+ * We might get here even when ofpart isn't used at all (e.g., -+ * when using another parser), so don't be louder than -+ * KERN_DEBUG -+ */ -+ pr_debug("%s: 'partitions' subnode not found on %pOF. Trying to parse direct subnodes as partitions.\n", -+ master->name, mtd_node); -+ ofpart_node = mtd_node; -+ dedicated = false; -+ } -+ -+ of_id = of_match_node(parse_ofpart_match_table, ofpart_node); -+ if (dedicated && !of_id) { -+ /* The 'partitions' subnode might be used by another parser */ -+ return 0; -+ } -+ -+ quirks = of_id ? of_id->data : NULL; -+ -+ /* First count the subnodes */ -+ nr_parts = 0; -+ for_each_child_of_node(ofpart_node, pp) { -+ if (!dedicated && node_has_compatible(pp)) -+ continue; -+ -+ nr_parts++; -+ } -+ -+ if (nr_parts == 0) -+ return 0; -+ -+ parts = kcalloc(nr_parts, sizeof(*parts), GFP_KERNEL); -+ if (!parts) -+ return -ENOMEM; -+ -+ i = 0; -+ for_each_child_of_node(ofpart_node, pp) { -+ const __be32 *reg; -+ int len; -+ int a_cells, s_cells; -+ -+ if (!dedicated && node_has_compatible(pp)) -+ continue; -+ -+ reg = of_get_property(pp, "reg", &len); -+ if (!reg) { -+ if (dedicated) { -+ pr_debug("%s: ofpart partition %pOF (%pOF) missing reg property.\n", -+ master->name, pp, -+ mtd_node); -+ goto ofpart_fail; -+ } else { -+ nr_parts--; -+ continue; -+ } -+ } -+ -+ a_cells = of_n_addr_cells(pp); -+ s_cells = of_n_size_cells(pp); -+ if (len / 4 != a_cells + s_cells) { -+ pr_debug("%s: ofpart partition %pOF (%pOF) error parsing reg property.\n", -+ master->name, pp, -+ mtd_node); -+ goto ofpart_fail; -+ } -+ -+ parts[i].offset = of_read_number(reg, a_cells); -+ parts[i].size = of_read_number(reg + a_cells, s_cells); -+ parts[i].of_node = pp; -+ -+ partname = of_get_property(pp, "label", &len); -+ if (!partname) -+ partname = of_get_property(pp, "name", &len); -+ parts[i].name = partname; -+ -+ if (of_get_property(pp, "read-only", &len)) -+ parts[i].mask_flags |= MTD_WRITEABLE; -+ -+ if (of_get_property(pp, "lock", &len)) -+ parts[i].mask_flags |= MTD_POWERUP_LOCK; -+ -+ if (of_property_read_bool(pp, "slc-mode")) -+ parts[i].add_flags |= MTD_SLC_ON_MLC_EMULATION; -+ -+ i++; -+ } -+ -+ if (!nr_parts) -+ goto ofpart_none; -+ -+ if (quirks && quirks->post_parse) -+ quirks->post_parse(master, parts, nr_parts); -+ -+ *pparts = parts; -+ return nr_parts; -+ -+ofpart_fail: -+ pr_err("%s: error parsing ofpart partition %pOF (%pOF)\n", -+ master->name, pp, mtd_node); -+ ret = -EINVAL; -+ofpart_none: -+ of_node_put(pp); -+ kfree(parts); -+ return ret; -+} -+ -+static const struct of_device_id parse_ofpart_match_table[] = { -+ /* Generic */ -+ { .compatible = "fixed-partitions" }, -+ /* Customized */ -+ { .compatible = "brcm,bcm4908-partitions", .data = &bcm4908_partitions_quirks, }, -+ {}, -+}; -+MODULE_DEVICE_TABLE(of, parse_ofpart_match_table); -+ -+static struct mtd_part_parser ofpart_parser = { -+ .parse_fn = parse_fixed_partitions, -+ .name = "fixed-partitions", -+ .of_match_table = parse_ofpart_match_table, -+}; -+ -+static int parse_ofoldpart_partitions(struct mtd_info *master, -+ const struct mtd_partition **pparts, -+ struct mtd_part_parser_data *data) -+{ -+ struct mtd_partition *parts; -+ struct device_node *dp; -+ int i, plen, nr_parts; -+ const struct { -+ __be32 offset, len; -+ } *part; -+ const char *names; -+ -+ /* Pull of_node from the master device node */ -+ dp = mtd_get_of_node(master); -+ if (!dp) -+ return 0; -+ -+ part = of_get_property(dp, "partitions", &plen); -+ if (!part) -+ return 0; /* No partitions found */ -+ -+ pr_warn("Device tree uses obsolete partition map binding: %pOF\n", dp); -+ -+ nr_parts = plen / sizeof(part[0]); -+ -+ parts = kcalloc(nr_parts, sizeof(*parts), GFP_KERNEL); -+ if (!parts) -+ return -ENOMEM; -+ -+ names = of_get_property(dp, "partition-names", &plen); -+ -+ for (i = 0; i < nr_parts; i++) { -+ parts[i].offset = be32_to_cpu(part->offset); -+ parts[i].size = be32_to_cpu(part->len) & ~1; -+ /* bit 0 set signifies read only partition */ -+ if (be32_to_cpu(part->len) & 1) -+ parts[i].mask_flags = MTD_WRITEABLE; -+ -+ if (names && (plen > 0)) { -+ int len = strlen(names) + 1; -+ -+ parts[i].name = names; -+ plen -= len; -+ names += len; -+ } else { -+ parts[i].name = "unnamed"; -+ } -+ -+ part++; -+ } -+ -+ *pparts = parts; -+ return nr_parts; -+} -+ -+static struct mtd_part_parser ofoldpart_parser = { -+ .parse_fn = parse_ofoldpart_partitions, -+ .name = "ofoldpart", -+}; -+ -+static int __init ofpart_parser_init(void) -+{ -+ register_mtd_parser(&ofpart_parser); -+ register_mtd_parser(&ofoldpart_parser); -+ return 0; -+} -+ -+static void __exit ofpart_parser_exit(void) -+{ -+ deregister_mtd_parser(&ofpart_parser); -+ deregister_mtd_parser(&ofoldpart_parser); -+} -+ -+module_init(ofpart_parser_init); -+module_exit(ofpart_parser_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_DESCRIPTION("Parser for MTD partitioning information in device tree"); -+MODULE_AUTHOR("Vitaly Wool, David Gibson"); -+/* -+ * When MTD core cannot find the requested parser, it tries to load the module -+ * with the same name. Since we provide the ofoldpart parser, we should have -+ * the corresponding alias. -+ */ -+MODULE_ALIAS("fixed-partitions"); -+MODULE_ALIAS("ofoldpart"); diff --git a/target/linux/generic/backport-5.10/404-v5.13-mtd-parsers-ofpart-limit-parsing-of-deprecated-DT-sy.patch b/target/linux/generic/backport-5.10/404-v5.13-mtd-parsers-ofpart-limit-parsing-of-deprecated-DT-sy.patch deleted file mode 100644 index 55a91d7680..0000000000 --- a/target/linux/generic/backport-5.10/404-v5.13-mtd-parsers-ofpart-limit-parsing-of-deprecated-DT-sy.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 2d751203aacf86a1b301a188d8551c7da91043ab Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Tue, 2 Mar 2021 20:00:12 +0100 -Subject: [PATCH] mtd: parsers: ofpart: limit parsing of deprecated DT syntax -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -For backward compatibility ofpart still supports the old syntax like: -spi-flash@0 { - compatible = "jedec,spi-nor"; - reg = <0x0>; - - partition@0 { - label = "bootloader"; - reg = <0x0 0x100000>; - }; -}; -(without "partitions" subnode). - -There is no reason however to support nested partitions without a clear -"compatible" string like: -partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@0 { - label = "bootloader"; - reg = <0x0 0x100000>; - - partition@0 { - label = "config"; - reg = <0x80000 0x80000>; - }; - }; -}; -(we never officially supported or documented that). - -Make sure ofpart doesn't attempt to parse above. - -Cc: Ansuel Smith -Signed-off-by: Rafał Miłecki -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20210302190012.1255-1-zajec5@gmail.com ---- - drivers/mtd/parsers/ofpart_core.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - ---- a/drivers/mtd/parsers/ofpart_core.c -+++ b/drivers/mtd/parsers/ofpart_core.c -@@ -53,7 +53,7 @@ static int parse_fixed_partitions(struct - return 0; - - ofpart_node = of_get_child_by_name(mtd_node, "partitions"); -- if (!ofpart_node) { -+ if (!ofpart_node && !master->parent) { - /* - * We might get here even when ofpart isn't used at all (e.g., - * when using another parser), so don't be louder than -@@ -64,6 +64,8 @@ static int parse_fixed_partitions(struct - ofpart_node = mtd_node; - dedicated = false; - } -+ if (!ofpart_node) -+ return 0; - - of_id = of_match_node(parse_ofpart_match_table, ofpart_node); - if (dedicated && !of_id) { diff --git a/target/linux/generic/backport-5.10/405-v5.13-mtd-parsers-ofpart-make-symbol-bcm4908_partitions_qu.patch b/target/linux/generic/backport-5.10/405-v5.13-mtd-parsers-ofpart-make-symbol-bcm4908_partitions_qu.patch deleted file mode 100644 index f1b778a6e1..0000000000 --- a/target/linux/generic/backport-5.10/405-v5.13-mtd-parsers-ofpart-make-symbol-bcm4908_partitions_qu.patch +++ /dev/null @@ -1,34 +0,0 @@ -From b87b6d2d6f540e29c3f98e1572d64e560d73d6c1 Mon Sep 17 00:00:00 2001 -From: Wei Yongjun -Date: Thu, 4 Mar 2021 06:46:00 +0000 -Subject: [PATCH] mtd: parsers: ofpart: make symbol 'bcm4908_partitions_quirks' - static - -The sparse tool complains as follows: - -drivers/mtd/parsers/ofpart_core.c:25:32: warning: - symbol 'bcm4908_partitions_quirks' was not declared. Should it be static? - -This symbol is not used outside of ofpart_core.c, so this -commit marks it static. - -Fixes: 457da931b608 ("mtd: parsers: ofpart: support BCM4908 fixed partitions") -Reported-by: Hulk Robot -Signed-off-by: Wei Yongjun -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20210304064600.3279138-1-weiyongjun1@huawei.com ---- - drivers/mtd/parsers/ofpart_core.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/mtd/parsers/ofpart_core.c -+++ b/drivers/mtd/parsers/ofpart_core.c -@@ -22,7 +22,7 @@ struct fixed_partitions_quirks { - int (*post_parse)(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts); - }; - --struct fixed_partitions_quirks bcm4908_partitions_quirks = { -+static struct fixed_partitions_quirks bcm4908_partitions_quirks = { - .post_parse = bcm4908_partitions_post_parse, - }; - diff --git a/target/linux/generic/backport-5.10/406-v5.13-0001-mtd-core-add-nvmem-cells-compatible-to-parse-mtd-as-.patch b/target/linux/generic/backport-5.10/406-v5.13-0001-mtd-core-add-nvmem-cells-compatible-to-parse-mtd-as-.patch deleted file mode 100644 index 28335cb71f..0000000000 --- a/target/linux/generic/backport-5.10/406-v5.13-0001-mtd-core-add-nvmem-cells-compatible-to-parse-mtd-as-.patch +++ /dev/null @@ -1,38 +0,0 @@ -From a5d83d6e2bc747b13f347962d4b335d70b23559b Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 12 Mar 2021 07:28:19 +0100 -Subject: [PATCH] mtd: core: add nvmem-cells compatible to parse mtd as nvmem - cells -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Partitions that contains the nvmem-cells compatible will register -their direct subonodes as nvmem cells and the node will be treated as a -nvmem provider. - -Signed-off-by: Ansuel Smith -Tested-by: Rafał Miłecki ---- - drivers/mtd/mtdcore.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -531,6 +531,7 @@ static int mtd_nvmem_reg_read(void *priv - - static int mtd_nvmem_add(struct mtd_info *mtd) - { -+ struct device_node *node = mtd_get_of_node(mtd); - struct nvmem_config config = {}; - - config.id = -1; -@@ -543,7 +544,7 @@ static int mtd_nvmem_add(struct mtd_info - config.stride = 1; - config.read_only = true; - config.root_only = true; -- config.no_of_node = true; -+ config.no_of_node = !of_device_is_compatible(node, "nvmem-cells"); - config.priv = mtd; - - mtd->nvmem = nvmem_register(&config); diff --git a/target/linux/generic/backport-5.10/406-v5.13-0002-dt-bindings-nvmem-drop-nodename-restriction.patch b/target/linux/generic/backport-5.10/406-v5.13-0002-dt-bindings-nvmem-drop-nodename-restriction.patch deleted file mode 100644 index 14ea3f6b8c..0000000000 --- a/target/linux/generic/backport-5.10/406-v5.13-0002-dt-bindings-nvmem-drop-nodename-restriction.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 42645976c3289b03a12f1bd2bc131fd98fc27170 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 12 Mar 2021 07:28:20 +0100 -Subject: [PATCH] devicetree: nvmem: nvmem: drop $nodename restriction - -Drop $nodename restriction as now mtd partition can also be used as -nvmem provider. - -Signed-off-by: Ansuel Smith ---- - Documentation/devicetree/bindings/nvmem/nvmem.yaml | 3 --- - 1 file changed, 3 deletions(-) - ---- a/Documentation/devicetree/bindings/nvmem/nvmem.yaml -+++ b/Documentation/devicetree/bindings/nvmem/nvmem.yaml -@@ -20,9 +20,6 @@ description: | - storage device. - - properties: -- $nodename: -- pattern: "^(eeprom|efuse|nvram)(@.*|-[0-9a-f])*$" -- - "#address-cells": - const: 1 - diff --git a/target/linux/generic/backport-5.10/406-v5.13-0003-dt-bindings-mtd-Document-use-of-nvmem-cells-compatib.patch b/target/linux/generic/backport-5.10/406-v5.13-0003-dt-bindings-mtd-Document-use-of-nvmem-cells-compatib.patch deleted file mode 100644 index 0eb4c637cf..0000000000 --- a/target/linux/generic/backport-5.10/406-v5.13-0003-dt-bindings-mtd-Document-use-of-nvmem-cells-compatib.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 377aa0135dc8489312edd3184d143ce3a89ff7ee Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 12 Mar 2021 07:28:21 +0100 -Subject: [PATCH] dt-bindings: mtd: Document use of nvmem-cells compatible - -Document nvmem-cells compatible used to treat mtd partitions as a -nvmem provider. - -Signed-off-by: Ansuel Smith -Reviewed-by: Rob Herring ---- - .../bindings/mtd/partitions/nvmem-cells.yaml | 99 +++++++++++++++++++ - 1 file changed, 99 insertions(+) - create mode 100644 Documentation/devicetree/bindings/mtd/partitions/nvmem-cells.yaml - ---- /dev/null -+++ b/Documentation/devicetree/bindings/mtd/partitions/nvmem-cells.yaml -@@ -0,0 +1,99 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/mtd/partitions/nvmem-cells.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Nvmem cells -+ -+description: | -+ Any partition containing the compatible "nvmem-cells" will register as a -+ nvmem provider. -+ Each direct subnodes represents a nvmem cell following the nvmem binding. -+ Nvmem binding to declare nvmem-cells can be found in: -+ Documentation/devicetree/bindings/nvmem/nvmem.yaml -+ -+maintainers: -+ - Ansuel Smith -+ -+allOf: -+ - $ref: /schemas/nvmem/nvmem.yaml# -+ -+properties: -+ compatible: -+ const: nvmem-cells -+ -+required: -+ - compatible -+ -+additionalProperties: true -+ -+examples: -+ - | -+ partitions { -+ compatible = "fixed-partitions"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ /* ... */ -+ -+ }; -+ art: art@1200000 { -+ compatible = "nvmem-cells"; -+ reg = <0x1200000 0x0140000>; -+ label = "art"; -+ read-only; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ macaddr_gmac1: macaddr_gmac1@0 { -+ reg = <0x0 0x6>; -+ }; -+ -+ macaddr_gmac2: macaddr_gmac2@6 { -+ reg = <0x6 0x6>; -+ }; -+ -+ pre_cal_24g: pre_cal_24g@1000 { -+ reg = <0x1000 0x2f20>; -+ }; -+ -+ pre_cal_5g: pre_cal_5g@5000{ -+ reg = <0x5000 0x2f20>; -+ }; -+ }; -+ - | -+ partitions { -+ compatible = "fixed-partitions"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ partition@0 { -+ label = "bootloader"; -+ reg = <0x000000 0x100000>; -+ read-only; -+ }; -+ -+ firmware@100000 { -+ compatible = "brcm,trx"; -+ label = "firmware"; -+ reg = <0x100000 0xe00000>; -+ }; -+ -+ calibration@f00000 { -+ compatible = "nvmem-cells"; -+ label = "calibration"; -+ reg = <0xf00000 0x100000>; -+ ranges = <0 0xf00000 0x100000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ wifi0@0 { -+ reg = <0x000000 0x080000>; -+ }; -+ -+ wifi1@80000 { -+ reg = <0x080000 0x080000>; -+ }; -+ }; -+ }; diff --git a/target/linux/generic/backport-5.10/407-v5.13-0001-dt-bindings-mtd-add-binding-for-Linksys-Northstar-pa.patch b/target/linux/generic/backport-5.10/407-v5.13-0001-dt-bindings-mtd-add-binding-for-Linksys-Northstar-pa.patch deleted file mode 100644 index 35a4afd67b..0000000000 --- a/target/linux/generic/backport-5.10/407-v5.13-0001-dt-bindings-mtd-add-binding-for-Linksys-Northstar-pa.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 2fa7294175c76e1ec568aa75c1891fd908728c8d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Fri, 12 Mar 2021 14:49:18 +0100 -Subject: [PATCH] dt-bindings: mtd: add binding for Linksys Northstar - partitions -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Linksys on Broadcom Northstar devices uses fixed flash layout with -multiple firmware partitions. - -Signed-off-by: Rafał Miłecki -Reviewed-by: Rob Herring -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20210312134919.7767-1-zajec5@gmail.com ---- - .../mtd/partitions/linksys,ns-partitions.yaml | 74 +++++++++++++++++++ - 1 file changed, 74 insertions(+) - create mode 100644 Documentation/devicetree/bindings/mtd/partitions/linksys,ns-partitions.yaml - ---- /dev/null -+++ b/Documentation/devicetree/bindings/mtd/partitions/linksys,ns-partitions.yaml -@@ -0,0 +1,74 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/mtd/partitions/linksys,ns-partitions.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Linksys Northstar partitioning -+ -+description: | -+ Linksys devices based on Broadcom Northstar architecture often use two -+ firmware partitions. One is used for regular booting, the other is treated as -+ fallback. -+ -+ This binding allows defining all fixed partitions and marking those containing -+ firmware. System can use that information e.g. for booting or flashing -+ purposes. -+ -+maintainers: -+ - Rafał Miłecki -+ -+properties: -+ compatible: -+ const: linksys,ns-partitions -+ -+ "#address-cells": -+ enum: [ 1, 2 ] -+ -+ "#size-cells": -+ enum: [ 1, 2 ] -+ -+patternProperties: -+ "^partition@[0-9a-f]+$": -+ $ref: "partition.yaml#" -+ properties: -+ compatible: -+ items: -+ - const: linksys,ns-firmware -+ - const: brcm,trx -+ unevaluatedProperties: false -+ -+required: -+ - "#address-cells" -+ - "#size-cells" -+ -+additionalProperties: false -+ -+examples: -+ - | -+ partitions { -+ compatible = "linksys,ns-partitions"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ partition@0 { -+ label = "boot"; -+ reg = <0x0 0x100000>; -+ read-only; -+ }; -+ -+ partition@100000 { -+ label = "nvram"; -+ reg = <0x100000 0x100000>; -+ }; -+ -+ partition@200000 { -+ compatible = "linksys,ns-firmware", "brcm,trx"; -+ reg = <0x200000 0xf00000>; -+ }; -+ -+ partition@1100000 { -+ compatible = "linksys,ns-firmware", "brcm,trx"; -+ reg = <0x1100000 0xf00000>; -+ }; -+ }; diff --git a/target/linux/generic/backport-5.10/407-v5.13-0002-mtd-parsers-ofpart-support-Linksys-Northstar-partiti.patch b/target/linux/generic/backport-5.10/407-v5.13-0002-mtd-parsers-ofpart-support-Linksys-Northstar-partiti.patch deleted file mode 100644 index f317889785..0000000000 --- a/target/linux/generic/backport-5.10/407-v5.13-0002-mtd-parsers-ofpart-support-Linksys-Northstar-partiti.patch +++ /dev/null @@ -1,156 +0,0 @@ -From 7134a2d026d942210b4d26d6059c9d979ca7866e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Fri, 12 Mar 2021 14:49:19 +0100 -Subject: [PATCH] mtd: parsers: ofpart: support Linksys Northstar partitions -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This allows extending ofpart parser with support for Linksys Northstar -devices. That support uses recently added quirks mechanism. - -Signed-off-by: Rafał Miłecki -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20210312134919.7767-2-zajec5@gmail.com ---- - drivers/mtd/parsers/Kconfig | 10 +++++ - drivers/mtd/parsers/Makefile | 1 + - drivers/mtd/parsers/ofpart_core.c | 6 +++ - drivers/mtd/parsers/ofpart_linksys_ns.c | 50 +++++++++++++++++++++++++ - drivers/mtd/parsers/ofpart_linksys_ns.h | 18 +++++++++ - 5 files changed, 85 insertions(+) - create mode 100644 drivers/mtd/parsers/ofpart_linksys_ns.c - create mode 100644 drivers/mtd/parsers/ofpart_linksys_ns.h - ---- a/drivers/mtd/parsers/Kconfig -+++ b/drivers/mtd/parsers/Kconfig -@@ -76,6 +76,16 @@ config MTD_OF_PARTS_BCM4908 - that can have multiple "firmware" partitions. It takes care of - finding currently used one and backup ones. - -+config MTD_OF_PARTS_LINKSYS_NS -+ bool "Linksys Northstar partitioning support" -+ depends on MTD_OF_PARTS && (ARCH_BCM_5301X || ARCH_BCM4908 || COMPILE_TEST) -+ default ARCH_BCM_5301X -+ help -+ This provides partitions parser for Linksys devices based on Broadcom -+ Northstar architecture. Linksys commonly uses fixed flash layout with -+ two "firmware" partitions. Currently used firmware has to be detected -+ using CFE environment variable. -+ - config MTD_PARSER_IMAGETAG - tristate "Parser for BCM963XX Image Tag format partitions" - depends on BCM63XX || BMIPS_GENERIC || COMPILE_TEST ---- a/drivers/mtd/parsers/Makefile -+++ b/drivers/mtd/parsers/Makefile -@@ -6,6 +6,7 @@ obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdl - obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o - ofpart-y += ofpart_core.o - ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += ofpart_bcm4908.o -+ofpart-$(CONFIG_MTD_OF_PARTS_LINKSYS_NS)+= ofpart_linksys_ns.o - obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o - obj-$(CONFIG_MTD_AFS_PARTS) += afs.o - obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o ---- a/drivers/mtd/parsers/ofpart_core.c -+++ b/drivers/mtd/parsers/ofpart_core.c -@@ -17,6 +17,7 @@ - #include - - #include "ofpart_bcm4908.h" -+#include "ofpart_linksys_ns.h" - - struct fixed_partitions_quirks { - int (*post_parse)(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts); -@@ -26,6 +27,10 @@ static struct fixed_partitions_quirks bc - .post_parse = bcm4908_partitions_post_parse, - }; - -+static struct fixed_partitions_quirks linksys_ns_partitions_quirks = { -+ .post_parse = linksys_ns_partitions_post_parse, -+}; -+ - static const struct of_device_id parse_ofpart_match_table[]; - - static bool node_has_compatible(struct device_node *pp) -@@ -167,6 +172,7 @@ static const struct of_device_id parse_o - { .compatible = "fixed-partitions" }, - /* Customized */ - { .compatible = "brcm,bcm4908-partitions", .data = &bcm4908_partitions_quirks, }, -+ { .compatible = "linksys,ns-partitions", .data = &linksys_ns_partitions_quirks, }, - {}, - }; - MODULE_DEVICE_TABLE(of, parse_ofpart_match_table); ---- /dev/null -+++ b/drivers/mtd/parsers/ofpart_linksys_ns.c -@@ -0,0 +1,50 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2021 Rafał Miłecki -+ */ -+ -+#include -+#include -+#include -+ -+#include "ofpart_linksys_ns.h" -+ -+#define NVRAM_BOOT_PART "bootpartition" -+ -+static int ofpart_linksys_ns_bootpartition(void) -+{ -+ char buf[4]; -+ int bootpartition; -+ -+ /* Check CFE environment variable */ -+ if (bcm47xx_nvram_getenv(NVRAM_BOOT_PART, buf, sizeof(buf)) > 0) { -+ if (!kstrtoint(buf, 0, &bootpartition)) -+ return bootpartition; -+ pr_warn("Failed to parse %s value \"%s\"\n", NVRAM_BOOT_PART, -+ buf); -+ } else { -+ pr_warn("Failed to get NVRAM \"%s\"\n", NVRAM_BOOT_PART); -+ } -+ -+ return 0; -+} -+ -+int linksys_ns_partitions_post_parse(struct mtd_info *mtd, -+ struct mtd_partition *parts, -+ int nr_parts) -+{ -+ int bootpartition = ofpart_linksys_ns_bootpartition(); -+ int trx_idx = 0; -+ int i; -+ -+ for (i = 0; i < nr_parts; i++) { -+ if (of_device_is_compatible(parts[i].of_node, "linksys,ns-firmware")) { -+ if (trx_idx++ == bootpartition) -+ parts[i].name = "firmware"; -+ else -+ parts[i].name = "backup"; -+ } -+ } -+ -+ return 0; -+} ---- /dev/null -+++ b/drivers/mtd/parsers/ofpart_linksys_ns.h -@@ -0,0 +1,18 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+#ifndef __OFPART_LINKSYS_NS_H -+#define __OFPART_LINKSYS_NS_H -+ -+#ifdef CONFIG_MTD_OF_PARTS_LINKSYS_NS -+int linksys_ns_partitions_post_parse(struct mtd_info *mtd, -+ struct mtd_partition *parts, -+ int nr_parts); -+#else -+static inline int linksys_ns_partitions_post_parse(struct mtd_info *mtd, -+ struct mtd_partition *parts, -+ int nr_parts) -+{ -+ return -EOPNOTSUPP; -+} -+#endif -+ -+#endif diff --git a/target/linux/generic/backport-5.10/408-v5.13-mtd-cfi_cmdset_0002-Disable-buffered-writes-for-AMD.patch b/target/linux/generic/backport-5.10/408-v5.13-mtd-cfi_cmdset_0002-Disable-buffered-writes-for-AMD.patch deleted file mode 100644 index 8aba0cab22..0000000000 --- a/target/linux/generic/backport-5.10/408-v5.13-mtd-cfi_cmdset_0002-Disable-buffered-writes-for-AMD.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 7e4404113686868858a34210c28ae122e967aa64 Mon Sep 17 00:00:00 2001 -From: Mauri Sandberg -Date: Tue, 9 Mar 2021 19:48:59 +0200 -Subject: [PATCH] mtd: cfi_cmdset_0002: Disable buffered writes for AMD chip - 0x2201 - -Buffer writes do not work with AMD chip 0x2201. The chip in question -is a AMD/Spansion/Cypress Semiconductor S29GL256N and datasheet [1] -talks about writing buffers being possible. While waiting for a neater -solution resort to writing word-sized chunks only. - -Without the patch kernel logs will be flooded with entries like below: - -jffs2_scan_eraseblock(): End of filesystem marker found at 0x0 -jffs2_build_filesystem(): unlocking the mtd device... -done. -jffs2_build_filesystem(): erasing all blocks after the end marker... -MTD do_write_buffer_wait(): software timeout, address:0x01ec000a. -jffs2: Write clean marker to block at 0x01920000 failed: -5 -MTD do_write_buffer_wait(): software timeout, address:0x01e2000a. -jffs2: Write clean marker to block at 0x01880000 failed: -5 -MTD do_write_buffer_wait(): software timeout, address:0x01e0000a. -jffs2: Write clean marker to block at 0x01860000 failed: -5 -MTD do_write_buffer_wait(): software timeout, address:0x01dc000a. -jffs2: Write clean marker to block at 0x01820000 failed: -5 -MTD do_write_buffer_wait(): software timeout, address:0x01da000a. -jffs2: Write clean marker to block at 0x01800000 failed: -5 -... - -Tested on a Buffalo wzr-hp-g300nh running kernel 5.10.16. - -[1] https://www.cypress.com/file/219941/download -or https://datasheetspdf.com/pdf-file/565708/SPANSION/S29GL256N/1 - -Signed-off-by: Mauri Sandberg -Signed-off-by: Vignesh Raghavendra -Link: https://lore.kernel.org/r/20210309174859.362060-1-sandberg@mailfence.com ---- - drivers/mtd/chips/cfi_cmdset_0002.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/drivers/mtd/chips/cfi_cmdset_0002.c -+++ b/drivers/mtd/chips/cfi_cmdset_0002.c -@@ -276,6 +276,10 @@ static void fixup_use_write_buffers(stru - { - struct map_info *map = mtd->priv; - struct cfi_private *cfi = map->fldrv_priv; -+ -+ if (cfi->mfr == CFI_MFR_AMD && cfi->id == 0x2201) -+ return; -+ - if (cfi->cfiq->BufWriteTimeoutTyp) { - pr_debug("Using buffer write method\n"); - mtd->_write = cfi_amdstd_write_buffers; diff --git a/target/linux/generic/backport-5.10/409-v5.14-0001-dt-bindings-mtd-brcm-trx-Add-brcm-trx-magic.patch b/target/linux/generic/backport-5.10/409-v5.14-0001-dt-bindings-mtd-brcm-trx-Add-brcm-trx-magic.patch deleted file mode 100644 index 1f34652141..0000000000 --- a/target/linux/generic/backport-5.10/409-v5.14-0001-dt-bindings-mtd-brcm-trx-Add-brcm-trx-magic.patch +++ /dev/null @@ -1,32 +0,0 @@ -From a4d82940ff85a7e307953dfa715f65d5ab487e10 Mon Sep 17 00:00:00 2001 -From: Hauke Mehrtens -Date: Sun, 18 Apr 2021 23:46:14 +0200 -Subject: dt-bindings: mtd: brcm,trx: Add brcm,trx-magic - -This adds the description of an additional property which allows to -specify a custom partition parser magic to detect a trx partition. -Buffalo has multiple device which are using the trx format, but with -different magic values. - -Signed-off-by: Hauke Mehrtens -Acked-by: Rob Herring -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20210418214616.239574-2-hauke@hauke-m.de ---- - .../devicetree/bindings/mtd/partitions/brcm,trx.txt | 5 +++++ - 1 file changed, 5 insertions(+) - ---- a/Documentation/devicetree/bindings/mtd/partitions/brcm,trx.txt -+++ b/Documentation/devicetree/bindings/mtd/partitions/brcm,trx.txt -@@ -28,6 +28,11 @@ detected by a software parsing TRX heade - Required properties: - - compatible : (required) must be "brcm,trx" - -+Optional properties: -+ -+- brcm,trx-magic: TRX magic, if it is different from the default magic -+ 0x30524448 as a u32. -+ - Example: - - flash@0 { diff --git a/target/linux/generic/backport-5.10/409-v5.14-0002-mtd-parsers-trx-Allow-to-specify-brcm-trx-magic-in-D.patch b/target/linux/generic/backport-5.10/409-v5.14-0002-mtd-parsers-trx-Allow-to-specify-brcm-trx-magic-in-D.patch deleted file mode 100644 index de2d914852..0000000000 --- a/target/linux/generic/backport-5.10/409-v5.14-0002-mtd-parsers-trx-Allow-to-specify-brcm-trx-magic-in-D.patch +++ /dev/null @@ -1,50 +0,0 @@ -From d7f7e04f8b67571a4bf5a0dcd4f9da4214f5262c Mon Sep 17 00:00:00 2001 -From: Hauke Mehrtens -Date: Sun, 18 Apr 2021 23:46:15 +0200 -Subject: mtd: parsers: trx: Allow to specify brcm, trx-magic in DT - -Buffalo uses a different TRX magic for every device, to be able to use -this trx parser, make it possible to specify the TRX magic in device -tree. If no TRX magic is specified in device tree, the standard value -will be used. This value should only be specified if a vendor chooses to -use a non standard TRX magic. - -Signed-off-by: Hauke Mehrtens -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20210418214616.239574-3-hauke@hauke-m.de ---- - drivers/mtd/parsers/parser_trx.c | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - ---- a/drivers/mtd/parsers/parser_trx.c -+++ b/drivers/mtd/parsers/parser_trx.c -@@ -51,13 +51,20 @@ static int parser_trx_parse(struct mtd_i - const struct mtd_partition **pparts, - struct mtd_part_parser_data *data) - { -+ struct device_node *np = mtd_get_of_node(mtd); - struct mtd_partition *parts; - struct mtd_partition *part; - struct trx_header trx; - size_t bytes_read; - uint8_t curr_part = 0, i = 0; -+ uint32_t trx_magic = TRX_MAGIC; - int err; - -+ /* Get different magic from device tree if specified */ -+ err = of_property_read_u32(np, "brcm,trx-magic", &trx_magic); -+ if (err != 0 && err != -EINVAL) -+ pr_err("failed to parse \"brcm,trx-magic\" DT attribute, using default: %d\n", err); -+ - parts = kcalloc(TRX_PARSER_MAX_PARTS, sizeof(struct mtd_partition), - GFP_KERNEL); - if (!parts) -@@ -70,7 +77,7 @@ static int parser_trx_parse(struct mtd_i - return err; - } - -- if (trx.magic != TRX_MAGIC) { -+ if (trx.magic != trx_magic) { - kfree(parts); - return -ENOENT; - } diff --git a/target/linux/generic/backport-5.10/409-v5.14-0003-mtd-parsers-trx-Allow-to-use-TRX-parser-on-Mediatek-.patch b/target/linux/generic/backport-5.10/409-v5.14-0003-mtd-parsers-trx-Allow-to-use-TRX-parser-on-Mediatek-.patch deleted file mode 100644 index faac535270..0000000000 --- a/target/linux/generic/backport-5.10/409-v5.14-0003-mtd-parsers-trx-Allow-to-use-TRX-parser-on-Mediatek-.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 81bb218c829246962a6327c64eec18ddcc049936 Mon Sep 17 00:00:00 2001 -From: Hauke Mehrtens -Date: Sun, 18 Apr 2021 23:46:16 +0200 -Subject: mtd: parsers: trx: Allow to use TRX parser on Mediatek SoCs - -Buffalo uses the TRX partition format also on Mediatek MT7622 SoCs. - -Signed-off-by: Hauke Mehrtens -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20210418214616.239574-4-hauke@hauke-m.de ---- - drivers/mtd/parsers/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/mtd/parsers/Kconfig -+++ b/drivers/mtd/parsers/Kconfig -@@ -115,7 +115,7 @@ config MTD_AFS_PARTS - - config MTD_PARSER_TRX - tristate "Parser for TRX format partitions" -- depends on MTD && (BCM47XX || ARCH_BCM_5301X || COMPILE_TEST) -+ depends on MTD && (BCM47XX || ARCH_BCM_5301X || ARCH_MEDIATEK || COMPILE_TEST) - help - TRX is a firmware format used by Broadcom on their devices. It - may contain up to 3/4 partitions (depending on the version). diff --git a/target/linux/generic/backport-5.10/412-v5.19-mtd-call-of_platform_populate-for-MTD-partitions.patch b/target/linux/generic/backport-5.10/412-v5.19-mtd-call-of_platform_populate-for-MTD-partitions.patch deleted file mode 100644 index aaeb087c89..0000000000 --- a/target/linux/generic/backport-5.10/412-v5.19-mtd-call-of_platform_populate-for-MTD-partitions.patch +++ /dev/null @@ -1,72 +0,0 @@ -From bcdf0315a61a29eb753a607d3a85a4032de72d94 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Tue, 10 May 2022 15:12:59 +0200 -Subject: [PATCH] mtd: call of_platform_populate() for MTD partitions -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Until this change MTD subsystem supported handling partitions only with -MTD partitions parsers. That's a specific / limited API designed around -partitions. - -Some MTD partitions may however require different handling. They may -contain specific data that needs to be parsed and somehow extracted. For -that purpose MTD subsystem should allow binding of standard platform -drivers. - -An example can be U-Boot (sub)partition with environment variables. -There exist a "u-boot,env" DT binding for MTD (sub)partition that -requires an NVMEM driver. - -Ref: 5db1c2dbc04c ("dt-bindings: nvmem: add U-Boot environment variables binding") -Signed-off-by: Rafał Miłecki -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20220510131259.555-1-zajec5@gmail.com ---- - drivers/mtd/mtdpart.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - ---- a/drivers/mtd/mtdpart.c -+++ b/drivers/mtd/mtdpart.c -@@ -17,6 +17,7 @@ - #include - #include - #include -+#include - - #include "mtdcore.h" - -@@ -578,10 +579,16 @@ static int mtd_part_of_parse(struct mtd_ - struct mtd_part_parser *parser; - struct device_node *np; - struct property *prop; -+ struct device *dev; - const char *compat; - const char *fixed = "fixed-partitions"; - int ret, err = 0; - -+ dev = &master->dev; -+ /* Use parent device (controller) if the top level MTD is not registered */ -+ if (!IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER) && !mtd_is_partition(master)) -+ dev = master->dev.parent; -+ - np = mtd_get_of_node(master); - if (mtd_is_partition(master)) - of_node_get(np); -@@ -594,6 +601,7 @@ static int mtd_part_of_parse(struct mtd_ - continue; - ret = mtd_part_do_parse(parser, master, pparts, NULL); - if (ret > 0) { -+ of_platform_populate(np, NULL, NULL, dev); - of_node_put(np); - return ret; - } -@@ -601,6 +609,7 @@ static int mtd_part_of_parse(struct mtd_ - if (ret < 0 && !err) - err = ret; - } -+ of_platform_populate(np, NULL, NULL, dev); - of_node_put(np); - - /* diff --git a/target/linux/generic/backport-5.10/413-v6.0-mtd-next-mtd-core-introduce-of-support-for-dynamic-partitions.patch b/target/linux/generic/backport-5.10/413-v6.0-mtd-next-mtd-core-introduce-of-support-for-dynamic-partitions.patch deleted file mode 100644 index e71098d563..0000000000 --- a/target/linux/generic/backport-5.10/413-v6.0-mtd-next-mtd-core-introduce-of-support-for-dynamic-partitions.patch +++ /dev/null @@ -1,106 +0,0 @@ -From ad9b10d1eaada169bd764abcab58f08538877e26 Mon Sep 17 00:00:00 2001 -From: Christian Marangi -Date: Wed, 22 Jun 2022 03:06:28 +0200 -Subject: mtd: core: introduce of support for dynamic partitions - -We have many parser that register mtd partitions at runtime. One example -is the cmdlinepart or the smem-part parser where the compatible is defined -in the dts and the partitions gets detected and registered by the -parser. This is problematic for the NVMEM subsystem that requires an OF -node to detect NVMEM cells. - -To fix this problem, introduce an additional logic that will try to -assign an OF node to the MTD if declared. - -On MTD addition, it will be checked if the MTD has an OF node and if -not declared will check if a partition with the same label / node name is -declared in DTS. If an exact match is found, the partition dynamically -allocated by the parser will have a connected OF node. - -The NVMEM subsystem will detect the OF node and register any NVMEM cells -declared statically in the DTS. - -Signed-off-by: Christian Marangi -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20220622010628.30414-4-ansuelsmth@gmail.com ---- - drivers/mtd/mtdcore.c | 61 +++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 61 insertions(+) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -561,6 +561,66 @@ static int mtd_nvmem_add(struct mtd_info - return 0; - } - -+static void mtd_check_of_node(struct mtd_info *mtd) -+{ -+ struct device_node *partitions, *parent_dn, *mtd_dn = NULL; -+ const char *pname, *prefix = "partition-"; -+ int plen, mtd_name_len, offset, prefix_len; -+ struct mtd_info *parent; -+ bool found = false; -+ -+ /* Check if MTD already has a device node */ -+ if (dev_of_node(&mtd->dev)) -+ return; -+ -+ /* Check if a partitions node exist */ -+ parent = mtd->parent; -+ parent_dn = dev_of_node(&parent->dev); -+ if (!parent_dn) -+ return; -+ -+ partitions = of_get_child_by_name(parent_dn, "partitions"); -+ if (!partitions) -+ goto exit_parent; -+ -+ prefix_len = strlen(prefix); -+ mtd_name_len = strlen(mtd->name); -+ -+ /* Search if a partition is defined with the same name */ -+ for_each_child_of_node(partitions, mtd_dn) { -+ offset = 0; -+ -+ /* Skip partition with no/wrong prefix */ -+ if (!of_node_name_prefix(mtd_dn, "partition-")) -+ continue; -+ -+ /* Label have priority. Check that first */ -+ if (of_property_read_string(mtd_dn, "label", &pname)) { -+ of_property_read_string(mtd_dn, "name", &pname); -+ offset = prefix_len; -+ } -+ -+ plen = strlen(pname) - offset; -+ if (plen == mtd_name_len && -+ !strncmp(mtd->name, pname + offset, plen)) { -+ found = true; -+ break; -+ } -+ } -+ -+ if (!found) -+ goto exit_partitions; -+ -+ /* Set of_node only for nvmem */ -+ if (of_device_is_compatible(mtd_dn, "nvmem-cells")) -+ mtd_set_of_node(mtd, mtd_dn); -+ -+exit_partitions: -+ of_node_put(partitions); -+exit_parent: -+ of_node_put(parent_dn); -+} -+ - /** - * add_mtd_device - register an MTD device - * @mtd: pointer to new MTD device info structure -@@ -666,6 +726,7 @@ int add_mtd_device(struct mtd_info *mtd) - mtd->dev.devt = MTD_DEVT(i); - dev_set_name(&mtd->dev, "mtd%d", i); - dev_set_drvdata(&mtd->dev, mtd); -+ mtd_check_of_node(mtd); - of_node_get(mtd_get_of_node(mtd)); - error = device_register(&mtd->dev); - if (error) { diff --git a/target/linux/generic/backport-5.10/414-v6.1-mtd-allow-getting-MTD-device-associated-with-a-speci.patch b/target/linux/generic/backport-5.10/414-v6.1-mtd-allow-getting-MTD-device-associated-with-a-speci.patch deleted file mode 100644 index 968279185e..0000000000 --- a/target/linux/generic/backport-5.10/414-v6.1-mtd-allow-getting-MTD-device-associated-with-a-speci.patch +++ /dev/null @@ -1,72 +0,0 @@ -From b0321721be50b80c03a51866a94fde4f94690e18 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Wed, 15 Jun 2022 21:42:59 +0200 -Subject: [PATCH] mtd: allow getting MTD device associated with a specific DT - node -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -MTD subsystem API allows interacting with MTD devices (e.g. reading, -writing, handling bad blocks). So far a random driver could get MTD -device only by its name (get_mtd_device_nm()). This change allows -getting them also by a DT node. - -This API is required for drivers handling DT defined MTD partitions in a -specific way (e.g. U-Boot (sub)partition with environment variables). - -Signed-off-by: Rafał Miłecki -Acked-by: Miquel Raynal -Signed-off-by: Srinivas Kandagatla ---- - drivers/mtd/mtdcore.c | 28 ++++++++++++++++++++++++++++ - include/linux/mtd/mtd.h | 1 + - 2 files changed, 29 insertions(+) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -1072,6 +1072,34 @@ int __get_mtd_device(struct mtd_info *mt - EXPORT_SYMBOL_GPL(__get_mtd_device); - - /** -+ * of_get_mtd_device_by_node - obtain an MTD device associated with a given node -+ * -+ * @np: device tree node -+ */ -+struct mtd_info *of_get_mtd_device_by_node(struct device_node *np) -+{ -+ struct mtd_info *mtd = NULL; -+ struct mtd_info *tmp; -+ int err; -+ -+ mutex_lock(&mtd_table_mutex); -+ -+ err = -EPROBE_DEFER; -+ mtd_for_each_device(tmp) { -+ if (mtd_get_of_node(tmp) == np) { -+ mtd = tmp; -+ err = __get_mtd_device(mtd); -+ break; -+ } -+ } -+ -+ mutex_unlock(&mtd_table_mutex); -+ -+ return err ? ERR_PTR(err) : mtd; -+} -+EXPORT_SYMBOL_GPL(of_get_mtd_device_by_node); -+ -+/** - * get_mtd_device_nm - obtain a validated handle for an MTD device by - * device name - * @name: MTD device name to open ---- a/include/linux/mtd/mtd.h -+++ b/include/linux/mtd/mtd.h -@@ -675,6 +675,7 @@ extern int mtd_device_unregister(struct - extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num); - extern int __get_mtd_device(struct mtd_info *mtd); - extern void __put_mtd_device(struct mtd_info *mtd); -+extern struct mtd_info *of_get_mtd_device_by_node(struct device_node *np); - extern struct mtd_info *get_mtd_device_nm(const char *name); - extern void put_mtd_device(struct mtd_info *mtd); - diff --git a/target/linux/generic/backport-5.10/415-v6.0-mtd-core-check-partition-before-dereference.patch b/target/linux/generic/backport-5.10/415-v6.0-mtd-core-check-partition-before-dereference.patch deleted file mode 100644 index 65789ddf2d..0000000000 --- a/target/linux/generic/backport-5.10/415-v6.0-mtd-core-check-partition-before-dereference.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 7ec4cdb321738d44ae5d405e7b6ac73dfbf99caa Mon Sep 17 00:00:00 2001 -From: Tetsuo Handa -Date: Mon, 25 Jul 2022 22:49:25 +0900 -Subject: [PATCH] mtd: core: check partition before dereference - -syzbot is reporting NULL pointer dereference at mtd_check_of_node() [1], -for mtdram test device (CONFIG_MTD_MTDRAM) is not partition. - -Link: https://syzkaller.appspot.com/bug?extid=fe013f55a2814a9e8cfd [1] -Reported-by: syzbot -Reported-by: kernel test robot -Fixes: ad9b10d1eaada169 ("mtd: core: introduce of support for dynamic partitions") -Signed-off-by: Tetsuo Handa -CC: stable@vger.kernel.org -Signed-off-by: Richard Weinberger ---- - drivers/mtd/mtdcore.c | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -574,6 +574,8 @@ static void mtd_check_of_node(struct mtd - return; - - /* Check if a partitions node exist */ -+ if (!mtd_is_partition(mtd)) -+ return; - parent = mtd->parent; - parent_dn = dev_of_node(&parent->dev); - if (!parent_dn) diff --git a/target/linux/generic/backport-5.10/416-v6.1-mtd-core-add-missing-of_node_get-in-dynamic-partitio.patch b/target/linux/generic/backport-5.10/416-v6.1-mtd-core-add-missing-of_node_get-in-dynamic-partitio.patch deleted file mode 100644 index 0c359c65f8..0000000000 --- a/target/linux/generic/backport-5.10/416-v6.1-mtd-core-add-missing-of_node_get-in-dynamic-partitio.patch +++ /dev/null @@ -1,101 +0,0 @@ -From 12b58961de0bd88b3c7dfa5d21f6d67f4678b780 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Tue, 18 Oct 2022 07:18:22 +0200 -Subject: [PATCH] mtd: core: add missing of_node_get() in dynamic partitions - code -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This fixes unbalanced of_node_put(): -[ 1.078910] 6 cmdlinepart partitions found on MTD device gpmi-nand -[ 1.085116] Creating 6 MTD partitions on "gpmi-nand": -[ 1.090181] 0x000000000000-0x000008000000 : "nandboot" -[ 1.096952] 0x000008000000-0x000009000000 : "nandfit" -[ 1.103547] 0x000009000000-0x00000b000000 : "nandkernel" -[ 1.110317] 0x00000b000000-0x00000c000000 : "nanddtb" -[ 1.115525] ------------[ cut here ]------------ -[ 1.120141] refcount_t: addition on 0; use-after-free. -[ 1.125328] WARNING: CPU: 0 PID: 1 at lib/refcount.c:25 refcount_warn_saturate+0xdc/0x148 -[ 1.133528] Modules linked in: -[ 1.136589] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.0.0-rc7-next-20220930-04543-g8cf3f7 -[ 1.146342] Hardware name: Freescale i.MX8DXL DDR3L EVK (DT) -[ 1.151999] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--) -[ 1.158965] pc : refcount_warn_saturate+0xdc/0x148 -[ 1.163760] lr : refcount_warn_saturate+0xdc/0x148 -[ 1.168556] sp : ffff800009ddb080 -[ 1.171866] x29: ffff800009ddb080 x28: ffff800009ddb35a x27: 0000000000000002 -[ 1.179015] x26: ffff8000098b06ad x25: ffffffffffffffff x24: ffff0a00ffffff05 -[ 1.186165] x23: ffff00001fdf6470 x22: ffff800009ddb367 x21: 0000000000000000 -[ 1.193314] x20: ffff00001fdfebe8 x19: ffff00001fdfec50 x18: ffffffffffffffff -[ 1.200464] x17: 0000000000000000 x16: 0000000000000118 x15: 0000000000000004 -[ 1.207614] x14: 0000000000000fff x13: ffff800009bca248 x12: 0000000000000003 -[ 1.214764] x11: 00000000ffffefff x10: c0000000ffffefff x9 : 4762cb2ccb52de00 -[ 1.221914] x8 : 4762cb2ccb52de00 x7 : 205d313431303231 x6 : 312e31202020205b -[ 1.229063] x5 : ffff800009d55c1f x4 : 0000000000000001 x3 : 0000000000000000 -[ 1.236213] x2 : 0000000000000000 x1 : ffff800009954be6 x0 : 000000000000002a -[ 1.243365] Call trace: -[ 1.245806] refcount_warn_saturate+0xdc/0x148 -[ 1.250253] kobject_get+0x98/0x9c -[ 1.253658] of_node_get+0x20/0x34 -[ 1.257072] of_fwnode_get+0x3c/0x54 -[ 1.260652] fwnode_get_nth_parent+0xd8/0xf4 -[ 1.264926] fwnode_full_name_string+0x3c/0xb4 -[ 1.269373] device_node_string+0x498/0x5b4 -[ 1.273561] pointer+0x41c/0x5d0 -[ 1.276793] vsnprintf+0x4d8/0x694 -[ 1.280198] vprintk_store+0x164/0x528 -[ 1.283951] vprintk_emit+0x98/0x164 -[ 1.287530] vprintk_default+0x44/0x6c -[ 1.291284] vprintk+0xf0/0x134 -[ 1.294428] _printk+0x54/0x7c -[ 1.297486] of_node_release+0xe8/0x128 -[ 1.301326] kobject_put+0x98/0xfc -[ 1.304732] of_node_put+0x1c/0x28 -[ 1.308137] add_mtd_device+0x484/0x6d4 -[ 1.311977] add_mtd_partitions+0xf0/0x1d0 -[ 1.316078] parse_mtd_partitions+0x45c/0x518 -[ 1.320439] mtd_device_parse_register+0xb0/0x274 -[ 1.325147] gpmi_nand_probe+0x51c/0x650 -[ 1.329074] platform_probe+0xa8/0xd0 -[ 1.332740] really_probe+0x130/0x334 -[ 1.336406] __driver_probe_device+0xb4/0xe0 -[ 1.340681] driver_probe_device+0x3c/0x1f8 -[ 1.344869] __driver_attach+0xdc/0x1a4 -[ 1.348708] bus_for_each_dev+0x80/0xcc -[ 1.352548] driver_attach+0x24/0x30 -[ 1.356127] bus_add_driver+0x108/0x1f4 -[ 1.359967] driver_register+0x78/0x114 -[ 1.363807] __platform_driver_register+0x24/0x30 -[ 1.368515] gpmi_nand_driver_init+0x1c/0x28 -[ 1.372798] do_one_initcall+0xbc/0x238 -[ 1.376638] do_initcall_level+0x94/0xb4 -[ 1.380565] do_initcalls+0x54/0x94 -[ 1.384058] do_basic_setup+0x1c/0x28 -[ 1.387724] kernel_init_freeable+0x110/0x188 -[ 1.392084] kernel_init+0x20/0x1a0 -[ 1.395578] ret_from_fork+0x10/0x20 -[ 1.399157] ---[ end trace 0000000000000000 ]--- -[ 1.403782] ------------[ cut here ]------------ - -Reported-by: Han Xu -Fixes: ad9b10d1eaada169 ("mtd: core: introduce of support for dynamic partitions") -Signed-off-by: Rafał Miłecki -Tested-by: Han Xu -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20221018051822.28685-1-zajec5@gmail.com ---- - drivers/mtd/mtdcore.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -577,7 +577,7 @@ static void mtd_check_of_node(struct mtd - if (!mtd_is_partition(mtd)) - return; - parent = mtd->parent; -- parent_dn = dev_of_node(&parent->dev); -+ parent_dn = of_node_get(dev_of_node(&parent->dev)); - if (!parent_dn) - return; - diff --git a/target/linux/generic/backport-5.10/417-v6.2-0001-mtd-core-simplify-a-bit-code-find-partition-matching.patch b/target/linux/generic/backport-5.10/417-v6.2-0001-mtd-core-simplify-a-bit-code-find-partition-matching.patch deleted file mode 100644 index e47def580c..0000000000 --- a/target/linux/generic/backport-5.10/417-v6.2-0001-mtd-core-simplify-a-bit-code-find-partition-matching.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 63db0cb35e1cb3b3c134906d1062f65513fdda2d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Tue, 4 Oct 2022 10:37:09 +0200 -Subject: [PATCH] mtd: core: simplify (a bit) code find partition-matching - dynamic OF node -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -1. Don't hardcode "partition-" string twice -2. Use simpler logic & use ->name to avoid of_property_read_string() -3. Use mtd_get_of_node() helper - -Cc: Christian Marangi -Signed-off-by: Rafał Miłecki -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20221004083710.27704-1-zajec5@gmail.com ---- - drivers/mtd/mtdcore.c | 16 +++++++--------- - 1 file changed, 7 insertions(+), 9 deletions(-) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -566,18 +566,16 @@ static void mtd_check_of_node(struct mtd - struct device_node *partitions, *parent_dn, *mtd_dn = NULL; - const char *pname, *prefix = "partition-"; - int plen, mtd_name_len, offset, prefix_len; -- struct mtd_info *parent; - bool found = false; - - /* Check if MTD already has a device node */ -- if (dev_of_node(&mtd->dev)) -+ if (mtd_get_of_node(mtd)) - return; - - /* Check if a partitions node exist */ - if (!mtd_is_partition(mtd)) - return; -- parent = mtd->parent; -- parent_dn = of_node_get(dev_of_node(&parent->dev)); -+ parent_dn = of_node_get(mtd_get_of_node(mtd->parent)); - if (!parent_dn) - return; - -@@ -590,15 +588,15 @@ static void mtd_check_of_node(struct mtd - - /* Search if a partition is defined with the same name */ - for_each_child_of_node(partitions, mtd_dn) { -- offset = 0; -- - /* Skip partition with no/wrong prefix */ -- if (!of_node_name_prefix(mtd_dn, "partition-")) -+ if (!of_node_name_prefix(mtd_dn, prefix)) - continue; - - /* Label have priority. Check that first */ -- if (of_property_read_string(mtd_dn, "label", &pname)) { -- of_property_read_string(mtd_dn, "name", &pname); -+ if (!of_property_read_string(mtd_dn, "label", &pname)) { -+ offset = 0; -+ } else { -+ pname = mtd_dn->name; - offset = prefix_len; - } - diff --git a/target/linux/generic/backport-5.10/417-v6.2-0002-mtd-core-try-to-find-OF-node-for-every-MTD-partition.patch b/target/linux/generic/backport-5.10/417-v6.2-0002-mtd-core-try-to-find-OF-node-for-every-MTD-partition.patch deleted file mode 100644 index 438e25b7f9..0000000000 --- a/target/linux/generic/backport-5.10/417-v6.2-0002-mtd-core-try-to-find-OF-node-for-every-MTD-partition.patch +++ /dev/null @@ -1,84 +0,0 @@ -From ddb8cefb7af288950447ca6eeeafb09977dab56f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Tue, 4 Oct 2022 10:37:10 +0200 -Subject: [PATCH] mtd: core: try to find OF node for every MTD partition -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -So far this feature was limited to the top-level "nvmem-cells" node. -There are multiple parsers creating partitions and subpartitions -dynamically. Extend that code to handle them too. - -This allows finding partition-* node for every MTD (sub)partition. - -Random example: - -partitions { - compatible = "brcm,bcm947xx-cfe-partitions"; - - partition-firmware { - compatible = "brcm,trx"; - - partition-loader { - }; - }; -}; - -Cc: Christian Marangi -Signed-off-by: Rafał Miłecki -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20221004083710.27704-2-zajec5@gmail.com ---- - drivers/mtd/mtdcore.c | 18 ++++++------------ - 1 file changed, 6 insertions(+), 12 deletions(-) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -566,20 +566,22 @@ static void mtd_check_of_node(struct mtd - struct device_node *partitions, *parent_dn, *mtd_dn = NULL; - const char *pname, *prefix = "partition-"; - int plen, mtd_name_len, offset, prefix_len; -- bool found = false; - - /* Check if MTD already has a device node */ - if (mtd_get_of_node(mtd)) - return; - -- /* Check if a partitions node exist */ - if (!mtd_is_partition(mtd)) - return; -+ - parent_dn = of_node_get(mtd_get_of_node(mtd->parent)); - if (!parent_dn) - return; - -- partitions = of_get_child_by_name(parent_dn, "partitions"); -+ if (mtd_is_partition(mtd->parent)) -+ partitions = of_node_get(parent_dn); -+ else -+ partitions = of_get_child_by_name(parent_dn, "partitions"); - if (!partitions) - goto exit_parent; - -@@ -603,19 +605,11 @@ static void mtd_check_of_node(struct mtd - plen = strlen(pname) - offset; - if (plen == mtd_name_len && - !strncmp(mtd->name, pname + offset, plen)) { -- found = true; -+ mtd_set_of_node(mtd, mtd_dn); - break; - } - } - -- if (!found) -- goto exit_partitions; -- -- /* Set of_node only for nvmem */ -- if (of_device_is_compatible(mtd_dn, "nvmem-cells")) -- mtd_set_of_node(mtd, mtd_dn); -- --exit_partitions: - of_node_put(partitions); - exit_parent: - of_node_put(parent_dn); diff --git a/target/linux/generic/backport-5.10/418-v6.2-mtd-core-set-ROOT_DEV-for-partitions-marked-as-rootf.patch b/target/linux/generic/backport-5.10/418-v6.2-mtd-core-set-ROOT_DEV-for-partitions-marked-as-rootf.patch deleted file mode 100644 index 2a132bd8a3..0000000000 --- a/target/linux/generic/backport-5.10/418-v6.2-mtd-core-set-ROOT_DEV-for-partitions-marked-as-rootf.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 26422ac78e9d8767bd4aabfbae616b15edbf6a1b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Sat, 22 Oct 2022 23:13:18 +0200 -Subject: [PATCH] mtd: core: set ROOT_DEV for partitions marked as rootfs in DT -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds support for "linux,rootfs" binding that is used to mark flash -partition containing rootfs. It's useful for devices using device tree -that don't have bootloader passing root info in cmdline. - -Signed-off-by: Rafał Miłecki -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20221022211318.32009-2-zajec5@gmail.com ---- - drivers/mtd/mtdcore.c | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -745,6 +746,17 @@ int add_mtd_device(struct mtd_info *mtd) - not->add(mtd); - - mutex_unlock(&mtd_table_mutex); -+ -+ if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL)) { -+ if (IS_BUILTIN(CONFIG_MTD)) { -+ pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name); -+ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index); -+ } else { -+ pr_warn("mtd: can't set mtd%d (%s) as root device - mtd must be builtin\n", -+ mtd->index, mtd->name); -+ } -+ } -+ - /* We _know_ we aren't being removed, because - our caller is still holding us here. So none - of this try_ nonsense, and no bitching about it diff --git a/target/linux/generic/backport-5.10/421-v6.2-mtd-parsers-add-TP-Link-SafeLoader-partitions-table-.patch b/target/linux/generic/backport-5.10/421-v6.2-mtd-parsers-add-TP-Link-SafeLoader-partitions-table-.patch deleted file mode 100644 index fed46fb978..0000000000 --- a/target/linux/generic/backport-5.10/421-v6.2-mtd-parsers-add-TP-Link-SafeLoader-partitions-table-.patch +++ /dev/null @@ -1,229 +0,0 @@ -From aec4d5f5ffd0f0092bd9dc21ea90e0bc237d4b74 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Sat, 15 Oct 2022 11:29:50 +0200 -Subject: [PATCH] mtd: parsers: add TP-Link SafeLoader partitions table parser -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This parser deals with most TP-Link home routers. It reads info about -partitions and registers them in the MTD subsystem. - -Example from TP-Link Archer C5 V2: - -spi-nor spi0.0: s25fl128s1 (16384 Kbytes) -15 tplink-safeloader partitions found on MTD device spi0.0 -Creating 15 MTD partitions on "spi0.0": -0x000000000000-0x000000040000 : "fs-uboot" -0x000000040000-0x000000440000 : "os-image" -0x000000440000-0x000000e40000 : "rootfs" -0x000000e40000-0x000000e40200 : "default-mac" -0x000000e40200-0x000000e40400 : "pin" -0x000000e40400-0x000000e40600 : "product-info" -0x000000e50000-0x000000e60000 : "partition-table" -0x000000e60000-0x000000e60200 : "soft-version" -0x000000e61000-0x000000e70000 : "support-list" -0x000000e70000-0x000000e80000 : "profile" -0x000000e80000-0x000000e90000 : "default-config" -0x000000e90000-0x000000ee0000 : "user-config" -0x000000ee0000-0x000000fe0000 : "log" -0x000000fe0000-0x000000ff0000 : "radio_bk" -0x000000ff0000-0x000001000000 : "radio" - -Signed-off-by: Rafał Miłecki -Signed-off-by: Miquel Raynal -Link: https://lore.kernel.org/linux-mtd/20221015092950.27467-2-zajec5@gmail.com ---- - drivers/mtd/parsers/Kconfig | 15 +++ - drivers/mtd/parsers/Makefile | 1 + - drivers/mtd/parsers/tplink_safeloader.c | 150 ++++++++++++++++++++++++ - 3 files changed, 166 insertions(+) - create mode 100644 drivers/mtd/parsers/tplink_safeloader.c - ---- a/drivers/mtd/parsers/Kconfig -+++ b/drivers/mtd/parsers/Kconfig -@@ -113,6 +113,21 @@ config MTD_AFS_PARTS - for your particular device. It won't happen automatically. The - 'physmap' map driver (CONFIG_MTD_PHYSMAP) does this, for example. - -+config MTD_PARSER_TPLINK_SAFELOADER -+ tristate "TP-Link Safeloader partitions parser" -+ depends on MTD && (ARCH_BCM_5301X || ATH79 || SOC_MT7620 || SOC_MT7621 || COMPILE_TEST) -+ help -+ TP-Link home routers use flash partitions to store various data. Info -+ about flash space layout is stored in a partitions table using a -+ custom ASCII-based format. -+ -+ That format was first found in devices with SafeLoader bootloader and -+ was named after it. Later it was adapted to CFE and U-Boot -+ bootloaders. -+ -+ This driver reads partitions table, parses it and creates MTD -+ partitions. -+ - config MTD_PARSER_TRX - tristate "Parser for TRX format partitions" - depends on MTD && (BCM47XX || ARCH_BCM_5301X || ARCH_MEDIATEK || RALINK || COMPILE_TEST) ---- a/drivers/mtd/parsers/Makefile -+++ b/drivers/mtd/parsers/Makefile -@@ -9,6 +9,7 @@ ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += - ofpart-$(CONFIG_MTD_OF_PARTS_LINKSYS_NS)+= ofpart_linksys_ns.o - obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o - obj-$(CONFIG_MTD_AFS_PARTS) += afs.o -+obj-$(CONFIG_MTD_PARSER_TPLINK_SAFELOADER) += tplink_safeloader.o - obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o - obj-$(CONFIG_MTD_SHARPSL_PARTS) += sharpslpart.o - obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o ---- /dev/null -+++ b/drivers/mtd/parsers/tplink_safeloader.c -@@ -0,0 +1,150 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Copyright © 2022 Rafał Miłecki -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define TPLINK_SAFELOADER_DATA_OFFSET 4 -+#define TPLINK_SAFELOADER_MAX_PARTS 32 -+ -+struct safeloader_cmn_header { -+ __be32 size; -+ uint32_t unused; -+} __packed; -+ -+static void *mtd_parser_tplink_safeloader_read_table(struct mtd_info *mtd) -+{ -+ struct safeloader_cmn_header hdr; -+ struct device_node *np; -+ size_t bytes_read; -+ size_t offset; -+ size_t size; -+ char *buf; -+ int err; -+ -+ np = mtd_get_of_node(mtd); -+ if (mtd_is_partition(mtd)) -+ of_node_get(np); -+ else -+ np = of_get_child_by_name(np, "partitions"); -+ -+ if (of_property_read_u32(np, "partitions-table-offset", (u32 *)&offset)) { -+ pr_err("Failed to get partitions table offset\n"); -+ goto err_put; -+ } -+ -+ err = mtd_read(mtd, offset, sizeof(hdr), &bytes_read, (uint8_t *)&hdr); -+ if (err && !mtd_is_bitflip(err)) { -+ pr_err("Failed to read from %s at 0x%zx\n", mtd->name, offset); -+ goto err_put; -+ } -+ -+ size = be32_to_cpu(hdr.size); -+ -+ buf = kmalloc(size + 1, GFP_KERNEL); -+ if (!buf) -+ goto err_put; -+ -+ err = mtd_read(mtd, offset + sizeof(hdr), size, &bytes_read, buf); -+ if (err && !mtd_is_bitflip(err)) { -+ pr_err("Failed to read from %s at 0x%zx\n", mtd->name, offset + sizeof(hdr)); -+ goto err_kfree; -+ } -+ -+ buf[size] = '\0'; -+ -+ of_node_put(np); -+ -+ return buf; -+ -+err_kfree: -+ kfree(buf); -+err_put: -+ of_node_put(np); -+ return NULL; -+} -+ -+static int mtd_parser_tplink_safeloader_parse(struct mtd_info *mtd, -+ const struct mtd_partition **pparts, -+ struct mtd_part_parser_data *data) -+{ -+ struct mtd_partition *parts; -+ char name[65]; -+ size_t offset; -+ size_t bytes; -+ char *buf; -+ int idx; -+ int err; -+ -+ parts = kcalloc(TPLINK_SAFELOADER_MAX_PARTS, sizeof(*parts), GFP_KERNEL); -+ if (!parts) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ buf = mtd_parser_tplink_safeloader_read_table(mtd); -+ if (!buf) { -+ err = -ENOENT; -+ goto err_out; -+ } -+ -+ for (idx = 0, offset = TPLINK_SAFELOADER_DATA_OFFSET; -+ idx < TPLINK_SAFELOADER_MAX_PARTS && -+ sscanf(buf + offset, "partition %64s base 0x%llx size 0x%llx%zn\n", -+ name, &parts[idx].offset, &parts[idx].size, &bytes) == 3; -+ idx++, offset += bytes + 1) { -+ parts[idx].name = kstrdup(name, GFP_KERNEL); -+ if (!parts[idx].name) { -+ err = -ENOMEM; -+ goto err_free; -+ } -+ } -+ -+ if (idx == TPLINK_SAFELOADER_MAX_PARTS) -+ pr_warn("Reached maximum number of partitions!\n"); -+ -+ kfree(buf); -+ -+ *pparts = parts; -+ -+ return idx; -+ -+err_free: -+ for (idx -= 1; idx >= 0; idx--) -+ kfree(parts[idx].name); -+err_out: -+ return err; -+}; -+ -+static void mtd_parser_tplink_safeloader_cleanup(const struct mtd_partition *pparts, -+ int nr_parts) -+{ -+ int i; -+ -+ for (i = 0; i < nr_parts; i++) -+ kfree(pparts[i].name); -+ -+ kfree(pparts); -+} -+ -+static const struct of_device_id mtd_parser_tplink_safeloader_of_match_table[] = { -+ { .compatible = "tplink,safeloader-partitions" }, -+ {}, -+}; -+MODULE_DEVICE_TABLE(of, mtd_parser_tplink_safeloader_of_match_table); -+ -+static struct mtd_part_parser mtd_parser_tplink_safeloader = { -+ .parse_fn = mtd_parser_tplink_safeloader_parse, -+ .cleanup = mtd_parser_tplink_safeloader_cleanup, -+ .name = "tplink-safeloader", -+ .of_match_table = mtd_parser_tplink_safeloader_of_match_table, -+}; -+module_mtd_part_parser(mtd_parser_tplink_safeloader); -+ -+MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/backport-5.10/500-v5.13-ubifs-default-to-zstd-compression.patch b/target/linux/generic/backport-5.10/500-v5.13-ubifs-default-to-zstd-compression.patch deleted file mode 100644 index dd50c19c27..0000000000 --- a/target/linux/generic/backport-5.10/500-v5.13-ubifs-default-to-zstd-compression.patch +++ /dev/null @@ -1,25 +0,0 @@ -From dcdf415b740923530dc71d89fecc8361078473f5 Mon Sep 17 00:00:00 2001 -From: Rui Salvaterra -Date: Mon, 5 Apr 2021 16:11:55 +0100 -Subject: [PATCH] ubifs: default to zstd compression - -Compared to lzo and zlib, zstd is the best all-around performer, both in terms -of speed and compression ratio. Set it as the default, if available. - -Signed-off-by: Rui Salvaterra ---- - fs/ubifs/sb.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/fs/ubifs/sb.c -+++ b/fs/ubifs/sb.c -@@ -53,6 +53,9 @@ - - static int get_default_compressor(struct ubifs_info *c) - { -+ if (ubifs_compr_present(c, UBIFS_COMPR_ZSTD)) -+ return UBIFS_COMPR_ZSTD; -+ - if (ubifs_compr_present(c, UBIFS_COMPR_LZO)) - return UBIFS_COMPR_LZO; - diff --git a/target/linux/generic/backport-5.10/600-v5.12-net-extract-napi-poll-functionality-to-__napi_poll.patch b/target/linux/generic/backport-5.10/600-v5.12-net-extract-napi-poll-functionality-to-__napi_poll.patch deleted file mode 100644 index 7d73293532..0000000000 --- a/target/linux/generic/backport-5.10/600-v5.12-net-extract-napi-poll-functionality-to-__napi_poll.patch +++ /dev/null @@ -1,88 +0,0 @@ -From: Felix Fietkau -Date: Mon, 8 Feb 2021 11:34:08 -0800 -Subject: [PATCH] net: extract napi poll functionality to __napi_poll() - -This commit introduces a new function __napi_poll() which does the main -logic of the existing napi_poll() function, and will be called by other -functions in later commits. -This idea and implementation is done by Felix Fietkau and -is proposed as part of the patch to move napi work to work_queue -context. -This commit by itself is a code restructure. - -Signed-off-by: Felix Fietkau -Signed-off-by: Wei Wang -Reviewed-by: Alexander Duyck -Signed-off-by: David S. Miller ---- - ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -6813,15 +6813,10 @@ void __netif_napi_del(struct napi_struct - } - EXPORT_SYMBOL(__netif_napi_del); - --static int napi_poll(struct napi_struct *n, struct list_head *repoll) -+static int __napi_poll(struct napi_struct *n, bool *repoll) - { -- void *have; - int work, weight; - -- list_del_init(&n->poll_list); -- -- have = netpoll_poll_lock(n); -- - weight = n->weight; - - /* This NAPI_STATE_SCHED test is for avoiding a race -@@ -6841,7 +6836,7 @@ static int napi_poll(struct napi_struct - n->poll, work, weight); - - if (likely(work < weight)) -- goto out_unlock; -+ return work; - - /* Drivers must not modify the NAPI state if they - * consume the entire weight. In such cases this code -@@ -6850,7 +6845,7 @@ static int napi_poll(struct napi_struct - */ - if (unlikely(napi_disable_pending(n))) { - napi_complete(n); -- goto out_unlock; -+ return work; - } - - if (n->gro_bitmask) { -@@ -6868,12 +6863,29 @@ static int napi_poll(struct napi_struct - if (unlikely(!list_empty(&n->poll_list))) { - pr_warn_once("%s: Budget exhausted after napi rescheduled\n", - n->dev ? n->dev->name : "backlog"); -- goto out_unlock; -+ return work; - } - -- list_add_tail(&n->poll_list, repoll); -+ *repoll = true; -+ -+ return work; -+} -+ -+static int napi_poll(struct napi_struct *n, struct list_head *repoll) -+{ -+ bool do_repoll = false; -+ void *have; -+ int work; -+ -+ list_del_init(&n->poll_list); -+ -+ have = netpoll_poll_lock(n); -+ -+ work = __napi_poll(n, &do_repoll); -+ -+ if (do_repoll) -+ list_add_tail(&n->poll_list, repoll); - --out_unlock: - netpoll_poll_unlock(have); - - return work; diff --git a/target/linux/generic/backport-5.10/601-v5.12-net-implement-threaded-able-napi-poll-loop-support.patch b/target/linux/generic/backport-5.10/601-v5.12-net-implement-threaded-able-napi-poll-loop-support.patch deleted file mode 100644 index 9d5fb6e20c..0000000000 --- a/target/linux/generic/backport-5.10/601-v5.12-net-implement-threaded-able-napi-poll-loop-support.patch +++ /dev/null @@ -1,261 +0,0 @@ -From: Wei Wang -Date: Mon, 8 Feb 2021 11:34:09 -0800 -Subject: [PATCH] net: implement threaded-able napi poll loop support - -This patch allows running each napi poll loop inside its own -kernel thread. -The kthread is created during netif_napi_add() if dev->threaded -is set. And threaded mode is enabled in napi_enable(). We will -provide a way to set dev->threaded and enable threaded mode -without a device up/down in the following patch. - -Once that threaded mode is enabled and the kthread is -started, napi_schedule() will wake-up such thread instead -of scheduling the softirq. - -The threaded poll loop behaves quite likely the net_rx_action, -but it does not have to manipulate local irqs and uses -an explicit scheduling point based on netdev_budget. - -Co-developed-by: Paolo Abeni -Signed-off-by: Paolo Abeni -Co-developed-by: Hannes Frederic Sowa -Signed-off-by: Hannes Frederic Sowa -Co-developed-by: Jakub Kicinski -Signed-off-by: Jakub Kicinski -Signed-off-by: Wei Wang -Reviewed-by: Alexander Duyck -Signed-off-by: David S. Miller ---- - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -356,6 +356,7 @@ struct napi_struct { - struct list_head dev_list; - struct hlist_node napi_hash_node; - unsigned int napi_id; -+ struct task_struct *thread; - }; - - enum { -@@ -366,6 +367,7 @@ enum { - NAPI_STATE_LISTED, /* NAPI added to system lists */ - NAPI_STATE_NO_BUSY_POLL,/* Do not add in napi_hash, no busy polling */ - NAPI_STATE_IN_BUSY_POLL,/* sk_busy_loop() owns this NAPI */ -+ NAPI_STATE_THREADED, /* The poll is performed inside its own thread*/ - }; - - enum { -@@ -376,6 +378,7 @@ enum { - NAPIF_STATE_LISTED = BIT(NAPI_STATE_LISTED), - NAPIF_STATE_NO_BUSY_POLL = BIT(NAPI_STATE_NO_BUSY_POLL), - NAPIF_STATE_IN_BUSY_POLL = BIT(NAPI_STATE_IN_BUSY_POLL), -+ NAPIF_STATE_THREADED = BIT(NAPI_STATE_THREADED), - }; - - enum gro_result { -@@ -506,20 +509,7 @@ static inline bool napi_complete(struct - */ - void napi_disable(struct napi_struct *n); - --/** -- * napi_enable - enable NAPI scheduling -- * @n: NAPI context -- * -- * Resume NAPI from being scheduled on this context. -- * Must be paired with napi_disable. -- */ --static inline void napi_enable(struct napi_struct *n) --{ -- BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state)); -- smp_mb__before_atomic(); -- clear_bit(NAPI_STATE_SCHED, &n->state); -- clear_bit(NAPI_STATE_NPSVC, &n->state); --} -+void napi_enable(struct napi_struct *n); - - /** - * napi_synchronize - wait until NAPI is not running -@@ -1865,6 +1855,8 @@ enum netdev_ml_priv_type { - * - * @wol_enabled: Wake-on-LAN is enabled - * -+ * @threaded: napi threaded mode is enabled -+ * - * @net_notifier_list: List of per-net netdev notifier block - * that follow this device when it is moved - * to another network namespace. -@@ -2184,6 +2176,7 @@ struct net_device { - struct lock_class_key *qdisc_running_key; - bool proto_down; - unsigned wol_enabled:1; -+ unsigned threaded:1; - - struct list_head net_notifier_list; - ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -91,6 +91,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -1500,6 +1501,27 @@ void netdev_notify_peers(struct net_devi - } - EXPORT_SYMBOL(netdev_notify_peers); - -+static int napi_threaded_poll(void *data); -+ -+static int napi_kthread_create(struct napi_struct *n) -+{ -+ int err = 0; -+ -+ /* Create and wake up the kthread once to put it in -+ * TASK_INTERRUPTIBLE mode to avoid the blocked task -+ * warning and work with loadavg. -+ */ -+ n->thread = kthread_run(napi_threaded_poll, n, "napi/%s-%d", -+ n->dev->name, n->napi_id); -+ if (IS_ERR(n->thread)) { -+ err = PTR_ERR(n->thread); -+ pr_err("kthread_run failed with err %d\n", err); -+ n->thread = NULL; -+ } -+ -+ return err; -+} -+ - static int __dev_open(struct net_device *dev, struct netlink_ext_ack *extack) - { - const struct net_device_ops *ops = dev->netdev_ops; -@@ -4274,6 +4296,21 @@ int gro_normal_batch __read_mostly = 8; - static inline void ____napi_schedule(struct softnet_data *sd, - struct napi_struct *napi) - { -+ struct task_struct *thread; -+ -+ if (test_bit(NAPI_STATE_THREADED, &napi->state)) { -+ /* Paired with smp_mb__before_atomic() in -+ * napi_enable(). Use READ_ONCE() to guarantee -+ * a complete read on napi->thread. Only call -+ * wake_up_process() when it's not NULL. -+ */ -+ thread = READ_ONCE(napi->thread); -+ if (thread) { -+ wake_up_process(thread); -+ return; -+ } -+ } -+ - list_add_tail(&napi->poll_list, &sd->poll_list); - __raise_softirq_irqoff(NET_RX_SOFTIRQ); - } -@@ -6766,6 +6803,12 @@ void netif_napi_add(struct net_device *d - set_bit(NAPI_STATE_NPSVC, &napi->state); - list_add_rcu(&napi->dev_list, &dev->napi_list); - napi_hash_add(napi); -+ /* Create kthread for this napi if dev->threaded is set. -+ * Clear dev->threaded if kthread creation failed so that -+ * threaded mode will not be enabled in napi_enable(). -+ */ -+ if (dev->threaded && napi_kthread_create(napi)) -+ dev->threaded = 0; - } - EXPORT_SYMBOL(netif_napi_add); - -@@ -6782,9 +6825,28 @@ void napi_disable(struct napi_struct *n) - hrtimer_cancel(&n->timer); - - clear_bit(NAPI_STATE_DISABLE, &n->state); -+ clear_bit(NAPI_STATE_THREADED, &n->state); - } - EXPORT_SYMBOL(napi_disable); - -+/** -+ * napi_enable - enable NAPI scheduling -+ * @n: NAPI context -+ * -+ * Resume NAPI from being scheduled on this context. -+ * Must be paired with napi_disable. -+ */ -+void napi_enable(struct napi_struct *n) -+{ -+ BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state)); -+ smp_mb__before_atomic(); -+ clear_bit(NAPI_STATE_SCHED, &n->state); -+ clear_bit(NAPI_STATE_NPSVC, &n->state); -+ if (n->dev->threaded && n->thread) -+ set_bit(NAPI_STATE_THREADED, &n->state); -+} -+EXPORT_SYMBOL(napi_enable); -+ - static void flush_gro_hash(struct napi_struct *napi) - { - int i; -@@ -6810,6 +6872,11 @@ void __netif_napi_del(struct napi_struct - - flush_gro_hash(napi); - napi->gro_bitmask = 0; -+ -+ if (napi->thread) { -+ kthread_stop(napi->thread); -+ napi->thread = NULL; -+ } - } - EXPORT_SYMBOL(__netif_napi_del); - -@@ -6891,6 +6958,51 @@ static int napi_poll(struct napi_struct - return work; - } - -+static int napi_thread_wait(struct napi_struct *napi) -+{ -+ set_current_state(TASK_INTERRUPTIBLE); -+ -+ while (!kthread_should_stop() && !napi_disable_pending(napi)) { -+ if (test_bit(NAPI_STATE_SCHED, &napi->state)) { -+ WARN_ON(!list_empty(&napi->poll_list)); -+ __set_current_state(TASK_RUNNING); -+ return 0; -+ } -+ -+ schedule(); -+ set_current_state(TASK_INTERRUPTIBLE); -+ } -+ __set_current_state(TASK_RUNNING); -+ return -1; -+} -+ -+static int napi_threaded_poll(void *data) -+{ -+ struct napi_struct *napi = data; -+ void *have; -+ -+ while (!napi_thread_wait(napi)) { -+ for (;;) { -+ bool repoll = false; -+ -+ local_bh_disable(); -+ -+ have = netpoll_poll_lock(napi); -+ __napi_poll(napi, &repoll); -+ netpoll_poll_unlock(have); -+ -+ __kfree_skb_flush(); -+ local_bh_enable(); -+ -+ if (!repoll) -+ break; -+ -+ cond_resched(); -+ } -+ } -+ return 0; -+} -+ - static __latent_entropy void net_rx_action(struct softirq_action *h) - { - struct softnet_data *sd = this_cpu_ptr(&softnet_data); diff --git a/target/linux/generic/backport-5.10/602-v5.12-net-add-sysfs-attribute-to-control-napi-threaded-mod.patch b/target/linux/generic/backport-5.10/602-v5.12-net-add-sysfs-attribute-to-control-napi-threaded-mod.patch deleted file mode 100644 index 05d5f59f80..0000000000 --- a/target/linux/generic/backport-5.10/602-v5.12-net-add-sysfs-attribute-to-control-napi-threaded-mod.patch +++ /dev/null @@ -1,177 +0,0 @@ -From: Wei Wang -Date: Mon, 8 Feb 2021 11:34:10 -0800 -Subject: [PATCH] net: add sysfs attribute to control napi threaded mode - -This patch adds a new sysfs attribute to the network device class. -Said attribute provides a per-device control to enable/disable the -threaded mode for all the napi instances of the given network device, -without the need for a device up/down. -User sets it to 1 or 0 to enable or disable threaded mode. -Note: when switching between threaded and the current softirq based mode -for a napi instance, it will not immediately take effect if the napi is -currently being polled. The mode switch will happen for the next time -napi_schedule() is called. - -Co-developed-by: Paolo Abeni -Signed-off-by: Paolo Abeni -Co-developed-by: Hannes Frederic Sowa -Signed-off-by: Hannes Frederic Sowa -Co-developed-by: Felix Fietkau -Signed-off-by: Felix Fietkau -Signed-off-by: Wei Wang -Reviewed-by: Alexander Duyck -Signed-off-by: David S. Miller ---- - ---- a/Documentation/ABI/testing/sysfs-class-net -+++ b/Documentation/ABI/testing/sysfs-class-net -@@ -337,3 +337,18 @@ Contact: netdev@vger.kernel.org - Description: - 32-bit unsigned integer counting the number of times the link has - been down -+ -+What: /sys/class/net//threaded -+Date: Jan 2021 -+KernelVersion: 5.12 -+Contact: netdev@vger.kernel.org -+Description: -+ Boolean value to control the threaded mode per device. User could -+ set this value to enable/disable threaded mode for all napi -+ belonging to this device, without the need to do device up/down. -+ -+ Possible values: -+ == ================================== -+ 0 threaded mode disabled for this dev -+ 1 threaded mode enabled for this dev -+ == ================================== ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -500,6 +500,8 @@ static inline bool napi_complete(struct - return napi_complete_done(n, 0); - } - -+int dev_set_threaded(struct net_device *dev, bool threaded); -+ - /** - * napi_disable - prevent NAPI from scheduling - * @n: NAPI context ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -4300,8 +4300,9 @@ static inline void ____napi_schedule(str - - if (test_bit(NAPI_STATE_THREADED, &napi->state)) { - /* Paired with smp_mb__before_atomic() in -- * napi_enable(). Use READ_ONCE() to guarantee -- * a complete read on napi->thread. Only call -+ * napi_enable()/dev_set_threaded(). -+ * Use READ_ONCE() to guarantee a complete -+ * read on napi->thread. Only call - * wake_up_process() when it's not NULL. - */ - thread = READ_ONCE(napi->thread); -@@ -6776,6 +6777,49 @@ static void init_gro_hash(struct napi_st - napi->gro_bitmask = 0; - } - -+int dev_set_threaded(struct net_device *dev, bool threaded) -+{ -+ struct napi_struct *napi; -+ int err = 0; -+ -+ if (dev->threaded == threaded) -+ return 0; -+ -+ if (threaded) { -+ list_for_each_entry(napi, &dev->napi_list, dev_list) { -+ if (!napi->thread) { -+ err = napi_kthread_create(napi); -+ if (err) { -+ threaded = false; -+ break; -+ } -+ } -+ } -+ } -+ -+ dev->threaded = threaded; -+ -+ /* Make sure kthread is created before THREADED bit -+ * is set. -+ */ -+ smp_mb__before_atomic(); -+ -+ /* Setting/unsetting threaded mode on a napi might not immediately -+ * take effect, if the current napi instance is actively being -+ * polled. In this case, the switch between threaded mode and -+ * softirq mode will happen in the next round of napi_schedule(). -+ * This should not cause hiccups/stalls to the live traffic. -+ */ -+ list_for_each_entry(napi, &dev->napi_list, dev_list) { -+ if (threaded) -+ set_bit(NAPI_STATE_THREADED, &napi->state); -+ else -+ clear_bit(NAPI_STATE_THREADED, &napi->state); -+ } -+ -+ return err; -+} -+ - void netif_napi_add(struct net_device *dev, struct napi_struct *napi, - int (*poll)(struct napi_struct *, int), int weight) - { ---- a/net/core/net-sysfs.c -+++ b/net/core/net-sysfs.c -@@ -587,6 +587,45 @@ static ssize_t phys_switch_id_show(struc - } - static DEVICE_ATTR_RO(phys_switch_id); - -+static ssize_t threaded_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct net_device *netdev = to_net_dev(dev); -+ ssize_t ret = -EINVAL; -+ -+ if (!rtnl_trylock()) -+ return restart_syscall(); -+ -+ if (dev_isalive(netdev)) -+ ret = sprintf(buf, fmt_dec, netdev->threaded); -+ -+ rtnl_unlock(); -+ return ret; -+} -+ -+static int modify_napi_threaded(struct net_device *dev, unsigned long val) -+{ -+ int ret; -+ -+ if (list_empty(&dev->napi_list)) -+ return -EOPNOTSUPP; -+ -+ if (val != 0 && val != 1) -+ return -EOPNOTSUPP; -+ -+ ret = dev_set_threaded(dev, val); -+ -+ return ret; -+} -+ -+static ssize_t threaded_store(struct device *dev, -+ struct device_attribute *attr, -+ const char *buf, size_t len) -+{ -+ return netdev_store(dev, attr, buf, len, modify_napi_threaded); -+} -+static DEVICE_ATTR_RW(threaded); -+ - static struct attribute *net_class_attrs[] __ro_after_init = { - &dev_attr_netdev_group.attr, - &dev_attr_type.attr, -@@ -619,6 +658,7 @@ static struct attribute *net_class_attrs - &dev_attr_proto_down.attr, - &dev_attr_carrier_up_count.attr, - &dev_attr_carrier_down_count.attr, -+ &dev_attr_threaded.attr, - NULL, - }; - ATTRIBUTE_GROUPS(net_class); diff --git a/target/linux/generic/backport-5.10/603-v5.12-net-fix-race-between-napi-kthread-mode-and-busy-poll.patch b/target/linux/generic/backport-5.10/603-v5.12-net-fix-race-between-napi-kthread-mode-and-busy-poll.patch deleted file mode 100644 index b83078d51c..0000000000 --- a/target/linux/generic/backport-5.10/603-v5.12-net-fix-race-between-napi-kthread-mode-and-busy-poll.patch +++ /dev/null @@ -1,93 +0,0 @@ -From: Wei Wang -Date: Mon, 1 Mar 2021 17:21:13 -0800 -Subject: [PATCH] net: fix race between napi kthread mode and busy poll - -Currently, napi_thread_wait() checks for NAPI_STATE_SCHED bit to -determine if the kthread owns this napi and could call napi->poll() on -it. However, if socket busy poll is enabled, it is possible that the -busy poll thread grabs this SCHED bit (after the previous napi->poll() -invokes napi_complete_done() and clears SCHED bit) and tries to poll -on the same napi. napi_disable() could grab the SCHED bit as well. -This patch tries to fix this race by adding a new bit -NAPI_STATE_SCHED_THREADED in napi->state. This bit gets set in -____napi_schedule() if the threaded mode is enabled, and gets cleared -in napi_complete_done(), and we only poll the napi in kthread if this -bit is set. This helps distinguish the ownership of the napi between -kthread and other scenarios and fixes the race issue. - -Fixes: 29863d41bb6e ("net: implement threaded-able napi poll loop support") -Reported-by: Martin Zaharinov -Suggested-by: Jakub Kicinski -Signed-off-by: Wei Wang -Cc: Alexander Duyck -Cc: Eric Dumazet -Cc: Paolo Abeni -Cc: Hannes Frederic Sowa ---- - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -368,6 +368,7 @@ enum { - NAPI_STATE_NO_BUSY_POLL,/* Do not add in napi_hash, no busy polling */ - NAPI_STATE_IN_BUSY_POLL,/* sk_busy_loop() owns this NAPI */ - NAPI_STATE_THREADED, /* The poll is performed inside its own thread*/ -+ NAPI_STATE_SCHED_THREADED, /* Napi is currently scheduled in threaded mode */ - }; - - enum { -@@ -379,6 +380,7 @@ enum { - NAPIF_STATE_NO_BUSY_POLL = BIT(NAPI_STATE_NO_BUSY_POLL), - NAPIF_STATE_IN_BUSY_POLL = BIT(NAPI_STATE_IN_BUSY_POLL), - NAPIF_STATE_THREADED = BIT(NAPI_STATE_THREADED), -+ NAPIF_STATE_SCHED_THREADED = BIT(NAPI_STATE_SCHED_THREADED), - }; - - enum gro_result { ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -4307,6 +4307,8 @@ static inline void ____napi_schedule(str - */ - thread = READ_ONCE(napi->thread); - if (thread) { -+ if (thread->state != TASK_INTERRUPTIBLE) -+ set_bit(NAPI_STATE_SCHED_THREADED, &napi->state); - wake_up_process(thread); - return; - } -@@ -6568,7 +6570,8 @@ bool napi_complete_done(struct napi_stru - - WARN_ON_ONCE(!(val & NAPIF_STATE_SCHED)); - -- new = val & ~(NAPIF_STATE_MISSED | NAPIF_STATE_SCHED); -+ new = val & ~(NAPIF_STATE_MISSED | NAPIF_STATE_SCHED | -+ NAPIF_STATE_SCHED_THREADED); - - /* If STATE_MISSED was set, leave STATE_SCHED set, - * because we will call napi->poll() one more time. -@@ -7004,16 +7007,25 @@ static int napi_poll(struct napi_struct - - static int napi_thread_wait(struct napi_struct *napi) - { -+ bool woken = false; -+ - set_current_state(TASK_INTERRUPTIBLE); - - while (!kthread_should_stop() && !napi_disable_pending(napi)) { -- if (test_bit(NAPI_STATE_SCHED, &napi->state)) { -+ /* Testing SCHED_THREADED bit here to make sure the current -+ * kthread owns this napi and could poll on this napi. -+ * Testing SCHED bit is not enough because SCHED bit might be -+ * set by some other busy poll thread or by napi_disable(). -+ */ -+ if (test_bit(NAPI_STATE_SCHED_THREADED, &napi->state) || woken) { - WARN_ON(!list_empty(&napi->poll_list)); - __set_current_state(TASK_RUNNING); - return 0; - } - - schedule(); -+ /* woken being true indicates this thread owns this napi. */ -+ woken = true; - set_current_state(TASK_INTERRUPTIBLE); - } - __set_current_state(TASK_RUNNING); diff --git a/target/linux/generic/backport-5.10/604-v5.12-net-fix-hangup-on-napi_disable-for-threaded-napi.patch b/target/linux/generic/backport-5.10/604-v5.12-net-fix-hangup-on-napi_disable-for-threaded-napi.patch deleted file mode 100644 index bf6fd25ac1..0000000000 --- a/target/linux/generic/backport-5.10/604-v5.12-net-fix-hangup-on-napi_disable-for-threaded-napi.patch +++ /dev/null @@ -1,53 +0,0 @@ -From: Paolo Abeni -Date: Fri, 9 Apr 2021 17:24:17 +0200 -Subject: [PATCH] net: fix hangup on napi_disable for threaded napi - -napi_disable() is subject to an hangup, when the threaded -mode is enabled and the napi is under heavy traffic. - -If the relevant napi has been scheduled and the napi_disable() -kicks in before the next napi_threaded_wait() completes - so -that the latter quits due to the napi_disable_pending() condition, -the existing code leaves the NAPI_STATE_SCHED bit set and the -napi_disable() loop waiting for such bit will hang. - -This patch addresses the issue by dropping the NAPI_STATE_DISABLE -bit test in napi_thread_wait(). The later napi_threaded_poll() -iteration will take care of clearing the NAPI_STATE_SCHED. - -This also addresses a related problem reported by Jakub: -before this patch a napi_disable()/napi_enable() pair killed -the napi thread, effectively disabling the threaded mode. -On the patched kernel napi_disable() simply stops scheduling -the relevant thread. - -v1 -> v2: - - let the main napi_thread_poll() loop clear the SCHED bit - -Reported-by: Jakub Kicinski -Fixes: 29863d41bb6e ("net: implement threaded-able napi poll loop support") -Signed-off-by: Paolo Abeni -Reviewed-by: Eric Dumazet -Link: https://lore.kernel.org/r/883923fa22745a9589e8610962b7dc59df09fb1f.1617981844.git.pabeni@redhat.com -Signed-off-by: Jakub Kicinski ---- - ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -7011,7 +7011,7 @@ static int napi_thread_wait(struct napi_ - - set_current_state(TASK_INTERRUPTIBLE); - -- while (!kthread_should_stop() && !napi_disable_pending(napi)) { -+ while (!kthread_should_stop()) { - /* Testing SCHED_THREADED bit here to make sure the current - * kthread owns this napi and could poll on this napi. - * Testing SCHED bit is not enough because SCHED bit might be -@@ -7029,6 +7029,7 @@ static int napi_thread_wait(struct napi_ - set_current_state(TASK_INTERRUPTIBLE); - } - __set_current_state(TASK_RUNNING); -+ - return -1; - } - diff --git a/target/linux/generic/backport-5.10/610-v5.13-00-netfilter-flowtable-add-hash-offset-field-to-tuple.patch b/target/linux/generic/backport-5.10/610-v5.13-00-netfilter-flowtable-add-hash-offset-field-to-tuple.patch deleted file mode 100644 index c881ccfcb0..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-00-netfilter-flowtable-add-hash-offset-field-to-tuple.patch +++ /dev/null @@ -1,52 +0,0 @@ -From: Pablo Neira Ayuso -Date: Fri, 20 Nov 2020 13:49:13 +0100 -Subject: [PATCH] netfilter: flowtable: add hash offset field to tuple - -Add a placeholder field to calculate hash tuple offset. Similar to -2c407aca6497 ("netfilter: conntrack: avoid gcc-10 zero-length-bounds -warning"). - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -107,6 +107,10 @@ struct flow_offload_tuple { - - u8 l3proto; - u8 l4proto; -+ -+ /* All members above are keys for lookups, see flow_offload_hash(). */ -+ struct { } __hash; -+ - u8 dir; - - u16 mtu; ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -191,14 +191,14 @@ static u32 flow_offload_hash(const void - { - const struct flow_offload_tuple *tuple = data; - -- return jhash(tuple, offsetof(struct flow_offload_tuple, dir), seed); -+ return jhash(tuple, offsetof(struct flow_offload_tuple, __hash), seed); - } - - static u32 flow_offload_hash_obj(const void *data, u32 len, u32 seed) - { - const struct flow_offload_tuple_rhash *tuplehash = data; - -- return jhash(&tuplehash->tuple, offsetof(struct flow_offload_tuple, dir), seed); -+ return jhash(&tuplehash->tuple, offsetof(struct flow_offload_tuple, __hash), seed); - } - - static int flow_offload_hash_cmp(struct rhashtable_compare_arg *arg, -@@ -207,7 +207,7 @@ static int flow_offload_hash_cmp(struct - const struct flow_offload_tuple *tuple = arg->key; - const struct flow_offload_tuple_rhash *x = ptr; - -- if (memcmp(&x->tuple, tuple, offsetof(struct flow_offload_tuple, dir))) -+ if (memcmp(&x->tuple, tuple, offsetof(struct flow_offload_tuple, __hash))) - return 1; - - return 0; diff --git a/target/linux/generic/backport-5.10/610-v5.13-01-netfilter-flowtable-separate-replace-destroy-and-sta.patch b/target/linux/generic/backport-5.10/610-v5.13-01-netfilter-flowtable-separate-replace-destroy-and-sta.patch deleted file mode 100644 index 478a2e0ec2..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-01-netfilter-flowtable-separate-replace-destroy-and-sta.patch +++ /dev/null @@ -1,98 +0,0 @@ -From: Oz Shlomo -Date: Tue, 23 Mar 2021 00:56:19 +0100 -Subject: [PATCH] netfilter: flowtable: separate replace, destroy and - stats to different workqueues - -Currently the flow table offload replace, destroy and stats work items are -executed on a single workqueue. As such, DESTROY and STATS commands may -be backloged after a burst of REPLACE work items. This scenario can bloat -up memory and may cause active connections to age. - -Instatiate add, del and stats workqueues to avoid backlogs of non-dependent -actions. Provide sysfs control over the workqueue attributes, allowing -userspace applications to control the workqueue cpumask. - -Signed-off-by: Oz Shlomo -Reviewed-by: Paul Blakey -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nf_flow_table_offload.c -+++ b/net/netfilter/nf_flow_table_offload.c -@@ -13,7 +13,9 @@ - #include - #include - --static struct workqueue_struct *nf_flow_offload_wq; -+static struct workqueue_struct *nf_flow_offload_add_wq; -+static struct workqueue_struct *nf_flow_offload_del_wq; -+static struct workqueue_struct *nf_flow_offload_stats_wq; - - struct flow_offload_work { - struct list_head list; -@@ -827,7 +829,12 @@ static void flow_offload_work_handler(st - - static void flow_offload_queue_work(struct flow_offload_work *offload) - { -- queue_work(nf_flow_offload_wq, &offload->work); -+ if (offload->cmd == FLOW_CLS_REPLACE) -+ queue_work(nf_flow_offload_add_wq, &offload->work); -+ else if (offload->cmd == FLOW_CLS_DESTROY) -+ queue_work(nf_flow_offload_del_wq, &offload->work); -+ else -+ queue_work(nf_flow_offload_stats_wq, &offload->work); - } - - static struct flow_offload_work * -@@ -899,8 +906,11 @@ void nf_flow_offload_stats(struct nf_flo - - void nf_flow_table_offload_flush(struct nf_flowtable *flowtable) - { -- if (nf_flowtable_hw_offload(flowtable)) -- flush_workqueue(nf_flow_offload_wq); -+ if (nf_flowtable_hw_offload(flowtable)) { -+ flush_workqueue(nf_flow_offload_add_wq); -+ flush_workqueue(nf_flow_offload_del_wq); -+ flush_workqueue(nf_flow_offload_stats_wq); -+ } - } - - static int nf_flow_table_block_setup(struct nf_flowtable *flowtable, -@@ -1017,15 +1027,33 @@ EXPORT_SYMBOL_GPL(nf_flow_table_offload_ - - int nf_flow_table_offload_init(void) - { -- nf_flow_offload_wq = alloc_workqueue("nf_flow_table_offload", -- WQ_UNBOUND, 0); -- if (!nf_flow_offload_wq) -+ nf_flow_offload_add_wq = alloc_workqueue("nf_ft_offload_add", -+ WQ_UNBOUND | WQ_SYSFS, 0); -+ if (!nf_flow_offload_add_wq) - return -ENOMEM; - -+ nf_flow_offload_del_wq = alloc_workqueue("nf_ft_offload_del", -+ WQ_UNBOUND | WQ_SYSFS, 0); -+ if (!nf_flow_offload_del_wq) -+ goto err_del_wq; -+ -+ nf_flow_offload_stats_wq = alloc_workqueue("nf_ft_offload_stats", -+ WQ_UNBOUND | WQ_SYSFS, 0); -+ if (!nf_flow_offload_stats_wq) -+ goto err_stats_wq; -+ - return 0; -+ -+err_stats_wq: -+ destroy_workqueue(nf_flow_offload_del_wq); -+err_del_wq: -+ destroy_workqueue(nf_flow_offload_add_wq); -+ return -ENOMEM; - } - - void nf_flow_table_offload_exit(void) - { -- destroy_workqueue(nf_flow_offload_wq); -+ destroy_workqueue(nf_flow_offload_add_wq); -+ destroy_workqueue(nf_flow_offload_del_wq); -+ destroy_workqueue(nf_flow_offload_stats_wq); - } diff --git a/target/linux/generic/backport-5.10/610-v5.13-03-netfilter-conntrack-Remove-unused-variable-declarati.patch b/target/linux/generic/backport-5.10/610-v5.13-03-netfilter-conntrack-Remove-unused-variable-declarati.patch deleted file mode 100644 index 37e80d989d..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-03-netfilter-conntrack-Remove-unused-variable-declarati.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: YueHaibing -Date: Tue, 23 Mar 2021 00:56:21 +0100 -Subject: [PATCH] netfilter: conntrack: Remove unused variable - declaration - -commit e97c3e278e95 ("tproxy: split off ipv6 defragmentation to a separate -module") left behind this. - -Signed-off-by: YueHaibing -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/ipv6/nf_conntrack_ipv6.h -+++ b/include/net/netfilter/ipv6/nf_conntrack_ipv6.h -@@ -4,7 +4,4 @@ - - extern const struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6; - --#include --extern struct ctl_table nf_ct_ipv6_sysctl_table[]; -- - #endif /* _NF_CONNTRACK_IPV6_H*/ diff --git a/target/linux/generic/backport-5.10/610-v5.13-04-netfilter-flowtable-consolidate-skb_try_make_writabl.patch b/target/linux/generic/backport-5.10/610-v5.13-04-netfilter-flowtable-consolidate-skb_try_make_writabl.patch deleted file mode 100644 index 9fd01b465e..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-04-netfilter-flowtable-consolidate-skb_try_make_writabl.patch +++ /dev/null @@ -1,291 +0,0 @@ -From: Pablo Neira Ayuso -Date: Tue, 23 Mar 2021 00:56:22 +0100 -Subject: [PATCH] netfilter: flowtable: consolidate - skb_try_make_writable() call - -Fetch the layer 4 header size to be mangled by NAT when building the -tuple, then use it to make writable the network and the transport -headers. After this update, the NAT routines now assumes that the skbuff -area is writable. Do the pointer refetch only after the single -skb_try_make_writable() call. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -394,9 +394,6 @@ static int nf_flow_nat_port_tcp(struct s - { - struct tcphdr *tcph; - -- if (skb_try_make_writable(skb, thoff + sizeof(*tcph))) -- return -1; -- - tcph = (void *)(skb_network_header(skb) + thoff); - inet_proto_csum_replace2(&tcph->check, skb, port, new_port, false); - -@@ -408,9 +405,6 @@ static int nf_flow_nat_port_udp(struct s - { - struct udphdr *udph; - -- if (skb_try_make_writable(skb, thoff + sizeof(*udph))) -- return -1; -- - udph = (void *)(skb_network_header(skb) + thoff); - if (udph->check || skb->ip_summed == CHECKSUM_PARTIAL) { - inet_proto_csum_replace2(&udph->check, skb, port, -@@ -446,9 +440,6 @@ int nf_flow_snat_port(const struct flow_ - struct flow_ports *hdr; - __be16 port, new_port; - -- if (skb_try_make_writable(skb, thoff + sizeof(*hdr))) -- return -1; -- - hdr = (void *)(skb_network_header(skb) + thoff); - - switch (dir) { -@@ -477,9 +468,6 @@ int nf_flow_dnat_port(const struct flow_ - struct flow_ports *hdr; - __be16 port, new_port; - -- if (skb_try_make_writable(skb, thoff + sizeof(*hdr))) -- return -1; -- - hdr = (void *)(skb_network_header(skb) + thoff); - - switch (dir) { ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -39,9 +39,6 @@ static int nf_flow_nat_ip_tcp(struct sk_ - { - struct tcphdr *tcph; - -- if (skb_try_make_writable(skb, thoff + sizeof(*tcph))) -- return -1; -- - tcph = (void *)(skb_network_header(skb) + thoff); - inet_proto_csum_replace4(&tcph->check, skb, addr, new_addr, true); - -@@ -53,9 +50,6 @@ static int nf_flow_nat_ip_udp(struct sk_ - { - struct udphdr *udph; - -- if (skb_try_make_writable(skb, thoff + sizeof(*udph))) -- return -1; -- - udph = (void *)(skb_network_header(skb) + thoff); - if (udph->check || skb->ip_summed == CHECKSUM_PARTIAL) { - inet_proto_csum_replace4(&udph->check, skb, addr, -@@ -136,19 +130,17 @@ static int nf_flow_dnat_ip(const struct - } - - static int nf_flow_nat_ip(const struct flow_offload *flow, struct sk_buff *skb, -- unsigned int thoff, enum flow_offload_tuple_dir dir) -+ unsigned int thoff, enum flow_offload_tuple_dir dir, -+ struct iphdr *iph) - { -- struct iphdr *iph = ip_hdr(skb); -- - if (test_bit(NF_FLOW_SNAT, &flow->flags) && - (nf_flow_snat_port(flow, skb, thoff, iph->protocol, dir) < 0 || -- nf_flow_snat_ip(flow, skb, ip_hdr(skb), thoff, dir) < 0)) -+ nf_flow_snat_ip(flow, skb, iph, thoff, dir) < 0)) - return -1; - -- iph = ip_hdr(skb); - if (test_bit(NF_FLOW_DNAT, &flow->flags) && - (nf_flow_dnat_port(flow, skb, thoff, iph->protocol, dir) < 0 || -- nf_flow_dnat_ip(flow, skb, ip_hdr(skb), thoff, dir) < 0)) -+ nf_flow_dnat_ip(flow, skb, iph, thoff, dir) < 0)) - return -1; - - return 0; -@@ -160,10 +152,10 @@ static bool ip_has_options(unsigned int - } - - static int nf_flow_tuple_ip(struct sk_buff *skb, const struct net_device *dev, -- struct flow_offload_tuple *tuple) -+ struct flow_offload_tuple *tuple, u32 *hdrsize) - { -- unsigned int thoff, hdrsize; - struct flow_ports *ports; -+ unsigned int thoff; - struct iphdr *iph; - - if (!pskb_may_pull(skb, sizeof(*iph))) -@@ -178,10 +170,10 @@ static int nf_flow_tuple_ip(struct sk_bu - - switch (iph->protocol) { - case IPPROTO_TCP: -- hdrsize = sizeof(struct tcphdr); -+ *hdrsize = sizeof(struct tcphdr); - break; - case IPPROTO_UDP: -- hdrsize = sizeof(struct udphdr); -+ *hdrsize = sizeof(struct udphdr); - break; - default: - return -1; -@@ -191,7 +183,7 @@ static int nf_flow_tuple_ip(struct sk_bu - return -1; - - thoff = iph->ihl * 4; -- if (!pskb_may_pull(skb, thoff + hdrsize)) -+ if (!pskb_may_pull(skb, thoff + *hdrsize)) - return -1; - - iph = ip_hdr(skb); -@@ -252,11 +244,12 @@ nf_flow_offload_ip_hook(void *priv, stru - unsigned int thoff; - struct iphdr *iph; - __be32 nexthop; -+ u32 hdrsize; - - if (skb->protocol != htons(ETH_P_IP)) - return NF_ACCEPT; - -- if (nf_flow_tuple_ip(skb, state->in, &tuple) < 0) -+ if (nf_flow_tuple_ip(skb, state->in, &tuple, &hdrsize) < 0) - return NF_ACCEPT; - - tuplehash = flow_offload_lookup(flow_table, &tuple); -@@ -271,11 +264,13 @@ nf_flow_offload_ip_hook(void *priv, stru - if (unlikely(nf_flow_exceeds_mtu(skb, flow->tuplehash[dir].tuple.mtu))) - return NF_ACCEPT; - -- if (skb_try_make_writable(skb, sizeof(*iph))) -+ iph = ip_hdr(skb); -+ thoff = iph->ihl * 4; -+ if (skb_try_make_writable(skb, thoff + hdrsize)) - return NF_DROP; - -- thoff = ip_hdr(skb)->ihl * 4; -- if (nf_flow_state_check(flow, ip_hdr(skb)->protocol, skb, thoff)) -+ iph = ip_hdr(skb); -+ if (nf_flow_state_check(flow, iph->protocol, skb, thoff)) - return NF_ACCEPT; - - flow_offload_refresh(flow_table, flow); -@@ -285,10 +280,9 @@ nf_flow_offload_ip_hook(void *priv, stru - return NF_ACCEPT; - } - -- if (nf_flow_nat_ip(flow, skb, thoff, dir) < 0) -+ if (nf_flow_nat_ip(flow, skb, thoff, dir, iph) < 0) - return NF_DROP; - -- iph = ip_hdr(skb); - ip_decrease_ttl(iph); - skb->tstamp = 0; - -@@ -317,9 +311,6 @@ static int nf_flow_nat_ipv6_tcp(struct s - { - struct tcphdr *tcph; - -- if (skb_try_make_writable(skb, thoff + sizeof(*tcph))) -- return -1; -- - tcph = (void *)(skb_network_header(skb) + thoff); - inet_proto_csum_replace16(&tcph->check, skb, addr->s6_addr32, - new_addr->s6_addr32, true); -@@ -333,9 +324,6 @@ static int nf_flow_nat_ipv6_udp(struct s - { - struct udphdr *udph; - -- if (skb_try_make_writable(skb, thoff + sizeof(*udph))) -- return -1; -- - udph = (void *)(skb_network_header(skb) + thoff); - if (udph->check || skb->ip_summed == CHECKSUM_PARTIAL) { - inet_proto_csum_replace16(&udph->check, skb, addr->s6_addr32, -@@ -417,31 +405,30 @@ static int nf_flow_dnat_ipv6(const struc - - static int nf_flow_nat_ipv6(const struct flow_offload *flow, - struct sk_buff *skb, -- enum flow_offload_tuple_dir dir) -+ enum flow_offload_tuple_dir dir, -+ struct ipv6hdr *ip6h) - { -- struct ipv6hdr *ip6h = ipv6_hdr(skb); - unsigned int thoff = sizeof(*ip6h); - - if (test_bit(NF_FLOW_SNAT, &flow->flags) && - (nf_flow_snat_port(flow, skb, thoff, ip6h->nexthdr, dir) < 0 || -- nf_flow_snat_ipv6(flow, skb, ipv6_hdr(skb), thoff, dir) < 0)) -+ nf_flow_snat_ipv6(flow, skb, ip6h, thoff, dir) < 0)) - return -1; - -- ip6h = ipv6_hdr(skb); - if (test_bit(NF_FLOW_DNAT, &flow->flags) && - (nf_flow_dnat_port(flow, skb, thoff, ip6h->nexthdr, dir) < 0 || -- nf_flow_dnat_ipv6(flow, skb, ipv6_hdr(skb), thoff, dir) < 0)) -+ nf_flow_dnat_ipv6(flow, skb, ip6h, thoff, dir) < 0)) - return -1; - - return 0; - } - - static int nf_flow_tuple_ipv6(struct sk_buff *skb, const struct net_device *dev, -- struct flow_offload_tuple *tuple) -+ struct flow_offload_tuple *tuple, u32 *hdrsize) - { -- unsigned int thoff, hdrsize; - struct flow_ports *ports; - struct ipv6hdr *ip6h; -+ unsigned int thoff; - - if (!pskb_may_pull(skb, sizeof(*ip6h))) - return -1; -@@ -450,10 +437,10 @@ static int nf_flow_tuple_ipv6(struct sk_ - - switch (ip6h->nexthdr) { - case IPPROTO_TCP: -- hdrsize = sizeof(struct tcphdr); -+ *hdrsize = sizeof(struct tcphdr); - break; - case IPPROTO_UDP: -- hdrsize = sizeof(struct udphdr); -+ *hdrsize = sizeof(struct udphdr); - break; - default: - return -1; -@@ -463,7 +450,7 @@ static int nf_flow_tuple_ipv6(struct sk_ - return -1; - - thoff = sizeof(*ip6h); -- if (!pskb_may_pull(skb, thoff + hdrsize)) -+ if (!pskb_may_pull(skb, thoff + *hdrsize)) - return -1; - - ip6h = ipv6_hdr(skb); -@@ -493,11 +480,12 @@ nf_flow_offload_ipv6_hook(void *priv, st - struct net_device *outdev; - struct ipv6hdr *ip6h; - struct rt6_info *rt; -+ u32 hdrsize; - - if (skb->protocol != htons(ETH_P_IPV6)) - return NF_ACCEPT; - -- if (nf_flow_tuple_ipv6(skb, state->in, &tuple) < 0) -+ if (nf_flow_tuple_ipv6(skb, state->in, &tuple, &hdrsize) < 0) - return NF_ACCEPT; - - tuplehash = flow_offload_lookup(flow_table, &tuple); -@@ -523,13 +511,13 @@ nf_flow_offload_ipv6_hook(void *priv, st - return NF_ACCEPT; - } - -- if (skb_try_make_writable(skb, sizeof(*ip6h))) -+ if (skb_try_make_writable(skb, sizeof(*ip6h) + hdrsize)) - return NF_DROP; - -- if (nf_flow_nat_ipv6(flow, skb, dir) < 0) -+ ip6h = ipv6_hdr(skb); -+ if (nf_flow_nat_ipv6(flow, skb, dir, ip6h) < 0) - return NF_DROP; - -- ip6h = ipv6_hdr(skb); - ip6h->hop_limit--; - skb->tstamp = 0; - diff --git a/target/linux/generic/backport-5.10/610-v5.13-05-netfilter-flowtable-move-skb_try_make_writable-befor.patch b/target/linux/generic/backport-5.10/610-v5.13-05-netfilter-flowtable-move-skb_try_make_writable-befor.patch deleted file mode 100644 index 84e294de7a..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-05-netfilter-flowtable-move-skb_try_make_writable-befor.patch +++ /dev/null @@ -1,35 +0,0 @@ -From: Pablo Neira Ayuso -Date: Tue, 23 Mar 2021 00:56:23 +0100 -Subject: [PATCH] netfilter: flowtable: move skb_try_make_writable() - before NAT in IPv4 - -For consistency with the IPv6 flowtable datapath and to make sure the -skbuff is writable right before the NAT header updates. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -266,10 +266,6 @@ nf_flow_offload_ip_hook(void *priv, stru - - iph = ip_hdr(skb); - thoff = iph->ihl * 4; -- if (skb_try_make_writable(skb, thoff + hdrsize)) -- return NF_DROP; -- -- iph = ip_hdr(skb); - if (nf_flow_state_check(flow, iph->protocol, skb, thoff)) - return NF_ACCEPT; - -@@ -280,6 +276,10 @@ nf_flow_offload_ip_hook(void *priv, stru - return NF_ACCEPT; - } - -+ if (skb_try_make_writable(skb, thoff + hdrsize)) -+ return NF_DROP; -+ -+ iph = ip_hdr(skb); - if (nf_flow_nat_ip(flow, skb, thoff, dir, iph) < 0) - return NF_DROP; - diff --git a/target/linux/generic/backport-5.10/610-v5.13-06-netfilter-flowtable-move-FLOW_OFFLOAD_DIR_MAX-away-f.patch b/target/linux/generic/backport-5.10/610-v5.13-06-netfilter-flowtable-move-FLOW_OFFLOAD_DIR_MAX-away-f.patch deleted file mode 100644 index 64a0e42079..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-06-netfilter-flowtable-move-FLOW_OFFLOAD_DIR_MAX-away-f.patch +++ /dev/null @@ -1,82 +0,0 @@ -From: Pablo Neira Ayuso -Date: Tue, 23 Mar 2021 00:56:24 +0100 -Subject: [PATCH] netfilter: flowtable: move FLOW_OFFLOAD_DIR_MAX away - from enumeration - -This allows to remove the default case which should not ever happen and -that was added to avoid gcc warnings on unhandled FLOW_OFFLOAD_DIR_MAX -enumeration case. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -86,8 +86,8 @@ static inline bool nf_flowtable_hw_offlo - enum flow_offload_tuple_dir { - FLOW_OFFLOAD_DIR_ORIGINAL = IP_CT_DIR_ORIGINAL, - FLOW_OFFLOAD_DIR_REPLY = IP_CT_DIR_REPLY, -- FLOW_OFFLOAD_DIR_MAX = IP_CT_DIR_MAX - }; -+#define FLOW_OFFLOAD_DIR_MAX IP_CT_DIR_MAX - - struct flow_offload_tuple { - union { ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -453,8 +453,6 @@ int nf_flow_snat_port(const struct flow_ - new_port = flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple.src_port; - hdr->dest = new_port; - break; -- default: -- return -1; - } - - return nf_flow_nat_port(skb, thoff, protocol, port, new_port); -@@ -481,8 +479,6 @@ int nf_flow_dnat_port(const struct flow_ - new_port = flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple.dst_port; - hdr->source = new_port; - break; -- default: -- return -1; - } - - return nf_flow_nat_port(skb, thoff, protocol, port, new_port); ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -96,8 +96,6 @@ static int nf_flow_snat_ip(const struct - new_addr = flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple.src_v4.s_addr; - iph->daddr = new_addr; - break; -- default: -- return -1; - } - csum_replace4(&iph->check, addr, new_addr); - -@@ -121,8 +119,6 @@ static int nf_flow_dnat_ip(const struct - new_addr = flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple.dst_v4.s_addr; - iph->saddr = new_addr; - break; -- default: -- return -1; - } - csum_replace4(&iph->check, addr, new_addr); - -@@ -371,8 +367,6 @@ static int nf_flow_snat_ipv6(const struc - new_addr = flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple.src_v6; - ip6h->daddr = new_addr; - break; -- default: -- return -1; - } - - return nf_flow_nat_ipv6_l4proto(skb, ip6h, thoff, &addr, &new_addr); -@@ -396,8 +390,6 @@ static int nf_flow_dnat_ipv6(const struc - new_addr = flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple.dst_v6; - ip6h->saddr = new_addr; - break; -- default: -- return -1; - } - - return nf_flow_nat_ipv6_l4proto(skb, ip6h, thoff, &addr, &new_addr); diff --git a/target/linux/generic/backport-5.10/610-v5.13-07-netfilter-flowtable-fast-NAT-functions-never-fail.patch b/target/linux/generic/backport-5.10/610-v5.13-07-netfilter-flowtable-fast-NAT-functions-never-fail.patch deleted file mode 100644 index 2224e095c9..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-07-netfilter-flowtable-fast-NAT-functions-never-fail.patch +++ /dev/null @@ -1,394 +0,0 @@ -From: Pablo Neira Ayuso -Date: Tue, 23 Mar 2021 00:56:25 +0100 -Subject: [PATCH] netfilter: flowtable: fast NAT functions never fail - -Simplify existing fast NAT routines by returning void. After the -skb_try_make_writable() call consolidation, these routines cannot ever -fail. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -228,12 +228,12 @@ void nf_flow_table_free(struct nf_flowta - - void flow_offload_teardown(struct flow_offload *flow); - --int nf_flow_snat_port(const struct flow_offload *flow, -- struct sk_buff *skb, unsigned int thoff, -- u8 protocol, enum flow_offload_tuple_dir dir); --int nf_flow_dnat_port(const struct flow_offload *flow, -- struct sk_buff *skb, unsigned int thoff, -- u8 protocol, enum flow_offload_tuple_dir dir); -+void nf_flow_snat_port(const struct flow_offload *flow, -+ struct sk_buff *skb, unsigned int thoff, -+ u8 protocol, enum flow_offload_tuple_dir dir); -+void nf_flow_dnat_port(const struct flow_offload *flow, -+ struct sk_buff *skb, unsigned int thoff, -+ u8 protocol, enum flow_offload_tuple_dir dir); - - struct flow_ports { - __be16 source, dest; ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -388,20 +388,17 @@ static void nf_flow_offload_work_gc(stru - queue_delayed_work(system_power_efficient_wq, &flow_table->gc_work, HZ); - } - -- --static int nf_flow_nat_port_tcp(struct sk_buff *skb, unsigned int thoff, -- __be16 port, __be16 new_port) -+static void nf_flow_nat_port_tcp(struct sk_buff *skb, unsigned int thoff, -+ __be16 port, __be16 new_port) - { - struct tcphdr *tcph; - - tcph = (void *)(skb_network_header(skb) + thoff); - inet_proto_csum_replace2(&tcph->check, skb, port, new_port, false); -- -- return 0; - } - --static int nf_flow_nat_port_udp(struct sk_buff *skb, unsigned int thoff, -- __be16 port, __be16 new_port) -+static void nf_flow_nat_port_udp(struct sk_buff *skb, unsigned int thoff, -+ __be16 port, __be16 new_port) - { - struct udphdr *udph; - -@@ -412,30 +409,24 @@ static int nf_flow_nat_port_udp(struct s - if (!udph->check) - udph->check = CSUM_MANGLED_0; - } -- -- return 0; - } - --static int nf_flow_nat_port(struct sk_buff *skb, unsigned int thoff, -- u8 protocol, __be16 port, __be16 new_port) -+static void nf_flow_nat_port(struct sk_buff *skb, unsigned int thoff, -+ u8 protocol, __be16 port, __be16 new_port) - { - switch (protocol) { - case IPPROTO_TCP: -- if (nf_flow_nat_port_tcp(skb, thoff, port, new_port) < 0) -- return NF_DROP; -+ nf_flow_nat_port_tcp(skb, thoff, port, new_port); - break; - case IPPROTO_UDP: -- if (nf_flow_nat_port_udp(skb, thoff, port, new_port) < 0) -- return NF_DROP; -+ nf_flow_nat_port_udp(skb, thoff, port, new_port); - break; - } -- -- return 0; - } - --int nf_flow_snat_port(const struct flow_offload *flow, -- struct sk_buff *skb, unsigned int thoff, -- u8 protocol, enum flow_offload_tuple_dir dir) -+void nf_flow_snat_port(const struct flow_offload *flow, -+ struct sk_buff *skb, unsigned int thoff, -+ u8 protocol, enum flow_offload_tuple_dir dir) - { - struct flow_ports *hdr; - __be16 port, new_port; -@@ -455,13 +446,13 @@ int nf_flow_snat_port(const struct flow_ - break; - } - -- return nf_flow_nat_port(skb, thoff, protocol, port, new_port); -+ nf_flow_nat_port(skb, thoff, protocol, port, new_port); - } - EXPORT_SYMBOL_GPL(nf_flow_snat_port); - --int nf_flow_dnat_port(const struct flow_offload *flow, -- struct sk_buff *skb, unsigned int thoff, -- u8 protocol, enum flow_offload_tuple_dir dir) -+void nf_flow_dnat_port(const struct flow_offload *flow, struct sk_buff *skb, -+ unsigned int thoff, u8 protocol, -+ enum flow_offload_tuple_dir dir) - { - struct flow_ports *hdr; - __be16 port, new_port; -@@ -481,7 +472,7 @@ int nf_flow_dnat_port(const struct flow_ - break; - } - -- return nf_flow_nat_port(skb, thoff, protocol, port, new_port); -+ nf_flow_nat_port(skb, thoff, protocol, port, new_port); - } - EXPORT_SYMBOL_GPL(nf_flow_dnat_port); - ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -34,19 +34,17 @@ static int nf_flow_state_check(struct fl - return 0; - } - --static int nf_flow_nat_ip_tcp(struct sk_buff *skb, unsigned int thoff, -- __be32 addr, __be32 new_addr) -+static void nf_flow_nat_ip_tcp(struct sk_buff *skb, unsigned int thoff, -+ __be32 addr, __be32 new_addr) - { - struct tcphdr *tcph; - - tcph = (void *)(skb_network_header(skb) + thoff); - inet_proto_csum_replace4(&tcph->check, skb, addr, new_addr, true); -- -- return 0; - } - --static int nf_flow_nat_ip_udp(struct sk_buff *skb, unsigned int thoff, -- __be32 addr, __be32 new_addr) -+static void nf_flow_nat_ip_udp(struct sk_buff *skb, unsigned int thoff, -+ __be32 addr, __be32 new_addr) - { - struct udphdr *udph; - -@@ -57,31 +55,25 @@ static int nf_flow_nat_ip_udp(struct sk_ - if (!udph->check) - udph->check = CSUM_MANGLED_0; - } -- -- return 0; - } - --static int nf_flow_nat_ip_l4proto(struct sk_buff *skb, struct iphdr *iph, -- unsigned int thoff, __be32 addr, -- __be32 new_addr) -+static void nf_flow_nat_ip_l4proto(struct sk_buff *skb, struct iphdr *iph, -+ unsigned int thoff, __be32 addr, -+ __be32 new_addr) - { - switch (iph->protocol) { - case IPPROTO_TCP: -- if (nf_flow_nat_ip_tcp(skb, thoff, addr, new_addr) < 0) -- return NF_DROP; -+ nf_flow_nat_ip_tcp(skb, thoff, addr, new_addr); - break; - case IPPROTO_UDP: -- if (nf_flow_nat_ip_udp(skb, thoff, addr, new_addr) < 0) -- return NF_DROP; -+ nf_flow_nat_ip_udp(skb, thoff, addr, new_addr); - break; - } -- -- return 0; - } - --static int nf_flow_snat_ip(const struct flow_offload *flow, struct sk_buff *skb, -- struct iphdr *iph, unsigned int thoff, -- enum flow_offload_tuple_dir dir) -+static void nf_flow_snat_ip(const struct flow_offload *flow, -+ struct sk_buff *skb, struct iphdr *iph, -+ unsigned int thoff, enum flow_offload_tuple_dir dir) - { - __be32 addr, new_addr; - -@@ -99,12 +91,12 @@ static int nf_flow_snat_ip(const struct - } - csum_replace4(&iph->check, addr, new_addr); - -- return nf_flow_nat_ip_l4proto(skb, iph, thoff, addr, new_addr); -+ nf_flow_nat_ip_l4proto(skb, iph, thoff, addr, new_addr); - } - --static int nf_flow_dnat_ip(const struct flow_offload *flow, struct sk_buff *skb, -- struct iphdr *iph, unsigned int thoff, -- enum flow_offload_tuple_dir dir) -+static void nf_flow_dnat_ip(const struct flow_offload *flow, -+ struct sk_buff *skb, struct iphdr *iph, -+ unsigned int thoff, enum flow_offload_tuple_dir dir) - { - __be32 addr, new_addr; - -@@ -122,24 +114,21 @@ static int nf_flow_dnat_ip(const struct - } - csum_replace4(&iph->check, addr, new_addr); - -- return nf_flow_nat_ip_l4proto(skb, iph, thoff, addr, new_addr); -+ nf_flow_nat_ip_l4proto(skb, iph, thoff, addr, new_addr); - } - --static int nf_flow_nat_ip(const struct flow_offload *flow, struct sk_buff *skb, -+static void nf_flow_nat_ip(const struct flow_offload *flow, struct sk_buff *skb, - unsigned int thoff, enum flow_offload_tuple_dir dir, - struct iphdr *iph) - { -- if (test_bit(NF_FLOW_SNAT, &flow->flags) && -- (nf_flow_snat_port(flow, skb, thoff, iph->protocol, dir) < 0 || -- nf_flow_snat_ip(flow, skb, iph, thoff, dir) < 0)) -- return -1; -- -- if (test_bit(NF_FLOW_DNAT, &flow->flags) && -- (nf_flow_dnat_port(flow, skb, thoff, iph->protocol, dir) < 0 || -- nf_flow_dnat_ip(flow, skb, iph, thoff, dir) < 0)) -- return -1; -- -- return 0; -+ if (test_bit(NF_FLOW_SNAT, &flow->flags)) { -+ nf_flow_snat_port(flow, skb, thoff, iph->protocol, dir); -+ nf_flow_snat_ip(flow, skb, iph, thoff, dir); -+ } -+ if (test_bit(NF_FLOW_DNAT, &flow->flags)) { -+ nf_flow_dnat_port(flow, skb, thoff, iph->protocol, dir); -+ nf_flow_dnat_ip(flow, skb, iph, thoff, dir); -+ } - } - - static bool ip_has_options(unsigned int thoff) -@@ -276,8 +265,7 @@ nf_flow_offload_ip_hook(void *priv, stru - return NF_DROP; - - iph = ip_hdr(skb); -- if (nf_flow_nat_ip(flow, skb, thoff, dir, iph) < 0) -- return NF_DROP; -+ nf_flow_nat_ip(flow, skb, thoff, dir, iph); - - ip_decrease_ttl(iph); - skb->tstamp = 0; -@@ -301,22 +289,21 @@ nf_flow_offload_ip_hook(void *priv, stru - } - EXPORT_SYMBOL_GPL(nf_flow_offload_ip_hook); - --static int nf_flow_nat_ipv6_tcp(struct sk_buff *skb, unsigned int thoff, -- struct in6_addr *addr, -- struct in6_addr *new_addr) -+static void nf_flow_nat_ipv6_tcp(struct sk_buff *skb, unsigned int thoff, -+ struct in6_addr *addr, -+ struct in6_addr *new_addr, -+ struct ipv6hdr *ip6h) - { - struct tcphdr *tcph; - - tcph = (void *)(skb_network_header(skb) + thoff); - inet_proto_csum_replace16(&tcph->check, skb, addr->s6_addr32, - new_addr->s6_addr32, true); -- -- return 0; - } - --static int nf_flow_nat_ipv6_udp(struct sk_buff *skb, unsigned int thoff, -- struct in6_addr *addr, -- struct in6_addr *new_addr) -+static void nf_flow_nat_ipv6_udp(struct sk_buff *skb, unsigned int thoff, -+ struct in6_addr *addr, -+ struct in6_addr *new_addr) - { - struct udphdr *udph; - -@@ -327,32 +314,26 @@ static int nf_flow_nat_ipv6_udp(struct s - if (!udph->check) - udph->check = CSUM_MANGLED_0; - } -- -- return 0; - } - --static int nf_flow_nat_ipv6_l4proto(struct sk_buff *skb, struct ipv6hdr *ip6h, -- unsigned int thoff, struct in6_addr *addr, -- struct in6_addr *new_addr) -+static void nf_flow_nat_ipv6_l4proto(struct sk_buff *skb, struct ipv6hdr *ip6h, -+ unsigned int thoff, struct in6_addr *addr, -+ struct in6_addr *new_addr) - { - switch (ip6h->nexthdr) { - case IPPROTO_TCP: -- if (nf_flow_nat_ipv6_tcp(skb, thoff, addr, new_addr) < 0) -- return NF_DROP; -+ nf_flow_nat_ipv6_tcp(skb, thoff, addr, new_addr, ip6h); - break; - case IPPROTO_UDP: -- if (nf_flow_nat_ipv6_udp(skb, thoff, addr, new_addr) < 0) -- return NF_DROP; -+ nf_flow_nat_ipv6_udp(skb, thoff, addr, new_addr); - break; - } -- -- return 0; - } - --static int nf_flow_snat_ipv6(const struct flow_offload *flow, -- struct sk_buff *skb, struct ipv6hdr *ip6h, -- unsigned int thoff, -- enum flow_offload_tuple_dir dir) -+static void nf_flow_snat_ipv6(const struct flow_offload *flow, -+ struct sk_buff *skb, struct ipv6hdr *ip6h, -+ unsigned int thoff, -+ enum flow_offload_tuple_dir dir) - { - struct in6_addr addr, new_addr; - -@@ -369,13 +350,13 @@ static int nf_flow_snat_ipv6(const struc - break; - } - -- return nf_flow_nat_ipv6_l4proto(skb, ip6h, thoff, &addr, &new_addr); -+ nf_flow_nat_ipv6_l4proto(skb, ip6h, thoff, &addr, &new_addr); - } - --static int nf_flow_dnat_ipv6(const struct flow_offload *flow, -- struct sk_buff *skb, struct ipv6hdr *ip6h, -- unsigned int thoff, -- enum flow_offload_tuple_dir dir) -+static void nf_flow_dnat_ipv6(const struct flow_offload *flow, -+ struct sk_buff *skb, struct ipv6hdr *ip6h, -+ unsigned int thoff, -+ enum flow_offload_tuple_dir dir) - { - struct in6_addr addr, new_addr; - -@@ -392,27 +373,24 @@ static int nf_flow_dnat_ipv6(const struc - break; - } - -- return nf_flow_nat_ipv6_l4proto(skb, ip6h, thoff, &addr, &new_addr); -+ nf_flow_nat_ipv6_l4proto(skb, ip6h, thoff, &addr, &new_addr); - } - --static int nf_flow_nat_ipv6(const struct flow_offload *flow, -- struct sk_buff *skb, -- enum flow_offload_tuple_dir dir, -- struct ipv6hdr *ip6h) -+static void nf_flow_nat_ipv6(const struct flow_offload *flow, -+ struct sk_buff *skb, -+ enum flow_offload_tuple_dir dir, -+ struct ipv6hdr *ip6h) - { - unsigned int thoff = sizeof(*ip6h); - -- if (test_bit(NF_FLOW_SNAT, &flow->flags) && -- (nf_flow_snat_port(flow, skb, thoff, ip6h->nexthdr, dir) < 0 || -- nf_flow_snat_ipv6(flow, skb, ip6h, thoff, dir) < 0)) -- return -1; -- -- if (test_bit(NF_FLOW_DNAT, &flow->flags) && -- (nf_flow_dnat_port(flow, skb, thoff, ip6h->nexthdr, dir) < 0 || -- nf_flow_dnat_ipv6(flow, skb, ip6h, thoff, dir) < 0)) -- return -1; -- -- return 0; -+ if (test_bit(NF_FLOW_SNAT, &flow->flags)) { -+ nf_flow_snat_port(flow, skb, thoff, ip6h->nexthdr, dir); -+ nf_flow_snat_ipv6(flow, skb, ip6h, thoff, dir); -+ } -+ if (test_bit(NF_FLOW_DNAT, &flow->flags)) { -+ nf_flow_dnat_port(flow, skb, thoff, ip6h->nexthdr, dir); -+ nf_flow_dnat_ipv6(flow, skb, ip6h, thoff, dir); -+ } - } - - static int nf_flow_tuple_ipv6(struct sk_buff *skb, const struct net_device *dev, -@@ -507,8 +485,7 @@ nf_flow_offload_ipv6_hook(void *priv, st - return NF_DROP; - - ip6h = ipv6_hdr(skb); -- if (nf_flow_nat_ipv6(flow, skb, dir, ip6h) < 0) -- return NF_DROP; -+ nf_flow_nat_ipv6(flow, skb, dir, ip6h); - - ip6h->hop_limit--; - skb->tstamp = 0; diff --git a/target/linux/generic/backport-5.10/610-v5.13-08-netfilter-flowtable-call-dst_check-to-fall-back-to-c.patch b/target/linux/generic/backport-5.10/610-v5.13-08-netfilter-flowtable-call-dst_check-to-fall-back-to-c.patch deleted file mode 100644 index 276785030d..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-08-netfilter-flowtable-call-dst_check-to-fall-back-to-c.patch +++ /dev/null @@ -1,46 +0,0 @@ -From: Pablo Neira Ayuso -Date: Tue, 23 Mar 2021 00:56:26 +0100 -Subject: [PATCH] netfilter: flowtable: call dst_check() to fall back to - classic forwarding - -In case the route is stale, pass up the packet to the classic forwarding -path for re-evaluation and schedule this flow entry for removal. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -197,14 +197,6 @@ static bool nf_flow_exceeds_mtu(const st - return true; - } - --static int nf_flow_offload_dst_check(struct dst_entry *dst) --{ -- if (unlikely(dst_xfrm(dst))) -- return dst_check(dst, 0) ? 0 : -1; -- -- return 0; --} -- - static unsigned int nf_flow_xmit_xfrm(struct sk_buff *skb, - const struct nf_hook_state *state, - struct dst_entry *dst) -@@ -256,7 +248,7 @@ nf_flow_offload_ip_hook(void *priv, stru - - flow_offload_refresh(flow_table, flow); - -- if (nf_flow_offload_dst_check(&rt->dst)) { -+ if (!dst_check(&rt->dst, 0)) { - flow_offload_teardown(flow); - return NF_ACCEPT; - } -@@ -476,7 +468,7 @@ nf_flow_offload_ipv6_hook(void *priv, st - - flow_offload_refresh(flow_table, flow); - -- if (nf_flow_offload_dst_check(&rt->dst)) { -+ if (!dst_check(&rt->dst, 0)) { - flow_offload_teardown(flow); - return NF_ACCEPT; - } diff --git a/target/linux/generic/backport-5.10/610-v5.13-09-netfilter-flowtable-refresh-timeout-after-dst-and-wr.patch b/target/linux/generic/backport-5.10/610-v5.13-09-netfilter-flowtable-refresh-timeout-after-dst-and-wr.patch deleted file mode 100644 index 14ac2ee295..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-09-netfilter-flowtable-refresh-timeout-after-dst-and-wr.patch +++ /dev/null @@ -1,49 +0,0 @@ -From: Pablo Neira Ayuso -Date: Tue, 23 Mar 2021 00:56:27 +0100 -Subject: [PATCH] netfilter: flowtable: refresh timeout after dst and - writable checks - -Refresh the timeout (and retry hardware offload) once the skbuff dst -is confirmed to be current and after the skbuff is made writable. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -246,8 +246,6 @@ nf_flow_offload_ip_hook(void *priv, stru - if (nf_flow_state_check(flow, iph->protocol, skb, thoff)) - return NF_ACCEPT; - -- flow_offload_refresh(flow_table, flow); -- - if (!dst_check(&rt->dst, 0)) { - flow_offload_teardown(flow); - return NF_ACCEPT; -@@ -256,6 +254,8 @@ nf_flow_offload_ip_hook(void *priv, stru - if (skb_try_make_writable(skb, thoff + hdrsize)) - return NF_DROP; - -+ flow_offload_refresh(flow_table, flow); -+ - iph = ip_hdr(skb); - nf_flow_nat_ip(flow, skb, thoff, dir, iph); - -@@ -466,8 +466,6 @@ nf_flow_offload_ipv6_hook(void *priv, st - sizeof(*ip6h))) - return NF_ACCEPT; - -- flow_offload_refresh(flow_table, flow); -- - if (!dst_check(&rt->dst, 0)) { - flow_offload_teardown(flow); - return NF_ACCEPT; -@@ -476,6 +474,8 @@ nf_flow_offload_ipv6_hook(void *priv, st - if (skb_try_make_writable(skb, sizeof(*ip6h) + hdrsize)) - return NF_DROP; - -+ flow_offload_refresh(flow_table, flow); -+ - ip6h = ipv6_hdr(skb); - nf_flow_nat_ipv6(flow, skb, dir, ip6h); - diff --git a/target/linux/generic/backport-5.10/610-v5.13-10-netfilter-nftables-update-table-flags-from-the-commi.patch b/target/linux/generic/backport-5.10/610-v5.13-10-netfilter-nftables-update-table-flags-from-the-commi.patch deleted file mode 100644 index 964a94a58a..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-10-netfilter-nftables-update-table-flags-from-the-commi.patch +++ /dev/null @@ -1,103 +0,0 @@ -From: Pablo Neira Ayuso -Date: Tue, 23 Mar 2021 00:56:28 +0100 -Subject: [PATCH] netfilter: nftables: update table flags from the commit - phase - -Do not update table flags from the preparation phase. Store the flags -update into the transaction, then update the flags from the commit -phase. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/nf_tables.h -+++ b/include/net/netfilter/nf_tables.h -@@ -1474,13 +1474,16 @@ struct nft_trans_chain { - - struct nft_trans_table { - bool update; -- bool enable; -+ u8 state; -+ u32 flags; - }; - - #define nft_trans_table_update(trans) \ - (((struct nft_trans_table *)trans->data)->update) --#define nft_trans_table_enable(trans) \ -- (((struct nft_trans_table *)trans->data)->enable) -+#define nft_trans_table_state(trans) \ -+ (((struct nft_trans_table *)trans->data)->state) -+#define nft_trans_table_flags(trans) \ -+ (((struct nft_trans_table *)trans->data)->flags) - - struct nft_trans_elem { - struct nft_set *set; ---- a/net/netfilter/nf_tables_api.c -+++ b/net/netfilter/nf_tables_api.c -@@ -917,6 +917,12 @@ static void nf_tables_table_disable(stru - nft_table_disable(net, table, 0); - } - -+enum { -+ NFT_TABLE_STATE_UNCHANGED = 0, -+ NFT_TABLE_STATE_DORMANT, -+ NFT_TABLE_STATE_WAKEUP -+}; -+ - static int nf_tables_updtable(struct nft_ctx *ctx) - { - struct nft_trans *trans; -@@ -940,19 +946,17 @@ static int nf_tables_updtable(struct nft - - if ((flags & NFT_TABLE_F_DORMANT) && - !(ctx->table->flags & NFT_TABLE_F_DORMANT)) { -- nft_trans_table_enable(trans) = false; -+ nft_trans_table_state(trans) = NFT_TABLE_STATE_DORMANT; - } else if (!(flags & NFT_TABLE_F_DORMANT) && - ctx->table->flags & NFT_TABLE_F_DORMANT) { -- ctx->table->flags &= ~NFT_TABLE_F_DORMANT; - ret = nf_tables_table_enable(ctx->net, ctx->table); - if (ret >= 0) -- nft_trans_table_enable(trans) = true; -- else -- ctx->table->flags |= NFT_TABLE_F_DORMANT; -+ nft_trans_table_state(trans) = NFT_TABLE_STATE_WAKEUP; - } - if (ret < 0) - goto err; - -+ nft_trans_table_flags(trans) = flags; - nft_trans_table_update(trans) = true; - list_add_tail(&trans->list, &ctx->net->nft.commit_list); - return 0; -@@ -7918,11 +7922,10 @@ static int nf_tables_commit(struct net * - switch (trans->msg_type) { - case NFT_MSG_NEWTABLE: - if (nft_trans_table_update(trans)) { -- if (!nft_trans_table_enable(trans)) { -- nf_tables_table_disable(net, -- trans->ctx.table); -- trans->ctx.table->flags |= NFT_TABLE_F_DORMANT; -- } -+ if (nft_trans_table_state(trans) == NFT_TABLE_STATE_DORMANT) -+ nf_tables_table_disable(net, trans->ctx.table); -+ -+ trans->ctx.table->flags = nft_trans_table_flags(trans); - } else { - nft_clear(net, trans->ctx.table); - } -@@ -8139,11 +8142,9 @@ static int __nf_tables_abort(struct net - switch (trans->msg_type) { - case NFT_MSG_NEWTABLE: - if (nft_trans_table_update(trans)) { -- if (nft_trans_table_enable(trans)) { -- nf_tables_table_disable(net, -- trans->ctx.table); -- trans->ctx.table->flags |= NFT_TABLE_F_DORMANT; -- } -+ if (nft_trans_table_state(trans) == NFT_TABLE_STATE_WAKEUP) -+ nf_tables_table_disable(net, trans->ctx.table); -+ - nft_trans_destroy(trans); - } else { - list_del_rcu(&trans->ctx.table->list); diff --git a/target/linux/generic/backport-5.10/610-v5.13-11-net-resolve-forwarding-path-from-virtual-netdevice-a.patch b/target/linux/generic/backport-5.10/610-v5.13-11-net-resolve-forwarding-path-from-virtual-netdevice-a.patch deleted file mode 100644 index b3c0c2e927..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-11-net-resolve-forwarding-path-from-virtual-netdevice-a.patch +++ /dev/null @@ -1,170 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:32 +0100 -Subject: [PATCH] net: resolve forwarding path from virtual netdevice and - HW destination address - -This patch adds dev_fill_forward_path() which resolves the path to reach -the real netdevice from the IP forwarding side. This function takes as -input the netdevice and the destination hardware address and it walks -down the devices calling .ndo_fill_forward_path() for each device until -the real device is found. - -For instance, assuming the following topology: - - IP forwarding - / \ - br0 eth0 - / \ - eth1 eth2 - . - . - . - ethX - ab:cd:ef:ab:cd:ef - -where eth1 and eth2 are bridge ports and eth0 provides WAN connectivity. -ethX is the interface in another box which is connected to the eth1 -bridge port. - -For packets going through IP forwarding to br0 whose destination MAC -address is ab:cd:ef:ab:cd:ef, dev_fill_forward_path() provides the -following path: - - br0 -> eth1 - -.ndo_fill_forward_path for br0 looks up at the FDB for the bridge port -from the destination MAC address to get the bridge port eth1. - -This information allows to create a fast path that bypasses the classic -bridge and IP forwarding paths, so packets go directly from the bridge -port eth1 to eth0 (wan interface) and vice versa. - - fast path - .------------------------. - / \ - | IP forwarding | - | / \ \/ - | br0 eth0 - . / \ - -> eth1 eth2 - . - . - . - ethX - ab:cd:ef:ab:cd:ef - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -850,6 +850,27 @@ typedef u16 (*select_queue_fallback_t)(s - struct sk_buff *skb, - struct net_device *sb_dev); - -+enum net_device_path_type { -+ DEV_PATH_ETHERNET = 0, -+}; -+ -+struct net_device_path { -+ enum net_device_path_type type; -+ const struct net_device *dev; -+}; -+ -+#define NET_DEVICE_PATH_STACK_MAX 5 -+ -+struct net_device_path_stack { -+ int num_paths; -+ struct net_device_path path[NET_DEVICE_PATH_STACK_MAX]; -+}; -+ -+struct net_device_path_ctx { -+ const struct net_device *dev; -+ const u8 *daddr; -+}; -+ - enum tc_setup_type { - TC_SETUP_QDISC_MQPRIO, - TC_SETUP_CLSU32, -@@ -1296,6 +1317,8 @@ struct netdev_net_notifier { - * struct net_device *(*ndo_get_peer_dev)(struct net_device *dev); - * If a device is paired with a peer device, return the peer instance. - * The caller must be under RCU read context. -+ * int (*ndo_fill_forward_path)(struct net_device_path_ctx *ctx, struct net_device_path *path); -+ * Get the forwarding path to reach the real device from the HW destination address - */ - struct net_device_ops { - int (*ndo_init)(struct net_device *dev); -@@ -1504,6 +1527,8 @@ struct net_device_ops { - int (*ndo_tunnel_ctl)(struct net_device *dev, - struct ip_tunnel_parm *p, int cmd); - struct net_device * (*ndo_get_peer_dev)(struct net_device *dev); -+ int (*ndo_fill_forward_path)(struct net_device_path_ctx *ctx, -+ struct net_device_path *path); - }; - - /** -@@ -2851,6 +2876,8 @@ void dev_remove_offload(struct packet_of - - int dev_get_iflink(const struct net_device *dev); - int dev_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb); -+int dev_fill_forward_path(const struct net_device *dev, const u8 *daddr, -+ struct net_device_path_stack *stack); - struct net_device *__dev_get_by_flags(struct net *net, unsigned short flags, - unsigned short mask); - struct net_device *dev_get_by_name(struct net *net, const char *name); ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -847,6 +847,52 @@ int dev_fill_metadata_dst(struct net_dev - } - EXPORT_SYMBOL_GPL(dev_fill_metadata_dst); - -+static struct net_device_path *dev_fwd_path(struct net_device_path_stack *stack) -+{ -+ int k = stack->num_paths++; -+ -+ if (WARN_ON_ONCE(k >= NET_DEVICE_PATH_STACK_MAX)) -+ return NULL; -+ -+ return &stack->path[k]; -+} -+ -+int dev_fill_forward_path(const struct net_device *dev, const u8 *daddr, -+ struct net_device_path_stack *stack) -+{ -+ const struct net_device *last_dev; -+ struct net_device_path_ctx ctx = { -+ .dev = dev, -+ .daddr = daddr, -+ }; -+ struct net_device_path *path; -+ int ret = 0; -+ -+ stack->num_paths = 0; -+ while (ctx.dev && ctx.dev->netdev_ops->ndo_fill_forward_path) { -+ last_dev = ctx.dev; -+ path = dev_fwd_path(stack); -+ if (!path) -+ return -1; -+ -+ memset(path, 0, sizeof(struct net_device_path)); -+ ret = ctx.dev->netdev_ops->ndo_fill_forward_path(&ctx, path); -+ if (ret < 0) -+ return -1; -+ -+ if (WARN_ON_ONCE(last_dev == ctx.dev)) -+ return -1; -+ } -+ path = dev_fwd_path(stack); -+ if (!path) -+ return -1; -+ path->type = DEV_PATH_ETHERNET; -+ path->dev = ctx.dev; -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(dev_fill_forward_path); -+ - /** - * __dev_get_by_name - find a device by its name - * @net: the applicable net namespace diff --git a/target/linux/generic/backport-5.10/610-v5.13-12-net-8021q-resolve-forwarding-path-for-vlan-devices.patch b/target/linux/generic/backport-5.10/610-v5.13-12-net-8021q-resolve-forwarding-path-for-vlan-devices.patch deleted file mode 100644 index a906dc06ce..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-12-net-8021q-resolve-forwarding-path-for-vlan-devices.patch +++ /dev/null @@ -1,80 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:33 +0100 -Subject: [PATCH] net: 8021q: resolve forwarding path for vlan devices - -Add .ndo_fill_forward_path for vlan devices. - -For instance, assuming the following topology: - - IP forwarding - / \ - eth0.100 eth0 - | - eth0 - . - . - . - ethX - ab:cd:ef:ab:cd:ef - -For packets going through IP forwarding to eth0.100 whose destination -MAC address is ab:cd:ef:ab:cd:ef, dev_fill_forward_path() provides the -following path: - - eth0.100 -> eth0 - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -852,11 +852,18 @@ typedef u16 (*select_queue_fallback_t)(s - - enum net_device_path_type { - DEV_PATH_ETHERNET = 0, -+ DEV_PATH_VLAN, - }; - - struct net_device_path { - enum net_device_path_type type; - const struct net_device *dev; -+ union { -+ struct { -+ u16 id; -+ __be16 proto; -+ } encap; -+ }; - }; - - #define NET_DEVICE_PATH_STACK_MAX 5 ---- a/net/8021q/vlan_dev.c -+++ b/net/8021q/vlan_dev.c -@@ -770,6 +770,20 @@ static int vlan_dev_get_iflink(const str - return real_dev->ifindex; - } - -+static int vlan_dev_fill_forward_path(struct net_device_path_ctx *ctx, -+ struct net_device_path *path) -+{ -+ struct vlan_dev_priv *vlan = vlan_dev_priv(ctx->dev); -+ -+ path->type = DEV_PATH_VLAN; -+ path->encap.id = vlan->vlan_id; -+ path->encap.proto = vlan->vlan_proto; -+ path->dev = ctx->dev; -+ ctx->dev = vlan->real_dev; -+ -+ return 0; -+} -+ - static const struct ethtool_ops vlan_ethtool_ops = { - .get_link_ksettings = vlan_ethtool_get_link_ksettings, - .get_drvinfo = vlan_ethtool_get_drvinfo, -@@ -808,6 +822,7 @@ static const struct net_device_ops vlan_ - #endif - .ndo_fix_features = vlan_dev_fix_features, - .ndo_get_iflink = vlan_dev_get_iflink, -+ .ndo_fill_forward_path = vlan_dev_fill_forward_path, - }; - - static void vlan_dev_free(struct net_device *dev) diff --git a/target/linux/generic/backport-5.10/610-v5.13-13-net-bridge-resolve-forwarding-path-for-bridge-device.patch b/target/linux/generic/backport-5.10/610-v5.13-13-net-bridge-resolve-forwarding-path-for-bridge-device.patch deleted file mode 100644 index f5a6dd6ebc..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-13-net-bridge-resolve-forwarding-path-for-bridge-device.patch +++ /dev/null @@ -1,62 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:34 +0100 -Subject: [PATCH] net: bridge: resolve forwarding path for bridge devices - -Add .ndo_fill_forward_path for bridge devices. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -853,6 +853,7 @@ typedef u16 (*select_queue_fallback_t)(s - enum net_device_path_type { - DEV_PATH_ETHERNET = 0, - DEV_PATH_VLAN, -+ DEV_PATH_BRIDGE, - }; - - struct net_device_path { ---- a/net/bridge/br_device.c -+++ b/net/bridge/br_device.c -@@ -398,6 +398,32 @@ static int br_del_slave(struct net_devic - return br_del_if(br, slave_dev); - } - -+static int br_fill_forward_path(struct net_device_path_ctx *ctx, -+ struct net_device_path *path) -+{ -+ struct net_bridge_fdb_entry *f; -+ struct net_bridge_port *dst; -+ struct net_bridge *br; -+ -+ if (netif_is_bridge_port(ctx->dev)) -+ return -1; -+ -+ br = netdev_priv(ctx->dev); -+ f = br_fdb_find_rcu(br, ctx->daddr, 0); -+ if (!f || !f->dst) -+ return -1; -+ -+ dst = READ_ONCE(f->dst); -+ if (!dst) -+ return -1; -+ -+ path->type = DEV_PATH_BRIDGE; -+ path->dev = dst->br->dev; -+ ctx->dev = dst->dev; -+ -+ return 0; -+} -+ - static const struct ethtool_ops br_ethtool_ops = { - .get_drvinfo = br_getinfo, - .get_link = ethtool_op_get_link, -@@ -432,6 +458,7 @@ static const struct net_device_ops br_ne - .ndo_bridge_setlink = br_setlink, - .ndo_bridge_dellink = br_dellink, - .ndo_features_check = passthru_features_check, -+ .ndo_fill_forward_path = br_fill_forward_path, - }; - - static struct device_type br_type = { diff --git a/target/linux/generic/backport-5.10/610-v5.13-14-net-bridge-resolve-forwarding-path-for-VLAN-tag-acti.patch b/target/linux/generic/backport-5.10/610-v5.13-14-net-bridge-resolve-forwarding-path-for-VLAN-tag-acti.patch deleted file mode 100644 index 9e62546a6c..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-14-net-bridge-resolve-forwarding-path-for-VLAN-tag-acti.patch +++ /dev/null @@ -1,207 +0,0 @@ -From: Felix Fietkau -Date: Wed, 24 Mar 2021 02:30:35 +0100 -Subject: [PATCH] net: bridge: resolve forwarding path for VLAN tag - actions in bridge devices - -Depending on the VLAN settings of the bridge and the port, the bridge can -either add or remove a tag. When vlan filtering is enabled, the fdb lookup -also needs to know the VLAN tag/proto for the destination address -To provide this, keep track of the stack of VLAN tags for the path in the -lookup context - -Signed-off-by: Felix Fietkau -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -864,10 +864,20 @@ struct net_device_path { - u16 id; - __be16 proto; - } encap; -+ struct { -+ enum { -+ DEV_PATH_BR_VLAN_KEEP, -+ DEV_PATH_BR_VLAN_TAG, -+ DEV_PATH_BR_VLAN_UNTAG, -+ } vlan_mode; -+ u16 vlan_id; -+ __be16 vlan_proto; -+ } bridge; - }; - }; - - #define NET_DEVICE_PATH_STACK_MAX 5 -+#define NET_DEVICE_PATH_VLAN_MAX 2 - - struct net_device_path_stack { - int num_paths; -@@ -877,6 +887,12 @@ struct net_device_path_stack { - struct net_device_path_ctx { - const struct net_device *dev; - const u8 *daddr; -+ -+ int num_vlans; -+ struct { -+ u16 id; -+ __be16 proto; -+ } vlan[NET_DEVICE_PATH_VLAN_MAX]; - }; - - enum tc_setup_type { ---- a/net/8021q/vlan_dev.c -+++ b/net/8021q/vlan_dev.c -@@ -780,6 +780,12 @@ static int vlan_dev_fill_forward_path(st - path->encap.proto = vlan->vlan_proto; - path->dev = ctx->dev; - ctx->dev = vlan->real_dev; -+ if (ctx->num_vlans >= ARRAY_SIZE(ctx->vlan)) -+ return -ENOSPC; -+ -+ ctx->vlan[ctx->num_vlans].id = vlan->vlan_id; -+ ctx->vlan[ctx->num_vlans].proto = vlan->vlan_proto; -+ ctx->num_vlans++; - - return 0; - } ---- a/net/bridge/br_device.c -+++ b/net/bridge/br_device.c -@@ -409,7 +409,10 @@ static int br_fill_forward_path(struct n - return -1; - - br = netdev_priv(ctx->dev); -- f = br_fdb_find_rcu(br, ctx->daddr, 0); -+ -+ br_vlan_fill_forward_path_pvid(br, ctx, path); -+ -+ f = br_fdb_find_rcu(br, ctx->daddr, path->bridge.vlan_id); - if (!f || !f->dst) - return -1; - -@@ -417,10 +420,28 @@ static int br_fill_forward_path(struct n - if (!dst) - return -1; - -+ if (br_vlan_fill_forward_path_mode(br, dst, path)) -+ return -1; -+ - path->type = DEV_PATH_BRIDGE; - path->dev = dst->br->dev; - ctx->dev = dst->dev; - -+ switch (path->bridge.vlan_mode) { -+ case DEV_PATH_BR_VLAN_TAG: -+ if (ctx->num_vlans >= ARRAY_SIZE(ctx->vlan)) -+ return -ENOSPC; -+ ctx->vlan[ctx->num_vlans].id = path->bridge.vlan_id; -+ ctx->vlan[ctx->num_vlans].proto = path->bridge.vlan_proto; -+ ctx->num_vlans++; -+ break; -+ case DEV_PATH_BR_VLAN_UNTAG: -+ ctx->num_vlans--; -+ break; -+ case DEV_PATH_BR_VLAN_KEEP: -+ break; -+ } -+ - return 0; - } - ---- a/net/bridge/br_private.h -+++ b/net/bridge/br_private.h -@@ -1093,6 +1093,13 @@ void br_vlan_notify(const struct net_bri - bool br_vlan_can_enter_range(const struct net_bridge_vlan *v_curr, - const struct net_bridge_vlan *range_end); - -+void br_vlan_fill_forward_path_pvid(struct net_bridge *br, -+ struct net_device_path_ctx *ctx, -+ struct net_device_path *path); -+int br_vlan_fill_forward_path_mode(struct net_bridge *br, -+ struct net_bridge_port *dst, -+ struct net_device_path *path); -+ - static inline struct net_bridge_vlan_group *br_vlan_group( - const struct net_bridge *br) - { -@@ -1250,6 +1257,19 @@ static inline int nbp_get_num_vlan_infos - { - return 0; - } -+ -+static inline void br_vlan_fill_forward_path_pvid(struct net_bridge *br, -+ struct net_device_path_ctx *ctx, -+ struct net_device_path *path) -+{ -+} -+ -+static inline int br_vlan_fill_forward_path_mode(struct net_bridge *br, -+ struct net_bridge_port *dst, -+ struct net_device_path *path) -+{ -+ return 0; -+} - - static inline struct net_bridge_vlan_group *br_vlan_group( - const struct net_bridge *br) ---- a/net/bridge/br_vlan.c -+++ b/net/bridge/br_vlan.c -@@ -1350,6 +1350,59 @@ int br_vlan_get_pvid_rcu(const struct ne - } - EXPORT_SYMBOL_GPL(br_vlan_get_pvid_rcu); - -+void br_vlan_fill_forward_path_pvid(struct net_bridge *br, -+ struct net_device_path_ctx *ctx, -+ struct net_device_path *path) -+{ -+ struct net_bridge_vlan_group *vg; -+ int idx = ctx->num_vlans - 1; -+ u16 vid; -+ -+ path->bridge.vlan_mode = DEV_PATH_BR_VLAN_KEEP; -+ -+ if (!br_opt_get(br, BROPT_VLAN_ENABLED)) -+ return; -+ -+ vg = br_vlan_group(br); -+ -+ if (idx >= 0 && -+ ctx->vlan[idx].proto == br->vlan_proto) { -+ vid = ctx->vlan[idx].id; -+ } else { -+ path->bridge.vlan_mode = DEV_PATH_BR_VLAN_TAG; -+ vid = br_get_pvid(vg); -+ } -+ -+ path->bridge.vlan_id = vid; -+ path->bridge.vlan_proto = br->vlan_proto; -+} -+ -+int br_vlan_fill_forward_path_mode(struct net_bridge *br, -+ struct net_bridge_port *dst, -+ struct net_device_path *path) -+{ -+ struct net_bridge_vlan_group *vg; -+ struct net_bridge_vlan *v; -+ -+ if (!br_opt_get(br, BROPT_VLAN_ENABLED)) -+ return 0; -+ -+ vg = nbp_vlan_group_rcu(dst); -+ v = br_vlan_find(vg, path->bridge.vlan_id); -+ if (!v || !br_vlan_should_use(v)) -+ return -EINVAL; -+ -+ if (!(v->flags & BRIDGE_VLAN_INFO_UNTAGGED)) -+ return 0; -+ -+ if (path->bridge.vlan_mode == DEV_PATH_BR_VLAN_TAG) -+ path->bridge.vlan_mode = DEV_PATH_BR_VLAN_KEEP; -+ else -+ path->bridge.vlan_mode = DEV_PATH_BR_VLAN_UNTAG; -+ -+ return 0; -+} -+ - int br_vlan_get_info(const struct net_device *dev, u16 vid, - struct bridge_vlan_info *p_vinfo) - { diff --git a/target/linux/generic/backport-5.10/610-v5.13-15-net-ppp-resolve-forwarding-path-for-bridge-pppoe-dev.patch b/target/linux/generic/backport-5.10/610-v5.13-15-net-ppp-resolve-forwarding-path-for-bridge-pppoe-dev.patch deleted file mode 100644 index c714ff0584..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-15-net-ppp-resolve-forwarding-path-for-bridge-pppoe-dev.patch +++ /dev/null @@ -1,113 +0,0 @@ -From: Felix Fietkau -Date: Wed, 24 Mar 2021 02:30:36 +0100 -Subject: [PATCH] net: ppp: resolve forwarding path for bridge pppoe - devices - -Pass on the PPPoE session ID, destination hardware address and the real -device. - -Signed-off-by: Felix Fietkau -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/drivers/net/ppp/ppp_generic.c -+++ b/drivers/net/ppp/ppp_generic.c -@@ -1466,12 +1466,34 @@ static void ppp_dev_priv_destructor(stru - ppp_destroy_interface(ppp); - } - -+static int ppp_fill_forward_path(struct net_device_path_ctx *ctx, -+ struct net_device_path *path) -+{ -+ struct ppp *ppp = netdev_priv(ctx->dev); -+ struct ppp_channel *chan; -+ struct channel *pch; -+ -+ if (ppp->flags & SC_MULTILINK) -+ return -EOPNOTSUPP; -+ -+ if (list_empty(&ppp->channels)) -+ return -ENODEV; -+ -+ pch = list_first_entry(&ppp->channels, struct channel, clist); -+ chan = pch->chan; -+ if (!chan->ops->fill_forward_path) -+ return -EOPNOTSUPP; -+ -+ return chan->ops->fill_forward_path(ctx, path, chan); -+} -+ - static const struct net_device_ops ppp_netdev_ops = { - .ndo_init = ppp_dev_init, - .ndo_uninit = ppp_dev_uninit, - .ndo_start_xmit = ppp_start_xmit, - .ndo_do_ioctl = ppp_net_ioctl, - .ndo_get_stats64 = ppp_get_stats64, -+ .ndo_fill_forward_path = ppp_fill_forward_path, - }; - - static struct device_type ppp_type = { ---- a/drivers/net/ppp/pppoe.c -+++ b/drivers/net/ppp/pppoe.c -@@ -972,8 +972,31 @@ static int pppoe_xmit(struct ppp_channel - return __pppoe_xmit(sk, skb); - } - -+static int pppoe_fill_forward_path(struct net_device_path_ctx *ctx, -+ struct net_device_path *path, -+ const struct ppp_channel *chan) -+{ -+ struct sock *sk = (struct sock *)chan->private; -+ struct pppox_sock *po = pppox_sk(sk); -+ struct net_device *dev = po->pppoe_dev; -+ -+ if (sock_flag(sk, SOCK_DEAD) || -+ !(sk->sk_state & PPPOX_CONNECTED) || !dev) -+ return -1; -+ -+ path->type = DEV_PATH_PPPOE; -+ path->encap.proto = htons(ETH_P_PPP_SES); -+ path->encap.id = be16_to_cpu(po->num); -+ memcpy(path->encap.h_dest, po->pppoe_pa.remote, ETH_ALEN); -+ path->dev = ctx->dev; -+ ctx->dev = dev; -+ -+ return 0; -+} -+ - static const struct ppp_channel_ops pppoe_chan_ops = { - .start_xmit = pppoe_xmit, -+ .fill_forward_path = pppoe_fill_forward_path, - }; - - static int pppoe_recvmsg(struct socket *sock, struct msghdr *m, ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -854,6 +854,7 @@ enum net_device_path_type { - DEV_PATH_ETHERNET = 0, - DEV_PATH_VLAN, - DEV_PATH_BRIDGE, -+ DEV_PATH_PPPOE, - }; - - struct net_device_path { -@@ -863,6 +864,7 @@ struct net_device_path { - struct { - u16 id; - __be16 proto; -+ u8 h_dest[ETH_ALEN]; - } encap; - struct { - enum { ---- a/include/linux/ppp_channel.h -+++ b/include/linux/ppp_channel.h -@@ -28,6 +28,9 @@ struct ppp_channel_ops { - int (*start_xmit)(struct ppp_channel *, struct sk_buff *); - /* Handle an ioctl call that has come in via /dev/ppp. */ - int (*ioctl)(struct ppp_channel *, unsigned int, unsigned long); -+ int (*fill_forward_path)(struct net_device_path_ctx *, -+ struct net_device_path *, -+ const struct ppp_channel *); - }; - - struct ppp_channel { diff --git a/target/linux/generic/backport-5.10/610-v5.13-16-net-dsa-resolve-forwarding-path-for-dsa-slave-ports.patch b/target/linux/generic/backport-5.10/610-v5.13-16-net-dsa-resolve-forwarding-path-for-dsa-slave-ports.patch deleted file mode 100644 index a277f0ccf0..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-16-net-dsa-resolve-forwarding-path-for-dsa-slave-ports.patch +++ /dev/null @@ -1,63 +0,0 @@ -From: Felix Fietkau -Date: Wed, 24 Mar 2021 02:30:37 +0100 -Subject: [PATCH] net: dsa: resolve forwarding path for dsa slave ports - -Add .ndo_fill_forward_path for dsa slave port devices - -Signed-off-by: Felix Fietkau -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -855,6 +855,7 @@ enum net_device_path_type { - DEV_PATH_VLAN, - DEV_PATH_BRIDGE, - DEV_PATH_PPPOE, -+ DEV_PATH_DSA, - }; - - struct net_device_path { -@@ -875,6 +876,10 @@ struct net_device_path { - u16 vlan_id; - __be16 vlan_proto; - } bridge; -+ struct { -+ int port; -+ u16 proto; -+ } dsa; - }; - }; - ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -1619,6 +1619,21 @@ static struct devlink_port *dsa_slave_ge - return dp->ds->devlink ? &dp->devlink_port : NULL; - } - -+static int dsa_slave_fill_forward_path(struct net_device_path_ctx *ctx, -+ struct net_device_path *path) -+{ -+ struct dsa_port *dp = dsa_slave_to_port(ctx->dev); -+ struct dsa_port *cpu_dp = dp->cpu_dp; -+ -+ path->dev = ctx->dev; -+ path->type = DEV_PATH_DSA; -+ path->dsa.proto = cpu_dp->tag_ops->proto; -+ path->dsa.port = dp->index; -+ ctx->dev = cpu_dp->master; -+ -+ return 0; -+} -+ - static const struct net_device_ops dsa_slave_netdev_ops = { - .ndo_open = dsa_slave_open, - .ndo_stop = dsa_slave_close, -@@ -1644,6 +1659,7 @@ static const struct net_device_ops dsa_s - .ndo_vlan_rx_kill_vid = dsa_slave_vlan_rx_kill_vid, - .ndo_get_devlink_port = dsa_slave_get_devlink_port, - .ndo_change_mtu = dsa_slave_change_mtu, -+ .ndo_fill_forward_path = dsa_slave_fill_forward_path, - }; - - static struct device_type dsa_type = { diff --git a/target/linux/generic/backport-5.10/610-v5.13-17-netfilter-flowtable-add-xmit-path-types.patch b/target/linux/generic/backport-5.10/610-v5.13-17-netfilter-flowtable-add-xmit-path-types.patch deleted file mode 100644 index 6052f67faa..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-17-netfilter-flowtable-add-xmit-path-types.patch +++ /dev/null @@ -1,147 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:38 +0100 -Subject: [PATCH] netfilter: flowtable: add xmit path types - -Add the xmit_type field that defines the two supported xmit paths in the -flowtable data plane, which are the neighbour and the xfrm xmit paths. -This patch prepares for new flowtable xmit path types to come. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -89,6 +89,11 @@ enum flow_offload_tuple_dir { - }; - #define FLOW_OFFLOAD_DIR_MAX IP_CT_DIR_MAX - -+enum flow_offload_xmit_type { -+ FLOW_OFFLOAD_XMIT_NEIGH = 0, -+ FLOW_OFFLOAD_XMIT_XFRM, -+}; -+ - struct flow_offload_tuple { - union { - struct in_addr src_v4; -@@ -111,7 +116,8 @@ struct flow_offload_tuple { - /* All members above are keys for lookups, see flow_offload_hash(). */ - struct { } __hash; - -- u8 dir; -+ u8 dir:6, -+ xmit_type:2; - - u16 mtu; - -@@ -157,7 +163,8 @@ static inline __s32 nf_flow_timeout_delt - - struct nf_flow_route { - struct { -- struct dst_entry *dst; -+ struct dst_entry *dst; -+ enum flow_offload_xmit_type xmit_type; - } tuple[FLOW_OFFLOAD_DIR_MAX]; - }; - ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -95,6 +95,7 @@ static int flow_offload_fill_route(struc - } - - flow_tuple->iifidx = other_dst->dev->ifindex; -+ flow_tuple->xmit_type = route->tuple[dir].xmit_type; - flow_tuple->dst_cache = dst; - - return 0; ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -235,8 +235,6 @@ nf_flow_offload_ip_hook(void *priv, stru - - dir = tuplehash->tuple.dir; - flow = container_of(tuplehash, struct flow_offload, tuplehash[dir]); -- rt = (struct rtable *)flow->tuplehash[dir].tuple.dst_cache; -- outdev = rt->dst.dev; - - if (unlikely(nf_flow_exceeds_mtu(skb, flow->tuplehash[dir].tuple.mtu))) - return NF_ACCEPT; -@@ -265,13 +263,16 @@ nf_flow_offload_ip_hook(void *priv, stru - if (flow_table->flags & NF_FLOWTABLE_COUNTER) - nf_ct_acct_update(flow->ct, tuplehash->tuple.dir, skb->len); - -- if (unlikely(dst_xfrm(&rt->dst))) { -+ rt = (struct rtable *)tuplehash->tuple.dst_cache; -+ -+ if (unlikely(tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM)) { - memset(skb->cb, 0, sizeof(struct inet_skb_parm)); - IPCB(skb)->iif = skb->dev->ifindex; - IPCB(skb)->flags = IPSKB_FORWARDED; - return nf_flow_xmit_xfrm(skb, state, &rt->dst); - } - -+ outdev = rt->dst.dev; - skb->dev = outdev; - nexthop = rt_nexthop(rt, flow->tuplehash[!dir].tuple.src_v4.s_addr); - skb_dst_set_noref(skb, &rt->dst); -@@ -456,8 +457,6 @@ nf_flow_offload_ipv6_hook(void *priv, st - - dir = tuplehash->tuple.dir; - flow = container_of(tuplehash, struct flow_offload, tuplehash[dir]); -- rt = (struct rt6_info *)flow->tuplehash[dir].tuple.dst_cache; -- outdev = rt->dst.dev; - - if (unlikely(nf_flow_exceeds_mtu(skb, flow->tuplehash[dir].tuple.mtu))) - return NF_ACCEPT; -@@ -485,13 +484,16 @@ nf_flow_offload_ipv6_hook(void *priv, st - if (flow_table->flags & NF_FLOWTABLE_COUNTER) - nf_ct_acct_update(flow->ct, tuplehash->tuple.dir, skb->len); - -- if (unlikely(dst_xfrm(&rt->dst))) { -+ rt = (struct rt6_info *)tuplehash->tuple.dst_cache; -+ -+ if (unlikely(tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM)) { - memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); - IP6CB(skb)->iif = skb->dev->ifindex; - IP6CB(skb)->flags = IP6SKB_FORWARDED; - return nf_flow_xmit_xfrm(skb, state, &rt->dst); - } - -+ outdev = rt->dst.dev; - skb->dev = outdev; - nexthop = rt6_nexthop(rt, &flow->tuplehash[!dir].tuple.src_v6); - skb_dst_set_noref(skb, &rt->dst); ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -19,6 +19,22 @@ struct nft_flow_offload { - struct nft_flowtable *flowtable; - }; - -+static enum flow_offload_xmit_type nft_xmit_type(struct dst_entry *dst) -+{ -+ if (dst_xfrm(dst)) -+ return FLOW_OFFLOAD_XMIT_XFRM; -+ -+ return FLOW_OFFLOAD_XMIT_NEIGH; -+} -+ -+static void nft_default_forward_path(struct nf_flow_route *route, -+ struct dst_entry *dst_cache, -+ enum ip_conntrack_dir dir) -+{ -+ route->tuple[dir].dst = dst_cache; -+ route->tuple[dir].xmit_type = nft_xmit_type(dst_cache); -+} -+ - static int nft_flow_route(const struct nft_pktinfo *pkt, - const struct nf_conn *ct, - struct nf_flow_route *route, -@@ -44,8 +60,8 @@ static int nft_flow_route(const struct n - if (!other_dst) - return -ENOENT; - -- route->tuple[dir].dst = this_dst; -- route->tuple[!dir].dst = other_dst; -+ nft_default_forward_path(route, this_dst, dir); -+ nft_default_forward_path(route, other_dst, !dir); - - return 0; - } diff --git a/target/linux/generic/backport-5.10/610-v5.13-18-netfilter-flowtable-use-dev_fill_forward_path-to-obt.patch b/target/linux/generic/backport-5.10/610-v5.13-18-netfilter-flowtable-use-dev_fill_forward_path-to-obt.patch deleted file mode 100644 index 9541ce8867..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-18-netfilter-flowtable-use-dev_fill_forward_path-to-obt.patch +++ /dev/null @@ -1,191 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:39 +0100 -Subject: [PATCH] netfilter: flowtable: use dev_fill_forward_path() to - obtain ingress device - -Obtain the ingress device in the tuple from the route in the reply -direction. Use dev_fill_forward_path() instead to get the real ingress -device for this flow. - -Fall back to use the ingress device that the IP forwarding route -provides if: - -- dev_fill_forward_path() finds no real ingress device. -- the ingress device that is obtained is not part of the flowtable - devices. -- this route has a xfrm policy. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -164,6 +164,9 @@ static inline __s32 nf_flow_timeout_delt - struct nf_flow_route { - struct { - struct dst_entry *dst; -+ struct { -+ u32 ifindex; -+ } in; - enum flow_offload_xmit_type xmit_type; - } tuple[FLOW_OFFLOAD_DIR_MAX]; - }; ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -79,7 +79,6 @@ static int flow_offload_fill_route(struc - enum flow_offload_tuple_dir dir) - { - struct flow_offload_tuple *flow_tuple = &flow->tuplehash[dir].tuple; -- struct dst_entry *other_dst = route->tuple[!dir].dst; - struct dst_entry *dst = route->tuple[dir].dst; - - if (!dst_hold_safe(route->tuple[dir].dst)) -@@ -94,7 +93,7 @@ static int flow_offload_fill_route(struc - break; - } - -- flow_tuple->iifidx = other_dst->dev->ifindex; -+ flow_tuple->iifidx = route->tuple[dir].in.ifindex; - flow_tuple->xmit_type = route->tuple[dir].xmit_type; - flow_tuple->dst_cache = dst; - ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -31,14 +31,104 @@ static void nft_default_forward_path(str - struct dst_entry *dst_cache, - enum ip_conntrack_dir dir) - { -+ route->tuple[!dir].in.ifindex = dst_cache->dev->ifindex; - route->tuple[dir].dst = dst_cache; - route->tuple[dir].xmit_type = nft_xmit_type(dst_cache); - } - -+static int nft_dev_fill_forward_path(const struct nf_flow_route *route, -+ const struct dst_entry *dst_cache, -+ const struct nf_conn *ct, -+ enum ip_conntrack_dir dir, -+ struct net_device_path_stack *stack) -+{ -+ const void *daddr = &ct->tuplehash[!dir].tuple.src.u3; -+ struct net_device *dev = dst_cache->dev; -+ unsigned char ha[ETH_ALEN]; -+ struct neighbour *n; -+ u8 nud_state; -+ -+ n = dst_neigh_lookup(dst_cache, daddr); -+ if (!n) -+ return -1; -+ -+ read_lock_bh(&n->lock); -+ nud_state = n->nud_state; -+ ether_addr_copy(ha, n->ha); -+ read_unlock_bh(&n->lock); -+ neigh_release(n); -+ -+ if (!(nud_state & NUD_VALID)) -+ return -1; -+ -+ return dev_fill_forward_path(dev, ha, stack); -+} -+ -+struct nft_forward_info { -+ const struct net_device *indev; -+}; -+ -+static void nft_dev_path_info(const struct net_device_path_stack *stack, -+ struct nft_forward_info *info) -+{ -+ const struct net_device_path *path; -+ int i; -+ -+ for (i = 0; i < stack->num_paths; i++) { -+ path = &stack->path[i]; -+ switch (path->type) { -+ case DEV_PATH_ETHERNET: -+ info->indev = path->dev; -+ break; -+ case DEV_PATH_VLAN: -+ case DEV_PATH_BRIDGE: -+ default: -+ info->indev = NULL; -+ break; -+ } -+ } -+} -+ -+static bool nft_flowtable_find_dev(const struct net_device *dev, -+ struct nft_flowtable *ft) -+{ -+ struct nft_hook *hook; -+ bool found = false; -+ -+ list_for_each_entry_rcu(hook, &ft->hook_list, list) { -+ if (hook->ops.dev != dev) -+ continue; -+ -+ found = true; -+ break; -+ } -+ -+ return found; -+} -+ -+static void nft_dev_forward_path(struct nf_flow_route *route, -+ const struct nf_conn *ct, -+ enum ip_conntrack_dir dir, -+ struct nft_flowtable *ft) -+{ -+ const struct dst_entry *dst = route->tuple[dir].dst; -+ struct net_device_path_stack stack; -+ struct nft_forward_info info = {}; -+ -+ if (nft_dev_fill_forward_path(route, dst, ct, dir, &stack) >= 0) -+ nft_dev_path_info(&stack, &info); -+ -+ if (!info.indev || !nft_flowtable_find_dev(info.indev, ft)) -+ return; -+ -+ route->tuple[!dir].in.ifindex = info.indev->ifindex; -+} -+ - static int nft_flow_route(const struct nft_pktinfo *pkt, - const struct nf_conn *ct, - struct nf_flow_route *route, -- enum ip_conntrack_dir dir) -+ enum ip_conntrack_dir dir, -+ struct nft_flowtable *ft) - { - struct dst_entry *this_dst = skb_dst(pkt->skb); - struct dst_entry *other_dst = NULL; -@@ -63,6 +153,12 @@ static int nft_flow_route(const struct n - nft_default_forward_path(route, this_dst, dir); - nft_default_forward_path(route, other_dst, !dir); - -+ if (route->tuple[dir].xmit_type == FLOW_OFFLOAD_XMIT_NEIGH && -+ route->tuple[!dir].xmit_type == FLOW_OFFLOAD_XMIT_NEIGH) { -+ nft_dev_forward_path(route, ct, dir, ft); -+ nft_dev_forward_path(route, ct, !dir, ft); -+ } -+ - return 0; - } - -@@ -90,8 +186,8 @@ static void nft_flow_offload_eval(const - struct nft_flow_offload *priv = nft_expr_priv(expr); - struct nf_flowtable *flowtable = &priv->flowtable->data; - struct tcphdr _tcph, *tcph = NULL; -+ struct nf_flow_route route = {}; - enum ip_conntrack_info ctinfo; -- struct nf_flow_route route; - struct flow_offload *flow; - enum ip_conntrack_dir dir; - struct nf_conn *ct; -@@ -128,7 +224,7 @@ static void nft_flow_offload_eval(const - goto out; - - dir = CTINFO2DIR(ctinfo); -- if (nft_flow_route(pkt, ct, &route, dir) < 0) -+ if (nft_flow_route(pkt, ct, &route, dir, priv->flowtable) < 0) - goto err_flow_route; - - flow = flow_offload_alloc(ct); diff --git a/target/linux/generic/backport-5.10/610-v5.13-19-netfilter-flowtable-use-dev_fill_forward_path-to-obt.patch b/target/linux/generic/backport-5.10/610-v5.13-19-netfilter-flowtable-use-dev_fill_forward_path-to-obt.patch deleted file mode 100644 index 457e218d9b..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-19-netfilter-flowtable-use-dev_fill_forward_path-to-obt.patch +++ /dev/null @@ -1,374 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:40 +0100 -Subject: [PATCH] netfilter: flowtable: use dev_fill_forward_path() to - obtain egress device - -The egress device in the tuple is obtained from route. Use -dev_fill_forward_path() instead to provide the real egress device for -this flow whenever this is available. - -The new FLOW_OFFLOAD_XMIT_DIRECT type uses dev_queue_xmit() to transmit -ethernet frames. Cache the source and destination hardware address to -use dev_queue_xmit() to transfer packets. - -The FLOW_OFFLOAD_XMIT_DIRECT replaces FLOW_OFFLOAD_XMIT_NEIGH if -dev_fill_forward_path() finds a direct transmit path. - -In case of topology updates, if peer is moved to different bridge port, -the connection will time out, reconnect will result in a new entry with -the correct path. Snooping fdb updates would allow for cleaning up stale -flowtable entries. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -92,6 +92,7 @@ enum flow_offload_tuple_dir { - enum flow_offload_xmit_type { - FLOW_OFFLOAD_XMIT_NEIGH = 0, - FLOW_OFFLOAD_XMIT_XFRM, -+ FLOW_OFFLOAD_XMIT_DIRECT, - }; - - struct flow_offload_tuple { -@@ -120,8 +121,14 @@ struct flow_offload_tuple { - xmit_type:2; - - u16 mtu; -- -- struct dst_entry *dst_cache; -+ union { -+ struct dst_entry *dst_cache; -+ struct { -+ u32 ifidx; -+ u8 h_source[ETH_ALEN]; -+ u8 h_dest[ETH_ALEN]; -+ } out; -+ }; - }; - - struct flow_offload_tuple_rhash { -@@ -167,6 +174,11 @@ struct nf_flow_route { - struct { - u32 ifindex; - } in; -+ struct { -+ u32 ifindex; -+ u8 h_source[ETH_ALEN]; -+ u8 h_dest[ETH_ALEN]; -+ } out; - enum flow_offload_xmit_type xmit_type; - } tuple[FLOW_OFFLOAD_DIR_MAX]; - }; ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -81,9 +81,6 @@ static int flow_offload_fill_route(struc - struct flow_offload_tuple *flow_tuple = &flow->tuplehash[dir].tuple; - struct dst_entry *dst = route->tuple[dir].dst; - -- if (!dst_hold_safe(route->tuple[dir].dst)) -- return -1; -- - switch (flow_tuple->l3proto) { - case NFPROTO_IPV4: - flow_tuple->mtu = ip_dst_mtu_maybe_forward(dst, true); -@@ -94,12 +91,36 @@ static int flow_offload_fill_route(struc - } - - flow_tuple->iifidx = route->tuple[dir].in.ifindex; -+ -+ switch (route->tuple[dir].xmit_type) { -+ case FLOW_OFFLOAD_XMIT_DIRECT: -+ memcpy(flow_tuple->out.h_dest, route->tuple[dir].out.h_dest, -+ ETH_ALEN); -+ memcpy(flow_tuple->out.h_source, route->tuple[dir].out.h_source, -+ ETH_ALEN); -+ flow_tuple->out.ifidx = route->tuple[dir].out.ifindex; -+ break; -+ case FLOW_OFFLOAD_XMIT_XFRM: -+ case FLOW_OFFLOAD_XMIT_NEIGH: -+ if (!dst_hold_safe(route->tuple[dir].dst)) -+ return -1; -+ -+ flow_tuple->dst_cache = dst; -+ break; -+ } - flow_tuple->xmit_type = route->tuple[dir].xmit_type; -- flow_tuple->dst_cache = dst; - - return 0; - } - -+static void nft_flow_dst_release(struct flow_offload *flow, -+ enum flow_offload_tuple_dir dir) -+{ -+ if (flow->tuplehash[dir].tuple.xmit_type == FLOW_OFFLOAD_XMIT_NEIGH || -+ flow->tuplehash[dir].tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM) -+ dst_release(flow->tuplehash[dir].tuple.dst_cache); -+} -+ - int flow_offload_route_init(struct flow_offload *flow, - const struct nf_flow_route *route) - { -@@ -118,7 +139,7 @@ int flow_offload_route_init(struct flow_ - return 0; - - err_route_reply: -- dst_release(route->tuple[FLOW_OFFLOAD_DIR_ORIGINAL].dst); -+ nft_flow_dst_release(flow, FLOW_OFFLOAD_DIR_ORIGINAL); - - return err; - } -@@ -169,8 +190,8 @@ static void flow_offload_fixup_ct(struct - - static void flow_offload_route_release(struct flow_offload *flow) - { -- dst_release(flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple.dst_cache); -- dst_release(flow->tuplehash[FLOW_OFFLOAD_DIR_REPLY].tuple.dst_cache); -+ nft_flow_dst_release(flow, FLOW_OFFLOAD_DIR_ORIGINAL); -+ nft_flow_dst_release(flow, FLOW_OFFLOAD_DIR_REPLY); - } - - void flow_offload_free(struct flow_offload *flow) ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -207,6 +207,24 @@ static unsigned int nf_flow_xmit_xfrm(st - return NF_STOLEN; - } - -+static unsigned int nf_flow_queue_xmit(struct net *net, struct sk_buff *skb, -+ const struct flow_offload_tuple_rhash *tuplehash, -+ unsigned short type) -+{ -+ struct net_device *outdev; -+ -+ outdev = dev_get_by_index_rcu(net, tuplehash->tuple.out.ifidx); -+ if (!outdev) -+ return NF_DROP; -+ -+ skb->dev = outdev; -+ dev_hard_header(skb, skb->dev, type, tuplehash->tuple.out.h_dest, -+ tuplehash->tuple.out.h_source, skb->len); -+ dev_queue_xmit(skb); -+ -+ return NF_STOLEN; -+} -+ - unsigned int - nf_flow_offload_ip_hook(void *priv, struct sk_buff *skb, - const struct nf_hook_state *state) -@@ -222,6 +240,7 @@ nf_flow_offload_ip_hook(void *priv, stru - struct iphdr *iph; - __be32 nexthop; - u32 hdrsize; -+ int ret; - - if (skb->protocol != htons(ETH_P_IP)) - return NF_ACCEPT; -@@ -244,9 +263,13 @@ nf_flow_offload_ip_hook(void *priv, stru - if (nf_flow_state_check(flow, iph->protocol, skb, thoff)) - return NF_ACCEPT; - -- if (!dst_check(&rt->dst, 0)) { -- flow_offload_teardown(flow); -- return NF_ACCEPT; -+ if (tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_NEIGH || -+ tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM) { -+ rt = (struct rtable *)tuplehash->tuple.dst_cache; -+ if (!dst_check(&rt->dst, 0)) { -+ flow_offload_teardown(flow); -+ return NF_ACCEPT; -+ } - } - - if (skb_try_make_writable(skb, thoff + hdrsize)) -@@ -263,8 +286,6 @@ nf_flow_offload_ip_hook(void *priv, stru - if (flow_table->flags & NF_FLOWTABLE_COUNTER) - nf_ct_acct_update(flow->ct, tuplehash->tuple.dir, skb->len); - -- rt = (struct rtable *)tuplehash->tuple.dst_cache; -- - if (unlikely(tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM)) { - memset(skb->cb, 0, sizeof(struct inet_skb_parm)); - IPCB(skb)->iif = skb->dev->ifindex; -@@ -272,13 +293,23 @@ nf_flow_offload_ip_hook(void *priv, stru - return nf_flow_xmit_xfrm(skb, state, &rt->dst); - } - -- outdev = rt->dst.dev; -- skb->dev = outdev; -- nexthop = rt_nexthop(rt, flow->tuplehash[!dir].tuple.src_v4.s_addr); -- skb_dst_set_noref(skb, &rt->dst); -- neigh_xmit(NEIGH_ARP_TABLE, outdev, &nexthop, skb); -+ switch (tuplehash->tuple.xmit_type) { -+ case FLOW_OFFLOAD_XMIT_NEIGH: -+ outdev = rt->dst.dev; -+ skb->dev = outdev; -+ nexthop = rt_nexthop(rt, flow->tuplehash[!dir].tuple.src_v4.s_addr); -+ skb_dst_set_noref(skb, &rt->dst); -+ neigh_xmit(NEIGH_ARP_TABLE, outdev, &nexthop, skb); -+ ret = NF_STOLEN; -+ break; -+ case FLOW_OFFLOAD_XMIT_DIRECT: -+ ret = nf_flow_queue_xmit(state->net, skb, tuplehash, ETH_P_IP); -+ if (ret == NF_DROP) -+ flow_offload_teardown(flow); -+ break; -+ } - -- return NF_STOLEN; -+ return ret; - } - EXPORT_SYMBOL_GPL(nf_flow_offload_ip_hook); - -@@ -444,6 +475,7 @@ nf_flow_offload_ipv6_hook(void *priv, st - struct ipv6hdr *ip6h; - struct rt6_info *rt; - u32 hdrsize; -+ int ret; - - if (skb->protocol != htons(ETH_P_IPV6)) - return NF_ACCEPT; -@@ -465,9 +497,13 @@ nf_flow_offload_ipv6_hook(void *priv, st - sizeof(*ip6h))) - return NF_ACCEPT; - -- if (!dst_check(&rt->dst, 0)) { -- flow_offload_teardown(flow); -- return NF_ACCEPT; -+ if (tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_NEIGH || -+ tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM) { -+ rt = (struct rt6_info *)tuplehash->tuple.dst_cache; -+ if (!dst_check(&rt->dst, 0)) { -+ flow_offload_teardown(flow); -+ return NF_ACCEPT; -+ } - } - - if (skb_try_make_writable(skb, sizeof(*ip6h) + hdrsize)) -@@ -484,8 +520,6 @@ nf_flow_offload_ipv6_hook(void *priv, st - if (flow_table->flags & NF_FLOWTABLE_COUNTER) - nf_ct_acct_update(flow->ct, tuplehash->tuple.dir, skb->len); - -- rt = (struct rt6_info *)tuplehash->tuple.dst_cache; -- - if (unlikely(tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM)) { - memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); - IP6CB(skb)->iif = skb->dev->ifindex; -@@ -493,12 +527,22 @@ nf_flow_offload_ipv6_hook(void *priv, st - return nf_flow_xmit_xfrm(skb, state, &rt->dst); - } - -- outdev = rt->dst.dev; -- skb->dev = outdev; -- nexthop = rt6_nexthop(rt, &flow->tuplehash[!dir].tuple.src_v6); -- skb_dst_set_noref(skb, &rt->dst); -- neigh_xmit(NEIGH_ND_TABLE, outdev, nexthop, skb); -+ switch (tuplehash->tuple.xmit_type) { -+ case FLOW_OFFLOAD_XMIT_NEIGH: -+ outdev = rt->dst.dev; -+ skb->dev = outdev; -+ nexthop = rt6_nexthop(rt, &flow->tuplehash[!dir].tuple.src_v6); -+ skb_dst_set_noref(skb, &rt->dst); -+ neigh_xmit(NEIGH_ND_TABLE, outdev, nexthop, skb); -+ ret = NF_STOLEN; -+ break; -+ case FLOW_OFFLOAD_XMIT_DIRECT: -+ ret = nf_flow_queue_xmit(state->net, skb, tuplehash, ETH_P_IPV6); -+ if (ret == NF_DROP) -+ flow_offload_teardown(flow); -+ break; -+ } - -- return NF_STOLEN; -+ return ret; - } - EXPORT_SYMBOL_GPL(nf_flow_offload_ipv6_hook); ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -39,12 +39,11 @@ static void nft_default_forward_path(str - static int nft_dev_fill_forward_path(const struct nf_flow_route *route, - const struct dst_entry *dst_cache, - const struct nf_conn *ct, -- enum ip_conntrack_dir dir, -+ enum ip_conntrack_dir dir, u8 *ha, - struct net_device_path_stack *stack) - { - const void *daddr = &ct->tuplehash[!dir].tuple.src.u3; - struct net_device *dev = dst_cache->dev; -- unsigned char ha[ETH_ALEN]; - struct neighbour *n; - u8 nud_state; - -@@ -66,27 +65,43 @@ static int nft_dev_fill_forward_path(con - - struct nft_forward_info { - const struct net_device *indev; -+ const struct net_device *outdev; -+ u8 h_source[ETH_ALEN]; -+ u8 h_dest[ETH_ALEN]; -+ enum flow_offload_xmit_type xmit_type; - }; - - static void nft_dev_path_info(const struct net_device_path_stack *stack, -- struct nft_forward_info *info) -+ struct nft_forward_info *info, -+ unsigned char *ha) - { - const struct net_device_path *path; - int i; - -+ memcpy(info->h_dest, ha, ETH_ALEN); -+ - for (i = 0; i < stack->num_paths; i++) { - path = &stack->path[i]; - switch (path->type) { - case DEV_PATH_ETHERNET: - info->indev = path->dev; -+ if (is_zero_ether_addr(info->h_source)) -+ memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); - break; -- case DEV_PATH_VLAN: - case DEV_PATH_BRIDGE: -+ if (is_zero_ether_addr(info->h_source)) -+ memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); -+ -+ info->xmit_type = FLOW_OFFLOAD_XMIT_DIRECT; -+ break; -+ case DEV_PATH_VLAN: - default: - info->indev = NULL; - break; - } - } -+ if (!info->outdev) -+ info->outdev = info->indev; - } - - static bool nft_flowtable_find_dev(const struct net_device *dev, -@@ -114,14 +129,22 @@ static void nft_dev_forward_path(struct - const struct dst_entry *dst = route->tuple[dir].dst; - struct net_device_path_stack stack; - struct nft_forward_info info = {}; -+ unsigned char ha[ETH_ALEN]; - -- if (nft_dev_fill_forward_path(route, dst, ct, dir, &stack) >= 0) -- nft_dev_path_info(&stack, &info); -+ if (nft_dev_fill_forward_path(route, dst, ct, dir, ha, &stack) >= 0) -+ nft_dev_path_info(&stack, &info, ha); - - if (!info.indev || !nft_flowtable_find_dev(info.indev, ft)) - return; - - route->tuple[!dir].in.ifindex = info.indev->ifindex; -+ -+ if (info.xmit_type == FLOW_OFFLOAD_XMIT_DIRECT) { -+ memcpy(route->tuple[dir].out.h_source, info.h_source, ETH_ALEN); -+ memcpy(route->tuple[dir].out.h_dest, info.h_dest, ETH_ALEN); -+ route->tuple[dir].out.ifindex = info.outdev->ifindex; -+ route->tuple[dir].xmit_type = info.xmit_type; -+ } - } - - static int nft_flow_route(const struct nft_pktinfo *pkt, diff --git a/target/linux/generic/backport-5.10/610-v5.13-20-netfilter-flowtable-add-vlan-support.patch b/target/linux/generic/backport-5.10/610-v5.13-20-netfilter-flowtable-add-vlan-support.patch deleted file mode 100644 index 86a1129880..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-20-netfilter-flowtable-add-vlan-support.patch +++ /dev/null @@ -1,410 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:41 +0100 -Subject: [PATCH] netfilter: flowtable: add vlan support - -Add the vlan id and protocol to the flow tuple to uniquely identify -flows from the receive path. For the transmit path, dev_hard_header() on -the vlan device push the headers. This patch includes support for two -vlan headers (QinQ) from the ingress path. - -Add a generic encap field to the flowtable entry which stores the -protocol and the tag id. This allows to reuse these fields in the PPPoE -support coming in a later patch. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -95,6 +95,8 @@ enum flow_offload_xmit_type { - FLOW_OFFLOAD_XMIT_DIRECT, - }; - -+#define NF_FLOW_TABLE_ENCAP_MAX 2 -+ - struct flow_offload_tuple { - union { - struct in_addr src_v4; -@@ -113,13 +115,17 @@ struct flow_offload_tuple { - - u8 l3proto; - u8 l4proto; -+ struct { -+ u16 id; -+ __be16 proto; -+ } encap[NF_FLOW_TABLE_ENCAP_MAX]; - - /* All members above are keys for lookups, see flow_offload_hash(). */ - struct { } __hash; - -- u8 dir:6, -- xmit_type:2; -- -+ u8 dir:4, -+ xmit_type:2, -+ encap_num:2; - u16 mtu; - union { - struct dst_entry *dst_cache; -@@ -173,6 +179,11 @@ struct nf_flow_route { - struct dst_entry *dst; - struct { - u32 ifindex; -+ struct { -+ u16 id; -+ __be16 proto; -+ } encap[NF_FLOW_TABLE_ENCAP_MAX]; -+ u8 num_encaps; - } in; - struct { - u32 ifindex; ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -80,6 +80,7 @@ static int flow_offload_fill_route(struc - { - struct flow_offload_tuple *flow_tuple = &flow->tuplehash[dir].tuple; - struct dst_entry *dst = route->tuple[dir].dst; -+ int i, j = 0; - - switch (flow_tuple->l3proto) { - case NFPROTO_IPV4: -@@ -91,6 +92,12 @@ static int flow_offload_fill_route(struc - } - - flow_tuple->iifidx = route->tuple[dir].in.ifindex; -+ for (i = route->tuple[dir].in.num_encaps - 1; i >= 0; i--) { -+ flow_tuple->encap[j].id = route->tuple[dir].in.encap[i].id; -+ flow_tuple->encap[j].proto = route->tuple[dir].in.encap[i].proto; -+ j++; -+ } -+ flow_tuple->encap_num = route->tuple[dir].in.num_encaps; - - switch (route->tuple[dir].xmit_type) { - case FLOW_OFFLOAD_XMIT_DIRECT: ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -136,23 +136,44 @@ static bool ip_has_options(unsigned int - return thoff != sizeof(struct iphdr); - } - -+static void nf_flow_tuple_encap(struct sk_buff *skb, -+ struct flow_offload_tuple *tuple) -+{ -+ int i = 0; -+ -+ if (skb_vlan_tag_present(skb)) { -+ tuple->encap[i].id = skb_vlan_tag_get(skb); -+ tuple->encap[i].proto = skb->vlan_proto; -+ i++; -+ } -+ if (skb->protocol == htons(ETH_P_8021Q)) { -+ struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb_mac_header(skb); -+ -+ tuple->encap[i].id = ntohs(veth->h_vlan_TCI); -+ tuple->encap[i].proto = skb->protocol; -+ } -+} -+ - static int nf_flow_tuple_ip(struct sk_buff *skb, const struct net_device *dev, -- struct flow_offload_tuple *tuple, u32 *hdrsize) -+ struct flow_offload_tuple *tuple, u32 *hdrsize, -+ u32 offset) - { - struct flow_ports *ports; - unsigned int thoff; - struct iphdr *iph; - -- if (!pskb_may_pull(skb, sizeof(*iph))) -+ if (!pskb_may_pull(skb, sizeof(*iph) + offset)) - return -1; - -- iph = ip_hdr(skb); -- thoff = iph->ihl * 4; -+ iph = (struct iphdr *)(skb_network_header(skb) + offset); -+ thoff = (iph->ihl * 4); - - if (ip_is_fragment(iph) || - unlikely(ip_has_options(thoff))) - return -1; - -+ thoff += offset; -+ - switch (iph->protocol) { - case IPPROTO_TCP: - *hdrsize = sizeof(struct tcphdr); -@@ -167,11 +188,10 @@ static int nf_flow_tuple_ip(struct sk_bu - if (iph->ttl <= 1) - return -1; - -- thoff = iph->ihl * 4; - if (!pskb_may_pull(skb, thoff + *hdrsize)) - return -1; - -- iph = ip_hdr(skb); -+ iph = (struct iphdr *)(skb_network_header(skb) + offset); - ports = (struct flow_ports *)(skb_network_header(skb) + thoff); - - tuple->src_v4.s_addr = iph->saddr; -@@ -181,6 +201,7 @@ static int nf_flow_tuple_ip(struct sk_bu - tuple->l3proto = AF_INET; - tuple->l4proto = iph->protocol; - tuple->iifidx = dev->ifindex; -+ nf_flow_tuple_encap(skb, tuple); - - return 0; - } -@@ -207,6 +228,43 @@ static unsigned int nf_flow_xmit_xfrm(st - return NF_STOLEN; - } - -+static bool nf_flow_skb_encap_protocol(const struct sk_buff *skb, __be16 proto, -+ u32 *offset) -+{ -+ if (skb->protocol == htons(ETH_P_8021Q)) { -+ struct vlan_ethhdr *veth; -+ -+ veth = (struct vlan_ethhdr *)skb_mac_header(skb); -+ if (veth->h_vlan_encapsulated_proto == proto) { -+ *offset += VLAN_HLEN; -+ return true; -+ } -+ } -+ -+ return false; -+} -+ -+static void nf_flow_encap_pop(struct sk_buff *skb, -+ struct flow_offload_tuple_rhash *tuplehash) -+{ -+ struct vlan_hdr *vlan_hdr; -+ int i; -+ -+ for (i = 0; i < tuplehash->tuple.encap_num; i++) { -+ if (skb_vlan_tag_present(skb)) { -+ __vlan_hwaccel_clear_tag(skb); -+ continue; -+ } -+ if (skb->protocol == htons(ETH_P_8021Q)) { -+ vlan_hdr = (struct vlan_hdr *)skb->data; -+ __skb_pull(skb, VLAN_HLEN); -+ vlan_set_encap_proto(skb, vlan_hdr); -+ skb_reset_network_header(skb); -+ break; -+ } -+ } -+} -+ - static unsigned int nf_flow_queue_xmit(struct net *net, struct sk_buff *skb, - const struct flow_offload_tuple_rhash *tuplehash, - unsigned short type) -@@ -235,17 +293,18 @@ nf_flow_offload_ip_hook(void *priv, stru - enum flow_offload_tuple_dir dir; - struct flow_offload *flow; - struct net_device *outdev; -+ u32 hdrsize, offset = 0; -+ unsigned int thoff, mtu; - struct rtable *rt; -- unsigned int thoff; - struct iphdr *iph; - __be32 nexthop; -- u32 hdrsize; - int ret; - -- if (skb->protocol != htons(ETH_P_IP)) -+ if (skb->protocol != htons(ETH_P_IP) && -+ !nf_flow_skb_encap_protocol(skb, htons(ETH_P_IP), &offset)) - return NF_ACCEPT; - -- if (nf_flow_tuple_ip(skb, state->in, &tuple, &hdrsize) < 0) -+ if (nf_flow_tuple_ip(skb, state->in, &tuple, &hdrsize, offset) < 0) - return NF_ACCEPT; - - tuplehash = flow_offload_lookup(flow_table, &tuple); -@@ -255,11 +314,12 @@ nf_flow_offload_ip_hook(void *priv, stru - dir = tuplehash->tuple.dir; - flow = container_of(tuplehash, struct flow_offload, tuplehash[dir]); - -- if (unlikely(nf_flow_exceeds_mtu(skb, flow->tuplehash[dir].tuple.mtu))) -+ mtu = flow->tuplehash[dir].tuple.mtu + offset; -+ if (unlikely(nf_flow_exceeds_mtu(skb, mtu))) - return NF_ACCEPT; - -- iph = ip_hdr(skb); -- thoff = iph->ihl * 4; -+ iph = (struct iphdr *)(skb_network_header(skb) + offset); -+ thoff = (iph->ihl * 4) + offset; - if (nf_flow_state_check(flow, iph->protocol, skb, thoff)) - return NF_ACCEPT; - -@@ -277,6 +337,9 @@ nf_flow_offload_ip_hook(void *priv, stru - - flow_offload_refresh(flow_table, flow); - -+ nf_flow_encap_pop(skb, tuplehash); -+ thoff -= offset; -+ - iph = ip_hdr(skb); - nf_flow_nat_ip(flow, skb, thoff, dir, iph); - -@@ -418,16 +481,18 @@ static void nf_flow_nat_ipv6(const struc - } - - static int nf_flow_tuple_ipv6(struct sk_buff *skb, const struct net_device *dev, -- struct flow_offload_tuple *tuple, u32 *hdrsize) -+ struct flow_offload_tuple *tuple, u32 *hdrsize, -+ u32 offset) - { - struct flow_ports *ports; - struct ipv6hdr *ip6h; - unsigned int thoff; - -- if (!pskb_may_pull(skb, sizeof(*ip6h))) -+ thoff = sizeof(*ip6h) + offset; -+ if (!pskb_may_pull(skb, thoff)) - return -1; - -- ip6h = ipv6_hdr(skb); -+ ip6h = (struct ipv6hdr *)(skb_network_header(skb) + offset); - - switch (ip6h->nexthdr) { - case IPPROTO_TCP: -@@ -443,11 +508,10 @@ static int nf_flow_tuple_ipv6(struct sk_ - if (ip6h->hop_limit <= 1) - return -1; - -- thoff = sizeof(*ip6h); - if (!pskb_may_pull(skb, thoff + *hdrsize)) - return -1; - -- ip6h = ipv6_hdr(skb); -+ ip6h = (struct ipv6hdr *)(skb_network_header(skb) + offset); - ports = (struct flow_ports *)(skb_network_header(skb) + thoff); - - tuple->src_v6 = ip6h->saddr; -@@ -457,6 +521,7 @@ static int nf_flow_tuple_ipv6(struct sk_ - tuple->l3proto = AF_INET6; - tuple->l4proto = ip6h->nexthdr; - tuple->iifidx = dev->ifindex; -+ nf_flow_tuple_encap(skb, tuple); - - return 0; - } -@@ -472,15 +537,17 @@ nf_flow_offload_ipv6_hook(void *priv, st - const struct in6_addr *nexthop; - struct flow_offload *flow; - struct net_device *outdev; -+ unsigned int thoff, mtu; -+ u32 hdrsize, offset = 0; - struct ipv6hdr *ip6h; - struct rt6_info *rt; -- u32 hdrsize; - int ret; - -- if (skb->protocol != htons(ETH_P_IPV6)) -+ if (skb->protocol != htons(ETH_P_IPV6) && -+ !nf_flow_skb_encap_protocol(skb, htons(ETH_P_IPV6), &offset)) - return NF_ACCEPT; - -- if (nf_flow_tuple_ipv6(skb, state->in, &tuple, &hdrsize) < 0) -+ if (nf_flow_tuple_ipv6(skb, state->in, &tuple, &hdrsize, offset) < 0) - return NF_ACCEPT; - - tuplehash = flow_offload_lookup(flow_table, &tuple); -@@ -490,11 +557,13 @@ nf_flow_offload_ipv6_hook(void *priv, st - dir = tuplehash->tuple.dir; - flow = container_of(tuplehash, struct flow_offload, tuplehash[dir]); - -- if (unlikely(nf_flow_exceeds_mtu(skb, flow->tuplehash[dir].tuple.mtu))) -+ mtu = flow->tuplehash[dir].tuple.mtu + offset; -+ if (unlikely(nf_flow_exceeds_mtu(skb, mtu))) - return NF_ACCEPT; - -- if (nf_flow_state_check(flow, ipv6_hdr(skb)->nexthdr, skb, -- sizeof(*ip6h))) -+ ip6h = (struct ipv6hdr *)(skb_network_header(skb) + offset); -+ thoff = sizeof(*ip6h) + offset; -+ if (nf_flow_state_check(flow, ip6h->nexthdr, skb, thoff)) - return NF_ACCEPT; - - if (tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_NEIGH || -@@ -506,11 +575,13 @@ nf_flow_offload_ipv6_hook(void *priv, st - } - } - -- if (skb_try_make_writable(skb, sizeof(*ip6h) + hdrsize)) -+ if (skb_try_make_writable(skb, thoff + hdrsize)) - return NF_DROP; - - flow_offload_refresh(flow_table, flow); - -+ nf_flow_encap_pop(skb, tuplehash); -+ - ip6h = ipv6_hdr(skb); - nf_flow_nat_ipv6(flow, skb, dir, ip6h); - ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -66,6 +66,11 @@ static int nft_dev_fill_forward_path(con - struct nft_forward_info { - const struct net_device *indev; - const struct net_device *outdev; -+ struct id { -+ __u16 id; -+ __be16 proto; -+ } encap[NF_FLOW_TABLE_ENCAP_MAX]; -+ u8 num_encaps; - u8 h_source[ETH_ALEN]; - u8 h_dest[ETH_ALEN]; - enum flow_offload_xmit_type xmit_type; -@@ -84,9 +89,23 @@ static void nft_dev_path_info(const stru - path = &stack->path[i]; - switch (path->type) { - case DEV_PATH_ETHERNET: -+ case DEV_PATH_VLAN: - info->indev = path->dev; - if (is_zero_ether_addr(info->h_source)) - memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); -+ -+ if (path->type == DEV_PATH_ETHERNET) -+ break; -+ -+ /* DEV_PATH_VLAN */ -+ if (info->num_encaps >= NF_FLOW_TABLE_ENCAP_MAX) { -+ info->indev = NULL; -+ break; -+ } -+ info->outdev = path->dev; -+ info->encap[info->num_encaps].id = path->encap.id; -+ info->encap[info->num_encaps].proto = path->encap.proto; -+ info->num_encaps++; - break; - case DEV_PATH_BRIDGE: - if (is_zero_ether_addr(info->h_source)) -@@ -94,7 +113,6 @@ static void nft_dev_path_info(const stru - - info->xmit_type = FLOW_OFFLOAD_XMIT_DIRECT; - break; -- case DEV_PATH_VLAN: - default: - info->indev = NULL; - break; -@@ -130,6 +148,7 @@ static void nft_dev_forward_path(struct - struct net_device_path_stack stack; - struct nft_forward_info info = {}; - unsigned char ha[ETH_ALEN]; -+ int i; - - if (nft_dev_fill_forward_path(route, dst, ct, dir, ha, &stack) >= 0) - nft_dev_path_info(&stack, &info, ha); -@@ -138,6 +157,11 @@ static void nft_dev_forward_path(struct - return; - - route->tuple[!dir].in.ifindex = info.indev->ifindex; -+ for (i = 0; i < info.num_encaps; i++) { -+ route->tuple[!dir].in.encap[i].id = info.encap[i].id; -+ route->tuple[!dir].in.encap[i].proto = info.encap[i].proto; -+ } -+ route->tuple[!dir].in.num_encaps = info.num_encaps; - - if (info.xmit_type == FLOW_OFFLOAD_XMIT_DIRECT) { - memcpy(route->tuple[dir].out.h_source, info.h_source, ETH_ALEN); diff --git a/target/linux/generic/backport-5.10/610-v5.13-21-netfilter-flowtable-add-bridge-vlan-filtering-suppor.patch b/target/linux/generic/backport-5.10/610-v5.13-21-netfilter-flowtable-add-bridge-vlan-filtering-suppor.patch deleted file mode 100644 index cb3ef99029..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-21-netfilter-flowtable-add-bridge-vlan-filtering-suppor.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:42 +0100 -Subject: [PATCH] netfilter: flowtable: add bridge vlan filtering support - -Add the vlan tag based when PVID is set on. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -111,6 +111,18 @@ static void nft_dev_path_info(const stru - if (is_zero_ether_addr(info->h_source)) - memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); - -+ switch (path->bridge.vlan_mode) { -+ case DEV_PATH_BR_VLAN_TAG: -+ info->encap[info->num_encaps].id = path->bridge.vlan_id; -+ info->encap[info->num_encaps].proto = path->bridge.vlan_proto; -+ info->num_encaps++; -+ break; -+ case DEV_PATH_BR_VLAN_UNTAG: -+ info->num_encaps--; -+ break; -+ case DEV_PATH_BR_VLAN_KEEP: -+ break; -+ } - info->xmit_type = FLOW_OFFLOAD_XMIT_DIRECT; - break; - default: diff --git a/target/linux/generic/backport-5.10/610-v5.13-22-netfilter-flowtable-add-pppoe-support.patch b/target/linux/generic/backport-5.10/610-v5.13-22-netfilter-flowtable-add-pppoe-support.patch deleted file mode 100644 index d5789cbad2..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-22-netfilter-flowtable-add-pppoe-support.patch +++ /dev/null @@ -1,145 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:43 +0100 -Subject: [PATCH] netfilter: flowtable: add pppoe support - -Add the PPPoE protocol and session id to the flow tuple using the encap -fields to uniquely identify flows from the receive path. For the -transmit path, dev_hard_header() on the vlan device push the headers. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -7,6 +7,9 @@ - #include - #include - #include -+#include -+#include -+#include - #include - #include - #include -@@ -139,6 +142,8 @@ static bool ip_has_options(unsigned int - static void nf_flow_tuple_encap(struct sk_buff *skb, - struct flow_offload_tuple *tuple) - { -+ struct vlan_ethhdr *veth; -+ struct pppoe_hdr *phdr; - int i = 0; - - if (skb_vlan_tag_present(skb)) { -@@ -146,11 +151,17 @@ static void nf_flow_tuple_encap(struct s - tuple->encap[i].proto = skb->vlan_proto; - i++; - } -- if (skb->protocol == htons(ETH_P_8021Q)) { -- struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb_mac_header(skb); -- -+ switch (skb->protocol) { -+ case htons(ETH_P_8021Q): -+ veth = (struct vlan_ethhdr *)skb_mac_header(skb); - tuple->encap[i].id = ntohs(veth->h_vlan_TCI); - tuple->encap[i].proto = skb->protocol; -+ break; -+ case htons(ETH_P_PPP_SES): -+ phdr = (struct pppoe_hdr *)skb_mac_header(skb); -+ tuple->encap[i].id = ntohs(phdr->sid); -+ tuple->encap[i].proto = skb->protocol; -+ break; - } - } - -@@ -228,17 +239,41 @@ static unsigned int nf_flow_xmit_xfrm(st - return NF_STOLEN; - } - -+static inline __be16 nf_flow_pppoe_proto(const struct sk_buff *skb) -+{ -+ __be16 proto; -+ -+ proto = *((__be16 *)(skb_mac_header(skb) + ETH_HLEN + -+ sizeof(struct pppoe_hdr))); -+ switch (proto) { -+ case htons(PPP_IP): -+ return htons(ETH_P_IP); -+ case htons(PPP_IPV6): -+ return htons(ETH_P_IPV6); -+ } -+ -+ return 0; -+} -+ - static bool nf_flow_skb_encap_protocol(const struct sk_buff *skb, __be16 proto, - u32 *offset) - { -- if (skb->protocol == htons(ETH_P_8021Q)) { -- struct vlan_ethhdr *veth; -+ struct vlan_ethhdr *veth; - -+ switch (skb->protocol) { -+ case htons(ETH_P_8021Q): - veth = (struct vlan_ethhdr *)skb_mac_header(skb); - if (veth->h_vlan_encapsulated_proto == proto) { - *offset += VLAN_HLEN; - return true; - } -+ break; -+ case htons(ETH_P_PPP_SES): -+ if (nf_flow_pppoe_proto(skb) == proto) { -+ *offset += PPPOE_SES_HLEN; -+ return true; -+ } -+ break; - } - - return false; -@@ -255,12 +290,18 @@ static void nf_flow_encap_pop(struct sk_ - __vlan_hwaccel_clear_tag(skb); - continue; - } -- if (skb->protocol == htons(ETH_P_8021Q)) { -+ switch (skb->protocol) { -+ case htons(ETH_P_8021Q): - vlan_hdr = (struct vlan_hdr *)skb->data; - __skb_pull(skb, VLAN_HLEN); - vlan_set_encap_proto(skb, vlan_hdr); - skb_reset_network_header(skb); - break; -+ case htons(ETH_P_PPP_SES): -+ skb->protocol = nf_flow_pppoe_proto(skb); -+ skb_pull(skb, PPPOE_SES_HLEN); -+ skb_reset_network_header(skb); -+ break; - } - } - } ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -90,6 +90,7 @@ static void nft_dev_path_info(const stru - switch (path->type) { - case DEV_PATH_ETHERNET: - case DEV_PATH_VLAN: -+ case DEV_PATH_PPPOE: - info->indev = path->dev; - if (is_zero_ether_addr(info->h_source)) - memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); -@@ -97,7 +98,7 @@ static void nft_dev_path_info(const stru - if (path->type == DEV_PATH_ETHERNET) - break; - -- /* DEV_PATH_VLAN */ -+ /* DEV_PATH_VLAN and DEV_PATH_PPPOE */ - if (info->num_encaps >= NF_FLOW_TABLE_ENCAP_MAX) { - info->indev = NULL; - break; -@@ -106,6 +107,8 @@ static void nft_dev_path_info(const stru - info->encap[info->num_encaps].id = path->encap.id; - info->encap[info->num_encaps].proto = path->encap.proto; - info->num_encaps++; -+ if (path->type == DEV_PATH_PPPOE) -+ memcpy(info->h_dest, path->encap.h_dest, ETH_ALEN); - break; - case DEV_PATH_BRIDGE: - if (is_zero_ether_addr(info->h_source)) diff --git a/target/linux/generic/backport-5.10/610-v5.13-23-netfilter-flowtable-add-dsa-support.patch b/target/linux/generic/backport-5.10/610-v5.13-23-netfilter-flowtable-add-dsa-support.patch deleted file mode 100644 index b4931830d3..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-23-netfilter-flowtable-add-dsa-support.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:44 +0100 -Subject: [PATCH] netfilter: flowtable: add dsa support - -Replace the master ethernet device by the dsa slave port. Packets coming -in from the software ingress path use the dsa slave port as input -device. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -89,6 +89,7 @@ static void nft_dev_path_info(const stru - path = &stack->path[i]; - switch (path->type) { - case DEV_PATH_ETHERNET: -+ case DEV_PATH_DSA: - case DEV_PATH_VLAN: - case DEV_PATH_PPPOE: - info->indev = path->dev; -@@ -97,6 +98,10 @@ static void nft_dev_path_info(const stru - - if (path->type == DEV_PATH_ETHERNET) - break; -+ if (path->type == DEV_PATH_DSA) { -+ i = stack->num_paths; -+ break; -+ } - - /* DEV_PATH_VLAN and DEV_PATH_PPPOE */ - if (info->num_encaps >= NF_FLOW_TABLE_ENCAP_MAX) { diff --git a/target/linux/generic/backport-5.10/610-v5.13-24-selftests-netfilter-flowtable-bridge-and-vlan-suppor.patch b/target/linux/generic/backport-5.10/610-v5.13-24-selftests-netfilter-flowtable-bridge-and-vlan-suppor.patch deleted file mode 100644 index 3f332c70d3..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-24-selftests-netfilter-flowtable-bridge-and-vlan-suppor.patch +++ /dev/null @@ -1,107 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:45 +0100 -Subject: [PATCH] selftests: netfilter: flowtable bridge and vlan support - -This patch adds two new tests to cover bridge and vlan support: - -- Add a bridge device to the Router1 (nsr1) container and attach the - veth0 device to the bridge. Set the IP address to the bridge device - to exercise the bridge forwarding path. - -- Add vlan encapsulation between to the bridge device in the Router1 and - one of the sender containers (ns1). - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/tools/testing/selftests/netfilter/nft_flowtable.sh -+++ b/tools/testing/selftests/netfilter/nft_flowtable.sh -@@ -370,6 +370,88 @@ else - ip netns exec nsr1 nft list ruleset - fi - -+# Another test: -+# Add bridge interface br0 to Router1, with NAT enabled. -+ip -net nsr1 link add name br0 type bridge -+ip -net nsr1 addr flush dev veth0 -+ip -net nsr1 link set up dev veth0 -+ip -net nsr1 link set veth0 master br0 -+ip -net nsr1 addr add 10.0.1.1/24 dev br0 -+ip -net nsr1 addr add dead:1::1/64 dev br0 -+ip -net nsr1 link set up dev br0 -+ -+ip netns exec nsr1 sysctl net.ipv4.conf.br0.forwarding=1 > /dev/null -+ -+# br0 with NAT enabled. -+ip netns exec nsr1 nft -f - <&2 -+ ip netns exec nsr1 nft list ruleset -+ ret=1 -+fi -+ -+# Another test: -+# Add bridge interface br0 to Router1, with NAT and VLAN. -+ip -net nsr1 link set veth0 nomaster -+ip -net nsr1 link set down dev veth0 -+ip -net nsr1 link add link veth0 name veth0.10 type vlan id 10 -+ip -net nsr1 link set up dev veth0 -+ip -net nsr1 link set up dev veth0.10 -+ip -net nsr1 link set veth0.10 master br0 -+ -+ip -net ns1 addr flush dev eth0 -+ip -net ns1 link add link eth0 name eth0.10 type vlan id 10 -+ip -net ns1 link set eth0 up -+ip -net ns1 link set eth0.10 up -+ip -net ns1 addr add 10.0.1.99/24 dev eth0.10 -+ip -net ns1 route add default via 10.0.1.1 -+ip -net ns1 addr add dead:1::99/64 dev eth0.10 -+ -+if test_tcp_forwarding_nat ns1 ns2; then -+ echo "PASS: flow offloaded for ns1/ns2 with bridge NAT and VLAN" -+else -+ echo "FAIL: flow offload for ns1/ns2 with bridge NAT and VLAN" 1>&2 -+ ip netns exec nsr1 nft list ruleset -+ ret=1 -+fi -+ -+# restore test topology (remove bridge and VLAN) -+ip -net nsr1 link set veth0 nomaster -+ip -net nsr1 link set veth0 down -+ip -net nsr1 link set veth0.10 down -+ip -net nsr1 link delete veth0.10 type vlan -+ip -net nsr1 link delete br0 type bridge -+ip -net ns1 addr flush dev eth0.10 -+ip -net ns1 link set eth0.10 down -+ip -net ns1 link set eth0 down -+ip -net ns1 link delete eth0.10 type vlan -+ -+# restore address in ns1 and nsr1 -+ip -net ns1 link set eth0 up -+ip -net ns1 addr add 10.0.1.99/24 dev eth0 -+ip -net ns1 route add default via 10.0.1.1 -+ip -net ns1 addr add dead:1::99/64 dev eth0 -+ip -net ns1 route add default via dead:1::1 -+ip -net nsr1 addr add 10.0.1.1/24 dev veth0 -+ip -net nsr1 addr add dead:1::1/64 dev veth0 -+ip -net nsr1 link set up dev veth0 -+ - KEY_SHA="0x"$(ps -xaf | sha1sum | cut -d " " -f 1) - KEY_AES="0x"$(ps -xaf | md5sum | cut -d " " -f 1) - SPI1=$RANDOM diff --git a/target/linux/generic/backport-5.10/610-v5.13-25-netfilter-flowtable-add-offload-support-for-xmit-pat.patch b/target/linux/generic/backport-5.10/610-v5.13-25-netfilter-flowtable-add-offload-support-for-xmit-pat.patch deleted file mode 100644 index 7b6ec68d55..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-25-netfilter-flowtable-add-offload-support-for-xmit-pat.patch +++ /dev/null @@ -1,310 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:46 +0100 -Subject: [PATCH] netfilter: flowtable: add offload support for xmit path - types - -When the flow tuple xmit_type is set to FLOW_OFFLOAD_XMIT_DIRECT, the -dst_cache pointer is not valid, and the h_source/h_dest/ifidx out fields -need to be used. - -This patch also adds the FLOW_ACTION_VLAN_PUSH action to pass the VLAN -tag to the driver. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nf_flow_table_offload.c -+++ b/net/netfilter/nf_flow_table_offload.c -@@ -177,28 +177,45 @@ static int flow_offload_eth_src(struct n - enum flow_offload_tuple_dir dir, - struct nf_flow_rule *flow_rule) - { -- const struct flow_offload_tuple *tuple = &flow->tuplehash[!dir].tuple; - struct flow_action_entry *entry0 = flow_action_entry_next(flow_rule); - struct flow_action_entry *entry1 = flow_action_entry_next(flow_rule); -- struct net_device *dev; -+ const struct flow_offload_tuple *other_tuple, *this_tuple; -+ struct net_device *dev = NULL; -+ const unsigned char *addr; - u32 mask, val; - u16 val16; - -- dev = dev_get_by_index(net, tuple->iifidx); -- if (!dev) -- return -ENOENT; -+ this_tuple = &flow->tuplehash[dir].tuple; -+ -+ switch (this_tuple->xmit_type) { -+ case FLOW_OFFLOAD_XMIT_DIRECT: -+ addr = this_tuple->out.h_source; -+ break; -+ case FLOW_OFFLOAD_XMIT_NEIGH: -+ other_tuple = &flow->tuplehash[!dir].tuple; -+ dev = dev_get_by_index(net, other_tuple->iifidx); -+ if (!dev) -+ return -ENOENT; -+ -+ addr = dev->dev_addr; -+ break; -+ default: -+ return -EOPNOTSUPP; -+ } - - mask = ~0xffff0000; -- memcpy(&val16, dev->dev_addr, 2); -+ memcpy(&val16, addr, 2); - val = val16 << 16; - flow_offload_mangle(entry0, FLOW_ACT_MANGLE_HDR_TYPE_ETH, 4, - &val, &mask); - - mask = ~0xffffffff; -- memcpy(&val, dev->dev_addr + 2, 4); -+ memcpy(&val, addr + 2, 4); - flow_offload_mangle(entry1, FLOW_ACT_MANGLE_HDR_TYPE_ETH, 8, - &val, &mask); -- dev_put(dev); -+ -+ if (dev) -+ dev_put(dev); - - return 0; - } -@@ -210,27 +227,40 @@ static int flow_offload_eth_dst(struct n - { - struct flow_action_entry *entry0 = flow_action_entry_next(flow_rule); - struct flow_action_entry *entry1 = flow_action_entry_next(flow_rule); -- const void *daddr = &flow->tuplehash[!dir].tuple.src_v4; -+ const struct flow_offload_tuple *other_tuple, *this_tuple; - const struct dst_entry *dst_cache; - unsigned char ha[ETH_ALEN]; - struct neighbour *n; -+ const void *daddr; - u32 mask, val; - u8 nud_state; - u16 val16; - -- dst_cache = flow->tuplehash[dir].tuple.dst_cache; -- n = dst_neigh_lookup(dst_cache, daddr); -- if (!n) -- return -ENOENT; -- -- read_lock_bh(&n->lock); -- nud_state = n->nud_state; -- ether_addr_copy(ha, n->ha); -- read_unlock_bh(&n->lock); -+ this_tuple = &flow->tuplehash[dir].tuple; - -- if (!(nud_state & NUD_VALID)) { -+ switch (this_tuple->xmit_type) { -+ case FLOW_OFFLOAD_XMIT_DIRECT: -+ ether_addr_copy(ha, this_tuple->out.h_dest); -+ break; -+ case FLOW_OFFLOAD_XMIT_NEIGH: -+ other_tuple = &flow->tuplehash[!dir].tuple; -+ daddr = &other_tuple->src_v4; -+ dst_cache = this_tuple->dst_cache; -+ n = dst_neigh_lookup(dst_cache, daddr); -+ if (!n) -+ return -ENOENT; -+ -+ read_lock_bh(&n->lock); -+ nud_state = n->nud_state; -+ ether_addr_copy(ha, n->ha); -+ read_unlock_bh(&n->lock); - neigh_release(n); -- return -ENOENT; -+ -+ if (!(nud_state & NUD_VALID)) -+ return -ENOENT; -+ break; -+ default: -+ return -EOPNOTSUPP; - } - - mask = ~0xffffffff; -@@ -243,7 +273,6 @@ static int flow_offload_eth_dst(struct n - val = val16; - flow_offload_mangle(entry1, FLOW_ACT_MANGLE_HDR_TYPE_ETH, 4, - &val, &mask); -- neigh_release(n); - - return 0; - } -@@ -465,27 +494,52 @@ static void flow_offload_ipv4_checksum(s - } - } - --static void flow_offload_redirect(const struct flow_offload *flow, -+static void flow_offload_redirect(struct net *net, -+ const struct flow_offload *flow, - enum flow_offload_tuple_dir dir, - struct nf_flow_rule *flow_rule) - { -- struct flow_action_entry *entry = flow_action_entry_next(flow_rule); -- struct rtable *rt; -+ const struct flow_offload_tuple *this_tuple, *other_tuple; -+ struct flow_action_entry *entry; -+ struct net_device *dev; -+ int ifindex; -+ -+ this_tuple = &flow->tuplehash[dir].tuple; -+ switch (this_tuple->xmit_type) { -+ case FLOW_OFFLOAD_XMIT_DIRECT: -+ this_tuple = &flow->tuplehash[dir].tuple; -+ ifindex = this_tuple->out.ifidx; -+ break; -+ case FLOW_OFFLOAD_XMIT_NEIGH: -+ other_tuple = &flow->tuplehash[!dir].tuple; -+ ifindex = other_tuple->iifidx; -+ break; -+ default: -+ return; -+ } - -- rt = (struct rtable *)flow->tuplehash[dir].tuple.dst_cache; -+ dev = dev_get_by_index(net, ifindex); -+ if (!dev) -+ return; -+ -+ entry = flow_action_entry_next(flow_rule); - entry->id = FLOW_ACTION_REDIRECT; -- entry->dev = rt->dst.dev; -- dev_hold(rt->dst.dev); -+ entry->dev = dev; - } - - static void flow_offload_encap_tunnel(const struct flow_offload *flow, - enum flow_offload_tuple_dir dir, - struct nf_flow_rule *flow_rule) - { -+ const struct flow_offload_tuple *this_tuple; - struct flow_action_entry *entry; - struct dst_entry *dst; - -- dst = flow->tuplehash[dir].tuple.dst_cache; -+ this_tuple = &flow->tuplehash[dir].tuple; -+ if (this_tuple->xmit_type == FLOW_OFFLOAD_XMIT_DIRECT) -+ return; -+ -+ dst = this_tuple->dst_cache; - if (dst && dst->lwtstate) { - struct ip_tunnel_info *tun_info; - -@@ -502,10 +556,15 @@ static void flow_offload_decap_tunnel(co - enum flow_offload_tuple_dir dir, - struct nf_flow_rule *flow_rule) - { -+ const struct flow_offload_tuple *other_tuple; - struct flow_action_entry *entry; - struct dst_entry *dst; - -- dst = flow->tuplehash[!dir].tuple.dst_cache; -+ other_tuple = &flow->tuplehash[!dir].tuple; -+ if (other_tuple->xmit_type == FLOW_OFFLOAD_XMIT_DIRECT) -+ return; -+ -+ dst = other_tuple->dst_cache; - if (dst && dst->lwtstate) { - struct ip_tunnel_info *tun_info; - -@@ -517,10 +576,14 @@ static void flow_offload_decap_tunnel(co - } - } - --int nf_flow_rule_route_ipv4(struct net *net, const struct flow_offload *flow, -- enum flow_offload_tuple_dir dir, -- struct nf_flow_rule *flow_rule) -+static int -+nf_flow_rule_route_common(struct net *net, const struct flow_offload *flow, -+ enum flow_offload_tuple_dir dir, -+ struct nf_flow_rule *flow_rule) - { -+ const struct flow_offload_tuple *other_tuple; -+ int i; -+ - flow_offload_decap_tunnel(flow, dir, flow_rule); - flow_offload_encap_tunnel(flow, dir, flow_rule); - -@@ -528,6 +591,26 @@ int nf_flow_rule_route_ipv4(struct net * - flow_offload_eth_dst(net, flow, dir, flow_rule) < 0) - return -1; - -+ other_tuple = &flow->tuplehash[!dir].tuple; -+ -+ for (i = 0; i < other_tuple->encap_num; i++) { -+ struct flow_action_entry *entry = flow_action_entry_next(flow_rule); -+ -+ entry->id = FLOW_ACTION_VLAN_PUSH; -+ entry->vlan.vid = other_tuple->encap[i].id; -+ entry->vlan.proto = other_tuple->encap[i].proto; -+ } -+ -+ return 0; -+} -+ -+int nf_flow_rule_route_ipv4(struct net *net, const struct flow_offload *flow, -+ enum flow_offload_tuple_dir dir, -+ struct nf_flow_rule *flow_rule) -+{ -+ if (nf_flow_rule_route_common(net, flow, dir, flow_rule) < 0) -+ return -1; -+ - if (test_bit(NF_FLOW_SNAT, &flow->flags)) { - flow_offload_ipv4_snat(net, flow, dir, flow_rule); - flow_offload_port_snat(net, flow, dir, flow_rule); -@@ -540,7 +623,7 @@ int nf_flow_rule_route_ipv4(struct net * - test_bit(NF_FLOW_DNAT, &flow->flags)) - flow_offload_ipv4_checksum(net, flow, flow_rule); - -- flow_offload_redirect(flow, dir, flow_rule); -+ flow_offload_redirect(net, flow, dir, flow_rule); - - return 0; - } -@@ -550,11 +633,7 @@ int nf_flow_rule_route_ipv6(struct net * - enum flow_offload_tuple_dir dir, - struct nf_flow_rule *flow_rule) - { -- flow_offload_decap_tunnel(flow, dir, flow_rule); -- flow_offload_encap_tunnel(flow, dir, flow_rule); -- -- if (flow_offload_eth_src(net, flow, dir, flow_rule) < 0 || -- flow_offload_eth_dst(net, flow, dir, flow_rule) < 0) -+ if (nf_flow_rule_route_common(net, flow, dir, flow_rule) < 0) - return -1; - - if (test_bit(NF_FLOW_SNAT, &flow->flags)) { -@@ -566,7 +645,7 @@ int nf_flow_rule_route_ipv6(struct net * - flow_offload_port_dnat(net, flow, dir, flow_rule); - } - -- flow_offload_redirect(flow, dir, flow_rule); -+ flow_offload_redirect(net, flow, dir, flow_rule); - - return 0; - } -@@ -580,10 +659,10 @@ nf_flow_offload_rule_alloc(struct net *n - enum flow_offload_tuple_dir dir) - { - const struct nf_flowtable *flowtable = offload->flowtable; -+ const struct flow_offload_tuple *tuple, *other_tuple; - const struct flow_offload *flow = offload->flow; -- const struct flow_offload_tuple *tuple; -+ struct dst_entry *other_dst = NULL; - struct nf_flow_rule *flow_rule; -- struct dst_entry *other_dst; - int err = -ENOMEM; - - flow_rule = kzalloc(sizeof(*flow_rule), GFP_KERNEL); -@@ -599,7 +678,10 @@ nf_flow_offload_rule_alloc(struct net *n - flow_rule->rule->match.key = &flow_rule->match.key; - - tuple = &flow->tuplehash[dir].tuple; -- other_dst = flow->tuplehash[!dir].tuple.dst_cache; -+ other_tuple = &flow->tuplehash[!dir].tuple; -+ if (other_tuple->xmit_type == FLOW_OFFLOAD_XMIT_NEIGH) -+ other_dst = other_tuple->dst_cache; -+ - err = nf_flow_rule_match(&flow_rule->match, tuple, other_dst); - if (err < 0) - goto err_flow_match; diff --git a/target/linux/generic/backport-5.10/610-v5.13-26-netfilter-nft_flow_offload-use-direct-xmit-if-hardwa.patch b/target/linux/generic/backport-5.10/610-v5.13-26-netfilter-nft_flow_offload-use-direct-xmit-if-hardwa.patch deleted file mode 100644 index 56bb9fd56b..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-26-netfilter-nft_flow_offload-use-direct-xmit-if-hardwa.patch +++ /dev/null @@ -1,114 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:47 +0100 -Subject: [PATCH] netfilter: nft_flow_offload: use direct xmit if - hardware offload is enabled - -If there is a forward path to reach an ethernet device and hardware -offload is enabled, then use the direct xmit path. - -Moreover, store the real device in the direct xmit path info since -software datapath uses dev_hard_header() to push the layer encapsulation -headers while hardware offload refers to the real device. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -131,6 +131,7 @@ struct flow_offload_tuple { - struct dst_entry *dst_cache; - struct { - u32 ifidx; -+ u32 hw_ifidx; - u8 h_source[ETH_ALEN]; - u8 h_dest[ETH_ALEN]; - } out; -@@ -187,6 +188,7 @@ struct nf_flow_route { - } in; - struct { - u32 ifindex; -+ u32 hw_ifindex; - u8 h_source[ETH_ALEN]; - u8 h_dest[ETH_ALEN]; - } out; ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -106,6 +106,7 @@ static int flow_offload_fill_route(struc - memcpy(flow_tuple->out.h_source, route->tuple[dir].out.h_source, - ETH_ALEN); - flow_tuple->out.ifidx = route->tuple[dir].out.ifindex; -+ flow_tuple->out.hw_ifidx = route->tuple[dir].out.hw_ifindex; - break; - case FLOW_OFFLOAD_XMIT_XFRM: - case FLOW_OFFLOAD_XMIT_NEIGH: ---- a/net/netfilter/nf_flow_table_offload.c -+++ b/net/netfilter/nf_flow_table_offload.c -@@ -508,7 +508,7 @@ static void flow_offload_redirect(struct - switch (this_tuple->xmit_type) { - case FLOW_OFFLOAD_XMIT_DIRECT: - this_tuple = &flow->tuplehash[dir].tuple; -- ifindex = this_tuple->out.ifidx; -+ ifindex = this_tuple->out.hw_ifidx; - break; - case FLOW_OFFLOAD_XMIT_NEIGH: - other_tuple = &flow->tuplehash[!dir].tuple; ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -66,6 +66,7 @@ static int nft_dev_fill_forward_path(con - struct nft_forward_info { - const struct net_device *indev; - const struct net_device *outdev; -+ const struct net_device *hw_outdev; - struct id { - __u16 id; - __be16 proto; -@@ -76,9 +77,18 @@ struct nft_forward_info { - enum flow_offload_xmit_type xmit_type; - }; - -+static bool nft_is_valid_ether_device(const struct net_device *dev) -+{ -+ if (!dev || (dev->flags & IFF_LOOPBACK) || dev->type != ARPHRD_ETHER || -+ dev->addr_len != ETH_ALEN || !is_valid_ether_addr(dev->dev_addr)) -+ return false; -+ -+ return true; -+} -+ - static void nft_dev_path_info(const struct net_device_path_stack *stack, - struct nft_forward_info *info, -- unsigned char *ha) -+ unsigned char *ha, struct nf_flowtable *flowtable) - { - const struct net_device_path *path; - int i; -@@ -140,6 +150,12 @@ static void nft_dev_path_info(const stru - } - if (!info->outdev) - info->outdev = info->indev; -+ -+ info->hw_outdev = info->indev; -+ -+ if (nf_flowtable_hw_offload(flowtable) && -+ nft_is_valid_ether_device(info->indev)) -+ info->xmit_type = FLOW_OFFLOAD_XMIT_DIRECT; - } - - static bool nft_flowtable_find_dev(const struct net_device *dev, -@@ -171,7 +187,7 @@ static void nft_dev_forward_path(struct - int i; - - if (nft_dev_fill_forward_path(route, dst, ct, dir, ha, &stack) >= 0) -- nft_dev_path_info(&stack, &info, ha); -+ nft_dev_path_info(&stack, &info, ha, &ft->data); - - if (!info.indev || !nft_flowtable_find_dev(info.indev, ft)) - return; -@@ -187,6 +203,7 @@ static void nft_dev_forward_path(struct - memcpy(route->tuple[dir].out.h_source, info.h_source, ETH_ALEN); - memcpy(route->tuple[dir].out.h_dest, info.h_dest, ETH_ALEN); - route->tuple[dir].out.ifindex = info.outdev->ifindex; -+ route->tuple[dir].out.hw_ifindex = info.hw_outdev->ifindex; - route->tuple[dir].xmit_type = info.xmit_type; - } - } diff --git a/target/linux/generic/backport-5.10/610-v5.13-27-netfilter-flowtable-bridge-vlan-hardware-offload-and.patch b/target/linux/generic/backport-5.10/610-v5.13-27-netfilter-flowtable-bridge-vlan-hardware-offload-and.patch deleted file mode 100644 index 08c92d731a..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-27-netfilter-flowtable-bridge-vlan-hardware-offload-and.patch +++ /dev/null @@ -1,123 +0,0 @@ -From: Felix Fietkau -Date: Wed, 24 Mar 2021 02:30:48 +0100 -Subject: [PATCH] netfilter: flowtable: bridge vlan hardware offload and - switchdev - -The switch might have already added the VLAN tag through PVID hardware -offload. Keep this extra VLAN in the flowtable but skip it on egress. - -Signed-off-by: Felix Fietkau -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -872,6 +872,7 @@ struct net_device_path { - DEV_PATH_BR_VLAN_KEEP, - DEV_PATH_BR_VLAN_TAG, - DEV_PATH_BR_VLAN_UNTAG, -+ DEV_PATH_BR_VLAN_UNTAG_HW, - } vlan_mode; - u16 vlan_id; - __be16 vlan_proto; ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -123,9 +123,10 @@ struct flow_offload_tuple { - /* All members above are keys for lookups, see flow_offload_hash(). */ - struct { } __hash; - -- u8 dir:4, -+ u8 dir:2, - xmit_type:2, -- encap_num:2; -+ encap_num:2, -+ in_vlan_ingress:2; - u16 mtu; - union { - struct dst_entry *dst_cache; -@@ -184,7 +185,8 @@ struct nf_flow_route { - u16 id; - __be16 proto; - } encap[NF_FLOW_TABLE_ENCAP_MAX]; -- u8 num_encaps; -+ u8 num_encaps:2, -+ ingress_vlans:2; - } in; - struct { - u32 ifindex; ---- a/net/bridge/br_device.c -+++ b/net/bridge/br_device.c -@@ -435,6 +435,7 @@ static int br_fill_forward_path(struct n - ctx->vlan[ctx->num_vlans].proto = path->bridge.vlan_proto; - ctx->num_vlans++; - break; -+ case DEV_PATH_BR_VLAN_UNTAG_HW: - case DEV_PATH_BR_VLAN_UNTAG: - ctx->num_vlans--; - break; ---- a/net/bridge/br_vlan.c -+++ b/net/bridge/br_vlan.c -@@ -1397,6 +1397,8 @@ int br_vlan_fill_forward_path_mode(struc - - if (path->bridge.vlan_mode == DEV_PATH_BR_VLAN_TAG) - path->bridge.vlan_mode = DEV_PATH_BR_VLAN_KEEP; -+ else if (v->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV) -+ path->bridge.vlan_mode = DEV_PATH_BR_VLAN_UNTAG_HW; - else - path->bridge.vlan_mode = DEV_PATH_BR_VLAN_UNTAG; - ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -95,6 +95,8 @@ static int flow_offload_fill_route(struc - for (i = route->tuple[dir].in.num_encaps - 1; i >= 0; i--) { - flow_tuple->encap[j].id = route->tuple[dir].in.encap[i].id; - flow_tuple->encap[j].proto = route->tuple[dir].in.encap[i].proto; -+ if (route->tuple[dir].in.ingress_vlans & BIT(i)) -+ flow_tuple->in_vlan_ingress |= BIT(j); - j++; - } - flow_tuple->encap_num = route->tuple[dir].in.num_encaps; ---- a/net/netfilter/nf_flow_table_offload.c -+++ b/net/netfilter/nf_flow_table_offload.c -@@ -594,8 +594,12 @@ nf_flow_rule_route_common(struct net *ne - other_tuple = &flow->tuplehash[!dir].tuple; - - for (i = 0; i < other_tuple->encap_num; i++) { -- struct flow_action_entry *entry = flow_action_entry_next(flow_rule); -+ struct flow_action_entry *entry; - -+ if (other_tuple->in_vlan_ingress & BIT(i)) -+ continue; -+ -+ entry = flow_action_entry_next(flow_rule); - entry->id = FLOW_ACTION_VLAN_PUSH; - entry->vlan.vid = other_tuple->encap[i].id; - entry->vlan.proto = other_tuple->encap[i].proto; ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -72,6 +72,7 @@ struct nft_forward_info { - __be16 proto; - } encap[NF_FLOW_TABLE_ENCAP_MAX]; - u8 num_encaps; -+ u8 ingress_vlans; - u8 h_source[ETH_ALEN]; - u8 h_dest[ETH_ALEN]; - enum flow_offload_xmit_type xmit_type; -@@ -130,6 +131,9 @@ static void nft_dev_path_info(const stru - memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); - - switch (path->bridge.vlan_mode) { -+ case DEV_PATH_BR_VLAN_UNTAG_HW: -+ info->ingress_vlans |= BIT(info->num_encaps - 1); -+ break; - case DEV_PATH_BR_VLAN_TAG: - info->encap[info->num_encaps].id = path->bridge.vlan_id; - info->encap[info->num_encaps].proto = path->bridge.vlan_proto; -@@ -198,6 +202,7 @@ static void nft_dev_forward_path(struct - route->tuple[!dir].in.encap[i].proto = info.encap[i].proto; - } - route->tuple[!dir].in.num_encaps = info.num_encaps; -+ route->tuple[!dir].in.ingress_vlans = info.ingress_vlans; - - if (info.xmit_type == FLOW_OFFLOAD_XMIT_DIRECT) { - memcpy(route->tuple[dir].out.h_source, info.h_source, ETH_ALEN); diff --git a/target/linux/generic/backport-5.10/610-v5.13-28-net-flow_offload-add-FLOW_ACTION_PPPOE_PUSH.patch b/target/linux/generic/backport-5.10/610-v5.13-28-net-flow_offload-add-FLOW_ACTION_PPPOE_PUSH.patch deleted file mode 100644 index 64eae6871f..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-28-net-flow_offload-add-FLOW_ACTION_PPPOE_PUSH.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:49 +0100 -Subject: [PATCH] net: flow_offload: add FLOW_ACTION_PPPOE_PUSH - -Add an action to represent the PPPoE hardware offload support that -includes the session ID. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/flow_offload.h -+++ b/include/net/flow_offload.h -@@ -147,6 +147,7 @@ enum flow_action_id { - FLOW_ACTION_MPLS_POP, - FLOW_ACTION_MPLS_MANGLE, - FLOW_ACTION_GATE, -+ FLOW_ACTION_PPPOE_PUSH, - NUM_FLOW_ACTIONS, - }; - -@@ -271,6 +272,9 @@ struct flow_action_entry { - u32 num_entries; - struct action_gate_entry *entries; - } gate; -+ struct { /* FLOW_ACTION_PPPOE_PUSH */ -+ u16 sid; -+ } pppoe; - }; - struct flow_action_cookie *cookie; /* user defined action cookie */ - }; diff --git a/target/linux/generic/backport-5.10/610-v5.13-29-netfilter-flowtable-support-for-FLOW_ACTION_PPPOE_PU.patch b/target/linux/generic/backport-5.10/610-v5.13-29-netfilter-flowtable-support-for-FLOW_ACTION_PPPOE_PU.patch deleted file mode 100644 index ed7346a61a..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-29-netfilter-flowtable-support-for-FLOW_ACTION_PPPOE_PU.patch +++ /dev/null @@ -1,35 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:50 +0100 -Subject: [PATCH] netfilter: flowtable: support for - FLOW_ACTION_PPPOE_PUSH - -Add a PPPoE push action if layer 2 protocol is ETH_P_PPP_SES to add -PPPoE flowtable hardware offload support. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nf_flow_table_offload.c -+++ b/net/netfilter/nf_flow_table_offload.c -@@ -600,9 +600,18 @@ nf_flow_rule_route_common(struct net *ne - continue; - - entry = flow_action_entry_next(flow_rule); -- entry->id = FLOW_ACTION_VLAN_PUSH; -- entry->vlan.vid = other_tuple->encap[i].id; -- entry->vlan.proto = other_tuple->encap[i].proto; -+ -+ switch (other_tuple->encap[i].proto) { -+ case htons(ETH_P_PPP_SES): -+ entry->id = FLOW_ACTION_PPPOE_PUSH; -+ entry->pppoe.sid = other_tuple->encap[i].id; -+ break; -+ case htons(ETH_P_8021Q): -+ entry->id = FLOW_ACTION_VLAN_PUSH; -+ entry->vlan.vid = other_tuple->encap[i].id; -+ entry->vlan.proto = other_tuple->encap[i].proto; -+ break; -+ } - } - - return 0; diff --git a/target/linux/generic/backport-5.10/610-v5.13-30-dsa-slave-add-support-for-TC_SETUP_FT.patch b/target/linux/generic/backport-5.10/610-v5.13-30-dsa-slave-add-support-for-TC_SETUP_FT.patch deleted file mode 100644 index 72675dc294..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-30-dsa-slave-add-support-for-TC_SETUP_FT.patch +++ /dev/null @@ -1,53 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:51 +0100 -Subject: [PATCH] dsa: slave: add support for TC_SETUP_FT - -The dsa infrastructure provides a well-defined hierarchy of devices, -pass up the call to set up the flow block to the master device. From the -software dataplane, the netfilter infrastructure uses the dsa slave -devices to refer to the input and output device for the given skbuff. -Similarly, the flowtable definition in the ruleset refers to the dsa -slave port devices. - -This patch adds the glue code to call ndo_setup_tc with TC_SETUP_FT -with the master device via the dsa slave devices. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -1239,14 +1239,32 @@ static int dsa_slave_setup_tc_block(stru - } - } - -+static int dsa_slave_setup_ft_block(struct dsa_switch *ds, int port, -+ void *type_data) -+{ -+ struct dsa_port *cpu_dp = dsa_to_port(ds, port)->cpu_dp; -+ struct net_device *master = cpu_dp->master; -+ -+ if (!master->netdev_ops->ndo_setup_tc) -+ return -EOPNOTSUPP; -+ -+ return master->netdev_ops->ndo_setup_tc(master, TC_SETUP_FT, type_data); -+} -+ - static int dsa_slave_setup_tc(struct net_device *dev, enum tc_setup_type type, - void *type_data) - { - struct dsa_port *dp = dsa_slave_to_port(dev); - struct dsa_switch *ds = dp->ds; - -- if (type == TC_SETUP_BLOCK) -+ switch (type) { -+ case TC_SETUP_BLOCK: - return dsa_slave_setup_tc_block(dev, type_data); -+ case TC_SETUP_FT: -+ return dsa_slave_setup_ft_block(ds, dp->index, type_data); -+ default: -+ break; -+ } - - if (!ds->ops->port_setup_tc) - return -EOPNOTSUPP; diff --git a/target/linux/generic/backport-5.10/610-v5.13-31-net-ethernet-mtk_eth_soc-fix-parsing-packets-in-GDM.patch b/target/linux/generic/backport-5.10/610-v5.13-31-net-ethernet-mtk_eth_soc-fix-parsing-packets-in-GDM.patch deleted file mode 100644 index 3be60aee1d..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-31-net-ethernet-mtk_eth_soc-fix-parsing-packets-in-GDM.patch +++ /dev/null @@ -1,68 +0,0 @@ -From: Felix Fietkau -Date: Wed, 24 Mar 2021 02:30:52 +0100 -Subject: [PATCH] net: ethernet: mtk_eth_soc: fix parsing packets in GDM - -When using DSA, set the special tag in GDM ingress control to allow the MAC -to parse packets properly earlier. This affects rx DMA source port reporting. - -Signed-off-by: Felix Fietkau -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -19,6 +19,7 @@ - #include - #include - #include -+#include - - #include "mtk_eth_soc.h" - -@@ -1297,13 +1298,12 @@ static int mtk_poll_rx(struct napi_struc - break; - - /* find out which mac the packet come from. values start at 1 */ -- if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) { -+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) || -+ (trxd.rxd4 & RX_DMA_SPECIAL_TAG)) - mac = 0; -- } else { -- mac = (trxd.rxd4 >> RX_DMA_FPORT_SHIFT) & -- RX_DMA_FPORT_MASK; -- mac--; -- } -+ else -+ mac = ((trxd.rxd4 >> RX_DMA_FPORT_SHIFT) & -+ RX_DMA_FPORT_MASK) - 1; - - if (unlikely(mac < 0 || mac >= MTK_MAC_COUNT || - !eth->netdev[mac])) -@@ -2275,6 +2275,9 @@ static void mtk_gdm_config(struct mtk_et - - val |= config; - -+ if (!i && eth->netdev[0] && netdev_uses_dsa(eth->netdev[0])) -+ val |= MTK_GDMA_SPECIAL_TAG; -+ - mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i)); - } - /* Reset and enable PSE */ ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -81,6 +81,7 @@ - - /* GDM Exgress Control Register */ - #define MTK_GDMA_FWD_CFG(x) (0x500 + (x * 0x1000)) -+#define MTK_GDMA_SPECIAL_TAG BIT(24) - #define MTK_GDMA_ICS_EN BIT(22) - #define MTK_GDMA_TCS_EN BIT(21) - #define MTK_GDMA_UCS_EN BIT(20) -@@ -318,6 +319,7 @@ - #define RX_DMA_L4_VALID_PDMA BIT(30) /* when PDMA is used */ - #define RX_DMA_FPORT_SHIFT 19 - #define RX_DMA_FPORT_MASK 0x7 -+#define RX_DMA_SPECIAL_TAG BIT(22) - - /* PHY Indirect Access Control registers */ - #define MTK_PHY_IAC 0x10004 diff --git a/target/linux/generic/backport-5.10/610-v5.13-32-net-ethernet-mtk_eth_soc-add-support-for-initializin.patch b/target/linux/generic/backport-5.10/610-v5.13-32-net-ethernet-mtk_eth_soc-add-support-for-initializin.patch deleted file mode 100644 index 9378c3d422..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-32-net-ethernet-mtk_eth_soc-add-support-for-initializin.patch +++ /dev/null @@ -1,1312 +0,0 @@ -From: Felix Fietkau -Date: Wed, 24 Mar 2021 02:30:53 +0100 -Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for - initializing the PPE - -The PPE (packet processing engine) is used to offload NAT/routed or even -bridged flows. This patch brings up the PPE and uses it to get a packet -hash. It also contains some functionality that will be used to bring up -flow offloading. - -Signed-off-by: Felix Fietkau -Signed-off-by: Pablo Neira Ayuso ---- - create mode 100644 drivers/net/ethernet/mediatek/mtk_ppe.c - create mode 100644 drivers/net/ethernet/mediatek/mtk_ppe.h - create mode 100644 drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c - create mode 100644 drivers/net/ethernet/mediatek/mtk_ppe_regs.h - ---- a/drivers/net/ethernet/mediatek/Makefile -+++ b/drivers/net/ethernet/mediatek/Makefile -@@ -4,5 +4,5 @@ - # - - obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o --mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o -+mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o - obj-$(CONFIG_NET_MEDIATEK_STAR_EMAC) += mtk_star_emac.o ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -2300,7 +2300,10 @@ static int mtk_open(struct net_device *d - - /* we run 2 netdevs on the same dma ring so we only bring it up once */ - if (!refcount_read(ð->dma_refcnt)) { -- int err = mtk_start_dma(eth); -+ u32 gdm_config = MTK_GDMA_TO_PDMA; -+ int err; -+ -+ err = mtk_start_dma(eth); - - if (err) - if (err) { -@@ -2308,7 +2311,10 @@ static int mtk_open(struct net_device *d - return err; - } - -- mtk_gdm_config(eth, MTK_GDMA_TO_PDMA); -+ if (eth->soc->offload_version && mtk_ppe_start(ð->ppe) == 0) -+ gdm_config = MTK_GDMA_TO_PPE; -+ -+ mtk_gdm_config(eth, gdm_config); - - napi_enable(ð->tx_napi); - napi_enable(ð->rx_napi); -@@ -2375,6 +2381,9 @@ static int mtk_stop(struct net_device *d - - mtk_dma_free(eth); - -+ if (eth->soc->offload_version) -+ mtk_ppe_stop(ð->ppe); -+ - return 0; - } - -@@ -3103,6 +3112,13 @@ static int mtk_probe(struct platform_dev - goto err_free_dev; - } - -+ if (eth->soc->offload_version) { -+ err = mtk_ppe_init(ð->ppe, eth->dev, -+ eth->base + MTK_ETH_PPE_BASE, 2); -+ if (err) -+ goto err_free_dev; -+ } -+ - for (i = 0; i < MTK_MAX_DEVS; i++) { - if (!eth->netdev[i]) - continue; -@@ -3177,6 +3193,7 @@ static const struct mtk_soc_data mt7621_ - .hw_features = MTK_HW_FEATURES, - .required_clks = MT7621_CLKS_BITMAP, - .required_pctl = false, -+ .offload_version = 2, - }; - - static const struct mtk_soc_data mt7622_data = { -@@ -3185,6 +3202,7 @@ static const struct mtk_soc_data mt7622_ - .hw_features = MTK_HW_FEATURES, - .required_clks = MT7622_CLKS_BITMAP, - .required_pctl = false, -+ .offload_version = 2, - }; - - static const struct mtk_soc_data mt7623_data = { ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include "mtk_ppe.h" - - #define MTK_QDMA_PAGE_SIZE 2048 - #define MTK_MAX_RX_LENGTH 1536 -@@ -86,6 +87,7 @@ - #define MTK_GDMA_TCS_EN BIT(21) - #define MTK_GDMA_UCS_EN BIT(20) - #define MTK_GDMA_TO_PDMA 0x0 -+#define MTK_GDMA_TO_PPE 0x4444 - #define MTK_GDMA_DROP_ALL 0x7777 - - /* Unicast Filter MAC Address Register - Low */ -@@ -315,6 +317,12 @@ - #define RX_DMA_VID(_x) ((_x) & 0xfff) - - /* QDMA descriptor rxd4 */ -+#define MTK_RXD4_FOE_ENTRY GENMASK(13, 0) -+#define MTK_RXD4_PPE_CPU_REASON GENMASK(18, 14) -+#define MTK_RXD4_SRC_PORT GENMASK(21, 19) -+#define MTK_RXD4_ALG GENMASK(31, 22) -+ -+/* QDMA descriptor rxd4 */ - #define RX_DMA_L4_VALID BIT(24) - #define RX_DMA_L4_VALID_PDMA BIT(30) /* when PDMA is used */ - #define RX_DMA_FPORT_SHIFT 19 -@@ -820,6 +828,7 @@ struct mtk_soc_data { - u32 caps; - u32 required_clks; - bool required_pctl; -+ u8 offload_version; - netdev_features_t hw_features; - }; - -@@ -919,6 +928,8 @@ struct mtk_eth { - u32 tx_int_status_reg; - u32 rx_dma_l4_valid; - int ip_align; -+ -+ struct mtk_ppe ppe; - }; - - /* struct mtk_mac - the structure that holds the info about the MACs of the ---- /dev/null -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c -@@ -0,0 +1,511 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* Copyright (C) 2020 Felix Fietkau */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include "mtk_ppe.h" -+#include "mtk_ppe_regs.h" -+ -+static void ppe_w32(struct mtk_ppe *ppe, u32 reg, u32 val) -+{ -+ writel(val, ppe->base + reg); -+} -+ -+static u32 ppe_r32(struct mtk_ppe *ppe, u32 reg) -+{ -+ return readl(ppe->base + reg); -+} -+ -+static u32 ppe_m32(struct mtk_ppe *ppe, u32 reg, u32 mask, u32 set) -+{ -+ u32 val; -+ -+ val = ppe_r32(ppe, reg); -+ val &= ~mask; -+ val |= set; -+ ppe_w32(ppe, reg, val); -+ -+ return val; -+} -+ -+static u32 ppe_set(struct mtk_ppe *ppe, u32 reg, u32 val) -+{ -+ return ppe_m32(ppe, reg, 0, val); -+} -+ -+static u32 ppe_clear(struct mtk_ppe *ppe, u32 reg, u32 val) -+{ -+ return ppe_m32(ppe, reg, val, 0); -+} -+ -+static int mtk_ppe_wait_busy(struct mtk_ppe *ppe) -+{ -+ unsigned long timeout = jiffies + HZ; -+ -+ while (time_is_before_jiffies(timeout)) { -+ if (!(ppe_r32(ppe, MTK_PPE_GLO_CFG) & MTK_PPE_GLO_CFG_BUSY)) -+ return 0; -+ -+ usleep_range(10, 20); -+ } -+ -+ dev_err(ppe->dev, "PPE table busy"); -+ -+ return -ETIMEDOUT; -+} -+ -+static void mtk_ppe_cache_clear(struct mtk_ppe *ppe) -+{ -+ ppe_set(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR); -+ ppe_clear(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR); -+} -+ -+static void mtk_ppe_cache_enable(struct mtk_ppe *ppe, bool enable) -+{ -+ mtk_ppe_cache_clear(ppe); -+ -+ ppe_m32(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_EN, -+ enable * MTK_PPE_CACHE_CTL_EN); -+} -+ -+static u32 mtk_ppe_hash_entry(struct mtk_foe_entry *e) -+{ -+ u32 hv1, hv2, hv3; -+ u32 hash; -+ -+ switch (FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, e->ib1)) { -+ case MTK_PPE_PKT_TYPE_BRIDGE: -+ hv1 = e->bridge.src_mac_lo; -+ hv1 ^= ((e->bridge.src_mac_hi & 0xffff) << 16); -+ hv2 = e->bridge.src_mac_hi >> 16; -+ hv2 ^= e->bridge.dest_mac_lo; -+ hv3 = e->bridge.dest_mac_hi; -+ break; -+ case MTK_PPE_PKT_TYPE_IPV4_ROUTE: -+ case MTK_PPE_PKT_TYPE_IPV4_HNAPT: -+ hv1 = e->ipv4.orig.ports; -+ hv2 = e->ipv4.orig.dest_ip; -+ hv3 = e->ipv4.orig.src_ip; -+ break; -+ case MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T: -+ case MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T: -+ hv1 = e->ipv6.src_ip[3] ^ e->ipv6.dest_ip[3]; -+ hv1 ^= e->ipv6.ports; -+ -+ hv2 = e->ipv6.src_ip[2] ^ e->ipv6.dest_ip[2]; -+ hv2 ^= e->ipv6.dest_ip[0]; -+ -+ hv3 = e->ipv6.src_ip[1] ^ e->ipv6.dest_ip[1]; -+ hv3 ^= e->ipv6.src_ip[0]; -+ break; -+ case MTK_PPE_PKT_TYPE_IPV4_DSLITE: -+ case MTK_PPE_PKT_TYPE_IPV6_6RD: -+ default: -+ WARN_ON_ONCE(1); -+ return MTK_PPE_HASH_MASK; -+ } -+ -+ hash = (hv1 & hv2) | ((~hv1) & hv3); -+ hash = (hash >> 24) | ((hash & 0xffffff) << 8); -+ hash ^= hv1 ^ hv2 ^ hv3; -+ hash ^= hash >> 16; -+ hash <<= 1; -+ hash &= MTK_PPE_ENTRIES - 1; -+ -+ return hash; -+} -+ -+static inline struct mtk_foe_mac_info * -+mtk_foe_entry_l2(struct mtk_foe_entry *entry) -+{ -+ int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); -+ -+ if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) -+ return &entry->ipv6.l2; -+ -+ return &entry->ipv4.l2; -+} -+ -+static inline u32 * -+mtk_foe_entry_ib2(struct mtk_foe_entry *entry) -+{ -+ int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); -+ -+ if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) -+ return &entry->ipv6.ib2; -+ -+ return &entry->ipv4.ib2; -+} -+ -+int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto, -+ u8 pse_port, u8 *src_mac, u8 *dest_mac) -+{ -+ struct mtk_foe_mac_info *l2; -+ u32 ports_pad, val; -+ -+ memset(entry, 0, sizeof(*entry)); -+ -+ val = FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND) | -+ FIELD_PREP(MTK_FOE_IB1_PACKET_TYPE, type) | -+ FIELD_PREP(MTK_FOE_IB1_UDP, l4proto == IPPROTO_UDP) | -+ MTK_FOE_IB1_BIND_TTL | -+ MTK_FOE_IB1_BIND_CACHE; -+ entry->ib1 = val; -+ -+ val = FIELD_PREP(MTK_FOE_IB2_PORT_MG, 0x3f) | -+ FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0x1f) | -+ FIELD_PREP(MTK_FOE_IB2_DEST_PORT, pse_port); -+ -+ if (is_multicast_ether_addr(dest_mac)) -+ val |= MTK_FOE_IB2_MULTICAST; -+ -+ ports_pad = 0xa5a5a500 | (l4proto & 0xff); -+ if (type == MTK_PPE_PKT_TYPE_IPV4_ROUTE) -+ entry->ipv4.orig.ports = ports_pad; -+ if (type == MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T) -+ entry->ipv6.ports = ports_pad; -+ -+ if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) { -+ entry->ipv6.ib2 = val; -+ l2 = &entry->ipv6.l2; -+ } else { -+ entry->ipv4.ib2 = val; -+ l2 = &entry->ipv4.l2; -+ } -+ -+ l2->dest_mac_hi = get_unaligned_be32(dest_mac); -+ l2->dest_mac_lo = get_unaligned_be16(dest_mac + 4); -+ l2->src_mac_hi = get_unaligned_be32(src_mac); -+ l2->src_mac_lo = get_unaligned_be16(src_mac + 4); -+ -+ if (type >= MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T) -+ l2->etype = ETH_P_IPV6; -+ else -+ l2->etype = ETH_P_IP; -+ -+ return 0; -+} -+ -+int mtk_foe_entry_set_pse_port(struct mtk_foe_entry *entry, u8 port) -+{ -+ u32 *ib2 = mtk_foe_entry_ib2(entry); -+ u32 val; -+ -+ val = *ib2; -+ val &= ~MTK_FOE_IB2_DEST_PORT; -+ val |= FIELD_PREP(MTK_FOE_IB2_DEST_PORT, port); -+ *ib2 = val; -+ -+ return 0; -+} -+ -+int mtk_foe_entry_set_ipv4_tuple(struct mtk_foe_entry *entry, bool egress, -+ __be32 src_addr, __be16 src_port, -+ __be32 dest_addr, __be16 dest_port) -+{ -+ int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); -+ struct mtk_ipv4_tuple *t; -+ -+ switch (type) { -+ case MTK_PPE_PKT_TYPE_IPV4_HNAPT: -+ if (egress) { -+ t = &entry->ipv4.new; -+ break; -+ } -+ fallthrough; -+ case MTK_PPE_PKT_TYPE_IPV4_DSLITE: -+ case MTK_PPE_PKT_TYPE_IPV4_ROUTE: -+ t = &entry->ipv4.orig; -+ break; -+ case MTK_PPE_PKT_TYPE_IPV6_6RD: -+ entry->ipv6_6rd.tunnel_src_ip = be32_to_cpu(src_addr); -+ entry->ipv6_6rd.tunnel_dest_ip = be32_to_cpu(dest_addr); -+ return 0; -+ default: -+ WARN_ON_ONCE(1); -+ return -EINVAL; -+ } -+ -+ t->src_ip = be32_to_cpu(src_addr); -+ t->dest_ip = be32_to_cpu(dest_addr); -+ -+ if (type == MTK_PPE_PKT_TYPE_IPV4_ROUTE) -+ return 0; -+ -+ t->src_port = be16_to_cpu(src_port); -+ t->dest_port = be16_to_cpu(dest_port); -+ -+ return 0; -+} -+ -+int mtk_foe_entry_set_ipv6_tuple(struct mtk_foe_entry *entry, -+ __be32 *src_addr, __be16 src_port, -+ __be32 *dest_addr, __be16 dest_port) -+{ -+ int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); -+ u32 *src, *dest; -+ int i; -+ -+ switch (type) { -+ case MTK_PPE_PKT_TYPE_IPV4_DSLITE: -+ src = entry->dslite.tunnel_src_ip; -+ dest = entry->dslite.tunnel_dest_ip; -+ break; -+ case MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T: -+ case MTK_PPE_PKT_TYPE_IPV6_6RD: -+ entry->ipv6.src_port = be16_to_cpu(src_port); -+ entry->ipv6.dest_port = be16_to_cpu(dest_port); -+ fallthrough; -+ case MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T: -+ src = entry->ipv6.src_ip; -+ dest = entry->ipv6.dest_ip; -+ break; -+ default: -+ WARN_ON_ONCE(1); -+ return -EINVAL; -+ }; -+ -+ for (i = 0; i < 4; i++) -+ src[i] = be32_to_cpu(src_addr[i]); -+ for (i = 0; i < 4; i++) -+ dest[i] = be32_to_cpu(dest_addr[i]); -+ -+ return 0; -+} -+ -+int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port) -+{ -+ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry); -+ -+ l2->etype = BIT(port); -+ -+ if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_LAYER)) -+ entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1); -+ else -+ l2->etype |= BIT(8); -+ -+ entry->ib1 &= ~MTK_FOE_IB1_BIND_VLAN_TAG; -+ -+ return 0; -+} -+ -+int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid) -+{ -+ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry); -+ -+ switch (FIELD_GET(MTK_FOE_IB1_BIND_VLAN_LAYER, entry->ib1)) { -+ case 0: -+ entry->ib1 |= MTK_FOE_IB1_BIND_VLAN_TAG | -+ FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1); -+ l2->vlan1 = vid; -+ return 0; -+ case 1: -+ if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_TAG)) { -+ l2->vlan1 = vid; -+ l2->etype |= BIT(8); -+ } else { -+ l2->vlan2 = vid; -+ entry->ib1 += FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1); -+ } -+ return 0; -+ default: -+ return -ENOSPC; -+ } -+} -+ -+int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid) -+{ -+ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry); -+ -+ if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_LAYER) || -+ (entry->ib1 & MTK_FOE_IB1_BIND_VLAN_TAG)) -+ l2->etype = ETH_P_PPP_SES; -+ -+ entry->ib1 |= MTK_FOE_IB1_BIND_PPPOE; -+ l2->pppoe_id = sid; -+ -+ return 0; -+} -+ -+static inline bool mtk_foe_entry_usable(struct mtk_foe_entry *entry) -+{ -+ return !(entry->ib1 & MTK_FOE_IB1_STATIC) && -+ FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1) != MTK_FOE_STATE_BIND; -+} -+ -+int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, -+ u16 timestamp) -+{ -+ struct mtk_foe_entry *hwe; -+ u32 hash; -+ -+ timestamp &= MTK_FOE_IB1_BIND_TIMESTAMP; -+ entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP; -+ entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_TIMESTAMP, timestamp); -+ -+ hash = mtk_ppe_hash_entry(entry); -+ hwe = &ppe->foe_table[hash]; -+ if (!mtk_foe_entry_usable(hwe)) { -+ hwe++; -+ hash++; -+ -+ if (!mtk_foe_entry_usable(hwe)) -+ return -ENOSPC; -+ } -+ -+ memcpy(&hwe->data, &entry->data, sizeof(hwe->data)); -+ wmb(); -+ hwe->ib1 = entry->ib1; -+ -+ dma_wmb(); -+ -+ mtk_ppe_cache_clear(ppe); -+ -+ return hash; -+} -+ -+int mtk_ppe_init(struct mtk_ppe *ppe, struct device *dev, void __iomem *base, -+ int version) -+{ -+ struct mtk_foe_entry *foe; -+ -+ /* need to allocate a separate device, since it PPE DMA access is -+ * not coherent. -+ */ -+ ppe->base = base; -+ ppe->dev = dev; -+ ppe->version = version; -+ -+ foe = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*foe), -+ &ppe->foe_phys, GFP_KERNEL); -+ if (!foe) -+ return -ENOMEM; -+ -+ ppe->foe_table = foe; -+ -+ mtk_ppe_debugfs_init(ppe); -+ -+ return 0; -+} -+ -+static void mtk_ppe_init_foe_table(struct mtk_ppe *ppe) -+{ -+ static const u8 skip[] = { 12, 25, 38, 51, 76, 89, 102 }; -+ int i, k; -+ -+ memset(ppe->foe_table, 0, MTK_PPE_ENTRIES * sizeof(ppe->foe_table)); -+ -+ if (!IS_ENABLED(CONFIG_SOC_MT7621)) -+ return; -+ -+ /* skip all entries that cross the 1024 byte boundary */ -+ for (i = 0; i < MTK_PPE_ENTRIES; i += 128) -+ for (k = 0; k < ARRAY_SIZE(skip); k++) -+ ppe->foe_table[i + skip[k]].ib1 |= MTK_FOE_IB1_STATIC; -+} -+ -+int mtk_ppe_start(struct mtk_ppe *ppe) -+{ -+ u32 val; -+ -+ mtk_ppe_init_foe_table(ppe); -+ ppe_w32(ppe, MTK_PPE_TB_BASE, ppe->foe_phys); -+ -+ val = MTK_PPE_TB_CFG_ENTRY_80B | -+ MTK_PPE_TB_CFG_AGE_NON_L4 | -+ MTK_PPE_TB_CFG_AGE_UNBIND | -+ MTK_PPE_TB_CFG_AGE_TCP | -+ MTK_PPE_TB_CFG_AGE_UDP | -+ MTK_PPE_TB_CFG_AGE_TCP_FIN | -+ FIELD_PREP(MTK_PPE_TB_CFG_SEARCH_MISS, -+ MTK_PPE_SEARCH_MISS_ACTION_FORWARD_BUILD) | -+ FIELD_PREP(MTK_PPE_TB_CFG_KEEPALIVE, -+ MTK_PPE_KEEPALIVE_DISABLE) | -+ FIELD_PREP(MTK_PPE_TB_CFG_HASH_MODE, 1) | -+ FIELD_PREP(MTK_PPE_TB_CFG_SCAN_MODE, -+ MTK_PPE_SCAN_MODE_KEEPALIVE_AGE) | -+ FIELD_PREP(MTK_PPE_TB_CFG_ENTRY_NUM, -+ MTK_PPE_ENTRIES_SHIFT); -+ ppe_w32(ppe, MTK_PPE_TB_CFG, val); -+ -+ ppe_w32(ppe, MTK_PPE_IP_PROTO_CHK, -+ MTK_PPE_IP_PROTO_CHK_IPV4 | MTK_PPE_IP_PROTO_CHK_IPV6); -+ -+ mtk_ppe_cache_enable(ppe, true); -+ -+ val = MTK_PPE_FLOW_CFG_IP4_TCP_FRAG | -+ MTK_PPE_FLOW_CFG_IP4_UDP_FRAG | -+ MTK_PPE_FLOW_CFG_IP6_3T_ROUTE | -+ MTK_PPE_FLOW_CFG_IP6_5T_ROUTE | -+ MTK_PPE_FLOW_CFG_IP6_6RD | -+ MTK_PPE_FLOW_CFG_IP4_NAT | -+ MTK_PPE_FLOW_CFG_IP4_NAPT | -+ MTK_PPE_FLOW_CFG_IP4_DSLITE | -+ MTK_PPE_FLOW_CFG_L2_BRIDGE | -+ MTK_PPE_FLOW_CFG_IP4_NAT_FRAG; -+ ppe_w32(ppe, MTK_PPE_FLOW_CFG, val); -+ -+ val = FIELD_PREP(MTK_PPE_UNBIND_AGE_MIN_PACKETS, 1000) | -+ FIELD_PREP(MTK_PPE_UNBIND_AGE_DELTA, 3); -+ ppe_w32(ppe, MTK_PPE_UNBIND_AGE, val); -+ -+ val = FIELD_PREP(MTK_PPE_BIND_AGE0_DELTA_UDP, 12) | -+ FIELD_PREP(MTK_PPE_BIND_AGE0_DELTA_NON_L4, 1); -+ ppe_w32(ppe, MTK_PPE_BIND_AGE0, val); -+ -+ val = FIELD_PREP(MTK_PPE_BIND_AGE1_DELTA_TCP_FIN, 1) | -+ FIELD_PREP(MTK_PPE_BIND_AGE1_DELTA_TCP, 7); -+ ppe_w32(ppe, MTK_PPE_BIND_AGE1, val); -+ -+ val = MTK_PPE_BIND_LIMIT0_QUARTER | MTK_PPE_BIND_LIMIT0_HALF; -+ ppe_w32(ppe, MTK_PPE_BIND_LIMIT0, val); -+ -+ val = MTK_PPE_BIND_LIMIT1_FULL | -+ FIELD_PREP(MTK_PPE_BIND_LIMIT1_NON_L4, 1); -+ ppe_w32(ppe, MTK_PPE_BIND_LIMIT1, val); -+ -+ val = FIELD_PREP(MTK_PPE_BIND_RATE_BIND, 30) | -+ FIELD_PREP(MTK_PPE_BIND_RATE_PREBIND, 1); -+ ppe_w32(ppe, MTK_PPE_BIND_RATE, val); -+ -+ /* enable PPE */ -+ val = MTK_PPE_GLO_CFG_EN | -+ MTK_PPE_GLO_CFG_IP4_L4_CS_DROP | -+ MTK_PPE_GLO_CFG_IP4_CS_DROP | -+ MTK_PPE_GLO_CFG_FLOW_DROP_UPDATE; -+ ppe_w32(ppe, MTK_PPE_GLO_CFG, val); -+ -+ ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT, 0); -+ -+ return 0; -+} -+ -+int mtk_ppe_stop(struct mtk_ppe *ppe) -+{ -+ u32 val; -+ int i; -+ -+ for (i = 0; i < MTK_PPE_ENTRIES; i++) -+ ppe->foe_table[i].ib1 = FIELD_PREP(MTK_FOE_IB1_STATE, -+ MTK_FOE_STATE_INVALID); -+ -+ mtk_ppe_cache_enable(ppe, false); -+ -+ /* disable offload engine */ -+ ppe_clear(ppe, MTK_PPE_GLO_CFG, MTK_PPE_GLO_CFG_EN); -+ ppe_w32(ppe, MTK_PPE_FLOW_CFG, 0); -+ -+ /* disable aging */ -+ val = MTK_PPE_TB_CFG_AGE_NON_L4 | -+ MTK_PPE_TB_CFG_AGE_UNBIND | -+ MTK_PPE_TB_CFG_AGE_TCP | -+ MTK_PPE_TB_CFG_AGE_UDP | -+ MTK_PPE_TB_CFG_AGE_TCP_FIN; -+ ppe_clear(ppe, MTK_PPE_TB_CFG, val); -+ -+ return mtk_ppe_wait_busy(ppe); -+} ---- /dev/null -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h -@@ -0,0 +1,287 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* Copyright (C) 2020 Felix Fietkau */ -+ -+#ifndef __MTK_PPE_H -+#define __MTK_PPE_H -+ -+#include -+#include -+ -+#define MTK_ETH_PPE_BASE 0xc00 -+ -+#define MTK_PPE_ENTRIES_SHIFT 3 -+#define MTK_PPE_ENTRIES (1024 << MTK_PPE_ENTRIES_SHIFT) -+#define MTK_PPE_HASH_MASK (MTK_PPE_ENTRIES - 1) -+ -+#define MTK_FOE_IB1_UNBIND_TIMESTAMP GENMASK(7, 0) -+#define MTK_FOE_IB1_UNBIND_PACKETS GENMASK(23, 8) -+#define MTK_FOE_IB1_UNBIND_PREBIND BIT(24) -+ -+#define MTK_FOE_IB1_BIND_TIMESTAMP GENMASK(14, 0) -+#define MTK_FOE_IB1_BIND_KEEPALIVE BIT(15) -+#define MTK_FOE_IB1_BIND_VLAN_LAYER GENMASK(18, 16) -+#define MTK_FOE_IB1_BIND_PPPOE BIT(19) -+#define MTK_FOE_IB1_BIND_VLAN_TAG BIT(20) -+#define MTK_FOE_IB1_BIND_PKT_SAMPLE BIT(21) -+#define MTK_FOE_IB1_BIND_CACHE BIT(22) -+#define MTK_FOE_IB1_BIND_TUNNEL_DECAP BIT(23) -+#define MTK_FOE_IB1_BIND_TTL BIT(24) -+ -+#define MTK_FOE_IB1_PACKET_TYPE GENMASK(27, 25) -+#define MTK_FOE_IB1_STATE GENMASK(29, 28) -+#define MTK_FOE_IB1_UDP BIT(30) -+#define MTK_FOE_IB1_STATIC BIT(31) -+ -+enum { -+ MTK_PPE_PKT_TYPE_IPV4_HNAPT = 0, -+ MTK_PPE_PKT_TYPE_IPV4_ROUTE = 1, -+ MTK_PPE_PKT_TYPE_BRIDGE = 2, -+ MTK_PPE_PKT_TYPE_IPV4_DSLITE = 3, -+ MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T = 4, -+ MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T = 5, -+ MTK_PPE_PKT_TYPE_IPV6_6RD = 7, -+}; -+ -+#define MTK_FOE_IB2_QID GENMASK(3, 0) -+#define MTK_FOE_IB2_PSE_QOS BIT(4) -+#define MTK_FOE_IB2_DEST_PORT GENMASK(7, 5) -+#define MTK_FOE_IB2_MULTICAST BIT(8) -+ -+#define MTK_FOE_IB2_WHNAT_QID2 GENMASK(13, 12) -+#define MTK_FOE_IB2_WHNAT_DEVIDX BIT(16) -+#define MTK_FOE_IB2_WHNAT_NAT BIT(17) -+ -+#define MTK_FOE_IB2_PORT_MG GENMASK(17, 12) -+ -+#define MTK_FOE_IB2_PORT_AG GENMASK(23, 18) -+ -+#define MTK_FOE_IB2_DSCP GENMASK(31, 24) -+ -+#define MTK_FOE_VLAN2_WHNAT_BSS GEMMASK(5, 0) -+#define MTK_FOE_VLAN2_WHNAT_WCID GENMASK(13, 6) -+#define MTK_FOE_VLAN2_WHNAT_RING GENMASK(15, 14) -+ -+enum { -+ MTK_FOE_STATE_INVALID, -+ MTK_FOE_STATE_UNBIND, -+ MTK_FOE_STATE_BIND, -+ MTK_FOE_STATE_FIN -+}; -+ -+struct mtk_foe_mac_info { -+ u16 vlan1; -+ u16 etype; -+ -+ u32 dest_mac_hi; -+ -+ u16 vlan2; -+ u16 dest_mac_lo; -+ -+ u32 src_mac_hi; -+ -+ u16 pppoe_id; -+ u16 src_mac_lo; -+}; -+ -+struct mtk_foe_bridge { -+ u32 dest_mac_hi; -+ -+ u16 src_mac_lo; -+ u16 dest_mac_lo; -+ -+ u32 src_mac_hi; -+ -+ u32 ib2; -+ -+ u32 _rsv[5]; -+ -+ u32 udf_tsid; -+ struct mtk_foe_mac_info l2; -+}; -+ -+struct mtk_ipv4_tuple { -+ u32 src_ip; -+ u32 dest_ip; -+ union { -+ struct { -+ u16 dest_port; -+ u16 src_port; -+ }; -+ struct { -+ u8 protocol; -+ u8 _pad[3]; /* fill with 0xa5a5a5 */ -+ }; -+ u32 ports; -+ }; -+}; -+ -+struct mtk_foe_ipv4 { -+ struct mtk_ipv4_tuple orig; -+ -+ u32 ib2; -+ -+ struct mtk_ipv4_tuple new; -+ -+ u16 timestamp; -+ u16 _rsv0[3]; -+ -+ u32 udf_tsid; -+ -+ struct mtk_foe_mac_info l2; -+}; -+ -+struct mtk_foe_ipv4_dslite { -+ struct mtk_ipv4_tuple ip4; -+ -+ u32 tunnel_src_ip[4]; -+ u32 tunnel_dest_ip[4]; -+ -+ u8 flow_label[3]; -+ u8 priority; -+ -+ u32 udf_tsid; -+ -+ u32 ib2; -+ -+ struct mtk_foe_mac_info l2; -+}; -+ -+struct mtk_foe_ipv6 { -+ u32 src_ip[4]; -+ u32 dest_ip[4]; -+ -+ union { -+ struct { -+ u8 protocol; -+ u8 _pad[3]; /* fill with 0xa5a5a5 */ -+ }; /* 3-tuple */ -+ struct { -+ u16 dest_port; -+ u16 src_port; -+ }; /* 5-tuple */ -+ u32 ports; -+ }; -+ -+ u32 _rsv[3]; -+ -+ u32 udf; -+ -+ u32 ib2; -+ struct mtk_foe_mac_info l2; -+}; -+ -+struct mtk_foe_ipv6_6rd { -+ u32 src_ip[4]; -+ u32 dest_ip[4]; -+ u16 dest_port; -+ u16 src_port; -+ -+ u32 tunnel_src_ip; -+ u32 tunnel_dest_ip; -+ -+ u16 hdr_csum; -+ u8 dscp; -+ u8 ttl; -+ -+ u8 flag; -+ u8 pad; -+ u8 per_flow_6rd_id; -+ u8 pad2; -+ -+ u32 ib2; -+ struct mtk_foe_mac_info l2; -+}; -+ -+struct mtk_foe_entry { -+ u32 ib1; -+ -+ union { -+ struct mtk_foe_bridge bridge; -+ struct mtk_foe_ipv4 ipv4; -+ struct mtk_foe_ipv4_dslite dslite; -+ struct mtk_foe_ipv6 ipv6; -+ struct mtk_foe_ipv6_6rd ipv6_6rd; -+ u32 data[19]; -+ }; -+}; -+ -+enum { -+ MTK_PPE_CPU_REASON_TTL_EXCEEDED = 0x02, -+ MTK_PPE_CPU_REASON_OPTION_HEADER = 0x03, -+ MTK_PPE_CPU_REASON_NO_FLOW = 0x07, -+ MTK_PPE_CPU_REASON_IPV4_FRAG = 0x08, -+ MTK_PPE_CPU_REASON_IPV4_DSLITE_FRAG = 0x09, -+ MTK_PPE_CPU_REASON_IPV4_DSLITE_NO_TCP_UDP = 0x0a, -+ MTK_PPE_CPU_REASON_IPV6_6RD_NO_TCP_UDP = 0x0b, -+ MTK_PPE_CPU_REASON_TCP_FIN_SYN_RST = 0x0c, -+ MTK_PPE_CPU_REASON_UN_HIT = 0x0d, -+ MTK_PPE_CPU_REASON_HIT_UNBIND = 0x0e, -+ MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f, -+ MTK_PPE_CPU_REASON_HIT_BIND_TCP_FIN = 0x10, -+ MTK_PPE_CPU_REASON_HIT_TTL_1 = 0x11, -+ MTK_PPE_CPU_REASON_HIT_BIND_VLAN_VIOLATION = 0x12, -+ MTK_PPE_CPU_REASON_KEEPALIVE_UC_OLD_HDR = 0x13, -+ MTK_PPE_CPU_REASON_KEEPALIVE_MC_NEW_HDR = 0x14, -+ MTK_PPE_CPU_REASON_KEEPALIVE_DUP_OLD_HDR = 0x15, -+ MTK_PPE_CPU_REASON_HIT_BIND_FORCE_CPU = 0x16, -+ MTK_PPE_CPU_REASON_TUNNEL_OPTION_HEADER = 0x17, -+ MTK_PPE_CPU_REASON_MULTICAST_TO_CPU = 0x18, -+ MTK_PPE_CPU_REASON_MULTICAST_TO_GMAC1_CPU = 0x19, -+ MTK_PPE_CPU_REASON_HIT_PRE_BIND = 0x1a, -+ MTK_PPE_CPU_REASON_PACKET_SAMPLING = 0x1b, -+ MTK_PPE_CPU_REASON_EXCEED_MTU = 0x1c, -+ MTK_PPE_CPU_REASON_PPE_BYPASS = 0x1e, -+ MTK_PPE_CPU_REASON_INVALID = 0x1f, -+}; -+ -+struct mtk_ppe { -+ struct device *dev; -+ void __iomem *base; -+ int version; -+ -+ struct mtk_foe_entry *foe_table; -+ dma_addr_t foe_phys; -+ -+ void *acct_table; -+}; -+ -+int mtk_ppe_init(struct mtk_ppe *ppe, struct device *dev, void __iomem *base, -+ int version); -+int mtk_ppe_start(struct mtk_ppe *ppe); -+int mtk_ppe_stop(struct mtk_ppe *ppe); -+ -+static inline void -+mtk_foe_entry_clear(struct mtk_ppe *ppe, u16 hash) -+{ -+ ppe->foe_table[hash].ib1 = 0; -+ dma_wmb(); -+} -+ -+static inline int -+mtk_foe_entry_timestamp(struct mtk_ppe *ppe, u16 hash) -+{ -+ u32 ib1 = READ_ONCE(ppe->foe_table[hash].ib1); -+ -+ if (FIELD_GET(MTK_FOE_IB1_STATE, ib1) != MTK_FOE_STATE_BIND) -+ return -1; -+ -+ return FIELD_GET(MTK_FOE_IB1_BIND_TIMESTAMP, ib1); -+} -+ -+int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto, -+ u8 pse_port, u8 *src_mac, u8 *dest_mac); -+int mtk_foe_entry_set_pse_port(struct mtk_foe_entry *entry, u8 port); -+int mtk_foe_entry_set_ipv4_tuple(struct mtk_foe_entry *entry, bool orig, -+ __be32 src_addr, __be16 src_port, -+ __be32 dest_addr, __be16 dest_port); -+int mtk_foe_entry_set_ipv6_tuple(struct mtk_foe_entry *entry, -+ __be32 *src_addr, __be16 src_port, -+ __be32 *dest_addr, __be16 dest_port); -+int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port); -+int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid); -+int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid); -+int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, -+ u16 timestamp); -+int mtk_ppe_debugfs_init(struct mtk_ppe *ppe); -+ -+#endif ---- /dev/null -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c -@@ -0,0 +1,217 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* Copyright (C) 2020 Felix Fietkau */ -+ -+#include -+#include -+#include "mtk_eth_soc.h" -+ -+struct mtk_flow_addr_info -+{ -+ void *src, *dest; -+ u16 *src_port, *dest_port; -+ bool ipv6; -+}; -+ -+static const char *mtk_foe_entry_state_str(int state) -+{ -+ static const char * const state_str[] = { -+ [MTK_FOE_STATE_INVALID] = "INV", -+ [MTK_FOE_STATE_UNBIND] = "UNB", -+ [MTK_FOE_STATE_BIND] = "BND", -+ [MTK_FOE_STATE_FIN] = "FIN", -+ }; -+ -+ if (state >= ARRAY_SIZE(state_str) || !state_str[state]) -+ return "UNK"; -+ -+ return state_str[state]; -+} -+ -+static const char *mtk_foe_pkt_type_str(int type) -+{ -+ static const char * const type_str[] = { -+ [MTK_PPE_PKT_TYPE_IPV4_HNAPT] = "IPv4 5T", -+ [MTK_PPE_PKT_TYPE_IPV4_ROUTE] = "IPv4 3T", -+ [MTK_PPE_PKT_TYPE_BRIDGE] = "L2", -+ [MTK_PPE_PKT_TYPE_IPV4_DSLITE] = "DS-LITE", -+ [MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T] = "IPv6 3T", -+ [MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T] = "IPv6 5T", -+ [MTK_PPE_PKT_TYPE_IPV6_6RD] = "6RD", -+ }; -+ -+ if (type >= ARRAY_SIZE(type_str) || !type_str[type]) -+ return "UNKNOWN"; -+ -+ return type_str[type]; -+} -+ -+static void -+mtk_print_addr(struct seq_file *m, u32 *addr, bool ipv6) -+{ -+ u32 n_addr[4]; -+ int i; -+ -+ if (!ipv6) { -+ seq_printf(m, "%pI4h", addr); -+ return; -+ } -+ -+ for (i = 0; i < ARRAY_SIZE(n_addr); i++) -+ n_addr[i] = htonl(addr[i]); -+ seq_printf(m, "%pI6", n_addr); -+} -+ -+static void -+mtk_print_addr_info(struct seq_file *m, struct mtk_flow_addr_info *ai) -+{ -+ mtk_print_addr(m, ai->src, ai->ipv6); -+ if (ai->src_port) -+ seq_printf(m, ":%d", *ai->src_port); -+ seq_printf(m, "->"); -+ mtk_print_addr(m, ai->dest, ai->ipv6); -+ if (ai->dest_port) -+ seq_printf(m, ":%d", *ai->dest_port); -+} -+ -+static int -+mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind) -+{ -+ struct mtk_ppe *ppe = m->private; -+ int i, count; -+ -+ for (i = 0, count = 0; i < MTK_PPE_ENTRIES; i++) { -+ struct mtk_foe_entry *entry = &ppe->foe_table[i]; -+ struct mtk_foe_mac_info *l2; -+ struct mtk_flow_addr_info ai = {}; -+ unsigned char h_source[ETH_ALEN]; -+ unsigned char h_dest[ETH_ALEN]; -+ int type, state; -+ u32 ib2; -+ -+ -+ state = FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1); -+ if (!state) -+ continue; -+ -+ if (bind && state != MTK_FOE_STATE_BIND) -+ continue; -+ -+ type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); -+ seq_printf(m, "%05x %s %7s", i, -+ mtk_foe_entry_state_str(state), -+ mtk_foe_pkt_type_str(type)); -+ -+ switch (type) { -+ case MTK_PPE_PKT_TYPE_IPV4_HNAPT: -+ case MTK_PPE_PKT_TYPE_IPV4_DSLITE: -+ ai.src_port = &entry->ipv4.orig.src_port; -+ ai.dest_port = &entry->ipv4.orig.dest_port; -+ fallthrough; -+ case MTK_PPE_PKT_TYPE_IPV4_ROUTE: -+ ai.src = &entry->ipv4.orig.src_ip; -+ ai.dest = &entry->ipv4.orig.dest_ip; -+ break; -+ case MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T: -+ ai.src_port = &entry->ipv6.src_port; -+ ai.dest_port = &entry->ipv6.dest_port; -+ fallthrough; -+ case MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T: -+ case MTK_PPE_PKT_TYPE_IPV6_6RD: -+ ai.src = &entry->ipv6.src_ip; -+ ai.dest = &entry->ipv6.dest_ip; -+ ai.ipv6 = true; -+ break; -+ } -+ -+ seq_printf(m, " orig="); -+ mtk_print_addr_info(m, &ai); -+ -+ switch (type) { -+ case MTK_PPE_PKT_TYPE_IPV4_HNAPT: -+ case MTK_PPE_PKT_TYPE_IPV4_DSLITE: -+ ai.src_port = &entry->ipv4.new.src_port; -+ ai.dest_port = &entry->ipv4.new.dest_port; -+ fallthrough; -+ case MTK_PPE_PKT_TYPE_IPV4_ROUTE: -+ ai.src = &entry->ipv4.new.src_ip; -+ ai.dest = &entry->ipv4.new.dest_ip; -+ seq_printf(m, " new="); -+ mtk_print_addr_info(m, &ai); -+ break; -+ } -+ -+ if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) { -+ l2 = &entry->ipv6.l2; -+ ib2 = entry->ipv6.ib2; -+ } else { -+ l2 = &entry->ipv4.l2; -+ ib2 = entry->ipv4.ib2; -+ } -+ -+ *((__be32 *)h_source) = htonl(l2->src_mac_hi); -+ *((__be16 *)&h_source[4]) = htons(l2->src_mac_lo); -+ *((__be32 *)h_dest) = htonl(l2->dest_mac_hi); -+ *((__be16 *)&h_dest[4]) = htons(l2->dest_mac_lo); -+ -+ seq_printf(m, " eth=%pM->%pM etype=%04x" -+ " vlan=%d,%d ib1=%08x ib2=%08x\n", -+ h_source, h_dest, ntohs(l2->etype), -+ l2->vlan1, l2->vlan2, entry->ib1, ib2); -+ } -+ -+ return 0; -+} -+ -+static int -+mtk_ppe_debugfs_foe_show_all(struct seq_file *m, void *private) -+{ -+ return mtk_ppe_debugfs_foe_show(m, private, false); -+} -+ -+static int -+mtk_ppe_debugfs_foe_show_bind(struct seq_file *m, void *private) -+{ -+ return mtk_ppe_debugfs_foe_show(m, private, true); -+} -+ -+static int -+mtk_ppe_debugfs_foe_open_all(struct inode *inode, struct file *file) -+{ -+ return single_open(file, mtk_ppe_debugfs_foe_show_all, -+ inode->i_private); -+} -+ -+static int -+mtk_ppe_debugfs_foe_open_bind(struct inode *inode, struct file *file) -+{ -+ return single_open(file, mtk_ppe_debugfs_foe_show_bind, -+ inode->i_private); -+} -+ -+int mtk_ppe_debugfs_init(struct mtk_ppe *ppe) -+{ -+ static const struct file_operations fops_all = { -+ .open = mtk_ppe_debugfs_foe_open_all, -+ .read = seq_read, -+ .llseek = seq_lseek, -+ .release = single_release, -+ }; -+ -+ static const struct file_operations fops_bind = { -+ .open = mtk_ppe_debugfs_foe_open_bind, -+ .read = seq_read, -+ .llseek = seq_lseek, -+ .release = single_release, -+ }; -+ -+ struct dentry *root; -+ -+ root = debugfs_create_dir("mtk_ppe", NULL); -+ if (!root) -+ return -ENOMEM; -+ -+ debugfs_create_file("entries", S_IRUGO, root, ppe, &fops_all); -+ debugfs_create_file("bind", S_IRUGO, root, ppe, &fops_bind); -+ -+ return 0; -+} ---- /dev/null -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_regs.h -@@ -0,0 +1,144 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* Copyright (C) 2020 Felix Fietkau */ -+ -+#ifndef __MTK_PPE_REGS_H -+#define __MTK_PPE_REGS_H -+ -+#define MTK_PPE_GLO_CFG 0x200 -+#define MTK_PPE_GLO_CFG_EN BIT(0) -+#define MTK_PPE_GLO_CFG_TSID_EN BIT(1) -+#define MTK_PPE_GLO_CFG_IP4_L4_CS_DROP BIT(2) -+#define MTK_PPE_GLO_CFG_IP4_CS_DROP BIT(3) -+#define MTK_PPE_GLO_CFG_TTL0_DROP BIT(4) -+#define MTK_PPE_GLO_CFG_PPE_BSWAP BIT(5) -+#define MTK_PPE_GLO_CFG_PSE_HASH_OFS BIT(6) -+#define MTK_PPE_GLO_CFG_MCAST_TB_EN BIT(7) -+#define MTK_PPE_GLO_CFG_FLOW_DROP_KA BIT(8) -+#define MTK_PPE_GLO_CFG_FLOW_DROP_UPDATE BIT(9) -+#define MTK_PPE_GLO_CFG_UDP_LITE_EN BIT(10) -+#define MTK_PPE_GLO_CFG_UDP_LEN_DROP BIT(11) -+#define MTK_PPE_GLO_CFG_MCAST_ENTRIES GNEMASK(13, 12) -+#define MTK_PPE_GLO_CFG_BUSY BIT(31) -+ -+#define MTK_PPE_FLOW_CFG 0x204 -+#define MTK_PPE_FLOW_CFG_IP4_TCP_FRAG BIT(6) -+#define MTK_PPE_FLOW_CFG_IP4_UDP_FRAG BIT(7) -+#define MTK_PPE_FLOW_CFG_IP6_3T_ROUTE BIT(8) -+#define MTK_PPE_FLOW_CFG_IP6_5T_ROUTE BIT(9) -+#define MTK_PPE_FLOW_CFG_IP6_6RD BIT(10) -+#define MTK_PPE_FLOW_CFG_IP4_NAT BIT(12) -+#define MTK_PPE_FLOW_CFG_IP4_NAPT BIT(13) -+#define MTK_PPE_FLOW_CFG_IP4_DSLITE BIT(14) -+#define MTK_PPE_FLOW_CFG_L2_BRIDGE BIT(15) -+#define MTK_PPE_FLOW_CFG_IP_PROTO_BLACKLIST BIT(16) -+#define MTK_PPE_FLOW_CFG_IP4_NAT_FRAG BIT(17) -+#define MTK_PPE_FLOW_CFG_IP4_HASH_FLOW_LABEL BIT(18) -+#define MTK_PPE_FLOW_CFG_IP4_HASH_GRE_KEY BIT(19) -+#define MTK_PPE_FLOW_CFG_IP6_HASH_GRE_KEY BIT(20) -+ -+#define MTK_PPE_IP_PROTO_CHK 0x208 -+#define MTK_PPE_IP_PROTO_CHK_IPV4 GENMASK(15, 0) -+#define MTK_PPE_IP_PROTO_CHK_IPV6 GENMASK(31, 16) -+ -+#define MTK_PPE_TB_CFG 0x21c -+#define MTK_PPE_TB_CFG_ENTRY_NUM GENMASK(2, 0) -+#define MTK_PPE_TB_CFG_ENTRY_80B BIT(3) -+#define MTK_PPE_TB_CFG_SEARCH_MISS GENMASK(5, 4) -+#define MTK_PPE_TB_CFG_AGE_PREBIND BIT(6) -+#define MTK_PPE_TB_CFG_AGE_NON_L4 BIT(7) -+#define MTK_PPE_TB_CFG_AGE_UNBIND BIT(8) -+#define MTK_PPE_TB_CFG_AGE_TCP BIT(9) -+#define MTK_PPE_TB_CFG_AGE_UDP BIT(10) -+#define MTK_PPE_TB_CFG_AGE_TCP_FIN BIT(11) -+#define MTK_PPE_TB_CFG_KEEPALIVE GENMASK(13, 12) -+#define MTK_PPE_TB_CFG_HASH_MODE GENMASK(15, 14) -+#define MTK_PPE_TB_CFG_SCAN_MODE GENMASK(17, 16) -+#define MTK_PPE_TB_CFG_HASH_DEBUG GENMASK(19, 18) -+ -+enum { -+ MTK_PPE_SCAN_MODE_DISABLED, -+ MTK_PPE_SCAN_MODE_CHECK_AGE, -+ MTK_PPE_SCAN_MODE_KEEPALIVE_AGE, -+}; -+ -+enum { -+ MTK_PPE_KEEPALIVE_DISABLE, -+ MTK_PPE_KEEPALIVE_UNICAST_CPU, -+ MTK_PPE_KEEPALIVE_DUP_CPU = 3, -+}; -+ -+enum { -+ MTK_PPE_SEARCH_MISS_ACTION_DROP, -+ MTK_PPE_SEARCH_MISS_ACTION_FORWARD = 2, -+ MTK_PPE_SEARCH_MISS_ACTION_FORWARD_BUILD = 3, -+}; -+ -+#define MTK_PPE_TB_BASE 0x220 -+ -+#define MTK_PPE_TB_USED 0x224 -+#define MTK_PPE_TB_USED_NUM GENMASK(13, 0) -+ -+#define MTK_PPE_BIND_RATE 0x228 -+#define MTK_PPE_BIND_RATE_BIND GENMASK(15, 0) -+#define MTK_PPE_BIND_RATE_PREBIND GENMASK(31, 16) -+ -+#define MTK_PPE_BIND_LIMIT0 0x22c -+#define MTK_PPE_BIND_LIMIT0_QUARTER GENMASK(13, 0) -+#define MTK_PPE_BIND_LIMIT0_HALF GENMASK(29, 16) -+ -+#define MTK_PPE_BIND_LIMIT1 0x230 -+#define MTK_PPE_BIND_LIMIT1_FULL GENMASK(13, 0) -+#define MTK_PPE_BIND_LIMIT1_NON_L4 GENMASK(23, 16) -+ -+#define MTK_PPE_KEEPALIVE 0x234 -+#define MTK_PPE_KEEPALIVE_TIME GENMASK(15, 0) -+#define MTK_PPE_KEEPALIVE_TIME_TCP GENMASK(23, 16) -+#define MTK_PPE_KEEPALIVE_TIME_UDP GENMASK(31, 24) -+ -+#define MTK_PPE_UNBIND_AGE 0x238 -+#define MTK_PPE_UNBIND_AGE_MIN_PACKETS GENMASK(31, 16) -+#define MTK_PPE_UNBIND_AGE_DELTA GENMASK(7, 0) -+ -+#define MTK_PPE_BIND_AGE0 0x23c -+#define MTK_PPE_BIND_AGE0_DELTA_NON_L4 GENMASK(30, 16) -+#define MTK_PPE_BIND_AGE0_DELTA_UDP GENMASK(14, 0) -+ -+#define MTK_PPE_BIND_AGE1 0x240 -+#define MTK_PPE_BIND_AGE1_DELTA_TCP_FIN GENMASK(30, 16) -+#define MTK_PPE_BIND_AGE1_DELTA_TCP GENMASK(14, 0) -+ -+#define MTK_PPE_HASH_SEED 0x244 -+ -+#define MTK_PPE_DEFAULT_CPU_PORT 0x248 -+#define MTK_PPE_DEFAULT_CPU_PORT_MASK(_n) (GENMASK(2, 0) << ((_n) * 4)) -+ -+#define MTK_PPE_MTU_DROP 0x308 -+ -+#define MTK_PPE_VLAN_MTU0 0x30c -+#define MTK_PPE_VLAN_MTU0_NONE GENMASK(13, 0) -+#define MTK_PPE_VLAN_MTU0_1TAG GENMASK(29, 16) -+ -+#define MTK_PPE_VLAN_MTU1 0x310 -+#define MTK_PPE_VLAN_MTU1_2TAG GENMASK(13, 0) -+#define MTK_PPE_VLAN_MTU1_3TAG GENMASK(29, 16) -+ -+#define MTK_PPE_VPM_TPID 0x318 -+ -+#define MTK_PPE_CACHE_CTL 0x320 -+#define MTK_PPE_CACHE_CTL_EN BIT(0) -+#define MTK_PPE_CACHE_CTL_LOCK_CLR BIT(4) -+#define MTK_PPE_CACHE_CTL_REQ BIT(8) -+#define MTK_PPE_CACHE_CTL_CLEAR BIT(9) -+#define MTK_PPE_CACHE_CTL_CMD GENMASK(13, 12) -+ -+#define MTK_PPE_MIB_CFG 0x334 -+#define MTK_PPE_MIB_CFG_EN BIT(0) -+#define MTK_PPE_MIB_CFG_RD_CLR BIT(1) -+ -+#define MTK_PPE_MIB_TB_BASE 0x338 -+ -+#define MTK_PPE_MIB_CACHE_CTL 0x350 -+#define MTK_PPE_MIB_CACHE_CTL_EN BIT(0) -+#define MTK_PPE_MIB_CACHE_CTL_FLUSH BIT(2) -+ -+#endif diff --git a/target/linux/generic/backport-5.10/610-v5.13-33-net-ethernet-mtk_eth_soc-add-flow-offloading-support.patch b/target/linux/generic/backport-5.10/610-v5.13-33-net-ethernet-mtk_eth_soc-add-flow-offloading-support.patch deleted file mode 100644 index b43417db46..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-33-net-ethernet-mtk_eth_soc-add-flow-offloading-support.patch +++ /dev/null @@ -1,568 +0,0 @@ -From: Felix Fietkau -Date: Wed, 24 Mar 2021 02:30:54 +0100 -Subject: [PATCH] net: ethernet: mtk_eth_soc: add flow offloading support - -This adds support for offloading IPv4 routed flows, including SNAT/DNAT, -one VLAN, PPPoE and DSA. - -Signed-off-by: Felix Fietkau -Signed-off-by: Pablo Neira Ayuso ---- - create mode 100644 drivers/net/ethernet/mediatek/mtk_ppe_offload.c - ---- a/drivers/net/ethernet/mediatek/Makefile -+++ b/drivers/net/ethernet/mediatek/Makefile -@@ -4,5 +4,5 @@ - # - - obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o --mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o -+mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_ppe_offload.o - obj-$(CONFIG_NET_MEDIATEK_STAR_EMAC) += mtk_star_emac.o ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -2859,6 +2859,7 @@ static const struct net_device_ops mtk_n - #ifdef CONFIG_NET_POLL_CONTROLLER - .ndo_poll_controller = mtk_poll_controller, - #endif -+ .ndo_setup_tc = mtk_eth_setup_tc, - }; - - static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) -@@ -3117,6 +3118,10 @@ static int mtk_probe(struct platform_dev - eth->base + MTK_ETH_PPE_BASE, 2); - if (err) - goto err_free_dev; -+ -+ err = mtk_eth_offload_init(eth); -+ if (err) -+ goto err_free_dev; - } - - for (i = 0; i < MTK_MAX_DEVS; i++) { ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - #include "mtk_ppe.h" - - #define MTK_QDMA_PAGE_SIZE 2048 -@@ -40,7 +41,8 @@ - NETIF_F_HW_VLAN_CTAG_RX | \ - NETIF_F_SG | NETIF_F_TSO | \ - NETIF_F_TSO6 | \ -- NETIF_F_IPV6_CSUM) -+ NETIF_F_IPV6_CSUM |\ -+ NETIF_F_HW_TC) - #define MTK_HW_FEATURES_MT7628 (NETIF_F_SG | NETIF_F_RXCSUM) - #define NEXT_DESP_IDX(X, Y) (((X) + 1) & ((Y) - 1)) - -@@ -930,6 +932,7 @@ struct mtk_eth { - int ip_align; - - struct mtk_ppe ppe; -+ struct rhashtable flow_table; - }; - - /* struct mtk_mac - the structure that holds the info about the MACs of the -@@ -974,4 +977,9 @@ int mtk_gmac_sgmii_path_setup(struct mtk - int mtk_gmac_gephy_path_setup(struct mtk_eth *eth, int mac_id); - int mtk_gmac_rgmii_path_setup(struct mtk_eth *eth, int mac_id); - -+int mtk_eth_offload_init(struct mtk_eth *eth); -+int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type, -+ void *type_data); -+ -+ - #endif /* MTK_ETH_H */ ---- /dev/null -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -0,0 +1,485 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Copyright (C) 2020 Felix Fietkau -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "mtk_eth_soc.h" -+ -+struct mtk_flow_data { -+ struct ethhdr eth; -+ -+ union { -+ struct { -+ __be32 src_addr; -+ __be32 dst_addr; -+ } v4; -+ }; -+ -+ __be16 src_port; -+ __be16 dst_port; -+ -+ struct { -+ u16 id; -+ __be16 proto; -+ u8 num; -+ } vlan; -+ struct { -+ u16 sid; -+ u8 num; -+ } pppoe; -+}; -+ -+struct mtk_flow_entry { -+ struct rhash_head node; -+ unsigned long cookie; -+ u16 hash; -+}; -+ -+static const struct rhashtable_params mtk_flow_ht_params = { -+ .head_offset = offsetof(struct mtk_flow_entry, node), -+ .head_offset = offsetof(struct mtk_flow_entry, cookie), -+ .key_len = sizeof(unsigned long), -+ .automatic_shrinking = true, -+}; -+ -+static u32 -+mtk_eth_timestamp(struct mtk_eth *eth) -+{ -+ return mtk_r32(eth, 0x0010) & MTK_FOE_IB1_BIND_TIMESTAMP; -+} -+ -+static int -+mtk_flow_set_ipv4_addr(struct mtk_foe_entry *foe, struct mtk_flow_data *data, -+ bool egress) -+{ -+ return mtk_foe_entry_set_ipv4_tuple(foe, egress, -+ data->v4.src_addr, data->src_port, -+ data->v4.dst_addr, data->dst_port); -+} -+ -+static void -+mtk_flow_offload_mangle_eth(const struct flow_action_entry *act, void *eth) -+{ -+ void *dest = eth + act->mangle.offset; -+ const void *src = &act->mangle.val; -+ -+ if (act->mangle.offset > 8) -+ return; -+ -+ if (act->mangle.mask == 0xffff) { -+ src += 2; -+ dest += 2; -+ } -+ -+ memcpy(dest, src, act->mangle.mask ? 2 : 4); -+} -+ -+ -+static int -+mtk_flow_mangle_ports(const struct flow_action_entry *act, -+ struct mtk_flow_data *data) -+{ -+ u32 val = ntohl(act->mangle.val); -+ -+ switch (act->mangle.offset) { -+ case 0: -+ if (act->mangle.mask == ~htonl(0xffff)) -+ data->dst_port = cpu_to_be16(val); -+ else -+ data->src_port = cpu_to_be16(val >> 16); -+ break; -+ case 2: -+ data->dst_port = cpu_to_be16(val); -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static int -+mtk_flow_mangle_ipv4(const struct flow_action_entry *act, -+ struct mtk_flow_data *data) -+{ -+ __be32 *dest; -+ -+ switch (act->mangle.offset) { -+ case offsetof(struct iphdr, saddr): -+ dest = &data->v4.src_addr; -+ break; -+ case offsetof(struct iphdr, daddr): -+ dest = &data->v4.dst_addr; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ memcpy(dest, &act->mangle.val, sizeof(u32)); -+ -+ return 0; -+} -+ -+static int -+mtk_flow_get_dsa_port(struct net_device **dev) -+{ -+#if IS_ENABLED(CONFIG_NET_DSA) -+ struct dsa_port *dp; -+ -+ dp = dsa_port_from_netdev(*dev); -+ if (IS_ERR(dp)) -+ return -ENODEV; -+ -+ if (dp->cpu_dp->tag_ops->proto != DSA_TAG_PROTO_MTK) -+ return -ENODEV; -+ -+ *dev = dp->cpu_dp->master; -+ -+ return dp->index; -+#else -+ return -ENODEV; -+#endif -+} -+ -+static int -+mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe, -+ struct net_device *dev) -+{ -+ int pse_port, dsa_port; -+ -+ dsa_port = mtk_flow_get_dsa_port(&dev); -+ if (dsa_port >= 0) -+ mtk_foe_entry_set_dsa(foe, dsa_port); -+ -+ if (dev == eth->netdev[0]) -+ pse_port = 1; -+ else if (dev == eth->netdev[1]) -+ pse_port = 2; -+ else -+ return -EOPNOTSUPP; -+ -+ mtk_foe_entry_set_pse_port(foe, pse_port); -+ -+ return 0; -+} -+ -+static int -+mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f) -+{ -+ struct flow_rule *rule = flow_cls_offload_flow_rule(f); -+ struct flow_action_entry *act; -+ struct mtk_flow_data data = {}; -+ struct mtk_foe_entry foe; -+ struct net_device *odev = NULL; -+ struct mtk_flow_entry *entry; -+ int offload_type = 0; -+ u16 addr_type = 0; -+ u32 timestamp; -+ u8 l4proto = 0; -+ int err = 0; -+ int hash; -+ int i; -+ -+ if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_META)) { -+ struct flow_match_meta match; -+ -+ flow_rule_match_meta(rule, &match); -+ } else { -+ return -EOPNOTSUPP; -+ } -+ -+ if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CONTROL)) { -+ struct flow_match_control match; -+ -+ flow_rule_match_control(rule, &match); -+ addr_type = match.key->addr_type; -+ } else { -+ return -EOPNOTSUPP; -+ } -+ -+ if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_BASIC)) { -+ struct flow_match_basic match; -+ -+ flow_rule_match_basic(rule, &match); -+ l4proto = match.key->ip_proto; -+ } else { -+ return -EOPNOTSUPP; -+ } -+ -+ flow_action_for_each(i, act, &rule->action) { -+ switch (act->id) { -+ case FLOW_ACTION_MANGLE: -+ if (act->mangle.htype == FLOW_ACT_MANGLE_HDR_TYPE_ETH) -+ mtk_flow_offload_mangle_eth(act, &data.eth); -+ break; -+ case FLOW_ACTION_REDIRECT: -+ odev = act->dev; -+ break; -+ case FLOW_ACTION_CSUM: -+ break; -+ case FLOW_ACTION_VLAN_PUSH: -+ if (data.vlan.num == 1 || -+ act->vlan.proto != htons(ETH_P_8021Q)) -+ return -EOPNOTSUPP; -+ -+ data.vlan.id = act->vlan.vid; -+ data.vlan.proto = act->vlan.proto; -+ data.vlan.num++; -+ break; -+ case FLOW_ACTION_PPPOE_PUSH: -+ if (data.pppoe.num == 1) -+ return -EOPNOTSUPP; -+ -+ data.pppoe.sid = act->pppoe.sid; -+ data.pppoe.num++; -+ break; -+ default: -+ return -EOPNOTSUPP; -+ } -+ } -+ -+ switch (addr_type) { -+ case FLOW_DISSECTOR_KEY_IPV4_ADDRS: -+ offload_type = MTK_PPE_PKT_TYPE_IPV4_HNAPT; -+ break; -+ default: -+ return -EOPNOTSUPP; -+ } -+ -+ if (!is_valid_ether_addr(data.eth.h_source) || -+ !is_valid_ether_addr(data.eth.h_dest)) -+ return -EINVAL; -+ -+ err = mtk_foe_entry_prepare(&foe, offload_type, l4proto, 0, -+ data.eth.h_source, -+ data.eth.h_dest); -+ if (err) -+ return err; -+ -+ if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_PORTS)) { -+ struct flow_match_ports ports; -+ -+ flow_rule_match_ports(rule, &ports); -+ data.src_port = ports.key->src; -+ data.dst_port = ports.key->dst; -+ } else { -+ return -EOPNOTSUPP; -+ } -+ -+ if (addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) { -+ struct flow_match_ipv4_addrs addrs; -+ -+ flow_rule_match_ipv4_addrs(rule, &addrs); -+ -+ data.v4.src_addr = addrs.key->src; -+ data.v4.dst_addr = addrs.key->dst; -+ -+ mtk_flow_set_ipv4_addr(&foe, &data, false); -+ } -+ -+ flow_action_for_each(i, act, &rule->action) { -+ if (act->id != FLOW_ACTION_MANGLE) -+ continue; -+ -+ switch (act->mangle.htype) { -+ case FLOW_ACT_MANGLE_HDR_TYPE_TCP: -+ case FLOW_ACT_MANGLE_HDR_TYPE_UDP: -+ err = mtk_flow_mangle_ports(act, &data); -+ break; -+ case FLOW_ACT_MANGLE_HDR_TYPE_IP4: -+ err = mtk_flow_mangle_ipv4(act, &data); -+ break; -+ case FLOW_ACT_MANGLE_HDR_TYPE_ETH: -+ /* handled earlier */ -+ break; -+ default: -+ return -EOPNOTSUPP; -+ } -+ -+ if (err) -+ return err; -+ } -+ -+ if (addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) { -+ err = mtk_flow_set_ipv4_addr(&foe, &data, true); -+ if (err) -+ return err; -+ } -+ -+ if (data.vlan.num == 1) { -+ if (data.vlan.proto != htons(ETH_P_8021Q)) -+ return -EOPNOTSUPP; -+ -+ mtk_foe_entry_set_vlan(&foe, data.vlan.id); -+ } -+ if (data.pppoe.num == 1) -+ mtk_foe_entry_set_pppoe(&foe, data.pppoe.sid); -+ -+ err = mtk_flow_set_output_device(eth, &foe, odev); -+ if (err) -+ return err; -+ -+ entry = kzalloc(sizeof(*entry), GFP_KERNEL); -+ if (!entry) -+ return -ENOMEM; -+ -+ entry->cookie = f->cookie; -+ timestamp = mtk_eth_timestamp(eth); -+ hash = mtk_foe_entry_commit(ð->ppe, &foe, timestamp); -+ if (hash < 0) { -+ err = hash; -+ goto free; -+ } -+ -+ entry->hash = hash; -+ err = rhashtable_insert_fast(ð->flow_table, &entry->node, -+ mtk_flow_ht_params); -+ if (err < 0) -+ goto clear_flow; -+ -+ return 0; -+clear_flow: -+ mtk_foe_entry_clear(ð->ppe, hash); -+free: -+ kfree(entry); -+ return err; -+} -+ -+static int -+mtk_flow_offload_destroy(struct mtk_eth *eth, struct flow_cls_offload *f) -+{ -+ struct mtk_flow_entry *entry; -+ -+ entry = rhashtable_lookup(ð->flow_table, &f->cookie, -+ mtk_flow_ht_params); -+ if (!entry) -+ return -ENOENT; -+ -+ mtk_foe_entry_clear(ð->ppe, entry->hash); -+ rhashtable_remove_fast(ð->flow_table, &entry->node, -+ mtk_flow_ht_params); -+ kfree(entry); -+ -+ return 0; -+} -+ -+static int -+mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f) -+{ -+ struct mtk_flow_entry *entry; -+ int timestamp; -+ u32 idle; -+ -+ entry = rhashtable_lookup(ð->flow_table, &f->cookie, -+ mtk_flow_ht_params); -+ if (!entry) -+ return -ENOENT; -+ -+ timestamp = mtk_foe_entry_timestamp(ð->ppe, entry->hash); -+ if (timestamp < 0) -+ return -ETIMEDOUT; -+ -+ idle = mtk_eth_timestamp(eth) - timestamp; -+ f->stats.lastused = jiffies - idle * HZ; -+ -+ return 0; -+} -+ -+static int -+mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv) -+{ -+ struct flow_cls_offload *cls = type_data; -+ struct net_device *dev = cb_priv; -+ struct mtk_mac *mac = netdev_priv(dev); -+ struct mtk_eth *eth = mac->hw; -+ -+ if (!tc_can_offload(dev)) -+ return -EOPNOTSUPP; -+ -+ if (type != TC_SETUP_CLSFLOWER) -+ return -EOPNOTSUPP; -+ -+ switch (cls->command) { -+ case FLOW_CLS_REPLACE: -+ return mtk_flow_offload_replace(eth, cls); -+ case FLOW_CLS_DESTROY: -+ return mtk_flow_offload_destroy(eth, cls); -+ case FLOW_CLS_STATS: -+ return mtk_flow_offload_stats(eth, cls); -+ default: -+ return -EOPNOTSUPP; -+ } -+ -+ return 0; -+} -+ -+static int -+mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f) -+{ -+ struct mtk_mac *mac = netdev_priv(dev); -+ struct mtk_eth *eth = mac->hw; -+ static LIST_HEAD(block_cb_list); -+ struct flow_block_cb *block_cb; -+ flow_setup_cb_t *cb; -+ -+ if (!eth->ppe.foe_table) -+ return -EOPNOTSUPP; -+ -+ if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) -+ return -EOPNOTSUPP; -+ -+ cb = mtk_eth_setup_tc_block_cb; -+ f->driver_block_list = &block_cb_list; -+ -+ switch (f->command) { -+ case FLOW_BLOCK_BIND: -+ block_cb = flow_block_cb_lookup(f->block, cb, dev); -+ if (block_cb) { -+ flow_block_cb_incref(block_cb); -+ return 0; -+ } -+ block_cb = flow_block_cb_alloc(cb, dev, dev, NULL); -+ if (IS_ERR(block_cb)) -+ return PTR_ERR(block_cb); -+ -+ flow_block_cb_add(block_cb, f); -+ list_add_tail(&block_cb->driver_list, &block_cb_list); -+ return 0; -+ case FLOW_BLOCK_UNBIND: -+ block_cb = flow_block_cb_lookup(f->block, cb, dev); -+ if (!block_cb) -+ return -ENOENT; -+ -+ if (flow_block_cb_decref(block_cb)) { -+ flow_block_cb_remove(block_cb, f); -+ list_del(&block_cb->driver_list); -+ } -+ return 0; -+ default: -+ return -EOPNOTSUPP; -+ } -+} -+ -+int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type, -+ void *type_data) -+{ -+ if (type == TC_SETUP_FT) -+ return mtk_eth_setup_tc_block(dev, type_data); -+ -+ return -EOPNOTSUPP; -+} -+ -+int mtk_eth_offload_init(struct mtk_eth *eth) -+{ -+ if (!eth->ppe.foe_table) -+ return 0; -+ -+ return rhashtable_init(ð->flow_table, &mtk_flow_ht_params); -+} diff --git a/target/linux/generic/backport-5.10/610-v5.13-34-docs-nf_flowtable-update-documentation-with-enhancem.patch b/target/linux/generic/backport-5.10/610-v5.13-34-docs-nf_flowtable-update-documentation-with-enhancem.patch deleted file mode 100644 index 2cea1ebe24..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-34-docs-nf_flowtable-update-documentation-with-enhancem.patch +++ /dev/null @@ -1,236 +0,0 @@ -From: Pablo Neira Ayuso -Date: Wed, 24 Mar 2021 02:30:55 +0100 -Subject: [PATCH] docs: nf_flowtable: update documentation with - enhancements - -This patch updates the flowtable documentation to describe recent -enhancements: - -- Offload action is available after the first packets go through the - classic forwarding path. -- IPv4 and IPv6 are supported. Only TCP and UDP layer 4 are supported at - this stage. -- Tuple has been augmented to track VLAN id and PPPoE session id. -- Bridge and IP forwarding integration, including bridge VLAN filtering - support. -- Hardware offload support. -- Describe the [OFFLOAD] and [HW_OFFLOAD] tags in the conntrack table - listing. -- Replace 'flow offload' by 'flow add' in example rulesets (preferred - syntax). -- Describe existing cache limitations. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/Documentation/networking/nf_flowtable.rst -+++ b/Documentation/networking/nf_flowtable.rst -@@ -4,35 +4,38 @@ - Netfilter's flowtable infrastructure - ==================================== - --This documentation describes the software flowtable infrastructure available in --Netfilter since Linux kernel 4.16. -+This documentation describes the Netfilter flowtable infrastructure which allows -+you to define a fastpath through the flowtable datapath. This infrastructure -+also provides hardware offload support. The flowtable supports for the layer 3 -+IPv4 and IPv6 and the layer 4 TCP and UDP protocols. - - Overview - -------- - --Initial packets follow the classic forwarding path, once the flow enters the --established state according to the conntrack semantics (ie. we have seen traffic --in both directions), then you can decide to offload the flow to the flowtable --from the forward chain via the 'flow offload' action available in nftables. -- --Packets that find an entry in the flowtable (ie. flowtable hit) are sent to the --output netdevice via neigh_xmit(), hence, they bypass the classic forwarding --path (the visible effect is that you do not see these packets from any of the --netfilter hooks coming after the ingress). In case of flowtable miss, the packet --follows the classic forward path. -- --The flowtable uses a resizable hashtable, lookups are based on the following --7-tuple selectors: source, destination, layer 3 and layer 4 protocols, source --and destination ports and the input interface (useful in case there are several --conntrack zones in place). -- --Flowtables are populated via the 'flow offload' nftables action, so the user can --selectively specify what flows are placed into the flow table. Hence, packets --follow the classic forwarding path unless the user explicitly instruct packets --to use this new alternative forwarding path via nftables policy. -+Once the first packet of the flow successfully goes through the IP forwarding -+path, from the second packet on, you might decide to offload the flow to the -+flowtable through your ruleset. The flowtable infrastructure provides a rule -+action that allows you to specify when to add a flow to the flowtable. -+ -+A packet that finds a matching entry in the flowtable (ie. flowtable hit) is -+transmitted to the output netdevice via neigh_xmit(), hence, packets bypass the -+classic IP forwarding path (the visible effect is that you do not see these -+packets from any of the Netfilter hooks coming after ingress). In case that -+there is no matching entry in the flowtable (ie. flowtable miss), the packet -+follows the classic IP forwarding path. -+ -+The flowtable uses a resizable hashtable. Lookups are based on the following -+n-tuple selectors: layer 2 protocol encapsulation (VLAN and PPPoE), layer 3 -+source and destination, layer 4 source and destination ports and the input -+interface (useful in case there are several conntrack zones in place). -+ -+The 'flow add' action allows you to populate the flowtable, the user selectively -+specifies what flows are placed into the flowtable. Hence, packets follow the -+classic IP forwarding path unless the user explicitly instruct flows to use this -+new alternative forwarding path via policy. - --This is represented in Fig.1, which describes the classic forwarding path --including the Netfilter hooks and the flowtable fastpath bypass. -+The flowtable datapath is represented in Fig.1, which describes the classic IP -+forwarding path including the Netfilter hooks and the flowtable fastpath bypass. - - :: - -@@ -67,11 +70,13 @@ including the Netfilter hooks and the fl - Fig.1 Netfilter hooks and flowtable interactions - - The flowtable entry also stores the NAT configuration, so all packets are --mangled according to the NAT policy that matches the initial packets that went --through the classic forwarding path. The TTL is decremented before calling --neigh_xmit(). Fragmented traffic is passed up to follow the classic forwarding --path given that the transport selectors are missing, therefore flowtable lookup --is not possible. -+mangled according to the NAT policy that is specified from the classic IP -+forwarding path. The TTL is decremented before calling neigh_xmit(). Fragmented -+traffic is passed up to follow the classic IP forwarding path given that the -+transport header is missing, in this case, flowtable lookups are not possible. -+TCP RST and FIN packets are also passed up to the classic IP forwarding path to -+release the flow gracefully. Packets that exceed the MTU are also passed up to -+the classic forwarding path to report packet-too-big ICMP errors to the sender. - - Example configuration - --------------------- -@@ -85,7 +90,7 @@ flowtable and add one rule to your forwa - } - chain y { - type filter hook forward priority 0; policy accept; -- ip protocol tcp flow offload @f -+ ip protocol tcp flow add @f - counter packets 0 bytes 0 - } - } -@@ -103,6 +108,117 @@ flow is offloaded, you will observe that - does not get updated for the packets that are being forwarded through the - forwarding bypass. - -+You can identify offloaded flows through the [OFFLOAD] tag when listing your -+connection tracking table. -+ -+:: -+ # conntrack -L -+ tcp 6 src=10.141.10.2 dst=192.168.10.2 sport=52728 dport=5201 src=192.168.10.2 dst=192.168.10.1 sport=5201 dport=52728 [OFFLOAD] mark=0 use=2 -+ -+ -+Layer 2 encapsulation -+--------------------- -+ -+Since Linux kernel 5.13, the flowtable infrastructure discovers the real -+netdevice behind VLAN and PPPoE netdevices. The flowtable software datapath -+parses the VLAN and PPPoE layer 2 headers to extract the ethertype and the -+VLAN ID / PPPoE session ID which are used for the flowtable lookups. The -+flowtable datapath also deals with layer 2 decapsulation. -+ -+You do not need to add the PPPoE and the VLAN devices to your flowtable, -+instead the real device is sufficient for the flowtable to track your flows. -+ -+Bridge and IP forwarding -+------------------------ -+ -+Since Linux kernel 5.13, you can add bridge ports to the flowtable. The -+flowtable infrastructure discovers the topology behind the bridge device. This -+allows the flowtable to define a fastpath bypass between the bridge ports -+(represented as eth1 and eth2 in the example figure below) and the gateway -+device (represented as eth0) in your switch/router. -+ -+:: -+ fastpath bypass -+ .-------------------------. -+ / \ -+ | IP forwarding | -+ | / \ \/ -+ | br0 eth0 ..... eth0 -+ . / \ *host B* -+ -> eth1 eth2 -+ . *switch/router* -+ . -+ . -+ eth0 -+ *host A* -+ -+The flowtable infrastructure also supports for bridge VLAN filtering actions -+such as PVID and untagged. You can also stack a classic VLAN device on top of -+your bridge port. -+ -+If you would like that your flowtable defines a fastpath between your bridge -+ports and your IP forwarding path, you have to add your bridge ports (as -+represented by the real netdevice) to your flowtable definition. -+ -+Counters -+-------- -+ -+The flowtable can synchronize packet and byte counters with the existing -+connection tracking entry by specifying the counter statement in your flowtable -+definition, e.g. -+ -+:: -+ table inet x { -+ flowtable f { -+ hook ingress priority 0; devices = { eth0, eth1 }; -+ counter -+ } -+ ... -+ } -+ -+Counter support is available since Linux kernel 5.7. -+ -+Hardware offload -+---------------- -+ -+If your network device provides hardware offload support, you can turn it on by -+means of the 'offload' flag in your flowtable definition, e.g. -+ -+:: -+ table inet x { -+ flowtable f { -+ hook ingress priority 0; devices = { eth0, eth1 }; -+ flags offload; -+ } -+ ... -+ } -+ -+There is a workqueue that adds the flows to the hardware. Note that a few -+packets might still run over the flowtable software path until the workqueue has -+a chance to offload the flow to the network device. -+ -+You can identify hardware offloaded flows through the [HW_OFFLOAD] tag when -+listing your connection tracking table. Please, note that the [OFFLOAD] tag -+refers to the software offload mode, so there is a distinction between [OFFLOAD] -+which refers to the software flowtable fastpath and [HW_OFFLOAD] which refers -+to the hardware offload datapath being used by the flow. -+ -+The flowtable hardware offload infrastructure also supports for the DSA -+(Distributed Switch Architecture). -+ -+Limitations -+----------- -+ -+The flowtable behaves like a cache. The flowtable entries might get stale if -+either the destination MAC address or the egress netdevice that is used for -+transmission changes. -+ -+This might be a problem if: -+ -+- You run the flowtable in software mode and you combine bridge and IP -+ forwarding in your setup. -+- Hardware offload is enabled. -+ - More reading - ------------ - diff --git a/target/linux/generic/backport-5.10/610-v5.13-35-net-ethernet-mediatek-ppe-fix-busy-wait-loop.patch b/target/linux/generic/backport-5.10/610-v5.13-35-net-ethernet-mediatek-ppe-fix-busy-wait-loop.patch deleted file mode 100644 index 66cd053cd1..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-35-net-ethernet-mediatek-ppe-fix-busy-wait-loop.patch +++ /dev/null @@ -1,72 +0,0 @@ -From c5d66587b8900201e1530b7c18d41e87bd5812f4 Mon Sep 17 00:00:00 2001 -From: Ilya Lipnitskiy -Date: Thu, 15 Apr 2021 17:37:48 -0700 -Subject: [PATCH] net: ethernet: mediatek: ppe: fix busy wait loop - -The intention is for the loop to timeout if the body does not succeed. -The current logic calls time_is_before_jiffies(timeout) which is false -until after the timeout, so the loop body never executes. - -Fix by using readl_poll_timeout as a more standard and less error-prone -solution. - -Fixes: ba37b7caf1ed ("net: ethernet: mtk_eth_soc: add support for initializing the PPE") -Signed-off-by: Ilya Lipnitskiy -Cc: Felix Fietkau -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_ppe.c | 20 +++++++++----------- - drivers/net/ethernet/mediatek/mtk_ppe.h | 1 + - 2 files changed, 10 insertions(+), 11 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_ppe.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c -@@ -2,9 +2,8 @@ - /* Copyright (C) 2020 Felix Fietkau */ - - #include --#include --#include - #include -+#include - #include - #include - #include "mtk_ppe.h" -@@ -44,18 +43,17 @@ static u32 ppe_clear(struct mtk_ppe *ppe - - static int mtk_ppe_wait_busy(struct mtk_ppe *ppe) - { -- unsigned long timeout = jiffies + HZ; -- -- while (time_is_before_jiffies(timeout)) { -- if (!(ppe_r32(ppe, MTK_PPE_GLO_CFG) & MTK_PPE_GLO_CFG_BUSY)) -- return 0; -+ int ret; -+ u32 val; - -- usleep_range(10, 20); -- } -+ ret = readl_poll_timeout(ppe->base + MTK_PPE_GLO_CFG, val, -+ !(val & MTK_PPE_GLO_CFG_BUSY), -+ 20, MTK_PPE_WAIT_TIMEOUT_US); - -- dev_err(ppe->dev, "PPE table busy"); -+ if (ret) -+ dev_err(ppe->dev, "PPE table busy"); - -- return -ETIMEDOUT; -+ return ret; - } - - static void mtk_ppe_cache_clear(struct mtk_ppe *ppe) ---- a/drivers/net/ethernet/mediatek/mtk_ppe.h -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h -@@ -12,6 +12,7 @@ - #define MTK_PPE_ENTRIES_SHIFT 3 - #define MTK_PPE_ENTRIES (1024 << MTK_PPE_ENTRIES_SHIFT) - #define MTK_PPE_HASH_MASK (MTK_PPE_ENTRIES - 1) -+#define MTK_PPE_WAIT_TIMEOUT_US 1000000 - - #define MTK_FOE_IB1_UNBIND_TIMESTAMP GENMASK(7, 0) - #define MTK_FOE_IB1_UNBIND_PACKETS GENMASK(23, 8) diff --git a/target/linux/generic/backport-5.10/610-v5.13-36-net-ethernet-mediatek-fix-a-typo-bug-in-flow-offload.patch b/target/linux/generic/backport-5.10/610-v5.13-36-net-ethernet-mediatek-fix-a-typo-bug-in-flow-offload.patch deleted file mode 100644 index de376bf78d..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-36-net-ethernet-mediatek-fix-a-typo-bug-in-flow-offload.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 6ecaf81d4ac6365f9284f9d68d74f7c209e74f98 Mon Sep 17 00:00:00 2001 -From: DENG Qingfang -Date: Sat, 17 Apr 2021 15:29:04 +0800 -Subject: [PATCH] net: ethernet: mediatek: fix a typo bug in flow offloading - -Issue was traffic problems after a while with increased ping times if -flow offload is active. It turns out that key_offset with cookie is -needed in rhashtable_params but was re-assigned to head_offset. -Fix the assignment. - -Fixes: 502e84e2382d ("net: ethernet: mtk_eth_soc: add flow offloading support") -Signed-off-by: DENG Qingfang -Tested-by: Frank Wunderlich -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_ppe_offload.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -44,7 +44,7 @@ struct mtk_flow_entry { - - static const struct rhashtable_params mtk_flow_ht_params = { - .head_offset = offsetof(struct mtk_flow_entry, node), -- .head_offset = offsetof(struct mtk_flow_entry, cookie), -+ .key_offset = offsetof(struct mtk_flow_entry, cookie), - .key_len = sizeof(unsigned long), - .automatic_shrinking = true, - }; diff --git a/target/linux/generic/backport-5.10/610-v5.13-38-net-ethernet-mtk_eth_soc-unmap-RX-data-before-callin.patch b/target/linux/generic/backport-5.10/610-v5.13-38-net-ethernet-mtk_eth_soc-unmap-RX-data-before-callin.patch deleted file mode 100644 index 908ec7998b..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-38-net-ethernet-mtk_eth_soc-unmap-RX-data-before-callin.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 5196c417854942e218a59ec87bf7d414b3bd581e Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Thu, 22 Apr 2021 22:20:55 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: unmap RX data before calling - build_skb - -Since build_skb accesses the data area (for initializing shinfo), dma unmap -needs to happen before that call - -Signed-off-by: Felix Fietkau -[Ilya: split build_skb cleanup fix into a separate commit] -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1334,6 +1334,9 @@ static int mtk_poll_rx(struct napi_struc - goto release_desc; - } - -+ dma_unmap_single(eth->dev, trxd.rxd1, -+ ring->buf_size, DMA_FROM_DEVICE); -+ - /* receive data */ - skb = build_skb(data, ring->frag_size); - if (unlikely(!skb)) { -@@ -1343,8 +1346,6 @@ static int mtk_poll_rx(struct napi_struc - } - skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN); - -- dma_unmap_single(eth->dev, trxd.rxd1, -- ring->buf_size, DMA_FROM_DEVICE); - pktlen = RX_DMA_GET_PLEN0(trxd.rxd2); - skb->dev = netdev; - skb_put(skb, pktlen); diff --git a/target/linux/generic/backport-5.10/610-v5.13-39-net-ethernet-mtk_eth_soc-fix-build_skb-cleanup.patch b/target/linux/generic/backport-5.10/610-v5.13-39-net-ethernet-mtk_eth_soc-fix-build_skb-cleanup.patch deleted file mode 100644 index 4284e951ce..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-39-net-ethernet-mtk_eth_soc-fix-build_skb-cleanup.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 787082ab9f7be4711e52f67c388535eda74a1269 Mon Sep 17 00:00:00 2001 -From: Ilya Lipnitskiy -Date: Thu, 22 Apr 2021 22:20:56 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: fix build_skb cleanup - -In case build_skb fails, call skb_free_frag on the correct pointer. Also -update the DMA structures with the new mapping before exiting, because -the mapping was successful - -Suggested-by: Felix Fietkau -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1340,9 +1340,9 @@ static int mtk_poll_rx(struct napi_struc - /* receive data */ - skb = build_skb(data, ring->frag_size); - if (unlikely(!skb)) { -- skb_free_frag(new_data); -+ skb_free_frag(data); - netdev->stats.rx_dropped++; -- goto release_desc; -+ goto skip_rx; - } - skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN); - -@@ -1362,6 +1362,7 @@ static int mtk_poll_rx(struct napi_struc - skb_record_rx_queue(skb, 0); - napi_gro_receive(napi, skb); - -+skip_rx: - ring->data[idx] = new_data; - rxd->rxd1 = (unsigned int)dma_addr; - diff --git a/target/linux/generic/backport-5.10/610-v5.13-40-net-ethernet-mtk_eth_soc-use-napi_consume_skb.patch b/target/linux/generic/backport-5.10/610-v5.13-40-net-ethernet-mtk_eth_soc-use-napi_consume_skb.patch deleted file mode 100644 index a69f8830c5..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-40-net-ethernet-mtk_eth_soc-use-napi_consume_skb.patch +++ /dev/null @@ -1,77 +0,0 @@ -From c30c4a82739090a2de4a4e3f245355ea4fb3ec14 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Thu, 22 Apr 2021 22:20:57 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: use napi_consume_skb - -Should improve performance, since it can use bulk free - -Signed-off-by: Felix Fietkau -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 19 ++++++++++++------- - 1 file changed, 12 insertions(+), 7 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -891,7 +891,8 @@ static int txd_to_idx(struct mtk_tx_ring - return ((void *)dma - (void *)ring->dma) / sizeof(*dma); - } - --static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf) -+static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf, -+ bool napi) - { - if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { - if (tx_buf->flags & MTK_TX_FLAGS_SINGLE0) { -@@ -923,8 +924,12 @@ static void mtk_tx_unmap(struct mtk_eth - - tx_buf->flags = 0; - if (tx_buf->skb && -- (tx_buf->skb != (struct sk_buff *)MTK_DMA_DUMMY_DESC)) -- dev_kfree_skb_any(tx_buf->skb); -+ (tx_buf->skb != (struct sk_buff *)MTK_DMA_DUMMY_DESC)) { -+ if (napi) -+ napi_consume_skb(tx_buf->skb, napi); -+ else -+ dev_kfree_skb_any(tx_buf->skb); -+ } - tx_buf->skb = NULL; - } - -@@ -1102,7 +1107,7 @@ err_dma: - tx_buf = mtk_desc_to_tx_buf(ring, itxd); - - /* unmap dma */ -- mtk_tx_unmap(eth, tx_buf); -+ mtk_tx_unmap(eth, tx_buf, false); - - itxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; - if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) -@@ -1424,7 +1429,7 @@ static int mtk_poll_tx_qdma(struct mtk_e - done[mac]++; - budget--; - } -- mtk_tx_unmap(eth, tx_buf); -+ mtk_tx_unmap(eth, tx_buf, true); - - ring->last_free = desc; - atomic_inc(&ring->free_count); -@@ -1461,7 +1466,7 @@ static int mtk_poll_tx_pdma(struct mtk_e - budget--; - } - -- mtk_tx_unmap(eth, tx_buf); -+ mtk_tx_unmap(eth, tx_buf, true); - - desc = &ring->dma[cpu]; - ring->last_free = desc; -@@ -1663,7 +1668,7 @@ static void mtk_tx_clean(struct mtk_eth - - if (ring->buf) { - for (i = 0; i < MTK_DMA_SIZE; i++) -- mtk_tx_unmap(eth, &ring->buf[i]); -+ mtk_tx_unmap(eth, &ring->buf[i], false); - kfree(ring->buf); - ring->buf = NULL; - } diff --git a/target/linux/generic/backport-5.10/610-v5.13-41-net-ethernet-mtk_eth_soc-reduce-MDIO-bus-access-late.patch b/target/linux/generic/backport-5.10/610-v5.13-41-net-ethernet-mtk_eth_soc-reduce-MDIO-bus-access-late.patch deleted file mode 100644 index 7ebc3fa903..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-41-net-ethernet-mtk_eth_soc-reduce-MDIO-bus-access-late.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 3630d519d7c3eab92567658690e44ffe0517d109 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Thu, 22 Apr 2021 22:20:58 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: reduce MDIO bus access latency - -usleep_range often ends up sleeping much longer than the 10-20us provided -as a range here. This causes significant latency in mdio bus acceses, -which easily adds multiple seconds to the boot time on MT7621 when polling -DSA slave ports. -Use cond_resched instead of usleep_range, since the MDIO access does not -take much time - -Signed-off-by: Felix Fietkau -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -86,7 +86,7 @@ static int mtk_mdio_busy_wait(struct mtk - return 0; - if (time_after(jiffies, t_start + PHY_IAC_TIMEOUT)) - break; -- usleep_range(10, 20); -+ cond_resched(); - } - - dev_err(eth->dev, "mdio: MDIO timeout\n"); diff --git a/target/linux/generic/backport-5.10/610-v5.13-42-net-ethernet-mtk_eth_soc-remove-unnecessary-TX-queue.patch b/target/linux/generic/backport-5.10/610-v5.13-42-net-ethernet-mtk_eth_soc-remove-unnecessary-TX-queue.patch deleted file mode 100644 index f08efc1b77..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-42-net-ethernet-mtk_eth_soc-remove-unnecessary-TX-queue.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 16ef670789b252b221700adc413497ed2f941d8a Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Thu, 22 Apr 2021 22:20:59 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: remove unnecessary TX queue stops - -When running short on descriptors, only stop the queue for the netdev that -tx was attempted for. By the time something tries to send on the other -netdev, the ring might have some more room already. - -Signed-off-by: Felix Fietkau -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 15 ++------------- - 1 file changed, 2 insertions(+), 13 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1164,17 +1164,6 @@ static void mtk_wake_queue(struct mtk_et - } - } - --static void mtk_stop_queue(struct mtk_eth *eth) --{ -- int i; -- -- for (i = 0; i < MTK_MAC_COUNT; i++) { -- if (!eth->netdev[i]) -- continue; -- netif_stop_queue(eth->netdev[i]); -- } --} -- - static netdev_tx_t mtk_start_xmit(struct sk_buff *skb, struct net_device *dev) - { - struct mtk_mac *mac = netdev_priv(dev); -@@ -1195,7 +1184,7 @@ static netdev_tx_t mtk_start_xmit(struct - - tx_num = mtk_cal_txd_req(skb); - if (unlikely(atomic_read(&ring->free_count) <= tx_num)) { -- mtk_stop_queue(eth); -+ netif_stop_queue(dev); - netif_err(eth, tx_queued, dev, - "Tx Ring full when queue awake!\n"); - spin_unlock(ð->page_lock); -@@ -1221,7 +1210,7 @@ static netdev_tx_t mtk_start_xmit(struct - goto drop; - - if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) -- mtk_stop_queue(eth); -+ netif_stop_queue(dev); - - spin_unlock(ð->page_lock); - diff --git a/target/linux/generic/backport-5.10/610-v5.13-43-net-ethernet-mtk_eth_soc-use-larger-burst-size-for-Q.patch b/target/linux/generic/backport-5.10/610-v5.13-43-net-ethernet-mtk_eth_soc-use-larger-burst-size-for-Q.patch deleted file mode 100644 index a8be3f4667..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-43-net-ethernet-mtk_eth_soc-use-larger-burst-size-for-Q.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 59555a8d0dd39bf60b7ca1ba5e7393d293f7398d Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Thu, 22 Apr 2021 22:21:00 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: use larger burst size for QDMA TX - -Improves tx performance - -Signed-off-by: Felix Fietkau -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +- - drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -2235,7 +2235,7 @@ static int mtk_start_dma(struct mtk_eth - if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { - mtk_w32(eth, - MTK_TX_WB_DDONE | MTK_TX_DMA_EN | -- MTK_DMA_SIZE_16DWORDS | MTK_NDP_CO_PRO | -+ MTK_TX_BT_32DWORDS | MTK_NDP_CO_PRO | - MTK_RX_DMA_EN | MTK_RX_2B_OFFSET | - MTK_RX_BT_32DWORDS, - MTK_QDMA_GLO_CFG); ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -202,7 +202,7 @@ - #define MTK_RX_BT_32DWORDS (3 << 11) - #define MTK_NDP_CO_PRO BIT(10) - #define MTK_TX_WB_DDONE BIT(6) --#define MTK_DMA_SIZE_16DWORDS (2 << 4) -+#define MTK_TX_BT_32DWORDS (3 << 4) - #define MTK_RX_DMA_BUSY BIT(3) - #define MTK_TX_DMA_BUSY BIT(1) - #define MTK_RX_DMA_EN BIT(2) diff --git a/target/linux/generic/backport-5.10/610-v5.13-44-net-ethernet-mtk_eth_soc-increase-DMA-ring-sizes.patch b/target/linux/generic/backport-5.10/610-v5.13-44-net-ethernet-mtk_eth_soc-increase-DMA-ring-sizes.patch deleted file mode 100644 index d695f0fb8a..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-44-net-ethernet-mtk_eth_soc-increase-DMA-ring-sizes.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 6b4423b258b91032c50a5efca15d3d9bb194ea1d Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Thu, 22 Apr 2021 22:21:01 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: increase DMA ring sizes - -256 descriptors is not enough for multi-gigabit traffic under load on -MT7622. Bump it to 512 to improve performance. - -Signed-off-by: Felix Fietkau -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -21,7 +21,7 @@ - #define MTK_QDMA_PAGE_SIZE 2048 - #define MTK_MAX_RX_LENGTH 1536 - #define MTK_TX_DMA_BUF_LEN 0x3fff --#define MTK_DMA_SIZE 256 -+#define MTK_DMA_SIZE 512 - #define MTK_NAPI_WEIGHT 64 - #define MTK_MAC_COUNT 2 - #define MTK_RX_ETH_HLEN (VLAN_ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN) diff --git a/target/linux/generic/backport-5.10/610-v5.13-45-net-ethernet-mtk_eth_soc-implement-dynamic-interrupt.patch b/target/linux/generic/backport-5.10/610-v5.13-45-net-ethernet-mtk_eth_soc-implement-dynamic-interrupt.patch deleted file mode 100644 index e7898bbaff..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-45-net-ethernet-mtk_eth_soc-implement-dynamic-interrupt.patch +++ /dev/null @@ -1,313 +0,0 @@ -From e9229ffd550b2d8c4997c67a501dbc3919fd4e26 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Thu, 22 Apr 2021 22:21:02 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: implement dynamic interrupt - moderation - -Reduces the number of interrupts under load - -Signed-off-by: Felix Fietkau -[Ilya: add documentation for new struct fields] -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/Kconfig | 1 + - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 96 +++++++++++++++++++-- - drivers/net/ethernet/mediatek/mtk_eth_soc.h | 41 +++++++-- - 3 files changed, 124 insertions(+), 14 deletions(-) - ---- a/drivers/net/ethernet/mediatek/Kconfig -+++ b/drivers/net/ethernet/mediatek/Kconfig -@@ -10,6 +10,7 @@ if NET_VENDOR_MEDIATEK - config NET_MEDIATEK_SOC - tristate "MediaTek SoC Gigabit Ethernet support" - select PHYLINK -+ select DIMLIB - help - This driver supports the gigabit ethernet MACs in the - MediaTek SoC family. ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1266,12 +1266,13 @@ static void mtk_update_rx_cpu_idx(struct - static int mtk_poll_rx(struct napi_struct *napi, int budget, - struct mtk_eth *eth) - { -+ struct dim_sample dim_sample = {}; - struct mtk_rx_ring *ring; - int idx; - struct sk_buff *skb; - u8 *data, *new_data; - struct mtk_rx_dma *rxd, trxd; -- int done = 0; -+ int done = 0, bytes = 0; - - while (done < budget) { - struct net_device *netdev; -@@ -1348,6 +1349,7 @@ static int mtk_poll_rx(struct napi_struc - else - skb_checksum_none_assert(skb); - skb->protocol = eth_type_trans(skb, netdev); -+ bytes += pktlen; - - if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX && - (trxd.rxd2 & RX_DMA_VTAG)) -@@ -1380,6 +1382,12 @@ rx_done: - mtk_update_rx_cpu_idx(eth); - } - -+ eth->rx_packets += done; -+ eth->rx_bytes += bytes; -+ dim_update_sample(eth->rx_events, eth->rx_packets, eth->rx_bytes, -+ &dim_sample); -+ net_dim(ð->rx_dim, dim_sample); -+ - return done; - } - -@@ -1472,6 +1480,7 @@ static int mtk_poll_tx_pdma(struct mtk_e - static int mtk_poll_tx(struct mtk_eth *eth, int budget) - { - struct mtk_tx_ring *ring = ð->tx_ring; -+ struct dim_sample dim_sample = {}; - unsigned int done[MTK_MAX_DEVS]; - unsigned int bytes[MTK_MAX_DEVS]; - int total = 0, i; -@@ -1489,8 +1498,14 @@ static int mtk_poll_tx(struct mtk_eth *e - continue; - netdev_completed_queue(eth->netdev[i], done[i], bytes[i]); - total += done[i]; -+ eth->tx_packets += done[i]; -+ eth->tx_bytes += bytes[i]; - } - -+ dim_update_sample(eth->tx_events, eth->tx_packets, eth->tx_bytes, -+ &dim_sample); -+ net_dim(ð->tx_dim, dim_sample); -+ - if (mtk_queue_stopped(eth) && - (atomic_read(&ring->free_count) > ring->thresh)) - mtk_wake_queue(eth); -@@ -2171,6 +2186,7 @@ static irqreturn_t mtk_handle_irq_rx(int - { - struct mtk_eth *eth = _eth; - -+ eth->rx_events++; - if (likely(napi_schedule_prep(ð->rx_napi))) { - __napi_schedule(ð->rx_napi); - mtk_rx_irq_disable(eth, MTK_RX_DONE_INT); -@@ -2183,6 +2199,7 @@ static irqreturn_t mtk_handle_irq_tx(int - { - struct mtk_eth *eth = _eth; - -+ eth->tx_events++; - if (likely(napi_schedule_prep(ð->tx_napi))) { - __napi_schedule(ð->tx_napi); - mtk_tx_irq_disable(eth, MTK_TX_DONE_INT); -@@ -2371,6 +2388,9 @@ static int mtk_stop(struct net_device *d - napi_disable(ð->tx_napi); - napi_disable(ð->rx_napi); - -+ cancel_work_sync(ð->rx_dim.work); -+ cancel_work_sync(ð->tx_dim.work); -+ - if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) - mtk_stop_dma(eth, MTK_QDMA_GLO_CFG); - mtk_stop_dma(eth, MTK_PDMA_GLO_CFG); -@@ -2423,6 +2443,64 @@ err_disable_clks: - return ret; - } - -+static void mtk_dim_rx(struct work_struct *work) -+{ -+ struct dim *dim = container_of(work, struct dim, work); -+ struct mtk_eth *eth = container_of(dim, struct mtk_eth, rx_dim); -+ struct dim_cq_moder cur_profile; -+ u32 val, cur; -+ -+ cur_profile = net_dim_get_rx_moderation(eth->rx_dim.mode, -+ dim->profile_ix); -+ spin_lock_bh(ð->dim_lock); -+ -+ val = mtk_r32(eth, MTK_PDMA_DELAY_INT); -+ val &= MTK_PDMA_DELAY_TX_MASK; -+ val |= MTK_PDMA_DELAY_RX_EN; -+ -+ cur = min_t(u32, DIV_ROUND_UP(cur_profile.usec, 20), MTK_PDMA_DELAY_PTIME_MASK); -+ val |= cur << MTK_PDMA_DELAY_RX_PTIME_SHIFT; -+ -+ cur = min_t(u32, cur_profile.pkts, MTK_PDMA_DELAY_PINT_MASK); -+ val |= cur << MTK_PDMA_DELAY_RX_PINT_SHIFT; -+ -+ mtk_w32(eth, val, MTK_PDMA_DELAY_INT); -+ mtk_w32(eth, val, MTK_QDMA_DELAY_INT); -+ -+ spin_unlock_bh(ð->dim_lock); -+ -+ dim->state = DIM_START_MEASURE; -+} -+ -+static void mtk_dim_tx(struct work_struct *work) -+{ -+ struct dim *dim = container_of(work, struct dim, work); -+ struct mtk_eth *eth = container_of(dim, struct mtk_eth, tx_dim); -+ struct dim_cq_moder cur_profile; -+ u32 val, cur; -+ -+ cur_profile = net_dim_get_tx_moderation(eth->tx_dim.mode, -+ dim->profile_ix); -+ spin_lock_bh(ð->dim_lock); -+ -+ val = mtk_r32(eth, MTK_PDMA_DELAY_INT); -+ val &= MTK_PDMA_DELAY_RX_MASK; -+ val |= MTK_PDMA_DELAY_TX_EN; -+ -+ cur = min_t(u32, DIV_ROUND_UP(cur_profile.usec, 20), MTK_PDMA_DELAY_PTIME_MASK); -+ val |= cur << MTK_PDMA_DELAY_TX_PTIME_SHIFT; -+ -+ cur = min_t(u32, cur_profile.pkts, MTK_PDMA_DELAY_PINT_MASK); -+ val |= cur << MTK_PDMA_DELAY_TX_PINT_SHIFT; -+ -+ mtk_w32(eth, val, MTK_PDMA_DELAY_INT); -+ mtk_w32(eth, val, MTK_QDMA_DELAY_INT); -+ -+ spin_unlock_bh(ð->dim_lock); -+ -+ dim->state = DIM_START_MEASURE; -+} -+ - static int mtk_hw_init(struct mtk_eth *eth) - { - int i, val, ret; -@@ -2444,9 +2522,6 @@ static int mtk_hw_init(struct mtk_eth *e - goto err_disable_pm; - } - -- /* enable interrupt delay for RX */ -- mtk_w32(eth, MTK_PDMA_DELAY_RX_DELAY, MTK_PDMA_DELAY_INT); -- - /* disable delay and normal interrupt */ - mtk_tx_irq_disable(eth, ~0); - mtk_rx_irq_disable(eth, ~0); -@@ -2485,11 +2560,11 @@ static int mtk_hw_init(struct mtk_eth *e - /* Enable RX VLan Offloading */ - mtk_w32(eth, 1, MTK_CDMP_EG_CTRL); - -- /* enable interrupt delay for RX */ -- mtk_w32(eth, MTK_PDMA_DELAY_RX_DELAY, MTK_PDMA_DELAY_INT); -+ /* set interrupt delays based on current Net DIM sample */ -+ mtk_dim_rx(ð->rx_dim.work); -+ mtk_dim_tx(ð->tx_dim.work); - - /* disable delay and normal interrupt */ -- mtk_w32(eth, 0, MTK_QDMA_DELAY_INT); - mtk_tx_irq_disable(eth, ~0); - mtk_rx_irq_disable(eth, ~0); - -@@ -2994,6 +3069,13 @@ static int mtk_probe(struct platform_dev - spin_lock_init(ð->page_lock); - spin_lock_init(ð->tx_irq_lock); - spin_lock_init(ð->rx_irq_lock); -+ spin_lock_init(ð->dim_lock); -+ -+ eth->rx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE; -+ INIT_WORK(ð->rx_dim.work, mtk_dim_rx); -+ -+ eth->tx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE; -+ INIT_WORK(ð->tx_dim.work, mtk_dim_tx); - - if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) { - eth->ethsys = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -16,6 +16,7 @@ - #include - #include - #include -+#include - #include "mtk_ppe.h" - - #define MTK_QDMA_PAGE_SIZE 2048 -@@ -136,13 +137,18 @@ - - /* PDMA Delay Interrupt Register */ - #define MTK_PDMA_DELAY_INT 0xa0c -+#define MTK_PDMA_DELAY_RX_MASK GENMASK(15, 0) - #define MTK_PDMA_DELAY_RX_EN BIT(15) --#define MTK_PDMA_DELAY_RX_PINT 4 - #define MTK_PDMA_DELAY_RX_PINT_SHIFT 8 --#define MTK_PDMA_DELAY_RX_PTIME 4 --#define MTK_PDMA_DELAY_RX_DELAY \ -- (MTK_PDMA_DELAY_RX_EN | MTK_PDMA_DELAY_RX_PTIME | \ -- (MTK_PDMA_DELAY_RX_PINT << MTK_PDMA_DELAY_RX_PINT_SHIFT)) -+#define MTK_PDMA_DELAY_RX_PTIME_SHIFT 0 -+ -+#define MTK_PDMA_DELAY_TX_MASK GENMASK(31, 16) -+#define MTK_PDMA_DELAY_TX_EN BIT(31) -+#define MTK_PDMA_DELAY_TX_PINT_SHIFT 24 -+#define MTK_PDMA_DELAY_TX_PTIME_SHIFT 16 -+ -+#define MTK_PDMA_DELAY_PINT_MASK 0x7f -+#define MTK_PDMA_DELAY_PTIME_MASK 0xff - - /* PDMA Interrupt Status Register */ - #define MTK_PDMA_INT_STATUS 0xa20 -@@ -224,6 +230,7 @@ - /* QDMA Interrupt Status Register */ - #define MTK_QDMA_INT_STATUS 0x1A18 - #define MTK_RX_DONE_DLY BIT(30) -+#define MTK_TX_DONE_DLY BIT(28) - #define MTK_RX_DONE_INT3 BIT(19) - #define MTK_RX_DONE_INT2 BIT(18) - #define MTK_RX_DONE_INT1 BIT(17) -@@ -233,8 +240,7 @@ - #define MTK_TX_DONE_INT1 BIT(1) - #define MTK_TX_DONE_INT0 BIT(0) - #define MTK_RX_DONE_INT MTK_RX_DONE_DLY --#define MTK_TX_DONE_INT (MTK_TX_DONE_INT0 | MTK_TX_DONE_INT1 | \ -- MTK_TX_DONE_INT2 | MTK_TX_DONE_INT3) -+#define MTK_TX_DONE_INT MTK_TX_DONE_DLY - - /* QDMA Interrupt grouping registers */ - #define MTK_QDMA_INT_GRP1 0x1a20 -@@ -864,6 +870,7 @@ struct mtk_sgmii { - * @page_lock: Make sure that register operations are atomic - * @tx_irq__lock: Make sure that IRQ register operations are atomic - * @rx_irq__lock: Make sure that IRQ register operations are atomic -+ * @dim_lock: Make sure that Net DIM operations are atomic - * @dummy_dev: we run 2 netdevs on 1 physical DMA ring and need a - * dummy for NAPI to work - * @netdev: The netdev instances -@@ -882,6 +889,14 @@ struct mtk_sgmii { - * @rx_ring_qdma: Pointer to the memory holding info about the QDMA RX ring - * @tx_napi: The TX NAPI struct - * @rx_napi: The RX NAPI struct -+ * @rx_events: Net DIM RX event counter -+ * @rx_packets: Net DIM RX packet counter -+ * @rx_bytes: Net DIM RX byte counter -+ * @rx_dim: Net DIM RX context -+ * @tx_events: Net DIM TX event counter -+ * @tx_packets: Net DIM TX packet counter -+ * @tx_bytes: Net DIM TX byte counter -+ * @tx_dim: Net DIM TX context - * @scratch_ring: Newer SoCs need memory for a second HW managed TX ring - * @phy_scratch_ring: physical address of scratch_ring - * @scratch_head: The scratch memory that scratch_ring points to. -@@ -926,6 +941,18 @@ struct mtk_eth { - - const struct mtk_soc_data *soc; - -+ spinlock_t dim_lock; -+ -+ u32 rx_events; -+ u32 rx_packets; -+ u32 rx_bytes; -+ struct dim rx_dim; -+ -+ u32 tx_events; -+ u32 tx_packets; -+ u32 tx_bytes; -+ struct dim tx_dim; -+ - u32 tx_int_mask_reg; - u32 tx_int_status_reg; - u32 rx_dma_l4_valid; diff --git a/target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch b/target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch deleted file mode 100644 index 69f8536f0a..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 4e6bf609569c59b6bd6acf4a607c096cbd820d79 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Thu, 22 Apr 2021 22:21:03 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: cache HW pointer of last freed TX - descriptor - -The value is only updated by the CPU, so it is cheaper to access from the -ring data structure than from a hardware register. - -Signed-off-by: Felix Fietkau -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 8 ++++---- - drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 ++ - 2 files changed, 6 insertions(+), 4 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1400,7 +1400,7 @@ static int mtk_poll_tx_qdma(struct mtk_e - struct mtk_tx_buf *tx_buf; - u32 cpu, dma; - -- cpu = mtk_r32(eth, MTK_QTX_CRX_PTR); -+ cpu = ring->last_free_ptr; - dma = mtk_r32(eth, MTK_QTX_DRX_PTR); - - desc = mtk_qdma_phys_to_virt(ring, cpu); -@@ -1434,6 +1434,7 @@ static int mtk_poll_tx_qdma(struct mtk_e - cpu = next_cpu; - } - -+ ring->last_free_ptr = cpu; - mtk_w32(eth, cpu, MTK_QTX_CRX_PTR); - - return budget; -@@ -1634,6 +1635,7 @@ static int mtk_tx_alloc(struct mtk_eth * - atomic_set(&ring->free_count, MTK_DMA_SIZE - 2); - ring->next_free = &ring->dma[0]; - ring->last_free = &ring->dma[MTK_DMA_SIZE - 1]; -+ ring->last_free_ptr = (u32)(ring->phys + ((MTK_DMA_SIZE - 1) * sz)); - ring->thresh = MAX_SKB_FRAGS; - - /* make sure that all changes to the dma ring are flushed before we -@@ -1647,9 +1649,7 @@ static int mtk_tx_alloc(struct mtk_eth * - mtk_w32(eth, - ring->phys + ((MTK_DMA_SIZE - 1) * sz), - MTK_QTX_CRX_PTR); -- mtk_w32(eth, -- ring->phys + ((MTK_DMA_SIZE - 1) * sz), -- MTK_QTX_DRX_PTR); -+ mtk_w32(eth, ring->last_free_ptr, MTK_QTX_DRX_PTR); - mtk_w32(eth, (QDMA_RES_THRES << 8) | QDMA_RES_THRES, - MTK_QTX_CFG(0)); - } else { ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -657,6 +657,7 @@ struct mtk_tx_buf { - * @phys: The physical addr of tx_buf - * @next_free: Pointer to the next free descriptor - * @last_free: Pointer to the last free descriptor -+ * @last_free_ptr: Hardware pointer value of the last free descriptor - * @thresh: The threshold of minimum amount of free descriptors - * @free_count: QDMA uses a linked list. Track how many free descriptors - * are present -@@ -667,6 +668,7 @@ struct mtk_tx_ring { - dma_addr_t phys; - struct mtk_tx_dma *next_free; - struct mtk_tx_dma *last_free; -+ u32 last_free_ptr; - u16 thresh; - atomic_t free_count; - int dma_size; diff --git a/target/linux/generic/backport-5.10/610-v5.13-47-net-ethernet-mtk_eth_soc-only-read-the-full-RX-descr.patch b/target/linux/generic/backport-5.10/610-v5.13-47-net-ethernet-mtk_eth_soc-only-read-the-full-RX-descr.patch deleted file mode 100644 index 6484361ee5..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-47-net-ethernet-mtk_eth_soc-only-read-the-full-RX-descr.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 816ac3e6e67bdd78d86226c6eb53619780750e92 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Thu, 22 Apr 2021 22:21:04 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: only read the full RX descriptor - if DMA is done - -Uncached memory access is expensive, and there is no need to access all -descriptor words if we can't process them anyway - -Signed-off-by: Felix Fietkau -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -799,13 +799,18 @@ static inline int mtk_max_buf_size(int f - return buf_size; - } - --static inline void mtk_rx_get_desc(struct mtk_rx_dma *rxd, -+static inline bool mtk_rx_get_desc(struct mtk_rx_dma *rxd, - struct mtk_rx_dma *dma_rxd) - { -- rxd->rxd1 = READ_ONCE(dma_rxd->rxd1); - rxd->rxd2 = READ_ONCE(dma_rxd->rxd2); -+ if (!(rxd->rxd2 & RX_DMA_DONE)) -+ return false; -+ -+ rxd->rxd1 = READ_ONCE(dma_rxd->rxd1); - rxd->rxd3 = READ_ONCE(dma_rxd->rxd3); - rxd->rxd4 = READ_ONCE(dma_rxd->rxd4); -+ -+ return true; - } - - static void *mtk_max_lro_buf_alloc(gfp_t gfp_mask) -@@ -1288,8 +1293,7 @@ static int mtk_poll_rx(struct napi_struc - rxd = &ring->dma[idx]; - data = ring->data[idx]; - -- mtk_rx_get_desc(&trxd, rxd); -- if (!(trxd.rxd2 & RX_DMA_DONE)) -+ if (!mtk_rx_get_desc(&trxd, rxd)) - break; - - /* find out which mac the packet come from. values start at 1 */ diff --git a/target/linux/generic/backport-5.10/610-v5.13-48-net-ethernet-mtk_eth_soc-reduce-unnecessary-interrup.patch b/target/linux/generic/backport-5.10/610-v5.13-48-net-ethernet-mtk_eth_soc-reduce-unnecessary-interrup.patch deleted file mode 100644 index 27c04ae3c4..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-48-net-ethernet-mtk_eth_soc-reduce-unnecessary-interrup.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 16769a8923fad5a5377253bcd76b0e0d64976c73 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Thu, 22 Apr 2021 22:21:05 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: reduce unnecessary interrupts - -Avoid rearming interrupt if napi_complete returns false - -Signed-off-by: Felix Fietkau -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 9 +++++---- - 1 file changed, 5 insertions(+), 4 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1555,8 +1555,8 @@ static int mtk_napi_tx(struct napi_struc - if (status & MTK_TX_DONE_INT) - return budget; - -- napi_complete(napi); -- mtk_tx_irq_enable(eth, MTK_TX_DONE_INT); -+ if (napi_complete(napi)) -+ mtk_tx_irq_enable(eth, MTK_TX_DONE_INT); - - return tx_done; - } -@@ -1589,8 +1589,9 @@ poll_again: - remain_budget -= rx_done; - goto poll_again; - } -- napi_complete(napi); -- mtk_rx_irq_enable(eth, MTK_RX_DONE_INT); -+ -+ if (napi_complete(napi)) -+ mtk_rx_irq_enable(eth, MTK_RX_DONE_INT); - - return rx_done + budget - remain_budget; - } diff --git a/target/linux/generic/backport-5.10/610-v5.13-49-net-ethernet-mtk_eth_soc-rework-NAPI-callbacks.patch b/target/linux/generic/backport-5.10/610-v5.13-49-net-ethernet-mtk_eth_soc-rework-NAPI-callbacks.patch deleted file mode 100644 index 21a3e9bef0..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-49-net-ethernet-mtk_eth_soc-rework-NAPI-callbacks.patch +++ /dev/null @@ -1,110 +0,0 @@ -From db2c7b353db3b3f71b55f9ff4627d8a786446fbe Mon Sep 17 00:00:00 2001 -From: Ilya Lipnitskiy -Date: Thu, 22 Apr 2021 22:21:06 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: rework NAPI callbacks - -Use napi_complete_done to communicate total TX and RX work done to NAPI. -Count total RX work up instead of remaining work down for clarity. -Remove unneeded local variables for clarity. Use do {} while instead of -goto for clarity. - -Suggested-by: Jakub Kicinski -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 54 +++++++++------------ - 1 file changed, 24 insertions(+), 30 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1532,7 +1532,6 @@ static void mtk_handle_status_irq(struct - static int mtk_napi_tx(struct napi_struct *napi, int budget) - { - struct mtk_eth *eth = container_of(napi, struct mtk_eth, tx_napi); -- u32 status, mask; - int tx_done = 0; - - if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) -@@ -1541,21 +1540,19 @@ static int mtk_napi_tx(struct napi_struc - tx_done = mtk_poll_tx(eth, budget); - - if (unlikely(netif_msg_intr(eth))) { -- status = mtk_r32(eth, eth->tx_int_status_reg); -- mask = mtk_r32(eth, eth->tx_int_mask_reg); - dev_info(eth->dev, -- "done tx %d, intr 0x%08x/0x%x\n", -- tx_done, status, mask); -+ "done tx %d, intr 0x%08x/0x%x\n", tx_done, -+ mtk_r32(eth, eth->tx_int_status_reg), -+ mtk_r32(eth, eth->tx_int_mask_reg)); - } - - if (tx_done == budget) - return budget; - -- status = mtk_r32(eth, eth->tx_int_status_reg); -- if (status & MTK_TX_DONE_INT) -+ if (mtk_r32(eth, eth->tx_int_status_reg) & MTK_TX_DONE_INT) - return budget; - -- if (napi_complete(napi)) -+ if (napi_complete_done(napi, tx_done)) - mtk_tx_irq_enable(eth, MTK_TX_DONE_INT); - - return tx_done; -@@ -1564,36 +1561,33 @@ static int mtk_napi_tx(struct napi_struc - static int mtk_napi_rx(struct napi_struct *napi, int budget) - { - struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi); -- u32 status, mask; -- int rx_done = 0; -- int remain_budget = budget; -+ int rx_done_total = 0; - - mtk_handle_status_irq(eth); - --poll_again: -- mtk_w32(eth, MTK_RX_DONE_INT, MTK_PDMA_INT_STATUS); -- rx_done = mtk_poll_rx(napi, remain_budget, eth); -+ do { -+ int rx_done; - -- if (unlikely(netif_msg_intr(eth))) { -- status = mtk_r32(eth, MTK_PDMA_INT_STATUS); -- mask = mtk_r32(eth, MTK_PDMA_INT_MASK); -- dev_info(eth->dev, -- "done rx %d, intr 0x%08x/0x%x\n", -- rx_done, status, mask); -- } -- if (rx_done == remain_budget) -- return budget; -+ mtk_w32(eth, MTK_RX_DONE_INT, MTK_PDMA_INT_STATUS); -+ rx_done = mtk_poll_rx(napi, budget - rx_done_total, eth); -+ rx_done_total += rx_done; -+ -+ if (unlikely(netif_msg_intr(eth))) { -+ dev_info(eth->dev, -+ "done rx %d, intr 0x%08x/0x%x\n", rx_done, -+ mtk_r32(eth, MTK_PDMA_INT_STATUS), -+ mtk_r32(eth, MTK_PDMA_INT_MASK)); -+ } - -- status = mtk_r32(eth, MTK_PDMA_INT_STATUS); -- if (status & MTK_RX_DONE_INT) { -- remain_budget -= rx_done; -- goto poll_again; -- } -+ if (rx_done_total == budget) -+ return budget; -+ -+ } while (mtk_r32(eth, MTK_PDMA_INT_STATUS) & MTK_RX_DONE_INT); - -- if (napi_complete(napi)) -+ if (napi_complete_done(napi, rx_done_total)) - mtk_rx_irq_enable(eth, MTK_RX_DONE_INT); - -- return rx_done + budget - remain_budget; -+ return rx_done_total; - } - - static int mtk_tx_alloc(struct mtk_eth *eth) diff --git a/target/linux/generic/backport-5.10/610-v5.13-50-net-ethernet-mtk_eth_soc-set-PPE-flow-hash-as-skb-ha.patch b/target/linux/generic/backport-5.10/610-v5.13-50-net-ethernet-mtk_eth_soc-set-PPE-flow-hash-as-skb-ha.patch deleted file mode 100644 index aad129b897..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-50-net-ethernet-mtk_eth_soc-set-PPE-flow-hash-as-skb-ha.patch +++ /dev/null @@ -1,47 +0,0 @@ -From fa817272c37ef78e25dc14e4760ac78a7043a18a Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Thu, 22 Apr 2021 22:21:07 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: set PPE flow hash as skb hash if - present - -This improves GRO performance - -Signed-off-by: Felix Fietkau -[Ilya: Use MTK_RXD4_FOE_ENTRY instead of GENMASK(13, 0)] -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -19,6 +19,7 @@ - #include - #include - #include -+#include - #include - - #include "mtk_eth_soc.h" -@@ -1283,6 +1284,7 @@ static int mtk_poll_rx(struct napi_struc - struct net_device *netdev; - unsigned int pktlen; - dma_addr_t dma_addr; -+ u32 hash; - int mac; - - ring = mtk_get_rx_ring(eth); -@@ -1355,6 +1357,12 @@ static int mtk_poll_rx(struct napi_struc - skb->protocol = eth_type_trans(skb, netdev); - bytes += pktlen; - -+ hash = trxd.rxd4 & MTK_RXD4_FOE_ENTRY; -+ if (hash != MTK_RXD4_FOE_ENTRY) { -+ hash = jhash_1word(hash, 0); -+ skb_set_hash(skb, hash, PKT_HASH_TYPE_L4); -+ } -+ - if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX && - (trxd.rxd2 & RX_DMA_VTAG)) - __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), diff --git a/target/linux/generic/backport-5.10/610-v5.13-51-net-ethernet-mtk_eth_soc-use-iopoll.h-macro-for-DMA-.patch b/target/linux/generic/backport-5.10/610-v5.13-51-net-ethernet-mtk_eth_soc-use-iopoll.h-macro-for-DMA-.patch deleted file mode 100644 index 493883f4f1..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-51-net-ethernet-mtk_eth_soc-use-iopoll.h-macro-for-DMA-.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 3bc8e0aff23be0526af0dbc7973a8866a08d73f1 Mon Sep 17 00:00:00 2001 -From: Ilya Lipnitskiy -Date: Thu, 22 Apr 2021 22:21:08 -0700 -Subject: [PATCH] net: ethernet: mtk_eth_soc: use iopoll.h macro for DMA init - -Replace a tight busy-wait loop without a pause with a standard -readx_poll_timeout_atomic routine with a 5 us poll period. - -Tested by booting a MT7621 device to ensure the driver initializes -properly. - -Signed-off-by: Ilya Lipnitskiy -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 29 +++++++++------------ - drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +- - 2 files changed, 14 insertions(+), 17 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -2075,25 +2075,22 @@ static int mtk_set_features(struct net_d - /* wait for DMA to finish whatever it is doing before we start using it again */ - static int mtk_dma_busy_wait(struct mtk_eth *eth) - { -- unsigned long t_start = jiffies; -+ unsigned int reg; -+ int ret; -+ u32 val; - -- while (1) { -- if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { -- if (!(mtk_r32(eth, MTK_QDMA_GLO_CFG) & -- (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY))) -- return 0; -- } else { -- if (!(mtk_r32(eth, MTK_PDMA_GLO_CFG) & -- (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY))) -- return 0; -- } -+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) -+ reg = MTK_QDMA_GLO_CFG; -+ else -+ reg = MTK_PDMA_GLO_CFG; - -- if (time_after(jiffies, t_start + MTK_DMA_BUSY_TIMEOUT)) -- break; -- } -+ ret = readx_poll_timeout_atomic(__raw_readl, eth->base + reg, val, -+ !(val & (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY)), -+ 5, MTK_DMA_BUSY_TIMEOUT_US); -+ if (ret) -+ dev_err(eth->dev, "DMA init timeout\n"); - -- dev_err(eth->dev, "DMA init timeout\n"); -- return -1; -+ return ret; - } - - static int mtk_dma_init(struct mtk_eth *eth) ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -213,7 +213,7 @@ - #define MTK_TX_DMA_BUSY BIT(1) - #define MTK_RX_DMA_EN BIT(2) - #define MTK_TX_DMA_EN BIT(0) --#define MTK_DMA_BUSY_TIMEOUT HZ -+#define MTK_DMA_BUSY_TIMEOUT_US 1000000 - - /* QDMA Reset Index Register */ - #define MTK_QDMA_RST_IDX 0x1A08 diff --git a/target/linux/generic/backport-5.10/610-v5.13-52-net-ethernet-mtk_eth_soc-missing-mutex.patch b/target/linux/generic/backport-5.10/610-v5.13-52-net-ethernet-mtk_eth_soc-missing-mutex.patch deleted file mode 100644 index a846ce43e2..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-52-net-ethernet-mtk_eth_soc-missing-mutex.patch +++ /dev/null @@ -1,63 +0,0 @@ -From: Pablo Neira Ayuso -Date: Sun, 18 Apr 2021 23:11:44 +0200 -Subject: [PATCH] net: ethernet: mtk_eth_soc: missing mutex - -Patch 2ed37183abb7 ("netfilter: flowtable: separate replace, destroy and -stats to different workqueues") splits the workqueue per event type. Add -a mutex to serialize updates. - -Fixes: 502e84e2382d ("net: ethernet: mtk_eth_soc: add flow offloading support") -Reported-by: Frank Wunderlich -Signed-off-by: Pablo Neira Ayuso -Signed-off-by: David S. Miller ---- - ---- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -392,6 +392,8 @@ mtk_flow_offload_stats(struct mtk_eth *e - return 0; - } - -+static DEFINE_MUTEX(mtk_flow_offload_mutex); -+ - static int - mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv) - { -@@ -399,6 +401,7 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_ - struct net_device *dev = cb_priv; - struct mtk_mac *mac = netdev_priv(dev); - struct mtk_eth *eth = mac->hw; -+ int err; - - if (!tc_can_offload(dev)) - return -EOPNOTSUPP; -@@ -406,18 +409,24 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_ - if (type != TC_SETUP_CLSFLOWER) - return -EOPNOTSUPP; - -+ mutex_lock(&mtk_flow_offload_mutex); - switch (cls->command) { - case FLOW_CLS_REPLACE: -- return mtk_flow_offload_replace(eth, cls); -+ err = mtk_flow_offload_replace(eth, cls); -+ break; - case FLOW_CLS_DESTROY: -- return mtk_flow_offload_destroy(eth, cls); -+ err = mtk_flow_offload_destroy(eth, cls); -+ break; - case FLOW_CLS_STATS: -- return mtk_flow_offload_stats(eth, cls); -+ err = mtk_flow_offload_stats(eth, cls); -+ break; - default: -- return -EOPNOTSUPP; -+ err = -EOPNOTSUPP; -+ break; - } -+ mutex_unlock(&mtk_flow_offload_mutex); - -- return 0; -+ return err; - } - - static int diff --git a/target/linux/generic/backport-5.10/610-v5.13-53-net-ethernet-mtk_eth_soc-handle-VLAN-pop-action.patch b/target/linux/generic/backport-5.10/610-v5.13-53-net-ethernet-mtk_eth_soc-handle-VLAN-pop-action.patch deleted file mode 100644 index 806fd0dcdf..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-53-net-ethernet-mtk_eth_soc-handle-VLAN-pop-action.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: Pablo Neira Ayuso -Date: Sun, 18 Apr 2021 23:11:45 +0200 -Subject: [PATCH] net: ethernet: mtk_eth_soc: handle VLAN pop action - -Do not hit EOPNOTSUPP when flowtable offload provides a VLAN pop action. - -Fixes: efce49dfe6a8 ("netfilter: flowtable: add vlan pop action offload support") -Signed-off-by: Pablo Neira Ayuso -Signed-off-by: David S. Miller ---- - ---- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -233,6 +233,8 @@ mtk_flow_offload_replace(struct mtk_eth - data.vlan.proto = act->vlan.proto; - data.vlan.num++; - break; -+ case FLOW_ACTION_VLAN_POP: -+ break; - case FLOW_ACTION_PPPOE_PUSH: - if (data.pppoe.num == 1) - return -EOPNOTSUPP; diff --git a/target/linux/generic/backport-5.10/610-v5.13-54-netfilter-flowtable-dst_check-from-garbage-collector.patch b/target/linux/generic/backport-5.10/610-v5.13-54-netfilter-flowtable-dst_check-from-garbage-collector.patch deleted file mode 100644 index 42b55f021a..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-54-netfilter-flowtable-dst_check-from-garbage-collector.patch +++ /dev/null @@ -1,159 +0,0 @@ -From: Pablo Neira Ayuso -Date: Sun, 28 Mar 2021 23:08:55 +0200 -Subject: [PATCH] netfilter: flowtable: dst_check() from garbage collector path - -Move dst_check() to the garbage collector path. Stale routes trigger the -flow entry teardown state which makes affected flows go back to the -classic forwarding path to re-evaluate flow offloading. - -IPv6 requires the dst cookie to work, store it in the flow_tuple, -otherwise dst_check() always fails. - -Fixes: e5075c0badaa ("netfilter: flowtable: call dst_check() to fall back to classic forwarding") -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -129,7 +129,10 @@ struct flow_offload_tuple { - in_vlan_ingress:2; - u16 mtu; - union { -- struct dst_entry *dst_cache; -+ struct { -+ struct dst_entry *dst_cache; -+ u32 dst_cookie; -+ }; - struct { - u32 ifidx; - u32 hw_ifidx; ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -74,6 +74,18 @@ err_ct_refcnt: - } - EXPORT_SYMBOL_GPL(flow_offload_alloc); - -+static u32 flow_offload_dst_cookie(struct flow_offload_tuple *flow_tuple) -+{ -+ const struct rt6_info *rt; -+ -+ if (flow_tuple->l3proto == NFPROTO_IPV6) { -+ rt = (const struct rt6_info *)flow_tuple->dst_cache; -+ return rt6_get_cookie(rt); -+ } -+ -+ return 0; -+} -+ - static int flow_offload_fill_route(struct flow_offload *flow, - const struct nf_flow_route *route, - enum flow_offload_tuple_dir dir) -@@ -116,6 +128,7 @@ static int flow_offload_fill_route(struc - return -1; - - flow_tuple->dst_cache = dst; -+ flow_tuple->dst_cookie = flow_offload_dst_cookie(flow_tuple); - break; - } - flow_tuple->xmit_type = route->tuple[dir].xmit_type; -@@ -389,11 +402,33 @@ nf_flow_table_iterate(struct nf_flowtabl - return err; - } - -+static bool flow_offload_stale_dst(struct flow_offload_tuple *tuple) -+{ -+ struct dst_entry *dst; -+ -+ if (tuple->xmit_type == FLOW_OFFLOAD_XMIT_NEIGH || -+ tuple->xmit_type == FLOW_OFFLOAD_XMIT_XFRM) { -+ dst = tuple->dst_cache; -+ if (!dst_check(dst, tuple->dst_cookie)) -+ return true; -+ } -+ -+ return false; -+} -+ -+static bool nf_flow_has_stale_dst(struct flow_offload *flow) -+{ -+ return flow_offload_stale_dst(&flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple) || -+ flow_offload_stale_dst(&flow->tuplehash[FLOW_OFFLOAD_DIR_REPLY].tuple); -+} -+ - static void nf_flow_offload_gc_step(struct flow_offload *flow, void *data) - { - struct nf_flowtable *flow_table = data; - -- if (nf_flow_has_expired(flow) || nf_ct_is_dying(flow->ct)) -+ if (nf_flow_has_expired(flow) || -+ nf_ct_is_dying(flow->ct) || -+ nf_flow_has_stale_dst(flow)) - set_bit(NF_FLOW_TEARDOWN, &flow->flags); - - if (test_bit(NF_FLOW_TEARDOWN, &flow->flags)) { ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -364,15 +364,6 @@ nf_flow_offload_ip_hook(void *priv, stru - if (nf_flow_state_check(flow, iph->protocol, skb, thoff)) - return NF_ACCEPT; - -- if (tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_NEIGH || -- tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM) { -- rt = (struct rtable *)tuplehash->tuple.dst_cache; -- if (!dst_check(&rt->dst, 0)) { -- flow_offload_teardown(flow); -- return NF_ACCEPT; -- } -- } -- - if (skb_try_make_writable(skb, thoff + hdrsize)) - return NF_DROP; - -@@ -391,6 +382,7 @@ nf_flow_offload_ip_hook(void *priv, stru - nf_ct_acct_update(flow->ct, tuplehash->tuple.dir, skb->len); - - if (unlikely(tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM)) { -+ rt = (struct rtable *)tuplehash->tuple.dst_cache; - memset(skb->cb, 0, sizeof(struct inet_skb_parm)); - IPCB(skb)->iif = skb->dev->ifindex; - IPCB(skb)->flags = IPSKB_FORWARDED; -@@ -399,6 +391,7 @@ nf_flow_offload_ip_hook(void *priv, stru - - switch (tuplehash->tuple.xmit_type) { - case FLOW_OFFLOAD_XMIT_NEIGH: -+ rt = (struct rtable *)tuplehash->tuple.dst_cache; - outdev = rt->dst.dev; - skb->dev = outdev; - nexthop = rt_nexthop(rt, flow->tuplehash[!dir].tuple.src_v4.s_addr); -@@ -607,15 +600,6 @@ nf_flow_offload_ipv6_hook(void *priv, st - if (nf_flow_state_check(flow, ip6h->nexthdr, skb, thoff)) - return NF_ACCEPT; - -- if (tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_NEIGH || -- tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM) { -- rt = (struct rt6_info *)tuplehash->tuple.dst_cache; -- if (!dst_check(&rt->dst, 0)) { -- flow_offload_teardown(flow); -- return NF_ACCEPT; -- } -- } -- - if (skb_try_make_writable(skb, thoff + hdrsize)) - return NF_DROP; - -@@ -633,6 +617,7 @@ nf_flow_offload_ipv6_hook(void *priv, st - nf_ct_acct_update(flow->ct, tuplehash->tuple.dir, skb->len); - - if (unlikely(tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM)) { -+ rt = (struct rt6_info *)tuplehash->tuple.dst_cache; - memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); - IP6CB(skb)->iif = skb->dev->ifindex; - IP6CB(skb)->flags = IP6SKB_FORWARDED; -@@ -641,6 +626,7 @@ nf_flow_offload_ipv6_hook(void *priv, st - - switch (tuplehash->tuple.xmit_type) { - case FLOW_OFFLOAD_XMIT_NEIGH: -+ rt = (struct rt6_info *)tuplehash->tuple.dst_cache; - outdev = rt->dst.dev; - skb->dev = outdev; - nexthop = rt6_nexthop(rt, &flow->tuplehash[!dir].tuple.src_v6); diff --git a/target/linux/generic/backport-5.10/610-v5.13-55-netfilter-conntrack-Introduce-tcp-offload-timeout-co.patch b/target/linux/generic/backport-5.10/610-v5.13-55-netfilter-conntrack-Introduce-tcp-offload-timeout-co.patch deleted file mode 100644 index 0d30b0c593..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-55-netfilter-conntrack-Introduce-tcp-offload-timeout-co.patch +++ /dev/null @@ -1,94 +0,0 @@ -From: Oz Shlomo -Date: Thu, 3 Jun 2021 15:12:33 +0300 -Subject: [PATCH] netfilter: conntrack: Introduce tcp offload timeout - configuration - -TCP connections may be offloaded from nf conntrack to nf flow table. -Offloaded connections are aged after 30 seconds of inactivity. -Once aged, ownership is returned to conntrack with a hard coded pickup -time of 120 seconds, after which the connection may be deleted. -eted. The current aging intervals may be too aggressive for some users. - -Provide users with the ability to control the nf flow table offload -aging and pickup time intervals via sysctl parameter as a pre-step for -configuring the nf flow table GC timeout intervals. - -Signed-off-by: Oz Shlomo -Reviewed-by: Paul Blakey -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netns/conntrack.h -+++ b/include/net/netns/conntrack.h -@@ -27,6 +27,10 @@ struct nf_tcp_net { - int tcp_loose; - int tcp_be_liberal; - int tcp_max_retrans; -+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) -+ unsigned int offload_timeout; -+ unsigned int offload_pickup; -+#endif - }; - - enum udp_conntrack { ---- a/net/netfilter/nf_conntrack_proto_tcp.c -+++ b/net/netfilter/nf_conntrack_proto_tcp.c -@@ -1457,6 +1457,11 @@ void nf_conntrack_tcp_init_net(struct ne - tn->tcp_loose = nf_ct_tcp_loose; - tn->tcp_be_liberal = nf_ct_tcp_be_liberal; - tn->tcp_max_retrans = nf_ct_tcp_max_retrans; -+ -+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) -+ tn->offload_timeout = 30 * HZ; -+ tn->offload_pickup = 120 * HZ; -+#endif - } - - const struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp = ---- a/net/netfilter/nf_conntrack_standalone.c -+++ b/net/netfilter/nf_conntrack_standalone.c -@@ -567,6 +567,10 @@ enum nf_ct_sysctl_index { - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_RETRANS, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_UNACK, -+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) -+ NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD, -+ NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD_PICKUP, -+#endif - NF_SYSCTL_CT_PROTO_TCP_LOOSE, - NF_SYSCTL_CT_PROTO_TCP_LIBERAL, - NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS, -@@ -757,6 +761,20 @@ static struct ctl_table nf_ct_sysctl_tab - .mode = 0644, - .proc_handler = proc_dointvec_jiffies, - }, -+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) -+ [NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD] = { -+ .procname = "nf_flowtable_tcp_timeout", -+ .maxlen = sizeof(unsigned int), -+ .mode = 0644, -+ .proc_handler = proc_dointvec_jiffies, -+ }, -+ [NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD_PICKUP] = { -+ .procname = "nf_flowtable_tcp_pickup", -+ .maxlen = sizeof(unsigned int), -+ .mode = 0644, -+ .proc_handler = proc_dointvec_jiffies, -+ }, -+#endif - [NF_SYSCTL_CT_PROTO_TCP_LOOSE] = { - .procname = "nf_conntrack_tcp_loose", - .maxlen = sizeof(int), -@@ -960,6 +978,12 @@ static void nf_conntrack_standalone_init - XASSIGN(LIBERAL, &tn->tcp_be_liberal); - XASSIGN(MAX_RETRANS, &tn->tcp_max_retrans); - #undef XASSIGN -+ -+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) -+ table[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD].data = &tn->offload_timeout; -+ table[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD_PICKUP].data = &tn->offload_pickup; -+#endif -+ - } - - static void nf_conntrack_standalone_init_sctp_sysctl(struct net *net, diff --git a/target/linux/generic/backport-5.10/610-v5.13-56-netfilter-conntrack-Introduce-udp-offload-timeout-co.patch b/target/linux/generic/backport-5.10/610-v5.13-56-netfilter-conntrack-Introduce-udp-offload-timeout-co.patch deleted file mode 100644 index 93ff24a941..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-56-netfilter-conntrack-Introduce-udp-offload-timeout-co.patch +++ /dev/null @@ -1,92 +0,0 @@ -From: Oz Shlomo -Date: Thu, 3 Jun 2021 15:12:34 +0300 -Subject: [PATCH] netfilter: conntrack: Introduce udp offload timeout - configuration - -UDP connections may be offloaded from nf conntrack to nf flow table. -Offloaded connections are aged after 30 seconds of inactivity. -Once aged, ownership is returned to conntrack with a hard coded pickup -time of 30 seconds, after which the connection may be deleted. -eted. The current aging intervals may be too aggressive for some users. - -Provide users with the ability to control the nf flow table offload -aging and pickup time intervals via sysctl parameter as a pre-step for -configuring the nf flow table GC timeout intervals. - -Signed-off-by: Oz Shlomo -Reviewed-by: Paul Blakey -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netns/conntrack.h -+++ b/include/net/netns/conntrack.h -@@ -41,6 +41,10 @@ enum udp_conntrack { - - struct nf_udp_net { - unsigned int timeouts[UDP_CT_MAX]; -+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) -+ unsigned int offload_timeout; -+ unsigned int offload_pickup; -+#endif - }; - - struct nf_icmp_net { ---- a/net/netfilter/nf_conntrack_proto_udp.c -+++ b/net/netfilter/nf_conntrack_proto_udp.c -@@ -273,6 +273,11 @@ void nf_conntrack_udp_init_net(struct ne - - for (i = 0; i < UDP_CT_MAX; i++) - un->timeouts[i] = udp_timeouts[i]; -+ -+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) -+ un->offload_timeout = 30 * HZ; -+ un->offload_pickup = 30 * HZ; -+#endif - } - - const struct nf_conntrack_l4proto nf_conntrack_l4proto_udp = ---- a/net/netfilter/nf_conntrack_standalone.c -+++ b/net/netfilter/nf_conntrack_standalone.c -@@ -576,6 +576,10 @@ enum nf_ct_sysctl_index { - NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS, - NF_SYSCTL_CT_PROTO_TIMEOUT_UDP, - NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM, -+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) -+ NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD, -+ NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD_PICKUP, -+#endif - NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP, - NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6, - #ifdef CONFIG_NF_CT_PROTO_SCTP -@@ -809,6 +813,20 @@ static struct ctl_table nf_ct_sysctl_tab - .mode = 0644, - .proc_handler = proc_dointvec_jiffies, - }, -+#if IS_ENABLED(CONFIG_NFT_FLOW_OFFLOAD) -+ [NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD] = { -+ .procname = "nf_flowtable_udp_timeout", -+ .maxlen = sizeof(unsigned int), -+ .mode = 0644, -+ .proc_handler = proc_dointvec_jiffies, -+ }, -+ [NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD_PICKUP] = { -+ .procname = "nf_flowtable_udp_pickup", -+ .maxlen = sizeof(unsigned int), -+ .mode = 0644, -+ .proc_handler = proc_dointvec_jiffies, -+ }, -+#endif - [NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP] = { - .procname = "nf_conntrack_icmp_timeout", - .maxlen = sizeof(unsigned int), -@@ -1070,6 +1088,10 @@ static int nf_conntrack_standalone_init_ - table[NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6].data = &nf_icmpv6_pernet(net)->timeout; - table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP].data = &un->timeouts[UDP_CT_UNREPLIED]; - table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM].data = &un->timeouts[UDP_CT_REPLIED]; -+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) -+ table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD].data = &un->offload_timeout; -+ table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD_PICKUP].data = &un->offload_pickup; -+#endif - - nf_conntrack_standalone_init_tcp_sysctl(net, table); - nf_conntrack_standalone_init_sctp_sysctl(net, table); diff --git a/target/linux/generic/backport-5.10/610-v5.13-57-netfilter-flowtable-Set-offload-timeouts-according-t.patch b/target/linux/generic/backport-5.10/610-v5.13-57-netfilter-flowtable-Set-offload-timeouts-according-t.patch deleted file mode 100644 index 1e82308eaa..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-57-netfilter-flowtable-Set-offload-timeouts-according-t.patch +++ /dev/null @@ -1,134 +0,0 @@ -From: Oz Shlomo -Date: Thu, 3 Jun 2021 15:12:35 +0300 -Subject: [PATCH] netfilter: flowtable: Set offload timeouts according to proto - values - -Currently the aging period for tcp/udp connections is hard coded to -30 seconds. Aged tcp/udp connections configure a hard coded 120/30 -seconds pickup timeout for conntrack. -This configuration may be too aggressive or permissive for some users. - -Dynamically configure the nf flow table GC timeout intervals according -to the user defined values. - -Signed-off-by: Oz Shlomo -Reviewed-by: Paul Blakey -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -174,6 +174,8 @@ struct flow_offload { - #define NF_FLOW_TIMEOUT (30 * HZ) - #define nf_flowtable_time_stamp (u32)jiffies - -+unsigned long flow_offload_get_timeout(struct flow_offload *flow); -+ - static inline __s32 nf_flow_timeout_delta(unsigned int timeout) - { - return (__s32)(timeout - nf_flowtable_time_stamp); ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -175,12 +175,10 @@ static void flow_offload_fixup_tcp(struc - tcp->seen[1].td_maxwin = 0; - } - --#define NF_FLOWTABLE_TCP_PICKUP_TIMEOUT (120 * HZ) --#define NF_FLOWTABLE_UDP_PICKUP_TIMEOUT (30 * HZ) -- - static void flow_offload_fixup_ct_timeout(struct nf_conn *ct) - { - const struct nf_conntrack_l4proto *l4proto; -+ struct net *net = nf_ct_net(ct); - int l4num = nf_ct_protonum(ct); - unsigned int timeout; - -@@ -188,12 +186,17 @@ static void flow_offload_fixup_ct_timeou - if (!l4proto) - return; - -- if (l4num == IPPROTO_TCP) -- timeout = NF_FLOWTABLE_TCP_PICKUP_TIMEOUT; -- else if (l4num == IPPROTO_UDP) -- timeout = NF_FLOWTABLE_UDP_PICKUP_TIMEOUT; -- else -+ if (l4num == IPPROTO_TCP) { -+ struct nf_tcp_net *tn = nf_tcp_pernet(net); -+ -+ timeout = tn->offload_pickup; -+ } else if (l4num == IPPROTO_UDP) { -+ struct nf_udp_net *tn = nf_udp_pernet(net); -+ -+ timeout = tn->offload_pickup; -+ } else { - return; -+ } - - if (nf_flow_timeout_delta(READ_ONCE(ct->timeout)) > (__s32)timeout) - WRITE_ONCE(ct->timeout, nfct_time_stamp + timeout); -@@ -265,11 +268,35 @@ static const struct rhashtable_params nf - .automatic_shrinking = true, - }; - -+unsigned long flow_offload_get_timeout(struct flow_offload *flow) -+{ -+ const struct nf_conntrack_l4proto *l4proto; -+ unsigned long timeout = NF_FLOW_TIMEOUT; -+ struct net *net = nf_ct_net(flow->ct); -+ int l4num = nf_ct_protonum(flow->ct); -+ -+ l4proto = nf_ct_l4proto_find(l4num); -+ if (!l4proto) -+ return timeout; -+ -+ if (l4num == IPPROTO_TCP) { -+ struct nf_tcp_net *tn = nf_tcp_pernet(net); -+ -+ timeout = tn->offload_timeout; -+ } else if (l4num == IPPROTO_UDP) { -+ struct nf_udp_net *tn = nf_udp_pernet(net); -+ -+ timeout = tn->offload_timeout; -+ } -+ -+ return timeout; -+} -+ - int flow_offload_add(struct nf_flowtable *flow_table, struct flow_offload *flow) - { - int err; - -- flow->timeout = nf_flowtable_time_stamp + NF_FLOW_TIMEOUT; -+ flow->timeout = nf_flowtable_time_stamp + flow_offload_get_timeout(flow); - - err = rhashtable_insert_fast(&flow_table->rhashtable, - &flow->tuplehash[0].node, -@@ -301,7 +328,7 @@ EXPORT_SYMBOL_GPL(flow_offload_add); - void flow_offload_refresh(struct nf_flowtable *flow_table, - struct flow_offload *flow) - { -- flow->timeout = nf_flowtable_time_stamp + NF_FLOW_TIMEOUT; -+ flow->timeout = nf_flowtable_time_stamp + flow_offload_get_timeout(flow); - - if (likely(!nf_flowtable_hw_offload(flow_table))) - return; ---- a/net/netfilter/nf_flow_table_offload.c -+++ b/net/netfilter/nf_flow_table_offload.c -@@ -885,7 +885,7 @@ static void flow_offload_work_stats(stru - - lastused = max_t(u64, stats[0].lastused, stats[1].lastused); - offload->flow->timeout = max_t(u64, offload->flow->timeout, -- lastused + NF_FLOW_TIMEOUT); -+ lastused + flow_offload_get_timeout(offload->flow)); - - if (offload->flowtable->flags & NF_FLOWTABLE_COUNTER) { - if (stats[0].pkts) -@@ -989,7 +989,7 @@ void nf_flow_offload_stats(struct nf_flo - __s32 delta; - - delta = nf_flow_timeout_delta(flow->timeout); -- if ((delta >= (9 * NF_FLOW_TIMEOUT) / 10)) -+ if ((delta >= (9 * flow_offload_get_timeout(flow)) / 10)) - return; - - offload = nf_flow_offload_work_alloc(flowtable, flow, FLOW_CLS_STATS); diff --git a/target/linux/generic/backport-5.10/610-v5.13-58-netfilter-flowtable-Add-FLOW_OFFLOAD_XMIT_UNSPEC-xmi.patch b/target/linux/generic/backport-5.10/610-v5.13-58-netfilter-flowtable-Add-FLOW_OFFLOAD_XMIT_UNSPEC-xmi.patch deleted file mode 100644 index 62edb2c811..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.13-58-netfilter-flowtable-Add-FLOW_OFFLOAD_XMIT_UNSPEC-xmi.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 78ed0a9bc6db76f8e5f5f4cb0d2b2f0d1bb21b24 Mon Sep 17 00:00:00 2001 -From: Roi Dayan -Date: Tue, 13 Apr 2021 11:06:05 +0300 -Subject: [PATCH] netfilter: flowtable: Add FLOW_OFFLOAD_XMIT_UNSPEC xmit type - -It could be xmit type was not set and would default to FLOW_OFFLOAD_XMIT_NEIGH -and in this type the gc expect to have a route info. -Fix that by adding FLOW_OFFLOAD_XMIT_UNSPEC which defaults to 0. - -Fixes: 8b9229d15877 ("netfilter: flowtable: dst_check() from garbage collector path") -Signed-off-by: Roi Dayan -Signed-off-by: Pablo Neira Ayuso ---- - include/net/netfilter/nf_flow_table.h | 3 ++- - net/netfilter/nf_flow_table_core.c | 3 +++ - 2 files changed, 5 insertions(+), 1 deletion(-) - ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -90,7 +90,8 @@ enum flow_offload_tuple_dir { - #define FLOW_OFFLOAD_DIR_MAX IP_CT_DIR_MAX - - enum flow_offload_xmit_type { -- FLOW_OFFLOAD_XMIT_NEIGH = 0, -+ FLOW_OFFLOAD_XMIT_UNSPEC = 0, -+ FLOW_OFFLOAD_XMIT_NEIGH, - FLOW_OFFLOAD_XMIT_XFRM, - FLOW_OFFLOAD_XMIT_DIRECT, - }; ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -130,6 +130,9 @@ static int flow_offload_fill_route(struc - flow_tuple->dst_cache = dst; - flow_tuple->dst_cookie = flow_offload_dst_cookie(flow_tuple); - break; -+ default: -+ WARN_ON_ONCE(1); -+ break; - } - flow_tuple->xmit_type = route->tuple[dir].xmit_type; - diff --git a/target/linux/generic/backport-5.10/610-v5.15-58-netfilter-flowtable-avoid-possible-false-sharing.patch b/target/linux/generic/backport-5.10/610-v5.15-58-netfilter-flowtable-avoid-possible-false-sharing.patch deleted file mode 100644 index a3d0a35923..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.15-58-netfilter-flowtable-avoid-possible-false-sharing.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: Pablo Neira Ayuso -Date: Sat, 17 Jul 2021 10:10:29 +0200 -Subject: [PATCH] netfilter: flowtable: avoid possible false sharing - -The flowtable follows the same timeout approach as conntrack, use the -same idiom as in cc16921351d8 ("netfilter: conntrack: avoid same-timeout -update") but also include the fix provided by e37542ba111f ("netfilter: -conntrack: avoid possible false sharing"). - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -331,7 +331,11 @@ EXPORT_SYMBOL_GPL(flow_offload_add); - void flow_offload_refresh(struct nf_flowtable *flow_table, - struct flow_offload *flow) - { -- flow->timeout = nf_flowtable_time_stamp + flow_offload_get_timeout(flow); -+ u32 timeout; -+ -+ timeout = nf_flowtable_time_stamp + flow_offload_get_timeout(flow); -+ if (READ_ONCE(flow->timeout) != timeout) -+ WRITE_ONCE(flow->timeout, timeout); - - if (likely(!nf_flowtable_hw_offload(flow_table))) - return; diff --git a/target/linux/generic/backport-5.10/610-v5.18-netfilter-flowtable-move-dst_check-to-packet-path.patch b/target/linux/generic/backport-5.10/610-v5.18-netfilter-flowtable-move-dst_check-to-packet-path.patch deleted file mode 100644 index 53118939a3..0000000000 --- a/target/linux/generic/backport-5.10/610-v5.18-netfilter-flowtable-move-dst_check-to-packet-path.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 2738d9d963bd1f06d5114c2b4fa5771a95703991 Mon Sep 17 00:00:00 2001 -From: Ritaro Takenaka -Date: Tue, 17 May 2022 12:55:30 +0200 -Subject: [PATCH] netfilter: flowtable: move dst_check to packet path - -Fixes sporadic IPv6 packet loss when flow offloading is enabled. - -IPv6 route GC and flowtable GC are not synchronized. -When dst_cache becomes stale and a packet passes through the flow before -the flowtable GC teardowns it, the packet can be dropped. -So, it is necessary to check dst every time in packet path. - -Fixes: 227e1e4d0d6c ("netfilter: nf_flowtable: skip device lookup from interface index") -Signed-off-by: Ritaro Takenaka -Signed-off-by: Pablo Neira Ayuso ---- - net/netfilter/nf_flow_table_core.c | 23 +---------------------- - net/netfilter/nf_flow_table_ip.c | 19 +++++++++++++++++++ - 2 files changed, 20 insertions(+), 22 deletions(-) - ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -436,33 +436,12 @@ nf_flow_table_iterate(struct nf_flowtabl - return err; - } - --static bool flow_offload_stale_dst(struct flow_offload_tuple *tuple) --{ -- struct dst_entry *dst; -- -- if (tuple->xmit_type == FLOW_OFFLOAD_XMIT_NEIGH || -- tuple->xmit_type == FLOW_OFFLOAD_XMIT_XFRM) { -- dst = tuple->dst_cache; -- if (!dst_check(dst, tuple->dst_cookie)) -- return true; -- } -- -- return false; --} -- --static bool nf_flow_has_stale_dst(struct flow_offload *flow) --{ -- return flow_offload_stale_dst(&flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple) || -- flow_offload_stale_dst(&flow->tuplehash[FLOW_OFFLOAD_DIR_REPLY].tuple); --} -- - static void nf_flow_offload_gc_step(struct flow_offload *flow, void *data) - { - struct nf_flowtable *flow_table = data; - - if (nf_flow_has_expired(flow) || -- nf_ct_is_dying(flow->ct) || -- nf_flow_has_stale_dst(flow)) -+ nf_ct_is_dying(flow->ct)) - set_bit(NF_FLOW_TEARDOWN, &flow->flags); - - if (test_bit(NF_FLOW_TEARDOWN, &flow->flags)) { ---- a/net/netfilter/nf_flow_table_ip.c -+++ b/net/netfilter/nf_flow_table_ip.c -@@ -229,6 +229,15 @@ static bool nf_flow_exceeds_mtu(const st - return true; - } - -+static inline bool nf_flow_dst_check(struct flow_offload_tuple *tuple) -+{ -+ if (tuple->xmit_type != FLOW_OFFLOAD_XMIT_NEIGH && -+ tuple->xmit_type != FLOW_OFFLOAD_XMIT_XFRM) -+ return true; -+ -+ return dst_check(tuple->dst_cache, tuple->dst_cookie); -+} -+ - static unsigned int nf_flow_xmit_xfrm(struct sk_buff *skb, - const struct nf_hook_state *state, - struct dst_entry *dst) -@@ -364,6 +373,11 @@ nf_flow_offload_ip_hook(void *priv, stru - if (nf_flow_state_check(flow, iph->protocol, skb, thoff)) - return NF_ACCEPT; - -+ if (!nf_flow_dst_check(&tuplehash->tuple)) { -+ flow_offload_teardown(flow); -+ return NF_ACCEPT; -+ } -+ - if (skb_try_make_writable(skb, thoff + hdrsize)) - return NF_DROP; - -@@ -600,6 +614,11 @@ nf_flow_offload_ipv6_hook(void *priv, st - if (nf_flow_state_check(flow, ip6h->nexthdr, skb, thoff)) - return NF_ACCEPT; - -+ if (!nf_flow_dst_check(&tuplehash->tuple)) { -+ flow_offload_teardown(flow); -+ return NF_ACCEPT; -+ } -+ - if (skb_try_make_writable(skb, thoff + hdrsize)) - return NF_DROP; - diff --git a/target/linux/generic/backport-5.10/611-v5.12-net-ethernet-mediatek-support-setting-MTU.patch b/target/linux/generic/backport-5.10/611-v5.12-net-ethernet-mediatek-support-setting-MTU.patch deleted file mode 100644 index a2c407f7c8..0000000000 --- a/target/linux/generic/backport-5.10/611-v5.12-net-ethernet-mediatek-support-setting-MTU.patch +++ /dev/null @@ -1,138 +0,0 @@ -From 4fd59792097a6b2fb949d41264386a7ecade469e Mon Sep 17 00:00:00 2001 -From: DENG Qingfang -Date: Mon, 25 Jan 2021 12:20:46 +0800 -Subject: [PATCH] net: ethernet: mediatek: support setting MTU - -MT762x HW, except for MT7628, supports frame length up to 2048 -(maximum length on GDM), so allow setting MTU up to 2030. - -Also set the default frame length to the hardware default 1518. - -Signed-off-by: DENG Qingfang -Reviewed-by: Andrew Lunn -Link: https://lore.kernel.org/r/20210125042046.5599-1-dqfext@gmail.com -Signed-off-by: Jakub Kicinski ---- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 43 ++++++++++++++++++--- - drivers/net/ethernet/mediatek/mtk_eth_soc.h | 12 ++++-- - 2 files changed, 47 insertions(+), 8 deletions(-) - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -355,7 +355,7 @@ static void mtk_mac_config(struct phylin - /* Setup gmac */ - mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); - mcr_new = mcr_cur; -- mcr_new |= MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG | MAC_MCR_FORCE_MODE | -+ mcr_new |= MAC_MCR_IPG_CFG | MAC_MCR_FORCE_MODE | - MAC_MCR_BACKOFF_EN | MAC_MCR_BACKPR_EN | MAC_MCR_FORCE_LINK | - MAC_MCR_RX_FIFO_CLR_DIS; - -@@ -783,8 +783,8 @@ static void mtk_get_stats64(struct net_d - static inline int mtk_max_frag_size(int mtu) - { - /* make sure buf_size will be at least MTK_MAX_RX_LENGTH */ -- if (mtu + MTK_RX_ETH_HLEN < MTK_MAX_RX_LENGTH) -- mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN; -+ if (mtu + MTK_RX_ETH_HLEN < MTK_MAX_RX_LENGTH_2K) -+ mtu = MTK_MAX_RX_LENGTH_2K - MTK_RX_ETH_HLEN; - - return SKB_DATA_ALIGN(MTK_RX_HLEN + mtu) + - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); -@@ -795,7 +795,7 @@ static inline int mtk_max_buf_size(int f - int buf_size = frag_size - NET_SKB_PAD - NET_IP_ALIGN - - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); - -- WARN_ON(buf_size < MTK_MAX_RX_LENGTH); -+ WARN_ON(buf_size < MTK_MAX_RX_LENGTH_2K); - - return buf_size; - } -@@ -2631,6 +2631,35 @@ static void mtk_uninit(struct net_device - mtk_rx_irq_disable(eth, ~0); - } - -+static int mtk_change_mtu(struct net_device *dev, int new_mtu) -+{ -+ int length = new_mtu + MTK_RX_ETH_HLEN; -+ struct mtk_mac *mac = netdev_priv(dev); -+ struct mtk_eth *eth = mac->hw; -+ u32 mcr_cur, mcr_new; -+ -+ if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) { -+ mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); -+ mcr_new = mcr_cur & ~MAC_MCR_MAX_RX_MASK; -+ -+ if (length <= 1518) -+ mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1518); -+ else if (length <= 1536) -+ mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1536); -+ else if (length <= 1552) -+ mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1552); -+ else -+ mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_2048); -+ -+ if (mcr_new != mcr_cur) -+ mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); -+ } -+ -+ dev->mtu = new_mtu; -+ -+ return 0; -+} -+ - static int mtk_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) - { - struct mtk_mac *mac = netdev_priv(dev); -@@ -2927,6 +2956,7 @@ static const struct net_device_ops mtk_n - .ndo_set_mac_address = mtk_set_mac_address, - .ndo_validate_addr = eth_validate_addr, - .ndo_do_ioctl = mtk_do_ioctl, -+ .ndo_change_mtu = mtk_change_mtu, - .ndo_tx_timeout = mtk_tx_timeout, - .ndo_get_stats64 = mtk_get_stats64, - .ndo_fix_features = mtk_fix_features, -@@ -3029,7 +3059,10 @@ static int mtk_add_mac(struct mtk_eth *e - eth->netdev[id]->irq = eth->irq[0]; - eth->netdev[id]->dev.of_node = np; - -- eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN; -+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) -+ eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN; -+ else -+ eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH_2K - MTK_RX_ETH_HLEN; - - return 0; - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -20,12 +20,13 @@ - #include "mtk_ppe.h" - - #define MTK_QDMA_PAGE_SIZE 2048 --#define MTK_MAX_RX_LENGTH 1536 -+#define MTK_MAX_RX_LENGTH 1536 -+#define MTK_MAX_RX_LENGTH_2K 2048 - #define MTK_TX_DMA_BUF_LEN 0x3fff - #define MTK_DMA_SIZE 512 - #define MTK_NAPI_WEIGHT 64 - #define MTK_MAC_COUNT 2 --#define MTK_RX_ETH_HLEN (VLAN_ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN) -+#define MTK_RX_ETH_HLEN (ETH_HLEN + ETH_FCS_LEN) - #define MTK_RX_HLEN (NET_SKB_PAD + MTK_RX_ETH_HLEN + NET_IP_ALIGN) - #define MTK_DMA_DUMMY_DESC 0xffffffff - #define MTK_DEFAULT_MSG_ENABLE (NETIF_MSG_DRV | \ -@@ -352,7 +353,12 @@ - - /* Mac control registers */ - #define MTK_MAC_MCR(x) (0x10100 + (x * 0x100)) --#define MAC_MCR_MAX_RX_1536 BIT(24) -+#define MAC_MCR_MAX_RX_MASK GENMASK(25, 24) -+#define MAC_MCR_MAX_RX(_x) (MAC_MCR_MAX_RX_MASK & ((_x) << 24)) -+#define MAC_MCR_MAX_RX_1518 0x0 -+#define MAC_MCR_MAX_RX_1536 0x1 -+#define MAC_MCR_MAX_RX_1552 0x2 -+#define MAC_MCR_MAX_RX_2048 0x3 - #define MAC_MCR_IPG_CFG (BIT(18) | BIT(16)) - #define MAC_MCR_FORCE_MODE BIT(15) - #define MAC_MCR_TX_EN BIT(14) diff --git a/target/linux/generic/backport-5.10/612-v5.15-netfilter-conntrack-sanitize-table-size-default-sett.patch b/target/linux/generic/backport-5.10/612-v5.15-netfilter-conntrack-sanitize-table-size-default-sett.patch deleted file mode 100644 index 55bf0f612b..0000000000 --- a/target/linux/generic/backport-5.10/612-v5.15-netfilter-conntrack-sanitize-table-size-default-sett.patch +++ /dev/null @@ -1,100 +0,0 @@ -From d532bcd0b2699d84d71a0c71d37157ac6eb3be25 Mon Sep 17 00:00:00 2001 -Message-Id: -From: Florian Westphal -Date: Thu, 26 Aug 2021 15:54:19 +0200 -Subject: [PATCH] netfilter: conntrack: sanitize table size default settings - -conntrack has two distinct table size settings: -nf_conntrack_max and nf_conntrack_buckets. - -The former limits how many conntrack objects are allowed to exist -in each namespace. - -The second sets the size of the hashtable. - -As all entries are inserted twice (once for original direction, once for -reply), there should be at least twice as many buckets in the table than -the maximum number of conntrack objects that can exist at the same time. - -Change the default multiplier to 1 and increase the chosen bucket sizes. -This results in the same nf_conntrack_max settings as before but reduces -the average bucket list length. - -Signed-off-by: Florian Westphal -Signed-off-by: Pablo Neira Ayuso ---- - .../networking/nf_conntrack-sysctl.rst | 13 ++++---- - net/netfilter/nf_conntrack_core.c | 30 +++++++++---------- - 2 files changed, 22 insertions(+), 21 deletions(-) - ---- a/Documentation/networking/nf_conntrack-sysctl.rst -+++ b/Documentation/networking/nf_conntrack-sysctl.rst -@@ -17,9 +17,8 @@ nf_conntrack_acct - BOOLEAN - nf_conntrack_buckets - INTEGER - Size of hash table. If not specified as parameter during module - loading, the default size is calculated by dividing total memory -- by 16384 to determine the number of buckets but the hash table will -- never have fewer than 32 and limited to 16384 buckets. For systems -- with more than 4GB of memory it will be 65536 buckets. -+ by 16384 to determine the number of buckets. The hash table will -+ never have fewer than 1024 and never more than 262144 buckets. - This sysctl is only writeable in the initial net namespace. - - nf_conntrack_checksum - BOOLEAN -@@ -100,8 +99,12 @@ nf_conntrack_log_invalid - INTEGER - Log invalid packets of a type specified by value. - - nf_conntrack_max - INTEGER -- Size of connection tracking table. Default value is -- nf_conntrack_buckets value * 4. -+ Maximum number of allowed connection tracking entries. This value is set -+ to nf_conntrack_buckets by default. -+ Note that connection tracking entries are added to the table twice -- once -+ for the original direction and once for the reply direction (i.e., with -+ the reversed address). This means that with default settings a maxed-out -+ table will have a average hash chain length of 2, not 1. - - nf_conntrack_tcp_be_liberal - BOOLEAN - - 0 - disabled (default) ---- a/net/netfilter/nf_conntrack_core.c -+++ b/net/netfilter/nf_conntrack_core.c -@@ -2575,26 +2575,24 @@ int nf_conntrack_init_start(void) - spin_lock_init(&nf_conntrack_locks[i]); - - if (!nf_conntrack_htable_size) { -- /* Idea from tcp.c: use 1/16384 of memory. -- * On i386: 32MB machine has 512 buckets. -- * >= 1GB machines have 16384 buckets. -- * >= 4GB machines have 65536 buckets. -- */ - nf_conntrack_htable_size - = (((nr_pages << PAGE_SHIFT) / 16384) - / sizeof(struct hlist_head)); -- if (nr_pages > (4 * (1024 * 1024 * 1024 / PAGE_SIZE))) -- nf_conntrack_htable_size = 65536; -+ if (BITS_PER_LONG >= 64 && -+ nr_pages > (4 * (1024 * 1024 * 1024 / PAGE_SIZE))) -+ nf_conntrack_htable_size = 262144; - else if (nr_pages > (1024 * 1024 * 1024 / PAGE_SIZE)) -- nf_conntrack_htable_size = 16384; -- if (nf_conntrack_htable_size < 32) -- nf_conntrack_htable_size = 32; -+ nf_conntrack_htable_size = 65536; - -- /* Use a max. factor of four by default to get the same max as -- * with the old struct list_heads. When a table size is given -- * we use the old value of 8 to avoid reducing the max. -- * entries. */ -- max_factor = 4; -+ if (nf_conntrack_htable_size < 1024) -+ nf_conntrack_htable_size = 1024; -+ /* Use a max. factor of one by default to keep the average -+ * hash chain length at 2 entries. Each entry has to be added -+ * twice (once for original direction, once for reply). -+ * When a table size is given we use the old value of 8 to -+ * avoid implicit reduction of the max entries setting. -+ */ -+ max_factor = 1; - } - - nf_conntrack_hash = nf_ct_alloc_hashtable(&nf_conntrack_htable_size, 1); diff --git a/target/linux/generic/backport-5.10/613-v5.15-01-netfilter-flowtable-remove-nf_ct_l4proto_find-call.patch b/target/linux/generic/backport-5.10/613-v5.15-01-netfilter-flowtable-remove-nf_ct_l4proto_find-call.patch deleted file mode 100644 index 72accec50c..0000000000 --- a/target/linux/generic/backport-5.10/613-v5.15-01-netfilter-flowtable-remove-nf_ct_l4proto_find-call.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 92fb15513edc6ae1eb51f717e70d4d3d538c2d09 Mon Sep 17 00:00:00 2001 -From: Pablo Neira Ayuso -Date: Mon, 19 Jul 2021 18:04:01 +0200 -Subject: [PATCH] netfilter: flowtable: remove nf_ct_l4proto_find() call - -TCP and UDP are built-in conntrack protocol trackers and the flowtable -only supports for TCP and UDP, remove this call. - -Signed-off-by: Pablo Neira Ayuso ---- - net/netfilter/nf_flow_table_core.c | 10 ---------- - 1 file changed, 10 deletions(-) - ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -180,15 +180,10 @@ static void flow_offload_fixup_tcp(struc - - static void flow_offload_fixup_ct_timeout(struct nf_conn *ct) - { -- const struct nf_conntrack_l4proto *l4proto; - struct net *net = nf_ct_net(ct); - int l4num = nf_ct_protonum(ct); - unsigned int timeout; - -- l4proto = nf_ct_l4proto_find(l4num); -- if (!l4proto) -- return; -- - if (l4num == IPPROTO_TCP) { - struct nf_tcp_net *tn = nf_tcp_pernet(net); - -@@ -273,15 +268,10 @@ static const struct rhashtable_params nf - - unsigned long flow_offload_get_timeout(struct flow_offload *flow) - { -- const struct nf_conntrack_l4proto *l4proto; - unsigned long timeout = NF_FLOW_TIMEOUT; - struct net *net = nf_ct_net(flow->ct); - int l4num = nf_ct_protonum(flow->ct); - -- l4proto = nf_ct_l4proto_find(l4num); -- if (!l4proto) -- return timeout; -- - if (l4num == IPPROTO_TCP) { - struct nf_tcp_net *tn = nf_tcp_pernet(net); - diff --git a/target/linux/generic/backport-5.10/613-v5.15-02-netfilter-conntrack-remove-offload_pickup-sysctl-aga.patch b/target/linux/generic/backport-5.10/613-v5.15-02-netfilter-conntrack-remove-offload_pickup-sysctl-aga.patch deleted file mode 100644 index 71266c8a70..0000000000 --- a/target/linux/generic/backport-5.10/613-v5.15-02-netfilter-conntrack-remove-offload_pickup-sysctl-aga.patch +++ /dev/null @@ -1,184 +0,0 @@ -From 4592ee7f525c4683ec9e290381601fdee50ae110 Mon Sep 17 00:00:00 2001 -From: Florian Westphal -Date: Wed, 4 Aug 2021 15:02:15 +0200 -Subject: [PATCH] netfilter: conntrack: remove offload_pickup sysctl again - -These two sysctls were added because the hardcoded defaults (2 minutes, -tcp, 30 seconds, udp) turned out to be too low for some setups. - -They appeared in 5.14-rc1 so it should be fine to remove it again. - -Marcelo convinced me that there should be no difference between a flow -that was offloaded vs. a flow that was not wrt. timeout handling. -Thus the default is changed to those for TCP established and UDP stream, -5 days and 120 seconds, respectively. - -Marcelo also suggested to account for the timeout value used for the -offloading, this avoids increase beyond the value in the conntrack-sysctl -and will also instantly expire the conntrack entry with altered sysctls. - -Example: - nf_conntrack_udp_timeout_stream=60 - nf_flowtable_udp_timeout=60 - -This will remove offloaded udp flows after one minute, rather than two. - -An earlier version of this patch also cleared the ASSURED bit to -allow nf_conntrack to evict the entry via early_drop (i.e., table full). -However, it looks like we can safely assume that connection timed out -via HW is still in established state, so this isn't needed. - -Quoting Oz: - [..] the hardware sends all packets with a set FIN flags to sw. - [..] Connections that are aged in hardware are expected to be in the - established state. - -In case it turns out that back-to-sw-path transition can occur for -'dodgy' connections too (e.g., one side disappeared while software-path -would have been in RETRANS timeout), we can adjust this later. - -Cc: Oz Shlomo -Cc: Paul Blakey -Suggested-by: Marcelo Ricardo Leitner -Signed-off-by: Florian Westphal -Reviewed-by: Marcelo Ricardo Leitner -Reviewed-by: Oz Shlomo -Signed-off-by: Pablo Neira Ayuso ---- - Documentation/networking/nf_conntrack-sysctl.rst | 10 ---------- - include/net/netns/conntrack.h | 2 -- - net/netfilter/nf_conntrack_proto_tcp.c | 1 - - net/netfilter/nf_conntrack_proto_udp.c | 1 - - net/netfilter/nf_conntrack_standalone.c | 16 ---------------- - net/netfilter/nf_flow_table_core.c | 11 ++++++++--- - 6 files changed, 8 insertions(+), 33 deletions(-) - ---- a/include/net/netns/conntrack.h -+++ b/include/net/netns/conntrack.h -@@ -29,7 +29,6 @@ struct nf_tcp_net { - int tcp_max_retrans; - #if IS_ENABLED(CONFIG_NF_FLOW_TABLE) - unsigned int offload_timeout; -- unsigned int offload_pickup; - #endif - }; - -@@ -43,7 +42,6 @@ struct nf_udp_net { - unsigned int timeouts[UDP_CT_MAX]; - #if IS_ENABLED(CONFIG_NF_FLOW_TABLE) - unsigned int offload_timeout; -- unsigned int offload_pickup; - #endif - }; - ---- a/net/netfilter/nf_conntrack_proto_tcp.c -+++ b/net/netfilter/nf_conntrack_proto_tcp.c -@@ -1460,7 +1460,6 @@ void nf_conntrack_tcp_init_net(struct ne - - #if IS_ENABLED(CONFIG_NF_FLOW_TABLE) - tn->offload_timeout = 30 * HZ; -- tn->offload_pickup = 120 * HZ; - #endif - } - ---- a/net/netfilter/nf_conntrack_proto_udp.c -+++ b/net/netfilter/nf_conntrack_proto_udp.c -@@ -276,7 +276,6 @@ void nf_conntrack_udp_init_net(struct ne - - #if IS_ENABLED(CONFIG_NF_FLOW_TABLE) - un->offload_timeout = 30 * HZ; -- un->offload_pickup = 30 * HZ; - #endif - } - ---- a/net/netfilter/nf_conntrack_standalone.c -+++ b/net/netfilter/nf_conntrack_standalone.c -@@ -569,7 +569,6 @@ enum nf_ct_sysctl_index { - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_UNACK, - #if IS_ENABLED(CONFIG_NF_FLOW_TABLE) - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD, -- NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD_PICKUP, - #endif - NF_SYSCTL_CT_PROTO_TCP_LOOSE, - NF_SYSCTL_CT_PROTO_TCP_LIBERAL, -@@ -578,7 +577,6 @@ enum nf_ct_sysctl_index { - NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM, - #if IS_ENABLED(CONFIG_NF_FLOW_TABLE) - NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD, -- NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD_PICKUP, - #endif - NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP, - NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6, -@@ -772,12 +770,6 @@ static struct ctl_table nf_ct_sysctl_tab - .mode = 0644, - .proc_handler = proc_dointvec_jiffies, - }, -- [NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD_PICKUP] = { -- .procname = "nf_flowtable_tcp_pickup", -- .maxlen = sizeof(unsigned int), -- .mode = 0644, -- .proc_handler = proc_dointvec_jiffies, -- }, - #endif - [NF_SYSCTL_CT_PROTO_TCP_LOOSE] = { - .procname = "nf_conntrack_tcp_loose", -@@ -820,12 +812,6 @@ static struct ctl_table nf_ct_sysctl_tab - .mode = 0644, - .proc_handler = proc_dointvec_jiffies, - }, -- [NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD_PICKUP] = { -- .procname = "nf_flowtable_udp_pickup", -- .maxlen = sizeof(unsigned int), -- .mode = 0644, -- .proc_handler = proc_dointvec_jiffies, -- }, - #endif - [NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP] = { - .procname = "nf_conntrack_icmp_timeout", -@@ -999,7 +985,6 @@ static void nf_conntrack_standalone_init - - #if IS_ENABLED(CONFIG_NF_FLOW_TABLE) - table[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD].data = &tn->offload_timeout; -- table[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD_PICKUP].data = &tn->offload_pickup; - #endif - - } -@@ -1090,7 +1075,6 @@ static int nf_conntrack_standalone_init_ - table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM].data = &un->timeouts[UDP_CT_REPLIED]; - #if IS_ENABLED(CONFIG_NF_FLOW_TABLE) - table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD].data = &un->offload_timeout; -- table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD_PICKUP].data = &un->offload_pickup; - #endif - - nf_conntrack_standalone_init_tcp_sysctl(net, table); ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -182,20 +182,25 @@ static void flow_offload_fixup_ct_timeou - { - struct net *net = nf_ct_net(ct); - int l4num = nf_ct_protonum(ct); -- unsigned int timeout; -+ s32 timeout; - - if (l4num == IPPROTO_TCP) { - struct nf_tcp_net *tn = nf_tcp_pernet(net); - -- timeout = tn->offload_pickup; -+ timeout = tn->timeouts[TCP_CONNTRACK_ESTABLISHED]; -+ timeout -= tn->offload_timeout; - } else if (l4num == IPPROTO_UDP) { - struct nf_udp_net *tn = nf_udp_pernet(net); - -- timeout = tn->offload_pickup; -+ timeout = tn->timeouts[UDP_CT_REPLIED]; -+ timeout -= tn->offload_timeout; - } else { - return; - } - -+ if (timeout < 0) -+ timeout = 0; -+ - if (nf_flow_timeout_delta(READ_ONCE(ct->timeout)) > (__s32)timeout) - WRITE_ONCE(ct->timeout, nfct_time_stamp + timeout); - } diff --git a/target/linux/generic/backport-5.10/614-v5.18-netfilter-flowtable-fix-TCP-flow-teardown.patch b/target/linux/generic/backport-5.10/614-v5.18-netfilter-flowtable-fix-TCP-flow-teardown.patch deleted file mode 100644 index 1b422ca4af..0000000000 --- a/target/linux/generic/backport-5.10/614-v5.18-netfilter-flowtable-fix-TCP-flow-teardown.patch +++ /dev/null @@ -1,166 +0,0 @@ -From b8835ba8c029b5c9ada5666754526c2b00f7ea80 Mon Sep 17 00:00:00 2001 -From: Pablo Neira Ayuso -Date: Tue, 17 May 2022 10:44:14 +0200 -Subject: netfilter: flowtable: fix TCP flow teardown - -[ Upstream commit e5eaac2beb54f0a16ff851125082d9faeb475572 ] - -This patch addresses three possible problems: - -1. ct gc may race to undo the timeout adjustment of the packet path, leaving - the conntrack entry in place with the internal offload timeout (one day). - -2. ct gc removes the ct because the IPS_OFFLOAD_BIT is not set and the CLOSE - timeout is reached before the flow offload del. - -3. tcp ct is always set to ESTABLISHED with a very long timeout - in flow offload teardown/delete even though the state might be already - CLOSED. Also as a remark we cannot assume that the FIN or RST packet - is hitting flow table teardown as the packet might get bumped to the - slow path in nftables. - -This patch resets IPS_OFFLOAD_BIT from flow_offload_teardown(), so -conntrack handles the tcp rst/fin packet which triggers the CLOSE/FIN -state transition. - -Moreover, teturn the connection's ownership to conntrack upon teardown -by clearing the offload flag and fixing the established timeout value. -The flow table GC thread will asynchonrnously free the flow table and -hardware offload entries. - -Before this patch, the IPS_OFFLOAD_BIT remained set for expired flows on -which is also misleading since the flow is back to classic conntrack -path. - -If nf_ct_delete() removes the entry from the conntrack table, then it -calls nf_ct_put() which decrements the refcnt. This is not a problem -because the flowtable holds a reference to the conntrack object from -flow_offload_alloc() path which is released via flow_offload_free(). - -This patch also updates nft_flow_offload to skip packets in SYN_RECV -state. Since we might miss or bump packets to slow path, we do not know -what will happen there while we are still in SYN_RECV, this patch -postpones offload up to the next packet which also aligns to the -existing behaviour in tc-ct. - -flow_offload_teardown() does not reset the existing tcp state from -flow_offload_fixup_tcp() to ESTABLISHED anymore, packets bump to slow -path might have already update the state to CLOSE/FIN. - -Joint work with Oz and Sven. - -Fixes: 1e5b2471bcc4 ("netfilter: nf_flow_table: teardown flow timeout race") -Signed-off-by: Oz Shlomo -Signed-off-by: Sven Auhagen -Signed-off-by: Pablo Neira Ayuso -Signed-off-by: Sasha Levin ---- - net/netfilter/nf_flow_table_core.c | 33 +++++++----------------------- - net/netfilter/nft_flow_offload.c | 3 ++- - 2 files changed, 9 insertions(+), 27 deletions(-) - ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -173,12 +173,11 @@ EXPORT_SYMBOL_GPL(flow_offload_route_ini - - static void flow_offload_fixup_tcp(struct ip_ct_tcp *tcp) - { -- tcp->state = TCP_CONNTRACK_ESTABLISHED; - tcp->seen[0].td_maxwin = 0; - tcp->seen[1].td_maxwin = 0; - } - --static void flow_offload_fixup_ct_timeout(struct nf_conn *ct) -+static void flow_offload_fixup_ct(struct nf_conn *ct) - { - struct net *net = nf_ct_net(ct); - int l4num = nf_ct_protonum(ct); -@@ -187,7 +186,9 @@ static void flow_offload_fixup_ct_timeou - if (l4num == IPPROTO_TCP) { - struct nf_tcp_net *tn = nf_tcp_pernet(net); - -- timeout = tn->timeouts[TCP_CONNTRACK_ESTABLISHED]; -+ flow_offload_fixup_tcp(&ct->proto.tcp); -+ -+ timeout = tn->timeouts[ct->proto.tcp.state]; - timeout -= tn->offload_timeout; - } else if (l4num == IPPROTO_UDP) { - struct nf_udp_net *tn = nf_udp_pernet(net); -@@ -205,18 +206,6 @@ static void flow_offload_fixup_ct_timeou - WRITE_ONCE(ct->timeout, nfct_time_stamp + timeout); - } - --static void flow_offload_fixup_ct_state(struct nf_conn *ct) --{ -- if (nf_ct_protonum(ct) == IPPROTO_TCP) -- flow_offload_fixup_tcp(&ct->proto.tcp); --} -- --static void flow_offload_fixup_ct(struct nf_conn *ct) --{ -- flow_offload_fixup_ct_state(ct); -- flow_offload_fixup_ct_timeout(ct); --} -- - static void flow_offload_route_release(struct flow_offload *flow) - { - nft_flow_dst_release(flow, FLOW_OFFLOAD_DIR_ORIGINAL); -@@ -353,22 +342,14 @@ static void flow_offload_del(struct nf_f - rhashtable_remove_fast(&flow_table->rhashtable, - &flow->tuplehash[FLOW_OFFLOAD_DIR_REPLY].node, - nf_flow_offload_rhash_params); -- -- clear_bit(IPS_OFFLOAD_BIT, &flow->ct->status); -- -- if (nf_flow_has_expired(flow)) -- flow_offload_fixup_ct(flow->ct); -- else -- flow_offload_fixup_ct_timeout(flow->ct); -- - flow_offload_free(flow); - } - - void flow_offload_teardown(struct flow_offload *flow) - { -+ clear_bit(IPS_OFFLOAD_BIT, &flow->ct->status); - set_bit(NF_FLOW_TEARDOWN, &flow->flags); -- -- flow_offload_fixup_ct_state(flow->ct); -+ flow_offload_fixup_ct(flow->ct); - } - EXPORT_SYMBOL_GPL(flow_offload_teardown); - -@@ -437,7 +418,7 @@ static void nf_flow_offload_gc_step(stru - - if (nf_flow_has_expired(flow) || - nf_ct_is_dying(flow->ct)) -- set_bit(NF_FLOW_TEARDOWN, &flow->flags); -+ flow_offload_teardown(flow); - - if (test_bit(NF_FLOW_TEARDOWN, &flow->flags)) { - if (test_bit(NF_FLOW_HW, &flow->flags)) { ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -268,6 +268,12 @@ static bool nft_flow_offload_skip(struct - return false; - } - -+static bool nf_conntrack_tcp_established(const struct nf_conn *ct) -+{ -+ return ct->proto.tcp.state == TCP_CONNTRACK_ESTABLISHED && -+ test_bit(IPS_ASSURED_BIT, &ct->status); -+} -+ - static void nft_flow_offload_eval(const struct nft_expr *expr, - struct nft_regs *regs, - const struct nft_pktinfo *pkt) -@@ -293,7 +299,8 @@ static void nft_flow_offload_eval(const - case IPPROTO_TCP: - tcph = skb_header_pointer(pkt->skb, pkt->xt.thoff, - sizeof(_tcph), &_tcph); -- if (unlikely(!tcph || tcph->fin || tcph->rst)) -+ if (unlikely(!tcph || tcph->fin || tcph->rst || -+ !nf_conntrack_tcp_established(ct))) - goto out; - break; - case IPPROTO_UDP: diff --git a/target/linux/generic/backport-5.10/705-net-phy-at803x-select-correct-page-on-config-init.patch b/target/linux/generic/backport-5.10/705-net-phy-at803x-select-correct-page-on-config-init.patch deleted file mode 100644 index 00be403299..0000000000 --- a/target/linux/generic/backport-5.10/705-net-phy-at803x-select-correct-page-on-config-init.patch +++ /dev/null @@ -1,108 +0,0 @@ -From c329e5afb42ff0a88285eb4d8a391a18793e4777 Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Thu, 15 Apr 2021 03:26:50 +0200 -Subject: [PATCH] net: phy: at803x: select correct page on config init - -The Atheros AR8031 and AR8033 expose different registers for SGMII/Fiber -as well as the copper side of the PHY depending on the BT_BX_REG_SEL bit -in the chip configure register. - -The driver assumes the copper side is selected on probe, but this might -not be the case depending which page was last selected by the -bootloader. Notably, Ubiquiti UniFi bootloaders show this behavior. - -Select the copper page when probing to circumvent this. - -Signed-off-by: David Bauer -Signed-off-by: David S. Miller ---- - drivers/net/phy/at803x.c | 50 +++++++++++++++++++++++++++++++++++++++- - 1 file changed, 49 insertions(+), 1 deletion(-) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -139,6 +139,9 @@ - #define ATH8035_PHY_ID 0x004dd072 - #define AT8030_PHY_ID_MASK 0xffffffef - -+#define AT803X_PAGE_FIBER 0 -+#define AT803X_PAGE_COPPER 1 -+ - MODULE_DESCRIPTION("Qualcomm Atheros AR803x PHY driver"); - MODULE_AUTHOR("Matus Ujhelyi"); - MODULE_LICENSE("GPL"); -@@ -190,6 +193,35 @@ static int at803x_debug_reg_mask(struct - return phy_write(phydev, AT803X_DEBUG_DATA, val); - } - -+static int at803x_write_page(struct phy_device *phydev, int page) -+{ -+ int mask; -+ int set; -+ -+ if (page == AT803X_PAGE_COPPER) { -+ set = AT803X_BT_BX_REG_SEL; -+ mask = 0; -+ } else { -+ set = 0; -+ mask = AT803X_BT_BX_REG_SEL; -+ } -+ -+ return __phy_modify(phydev, AT803X_REG_CHIP_CONFIG, mask, set); -+} -+ -+static int at803x_read_page(struct phy_device *phydev) -+{ -+ int ccr = __phy_read(phydev, AT803X_REG_CHIP_CONFIG); -+ -+ if (ccr < 0) -+ return ccr; -+ -+ if (ccr & AT803X_BT_BX_REG_SEL) -+ return AT803X_PAGE_COPPER; -+ -+ return AT803X_PAGE_FIBER; -+} -+ - static int at803x_enable_rx_delay(struct phy_device *phydev) - { - return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, 0, -@@ -508,6 +540,7 @@ static int at803x_probe(struct phy_devic - { - struct device *dev = &phydev->mdio.dev; - struct at803x_priv *priv; -+ int ret; - - priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); - if (!priv) -@@ -515,7 +548,20 @@ static int at803x_probe(struct phy_devic - - phydev->priv = priv; - -- return at803x_parse_dt(phydev); -+ ret = at803x_parse_dt(phydev); -+ if (ret) -+ return ret; -+ -+ /* Some bootloaders leave the fiber page selected. -+ * Switch to the copper page, as otherwise we read -+ * the PHY capabilities from the fiber side. -+ */ -+ if (at803x_match_phy_id(phydev, ATH8031_PHY_ID)) { -+ ret = phy_select_page(phydev, AT803X_PAGE_COPPER); -+ ret = phy_restore_page(phydev, AT803X_PAGE_COPPER, ret); -+ } -+ -+ return ret; - } - - static void at803x_remove(struct phy_device *phydev) -@@ -1097,6 +1143,8 @@ static struct phy_driver at803x_driver[] - .get_wol = at803x_get_wol, - .suspend = at803x_suspend, - .resume = at803x_resume, -+ .read_page = at803x_read_page, -+ .write_page = at803x_write_page, - /* PHY_GBIT_FEATURES */ - .read_status = at803x_read_status, - .aneg_done = at803x_aneg_done, diff --git a/target/linux/generic/backport-5.10/706-net-phy-at803x-fix-probe-error-if-copper-page-is-sel.patch b/target/linux/generic/backport-5.10/706-net-phy-at803x-fix-probe-error-if-copper-page-is-sel.patch deleted file mode 100644 index d6ec7450e8..0000000000 --- a/target/linux/generic/backport-5.10/706-net-phy-at803x-fix-probe-error-if-copper-page-is-sel.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 8f7e876273e294b732b42af2e5e6bba91d798954 Mon Sep 17 00:00:00 2001 -From: Michael Walle -Date: Tue, 20 Apr 2021 12:29:29 +0200 -Subject: [PATCH] net: phy: at803x: fix probe error if copper page is selected - -The commit c329e5afb42f ("net: phy: at803x: select correct page on -config init") selects the copper page during probe. This fails if the -copper page was already selected. In this case, the value of the copper -page (which is 1) is propagated through phy_restore_page() and is -finally returned for at803x_probe(). Fix it, by just using the -at803x_page_write() directly. - -Also in case of an error, the regulator is not disabled and leads to a -WARN_ON() when the probe fails. This couldn't happen before, because -at803x_parse_dt() was the last call in at803x_probe(). It is hard to -see, that the parse_dt() actually enables the regulator. Thus move the -regulator_enable() to the probe function and undo it in case of an -error. - -Fixes: c329e5afb42f ("net: phy: at803x: select correct page on config init") -Signed-off-by: Michael Walle -Reviewed-by: David Bauer -Signed-off-by: David S. Miller ---- - drivers/net/phy/at803x.c | 23 +++++++++++++++++------ - 1 file changed, 17 insertions(+), 6 deletions(-) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -527,10 +527,6 @@ static int at803x_parse_dt(struct phy_de - phydev_err(phydev, "failed to get VDDIO regulator\n"); - return PTR_ERR(priv->vddio); - } -- -- ret = regulator_enable(priv->vddio); -- if (ret < 0) -- return ret; - } - - return 0; -@@ -552,15 +548,30 @@ static int at803x_probe(struct phy_devic - if (ret) - return ret; - -+ if (priv->vddio) { -+ ret = regulator_enable(priv->vddio); -+ if (ret < 0) -+ return ret; -+ } -+ - /* Some bootloaders leave the fiber page selected. - * Switch to the copper page, as otherwise we read - * the PHY capabilities from the fiber side. - */ - if (at803x_match_phy_id(phydev, ATH8031_PHY_ID)) { -- ret = phy_select_page(phydev, AT803X_PAGE_COPPER); -- ret = phy_restore_page(phydev, AT803X_PAGE_COPPER, ret); -+ phy_lock_mdio_bus(phydev); -+ ret = at803x_write_page(phydev, AT803X_PAGE_COPPER); -+ phy_unlock_mdio_bus(phydev); -+ if (ret) -+ goto err; - } - -+ return 0; -+ -+err: -+ if (priv->vddio) -+ regulator_disable(priv->vddio); -+ - return ret; - } - diff --git a/target/linux/generic/backport-5.10/710-v5.12-net-phy-Add-100-base-x-mode.patch b/target/linux/generic/backport-5.10/710-v5.12-net-phy-Add-100-base-x-mode.patch deleted file mode 100644 index 5c7f97ea90..0000000000 --- a/target/linux/generic/backport-5.10/710-v5.12-net-phy-Add-100-base-x-mode.patch +++ /dev/null @@ -1,56 +0,0 @@ -From b1ae3587d16a8c8fc9453e147c8708d6f006ffbb Mon Sep 17 00:00:00 2001 -From: Bjarni Jonasson -Date: Wed, 13 Jan 2021 12:56:25 +0100 -Subject: [PATCH] net: phy: Add 100 base-x mode - -Sparx-5 supports this mode and it is missing in the PHY core. - -Signed-off-by: Bjarni Jonasson -Reviewed-by: Russell King -Signed-off-by: Jakub Kicinski ---- - Documentation/networking/phy.rst | 5 +++++ - include/linux/phy.h | 4 ++++ - 2 files changed, 9 insertions(+) - ---- a/Documentation/networking/phy.rst -+++ b/Documentation/networking/phy.rst -@@ -286,6 +286,11 @@ Some of the interface modes are describe - Note: due to legacy usage, some 10GBASE-R usage incorrectly makes - use of this definition. - -+``PHY_INTERFACE_MODE_100BASEX`` -+ This defines IEEE 802.3 Clause 24. The link operates at a fixed data -+ rate of 125Mpbs using a 4B/5B encoding scheme, resulting in an underlying -+ data rate of 100Mpbs. -+ - Pause frames / flow control - =========================== - ---- a/include/linux/phy.h -+++ b/include/linux/phy.h -@@ -104,6 +104,7 @@ extern const int phy_10gbit_features_arr - * @PHY_INTERFACE_MODE_MOCA: Multimedia over Coax - * @PHY_INTERFACE_MODE_QSGMII: Quad SGMII - * @PHY_INTERFACE_MODE_TRGMII: Turbo RGMII -+ * @PHY_INTERFACE_MODE_100BASEX: 100 BaseX - * @PHY_INTERFACE_MODE_1000BASEX: 1000 BaseX - * @PHY_INTERFACE_MODE_2500BASEX: 2500 BaseX - * @PHY_INTERFACE_MODE_RXAUI: Reduced XAUI -@@ -135,6 +136,7 @@ typedef enum { - PHY_INTERFACE_MODE_MOCA, - PHY_INTERFACE_MODE_QSGMII, - PHY_INTERFACE_MODE_TRGMII, -+ PHY_INTERFACE_MODE_100BASEX, - PHY_INTERFACE_MODE_1000BASEX, - PHY_INTERFACE_MODE_2500BASEX, - PHY_INTERFACE_MODE_RXAUI, -@@ -217,6 +219,8 @@ static inline const char *phy_modes(phy_ - return "usxgmii"; - case PHY_INTERFACE_MODE_10GKR: - return "10gbase-kr"; -+ case PHY_INTERFACE_MODE_100BASEX: -+ return "100base-x"; - default: - return "unknown"; - } diff --git a/target/linux/generic/backport-5.10/711-v5.12-sfp-add-support-for-100-base-x-SFPs.patch b/target/linux/generic/backport-5.10/711-v5.12-sfp-add-support-for-100-base-x-SFPs.patch deleted file mode 100644 index 0c87532e13..0000000000 --- a/target/linux/generic/backport-5.10/711-v5.12-sfp-add-support-for-100-base-x-SFPs.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 6e12f35cef6b8a458d7ecf507ae330e0bffaad8c Mon Sep 17 00:00:00 2001 -From: Bjarni Jonasson -Date: Wed, 13 Jan 2021 12:56:26 +0100 -Subject: [PATCH] sfp: add support for 100 base-x SFPs - -Add support for 100Base-FX, 100Base-LX, 100Base-PX and 100Base-BX10 modules -This is needed for Sparx-5 switch. - -Signed-off-by: Bjarni Jonasson -Reviewed-by: Russell King -Signed-off-by: Jakub Kicinski ---- - drivers/net/phy/sfp-bus.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - ---- a/drivers/net/phy/sfp-bus.c -+++ b/drivers/net/phy/sfp-bus.c -@@ -286,6 +286,12 @@ void sfp_parse_support(struct sfp_bus *b - br_min <= 1300 && br_max >= 1200) - phylink_set(modes, 1000baseX_Full); - -+ /* 100Base-FX, 100Base-LX, 100Base-PX, 100Base-BX10 */ -+ if (id->base.e100_base_fx || id->base.e100_base_lx) -+ phylink_set(modes, 100baseFX_Full); -+ if ((id->base.e_base_px || id->base.e_base_bx10) && br_nom == 100) -+ phylink_set(modes, 100baseFX_Full); -+ - /* For active or passive cables, select the link modes - * based on the bit rates and the cable compliance bytes. - */ -@@ -405,6 +411,9 @@ phy_interface_t sfp_select_interface(str - if (phylink_test(link_modes, 1000baseX_Full)) - return PHY_INTERFACE_MODE_1000BASEX; - -+ if (phylink_test(link_modes, 100baseFX_Full)) -+ return PHY_INTERFACE_MODE_100BASEX; -+ - dev_warn(bus->sfp_dev, "Unable to ascertain link mode\n"); - - return PHY_INTERFACE_MODE_NA; diff --git a/target/linux/generic/backport-5.10/712-v5.13-net-phy-marvell-refactor-HWMON-OOP-style.patch b/target/linux/generic/backport-5.10/712-v5.13-net-phy-marvell-refactor-HWMON-OOP-style.patch deleted file mode 100644 index 278df46313..0000000000 --- a/target/linux/generic/backport-5.10/712-v5.13-net-phy-marvell-refactor-HWMON-OOP-style.patch +++ /dev/null @@ -1,549 +0,0 @@ -From 41d26bf4aba070dfd2ab48866cc27a48ee6228c7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Tue, 20 Apr 2021 09:53:59 +0200 -Subject: [PATCH] net: phy: marvell: refactor HWMON OOP style -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Use a structure of Marvell PHY specific HWMON methods to reduce code -duplication. Store a pointer to this structure into the PHY driver's -driver_data member. - -Signed-off-by: Marek Behún -Signed-off-by: David S. Miller ---- - drivers/net/phy/marvell.c | 369 +++++++++++++------------------------- - 1 file changed, 125 insertions(+), 244 deletions(-) - ---- a/drivers/net/phy/marvell.c -+++ b/drivers/net/phy/marvell.c -@@ -2141,6 +2141,19 @@ static int marvell_vct7_cable_test_get_s - } - - #ifdef CONFIG_HWMON -+struct marvell_hwmon_ops { -+ int (*get_temp)(struct phy_device *phydev, long *temp); -+ int (*get_temp_critical)(struct phy_device *phydev, long *temp); -+ int (*set_temp_critical)(struct phy_device *phydev, long temp); -+ int (*get_temp_alarm)(struct phy_device *phydev, long *alarm); -+}; -+ -+static const struct marvell_hwmon_ops * -+to_marvell_hwmon_ops(const struct phy_device *phydev) -+{ -+ return phydev->drv->driver_data; -+} -+ - static int m88e1121_get_temp(struct phy_device *phydev, long *temp) - { - int oldpage; -@@ -2184,75 +2197,6 @@ error: - return phy_restore_page(phydev, oldpage, ret); - } - --static int m88e1121_hwmon_read(struct device *dev, -- enum hwmon_sensor_types type, -- u32 attr, int channel, long *temp) --{ -- struct phy_device *phydev = dev_get_drvdata(dev); -- int err; -- -- switch (attr) { -- case hwmon_temp_input: -- err = m88e1121_get_temp(phydev, temp); -- break; -- default: -- return -EOPNOTSUPP; -- } -- -- return err; --} -- --static umode_t m88e1121_hwmon_is_visible(const void *data, -- enum hwmon_sensor_types type, -- u32 attr, int channel) --{ -- if (type != hwmon_temp) -- return 0; -- -- switch (attr) { -- case hwmon_temp_input: -- return 0444; -- default: -- return 0; -- } --} -- --static u32 m88e1121_hwmon_chip_config[] = { -- HWMON_C_REGISTER_TZ, -- 0 --}; -- --static const struct hwmon_channel_info m88e1121_hwmon_chip = { -- .type = hwmon_chip, -- .config = m88e1121_hwmon_chip_config, --}; -- --static u32 m88e1121_hwmon_temp_config[] = { -- HWMON_T_INPUT, -- 0 --}; -- --static const struct hwmon_channel_info m88e1121_hwmon_temp = { -- .type = hwmon_temp, -- .config = m88e1121_hwmon_temp_config, --}; -- --static const struct hwmon_channel_info *m88e1121_hwmon_info[] = { -- &m88e1121_hwmon_chip, -- &m88e1121_hwmon_temp, -- NULL --}; -- --static const struct hwmon_ops m88e1121_hwmon_hwmon_ops = { -- .is_visible = m88e1121_hwmon_is_visible, -- .read = m88e1121_hwmon_read, --}; -- --static const struct hwmon_chip_info m88e1121_hwmon_chip_info = { -- .ops = &m88e1121_hwmon_hwmon_ops, -- .info = m88e1121_hwmon_info, --}; -- - static int m88e1510_get_temp(struct phy_device *phydev, long *temp) - { - int ret; -@@ -2315,92 +2259,6 @@ static int m88e1510_get_temp_alarm(struc - return 0; - } - --static int m88e1510_hwmon_read(struct device *dev, -- enum hwmon_sensor_types type, -- u32 attr, int channel, long *temp) --{ -- struct phy_device *phydev = dev_get_drvdata(dev); -- int err; -- -- switch (attr) { -- case hwmon_temp_input: -- err = m88e1510_get_temp(phydev, temp); -- break; -- case hwmon_temp_crit: -- err = m88e1510_get_temp_critical(phydev, temp); -- break; -- case hwmon_temp_max_alarm: -- err = m88e1510_get_temp_alarm(phydev, temp); -- break; -- default: -- return -EOPNOTSUPP; -- } -- -- return err; --} -- --static int m88e1510_hwmon_write(struct device *dev, -- enum hwmon_sensor_types type, -- u32 attr, int channel, long temp) --{ -- struct phy_device *phydev = dev_get_drvdata(dev); -- int err; -- -- switch (attr) { -- case hwmon_temp_crit: -- err = m88e1510_set_temp_critical(phydev, temp); -- break; -- default: -- return -EOPNOTSUPP; -- } -- return err; --} -- --static umode_t m88e1510_hwmon_is_visible(const void *data, -- enum hwmon_sensor_types type, -- u32 attr, int channel) --{ -- if (type != hwmon_temp) -- return 0; -- -- switch (attr) { -- case hwmon_temp_input: -- case hwmon_temp_max_alarm: -- return 0444; -- case hwmon_temp_crit: -- return 0644; -- default: -- return 0; -- } --} -- --static u32 m88e1510_hwmon_temp_config[] = { -- HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_MAX_ALARM, -- 0 --}; -- --static const struct hwmon_channel_info m88e1510_hwmon_temp = { -- .type = hwmon_temp, -- .config = m88e1510_hwmon_temp_config, --}; -- --static const struct hwmon_channel_info *m88e1510_hwmon_info[] = { -- &m88e1121_hwmon_chip, -- &m88e1510_hwmon_temp, -- NULL --}; -- --static const struct hwmon_ops m88e1510_hwmon_hwmon_ops = { -- .is_visible = m88e1510_hwmon_is_visible, -- .read = m88e1510_hwmon_read, -- .write = m88e1510_hwmon_write, --}; -- --static const struct hwmon_chip_info m88e1510_hwmon_chip_info = { -- .ops = &m88e1510_hwmon_hwmon_ops, -- .info = m88e1510_hwmon_info, --}; -- - static int m88e6390_get_temp(struct phy_device *phydev, long *temp) - { - int sum = 0; -@@ -2459,63 +2317,112 @@ error: - return ret; - } - --static int m88e6390_hwmon_read(struct device *dev, -- enum hwmon_sensor_types type, -- u32 attr, int channel, long *temp) -+static int marvell_hwmon_read(struct device *dev, enum hwmon_sensor_types type, -+ u32 attr, int channel, long *temp) - { - struct phy_device *phydev = dev_get_drvdata(dev); -- int err; -+ const struct marvell_hwmon_ops *ops = to_marvell_hwmon_ops(phydev); -+ int err = -EOPNOTSUPP; - - switch (attr) { - case hwmon_temp_input: -- err = m88e6390_get_temp(phydev, temp); -+ if (ops->get_temp) -+ err = ops->get_temp(phydev, temp); -+ break; -+ case hwmon_temp_crit: -+ if (ops->get_temp_critical) -+ err = ops->get_temp_critical(phydev, temp); -+ break; -+ case hwmon_temp_max_alarm: -+ if (ops->get_temp_alarm) -+ err = ops->get_temp_alarm(phydev, temp); -+ break; -+ } -+ -+ return err; -+} -+ -+static int marvell_hwmon_write(struct device *dev, enum hwmon_sensor_types type, -+ u32 attr, int channel, long temp) -+{ -+ struct phy_device *phydev = dev_get_drvdata(dev); -+ const struct marvell_hwmon_ops *ops = to_marvell_hwmon_ops(phydev); -+ int err = -EOPNOTSUPP; -+ -+ switch (attr) { -+ case hwmon_temp_crit: -+ if (ops->set_temp_critical) -+ err = ops->set_temp_critical(phydev, temp); - break; - default: -- return -EOPNOTSUPP; -+ fallthrough; - } - - return err; - } - --static umode_t m88e6390_hwmon_is_visible(const void *data, -- enum hwmon_sensor_types type, -- u32 attr, int channel) -+static umode_t marvell_hwmon_is_visible(const void *data, -+ enum hwmon_sensor_types type, -+ u32 attr, int channel) - { -+ const struct phy_device *phydev = data; -+ const struct marvell_hwmon_ops *ops = to_marvell_hwmon_ops(phydev); -+ - if (type != hwmon_temp) - return 0; - - switch (attr) { - case hwmon_temp_input: -- return 0444; -+ return ops->get_temp ? 0444 : 0; -+ case hwmon_temp_max_alarm: -+ return ops->get_temp_alarm ? 0444 : 0; -+ case hwmon_temp_crit: -+ return (ops->get_temp_critical ? 0444 : 0) | -+ (ops->set_temp_critical ? 0200 : 0); - default: - return 0; - } - } - --static u32 m88e6390_hwmon_temp_config[] = { -- HWMON_T_INPUT, -+static u32 marvell_hwmon_chip_config[] = { -+ HWMON_C_REGISTER_TZ, - 0 - }; - --static const struct hwmon_channel_info m88e6390_hwmon_temp = { -+static const struct hwmon_channel_info marvell_hwmon_chip = { -+ .type = hwmon_chip, -+ .config = marvell_hwmon_chip_config, -+}; -+ -+/* we can define HWMON_T_CRIT and HWMON_T_MAX_ALARM even though these are not -+ * defined for all PHYs, because the hwmon code checks whether the attributes -+ * exists via the .is_visible method -+ */ -+static u32 marvell_hwmon_temp_config[] = { -+ HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_MAX_ALARM, -+ 0 -+}; -+ -+static const struct hwmon_channel_info marvell_hwmon_temp = { - .type = hwmon_temp, -- .config = m88e6390_hwmon_temp_config, -+ .config = marvell_hwmon_temp_config, - }; - --static const struct hwmon_channel_info *m88e6390_hwmon_info[] = { -- &m88e1121_hwmon_chip, -- &m88e6390_hwmon_temp, -+static const struct hwmon_channel_info *marvell_hwmon_info[] = { -+ &marvell_hwmon_chip, -+ &marvell_hwmon_temp, - NULL - }; - --static const struct hwmon_ops m88e6390_hwmon_hwmon_ops = { -- .is_visible = m88e6390_hwmon_is_visible, -- .read = m88e6390_hwmon_read, -+static const struct hwmon_ops marvell_hwmon_hwmon_ops = { -+ .is_visible = marvell_hwmon_is_visible, -+ .read = marvell_hwmon_read, -+ .write = marvell_hwmon_write, - }; - --static const struct hwmon_chip_info m88e6390_hwmon_chip_info = { -- .ops = &m88e6390_hwmon_hwmon_ops, -- .info = m88e6390_hwmon_info, -+static const struct hwmon_chip_info marvell_hwmon_chip_info = { -+ .ops = &marvell_hwmon_hwmon_ops, -+ .info = marvell_hwmon_info, - }; - - static int marvell_hwmon_name(struct phy_device *phydev) -@@ -2538,49 +2445,48 @@ static int marvell_hwmon_name(struct phy - return 0; - } - --static int marvell_hwmon_probe(struct phy_device *phydev, -- const struct hwmon_chip_info *chip) -+static int marvell_hwmon_probe(struct phy_device *phydev) - { -+ const struct marvell_hwmon_ops *ops = to_marvell_hwmon_ops(phydev); - struct marvell_priv *priv = phydev->priv; - struct device *dev = &phydev->mdio.dev; - int err; - -+ if (!ops) -+ return 0; -+ - err = marvell_hwmon_name(phydev); - if (err) - return err; - - priv->hwmon_dev = devm_hwmon_device_register_with_info( -- dev, priv->hwmon_name, phydev, chip, NULL); -+ dev, priv->hwmon_name, phydev, &marvell_hwmon_chip_info, NULL); - - return PTR_ERR_OR_ZERO(priv->hwmon_dev); - } - --static int m88e1121_hwmon_probe(struct phy_device *phydev) --{ -- return marvell_hwmon_probe(phydev, &m88e1121_hwmon_chip_info); --} -+static const struct marvell_hwmon_ops m88e1121_hwmon_ops = { -+ .get_temp = m88e1121_get_temp, -+}; - --static int m88e1510_hwmon_probe(struct phy_device *phydev) --{ -- return marvell_hwmon_probe(phydev, &m88e1510_hwmon_chip_info); --} -+static const struct marvell_hwmon_ops m88e1510_hwmon_ops = { -+ .get_temp = m88e1510_get_temp, -+ .get_temp_critical = m88e1510_get_temp_critical, -+ .set_temp_critical = m88e1510_set_temp_critical, -+ .get_temp_alarm = m88e1510_get_temp_alarm, -+}; -+ -+static const struct marvell_hwmon_ops m88e6390_hwmon_ops = { -+ .get_temp = m88e6390_get_temp, -+}; -+ -+#define DEF_MARVELL_HWMON_OPS(s) (&(s)) - --static int m88e6390_hwmon_probe(struct phy_device *phydev) --{ -- return marvell_hwmon_probe(phydev, &m88e6390_hwmon_chip_info); --} - #else --static int m88e1121_hwmon_probe(struct phy_device *phydev) --{ -- return 0; --} - --static int m88e1510_hwmon_probe(struct phy_device *phydev) --{ -- return 0; --} -+#define DEF_MARVELL_HWMON_OPS(s) NULL - --static int m88e6390_hwmon_probe(struct phy_device *phydev) -+static int marvell_hwmon_probe(struct phy_device *phydev) - { - return 0; - } -@@ -2596,40 +2502,7 @@ static int marvell_probe(struct phy_devi - - phydev->priv = priv; - -- return 0; --} -- --static int m88e1121_probe(struct phy_device *phydev) --{ -- int err; -- -- err = marvell_probe(phydev); -- if (err) -- return err; -- -- return m88e1121_hwmon_probe(phydev); --} -- --static int m88e1510_probe(struct phy_device *phydev) --{ -- int err; -- -- err = marvell_probe(phydev); -- if (err) -- return err; -- -- return m88e1510_hwmon_probe(phydev); --} -- --static int m88e6390_probe(struct phy_device *phydev) --{ -- int err; -- -- err = marvell_probe(phydev); -- if (err) -- return err; -- -- return m88e6390_hwmon_probe(phydev); -+ return marvell_hwmon_probe(phydev); - } - - static struct phy_driver marvell_drivers[] = { -@@ -2714,8 +2587,9 @@ static struct phy_driver marvell_drivers - .phy_id = MARVELL_PHY_ID_88E1121R, - .phy_id_mask = MARVELL_PHY_ID_MASK, - .name = "Marvell 88E1121R", -+ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1121_hwmon_ops), - /* PHY_GBIT_FEATURES */ -- .probe = m88e1121_probe, -+ .probe = marvell_probe, - .config_init = marvell_config_init, - .config_aneg = m88e1121_config_aneg, - .read_status = marvell_read_status, -@@ -2834,9 +2708,10 @@ static struct phy_driver marvell_drivers - .phy_id = MARVELL_PHY_ID_88E1510, - .phy_id_mask = MARVELL_PHY_ID_MASK, - .name = "Marvell 88E1510", -+ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), - .features = PHY_GBIT_FIBRE_FEATURES, - .flags = PHY_POLL_CABLE_TEST, -- .probe = m88e1510_probe, -+ .probe = marvell_probe, - .config_init = m88e1510_config_init, - .config_aneg = m88e1510_config_aneg, - .read_status = marvell_read_status, -@@ -2863,9 +2738,10 @@ static struct phy_driver marvell_drivers - .phy_id = MARVELL_PHY_ID_88E1540, - .phy_id_mask = MARVELL_PHY_ID_MASK, - .name = "Marvell 88E1540", -+ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), - /* PHY_GBIT_FEATURES */ - .flags = PHY_POLL_CABLE_TEST, -- .probe = m88e1510_probe, -+ .probe = marvell_probe, - .config_init = marvell_config_init, - .config_aneg = m88e1510_config_aneg, - .read_status = marvell_read_status, -@@ -2889,7 +2765,8 @@ static struct phy_driver marvell_drivers - .phy_id = MARVELL_PHY_ID_88E1545, - .phy_id_mask = MARVELL_PHY_ID_MASK, - .name = "Marvell 88E1545", -- .probe = m88e1510_probe, -+ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), -+ .probe = marvell_probe, - /* PHY_GBIT_FEATURES */ - .flags = PHY_POLL_CABLE_TEST, - .config_init = marvell_config_init, -@@ -2935,9 +2812,10 @@ static struct phy_driver marvell_drivers - .phy_id = MARVELL_PHY_ID_88E6341_FAMILY, - .phy_id_mask = MARVELL_PHY_ID_MASK, - .name = "Marvell 88E6341 Family", -+ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), - /* PHY_GBIT_FEATURES */ - .flags = PHY_POLL_CABLE_TEST, -- .probe = m88e1510_probe, -+ .probe = marvell_probe, - .config_init = marvell_config_init, - .config_aneg = m88e6390_config_aneg, - .read_status = marvell_read_status, -@@ -2961,9 +2839,10 @@ static struct phy_driver marvell_drivers - .phy_id = MARVELL_PHY_ID_88E6390_FAMILY, - .phy_id_mask = MARVELL_PHY_ID_MASK, - .name = "Marvell 88E6390 Family", -+ .driver_data = DEF_MARVELL_HWMON_OPS(m88e6390_hwmon_ops), - /* PHY_GBIT_FEATURES */ - .flags = PHY_POLL_CABLE_TEST, -- .probe = m88e6390_probe, -+ .probe = marvell_probe, - .config_init = marvell_config_init, - .config_aneg = m88e6390_config_aneg, - .read_status = marvell_read_status, -@@ -2987,7 +2866,8 @@ static struct phy_driver marvell_drivers - .phy_id = MARVELL_PHY_ID_88E1340S, - .phy_id_mask = MARVELL_PHY_ID_MASK, - .name = "Marvell 88E1340S", -- .probe = m88e1510_probe, -+ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), -+ .probe = marvell_probe, - /* PHY_GBIT_FEATURES */ - .config_init = marvell_config_init, - .config_aneg = m88e1510_config_aneg, -@@ -3009,7 +2889,8 @@ static struct phy_driver marvell_drivers - .phy_id = MARVELL_PHY_ID_88E1548P, - .phy_id_mask = MARVELL_PHY_ID_MASK, - .name = "Marvell 88E1548P", -- .probe = m88e1510_probe, -+ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), -+ .probe = marvell_probe, - .features = PHY_GBIT_FIBRE_FEATURES, - .config_init = marvell_config_init, - .config_aneg = m88e1510_config_aneg, diff --git a/target/linux/generic/backport-5.10/713-v5.15-net-phy-marvell-add-SFP-support-for-88E1510.patch b/target/linux/generic/backport-5.10/713-v5.15-net-phy-marvell-add-SFP-support-for-88E1510.patch deleted file mode 100644 index b86e9bf640..0000000000 --- a/target/linux/generic/backport-5.10/713-v5.15-net-phy-marvell-add-SFP-support-for-88E1510.patch +++ /dev/null @@ -1,161 +0,0 @@ -From b697d9d38a5a5ab405d7cc4743d39fe2c5d7517c Mon Sep 17 00:00:00 2001 -From: Ivan Bornyakov -Date: Thu, 12 Aug 2021 16:42:56 +0300 -Subject: [PATCH] net: phy: marvell: add SFP support for 88E1510 - -Add support for SFP cages connected to the Marvell 88E1512 transceiver. -88E1512 supports for SGMII/1000Base-X/100Base-FX media type with RGMII -on system interface. Configure PHY to appropriate mode depending on the -type of SFP inserted. On SFP removal configure PHY to the RGMII-copper -mode so RJ-45 port can still work. - -Signed-off-by: Ivan Bornyakov -Link: https://lore.kernel.org/r/20210812134256.2436-1-i.bornyakov@metrotek.ru -Signed-off-by: Jakub Kicinski ---- - drivers/net/phy/marvell.c | 105 +++++++++++++++++++++++++++++++++++++- - 1 file changed, 104 insertions(+), 1 deletion(-) - ---- a/drivers/net/phy/marvell.c -+++ b/drivers/net/phy/marvell.c -@@ -32,6 +32,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -46,6 +47,7 @@ - #define MII_MARVELL_MISC_TEST_PAGE 0x06 - #define MII_MARVELL_VCT7_PAGE 0x07 - #define MII_MARVELL_WOL_PAGE 0x11 -+#define MII_MARVELL_MODE_PAGE 0x12 - - #define MII_M1011_IEVENT 0x13 - #define MII_M1011_IEVENT_CLEAR 0x0000 -@@ -162,7 +164,14 @@ - - #define MII_88E1510_GEN_CTRL_REG_1 0x14 - #define MII_88E1510_GEN_CTRL_REG_1_MODE_MASK 0x7 -+#define MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII 0x0 /* RGMII to copper */ - #define MII_88E1510_GEN_CTRL_REG_1_MODE_SGMII 0x1 /* SGMII to copper */ -+/* RGMII to 1000BASE-X */ -+#define MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_1000X 0x2 -+/* RGMII to 100BASE-FX */ -+#define MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_100FX 0x3 -+/* RGMII to SGMII */ -+#define MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_SGMII 0x4 - #define MII_88E1510_GEN_CTRL_REG_1_RESET 0x8000 /* Soft reset */ - - #define MII_VCT5_TX_RX_MDI0_COUPLING 0x10 -@@ -2505,6 +2514,100 @@ static int marvell_probe(struct phy_devi - return marvell_hwmon_probe(phydev); - } - -+static int m88e1510_sfp_insert(void *upstream, const struct sfp_eeprom_id *id) -+{ -+ struct phy_device *phydev = upstream; -+ phy_interface_t interface; -+ struct device *dev; -+ int oldpage; -+ int ret = 0; -+ u16 mode; -+ -+ __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, }; -+ -+ dev = &phydev->mdio.dev; -+ -+ sfp_parse_support(phydev->sfp_bus, id, supported); -+ interface = sfp_select_interface(phydev->sfp_bus, supported); -+ -+ dev_info(dev, "%s SFP module inserted\n", phy_modes(interface)); -+ -+ switch (interface) { -+ case PHY_INTERFACE_MODE_1000BASEX: -+ mode = MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_1000X; -+ -+ break; -+ case PHY_INTERFACE_MODE_100BASEX: -+ mode = MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_100FX; -+ -+ break; -+ case PHY_INTERFACE_MODE_SGMII: -+ mode = MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_SGMII; -+ -+ break; -+ default: -+ dev_err(dev, "Incompatible SFP module inserted\n"); -+ -+ return -EINVAL; -+ } -+ -+ oldpage = phy_select_page(phydev, MII_MARVELL_MODE_PAGE); -+ if (oldpage < 0) -+ goto error; -+ -+ ret = __phy_modify(phydev, MII_88E1510_GEN_CTRL_REG_1, -+ MII_88E1510_GEN_CTRL_REG_1_MODE_MASK, mode); -+ if (ret < 0) -+ goto error; -+ -+ ret = __phy_set_bits(phydev, MII_88E1510_GEN_CTRL_REG_1, -+ MII_88E1510_GEN_CTRL_REG_1_RESET); -+ -+error: -+ return phy_restore_page(phydev, oldpage, ret); -+} -+ -+static void m88e1510_sfp_remove(void *upstream) -+{ -+ struct phy_device *phydev = upstream; -+ int oldpage; -+ int ret = 0; -+ -+ oldpage = phy_select_page(phydev, MII_MARVELL_MODE_PAGE); -+ if (oldpage < 0) -+ goto error; -+ -+ ret = __phy_modify(phydev, MII_88E1510_GEN_CTRL_REG_1, -+ MII_88E1510_GEN_CTRL_REG_1_MODE_MASK, -+ MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII); -+ if (ret < 0) -+ goto error; -+ -+ ret = __phy_set_bits(phydev, MII_88E1510_GEN_CTRL_REG_1, -+ MII_88E1510_GEN_CTRL_REG_1_RESET); -+ -+error: -+ phy_restore_page(phydev, oldpage, ret); -+} -+ -+static const struct sfp_upstream_ops m88e1510_sfp_ops = { -+ .module_insert = m88e1510_sfp_insert, -+ .module_remove = m88e1510_sfp_remove, -+ .attach = phy_sfp_attach, -+ .detach = phy_sfp_detach, -+}; -+ -+static int m88e1510_probe(struct phy_device *phydev) -+{ -+ int err; -+ -+ err = marvell_probe(phydev); -+ if (err) -+ return err; -+ -+ return phy_sfp_probe(phydev, &m88e1510_sfp_ops); -+} -+ - static struct phy_driver marvell_drivers[] = { - { - .phy_id = MARVELL_PHY_ID_88E1101, -@@ -2711,7 +2814,7 @@ static struct phy_driver marvell_drivers - .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), - .features = PHY_GBIT_FIBRE_FEATURES, - .flags = PHY_POLL_CABLE_TEST, -- .probe = marvell_probe, -+ .probe = m88e1510_probe, - .config_init = m88e1510_config_init, - .config_aneg = m88e1510_config_aneg, - .read_status = marvell_read_status, diff --git a/target/linux/generic/backport-5.10/719-v5.12-net-dsa-automatically-bring-up-DSA-master-when-openi.patch b/target/linux/generic/backport-5.10/719-v5.12-net-dsa-automatically-bring-up-DSA-master-when-openi.patch deleted file mode 100644 index 3b630377f9..0000000000 --- a/target/linux/generic/backport-5.10/719-v5.12-net-dsa-automatically-bring-up-DSA-master-when-openi.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 9d5ef190e5615a7b63af89f88c4106a5bc127974 Mon Sep 17 00:00:00 2001 -From: Vladimir Oltean -Date: Fri, 5 Feb 2021 15:37:10 +0200 -Subject: [PATCH] net: dsa: automatically bring up DSA master when opening user - port - -DSA wants the master interface to be open before the user port is due to -historical reasons. The promiscuity of interfaces that are down used to -have issues, as referenced Lennert Buytenhek in commit df02c6ff2e39 -("dsa: fix master interface allmulti/promisc handling"). - -The bugfix mentioned there, commit b6c40d68ff64 ("net: only invoke -dev->change_rx_flags when device is UP"), was basically a "don't do -that" approach to working around the promiscuity while down issue. - -Further work done by Vlad Yasevich in commit d2615bf45069 ("net: core: -Always propagate flag changes to interfaces") has resolved the -underlying issue, and it is strictly up to the DSA and 8021q drivers -now, it is no longer mandated by the networking core that the master -interface must be up when changing its promiscuity. - -From DSA's point of view, deciding to error out in dsa_slave_open -because the master isn't up is -(a) a bad user experience and -(b) knocking at an open door. -Even if there still was an issue with promiscuity while down, DSA could -still just open the master and avoid it. - -Doing it this way has the additional benefit that user space can now -remove DSA-specific workarounds, like systemd-networkd with BindCarrier: -https://github.com/systemd/systemd/issues/7478 - -And we can finally remove one of the 2 bullets in the "Common pitfalls -using DSA setups" chapter. - -Tested with two cascaded DSA switches: - -$ ip link set sw0p2 up -fsl_enetc 0000:00:00.2 eno2: configuring for fixed/internal link mode -fsl_enetc 0000:00:00.2 eno2: Link is Up - 1Gbps/Full - flow control rx/tx -mscc_felix 0000:00:00.5 swp0: configuring for fixed/sgmii link mode -mscc_felix 0000:00:00.5 swp0: Link is Up - 1Gbps/Full - flow control off -8021q: adding VLAN 0 to HW filter on device swp0 -sja1105 spi2.0 sw0p2: configuring for phy/rgmii-id link mode -IPv6: ADDRCONF(NETDEV_CHANGE): eno2: link becomes ready -IPv6: ADDRCONF(NETDEV_CHANGE): swp0: link becomes ready - -Signed-off-by: Vladimir Oltean -Reviewed-by: Andrew Lunn -Reviewed-by: Florian Fainelli -Signed-off-by: Jakub Kicinski ---- - Documentation/networking/dsa/dsa.rst | 4 ---- - net/dsa/slave.c | 7 +++++-- - 2 files changed, 5 insertions(+), 6 deletions(-) - ---- a/Documentation/networking/dsa/dsa.rst -+++ b/Documentation/networking/dsa/dsa.rst -@@ -273,10 +273,6 @@ will not make us go through the switch t - the Ethernet switch on the other end, expecting a tag will typically drop this - frame. - --Slave network devices check that the master network device is UP before allowing --you to administratively bring UP these slave network devices. A common --configuration mistake is forgetting to bring UP the master network device first. -- - Interactions with other subsystems - ================================== - ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -68,8 +68,11 @@ static int dsa_slave_open(struct net_dev - struct dsa_port *dp = dsa_slave_to_port(dev); - int err; - -- if (!(master->flags & IFF_UP)) -- return -ENETDOWN; -+ err = dev_open(master, NULL); -+ if (err < 0) { -+ netdev_err(dev, "failed to open master %s\n", master->name); -+ goto out; -+ } - - if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) { - err = dev_uc_add(master, dev->dev_addr); diff --git a/target/linux/generic/backport-5.10/720-v5.12-net-bridge-notify-switchdev-of-disappearance-of-old-.patch b/target/linux/generic/backport-5.10/720-v5.12-net-bridge-notify-switchdev-of-disappearance-of-old-.patch deleted file mode 100644 index c43cb4d1f2..0000000000 --- a/target/linux/generic/backport-5.10/720-v5.12-net-bridge-notify-switchdev-of-disappearance-of-old-.patch +++ /dev/null @@ -1,126 +0,0 @@ -From 90dc8fd36078a536671adae884d0b929cce6480a Mon Sep 17 00:00:00 2001 -From: Vladimir Oltean -Date: Wed, 6 Jan 2021 11:51:30 +0200 -Subject: [PATCH] net: bridge: notify switchdev of disappearance of old FDB - entry upon migration - -Currently the bridge emits atomic switchdev notifications for -dynamically learnt FDB entries. Monitoring these notifications works -wonders for switchdev drivers that want to keep their hardware FDB in -sync with the bridge's FDB. - -For example station A wants to talk to station B in the diagram below, -and we are concerned with the behavior of the bridge on the DUT device: - - DUT - +-------------------------------------+ - | br0 | - | +------+ +------+ +------+ +------+ | - | | | | | | | | | | - | | swp0 | | swp1 | | swp2 | | eth0 | | - +-------------------------------------+ - | | | - Station A | | - | | - +--+------+--+ +--+------+--+ - | | | | | | | | - | | swp0 | | | | swp0 | | - Another | +------+ | | +------+ | Another - switch | br0 | | br0 | switch - | +------+ | | +------+ | - | | | | | | | | - | | swp1 | | | | swp1 | | - +--+------+--+ +--+------+--+ - | - Station B - -Interfaces swp0, swp1, swp2 are handled by a switchdev driver that has -the following property: frames injected from its control interface bypass -the internal address analyzer logic, and therefore, this hardware does -not learn from the source address of packets transmitted by the network -stack through it. So, since bridging between eth0 (where Station B is -attached) and swp0 (where Station A is attached) is done in software, -the switchdev hardware will never learn the source address of Station B. -So the traffic towards that destination will be treated as unknown, i.e. -flooded. - -This is where the bridge notifications come in handy. When br0 on the -DUT sees frames with Station B's MAC address on eth0, the switchdev -driver gets these notifications and can install a rule to send frames -towards Station B's address that are incoming from swp0, swp1, swp2, -only towards the control interface. This is all switchdev driver private -business, which the notification makes possible. - -All is fine until someone unplugs Station B's cable and moves it to the -other switch: - - DUT - +-------------------------------------+ - | br0 | - | +------+ +------+ +------+ +------+ | - | | | | | | | | | | - | | swp0 | | swp1 | | swp2 | | eth0 | | - +-------------------------------------+ - | | | - Station A | | - | | - +--+------+--+ +--+------+--+ - | | | | | | | | - | | swp0 | | | | swp0 | | - Another | +------+ | | +------+ | Another - switch | br0 | | br0 | switch - | +------+ | | +------+ | - | | | | | | | | - | | swp1 | | | | swp1 | | - +--+------+--+ +--+------+--+ - | - Station B - -Luckily for the use cases we care about, Station B is noisy enough that -the DUT hears it (on swp1 this time). swp1 receives the frames and -delivers them to the bridge, who enters the unlikely path in br_fdb_update -of updating an existing entry. It moves the entry in the software bridge -to swp1 and emits an addition notification towards that. - -As far as the switchdev driver is concerned, all that it needs to ensure -is that traffic between Station A and Station B is not forever broken. -If it does nothing, then the stale rule to send frames for Station B -towards the control interface remains in place. But Station B is no -longer reachable via the control interface, but via a port that can -offload the bridge port learning attribute. It's just that the port is -prevented from learning this address, since the rule overrides FDB -updates. So the rule needs to go. The question is via what mechanism. - -It sure would be possible for this switchdev driver to keep track of all -addresses which are sent to the control interface, and then also listen -for bridge notifier events on its own ports, searching for the ones that -have a MAC address which was previously sent to the control interface. -But this is cumbersome and inefficient. Instead, with one small change, -the bridge could notify of the address deletion from the old port, in a -symmetrical manner with how it did for the insertion. Then the switchdev -driver would not be required to monitor learn/forget events for its own -ports. It could just delete the rule towards the control interface upon -bridge entry migration. This would make hardware address learning be -possible again. Then it would take a few more packets until the hardware -and software FDB would be in sync again. - -Signed-off-by: Vladimir Oltean -Acked-by: Nikolay Aleksandrov -Reviewed-by: Ido Schimmel -Reviewed-by: Andrew Lunn -Reviewed-by: Florian Fainelli -Signed-off-by: Jakub Kicinski ---- - net/bridge/br_fdb.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/net/bridge/br_fdb.c -+++ b/net/bridge/br_fdb.c -@@ -602,6 +602,7 @@ void br_fdb_update(struct net_bridge *br - /* fastpath: update of existing entry */ - if (unlikely(source != fdb->dst && - !test_bit(BR_FDB_STICKY, &fdb->flags))) { -+ br_switchdev_fdb_notify(fdb, RTM_DELNEIGH); - fdb->dst = source; - fdb_modified = true; - /* Take over HW learned entry */ diff --git a/target/linux/generic/backport-5.10/721-v5.12-net-dsa-be-louder-when-a-non-legacy-FDB-operation-fa.patch b/target/linux/generic/backport-5.10/721-v5.12-net-dsa-be-louder-when-a-non-legacy-FDB-operation-fa.patch deleted file mode 100644 index f9337590f7..0000000000 --- a/target/linux/generic/backport-5.10/721-v5.12-net-dsa-be-louder-when-a-non-legacy-FDB-operation-fa.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 2fd186501b1cff155cc4a755c210793cfc0dffb5 Mon Sep 17 00:00:00 2001 -From: Vladimir Oltean -Date: Wed, 6 Jan 2021 11:51:31 +0200 -Subject: [PATCH] net: dsa: be louder when a non-legacy FDB operation fails - -The dev_close() call was added in commit c9eb3e0f8701 ("net: dsa: Add -support for learning FDB through notification") "to indicate inconsistent -situation" when we could not delete an FDB entry from the port. - -bridge fdb del d8:58:d7:00:ca:6d dev swp0 self master - -It is a bit drastic and at the same time not helpful if the above fails -to only print with netdev_dbg log level, but on the other hand to bring -the interface down. - -So increase the verbosity of the error message, and drop dev_close(). - -Signed-off-by: Vladimir Oltean -Reviewed-by: Andrew Lunn -Reviewed-by: Florian Fainelli -Signed-off-by: Jakub Kicinski ---- - net/dsa/slave.c | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -2112,7 +2112,9 @@ static void dsa_slave_switchdev_event_wo - - err = dsa_port_fdb_add(dp, fdb_info->addr, fdb_info->vid); - if (err) { -- netdev_dbg(dev, "fdb add failed err=%d\n", err); -+ netdev_err(dev, -+ "failed to add %pM vid %d to fdb: %d\n", -+ fdb_info->addr, fdb_info->vid, err); - break; - } - fdb_info->offloaded = true; -@@ -2127,9 +2129,11 @@ static void dsa_slave_switchdev_event_wo - - err = dsa_port_fdb_del(dp, fdb_info->addr, fdb_info->vid); - if (err) { -- netdev_dbg(dev, "fdb del failed err=%d\n", err); -- dev_close(dev); -+ netdev_err(dev, -+ "failed to delete %pM vid %d from fdb: %d\n", -+ fdb_info->addr, fdb_info->vid, err); - } -+ - break; - } - rtnl_unlock(); diff --git a/target/linux/generic/backport-5.10/722-v5.12-net-dsa-don-t-use-switchdev_notifier_fdb_info-in-dsa.patch b/target/linux/generic/backport-5.10/722-v5.12-net-dsa-don-t-use-switchdev_notifier_fdb_info-in-dsa.patch deleted file mode 100644 index c1aa8fda82..0000000000 --- a/target/linux/generic/backport-5.10/722-v5.12-net-dsa-don-t-use-switchdev_notifier_fdb_info-in-dsa.patch +++ /dev/null @@ -1,226 +0,0 @@ -From c4bb76a9a0ef87c4cc1f636defed5f12deb9f5a7 Mon Sep 17 00:00:00 2001 -From: Vladimir Oltean -Date: Wed, 6 Jan 2021 11:51:32 +0200 -Subject: [PATCH] net: dsa: don't use switchdev_notifier_fdb_info in - dsa_switchdev_event_work - -Currently DSA doesn't add FDB entries on the CPU port, because it only -does so through switchdev, which is associated with a net_device, and -there are none of those for the CPU port. - -But actually FDB addresses on the CPU port have some use cases of their -own, if the switchdev operations are initiated from within the DSA -layer. There is just one problem with the existing code: it passes a -structure in dsa_switchdev_event_work which was retrieved directly from -switchdev, so it contains a net_device. We need to generalize the -contents to something that covers the CPU port as well: the "ds, port" -tuple is fine for that. - -Note that the new procedure for notifying the successful FDB offload is -inspired from the rocker model. - -Also, nothing was being done if added_by_user was false. Let's check for -that a lot earlier, and don't actually bother to schedule the worker -for nothing. - -Signed-off-by: Vladimir Oltean -Reviewed-by: Florian Fainelli -Signed-off-by: Jakub Kicinski ---- - net/dsa/dsa_priv.h | 12 +++++ - net/dsa/slave.c | 106 ++++++++++++++++++++++----------------------- - 2 files changed, 65 insertions(+), 53 deletions(-) - ---- a/net/dsa/dsa_priv.h -+++ b/net/dsa/dsa_priv.h -@@ -73,6 +73,18 @@ struct dsa_notifier_mtu_info { - int mtu; - }; - -+struct dsa_switchdev_event_work { -+ struct dsa_switch *ds; -+ int port; -+ struct work_struct work; -+ unsigned long event; -+ /* Specific for SWITCHDEV_FDB_ADD_TO_DEVICE and -+ * SWITCHDEV_FDB_DEL_TO_DEVICE -+ */ -+ unsigned char addr[ETH_ALEN]; -+ u16 vid; -+}; -+ - struct dsa_slave_priv { - /* Copy of CPU port xmit for faster access in slave transmit hot path */ - struct sk_buff * (*xmit)(struct sk_buff *skb, ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -2087,76 +2087,66 @@ static int dsa_slave_netdevice_event(str - return NOTIFY_DONE; - } - --struct dsa_switchdev_event_work { -- struct work_struct work; -- struct switchdev_notifier_fdb_info fdb_info; -- struct net_device *dev; -- unsigned long event; --}; -+static void -+dsa_fdb_offload_notify(struct dsa_switchdev_event_work *switchdev_work) -+{ -+ struct dsa_switch *ds = switchdev_work->ds; -+ struct switchdev_notifier_fdb_info info; -+ struct dsa_port *dp; -+ -+ if (!dsa_is_user_port(ds, switchdev_work->port)) -+ return; -+ -+ info.addr = switchdev_work->addr; -+ info.vid = switchdev_work->vid; -+ info.offloaded = true; -+ dp = dsa_to_port(ds, switchdev_work->port); -+ call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED, -+ dp->slave, &info.info, NULL); -+} - - static void dsa_slave_switchdev_event_work(struct work_struct *work) - { - struct dsa_switchdev_event_work *switchdev_work = - container_of(work, struct dsa_switchdev_event_work, work); -- struct net_device *dev = switchdev_work->dev; -- struct switchdev_notifier_fdb_info *fdb_info; -- struct dsa_port *dp = dsa_slave_to_port(dev); -+ struct dsa_switch *ds = switchdev_work->ds; -+ struct dsa_port *dp; - int err; - -+ dp = dsa_to_port(ds, switchdev_work->port); -+ - rtnl_lock(); - switch (switchdev_work->event) { - case SWITCHDEV_FDB_ADD_TO_DEVICE: -- fdb_info = &switchdev_work->fdb_info; -- if (!fdb_info->added_by_user) -- break; -- -- err = dsa_port_fdb_add(dp, fdb_info->addr, fdb_info->vid); -+ err = dsa_port_fdb_add(dp, switchdev_work->addr, -+ switchdev_work->vid); - if (err) { -- netdev_err(dev, -- "failed to add %pM vid %d to fdb: %d\n", -- fdb_info->addr, fdb_info->vid, err); -+ dev_err(ds->dev, -+ "port %d failed to add %pM vid %d to fdb: %d\n", -+ dp->index, switchdev_work->addr, -+ switchdev_work->vid, err); - break; - } -- fdb_info->offloaded = true; -- call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED, dev, -- &fdb_info->info, NULL); -+ dsa_fdb_offload_notify(switchdev_work); - break; - - case SWITCHDEV_FDB_DEL_TO_DEVICE: -- fdb_info = &switchdev_work->fdb_info; -- if (!fdb_info->added_by_user) -- break; -- -- err = dsa_port_fdb_del(dp, fdb_info->addr, fdb_info->vid); -+ err = dsa_port_fdb_del(dp, switchdev_work->addr, -+ switchdev_work->vid); - if (err) { -- netdev_err(dev, -- "failed to delete %pM vid %d from fdb: %d\n", -- fdb_info->addr, fdb_info->vid, err); -+ dev_err(ds->dev, -+ "port %d failed to delete %pM vid %d from fdb: %d\n", -+ dp->index, switchdev_work->addr, -+ switchdev_work->vid, err); - } - - break; - } - rtnl_unlock(); - -- kfree(switchdev_work->fdb_info.addr); - kfree(switchdev_work); -- dev_put(dev); --} -- --static int --dsa_slave_switchdev_fdb_work_init(struct dsa_switchdev_event_work * -- switchdev_work, -- const struct switchdev_notifier_fdb_info * -- fdb_info) --{ -- memcpy(&switchdev_work->fdb_info, fdb_info, -- sizeof(switchdev_work->fdb_info)); -- switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC); -- if (!switchdev_work->fdb_info.addr) -- return -ENOMEM; -- ether_addr_copy((u8 *)switchdev_work->fdb_info.addr, -- fdb_info->addr); -- return 0; -+ if (dsa_is_user_port(ds, dp->index)) -+ dev_put(dp->slave); - } - - /* Called under rcu_read_lock() */ -@@ -2164,7 +2154,9 @@ static int dsa_slave_switchdev_event(str - unsigned long event, void *ptr) - { - struct net_device *dev = switchdev_notifier_info_to_dev(ptr); -+ const struct switchdev_notifier_fdb_info *fdb_info; - struct dsa_switchdev_event_work *switchdev_work; -+ struct dsa_port *dp; - int err; - - if (event == SWITCHDEV_PORT_ATTR_SET) { -@@ -2177,20 +2169,32 @@ static int dsa_slave_switchdev_event(str - if (!dsa_slave_dev_check(dev)) - return NOTIFY_DONE; - -+ dp = dsa_slave_to_port(dev); -+ - switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC); - if (!switchdev_work) - return NOTIFY_BAD; - - INIT_WORK(&switchdev_work->work, - dsa_slave_switchdev_event_work); -- switchdev_work->dev = dev; -+ switchdev_work->ds = dp->ds; -+ switchdev_work->port = dp->index; - switchdev_work->event = event; - - switch (event) { - case SWITCHDEV_FDB_ADD_TO_DEVICE: - case SWITCHDEV_FDB_DEL_TO_DEVICE: -- if (dsa_slave_switchdev_fdb_work_init(switchdev_work, ptr)) -- goto err_fdb_work_init; -+ fdb_info = ptr; -+ -+ if (!fdb_info->added_by_user) { -+ kfree(switchdev_work); -+ return NOTIFY_OK; -+ } -+ -+ ether_addr_copy(switchdev_work->addr, -+ fdb_info->addr); -+ switchdev_work->vid = fdb_info->vid; -+ - dev_hold(dev); - break; - default: -@@ -2200,10 +2204,6 @@ static int dsa_slave_switchdev_event(str - - dsa_schedule_work(&switchdev_work->work); - return NOTIFY_OK; -- --err_fdb_work_init: -- kfree(switchdev_work); -- return NOTIFY_BAD; - } - - static int dsa_slave_switchdev_blocking_event(struct notifier_block *unused, diff --git a/target/linux/generic/backport-5.10/723-v5.12-net-dsa-move-switchdev-event-implementation-under-th.patch b/target/linux/generic/backport-5.10/723-v5.12-net-dsa-move-switchdev-event-implementation-under-th.patch deleted file mode 100644 index 9131df70d3..0000000000 --- a/target/linux/generic/backport-5.10/723-v5.12-net-dsa-move-switchdev-event-implementation-under-th.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 447d290a58bd335d68f665713842365d3d6447df Mon Sep 17 00:00:00 2001 -From: Vladimir Oltean -Date: Wed, 6 Jan 2021 11:51:33 +0200 -Subject: [PATCH] net: dsa: move switchdev event implementation under the same - switch/case statement - -We'll need to start listening to SWITCHDEV_FDB_{ADD,DEL}_TO_DEVICE -events even for interfaces where dsa_slave_dev_check returns false, so -we need that check inside the switch-case statement for SWITCHDEV_FDB_*. - -This movement also avoids a useless allocation / free of switchdev_work -on the untreated "default event" case. - -Signed-off-by: Vladimir Oltean -Reviewed-by: Florian Fainelli -Signed-off-by: Jakub Kicinski ---- - net/dsa/slave.c | 35 ++++++++++++++++------------------- - 1 file changed, 16 insertions(+), 19 deletions(-) - ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -2159,31 +2159,29 @@ static int dsa_slave_switchdev_event(str - struct dsa_port *dp; - int err; - -- if (event == SWITCHDEV_PORT_ATTR_SET) { -+ switch (event) { -+ case SWITCHDEV_PORT_ATTR_SET: - err = switchdev_handle_port_attr_set(dev, ptr, - dsa_slave_dev_check, - dsa_slave_port_attr_set); - return notifier_from_errno(err); -- } -- -- if (!dsa_slave_dev_check(dev)) -- return NOTIFY_DONE; -+ case SWITCHDEV_FDB_ADD_TO_DEVICE: -+ case SWITCHDEV_FDB_DEL_TO_DEVICE: -+ if (!dsa_slave_dev_check(dev)) -+ return NOTIFY_DONE; - -- dp = dsa_slave_to_port(dev); -+ dp = dsa_slave_to_port(dev); - -- switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC); -- if (!switchdev_work) -- return NOTIFY_BAD; -- -- INIT_WORK(&switchdev_work->work, -- dsa_slave_switchdev_event_work); -- switchdev_work->ds = dp->ds; -- switchdev_work->port = dp->index; -- switchdev_work->event = event; -+ switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC); -+ if (!switchdev_work) -+ return NOTIFY_BAD; -+ -+ INIT_WORK(&switchdev_work->work, -+ dsa_slave_switchdev_event_work); -+ switchdev_work->ds = dp->ds; -+ switchdev_work->port = dp->index; -+ switchdev_work->event = event; - -- switch (event) { -- case SWITCHDEV_FDB_ADD_TO_DEVICE: -- case SWITCHDEV_FDB_DEL_TO_DEVICE: - fdb_info = ptr; - - if (!fdb_info->added_by_user) { -@@ -2196,13 +2194,12 @@ static int dsa_slave_switchdev_event(str - switchdev_work->vid = fdb_info->vid; - - dev_hold(dev); -+ dsa_schedule_work(&switchdev_work->work); - break; - default: -- kfree(switchdev_work); - return NOTIFY_DONE; - } - -- dsa_schedule_work(&switchdev_work->work); - return NOTIFY_OK; - } - diff --git a/target/linux/generic/backport-5.10/724-v5.12-net-dsa-exit-early-in-dsa_slave_switchdev_event-if-w.patch b/target/linux/generic/backport-5.10/724-v5.12-net-dsa-exit-early-in-dsa_slave_switchdev_event-if-w.patch deleted file mode 100644 index b7b6ebe461..0000000000 --- a/target/linux/generic/backport-5.10/724-v5.12-net-dsa-exit-early-in-dsa_slave_switchdev_event-if-w.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 5fb4a451a87d8ed3363d28b63a3295399373d6c4 Mon Sep 17 00:00:00 2001 -From: Vladimir Oltean -Date: Wed, 6 Jan 2021 11:51:34 +0200 -Subject: [PATCH] net: dsa: exit early in dsa_slave_switchdev_event if we can't - program the FDB - -Right now, the following would happen for a switch driver that does not -implement .port_fdb_add or .port_fdb_del. - -dsa_slave_switchdev_event returns NOTIFY_OK and schedules: --> dsa_slave_switchdev_event_work - -> dsa_port_fdb_add - -> dsa_port_notify(DSA_NOTIFIER_FDB_ADD) - -> dsa_switch_fdb_add - -> if (!ds->ops->port_fdb_add) return -EOPNOTSUPP; - -> an error is printed with dev_dbg, and - dsa_fdb_offload_notify(switchdev_work) is not called. - -We can avoid scheduling the worker for nothing and say NOTIFY_DONE. -Because we don't call dsa_fdb_offload_notify, the static FDB entry will -remain just in the software bridge. - -Signed-off-by: Vladimir Oltean -Reviewed-by: Florian Fainelli -Reviewed-by: Andrew Lunn -Signed-off-by: Jakub Kicinski ---- - net/dsa/slave.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -2172,6 +2172,9 @@ static int dsa_slave_switchdev_event(str - - dp = dsa_slave_to_port(dev); - -+ if (!dp->ds->ops->port_fdb_add || !dp->ds->ops->port_fdb_del) -+ return NOTIFY_DONE; -+ - switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC); - if (!switchdev_work) - return NOTIFY_BAD; diff --git a/target/linux/generic/backport-5.10/725-v5.12-net-dsa-listen-for-SWITCHDEV_-FDB-DEL-_ADD_TO_DEVICE.patch b/target/linux/generic/backport-5.10/725-v5.12-net-dsa-listen-for-SWITCHDEV_-FDB-DEL-_ADD_TO_DEVICE.patch deleted file mode 100644 index e7b9af1951..0000000000 --- a/target/linux/generic/backport-5.10/725-v5.12-net-dsa-listen-for-SWITCHDEV_-FDB-DEL-_ADD_TO_DEVICE.patch +++ /dev/null @@ -1,264 +0,0 @@ -From d5f19486cee79d04c054427577ac96ed123706db Mon Sep 17 00:00:00 2001 -From: Vladimir Oltean -Date: Wed, 6 Jan 2021 11:51:35 +0200 -Subject: [PATCH] net: dsa: listen for SWITCHDEV_{FDB,DEL}_ADD_TO_DEVICE on - foreign bridge neighbors - -Some DSA switches (and not only) cannot learn source MAC addresses from -packets injected from the CPU. They only perform hardware address -learning from inbound traffic. - -This can be problematic when we have a bridge spanning some DSA switch -ports and some non-DSA ports (which we'll call "foreign interfaces" from -DSA's perspective). - -There are 2 classes of problems created by the lack of learning on -CPU-injected traffic: -- excessive flooding, due to the fact that DSA treats those addresses as - unknown -- the risk of stale routes, which can lead to temporary packet loss - -To illustrate the second class, consider the following situation, which -is common in production equipment (wireless access points, where there -is a WLAN interface and an Ethernet switch, and these form a single -bridging domain). - - AP 1: - +------------------------------------------------------------------------+ - | br0 | - +------------------------------------------------------------------------+ - +------------+ +------------+ +------------+ +------------+ +------------+ - | swp0 | | swp1 | | swp2 | | swp3 | | wlan0 | - +------------+ +------------+ +------------+ +------------+ +------------+ - | ^ ^ - | | | - | | | - | Client A Client B - | - | - | - +------------+ +------------+ +------------+ +------------+ +------------+ - | swp0 | | swp1 | | swp2 | | swp3 | | wlan0 | - +------------+ +------------+ +------------+ +------------+ +------------+ - +------------------------------------------------------------------------+ - | br0 | - +------------------------------------------------------------------------+ - AP 2 - -- br0 of AP 1 will know that Clients A and B are reachable via wlan0 -- the hardware fdb of a DSA switch driver today is not kept in sync with - the software entries on other bridge ports, so it will not know that - clients A and B are reachable via the CPU port UNLESS the hardware - switch itself performs SA learning from traffic injected from the CPU. - Nonetheless, a substantial number of switches don't. -- the hardware fdb of the DSA switch on AP 2 may autonomously learn that - Client A and B are reachable through swp0. Therefore, the software br0 - of AP 2 also may or may not learn this. In the example we're - illustrating, some Ethernet traffic has been going on, and br0 from AP - 2 has indeed learnt that it can reach Client B through swp0. - -One of the wireless clients, say Client B, disconnects from AP 1 and -roams to AP 2. The topology now looks like this: - - AP 1: - +------------------------------------------------------------------------+ - | br0 | - +------------------------------------------------------------------------+ - +------------+ +------------+ +------------+ +------------+ +------------+ - | swp0 | | swp1 | | swp2 | | swp3 | | wlan0 | - +------------+ +------------+ +------------+ +------------+ +------------+ - | ^ - | | - | Client A - | - | - | Client B - | | - | v - +------------+ +------------+ +------------+ +------------+ +------------+ - | swp0 | | swp1 | | swp2 | | swp3 | | wlan0 | - +------------+ +------------+ +------------+ +------------+ +------------+ - +------------------------------------------------------------------------+ - | br0 | - +------------------------------------------------------------------------+ - AP 2 - -- br0 of AP 1 still knows that Client A is reachable via wlan0 (no change) -- br0 of AP 1 will (possibly) know that Client B has left wlan0. There - are cases where it might never find out though. Either way, DSA today - does not process that notification in any way. -- the hardware FDB of the DSA switch on AP 1 may learn autonomously that - Client B can be reached via swp0, if it receives any packet with - Client 1's source MAC address over Ethernet. -- the hardware FDB of the DSA switch on AP 2 still thinks that Client B - can be reached via swp0. It does not know that it has roamed to wlan0, - because it doesn't perform SA learning from the CPU port. - -Now Client A contacts Client B. -AP 1 routes the packet fine towards swp0 and delivers it on the Ethernet -segment. -AP 2 sees a frame on swp0 and its fdb says that the destination is swp0. -Hairpinning is disabled => drop. - -This problem comes from the fact that these switches have a 'blind spot' -for addresses coming from software bridging. The generic solution is not -to assume that hardware learning can be enabled somehow, but to listen -to more bridge learning events. It turns out that the bridge driver does -learn in software from all inbound frames, in __br_handle_local_finish. -A proper SWITCHDEV_FDB_ADD_TO_DEVICE notification is emitted for the -addresses serviced by the bridge on 'foreign' interfaces. The software -bridge also does the right thing on migration, by notifying that the old -entry is deleted, so that does not need to be special-cased in DSA. When -it is deleted, we just need to delete our static FDB entry towards the -CPU too, and wait. - -The problem is that DSA currently only cares about SWITCHDEV_FDB_ADD_TO_DEVICE -events received on its own interfaces, such as static FDB entries. - -Luckily we can change that, and DSA can listen to all switchdev FDB -add/del events in the system and figure out if those events were emitted -by a bridge that spans at least one of DSA's own ports. In case that is -true, DSA will also offload that address towards its own CPU port, in -the eventuality that there might be bridge clients attached to the DSA -switch who want to talk to the station connected to the foreign -interface. - -In terms of implementation, we need to keep the fdb_info->added_by_user -check for the case where the switchdev event was targeted directly at a -DSA switch port. But we don't need to look at that flag for snooped -events. So the check is currently too late, we need to move it earlier. -This also simplifies the code a bit, since we avoid uselessly allocating -and freeing switchdev_work. - -We could probably do some improvements in the future. For example, -multi-bridge support is rudimentary at the moment. If there are two -bridges spanning a DSA switch's ports, and both of them need to service -the same MAC address, then what will happen is that the migration of one -of those stations will trigger the deletion of the FDB entry from the -CPU port while it is still used by other bridge. That could be improved -with reference counting but is left for another time. - -This behavior needs to be enabled at driver level by setting -ds->assisted_learning_on_cpu_port = true. This is because we don't want -to inflict a potential performance penalty (accesses through -MDIO/I2C/SPI are expensive) to hardware that really doesn't need it -because address learning on the CPU port works there. - -Reported-by: DENG Qingfang -Signed-off-by: Vladimir Oltean -Reviewed-by: Florian Fainelli -Reviewed-by: Andrew Lunn -Signed-off-by: Jakub Kicinski ---- - include/net/dsa.h | 5 +++++ - net/dsa/slave.c | 66 +++++++++++++++++++++++++++++++++++++++++++++---------- - 2 files changed, 60 insertions(+), 11 deletions(-) - ---- a/include/net/dsa.h -+++ b/include/net/dsa.h -@@ -317,6 +317,11 @@ struct dsa_switch { - */ - bool untag_bridge_pvid; - -+ /* Let DSA manage the FDB entries towards the CPU, based on the -+ * software bridge database. -+ */ -+ bool assisted_learning_on_cpu_port; -+ - /* In case vlan_filtering_is_global is set, the VLAN awareness state - * should be retrieved from here and not from the per-port settings. - */ ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -2149,6 +2149,28 @@ static void dsa_slave_switchdev_event_wo - dev_put(dp->slave); - } - -+static int dsa_lower_dev_walk(struct net_device *lower_dev, -+ struct netdev_nested_priv *priv) -+{ -+ if (dsa_slave_dev_check(lower_dev)) { -+ priv->data = (void *)netdev_priv(lower_dev); -+ return 1; -+ } -+ -+ return 0; -+} -+ -+static struct dsa_slave_priv *dsa_slave_dev_lower_find(struct net_device *dev) -+{ -+ struct netdev_nested_priv priv = { -+ .data = NULL, -+ }; -+ -+ netdev_walk_all_lower_dev_rcu(dev, dsa_lower_dev_walk, &priv); -+ -+ return (struct dsa_slave_priv *)priv.data; -+} -+ - /* Called under rcu_read_lock() */ - static int dsa_slave_switchdev_event(struct notifier_block *unused, - unsigned long event, void *ptr) -@@ -2167,10 +2189,37 @@ static int dsa_slave_switchdev_event(str - return notifier_from_errno(err); - case SWITCHDEV_FDB_ADD_TO_DEVICE: - case SWITCHDEV_FDB_DEL_TO_DEVICE: -- if (!dsa_slave_dev_check(dev)) -- return NOTIFY_DONE; -+ fdb_info = ptr; -+ -+ if (dsa_slave_dev_check(dev)) { -+ if (!fdb_info->added_by_user) -+ return NOTIFY_OK; -+ -+ dp = dsa_slave_to_port(dev); -+ } else { -+ /* Snoop addresses learnt on foreign interfaces -+ * bridged with us, for switches that don't -+ * automatically learn SA from CPU-injected traffic -+ */ -+ struct net_device *br_dev; -+ struct dsa_slave_priv *p; -+ -+ br_dev = netdev_master_upper_dev_get_rcu(dev); -+ if (!br_dev) -+ return NOTIFY_DONE; -+ -+ if (!netif_is_bridge_master(br_dev)) -+ return NOTIFY_DONE; -+ -+ p = dsa_slave_dev_lower_find(br_dev); -+ if (!p) -+ return NOTIFY_DONE; - -- dp = dsa_slave_to_port(dev); -+ dp = p->dp->cpu_dp; -+ -+ if (!dp->ds->assisted_learning_on_cpu_port) -+ return NOTIFY_DONE; -+ } - - if (!dp->ds->ops->port_fdb_add || !dp->ds->ops->port_fdb_del) - return NOTIFY_DONE; -@@ -2185,18 +2234,13 @@ static int dsa_slave_switchdev_event(str - switchdev_work->port = dp->index; - switchdev_work->event = event; - -- fdb_info = ptr; -- -- if (!fdb_info->added_by_user) { -- kfree(switchdev_work); -- return NOTIFY_OK; -- } -- - ether_addr_copy(switchdev_work->addr, - fdb_info->addr); - switchdev_work->vid = fdb_info->vid; - -- dev_hold(dev); -+ /* Hold a reference on the slave for dsa_fdb_offload_notify */ -+ if (dsa_is_user_port(dp->ds, dp->index)) -+ dev_hold(dev); - dsa_schedule_work(&switchdev_work->work); - break; - default: diff --git a/target/linux/generic/backport-5.10/730-net-dsa-mt7530-setup-core-clock-even-in-TRGMII-mode.patch b/target/linux/generic/backport-5.10/730-net-dsa-mt7530-setup-core-clock-even-in-TRGMII-mode.patch deleted file mode 100644 index f3a6f948ad..0000000000 --- a/target/linux/generic/backport-5.10/730-net-dsa-mt7530-setup-core-clock-even-in-TRGMII-mode.patch +++ /dev/null @@ -1,84 +0,0 @@ -From c3b8e07909dbe67b0d580416c1a5257643a73be7 Mon Sep 17 00:00:00 2001 -From: Ilya Lipnitskiy -Date: Fri, 12 Mar 2021 00:07:03 -0800 -Subject: [PATCH] net: dsa: mt7530: setup core clock even in TRGMII mode - -A recent change to MIPS ralink reset logic made it so mt7530 actually -resets the switch on platforms such as mt7621 (where bit 2 is the reset -line for the switch). That exposed an issue where the switch would not -function properly in TRGMII mode after a reset. - -Reconfigure core clock in TRGMII mode to fix the issue. - -Tested on Ubiquiti ER-X (MT7621) with TRGMII mode enabled. - -Fixes: 3f9ef7785a9c ("MIPS: ralink: manage low reset lines") -Signed-off-by: Ilya Lipnitskiy -Signed-off-by: David S. Miller ---- - drivers/net/dsa/mt7530.c | 52 +++++++++++++++++++--------------------- - 1 file changed, 25 insertions(+), 27 deletions(-) - ---- a/drivers/net/dsa/mt7530.c -+++ b/drivers/net/dsa/mt7530.c -@@ -436,34 +436,32 @@ mt7530_pad_clk_setup(struct dsa_switch * - TD_DM_DRVP(8) | TD_DM_DRVN(8)); - - /* Setup core clock for MT7530 */ -- if (!trgint) { -- /* Disable MT7530 core clock */ -- core_clear(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN); -- -- /* Disable PLL, since phy_device has not yet been created -- * provided for phy_[read,write]_mmd_indirect is called, we -- * provide our own core_write_mmd_indirect to complete this -- * function. -- */ -- core_write_mmd_indirect(priv, -- CORE_GSWPLL_GRP1, -- MDIO_MMD_VEND2, -- 0); -- -- /* Set core clock into 500Mhz */ -- core_write(priv, CORE_GSWPLL_GRP2, -- RG_GSWPLL_POSDIV_500M(1) | -- RG_GSWPLL_FBKDIV_500M(25)); -- -- /* Enable PLL */ -- core_write(priv, CORE_GSWPLL_GRP1, -- RG_GSWPLL_EN_PRE | -- RG_GSWPLL_POSDIV_200M(2) | -- RG_GSWPLL_FBKDIV_200M(32)); -- -- /* Enable MT7530 core clock */ -- core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN); -- } -+ /* Disable MT7530 core clock */ -+ core_clear(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN); -+ -+ /* Disable PLL, since phy_device has not yet been created -+ * provided for phy_[read,write]_mmd_indirect is called, we -+ * provide our own core_write_mmd_indirect to complete this -+ * function. -+ */ -+ core_write_mmd_indirect(priv, -+ CORE_GSWPLL_GRP1, -+ MDIO_MMD_VEND2, -+ 0); -+ -+ /* Set core clock into 500Mhz */ -+ core_write(priv, CORE_GSWPLL_GRP2, -+ RG_GSWPLL_POSDIV_500M(1) | -+ RG_GSWPLL_FBKDIV_500M(25)); -+ -+ /* Enable PLL */ -+ core_write(priv, CORE_GSWPLL_GRP1, -+ RG_GSWPLL_EN_PRE | -+ RG_GSWPLL_POSDIV_200M(2) | -+ RG_GSWPLL_FBKDIV_200M(32)); -+ -+ /* Enable MT7530 core clock */ -+ core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN); - - /* Setup the MT7530 TRGMII Tx Clock */ - core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN); diff --git a/target/linux/generic/backport-5.10/731-v5.12-net-dsa-mt7530-MT7530-optional-GPIO-support.patch b/target/linux/generic/backport-5.10/731-v5.12-net-dsa-mt7530-MT7530-optional-GPIO-support.patch deleted file mode 100644 index bd60df37e3..0000000000 --- a/target/linux/generic/backport-5.10/731-v5.12-net-dsa-mt7530-MT7530-optional-GPIO-support.patch +++ /dev/null @@ -1,181 +0,0 @@ -From 429a0edeefd88cbfca5c417dfb8561047bb50769 Mon Sep 17 00:00:00 2001 -From: DENG Qingfang -Date: Mon, 25 Jan 2021 12:43:22 +0800 -Subject: [PATCH] net: dsa: mt7530: MT7530 optional GPIO support - -MT7530's LED controller can drive up to 15 LED/GPIOs. - -Add support for GPIO control and allow users to use its GPIOs by -setting gpio-controller property in device tree. - -Signed-off-by: DENG Qingfang -Reviewed-by: Linus Walleij -Reviewed-by: Andrew Lunn -Signed-off-by: Jakub Kicinski ---- - drivers/net/dsa/mt7530.c | 110 +++++++++++++++++++++++++++++++++++++++ - drivers/net/dsa/mt7530.h | 20 +++++++ - 2 files changed, 130 insertions(+) - ---- a/drivers/net/dsa/mt7530.c -+++ b/drivers/net/dsa/mt7530.c -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - #include - - #include "mt7530.h" -@@ -1537,6 +1538,109 @@ mtk_get_tag_protocol(struct dsa_switch * - } - } - -+static inline u32 -+mt7530_gpio_to_bit(unsigned int offset) -+{ -+ /* Map GPIO offset to register bit -+ * [ 2: 0] port 0 LED 0..2 as GPIO 0..2 -+ * [ 6: 4] port 1 LED 0..2 as GPIO 3..5 -+ * [10: 8] port 2 LED 0..2 as GPIO 6..8 -+ * [14:12] port 3 LED 0..2 as GPIO 9..11 -+ * [18:16] port 4 LED 0..2 as GPIO 12..14 -+ */ -+ return BIT(offset + offset / 3); -+} -+ -+static int -+mt7530_gpio_get(struct gpio_chip *gc, unsigned int offset) -+{ -+ struct mt7530_priv *priv = gpiochip_get_data(gc); -+ u32 bit = mt7530_gpio_to_bit(offset); -+ -+ return !!(mt7530_read(priv, MT7530_LED_GPIO_DATA) & bit); -+} -+ -+static void -+mt7530_gpio_set(struct gpio_chip *gc, unsigned int offset, int value) -+{ -+ struct mt7530_priv *priv = gpiochip_get_data(gc); -+ u32 bit = mt7530_gpio_to_bit(offset); -+ -+ if (value) -+ mt7530_set(priv, MT7530_LED_GPIO_DATA, bit); -+ else -+ mt7530_clear(priv, MT7530_LED_GPIO_DATA, bit); -+} -+ -+static int -+mt7530_gpio_get_direction(struct gpio_chip *gc, unsigned int offset) -+{ -+ struct mt7530_priv *priv = gpiochip_get_data(gc); -+ u32 bit = mt7530_gpio_to_bit(offset); -+ -+ return (mt7530_read(priv, MT7530_LED_GPIO_DIR) & bit) ? -+ GPIO_LINE_DIRECTION_OUT : GPIO_LINE_DIRECTION_IN; -+} -+ -+static int -+mt7530_gpio_direction_input(struct gpio_chip *gc, unsigned int offset) -+{ -+ struct mt7530_priv *priv = gpiochip_get_data(gc); -+ u32 bit = mt7530_gpio_to_bit(offset); -+ -+ mt7530_clear(priv, MT7530_LED_GPIO_OE, bit); -+ mt7530_clear(priv, MT7530_LED_GPIO_DIR, bit); -+ -+ return 0; -+} -+ -+static int -+mt7530_gpio_direction_output(struct gpio_chip *gc, unsigned int offset, int value) -+{ -+ struct mt7530_priv *priv = gpiochip_get_data(gc); -+ u32 bit = mt7530_gpio_to_bit(offset); -+ -+ mt7530_set(priv, MT7530_LED_GPIO_DIR, bit); -+ -+ if (value) -+ mt7530_set(priv, MT7530_LED_GPIO_DATA, bit); -+ else -+ mt7530_clear(priv, MT7530_LED_GPIO_DATA, bit); -+ -+ mt7530_set(priv, MT7530_LED_GPIO_OE, bit); -+ -+ return 0; -+} -+ -+static int -+mt7530_setup_gpio(struct mt7530_priv *priv) -+{ -+ struct device *dev = priv->dev; -+ struct gpio_chip *gc; -+ -+ gc = devm_kzalloc(dev, sizeof(*gc), GFP_KERNEL); -+ if (!gc) -+ return -ENOMEM; -+ -+ mt7530_write(priv, MT7530_LED_GPIO_OE, 0); -+ mt7530_write(priv, MT7530_LED_GPIO_DIR, 0); -+ mt7530_write(priv, MT7530_LED_IO_MODE, 0); -+ -+ gc->label = "mt7530"; -+ gc->parent = dev; -+ gc->owner = THIS_MODULE; -+ gc->get_direction = mt7530_gpio_get_direction; -+ gc->direction_input = mt7530_gpio_direction_input; -+ gc->direction_output = mt7530_gpio_direction_output; -+ gc->get = mt7530_gpio_get; -+ gc->set = mt7530_gpio_set; -+ gc->base = -1; -+ gc->ngpio = 15; -+ gc->can_sleep = true; -+ -+ return devm_gpiochip_add_data(dev, gc, priv); -+} -+ - static int - mt7530_setup(struct dsa_switch *ds) - { -@@ -1679,6 +1783,12 @@ mt7530_setup(struct dsa_switch *ds) - } - } - -+ if (of_property_read_bool(priv->dev->of_node, "gpio-controller")) { -+ ret = mt7530_setup_gpio(priv); -+ if (ret) -+ return ret; -+ } -+ - mt7530_setup_port5(ds, interface); - - /* Flush the FDB table */ ---- a/drivers/net/dsa/mt7530.h -+++ b/drivers/net/dsa/mt7530.h -@@ -529,6 +529,26 @@ enum mt7531_clk_skew { - #define MT7531_GPIO12_RG_RXD3_MASK GENMASK(19, 16) - #define MT7531_EXT_P_MDIO_12 (2 << 16) - -+/* Registers for LED GPIO control (MT7530 only) -+ * All registers follow this pattern: -+ * [ 2: 0] port 0 -+ * [ 6: 4] port 1 -+ * [10: 8] port 2 -+ * [14:12] port 3 -+ * [18:16] port 4 -+ */ -+ -+/* LED enable, 0: Disable, 1: Enable (Default) */ -+#define MT7530_LED_EN 0x7d00 -+/* LED mode, 0: GPIO mode, 1: PHY mode (Default) */ -+#define MT7530_LED_IO_MODE 0x7d04 -+/* GPIO direction, 0: Input, 1: Output */ -+#define MT7530_LED_GPIO_DIR 0x7d10 -+/* GPIO output enable, 0: Disable, 1: Enable */ -+#define MT7530_LED_GPIO_OE 0x7d14 -+/* GPIO value, 0: Low, 1: High */ -+#define MT7530_LED_GPIO_DATA 0x7d18 -+ - #define MT7530_CREV 0x7ffc - #define CHIP_NAME_SHIFT 16 - #define MT7530_ID 0x7530 diff --git a/target/linux/generic/backport-5.10/731-v5.13-net-dsa-mt7530-Add-support-for-EEE-features.patch b/target/linux/generic/backport-5.10/731-v5.13-net-dsa-mt7530-Add-support-for-EEE-features.patch deleted file mode 100644 index 2ba6c604a8..0000000000 --- a/target/linux/generic/backport-5.10/731-v5.13-net-dsa-mt7530-Add-support-for-EEE-features.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 40b5d2f15c091fa9c854acde91ad2acb504027d7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= -Date: Mon, 12 Apr 2021 08:50:31 +0200 -Subject: [PATCH] net: dsa: mt7530: Add support for EEE features -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch adds EEE support. - -Signed-off-by: René van Dorst -Signed-off-by: David S. Miller ---- - drivers/net/dsa/mt7530.c | 43 ++++++++++++++++++++++++++++++++++++++++ - drivers/net/dsa/mt7530.h | 14 ++++++++++++- - 2 files changed, 56 insertions(+), 1 deletion(-) - ---- a/drivers/net/dsa/mt7530.c -+++ b/drivers/net/dsa/mt7530.c -@@ -2371,6 +2371,17 @@ static void mt753x_phylink_mac_link_up(s - mcr |= PMCR_RX_FC_EN; - } - -+ if (mode == MLO_AN_PHY && phydev && phy_init_eee(phydev, 0) >= 0) { -+ switch (speed) { -+ case SPEED_1000: -+ mcr |= PMCR_FORCE_EEE1G; -+ break; -+ case SPEED_100: -+ mcr |= PMCR_FORCE_EEE100; -+ break; -+ } -+ } -+ - mt7530_set(priv, MT7530_PMCR_P(port), mcr); - } - -@@ -2599,6 +2610,36 @@ mt753x_phy_write(struct dsa_switch *ds, - return priv->info->phy_write(ds, port, regnum, val); - } - -+static int mt753x_get_mac_eee(struct dsa_switch *ds, int port, -+ struct ethtool_eee *e) -+{ -+ struct mt7530_priv *priv = ds->priv; -+ u32 eeecr = mt7530_read(priv, MT7530_PMEEECR_P(port)); -+ -+ e->tx_lpi_enabled = !(eeecr & LPI_MODE_EN); -+ e->tx_lpi_timer = GET_LPI_THRESH(eeecr); -+ -+ return 0; -+} -+ -+static int mt753x_set_mac_eee(struct dsa_switch *ds, int port, -+ struct ethtool_eee *e) -+{ -+ struct mt7530_priv *priv = ds->priv; -+ u32 set, mask = LPI_THRESH_MASK | LPI_MODE_EN; -+ -+ if (e->tx_lpi_timer > 0xFFF) -+ return -EINVAL; -+ -+ set = SET_LPI_THRESH(e->tx_lpi_timer); -+ if (!e->tx_lpi_enabled) -+ /* Force LPI Mode without a delay */ -+ set |= LPI_MODE_EN; -+ mt7530_rmw(priv, MT7530_PMEEECR_P(port), mask, set); -+ -+ return 0; -+} -+ - static const struct dsa_switch_ops mt7530_switch_ops = { - .get_tag_protocol = mtk_get_tag_protocol, - .setup = mt753x_setup, -@@ -2627,6 +2668,8 @@ static const struct dsa_switch_ops mt753 - .phylink_mac_an_restart = mt753x_phylink_mac_an_restart, - .phylink_mac_link_down = mt753x_phylink_mac_link_down, - .phylink_mac_link_up = mt753x_phylink_mac_link_up, -+ .get_mac_eee = mt753x_get_mac_eee, -+ .set_mac_eee = mt753x_set_mac_eee, - }; - - static const struct mt753x_info mt753x_table[] = { ---- a/drivers/net/dsa/mt7530.h -+++ b/drivers/net/dsa/mt7530.h -@@ -240,6 +240,8 @@ enum mt7530_vlan_port_attr { - #define PMCR_RX_EN BIT(13) - #define PMCR_BACKOFF_EN BIT(9) - #define PMCR_BACKPR_EN BIT(8) -+#define PMCR_FORCE_EEE1G BIT(7) -+#define PMCR_FORCE_EEE100 BIT(6) - #define PMCR_TX_FC_EN BIT(5) - #define PMCR_RX_FC_EN BIT(4) - #define PMCR_FORCE_SPEED_1000 BIT(3) -@@ -264,7 +266,8 @@ enum mt7530_vlan_port_attr { - #define PMCR_LINK_SETTINGS_MASK (PMCR_TX_EN | PMCR_FORCE_SPEED_1000 | \ - PMCR_RX_EN | PMCR_FORCE_SPEED_100 | \ - PMCR_TX_FC_EN | PMCR_RX_FC_EN | \ -- PMCR_FORCE_FDX | PMCR_FORCE_LNK) -+ PMCR_FORCE_FDX | PMCR_FORCE_LNK | \ -+ PMCR_FORCE_EEE1G | PMCR_FORCE_EEE100) - #define PMCR_CPU_PORT_SETTING(id) (PMCR_FORCE_MODE_ID((id)) | \ - PMCR_IFG_XMIT(1) | PMCR_MAC_MODE | \ - PMCR_BACKOFF_EN | PMCR_BACKPR_EN | \ -@@ -273,6 +276,15 @@ enum mt7530_vlan_port_attr { - PMCR_FORCE_SPEED_1000 | \ - PMCR_FORCE_FDX | PMCR_FORCE_LNK) - -+#define MT7530_PMEEECR_P(x) (0x3004 + (x) * 0x100) -+#define WAKEUP_TIME_1000(x) (((x) & 0xFF) << 24) -+#define WAKEUP_TIME_100(x) (((x) & 0xFF) << 16) -+#define LPI_THRESH_MASK GENMASK(15, 4) -+#define LPI_THRESH_SHT 4 -+#define SET_LPI_THRESH(x) (((x) << LPI_THRESH_SHT) & LPI_THRESH_MASK) -+#define GET_LPI_THRESH(x) (((x) & LPI_THRESH_MASK) >> LPI_THRESH_SHT) -+#define LPI_MODE_EN BIT(0) -+ - #define MT7530_PMSR_P(x) (0x3008 + (x) * 0x100) - #define PMSR_EEE1G BIT(7) - #define PMSR_EEE100M BIT(6) diff --git a/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch deleted file mode 100644 index 0b5fb19913..0000000000 --- a/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch +++ /dev/null @@ -1,1935 +0,0 @@ -From 83216e3988cd196183542937c9bd58b279f946af Mon Sep 17 00:00:00 2001 -From: Michael Walle -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! - - -@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 - - -All drivers, except drivers/net/ethernet/aeroflex/greth.c, were -compile-time tested. - -Suggested-by: Andrew Lunn -Signed-off-by: Michael Walle -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - 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/arch/arm/mach-mvebu/kirkwood.c -+++ b/arch/arm/mach-mvebu/kirkwood.c -@@ -84,6 +84,7 @@ static void __init kirkwood_dt_eth_fixup - struct device_node *pnp = of_get_parent(np); - struct clk *clk; - struct property *pmac; -+ u8 tmpmac[ETH_ALEN]; - void __iomem *io; - u8 *macaddr; - u32 reg; -@@ -93,7 +94,7 @@ static void __init kirkwood_dt_eth_fixup - - /* skip disabled nodes or nodes with valid MAC address*/ - if (!of_device_is_available(pnp) || -- !IS_ERR(of_get_mac_address(np))) -+ !of_get_mac_address(np, tmpmac)) - goto eth_fixup_skip; - - clk = of_clk_get(pnp, 0); ---- a/arch/powerpc/sysdev/tsi108_dev.c -+++ b/arch/powerpc/sysdev/tsi108_dev.c -@@ -73,7 +73,6 @@ static int __init tsi108_eth_of_init(voi - struct device_node *phy, *mdio; - hw_info tsi_eth_data; - const unsigned int *phy_id; -- const void *mac_addr; - const phandle *ph; - - memset(r, 0, sizeof(r)); -@@ -101,9 +100,7 @@ static int __init tsi108_eth_of_init(voi - goto err; - } - -- mac_addr = of_get_mac_address(np); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(tsi_eth_data.mac_addr, mac_addr); -+ of_get_mac_address(np, tsi_eth_data.mac_addr); - - ph = of_get_property(np, "mdio-handle", NULL); - mdio = of_find_node_by_phandle(*ph); ---- a/drivers/net/ethernet/aeroflex/greth.c -+++ b/drivers/net/ethernet/aeroflex/greth.c -@@ -1450,10 +1450,10 @@ static int greth_of_probe(struct platfor - break; - } - if (i == 6) { -- const u8 *addr; -+ u8 addr[ETH_ALEN]; - -- addr = of_get_mac_address(ofdev->dev.of_node); -- if (!IS_ERR(addr)) { -+ err = of_get_mac_address(ofdev->dev.of_node, addr); -+ if (!err) { - for (i = 0; i < 6; i++) - macaddr[i] = (unsigned int) addr[i]; - } else { ---- a/drivers/net/ethernet/allwinner/sun4i-emac.c -+++ b/drivers/net/ethernet/allwinner/sun4i-emac.c -@@ -790,7 +790,6 @@ static int emac_probe(struct platform_de - struct emac_board_info *db; - struct net_device *ndev; - int ret = 0; -- const char *mac_addr; - - ndev = alloc_etherdev(sizeof(struct emac_board_info)); - if (!ndev) { -@@ -853,12 +852,9 @@ static int emac_probe(struct platform_de - } - - /* Read MAC-address from DT */ -- mac_addr = of_get_mac_address(np); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(ndev->dev_addr, mac_addr); -- -- /* Check if the MAC address is valid, if not get a random one */ -- if (!is_valid_ether_addr(ndev->dev_addr)) { -+ ret = of_get_mac_address(np, ndev->dev_addr); -+ if (ret) { -+ /* if the MAC address is invalid get a random one */ - eth_hw_addr_random(ndev); - dev_warn(&pdev->dev, "using random MAC address %pM\n", - ndev->dev_addr); ---- a/drivers/net/ethernet/altera/altera_tse_main.c -+++ b/drivers/net/ethernet/altera/altera_tse_main.c -@@ -1355,7 +1355,6 @@ static int altera_tse_probe(struct platf - struct resource *control_port; - struct resource *dma_res; - struct altera_tse_private *priv; -- const unsigned char *macaddr; - void __iomem *descmap; - const struct of_device_id *of_id = NULL; - -@@ -1532,10 +1531,8 @@ static int altera_tse_probe(struct platf - priv->rx_dma_buf_sz = ALTERA_RXDMABUFFER_SIZE; - - /* get default MAC address from device tree */ -- macaddr = of_get_mac_address(pdev->dev.of_node); -- if (!IS_ERR(macaddr)) -- ether_addr_copy(ndev->dev_addr, macaddr); -- else -+ ret = of_get_mac_address(pdev->dev.of_node, ndev->dev_addr); -+ if (ret) - eth_hw_addr_random(ndev); - - /* get phy addr and create mdio */ ---- a/drivers/net/ethernet/arc/emac_main.c -+++ b/drivers/net/ethernet/arc/emac_main.c -@@ -857,7 +857,6 @@ int arc_emac_probe(struct net_device *nd - struct device_node *phy_node; - struct phy_device *phydev = NULL; - struct arc_emac_priv *priv; -- const char *mac_addr; - unsigned int id, clock_frequency, irq; - int err; - -@@ -942,11 +941,8 @@ int arc_emac_probe(struct net_device *nd - } - - /* Get MAC address from device tree */ -- mac_addr = of_get_mac_address(dev->of_node); -- -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(ndev->dev_addr, mac_addr); -- else -+ err = of_get_mac_address(dev->of_node, ndev->dev_addr); -+ if (err) - eth_hw_addr_random(ndev); - - arc_emac_set_address_internal(ndev); ---- a/drivers/net/ethernet/atheros/ag71xx.c -+++ b/drivers/net/ethernet/atheros/ag71xx.c -@@ -1857,7 +1857,6 @@ static int ag71xx_probe(struct platform_ - const struct ag71xx_dcfg *dcfg; - struct net_device *ndev; - struct resource *res; -- const void *mac_addr; - int tx_size, err, i; - struct ag71xx *ag; - -@@ -1953,10 +1952,8 @@ static int ag71xx_probe(struct platform_ - ag->stop_desc->ctrl = 0; - ag->stop_desc->next = (u32)ag->stop_desc_dma; - -- mac_addr = of_get_mac_address(np); -- if (!IS_ERR(mac_addr)) -- memcpy(ndev->dev_addr, mac_addr, ETH_ALEN); -- if (IS_ERR(mac_addr) || !is_valid_ether_addr(ndev->dev_addr)) { -+ err = of_get_mac_address(np, ndev->dev_addr); -+ if (err) { - netif_err(ag, probe, ndev, "invalid MAC address, using random address\n"); - eth_random_addr(ndev->dev_addr); - } ---- a/drivers/net/ethernet/broadcom/bcmsysport.c -+++ b/drivers/net/ethernet/broadcom/bcmsysport.c -@@ -2468,7 +2468,6 @@ static int bcm_sysport_probe(struct plat - struct bcm_sysport_priv *priv; - struct device_node *dn; - struct net_device *dev; -- const void *macaddr; - u32 txq, rxq; - int ret; - -@@ -2563,12 +2562,10 @@ static int bcm_sysport_probe(struct plat - } - - /* Initialize netdevice members */ -- macaddr = of_get_mac_address(dn); -- if (IS_ERR(macaddr)) { -+ ret = of_get_mac_address(dn, dev->dev_addr); -+ if (ret) { - dev_warn(&pdev->dev, "using random Ethernet MAC\n"); - eth_hw_addr_random(dev); -- } else { -- ether_addr_copy(dev->dev_addr, macaddr); - } - - SET_NETDEV_DEV(dev, &pdev->dev); ---- a/drivers/net/ethernet/broadcom/bgmac-bcma.c -+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c -@@ -115,7 +115,7 @@ static int bgmac_probe(struct bcma_devic - struct ssb_sprom *sprom = &core->bus->sprom; - struct mii_bus *mii_bus; - struct bgmac *bgmac; -- const u8 *mac = NULL; -+ const u8 *mac; - int err; - - bgmac = bgmac_alloc(&core->dev); -@@ -128,11 +128,10 @@ static int bgmac_probe(struct bcma_devic - - bcma_set_drvdata(core, bgmac); - -- if (bgmac->dev->of_node) -- mac = of_get_mac_address(bgmac->dev->of_node); -+ err = of_get_mac_address(bgmac->dev->of_node, bgmac->net_dev->dev_addr); - - /* If no MAC address assigned via device tree, check SPROM */ -- if (IS_ERR_OR_NULL(mac)) { -+ if (err) { - switch (core->core_unit) { - case 0: - mac = sprom->et0mac; -@@ -149,10 +148,9 @@ static int bgmac_probe(struct bcma_devic - err = -ENOTSUPP; - goto err; - } -+ ether_addr_copy(bgmac->net_dev->dev_addr, mac); - } - -- ether_addr_copy(bgmac->net_dev->dev_addr, mac); -- - /* On BCM4706 we need common core to access PHY */ - if (core->id.id == BCMA_CORE_4706_MAC_GBIT && - !core->bus->drv_gmac_cmn.core) { ---- a/drivers/net/ethernet/broadcom/bgmac-platform.c -+++ b/drivers/net/ethernet/broadcom/bgmac-platform.c -@@ -173,7 +173,7 @@ static int bgmac_probe(struct platform_d - struct device_node *np = pdev->dev.of_node; - struct bgmac *bgmac; - struct resource *regs; -- const u8 *mac_addr; -+ int ret; - - bgmac = bgmac_alloc(&pdev->dev); - if (!bgmac) -@@ -192,11 +192,10 @@ static int bgmac_probe(struct platform_d - bgmac->dev = &pdev->dev; - bgmac->dma_dev = &pdev->dev; - -- mac_addr = of_get_mac_address(np); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(bgmac->net_dev->dev_addr, mac_addr); -- else -- dev_warn(&pdev->dev, "MAC address not present in device tree\n"); -+ ret = of_get_mac_address(np, bgmac->net_dev->dev_addr); -+ if (ret) -+ dev_warn(&pdev->dev, -+ "MAC address not present in device tree\n"); - - bgmac->irq = platform_get_irq(pdev, 0); - if (bgmac->irq < 0) ---- a/drivers/net/ethernet/cadence/macb_main.c -+++ b/drivers/net/ethernet/cadence/macb_main.c -@@ -4484,7 +4484,6 @@ static int macb_probe(struct platform_de - struct net_device *dev; - struct resource *regs; - void __iomem *mem; -- const char *mac; - struct macb *bp; - int err, val; - -@@ -4597,15 +4596,11 @@ static int macb_probe(struct platform_de - if (bp->caps & MACB_CAPS_NEEDS_RSTONUBR) - bp->rx_intr_mask |= MACB_BIT(RXUBR); - -- mac = of_get_mac_address(np); -- if (PTR_ERR(mac) == -EPROBE_DEFER) { -- err = -EPROBE_DEFER; -+ err = of_get_mac_address(np, bp->dev->dev_addr); -+ if (err == -EPROBE_DEFER) - goto err_out_free_netdev; -- } else if (!IS_ERR_OR_NULL(mac)) { -- ether_addr_copy(bp->dev->dev_addr, mac); -- } else { -+ else if (err) - macb_get_hwaddr(bp); -- } - - err = of_get_phy_mode(np, &interface); - if (err) ---- a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c -+++ b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c -@@ -1385,7 +1385,6 @@ static int octeon_mgmt_probe(struct plat - struct net_device *netdev; - struct octeon_mgmt *p; - const __be32 *data; -- const u8 *mac; - struct resource *res_mix; - struct resource *res_agl; - struct resource *res_agl_prt_ctl; -@@ -1502,11 +1501,8 @@ static int octeon_mgmt_probe(struct plat - netdev->min_mtu = 64 - OCTEON_MGMT_RX_HEADROOM; - netdev->max_mtu = 16383 - OCTEON_MGMT_RX_HEADROOM - VLAN_HLEN; - -- mac = of_get_mac_address(pdev->dev.of_node); -- -- if (!IS_ERR(mac)) -- ether_addr_copy(netdev->dev_addr, mac); -- else -+ result = of_get_mac_address(pdev->dev.of_node, netdev->dev_addr); -+ if (result) - eth_hw_addr_random(netdev); - - p->phy_np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0); ---- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c -+++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c -@@ -1476,7 +1476,6 @@ static int bgx_init_of_phy(struct bgx *b - device_for_each_child_node(&bgx->pdev->dev, fwn) { - struct phy_device *pd; - struct device_node *phy_np; -- const char *mac; - - /* Should always be an OF node. But if it is not, we - * cannot handle it, so exit the loop. -@@ -1485,9 +1484,7 @@ static int bgx_init_of_phy(struct bgx *b - if (!node) - break; - -- mac = of_get_mac_address(node); -- if (!IS_ERR(mac)) -- ether_addr_copy(bgx->lmac[lmac].mac, mac); -+ of_get_mac_address(node, bgx->lmac[lmac].mac); - - SET_NETDEV_DEV(&bgx->lmac[lmac].netdev, &bgx->pdev->dev); - bgx->lmac[lmac].lmacid = lmac; ---- a/drivers/net/ethernet/davicom/dm9000.c -+++ b/drivers/net/ethernet/davicom/dm9000.c -@@ -1388,7 +1388,7 @@ static struct dm9000_plat_data *dm9000_p - { - struct dm9000_plat_data *pdata; - struct device_node *np = dev->of_node; -- const void *mac_addr; -+ int ret; - - if (!IS_ENABLED(CONFIG_OF) || !np) - return ERR_PTR(-ENXIO); -@@ -1402,11 +1402,9 @@ static struct dm9000_plat_data *dm9000_p - if (of_find_property(np, "davicom,no-eeprom", NULL)) - pdata->flags |= DM9000_PLATF_NO_EEPROM; - -- mac_addr = of_get_mac_address(np); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(pdata->dev_addr, mac_addr); -- else if (PTR_ERR(mac_addr) == -EPROBE_DEFER) -- return ERR_CAST(mac_addr); -+ ret = of_get_mac_address(np, pdata->dev_addr); -+ if (ret == -EPROBE_DEFER) -+ return ERR_PTR(ret); - - return pdata; - } ---- a/drivers/net/ethernet/ethoc.c -+++ b/drivers/net/ethernet/ethoc.c -@@ -1151,11 +1151,7 @@ static int ethoc_probe(struct platform_d - ether_addr_copy(netdev->dev_addr, pdata->hwaddr); - priv->phy_id = pdata->phy_id; - } else { -- const void *mac; -- -- mac = of_get_mac_address(pdev->dev.of_node); -- if (!IS_ERR(mac)) -- ether_addr_copy(netdev->dev_addr, mac); -+ of_get_mac_address(pdev->dev.of_node, netdev->dev_addr); - priv->phy_id = -1; - } - ---- a/drivers/net/ethernet/ezchip/nps_enet.c -+++ b/drivers/net/ethernet/ezchip/nps_enet.c -@@ -575,7 +575,6 @@ static s32 nps_enet_probe(struct platfor - struct net_device *ndev; - struct nps_enet_priv *priv; - s32 err = 0; -- const char *mac_addr; - - if (!dev->of_node) - return -ENODEV; -@@ -602,10 +601,8 @@ static s32 nps_enet_probe(struct platfor - dev_dbg(dev, "Registers base address is 0x%p\n", priv->regs_base); - - /* set kernel MAC address to dev */ -- mac_addr = of_get_mac_address(dev->of_node); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(ndev->dev_addr, mac_addr); -- else -+ err = of_get_mac_address(dev->of_node, ndev->dev_addr); -+ if (err) - eth_hw_addr_random(ndev); - - /* Get IRQ number */ ---- a/drivers/net/ethernet/freescale/fec_main.c -+++ b/drivers/net/ethernet/freescale/fec_main.c -@@ -1666,6 +1666,7 @@ static void fec_get_mac(struct net_devic - struct fec_enet_private *fep = netdev_priv(ndev); - struct fec_platform_data *pdata = dev_get_platdata(&fep->pdev->dev); - unsigned char *iap, tmpaddr[ETH_ALEN]; -+ int ret; - - /* - * try to get mac address in following order: -@@ -1681,9 +1682,9 @@ static void fec_get_mac(struct net_devic - if (!is_valid_ether_addr(iap)) { - struct device_node *np = fep->pdev->dev.of_node; - if (np) { -- const char *mac = of_get_mac_address(np); -- if (!IS_ERR(mac)) -- iap = (unsigned char *) mac; -+ ret = of_get_mac_address(np, tmpaddr); -+ if (!ret) -+ iap = tmpaddr; - } - } - ---- a/drivers/net/ethernet/freescale/fec_mpc52xx.c -+++ b/drivers/net/ethernet/freescale/fec_mpc52xx.c -@@ -813,7 +813,6 @@ static int mpc52xx_fec_probe(struct plat - const u32 *prop; - int prop_size; - struct device_node *np = op->dev.of_node; -- const char *mac_addr; - - phys_addr_t rx_fifo; - phys_addr_t tx_fifo; -@@ -891,10 +890,8 @@ static int mpc52xx_fec_probe(struct plat - * - * First try to read MAC address from DT - */ -- mac_addr = of_get_mac_address(np); -- if (!IS_ERR(mac_addr)) { -- ether_addr_copy(ndev->dev_addr, mac_addr); -- } else { -+ rv = of_get_mac_address(np, ndev->dev_addr); -+ if (rv) { - struct mpc52xx_fec __iomem *fec = priv->fec; - - /* ---- a/drivers/net/ethernet/freescale/fman/mac.c -+++ b/drivers/net/ethernet/freescale/fman/mac.c -@@ -616,7 +616,6 @@ static int mac_probe(struct platform_dev - struct platform_device *of_dev; - struct resource res; - struct mac_priv_s *priv; -- const u8 *mac_addr; - u32 val; - u8 fman_id; - phy_interface_t phy_if; -@@ -734,11 +733,9 @@ static int mac_probe(struct platform_dev - priv->cell_index = (u8)val; - - /* Get the MAC address */ -- mac_addr = of_get_mac_address(mac_node); -- if (IS_ERR(mac_addr)) -+ err = of_get_mac_address(mac_node, mac_dev->addr); -+ if (err) - dev_warn(dev, "of_get_mac_address(%pOF) failed\n", mac_node); -- else -- ether_addr_copy(mac_dev->addr, mac_addr); - - /* Get the port handles */ - nph = of_count_phandle_with_args(mac_node, "fsl,fman-ports", NULL); -@@ -864,7 +861,7 @@ static int mac_probe(struct platform_dev - if (err < 0) - dev_err(dev, "fman_set_mac_active_pause() = %d\n", err); - -- if (!IS_ERR(mac_addr)) -+ if (!is_zero_ether_addr(mac_dev->addr)) - dev_info(dev, "FMan MAC address: %pM\n", mac_dev->addr); - - priv->eth_dev = dpaa_eth_add_device(fman_id, mac_dev); ---- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c -+++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c -@@ -918,7 +918,6 @@ static int fs_enet_probe(struct platform - const u32 *data; - struct clk *clk; - int err; -- const u8 *mac_addr; - const char *phy_connection_type; - int privsize, len, ret = -ENODEV; - -@@ -1006,9 +1005,7 @@ static int fs_enet_probe(struct platform - spin_lock_init(&fep->lock); - spin_lock_init(&fep->tx_lock); - -- mac_addr = of_get_mac_address(ofdev->dev.of_node); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(ndev->dev_addr, mac_addr); -+ of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr); - - ret = fep->ops->allocate_bd(ndev); - if (ret) ---- a/drivers/net/ethernet/freescale/gianfar.c -+++ b/drivers/net/ethernet/freescale/gianfar.c -@@ -641,7 +641,6 @@ static phy_interface_t gfar_get_interfac - static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev) - { - const char *model; -- const void *mac_addr; - int err = 0, i; - phy_interface_t interface; - struct net_device *dev = NULL; -@@ -783,11 +782,8 @@ static int gfar_of_init(struct platform_ - if (stash_len || stash_idx) - priv->device_flags |= FSL_GIANFAR_DEV_HAS_BUF_STASHING; - -- mac_addr = of_get_mac_address(np); -- -- if (!IS_ERR(mac_addr)) { -- ether_addr_copy(dev->dev_addr, mac_addr); -- } else { -+ err = of_get_mac_address(np, dev->dev_addr); -+ if (err) { - eth_hw_addr_random(dev); - dev_info(&ofdev->dev, "Using random MAC address: %pM\n", dev->dev_addr); - } ---- a/drivers/net/ethernet/freescale/ucc_geth.c -+++ b/drivers/net/ethernet/freescale/ucc_geth.c -@@ -3696,7 +3696,6 @@ static int ucc_geth_probe(struct platfor - int err, ucc_num, max_speed = 0; - const unsigned int *prop; - const char *sprop; -- const void *mac_addr; - phy_interface_t phy_interface; - static const int enet_to_speed[] = { - SPEED_10, SPEED_10, SPEED_10, -@@ -3906,9 +3905,7 @@ static int ucc_geth_probe(struct platfor - goto err_free_netdev; - } - -- mac_addr = of_get_mac_address(np); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(dev->dev_addr, mac_addr); -+ of_get_mac_address(np, dev->dev_addr); - - ugeth->ug_info = ug_info; - ugeth->dev = device; ---- a/drivers/net/ethernet/hisilicon/hisi_femac.c -+++ b/drivers/net/ethernet/hisilicon/hisi_femac.c -@@ -772,7 +772,6 @@ static int hisi_femac_drv_probe(struct p - struct net_device *ndev; - struct hisi_femac_priv *priv; - struct phy_device *phy; -- const char *mac_addr; - int ret; - - ndev = alloc_etherdev(sizeof(*priv)); -@@ -842,10 +841,8 @@ static int hisi_femac_drv_probe(struct p - (unsigned long)phy->phy_id, - phy_modes(phy->interface)); - -- mac_addr = of_get_mac_address(node); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(ndev->dev_addr, mac_addr); -- if (!is_valid_ether_addr(ndev->dev_addr)) { -+ ret = of_get_mac_address(node, ndev->dev_addr); -+ if (ret) { - eth_hw_addr_random(ndev); - dev_warn(dev, "using random MAC address %pM\n", - ndev->dev_addr); ---- a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c -+++ b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c -@@ -1098,7 +1098,6 @@ static int hix5hd2_dev_probe(struct plat - struct net_device *ndev; - struct hix5hd2_priv *priv; - struct mii_bus *bus; -- const char *mac_addr; - int ret; - - ndev = alloc_etherdev(sizeof(struct hix5hd2_priv)); -@@ -1220,10 +1219,8 @@ static int hix5hd2_dev_probe(struct plat - goto out_phy_node; - } - -- mac_addr = of_get_mac_address(node); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(ndev->dev_addr, mac_addr); -- if (!is_valid_ether_addr(ndev->dev_addr)) { -+ ret = of_get_mac_address(node, ndev->dev_addr); -+ if (ret) { - eth_hw_addr_random(ndev); - netdev_warn(ndev, "using random MAC address %pM\n", - ndev->dev_addr); ---- a/drivers/net/ethernet/lantiq_xrx200.c -+++ b/drivers/net/ethernet/lantiq_xrx200.c -@@ -440,7 +440,6 @@ static int xrx200_probe(struct platform_ - struct resource *res; - struct xrx200_priv *priv; - struct net_device *net_dev; -- const u8 *mac; - int err; - - /* alloc the network device */ -@@ -484,10 +483,8 @@ static int xrx200_probe(struct platform_ - return PTR_ERR(priv->clk); - } - -- mac = of_get_mac_address(np); -- if (!IS_ERR(mac)) -- ether_addr_copy(net_dev->dev_addr, mac); -- else -+ err = of_get_mac_address(np, net_dev->dev_addr); -+ if (err) - eth_hw_addr_random(net_dev); - - /* bring up the dma engine and IP core */ ---- a/drivers/net/ethernet/marvell/mv643xx_eth.c -+++ b/drivers/net/ethernet/marvell/mv643xx_eth.c -@@ -2701,7 +2701,6 @@ static int mv643xx_eth_shared_of_add_por - struct platform_device *ppdev; - struct mv643xx_eth_platform_data ppd; - struct resource res; -- const char *mac_addr; - int ret; - int dev_num = 0; - -@@ -2732,9 +2731,7 @@ static int mv643xx_eth_shared_of_add_por - return -EINVAL; - } - -- mac_addr = of_get_mac_address(pnp); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(ppd.mac_addr, mac_addr); -+ of_get_mac_address(pnp, ppd.mac_addr); - - mv643xx_eth_property(pnp, "tx-queue-size", ppd.tx_queue_size); - mv643xx_eth_property(pnp, "tx-sram-addr", ppd.tx_sram_addr); ---- a/drivers/net/ethernet/marvell/mvneta.c -+++ b/drivers/net/ethernet/marvell/mvneta.c -@@ -5062,7 +5062,6 @@ static int mvneta_probe(struct platform_ - struct net_device *dev; - struct phylink *phylink; - struct phy *comphy; -- const char *dt_mac_addr; - char hw_mac_addr[ETH_ALEN]; - phy_interface_t phy_mode; - const char *mac_from; -@@ -5158,10 +5157,9 @@ static int mvneta_probe(struct platform_ - goto err_free_ports; - } - -- dt_mac_addr = of_get_mac_address(dn); -- if (!IS_ERR(dt_mac_addr)) { -+ err = of_get_mac_address(dn, dev->dev_addr); -+ if (!err) { - mac_from = "device tree"; -- ether_addr_copy(dev->dev_addr, dt_mac_addr); - } else { - mvneta_get_mac_addr(pp, hw_mac_addr); - if (is_valid_ether_addr(hw_mac_addr)) { ---- a/drivers/net/ethernet/marvell/prestera/prestera_main.c -+++ b/drivers/net/ethernet/marvell/prestera/prestera_main.c -@@ -466,20 +466,17 @@ static int prestera_switch_set_base_mac_ - { - struct device_node *base_mac_np; - struct device_node *np; -- const char *base_mac; -+ int ret; - - np = of_find_compatible_node(NULL, NULL, "marvell,prestera"); - base_mac_np = of_parse_phandle(np, "base-mac-provider", 0); - -- base_mac = of_get_mac_address(base_mac_np); -- of_node_put(base_mac_np); -- if (!IS_ERR(base_mac)) -- ether_addr_copy(sw->base_mac, base_mac); -- -- if (!is_valid_ether_addr(sw->base_mac)) { -+ ret = of_get_mac_address(base_mac_np, sw->base_mac); -+ if (ret) { - eth_random_addr(sw->base_mac); - dev_info(prestera_dev(sw), "using random base mac address\n"); - } -+ of_node_put(base_mac_np); - - return prestera_hw_switch_mac_set(sw, sw->base_mac); - } ---- a/drivers/net/ethernet/marvell/pxa168_eth.c -+++ b/drivers/net/ethernet/marvell/pxa168_eth.c -@@ -1392,7 +1392,6 @@ static int pxa168_eth_probe(struct platf - struct resource *res; - struct clk *clk; - struct device_node *np; -- const unsigned char *mac_addr = NULL; - int err; - - printk(KERN_NOTICE "PXA168 10/100 Ethernet Driver\n"); -@@ -1435,12 +1434,8 @@ static int pxa168_eth_probe(struct platf - - INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task); - -- if (pdev->dev.of_node) -- mac_addr = of_get_mac_address(pdev->dev.of_node); -- -- if (!IS_ERR_OR_NULL(mac_addr)) { -- ether_addr_copy(dev->dev_addr, mac_addr); -- } else { -+ err = of_get_mac_address(pdev->dev.of_node, dev->dev_addr); -+ if (err) { - /* try reading the mac address, if set by the bootloader */ - pxa168_eth_get_mac_address(dev, dev->dev_addr); - if (!is_valid_ether_addr(dev->dev_addr)) { ---- a/drivers/net/ethernet/marvell/sky2.c -+++ b/drivers/net/ethernet/marvell/sky2.c -@@ -4725,7 +4725,7 @@ static struct net_device *sky2_init_netd - { - struct sky2_port *sky2; - struct net_device *dev = alloc_etherdev(sizeof(*sky2)); -- const void *iap; -+ int ret; - - if (!dev) - return NULL; -@@ -4795,10 +4795,8 @@ static struct net_device *sky2_init_netd - * 1) from device tree data - * 2) from internal registers set by bootloader - */ -- iap = of_get_mac_address(hw->pdev->dev.of_node); -- if (!IS_ERR(iap)) -- ether_addr_copy(dev->dev_addr, iap); -- else -+ ret = of_get_mac_address(hw->pdev->dev.of_node, dev->dev_addr); -+ if (ret) - memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, - ETH_ALEN); - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -2605,14 +2605,11 @@ static int __init mtk_init(struct net_de - { - struct mtk_mac *mac = netdev_priv(dev); - struct mtk_eth *eth = mac->hw; -- const char *mac_addr; -+ int ret; - -- mac_addr = of_get_mac_address(mac->of_node); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(dev->dev_addr, mac_addr); -- -- /* If the mac address is invalid, use random mac address */ -- if (!is_valid_ether_addr(dev->dev_addr)) { -+ ret = of_get_mac_address(mac->of_node, dev->dev_addr); -+ if (ret) { -+ /* If the mac address is invalid, use random mac address */ - eth_hw_addr_random(dev); - dev_err(eth->dev, "generated random MAC address %pM\n", - dev->dev_addr); ---- a/drivers/net/ethernet/micrel/ks8851_common.c -+++ b/drivers/net/ethernet/micrel/ks8851_common.c -@@ -194,11 +194,10 @@ static void ks8851_read_mac_addr(struct - static void ks8851_init_mac(struct ks8851_net *ks, struct device_node *np) - { - struct net_device *dev = ks->netdev; -- const u8 *mac_addr; -+ int ret; - -- mac_addr = of_get_mac_address(np); -- if (!IS_ERR(mac_addr)) { -- ether_addr_copy(dev->dev_addr, mac_addr); -+ ret = of_get_mac_address(np, dev->dev_addr); -+ if (!ret) { - ks8851_write_mac_addr(dev); - return; - } ---- a/drivers/net/ethernet/microchip/lan743x_main.c -+++ b/drivers/net/ethernet/microchip/lan743x_main.c -@@ -2831,7 +2831,6 @@ static int lan743x_pcidev_probe(struct p - { - struct lan743x_adapter *adapter = NULL; - struct net_device *netdev = NULL; -- const void *mac_addr; - int ret = -ENODEV; - - netdev = devm_alloc_etherdev(&pdev->dev, -@@ -2848,9 +2847,7 @@ static int lan743x_pcidev_probe(struct p - NETIF_MSG_IFDOWN | NETIF_MSG_TX_QUEUED; - netdev->max_mtu = LAN743X_MAX_FRAME_SIZE; - -- mac_addr = of_get_mac_address(pdev->dev.of_node); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(adapter->mac_address, mac_addr); -+ of_get_mac_address(pdev->dev.of_node, adapter->mac_address); - - ret = lan743x_pci_init(adapter, pdev); - if (ret) ---- a/drivers/net/ethernet/nxp/lpc_eth.c -+++ b/drivers/net/ethernet/nxp/lpc_eth.c -@@ -1347,9 +1347,7 @@ static int lpc_eth_drv_probe(struct plat - __lpc_get_mac(pldat, ndev->dev_addr); - - if (!is_valid_ether_addr(ndev->dev_addr)) { -- const char *macaddr = of_get_mac_address(np); -- if (!IS_ERR(macaddr)) -- ether_addr_copy(ndev->dev_addr, macaddr); -+ of_get_mac_address(np, ndev->dev_addr); - } - if (!is_valid_ether_addr(ndev->dev_addr)) - eth_hw_addr_random(ndev); ---- a/drivers/net/ethernet/qualcomm/qca_spi.c -+++ b/drivers/net/ethernet/qualcomm/qca_spi.c -@@ -885,7 +885,7 @@ qca_spi_probe(struct spi_device *spi) - struct net_device *qcaspi_devs = NULL; - u8 legacy_mode = 0; - u16 signature; -- const char *mac; -+ int ret; - - if (!spi->dev.of_node) { - dev_err(&spi->dev, "Missing device tree\n"); -@@ -962,12 +962,8 @@ qca_spi_probe(struct spi_device *spi) - - spi_set_drvdata(spi, qcaspi_devs); - -- mac = of_get_mac_address(spi->dev.of_node); -- -- if (!IS_ERR(mac)) -- ether_addr_copy(qca->net_dev->dev_addr, mac); -- -- if (!is_valid_ether_addr(qca->net_dev->dev_addr)) { -+ ret = of_get_mac_address(spi->dev.of_node, qca->net_dev->dev_addr); -+ if (ret) { - eth_hw_addr_random(qca->net_dev); - dev_info(&spi->dev, "Using random MAC address: %pM\n", - qca->net_dev->dev_addr); ---- a/drivers/net/ethernet/qualcomm/qca_uart.c -+++ b/drivers/net/ethernet/qualcomm/qca_uart.c -@@ -323,7 +323,6 @@ static int qca_uart_probe(struct serdev_ - { - struct net_device *qcauart_dev = alloc_etherdev(sizeof(struct qcauart)); - struct qcauart *qca; -- const char *mac; - u32 speed = 115200; - int ret; - -@@ -348,12 +347,8 @@ static int qca_uart_probe(struct serdev_ - - of_property_read_u32(serdev->dev.of_node, "current-speed", &speed); - -- mac = of_get_mac_address(serdev->dev.of_node); -- -- if (!IS_ERR(mac)) -- ether_addr_copy(qca->net_dev->dev_addr, mac); -- -- if (!is_valid_ether_addr(qca->net_dev->dev_addr)) { -+ ret = of_get_mac_address(serdev->dev.of_node, qca->net_dev->dev_addr); -+ if (ret) { - eth_hw_addr_random(qca->net_dev); - dev_info(&serdev->dev, "Using random MAC address: %pM\n", - qca->net_dev->dev_addr); ---- a/drivers/net/ethernet/renesas/ravb_main.c -+++ b/drivers/net/ethernet/renesas/ravb_main.c -@@ -109,11 +109,13 @@ static void ravb_set_buffer_align(struct - * Ethernet AVB device doesn't have ROM for MAC address. - * This function gets the MAC address that was used by a bootloader. - */ --static void ravb_read_mac_address(struct net_device *ndev, const u8 *mac) -+static void ravb_read_mac_address(struct device_node *np, -+ struct net_device *ndev) - { -- if (!IS_ERR(mac)) { -- ether_addr_copy(ndev->dev_addr, mac); -- } else { -+ int ret; -+ -+ ret = of_get_mac_address(np, ndev->dev_addr); -+ if (ret) { - u32 mahr = ravb_read(ndev, MAHR); - u32 malr = ravb_read(ndev, MALR); - -@@ -2189,7 +2191,7 @@ static int ravb_probe(struct platform_de - priv->msg_enable = RAVB_DEF_MSG_ENABLE; - - /* Read and set MAC address */ -- ravb_read_mac_address(ndev, of_get_mac_address(np)); -+ ravb_read_mac_address(np, ndev); - if (!is_valid_ether_addr(ndev->dev_addr)) { - dev_warn(&pdev->dev, - "no valid MAC address supplied, using a random one\n"); ---- a/drivers/net/ethernet/renesas/sh_eth.c -+++ b/drivers/net/ethernet/renesas/sh_eth.c -@@ -3145,7 +3145,6 @@ static struct sh_eth_plat_data *sh_eth_p - struct device_node *np = dev->of_node; - struct sh_eth_plat_data *pdata; - phy_interface_t interface; -- const char *mac_addr; - int ret; - - pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); -@@ -3157,9 +3156,7 @@ static struct sh_eth_plat_data *sh_eth_p - return NULL; - pdata->phy_interface = interface; - -- mac_addr = of_get_mac_address(np); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(pdata->mac_addr, mac_addr); -+ of_get_mac_address(np, pdata->mac_addr); - - pdata->no_ether_link = - of_property_read_bool(np, "renesas,no-ether-link"); ---- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c -+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c -@@ -25,8 +25,7 @@ - - #ifdef CONFIG_OF - static int sxgbe_probe_config_dt(struct platform_device *pdev, -- struct sxgbe_plat_data *plat, -- const char **mac) -+ struct sxgbe_plat_data *plat) - { - struct device_node *np = pdev->dev.of_node; - struct sxgbe_dma_cfg *dma_cfg; -@@ -35,7 +34,6 @@ static int sxgbe_probe_config_dt(struct - if (!np) - return -ENODEV; - -- *mac = of_get_mac_address(np); - err = of_get_phy_mode(np, &plat->interface); - if (err && err != -ENODEV) - return err; -@@ -63,8 +61,7 @@ static int sxgbe_probe_config_dt(struct - } - #else - static int sxgbe_probe_config_dt(struct platform_device *pdev, -- struct sxgbe_plat_data *plat, -- const char **mac) -+ struct sxgbe_plat_data *plat) - { - return -ENOSYS; - } -@@ -85,7 +82,6 @@ static int sxgbe_platform_probe(struct p - void __iomem *addr; - struct sxgbe_priv_data *priv = NULL; - struct sxgbe_plat_data *plat_dat = NULL; -- const char *mac = NULL; - struct net_device *ndev = platform_get_drvdata(pdev); - struct device_node *node = dev->of_node; - -@@ -101,7 +97,7 @@ static int sxgbe_platform_probe(struct p - if (!plat_dat) - return -ENOMEM; - -- ret = sxgbe_probe_config_dt(pdev, plat_dat, &mac); -+ ret = sxgbe_probe_config_dt(pdev, plat_dat); - if (ret) { - pr_err("%s: main dt probe failed\n", __func__); - return ret; -@@ -122,8 +118,7 @@ static int sxgbe_platform_probe(struct p - } - - /* Get MAC address if available (DT) */ -- if (!IS_ERR_OR_NULL(mac)) -- ether_addr_copy(priv->dev->dev_addr, mac); -+ of_get_mac_address(node, priv->dev->dev_addr); - - /* Get the TX/RX IRQ numbers */ - for (i = 0, chan = 1; i < SXGBE_TX_QUEUES; i++) { ---- a/drivers/net/ethernet/socionext/sni_ave.c -+++ b/drivers/net/ethernet/socionext/sni_ave.c -@@ -1559,7 +1559,6 @@ static int ave_probe(struct platform_dev - struct ave_private *priv; - struct net_device *ndev; - struct device_node *np; -- const void *mac_addr; - void __iomem *base; - const char *name; - int i, irq, ret; -@@ -1600,12 +1599,9 @@ static int ave_probe(struct platform_dev - - ndev->max_mtu = AVE_MAX_ETHFRAME - (ETH_HLEN + ETH_FCS_LEN); - -- mac_addr = of_get_mac_address(np); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(ndev->dev_addr, mac_addr); -- -- /* if the mac address is invalid, use random mac address */ -- if (!is_valid_ether_addr(ndev->dev_addr)) { -+ ret = of_get_mac_address(np, ndev->dev_addr); -+ if (ret) { -+ /* if the mac address is invalid, use random mac address */ - eth_hw_addr_random(ndev); - dev_warn(dev, "Using random MAC address: %pM\n", - ndev->dev_addr); ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c -@@ -115,7 +115,7 @@ static int anarion_dwmac_probe(struct pl - if (IS_ERR(gmac)) - return PTR_ERR(gmac); - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c -@@ -445,7 +445,7 @@ static int dwc_eth_dwmac_probe(struct pl - if (IS_ERR(stmmac_res.addr)) - return PTR_ERR(stmmac_res.addr); - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c -@@ -27,7 +27,7 @@ static int dwmac_generic_probe(struct pl - return ret; - - if (pdev->dev.of_node) { -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) { - dev_err(&pdev->dev, "dt configuration failed\n"); - return PTR_ERR(plat_dat); ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c -@@ -226,7 +226,7 @@ static int imx_dwmac_probe(struct platfo - if (!dwmac) - return -ENOMEM; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c -@@ -88,7 +88,7 @@ static int intel_eth_plat_probe(struct p - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) { - dev_err(&pdev->dev, "dt configuration failed\n"); - return PTR_ERR(plat_dat); ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c -@@ -255,7 +255,7 @@ static int ipq806x_gmac_probe(struct pla - if (val) - return val; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c -@@ -37,7 +37,7 @@ static int lpc18xx_dwmac_probe(struct pl - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c -@@ -407,7 +407,7 @@ static int mediatek_dwmac_probe(struct p - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c -@@ -52,7 +52,7 @@ static int meson6_dwmac_probe(struct pla - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c -@@ -370,7 +370,7 @@ static int meson8b_dwmac_probe(struct pl - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c -@@ -118,7 +118,7 @@ static int oxnas_dwmac_probe(struct plat - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c -@@ -461,7 +461,7 @@ static int qcom_ethqos_probe(struct plat - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) { - dev_err(&pdev->dev, "dt configuration failed\n"); - return PTR_ERR(plat_dat); ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c -@@ -1392,7 +1392,7 @@ static int rk_gmac_probe(struct platform - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c -@@ -397,7 +397,7 @@ static int socfpga_dwmac_probe(struct pl - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c -@@ -325,7 +325,7 @@ static int sti_dwmac_probe(struct platfo - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c -@@ -371,7 +371,7 @@ static int stm32_dwmac_probe(struct plat - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c -@@ -1203,7 +1203,7 @@ static int sun8i_dwmac_probe(struct plat - if (ret) - return -EINVAL; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c -@@ -108,7 +108,7 @@ static int sun7i_gmac_probe(struct platf - if (ret) - return ret; - -- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); -+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac); - if (IS_ERR(plat_dat)) - return PTR_ERR(plat_dat); - ---- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h -+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h -@@ -25,7 +25,7 @@ - - struct stmmac_resources { - void __iomem *addr; -- const char *mac; -+ u8 mac[ETH_ALEN]; - int wol_irq; - int lpi_irq; - int irq; ---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -@@ -5019,7 +5019,7 @@ int stmmac_dvr_probe(struct device *devi - priv->wol_irq = res->wol_irq; - priv->lpi_irq = res->lpi_irq; - -- if (!IS_ERR_OR_NULL(res->mac)) -+ if (!is_zero_ether_addr(res->mac)) - memcpy(priv->dev->dev_addr, res->mac, ETH_ALEN); - - dev_set_drvdata(device, priv->dev); ---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c -+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c -@@ -395,7 +395,7 @@ static int stmmac_of_get_mac_mode(struct - * set some private fields that will be used by the main at runtime. - */ - struct plat_stmmacenet_data * --stmmac_probe_config_dt(struct platform_device *pdev, const char **mac) -+stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac) - { - struct device_node *np = pdev->dev.of_node; - struct plat_stmmacenet_data *plat; -@@ -407,12 +407,12 @@ stmmac_probe_config_dt(struct platform_d - if (!plat) - return ERR_PTR(-ENOMEM); - -- *mac = of_get_mac_address(np); -- if (IS_ERR(*mac)) { -- if (PTR_ERR(*mac) == -EPROBE_DEFER) -- return ERR_CAST(*mac); -+ rc = of_get_mac_address(np, mac); -+ if (rc) { -+ if (rc == -EPROBE_DEFER) -+ return ERR_PTR(rc); - -- *mac = NULL; -+ eth_zero_addr(mac); - } - - phy_mode = device_get_phy_mode(&pdev->dev); -@@ -643,7 +643,7 @@ void stmmac_remove_config_dt(struct plat - } - #else - struct plat_stmmacenet_data * --stmmac_probe_config_dt(struct platform_device *pdev, const char **mac) -+stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac) - { - return ERR_PTR(-EINVAL); - } ---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h -+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h -@@ -12,7 +12,7 @@ - #include "stmmac.h" - - struct plat_stmmacenet_data * --stmmac_probe_config_dt(struct platform_device *pdev, const char **mac); -+stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac); - void stmmac_remove_config_dt(struct platform_device *pdev, - struct plat_stmmacenet_data *plat); - ---- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c -+++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c -@@ -1713,7 +1713,6 @@ static int am65_cpsw_nuss_init_slave_por - - for_each_child_of_node(node, port_np) { - struct am65_cpsw_port *port; -- const void *mac_addr; - u32 port_id; - - /* it is not a slave port node, continue */ -@@ -1796,15 +1795,15 @@ static int am65_cpsw_nuss_init_slave_por - goto of_node_put; - } - -- mac_addr = of_get_mac_address(port_np); -- if (!IS_ERR(mac_addr)) { -- ether_addr_copy(port->slave.mac_addr, mac_addr); -- } else if (am65_cpsw_am654_get_efuse_macid(port_np, -- port->port_id, -- port->slave.mac_addr) || -- !is_valid_ether_addr(port->slave.mac_addr)) { -- random_ether_addr(port->slave.mac_addr); -- dev_err(dev, "Use random MAC address\n"); -+ ret = of_get_mac_address(port_np, port->slave.mac_addr); -+ if (ret) { -+ am65_cpsw_am654_get_efuse_macid(port_np, -+ port->port_id, -+ port->slave.mac_addr); -+ if (!is_valid_ether_addr(port->slave.mac_addr)) { -+ random_ether_addr(port->slave.mac_addr); -+ dev_err(dev, "Use random MAC address\n"); -+ } - } - } - of_node_put(node); ---- a/drivers/net/ethernet/ti/cpsw.c -+++ b/drivers/net/ethernet/ti/cpsw.c -@@ -1308,7 +1308,6 @@ static int cpsw_probe_dt(struct cpsw_pla - - for_each_available_child_of_node(node, slave_node) { - struct cpsw_slave_data *slave_data = data->slave_data + i; -- const void *mac_addr = NULL; - int lenp; - const __be32 *parp; - -@@ -1380,10 +1379,8 @@ static int cpsw_probe_dt(struct cpsw_pla - } - - no_phy_slave: -- mac_addr = of_get_mac_address(slave_node); -- if (!IS_ERR(mac_addr)) { -- ether_addr_copy(slave_data->mac_addr, mac_addr); -- } else { -+ ret = of_get_mac_address(slave_node, slave_data->mac_addr); -+ if (ret) { - ret = ti_cm_get_macid(&pdev->dev, i, - slave_data->mac_addr); - if (ret) ---- a/drivers/net/ethernet/ti/cpsw_new.c -+++ b/drivers/net/ethernet/ti/cpsw_new.c -@@ -1269,7 +1269,6 @@ static int cpsw_probe_dt(struct cpsw_com - - for_each_child_of_node(tmp_node, port_np) { - struct cpsw_slave_data *slave_data; -- const void *mac_addr; - u32 port_id; - - ret = of_property_read_u32(port_np, "reg", &port_id); -@@ -1328,10 +1327,8 @@ static int cpsw_probe_dt(struct cpsw_com - goto err_node_put; - } - -- mac_addr = of_get_mac_address(port_np); -- if (!IS_ERR(mac_addr)) { -- ether_addr_copy(slave_data->mac_addr, mac_addr); -- } else { -+ ret = of_get_mac_address(port_np, slave_data->mac_addr); -+ if (ret) { - ret = ti_cm_get_macid(dev, port_id - 1, - slave_data->mac_addr); - if (ret) ---- a/drivers/net/ethernet/ti/davinci_emac.c -+++ b/drivers/net/ethernet/ti/davinci_emac.c -@@ -1699,7 +1699,6 @@ davinci_emac_of_get_pdata(struct platfor - const struct of_device_id *match; - const struct emac_platform_data *auxdata; - struct emac_platform_data *pdata = NULL; -- const u8 *mac_addr; - - if (!IS_ENABLED(CONFIG_OF) || !pdev->dev.of_node) - return dev_get_platdata(&pdev->dev); -@@ -1711,11 +1710,8 @@ davinci_emac_of_get_pdata(struct platfor - np = pdev->dev.of_node; - pdata->version = EMAC_VERSION_2; - -- if (!is_valid_ether_addr(pdata->mac_addr)) { -- mac_addr = of_get_mac_address(np); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(pdata->mac_addr, mac_addr); -- } -+ if (!is_valid_ether_addr(pdata->mac_addr)) -+ of_get_mac_address(np, pdata->mac_addr); - - of_property_read_u32(np, "ti,davinci-ctrl-reg-offset", - &pdata->ctrl_reg_offset); ---- a/drivers/net/ethernet/ti/netcp_core.c -+++ b/drivers/net/ethernet/ti/netcp_core.c -@@ -1966,7 +1966,6 @@ static int netcp_create_interface(struct - struct resource res; - void __iomem *efuse = NULL; - u32 efuse_mac = 0; -- const void *mac_addr; - u8 efuse_mac_addr[6]; - u32 temp[2]; - int ret = 0; -@@ -2036,10 +2035,8 @@ static int netcp_create_interface(struct - devm_iounmap(dev, efuse); - devm_release_mem_region(dev, res.start, size); - } else { -- mac_addr = of_get_mac_address(node_interface); -- if (!IS_ERR(mac_addr)) -- ether_addr_copy(ndev->dev_addr, mac_addr); -- else -+ ret = of_get_mac_address(node_interface, ndev->dev_addr); -+ if (ret) - eth_random_addr(ndev->dev_addr); - } - ---- a/drivers/net/ethernet/wiznet/w5100-spi.c -+++ b/drivers/net/ethernet/wiznet/w5100-spi.c -@@ -423,8 +423,14 @@ static int w5100_spi_probe(struct spi_de - const struct of_device_id *of_id; - const struct w5100_ops *ops; - kernel_ulong_t driver_data; -+ const void *mac = NULL; -+ u8 tmpmac[ETH_ALEN]; - int priv_size; -- const void *mac = of_get_mac_address(spi->dev.of_node); -+ int ret; -+ -+ ret = of_get_mac_address(spi->dev.of_node, tmpmac); -+ if (!ret) -+ mac = tmpmac; - - if (spi->dev.of_node) { - of_id = of_match_device(w5100_of_match, &spi->dev); ---- a/drivers/net/ethernet/wiznet/w5100.c -+++ b/drivers/net/ethernet/wiznet/w5100.c -@@ -1159,7 +1159,7 @@ int w5100_probe(struct device *dev, cons - INIT_WORK(&priv->setrx_work, w5100_setrx_work); - INIT_WORK(&priv->restart_work, w5100_restart_work); - -- if (!IS_ERR_OR_NULL(mac_addr)) -+ if (mac_addr) - memcpy(ndev->dev_addr, mac_addr, ETH_ALEN); - else - eth_hw_addr_random(ndev); ---- a/drivers/net/ethernet/xilinx/ll_temac_main.c -+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c -@@ -438,7 +438,7 @@ static void temac_do_set_mac_address(str - - static int temac_init_mac_address(struct net_device *ndev, const void *address) - { -- ether_addr_copy(ndev->dev_addr, address); -+ memcpy(ndev->dev_addr, address, ETH_ALEN); - if (!is_valid_ether_addr(ndev->dev_addr)) - eth_hw_addr_random(ndev); - temac_do_set_mac_address(ndev); -@@ -1370,7 +1370,7 @@ static int temac_probe(struct platform_d - struct device_node *temac_np = dev_of_node(&pdev->dev), *dma_np; - struct temac_local *lp; - struct net_device *ndev; -- const void *addr; -+ u8 addr[ETH_ALEN]; - __be32 *p; - bool little_endian; - int rc = 0; -@@ -1563,8 +1563,8 @@ static int temac_probe(struct platform_d - - if (temac_np) { - /* Retrieve the MAC address */ -- addr = of_get_mac_address(temac_np); -- if (IS_ERR(addr)) { -+ rc = of_get_mac_address(temac_np, addr); -+ if (rc) { - dev_err(&pdev->dev, "could not find MAC address\n"); - return -ENODEV; - } ---- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c -+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c -@@ -1843,8 +1843,8 @@ static int axienet_probe(struct platform - struct device_node *np; - struct axienet_local *lp; - struct net_device *ndev; -- const void *mac_addr; - struct resource *ethres; -+ u8 mac_addr[ETH_ALEN]; - int addr_width = 32; - u32 value; - -@@ -2044,13 +2044,14 @@ static int axienet_probe(struct platform - dev_info(&pdev->dev, "Ethernet core IRQ not defined\n"); - - /* Retrieve the MAC address */ -- mac_addr = of_get_mac_address(pdev->dev.of_node); -- if (IS_ERR(mac_addr)) { -- dev_warn(&pdev->dev, "could not find MAC address property: %ld\n", -- PTR_ERR(mac_addr)); -- mac_addr = NULL; -+ ret = of_get_mac_address(pdev->dev.of_node, mac_addr); -+ if (!ret) { -+ axienet_set_mac_address(ndev, mac_addr); -+ } else { -+ dev_warn(&pdev->dev, "could not find MAC address property: %d\n", -+ ret); -+ axienet_set_mac_address(ndev, NULL); - } -- axienet_set_mac_address(ndev, mac_addr); - - lp->coalesce_count_rx = XAXIDMA_DFT_RX_THRESHOLD; - lp->coalesce_count_tx = XAXIDMA_DFT_TX_THRESHOLD; ---- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c -+++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c -@@ -1107,7 +1107,6 @@ static int xemaclite_of_probe(struct pla - struct net_device *ndev = NULL; - struct net_local *lp = NULL; - struct device *dev = &ofdev->dev; -- const void *mac_address; - - int rc = 0; - -@@ -1149,12 +1148,9 @@ static int xemaclite_of_probe(struct pla - lp->next_rx_buf_to_use = 0x0; - lp->tx_ping_pong = get_bool(ofdev, "xlnx,tx-ping-pong"); - lp->rx_ping_pong = get_bool(ofdev, "xlnx,rx-ping-pong"); -- mac_address = of_get_mac_address(ofdev->dev.of_node); - -- if (!IS_ERR(mac_address)) { -- /* Set the MAC address. */ -- ether_addr_copy(ndev->dev_addr, mac_address); -- } else { -+ rc = of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr); -+ if (rc) { - dev_warn(dev, "No MAC address found, using random\n"); - eth_hw_addr_random(ndev); - } ---- 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); ---- a/drivers/of/of_net.c -+++ b/drivers/of/of_net.c -@@ -45,37 +45,29 @@ int of_get_phy_mode(struct device_node * - } - EXPORT_SYMBOL_GPL(of_get_phy_mode); - --static const void *of_get_mac_addr(struct device_node *np, const char *name) -+static int of_get_mac_addr(struct device_node *np, const char *name, u8 *addr) - { - struct property *pp = of_find_property(np, name, NULL); - -- if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value)) -- return pp->value; -- return NULL; -+ if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value)) { -+ memcpy(addr, pp->value, ETH_ALEN); -+ return 0; -+ } -+ return -ENODEV; - } - --static const void *of_get_mac_addr_nvmem(struct device_node *np) -+static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr) - { -- int ret; -- const void *mac; -- u8 nvmem_mac[ETH_ALEN]; - struct platform_device *pdev = of_find_device_by_node(np); -+ int ret; - - if (!pdev) -- return ERR_PTR(-ENODEV); -+ return -ENODEV; - -- ret = nvmem_get_mac_address(&pdev->dev, &nvmem_mac); -- if (ret) { -- put_device(&pdev->dev); -- return ERR_PTR(ret); -- } -- -- mac = devm_kmemdup(&pdev->dev, nvmem_mac, ETH_ALEN, GFP_KERNEL); -+ ret = nvmem_get_mac_address(&pdev->dev, addr); - put_device(&pdev->dev); -- if (!mac) -- return ERR_PTR(-ENOMEM); - -- return mac; -+ return ret; - } - - /** -@@ -98,24 +90,27 @@ static const void *of_get_mac_addr_nvmem - * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists - * but is all zeros. - * -- * Return: Will be a valid pointer on success and ERR_PTR in case of error. -+ * Return: 0 on success and errno in case of error. - */ --const void *of_get_mac_address(struct device_node *np) -+int of_get_mac_address(struct device_node *np, u8 *addr) - { -- const void *addr; -- -- addr = of_get_mac_addr(np, "mac-address"); -- if (addr) -- return addr; -+ int ret; - -- addr = of_get_mac_addr(np, "local-mac-address"); -- if (addr) -- return addr; -+ if (!np) -+ return -ENODEV; - -- addr = of_get_mac_addr(np, "address"); -- if (addr) -- return addr; -+ ret = of_get_mac_addr(np, "mac-address", addr); -+ if (!ret) -+ return 0; -+ -+ ret = of_get_mac_addr(np, "local-mac-address", addr); -+ if (!ret) -+ return 0; -+ -+ ret = of_get_mac_addr(np, "address", addr); -+ if (!ret) -+ return 0; - -- return of_get_mac_addr_nvmem(np); -+ return of_get_mac_addr_nvmem(np, addr); - } - EXPORT_SYMBOL(of_get_mac_address); ---- a/drivers/staging/octeon/ethernet.c -+++ b/drivers/staging/octeon/ethernet.c -@@ -407,14 +407,10 @@ static int cvm_oct_common_set_mac_addres - int cvm_oct_common_init(struct net_device *dev) - { - struct octeon_ethernet *priv = netdev_priv(dev); -- const u8 *mac = NULL; -+ int ret; - -- if (priv->of_node) -- mac = of_get_mac_address(priv->of_node); -- -- if (!IS_ERR_OR_NULL(mac)) -- ether_addr_copy(dev->dev_addr, mac); -- else -+ ret = of_get_mac_address(priv->of_node, dev->dev_addr); -+ if (ret) - eth_hw_addr_random(dev); - - /* ---- a/drivers/staging/wfx/main.c -+++ b/drivers/staging/wfx/main.c -@@ -339,7 +339,6 @@ int wfx_probe(struct wfx_dev *wdev) - { - int i; - int err; -- const void *macaddr; - struct gpio_desc *gpio_saved; - - // During first part of boot, gpio_wakeup cannot yet been used. So -@@ -428,9 +427,9 @@ int wfx_probe(struct wfx_dev *wdev) - - for (i = 0; i < ARRAY_SIZE(wdev->addresses); i++) { - eth_zero_addr(wdev->addresses[i].addr); -- macaddr = of_get_mac_address(wdev->dev->of_node); -- if (!IS_ERR_OR_NULL(macaddr)) { -- ether_addr_copy(wdev->addresses[i].addr, macaddr); -+ err = of_get_mac_address(wdev->dev->of_node, -+ wdev->addresses[i].addr); -+ if (!err) { - wdev->addresses[i].addr[ETH_ALEN - 1] += i; - } else { - ether_addr_copy(wdev->addresses[i].addr, ---- a/include/linux/of_net.h -+++ b/include/linux/of_net.h -@@ -13,7 +13,7 @@ - - struct net_device; - extern int of_get_phy_mode(struct device_node *np, phy_interface_t *interface); --extern const void *of_get_mac_address(struct device_node *np); -+extern int of_get_mac_address(struct device_node *np, u8 *mac); - extern struct net_device *of_find_net_device_by_node(struct device_node *np); - #else - static inline int of_get_phy_mode(struct device_node *np, -@@ -22,9 +22,9 @@ static inline int of_get_phy_mode(struct - return -ENODEV; - } - --static inline const void *of_get_mac_address(struct device_node *np) -+static inline int of_get_mac_address(struct device_node *np, u8 *mac) - { -- return ERR_PTR(-ENODEV); -+ return -ENODEV; - } - - static inline struct net_device *of_find_net_device_by_node(struct device_node *np) ---- a/include/net/dsa.h -+++ b/include/net/dsa.h -@@ -208,7 +208,7 @@ struct dsa_port { - unsigned int index; - const char *name; - struct dsa_port *cpu_dp; -- const char *mac; -+ u8 mac[ETH_ALEN]; - struct device_node *dn; - unsigned int ageing_time; - bool vlan_filtering; ---- a/net/dsa/dsa2.c -+++ b/net/dsa/dsa2.c -@@ -288,7 +288,7 @@ static int dsa_port_setup(struct dsa_por - - break; - case DSA_PORT_TYPE_USER: -- dp->mac = of_get_mac_address(dp->dn); -+ of_get_mac_address(dp->dn, dp->mac); - err = dsa_slave_create(dp); - if (err) - break; ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -1855,7 +1855,7 @@ int dsa_slave_create(struct dsa_port *po - slave_dev->hw_features |= NETIF_F_HW_TC; - slave_dev->features |= NETIF_F_LLTX; - slave_dev->ethtool_ops = &dsa_slave_ethtool_ops; -- if (!IS_ERR_OR_NULL(port->mac)) -+ if (!is_zero_ether_addr(port->mac)) - ether_addr_copy(slave_dev->dev_addr, port->mac); - else - eth_hw_addr_inherit(slave_dev, master); ---- a/net/ethernet/eth.c -+++ b/net/ethernet/eth.c -@@ -506,13 +506,14 @@ unsigned char * __weak arch_get_platform - - int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr) - { -- const unsigned char *addr = NULL; -+ unsigned char *addr; -+ int ret; - -- if (dev->of_node) -- addr = of_get_mac_address(dev->of_node); -- if (IS_ERR_OR_NULL(addr)) -- addr = arch_get_platform_mac_address(); -+ ret = of_get_mac_address(dev->of_node, mac_addr); -+ if (!ret) -+ return 0; - -+ addr = arch_get_platform_mac_address(); - if (!addr) - return -ENODEV; - diff --git a/target/linux/generic/backport-5.10/732-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch b/target/linux/generic/backport-5.10/732-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch deleted file mode 100644 index 245c5f3bd6..0000000000 --- a/target/linux/generic/backport-5.10/732-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch +++ /dev/null @@ -1,77 +0,0 @@ -From f10843e04a075202dbb39dfcee047e3a2fdf5a8d Mon Sep 17 00:00:00 2001 -From: Michael Walle -Date: Mon, 12 Apr 2021 19:47:18 +0200 -Subject: of: net: fix of_get_mac_addr_nvmem() for non-platform devices - -of_get_mac_address() already supports fetching the MAC address by an -nvmem provider. But until now, it was just working for platform devices. -Esp. it was not working for DSA ports and PCI devices. It gets more -common that PCI devices have a device tree binding since SoCs contain -integrated root complexes. - -Use the nvmem of_* binding to fetch the nvmem cells by a struct -device_node. We still have to try to read the cell by device first -because there might be a nvmem_cell_lookup associated with that device. - -Signed-off-by: Michael Walle -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/of/of_net.c | 35 ++++++++++++++++++++++++++++++----- - 1 file changed, 30 insertions(+), 5 deletions(-) - ---- a/drivers/of/of_net.c -+++ b/drivers/of/of_net.c -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - - /** - * of_get_phy_mode - Get phy mode for given device_node -@@ -59,15 +60,39 @@ static int of_get_mac_addr(struct device - static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr) - { - struct platform_device *pdev = of_find_device_by_node(np); -+ struct nvmem_cell *cell; -+ const void *mac; -+ size_t len; - int ret; - -- if (!pdev) -- return -ENODEV; -+ /* Try lookup by device first, there might be a nvmem_cell_lookup -+ * associated with a given device. -+ */ -+ if (pdev) { -+ ret = nvmem_get_mac_address(&pdev->dev, addr); -+ put_device(&pdev->dev); -+ return ret; -+ } -+ -+ cell = of_nvmem_cell_get(np, "mac-address"); -+ if (IS_ERR(cell)) -+ return PTR_ERR(cell); -+ -+ mac = nvmem_cell_read(cell, &len); -+ nvmem_cell_put(cell); -+ -+ if (IS_ERR(mac)) -+ return PTR_ERR(mac); -+ -+ if (len != ETH_ALEN || !is_valid_ether_addr(mac)) { -+ kfree(mac); -+ return -EINVAL; -+ } - -- ret = nvmem_get_mac_address(&pdev->dev, addr); -- put_device(&pdev->dev); -+ memcpy(addr, mac, ETH_ALEN); -+ kfree(mac); - -- return ret; -+ return 0; - } - - /** diff --git a/target/linux/generic/backport-5.10/733-v5.15-0001-net-bgmac-bcma-handle-deferred-probe-error-due-to-ma.patch b/target/linux/generic/backport-5.10/733-v5.15-0001-net-bgmac-bcma-handle-deferred-probe-error-due-to-ma.patch deleted file mode 100644 index 6e7f20634f..0000000000 --- a/target/linux/generic/backport-5.10/733-v5.15-0001-net-bgmac-bcma-handle-deferred-probe-error-due-to-ma.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 029497e66bdc762e001880e4c85a91f35a54b1e2 Mon Sep 17 00:00:00 2001 -From: Christian Lamparter -Date: Sun, 19 Sep 2021 13:57:25 +0200 -Subject: [PATCH] net: bgmac-bcma: handle deferred probe error due to - mac-address -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Due to the inclusion of nvmem handling into the mac-address getter -function of_get_mac_address() by -commit d01f449c008a ("of_net: add NVMEM support to of_get_mac_address") -it is now possible to get a -EPROBE_DEFER return code. Which did cause -bgmac to assign a random ethernet address. - -This exact issue happened on my Meraki MR32. The nvmem provider is -an EEPROM (at24c64) which gets instantiated once the module -driver is loaded... This happens once the filesystem becomes available. - -With this patch, bgmac_probe() will propagate the -EPROBE_DEFER error. -Then the driver subsystem will reschedule the probe at a later time. - -Cc: Petr Å tetiar -Cc: Michael Walle -Fixes: d01f449c008a ("of_net: add NVMEM support to of_get_mac_address") -Signed-off-by: Christian Lamparter -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/broadcom/bgmac-bcma.c | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/drivers/net/ethernet/broadcom/bgmac-bcma.c -+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c -@@ -129,6 +129,8 @@ static int bgmac_probe(struct bcma_devic - bcma_set_drvdata(core, bgmac); - - err = of_get_mac_address(bgmac->dev->of_node, bgmac->net_dev->dev_addr); -+ if (err == -EPROBE_DEFER) -+ return err; - - /* If no MAC address assigned via device tree, check SPROM */ - if (err) { diff --git a/target/linux/generic/backport-5.10/733-v5.15-0002-net-bgmac-platform-handle-mac-address-deferral.patch b/target/linux/generic/backport-5.10/733-v5.15-0002-net-bgmac-platform-handle-mac-address-deferral.patch deleted file mode 100644 index bde62f3b1b..0000000000 --- a/target/linux/generic/backport-5.10/733-v5.15-0002-net-bgmac-platform-handle-mac-address-deferral.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 763716a55cb1f480ffe1a9702e6b5d9ea1a80a24 Mon Sep 17 00:00:00 2001 -From: Matthew Hagan -Date: Sat, 25 Sep 2021 11:36:27 +0000 -Subject: [PATCH] net: bgmac-platform: handle mac-address deferral - -This patch is a replication of Christian Lamparter's "net: bgmac-bcma: -handle deferred probe error due to mac-address" patch for the -bgmac-platform driver [1]. - -As is the case with the bgmac-bcma driver, this change is to cover the -scenario where the MAC address cannot yet be discovered due to reliance -on an nvmem provider which is yet to be instantiated, resulting in a -random address being assigned that has to be manually overridden. - -[1] https://lore.kernel.org/netdev/20210919115725.29064-1-chunkeey@gmail.com - -Signed-off-by: Matthew Hagan -Reviewed-by: Andrew Lunn -Reviewed-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/broadcom/bgmac-platform.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/drivers/net/ethernet/broadcom/bgmac-platform.c -+++ b/drivers/net/ethernet/broadcom/bgmac-platform.c -@@ -193,6 +193,9 @@ static int bgmac_probe(struct platform_d - bgmac->dma_dev = &pdev->dev; - - ret = of_get_mac_address(np, bgmac->net_dev->dev_addr); -+ if (ret == -EPROBE_DEFER) -+ return ret; -+ - if (ret) - dev_warn(&pdev->dev, - "MAC address not present in device tree\n"); diff --git a/target/linux/generic/backport-5.10/735-v5.14-01-net-dsa-qca8k-change-simple-print-to-dev-variant.patch b/target/linux/generic/backport-5.10/735-v5.14-01-net-dsa-qca8k-change-simple-print-to-dev-variant.patch deleted file mode 100644 index b8e6d9b613..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-01-net-dsa-qca8k-change-simple-print-to-dev-variant.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 5d9e068402dcf7354cc8ee66c2152845306d2ccb Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 22:59:51 +0200 -Subject: [PATCH] net: dsa: qca8k: change simple print to dev variant - -Change pr_err and pr_warn to dev variant. - -Signed-off-by: Ansuel Smith -Reviewed-by: Florian Fainelli -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -701,7 +701,7 @@ qca8k_setup(struct dsa_switch *ds) - - /* Make sure that port 0 is the cpu port */ - if (!dsa_is_cpu_port(ds, 0)) { -- pr_err("port 0 is not the CPU port\n"); -+ dev_err(priv->dev, "port 0 is not the CPU port"); - return -EINVAL; - } - -@@ -711,7 +711,7 @@ qca8k_setup(struct dsa_switch *ds) - priv->regmap = devm_regmap_init(ds->dev, NULL, priv, - &qca8k_regmap_config); - if (IS_ERR(priv->regmap)) -- pr_warn("regmap initialization failed"); -+ dev_warn(priv->dev, "regmap initialization failed"); - - ret = qca8k_setup_mdio_bus(priv); - if (ret) diff --git a/target/linux/generic/backport-5.10/735-v5.14-02-net-dsa-qca8k-use-iopoll-macro-for-qca8k_busy_wait.patch b/target/linux/generic/backport-5.10/735-v5.14-02-net-dsa-qca8k-use-iopoll-macro-for-qca8k_busy_wait.patch deleted file mode 100644 index ff8288d484..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-02-net-dsa-qca8k-use-iopoll-macro-for-qca8k_busy_wait.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 2ad255f2faaffb3af786031fba2e7955454b558a Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 22:59:52 +0200 -Subject: [PATCH] net: dsa: qca8k: use iopoll macro for qca8k_busy_wait - -Use iopoll macro instead of while loop. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 23 +++++++++++------------ - drivers/net/dsa/qca8k.h | 2 ++ - 2 files changed, 13 insertions(+), 12 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -262,21 +262,20 @@ static struct regmap_config qca8k_regmap - static int - qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) - { -- unsigned long timeout; -+ u32 val; -+ int ret; - -- timeout = jiffies + msecs_to_jiffies(20); -+ ret = read_poll_timeout(qca8k_read, val, !(val & mask), -+ 0, QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, -+ priv, reg); - -- /* loop until the busy flag has cleared */ -- do { -- u32 val = qca8k_read(priv, reg); -- int busy = val & mask; -+ /* Check if qca8k_read has failed for a different reason -+ * before returning -ETIMEDOUT -+ */ -+ if (ret < 0 && val < 0) -+ return val; - -- if (!busy) -- break; -- cond_resched(); -- } while (!time_after_eq(jiffies, timeout)); -- -- return time_after_eq(jiffies, timeout); -+ return ret; - } - - static void ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -18,6 +18,8 @@ - #define PHY_ID_QCA8337 0x004dd036 - #define QCA8K_ID_QCA8337 0x13 - -+#define QCA8K_BUSY_WAIT_TIMEOUT 20 -+ - #define QCA8K_NUM_FDB_RECORDS 2048 - - #define QCA8K_CPU_PORT 0 diff --git a/target/linux/generic/backport-5.10/735-v5.14-03-net-dsa-qca8k-improve-qca8k-read-write-rmw-bus-acces.patch b/target/linux/generic/backport-5.10/735-v5.14-03-net-dsa-qca8k-improve-qca8k-read-write-rmw-bus-acces.patch deleted file mode 100644 index c403589874..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-03-net-dsa-qca8k-improve-qca8k-read-write-rmw-bus-acces.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 504bf65931824eda83494e5b5d75686e27ace03e Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 22:59:53 +0200 -Subject: [PATCH] net: dsa: qca8k: improve qca8k read/write/rmw bus access - -Put bus in local variable to improve faster access to the mdio bus. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 29 ++++++++++++++++------------- - 1 file changed, 16 insertions(+), 13 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -142,17 +142,18 @@ qca8k_set_page(struct mii_bus *bus, u16 - static u32 - qca8k_read(struct qca8k_priv *priv, u32 reg) - { -+ struct mii_bus *bus = priv->bus; - u16 r1, r2, page; - u32 val; - - qca8k_split_addr(reg, &r1, &r2, &page); - -- mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); -+ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - -- qca8k_set_page(priv->bus, page); -- val = qca8k_mii_read32(priv->bus, 0x10 | r2, r1); -+ qca8k_set_page(bus, page); -+ val = qca8k_mii_read32(bus, 0x10 | r2, r1); - -- mutex_unlock(&priv->bus->mdio_lock); -+ mutex_unlock(&bus->mdio_lock); - - return val; - } -@@ -160,35 +161,37 @@ qca8k_read(struct qca8k_priv *priv, u32 - static void - qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val) - { -+ struct mii_bus *bus = priv->bus; - u16 r1, r2, page; - - qca8k_split_addr(reg, &r1, &r2, &page); - -- mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); -+ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - -- qca8k_set_page(priv->bus, page); -- qca8k_mii_write32(priv->bus, 0x10 | r2, r1, val); -+ qca8k_set_page(bus, page); -+ qca8k_mii_write32(bus, 0x10 | r2, r1, val); - -- mutex_unlock(&priv->bus->mdio_lock); -+ mutex_unlock(&bus->mdio_lock); - } - - static u32 - qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 val) - { -+ struct mii_bus *bus = priv->bus; - u16 r1, r2, page; - u32 ret; - - qca8k_split_addr(reg, &r1, &r2, &page); - -- mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); -+ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - -- qca8k_set_page(priv->bus, page); -- ret = qca8k_mii_read32(priv->bus, 0x10 | r2, r1); -+ qca8k_set_page(bus, page); -+ ret = qca8k_mii_read32(bus, 0x10 | r2, r1); - ret &= ~mask; - ret |= val; -- qca8k_mii_write32(priv->bus, 0x10 | r2, r1, ret); -+ qca8k_mii_write32(bus, 0x10 | r2, r1, ret); - -- mutex_unlock(&priv->bus->mdio_lock); -+ mutex_unlock(&bus->mdio_lock); - - return ret; - } diff --git a/target/linux/generic/backport-5.10/735-v5.14-04-net-dsa-qca8k-handle-qca8k_set_page-errors.patch b/target/linux/generic/backport-5.10/735-v5.14-04-net-dsa-qca8k-handle-qca8k_set_page-errors.patch deleted file mode 100644 index 6be494a8c7..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-04-net-dsa-qca8k-handle-qca8k_set_page-errors.patch +++ /dev/null @@ -1,101 +0,0 @@ -From ba5707ec58cfb6853dff41c2aae72deb6a03d389 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 22:59:54 +0200 -Subject: [PATCH] net: dsa: qca8k: handle qca8k_set_page errors - -With a remote possibility, the set_page function can fail. Since this is -a critical part of the write/read qca8k regs, propagate the error and -terminate any read/write operation. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 33 ++++++++++++++++++++++++++------- - 1 file changed, 26 insertions(+), 7 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -127,16 +127,23 @@ qca8k_mii_write32(struct mii_bus *bus, i - "failed to write qca8k 32bit register\n"); - } - --static void -+static int - qca8k_set_page(struct mii_bus *bus, u16 page) - { -+ int ret; -+ - if (page == qca8k_current_page) -- return; -+ return 0; - -- if (bus->write(bus, 0x18, 0, page) < 0) -+ ret = bus->write(bus, 0x18, 0, page); -+ if (ret < 0) { - dev_err_ratelimited(&bus->dev, - "failed to set qca8k page\n"); -+ return ret; -+ } -+ - qca8k_current_page = page; -+ return 0; - } - - static u32 -@@ -150,11 +157,14 @@ qca8k_read(struct qca8k_priv *priv, u32 - - mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - -- qca8k_set_page(bus, page); -+ val = qca8k_set_page(bus, page); -+ if (val < 0) -+ goto exit; -+ - val = qca8k_mii_read32(bus, 0x10 | r2, r1); - -+exit: - mutex_unlock(&bus->mdio_lock); -- - return val; - } - -@@ -163,14 +173,19 @@ qca8k_write(struct qca8k_priv *priv, u32 - { - struct mii_bus *bus = priv->bus; - u16 r1, r2, page; -+ int ret; - - qca8k_split_addr(reg, &r1, &r2, &page); - - mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - -- qca8k_set_page(bus, page); -+ ret = qca8k_set_page(bus, page); -+ if (ret < 0) -+ goto exit; -+ - qca8k_mii_write32(bus, 0x10 | r2, r1, val); - -+exit: - mutex_unlock(&bus->mdio_lock); - } - -@@ -185,12 +200,16 @@ qca8k_rmw(struct qca8k_priv *priv, u32 r - - mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - -- qca8k_set_page(bus, page); -+ ret = qca8k_set_page(bus, page); -+ if (ret < 0) -+ goto exit; -+ - ret = qca8k_mii_read32(bus, 0x10 | r2, r1); - ret &= ~mask; - ret |= val; - qca8k_mii_write32(bus, 0x10 | r2, r1, ret); - -+exit: - mutex_unlock(&bus->mdio_lock); - - return ret; diff --git a/target/linux/generic/backport-5.10/735-v5.14-05-net-dsa-qca8k-handle-error-with-qca8k_read-operation.patch b/target/linux/generic/backport-5.10/735-v5.14-05-net-dsa-qca8k-handle-error-with-qca8k_read-operation.patch deleted file mode 100644 index 3349b7897a..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-05-net-dsa-qca8k-handle-error-with-qca8k_read-operation.patch +++ /dev/null @@ -1,207 +0,0 @@ -From 028f5f8ef44fcf87a456772cbb9f0d90a0a22884 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 22:59:55 +0200 -Subject: [PATCH] net: dsa: qca8k: handle error with qca8k_read operation - -qca8k_read can fail. Rework any user to handle error values and -correctly return. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 73 ++++++++++++++++++++++++++++++++--------- - 1 file changed, 58 insertions(+), 15 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -231,8 +231,13 @@ static int - qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) - { - struct qca8k_priv *priv = (struct qca8k_priv *)ctx; -+ int ret; -+ -+ ret = qca8k_read(priv, reg); -+ if (ret < 0) -+ return ret; - -- *val = qca8k_read(priv, reg); -+ *val = ret; - - return 0; - } -@@ -300,15 +305,20 @@ qca8k_busy_wait(struct qca8k_priv *priv, - return ret; - } - --static void -+static int - qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb) - { -- u32 reg[4]; -+ u32 reg[4], val; - int i; - - /* load the ARL table into an array */ -- for (i = 0; i < 4; i++) -- reg[i] = qca8k_read(priv, QCA8K_REG_ATU_DATA0 + (i * 4)); -+ for (i = 0; i < 4; i++) { -+ val = qca8k_read(priv, QCA8K_REG_ATU_DATA0 + (i * 4)); -+ if (val < 0) -+ return val; -+ -+ reg[i] = val; -+ } - - /* vid - 83:72 */ - fdb->vid = (reg[2] >> QCA8K_ATU_VID_S) & QCA8K_ATU_VID_M; -@@ -323,6 +333,8 @@ qca8k_fdb_read(struct qca8k_priv *priv, - fdb->mac[3] = (reg[0] >> QCA8K_ATU_ADDR3_S) & 0xff; - fdb->mac[4] = (reg[0] >> QCA8K_ATU_ADDR4_S) & 0xff; - fdb->mac[5] = reg[0] & 0xff; -+ -+ return 0; - } - - static void -@@ -374,6 +386,8 @@ qca8k_fdb_access(struct qca8k_priv *priv - /* Check for table full violation when adding an entry */ - if (cmd == QCA8K_FDB_LOAD) { - reg = qca8k_read(priv, QCA8K_REG_ATU_FUNC); -+ if (reg < 0) -+ return reg; - if (reg & QCA8K_ATU_FUNC_FULL) - return -1; - } -@@ -388,10 +402,10 @@ qca8k_fdb_next(struct qca8k_priv *priv, - - qca8k_fdb_write(priv, fdb->vid, fdb->port_mask, fdb->mac, fdb->aging); - ret = qca8k_fdb_access(priv, QCA8K_FDB_NEXT, port); -- if (ret >= 0) -- qca8k_fdb_read(priv, fdb); -+ if (ret < 0) -+ return ret; - -- return ret; -+ return qca8k_fdb_read(priv, fdb); - } - - static int -@@ -449,6 +463,8 @@ qca8k_vlan_access(struct qca8k_priv *pri - /* Check for table full violation when adding an entry */ - if (cmd == QCA8K_VLAN_LOAD) { - reg = qca8k_read(priv, QCA8K_REG_VTU_FUNC1); -+ if (reg < 0) -+ return reg; - if (reg & QCA8K_VTU_FUNC1_FULL) - return -ENOMEM; - } -@@ -475,6 +491,8 @@ qca8k_vlan_add(struct qca8k_priv *priv, - goto out; - - reg = qca8k_read(priv, QCA8K_REG_VTU_FUNC0); -+ if (reg < 0) -+ return reg; - reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; - reg &= ~(QCA8K_VTU_FUNC0_EG_MODE_MASK << QCA8K_VTU_FUNC0_EG_MODE_S(port)); - if (untagged) -@@ -506,6 +524,8 @@ qca8k_vlan_del(struct qca8k_priv *priv, - goto out; - - reg = qca8k_read(priv, QCA8K_REG_VTU_FUNC0); -+ if (reg < 0) -+ return reg; - reg &= ~(3 << QCA8K_VTU_FUNC0_EG_MODE_S(port)); - reg |= QCA8K_VTU_FUNC0_EG_MODE_NOT << - QCA8K_VTU_FUNC0_EG_MODE_S(port); -@@ -621,8 +641,11 @@ qca8k_mdio_read(struct qca8k_priv *priv, - QCA8K_MDIO_MASTER_BUSY)) - return -ETIMEDOUT; - -- val = (qca8k_read(priv, QCA8K_MDIO_MASTER_CTRL) & -- QCA8K_MDIO_MASTER_DATA_MASK); -+ val = qca8k_read(priv, QCA8K_MDIO_MASTER_CTRL); -+ if (val < 0) -+ return val; -+ -+ val &= QCA8K_MDIO_MASTER_DATA_MASK; - - return val; - } -@@ -978,6 +1001,8 @@ qca8k_phylink_mac_link_state(struct dsa_ - u32 reg; - - reg = qca8k_read(priv, QCA8K_REG_PORT_STATUS(port)); -+ if (reg < 0) -+ return reg; - - state->link = !!(reg & QCA8K_PORT_STATUS_LINK_UP); - state->an_complete = state->link; -@@ -1078,18 +1103,26 @@ qca8k_get_ethtool_stats(struct dsa_switc - { - struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; - const struct qca8k_mib_desc *mib; -- u32 reg, i; -+ u32 reg, i, val; - u64 hi; - - for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) { - mib = &ar8327_mib[i]; - reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; - -- data[i] = qca8k_read(priv, reg); -+ val = qca8k_read(priv, reg); -+ if (val < 0) -+ continue; -+ - if (mib->size == 2) { - hi = qca8k_read(priv, reg + 4); -- data[i] |= hi << 32; -+ if (hi < 0) -+ continue; - } -+ -+ data[i] = val; -+ if (mib->size == 2) -+ data[i] |= hi << 32; - } - } - -@@ -1107,18 +1140,25 @@ qca8k_set_mac_eee(struct dsa_switch *ds, - { - struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; - u32 lpi_en = QCA8K_REG_EEE_CTRL_LPI_EN(port); -+ int ret = 0; - u32 reg; - - mutex_lock(&priv->reg_mutex); - reg = qca8k_read(priv, QCA8K_REG_EEE_CTRL); -+ if (reg < 0) { -+ ret = reg; -+ goto exit; -+ } -+ - if (eee->eee_enabled) - reg |= lpi_en; - else - reg &= ~lpi_en; - qca8k_write(priv, QCA8K_REG_EEE_CTRL, reg); -- mutex_unlock(&priv->reg_mutex); - -- return 0; -+exit: -+ mutex_unlock(&priv->reg_mutex); -+ return ret; - } - - static int -@@ -1456,6 +1496,9 @@ qca8k_sw_probe(struct mdio_device *mdiod - - /* read the switches ID register */ - id = qca8k_read(priv, QCA8K_REG_MASK_CTRL); -+ if (id < 0) -+ return id; -+ - id >>= QCA8K_MASK_CTRL_ID_S; - id &= QCA8K_MASK_CTRL_ID_M; - if (id != QCA8K_ID_QCA8337) diff --git a/target/linux/generic/backport-5.10/735-v5.14-06-net-dsa-qca8k-handle-error-with-qca8k_write-operatio.patch b/target/linux/generic/backport-5.10/735-v5.14-06-net-dsa-qca8k-handle-error-with-qca8k_write-operatio.patch deleted file mode 100644 index 1e0e224c39..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-06-net-dsa-qca8k-handle-error-with-qca8k_write-operatio.patch +++ /dev/null @@ -1,263 +0,0 @@ -From d7805757c75c76e9518fc1023a29f0c4eed5b581 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 22:59:56 +0200 -Subject: [PATCH] net: dsa: qca8k: handle error with qca8k_write operation - -qca8k_write can fail. Rework any user to handle error values and -correctly return. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 102 ++++++++++++++++++++++++++-------------- - 1 file changed, 67 insertions(+), 35 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -168,7 +168,7 @@ exit: - return val; - } - --static void -+static int - qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val) - { - struct mii_bus *bus = priv->bus; -@@ -187,6 +187,7 @@ qca8k_write(struct qca8k_priv *priv, u32 - - exit: - mutex_unlock(&bus->mdio_lock); -+ return ret; - } - - static u32 -@@ -247,9 +248,7 @@ qca8k_regmap_write(void *ctx, uint32_t r - { - struct qca8k_priv *priv = (struct qca8k_priv *)ctx; - -- qca8k_write(priv, reg, val); -- -- return 0; -+ return qca8k_write(priv, reg, val); - } - - static const struct regmap_range qca8k_readable_ranges[] = { -@@ -367,6 +366,7 @@ static int - qca8k_fdb_access(struct qca8k_priv *priv, enum qca8k_fdb_cmd cmd, int port) - { - u32 reg; -+ int ret; - - /* Set the command and FDB index */ - reg = QCA8K_ATU_FUNC_BUSY; -@@ -377,7 +377,9 @@ qca8k_fdb_access(struct qca8k_priv *priv - } - - /* Write the function register triggering the table access */ -- qca8k_write(priv, QCA8K_REG_ATU_FUNC, reg); -+ ret = qca8k_write(priv, QCA8K_REG_ATU_FUNC, reg); -+ if (ret) -+ return ret; - - /* wait for completion */ - if (qca8k_busy_wait(priv, QCA8K_REG_ATU_FUNC, QCA8K_ATU_FUNC_BUSY)) -@@ -447,6 +449,7 @@ static int - qca8k_vlan_access(struct qca8k_priv *priv, enum qca8k_vlan_cmd cmd, u16 vid) - { - u32 reg; -+ int ret; - - /* Set the command and VLAN index */ - reg = QCA8K_VTU_FUNC1_BUSY; -@@ -454,7 +457,9 @@ qca8k_vlan_access(struct qca8k_priv *pri - reg |= vid << QCA8K_VTU_FUNC1_VID_S; - - /* Write the function register triggering the table access */ -- qca8k_write(priv, QCA8K_REG_VTU_FUNC1, reg); -+ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC1, reg); -+ if (ret) -+ return ret; - - /* wait for completion */ - if (qca8k_busy_wait(priv, QCA8K_REG_VTU_FUNC1, QCA8K_VTU_FUNC1_BUSY)) -@@ -502,7 +507,9 @@ qca8k_vlan_add(struct qca8k_priv *priv, - reg |= QCA8K_VTU_FUNC0_EG_MODE_TAG << - QCA8K_VTU_FUNC0_EG_MODE_S(port); - -- qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); -+ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); -+ if (ret) -+ return ret; - ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); - - out: -@@ -545,7 +552,9 @@ qca8k_vlan_del(struct qca8k_priv *priv, - if (del) { - ret = qca8k_vlan_access(priv, QCA8K_VLAN_PURGE, vid); - } else { -- qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); -+ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); -+ if (ret) -+ return ret; - ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); - } - -@@ -555,15 +564,20 @@ out: - return ret; - } - --static void -+static int - qca8k_mib_init(struct qca8k_priv *priv) - { -+ int ret; -+ - mutex_lock(&priv->reg_mutex); - qca8k_reg_set(priv, QCA8K_REG_MIB, QCA8K_MIB_FLUSH | QCA8K_MIB_BUSY); - qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY); - qca8k_reg_set(priv, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP); -- qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB); -+ -+ ret = qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB); -+ - mutex_unlock(&priv->reg_mutex); -+ return ret; - } - - static void -@@ -600,6 +614,7 @@ static int - qca8k_mdio_write(struct qca8k_priv *priv, int port, u32 regnum, u16 data) - { - u32 phy, val; -+ int ret; - - if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) - return -EINVAL; -@@ -613,7 +628,9 @@ qca8k_mdio_write(struct qca8k_priv *priv - QCA8K_MDIO_MASTER_REG_ADDR(regnum) | - QCA8K_MDIO_MASTER_DATA(data); - -- qca8k_write(priv, QCA8K_MDIO_MASTER_CTRL, val); -+ ret = qca8k_write(priv, QCA8K_MDIO_MASTER_CTRL, val); -+ if (ret) -+ return ret; - - return qca8k_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, - QCA8K_MDIO_MASTER_BUSY); -@@ -623,6 +640,7 @@ static int - qca8k_mdio_read(struct qca8k_priv *priv, int port, u32 regnum) - { - u32 phy, val; -+ int ret; - - if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) - return -EINVAL; -@@ -635,7 +653,9 @@ qca8k_mdio_read(struct qca8k_priv *priv, - QCA8K_MDIO_MASTER_READ | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | - QCA8K_MDIO_MASTER_REG_ADDR(regnum); - -- qca8k_write(priv, QCA8K_MDIO_MASTER_CTRL, val); -+ ret = qca8k_write(priv, QCA8K_MDIO_MASTER_CTRL, val); -+ if (ret) -+ return ret; - - if (qca8k_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, - QCA8K_MDIO_MASTER_BUSY)) -@@ -766,12 +786,18 @@ qca8k_setup(struct dsa_switch *ds) - QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN); - - /* Enable MIB counters */ -- qca8k_mib_init(priv); -+ ret = qca8k_mib_init(priv); -+ if (ret) -+ dev_warn(priv->dev, "mib init failed"); - - /* Enable QCA header mode on the cpu port */ -- qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(QCA8K_CPU_PORT), -- QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_TX_S | -- QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_RX_S); -+ ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(QCA8K_CPU_PORT), -+ QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_TX_S | -+ QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_RX_S); -+ if (ret) { -+ dev_err(priv->dev, "failed enabling QCA header mode"); -+ return ret; -+ } - - /* Disable forwarding by default on all ports */ - for (i = 0; i < QCA8K_NUM_PORTS; i++) -@@ -783,11 +809,13 @@ qca8k_setup(struct dsa_switch *ds) - qca8k_port_set_status(priv, i, 0); - - /* Forward all unknown frames to CPU port for Linux processing */ -- qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1, -- BIT(0) << QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_S | -- BIT(0) << QCA8K_GLOBAL_FW_CTRL1_BC_DP_S | -- BIT(0) << QCA8K_GLOBAL_FW_CTRL1_MC_DP_S | -- BIT(0) << QCA8K_GLOBAL_FW_CTRL1_UC_DP_S); -+ ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1, -+ BIT(0) << QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_S | -+ BIT(0) << QCA8K_GLOBAL_FW_CTRL1_BC_DP_S | -+ BIT(0) << QCA8K_GLOBAL_FW_CTRL1_MC_DP_S | -+ BIT(0) << QCA8K_GLOBAL_FW_CTRL1_UC_DP_S); -+ if (ret) -+ return ret; - - /* Setup connection between CPU port & user ports */ - for (i = 0; i < QCA8K_NUM_PORTS; i++) { -@@ -815,16 +843,20 @@ qca8k_setup(struct dsa_switch *ds) - qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i), - 0xfff << shift, - QCA8K_PORT_VID_DEF << shift); -- qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i), -- QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) | -- QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF)); -+ ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i), -+ QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) | -+ QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF)); -+ if (ret) -+ return ret; - } - } - - /* Setup our port MTUs to match power on defaults */ - for (i = 0; i < QCA8K_NUM_PORTS; i++) - priv->port_mtu[i] = ETH_FRAME_LEN + ETH_FCS_LEN; -- qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, ETH_FRAME_LEN + ETH_FCS_LEN); -+ ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, ETH_FRAME_LEN + ETH_FCS_LEN); -+ if (ret) -+ dev_warn(priv->dev, "failed setting MTU settings"); - - /* Flush the FDB table */ - qca8k_fdb_flush(priv); -@@ -1140,8 +1172,8 @@ qca8k_set_mac_eee(struct dsa_switch *ds, - { - struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; - u32 lpi_en = QCA8K_REG_EEE_CTRL_LPI_EN(port); -- int ret = 0; - u32 reg; -+ int ret; - - mutex_lock(&priv->reg_mutex); - reg = qca8k_read(priv, QCA8K_REG_EEE_CTRL); -@@ -1154,7 +1186,7 @@ qca8k_set_mac_eee(struct dsa_switch *ds, - reg |= lpi_en; - else - reg &= ~lpi_en; -- qca8k_write(priv, QCA8K_REG_EEE_CTRL, reg); -+ ret = qca8k_write(priv, QCA8K_REG_EEE_CTRL, reg); - - exit: - mutex_unlock(&priv->reg_mutex); -@@ -1284,9 +1316,7 @@ qca8k_port_change_mtu(struct dsa_switch - mtu = priv->port_mtu[i]; - - /* Include L2 header / FCS length */ -- qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, mtu + ETH_HLEN + ETH_FCS_LEN); -- -- return 0; -+ return qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, mtu + ETH_HLEN + ETH_FCS_LEN); - } - - static int diff --git a/target/linux/generic/backport-5.10/735-v5.14-07-net-dsa-qca8k-handle-error-with-qca8k_rmw-operation.patch b/target/linux/generic/backport-5.10/735-v5.14-07-net-dsa-qca8k-handle-error-with-qca8k_rmw-operation.patch deleted file mode 100644 index 506966f1af..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-07-net-dsa-qca8k-handle-error-with-qca8k_rmw-operation.patch +++ /dev/null @@ -1,226 +0,0 @@ -From aaf421425cbdec4eb6fd75a29e65c2867b0b7bbd Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 22:59:57 +0200 -Subject: [PATCH] net: dsa: qca8k: handle error with qca8k_rmw operation - -qca8k_rmw can fail. Rework any user to handle error values and -correctly return. Change qca8k_rmw to return the error code or 0 instead -of the reg value. The reg returned by qca8k_rmw wasn't used anywhere, -so this doesn't cause any functional change. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 133 +++++++++++++++++++++++++--------------- - 1 file changed, 83 insertions(+), 50 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -190,12 +190,13 @@ exit: - return ret; - } - --static u32 --qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 val) -+static int -+qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) - { - struct mii_bus *bus = priv->bus; - u16 r1, r2, page; -- u32 ret; -+ u32 val; -+ int ret; - - qca8k_split_addr(reg, &r1, &r2, &page); - -@@ -205,10 +206,15 @@ qca8k_rmw(struct qca8k_priv *priv, u32 r - if (ret < 0) - goto exit; - -- ret = qca8k_mii_read32(bus, 0x10 | r2, r1); -- ret &= ~mask; -- ret |= val; -- qca8k_mii_write32(bus, 0x10 | r2, r1, ret); -+ val = qca8k_mii_read32(bus, 0x10 | r2, r1); -+ if (val < 0) { -+ ret = val; -+ goto exit; -+ } -+ -+ val &= ~mask; -+ val |= write_val; -+ qca8k_mii_write32(bus, 0x10 | r2, r1, val); - - exit: - mutex_unlock(&bus->mdio_lock); -@@ -216,16 +222,16 @@ exit: - return ret; - } - --static void -+static int - qca8k_reg_set(struct qca8k_priv *priv, u32 reg, u32 val) - { -- qca8k_rmw(priv, reg, 0, val); -+ return qca8k_rmw(priv, reg, 0, val); - } - --static void -+static int - qca8k_reg_clear(struct qca8k_priv *priv, u32 reg, u32 val) - { -- qca8k_rmw(priv, reg, val, 0); -+ return qca8k_rmw(priv, reg, val, 0); - } - - static int -@@ -570,12 +576,19 @@ qca8k_mib_init(struct qca8k_priv *priv) - int ret; - - mutex_lock(&priv->reg_mutex); -- qca8k_reg_set(priv, QCA8K_REG_MIB, QCA8K_MIB_FLUSH | QCA8K_MIB_BUSY); -+ ret = qca8k_reg_set(priv, QCA8K_REG_MIB, QCA8K_MIB_FLUSH | QCA8K_MIB_BUSY); -+ if (ret) -+ goto exit; -+ - qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY); -- qca8k_reg_set(priv, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP); -+ -+ ret = qca8k_reg_set(priv, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP); -+ if (ret) -+ goto exit; - - ret = qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB); - -+exit: - mutex_unlock(&priv->reg_mutex); - return ret; - } -@@ -747,9 +760,8 @@ qca8k_setup_mdio_bus(struct qca8k_priv * - * a dt-overlay and driver reload changed the configuration - */ - -- qca8k_reg_clear(priv, QCA8K_MDIO_MASTER_CTRL, -- QCA8K_MDIO_MASTER_EN); -- return 0; -+ return qca8k_reg_clear(priv, QCA8K_MDIO_MASTER_CTRL, -+ QCA8K_MDIO_MASTER_EN); - } - - priv->ops.phy_read = qca8k_phy_read; -@@ -782,8 +794,12 @@ qca8k_setup(struct dsa_switch *ds) - return ret; - - /* Enable CPU Port */ -- qca8k_reg_set(priv, QCA8K_REG_GLOBAL_FW_CTRL0, -- QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN); -+ ret = qca8k_reg_set(priv, QCA8K_REG_GLOBAL_FW_CTRL0, -+ QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN); -+ if (ret) { -+ dev_err(priv->dev, "failed enabling CPU port"); -+ return ret; -+ } - - /* Enable MIB counters */ - ret = qca8k_mib_init(priv); -@@ -800,9 +816,12 @@ qca8k_setup(struct dsa_switch *ds) - } - - /* Disable forwarding by default on all ports */ -- for (i = 0; i < QCA8K_NUM_PORTS; i++) -- qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), -- QCA8K_PORT_LOOKUP_MEMBER, 0); -+ for (i = 0; i < QCA8K_NUM_PORTS; i++) { -+ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), -+ QCA8K_PORT_LOOKUP_MEMBER, 0); -+ if (ret) -+ return ret; -+ } - - /* Disable MAC by default on all ports */ - for (i = 1; i < QCA8K_NUM_PORTS; i++) -@@ -821,28 +840,37 @@ qca8k_setup(struct dsa_switch *ds) - for (i = 0; i < QCA8K_NUM_PORTS; i++) { - /* CPU port gets connected to all user ports of the switch */ - if (dsa_is_cpu_port(ds, i)) { -- qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(QCA8K_CPU_PORT), -- QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds)); -+ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(QCA8K_CPU_PORT), -+ QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds)); -+ if (ret) -+ return ret; - } - - /* Individual user ports get connected to CPU port only */ - if (dsa_is_user_port(ds, i)) { - int shift = 16 * (i % 2); - -- qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), -- QCA8K_PORT_LOOKUP_MEMBER, -- BIT(QCA8K_CPU_PORT)); -+ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), -+ QCA8K_PORT_LOOKUP_MEMBER, -+ BIT(QCA8K_CPU_PORT)); -+ if (ret) -+ return ret; - - /* Enable ARP Auto-learning by default */ -- qca8k_reg_set(priv, QCA8K_PORT_LOOKUP_CTRL(i), -- QCA8K_PORT_LOOKUP_LEARN); -+ ret = qca8k_reg_set(priv, QCA8K_PORT_LOOKUP_CTRL(i), -+ QCA8K_PORT_LOOKUP_LEARN); -+ if (ret) -+ return ret; - - /* For port based vlans to work we need to set the - * default egress vid - */ -- qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i), -- 0xfff << shift, -- QCA8K_PORT_VID_DEF << shift); -+ ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i), -+ 0xfff << shift, -+ QCA8K_PORT_VID_DEF << shift); -+ if (ret) -+ return ret; -+ - ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i), - QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) | - QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF)); -@@ -1234,7 +1262,7 @@ qca8k_port_bridge_join(struct dsa_switch - { - struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; - int port_mask = BIT(QCA8K_CPU_PORT); -- int i; -+ int i, ret; - - for (i = 1; i < QCA8K_NUM_PORTS; i++) { - if (dsa_to_port(ds, i)->bridge_dev != br) -@@ -1242,17 +1270,20 @@ qca8k_port_bridge_join(struct dsa_switch - /* Add this port to the portvlan mask of the other ports - * in the bridge - */ -- qca8k_reg_set(priv, -- QCA8K_PORT_LOOKUP_CTRL(i), -- BIT(port)); -+ ret = qca8k_reg_set(priv, -+ QCA8K_PORT_LOOKUP_CTRL(i), -+ BIT(port)); -+ if (ret) -+ return ret; - if (i != port) - port_mask |= BIT(i); - } -+ - /* Add all other ports to this ports portvlan mask */ -- qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), -- QCA8K_PORT_LOOKUP_MEMBER, port_mask); -+ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), -+ QCA8K_PORT_LOOKUP_MEMBER, port_mask); - -- return 0; -+ return ret; - } - - static void diff --git a/target/linux/generic/backport-5.10/735-v5.14-08-net-dsa-qca8k-handle-error-from-qca8k_busy_wait.patch b/target/linux/generic/backport-5.10/735-v5.14-08-net-dsa-qca8k-handle-error-from-qca8k_busy_wait.patch deleted file mode 100644 index 360ce1d947..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-08-net-dsa-qca8k-handle-error-from-qca8k_busy_wait.patch +++ /dev/null @@ -1,66 +0,0 @@ -From b7c818d194927bdc60ed15db55bb8654496a36b7 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 22:59:58 +0200 -Subject: [PATCH] net: dsa: qca8k: handle error from qca8k_busy_wait - -Propagate errors from qca8k_busy_wait instead of hardcoding return -value. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 21 +++++++++++++-------- - 1 file changed, 13 insertions(+), 8 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -388,8 +388,9 @@ qca8k_fdb_access(struct qca8k_priv *priv - return ret; - - /* wait for completion */ -- if (qca8k_busy_wait(priv, QCA8K_REG_ATU_FUNC, QCA8K_ATU_FUNC_BUSY)) -- return -1; -+ ret = qca8k_busy_wait(priv, QCA8K_REG_ATU_FUNC, QCA8K_ATU_FUNC_BUSY); -+ if (ret) -+ return ret; - - /* Check for table full violation when adding an entry */ - if (cmd == QCA8K_FDB_LOAD) { -@@ -468,8 +469,9 @@ qca8k_vlan_access(struct qca8k_priv *pri - return ret; - - /* wait for completion */ -- if (qca8k_busy_wait(priv, QCA8K_REG_VTU_FUNC1, QCA8K_VTU_FUNC1_BUSY)) -- return -ETIMEDOUT; -+ ret = qca8k_busy_wait(priv, QCA8K_REG_VTU_FUNC1, QCA8K_VTU_FUNC1_BUSY); -+ if (ret) -+ return ret; - - /* Check for table full violation when adding an entry */ - if (cmd == QCA8K_VLAN_LOAD) { -@@ -580,7 +582,9 @@ qca8k_mib_init(struct qca8k_priv *priv) - if (ret) - goto exit; - -- qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY); -+ ret = qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY); -+ if (ret) -+ goto exit; - - ret = qca8k_reg_set(priv, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP); - if (ret) -@@ -670,9 +674,10 @@ qca8k_mdio_read(struct qca8k_priv *priv, - if (ret) - return ret; - -- if (qca8k_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, -- QCA8K_MDIO_MASTER_BUSY)) -- return -ETIMEDOUT; -+ ret = qca8k_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, -+ QCA8K_MDIO_MASTER_BUSY); -+ if (ret) -+ return ret; - - val = qca8k_read(priv, QCA8K_MDIO_MASTER_CTRL); - if (val < 0) diff --git a/target/linux/generic/backport-5.10/735-v5.14-09-net-dsa-qca8k-add-support-for-qca8327-switch.patch b/target/linux/generic/backport-5.10/735-v5.14-09-net-dsa-qca8k-add-support-for-qca8327-switch.patch deleted file mode 100644 index 72305850ca..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-09-net-dsa-qca8k-add-support-for-qca8327-switch.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 6e82a457e06252b59102486767539cc9c2aba60b Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 22:59:59 +0200 -Subject: [PATCH] net: dsa: qca8k: add support for qca8327 switch - -qca8327 switch is a low tier version of the more recent qca8337. -It does share the same regs used by the qca8k driver and can be -supported with minimal change. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Reviewed-by: Vladimir Oltean -Reviewed-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 23 ++++++++++++++++++++--- - drivers/net/dsa/qca8k.h | 6 ++++++ - 2 files changed, 26 insertions(+), 3 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -1533,6 +1533,7 @@ static const struct dsa_switch_ops qca8k - static int - qca8k_sw_probe(struct mdio_device *mdiodev) - { -+ const struct qca8k_match_data *data; - struct qca8k_priv *priv; - u32 id; - -@@ -1560,6 +1561,11 @@ qca8k_sw_probe(struct mdio_device *mdiod - gpiod_set_value_cansleep(priv->reset_gpio, 0); - } - -+ /* get the switches ID from the compatible */ -+ data = of_device_get_match_data(&mdiodev->dev); -+ if (!data) -+ return -ENODEV; -+ - /* read the switches ID register */ - id = qca8k_read(priv, QCA8K_REG_MASK_CTRL); - if (id < 0) -@@ -1567,8 +1573,10 @@ qca8k_sw_probe(struct mdio_device *mdiod - - id >>= QCA8K_MASK_CTRL_ID_S; - id &= QCA8K_MASK_CTRL_ID_M; -- if (id != QCA8K_ID_QCA8337) -+ if (id != data->id) { -+ dev_err(&mdiodev->dev, "Switch id detected %x but expected %x", id, data->id); - return -ENODEV; -+ } - - priv->ds = devm_kzalloc(&mdiodev->dev, sizeof(*priv->ds), GFP_KERNEL); - if (!priv->ds) -@@ -1634,9 +1642,18 @@ static int qca8k_resume(struct device *d - static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, - qca8k_suspend, qca8k_resume); - -+static const struct qca8k_match_data qca832x = { -+ .id = QCA8K_ID_QCA8327, -+}; -+ -+static const struct qca8k_match_data qca833x = { -+ .id = QCA8K_ID_QCA8337, -+}; -+ - static const struct of_device_id qca8k_of_match[] = { -- { .compatible = "qca,qca8334" }, -- { .compatible = "qca,qca8337" }, -+ { .compatible = "qca,qca8327", .data = &qca832x }, -+ { .compatible = "qca,qca8334", .data = &qca833x }, -+ { .compatible = "qca,qca8337", .data = &qca833x }, - { /* sentinel */ }, - }; - ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -15,6 +15,8 @@ - #define QCA8K_NUM_PORTS 7 - #define QCA8K_MAX_MTU 9000 - -+#define PHY_ID_QCA8327 0x004dd034 -+#define QCA8K_ID_QCA8327 0x12 - #define PHY_ID_QCA8337 0x004dd036 - #define QCA8K_ID_QCA8337 0x13 - -@@ -213,6 +215,10 @@ struct ar8xxx_port_status { - int enabled; - }; - -+struct qca8k_match_data { -+ u8 id; -+}; -+ - struct qca8k_priv { - struct regmap *regmap; - struct mii_bus *bus; diff --git a/target/linux/generic/backport-5.10/735-v5.14-10-devicetree-net-dsa-qca8k-Document-new-compatible-qca.patch b/target/linux/generic/backport-5.10/735-v5.14-10-devicetree-net-dsa-qca8k-Document-new-compatible-qca.patch deleted file mode 100644 index 3c4a14bd0b..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-10-devicetree-net-dsa-qca8k-Document-new-compatible-qca.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 227a9ffc1bc77037339530607fe129af3824620e Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:00 +0200 -Subject: [PATCH] devicetree: net: dsa: qca8k: Document new compatible qca8327 - -Add support for qca8327 in the compatible list. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Acked-by: Rob Herring -Reviewed-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - Documentation/devicetree/bindings/net/dsa/qca8k.txt | 1 + - 1 file changed, 1 insertion(+) - ---- a/Documentation/devicetree/bindings/net/dsa/qca8k.txt -+++ b/Documentation/devicetree/bindings/net/dsa/qca8k.txt -@@ -3,6 +3,7 @@ - Required properties: - - - compatible: should be one of: -+ "qca,qca8327" - "qca,qca8334" - "qca,qca8337" - diff --git a/target/linux/generic/backport-5.10/735-v5.14-11-net-dsa-qca8k-add-priority-tweak-to-qca8337-switch.patch b/target/linux/generic/backport-5.10/735-v5.14-11-net-dsa-qca8k-add-priority-tweak-to-qca8337-switch.patch deleted file mode 100644 index cd3050ef71..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-11-net-dsa-qca8k-add-priority-tweak-to-qca8337-switch.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 83a3ceb39b2495171aabe9446271b94c678354f3 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:01 +0200 -Subject: [PATCH] net: dsa: qca8k: add priority tweak to qca8337 switch - -The port 5 of the qca8337 have some problem in flood condition. The -original legacy driver had some specific buffer and priority settings -for the different port suggested by the QCA switch team. Add this -missing settings to improve switch stability under load condition. -The packet priority tweak is only needed for the qca8337 switch and -other qca8k switch are not affected. - -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 47 +++++++++++++++++++++++++++++++++++++++++ - drivers/net/dsa/qca8k.h | 25 ++++++++++++++++++++++ - 2 files changed, 72 insertions(+) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -779,6 +779,7 @@ qca8k_setup(struct dsa_switch *ds) - { - struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; - int ret, i; -+ u32 mask; - - /* Make sure that port 0 is the cpu port */ - if (!dsa_is_cpu_port(ds, 0)) { -@@ -884,6 +885,51 @@ qca8k_setup(struct dsa_switch *ds) - } - } - -+ /* The port 5 of the qca8337 have some problem in flood condition. The -+ * original legacy driver had some specific buffer and priority settings -+ * for the different port suggested by the QCA switch team. Add this -+ * missing settings to improve switch stability under load condition. -+ * This problem is limited to qca8337 and other qca8k switch are not affected. -+ */ -+ if (priv->switch_id == QCA8K_ID_QCA8337) { -+ for (i = 0; i < QCA8K_NUM_PORTS; i++) { -+ switch (i) { -+ /* The 2 CPU port and port 5 requires some different -+ * priority than any other ports. -+ */ -+ case 0: -+ case 5: -+ case 6: -+ mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | -+ QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | -+ QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x4) | -+ QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x4) | -+ QCA8K_PORT_HOL_CTRL0_EG_PRI4(0x6) | -+ QCA8K_PORT_HOL_CTRL0_EG_PRI5(0x8) | -+ QCA8K_PORT_HOL_CTRL0_EG_PORT(0x1e); -+ break; -+ default: -+ mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | -+ QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | -+ QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x6) | -+ QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x8) | -+ QCA8K_PORT_HOL_CTRL0_EG_PORT(0x19); -+ } -+ qca8k_write(priv, QCA8K_REG_PORT_HOL_CTRL0(i), mask); -+ -+ mask = QCA8K_PORT_HOL_CTRL1_ING(0x6) | -+ QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | -+ QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | -+ QCA8K_PORT_HOL_CTRL1_WRED_EN; -+ qca8k_rmw(priv, QCA8K_REG_PORT_HOL_CTRL1(i), -+ QCA8K_PORT_HOL_CTRL1_ING_BUF | -+ QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | -+ QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | -+ QCA8K_PORT_HOL_CTRL1_WRED_EN, -+ mask); -+ } -+ } -+ - /* Setup our port MTUs to match power on defaults */ - for (i = 0; i < QCA8K_NUM_PORTS; i++) - priv->port_mtu[i] = ETH_FRAME_LEN + ETH_FCS_LEN; -@@ -1578,6 +1624,7 @@ qca8k_sw_probe(struct mdio_device *mdiod - return -ENODEV; - } - -+ priv->switch_id = id; - priv->ds = devm_kzalloc(&mdiodev->dev, sizeof(*priv->ds), GFP_KERNEL); - if (!priv->ds) - return -ENOMEM; ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -168,6 +168,30 @@ - #define QCA8K_PORT_LOOKUP_STATE GENMASK(18, 16) - #define QCA8K_PORT_LOOKUP_LEARN BIT(20) - -+#define QCA8K_REG_PORT_HOL_CTRL0(_i) (0x970 + (_i) * 0x8) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF GENMASK(3, 0) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI0(x) ((x) << 0) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI1_BUF GENMASK(7, 4) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI1(x) ((x) << 4) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI2_BUF GENMASK(11, 8) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI2(x) ((x) << 8) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI3_BUF GENMASK(15, 12) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI3(x) ((x) << 12) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI4_BUF GENMASK(19, 16) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI4(x) ((x) << 16) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI5_BUF GENMASK(23, 20) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI5(x) ((x) << 20) -+#define QCA8K_PORT_HOL_CTRL0_EG_PORT_BUF GENMASK(29, 24) -+#define QCA8K_PORT_HOL_CTRL0_EG_PORT(x) ((x) << 24) -+ -+#define QCA8K_REG_PORT_HOL_CTRL1(_i) (0x974 + (_i) * 0x8) -+#define QCA8K_PORT_HOL_CTRL1_ING_BUF GENMASK(3, 0) -+#define QCA8K_PORT_HOL_CTRL1_ING(x) ((x) << 0) -+#define QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN BIT(6) -+#define QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN BIT(7) -+#define QCA8K_PORT_HOL_CTRL1_WRED_EN BIT(8) -+#define QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN BIT(16) -+ - /* Pkt edit registers */ - #define QCA8K_EGRESS_VLAN(x) (0x0c70 + (4 * (x / 2))) - -@@ -220,6 +244,7 @@ struct qca8k_match_data { - }; - - struct qca8k_priv { -+ u8 switch_id; - struct regmap *regmap; - struct mii_bus *bus; - struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS]; diff --git a/target/linux/generic/backport-5.10/735-v5.14-12-net-dsa-qca8k-limit-port5-delay-to-qca8337.patch b/target/linux/generic/backport-5.10/735-v5.14-12-net-dsa-qca8k-limit-port5-delay-to-qca8337.patch deleted file mode 100644 index d25edbb1aa..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-12-net-dsa-qca8k-limit-port5-delay-to-qca8337.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 5bf9ff3b9fb5ecb67a1a3517b26db3a00f2a2f11 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:02 +0200 -Subject: [PATCH] net: dsa: qca8k: limit port5 delay to qca8337 - -Limit port5 rx delay to qca8337. This is taken from the legacy QSDK code -that limits the rx delay on port5 to only this particular switch version, -on other switch only the tx and rx delay for port0 are needed. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -1003,8 +1003,10 @@ qca8k_phylink_mac_config(struct dsa_swit - QCA8K_PORT_PAD_RGMII_EN | - QCA8K_PORT_PAD_RGMII_TX_DELAY(QCA8K_MAX_DELAY) | - QCA8K_PORT_PAD_RGMII_RX_DELAY(QCA8K_MAX_DELAY)); -- qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, -- QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); -+ /* QCA8337 requires to set rgmii rx delay */ -+ if (priv->switch_id == QCA8K_ID_QCA8337) -+ qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, -+ QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); - break; - case PHY_INTERFACE_MODE_SGMII: - case PHY_INTERFACE_MODE_1000BASEX: diff --git a/target/linux/generic/backport-5.10/735-v5.14-13-net-dsa-qca8k-add-GLOBAL_FC-settings-needed-for-qca8.patch b/target/linux/generic/backport-5.10/735-v5.14-13-net-dsa-qca8k-add-GLOBAL_FC-settings-needed-for-qca8.patch deleted file mode 100644 index 2b393d242a..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-13-net-dsa-qca8k-add-GLOBAL_FC-settings-needed-for-qca8.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 0fc57e4b5e39461fc0a54aae0afe4241363a7267 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:03 +0200 -Subject: [PATCH] net: dsa: qca8k: add GLOBAL_FC settings needed for qca8327 - -Switch qca8327 needs special settings for the GLOBAL_FC_THRES regs. - -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 10 ++++++++++ - drivers/net/dsa/qca8k.h | 6 ++++++ - 2 files changed, 16 insertions(+) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -930,6 +930,16 @@ qca8k_setup(struct dsa_switch *ds) - } - } - -+ /* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */ -+ if (priv->switch_id == QCA8K_ID_QCA8327) { -+ mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) | -+ QCA8K_GLOBAL_FC_GOL_XOFF_THRES(496); -+ qca8k_rmw(priv, QCA8K_REG_GLOBAL_FC_THRESH, -+ QCA8K_GLOBAL_FC_GOL_XON_THRES_S | -+ QCA8K_GLOBAL_FC_GOL_XOFF_THRES_S, -+ mask); -+ } -+ - /* Setup our port MTUs to match power on defaults */ - for (i = 0; i < QCA8K_NUM_PORTS; i++) - priv->port_mtu[i] = ETH_FRAME_LEN + ETH_FCS_LEN; ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -168,6 +168,12 @@ - #define QCA8K_PORT_LOOKUP_STATE GENMASK(18, 16) - #define QCA8K_PORT_LOOKUP_LEARN BIT(20) - -+#define QCA8K_REG_GLOBAL_FC_THRESH 0x800 -+#define QCA8K_GLOBAL_FC_GOL_XON_THRES(x) ((x) << 16) -+#define QCA8K_GLOBAL_FC_GOL_XON_THRES_S GENMASK(24, 16) -+#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES(x) ((x) << 0) -+#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES_S GENMASK(8, 0) -+ - #define QCA8K_REG_PORT_HOL_CTRL0(_i) (0x970 + (_i) * 0x8) - #define QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF GENMASK(3, 0) - #define QCA8K_PORT_HOL_CTRL0_EG_PRI0(x) ((x) << 0) diff --git a/target/linux/generic/backport-5.10/735-v5.14-14-net-dsa-qca8k-add-support-for-switch-rev.patch b/target/linux/generic/backport-5.10/735-v5.14-14-net-dsa-qca8k-add-support-for-switch-rev.patch deleted file mode 100644 index ed9b8188de..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-14-net-dsa-qca8k-add-support-for-switch-rev.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 95ffeaf18b3bb90eeef52cbf7d79ccc9d0345ff5 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:04 +0200 -Subject: [PATCH] net: dsa: qca8k: add support for switch rev - -qca8k internal phy driver require some special debug value to be set -based on the switch revision. Rework the switch id read function to -also read the chip revision. - -Signed-off-by: Ansuel Smith -Reviewed-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 53 ++++++++++++++++++++++++++--------------- - drivers/net/dsa/qca8k.h | 7 ++++-- - 2 files changed, 39 insertions(+), 21 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -1588,12 +1588,40 @@ static const struct dsa_switch_ops qca8k - .phylink_mac_link_up = qca8k_phylink_mac_link_up, - }; - -+static int qca8k_read_switch_id(struct qca8k_priv *priv) -+{ -+ const struct qca8k_match_data *data; -+ u32 val; -+ u8 id; -+ -+ /* get the switches ID from the compatible */ -+ data = of_device_get_match_data(priv->dev); -+ if (!data) -+ return -ENODEV; -+ -+ val = qca8k_read(priv, QCA8K_REG_MASK_CTRL); -+ if (val < 0) -+ return -ENODEV; -+ -+ id = QCA8K_MASK_CTRL_DEVICE_ID(val & QCA8K_MASK_CTRL_DEVICE_ID_MASK); -+ if (id != data->id) { -+ dev_err(priv->dev, "Switch id detected %x but expected %x", id, data->id); -+ return -ENODEV; -+ } -+ -+ priv->switch_id = id; -+ -+ /* Save revision to communicate to the internal PHY driver */ -+ priv->switch_revision = (val & QCA8K_MASK_CTRL_REV_ID_MASK); -+ -+ return 0; -+} -+ - static int - qca8k_sw_probe(struct mdio_device *mdiodev) - { -- const struct qca8k_match_data *data; - struct qca8k_priv *priv; -- u32 id; -+ int ret; - - /* allocate the private data struct so that we can probe the switches - * ID register -@@ -1619,24 +1647,11 @@ qca8k_sw_probe(struct mdio_device *mdiod - gpiod_set_value_cansleep(priv->reset_gpio, 0); - } - -- /* get the switches ID from the compatible */ -- data = of_device_get_match_data(&mdiodev->dev); -- if (!data) -- return -ENODEV; -+ /* Check the detected switch id */ -+ ret = qca8k_read_switch_id(priv); -+ if (ret) -+ return ret; - -- /* read the switches ID register */ -- id = qca8k_read(priv, QCA8K_REG_MASK_CTRL); -- if (id < 0) -- return id; -- -- id >>= QCA8K_MASK_CTRL_ID_S; -- id &= QCA8K_MASK_CTRL_ID_M; -- if (id != data->id) { -- dev_err(&mdiodev->dev, "Switch id detected %x but expected %x", id, data->id); -- return -ENODEV; -- } -- -- priv->switch_id = id; - priv->ds = devm_kzalloc(&mdiodev->dev, sizeof(*priv->ds), GFP_KERNEL); - if (!priv->ds) - return -ENOMEM; ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -30,8 +30,10 @@ - - /* Global control registers */ - #define QCA8K_REG_MASK_CTRL 0x000 --#define QCA8K_MASK_CTRL_ID_M 0xff --#define QCA8K_MASK_CTRL_ID_S 8 -+#define QCA8K_MASK_CTRL_REV_ID_MASK GENMASK(7, 0) -+#define QCA8K_MASK_CTRL_REV_ID(x) ((x) >> 0) -+#define QCA8K_MASK_CTRL_DEVICE_ID_MASK GENMASK(15, 8) -+#define QCA8K_MASK_CTRL_DEVICE_ID(x) ((x) >> 8) - #define QCA8K_REG_PORT0_PAD_CTRL 0x004 - #define QCA8K_REG_PORT5_PAD_CTRL 0x008 - #define QCA8K_REG_PORT6_PAD_CTRL 0x00c -@@ -251,6 +253,7 @@ struct qca8k_match_data { - - struct qca8k_priv { - u8 switch_id; -+ u8 switch_revision; - struct regmap *regmap; - struct mii_bus *bus; - struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS]; diff --git a/target/linux/generic/backport-5.10/735-v5.14-15-net-dsa-qca8k-add-ethernet-ports-fallback-to-setup_m.patch b/target/linux/generic/backport-5.10/735-v5.14-15-net-dsa-qca8k-add-ethernet-ports-fallback-to-setup_m.patch deleted file mode 100644 index 629cb324e0..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-15-net-dsa-qca8k-add-ethernet-ports-fallback-to-setup_m.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 1ee0591a1093c2448642c33433483e9260275f7b Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:05 +0200 -Subject: [PATCH] net: dsa: qca8k: add ethernet-ports fallback to - setup_mdio_bus - -Dsa now also supports ethernet-ports. Add this new binding as a fallback -if the ports node can't be found. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -719,6 +719,9 @@ qca8k_setup_mdio_bus(struct qca8k_priv * - - ports = of_get_child_by_name(priv->dev->of_node, "ports"); - if (!ports) -+ ports = of_get_child_by_name(priv->dev->of_node, "ethernet-ports"); -+ -+ if (!ports) - return -EINVAL; - - for_each_available_child_of_node(ports, port) { diff --git a/target/linux/generic/backport-5.10/735-v5.14-16-net-dsa-qca8k-make-rgmii-delay-configurable.patch b/target/linux/generic/backport-5.10/735-v5.14-16-net-dsa-qca8k-make-rgmii-delay-configurable.patch deleted file mode 100644 index 6dc2dc6e3e..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-16-net-dsa-qca8k-make-rgmii-delay-configurable.patch +++ /dev/null @@ -1,188 +0,0 @@ -From e4b9977cee1583da38a6e9118078bb728aaccf7b Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:06 +0200 -Subject: [PATCH] net: dsa: qca8k: make rgmii delay configurable - -The legacy qsdk code used a different delay instead of the max value. -Qsdk use 1 ns for rx and 2 ns for tx. Make these values configurable -using the standard rx/tx-internal-delay-ps ethernet binding and apply -qsdk values by default. The connected gmac doesn't add any delay so no -additional delay is added to tx/rx. -On this switch the delay is actually in ns so value should be in the -1000 order. Any value converted from ps to ns by dividing it by 1000 -as the switch max value for delay is 3ns. - -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 82 ++++++++++++++++++++++++++++++++++++++++- - drivers/net/dsa/qca8k.h | 11 +++--- - 2 files changed, 86 insertions(+), 7 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -778,6 +778,68 @@ qca8k_setup_mdio_bus(struct qca8k_priv * - } - - static int -+qca8k_setup_of_rgmii_delay(struct qca8k_priv *priv) -+{ -+ struct device_node *port_dn; -+ phy_interface_t mode; -+ struct dsa_port *dp; -+ u32 val; -+ -+ /* CPU port is already checked */ -+ dp = dsa_to_port(priv->ds, 0); -+ -+ port_dn = dp->dn; -+ -+ /* Check if port 0 is set to the correct type */ -+ of_get_phy_mode(port_dn, &mode); -+ if (mode != PHY_INTERFACE_MODE_RGMII_ID && -+ mode != PHY_INTERFACE_MODE_RGMII_RXID && -+ mode != PHY_INTERFACE_MODE_RGMII_TXID) { -+ return 0; -+ } -+ -+ switch (mode) { -+ case PHY_INTERFACE_MODE_RGMII_ID: -+ case PHY_INTERFACE_MODE_RGMII_RXID: -+ if (of_property_read_u32(port_dn, "rx-internal-delay-ps", &val)) -+ val = 2; -+ else -+ /* Switch regs accept value in ns, convert ps to ns */ -+ val = val / 1000; -+ -+ if (val > QCA8K_MAX_DELAY) { -+ dev_err(priv->dev, "rgmii rx delay is limited to a max value of 3ns, setting to the max value"); -+ val = 3; -+ } -+ -+ priv->rgmii_rx_delay = val; -+ /* Stop here if we need to check only for rx delay */ -+ if (mode != PHY_INTERFACE_MODE_RGMII_ID) -+ break; -+ -+ fallthrough; -+ case PHY_INTERFACE_MODE_RGMII_TXID: -+ if (of_property_read_u32(port_dn, "tx-internal-delay-ps", &val)) -+ val = 1; -+ else -+ /* Switch regs accept value in ns, convert ps to ns */ -+ val = val / 1000; -+ -+ if (val > QCA8K_MAX_DELAY) { -+ dev_err(priv->dev, "rgmii tx delay is limited to a max value of 3ns, setting to the max value"); -+ val = 3; -+ } -+ -+ priv->rgmii_tx_delay = val; -+ break; -+ default: -+ return 0; -+ } -+ -+ return 0; -+} -+ -+static int - qca8k_setup(struct dsa_switch *ds) - { - struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; -@@ -802,6 +864,10 @@ qca8k_setup(struct dsa_switch *ds) - if (ret) - return ret; - -+ ret = qca8k_setup_of_rgmii_delay(priv); -+ if (ret) -+ return ret; -+ - /* Enable CPU Port */ - ret = qca8k_reg_set(priv, QCA8K_REG_GLOBAL_FW_CTRL0, - QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN); -@@ -970,6 +1036,8 @@ qca8k_phylink_mac_config(struct dsa_swit - case 0: /* 1st CPU port */ - if (state->interface != PHY_INTERFACE_MODE_RGMII && - state->interface != PHY_INTERFACE_MODE_RGMII_ID && -+ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && -+ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && - state->interface != PHY_INTERFACE_MODE_SGMII) - return; - -@@ -985,6 +1053,8 @@ qca8k_phylink_mac_config(struct dsa_swit - case 6: /* 2nd CPU port / external PHY */ - if (state->interface != PHY_INTERFACE_MODE_RGMII && - state->interface != PHY_INTERFACE_MODE_RGMII_ID && -+ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && -+ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && - state->interface != PHY_INTERFACE_MODE_SGMII && - state->interface != PHY_INTERFACE_MODE_1000BASEX) - return; -@@ -1008,14 +1078,18 @@ qca8k_phylink_mac_config(struct dsa_swit - qca8k_write(priv, reg, QCA8K_PORT_PAD_RGMII_EN); - break; - case PHY_INTERFACE_MODE_RGMII_ID: -+ case PHY_INTERFACE_MODE_RGMII_TXID: -+ case PHY_INTERFACE_MODE_RGMII_RXID: - /* RGMII_ID needs internal delay. This is enabled through - * PORT5_PAD_CTRL for all ports, rather than individual port - * registers - */ - qca8k_write(priv, reg, - QCA8K_PORT_PAD_RGMII_EN | -- QCA8K_PORT_PAD_RGMII_TX_DELAY(QCA8K_MAX_DELAY) | -- QCA8K_PORT_PAD_RGMII_RX_DELAY(QCA8K_MAX_DELAY)); -+ QCA8K_PORT_PAD_RGMII_TX_DELAY(priv->rgmii_tx_delay) | -+ QCA8K_PORT_PAD_RGMII_RX_DELAY(priv->rgmii_rx_delay) | -+ QCA8K_PORT_PAD_RGMII_TX_DELAY_EN | -+ QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); - /* QCA8337 requires to set rgmii rx delay */ - if (priv->switch_id == QCA8K_ID_QCA8337) - qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, -@@ -1073,6 +1147,8 @@ qca8k_phylink_validate(struct dsa_switch - if (state->interface != PHY_INTERFACE_MODE_NA && - state->interface != PHY_INTERFACE_MODE_RGMII && - state->interface != PHY_INTERFACE_MODE_RGMII_ID && -+ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && -+ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && - state->interface != PHY_INTERFACE_MODE_SGMII) - goto unsupported; - break; -@@ -1090,6 +1166,8 @@ qca8k_phylink_validate(struct dsa_switch - if (state->interface != PHY_INTERFACE_MODE_NA && - state->interface != PHY_INTERFACE_MODE_RGMII && - state->interface != PHY_INTERFACE_MODE_RGMII_ID && -+ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && -+ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && - state->interface != PHY_INTERFACE_MODE_SGMII && - state->interface != PHY_INTERFACE_MODE_1000BASEX) - goto unsupported; ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -38,12 +38,11 @@ - #define QCA8K_REG_PORT5_PAD_CTRL 0x008 - #define QCA8K_REG_PORT6_PAD_CTRL 0x00c - #define QCA8K_PORT_PAD_RGMII_EN BIT(26) --#define QCA8K_PORT_PAD_RGMII_TX_DELAY(x) \ -- ((0x8 + (x & 0x3)) << 22) --#define QCA8K_PORT_PAD_RGMII_RX_DELAY(x) \ -- ((0x10 + (x & 0x3)) << 20) --#define QCA8K_MAX_DELAY 3 -+#define QCA8K_PORT_PAD_RGMII_TX_DELAY(x) ((x) << 22) -+#define QCA8K_PORT_PAD_RGMII_RX_DELAY(x) ((x) << 20) -+#define QCA8K_PORT_PAD_RGMII_TX_DELAY_EN BIT(25) - #define QCA8K_PORT_PAD_RGMII_RX_DELAY_EN BIT(24) -+#define QCA8K_MAX_DELAY 3 - #define QCA8K_PORT_PAD_SGMII_EN BIT(7) - #define QCA8K_REG_PWS 0x010 - #define QCA8K_PWS_SERDES_AEN_DIS BIT(7) -@@ -254,6 +253,8 @@ struct qca8k_match_data { - struct qca8k_priv { - u8 switch_id; - u8 switch_revision; -+ u8 rgmii_tx_delay; -+ u8 rgmii_rx_delay; - struct regmap *regmap; - struct mii_bus *bus; - struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS]; diff --git a/target/linux/generic/backport-5.10/735-v5.14-17-net-dsa-qca8k-clear-MASTER_EN-after-phy-read-write.patch b/target/linux/generic/backport-5.10/735-v5.14-17-net-dsa-qca8k-clear-MASTER_EN-after-phy-read-write.patch deleted file mode 100644 index 4593da032b..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-17-net-dsa-qca8k-clear-MASTER_EN-after-phy-read-write.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 63c33bbfeb6842a956a0eb12901e28eb335bdb18 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:07 +0200 -Subject: [PATCH] net: dsa: qca8k: clear MASTER_EN after phy read/write - -Clear MDIO_MASTER_EN bit from MDIO_MASTER_CTRL after read/write -operation. The MDIO_MASTER_EN bit is not reset after read/write -operation and the next operation can be wrongly interpreted by the -switch as a mdio operation. This cause a production of wrong/garbage -data from the switch and underfined bheavior. (random port drop, -unplugged port flagged with link up, wrong port speed) -Also on driver remove the MASTER_CTRL can be left set and cause the -malfunction of any next driver using the mdio device. - -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 14 ++++++++++++-- - 1 file changed, 12 insertions(+), 2 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -649,8 +649,14 @@ qca8k_mdio_write(struct qca8k_priv *priv - if (ret) - return ret; - -- return qca8k_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, -- QCA8K_MDIO_MASTER_BUSY); -+ ret = qca8k_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, -+ QCA8K_MDIO_MASTER_BUSY); -+ -+ /* even if the busy_wait timeouts try to clear the MASTER_EN */ -+ qca8k_reg_clear(priv, QCA8K_MDIO_MASTER_CTRL, -+ QCA8K_MDIO_MASTER_EN); -+ -+ return ret; - } - - static int -@@ -685,6 +691,10 @@ qca8k_mdio_read(struct qca8k_priv *priv, - - val &= QCA8K_MDIO_MASTER_DATA_MASK; - -+ /* even if the busy_wait timeouts try to clear the MASTER_EN */ -+ qca8k_reg_clear(priv, QCA8K_MDIO_MASTER_CTRL, -+ QCA8K_MDIO_MASTER_EN); -+ - return val; - } - diff --git a/target/linux/generic/backport-5.10/735-v5.14-18-net-dsa-qca8k-dsa-qca8k-protect-MASTER-busy_wait-wit.patch b/target/linux/generic/backport-5.10/735-v5.14-18-net-dsa-qca8k-dsa-qca8k-protect-MASTER-busy_wait-wit.patch deleted file mode 100644 index b6684d7210..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-18-net-dsa-qca8k-dsa-qca8k-protect-MASTER-busy_wait-wit.patch +++ /dev/null @@ -1,128 +0,0 @@ -From 60df02b6ea4581d72eb7a3ab7204504a54059b72 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:08 +0200 -Subject: [PATCH] net: dsa: qca8k: dsa: qca8k: protect MASTER busy_wait with - mdio mutex - -MDIO_MASTER operation have a dedicated busy wait that is not protected -by the mdio mutex. This can cause situation where the MASTER operation -is done and a normal operation is executed between the MASTER read/write -and the MASTER busy_wait. Rework the qca8k_mdio_read/write function to -address this issue by binding the lock for the whole MASTER operation -and not only the mdio read/write common operation. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 68 +++++++++++++++++++++++++++++++++-------- - 1 file changed, 55 insertions(+), 13 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -628,8 +628,31 @@ qca8k_port_to_phy(int port) - } - - static int -+qca8k_mdio_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) -+{ -+ u16 r1, r2, page; -+ u32 val; -+ int ret; -+ -+ qca8k_split_addr(reg, &r1, &r2, &page); -+ -+ ret = read_poll_timeout(qca8k_mii_read32, val, !(val & mask), 0, -+ QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, -+ priv->bus, 0x10 | r2, r1); -+ -+ /* Check if qca8k_read has failed for a different reason -+ * before returnting -ETIMEDOUT -+ */ -+ if (ret < 0 && val < 0) -+ return val; -+ -+ return ret; -+} -+ -+static int - qca8k_mdio_write(struct qca8k_priv *priv, int port, u32 regnum, u16 data) - { -+ u16 r1, r2, page; - u32 phy, val; - int ret; - -@@ -645,12 +668,21 @@ qca8k_mdio_write(struct qca8k_priv *priv - QCA8K_MDIO_MASTER_REG_ADDR(regnum) | - QCA8K_MDIO_MASTER_DATA(data); - -- ret = qca8k_write(priv, QCA8K_MDIO_MASTER_CTRL, val); -+ qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); -+ -+ mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); -+ -+ ret = qca8k_set_page(priv->bus, page); - if (ret) -- return ret; -+ goto exit; -+ -+ qca8k_mii_write32(priv->bus, 0x10 | r2, r1, val); - -- ret = qca8k_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, -- QCA8K_MDIO_MASTER_BUSY); -+ ret = qca8k_mdio_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, -+ QCA8K_MDIO_MASTER_BUSY); -+ -+exit: -+ mutex_unlock(&priv->bus->mdio_lock); - - /* even if the busy_wait timeouts try to clear the MASTER_EN */ - qca8k_reg_clear(priv, QCA8K_MDIO_MASTER_CTRL, -@@ -662,6 +694,7 @@ qca8k_mdio_write(struct qca8k_priv *priv - static int - qca8k_mdio_read(struct qca8k_priv *priv, int port, u32 regnum) - { -+ u16 r1, r2, page; - u32 phy, val; - int ret; - -@@ -676,21 +709,30 @@ qca8k_mdio_read(struct qca8k_priv *priv, - QCA8K_MDIO_MASTER_READ | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | - QCA8K_MDIO_MASTER_REG_ADDR(regnum); - -- ret = qca8k_write(priv, QCA8K_MDIO_MASTER_CTRL, val); -- if (ret) -- return ret; -+ qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); -+ -+ mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); - -- ret = qca8k_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, -- QCA8K_MDIO_MASTER_BUSY); -+ ret = qca8k_set_page(priv->bus, page); - if (ret) -- return ret; -+ goto exit; - -- val = qca8k_read(priv, QCA8K_MDIO_MASTER_CTRL); -- if (val < 0) -- return val; -+ qca8k_mii_write32(priv->bus, 0x10 | r2, r1, val); -+ -+ ret = qca8k_mdio_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, -+ QCA8K_MDIO_MASTER_BUSY); -+ if (ret) -+ goto exit; - -+ val = qca8k_mii_read32(priv->bus, 0x10 | r2, r1); - val &= QCA8K_MDIO_MASTER_DATA_MASK; - -+exit: -+ mutex_unlock(&priv->bus->mdio_lock); -+ -+ if (val >= 0) -+ val &= QCA8K_MDIO_MASTER_DATA_MASK; -+ - /* even if the busy_wait timeouts try to clear the MASTER_EN */ - qca8k_reg_clear(priv, QCA8K_MDIO_MASTER_CTRL, - QCA8K_MDIO_MASTER_EN); diff --git a/target/linux/generic/backport-5.10/735-v5.14-19-net-dsa-qca8k-enlarge-mdio-delay-and-timeout.patch b/target/linux/generic/backport-5.10/735-v5.14-19-net-dsa-qca8k-enlarge-mdio-delay-and-timeout.patch deleted file mode 100644 index 30eeed361e..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-19-net-dsa-qca8k-enlarge-mdio-delay-and-timeout.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 617960d72e93de0f3fa52407e2d39e8c43e73b0a Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:09 +0200 -Subject: [PATCH] net: dsa: qca8k: enlarge mdio delay and timeout - -The witch require some extra delay after setting page or the next -read/write can use still use the old page. Add a delay after the -set_page function to address this as it's done in QSDK legacy driver. -Some timeouts were notice with VLAN and phy function, enlarge the -mdio busy wait timeout to fix these problems. - -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 1 + - drivers/net/dsa/qca8k.h | 2 +- - 2 files changed, 2 insertions(+), 1 deletion(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -143,6 +143,7 @@ qca8k_set_page(struct mii_bus *bus, u16 - } - - qca8k_current_page = page; -+ usleep_range(1000, 2000); - return 0; - } - ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -20,7 +20,7 @@ - #define PHY_ID_QCA8337 0x004dd036 - #define QCA8K_ID_QCA8337 0x13 - --#define QCA8K_BUSY_WAIT_TIMEOUT 20 -+#define QCA8K_BUSY_WAIT_TIMEOUT 2000 - - #define QCA8K_NUM_FDB_RECORDS 2048 - diff --git a/target/linux/generic/backport-5.10/735-v5.14-20-net-dsa-qca8k-add-support-for-internal-phy-and-inter.patch b/target/linux/generic/backport-5.10/735-v5.14-20-net-dsa-qca8k-add-support-for-internal-phy-and-inter.patch deleted file mode 100644 index 88d3c1ef43..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-20-net-dsa-qca8k-add-support-for-internal-phy-and-inter.patch +++ /dev/null @@ -1,267 +0,0 @@ -From 759bafb8a3226326ca357613bc90acf738f80c32 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:10 +0200 -Subject: [PATCH] net: dsa: qca8k: add support for internal phy and internal - mdio - -Add support to setup_mdio_bus for internal phy declaration. Introduce a -flag to use the legacy port phy mapping by default and use the direct -mapping if a mdio node is detected in the switch node. Register a -dedicated mdio internal mdio bus to address the different mapping -between port and phy if the mdio node is detected. - -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 112 +++++++++++++++++++++++++++++----------- - drivers/net/dsa/qca8k.h | 1 + - 2 files changed, 83 insertions(+), 30 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -629,7 +630,7 @@ qca8k_port_to_phy(int port) - } - - static int --qca8k_mdio_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) -+qca8k_mdio_busy_wait(struct mii_bus *bus, u32 reg, u32 mask) - { - u16 r1, r2, page; - u32 val; -@@ -639,7 +640,7 @@ qca8k_mdio_busy_wait(struct qca8k_priv * - - ret = read_poll_timeout(qca8k_mii_read32, val, !(val & mask), 0, - QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, -- priv->bus, 0x10 | r2, r1); -+ bus, 0x10 | r2, r1); - - /* Check if qca8k_read has failed for a different reason - * before returnting -ETIMEDOUT -@@ -651,19 +652,16 @@ qca8k_mdio_busy_wait(struct qca8k_priv * - } - - static int --qca8k_mdio_write(struct qca8k_priv *priv, int port, u32 regnum, u16 data) -+qca8k_mdio_write(struct mii_bus *salve_bus, int phy, int regnum, u16 data) - { -+ struct qca8k_priv *priv = salve_bus->priv; - u16 r1, r2, page; -- u32 phy, val; -+ u32 val; - int ret; - - if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) - return -EINVAL; - -- /* callee is responsible for not passing bad ports, -- * but we still would like to make spills impossible. -- */ -- phy = qca8k_port_to_phy(port) % PHY_MAX_ADDR; - val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | - QCA8K_MDIO_MASTER_WRITE | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | - QCA8K_MDIO_MASTER_REG_ADDR(regnum) | -@@ -679,33 +677,29 @@ qca8k_mdio_write(struct qca8k_priv *priv - - qca8k_mii_write32(priv->bus, 0x10 | r2, r1, val); - -- ret = qca8k_mdio_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, -+ ret = qca8k_mdio_busy_wait(priv->bus, QCA8K_MDIO_MASTER_CTRL, - QCA8K_MDIO_MASTER_BUSY); - - exit: -- mutex_unlock(&priv->bus->mdio_lock); -- - /* even if the busy_wait timeouts try to clear the MASTER_EN */ -- qca8k_reg_clear(priv, QCA8K_MDIO_MASTER_CTRL, -- QCA8K_MDIO_MASTER_EN); -+ qca8k_mii_write32(priv->bus, 0x10 | r2, r1, 0); -+ -+ mutex_unlock(&priv->bus->mdio_lock); - - return ret; - } - - static int --qca8k_mdio_read(struct qca8k_priv *priv, int port, u32 regnum) -+qca8k_mdio_read(struct mii_bus *salve_bus, int phy, int regnum) - { -+ struct qca8k_priv *priv = salve_bus->priv; - u16 r1, r2, page; -- u32 phy, val; -+ u32 val; - int ret; - - if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) - return -EINVAL; - -- /* callee is responsible for not passing bad ports, -- * but we still would like to make spills impossible. -- */ -- phy = qca8k_port_to_phy(port) % PHY_MAX_ADDR; - val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | - QCA8K_MDIO_MASTER_READ | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | - QCA8K_MDIO_MASTER_REG_ADDR(regnum); -@@ -720,24 +714,22 @@ qca8k_mdio_read(struct qca8k_priv *priv, - - qca8k_mii_write32(priv->bus, 0x10 | r2, r1, val); - -- ret = qca8k_mdio_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL, -+ ret = qca8k_mdio_busy_wait(priv->bus, QCA8K_MDIO_MASTER_CTRL, - QCA8K_MDIO_MASTER_BUSY); - if (ret) - goto exit; - - val = qca8k_mii_read32(priv->bus, 0x10 | r2, r1); -- val &= QCA8K_MDIO_MASTER_DATA_MASK; - - exit: -+ /* even if the busy_wait timeouts try to clear the MASTER_EN */ -+ qca8k_mii_write32(priv->bus, 0x10 | r2, r1, 0); -+ - mutex_unlock(&priv->bus->mdio_lock); - - if (val >= 0) - val &= QCA8K_MDIO_MASTER_DATA_MASK; - -- /* even if the busy_wait timeouts try to clear the MASTER_EN */ -- qca8k_reg_clear(priv, QCA8K_MDIO_MASTER_CTRL, -- QCA8K_MDIO_MASTER_EN); -- - return val; - } - -@@ -746,7 +738,14 @@ qca8k_phy_write(struct dsa_switch *ds, i - { - struct qca8k_priv *priv = ds->priv; - -- return qca8k_mdio_write(priv, port, regnum, data); -+ /* Check if the legacy mapping should be used and the -+ * port is not correctly mapped to the right PHY in the -+ * devicetree -+ */ -+ if (priv->legacy_phy_port_mapping) -+ port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; -+ -+ return qca8k_mdio_write(priv->bus, port, regnum, data); - } - - static int -@@ -755,7 +754,14 @@ qca8k_phy_read(struct dsa_switch *ds, in - struct qca8k_priv *priv = ds->priv; - int ret; - -- ret = qca8k_mdio_read(priv, port, regnum); -+ /* Check if the legacy mapping should be used and the -+ * port is not correctly mapped to the right PHY in the -+ * devicetree -+ */ -+ if (priv->legacy_phy_port_mapping) -+ port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; -+ -+ ret = qca8k_mdio_read(priv->bus, port, regnum); - - if (ret < 0) - return 0xffff; -@@ -764,10 +770,37 @@ qca8k_phy_read(struct dsa_switch *ds, in - } - - static int -+qca8k_mdio_register(struct qca8k_priv *priv, struct device_node *mdio) -+{ -+ struct dsa_switch *ds = priv->ds; -+ struct mii_bus *bus; -+ -+ bus = devm_mdiobus_alloc(ds->dev); -+ -+ if (!bus) -+ return -ENOMEM; -+ -+ bus->priv = (void *)priv; -+ bus->name = "qca8k slave mii"; -+ bus->read = qca8k_mdio_read; -+ bus->write = qca8k_mdio_write; -+ snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d", -+ ds->index); -+ -+ bus->parent = ds->dev; -+ bus->phy_mask = ~ds->phys_mii_mask; -+ -+ ds->slave_mii_bus = bus; -+ -+ return devm_of_mdiobus_register(priv->dev, bus, mdio); -+} -+ -+static int - qca8k_setup_mdio_bus(struct qca8k_priv *priv) - { - u32 internal_mdio_mask = 0, external_mdio_mask = 0, reg; -- struct device_node *ports, *port; -+ struct device_node *ports, *port, *mdio; -+ phy_interface_t mode; - int err; - - ports = of_get_child_by_name(priv->dev->of_node, "ports"); -@@ -788,7 +821,10 @@ qca8k_setup_mdio_bus(struct qca8k_priv * - if (!dsa_is_user_port(priv->ds, reg)) - continue; - -- if (of_property_read_bool(port, "phy-handle")) -+ of_get_phy_mode(port, &mode); -+ -+ if (of_property_read_bool(port, "phy-handle") && -+ mode != PHY_INTERFACE_MODE_INTERNAL) - external_mdio_mask |= BIT(reg); - else - internal_mdio_mask |= BIT(reg); -@@ -825,8 +861,23 @@ qca8k_setup_mdio_bus(struct qca8k_priv * - QCA8K_MDIO_MASTER_EN); - } - -+ /* Check if the devicetree declare the port:phy mapping */ -+ mdio = of_get_child_by_name(priv->dev->of_node, "mdio"); -+ if (of_device_is_available(mdio)) { -+ err = qca8k_mdio_register(priv, mdio); -+ if (err) -+ of_node_put(mdio); -+ -+ return err; -+ } -+ -+ /* If a mapping can't be found the legacy mapping is used, -+ * using the qca8k_port_to_phy function -+ */ -+ priv->legacy_phy_port_mapping = true; - priv->ops.phy_read = qca8k_phy_read; - priv->ops.phy_write = qca8k_phy_write; -+ - return 0; - } - -@@ -1212,7 +1263,8 @@ qca8k_phylink_validate(struct dsa_switch - case 5: - /* Internal PHY */ - if (state->interface != PHY_INTERFACE_MODE_NA && -- state->interface != PHY_INTERFACE_MODE_GMII) -+ state->interface != PHY_INTERFACE_MODE_GMII && -+ state->interface != PHY_INTERFACE_MODE_INTERNAL) - goto unsupported; - break; - case 6: /* 2nd CPU port / external PHY */ ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -255,6 +255,7 @@ struct qca8k_priv { - u8 switch_revision; - u8 rgmii_tx_delay; - u8 rgmii_rx_delay; -+ bool legacy_phy_port_mapping; - struct regmap *regmap; - struct mii_bus *bus; - struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS]; diff --git a/target/linux/generic/backport-5.10/735-v5.14-21-devicetree-bindings-dsa-qca8k-Document-internal-mdio.patch b/target/linux/generic/backport-5.10/735-v5.14-21-devicetree-bindings-dsa-qca8k-Document-internal-mdio.patch deleted file mode 100644 index 6db01b4b41..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-21-devicetree-bindings-dsa-qca8k-Document-internal-mdio.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 0c994a28e7518f098c84a3049cb2915780db873a Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:11 +0200 -Subject: [PATCH] devicetree: bindings: dsa: qca8k: Document internal mdio - definition - -Document new way of declare mapping of internal PHY to port. -The new implementation directly declare the PHY connected to the port -by adding a node in the switch node. The driver detect this and register -an internal mdiobus using the mapping defined in the mdio node. - -Signed-off-by: Ansuel Smith -Reviewed-by: Rob Herring -Signed-off-by: David S. Miller ---- - .../devicetree/bindings/net/dsa/qca8k.txt | 39 +++++++++++++++++++ - 1 file changed, 39 insertions(+) - ---- a/Documentation/devicetree/bindings/net/dsa/qca8k.txt -+++ b/Documentation/devicetree/bindings/net/dsa/qca8k.txt -@@ -21,6 +21,10 @@ described in dsa/dsa.txt. If the QCA8K s - mdio-bus each subnode describing a port needs to have a valid phandle - referencing the internal PHY it is connected to. This is because there's no - N:N mapping of port and PHY id. -+To declare the internal mdio-bus configuration, declare a mdio node in the -+switch node and declare the phandle for the port referencing the internal -+PHY is connected to. In this config a internal mdio-bus is registered and -+the mdio MASTER is used as communication. - - Don't use mixed external and internal mdio-bus configurations, as this is - not supported by the hardware. -@@ -150,26 +154,61 @@ for the internal master mdio-bus configu - port@1 { - reg = <1>; - label = "lan1"; -+ phy-mode = "internal"; -+ phy-handle = <&phy_port1>; - }; - - port@2 { - reg = <2>; - label = "lan2"; -+ phy-mode = "internal"; -+ phy-handle = <&phy_port2>; - }; - - port@3 { - reg = <3>; - label = "lan3"; -+ phy-mode = "internal"; -+ phy-handle = <&phy_port3>; - }; - - port@4 { - reg = <4>; - label = "lan4"; -+ phy-mode = "internal"; -+ phy-handle = <&phy_port4>; - }; - - port@5 { - reg = <5>; - label = "wan"; -+ phy-mode = "internal"; -+ phy-handle = <&phy_port5>; -+ }; -+ }; -+ -+ mdio { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ phy_port1: phy@0 { -+ reg = <0>; -+ }; -+ -+ phy_port2: phy@1 { -+ reg = <1>; -+ }; -+ -+ phy_port3: phy@2 { -+ reg = <2>; -+ }; -+ -+ phy_port4: phy@3 { -+ reg = <3>; -+ }; -+ -+ phy_port5: phy@4 { -+ reg = <4>; - }; - }; - }; diff --git a/target/linux/generic/backport-5.10/735-v5.14-22-net-dsa-qca8k-improve-internal-mdio-read-write-bus-a.patch b/target/linux/generic/backport-5.10/735-v5.14-22-net-dsa-qca8k-improve-internal-mdio-read-write-bus-a.patch deleted file mode 100644 index da8d5b3462..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-22-net-dsa-qca8k-improve-internal-mdio-read-write-bus-a.patch +++ /dev/null @@ -1,95 +0,0 @@ -From b7ebac354d54f1657bb89b7a7ca149db50203e6a Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:12 +0200 -Subject: [PATCH] net: dsa: qca8k: improve internal mdio read/write bus access - -Improve the internal mdio read/write bus access by caching the value -without accessing it for every read/write. - -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 28 +++++++++++++++------------- - 1 file changed, 15 insertions(+), 13 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -655,6 +655,7 @@ static int - qca8k_mdio_write(struct mii_bus *salve_bus, int phy, int regnum, u16 data) - { - struct qca8k_priv *priv = salve_bus->priv; -+ struct mii_bus *bus = priv->bus; - u16 r1, r2, page; - u32 val; - int ret; -@@ -669,22 +670,22 @@ qca8k_mdio_write(struct mii_bus *salve_b - - qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); - -- mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); -+ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - -- ret = qca8k_set_page(priv->bus, page); -+ ret = qca8k_set_page(bus, page); - if (ret) - goto exit; - -- qca8k_mii_write32(priv->bus, 0x10 | r2, r1, val); -+ qca8k_mii_write32(bus, 0x10 | r2, r1, val); - -- ret = qca8k_mdio_busy_wait(priv->bus, QCA8K_MDIO_MASTER_CTRL, -+ ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, - QCA8K_MDIO_MASTER_BUSY); - - exit: - /* even if the busy_wait timeouts try to clear the MASTER_EN */ -- qca8k_mii_write32(priv->bus, 0x10 | r2, r1, 0); -+ qca8k_mii_write32(bus, 0x10 | r2, r1, 0); - -- mutex_unlock(&priv->bus->mdio_lock); -+ mutex_unlock(&bus->mdio_lock); - - return ret; - } -@@ -693,6 +694,7 @@ static int - qca8k_mdio_read(struct mii_bus *salve_bus, int phy, int regnum) - { - struct qca8k_priv *priv = salve_bus->priv; -+ struct mii_bus *bus = priv->bus; - u16 r1, r2, page; - u32 val; - int ret; -@@ -706,26 +708,26 @@ qca8k_mdio_read(struct mii_bus *salve_bu - - qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); - -- mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); -+ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - -- ret = qca8k_set_page(priv->bus, page); -+ ret = qca8k_set_page(bus, page); - if (ret) - goto exit; - -- qca8k_mii_write32(priv->bus, 0x10 | r2, r1, val); -+ qca8k_mii_write32(bus, 0x10 | r2, r1, val); - -- ret = qca8k_mdio_busy_wait(priv->bus, QCA8K_MDIO_MASTER_CTRL, -+ ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, - QCA8K_MDIO_MASTER_BUSY); - if (ret) - goto exit; - -- val = qca8k_mii_read32(priv->bus, 0x10 | r2, r1); -+ val = qca8k_mii_read32(bus, 0x10 | r2, r1); - - exit: - /* even if the busy_wait timeouts try to clear the MASTER_EN */ -- qca8k_mii_write32(priv->bus, 0x10 | r2, r1, 0); -+ qca8k_mii_write32(bus, 0x10 | r2, r1, 0); - -- mutex_unlock(&priv->bus->mdio_lock); -+ mutex_unlock(&bus->mdio_lock); - - if (val >= 0) - val &= QCA8K_MDIO_MASTER_DATA_MASK; diff --git a/target/linux/generic/backport-5.10/735-v5.14-23-net-dsa-qca8k-pass-switch_revision-info-to-phy-dev_f.patch b/target/linux/generic/backport-5.10/735-v5.14-23-net-dsa-qca8k-pass-switch_revision-info-to-phy-dev_f.patch deleted file mode 100644 index 1179cf152d..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-23-net-dsa-qca8k-pass-switch_revision-info-to-phy-dev_f.patch +++ /dev/null @@ -1,48 +0,0 @@ -From a46aec02bc06ac2c33f326339e4ef88c735dc30d Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:13 +0200 -Subject: [PATCH] net: dsa: qca8k: pass switch_revision info to phy dev_flags - -Define get_phy_flags to pass switch_Revision needed to tweak the -internal PHY with debug values based on the revision. - -Signed-off-by: Ansuel Smith -Reviewed-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 17 +++++++++++++++++ - 1 file changed, 17 insertions(+) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -1740,6 +1740,22 @@ qca8k_port_vlan_del(struct dsa_switch *d - return ret; - } - -+static u32 qca8k_get_phy_flags(struct dsa_switch *ds, int port) -+{ -+ struct qca8k_priv *priv = ds->priv; -+ -+ /* Communicate to the phy internal driver the switch revision. -+ * Based on the switch revision different values needs to be -+ * set to the dbg and mmd reg on the phy. -+ * The first 2 bit are used to communicate the switch revision -+ * to the phy driver. -+ */ -+ if (port > 0 && port < 6) -+ return priv->switch_revision; -+ -+ return 0; -+} -+ - static enum dsa_tag_protocol - qca8k_get_tag_protocol(struct dsa_switch *ds, int port, - enum dsa_tag_protocol mp) -@@ -1774,6 +1790,7 @@ static const struct dsa_switch_ops qca8k - .phylink_mac_config = qca8k_phylink_mac_config, - .phylink_mac_link_down = qca8k_phylink_mac_link_down, - .phylink_mac_link_up = qca8k_phylink_mac_link_up, -+ .get_phy_flags = qca8k_get_phy_flags, - }; - - static int qca8k_read_switch_id(struct qca8k_priv *priv) diff --git a/target/linux/generic/backport-5.10/735-v5.14-25-net-phy-add-support-for-qca8k-switch-internal-PHY-in.patch b/target/linux/generic/backport-5.10/735-v5.14-25-net-phy-add-support-for-qca8k-switch-internal-PHY-in.patch deleted file mode 100644 index 20325f564d..0000000000 --- a/target/linux/generic/backport-5.10/735-v5.14-25-net-phy-add-support-for-qca8k-switch-internal-PHY-in.patch +++ /dev/null @@ -1,229 +0,0 @@ -From 272833b9b3b3969be7a91839121d86662c8c4253 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Fri, 14 May 2021 23:00:15 +0200 -Subject: [PATCH] net: phy: add support for qca8k switch internal PHY in at803x - -Since the at803x share the same regs, it's assumed they are based on the -same implementation. Make it part of the at803x PHY driver to skip -having redudant code. -Add initial support for qca8k internal PHYs. The internal PHYs requires -special mmd and debug values to be set based on the switch revision -passwd using the dev_flags. Supports output of idle, receive and eee_wake -errors stats. -Some debug values sets can't be translated as the documentation lacks any -reference about them. - -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/phy/Kconfig | 5 +- - drivers/net/phy/at803x.c | 132 ++++++++++++++++++++++++++++++++++++++- - 2 files changed, 134 insertions(+), 3 deletions(-) - ---- a/drivers/net/phy/Kconfig -+++ b/drivers/net/phy/Kconfig -@@ -235,10 +235,11 @@ config NXP_TJA11XX_PHY - Currently supports the NXP TJA1100 and TJA1101 PHY. - - config AT803X_PHY -- tristate "Qualcomm Atheros AR803X PHYs" -+ tristate "Qualcomm Atheros AR803X PHYs and QCA833x PHYs" - depends on REGULATOR - help -- Currently supports the AR8030, AR8031, AR8033 and AR8035 model -+ Currently supports the AR8030, AR8031, AR8033, AR8035 and internal -+ QCA8337(Internal qca8k PHY) model - - config QSEMI_PHY - tristate "Quality Semiconductor PHYs" ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -92,10 +92,16 @@ - #define AT803X_DEBUG_REG_5 0x05 - #define AT803X_DEBUG_TX_CLK_DLY_EN BIT(8) - -+#define AT803X_DEBUG_REG_3C 0x3C -+ -+#define AT803X_DEBUG_REG_3D 0x3D -+ - #define AT803X_DEBUG_REG_1F 0x1F - #define AT803X_DEBUG_PLL_ON BIT(2) - #define AT803X_DEBUG_RGMII_1V8 BIT(3) - -+#define MDIO_AZ_DEBUG 0x800D -+ - /* AT803x supports either the XTAL input pad, an internal PLL or the - * DSP as clock reference for the clock output pad. The XTAL reference - * is only used for 25 MHz output, all other frequencies need the PLL. -@@ -142,10 +148,34 @@ - #define AT803X_PAGE_FIBER 0 - #define AT803X_PAGE_COPPER 1 - -+#define QCA8327_PHY_ID 0x004dd034 -+#define QCA8337_PHY_ID 0x004dd036 -+#define QCA8K_PHY_ID_MASK 0xffffffff -+ -+#define QCA8K_DEVFLAGS_REVISION_MASK GENMASK(2, 0) -+ - MODULE_DESCRIPTION("Qualcomm Atheros AR803x PHY driver"); - MODULE_AUTHOR("Matus Ujhelyi"); - MODULE_LICENSE("GPL"); - -+enum stat_access_type { -+ PHY, -+ MMD -+}; -+ -+struct at803x_hw_stat { -+ const char *string; -+ u8 reg; -+ u32 mask; -+ enum stat_access_type access_type; -+}; -+ -+static struct at803x_hw_stat at803x_hw_stats[] = { -+ { "phy_idle_errors", 0xa, GENMASK(7, 0), PHY}, -+ { "phy_receive_errors", 0x15, GENMASK(15, 0), PHY}, -+ { "eee_wake_errors", 0x16, GENMASK(15, 0), MMD}, -+}; -+ - struct at803x_priv { - int flags; - #define AT803X_KEEP_PLL_ENABLED BIT(0) /* don't turn off internal PLL */ -@@ -154,6 +184,7 @@ struct at803x_priv { - struct regulator_dev *vddio_rdev; - struct regulator_dev *vddh_rdev; - struct regulator *vddio; -+ u64 stats[ARRAY_SIZE(at803x_hw_stats)]; - }; - - struct at803x_context { -@@ -165,6 +196,17 @@ struct at803x_context { - u16 led_control; - }; - -+static int at803x_debug_reg_write(struct phy_device *phydev, u16 reg, u16 data) -+{ -+ int ret; -+ -+ ret = phy_write(phydev, AT803X_DEBUG_ADDR, reg); -+ if (ret < 0) -+ return ret; -+ -+ return phy_write(phydev, AT803X_DEBUG_DATA, data); -+} -+ - static int at803x_debug_reg_read(struct phy_device *phydev, u16 reg) - { - int ret; -@@ -327,6 +369,53 @@ static void at803x_get_wol(struct phy_de - wol->wolopts |= WAKE_MAGIC; - } - -+static int at803x_get_sset_count(struct phy_device *phydev) -+{ -+ return ARRAY_SIZE(at803x_hw_stats); -+} -+ -+static void at803x_get_strings(struct phy_device *phydev, u8 *data) -+{ -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(at803x_hw_stats); i++) { -+ strscpy(data + i * ETH_GSTRING_LEN, -+ at803x_hw_stats[i].string, ETH_GSTRING_LEN); -+ } -+} -+ -+static u64 at803x_get_stat(struct phy_device *phydev, int i) -+{ -+ struct at803x_hw_stat stat = at803x_hw_stats[i]; -+ struct at803x_priv *priv = phydev->priv; -+ int val; -+ u64 ret; -+ -+ if (stat.access_type == MMD) -+ val = phy_read_mmd(phydev, MDIO_MMD_PCS, stat.reg); -+ else -+ val = phy_read(phydev, stat.reg); -+ -+ if (val < 0) { -+ ret = U64_MAX; -+ } else { -+ val = val & stat.mask; -+ priv->stats[i] += val; -+ ret = priv->stats[i]; -+ } -+ -+ return ret; -+} -+ -+static void at803x_get_stats(struct phy_device *phydev, -+ struct ethtool_stats *stats, u64 *data) -+{ -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(at803x_hw_stats); i++) -+ data[i] = at803x_get_stat(phydev, i); -+} -+ - static int at803x_suspend(struct phy_device *phydev) - { - int value; -@@ -1102,6 +1191,34 @@ static int at803x_cable_test_start(struc - return 0; - } - -+static int qca83xx_config_init(struct phy_device *phydev) -+{ -+ u8 switch_revision; -+ -+ switch_revision = phydev->dev_flags & QCA8K_DEVFLAGS_REVISION_MASK; -+ -+ switch (switch_revision) { -+ case 1: -+ /* For 100M waveform */ -+ at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_0, 0x02ea); -+ /* Turn on Gigabit clock */ -+ at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_3D, 0x68a0); -+ break; -+ -+ case 2: -+ phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0x0); -+ fallthrough; -+ case 4: -+ phy_write_mmd(phydev, MDIO_MMD_PCS, MDIO_AZ_DEBUG, 0x803f); -+ at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_3D, 0x6860); -+ at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_5, 0x2c46); -+ at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_3C, 0x6000); -+ break; -+ } -+ -+ return 0; -+} -+ - static struct phy_driver at803x_driver[] = { - { - /* Qualcomm Atheros AR8035 */ -@@ -1198,7 +1315,20 @@ static struct phy_driver at803x_driver[] - .read_status = at803x_read_status, - .soft_reset = genphy_soft_reset, - .config_aneg = at803x_config_aneg, --} }; -+}, { -+ /* QCA8337 */ -+ .phy_id = QCA8337_PHY_ID, -+ .phy_id_mask = QCA8K_PHY_ID_MASK, -+ .name = "QCA PHY 8337", -+ /* PHY_GBIT_FEATURES */ -+ .probe = at803x_probe, -+ .flags = PHY_IS_INTERNAL, -+ .config_init = qca83xx_config_init, -+ .soft_reset = genphy_soft_reset, -+ .get_sset_count = at803x_get_sset_count, -+ .get_strings = at803x_get_strings, -+ .get_stats = at803x_get_stats, -+}, }; - - module_phy_driver(at803x_driver); - diff --git a/target/linux/generic/backport-5.10/736-v5.14-net-dsa-qca8k-fix-missing-unlock-on-error-in-qca8k-vlan.patch b/target/linux/generic/backport-5.10/736-v5.14-net-dsa-qca8k-fix-missing-unlock-on-error-in-qca8k-vlan.patch deleted file mode 100644 index a68e3b1821..0000000000 --- a/target/linux/generic/backport-5.10/736-v5.14-net-dsa-qca8k-fix-missing-unlock-on-error-in-qca8k-vlan.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 0d56e5c191b197e1d30a0a4c92628836dafced0f Mon Sep 17 00:00:00 2001 -From: Wei Yongjun -Date: Tue, 18 May 2021 11:24:13 +0000 -Subject: [PATCH] net: dsa: qca8k: fix missing unlock on error in - qca8k_vlan_(add|del) - -Add the missing unlock before return from function qca8k_vlan_add() -and qca8k_vlan_del() in the error handling case. - -Fixes: 028f5f8ef44f ("net: dsa: qca8k: handle error with qca8k_read operation") -Reported-by: Hulk Robot -Signed-off-by: Wei Yongjun -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 16 ++++++++++------ - 1 file changed, 10 insertions(+), 6 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -506,8 +506,10 @@ qca8k_vlan_add(struct qca8k_priv *priv, - goto out; - - reg = qca8k_read(priv, QCA8K_REG_VTU_FUNC0); -- if (reg < 0) -- return reg; -+ if (reg < 0) { -+ ret = reg; -+ goto out; -+ } - reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; - reg &= ~(QCA8K_VTU_FUNC0_EG_MODE_MASK << QCA8K_VTU_FUNC0_EG_MODE_S(port)); - if (untagged) -@@ -519,7 +521,7 @@ qca8k_vlan_add(struct qca8k_priv *priv, - - ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); - if (ret) -- return ret; -+ goto out; - ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); - - out: -@@ -541,8 +543,10 @@ qca8k_vlan_del(struct qca8k_priv *priv, - goto out; - - reg = qca8k_read(priv, QCA8K_REG_VTU_FUNC0); -- if (reg < 0) -- return reg; -+ if (reg < 0) { -+ ret = reg; -+ goto out; -+ } - reg &= ~(3 << QCA8K_VTU_FUNC0_EG_MODE_S(port)); - reg |= QCA8K_VTU_FUNC0_EG_MODE_NOT << - QCA8K_VTU_FUNC0_EG_MODE_S(port); -@@ -564,7 +568,7 @@ qca8k_vlan_del(struct qca8k_priv *priv, - } else { - ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); - if (ret) -- return ret; -+ goto out; - ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); - } - diff --git a/target/linux/generic/backport-5.10/737-v5.14-01-net-dsa-qca8k-check-return-value-of-read-functions-c.patch b/target/linux/generic/backport-5.10/737-v5.14-01-net-dsa-qca8k-check-return-value-of-read-functions-c.patch deleted file mode 100644 index 451b0e9446..0000000000 --- a/target/linux/generic/backport-5.10/737-v5.14-01-net-dsa-qca8k-check-return-value-of-read-functions-c.patch +++ /dev/null @@ -1,348 +0,0 @@ -From 7c9896e37807862e276064dd9331860f5d27affc Mon Sep 17 00:00:00 2001 -From: Yang Yingliang -Date: Sat, 29 May 2021 11:04:38 +0800 -Subject: [PATCH] net: dsa: qca8k: check return value of read functions - correctly - -Current return type of qca8k_mii_read32() and qca8k_read() are -unsigned, it can't be negative, so the return value check is -unuseful. For check the return value correctly, change return -type of the read functions and add a output parameter to store -the read value. - -Signed-off-by: Yang Yingliang -Signed-off-by: Jakub Kicinski ---- - drivers/net/dsa/qca8k.c | 130 +++++++++++++++++++--------------------- - 1 file changed, 60 insertions(+), 70 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -89,26 +89,26 @@ qca8k_split_addr(u32 regaddr, u16 *r1, u - *page = regaddr & 0x3ff; - } - --static u32 --qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum) -+static int -+qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) - { -- u32 val; - int ret; - - ret = bus->read(bus, phy_id, regnum); - if (ret >= 0) { -- val = ret; -+ *val = ret; - ret = bus->read(bus, phy_id, regnum + 1); -- val |= ret << 16; -+ *val |= ret << 16; - } - - if (ret < 0) { - dev_err_ratelimited(&bus->dev, - "failed to read qca8k 32bit register\n"); -+ *val = 0; - return ret; - } - -- return val; -+ return 0; - } - - static void -@@ -148,26 +148,26 @@ qca8k_set_page(struct mii_bus *bus, u16 - return 0; - } - --static u32 --qca8k_read(struct qca8k_priv *priv, u32 reg) -+static int -+qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val) - { - struct mii_bus *bus = priv->bus; - u16 r1, r2, page; -- u32 val; -+ int ret; - - qca8k_split_addr(reg, &r1, &r2, &page); - - mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - -- val = qca8k_set_page(bus, page); -- if (val < 0) -+ ret = qca8k_set_page(bus, page); -+ if (ret < 0) - goto exit; - -- val = qca8k_mii_read32(bus, 0x10 | r2, r1); -+ ret = qca8k_mii_read32(bus, 0x10 | r2, r1, val); - - exit: - mutex_unlock(&bus->mdio_lock); -- return val; -+ return ret; - } - - static int -@@ -208,11 +208,9 @@ qca8k_rmw(struct qca8k_priv *priv, u32 r - if (ret < 0) - goto exit; - -- val = qca8k_mii_read32(bus, 0x10 | r2, r1); -- if (val < 0) { -- ret = val; -+ ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); -+ if (ret < 0) - goto exit; -- } - - val &= ~mask; - val |= write_val; -@@ -240,15 +238,8 @@ static int - qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) - { - struct qca8k_priv *priv = (struct qca8k_priv *)ctx; -- int ret; -- -- ret = qca8k_read(priv, reg); -- if (ret < 0) -- return ret; -- -- *val = ret; - -- return 0; -+ return qca8k_read(priv, reg, val); - } - - static int -@@ -296,18 +287,18 @@ static struct regmap_config qca8k_regmap - static int - qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) - { -+ int ret, ret1; - u32 val; -- int ret; - -- ret = read_poll_timeout(qca8k_read, val, !(val & mask), -+ ret = read_poll_timeout(qca8k_read, ret1, !(val & mask), - 0, QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, -- priv, reg); -+ priv, reg, &val); - - /* Check if qca8k_read has failed for a different reason - * before returning -ETIMEDOUT - */ -- if (ret < 0 && val < 0) -- return val; -+ if (ret < 0 && ret1 < 0) -+ return ret1; - - return ret; - } -@@ -316,13 +307,13 @@ static int - qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb) - { - u32 reg[4], val; -- int i; -+ int i, ret; - - /* load the ARL table into an array */ - for (i = 0; i < 4; i++) { -- val = qca8k_read(priv, QCA8K_REG_ATU_DATA0 + (i * 4)); -- if (val < 0) -- return val; -+ ret = qca8k_read(priv, QCA8K_REG_ATU_DATA0 + (i * 4), &val); -+ if (ret < 0) -+ return ret; - - reg[i] = val; - } -@@ -396,9 +387,9 @@ qca8k_fdb_access(struct qca8k_priv *priv - - /* Check for table full violation when adding an entry */ - if (cmd == QCA8K_FDB_LOAD) { -- reg = qca8k_read(priv, QCA8K_REG_ATU_FUNC); -- if (reg < 0) -- return reg; -+ ret = qca8k_read(priv, QCA8K_REG_ATU_FUNC, ®); -+ if (ret < 0) -+ return ret; - if (reg & QCA8K_ATU_FUNC_FULL) - return -1; - } -@@ -477,9 +468,9 @@ qca8k_vlan_access(struct qca8k_priv *pri - - /* Check for table full violation when adding an entry */ - if (cmd == QCA8K_VLAN_LOAD) { -- reg = qca8k_read(priv, QCA8K_REG_VTU_FUNC1); -- if (reg < 0) -- return reg; -+ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC1, ®); -+ if (ret < 0) -+ return ret; - if (reg & QCA8K_VTU_FUNC1_FULL) - return -ENOMEM; - } -@@ -505,11 +496,9 @@ qca8k_vlan_add(struct qca8k_priv *priv, - if (ret < 0) - goto out; - -- reg = qca8k_read(priv, QCA8K_REG_VTU_FUNC0); -- if (reg < 0) { -- ret = reg; -+ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); -+ if (ret < 0) - goto out; -- } - reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; - reg &= ~(QCA8K_VTU_FUNC0_EG_MODE_MASK << QCA8K_VTU_FUNC0_EG_MODE_S(port)); - if (untagged) -@@ -542,11 +531,9 @@ qca8k_vlan_del(struct qca8k_priv *priv, - if (ret < 0) - goto out; - -- reg = qca8k_read(priv, QCA8K_REG_VTU_FUNC0); -- if (reg < 0) { -- ret = reg; -+ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); -+ if (ret < 0) - goto out; -- } - reg &= ~(3 << QCA8K_VTU_FUNC0_EG_MODE_S(port)); - reg |= QCA8K_VTU_FUNC0_EG_MODE_NOT << - QCA8K_VTU_FUNC0_EG_MODE_S(port); -@@ -638,19 +625,19 @@ qca8k_mdio_busy_wait(struct mii_bus *bus - { - u16 r1, r2, page; - u32 val; -- int ret; -+ int ret, ret1; - - qca8k_split_addr(reg, &r1, &r2, &page); - -- ret = read_poll_timeout(qca8k_mii_read32, val, !(val & mask), 0, -+ ret = read_poll_timeout(qca8k_mii_read32, ret1, !(val & mask), 0, - QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, -- bus, 0x10 | r2, r1); -+ bus, 0x10 | r2, r1, &val); - - /* Check if qca8k_read has failed for a different reason - * before returnting -ETIMEDOUT - */ -- if (ret < 0 && val < 0) -- return val; -+ if (ret < 0 && ret1 < 0) -+ return ret1; - - return ret; - } -@@ -725,7 +712,7 @@ qca8k_mdio_read(struct mii_bus *salve_bu - if (ret) - goto exit; - -- val = qca8k_mii_read32(bus, 0x10 | r2, r1); -+ ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); - - exit: - /* even if the busy_wait timeouts try to clear the MASTER_EN */ -@@ -733,10 +720,10 @@ exit: - - mutex_unlock(&bus->mdio_lock); - -- if (val >= 0) -- val &= QCA8K_MDIO_MASTER_DATA_MASK; -+ if (ret >= 0) -+ ret = val & QCA8K_MDIO_MASTER_DATA_MASK; - -- return val; -+ return ret; - } - - static int -@@ -1211,7 +1198,7 @@ qca8k_phylink_mac_config(struct dsa_swit - qca8k_write(priv, reg, QCA8K_PORT_PAD_SGMII_EN); - - /* Enable/disable SerDes auto-negotiation as necessary */ -- val = qca8k_read(priv, QCA8K_REG_PWS); -+ qca8k_read(priv, QCA8K_REG_PWS, &val); - if (phylink_autoneg_inband(mode)) - val &= ~QCA8K_PWS_SERDES_AEN_DIS; - else -@@ -1219,7 +1206,7 @@ qca8k_phylink_mac_config(struct dsa_swit - qca8k_write(priv, QCA8K_REG_PWS, val); - - /* Configure the SGMII parameters */ -- val = qca8k_read(priv, QCA8K_REG_SGMII_CTRL); -+ qca8k_read(priv, QCA8K_REG_SGMII_CTRL, &val); - - val |= QCA8K_SGMII_EN_PLL | QCA8K_SGMII_EN_RX | - QCA8K_SGMII_EN_TX | QCA8K_SGMII_EN_SD; -@@ -1314,10 +1301,11 @@ qca8k_phylink_mac_link_state(struct dsa_ - { - struct qca8k_priv *priv = ds->priv; - u32 reg; -+ int ret; - -- reg = qca8k_read(priv, QCA8K_REG_PORT_STATUS(port)); -- if (reg < 0) -- return reg; -+ ret = qca8k_read(priv, QCA8K_REG_PORT_STATUS(port), ®); -+ if (ret < 0) -+ return ret; - - state->link = !!(reg & QCA8K_PORT_STATUS_LINK_UP); - state->an_complete = state->link; -@@ -1419,19 +1407,20 @@ qca8k_get_ethtool_stats(struct dsa_switc - struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; - const struct qca8k_mib_desc *mib; - u32 reg, i, val; -- u64 hi; -+ u64 hi = 0; -+ int ret; - - for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) { - mib = &ar8327_mib[i]; - reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; - -- val = qca8k_read(priv, reg); -- if (val < 0) -+ ret = qca8k_read(priv, reg, &val); -+ if (ret < 0) - continue; - - if (mib->size == 2) { -- hi = qca8k_read(priv, reg + 4); -- if (hi < 0) -+ ret = qca8k_read(priv, reg + 4, (u32 *)&hi); -+ if (ret < 0) - continue; - } - -@@ -1459,7 +1448,7 @@ qca8k_set_mac_eee(struct dsa_switch *ds, - int ret; - - mutex_lock(&priv->reg_mutex); -- reg = qca8k_read(priv, QCA8K_REG_EEE_CTRL); -+ ret = qca8k_read(priv, QCA8K_REG_EEE_CTRL, ®); - if (reg < 0) { - ret = reg; - goto exit; -@@ -1802,14 +1791,15 @@ static int qca8k_read_switch_id(struct q - const struct qca8k_match_data *data; - u32 val; - u8 id; -+ int ret; - - /* get the switches ID from the compatible */ - data = of_device_get_match_data(priv->dev); - if (!data) - return -ENODEV; - -- val = qca8k_read(priv, QCA8K_REG_MASK_CTRL); -- if (val < 0) -+ ret = qca8k_read(priv, QCA8K_REG_MASK_CTRL, &val); -+ if (ret < 0) - return -ENODEV; - - id = QCA8K_MASK_CTRL_DEVICE_ID(val & QCA8K_MASK_CTRL_DEVICE_ID_MASK); diff --git a/target/linux/generic/backport-5.10/737-v5.14-02-net-dsa-qca8k-add-missing-check-return-value-in-qca8.patch b/target/linux/generic/backport-5.10/737-v5.14-02-net-dsa-qca8k-add-missing-check-return-value-in-qca8.patch deleted file mode 100644 index d20da5b85e..0000000000 --- a/target/linux/generic/backport-5.10/737-v5.14-02-net-dsa-qca8k-add-missing-check-return-value-in-qca8.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 9fe99de01440d9ede74d447ac76e9c445d8daae9 Mon Sep 17 00:00:00 2001 -From: Yang Yingliang -Date: Sat, 29 May 2021 11:04:39 +0800 -Subject: [PATCH] net: dsa: qca8k: add missing check return value in - qca8k_phylink_mac_config() - -Now we can check qca8k_read() return value correctly, so if -it fails, we need return directly. - -Signed-off-by: Yang Yingliang -Signed-off-by: Jakub Kicinski ---- - drivers/net/dsa/qca8k.c | 9 +++++++-- - 1 file changed, 7 insertions(+), 2 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -1128,6 +1128,7 @@ qca8k_phylink_mac_config(struct dsa_swit - { - struct qca8k_priv *priv = ds->priv; - u32 reg, val; -+ int ret; - - switch (port) { - case 0: /* 1st CPU port */ -@@ -1198,7 +1199,9 @@ qca8k_phylink_mac_config(struct dsa_swit - qca8k_write(priv, reg, QCA8K_PORT_PAD_SGMII_EN); - - /* Enable/disable SerDes auto-negotiation as necessary */ -- qca8k_read(priv, QCA8K_REG_PWS, &val); -+ ret = qca8k_read(priv, QCA8K_REG_PWS, &val); -+ if (ret) -+ return; - if (phylink_autoneg_inband(mode)) - val &= ~QCA8K_PWS_SERDES_AEN_DIS; - else -@@ -1206,7 +1209,9 @@ qca8k_phylink_mac_config(struct dsa_swit - qca8k_write(priv, QCA8K_REG_PWS, val); - - /* Configure the SGMII parameters */ -- qca8k_read(priv, QCA8K_REG_SGMII_CTRL, &val); -+ ret = qca8k_read(priv, QCA8K_REG_SGMII_CTRL, &val); -+ if (ret) -+ return; - - val |= QCA8K_SGMII_EN_PLL | QCA8K_SGMII_EN_RX | - QCA8K_SGMII_EN_TX | QCA8K_SGMII_EN_SD; diff --git a/target/linux/generic/backport-5.10/738-v5.14-01-net-dsa-qca8k-fix-an-endian-bug-in-qca8k-get-ethtool.patch b/target/linux/generic/backport-5.10/738-v5.14-01-net-dsa-qca8k-fix-an-endian-bug-in-qca8k-get-ethtool.patch deleted file mode 100644 index aed97d0549..0000000000 --- a/target/linux/generic/backport-5.10/738-v5.14-01-net-dsa-qca8k-fix-an-endian-bug-in-qca8k-get-ethtool.patch +++ /dev/null @@ -1,47 +0,0 @@ -From aa3d020b22cb844ab7bdbb9e5d861a64666e2b74 Mon Sep 17 00:00:00 2001 -From: Dan Carpenter -Date: Wed, 9 Jun 2021 12:52:12 +0300 -Subject: [PATCH] net: dsa: qca8k: fix an endian bug in - qca8k_get_ethtool_stats() - -The "hi" variable is a u64 but the qca8k_read() writes to the top 32 -bits of it. That will work on little endian systems but it's a bit -subtle. It's cleaner to make declare "hi" as a u32. We will still need -to cast it when we shift it later on in the function but that's fine. - -Fixes: 7c9896e37807 ("net: dsa: qca8k: check return value of read functions correctly") -Signed-off-by: Dan Carpenter -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -1412,7 +1412,7 @@ qca8k_get_ethtool_stats(struct dsa_switc - struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; - const struct qca8k_mib_desc *mib; - u32 reg, i, val; -- u64 hi = 0; -+ u32 hi = 0; - int ret; - - for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) { -@@ -1424,14 +1424,14 @@ qca8k_get_ethtool_stats(struct dsa_switc - continue; - - if (mib->size == 2) { -- ret = qca8k_read(priv, reg + 4, (u32 *)&hi); -+ ret = qca8k_read(priv, reg + 4, &hi); - if (ret < 0) - continue; - } - - data[i] = val; - if (mib->size == 2) -- data[i] |= hi << 32; -+ data[i] |= (u64)hi << 32; - } - } - diff --git a/target/linux/generic/backport-5.10/738-v5.14-02-net-dsa-qca8k-check-the-correct-variable-in-qca8k-se.patch b/target/linux/generic/backport-5.10/738-v5.14-02-net-dsa-qca8k-check-the-correct-variable-in-qca8k-se.patch deleted file mode 100644 index c58f79cd8b..0000000000 --- a/target/linux/generic/backport-5.10/738-v5.14-02-net-dsa-qca8k-check-the-correct-variable-in-qca8k-se.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 3d0167f2a627528032821cdeb78b4eab0510460f Mon Sep 17 00:00:00 2001 -From: Dan Carpenter -Date: Wed, 9 Jun 2021 12:53:03 +0300 -Subject: [PATCH] net: dsa: qca8k: check the correct variable in - qca8k_set_mac_eee() - -This code check "reg" but "ret" was intended so the error handling will -never trigger. - -Fixes: 7c9896e37807 ("net: dsa: qca8k: check return value of read functions correctly") -Signed-off-by: Dan Carpenter -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -1454,10 +1454,8 @@ qca8k_set_mac_eee(struct dsa_switch *ds, - - mutex_lock(&priv->reg_mutex); - ret = qca8k_read(priv, QCA8K_REG_EEE_CTRL, ®); -- if (reg < 0) { -- ret = reg; -+ if (ret < 0) - goto exit; -- } - - if (eee->eee_enabled) - reg |= lpi_en; diff --git a/target/linux/generic/backport-5.10/739-v5.15-net-dsa-qca8k-fix-kernel-panic-with-legacy-mdio-mapping.patch b/target/linux/generic/backport-5.10/739-v5.15-net-dsa-qca8k-fix-kernel-panic-with-legacy-mdio-mapping.patch deleted file mode 100644 index 1e293d3a0b..0000000000 --- a/target/linux/generic/backport-5.10/739-v5.15-net-dsa-qca8k-fix-kernel-panic-with-legacy-mdio-mapping.patch +++ /dev/null @@ -1,80 +0,0 @@ -From ce062a0adbfe933b1932235fdfd874c4c91d1bb0 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Sat, 11 Sep 2021 17:50:09 +0200 -Subject: net: dsa: qca8k: fix kernel panic with legacy mdio mapping - -When the mdio legacy mapping is used the mii_bus priv registered by DSA -refer to the dsa switch struct instead of the qca8k_priv struct and -causes a kernel panic. Create dedicated function when the internal -dedicated mdio driver is used to properly handle the 2 different -implementation. - -Fixes: 759bafb8a322 ("net: dsa: qca8k: add support for internal phy and internal mdio") -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 30 ++++++++++++++++++++++-------- - 1 file changed, 22 insertions(+), 8 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -643,10 +643,8 @@ qca8k_mdio_busy_wait(struct mii_bus *bus - } - - static int --qca8k_mdio_write(struct mii_bus *salve_bus, int phy, int regnum, u16 data) -+qca8k_mdio_write(struct mii_bus *bus, int phy, int regnum, u16 data) - { -- struct qca8k_priv *priv = salve_bus->priv; -- struct mii_bus *bus = priv->bus; - u16 r1, r2, page; - u32 val; - int ret; -@@ -682,10 +680,8 @@ exit: - } - - static int --qca8k_mdio_read(struct mii_bus *salve_bus, int phy, int regnum) -+qca8k_mdio_read(struct mii_bus *bus, int phy, int regnum) - { -- struct qca8k_priv *priv = salve_bus->priv; -- struct mii_bus *bus = priv->bus; - u16 r1, r2, page; - u32 val; - int ret; -@@ -727,6 +723,24 @@ exit: - } - - static int -+qca8k_internal_mdio_write(struct mii_bus *slave_bus, int phy, int regnum, u16 data) -+{ -+ struct qca8k_priv *priv = slave_bus->priv; -+ struct mii_bus *bus = priv->bus; -+ -+ return qca8k_mdio_write(bus, phy, regnum, data); -+} -+ -+static int -+qca8k_internal_mdio_read(struct mii_bus *slave_bus, int phy, int regnum) -+{ -+ struct qca8k_priv *priv = slave_bus->priv; -+ struct mii_bus *bus = priv->bus; -+ -+ return qca8k_mdio_read(bus, phy, regnum); -+} -+ -+static int - qca8k_phy_write(struct dsa_switch *ds, int port, int regnum, u16 data) - { - struct qca8k_priv *priv = ds->priv; -@@ -775,8 +789,8 @@ qca8k_mdio_register(struct qca8k_priv *p - - bus->priv = (void *)priv; - bus->name = "qca8k slave mii"; -- bus->read = qca8k_mdio_read; -- bus->write = qca8k_mdio_write; -+ bus->read = qca8k_internal_mdio_read; -+ bus->write = qca8k_internal_mdio_write; - snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d", - ds->index); - diff --git a/target/linux/generic/backport-5.10/740-v5.13-0001-net-dsa-b53-Add-debug-prints-in-b53_vlan_enable.patch b/target/linux/generic/backport-5.10/740-v5.13-0001-net-dsa-b53-Add-debug-prints-in-b53_vlan_enable.patch deleted file mode 100644 index 91cf55b18a..0000000000 --- a/target/linux/generic/backport-5.10/740-v5.13-0001-net-dsa-b53-Add-debug-prints-in-b53_vlan_enable.patch +++ /dev/null @@ -1,65 +0,0 @@ -From ee47ed08d75e8f16b3cf882061ee19c2ea19dd6c Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -Date: Wed, 10 Mar 2021 10:52:26 -0800 -Subject: [PATCH] net: dsa: b53: Add debug prints in b53_vlan_enable() - -Having dynamic debug prints in b53_vlan_enable() has been helpful to -uncover a recent but update the function to indicate the port being -configured (or -1 for initial setup) and include the global VLAN enabled -and VLAN filtering enable status. - -Signed-off-by: Florian Fainelli -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/dsa/b53/b53_common.c | 11 +++++++---- - 1 file changed, 7 insertions(+), 4 deletions(-) - ---- a/drivers/net/dsa/b53/b53_common.c -+++ b/drivers/net/dsa/b53/b53_common.c -@@ -349,7 +349,7 @@ static void b53_set_forwarding(struct b5 - b53_write8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, mgmt); - } - --static void b53_enable_vlan(struct b53_device *dev, bool enable, -+static void b53_enable_vlan(struct b53_device *dev, int port, bool enable, - bool enable_filtering) - { - u8 mgmt, vc0, vc1, vc4 = 0, vc5; -@@ -431,6 +431,9 @@ static void b53_enable_vlan(struct b53_d - b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, mgmt); - - dev->vlan_enabled = enable; -+ -+ dev_dbg(dev->dev, "Port %d VLAN enabled: %d, filtering: %d\n", -+ port, enable, enable_filtering); - } - - static int b53_set_jumbo(struct b53_device *dev, bool enable, bool allow_10_100) -@@ -708,7 +711,7 @@ int b53_configure_vlan(struct dsa_switch - b53_do_vlan_op(dev, VTA_CMD_CLEAR); - } - -- b53_enable_vlan(dev, dev->vlan_enabled, ds->vlan_filtering); -+ b53_enable_vlan(dev, -1, dev->vlan_enabled, ds->vlan_filtering); - - b53_for_each_port(dev, i) - b53_write16(dev, B53_VLAN_PAGE, -@@ -1390,7 +1393,7 @@ int b53_vlan_filtering(struct dsa_switch - if (switchdev_trans_ph_prepare(trans)) - return 0; - -- b53_enable_vlan(dev, dev->vlan_enabled, vlan_filtering); -+ b53_enable_vlan(dev, port, dev->vlan_enabled, vlan_filtering); - - return 0; - } -@@ -1415,7 +1418,7 @@ int b53_vlan_prepare(struct dsa_switch * - if (vlan->vid_end >= dev->num_vlans) - return -ERANGE; - -- b53_enable_vlan(dev, true, ds->vlan_filtering); -+ b53_enable_vlan(dev, port, true, ds->vlan_filtering); - - return 0; - } diff --git a/target/linux/generic/backport-5.10/740-v5.13-0002-net-dsa-b53-spi-allow-device-tree-probing.patch b/target/linux/generic/backport-5.10/740-v5.13-0002-net-dsa-b53-spi-allow-device-tree-probing.patch deleted file mode 100644 index 56579b2d36..0000000000 --- a/target/linux/generic/backport-5.10/740-v5.13-0002-net-dsa-b53-spi-allow-device-tree-probing.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 6d16eadab6db0c1d61e59fee7ed1ecc2d10269be Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= -Date: Mon, 15 Mar 2021 15:14:23 +0100 -Subject: [PATCH] net: dsa: b53: spi: allow device tree probing -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Add missing of_match_table to allow device tree probing. - -Signed-off-by: Álvaro Fernández Rojas -Signed-off-by: David S. Miller ---- - drivers/net/dsa/b53/b53_spi.c | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - ---- a/drivers/net/dsa/b53/b53_spi.c -+++ b/drivers/net/dsa/b53/b53_spi.c -@@ -324,9 +324,22 @@ static int b53_spi_remove(struct spi_dev - return 0; - } - -+static const struct of_device_id b53_spi_of_match[] = { -+ { .compatible = "brcm,bcm5325" }, -+ { .compatible = "brcm,bcm5365" }, -+ { .compatible = "brcm,bcm5395" }, -+ { .compatible = "brcm,bcm5397" }, -+ { .compatible = "brcm,bcm5398" }, -+ { .compatible = "brcm,bcm53115" }, -+ { .compatible = "brcm,bcm53125" }, -+ { .compatible = "brcm,bcm53128" }, -+ { /* sentinel */ } -+}; -+ - static struct spi_driver b53_spi_driver = { - .driver = { - .name = "b53-switch", -+ .of_match_table = b53_spi_of_match, - }, - .probe = b53_spi_probe, - .remove = b53_spi_remove, diff --git a/target/linux/generic/backport-5.10/740-v5.13-0003-net-dsa-b53-relax-is63xx-condition.patch b/target/linux/generic/backport-5.10/740-v5.13-0003-net-dsa-b53-relax-is63xx-condition.patch deleted file mode 100644 index 99eced1b6a..0000000000 --- a/target/linux/generic/backport-5.10/740-v5.13-0003-net-dsa-b53-relax-is63xx-condition.patch +++ /dev/null @@ -1,31 +0,0 @@ -From ad426d7d966b525b73ed5a1842dd830312bbba71 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= -Date: Wed, 17 Mar 2021 09:42:01 +0100 -Subject: [PATCH] net: dsa: b53: relax is63xx() condition -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -BCM63xx switches are present on bcm63xx and bmips devices. - -Signed-off-by: Álvaro Fernández Rojas -Acked-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - drivers/net/dsa/b53/b53_priv.h | 4 ---- - 1 file changed, 4 deletions(-) - ---- a/drivers/net/dsa/b53/b53_priv.h -+++ b/drivers/net/dsa/b53/b53_priv.h -@@ -186,11 +186,7 @@ static inline int is531x5(struct b53_dev - - static inline int is63xx(struct b53_device *dev) - { --#ifdef CONFIG_BCM63XX - return dev->chip_id == BCM63XX_DEVICE_ID; --#else -- return 0; --#endif - } - - static inline int is5301x(struct b53_device *dev) diff --git a/target/linux/generic/backport-5.10/740-v5.13-0004-net-dsa-tag_brcm-add-support-for-legacy-tags.patch b/target/linux/generic/backport-5.10/740-v5.13-0004-net-dsa-tag_brcm-add-support-for-legacy-tags.patch deleted file mode 100644 index 3b7d8f37cd..0000000000 --- a/target/linux/generic/backport-5.10/740-v5.13-0004-net-dsa-tag_brcm-add-support-for-legacy-tags.patch +++ /dev/null @@ -1,180 +0,0 @@ -From 964dbf186eaa84d409c359ddf09c827a3fbe8228 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= -Date: Wed, 17 Mar 2021 11:29:26 +0100 -Subject: [PATCH] net: dsa: tag_brcm: add support for legacy tags -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Add support for legacy Broadcom tags, which are similar to DSA_TAG_PROTO_BRCM. -These tags are used on BCM5325, BCM5365 and BCM63xx switches. - -Signed-off-by: Álvaro Fernández Rojas -Signed-off-by: David S. Miller ---- - include/net/dsa.h | 2 + - net/dsa/Kconfig | 7 +++ - net/dsa/tag_brcm.c | 107 +++++++++++++++++++++++++++++++++++++++++++-- - 3 files changed, 113 insertions(+), 3 deletions(-) - ---- a/include/net/dsa.h -+++ b/include/net/dsa.h -@@ -45,10 +45,12 @@ struct phylink_link_state; - #define DSA_TAG_PROTO_OCELOT_VALUE 15 - #define DSA_TAG_PROTO_AR9331_VALUE 16 - #define DSA_TAG_PROTO_RTL4_A_VALUE 17 -+#define DSA_TAG_PROTO_BRCM_LEGACY_VALUE 22 - - enum dsa_tag_protocol { - DSA_TAG_PROTO_NONE = DSA_TAG_PROTO_NONE_VALUE, - DSA_TAG_PROTO_BRCM = DSA_TAG_PROTO_BRCM_VALUE, -+ DSA_TAG_PROTO_BRCM_LEGACY = DSA_TAG_PROTO_BRCM_LEGACY_VALUE, - DSA_TAG_PROTO_BRCM_PREPEND = DSA_TAG_PROTO_BRCM_PREPEND_VALUE, - DSA_TAG_PROTO_DSA = DSA_TAG_PROTO_DSA_VALUE, - DSA_TAG_PROTO_EDSA = DSA_TAG_PROTO_EDSA_VALUE, ---- a/net/dsa/Kconfig -+++ b/net/dsa/Kconfig -@@ -47,6 +47,13 @@ config NET_DSA_TAG_BRCM - Say Y if you want to enable support for tagging frames for the - Broadcom switches which place the tag after the MAC source address. - -+config NET_DSA_TAG_BRCM_LEGACY -+ tristate "Tag driver for Broadcom legacy switches using in-frame headers" -+ select NET_DSA_TAG_BRCM_COMMON -+ help -+ Say Y if you want to enable support for tagging frames for the -+ Broadcom legacy switches which place the tag after the MAC source -+ address. - - config NET_DSA_TAG_BRCM_PREPEND - tristate "Tag driver for Broadcom switches using prepended headers" ---- a/net/dsa/tag_brcm.c -+++ b/net/dsa/tag_brcm.c -@@ -11,9 +11,26 @@ - - #include "dsa_priv.h" - --/* This tag length is 4 bytes, older ones were 6 bytes, we do not -- * handle them -- */ -+/* Legacy Broadcom tag (6 bytes) */ -+#define BRCM_LEG_TAG_LEN 6 -+ -+/* Type fields */ -+/* 1st byte in the tag */ -+#define BRCM_LEG_TYPE_HI 0x88 -+/* 2nd byte in the tag */ -+#define BRCM_LEG_TYPE_LO 0x74 -+ -+/* Tag fields */ -+/* 3rd byte in the tag */ -+#define BRCM_LEG_UNICAST (0 << 5) -+#define BRCM_LEG_MULTICAST (1 << 5) -+#define BRCM_LEG_EGRESS (2 << 5) -+#define BRCM_LEG_INGRESS (3 << 5) -+ -+/* 6th byte in the tag */ -+#define BRCM_LEG_PORT_ID (0xf) -+ -+/* Newer Broadcom tag (4 bytes) */ - #define BRCM_TAG_LEN 4 - - /* Tag is constructed and desconstructed using byte by byte access -@@ -194,6 +211,87 @@ DSA_TAG_DRIVER(brcm_netdev_ops); - MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM); - #endif - -+#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY) -+static struct sk_buff *brcm_leg_tag_xmit(struct sk_buff *skb, -+ struct net_device *dev) -+{ -+ struct dsa_port *dp = dsa_slave_to_port(dev); -+ u8 *brcm_tag; -+ -+ /* The Ethernet switch we are interfaced with needs packets to be at -+ * least 64 bytes (including FCS) otherwise they will be discarded when -+ * they enter the switch port logic. When Broadcom tags are enabled, we -+ * need to make sure that packets are at least 70 bytes -+ * (including FCS and tag) because the length verification is done after -+ * the Broadcom tag is stripped off the ingress packet. -+ * -+ * Let dsa_slave_xmit() free the SKB -+ */ -+ if (__skb_put_padto(skb, ETH_ZLEN + BRCM_LEG_TAG_LEN, false)) -+ return NULL; -+ -+ skb_push(skb, BRCM_LEG_TAG_LEN); -+ -+ memmove(skb->data, skb->data + BRCM_LEG_TAG_LEN, 2 * ETH_ALEN); -+ -+ brcm_tag = skb->data + 2 * ETH_ALEN; -+ -+ /* Broadcom tag type */ -+ brcm_tag[0] = BRCM_LEG_TYPE_HI; -+ brcm_tag[1] = BRCM_LEG_TYPE_LO; -+ -+ /* Broadcom tag value */ -+ brcm_tag[2] = BRCM_LEG_EGRESS; -+ brcm_tag[3] = 0; -+ brcm_tag[4] = 0; -+ brcm_tag[5] = dp->index & BRCM_LEG_PORT_ID; -+ -+ return skb; -+} -+ -+static struct sk_buff *brcm_leg_tag_rcv(struct sk_buff *skb, -+ struct net_device *dev, -+ struct packet_type *pt) -+{ -+ int source_port; -+ u8 *brcm_tag; -+ -+ if (unlikely(!pskb_may_pull(skb, BRCM_LEG_PORT_ID))) -+ return NULL; -+ -+ brcm_tag = skb->data - 2; -+ -+ source_port = brcm_tag[5] & BRCM_LEG_PORT_ID; -+ -+ skb->dev = dsa_master_find_slave(dev, 0, source_port); -+ if (!skb->dev) -+ return NULL; -+ -+ /* Remove Broadcom tag and update checksum */ -+ skb_pull_rcsum(skb, BRCM_LEG_TAG_LEN); -+ -+ skb->offload_fwd_mark = 1; -+ -+ /* Move the Ethernet DA and SA */ -+ memmove(skb->data - ETH_HLEN, -+ skb->data - ETH_HLEN - BRCM_LEG_TAG_LEN, -+ 2 * ETH_ALEN); -+ -+ return skb; -+} -+ -+static const struct dsa_device_ops brcm_legacy_netdev_ops = { -+ .name = "brcm-legacy", -+ .proto = DSA_TAG_PROTO_BRCM_LEGACY, -+ .xmit = brcm_leg_tag_xmit, -+ .rcv = brcm_leg_tag_rcv, -+ .overhead = BRCM_LEG_TAG_LEN, -+}; -+ -+DSA_TAG_DRIVER(brcm_legacy_netdev_ops); -+MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM_LEGACY); -+#endif /* CONFIG_NET_DSA_TAG_BRCM_LEGACY */ -+ - #if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_PREPEND) - static struct sk_buff *brcm_tag_xmit_prepend(struct sk_buff *skb, - struct net_device *dev) -@@ -226,6 +324,9 @@ static struct dsa_tag_driver *dsa_tag_dr - #if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM) - &DSA_TAG_DRIVER_NAME(brcm_netdev_ops), - #endif -+#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY) -+ &DSA_TAG_DRIVER_NAME(brcm_legacy_netdev_ops), -+#endif - #if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_PREPEND) - &DSA_TAG_DRIVER_NAME(brcm_prepend_netdev_ops), - #endif diff --git a/target/linux/generic/backport-5.10/740-v5.13-0005-net-dsa-b53-support-legacy-tags.patch b/target/linux/generic/backport-5.10/740-v5.13-0005-net-dsa-b53-support-legacy-tags.patch deleted file mode 100644 index 838e78a057..0000000000 --- a/target/linux/generic/backport-5.10/740-v5.13-0005-net-dsa-b53-support-legacy-tags.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 46c5176c586c81306bf9e7024c13b95da775490f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= -Date: Wed, 17 Mar 2021 11:29:27 +0100 -Subject: [PATCH] net: dsa: b53: support legacy tags -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -These tags are used on BCM5325, BCM5365 and BCM63xx switches. - -Signed-off-by: Álvaro Fernández Rojas -Acked-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - drivers/net/dsa/b53/Kconfig | 1 + - drivers/net/dsa/b53/b53_common.c | 12 +++++++----- - 2 files changed, 8 insertions(+), 5 deletions(-) - ---- a/drivers/net/dsa/b53/Kconfig -+++ b/drivers/net/dsa/b53/Kconfig -@@ -3,6 +3,7 @@ menuconfig B53 - tristate "Broadcom BCM53xx managed switch support" - depends on NET_DSA - select NET_DSA_TAG_BRCM -+ select NET_DSA_TAG_BRCM_LEGACY - select NET_DSA_TAG_BRCM_PREPEND - help - This driver adds support for Broadcom managed switch chips. It supports ---- a/drivers/net/dsa/b53/b53_common.c -+++ b/drivers/net/dsa/b53/b53_common.c -@@ -2024,15 +2024,17 @@ enum dsa_tag_protocol b53_get_tag_protoc - { - struct b53_device *dev = ds->priv; - -- /* Older models (5325, 5365) support a different tag format that we do -- * not support in net/dsa/tag_brcm.c yet. -- */ -- if (is5325(dev) || is5365(dev) || -- !b53_can_enable_brcm_tags(ds, port, mprot)) { -+ if (!b53_can_enable_brcm_tags(ds, port, mprot)) { - dev->tag_protocol = DSA_TAG_PROTO_NONE; - goto out; - } - -+ /* Older models require a different 6 byte tag */ -+ if (is5325(dev) || is5365(dev) || is63xx(dev)) { -+ dev->tag_protocol = DSA_TAG_PROTO_BRCM_LEGACY; -+ goto out; -+ } -+ - /* Broadcom BCM58xx chips have a flow accelerator on Port 8 - * which requires us to use the prepended Broadcom tag type - */ diff --git a/target/linux/generic/backport-5.10/740-v5.13-0006-net-dsa-b53-mmap-Add-device-tree-support.patch b/target/linux/generic/backport-5.10/740-v5.13-0006-net-dsa-b53-mmap-Add-device-tree-support.patch deleted file mode 100644 index 48494d13e4..0000000000 --- a/target/linux/generic/backport-5.10/740-v5.13-0006-net-dsa-b53-mmap-Add-device-tree-support.patch +++ /dev/null @@ -1,92 +0,0 @@ -From a5538a777b73b35750ed1ffff8c1ef539e861624 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= -Date: Wed, 17 Mar 2021 10:23:17 +0100 -Subject: [PATCH] net: dsa: b53: mmap: Add device tree support -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Add device tree support to b53_mmap.c while keeping platform devices support. - -Signed-off-by: Álvaro Fernández Rojas -Signed-off-by: David S. Miller ---- - drivers/net/dsa/b53/b53_mmap.c | 55 ++++++++++++++++++++++++++++++++++ - 1 file changed, 55 insertions(+) - ---- a/drivers/net/dsa/b53/b53_mmap.c -+++ b/drivers/net/dsa/b53/b53_mmap.c -@@ -16,6 +16,7 @@ - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -+#include - #include - #include - #include -@@ -242,11 +243,65 @@ static const struct b53_io_ops b53_mmap_ - .phy_write16 = b53_mmap_phy_write16, - }; - -+static int b53_mmap_probe_of(struct platform_device *pdev, -+ struct b53_platform_data **ppdata) -+{ -+ struct device_node *np = pdev->dev.of_node; -+ struct device_node *of_ports, *of_port; -+ struct device *dev = &pdev->dev; -+ struct b53_platform_data *pdata; -+ void __iomem *mem; -+ -+ mem = devm_platform_ioremap_resource(pdev, 0); -+ if (IS_ERR(mem)) -+ return PTR_ERR(mem); -+ -+ pdata = devm_kzalloc(dev, sizeof(struct b53_platform_data), -+ GFP_KERNEL); -+ if (!pdata) -+ return -ENOMEM; -+ -+ pdata->regs = mem; -+ pdata->chip_id = BCM63XX_DEVICE_ID; -+ pdata->big_endian = of_property_read_bool(np, "big-endian"); -+ -+ of_ports = of_get_child_by_name(np, "ports"); -+ if (!of_ports) { -+ dev_err(dev, "no ports child node found\n"); -+ return -EINVAL; -+ } -+ -+ for_each_available_child_of_node(of_ports, of_port) { -+ u32 reg; -+ -+ if (of_property_read_u32(of_port, "reg", ®)) -+ continue; -+ -+ if (reg < B53_CPU_PORT) -+ pdata->enabled_ports |= BIT(reg); -+ } -+ -+ of_node_put(of_ports); -+ *ppdata = pdata; -+ -+ return 0; -+} -+ - static int b53_mmap_probe(struct platform_device *pdev) - { -+ struct device_node *np = pdev->dev.of_node; - struct b53_platform_data *pdata = pdev->dev.platform_data; - struct b53_mmap_priv *priv; - struct b53_device *dev; -+ int ret; -+ -+ if (!pdata && np) { -+ ret = b53_mmap_probe_of(pdev, &pdata); -+ if (ret) { -+ dev_err(&pdev->dev, "OF probe error\n"); -+ return ret; -+ } -+ } - - if (!pdata) - return -EINVAL; diff --git a/target/linux/generic/backport-5.10/740-v5.13-0007-net-dsa-b53-spi-add-missing-MODULE_DEVICE_TABLE.patch b/target/linux/generic/backport-5.10/740-v5.13-0007-net-dsa-b53-spi-add-missing-MODULE_DEVICE_TABLE.patch deleted file mode 100644 index ea36755732..0000000000 --- a/target/linux/generic/backport-5.10/740-v5.13-0007-net-dsa-b53-spi-add-missing-MODULE_DEVICE_TABLE.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 866f1577ba69bde2b9f36c300f603596c7d84a62 Mon Sep 17 00:00:00 2001 -From: Qinglang Miao -Date: Thu, 25 Mar 2021 17:19:54 +0800 -Subject: [PATCH] net: dsa: b53: spi: add missing MODULE_DEVICE_TABLE - -This patch adds missing MODULE_DEVICE_TABLE definition which generates -correct modalias for automatic loading of this driver when it is built -as an external module. - -Reported-by: Hulk Robot -Signed-off-by: Qinglang Miao -Acked-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - drivers/net/dsa/b53/b53_spi.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/net/dsa/b53/b53_spi.c -+++ b/drivers/net/dsa/b53/b53_spi.c -@@ -335,6 +335,7 @@ static const struct of_device_id b53_spi - { .compatible = "brcm,bcm53128" }, - { /* sentinel */ } - }; -+MODULE_DEVICE_TABLE(of, b53_spi_of_match); - - static struct spi_driver b53_spi_driver = { - .driver = { diff --git a/target/linux/generic/backport-5.10/741-v5.14-0001-net-dsa-b53-Do-not-force-CPU-to-be-always-tagged.patch b/target/linux/generic/backport-5.10/741-v5.14-0001-net-dsa-b53-Do-not-force-CPU-to-be-always-tagged.patch deleted file mode 100644 index 2a8def39b8..0000000000 --- a/target/linux/generic/backport-5.10/741-v5.14-0001-net-dsa-b53-Do-not-force-CPU-to-be-always-tagged.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 2c32a3d3c233b855943677609fe388f82b1f0975 Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -Date: Tue, 8 Jun 2021 14:22:04 -0700 -Subject: [PATCH] net: dsa: b53: Do not force CPU to be always tagged - -Commit ca8931948344 ("net: dsa: b53: Keep CPU port as tagged in all -VLANs") forced the CPU port to be always tagged in any VLAN membership. -This was necessary back then because we did not support Broadcom tags -for all configurations so the only way to differentiate tagged and -untagged traffic while DSA_TAG_PROTO_NONE was used was to force the CPU -port into being always tagged. - -With most configurations enabling Broadcom tags, especially after -8fab459e69ab ("net: dsa: b53: Enable Broadcom tags for 531x5/539x -families") we do not need to apply this unconditional force tagging of -the CPU port in all VLANs. - -A helper function is introduced to faciliate the encapsulation of the -specific condition requiring the CPU port to be tagged in all VLANs and -the dsa_switch_ops::untag_bridge_pvid boolean is moved to when -dsa_switch_ops::setup is called when we have already determined the -tagging protocol we will be using. - -Reported-by: Matthew Hagan -Signed-off-by: Florian Fainelli -Reviewed-by: Vladimir Oltean -Tested-by: Matthew Hagan -Signed-off-by: David S. Miller ---- - drivers/net/dsa/b53/b53_common.c | 17 ++++++++++++++--- - 1 file changed, 14 insertions(+), 3 deletions(-) - ---- a/drivers/net/dsa/b53/b53_common.c -+++ b/drivers/net/dsa/b53/b53_common.c -@@ -1049,6 +1049,11 @@ static int b53_setup(struct dsa_switch * - unsigned int port; - int ret; - -+ /* Request bridge PVID untagged when DSA_TAG_PROTO_NONE is set -+ * which forces the CPU port to be tagged in all VLANs. -+ */ -+ ds->untag_bridge_pvid = dev->tag_protocol == DSA_TAG_PROTO_NONE; -+ - ret = b53_reset_switch(dev); - if (ret) { - dev_err(ds->dev, "failed to reset switch\n"); -@@ -1423,6 +1428,13 @@ int b53_vlan_prepare(struct dsa_switch * - return 0; - } - EXPORT_SYMBOL(b53_vlan_prepare); -+ -+static bool b53_vlan_port_needs_forced_tagged(struct dsa_switch *ds, int port) -+{ -+ struct b53_device *dev = ds->priv; -+ -+ return dev->tag_protocol == DSA_TAG_PROTO_NONE && dsa_is_cpu_port(ds, port); -+} - - void b53_vlan_add(struct dsa_switch *ds, int port, - const struct switchdev_obj_port_vlan *vlan) -@@ -1442,7 +1454,7 @@ void b53_vlan_add(struct dsa_switch *ds, - untagged = true; - - vl->members |= BIT(port); -- if (untagged && !dsa_is_cpu_port(ds, port)) -+ if (untagged && !b53_vlan_port_needs_forced_tagged(ds, port)) - vl->untag |= BIT(port); - else - vl->untag &= ~BIT(port); -@@ -1480,7 +1492,7 @@ int b53_vlan_del(struct dsa_switch *ds, - if (pvid == vid) - pvid = b53_default_pvid(dev); - -- if (untagged && !dsa_is_cpu_port(ds, port)) -+ if (untagged && !b53_vlan_port_needs_forced_tagged(ds, port)) - vl->untag &= ~(BIT(port)); - - b53_set_vlan_entry(dev, vid, vl); -@@ -2644,7 +2656,6 @@ struct b53_device *b53_switch_alloc(stru - dev->ops = ops; - ds->ops = &b53_switch_ops; - ds->configure_vlan_while_not_filtering = true; -- ds->untag_bridge_pvid = true; - dev->vlan_enabled = ds->configure_vlan_while_not_filtering; - /* Let DSA handle the case were multiple bridges span the same switch - * device and different VLAN awareness settings are requested, which diff --git a/target/linux/generic/backport-5.10/741-v5.14-0002-net-dsa-b53-remove-redundant-null-check-on-dev.patch b/target/linux/generic/backport-5.10/741-v5.14-0002-net-dsa-b53-remove-redundant-null-check-on-dev.patch deleted file mode 100644 index ee3a71ffa5..0000000000 --- a/target/linux/generic/backport-5.10/741-v5.14-0002-net-dsa-b53-remove-redundant-null-check-on-dev.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 11b57faf951cd3a570e3d9e463fc7c41023bc8c6 Mon Sep 17 00:00:00 2001 -From: Colin Ian King -Date: Tue, 15 Jun 2021 10:05:16 +0100 -Subject: [PATCH] net: dsa: b53: remove redundant null check on dev - -The pointer dev can never be null, the null check is redundant -and can be removed. Cleans up a static analysis warning that -pointer priv is dereferencing dev before dev is being null -checked. - -Addresses-Coverity: ("Dereference before null check") -Signed-off-by: Colin Ian King -Acked-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - drivers/net/dsa/b53/b53_srab.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - ---- a/drivers/net/dsa/b53/b53_srab.c -+++ b/drivers/net/dsa/b53/b53_srab.c -@@ -632,8 +632,7 @@ static int b53_srab_remove(struct platfo - struct b53_srab_priv *priv = dev->priv; - - b53_srab_intr_set(priv, false); -- if (dev) -- b53_switch_remove(dev); -+ b53_switch_remove(dev); - - return 0; - } diff --git a/target/linux/generic/backport-5.10/741-v5.14-0003-net-dsa-b53-Create-default-VLAN-entry-explicitly.patch b/target/linux/generic/backport-5.10/741-v5.14-0003-net-dsa-b53-Create-default-VLAN-entry-explicitly.patch deleted file mode 100644 index df891d68ab..0000000000 --- a/target/linux/generic/backport-5.10/741-v5.14-0003-net-dsa-b53-Create-default-VLAN-entry-explicitly.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 64a81b24487f0d2fba0f033029eec2abc7d82cee Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -Date: Mon, 21 Jun 2021 15:10:55 -0700 -Subject: [PATCH] net: dsa: b53: Create default VLAN entry explicitly - -In case CONFIG_VLAN_8021Q is not set, there will be no call down to the -b53 driver to ensure that the default PVID VLAN entry will be configured -with the appropriate untagged attribute towards the CPU port. We were -implicitly relying on dsa_slave_vlan_rx_add_vid() to do that for us, -instead make it explicit. - -Reported-by: Vladimir Oltean -Signed-off-by: Florian Fainelli -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller ---- - drivers/net/dsa/b53/b53_common.c | 27 +++++++++++++++++++-------- - 1 file changed, 19 insertions(+), 8 deletions(-) - ---- a/drivers/net/dsa/b53/b53_common.c -+++ b/drivers/net/dsa/b53/b53_common.c -@@ -693,6 +693,13 @@ static u16 b53_default_pvid(struct b53_d - return 0; - } - -+static bool b53_vlan_port_needs_forced_tagged(struct dsa_switch *ds, int port) -+{ -+ struct b53_device *dev = ds->priv; -+ -+ return dev->tag_protocol == DSA_TAG_PROTO_NONE && dsa_is_cpu_port(ds, port); -+} -+ - int b53_configure_vlan(struct dsa_switch *ds) - { - struct b53_device *dev = ds->priv; -@@ -713,9 +720,20 @@ int b53_configure_vlan(struct dsa_switch - - b53_enable_vlan(dev, -1, dev->vlan_enabled, ds->vlan_filtering); - -- b53_for_each_port(dev, i) -+ /* Create an untagged VLAN entry for the default PVID in case -+ * CONFIG_VLAN_8021Q is disabled and there are no calls to -+ * dsa_slave_vlan_rx_add_vid() to create the default VLAN -+ * entry. Do this only when the tagging protocol is not -+ * DSA_TAG_PROTO_NONE -+ */ -+ b53_for_each_port(dev, i) { -+ v = &dev->vlans[def_vid]; -+ v->members |= BIT(i); -+ if (!b53_vlan_port_needs_forced_tagged(ds, i)) -+ v->untag = v->members; - b53_write16(dev, B53_VLAN_PAGE, - B53_VLAN_PORT_DEF_TAG(i), def_vid); -+ } - - /* Upon initial call we have not set-up any VLANs, but upon - * system resume, we need to restore all VLAN entries. -@@ -1429,13 +1447,6 @@ int b53_vlan_prepare(struct dsa_switch * - } - EXPORT_SYMBOL(b53_vlan_prepare); - --static bool b53_vlan_port_needs_forced_tagged(struct dsa_switch *ds, int port) --{ -- struct b53_device *dev = ds->priv; -- -- return dev->tag_protocol == DSA_TAG_PROTO_NONE && dsa_is_cpu_port(ds, port); --} -- - void b53_vlan_add(struct dsa_switch *ds, int port, - const struct switchdev_obj_port_vlan *vlan) - { diff --git a/target/linux/generic/backport-5.10/742-v5.16-net-phy-at803x-add-support-for-qca-8327-internal-phy.patch b/target/linux/generic/backport-5.10/742-v5.16-net-phy-at803x-add-support-for-qca-8327-internal-phy.patch deleted file mode 100644 index 16aa0711ad..0000000000 --- a/target/linux/generic/backport-5.10/742-v5.16-net-phy-at803x-add-support-for-qca-8327-internal-phy.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 0ccf8511182436183c031e8a2f740ae91a02c625 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Tue, 14 Sep 2021 14:33:45 +0200 -Subject: net: phy: at803x: add support for qca 8327 internal phy - -Add support for qca8327 internal phy needed for correct init of the -switch port. It does use the same qca8337 function and reg just with a -different id. - -Signed-off-by: Ansuel Smith -Tested-by: Rosen Penev -Tested-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/phy/at803x.c | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -1328,6 +1328,19 @@ static struct phy_driver at803x_driver[] - .get_sset_count = at803x_get_sset_count, - .get_strings = at803x_get_strings, - .get_stats = at803x_get_stats, -+}, { -+ /* QCA8327 */ -+ .phy_id = QCA8327_PHY_ID, -+ .phy_id_mask = QCA8K_PHY_ID_MASK, -+ .name = "QCA PHY 8327", -+ /* PHY_GBIT_FEATURES */ -+ .probe = at803x_probe, -+ .flags = PHY_IS_INTERNAL, -+ .config_init = qca83xx_config_init, -+ .soft_reset = genphy_soft_reset, -+ .get_sset_count = at803x_get_sset_count, -+ .get_strings = at803x_get_strings, -+ .get_stats = at803x_get_stats, - }, }; - - module_phy_driver(at803x_driver); -@@ -1338,6 +1351,8 @@ static struct mdio_device_id __maybe_unu - { PHY_ID_MATCH_EXACT(ATH8032_PHY_ID) }, - { PHY_ID_MATCH_EXACT(ATH8035_PHY_ID) }, - { PHY_ID_MATCH_EXACT(ATH9331_PHY_ID) }, -+ { PHY_ID_MATCH_EXACT(QCA8337_PHY_ID) }, -+ { PHY_ID_MATCH_EXACT(QCA8327_PHY_ID) }, - { } - }; - diff --git a/target/linux/generic/backport-5.10/743-v5.16-0001-net-dsa-b53-Include-all-ports-in-enabled_ports.patch b/target/linux/generic/backport-5.10/743-v5.16-0001-net-dsa-b53-Include-all-ports-in-enabled_ports.patch deleted file mode 100644 index d80b5db714..0000000000 --- a/target/linux/generic/backport-5.10/743-v5.16-0001-net-dsa-b53-Include-all-ports-in-enabled_ports.patch +++ /dev/null @@ -1,131 +0,0 @@ -From 983d96a9116a328668601555d96736261d33170c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 16 Sep 2021 14:03:51 +0200 -Subject: [PATCH] net: dsa: b53: Include all ports in "enabled_ports" -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Make "enabled_ports" bitfield contain all available switch ports -including a CPU port. This way there is no need for fixup during -initialization. - -For BCM53010, BCM53018 and BCM53019 include also other available ports. - -Signed-off-by: Rafał Miłecki -Reviewed-by: Florian Fainelli -Tested-by: Florian Fainelli -Signed-off-by: Jakub Kicinski ---- - drivers/net/dsa/b53/b53_common.c | 23 +++++++++++------------ - 1 file changed, 11 insertions(+), 12 deletions(-) - ---- a/drivers/net/dsa/b53/b53_common.c -+++ b/drivers/net/dsa/b53/b53_common.c -@@ -2288,7 +2288,7 @@ static const struct b53_chip_data b53_sw - .chip_id = BCM5325_DEVICE_ID, - .dev_name = "BCM5325", - .vlans = 16, -- .enabled_ports = 0x1f, -+ .enabled_ports = 0x3f, - .arl_bins = 2, - .arl_buckets = 1024, - .imp_port = 5, -@@ -2299,7 +2299,7 @@ static const struct b53_chip_data b53_sw - .chip_id = BCM5365_DEVICE_ID, - .dev_name = "BCM5365", - .vlans = 256, -- .enabled_ports = 0x1f, -+ .enabled_ports = 0x3f, - .arl_bins = 2, - .arl_buckets = 1024, - .imp_port = 5, -@@ -2310,7 +2310,7 @@ static const struct b53_chip_data b53_sw - .chip_id = BCM5389_DEVICE_ID, - .dev_name = "BCM5389", - .vlans = 4096, -- .enabled_ports = 0x1f, -+ .enabled_ports = 0x11f, - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -@@ -2324,7 +2324,7 @@ static const struct b53_chip_data b53_sw - .chip_id = BCM5395_DEVICE_ID, - .dev_name = "BCM5395", - .vlans = 4096, -- .enabled_ports = 0x1f, -+ .enabled_ports = 0x11f, - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -@@ -2338,7 +2338,7 @@ static const struct b53_chip_data b53_sw - .chip_id = BCM5397_DEVICE_ID, - .dev_name = "BCM5397", - .vlans = 4096, -- .enabled_ports = 0x1f, -+ .enabled_ports = 0x11f, - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -@@ -2352,7 +2352,7 @@ static const struct b53_chip_data b53_sw - .chip_id = BCM5398_DEVICE_ID, - .dev_name = "BCM5398", - .vlans = 4096, -- .enabled_ports = 0x7f, -+ .enabled_ports = 0x17f, - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -@@ -2366,7 +2366,7 @@ static const struct b53_chip_data b53_sw - .chip_id = BCM53115_DEVICE_ID, - .dev_name = "BCM53115", - .vlans = 4096, -- .enabled_ports = 0x1f, -+ .enabled_ports = 0x11f, - .arl_bins = 4, - .arl_buckets = 1024, - .vta_regs = B53_VTA_REGS, -@@ -2380,7 +2380,7 @@ static const struct b53_chip_data b53_sw - .chip_id = BCM53125_DEVICE_ID, - .dev_name = "BCM53125", - .vlans = 4096, -- .enabled_ports = 0xff, -+ .enabled_ports = 0x1ff, - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -@@ -2422,7 +2422,7 @@ static const struct b53_chip_data b53_sw - .chip_id = BCM53010_DEVICE_ID, - .dev_name = "BCM53010", - .vlans = 4096, -- .enabled_ports = 0x1f, -+ .enabled_ports = 0x1bf, - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -@@ -2464,7 +2464,7 @@ static const struct b53_chip_data b53_sw - .chip_id = BCM53018_DEVICE_ID, - .dev_name = "BCM53018", - .vlans = 4096, -- .enabled_ports = 0x1f, -+ .enabled_ports = 0x1bf, - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -@@ -2478,7 +2478,7 @@ static const struct b53_chip_data b53_sw - .chip_id = BCM53019_DEVICE_ID, - .dev_name = "BCM53019", - .vlans = 4096, -- .enabled_ports = 0x1f, -+ .enabled_ports = 0x1bf, - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -@@ -2605,7 +2605,6 @@ static int b53_switch_init(struct b53_de - dev->cpu_port = 5; - } - -- dev->enabled_ports |= BIT(dev->cpu_port); - dev->num_ports = fls(dev->enabled_ports); - - dev->ds->num_ports = min_t(unsigned int, dev->num_ports, DSA_MAX_PORTS); diff --git a/target/linux/generic/backport-5.10/743-v5.16-0002-net-dsa-b53-Drop-BCM5301x-workaround-for-a-wrong-CPU.patch b/target/linux/generic/backport-5.10/743-v5.16-0002-net-dsa-b53-Drop-BCM5301x-workaround-for-a-wrong-CPU.patch deleted file mode 100644 index 350534a976..0000000000 --- a/target/linux/generic/backport-5.10/743-v5.16-0002-net-dsa-b53-Drop-BCM5301x-workaround-for-a-wrong-CPU.patch +++ /dev/null @@ -1,42 +0,0 @@ -From b290c6384afabbca5ae6e2af72fb1b2bc37922be Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 16 Sep 2021 14:03:52 +0200 -Subject: [PATCH] net: dsa: b53: Drop BCM5301x workaround for a wrong CPU/IMP - port -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -On BCM5301x port 8 requires a fixed link when used. - -Years ago when b53 was an libreCMC downstream driver (with configuration -based on sometimes bugged NVRAM) there was a need for a fixup. In case -of forcing fixed link for (incorrectly specified) port 5 the code had to -actually setup port 8 link. - -For upstream b53 driver with setup based on DT there is no need for that -workaround. In DT we have and require correct ports setup. - -Signed-off-by: Rafał Miłecki -Reviewed-by: Florian Fainelli -Tested-by: Florian Fainelli -Signed-off-by: Jakub Kicinski ---- - drivers/net/dsa/b53/b53_common.c | 6 ------ - 1 file changed, 6 deletions(-) - ---- a/drivers/net/dsa/b53/b53_common.c -+++ b/drivers/net/dsa/b53/b53_common.c -@@ -1256,12 +1256,6 @@ static void b53_adjust_link(struct dsa_s - return; - } - } -- } else if (is5301x(dev)) { -- if (port != dev->cpu_port) { -- b53_force_port_config(dev, dev->cpu_port, 2000, -- DUPLEX_FULL, true, true); -- b53_force_link(dev, dev->cpu_port, 1); -- } - } - - /* Re-negotiate EEE if it was enabled already */ diff --git a/target/linux/generic/backport-5.10/743-v5.16-0003-net-dsa-b53-Improve-flow-control-setup-on-BCM5301x.patch b/target/linux/generic/backport-5.10/743-v5.16-0003-net-dsa-b53-Improve-flow-control-setup-on-BCM5301x.patch deleted file mode 100644 index 3954ee4aac..0000000000 --- a/target/linux/generic/backport-5.10/743-v5.16-0003-net-dsa-b53-Improve-flow-control-setup-on-BCM5301x.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 3ff26b29230c54fea2353b63124c589b61953e14 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 16 Sep 2021 14:03:53 +0200 -Subject: [PATCH] net: dsa: b53: Improve flow control setup on BCM5301x -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -According to the Broadcom's reference driver flow control needs to be -enabled for any CPU switch port (5, 7 or 8 - depending on which one is -used). Current code makes it work only for the port 5. Use -dsa_is_cpu_port() which solved that problem. - -Signed-off-by: Rafał Miłecki -Reviewed-by: Florian Fainelli -Tested-by: Florian Fainelli -Signed-off-by: Jakub Kicinski ---- - drivers/net/dsa/b53/b53_common.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/dsa/b53/b53_common.c -+++ b/drivers/net/dsa/b53/b53_common.c -@@ -1187,7 +1187,7 @@ static void b53_adjust_link(struct dsa_s - return; - - /* Enable flow control on BCM5301x's CPU port */ -- if (is5301x(dev) && port == dev->cpu_port) -+ if (is5301x(dev) && dsa_is_cpu_port(ds, port)) - tx_pause = rx_pause = true; - - if (phydev->pause) { diff --git a/target/linux/generic/backport-5.10/743-v5.16-0004-net-dsa-b53-Drop-unused-cpu_port-field.patch b/target/linux/generic/backport-5.10/743-v5.16-0004-net-dsa-b53-Drop-unused-cpu_port-field.patch deleted file mode 100644 index 9e687b1488..0000000000 --- a/target/linux/generic/backport-5.10/743-v5.16-0004-net-dsa-b53-Drop-unused-cpu_port-field.patch +++ /dev/null @@ -1,205 +0,0 @@ -From 7d5af56418d7d01e43247a33b6fe6492ea871923 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 16 Sep 2021 14:03:54 +0200 -Subject: [PATCH] net: dsa: b53: Drop unused "cpu_port" field -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -It's set but never used anymore. - -Signed-off-by: Rafał Miłecki -Reviewed-by: Florian Fainelli -Tested-by: Florian Fainelli -Signed-off-by: Jakub Kicinski ---- - drivers/net/dsa/b53/b53_common.c | 28 ---------------------------- - drivers/net/dsa/b53/b53_priv.h | 1 - - 2 files changed, 29 deletions(-) - ---- a/drivers/net/dsa/b53/b53_common.c -+++ b/drivers/net/dsa/b53/b53_common.c -@@ -2286,7 +2286,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 2, - .arl_buckets = 1024, - .imp_port = 5, -- .cpu_port = B53_CPU_PORT_25, - .duplex_reg = B53_DUPLEX_STAT_FE, - }, - { -@@ -2297,7 +2296,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 2, - .arl_buckets = 1024, - .imp_port = 5, -- .cpu_port = B53_CPU_PORT_25, - .duplex_reg = B53_DUPLEX_STAT_FE, - }, - { -@@ -2308,7 +2306,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2322,7 +2319,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2336,7 +2332,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .vta_regs = B53_VTA_REGS_9798, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2350,7 +2345,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .vta_regs = B53_VTA_REGS_9798, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2365,7 +2359,6 @@ static const struct b53_chip_data b53_sw - .arl_buckets = 1024, - .vta_regs = B53_VTA_REGS, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, - .jumbo_size_reg = B53_JUMBO_MAX_SIZE, -@@ -2378,7 +2371,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2392,7 +2384,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2406,7 +2397,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .vta_regs = B53_VTA_REGS_63XX, - .duplex_reg = B53_DUPLEX_STAT_63XX, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK_63XX, -@@ -2420,7 +2410,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2434,7 +2423,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2448,7 +2436,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2462,7 +2449,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2476,7 +2462,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2490,7 +2475,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2504,7 +2488,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2518,7 +2501,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 1024, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2532,7 +2514,6 @@ static const struct b53_chip_data b53_sw - .arl_bins = 4, - .arl_buckets = 256, - .imp_port = 8, -- .cpu_port = B53_CPU_PORT, - .vta_regs = B53_VTA_REGS, - .duplex_reg = B53_DUPLEX_STAT_GE, - .jumbo_pm_reg = B53_JUMBO_PORT_MASK, -@@ -2558,7 +2539,6 @@ static int b53_switch_init(struct b53_de - dev->vta_regs[2] = chip->vta_regs[2]; - dev->jumbo_pm_reg = chip->jumbo_pm_reg; - dev->imp_port = chip->imp_port; -- dev->cpu_port = chip->cpu_port; - dev->num_vlans = chip->vlans; - dev->num_arl_bins = chip->arl_bins; - dev->num_arl_buckets = chip->arl_buckets; -@@ -2590,13 +2570,6 @@ static int b53_switch_init(struct b53_de - break; - #endif - } -- } else if (dev->chip_id == BCM53115_DEVICE_ID) { -- u64 strap_value; -- -- b53_read48(dev, B53_STAT_PAGE, B53_STRAP_VALUE, &strap_value); -- /* use second IMP port if GMII is enabled */ -- if (strap_value & SV_GMII_CTRL_115) -- dev->cpu_port = 5; - } - - dev->num_ports = fls(dev->enabled_ports); ---- a/drivers/net/dsa/b53/b53_priv.h -+++ b/drivers/net/dsa/b53/b53_priv.h -@@ -123,7 +123,6 @@ struct b53_device { - /* used ports mask */ - u16 enabled_ports; - unsigned int imp_port; -- unsigned int cpu_port; - - /* connect specific data */ - u8 current_page; diff --git a/target/linux/generic/backport-5.10/744-v5.15-net-dsa-don-t-set-skb-offload_fwd_mark-when-not-offl.patch b/target/linux/generic/backport-5.10/744-v5.15-net-dsa-don-t-set-skb-offload_fwd_mark-when-not-offl.patch deleted file mode 100644 index 51f87904ef..0000000000 --- a/target/linux/generic/backport-5.10/744-v5.15-net-dsa-don-t-set-skb-offload_fwd_mark-when-not-offl.patch +++ /dev/null @@ -1,138 +0,0 @@ -From bea7907837c57a0aaac009931eb14efb056dafab Mon Sep 17 00:00:00 2001 -From: Vladimir Oltean -Date: Thu, 29 Jul 2021 17:56:00 +0300 -Subject: [PATCH] net: dsa: don't set skb->offload_fwd_mark when not offloading - the bridge - -DSA has gained the recent ability to deal gracefully with upper -interfaces it cannot offload, such as the bridge, bonding or team -drivers. When such uppers exist, the ports are still in standalone mode -as far as the hardware is concerned. - -But when we deliver packets to the software bridge in order for that to -do the forwarding, there is an unpleasant surprise in that the bridge -will refuse to forward them. This is because we unconditionally set -skb->offload_fwd_mark = true, meaning that the bridge thinks the frames -were already forwarded in hardware by us. - -Since dp->bridge_dev is populated only when there is hardware offload -for it, but not in the software fallback case, let's introduce a new -helper that can be called from the tagger data path which sets the -skb->offload_fwd_mark accordingly to zero when there is no hardware -offload for bridging. This lets the bridge forward packets back to other -interfaces of our switch, if needed. - -Signed-off-by: Vladimir Oltean -Reviewed-by: Tobias Waldekranz -Signed-off-by: David S. Miller ---- - net/dsa/dsa_priv.h | 14 ++++++++++++++ - net/dsa/tag_brcm.c | 4 ++-- - net/dsa/tag_dsa.c | 15 +++++++++++---- - net/dsa/tag_ksz.c | 2 +- - net/dsa/tag_lan9303.c | 3 ++- - net/dsa/tag_mtk.c | 2 +- - net/dsa/tag_ocelot.c | 2 +- - net/dsa/tag_rtl4_a.c | 2 +- - net/dsa/tag_sja1105.c | 20 ++++++++++++++------ - 9 files changed, 47 insertions(+), 17 deletions(-) - ---- a/net/dsa/dsa_priv.h -+++ b/net/dsa/dsa_priv.h -@@ -266,6 +266,20 @@ static inline struct sk_buff *dsa_untag_ - return skb; - } - -+/* If the ingress port offloads the bridge, we mark the frame as autonomously -+ * forwarded by hardware, so the software bridge doesn't forward in twice, back -+ * to us, because we already did. However, if we're in fallback mode and we do -+ * software bridging, we are not offloading it, therefore the dp->bridge_dev -+ * pointer is not populated, and flooding needs to be done by software (we are -+ * effectively operating in standalone ports mode). -+ */ -+static inline void dsa_default_offload_fwd_mark(struct sk_buff *skb) -+{ -+ struct dsa_port *dp = dsa_slave_to_port(skb->dev); -+ -+ skb->offload_fwd_mark = !!(dp->bridge_dev); -+} -+ - /* switch.c */ - int dsa_switch_register_notifier(struct dsa_switch *ds); - void dsa_switch_unregister_notifier(struct dsa_switch *ds); ---- a/net/dsa/tag_brcm.c -+++ b/net/dsa/tag_brcm.c -@@ -166,7 +166,7 @@ static struct sk_buff *brcm_tag_rcv_ll(s - /* Remove Broadcom tag and update checksum */ - skb_pull_rcsum(skb, BRCM_TAG_LEN); - -- skb->offload_fwd_mark = 1; -+ dsa_default_offload_fwd_mark(skb); - - return skb; - } -@@ -270,7 +270,7 @@ static struct sk_buff *brcm_leg_tag_rcv( - /* Remove Broadcom tag and update checksum */ - skb_pull_rcsum(skb, BRCM_LEG_TAG_LEN); - -- skb->offload_fwd_mark = 1; -+ dsa_default_offload_fwd_mark(skb); - - /* Move the Ethernet DA and SA */ - memmove(skb->data - ETH_HLEN, ---- a/net/dsa/tag_ksz.c -+++ b/net/dsa/tag_ksz.c -@@ -25,7 +25,7 @@ static struct sk_buff *ksz_common_rcv(st - if (pskb_trim_rcsum(skb, skb->len - len)) - return NULL; - -- skb->offload_fwd_mark = true; -+ dsa_default_offload_fwd_mark(skb); - - return skb; - } ---- a/net/dsa/tag_lan9303.c -+++ b/net/dsa/tag_lan9303.c -@@ -115,7 +115,8 @@ static struct sk_buff *lan9303_rcv(struc - skb_pull_rcsum(skb, 2 + 2); - memmove(skb->data - ETH_HLEN, skb->data - (ETH_HLEN + LAN9303_TAG_LEN), - 2 * ETH_ALEN); -- skb->offload_fwd_mark = !(lan9303_tag1 & LAN9303_TAG_RX_TRAPPED_TO_CPU); -+ if (!(lan9303_tag1 & LAN9303_TAG_RX_TRAPPED_TO_CPU)) -+ dsa_default_offload_fwd_mark(skb); - - return skb; - } ---- a/net/dsa/tag_mtk.c -+++ b/net/dsa/tag_mtk.c -@@ -104,7 +104,7 @@ static struct sk_buff *mtk_tag_rcv(struc - - /* Only unicast or broadcast frames are offloaded */ - if (likely(!is_multicast_skb)) -- skb->offload_fwd_mark = 1; -+ dsa_default_offload_fwd_mark(skb); - - return skb; - } ---- a/net/dsa/tag_ocelot.c -+++ b/net/dsa/tag_ocelot.c -@@ -225,7 +225,7 @@ static struct sk_buff *ocelot_rcv(struct - */ - return NULL; - -- skb->offload_fwd_mark = 1; -+ dsa_default_offload_fwd_mark(skb); - skb->priority = qos_class; - - /* Ocelot switches copy frames unmodified to the CPU. However, it is ---- a/net/dsa/tag_rtl4_a.c -+++ b/net/dsa/tag_rtl4_a.c -@@ -115,7 +115,7 @@ static struct sk_buff *rtl4a_tag_rcv(str - skb->data - ETH_HLEN - RTL4_A_HDR_LEN, - 2 * ETH_ALEN); - -- skb->offload_fwd_mark = 1; -+ dsa_default_offload_fwd_mark(skb); - - return skb; - } diff --git a/target/linux/generic/backport-5.10/745-v5.16-01-net-phy-at803x-add-support-for-qca-8327-A-variant.patch b/target/linux/generic/backport-5.10/745-v5.16-01-net-phy-at803x-add-support-for-qca-8327-A-variant.patch deleted file mode 100644 index c82bf913a0..0000000000 --- a/target/linux/generic/backport-5.10/745-v5.16-01-net-phy-at803x-add-support-for-qca-8327-A-variant.patch +++ /dev/null @@ -1,65 +0,0 @@ -From b4df02b562f4aa14ff6811f30e1b4d2159585c59 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Sun, 19 Sep 2021 18:28:15 +0200 -Subject: net: phy: at803x: add support for qca 8327 A variant internal phy - -For qca8327 internal phy there are 2 different switch variant with 2 -different phy id. Add this missing variant so the internal phy can be -correctly identified and fixed. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/phy/at803x.c | 25 ++++++++++++++++++++----- - 1 file changed, 20 insertions(+), 5 deletions(-) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -148,7 +148,8 @@ - #define AT803X_PAGE_FIBER 0 - #define AT803X_PAGE_COPPER 1 - --#define QCA8327_PHY_ID 0x004dd034 -+#define QCA8327_A_PHY_ID 0x004dd033 -+#define QCA8327_B_PHY_ID 0x004dd034 - #define QCA8337_PHY_ID 0x004dd036 - #define QCA8K_PHY_ID_MASK 0xffffffff - -@@ -1329,10 +1330,23 @@ static struct phy_driver at803x_driver[] - .get_strings = at803x_get_strings, - .get_stats = at803x_get_stats, - }, { -- /* QCA8327 */ -- .phy_id = QCA8327_PHY_ID, -+ /* QCA8327-A from switch QCA8327-AL1A */ -+ .phy_id = QCA8327_A_PHY_ID, - .phy_id_mask = QCA8K_PHY_ID_MASK, -- .name = "QCA PHY 8327", -+ .name = "QCA PHY 8327-A", -+ /* PHY_GBIT_FEATURES */ -+ .probe = at803x_probe, -+ .flags = PHY_IS_INTERNAL, -+ .config_init = qca83xx_config_init, -+ .soft_reset = genphy_soft_reset, -+ .get_sset_count = at803x_get_sset_count, -+ .get_strings = at803x_get_strings, -+ .get_stats = at803x_get_stats, -+}, { -+ /* QCA8327-B from switch QCA8327-BL1A */ -+ .phy_id = QCA8327_B_PHY_ID, -+ .phy_id_mask = QCA8K_PHY_ID_MASK, -+ .name = "QCA PHY 8327-B", - /* PHY_GBIT_FEATURES */ - .probe = at803x_probe, - .flags = PHY_IS_INTERNAL, -@@ -1352,7 +1366,8 @@ static struct mdio_device_id __maybe_unu - { PHY_ID_MATCH_EXACT(ATH8035_PHY_ID) }, - { PHY_ID_MATCH_EXACT(ATH9331_PHY_ID) }, - { PHY_ID_MATCH_EXACT(QCA8337_PHY_ID) }, -- { PHY_ID_MATCH_EXACT(QCA8327_PHY_ID) }, -+ { PHY_ID_MATCH_EXACT(QCA8327_A_PHY_ID) }, -+ { PHY_ID_MATCH_EXACT(QCA8327_B_PHY_ID) }, - { } - }; - diff --git a/target/linux/generic/backport-5.10/745-v5.16-02-net-phy-at803x-add-resume-suspend-function-to-qca83x.patch b/target/linux/generic/backport-5.10/745-v5.16-02-net-phy-at803x-add-resume-suspend-function-to-qca83x.patch deleted file mode 100644 index be24fd5cf7..0000000000 --- a/target/linux/generic/backport-5.10/745-v5.16-02-net-phy-at803x-add-resume-suspend-function-to-qca83x.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 15b9df4ece17d084f14eb0ca1cf05f2ad497e425 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Sun, 19 Sep 2021 18:28:16 +0200 -Subject: net: phy: at803x: add resume/suspend function to qca83xx phy - -Add resume/suspend function to qca83xx internal phy. -We can't use the at803x generic function as the documentation lacks of -any support for WoL regs. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/phy/at803x.c | 6 ++++++ - 1 file changed, 6 insertions(+) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -1329,6 +1329,8 @@ static struct phy_driver at803x_driver[] - .get_sset_count = at803x_get_sset_count, - .get_strings = at803x_get_strings, - .get_stats = at803x_get_stats, -+ .suspend = genphy_suspend, -+ .resume = genphy_resume, - }, { - /* QCA8327-A from switch QCA8327-AL1A */ - .phy_id = QCA8327_A_PHY_ID, -@@ -1342,6 +1344,8 @@ static struct phy_driver at803x_driver[] - .get_sset_count = at803x_get_sset_count, - .get_strings = at803x_get_strings, - .get_stats = at803x_get_stats, -+ .suspend = genphy_suspend, -+ .resume = genphy_resume, - }, { - /* QCA8327-B from switch QCA8327-BL1A */ - .phy_id = QCA8327_B_PHY_ID, -@@ -1355,6 +1359,8 @@ static struct phy_driver at803x_driver[] - .get_sset_count = at803x_get_sset_count, - .get_strings = at803x_get_strings, - .get_stats = at803x_get_stats, -+ .suspend = genphy_suspend, -+ .resume = genphy_resume, - }, }; - - module_phy_driver(at803x_driver); diff --git a/target/linux/generic/backport-5.10/745-v5.16-03-net-phy-at803x-fix-spacing-and-improve-name-for-83xx.patch b/target/linux/generic/backport-5.10/745-v5.16-03-net-phy-at803x-fix-spacing-and-improve-name-for-83xx.patch deleted file mode 100644 index 23f574c76f..0000000000 --- a/target/linux/generic/backport-5.10/745-v5.16-03-net-phy-at803x-fix-spacing-and-improve-name-for-83xx.patch +++ /dev/null @@ -1,95 +0,0 @@ -From d44fd8604a4ab92119adb35f05fd87612af722b5 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Sun, 19 Sep 2021 18:28:17 +0200 -Subject: net: phy: at803x: fix spacing and improve name for 83xx phy - -Fix spacing and improve name for 83xx phy following other phy in the -same driver. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/phy/at803x.c | 60 ++++++++++++++++++++++++------------------------ - 1 file changed, 30 insertions(+), 30 deletions(-) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -1318,47 +1318,47 @@ static struct phy_driver at803x_driver[] - .config_aneg = at803x_config_aneg, - }, { - /* QCA8337 */ -- .phy_id = QCA8337_PHY_ID, -- .phy_id_mask = QCA8K_PHY_ID_MASK, -- .name = "QCA PHY 8337", -+ .phy_id = QCA8337_PHY_ID, -+ .phy_id_mask = QCA8K_PHY_ID_MASK, -+ .name = "Qualcomm Atheros 8337 internal PHY", - /* PHY_GBIT_FEATURES */ -- .probe = at803x_probe, -- .flags = PHY_IS_INTERNAL, -- .config_init = qca83xx_config_init, -- .soft_reset = genphy_soft_reset, -- .get_sset_count = at803x_get_sset_count, -- .get_strings = at803x_get_strings, -- .get_stats = at803x_get_stats, -+ .probe = at803x_probe, -+ .flags = PHY_IS_INTERNAL, -+ .config_init = qca83xx_config_init, -+ .soft_reset = genphy_soft_reset, -+ .get_sset_count = at803x_get_sset_count, -+ .get_strings = at803x_get_strings, -+ .get_stats = at803x_get_stats, - .suspend = genphy_suspend, - .resume = genphy_resume, - }, { - /* QCA8327-A from switch QCA8327-AL1A */ -- .phy_id = QCA8327_A_PHY_ID, -- .phy_id_mask = QCA8K_PHY_ID_MASK, -- .name = "QCA PHY 8327-A", -+ .phy_id = QCA8327_A_PHY_ID, -+ .phy_id_mask = QCA8K_PHY_ID_MASK, -+ .name = "Qualcomm Atheros 8327-A internal PHY", - /* PHY_GBIT_FEATURES */ -- .probe = at803x_probe, -- .flags = PHY_IS_INTERNAL, -- .config_init = qca83xx_config_init, -- .soft_reset = genphy_soft_reset, -- .get_sset_count = at803x_get_sset_count, -- .get_strings = at803x_get_strings, -- .get_stats = at803x_get_stats, -+ .probe = at803x_probe, -+ .flags = PHY_IS_INTERNAL, -+ .config_init = qca83xx_config_init, -+ .soft_reset = genphy_soft_reset, -+ .get_sset_count = at803x_get_sset_count, -+ .get_strings = at803x_get_strings, -+ .get_stats = at803x_get_stats, - .suspend = genphy_suspend, - .resume = genphy_resume, - }, { - /* QCA8327-B from switch QCA8327-BL1A */ -- .phy_id = QCA8327_B_PHY_ID, -- .phy_id_mask = QCA8K_PHY_ID_MASK, -- .name = "QCA PHY 8327-B", -+ .phy_id = QCA8327_B_PHY_ID, -+ .phy_id_mask = QCA8K_PHY_ID_MASK, -+ .name = "Qualcomm Atheros 8327-B internal PHY", - /* PHY_GBIT_FEATURES */ -- .probe = at803x_probe, -- .flags = PHY_IS_INTERNAL, -- .config_init = qca83xx_config_init, -- .soft_reset = genphy_soft_reset, -- .get_sset_count = at803x_get_sset_count, -- .get_strings = at803x_get_strings, -- .get_stats = at803x_get_stats, -+ .probe = at803x_probe, -+ .flags = PHY_IS_INTERNAL, -+ .config_init = qca83xx_config_init, -+ .soft_reset = genphy_soft_reset, -+ .get_sset_count = at803x_get_sset_count, -+ .get_strings = at803x_get_strings, -+ .get_stats = at803x_get_stats, - .suspend = genphy_suspend, - .resume = genphy_resume, - }, }; diff --git a/target/linux/generic/backport-5.10/746-v5.16-01-net-phy-at803x-fix-resume-for-QCA8327-phy.patch b/target/linux/generic/backport-5.10/746-v5.16-01-net-phy-at803x-fix-resume-for-QCA8327-phy.patch deleted file mode 100644 index 5dfe27dd24..0000000000 --- a/target/linux/generic/backport-5.10/746-v5.16-01-net-phy-at803x-fix-resume-for-QCA8327-phy.patch +++ /dev/null @@ -1,131 +0,0 @@ -From ba3c01ee02ed0d821c9f241f179bbc9457542b8f Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Sun, 10 Oct 2021 00:46:15 +0200 -Subject: net: phy: at803x: fix resume for QCA8327 phy - -From Documentation phy resume triggers phy reset and restart -auto-negotiation. Add a dedicated function to wait reset to finish as -it was notice a regression where port sometime are not reliable after a -suspend/resume session. The reset wait logic is copied from phy_poll_reset. -Add dedicated suspend function to use genphy_suspend only with QCA8337 -phy and set only additional debug settings for QCA8327. With more test -it was reported that QCA8327 doesn't proprely support this mode and -using this cause the unreliability of the switch ports, especially the -malfunction of the port0. - -Fixes: 15b9df4ece17 ("net: phy: at803x: add resume/suspend function to qca83xx phy") -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/phy/at803x.c | 69 +++++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 63 insertions(+), 6 deletions(-) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -92,9 +92,14 @@ - #define AT803X_DEBUG_REG_5 0x05 - #define AT803X_DEBUG_TX_CLK_DLY_EN BIT(8) - -+#define AT803X_DEBUG_REG_HIB_CTRL 0x0b -+#define AT803X_DEBUG_HIB_CTRL_SEL_RST_80U BIT(10) -+#define AT803X_DEBUG_HIB_CTRL_EN_ANY_CHANGE BIT(13) -+ - #define AT803X_DEBUG_REG_3C 0x3C - - #define AT803X_DEBUG_REG_3D 0x3D -+#define AT803X_DEBUG_GATE_CLK_IN1000 BIT(6) - - #define AT803X_DEBUG_REG_1F 0x1F - #define AT803X_DEBUG_PLL_ON BIT(2) -@@ -1220,6 +1225,58 @@ static int qca83xx_config_init(struct ph - return 0; - } - -+static int qca83xx_resume(struct phy_device *phydev) -+{ -+ int ret, val; -+ -+ /* Skip reset if not suspended */ -+ if (!phydev->suspended) -+ return 0; -+ -+ /* Reinit the port, reset values set by suspend */ -+ qca83xx_config_init(phydev); -+ -+ /* Reset the port on port resume */ -+ phy_set_bits(phydev, MII_BMCR, BMCR_RESET | BMCR_ANENABLE); -+ -+ /* On resume from suspend the switch execute a reset and -+ * restart auto-negotiation. Wait for reset to complete. -+ */ -+ ret = phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET), -+ 50000, 600000, true); -+ if (ret) -+ return ret; -+ -+ msleep(1); -+ -+ return 0; -+} -+ -+static int qca83xx_suspend(struct phy_device *phydev) -+{ -+ u16 mask = 0; -+ -+ /* Only QCA8337 support actual suspend. -+ * QCA8327 cause port unreliability when phy suspend -+ * is set. -+ */ -+ if (phydev->drv->phy_id == QCA8337_PHY_ID) { -+ genphy_suspend(phydev); -+ } else { -+ mask |= ~(BMCR_SPEED1000 | BMCR_FULLDPLX); -+ phy_modify(phydev, MII_BMCR, mask, 0); -+ } -+ -+ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_3D, -+ AT803X_DEBUG_GATE_CLK_IN1000, 0); -+ -+ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_HIB_CTRL, -+ AT803X_DEBUG_HIB_CTRL_EN_ANY_CHANGE | -+ AT803X_DEBUG_HIB_CTRL_SEL_RST_80U, 0); -+ -+ return 0; -+} -+ - static struct phy_driver at803x_driver[] = { - { - /* Qualcomm Atheros AR8035 */ -@@ -1329,8 +1386,8 @@ static struct phy_driver at803x_driver[] - .get_sset_count = at803x_get_sset_count, - .get_strings = at803x_get_strings, - .get_stats = at803x_get_stats, -- .suspend = genphy_suspend, -- .resume = genphy_resume, -+ .suspend = qca83xx_suspend, -+ .resume = qca83xx_resume, - }, { - /* QCA8327-A from switch QCA8327-AL1A */ - .phy_id = QCA8327_A_PHY_ID, -@@ -1344,8 +1401,8 @@ static struct phy_driver at803x_driver[] - .get_sset_count = at803x_get_sset_count, - .get_strings = at803x_get_strings, - .get_stats = at803x_get_stats, -- .suspend = genphy_suspend, -- .resume = genphy_resume, -+ .suspend = qca83xx_suspend, -+ .resume = qca83xx_resume, - }, { - /* QCA8327-B from switch QCA8327-BL1A */ - .phy_id = QCA8327_B_PHY_ID, -@@ -1359,8 +1416,8 @@ static struct phy_driver at803x_driver[] - .get_sset_count = at803x_get_sset_count, - .get_strings = at803x_get_strings, - .get_stats = at803x_get_stats, -- .suspend = genphy_suspend, -- .resume = genphy_resume, -+ .suspend = qca83xx_suspend, -+ .resume = qca83xx_resume, - }, }; - - module_phy_driver(at803x_driver); diff --git a/target/linux/generic/backport-5.10/746-v5.16-02-net-phy-at803x-add-DAC-amplitude-fix-for-8327-phy.patch b/target/linux/generic/backport-5.10/746-v5.16-02-net-phy-at803x-add-DAC-amplitude-fix-for-8327-phy.patch deleted file mode 100644 index aeb43e2f67..0000000000 --- a/target/linux/generic/backport-5.10/746-v5.16-02-net-phy-at803x-add-DAC-amplitude-fix-for-8327-phy.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 1ca8311949aec5c9447645731ef1c6bc5bd71350 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Sun, 10 Oct 2021 00:46:16 +0200 -Subject: net: phy: at803x: add DAC amplitude fix for 8327 phy - -QCA8327 internal phy require DAC amplitude adjustement set to +6% with -100m speed. Also add additional define to report a change of the same -reg in QCA8337. (different scope it does set 1000m voltage) -Add link_change_notify function to set the proper amplitude adjustement -on PHY_RUNNING state and disable on any other state. - -Fixes: b4df02b562f4 ("net: phy: at803x: add support for qca 8327 A variant internal phy") -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/phy/at803x.c | 33 +++++++++++++++++++++++++++++++++ - 1 file changed, 33 insertions(+) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -87,6 +87,8 @@ - #define AT803X_PSSR_MR_AN_COMPLETE 0x0200 - - #define AT803X_DEBUG_REG_0 0x00 -+#define QCA8327_DEBUG_MANU_CTRL_EN BIT(2) -+#define QCA8337_DEBUG_MANU_CTRL_EN GENMASK(3, 2) - #define AT803X_DEBUG_RX_CLK_DLY_EN BIT(15) - - #define AT803X_DEBUG_REG_5 0x05 -@@ -1222,9 +1224,37 @@ static int qca83xx_config_init(struct ph - break; - } - -+ /* QCA8327 require DAC amplitude adjustment for 100m set to +6%. -+ * Disable on init and enable only with 100m speed following -+ * qca original source code. -+ */ -+ if (phydev->drv->phy_id == QCA8327_A_PHY_ID || -+ phydev->drv->phy_id == QCA8327_B_PHY_ID) -+ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, -+ QCA8327_DEBUG_MANU_CTRL_EN, 0); -+ - return 0; - } - -+static void qca83xx_link_change_notify(struct phy_device *phydev) -+{ -+ /* QCA8337 doesn't require DAC Amplitude adjustement */ -+ if (phydev->drv->phy_id == QCA8337_PHY_ID) -+ return; -+ -+ /* Set DAC Amplitude adjustment to +6% for 100m on link running */ -+ if (phydev->state == PHY_RUNNING) { -+ if (phydev->speed == SPEED_100) -+ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, -+ QCA8327_DEBUG_MANU_CTRL_EN, -+ QCA8327_DEBUG_MANU_CTRL_EN); -+ } else { -+ /* Reset DAC Amplitude adjustment */ -+ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, -+ QCA8327_DEBUG_MANU_CTRL_EN, 0); -+ } -+} -+ - static int qca83xx_resume(struct phy_device *phydev) - { - int ret, val; -@@ -1379,6 +1409,7 @@ static struct phy_driver at803x_driver[] - .phy_id_mask = QCA8K_PHY_ID_MASK, - .name = "Qualcomm Atheros 8337 internal PHY", - /* PHY_GBIT_FEATURES */ -+ .link_change_notify = qca83xx_link_change_notify, - .probe = at803x_probe, - .flags = PHY_IS_INTERNAL, - .config_init = qca83xx_config_init, -@@ -1394,6 +1425,7 @@ static struct phy_driver at803x_driver[] - .phy_id_mask = QCA8K_PHY_ID_MASK, - .name = "Qualcomm Atheros 8327-A internal PHY", - /* PHY_GBIT_FEATURES */ -+ .link_change_notify = qca83xx_link_change_notify, - .probe = at803x_probe, - .flags = PHY_IS_INTERNAL, - .config_init = qca83xx_config_init, -@@ -1409,6 +1441,7 @@ static struct phy_driver at803x_driver[] - .phy_id_mask = QCA8K_PHY_ID_MASK, - .name = "Qualcomm Atheros 8327-B internal PHY", - /* PHY_GBIT_FEATURES */ -+ .link_change_notify = qca83xx_link_change_notify, - .probe = at803x_probe, - .flags = PHY_IS_INTERNAL, - .config_init = qca83xx_config_init, diff --git a/target/linux/generic/backport-5.10/746-v5.16-03-net-phy-at803x-enable-prefer-master-for-83xx-interna.patch b/target/linux/generic/backport-5.10/746-v5.16-03-net-phy-at803x-enable-prefer-master-for-83xx-interna.patch deleted file mode 100644 index 2352fa0e44..0000000000 --- a/target/linux/generic/backport-5.10/746-v5.16-03-net-phy-at803x-enable-prefer-master-for-83xx-interna.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 9d1c29b4028557a496be9c5eb2b4b86063700636 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Sun, 10 Oct 2021 00:46:17 +0200 -Subject: net: phy: at803x: enable prefer master for 83xx internal phy - -From original QCA source code the port was set to prefer master as port -type in 1000BASE-T mode. Apply the same settings also here. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/phy/at803x.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -1233,6 +1233,9 @@ static int qca83xx_config_init(struct ph - at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, - QCA8327_DEBUG_MANU_CTRL_EN, 0); - -+ /* Following original QCA sourcecode set port to prefer master */ -+ phy_set_bits(phydev, MII_CTRL1000, CTL1000_PREFER_MASTER); -+ - return 0; - } - diff --git a/target/linux/generic/backport-5.10/746-v5.16-04-net-phy-at803x-better-describe-debug-regs.patch b/target/linux/generic/backport-5.10/746-v5.16-04-net-phy-at803x-better-describe-debug-regs.patch deleted file mode 100644 index 9c28a893f1..0000000000 --- a/target/linux/generic/backport-5.10/746-v5.16-04-net-phy-at803x-better-describe-debug-regs.patch +++ /dev/null @@ -1,127 +0,0 @@ -From 67999555ff42e91de7654488d9a7735bd9e84555 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Sun, 10 Oct 2021 00:46:18 +0200 -Subject: net: phy: at803x: better describe debug regs - -Give a name to known debug regs from Documentation instead of using -unknown hex values. - -Signed-off-by: Ansuel Smith -Reviewed-by: Andrew Lunn -Signed-off-by: David S. Miller ---- - drivers/net/phy/at803x.c | 30 +++++++++++++++--------------- - 1 file changed, 15 insertions(+), 15 deletions(-) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -86,12 +86,12 @@ - #define AT803X_PSSR 0x11 /*PHY-Specific Status Register*/ - #define AT803X_PSSR_MR_AN_COMPLETE 0x0200 - --#define AT803X_DEBUG_REG_0 0x00 -+#define AT803X_DEBUG_ANALOG_TEST_CTRL 0x00 - #define QCA8327_DEBUG_MANU_CTRL_EN BIT(2) - #define QCA8337_DEBUG_MANU_CTRL_EN GENMASK(3, 2) - #define AT803X_DEBUG_RX_CLK_DLY_EN BIT(15) - --#define AT803X_DEBUG_REG_5 0x05 -+#define AT803X_DEBUG_SYSTEM_CTRL_MODE 0x05 - #define AT803X_DEBUG_TX_CLK_DLY_EN BIT(8) - - #define AT803X_DEBUG_REG_HIB_CTRL 0x0b -@@ -100,7 +100,7 @@ - - #define AT803X_DEBUG_REG_3C 0x3C - --#define AT803X_DEBUG_REG_3D 0x3D -+#define AT803X_DEBUG_REG_GREEN 0x3D - #define AT803X_DEBUG_GATE_CLK_IN1000 BIT(6) - - #define AT803X_DEBUG_REG_1F 0x1F -@@ -274,25 +274,25 @@ static int at803x_read_page(struct phy_d - - static int at803x_enable_rx_delay(struct phy_device *phydev) - { -- return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, 0, -+ return at803x_debug_reg_mask(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, 0, - AT803X_DEBUG_RX_CLK_DLY_EN); - } - - static int at803x_enable_tx_delay(struct phy_device *phydev) - { -- return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_5, 0, -+ return at803x_debug_reg_mask(phydev, AT803X_DEBUG_SYSTEM_CTRL_MODE, 0, - AT803X_DEBUG_TX_CLK_DLY_EN); - } - - static int at803x_disable_rx_delay(struct phy_device *phydev) - { -- return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, -+ return at803x_debug_reg_mask(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, - AT803X_DEBUG_RX_CLK_DLY_EN, 0); - } - - static int at803x_disable_tx_delay(struct phy_device *phydev) - { -- return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_5, -+ return at803x_debug_reg_mask(phydev, AT803X_DEBUG_SYSTEM_CTRL_MODE, - AT803X_DEBUG_TX_CLK_DLY_EN, 0); - } - -@@ -1208,9 +1208,9 @@ static int qca83xx_config_init(struct ph - switch (switch_revision) { - case 1: - /* For 100M waveform */ -- at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_0, 0x02ea); -+ at803x_debug_reg_write(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, 0x02ea); - /* Turn on Gigabit clock */ -- at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_3D, 0x68a0); -+ at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_GREEN, 0x68a0); - break; - - case 2: -@@ -1218,8 +1218,8 @@ static int qca83xx_config_init(struct ph - fallthrough; - case 4: - phy_write_mmd(phydev, MDIO_MMD_PCS, MDIO_AZ_DEBUG, 0x803f); -- at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_3D, 0x6860); -- at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_5, 0x2c46); -+ at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_GREEN, 0x6860); -+ at803x_debug_reg_write(phydev, AT803X_DEBUG_SYSTEM_CTRL_MODE, 0x2c46); - at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_3C, 0x6000); - break; - } -@@ -1230,7 +1230,7 @@ static int qca83xx_config_init(struct ph - */ - if (phydev->drv->phy_id == QCA8327_A_PHY_ID || - phydev->drv->phy_id == QCA8327_B_PHY_ID) -- at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, -+ at803x_debug_reg_mask(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, - QCA8327_DEBUG_MANU_CTRL_EN, 0); - - /* Following original QCA sourcecode set port to prefer master */ -@@ -1248,12 +1248,12 @@ static void qca83xx_link_change_notify(s - /* Set DAC Amplitude adjustment to +6% for 100m on link running */ - if (phydev->state == PHY_RUNNING) { - if (phydev->speed == SPEED_100) -- at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, -+ at803x_debug_reg_mask(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, - QCA8327_DEBUG_MANU_CTRL_EN, - QCA8327_DEBUG_MANU_CTRL_EN); - } else { - /* Reset DAC Amplitude adjustment */ -- at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, -+ at803x_debug_reg_mask(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, - QCA8327_DEBUG_MANU_CTRL_EN, 0); - } - } -@@ -1300,7 +1300,7 @@ static int qca83xx_suspend(struct phy_de - phy_modify(phydev, MII_BMCR, mask, 0); - } - -- at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_3D, -+ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_GREEN, - AT803X_DEBUG_GATE_CLK_IN1000, 0); - - at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_HIB_CTRL, diff --git a/target/linux/generic/backport-5.10/747-v5.16-12-net-dsa-qca8k-add-support-for-QCA8328.patch b/target/linux/generic/backport-5.10/747-v5.16-12-net-dsa-qca8k-add-support-for-QCA8328.patch deleted file mode 100644 index 6e118f5a14..0000000000 --- a/target/linux/generic/backport-5.10/747-v5.16-12-net-dsa-qca8k-add-support-for-QCA8328.patch +++ /dev/null @@ -1,78 +0,0 @@ -From f477d1c8bdbef4f400718238e350f16f521d2a3e Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Thu, 14 Oct 2021 00:39:17 +0200 -Subject: net: dsa: qca8k: add support for QCA8328 - -QCA8328 switch is the bigger brother of the qca8327. Same regs different -chip. Change the function to set the correct pin layout and introduce a -new match_data to differentiate the 2 switch as they have the same ID -and their internal PHY have the same ID. - -Signed-off-by: Ansuel Smith -Reviewed-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 19 ++++++++++++++++--- - drivers/net/dsa/qca8k.h | 1 + - 2 files changed, 17 insertions(+), 3 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -935,6 +935,7 @@ static int - qca8k_setup_of_pws_reg(struct qca8k_priv *priv) - { - struct device_node *node = priv->dev->of_node; -+ const struct qca8k_match_data *data; - u32 val = 0; - int ret; - -@@ -943,8 +944,14 @@ qca8k_setup_of_pws_reg(struct qca8k_priv - * Should be applied by default but we set this just to make sure. - */ - if (priv->switch_id == QCA8K_ID_QCA8327) { -+ data = of_device_get_match_data(priv->dev); -+ -+ /* Set the correct package of 148 pin for QCA8327 */ -+ if (data->reduced_package) -+ val |= QCA8327_PWS_PACKAGE148_EN; -+ - ret = qca8k_rmw(priv, QCA8K_REG_PWS, QCA8327_PWS_PACKAGE148_EN, -- QCA8327_PWS_PACKAGE148_EN); -+ val); - if (ret) - return ret; - } -@@ -2098,7 +2105,12 @@ static int qca8k_resume(struct device *d - static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, - qca8k_suspend, qca8k_resume); - --static const struct qca8k_match_data qca832x = { -+static const struct qca8k_match_data qca8327 = { -+ .id = QCA8K_ID_QCA8327, -+ .reduced_package = true, -+}; -+ -+static const struct qca8k_match_data qca8328 = { - .id = QCA8K_ID_QCA8327, - }; - -@@ -2107,7 +2119,8 @@ static const struct qca8k_match_data qca - }; - - static const struct of_device_id qca8k_of_match[] = { -- { .compatible = "qca,qca8327", .data = &qca832x }, -+ { .compatible = "qca,qca8327", .data = &qca8327 }, -+ { .compatible = "qca,qca8328", .data = &qca8328 }, - { .compatible = "qca,qca8334", .data = &qca833x }, - { .compatible = "qca,qca8337", .data = &qca833x }, - { /* sentinel */ }, ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -260,6 +260,7 @@ struct ar8xxx_port_status { - - struct qca8k_match_data { - u8 id; -+ bool reduced_package; - }; - - enum { diff --git a/target/linux/generic/backport-5.10/754-net-next-net-dsa-qca8k-convert-to-GENMASK_FIELD_PREP_FIELD_GET.patch b/target/linux/generic/backport-5.10/754-net-next-net-dsa-qca8k-convert-to-GENMASK_FIELD_PREP_FIELD_GET.patch deleted file mode 100644 index c1489fd9a8..0000000000 --- a/target/linux/generic/backport-5.10/754-net-next-net-dsa-qca8k-convert-to-GENMASK_FIELD_PREP_FIELD_GET.patch +++ /dev/null @@ -1,508 +0,0 @@ -From 90ae68bfc2ffcb54a4ba4f64edbeb84a80cbb57c Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Mon, 22 Nov 2021 16:23:41 +0100 -Subject: net: dsa: qca8k: convert to GENMASK/FIELD_PREP/FIELD_GET - -Convert and try to standardize bit fields using -GENMASK/FIELD_PREP/FIELD_GET macros. Rework some logic to support the -standard macro and tidy things up. No functional change intended. - -Signed-off-by: Ansuel Smith -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 98 +++++++++++++++---------------- - drivers/net/dsa/qca8k.h | 153 ++++++++++++++++++++++++++---------------------- - 2 files changed, 130 insertions(+), 121 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -319,18 +320,18 @@ qca8k_fdb_read(struct qca8k_priv *priv, - } - - /* vid - 83:72 */ -- fdb->vid = (reg[2] >> QCA8K_ATU_VID_S) & QCA8K_ATU_VID_M; -+ fdb->vid = FIELD_GET(QCA8K_ATU_VID_MASK, reg[2]); - /* aging - 67:64 */ -- fdb->aging = reg[2] & QCA8K_ATU_STATUS_M; -+ fdb->aging = FIELD_GET(QCA8K_ATU_STATUS_MASK, reg[2]); - /* portmask - 54:48 */ -- fdb->port_mask = (reg[1] >> QCA8K_ATU_PORT_S) & QCA8K_ATU_PORT_M; -+ fdb->port_mask = FIELD_GET(QCA8K_ATU_PORT_MASK, reg[1]); - /* mac - 47:0 */ -- fdb->mac[0] = (reg[1] >> QCA8K_ATU_ADDR0_S) & 0xff; -- fdb->mac[1] = reg[1] & 0xff; -- fdb->mac[2] = (reg[0] >> QCA8K_ATU_ADDR2_S) & 0xff; -- fdb->mac[3] = (reg[0] >> QCA8K_ATU_ADDR3_S) & 0xff; -- fdb->mac[4] = (reg[0] >> QCA8K_ATU_ADDR4_S) & 0xff; -- fdb->mac[5] = reg[0] & 0xff; -+ fdb->mac[0] = FIELD_GET(QCA8K_ATU_ADDR0_MASK, reg[1]); -+ fdb->mac[1] = FIELD_GET(QCA8K_ATU_ADDR1_MASK, reg[1]); -+ fdb->mac[2] = FIELD_GET(QCA8K_ATU_ADDR2_MASK, reg[0]); -+ fdb->mac[3] = FIELD_GET(QCA8K_ATU_ADDR3_MASK, reg[0]); -+ fdb->mac[4] = FIELD_GET(QCA8K_ATU_ADDR4_MASK, reg[0]); -+ fdb->mac[5] = FIELD_GET(QCA8K_ATU_ADDR5_MASK, reg[0]); - - return 0; - } -@@ -343,18 +344,18 @@ qca8k_fdb_write(struct qca8k_priv *priv, - int i; - - /* vid - 83:72 */ -- reg[2] = (vid & QCA8K_ATU_VID_M) << QCA8K_ATU_VID_S; -+ reg[2] = FIELD_PREP(QCA8K_ATU_VID_MASK, vid); - /* aging - 67:64 */ -- reg[2] |= aging & QCA8K_ATU_STATUS_M; -+ reg[2] |= FIELD_PREP(QCA8K_ATU_STATUS_MASK, aging); - /* portmask - 54:48 */ -- reg[1] = (port_mask & QCA8K_ATU_PORT_M) << QCA8K_ATU_PORT_S; -+ reg[1] = FIELD_PREP(QCA8K_ATU_PORT_MASK, port_mask); - /* mac - 47:0 */ -- reg[1] |= mac[0] << QCA8K_ATU_ADDR0_S; -- reg[1] |= mac[1]; -- reg[0] |= mac[2] << QCA8K_ATU_ADDR2_S; -- reg[0] |= mac[3] << QCA8K_ATU_ADDR3_S; -- reg[0] |= mac[4] << QCA8K_ATU_ADDR4_S; -- reg[0] |= mac[5]; -+ reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR0_MASK, mac[0]); -+ reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR1_MASK, mac[1]); -+ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR2_MASK, mac[2]); -+ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR3_MASK, mac[3]); -+ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR4_MASK, mac[4]); -+ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR5_MASK, mac[5]); - - /* load the array into the ARL table */ - for (i = 0; i < 3; i++) -@@ -372,7 +373,7 @@ qca8k_fdb_access(struct qca8k_priv *priv - reg |= cmd; - if (port >= 0) { - reg |= QCA8K_ATU_FUNC_PORT_EN; -- reg |= (port & QCA8K_ATU_FUNC_PORT_M) << QCA8K_ATU_FUNC_PORT_S; -+ reg |= FIELD_PREP(QCA8K_ATU_FUNC_PORT_MASK, port); - } - - /* Write the function register triggering the table access */ -@@ -454,7 +455,7 @@ qca8k_vlan_access(struct qca8k_priv *pri - /* Set the command and VLAN index */ - reg = QCA8K_VTU_FUNC1_BUSY; - reg |= cmd; -- reg |= vid << QCA8K_VTU_FUNC1_VID_S; -+ reg |= FIELD_PREP(QCA8K_VTU_FUNC1_VID_MASK, vid); - - /* Write the function register triggering the table access */ - ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC1, reg); -@@ -500,13 +501,11 @@ qca8k_vlan_add(struct qca8k_priv *priv, - if (ret < 0) - goto out; - reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; -- reg &= ~(QCA8K_VTU_FUNC0_EG_MODE_MASK << QCA8K_VTU_FUNC0_EG_MODE_S(port)); -+ reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); - if (untagged) -- reg |= QCA8K_VTU_FUNC0_EG_MODE_UNTAG << -- QCA8K_VTU_FUNC0_EG_MODE_S(port); -+ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(port); - else -- reg |= QCA8K_VTU_FUNC0_EG_MODE_TAG << -- QCA8K_VTU_FUNC0_EG_MODE_S(port); -+ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(port); - - ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); - if (ret) -@@ -534,15 +533,13 @@ qca8k_vlan_del(struct qca8k_priv *priv, - ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); - if (ret < 0) - goto out; -- reg &= ~(3 << QCA8K_VTU_FUNC0_EG_MODE_S(port)); -- reg |= QCA8K_VTU_FUNC0_EG_MODE_NOT << -- QCA8K_VTU_FUNC0_EG_MODE_S(port); -+ reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); -+ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(port); - - /* Check if we're the last member to be removed */ - del = true; - for (i = 0; i < QCA8K_NUM_PORTS; i++) { -- mask = QCA8K_VTU_FUNC0_EG_MODE_NOT; -- mask <<= QCA8K_VTU_FUNC0_EG_MODE_S(i); -+ mask = QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(i); - - if ((reg & mask) != mask) { - del = false; -@@ -1014,7 +1011,7 @@ qca8k_parse_port_config(struct qca8k_pri - mode == PHY_INTERFACE_MODE_RGMII_TXID) - delay = 1; - -- if (delay > QCA8K_MAX_DELAY) { -+ if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK, delay)) { - dev_err(priv->dev, "rgmii tx delay is limited to a max value of 3ns, setting to the max value"); - delay = 3; - } -@@ -1030,7 +1027,7 @@ qca8k_parse_port_config(struct qca8k_pri - mode == PHY_INTERFACE_MODE_RGMII_RXID) - delay = 2; - -- if (delay > QCA8K_MAX_DELAY) { -+ if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK, delay)) { - dev_err(priv->dev, "rgmii rx delay is limited to a max value of 3ns, setting to the max value"); - delay = 3; - } -@@ -1141,8 +1138,8 @@ qca8k_setup(struct dsa_switch *ds) - /* Enable QCA header mode on all cpu ports */ - if (dsa_is_cpu_port(ds, i)) { - ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(i), -- QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_TX_S | -- QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_RX_S); -+ FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) | -+ FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL)); - if (ret) { - dev_err(priv->dev, "failed enabling QCA header mode"); - return ret; -@@ -1159,10 +1156,10 @@ qca8k_setup(struct dsa_switch *ds) - * for igmp, unknown, multicast and broadcast packet - */ - ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1, -- BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_S | -- BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_BC_DP_S | -- BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_MC_DP_S | -- BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_UC_DP_S); -+ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK, BIT(cpu_port)) | -+ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK, BIT(cpu_port)) | -+ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK, BIT(cpu_port)) | -+ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK, BIT(cpu_port))); - if (ret) - return ret; - -@@ -1180,8 +1177,6 @@ qca8k_setup(struct dsa_switch *ds) - - /* Individual user ports get connected to CPU port only */ - if (dsa_is_user_port(ds, i)) { -- int shift = 16 * (i % 2); -- - ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), - QCA8K_PORT_LOOKUP_MEMBER, - BIT(cpu_port)); -@@ -1198,8 +1193,8 @@ qca8k_setup(struct dsa_switch *ds) - * default egress vid - */ - ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i), -- 0xfff << shift, -- QCA8K_PORT_VID_DEF << shift); -+ QCA8K_EGREES_VLAN_PORT_MASK(i), -+ QCA8K_EGREES_VLAN_PORT(i, QCA8K_PORT_VID_DEF)); - if (ret) - return ret; - -@@ -1246,7 +1241,7 @@ qca8k_setup(struct dsa_switch *ds) - QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | - QCA8K_PORT_HOL_CTRL1_WRED_EN; - qca8k_rmw(priv, QCA8K_REG_PORT_HOL_CTRL1(i), -- QCA8K_PORT_HOL_CTRL1_ING_BUF | -+ QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK | - QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | - QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | - QCA8K_PORT_HOL_CTRL1_WRED_EN, -@@ -1269,8 +1264,8 @@ qca8k_setup(struct dsa_switch *ds) - mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) | - QCA8K_GLOBAL_FC_GOL_XOFF_THRES(496); - qca8k_rmw(priv, QCA8K_REG_GLOBAL_FC_THRESH, -- QCA8K_GLOBAL_FC_GOL_XON_THRES_S | -- QCA8K_GLOBAL_FC_GOL_XOFF_THRES_S, -+ QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK | -+ QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK, - mask); - } - -@@ -1918,11 +1913,11 @@ qca8k_port_vlan_filtering(struct dsa_swi - - if (vlan_filtering) { - qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), -- QCA8K_PORT_LOOKUP_VLAN_MODE, -+ QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, - QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE); - } else { - qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), -- QCA8K_PORT_LOOKUP_VLAN_MODE, -+ QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, - QCA8K_PORT_LOOKUP_VLAN_MODE_NONE); - } - -@@ -1953,11 +1948,9 @@ qca8k_port_vlan_add(struct dsa_switch *d - dev_err(priv->dev, "Failed to add VLAN to port %d (%d)", port, ret); - - if (pvid) { -- int shift = 16 * (port % 2); -- - qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port), -- 0xfff << shift, -- vlan->vid_end << shift); -+ QCA8K_EGREES_VLAN_PORT_MASK(port), -+ QCA8K_EGREES_VLAN_PORT(port, vlan->vid_end)); - qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port), - QCA8K_PORT_VLAN_CVID(vlan->vid_end) | - QCA8K_PORT_VLAN_SVID(vlan->vid_end)); -@@ -2050,7 +2043,7 @@ static int qca8k_read_switch_id(struct q - if (ret < 0) - return -ENODEV; - -- id = QCA8K_MASK_CTRL_DEVICE_ID(val & QCA8K_MASK_CTRL_DEVICE_ID_MASK); -+ id = QCA8K_MASK_CTRL_DEVICE_ID(val); - if (id != data->id) { - dev_err(priv->dev, "Switch id detected %x but expected %x", id, data->id); - return -ENODEV; -@@ -2059,7 +2052,7 @@ static int qca8k_read_switch_id(struct q - priv->switch_id = id; - - /* Save revision to communicate to the internal PHY driver */ -- priv->switch_revision = (val & QCA8K_MASK_CTRL_REV_ID_MASK); -+ priv->switch_revision = QCA8K_MASK_CTRL_REV_ID(val); - - return 0; - } ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -30,9 +30,9 @@ - /* Global control registers */ - #define QCA8K_REG_MASK_CTRL 0x000 - #define QCA8K_MASK_CTRL_REV_ID_MASK GENMASK(7, 0) --#define QCA8K_MASK_CTRL_REV_ID(x) ((x) >> 0) -+#define QCA8K_MASK_CTRL_REV_ID(x) FIELD_GET(QCA8K_MASK_CTRL_REV_ID_MASK, x) - #define QCA8K_MASK_CTRL_DEVICE_ID_MASK GENMASK(15, 8) --#define QCA8K_MASK_CTRL_DEVICE_ID(x) ((x) >> 8) -+#define QCA8K_MASK_CTRL_DEVICE_ID(x) FIELD_GET(QCA8K_MASK_CTRL_DEVICE_ID_MASK, x) - #define QCA8K_REG_PORT0_PAD_CTRL 0x004 - #define QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN BIT(31) - #define QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE BIT(19) -@@ -41,12 +41,11 @@ - #define QCA8K_REG_PORT6_PAD_CTRL 0x00c - #define QCA8K_PORT_PAD_RGMII_EN BIT(26) - #define QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK GENMASK(23, 22) --#define QCA8K_PORT_PAD_RGMII_TX_DELAY(x) ((x) << 22) -+#define QCA8K_PORT_PAD_RGMII_TX_DELAY(x) FIELD_PREP(QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK, x) - #define QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK GENMASK(21, 20) --#define QCA8K_PORT_PAD_RGMII_RX_DELAY(x) ((x) << 20) -+#define QCA8K_PORT_PAD_RGMII_RX_DELAY(x) FIELD_PREP(QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK, x) - #define QCA8K_PORT_PAD_RGMII_TX_DELAY_EN BIT(25) - #define QCA8K_PORT_PAD_RGMII_RX_DELAY_EN BIT(24) --#define QCA8K_MAX_DELAY 3 - #define QCA8K_PORT_PAD_SGMII_EN BIT(7) - #define QCA8K_REG_PWS 0x010 - #define QCA8K_PWS_POWER_ON_SEL BIT(31) -@@ -68,10 +67,12 @@ - #define QCA8K_MDIO_MASTER_READ BIT(27) - #define QCA8K_MDIO_MASTER_WRITE 0 - #define QCA8K_MDIO_MASTER_SUP_PRE BIT(26) --#define QCA8K_MDIO_MASTER_PHY_ADDR(x) ((x) << 21) --#define QCA8K_MDIO_MASTER_REG_ADDR(x) ((x) << 16) --#define QCA8K_MDIO_MASTER_DATA(x) (x) -+#define QCA8K_MDIO_MASTER_PHY_ADDR_MASK GENMASK(25, 21) -+#define QCA8K_MDIO_MASTER_PHY_ADDR(x) FIELD_PREP(QCA8K_MDIO_MASTER_PHY_ADDR_MASK, x) -+#define QCA8K_MDIO_MASTER_REG_ADDR_MASK GENMASK(20, 16) -+#define QCA8K_MDIO_MASTER_REG_ADDR(x) FIELD_PREP(QCA8K_MDIO_MASTER_REG_ADDR_MASK, x) - #define QCA8K_MDIO_MASTER_DATA_MASK GENMASK(15, 0) -+#define QCA8K_MDIO_MASTER_DATA(x) FIELD_PREP(QCA8K_MDIO_MASTER_DATA_MASK, x) - #define QCA8K_MDIO_MASTER_MAX_PORTS 5 - #define QCA8K_MDIO_MASTER_MAX_REG 32 - #define QCA8K_GOL_MAC_ADDR0 0x60 -@@ -93,9 +94,7 @@ - #define QCA8K_PORT_STATUS_FLOW_AUTO BIT(12) - #define QCA8K_REG_PORT_HDR_CTRL(_i) (0x9c + (_i * 4)) - #define QCA8K_PORT_HDR_CTRL_RX_MASK GENMASK(3, 2) --#define QCA8K_PORT_HDR_CTRL_RX_S 2 - #define QCA8K_PORT_HDR_CTRL_TX_MASK GENMASK(1, 0) --#define QCA8K_PORT_HDR_CTRL_TX_S 0 - #define QCA8K_PORT_HDR_CTRL_ALL 2 - #define QCA8K_PORT_HDR_CTRL_MGMT 1 - #define QCA8K_PORT_HDR_CTRL_NONE 0 -@@ -105,10 +104,11 @@ - #define QCA8K_SGMII_EN_TX BIT(3) - #define QCA8K_SGMII_EN_SD BIT(4) - #define QCA8K_SGMII_CLK125M_DELAY BIT(7) --#define QCA8K_SGMII_MODE_CTRL_MASK (BIT(22) | BIT(23)) --#define QCA8K_SGMII_MODE_CTRL_BASEX (0 << 22) --#define QCA8K_SGMII_MODE_CTRL_PHY (1 << 22) --#define QCA8K_SGMII_MODE_CTRL_MAC (2 << 22) -+#define QCA8K_SGMII_MODE_CTRL_MASK GENMASK(23, 22) -+#define QCA8K_SGMII_MODE_CTRL(x) FIELD_PREP(QCA8K_SGMII_MODE_CTRL_MASK, x) -+#define QCA8K_SGMII_MODE_CTRL_BASEX QCA8K_SGMII_MODE_CTRL(0x0) -+#define QCA8K_SGMII_MODE_CTRL_PHY QCA8K_SGMII_MODE_CTRL(0x1) -+#define QCA8K_SGMII_MODE_CTRL_MAC QCA8K_SGMII_MODE_CTRL(0x2) - - /* MAC_PWR_SEL registers */ - #define QCA8K_REG_MAC_PWR_SEL 0x0e4 -@@ -121,100 +121,115 @@ - - /* ACL registers */ - #define QCA8K_REG_PORT_VLAN_CTRL0(_i) (0x420 + (_i * 8)) --#define QCA8K_PORT_VLAN_CVID(x) (x << 16) --#define QCA8K_PORT_VLAN_SVID(x) x -+#define QCA8K_PORT_VLAN_CVID_MASK GENMASK(27, 16) -+#define QCA8K_PORT_VLAN_CVID(x) FIELD_PREP(QCA8K_PORT_VLAN_CVID_MASK, x) -+#define QCA8K_PORT_VLAN_SVID_MASK GENMASK(11, 0) -+#define QCA8K_PORT_VLAN_SVID(x) FIELD_PREP(QCA8K_PORT_VLAN_SVID_MASK, x) - #define QCA8K_REG_PORT_VLAN_CTRL1(_i) (0x424 + (_i * 8)) - #define QCA8K_REG_IPV4_PRI_BASE_ADDR 0x470 - #define QCA8K_REG_IPV4_PRI_ADDR_MASK 0x474 - - /* Lookup registers */ - #define QCA8K_REG_ATU_DATA0 0x600 --#define QCA8K_ATU_ADDR2_S 24 --#define QCA8K_ATU_ADDR3_S 16 --#define QCA8K_ATU_ADDR4_S 8 -+#define QCA8K_ATU_ADDR2_MASK GENMASK(31, 24) -+#define QCA8K_ATU_ADDR3_MASK GENMASK(23, 16) -+#define QCA8K_ATU_ADDR4_MASK GENMASK(15, 8) -+#define QCA8K_ATU_ADDR5_MASK GENMASK(7, 0) - #define QCA8K_REG_ATU_DATA1 0x604 --#define QCA8K_ATU_PORT_M 0x7f --#define QCA8K_ATU_PORT_S 16 --#define QCA8K_ATU_ADDR0_S 8 -+#define QCA8K_ATU_PORT_MASK GENMASK(22, 16) -+#define QCA8K_ATU_ADDR0_MASK GENMASK(15, 8) -+#define QCA8K_ATU_ADDR1_MASK GENMASK(7, 0) - #define QCA8K_REG_ATU_DATA2 0x608 --#define QCA8K_ATU_VID_M 0xfff --#define QCA8K_ATU_VID_S 8 --#define QCA8K_ATU_STATUS_M 0xf -+#define QCA8K_ATU_VID_MASK GENMASK(19, 8) -+#define QCA8K_ATU_STATUS_MASK GENMASK(3, 0) - #define QCA8K_ATU_STATUS_STATIC 0xf - #define QCA8K_REG_ATU_FUNC 0x60c - #define QCA8K_ATU_FUNC_BUSY BIT(31) - #define QCA8K_ATU_FUNC_PORT_EN BIT(14) - #define QCA8K_ATU_FUNC_MULTI_EN BIT(13) - #define QCA8K_ATU_FUNC_FULL BIT(12) --#define QCA8K_ATU_FUNC_PORT_M 0xf --#define QCA8K_ATU_FUNC_PORT_S 8 -+#define QCA8K_ATU_FUNC_PORT_MASK GENMASK(11, 8) - #define QCA8K_REG_VTU_FUNC0 0x610 - #define QCA8K_VTU_FUNC0_VALID BIT(20) - #define QCA8K_VTU_FUNC0_IVL_EN BIT(19) --#define QCA8K_VTU_FUNC0_EG_MODE_S(_i) (4 + (_i) * 2) --#define QCA8K_VTU_FUNC0_EG_MODE_MASK 3 --#define QCA8K_VTU_FUNC0_EG_MODE_UNMOD 0 --#define QCA8K_VTU_FUNC0_EG_MODE_UNTAG 1 --#define QCA8K_VTU_FUNC0_EG_MODE_TAG 2 --#define QCA8K_VTU_FUNC0_EG_MODE_NOT 3 -+/* QCA8K_VTU_FUNC0_EG_MODE_MASK GENMASK(17, 4) -+ * It does contain VLAN_MODE for each port [5:4] for port0, -+ * [7:6] for port1 ... [17:16] for port6. Use virtual port -+ * define to handle this. -+ */ -+#define QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i) (4 + (_i) * 2) -+#define QCA8K_VTU_FUNC0_EG_MODE_MASK GENMASK(1, 0) -+#define QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(_i) (GENMASK(1, 0) << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) -+#define QCA8K_VTU_FUNC0_EG_MODE_UNMOD FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x0) -+#define QCA8K_VTU_FUNC0_EG_MODE_PORT_UNMOD(_i) (QCA8K_VTU_FUNC0_EG_MODE_UNMOD << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) -+#define QCA8K_VTU_FUNC0_EG_MODE_UNTAG FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x1) -+#define QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(_i) (QCA8K_VTU_FUNC0_EG_MODE_UNTAG << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) -+#define QCA8K_VTU_FUNC0_EG_MODE_TAG FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x2) -+#define QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(_i) (QCA8K_VTU_FUNC0_EG_MODE_TAG << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) -+#define QCA8K_VTU_FUNC0_EG_MODE_NOT FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x3) -+#define QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(_i) (QCA8K_VTU_FUNC0_EG_MODE_NOT << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) - #define QCA8K_REG_VTU_FUNC1 0x614 - #define QCA8K_VTU_FUNC1_BUSY BIT(31) --#define QCA8K_VTU_FUNC1_VID_S 16 -+#define QCA8K_VTU_FUNC1_VID_MASK GENMASK(27, 16) - #define QCA8K_VTU_FUNC1_FULL BIT(4) - #define QCA8K_REG_GLOBAL_FW_CTRL0 0x620 - #define QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN BIT(10) - #define QCA8K_REG_GLOBAL_FW_CTRL1 0x624 --#define QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_S 24 --#define QCA8K_GLOBAL_FW_CTRL1_BC_DP_S 16 --#define QCA8K_GLOBAL_FW_CTRL1_MC_DP_S 8 --#define QCA8K_GLOBAL_FW_CTRL1_UC_DP_S 0 -+#define QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK GENMASK(30, 24) -+#define QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK GENMASK(22, 16) -+#define QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK GENMASK(14, 8) -+#define QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK GENMASK(6, 0) - #define QCA8K_PORT_LOOKUP_CTRL(_i) (0x660 + (_i) * 0xc) - #define QCA8K_PORT_LOOKUP_MEMBER GENMASK(6, 0) --#define QCA8K_PORT_LOOKUP_VLAN_MODE GENMASK(9, 8) --#define QCA8K_PORT_LOOKUP_VLAN_MODE_NONE (0 << 8) --#define QCA8K_PORT_LOOKUP_VLAN_MODE_FALLBACK (1 << 8) --#define QCA8K_PORT_LOOKUP_VLAN_MODE_CHECK (2 << 8) --#define QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE (3 << 8) -+#define QCA8K_PORT_LOOKUP_VLAN_MODE_MASK GENMASK(9, 8) -+#define QCA8K_PORT_LOOKUP_VLAN_MODE(x) FIELD_PREP(QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, x) -+#define QCA8K_PORT_LOOKUP_VLAN_MODE_NONE QCA8K_PORT_LOOKUP_VLAN_MODE(0x0) -+#define QCA8K_PORT_LOOKUP_VLAN_MODE_FALLBACK QCA8K_PORT_LOOKUP_VLAN_MODE(0x1) -+#define QCA8K_PORT_LOOKUP_VLAN_MODE_CHECK QCA8K_PORT_LOOKUP_VLAN_MODE(0x2) -+#define QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE QCA8K_PORT_LOOKUP_VLAN_MODE(0x3) - #define QCA8K_PORT_LOOKUP_STATE_MASK GENMASK(18, 16) --#define QCA8K_PORT_LOOKUP_STATE_DISABLED (0 << 16) --#define QCA8K_PORT_LOOKUP_STATE_BLOCKING (1 << 16) --#define QCA8K_PORT_LOOKUP_STATE_LISTENING (2 << 16) --#define QCA8K_PORT_LOOKUP_STATE_LEARNING (3 << 16) --#define QCA8K_PORT_LOOKUP_STATE_FORWARD (4 << 16) --#define QCA8K_PORT_LOOKUP_STATE GENMASK(18, 16) -+#define QCA8K_PORT_LOOKUP_STATE(x) FIELD_PREP(QCA8K_PORT_LOOKUP_STATE_MASK, x) -+#define QCA8K_PORT_LOOKUP_STATE_DISABLED QCA8K_PORT_LOOKUP_STATE(0x0) -+#define QCA8K_PORT_LOOKUP_STATE_BLOCKING QCA8K_PORT_LOOKUP_STATE(0x1) -+#define QCA8K_PORT_LOOKUP_STATE_LISTENING QCA8K_PORT_LOOKUP_STATE(0x2) -+#define QCA8K_PORT_LOOKUP_STATE_LEARNING QCA8K_PORT_LOOKUP_STATE(0x3) -+#define QCA8K_PORT_LOOKUP_STATE_FORWARD QCA8K_PORT_LOOKUP_STATE(0x4) - #define QCA8K_PORT_LOOKUP_LEARN BIT(20) - - #define QCA8K_REG_GLOBAL_FC_THRESH 0x800 --#define QCA8K_GLOBAL_FC_GOL_XON_THRES(x) ((x) << 16) --#define QCA8K_GLOBAL_FC_GOL_XON_THRES_S GENMASK(24, 16) --#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES(x) ((x) << 0) --#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES_S GENMASK(8, 0) -+#define QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK GENMASK(24, 16) -+#define QCA8K_GLOBAL_FC_GOL_XON_THRES(x) FIELD_PREP(QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK, x) -+#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK GENMASK(8, 0) -+#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES(x) FIELD_PREP(QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK, x) - - #define QCA8K_REG_PORT_HOL_CTRL0(_i) (0x970 + (_i) * 0x8) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF GENMASK(3, 0) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI0(x) ((x) << 0) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI1_BUF GENMASK(7, 4) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI1(x) ((x) << 4) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI2_BUF GENMASK(11, 8) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI2(x) ((x) << 8) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI3_BUF GENMASK(15, 12) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI3(x) ((x) << 12) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI4_BUF GENMASK(19, 16) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI4(x) ((x) << 16) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI5_BUF GENMASK(23, 20) --#define QCA8K_PORT_HOL_CTRL0_EG_PRI5(x) ((x) << 20) --#define QCA8K_PORT_HOL_CTRL0_EG_PORT_BUF GENMASK(29, 24) --#define QCA8K_PORT_HOL_CTRL0_EG_PORT(x) ((x) << 24) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF_MASK GENMASK(3, 0) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI0(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF_MASK, x) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI1_BUF_MASK GENMASK(7, 4) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI1(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI1_BUF_MASK, x) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI2_BUF_MASK GENMASK(11, 8) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI2(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI2_BUF_MASK, x) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI3_BUF_MASK GENMASK(15, 12) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI3(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI3_BUF_MASK, x) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI4_BUF_MASK GENMASK(19, 16) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI4(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI4_BUF_MASK, x) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI5_BUF_MASK GENMASK(23, 20) -+#define QCA8K_PORT_HOL_CTRL0_EG_PRI5(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI5_BUF_MASK, x) -+#define QCA8K_PORT_HOL_CTRL0_EG_PORT_BUF_MASK GENMASK(29, 24) -+#define QCA8K_PORT_HOL_CTRL0_EG_PORT(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PORT_BUF_MASK, x) - - #define QCA8K_REG_PORT_HOL_CTRL1(_i) (0x974 + (_i) * 0x8) --#define QCA8K_PORT_HOL_CTRL1_ING_BUF GENMASK(3, 0) --#define QCA8K_PORT_HOL_CTRL1_ING(x) ((x) << 0) -+#define QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK GENMASK(3, 0) -+#define QCA8K_PORT_HOL_CTRL1_ING(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK, x) - #define QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN BIT(6) - #define QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN BIT(7) - #define QCA8K_PORT_HOL_CTRL1_WRED_EN BIT(8) - #define QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN BIT(16) - - /* Pkt edit registers */ -+#define QCA8K_EGREES_VLAN_PORT_SHIFT(_i) (16 * ((_i) % 2)) -+#define QCA8K_EGREES_VLAN_PORT_MASK(_i) (GENMASK(11, 0) << QCA8K_EGREES_VLAN_PORT_SHIFT(_i)) -+#define QCA8K_EGREES_VLAN_PORT(_i, x) ((x) << QCA8K_EGREES_VLAN_PORT_SHIFT(_i)) - #define QCA8K_EGRESS_VLAN(x) (0x0c70 + (4 * (x / 2))) - - /* L3 registers */ diff --git a/target/linux/generic/backport-5.10/756-net-next-net-dsa-qca8k-move-regmap-init-in-probe-and-set-it.patch b/target/linux/generic/backport-5.10/756-net-next-net-dsa-qca8k-move-regmap-init-in-probe-and-set-it.patch deleted file mode 100644 index 9fcc74a7ce..0000000000 --- a/target/linux/generic/backport-5.10/756-net-next-net-dsa-qca8k-move-regmap-init-in-probe-and-set-it.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 36b8af12f424e7a7f60a935c60a0fd4aa0822378 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Mon, 22 Nov 2021 16:23:43 +0100 -Subject: net: dsa: qca8k: move regmap init in probe and set it mandatory - -In preparation for regmap conversion, move regmap init in the probe -function and make it mandatory as any read/write/rmw operation will be -converted to regmap API. - -Signed-off-by: Ansuel Smith -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 14 ++++++++------ - 1 file changed, 8 insertions(+), 6 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -1086,12 +1086,6 @@ qca8k_setup(struct dsa_switch *ds) - if (ret) - return ret; - -- /* Start by setting up the register mapping */ -- priv->regmap = devm_regmap_init(ds->dev, NULL, priv, -- &qca8k_regmap_config); -- if (IS_ERR(priv->regmap)) -- dev_warn(priv->dev, "regmap initialization failed"); -- - ret = qca8k_setup_mdio_bus(priv); - if (ret) - return ret; -@@ -2085,6 +2079,14 @@ qca8k_sw_probe(struct mdio_device *mdiod - gpiod_set_value_cansleep(priv->reset_gpio, 0); - } - -+ /* Start by setting up the register mapping */ -+ priv->regmap = devm_regmap_init(&mdiodev->dev, NULL, priv, -+ &qca8k_regmap_config); -+ if (IS_ERR(priv->regmap)) { -+ dev_err(priv->dev, "regmap initialization failed"); -+ return PTR_ERR(priv->regmap); -+ } -+ - /* Check the detected switch id */ - ret = qca8k_read_switch_id(priv); - if (ret) diff --git a/target/linux/generic/backport-5.10/758-net-next-net-dsa-qca8k-add-additional-MIB-counter-and-.patch b/target/linux/generic/backport-5.10/758-net-next-net-dsa-qca8k-add-additional-MIB-counter-and-.patch deleted file mode 100644 index 78bdf7f77d..0000000000 --- a/target/linux/generic/backport-5.10/758-net-next-net-dsa-qca8k-add-additional-MIB-counter-and-.patch +++ /dev/null @@ -1,120 +0,0 @@ -From c126f118b330ccf0db0dda4a4bd6c729865a205f Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Mon, 22 Nov 2021 16:23:45 +0100 -Subject: net: dsa: qca8k: add additional MIB counter and make it dynamic - -We are currently missing 2 additionals MIB counter present in QCA833x -switch. -QC832x switch have 39 MIB counter and QCA833X have 41 MIB counter. -Add the additional MIB counter and rework the MIB function to print the -correct supported counter from the match_data struct. - -Signed-off-by: Ansuel Smith -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 23 ++++++++++++++++++++--- - drivers/net/dsa/qca8k.h | 4 ++++ - 2 files changed, 24 insertions(+), 3 deletions(-) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -70,6 +70,8 @@ static const struct qca8k_mib_desc ar832 - MIB_DESC(1, 0x9c, "TxExcDefer"), - MIB_DESC(1, 0xa0, "TxDefer"), - MIB_DESC(1, 0xa4, "TxLateCol"), -+ MIB_DESC(1, 0xa8, "RXUnicast"), -+ MIB_DESC(1, 0xac, "TXUnicast"), - }; - - /* The 32bit switch registers are accessed indirectly. To achieve this we need -@@ -1605,12 +1607,16 @@ qca8k_phylink_mac_link_up(struct dsa_swi - static void - qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data) - { -+ const struct qca8k_match_data *match_data; -+ struct qca8k_priv *priv = ds->priv; - int i; - - if (stringset != ETH_SS_STATS) - return; - -- for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) -+ match_data = of_device_get_match_data(priv->dev); -+ -+ for (i = 0; i < match_data->mib_count; i++) - strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, - ETH_GSTRING_LEN); - } -@@ -1620,12 +1626,15 @@ qca8k_get_ethtool_stats(struct dsa_switc - uint64_t *data) - { - struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; -+ const struct qca8k_match_data *match_data; - const struct qca8k_mib_desc *mib; - u32 reg, i, val; - u32 hi = 0; - int ret; - -- for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) { -+ match_data = of_device_get_match_data(priv->dev); -+ -+ for (i = 0; i < match_data->mib_count; i++) { - mib = &ar8327_mib[i]; - reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; - -@@ -1648,10 +1657,15 @@ qca8k_get_ethtool_stats(struct dsa_switc - static int - qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset) - { -+ const struct qca8k_match_data *match_data; -+ struct qca8k_priv *priv = ds->priv; -+ - if (sset != ETH_SS_STATS) - return 0; - -- return ARRAY_SIZE(ar8327_mib); -+ match_data = of_device_get_match_data(priv->dev); -+ -+ return match_data->mib_count; - } - - static int -@@ -2146,14 +2160,17 @@ static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, - static const struct qca8k_match_data qca8327 = { - .id = QCA8K_ID_QCA8327, - .reduced_package = true, -+ .mib_count = QCA8K_QCA832X_MIB_COUNT, - }; - - static const struct qca8k_match_data qca8328 = { - .id = QCA8K_ID_QCA8327, -+ .mib_count = QCA8K_QCA832X_MIB_COUNT, - }; - - static const struct qca8k_match_data qca833x = { - .id = QCA8K_ID_QCA8337, -+ .mib_count = QCA8K_QCA833X_MIB_COUNT, - }; - - static const struct of_device_id qca8k_of_match[] = { ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -21,6 +21,9 @@ - #define PHY_ID_QCA8337 0x004dd036 - #define QCA8K_ID_QCA8337 0x13 - -+#define QCA8K_QCA832X_MIB_COUNT 39 -+#define QCA8K_QCA833X_MIB_COUNT 41 -+ - #define QCA8K_BUSY_WAIT_TIMEOUT 2000 - - #define QCA8K_NUM_FDB_RECORDS 2048 -@@ -279,6 +282,7 @@ struct ar8xxx_port_status { - struct qca8k_match_data { - u8 id; - bool reduced_package; -+ u8 mib_count; - }; - - enum { diff --git a/target/linux/generic/backport-5.10/759-net-next-net-dsa-qca8k-add-support-for-port-fast-aging.patch b/target/linux/generic/backport-5.10/759-net-next-net-dsa-qca8k-add-support-for-port-fast-aging.patch deleted file mode 100644 index 41efa89b5e..0000000000 --- a/target/linux/generic/backport-5.10/759-net-next-net-dsa-qca8k-add-support-for-port-fast-aging.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 4592538bfb0d5d3c3c8a1d7071724d081412ac91 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Mon, 22 Nov 2021 16:23:46 +0100 -Subject: net: dsa: qca8k: add support for port fast aging - -The switch supports fast aging by flushing any rule in the ARL -table for a specific port. - -Signed-off-by: Ansuel Smith -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 11 +++++++++++ - drivers/net/dsa/qca8k.h | 1 + - 2 files changed, 12 insertions(+) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -1790,6 +1790,16 @@ qca8k_port_bridge_leave(struct dsa_switc - QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port)); - } - -+static void -+qca8k_port_fast_age(struct dsa_switch *ds, int port) -+{ -+ struct qca8k_priv *priv = ds->priv; -+ -+ mutex_lock(&priv->reg_mutex); -+ qca8k_fdb_access(priv, QCA8K_FDB_FLUSH_PORT, port); -+ mutex_unlock(&priv->reg_mutex); -+} -+ - static int - qca8k_port_enable(struct dsa_switch *ds, int port, - struct phy_device *phy) -@@ -2005,6 +2015,7 @@ static const struct dsa_switch_ops qca8k - .port_stp_state_set = qca8k_port_stp_state_set, - .port_bridge_join = qca8k_port_bridge_join, - .port_bridge_leave = qca8k_port_bridge_leave, -+ .port_fast_age = qca8k_port_fast_age, - .port_fdb_add = qca8k_port_fdb_add, - .port_fdb_del = qca8k_port_fdb_del, - .port_fdb_dump = qca8k_port_fdb_dump, ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -262,6 +262,7 @@ enum qca8k_fdb_cmd { - QCA8K_FDB_FLUSH = 1, - QCA8K_FDB_LOAD = 2, - QCA8K_FDB_PURGE = 3, -+ QCA8K_FDB_FLUSH_PORT = 5, - QCA8K_FDB_NEXT = 6, - QCA8K_FDB_SEARCH = 7, - }; diff --git a/target/linux/generic/backport-5.10/760-net-next-net-dsa-qca8k-add-set_ageing_time-support.patch b/target/linux/generic/backport-5.10/760-net-next-net-dsa-qca8k-add-set_ageing_time-support.patch deleted file mode 100644 index f32e6ae93a..0000000000 --- a/target/linux/generic/backport-5.10/760-net-next-net-dsa-qca8k-add-set_ageing_time-support.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 6a3bdc5209f45d2af83aa92433ab6e5cf2297aa4 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Mon, 22 Nov 2021 16:23:47 +0100 -Subject: net: dsa: qca8k: add set_ageing_time support - -qca8k support setting ageing time in step of 7s. Add support for it and -set the max value accepted of 7645m. -Documentation talks about support for 10000m but that values doesn't -make sense as the value doesn't match the max value in the reg. - -Signed-off-by: Ansuel Smith -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 25 +++++++++++++++++++++++++ - drivers/net/dsa/qca8k.h | 3 +++ - 2 files changed, 28 insertions(+) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -1261,6 +1261,10 @@ qca8k_setup(struct dsa_switch *ds) - /* We don't have interrupts for link changes, so we need to poll */ - ds->pcs_poll = true; - -+ /* Set min a max ageing value supported */ -+ ds->ageing_time_min = 7000; -+ ds->ageing_time_max = 458745000; -+ - return 0; - } - -@@ -1801,6 +1805,26 @@ qca8k_port_fast_age(struct dsa_switch *d - } - - static int -+qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs) -+{ -+ struct qca8k_priv *priv = ds->priv; -+ unsigned int secs = msecs / 1000; -+ u32 val; -+ -+ /* AGE_TIME reg is set in 7s step */ -+ val = secs / 7; -+ -+ /* Handle case with 0 as val to NOT disable -+ * learning -+ */ -+ if (!val) -+ val = 1; -+ -+ return regmap_update_bits(priv->regmap, QCA8K_REG_ATU_CTRL, QCA8K_ATU_AGE_TIME_MASK, -+ QCA8K_ATU_AGE_TIME(val)); -+} -+ -+static int - qca8k_port_enable(struct dsa_switch *ds, int port, - struct phy_device *phy) - { -@@ -2006,6 +2030,7 @@ static const struct dsa_switch_ops qca8k - .get_strings = qca8k_get_strings, - .get_ethtool_stats = qca8k_get_ethtool_stats, - .get_sset_count = qca8k_get_sset_count, -+ .set_ageing_time = qca8k_set_ageing_time, - .get_mac_eee = qca8k_get_mac_eee, - .set_mac_eee = qca8k_set_mac_eee, - .port_enable = qca8k_port_enable, ---- a/drivers/net/dsa/qca8k.h -+++ b/drivers/net/dsa/qca8k.h -@@ -175,6 +175,9 @@ - #define QCA8K_VTU_FUNC1_BUSY BIT(31) - #define QCA8K_VTU_FUNC1_VID_MASK GENMASK(27, 16) - #define QCA8K_VTU_FUNC1_FULL BIT(4) -+#define QCA8K_REG_ATU_CTRL 0x618 -+#define QCA8K_ATU_AGE_TIME_MASK GENMASK(15, 0) -+#define QCA8K_ATU_AGE_TIME(x) FIELD_PREP(QCA8K_ATU_AGE_TIME_MASK, (x)) - #define QCA8K_REG_GLOBAL_FW_CTRL0 0x620 - #define QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN BIT(10) - #define QCA8K_REG_GLOBAL_FW_CTRL1 0x624 diff --git a/target/linux/generic/backport-5.10/761-net-next-net-dsa-qca8k-add-support-for-mdb_add-del.patch b/target/linux/generic/backport-5.10/761-net-next-net-dsa-qca8k-add-support-for-mdb_add-del.patch deleted file mode 100644 index e0daa88c31..0000000000 --- a/target/linux/generic/backport-5.10/761-net-next-net-dsa-qca8k-add-support-for-mdb_add-del.patch +++ /dev/null @@ -1,142 +0,0 @@ -From ba8f870dfa635113ce6e8095a5eb1835ecde2e9e Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Mon, 22 Nov 2021 16:23:48 +0100 -Subject: net: dsa: qca8k: add support for mdb_add/del - -Add support for mdb add/del function. The ARL table is used to insert -the rule. The rule will be searched, deleted and reinserted with the -port mask updated. The function will check if the rule has to be updated -or insert directly with no deletion of the old rule. -If every port is removed from the port mask, the rule is removed. -The rule is set STATIC in the ARL table (aka it doesn't age) to not be -flushed by fast age function. - -Signed-off-by: Ansuel Smith -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller ---- - drivers/net/dsa/qca8k.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 99 insertions(+) - ---- a/drivers/net/dsa/qca8k.c -+++ b/drivers/net/dsa/qca8k.c -@@ -436,6 +436,81 @@ qca8k_fdb_flush(struct qca8k_priv *priv) - } - - static int -+qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask, -+ const u8 *mac, u16 vid) -+{ -+ struct qca8k_fdb fdb = { 0 }; -+ int ret; -+ -+ mutex_lock(&priv->reg_mutex); -+ -+ qca8k_fdb_write(priv, vid, 0, mac, 0); -+ ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); -+ if (ret < 0) -+ goto exit; -+ -+ ret = qca8k_fdb_read(priv, &fdb); -+ if (ret < 0) -+ goto exit; -+ -+ /* Rule exist. Delete first */ -+ if (!fdb.aging) { -+ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); -+ if (ret) -+ goto exit; -+ } -+ -+ /* Add port to fdb portmask */ -+ fdb.port_mask |= port_mask; -+ -+ qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); -+ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); -+ -+exit: -+ mutex_unlock(&priv->reg_mutex); -+ return ret; -+} -+ -+static int -+qca8k_fdb_search_and_del(struct qca8k_priv *priv, u8 port_mask, -+ const u8 *mac, u16 vid) -+{ -+ struct qca8k_fdb fdb = { 0 }; -+ int ret; -+ -+ mutex_lock(&priv->reg_mutex); -+ -+ qca8k_fdb_write(priv, vid, 0, mac, 0); -+ ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); -+ if (ret < 0) -+ goto exit; -+ -+ /* Rule doesn't exist. Why delete? */ -+ if (!fdb.aging) { -+ ret = -EINVAL; -+ goto exit; -+ } -+ -+ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); -+ if (ret) -+ goto exit; -+ -+ /* Only port in the rule is this port. Don't re insert */ -+ if (fdb.port_mask == port_mask) -+ goto exit; -+ -+ /* Remove port from port mask */ -+ fdb.port_mask &= ~port_mask; -+ -+ qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); -+ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); -+ -+exit: -+ mutex_unlock(&priv->reg_mutex); -+ return ret; -+} -+ -+static int - qca8k_vlan_access(struct qca8k_priv *priv, enum qca8k_vlan_cmd cmd, u16 vid) - { - u32 reg; -@@ -1929,6 +2004,28 @@ qca8k_port_fdb_dump(struct dsa_switch *d - return 0; - } - -+static void -+qca8k_port_mdb_add(struct dsa_switch *ds, int port, -+ const struct switchdev_obj_port_mdb *mdb) -+{ -+ struct qca8k_priv *priv = ds->priv; -+ const u8 *addr = mdb->addr; -+ u16 vid = mdb->vid; -+ -+ qca8k_fdb_search_and_insert(priv, BIT(port), addr, vid); -+} -+ -+static int -+qca8k_port_mdb_del(struct dsa_switch *ds, int port, -+ const struct switchdev_obj_port_mdb *mdb) -+{ -+ struct qca8k_priv *priv = ds->priv; -+ const u8 *addr = mdb->addr; -+ u16 vid = mdb->vid; -+ -+ return qca8k_fdb_search_and_del(priv, BIT(port), addr, vid); -+} -+ - static int - qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, - struct switchdev_trans *trans) -@@ -2044,6 +2141,8 @@ static const struct dsa_switch_ops qca8k - .port_fdb_add = qca8k_port_fdb_add, - .port_fdb_del = qca8k_port_fdb_del, - .port_fdb_dump = qca8k_port_fdb_dump, -+ .port_mdb_add = qca8k_port_mdb_add, -+ .port_mdb_del = qca8k_port_mdb_del, - .port_vlan_filtering = qca8k_port_vlan_filtering, - .port_vlan_prepare = qca8k_port_vlan_prepare, - .port_vlan_add = qca8k_port_vlan_add, diff --git a/target/linux/generic/backport-5.10/762-v5.11-net-dsa-mt7530-support-setting-MTU.patch b/target/linux/generic/backport-5.10/762-v5.11-net-dsa-mt7530-support-setting-MTU.patch deleted file mode 100644 index f1fa461aec..0000000000 --- a/target/linux/generic/backport-5.10/762-v5.11-net-dsa-mt7530-support-setting-MTU.patch +++ /dev/null @@ -1,112 +0,0 @@ -From 9470174e7581e75a8ebd78964997314dfc2e706c Mon Sep 17 00:00:00 2001 -From: DENG Qingfang -Date: Tue, 3 Nov 2020 13:06:18 +0800 -Subject: [PATCH] net: dsa: mt7530: support setting MTU - -MT7530/7531 has a global RX packet length register, which can be used -to set MTU. - -Supported packet length values are 1522 (1518 if untagged), 1536, -1552, and multiple of 1024 (from 2048 to 15360). - -Signed-off-by: DENG Qingfang -Link: https://lore.kernel.org/r/20201103050618.11419-1-dqfext@gmail.com -Signed-off-by: Jakub Kicinski ---- - drivers/net/dsa/mt7530.c | 49 ++++++++++++++++++++++++++++++++++++++++ - drivers/net/dsa/mt7530.h | 12 ++++++++++ - 2 files changed, 61 insertions(+) - ---- a/drivers/net/dsa/mt7530.c -+++ b/drivers/net/dsa/mt7530.c -@@ -1018,6 +1018,53 @@ mt7530_port_disable(struct dsa_switch *d - mutex_unlock(&priv->reg_mutex); - } - -+static int -+mt7530_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu) -+{ -+ struct mt7530_priv *priv = ds->priv; -+ struct mii_bus *bus = priv->bus; -+ int length; -+ u32 val; -+ -+ /* When a new MTU is set, DSA always set the CPU port's MTU to the -+ * largest MTU of the slave ports. Because the switch only has a global -+ * RX length register, only allowing CPU port here is enough. -+ */ -+ if (!dsa_is_cpu_port(ds, port)) -+ return 0; -+ -+ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); -+ -+ val = mt7530_mii_read(priv, MT7530_GMACCR); -+ val &= ~MAX_RX_PKT_LEN_MASK; -+ -+ /* RX length also includes Ethernet header, MTK tag, and FCS length */ -+ length = new_mtu + ETH_HLEN + MTK_HDR_LEN + ETH_FCS_LEN; -+ if (length <= 1522) { -+ val |= MAX_RX_PKT_LEN_1522; -+ } else if (length <= 1536) { -+ val |= MAX_RX_PKT_LEN_1536; -+ } else if (length <= 1552) { -+ val |= MAX_RX_PKT_LEN_1552; -+ } else { -+ val &= ~MAX_RX_JUMBO_MASK; -+ val |= MAX_RX_JUMBO(DIV_ROUND_UP(length, 1024)); -+ val |= MAX_RX_PKT_LEN_JUMBO; -+ } -+ -+ mt7530_mii_write(priv, MT7530_GMACCR, val); -+ -+ mutex_unlock(&bus->mdio_lock); -+ -+ return 0; -+} -+ -+static int -+mt7530_port_max_mtu(struct dsa_switch *ds, int port) -+{ -+ return MT7530_MAX_MTU; -+} -+ - static void - mt7530_stp_state_set(struct dsa_switch *ds, int port, u8 state) - { -@@ -2650,6 +2697,8 @@ static const struct dsa_switch_ops mt753 - .get_sset_count = mt7530_get_sset_count, - .port_enable = mt7530_port_enable, - .port_disable = mt7530_port_disable, -+ .port_change_mtu = mt7530_port_change_mtu, -+ .port_max_mtu = mt7530_port_max_mtu, - .port_stp_state_set = mt7530_stp_state_set, - .port_bridge_join = mt7530_port_bridge_join, - .port_bridge_leave = mt7530_port_bridge_leave, ---- a/drivers/net/dsa/mt7530.h -+++ b/drivers/net/dsa/mt7530.h -@@ -11,6 +11,9 @@ - #define MT7530_NUM_FDB_RECORDS 2048 - #define MT7530_ALL_MEMBERS 0xff - -+#define MTK_HDR_LEN 4 -+#define MT7530_MAX_MTU (15 * 1024 - ETH_HLEN - ETH_FCS_LEN - MTK_HDR_LEN) -+ - enum mt753x_id { - ID_MT7530 = 0, - ID_MT7621 = 1, -@@ -301,6 +304,15 @@ enum mt7530_vlan_port_attr { - #define MT7531_DBG_CNT(x) (0x3018 + (x) * 0x100) - #define MT7531_DIS_CLR BIT(31) - -+#define MT7530_GMACCR 0x30e0 -+#define MAX_RX_JUMBO(x) ((x) << 2) -+#define MAX_RX_JUMBO_MASK GENMASK(5, 2) -+#define MAX_RX_PKT_LEN_MASK GENMASK(1, 0) -+#define MAX_RX_PKT_LEN_1522 0x0 -+#define MAX_RX_PKT_LEN_1536 0x1 -+#define MAX_RX_PKT_LEN_1552 0x2 -+#define MAX_RX_PKT_LEN_JUMBO 0x3 -+ - /* Register for MIB */ - #define MT7530_PORT_MIB_COUNTER(x) (0x4000 + (x) * 0x100) - #define MT7530_MIB_CCR 0x4fe0 diff --git a/target/linux/generic/backport-5.10/763-v5.11-net-dsa-mt7530-enable-MTU-normalization.patch b/target/linux/generic/backport-5.10/763-v5.11-net-dsa-mt7530-enable-MTU-normalization.patch deleted file mode 100644 index a239549758..0000000000 --- a/target/linux/generic/backport-5.10/763-v5.11-net-dsa-mt7530-enable-MTU-normalization.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 771c8901568dd8776a260aa93db41be88a60389e Mon Sep 17 00:00:00 2001 -From: DENG Qingfang -Date: Fri, 11 Dec 2020 01:03:22 +0800 -Subject: [PATCH] net: dsa: mt7530: enable MTU normalization - -MT7530 has a global RX length register, so we are actually changing its -MRU. -Enable MTU normalization for this reason. - -Signed-off-by: DENG Qingfang -Acked-by: Landen Chao -Reviewed-by: Vladimir Oltean -Link: https://lore.kernel.org/r/20201210170322.3433-1-dqfext@gmail.com -Signed-off-by: Jakub Kicinski ---- - drivers/net/dsa/mt7530.c | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/drivers/net/dsa/mt7530.c -+++ b/drivers/net/dsa/mt7530.c -@@ -1706,6 +1706,7 @@ mt7530_setup(struct dsa_switch *ds) - */ - dn = dsa_to_port(ds, MT7530_CPU_PORT)->master->dev.of_node->parent; - ds->configure_vlan_while_not_filtering = true; -+ ds->mtu_enforcement_ingress = true; - - if (priv->id == ID_MT7530) { - regulator_set_voltage(priv->core_pwr, 1000000, 1000000); -@@ -1953,6 +1954,7 @@ mt7531_setup(struct dsa_switch *ds) - } - - ds->configure_vlan_while_not_filtering = true; -+ ds->mtu_enforcement_ingress = true; - - /* Flush the FDB table */ - ret = mt7530_fdb_cmd(priv, MT7530_FDB_FLUSH, NULL); diff --git a/target/linux/generic/backport-5.10/764-v5.11-net-dsa-mt7530-support-setting-ageing-time.patch b/target/linux/generic/backport-5.10/764-v5.11-net-dsa-mt7530-support-setting-ageing-time.patch deleted file mode 100644 index 0b28a4626e..0000000000 --- a/target/linux/generic/backport-5.10/764-v5.11-net-dsa-mt7530-support-setting-ageing-time.patch +++ /dev/null @@ -1,99 +0,0 @@ -From ea6d5c924e391872d402acac38461a5f8261e57f Mon Sep 17 00:00:00 2001 -From: DENG Qingfang -Date: Tue, 8 Dec 2020 15:00:28 +0800 -Subject: [PATCH] net: dsa: mt7530: support setting ageing time - -MT7530 has a global address age control register, so use it to set -ageing time. - -The applied timer is (AGE_CNT + 1) * (AGE_UNIT + 1) seconds - -Signed-off-by: DENG Qingfang -Reviewed-by: Andrew Lunn -Reviewed-by: Vladimir Oltean -Reviewed-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - drivers/net/dsa/mt7530.c | 41 ++++++++++++++++++++++++++++++++++++++++ - drivers/net/dsa/mt7530.h | 13 +++++++++++++ - 2 files changed, 54 insertions(+) - ---- a/drivers/net/dsa/mt7530.c -+++ b/drivers/net/dsa/mt7530.c -@@ -873,6 +873,46 @@ mt7530_get_sset_count(struct dsa_switch - return ARRAY_SIZE(mt7530_mib); - } - -+static int -+mt7530_set_ageing_time(struct dsa_switch *ds, unsigned int msecs) -+{ -+ struct mt7530_priv *priv = ds->priv; -+ unsigned int secs = msecs / 1000; -+ unsigned int tmp_age_count; -+ unsigned int error = -1; -+ unsigned int age_count; -+ unsigned int age_unit; -+ -+ /* Applied timer is (AGE_CNT + 1) * (AGE_UNIT + 1) seconds */ -+ if (secs < 1 || secs > (AGE_CNT_MAX + 1) * (AGE_UNIT_MAX + 1)) -+ return -ERANGE; -+ -+ /* iterate through all possible age_count to find the closest pair */ -+ for (tmp_age_count = 0; tmp_age_count <= AGE_CNT_MAX; ++tmp_age_count) { -+ unsigned int tmp_age_unit = secs / (tmp_age_count + 1) - 1; -+ -+ if (tmp_age_unit <= AGE_UNIT_MAX) { -+ unsigned int tmp_error = secs - -+ (tmp_age_count + 1) * (tmp_age_unit + 1); -+ -+ /* found a closer pair */ -+ if (error > tmp_error) { -+ error = tmp_error; -+ age_count = tmp_age_count; -+ age_unit = tmp_age_unit; -+ } -+ -+ /* found the exact match, so break the loop */ -+ if (!error) -+ break; -+ } -+ } -+ -+ mt7530_write(priv, MT7530_AAC, AGE_CNT(age_count) | AGE_UNIT(age_unit)); -+ -+ return 0; -+} -+ - static void mt7530_setup_port5(struct dsa_switch *ds, phy_interface_t interface) - { - struct mt7530_priv *priv = ds->priv; -@@ -2697,6 +2737,7 @@ static const struct dsa_switch_ops mt753 - .phy_write = mt753x_phy_write, - .get_ethtool_stats = mt7530_get_ethtool_stats, - .get_sset_count = mt7530_get_sset_count, -+ .set_ageing_time = mt7530_set_ageing_time, - .port_enable = mt7530_port_enable, - .port_disable = mt7530_port_disable, - .port_change_mtu = mt7530_port_change_mtu, ---- a/drivers/net/dsa/mt7530.h -+++ b/drivers/net/dsa/mt7530.h -@@ -161,6 +161,19 @@ enum mt7530_vlan_egress_attr { - MT7530_VLAN_EGRESS_STACK = 3, - }; - -+/* Register for address age control */ -+#define MT7530_AAC 0xa0 -+/* Disable ageing */ -+#define AGE_DIS BIT(20) -+/* Age count */ -+#define AGE_CNT_MASK GENMASK(19, 12) -+#define AGE_CNT_MAX 0xff -+#define AGE_CNT(x) (AGE_CNT_MASK & ((x) << 12)) -+/* Age unit */ -+#define AGE_UNIT_MASK GENMASK(11, 0) -+#define AGE_UNIT_MAX 0xfff -+#define AGE_UNIT(x) (AGE_UNIT_MASK & (x)) -+ - /* Register for port STP state control */ - #define MT7530_SSP_P(x) (0x2000 + ((x) * 0x100)) - #define FID_PST(x) ((x) & 0x3) diff --git a/target/linux/generic/backport-5.10/770-v5.15-net-dsa-mt7530-support-MDB-operations.patch b/target/linux/generic/backport-5.10/770-v5.15-net-dsa-mt7530-support-MDB-operations.patch deleted file mode 100644 index 99f49972ff..0000000000 --- a/target/linux/generic/backport-5.10/770-v5.15-net-dsa-mt7530-support-MDB-operations.patch +++ /dev/null @@ -1,171 +0,0 @@ -From 1f11a07a33bc26997c18b633d63f088bf75d11f2 Mon Sep 17 00:00:00 2001 -From: DENG Qingfang -Date: Tue, 24 Aug 2021 11:37:50 +0800 -Subject: [PATCH] net: dsa: mt7530: support MDB operations - -This is a partial backport of commit 5a30833b9a16f8d1aa15de06636f9317ca51f9df -("net: dsa: mt7530: support MDB and bridge flag operations") upstream. - -Signed-off-by: DENG Qingfang ---- - drivers/net/dsa/mt7530.c | 78 ++++++++++++++++++++++++++++++++++++++-- - net/dsa/tag_mtk.c | 14 +------- - 2 files changed, 76 insertions(+), 16 deletions(-) - ---- a/drivers/net/dsa/mt7530.c -+++ b/drivers/net/dsa/mt7530.c -@@ -1001,9 +1001,6 @@ mt753x_cpu_port_enable(struct dsa_switch - mt7530_write(priv, MT7530_PVC_P(port), - PORT_SPEC_TAG); - -- /* Unknown multicast frame forwarding to the cpu port */ -- mt7530_rmw(priv, MT7530_MFC, UNM_FFP_MASK, UNM_FFP(BIT(port))); -- - /* Set CPU port number */ - if (priv->id == ID_MT7621) - mt7530_rmw(priv, MT7530_MFC, CPU_MASK, CPU_EN | CPU_PORT(port)); -@@ -1134,6 +1131,20 @@ mt7530_stp_state_set(struct dsa_switch * - } - - static int -+mt7530_port_egress_floods(struct dsa_switch *ds, int port, -+ bool unicast, bool multicast) -+{ -+ struct mt7530_priv *priv = ds->priv; -+ -+ mt7530_rmw(priv, MT7530_MFC, -+ UNU_FFP(BIT(port)) | UNM_FFP(BIT(port)), -+ (unicast ? UNU_FFP(BIT(port)) : 0) | -+ (multicast ? UNM_FFP(BIT(port)) : 0)); -+ -+ return 0; -+} -+ -+static int - mt7530_port_bridge_join(struct dsa_switch *ds, int port, - struct net_device *bridge) - { -@@ -1334,6 +1345,63 @@ err: - } - - static int -+mt7530_port_mdb_prepare(struct dsa_switch *ds, int port, -+ const struct switchdev_obj_port_mdb *mdb) -+{ -+ return 0; -+} -+ -+static void -+mt7530_port_mdb_add(struct dsa_switch *ds, int port, -+ const struct switchdev_obj_port_mdb *mdb) -+{ -+ struct mt7530_priv *priv = ds->priv; -+ const u8 *addr = mdb->addr; -+ u16 vid = mdb->vid; -+ u8 port_mask = 0; -+ -+ mutex_lock(&priv->reg_mutex); -+ -+ mt7530_fdb_write(priv, vid, 0, addr, 0, STATIC_EMP); -+ if (!mt7530_fdb_cmd(priv, MT7530_FDB_READ, NULL)) -+ port_mask = (mt7530_read(priv, MT7530_ATRD) >> PORT_MAP) -+ & PORT_MAP_MASK; -+ -+ port_mask |= BIT(port); -+ mt7530_fdb_write(priv, vid, port_mask, addr, -1, STATIC_ENT); -+ mt7530_fdb_cmd(priv, MT7530_FDB_WRITE, NULL); -+ -+ mutex_unlock(&priv->reg_mutex); -+} -+ -+static int -+mt7530_port_mdb_del(struct dsa_switch *ds, int port, -+ const struct switchdev_obj_port_mdb *mdb) -+{ -+ struct mt7530_priv *priv = ds->priv; -+ const u8 *addr = mdb->addr; -+ u16 vid = mdb->vid; -+ u8 port_mask = 0; -+ int ret; -+ -+ mutex_lock(&priv->reg_mutex); -+ -+ mt7530_fdb_write(priv, vid, 0, addr, 0, STATIC_EMP); -+ if (!mt7530_fdb_cmd(priv, MT7530_FDB_READ, NULL)) -+ port_mask = (mt7530_read(priv, MT7530_ATRD) >> PORT_MAP) -+ & PORT_MAP_MASK; -+ -+ port_mask &= ~BIT(port); -+ mt7530_fdb_write(priv, vid, port_mask, addr, -1, -+ port_mask ? STATIC_ENT : STATIC_EMP); -+ ret = mt7530_fdb_cmd(priv, MT7530_FDB_WRITE, NULL); -+ -+ mutex_unlock(&priv->reg_mutex); -+ -+ return ret; -+} -+ -+static int - mt7530_vlan_cmd(struct mt7530_priv *priv, enum mt7530_vlan_cmd cmd, u16 vid) - { - struct mt7530_dummy_poll p; -@@ -2743,11 +2811,15 @@ static const struct dsa_switch_ops mt753 - .port_change_mtu = mt7530_port_change_mtu, - .port_max_mtu = mt7530_port_max_mtu, - .port_stp_state_set = mt7530_stp_state_set, -+ .port_egress_floods = mt7530_port_egress_floods, - .port_bridge_join = mt7530_port_bridge_join, - .port_bridge_leave = mt7530_port_bridge_leave, - .port_fdb_add = mt7530_port_fdb_add, - .port_fdb_del = mt7530_port_fdb_del, - .port_fdb_dump = mt7530_port_fdb_dump, -+ .port_mdb_prepare = mt7530_port_mdb_prepare, -+ .port_mdb_add = mt7530_port_mdb_add, -+ .port_mdb_del = mt7530_port_mdb_del, - .port_vlan_filtering = mt7530_port_vlan_filtering, - .port_vlan_prepare = mt7530_port_vlan_prepare, - .port_vlan_add = mt7530_port_vlan_add, ---- a/net/dsa/tag_mtk.c -+++ b/net/dsa/tag_mtk.c -@@ -24,9 +24,6 @@ static struct sk_buff *mtk_tag_xmit(stru - struct dsa_port *dp = dsa_slave_to_port(dev); - u8 xmit_tpid; - u8 *mtk_tag; -- unsigned char *dest = eth_hdr(skb)->h_dest; -- bool is_multicast_skb = is_multicast_ether_addr(dest) && -- !is_broadcast_ether_addr(dest); - - /* Build the special tag after the MAC Source Address. If VLAN header - * is present, it's required that VLAN header and special tag is -@@ -55,10 +52,6 @@ static struct sk_buff *mtk_tag_xmit(stru - mtk_tag[0] = xmit_tpid; - mtk_tag[1] = (1 << dp->index) & MTK_HDR_XMIT_DP_BIT_MASK; - -- /* Disable SA learning for multicast frames */ -- if (unlikely(is_multicast_skb)) -- mtk_tag[1] |= MTK_HDR_XMIT_SA_DIS; -- - /* Tag control information is kept for 802.1Q */ - if (xmit_tpid == MTK_HDR_XMIT_UNTAGGED) { - mtk_tag[2] = 0; -@@ -74,9 +67,6 @@ static struct sk_buff *mtk_tag_rcv(struc - u16 hdr; - int port; - __be16 *phdr; -- unsigned char *dest = eth_hdr(skb)->h_dest; -- bool is_multicast_skb = is_multicast_ether_addr(dest) && -- !is_broadcast_ether_addr(dest); - - if (unlikely(!pskb_may_pull(skb, MTK_HDR_LEN))) - return NULL; -@@ -102,9 +92,7 @@ static struct sk_buff *mtk_tag_rcv(struc - if (!skb->dev) - return NULL; - -- /* Only unicast or broadcast frames are offloaded */ -- if (likely(!is_multicast_skb)) -- dsa_default_offload_fwd_mark(skb); -+ dsa_default_offload_fwd_mark(skb); - - return skb; - } diff --git a/target/linux/generic/backport-5.10/771-v5.14-net-phy-add-MediaTek-Gigabit-Ethernet-PHY-driver.patch b/target/linux/generic/backport-5.10/771-v5.14-net-phy-add-MediaTek-Gigabit-Ethernet-PHY-driver.patch deleted file mode 100644 index 67e3ca91ed..0000000000 --- a/target/linux/generic/backport-5.10/771-v5.14-net-phy-add-MediaTek-Gigabit-Ethernet-PHY-driver.patch +++ /dev/null @@ -1,159 +0,0 @@ -From e40d2cca01893c1941f5959b14bb0cd0d4f4d099 Mon Sep 17 00:00:00 2001 -From: DENG Qingfang -Date: Wed, 19 May 2021 11:31:59 +0800 -Subject: [PATCH] net: phy: add MediaTek Gigabit Ethernet PHY driver - -Add support for MediaTek Gigabit Ethernet PHYs found in MT7530 and -MT7531 switches. -The initialization procedure is from the vendor driver, but due to lack -of documentation, the function of some register values remains unknown. - -Signed-off-by: DENG Qingfang -Signed-off-by: David S. Miller ---- - drivers/net/phy/Kconfig | 5 ++ - drivers/net/phy/Makefile | 1 + - drivers/net/phy/mediatek-ge.c | 116 ++++++++++++++++++++++++++++++++++ - 3 files changed, 122 insertions(+) - create mode 100644 drivers/net/phy/mediatek-ge.c - ---- a/drivers/net/phy/Kconfig -+++ b/drivers/net/phy/Kconfig -@@ -201,6 +201,11 @@ config MARVELL_10G_PHY - help - Support for the Marvell Alaska MV88X3310 and compatible PHYs. - -+config MEDIATEK_GE_PHY -+ tristate "MediaTek PHYs" -+ help -+ Supports the MediaTek switch integrated PHYs. -+ - config MICREL_PHY - tristate "Micrel PHYs" - help ---- a/drivers/net/phy/Makefile -+++ b/drivers/net/phy/Makefile -@@ -63,6 +63,7 @@ obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c - obj-$(CONFIG_LXT_PHY) += lxt.o - obj-$(CONFIG_MARVELL_10G_PHY) += marvell10g.o - obj-$(CONFIG_MARVELL_PHY) += marvell.o -+obj-$(CONFIG_MEDIATEK_GE_PHY) += mediatek-ge.o - obj-$(CONFIG_MESON_GXL_PHY) += meson-gxl.o - obj-$(CONFIG_MICREL_KS8995MA) += spi_ks8995.o - obj-$(CONFIG_MICREL_PHY) += micrel.o ---- /dev/null -+++ b/drivers/net/phy/mediatek-ge.c -@@ -0,0 +1,113 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+#include -+#include -+#include -+ -+#define MTK_T10_TEST_CONTROL 0x145 -+#define MTK_PHY_TP_MASK GENMASK(4, 3) -+#define MTK_PHY_TP_AUTO 0 -+#define MTK_PHY_TP_MDI 2 -+#define MTK_PHY_TP_MDIX 3 -+ -+#define MTK_EXT_PAGE_ACCESS 0x1f -+#define MTK_PHY_PAGE_STANDARD 0x0000 -+#define MTK_PHY_PAGE_EXTENDED 0x0001 -+#define MTK_PHY_PAGE_EXTENDED_2 0x0002 -+#define MTK_PHY_PAGE_EXTENDED_3 0x0003 -+#define MTK_PHY_PAGE_EXTENDED_2A30 0x2a30 -+#define MTK_PHY_PAGE_EXTENDED_52B5 0x52b5 -+ -+static int mtk_gephy_read_page(struct phy_device *phydev) -+{ -+ return __phy_read(phydev, MTK_EXT_PAGE_ACCESS); -+} -+ -+static int mtk_gephy_write_page(struct phy_device *phydev, int page) -+{ -+ return __phy_write(phydev, MTK_EXT_PAGE_ACCESS, page); -+} -+ -+static void mtk_gephy_config_init(struct phy_device *phydev) -+{ -+ /* Disable EEE */ -+ phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0); -+ -+ /* Enable HW auto downshift */ -+ phy_modify_paged(phydev, MTK_PHY_PAGE_EXTENDED, 0x14, 0, BIT(4)); -+ -+ /* Increase SlvDPSready time */ -+ phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5); -+ __phy_write(phydev, 0x10, 0xafae); -+ __phy_write(phydev, 0x12, 0x2f); -+ __phy_write(phydev, 0x10, 0x8fae); -+ phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0); -+ -+ /* Adjust 100_mse_threshold */ -+ phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x123, 0xffff); -+ -+ /* Disable mcc */ -+ phy_write_mmd(phydev, MDIO_MMD_VEND1, 0xa6, 0x300); -+} -+ -+static int mt7530_phy_config_init(struct phy_device *phydev) -+{ -+ mtk_gephy_config_init(phydev); -+ -+ /* Increase post_update_timer */ -+ phy_write_paged(phydev, MTK_PHY_PAGE_EXTENDED_3, 0x11, 0x4b); -+ -+ return 0; -+} -+ -+static int mt7531_phy_config_init(struct phy_device *phydev) -+{ -+ mtk_gephy_config_init(phydev); -+ -+ /* PHY link down power saving enable */ -+ phy_set_bits(phydev, 0x17, BIT(4)); -+ phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, 0xc6, 0x300); -+ -+ /* Set TX Pair delay selection */ -+ phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x13, 0x404); -+ phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x14, 0x404); -+ -+ return 0; -+} -+ -+static struct phy_driver mtk_gephy_driver[] = { -+ { -+ PHY_ID_MATCH_EXACT(0x03a29412), -+ .name = "MediaTek MT7530 PHY", -+ .config_init = mt7530_phy_config_init, -+ /* Interrupts are handled by the switch, not the PHY -+ * itself. -+ */ -+ .config_intr = genphy_no_config_intr, -+ .ack_interrupt = genphy_no_ack_interrupt, -+ .suspend = genphy_suspend, -+ .resume = genphy_resume, -+ .read_page = mtk_gephy_read_page, -+ .write_page = mtk_gephy_write_page, -+ }, -+ { -+ PHY_ID_MATCH_EXACT(0x03a29441), -+ .name = "MediaTek MT7531 PHY", -+ .config_init = mt7531_phy_config_init, -+ /* Interrupts are handled by the switch, not the PHY -+ * itself. -+ */ -+ .config_intr = genphy_no_config_intr, -+ .ack_interrupt = genphy_no_ack_interrupt, -+ .suspend = genphy_suspend, -+ .resume = genphy_resume, -+ .read_page = mtk_gephy_read_page, -+ .write_page = mtk_gephy_write_page, -+ }, -+}; -+ -+module_phy_driver(mtk_gephy_driver); -+ -+static struct mdio_device_id __maybe_unused mtk_gephy_tbl[] = { -+ { PHY_ID_MATCH_VENDOR(0x03a29400) }, -+ { } -+}; diff --git a/target/linux/generic/backport-5.10/772-v5.14-net-dsa-mt7530-add-interrupt-support.patch b/target/linux/generic/backport-5.10/772-v5.14-net-dsa-mt7530-add-interrupt-support.patch deleted file mode 100644 index c7e3a4ceb4..0000000000 --- a/target/linux/generic/backport-5.10/772-v5.14-net-dsa-mt7530-add-interrupt-support.patch +++ /dev/null @@ -1,425 +0,0 @@ -From ba751e28d44255744a30190faad0ca09b455c44d Mon Sep 17 00:00:00 2001 -From: DENG Qingfang -Date: Wed, 19 May 2021 11:32:00 +0800 -Subject: [PATCH] net: dsa: mt7530: add interrupt support - -Add support for MT7530 interrupt controller to handle internal PHYs. -In order to assign an IRQ number to each PHY, the registration of MDIO bus -is also done in this driver. - -Signed-off-by: DENG Qingfang -Reviewed-by: Andrew Lunn -Reviewed-by: Florian Fainelli -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller ---- - drivers/net/dsa/mt7530.c | 264 +++++++++++++++++++++++++++++++++++---- - drivers/net/dsa/mt7530.h | 20 ++- - 2 files changed, 256 insertions(+), 28 deletions(-) - ---- a/drivers/net/dsa/mt7530.c -+++ b/drivers/net/dsa/mt7530.c -@@ -10,6 +10,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -603,18 +604,14 @@ mt7530_mib_reset(struct dsa_switch *ds) - mt7530_write(priv, MT7530_MIB_CCR, CCR_MIB_ACTIVATE); - } - --static int mt7530_phy_read(struct dsa_switch *ds, int port, int regnum) -+static int mt7530_phy_read(struct mt7530_priv *priv, int port, int regnum) - { -- struct mt7530_priv *priv = ds->priv; -- - return mdiobus_read_nested(priv->bus, port, regnum); - } - --static int mt7530_phy_write(struct dsa_switch *ds, int port, int regnum, -+static int mt7530_phy_write(struct mt7530_priv *priv, int port, int regnum, - u16 val) - { -- struct mt7530_priv *priv = ds->priv; -- - return mdiobus_write_nested(priv->bus, port, regnum, val); - } - -@@ -792,9 +789,8 @@ out: - } - - static int --mt7531_ind_phy_read(struct dsa_switch *ds, int port, int regnum) -+mt7531_ind_phy_read(struct mt7530_priv *priv, int port, int regnum) - { -- struct mt7530_priv *priv = ds->priv; - int devad; - int ret; - -@@ -810,10 +806,9 @@ mt7531_ind_phy_read(struct dsa_switch *d - } - - static int --mt7531_ind_phy_write(struct dsa_switch *ds, int port, int regnum, -+mt7531_ind_phy_write(struct mt7530_priv *priv, int port, int regnum, - u16 data) - { -- struct mt7530_priv *priv = ds->priv; - int devad; - int ret; - -@@ -829,6 +824,22 @@ mt7531_ind_phy_write(struct dsa_switch * - return ret; - } - -+static int -+mt753x_phy_read(struct mii_bus *bus, int port, int regnum) -+{ -+ struct mt7530_priv *priv = bus->priv; -+ -+ return priv->info->phy_read(priv, port, regnum); -+} -+ -+static int -+mt753x_phy_write(struct mii_bus *bus, int port, int regnum, u16 val) -+{ -+ struct mt7530_priv *priv = bus->priv; -+ -+ return priv->info->phy_write(priv, port, regnum, val); -+} -+ - static void - mt7530_get_strings(struct dsa_switch *ds, int port, u32 stringset, - uint8_t *data) -@@ -1796,6 +1807,210 @@ mt7530_setup_gpio(struct mt7530_priv *pr - return devm_gpiochip_add_data(dev, gc, priv); - } - -+static irqreturn_t -+mt7530_irq_thread_fn(int irq, void *dev_id) -+{ -+ struct mt7530_priv *priv = dev_id; -+ bool handled = false; -+ u32 val; -+ int p; -+ -+ mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); -+ val = mt7530_mii_read(priv, MT7530_SYS_INT_STS); -+ mt7530_mii_write(priv, MT7530_SYS_INT_STS, val); -+ mutex_unlock(&priv->bus->mdio_lock); -+ -+ for (p = 0; p < MT7530_NUM_PHYS; p++) { -+ if (BIT(p) & val) { -+ unsigned int irq; -+ -+ irq = irq_find_mapping(priv->irq_domain, p); -+ handle_nested_irq(irq); -+ handled = true; -+ } -+ } -+ -+ return IRQ_RETVAL(handled); -+} -+ -+static void -+mt7530_irq_mask(struct irq_data *d) -+{ -+ struct mt7530_priv *priv = irq_data_get_irq_chip_data(d); -+ -+ priv->irq_enable &= ~BIT(d->hwirq); -+} -+ -+static void -+mt7530_irq_unmask(struct irq_data *d) -+{ -+ struct mt7530_priv *priv = irq_data_get_irq_chip_data(d); -+ -+ priv->irq_enable |= BIT(d->hwirq); -+} -+ -+static void -+mt7530_irq_bus_lock(struct irq_data *d) -+{ -+ struct mt7530_priv *priv = irq_data_get_irq_chip_data(d); -+ -+ mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); -+} -+ -+static void -+mt7530_irq_bus_sync_unlock(struct irq_data *d) -+{ -+ struct mt7530_priv *priv = irq_data_get_irq_chip_data(d); -+ -+ mt7530_mii_write(priv, MT7530_SYS_INT_EN, priv->irq_enable); -+ mutex_unlock(&priv->bus->mdio_lock); -+} -+ -+static struct irq_chip mt7530_irq_chip = { -+ .name = KBUILD_MODNAME, -+ .irq_mask = mt7530_irq_mask, -+ .irq_unmask = mt7530_irq_unmask, -+ .irq_bus_lock = mt7530_irq_bus_lock, -+ .irq_bus_sync_unlock = mt7530_irq_bus_sync_unlock, -+}; -+ -+static int -+mt7530_irq_map(struct irq_domain *domain, unsigned int irq, -+ irq_hw_number_t hwirq) -+{ -+ irq_set_chip_data(irq, domain->host_data); -+ irq_set_chip_and_handler(irq, &mt7530_irq_chip, handle_simple_irq); -+ irq_set_nested_thread(irq, true); -+ irq_set_noprobe(irq); -+ -+ return 0; -+} -+ -+static const struct irq_domain_ops mt7530_irq_domain_ops = { -+ .map = mt7530_irq_map, -+ .xlate = irq_domain_xlate_onecell, -+}; -+ -+static void -+mt7530_setup_mdio_irq(struct mt7530_priv *priv) -+{ -+ struct dsa_switch *ds = priv->ds; -+ int p; -+ -+ for (p = 0; p < MT7530_NUM_PHYS; p++) { -+ if (BIT(p) & ds->phys_mii_mask) { -+ unsigned int irq; -+ -+ irq = irq_create_mapping(priv->irq_domain, p); -+ ds->slave_mii_bus->irq[p] = irq; -+ } -+ } -+} -+ -+static int -+mt7530_setup_irq(struct mt7530_priv *priv) -+{ -+ struct device *dev = priv->dev; -+ struct device_node *np = dev->of_node; -+ int ret; -+ -+ if (!of_property_read_bool(np, "interrupt-controller")) { -+ dev_info(dev, "no interrupt support\n"); -+ return 0; -+ } -+ -+ priv->irq = of_irq_get(np, 0); -+ if (priv->irq <= 0) { -+ dev_err(dev, "failed to get parent IRQ: %d\n", priv->irq); -+ return priv->irq ? : -EINVAL; -+ } -+ -+ priv->irq_domain = irq_domain_add_linear(np, MT7530_NUM_PHYS, -+ &mt7530_irq_domain_ops, priv); -+ if (!priv->irq_domain) { -+ dev_err(dev, "failed to create IRQ domain\n"); -+ return -ENOMEM; -+ } -+ -+ /* This register must be set for MT7530 to properly fire interrupts */ -+ if (priv->id != ID_MT7531) -+ mt7530_set(priv, MT7530_TOP_SIG_CTRL, TOP_SIG_CTRL_NORMAL); -+ -+ ret = request_threaded_irq(priv->irq, NULL, mt7530_irq_thread_fn, -+ IRQF_ONESHOT, KBUILD_MODNAME, priv); -+ if (ret) { -+ irq_domain_remove(priv->irq_domain); -+ dev_err(dev, "failed to request IRQ: %d\n", ret); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static void -+mt7530_free_mdio_irq(struct mt7530_priv *priv) -+{ -+ int p; -+ -+ for (p = 0; p < MT7530_NUM_PHYS; p++) { -+ if (BIT(p) & priv->ds->phys_mii_mask) { -+ unsigned int irq; -+ -+ irq = irq_find_mapping(priv->irq_domain, p); -+ irq_dispose_mapping(irq); -+ } -+ } -+} -+ -+static void -+mt7530_free_irq_common(struct mt7530_priv *priv) -+{ -+ free_irq(priv->irq, priv); -+ irq_domain_remove(priv->irq_domain); -+} -+ -+static void -+mt7530_free_irq(struct mt7530_priv *priv) -+{ -+ mt7530_free_mdio_irq(priv); -+ mt7530_free_irq_common(priv); -+} -+ -+static int -+mt7530_setup_mdio(struct mt7530_priv *priv) -+{ -+ struct dsa_switch *ds = priv->ds; -+ struct device *dev = priv->dev; -+ struct mii_bus *bus; -+ static int idx; -+ int ret; -+ -+ bus = devm_mdiobus_alloc(dev); -+ if (!bus) -+ return -ENOMEM; -+ -+ ds->slave_mii_bus = bus; -+ bus->priv = priv; -+ bus->name = KBUILD_MODNAME "-mii"; -+ snprintf(bus->id, MII_BUS_ID_SIZE, KBUILD_MODNAME "-%d", idx++); -+ bus->read = mt753x_phy_read; -+ bus->write = mt753x_phy_write; -+ bus->parent = dev; -+ bus->phy_mask = ~ds->phys_mii_mask; -+ -+ if (priv->irq) -+ mt7530_setup_mdio_irq(priv); -+ -+ ret = devm_mdiobus_register(dev, bus); -+ if (ret) { -+ dev_err(dev, "failed to register MDIO bus: %d\n", ret); -+ if (priv->irq) -+ mt7530_free_mdio_irq(priv); -+ } -+ -+ return ret; -+} -+ - static int - mt7530_setup(struct dsa_switch *ds) - { -@@ -2747,24 +2962,20 @@ static int - mt753x_setup(struct dsa_switch *ds) - { - struct mt7530_priv *priv = ds->priv; -+ int ret = priv->info->sw_setup(ds); - -- return priv->info->sw_setup(ds); --} -- --static int --mt753x_phy_read(struct dsa_switch *ds, int port, int regnum) --{ -- struct mt7530_priv *priv = ds->priv; -+ if (ret) -+ return ret; - -- return priv->info->phy_read(ds, port, regnum); --} -+ ret = mt7530_setup_irq(priv); -+ if (ret) -+ return ret; - --static int --mt753x_phy_write(struct dsa_switch *ds, int port, int regnum, u16 val) --{ -- struct mt7530_priv *priv = ds->priv; -+ ret = mt7530_setup_mdio(priv); -+ if (ret && priv->irq) -+ mt7530_free_irq_common(priv); - -- return priv->info->phy_write(ds, port, regnum, val); -+ return ret; - } - - static int mt753x_get_mac_eee(struct dsa_switch *ds, int port, -@@ -2801,8 +3012,6 @@ static const struct dsa_switch_ops mt753 - .get_tag_protocol = mtk_get_tag_protocol, - .setup = mt753x_setup, - .get_strings = mt7530_get_strings, -- .phy_read = mt753x_phy_read, -- .phy_write = mt753x_phy_write, - .get_ethtool_stats = mt7530_get_ethtool_stats, - .get_sset_count = mt7530_get_sset_count, - .set_ageing_time = mt7530_set_ageing_time, -@@ -2985,6 +3194,9 @@ mt7530_remove(struct mdio_device *mdiode - dev_err(priv->dev, "Failed to disable io pwr: %d\n", - ret); - -+ if (priv->irq) -+ mt7530_free_irq(priv); -+ - dsa_unregister_switch(priv->ds); - mutex_destroy(&priv->reg_mutex); - } ---- a/drivers/net/dsa/mt7530.h -+++ b/drivers/net/dsa/mt7530.h -@@ -7,6 +7,7 @@ - #define __MT7530_H - - #define MT7530_NUM_PORTS 7 -+#define MT7530_NUM_PHYS 5 - #define MT7530_CPU_PORT 6 - #define MT7530_NUM_FDB_RECORDS 2048 - #define MT7530_ALL_MEMBERS 0xff -@@ -392,6 +393,12 @@ enum mt7531_sgmii_force_duplex { - #define SYS_CTRL_SW_RST BIT(1) - #define SYS_CTRL_REG_RST BIT(0) - -+/* Register for system interrupt */ -+#define MT7530_SYS_INT_EN 0x7008 -+ -+/* Register for system interrupt status */ -+#define MT7530_SYS_INT_STS 0x700c -+ - /* Register for PHY Indirect Access Control */ - #define MT7531_PHY_IAC 0x701C - #define MT7531_PHY_ACS_ST BIT(31) -@@ -713,6 +720,8 @@ static const char *p5_intf_modes(unsigne - } - } - -+struct mt7530_priv; -+ - /* struct mt753x_info - This is the main data structure for holding the specific - * part for each supported device - * @sw_setup: Holding the handler to a device initialization -@@ -737,8 +746,8 @@ struct mt753x_info { - enum mt753x_id id; - - int (*sw_setup)(struct dsa_switch *ds); -- int (*phy_read)(struct dsa_switch *ds, int port, int regnum); -- int (*phy_write)(struct dsa_switch *ds, int port, int regnum, u16 val); -+ int (*phy_read)(struct mt7530_priv *priv, int port, int regnum); -+ int (*phy_write)(struct mt7530_priv *priv, int port, int regnum, u16 val); - int (*pad_setup)(struct dsa_switch *ds, phy_interface_t interface); - int (*cpu_port_config)(struct dsa_switch *ds, int port); - bool (*phy_mode_supported)(struct dsa_switch *ds, int port, -@@ -772,6 +781,10 @@ struct mt753x_info { - * registers - * @p6_interface Holding the current port 6 interface - * @p5_intf_sel: Holding the current port 5 interface select -+ * -+ * @irq: IRQ number of the switch -+ * @irq_domain: IRQ domain of the switch irq_chip -+ * @irq_enable: IRQ enable bits, synced to SYS_INT_EN - */ - struct mt7530_priv { - struct device *dev; -@@ -793,6 +806,9 @@ struct mt7530_priv { - struct mt7530_port ports[MT7530_NUM_PORTS]; - /* protect among processes for registers access*/ - struct mutex reg_mutex; -+ int irq; -+ struct irq_domain *irq_domain; -+ u32 irq_enable; - }; - - struct mt7530_hw_vlan_entry { diff --git a/target/linux/generic/backport-5.10/773-v5.18-1-net-dsa-Move-VLAN-filtering-syncing-out-of-dsa_switc.patch b/target/linux/generic/backport-5.10/773-v5.18-1-net-dsa-Move-VLAN-filtering-syncing-out-of-dsa_switc.patch deleted file mode 100644 index eb60134a1e..0000000000 --- a/target/linux/generic/backport-5.10/773-v5.18-1-net-dsa-Move-VLAN-filtering-syncing-out-of-dsa_switc.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 7164a8cde4b42f76474088ccaf53f1e463d4e2f6 Mon Sep 17 00:00:00 2001 -From: Tobias Waldekranz -Date: Mon, 24 Jan 2022 22:09:43 +0100 -Subject: [PATCH 5.10 1/2] net: dsa: Move VLAN filtering syncing out of - dsa_switch_bridge_leave -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -commit 381a730182f1d174e1950cd4e63e885b1c302051 upstream. - -Most of dsa_switch_bridge_leave was, in fact, dealing with the syncing -of VLAN filtering for switches on which that is a global -setting. Separate the two phases to prepare for the cross-chip related -bugfix in the following commit. - -Signed-off-by: Tobias Waldekranz -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller -Signed-off-by: Marek Behún ---- - net/dsa/switch.c | 39 ++++++++++++++++++++++++++------------- - 1 file changed, 26 insertions(+), 13 deletions(-) - ---- a/net/dsa/switch.c -+++ b/net/dsa/switch.c -@@ -104,23 +104,12 @@ static int dsa_switch_bridge_join(struct - return 0; - } - --static int dsa_switch_bridge_leave(struct dsa_switch *ds, -- struct dsa_notifier_bridge_info *info) -+static int dsa_switch_sync_vlan_filtering(struct dsa_switch *ds, -+ struct dsa_notifier_bridge_info *info) - { - bool unset_vlan_filtering = br_vlan_enabled(info->br); -- struct dsa_switch_tree *dst = ds->dst; - int err, i; - -- if (dst->index == info->tree_index && ds->index == info->sw_index && -- ds->ops->port_bridge_leave) -- ds->ops->port_bridge_leave(ds, info->port, info->br); -- -- if ((dst->index != info->tree_index || ds->index != info->sw_index) && -- ds->ops->crosschip_bridge_leave) -- ds->ops->crosschip_bridge_leave(ds, info->tree_index, -- info->sw_index, info->port, -- info->br); -- - /* If the bridge was vlan_filtering, the bridge core doesn't trigger an - * event for changing vlan_filtering setting upon slave ports leaving - * it. That is a good thing, because that lets us handle it and also -@@ -153,6 +142,30 @@ static int dsa_switch_bridge_leave(struc - if (err && err != EOPNOTSUPP) - return err; - } -+ -+ return 0; -+} -+ -+static int dsa_switch_bridge_leave(struct dsa_switch *ds, -+ struct dsa_notifier_bridge_info *info) -+{ -+ struct dsa_switch_tree *dst = ds->dst; -+ int err; -+ -+ if (dst->index == info->tree_index && ds->index == info->sw_index && -+ ds->ops->port_bridge_leave) -+ ds->ops->port_bridge_leave(ds, info->port, info->br); -+ -+ if ((dst->index != info->tree_index || ds->index != info->sw_index) && -+ ds->ops->crosschip_bridge_leave) -+ ds->ops->crosschip_bridge_leave(ds, info->tree_index, -+ info->sw_index, info->port, -+ info->br); -+ -+ err = dsa_switch_sync_vlan_filtering(ds, info); -+ if (err) -+ return err; -+ - return 0; - } - diff --git a/target/linux/generic/backport-5.10/773-v5.18-2-net-dsa-Avoid-cross-chip-syncing-of-VLAN-filtering.patch b/target/linux/generic/backport-5.10/773-v5.18-2-net-dsa-Avoid-cross-chip-syncing-of-VLAN-filtering.patch deleted file mode 100644 index 0b36ef7cec..0000000000 --- a/target/linux/generic/backport-5.10/773-v5.18-2-net-dsa-Avoid-cross-chip-syncing-of-VLAN-filtering.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 6948a6654ffc878fc0258b363da77e7fd775b2d9 Mon Sep 17 00:00:00 2001 -From: Tobias Waldekranz -Date: Mon, 24 Jan 2022 22:09:44 +0100 -Subject: [PATCH 5.10 2/2] net: dsa: Avoid cross-chip syncing of VLAN filtering -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -commit 108dc8741c203e9d6ce4e973367f1bac20c7192b upstream. - -Changes to VLAN filtering are not applicable to cross-chip -notifications. - -On a system like this: - -.-----. .-----. .-----. -| sw1 +---+ sw2 +---+ sw3 | -'-1-2-' '-1-2-' '-1-2-' - -Before this change, upon sw1p1 leaving a bridge, a call to -dsa_port_vlan_filtering would also be made to sw2p1 and sw3p1. - -In this scenario: - -.---------. .-----. .-----. -| sw1 +---+ sw2 +---+ sw3 | -'-1-2-3-4-' '-1-2-' '-1-2-' - -When sw1p4 would leave a bridge, dsa_port_vlan_filtering would be -called for sw2 and sw3 with a non-existing port - leading to array -out-of-bounds accesses and crashes on mv88e6xxx. - -Fixes: d371b7c92d19 ("net: dsa: Unset vlan_filtering when ports leave the bridge") -Signed-off-by: Tobias Waldekranz -Reviewed-by: Vladimir Oltean -Signed-off-by: David S. Miller -Signed-off-by: Marek Behún ---- - net/dsa/switch.c | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - ---- a/net/dsa/switch.c -+++ b/net/dsa/switch.c -@@ -162,9 +162,11 @@ static int dsa_switch_bridge_leave(struc - info->sw_index, info->port, - info->br); - -- err = dsa_switch_sync_vlan_filtering(ds, info); -- if (err) -- return err; -+ if (dst->index == info->tree_index && ds->index == info->sw_index) { -+ err = dsa_switch_sync_vlan_filtering(ds, info); -+ if (err) -+ return err; -+ } - - return 0; - } diff --git a/target/linux/generic/backport-5.10/800-v5.13-0001-firmware-bcm47xx_nvram-rename-finding-function-and-i.patch b/target/linux/generic/backport-5.10/800-v5.13-0001-firmware-bcm47xx_nvram-rename-finding-function-and-i.patch deleted file mode 100644 index 19938704b7..0000000000 --- a/target/linux/generic/backport-5.10/800-v5.13-0001-firmware-bcm47xx_nvram-rename-finding-function-and-i.patch +++ /dev/null @@ -1,80 +0,0 @@ -From fb009cbdd0693bd633f11e99526617b3d392cfad Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Mon, 8 Mar 2021 10:03:16 +0100 -Subject: [PATCH] firmware: bcm47xx_nvram: rename finding function and its - variables -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -1. Use "bcm47xx_" function name prefix for consistency -2. It takes flash start as argument so s/iobase/flash_start/ -3. "off" was used for finding flash end so just call it "flash_size" - -Signed-off-by: Rafał Miłecki -Signed-off-by: Thomas Bogendoerfer ---- - drivers/firmware/broadcom/bcm47xx_nvram.c | 24 ++++++++++++----------- - 1 file changed, 13 insertions(+), 11 deletions(-) - ---- a/drivers/firmware/broadcom/bcm47xx_nvram.c -+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c -@@ -48,11 +48,13 @@ static u32 find_nvram_size(void __iomem - return 0; - } - --/* Probe for NVRAM header */ --static int nvram_find_and_copy(void __iomem *iobase, u32 lim) -+/** -+ * bcm47xx_nvram_find_and_copy - find NVRAM on flash mapping & copy it -+ */ -+static int bcm47xx_nvram_find_and_copy(void __iomem *flash_start, size_t res_size) - { - struct nvram_header __iomem *header; -- u32 off; -+ size_t flash_size; - u32 size; - - if (nvram_len) { -@@ -61,25 +63,25 @@ static int nvram_find_and_copy(void __io - } - - /* TODO: when nvram is on nand flash check for bad blocks first. */ -- off = FLASH_MIN; -- while (off <= lim) { -+ flash_size = FLASH_MIN; -+ while (flash_size <= res_size) { - /* Windowed flash access */ -- size = find_nvram_size(iobase + off); -+ size = find_nvram_size(flash_start + flash_size); - if (size) { -- header = (struct nvram_header *)(iobase + off - size); -+ header = (struct nvram_header *)(flash_start + flash_size - size); - goto found; - } -- off <<= 1; -+ flash_size <<= 1; - } - - /* Try embedded NVRAM at 4 KB and 1 KB as last resorts */ -- header = (struct nvram_header *)(iobase + 4096); -+ header = (struct nvram_header *)(flash_start + 4096); - if (header->magic == NVRAM_MAGIC) { - size = NVRAM_SPACE; - goto found; - } - -- header = (struct nvram_header *)(iobase + 1024); -+ header = (struct nvram_header *)(flash_start + 1024); - if (header->magic == NVRAM_MAGIC) { - size = NVRAM_SPACE; - goto found; -@@ -124,7 +126,7 @@ int bcm47xx_nvram_init_from_mem(u32 base - if (!iobase) - return -ENOMEM; - -- err = nvram_find_and_copy(iobase, lim); -+ err = bcm47xx_nvram_find_and_copy(iobase, lim); - - iounmap(iobase); - diff --git a/target/linux/generic/backport-5.10/800-v5.13-0002-firmware-bcm47xx_nvram-add-helper-checking-for-NVRAM.patch b/target/linux/generic/backport-5.10/800-v5.13-0002-firmware-bcm47xx_nvram-add-helper-checking-for-NVRAM.patch deleted file mode 100644 index 6ab072883d..0000000000 --- a/target/linux/generic/backport-5.10/800-v5.13-0002-firmware-bcm47xx_nvram-add-helper-checking-for-NVRAM.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 0a24b51a3264a3f942a75025ea5ff6133c8989b0 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Mon, 8 Mar 2021 10:03:17 +0100 -Subject: [PATCH] firmware: bcm47xx_nvram: add helper checking for NVRAM -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This avoids duplicating code doing casting and checking for NVRAM magic. - -Signed-off-by: Rafał Miłecki -Signed-off-by: Thomas Bogendoerfer ---- - drivers/firmware/broadcom/bcm47xx_nvram.c | 30 ++++++++++++++--------- - 1 file changed, 18 insertions(+), 12 deletions(-) - ---- a/drivers/firmware/broadcom/bcm47xx_nvram.c -+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c -@@ -34,14 +34,20 @@ static char nvram_buf[NVRAM_SPACE]; - static size_t nvram_len; - static const u32 nvram_sizes[] = {0x6000, 0x8000, 0xF000, 0x10000}; - -+/** -+ * bcm47xx_nvram_is_valid - check for a valid NVRAM at specified memory -+ */ -+static bool bcm47xx_nvram_is_valid(void __iomem *nvram) -+{ -+ return ((struct nvram_header *)nvram)->magic == NVRAM_MAGIC; -+} -+ - static u32 find_nvram_size(void __iomem *end) - { -- struct nvram_header __iomem *header; - int i; - - for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) { -- header = (struct nvram_header *)(end - nvram_sizes[i]); -- if (header->magic == NVRAM_MAGIC) -+ if (bcm47xx_nvram_is_valid(end - nvram_sizes[i])) - return nvram_sizes[i]; - } - -@@ -55,6 +61,7 @@ static int bcm47xx_nvram_find_and_copy(v - { - struct nvram_header __iomem *header; - size_t flash_size; -+ size_t offset; - u32 size; - - if (nvram_len) { -@@ -68,31 +75,30 @@ static int bcm47xx_nvram_find_and_copy(v - /* Windowed flash access */ - size = find_nvram_size(flash_start + flash_size); - if (size) { -- header = (struct nvram_header *)(flash_start + flash_size - size); -+ offset = flash_size - size; - goto found; - } - flash_size <<= 1; - } - - /* Try embedded NVRAM at 4 KB and 1 KB as last resorts */ -- header = (struct nvram_header *)(flash_start + 4096); -- if (header->magic == NVRAM_MAGIC) { -- size = NVRAM_SPACE; -+ -+ offset = 4096; -+ if (bcm47xx_nvram_is_valid(flash_start + offset)) - goto found; -- } - -- header = (struct nvram_header *)(flash_start + 1024); -- if (header->magic == NVRAM_MAGIC) { -- size = NVRAM_SPACE; -+ offset = 1024; -+ if (bcm47xx_nvram_is_valid(flash_start + offset)) - goto found; -- } - - pr_err("no nvram found\n"); - return -ENXIO; - - found: -+ header = (struct nvram_header *)(flash_start + offset); - __ioread32_copy(nvram_buf, header, sizeof(*header) / 4); - nvram_len = ((struct nvram_header *)(nvram_buf))->len; -+ size = res_size - offset; - if (nvram_len > size) { - pr_err("The nvram size according to the header seems to be bigger than the partition on flash\n"); - nvram_len = size; diff --git a/target/linux/generic/backport-5.10/800-v5.13-0003-firmware-bcm47xx_nvram-extract-code-copying-NVRAM.patch b/target/linux/generic/backport-5.10/800-v5.13-0003-firmware-bcm47xx_nvram-extract-code-copying-NVRAM.patch deleted file mode 100644 index a1351f1197..0000000000 --- a/target/linux/generic/backport-5.10/800-v5.13-0003-firmware-bcm47xx_nvram-extract-code-copying-NVRAM.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 298923cf999cecd2ef06df126f85a3d68da8c4d8 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Mon, 8 Mar 2021 10:03:18 +0100 -Subject: [PATCH] firmware: bcm47xx_nvram: extract code copying NVRAM -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This simplifies function finding NVRAM. It doesn't directly deal with -NVRAM structure anymore and is a bit smaller. - -Signed-off-by: Rafał Miłecki -Signed-off-by: Thomas Bogendoerfer ---- - drivers/firmware/broadcom/bcm47xx_nvram.c | 43 +++++++++++++---------- - 1 file changed, 25 insertions(+), 18 deletions(-) - ---- a/drivers/firmware/broadcom/bcm47xx_nvram.c -+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c -@@ -55,11 +55,34 @@ static u32 find_nvram_size(void __iomem - } - - /** -+ * bcm47xx_nvram_copy - copy NVRAM to internal buffer -+ */ -+static void bcm47xx_nvram_copy(void __iomem *nvram_start, size_t res_size) -+{ -+ struct nvram_header __iomem *header = nvram_start; -+ size_t copy_size; -+ -+ copy_size = header->len; -+ if (copy_size > res_size) { -+ pr_err("The nvram size according to the header seems to be bigger than the partition on flash\n"); -+ copy_size = res_size; -+ } -+ if (copy_size >= NVRAM_SPACE) { -+ pr_err("nvram on flash (%zu bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n", -+ copy_size, NVRAM_SPACE - 1); -+ copy_size = NVRAM_SPACE - 1; -+ } -+ -+ __ioread32_copy(nvram_buf, nvram_start, DIV_ROUND_UP(copy_size, 4)); -+ nvram_buf[NVRAM_SPACE - 1] = '\0'; -+ nvram_len = copy_size; -+} -+ -+/** - * bcm47xx_nvram_find_and_copy - find NVRAM on flash mapping & copy it - */ - static int bcm47xx_nvram_find_and_copy(void __iomem *flash_start, size_t res_size) - { -- struct nvram_header __iomem *header; - size_t flash_size; - size_t offset; - u32 size; -@@ -95,23 +118,7 @@ static int bcm47xx_nvram_find_and_copy(v - return -ENXIO; - - found: -- header = (struct nvram_header *)(flash_start + offset); -- __ioread32_copy(nvram_buf, header, sizeof(*header) / 4); -- nvram_len = ((struct nvram_header *)(nvram_buf))->len; -- size = res_size - offset; -- if (nvram_len > size) { -- pr_err("The nvram size according to the header seems to be bigger than the partition on flash\n"); -- nvram_len = size; -- } -- if (nvram_len >= NVRAM_SPACE) { -- pr_err("nvram on flash (%zu bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n", -- nvram_len, NVRAM_SPACE - 1); -- nvram_len = NVRAM_SPACE - 1; -- } -- /* proceed reading data after header */ -- __ioread32_copy(nvram_buf + sizeof(*header), header + 1, -- DIV_ROUND_UP(nvram_len, 4)); -- nvram_buf[NVRAM_SPACE - 1] = '\0'; -+ bcm47xx_nvram_copy(flash_start + offset, res_size - offset); - - return 0; - } diff --git a/target/linux/generic/backport-5.10/800-v5.13-0004-firmware-bcm47xx_nvram-look-for-NVRAM-with-for-inste.patch b/target/linux/generic/backport-5.10/800-v5.13-0004-firmware-bcm47xx_nvram-look-for-NVRAM-with-for-inste.patch deleted file mode 100644 index 059a13220b..0000000000 --- a/target/linux/generic/backport-5.10/800-v5.13-0004-firmware-bcm47xx_nvram-look-for-NVRAM-with-for-inste.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 98b68324f67236e8c9152976535dc1f27fb67ba8 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Mon, 8 Mar 2021 10:03:19 +0100 -Subject: [PATCH] firmware: bcm47xx_nvram: look for NVRAM with for instead of - while -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This loop requires variable initialization, stop condition and post -iteration increment. It's pretty much a for loop definition. - -Signed-off-by: Rafał Miłecki -Signed-off-by: Thomas Bogendoerfer ---- - drivers/firmware/broadcom/bcm47xx_nvram.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - ---- a/drivers/firmware/broadcom/bcm47xx_nvram.c -+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c -@@ -93,15 +93,13 @@ static int bcm47xx_nvram_find_and_copy(v - } - - /* TODO: when nvram is on nand flash check for bad blocks first. */ -- flash_size = FLASH_MIN; -- while (flash_size <= res_size) { -+ for (flash_size = FLASH_MIN; flash_size <= res_size; flash_size <<= 1) { - /* Windowed flash access */ - size = find_nvram_size(flash_start + flash_size); - if (size) { - offset = flash_size - size; - goto found; - } -- flash_size <<= 1; - } - - /* Try embedded NVRAM at 4 KB and 1 KB as last resorts */ diff --git a/target/linux/generic/backport-5.10/800-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch b/target/linux/generic/backport-5.10/800-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch deleted file mode 100644 index 21d250049e..0000000000 --- a/target/linux/generic/backport-5.10/800-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch +++ /dev/null @@ -1,70 +0,0 @@ -From f52da4ccfec9192e17f5c16260dfdd6d3ea76f65 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Mon, 8 Mar 2021 10:03:20 +0100 -Subject: [PATCH] firmware: bcm47xx_nvram: inline code checking NVRAM size -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Separated function was not improving code quality much (or at all). -Moreover it expected possible flash end address as argument and it was -returning NVRAM size. - -The new code always operates on offsets which means less logic and less -calculations. - -Signed-off-by: Rafał Miłecki -Signed-off-by: Thomas Bogendoerfer ---- - drivers/firmware/broadcom/bcm47xx_nvram.c | 25 +++++++---------------- - 1 file changed, 7 insertions(+), 18 deletions(-) - ---- a/drivers/firmware/broadcom/bcm47xx_nvram.c -+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c -@@ -42,18 +42,6 @@ static bool bcm47xx_nvram_is_valid(void - return ((struct nvram_header *)nvram)->magic == NVRAM_MAGIC; - } - --static u32 find_nvram_size(void __iomem *end) --{ -- int i; -- -- for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) { -- if (bcm47xx_nvram_is_valid(end - nvram_sizes[i])) -- return nvram_sizes[i]; -- } -- -- return 0; --} -- - /** - * bcm47xx_nvram_copy - copy NVRAM to internal buffer - */ -@@ -85,7 +73,7 @@ static int bcm47xx_nvram_find_and_copy(v - { - size_t flash_size; - size_t offset; -- u32 size; -+ int i; - - if (nvram_len) { - pr_warn("nvram already initialized\n"); -@@ -93,12 +81,13 @@ static int bcm47xx_nvram_find_and_copy(v - } - - /* TODO: when nvram is on nand flash check for bad blocks first. */ -+ -+ /* Try every possible flash size and check for NVRAM at its end */ - for (flash_size = FLASH_MIN; flash_size <= res_size; flash_size <<= 1) { -- /* Windowed flash access */ -- size = find_nvram_size(flash_start + flash_size); -- if (size) { -- offset = flash_size - size; -- goto found; -+ for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) { -+ offset = flash_size - nvram_sizes[i]; -+ if (bcm47xx_nvram_is_valid(flash_start + offset)) -+ goto found; - } - } - diff --git a/target/linux/generic/backport-5.10/801-v6.1-0001-nvmem-add-driver-handling-U-Boot-environment-variabl.patch b/target/linux/generic/backport-5.10/801-v6.1-0001-nvmem-add-driver-handling-U-Boot-environment-variabl.patch deleted file mode 100644 index 1459d1184e..0000000000 --- a/target/linux/generic/backport-5.10/801-v6.1-0001-nvmem-add-driver-handling-U-Boot-environment-variabl.patch +++ /dev/null @@ -1,278 +0,0 @@ -From f955dc14450695564926711cf9fa8e1d5d854302 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Wed, 15 Jun 2022 21:43:00 +0200 -Subject: [PATCH] nvmem: add driver handling U-Boot environment variables -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -U-Boot stores its setup as environment variables. It's a list of -key-value pairs stored on flash device with a custom header. - -This commit adds an NVMEM driver that: -1. Provides NVMEM access to environment vars binary data -2. Extracts variables as NVMEM cells - -Current Linux's NVMEM sysfs API allows reading whole NVMEM data block. -It can be used by user-space tools for reading U-Boot env vars block -without the hassle of finding its location. Parsing will still need to -be re-done there. - -Kernel-parsed NVMEM cells can be read however by Linux drivers. This may -be useful for Ethernet drivers for reading device MAC address which is -often stored as U-Boot env variable. - -Signed-off-by: Rafał Miłecki -Reviewed-by: Ahmad Fatoum -Signed-off-by: Srinivas Kandagatla ---- - ---- a/drivers/nvmem/Kconfig -+++ b/drivers/nvmem/Kconfig -@@ -270,4 +270,17 @@ config SPRD_EFUSE - This driver can also be built as a module. If so, the module - will be called nvmem-sprd-efuse. - -+config NVMEM_U_BOOT_ENV -+ tristate "U-Boot environment variables support" -+ depends on OF && MTD -+ select CRC32 -+ help -+ U-Boot stores its setup as environment variables. This driver adds -+ support for verifying & exporting such data. It also exposes variables -+ as NVMEM cells so they can be referenced by other drivers. -+ -+ Currently this drivers works only with env variables on top of MTD. -+ -+ If compiled as module it will be called nvmem_u-boot-env. -+ - endif ---- a/drivers/nvmem/Makefile -+++ b/drivers/nvmem/Makefile -@@ -55,3 +55,5 @@ obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynq - nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o - obj-$(CONFIG_SPRD_EFUSE) += nvmem_sprd_efuse.o - nvmem_sprd_efuse-y := sprd-efuse.o -+obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o -+nvmem_u-boot-env-y := u-boot-env.o ---- /dev/null -+++ b/drivers/nvmem/u-boot-env.c -@@ -0,0 +1,218 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Copyright (C) 2022 Rafał Miłecki -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+enum u_boot_env_format { -+ U_BOOT_FORMAT_SINGLE, -+ U_BOOT_FORMAT_REDUNDANT, -+}; -+ -+struct u_boot_env { -+ struct device *dev; -+ enum u_boot_env_format format; -+ -+ struct mtd_info *mtd; -+ -+ /* Cells */ -+ struct nvmem_cell_info *cells; -+ int ncells; -+}; -+ -+struct u_boot_env_image_single { -+ __le32 crc32; -+ uint8_t data[]; -+} __packed; -+ -+struct u_boot_env_image_redundant { -+ __le32 crc32; -+ u8 mark; -+ uint8_t data[]; -+} __packed; -+ -+static int u_boot_env_read(void *context, unsigned int offset, void *val, -+ size_t bytes) -+{ -+ struct u_boot_env *priv = context; -+ struct device *dev = priv->dev; -+ size_t bytes_read; -+ int err; -+ -+ err = mtd_read(priv->mtd, offset, bytes, &bytes_read, val); -+ if (err && !mtd_is_bitflip(err)) { -+ dev_err(dev, "Failed to read from mtd: %d\n", err); -+ return err; -+ } -+ -+ if (bytes_read != bytes) { -+ dev_err(dev, "Failed to read %zu bytes\n", bytes); -+ return -EIO; -+ } -+ -+ return 0; -+} -+ -+static int u_boot_env_add_cells(struct u_boot_env *priv, uint8_t *buf, -+ size_t data_offset, size_t data_len) -+{ -+ struct device *dev = priv->dev; -+ char *data = buf + data_offset; -+ char *var, *value, *eq; -+ int idx; -+ -+ priv->ncells = 0; -+ for (var = data; var < data + data_len && *var; var += strlen(var) + 1) -+ priv->ncells++; -+ -+ priv->cells = devm_kcalloc(dev, priv->ncells, sizeof(*priv->cells), GFP_KERNEL); -+ if (!priv->cells) -+ return -ENOMEM; -+ -+ for (var = data, idx = 0; -+ var < data + data_len && *var; -+ var = value + strlen(value) + 1, idx++) { -+ eq = strchr(var, '='); -+ if (!eq) -+ break; -+ *eq = '\0'; -+ value = eq + 1; -+ -+ priv->cells[idx].name = devm_kstrdup(dev, var, GFP_KERNEL); -+ if (!priv->cells[idx].name) -+ return -ENOMEM; -+ priv->cells[idx].offset = data_offset + value - data; -+ priv->cells[idx].bytes = strlen(value); -+ } -+ -+ if (WARN_ON(idx != priv->ncells)) -+ priv->ncells = idx; -+ -+ return 0; -+} -+ -+static int u_boot_env_parse(struct u_boot_env *priv) -+{ -+ struct device *dev = priv->dev; -+ size_t crc32_data_offset; -+ size_t crc32_data_len; -+ size_t crc32_offset; -+ size_t data_offset; -+ size_t data_len; -+ uint32_t crc32; -+ uint32_t calc; -+ size_t bytes; -+ uint8_t *buf; -+ int err; -+ -+ buf = kcalloc(1, priv->mtd->size, GFP_KERNEL); -+ if (!buf) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ err = mtd_read(priv->mtd, 0, priv->mtd->size, &bytes, buf); -+ if ((err && !mtd_is_bitflip(err)) || bytes != priv->mtd->size) { -+ dev_err(dev, "Failed to read from mtd: %d\n", err); -+ goto err_kfree; -+ } -+ -+ switch (priv->format) { -+ case U_BOOT_FORMAT_SINGLE: -+ crc32_offset = offsetof(struct u_boot_env_image_single, crc32); -+ crc32_data_offset = offsetof(struct u_boot_env_image_single, data); -+ data_offset = offsetof(struct u_boot_env_image_single, data); -+ break; -+ case U_BOOT_FORMAT_REDUNDANT: -+ crc32_offset = offsetof(struct u_boot_env_image_redundant, crc32); -+ crc32_data_offset = offsetof(struct u_boot_env_image_redundant, mark); -+ data_offset = offsetof(struct u_boot_env_image_redundant, data); -+ break; -+ } -+ crc32 = le32_to_cpu(*(uint32_t *)(buf + crc32_offset)); -+ crc32_data_len = priv->mtd->size - crc32_data_offset; -+ data_len = priv->mtd->size - data_offset; -+ -+ calc = crc32(~0, buf + crc32_data_offset, crc32_data_len) ^ ~0L; -+ if (calc != crc32) { -+ dev_err(dev, "Invalid calculated CRC32: 0x%08x (expected: 0x%08x)\n", calc, crc32); -+ err = -EINVAL; -+ goto err_kfree; -+ } -+ -+ buf[priv->mtd->size - 1] = '\0'; -+ err = u_boot_env_add_cells(priv, buf, data_offset, data_len); -+ if (err) -+ dev_err(dev, "Failed to add cells: %d\n", err); -+ -+err_kfree: -+ kfree(buf); -+err_out: -+ return err; -+} -+ -+static int u_boot_env_probe(struct platform_device *pdev) -+{ -+ struct nvmem_config config = { -+ .name = "u-boot-env", -+ .reg_read = u_boot_env_read, -+ }; -+ struct device *dev = &pdev->dev; -+ struct device_node *np = dev->of_node; -+ struct u_boot_env *priv; -+ int err; -+ -+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); -+ if (!priv) -+ return -ENOMEM; -+ priv->dev = dev; -+ -+ priv->format = (uintptr_t)of_device_get_match_data(dev); -+ -+ priv->mtd = of_get_mtd_device_by_node(np); -+ if (IS_ERR(priv->mtd)) { -+ dev_err_probe(dev, PTR_ERR(priv->mtd), "Failed to get %pOF MTD\n", np); -+ return PTR_ERR(priv->mtd); -+ } -+ -+ err = u_boot_env_parse(priv); -+ if (err) -+ return err; -+ -+ config.dev = dev; -+ config.cells = priv->cells; -+ config.ncells = priv->ncells; -+ config.priv = priv; -+ config.size = priv->mtd->size; -+ -+ return PTR_ERR_OR_ZERO(devm_nvmem_register(dev, &config)); -+} -+ -+static const struct of_device_id u_boot_env_of_match_table[] = { -+ { .compatible = "u-boot,env", .data = (void *)U_BOOT_FORMAT_SINGLE, }, -+ { .compatible = "u-boot,env-redundant-bool", .data = (void *)U_BOOT_FORMAT_REDUNDANT, }, -+ { .compatible = "u-boot,env-redundant-count", .data = (void *)U_BOOT_FORMAT_REDUNDANT, }, -+ {}, -+}; -+ -+static struct platform_driver u_boot_env_driver = { -+ .probe = u_boot_env_probe, -+ .driver = { -+ .name = "u_boot_env", -+ .of_match_table = u_boot_env_of_match_table, -+ }, -+}; -+module_platform_driver(u_boot_env_driver); -+ -+MODULE_AUTHOR("Rafał Miłecki"); -+MODULE_LICENSE("GPL"); -+MODULE_DEVICE_TABLE(of, u_boot_env_of_match_table); diff --git a/target/linux/generic/backport-5.10/801-v6.1-0002-nvmem-u-boot-env-find-Device-Tree-nodes-for-NVMEM-ce.patch b/target/linux/generic/backport-5.10/801-v6.1-0002-nvmem-u-boot-env-find-Device-Tree-nodes-for-NVMEM-ce.patch deleted file mode 100644 index 3a6b76a221..0000000000 --- a/target/linux/generic/backport-5.10/801-v6.1-0002-nvmem-u-boot-env-find-Device-Tree-nodes-for-NVMEM-ce.patch +++ /dev/null @@ -1,29 +0,0 @@ -From d69efcf951df4dcc74a0e1554969c533aec8aa9b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 15 Sep 2022 22:06:29 +0200 -Subject: [PATCH] nvmem: u-boot-env: find Device Tree nodes for NVMEM cells -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -DT binding allows specifying NVMEM cells as NVMEM device (provider) -subnodes. Looks for such subnodes when building NVMEM cells. - -This allows NVMEM consumers to use U-Boot environment variables. - -Signed-off-by: Rafał Miłecki -Signed-off-by: Srinivas Kandagatla ---- - drivers/nvmem/u-boot-env.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/nvmem/u-boot-env.c -+++ b/drivers/nvmem/u-boot-env.c -@@ -92,6 +92,7 @@ static int u_boot_env_add_cells(struct u - return -ENOMEM; - priv->cells[idx].offset = data_offset + value - data; - priv->cells[idx].bytes = strlen(value); -+ priv->cells[idx].np = of_get_child_by_name(dev->of_node, priv->cells[idx].name); - } - - if (WARN_ON(idx != priv->ncells)) diff --git a/target/linux/generic/backport-5.10/801-v6.1-0003-nvmem-u-boot-env-fix-crc32-casting-type.patch b/target/linux/generic/backport-5.10/801-v6.1-0003-nvmem-u-boot-env-fix-crc32-casting-type.patch deleted file mode 100644 index 6b40557116..0000000000 --- a/target/linux/generic/backport-5.10/801-v6.1-0003-nvmem-u-boot-env-fix-crc32-casting-type.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 60bbaad38109684b156e21112322e0a922f92cde Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 18 Aug 2022 06:38:37 +0200 -Subject: [PATCH] nvmem: u-boot-env: fix crc32 casting type -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This fixes: -drivers/nvmem/u-boot-env.c:141:17: sparse: sparse: cast to restricted __le32 - -Reported-by: kernel test robot -Fixes: f955dc1445069 ("nvmem: add driver handling U-Boot environment variables") -Signed-off-by: Rafał Miłecki -Signed-off-by: Srinivas Kandagatla ---- - drivers/nvmem/u-boot-env.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/nvmem/u-boot-env.c -+++ b/drivers/nvmem/u-boot-env.c -@@ -139,7 +139,7 @@ static int u_boot_env_parse(struct u_boo - data_offset = offsetof(struct u_boot_env_image_redundant, data); - break; - } -- crc32 = le32_to_cpu(*(uint32_t *)(buf + crc32_offset)); -+ crc32 = le32_to_cpu(*(__le32 *)(buf + crc32_offset)); - crc32_data_len = priv->mtd->size - crc32_data_offset; - data_len = priv->mtd->size - data_offset; - diff --git a/target/linux/generic/backport-5.10/802-v5.19-nvmem-core-support-passing-DT-node-in-cell-info.patch b/target/linux/generic/backport-5.10/802-v5.19-nvmem-core-support-passing-DT-node-in-cell-info.patch deleted file mode 100644 index b7870eef4b..0000000000 --- a/target/linux/generic/backport-5.10/802-v5.19-nvmem-core-support-passing-DT-node-in-cell-info.patch +++ /dev/null @@ -1,41 +0,0 @@ -From dbc2f62061c6bfba0aee93161ee3194dcee84bd0 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Fri, 29 Apr 2022 17:26:46 +0100 -Subject: [PATCH] nvmem: core: support passing DT node in cell info -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Some hardware may have NVMEM cells described in Device Tree using -individual nodes. Let drivers pass such nodes to the NVMEM subsystem so -they can be later used by NVMEM consumers. - -Signed-off-by: Rafał Miłecki -Signed-off-by: Srinivas Kandagatla -Link: https://lore.kernel.org/r/20220429162701.2222-2-srinivas.kandagatla@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/nvmem/core.c | 1 + - include/linux/nvmem-consumer.h | 1 + - 2 files changed, 2 insertions(+) - ---- a/drivers/nvmem/core.c -+++ b/drivers/nvmem/core.c -@@ -374,6 +374,7 @@ static int nvmem_cell_info_to_nvmem_cell - - cell->bit_offset = info->bit_offset; - cell->nbits = info->nbits; -+ cell->np = info->np; - - if (cell->nbits) - cell->bytes = DIV_ROUND_UP(cell->nbits + cell->bit_offset, ---- a/include/linux/nvmem-consumer.h -+++ b/include/linux/nvmem-consumer.h -@@ -25,6 +25,7 @@ struct nvmem_cell_info { - unsigned int bytes; - unsigned int bit_offset; - unsigned int nbits; -+ struct device_node *np; - }; - - /** diff --git a/target/linux/generic/backport-5.10/803-v6.2-0001-nvmem-u-boot-env-fix-crc32_data_offset-on-redundant-.patch b/target/linux/generic/backport-5.10/803-v6.2-0001-nvmem-u-boot-env-fix-crc32_data_offset-on-redundant-.patch deleted file mode 100644 index 69d5a1b845..0000000000 --- a/target/linux/generic/backport-5.10/803-v6.2-0001-nvmem-u-boot-env-fix-crc32_data_offset-on-redundant-.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 7a69ff9c9bde03a690ea783970f664782fc303d8 Mon Sep 17 00:00:00 2001 -From: Christian Lamparter -Date: Fri, 4 Nov 2022 17:52:03 +0100 -Subject: [PATCH] nvmem: u-boot-env: fix crc32_data_offset on redundant - u-boot-env - -The Western Digital MyBook Live (PowerPC 464/APM82181) -has a set of redundant u-boot-env. Loading up the driver -the following error: - -| u_boot_env: Invalid calculated CRC32: 0x4f8f2c86 (expected: 0x98b14514) -| u_boot_env: probe of partition@1e000 failed with error -22 - -Looking up the userspace libubootenv utilities source [0], -it looks like the "mark" or "flag" is not part of the -crc32 sum... which is unfortunate :( - -|static int libuboot_load(struct uboot_ctx *ctx) -|{ -|[...] -| if (ctx->redundant) { -| [...] -| offsetdata = offsetof(struct uboot_env_redund, data); -| [...] //-----^^ -| } -| usable_envsize = ctx->size - offsetdata; -| buf[0] = malloc(bufsize); -|[...] -| for (i = 0; i < copies; i++) { -| data = (uint8_t *)(buf[i] + offsetdata); -| uint32_t crc; -| -| ret = devread(ctx, i, buf[i]); -| [...] -| crc = *(uint32_t *)(buf[i] + offsetcrc); -| dev->crc = crc32(0, (uint8_t *)data, usable_envsize); -| - -[0] https://github.com/sbabic/libubootenv/blob/master/src/uboot_env.c#L951 -Fixes: d5542923f200 ("nvmem: add driver handling U-Boot environment variables") -Signed-off-by: Christian Lamparter ---- - drivers/nvmem/u-boot-env.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/nvmem/u-boot-env.c -+++ b/drivers/nvmem/u-boot-env.c -@@ -135,7 +135,7 @@ static int u_boot_env_parse(struct u_boo - break; - case U_BOOT_FORMAT_REDUNDANT: - crc32_offset = offsetof(struct u_boot_env_image_redundant, crc32); -- crc32_data_offset = offsetof(struct u_boot_env_image_redundant, mark); -+ crc32_data_offset = offsetof(struct u_boot_env_image_redundant, data); - data_offset = offsetof(struct u_boot_env_image_redundant, data); - break; - } diff --git a/target/linux/generic/backport-5.10/803-v6.2-0002-nvmem-u-boot-env-align-endianness-of-crc32-values.patch b/target/linux/generic/backport-5.10/803-v6.2-0002-nvmem-u-boot-env-align-endianness-of-crc32-values.patch deleted file mode 100644 index 7d6723bb8e..0000000000 --- a/target/linux/generic/backport-5.10/803-v6.2-0002-nvmem-u-boot-env-align-endianness-of-crc32-values.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 0e71cac033bb7689c4dfa2e6814191337ef770f5 Mon Sep 17 00:00:00 2001 -From: INAGAKI Hiroshi -Date: Thu, 13 Oct 2022 00:51:33 +0900 -Subject: [PATCH] nvmem: u-boot-env: align endianness of crc32 values -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch fixes crc32 error on Big-Endianness system by conversion of -calculated crc32 value. - -Little-Endianness system: - - obtained crc32: Little -calculated crc32: Little - -Big-Endianness system: - - obtained crc32: Little -calculated crc32: Big - -log (APRESIA ApresiaLightGS120GT-SS, RTL8382M, Big-Endianness): - -[ 8.570000] u_boot_env 18001200.spi:flash@0:partitions:partition@c0000: Invalid calculated CRC32: 0x88cd6f09 (expected: 0x096fcd88) -[ 8.580000] u_boot_env: probe of 18001200.spi:flash@0:partitions:partition@c0000 failed with error -22 - -Fixes: f955dc1445069 ("nvmem: add driver handling U-Boot environment variables") - -Signed-off-by: INAGAKI Hiroshi -Acked-by: Rafał Miłecki -Tested-by: Christian Lamparter -Signed-off-by: Srinivas Kandagatla ---- - drivers/nvmem/u-boot-env.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/nvmem/u-boot-env.c -+++ b/drivers/nvmem/u-boot-env.c -@@ -143,7 +143,7 @@ static int u_boot_env_parse(struct u_boo - crc32_data_len = priv->mtd->size - crc32_data_offset; - data_len = priv->mtd->size - data_offset; - -- calc = crc32(~0, buf + crc32_data_offset, crc32_data_len) ^ ~0L; -+ calc = le32_to_cpu((__le32)crc32(~0, buf + crc32_data_offset, crc32_data_len) ^ ~0L); - if (calc != crc32) { - dev_err(dev, "Invalid calculated CRC32: 0x%08x (expected: 0x%08x)\n", calc, crc32); - err = -EINVAL; diff --git a/target/linux/generic/backport-5.10/803-v6.2-0003-nvmem-u-boot-env-add-Broadcom-format-support.patch b/target/linux/generic/backport-5.10/803-v6.2-0003-nvmem-u-boot-env-add-Broadcom-format-support.patch deleted file mode 100644 index 429b24f0f3..0000000000 --- a/target/linux/generic/backport-5.10/803-v6.2-0003-nvmem-u-boot-env-add-Broadcom-format-support.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 5b4eaafbeac472fc19049152f18e88aecb2b2829 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Mon, 17 Oct 2022 09:17:22 +0200 -Subject: [PATCH] nvmem: u-boot-env: add Broadcom format support -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Broadcom uses U-Boot for a lot of their bcmbca familiy chipsets. They -decided to store U-Boot environment data inside U-Boot partition and to -use a custom header (with "uEnv" magic and env data length). - -Add support for Broadcom's specific binding and their custom format. - -Ref: 6b0584c19d87 ("dt-bindings: nvmem: u-boot,env: add Broadcom's variant binding") -Signed-off-by: Rafał Miłecki -Signed-off-by: Srinivas Kandagatla ---- - drivers/nvmem/u-boot-env.c | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - ---- a/drivers/nvmem/u-boot-env.c -+++ b/drivers/nvmem/u-boot-env.c -@@ -16,6 +16,7 @@ - enum u_boot_env_format { - U_BOOT_FORMAT_SINGLE, - U_BOOT_FORMAT_REDUNDANT, -+ U_BOOT_FORMAT_BROADCOM, - }; - - struct u_boot_env { -@@ -40,6 +41,13 @@ struct u_boot_env_image_redundant { - uint8_t data[]; - } __packed; - -+struct u_boot_env_image_broadcom { -+ __le32 magic; -+ __le32 len; -+ __le32 crc32; -+ uint8_t data[0]; -+} __packed; -+ - static int u_boot_env_read(void *context, unsigned int offset, void *val, - size_t bytes) - { -@@ -138,6 +146,11 @@ static int u_boot_env_parse(struct u_boo - crc32_data_offset = offsetof(struct u_boot_env_image_redundant, data); - data_offset = offsetof(struct u_boot_env_image_redundant, data); - break; -+ case U_BOOT_FORMAT_BROADCOM: -+ crc32_offset = offsetof(struct u_boot_env_image_broadcom, crc32); -+ crc32_data_offset = offsetof(struct u_boot_env_image_broadcom, data); -+ data_offset = offsetof(struct u_boot_env_image_broadcom, data); -+ break; - } - crc32 = le32_to_cpu(*(__le32 *)(buf + crc32_offset)); - crc32_data_len = priv->mtd->size - crc32_data_offset; -@@ -202,6 +215,7 @@ static const struct of_device_id u_boot_ - { .compatible = "u-boot,env", .data = (void *)U_BOOT_FORMAT_SINGLE, }, - { .compatible = "u-boot,env-redundant-bool", .data = (void *)U_BOOT_FORMAT_REDUNDANT, }, - { .compatible = "u-boot,env-redundant-count", .data = (void *)U_BOOT_FORMAT_REDUNDANT, }, -+ { .compatible = "brcm,env", .data = (void *)U_BOOT_FORMAT_BROADCOM, }, - {}, - }; - diff --git a/target/linux/generic/backport-5.10/810-v5.13-usb-ehci-add-spurious-flag-to-disable-overcurrent-ch.patch b/target/linux/generic/backport-5.10/810-v5.13-usb-ehci-add-spurious-flag-to-disable-overcurrent-ch.patch deleted file mode 100644 index 6b75b08717..0000000000 --- a/target/linux/generic/backport-5.10/810-v5.13-usb-ehci-add-spurious-flag-to-disable-overcurrent-ch.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 2d5ba37461013253d2ff0a3641b727fd32ea97a9 Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -Date: Tue, 23 Feb 2021 18:44:53 +0100 -Subject: [PATCH 1/3] usb: ehci: add spurious flag to disable overcurrent - checking -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch adds an ignore_oc flag which can be set by EHCI controller -not supporting or wanting to disable overcurrent checking. The EHCI -platform data in include/linux/usb/ehci_pdriver.h is also augmented to -take advantage of this new flag. - -Signed-off-by: Florian Fainelli -Signed-off-by: Álvaro Fernández Rojas -Link: https://lore.kernel.org/r/20210223174455.1378-2-noltari@gmail.com -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/host/ehci-hcd.c | 2 +- - drivers/usb/host/ehci-hub.c | 4 ++-- - drivers/usb/host/ehci-platform.c | 2 ++ - drivers/usb/host/ehci.h | 1 + - include/linux/usb/ehci_pdriver.h | 1 + - 5 files changed, 7 insertions(+), 3 deletions(-) - ---- a/drivers/usb/host/ehci-hcd.c -+++ b/drivers/usb/host/ehci-hcd.c -@@ -660,7 +660,7 @@ static int ehci_run (struct usb_hcd *hcd - "USB %x.%x started, EHCI %x.%02x%s\n", - ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), - temp >> 8, temp & 0xff, -- ignore_oc ? ", overcurrent ignored" : ""); -+ (ignore_oc || ehci->spurious_oc) ? ", overcurrent ignored" : ""); - - ehci_writel(ehci, INTR_MASK, - &ehci->regs->intr_enable); /* Turn On Interrupts */ ---- a/drivers/usb/host/ehci-hub.c -+++ b/drivers/usb/host/ehci-hub.c -@@ -643,7 +643,7 @@ ehci_hub_status_data (struct usb_hcd *hc - * always set, seem to clear PORT_OCC and PORT_CSC when writing to - * PORT_POWER; that's surprising, but maybe within-spec. - */ -- if (!ignore_oc) -+ if (!ignore_oc && !ehci->spurious_oc) - mask = PORT_CSC | PORT_PEC | PORT_OCC; - else - mask = PORT_CSC | PORT_PEC; -@@ -1013,7 +1013,7 @@ int ehci_hub_control( - if (temp & PORT_PEC) - status |= USB_PORT_STAT_C_ENABLE << 16; - -- if ((temp & PORT_OCC) && !ignore_oc){ -+ if ((temp & PORT_OCC) && (!ignore_oc && !ehci->spurious_oc)){ - status |= USB_PORT_STAT_C_OVERCURRENT << 16; - - /* ---- a/drivers/usb/host/ehci-platform.c -+++ b/drivers/usb/host/ehci-platform.c -@@ -333,6 +333,8 @@ static int ehci_platform_probe(struct pl - hcd->has_tt = 1; - if (pdata->reset_on_resume) - priv->reset_on_resume = true; -+ if (pdata->spurious_oc) -+ ehci->spurious_oc = 1; - - #ifndef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO - if (ehci->big_endian_mmio) { ---- a/drivers/usb/host/ehci.h -+++ b/drivers/usb/host/ehci.h -@@ -219,6 +219,7 @@ struct ehci_hcd { /* one per controlle - unsigned need_oc_pp_cycle:1; /* MPC834X port power */ - unsigned imx28_write_fix:1; /* For Freescale i.MX28 */ - unsigned is_aspeed:1; -+ unsigned spurious_oc:1; - - /* required for usb32 quirk */ - #define OHCI_CTRL_HCFS (3 << 6) ---- a/include/linux/usb/ehci_pdriver.h -+++ b/include/linux/usb/ehci_pdriver.h -@@ -50,6 +50,7 @@ struct usb_ehci_pdata { - unsigned no_io_watchdog:1; - unsigned reset_on_resume:1; - unsigned dma_mask_64:1; -+ unsigned spurious_oc:1; - - /* Turn on all power and clocks */ - int (*power_on)(struct platform_device *pdev); diff --git a/target/linux/generic/backport-5.10/811-v5.13-usb-host-ehci-platform-add-spurious_oc-DT-support.patch b/target/linux/generic/backport-5.10/811-v5.13-usb-host-ehci-platform-add-spurious_oc-DT-support.patch deleted file mode 100644 index 0094d47718..0000000000 --- a/target/linux/generic/backport-5.10/811-v5.13-usb-host-ehci-platform-add-spurious_oc-DT-support.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 4da57dbbffdfa7fe4e2b70b047fc5ff95ff25a3d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= -Date: Tue, 23 Feb 2021 18:44:55 +0100 -Subject: [PATCH 3/3] usb: host: ehci-platform: add spurious_oc DT support -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Over-current reporting isn't supported on some platforms such as bcm63xx. -These devices will incorrectly report over-current if this flag isn't properly -activated. - -Signed-off-by: Álvaro Fernández Rojas -Link: https://lore.kernel.org/r/20210223174455.1378-4-noltari@gmail.com -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/host/ehci-platform.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/drivers/usb/host/ehci-platform.c -+++ b/drivers/usb/host/ehci-platform.c -@@ -286,6 +286,9 @@ static int ehci_platform_probe(struct pl - if (of_property_read_bool(dev->dev.of_node, "big-endian")) - ehci->big_endian_mmio = ehci->big_endian_desc = 1; - -+ if (of_property_read_bool(dev->dev.of_node, "spurious-oc")) -+ ehci->spurious_oc = 1; -+ - if (of_property_read_bool(dev->dev.of_node, - "needs-reset-on-resume")) - priv->reset_on_resume = true; diff --git a/target/linux/generic/backport-5.10/820-v5.13-make-pci_host_common_probe-declare-its-reliance-on-msi-domains.patch b/target/linux/generic/backport-5.10/820-v5.13-make-pci_host_common_probe-declare-its-reliance-on-msi-domains.patch deleted file mode 100644 index 8ca2b78f74..0000000000 --- a/target/linux/generic/backport-5.10/820-v5.13-make-pci_host_common_probe-declare-its-reliance-on-msi-domains.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 9ec37efb87832b578d7972fc80b04d94f5d2bbe3 Mon Sep 17 00:00:00 2001 -From: Marc Zyngier -Date: Tue, 30 Mar 2021 16:11:42 +0100 -Subject: PCI/MSI: Make pci_host_common_probe() declare its reliance on MSI - domains - -The generic PCI host driver relies on MSI domains for MSIs to -be provided to its end-points. Make this dependency explicit. - -This cures the warnings occuring on arm/arm64 VMs when booted -with PCI virtio devices and no MSI controller (no GICv3 ITS, -for example). - -It is likely that other drivers will need to express the same -dependency. - -Link: https://lore.kernel.org/r/20210330151145.997953-12-maz@kernel.org -Signed-off-by: Marc Zyngier -Signed-off-by: Lorenzo Pieralisi -Acked-by: Bjorn Helgaas ---- - drivers/pci/controller/pci-host-common.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/pci/controller/pci-host-common.c -+++ b/drivers/pci/controller/pci-host-common.c -@@ -77,6 +77,7 @@ int pci_host_common_probe(struct platfor - - bridge->sysdata = cfg; - bridge->ops = (struct pci_ops *)&ops->pci_ops; -+ bridge->msi_domain = true; - - platform_set_drvdata(pdev, bridge); - diff --git a/target/linux/generic/backport-5.10/821-v5.13-let-pci-host-bridges-declar-their-reliance-on-msi-domains.patch b/target/linux/generic/backport-5.10/821-v5.13-let-pci-host-bridges-declar-their-reliance-on-msi-domains.patch deleted file mode 100644 index ee1acf4b9c..0000000000 --- a/target/linux/generic/backport-5.10/821-v5.13-let-pci-host-bridges-declar-their-reliance-on-msi-domains.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 94e89b145371b68fa0ea294855adebcd03e0522e Mon Sep 17 00:00:00 2001 -From: Marc Zyngier -Date: Tue, 30 Mar 2021 16:11:41 +0100 -Subject: PCI/MSI: Let PCI host bridges declare their reliance on MSI domains - -There is a whole class of host bridges that cannot know whether -MSIs will be provided or not, as they rely on other blocks -to provide the MSI functionnality, using MSI domains. This is -the case for example on systems that use the ARM GIC architecture. - -Introduce a new attribute ('msi_domain') indicating that implicit -dependency, and use this property to set the NO_MSI flag when -no MSI domain is found at probe time. - -Link: https://lore.kernel.org/r/20210330151145.997953-11-maz@kernel.org -Signed-off-by: Marc Zyngier -Signed-off-by: Lorenzo Pieralisi -Acked-by: Bjorn Helgaas ---- - drivers/pci/probe.c | 2 ++ - include/linux/pci.h | 1 + - 2 files changed, 3 insertions(+) - ---- a/drivers/pci/probe.c -+++ b/drivers/pci/probe.c -@@ -925,6 +925,8 @@ static int pci_register_host_bridge(stru - device_enable_async_suspend(bus->bridge); - pci_set_bus_of_node(bus); - pci_set_bus_msi_domain(bus); -+ if (bridge->msi_domain && !dev_get_msi_domain(&bus->dev)) -+ bus->bus_flags |= PCI_BUS_FLAGS_NO_MSI; - - if (!parent) - set_dev_node(bus->bridge, pcibus_to_node(bus)); ---- a/include/linux/pci.h -+++ b/include/linux/pci.h -@@ -548,6 +548,7 @@ struct pci_host_bridge { - unsigned int native_dpc:1; /* OS may use PCIe DPC */ - unsigned int preserve_config:1; /* Preserve FW resource setup */ - unsigned int size_windows:1; /* Enable root bus sizing */ -+ unsigned int msi_domain:1; /* Bridge wants MSI domain */ - - /* Resource alignment requirements */ - resource_size_t (*align_resource)(struct pci_dev *dev, diff --git a/target/linux/generic/backport-5.10/822-v5.13-advertise-lack-of-built-in-msi-handling.patch b/target/linux/generic/backport-5.10/822-v5.13-advertise-lack-of-built-in-msi-handling.patch deleted file mode 100644 index c11aedd814..0000000000 --- a/target/linux/generic/backport-5.10/822-v5.13-advertise-lack-of-built-in-msi-handling.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 645e9c38383d7fcde2784ee537fa18ec9bed54d9 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 30 Mar 2021 16:11:43 +0100 -Subject: PCI: mediatek: Advertise lack of built-in MSI handling - -Some Mediatek host bridges cannot handle MSIs, which is sad. -This also results in an ugly warning at device probe time, -as the core PCI code wasn't told that MSIs were not available. - -Advertise this fact to the rest of the core PCI code by -using the 'msi_domain' attribute, which still opens the possibility -for another block to provide the MSI functionnality. - -[maz: commit message, switched over to msi_domain attribute] - -Link: https://lore.kernel.org/r/20210330151145.997953-13-maz@kernel.org -Reported-by: Frank Wunderlich -Signed-off-by: Thomas Gleixner -Signed-off-by: Marc Zyngier -Signed-off-by: Lorenzo Pieralisi -Acked-by: Bjorn Helgaas ---- - drivers/pci/controller/pcie-mediatek.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/drivers/pci/controller/pcie-mediatek.c -+++ b/drivers/pci/controller/pcie-mediatek.c -@@ -143,6 +143,7 @@ struct mtk_pcie_port; - * struct mtk_pcie_soc - differentiate between host generations - * @need_fix_class_id: whether this host's class ID needed to be fixed or not - * @need_fix_device_id: whether this host's device ID needed to be fixed or not -+ * @no_msi: Bridge has no MSI support, and relies on an external block - * @device_id: device ID which this host need to be fixed - * @ops: pointer to configuration access functions - * @startup: pointer to controller setting functions -@@ -151,6 +152,7 @@ struct mtk_pcie_port; - struct mtk_pcie_soc { - bool need_fix_class_id; - bool need_fix_device_id; -+ bool no_msi; - unsigned int device_id; - struct pci_ops *ops; - int (*startup)(struct mtk_pcie_port *port); -@@ -1087,6 +1089,7 @@ static int mtk_pcie_probe(struct platfor - - host->ops = pcie->soc->ops; - host->sysdata = pcie; -+ host->msi_domain = pcie->soc->no_msi; - - err = pci_host_probe(host); - if (err) -@@ -1176,6 +1179,7 @@ static const struct dev_pm_ops mtk_pcie_ - }; - - static const struct mtk_pcie_soc mtk_pcie_soc_v1 = { -+ .no_msi = true, - .ops = &mtk_pcie_ops, - .startup = mtk_pcie_startup_port, - }; diff --git a/target/linux/generic/backport-5.10/830-v5.14-leds-lp55xx-Initialize-enable-GPIO-direction-to-outp.patch b/target/linux/generic/backport-5.10/830-v5.14-leds-lp55xx-Initialize-enable-GPIO-direction-to-outp.patch deleted file mode 100644 index 75b9947392..0000000000 --- a/target/linux/generic/backport-5.10/830-v5.14-leds-lp55xx-Initialize-enable-GPIO-direction-to-outp.patch +++ /dev/null @@ -1,28 +0,0 @@ -From a5d3d1adc95f4ac5968b7a77ee95a3abbbb96f49 Mon Sep 17 00:00:00 2001 -From: Doug Zobel -Date: Mon, 10 May 2021 15:40:00 -0500 -Subject: [PATCH] leds: lp55xx: Initialize enable GPIO direction to output - -The "Convert to use GPIO descriptors" commit changed the -initialization of the enable GPIO from GPIOF_DIR_OUT to -GPIOD_ASIS. This breaks systems where the GPIO does not -default to output. Changing the enable initialization -to GPIOD_OUT_LOW. - -Signed-off-by: Doug Zobel -Signed-off-by: Pavel Machek ---- - drivers/leds/leds-lp55xx-common.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/leds/leds-lp55xx-common.c -+++ b/drivers/leds/leds-lp55xx-common.c -@@ -694,7 +694,7 @@ struct lp55xx_platform_data *lp55xx_of_p - of_property_read_u8(np, "clock-mode", &pdata->clock_mode); - - pdata->enable_gpiod = devm_gpiod_get_optional(dev, "enable", -- GPIOD_ASIS); -+ GPIOD_OUT_LOW); - if (IS_ERR(pdata->enable_gpiod)) - return ERR_CAST(pdata->enable_gpiod); - diff --git a/target/linux/generic/backport-5.10/845-v6.0-0002-leds-bcm63138-add-support-for-BCM63138-controller.patch b/target/linux/generic/backport-5.10/845-v6.0-0002-leds-bcm63138-add-support-for-BCM63138-controller.patch deleted file mode 100644 index 8ebe8f180b..0000000000 --- a/target/linux/generic/backport-5.10/845-v6.0-0002-leds-bcm63138-add-support-for-BCM63138-controller.patch +++ /dev/null @@ -1,371 +0,0 @@ -From a0ba692072d89075d0a75c7ad9df31f2c1ee9a1c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Mon, 27 Dec 2021 15:59:05 +0100 -Subject: [PATCH] leds: bcm63138: add support for BCM63138 controller -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -It's a new controller first introduced in BCM63138 SoC. Later it was -also used in BCM4908, some BCM68xx and some BCM63xxx SoCs. - -Signed-off-by: Rafał Miłecki -Reviewed-by: Florian Fainelli -Signed-off-by: Pavel Machek ---- - drivers/leds/blink/Kconfig | 12 ++ - drivers/leds/blink/Makefile | 1 + - drivers/leds/blink/leds-bcm63138.c | 308 +++++++++++++++++++++++++++++ - 3 files changed, 321 insertions(+) - create mode 100644 drivers/leds/blink/leds-bcm63138.c - ---- /dev/null -+++ b/drivers/leds/blink/Kconfig -@@ -0,0 +1,11 @@ -+config LEDS_BCM63138 -+ tristate "LED Support for Broadcom BCM63138 SoC" -+ depends on LEDS_CLASS -+ depends on ARCH_BCM4908 || ARCH_BCM_5301X || BCM63XX || COMPILE_TEST -+ depends on HAS_IOMEM -+ depends on OF -+ default ARCH_BCM4908 -+ help -+ This option enables support for LED controller that is part of -+ BCM63138 SoC. The same hardware block is known to be also used -+ in BCM4908, BCM6848, BCM6858, BCM63148, BCM63381 and BCM68360. ---- /dev/null -+++ b/drivers/leds/blink/Makefile -@@ -0,0 +1,2 @@ -+# SPDX-License-Identifier: GPL-2.0 -+obj-$(CONFIG_LEDS_BCM63138) += leds-bcm63138.o ---- /dev/null -+++ b/drivers/leds/blink/leds-bcm63138.c -@@ -0,0 +1,308 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Copyright (C) 2021 Rafał Miłecki -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define BCM63138_MAX_LEDS 32 -+#define BCM63138_MAX_BRIGHTNESS 9 -+ -+#define BCM63138_LED_BITS 4 /* how many bits control a single LED */ -+#define BCM63138_LED_MASK ((1 << BCM63138_LED_BITS) - 1) /* 0xf */ -+#define BCM63138_LEDS_PER_REG (32 / BCM63138_LED_BITS) /* 8 */ -+ -+#define BCM63138_GLB_CTRL 0x00 -+#define BCM63138_GLB_CTRL_SERIAL_LED_DATA_PPOL 0x00000002 -+#define BCM63138_GLB_CTRL_SERIAL_LED_EN_POL 0x00000008 -+#define BCM63138_MASK 0x04 -+#define BCM63138_HW_LED_EN 0x08 -+#define BCM63138_SERIAL_LED_SHIFT_SEL 0x0c -+#define BCM63138_FLASH_RATE_CTRL1 0x10 -+#define BCM63138_FLASH_RATE_CTRL2 0x14 -+#define BCM63138_FLASH_RATE_CTRL3 0x18 -+#define BCM63138_FLASH_RATE_CTRL4 0x1c -+#define BCM63138_BRIGHT_CTRL1 0x20 -+#define BCM63138_BRIGHT_CTRL2 0x24 -+#define BCM63138_BRIGHT_CTRL3 0x28 -+#define BCM63138_BRIGHT_CTRL4 0x2c -+#define BCM63138_POWER_LED_CFG 0x30 -+#define BCM63138_HW_POLARITY 0xb4 -+#define BCM63138_SW_DATA 0xb8 -+#define BCM63138_SW_POLARITY 0xbc -+#define BCM63138_PARALLEL_LED_POLARITY 0xc0 -+#define BCM63138_SERIAL_LED_POLARITY 0xc4 -+#define BCM63138_HW_LED_STATUS 0xc8 -+#define BCM63138_FLASH_CTRL_STATUS 0xcc -+#define BCM63138_FLASH_BRT_CTRL 0xd0 -+#define BCM63138_FLASH_P_LED_OUT_STATUS 0xd4 -+#define BCM63138_FLASH_S_LED_OUT_STATUS 0xd8 -+ -+struct bcm63138_leds { -+ struct device *dev; -+ void __iomem *base; -+ spinlock_t lock; -+}; -+ -+struct bcm63138_led { -+ struct bcm63138_leds *leds; -+ struct led_classdev cdev; -+ u32 pin; -+ bool active_low; -+}; -+ -+/* -+ * I/O access -+ */ -+ -+static void bcm63138_leds_write(struct bcm63138_leds *leds, unsigned int reg, -+ u32 data) -+{ -+ writel(data, leds->base + reg); -+} -+ -+static unsigned long bcm63138_leds_read(struct bcm63138_leds *leds, -+ unsigned int reg) -+{ -+ return readl(leds->base + reg); -+} -+ -+static void bcm63138_leds_update_bits(struct bcm63138_leds *leds, -+ unsigned int reg, u32 mask, u32 val) -+{ -+ WARN_ON(val & ~mask); -+ -+ bcm63138_leds_write(leds, reg, (bcm63138_leds_read(leds, reg) & ~mask) | (val & mask)); -+} -+ -+/* -+ * Helpers -+ */ -+ -+static void bcm63138_leds_set_flash_rate(struct bcm63138_leds *leds, -+ struct bcm63138_led *led, -+ u8 value) -+{ -+ int reg_offset = (led->pin >> fls((BCM63138_LEDS_PER_REG - 1))) * 4; -+ int shift = (led->pin & (BCM63138_LEDS_PER_REG - 1)) * BCM63138_LED_BITS; -+ -+ bcm63138_leds_update_bits(leds, BCM63138_FLASH_RATE_CTRL1 + reg_offset, -+ BCM63138_LED_MASK << shift, value << shift); -+} -+ -+static void bcm63138_leds_set_bright(struct bcm63138_leds *leds, -+ struct bcm63138_led *led, -+ u8 value) -+{ -+ int reg_offset = (led->pin >> fls((BCM63138_LEDS_PER_REG - 1))) * 4; -+ int shift = (led->pin & (BCM63138_LEDS_PER_REG - 1)) * BCM63138_LED_BITS; -+ -+ bcm63138_leds_update_bits(leds, BCM63138_BRIGHT_CTRL1 + reg_offset, -+ BCM63138_LED_MASK << shift, value << shift); -+} -+ -+static void bcm63138_leds_enable_led(struct bcm63138_leds *leds, -+ struct bcm63138_led *led, -+ enum led_brightness value) -+{ -+ u32 bit = BIT(led->pin); -+ -+ bcm63138_leds_update_bits(leds, BCM63138_SW_DATA, bit, -+ value == LED_OFF ? 0 : bit); -+} -+ -+/* -+ * API callbacks -+ */ -+ -+static void bcm63138_leds_brightness_set(struct led_classdev *led_cdev, -+ enum led_brightness value) -+{ -+ struct bcm63138_led *led = container_of(led_cdev, struct bcm63138_led, cdev); -+ struct bcm63138_leds *leds = led->leds; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&leds->lock, flags); -+ -+ bcm63138_leds_enable_led(leds, led, value); -+ if (!value) -+ bcm63138_leds_set_flash_rate(leds, led, 0); -+ else -+ bcm63138_leds_set_bright(leds, led, value); -+ -+ spin_unlock_irqrestore(&leds->lock, flags); -+} -+ -+static int bcm63138_leds_blink_set(struct led_classdev *led_cdev, -+ unsigned long *delay_on, -+ unsigned long *delay_off) -+{ -+ struct bcm63138_led *led = container_of(led_cdev, struct bcm63138_led, cdev); -+ struct bcm63138_leds *leds = led->leds; -+ unsigned long flags; -+ u8 value; -+ -+ if (!*delay_on && !*delay_off) { -+ *delay_on = 640; -+ *delay_off = 640; -+ } -+ -+ if (*delay_on != *delay_off) { -+ dev_dbg(led_cdev->dev, "Blinking at unequal delays is not supported\n"); -+ return -EINVAL; -+ } -+ -+ switch (*delay_on) { -+ case 1152 ... 1408: /* 1280 ms ± 10% */ -+ value = 0x7; -+ break; -+ case 576 ... 704: /* 640 ms ± 10% */ -+ value = 0x6; -+ break; -+ case 288 ... 352: /* 320 ms ± 10% */ -+ value = 0x5; -+ break; -+ case 126 ... 154: /* 140 ms ± 10% */ -+ value = 0x4; -+ break; -+ case 59 ... 72: /* 65 ms ± 10% */ -+ value = 0x3; -+ break; -+ default: -+ dev_dbg(led_cdev->dev, "Blinking delay value %lu is unsupported\n", -+ *delay_on); -+ return -EINVAL; -+ } -+ -+ spin_lock_irqsave(&leds->lock, flags); -+ -+ bcm63138_leds_enable_led(leds, led, BCM63138_MAX_BRIGHTNESS); -+ bcm63138_leds_set_flash_rate(leds, led, value); -+ -+ spin_unlock_irqrestore(&leds->lock, flags); -+ -+ return 0; -+} -+ -+/* -+ * LED driver -+ */ -+ -+static void bcm63138_leds_create_led(struct bcm63138_leds *leds, -+ struct device_node *np) -+{ -+ struct led_init_data init_data = { -+ .fwnode = of_fwnode_handle(np), -+ }; -+ struct device *dev = leds->dev; -+ struct bcm63138_led *led; -+ struct pinctrl *pinctrl; -+ u32 bit; -+ int err; -+ -+ led = devm_kzalloc(dev, sizeof(*led), GFP_KERNEL); -+ if (!led) { -+ dev_err(dev, "Failed to alloc LED\n"); -+ return; -+ } -+ -+ led->leds = leds; -+ -+ if (of_property_read_u32(np, "reg", &led->pin)) { -+ dev_err(dev, "Missing \"reg\" property in %pOF\n", np); -+ goto err_free; -+ } -+ -+ if (led->pin >= BCM63138_MAX_LEDS) { -+ dev_err(dev, "Invalid \"reg\" value %d\n", led->pin); -+ goto err_free; -+ } -+ -+ led->active_low = of_property_read_bool(np, "active-low"); -+ -+ led->cdev.max_brightness = BCM63138_MAX_BRIGHTNESS; -+ led->cdev.brightness_set = bcm63138_leds_brightness_set; -+ led->cdev.blink_set = bcm63138_leds_blink_set; -+ -+ err = devm_led_classdev_register_ext(dev, &led->cdev, &init_data); -+ if (err) { -+ dev_err(dev, "Failed to register LED %pOF: %d\n", np, err); -+ goto err_free; -+ } -+ -+ pinctrl = devm_pinctrl_get_select_default(led->cdev.dev); -+ if (IS_ERR(pinctrl) && PTR_ERR(pinctrl) != -ENODEV) { -+ dev_warn(led->cdev.dev, "Failed to select %pOF pinctrl: %ld\n", -+ np, PTR_ERR(pinctrl)); -+ } -+ -+ bit = BIT(led->pin); -+ bcm63138_leds_update_bits(leds, BCM63138_PARALLEL_LED_POLARITY, bit, -+ led->active_low ? 0 : bit); -+ bcm63138_leds_update_bits(leds, BCM63138_HW_LED_EN, bit, 0); -+ bcm63138_leds_set_flash_rate(leds, led, 0); -+ bcm63138_leds_enable_led(leds, led, led->cdev.brightness); -+ -+ return; -+ -+err_free: -+ devm_kfree(dev, led); -+} -+ -+static int bcm63138_leds_probe(struct platform_device *pdev) -+{ -+ struct device_node *np = dev_of_node(&pdev->dev); -+ struct device *dev = &pdev->dev; -+ struct bcm63138_leds *leds; -+ struct device_node *child; -+ -+ leds = devm_kzalloc(dev, sizeof(*leds), GFP_KERNEL); -+ if (!leds) -+ return -ENOMEM; -+ -+ leds->dev = dev; -+ -+ leds->base = devm_platform_ioremap_resource(pdev, 0); -+ if (IS_ERR(leds->base)) -+ return PTR_ERR(leds->base); -+ -+ spin_lock_init(&leds->lock); -+ -+ bcm63138_leds_write(leds, BCM63138_GLB_CTRL, -+ BCM63138_GLB_CTRL_SERIAL_LED_DATA_PPOL | -+ BCM63138_GLB_CTRL_SERIAL_LED_EN_POL); -+ bcm63138_leds_write(leds, BCM63138_HW_LED_EN, 0); -+ bcm63138_leds_write(leds, BCM63138_SERIAL_LED_POLARITY, 0); -+ bcm63138_leds_write(leds, BCM63138_PARALLEL_LED_POLARITY, 0); -+ -+ for_each_available_child_of_node(np, child) { -+ bcm63138_leds_create_led(leds, child); -+ } -+ -+ return 0; -+} -+ -+static const struct of_device_id bcm63138_leds_of_match_table[] = { -+ { .compatible = "brcm,bcm63138-leds", }, -+ { }, -+}; -+ -+static struct platform_driver bcm63138_leds_driver = { -+ .probe = bcm63138_leds_probe, -+ .driver = { -+ .name = "leds-bcm63xxx", -+ .of_match_table = bcm63138_leds_of_match_table, -+ }, -+}; -+ -+module_platform_driver(bcm63138_leds_driver); -+ -+MODULE_AUTHOR("Rafał Miłecki"); -+MODULE_LICENSE("GPL"); -+MODULE_DEVICE_TABLE(of, bcm63138_leds_of_match_table); ---- a/drivers/leds/Kconfig -+++ b/drivers/leds/Kconfig -@@ -929,6 +929,8 @@ config LEDS_ACER_A500 - This option enables support for the Power Button LED of - Acer Iconia Tab A500. - -+source "drivers/leds/blink/Kconfig" -+ - comment "LED Triggers" - source "drivers/leds/trigger/Kconfig" - ---- a/drivers/leds/Makefile -+++ b/drivers/leds/Makefile -@@ -105,3 +105,6 @@ obj-$(CONFIG_LEDS_USER) += uleds.o - - # LED Triggers - obj-$(CONFIG_LEDS_TRIGGERS) += trigger/ -+ -+# LED Blink -+obj-y += blink/ diff --git a/target/linux/generic/backport-5.10/846-v6.0-0002-leds-add-help-info-about-BCM63138-module-name.patch b/target/linux/generic/backport-5.10/846-v6.0-0002-leds-add-help-info-about-BCM63138-module-name.patch deleted file mode 100644 index 44e8be86fd..0000000000 --- a/target/linux/generic/backport-5.10/846-v6.0-0002-leds-add-help-info-about-BCM63138-module-name.patch +++ /dev/null @@ -1,25 +0,0 @@ -From bcc607cdbb1f931111196699426f0cb83bfb296a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Sun, 17 Jul 2022 14:42:47 +0200 -Subject: [PATCH] leds: add help info about BCM63138 module name -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -It's what we do for all other LEDs drivers. - -Reported-by: Pavel Machek -Signed-off-by: Rafał Miłecki -Signed-off-by: Pavel Machek ---- - drivers/leds/blink/Kconfig | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/drivers/leds/blink/Kconfig -+++ b/drivers/leds/blink/Kconfig -@@ -9,3 +9,5 @@ config LEDS_BCM63138 - This option enables support for LED controller that is part of - BCM63138 SoC. The same hardware block is known to be also used - in BCM4908, BCM6848, BCM6858, BCM63148, BCM63381 and BCM68360. -+ -+ If compiled as module it will be called leds-bcm63138. diff --git a/target/linux/generic/backport-5.10/850-v5.17-0001-PCI-pci-bridge-emul-Add-description-for-class_revisi.patch b/target/linux/generic/backport-5.10/850-v5.17-0001-PCI-pci-bridge-emul-Add-description-for-class_revisi.patch deleted file mode 100644 index 19a4be2a9d..0000000000 --- a/target/linux/generic/backport-5.10/850-v5.17-0001-PCI-pci-bridge-emul-Add-description-for-class_revisi.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 9319230ac147067652b58fe849ffe0ceec098665 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Tue, 30 Nov 2021 18:29:03 +0100 -Subject: [PATCH] PCI: pci-bridge-emul: Add description for class_revision - field -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The current assignment to the class_revision member - - class_revision |= cpu_to_le32(PCI_CLASS_BRIDGE_PCI << 16); - -can make the reader think that class is at high 16 bits of the member and -revision at low 16 bits. - -In reality, class is at high 24 bits, but the class for PCI Bridge Normal -Decode is PCI_CLASS_BRIDGE_PCI << 8. - -Change the assignment and add a comment to make this clearer. - -Link: https://lore.kernel.org/r/20211130172913.9727-2-kabel@kernel.org -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Signed-off-by: Lorenzo Pieralisi ---- - drivers/pci/pci-bridge-emul.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - ---- a/drivers/pci/pci-bridge-emul.c -+++ b/drivers/pci/pci-bridge-emul.c -@@ -284,7 +284,11 @@ int pci_bridge_emul_init(struct pci_brid - { - BUILD_BUG_ON(sizeof(bridge->conf) != PCI_BRIDGE_CONF_END); - -- bridge->conf.class_revision |= cpu_to_le32(PCI_CLASS_BRIDGE_PCI << 16); -+ /* -+ * class_revision: Class is high 24 bits and revision is low 8 bit of this member, -+ * while class for PCI Bridge Normal Decode has the 24-bit value: PCI_CLASS_BRIDGE_PCI << 8 -+ */ -+ bridge->conf.class_revision |= cpu_to_le32((PCI_CLASS_BRIDGE_PCI << 8) << 8); - bridge->conf.header_type = PCI_HEADER_TYPE_BRIDGE; - bridge->conf.cache_line_size = 0x10; - bridge->conf.status = cpu_to_le16(PCI_STATUS_CAP_LIST); diff --git a/target/linux/generic/backport-5.10/850-v5.17-0002-PCI-pci-bridge-emul-Add-definitions-for-missing-capa.patch b/target/linux/generic/backport-5.10/850-v5.17-0002-PCI-pci-bridge-emul-Add-definitions-for-missing-capa.patch deleted file mode 100644 index 3dd82710e6..0000000000 --- a/target/linux/generic/backport-5.10/850-v5.17-0002-PCI-pci-bridge-emul-Add-definitions-for-missing-capa.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 8ea673a8b30b4a32516b8adabb15e2a68ff02ec8 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Tue, 30 Nov 2021 18:29:04 +0100 -Subject: [PATCH] PCI: pci-bridge-emul: Add definitions for missing - capabilities registers -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -pci-bridge-emul driver already allocates buffer for capabilities up to the -PCI_EXP_SLTSTA2 register, but does not define bit access behavior for these -registers. Add these missing definitions. - -Link: https://lore.kernel.org/r/20211130172913.9727-3-kabel@kernel.org -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Signed-off-by: Lorenzo Pieralisi ---- - drivers/pci/pci-bridge-emul.c | 43 +++++++++++++++++++++++++++++++++++ - 1 file changed, 43 insertions(+) - ---- a/drivers/pci/pci-bridge-emul.c -+++ b/drivers/pci/pci-bridge-emul.c -@@ -270,6 +270,49 @@ struct pci_bridge_reg_behavior pcie_cap_ - .ro = GENMASK(15, 0) | PCI_EXP_RTSTA_PENDING, - .w1c = PCI_EXP_RTSTA_PME, - }, -+ -+ [PCI_EXP_DEVCAP2 / 4] = { -+ /* -+ * Device capabilities 2 register has reserved bits [30:27]. -+ * Also bits [26:24] are reserved for non-upstream ports. -+ */ -+ .ro = BIT(31) | GENMASK(23, 0), -+ }, -+ -+ [PCI_EXP_DEVCTL2 / 4] = { -+ /* -+ * Device control 2 register is RW. Bit 11 is reserved for -+ * non-upstream ports. -+ * -+ * Device status 2 register is reserved. -+ */ -+ .rw = GENMASK(15, 12) | GENMASK(10, 0), -+ }, -+ -+ [PCI_EXP_LNKCAP2 / 4] = { -+ /* Link capabilities 2 register has reserved bits [30:25] and 0. */ -+ .ro = BIT(31) | GENMASK(24, 1), -+ }, -+ -+ [PCI_EXP_LNKCTL2 / 4] = { -+ /* -+ * Link control 2 register is RW. -+ * -+ * Link status 2 register has bits 5, 15 W1C; -+ * bits 10, 11 reserved and others are RO. -+ */ -+ .rw = GENMASK(15, 0), -+ .w1c = (BIT(15) | BIT(5)) << 16, -+ .ro = (GENMASK(14, 12) | GENMASK(9, 6) | GENMASK(4, 0)) << 16, -+ }, -+ -+ [PCI_EXP_SLTCAP2 / 4] = { -+ /* Slot capabilities 2 register is reserved. */ -+ }, -+ -+ [PCI_EXP_SLTCTL2 / 4] = { -+ /* Both Slot control 2 and Slot status 2 registers are reserved. */ -+ }, - }; - - /* diff --git a/target/linux/generic/backport-5.10/850-v5.17-0003-PCI-aardvark-Add-support-for-DEVCAP2-DEVCTL2-LNKCAP2.patch b/target/linux/generic/backport-5.10/850-v5.17-0003-PCI-aardvark-Add-support-for-DEVCAP2-DEVCTL2-LNKCAP2.patch deleted file mode 100644 index 4d1135bf6c..0000000000 --- a/target/linux/generic/backport-5.10/850-v5.17-0003-PCI-aardvark-Add-support-for-DEVCAP2-DEVCTL2-LNKCAP2.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 1d3e170344dff2cef8827db6c09909b78cbc11d7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Tue, 30 Nov 2021 18:29:05 +0100 -Subject: [PATCH] PCI: aardvark: Add support for DEVCAP2, DEVCTL2, LNKCAP2 and - LNKCTL2 registers on emulated bridge -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -PCI aardvark hardware supports access to DEVCAP2, DEVCTL2, LNKCAP2 and -LNKCTL2 configuration registers of PCIe core via PCIE_CORE_PCIEXP_CAP. -Export them via emulated software root bridge. - -Link: https://lore.kernel.org/r/20211130172913.9727-4-kabel@kernel.org -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Signed-off-by: Lorenzo Pieralisi ---- - drivers/pci/controller/pci-aardvark.c | 15 +++++++++++---- - 1 file changed, 11 insertions(+), 4 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -885,8 +885,13 @@ advk_pci_bridge_emul_pcie_conf_read(stru - - case PCI_EXP_DEVCAP: - case PCI_EXP_DEVCTL: -+ case PCI_EXP_DEVCAP2: -+ case PCI_EXP_DEVCTL2: -+ case PCI_EXP_LNKCAP2: -+ case PCI_EXP_LNKCTL2: - *value = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + reg); - return PCI_BRIDGE_EMUL_HANDLED; -+ - default: - return PCI_BRIDGE_EMUL_NOT_HANDLED; - } -@@ -900,10 +905,6 @@ advk_pci_bridge_emul_pcie_conf_write(str - struct advk_pcie *pcie = bridge->data; - - switch (reg) { -- case PCI_EXP_DEVCTL: -- advk_writel(pcie, new, PCIE_CORE_PCIEXP_CAP + reg); -- break; -- - case PCI_EXP_LNKCTL: - advk_writel(pcie, new, PCIE_CORE_PCIEXP_CAP + reg); - if (new & PCI_EXP_LNKCTL_RL) -@@ -925,6 +926,12 @@ advk_pci_bridge_emul_pcie_conf_write(str - advk_writel(pcie, new, PCIE_ISR0_REG); - break; - -+ case PCI_EXP_DEVCTL: -+ case PCI_EXP_DEVCTL2: -+ case PCI_EXP_LNKCTL2: -+ advk_writel(pcie, new, PCIE_CORE_PCIEXP_CAP + reg); -+ break; -+ - default: - break; - } diff --git a/target/linux/generic/backport-5.10/850-v5.17-0005-PCI-aardvark-Comment-actions-in-driver-remove-method.patch b/target/linux/generic/backport-5.10/850-v5.17-0005-PCI-aardvark-Comment-actions-in-driver-remove-method.patch deleted file mode 100644 index b724422d40..0000000000 --- a/target/linux/generic/backport-5.10/850-v5.17-0005-PCI-aardvark-Comment-actions-in-driver-remove-method.patch +++ /dev/null @@ -1,34 +0,0 @@ -From a4ca7948e1d47275f8f3e5023243440c40561916 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Tue, 30 Nov 2021 18:29:07 +0100 -Subject: [PATCH] PCI: aardvark: Comment actions in driver remove method -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Add two more comments into the advk_pcie_remove() method. - -Link: https://lore.kernel.org/r/20211130172913.9727-6-kabel@kernel.org -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Signed-off-by: Lorenzo Pieralisi ---- - drivers/pci/controller/pci-aardvark.c | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1692,11 +1692,13 @@ static int advk_pcie_remove(struct platf - struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie); - int i; - -+ /* Remove PCI bus with all devices */ - pci_lock_rescan_remove(); - pci_stop_root_bus(bridge->bus); - pci_remove_root_bus(bridge->bus); - pci_unlock_rescan_remove(); - -+ /* Remove IRQ domains */ - advk_pcie_remove_msi_irq_domain(pcie); - advk_pcie_remove_irq_domain(pcie); - diff --git a/target/linux/generic/backport-5.10/850-v5.17-0006-PCI-aardvark-Disable-bus-mastering-when-unbinding-dr.patch b/target/linux/generic/backport-5.10/850-v5.17-0006-PCI-aardvark-Disable-bus-mastering-when-unbinding-dr.patch deleted file mode 100644 index c8d5e391b8..0000000000 --- a/target/linux/generic/backport-5.10/850-v5.17-0006-PCI-aardvark-Disable-bus-mastering-when-unbinding-dr.patch +++ /dev/null @@ -1,41 +0,0 @@ -From a46f2f6dd4093438d9615dfbf5c0fea2a9835dba Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Tue, 30 Nov 2021 18:29:08 +0100 -Subject: [PATCH] PCI: aardvark: Disable bus mastering when unbinding driver -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Ensure that after driver unbind PCIe cards are not able to forward -memory and I/O requests in the upstream direction. - -Link: https://lore.kernel.org/r/20211130172913.9727-7-kabel@kernel.org -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Signed-off-by: Lorenzo Pieralisi ---- - drivers/pci/controller/pci-aardvark.c | 6 ++++++ - 1 file changed, 6 insertions(+) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1690,6 +1690,7 @@ static int advk_pcie_remove(struct platf - { - struct advk_pcie *pcie = platform_get_drvdata(pdev); - struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie); -+ u32 val; - int i; - - /* Remove PCI bus with all devices */ -@@ -1698,6 +1699,11 @@ static int advk_pcie_remove(struct platf - pci_remove_root_bus(bridge->bus); - pci_unlock_rescan_remove(); - -+ /* Disable Root Bridge I/O space, memory space and bus mastering */ -+ val = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG); -+ val &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); -+ advk_writel(pcie, val, PCIE_CORE_CMD_STATUS_REG); -+ - /* Remove IRQ domains */ - advk_pcie_remove_msi_irq_domain(pcie); - advk_pcie_remove_irq_domain(pcie); diff --git a/target/linux/generic/backport-5.10/850-v5.17-0007-PCI-aardvark-Mask-all-interrupts-when-unbinding-driv.patch b/target/linux/generic/backport-5.10/850-v5.17-0007-PCI-aardvark-Mask-all-interrupts-when-unbinding-driv.patch deleted file mode 100644 index 05d350e922..0000000000 --- a/target/linux/generic/backport-5.10/850-v5.17-0007-PCI-aardvark-Mask-all-interrupts-when-unbinding-driv.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 13bcdf07cb2ecff5d45d2c141df2539b15211448 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Tue, 30 Nov 2021 18:29:09 +0100 -Subject: [PATCH] PCI: aardvark: Mask all interrupts when unbinding driver -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Ensure that no interrupt can be triggered after driver unbind. - -Link: https://lore.kernel.org/r/20211130172913.9727-8-kabel@kernel.org -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Signed-off-by: Lorenzo Pieralisi ---- - drivers/pci/controller/pci-aardvark.c | 21 +++++++++++++++++++++ - 1 file changed, 21 insertions(+) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1704,6 +1704,27 @@ static int advk_pcie_remove(struct platf - val &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); - advk_writel(pcie, val, PCIE_CORE_CMD_STATUS_REG); - -+ /* Disable MSI */ -+ val = advk_readl(pcie, PCIE_CORE_CTRL2_REG); -+ val &= ~PCIE_CORE_CTRL2_MSI_ENABLE; -+ advk_writel(pcie, val, PCIE_CORE_CTRL2_REG); -+ -+ /* Clear MSI address */ -+ advk_writel(pcie, 0, PCIE_MSI_ADDR_LOW_REG); -+ advk_writel(pcie, 0, PCIE_MSI_ADDR_HIGH_REG); -+ -+ /* Mask all interrupts */ -+ advk_writel(pcie, PCIE_MSI_ALL_MASK, PCIE_MSI_MASK_REG); -+ advk_writel(pcie, PCIE_ISR0_ALL_MASK, PCIE_ISR0_MASK_REG); -+ advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_MASK_REG); -+ advk_writel(pcie, PCIE_IRQ_ALL_MASK, HOST_CTRL_INT_MASK_REG); -+ -+ /* Clear all interrupts */ -+ advk_writel(pcie, PCIE_MSI_ALL_MASK, PCIE_MSI_STATUS_REG); -+ advk_writel(pcie, PCIE_ISR0_ALL_MASK, PCIE_ISR0_REG); -+ advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_REG); -+ advk_writel(pcie, PCIE_IRQ_ALL_MASK, HOST_CTRL_INT_STATUS_REG); -+ - /* Remove IRQ domains */ - advk_pcie_remove_msi_irq_domain(pcie); - advk_pcie_remove_irq_domain(pcie); diff --git a/target/linux/generic/backport-5.10/850-v5.17-0008-PCI-aardvark-Fix-memory-leak-in-driver-unbind.patch b/target/linux/generic/backport-5.10/850-v5.17-0008-PCI-aardvark-Fix-memory-leak-in-driver-unbind.patch deleted file mode 100644 index 435acda1e2..0000000000 --- a/target/linux/generic/backport-5.10/850-v5.17-0008-PCI-aardvark-Fix-memory-leak-in-driver-unbind.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 2f040a17f5061457ae95035326d3159eddc1e5cc Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Tue, 30 Nov 2021 18:29:10 +0100 -Subject: [PATCH] PCI: aardvark: Fix memory leak in driver unbind -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Free config space for emulated root bridge when unbinding driver to fix -memory leak. Do it after disabling and masking all interrupts, since -aardvark interrupt handler accesses config space of emulated root -bridge. - -Link: https://lore.kernel.org/r/20211130172913.9727-9-kabel@kernel.org -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Signed-off-by: Lorenzo Pieralisi ---- - drivers/pci/controller/pci-aardvark.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1729,6 +1729,9 @@ static int advk_pcie_remove(struct platf - advk_pcie_remove_msi_irq_domain(pcie); - advk_pcie_remove_irq_domain(pcie); - -+ /* Free config space for emulated root bridge */ -+ pci_bridge_emul_cleanup(&pcie->bridge); -+ - /* Disable outbound address windows mapping */ - for (i = 0; i < OB_WIN_COUNT; i++) - advk_pcie_disable_ob_win(pcie, i); diff --git a/target/linux/generic/backport-5.10/850-v5.17-0009-PCI-aardvark-Assert-PERST-when-unbinding-driver.patch b/target/linux/generic/backport-5.10/850-v5.17-0009-PCI-aardvark-Assert-PERST-when-unbinding-driver.patch deleted file mode 100644 index c5dfdd3923..0000000000 --- a/target/linux/generic/backport-5.10/850-v5.17-0009-PCI-aardvark-Assert-PERST-when-unbinding-driver.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 1f54391be8ce0c981d312cb93acdc5608def576a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Tue, 30 Nov 2021 18:29:11 +0100 -Subject: [PATCH] PCI: aardvark: Assert PERST# when unbinding driver -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Put the PCIe card into reset by asserting PERST# signal when unbinding -driver. It doesn't make sense to leave the card working if it can't -communicate with the host. This should also save some power. - -Link: https://lore.kernel.org/r/20211130172913.9727-10-kabel@kernel.org -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Signed-off-by: Lorenzo Pieralisi ---- - drivers/pci/controller/pci-aardvark.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1732,6 +1732,10 @@ static int advk_pcie_remove(struct platf - /* Free config space for emulated root bridge */ - pci_bridge_emul_cleanup(&pcie->bridge); - -+ /* Assert PERST# signal which prepares PCIe card for power down */ -+ if (pcie->reset_gpio) -+ gpiod_set_value_cansleep(pcie->reset_gpio, 1); -+ - /* Disable outbound address windows mapping */ - for (i = 0; i < OB_WIN_COUNT; i++) - advk_pcie_disable_ob_win(pcie, i); diff --git a/target/linux/generic/backport-5.10/850-v5.17-0010-PCI-aardvark-Disable-link-training-when-unbinding-dr.patch b/target/linux/generic/backport-5.10/850-v5.17-0010-PCI-aardvark-Disable-link-training-when-unbinding-dr.patch deleted file mode 100644 index 7f4e2575f5..0000000000 --- a/target/linux/generic/backport-5.10/850-v5.17-0010-PCI-aardvark-Disable-link-training-when-unbinding-dr.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 759dec2e3dfdbd261c41d2279f04f2351c971a49 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Tue, 30 Nov 2021 18:29:12 +0100 -Subject: [PATCH] PCI: aardvark: Disable link training when unbinding driver -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Disable link training circuit in driver unbind sequence. We want to -leave link training in the same state as it was before the driver was -probed. - -Link: https://lore.kernel.org/r/20211130172913.9727-11-kabel@kernel.org -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Signed-off-by: Lorenzo Pieralisi ---- - drivers/pci/controller/pci-aardvark.c | 5 +++++ - 1 file changed, 5 insertions(+) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1736,6 +1736,11 @@ static int advk_pcie_remove(struct platf - if (pcie->reset_gpio) - gpiod_set_value_cansleep(pcie->reset_gpio, 1); - -+ /* Disable link training */ -+ val = advk_readl(pcie, PCIE_CORE_CTRL0_REG); -+ val &= ~LINK_TRAINING_EN; -+ advk_writel(pcie, val, PCIE_CORE_CTRL0_REG); -+ - /* Disable outbound address windows mapping */ - for (i = 0; i < OB_WIN_COUNT; i++) - advk_pcie_disable_ob_win(pcie, i); diff --git a/target/linux/generic/backport-5.10/850-v5.17-0011-PCI-aardvark-Disable-common-PHY-when-unbinding-drive.patch b/target/linux/generic/backport-5.10/850-v5.17-0011-PCI-aardvark-Disable-common-PHY-when-unbinding-drive.patch deleted file mode 100644 index 495c34aa9e..0000000000 --- a/target/linux/generic/backport-5.10/850-v5.17-0011-PCI-aardvark-Disable-common-PHY-when-unbinding-drive.patch +++ /dev/null @@ -1,30 +0,0 @@ -From fdbbe242c15a8f2cd0e3ad8a56cd0a447b771d0d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Tue, 30 Nov 2021 18:29:13 +0100 -Subject: [PATCH] PCI: aardvark: Disable common PHY when unbinding driver -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Disable the PCIe PHY when unbinding driver. This should save some power. - -Link: https://lore.kernel.org/r/20211130172913.9727-12-kabel@kernel.org -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Signed-off-by: Lorenzo Pieralisi ---- - drivers/pci/controller/pci-aardvark.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1745,6 +1745,9 @@ static int advk_pcie_remove(struct platf - for (i = 0; i < OB_WIN_COUNT; i++) - advk_pcie_disable_ob_win(pcie, i); - -+ /* Disable phy */ -+ advk_pcie_disable_phy(pcie); -+ - return 0; - } - diff --git a/target/linux/generic/backport-5.10/851-v5.15-0001-phy-marvell-phy-mvebu-a3700-comphy-Rename-HS-SGMMI-t.patch b/target/linux/generic/backport-5.10/851-v5.15-0001-phy-marvell-phy-mvebu-a3700-comphy-Rename-HS-SGMMI-t.patch deleted file mode 100644 index 4f867724ac..0000000000 --- a/target/linux/generic/backport-5.10/851-v5.15-0001-phy-marvell-phy-mvebu-a3700-comphy-Rename-HS-SGMMI-t.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 40da06da15c1718b02072687bbfb2d08f5eb9399 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Fri, 27 Aug 2021 11:27:52 +0200 -Subject: [PATCH] phy: marvell: phy-mvebu-a3700-comphy: Rename HS-SGMMI to - 2500Base-X -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Comphy phy mode 0x3 is incorrectly named. It is not SGMII but rather -2500Base-X mode which runs at 3.125 Gbps speed. - -Rename macro names and comments to 2500Base-X. - -Signed-off-by: Pali Rohár -Fixes: 9695375a3f4a ("phy: add A3700 COMPHY support") -Signed-off-by: David S. Miller ---- - drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - ---- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c -+++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c -@@ -29,7 +29,7 @@ - - #define COMPHY_FW_MODE_SATA 0x1 - #define COMPHY_FW_MODE_SGMII 0x2 --#define COMPHY_FW_MODE_HS_SGMII 0x3 -+#define COMPHY_FW_MODE_2500BASEX 0x3 - #define COMPHY_FW_MODE_USB3H 0x4 - #define COMPHY_FW_MODE_USB3D 0x5 - #define COMPHY_FW_MODE_PCIE 0x6 -@@ -40,7 +40,7 @@ - - #define COMPHY_FW_SPEED_1_25G 0 /* SGMII 1G */ - #define COMPHY_FW_SPEED_2_5G 1 --#define COMPHY_FW_SPEED_3_125G 2 /* SGMII 2.5G */ -+#define COMPHY_FW_SPEED_3_125G 2 /* 2500BASE-X */ - #define COMPHY_FW_SPEED_5G 3 - #define COMPHY_FW_SPEED_5_15625G 4 /* XFI 5G */ - #define COMPHY_FW_SPEED_6G 5 -@@ -84,14 +84,14 @@ static const struct mvebu_a3700_comphy_c - MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_SGMII, 1, - COMPHY_FW_MODE_SGMII), - MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_2500BASEX, 1, -- COMPHY_FW_MODE_HS_SGMII), -+ COMPHY_FW_MODE_2500BASEX), - /* lane 1 */ - MVEBU_A3700_COMPHY_CONF_GEN(1, PHY_MODE_PCIE, 0, - COMPHY_FW_MODE_PCIE), - MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_SGMII, 0, - COMPHY_FW_MODE_SGMII), - MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_2500BASEX, 0, -- COMPHY_FW_MODE_HS_SGMII), -+ COMPHY_FW_MODE_2500BASEX), - /* lane 2 */ - MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_SATA, 0, - COMPHY_FW_MODE_SATA), -@@ -205,7 +205,7 @@ static int mvebu_a3700_comphy_power_on(s - COMPHY_FW_SPEED_1_25G); - break; - case PHY_INTERFACE_MODE_2500BASEX: -- dev_dbg(lane->dev, "set lane %d to HS SGMII mode\n", -+ dev_dbg(lane->dev, "set lane %d to 2500BASEX mode\n", - lane->id); - fw_param = COMPHY_FW_NET(fw_mode, lane->port, - COMPHY_FW_SPEED_3_125G); diff --git a/target/linux/generic/backport-5.10/851-v5.15-0002-phy-marvell-phy-mvebu-a3700-comphy-Remove-unsupporte.patch b/target/linux/generic/backport-5.10/851-v5.15-0002-phy-marvell-phy-mvebu-a3700-comphy-Remove-unsupporte.patch deleted file mode 100644 index 99f56f1c57..0000000000 --- a/target/linux/generic/backport-5.10/851-v5.15-0002-phy-marvell-phy-mvebu-a3700-comphy-Remove-unsupporte.patch +++ /dev/null @@ -1,40 +0,0 @@ -From e1dbe9ecf621b6f71f3d2df3e50731d583f3d27f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Fri, 27 Aug 2021 11:27:53 +0200 -Subject: [PATCH] phy: marvell: phy-mvebu-a3700-comphy: Remove unsupported - modes -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Armada 3700 does not support RXAUI, XFI and neither SFI. Remove unused -macros for these unsupported modes. - -Signed-off-by: Pali Rohár -Fixes: 9695375a3f4a ("phy: add A3700 COMPHY support") -Signed-off-by: David S. Miller ---- - drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 6 ------ - 1 file changed, 6 deletions(-) - ---- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c -+++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c -@@ -33,18 +33,12 @@ - #define COMPHY_FW_MODE_USB3H 0x4 - #define COMPHY_FW_MODE_USB3D 0x5 - #define COMPHY_FW_MODE_PCIE 0x6 --#define COMPHY_FW_MODE_RXAUI 0x7 --#define COMPHY_FW_MODE_XFI 0x8 --#define COMPHY_FW_MODE_SFI 0x9 - #define COMPHY_FW_MODE_USB3 0xa - - #define COMPHY_FW_SPEED_1_25G 0 /* SGMII 1G */ - #define COMPHY_FW_SPEED_2_5G 1 - #define COMPHY_FW_SPEED_3_125G 2 /* 2500BASE-X */ - #define COMPHY_FW_SPEED_5G 3 --#define COMPHY_FW_SPEED_5_15625G 4 /* XFI 5G */ --#define COMPHY_FW_SPEED_6G 5 --#define COMPHY_FW_SPEED_10_3125G 6 /* XFI 10G */ - #define COMPHY_FW_SPEED_MAX 0x3F - - #define COMPHY_FW_MODE(mode) ((mode) << 12) diff --git a/target/linux/generic/backport-5.10/860-v5.17-MIPS-ath79-drop-_machine_restart-again.patch b/target/linux/generic/backport-5.10/860-v5.17-MIPS-ath79-drop-_machine_restart-again.patch deleted file mode 100644 index 971562a8f7..0000000000 --- a/target/linux/generic/backport-5.10/860-v5.17-MIPS-ath79-drop-_machine_restart-again.patch +++ /dev/null @@ -1,49 +0,0 @@ -From d3115128bdafb62628ab41861a4f06f6d02ac320 Mon Sep 17 00:00:00 2001 -From: Lech Perczak -Date: Mon, 10 Jan 2022 23:48:44 +0100 -Subject: MIPS: ath79: drop _machine_restart again - -Commit 81424d0ad0d4 ("MIPS: ath79: Use the reset controller to restart -OF machines") removed setup of _machine_restart on OF machines to use -reset handler in reset controller driver. -While removing remnants of non-OF machines in commit 3a77e0d75eed -("MIPS: ath79: drop machfiles"), this was introduced again, making it -impossible to use additional restart handlers registered through device -tree. Drop setting _machine_restart altogether, and ath79_restart -function, which is no longer used after this. - -Fixes: 3a77e0d75eed ("MIPS: ath79: drop machfiles") -Cc: John Crispin -Cc: Florian Fainelli -Signed-off-by: Lech Perczak -Signed-off-by: Thomas Bogendoerfer ---- - arch/mips/ath79/setup.c | 10 ---------- - 1 file changed, 10 deletions(-) - ---- a/arch/mips/ath79/setup.c -+++ b/arch/mips/ath79/setup.c -@@ -34,15 +34,6 @@ - - static char ath79_sys_type[ATH79_SYS_TYPE_LEN]; - --static void ath79_restart(char *command) --{ -- local_irq_disable(); -- ath79_device_reset_set(AR71XX_RESET_FULL_CHIP); -- for (;;) -- if (cpu_wait) -- cpu_wait(); --} -- - static void ath79_halt(void) - { - while (1) -@@ -233,7 +224,6 @@ void __init plat_mem_setup(void) - - detect_memory_region(0, ATH79_MEM_SIZE_MIN, ATH79_MEM_SIZE_MAX); - -- _machine_restart = ath79_restart; - _machine_halt = ath79_halt; - pm_power_off = ath79_halt; - } diff --git a/target/linux/generic/backport-5.10/880-v5.19-cdc_ether-export-usbnet_cdc_zte_rx_fixup.patch b/target/linux/generic/backport-5.10/880-v5.19-cdc_ether-export-usbnet_cdc_zte_rx_fixup.patch deleted file mode 100644 index b5a226181e..0000000000 --- a/target/linux/generic/backport-5.10/880-v5.19-cdc_ether-export-usbnet_cdc_zte_rx_fixup.patch +++ /dev/null @@ -1,58 +0,0 @@ -From d91a03b72c5f9c25e5b976f8f67bcf279601d644 Mon Sep 17 00:00:00 2001 -From: Lech Perczak -Date: Fri, 1 Apr 2022 22:03:55 +0200 -Subject: [PATCH 1/3] cdc_ether: export usbnet_cdc_zte_rx_fixup -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Commit bfe9b9d2df66 ("cdc_ether: Improve ZTE MF823/831/910 handling") -introduces a workaround for certain ZTE modems reporting invalid MAC -addresses over CDC-ECM. -The same issue was present on their RNDIS interface,which was fixed in -commit a5a18bdf7453 ("rndis_host: Set valid random MAC on buggy devices"). - -However, internal modem of ZTE MF286R router, on its RNDIS interface, also -exhibits a second issue fixed already in CDC-ECM, of the device not -respecting configured random MAC address. In order to share the fixup for -this with rndis_host driver, export the workaround function, which will -be re-used in the following commit in rndis_host. - -Cc: Kristian Evensen -Cc: Bjørn Mork -Cc: Oliver Neukum -Signed-off-by: Lech Perczak ---- - drivers/net/usb/cdc_ether.c | 3 ++- - include/linux/usb/usbnet.h | 1 + - 2 files changed, 3 insertions(+), 1 deletion(-) - ---- a/drivers/net/usb/cdc_ether.c -+++ b/drivers/net/usb/cdc_ether.c -@@ -466,7 +466,7 @@ static int usbnet_cdc_zte_bind(struct us - * device MAC address has been updated). Always set MAC address to that of the - * device. - */ --static int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb) -+int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb) - { - if (skb->len < ETH_HLEN || !(skb->data[0] & 0x02)) - return 1; -@@ -476,6 +476,7 @@ static int usbnet_cdc_zte_rx_fixup(struc - - return 1; - } -+EXPORT_SYMBOL_GPL(usbnet_cdc_zte_rx_fixup); - - /* Ensure correct link state - * ---- a/include/linux/usb/usbnet.h -+++ b/include/linux/usb/usbnet.h -@@ -215,6 +215,7 @@ extern int usbnet_ether_cdc_bind(struct - extern int usbnet_cdc_bind(struct usbnet *, struct usb_interface *); - extern void usbnet_cdc_unbind(struct usbnet *, struct usb_interface *); - extern void usbnet_cdc_status(struct usbnet *, struct urb *); -+extern int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb); - - /* CDC and RNDIS support the same host-chosen packet filters for IN transfers */ - #define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \ diff --git a/target/linux/generic/backport-5.10/881-v5.19-rndis_host-enable-the-bogus-MAC-fixup-for-ZTE-device.patch b/target/linux/generic/backport-5.10/881-v5.19-rndis_host-enable-the-bogus-MAC-fixup-for-ZTE-device.patch deleted file mode 100644 index e37c89a360..0000000000 --- a/target/linux/generic/backport-5.10/881-v5.19-rndis_host-enable-the-bogus-MAC-fixup-for-ZTE-device.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 69a9efb689b43fedf5f19431f1889aa6b8d35d55 Mon Sep 17 00:00:00 2001 -From: Lech Perczak -Date: Fri, 1 Apr 2022 22:04:01 +0200 -Subject: [PATCH 2/3] rndis_host: enable the bogus MAC fixup for ZTE devices - from cdc_ether -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Certain ZTE modems, namely: MF823. MF831, MF910, built-in modem from -MF286R, expose both CDC-ECM and RNDIS network interfaces. -They have a trait of ignoring the locally-administered MAC address -configured on the interface both in CDC-ECM and RNDIS part, -and this leads to dropping of incoming traffic by the host. -However, the workaround was only present in CDC-ECM, and MF286R -explicitly requires it in RNDIS mode. - -Re-use the workaround in rndis_host as well, to fix operation of MF286R -module, some versions of which expose only the RNDIS interface. Do so by -introducing new flag, RNDIS_DRIVER_DATA_DST_MAC_FIXUP, and testing for it -in rndis_rx_fixup. This is required, as RNDIS uses frame batching, and all -of the packets inside the batch need the fixup. This might introduce a -performance penalty, because test is done for every returned Ethernet -frame. - -Apply the workaround to both "flavors" of RNDIS interfaces, as older ZTE -modems, like MF823 found in the wild, report the USB_CLASS_COMM class -interfaces, while MF286R reports USB_CLASS_WIRELESS_CONTROLLER. - -Suggested-by: Bjørn Mork -Cc: Kristian Evensen -Cc: Oliver Neukum -Signed-off-by: Lech Perczak ---- - drivers/net/usb/rndis_host.c | 32 ++++++++++++++++++++++++++++++++ - include/linux/usb/rndis_host.h | 1 + - 2 files changed, 33 insertions(+) - ---- a/drivers/net/usb/rndis_host.c -+++ b/drivers/net/usb/rndis_host.c -@@ -486,10 +486,14 @@ EXPORT_SYMBOL_GPL(rndis_unbind); - */ - int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb) - { -+ bool dst_mac_fixup; -+ - /* This check is no longer done by usbnet */ - if (skb->len < dev->net->hard_header_len) - return 0; - -+ dst_mac_fixup = !!(dev->driver_info->data & RNDIS_DRIVER_DATA_DST_MAC_FIXUP); -+ - /* peripheral may have batched packets to us... */ - while (likely(skb->len)) { - struct rndis_data_hdr *hdr = (void *)skb->data; -@@ -524,10 +528,17 @@ int rndis_rx_fixup(struct usbnet *dev, s - break; - skb_pull(skb, msg_len - sizeof *hdr); - skb_trim(skb2, data_len); -+ -+ if (unlikely(dst_mac_fixup)) -+ usbnet_cdc_zte_rx_fixup(dev, skb2); -+ - usbnet_skb_return(dev, skb2); - } - - /* caller will usbnet_skb_return the remaining packet */ -+ if (unlikely(dst_mac_fixup)) -+ usbnet_cdc_zte_rx_fixup(dev, skb); -+ - return 1; - } - EXPORT_SYMBOL_GPL(rndis_rx_fixup); -@@ -601,6 +612,17 @@ static const struct driver_info rndis_po - .tx_fixup = rndis_tx_fixup, - }; - -+static const struct driver_info zte_rndis_info = { -+ .description = "ZTE RNDIS device", -+ .flags = FLAG_ETHER | FLAG_POINTTOPOINT | FLAG_FRAMING_RN | FLAG_NO_SETINT, -+ .data = RNDIS_DRIVER_DATA_DST_MAC_FIXUP, -+ .bind = rndis_bind, -+ .unbind = rndis_unbind, -+ .status = rndis_status, -+ .rx_fixup = rndis_rx_fixup, -+ .tx_fixup = rndis_tx_fixup, -+}; -+ - /*-------------------------------------------------------------------------*/ - - static const struct usb_device_id products [] = { -@@ -610,6 +632,16 @@ static const struct usb_device_id produc - USB_CLASS_COMM, 2 /* ACM */, 0x0ff), - .driver_info = (unsigned long) &rndis_poll_status_info, - }, { -+ /* ZTE WWAN modules */ -+ USB_VENDOR_AND_INTERFACE_INFO(0x19d2, -+ USB_CLASS_WIRELESS_CONTROLLER, 1, 3), -+ .driver_info = (unsigned long)&zte_rndis_info, -+}, { -+ /* ZTE WWAN modules, ACM flavour */ -+ USB_VENDOR_AND_INTERFACE_INFO(0x19d2, -+ USB_CLASS_COMM, 2 /* ACM */, 0x0ff), -+ .driver_info = (unsigned long)&zte_rndis_info, -+}, { - /* Hytera Communications DMR radios' "Radio to PC Network" */ - USB_VENDOR_AND_INTERFACE_INFO(0x238b, - USB_CLASS_COMM, 2 /* ACM */, 0x0ff), ---- a/include/linux/usb/rndis_host.h -+++ b/include/linux/usb/rndis_host.h -@@ -197,6 +197,7 @@ struct rndis_keepalive_c { /* IN (option - - /* Flags for driver_info::data */ - #define RNDIS_DRIVER_DATA_POLL_STATUS 1 /* poll status before control */ -+#define RNDIS_DRIVER_DATA_DST_MAC_FIXUP 2 /* device ignores configured MAC address */ - - extern void rndis_status(struct usbnet *dev, struct urb *urb); - extern int diff --git a/target/linux/generic/backport-5.10/882-v5.19-rndis_host-limit-scope-of-bogus-MAC-address-detectio.patch b/target/linux/generic/backport-5.10/882-v5.19-rndis_host-limit-scope-of-bogus-MAC-address-detectio.patch deleted file mode 100644 index 38d0227714..0000000000 --- a/target/linux/generic/backport-5.10/882-v5.19-rndis_host-limit-scope-of-bogus-MAC-address-detectio.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 1bfbe1799b9ec5d00f7f032d6e7db1980e466aeb Mon Sep 17 00:00:00 2001 -From: Lech Perczak -Date: Sat, 2 Apr 2022 02:19:57 +0200 -Subject: [PATCH 3/3] rndis_host: limit scope of bogus MAC address detection to - ZTE devices -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Reporting of bogus MAC addresses and ignoring configuration of new -destination address wasn't observed outside of a range of ZTE devices, -among which this seems to be the common bug. Align rndis_host driver -with implementation found in cdc_ether, which also limits this workaround -to ZTE devices. - -Suggested-by: Bjørn Mork -Cc: Kristian Evensen -Cc: Oliver Neukum -Signed-off-by: Lech Perczak ---- - drivers/net/usb/rndis_host.c | 17 ++++++++++++----- - 1 file changed, 12 insertions(+), 5 deletions(-) - ---- a/drivers/net/usb/rndis_host.c -+++ b/drivers/net/usb/rndis_host.c -@@ -419,10 +419,7 @@ generic_rndis_bind(struct usbnet *dev, s - goto halt_fail_and_release; - } - -- if (bp[0] & 0x02) -- eth_hw_addr_random(net); -- else -- ether_addr_copy(net->dev_addr, bp); -+ ether_addr_copy(net->dev_addr, bp); - - /* set a nonzero filter to enable data transfers */ - memset(u.set, 0, sizeof *u.set); -@@ -464,6 +461,16 @@ static int rndis_bind(struct usbnet *dev - return generic_rndis_bind(dev, intf, FLAG_RNDIS_PHYM_NOT_WIRELESS); - } - -+static int zte_rndis_bind(struct usbnet *dev, struct usb_interface *intf) -+{ -+ int status = rndis_bind(dev, intf); -+ -+ if (!status && (dev->net->dev_addr[0] & 0x02)) -+ eth_hw_addr_random(dev->net); -+ -+ return status; -+} -+ - void rndis_unbind(struct usbnet *dev, struct usb_interface *intf) - { - struct rndis_halt *halt; -@@ -616,7 +623,7 @@ static const struct driver_info zte_rndi - .description = "ZTE RNDIS device", - .flags = FLAG_ETHER | FLAG_POINTTOPOINT | FLAG_FRAMING_RN | FLAG_NO_SETINT, - .data = RNDIS_DRIVER_DATA_DST_MAC_FIXUP, -- .bind = rndis_bind, -+ .bind = zte_rndis_bind, - .unbind = rndis_unbind, - .status = rndis_status, - .rx_fixup = rndis_rx_fixup, diff --git a/target/linux/generic/backport-5.15/005-v5.17-01-Kbuild-use-Wdeclaration-after-statement.patch b/target/linux/generic/backport-5.15/005-v5.17-01-Kbuild-use-Wdeclaration-after-statement.patch new file mode 100644 index 0000000000..b481dd3061 --- /dev/null +++ b/target/linux/generic/backport-5.15/005-v5.17-01-Kbuild-use-Wdeclaration-after-statement.patch @@ -0,0 +1,73 @@ +From 2fd7e7f9317d3048a14026816d081b08ba98ea8e Mon Sep 17 00:00:00 2001 +From: Mark Rutland +Date: Tue, 8 Mar 2022 22:56:13 +0100 +Subject: [PATCH 1/3] Kbuild: use -Wdeclaration-after-statement + +The kernel is moving from using `-std=gnu89` to `-std=gnu11`, permitting +the use of additional C11 features such as for-loop initial declarations. + +One contentious aspect of C99 is that it permits mixed declarations and +code, and for now at least, it seems preferable to enforce that +declarations must come first. + +These warnings were already enabled in the kernel itself, but not +for KBUILD_USERCFLAGS or the compat VDSO on arch/arm64, which uses +a separate set of CFLAGS. + +This patch fixes an existing violation in modpost.c, which is not +reported because of the missing flag in KBUILD_USERCFLAGS: + +| scripts/mod/modpost.c: In function ‘match’: +| scripts/mod/modpost.c:837:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] +| 837 | const char *endp = p + strlen(p) - 1; +| | ^~~~~ + +Signed-off-by: Mark Rutland +[arnd: don't add a duplicate flag to the default set, update changelog] +Signed-off-by: Arnd Bergmann +Reviewed-by: Nathan Chancellor +Reviewed-by: Nick Desaulniers +Tested-by: Sedat Dilek # LLVM/Clang v13.0.0 (x86-64) +Signed-off-by: Masahiro Yamada +--- + Makefile | 3 ++- + arch/arm64/kernel/vdso32/Makefile | 1 + + scripts/mod/modpost.c | 4 +++- + 3 files changed, 6 insertions(+), 2 deletions(-) + +--- a/Makefile ++++ b/Makefile +@@ -440,7 +440,8 @@ endif + HOSTPKG_CONFIG = pkg-config + + export KBUILD_USERCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \ +- -O2 -fomit-frame-pointer -std=gnu89 ++ -O2 -fomit-frame-pointer -std=gnu89 \ ++ -Wdeclaration-after-statement + export KBUILD_USERLDFLAGS := + + KBUILD_HOSTCFLAGS := $(KBUILD_USERCFLAGS) $(HOST_LFS_CFLAGS) $(HOSTCFLAGS) +--- a/arch/arm64/kernel/vdso32/Makefile ++++ b/arch/arm64/kernel/vdso32/Makefile +@@ -76,6 +76,7 @@ VDSO_CFLAGS += -Wall -Wundef -Wstrict-pr + -fno-strict-aliasing -fno-common \ + -Werror-implicit-function-declaration \ + -Wno-format-security \ ++ -Wdeclaration-after-statement \ + -std=gnu89 + VDSO_CFLAGS += -O2 + # Some useful compiler-dependent flags from top-level Makefile +--- a/scripts/mod/modpost.c ++++ b/scripts/mod/modpost.c +@@ -833,8 +833,10 @@ static int match(const char *sym, const + { + const char *p; + while (*pat) { ++ const char *endp; ++ + p = *pat++; +- const char *endp = p + strlen(p) - 1; ++ endp = p + strlen(p) - 1; + + /* "*foo*" */ + if (*p == '*' && *endp == '*') { diff --git a/target/linux/generic/backport-5.15/005-v5.17-02-Kbuild-move-to-std-gnu11.patch b/target/linux/generic/backport-5.15/005-v5.17-02-Kbuild-move-to-std-gnu11.patch new file mode 100644 index 0000000000..94fc52fd8e --- /dev/null +++ b/target/linux/generic/backport-5.15/005-v5.17-02-Kbuild-move-to-std-gnu11.patch @@ -0,0 +1,60 @@ +From b810c8e719ea082e47c7a8f7cf878bc84fa2455d Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Tue, 8 Mar 2022 22:56:14 +0100 +Subject: [PATCH 2/3] Kbuild: move to -std=gnu11 + +During a patch discussion, Linus brought up the option of changing +the C standard version from gnu89 to gnu99, which allows using variable +declaration inside of a for() loop. While the C99, C11 and later standards +introduce many other features, most of these are already available in +gnu89 as GNU extensions as well. + +An earlier attempt to do this when gcc-5 started defaulting to +-std=gnu11 failed because at the time that caused warnings about +designated initializers with older compilers. Now that gcc-5.1 is +the minimum compiler version used for building kernels, that is no +longer a concern. Similarly, the behavior of 'inline' functions changes +between gnu89 using gnu_inline behavior and gnu11 using standard c99+ +behavior, but this was taken care of by defining 'inline' to include +__attribute__((gnu_inline)) in order to allow building with clang a +while ago. + +Nathan Chancellor reported a new -Wdeclaration-after-statement +warning that appears in a system header on arm, this still needs a +workaround. + +The differences between gnu99, gnu11, gnu1x and gnu17 are fairly +minimal and mainly impact warnings at the -Wpedantic level that the +kernel never enables. Between these, gnu11 is the newest version +that is supported by all supported compiler versions, though it is +only the default on gcc-5, while all other supported versions of +gcc or clang default to gnu1x/gnu17. + +Link: https://lore.kernel.org/lkml/CAHk-=wiyCH7xeHcmiFJ-YgXUy2Jaj7pnkdKpcovt8fYbVFW3TA@mail.gmail.com/ +Link: https://github.com/ClangBuiltLinux/linux/issues/1603 +Suggested-by: Linus Torvalds +Acked-by: Marco Elver +Acked-by: Jani Nikula +Acked-by: David Sterba +Tested-by: Sedat Dilek +Reviewed-by: Alex Shi +Reviewed-by: Nick Desaulniers +Reviewed-by: Miguel Ojeda +Signed-off-by: Arnd Bergmann +Reviewed-by: Nathan Chancellor +Signed-off-by: Masahiro Yamada +--- + Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/Makefile ++++ b/Makefile +@@ -524,7 +524,7 @@ KBUILD_CFLAGS := -Wall -Wundef -Werror + -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \ + -Werror=implicit-function-declaration -Werror=implicit-int \ + -Werror=return-type -Wno-format-security \ +- -std=gnu89 ++ -std=gnu11 + KBUILD_CPPFLAGS := -D__KERNEL__ + KBUILD_AFLAGS_KERNEL := + KBUILD_CFLAGS_KERNEL := diff --git a/target/linux/generic/backport-5.15/005-v5.17-03-Kbuild-use-std-gnu11-for-KBUILD_USERCFLAGS.patch b/target/linux/generic/backport-5.15/005-v5.17-03-Kbuild-use-std-gnu11-for-KBUILD_USERCFLAGS.patch new file mode 100644 index 0000000000..e34acbba17 --- /dev/null +++ b/target/linux/generic/backport-5.15/005-v5.17-03-Kbuild-use-std-gnu11-for-KBUILD_USERCFLAGS.patch @@ -0,0 +1,43 @@ +From 40337d6f3d677aee7ad3052ae662d3f53dd4d5cb Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Tue, 8 Mar 2022 22:56:15 +0100 +Subject: [PATCH 3/3] Kbuild: use -std=gnu11 for KBUILD_USERCFLAGS + +As we change the C language standard for the kernel from gnu89 to +gnu11, it makes sense to also update the version for user space +compilation. + +Some users have older native compilers than what they use for +kernel builds, so I considered using gnu99 as the default version +for wider compatibility with gcc-4.6 and earlier. + +However, testing with older compilers showed that we already require +HOSTCC version 5.1 as well because a lot of host tools include +linux/compiler.h that uses __has_attribute(): + + CC tools/objtool/exec-cmd.o +In file included from tools/include/linux/compiler_types.h:36:0, + from tools/include/linux/compiler.h:5, + from exec-cmd.c:2: +tools/include/linux/compiler-gcc.h:19:5: error: "__has_attribute" is not defined [-Werror=undef] + +Signed-off-by: Arnd Bergmann +Reviewed-by: Nathan Chancellor +Reviewed-by: Nick Desaulniers +Tested-by: Sedat Dilek +Signed-off-by: Masahiro Yamada +--- + Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/Makefile ++++ b/Makefile +@@ -440,7 +440,7 @@ endif + HOSTPKG_CONFIG = pkg-config + + export KBUILD_USERCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \ +- -O2 -fomit-frame-pointer -std=gnu89 \ ++ -O2 -fomit-frame-pointer -std=gnu11 \ + -Wdeclaration-after-statement + export KBUILD_USERLDFLAGS := + diff --git a/target/linux/generic/backport-5.15/020-v6.1-01-mm-x86-arm64-add-arch_has_hw_pte_young.patch b/target/linux/generic/backport-5.15/020-v6.1-01-mm-x86-arm64-add-arch_has_hw_pte_young.patch new file mode 100644 index 0000000000..5a666f1d16 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-01-mm-x86-arm64-add-arch_has_hw_pte_young.patch @@ -0,0 +1,425 @@ +From a4103262b01a1b8704b37c01c7c813df91b7b119 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 01:59:58 -0600 +Subject: [PATCH 01/29] mm: x86, arm64: add arch_has_hw_pte_young() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Patch series "Multi-Gen LRU Framework", v14. + +What's new +========== +1. libreCMC, in addition to Android, Arch Linux Zen, Armbian, ChromeOS, + Liquorix, post-factum and XanMod, is now shipping MGLRU on 5.15. +2. Fixed long-tailed direct reclaim latency seen on high-memory (TBs) + machines. The old direct reclaim backoff, which tries to enforce a + minimum fairness among all eligible memcgs, over-swapped by about + (total_mem>>DEF_PRIORITY)-nr_to_reclaim. The new backoff, which + pulls the plug on swapping once the target is met, trades some + fairness for curtailed latency: + https://lore.kernel.org/r/20220918080010.2920238-10-yuzhao@google.com/ +3. Fixed minior build warnings and conflicts. More comments and nits. + +TLDR +==== +The current page reclaim is too expensive in terms of CPU usage and it +often makes poor choices about what to evict. This patchset offers an +alternative solution that is performant, versatile and +straightforward. + +Patchset overview +================= +The design and implementation overview is in patch 14: +https://lore.kernel.org/r/20220918080010.2920238-15-yuzhao@google.com/ + +01. mm: x86, arm64: add arch_has_hw_pte_young() +02. mm: x86: add CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG +Take advantage of hardware features when trying to clear the accessed +bit in many PTEs. + +03. mm/vmscan.c: refactor shrink_node() +04. Revert "include/linux/mm_inline.h: fold __update_lru_size() into + its sole caller" +Minor refactors to improve readability for the following patches. + +05. mm: multi-gen LRU: groundwork +Adds the basic data structure and the functions that insert pages to +and remove pages from the multi-gen LRU (MGLRU) lists. + +06. mm: multi-gen LRU: minimal implementation +A minimal implementation without optimizations. + +07. mm: multi-gen LRU: exploit locality in rmap +Exploits spatial locality to improve efficiency when using the rmap. + +08. mm: multi-gen LRU: support page table walks +Further exploits spatial locality by optionally scanning page tables. + +09. mm: multi-gen LRU: optimize multiple memcgs +Optimizes the overall performance for multiple memcgs running mixed +types of workloads. + +10. mm: multi-gen LRU: kill switch +Adds a kill switch to enable or disable MGLRU at runtime. + +11. mm: multi-gen LRU: thrashing prevention +12. mm: multi-gen LRU: debugfs interface +Provide userspace with features like thrashing prevention, working set +estimation and proactive reclaim. + +13. mm: multi-gen LRU: admin guide +14. mm: multi-gen LRU: design doc +Add an admin guide and a design doc. + +Benchmark results +================= +Independent lab results +----------------------- +Based on the popularity of searches [01] and the memory usage in +Google's public cloud, the most popular open-source memory-hungry +applications, in alphabetical order, are: + Apache Cassandra Memcached + Apache Hadoop MongoDB + Apache Spark PostgreSQL + MariaDB (MySQL) Redis + +An independent lab evaluated MGLRU with the most widely used benchmark +suites for the above applications. They posted 960 data points along +with kernel metrics and perf profiles collected over more than 500 +hours of total benchmark time. Their final reports show that, with 95% +confidence intervals (CIs), the above applications all performed +significantly better for at least part of their benchmark matrices. + +On 5.14: +1. Apache Spark [02] took 95% CIs [9.28, 11.19]% and [12.20, 14.93]% + less wall time to sort three billion random integers, respectively, + under the medium- and the high-concurrency conditions, when + overcommitting memory. There were no statistically significant + changes in wall time for the rest of the benchmark matrix. +2. MariaDB [03] achieved 95% CIs [5.24, 10.71]% and [20.22, 25.97]% + more transactions per minute (TPM), respectively, under the medium- + and the high-concurrency conditions, when overcommitting memory. + There were no statistically significant changes in TPM for the rest + of the benchmark matrix. +3. Memcached [04] achieved 95% CIs [23.54, 32.25]%, [20.76, 41.61]% + and [21.59, 30.02]% more operations per second (OPS), respectively, + for sequential access, random access and Gaussian (distribution) + access, when THP=always; 95% CIs [13.85, 15.97]% and + [23.94, 29.92]% more OPS, respectively, for random access and + Gaussian access, when THP=never. There were no statistically + significant changes in OPS for the rest of the benchmark matrix. +4. MongoDB [05] achieved 95% CIs [2.23, 3.44]%, [6.97, 9.73]% and + [2.16, 3.55]% more operations per second (OPS), respectively, for + exponential (distribution) access, random access and Zipfian + (distribution) access, when underutilizing memory; 95% CIs + [8.83, 10.03]%, [21.12, 23.14]% and [5.53, 6.46]% more OPS, + respectively, for exponential access, random access and Zipfian + access, when overcommitting memory. + +On 5.15: +5. Apache Cassandra [06] achieved 95% CIs [1.06, 4.10]%, [1.94, 5.43]% + and [4.11, 7.50]% more operations per second (OPS), respectively, + for exponential (distribution) access, random access and Zipfian + (distribution) access, when swap was off; 95% CIs [0.50, 2.60]%, + [6.51, 8.77]% and [3.29, 6.75]% more OPS, respectively, for + exponential access, random access and Zipfian access, when swap was + on. +6. Apache Hadoop [07] took 95% CIs [5.31, 9.69]% and [2.02, 7.86]% + less average wall time to finish twelve parallel TeraSort jobs, + respectively, under the medium- and the high-concurrency + conditions, when swap was on. There were no statistically + significant changes in average wall time for the rest of the + benchmark matrix. +7. PostgreSQL [08] achieved 95% CI [1.75, 6.42]% more transactions per + minute (TPM) under the high-concurrency condition, when swap was + off; 95% CIs [12.82, 18.69]% and [22.70, 46.86]% more TPM, + respectively, under the medium- and the high-concurrency + conditions, when swap was on. There were no statistically + significant changes in TPM for the rest of the benchmark matrix. +8. Redis [09] achieved 95% CIs [0.58, 5.94]%, [6.55, 14.58]% and + [11.47, 19.36]% more total operations per second (OPS), + respectively, for sequential access, random access and Gaussian + (distribution) access, when THP=always; 95% CIs [1.27, 3.54]%, + [10.11, 14.81]% and [8.75, 13.64]% more total OPS, respectively, + for sequential access, random access and Gaussian access, when + THP=never. + +Our lab results +--------------- +To supplement the above results, we ran the following benchmark suites +on 5.16-rc7 and found no regressions [10]. + fs_fio_bench_hdd_mq pft + fs_lmbench pgsql-hammerdb + fs_parallelio redis + fs_postmark stream + hackbench sysbenchthread + kernbench tpcc_spark + memcached unixbench + multichase vm-scalability + mutilate will-it-scale + nginx + +[01] https://trends.google.com +[02] https://lore.kernel.org/r/20211102002002.92051-1-bot@edi.works/ +[03] https://lore.kernel.org/r/20211009054315.47073-1-bot@edi.works/ +[04] https://lore.kernel.org/r/20211021194103.65648-1-bot@edi.works/ +[05] https://lore.kernel.org/r/20211109021346.50266-1-bot@edi.works/ +[06] https://lore.kernel.org/r/20211202062806.80365-1-bot@edi.works/ +[07] https://lore.kernel.org/r/20211209072416.33606-1-bot@edi.works/ +[08] https://lore.kernel.org/r/20211218071041.24077-1-bot@edi.works/ +[09] https://lore.kernel.org/r/20211122053248.57311-1-bot@edi.works/ +[10] https://lore.kernel.org/r/20220104202247.2903702-1-yuzhao@google.com/ + +Read-world applications +======================= +Third-party testimonials +------------------------ +Konstantin reported [11]: + I have Archlinux with 8G RAM + zswap + swap. While developing, I + have lots of apps opened such as multiple LSP-servers for different + langs, chats, two browsers, etc... Usually, my system gets quickly + to a point of SWAP-storms, where I have to kill LSP-servers, + restart browsers to free memory, etc, otherwise the system lags + heavily and is barely usable. + + 1.5 day ago I migrated from 5.11.15 kernel to 5.12 + the LRU + patchset, and I started up by opening lots of apps to create memory + pressure, and worked for a day like this. Till now I had not a + single SWAP-storm, and mind you I got 3.4G in SWAP. I was never + getting to the point of 3G in SWAP before without a single + SWAP-storm. + +Vaibhav from IBM reported [12]: + In a synthetic MongoDB Benchmark, seeing an average of ~19% + throughput improvement on POWER10(Radix MMU + 64K Page Size) with + MGLRU patches on top of 5.16 kernel for MongoDB + YCSB across + three different request distributions, namely, Exponential, Uniform + and Zipfan. + +Shuang from U of Rochester reported [13]: + With the MGLRU, fio achieved 95% CIs [38.95, 40.26]%, [4.12, 6.64]% + and [9.26, 10.36]% higher throughput, respectively, for random + access, Zipfian (distribution) access and Gaussian (distribution) + access, when the average number of jobs per CPU is 1; 95% CIs + [42.32, 49.15]%, [9.44, 9.89]% and [20.99, 22.86]% higher + throughput, respectively, for random access, Zipfian access and + Gaussian access, when the average number of jobs per CPU is 2. + +Daniel from Michigan Tech reported [14]: + With Memcached allocating ~100GB of byte-addressable Optante, + performance improvement in terms of throughput (measured as queries + per second) was about 10% for a series of workloads. + +Large-scale deployments +----------------------- +We've rolled out MGLRU to tens of millions of ChromeOS users and +about a million Android users. Google's fleetwide profiling [15] shows +an overall 40% decrease in kswapd CPU usage, in addition to +improvements in other UX metrics, e.g., an 85% decrease in the number +of low-memory kills at the 75th percentile and an 18% decrease in +app launch time at the 50th percentile. + +The downstream kernels that have been using MGLRU include: +1. Android [16] +2. Arch Linux Zen [17] +3. Armbian [18] +4. ChromeOS [19] +5. Liquorix [20] +6. libreCMC [21] +7. post-factum [22] +8. XanMod [23] + +[11] https://lore.kernel.org/r/140226722f2032c86301fbd326d91baefe3d7d23.camel@yandex.ru/ +[12] https://lore.kernel.org/r/87czj3mux0.fsf@vajain21.in.ibm.com/ +[13] https://lore.kernel.org/r/20220105024423.26409-1-szhai2@cs.rochester.edu/ +[14] https://lore.kernel.org/r/CA+4-3vksGvKd18FgRinxhqHetBS1hQekJE2gwco8Ja-bJWKtFw@mail.gmail.com/ +[15] https://dl.acm.org/doi/10.1145/2749469.2750392 +[16] https://android.com +[17] https://archlinux.org +[18] https://armbian.com +[19] https://chromium.org +[20] https://liquorix.net +[21] https://openwrt.org +[22] https://codeberg.org/pf-kernel +[23] https://xanmod.org + +Summary +======= +The facts are: +1. The independent lab results and the real-world applications + indicate substantial improvements; there are no known regressions. +2. Thrashing prevention, working set estimation and proactive reclaim + work out of the box; there are no equivalent solutions. +3. There is a lot of new code; no smaller changes have been + demonstrated similar effects. + +Our options, accordingly, are: +1. Given the amount of evidence, the reported improvements will likely + materialize for a wide range of workloads. +2. Gauging the interest from the past discussions, the new features + will likely be put to use for both personal computers and data + centers. +3. Based on Google's track record, the new code will likely be well + maintained in the long term. It'd be more difficult if not + impossible to achieve similar effects with other approaches. + +This patch (of 14): + +Some architectures automatically set the accessed bit in PTEs, e.g., x86 +and arm64 v8.2. On architectures that do not have this capability, +clearing the accessed bit in a PTE usually triggers a page fault following +the TLB miss of this PTE (to emulate the accessed bit). + +Being aware of this capability can help make better decisions, e.g., +whether to spread the work out over a period of time to reduce bursty page +faults when trying to clear the accessed bit in many PTEs. + +Note that theoretically this capability can be unreliable, e.g., +hotplugged CPUs might be different from builtin ones. Therefore it should +not be used in architecture-independent code that involves correctness, +e.g., to determine whether TLB flushes are required (in combination with +the accessed bit). + +Link: https://lkml.kernel.org/r/20220918080010.2920238-1-yuzhao@google.com +Link: https://lkml.kernel.org/r/20220918080010.2920238-2-yuzhao@google.com +Signed-off-by: Yu Zhao +Reviewed-by: Barry Song +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Acked-by: Will Deacon +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: linux-arm-kernel@lists.infradead.org +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Miaohe Lin +Cc: Mike Rapoport +Cc: Qi Zheng +Signed-off-by: Andrew Morton +--- + arch/arm64/include/asm/pgtable.h | 14 ++------------ + arch/x86/include/asm/pgtable.h | 6 +++--- + include/linux/pgtable.h | 13 +++++++++++++ + mm/memory.c | 14 +------------- + 4 files changed, 19 insertions(+), 28 deletions(-) + +--- a/arch/arm64/include/asm/pgtable.h ++++ b/arch/arm64/include/asm/pgtable.h +@@ -1005,23 +1005,13 @@ static inline void update_mmu_cache(stru + * page after fork() + CoW for pfn mappings. We don't always have a + * hardware-managed access flag on arm64. + */ +-static inline bool arch_faults_on_old_pte(void) +-{ +- WARN_ON(preemptible()); +- +- return !cpu_has_hw_af(); +-} +-#define arch_faults_on_old_pte arch_faults_on_old_pte ++#define arch_has_hw_pte_young cpu_has_hw_af + + /* + * Experimentally, it's cheap to set the access flag in hardware and we + * benefit from prefaulting mappings as 'old' to start with. + */ +-static inline bool arch_wants_old_prefaulted_pte(void) +-{ +- return !arch_faults_on_old_pte(); +-} +-#define arch_wants_old_prefaulted_pte arch_wants_old_prefaulted_pte ++#define arch_wants_old_prefaulted_pte cpu_has_hw_af + + #endif /* !__ASSEMBLY__ */ + +--- a/arch/x86/include/asm/pgtable.h ++++ b/arch/x86/include/asm/pgtable.h +@@ -1397,10 +1397,10 @@ static inline bool arch_has_pfn_modify_c + return boot_cpu_has_bug(X86_BUG_L1TF); + } + +-#define arch_faults_on_old_pte arch_faults_on_old_pte +-static inline bool arch_faults_on_old_pte(void) ++#define arch_has_hw_pte_young arch_has_hw_pte_young ++static inline bool arch_has_hw_pte_young(void) + { +- return false; ++ return true; + } + + #endif /* __ASSEMBLY__ */ +--- a/include/linux/pgtable.h ++++ b/include/linux/pgtable.h +@@ -259,6 +259,19 @@ static inline int pmdp_clear_flush_young + #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ + #endif + ++#ifndef arch_has_hw_pte_young ++/* ++ * Return whether the accessed bit is supported on the local CPU. ++ * ++ * This stub assumes accessing through an old PTE triggers a page fault. ++ * Architectures that automatically set the access bit should overwrite it. ++ */ ++static inline bool arch_has_hw_pte_young(void) ++{ ++ return false; ++} ++#endif ++ + #ifndef __HAVE_ARCH_PTEP_GET_AND_CLEAR + static inline pte_t ptep_get_and_clear(struct mm_struct *mm, + unsigned long address, +--- a/mm/memory.c ++++ b/mm/memory.c +@@ -121,18 +121,6 @@ int randomize_va_space __read_mostly = + 2; + #endif + +-#ifndef arch_faults_on_old_pte +-static inline bool arch_faults_on_old_pte(void) +-{ +- /* +- * Those arches which don't have hw access flag feature need to +- * implement their own helper. By default, "true" means pagefault +- * will be hit on old pte. +- */ +- return true; +-} +-#endif +- + #ifndef arch_wants_old_prefaulted_pte + static inline bool arch_wants_old_prefaulted_pte(void) + { +@@ -2791,7 +2779,7 @@ static inline int cow_user_page(struct p + * On architectures with software "accessed" bits, we would + * take a double page fault, so mark it accessed here. + */ +- if (arch_faults_on_old_pte() && !pte_young(vmf->orig_pte)) { ++ if (!arch_has_hw_pte_young() && !pte_young(vmf->orig_pte)) { + pte_t entry; + + vmf->pte = pte_offset_map_lock(mm, vmf->pmd, addr, &vmf->ptl); diff --git a/target/linux/generic/backport-5.15/020-v6.1-02-mm-x86-add-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch b/target/linux/generic/backport-5.15/020-v6.1-02-mm-x86-add-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch new file mode 100644 index 0000000000..27c85a333b --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-02-mm-x86-add-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch @@ -0,0 +1,153 @@ +From 493de1c4b0f2cd909169401da8c445f6c8a7e29d Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 01:59:59 -0600 +Subject: [PATCH 02/29] mm: x86: add CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Some architectures support the accessed bit in non-leaf PMD entries, e.g., +x86 sets the accessed bit in a non-leaf PMD entry when using it as part of +linear address translation [1]. Page table walkers that clear the +accessed bit may use this capability to reduce their search space. + +Note that: +1. Although an inline function is preferable, this capability is added + as a configuration option for consistency with the existing macros. +2. Due to the little interest in other varieties, this capability was + only tested on Intel and AMD CPUs. + +Thanks to the following developers for their efforts [2][3]. + Randy Dunlap + Stephen Rothwell + +[1]: Intel 64 and IA-32 Architectures Software Developer's Manual + Volume 3 (June 2021), section 4.8 +[2] https://lore.kernel.org/r/bfdcc7c8-922f-61a9-aa15-7e7250f04af7@infradead.org/ +[3] https://lore.kernel.org/r/20220413151513.5a0d7a7e@canb.auug.org.au/ + +Link: https://lkml.kernel.org/r/20220918080010.2920238-3-yuzhao@google.com +Signed-off-by: Yu Zhao +Reviewed-by: Barry Song +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Miaohe Lin +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Qi Zheng +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Will Deacon +Signed-off-by: Andrew Morton +--- + arch/Kconfig | 8 ++++++++ + arch/x86/Kconfig | 1 + + arch/x86/include/asm/pgtable.h | 3 ++- + arch/x86/mm/pgtable.c | 5 ++++- + include/linux/pgtable.h | 4 ++-- + 5 files changed, 17 insertions(+), 4 deletions(-) + +--- a/arch/Kconfig ++++ b/arch/Kconfig +@@ -1298,6 +1298,14 @@ config ARCH_HAS_ELFCORE_COMPAT + config ARCH_HAS_PARANOID_L1D_FLUSH + bool + ++config ARCH_HAS_NONLEAF_PMD_YOUNG ++ bool ++ help ++ Architectures that select this option are capable of setting the ++ accessed bit in non-leaf PMD entries when using them as part of linear ++ address translations. Page table walkers that clear the accessed bit ++ may use this capability to reduce their search space. ++ + source "kernel/gcov/Kconfig" + + source "scripts/gcc-plugins/Kconfig" +--- a/arch/x86/Kconfig ++++ b/arch/x86/Kconfig +@@ -85,6 +85,7 @@ config X86 + select ARCH_HAS_PMEM_API if X86_64 + select ARCH_HAS_PTE_DEVMAP if X86_64 + select ARCH_HAS_PTE_SPECIAL ++ select ARCH_HAS_NONLEAF_PMD_YOUNG if PGTABLE_LEVELS > 2 + select ARCH_HAS_UACCESS_FLUSHCACHE if X86_64 + select ARCH_HAS_COPY_MC if X86_64 + select ARCH_HAS_SET_MEMORY +--- a/arch/x86/include/asm/pgtable.h ++++ b/arch/x86/include/asm/pgtable.h +@@ -817,7 +817,8 @@ static inline unsigned long pmd_page_vad + + static inline int pmd_bad(pmd_t pmd) + { +- return (pmd_flags(pmd) & ~_PAGE_USER) != _KERNPG_TABLE; ++ return (pmd_flags(pmd) & ~(_PAGE_USER | _PAGE_ACCESSED)) != ++ (_KERNPG_TABLE & ~_PAGE_ACCESSED); + } + + static inline unsigned long pages_to_mb(unsigned long npg) +--- a/arch/x86/mm/pgtable.c ++++ b/arch/x86/mm/pgtable.c +@@ -550,7 +550,7 @@ int ptep_test_and_clear_young(struct vm_ + return ret; + } + +-#ifdef CONFIG_TRANSPARENT_HUGEPAGE ++#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) + int pmdp_test_and_clear_young(struct vm_area_struct *vma, + unsigned long addr, pmd_t *pmdp) + { +@@ -562,6 +562,9 @@ int pmdp_test_and_clear_young(struct vm_ + + return ret; + } ++#endif ++ ++#ifdef CONFIG_TRANSPARENT_HUGEPAGE + int pudp_test_and_clear_young(struct vm_area_struct *vma, + unsigned long addr, pud_t *pudp) + { +--- a/include/linux/pgtable.h ++++ b/include/linux/pgtable.h +@@ -212,7 +212,7 @@ static inline int ptep_test_and_clear_yo + #endif + + #ifndef __HAVE_ARCH_PMDP_TEST_AND_CLEAR_YOUNG +-#ifdef CONFIG_TRANSPARENT_HUGEPAGE ++#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) + static inline int pmdp_test_and_clear_young(struct vm_area_struct *vma, + unsigned long address, + pmd_t *pmdp) +@@ -233,7 +233,7 @@ static inline int pmdp_test_and_clear_yo + BUILD_BUG(); + return 0; + } +-#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ ++#endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG */ + #endif + + #ifndef __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH diff --git a/target/linux/generic/backport-5.15/020-v6.1-03-mm-vmscan.c-refactor-shrink_node.patch b/target/linux/generic/backport-5.15/020-v6.1-03-mm-vmscan.c-refactor-shrink_node.patch new file mode 100644 index 0000000000..b8d2917d26 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-03-mm-vmscan.c-refactor-shrink_node.patch @@ -0,0 +1,275 @@ +From 9e17efd11450d3d2069adaa3c58db9ac8ebd1c66 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 02:00:00 -0600 +Subject: [PATCH 03/29] mm/vmscan.c: refactor shrink_node() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch refactors shrink_node() to improve readability for the upcoming +changes to mm/vmscan.c. + +Link: https://lkml.kernel.org/r/20220918080010.2920238-4-yuzhao@google.com +Signed-off-by: Yu Zhao +Reviewed-by: Barry Song +Reviewed-by: Miaohe Lin +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Qi Zheng +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Will Deacon +Signed-off-by: Andrew Morton +--- + mm/vmscan.c | 198 +++++++++++++++++++++++++++------------------------- + 1 file changed, 104 insertions(+), 94 deletions(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -2497,6 +2497,109 @@ enum scan_balance { + SCAN_FILE, + }; + ++static void prepare_scan_count(pg_data_t *pgdat, struct scan_control *sc) ++{ ++ unsigned long file; ++ struct lruvec *target_lruvec; ++ ++ target_lruvec = mem_cgroup_lruvec(sc->target_mem_cgroup, pgdat); ++ ++ /* ++ * Flush the memory cgroup stats, so that we read accurate per-memcg ++ * lruvec stats for heuristics. ++ */ ++ mem_cgroup_flush_stats(); ++ ++ /* ++ * Determine the scan balance between anon and file LRUs. ++ */ ++ spin_lock_irq(&target_lruvec->lru_lock); ++ sc->anon_cost = target_lruvec->anon_cost; ++ sc->file_cost = target_lruvec->file_cost; ++ spin_unlock_irq(&target_lruvec->lru_lock); ++ ++ /* ++ * Target desirable inactive:active list ratios for the anon ++ * and file LRU lists. ++ */ ++ if (!sc->force_deactivate) { ++ unsigned long refaults; ++ ++ refaults = lruvec_page_state(target_lruvec, ++ WORKINGSET_ACTIVATE_ANON); ++ if (refaults != target_lruvec->refaults[0] || ++ inactive_is_low(target_lruvec, LRU_INACTIVE_ANON)) ++ sc->may_deactivate |= DEACTIVATE_ANON; ++ else ++ sc->may_deactivate &= ~DEACTIVATE_ANON; ++ ++ /* ++ * When refaults are being observed, it means a new ++ * workingset is being established. Deactivate to get ++ * rid of any stale active pages quickly. ++ */ ++ refaults = lruvec_page_state(target_lruvec, ++ WORKINGSET_ACTIVATE_FILE); ++ if (refaults != target_lruvec->refaults[1] || ++ inactive_is_low(target_lruvec, LRU_INACTIVE_FILE)) ++ sc->may_deactivate |= DEACTIVATE_FILE; ++ else ++ sc->may_deactivate &= ~DEACTIVATE_FILE; ++ } else ++ sc->may_deactivate = DEACTIVATE_ANON | DEACTIVATE_FILE; ++ ++ /* ++ * If we have plenty of inactive file pages that aren't ++ * thrashing, try to reclaim those first before touching ++ * anonymous pages. ++ */ ++ file = lruvec_page_state(target_lruvec, NR_INACTIVE_FILE); ++ if (file >> sc->priority && !(sc->may_deactivate & DEACTIVATE_FILE)) ++ sc->cache_trim_mode = 1; ++ else ++ sc->cache_trim_mode = 0; ++ ++ /* ++ * Prevent the reclaimer from falling into the cache trap: as ++ * cache pages start out inactive, every cache fault will tip ++ * the scan balance towards the file LRU. And as the file LRU ++ * shrinks, so does the window for rotation from references. ++ * This means we have a runaway feedback loop where a tiny ++ * thrashing file LRU becomes infinitely more attractive than ++ * anon pages. Try to detect this based on file LRU size. ++ */ ++ if (!cgroup_reclaim(sc)) { ++ unsigned long total_high_wmark = 0; ++ unsigned long free, anon; ++ int z; ++ ++ free = sum_zone_node_page_state(pgdat->node_id, NR_FREE_PAGES); ++ file = node_page_state(pgdat, NR_ACTIVE_FILE) + ++ node_page_state(pgdat, NR_INACTIVE_FILE); ++ ++ for (z = 0; z < MAX_NR_ZONES; z++) { ++ struct zone *zone = &pgdat->node_zones[z]; ++ ++ if (!managed_zone(zone)) ++ continue; ++ ++ total_high_wmark += high_wmark_pages(zone); ++ } ++ ++ /* ++ * Consider anon: if that's low too, this isn't a ++ * runaway file reclaim problem, but rather just ++ * extreme pressure. Reclaim as per usual then. ++ */ ++ anon = node_page_state(pgdat, NR_INACTIVE_ANON); ++ ++ sc->file_is_tiny = ++ file + free <= total_high_wmark && ++ !(sc->may_deactivate & DEACTIVATE_ANON) && ++ anon >> sc->priority; ++ } ++} ++ + /* + * Determine how aggressively the anon and file LRU lists should be + * scanned. The relative value of each set of LRU lists is determined +@@ -2965,109 +3068,16 @@ static void shrink_node(pg_data_t *pgdat + unsigned long nr_reclaimed, nr_scanned; + struct lruvec *target_lruvec; + bool reclaimable = false; +- unsigned long file; + + target_lruvec = mem_cgroup_lruvec(sc->target_mem_cgroup, pgdat); + + again: +- /* +- * Flush the memory cgroup stats, so that we read accurate per-memcg +- * lruvec stats for heuristics. +- */ +- mem_cgroup_flush_stats(); +- + memset(&sc->nr, 0, sizeof(sc->nr)); + + nr_reclaimed = sc->nr_reclaimed; + nr_scanned = sc->nr_scanned; + +- /* +- * Determine the scan balance between anon and file LRUs. +- */ +- spin_lock_irq(&target_lruvec->lru_lock); +- sc->anon_cost = target_lruvec->anon_cost; +- sc->file_cost = target_lruvec->file_cost; +- spin_unlock_irq(&target_lruvec->lru_lock); +- +- /* +- * Target desirable inactive:active list ratios for the anon +- * and file LRU lists. +- */ +- if (!sc->force_deactivate) { +- unsigned long refaults; +- +- refaults = lruvec_page_state(target_lruvec, +- WORKINGSET_ACTIVATE_ANON); +- if (refaults != target_lruvec->refaults[0] || +- inactive_is_low(target_lruvec, LRU_INACTIVE_ANON)) +- sc->may_deactivate |= DEACTIVATE_ANON; +- else +- sc->may_deactivate &= ~DEACTIVATE_ANON; +- +- /* +- * When refaults are being observed, it means a new +- * workingset is being established. Deactivate to get +- * rid of any stale active pages quickly. +- */ +- refaults = lruvec_page_state(target_lruvec, +- WORKINGSET_ACTIVATE_FILE); +- if (refaults != target_lruvec->refaults[1] || +- inactive_is_low(target_lruvec, LRU_INACTIVE_FILE)) +- sc->may_deactivate |= DEACTIVATE_FILE; +- else +- sc->may_deactivate &= ~DEACTIVATE_FILE; +- } else +- sc->may_deactivate = DEACTIVATE_ANON | DEACTIVATE_FILE; +- +- /* +- * If we have plenty of inactive file pages that aren't +- * thrashing, try to reclaim those first before touching +- * anonymous pages. +- */ +- file = lruvec_page_state(target_lruvec, NR_INACTIVE_FILE); +- if (file >> sc->priority && !(sc->may_deactivate & DEACTIVATE_FILE)) +- sc->cache_trim_mode = 1; +- else +- sc->cache_trim_mode = 0; +- +- /* +- * Prevent the reclaimer from falling into the cache trap: as +- * cache pages start out inactive, every cache fault will tip +- * the scan balance towards the file LRU. And as the file LRU +- * shrinks, so does the window for rotation from references. +- * This means we have a runaway feedback loop where a tiny +- * thrashing file LRU becomes infinitely more attractive than +- * anon pages. Try to detect this based on file LRU size. +- */ +- if (!cgroup_reclaim(sc)) { +- unsigned long total_high_wmark = 0; +- unsigned long free, anon; +- int z; +- +- free = sum_zone_node_page_state(pgdat->node_id, NR_FREE_PAGES); +- file = node_page_state(pgdat, NR_ACTIVE_FILE) + +- node_page_state(pgdat, NR_INACTIVE_FILE); +- +- for (z = 0; z < MAX_NR_ZONES; z++) { +- struct zone *zone = &pgdat->node_zones[z]; +- if (!managed_zone(zone)) +- continue; +- +- total_high_wmark += high_wmark_pages(zone); +- } +- +- /* +- * Consider anon: if that's low too, this isn't a +- * runaway file reclaim problem, but rather just +- * extreme pressure. Reclaim as per usual then. +- */ +- anon = node_page_state(pgdat, NR_INACTIVE_ANON); +- +- sc->file_is_tiny = +- file + free <= total_high_wmark && +- !(sc->may_deactivate & DEACTIVATE_ANON) && +- anon >> sc->priority; +- } ++ prepare_scan_count(pgdat, sc); + + shrink_node_memcgs(pgdat, sc); + diff --git a/target/linux/generic/backport-5.15/020-v6.1-04-Revert-include-linux-mm_inline.h-fold-__update_lru_s.patch b/target/linux/generic/backport-5.15/020-v6.1-04-Revert-include-linux-mm_inline.h-fold-__update_lru_s.patch new file mode 100644 index 0000000000..2f277a56e1 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-04-Revert-include-linux-mm_inline.h-fold-__update_lru_s.patch @@ -0,0 +1,82 @@ +From 03705be42114db7cc5bd6eb7bf7e8703c94d4880 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 02:00:01 -0600 +Subject: [PATCH 04/29] Revert "include/linux/mm_inline.h: fold + __update_lru_size() into its sole caller" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch undoes the following refactor: commit 289ccba18af4 +("include/linux/mm_inline.h: fold __update_lru_size() into its sole +caller") + +The upcoming changes to include/linux/mm_inline.h will reuse +__update_lru_size(). + +Link: https://lkml.kernel.org/r/20220918080010.2920238-5-yuzhao@google.com +Signed-off-by: Yu Zhao +Reviewed-by: Miaohe Lin +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Barry Song +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Qi Zheng +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Will Deacon +Signed-off-by: Andrew Morton +--- + include/linux/mm_inline.h | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +--- a/include/linux/mm_inline.h ++++ b/include/linux/mm_inline.h +@@ -24,7 +24,7 @@ static inline int page_is_file_lru(struc + return !PageSwapBacked(page); + } + +-static __always_inline void update_lru_size(struct lruvec *lruvec, ++static __always_inline void __update_lru_size(struct lruvec *lruvec, + enum lru_list lru, enum zone_type zid, + int nr_pages) + { +@@ -33,6 +33,13 @@ static __always_inline void update_lru_s + __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages); + __mod_zone_page_state(&pgdat->node_zones[zid], + NR_ZONE_LRU_BASE + lru, nr_pages); ++} ++ ++static __always_inline void update_lru_size(struct lruvec *lruvec, ++ enum lru_list lru, enum zone_type zid, ++ long nr_pages) ++{ ++ __update_lru_size(lruvec, lru, zid, nr_pages); + #ifdef CONFIG_MEMCG + mem_cgroup_update_lru_size(lruvec, lru, zid, nr_pages); + #endif diff --git a/target/linux/generic/backport-5.15/020-v6.1-05-mm-multi-gen-LRU-groundwork.patch b/target/linux/generic/backport-5.15/020-v6.1-05-mm-multi-gen-LRU-groundwork.patch new file mode 100644 index 0000000000..769384f500 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-05-mm-multi-gen-LRU-groundwork.patch @@ -0,0 +1,807 @@ +From a9b328add8422921a0dbbef162730800e16e8cfd Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 02:00:02 -0600 +Subject: [PATCH 05/29] mm: multi-gen LRU: groundwork +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Evictable pages are divided into multiple generations for each lruvec. +The youngest generation number is stored in lrugen->max_seq for both +anon and file types as they are aged on an equal footing. The oldest +generation numbers are stored in lrugen->min_seq[] separately for anon +and file types as clean file pages can be evicted regardless of swap +constraints. These three variables are monotonically increasing. + +Generation numbers are truncated into order_base_2(MAX_NR_GENS+1) bits +in order to fit into the gen counter in page->flags. Each truncated +generation number is an index to lrugen->lists[]. The sliding window +technique is used to track at least MIN_NR_GENS and at most +MAX_NR_GENS generations. The gen counter stores a value within [1, +MAX_NR_GENS] while a page is on one of lrugen->lists[]. Otherwise it +stores 0. + +There are two conceptually independent procedures: "the aging", which +produces young generations, and "the eviction", which consumes old +generations. They form a closed-loop system, i.e., "the page reclaim". +Both procedures can be invoked from userspace for the purposes of working +set estimation and proactive reclaim. These techniques are commonly used +to optimize job scheduling (bin packing) in data centers [1][2]. + +To avoid confusion, the terms "hot" and "cold" will be applied to the +multi-gen LRU, as a new convention; the terms "active" and "inactive" will +be applied to the active/inactive LRU, as usual. + +The protection of hot pages and the selection of cold pages are based +on page access channels and patterns. There are two access channels: +one through page tables and the other through file descriptors. The +protection of the former channel is by design stronger because: +1. The uncertainty in determining the access patterns of the former + channel is higher due to the approximation of the accessed bit. +2. The cost of evicting the former channel is higher due to the TLB + flushes required and the likelihood of encountering the dirty bit. +3. The penalty of underprotecting the former channel is higher because + applications usually do not prepare themselves for major page + faults like they do for blocked I/O. E.g., GUI applications + commonly use dedicated I/O threads to avoid blocking rendering + threads. + +There are also two access patterns: one with temporal locality and the +other without. For the reasons listed above, the former channel is +assumed to follow the former pattern unless VM_SEQ_READ or VM_RAND_READ is +present; the latter channel is assumed to follow the latter pattern unless +outlying refaults have been observed [3][4]. + +The next patch will address the "outlying refaults". Three macros, i.e., +LRU_REFS_WIDTH, LRU_REFS_PGOFF and LRU_REFS_MASK, used later are added in +this patch to make the entire patchset less diffy. + +A page is added to the youngest generation on faulting. The aging needs +to check the accessed bit at least twice before handing this page over to +the eviction. The first check takes care of the accessed bit set on the +initial fault; the second check makes sure this page has not been used +since then. This protocol, AKA second chance, requires a minimum of two +generations, hence MIN_NR_GENS. + +[1] https://dl.acm.org/doi/10.1145/3297858.3304053 +[2] https://dl.acm.org/doi/10.1145/3503222.3507731 +[3] https://lwn.net/Articles/495543/ +[4] https://lwn.net/Articles/815342/ + +Link: https://lkml.kernel.org/r/20220918080010.2920238-6-yuzhao@google.com +Signed-off-by: Yu Zhao +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Barry Song +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Miaohe Lin +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Qi Zheng +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Will Deacon +Signed-off-by: Andrew Morton +--- + fs/fuse/dev.c | 3 +- + include/linux/mm.h | 2 + + include/linux/mm_inline.h | 177 +++++++++++++++++++++++++++++- + include/linux/mmzone.h | 100 +++++++++++++++++ + include/linux/page-flags-layout.h | 13 ++- + include/linux/page-flags.h | 4 +- + include/linux/sched.h | 4 + + kernel/bounds.c | 5 + + mm/Kconfig | 8 ++ + mm/huge_memory.c | 3 +- + mm/memcontrol.c | 2 + + mm/memory.c | 25 +++++ + mm/mm_init.c | 6 +- + mm/mmzone.c | 2 + + mm/swap.c | 10 +- + mm/vmscan.c | 75 +++++++++++++ + 16 files changed, 425 insertions(+), 14 deletions(-) + +--- a/fs/fuse/dev.c ++++ b/fs/fuse/dev.c +@@ -785,7 +785,8 @@ static int fuse_check_page(struct page * + 1 << PG_active | + 1 << PG_workingset | + 1 << PG_reclaim | +- 1 << PG_waiters))) { ++ 1 << PG_waiters | ++ LRU_GEN_MASK | LRU_REFS_MASK))) { + dump_page(page, "fuse: trying to steal weird page"); + return 1; + } +--- a/include/linux/mm.h ++++ b/include/linux/mm.h +@@ -1093,6 +1093,8 @@ vm_fault_t finish_mkwrite_fault(struct v + #define ZONES_PGOFF (NODES_PGOFF - ZONES_WIDTH) + #define LAST_CPUPID_PGOFF (ZONES_PGOFF - LAST_CPUPID_WIDTH) + #define KASAN_TAG_PGOFF (LAST_CPUPID_PGOFF - KASAN_TAG_WIDTH) ++#define LRU_GEN_PGOFF (KASAN_TAG_PGOFF - LRU_GEN_WIDTH) ++#define LRU_REFS_PGOFF (LRU_GEN_PGOFF - LRU_REFS_WIDTH) + + /* + * Define the bit shifts to access each section. For non-existent +--- a/include/linux/mm_inline.h ++++ b/include/linux/mm_inline.h +@@ -26,10 +26,13 @@ static inline int page_is_file_lru(struc + + static __always_inline void __update_lru_size(struct lruvec *lruvec, + enum lru_list lru, enum zone_type zid, +- int nr_pages) ++ long nr_pages) + { + struct pglist_data *pgdat = lruvec_pgdat(lruvec); + ++ lockdep_assert_held(&lruvec->lru_lock); ++ WARN_ON_ONCE(nr_pages != (int)nr_pages); ++ + __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages); + __mod_zone_page_state(&pgdat->node_zones[zid], + NR_ZONE_LRU_BASE + lru, nr_pages); +@@ -86,11 +89,177 @@ static __always_inline enum lru_list pag + return lru; + } + ++#ifdef CONFIG_LRU_GEN ++ ++static inline bool lru_gen_enabled(void) ++{ ++ return true; ++} ++ ++static inline bool lru_gen_in_fault(void) ++{ ++ return current->in_lru_fault; ++} ++ ++static inline int lru_gen_from_seq(unsigned long seq) ++{ ++ return seq % MAX_NR_GENS; ++} ++ ++static inline int page_lru_gen(struct page *page) ++{ ++ unsigned long flags = READ_ONCE(page->flags); ++ ++ return ((flags & LRU_GEN_MASK) >> LRU_GEN_PGOFF) - 1; ++} ++ ++static inline bool lru_gen_is_active(struct lruvec *lruvec, int gen) ++{ ++ unsigned long max_seq = lruvec->lrugen.max_seq; ++ ++ VM_WARN_ON_ONCE(gen >= MAX_NR_GENS); ++ ++ /* see the comment on MIN_NR_GENS */ ++ return gen == lru_gen_from_seq(max_seq) || gen == lru_gen_from_seq(max_seq - 1); ++} ++ ++static inline void lru_gen_update_size(struct lruvec *lruvec, struct page *page, ++ int old_gen, int new_gen) ++{ ++ int type = page_is_file_lru(page); ++ int zone = page_zonenum(page); ++ int delta = thp_nr_pages(page); ++ enum lru_list lru = type * LRU_INACTIVE_FILE; ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ ++ VM_WARN_ON_ONCE(old_gen != -1 && old_gen >= MAX_NR_GENS); ++ VM_WARN_ON_ONCE(new_gen != -1 && new_gen >= MAX_NR_GENS); ++ VM_WARN_ON_ONCE(old_gen == -1 && new_gen == -1); ++ ++ if (old_gen >= 0) ++ WRITE_ONCE(lrugen->nr_pages[old_gen][type][zone], ++ lrugen->nr_pages[old_gen][type][zone] - delta); ++ if (new_gen >= 0) ++ WRITE_ONCE(lrugen->nr_pages[new_gen][type][zone], ++ lrugen->nr_pages[new_gen][type][zone] + delta); ++ ++ /* addition */ ++ if (old_gen < 0) { ++ if (lru_gen_is_active(lruvec, new_gen)) ++ lru += LRU_ACTIVE; ++ __update_lru_size(lruvec, lru, zone, delta); ++ return; ++ } ++ ++ /* deletion */ ++ if (new_gen < 0) { ++ if (lru_gen_is_active(lruvec, old_gen)) ++ lru += LRU_ACTIVE; ++ __update_lru_size(lruvec, lru, zone, -delta); ++ return; ++ } ++} ++ ++static inline bool lru_gen_add_page(struct lruvec *lruvec, struct page *page, bool reclaiming) ++{ ++ unsigned long seq; ++ unsigned long flags; ++ int gen = page_lru_gen(page); ++ int type = page_is_file_lru(page); ++ int zone = page_zonenum(page); ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ ++ VM_WARN_ON_ONCE_PAGE(gen != -1, page); ++ ++ if (PageUnevictable(page)) ++ return false; ++ /* ++ * There are three common cases for this page: ++ * 1. If it's hot, e.g., freshly faulted in or previously hot and ++ * migrated, add it to the youngest generation. ++ * 2. If it's cold but can't be evicted immediately, i.e., an anon page ++ * not in swapcache or a dirty page pending writeback, add it to the ++ * second oldest generation. ++ * 3. Everything else (clean, cold) is added to the oldest generation. ++ */ ++ if (PageActive(page)) ++ seq = lrugen->max_seq; ++ else if ((type == LRU_GEN_ANON && !PageSwapCache(page)) || ++ (PageReclaim(page) && ++ (PageDirty(page) || PageWriteback(page)))) ++ seq = lrugen->min_seq[type] + 1; ++ else ++ seq = lrugen->min_seq[type]; ++ ++ gen = lru_gen_from_seq(seq); ++ flags = (gen + 1UL) << LRU_GEN_PGOFF; ++ /* see the comment on MIN_NR_GENS about PG_active */ ++ set_mask_bits(&page->flags, LRU_GEN_MASK | BIT(PG_active), flags); ++ ++ lru_gen_update_size(lruvec, page, -1, gen); ++ /* for rotate_reclaimable_page() */ ++ if (reclaiming) ++ list_add_tail(&page->lru, &lrugen->lists[gen][type][zone]); ++ else ++ list_add(&page->lru, &lrugen->lists[gen][type][zone]); ++ ++ return true; ++} ++ ++static inline bool lru_gen_del_page(struct lruvec *lruvec, struct page *page, bool reclaiming) ++{ ++ unsigned long flags; ++ int gen = page_lru_gen(page); ++ ++ if (gen < 0) ++ return false; ++ ++ VM_WARN_ON_ONCE_PAGE(PageActive(page), page); ++ VM_WARN_ON_ONCE_PAGE(PageUnevictable(page), page); ++ ++ /* for migrate_page_states() */ ++ flags = !reclaiming && lru_gen_is_active(lruvec, gen) ? BIT(PG_active) : 0; ++ flags = set_mask_bits(&page->flags, LRU_GEN_MASK, flags); ++ gen = ((flags & LRU_GEN_MASK) >> LRU_GEN_PGOFF) - 1; ++ ++ lru_gen_update_size(lruvec, page, gen, -1); ++ list_del(&page->lru); ++ ++ return true; ++} ++ ++#else /* !CONFIG_LRU_GEN */ ++ ++static inline bool lru_gen_enabled(void) ++{ ++ return false; ++} ++ ++static inline bool lru_gen_in_fault(void) ++{ ++ return false; ++} ++ ++static inline bool lru_gen_add_page(struct lruvec *lruvec, struct page *page, bool reclaiming) ++{ ++ return false; ++} ++ ++static inline bool lru_gen_del_page(struct lruvec *lruvec, struct page *page, bool reclaiming) ++{ ++ return false; ++} ++ ++#endif /* CONFIG_LRU_GEN */ ++ + static __always_inline void add_page_to_lru_list(struct page *page, + struct lruvec *lruvec) + { + enum lru_list lru = page_lru(page); + ++ if (lru_gen_add_page(lruvec, page, false)) ++ return; ++ + update_lru_size(lruvec, lru, page_zonenum(page), thp_nr_pages(page)); + list_add(&page->lru, &lruvec->lists[lru]); + } +@@ -100,6 +269,9 @@ static __always_inline void add_page_to_ + { + enum lru_list lru = page_lru(page); + ++ if (lru_gen_add_page(lruvec, page, true)) ++ return; ++ + update_lru_size(lruvec, lru, page_zonenum(page), thp_nr_pages(page)); + list_add_tail(&page->lru, &lruvec->lists[lru]); + } +@@ -107,6 +279,9 @@ static __always_inline void add_page_to_ + static __always_inline void del_page_from_lru_list(struct page *page, + struct lruvec *lruvec) + { ++ if (lru_gen_del_page(lruvec, page, false)) ++ return; ++ + list_del(&page->lru); + update_lru_size(lruvec, page_lru(page), page_zonenum(page), + -thp_nr_pages(page)); +--- a/include/linux/mmzone.h ++++ b/include/linux/mmzone.h +@@ -294,6 +294,102 @@ enum lruvec_flags { + */ + }; + ++#endif /* !__GENERATING_BOUNDS_H */ ++ ++/* ++ * Evictable pages are divided into multiple generations. The youngest and the ++ * oldest generation numbers, max_seq and min_seq, are monotonically increasing. ++ * They form a sliding window of a variable size [MIN_NR_GENS, MAX_NR_GENS]. An ++ * offset within MAX_NR_GENS, i.e., gen, indexes the LRU list of the ++ * corresponding generation. The gen counter in page->flags stores gen+1 while ++ * a page is on one of lrugen->lists[]. Otherwise it stores 0. ++ * ++ * A page is added to the youngest generation on faulting. The aging needs to ++ * check the accessed bit at least twice before handing this page over to the ++ * eviction. The first check takes care of the accessed bit set on the initial ++ * fault; the second check makes sure this page hasn't been used since then. ++ * This process, AKA second chance, requires a minimum of two generations, ++ * hence MIN_NR_GENS. And to maintain ABI compatibility with the active/inactive ++ * LRU, e.g., /proc/vmstat, these two generations are considered active; the ++ * rest of generations, if they exist, are considered inactive. See ++ * lru_gen_is_active(). ++ * ++ * PG_active is always cleared while a page is on one of lrugen->lists[] so that ++ * the aging needs not to worry about it. And it's set again when a page ++ * considered active is isolated for non-reclaiming purposes, e.g., migration. ++ * See lru_gen_add_page() and lru_gen_del_page(). ++ * ++ * MAX_NR_GENS is set to 4 so that the multi-gen LRU can support twice the ++ * number of categories of the active/inactive LRU when keeping track of ++ * accesses through page tables. This requires order_base_2(MAX_NR_GENS+1) bits ++ * in page->flags. ++ */ ++#define MIN_NR_GENS 2U ++#define MAX_NR_GENS 4U ++ ++#ifndef __GENERATING_BOUNDS_H ++ ++struct lruvec; ++ ++#define LRU_GEN_MASK ((BIT(LRU_GEN_WIDTH) - 1) << LRU_GEN_PGOFF) ++#define LRU_REFS_MASK ((BIT(LRU_REFS_WIDTH) - 1) << LRU_REFS_PGOFF) ++ ++#ifdef CONFIG_LRU_GEN ++ ++enum { ++ LRU_GEN_ANON, ++ LRU_GEN_FILE, ++}; ++ ++/* ++ * The youngest generation number is stored in max_seq for both anon and file ++ * types as they are aged on an equal footing. The oldest generation numbers are ++ * stored in min_seq[] separately for anon and file types as clean file pages ++ * can be evicted regardless of swap constraints. ++ * ++ * Normally anon and file min_seq are in sync. But if swapping is constrained, ++ * e.g., out of swap space, file min_seq is allowed to advance and leave anon ++ * min_seq behind. ++ * ++ * The number of pages in each generation is eventually consistent and therefore ++ * can be transiently negative. ++ */ ++struct lru_gen_struct { ++ /* the aging increments the youngest generation number */ ++ unsigned long max_seq; ++ /* the eviction increments the oldest generation numbers */ ++ unsigned long min_seq[ANON_AND_FILE]; ++ /* the multi-gen LRU lists, lazily sorted on eviction */ ++ struct list_head lists[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; ++ /* the multi-gen LRU sizes, eventually consistent */ ++ long nr_pages[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; ++}; ++ ++void lru_gen_init_lruvec(struct lruvec *lruvec); ++ ++#ifdef CONFIG_MEMCG ++void lru_gen_init_memcg(struct mem_cgroup *memcg); ++void lru_gen_exit_memcg(struct mem_cgroup *memcg); ++#endif ++ ++#else /* !CONFIG_LRU_GEN */ ++ ++static inline void lru_gen_init_lruvec(struct lruvec *lruvec) ++{ ++} ++ ++#ifdef CONFIG_MEMCG ++static inline void lru_gen_init_memcg(struct mem_cgroup *memcg) ++{ ++} ++ ++static inline void lru_gen_exit_memcg(struct mem_cgroup *memcg) ++{ ++} ++#endif ++ ++#endif /* CONFIG_LRU_GEN */ ++ + struct lruvec { + struct list_head lists[NR_LRU_LISTS]; + /* per lruvec lru_lock for memcg */ +@@ -311,6 +407,10 @@ struct lruvec { + unsigned long refaults[ANON_AND_FILE]; + /* Various lruvec state flags (enum lruvec_flags) */ + unsigned long flags; ++#ifdef CONFIG_LRU_GEN ++ /* evictable pages divided into generations */ ++ struct lru_gen_struct lrugen; ++#endif + #ifdef CONFIG_MEMCG + struct pglist_data *pgdat; + #endif +--- a/include/linux/page-flags-layout.h ++++ b/include/linux/page-flags-layout.h +@@ -55,7 +55,8 @@ + #define SECTIONS_WIDTH 0 + #endif + +-#if ZONES_WIDTH + SECTIONS_WIDTH + NODES_SHIFT <= BITS_PER_LONG - NR_PAGEFLAGS ++#if ZONES_WIDTH + LRU_GEN_WIDTH + SECTIONS_WIDTH + NODES_SHIFT \ ++ <= BITS_PER_LONG - NR_PAGEFLAGS + #define NODES_WIDTH NODES_SHIFT + #elif defined(CONFIG_SPARSEMEM_VMEMMAP) + #error "Vmemmap: No space for nodes field in page flags" +@@ -89,8 +90,8 @@ + #define LAST_CPUPID_SHIFT 0 + #endif + +-#if ZONES_WIDTH + SECTIONS_WIDTH + NODES_WIDTH + KASAN_TAG_WIDTH + LAST_CPUPID_SHIFT \ +- <= BITS_PER_LONG - NR_PAGEFLAGS ++#if ZONES_WIDTH + LRU_GEN_WIDTH + SECTIONS_WIDTH + NODES_WIDTH + \ ++ KASAN_TAG_WIDTH + LAST_CPUPID_SHIFT <= BITS_PER_LONG - NR_PAGEFLAGS + #define LAST_CPUPID_WIDTH LAST_CPUPID_SHIFT + #else + #define LAST_CPUPID_WIDTH 0 +@@ -100,10 +101,12 @@ + #define LAST_CPUPID_NOT_IN_PAGE_FLAGS + #endif + +-#if ZONES_WIDTH + SECTIONS_WIDTH + NODES_WIDTH + KASAN_TAG_WIDTH + LAST_CPUPID_WIDTH \ +- > BITS_PER_LONG - NR_PAGEFLAGS ++#if ZONES_WIDTH + LRU_GEN_WIDTH + SECTIONS_WIDTH + NODES_WIDTH + \ ++ KASAN_TAG_WIDTH + LAST_CPUPID_WIDTH > BITS_PER_LONG - NR_PAGEFLAGS + #error "Not enough bits in page flags" + #endif + ++#define LRU_REFS_WIDTH 0 ++ + #endif + #endif /* _LINUX_PAGE_FLAGS_LAYOUT */ +--- a/include/linux/page-flags.h ++++ b/include/linux/page-flags.h +@@ -845,7 +845,7 @@ static inline void ClearPageSlabPfmemall + 1UL << PG_private | 1UL << PG_private_2 | \ + 1UL << PG_writeback | 1UL << PG_reserved | \ + 1UL << PG_slab | 1UL << PG_active | \ +- 1UL << PG_unevictable | __PG_MLOCKED) ++ 1UL << PG_unevictable | __PG_MLOCKED | LRU_GEN_MASK) + + /* + * Flags checked when a page is prepped for return by the page allocator. +@@ -856,7 +856,7 @@ static inline void ClearPageSlabPfmemall + * alloc-free cycle to prevent from reusing the page. + */ + #define PAGE_FLAGS_CHECK_AT_PREP \ +- (PAGEFLAGS_MASK & ~__PG_HWPOISON) ++ ((PAGEFLAGS_MASK & ~__PG_HWPOISON) | LRU_GEN_MASK | LRU_REFS_MASK) + + #define PAGE_FLAGS_PRIVATE \ + (1UL << PG_private | 1UL << PG_private_2) +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -911,6 +911,10 @@ struct task_struct { + #ifdef CONFIG_MEMCG + unsigned in_user_fault:1; + #endif ++#ifdef CONFIG_LRU_GEN ++ /* whether the LRU algorithm may apply to this access */ ++ unsigned in_lru_fault:1; ++#endif + #ifdef CONFIG_COMPAT_BRK + unsigned brk_randomized:1; + #endif +--- a/kernel/bounds.c ++++ b/kernel/bounds.c +@@ -22,6 +22,11 @@ int main(void) + DEFINE(NR_CPUS_BITS, ilog2(CONFIG_NR_CPUS)); + #endif + DEFINE(SPINLOCK_SIZE, sizeof(spinlock_t)); ++#ifdef CONFIG_LRU_GEN ++ DEFINE(LRU_GEN_WIDTH, order_base_2(MAX_NR_GENS + 1)); ++#else ++ DEFINE(LRU_GEN_WIDTH, 0); ++#endif + /* End of constants */ + + return 0; +--- a/mm/Kconfig ++++ b/mm/Kconfig +@@ -897,6 +897,14 @@ config IO_MAPPING + config SECRETMEM + def_bool ARCH_HAS_SET_DIRECT_MAP && !EMBEDDED + ++config LRU_GEN ++ bool "Multi-Gen LRU" ++ depends on MMU ++ # make sure page->flags has enough spare bits ++ depends on 64BIT || !SPARSEMEM || SPARSEMEM_VMEMMAP ++ help ++ A high performance LRU implementation to overcommit memory. ++ + source "mm/damon/Kconfig" + + endmenu +--- a/mm/huge_memory.c ++++ b/mm/huge_memory.c +@@ -2366,7 +2366,8 @@ static void __split_huge_page_tail(struc + #ifdef CONFIG_64BIT + (1L << PG_arch_2) | + #endif +- (1L << PG_dirty))); ++ (1L << PG_dirty) | ++ LRU_GEN_MASK | LRU_REFS_MASK)); + + /* ->mapping in first tail page is compound_mapcount */ + VM_BUG_ON_PAGE(tail > 2 && page_tail->mapping != TAIL_MAPPING, +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -5179,6 +5179,7 @@ static void __mem_cgroup_free(struct mem + + static void mem_cgroup_free(struct mem_cgroup *memcg) + { ++ lru_gen_exit_memcg(memcg); + memcg_wb_domain_exit(memcg); + __mem_cgroup_free(memcg); + } +@@ -5242,6 +5243,7 @@ static struct mem_cgroup *mem_cgroup_all + memcg->deferred_split_queue.split_queue_len = 0; + #endif + idr_replace(&mem_cgroup_idr, memcg, memcg->id.id); ++ lru_gen_init_memcg(memcg); + return memcg; + fail: + mem_cgroup_id_remove(memcg); +--- a/mm/memory.c ++++ b/mm/memory.c +@@ -4805,6 +4805,27 @@ static inline void mm_account_fault(stru + perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address); + } + ++#ifdef CONFIG_LRU_GEN ++static void lru_gen_enter_fault(struct vm_area_struct *vma) ++{ ++ /* the LRU algorithm doesn't apply to sequential or random reads */ ++ current->in_lru_fault = !(vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ)); ++} ++ ++static void lru_gen_exit_fault(void) ++{ ++ current->in_lru_fault = false; ++} ++#else ++static void lru_gen_enter_fault(struct vm_area_struct *vma) ++{ ++} ++ ++static void lru_gen_exit_fault(void) ++{ ++} ++#endif /* CONFIG_LRU_GEN */ ++ + /* + * By the time we get here, we already hold the mm semaphore + * +@@ -4836,11 +4857,15 @@ vm_fault_t handle_mm_fault(struct vm_are + if (flags & FAULT_FLAG_USER) + mem_cgroup_enter_user_fault(); + ++ lru_gen_enter_fault(vma); ++ + if (unlikely(is_vm_hugetlb_page(vma))) + ret = hugetlb_fault(vma->vm_mm, vma, address, flags); + else + ret = __handle_mm_fault(vma, address, flags); + ++ lru_gen_exit_fault(); ++ + if (flags & FAULT_FLAG_USER) { + mem_cgroup_exit_user_fault(); + /* +--- a/mm/mm_init.c ++++ b/mm/mm_init.c +@@ -65,14 +65,16 @@ void __init mminit_verify_pageflags_layo + + shift = 8 * sizeof(unsigned long); + width = shift - SECTIONS_WIDTH - NODES_WIDTH - ZONES_WIDTH +- - LAST_CPUPID_SHIFT - KASAN_TAG_WIDTH; ++ - LAST_CPUPID_SHIFT - KASAN_TAG_WIDTH - LRU_GEN_WIDTH - LRU_REFS_WIDTH; + mminit_dprintk(MMINIT_TRACE, "pageflags_layout_widths", +- "Section %d Node %d Zone %d Lastcpupid %d Kasantag %d Flags %d\n", ++ "Section %d Node %d Zone %d Lastcpupid %d Kasantag %d Gen %d Tier %d Flags %d\n", + SECTIONS_WIDTH, + NODES_WIDTH, + ZONES_WIDTH, + LAST_CPUPID_WIDTH, + KASAN_TAG_WIDTH, ++ LRU_GEN_WIDTH, ++ LRU_REFS_WIDTH, + NR_PAGEFLAGS); + mminit_dprintk(MMINIT_TRACE, "pageflags_layout_shifts", + "Section %d Node %d Zone %d Lastcpupid %d Kasantag %d\n", +--- a/mm/mmzone.c ++++ b/mm/mmzone.c +@@ -81,6 +81,8 @@ void lruvec_init(struct lruvec *lruvec) + + for_each_lru(lru) + INIT_LIST_HEAD(&lruvec->lists[lru]); ++ ++ lru_gen_init_lruvec(lruvec); + } + + #if defined(CONFIG_NUMA_BALANCING) && !defined(LAST_CPUPID_NOT_IN_PAGE_FLAGS) +--- a/mm/swap.c ++++ b/mm/swap.c +@@ -446,6 +446,11 @@ void lru_cache_add(struct page *page) + VM_BUG_ON_PAGE(PageActive(page) && PageUnevictable(page), page); + VM_BUG_ON_PAGE(PageLRU(page), page); + ++ /* see the comment in lru_gen_add_page() */ ++ if (lru_gen_enabled() && !PageUnevictable(page) && ++ lru_gen_in_fault() && !(current->flags & PF_MEMALLOC)) ++ SetPageActive(page); ++ + get_page(page); + local_lock(&lru_pvecs.lock); + pvec = this_cpu_ptr(&lru_pvecs.lru_add); +@@ -547,7 +552,7 @@ static void lru_deactivate_file_fn(struc + + static void lru_deactivate_fn(struct page *page, struct lruvec *lruvec) + { +- if (PageActive(page) && !PageUnevictable(page)) { ++ if (!PageUnevictable(page) && (PageActive(page) || lru_gen_enabled())) { + int nr_pages = thp_nr_pages(page); + + del_page_from_lru_list(page, lruvec); +@@ -661,7 +666,8 @@ void deactivate_file_page(struct page *p + */ + void deactivate_page(struct page *page) + { +- if (PageLRU(page) && PageActive(page) && !PageUnevictable(page)) { ++ if (PageLRU(page) && !PageUnevictable(page) && ++ (PageActive(page) || lru_gen_enabled())) { + struct pagevec *pvec; + + local_lock(&lru_pvecs.lock); +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -2821,6 +2821,81 @@ static bool can_age_anon_pages(struct pg + return can_demote(pgdat->node_id, sc); + } + ++#ifdef CONFIG_LRU_GEN ++ ++/****************************************************************************** ++ * shorthand helpers ++ ******************************************************************************/ ++ ++#define for_each_gen_type_zone(gen, type, zone) \ ++ for ((gen) = 0; (gen) < MAX_NR_GENS; (gen)++) \ ++ for ((type) = 0; (type) < ANON_AND_FILE; (type)++) \ ++ for ((zone) = 0; (zone) < MAX_NR_ZONES; (zone)++) ++ ++static struct lruvec __maybe_unused *get_lruvec(struct mem_cgroup *memcg, int nid) ++{ ++ struct pglist_data *pgdat = NODE_DATA(nid); ++ ++#ifdef CONFIG_MEMCG ++ if (memcg) { ++ struct lruvec *lruvec = &memcg->nodeinfo[nid]->lruvec; ++ ++ /* for hotadd_new_pgdat() */ ++ if (!lruvec->pgdat) ++ lruvec->pgdat = pgdat; ++ ++ return lruvec; ++ } ++#endif ++ VM_WARN_ON_ONCE(!mem_cgroup_disabled()); ++ ++ return pgdat ? &pgdat->__lruvec : NULL; ++} ++ ++/****************************************************************************** ++ * initialization ++ ******************************************************************************/ ++ ++void lru_gen_init_lruvec(struct lruvec *lruvec) ++{ ++ int gen, type, zone; ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ ++ lrugen->max_seq = MIN_NR_GENS + 1; ++ ++ for_each_gen_type_zone(gen, type, zone) ++ INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]); ++} ++ ++#ifdef CONFIG_MEMCG ++void lru_gen_init_memcg(struct mem_cgroup *memcg) ++{ ++} ++ ++void lru_gen_exit_memcg(struct mem_cgroup *memcg) ++{ ++ int nid; ++ ++ for_each_node(nid) { ++ struct lruvec *lruvec = get_lruvec(memcg, nid); ++ ++ VM_WARN_ON_ONCE(memchr_inv(lruvec->lrugen.nr_pages, 0, ++ sizeof(lruvec->lrugen.nr_pages))); ++ } ++} ++#endif ++ ++static int __init init_lru_gen(void) ++{ ++ BUILD_BUG_ON(MIN_NR_GENS + 1 >= MAX_NR_GENS); ++ BUILD_BUG_ON(BIT(LRU_GEN_WIDTH) <= MAX_NR_GENS); ++ ++ return 0; ++}; ++late_initcall(init_lru_gen); ++ ++#endif /* CONFIG_LRU_GEN */ ++ + static void shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) + { + unsigned long nr[NR_LRU_LISTS]; diff --git a/target/linux/generic/backport-5.15/020-v6.1-06-mm-multi-gen-LRU-minimal-implementation.patch b/target/linux/generic/backport-5.15/020-v6.1-06-mm-multi-gen-LRU-minimal-implementation.patch new file mode 100644 index 0000000000..f8a7d9bd7f --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-06-mm-multi-gen-LRU-minimal-implementation.patch @@ -0,0 +1,1447 @@ +From b564b9471cd60ef1ee3961a224898ce4a9620d84 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 02:00:03 -0600 +Subject: [PATCH 06/29] mm: multi-gen LRU: minimal implementation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +To avoid confusion, the terms "promotion" and "demotion" will be applied +to the multi-gen LRU, as a new convention; the terms "activation" and +"deactivation" will be applied to the active/inactive LRU, as usual. + +The aging produces young generations. Given an lruvec, it increments +max_seq when max_seq-min_seq+1 approaches MIN_NR_GENS. The aging promotes +hot pages to the youngest generation when it finds them accessed through +page tables; the demotion of cold pages happens consequently when it +increments max_seq. Promotion in the aging path does not involve any LRU +list operations, only the updates of the gen counter and +lrugen->nr_pages[]; demotion, unless as the result of the increment of +max_seq, requires LRU list operations, e.g., lru_deactivate_fn(). The +aging has the complexity O(nr_hot_pages), since it is only interested in +hot pages. + +The eviction consumes old generations. Given an lruvec, it increments +min_seq when lrugen->lists[] indexed by min_seq%MAX_NR_GENS becomes empty. +A feedback loop modeled after the PID controller monitors refaults over +anon and file types and decides which type to evict when both types are +available from the same generation. + +The protection of pages accessed multiple times through file descriptors +takes place in the eviction path. Each generation is divided into +multiple tiers. A page accessed N times through file descriptors is in +tier order_base_2(N). Tiers do not have dedicated lrugen->lists[], only +bits in page->flags. The aforementioned feedback loop also monitors +refaults over all tiers and decides when to protect pages in which tiers +(N>1), using the first tier (N=0,1) as a baseline. The first tier +contains single-use unmapped clean pages, which are most likely the best +choices. In contrast to promotion in the aging path, the protection of a +page in the eviction path is achieved by moving this page to the next +generation, i.e., min_seq+1, if the feedback loop decides so. This +approach has the following advantages: + +1. It removes the cost of activation in the buffered access path by + inferring whether pages accessed multiple times through file + descriptors are statistically hot and thus worth protecting in the + eviction path. +2. It takes pages accessed through page tables into account and avoids + overprotecting pages accessed multiple times through file + descriptors. (Pages accessed through page tables are in the first + tier, since N=0.) +3. More tiers provide better protection for pages accessed more than + twice through file descriptors, when under heavy buffered I/O + workloads. + +Server benchmark results: + Single workload: + fio (buffered I/O): +[30, 32]% + IOPS BW + 5.19-rc1: 2673k 10.2GiB/s + patch1-6: 3491k 13.3GiB/s + + Single workload: + memcached (anon): -[4, 6]% + Ops/sec KB/sec + 5.19-rc1: 1161501.04 45177.25 + patch1-6: 1106168.46 43025.04 + + Configurations: + CPU: two Xeon 6154 + Mem: total 256G + + Node 1 was only used as a ram disk to reduce the variance in the + results. + + patch drivers/block/brd.c < gfp_flags = GFP_NOIO | __GFP_ZERO | __GFP_HIGHMEM | __GFP_THISNODE; + > page = alloc_pages_node(1, gfp_flags, 0); + EOF + + cat >>/etc/systemd/system.conf <>/etc/memcached.conf </sys/fs/cgroup/user.slice/test/memory.max + echo $$ >/sys/fs/cgroup/user.slice/test/cgroup.procs + fio -name=mglru --numjobs=72 --directory=/mnt --size=1408m \ + --buffered=1 --ioengine=io_uring --iodepth=128 \ + --iodepth_batch_submit=32 --iodepth_batch_complete=32 \ + --rw=randread --random_distribution=random --norandommap \ + --time_based --ramp_time=10m --runtime=5m --group_reporting + + cat memcached.sh + modprobe brd rd_nr=1 rd_size=113246208 + swapoff -a + mkswap /dev/ram0 + swapon /dev/ram0 + + memtier_benchmark -S /var/run/memcached/memcached.sock \ + -P memcache_binary -n allkeys --key-minimum=1 \ + --key-maximum=65000000 --key-pattern=P:P -c 1 -t 36 \ + --ratio 1:0 --pipeline 8 -d 2000 + + memtier_benchmark -S /var/run/memcached/memcached.sock \ + -P memcache_binary -n allkeys --key-minimum=1 \ + --key-maximum=65000000 --key-pattern=R:R -c 1 -t 36 \ + --ratio 0:1 --pipeline 8 --randomize --distinct-client-seed + +Client benchmark results: + kswapd profiles: + 5.19-rc1 + 40.33% page_vma_mapped_walk (overhead) + 21.80% lzo1x_1_do_compress (real work) + 7.53% do_raw_spin_lock + 3.95% _raw_spin_unlock_irq + 2.52% vma_interval_tree_iter_next + 2.37% page_referenced_one + 2.28% vma_interval_tree_subtree_search + 1.97% anon_vma_interval_tree_iter_first + 1.60% ptep_clear_flush + 1.06% __zram_bvec_write + + patch1-6 + 39.03% lzo1x_1_do_compress (real work) + 18.47% page_vma_mapped_walk (overhead) + 6.74% _raw_spin_unlock_irq + 3.97% do_raw_spin_lock + 2.49% ptep_clear_flush + 2.48% anon_vma_interval_tree_iter_first + 1.92% page_referenced_one + 1.88% __zram_bvec_write + 1.48% memmove + 1.31% vma_interval_tree_iter_next + + Configurations: + CPU: single Snapdragon 7c + Mem: total 4G + + ChromeOS MemoryPressure [1] + +[1] https://chromium.googlesource.com/chromiumos/platform/tast-tests/ + +Link: https://lkml.kernel.org/r/20220918080010.2920238-7-yuzhao@google.com +Signed-off-by: Yu Zhao +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Barry Song +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Miaohe Lin +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Qi Zheng +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Will Deacon +Signed-off-by: Andrew Morton +--- + include/linux/mm_inline.h | 36 ++ + include/linux/mmzone.h | 41 ++ + include/linux/page-flags-layout.h | 5 +- + kernel/bounds.c | 2 + + mm/Kconfig | 11 + + mm/swap.c | 39 ++ + mm/vmscan.c | 792 +++++++++++++++++++++++++++++- + mm/workingset.c | 110 ++++- + 8 files changed, 1025 insertions(+), 11 deletions(-) + +--- a/include/linux/mm_inline.h ++++ b/include/linux/mm_inline.h +@@ -106,6 +106,33 @@ static inline int lru_gen_from_seq(unsig + return seq % MAX_NR_GENS; + } + ++static inline int lru_hist_from_seq(unsigned long seq) ++{ ++ return seq % NR_HIST_GENS; ++} ++ ++static inline int lru_tier_from_refs(int refs) ++{ ++ VM_WARN_ON_ONCE(refs > BIT(LRU_REFS_WIDTH)); ++ ++ /* see the comment in page_lru_refs() */ ++ return order_base_2(refs + 1); ++} ++ ++static inline int page_lru_refs(struct page *page) ++{ ++ unsigned long flags = READ_ONCE(page->flags); ++ bool workingset = flags & BIT(PG_workingset); ++ ++ /* ++ * Return the number of accesses beyond PG_referenced, i.e., N-1 if the ++ * total number of accesses is N>1, since N=0,1 both map to the first ++ * tier. lru_tier_from_refs() will account for this off-by-one. Also see ++ * the comment on MAX_NR_TIERS. ++ */ ++ return ((flags & LRU_REFS_MASK) >> LRU_REFS_PGOFF) + workingset; ++} ++ + static inline int page_lru_gen(struct page *page) + { + unsigned long flags = READ_ONCE(page->flags); +@@ -158,6 +185,15 @@ static inline void lru_gen_update_size(s + __update_lru_size(lruvec, lru, zone, -delta); + return; + } ++ ++ /* promotion */ ++ if (!lru_gen_is_active(lruvec, old_gen) && lru_gen_is_active(lruvec, new_gen)) { ++ __update_lru_size(lruvec, lru, zone, -delta); ++ __update_lru_size(lruvec, lru + LRU_ACTIVE, zone, delta); ++ } ++ ++ /* demotion requires isolation, e.g., lru_deactivate_fn() */ ++ VM_WARN_ON_ONCE(lru_gen_is_active(lruvec, old_gen) && !lru_gen_is_active(lruvec, new_gen)); + } + + static inline bool lru_gen_add_page(struct lruvec *lruvec, struct page *page, bool reclaiming) +--- a/include/linux/mmzone.h ++++ b/include/linux/mmzone.h +@@ -327,6 +327,28 @@ enum lruvec_flags { + #define MIN_NR_GENS 2U + #define MAX_NR_GENS 4U + ++/* ++ * Each generation is divided into multiple tiers. A page accessed N times ++ * through file descriptors is in tier order_base_2(N). A page in the first tier ++ * (N=0,1) is marked by PG_referenced unless it was faulted in through page ++ * tables or read ahead. A page in any other tier (N>1) is marked by ++ * PG_referenced and PG_workingset. This implies a minimum of two tiers is ++ * supported without using additional bits in page->flags. ++ * ++ * In contrast to moving across generations which requires the LRU lock, moving ++ * across tiers only involves atomic operations on page->flags and therefore ++ * has a negligible cost in the buffered access path. In the eviction path, ++ * comparisons of refaulted/(evicted+protected) from the first tier and the ++ * rest infer whether pages accessed multiple times through file descriptors ++ * are statistically hot and thus worth protecting. ++ * ++ * MAX_NR_TIERS is set to 4 so that the multi-gen LRU can support twice the ++ * number of categories of the active/inactive LRU when keeping track of ++ * accesses through file descriptors. This uses MAX_NR_TIERS-2 spare bits in ++ * page->flags. ++ */ ++#define MAX_NR_TIERS 4U ++ + #ifndef __GENERATING_BOUNDS_H + + struct lruvec; +@@ -341,6 +363,16 @@ enum { + LRU_GEN_FILE, + }; + ++#define MIN_LRU_BATCH BITS_PER_LONG ++#define MAX_LRU_BATCH (MIN_LRU_BATCH * 64) ++ ++/* whether to keep historical stats from evicted generations */ ++#ifdef CONFIG_LRU_GEN_STATS ++#define NR_HIST_GENS MAX_NR_GENS ++#else ++#define NR_HIST_GENS 1U ++#endif ++ + /* + * The youngest generation number is stored in max_seq for both anon and file + * types as they are aged on an equal footing. The oldest generation numbers are +@@ -363,6 +395,15 @@ struct lru_gen_struct { + struct list_head lists[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; + /* the multi-gen LRU sizes, eventually consistent */ + long nr_pages[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; ++ /* the exponential moving average of refaulted */ ++ unsigned long avg_refaulted[ANON_AND_FILE][MAX_NR_TIERS]; ++ /* the exponential moving average of evicted+protected */ ++ unsigned long avg_total[ANON_AND_FILE][MAX_NR_TIERS]; ++ /* the first tier doesn't need protection, hence the minus one */ ++ unsigned long protected[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS - 1]; ++ /* can be modified without holding the LRU lock */ ++ atomic_long_t evicted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS]; ++ atomic_long_t refaulted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS]; + }; + + void lru_gen_init_lruvec(struct lruvec *lruvec); +--- a/include/linux/page-flags-layout.h ++++ b/include/linux/page-flags-layout.h +@@ -106,7 +106,10 @@ + #error "Not enough bits in page flags" + #endif + +-#define LRU_REFS_WIDTH 0 ++/* see the comment on MAX_NR_TIERS */ ++#define LRU_REFS_WIDTH min(__LRU_REFS_WIDTH, BITS_PER_LONG - NR_PAGEFLAGS - \ ++ ZONES_WIDTH - LRU_GEN_WIDTH - SECTIONS_WIDTH - \ ++ NODES_WIDTH - KASAN_TAG_WIDTH - LAST_CPUPID_WIDTH) + + #endif + #endif /* _LINUX_PAGE_FLAGS_LAYOUT */ +--- a/kernel/bounds.c ++++ b/kernel/bounds.c +@@ -24,8 +24,10 @@ int main(void) + DEFINE(SPINLOCK_SIZE, sizeof(spinlock_t)); + #ifdef CONFIG_LRU_GEN + DEFINE(LRU_GEN_WIDTH, order_base_2(MAX_NR_GENS + 1)); ++ DEFINE(__LRU_REFS_WIDTH, MAX_NR_TIERS - 2); + #else + DEFINE(LRU_GEN_WIDTH, 0); ++ DEFINE(__LRU_REFS_WIDTH, 0); + #endif + /* End of constants */ + +--- a/mm/Kconfig ++++ b/mm/Kconfig +@@ -897,6 +897,7 @@ config IO_MAPPING + config SECRETMEM + def_bool ARCH_HAS_SET_DIRECT_MAP && !EMBEDDED + ++# multi-gen LRU { + config LRU_GEN + bool "Multi-Gen LRU" + depends on MMU +@@ -905,6 +906,16 @@ config LRU_GEN + help + A high performance LRU implementation to overcommit memory. + ++config LRU_GEN_STATS ++ bool "Full stats for debugging" ++ depends on LRU_GEN ++ help ++ Do not enable this option unless you plan to look at historical stats ++ from evicted generations for debugging purpose. ++ ++ This option has a per-memcg and per-node memory overhead. ++# } ++ + source "mm/damon/Kconfig" + + endmenu +--- a/mm/swap.c ++++ b/mm/swap.c +@@ -389,6 +389,40 @@ static void __lru_cache_activate_page(st + local_unlock(&lru_pvecs.lock); + } + ++#ifdef CONFIG_LRU_GEN ++static void page_inc_refs(struct page *page) ++{ ++ unsigned long new_flags, old_flags = READ_ONCE(page->flags); ++ ++ if (PageUnevictable(page)) ++ return; ++ ++ if (!PageReferenced(page)) { ++ SetPageReferenced(page); ++ return; ++ } ++ ++ if (!PageWorkingset(page)) { ++ SetPageWorkingset(page); ++ return; ++ } ++ ++ /* see the comment on MAX_NR_TIERS */ ++ do { ++ new_flags = old_flags & LRU_REFS_MASK; ++ if (new_flags == LRU_REFS_MASK) ++ break; ++ ++ new_flags += BIT(LRU_REFS_PGOFF); ++ new_flags |= old_flags & ~LRU_REFS_MASK; ++ } while (!try_cmpxchg(&page->flags, &old_flags, new_flags)); ++} ++#else ++static void page_inc_refs(struct page *page) ++{ ++} ++#endif /* CONFIG_LRU_GEN */ ++ + /* + * Mark a page as having seen activity. + * +@@ -403,6 +437,11 @@ void mark_page_accessed(struct page *pag + { + page = compound_head(page); + ++ if (lru_gen_enabled()) { ++ page_inc_refs(page); ++ return; ++ } ++ + if (!PageReferenced(page)) { + SetPageReferenced(page); + } else if (PageUnevictable(page)) { +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -1142,9 +1142,11 @@ static int __remove_mapping(struct addre + + if (PageSwapCache(page)) { + swp_entry_t swap = { .val = page_private(page) }; +- mem_cgroup_swapout(page, swap); ++ ++ /* get a shadow entry before mem_cgroup_swapout() clears page_memcg() */ + if (reclaimed && !mapping_exiting(mapping)) + shadow = workingset_eviction(page, target_memcg); ++ mem_cgroup_swapout(page, swap); + __delete_from_swap_cache(page, swap, shadow); + xa_unlock_irq(&mapping->i_pages); + put_swap_page(page, swap); +@@ -2502,6 +2504,9 @@ static void prepare_scan_count(pg_data_t + unsigned long file; + struct lruvec *target_lruvec; + ++ if (lru_gen_enabled()) ++ return; ++ + target_lruvec = mem_cgroup_lruvec(sc->target_mem_cgroup, pgdat); + + /* +@@ -2827,6 +2832,17 @@ static bool can_age_anon_pages(struct pg + * shorthand helpers + ******************************************************************************/ + ++#define LRU_REFS_FLAGS (BIT(PG_referenced) | BIT(PG_workingset)) ++ ++#define DEFINE_MAX_SEQ(lruvec) \ ++ unsigned long max_seq = READ_ONCE((lruvec)->lrugen.max_seq) ++ ++#define DEFINE_MIN_SEQ(lruvec) \ ++ unsigned long min_seq[ANON_AND_FILE] = { \ ++ READ_ONCE((lruvec)->lrugen.min_seq[LRU_GEN_ANON]), \ ++ READ_ONCE((lruvec)->lrugen.min_seq[LRU_GEN_FILE]), \ ++ } ++ + #define for_each_gen_type_zone(gen, type, zone) \ + for ((gen) = 0; (gen) < MAX_NR_GENS; (gen)++) \ + for ((type) = 0; (type) < ANON_AND_FILE; (type)++) \ +@@ -2852,6 +2868,745 @@ static struct lruvec __maybe_unused *get + return pgdat ? &pgdat->__lruvec : NULL; + } + ++static int get_swappiness(struct lruvec *lruvec, struct scan_control *sc) ++{ ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ struct pglist_data *pgdat = lruvec_pgdat(lruvec); ++ ++ if (!can_demote(pgdat->node_id, sc) && ++ mem_cgroup_get_nr_swap_pages(memcg) < MIN_LRU_BATCH) ++ return 0; ++ ++ return mem_cgroup_swappiness(memcg); ++} ++ ++static int get_nr_gens(struct lruvec *lruvec, int type) ++{ ++ return lruvec->lrugen.max_seq - lruvec->lrugen.min_seq[type] + 1; ++} ++ ++static bool __maybe_unused seq_is_valid(struct lruvec *lruvec) ++{ ++ /* see the comment on lru_gen_struct */ ++ return get_nr_gens(lruvec, LRU_GEN_FILE) >= MIN_NR_GENS && ++ get_nr_gens(lruvec, LRU_GEN_FILE) <= get_nr_gens(lruvec, LRU_GEN_ANON) && ++ get_nr_gens(lruvec, LRU_GEN_ANON) <= MAX_NR_GENS; ++} ++ ++/****************************************************************************** ++ * refault feedback loop ++ ******************************************************************************/ ++ ++/* ++ * A feedback loop based on Proportional-Integral-Derivative (PID) controller. ++ * ++ * The P term is refaulted/(evicted+protected) from a tier in the generation ++ * currently being evicted; the I term is the exponential moving average of the ++ * P term over the generations previously evicted, using the smoothing factor ++ * 1/2; the D term isn't supported. ++ * ++ * The setpoint (SP) is always the first tier of one type; the process variable ++ * (PV) is either any tier of the other type or any other tier of the same ++ * type. ++ * ++ * The error is the difference between the SP and the PV; the correction is to ++ * turn off protection when SP>PV or turn on protection when SPlrugen; ++ int hist = lru_hist_from_seq(lrugen->min_seq[type]); ++ ++ pos->refaulted = lrugen->avg_refaulted[type][tier] + ++ atomic_long_read(&lrugen->refaulted[hist][type][tier]); ++ pos->total = lrugen->avg_total[type][tier] + ++ atomic_long_read(&lrugen->evicted[hist][type][tier]); ++ if (tier) ++ pos->total += lrugen->protected[hist][type][tier - 1]; ++ pos->gain = gain; ++} ++ ++static void reset_ctrl_pos(struct lruvec *lruvec, int type, bool carryover) ++{ ++ int hist, tier; ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ bool clear = carryover ? NR_HIST_GENS == 1 : NR_HIST_GENS > 1; ++ unsigned long seq = carryover ? lrugen->min_seq[type] : lrugen->max_seq + 1; ++ ++ lockdep_assert_held(&lruvec->lru_lock); ++ ++ if (!carryover && !clear) ++ return; ++ ++ hist = lru_hist_from_seq(seq); ++ ++ for (tier = 0; tier < MAX_NR_TIERS; tier++) { ++ if (carryover) { ++ unsigned long sum; ++ ++ sum = lrugen->avg_refaulted[type][tier] + ++ atomic_long_read(&lrugen->refaulted[hist][type][tier]); ++ WRITE_ONCE(lrugen->avg_refaulted[type][tier], sum / 2); ++ ++ sum = lrugen->avg_total[type][tier] + ++ atomic_long_read(&lrugen->evicted[hist][type][tier]); ++ if (tier) ++ sum += lrugen->protected[hist][type][tier - 1]; ++ WRITE_ONCE(lrugen->avg_total[type][tier], sum / 2); ++ } ++ ++ if (clear) { ++ atomic_long_set(&lrugen->refaulted[hist][type][tier], 0); ++ atomic_long_set(&lrugen->evicted[hist][type][tier], 0); ++ if (tier) ++ WRITE_ONCE(lrugen->protected[hist][type][tier - 1], 0); ++ } ++ } ++} ++ ++static bool positive_ctrl_err(struct ctrl_pos *sp, struct ctrl_pos *pv) ++{ ++ /* ++ * Return true if the PV has a limited number of refaults or a lower ++ * refaulted/total than the SP. ++ */ ++ return pv->refaulted < MIN_LRU_BATCH || ++ pv->refaulted * (sp->total + MIN_LRU_BATCH) * sp->gain <= ++ (sp->refaulted + 1) * pv->total * pv->gain; ++} ++ ++/****************************************************************************** ++ * the aging ++ ******************************************************************************/ ++ ++/* protect pages accessed multiple times through file descriptors */ ++static int page_inc_gen(struct lruvec *lruvec, struct page *page, bool reclaiming) ++{ ++ int type = page_is_file_lru(page); ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ int new_gen, old_gen = lru_gen_from_seq(lrugen->min_seq[type]); ++ unsigned long new_flags, old_flags = READ_ONCE(page->flags); ++ ++ VM_WARN_ON_ONCE_PAGE(!(old_flags & LRU_GEN_MASK), page); ++ ++ do { ++ new_gen = (old_gen + 1) % MAX_NR_GENS; ++ ++ new_flags = old_flags & ~(LRU_GEN_MASK | LRU_REFS_MASK | LRU_REFS_FLAGS); ++ new_flags |= (new_gen + 1UL) << LRU_GEN_PGOFF; ++ /* for end_page_writeback() */ ++ if (reclaiming) ++ new_flags |= BIT(PG_reclaim); ++ } while (!try_cmpxchg(&page->flags, &old_flags, new_flags)); ++ ++ lru_gen_update_size(lruvec, page, old_gen, new_gen); ++ ++ return new_gen; ++} ++ ++static void inc_min_seq(struct lruvec *lruvec, int type) ++{ ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ ++ reset_ctrl_pos(lruvec, type, true); ++ WRITE_ONCE(lrugen->min_seq[type], lrugen->min_seq[type] + 1); ++} ++ ++static bool try_to_inc_min_seq(struct lruvec *lruvec, bool can_swap) ++{ ++ int gen, type, zone; ++ bool success = false; ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ DEFINE_MIN_SEQ(lruvec); ++ ++ VM_WARN_ON_ONCE(!seq_is_valid(lruvec)); ++ ++ /* find the oldest populated generation */ ++ for (type = !can_swap; type < ANON_AND_FILE; type++) { ++ while (min_seq[type] + MIN_NR_GENS <= lrugen->max_seq) { ++ gen = lru_gen_from_seq(min_seq[type]); ++ ++ for (zone = 0; zone < MAX_NR_ZONES; zone++) { ++ if (!list_empty(&lrugen->lists[gen][type][zone])) ++ goto next; ++ } ++ ++ min_seq[type]++; ++ } ++next: ++ ; ++ } ++ ++ /* see the comment on lru_gen_struct */ ++ if (can_swap) { ++ min_seq[LRU_GEN_ANON] = min(min_seq[LRU_GEN_ANON], min_seq[LRU_GEN_FILE]); ++ min_seq[LRU_GEN_FILE] = max(min_seq[LRU_GEN_ANON], lrugen->min_seq[LRU_GEN_FILE]); ++ } ++ ++ for (type = !can_swap; type < ANON_AND_FILE; type++) { ++ if (min_seq[type] == lrugen->min_seq[type]) ++ continue; ++ ++ reset_ctrl_pos(lruvec, type, true); ++ WRITE_ONCE(lrugen->min_seq[type], min_seq[type]); ++ success = true; ++ } ++ ++ return success; ++} ++ ++static void inc_max_seq(struct lruvec *lruvec, unsigned long max_seq, bool can_swap) ++{ ++ int prev, next; ++ int type, zone; ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ ++ spin_lock_irq(&lruvec->lru_lock); ++ ++ VM_WARN_ON_ONCE(!seq_is_valid(lruvec)); ++ ++ if (max_seq != lrugen->max_seq) ++ goto unlock; ++ ++ for (type = ANON_AND_FILE - 1; type >= 0; type--) { ++ if (get_nr_gens(lruvec, type) != MAX_NR_GENS) ++ continue; ++ ++ VM_WARN_ON_ONCE(type == LRU_GEN_FILE || can_swap); ++ ++ inc_min_seq(lruvec, type); ++ } ++ ++ /* ++ * Update the active/inactive LRU sizes for compatibility. Both sides of ++ * the current max_seq need to be covered, since max_seq+1 can overlap ++ * with min_seq[LRU_GEN_ANON] if swapping is constrained. And if they do ++ * overlap, cold/hot inversion happens. ++ */ ++ prev = lru_gen_from_seq(lrugen->max_seq - 1); ++ next = lru_gen_from_seq(lrugen->max_seq + 1); ++ ++ for (type = 0; type < ANON_AND_FILE; type++) { ++ for (zone = 0; zone < MAX_NR_ZONES; zone++) { ++ enum lru_list lru = type * LRU_INACTIVE_FILE; ++ long delta = lrugen->nr_pages[prev][type][zone] - ++ lrugen->nr_pages[next][type][zone]; ++ ++ if (!delta) ++ continue; ++ ++ __update_lru_size(lruvec, lru, zone, delta); ++ __update_lru_size(lruvec, lru + LRU_ACTIVE, zone, -delta); ++ } ++ } ++ ++ for (type = 0; type < ANON_AND_FILE; type++) ++ reset_ctrl_pos(lruvec, type, false); ++ ++ /* make sure preceding modifications appear */ ++ smp_store_release(&lrugen->max_seq, lrugen->max_seq + 1); ++unlock: ++ spin_unlock_irq(&lruvec->lru_lock); ++} ++ ++static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq, unsigned long *min_seq, ++ struct scan_control *sc, bool can_swap, unsigned long *nr_to_scan) ++{ ++ int gen, type, zone; ++ unsigned long old = 0; ++ unsigned long young = 0; ++ unsigned long total = 0; ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ ++ for (type = !can_swap; type < ANON_AND_FILE; type++) { ++ unsigned long seq; ++ ++ for (seq = min_seq[type]; seq <= max_seq; seq++) { ++ unsigned long size = 0; ++ ++ gen = lru_gen_from_seq(seq); ++ ++ for (zone = 0; zone < MAX_NR_ZONES; zone++) ++ size += max(READ_ONCE(lrugen->nr_pages[gen][type][zone]), 0L); ++ ++ total += size; ++ if (seq == max_seq) ++ young += size; ++ else if (seq + MIN_NR_GENS == max_seq) ++ old += size; ++ } ++ } ++ ++ /* try to scrape all its memory if this memcg was deleted */ ++ *nr_to_scan = mem_cgroup_online(memcg) ? (total >> sc->priority) : total; ++ ++ /* ++ * The aging tries to be lazy to reduce the overhead, while the eviction ++ * stalls when the number of generations reaches MIN_NR_GENS. Hence, the ++ * ideal number of generations is MIN_NR_GENS+1. ++ */ ++ if (min_seq[!can_swap] + MIN_NR_GENS > max_seq) ++ return true; ++ if (min_seq[!can_swap] + MIN_NR_GENS < max_seq) ++ return false; ++ ++ /* ++ * It's also ideal to spread pages out evenly, i.e., 1/(MIN_NR_GENS+1) ++ * of the total number of pages for each generation. A reasonable range ++ * for this average portion is [1/MIN_NR_GENS, 1/(MIN_NR_GENS+2)]. The ++ * aging cares about the upper bound of hot pages, while the eviction ++ * cares about the lower bound of cold pages. ++ */ ++ if (young * MIN_NR_GENS > total) ++ return true; ++ if (old * (MIN_NR_GENS + 2) < total) ++ return true; ++ ++ return false; ++} ++ ++static void age_lruvec(struct lruvec *lruvec, struct scan_control *sc) ++{ ++ bool need_aging; ++ unsigned long nr_to_scan; ++ int swappiness = get_swappiness(lruvec, sc); ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ DEFINE_MAX_SEQ(lruvec); ++ DEFINE_MIN_SEQ(lruvec); ++ ++ VM_WARN_ON_ONCE(sc->memcg_low_reclaim); ++ ++ mem_cgroup_calculate_protection(NULL, memcg); ++ ++ if (mem_cgroup_below_min(memcg)) ++ return; ++ ++ need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, swappiness, &nr_to_scan); ++ if (need_aging) ++ inc_max_seq(lruvec, max_seq, swappiness); ++} ++ ++static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc) ++{ ++ struct mem_cgroup *memcg; ++ ++ VM_WARN_ON_ONCE(!current_is_kswapd()); ++ ++ memcg = mem_cgroup_iter(NULL, NULL, NULL); ++ do { ++ struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat); ++ ++ age_lruvec(lruvec, sc); ++ ++ cond_resched(); ++ } while ((memcg = mem_cgroup_iter(NULL, memcg, NULL))); ++} ++ ++/****************************************************************************** ++ * the eviction ++ ******************************************************************************/ ++ ++static bool sort_page(struct lruvec *lruvec, struct page *page, int tier_idx) ++{ ++ bool success; ++ int gen = page_lru_gen(page); ++ int type = page_is_file_lru(page); ++ int zone = page_zonenum(page); ++ int delta = thp_nr_pages(page); ++ int refs = page_lru_refs(page); ++ int tier = lru_tier_from_refs(refs); ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ ++ VM_WARN_ON_ONCE_PAGE(gen >= MAX_NR_GENS, page); ++ ++ /* unevictable */ ++ if (!page_evictable(page)) { ++ success = lru_gen_del_page(lruvec, page, true); ++ VM_WARN_ON_ONCE_PAGE(!success, page); ++ SetPageUnevictable(page); ++ add_page_to_lru_list(page, lruvec); ++ __count_vm_events(UNEVICTABLE_PGCULLED, delta); ++ return true; ++ } ++ ++ /* dirty lazyfree */ ++ if (type == LRU_GEN_FILE && PageAnon(page) && PageDirty(page)) { ++ success = lru_gen_del_page(lruvec, page, true); ++ VM_WARN_ON_ONCE_PAGE(!success, page); ++ SetPageSwapBacked(page); ++ add_page_to_lru_list_tail(page, lruvec); ++ return true; ++ } ++ ++ /* protected */ ++ if (tier > tier_idx) { ++ int hist = lru_hist_from_seq(lrugen->min_seq[type]); ++ ++ gen = page_inc_gen(lruvec, page, false); ++ list_move_tail(&page->lru, &lrugen->lists[gen][type][zone]); ++ ++ WRITE_ONCE(lrugen->protected[hist][type][tier - 1], ++ lrugen->protected[hist][type][tier - 1] + delta); ++ __mod_lruvec_state(lruvec, WORKINGSET_ACTIVATE_BASE + type, delta); ++ return true; ++ } ++ ++ /* waiting for writeback */ ++ if (PageLocked(page) || PageWriteback(page) || ++ (type == LRU_GEN_FILE && PageDirty(page))) { ++ gen = page_inc_gen(lruvec, page, true); ++ list_move(&page->lru, &lrugen->lists[gen][type][zone]); ++ return true; ++ } ++ ++ return false; ++} ++ ++static bool isolate_page(struct lruvec *lruvec, struct page *page, struct scan_control *sc) ++{ ++ bool success; ++ ++ /* unmapping inhibited */ ++ if (!sc->may_unmap && page_mapped(page)) ++ return false; ++ ++ /* swapping inhibited */ ++ if (!(sc->may_writepage && (sc->gfp_mask & __GFP_IO)) && ++ (PageDirty(page) || ++ (PageAnon(page) && !PageSwapCache(page)))) ++ return false; ++ ++ /* raced with release_pages() */ ++ if (!get_page_unless_zero(page)) ++ return false; ++ ++ /* raced with another isolation */ ++ if (!TestClearPageLRU(page)) { ++ put_page(page); ++ return false; ++ } ++ ++ /* see the comment on MAX_NR_TIERS */ ++ if (!PageReferenced(page)) ++ set_mask_bits(&page->flags, LRU_REFS_MASK | LRU_REFS_FLAGS, 0); ++ ++ /* for shrink_page_list() */ ++ ClearPageReclaim(page); ++ ClearPageReferenced(page); ++ ++ success = lru_gen_del_page(lruvec, page, true); ++ VM_WARN_ON_ONCE_PAGE(!success, page); ++ ++ return true; ++} ++ ++static int scan_pages(struct lruvec *lruvec, struct scan_control *sc, ++ int type, int tier, struct list_head *list) ++{ ++ int gen, zone; ++ enum vm_event_item item; ++ int sorted = 0; ++ int scanned = 0; ++ int isolated = 0; ++ int remaining = MAX_LRU_BATCH; ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ ++ VM_WARN_ON_ONCE(!list_empty(list)); ++ ++ if (get_nr_gens(lruvec, type) == MIN_NR_GENS) ++ return 0; ++ ++ gen = lru_gen_from_seq(lrugen->min_seq[type]); ++ ++ for (zone = sc->reclaim_idx; zone >= 0; zone--) { ++ LIST_HEAD(moved); ++ int skipped = 0; ++ struct list_head *head = &lrugen->lists[gen][type][zone]; ++ ++ while (!list_empty(head)) { ++ struct page *page = lru_to_page(head); ++ int delta = thp_nr_pages(page); ++ ++ VM_WARN_ON_ONCE_PAGE(PageUnevictable(page), page); ++ VM_WARN_ON_ONCE_PAGE(PageActive(page), page); ++ VM_WARN_ON_ONCE_PAGE(page_is_file_lru(page) != type, page); ++ VM_WARN_ON_ONCE_PAGE(page_zonenum(page) != zone, page); ++ ++ scanned += delta; ++ ++ if (sort_page(lruvec, page, tier)) ++ sorted += delta; ++ else if (isolate_page(lruvec, page, sc)) { ++ list_add(&page->lru, list); ++ isolated += delta; ++ } else { ++ list_move(&page->lru, &moved); ++ skipped += delta; ++ } ++ ++ if (!--remaining || max(isolated, skipped) >= MIN_LRU_BATCH) ++ break; ++ } ++ ++ if (skipped) { ++ list_splice(&moved, head); ++ __count_zid_vm_events(PGSCAN_SKIP, zone, skipped); ++ } ++ ++ if (!remaining || isolated >= MIN_LRU_BATCH) ++ break; ++ } ++ ++ item = current_is_kswapd() ? PGSCAN_KSWAPD : PGSCAN_DIRECT; ++ if (!cgroup_reclaim(sc)) { ++ __count_vm_events(item, isolated); ++ __count_vm_events(PGREFILL, sorted); ++ } ++ __count_memcg_events(memcg, item, isolated); ++ __count_memcg_events(memcg, PGREFILL, sorted); ++ __count_vm_events(PGSCAN_ANON + type, isolated); ++ ++ /* ++ * There might not be eligible pages due to reclaim_idx, may_unmap and ++ * may_writepage. Check the remaining to prevent livelock if it's not ++ * making progress. ++ */ ++ return isolated || !remaining ? scanned : 0; ++} ++ ++static int get_tier_idx(struct lruvec *lruvec, int type) ++{ ++ int tier; ++ struct ctrl_pos sp, pv; ++ ++ /* ++ * To leave a margin for fluctuations, use a larger gain factor (1:2). ++ * This value is chosen because any other tier would have at least twice ++ * as many refaults as the first tier. ++ */ ++ read_ctrl_pos(lruvec, type, 0, 1, &sp); ++ for (tier = 1; tier < MAX_NR_TIERS; tier++) { ++ read_ctrl_pos(lruvec, type, tier, 2, &pv); ++ if (!positive_ctrl_err(&sp, &pv)) ++ break; ++ } ++ ++ return tier - 1; ++} ++ ++static int get_type_to_scan(struct lruvec *lruvec, int swappiness, int *tier_idx) ++{ ++ int type, tier; ++ struct ctrl_pos sp, pv; ++ int gain[ANON_AND_FILE] = { swappiness, 200 - swappiness }; ++ ++ /* ++ * Compare the first tier of anon with that of file to determine which ++ * type to scan. Also need to compare other tiers of the selected type ++ * with the first tier of the other type to determine the last tier (of ++ * the selected type) to evict. ++ */ ++ read_ctrl_pos(lruvec, LRU_GEN_ANON, 0, gain[LRU_GEN_ANON], &sp); ++ read_ctrl_pos(lruvec, LRU_GEN_FILE, 0, gain[LRU_GEN_FILE], &pv); ++ type = positive_ctrl_err(&sp, &pv); ++ ++ read_ctrl_pos(lruvec, !type, 0, gain[!type], &sp); ++ for (tier = 1; tier < MAX_NR_TIERS; tier++) { ++ read_ctrl_pos(lruvec, type, tier, gain[type], &pv); ++ if (!positive_ctrl_err(&sp, &pv)) ++ break; ++ } ++ ++ *tier_idx = tier - 1; ++ ++ return type; ++} ++ ++static int isolate_pages(struct lruvec *lruvec, struct scan_control *sc, int swappiness, ++ int *type_scanned, struct list_head *list) ++{ ++ int i; ++ int type; ++ int scanned; ++ int tier = -1; ++ DEFINE_MIN_SEQ(lruvec); ++ ++ /* ++ * Try to make the obvious choice first. When anon and file are both ++ * available from the same generation, interpret swappiness 1 as file ++ * first and 200 as anon first. ++ */ ++ if (!swappiness) ++ type = LRU_GEN_FILE; ++ else if (min_seq[LRU_GEN_ANON] < min_seq[LRU_GEN_FILE]) ++ type = LRU_GEN_ANON; ++ else if (swappiness == 1) ++ type = LRU_GEN_FILE; ++ else if (swappiness == 200) ++ type = LRU_GEN_ANON; ++ else ++ type = get_type_to_scan(lruvec, swappiness, &tier); ++ ++ for (i = !swappiness; i < ANON_AND_FILE; i++) { ++ if (tier < 0) ++ tier = get_tier_idx(lruvec, type); ++ ++ scanned = scan_pages(lruvec, sc, type, tier, list); ++ if (scanned) ++ break; ++ ++ type = !type; ++ tier = -1; ++ } ++ ++ *type_scanned = type; ++ ++ return scanned; ++} ++ ++static int evict_pages(struct lruvec *lruvec, struct scan_control *sc, int swappiness) ++{ ++ int type; ++ int scanned; ++ int reclaimed; ++ LIST_HEAD(list); ++ struct page *page; ++ enum vm_event_item item; ++ struct reclaim_stat stat; ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ struct pglist_data *pgdat = lruvec_pgdat(lruvec); ++ ++ spin_lock_irq(&lruvec->lru_lock); ++ ++ scanned = isolate_pages(lruvec, sc, swappiness, &type, &list); ++ ++ scanned += try_to_inc_min_seq(lruvec, swappiness); ++ ++ if (get_nr_gens(lruvec, !swappiness) == MIN_NR_GENS) ++ scanned = 0; ++ ++ spin_unlock_irq(&lruvec->lru_lock); ++ ++ if (list_empty(&list)) ++ return scanned; ++ ++ reclaimed = shrink_page_list(&list, pgdat, sc, &stat, false); ++ ++ list_for_each_entry(page, &list, lru) { ++ /* restore LRU_REFS_FLAGS cleared by isolate_page() */ ++ if (PageWorkingset(page)) ++ SetPageReferenced(page); ++ ++ /* don't add rejected pages to the oldest generation */ ++ if (PageReclaim(page) && ++ (PageDirty(page) || PageWriteback(page))) ++ ClearPageActive(page); ++ else ++ SetPageActive(page); ++ } ++ ++ spin_lock_irq(&lruvec->lru_lock); ++ ++ move_pages_to_lru(lruvec, &list); ++ ++ item = current_is_kswapd() ? PGSTEAL_KSWAPD : PGSTEAL_DIRECT; ++ if (!cgroup_reclaim(sc)) ++ __count_vm_events(item, reclaimed); ++ __count_memcg_events(memcg, item, reclaimed); ++ __count_vm_events(PGSTEAL_ANON + type, reclaimed); ++ ++ spin_unlock_irq(&lruvec->lru_lock); ++ ++ mem_cgroup_uncharge_list(&list); ++ free_unref_page_list(&list); ++ ++ sc->nr_reclaimed += reclaimed; ++ ++ return scanned; ++} ++ ++static unsigned long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc, ++ bool can_swap) ++{ ++ bool need_aging; ++ unsigned long nr_to_scan; ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ DEFINE_MAX_SEQ(lruvec); ++ DEFINE_MIN_SEQ(lruvec); ++ ++ if (mem_cgroup_below_min(memcg) || ++ (mem_cgroup_below_low(memcg) && !sc->memcg_low_reclaim)) ++ return 0; ++ ++ need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, can_swap, &nr_to_scan); ++ if (!need_aging) ++ return nr_to_scan; ++ ++ /* skip the aging path at the default priority */ ++ if (sc->priority == DEF_PRIORITY) ++ goto done; ++ ++ /* leave the work to lru_gen_age_node() */ ++ if (current_is_kswapd()) ++ return 0; ++ ++ inc_max_seq(lruvec, max_seq, can_swap); ++done: ++ return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0; ++} ++ ++static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) ++{ ++ struct blk_plug plug; ++ unsigned long scanned = 0; ++ ++ lru_add_drain(); ++ ++ blk_start_plug(&plug); ++ ++ while (true) { ++ int delta; ++ int swappiness; ++ unsigned long nr_to_scan; ++ ++ if (sc->may_swap) ++ swappiness = get_swappiness(lruvec, sc); ++ else if (!cgroup_reclaim(sc) && get_swappiness(lruvec, sc)) ++ swappiness = 1; ++ else ++ swappiness = 0; ++ ++ nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness); ++ if (!nr_to_scan) ++ break; ++ ++ delta = evict_pages(lruvec, sc, swappiness); ++ if (!delta) ++ break; ++ ++ scanned += delta; ++ if (scanned >= nr_to_scan) ++ break; ++ ++ cond_resched(); ++ } ++ ++ blk_finish_plug(&plug); ++} ++ + /****************************************************************************** + * initialization + ******************************************************************************/ +@@ -2894,6 +3649,16 @@ static int __init init_lru_gen(void) + }; + late_initcall(init_lru_gen); + ++#else /* !CONFIG_LRU_GEN */ ++ ++static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc) ++{ ++} ++ ++static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) ++{ ++} ++ + #endif /* CONFIG_LRU_GEN */ + + static void shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) +@@ -2907,6 +3672,11 @@ static void shrink_lruvec(struct lruvec + bool proportional_reclaim; + struct blk_plug plug; + ++ if (lru_gen_enabled()) { ++ lru_gen_shrink_lruvec(lruvec, sc); ++ return; ++ } ++ + get_scan_count(lruvec, sc, nr); + + /* Record the original scan target for proportional adjustments later */ +@@ -3372,6 +4142,9 @@ static void snapshot_refaults(struct mem + struct lruvec *target_lruvec; + unsigned long refaults; + ++ if (lru_gen_enabled()) ++ return; ++ + target_lruvec = mem_cgroup_lruvec(target_memcg, pgdat); + refaults = lruvec_page_state(target_lruvec, WORKINGSET_ACTIVATE_ANON); + target_lruvec->refaults[0] = refaults; +@@ -3736,12 +4509,16 @@ unsigned long try_to_free_mem_cgroup_pag + } + #endif + +-static void age_active_anon(struct pglist_data *pgdat, +- struct scan_control *sc) ++static void kswapd_age_node(struct pglist_data *pgdat, struct scan_control *sc) + { + struct mem_cgroup *memcg; + struct lruvec *lruvec; + ++ if (lru_gen_enabled()) { ++ lru_gen_age_node(pgdat, sc); ++ return; ++ } ++ + if (!can_age_anon_pages(pgdat, sc)) + return; + +@@ -4058,12 +4835,11 @@ restart: + sc.may_swap = !nr_boost_reclaim; + + /* +- * Do some background aging of the anon list, to give +- * pages a chance to be referenced before reclaiming. All +- * pages are rotated regardless of classzone as this is +- * about consistent aging. ++ * Do some background aging, to give pages a chance to be ++ * referenced before reclaiming. All pages are rotated ++ * regardless of classzone as this is about consistent aging. + */ +- age_active_anon(pgdat, &sc); ++ kswapd_age_node(pgdat, &sc); + + /* + * If we're getting trouble reclaiming, start doing writepage +--- a/mm/workingset.c ++++ b/mm/workingset.c +@@ -187,7 +187,6 @@ static unsigned int bucket_order __read_ + static void *pack_shadow(int memcgid, pg_data_t *pgdat, unsigned long eviction, + bool workingset) + { +- eviction >>= bucket_order; + eviction &= EVICTION_MASK; + eviction = (eviction << MEM_CGROUP_ID_SHIFT) | memcgid; + eviction = (eviction << NODES_SHIFT) | pgdat->node_id; +@@ -212,10 +211,107 @@ static void unpack_shadow(void *shadow, + + *memcgidp = memcgid; + *pgdat = NODE_DATA(nid); +- *evictionp = entry << bucket_order; ++ *evictionp = entry; + *workingsetp = workingset; + } + ++#ifdef CONFIG_LRU_GEN ++ ++static void *lru_gen_eviction(struct page *page) ++{ ++ int hist; ++ unsigned long token; ++ unsigned long min_seq; ++ struct lruvec *lruvec; ++ struct lru_gen_struct *lrugen; ++ int type = page_is_file_lru(page); ++ int delta = thp_nr_pages(page); ++ int refs = page_lru_refs(page); ++ int tier = lru_tier_from_refs(refs); ++ struct mem_cgroup *memcg = page_memcg(page); ++ struct pglist_data *pgdat = page_pgdat(page); ++ ++ BUILD_BUG_ON(LRU_GEN_WIDTH + LRU_REFS_WIDTH > BITS_PER_LONG - EVICTION_SHIFT); ++ ++ lruvec = mem_cgroup_lruvec(memcg, pgdat); ++ lrugen = &lruvec->lrugen; ++ min_seq = READ_ONCE(lrugen->min_seq[type]); ++ token = (min_seq << LRU_REFS_WIDTH) | max(refs - 1, 0); ++ ++ hist = lru_hist_from_seq(min_seq); ++ atomic_long_add(delta, &lrugen->evicted[hist][type][tier]); ++ ++ return pack_shadow(mem_cgroup_id(memcg), pgdat, token, refs); ++} ++ ++static void lru_gen_refault(struct page *page, void *shadow) ++{ ++ int hist, tier, refs; ++ int memcg_id; ++ bool workingset; ++ unsigned long token; ++ unsigned long min_seq; ++ struct lruvec *lruvec; ++ struct lru_gen_struct *lrugen; ++ struct mem_cgroup *memcg; ++ struct pglist_data *pgdat; ++ int type = page_is_file_lru(page); ++ int delta = thp_nr_pages(page); ++ ++ unpack_shadow(shadow, &memcg_id, &pgdat, &token, &workingset); ++ ++ if (pgdat != page_pgdat(page)) ++ return; ++ ++ rcu_read_lock(); ++ ++ memcg = page_memcg_rcu(page); ++ if (memcg_id != mem_cgroup_id(memcg)) ++ goto unlock; ++ ++ lruvec = mem_cgroup_lruvec(memcg, pgdat); ++ lrugen = &lruvec->lrugen; ++ ++ min_seq = READ_ONCE(lrugen->min_seq[type]); ++ if ((token >> LRU_REFS_WIDTH) != (min_seq & (EVICTION_MASK >> LRU_REFS_WIDTH))) ++ goto unlock; ++ ++ hist = lru_hist_from_seq(min_seq); ++ /* see the comment in page_lru_refs() */ ++ refs = (token & (BIT(LRU_REFS_WIDTH) - 1)) + workingset; ++ tier = lru_tier_from_refs(refs); ++ ++ atomic_long_add(delta, &lrugen->refaulted[hist][type][tier]); ++ mod_lruvec_state(lruvec, WORKINGSET_REFAULT_BASE + type, delta); ++ ++ /* ++ * Count the following two cases as stalls: ++ * 1. For pages accessed through page tables, hotter pages pushed out ++ * hot pages which refaulted immediately. ++ * 2. For pages accessed multiple times through file descriptors, ++ * numbers of accesses might have been out of the range. ++ */ ++ if (lru_gen_in_fault() || refs == BIT(LRU_REFS_WIDTH)) { ++ SetPageWorkingset(page); ++ mod_lruvec_state(lruvec, WORKINGSET_RESTORE_BASE + type, delta); ++ } ++unlock: ++ rcu_read_unlock(); ++} ++ ++#else /* !CONFIG_LRU_GEN */ ++ ++static void *lru_gen_eviction(struct page *page) ++{ ++ return NULL; ++} ++ ++static void lru_gen_refault(struct page *page, void *shadow) ++{ ++} ++ ++#endif /* CONFIG_LRU_GEN */ ++ + /** + * workingset_age_nonresident - age non-resident entries as LRU ages + * @lruvec: the lruvec that was aged +@@ -264,10 +360,14 @@ void *workingset_eviction(struct page *p + VM_BUG_ON_PAGE(page_count(page), page); + VM_BUG_ON_PAGE(!PageLocked(page), page); + ++ if (lru_gen_enabled()) ++ return lru_gen_eviction(page); ++ + lruvec = mem_cgroup_lruvec(target_memcg, pgdat); + /* XXX: target_memcg can be NULL, go through lruvec */ + memcgid = mem_cgroup_id(lruvec_memcg(lruvec)); + eviction = atomic_long_read(&lruvec->nonresident_age); ++ eviction >>= bucket_order; + workingset_age_nonresident(lruvec, thp_nr_pages(page)); + return pack_shadow(memcgid, pgdat, eviction, PageWorkingset(page)); + } +@@ -296,7 +396,13 @@ void workingset_refault(struct page *pag + bool workingset; + int memcgid; + ++ if (lru_gen_enabled()) { ++ lru_gen_refault(page, shadow); ++ return; ++ } ++ + unpack_shadow(shadow, &memcgid, &pgdat, &eviction, &workingset); ++ eviction <<= bucket_order; + + rcu_read_lock(); + /* diff --git a/target/linux/generic/backport-5.15/020-v6.1-07-mm-multi-gen-LRU-exploit-locality-in-rmap.patch b/target/linux/generic/backport-5.15/020-v6.1-07-mm-multi-gen-LRU-exploit-locality-in-rmap.patch new file mode 100644 index 0000000000..40e51b4294 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-07-mm-multi-gen-LRU-exploit-locality-in-rmap.patch @@ -0,0 +1,491 @@ +From e4277535f6d6708bb19b88c4bad155832671d69b Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 02:00:04 -0600 +Subject: [PATCH 07/29] mm: multi-gen LRU: exploit locality in rmap +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Searching the rmap for PTEs mapping each page on an LRU list (to test and +clear the accessed bit) can be expensive because pages from different VMAs +(PA space) are not cache friendly to the rmap (VA space). For workloads +mostly using mapped pages, searching the rmap can incur the highest CPU +cost in the reclaim path. + +This patch exploits spatial locality to reduce the trips into the rmap. +When shrink_page_list() walks the rmap and finds a young PTE, a new +function lru_gen_look_around() scans at most BITS_PER_LONG-1 adjacent +PTEs. On finding another young PTE, it clears the accessed bit and +updates the gen counter of the page mapped by this PTE to +(max_seq%MAX_NR_GENS)+1. + +Server benchmark results: + Single workload: + fio (buffered I/O): no change + + Single workload: + memcached (anon): +[3, 5]% + Ops/sec KB/sec + patch1-6: 1106168.46 43025.04 + patch1-7: 1147696.57 44640.29 + + Configurations: + no change + +Client benchmark results: + kswapd profiles: + patch1-6 + 39.03% lzo1x_1_do_compress (real work) + 18.47% page_vma_mapped_walk (overhead) + 6.74% _raw_spin_unlock_irq + 3.97% do_raw_spin_lock + 2.49% ptep_clear_flush + 2.48% anon_vma_interval_tree_iter_first + 1.92% page_referenced_one + 1.88% __zram_bvec_write + 1.48% memmove + 1.31% vma_interval_tree_iter_next + + patch1-7 + 48.16% lzo1x_1_do_compress (real work) + 8.20% page_vma_mapped_walk (overhead) + 7.06% _raw_spin_unlock_irq + 2.92% ptep_clear_flush + 2.53% __zram_bvec_write + 2.11% do_raw_spin_lock + 2.02% memmove + 1.93% lru_gen_look_around + 1.56% free_unref_page_list + 1.40% memset + + Configurations: + no change + +Link: https://lkml.kernel.org/r/20220918080010.2920238-8-yuzhao@google.com +Signed-off-by: Yu Zhao +Acked-by: Barry Song +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Miaohe Lin +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Qi Zheng +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Will Deacon +Signed-off-by: Andrew Morton +--- + include/linux/memcontrol.h | 31 +++++++ + include/linux/mmzone.h | 6 ++ + mm/internal.h | 1 + + mm/memcontrol.c | 1 + + mm/rmap.c | 7 ++ + mm/swap.c | 4 +- + mm/vmscan.c | 184 +++++++++++++++++++++++++++++++++++++ + 7 files changed, 232 insertions(+), 2 deletions(-) + +--- a/include/linux/memcontrol.h ++++ b/include/linux/memcontrol.h +@@ -447,6 +447,7 @@ static inline struct obj_cgroup *__page_ + * - LRU isolation + * - lock_page_memcg() + * - exclusive reference ++ * - mem_cgroup_trylock_pages() + * + * For a kmem page a caller should hold an rcu read lock to protect memcg + * associated with a kmem page from being released. +@@ -502,6 +503,7 @@ static inline struct mem_cgroup *page_me + * - LRU isolation + * - lock_page_memcg() + * - exclusive reference ++ * - mem_cgroup_trylock_pages() + * + * For a kmem page a caller should hold an rcu read lock to protect memcg + * associated with a kmem page from being released. +@@ -958,6 +960,23 @@ void unlock_page_memcg(struct page *page + + void __mod_memcg_state(struct mem_cgroup *memcg, int idx, int val); + ++/* try to stablize page_memcg() for all the pages in a memcg */ ++static inline bool mem_cgroup_trylock_pages(struct mem_cgroup *memcg) ++{ ++ rcu_read_lock(); ++ ++ if (mem_cgroup_disabled() || !atomic_read(&memcg->moving_account)) ++ return true; ++ ++ rcu_read_unlock(); ++ return false; ++} ++ ++static inline void mem_cgroup_unlock_pages(void) ++{ ++ rcu_read_unlock(); ++} ++ + /* idx can be of type enum memcg_stat_item or node_stat_item */ + static inline void mod_memcg_state(struct mem_cgroup *memcg, + int idx, int val) +@@ -1374,6 +1393,18 @@ static inline void unlock_page_memcg(str + { + } + ++static inline bool mem_cgroup_trylock_pages(struct mem_cgroup *memcg) ++{ ++ /* to match page_memcg_rcu() */ ++ rcu_read_lock(); ++ return true; ++} ++ ++static inline void mem_cgroup_unlock_pages(void) ++{ ++ rcu_read_unlock(); ++} ++ + static inline void mem_cgroup_handle_over_high(void) + { + } +--- a/include/linux/mmzone.h ++++ b/include/linux/mmzone.h +@@ -352,6 +352,7 @@ enum lruvec_flags { + #ifndef __GENERATING_BOUNDS_H + + struct lruvec; ++struct page_vma_mapped_walk; + + #define LRU_GEN_MASK ((BIT(LRU_GEN_WIDTH) - 1) << LRU_GEN_PGOFF) + #define LRU_REFS_MASK ((BIT(LRU_REFS_WIDTH) - 1) << LRU_REFS_PGOFF) +@@ -407,6 +408,7 @@ struct lru_gen_struct { + }; + + void lru_gen_init_lruvec(struct lruvec *lruvec); ++void lru_gen_look_around(struct page_vma_mapped_walk *pvmw); + + #ifdef CONFIG_MEMCG + void lru_gen_init_memcg(struct mem_cgroup *memcg); +@@ -419,6 +421,10 @@ static inline void lru_gen_init_lruvec(s + { + } + ++static inline void lru_gen_look_around(struct page_vma_mapped_walk *pvmw) ++{ ++} ++ + #ifdef CONFIG_MEMCG + static inline void lru_gen_init_memcg(struct mem_cgroup *memcg) + { +--- a/mm/internal.h ++++ b/mm/internal.h +@@ -35,6 +35,7 @@ + void page_writeback_init(void); + + vm_fault_t do_swap_page(struct vm_fault *vmf); ++void activate_page(struct page *page); + + void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma, + unsigned long floor, unsigned long ceiling); +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -2798,6 +2798,7 @@ static void commit_charge(struct page *p + * - LRU isolation + * - lock_page_memcg() + * - exclusive reference ++ * - mem_cgroup_trylock_pages() + */ + page->memcg_data = (unsigned long)memcg; + } +--- a/mm/rmap.c ++++ b/mm/rmap.c +@@ -73,6 +73,7 @@ + #include + #include + #include ++#include + + #include + +@@ -793,6 +794,12 @@ static bool page_referenced_one(struct p + } + + if (pvmw.pte) { ++ if (lru_gen_enabled() && pte_young(*pvmw.pte) && ++ !(vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ))) { ++ lru_gen_look_around(&pvmw); ++ referenced++; ++ } ++ + if (ptep_clear_flush_young_notify(vma, address, + pvmw.pte)) { + /* +--- a/mm/swap.c ++++ b/mm/swap.c +@@ -325,7 +325,7 @@ static bool need_activate_page_drain(int + return pagevec_count(&per_cpu(lru_pvecs.activate_page, cpu)) != 0; + } + +-static void activate_page(struct page *page) ++void activate_page(struct page *page) + { + page = compound_head(page); + if (PageLRU(page) && !PageActive(page) && !PageUnevictable(page)) { +@@ -345,7 +345,7 @@ static inline void activate_page_drain(i + { + } + +-static void activate_page(struct page *page) ++void activate_page(struct page *page) + { + struct lruvec *lruvec; + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -1409,6 +1409,11 @@ retry: + if (!sc->may_unmap && page_mapped(page)) + goto keep_locked; + ++ /* page_update_gen() tried to promote this page? */ ++ if (lru_gen_enabled() && !ignore_references && ++ page_mapped(page) && PageReferenced(page)) ++ goto keep_locked; ++ + may_enter_fs = (sc->gfp_mask & __GFP_FS) || + (PageSwapCache(page) && (sc->gfp_mask & __GFP_IO)); + +@@ -2990,6 +2995,29 @@ static bool positive_ctrl_err(struct ctr + * the aging + ******************************************************************************/ + ++/* promote pages accessed through page tables */ ++static int page_update_gen(struct page *page, int gen) ++{ ++ unsigned long new_flags, old_flags = READ_ONCE(page->flags); ++ ++ VM_WARN_ON_ONCE(gen >= MAX_NR_GENS); ++ VM_WARN_ON_ONCE(!rcu_read_lock_held()); ++ ++ do { ++ /* lru_gen_del_page() has isolated this page? */ ++ if (!(old_flags & LRU_GEN_MASK)) { ++ /* for shrink_page_list() */ ++ new_flags = old_flags | BIT(PG_referenced); ++ continue; ++ } ++ ++ new_flags = old_flags & ~(LRU_GEN_MASK | LRU_REFS_MASK | LRU_REFS_FLAGS); ++ new_flags |= (gen + 1UL) << LRU_GEN_PGOFF; ++ } while (!try_cmpxchg(&page->flags, &old_flags, new_flags)); ++ ++ return ((old_flags & LRU_GEN_MASK) >> LRU_GEN_PGOFF) - 1; ++} ++ + /* protect pages accessed multiple times through file descriptors */ + static int page_inc_gen(struct lruvec *lruvec, struct page *page, bool reclaiming) + { +@@ -3001,6 +3029,11 @@ static int page_inc_gen(struct lruvec *l + VM_WARN_ON_ONCE_PAGE(!(old_flags & LRU_GEN_MASK), page); + + do { ++ new_gen = ((old_flags & LRU_GEN_MASK) >> LRU_GEN_PGOFF) - 1; ++ /* page_update_gen() has promoted this page? */ ++ if (new_gen >= 0 && new_gen != old_gen) ++ return new_gen; ++ + new_gen = (old_gen + 1) % MAX_NR_GENS; + + new_flags = old_flags & ~(LRU_GEN_MASK | LRU_REFS_MASK | LRU_REFS_FLAGS); +@@ -3015,6 +3048,43 @@ static int page_inc_gen(struct lruvec *l + return new_gen; + } + ++static unsigned long get_pte_pfn(pte_t pte, struct vm_area_struct *vma, unsigned long addr) ++{ ++ unsigned long pfn = pte_pfn(pte); ++ ++ VM_WARN_ON_ONCE(addr < vma->vm_start || addr >= vma->vm_end); ++ ++ if (!pte_present(pte) || is_zero_pfn(pfn)) ++ return -1; ++ ++ if (WARN_ON_ONCE(pte_devmap(pte) || pte_special(pte))) ++ return -1; ++ ++ if (WARN_ON_ONCE(!pfn_valid(pfn))) ++ return -1; ++ ++ return pfn; ++} ++ ++static struct page *get_pfn_page(unsigned long pfn, struct mem_cgroup *memcg, ++ struct pglist_data *pgdat) ++{ ++ struct page *page; ++ ++ /* try to avoid unnecessary memory loads */ ++ if (pfn < pgdat->node_start_pfn || pfn >= pgdat_end_pfn(pgdat)) ++ return NULL; ++ ++ page = compound_head(pfn_to_page(pfn)); ++ if (page_to_nid(page) != pgdat->node_id) ++ return NULL; ++ ++ if (page_memcg_rcu(page) != memcg) ++ return NULL; ++ ++ return page; ++} ++ + static void inc_min_seq(struct lruvec *lruvec, int type) + { + struct lru_gen_struct *lrugen = &lruvec->lrugen; +@@ -3214,6 +3284,114 @@ static void lru_gen_age_node(struct pgli + } while ((memcg = mem_cgroup_iter(NULL, memcg, NULL))); + } + ++/* ++ * This function exploits spatial locality when shrink_page_list() walks the ++ * rmap. It scans the adjacent PTEs of a young PTE and promotes hot pages. ++ */ ++void lru_gen_look_around(struct page_vma_mapped_walk *pvmw) ++{ ++ int i; ++ pte_t *pte; ++ unsigned long start; ++ unsigned long end; ++ unsigned long addr; ++ unsigned long bitmap[BITS_TO_LONGS(MIN_LRU_BATCH)] = {}; ++ struct page *page = pvmw->page; ++ struct mem_cgroup *memcg = page_memcg(page); ++ struct pglist_data *pgdat = page_pgdat(page); ++ struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat); ++ DEFINE_MAX_SEQ(lruvec); ++ int old_gen, new_gen = lru_gen_from_seq(max_seq); ++ ++ lockdep_assert_held(pvmw->ptl); ++ VM_WARN_ON_ONCE_PAGE(PageLRU(page), page); ++ ++ if (spin_is_contended(pvmw->ptl)) ++ return; ++ ++ start = max(pvmw->address & PMD_MASK, pvmw->vma->vm_start); ++ end = min(pvmw->address | ~PMD_MASK, pvmw->vma->vm_end - 1) + 1; ++ ++ if (end - start > MIN_LRU_BATCH * PAGE_SIZE) { ++ if (pvmw->address - start < MIN_LRU_BATCH * PAGE_SIZE / 2) ++ end = start + MIN_LRU_BATCH * PAGE_SIZE; ++ else if (end - pvmw->address < MIN_LRU_BATCH * PAGE_SIZE / 2) ++ start = end - MIN_LRU_BATCH * PAGE_SIZE; ++ else { ++ start = pvmw->address - MIN_LRU_BATCH * PAGE_SIZE / 2; ++ end = pvmw->address + MIN_LRU_BATCH * PAGE_SIZE / 2; ++ } ++ } ++ ++ pte = pvmw->pte - (pvmw->address - start) / PAGE_SIZE; ++ ++ rcu_read_lock(); ++ arch_enter_lazy_mmu_mode(); ++ ++ for (i = 0, addr = start; addr != end; i++, addr += PAGE_SIZE) { ++ unsigned long pfn; ++ ++ pfn = get_pte_pfn(pte[i], pvmw->vma, addr); ++ if (pfn == -1) ++ continue; ++ ++ if (!pte_young(pte[i])) ++ continue; ++ ++ page = get_pfn_page(pfn, memcg, pgdat); ++ if (!page) ++ continue; ++ ++ if (!ptep_test_and_clear_young(pvmw->vma, addr, pte + i)) ++ VM_WARN_ON_ONCE(true); ++ ++ if (pte_dirty(pte[i]) && !PageDirty(page) && ++ !(PageAnon(page) && PageSwapBacked(page) && ++ !PageSwapCache(page))) ++ set_page_dirty(page); ++ ++ old_gen = page_lru_gen(page); ++ if (old_gen < 0) ++ SetPageReferenced(page); ++ else if (old_gen != new_gen) ++ __set_bit(i, bitmap); ++ } ++ ++ arch_leave_lazy_mmu_mode(); ++ rcu_read_unlock(); ++ ++ if (bitmap_weight(bitmap, MIN_LRU_BATCH) < PAGEVEC_SIZE) { ++ for_each_set_bit(i, bitmap, MIN_LRU_BATCH) { ++ page = pte_page(pte[i]); ++ activate_page(page); ++ } ++ return; ++ } ++ ++ /* page_update_gen() requires stable page_memcg() */ ++ if (!mem_cgroup_trylock_pages(memcg)) ++ return; ++ ++ spin_lock_irq(&lruvec->lru_lock); ++ new_gen = lru_gen_from_seq(lruvec->lrugen.max_seq); ++ ++ for_each_set_bit(i, bitmap, MIN_LRU_BATCH) { ++ page = compound_head(pte_page(pte[i])); ++ if (page_memcg_rcu(page) != memcg) ++ continue; ++ ++ old_gen = page_update_gen(page, new_gen); ++ if (old_gen < 0 || old_gen == new_gen) ++ continue; ++ ++ lru_gen_update_size(lruvec, page, old_gen, new_gen); ++ } ++ ++ spin_unlock_irq(&lruvec->lru_lock); ++ ++ mem_cgroup_unlock_pages(); ++} ++ + /****************************************************************************** + * the eviction + ******************************************************************************/ +@@ -3250,6 +3428,12 @@ static bool sort_page(struct lruvec *lru + return true; + } + ++ /* promoted */ ++ if (gen != lru_gen_from_seq(lrugen->min_seq[type])) { ++ list_move(&page->lru, &lrugen->lists[gen][type][zone]); ++ return true; ++ } ++ + /* protected */ + if (tier > tier_idx) { + int hist = lru_hist_from_seq(lrugen->min_seq[type]); diff --git a/target/linux/generic/backport-5.15/020-v6.1-08-mm-multi-gen-LRU-support-page-table-walks.patch b/target/linux/generic/backport-5.15/020-v6.1-08-mm-multi-gen-LRU-support-page-table-walks.patch new file mode 100644 index 0000000000..234dfd916f --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-08-mm-multi-gen-LRU-support-page-table-walks.patch @@ -0,0 +1,1687 @@ +From 05223c4e80b34e29f2255c04ffebc2c4475e7593 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 02:00:05 -0600 +Subject: [PATCH 08/29] mm: multi-gen LRU: support page table walks +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +To further exploit spatial locality, the aging prefers to walk page tables +to search for young PTEs and promote hot pages. A kill switch will be +added in the next patch to disable this behavior. When disabled, the +aging relies on the rmap only. + +NB: this behavior has nothing similar with the page table scanning in the +2.4 kernel [1], which searches page tables for old PTEs, adds cold pages +to swapcache and unmaps them. + +To avoid confusion, the term "iteration" specifically means the traversal +of an entire mm_struct list; the term "walk" will be applied to page +tables and the rmap, as usual. + +An mm_struct list is maintained for each memcg, and an mm_struct follows +its owner task to the new memcg when this task is migrated. Given an +lruvec, the aging iterates lruvec_memcg()->mm_list and calls +walk_page_range() with each mm_struct on this list to promote hot pages +before it increments max_seq. + +When multiple page table walkers iterate the same list, each of them gets +a unique mm_struct; therefore they can run concurrently. Page table +walkers ignore any misplaced pages, e.g., if an mm_struct was migrated, +pages it left in the previous memcg will not be promoted when its current +memcg is under reclaim. Similarly, page table walkers will not promote +pages from nodes other than the one under reclaim. + +This patch uses the following optimizations when walking page tables: +1. It tracks the usage of mm_struct's between context switches so that + page table walkers can skip processes that have been sleeping since + the last iteration. +2. It uses generational Bloom filters to record populated branches so + that page table walkers can reduce their search space based on the + query results, e.g., to skip page tables containing mostly holes or + misplaced pages. +3. It takes advantage of the accessed bit in non-leaf PMD entries when + CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y. +4. It does not zigzag between a PGD table and the same PMD table + spanning multiple VMAs. IOW, it finishes all the VMAs within the + range of the same PMD table before it returns to a PGD table. This + improves the cache performance for workloads that have large + numbers of tiny VMAs [2], especially when CONFIG_PGTABLE_LEVELS=5. + +Server benchmark results: + Single workload: + fio (buffered I/O): no change + + Single workload: + memcached (anon): +[8, 10]% + Ops/sec KB/sec + patch1-7: 1147696.57 44640.29 + patch1-8: 1245274.91 48435.66 + + Configurations: + no change + +Client benchmark results: + kswapd profiles: + patch1-7 + 48.16% lzo1x_1_do_compress (real work) + 8.20% page_vma_mapped_walk (overhead) + 7.06% _raw_spin_unlock_irq + 2.92% ptep_clear_flush + 2.53% __zram_bvec_write + 2.11% do_raw_spin_lock + 2.02% memmove + 1.93% lru_gen_look_around + 1.56% free_unref_page_list + 1.40% memset + + patch1-8 + 49.44% lzo1x_1_do_compress (real work) + 6.19% page_vma_mapped_walk (overhead) + 5.97% _raw_spin_unlock_irq + 3.13% get_pfn_page + 2.85% ptep_clear_flush + 2.42% __zram_bvec_write + 2.08% do_raw_spin_lock + 1.92% memmove + 1.44% alloc_zspage + 1.36% memset + + Configurations: + no change + +Thanks to the following developers for their efforts [3]. + kernel test robot + +[1] https://lwn.net/Articles/23732/ +[2] https://llvm.org/docs/ScudoHardenedAllocator.html +[3] https://lore.kernel.org/r/202204160827.ekEARWQo-lkp@intel.com/ + +Link: https://lkml.kernel.org/r/20220918080010.2920238-9-yuzhao@google.com +Signed-off-by: Yu Zhao +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Barry Song +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Miaohe Lin +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Qi Zheng +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Will Deacon +Signed-off-by: Andrew Morton +--- + fs/exec.c | 2 + + include/linux/memcontrol.h | 5 + + include/linux/mm_types.h | 76 +++ + include/linux/mmzone.h | 56 +- + include/linux/swap.h | 4 + + kernel/exit.c | 1 + + kernel/fork.c | 9 + + kernel/sched/core.c | 1 + + mm/memcontrol.c | 25 + + mm/vmscan.c | 1010 +++++++++++++++++++++++++++++++++++- + 10 files changed, 1172 insertions(+), 17 deletions(-) + +--- a/fs/exec.c ++++ b/fs/exec.c +@@ -1013,6 +1013,7 @@ static int exec_mmap(struct mm_struct *m + active_mm = tsk->active_mm; + tsk->active_mm = mm; + tsk->mm = mm; ++ lru_gen_add_mm(mm); + /* + * This prevents preemption while active_mm is being loaded and + * it and mm are being updated, which could cause problems for +@@ -1028,6 +1029,7 @@ static int exec_mmap(struct mm_struct *m + tsk->mm->vmacache_seqnum = 0; + vmacache_flush(tsk); + task_unlock(tsk); ++ lru_gen_use_mm(mm); + if (old_mm) { + mmap_read_unlock(old_mm); + BUG_ON(active_mm != old_mm); +--- a/include/linux/memcontrol.h ++++ b/include/linux/memcontrol.h +@@ -353,6 +353,11 @@ struct mem_cgroup { + struct deferred_split deferred_split_queue; + #endif + ++#ifdef CONFIG_LRU_GEN ++ /* per-memcg mm_struct list */ ++ struct lru_gen_mm_list mm_list; ++#endif ++ + struct mem_cgroup_per_node *nodeinfo[]; + }; + +--- a/include/linux/mm_types.h ++++ b/include/linux/mm_types.h +@@ -580,6 +580,22 @@ struct mm_struct { + #ifdef CONFIG_IOMMU_SUPPORT + u32 pasid; + #endif ++#ifdef CONFIG_LRU_GEN ++ struct { ++ /* this mm_struct is on lru_gen_mm_list */ ++ struct list_head list; ++ /* ++ * Set when switching to this mm_struct, as a hint of ++ * whether it has been used since the last time per-node ++ * page table walkers cleared the corresponding bits. ++ */ ++ unsigned long bitmap; ++#ifdef CONFIG_MEMCG ++ /* points to the memcg of "owner" above */ ++ struct mem_cgroup *memcg; ++#endif ++ } lru_gen; ++#endif /* CONFIG_LRU_GEN */ + } __randomize_layout; + + /* +@@ -606,6 +622,66 @@ static inline cpumask_t *mm_cpumask(stru + return (struct cpumask *)&mm->cpu_bitmap; + } + ++#ifdef CONFIG_LRU_GEN ++ ++struct lru_gen_mm_list { ++ /* mm_struct list for page table walkers */ ++ struct list_head fifo; ++ /* protects the list above */ ++ spinlock_t lock; ++}; ++ ++void lru_gen_add_mm(struct mm_struct *mm); ++void lru_gen_del_mm(struct mm_struct *mm); ++#ifdef CONFIG_MEMCG ++void lru_gen_migrate_mm(struct mm_struct *mm); ++#endif ++ ++static inline void lru_gen_init_mm(struct mm_struct *mm) ++{ ++ INIT_LIST_HEAD(&mm->lru_gen.list); ++ mm->lru_gen.bitmap = 0; ++#ifdef CONFIG_MEMCG ++ mm->lru_gen.memcg = NULL; ++#endif ++} ++ ++static inline void lru_gen_use_mm(struct mm_struct *mm) ++{ ++ /* ++ * When the bitmap is set, page reclaim knows this mm_struct has been ++ * used since the last time it cleared the bitmap. So it might be worth ++ * walking the page tables of this mm_struct to clear the accessed bit. ++ */ ++ WRITE_ONCE(mm->lru_gen.bitmap, -1); ++} ++ ++#else /* !CONFIG_LRU_GEN */ ++ ++static inline void lru_gen_add_mm(struct mm_struct *mm) ++{ ++} ++ ++static inline void lru_gen_del_mm(struct mm_struct *mm) ++{ ++} ++ ++#ifdef CONFIG_MEMCG ++static inline void lru_gen_migrate_mm(struct mm_struct *mm) ++{ ++} ++#endif ++ ++static inline void lru_gen_init_mm(struct mm_struct *mm) ++{ ++} ++ ++static inline void lru_gen_use_mm(struct mm_struct *mm) ++{ ++} ++ ++#endif /* CONFIG_LRU_GEN */ ++ + struct mmu_gather; + extern void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm); + extern void tlb_gather_mmu_fullmm(struct mmu_gather *tlb, struct mm_struct *mm); +--- a/include/linux/mmzone.h ++++ b/include/linux/mmzone.h +@@ -385,7 +385,7 @@ enum { + * min_seq behind. + * + * The number of pages in each generation is eventually consistent and therefore +- * can be transiently negative. ++ * can be transiently negative when reset_batch_size() is pending. + */ + struct lru_gen_struct { + /* the aging increments the youngest generation number */ +@@ -407,6 +407,53 @@ struct lru_gen_struct { + atomic_long_t refaulted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS]; + }; + ++enum { ++ MM_LEAF_TOTAL, /* total leaf entries */ ++ MM_LEAF_OLD, /* old leaf entries */ ++ MM_LEAF_YOUNG, /* young leaf entries */ ++ MM_NONLEAF_TOTAL, /* total non-leaf entries */ ++ MM_NONLEAF_FOUND, /* non-leaf entries found in Bloom filters */ ++ MM_NONLEAF_ADDED, /* non-leaf entries added to Bloom filters */ ++ NR_MM_STATS ++}; ++ ++/* double-buffering Bloom filters */ ++#define NR_BLOOM_FILTERS 2 ++ ++struct lru_gen_mm_state { ++ /* set to max_seq after each iteration */ ++ unsigned long seq; ++ /* where the current iteration continues (inclusive) */ ++ struct list_head *head; ++ /* where the last iteration ended (exclusive) */ ++ struct list_head *tail; ++ /* to wait for the last page table walker to finish */ ++ struct wait_queue_head wait; ++ /* Bloom filters flip after each iteration */ ++ unsigned long *filters[NR_BLOOM_FILTERS]; ++ /* the mm stats for debugging */ ++ unsigned long stats[NR_HIST_GENS][NR_MM_STATS]; ++ /* the number of concurrent page table walkers */ ++ int nr_walkers; ++}; ++ ++struct lru_gen_mm_walk { ++ /* the lruvec under reclaim */ ++ struct lruvec *lruvec; ++ /* unstable max_seq from lru_gen_struct */ ++ unsigned long max_seq; ++ /* the next address within an mm to scan */ ++ unsigned long next_addr; ++ /* to batch promoted pages */ ++ int nr_pages[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; ++ /* to batch the mm stats */ ++ int mm_stats[NR_MM_STATS]; ++ /* total batched items */ ++ int batched; ++ bool can_swap; ++ bool force_scan; ++}; ++ + void lru_gen_init_lruvec(struct lruvec *lruvec); + void lru_gen_look_around(struct page_vma_mapped_walk *pvmw); + +@@ -457,6 +504,8 @@ struct lruvec { + #ifdef CONFIG_LRU_GEN + /* evictable pages divided into generations */ + struct lru_gen_struct lrugen; ++ /* to concurrently iterate lru_gen_mm_list */ ++ struct lru_gen_mm_state mm_state; + #endif + #ifdef CONFIG_MEMCG + struct pglist_data *pgdat; +@@ -1042,6 +1091,11 @@ typedef struct pglist_data { + + unsigned long flags; + ++#ifdef CONFIG_LRU_GEN ++ /* kswap mm walk data */ ++ struct lru_gen_mm_walk mm_walk; ++#endif ++ + ZONE_PADDING(_pad2_) + + /* Per-node vmstats */ +--- a/include/linux/swap.h ++++ b/include/linux/swap.h +@@ -137,6 +137,10 @@ union swap_header { + */ + struct reclaim_state { + unsigned long reclaimed_slab; ++#ifdef CONFIG_LRU_GEN ++ /* per-thread mm walk data */ ++ struct lru_gen_mm_walk *mm_walk; ++#endif + }; + + #ifdef __KERNEL__ +--- a/kernel/exit.c ++++ b/kernel/exit.c +@@ -469,6 +469,7 @@ assign_new_owner: + goto retry; + } + WRITE_ONCE(mm->owner, c); ++ lru_gen_migrate_mm(mm); + task_unlock(c); + put_task_struct(c); + } +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -1091,6 +1091,7 @@ static struct mm_struct *mm_init(struct + goto fail_nocontext; + + mm->user_ns = get_user_ns(user_ns); ++ lru_gen_init_mm(mm); + return mm; + + fail_nocontext: +@@ -1133,6 +1134,7 @@ static inline void __mmput(struct mm_str + } + if (mm->binfmt) + module_put(mm->binfmt->module); ++ lru_gen_del_mm(mm); + mmdrop(mm); + } + +@@ -2625,6 +2627,13 @@ pid_t kernel_clone(struct kernel_clone_a + get_task_struct(p); + } + ++ if (IS_ENABLED(CONFIG_LRU_GEN) && !(clone_flags & CLONE_VM)) { ++ /* lock the task to synchronize with memcg migration */ ++ task_lock(p); ++ lru_gen_add_mm(p->mm); ++ task_unlock(p); ++ } ++ + wake_up_new_task(p); + + /* forking complete and child started to run, tell ptracer */ +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -5014,6 +5014,7 @@ context_switch(struct rq *rq, struct tas + * finish_task_switch()'s mmdrop(). + */ + switch_mm_irqs_off(prev->active_mm, next->mm, next); ++ lru_gen_use_mm(next->mm); + + if (!prev->mm) { // from kernel + /* will mmdrop() in finish_task_switch(). */ +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -6213,6 +6213,30 @@ static void mem_cgroup_move_task(void) + } + #endif + ++#ifdef CONFIG_LRU_GEN ++static void mem_cgroup_attach(struct cgroup_taskset *tset) ++{ ++ struct task_struct *task; ++ struct cgroup_subsys_state *css; ++ ++ /* find the first leader if there is any */ ++ cgroup_taskset_for_each_leader(task, css, tset) ++ break; ++ ++ if (!task) ++ return; ++ ++ task_lock(task); ++ if (task->mm && READ_ONCE(task->mm->owner) == task) ++ lru_gen_migrate_mm(task->mm); ++ task_unlock(task); ++} ++#else ++static void mem_cgroup_attach(struct cgroup_taskset *tset) ++{ ++} ++#endif /* CONFIG_LRU_GEN */ ++ + static int seq_puts_memcg_tunable(struct seq_file *m, unsigned long value) + { + if (value == PAGE_COUNTER_MAX) +@@ -6556,6 +6580,7 @@ struct cgroup_subsys memory_cgrp_subsys + .css_reset = mem_cgroup_css_reset, + .css_rstat_flush = mem_cgroup_css_rstat_flush, + .can_attach = mem_cgroup_can_attach, ++ .attach = mem_cgroup_attach, + .cancel_attach = mem_cgroup_cancel_attach, + .post_attach = mem_cgroup_move_task, + .dfl_cftypes = memory_files, +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -50,6 +50,8 @@ + #include + #include + #include ++#include ++#include + + #include + #include +@@ -2853,7 +2855,7 @@ static bool can_age_anon_pages(struct pg + for ((type) = 0; (type) < ANON_AND_FILE; (type)++) \ + for ((zone) = 0; (zone) < MAX_NR_ZONES; (zone)++) + +-static struct lruvec __maybe_unused *get_lruvec(struct mem_cgroup *memcg, int nid) ++static struct lruvec *get_lruvec(struct mem_cgroup *memcg, int nid) + { + struct pglist_data *pgdat = NODE_DATA(nid); + +@@ -2899,6 +2901,371 @@ static bool __maybe_unused seq_is_valid( + } + + /****************************************************************************** ++ * mm_struct list ++ ******************************************************************************/ ++ ++static struct lru_gen_mm_list *get_mm_list(struct mem_cgroup *memcg) ++{ ++ static struct lru_gen_mm_list mm_list = { ++ .fifo = LIST_HEAD_INIT(mm_list.fifo), ++ .lock = __SPIN_LOCK_UNLOCKED(mm_list.lock), ++ }; ++ ++#ifdef CONFIG_MEMCG ++ if (memcg) ++ return &memcg->mm_list; ++#endif ++ VM_WARN_ON_ONCE(!mem_cgroup_disabled()); ++ ++ return &mm_list; ++} ++ ++void lru_gen_add_mm(struct mm_struct *mm) ++{ ++ int nid; ++ struct mem_cgroup *memcg = get_mem_cgroup_from_mm(mm); ++ struct lru_gen_mm_list *mm_list = get_mm_list(memcg); ++ ++ VM_WARN_ON_ONCE(!list_empty(&mm->lru_gen.list)); ++#ifdef CONFIG_MEMCG ++ VM_WARN_ON_ONCE(mm->lru_gen.memcg); ++ mm->lru_gen.memcg = memcg; ++#endif ++ spin_lock(&mm_list->lock); ++ ++ for_each_node_state(nid, N_MEMORY) { ++ struct lruvec *lruvec = get_lruvec(memcg, nid); ++ ++ if (!lruvec) ++ continue; ++ ++ /* the first addition since the last iteration */ ++ if (lruvec->mm_state.tail == &mm_list->fifo) ++ lruvec->mm_state.tail = &mm->lru_gen.list; ++ } ++ ++ list_add_tail(&mm->lru_gen.list, &mm_list->fifo); ++ ++ spin_unlock(&mm_list->lock); ++} ++ ++void lru_gen_del_mm(struct mm_struct *mm) ++{ ++ int nid; ++ struct lru_gen_mm_list *mm_list; ++ struct mem_cgroup *memcg = NULL; ++ ++ if (list_empty(&mm->lru_gen.list)) ++ return; ++ ++#ifdef CONFIG_MEMCG ++ memcg = mm->lru_gen.memcg; ++#endif ++ mm_list = get_mm_list(memcg); ++ ++ spin_lock(&mm_list->lock); ++ ++ for_each_node(nid) { ++ struct lruvec *lruvec = get_lruvec(memcg, nid); ++ ++ if (!lruvec) ++ continue; ++ ++ /* where the last iteration ended (exclusive) */ ++ if (lruvec->mm_state.tail == &mm->lru_gen.list) ++ lruvec->mm_state.tail = lruvec->mm_state.tail->next; ++ ++ /* where the current iteration continues (inclusive) */ ++ if (lruvec->mm_state.head != &mm->lru_gen.list) ++ continue; ++ ++ lruvec->mm_state.head = lruvec->mm_state.head->next; ++ /* the deletion ends the current iteration */ ++ if (lruvec->mm_state.head == &mm_list->fifo) ++ WRITE_ONCE(lruvec->mm_state.seq, lruvec->mm_state.seq + 1); ++ } ++ ++ list_del_init(&mm->lru_gen.list); ++ ++ spin_unlock(&mm_list->lock); ++ ++#ifdef CONFIG_MEMCG ++ mem_cgroup_put(mm->lru_gen.memcg); ++ mm->lru_gen.memcg = NULL; ++#endif ++} ++ ++#ifdef CONFIG_MEMCG ++void lru_gen_migrate_mm(struct mm_struct *mm) ++{ ++ struct mem_cgroup *memcg; ++ struct task_struct *task = rcu_dereference_protected(mm->owner, true); ++ ++ VM_WARN_ON_ONCE(task->mm != mm); ++ lockdep_assert_held(&task->alloc_lock); ++ ++ /* for mm_update_next_owner() */ ++ if (mem_cgroup_disabled()) ++ return; ++ ++ rcu_read_lock(); ++ memcg = mem_cgroup_from_task(task); ++ rcu_read_unlock(); ++ if (memcg == mm->lru_gen.memcg) ++ return; ++ ++ VM_WARN_ON_ONCE(!mm->lru_gen.memcg); ++ VM_WARN_ON_ONCE(list_empty(&mm->lru_gen.list)); ++ ++ lru_gen_del_mm(mm); ++ lru_gen_add_mm(mm); ++} ++#endif ++ ++/* ++ * Bloom filters with m=1<<15, k=2 and the false positive rates of ~1/5 when ++ * n=10,000 and ~1/2 when n=20,000, where, conventionally, m is the number of ++ * bits in a bitmap, k is the number of hash functions and n is the number of ++ * inserted items. ++ * ++ * Page table walkers use one of the two filters to reduce their search space. ++ * To get rid of non-leaf entries that no longer have enough leaf entries, the ++ * aging uses the double-buffering technique to flip to the other filter each ++ * time it produces a new generation. For non-leaf entries that have enough ++ * leaf entries, the aging carries them over to the next generation in ++ * walk_pmd_range(); the eviction also report them when walking the rmap ++ * in lru_gen_look_around(). ++ * ++ * For future optimizations: ++ * 1. It's not necessary to keep both filters all the time. The spare one can be ++ * freed after the RCU grace period and reallocated if needed again. ++ * 2. And when reallocating, it's worth scaling its size according to the number ++ * of inserted entries in the other filter, to reduce the memory overhead on ++ * small systems and false positives on large systems. ++ * 3. Jenkins' hash function is an alternative to Knuth's. ++ */ ++#define BLOOM_FILTER_SHIFT 15 ++ ++static inline int filter_gen_from_seq(unsigned long seq) ++{ ++ return seq % NR_BLOOM_FILTERS; ++} ++ ++static void get_item_key(void *item, int *key) ++{ ++ u32 hash = hash_ptr(item, BLOOM_FILTER_SHIFT * 2); ++ ++ BUILD_BUG_ON(BLOOM_FILTER_SHIFT * 2 > BITS_PER_TYPE(u32)); ++ ++ key[0] = hash & (BIT(BLOOM_FILTER_SHIFT) - 1); ++ key[1] = hash >> BLOOM_FILTER_SHIFT; ++} ++ ++static void reset_bloom_filter(struct lruvec *lruvec, unsigned long seq) ++{ ++ unsigned long *filter; ++ int gen = filter_gen_from_seq(seq); ++ ++ filter = lruvec->mm_state.filters[gen]; ++ if (filter) { ++ bitmap_clear(filter, 0, BIT(BLOOM_FILTER_SHIFT)); ++ return; ++ } ++ ++ filter = bitmap_zalloc(BIT(BLOOM_FILTER_SHIFT), ++ __GFP_HIGH | __GFP_NOMEMALLOC | __GFP_NOWARN); ++ WRITE_ONCE(lruvec->mm_state.filters[gen], filter); ++} ++ ++static void update_bloom_filter(struct lruvec *lruvec, unsigned long seq, void *item) ++{ ++ int key[2]; ++ unsigned long *filter; ++ int gen = filter_gen_from_seq(seq); ++ ++ filter = READ_ONCE(lruvec->mm_state.filters[gen]); ++ if (!filter) ++ return; ++ ++ get_item_key(item, key); ++ ++ if (!test_bit(key[0], filter)) ++ set_bit(key[0], filter); ++ if (!test_bit(key[1], filter)) ++ set_bit(key[1], filter); ++} ++ ++static bool test_bloom_filter(struct lruvec *lruvec, unsigned long seq, void *item) ++{ ++ int key[2]; ++ unsigned long *filter; ++ int gen = filter_gen_from_seq(seq); ++ ++ filter = READ_ONCE(lruvec->mm_state.filters[gen]); ++ if (!filter) ++ return true; ++ ++ get_item_key(item, key); ++ ++ return test_bit(key[0], filter) && test_bit(key[1], filter); ++} ++ ++static void reset_mm_stats(struct lruvec *lruvec, struct lru_gen_mm_walk *walk, bool last) ++{ ++ int i; ++ int hist; ++ ++ lockdep_assert_held(&get_mm_list(lruvec_memcg(lruvec))->lock); ++ ++ if (walk) { ++ hist = lru_hist_from_seq(walk->max_seq); ++ ++ for (i = 0; i < NR_MM_STATS; i++) { ++ WRITE_ONCE(lruvec->mm_state.stats[hist][i], ++ lruvec->mm_state.stats[hist][i] + walk->mm_stats[i]); ++ walk->mm_stats[i] = 0; ++ } ++ } ++ ++ if (NR_HIST_GENS > 1 && last) { ++ hist = lru_hist_from_seq(lruvec->mm_state.seq + 1); ++ ++ for (i = 0; i < NR_MM_STATS; i++) ++ WRITE_ONCE(lruvec->mm_state.stats[hist][i], 0); ++ } ++} ++ ++static bool should_skip_mm(struct mm_struct *mm, struct lru_gen_mm_walk *walk) ++{ ++ int type; ++ unsigned long size = 0; ++ struct pglist_data *pgdat = lruvec_pgdat(walk->lruvec); ++ int key = pgdat->node_id % BITS_PER_TYPE(mm->lru_gen.bitmap); ++ ++ if (!walk->force_scan && !test_bit(key, &mm->lru_gen.bitmap)) ++ return true; ++ ++ clear_bit(key, &mm->lru_gen.bitmap); ++ ++ for (type = !walk->can_swap; type < ANON_AND_FILE; type++) { ++ size += type ? get_mm_counter(mm, MM_FILEPAGES) : ++ get_mm_counter(mm, MM_ANONPAGES) + ++ get_mm_counter(mm, MM_SHMEMPAGES); ++ } ++ ++ if (size < MIN_LRU_BATCH) ++ return true; ++ ++ return !mmget_not_zero(mm); ++} ++ ++static bool iterate_mm_list(struct lruvec *lruvec, struct lru_gen_mm_walk *walk, ++ struct mm_struct **iter) ++{ ++ bool first = false; ++ bool last = true; ++ struct mm_struct *mm = NULL; ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ struct lru_gen_mm_list *mm_list = get_mm_list(memcg); ++ struct lru_gen_mm_state *mm_state = &lruvec->mm_state; ++ ++ /* ++ * There are four interesting cases for this page table walker: ++ * 1. It tries to start a new iteration of mm_list with a stale max_seq; ++ * there is nothing left to do. ++ * 2. It's the first of the current generation, and it needs to reset ++ * the Bloom filter for the next generation. ++ * 3. It reaches the end of mm_list, and it needs to increment ++ * mm_state->seq; the iteration is done. ++ * 4. It's the last of the current generation, and it needs to reset the ++ * mm stats counters for the next generation. ++ */ ++ spin_lock(&mm_list->lock); ++ ++ VM_WARN_ON_ONCE(mm_state->seq + 1 < walk->max_seq); ++ VM_WARN_ON_ONCE(*iter && mm_state->seq > walk->max_seq); ++ VM_WARN_ON_ONCE(*iter && !mm_state->nr_walkers); ++ ++ if (walk->max_seq <= mm_state->seq) { ++ if (!*iter) ++ last = false; ++ goto done; ++ } ++ ++ if (!mm_state->nr_walkers) { ++ VM_WARN_ON_ONCE(mm_state->head && mm_state->head != &mm_list->fifo); ++ ++ mm_state->head = mm_list->fifo.next; ++ first = true; ++ } ++ ++ while (!mm && mm_state->head != &mm_list->fifo) { ++ mm = list_entry(mm_state->head, struct mm_struct, lru_gen.list); ++ ++ mm_state->head = mm_state->head->next; ++ ++ /* force scan for those added after the last iteration */ ++ if (!mm_state->tail || mm_state->tail == &mm->lru_gen.list) { ++ mm_state->tail = mm_state->head; ++ walk->force_scan = true; ++ } ++ ++ if (should_skip_mm(mm, walk)) ++ mm = NULL; ++ } ++ ++ if (mm_state->head == &mm_list->fifo) ++ WRITE_ONCE(mm_state->seq, mm_state->seq + 1); ++done: ++ if (*iter && !mm) ++ mm_state->nr_walkers--; ++ if (!*iter && mm) ++ mm_state->nr_walkers++; ++ ++ if (mm_state->nr_walkers) ++ last = false; ++ ++ if (*iter || last) ++ reset_mm_stats(lruvec, walk, last); ++ ++ spin_unlock(&mm_list->lock); ++ ++ if (mm && first) ++ reset_bloom_filter(lruvec, walk->max_seq + 1); ++ ++ if (*iter) ++ mmput_async(*iter); ++ ++ *iter = mm; ++ ++ return last; ++} ++ ++static bool iterate_mm_list_nowalk(struct lruvec *lruvec, unsigned long max_seq) ++{ ++ bool success = false; ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ struct lru_gen_mm_list *mm_list = get_mm_list(memcg); ++ struct lru_gen_mm_state *mm_state = &lruvec->mm_state; ++ ++ spin_lock(&mm_list->lock); ++ ++ VM_WARN_ON_ONCE(mm_state->seq + 1 < max_seq); ++ ++ if (max_seq > mm_state->seq && !mm_state->nr_walkers) { ++ VM_WARN_ON_ONCE(mm_state->head && mm_state->head != &mm_list->fifo); ++ ++ WRITE_ONCE(mm_state->seq, mm_state->seq + 1); ++ reset_mm_stats(lruvec, NULL, true); ++ success = true; ++ } ++ ++ spin_unlock(&mm_list->lock); ++ ++ return success; ++} ++ ++/****************************************************************************** + * refault feedback loop + ******************************************************************************/ + +@@ -3048,6 +3415,118 @@ static int page_inc_gen(struct lruvec *l + return new_gen; + } + ++static void update_batch_size(struct lru_gen_mm_walk *walk, struct page *page, ++ int old_gen, int new_gen) ++{ ++ int type = page_is_file_lru(page); ++ int zone = page_zonenum(page); ++ int delta = thp_nr_pages(page); ++ ++ VM_WARN_ON_ONCE(old_gen >= MAX_NR_GENS); ++ VM_WARN_ON_ONCE(new_gen >= MAX_NR_GENS); ++ ++ walk->batched++; ++ ++ walk->nr_pages[old_gen][type][zone] -= delta; ++ walk->nr_pages[new_gen][type][zone] += delta; ++} ++ ++static void reset_batch_size(struct lruvec *lruvec, struct lru_gen_mm_walk *walk) ++{ ++ int gen, type, zone; ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ ++ walk->batched = 0; ++ ++ for_each_gen_type_zone(gen, type, zone) { ++ enum lru_list lru = type * LRU_INACTIVE_FILE; ++ int delta = walk->nr_pages[gen][type][zone]; ++ ++ if (!delta) ++ continue; ++ ++ walk->nr_pages[gen][type][zone] = 0; ++ WRITE_ONCE(lrugen->nr_pages[gen][type][zone], ++ lrugen->nr_pages[gen][type][zone] + delta); ++ ++ if (lru_gen_is_active(lruvec, gen)) ++ lru += LRU_ACTIVE; ++ __update_lru_size(lruvec, lru, zone, delta); ++ } ++} ++ ++static int should_skip_vma(unsigned long start, unsigned long end, struct mm_walk *args) ++{ ++ struct address_space *mapping; ++ struct vm_area_struct *vma = args->vma; ++ struct lru_gen_mm_walk *walk = args->private; ++ ++ if (!vma_is_accessible(vma)) ++ return true; ++ ++ if (is_vm_hugetlb_page(vma)) ++ return true; ++ ++ if (vma->vm_flags & (VM_LOCKED | VM_SPECIAL | VM_SEQ_READ | VM_RAND_READ)) ++ return true; ++ ++ if (vma == get_gate_vma(vma->vm_mm)) ++ return true; ++ ++ if (vma_is_anonymous(vma)) ++ return !walk->can_swap; ++ ++ if (WARN_ON_ONCE(!vma->vm_file || !vma->vm_file->f_mapping)) ++ return true; ++ ++ mapping = vma->vm_file->f_mapping; ++ if (mapping_unevictable(mapping)) ++ return true; ++ ++ if (shmem_mapping(mapping)) ++ return !walk->can_swap; ++ ++ /* to exclude special mappings like dax, etc. */ ++ return !mapping->a_ops->readpage; ++} ++ ++/* ++ * Some userspace memory allocators map many single-page VMAs. Instead of ++ * returning back to the PGD table for each of such VMAs, finish an entire PMD ++ * table to reduce zigzags and improve cache performance. ++ */ ++static bool get_next_vma(unsigned long mask, unsigned long size, struct mm_walk *args, ++ unsigned long *vm_start, unsigned long *vm_end) ++{ ++ unsigned long start = round_up(*vm_end, size); ++ unsigned long end = (start | ~mask) + 1; ++ ++ VM_WARN_ON_ONCE(mask & size); ++ VM_WARN_ON_ONCE((start & mask) != (*vm_start & mask)); ++ ++ while (args->vma) { ++ if (start >= args->vma->vm_end) { ++ args->vma = args->vma->vm_next; ++ continue; ++ } ++ ++ if (end && end <= args->vma->vm_start) ++ return false; ++ ++ if (should_skip_vma(args->vma->vm_start, args->vma->vm_end, args)) { ++ args->vma = args->vma->vm_next; ++ continue; ++ } ++ ++ *vm_start = max(start, args->vma->vm_start); ++ *vm_end = min(end - 1, args->vma->vm_end - 1) + 1; ++ ++ return true; ++ } ++ ++ return false; ++} ++ + static unsigned long get_pte_pfn(pte_t pte, struct vm_area_struct *vma, unsigned long addr) + { + unsigned long pfn = pte_pfn(pte); +@@ -3066,8 +3545,28 @@ static unsigned long get_pte_pfn(pte_t p + return pfn; + } + ++#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) ++static unsigned long get_pmd_pfn(pmd_t pmd, struct vm_area_struct *vma, unsigned long addr) ++{ ++ unsigned long pfn = pmd_pfn(pmd); ++ ++ VM_WARN_ON_ONCE(addr < vma->vm_start || addr >= vma->vm_end); ++ ++ if (!pmd_present(pmd) || is_huge_zero_pmd(pmd)) ++ return -1; ++ ++ if (WARN_ON_ONCE(pmd_devmap(pmd))) ++ return -1; ++ ++ if (WARN_ON_ONCE(!pfn_valid(pfn))) ++ return -1; ++ ++ return pfn; ++} ++#endif ++ + static struct page *get_pfn_page(unsigned long pfn, struct mem_cgroup *memcg, +- struct pglist_data *pgdat) ++ struct pglist_data *pgdat, bool can_swap) + { + struct page *page; + +@@ -3082,9 +3581,375 @@ static struct page *get_pfn_page(unsigne + if (page_memcg_rcu(page) != memcg) + return NULL; + ++ /* file VMAs can contain anon pages from COW */ ++ if (!page_is_file_lru(page) && !can_swap) ++ return NULL; ++ + return page; + } + ++static bool suitable_to_scan(int total, int young) ++{ ++ int n = clamp_t(int, cache_line_size() / sizeof(pte_t), 2, 8); ++ ++ /* suitable if the average number of young PTEs per cacheline is >=1 */ ++ return young * n >= total; ++} ++ ++static bool walk_pte_range(pmd_t *pmd, unsigned long start, unsigned long end, ++ struct mm_walk *args) ++{ ++ int i; ++ pte_t *pte; ++ spinlock_t *ptl; ++ unsigned long addr; ++ int total = 0; ++ int young = 0; ++ struct lru_gen_mm_walk *walk = args->private; ++ struct mem_cgroup *memcg = lruvec_memcg(walk->lruvec); ++ struct pglist_data *pgdat = lruvec_pgdat(walk->lruvec); ++ int old_gen, new_gen = lru_gen_from_seq(walk->max_seq); ++ ++ VM_WARN_ON_ONCE(pmd_leaf(*pmd)); ++ ++ ptl = pte_lockptr(args->mm, pmd); ++ if (!spin_trylock(ptl)) ++ return false; ++ ++ arch_enter_lazy_mmu_mode(); ++ ++ pte = pte_offset_map(pmd, start & PMD_MASK); ++restart: ++ for (i = pte_index(start), addr = start; addr != end; i++, addr += PAGE_SIZE) { ++ unsigned long pfn; ++ struct page *page; ++ ++ total++; ++ walk->mm_stats[MM_LEAF_TOTAL]++; ++ ++ pfn = get_pte_pfn(pte[i], args->vma, addr); ++ if (pfn == -1) ++ continue; ++ ++ if (!pte_young(pte[i])) { ++ walk->mm_stats[MM_LEAF_OLD]++; ++ continue; ++ } ++ ++ page = get_pfn_page(pfn, memcg, pgdat, walk->can_swap); ++ if (!page) ++ continue; ++ ++ if (!ptep_test_and_clear_young(args->vma, addr, pte + i)) ++ VM_WARN_ON_ONCE(true); ++ ++ young++; ++ walk->mm_stats[MM_LEAF_YOUNG]++; ++ ++ if (pte_dirty(pte[i]) && !PageDirty(page) && ++ !(PageAnon(page) && PageSwapBacked(page) && ++ !PageSwapCache(page))) ++ set_page_dirty(page); ++ ++ old_gen = page_update_gen(page, new_gen); ++ if (old_gen >= 0 && old_gen != new_gen) ++ update_batch_size(walk, page, old_gen, new_gen); ++ } ++ ++ if (i < PTRS_PER_PTE && get_next_vma(PMD_MASK, PAGE_SIZE, args, &start, &end)) ++ goto restart; ++ ++ pte_unmap(pte); ++ ++ arch_leave_lazy_mmu_mode(); ++ spin_unlock(ptl); ++ ++ return suitable_to_scan(total, young); ++} ++ ++#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) ++static void walk_pmd_range_locked(pud_t *pud, unsigned long next, struct vm_area_struct *vma, ++ struct mm_walk *args, unsigned long *bitmap, unsigned long *start) ++{ ++ int i; ++ pmd_t *pmd; ++ spinlock_t *ptl; ++ struct lru_gen_mm_walk *walk = args->private; ++ struct mem_cgroup *memcg = lruvec_memcg(walk->lruvec); ++ struct pglist_data *pgdat = lruvec_pgdat(walk->lruvec); ++ int old_gen, new_gen = lru_gen_from_seq(walk->max_seq); ++ ++ VM_WARN_ON_ONCE(pud_leaf(*pud)); ++ ++ /* try to batch at most 1+MIN_LRU_BATCH+1 entries */ ++ if (*start == -1) { ++ *start = next; ++ return; ++ } ++ ++ i = next == -1 ? 0 : pmd_index(next) - pmd_index(*start); ++ if (i && i <= MIN_LRU_BATCH) { ++ __set_bit(i - 1, bitmap); ++ return; ++ } ++ ++ pmd = pmd_offset(pud, *start); ++ ++ ptl = pmd_lockptr(args->mm, pmd); ++ if (!spin_trylock(ptl)) ++ goto done; ++ ++ arch_enter_lazy_mmu_mode(); ++ ++ do { ++ unsigned long pfn; ++ struct page *page; ++ unsigned long addr = i ? (*start & PMD_MASK) + i * PMD_SIZE : *start; ++ ++ pfn = get_pmd_pfn(pmd[i], vma, addr); ++ if (pfn == -1) ++ goto next; ++ ++ if (!pmd_trans_huge(pmd[i])) { ++ if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG)) ++ pmdp_test_and_clear_young(vma, addr, pmd + i); ++ goto next; ++ } ++ ++ page = get_pfn_page(pfn, memcg, pgdat, walk->can_swap); ++ if (!page) ++ goto next; ++ ++ if (!pmdp_test_and_clear_young(vma, addr, pmd + i)) ++ goto next; ++ ++ walk->mm_stats[MM_LEAF_YOUNG]++; ++ ++ if (pmd_dirty(pmd[i]) && !PageDirty(page) && ++ !(PageAnon(page) && PageSwapBacked(page) && ++ !PageSwapCache(page))) ++ set_page_dirty(page); ++ ++ old_gen = page_update_gen(page, new_gen); ++ if (old_gen >= 0 && old_gen != new_gen) ++ update_batch_size(walk, page, old_gen, new_gen); ++next: ++ i = i > MIN_LRU_BATCH ? 0 : find_next_bit(bitmap, MIN_LRU_BATCH, i) + 1; ++ } while (i <= MIN_LRU_BATCH); ++ ++ arch_leave_lazy_mmu_mode(); ++ spin_unlock(ptl); ++done: ++ *start = -1; ++ bitmap_zero(bitmap, MIN_LRU_BATCH); ++} ++#else ++static void walk_pmd_range_locked(pud_t *pud, unsigned long next, struct vm_area_struct *vma, ++ struct mm_walk *args, unsigned long *bitmap, unsigned long *start) ++{ ++} ++#endif ++ ++static void walk_pmd_range(pud_t *pud, unsigned long start, unsigned long end, ++ struct mm_walk *args) ++{ ++ int i; ++ pmd_t *pmd; ++ unsigned long next; ++ unsigned long addr; ++ struct vm_area_struct *vma; ++ unsigned long pos = -1; ++ struct lru_gen_mm_walk *walk = args->private; ++ unsigned long bitmap[BITS_TO_LONGS(MIN_LRU_BATCH)] = {}; ++ ++ VM_WARN_ON_ONCE(pud_leaf(*pud)); ++ ++ /* ++ * Finish an entire PMD in two passes: the first only reaches to PTE ++ * tables to avoid taking the PMD lock; the second, if necessary, takes ++ * the PMD lock to clear the accessed bit in PMD entries. ++ */ ++ pmd = pmd_offset(pud, start & PUD_MASK); ++restart: ++ /* walk_pte_range() may call get_next_vma() */ ++ vma = args->vma; ++ for (i = pmd_index(start), addr = start; addr != end; i++, addr = next) { ++ pmd_t val = pmd_read_atomic(pmd + i); ++ ++ /* for pmd_read_atomic() */ ++ barrier(); ++ ++ next = pmd_addr_end(addr, end); ++ ++ if (!pmd_present(val) || is_huge_zero_pmd(val)) { ++ walk->mm_stats[MM_LEAF_TOTAL]++; ++ continue; ++ } ++ ++#ifdef CONFIG_TRANSPARENT_HUGEPAGE ++ if (pmd_trans_huge(val)) { ++ unsigned long pfn = pmd_pfn(val); ++ struct pglist_data *pgdat = lruvec_pgdat(walk->lruvec); ++ ++ walk->mm_stats[MM_LEAF_TOTAL]++; ++ ++ if (!pmd_young(val)) { ++ walk->mm_stats[MM_LEAF_OLD]++; ++ continue; ++ } ++ ++ /* try to avoid unnecessary memory loads */ ++ if (pfn < pgdat->node_start_pfn || pfn >= pgdat_end_pfn(pgdat)) ++ continue; ++ ++ walk_pmd_range_locked(pud, addr, vma, args, bitmap, &pos); ++ continue; ++ } ++#endif ++ walk->mm_stats[MM_NONLEAF_TOTAL]++; ++ ++#ifdef CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG ++ if (!pmd_young(val)) ++ continue; ++ ++ walk_pmd_range_locked(pud, addr, vma, args, bitmap, &pos); ++#endif ++ if (!walk->force_scan && !test_bloom_filter(walk->lruvec, walk->max_seq, pmd + i)) ++ continue; ++ ++ walk->mm_stats[MM_NONLEAF_FOUND]++; ++ ++ if (!walk_pte_range(&val, addr, next, args)) ++ continue; ++ ++ walk->mm_stats[MM_NONLEAF_ADDED]++; ++ ++ /* carry over to the next generation */ ++ update_bloom_filter(walk->lruvec, walk->max_seq + 1, pmd + i); ++ } ++ ++ walk_pmd_range_locked(pud, -1, vma, args, bitmap, &pos); ++ ++ if (i < PTRS_PER_PMD && get_next_vma(PUD_MASK, PMD_SIZE, args, &start, &end)) ++ goto restart; ++} ++ ++static int walk_pud_range(p4d_t *p4d, unsigned long start, unsigned long end, ++ struct mm_walk *args) ++{ ++ int i; ++ pud_t *pud; ++ unsigned long addr; ++ unsigned long next; ++ struct lru_gen_mm_walk *walk = args->private; ++ ++ VM_WARN_ON_ONCE(p4d_leaf(*p4d)); ++ ++ pud = pud_offset(p4d, start & P4D_MASK); ++restart: ++ for (i = pud_index(start), addr = start; addr != end; i++, addr = next) { ++ pud_t val = READ_ONCE(pud[i]); ++ ++ next = pud_addr_end(addr, end); ++ ++ if (!pud_present(val) || WARN_ON_ONCE(pud_leaf(val))) ++ continue; ++ ++ walk_pmd_range(&val, addr, next, args); ++ ++ /* a racy check to curtail the waiting time */ ++ if (wq_has_sleeper(&walk->lruvec->mm_state.wait)) ++ return 1; ++ ++ if (need_resched() || walk->batched >= MAX_LRU_BATCH) { ++ end = (addr | ~PUD_MASK) + 1; ++ goto done; ++ } ++ } ++ ++ if (i < PTRS_PER_PUD && get_next_vma(P4D_MASK, PUD_SIZE, args, &start, &end)) ++ goto restart; ++ ++ end = round_up(end, P4D_SIZE); ++done: ++ if (!end || !args->vma) ++ return 1; ++ ++ walk->next_addr = max(end, args->vma->vm_start); ++ ++ return -EAGAIN; ++} ++ ++static void walk_mm(struct lruvec *lruvec, struct mm_struct *mm, struct lru_gen_mm_walk *walk) ++{ ++ static const struct mm_walk_ops mm_walk_ops = { ++ .test_walk = should_skip_vma, ++ .p4d_entry = walk_pud_range, ++ }; ++ ++ int err; ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ ++ walk->next_addr = FIRST_USER_ADDRESS; ++ ++ do { ++ err = -EBUSY; ++ ++ /* page_update_gen() requires stable page_memcg() */ ++ if (!mem_cgroup_trylock_pages(memcg)) ++ break; ++ ++ /* the caller might be holding the lock for write */ ++ if (mmap_read_trylock(mm)) { ++ err = walk_page_range(mm, walk->next_addr, ULONG_MAX, &mm_walk_ops, walk); ++ ++ mmap_read_unlock(mm); ++ } ++ ++ mem_cgroup_unlock_pages(); ++ ++ if (walk->batched) { ++ spin_lock_irq(&lruvec->lru_lock); ++ reset_batch_size(lruvec, walk); ++ spin_unlock_irq(&lruvec->lru_lock); ++ } ++ ++ cond_resched(); ++ } while (err == -EAGAIN); ++} ++ ++static struct lru_gen_mm_walk *set_mm_walk(struct pglist_data *pgdat) ++{ ++ struct lru_gen_mm_walk *walk = current->reclaim_state->mm_walk; ++ ++ if (pgdat && current_is_kswapd()) { ++ VM_WARN_ON_ONCE(walk); ++ ++ walk = &pgdat->mm_walk; ++ } else if (!pgdat && !walk) { ++ VM_WARN_ON_ONCE(current_is_kswapd()); ++ ++ walk = kzalloc(sizeof(*walk), __GFP_HIGH | __GFP_NOMEMALLOC | __GFP_NOWARN); ++ } ++ ++ current->reclaim_state->mm_walk = walk; ++ ++ return walk; ++} ++ ++static void clear_mm_walk(void) ++{ ++ struct lru_gen_mm_walk *walk = current->reclaim_state->mm_walk; ++ ++ VM_WARN_ON_ONCE(walk && memchr_inv(walk->nr_pages, 0, sizeof(walk->nr_pages))); ++ VM_WARN_ON_ONCE(walk && memchr_inv(walk->mm_stats, 0, sizeof(walk->mm_stats))); ++ ++ current->reclaim_state->mm_walk = NULL; ++ ++ if (!current_is_kswapd()) ++ kfree(walk); ++} ++ + static void inc_min_seq(struct lruvec *lruvec, int type) + { + struct lru_gen_struct *lrugen = &lruvec->lrugen; +@@ -3136,7 +4001,7 @@ next: + return success; + } + +-static void inc_max_seq(struct lruvec *lruvec, unsigned long max_seq, bool can_swap) ++static void inc_max_seq(struct lruvec *lruvec, bool can_swap) + { + int prev, next; + int type, zone; +@@ -3146,9 +4011,6 @@ static void inc_max_seq(struct lruvec *l + + VM_WARN_ON_ONCE(!seq_is_valid(lruvec)); + +- if (max_seq != lrugen->max_seq) +- goto unlock; +- + for (type = ANON_AND_FILE - 1; type >= 0; type--) { + if (get_nr_gens(lruvec, type) != MAX_NR_GENS) + continue; +@@ -3186,10 +4048,76 @@ static void inc_max_seq(struct lruvec *l + + /* make sure preceding modifications appear */ + smp_store_release(&lrugen->max_seq, lrugen->max_seq + 1); +-unlock: ++ + spin_unlock_irq(&lruvec->lru_lock); + } + ++static bool try_to_inc_max_seq(struct lruvec *lruvec, unsigned long max_seq, ++ struct scan_control *sc, bool can_swap) ++{ ++ bool success; ++ struct lru_gen_mm_walk *walk; ++ struct mm_struct *mm = NULL; ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ ++ VM_WARN_ON_ONCE(max_seq > READ_ONCE(lrugen->max_seq)); ++ ++ /* see the comment in iterate_mm_list() */ ++ if (max_seq <= READ_ONCE(lruvec->mm_state.seq)) { ++ success = false; ++ goto done; ++ } ++ ++ /* ++ * If the hardware doesn't automatically set the accessed bit, fallback ++ * to lru_gen_look_around(), which only clears the accessed bit in a ++ * handful of PTEs. Spreading the work out over a period of time usually ++ * is less efficient, but it avoids bursty page faults. ++ */ ++ if (!arch_has_hw_pte_young()) { ++ success = iterate_mm_list_nowalk(lruvec, max_seq); ++ goto done; ++ } ++ ++ walk = set_mm_walk(NULL); ++ if (!walk) { ++ success = iterate_mm_list_nowalk(lruvec, max_seq); ++ goto done; ++ } ++ ++ walk->lruvec = lruvec; ++ walk->max_seq = max_seq; ++ walk->can_swap = can_swap; ++ walk->force_scan = false; ++ ++ do { ++ success = iterate_mm_list(lruvec, walk, &mm); ++ if (mm) ++ walk_mm(lruvec, mm, walk); ++ ++ cond_resched(); ++ } while (mm); ++done: ++ if (!success) { ++ if (sc->priority <= DEF_PRIORITY - 2) ++ wait_event_killable(lruvec->mm_state.wait, ++ max_seq < READ_ONCE(lrugen->max_seq)); ++ ++ return max_seq < READ_ONCE(lrugen->max_seq); ++ } ++ ++ VM_WARN_ON_ONCE(max_seq != READ_ONCE(lrugen->max_seq)); ++ ++ inc_max_seq(lruvec, can_swap); ++ /* either this sees any waiters or they will see updated max_seq */ ++ if (wq_has_sleeper(&lruvec->mm_state.wait)) ++ wake_up_all(&lruvec->mm_state.wait); ++ ++ wakeup_flusher_threads(WB_REASON_VMSCAN); ++ ++ return true; ++} ++ + static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq, unsigned long *min_seq, + struct scan_control *sc, bool can_swap, unsigned long *nr_to_scan) + { +@@ -3265,7 +4193,7 @@ static void age_lruvec(struct lruvec *lr + + need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, swappiness, &nr_to_scan); + if (need_aging) +- inc_max_seq(lruvec, max_seq, swappiness); ++ try_to_inc_max_seq(lruvec, max_seq, sc, swappiness); + } + + static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc) +@@ -3274,6 +4202,8 @@ static void lru_gen_age_node(struct pgli + + VM_WARN_ON_ONCE(!current_is_kswapd()); + ++ set_mm_walk(pgdat); ++ + memcg = mem_cgroup_iter(NULL, NULL, NULL); + do { + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat); +@@ -3282,11 +4212,16 @@ static void lru_gen_age_node(struct pgli + + cond_resched(); + } while ((memcg = mem_cgroup_iter(NULL, memcg, NULL))); ++ ++ clear_mm_walk(); + } + + /* + * This function exploits spatial locality when shrink_page_list() walks the +- * rmap. It scans the adjacent PTEs of a young PTE and promotes hot pages. ++ * rmap. It scans the adjacent PTEs of a young PTE and promotes hot pages. If ++ * the scan was done cacheline efficiently, it adds the PMD entry pointing to ++ * the PTE table to the Bloom filter. This forms a feedback loop between the ++ * eviction and the aging. + */ + void lru_gen_look_around(struct page_vma_mapped_walk *pvmw) + { +@@ -3295,6 +4230,8 @@ void lru_gen_look_around(struct page_vma + unsigned long start; + unsigned long end; + unsigned long addr; ++ struct lru_gen_mm_walk *walk; ++ int young = 0; + unsigned long bitmap[BITS_TO_LONGS(MIN_LRU_BATCH)] = {}; + struct page *page = pvmw->page; + struct mem_cgroup *memcg = page_memcg(page); +@@ -3309,6 +4246,9 @@ void lru_gen_look_around(struct page_vma + if (spin_is_contended(pvmw->ptl)) + return; + ++ /* avoid taking the LRU lock under the PTL when possible */ ++ walk = current->reclaim_state ? current->reclaim_state->mm_walk : NULL; ++ + start = max(pvmw->address & PMD_MASK, pvmw->vma->vm_start); + end = min(pvmw->address | ~PMD_MASK, pvmw->vma->vm_end - 1) + 1; + +@@ -3338,13 +4278,15 @@ void lru_gen_look_around(struct page_vma + if (!pte_young(pte[i])) + continue; + +- page = get_pfn_page(pfn, memcg, pgdat); ++ page = get_pfn_page(pfn, memcg, pgdat, !walk || walk->can_swap); + if (!page) + continue; + + if (!ptep_test_and_clear_young(pvmw->vma, addr, pte + i)) + VM_WARN_ON_ONCE(true); + ++ young++; ++ + if (pte_dirty(pte[i]) && !PageDirty(page) && + !(PageAnon(page) && PageSwapBacked(page) && + !PageSwapCache(page))) +@@ -3360,7 +4302,11 @@ void lru_gen_look_around(struct page_vma + arch_leave_lazy_mmu_mode(); + rcu_read_unlock(); + +- if (bitmap_weight(bitmap, MIN_LRU_BATCH) < PAGEVEC_SIZE) { ++ /* feedback from rmap walkers to page table walkers */ ++ if (suitable_to_scan(i, young)) ++ update_bloom_filter(lruvec, max_seq, pvmw->pmd); ++ ++ if (!walk && bitmap_weight(bitmap, MIN_LRU_BATCH) < PAGEVEC_SIZE) { + for_each_set_bit(i, bitmap, MIN_LRU_BATCH) { + page = pte_page(pte[i]); + activate_page(page); +@@ -3372,8 +4318,10 @@ void lru_gen_look_around(struct page_vma + if (!mem_cgroup_trylock_pages(memcg)) + return; + +- spin_lock_irq(&lruvec->lru_lock); +- new_gen = lru_gen_from_seq(lruvec->lrugen.max_seq); ++ if (!walk) { ++ spin_lock_irq(&lruvec->lru_lock); ++ new_gen = lru_gen_from_seq(lruvec->lrugen.max_seq); ++ } + + for_each_set_bit(i, bitmap, MIN_LRU_BATCH) { + page = compound_head(pte_page(pte[i])); +@@ -3384,10 +4332,14 @@ void lru_gen_look_around(struct page_vma + if (old_gen < 0 || old_gen == new_gen) + continue; + +- lru_gen_update_size(lruvec, page, old_gen, new_gen); ++ if (walk) ++ update_batch_size(walk, page, old_gen, new_gen); ++ else ++ lru_gen_update_size(lruvec, page, old_gen, new_gen); + } + +- spin_unlock_irq(&lruvec->lru_lock); ++ if (!walk) ++ spin_unlock_irq(&lruvec->lru_lock); + + mem_cgroup_unlock_pages(); + } +@@ -3670,6 +4622,7 @@ static int evict_pages(struct lruvec *lr + struct page *page; + enum vm_event_item item; + struct reclaim_stat stat; ++ struct lru_gen_mm_walk *walk; + struct mem_cgroup *memcg = lruvec_memcg(lruvec); + struct pglist_data *pgdat = lruvec_pgdat(lruvec); + +@@ -3706,6 +4659,10 @@ static int evict_pages(struct lruvec *lr + + move_pages_to_lru(lruvec, &list); + ++ walk = current->reclaim_state->mm_walk; ++ if (walk && walk->batched) ++ reset_batch_size(lruvec, walk); ++ + item = current_is_kswapd() ? PGSTEAL_KSWAPD : PGSTEAL_DIRECT; + if (!cgroup_reclaim(sc)) + __count_vm_events(item, reclaimed); +@@ -3722,6 +4679,11 @@ static int evict_pages(struct lruvec *lr + return scanned; + } + ++/* ++ * For future optimizations: ++ * 1. Defer try_to_inc_max_seq() to workqueues to reduce latency for memcg ++ * reclaim. ++ */ + static unsigned long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc, + bool can_swap) + { +@@ -3747,7 +4709,8 @@ static unsigned long get_nr_to_scan(stru + if (current_is_kswapd()) + return 0; + +- inc_max_seq(lruvec, max_seq, can_swap); ++ if (try_to_inc_max_seq(lruvec, max_seq, sc, can_swap)) ++ return nr_to_scan; + done: + return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0; + } +@@ -3761,6 +4724,8 @@ static void lru_gen_shrink_lruvec(struct + + blk_start_plug(&plug); + ++ set_mm_walk(lruvec_pgdat(lruvec)); ++ + while (true) { + int delta; + int swappiness; +@@ -3788,6 +4753,8 @@ static void lru_gen_shrink_lruvec(struct + cond_resched(); + } + ++ clear_mm_walk(); ++ + blk_finish_plug(&plug); + } + +@@ -3804,15 +4771,21 @@ void lru_gen_init_lruvec(struct lruvec * + + for_each_gen_type_zone(gen, type, zone) + INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]); ++ ++ lruvec->mm_state.seq = MIN_NR_GENS; ++ init_waitqueue_head(&lruvec->mm_state.wait); + } + + #ifdef CONFIG_MEMCG + void lru_gen_init_memcg(struct mem_cgroup *memcg) + { ++ INIT_LIST_HEAD(&memcg->mm_list.fifo); ++ spin_lock_init(&memcg->mm_list.lock); + } + + void lru_gen_exit_memcg(struct mem_cgroup *memcg) + { ++ int i; + int nid; + + for_each_node(nid) { +@@ -3820,6 +4793,11 @@ void lru_gen_exit_memcg(struct mem_cgrou + + VM_WARN_ON_ONCE(memchr_inv(lruvec->lrugen.nr_pages, 0, + sizeof(lruvec->lrugen.nr_pages))); ++ ++ for (i = 0; i < NR_BLOOM_FILTERS; i++) { ++ bitmap_free(lruvec->mm_state.filters[i]); ++ lruvec->mm_state.filters[i] = NULL; ++ } + } + } + #endif diff --git a/target/linux/generic/backport-5.15/020-v6.1-09-mm-multi-gen-LRU-optimize-multiple-memcgs.patch b/target/linux/generic/backport-5.15/020-v6.1-09-mm-multi-gen-LRU-optimize-multiple-memcgs.patch new file mode 100644 index 0000000000..b5fb195151 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-09-mm-multi-gen-LRU-optimize-multiple-memcgs.patch @@ -0,0 +1,315 @@ +From 36a18a68ea458e8f4db2ca86b00091daf32c6c74 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 02:00:06 -0600 +Subject: [PATCH 09/29] mm: multi-gen LRU: optimize multiple memcgs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When multiple memcgs are available, it is possible to use generations as a +frame of reference to make better choices and improve overall performance +under global memory pressure. This patch adds a basic optimization to +select memcgs that can drop single-use unmapped clean pages first. Doing +so reduces the chance of going into the aging path or swapping, which can +be costly. + +A typical example that benefits from this optimization is a server running +mixed types of workloads, e.g., heavy anon workload in one memcg and heavy +buffered I/O workload in the other. + +Though this optimization can be applied to both kswapd and direct reclaim, +it is only added to kswapd to keep the patchset manageable. Later +improvements may cover the direct reclaim path. + +While ensuring certain fairness to all eligible memcgs, proportional scans +of individual memcgs also require proper backoff to avoid overshooting +their aggregate reclaim target by too much. Otherwise it can cause high +direct reclaim latency. The conditions for backoff are: + +1. At low priorities, for direct reclaim, if aging fairness or direct + reclaim latency is at risk, i.e., aging one memcg multiple times or + swapping after the target is met. +2. At high priorities, for global reclaim, if per-zone free pages are + above respective watermarks. + +Server benchmark results: + Mixed workloads: + fio (buffered I/O): +[19, 21]% + IOPS BW + patch1-8: 1880k 7343MiB/s + patch1-9: 2252k 8796MiB/s + + memcached (anon): +[119, 123]% + Ops/sec KB/sec + patch1-8: 862768.65 33514.68 + patch1-9: 1911022.12 74234.54 + + Mixed workloads: + fio (buffered I/O): +[75, 77]% + IOPS BW + 5.19-rc1: 1279k 4996MiB/s + patch1-9: 2252k 8796MiB/s + + memcached (anon): +[13, 15]% + Ops/sec KB/sec + 5.19-rc1: 1673524.04 65008.87 + patch1-9: 1911022.12 74234.54 + + Configurations: + (changes since patch 6) + + cat mixed.sh + modprobe brd rd_nr=2 rd_size=56623104 + + swapoff -a + mkswap /dev/ram0 + swapon /dev/ram0 + + mkfs.ext4 /dev/ram1 + mount -t ext4 /dev/ram1 /mnt + + memtier_benchmark -S /var/run/memcached/memcached.sock \ + -P memcache_binary -n allkeys --key-minimum=1 \ + --key-maximum=50000000 --key-pattern=P:P -c 1 -t 36 \ + --ratio 1:0 --pipeline 8 -d 2000 + + fio -name=mglru --numjobs=36 --directory=/mnt --size=1408m \ + --buffered=1 --ioengine=io_uring --iodepth=128 \ + --iodepth_batch_submit=32 --iodepth_batch_complete=32 \ + --rw=randread --random_distribution=random --norandommap \ + --time_based --ramp_time=10m --runtime=90m --group_reporting & + pid=$! + + sleep 200 + + memtier_benchmark -S /var/run/memcached/memcached.sock \ + -P memcache_binary -n allkeys --key-minimum=1 \ + --key-maximum=50000000 --key-pattern=R:R -c 1 -t 36 \ + --ratio 0:1 --pipeline 8 --randomize --distinct-client-seed + + kill -INT $pid + wait + +Client benchmark results: + no change (CONFIG_MEMCG=n) + +Link: https://lkml.kernel.org/r/20220918080010.2920238-10-yuzhao@google.com +Signed-off-by: Yu Zhao +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Barry Song +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Miaohe Lin +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Qi Zheng +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Will Deacon +Signed-off-by: Andrew Morton +--- + mm/vmscan.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 96 insertions(+), 9 deletions(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -127,6 +127,12 @@ struct scan_control { + /* Always discard instead of demoting to lower tier memory */ + unsigned int no_demotion:1; + ++#ifdef CONFIG_LRU_GEN ++ /* help kswapd make better choices among multiple memcgs */ ++ unsigned int memcgs_need_aging:1; ++ unsigned long last_reclaimed; ++#endif ++ + /* Allocation order */ + s8 order; + +@@ -4202,6 +4208,19 @@ static void lru_gen_age_node(struct pgli + + VM_WARN_ON_ONCE(!current_is_kswapd()); + ++ sc->last_reclaimed = sc->nr_reclaimed; ++ ++ /* ++ * To reduce the chance of going into the aging path, which can be ++ * costly, optimistically skip it if the flag below was cleared in the ++ * eviction path. This improves the overall performance when multiple ++ * memcgs are available. ++ */ ++ if (!sc->memcgs_need_aging) { ++ sc->memcgs_need_aging = true; ++ return; ++ } ++ + set_mm_walk(pgdat); + + memcg = mem_cgroup_iter(NULL, NULL, NULL); +@@ -4613,7 +4632,8 @@ static int isolate_pages(struct lruvec * + return scanned; + } + +-static int evict_pages(struct lruvec *lruvec, struct scan_control *sc, int swappiness) ++static int evict_pages(struct lruvec *lruvec, struct scan_control *sc, int swappiness, ++ bool *need_swapping) + { + int type; + int scanned; +@@ -4676,6 +4696,9 @@ static int evict_pages(struct lruvec *lr + + sc->nr_reclaimed += reclaimed; + ++ if (need_swapping && type == LRU_GEN_ANON) ++ *need_swapping = true; ++ + return scanned; + } + +@@ -4685,9 +4708,8 @@ static int evict_pages(struct lruvec *lr + * reclaim. + */ + static unsigned long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc, +- bool can_swap) ++ bool can_swap, bool *need_aging) + { +- bool need_aging; + unsigned long nr_to_scan; + struct mem_cgroup *memcg = lruvec_memcg(lruvec); + DEFINE_MAX_SEQ(lruvec); +@@ -4697,8 +4719,8 @@ static unsigned long get_nr_to_scan(stru + (mem_cgroup_below_low(memcg) && !sc->memcg_low_reclaim)) + return 0; + +- need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, can_swap, &nr_to_scan); +- if (!need_aging) ++ *need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, can_swap, &nr_to_scan); ++ if (!*need_aging) + return nr_to_scan; + + /* skip the aging path at the default priority */ +@@ -4715,10 +4737,68 @@ done: + return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0; + } + ++static bool should_abort_scan(struct lruvec *lruvec, unsigned long seq, ++ struct scan_control *sc, bool need_swapping) ++{ ++ int i; ++ DEFINE_MAX_SEQ(lruvec); ++ ++ if (!current_is_kswapd()) { ++ /* age each memcg once to ensure fairness */ ++ if (max_seq - seq > 1) ++ return true; ++ ++ /* over-swapping can increase allocation latency */ ++ if (sc->nr_reclaimed >= sc->nr_to_reclaim && need_swapping) ++ return true; ++ ++ /* give this thread a chance to exit and free its memory */ ++ if (fatal_signal_pending(current)) { ++ sc->nr_reclaimed += MIN_LRU_BATCH; ++ return true; ++ } ++ ++ if (cgroup_reclaim(sc)) ++ return false; ++ } else if (sc->nr_reclaimed - sc->last_reclaimed < sc->nr_to_reclaim) ++ return false; ++ ++ /* keep scanning at low priorities to ensure fairness */ ++ if (sc->priority > DEF_PRIORITY - 2) ++ return false; ++ ++ /* ++ * A minimum amount of work was done under global memory pressure. For ++ * kswapd, it may be overshooting. For direct reclaim, the target isn't ++ * met, and yet the allocation may still succeed, since kswapd may have ++ * caught up. In either case, it's better to stop now, and restart if ++ * necessary. ++ */ ++ for (i = 0; i <= sc->reclaim_idx; i++) { ++ unsigned long wmark; ++ struct zone *zone = lruvec_pgdat(lruvec)->node_zones + i; ++ ++ if (!managed_zone(zone)) ++ continue; ++ ++ wmark = current_is_kswapd() ? high_wmark_pages(zone) : low_wmark_pages(zone); ++ if (wmark > zone_page_state(zone, NR_FREE_PAGES)) ++ return false; ++ } ++ ++ sc->nr_reclaimed += MIN_LRU_BATCH; ++ ++ return true; ++} ++ + static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) + { + struct blk_plug plug; ++ bool need_aging = false; ++ bool need_swapping = false; + unsigned long scanned = 0; ++ unsigned long reclaimed = sc->nr_reclaimed; ++ DEFINE_MAX_SEQ(lruvec); + + lru_add_drain(); + +@@ -4738,21 +4818,28 @@ static void lru_gen_shrink_lruvec(struct + else + swappiness = 0; + +- nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness); ++ nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness, &need_aging); + if (!nr_to_scan) +- break; ++ goto done; + +- delta = evict_pages(lruvec, sc, swappiness); ++ delta = evict_pages(lruvec, sc, swappiness, &need_swapping); + if (!delta) +- break; ++ goto done; + + scanned += delta; + if (scanned >= nr_to_scan) + break; + ++ if (should_abort_scan(lruvec, max_seq, sc, need_swapping)) ++ break; ++ + cond_resched(); + } + ++ /* see the comment in lru_gen_age_node() */ ++ if (sc->nr_reclaimed - reclaimed >= MIN_LRU_BATCH && !need_aging) ++ sc->memcgs_need_aging = false; ++done: + clear_mm_walk(); + + blk_finish_plug(&plug); diff --git a/target/linux/generic/backport-5.15/020-v6.1-10-mm-multi-gen-LRU-kill-switch.patch b/target/linux/generic/backport-5.15/020-v6.1-10-mm-multi-gen-LRU-kill-switch.patch new file mode 100644 index 0000000000..8ee032fb0f --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-10-mm-multi-gen-LRU-kill-switch.patch @@ -0,0 +1,498 @@ +From 640db3a029dca909af47157ca18f52b29d34a1b9 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 02:00:07 -0600 +Subject: [PATCH 10/29] mm: multi-gen LRU: kill switch +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add /sys/kernel/mm/lru_gen/enabled as a kill switch. Components that +can be disabled include: + 0x0001: the multi-gen LRU core + 0x0002: walking page table, when arch_has_hw_pte_young() returns + true + 0x0004: clearing the accessed bit in non-leaf PMD entries, when + CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y + [yYnN]: apply to all the components above +E.g., + echo y >/sys/kernel/mm/lru_gen/enabled + cat /sys/kernel/mm/lru_gen/enabled + 0x0007 + echo 5 >/sys/kernel/mm/lru_gen/enabled + cat /sys/kernel/mm/lru_gen/enabled + 0x0005 + +NB: the page table walks happen on the scale of seconds under heavy memory +pressure, in which case the mmap_lock contention is a lesser concern, +compared with the LRU lock contention and the I/O congestion. So far the +only well-known case of the mmap_lock contention happens on Android, due +to Scudo [1] which allocates several thousand VMAs for merely a few +hundred MBs. The SPF and the Maple Tree also have provided their own +assessments [2][3]. However, if walking page tables does worsen the +mmap_lock contention, the kill switch can be used to disable it. In this +case the multi-gen LRU will suffer a minor performance degradation, as +shown previously. + +Clearing the accessed bit in non-leaf PMD entries can also be disabled, +since this behavior was not tested on x86 varieties other than Intel and +AMD. + +[1] https://source.android.com/devices/tech/debug/scudo +[2] https://lore.kernel.org/r/20220128131006.67712-1-michel@lespinasse.org/ +[3] https://lore.kernel.org/r/20220426150616.3937571-1-Liam.Howlett@oracle.com/ + +Link: https://lkml.kernel.org/r/20220918080010.2920238-11-yuzhao@google.com +Signed-off-by: Yu Zhao +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Barry Song +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Miaohe Lin +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Qi Zheng +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Will Deacon +Signed-off-by: Andrew Morton +--- + include/linux/cgroup.h | 15 ++- + include/linux/mm_inline.h | 15 ++- + include/linux/mmzone.h | 9 ++ + kernel/cgroup/cgroup-internal.h | 1 - + mm/Kconfig | 6 + + mm/vmscan.c | 228 +++++++++++++++++++++++++++++++- + 6 files changed, 265 insertions(+), 9 deletions(-) + +--- a/include/linux/cgroup.h ++++ b/include/linux/cgroup.h +@@ -433,6 +433,18 @@ static inline void cgroup_put(struct cgr + css_put(&cgrp->self); + } + ++extern struct mutex cgroup_mutex; ++ ++static inline void cgroup_lock(void) ++{ ++ mutex_lock(&cgroup_mutex); ++} ++ ++static inline void cgroup_unlock(void) ++{ ++ mutex_unlock(&cgroup_mutex); ++} ++ + /** + * task_css_set_check - obtain a task's css_set with extra access conditions + * @task: the task to obtain css_set for +@@ -447,7 +459,6 @@ static inline void cgroup_put(struct cgr + * as locks used during the cgroup_subsys::attach() methods. + */ + #ifdef CONFIG_PROVE_RCU +-extern struct mutex cgroup_mutex; + extern spinlock_t css_set_lock; + #define task_css_set_check(task, __c) \ + rcu_dereference_check((task)->cgroups, \ +@@ -709,6 +720,8 @@ struct cgroup; + static inline u64 cgroup_id(const struct cgroup *cgrp) { return 1; } + static inline void css_get(struct cgroup_subsys_state *css) {} + static inline void css_put(struct cgroup_subsys_state *css) {} ++static inline void cgroup_lock(void) {} ++static inline void cgroup_unlock(void) {} + static inline int cgroup_attach_task_all(struct task_struct *from, + struct task_struct *t) { return 0; } + static inline int cgroupstats_build(struct cgroupstats *stats, +--- a/include/linux/mm_inline.h ++++ b/include/linux/mm_inline.h +@@ -91,10 +91,21 @@ static __always_inline enum lru_list pag + + #ifdef CONFIG_LRU_GEN + ++#ifdef CONFIG_LRU_GEN_ENABLED + static inline bool lru_gen_enabled(void) + { +- return true; ++ DECLARE_STATIC_KEY_TRUE(lru_gen_caps[NR_LRU_GEN_CAPS]); ++ ++ return static_branch_likely(&lru_gen_caps[LRU_GEN_CORE]); ++} ++#else ++static inline bool lru_gen_enabled(void) ++{ ++ DECLARE_STATIC_KEY_FALSE(lru_gen_caps[NR_LRU_GEN_CAPS]); ++ ++ return static_branch_unlikely(&lru_gen_caps[LRU_GEN_CORE]); + } ++#endif + + static inline bool lru_gen_in_fault(void) + { +@@ -207,7 +218,7 @@ static inline bool lru_gen_add_page(stru + + VM_WARN_ON_ONCE_PAGE(gen != -1, page); + +- if (PageUnevictable(page)) ++ if (PageUnevictable(page) || !lrugen->enabled) + return false; + /* + * There are three common cases for this page: +--- a/include/linux/mmzone.h ++++ b/include/linux/mmzone.h +@@ -364,6 +364,13 @@ enum { + LRU_GEN_FILE, + }; + ++enum { ++ LRU_GEN_CORE, ++ LRU_GEN_MM_WALK, ++ LRU_GEN_NONLEAF_YOUNG, ++ NR_LRU_GEN_CAPS ++}; ++ + #define MIN_LRU_BATCH BITS_PER_LONG + #define MAX_LRU_BATCH (MIN_LRU_BATCH * 64) + +@@ -405,6 +412,8 @@ struct lru_gen_struct { + /* can be modified without holding the LRU lock */ + atomic_long_t evicted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS]; + atomic_long_t refaulted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS]; ++ /* whether the multi-gen LRU is enabled */ ++ bool enabled; + }; + + enum { +--- a/kernel/cgroup/cgroup-internal.h ++++ b/kernel/cgroup/cgroup-internal.h +@@ -165,7 +165,6 @@ struct cgroup_mgctx { + #define DEFINE_CGROUP_MGCTX(name) \ + struct cgroup_mgctx name = CGROUP_MGCTX_INIT(name) + +-extern struct mutex cgroup_mutex; + extern spinlock_t css_set_lock; + extern struct cgroup_subsys *cgroup_subsys[]; + extern struct list_head cgroup_roots; +--- a/mm/Kconfig ++++ b/mm/Kconfig +@@ -906,6 +906,12 @@ config LRU_GEN + help + A high performance LRU implementation to overcommit memory. + ++config LRU_GEN_ENABLED ++ bool "Enable by default" ++ depends on LRU_GEN ++ help ++ This option enables the multi-gen LRU by default. ++ + config LRU_GEN_STATS + bool "Full stats for debugging" + depends on LRU_GEN +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -52,6 +52,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -2841,6 +2842,14 @@ static bool can_age_anon_pages(struct pg + + #ifdef CONFIG_LRU_GEN + ++#ifdef CONFIG_LRU_GEN_ENABLED ++DEFINE_STATIC_KEY_ARRAY_TRUE(lru_gen_caps, NR_LRU_GEN_CAPS); ++#define get_cap(cap) static_branch_likely(&lru_gen_caps[cap]) ++#else ++DEFINE_STATIC_KEY_ARRAY_FALSE(lru_gen_caps, NR_LRU_GEN_CAPS); ++#define get_cap(cap) static_branch_unlikely(&lru_gen_caps[cap]) ++#endif ++ + /****************************************************************************** + * shorthand helpers + ******************************************************************************/ +@@ -3717,7 +3726,8 @@ static void walk_pmd_range_locked(pud_t + goto next; + + if (!pmd_trans_huge(pmd[i])) { +- if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG)) ++ if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) && ++ get_cap(LRU_GEN_NONLEAF_YOUNG)) + pmdp_test_and_clear_young(vma, addr, pmd + i); + goto next; + } +@@ -3815,10 +3825,12 @@ restart: + walk->mm_stats[MM_NONLEAF_TOTAL]++; + + #ifdef CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG +- if (!pmd_young(val)) +- continue; ++ if (get_cap(LRU_GEN_NONLEAF_YOUNG)) { ++ if (!pmd_young(val)) ++ continue; + +- walk_pmd_range_locked(pud, addr, vma, args, bitmap, &pos); ++ walk_pmd_range_locked(pud, addr, vma, args, bitmap, &pos); ++ } + #endif + if (!walk->force_scan && !test_bloom_filter(walk->lruvec, walk->max_seq, pmd + i)) + continue; +@@ -4080,7 +4092,7 @@ static bool try_to_inc_max_seq(struct lr + * handful of PTEs. Spreading the work out over a period of time usually + * is less efficient, but it avoids bursty page faults. + */ +- if (!arch_has_hw_pte_young()) { ++ if (!(arch_has_hw_pte_young() && get_cap(LRU_GEN_MM_WALK))) { + success = iterate_mm_list_nowalk(lruvec, max_seq); + goto done; + } +@@ -4846,6 +4858,208 @@ done: + } + + /****************************************************************************** ++ * state change ++ ******************************************************************************/ ++ ++static bool __maybe_unused state_is_valid(struct lruvec *lruvec) ++{ ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ ++ if (lrugen->enabled) { ++ enum lru_list lru; ++ ++ for_each_evictable_lru(lru) { ++ if (!list_empty(&lruvec->lists[lru])) ++ return false; ++ } ++ } else { ++ int gen, type, zone; ++ ++ for_each_gen_type_zone(gen, type, zone) { ++ if (!list_empty(&lrugen->lists[gen][type][zone])) ++ return false; ++ } ++ } ++ ++ return true; ++} ++ ++static bool fill_evictable(struct lruvec *lruvec) ++{ ++ enum lru_list lru; ++ int remaining = MAX_LRU_BATCH; ++ ++ for_each_evictable_lru(lru) { ++ int type = is_file_lru(lru); ++ bool active = is_active_lru(lru); ++ struct list_head *head = &lruvec->lists[lru]; ++ ++ while (!list_empty(head)) { ++ bool success; ++ struct page *page = lru_to_page(head); ++ ++ VM_WARN_ON_ONCE_PAGE(PageUnevictable(page), page); ++ VM_WARN_ON_ONCE_PAGE(PageActive(page) != active, page); ++ VM_WARN_ON_ONCE_PAGE(page_is_file_lru(page) != type, page); ++ VM_WARN_ON_ONCE_PAGE(page_lru_gen(page) != -1, page); ++ ++ del_page_from_lru_list(page, lruvec); ++ success = lru_gen_add_page(lruvec, page, false); ++ VM_WARN_ON_ONCE(!success); ++ ++ if (!--remaining) ++ return false; ++ } ++ } ++ ++ return true; ++} ++ ++static bool drain_evictable(struct lruvec *lruvec) ++{ ++ int gen, type, zone; ++ int remaining = MAX_LRU_BATCH; ++ ++ for_each_gen_type_zone(gen, type, zone) { ++ struct list_head *head = &lruvec->lrugen.lists[gen][type][zone]; ++ ++ while (!list_empty(head)) { ++ bool success; ++ struct page *page = lru_to_page(head); ++ ++ VM_WARN_ON_ONCE_PAGE(PageUnevictable(page), page); ++ VM_WARN_ON_ONCE_PAGE(PageActive(page), page); ++ VM_WARN_ON_ONCE_PAGE(page_is_file_lru(page) != type, page); ++ VM_WARN_ON_ONCE_PAGE(page_zonenum(page) != zone, page); ++ ++ success = lru_gen_del_page(lruvec, page, false); ++ VM_WARN_ON_ONCE(!success); ++ add_page_to_lru_list(page, lruvec); ++ ++ if (!--remaining) ++ return false; ++ } ++ } ++ ++ return true; ++} ++ ++static void lru_gen_change_state(bool enabled) ++{ ++ static DEFINE_MUTEX(state_mutex); ++ ++ struct mem_cgroup *memcg; ++ ++ cgroup_lock(); ++ cpus_read_lock(); ++ get_online_mems(); ++ mutex_lock(&state_mutex); ++ ++ if (enabled == lru_gen_enabled()) ++ goto unlock; ++ ++ if (enabled) ++ static_branch_enable_cpuslocked(&lru_gen_caps[LRU_GEN_CORE]); ++ else ++ static_branch_disable_cpuslocked(&lru_gen_caps[LRU_GEN_CORE]); ++ ++ memcg = mem_cgroup_iter(NULL, NULL, NULL); ++ do { ++ int nid; ++ ++ for_each_node(nid) { ++ struct lruvec *lruvec = get_lruvec(memcg, nid); ++ ++ if (!lruvec) ++ continue; ++ ++ spin_lock_irq(&lruvec->lru_lock); ++ ++ VM_WARN_ON_ONCE(!seq_is_valid(lruvec)); ++ VM_WARN_ON_ONCE(!state_is_valid(lruvec)); ++ ++ lruvec->lrugen.enabled = enabled; ++ ++ while (!(enabled ? fill_evictable(lruvec) : drain_evictable(lruvec))) { ++ spin_unlock_irq(&lruvec->lru_lock); ++ cond_resched(); ++ spin_lock_irq(&lruvec->lru_lock); ++ } ++ ++ spin_unlock_irq(&lruvec->lru_lock); ++ } ++ ++ cond_resched(); ++ } while ((memcg = mem_cgroup_iter(NULL, memcg, NULL))); ++unlock: ++ mutex_unlock(&state_mutex); ++ put_online_mems(); ++ cpus_read_unlock(); ++ cgroup_unlock(); ++} ++ ++/****************************************************************************** ++ * sysfs interface ++ ******************************************************************************/ ++ ++static ssize_t show_enabled(struct kobject *kobj, struct kobj_attribute *attr, char *buf) ++{ ++ unsigned int caps = 0; ++ ++ if (get_cap(LRU_GEN_CORE)) ++ caps |= BIT(LRU_GEN_CORE); ++ ++ if (arch_has_hw_pte_young() && get_cap(LRU_GEN_MM_WALK)) ++ caps |= BIT(LRU_GEN_MM_WALK); ++ ++ if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) && get_cap(LRU_GEN_NONLEAF_YOUNG)) ++ caps |= BIT(LRU_GEN_NONLEAF_YOUNG); ++ ++ return snprintf(buf, PAGE_SIZE, "0x%04x\n", caps); ++} ++ ++static ssize_t store_enabled(struct kobject *kobj, struct kobj_attribute *attr, ++ const char *buf, size_t len) ++{ ++ int i; ++ unsigned int caps; ++ ++ if (tolower(*buf) == 'n') ++ caps = 0; ++ else if (tolower(*buf) == 'y') ++ caps = -1; ++ else if (kstrtouint(buf, 0, &caps)) ++ return -EINVAL; ++ ++ for (i = 0; i < NR_LRU_GEN_CAPS; i++) { ++ bool enabled = caps & BIT(i); ++ ++ if (i == LRU_GEN_CORE) ++ lru_gen_change_state(enabled); ++ else if (enabled) ++ static_branch_enable(&lru_gen_caps[i]); ++ else ++ static_branch_disable(&lru_gen_caps[i]); ++ } ++ ++ return len; ++} ++ ++static struct kobj_attribute lru_gen_enabled_attr = __ATTR( ++ enabled, 0644, show_enabled, store_enabled ++); ++ ++static struct attribute *lru_gen_attrs[] = { ++ &lru_gen_enabled_attr.attr, ++ NULL ++}; ++ ++static struct attribute_group lru_gen_attr_group = { ++ .name = "lru_gen", ++ .attrs = lru_gen_attrs, ++}; ++ ++/****************************************************************************** + * initialization + ******************************************************************************/ + +@@ -4855,6 +5069,7 @@ void lru_gen_init_lruvec(struct lruvec * + struct lru_gen_struct *lrugen = &lruvec->lrugen; + + lrugen->max_seq = MIN_NR_GENS + 1; ++ lrugen->enabled = lru_gen_enabled(); + + for_each_gen_type_zone(gen, type, zone) + INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]); +@@ -4894,6 +5109,9 @@ static int __init init_lru_gen(void) + BUILD_BUG_ON(MIN_NR_GENS + 1 >= MAX_NR_GENS); + BUILD_BUG_ON(BIT(LRU_GEN_WIDTH) <= MAX_NR_GENS); + ++ if (sysfs_create_group(mm_kobj, &lru_gen_attr_group)) ++ pr_err("lru_gen: failed to create sysfs group\n"); ++ + return 0; + }; + late_initcall(init_lru_gen); diff --git a/target/linux/generic/backport-5.15/020-v6.1-11-mm-multi-gen-LRU-thrashing-prevention.patch b/target/linux/generic/backport-5.15/020-v6.1-11-mm-multi-gen-LRU-thrashing-prevention.patch new file mode 100644 index 0000000000..30e20aff6e --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-11-mm-multi-gen-LRU-thrashing-prevention.patch @@ -0,0 +1,226 @@ +From 73d1ff551760f0c79c47ab70faa4c2ca91413f5c Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 02:00:08 -0600 +Subject: [PATCH 11/29] mm: multi-gen LRU: thrashing prevention +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add /sys/kernel/mm/lru_gen/min_ttl_ms for thrashing prevention, as +requested by many desktop users [1]. + +When set to value N, it prevents the working set of N milliseconds from +getting evicted. The OOM killer is triggered if this working set cannot +be kept in memory. Based on the average human detectable lag (~100ms), +N=1000 usually eliminates intolerable lags due to thrashing. Larger +values like N=3000 make lags less noticeable at the risk of premature OOM +kills. + +Compared with the size-based approach [2], this time-based approach +has the following advantages: + +1. It is easier to configure because it is agnostic to applications + and memory sizes. +2. It is more reliable because it is directly wired to the OOM killer. + +[1] https://lore.kernel.org/r/Ydza%2FzXKY9ATRoh6@google.com/ +[2] https://lore.kernel.org/r/20101028191523.GA14972@google.com/ + +Link: https://lkml.kernel.org/r/20220918080010.2920238-12-yuzhao@google.com +Signed-off-by: Yu Zhao +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Barry Song +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Miaohe Lin +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Qi Zheng +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Will Deacon +Signed-off-by: Andrew Morton +--- + include/linux/mmzone.h | 2 ++ + mm/vmscan.c | 74 ++++++++++++++++++++++++++++++++++++++++-- + 2 files changed, 73 insertions(+), 3 deletions(-) + +--- a/include/linux/mmzone.h ++++ b/include/linux/mmzone.h +@@ -399,6 +399,8 @@ struct lru_gen_struct { + unsigned long max_seq; + /* the eviction increments the oldest generation numbers */ + unsigned long min_seq[ANON_AND_FILE]; ++ /* the birth time of each generation in jiffies */ ++ unsigned long timestamps[MAX_NR_GENS]; + /* the multi-gen LRU lists, lazily sorted on eviction */ + struct list_head lists[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; + /* the multi-gen LRU sizes, eventually consistent */ +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -4064,6 +4064,7 @@ static void inc_max_seq(struct lruvec *l + for (type = 0; type < ANON_AND_FILE; type++) + reset_ctrl_pos(lruvec, type, false); + ++ WRITE_ONCE(lrugen->timestamps[next], jiffies); + /* make sure preceding modifications appear */ + smp_store_release(&lrugen->max_seq, lrugen->max_seq + 1); + +@@ -4193,7 +4194,7 @@ static bool should_run_aging(struct lruv + return false; + } + +-static void age_lruvec(struct lruvec *lruvec, struct scan_control *sc) ++static bool age_lruvec(struct lruvec *lruvec, struct scan_control *sc, unsigned long min_ttl) + { + bool need_aging; + unsigned long nr_to_scan; +@@ -4207,16 +4208,36 @@ static void age_lruvec(struct lruvec *lr + mem_cgroup_calculate_protection(NULL, memcg); + + if (mem_cgroup_below_min(memcg)) +- return; ++ return false; + + need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, swappiness, &nr_to_scan); ++ ++ if (min_ttl) { ++ int gen = lru_gen_from_seq(min_seq[LRU_GEN_FILE]); ++ unsigned long birth = READ_ONCE(lruvec->lrugen.timestamps[gen]); ++ ++ if (time_is_after_jiffies(birth + min_ttl)) ++ return false; ++ ++ /* the size is likely too small to be helpful */ ++ if (!nr_to_scan && sc->priority != DEF_PRIORITY) ++ return false; ++ } ++ + if (need_aging) + try_to_inc_max_seq(lruvec, max_seq, sc, swappiness); ++ ++ return true; + } + ++/* to protect the working set of the last N jiffies */ ++static unsigned long lru_gen_min_ttl __read_mostly; ++ + static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc) + { + struct mem_cgroup *memcg; ++ bool success = false; ++ unsigned long min_ttl = READ_ONCE(lru_gen_min_ttl); + + VM_WARN_ON_ONCE(!current_is_kswapd()); + +@@ -4239,12 +4260,32 @@ static void lru_gen_age_node(struct pgli + do { + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat); + +- age_lruvec(lruvec, sc); ++ if (age_lruvec(lruvec, sc, min_ttl)) ++ success = true; + + cond_resched(); + } while ((memcg = mem_cgroup_iter(NULL, memcg, NULL))); + + clear_mm_walk(); ++ ++ /* check the order to exclude compaction-induced reclaim */ ++ if (success || !min_ttl || sc->order) ++ return; ++ ++ /* ++ * The main goal is to OOM kill if every generation from all memcgs is ++ * younger than min_ttl. However, another possibility is all memcgs are ++ * either below min or empty. ++ */ ++ if (mutex_trylock(&oom_lock)) { ++ struct oom_control oc = { ++ .gfp_mask = sc->gfp_mask, ++ }; ++ ++ out_of_memory(&oc); ++ ++ mutex_unlock(&oom_lock); ++ } + } + + /* +@@ -5002,6 +5043,28 @@ unlock: + * sysfs interface + ******************************************************************************/ + ++static ssize_t show_min_ttl(struct kobject *kobj, struct kobj_attribute *attr, char *buf) ++{ ++ return sprintf(buf, "%u\n", jiffies_to_msecs(READ_ONCE(lru_gen_min_ttl))); ++} ++ ++static ssize_t store_min_ttl(struct kobject *kobj, struct kobj_attribute *attr, ++ const char *buf, size_t len) ++{ ++ unsigned int msecs; ++ ++ if (kstrtouint(buf, 0, &msecs)) ++ return -EINVAL; ++ ++ WRITE_ONCE(lru_gen_min_ttl, msecs_to_jiffies(msecs)); ++ ++ return len; ++} ++ ++static struct kobj_attribute lru_gen_min_ttl_attr = __ATTR( ++ min_ttl_ms, 0644, show_min_ttl, store_min_ttl ++); ++ + static ssize_t show_enabled(struct kobject *kobj, struct kobj_attribute *attr, char *buf) + { + unsigned int caps = 0; +@@ -5050,6 +5113,7 @@ static struct kobj_attribute lru_gen_ena + ); + + static struct attribute *lru_gen_attrs[] = { ++ &lru_gen_min_ttl_attr.attr, + &lru_gen_enabled_attr.attr, + NULL + }; +@@ -5065,12 +5129,16 @@ static struct attribute_group lru_gen_at + + void lru_gen_init_lruvec(struct lruvec *lruvec) + { ++ int i; + int gen, type, zone; + struct lru_gen_struct *lrugen = &lruvec->lrugen; + + lrugen->max_seq = MIN_NR_GENS + 1; + lrugen->enabled = lru_gen_enabled(); + ++ for (i = 0; i <= MIN_NR_GENS + 1; i++) ++ lrugen->timestamps[i] = jiffies; ++ + for_each_gen_type_zone(gen, type, zone) + INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]); + diff --git a/target/linux/generic/backport-5.15/020-v6.1-12-mm-multi-gen-LRU-debugfs-interface.patch b/target/linux/generic/backport-5.15/020-v6.1-12-mm-multi-gen-LRU-debugfs-interface.patch new file mode 100644 index 0000000000..482e714bb6 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-12-mm-multi-gen-LRU-debugfs-interface.patch @@ -0,0 +1,579 @@ +From 530716d008ca26315f246cd70dc1cefc636beaa4 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 18 Sep 2022 02:00:09 -0600 +Subject: [PATCH 12/29] mm: multi-gen LRU: debugfs interface +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add /sys/kernel/debug/lru_gen for working set estimation and proactive +reclaim. These techniques are commonly used to optimize job scheduling +(bin packing) in data centers [1][2]. + +Compared with the page table-based approach and the PFN-based +approach, this lruvec-based approach has the following advantages: +1. It offers better choices because it is aware of memcgs, NUMA nodes, + shared mappings and unmapped page cache. +2. It is more scalable because it is O(nr_hot_pages), whereas the + PFN-based approach is O(nr_total_pages). + +Add /sys/kernel/debug/lru_gen_full for debugging. + +[1] https://dl.acm.org/doi/10.1145/3297858.3304053 +[2] https://dl.acm.org/doi/10.1145/3503222.3507731 + +Link: https://lkml.kernel.org/r/20220918080010.2920238-13-yuzhao@google.com +Signed-off-by: Yu Zhao +Reviewed-by: Qi Zheng +Acked-by: Brian Geffon +Acked-by: Jan Alexander Steffens (heftig) +Acked-by: Oleksandr Natalenko +Acked-by: Steven Barrett +Acked-by: Suleiman Souhlal +Tested-by: Daniel Byrne +Tested-by: Donald Carr +Tested-by: Holger Hoffstätte +Tested-by: Konstantin Kharlamov +Tested-by: Shuang Zhai +Tested-by: Sofia Trinh +Tested-by: Vaibhav Jain +Cc: Andi Kleen +Cc: Aneesh Kumar K.V +Cc: Barry Song +Cc: Catalin Marinas +Cc: Dave Hansen +Cc: Hillf Danton +Cc: Jens Axboe +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Linus Torvalds +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Miaohe Lin +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Mike Rapoport +Cc: Peter Zijlstra +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Will Deacon +Signed-off-by: Andrew Morton +--- + include/linux/nodemask.h | 1 + + mm/vmscan.c | 411 ++++++++++++++++++++++++++++++++++++++- + 2 files changed, 402 insertions(+), 10 deletions(-) + +--- a/include/linux/nodemask.h ++++ b/include/linux/nodemask.h +@@ -485,6 +485,7 @@ static inline int num_node_state(enum no + #define first_online_node 0 + #define first_memory_node 0 + #define next_online_node(nid) (MAX_NUMNODES) ++#define next_memory_node(nid) (MAX_NUMNODES) + #define nr_node_ids 1U + #define nr_online_nodes 1U + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -53,6 +53,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -3968,12 +3969,40 @@ static void clear_mm_walk(void) + kfree(walk); + } + +-static void inc_min_seq(struct lruvec *lruvec, int type) ++static bool inc_min_seq(struct lruvec *lruvec, int type, bool can_swap) + { ++ int zone; ++ int remaining = MAX_LRU_BATCH; + struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ int new_gen, old_gen = lru_gen_from_seq(lrugen->min_seq[type]); ++ ++ if (type == LRU_GEN_ANON && !can_swap) ++ goto done; ++ ++ /* prevent cold/hot inversion if force_scan is true */ ++ for (zone = 0; zone < MAX_NR_ZONES; zone++) { ++ struct list_head *head = &lrugen->lists[old_gen][type][zone]; ++ ++ while (!list_empty(head)) { ++ struct page *page = lru_to_page(head); ++ ++ VM_WARN_ON_ONCE_PAGE(PageUnevictable(page), page); ++ VM_WARN_ON_ONCE_PAGE(PageActive(page), page); ++ VM_WARN_ON_ONCE_PAGE(page_is_file_lru(page) != type, page); ++ VM_WARN_ON_ONCE_PAGE(page_zonenum(page) != zone, page); + ++ new_gen = page_inc_gen(lruvec, page, false); ++ list_move_tail(&page->lru, &lrugen->lists[new_gen][type][zone]); ++ ++ if (!--remaining) ++ return false; ++ } ++ } ++done: + reset_ctrl_pos(lruvec, type, true); + WRITE_ONCE(lrugen->min_seq[type], lrugen->min_seq[type] + 1); ++ ++ return true; + } + + static bool try_to_inc_min_seq(struct lruvec *lruvec, bool can_swap) +@@ -4019,7 +4048,7 @@ next: + return success; + } + +-static void inc_max_seq(struct lruvec *lruvec, bool can_swap) ++static void inc_max_seq(struct lruvec *lruvec, bool can_swap, bool force_scan) + { + int prev, next; + int type, zone; +@@ -4033,9 +4062,13 @@ static void inc_max_seq(struct lruvec *l + if (get_nr_gens(lruvec, type) != MAX_NR_GENS) + continue; + +- VM_WARN_ON_ONCE(type == LRU_GEN_FILE || can_swap); ++ VM_WARN_ON_ONCE(!force_scan && (type == LRU_GEN_FILE || can_swap)); + +- inc_min_seq(lruvec, type); ++ while (!inc_min_seq(lruvec, type, can_swap)) { ++ spin_unlock_irq(&lruvec->lru_lock); ++ cond_resched(); ++ spin_lock_irq(&lruvec->lru_lock); ++ } + } + + /* +@@ -4072,7 +4105,7 @@ static void inc_max_seq(struct lruvec *l + } + + static bool try_to_inc_max_seq(struct lruvec *lruvec, unsigned long max_seq, +- struct scan_control *sc, bool can_swap) ++ struct scan_control *sc, bool can_swap, bool force_scan) + { + bool success; + struct lru_gen_mm_walk *walk; +@@ -4093,7 +4126,7 @@ static bool try_to_inc_max_seq(struct lr + * handful of PTEs. Spreading the work out over a period of time usually + * is less efficient, but it avoids bursty page faults. + */ +- if (!(arch_has_hw_pte_young() && get_cap(LRU_GEN_MM_WALK))) { ++ if (!force_scan && !(arch_has_hw_pte_young() && get_cap(LRU_GEN_MM_WALK))) { + success = iterate_mm_list_nowalk(lruvec, max_seq); + goto done; + } +@@ -4107,7 +4140,7 @@ static bool try_to_inc_max_seq(struct lr + walk->lruvec = lruvec; + walk->max_seq = max_seq; + walk->can_swap = can_swap; +- walk->force_scan = false; ++ walk->force_scan = force_scan; + + do { + success = iterate_mm_list(lruvec, walk, &mm); +@@ -4127,7 +4160,7 @@ done: + + VM_WARN_ON_ONCE(max_seq != READ_ONCE(lrugen->max_seq)); + +- inc_max_seq(lruvec, can_swap); ++ inc_max_seq(lruvec, can_swap, force_scan); + /* either this sees any waiters or they will see updated max_seq */ + if (wq_has_sleeper(&lruvec->mm_state.wait)) + wake_up_all(&lruvec->mm_state.wait); +@@ -4225,7 +4258,7 @@ static bool age_lruvec(struct lruvec *lr + } + + if (need_aging) +- try_to_inc_max_seq(lruvec, max_seq, sc, swappiness); ++ try_to_inc_max_seq(lruvec, max_seq, sc, swappiness, false); + + return true; + } +@@ -4784,7 +4817,7 @@ static unsigned long get_nr_to_scan(stru + if (current_is_kswapd()) + return 0; + +- if (try_to_inc_max_seq(lruvec, max_seq, sc, can_swap)) ++ if (try_to_inc_max_seq(lruvec, max_seq, sc, can_swap, false)) + return nr_to_scan; + done: + return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0; +@@ -5124,6 +5157,361 @@ static struct attribute_group lru_gen_at + }; + + /****************************************************************************** ++ * debugfs interface ++ ******************************************************************************/ ++ ++static void *lru_gen_seq_start(struct seq_file *m, loff_t *pos) ++{ ++ struct mem_cgroup *memcg; ++ loff_t nr_to_skip = *pos; ++ ++ m->private = kvmalloc(PATH_MAX, GFP_KERNEL); ++ if (!m->private) ++ return ERR_PTR(-ENOMEM); ++ ++ memcg = mem_cgroup_iter(NULL, NULL, NULL); ++ do { ++ int nid; ++ ++ for_each_node_state(nid, N_MEMORY) { ++ if (!nr_to_skip--) ++ return get_lruvec(memcg, nid); ++ } ++ } while ((memcg = mem_cgroup_iter(NULL, memcg, NULL))); ++ ++ return NULL; ++} ++ ++static void lru_gen_seq_stop(struct seq_file *m, void *v) ++{ ++ if (!IS_ERR_OR_NULL(v)) ++ mem_cgroup_iter_break(NULL, lruvec_memcg(v)); ++ ++ kvfree(m->private); ++ m->private = NULL; ++} ++ ++static void *lru_gen_seq_next(struct seq_file *m, void *v, loff_t *pos) ++{ ++ int nid = lruvec_pgdat(v)->node_id; ++ struct mem_cgroup *memcg = lruvec_memcg(v); ++ ++ ++*pos; ++ ++ nid = next_memory_node(nid); ++ if (nid == MAX_NUMNODES) { ++ memcg = mem_cgroup_iter(NULL, memcg, NULL); ++ if (!memcg) ++ return NULL; ++ ++ nid = first_memory_node; ++ } ++ ++ return get_lruvec(memcg, nid); ++} ++ ++static void lru_gen_seq_show_full(struct seq_file *m, struct lruvec *lruvec, ++ unsigned long max_seq, unsigned long *min_seq, ++ unsigned long seq) ++{ ++ int i; ++ int type, tier; ++ int hist = lru_hist_from_seq(seq); ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ ++ for (tier = 0; tier < MAX_NR_TIERS; tier++) { ++ seq_printf(m, " %10d", tier); ++ for (type = 0; type < ANON_AND_FILE; type++) { ++ const char *s = " "; ++ unsigned long n[3] = {}; ++ ++ if (seq == max_seq) { ++ s = "RT "; ++ n[0] = READ_ONCE(lrugen->avg_refaulted[type][tier]); ++ n[1] = READ_ONCE(lrugen->avg_total[type][tier]); ++ } else if (seq == min_seq[type] || NR_HIST_GENS > 1) { ++ s = "rep"; ++ n[0] = atomic_long_read(&lrugen->refaulted[hist][type][tier]); ++ n[1] = atomic_long_read(&lrugen->evicted[hist][type][tier]); ++ if (tier) ++ n[2] = READ_ONCE(lrugen->protected[hist][type][tier - 1]); ++ } ++ ++ for (i = 0; i < 3; i++) ++ seq_printf(m, " %10lu%c", n[i], s[i]); ++ } ++ seq_putc(m, '\n'); ++ } ++ ++ seq_puts(m, " "); ++ for (i = 0; i < NR_MM_STATS; i++) { ++ const char *s = " "; ++ unsigned long n = 0; ++ ++ if (seq == max_seq && NR_HIST_GENS == 1) { ++ s = "LOYNFA"; ++ n = READ_ONCE(lruvec->mm_state.stats[hist][i]); ++ } else if (seq != max_seq && NR_HIST_GENS > 1) { ++ s = "loynfa"; ++ n = READ_ONCE(lruvec->mm_state.stats[hist][i]); ++ } ++ ++ seq_printf(m, " %10lu%c", n, s[i]); ++ } ++ seq_putc(m, '\n'); ++} ++ ++static int lru_gen_seq_show(struct seq_file *m, void *v) ++{ ++ unsigned long seq; ++ bool full = !debugfs_real_fops(m->file)->write; ++ struct lruvec *lruvec = v; ++ struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ int nid = lruvec_pgdat(lruvec)->node_id; ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ DEFINE_MAX_SEQ(lruvec); ++ DEFINE_MIN_SEQ(lruvec); ++ ++ if (nid == first_memory_node) { ++ const char *path = memcg ? m->private : ""; ++ ++#ifdef CONFIG_MEMCG ++ if (memcg) ++ cgroup_path(memcg->css.cgroup, m->private, PATH_MAX); ++#endif ++ seq_printf(m, "memcg %5hu %s\n", mem_cgroup_id(memcg), path); ++ } ++ ++ seq_printf(m, " node %5d\n", nid); ++ ++ if (!full) ++ seq = min_seq[LRU_GEN_ANON]; ++ else if (max_seq >= MAX_NR_GENS) ++ seq = max_seq - MAX_NR_GENS + 1; ++ else ++ seq = 0; ++ ++ for (; seq <= max_seq; seq++) { ++ int type, zone; ++ int gen = lru_gen_from_seq(seq); ++ unsigned long birth = READ_ONCE(lruvec->lrugen.timestamps[gen]); ++ ++ seq_printf(m, " %10lu %10u", seq, jiffies_to_msecs(jiffies - birth)); ++ ++ for (type = 0; type < ANON_AND_FILE; type++) { ++ unsigned long size = 0; ++ char mark = full && seq < min_seq[type] ? 'x' : ' '; ++ ++ for (zone = 0; zone < MAX_NR_ZONES; zone++) ++ size += max(READ_ONCE(lrugen->nr_pages[gen][type][zone]), 0L); ++ ++ seq_printf(m, " %10lu%c", size, mark); ++ } ++ ++ seq_putc(m, '\n'); ++ ++ if (full) ++ lru_gen_seq_show_full(m, lruvec, max_seq, min_seq, seq); ++ } ++ ++ return 0; ++} ++ ++static const struct seq_operations lru_gen_seq_ops = { ++ .start = lru_gen_seq_start, ++ .stop = lru_gen_seq_stop, ++ .next = lru_gen_seq_next, ++ .show = lru_gen_seq_show, ++}; ++ ++static int run_aging(struct lruvec *lruvec, unsigned long seq, struct scan_control *sc, ++ bool can_swap, bool force_scan) ++{ ++ DEFINE_MAX_SEQ(lruvec); ++ DEFINE_MIN_SEQ(lruvec); ++ ++ if (seq < max_seq) ++ return 0; ++ ++ if (seq > max_seq) ++ return -EINVAL; ++ ++ if (!force_scan && min_seq[!can_swap] + MAX_NR_GENS - 1 <= max_seq) ++ return -ERANGE; ++ ++ try_to_inc_max_seq(lruvec, max_seq, sc, can_swap, force_scan); ++ ++ return 0; ++} ++ ++static int run_eviction(struct lruvec *lruvec, unsigned long seq, struct scan_control *sc, ++ int swappiness, unsigned long nr_to_reclaim) ++{ ++ DEFINE_MAX_SEQ(lruvec); ++ ++ if (seq + MIN_NR_GENS > max_seq) ++ return -EINVAL; ++ ++ sc->nr_reclaimed = 0; ++ ++ while (!signal_pending(current)) { ++ DEFINE_MIN_SEQ(lruvec); ++ ++ if (seq < min_seq[!swappiness]) ++ return 0; ++ ++ if (sc->nr_reclaimed >= nr_to_reclaim) ++ return 0; ++ ++ if (!evict_pages(lruvec, sc, swappiness, NULL)) ++ return 0; ++ ++ cond_resched(); ++ } ++ ++ return -EINTR; ++} ++ ++static int run_cmd(char cmd, int memcg_id, int nid, unsigned long seq, ++ struct scan_control *sc, int swappiness, unsigned long opt) ++{ ++ struct lruvec *lruvec; ++ int err = -EINVAL; ++ struct mem_cgroup *memcg = NULL; ++ ++ if (nid < 0 || nid >= MAX_NUMNODES || !node_state(nid, N_MEMORY)) ++ return -EINVAL; ++ ++ if (!mem_cgroup_disabled()) { ++ rcu_read_lock(); ++ memcg = mem_cgroup_from_id(memcg_id); ++#ifdef CONFIG_MEMCG ++ if (memcg && !css_tryget(&memcg->css)) ++ memcg = NULL; ++#endif ++ rcu_read_unlock(); ++ ++ if (!memcg) ++ return -EINVAL; ++ } ++ ++ if (memcg_id != mem_cgroup_id(memcg)) ++ goto done; ++ ++ lruvec = get_lruvec(memcg, nid); ++ ++ if (swappiness < 0) ++ swappiness = get_swappiness(lruvec, sc); ++ else if (swappiness > 200) ++ goto done; ++ ++ switch (cmd) { ++ case '+': ++ err = run_aging(lruvec, seq, sc, swappiness, opt); ++ break; ++ case '-': ++ err = run_eviction(lruvec, seq, sc, swappiness, opt); ++ break; ++ } ++done: ++ mem_cgroup_put(memcg); ++ ++ return err; ++} ++ ++static ssize_t lru_gen_seq_write(struct file *file, const char __user *src, ++ size_t len, loff_t *pos) ++{ ++ void *buf; ++ char *cur, *next; ++ unsigned int flags; ++ struct blk_plug plug; ++ int err = -EINVAL; ++ struct scan_control sc = { ++ .may_writepage = true, ++ .may_unmap = true, ++ .may_swap = true, ++ .reclaim_idx = MAX_NR_ZONES - 1, ++ .gfp_mask = GFP_KERNEL, ++ }; ++ ++ buf = kvmalloc(len + 1, GFP_KERNEL); ++ if (!buf) ++ return -ENOMEM; ++ ++ if (copy_from_user(buf, src, len)) { ++ kvfree(buf); ++ return -EFAULT; ++ } ++ ++ set_task_reclaim_state(current, &sc.reclaim_state); ++ flags = memalloc_noreclaim_save(); ++ blk_start_plug(&plug); ++ if (!set_mm_walk(NULL)) { ++ err = -ENOMEM; ++ goto done; ++ } ++ ++ next = buf; ++ next[len] = '\0'; ++ ++ while ((cur = strsep(&next, ",;\n"))) { ++ int n; ++ int end; ++ char cmd; ++ unsigned int memcg_id; ++ unsigned int nid; ++ unsigned long seq; ++ unsigned int swappiness = -1; ++ unsigned long opt = -1; ++ ++ cur = skip_spaces(cur); ++ if (!*cur) ++ continue; ++ ++ n = sscanf(cur, "%c %u %u %lu %n %u %n %lu %n", &cmd, &memcg_id, &nid, ++ &seq, &end, &swappiness, &end, &opt, &end); ++ if (n < 4 || cur[end]) { ++ err = -EINVAL; ++ break; ++ } ++ ++ err = run_cmd(cmd, memcg_id, nid, seq, &sc, swappiness, opt); ++ if (err) ++ break; ++ } ++done: ++ clear_mm_walk(); ++ blk_finish_plug(&plug); ++ memalloc_noreclaim_restore(flags); ++ set_task_reclaim_state(current, NULL); ++ ++ kvfree(buf); ++ ++ return err ? : len; ++} ++ ++static int lru_gen_seq_open(struct inode *inode, struct file *file) ++{ ++ return seq_open(file, &lru_gen_seq_ops); ++} ++ ++static const struct file_operations lru_gen_rw_fops = { ++ .open = lru_gen_seq_open, ++ .read = seq_read, ++ .write = lru_gen_seq_write, ++ .llseek = seq_lseek, ++ .release = seq_release, ++}; ++ ++static const struct file_operations lru_gen_ro_fops = { ++ .open = lru_gen_seq_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = seq_release, ++}; ++ ++/****************************************************************************** + * initialization + ******************************************************************************/ + +@@ -5180,6 +5568,9 @@ static int __init init_lru_gen(void) + if (sysfs_create_group(mm_kobj, &lru_gen_attr_group)) + pr_err("lru_gen: failed to create sysfs group\n"); + ++ debugfs_create_file("lru_gen", 0644, NULL, NULL, &lru_gen_rw_fops); ++ debugfs_create_file("lru_gen_full", 0444, NULL, NULL, &lru_gen_ro_fops); ++ + return 0; + }; + late_initcall(init_lru_gen); diff --git a/target/linux/generic/backport-5.15/020-v6.1-13-mm-mglru-don-t-sync-disk-for-each-aging-cycle.patch b/target/linux/generic/backport-5.15/020-v6.1-13-mm-mglru-don-t-sync-disk-for-each-aging-cycle.patch new file mode 100644 index 0000000000..fd4aa72747 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-13-mm-mglru-don-t-sync-disk-for-each-aging-cycle.patch @@ -0,0 +1,32 @@ +From 92d430e8955c976eacb7cc91d7ff849c0dd009af Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Wed, 28 Sep 2022 13:36:58 -0600 +Subject: [PATCH 13/29] mm/mglru: don't sync disk for each aging cycle + +wakeup_flusher_threads() was added under the assumption that if a system +runs out of clean cold pages, it might want to write back dirty pages more +aggressively so that they can become clean and be dropped. + +However, doing so can breach the rate limit a system wants to impose on +writeback, resulting in early SSD wearout. + +Link: https://lkml.kernel.org/r/YzSiWq9UEER5LKup@google.com +Fixes: bd74fdaea146 ("mm: multi-gen LRU: support page table walks") +Signed-off-by: Yu Zhao +Reported-by: Axel Rasmussen +Signed-off-by: Andrew Morton +--- + mm/vmscan.c | 2 -- + 1 file changed, 2 deletions(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -4165,8 +4165,6 @@ done: + if (wq_has_sleeper(&lruvec->mm_state.wait)) + wake_up_all(&lruvec->mm_state.wait); + +- wakeup_flusher_threads(WB_REASON_VMSCAN); +- + return true; + } + diff --git a/target/linux/generic/backport-5.15/020-v6.1-14-mm-multi-gen-LRU-retry-pages-written-back-while-isol.patch b/target/linux/generic/backport-5.15/020-v6.1-14-mm-multi-gen-LRU-retry-pages-written-back-while-isol.patch new file mode 100644 index 0000000000..31b35cbc4b --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-14-mm-multi-gen-LRU-retry-pages-written-back-while-isol.patch @@ -0,0 +1,124 @@ +From 6f315879ad750391a0b1fab8c9170bc054a5f5d7 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Tue, 15 Nov 2022 18:38:07 -0700 +Subject: [PATCH 14/29] mm: multi-gen LRU: retry pages written back while + isolated + +The page reclaim isolates a batch of pages from the tail of one of the +LRU lists and works on those pages one by one. For a suitable +swap-backed page, if the swap device is async, it queues that page for +writeback. After the page reclaim finishes an entire batch, it puts back +the pages it queued for writeback to the head of the original LRU list. + +In the meantime, the page writeback flushes the queued pages also by +batches. Its batching logic is independent from that of the page reclaim. +For each of the pages it writes back, the page writeback calls +rotate_reclaimable_page() which tries to rotate a page to the tail. + +rotate_reclaimable_page() only works for a page after the page reclaim +has put it back. If an async swap device is fast enough, the page +writeback can finish with that page while the page reclaim is still +working on the rest of the batch containing it. In this case, that page +will remain at the head and the page reclaim will not retry it before +reaching there. + +This patch adds a retry to evict_pages(). After evict_pages() has +finished an entire batch and before it puts back pages it cannot free +immediately, it retries those that may have missed the rotation. + +Before this patch, ~60% of pages swapped to an Intel Optane missed +rotate_reclaimable_page(). After this patch, ~99% of missed pages were +reclaimed upon retry. + +This problem affects relatively slow async swap devices like Samsung 980 +Pro much less and does not affect sync swap devices like zram or zswap at +all. + +Link: https://lkml.kernel.org/r/20221116013808.3995280-1-yuzhao@google.com +Fixes: ac35a4902374 ("mm: multi-gen LRU: minimal implementation") +Signed-off-by: Yu Zhao +Cc: "Yin, Fengwei" +Signed-off-by: Andrew Morton +--- + mm/vmscan.c | 48 +++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 37 insertions(+), 11 deletions(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -4723,10 +4723,13 @@ static int evict_pages(struct lruvec *lr + int scanned; + int reclaimed; + LIST_HEAD(list); ++ LIST_HEAD(clean); + struct page *page; ++ struct page *next; + enum vm_event_item item; + struct reclaim_stat stat; + struct lru_gen_mm_walk *walk; ++ bool skip_retry = false; + struct mem_cgroup *memcg = lruvec_memcg(lruvec); + struct pglist_data *pgdat = lruvec_pgdat(lruvec); + +@@ -4743,20 +4746,37 @@ static int evict_pages(struct lruvec *lr + + if (list_empty(&list)) + return scanned; +- ++retry: + reclaimed = shrink_page_list(&list, pgdat, sc, &stat, false); ++ sc->nr_reclaimed += reclaimed; + +- list_for_each_entry(page, &list, lru) { +- /* restore LRU_REFS_FLAGS cleared by isolate_page() */ +- if (PageWorkingset(page)) +- SetPageReferenced(page); ++ list_for_each_entry_safe_reverse(page, next, &list, lru) { ++ if (!page_evictable(page)) { ++ list_del(&page->lru); ++ putback_lru_page(page); ++ continue; ++ } + +- /* don't add rejected pages to the oldest generation */ + if (PageReclaim(page) && +- (PageDirty(page) || PageWriteback(page))) +- ClearPageActive(page); +- else +- SetPageActive(page); ++ (PageDirty(page) || PageWriteback(page))) { ++ /* restore LRU_REFS_FLAGS cleared by isolate_page() */ ++ if (PageWorkingset(page)) ++ SetPageReferenced(page); ++ continue; ++ } ++ ++ if (skip_retry || PageActive(page) || PageReferenced(page) || ++ page_mapped(page) || PageLocked(page) || ++ PageDirty(page) || PageWriteback(page)) { ++ /* don't add rejected pages to the oldest generation */ ++ set_mask_bits(&page->flags, LRU_REFS_MASK | LRU_REFS_FLAGS, ++ BIT(PG_active)); ++ continue; ++ } ++ ++ /* retry pages that may have missed rotate_reclaimable_page() */ ++ list_move(&page->lru, &clean); ++ sc->nr_scanned -= thp_nr_pages(page); + } + + spin_lock_irq(&lruvec->lru_lock); +@@ -4778,7 +4798,13 @@ static int evict_pages(struct lruvec *lr + mem_cgroup_uncharge_list(&list); + free_unref_page_list(&list); + +- sc->nr_reclaimed += reclaimed; ++ INIT_LIST_HEAD(&list); ++ list_splice_init(&clean, &list); ++ ++ if (!list_empty(&list)) { ++ skip_retry = true; ++ goto retry; ++ } + + if (need_swapping && type == LRU_GEN_ANON) + *need_swapping = true; diff --git a/target/linux/generic/backport-5.15/020-v6.1-15-mm-multi-gen-LRU-move-lru_gen_add_mm-out-of-IRQ-off-.patch b/target/linux/generic/backport-5.15/020-v6.1-15-mm-multi-gen-LRU-move-lru_gen_add_mm-out-of-IRQ-off-.patch new file mode 100644 index 0000000000..5b1d378504 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-15-mm-multi-gen-LRU-move-lru_gen_add_mm-out-of-IRQ-off-.patch @@ -0,0 +1,49 @@ +From 255bb0ac393f1c2818cd75af45a9226300ab3daf Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 26 Oct 2022 15:48:30 +0200 +Subject: [PATCH 15/29] mm: multi-gen LRU: move lru_gen_add_mm() out of IRQ-off + region + +lru_gen_add_mm() has been added within an IRQ-off region in the commit +mentioned below. The other invocations of lru_gen_add_mm() are not within +an IRQ-off region. + +The invocation within IRQ-off region is problematic on PREEMPT_RT because +the function is using a spin_lock_t which must not be used within +IRQ-disabled regions. + +The other invocations of lru_gen_add_mm() occur while +task_struct::alloc_lock is acquired. Move lru_gen_add_mm() after +interrupts are enabled and before task_unlock(). + +Link: https://lkml.kernel.org/r/20221026134830.711887-1-bigeasy@linutronix.de +Fixes: bd74fdaea1460 ("mm: multi-gen LRU: support page table walks") +Signed-off-by: Sebastian Andrzej Siewior +Acked-by: Yu Zhao +Cc: Al Viro +Cc: "Eric W . Biederman" +Cc: Kees Cook +Cc: Thomas Gleixner +Signed-off-by: Andrew Morton +--- + fs/exec.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/fs/exec.c ++++ b/fs/exec.c +@@ -1013,7 +1013,6 @@ static int exec_mmap(struct mm_struct *m + active_mm = tsk->active_mm; + tsk->active_mm = mm; + tsk->mm = mm; +- lru_gen_add_mm(mm); + /* + * This prevents preemption while active_mm is being loaded and + * it and mm are being updated, which could cause problems for +@@ -1028,6 +1027,7 @@ static int exec_mmap(struct mm_struct *m + local_irq_enable(); + tsk->mm->vmacache_seqnum = 0; + vmacache_flush(tsk); ++ lru_gen_add_mm(mm); + task_unlock(tsk); + lru_gen_use_mm(mm); + if (old_mm) { diff --git a/target/linux/generic/backport-5.15/020-v6.1-17-mm-add-dummy-pmd_young-for-architectures-not-having-.patch b/target/linux/generic/backport-5.15/020-v6.1-17-mm-add-dummy-pmd_young-for-architectures-not-having-.patch new file mode 100644 index 0000000000..1c10c168a5 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-17-mm-add-dummy-pmd_young-for-architectures-not-having-.patch @@ -0,0 +1,96 @@ +From c5ec455ebd2b488d91de9d8915a0c8036a2a04dd Mon Sep 17 00:00:00 2001 +From: Juergen Gross +Date: Wed, 30 Nov 2022 14:49:41 -0800 +Subject: [PATCH 17/29] mm: add dummy pmd_young() for architectures not having + it + +In order to avoid #ifdeffery add a dummy pmd_young() implementation as a +fallback. This is required for the later patch "mm: introduce +arch_has_hw_nonleaf_pmd_young()". + +Link: https://lkml.kernel.org/r/fd3ac3cd-7349-6bbd-890a-71a9454ca0b3@suse.com +Signed-off-by: Juergen Gross +Acked-by: Yu Zhao +Cc: Borislav Petkov +Cc: Dave Hansen +Cc: Geert Uytterhoeven +Cc: "H. Peter Anvin" +Cc: Ingo Molnar +Cc: Sander Eikelenboom +Cc: Thomas Gleixner +Signed-off-by: Andrew Morton +--- + arch/mips/include/asm/pgtable.h | 1 + + arch/riscv/include/asm/pgtable.h | 1 + + arch/s390/include/asm/pgtable.h | 1 + + arch/sparc/include/asm/pgtable_64.h | 1 + + arch/x86/include/asm/pgtable.h | 1 + + include/linux/pgtable.h | 7 +++++++ + 6 files changed, 12 insertions(+) + +--- a/arch/mips/include/asm/pgtable.h ++++ b/arch/mips/include/asm/pgtable.h +@@ -632,6 +632,7 @@ static inline pmd_t pmd_mkdirty(pmd_t pm + return pmd; + } + ++#define pmd_young pmd_young + static inline int pmd_young(pmd_t pmd) + { + return !!(pmd_val(pmd) & _PAGE_ACCESSED); +--- a/arch/riscv/include/asm/pgtable.h ++++ b/arch/riscv/include/asm/pgtable.h +@@ -535,6 +535,7 @@ static inline int pmd_dirty(pmd_t pmd) + return pte_dirty(pmd_pte(pmd)); + } + ++#define pmd_young pmd_young + static inline int pmd_young(pmd_t pmd) + { + return pte_young(pmd_pte(pmd)); +--- a/arch/s390/include/asm/pgtable.h ++++ b/arch/s390/include/asm/pgtable.h +@@ -748,6 +748,7 @@ static inline int pmd_dirty(pmd_t pmd) + return (pmd_val(pmd) & _SEGMENT_ENTRY_DIRTY) != 0; + } + ++#define pmd_young pmd_young + static inline int pmd_young(pmd_t pmd) + { + return (pmd_val(pmd) & _SEGMENT_ENTRY_YOUNG) != 0; +--- a/arch/sparc/include/asm/pgtable_64.h ++++ b/arch/sparc/include/asm/pgtable_64.h +@@ -712,6 +712,7 @@ static inline unsigned long pmd_dirty(pm + return pte_dirty(pte); + } + ++#define pmd_young pmd_young + static inline unsigned long pmd_young(pmd_t pmd) + { + pte_t pte = __pte(pmd_val(pmd)); +--- a/arch/x86/include/asm/pgtable.h ++++ b/arch/x86/include/asm/pgtable.h +@@ -136,6 +136,7 @@ static inline int pmd_dirty(pmd_t pmd) + return pmd_flags(pmd) & _PAGE_DIRTY; + } + ++#define pmd_young pmd_young + static inline int pmd_young(pmd_t pmd) + { + return pmd_flags(pmd) & _PAGE_ACCESSED; +--- a/include/linux/pgtable.h ++++ b/include/linux/pgtable.h +@@ -164,6 +164,13 @@ static inline pte_t *virt_to_kpte(unsign + return pmd_none(*pmd) ? NULL : pte_offset_kernel(pmd, vaddr); + } + ++#ifndef pmd_young ++static inline int pmd_young(pmd_t pmd) ++{ ++ return 0; ++} ++#endif ++ + #ifndef __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS + extern int ptep_set_access_flags(struct vm_area_struct *vma, + unsigned long address, pte_t *ptep, diff --git a/target/linux/generic/backport-5.15/020-v6.1-18-mm-introduce-arch_has_hw_nonleaf_pmd_young.patch b/target/linux/generic/backport-5.15/020-v6.1-18-mm-introduce-arch_has_hw_nonleaf_pmd_young.patch new file mode 100644 index 0000000000..9a1f9bead6 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.1-18-mm-introduce-arch_has_hw_nonleaf_pmd_young.patch @@ -0,0 +1,113 @@ +From 46cbda7b65998a5af4493f745d94417af697bd68 Mon Sep 17 00:00:00 2001 +From: Juergen Gross +Date: Wed, 23 Nov 2022 07:45:10 +0100 +Subject: [PATCH 18/29] mm: introduce arch_has_hw_nonleaf_pmd_young() + +When running as a Xen PV guests commit eed9a328aa1a ("mm: x86: add +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG") can cause a protection violation in +pmdp_test_and_clear_young(): + + BUG: unable to handle page fault for address: ffff8880083374d0 + #PF: supervisor write access in kernel mode + #PF: error_code(0x0003) - permissions violation + PGD 3026067 P4D 3026067 PUD 3027067 PMD 7fee5067 PTE 8010000008337065 + Oops: 0003 [#1] PREEMPT SMP NOPTI + CPU: 7 PID: 158 Comm: kswapd0 Not tainted 6.1.0-rc5-20221118-doflr+ #1 + RIP: e030:pmdp_test_and_clear_young+0x25/0x40 + +This happens because the Xen hypervisor can't emulate direct writes to +page table entries other than PTEs. + +This can easily be fixed by introducing arch_has_hw_nonleaf_pmd_young() +similar to arch_has_hw_pte_young() and test that instead of +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG. + +Link: https://lkml.kernel.org/r/20221123064510.16225-1-jgross@suse.com +Fixes: eed9a328aa1a ("mm: x86: add CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG") +Signed-off-by: Juergen Gross +Reported-by: Sander Eikelenboom +Acked-by: Yu Zhao +Tested-by: Sander Eikelenboom +Acked-by: David Hildenbrand [core changes] +Signed-off-by: Andrew Morton +--- + arch/x86/include/asm/pgtable.h | 8 ++++++++ + include/linux/pgtable.h | 11 +++++++++++ + mm/vmscan.c | 10 +++++----- + 3 files changed, 24 insertions(+), 5 deletions(-) + +--- a/arch/x86/include/asm/pgtable.h ++++ b/arch/x86/include/asm/pgtable.h +@@ -1405,6 +1405,14 @@ static inline bool arch_has_hw_pte_young + return true; + } + ++#ifdef CONFIG_XEN_PV ++#define arch_has_hw_nonleaf_pmd_young arch_has_hw_nonleaf_pmd_young ++static inline bool arch_has_hw_nonleaf_pmd_young(void) ++{ ++ return !cpu_feature_enabled(X86_FEATURE_XENPV); ++} ++#endif ++ + #endif /* __ASSEMBLY__ */ + + #endif /* _ASM_X86_PGTABLE_H */ +--- a/include/linux/pgtable.h ++++ b/include/linux/pgtable.h +@@ -266,6 +266,17 @@ static inline int pmdp_clear_flush_young + #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ + #endif + ++#ifndef arch_has_hw_nonleaf_pmd_young ++/* ++ * Return whether the accessed bit in non-leaf PMD entries is supported on the ++ * local CPU. ++ */ ++static inline bool arch_has_hw_nonleaf_pmd_young(void) ++{ ++ return IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG); ++} ++#endif ++ + #ifndef arch_has_hw_pte_young + /* + * Return whether the accessed bit is supported on the local CPU. +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -3727,7 +3727,7 @@ static void walk_pmd_range_locked(pud_t + goto next; + + if (!pmd_trans_huge(pmd[i])) { +- if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) && ++ if (arch_has_hw_nonleaf_pmd_young() && + get_cap(LRU_GEN_NONLEAF_YOUNG)) + pmdp_test_and_clear_young(vma, addr, pmd + i); + goto next; +@@ -3825,14 +3825,14 @@ restart: + #endif + walk->mm_stats[MM_NONLEAF_TOTAL]++; + +-#ifdef CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG +- if (get_cap(LRU_GEN_NONLEAF_YOUNG)) { ++ if (arch_has_hw_nonleaf_pmd_young() && ++ get_cap(LRU_GEN_NONLEAF_YOUNG)) { + if (!pmd_young(val)) + continue; + + walk_pmd_range_locked(pud, addr, vma, args, bitmap, &pos); + } +-#endif ++ + if (!walk->force_scan && !test_bloom_filter(walk->lruvec, walk->max_seq, pmd + i)) + continue; + +@@ -5132,7 +5132,7 @@ static ssize_t show_enabled(struct kobje + if (arch_has_hw_pte_young() && get_cap(LRU_GEN_MM_WALK)) + caps |= BIT(LRU_GEN_MM_WALK); + +- if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) && get_cap(LRU_GEN_NONLEAF_YOUNG)) ++ if (arch_has_hw_nonleaf_pmd_young() && get_cap(LRU_GEN_NONLEAF_YOUNG)) + caps |= BIT(LRU_GEN_NONLEAF_YOUNG); + + return snprintf(buf, PAGE_SIZE, "0x%04x\n", caps); diff --git a/target/linux/generic/backport-5.15/020-v6.2-16-mm-multi-gen-LRU-fix-crash-during-cgroup-migration.patch b/target/linux/generic/backport-5.15/020-v6.2-16-mm-multi-gen-LRU-fix-crash-during-cgroup-migration.patch new file mode 100644 index 0000000000..e37386abdf --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.2-16-mm-multi-gen-LRU-fix-crash-during-cgroup-migration.patch @@ -0,0 +1,56 @@ +From c7dfefd4bdfba3d5171038d1cc2d4160288e6ee4 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Sun, 15 Jan 2023 20:44:05 -0700 +Subject: [PATCH 16/29] mm: multi-gen LRU: fix crash during cgroup migration + +lru_gen_migrate_mm() assumes lru_gen_add_mm() runs prior to itself. This +isn't true for the following scenario: + + CPU 1 CPU 2 + + clone() + cgroup_can_fork() + cgroup_procs_write() + cgroup_post_fork() + task_lock() + lru_gen_migrate_mm() + task_unlock() + task_lock() + lru_gen_add_mm() + task_unlock() + +And when the above happens, kernel crashes because of linked list +corruption (mm_struct->lru_gen.list). + +Link: https://lore.kernel.org/r/20230115134651.30028-1-msizanoen@qtmlabs.xyz/ +Link: https://lkml.kernel.org/r/20230116034405.2960276-1-yuzhao@google.com +Fixes: bd74fdaea146 ("mm: multi-gen LRU: support page table walks") +Signed-off-by: Yu Zhao +Reported-by: msizanoen +Tested-by: msizanoen +Cc: [6.1+] +Signed-off-by: Andrew Morton +--- + mm/vmscan.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -3024,13 +3024,16 @@ void lru_gen_migrate_mm(struct mm_struct + if (mem_cgroup_disabled()) + return; + ++ /* migration can happen before addition */ ++ if (!mm->lru_gen.memcg) ++ return; ++ + rcu_read_lock(); + memcg = mem_cgroup_from_task(task); + rcu_read_unlock(); + if (memcg == mm->lru_gen.memcg) + return; + +- VM_WARN_ON_ONCE(!mm->lru_gen.memcg); + VM_WARN_ON_ONCE(list_empty(&mm->lru_gen.list)); + + lru_gen_del_mm(mm); diff --git a/target/linux/generic/backport-5.15/020-v6.3-19-mm-add-vma_has_recency.patch b/target/linux/generic/backport-5.15/020-v6.3-19-mm-add-vma_has_recency.patch new file mode 100644 index 0000000000..0e9ed9a7eb --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.3-19-mm-add-vma_has_recency.patch @@ -0,0 +1,196 @@ +From 6c7f552a48b49a8612786a28a2239fbc24fac289 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Fri, 30 Dec 2022 14:52:51 -0700 +Subject: [PATCH 19/29] mm: add vma_has_recency() + +Add vma_has_recency() to indicate whether a VMA may exhibit temporal +locality that the LRU algorithm relies on. + +This function returns false for VMAs marked by VM_SEQ_READ or +VM_RAND_READ. While the former flag indicates linear access, i.e., a +special case of spatial locality, both flags indicate a lack of temporal +locality, i.e., the reuse of an area within a relatively small duration. + +"Recency" is chosen over "locality" to avoid confusion between temporal +and spatial localities. + +Before this patch, the active/inactive LRU only ignored the accessed bit +from VMAs marked by VM_SEQ_READ. After this patch, the active/inactive +LRU and MGLRU share the same logic: they both ignore the accessed bit if +vma_has_recency() returns false. + +For the active/inactive LRU, the following fio test showed a [6, 8]% +increase in IOPS when randomly accessing mapped files under memory +pressure. + + kb=$(awk '/MemTotal/ { print $2 }' /proc/meminfo) + kb=$((kb - 8*1024*1024)) + + modprobe brd rd_nr=1 rd_size=$kb + dd if=/dev/zero of=/dev/ram0 bs=1M + + mkfs.ext4 /dev/ram0 + mount /dev/ram0 /mnt/ + swapoff -a + + fio --name=test --directory=/mnt/ --ioengine=mmap --numjobs=8 \ + --size=8G --rw=randrw --time_based --runtime=10m \ + --group_reporting + +The discussion that led to this patch is here [1]. Additional test +results are available in that thread. + +[1] https://lore.kernel.org/r/Y31s%2FK8T85jh05wH@google.com/ + +Link: https://lkml.kernel.org/r/20221230215252.2628425-1-yuzhao@google.com +Signed-off-by: Yu Zhao +Cc: Alexander Viro +Cc: Andrea Righi +Cc: Johannes Weiner +Cc: Michael Larabel +Signed-off-by: Andrew Morton +--- + include/linux/mm_inline.h | 9 +++++++++ + mm/memory.c | 8 ++++---- + mm/rmap.c | 42 +++++++++++++++++---------------------- + mm/vmscan.c | 5 ++++- + 4 files changed, 35 insertions(+), 29 deletions(-) + +--- a/include/linux/mm_inline.h ++++ b/include/linux/mm_inline.h +@@ -333,4 +333,13 @@ static __always_inline void del_page_fro + update_lru_size(lruvec, page_lru(page), page_zonenum(page), + -thp_nr_pages(page)); + } ++ ++static inline bool vma_has_recency(struct vm_area_struct *vma) ++{ ++ if (vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ)) ++ return false; ++ ++ return true; ++} ++ + #endif +--- a/mm/memory.c ++++ b/mm/memory.c +@@ -41,6 +41,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -1353,8 +1354,7 @@ again: + force_flush = 1; + set_page_dirty(page); + } +- if (pte_young(ptent) && +- likely(!(vma->vm_flags & VM_SEQ_READ))) ++ if (pte_young(ptent) && likely(vma_has_recency(vma))) + mark_page_accessed(page); + } + rss[mm_counter(page)]--; +@@ -4808,8 +4808,8 @@ static inline void mm_account_fault(stru + #ifdef CONFIG_LRU_GEN + static void lru_gen_enter_fault(struct vm_area_struct *vma) + { +- /* the LRU algorithm doesn't apply to sequential or random reads */ +- current->in_lru_fault = !(vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ)); ++ /* the LRU algorithm only applies to accesses with recency */ ++ current->in_lru_fault = vma_has_recency(vma); + } + + static void lru_gen_exit_fault(void) +--- a/mm/rmap.c ++++ b/mm/rmap.c +@@ -794,25 +794,14 @@ static bool page_referenced_one(struct p + } + + if (pvmw.pte) { +- if (lru_gen_enabled() && pte_young(*pvmw.pte) && +- !(vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ))) { ++ if (lru_gen_enabled() && pte_young(*pvmw.pte)) { + lru_gen_look_around(&pvmw); + referenced++; + } + + if (ptep_clear_flush_young_notify(vma, address, +- pvmw.pte)) { +- /* +- * Don't treat a reference through +- * a sequentially read mapping as such. +- * If the page has been used in another mapping, +- * we will catch it; if this other mapping is +- * already gone, the unmap path will have set +- * PG_referenced or activated the page. +- */ +- if (likely(!(vma->vm_flags & VM_SEQ_READ))) +- referenced++; +- } ++ pvmw.pte)) ++ referenced++; + } else if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) { + if (pmdp_clear_flush_young_notify(vma, address, + pvmw.pmd)) +@@ -846,7 +835,20 @@ static bool invalid_page_referenced_vma( + struct page_referenced_arg *pra = arg; + struct mem_cgroup *memcg = pra->memcg; + +- if (!mm_match_cgroup(vma->vm_mm, memcg)) ++ /* ++ * Ignore references from this mapping if it has no recency. If the ++ * page has been used in another mapping, we will catch it; if this ++ * other mapping is already gone, the unmap path will have set the ++ * referenced flag or activated the page in zap_pte_range(). ++ */ ++ if (!vma_has_recency(vma)) ++ return true; ++ ++ /* ++ * If we are reclaiming on behalf of a cgroup, skip counting on behalf ++ * of references from different cgroups. ++ */ ++ if (memcg && !mm_match_cgroup(vma->vm_mm, memcg)) + return true; + + return false; +@@ -876,6 +878,7 @@ int page_referenced(struct page *page, + .rmap_one = page_referenced_one, + .arg = (void *)&pra, + .anon_lock = page_lock_anon_vma_read, ++ .invalid_vma = invalid_page_referenced_vma, + }; + + *vm_flags = 0; +@@ -891,15 +894,6 @@ int page_referenced(struct page *page, + return 1; + } + +- /* +- * If we are reclaiming on behalf of a cgroup, skip +- * counting on behalf of references from different +- * cgroups +- */ +- if (memcg) { +- rwc.invalid_vma = invalid_page_referenced_vma; +- } +- + rmap_walk(page, &rwc); + *vm_flags = pra.vm_flags; + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -3486,7 +3486,10 @@ static int should_skip_vma(unsigned long + if (is_vm_hugetlb_page(vma)) + return true; + +- if (vma->vm_flags & (VM_LOCKED | VM_SPECIAL | VM_SEQ_READ | VM_RAND_READ)) ++ if (!vma_has_recency(vma)) ++ return true; ++ ++ if (vma->vm_flags & (VM_LOCKED | VM_SPECIAL)) + return true; + + if (vma == get_gate_vma(vma->vm_mm)) diff --git a/target/linux/generic/backport-5.15/020-v6.3-20-mm-support-POSIX_FADV_NOREUSE.patch b/target/linux/generic/backport-5.15/020-v6.3-20-mm-support-POSIX_FADV_NOREUSE.patch new file mode 100644 index 0000000000..3bb075bf36 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.3-20-mm-support-POSIX_FADV_NOREUSE.patch @@ -0,0 +1,125 @@ +From 686c3d4f71de9e0e7a27f03a5617a712385f90cd Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Fri, 30 Dec 2022 14:52:52 -0700 +Subject: [PATCH 20/29] mm: support POSIX_FADV_NOREUSE + +This patch adds POSIX_FADV_NOREUSE to vma_has_recency() so that the LRU +algorithm can ignore access to mapped files marked by this flag. + +The advantages of POSIX_FADV_NOREUSE are: +1. Unlike MADV_SEQUENTIAL and MADV_RANDOM, it does not alter the + default readahead behavior. +2. Unlike MADV_SEQUENTIAL and MADV_RANDOM, it does not split VMAs and + therefore does not take mmap_lock. +3. Unlike MADV_COLD, setting it has a negligible cost, regardless of + how many pages it affects. + +Its limitations are: +1. Like POSIX_FADV_RANDOM and POSIX_FADV_SEQUENTIAL, it currently does + not support range. IOW, its scope is the entire file. +2. It currently does not ignore access through file descriptors. + Specifically, for the active/inactive LRU, given a file page shared + by two users and one of them having set POSIX_FADV_NOREUSE on the + file, this page will be activated upon the second user accessing + it. This corner case can be covered by checking POSIX_FADV_NOREUSE + before calling mark_page_accessed() on the read path. But it is + considered not worth the effort. + +There have been a few attempts to support POSIX_FADV_NOREUSE, e.g., [1]. +This time the goal is to fill a niche: a few desktop applications, e.g., +large file transferring and video encoding/decoding, want fast file +streaming with mmap() rather than direct IO. Among those applications, an +SVT-AV1 regression was reported when running with MGLRU [2]. The +following test can reproduce that regression. + + kb=$(awk '/MemTotal/ { print $2 }' /proc/meminfo) + kb=$((kb - 8*1024*1024)) + + modprobe brd rd_nr=1 rd_size=$kb + dd if=/dev/zero of=/dev/ram0 bs=1M + + mkfs.ext4 /dev/ram0 + mount /dev/ram0 /mnt/ + swapoff -a + + fallocate -l 8G /mnt/swapfile + mkswap /mnt/swapfile + swapon /mnt/swapfile + + wget http://ultravideo.cs.tut.fi/video/Bosphorus_3840x2160_120fps_420_8bit_YUV_Y4M.7z + 7z e -o/mnt/ Bosphorus_3840x2160_120fps_420_8bit_YUV_Y4M.7z + SvtAv1EncApp --preset 12 -w 3840 -h 2160 \ + -i /mnt/Bosphorus_3840x2160.y4m + +For MGLRU, the following change showed a [9-11]% increase in FPS, +which makes it on par with the active/inactive LRU. + + patch Source/App/EncApp/EbAppMain.c < #include + 35d35 + < #include /* _O_BINARY */ + 117a118 + > posix_fadvise(config->mmap.fd, 0, 0, POSIX_FADV_NOREUSE); + EOF + +[1] https://lore.kernel.org/r/1308923350-7932-1-git-send-email-andrea@betterlinux.com/ +[2] https://openbenchmarking.org/result/2209259-PTS-MGLRU8GB57 + +Link: https://lkml.kernel.org/r/20221230215252.2628425-2-yuzhao@google.com +Signed-off-by: Yu Zhao +Cc: Alexander Viro +Cc: Andrea Righi +Cc: Johannes Weiner +Cc: Michael Larabel +Signed-off-by: Andrew Morton +--- + include/linux/fs.h | 2 ++ + include/linux/mm_inline.h | 3 +++ + mm/fadvise.c | 5 ++++- + 3 files changed, 9 insertions(+), 1 deletion(-) + +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -167,6 +167,8 @@ typedef int (dio_iodone_t)(struct kiocb + /* File is stream-like */ + #define FMODE_STREAM ((__force fmode_t)0x200000) + ++#define FMODE_NOREUSE ((__force fmode_t)0x400000) ++ + /* File was opened by fanotify and shouldn't generate fanotify events */ + #define FMODE_NONOTIFY ((__force fmode_t)0x4000000) + +--- a/include/linux/mm_inline.h ++++ b/include/linux/mm_inline.h +@@ -339,6 +339,9 @@ static inline bool vma_has_recency(struc + if (vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ)) + return false; + ++ if (vma->vm_file && (vma->vm_file->f_mode & FMODE_NOREUSE)) ++ return false; ++ + return true; + } + +--- a/mm/fadvise.c ++++ b/mm/fadvise.c +@@ -80,7 +80,7 @@ int generic_fadvise(struct file *file, l + case POSIX_FADV_NORMAL: + file->f_ra.ra_pages = bdi->ra_pages; + spin_lock(&file->f_lock); +- file->f_mode &= ~FMODE_RANDOM; ++ file->f_mode &= ~(FMODE_RANDOM | FMODE_NOREUSE); + spin_unlock(&file->f_lock); + break; + case POSIX_FADV_RANDOM: +@@ -107,6 +107,9 @@ int generic_fadvise(struct file *file, l + force_page_cache_readahead(mapping, file, start_index, nrpages); + break; + case POSIX_FADV_NOREUSE: ++ spin_lock(&file->f_lock); ++ file->f_mode |= FMODE_NOREUSE; ++ spin_unlock(&file->f_lock); + break; + case POSIX_FADV_DONTNEED: + if (!inode_write_congested(mapping->host)) diff --git a/target/linux/generic/backport-5.15/020-v6.3-21-mm-multi-gen-LRU-rename-lru_gen_struct-to-lru_gen_pa.patch b/target/linux/generic/backport-5.15/020-v6.3-21-mm-multi-gen-LRU-rename-lru_gen_struct-to-lru_gen_pa.patch new file mode 100644 index 0000000000..4e09173681 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.3-21-mm-multi-gen-LRU-rename-lru_gen_struct-to-lru_gen_pa.patch @@ -0,0 +1,348 @@ +From 348fdbada9fb3f0bf1a53651be46319105af187f Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Wed, 21 Dec 2022 21:18:59 -0700 +Subject: [PATCH 21/29] mm: multi-gen LRU: rename lru_gen_struct to + lru_gen_page + +Patch series "mm: multi-gen LRU: memcg LRU", v3. + +Overview +======== + +An memcg LRU is a per-node LRU of memcgs. It is also an LRU of LRUs, +since each node and memcg combination has an LRU of pages (see +mem_cgroup_lruvec()). + +Its goal is to improve the scalability of global reclaim, which is +critical to system-wide memory overcommit in data centers. Note that +memcg reclaim is currently out of scope. + +Its memory bloat is a pointer to each lruvec and negligible to each +pglist_data. In terms of traversing memcgs during global reclaim, it +improves the best-case complexity from O(n) to O(1) and does not affect +the worst-case complexity O(n). Therefore, on average, it has a sublinear +complexity in contrast to the current linear complexity. + +The basic structure of an memcg LRU can be understood by an analogy to +the active/inactive LRU (of pages): +1. It has the young and the old (generations), i.e., the counterparts + to the active and the inactive; +2. The increment of max_seq triggers promotion, i.e., the counterpart + to activation; +3. Other events trigger similar operations, e.g., offlining an memcg + triggers demotion, i.e., the counterpart to deactivation. + +In terms of global reclaim, it has two distinct features: +1. Sharding, which allows each thread to start at a random memcg (in + the old generation) and improves parallelism; +2. Eventual fairness, which allows direct reclaim to bail out at will + and reduces latency without affecting fairness over some time. + +The commit message in patch 6 details the workflow: +https://lore.kernel.org/r/20221222041905.2431096-7-yuzhao@google.com/ + +The following is a simple test to quickly verify its effectiveness. + + Test design: + 1. Create multiple memcgs. + 2. Each memcg contains a job (fio). + 3. All jobs access the same amount of memory randomly. + 4. The system does not experience global memory pressure. + 5. Periodically write to the root memory.reclaim. + + Desired outcome: + 1. All memcgs have similar pgsteal counts, i.e., stddev(pgsteal) + over mean(pgsteal) is close to 0%. + 2. The total pgsteal is close to the total requested through + memory.reclaim, i.e., sum(pgsteal) over sum(requested) is close + to 100%. + + Actual outcome [1]: + MGLRU off MGLRU on + stddev(pgsteal) / mean(pgsteal) 75% 20% + sum(pgsteal) / sum(requested) 425% 95% + + #################################################################### + MEMCGS=128 + + for ((memcg = 0; memcg < $MEMCGS; memcg++)); do + mkdir /sys/fs/cgroup/memcg$memcg + done + + start() { + echo $BASHPID > /sys/fs/cgroup/memcg$memcg/cgroup.procs + + fio -name=memcg$memcg --numjobs=1 --ioengine=mmap \ + --filename=/dev/zero --size=1920M --rw=randrw \ + --rate=64m,64m --random_distribution=random \ + --fadvise_hint=0 --time_based --runtime=10h \ + --group_reporting --minimal + } + + for ((memcg = 0; memcg < $MEMCGS; memcg++)); do + start & + done + + sleep 600 + + for ((i = 0; i < 600; i++)); do + echo 256m >/sys/fs/cgroup/memory.reclaim + sleep 6 + done + + for ((memcg = 0; memcg < $MEMCGS; memcg++)); do + grep "pgsteal " /sys/fs/cgroup/memcg$memcg/memory.stat + done + #################################################################### + +[1]: This was obtained from running the above script (touches less + than 256GB memory) on an EPYC 7B13 with 512GB DRAM for over an + hour. + +This patch (of 8): + +The new name lru_gen_page will be more distinct from the coming +lru_gen_memcg. + +Link: https://lkml.kernel.org/r/20221222041905.2431096-1-yuzhao@google.com +Link: https://lkml.kernel.org/r/20221222041905.2431096-2-yuzhao@google.com +Signed-off-by: Yu Zhao +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Roman Gushchin +Cc: Suren Baghdasaryan +Signed-off-by: Andrew Morton +--- + include/linux/mm_inline.h | 4 ++-- + include/linux/mmzone.h | 6 +++--- + mm/vmscan.c | 34 +++++++++++++++++----------------- + mm/workingset.c | 4 ++-- + 4 files changed, 24 insertions(+), 24 deletions(-) + +--- a/include/linux/mm_inline.h ++++ b/include/linux/mm_inline.h +@@ -168,7 +168,7 @@ static inline void lru_gen_update_size(s + int zone = page_zonenum(page); + int delta = thp_nr_pages(page); + enum lru_list lru = type * LRU_INACTIVE_FILE; +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + + VM_WARN_ON_ONCE(old_gen != -1 && old_gen >= MAX_NR_GENS); + VM_WARN_ON_ONCE(new_gen != -1 && new_gen >= MAX_NR_GENS); +@@ -214,7 +214,7 @@ static inline bool lru_gen_add_page(stru + int gen = page_lru_gen(page); + int type = page_is_file_lru(page); + int zone = page_zonenum(page); +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + + VM_WARN_ON_ONCE_PAGE(gen != -1, page); + +--- a/include/linux/mmzone.h ++++ b/include/linux/mmzone.h +@@ -394,7 +394,7 @@ enum { + * The number of pages in each generation is eventually consistent and therefore + * can be transiently negative when reset_batch_size() is pending. + */ +-struct lru_gen_struct { ++struct lru_gen_page { + /* the aging increments the youngest generation number */ + unsigned long max_seq; + /* the eviction increments the oldest generation numbers */ +@@ -451,7 +451,7 @@ struct lru_gen_mm_state { + struct lru_gen_mm_walk { + /* the lruvec under reclaim */ + struct lruvec *lruvec; +- /* unstable max_seq from lru_gen_struct */ ++ /* unstable max_seq from lru_gen_page */ + unsigned long max_seq; + /* the next address within an mm to scan */ + unsigned long next_addr; +@@ -514,7 +514,7 @@ struct lruvec { + unsigned long flags; + #ifdef CONFIG_LRU_GEN + /* evictable pages divided into generations */ +- struct lru_gen_struct lrugen; ++ struct lru_gen_page lrugen; + /* to concurrently iterate lru_gen_mm_list */ + struct lru_gen_mm_state mm_state; + #endif +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -2910,7 +2910,7 @@ static int get_nr_gens(struct lruvec *lr + + static bool __maybe_unused seq_is_valid(struct lruvec *lruvec) + { +- /* see the comment on lru_gen_struct */ ++ /* see the comment on lru_gen_page */ + return get_nr_gens(lruvec, LRU_GEN_FILE) >= MIN_NR_GENS && + get_nr_gens(lruvec, LRU_GEN_FILE) <= get_nr_gens(lruvec, LRU_GEN_ANON) && + get_nr_gens(lruvec, LRU_GEN_ANON) <= MAX_NR_GENS; +@@ -3316,7 +3316,7 @@ struct ctrl_pos { + static void read_ctrl_pos(struct lruvec *lruvec, int type, int tier, int gain, + struct ctrl_pos *pos) + { +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + int hist = lru_hist_from_seq(lrugen->min_seq[type]); + + pos->refaulted = lrugen->avg_refaulted[type][tier] + +@@ -3331,7 +3331,7 @@ static void read_ctrl_pos(struct lruvec + static void reset_ctrl_pos(struct lruvec *lruvec, int type, bool carryover) + { + int hist, tier; +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + bool clear = carryover ? NR_HIST_GENS == 1 : NR_HIST_GENS > 1; + unsigned long seq = carryover ? lrugen->min_seq[type] : lrugen->max_seq + 1; + +@@ -3408,7 +3408,7 @@ static int page_update_gen(struct page * + static int page_inc_gen(struct lruvec *lruvec, struct page *page, bool reclaiming) + { + int type = page_is_file_lru(page); +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + int new_gen, old_gen = lru_gen_from_seq(lrugen->min_seq[type]); + unsigned long new_flags, old_flags = READ_ONCE(page->flags); + +@@ -3453,7 +3453,7 @@ static void update_batch_size(struct lru + static void reset_batch_size(struct lruvec *lruvec, struct lru_gen_mm_walk *walk) + { + int gen, type, zone; +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + + walk->batched = 0; + +@@ -3979,7 +3979,7 @@ static bool inc_min_seq(struct lruvec *l + { + int zone; + int remaining = MAX_LRU_BATCH; +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + int new_gen, old_gen = lru_gen_from_seq(lrugen->min_seq[type]); + + if (type == LRU_GEN_ANON && !can_swap) +@@ -4015,7 +4015,7 @@ static bool try_to_inc_min_seq(struct lr + { + int gen, type, zone; + bool success = false; +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + DEFINE_MIN_SEQ(lruvec); + + VM_WARN_ON_ONCE(!seq_is_valid(lruvec)); +@@ -4036,7 +4036,7 @@ next: + ; + } + +- /* see the comment on lru_gen_struct */ ++ /* see the comment on lru_gen_page */ + if (can_swap) { + min_seq[LRU_GEN_ANON] = min(min_seq[LRU_GEN_ANON], min_seq[LRU_GEN_FILE]); + min_seq[LRU_GEN_FILE] = max(min_seq[LRU_GEN_ANON], lrugen->min_seq[LRU_GEN_FILE]); +@@ -4058,7 +4058,7 @@ static void inc_max_seq(struct lruvec *l + { + int prev, next; + int type, zone; +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + + spin_lock_irq(&lruvec->lru_lock); + +@@ -4116,7 +4116,7 @@ static bool try_to_inc_max_seq(struct lr + bool success; + struct lru_gen_mm_walk *walk; + struct mm_struct *mm = NULL; +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + + VM_WARN_ON_ONCE(max_seq > READ_ONCE(lrugen->max_seq)); + +@@ -4181,7 +4181,7 @@ static bool should_run_aging(struct lruv + unsigned long old = 0; + unsigned long young = 0; + unsigned long total = 0; +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + struct mem_cgroup *memcg = lruvec_memcg(lruvec); + + for (type = !can_swap; type < ANON_AND_FILE; type++) { +@@ -4466,7 +4466,7 @@ static bool sort_page(struct lruvec *lru + int delta = thp_nr_pages(page); + int refs = page_lru_refs(page); + int tier = lru_tier_from_refs(refs); +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + + VM_WARN_ON_ONCE_PAGE(gen >= MAX_NR_GENS, page); + +@@ -4566,7 +4566,7 @@ static int scan_pages(struct lruvec *lru + int scanned = 0; + int isolated = 0; + int remaining = MAX_LRU_BATCH; +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + struct mem_cgroup *memcg = lruvec_memcg(lruvec); + + VM_WARN_ON_ONCE(!list_empty(list)); +@@ -4967,7 +4967,7 @@ done: + + static bool __maybe_unused state_is_valid(struct lruvec *lruvec) + { +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + + if (lrugen->enabled) { + enum lru_list lru; +@@ -5247,7 +5247,7 @@ static void lru_gen_seq_show_full(struct + int i; + int type, tier; + int hist = lru_hist_from_seq(seq); +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + + for (tier = 0; tier < MAX_NR_TIERS; tier++) { + seq_printf(m, " %10d", tier); +@@ -5296,7 +5296,7 @@ static int lru_gen_seq_show(struct seq_f + unsigned long seq; + bool full = !debugfs_real_fops(m->file)->write; + struct lruvec *lruvec = v; +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + int nid = lruvec_pgdat(lruvec)->node_id; + struct mem_cgroup *memcg = lruvec_memcg(lruvec); + DEFINE_MAX_SEQ(lruvec); +@@ -5549,7 +5549,7 @@ void lru_gen_init_lruvec(struct lruvec * + { + int i; + int gen, type, zone; +- struct lru_gen_struct *lrugen = &lruvec->lrugen; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + + lrugen->max_seq = MIN_NR_GENS + 1; + lrugen->enabled = lru_gen_enabled(); +--- a/mm/workingset.c ++++ b/mm/workingset.c +@@ -223,7 +223,7 @@ static void *lru_gen_eviction(struct pag + unsigned long token; + unsigned long min_seq; + struct lruvec *lruvec; +- struct lru_gen_struct *lrugen; ++ struct lru_gen_page *lrugen; + int type = page_is_file_lru(page); + int delta = thp_nr_pages(page); + int refs = page_lru_refs(page); +@@ -252,7 +252,7 @@ static void lru_gen_refault(struct page + unsigned long token; + unsigned long min_seq; + struct lruvec *lruvec; +- struct lru_gen_struct *lrugen; ++ struct lru_gen_page *lrugen; + struct mem_cgroup *memcg; + struct pglist_data *pgdat; + int type = page_is_file_lru(page); diff --git a/target/linux/generic/backport-5.15/020-v6.3-22-mm-multi-gen-LRU-rename-lrugen-lists-to-lrugen-pages.patch b/target/linux/generic/backport-5.15/020-v6.3-22-mm-multi-gen-LRU-rename-lrugen-lists-to-lrugen-pages.patch new file mode 100644 index 0000000000..b548c1c8b3 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.3-22-mm-multi-gen-LRU-rename-lrugen-lists-to-lrugen-pages.patch @@ -0,0 +1,162 @@ +From afd37e73db04c7e6b47411120ac5f6a7eca51fec Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Wed, 21 Dec 2022 21:19:00 -0700 +Subject: [PATCH 22/29] mm: multi-gen LRU: rename lrugen->lists[] to + lrugen->pages[] + +lru_gen_page will be chained into per-node lists by the coming +lrugen->list. + +Link: https://lkml.kernel.org/r/20221222041905.2431096-3-yuzhao@google.com +Signed-off-by: Yu Zhao +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Roman Gushchin +Cc: Suren Baghdasaryan +Signed-off-by: Andrew Morton +--- + include/linux/mm_inline.h | 4 ++-- + include/linux/mmzone.h | 8 ++++---- + mm/vmscan.c | 20 ++++++++++---------- + 3 files changed, 16 insertions(+), 16 deletions(-) + +--- a/include/linux/mm_inline.h ++++ b/include/linux/mm_inline.h +@@ -246,9 +246,9 @@ static inline bool lru_gen_add_page(stru + lru_gen_update_size(lruvec, page, -1, gen); + /* for rotate_reclaimable_page() */ + if (reclaiming) +- list_add_tail(&page->lru, &lrugen->lists[gen][type][zone]); ++ list_add_tail(&page->lru, &lrugen->pages[gen][type][zone]); + else +- list_add(&page->lru, &lrugen->lists[gen][type][zone]); ++ list_add(&page->lru, &lrugen->pages[gen][type][zone]); + + return true; + } +--- a/include/linux/mmzone.h ++++ b/include/linux/mmzone.h +@@ -302,7 +302,7 @@ enum lruvec_flags { + * They form a sliding window of a variable size [MIN_NR_GENS, MAX_NR_GENS]. An + * offset within MAX_NR_GENS, i.e., gen, indexes the LRU list of the + * corresponding generation. The gen counter in page->flags stores gen+1 while +- * a page is on one of lrugen->lists[]. Otherwise it stores 0. ++ * a page is on one of lrugen->pages[]. Otherwise it stores 0. + * + * A page is added to the youngest generation on faulting. The aging needs to + * check the accessed bit at least twice before handing this page over to the +@@ -314,8 +314,8 @@ enum lruvec_flags { + * rest of generations, if they exist, are considered inactive. See + * lru_gen_is_active(). + * +- * PG_active is always cleared while a page is on one of lrugen->lists[] so that +- * the aging needs not to worry about it. And it's set again when a page ++ * PG_active is always cleared while a page is on one of lrugen->pages[] so ++ * that the aging needs not to worry about it. And it's set again when a page + * considered active is isolated for non-reclaiming purposes, e.g., migration. + * See lru_gen_add_page() and lru_gen_del_page(). + * +@@ -402,7 +402,7 @@ struct lru_gen_page { + /* the birth time of each generation in jiffies */ + unsigned long timestamps[MAX_NR_GENS]; + /* the multi-gen LRU lists, lazily sorted on eviction */ +- struct list_head lists[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; ++ struct list_head pages[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; + /* the multi-gen LRU sizes, eventually consistent */ + long nr_pages[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; + /* the exponential moving average of refaulted */ +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -3987,7 +3987,7 @@ static bool inc_min_seq(struct lruvec *l + + /* prevent cold/hot inversion if force_scan is true */ + for (zone = 0; zone < MAX_NR_ZONES; zone++) { +- struct list_head *head = &lrugen->lists[old_gen][type][zone]; ++ struct list_head *head = &lrugen->pages[old_gen][type][zone]; + + while (!list_empty(head)) { + struct page *page = lru_to_page(head); +@@ -3998,7 +3998,7 @@ static bool inc_min_seq(struct lruvec *l + VM_WARN_ON_ONCE_PAGE(page_zonenum(page) != zone, page); + + new_gen = page_inc_gen(lruvec, page, false); +- list_move_tail(&page->lru, &lrugen->lists[new_gen][type][zone]); ++ list_move_tail(&page->lru, &lrugen->pages[new_gen][type][zone]); + + if (!--remaining) + return false; +@@ -4026,7 +4026,7 @@ static bool try_to_inc_min_seq(struct lr + gen = lru_gen_from_seq(min_seq[type]); + + for (zone = 0; zone < MAX_NR_ZONES; zone++) { +- if (!list_empty(&lrugen->lists[gen][type][zone])) ++ if (!list_empty(&lrugen->pages[gen][type][zone])) + goto next; + } + +@@ -4491,7 +4491,7 @@ static bool sort_page(struct lruvec *lru + + /* promoted */ + if (gen != lru_gen_from_seq(lrugen->min_seq[type])) { +- list_move(&page->lru, &lrugen->lists[gen][type][zone]); ++ list_move(&page->lru, &lrugen->pages[gen][type][zone]); + return true; + } + +@@ -4500,7 +4500,7 @@ static bool sort_page(struct lruvec *lru + int hist = lru_hist_from_seq(lrugen->min_seq[type]); + + gen = page_inc_gen(lruvec, page, false); +- list_move_tail(&page->lru, &lrugen->lists[gen][type][zone]); ++ list_move_tail(&page->lru, &lrugen->pages[gen][type][zone]); + + WRITE_ONCE(lrugen->protected[hist][type][tier - 1], + lrugen->protected[hist][type][tier - 1] + delta); +@@ -4512,7 +4512,7 @@ static bool sort_page(struct lruvec *lru + if (PageLocked(page) || PageWriteback(page) || + (type == LRU_GEN_FILE && PageDirty(page))) { + gen = page_inc_gen(lruvec, page, true); +- list_move(&page->lru, &lrugen->lists[gen][type][zone]); ++ list_move(&page->lru, &lrugen->pages[gen][type][zone]); + return true; + } + +@@ -4579,7 +4579,7 @@ static int scan_pages(struct lruvec *lru + for (zone = sc->reclaim_idx; zone >= 0; zone--) { + LIST_HEAD(moved); + int skipped = 0; +- struct list_head *head = &lrugen->lists[gen][type][zone]; ++ struct list_head *head = &lrugen->pages[gen][type][zone]; + + while (!list_empty(head)) { + struct page *page = lru_to_page(head); +@@ -4980,7 +4980,7 @@ static bool __maybe_unused state_is_vali + int gen, type, zone; + + for_each_gen_type_zone(gen, type, zone) { +- if (!list_empty(&lrugen->lists[gen][type][zone])) ++ if (!list_empty(&lrugen->pages[gen][type][zone])) + return false; + } + } +@@ -5025,7 +5025,7 @@ static bool drain_evictable(struct lruve + int remaining = MAX_LRU_BATCH; + + for_each_gen_type_zone(gen, type, zone) { +- struct list_head *head = &lruvec->lrugen.lists[gen][type][zone]; ++ struct list_head *head = &lruvec->lrugen.pages[gen][type][zone]; + + while (!list_empty(head)) { + bool success; +@@ -5558,7 +5558,7 @@ void lru_gen_init_lruvec(struct lruvec * + lrugen->timestamps[i] = jiffies; + + for_each_gen_type_zone(gen, type, zone) +- INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]); ++ INIT_LIST_HEAD(&lrugen->pages[gen][type][zone]); + + lruvec->mm_state.seq = MIN_NR_GENS; + init_waitqueue_head(&lruvec->mm_state.wait); diff --git a/target/linux/generic/backport-5.15/020-v6.3-23-mm-multi-gen-LRU-remove-eviction-fairness-safeguard.patch b/target/linux/generic/backport-5.15/020-v6.3-23-mm-multi-gen-LRU-remove-eviction-fairness-safeguard.patch new file mode 100644 index 0000000000..2bb6e12a5a --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.3-23-mm-multi-gen-LRU-remove-eviction-fairness-safeguard.patch @@ -0,0 +1,188 @@ +From ce45f1c4b32cf69b166f56ef5bc6c761e06ed4e5 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Wed, 21 Dec 2022 21:19:01 -0700 +Subject: [PATCH 23/29] mm: multi-gen LRU: remove eviction fairness safeguard + +Recall that the eviction consumes the oldest generation: first it +bucket-sorts pages whose gen counters were updated by the aging and +reclaims the rest; then it increments lrugen->min_seq. + +The current eviction fairness safeguard for global reclaim has a +dilemma: when there are multiple eligible memcgs, should it continue +or stop upon meeting the reclaim goal? If it continues, it overshoots +and increases direct reclaim latency; if it stops, it loses fairness +between memcgs it has taken memory away from and those it has yet to. + +With memcg LRU, the eviction, while ensuring eventual fairness, will +stop upon meeting its goal. Therefore the current eviction fairness +safeguard for global reclaim will not be needed. + +Note that memcg LRU only applies to global reclaim. For memcg reclaim, +the eviction will continue, even if it is overshooting. This becomes +unconditional due to code simplification. + +Link: https://lkml.kernel.org/r/20221222041905.2431096-4-yuzhao@google.com +Signed-off-by: Yu Zhao +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Roman Gushchin +Cc: Suren Baghdasaryan +Signed-off-by: Andrew Morton +--- + mm/vmscan.c | 82 +++++++++++++++-------------------------------------- + 1 file changed, 23 insertions(+), 59 deletions(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -443,6 +443,11 @@ static bool cgroup_reclaim(struct scan_c + return sc->target_mem_cgroup; + } + ++static bool global_reclaim(struct scan_control *sc) ++{ ++ return !sc->target_mem_cgroup || mem_cgroup_is_root(sc->target_mem_cgroup); ++} ++ + /** + * writeback_throttling_sane - is the usual dirty throttling mechanism available? + * @sc: scan_control in question +@@ -493,6 +498,11 @@ static bool cgroup_reclaim(struct scan_c + return false; + } + ++static bool global_reclaim(struct scan_control *sc) ++{ ++ return true; ++} ++ + static bool writeback_throttling_sane(struct scan_control *sc) + { + return true; +@@ -4722,8 +4732,7 @@ static int isolate_pages(struct lruvec * + return scanned; + } + +-static int evict_pages(struct lruvec *lruvec, struct scan_control *sc, int swappiness, +- bool *need_swapping) ++static int evict_pages(struct lruvec *lruvec, struct scan_control *sc, int swappiness) + { + int type; + int scanned; +@@ -4812,9 +4821,6 @@ retry: + goto retry; + } + +- if (need_swapping && type == LRU_GEN_ANON) +- *need_swapping = true; +- + return scanned; + } + +@@ -4853,68 +4859,26 @@ done: + return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0; + } + +-static bool should_abort_scan(struct lruvec *lruvec, unsigned long seq, +- struct scan_control *sc, bool need_swapping) ++static unsigned long get_nr_to_reclaim(struct scan_control *sc) + { +- int i; +- DEFINE_MAX_SEQ(lruvec); +- +- if (!current_is_kswapd()) { +- /* age each memcg once to ensure fairness */ +- if (max_seq - seq > 1) +- return true; +- +- /* over-swapping can increase allocation latency */ +- if (sc->nr_reclaimed >= sc->nr_to_reclaim && need_swapping) +- return true; +- +- /* give this thread a chance to exit and free its memory */ +- if (fatal_signal_pending(current)) { +- sc->nr_reclaimed += MIN_LRU_BATCH; +- return true; +- } +- +- if (cgroup_reclaim(sc)) +- return false; +- } else if (sc->nr_reclaimed - sc->last_reclaimed < sc->nr_to_reclaim) +- return false; +- +- /* keep scanning at low priorities to ensure fairness */ +- if (sc->priority > DEF_PRIORITY - 2) +- return false; +- +- /* +- * A minimum amount of work was done under global memory pressure. For +- * kswapd, it may be overshooting. For direct reclaim, the target isn't +- * met, and yet the allocation may still succeed, since kswapd may have +- * caught up. In either case, it's better to stop now, and restart if +- * necessary. +- */ +- for (i = 0; i <= sc->reclaim_idx; i++) { +- unsigned long wmark; +- struct zone *zone = lruvec_pgdat(lruvec)->node_zones + i; +- +- if (!managed_zone(zone)) +- continue; +- +- wmark = current_is_kswapd() ? high_wmark_pages(zone) : low_wmark_pages(zone); +- if (wmark > zone_page_state(zone, NR_FREE_PAGES)) +- return false; +- } ++ /* don't abort memcg reclaim to ensure fairness */ ++ if (!global_reclaim(sc)) ++ return -1; + +- sc->nr_reclaimed += MIN_LRU_BATCH; ++ /* discount the previous progress for kswapd */ ++ if (current_is_kswapd()) ++ return sc->nr_to_reclaim + sc->last_reclaimed; + +- return true; ++ return max(sc->nr_to_reclaim, compact_gap(sc->order)); + } + + static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) + { + struct blk_plug plug; + bool need_aging = false; +- bool need_swapping = false; + unsigned long scanned = 0; + unsigned long reclaimed = sc->nr_reclaimed; +- DEFINE_MAX_SEQ(lruvec); ++ unsigned long nr_to_reclaim = get_nr_to_reclaim(sc); + + lru_add_drain(); + +@@ -4938,7 +4902,7 @@ static void lru_gen_shrink_lruvec(struct + if (!nr_to_scan) + goto done; + +- delta = evict_pages(lruvec, sc, swappiness, &need_swapping); ++ delta = evict_pages(lruvec, sc, swappiness); + if (!delta) + goto done; + +@@ -4946,7 +4910,7 @@ static void lru_gen_shrink_lruvec(struct + if (scanned >= nr_to_scan) + break; + +- if (should_abort_scan(lruvec, max_seq, sc, need_swapping)) ++ if (sc->nr_reclaimed >= nr_to_reclaim) + break; + + cond_resched(); +@@ -5393,7 +5357,7 @@ static int run_eviction(struct lruvec *l + if (sc->nr_reclaimed >= nr_to_reclaim) + return 0; + +- if (!evict_pages(lruvec, sc, swappiness, NULL)) ++ if (!evict_pages(lruvec, sc, swappiness)) + return 0; + + cond_resched(); diff --git a/target/linux/generic/backport-5.15/020-v6.3-24-mm-multi-gen-LRU-remove-aging-fairness-safeguard.patch b/target/linux/generic/backport-5.15/020-v6.3-24-mm-multi-gen-LRU-remove-aging-fairness-safeguard.patch new file mode 100644 index 0000000000..316217ed02 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.3-24-mm-multi-gen-LRU-remove-aging-fairness-safeguard.patch @@ -0,0 +1,287 @@ +From e20b7386fccc18c791796eb1dc1a91eee3ccf801 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Wed, 21 Dec 2022 21:19:02 -0700 +Subject: [PATCH 24/29] mm: multi-gen LRU: remove aging fairness safeguard + +Recall that the aging produces the youngest generation: first it scans +for accessed pages and updates their gen counters; then it increments +lrugen->max_seq. + +The current aging fairness safeguard for kswapd uses two passes to +ensure the fairness to multiple eligible memcgs. On the first pass, +which is shared with the eviction, it checks whether all eligible +memcgs are low on cold pages. If so, it requires a second pass, on +which it ages all those memcgs at the same time. + +With memcg LRU, the aging, while ensuring eventual fairness, will run +when necessary. Therefore the current aging fairness safeguard for +kswapd will not be needed. + +Note that memcg LRU only applies to global reclaim. For memcg reclaim, +the aging can be unfair to different memcgs, i.e., their +lrugen->max_seq can be incremented at different paces. + +Link: https://lkml.kernel.org/r/20221222041905.2431096-5-yuzhao@google.com +Signed-off-by: Yu Zhao +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Roman Gushchin +Cc: Suren Baghdasaryan +Signed-off-by: Andrew Morton +--- + mm/vmscan.c | 126 ++++++++++++++++++++++++---------------------------- + 1 file changed, 59 insertions(+), 67 deletions(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -131,7 +131,6 @@ struct scan_control { + + #ifdef CONFIG_LRU_GEN + /* help kswapd make better choices among multiple memcgs */ +- unsigned int memcgs_need_aging:1; + unsigned long last_reclaimed; + #endif + +@@ -4184,7 +4183,7 @@ done: + return true; + } + +-static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq, unsigned long *min_seq, ++static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq, + struct scan_control *sc, bool can_swap, unsigned long *nr_to_scan) + { + int gen, type, zone; +@@ -4193,6 +4192,13 @@ static bool should_run_aging(struct lruv + unsigned long total = 0; + struct lru_gen_page *lrugen = &lruvec->lrugen; + struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ DEFINE_MIN_SEQ(lruvec); ++ ++ /* whether this lruvec is completely out of cold pages */ ++ if (min_seq[!can_swap] + MIN_NR_GENS > max_seq) { ++ *nr_to_scan = 0; ++ return true; ++ } + + for (type = !can_swap; type < ANON_AND_FILE; type++) { + unsigned long seq; +@@ -4221,8 +4227,6 @@ static bool should_run_aging(struct lruv + * stalls when the number of generations reaches MIN_NR_GENS. Hence, the + * ideal number of generations is MIN_NR_GENS+1. + */ +- if (min_seq[!can_swap] + MIN_NR_GENS > max_seq) +- return true; + if (min_seq[!can_swap] + MIN_NR_GENS < max_seq) + return false; + +@@ -4241,40 +4245,54 @@ static bool should_run_aging(struct lruv + return false; + } + +-static bool age_lruvec(struct lruvec *lruvec, struct scan_control *sc, unsigned long min_ttl) ++static bool lruvec_is_sizable(struct lruvec *lruvec, struct scan_control *sc) + { +- bool need_aging; +- unsigned long nr_to_scan; +- int swappiness = get_swappiness(lruvec, sc); ++ int gen, type, zone; ++ unsigned long total = 0; ++ bool can_swap = get_swappiness(lruvec, sc); ++ struct lru_gen_page *lrugen = &lruvec->lrugen; + struct mem_cgroup *memcg = lruvec_memcg(lruvec); + DEFINE_MAX_SEQ(lruvec); + DEFINE_MIN_SEQ(lruvec); + +- VM_WARN_ON_ONCE(sc->memcg_low_reclaim); ++ for (type = !can_swap; type < ANON_AND_FILE; type++) { ++ unsigned long seq; + +- mem_cgroup_calculate_protection(NULL, memcg); ++ for (seq = min_seq[type]; seq <= max_seq; seq++) { ++ gen = lru_gen_from_seq(seq); + +- if (mem_cgroup_below_min(memcg)) +- return false; ++ for (zone = 0; zone < MAX_NR_ZONES; zone++) ++ total += max(READ_ONCE(lrugen->nr_pages[gen][type][zone]), 0L); ++ } ++ } + +- need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, swappiness, &nr_to_scan); ++ /* whether the size is big enough to be helpful */ ++ return mem_cgroup_online(memcg) ? (total >> sc->priority) : total; ++} + +- if (min_ttl) { +- int gen = lru_gen_from_seq(min_seq[LRU_GEN_FILE]); +- unsigned long birth = READ_ONCE(lruvec->lrugen.timestamps[gen]); ++static bool lruvec_is_reclaimable(struct lruvec *lruvec, struct scan_control *sc, ++ unsigned long min_ttl) ++{ ++ int gen; ++ unsigned long birth; ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ DEFINE_MIN_SEQ(lruvec); + +- if (time_is_after_jiffies(birth + min_ttl)) +- return false; ++ VM_WARN_ON_ONCE(sc->memcg_low_reclaim); + +- /* the size is likely too small to be helpful */ +- if (!nr_to_scan && sc->priority != DEF_PRIORITY) +- return false; +- } ++ /* see the comment on lru_gen_page */ ++ gen = lru_gen_from_seq(min_seq[LRU_GEN_FILE]); ++ birth = READ_ONCE(lruvec->lrugen.timestamps[gen]); + +- if (need_aging) +- try_to_inc_max_seq(lruvec, max_seq, sc, swappiness, false); ++ if (time_is_after_jiffies(birth + min_ttl)) ++ return false; + +- return true; ++ if (!lruvec_is_sizable(lruvec, sc)) ++ return false; ++ ++ mem_cgroup_calculate_protection(NULL, memcg); ++ ++ return !mem_cgroup_below_min(memcg); + } + + /* to protect the working set of the last N jiffies */ +@@ -4283,46 +4301,32 @@ static unsigned long lru_gen_min_ttl __r + static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc) + { + struct mem_cgroup *memcg; +- bool success = false; + unsigned long min_ttl = READ_ONCE(lru_gen_min_ttl); + + VM_WARN_ON_ONCE(!current_is_kswapd()); + + sc->last_reclaimed = sc->nr_reclaimed; + +- /* +- * To reduce the chance of going into the aging path, which can be +- * costly, optimistically skip it if the flag below was cleared in the +- * eviction path. This improves the overall performance when multiple +- * memcgs are available. +- */ +- if (!sc->memcgs_need_aging) { +- sc->memcgs_need_aging = true; ++ /* check the order to exclude compaction-induced reclaim */ ++ if (!min_ttl || sc->order || sc->priority == DEF_PRIORITY) + return; +- } +- +- set_mm_walk(pgdat); + + memcg = mem_cgroup_iter(NULL, NULL, NULL); + do { + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat); + +- if (age_lruvec(lruvec, sc, min_ttl)) +- success = true; ++ if (lruvec_is_reclaimable(lruvec, sc, min_ttl)) { ++ mem_cgroup_iter_break(NULL, memcg); ++ return; ++ } + + cond_resched(); + } while ((memcg = mem_cgroup_iter(NULL, memcg, NULL))); + +- clear_mm_walk(); +- +- /* check the order to exclude compaction-induced reclaim */ +- if (success || !min_ttl || sc->order) +- return; +- + /* + * The main goal is to OOM kill if every generation from all memcgs is + * younger than min_ttl. However, another possibility is all memcgs are +- * either below min or empty. ++ * either too small or below min. + */ + if (mutex_trylock(&oom_lock)) { + struct oom_control oc = { +@@ -4830,33 +4834,27 @@ retry: + * reclaim. + */ + static unsigned long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc, +- bool can_swap, bool *need_aging) ++ bool can_swap) + { + unsigned long nr_to_scan; + struct mem_cgroup *memcg = lruvec_memcg(lruvec); + DEFINE_MAX_SEQ(lruvec); +- DEFINE_MIN_SEQ(lruvec); + + if (mem_cgroup_below_min(memcg) || + (mem_cgroup_below_low(memcg) && !sc->memcg_low_reclaim)) + return 0; + +- *need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, can_swap, &nr_to_scan); +- if (!*need_aging) ++ if (!should_run_aging(lruvec, max_seq, sc, can_swap, &nr_to_scan)) + return nr_to_scan; + + /* skip the aging path at the default priority */ + if (sc->priority == DEF_PRIORITY) +- goto done; ++ return nr_to_scan; + +- /* leave the work to lru_gen_age_node() */ +- if (current_is_kswapd()) +- return 0; ++ try_to_inc_max_seq(lruvec, max_seq, sc, can_swap, false); + +- if (try_to_inc_max_seq(lruvec, max_seq, sc, can_swap, false)) +- return nr_to_scan; +-done: +- return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0; ++ /* skip this lruvec as it's low on cold pages */ ++ return 0; + } + + static unsigned long get_nr_to_reclaim(struct scan_control *sc) +@@ -4875,9 +4873,7 @@ static unsigned long get_nr_to_reclaim(s + static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) + { + struct blk_plug plug; +- bool need_aging = false; + unsigned long scanned = 0; +- unsigned long reclaimed = sc->nr_reclaimed; + unsigned long nr_to_reclaim = get_nr_to_reclaim(sc); + + lru_add_drain(); +@@ -4898,13 +4894,13 @@ static void lru_gen_shrink_lruvec(struct + else + swappiness = 0; + +- nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness, &need_aging); ++ nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness); + if (!nr_to_scan) +- goto done; ++ break; + + delta = evict_pages(lruvec, sc, swappiness); + if (!delta) +- goto done; ++ break; + + scanned += delta; + if (scanned >= nr_to_scan) +@@ -4916,10 +4912,6 @@ static void lru_gen_shrink_lruvec(struct + cond_resched(); + } + +- /* see the comment in lru_gen_age_node() */ +- if (sc->nr_reclaimed - reclaimed >= MIN_LRU_BATCH && !need_aging) +- sc->memcgs_need_aging = false; +-done: + clear_mm_walk(); + + blk_finish_plug(&plug); diff --git a/target/linux/generic/backport-5.15/020-v6.3-25-mm-multi-gen-LRU-shuffle-should_run_aging.patch b/target/linux/generic/backport-5.15/020-v6.3-25-mm-multi-gen-LRU-shuffle-should_run_aging.patch new file mode 100644 index 0000000000..391ee6e67c --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.3-25-mm-multi-gen-LRU-shuffle-should_run_aging.patch @@ -0,0 +1,161 @@ +From 107d54931df3c28d81648122e219bf0034ef4e99 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Wed, 21 Dec 2022 21:19:03 -0700 +Subject: [PATCH 25/29] mm: multi-gen LRU: shuffle should_run_aging() + +Move should_run_aging() next to its only caller left. + +Link: https://lkml.kernel.org/r/20221222041905.2431096-6-yuzhao@google.com +Signed-off-by: Yu Zhao +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Roman Gushchin +Cc: Suren Baghdasaryan +Signed-off-by: Andrew Morton +--- + mm/vmscan.c | 124 ++++++++++++++++++++++++++-------------------------- + 1 file changed, 62 insertions(+), 62 deletions(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -4183,68 +4183,6 @@ done: + return true; + } + +-static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq, +- struct scan_control *sc, bool can_swap, unsigned long *nr_to_scan) +-{ +- int gen, type, zone; +- unsigned long old = 0; +- unsigned long young = 0; +- unsigned long total = 0; +- struct lru_gen_page *lrugen = &lruvec->lrugen; +- struct mem_cgroup *memcg = lruvec_memcg(lruvec); +- DEFINE_MIN_SEQ(lruvec); +- +- /* whether this lruvec is completely out of cold pages */ +- if (min_seq[!can_swap] + MIN_NR_GENS > max_seq) { +- *nr_to_scan = 0; +- return true; +- } +- +- for (type = !can_swap; type < ANON_AND_FILE; type++) { +- unsigned long seq; +- +- for (seq = min_seq[type]; seq <= max_seq; seq++) { +- unsigned long size = 0; +- +- gen = lru_gen_from_seq(seq); +- +- for (zone = 0; zone < MAX_NR_ZONES; zone++) +- size += max(READ_ONCE(lrugen->nr_pages[gen][type][zone]), 0L); +- +- total += size; +- if (seq == max_seq) +- young += size; +- else if (seq + MIN_NR_GENS == max_seq) +- old += size; +- } +- } +- +- /* try to scrape all its memory if this memcg was deleted */ +- *nr_to_scan = mem_cgroup_online(memcg) ? (total >> sc->priority) : total; +- +- /* +- * The aging tries to be lazy to reduce the overhead, while the eviction +- * stalls when the number of generations reaches MIN_NR_GENS. Hence, the +- * ideal number of generations is MIN_NR_GENS+1. +- */ +- if (min_seq[!can_swap] + MIN_NR_GENS < max_seq) +- return false; +- +- /* +- * It's also ideal to spread pages out evenly, i.e., 1/(MIN_NR_GENS+1) +- * of the total number of pages for each generation. A reasonable range +- * for this average portion is [1/MIN_NR_GENS, 1/(MIN_NR_GENS+2)]. The +- * aging cares about the upper bound of hot pages, while the eviction +- * cares about the lower bound of cold pages. +- */ +- if (young * MIN_NR_GENS > total) +- return true; +- if (old * (MIN_NR_GENS + 2) < total) +- return true; +- +- return false; +-} +- + static bool lruvec_is_sizable(struct lruvec *lruvec, struct scan_control *sc) + { + int gen, type, zone; +@@ -4828,6 +4766,68 @@ retry: + return scanned; + } + ++static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq, ++ struct scan_control *sc, bool can_swap, unsigned long *nr_to_scan) ++{ ++ int gen, type, zone; ++ unsigned long old = 0; ++ unsigned long young = 0; ++ unsigned long total = 0; ++ struct lru_gen_page *lrugen = &lruvec->lrugen; ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ DEFINE_MIN_SEQ(lruvec); ++ ++ /* whether this lruvec is completely out of cold pages */ ++ if (min_seq[!can_swap] + MIN_NR_GENS > max_seq) { ++ *nr_to_scan = 0; ++ return true; ++ } ++ ++ for (type = !can_swap; type < ANON_AND_FILE; type++) { ++ unsigned long seq; ++ ++ for (seq = min_seq[type]; seq <= max_seq; seq++) { ++ unsigned long size = 0; ++ ++ gen = lru_gen_from_seq(seq); ++ ++ for (zone = 0; zone < MAX_NR_ZONES; zone++) ++ size += max(READ_ONCE(lrugen->nr_pages[gen][type][zone]), 0L); ++ ++ total += size; ++ if (seq == max_seq) ++ young += size; ++ else if (seq + MIN_NR_GENS == max_seq) ++ old += size; ++ } ++ } ++ ++ /* try to scrape all its memory if this memcg was deleted */ ++ *nr_to_scan = mem_cgroup_online(memcg) ? (total >> sc->priority) : total; ++ ++ /* ++ * The aging tries to be lazy to reduce the overhead, while the eviction ++ * stalls when the number of generations reaches MIN_NR_GENS. Hence, the ++ * ideal number of generations is MIN_NR_GENS+1. ++ */ ++ if (min_seq[!can_swap] + MIN_NR_GENS < max_seq) ++ return false; ++ ++ /* ++ * It's also ideal to spread pages out evenly, i.e., 1/(MIN_NR_GENS+1) ++ * of the total number of pages for each generation. A reasonable range ++ * for this average portion is [1/MIN_NR_GENS, 1/(MIN_NR_GENS+2)]. The ++ * aging cares about the upper bound of hot pages, while the eviction ++ * cares about the lower bound of cold pages. ++ */ ++ if (young * MIN_NR_GENS > total) ++ return true; ++ if (old * (MIN_NR_GENS + 2) < total) ++ return true; ++ ++ return false; ++} ++ + /* + * For future optimizations: + * 1. Defer try_to_inc_max_seq() to workqueues to reduce latency for memcg diff --git a/target/linux/generic/backport-5.15/020-v6.3-26-mm-multi-gen-LRU-per-node-lru_gen_page-lists.patch b/target/linux/generic/backport-5.15/020-v6.3-26-mm-multi-gen-LRU-per-node-lru_gen_page-lists.patch new file mode 100644 index 0000000000..8cc9abd84f --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.3-26-mm-multi-gen-LRU-per-node-lru_gen_page-lists.patch @@ -0,0 +1,868 @@ +From fa6363828d314e837c5f79e97ea5e8c0d2f7f062 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Wed, 21 Dec 2022 21:19:04 -0700 +Subject: [PATCH 26/29] mm: multi-gen LRU: per-node lru_gen_page lists + +For each node, memcgs are divided into two generations: the old and +the young. For each generation, memcgs are randomly sharded into +multiple bins to improve scalability. For each bin, an RCU hlist_nulls +is virtually divided into three segments: the head, the tail and the +default. + +An onlining memcg is added to the tail of a random bin in the old +generation. The eviction starts at the head of a random bin in the old +generation. The per-node memcg generation counter, whose reminder (mod +2) indexes the old generation, is incremented when all its bins become +empty. + +There are four operations: +1. MEMCG_LRU_HEAD, which moves an memcg to the head of a random bin in + its current generation (old or young) and updates its "seg" to + "head"; +2. MEMCG_LRU_TAIL, which moves an memcg to the tail of a random bin in + its current generation (old or young) and updates its "seg" to + "tail"; +3. MEMCG_LRU_OLD, which moves an memcg to the head of a random bin in + the old generation, updates its "gen" to "old" and resets its "seg" + to "default"; +4. MEMCG_LRU_YOUNG, which moves an memcg to the tail of a random bin + in the young generation, updates its "gen" to "young" and resets + its "seg" to "default". + +The events that trigger the above operations are: +1. Exceeding the soft limit, which triggers MEMCG_LRU_HEAD; +2. The first attempt to reclaim an memcg below low, which triggers + MEMCG_LRU_TAIL; +3. The first attempt to reclaim an memcg below reclaimable size + threshold, which triggers MEMCG_LRU_TAIL; +4. The second attempt to reclaim an memcg below reclaimable size + threshold, which triggers MEMCG_LRU_YOUNG; +5. Attempting to reclaim an memcg below min, which triggers + MEMCG_LRU_YOUNG; +6. Finishing the aging on the eviction path, which triggers + MEMCG_LRU_YOUNG; +7. Offlining an memcg, which triggers MEMCG_LRU_OLD. + +Note that memcg LRU only applies to global reclaim, and the +round-robin incrementing of their max_seq counters ensures the +eventual fairness to all eligible memcgs. For memcg reclaim, it still +relies on mem_cgroup_iter(). + +Link: https://lkml.kernel.org/r/20221222041905.2431096-7-yuzhao@google.com +Signed-off-by: Yu Zhao +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Roman Gushchin +Cc: Suren Baghdasaryan +Signed-off-by: Andrew Morton +--- + include/linux/memcontrol.h | 10 + + include/linux/mm_inline.h | 17 ++ + include/linux/mmzone.h | 117 +++++++++++- + mm/memcontrol.c | 16 ++ + mm/page_alloc.c | 1 + + mm/vmscan.c | 373 +++++++++++++++++++++++++++++++++---- + 6 files changed, 499 insertions(+), 35 deletions(-) + +--- a/include/linux/memcontrol.h ++++ b/include/linux/memcontrol.h +@@ -823,6 +823,11 @@ static inline void obj_cgroup_put(struct + percpu_ref_put(&objcg->refcnt); + } + ++static inline bool mem_cgroup_tryget(struct mem_cgroup *memcg) ++{ ++ return !memcg || css_tryget(&memcg->css); ++} ++ + static inline void mem_cgroup_put(struct mem_cgroup *memcg) + { + if (memcg) +@@ -1288,6 +1293,11 @@ struct mem_cgroup *mem_cgroup_from_css(s + return NULL; + } + ++static inline bool mem_cgroup_tryget(struct mem_cgroup *memcg) ++{ ++ return true; ++} ++ + static inline void mem_cgroup_put(struct mem_cgroup *memcg) + { + } +--- a/include/linux/mm_inline.h ++++ b/include/linux/mm_inline.h +@@ -112,6 +112,18 @@ static inline bool lru_gen_in_fault(void + return current->in_lru_fault; + } + ++#ifdef CONFIG_MEMCG ++static inline int lru_gen_memcg_seg(struct lruvec *lruvec) ++{ ++ return READ_ONCE(lruvec->lrugen.seg); ++} ++#else ++static inline int lru_gen_memcg_seg(struct lruvec *lruvec) ++{ ++ return 0; ++} ++#endif ++ + static inline int lru_gen_from_seq(unsigned long seq) + { + return seq % MAX_NR_GENS; +@@ -287,6 +299,11 @@ static inline bool lru_gen_in_fault(void + return false; + } + ++static inline int lru_gen_memcg_seg(struct lruvec *lruvec) ++{ ++ return 0; ++} ++ + static inline bool lru_gen_add_page(struct lruvec *lruvec, struct page *page, bool reclaiming) + { + return false; +--- a/include/linux/mmzone.h ++++ b/include/linux/mmzone.h +@@ -7,6 +7,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -357,6 +358,15 @@ struct page_vma_mapped_walk; + #define LRU_GEN_MASK ((BIT(LRU_GEN_WIDTH) - 1) << LRU_GEN_PGOFF) + #define LRU_REFS_MASK ((BIT(LRU_REFS_WIDTH) - 1) << LRU_REFS_PGOFF) + ++/* see the comment on MEMCG_NR_GENS */ ++enum { ++ MEMCG_LRU_NOP, ++ MEMCG_LRU_HEAD, ++ MEMCG_LRU_TAIL, ++ MEMCG_LRU_OLD, ++ MEMCG_LRU_YOUNG, ++}; ++ + #ifdef CONFIG_LRU_GEN + + enum { +@@ -416,6 +426,14 @@ struct lru_gen_page { + atomic_long_t refaulted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS]; + /* whether the multi-gen LRU is enabled */ + bool enabled; ++#ifdef CONFIG_MEMCG ++ /* the memcg generation this lru_gen_page belongs to */ ++ u8 gen; ++ /* the list segment this lru_gen_page belongs to */ ++ u8 seg; ++ /* per-node lru_gen_page list for global reclaim */ ++ struct hlist_nulls_node list; ++#endif + }; + + enum { +@@ -469,12 +487,87 @@ void lru_gen_init_lruvec(struct lruvec * + void lru_gen_look_around(struct page_vma_mapped_walk *pvmw); + + #ifdef CONFIG_MEMCG ++ ++/* ++ * For each node, memcgs are divided into two generations: the old and the ++ * young. For each generation, memcgs are randomly sharded into multiple bins ++ * to improve scalability. For each bin, the hlist_nulls is virtually divided ++ * into three segments: the head, the tail and the default. ++ * ++ * An onlining memcg is added to the tail of a random bin in the old generation. ++ * The eviction starts at the head of a random bin in the old generation. The ++ * per-node memcg generation counter, whose reminder (mod MEMCG_NR_GENS) indexes ++ * the old generation, is incremented when all its bins become empty. ++ * ++ * There are four operations: ++ * 1. MEMCG_LRU_HEAD, which moves an memcg to the head of a random bin in its ++ * current generation (old or young) and updates its "seg" to "head"; ++ * 2. MEMCG_LRU_TAIL, which moves an memcg to the tail of a random bin in its ++ * current generation (old or young) and updates its "seg" to "tail"; ++ * 3. MEMCG_LRU_OLD, which moves an memcg to the head of a random bin in the old ++ * generation, updates its "gen" to "old" and resets its "seg" to "default"; ++ * 4. MEMCG_LRU_YOUNG, which moves an memcg to the tail of a random bin in the ++ * young generation, updates its "gen" to "young" and resets its "seg" to ++ * "default". ++ * ++ * The events that trigger the above operations are: ++ * 1. Exceeding the soft limit, which triggers MEMCG_LRU_HEAD; ++ * 2. The first attempt to reclaim an memcg below low, which triggers ++ * MEMCG_LRU_TAIL; ++ * 3. The first attempt to reclaim an memcg below reclaimable size threshold, ++ * which triggers MEMCG_LRU_TAIL; ++ * 4. The second attempt to reclaim an memcg below reclaimable size threshold, ++ * which triggers MEMCG_LRU_YOUNG; ++ * 5. Attempting to reclaim an memcg below min, which triggers MEMCG_LRU_YOUNG; ++ * 6. Finishing the aging on the eviction path, which triggers MEMCG_LRU_YOUNG; ++ * 7. Offlining an memcg, which triggers MEMCG_LRU_OLD. ++ * ++ * Note that memcg LRU only applies to global reclaim, and the round-robin ++ * incrementing of their max_seq counters ensures the eventual fairness to all ++ * eligible memcgs. For memcg reclaim, it still relies on mem_cgroup_iter(). ++ */ ++#define MEMCG_NR_GENS 2 ++#define MEMCG_NR_BINS 8 ++ ++struct lru_gen_memcg { ++ /* the per-node memcg generation counter */ ++ unsigned long seq; ++ /* each memcg has one lru_gen_page per node */ ++ unsigned long nr_memcgs[MEMCG_NR_GENS]; ++ /* per-node lru_gen_page list for global reclaim */ ++ struct hlist_nulls_head fifo[MEMCG_NR_GENS][MEMCG_NR_BINS]; ++ /* protects the above */ ++ spinlock_t lock; ++}; ++ ++void lru_gen_init_pgdat(struct pglist_data *pgdat); ++ + void lru_gen_init_memcg(struct mem_cgroup *memcg); + void lru_gen_exit_memcg(struct mem_cgroup *memcg); +-#endif ++void lru_gen_online_memcg(struct mem_cgroup *memcg); ++void lru_gen_offline_memcg(struct mem_cgroup *memcg); ++void lru_gen_release_memcg(struct mem_cgroup *memcg); ++void lru_gen_rotate_memcg(struct lruvec *lruvec, int op); ++ ++#else /* !CONFIG_MEMCG */ ++ ++#define MEMCG_NR_GENS 1 ++ ++struct lru_gen_memcg { ++}; ++ ++static inline void lru_gen_init_pgdat(struct pglist_data *pgdat) ++{ ++} ++ ++#endif /* CONFIG_MEMCG */ + + #else /* !CONFIG_LRU_GEN */ + ++static inline void lru_gen_init_pgdat(struct pglist_data *pgdat) ++{ ++} ++ + static inline void lru_gen_init_lruvec(struct lruvec *lruvec) + { + } +@@ -484,6 +577,7 @@ static inline void lru_gen_look_around(s + } + + #ifdef CONFIG_MEMCG ++ + static inline void lru_gen_init_memcg(struct mem_cgroup *memcg) + { + } +@@ -491,7 +585,24 @@ static inline void lru_gen_init_memcg(st + static inline void lru_gen_exit_memcg(struct mem_cgroup *memcg) + { + } +-#endif ++ ++static inline void lru_gen_online_memcg(struct mem_cgroup *memcg) ++{ ++} ++ ++static inline void lru_gen_offline_memcg(struct mem_cgroup *memcg) ++{ ++} ++ ++static inline void lru_gen_release_memcg(struct mem_cgroup *memcg) ++{ ++} ++ ++static inline void lru_gen_rotate_memcg(struct lruvec *lruvec, int op) ++{ ++} ++ ++#endif /* CONFIG_MEMCG */ + + #endif /* CONFIG_LRU_GEN */ + +@@ -1105,6 +1216,8 @@ typedef struct pglist_data { + #ifdef CONFIG_LRU_GEN + /* kswap mm walk data */ + struct lru_gen_mm_walk mm_walk; ++ /* lru_gen_page list */ ++ struct lru_gen_memcg memcg_lru; + #endif + + ZONE_PADDING(_pad2_) +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -549,6 +549,16 @@ static void mem_cgroup_update_tree(struc + struct mem_cgroup_per_node *mz; + struct mem_cgroup_tree_per_node *mctz; + ++ if (lru_gen_enabled()) { ++ struct lruvec *lruvec = &mem_cgroup_page_nodeinfo(memcg, page)->lruvec; ++ ++ /* see the comment on MEMCG_NR_GENS */ ++ if (soft_limit_excess(memcg) && lru_gen_memcg_seg(lruvec) != MEMCG_LRU_HEAD) ++ lru_gen_rotate_memcg(lruvec, MEMCG_LRU_HEAD); ++ ++ return; ++ } ++ + mctz = soft_limit_tree_from_page(page); + if (!mctz) + return; +@@ -3434,6 +3444,9 @@ unsigned long mem_cgroup_soft_limit_recl + unsigned long excess; + unsigned long nr_scanned; + ++ if (lru_gen_enabled()) ++ return 0; ++ + if (order > 0) + return 0; + +@@ -5322,6 +5335,7 @@ static int mem_cgroup_css_online(struct + if (unlikely(mem_cgroup_is_root(memcg))) + queue_delayed_work(system_unbound_wq, &stats_flush_dwork, + 2UL*HZ); ++ lru_gen_online_memcg(memcg); + return 0; + } + +@@ -5348,6 +5362,7 @@ static void mem_cgroup_css_offline(struc + memcg_offline_kmem(memcg); + reparent_shrinker_deferred(memcg); + wb_memcg_offline(memcg); ++ lru_gen_offline_memcg(memcg); + + drain_all_stock(memcg); + +@@ -5359,6 +5374,7 @@ static void mem_cgroup_css_released(stru + struct mem_cgroup *memcg = mem_cgroup_from_css(css); + + invalidate_reclaim_iterators(memcg); ++ lru_gen_release_memcg(memcg); + } + + static void mem_cgroup_css_free(struct cgroup_subsys_state *css) +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -7661,6 +7661,7 @@ static void __init free_area_init_node(i + pgdat_set_deferred_range(pgdat); + + free_area_init_core(pgdat); ++ lru_gen_init_pgdat(pgdat); + } + + void __init free_area_init_memoryless_node(int nid) +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -54,6 +54,8 @@ + #include + #include + #include ++#include ++#include + + #include + #include +@@ -129,11 +131,6 @@ struct scan_control { + /* Always discard instead of demoting to lower tier memory */ + unsigned int no_demotion:1; + +-#ifdef CONFIG_LRU_GEN +- /* help kswapd make better choices among multiple memcgs */ +- unsigned long last_reclaimed; +-#endif +- + /* Allocation order */ + s8 order; + +@@ -2880,6 +2877,9 @@ DEFINE_STATIC_KEY_ARRAY_FALSE(lru_gen_ca + for ((type) = 0; (type) < ANON_AND_FILE; (type)++) \ + for ((zone) = 0; (zone) < MAX_NR_ZONES; (zone)++) + ++#define get_memcg_gen(seq) ((seq) % MEMCG_NR_GENS) ++#define get_memcg_bin(bin) ((bin) % MEMCG_NR_BINS) ++ + static struct lruvec *get_lruvec(struct mem_cgroup *memcg, int nid) + { + struct pglist_data *pgdat = NODE_DATA(nid); +@@ -4169,8 +4169,7 @@ done: + if (sc->priority <= DEF_PRIORITY - 2) + wait_event_killable(lruvec->mm_state.wait, + max_seq < READ_ONCE(lrugen->max_seq)); +- +- return max_seq < READ_ONCE(lrugen->max_seq); ++ return false; + } + + VM_WARN_ON_ONCE(max_seq != READ_ONCE(lrugen->max_seq)); +@@ -4243,8 +4242,6 @@ static void lru_gen_age_node(struct pgli + + VM_WARN_ON_ONCE(!current_is_kswapd()); + +- sc->last_reclaimed = sc->nr_reclaimed; +- + /* check the order to exclude compaction-induced reclaim */ + if (!min_ttl || sc->order || sc->priority == DEF_PRIORITY) + return; +@@ -4833,8 +4830,7 @@ static bool should_run_aging(struct lruv + * 1. Defer try_to_inc_max_seq() to workqueues to reduce latency for memcg + * reclaim. + */ +-static unsigned long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc, +- bool can_swap) ++static long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc, bool can_swap) + { + unsigned long nr_to_scan; + struct mem_cgroup *memcg = lruvec_memcg(lruvec); +@@ -4851,10 +4847,8 @@ static unsigned long get_nr_to_scan(stru + if (sc->priority == DEF_PRIORITY) + return nr_to_scan; + +- try_to_inc_max_seq(lruvec, max_seq, sc, can_swap, false); +- + /* skip this lruvec as it's low on cold pages */ +- return 0; ++ return try_to_inc_max_seq(lruvec, max_seq, sc, can_swap, false) ? -1 : 0; + } + + static unsigned long get_nr_to_reclaim(struct scan_control *sc) +@@ -4863,29 +4857,18 @@ static unsigned long get_nr_to_reclaim(s + if (!global_reclaim(sc)) + return -1; + +- /* discount the previous progress for kswapd */ +- if (current_is_kswapd()) +- return sc->nr_to_reclaim + sc->last_reclaimed; +- + return max(sc->nr_to_reclaim, compact_gap(sc->order)); + } + +-static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) ++static bool try_to_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) + { +- struct blk_plug plug; ++ long nr_to_scan; + unsigned long scanned = 0; + unsigned long nr_to_reclaim = get_nr_to_reclaim(sc); + +- lru_add_drain(); +- +- blk_start_plug(&plug); +- +- set_mm_walk(lruvec_pgdat(lruvec)); +- + while (true) { + int delta; + int swappiness; +- unsigned long nr_to_scan; + + if (sc->may_swap) + swappiness = get_swappiness(lruvec, sc); +@@ -4895,7 +4878,7 @@ static void lru_gen_shrink_lruvec(struct + swappiness = 0; + + nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness); +- if (!nr_to_scan) ++ if (nr_to_scan <= 0) + break; + + delta = evict_pages(lruvec, sc, swappiness); +@@ -4912,10 +4895,250 @@ static void lru_gen_shrink_lruvec(struct + cond_resched(); + } + ++ /* whether try_to_inc_max_seq() was successful */ ++ return nr_to_scan < 0; ++} ++ ++static int shrink_one(struct lruvec *lruvec, struct scan_control *sc) ++{ ++ bool success; ++ unsigned long scanned = sc->nr_scanned; ++ unsigned long reclaimed = sc->nr_reclaimed; ++ int seg = lru_gen_memcg_seg(lruvec); ++ struct mem_cgroup *memcg = lruvec_memcg(lruvec); ++ struct pglist_data *pgdat = lruvec_pgdat(lruvec); ++ ++ /* see the comment on MEMCG_NR_GENS */ ++ if (!lruvec_is_sizable(lruvec, sc)) ++ return seg != MEMCG_LRU_TAIL ? MEMCG_LRU_TAIL : MEMCG_LRU_YOUNG; ++ ++ mem_cgroup_calculate_protection(NULL, memcg); ++ ++ if (mem_cgroup_below_min(memcg)) ++ return MEMCG_LRU_YOUNG; ++ ++ if (mem_cgroup_below_low(memcg)) { ++ /* see the comment on MEMCG_NR_GENS */ ++ if (seg != MEMCG_LRU_TAIL) ++ return MEMCG_LRU_TAIL; ++ ++ memcg_memory_event(memcg, MEMCG_LOW); ++ } ++ ++ success = try_to_shrink_lruvec(lruvec, sc); ++ ++ shrink_slab(sc->gfp_mask, pgdat->node_id, memcg, sc->priority); ++ ++ vmpressure(sc->gfp_mask, memcg, false, sc->nr_scanned - scanned, ++ sc->nr_reclaimed - reclaimed); ++ ++ sc->nr_reclaimed += current->reclaim_state->reclaimed_slab; ++ current->reclaim_state->reclaimed_slab = 0; ++ ++ return success ? MEMCG_LRU_YOUNG : 0; ++} ++ ++#ifdef CONFIG_MEMCG ++ ++static void shrink_many(struct pglist_data *pgdat, struct scan_control *sc) ++{ ++ int gen; ++ int bin; ++ int first_bin; ++ struct lruvec *lruvec; ++ struct lru_gen_page *lrugen; ++ const struct hlist_nulls_node *pos; ++ int op = 0; ++ struct mem_cgroup *memcg = NULL; ++ unsigned long nr_to_reclaim = get_nr_to_reclaim(sc); ++ ++ bin = first_bin = prandom_u32_max(MEMCG_NR_BINS); ++restart: ++ gen = get_memcg_gen(READ_ONCE(pgdat->memcg_lru.seq)); ++ ++ rcu_read_lock(); ++ ++ hlist_nulls_for_each_entry_rcu(lrugen, pos, &pgdat->memcg_lru.fifo[gen][bin], list) { ++ if (op) ++ lru_gen_rotate_memcg(lruvec, op); ++ ++ mem_cgroup_put(memcg); ++ ++ lruvec = container_of(lrugen, struct lruvec, lrugen); ++ memcg = lruvec_memcg(lruvec); ++ ++ if (!mem_cgroup_tryget(memcg)) { ++ op = 0; ++ memcg = NULL; ++ continue; ++ } ++ ++ rcu_read_unlock(); ++ ++ op = shrink_one(lruvec, sc); ++ ++ if (sc->nr_reclaimed >= nr_to_reclaim) ++ goto success; ++ ++ rcu_read_lock(); ++ } ++ ++ rcu_read_unlock(); ++ ++ /* restart if raced with lru_gen_rotate_memcg() */ ++ if (gen != get_nulls_value(pos)) ++ goto restart; ++ ++ /* try the rest of the bins of the current generation */ ++ bin = get_memcg_bin(bin + 1); ++ if (bin != first_bin) ++ goto restart; ++success: ++ if (op) ++ lru_gen_rotate_memcg(lruvec, op); ++ ++ mem_cgroup_put(memcg); ++} ++ ++static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) ++{ ++ struct blk_plug plug; ++ ++ VM_WARN_ON_ONCE(global_reclaim(sc)); ++ ++ lru_add_drain(); ++ ++ blk_start_plug(&plug); ++ ++ set_mm_walk(lruvec_pgdat(lruvec)); ++ ++ if (try_to_shrink_lruvec(lruvec, sc)) ++ lru_gen_rotate_memcg(lruvec, MEMCG_LRU_YOUNG); ++ ++ clear_mm_walk(); ++ ++ blk_finish_plug(&plug); ++} ++ ++#else /* !CONFIG_MEMCG */ ++ ++static void shrink_many(struct pglist_data *pgdat, struct scan_control *sc) ++{ ++ BUILD_BUG(); ++} ++ ++static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) ++{ ++ BUILD_BUG(); ++} ++ ++#endif ++ ++static void set_initial_priority(struct pglist_data *pgdat, struct scan_control *sc) ++{ ++ int priority; ++ unsigned long reclaimable; ++ struct lruvec *lruvec = mem_cgroup_lruvec(NULL, pgdat); ++ ++ if (sc->priority != DEF_PRIORITY || sc->nr_to_reclaim < MIN_LRU_BATCH) ++ return; ++ /* ++ * Determine the initial priority based on ((total / MEMCG_NR_GENS) >> ++ * priority) * reclaimed_to_scanned_ratio = nr_to_reclaim, where the ++ * estimated reclaimed_to_scanned_ratio = inactive / total. ++ */ ++ reclaimable = node_page_state(pgdat, NR_INACTIVE_FILE); ++ if (get_swappiness(lruvec, sc)) ++ reclaimable += node_page_state(pgdat, NR_INACTIVE_ANON); ++ ++ reclaimable /= MEMCG_NR_GENS; ++ ++ /* round down reclaimable and round up sc->nr_to_reclaim */ ++ priority = fls_long(reclaimable) - 1 - fls_long(sc->nr_to_reclaim - 1); ++ ++ sc->priority = clamp(priority, 0, DEF_PRIORITY); ++} ++ ++static void lru_gen_shrink_node(struct pglist_data *pgdat, struct scan_control *sc) ++{ ++ struct blk_plug plug; ++ unsigned long reclaimed = sc->nr_reclaimed; ++ ++ VM_WARN_ON_ONCE(!global_reclaim(sc)); ++ ++ lru_add_drain(); ++ ++ blk_start_plug(&plug); ++ ++ set_mm_walk(pgdat); ++ ++ set_initial_priority(pgdat, sc); ++ ++ if (current_is_kswapd()) ++ sc->nr_reclaimed = 0; ++ ++ if (mem_cgroup_disabled()) ++ shrink_one(&pgdat->__lruvec, sc); ++ else ++ shrink_many(pgdat, sc); ++ ++ if (current_is_kswapd()) ++ sc->nr_reclaimed += reclaimed; ++ + clear_mm_walk(); + + blk_finish_plug(&plug); ++ ++ /* kswapd should never fail */ ++ pgdat->kswapd_failures = 0; ++} ++ ++#ifdef CONFIG_MEMCG ++void lru_gen_rotate_memcg(struct lruvec *lruvec, int op) ++{ ++ int seg; ++ int old, new; ++ int bin = prandom_u32_max(MEMCG_NR_BINS); ++ struct pglist_data *pgdat = lruvec_pgdat(lruvec); ++ ++ spin_lock(&pgdat->memcg_lru.lock); ++ ++ VM_WARN_ON_ONCE(hlist_nulls_unhashed(&lruvec->lrugen.list)); ++ ++ seg = 0; ++ new = old = lruvec->lrugen.gen; ++ ++ /* see the comment on MEMCG_NR_GENS */ ++ if (op == MEMCG_LRU_HEAD) ++ seg = MEMCG_LRU_HEAD; ++ else if (op == MEMCG_LRU_TAIL) ++ seg = MEMCG_LRU_TAIL; ++ else if (op == MEMCG_LRU_OLD) ++ new = get_memcg_gen(pgdat->memcg_lru.seq); ++ else if (op == MEMCG_LRU_YOUNG) ++ new = get_memcg_gen(pgdat->memcg_lru.seq + 1); ++ else ++ VM_WARN_ON_ONCE(true); ++ ++ hlist_nulls_del_rcu(&lruvec->lrugen.list); ++ ++ if (op == MEMCG_LRU_HEAD || op == MEMCG_LRU_OLD) ++ hlist_nulls_add_head_rcu(&lruvec->lrugen.list, &pgdat->memcg_lru.fifo[new][bin]); ++ else ++ hlist_nulls_add_tail_rcu(&lruvec->lrugen.list, &pgdat->memcg_lru.fifo[new][bin]); ++ ++ pgdat->memcg_lru.nr_memcgs[old]--; ++ pgdat->memcg_lru.nr_memcgs[new]++; ++ ++ lruvec->lrugen.gen = new; ++ WRITE_ONCE(lruvec->lrugen.seg, seg); ++ ++ if (!pgdat->memcg_lru.nr_memcgs[old] && old == get_memcg_gen(pgdat->memcg_lru.seq)) ++ WRITE_ONCE(pgdat->memcg_lru.seq, pgdat->memcg_lru.seq + 1); ++ ++ spin_unlock(&pgdat->memcg_lru.lock); + } ++#endif + + /****************************************************************************** + * state change +@@ -5370,11 +5593,11 @@ static int run_cmd(char cmd, int memcg_i + + if (!mem_cgroup_disabled()) { + rcu_read_lock(); ++ + memcg = mem_cgroup_from_id(memcg_id); +-#ifdef CONFIG_MEMCG +- if (memcg && !css_tryget(&memcg->css)) ++ if (!mem_cgroup_tryget(memcg)) + memcg = NULL; +-#endif ++ + rcu_read_unlock(); + + if (!memcg) +@@ -5521,6 +5744,19 @@ void lru_gen_init_lruvec(struct lruvec * + } + + #ifdef CONFIG_MEMCG ++ ++void lru_gen_init_pgdat(struct pglist_data *pgdat) ++{ ++ int i, j; ++ ++ spin_lock_init(&pgdat->memcg_lru.lock); ++ ++ for (i = 0; i < MEMCG_NR_GENS; i++) { ++ for (j = 0; j < MEMCG_NR_BINS; j++) ++ INIT_HLIST_NULLS_HEAD(&pgdat->memcg_lru.fifo[i][j], i); ++ } ++} ++ + void lru_gen_init_memcg(struct mem_cgroup *memcg) + { + INIT_LIST_HEAD(&memcg->mm_list.fifo); +@@ -5544,7 +5780,69 @@ void lru_gen_exit_memcg(struct mem_cgrou + } + } + } +-#endif ++ ++void lru_gen_online_memcg(struct mem_cgroup *memcg) ++{ ++ int gen; ++ int nid; ++ int bin = prandom_u32_max(MEMCG_NR_BINS); ++ ++ for_each_node(nid) { ++ struct pglist_data *pgdat = NODE_DATA(nid); ++ struct lruvec *lruvec = get_lruvec(memcg, nid); ++ ++ spin_lock(&pgdat->memcg_lru.lock); ++ ++ VM_WARN_ON_ONCE(!hlist_nulls_unhashed(&lruvec->lrugen.list)); ++ ++ gen = get_memcg_gen(pgdat->memcg_lru.seq); ++ ++ hlist_nulls_add_tail_rcu(&lruvec->lrugen.list, &pgdat->memcg_lru.fifo[gen][bin]); ++ pgdat->memcg_lru.nr_memcgs[gen]++; ++ ++ lruvec->lrugen.gen = gen; ++ ++ spin_unlock(&pgdat->memcg_lru.lock); ++ } ++} ++ ++void lru_gen_offline_memcg(struct mem_cgroup *memcg) ++{ ++ int nid; ++ ++ for_each_node(nid) { ++ struct lruvec *lruvec = get_lruvec(memcg, nid); ++ ++ lru_gen_rotate_memcg(lruvec, MEMCG_LRU_OLD); ++ } ++} ++ ++void lru_gen_release_memcg(struct mem_cgroup *memcg) ++{ ++ int gen; ++ int nid; ++ ++ for_each_node(nid) { ++ struct pglist_data *pgdat = NODE_DATA(nid); ++ struct lruvec *lruvec = get_lruvec(memcg, nid); ++ ++ spin_lock(&pgdat->memcg_lru.lock); ++ ++ VM_WARN_ON_ONCE(hlist_nulls_unhashed(&lruvec->lrugen.list)); ++ ++ gen = lruvec->lrugen.gen; ++ ++ hlist_nulls_del_rcu(&lruvec->lrugen.list); ++ pgdat->memcg_lru.nr_memcgs[gen]--; ++ ++ if (!pgdat->memcg_lru.nr_memcgs[gen] && gen == get_memcg_gen(pgdat->memcg_lru.seq)) ++ WRITE_ONCE(pgdat->memcg_lru.seq, pgdat->memcg_lru.seq + 1); ++ ++ spin_unlock(&pgdat->memcg_lru.lock); ++ } ++} ++ ++#endif /* CONFIG_MEMCG */ + + static int __init init_lru_gen(void) + { +@@ -5571,6 +5869,10 @@ static void lru_gen_shrink_lruvec(struct + { + } + ++static void lru_gen_shrink_node(struct pglist_data *pgdat, struct scan_control *sc) ++{ ++} ++ + #endif /* CONFIG_LRU_GEN */ + + static void shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) +@@ -5584,7 +5886,7 @@ static void shrink_lruvec(struct lruvec + bool proportional_reclaim; + struct blk_plug plug; + +- if (lru_gen_enabled()) { ++ if (lru_gen_enabled() && !global_reclaim(sc)) { + lru_gen_shrink_lruvec(lruvec, sc); + return; + } +@@ -5826,6 +6128,11 @@ static void shrink_node(pg_data_t *pgdat + struct lruvec *target_lruvec; + bool reclaimable = false; + ++ if (lru_gen_enabled() && global_reclaim(sc)) { ++ lru_gen_shrink_node(pgdat, sc); ++ return; ++ } ++ + target_lruvec = mem_cgroup_lruvec(sc->target_mem_cgroup, pgdat); + + again: diff --git a/target/linux/generic/backport-5.15/020-v6.3-27-mm-multi-gen-LRU-clarify-scan_control-flags.patch b/target/linux/generic/backport-5.15/020-v6.3-27-mm-multi-gen-LRU-clarify-scan_control-flags.patch new file mode 100644 index 0000000000..882f29e989 --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.3-27-mm-multi-gen-LRU-clarify-scan_control-flags.patch @@ -0,0 +1,196 @@ +From 93147736b5b3a21bea24313bfc7a696829932009 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Wed, 21 Dec 2022 21:19:05 -0700 +Subject: [PATCH 27/29] mm: multi-gen LRU: clarify scan_control flags + +Among the flags in scan_control: +1. sc->may_swap, which indicates swap constraint due to memsw.max, is + supported as usual. +2. sc->proactive, which indicates reclaim by memory.reclaim, may not + opportunistically skip the aging path, since it is considered less + latency sensitive. +3. !(sc->gfp_mask & __GFP_IO), which indicates IO constraint, lowers + swappiness to prioritize file LRU, since clean file pages are more + likely to exist. +4. sc->may_writepage and sc->may_unmap, which indicates opportunistic + reclaim, are rejected, since unmapped clean pages are already + prioritized. Scanning for more of them is likely futile and can + cause high reclaim latency when there is a large number of memcgs. + +The rest are handled by the existing code. + +Link: https://lkml.kernel.org/r/20221222041905.2431096-8-yuzhao@google.com +Signed-off-by: Yu Zhao +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Roman Gushchin +Cc: Suren Baghdasaryan +Signed-off-by: Andrew Morton +--- + mm/vmscan.c | 55 +++++++++++++++++++++++++++-------------------------- + 1 file changed, 28 insertions(+), 27 deletions(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -2905,6 +2905,9 @@ static int get_swappiness(struct lruvec + struct mem_cgroup *memcg = lruvec_memcg(lruvec); + struct pglist_data *pgdat = lruvec_pgdat(lruvec); + ++ if (!sc->may_swap) ++ return 0; ++ + if (!can_demote(pgdat->node_id, sc) && + mem_cgroup_get_nr_swap_pages(memcg) < MIN_LRU_BATCH) + return 0; +@@ -3952,7 +3955,7 @@ static void walk_mm(struct lruvec *lruve + } while (err == -EAGAIN); + } + +-static struct lru_gen_mm_walk *set_mm_walk(struct pglist_data *pgdat) ++static struct lru_gen_mm_walk *set_mm_walk(struct pglist_data *pgdat, bool force_alloc) + { + struct lru_gen_mm_walk *walk = current->reclaim_state->mm_walk; + +@@ -3960,7 +3963,7 @@ static struct lru_gen_mm_walk *set_mm_wa + VM_WARN_ON_ONCE(walk); + + walk = &pgdat->mm_walk; +- } else if (!pgdat && !walk) { ++ } else if (!walk && force_alloc) { + VM_WARN_ON_ONCE(current_is_kswapd()); + + walk = kzalloc(sizeof(*walk), __GFP_HIGH | __GFP_NOMEMALLOC | __GFP_NOWARN); +@@ -4146,7 +4149,7 @@ static bool try_to_inc_max_seq(struct lr + goto done; + } + +- walk = set_mm_walk(NULL); ++ walk = set_mm_walk(NULL, true); + if (!walk) { + success = iterate_mm_list_nowalk(lruvec, max_seq); + goto done; +@@ -4215,8 +4218,6 @@ static bool lruvec_is_reclaimable(struct + struct mem_cgroup *memcg = lruvec_memcg(lruvec); + DEFINE_MIN_SEQ(lruvec); + +- VM_WARN_ON_ONCE(sc->memcg_low_reclaim); +- + /* see the comment on lru_gen_page */ + gen = lru_gen_from_seq(min_seq[LRU_GEN_FILE]); + birth = READ_ONCE(lruvec->lrugen.timestamps[gen]); +@@ -4472,12 +4473,8 @@ static bool isolate_page(struct lruvec * + { + bool success; + +- /* unmapping inhibited */ +- if (!sc->may_unmap && page_mapped(page)) +- return false; +- + /* swapping inhibited */ +- if (!(sc->may_writepage && (sc->gfp_mask & __GFP_IO)) && ++ if (!(sc->gfp_mask & __GFP_IO) && + (PageDirty(page) || + (PageAnon(page) && !PageSwapCache(page)))) + return false; +@@ -4574,9 +4571,8 @@ static int scan_pages(struct lruvec *lru + __count_vm_events(PGSCAN_ANON + type, isolated); + + /* +- * There might not be eligible pages due to reclaim_idx, may_unmap and +- * may_writepage. Check the remaining to prevent livelock if it's not +- * making progress. ++ * There might not be eligible pages due to reclaim_idx. Check the ++ * remaining to prevent livelock if it's not making progress. + */ + return isolated || !remaining ? scanned : 0; + } +@@ -4836,8 +4832,7 @@ static long get_nr_to_scan(struct lruvec + struct mem_cgroup *memcg = lruvec_memcg(lruvec); + DEFINE_MAX_SEQ(lruvec); + +- if (mem_cgroup_below_min(memcg) || +- (mem_cgroup_below_low(memcg) && !sc->memcg_low_reclaim)) ++ if (mem_cgroup_below_min(memcg)) + return 0; + + if (!should_run_aging(lruvec, max_seq, sc, can_swap, &nr_to_scan)) +@@ -4865,17 +4860,14 @@ static bool try_to_shrink_lruvec(struct + long nr_to_scan; + unsigned long scanned = 0; + unsigned long nr_to_reclaim = get_nr_to_reclaim(sc); ++ int swappiness = get_swappiness(lruvec, sc); ++ ++ /* clean file pages are more likely to exist */ ++ if (swappiness && !(sc->gfp_mask & __GFP_IO)) ++ swappiness = 1; + + while (true) { + int delta; +- int swappiness; +- +- if (sc->may_swap) +- swappiness = get_swappiness(lruvec, sc); +- else if (!cgroup_reclaim(sc) && get_swappiness(lruvec, sc)) +- swappiness = 1; +- else +- swappiness = 0; + + nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness); + if (nr_to_scan <= 0) +@@ -5005,12 +4997,13 @@ static void lru_gen_shrink_lruvec(struct + struct blk_plug plug; + + VM_WARN_ON_ONCE(global_reclaim(sc)); ++ VM_WARN_ON_ONCE(!sc->may_writepage || !sc->may_unmap); + + lru_add_drain(); + + blk_start_plug(&plug); + +- set_mm_walk(lruvec_pgdat(lruvec)); ++ set_mm_walk(NULL, false); + + if (try_to_shrink_lruvec(lruvec, sc)) + lru_gen_rotate_memcg(lruvec, MEMCG_LRU_YOUNG); +@@ -5066,11 +5059,19 @@ static void lru_gen_shrink_node(struct p + + VM_WARN_ON_ONCE(!global_reclaim(sc)); + ++ /* ++ * Unmapped clean pages are already prioritized. Scanning for more of ++ * them is likely futile and can cause high reclaim latency when there ++ * is a large number of memcgs. ++ */ ++ if (!sc->may_writepage || !sc->may_unmap) ++ goto done; ++ + lru_add_drain(); + + blk_start_plug(&plug); + +- set_mm_walk(pgdat); ++ set_mm_walk(pgdat, false); + + set_initial_priority(pgdat, sc); + +@@ -5088,7 +5089,7 @@ static void lru_gen_shrink_node(struct p + clear_mm_walk(); + + blk_finish_plug(&plug); +- ++done: + /* kswapd should never fail */ + pgdat->kswapd_failures = 0; + } +@@ -5656,7 +5657,7 @@ static ssize_t lru_gen_seq_write(struct + set_task_reclaim_state(current, &sc.reclaim_state); + flags = memalloc_noreclaim_save(); + blk_start_plug(&plug); +- if (!set_mm_walk(NULL)) { ++ if (!set_mm_walk(NULL, true)) { + err = -ENOMEM; + goto done; + } diff --git a/target/linux/generic/backport-5.15/020-v6.3-28-mm-multi-gen-LRU-simplify-arch_has_hw_pte_young-chec.patch b/target/linux/generic/backport-5.15/020-v6.3-28-mm-multi-gen-LRU-simplify-arch_has_hw_pte_young-chec.patch new file mode 100644 index 0000000000..38d0e5496c --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.3-28-mm-multi-gen-LRU-simplify-arch_has_hw_pte_young-chec.patch @@ -0,0 +1,34 @@ +From cf3297e4c7a928da8b2b2f0baff2f9c69ea57952 Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Wed, 21 Dec 2022 21:19:06 -0700 +Subject: [PATCH 28/29] mm: multi-gen LRU: simplify arch_has_hw_pte_young() + check + +Scanning page tables when hardware does not set the accessed bit has +no real use cases. + +Link: https://lkml.kernel.org/r/20221222041905.2431096-9-yuzhao@google.com +Signed-off-by: Yu Zhao +Cc: Johannes Weiner +Cc: Jonathan Corbet +Cc: Michael Larabel +Cc: Michal Hocko +Cc: Mike Rapoport +Cc: Roman Gushchin +Cc: Suren Baghdasaryan +Signed-off-by: Andrew Morton +--- + mm/vmscan.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -4144,7 +4144,7 @@ static bool try_to_inc_max_seq(struct lr + * handful of PTEs. Spreading the work out over a period of time usually + * is less efficient, but it avoids bursty page faults. + */ +- if (!force_scan && !(arch_has_hw_pte_young() && get_cap(LRU_GEN_MM_WALK))) { ++ if (!arch_has_hw_pte_young() || !get_cap(LRU_GEN_MM_WALK)) { + success = iterate_mm_list_nowalk(lruvec, max_seq); + goto done; + } diff --git a/target/linux/generic/backport-5.15/020-v6.3-29-mm-multi-gen-LRU-avoid-futile-retries.patch b/target/linux/generic/backport-5.15/020-v6.3-29-mm-multi-gen-LRU-avoid-futile-retries.patch new file mode 100644 index 0000000000..2d19d0d7da --- /dev/null +++ b/target/linux/generic/backport-5.15/020-v6.3-29-mm-multi-gen-LRU-avoid-futile-retries.patch @@ -0,0 +1,88 @@ +From cc67f962cc53f6e1dfa92eb85b7b26fe83a3c66f Mon Sep 17 00:00:00 2001 +From: Yu Zhao +Date: Mon, 13 Feb 2023 00:53:22 -0700 +Subject: [PATCH 29/29] mm: multi-gen LRU: avoid futile retries + +Recall that the per-node memcg LRU has two generations and they alternate +when the last memcg (of a given node) is moved from one to the other. +Each generation is also sharded into multiple bins to improve scalability. +A reclaimer starts with a random bin (in the old generation) and, if it +fails, it will retry, i.e., to try the rest of the bins. + +If a reclaimer fails with the last memcg, it should move this memcg to the +young generation first, which causes the generations to alternate, and +then retry. Otherwise, the retries will be futile because all other bins +are empty. + +Link: https://lkml.kernel.org/r/20230213075322.1416966-1-yuzhao@google.com +Fixes: e4dde56cd208 ("mm: multi-gen LRU: per-node lru_gen_folio lists") +Signed-off-by: Yu Zhao +Reported-by: T.J. Mercier +Signed-off-by: Andrew Morton +--- + mm/vmscan.c | 25 +++++++++++++++---------- + 1 file changed, 15 insertions(+), 10 deletions(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -4934,18 +4934,20 @@ static int shrink_one(struct lruvec *lru + + static void shrink_many(struct pglist_data *pgdat, struct scan_control *sc) + { ++ int op; + int gen; + int bin; + int first_bin; + struct lruvec *lruvec; + struct lru_gen_page *lrugen; ++ struct mem_cgroup *memcg; + const struct hlist_nulls_node *pos; +- int op = 0; +- struct mem_cgroup *memcg = NULL; + unsigned long nr_to_reclaim = get_nr_to_reclaim(sc); + + bin = first_bin = prandom_u32_max(MEMCG_NR_BINS); + restart: ++ op = 0; ++ memcg = NULL; + gen = get_memcg_gen(READ_ONCE(pgdat->memcg_lru.seq)); + + rcu_read_lock(); +@@ -4969,14 +4971,22 @@ restart: + + op = shrink_one(lruvec, sc); + +- if (sc->nr_reclaimed >= nr_to_reclaim) +- goto success; +- + rcu_read_lock(); ++ ++ if (sc->nr_reclaimed >= nr_to_reclaim) ++ break; + } + + rcu_read_unlock(); + ++ if (op) ++ lru_gen_rotate_memcg(lruvec, op); ++ ++ mem_cgroup_put(memcg); ++ ++ if (sc->nr_reclaimed >= nr_to_reclaim) ++ return; ++ + /* restart if raced with lru_gen_rotate_memcg() */ + if (gen != get_nulls_value(pos)) + goto restart; +@@ -4985,11 +4995,6 @@ restart: + bin = get_memcg_bin(bin + 1); + if (bin != first_bin) + goto restart; +-success: +- if (op) +- lru_gen_rotate_memcg(lruvec, op); +- +- mem_cgroup_put(memcg); + } + + static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) diff --git a/target/linux/generic/backport-5.10/050-v5.16-00-MIPS-uasm-Enable-muhu-opcode-for-MIPS-R6.patch b/target/linux/generic/backport-5.15/050-v5.16-00-MIPS-uasm-Enable-muhu-opcode-for-MIPS-R6.patch similarity index 100% rename from target/linux/generic/backport-5.10/050-v5.16-00-MIPS-uasm-Enable-muhu-opcode-for-MIPS-R6.patch rename to target/linux/generic/backport-5.15/050-v5.16-00-MIPS-uasm-Enable-muhu-opcode-for-MIPS-R6.patch diff --git a/target/linux/generic/backport-5.10/050-v5.16-01-mips-uasm-Add-workaround-for-Loongson-2F-nop-CPU-err.patch b/target/linux/generic/backport-5.15/050-v5.16-01-mips-uasm-Add-workaround-for-Loongson-2F-nop-CPU-err.patch similarity index 100% rename from target/linux/generic/backport-5.10/050-v5.16-01-mips-uasm-Add-workaround-for-Loongson-2F-nop-CPU-err.patch rename to target/linux/generic/backport-5.15/050-v5.16-01-mips-uasm-Add-workaround-for-Loongson-2F-nop-CPU-err.patch diff --git a/target/linux/generic/backport-5.10/050-v5.16-02-mips-bpf-Add-eBPF-JIT-for-32-bit-MIPS.patch b/target/linux/generic/backport-5.15/050-v5.16-02-mips-bpf-Add-eBPF-JIT-for-32-bit-MIPS.patch similarity index 100% rename from target/linux/generic/backport-5.10/050-v5.16-02-mips-bpf-Add-eBPF-JIT-for-32-bit-MIPS.patch rename to target/linux/generic/backport-5.15/050-v5.16-02-mips-bpf-Add-eBPF-JIT-for-32-bit-MIPS.patch diff --git a/target/linux/generic/backport-5.10/050-v5.16-03-mips-bpf-Add-new-eBPF-JIT-for-64-bit-MIPS.patch b/target/linux/generic/backport-5.15/050-v5.16-03-mips-bpf-Add-new-eBPF-JIT-for-64-bit-MIPS.patch similarity index 100% rename from target/linux/generic/backport-5.10/050-v5.16-03-mips-bpf-Add-new-eBPF-JIT-for-64-bit-MIPS.patch rename to target/linux/generic/backport-5.15/050-v5.16-03-mips-bpf-Add-new-eBPF-JIT-for-64-bit-MIPS.patch diff --git a/target/linux/generic/backport-5.10/050-v5.16-04-mips-bpf-Add-JIT-workarounds-for-CPU-errata.patch b/target/linux/generic/backport-5.15/050-v5.16-04-mips-bpf-Add-JIT-workarounds-for-CPU-errata.patch similarity index 100% rename from target/linux/generic/backport-5.10/050-v5.16-04-mips-bpf-Add-JIT-workarounds-for-CPU-errata.patch rename to target/linux/generic/backport-5.15/050-v5.16-04-mips-bpf-Add-JIT-workarounds-for-CPU-errata.patch diff --git a/target/linux/generic/backport-5.15/050-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch b/target/linux/generic/backport-5.15/050-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch new file mode 100644 index 0000000000..24e4e9052b --- /dev/null +++ b/target/linux/generic/backport-5.15/050-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch @@ -0,0 +1,61 @@ +From: Johan Almbladh +Date: Tue, 5 Oct 2021 18:54:07 +0200 +Subject: [PATCH] mips: bpf: Enable eBPF JITs + +This patch enables the new eBPF JITs for 32-bit and 64-bit MIPS. It also +disables the old cBPF JIT to so cBPF programs are converted to use the +new JIT. + +Workarounds for R4000 CPU errata are not implemented by the JIT, so the +JIT is disabled if any of those workarounds are configured. + +Signed-off-by: Johan Almbladh +--- + +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -3431,6 +3431,7 @@ S: Supported + F: arch/arm64/net/ + + BPF JIT for MIPS (32-BIT AND 64-BIT) ++M: Johan Almbladh + M: Paul Burton + L: netdev@vger.kernel.org + L: bpf@vger.kernel.org +--- a/arch/mips/Kconfig ++++ b/arch/mips/Kconfig +@@ -58,7 +58,6 @@ config MIPS + select HAVE_ARCH_TRACEHOOK + select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES + select HAVE_ASM_MODVERSIONS +- select HAVE_CBPF_JIT if !64BIT && !CPU_MICROMIPS + select HAVE_CONTEXT_TRACKING + select HAVE_TIF_NOHZ + select HAVE_C_RECORDMCOUNT +@@ -66,7 +65,10 @@ config MIPS + select HAVE_DEBUG_STACKOVERFLOW + select HAVE_DMA_CONTIGUOUS + select HAVE_DYNAMIC_FTRACE +- select HAVE_EBPF_JIT if 64BIT && !CPU_MICROMIPS && TARGET_ISA_REV >= 2 ++ select HAVE_EBPF_JIT if !CPU_MICROMIPS && \ ++ !CPU_DADDI_WORKAROUNDS && \ ++ !CPU_R4000_WORKAROUNDS && \ ++ !CPU_R4400_WORKAROUNDS + select HAVE_EXIT_THREAD + select HAVE_FAST_GUP + select HAVE_FTRACE_MCOUNT_RECORD +--- a/arch/mips/net/Makefile ++++ b/arch/mips/net/Makefile +@@ -2,9 +2,10 @@ + # MIPS networking code + + obj-$(CONFIG_MIPS_CBPF_JIT) += bpf_jit.o bpf_jit_asm.o ++obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp.o + + ifeq ($(CONFIG_32BIT),y) +- obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp.o bpf_jit_comp32.o ++ obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp32.o + else +- obj-$(CONFIG_MIPS_EBPF_JIT) += ebpf_jit.o ++ obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp64.o + endif diff --git a/target/linux/generic/backport-5.10/050-v5.16-06-mips-bpf-Remove-old-BPF-JIT-implementations.patch b/target/linux/generic/backport-5.15/050-v5.16-06-mips-bpf-Remove-old-BPF-JIT-implementations.patch similarity index 100% rename from target/linux/generic/backport-5.10/050-v5.16-06-mips-bpf-Remove-old-BPF-JIT-implementations.patch rename to target/linux/generic/backport-5.15/050-v5.16-06-mips-bpf-Remove-old-BPF-JIT-implementations.patch diff --git a/target/linux/generic/backport-5.15/060-v5.18-01-bpf-selftests-Add-helpers-to-directly-use-the-capget.patch b/target/linux/generic/backport-5.15/060-v5.18-01-bpf-selftests-Add-helpers-to-directly-use-the-capget.patch new file mode 100644 index 0000000000..4d544a30f5 --- /dev/null +++ b/target/linux/generic/backport-5.15/060-v5.18-01-bpf-selftests-Add-helpers-to-directly-use-the-capget.patch @@ -0,0 +1,123 @@ +From 5287acc6f097c0c18e54401b611a877a3083b68c Mon Sep 17 00:00:00 2001 +From: Martin KaFai Lau +Date: Wed, 16 Mar 2022 10:38:23 -0700 +Subject: [PATCH 1/3] bpf: selftests: Add helpers to directly use the capget + and capset syscall + +After upgrading to the newer libcap (>= 2.60), +the libcap commit aca076443591 ("Make cap_t operations thread safe.") +added a "__u8 mutex;" to the "struct _cap_struct". It caused a few byte +shift that breaks the assumption made in the "struct libcap" definition +in test_verifier.c. + +The bpf selftest usage only needs to enable and disable the effective +caps of the running task. It is easier to directly syscall the +capget and capset instead. It can also remove the libcap +library dependency. + +The cap_helpers.{c,h} is added. One __u64 is used for all CAP_* +bits instead of two __u32. + +Signed-off-by: Martin KaFai Lau +Signed-off-by: Alexei Starovoitov +Acked-by: John Fastabend +Link: https://lore.kernel.org/bpf/20220316173823.2036955-1-kafai@fb.com +--- + tools/testing/selftests/bpf/cap_helpers.c | 67 +++++++++++++++++++++++ + tools/testing/selftests/bpf/cap_helpers.h | 19 +++++++ + 2 files changed, 86 insertions(+) + create mode 100644 tools/testing/selftests/bpf/cap_helpers.c + create mode 100644 tools/testing/selftests/bpf/cap_helpers.h + +--- /dev/null ++++ b/tools/testing/selftests/bpf/cap_helpers.c +@@ -0,0 +1,67 @@ ++// SPDX-License-Identifier: GPL-2.0 ++#include "cap_helpers.h" ++ ++/* Avoid including from the libcap-devel package, ++ * so directly declare them here and use them from glibc. ++ */ ++int capget(cap_user_header_t header, cap_user_data_t data); ++int capset(cap_user_header_t header, const cap_user_data_t data); ++ ++int cap_enable_effective(__u64 caps, __u64 *old_caps) ++{ ++ struct __user_cap_data_struct data[_LINUX_CAPABILITY_U32S_3]; ++ struct __user_cap_header_struct hdr = { ++ .version = _LINUX_CAPABILITY_VERSION_3, ++ }; ++ __u32 cap0 = caps; ++ __u32 cap1 = caps >> 32; ++ int err; ++ ++ err = capget(&hdr, data); ++ if (err) ++ return err; ++ ++ if (old_caps) ++ *old_caps = (__u64)(data[1].effective) << 32 | data[0].effective; ++ ++ if ((data[0].effective & cap0) == cap0 && ++ (data[1].effective & cap1) == cap1) ++ return 0; ++ ++ data[0].effective |= cap0; ++ data[1].effective |= cap1; ++ err = capset(&hdr, data); ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++int cap_disable_effective(__u64 caps, __u64 *old_caps) ++{ ++ struct __user_cap_data_struct data[_LINUX_CAPABILITY_U32S_3]; ++ struct __user_cap_header_struct hdr = { ++ .version = _LINUX_CAPABILITY_VERSION_3, ++ }; ++ __u32 cap0 = caps; ++ __u32 cap1 = caps >> 32; ++ int err; ++ ++ err = capget(&hdr, data); ++ if (err) ++ return err; ++ ++ if (old_caps) ++ *old_caps = (__u64)(data[1].effective) << 32 | data[0].effective; ++ ++ if (!(data[0].effective & cap0) && !(data[1].effective & cap1)) ++ return 0; ++ ++ data[0].effective &= ~cap0; ++ data[1].effective &= ~cap1; ++ err = capset(&hdr, data); ++ if (err) ++ return err; ++ ++ return 0; ++} +--- /dev/null ++++ b/tools/testing/selftests/bpf/cap_helpers.h +@@ -0,0 +1,19 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++#ifndef __CAP_HELPERS_H ++#define __CAP_HELPERS_H ++ ++#include ++#include ++ ++#ifndef CAP_PERFMON ++#define CAP_PERFMON 38 ++#endif ++ ++#ifndef CAP_BPF ++#define CAP_BPF 39 ++#endif ++ ++int cap_enable_effective(__u64 caps, __u64 *old_caps); ++int cap_disable_effective(__u64 caps, __u64 *old_caps); ++ ++#endif diff --git a/target/linux/generic/backport-5.15/060-v5.18-02-bpf-selftests-Remove-libcap-usage-from-test_verifier.patch b/target/linux/generic/backport-5.15/060-v5.18-02-bpf-selftests-Remove-libcap-usage-from-test_verifier.patch new file mode 100644 index 0000000000..cc60b54340 --- /dev/null +++ b/target/linux/generic/backport-5.15/060-v5.18-02-bpf-selftests-Remove-libcap-usage-from-test_verifier.patch @@ -0,0 +1,188 @@ +From 847a6b7ee906be874f0cae279c8de902a7d3f092 Mon Sep 17 00:00:00 2001 +From: Martin KaFai Lau +Date: Wed, 16 Mar 2022 10:38:29 -0700 +Subject: [PATCH 2/3] bpf: selftests: Remove libcap usage from test_verifier + +This patch removes the libcap usage from test_verifier. +The cap_*_effective() helpers added in the earlier patch are +used instead. + +Signed-off-by: Martin KaFai Lau +Signed-off-by: Alexei Starovoitov +Acked-by: John Fastabend +Link: https://lore.kernel.org/bpf/20220316173829.2038682-1-kafai@fb.com +--- + tools/testing/selftests/bpf/Makefile | 31 +++++--- + tools/testing/selftests/bpf/test_verifier.c | 88 ++++++--------------- + 2 files changed, 46 insertions(+), 73 deletions(-) + +--- a/tools/testing/selftests/bpf/Makefile ++++ b/tools/testing/selftests/bpf/Makefile +@@ -189,16 +189,27 @@ TEST_GEN_PROGS_EXTENDED += $(DEFAULT_BPF + + $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(BPFOBJ) + +-$(OUTPUT)/test_dev_cgroup: cgroup_helpers.c +-$(OUTPUT)/test_skb_cgroup_id_user: cgroup_helpers.c +-$(OUTPUT)/test_sock: cgroup_helpers.c +-$(OUTPUT)/test_sock_addr: cgroup_helpers.c +-$(OUTPUT)/test_sockmap: cgroup_helpers.c +-$(OUTPUT)/test_tcpnotify_user: cgroup_helpers.c trace_helpers.c +-$(OUTPUT)/get_cgroup_id_user: cgroup_helpers.c +-$(OUTPUT)/test_cgroup_storage: cgroup_helpers.c +-$(OUTPUT)/test_sock_fields: cgroup_helpers.c +-$(OUTPUT)/test_sysctl: cgroup_helpers.c ++CGROUP_HELPERS := $(OUTPUT)/cgroup_helpers.o ++TESTING_HELPERS := $(OUTPUT)/testing_helpers.o ++TRACE_HELPERS := $(OUTPUT)/trace_helpers.o ++CAP_HELPERS := $(OUTPUT)/cap_helpers.o ++ ++$(OUTPUT)/test_dev_cgroup: $(CGROUP_HELPERS) $(TESTING_HELPERS) ++$(OUTPUT)/test_skb_cgroup_id_user: $(CGROUP_HELPERS) $(TESTING_HELPERS) ++$(OUTPUT)/test_sock: $(CGROUP_HELPERS) $(TESTING_HELPERS) ++$(OUTPUT)/test_sock_addr: $(CGROUP_HELPERS) $(TESTING_HELPERS) ++$(OUTPUT)/test_sockmap: $(CGROUP_HELPERS) $(TESTING_HELPERS) ++$(OUTPUT)/test_tcpnotify_user: $(CGROUP_HELPERS) $(TESTING_HELPERS) $(TRACE_HELPERS) ++$(OUTPUT)/get_cgroup_id_user: $(CGROUP_HELPERS) $(TESTING_HELPERS) ++$(OUTPUT)/test_cgroup_storage: $(CGROUP_HELPERS) $(TESTING_HELPERS) ++$(OUTPUT)/test_sock_fields: $(CGROUP_HELPERS) $(TESTING_HELPERS) ++$(OUTPUT)/test_sysctl: $(CGROUP_HELPERS) $(TESTING_HELPERS) ++$(OUTPUT)/test_tag: $(TESTING_HELPERS) ++$(OUTPUT)/test_lirc_mode2_user: $(TESTING_HELPERS) ++$(OUTPUT)/xdping: $(TESTING_HELPERS) ++$(OUTPUT)/flow_dissector_load: $(TESTING_HELPERS) ++$(OUTPUT)/test_maps: $(TESTING_HELPERS) ++$(OUTPUT)/test_verifier: $(TESTING_HELPERS) $(CAP_HELPERS) + + BPFTOOL ?= $(DEFAULT_BPFTOOL) + $(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \ +--- a/tools/testing/selftests/bpf/test_verifier.c ++++ b/tools/testing/selftests/bpf/test_verifier.c +@@ -22,8 +22,6 @@ + #include + #include + +-#include +- + #include + #include + #include +@@ -43,6 +41,7 @@ + # endif + #endif + #include "bpf_rlimit.h" ++#include "cap_helpers.h" + #include "bpf_rand.h" + #include "bpf_util.h" + #include "test_btf.h" +@@ -59,6 +58,10 @@ + #define F_NEEDS_EFFICIENT_UNALIGNED_ACCESS (1 << 0) + #define F_LOAD_WITH_STRICT_ALIGNMENT (1 << 1) + ++/* need CAP_BPF, CAP_NET_ADMIN, CAP_PERFMON to load progs */ ++#define ADMIN_CAPS (1ULL << CAP_NET_ADMIN | \ ++ 1ULL << CAP_PERFMON | \ ++ 1ULL << CAP_BPF) + #define UNPRIV_SYSCTL "kernel/unprivileged_bpf_disabled" + static bool unpriv_disabled = false; + static int skips; +@@ -940,47 +943,19 @@ struct libcap { + + static int set_admin(bool admin) + { +- cap_t caps; +- /* need CAP_BPF, CAP_NET_ADMIN, CAP_PERFMON to load progs */ +- const cap_value_t cap_net_admin = CAP_NET_ADMIN; +- const cap_value_t cap_sys_admin = CAP_SYS_ADMIN; +- struct libcap *cap; +- int ret = -1; +- +- caps = cap_get_proc(); +- if (!caps) { +- perror("cap_get_proc"); +- return -1; +- } +- cap = (struct libcap *)caps; +- if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_sys_admin, CAP_CLEAR)) { +- perror("cap_set_flag clear admin"); +- goto out; +- } +- if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_net_admin, +- admin ? CAP_SET : CAP_CLEAR)) { +- perror("cap_set_flag set_or_clear net"); +- goto out; +- } +- /* libcap is likely old and simply ignores CAP_BPF and CAP_PERFMON, +- * so update effective bits manually +- */ ++ int err; ++ + if (admin) { +- cap->data[1].effective |= 1 << (38 /* CAP_PERFMON */ - 32); +- cap->data[1].effective |= 1 << (39 /* CAP_BPF */ - 32); ++ err = cap_enable_effective(ADMIN_CAPS, NULL); ++ if (err) ++ perror("cap_enable_effective(ADMIN_CAPS)"); + } else { +- cap->data[1].effective &= ~(1 << (38 - 32)); +- cap->data[1].effective &= ~(1 << (39 - 32)); ++ err = cap_disable_effective(ADMIN_CAPS, NULL); ++ if (err) ++ perror("cap_disable_effective(ADMIN_CAPS)"); + } +- if (cap_set_proc(caps)) { +- perror("cap_set_proc"); +- goto out; +- } +- ret = 0; +-out: +- if (cap_free(caps)) +- perror("cap_free"); +- return ret; ++ ++ return err; + } + + static int do_prog_test_run(int fd_prog, bool unpriv, uint32_t expected_val, +@@ -1246,31 +1221,18 @@ fail_log: + + static bool is_admin(void) + { +- cap_flag_value_t net_priv = CAP_CLEAR; +- bool perfmon_priv = false; +- bool bpf_priv = false; +- struct libcap *cap; +- cap_t caps; +- +-#ifdef CAP_IS_SUPPORTED +- if (!CAP_IS_SUPPORTED(CAP_SETFCAP)) { +- perror("cap_get_flag"); +- return false; +- } +-#endif +- caps = cap_get_proc(); +- if (!caps) { +- perror("cap_get_proc"); ++ __u64 caps; ++ ++ /* The test checks for finer cap as CAP_NET_ADMIN, ++ * CAP_PERFMON, and CAP_BPF instead of CAP_SYS_ADMIN. ++ * Thus, disable CAP_SYS_ADMIN at the beginning. ++ */ ++ if (cap_disable_effective(1ULL << CAP_SYS_ADMIN, &caps)) { ++ perror("cap_disable_effective(CAP_SYS_ADMIN)"); + return false; + } +- cap = (struct libcap *)caps; +- bpf_priv = cap->data[1].effective & (1 << (39/* CAP_BPF */ - 32)); +- perfmon_priv = cap->data[1].effective & (1 << (38/* CAP_PERFMON */ - 32)); +- if (cap_get_flag(caps, CAP_NET_ADMIN, CAP_EFFECTIVE, &net_priv)) +- perror("cap_get_flag NET"); +- if (cap_free(caps)) +- perror("cap_free"); +- return bpf_priv && perfmon_priv && net_priv == CAP_SET; ++ ++ return (caps & ADMIN_CAPS) == ADMIN_CAPS; + } + + static void get_unpriv_disabled() diff --git a/target/linux/generic/backport-5.15/060-v5.18-03-bpf-selftests-Remove-libcap-usage-from-test_progs.patch b/target/linux/generic/backport-5.15/060-v5.18-03-bpf-selftests-Remove-libcap-usage-from-test_progs.patch new file mode 100644 index 0000000000..9badba7f8e --- /dev/null +++ b/target/linux/generic/backport-5.15/060-v5.18-03-bpf-selftests-Remove-libcap-usage-from-test_progs.patch @@ -0,0 +1,122 @@ +From 1ac00fea13c576e2b13dabf9a72ad3034e3bb804 Mon Sep 17 00:00:00 2001 +From: Martin KaFai Lau +Date: Wed, 16 Mar 2022 10:38:35 -0700 +Subject: [PATCH 3/3] bpf: selftests: Remove libcap usage from test_progs + +This patch removes the libcap usage from test_progs. +bind_perm.c is the only user. cap_*_effective() helpers added in the +earlier patch are directly used instead. + +No other selftest binary is using libcap, so '-lcap' is also removed +from the Makefile. + +Signed-off-by: Martin KaFai Lau +Signed-off-by: Alexei Starovoitov +Reviewed-by: Stanislav Fomichev +Acked-by: John Fastabend +Link: https://lore.kernel.org/bpf/20220316173835.2039334-1-kafai@fb.com +--- + tools/testing/selftests/bpf/Makefile | 5 ++- + .../selftests/bpf/prog_tests/bind_perm.c | 44 ++++--------------- + 2 files changed, 11 insertions(+), 38 deletions(-) + +--- a/tools/testing/selftests/bpf/Makefile ++++ b/tools/testing/selftests/bpf/Makefile +@@ -26,7 +26,7 @@ CFLAGS += -g -O0 -rdynamic -Wall $(GENFL + -I$(TOOLSINCDIR) -I$(APIDIR) -I$(OUTPUT) \ + -Dbpf_prog_load=bpf_prog_test_load \ + -Dbpf_load_program=bpf_test_load_program +-LDLIBS += -lcap -lelf -lz -lrt -lpthread ++LDLIBS += -lelf -lz -lrt -lpthread + + # Silence some warnings when compiled with clang + ifneq ($(LLVM),) +@@ -471,7 +471,8 @@ TRUNNER_TESTS_DIR := prog_tests + TRUNNER_BPF_PROGS_DIR := progs + TRUNNER_EXTRA_SOURCES := test_progs.c cgroup_helpers.c trace_helpers.c \ + network_helpers.c testing_helpers.c \ +- btf_helpers.c flow_dissector_load.h ++ btf_helpers.c flow_dissector_load.h \ ++ cap_helpers.c + TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read $(OUTPUT)/bpf_testmod.ko \ + ima_setup.sh \ + $(wildcard progs/btf_dump_test_case_*.c) +--- a/tools/testing/selftests/bpf/prog_tests/bind_perm.c ++++ b/tools/testing/selftests/bpf/prog_tests/bind_perm.c +@@ -4,9 +4,9 @@ + #include + #include + #include +-#include + + #include "test_progs.h" ++#include "cap_helpers.h" + #include "bind_perm.skel.h" + + static int duration; +@@ -49,41 +49,11 @@ close_socket: + close(fd); + } + +-bool cap_net_bind_service(cap_flag_value_t flag) +-{ +- const cap_value_t cap_net_bind_service = CAP_NET_BIND_SERVICE; +- cap_flag_value_t original_value; +- bool was_effective = false; +- cap_t caps; +- +- caps = cap_get_proc(); +- if (CHECK(!caps, "cap_get_proc", "errno %d", errno)) +- goto free_caps; +- +- if (CHECK(cap_get_flag(caps, CAP_NET_BIND_SERVICE, CAP_EFFECTIVE, +- &original_value), +- "cap_get_flag", "errno %d", errno)) +- goto free_caps; +- +- was_effective = (original_value == CAP_SET); +- +- if (CHECK(cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_net_bind_service, +- flag), +- "cap_set_flag", "errno %d", errno)) +- goto free_caps; +- +- if (CHECK(cap_set_proc(caps), "cap_set_proc", "errno %d", errno)) +- goto free_caps; +- +-free_caps: +- CHECK(cap_free(caps), "cap_free", "errno %d", errno); +- return was_effective; +-} +- + void test_bind_perm(void) + { +- bool cap_was_effective; ++ const __u64 net_bind_svc_cap = 1ULL << CAP_NET_BIND_SERVICE; + struct bind_perm *skel; ++ __u64 old_caps = 0; + int cgroup_fd; + + if (create_netns()) +@@ -105,7 +75,8 @@ void test_bind_perm(void) + if (!ASSERT_OK_PTR(skel, "bind_v6_prog")) + goto close_skeleton; + +- cap_was_effective = cap_net_bind_service(CAP_CLEAR); ++ ASSERT_OK(cap_disable_effective(net_bind_svc_cap, &old_caps), ++ "cap_disable_effective"); + + try_bind(AF_INET, 110, EACCES); + try_bind(AF_INET6, 110, EACCES); +@@ -113,8 +84,9 @@ void test_bind_perm(void) + try_bind(AF_INET, 111, 0); + try_bind(AF_INET6, 111, 0); + +- if (cap_was_effective) +- cap_net_bind_service(CAP_SET); ++ if (old_caps & net_bind_svc_cap) ++ ASSERT_OK(cap_enable_effective(net_bind_svc_cap, NULL), ++ "cap_enable_effective"); + + close_skeleton: + bind_perm__destroy(skel); diff --git a/target/linux/generic/backport-5.15/080-v5.17-clk-gate-Add-devm_clk_hw_register_gate.patch b/target/linux/generic/backport-5.15/080-v5.17-clk-gate-Add-devm_clk_hw_register_gate.patch new file mode 100644 index 0000000000..51c23b6e34 --- /dev/null +++ b/target/linux/generic/backport-5.15/080-v5.17-clk-gate-Add-devm_clk_hw_register_gate.patch @@ -0,0 +1,105 @@ +From 815f0e738a8d5663a02350e2580706829144a722 Mon Sep 17 00:00:00 2001 +From: Horatiu Vultur +Date: Wed, 3 Nov 2021 09:50:59 +0100 +Subject: [PATCH] clk: gate: Add devm_clk_hw_register_gate() + +Add devm_clk_hw_register_gate() - devres-managed version of +clk_hw_register_gate() + +Suggested-by: Stephen Boyd +Signed-off-by: Horatiu Vultur +Acked-by: Nicolas Ferre +Signed-off-by: Nicolas Ferre +Link: https://lore.kernel.org/r/20211103085102.1656081-2-horatiu.vultur@microchip.com +--- + drivers/clk/clk-gate.c | 35 +++++++++++++++++++++++++++++++++++ + include/linux/clk-provider.h | 23 +++++++++++++++++++++++ + 2 files changed, 58 insertions(+) + +--- a/drivers/clk/clk-gate.c ++++ b/drivers/clk/clk-gate.c +@@ -7,6 +7,7 @@ + */ + + #include ++#include + #include + #include + #include +@@ -222,3 +223,37 @@ void clk_hw_unregister_gate(struct clk_h + kfree(gate); + } + EXPORT_SYMBOL_GPL(clk_hw_unregister_gate); ++ ++static void devm_clk_hw_release_gate(struct device *dev, void *res) ++{ ++ clk_hw_unregister_gate(*(struct clk_hw **)res); ++} ++ ++struct clk_hw *__devm_clk_hw_register_gate(struct device *dev, ++ struct device_node *np, const char *name, ++ const char *parent_name, const struct clk_hw *parent_hw, ++ const struct clk_parent_data *parent_data, ++ unsigned long flags, ++ void __iomem *reg, u8 bit_idx, ++ u8 clk_gate_flags, spinlock_t *lock) ++{ ++ struct clk_hw **ptr, *hw; ++ ++ ptr = devres_alloc(devm_clk_hw_release_gate, sizeof(*ptr), GFP_KERNEL); ++ if (!ptr) ++ return ERR_PTR(-ENOMEM); ++ ++ hw = __clk_hw_register_gate(dev, np, name, parent_name, parent_hw, ++ parent_data, flags, reg, bit_idx, ++ clk_gate_flags, lock); ++ ++ if (!IS_ERR(hw)) { ++ *ptr = hw; ++ devres_add(dev, ptr); ++ } else { ++ devres_free(ptr); ++ } ++ ++ return hw; ++} ++EXPORT_SYMBOL_GPL(__devm_clk_hw_register_gate); +--- a/include/linux/clk-provider.h ++++ b/include/linux/clk-provider.h +@@ -490,6 +490,13 @@ struct clk_hw *__clk_hw_register_gate(st + unsigned long flags, + void __iomem *reg, u8 bit_idx, + u8 clk_gate_flags, spinlock_t *lock); ++struct clk_hw *__devm_clk_hw_register_gate(struct device *dev, ++ struct device_node *np, const char *name, ++ const char *parent_name, const struct clk_hw *parent_hw, ++ const struct clk_parent_data *parent_data, ++ unsigned long flags, ++ void __iomem *reg, u8 bit_idx, ++ u8 clk_gate_flags, spinlock_t *lock); + struct clk *clk_register_gate(struct device *dev, const char *name, + const char *parent_name, unsigned long flags, + void __iomem *reg, u8 bit_idx, +@@ -544,6 +551,22 @@ struct clk *clk_register_gate(struct dev + __clk_hw_register_gate((dev), NULL, (name), NULL, NULL, (parent_data), \ + (flags), (reg), (bit_idx), \ + (clk_gate_flags), (lock)) ++/** ++ * devm_clk_hw_register_gate - register a gate clock with the clock framework ++ * @dev: device that is registering this clock ++ * @name: name of this clock ++ * @parent_name: name of this clock's parent ++ * @flags: framework-specific flags for this clock ++ * @reg: register address to control gating of this clock ++ * @bit_idx: which bit in the register controls gating of this clock ++ * @clk_gate_flags: gate-specific flags for this clock ++ * @lock: shared register lock for this clock ++ */ ++#define devm_clk_hw_register_gate(dev, name, parent_name, flags, reg, bit_idx,\ ++ clk_gate_flags, lock) \ ++ __devm_clk_hw_register_gate((dev), NULL, (name), (parent_name), NULL, \ ++ NULL, (flags), (reg), (bit_idx), \ ++ (clk_gate_flags), (lock)) + void clk_unregister_gate(struct clk *clk); + void clk_hw_unregister_gate(struct clk_hw *hw); + int clk_gate_is_enabled(struct clk_hw *hw); diff --git a/target/linux/generic/backport-5.15/081-v5.17-regmap-allow-to-define-reg_update_bits-for-no-bus.patch b/target/linux/generic/backport-5.15/081-v5.17-regmap-allow-to-define-reg_update_bits-for-no-bus.patch new file mode 100644 index 0000000000..e4c0833ae7 --- /dev/null +++ b/target/linux/generic/backport-5.15/081-v5.17-regmap-allow-to-define-reg_update_bits-for-no-bus.patch @@ -0,0 +1,52 @@ +From 02d6fdecb9c38de19065f6bed8d5214556fd061d Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Thu, 4 Nov 2021 16:00:40 +0100 +Subject: regmap: allow to define reg_update_bits for no bus configuration + +Some device requires a special handling for reg_update_bits and can't use +the normal regmap read write logic. An example is when locking is +handled by the device and rmw operations requires to do atomic operations. +Allow to declare a dedicated function in regmap_config for +reg_update_bits in no bus configuration. + +Signed-off-by: Ansuel Smith +Link: https://lore.kernel.org/r/20211104150040.1260-1-ansuelsmth@gmail.com +Signed-off-by: Mark Brown +--- + drivers/base/regmap/regmap.c | 1 + + include/linux/regmap.h | 7 +++++++ + 2 files changed, 8 insertions(+) + +--- a/drivers/base/regmap/regmap.c ++++ b/drivers/base/regmap/regmap.c +@@ -877,6 +877,7 @@ struct regmap *__regmap_init(struct devi + if (!bus) { + map->reg_read = config->reg_read; + map->reg_write = config->reg_write; ++ map->reg_update_bits = config->reg_update_bits; + + map->defer_caching = false; + goto skip_format_initialization; +--- a/include/linux/regmap.h ++++ b/include/linux/regmap.h +@@ -290,6 +290,11 @@ typedef void (*regmap_unlock)(void *); + * read operation on a bus such as SPI, I2C, etc. Most of the + * devices do not need this. + * @reg_write: Same as above for writing. ++ * @reg_update_bits: Optional callback that if filled will be used to perform ++ * all the update_bits(rmw) operation. Should only be provided ++ * if the function require special handling with lock and reg ++ * handling and the operation cannot be represented as a simple ++ * update_bits operation on a bus such as SPI, I2C, etc. + * @fast_io: Register IO is fast. Use a spinlock instead of a mutex + * to perform locking. This field is ignored if custom lock/unlock + * functions are used (see fields lock/unlock of struct regmap_config). +@@ -372,6 +377,8 @@ struct regmap_config { + + int (*reg_read)(void *context, unsigned int reg, unsigned int *val); + int (*reg_write)(void *context, unsigned int reg, unsigned int val); ++ int (*reg_update_bits)(void *context, unsigned int reg, ++ unsigned int mask, unsigned int val); + + bool fast_io; + diff --git a/target/linux/generic/backport-5.15/100-v5.18-tty-serial-bcm63xx-use-more-precise-Kconfig-symbol.patch b/target/linux/generic/backport-5.15/100-v5.18-tty-serial-bcm63xx-use-more-precise-Kconfig-symbol.patch new file mode 100644 index 0000000000..7de3cbbda0 --- /dev/null +++ b/target/linux/generic/backport-5.15/100-v5.18-tty-serial-bcm63xx-use-more-precise-Kconfig-symbol.patch @@ -0,0 +1,37 @@ +From 0dc0da881b4574d1e04a079ab2ea75da61f5ad2e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Fri, 11 Mar 2022 10:32:33 +0100 +Subject: [PATCH] tty: serial: bcm63xx: use more precise Kconfig symbol +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Patches lowering SERIAL_BCM63XX dependencies led to a discussion and +documentation change regarding "depends" usage. Adjust Kconfig entry to +match current guidelines. Make this symbol available for relevant +architectures only. + +Cc: Geert Uytterhoeven +Reviewed-by: Geert Uytterhoeven +Acked-by: Florian Fainelli +Signed-off-by: Rafał Miłecki +Ref: f35a07f92616 ("tty: serial: bcm63xx: lower driver dependencies") +Ref: 18084e435ff6 ("Documentation/kbuild: Document platform dependency practises") +Link: https://lore.kernel.org/r/20220311093233.10012-1-zajec5@gmail.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/serial/Kconfig | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/tty/serial/Kconfig ++++ b/drivers/tty/serial/Kconfig +@@ -1098,7 +1098,8 @@ config SERIAL_TIMBERDALE + config SERIAL_BCM63XX + tristate "Broadcom BCM63xx/BCM33xx UART support" + select SERIAL_CORE +- depends on COMMON_CLK ++ depends on ARCH_BCM4908 || ARCH_BCM_63XX || BCM63XX || BMIPS_GENERIC || COMPILE_TEST ++ default ARCH_BCM4908 || ARCH_BCM_63XX || BCM63XX || BMIPS_GENERIC + help + This enables the driver for the onchip UART core found on + the following chipsets: diff --git a/target/linux/generic/backport-5.15/200-v5.18-tools-resolve_btfids-Build-with-host-flags.patch b/target/linux/generic/backport-5.15/200-v5.18-tools-resolve_btfids-Build-with-host-flags.patch new file mode 100644 index 0000000000..caec8db5d6 --- /dev/null +++ b/target/linux/generic/backport-5.15/200-v5.18-tools-resolve_btfids-Build-with-host-flags.patch @@ -0,0 +1,49 @@ +From cdbc4e3399ed8cdcf234a85f7a2482b622379e82 Mon Sep 17 00:00:00 2001 +From: Connor O'Brien +Date: Wed, 12 Jan 2022 00:25:03 +0000 +Subject: [PATCH] tools/resolve_btfids: Build with host flags + +resolve_btfids is built using $(HOSTCC) and $(HOSTLD) but does not +pick up the corresponding flags. As a result, host-specific settings +(such as a sysroot specified via HOSTCFLAGS=--sysroot=..., or a linker +specified via HOSTLDFLAGS=-fuse-ld=...) will not be respected. + +Fix this by setting CFLAGS to KBUILD_HOSTCFLAGS and LDFLAGS to +KBUILD_HOSTLDFLAGS. + +Also pass the cflags through to libbpf via EXTRA_CFLAGS to ensure that +the host libbpf is built with flags consistent with resolve_btfids. + +Signed-off-by: Connor O'Brien +Signed-off-by: Andrii Nakryiko +Acked-by: Song Liu +Link: https://lore.kernel.org/bpf/20220112002503.115968-1-connoro@google.com +(cherry picked from commit 0e3a1c902ffb56e9fe4416f0cd382c97b09ecbf6) +Signed-off-by: Stijn Tintel +--- + tools/bpf/resolve_btfids/Makefile | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/tools/bpf/resolve_btfids/Makefile ++++ b/tools/bpf/resolve_btfids/Makefile +@@ -23,6 +23,8 @@ CC = $(HOSTCC) + LD = $(HOSTLD) + ARCH = $(HOSTARCH) + RM ?= rm ++CFLAGS := $(KBUILD_HOSTCFLAGS) ++LDFLAGS := $(KBUILD_HOSTLDFLAGS) + + OUTPUT ?= $(srctree)/tools/bpf/resolve_btfids/ + +@@ -45,9 +47,9 @@ $(SUBCMDOBJ): fixdep FORCE | $(OUTPUT)/l + $(Q)$(MAKE) -C $(SUBCMD_SRC) OUTPUT=$(abspath $(dir $@))/ $(abspath $@) + + $(BPFOBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf +- $(Q)$(MAKE) $(submake_extras) -C $(LIBBPF_SRC) OUTPUT=$(abspath $(dir $@))/ $(abspath $@) ++ $(Q)$(MAKE) $(submake_extras) -C $(LIBBPF_SRC) OUTPUT=$(abspath $(dir $@))/ EXTRA_CFLAGS="$(CFLAGS)" $(abspath $@) + +-CFLAGS := -g \ ++CFLAGS += -g \ + -I$(srctree)/tools/include \ + -I$(srctree)/tools/include/uapi \ + -I$(LIBBPF_SRC) \ diff --git a/target/linux/generic/backport-5.15/201-v5.16-scripts-dtc-Update-to-upstream-version-v1.6.1-19-g0a.patch b/target/linux/generic/backport-5.15/201-v5.16-scripts-dtc-Update-to-upstream-version-v1.6.1-19-g0a.patch new file mode 100644 index 0000000000..d1bef74f32 --- /dev/null +++ b/target/linux/generic/backport-5.15/201-v5.16-scripts-dtc-Update-to-upstream-version-v1.6.1-19-g0a.patch @@ -0,0 +1,997 @@ +From a77725a9a3c5924e2fd4cd5b3557dd92a8e46f87 Mon Sep 17 00:00:00 2001 +From: Rob Herring +Date: Mon, 25 Oct 2021 11:05:45 -0500 +Subject: [PATCH 1/1] scripts/dtc: Update to upstream version + v1.6.1-19-g0a3a9d3449c8 + +This adds the following commits from upstream: + +0a3a9d3449c8 checks: Add an interrupt-map check +8fd24744e361 checks: Ensure '#interrupt-cells' only exists in interrupt providers +d8d1a9a77863 checks: Drop interrupt provider '#address-cells' check +52a16fd72824 checks: Make interrupt_provider check dependent on interrupts_extended_is_cell +37fd700685da treesource: Maintain phandle label/path on output +e33ce1d6a8c7 flattree: Use '\n', not ';' to separate asm pseudo-ops +d24cc189dca6 asm: Use assembler macros instead of cpp macros +ff3a30c115ad asm: Use .asciz and .ascii instead of .string +5eb5927d81ee fdtdump: fix -Werror=int-to-pointer-cast +0869f8269161 libfdt: Add ALIGNMENT error string +69595a167f06 checks: Fix bus-range check +72d09e2682a4 Makefile: add -Wsign-compare to warning options +b587787ef388 checks: Fix signedness comparisons warnings +69bed6c2418f dtc: Wrap phandle validity check +910221185560 fdtget: Fix signedness comparisons warnings +d966f08fcd21 tests: Fix signedness comparisons warnings +ecfb438c07fa dtc: Fix signedness comparisons warnings: pointer diff +5bec74a6d135 dtc: Fix signedness comparisons warnings: reservednum +24e7f511fd4a fdtdump: Fix signedness comparisons warnings +b6910bec1161 Bump version to v1.6.1 +21d61d18f968 Fix CID 1461557 +4c2ef8f4d14c checks: Introduce is_multiple_of() +e59ca36fb70e Make handling of cpp line information more tolerant +0c3fd9b6aceb checks: Drop interrupt_cells_is_cell check +6b3081abc4ac checks: Add check_is_cell() for all phandle+arg properties +2dffc192a77f yamltree: Remove marker ordering dependency +61e513439e40 pylibfdt: Rework "avoid unused variable warning" lines +c8bddd106095 tests: add a positive gpio test case +ad4abfadb687 checks: replace strstr and strrchr with strends +09c6a6e88718 dtc.h: add strends for suffix matching +9bb9b8d0b4a0 checks: tigthen up nr-gpios prop exception +b07b62ee3342 libfdt: Add FDT alignment check to fdt_check_header() +a2def5479950 libfdt: Check that the root-node name is empty +4ca61f84dc21 libfdt: Check that there is only one root node +34d708249a91 dtc: Remove -O dtbo support +8e7ff260f755 libfdt: Fix a possible "unchecked return value" warning +88875268c05c checks: Warn on node-name and property name being the same +9d2279e7e6ee checks: Change node-name check to match devicetree spec +f527c867a8c6 util: limit gnu_printf format attribute to gcc >= 4.4.0 + +Reviewed-by: Frank Rowand +Tested-by: Frank Rowand +Signed-off-by: Rob Herring +--- + scripts/dtc/checks.c | 222 ++++++++++++++++++++++-------- + scripts/dtc/dtc-lexer.l | 2 +- + scripts/dtc/dtc.c | 6 +- + scripts/dtc/dtc.h | 40 +++++- + scripts/dtc/flattree.c | 11 +- + scripts/dtc/libfdt/fdt.c | 4 + + scripts/dtc/libfdt/fdt_rw.c | 18 ++- + scripts/dtc/libfdt/fdt_strerror.c | 1 + + scripts/dtc/libfdt/libfdt.h | 7 + + scripts/dtc/livetree.c | 6 +- + scripts/dtc/treesource.c | 48 +++---- + scripts/dtc/util.h | 6 +- + scripts/dtc/version_gen.h | 2 +- + scripts/dtc/yamltree.c | 16 ++- + 14 files changed, 275 insertions(+), 114 deletions(-) + +--- a/scripts/dtc/checks.c ++++ b/scripts/dtc/checks.c +@@ -143,6 +143,14 @@ static void check_nodes_props(struct che + check_nodes_props(c, dti, child); + } + ++static bool is_multiple_of(int multiple, int divisor) ++{ ++ if (divisor == 0) ++ return multiple == 0; ++ else ++ return (multiple % divisor) == 0; ++} ++ + static bool run_check(struct check *c, struct dt_info *dti) + { + struct node *dt = dti->dt; +@@ -297,19 +305,20 @@ ERROR(duplicate_property_names, check_du + #define LOWERCASE "abcdefghijklmnopqrstuvwxyz" + #define UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + #define DIGITS "0123456789" +-#define PROPNODECHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-" ++#define NODECHARS LOWERCASE UPPERCASE DIGITS ",._+-@" ++#define PROPCHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-" + #define PROPNODECHARSSTRICT LOWERCASE UPPERCASE DIGITS ",-" + + static void check_node_name_chars(struct check *c, struct dt_info *dti, + struct node *node) + { +- int n = strspn(node->name, c->data); ++ size_t n = strspn(node->name, c->data); + + if (n < strlen(node->name)) + FAIL(c, dti, node, "Bad character '%c' in node name", + node->name[n]); + } +-ERROR(node_name_chars, check_node_name_chars, PROPNODECHARS "@"); ++ERROR(node_name_chars, check_node_name_chars, NODECHARS); + + static void check_node_name_chars_strict(struct check *c, struct dt_info *dti, + struct node *node) +@@ -330,6 +339,20 @@ static void check_node_name_format(struc + } + ERROR(node_name_format, check_node_name_format, NULL, &node_name_chars); + ++static void check_node_name_vs_property_name(struct check *c, ++ struct dt_info *dti, ++ struct node *node) ++{ ++ if (!node->parent) ++ return; ++ ++ if (get_property(node->parent, node->name)) { ++ FAIL(c, dti, node, "node name and property name conflict"); ++ } ++} ++WARNING(node_name_vs_property_name, check_node_name_vs_property_name, ++ NULL, &node_name_chars); ++ + static void check_unit_address_vs_reg(struct check *c, struct dt_info *dti, + struct node *node) + { +@@ -363,14 +386,14 @@ static void check_property_name_chars(st + struct property *prop; + + for_each_property(node, prop) { +- int n = strspn(prop->name, c->data); ++ size_t n = strspn(prop->name, c->data); + + if (n < strlen(prop->name)) + FAIL_PROP(c, dti, node, prop, "Bad character '%c' in property name", + prop->name[n]); + } + } +-ERROR(property_name_chars, check_property_name_chars, PROPNODECHARS); ++ERROR(property_name_chars, check_property_name_chars, PROPCHARS); + + static void check_property_name_chars_strict(struct check *c, + struct dt_info *dti, +@@ -380,7 +403,7 @@ static void check_property_name_chars_st + + for_each_property(node, prop) { + const char *name = prop->name; +- int n = strspn(name, c->data); ++ size_t n = strspn(name, c->data); + + if (n == strlen(prop->name)) + continue; +@@ -497,7 +520,7 @@ static cell_t check_phandle_prop(struct + + phandle = propval_cell(prop); + +- if ((phandle == 0) || (phandle == -1)) { ++ if (!phandle_is_valid(phandle)) { + FAIL_PROP(c, dti, node, prop, "bad value (0x%x) in %s property", + phandle, prop->name); + return 0; +@@ -556,7 +579,7 @@ static void check_name_properties(struct + if (!prop) + return; /* No name property, that's fine */ + +- if ((prop->val.len != node->basenamelen+1) ++ if ((prop->val.len != node->basenamelen + 1U) + || (memcmp(prop->val.val, node->name, node->basenamelen) != 0)) { + FAIL(c, dti, node, "\"name\" property is incorrect (\"%s\" instead" + " of base node name)", prop->val.val); +@@ -657,7 +680,6 @@ ERROR(omit_unused_nodes, fixup_omit_unus + */ + WARNING_IF_NOT_CELL(address_cells_is_cell, "#address-cells"); + WARNING_IF_NOT_CELL(size_cells_is_cell, "#size-cells"); +-WARNING_IF_NOT_CELL(interrupt_cells_is_cell, "#interrupt-cells"); + + WARNING_IF_NOT_STRING(device_type_is_string, "device_type"); + WARNING_IF_NOT_STRING(model_is_string, "model"); +@@ -672,8 +694,7 @@ static void check_names_is_string_list(s + struct property *prop; + + for_each_property(node, prop) { +- const char *s = strrchr(prop->name, '-'); +- if (!s || !streq(s, "-names")) ++ if (!strends(prop->name, "-names")) + continue; + + c->data = prop->name; +@@ -753,7 +774,7 @@ static void check_reg_format(struct chec + size_cells = node_size_cells(node->parent); + entrylen = (addr_cells + size_cells) * sizeof(cell_t); + +- if (!entrylen || (prop->val.len % entrylen) != 0) ++ if (!is_multiple_of(prop->val.len, entrylen)) + FAIL_PROP(c, dti, node, prop, "property has invalid length (%d bytes) " + "(#address-cells == %d, #size-cells == %d)", + prop->val.len, addr_cells, size_cells); +@@ -794,7 +815,7 @@ static void check_ranges_format(struct c + "#size-cells (%d) differs from %s (%d)", + ranges, c_size_cells, node->parent->fullpath, + p_size_cells); +- } else if ((prop->val.len % entrylen) != 0) { ++ } else if (!is_multiple_of(prop->val.len, entrylen)) { + FAIL_PROP(c, dti, node, prop, "\"%s\" property has invalid length (%d bytes) " + "(parent #address-cells == %d, child #address-cells == %d, " + "#size-cells == %d)", ranges, prop->val.len, +@@ -871,7 +892,7 @@ static void check_pci_device_bus_num(str + } else { + cells = (cell_t *)prop->val.val; + min_bus = fdt32_to_cpu(cells[0]); +- max_bus = fdt32_to_cpu(cells[0]); ++ max_bus = fdt32_to_cpu(cells[1]); + } + if ((bus_num < min_bus) || (bus_num > max_bus)) + FAIL_PROP(c, dti, node, prop, "PCI bus number %d out of range, expected (%d - %d)", +@@ -1367,9 +1388,9 @@ static void check_property_phandle_args( + const struct provider *provider) + { + struct node *root = dti->dt; +- int cell, cellsize = 0; ++ unsigned int cell, cellsize = 0; + +- if (prop->val.len % sizeof(cell_t)) { ++ if (!is_multiple_of(prop->val.len, sizeof(cell_t))) { + FAIL_PROP(c, dti, node, prop, + "property size (%d) is invalid, expected multiple of %zu", + prop->val.len, sizeof(cell_t)); +@@ -1379,14 +1400,14 @@ static void check_property_phandle_args( + for (cell = 0; cell < prop->val.len / sizeof(cell_t); cell += cellsize + 1) { + struct node *provider_node; + struct property *cellprop; +- int phandle; ++ cell_t phandle; + + phandle = propval_cell_n(prop, cell); + /* + * Some bindings use a cell value 0 or -1 to skip over optional + * entries when each index position has a specific definition. + */ +- if (phandle == 0 || phandle == -1) { ++ if (!phandle_is_valid(phandle)) { + /* Give up if this is an overlay with external references */ + if (dti->dtsflags & DTSF_PLUGIN) + break; +@@ -1452,7 +1473,8 @@ static void check_provider_cells_propert + } + #define WARNING_PROPERTY_PHANDLE_CELLS(nm, propname, cells_name, ...) \ + static struct provider nm##_provider = { (propname), (cells_name), __VA_ARGS__ }; \ +- WARNING(nm##_property, check_provider_cells_property, &nm##_provider, &phandle_references); ++ WARNING_IF_NOT_CELL(nm##_is_cell, cells_name); \ ++ WARNING(nm##_property, check_provider_cells_property, &nm##_provider, &nm##_is_cell, &phandle_references); + + WARNING_PROPERTY_PHANDLE_CELLS(clocks, "clocks", "#clock-cells"); + WARNING_PROPERTY_PHANDLE_CELLS(cooling_device, "cooling-device", "#cooling-cells"); +@@ -1473,24 +1495,17 @@ WARNING_PROPERTY_PHANDLE_CELLS(thermal_s + + static bool prop_is_gpio(struct property *prop) + { +- char *str; +- + /* + * *-gpios and *-gpio can appear in property names, + * so skip over any false matches (only one known ATM) + */ +- if (strstr(prop->name, "nr-gpio")) ++ if (strends(prop->name, ",nr-gpios")) + return false; + +- str = strrchr(prop->name, '-'); +- if (str) +- str++; +- else +- str = prop->name; +- if (!(streq(str, "gpios") || streq(str, "gpio"))) +- return false; +- +- return true; ++ return strends(prop->name, "-gpios") || ++ streq(prop->name, "gpios") || ++ strends(prop->name, "-gpio") || ++ streq(prop->name, "gpio"); + } + + static void check_gpios_property(struct check *c, +@@ -1525,13 +1540,10 @@ static void check_deprecated_gpio_proper + struct property *prop; + + for_each_property(node, prop) { +- char *str; +- + if (!prop_is_gpio(prop)) + continue; + +- str = strstr(prop->name, "gpio"); +- if (!streq(str, "gpio")) ++ if (!strends(prop->name, "gpio")) + continue; + + FAIL_PROP(c, dti, node, prop, +@@ -1561,21 +1573,106 @@ static void check_interrupt_provider(str + struct node *node) + { + struct property *prop; ++ bool irq_provider = node_is_interrupt_provider(node); + +- if (!node_is_interrupt_provider(node)) ++ prop = get_property(node, "#interrupt-cells"); ++ if (irq_provider && !prop) { ++ FAIL(c, dti, node, ++ "Missing '#interrupt-cells' in interrupt provider"); + return; ++ } + +- prop = get_property(node, "#interrupt-cells"); +- if (!prop) ++ if (!irq_provider && prop) { + FAIL(c, dti, node, +- "Missing #interrupt-cells in interrupt provider"); ++ "'#interrupt-cells' found, but node is not an interrupt provider"); ++ return; ++ } ++} ++WARNING(interrupt_provider, check_interrupt_provider, NULL, &interrupts_extended_is_cell); + +- prop = get_property(node, "#address-cells"); +- if (!prop) ++static void check_interrupt_map(struct check *c, ++ struct dt_info *dti, ++ struct node *node) ++{ ++ struct node *root = dti->dt; ++ struct property *prop, *irq_map_prop; ++ size_t cellsize, cell, map_cells; ++ ++ irq_map_prop = get_property(node, "interrupt-map"); ++ if (!irq_map_prop) ++ return; ++ ++ if (node->addr_cells < 0) { + FAIL(c, dti, node, +- "Missing #address-cells in interrupt provider"); ++ "Missing '#address-cells' in interrupt-map provider"); ++ return; ++ } ++ cellsize = node_addr_cells(node); ++ cellsize += propval_cell(get_property(node, "#interrupt-cells")); ++ ++ prop = get_property(node, "interrupt-map-mask"); ++ if (prop && (prop->val.len != (cellsize * sizeof(cell_t)))) ++ FAIL_PROP(c, dti, node, prop, ++ "property size (%d) is invalid, expected %zu", ++ prop->val.len, cellsize * sizeof(cell_t)); ++ ++ if (!is_multiple_of(irq_map_prop->val.len, sizeof(cell_t))) { ++ FAIL_PROP(c, dti, node, irq_map_prop, ++ "property size (%d) is invalid, expected multiple of %zu", ++ irq_map_prop->val.len, sizeof(cell_t)); ++ return; ++ } ++ ++ map_cells = irq_map_prop->val.len / sizeof(cell_t); ++ for (cell = 0; cell < map_cells; ) { ++ struct node *provider_node; ++ struct property *cellprop; ++ int phandle; ++ size_t parent_cellsize; ++ ++ if ((cell + cellsize) >= map_cells) { ++ FAIL_PROP(c, dti, node, irq_map_prop, ++ "property size (%d) too small, expected > %zu", ++ irq_map_prop->val.len, (cell + cellsize) * sizeof(cell_t)); ++ break; ++ } ++ cell += cellsize; ++ ++ phandle = propval_cell_n(irq_map_prop, cell); ++ if (!phandle_is_valid(phandle)) { ++ /* Give up if this is an overlay with external references */ ++ if (!(dti->dtsflags & DTSF_PLUGIN)) ++ FAIL_PROP(c, dti, node, irq_map_prop, ++ "Cell %zu is not a phandle(%d)", ++ cell, phandle); ++ break; ++ } ++ ++ provider_node = get_node_by_phandle(root, phandle); ++ if (!provider_node) { ++ FAIL_PROP(c, dti, node, irq_map_prop, ++ "Could not get phandle(%d) node for (cell %zu)", ++ phandle, cell); ++ break; ++ } ++ ++ cellprop = get_property(provider_node, "#interrupt-cells"); ++ if (cellprop) { ++ parent_cellsize = propval_cell(cellprop); ++ } else { ++ FAIL(c, dti, node, "Missing property '#interrupt-cells' in node %s or bad phandle (referred from interrupt-map[%zu])", ++ provider_node->fullpath, cell); ++ break; ++ } ++ ++ cellprop = get_property(provider_node, "#address-cells"); ++ if (cellprop) ++ parent_cellsize += propval_cell(cellprop); ++ ++ cell += 1 + parent_cellsize; ++ } + } +-WARNING(interrupt_provider, check_interrupt_provider, NULL); ++WARNING(interrupt_map, check_interrupt_map, NULL, &phandle_references, &addr_size_cells, &interrupt_provider); + + static void check_interrupts_property(struct check *c, + struct dt_info *dti, +@@ -1584,13 +1681,13 @@ static void check_interrupts_property(st + struct node *root = dti->dt; + struct node *irq_node = NULL, *parent = node; + struct property *irq_prop, *prop = NULL; +- int irq_cells, phandle; ++ cell_t irq_cells, phandle; + + irq_prop = get_property(node, "interrupts"); + if (!irq_prop) + return; + +- if (irq_prop->val.len % sizeof(cell_t)) ++ if (!is_multiple_of(irq_prop->val.len, sizeof(cell_t))) + FAIL_PROP(c, dti, node, irq_prop, "size (%d) is invalid, expected multiple of %zu", + irq_prop->val.len, sizeof(cell_t)); + +@@ -1603,7 +1700,7 @@ static void check_interrupts_property(st + prop = get_property(parent, "interrupt-parent"); + if (prop) { + phandle = propval_cell(prop); +- if ((phandle == 0) || (phandle == -1)) { ++ if (!phandle_is_valid(phandle)) { + /* Give up if this is an overlay with + * external references */ + if (dti->dtsflags & DTSF_PLUGIN) +@@ -1639,7 +1736,7 @@ static void check_interrupts_property(st + } + + irq_cells = propval_cell(prop); +- if (irq_prop->val.len % (irq_cells * sizeof(cell_t))) { ++ if (!is_multiple_of(irq_prop->val.len, irq_cells * sizeof(cell_t))) { + FAIL_PROP(c, dti, node, prop, + "size is (%d), expected multiple of %d", + irq_prop->val.len, (int)(irq_cells * sizeof(cell_t))); +@@ -1750,7 +1847,7 @@ WARNING(graph_port, check_graph_port, NU + static struct node *get_remote_endpoint(struct check *c, struct dt_info *dti, + struct node *endpoint) + { +- int phandle; ++ cell_t phandle; + struct node *node; + struct property *prop; + +@@ -1760,7 +1857,7 @@ static struct node *get_remote_endpoint( + + phandle = propval_cell(prop); + /* Give up if this is an overlay with external references */ +- if (phandle == 0 || phandle == -1) ++ if (!phandle_is_valid(phandle)) + return NULL; + + node = get_node_by_phandle(dti->dt, phandle); +@@ -1796,7 +1893,7 @@ WARNING(graph_endpoint, check_graph_endp + static struct check *check_table[] = { + &duplicate_node_names, &duplicate_property_names, + &node_name_chars, &node_name_format, &property_name_chars, +- &name_is_string, &name_properties, ++ &name_is_string, &name_properties, &node_name_vs_property_name, + + &duplicate_label, + +@@ -1804,7 +1901,7 @@ static struct check *check_table[] = { + &phandle_references, &path_references, + &omit_unused_nodes, + +- &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell, ++ &address_cells_is_cell, &size_cells_is_cell, + &device_type_is_string, &model_is_string, &status_is_string, + &label_is_string, + +@@ -1839,26 +1936,43 @@ static struct check *check_table[] = { + &chosen_node_is_root, &chosen_node_bootargs, &chosen_node_stdout_path, + + &clocks_property, ++ &clocks_is_cell, + &cooling_device_property, ++ &cooling_device_is_cell, + &dmas_property, ++ &dmas_is_cell, + &hwlocks_property, ++ &hwlocks_is_cell, + &interrupts_extended_property, ++ &interrupts_extended_is_cell, + &io_channels_property, ++ &io_channels_is_cell, + &iommus_property, ++ &iommus_is_cell, + &mboxes_property, ++ &mboxes_is_cell, + &msi_parent_property, ++ &msi_parent_is_cell, + &mux_controls_property, ++ &mux_controls_is_cell, + &phys_property, ++ &phys_is_cell, + &power_domains_property, ++ &power_domains_is_cell, + &pwms_property, ++ &pwms_is_cell, + &resets_property, ++ &resets_is_cell, + &sound_dai_property, ++ &sound_dai_is_cell, + &thermal_sensors_property, ++ &thermal_sensors_is_cell, + + &deprecated_gpio_property, + &gpios_property, + &interrupts_property, + &interrupt_provider, ++ &interrupt_map, + + &alias_paths, + +@@ -1882,7 +1996,7 @@ static void enable_warning_error(struct + + static void disable_warning_error(struct check *c, bool warn, bool error) + { +- int i; ++ unsigned int i; + + /* Lowering level, also lower it for things this is the prereq + * for */ +@@ -1903,7 +2017,7 @@ static void disable_warning_error(struct + + void parse_checks_option(bool warn, bool error, const char *arg) + { +- int i; ++ unsigned int i; + const char *name = arg; + bool enable = true; + +@@ -1930,7 +2044,7 @@ void parse_checks_option(bool warn, bool + + void process_checks(bool force, struct dt_info *dti) + { +- int i; ++ unsigned int i; + int error = 0; + + for (i = 0; i < ARRAY_SIZE(check_table); i++) { +--- a/scripts/dtc/dtc-lexer.l ++++ b/scripts/dtc/dtc-lexer.l +@@ -57,7 +57,7 @@ static void PRINTF(1, 2) lexical_error(c + push_input_file(name); + } + +-<*>^"#"(line)?[ \t]+[0-9]+[ \t]+{STRING}([ \t]+[0-9]+)? { ++<*>^"#"(line)?[ \t]+[0-9]+[ \t]+{STRING}([ \t]+[0-9]+)* { + char *line, *fnstart, *fnend; + struct data fn; + /* skip text before line # */ +--- a/scripts/dtc/dtc.c ++++ b/scripts/dtc/dtc.c +@@ -12,7 +12,7 @@ + * Command line options + */ + int quiet; /* Level of quietness */ +-int reservenum; /* Number of memory reservation slots */ ++unsigned int reservenum;/* Number of memory reservation slots */ + int minsize; /* Minimum blob size */ + int padsize; /* Additional padding to blob */ + int alignsize; /* Additional padding to blob accroding to the alignsize */ +@@ -197,7 +197,7 @@ int main(int argc, char *argv[]) + depname = optarg; + break; + case 'R': +- reservenum = strtol(optarg, NULL, 0); ++ reservenum = strtoul(optarg, NULL, 0); + break; + case 'S': + minsize = strtol(optarg, NULL, 0); +@@ -359,8 +359,6 @@ int main(int argc, char *argv[]) + #endif + } else if (streq(outform, "dtb")) { + dt_to_blob(outf, dti, outversion); +- } else if (streq(outform, "dtbo")) { +- dt_to_blob(outf, dti, outversion); + } else if (streq(outform, "asm")) { + dt_to_asm(outf, dti, outversion); + } else if (streq(outform, "null")) { +--- a/scripts/dtc/dtc.h ++++ b/scripts/dtc/dtc.h +@@ -35,7 +35,7 @@ + * Command line options + */ + extern int quiet; /* Level of quietness */ +-extern int reservenum; /* Number of memory reservation slots */ ++extern unsigned int reservenum; /* Number of memory reservation slots */ + extern int minsize; /* Minimum blob size */ + extern int padsize; /* Additional padding to blob */ + extern int alignsize; /* Additional padding to blob accroding to the alignsize */ +@@ -51,6 +51,11 @@ extern int annotate; /* annotate .dts w + + typedef uint32_t cell_t; + ++static inline bool phandle_is_valid(cell_t phandle) ++{ ++ return phandle != 0 && phandle != ~0U; ++} ++ + static inline uint16_t dtb_ld16(const void *p) + { + const uint8_t *bp = (const uint8_t *)p; +@@ -86,6 +91,16 @@ static inline uint64_t dtb_ld64(const vo + #define streq(a, b) (strcmp((a), (b)) == 0) + #define strstarts(s, prefix) (strncmp((s), (prefix), strlen(prefix)) == 0) + #define strprefixeq(a, n, b) (strlen(b) == (n) && (memcmp(a, b, n) == 0)) ++static inline bool strends(const char *str, const char *suffix) ++{ ++ unsigned int len, suffix_len; ++ ++ len = strlen(str); ++ suffix_len = strlen(suffix); ++ if (len < suffix_len) ++ return false; ++ return streq(str + len - suffix_len, suffix); ++} + + #define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) + +@@ -101,6 +116,12 @@ enum markertype { + TYPE_UINT64, + TYPE_STRING, + }; ++ ++static inline bool is_type_marker(enum markertype type) ++{ ++ return type >= TYPE_UINT8; ++} ++ + extern const char *markername(enum markertype markertype); + + struct marker { +@@ -125,7 +146,22 @@ struct data { + for_each_marker(m) \ + if ((m)->type == (t)) + +-size_t type_marker_length(struct marker *m); ++static inline struct marker *next_type_marker(struct marker *m) ++{ ++ for_each_marker(m) ++ if (is_type_marker(m->type)) ++ break; ++ return m; ++} ++ ++static inline size_t type_marker_length(struct marker *m) ++{ ++ struct marker *next = next_type_marker(m->next); ++ ++ if (next) ++ return next->offset - m->offset; ++ return 0; ++} + + void data_free(struct data d); + +--- a/scripts/dtc/flattree.c ++++ b/scripts/dtc/flattree.c +@@ -124,7 +124,8 @@ static void asm_emit_cell(void *e, cell_ + { + FILE *f = e; + +- fprintf(f, "\t.byte 0x%02x; .byte 0x%02x; .byte 0x%02x; .byte 0x%02x\n", ++ fprintf(f, "\t.byte\t0x%02x\n" "\t.byte\t0x%02x\n" ++ "\t.byte\t0x%02x\n" "\t.byte\t0x%02x\n", + (val >> 24) & 0xff, (val >> 16) & 0xff, + (val >> 8) & 0xff, val & 0xff); + } +@@ -134,9 +135,9 @@ static void asm_emit_string(void *e, con + FILE *f = e; + + if (len != 0) +- fprintf(f, "\t.string\t\"%.*s\"\n", len, str); ++ fprintf(f, "\t.asciz\t\"%.*s\"\n", len, str); + else +- fprintf(f, "\t.string\t\"%s\"\n", str); ++ fprintf(f, "\t.asciz\t\"%s\"\n", str); + } + + static void asm_emit_align(void *e, int a) +@@ -295,7 +296,7 @@ static struct data flatten_reserve_list( + { + struct reserve_info *re; + struct data d = empty_data; +- int j; ++ unsigned int j; + + for (re = reservelist; re; re = re->next) { + d = data_append_re(d, re->address, re->size); +@@ -438,7 +439,7 @@ static void dump_stringtable_asm(FILE *f + + while (p < (strbuf.val + strbuf.len)) { + len = strlen(p); +- fprintf(f, "\t.string \"%s\"\n", p); ++ fprintf(f, "\t.asciz \"%s\"\n", p); + p += len+1; + } + } +--- a/scripts/dtc/libfdt/fdt.c ++++ b/scripts/dtc/libfdt/fdt.c +@@ -90,6 +90,10 @@ int fdt_check_header(const void *fdt) + { + size_t hdrsize; + ++ /* The device tree must be at an 8-byte aligned address */ ++ if ((uintptr_t)fdt & 7) ++ return -FDT_ERR_ALIGNMENT; ++ + if (fdt_magic(fdt) != FDT_MAGIC) + return -FDT_ERR_BADMAGIC; + if (!can_assume(LATEST)) { +--- a/scripts/dtc/libfdt/fdt_rw.c ++++ b/scripts/dtc/libfdt/fdt_rw.c +@@ -349,7 +349,10 @@ int fdt_add_subnode_namelen(void *fdt, i + return offset; + + /* Try to place the new node after the parent's properties */ +- fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */ ++ tag = fdt_next_tag(fdt, parentoffset, &nextoffset); ++ /* the fdt_subnode_offset_namelen() should ensure this never hits */ ++ if (!can_assume(LIBFDT_FLAWLESS) && (tag != FDT_BEGIN_NODE)) ++ return -FDT_ERR_INTERNAL; + do { + offset = nextoffset; + tag = fdt_next_tag(fdt, offset, &nextoffset); +@@ -391,7 +394,9 @@ int fdt_del_node(void *fdt, int nodeoffs + } + + static void fdt_packblocks_(const char *old, char *new, +- int mem_rsv_size, int struct_size) ++ int mem_rsv_size, ++ int struct_size, ++ int strings_size) + { + int mem_rsv_off, struct_off, strings_off; + +@@ -406,8 +411,7 @@ static void fdt_packblocks_(const char * + fdt_set_off_dt_struct(new, struct_off); + fdt_set_size_dt_struct(new, struct_size); + +- memmove(new + strings_off, old + fdt_off_dt_strings(old), +- fdt_size_dt_strings(old)); ++ memmove(new + strings_off, old + fdt_off_dt_strings(old), strings_size); + fdt_set_off_dt_strings(new, strings_off); + fdt_set_size_dt_strings(new, fdt_size_dt_strings(old)); + } +@@ -467,7 +471,8 @@ int fdt_open_into(const void *fdt, void + return -FDT_ERR_NOSPACE; + } + +- fdt_packblocks_(fdt, tmp, mem_rsv_size, struct_size); ++ fdt_packblocks_(fdt, tmp, mem_rsv_size, struct_size, ++ fdt_size_dt_strings(fdt)); + memmove(buf, tmp, newsize); + + fdt_set_magic(buf, FDT_MAGIC); +@@ -487,7 +492,8 @@ int fdt_pack(void *fdt) + + mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) + * sizeof(struct fdt_reserve_entry); +- fdt_packblocks_(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt)); ++ fdt_packblocks_(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt), ++ fdt_size_dt_strings(fdt)); + fdt_set_totalsize(fdt, fdt_data_size_(fdt)); + + return 0; +--- a/scripts/dtc/libfdt/fdt_strerror.c ++++ b/scripts/dtc/libfdt/fdt_strerror.c +@@ -39,6 +39,7 @@ static struct fdt_errtabent fdt_errtable + FDT_ERRTABENT(FDT_ERR_BADOVERLAY), + FDT_ERRTABENT(FDT_ERR_NOPHANDLES), + FDT_ERRTABENT(FDT_ERR_BADFLAGS), ++ FDT_ERRTABENT(FDT_ERR_ALIGNMENT), + }; + #define FDT_ERRTABSIZE ((int)(sizeof(fdt_errtable) / sizeof(fdt_errtable[0]))) + +--- a/scripts/dtc/libfdt/libfdt.h ++++ b/scripts/dtc/libfdt/libfdt.h +@@ -131,6 +131,13 @@ uint32_t fdt_next_tag(const void *fdt, i + * to work even with unaligned pointers on platforms (such as ARMv5) that don't + * like unaligned loads and stores. + */ ++static inline uint16_t fdt16_ld(const fdt16_t *p) ++{ ++ const uint8_t *bp = (const uint8_t *)p; ++ ++ return ((uint16_t)bp[0] << 8) | bp[1]; ++} ++ + static inline uint32_t fdt32_ld(const fdt32_t *p) + { + const uint8_t *bp = (const uint8_t *)p; +--- a/scripts/dtc/livetree.c ++++ b/scripts/dtc/livetree.c +@@ -526,7 +526,7 @@ struct node *get_node_by_path(struct nod + p = strchr(path, '/'); + + for_each_child(tree, child) { +- if (p && strprefixeq(path, p - path, child->name)) ++ if (p && strprefixeq(path, (size_t)(p - path), child->name)) + return get_node_by_path(child, p+1); + else if (!p && streq(path, child->name)) + return child; +@@ -559,7 +559,7 @@ struct node *get_node_by_phandle(struct + { + struct node *child, *node; + +- if ((phandle == 0) || (phandle == -1)) { ++ if (!phandle_is_valid(phandle)) { + assert(generate_fixups); + return NULL; + } +@@ -594,7 +594,7 @@ cell_t get_node_phandle(struct node *roo + static cell_t phandle = 1; /* FIXME: ick, static local */ + struct data d = empty_data; + +- if ((node->phandle != 0) && (node->phandle != -1)) ++ if (phandle_is_valid(node->phandle)) + return node->phandle; + + while (get_node_by_phandle(root, phandle)) +--- a/scripts/dtc/treesource.c ++++ b/scripts/dtc/treesource.c +@@ -124,27 +124,6 @@ static void write_propval_int(FILE *f, c + } + } + +-static bool has_data_type_information(struct marker *m) +-{ +- return m->type >= TYPE_UINT8; +-} +- +-static struct marker *next_type_marker(struct marker *m) +-{ +- while (m && !has_data_type_information(m)) +- m = m->next; +- return m; +-} +- +-size_t type_marker_length(struct marker *m) +-{ +- struct marker *next = next_type_marker(m->next); +- +- if (next) +- return next->offset - m->offset; +- return 0; +-} +- + static const char *delim_start[] = { + [TYPE_UINT8] = "[", + [TYPE_UINT16] = "/bits/ 16 <", +@@ -229,26 +208,39 @@ static void write_propval(FILE *f, struc + size_t chunk_len = (m->next ? m->next->offset : len) - m->offset; + size_t data_len = type_marker_length(m) ? : len - m->offset; + const char *p = &prop->val.val[m->offset]; ++ struct marker *m_phandle; + +- if (has_data_type_information(m)) { ++ if (is_type_marker(m->type)) { + emit_type = m->type; + fprintf(f, " %s", delim_start[emit_type]); + } else if (m->type == LABEL) + fprintf(f, " %s:", m->ref); +- else if (m->offset) +- fputc(' ', f); + +- if (emit_type == TYPE_NONE) { +- assert(chunk_len == 0); ++ if (emit_type == TYPE_NONE || chunk_len == 0) + continue; +- } + + switch(emit_type) { + case TYPE_UINT16: + write_propval_int(f, p, chunk_len, 2); + break; + case TYPE_UINT32: +- write_propval_int(f, p, chunk_len, 4); ++ m_phandle = prop->val.markers; ++ for_each_marker_of_type(m_phandle, REF_PHANDLE) ++ if (m->offset == m_phandle->offset) ++ break; ++ ++ if (m_phandle) { ++ if (m_phandle->ref[0] == '/') ++ fprintf(f, "&{%s}", m_phandle->ref); ++ else ++ fprintf(f, "&%s", m_phandle->ref); ++ if (chunk_len > 4) { ++ fputc(' ', f); ++ write_propval_int(f, p + 4, chunk_len - 4, 4); ++ } ++ } else { ++ write_propval_int(f, p, chunk_len, 4); ++ } + break; + case TYPE_UINT64: + write_propval_int(f, p, chunk_len, 8); +--- a/scripts/dtc/util.h ++++ b/scripts/dtc/util.h +@@ -13,10 +13,10 @@ + */ + + #ifdef __GNUC__ +-#ifdef __clang__ +-#define PRINTF(i, j) __attribute__((format (printf, i, j))) +-#else ++#if __GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) + #define PRINTF(i, j) __attribute__((format (gnu_printf, i, j))) ++#else ++#define PRINTF(i, j) __attribute__((format (printf, i, j))) + #endif + #define NORETURN __attribute__((noreturn)) + #else +--- a/scripts/dtc/version_gen.h ++++ b/scripts/dtc/version_gen.h +@@ -1 +1 @@ +-#define DTC_VERSION "DTC 1.6.0-g183df9e9" ++#define DTC_VERSION "DTC 1.6.1-g0a3a9d34" +--- a/scripts/dtc/yamltree.c ++++ b/scripts/dtc/yamltree.c +@@ -29,11 +29,12 @@ char *yaml_error_name[] = { + (emitter)->problem, __func__, __LINE__); \ + }) + +-static void yaml_propval_int(yaml_emitter_t *emitter, struct marker *markers, char *data, unsigned int len, int width) ++static void yaml_propval_int(yaml_emitter_t *emitter, struct marker *markers, ++ char *data, unsigned int seq_offset, unsigned int len, int width) + { + yaml_event_t event; + void *tag; +- unsigned int off, start_offset = markers->offset; ++ unsigned int off; + + switch(width) { + case 1: tag = "!u8"; break; +@@ -66,7 +67,7 @@ static void yaml_propval_int(yaml_emitte + m = markers; + is_phandle = false; + for_each_marker_of_type(m, REF_PHANDLE) { +- if (m->offset == (start_offset + off)) { ++ if (m->offset == (seq_offset + off)) { + is_phandle = true; + break; + } +@@ -114,6 +115,7 @@ static void yaml_propval(yaml_emitter_t + yaml_event_t event; + unsigned int len = prop->val.len; + struct marker *m = prop->val.markers; ++ struct marker *markers = prop->val.markers; + + /* Emit the property name */ + yaml_scalar_event_initialize(&event, NULL, +@@ -151,19 +153,19 @@ static void yaml_propval(yaml_emitter_t + + switch(m->type) { + case TYPE_UINT16: +- yaml_propval_int(emitter, m, data, chunk_len, 2); ++ yaml_propval_int(emitter, markers, data, m->offset, chunk_len, 2); + break; + case TYPE_UINT32: +- yaml_propval_int(emitter, m, data, chunk_len, 4); ++ yaml_propval_int(emitter, markers, data, m->offset, chunk_len, 4); + break; + case TYPE_UINT64: +- yaml_propval_int(emitter, m, data, chunk_len, 8); ++ yaml_propval_int(emitter, markers, data, m->offset, chunk_len, 8); + break; + case TYPE_STRING: + yaml_propval_string(emitter, data, chunk_len); + break; + default: +- yaml_propval_int(emitter, m, data, chunk_len, 1); ++ yaml_propval_int(emitter, markers, data, m->offset, chunk_len, 1); + break; + } + } diff --git a/target/linux/generic/backport-5.15/300-v5.18-pinctrl-qcom-Return--EINVAL-for-setting-affinity-if-no-IRQ-parent.patch b/target/linux/generic/backport-5.15/300-v5.18-pinctrl-qcom-Return--EINVAL-for-setting-affinity-if-no-IRQ-parent.patch new file mode 100644 index 0000000000..18a8752a18 --- /dev/null +++ b/target/linux/generic/backport-5.15/300-v5.18-pinctrl-qcom-Return--EINVAL-for-setting-affinity-if-no-IRQ-parent.patch @@ -0,0 +1,48 @@ +From: Manivannan Sadhasivam +To: linus.walleij@linaro.org +Cc: bjorn.andersson@linaro.org, dianders@chromium.org, + linux-arm-msm@vger.kernel.org, linux-gpio@vger.kernel.org, + linux-kernel@vger.kernel.org, + Manivannan Sadhasivam +Subject: [PATCH] pinctrl: qcom: Return -EINVAL for setting affinity if no IRQ + parent +Date: Thu, 13 Jan 2022 21:56:17 +0530 +Message-Id: <20220113162617.131697-1-manivannan.sadhasivam@linaro.org> + +The MSM GPIO IRQ controller relies on the parent IRQ controller to set the +CPU affinity for the IRQ. And this is only valid if there is any wakeup +parent available and defined in DT. + +For the case of no parent IRQ controller defined in DT, +msm_gpio_irq_set_affinity() and msm_gpio_irq_set_vcpu_affinity() should +return -EINVAL instead of 0 as the affinity can't be set. + +Otherwise, below warning will be printed by genirq: + +genirq: irq_chip msmgpio did not update eff. affinity mask of irq 70 + +Signed-off-by: Manivannan Sadhasivam +--- + drivers/pinctrl/qcom/pinctrl-msm.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/pinctrl/qcom/pinctrl-msm.c ++++ b/drivers/pinctrl/qcom/pinctrl-msm.c +@@ -1157,7 +1157,7 @@ static int msm_gpio_irq_set_affinity(str + if (d->parent_data && test_bit(d->hwirq, pctrl->skip_wake_irqs)) + return irq_chip_set_affinity_parent(d, dest, force); + +- return 0; ++ return -EINVAL; + } + + static int msm_gpio_irq_set_vcpu_affinity(struct irq_data *d, void *vcpu_info) +@@ -1168,7 +1168,7 @@ static int msm_gpio_irq_set_vcpu_affinit + if (d->parent_data && test_bit(d->hwirq, pctrl->skip_wake_irqs)) + return irq_chip_set_vcpu_affinity_parent(d, vcpu_info); + +- return 0; ++ return -EINVAL; + } + + static void msm_gpio_irq_handler(struct irq_desc *desc) diff --git a/target/linux/generic/backport-5.15/301-v5.16-soc-qcom-smem-Support-reserved-memory-description.patch b/target/linux/generic/backport-5.15/301-v5.16-soc-qcom-smem-Support-reserved-memory-description.patch new file mode 100644 index 0000000000..ee0bf9309f --- /dev/null +++ b/target/linux/generic/backport-5.15/301-v5.16-soc-qcom-smem-Support-reserved-memory-description.patch @@ -0,0 +1,166 @@ +From b5af64fceb04dc298c5e69c517b4d83893ff060b Mon Sep 17 00:00:00 2001 +From: Bjorn Andersson +Date: Thu, 30 Sep 2021 11:21:10 -0700 +Subject: [PATCH 1/1] soc: qcom: smem: Support reserved-memory description + +Practically all modern Qualcomm platforms has a single reserved-memory +region for SMEM. So rather than having to describe SMEM in the form of a +node with a reference to a reserved-memory node, allow the SMEM device +to be instantiated directly from the reserved-memory node. + +The current means of falling back to dereferencing the "memory-region" +is kept as a fallback, if it's determined that the SMEM node is a +reserved-memory node. + +The "qcom,smem" compatible is added to the reserved_mem_matches list, to +allow the reserved-memory device to be probed. + +In order to retain the readability of the code, the resolution of +resources is split from the actual ioremapping. + +Signed-off-by: Bjorn Andersson +Acked-by: Rob Herring +Reviewed-by: Vladimir Zapolskiy +Link: https://lore.kernel.org/r/20210930182111.57353-4-bjorn.andersson@linaro.org +--- + drivers/of/platform.c | 1 + + drivers/soc/qcom/smem.c | 57 ++++++++++++++++++++++++++++------------- + 2 files changed, 40 insertions(+), 18 deletions(-) + +--- a/drivers/of/platform.c ++++ b/drivers/of/platform.c +@@ -509,6 +509,7 @@ EXPORT_SYMBOL_GPL(of_platform_default_po + static const struct of_device_id reserved_mem_matches[] = { + { .compatible = "qcom,rmtfs-mem" }, + { .compatible = "qcom,cmd-db" }, ++ { .compatible = "qcom,smem" }, + { .compatible = "ramoops" }, + { .compatible = "nvmem-rmem" }, + {} +--- a/drivers/soc/qcom/smem.c ++++ b/drivers/soc/qcom/smem.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -240,7 +241,7 @@ static const u8 SMEM_INFO_MAGIC[] = { 0x + * @size: size of the memory region + */ + struct smem_region { +- u32 aux_base; ++ phys_addr_t aux_base; + void __iomem *virt_base; + size_t size; + }; +@@ -499,7 +500,7 @@ static void *qcom_smem_get_global(struct + for (i = 0; i < smem->num_regions; i++) { + region = &smem->regions[i]; + +- if (region->aux_base == aux_base || !aux_base) { ++ if ((u32)region->aux_base == aux_base || !aux_base) { + if (size != NULL) + *size = le32_to_cpu(entry->size); + return region->virt_base + le32_to_cpu(entry->offset); +@@ -664,7 +665,7 @@ phys_addr_t qcom_smem_virt_to_phys(void + if (p < region->virt_base + region->size) { + u64 offset = p - region->virt_base; + +- return (phys_addr_t)region->aux_base + offset; ++ return region->aux_base + offset; + } + } + +@@ -863,12 +864,12 @@ qcom_smem_enumerate_partitions(struct qc + return 0; + } + +-static int qcom_smem_map_memory(struct qcom_smem *smem, struct device *dev, +- const char *name, int i) ++static int qcom_smem_resolve_mem(struct qcom_smem *smem, const char *name, ++ struct smem_region *region) + { ++ struct device *dev = smem->dev; + struct device_node *np; + struct resource r; +- resource_size_t size; + int ret; + + np = of_parse_phandle(dev->of_node, name, 0); +@@ -881,13 +882,9 @@ static int qcom_smem_map_memory(struct q + of_node_put(np); + if (ret) + return ret; +- size = resource_size(&r); + +- smem->regions[i].virt_base = devm_ioremap_wc(dev, r.start, size); +- if (!smem->regions[i].virt_base) +- return -ENOMEM; +- smem->regions[i].aux_base = (u32)r.start; +- smem->regions[i].size = size; ++ region->aux_base = r.start; ++ region->size = resource_size(&r); + + return 0; + } +@@ -895,12 +892,14 @@ static int qcom_smem_map_memory(struct q + static int qcom_smem_probe(struct platform_device *pdev) + { + struct smem_header *header; ++ struct reserved_mem *rmem; + struct qcom_smem *smem; + size_t array_size; + int num_regions; + int hwlock_id; + u32 version; + int ret; ++ int i; + + num_regions = 1; + if (of_find_property(pdev->dev.of_node, "qcom,rpm-msg-ram", NULL)) +@@ -914,13 +913,35 @@ static int qcom_smem_probe(struct platfo + smem->dev = &pdev->dev; + smem->num_regions = num_regions; + +- ret = qcom_smem_map_memory(smem, &pdev->dev, "memory-region", 0); +- if (ret) +- return ret; +- +- if (num_regions > 1 && (ret = qcom_smem_map_memory(smem, &pdev->dev, +- "qcom,rpm-msg-ram", 1))) +- return ret; ++ rmem = of_reserved_mem_lookup(pdev->dev.of_node); ++ if (rmem) { ++ smem->regions[0].aux_base = rmem->base; ++ smem->regions[0].size = rmem->size; ++ } else { ++ /* ++ * Fall back to the memory-region reference, if we're not a ++ * reserved-memory node. ++ */ ++ ret = qcom_smem_resolve_mem(smem, "memory-region", &smem->regions[0]); ++ if (ret) ++ return ret; ++ } ++ ++ if (num_regions > 1) { ++ ret = qcom_smem_resolve_mem(smem, "qcom,rpm-msg-ram", &smem->regions[1]); ++ if (ret) ++ return ret; ++ } ++ ++ for (i = 0; i < num_regions; i++) { ++ smem->regions[i].virt_base = devm_ioremap_wc(&pdev->dev, ++ smem->regions[i].aux_base, ++ smem->regions[i].size); ++ if (!smem->regions[i].virt_base) { ++ dev_err(&pdev->dev, "failed to remap %pa\n", &smem->regions[i].aux_base); ++ return -ENOMEM; ++ } ++ } + + header = smem->regions[0].virt_base; + if (le32_to_cpu(header->initialized) != 1 || diff --git a/target/linux/generic/backport-5.15/302-v5.16-watchdog-bcm63xx_wdt-fix-fallthrough-warning.patch b/target/linux/generic/backport-5.15/302-v5.16-watchdog-bcm63xx_wdt-fix-fallthrough-warning.patch new file mode 100644 index 0000000000..84ae5a7fc7 --- /dev/null +++ b/target/linux/generic/backport-5.15/302-v5.16-watchdog-bcm63xx_wdt-fix-fallthrough-warning.patch @@ -0,0 +1,33 @@ +From ee1a0696934a8b77a6a2098f92832c46d34ec5da Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Wed, 27 Oct 2021 14:31:35 +0200 +Subject: [PATCH] watchdog: bcm63xx_wdt: fix fallthrough warning +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This fixes: +drivers/watchdog/bcm63xx_wdt.c: In function 'bcm63xx_wdt_ioctl': +drivers/watchdog/bcm63xx_wdt.c:208:17: warning: this statement may fall through [-Wimplicit-fallthrough=] + +Signed-off-by: Rafał Miłecki +Reviewed-by: Florian Fainelli +Reviewed-by: Guenter Roeck +Link: https://lore.kernel.org/r/20211027123135.27458-1-zajec5@gmail.com +Signed-off-by: Guenter Roeck +Signed-off-by: Wim Van Sebroeck +--- + drivers/watchdog/bcm63xx_wdt.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/watchdog/bcm63xx_wdt.c ++++ b/drivers/watchdog/bcm63xx_wdt.c +@@ -207,6 +207,8 @@ static long bcm63xx_wdt_ioctl(struct fil + + bcm63xx_wdt_pet(); + ++ fallthrough; ++ + case WDIOC_GETTIMEOUT: + return put_user(wdt_time, p); + diff --git a/target/linux/generic/backport-5.15/330-v5.16-01-MIPS-kernel-proc-add-CPU-option-reporting.patch b/target/linux/generic/backport-5.15/330-v5.16-01-MIPS-kernel-proc-add-CPU-option-reporting.patch new file mode 100644 index 0000000000..c66a3f11b4 --- /dev/null +++ b/target/linux/generic/backport-5.15/330-v5.16-01-MIPS-kernel-proc-add-CPU-option-reporting.patch @@ -0,0 +1,162 @@ +From 626bfa03729959ea9917181fb3d8ffaa1594d02a Mon Sep 17 00:00:00 2001 +From: Hauke Mehrtens +Date: Wed, 13 Oct 2021 22:40:18 -0700 +Subject: [PATCH 1/1] MIPS: kernel: proc: add CPU option reporting + +Many MIPS CPUs have optional CPU features which are not activated for +all CPU cores. Print the CPU options, which are implemented in the core, +in /proc/cpuinfo. This makes it possible to see which features are +supported and which are not supported. This should cover all standard +MIPS extensions. Before, it only printed information about the main MIPS +ASEs. + +Signed-off-by: Hauke Mehrtens + +Changes from original patch[0]: +- Remove cpu_has_6k_cache and cpu_has_8k_cache due to commit 6ce91ba8589a + ("MIPS: Remove cpu_has_6k_cache and cpu_has_8k_cache in cpu_cache_init()") +- Add new options: mac2008_only, ftlbparex, gsexcex, mmid, mm_sysad, + mm_full +- Use seq_puts instead of seq_printf as suggested by checkpatch +- Minor commit message reword + +[0]: https://lore.kernel.org/linux-mips/20181223225224.23042-1-hauke@hauke-m.de/ + +Signed-off-by: Ilya Lipnitskiy +Acked-by: Hauke Mehrtens +Signed-off-by: Thomas Bogendoerfer +--- + arch/mips/kernel/proc.c | 122 ++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 122 insertions(+) + +--- a/arch/mips/kernel/proc.c ++++ b/arch/mips/kernel/proc.c +@@ -138,6 +138,128 @@ static int show_cpuinfo(struct seq_file + seq_printf(m, "micromips kernel\t: %s\n", + (read_c0_config3() & MIPS_CONF3_ISA_OE) ? "yes" : "no"); + } ++ ++ seq_puts(m, "Options implemented\t:"); ++ if (cpu_has_tlb) ++ seq_puts(m, " tlb"); ++ if (cpu_has_ftlb) ++ seq_puts(m, " ftlb"); ++ if (cpu_has_tlbinv) ++ seq_puts(m, " tlbinv"); ++ if (cpu_has_segments) ++ seq_puts(m, " segments"); ++ if (cpu_has_rixiex) ++ seq_puts(m, " rixiex"); ++ if (cpu_has_ldpte) ++ seq_puts(m, " ldpte"); ++ if (cpu_has_maar) ++ seq_puts(m, " maar"); ++ if (cpu_has_rw_llb) ++ seq_puts(m, " rw_llb"); ++ if (cpu_has_4kex) ++ seq_puts(m, " 4kex"); ++ if (cpu_has_3k_cache) ++ seq_puts(m, " 3k_cache"); ++ if (cpu_has_4k_cache) ++ seq_puts(m, " 4k_cache"); ++ if (cpu_has_tx39_cache) ++ seq_puts(m, " tx39_cache"); ++ if (cpu_has_octeon_cache) ++ seq_puts(m, " octeon_cache"); ++ if (cpu_has_fpu) ++ seq_puts(m, " fpu"); ++ if (cpu_has_32fpr) ++ seq_puts(m, " 32fpr"); ++ if (cpu_has_cache_cdex_p) ++ seq_puts(m, " cache_cdex_p"); ++ if (cpu_has_cache_cdex_s) ++ seq_puts(m, " cache_cdex_s"); ++ if (cpu_has_prefetch) ++ seq_puts(m, " prefetch"); ++ if (cpu_has_mcheck) ++ seq_puts(m, " mcheck"); ++ if (cpu_has_ejtag) ++ seq_puts(m, " ejtag"); ++ if (cpu_has_llsc) ++ seq_puts(m, " llsc"); ++ if (cpu_has_guestctl0ext) ++ seq_puts(m, " guestctl0ext"); ++ if (cpu_has_guestctl1) ++ seq_puts(m, " guestctl1"); ++ if (cpu_has_guestctl2) ++ seq_puts(m, " guestctl2"); ++ if (cpu_has_guestid) ++ seq_puts(m, " guestid"); ++ if (cpu_has_drg) ++ seq_puts(m, " drg"); ++ if (cpu_has_rixi) ++ seq_puts(m, " rixi"); ++ if (cpu_has_lpa) ++ seq_puts(m, " lpa"); ++ if (cpu_has_mvh) ++ seq_puts(m, " mvh"); ++ if (cpu_has_vtag_icache) ++ seq_puts(m, " vtag_icache"); ++ if (cpu_has_dc_aliases) ++ seq_puts(m, " dc_aliases"); ++ if (cpu_has_ic_fills_f_dc) ++ seq_puts(m, " ic_fills_f_dc"); ++ if (cpu_has_pindexed_dcache) ++ seq_puts(m, " pindexed_dcache"); ++ if (cpu_has_userlocal) ++ seq_puts(m, " userlocal"); ++ if (cpu_has_nofpuex) ++ seq_puts(m, " nofpuex"); ++ if (cpu_has_vint) ++ seq_puts(m, " vint"); ++ if (cpu_has_veic) ++ seq_puts(m, " veic"); ++ if (cpu_has_inclusive_pcaches) ++ seq_puts(m, " inclusive_pcaches"); ++ if (cpu_has_perf_cntr_intr_bit) ++ seq_puts(m, " perf_cntr_intr_bit"); ++ if (cpu_has_ufr) ++ seq_puts(m, " ufr"); ++ if (cpu_has_fre) ++ seq_puts(m, " fre"); ++ if (cpu_has_cdmm) ++ seq_puts(m, " cdmm"); ++ if (cpu_has_small_pages) ++ seq_puts(m, " small_pages"); ++ if (cpu_has_nan_legacy) ++ seq_puts(m, " nan_legacy"); ++ if (cpu_has_nan_2008) ++ seq_puts(m, " nan_2008"); ++ if (cpu_has_ebase_wg) ++ seq_puts(m, " ebase_wg"); ++ if (cpu_has_badinstr) ++ seq_puts(m, " badinstr"); ++ if (cpu_has_badinstrp) ++ seq_puts(m, " badinstrp"); ++ if (cpu_has_contextconfig) ++ seq_puts(m, " contextconfig"); ++ if (cpu_has_perf) ++ seq_puts(m, " perf"); ++ if (cpu_has_mac2008_only) ++ seq_puts(m, " mac2008_only"); ++ if (cpu_has_ftlbparex) ++ seq_puts(m, " ftlbparex"); ++ if (cpu_has_gsexcex) ++ seq_puts(m, " gsexcex"); ++ if (cpu_has_shared_ftlb_ram) ++ seq_puts(m, " shared_ftlb_ram"); ++ if (cpu_has_shared_ftlb_entries) ++ seq_puts(m, " shared_ftlb_entries"); ++ if (cpu_has_mipsmt_pertccounters) ++ seq_puts(m, " mipsmt_pertccounters"); ++ if (cpu_has_mmid) ++ seq_puts(m, " mmid"); ++ if (cpu_has_mm_sysad) ++ seq_puts(m, " mm_sysad"); ++ if (cpu_has_mm_full) ++ seq_puts(m, " mm_full"); ++ seq_puts(m, "\n"); ++ + seq_printf(m, "shadow register sets\t: %d\n", + cpu_data[n].srsets); + seq_printf(m, "kscratch registers\t: %d\n", diff --git a/target/linux/generic/backport-5.15/330-v5.16-02-MIPS-Fix-using-smp_processor_id-in-preemptible-in-sh.patch b/target/linux/generic/backport-5.15/330-v5.16-02-MIPS-Fix-using-smp_processor_id-in-preemptible-in-sh.patch new file mode 100644 index 0000000000..6caf7d06d4 --- /dev/null +++ b/target/linux/generic/backport-5.15/330-v5.16-02-MIPS-Fix-using-smp_processor_id-in-preemptible-in-sh.patch @@ -0,0 +1,62 @@ +From 1cab5bd69eb1f995ced2d7576cb15f8a8941fd85 Mon Sep 17 00:00:00 2001 +From: Tiezhu Yang +Date: Thu, 25 Nov 2021 19:39:32 +0800 +Subject: [PATCH 1/1] MIPS: Fix using smp_processor_id() in preemptible in + show_cpuinfo() + +There exists the following issue under DEBUG_PREEMPT: + + BUG: using smp_processor_id() in preemptible [00000000] code: systemd/1 + caller is show_cpuinfo+0x460/0xea0 + ... + Call Trace: + [] show_stack+0x94/0x128 + [] dump_stack_lvl+0x94/0xd8 + [] check_preemption_disabled+0x104/0x110 + [] show_cpuinfo+0x460/0xea0 + [] seq_read_iter+0xfc/0x4f8 + [] new_sync_read+0x110/0x1b8 + [] vfs_read+0x1b4/0x1d0 + [] ksys_read+0xd0/0x110 + [] syscall_common+0x34/0x58 + +We can see the following call trace: + show_cpuinfo() + cpu_has_fpu + current_cpu_data + smp_processor_id() + + $ addr2line -f -e vmlinux 0xffffffff802209c8 + show_cpuinfo + arch/mips/kernel/proc.c:188 + + $ head -188 arch/mips/kernel/proc.c | tail -1 + if (cpu_has_fpu) + + arch/mips/include/asm/cpu-features.h + # define cpu_has_fpu (current_cpu_data.options & MIPS_CPU_FPU) + + arch/mips/include/asm/cpu-info.h + #define current_cpu_data cpu_data[smp_processor_id()] + +Based on the above analysis, fix the issue by using raw_cpu_has_fpu +which calls raw_smp_processor_id() in show_cpuinfo(). + +Fixes: 626bfa037299 ("MIPS: kernel: proc: add CPU option reporting") +Signed-off-by: Tiezhu Yang +Signed-off-by: Thomas Bogendoerfer +--- + arch/mips/kernel/proc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/mips/kernel/proc.c ++++ b/arch/mips/kernel/proc.c +@@ -166,7 +166,7 @@ static int show_cpuinfo(struct seq_file + seq_puts(m, " tx39_cache"); + if (cpu_has_octeon_cache) + seq_puts(m, " octeon_cache"); +- if (cpu_has_fpu) ++ if (raw_cpu_has_fpu) + seq_puts(m, " fpu"); + if (cpu_has_32fpr) + seq_puts(m, " 32fpr"); diff --git a/target/linux/generic/backport-5.15/331-v5.19-mtd-spinand-Add-support-for-XTX-XT26G0xA.patch b/target/linux/generic/backport-5.15/331-v5.19-mtd-spinand-Add-support-for-XTX-XT26G0xA.patch new file mode 100644 index 0000000000..74346ace45 --- /dev/null +++ b/target/linux/generic/backport-5.15/331-v5.19-mtd-spinand-Add-support-for-XTX-XT26G0xA.patch @@ -0,0 +1,186 @@ +From f4c5c7f9d2e5ab005d57826b740b694b042a737c Mon Sep 17 00:00:00 2001 +From: Felix Matouschek +Date: Mon, 18 Apr 2022 15:28:03 +0200 +Subject: [PATCH 1/1] mtd: spinand: Add support for XTX XT26G0xA + +Add support for XTX Technology XT26G01AXXXXX, XTX26G02AXXXXX and +XTX26G04AXXXXX SPI NAND. + +These are 3V, 1G/2G/4Gbit serial SLC NAND flash devices with on-die ECC +(8bit strength per 512bytes). + +Tested on Teltonika RUTX10 flashed with libreCMC. + +Links: + - http://www.xtxtech.com/download/?AId=225 + - https://datasheet.lcsc.com/szlcsc/2005251034_XTX-XT26G01AWSEGA_C558841.pdf +Signed-off-by: Felix Matouschek +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220418132803.664103-1-felix@matouschek.org +--- + drivers/mtd/nand/spi/Makefile | 2 +- + drivers/mtd/nand/spi/core.c | 1 + + drivers/mtd/nand/spi/xtx.c | 129 ++++++++++++++++++++++++++++++++++ + include/linux/mtd/spinand.h | 1 + + 4 files changed, 132 insertions(+), 1 deletion(-) + create mode 100644 drivers/mtd/nand/spi/xtx.c + +--- a/drivers/mtd/nand/spi/Makefile ++++ b/drivers/mtd/nand/spi/Makefile +@@ -1,3 +1,3 @@ + # SPDX-License-Identifier: GPL-2.0 +-spinand-objs := core.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o ++spinand-objs := core.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o xtx.o + obj-$(CONFIG_MTD_SPI_NAND) += spinand.o +--- a/drivers/mtd/nand/spi/core.c ++++ b/drivers/mtd/nand/spi/core.c +@@ -902,6 +902,7 @@ static const struct spinand_manufacturer + ¶gon_spinand_manufacturer, + &toshiba_spinand_manufacturer, + &winbond_spinand_manufacturer, ++ &xtx_spinand_manufacturer, + }; + + static int spinand_manufacturer_match(struct spinand_device *spinand, +--- /dev/null ++++ b/drivers/mtd/nand/spi/xtx.c +@@ -0,0 +1,129 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Author: ++ * Felix Matouschek ++ */ ++ ++#include ++#include ++#include ++ ++#define SPINAND_MFR_XTX 0x0B ++ ++#define XT26G0XA_STATUS_ECC_MASK GENMASK(5, 2) ++#define XT26G0XA_STATUS_ECC_NO_DETECTED (0 << 2) ++#define XT26G0XA_STATUS_ECC_8_CORRECTED (3 << 4) ++#define XT26G0XA_STATUS_ECC_UNCOR_ERROR (2 << 4) ++ ++static SPINAND_OP_VARIANTS(read_cache_variants, ++ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); ++ ++static SPINAND_OP_VARIANTS(write_cache_variants, ++ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), ++ SPINAND_PROG_LOAD(true, 0, NULL, 0)); ++ ++static SPINAND_OP_VARIANTS(update_cache_variants, ++ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), ++ SPINAND_PROG_LOAD(false, 0, NULL, 0)); ++ ++static int xt26g0xa_ooblayout_ecc(struct mtd_info *mtd, int section, ++ struct mtd_oob_region *region) ++{ ++ if (section) ++ return -ERANGE; ++ ++ region->offset = 48; ++ region->length = 16; ++ ++ return 0; ++} ++ ++static int xt26g0xa_ooblayout_free(struct mtd_info *mtd, int section, ++ struct mtd_oob_region *region) ++{ ++ if (section) ++ return -ERANGE; ++ ++ region->offset = 1; ++ region->length = 47; ++ ++ return 0; ++} ++ ++static const struct mtd_ooblayout_ops xt26g0xa_ooblayout = { ++ .ecc = xt26g0xa_ooblayout_ecc, ++ .free = xt26g0xa_ooblayout_free, ++}; ++ ++static int xt26g0xa_ecc_get_status(struct spinand_device *spinand, ++ u8 status) ++{ ++ status = status & XT26G0XA_STATUS_ECC_MASK; ++ ++ switch (status) { ++ case XT26G0XA_STATUS_ECC_NO_DETECTED: ++ return 0; ++ case XT26G0XA_STATUS_ECC_8_CORRECTED: ++ return 8; ++ case XT26G0XA_STATUS_ECC_UNCOR_ERROR: ++ return -EBADMSG; ++ default: ++ break; ++ } ++ ++ /* At this point values greater than (2 << 4) are invalid */ ++ if (status > XT26G0XA_STATUS_ECC_UNCOR_ERROR) ++ return -EINVAL; ++ ++ /* (1 << 2) through (7 << 2) are 1-7 corrected errors */ ++ return status >> 2; ++} ++ ++static const struct spinand_info xtx_spinand_table[] = { ++ SPINAND_INFO("XT26G01A", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xE1), ++ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&xt26g0xa_ooblayout, ++ xt26g0xa_ecc_get_status)), ++ SPINAND_INFO("XT26G02A", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xE2), ++ NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&xt26g0xa_ooblayout, ++ xt26g0xa_ecc_get_status)), ++ SPINAND_INFO("XT26G04A", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xE3), ++ NAND_MEMORG(1, 2048, 64, 128, 2048, 40, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&xt26g0xa_ooblayout, ++ xt26g0xa_ecc_get_status)), ++}; ++ ++static const struct spinand_manufacturer_ops xtx_spinand_manuf_ops = { ++}; ++ ++const struct spinand_manufacturer xtx_spinand_manufacturer = { ++ .id = SPINAND_MFR_XTX, ++ .name = "XTX", ++ .chips = xtx_spinand_table, ++ .nchips = ARRAY_SIZE(xtx_spinand_table), ++ .ops = &xtx_spinand_manuf_ops, ++}; +--- a/include/linux/mtd/spinand.h ++++ b/include/linux/mtd/spinand.h +@@ -266,6 +266,7 @@ extern const struct spinand_manufacturer + extern const struct spinand_manufacturer paragon_spinand_manufacturer; + extern const struct spinand_manufacturer toshiba_spinand_manufacturer; + extern const struct spinand_manufacturer winbond_spinand_manufacturer; ++extern const struct spinand_manufacturer xtx_spinand_manufacturer; + + /** + * struct spinand_op_variants - SPI NAND operation variants diff --git a/target/linux/generic/backport-5.15/344-v5.18-01-phy-marvell-phy-mvebu-a3700-comphy-Remove-port-from-.patch b/target/linux/generic/backport-5.15/344-v5.18-01-phy-marvell-phy-mvebu-a3700-comphy-Remove-port-from-.patch new file mode 100644 index 0000000000..d6c4b4fd1e --- /dev/null +++ b/target/linux/generic/backport-5.15/344-v5.18-01-phy-marvell-phy-mvebu-a3700-comphy-Remove-port-from-.patch @@ -0,0 +1,219 @@ +From 4bf18d5a2dd02db8c5b16a2cfae513510506df5b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Thu, 3 Feb 2022 22:44:40 +0100 +Subject: [PATCH 1/2] phy: marvell: phy-mvebu-a3700-comphy: Remove port from + driver configuration +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Port number is encoded into argument for SMC call. It is zero for SATA, +PCIe and also both USB 3.0 PHYs. It is non-zero only for Ethernet PHY +(incorrectly called SGMII) on lane 0. Ethernet PHY on lane 1 also uses zero +port number. + +So construct "port" bits for SMC call argument can be constructed directly +from PHY type and lane number. + +Change driver code to always pass zero port number for non-ethernet PHYs +and for ethernet PHYs determinate port number from lane number. This +simplifies the driver. + +As port number from DT PHY configuration is not used anymore, remove whole +driver code which parses it. This also simplifies the driver. + +Signed-off-by: Pali Rohár +Signed-off-by: Marek Behún +Reviewed-by: Miquel Raynal +Link: https://lore.kernel.org/r/20220203214444.1508-2-kabel@kernel.org +Signed-off-by: Vinod Koul +--- + drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 62 +++++++++----------- + 1 file changed, 29 insertions(+), 33 deletions(-) + +--- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c ++++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c +@@ -20,7 +20,6 @@ + #include + + #define MVEBU_A3700_COMPHY_LANES 3 +-#define MVEBU_A3700_COMPHY_PORTS 2 + + /* COMPHY Fast SMC function identifiers */ + #define COMPHY_SIP_POWER_ON 0x82000001 +@@ -45,51 +44,47 @@ + #define COMPHY_FW_NET(mode, idx, speed) (COMPHY_FW_MODE(mode) | \ + ((idx) << 8) | \ + ((speed) << 2)) +-#define COMPHY_FW_PCIE(mode, idx, speed, width) (COMPHY_FW_NET(mode, idx, speed) | \ ++#define COMPHY_FW_PCIE(mode, speed, width) (COMPHY_FW_NET(mode, 0, speed) | \ + ((width) << 18)) + + struct mvebu_a3700_comphy_conf { + unsigned int lane; + enum phy_mode mode; + int submode; +- unsigned int port; + u32 fw_mode; + }; + +-#define MVEBU_A3700_COMPHY_CONF(_lane, _mode, _smode, _port, _fw) \ ++#define MVEBU_A3700_COMPHY_CONF(_lane, _mode, _smode, _fw) \ + { \ + .lane = _lane, \ + .mode = _mode, \ + .submode = _smode, \ +- .port = _port, \ + .fw_mode = _fw, \ + } + +-#define MVEBU_A3700_COMPHY_CONF_GEN(_lane, _mode, _port, _fw) \ +- MVEBU_A3700_COMPHY_CONF(_lane, _mode, PHY_INTERFACE_MODE_NA, _port, _fw) ++#define MVEBU_A3700_COMPHY_CONF_GEN(_lane, _mode, _fw) \ ++ MVEBU_A3700_COMPHY_CONF(_lane, _mode, PHY_INTERFACE_MODE_NA, _fw) + +-#define MVEBU_A3700_COMPHY_CONF_ETH(_lane, _smode, _port, _fw) \ +- MVEBU_A3700_COMPHY_CONF(_lane, PHY_MODE_ETHERNET, _smode, _port, _fw) ++#define MVEBU_A3700_COMPHY_CONF_ETH(_lane, _smode, _fw) \ ++ MVEBU_A3700_COMPHY_CONF(_lane, PHY_MODE_ETHERNET, _smode, _fw) + + static const struct mvebu_a3700_comphy_conf mvebu_a3700_comphy_modes[] = { + /* lane 0 */ +- MVEBU_A3700_COMPHY_CONF_GEN(0, PHY_MODE_USB_HOST_SS, 0, ++ MVEBU_A3700_COMPHY_CONF_GEN(0, PHY_MODE_USB_HOST_SS, + COMPHY_FW_MODE_USB3H), +- MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_SGMII, 1, ++ MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_SGMII, + COMPHY_FW_MODE_SGMII), +- MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_2500BASEX, 1, ++ MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_2500BASEX, + COMPHY_FW_MODE_2500BASEX), + /* lane 1 */ +- MVEBU_A3700_COMPHY_CONF_GEN(1, PHY_MODE_PCIE, 0, +- COMPHY_FW_MODE_PCIE), +- MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_SGMII, 0, ++ MVEBU_A3700_COMPHY_CONF_GEN(1, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE), ++ MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_SGMII, + COMPHY_FW_MODE_SGMII), +- MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_2500BASEX, 0, ++ MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_2500BASEX, + COMPHY_FW_MODE_2500BASEX), + /* lane 2 */ +- MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_SATA, 0, +- COMPHY_FW_MODE_SATA), +- MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_USB_HOST_SS, 0, ++ MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_SATA, COMPHY_FW_MODE_SATA), ++ MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_USB_HOST_SS, + COMPHY_FW_MODE_USB3H), + }; + +@@ -98,7 +93,6 @@ struct mvebu_a3700_comphy_lane { + unsigned int id; + enum phy_mode mode; + int submode; +- int port; + }; + + static int mvebu_a3700_comphy_smc(unsigned long function, unsigned long lane, +@@ -120,7 +114,7 @@ static int mvebu_a3700_comphy_smc(unsign + } + } + +-static int mvebu_a3700_comphy_get_fw_mode(int lane, int port, ++static int mvebu_a3700_comphy_get_fw_mode(int lane, + enum phy_mode mode, + int submode) + { +@@ -132,7 +126,6 @@ static int mvebu_a3700_comphy_get_fw_mod + + for (i = 0; i < n; i++) { + if (mvebu_a3700_comphy_modes[i].lane == lane && +- mvebu_a3700_comphy_modes[i].port == port && + mvebu_a3700_comphy_modes[i].mode == mode && + mvebu_a3700_comphy_modes[i].submode == submode) + break; +@@ -153,7 +146,7 @@ static int mvebu_a3700_comphy_set_mode(s + if (submode == PHY_INTERFACE_MODE_1000BASEX) + submode = PHY_INTERFACE_MODE_SGMII; + +- fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, lane->port, mode, ++ fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, mode, + submode); + if (fw_mode < 0) { + dev_err(lane->dev, "invalid COMPHY mode\n"); +@@ -172,9 +165,10 @@ static int mvebu_a3700_comphy_power_on(s + struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); + u32 fw_param; + int fw_mode; ++ int fw_port; + int ret; + +- fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, lane->port, ++ fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, + lane->mode, lane->submode); + if (fw_mode < 0) { + dev_err(lane->dev, "invalid COMPHY mode\n"); +@@ -191,17 +185,18 @@ static int mvebu_a3700_comphy_power_on(s + fw_param = COMPHY_FW_MODE(fw_mode); + break; + case PHY_MODE_ETHERNET: ++ fw_port = (lane->id == 0) ? 1 : 0; + switch (lane->submode) { + case PHY_INTERFACE_MODE_SGMII: + dev_dbg(lane->dev, "set lane %d to SGMII mode\n", + lane->id); +- fw_param = COMPHY_FW_NET(fw_mode, lane->port, ++ fw_param = COMPHY_FW_NET(fw_mode, fw_port, + COMPHY_FW_SPEED_1_25G); + break; + case PHY_INTERFACE_MODE_2500BASEX: + dev_dbg(lane->dev, "set lane %d to 2500BASEX mode\n", + lane->id); +- fw_param = COMPHY_FW_NET(fw_mode, lane->port, ++ fw_param = COMPHY_FW_NET(fw_mode, fw_port, + COMPHY_FW_SPEED_3_125G); + break; + default: +@@ -212,8 +207,7 @@ static int mvebu_a3700_comphy_power_on(s + break; + case PHY_MODE_PCIE: + dev_dbg(lane->dev, "set lane %d to PCIe mode\n", lane->id); +- fw_param = COMPHY_FW_PCIE(fw_mode, lane->port, +- COMPHY_FW_SPEED_5G, ++ fw_param = COMPHY_FW_PCIE(fw_mode, COMPHY_FW_SPEED_5G, + phy->attrs.bus_width); + break; + default: +@@ -247,17 +241,20 @@ static struct phy *mvebu_a3700_comphy_xl + struct of_phandle_args *args) + { + struct mvebu_a3700_comphy_lane *lane; ++ unsigned int port; + struct phy *phy; + +- if (WARN_ON(args->args[0] >= MVEBU_A3700_COMPHY_PORTS)) +- return ERR_PTR(-EINVAL); +- + phy = of_phy_simple_xlate(dev, args); + if (IS_ERR(phy)) + return phy; + + lane = phy_get_drvdata(phy); +- lane->port = args->args[0]; ++ ++ port = args->args[0]; ++ if (port != 0 && (port != 1 || lane->id != 0)) { ++ dev_err(lane->dev, "invalid port number %u\n", port); ++ return ERR_PTR(-EINVAL); ++ } + + return phy; + } +@@ -302,7 +299,6 @@ static int mvebu_a3700_comphy_probe(stru + lane->mode = PHY_MODE_INVALID; + lane->submode = PHY_INTERFACE_MODE_NA; + lane->id = lane_id; +- lane->port = -1; + phy_set_drvdata(phy, lane); + } + diff --git a/target/linux/generic/backport-5.15/344-v5.18-02-phy-marvell-phy-mvebu-a3700-comphy-Add-native-kernel.patch b/target/linux/generic/backport-5.15/344-v5.18-02-phy-marvell-phy-mvebu-a3700-comphy-Add-native-kernel.patch new file mode 100644 index 0000000000..4593d14bfe --- /dev/null +++ b/target/linux/generic/backport-5.15/344-v5.18-02-phy-marvell-phy-mvebu-a3700-comphy-Add-native-kernel.patch @@ -0,0 +1,1552 @@ +From 934337080c6c59b75db76b180b509f218640ad48 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Thu, 3 Feb 2022 22:44:41 +0100 +Subject: [PATCH 2/2] phy: marvell: phy-mvebu-a3700-comphy: Add native kernel + implementation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Remove old RPC implementation and add a new native kernel implementation. + +The old implementation uses ARM SMC API to issue RPC calls to ARM Trusted +Firmware which provides real implementation of PHY configuration. + +But older versions of ARM Trusted Firmware do not provide this PHY +configuration functionality, simply returning: operation not supported; or +worse, some versions provide the configuration functionality incorrectly. + +For example the firmware shipped in ESPRESSObin board has this older +version of ARM Trusted Firmware and therefore SATA, USB 3.0 and PCIe +functionality do not work with newer versions of Linux kernel. + +Due to the above reasons, the following commits were introduced into Linux, +to workaround these issues by ignoring -EOPNOTSUPP error code from +phy-mvebu-a3700-comphy driver function phy_power_on(): + +commit 45aefe3d2251 ("ata: ahci: mvebu: Make SATA PHY optional for Armada +3720") +commit 3241929b67d2 ("usb: host: xhci: mvebu: make USB 3.0 PHY optional for +Armada 3720") +commit b0c6ae0f8948 ("PCI: aardvark: Fix initialization with old Marvell's +Arm Trusted Firmware") + +Replace this RPC implementation with proper native kernel implementation, +which is independent on the firmware. Never return -EOPNOTSUPP for proper +arguments. + +This should solve multiple issues with real-world boards, where it is not +possible or really inconvenient to change the firmware. Let's eliminate +these issues. + +This implementation is ported directly from Armada 3720 comphy driver found +in newest version of ARM Trusted Firmware source code, but with various +fixes of register names, some added comments, some refactoring due to the +original code not conforming to kernel standards. Also PCIe mode poweroff +support was added here, and PHY reset support. These changes are also going +to be sent to ARM Trusted Firmware. + +[ Pali did the porting from ATF. + I (Marek) then fixed some register names, some various other things, + added some comments and refactored the code to kernel standards. Also + fixed PHY poweroff and added PHY reset. ] + +Signed-off-by: Pali Rohár +Acked-by: Miquel Raynal +Signed-off-by: Marek Behún +Link: https://lore.kernel.org/r/20220203214444.1508-3-kabel@kernel.org +Signed-off-by: Vinod Koul +--- + drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 1332 ++++++++++++++++-- + 1 file changed, 1215 insertions(+), 117 deletions(-) + +--- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c ++++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c +@@ -5,12 +5,16 @@ + * Authors: + * Evan Wang + * Miquèl Raynal ++ * Pali Rohár ++ * Marek Behún + * + * Structure inspired from phy-mvebu-cp110-comphy.c written by Antoine Tenart. +- * SMC call initial support done by Grzegorz Jaszczyk. ++ * Comphy code from ARM Trusted Firmware ported by Pali Rohár ++ * and Marek Behún . + */ + +-#include ++#include ++#include + #include + #include + #include +@@ -18,103 +22,1118 @@ + #include + #include + #include ++#include + +-#define MVEBU_A3700_COMPHY_LANES 3 ++#define PLL_SET_DELAY_US 600 ++#define COMPHY_PLL_SLEEP 1000 ++#define COMPHY_PLL_TIMEOUT 150000 ++ ++/* Comphy lane2 indirect access register offset */ ++#define COMPHY_LANE2_INDIR_ADDR 0x0 ++#define COMPHY_LANE2_INDIR_DATA 0x4 ++ ++/* SATA and USB3 PHY offset compared to SATA PHY */ ++#define COMPHY_LANE2_REGS_BASE 0x200 ++ ++/* ++ * When accessing common PHY lane registers directly, we need to shift by 1, ++ * since the registers are 16-bit. ++ */ ++#define COMPHY_LANE_REG_DIRECT(reg) (((reg) & 0x7FF) << 1) ++ ++/* COMPHY registers */ ++#define COMPHY_POWER_PLL_CTRL 0x01 ++#define PU_IVREF_BIT BIT(15) ++#define PU_PLL_BIT BIT(14) ++#define PU_RX_BIT BIT(13) ++#define PU_TX_BIT BIT(12) ++#define PU_TX_INTP_BIT BIT(11) ++#define PU_DFE_BIT BIT(10) ++#define RESET_DTL_RX_BIT BIT(9) ++#define PLL_LOCK_BIT BIT(8) ++#define REF_FREF_SEL_MASK GENMASK(4, 0) ++#define REF_FREF_SEL_SERDES_25MHZ FIELD_PREP(REF_FREF_SEL_MASK, 0x1) ++#define REF_FREF_SEL_SERDES_40MHZ FIELD_PREP(REF_FREF_SEL_MASK, 0x3) ++#define REF_FREF_SEL_SERDES_50MHZ FIELD_PREP(REF_FREF_SEL_MASK, 0x4) ++#define REF_FREF_SEL_PCIE_USB3_25MHZ FIELD_PREP(REF_FREF_SEL_MASK, 0x2) ++#define REF_FREF_SEL_PCIE_USB3_40MHZ FIELD_PREP(REF_FREF_SEL_MASK, 0x3) ++#define COMPHY_MODE_MASK GENMASK(7, 5) ++#define COMPHY_MODE_SATA FIELD_PREP(COMPHY_MODE_MASK, 0x0) ++#define COMPHY_MODE_PCIE FIELD_PREP(COMPHY_MODE_MASK, 0x3) ++#define COMPHY_MODE_SERDES FIELD_PREP(COMPHY_MODE_MASK, 0x4) ++#define COMPHY_MODE_USB3 FIELD_PREP(COMPHY_MODE_MASK, 0x5) ++ ++#define COMPHY_KVCO_CAL_CTRL 0x02 ++#define USE_MAX_PLL_RATE_BIT BIT(12) ++#define SPEED_PLL_MASK GENMASK(7, 2) ++#define SPEED_PLL_VALUE_16 FIELD_PREP(SPEED_PLL_MASK, 0x10) ++ ++#define COMPHY_DIG_LOOPBACK_EN 0x23 ++#define SEL_DATA_WIDTH_MASK GENMASK(11, 10) ++#define DATA_WIDTH_10BIT FIELD_PREP(SEL_DATA_WIDTH_MASK, 0x0) ++#define DATA_WIDTH_20BIT FIELD_PREP(SEL_DATA_WIDTH_MASK, 0x1) ++#define DATA_WIDTH_40BIT FIELD_PREP(SEL_DATA_WIDTH_MASK, 0x2) ++#define PLL_READY_TX_BIT BIT(4) ++ ++#define COMPHY_SYNC_PATTERN 0x24 ++#define TXD_INVERT_BIT BIT(10) ++#define RXD_INVERT_BIT BIT(11) ++ ++#define COMPHY_SYNC_MASK_GEN 0x25 ++#define PHY_GEN_MAX_MASK GENMASK(11, 10) ++#define PHY_GEN_MAX_USB3_5G FIELD_PREP(PHY_GEN_MAX_MASK, 0x1) ++ ++#define COMPHY_ISOLATION_CTRL 0x26 ++#define PHY_ISOLATE_MODE BIT(15) ++ ++#define COMPHY_GEN2_SET2 0x3e ++#define GS2_TX_SSC_AMP_MASK GENMASK(15, 9) ++#define GS2_TX_SSC_AMP_4128 FIELD_PREP(GS2_TX_SSC_AMP_MASK, 0x20) ++#define GS2_VREG_RXTX_MAS_ISET_MASK GENMASK(8, 7) ++#define GS2_VREG_RXTX_MAS_ISET_60U FIELD_PREP(GS2_VREG_RXTX_MAS_ISET_MASK,\ ++ 0x0) ++#define GS2_VREG_RXTX_MAS_ISET_80U FIELD_PREP(GS2_VREG_RXTX_MAS_ISET_MASK,\ ++ 0x1) ++#define GS2_VREG_RXTX_MAS_ISET_100U FIELD_PREP(GS2_VREG_RXTX_MAS_ISET_MASK,\ ++ 0x2) ++#define GS2_VREG_RXTX_MAS_ISET_120U FIELD_PREP(GS2_VREG_RXTX_MAS_ISET_MASK,\ ++ 0x3) ++#define GS2_RSVD_6_0_MASK GENMASK(6, 0) ++ ++#define COMPHY_GEN3_SET2 0x3f ++ ++#define COMPHY_IDLE_SYNC_EN 0x48 ++#define IDLE_SYNC_EN BIT(12) ++ ++#define COMPHY_MISC_CTRL0 0x4F ++#define CLK100M_125M_EN BIT(4) ++#define TXDCLK_2X_SEL BIT(6) ++#define CLK500M_EN BIT(7) ++#define PHY_REF_CLK_SEL BIT(10) ++ ++#define COMPHY_SFT_RESET 0x52 ++#define SFT_RST BIT(9) ++#define SFT_RST_NO_REG BIT(10) ++ ++#define COMPHY_MISC_CTRL1 0x73 ++#define SEL_BITS_PCIE_FORCE BIT(15) ++ ++#define COMPHY_GEN2_SET3 0x112 ++#define GS3_FFE_CAP_SEL_MASK GENMASK(3, 0) ++#define GS3_FFE_CAP_SEL_VALUE FIELD_PREP(GS3_FFE_CAP_SEL_MASK, 0xF) ++ ++/* PIPE registers */ ++#define COMPHY_PIPE_LANE_CFG0 0x180 ++#define PRD_TXDEEMPH0_MASK BIT(0) ++#define PRD_TXMARGIN_MASK GENMASK(3, 1) ++#define PRD_TXSWING_MASK BIT(4) ++#define CFG_TX_ALIGN_POS_MASK GENMASK(8, 5) ++ ++#define COMPHY_PIPE_LANE_CFG1 0x181 ++#define PRD_TXDEEMPH1_MASK BIT(15) ++#define USE_MAX_PLL_RATE_EN BIT(9) ++#define TX_DET_RX_MODE BIT(6) ++#define GEN2_TX_DATA_DLY_MASK GENMASK(4, 3) ++#define GEN2_TX_DATA_DLY_DEFT FIELD_PREP(GEN2_TX_DATA_DLY_MASK, 2) ++#define TX_ELEC_IDLE_MODE_EN BIT(0) ++ ++#define COMPHY_PIPE_LANE_STAT1 0x183 ++#define TXDCLK_PCLK_EN BIT(0) ++ ++#define COMPHY_PIPE_LANE_CFG4 0x188 ++#define SPREAD_SPECTRUM_CLK_EN BIT(7) ++ ++#define COMPHY_PIPE_RST_CLK_CTRL 0x1C1 ++#define PIPE_SOFT_RESET BIT(0) ++#define PIPE_REG_RESET BIT(1) ++#define MODE_CORE_CLK_FREQ_SEL BIT(9) ++#define MODE_PIPE_WIDTH_32 BIT(3) ++#define MODE_REFDIV_MASK GENMASK(5, 4) ++#define MODE_REFDIV_BY_4 FIELD_PREP(MODE_REFDIV_MASK, 0x2) ++ ++#define COMPHY_PIPE_TEST_MODE_CTRL 0x1C2 ++#define MODE_MARGIN_OVERRIDE BIT(2) ++ ++#define COMPHY_PIPE_CLK_SRC_LO 0x1C3 ++#define MODE_CLK_SRC BIT(0) ++#define BUNDLE_PERIOD_SEL BIT(1) ++#define BUNDLE_PERIOD_SCALE_MASK GENMASK(3, 2) ++#define BUNDLE_SAMPLE_CTRL BIT(4) ++#define PLL_READY_DLY_MASK GENMASK(7, 5) ++#define CFG_SEL_20B BIT(15) ++ ++#define COMPHY_PIPE_PWR_MGM_TIM1 0x1D0 ++#define CFG_PM_OSCCLK_WAIT_MASK GENMASK(15, 12) ++#define CFG_PM_RXDEN_WAIT_MASK GENMASK(11, 8) ++#define CFG_PM_RXDEN_WAIT_1_UNIT FIELD_PREP(CFG_PM_RXDEN_WAIT_MASK, 0x1) ++#define CFG_PM_RXDLOZ_WAIT_MASK GENMASK(7, 0) ++#define CFG_PM_RXDLOZ_WAIT_7_UNIT FIELD_PREP(CFG_PM_RXDLOZ_WAIT_MASK, 0x7) ++#define CFG_PM_RXDLOZ_WAIT_12_UNIT FIELD_PREP(CFG_PM_RXDLOZ_WAIT_MASK, 0xC) ++ ++/* ++ * This register is not from PHY lane register space. It only exists in the ++ * indirect register space, before the actual PHY lane 2 registers. So the ++ * offset is absolute, not relative to COMPHY_LANE2_REGS_BASE. ++ * It is used only for SATA PHY initialization. ++ */ ++#define COMPHY_RESERVED_REG 0x0E ++#define PHYCTRL_FRM_PIN_BIT BIT(13) + +-/* COMPHY Fast SMC function identifiers */ +-#define COMPHY_SIP_POWER_ON 0x82000001 +-#define COMPHY_SIP_POWER_OFF 0x82000002 +-#define COMPHY_SIP_PLL_LOCK 0x82000003 +- +-#define COMPHY_FW_MODE_SATA 0x1 +-#define COMPHY_FW_MODE_SGMII 0x2 +-#define COMPHY_FW_MODE_2500BASEX 0x3 +-#define COMPHY_FW_MODE_USB3H 0x4 +-#define COMPHY_FW_MODE_USB3D 0x5 +-#define COMPHY_FW_MODE_PCIE 0x6 +-#define COMPHY_FW_MODE_USB3 0xa +- +-#define COMPHY_FW_SPEED_1_25G 0 /* SGMII 1G */ +-#define COMPHY_FW_SPEED_2_5G 1 +-#define COMPHY_FW_SPEED_3_125G 2 /* 2500BASE-X */ +-#define COMPHY_FW_SPEED_5G 3 +-#define COMPHY_FW_SPEED_MAX 0x3F +- +-#define COMPHY_FW_MODE(mode) ((mode) << 12) +-#define COMPHY_FW_NET(mode, idx, speed) (COMPHY_FW_MODE(mode) | \ +- ((idx) << 8) | \ +- ((speed) << 2)) +-#define COMPHY_FW_PCIE(mode, speed, width) (COMPHY_FW_NET(mode, 0, speed) | \ +- ((width) << 18)) ++/* South Bridge PHY Configuration Registers */ ++#define COMPHY_PHY_REG(lane, reg) (((1 - (lane)) * 0x28) + ((reg) & 0x3f)) ++ ++/* ++ * lane0: USB3/GbE1 PHY Configuration 1 ++ * lane1: PCIe/GbE0 PHY Configuration 1 ++ * (used only by SGMII code) ++ */ ++#define COMPHY_PHY_CFG1 0x0 ++#define PIN_PU_IVREF_BIT BIT(1) ++#define PIN_RESET_CORE_BIT BIT(11) ++#define PIN_RESET_COMPHY_BIT BIT(12) ++#define PIN_PU_PLL_BIT BIT(16) ++#define PIN_PU_RX_BIT BIT(17) ++#define PIN_PU_TX_BIT BIT(18) ++#define PIN_TX_IDLE_BIT BIT(19) ++#define GEN_RX_SEL_MASK GENMASK(25, 22) ++#define GEN_RX_SEL_VALUE(val) FIELD_PREP(GEN_RX_SEL_MASK, (val)) ++#define GEN_TX_SEL_MASK GENMASK(29, 26) ++#define GEN_TX_SEL_VALUE(val) FIELD_PREP(GEN_TX_SEL_MASK, (val)) ++#define SERDES_SPEED_1_25_G 0x6 ++#define SERDES_SPEED_3_125_G 0x8 ++#define PHY_RX_INIT_BIT BIT(30) ++ ++/* ++ * lane0: USB3/GbE1 PHY Status 1 ++ * lane1: PCIe/GbE0 PHY Status 1 ++ * (used only by SGMII code) ++ */ ++#define COMPHY_PHY_STAT1 0x18 ++#define PHY_RX_INIT_DONE_BIT BIT(0) ++#define PHY_PLL_READY_RX_BIT BIT(2) ++#define PHY_PLL_READY_TX_BIT BIT(3) ++ ++/* PHY Selector */ ++#define COMPHY_SELECTOR_PHY_REG 0xFC ++/* bit0: 0: Lane1 is GbE0; 1: Lane1 is PCIe */ ++#define COMPHY_SELECTOR_PCIE_GBE0_SEL_BIT BIT(0) ++/* bit4: 0: Lane0 is GbE1; 1: Lane0 is USB3 */ ++#define COMPHY_SELECTOR_USB3_GBE1_SEL_BIT BIT(4) ++/* bit8: 0: Lane0 is USB3 instead of GbE1, Lane2 is SATA; 1: Lane2 is USB3 */ ++#define COMPHY_SELECTOR_USB3_PHY_SEL_BIT BIT(8) + + struct mvebu_a3700_comphy_conf { + unsigned int lane; + enum phy_mode mode; + int submode; +- u32 fw_mode; + }; + +-#define MVEBU_A3700_COMPHY_CONF(_lane, _mode, _smode, _fw) \ ++#define MVEBU_A3700_COMPHY_CONF(_lane, _mode, _smode) \ + { \ + .lane = _lane, \ + .mode = _mode, \ + .submode = _smode, \ +- .fw_mode = _fw, \ + } + +-#define MVEBU_A3700_COMPHY_CONF_GEN(_lane, _mode, _fw) \ +- MVEBU_A3700_COMPHY_CONF(_lane, _mode, PHY_INTERFACE_MODE_NA, _fw) ++#define MVEBU_A3700_COMPHY_CONF_GEN(_lane, _mode) \ ++ MVEBU_A3700_COMPHY_CONF(_lane, _mode, PHY_INTERFACE_MODE_NA) + +-#define MVEBU_A3700_COMPHY_CONF_ETH(_lane, _smode, _fw) \ +- MVEBU_A3700_COMPHY_CONF(_lane, PHY_MODE_ETHERNET, _smode, _fw) ++#define MVEBU_A3700_COMPHY_CONF_ETH(_lane, _smode) \ ++ MVEBU_A3700_COMPHY_CONF(_lane, PHY_MODE_ETHERNET, _smode) + + static const struct mvebu_a3700_comphy_conf mvebu_a3700_comphy_modes[] = { + /* lane 0 */ +- MVEBU_A3700_COMPHY_CONF_GEN(0, PHY_MODE_USB_HOST_SS, +- COMPHY_FW_MODE_USB3H), +- MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_SGMII, +- COMPHY_FW_MODE_SGMII), +- MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_2500BASEX, +- COMPHY_FW_MODE_2500BASEX), ++ MVEBU_A3700_COMPHY_CONF_GEN(0, PHY_MODE_USB_HOST_SS), ++ MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_SGMII), ++ MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_1000BASEX), ++ MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_2500BASEX), + /* lane 1 */ +- MVEBU_A3700_COMPHY_CONF_GEN(1, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE), +- MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_SGMII, +- COMPHY_FW_MODE_SGMII), +- MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_2500BASEX, +- COMPHY_FW_MODE_2500BASEX), ++ MVEBU_A3700_COMPHY_CONF_GEN(1, PHY_MODE_PCIE), ++ MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_SGMII), ++ MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_1000BASEX), ++ MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_2500BASEX), + /* lane 2 */ +- MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_SATA, COMPHY_FW_MODE_SATA), +- MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_USB_HOST_SS, +- COMPHY_FW_MODE_USB3H), ++ MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_SATA), ++ MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_USB_HOST_SS), ++}; ++ ++struct mvebu_a3700_comphy_priv { ++ void __iomem *comphy_regs; ++ void __iomem *lane0_phy_regs; /* USB3 and GbE1 */ ++ void __iomem *lane1_phy_regs; /* PCIe and GbE0 */ ++ void __iomem *lane2_phy_indirect; /* SATA and USB3 */ ++ spinlock_t lock; /* for PHY selector access */ ++ bool xtal_is_40m; + }; + + struct mvebu_a3700_comphy_lane { ++ struct mvebu_a3700_comphy_priv *priv; + struct device *dev; + unsigned int id; + enum phy_mode mode; + int submode; ++ bool invert_tx; ++ bool invert_rx; ++ bool needs_reset; ++}; ++ ++struct gbe_phy_init_data_fix { ++ u16 addr; ++ u16 value; ++}; ++ ++/* Changes to 40M1G25 mode data required for running 40M3G125 init mode */ ++static struct gbe_phy_init_data_fix gbe_phy_init_fix[] = { ++ { 0x005, 0x07CC }, { 0x015, 0x0000 }, { 0x01B, 0x0000 }, ++ { 0x01D, 0x0000 }, { 0x01E, 0x0000 }, { 0x01F, 0x0000 }, ++ { 0x020, 0x0000 }, { 0x021, 0x0030 }, { 0x026, 0x0888 }, ++ { 0x04D, 0x0152 }, { 0x04F, 0xA020 }, { 0x050, 0x07CC }, ++ { 0x053, 0xE9CA }, { 0x055, 0xBD97 }, { 0x071, 0x3015 }, ++ { 0x076, 0x03AA }, { 0x07C, 0x0FDF }, { 0x0C2, 0x3030 }, ++ { 0x0C3, 0x8000 }, { 0x0E2, 0x5550 }, { 0x0E3, 0x12A4 }, ++ { 0x0E4, 0x7D00 }, { 0x0E6, 0x0C83 }, { 0x101, 0xFCC0 }, ++ { 0x104, 0x0C10 } + }; + +-static int mvebu_a3700_comphy_smc(unsigned long function, unsigned long lane, +- unsigned long mode) ++/* 40M1G25 mode init data */ ++static u16 gbe_phy_init[512] = { ++ /* 0 1 2 3 4 5 6 7 */ ++ /*-----------------------------------------------------------*/ ++ /* 8 9 A B C D E F */ ++ 0x3110, 0xFD83, 0x6430, 0x412F, 0x82C0, 0x06FA, 0x4500, 0x6D26, /* 00 */ ++ 0xAFC0, 0x8000, 0xC000, 0x0000, 0x2000, 0x49CC, 0x0BC9, 0x2A52, /* 08 */ ++ 0x0BD2, 0x0CDE, 0x13D2, 0x0CE8, 0x1149, 0x10E0, 0x0000, 0x0000, /* 10 */ ++ 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x4134, 0x0D2D, 0xFFFF, /* 18 */ ++ 0xFFE0, 0x4030, 0x1016, 0x0030, 0x0000, 0x0800, 0x0866, 0x0000, /* 20 */ ++ 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, /* 28 */ ++ 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 30 */ ++ 0x0000, 0x0000, 0x000F, 0x6A62, 0x1988, 0x3100, 0x3100, 0x3100, /* 38 */ ++ 0x3100, 0xA708, 0x2430, 0x0830, 0x1030, 0x4610, 0xFF00, 0xFF00, /* 40 */ ++ 0x0060, 0x1000, 0x0400, 0x0040, 0x00F0, 0x0155, 0x1100, 0xA02A, /* 48 */ ++ 0x06FA, 0x0080, 0xB008, 0xE3ED, 0x5002, 0xB592, 0x7A80, 0x0001, /* 50 */ ++ 0x020A, 0x8820, 0x6014, 0x8054, 0xACAA, 0xFC88, 0x2A02, 0x45CF, /* 58 */ ++ 0x000F, 0x1817, 0x2860, 0x064F, 0x0000, 0x0204, 0x1800, 0x6000, /* 60 */ ++ 0x810F, 0x4F23, 0x4000, 0x4498, 0x0850, 0x0000, 0x000E, 0x1002, /* 68 */ ++ 0x9D3A, 0x3009, 0xD066, 0x0491, 0x0001, 0x6AB0, 0x0399, 0x3780, /* 70 */ ++ 0x0040, 0x5AC0, 0x4A80, 0x0000, 0x01DF, 0x0000, 0x0007, 0x0000, /* 78 */ ++ 0x2D54, 0x00A1, 0x4000, 0x0100, 0xA20A, 0x0000, 0x0000, 0x0000, /* 80 */ ++ 0x0000, 0x0000, 0x0000, 0x7400, 0x0E81, 0x1000, 0x1242, 0x0210, /* 88 */ ++ 0x80DF, 0x0F1F, 0x2F3F, 0x4F5F, 0x6F7F, 0x0F1F, 0x2F3F, 0x4F5F, /* 90 */ ++ 0x6F7F, 0x4BAD, 0x0000, 0x0000, 0x0800, 0x0000, 0x2400, 0xB651, /* 98 */ ++ 0xC9E0, 0x4247, 0x0A24, 0x0000, 0xAF19, 0x1004, 0x0000, 0x0000, /* A0 */ ++ 0x0000, 0x0013, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* A8 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* B0 */ ++ 0x0000, 0x0000, 0x0000, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, /* B8 */ ++ 0x0000, 0x0000, 0x3010, 0xFA00, 0x0000, 0x0000, 0x0000, 0x0003, /* C0 */ ++ 0x1618, 0x8200, 0x8000, 0x0400, 0x050F, 0x0000, 0x0000, 0x0000, /* C8 */ ++ 0x4C93, 0x0000, 0x1000, 0x1120, 0x0010, 0x1242, 0x1242, 0x1E00, /* D0 */ ++ 0x0000, 0x0000, 0x0000, 0x00F8, 0x0000, 0x0041, 0x0800, 0x0000, /* D8 */ ++ 0x82A0, 0x572E, 0x2490, 0x14A9, 0x4E00, 0x0000, 0x0803, 0x0541, /* E0 */ ++ 0x0C15, 0x0000, 0x0000, 0x0400, 0x2626, 0x0000, 0x0000, 0x4200, /* E8 */ ++ 0x0000, 0xAA55, 0x1020, 0x0000, 0x0000, 0x5010, 0x0000, 0x0000, /* F0 */ ++ 0x0000, 0x0000, 0x5000, 0x0000, 0x0000, 0x0000, 0x02F2, 0x0000, /* F8 */ ++ 0x101F, 0xFDC0, 0x4000, 0x8010, 0x0110, 0x0006, 0x0000, 0x0000, /*100 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*108 */ ++ 0x04CF, 0x0000, 0x04CF, 0x0000, 0x04CF, 0x0000, 0x04C6, 0x0000, /*110 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*118 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*120 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*128 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*130 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*138 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*140 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*148 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*150 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*158 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*160 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*168 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*170 */ ++ 0x0000, 0x0000, 0x0000, 0x00F0, 0x08A2, 0x3112, 0x0A14, 0x0000, /*178 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*180 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*188 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*190 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*198 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1A0 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1A8 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1B0 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1B8 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1C0 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1C8 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1D0 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1D8 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1E0 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1E8 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1F0 */ ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 /*1F8 */ ++}; ++ ++static inline void comphy_reg_set(void __iomem *addr, u32 data, u32 mask) + { +- struct arm_smccc_res res; +- s32 ret; ++ u32 val; ++ ++ val = readl(addr); ++ val = (val & ~mask) | (data & mask); ++ writel(val, addr); ++} + +- arm_smccc_smc(function, lane, mode, 0, 0, 0, 0, 0, &res); +- ret = res.a0; ++static inline void comphy_reg_set16(void __iomem *addr, u16 data, u16 mask) ++{ ++ u16 val; + +- switch (ret) { +- case SMCCC_RET_SUCCESS: +- return 0; +- case SMCCC_RET_NOT_SUPPORTED: +- return -EOPNOTSUPP; ++ val = readw(addr); ++ val = (val & ~mask) | (data & mask); ++ writew(val, addr); ++} ++ ++/* Used for accessing lane 2 registers (SATA/USB3 PHY) */ ++static void comphy_set_indirect(struct mvebu_a3700_comphy_priv *priv, ++ u32 offset, u16 data, u16 mask) ++{ ++ writel(offset, ++ priv->lane2_phy_indirect + COMPHY_LANE2_INDIR_ADDR); ++ comphy_reg_set(priv->lane2_phy_indirect + COMPHY_LANE2_INDIR_DATA, ++ data, mask); ++} ++ ++static void comphy_lane_reg_set(struct mvebu_a3700_comphy_lane *lane, ++ u16 reg, u16 data, u16 mask) ++{ ++ if (lane->id == 2) { ++ /* lane 2 PHY registers are accessed indirectly */ ++ comphy_set_indirect(lane->priv, ++ reg + COMPHY_LANE2_REGS_BASE, ++ data, mask); ++ } else { ++ void __iomem *base = lane->id == 1 ? ++ lane->priv->lane1_phy_regs : ++ lane->priv->lane0_phy_regs; ++ ++ comphy_reg_set16(base + COMPHY_LANE_REG_DIRECT(reg), ++ data, mask); ++ } ++} ++ ++static int comphy_lane_reg_poll(struct mvebu_a3700_comphy_lane *lane, ++ u16 reg, u16 bits, ++ ulong sleep_us, ulong timeout_us) ++{ ++ int ret; ++ ++ if (lane->id == 2) { ++ u32 data; ++ ++ /* lane 2 PHY registers are accessed indirectly */ ++ writel(reg + COMPHY_LANE2_REGS_BASE, ++ lane->priv->lane2_phy_indirect + ++ COMPHY_LANE2_INDIR_ADDR); ++ ++ ret = readl_poll_timeout(lane->priv->lane2_phy_indirect + ++ COMPHY_LANE2_INDIR_DATA, ++ data, (data & bits) == bits, ++ sleep_us, timeout_us); ++ } else { ++ void __iomem *base = lane->id == 1 ? ++ lane->priv->lane1_phy_regs : ++ lane->priv->lane0_phy_regs; ++ u16 data; ++ ++ ret = readw_poll_timeout(base + COMPHY_LANE_REG_DIRECT(reg), ++ data, (data & bits) == bits, ++ sleep_us, timeout_us); ++ } ++ ++ return ret; ++} ++ ++static void comphy_periph_reg_set(struct mvebu_a3700_comphy_lane *lane, ++ u8 reg, u32 data, u32 mask) ++{ ++ comphy_reg_set(lane->priv->comphy_regs + COMPHY_PHY_REG(lane->id, reg), ++ data, mask); ++} ++ ++static int comphy_periph_reg_poll(struct mvebu_a3700_comphy_lane *lane, ++ u8 reg, u32 bits, ++ ulong sleep_us, ulong timeout_us) ++{ ++ u32 data; ++ ++ return readl_poll_timeout(lane->priv->comphy_regs + ++ COMPHY_PHY_REG(lane->id, reg), ++ data, (data & bits) == bits, ++ sleep_us, timeout_us); ++} ++ ++/* PHY selector configures with corresponding modes */ ++static int ++mvebu_a3700_comphy_set_phy_selector(struct mvebu_a3700_comphy_lane *lane) ++{ ++ u32 old, new, clr = 0, set = 0; ++ unsigned long flags; ++ ++ switch (lane->mode) { ++ case PHY_MODE_SATA: ++ /* SATA must be in Lane2 */ ++ if (lane->id == 2) ++ clr = COMPHY_SELECTOR_USB3_PHY_SEL_BIT; ++ else ++ goto error; ++ break; ++ ++ case PHY_MODE_ETHERNET: ++ if (lane->id == 0) ++ clr = COMPHY_SELECTOR_USB3_GBE1_SEL_BIT; ++ else if (lane->id == 1) ++ clr = COMPHY_SELECTOR_PCIE_GBE0_SEL_BIT; ++ else ++ goto error; ++ break; ++ ++ case PHY_MODE_USB_HOST_SS: ++ if (lane->id == 2) ++ set = COMPHY_SELECTOR_USB3_PHY_SEL_BIT; ++ else if (lane->id == 0) ++ set = COMPHY_SELECTOR_USB3_GBE1_SEL_BIT; ++ else ++ goto error; ++ break; ++ ++ case PHY_MODE_PCIE: ++ /* PCIE must be in Lane1 */ ++ if (lane->id == 1) ++ set = COMPHY_SELECTOR_PCIE_GBE0_SEL_BIT; ++ else ++ goto error; ++ break; ++ ++ default: ++ goto error; ++ } ++ ++ spin_lock_irqsave(&lane->priv->lock, flags); ++ ++ old = readl(lane->priv->comphy_regs + COMPHY_SELECTOR_PHY_REG); ++ new = (old & ~clr) | set; ++ writel(new, lane->priv->comphy_regs + COMPHY_SELECTOR_PHY_REG); ++ ++ spin_unlock_irqrestore(&lane->priv->lock, flags); ++ ++ dev_dbg(lane->dev, ++ "COMPHY[%d] mode[%d] changed PHY selector 0x%08x -> 0x%08x\n", ++ lane->id, lane->mode, old, new); ++ ++ return 0; ++error: ++ dev_err(lane->dev, "COMPHY[%d] mode[%d] is invalid\n", lane->id, ++ lane->mode); ++ return -EINVAL; ++} ++ ++static int ++mvebu_a3700_comphy_sata_power_on(struct mvebu_a3700_comphy_lane *lane) ++{ ++ u32 mask, data, ref_clk; ++ int ret; ++ ++ /* Configure phy selector for SATA */ ++ ret = mvebu_a3700_comphy_set_phy_selector(lane); ++ if (ret) ++ return ret; ++ ++ /* Clear phy isolation mode to make it work in normal mode */ ++ comphy_lane_reg_set(lane, COMPHY_ISOLATION_CTRL, ++ 0x0, PHY_ISOLATE_MODE); ++ ++ /* 0. Check the Polarity invert bits */ ++ data = 0x0; ++ if (lane->invert_tx) ++ data |= TXD_INVERT_BIT; ++ if (lane->invert_rx) ++ data |= RXD_INVERT_BIT; ++ mask = TXD_INVERT_BIT | RXD_INVERT_BIT; ++ comphy_lane_reg_set(lane, COMPHY_SYNC_PATTERN, data, mask); ++ ++ /* 1. Select 40-bit data width */ ++ comphy_lane_reg_set(lane, COMPHY_DIG_LOOPBACK_EN, ++ DATA_WIDTH_40BIT, SEL_DATA_WIDTH_MASK); ++ ++ /* 2. Select reference clock(25M) and PHY mode (SATA) */ ++ if (lane->priv->xtal_is_40m) ++ ref_clk = REF_FREF_SEL_SERDES_40MHZ; ++ else ++ ref_clk = REF_FREF_SEL_SERDES_25MHZ; ++ ++ data = ref_clk | COMPHY_MODE_SATA; ++ mask = REF_FREF_SEL_MASK | COMPHY_MODE_MASK; ++ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, data, mask); ++ ++ /* 3. Use maximum PLL rate (no power save) */ ++ comphy_lane_reg_set(lane, COMPHY_KVCO_CAL_CTRL, ++ USE_MAX_PLL_RATE_BIT, USE_MAX_PLL_RATE_BIT); ++ ++ /* 4. Reset reserved bit */ ++ comphy_set_indirect(lane->priv, COMPHY_RESERVED_REG, ++ 0x0, PHYCTRL_FRM_PIN_BIT); ++ ++ /* 5. Set vendor-specific configuration (It is done in sata driver) */ ++ /* XXX: in U-Boot below sequence was executed in this place, in Linux ++ * not. Now it is done only in U-Boot before this comphy ++ * initialization - tests shows that it works ok, but in case of any ++ * future problem it is left for reference. ++ * reg_set(MVEBU_REGS_BASE + 0xe00a0, 0, 0xffffffff); ++ * reg_set(MVEBU_REGS_BASE + 0xe00a4, BIT(6), BIT(6)); ++ */ ++ ++ /* Wait for > 55 us to allow PLL be enabled */ ++ udelay(PLL_SET_DELAY_US); ++ ++ /* Polling status */ ++ ret = comphy_lane_reg_poll(lane, COMPHY_DIG_LOOPBACK_EN, ++ PLL_READY_TX_BIT, COMPHY_PLL_SLEEP, ++ COMPHY_PLL_TIMEOUT); ++ if (ret) ++ dev_err(lane->dev, "Failed to lock SATA PLL\n"); ++ ++ return ret; ++} ++ ++static void comphy_gbe_phy_init(struct mvebu_a3700_comphy_lane *lane, ++ bool is_1gbps) ++{ ++ int addr, fix_idx; ++ u16 val; ++ ++ fix_idx = 0; ++ for (addr = 0; addr < 512; addr++) { ++ /* ++ * All PHY register values are defined in full for 3.125Gbps ++ * SERDES speed. The values required for 1.25 Gbps are almost ++ * the same and only few registers should be "fixed" in ++ * comparison to 3.125 Gbps values. These register values are ++ * stored in "gbe_phy_init_fix" array. ++ */ ++ if (!is_1gbps && gbe_phy_init_fix[fix_idx].addr == addr) { ++ /* Use new value */ ++ val = gbe_phy_init_fix[fix_idx].value; ++ if (fix_idx < ARRAY_SIZE(gbe_phy_init_fix)) ++ fix_idx++; ++ } else { ++ val = gbe_phy_init[addr]; ++ } ++ ++ comphy_lane_reg_set(lane, addr, val, 0xFFFF); ++ } ++} ++ ++static int ++mvebu_a3700_comphy_ethernet_power_on(struct mvebu_a3700_comphy_lane *lane) ++{ ++ u32 mask, data, speed_sel; ++ int ret; ++ ++ /* Set selector */ ++ ret = mvebu_a3700_comphy_set_phy_selector(lane); ++ if (ret) ++ return ret; ++ ++ /* ++ * 1. Reset PHY by setting PHY input port PIN_RESET=1. ++ * 2. Set PHY input port PIN_TX_IDLE=1, PIN_PU_IVREF=1 to keep ++ * PHY TXP/TXN output to idle state during PHY initialization ++ * 3. Set PHY input port PIN_PU_PLL=0, PIN_PU_RX=0, PIN_PU_TX=0. ++ */ ++ data = PIN_PU_IVREF_BIT | PIN_TX_IDLE_BIT | PIN_RESET_COMPHY_BIT; ++ mask = data | PIN_RESET_CORE_BIT | PIN_PU_PLL_BIT | PIN_PU_RX_BIT | ++ PIN_PU_TX_BIT | PHY_RX_INIT_BIT; ++ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); ++ ++ /* 4. Release reset to the PHY by setting PIN_RESET=0. */ ++ data = 0x0; ++ mask = PIN_RESET_COMPHY_BIT; ++ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); ++ ++ /* ++ * 5. Set PIN_PHY_GEN_TX[3:0] and PIN_PHY_GEN_RX[3:0] to decide COMPHY ++ * bit rate ++ */ ++ switch (lane->submode) { ++ case PHY_INTERFACE_MODE_SGMII: ++ case PHY_INTERFACE_MODE_1000BASEX: ++ /* SGMII 1G, SerDes speed 1.25G */ ++ speed_sel = SERDES_SPEED_1_25_G; ++ break; ++ case PHY_INTERFACE_MODE_2500BASEX: ++ /* 2500Base-X, SerDes speed 3.125G */ ++ speed_sel = SERDES_SPEED_3_125_G; ++ break; + default: ++ /* Other rates are not supported */ ++ dev_err(lane->dev, ++ "unsupported phy speed %d on comphy lane%d\n", ++ lane->submode, lane->id); + return -EINVAL; + } ++ data = GEN_RX_SEL_VALUE(speed_sel) | GEN_TX_SEL_VALUE(speed_sel); ++ mask = GEN_RX_SEL_MASK | GEN_TX_SEL_MASK; ++ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); ++ ++ /* ++ * 6. Wait 10mS for bandgap and reference clocks to stabilize; then ++ * start SW programming. ++ */ ++ mdelay(10); ++ ++ /* 7. Program COMPHY register PHY_MODE */ ++ data = COMPHY_MODE_SERDES; ++ mask = COMPHY_MODE_MASK; ++ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, data, mask); ++ ++ /* ++ * 8. Set COMPHY register REFCLK_SEL to select the correct REFCLK ++ * source ++ */ ++ data = 0x0; ++ mask = PHY_REF_CLK_SEL; ++ comphy_lane_reg_set(lane, COMPHY_MISC_CTRL0, data, mask); ++ ++ /* ++ * 9. Set correct reference clock frequency in COMPHY register ++ * REF_FREF_SEL. ++ */ ++ if (lane->priv->xtal_is_40m) ++ data = REF_FREF_SEL_SERDES_50MHZ; ++ else ++ data = REF_FREF_SEL_SERDES_25MHZ; ++ ++ mask = REF_FREF_SEL_MASK; ++ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, data, mask); ++ ++ /* ++ * 10. Program COMPHY register PHY_GEN_MAX[1:0] ++ * This step is mentioned in the flow received from verification team. ++ * However the PHY_GEN_MAX value is only meaningful for other interfaces ++ * (not SERDES). For instance, it selects SATA speed 1.5/3/6 Gbps or ++ * PCIe speed 2.5/5 Gbps ++ */ ++ ++ /* ++ * 11. Program COMPHY register SEL_BITS to set correct parallel data ++ * bus width ++ */ ++ data = DATA_WIDTH_10BIT; ++ mask = SEL_DATA_WIDTH_MASK; ++ comphy_lane_reg_set(lane, COMPHY_DIG_LOOPBACK_EN, data, mask); ++ ++ /* ++ * 12. As long as DFE function needs to be enabled in any mode, ++ * COMPHY register DFE_UPDATE_EN[5:0] shall be programmed to 0x3F ++ * for real chip during COMPHY power on. ++ * The value of the DFE_UPDATE_EN already is 0x3F, because it is the ++ * default value after reset of the PHY. ++ */ ++ ++ /* ++ * 13. Program COMPHY GEN registers. ++ * These registers should be programmed based on the lab testing result ++ * to achieve optimal performance. Please contact the CEA group to get ++ * the related GEN table during real chip bring-up. We only required to ++ * run though the entire registers programming flow defined by ++ * "comphy_gbe_phy_init" when the REF clock is 40 MHz. For REF clock ++ * 25 MHz the default values stored in PHY registers are OK. ++ */ ++ dev_dbg(lane->dev, "Running C-DPI phy init %s mode\n", ++ lane->submode == PHY_INTERFACE_MODE_2500BASEX ? "2G5" : "1G"); ++ if (lane->priv->xtal_is_40m) ++ comphy_gbe_phy_init(lane, ++ lane->submode != PHY_INTERFACE_MODE_2500BASEX); ++ ++ /* ++ * 14. Check the PHY Polarity invert bit ++ */ ++ data = 0x0; ++ if (lane->invert_tx) ++ data |= TXD_INVERT_BIT; ++ if (lane->invert_rx) ++ data |= RXD_INVERT_BIT; ++ mask = TXD_INVERT_BIT | RXD_INVERT_BIT; ++ comphy_lane_reg_set(lane, COMPHY_SYNC_PATTERN, data, mask); ++ ++ /* ++ * 15. Set PHY input ports PIN_PU_PLL, PIN_PU_TX and PIN_PU_RX to 1 to ++ * start PHY power up sequence. All the PHY register programming should ++ * be done before PIN_PU_PLL=1. There should be no register programming ++ * for normal PHY operation from this point. ++ */ ++ data = PIN_PU_PLL_BIT | PIN_PU_RX_BIT | PIN_PU_TX_BIT; ++ mask = data; ++ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); ++ ++ /* ++ * 16. Wait for PHY power up sequence to finish by checking output ports ++ * PIN_PLL_READY_TX=1 and PIN_PLL_READY_RX=1. ++ */ ++ ret = comphy_periph_reg_poll(lane, COMPHY_PHY_STAT1, ++ PHY_PLL_READY_TX_BIT | ++ PHY_PLL_READY_RX_BIT, ++ COMPHY_PLL_SLEEP, COMPHY_PLL_TIMEOUT); ++ if (ret) { ++ dev_err(lane->dev, "Failed to lock PLL for SERDES PHY %d\n", ++ lane->id); ++ return ret; ++ } ++ ++ /* ++ * 17. Set COMPHY input port PIN_TX_IDLE=0 ++ */ ++ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, 0x0, PIN_TX_IDLE_BIT); ++ ++ /* ++ * 18. After valid data appear on PIN_RXDATA bus, set PIN_RX_INIT=1. To ++ * start RX initialization. PIN_RX_INIT_DONE will be cleared to 0 by the ++ * PHY After RX initialization is done, PIN_RX_INIT_DONE will be set to ++ * 1 by COMPHY Set PIN_RX_INIT=0 after PIN_RX_INIT_DONE= 1. Please ++ * refer to RX initialization part for details. ++ */ ++ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, ++ PHY_RX_INIT_BIT, PHY_RX_INIT_BIT); ++ ++ ret = comphy_periph_reg_poll(lane, COMPHY_PHY_STAT1, ++ PHY_PLL_READY_TX_BIT | ++ PHY_PLL_READY_RX_BIT, ++ COMPHY_PLL_SLEEP, COMPHY_PLL_TIMEOUT); ++ if (ret) { ++ dev_err(lane->dev, "Failed to lock PLL for SERDES PHY %d\n", ++ lane->id); ++ return ret; ++ } ++ ++ ret = comphy_periph_reg_poll(lane, COMPHY_PHY_STAT1, ++ PHY_RX_INIT_DONE_BIT, ++ COMPHY_PLL_SLEEP, COMPHY_PLL_TIMEOUT); ++ if (ret) ++ dev_err(lane->dev, "Failed to init RX of SERDES PHY %d\n", ++ lane->id); ++ ++ return ret; + } + +-static int mvebu_a3700_comphy_get_fw_mode(int lane, ++static int ++mvebu_a3700_comphy_usb3_power_on(struct mvebu_a3700_comphy_lane *lane) ++{ ++ u32 mask, data, cfg, ref_clk; ++ int ret; ++ ++ /* Set phy seclector */ ++ ret = mvebu_a3700_comphy_set_phy_selector(lane); ++ if (ret) ++ return ret; ++ ++ /* ++ * 0. Set PHY OTG Control(0x5d034), bit 4, Power up OTG module The ++ * register belong to UTMI module, so it is set in UTMI phy driver. ++ */ ++ ++ /* ++ * 1. Set PRD_TXDEEMPH (3.5db de-emph) ++ */ ++ data = PRD_TXDEEMPH0_MASK; ++ mask = PRD_TXDEEMPH0_MASK | PRD_TXMARGIN_MASK | PRD_TXSWING_MASK | ++ CFG_TX_ALIGN_POS_MASK; ++ comphy_lane_reg_set(lane, COMPHY_PIPE_LANE_CFG0, data, mask); ++ ++ /* ++ * 2. Set BIT0: enable transmitter in high impedance mode ++ * Set BIT[3:4]: delay 2 clock cycles for HiZ off latency ++ * Set BIT6: Tx detect Rx at HiZ mode ++ * Unset BIT15: set to 0 to set USB3 De-emphasize level to -3.5db ++ * together with bit 0 of COMPHY_PIPE_LANE_CFG0 register ++ */ ++ data = TX_DET_RX_MODE | GEN2_TX_DATA_DLY_DEFT | TX_ELEC_IDLE_MODE_EN; ++ mask = PRD_TXDEEMPH1_MASK | TX_DET_RX_MODE | GEN2_TX_DATA_DLY_MASK | ++ TX_ELEC_IDLE_MODE_EN; ++ comphy_lane_reg_set(lane, COMPHY_PIPE_LANE_CFG1, data, mask); ++ ++ /* ++ * 3. Set Spread Spectrum Clock Enabled ++ */ ++ comphy_lane_reg_set(lane, COMPHY_PIPE_LANE_CFG4, ++ SPREAD_SPECTRUM_CLK_EN, SPREAD_SPECTRUM_CLK_EN); ++ ++ /* ++ * 4. Set Override Margining Controls From the MAC: ++ * Use margining signals from lane configuration ++ */ ++ comphy_lane_reg_set(lane, COMPHY_PIPE_TEST_MODE_CTRL, ++ MODE_MARGIN_OVERRIDE, 0xFFFF); ++ ++ /* ++ * 5. Set Lane-to-Lane Bundle Clock Sampling Period = per PCLK cycles ++ * set Mode Clock Source = PCLK is generated from REFCLK ++ */ ++ data = 0x0; ++ mask = MODE_CLK_SRC | BUNDLE_PERIOD_SEL | BUNDLE_PERIOD_SCALE_MASK | ++ BUNDLE_SAMPLE_CTRL | PLL_READY_DLY_MASK; ++ comphy_lane_reg_set(lane, COMPHY_PIPE_CLK_SRC_LO, data, mask); ++ ++ /* ++ * 6. Set G2 Spread Spectrum Clock Amplitude at 4K ++ */ ++ comphy_lane_reg_set(lane, COMPHY_GEN2_SET2, ++ GS2_TX_SSC_AMP_4128, GS2_TX_SSC_AMP_MASK); ++ ++ /* ++ * 7. Unset G3 Spread Spectrum Clock Amplitude ++ * set G3 TX and RX Register Master Current Select ++ */ ++ data = GS2_VREG_RXTX_MAS_ISET_60U; ++ mask = GS2_TX_SSC_AMP_MASK | GS2_VREG_RXTX_MAS_ISET_MASK | ++ GS2_RSVD_6_0_MASK; ++ comphy_lane_reg_set(lane, COMPHY_GEN3_SET2, data, mask); ++ ++ /* ++ * 8. Check crystal jumper setting and program the Power and PLL Control ++ * accordingly Change RX wait ++ */ ++ if (lane->priv->xtal_is_40m) { ++ ref_clk = REF_FREF_SEL_PCIE_USB3_40MHZ; ++ cfg = CFG_PM_RXDLOZ_WAIT_12_UNIT; ++ } else { ++ ref_clk = REF_FREF_SEL_PCIE_USB3_25MHZ; ++ cfg = CFG_PM_RXDLOZ_WAIT_7_UNIT; ++ } ++ ++ data = PU_IVREF_BIT | PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT | ++ PU_TX_INTP_BIT | PU_DFE_BIT | COMPHY_MODE_USB3 | ref_clk; ++ mask = PU_IVREF_BIT | PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT | ++ PU_TX_INTP_BIT | PU_DFE_BIT | PLL_LOCK_BIT | COMPHY_MODE_MASK | ++ REF_FREF_SEL_MASK; ++ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, data, mask); ++ ++ data = CFG_PM_RXDEN_WAIT_1_UNIT | cfg; ++ mask = CFG_PM_OSCCLK_WAIT_MASK | CFG_PM_RXDEN_WAIT_MASK | ++ CFG_PM_RXDLOZ_WAIT_MASK; ++ comphy_lane_reg_set(lane, COMPHY_PIPE_PWR_MGM_TIM1, data, mask); ++ ++ /* ++ * 9. Enable idle sync ++ */ ++ comphy_lane_reg_set(lane, COMPHY_IDLE_SYNC_EN, ++ IDLE_SYNC_EN, IDLE_SYNC_EN); ++ ++ /* ++ * 10. Enable the output of 500M clock ++ */ ++ comphy_lane_reg_set(lane, COMPHY_MISC_CTRL0, CLK500M_EN, CLK500M_EN); ++ ++ /* ++ * 11. Set 20-bit data width ++ */ ++ comphy_lane_reg_set(lane, COMPHY_DIG_LOOPBACK_EN, ++ DATA_WIDTH_20BIT, 0xFFFF); ++ ++ /* ++ * 12. Override Speed_PLL value and use MAC PLL ++ */ ++ data = SPEED_PLL_VALUE_16 | USE_MAX_PLL_RATE_BIT; ++ mask = 0xFFFF; ++ comphy_lane_reg_set(lane, COMPHY_KVCO_CAL_CTRL, data, mask); ++ ++ /* ++ * 13. Check the Polarity invert bit ++ */ ++ data = 0x0; ++ if (lane->invert_tx) ++ data |= TXD_INVERT_BIT; ++ if (lane->invert_rx) ++ data |= RXD_INVERT_BIT; ++ mask = TXD_INVERT_BIT | RXD_INVERT_BIT; ++ comphy_lane_reg_set(lane, COMPHY_SYNC_PATTERN, data, mask); ++ ++ /* ++ * 14. Set max speed generation to USB3.0 5Gbps ++ */ ++ comphy_lane_reg_set(lane, COMPHY_SYNC_MASK_GEN, ++ PHY_GEN_MAX_USB3_5G, PHY_GEN_MAX_MASK); ++ ++ /* ++ * 15. Set capacitor value for FFE gain peaking to 0xF ++ */ ++ comphy_lane_reg_set(lane, COMPHY_GEN2_SET3, ++ GS3_FFE_CAP_SEL_VALUE, GS3_FFE_CAP_SEL_MASK); ++ ++ /* ++ * 16. Release SW reset ++ */ ++ data = MODE_CORE_CLK_FREQ_SEL | MODE_PIPE_WIDTH_32 | MODE_REFDIV_BY_4; ++ mask = 0xFFFF; ++ comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL, data, mask); ++ ++ /* Wait for > 55 us to allow PCLK be enabled */ ++ udelay(PLL_SET_DELAY_US); ++ ++ ret = comphy_lane_reg_poll(lane, COMPHY_PIPE_LANE_STAT1, TXDCLK_PCLK_EN, ++ COMPHY_PLL_SLEEP, COMPHY_PLL_TIMEOUT); ++ if (ret) ++ dev_err(lane->dev, "Failed to lock USB3 PLL\n"); ++ ++ return ret; ++} ++ ++static int ++mvebu_a3700_comphy_pcie_power_on(struct mvebu_a3700_comphy_lane *lane) ++{ ++ u32 mask, data, ref_clk; ++ int ret; ++ ++ /* Configure phy selector for PCIe */ ++ ret = mvebu_a3700_comphy_set_phy_selector(lane); ++ if (ret) ++ return ret; ++ ++ /* 1. Enable max PLL. */ ++ comphy_lane_reg_set(lane, COMPHY_PIPE_LANE_CFG1, ++ USE_MAX_PLL_RATE_EN, USE_MAX_PLL_RATE_EN); ++ ++ /* 2. Select 20 bit SERDES interface. */ ++ comphy_lane_reg_set(lane, COMPHY_PIPE_CLK_SRC_LO, ++ CFG_SEL_20B, CFG_SEL_20B); ++ ++ /* 3. Force to use reg setting for PCIe mode */ ++ comphy_lane_reg_set(lane, COMPHY_MISC_CTRL1, ++ SEL_BITS_PCIE_FORCE, SEL_BITS_PCIE_FORCE); ++ ++ /* 4. Change RX wait */ ++ data = CFG_PM_RXDEN_WAIT_1_UNIT | CFG_PM_RXDLOZ_WAIT_12_UNIT; ++ mask = CFG_PM_OSCCLK_WAIT_MASK | CFG_PM_RXDEN_WAIT_MASK | ++ CFG_PM_RXDLOZ_WAIT_MASK; ++ comphy_lane_reg_set(lane, COMPHY_PIPE_PWR_MGM_TIM1, data, mask); ++ ++ /* 5. Enable idle sync */ ++ comphy_lane_reg_set(lane, COMPHY_IDLE_SYNC_EN, ++ IDLE_SYNC_EN, IDLE_SYNC_EN); ++ ++ /* 6. Enable the output of 100M/125M/500M clock */ ++ data = CLK500M_EN | TXDCLK_2X_SEL | CLK100M_125M_EN; ++ mask = data; ++ comphy_lane_reg_set(lane, COMPHY_MISC_CTRL0, data, mask); ++ ++ /* ++ * 7. Enable TX, PCIE global register, 0xd0074814, it is done in ++ * PCI-E driver ++ */ ++ ++ /* ++ * 8. Check crystal jumper setting and program the Power and PLL ++ * Control accordingly ++ */ ++ ++ if (lane->priv->xtal_is_40m) ++ ref_clk = REF_FREF_SEL_PCIE_USB3_40MHZ; ++ else ++ ref_clk = REF_FREF_SEL_PCIE_USB3_25MHZ; ++ ++ data = PU_IVREF_BIT | PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT | ++ PU_TX_INTP_BIT | PU_DFE_BIT | COMPHY_MODE_PCIE | ref_clk; ++ mask = 0xFFFF; ++ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, data, mask); ++ ++ /* 9. Override Speed_PLL value and use MAC PLL */ ++ comphy_lane_reg_set(lane, COMPHY_KVCO_CAL_CTRL, ++ SPEED_PLL_VALUE_16 | USE_MAX_PLL_RATE_BIT, ++ 0xFFFF); ++ ++ /* 10. Check the Polarity invert bit */ ++ data = 0x0; ++ if (lane->invert_tx) ++ data |= TXD_INVERT_BIT; ++ if (lane->invert_rx) ++ data |= RXD_INVERT_BIT; ++ mask = TXD_INVERT_BIT | RXD_INVERT_BIT; ++ comphy_lane_reg_set(lane, COMPHY_SYNC_PATTERN, data, mask); ++ ++ /* 11. Release SW reset */ ++ data = MODE_CORE_CLK_FREQ_SEL | MODE_PIPE_WIDTH_32; ++ mask = data | PIPE_SOFT_RESET | MODE_REFDIV_MASK; ++ comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL, data, mask); ++ ++ /* Wait for > 55 us to allow PCLK be enabled */ ++ udelay(PLL_SET_DELAY_US); ++ ++ ret = comphy_lane_reg_poll(lane, COMPHY_PIPE_LANE_STAT1, TXDCLK_PCLK_EN, ++ COMPHY_PLL_SLEEP, COMPHY_PLL_TIMEOUT); ++ if (ret) ++ dev_err(lane->dev, "Failed to lock PCIE PLL\n"); ++ ++ return ret; ++} ++ ++static void ++mvebu_a3700_comphy_sata_power_off(struct mvebu_a3700_comphy_lane *lane) ++{ ++ /* Set phy isolation mode */ ++ comphy_lane_reg_set(lane, COMPHY_ISOLATION_CTRL, ++ PHY_ISOLATE_MODE, PHY_ISOLATE_MODE); ++ ++ /* Power off PLL, Tx, Rx */ ++ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, ++ 0x0, PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT); ++} ++ ++static void ++mvebu_a3700_comphy_ethernet_power_off(struct mvebu_a3700_comphy_lane *lane) ++{ ++ u32 mask, data; ++ ++ data = PIN_RESET_CORE_BIT | PIN_RESET_COMPHY_BIT | PIN_PU_IVREF_BIT | ++ PHY_RX_INIT_BIT; ++ mask = data; ++ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); ++} ++ ++static void ++mvebu_a3700_comphy_pcie_power_off(struct mvebu_a3700_comphy_lane *lane) ++{ ++ /* Power off PLL, Tx, Rx */ ++ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, ++ 0x0, PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT); ++} ++ ++static int mvebu_a3700_comphy_reset(struct phy *phy) ++{ ++ struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); ++ u16 mask, data; ++ ++ dev_dbg(lane->dev, "resetting lane %d\n", lane->id); ++ ++ /* COMPHY reset for internal logic */ ++ comphy_lane_reg_set(lane, COMPHY_SFT_RESET, ++ SFT_RST_NO_REG, SFT_RST_NO_REG); ++ ++ /* COMPHY register reset (cleared automatically) */ ++ comphy_lane_reg_set(lane, COMPHY_SFT_RESET, SFT_RST, SFT_RST); ++ ++ /* PIPE soft and register reset */ ++ data = PIPE_SOFT_RESET | PIPE_REG_RESET; ++ mask = data; ++ comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL, data, mask); ++ ++ /* Release PIPE register reset */ ++ comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL, ++ 0x0, PIPE_REG_RESET); ++ ++ /* Reset SB configuration register (only for lanes 0 and 1) */ ++ if (lane->id == 0 || lane->id == 1) { ++ u32 mask, data; ++ ++ data = PIN_RESET_CORE_BIT | PIN_RESET_COMPHY_BIT | ++ PIN_PU_PLL_BIT | PIN_PU_RX_BIT | PIN_PU_TX_BIT; ++ mask = data | PIN_PU_IVREF_BIT | PIN_TX_IDLE_BIT; ++ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); ++ } ++ ++ return 0; ++} ++ ++static bool mvebu_a3700_comphy_check_mode(int lane, + enum phy_mode mode, + int submode) + { +@@ -122,7 +1141,7 @@ static int mvebu_a3700_comphy_get_fw_mod + + /* Unused PHY mux value is 0x0 */ + if (mode == PHY_MODE_INVALID) +- return -EINVAL; ++ return false; + + for (i = 0; i < n; i++) { + if (mvebu_a3700_comphy_modes[i].lane == lane && +@@ -132,27 +1151,30 @@ static int mvebu_a3700_comphy_get_fw_mod + } + + if (i == n) +- return -EINVAL; ++ return false; + +- return mvebu_a3700_comphy_modes[i].fw_mode; ++ return true; + } + + static int mvebu_a3700_comphy_set_mode(struct phy *phy, enum phy_mode mode, + int submode) + { + struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); +- int fw_mode; + +- if (submode == PHY_INTERFACE_MODE_1000BASEX) +- submode = PHY_INTERFACE_MODE_SGMII; +- +- fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, mode, +- submode); +- if (fw_mode < 0) { ++ if (!mvebu_a3700_comphy_check_mode(lane->id, mode, submode)) { + dev_err(lane->dev, "invalid COMPHY mode\n"); +- return fw_mode; ++ return -EINVAL; + } + ++ /* Mode cannot be changed while the PHY is powered on */ ++ if (phy->power_count && ++ (lane->mode != mode || lane->submode != submode)) ++ return -EBUSY; ++ ++ /* If changing mode, ensure reset is called */ ++ if (lane->mode != PHY_MODE_INVALID && lane->mode != mode) ++ lane->needs_reset = true; ++ + /* Just remember the mode, ->power_on() will do the real setup */ + lane->mode = mode; + lane->submode = submode; +@@ -163,76 +1185,77 @@ static int mvebu_a3700_comphy_set_mode(s + static int mvebu_a3700_comphy_power_on(struct phy *phy) + { + struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); +- u32 fw_param; +- int fw_mode; +- int fw_port; + int ret; + +- fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, +- lane->mode, lane->submode); +- if (fw_mode < 0) { ++ if (!mvebu_a3700_comphy_check_mode(lane->id, lane->mode, ++ lane->submode)) { + dev_err(lane->dev, "invalid COMPHY mode\n"); +- return fw_mode; ++ return -EINVAL; ++ } ++ ++ if (lane->needs_reset) { ++ ret = mvebu_a3700_comphy_reset(phy); ++ if (ret) ++ return ret; ++ ++ lane->needs_reset = false; + } + + switch (lane->mode) { + case PHY_MODE_USB_HOST_SS: + dev_dbg(lane->dev, "set lane %d to USB3 host mode\n", lane->id); +- fw_param = COMPHY_FW_MODE(fw_mode); +- break; ++ return mvebu_a3700_comphy_usb3_power_on(lane); + case PHY_MODE_SATA: + dev_dbg(lane->dev, "set lane %d to SATA mode\n", lane->id); +- fw_param = COMPHY_FW_MODE(fw_mode); +- break; ++ return mvebu_a3700_comphy_sata_power_on(lane); + case PHY_MODE_ETHERNET: +- fw_port = (lane->id == 0) ? 1 : 0; +- switch (lane->submode) { +- case PHY_INTERFACE_MODE_SGMII: +- dev_dbg(lane->dev, "set lane %d to SGMII mode\n", +- lane->id); +- fw_param = COMPHY_FW_NET(fw_mode, fw_port, +- COMPHY_FW_SPEED_1_25G); +- break; +- case PHY_INTERFACE_MODE_2500BASEX: +- dev_dbg(lane->dev, "set lane %d to 2500BASEX mode\n", +- lane->id); +- fw_param = COMPHY_FW_NET(fw_mode, fw_port, +- COMPHY_FW_SPEED_3_125G); +- break; +- default: +- dev_err(lane->dev, "unsupported PHY submode (%d)\n", +- lane->submode); +- return -ENOTSUPP; +- } +- break; ++ dev_dbg(lane->dev, "set lane %d to Ethernet mode\n", lane->id); ++ return mvebu_a3700_comphy_ethernet_power_on(lane); + case PHY_MODE_PCIE: + dev_dbg(lane->dev, "set lane %d to PCIe mode\n", lane->id); +- fw_param = COMPHY_FW_PCIE(fw_mode, COMPHY_FW_SPEED_5G, +- phy->attrs.bus_width); +- break; ++ return mvebu_a3700_comphy_pcie_power_on(lane); + default: + dev_err(lane->dev, "unsupported PHY mode (%d)\n", lane->mode); +- return -ENOTSUPP; ++ return -EOPNOTSUPP; + } +- +- ret = mvebu_a3700_comphy_smc(COMPHY_SIP_POWER_ON, lane->id, fw_param); +- if (ret == -EOPNOTSUPP) +- dev_err(lane->dev, +- "unsupported SMC call, try updating your firmware\n"); +- +- return ret; + } + + static int mvebu_a3700_comphy_power_off(struct phy *phy) + { + struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); + +- return mvebu_a3700_comphy_smc(COMPHY_SIP_POWER_OFF, lane->id, 0); ++ switch (lane->mode) { ++ case PHY_MODE_USB_HOST_SS: ++ /* ++ * The USB3 MAC sets the USB3 PHY to low state, so we do not ++ * need to power off USB3 PHY again. ++ */ ++ break; ++ ++ case PHY_MODE_SATA: ++ mvebu_a3700_comphy_sata_power_off(lane); ++ break; ++ ++ case PHY_MODE_ETHERNET: ++ mvebu_a3700_comphy_ethernet_power_off(lane); ++ break; ++ ++ case PHY_MODE_PCIE: ++ mvebu_a3700_comphy_pcie_power_off(lane); ++ break; ++ ++ default: ++ dev_err(lane->dev, "invalid COMPHY mode\n"); ++ return -EINVAL; ++ } ++ ++ return 0; + } + + static const struct phy_ops mvebu_a3700_comphy_ops = { + .power_on = mvebu_a3700_comphy_power_on, + .power_off = mvebu_a3700_comphy_power_off, ++ .reset = mvebu_a3700_comphy_reset, + .set_mode = mvebu_a3700_comphy_set_mode, + .owner = THIS_MODULE, + }; +@@ -256,13 +1279,75 @@ static struct phy *mvebu_a3700_comphy_xl + return ERR_PTR(-EINVAL); + } + ++ lane->invert_tx = args->args[1] & BIT(0); ++ lane->invert_rx = args->args[1] & BIT(1); ++ + return phy; + } + + static int mvebu_a3700_comphy_probe(struct platform_device *pdev) + { ++ struct mvebu_a3700_comphy_priv *priv; + struct phy_provider *provider; + struct device_node *child; ++ struct resource *res; ++ struct clk *clk; ++ int ret; ++ ++ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ spin_lock_init(&priv->lock); ++ ++ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "comphy"); ++ priv->comphy_regs = devm_ioremap_resource(&pdev->dev, res); ++ if (IS_ERR(priv->comphy_regs)) ++ return PTR_ERR(priv->comphy_regs); ++ ++ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, ++ "lane1_pcie_gbe"); ++ priv->lane1_phy_regs = devm_ioremap_resource(&pdev->dev, res); ++ if (IS_ERR(priv->lane1_phy_regs)) ++ return PTR_ERR(priv->lane1_phy_regs); ++ ++ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, ++ "lane0_usb3_gbe"); ++ priv->lane0_phy_regs = devm_ioremap_resource(&pdev->dev, res); ++ if (IS_ERR(priv->lane0_phy_regs)) ++ return PTR_ERR(priv->lane0_phy_regs); ++ ++ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, ++ "lane2_sata_usb3"); ++ priv->lane2_phy_indirect = devm_ioremap_resource(&pdev->dev, res); ++ if (IS_ERR(priv->lane2_phy_indirect)) ++ return PTR_ERR(priv->lane2_phy_indirect); ++ ++ /* ++ * Driver needs to know if reference xtal clock is 40MHz or 25MHz. ++ * Old DT bindings do not have xtal clk present. So do not fail here ++ * and expects that default 25MHz reference clock is used. ++ */ ++ clk = clk_get(&pdev->dev, "xtal"); ++ if (IS_ERR(clk)) { ++ if (PTR_ERR(clk) == -EPROBE_DEFER) ++ return -EPROBE_DEFER; ++ dev_warn(&pdev->dev, "missing 'xtal' clk (%ld)\n", ++ PTR_ERR(clk)); ++ } else { ++ ret = clk_prepare_enable(clk); ++ if (ret) { ++ dev_warn(&pdev->dev, "enabling xtal clk failed (%d)\n", ++ ret); ++ } else { ++ if (clk_get_rate(clk) == 40000000) ++ priv->xtal_is_40m = true; ++ clk_disable_unprepare(clk); ++ } ++ clk_put(clk); ++ } ++ ++ dev_set_drvdata(&pdev->dev, priv); + + for_each_available_child_of_node(pdev->dev.of_node, child) { + struct mvebu_a3700_comphy_lane *lane; +@@ -277,7 +1362,7 @@ static int mvebu_a3700_comphy_probe(stru + continue; + } + +- if (lane_id >= MVEBU_A3700_COMPHY_LANES) { ++ if (lane_id >= 3) { + dev_err(&pdev->dev, "invalid 'reg' property\n"); + continue; + } +@@ -295,15 +1380,26 @@ static int mvebu_a3700_comphy_probe(stru + return PTR_ERR(phy); + } + ++ lane->priv = priv; + lane->dev = &pdev->dev; + lane->mode = PHY_MODE_INVALID; + lane->submode = PHY_INTERFACE_MODE_NA; + lane->id = lane_id; ++ lane->invert_tx = false; ++ lane->invert_rx = false; + phy_set_drvdata(phy, lane); ++ ++ /* ++ * To avoid relying on the bootloader/firmware configuration, ++ * power off all comphys. ++ */ ++ mvebu_a3700_comphy_reset(phy); ++ lane->needs_reset = false; + } + + provider = devm_of_phy_provider_register(&pdev->dev, + mvebu_a3700_comphy_xlate); ++ + return PTR_ERR_OR_ZERO(provider); + } + +@@ -323,5 +1419,7 @@ static struct platform_driver mvebu_a370 + module_platform_driver(mvebu_a3700_comphy_driver); + + MODULE_AUTHOR("Miquèl Raynal "); ++MODULE_AUTHOR("Pali Rohár "); ++MODULE_AUTHOR("Marek Behún "); + MODULE_DESCRIPTION("Common PHY driver for A3700"); + MODULE_LICENSE("GPL v2"); diff --git a/target/linux/generic/backport-5.15/345-v5.17-arm64-dts-marvell-armada-37xx-Add-xtal-clock-to-comp.patch b/target/linux/generic/backport-5.15/345-v5.17-arm64-dts-marvell-armada-37xx-Add-xtal-clock-to-comp.patch new file mode 100644 index 0000000000..03b6a5754d --- /dev/null +++ b/target/linux/generic/backport-5.15/345-v5.17-arm64-dts-marvell-armada-37xx-Add-xtal-clock-to-comp.patch @@ -0,0 +1,32 @@ +From 73a78b6130d9e13daca22b86ad52f063b9403e03 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Wed, 8 Dec 2021 03:40:35 +0100 +Subject: [PATCH 1/1] arm64: dts: marvell: armada-37xx: Add xtal clock to + comphy node +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Kernel driver phy-mvebu-a3700-comphy.c needs to know the rate of the +reference xtal clock. So add missing xtal clock source into comphy device +tree node. If the property is not present, the driver defaults to 25 MHz +xtal rate (which, as far as we know, is used by all the existing boards). + +Signed-off-by: Pali Rohár +Signed-off-by: Marek Behún +Signed-off-by: Gregory CLEMENT +--- + arch/arm64/boot/dts/marvell/armada-37xx.dtsi | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi ++++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi +@@ -265,6 +265,8 @@ + "lane2_sata_usb3"; + #address-cells = <1>; + #size-cells = <0>; ++ clocks = <&xtalclk>; ++ clock-names = "xtal"; + + comphy0: phy@0 { + reg = <0>; diff --git a/target/linux/generic/backport-5.15/346-v5.18-01-Revert-ata-ahci-mvebu-Make-SATA-PHY-optional-for-Arm.patch b/target/linux/generic/backport-5.15/346-v5.18-01-Revert-ata-ahci-mvebu-Make-SATA-PHY-optional-for-Arm.patch new file mode 100644 index 0000000000..f225a21057 --- /dev/null +++ b/target/linux/generic/backport-5.15/346-v5.18-01-Revert-ata-ahci-mvebu-Make-SATA-PHY-optional-for-Arm.patch @@ -0,0 +1,64 @@ +From ee995101fde67f85a3cd4c74f4f92fc4592e726b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Thu, 3 Feb 2022 22:44:42 +0100 +Subject: [PATCH 1/3] Revert "ata: ahci: mvebu: Make SATA PHY optional for + Armada 3720" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit 45aefe3d2251e4e229d7662052739f96ad1d08d9. + +Armada 3720 PHY driver (phy-mvebu-a3700-comphy.c) does not return +-EOPNOTSUPP from phy_power_on() callback anymore. + +So remove AHCI_HFLAG_IGN_NOTSUPP_POWER_ON flag from Armada 3720 plat data. + +AHCI_HFLAG_IGN_NOTSUPP_POWER_ON is not used by any other ahci driver, so +remove this flag completely. + +Signed-off-by: Pali Rohár +Signed-off-by: Marek Behún +Acked-by: Miquel Raynal +Acked-by: Damien Le Moal +Link: https://lore.kernel.org/r/20220203214444.1508-4-kabel@kernel.org +Signed-off-by: Vinod Koul +--- + drivers/ata/ahci.h | 2 -- + drivers/ata/ahci_mvebu.c | 2 +- + drivers/ata/libahci_platform.c | 2 +- + 3 files changed, 2 insertions(+), 4 deletions(-) + +--- a/drivers/ata/ahci.h ++++ b/drivers/ata/ahci.h +@@ -241,8 +241,6 @@ enum { + as default lpm_policy */ + AHCI_HFLAG_SUSPEND_PHYS = BIT(26), /* handle PHYs during + suspend/resume */ +- AHCI_HFLAG_IGN_NOTSUPP_POWER_ON = BIT(27), /* ignore -EOPNOTSUPP +- from phy_power_on() */ + AHCI_HFLAG_NO_SXS = BIT(28), /* SXS not supported */ + + /* ap->flags bits */ +--- a/drivers/ata/ahci_mvebu.c ++++ b/drivers/ata/ahci_mvebu.c +@@ -227,7 +227,7 @@ static const struct ahci_mvebu_plat_data + + static const struct ahci_mvebu_plat_data ahci_mvebu_armada_3700_plat_data = { + .plat_config = ahci_mvebu_armada_3700_config, +- .flags = AHCI_HFLAG_SUSPEND_PHYS | AHCI_HFLAG_IGN_NOTSUPP_POWER_ON, ++ .flags = AHCI_HFLAG_SUSPEND_PHYS, + }; + + static const struct of_device_id ahci_mvebu_of_match[] = { +--- a/drivers/ata/libahci_platform.c ++++ b/drivers/ata/libahci_platform.c +@@ -59,7 +59,7 @@ int ahci_platform_enable_phys(struct ahc + } + + rc = phy_power_on(hpriv->phys[i]); +- if (rc && !(rc == -EOPNOTSUPP && (hpriv->flags & AHCI_HFLAG_IGN_NOTSUPP_POWER_ON))) { ++ if (rc) { + phy_exit(hpriv->phys[i]); + goto disable_phys; + } diff --git a/target/linux/generic/backport-5.15/346-v5.18-02-Revert-usb-host-xhci-mvebu-make-USB-3.0-PHY-optional.patch b/target/linux/generic/backport-5.15/346-v5.18-02-Revert-usb-host-xhci-mvebu-make-USB-3.0-PHY-optional.patch new file mode 100644 index 0000000000..1e8afb7bbf --- /dev/null +++ b/target/linux/generic/backport-5.15/346-v5.18-02-Revert-usb-host-xhci-mvebu-make-USB-3.0-PHY-optional.patch @@ -0,0 +1,166 @@ +From 8e10548f7f4814e530857d2049d6af6bc78add53 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Thu, 3 Feb 2022 22:44:43 +0100 +Subject: [PATCH 2/3] Revert "usb: host: xhci: mvebu: make USB 3.0 PHY optional + for Armada 3720" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit 3241929b67d28c83945d3191c6816a3271fd6b85. + +Armada 3720 phy driver (phy-mvebu-a3700-comphy.c) does not return +-EOPNOTSUPP from phy_power_on() callback anymore. + +So remove XHCI_SKIP_PHY_INIT flag from xhci_mvebu_a3700_plat_setup() and +then also whole xhci_mvebu_a3700_plat_setup() function which is there just +to handle -EOPNOTSUPP for XHCI_SKIP_PHY_INIT. + +xhci plat_setup callback is not used by any other xhci plat driver, so +remove this callback completely. + +Signed-off-by: Pali Rohár +Signed-off-by: Marek Behún +Acked-by: Miquel Raynal +Acked-by: Greg Kroah-Hartman +Link: https://lore.kernel.org/r/20220203214444.1508-5-kabel@kernel.org +Signed-off-by: Vinod Koul +--- + drivers/usb/host/xhci-mvebu.c | 42 ----------------------------------- + drivers/usb/host/xhci-mvebu.h | 6 ----- + drivers/usb/host/xhci-plat.c | 20 +---------------- + drivers/usb/host/xhci-plat.h | 1 - + 4 files changed, 1 insertion(+), 68 deletions(-) + +--- a/drivers/usb/host/xhci-mvebu.c ++++ b/drivers/usb/host/xhci-mvebu.c +@@ -8,7 +8,6 @@ + #include + #include + #include +-#include + + #include + #include +@@ -74,47 +73,6 @@ int xhci_mvebu_mbus_init_quirk(struct us + + return 0; + } +- +-int xhci_mvebu_a3700_plat_setup(struct usb_hcd *hcd) +-{ +- struct xhci_hcd *xhci = hcd_to_xhci(hcd); +- struct device *dev = hcd->self.controller; +- struct phy *phy; +- int ret; +- +- /* Old bindings miss the PHY handle */ +- phy = of_phy_get(dev->of_node, "usb3-phy"); +- if (IS_ERR(phy) && PTR_ERR(phy) == -EPROBE_DEFER) +- return -EPROBE_DEFER; +- else if (IS_ERR(phy)) +- goto phy_out; +- +- ret = phy_init(phy); +- if (ret) +- goto phy_put; +- +- ret = phy_set_mode(phy, PHY_MODE_USB_HOST_SS); +- if (ret) +- goto phy_exit; +- +- ret = phy_power_on(phy); +- if (ret == -EOPNOTSUPP) { +- /* Skip initializatin of XHCI PHY when it is unsupported by firmware */ +- dev_warn(dev, "PHY unsupported by firmware\n"); +- xhci->quirks |= XHCI_SKIP_PHY_INIT; +- } +- if (ret) +- goto phy_exit; +- +- phy_power_off(phy); +-phy_exit: +- phy_exit(phy); +-phy_put: +- of_phy_put(phy); +-phy_out: +- +- return 0; +-} + + int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd) + { +--- a/drivers/usb/host/xhci-mvebu.h ++++ b/drivers/usb/host/xhci-mvebu.h +@@ -12,18 +12,12 @@ struct usb_hcd; + + #if IS_ENABLED(CONFIG_USB_XHCI_MVEBU) + int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd); +-int xhci_mvebu_a3700_plat_setup(struct usb_hcd *hcd); + int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd); + #else + static inline int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd) + { + return 0; + } +- +-static inline int xhci_mvebu_a3700_plat_setup(struct usb_hcd *hcd) +-{ +- return 0; +-} + + static inline int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd) + { +--- a/drivers/usb/host/xhci-plat.c ++++ b/drivers/usb/host/xhci-plat.c +@@ -44,16 +44,6 @@ static void xhci_priv_plat_start(struct + priv->plat_start(hcd); + } + +-static int xhci_priv_plat_setup(struct usb_hcd *hcd) +-{ +- struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd); +- +- if (!priv->plat_setup) +- return 0; +- +- return priv->plat_setup(hcd); +-} +- + static int xhci_priv_init_quirk(struct usb_hcd *hcd) + { + struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd); +@@ -121,7 +111,6 @@ static const struct xhci_plat_priv xhci_ + }; + + static const struct xhci_plat_priv xhci_plat_marvell_armada3700 = { +- .plat_setup = xhci_mvebu_a3700_plat_setup, + .init_quirk = xhci_mvebu_a3700_init_quirk, + }; + +@@ -341,14 +330,7 @@ static int xhci_plat_probe(struct platfo + + hcd->tpl_support = of_usb_host_tpl_support(sysdev->of_node); + xhci->shared_hcd->tpl_support = hcd->tpl_support; +- +- if (priv) { +- ret = xhci_priv_plat_setup(hcd); +- if (ret) +- goto disable_usb_phy; +- } +- +- if ((xhci->quirks & XHCI_SKIP_PHY_INIT) || (priv && (priv->quirks & XHCI_SKIP_PHY_INIT))) ++ if (priv && (priv->quirks & XHCI_SKIP_PHY_INIT)) + hcd->skip_phy_initialization = 1; + + if (priv && (priv->quirks & XHCI_SG_TRB_CACHE_SIZE_QUIRK)) +--- a/drivers/usb/host/xhci-plat.h ++++ b/drivers/usb/host/xhci-plat.h +@@ -13,7 +13,6 @@ + struct xhci_plat_priv { + const char *firmware_name; + unsigned long long quirks; +- int (*plat_setup)(struct usb_hcd *); + void (*plat_start)(struct usb_hcd *); + int (*init_quirk)(struct usb_hcd *); + int (*suspend_quirk)(struct usb_hcd *); diff --git a/target/linux/generic/backport-5.15/346-v5.18-03-Revert-PCI-aardvark-Fix-initialization-with-old-Marv.patch b/target/linux/generic/backport-5.15/346-v5.18-03-Revert-PCI-aardvark-Fix-initialization-with-old-Marv.patch new file mode 100644 index 0000000000..fcfb02d35a --- /dev/null +++ b/target/linux/generic/backport-5.15/346-v5.18-03-Revert-PCI-aardvark-Fix-initialization-with-old-Marv.patch @@ -0,0 +1,39 @@ +From 9a4556dad7bd0a6b8339cb72e169f5c76f2af6f1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Thu, 3 Feb 2022 22:44:44 +0100 +Subject: [PATCH 3/3] Revert "PCI: aardvark: Fix initialization with old + Marvell's Arm Trusted Firmware" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit b0c6ae0f8948a2be6bf4e8b4bbab9ca1343289b6. + +Armada 3720 phy driver (phy-mvebu-a3700-comphy.c) does not return +-EOPNOTSUPP from phy_power_on() callback anymore. + +So remove dead code which handles -EOPNOTSUPP return value. + +Signed-off-by: Pali Rohár +Signed-off-by: Marek Behún +Acked-by: Miquel Raynal +Acked-by: Lorenzo Pieralisi +Link: https://lore.kernel.org/r/20220203214444.1508-6-kabel@kernel.org +Signed-off-by: Vinod Koul +--- + drivers/pci/controller/pci-aardvark.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/drivers/pci/controller/pci-aardvark.c ++++ b/drivers/pci/controller/pci-aardvark.c +@@ -1642,9 +1642,7 @@ static int advk_pcie_enable_phy(struct a + } + + ret = phy_power_on(pcie->phy); +- if (ret == -EOPNOTSUPP) { +- dev_warn(&pcie->pdev->dev, "PHY unsupported by firmware\n"); +- } else if (ret) { ++ if (ret) { + phy_exit(pcie->phy); + return ret; + } diff --git a/target/linux/generic/backport-5.15/347-v6.0-phy-marvell-phy-mvebu-a3700-comphy-Remove-broken-res.patch b/target/linux/generic/backport-5.15/347-v6.0-phy-marvell-phy-mvebu-a3700-comphy-Remove-broken-res.patch new file mode 100644 index 0000000000..a2c897b7a9 --- /dev/null +++ b/target/linux/generic/backport-5.15/347-v6.0-phy-marvell-phy-mvebu-a3700-comphy-Remove-broken-res.patch @@ -0,0 +1,194 @@ +From 0a6fc70d76bddf98278af2ac000379c82aec8f11 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Mon, 29 Aug 2022 10:30:46 +0200 +Subject: [PATCH] phy: marvell: phy-mvebu-a3700-comphy: Remove broken reset + support +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Reset support for SATA PHY is somehow broken and after calling it, kernel +is not able to detect and initialize SATA disk Samsung SSD 850 EMT0 [1]. + +Reset support was introduced in commit 934337080c6c ("phy: marvell: +phy-mvebu-a3700-comphy: Add native kernel implementation") as part of +complete rewrite of this driver. v1 patch series of that commit [2] did +not contain reset support and was tested that is working fine with +Ethernet, SATA and USB PHYs without issues too. + +So for now remove broken reset support and change implementation of +power_off callback to power off all functions on specified lane (and not +only selected function) because during startup kernel does not know which +function was selected and configured by bootloader. Same logic was used +also in v1 patch series of that commit. + +This change fixes issues with initialization of SATA disk Samsung SSD 850 +and disk is working again, like before mentioned commit. + +Once problem with PHY reset callback is solved its functionality could be +re-introduced. But for now it is unknown why it does not work. + +[1] - https://lore.kernel.org/r/20220531124159.3e4lgn2v462irbtz@shindev/ +[2] - https://lore.kernel.org/r/20211028184242.22105-1-kabel@kernel.org/ + +Reported-by: Shinichiro Kawasaki +Fixes: 934337080c6c ("phy: marvell: phy-mvebu-a3700-comphy: Add native kernel implementation") +Cc: stable@vger.kernel.org # v5.18+ +Signed-off-by: Pali Rohár +Tested-by: Shinichiro Kawasaki +Link: https://lore.kernel.org/r/20220829083046.15082-1-pali@kernel.org +Signed-off-by: Vinod Koul +--- + drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 87 ++++---------------- + 1 file changed, 17 insertions(+), 70 deletions(-) + +--- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c ++++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c +@@ -274,7 +274,6 @@ struct mvebu_a3700_comphy_lane { + int submode; + bool invert_tx; + bool invert_rx; +- bool needs_reset; + }; + + struct gbe_phy_init_data_fix { +@@ -1097,40 +1096,12 @@ mvebu_a3700_comphy_pcie_power_off(struct + 0x0, PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT); + } + +-static int mvebu_a3700_comphy_reset(struct phy *phy) ++static void mvebu_a3700_comphy_usb3_power_off(struct mvebu_a3700_comphy_lane *lane) + { +- struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); +- u16 mask, data; +- +- dev_dbg(lane->dev, "resetting lane %d\n", lane->id); +- +- /* COMPHY reset for internal logic */ +- comphy_lane_reg_set(lane, COMPHY_SFT_RESET, +- SFT_RST_NO_REG, SFT_RST_NO_REG); +- +- /* COMPHY register reset (cleared automatically) */ +- comphy_lane_reg_set(lane, COMPHY_SFT_RESET, SFT_RST, SFT_RST); +- +- /* PIPE soft and register reset */ +- data = PIPE_SOFT_RESET | PIPE_REG_RESET; +- mask = data; +- comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL, data, mask); +- +- /* Release PIPE register reset */ +- comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL, +- 0x0, PIPE_REG_RESET); +- +- /* Reset SB configuration register (only for lanes 0 and 1) */ +- if (lane->id == 0 || lane->id == 1) { +- u32 mask, data; +- +- data = PIN_RESET_CORE_BIT | PIN_RESET_COMPHY_BIT | +- PIN_PU_PLL_BIT | PIN_PU_RX_BIT | PIN_PU_TX_BIT; +- mask = data | PIN_PU_IVREF_BIT | PIN_TX_IDLE_BIT; +- comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); +- } +- +- return 0; ++ /* ++ * The USB3 MAC sets the USB3 PHY to low state, so we do not ++ * need to power off USB3 PHY again. ++ */ + } + + static bool mvebu_a3700_comphy_check_mode(int lane, +@@ -1171,10 +1142,6 @@ static int mvebu_a3700_comphy_set_mode(s + (lane->mode != mode || lane->submode != submode)) + return -EBUSY; + +- /* If changing mode, ensure reset is called */ +- if (lane->mode != PHY_MODE_INVALID && lane->mode != mode) +- lane->needs_reset = true; +- + /* Just remember the mode, ->power_on() will do the real setup */ + lane->mode = mode; + lane->submode = submode; +@@ -1185,7 +1152,6 @@ static int mvebu_a3700_comphy_set_mode(s + static int mvebu_a3700_comphy_power_on(struct phy *phy) + { + struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); +- int ret; + + if (!mvebu_a3700_comphy_check_mode(lane->id, lane->mode, + lane->submode)) { +@@ -1193,14 +1159,6 @@ static int mvebu_a3700_comphy_power_on(s + return -EINVAL; + } + +- if (lane->needs_reset) { +- ret = mvebu_a3700_comphy_reset(phy); +- if (ret) +- return ret; +- +- lane->needs_reset = false; +- } +- + switch (lane->mode) { + case PHY_MODE_USB_HOST_SS: + dev_dbg(lane->dev, "set lane %d to USB3 host mode\n", lane->id); +@@ -1224,38 +1182,28 @@ static int mvebu_a3700_comphy_power_off( + { + struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); + +- switch (lane->mode) { +- case PHY_MODE_USB_HOST_SS: +- /* +- * The USB3 MAC sets the USB3 PHY to low state, so we do not +- * need to power off USB3 PHY again. +- */ +- break; +- +- case PHY_MODE_SATA: +- mvebu_a3700_comphy_sata_power_off(lane); +- break; +- +- case PHY_MODE_ETHERNET: ++ switch (lane->id) { ++ case 0: ++ mvebu_a3700_comphy_usb3_power_off(lane); + mvebu_a3700_comphy_ethernet_power_off(lane); +- break; +- +- case PHY_MODE_PCIE: ++ return 0; ++ case 1: + mvebu_a3700_comphy_pcie_power_off(lane); +- break; +- ++ mvebu_a3700_comphy_ethernet_power_off(lane); ++ return 0; ++ case 2: ++ mvebu_a3700_comphy_usb3_power_off(lane); ++ mvebu_a3700_comphy_sata_power_off(lane); ++ return 0; + default: + dev_err(lane->dev, "invalid COMPHY mode\n"); + return -EINVAL; + } +- +- return 0; + } + + static const struct phy_ops mvebu_a3700_comphy_ops = { + .power_on = mvebu_a3700_comphy_power_on, + .power_off = mvebu_a3700_comphy_power_off, +- .reset = mvebu_a3700_comphy_reset, + .set_mode = mvebu_a3700_comphy_set_mode, + .owner = THIS_MODULE, + }; +@@ -1393,8 +1341,7 @@ static int mvebu_a3700_comphy_probe(stru + * To avoid relying on the bootloader/firmware configuration, + * power off all comphys. + */ +- mvebu_a3700_comphy_reset(phy); +- lane->needs_reset = false; ++ mvebu_a3700_comphy_power_off(phy); + } + + provider = devm_of_phy_provider_register(&pdev->dev, diff --git a/target/linux/generic/backport-5.15/350-v5.18-regmap-add-configurable-downshift-for-addresses.patch b/target/linux/generic/backport-5.15/350-v5.18-regmap-add-configurable-downshift-for-addresses.patch new file mode 100644 index 0000000000..7bb328f3a6 --- /dev/null +++ b/target/linux/generic/backport-5.15/350-v5.18-regmap-add-configurable-downshift-for-addresses.patch @@ -0,0 +1,90 @@ +From 86fc59ef818beb0e1945d17f8e734898baba7e4e Mon Sep 17 00:00:00 2001 +From: Colin Foster +Date: Sun, 13 Mar 2022 15:45:23 -0700 +Subject: [PATCH 1/2] regmap: add configurable downshift for addresses + +Add an additional reg_downshift to be applied to register addresses before +any register accesses. An example of a device that uses this is a VSC7514 +chip, which require each register address to be downshifted by two if the +access is performed over a SPI bus. + +Signed-off-by: Colin Foster +Link: https://lore.kernel.org/r/20220313224524.399947-2-colin.foster@in-advantage.com +Signed-off-by: Mark Brown +--- + drivers/base/regmap/internal.h | 1 + + drivers/base/regmap/regmap.c | 5 +++++ + include/linux/regmap.h | 3 +++ + 3 files changed, 9 insertions(+) + +--- a/drivers/base/regmap/internal.h ++++ b/drivers/base/regmap/internal.h +@@ -31,6 +31,7 @@ struct regmap_format { + size_t buf_size; + size_t reg_bytes; + size_t pad_bytes; ++ size_t reg_downshift; + size_t val_bytes; + void (*format_write)(struct regmap *map, + unsigned int reg, unsigned int val); +--- a/drivers/base/regmap/regmap.c ++++ b/drivers/base/regmap/regmap.c +@@ -823,6 +823,7 @@ struct regmap *__regmap_init(struct devi + + map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8); + map->format.pad_bytes = config->pad_bits / 8; ++ map->format.reg_downshift = config->reg_downshift; + map->format.val_bytes = DIV_ROUND_UP(config->val_bits, 8); + map->format.buf_size = DIV_ROUND_UP(config->reg_bits + + config->val_bits + config->pad_bits, 8); +@@ -1737,6 +1738,7 @@ static int _regmap_raw_write_impl(struct + return ret; + } + ++ reg >>= map->format.reg_downshift; + map->format.format_reg(map->work_buf, reg, map->reg_shift); + regmap_set_work_buf_flag_mask(map, map->format.reg_bytes, + map->write_flag_mask); +@@ -1907,6 +1909,7 @@ static int _regmap_bus_formatted_write(v + return ret; + } + ++ reg >>= map->format.reg_downshift; + map->format.format_write(map, reg, val); + + trace_regmap_hw_write_start(map, reg, 1); +@@ -2348,6 +2351,7 @@ static int _regmap_raw_multi_reg_write(s + unsigned int reg = regs[i].reg; + unsigned int val = regs[i].def; + trace_regmap_hw_write_start(map, reg, 1); ++ reg >>= map->format.reg_downshift; + map->format.format_reg(u8, reg, map->reg_shift); + u8 += reg_bytes + pad_bytes; + map->format.format_val(u8, val, 0); +@@ -2675,6 +2679,7 @@ static int _regmap_raw_read(struct regma + return ret; + } + ++ reg >>= map->format.reg_downshift; + map->format.format_reg(map->work_buf, reg, map->reg_shift); + regmap_set_work_buf_flag_mask(map, map->format.reg_bytes, + map->read_flag_mask); +--- a/include/linux/regmap.h ++++ b/include/linux/regmap.h +@@ -237,6 +237,8 @@ typedef void (*regmap_unlock)(void *); + * @reg_stride: The register address stride. Valid register addresses are a + * multiple of this value. If set to 0, a value of 1 will be + * used. ++ * @reg_downshift: The number of bits to downshift the register before ++ * performing any operations. + * @pad_bits: Number of bits of padding between register and value. + * @val_bits: Number of bits in a register value, mandatory. + * +@@ -360,6 +362,7 @@ struct regmap_config { + + int reg_bits; + int reg_stride; ++ int reg_downshift; + int pad_bits; + int val_bits; + diff --git a/target/linux/generic/backport-5.15/351-v5.18-regmap-allow-a-defined-reg_base-to-be-added-to-every.patch b/target/linux/generic/backport-5.15/351-v5.18-regmap-allow-a-defined-reg_base-to-be-added-to-every.patch new file mode 100644 index 0000000000..841f8d4528 --- /dev/null +++ b/target/linux/generic/backport-5.15/351-v5.18-regmap-allow-a-defined-reg_base-to-be-added-to-every.patch @@ -0,0 +1,95 @@ +From 0074f3f2b1e43d3cedd97e47fb6980db6d2ba79e Mon Sep 17 00:00:00 2001 +From: Colin Foster +Date: Sun, 13 Mar 2022 15:45:24 -0700 +Subject: [PATCH 2/2] regmap: allow a defined reg_base to be added to every + address + +There's an inconsistency that arises when a register set can be accessed +internally via MMIO, or externally via SPI. The VSC7514 chip allows both +modes of operation. When internally accessed, the system utilizes __iomem, +devm_ioremap_resource, and devm_regmap_init_mmio. + +For SPI it isn't possible to utilize memory-mapped IO. To properly operate, +the resource base must be added to the register before every operation. + +Signed-off-by: Colin Foster +Link: https://lore.kernel.org/r/20220313224524.399947-3-colin.foster@in-advantage.com +Signed-off-by: Mark Brown +--- + drivers/base/regmap/internal.h | 1 + + drivers/base/regmap/regmap.c | 6 ++++++ + include/linux/regmap.h | 3 +++ + 3 files changed, 10 insertions(+) + +--- a/drivers/base/regmap/internal.h ++++ b/drivers/base/regmap/internal.h +@@ -63,6 +63,7 @@ struct regmap { + regmap_unlock unlock; + void *lock_arg; /* This is passed to lock/unlock functions */ + gfp_t alloc_flags; ++ unsigned int reg_base; + + struct device *dev; /* Device we do I/O on */ + void *work_buf; /* Scratch buffer used to format I/O */ +--- a/drivers/base/regmap/regmap.c ++++ b/drivers/base/regmap/regmap.c +@@ -821,6 +821,8 @@ struct regmap *__regmap_init(struct devi + else + map->alloc_flags = GFP_KERNEL; + ++ map->reg_base = config->reg_base; ++ + map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8); + map->format.pad_bytes = config->pad_bits / 8; + map->format.reg_downshift = config->reg_downshift; +@@ -1738,6 +1740,7 @@ static int _regmap_raw_write_impl(struct + return ret; + } + ++ reg += map->reg_base; + reg >>= map->format.reg_downshift; + map->format.format_reg(map->work_buf, reg, map->reg_shift); + regmap_set_work_buf_flag_mask(map, map->format.reg_bytes, +@@ -1909,6 +1912,7 @@ static int _regmap_bus_formatted_write(v + return ret; + } + ++ reg += map->reg_base; + reg >>= map->format.reg_downshift; + map->format.format_write(map, reg, val); + +@@ -2351,6 +2355,7 @@ static int _regmap_raw_multi_reg_write(s + unsigned int reg = regs[i].reg; + unsigned int val = regs[i].def; + trace_regmap_hw_write_start(map, reg, 1); ++ reg += map->reg_base; + reg >>= map->format.reg_downshift; + map->format.format_reg(u8, reg, map->reg_shift); + u8 += reg_bytes + pad_bytes; +@@ -2679,6 +2684,7 @@ static int _regmap_raw_read(struct regma + return ret; + } + ++ reg += map->reg_base; + reg >>= map->format.reg_downshift; + map->format.format_reg(map->work_buf, reg, map->reg_shift); + regmap_set_work_buf_flag_mask(map, map->format.reg_bytes, +--- a/include/linux/regmap.h ++++ b/include/linux/regmap.h +@@ -239,6 +239,8 @@ typedef void (*regmap_unlock)(void *); + * used. + * @reg_downshift: The number of bits to downshift the register before + * performing any operations. ++ * @reg_base: Value to be added to every register address before performing any ++ * operation. + * @pad_bits: Number of bits of padding between register and value. + * @val_bits: Number of bits in a register value, mandatory. + * +@@ -363,6 +365,7 @@ struct regmap_config { + int reg_bits; + int reg_stride; + int reg_downshift; ++ unsigned int reg_base; + int pad_bits; + int val_bits; + diff --git a/target/linux/generic/backport-5.15/352-v6.3-regmap-apply-reg_base-and-reg_downshift-for-single-r.patch b/target/linux/generic/backport-5.15/352-v6.3-regmap-apply-reg_base-and-reg_downshift-for-single-r.patch new file mode 100644 index 0000000000..bc3865c75b --- /dev/null +++ b/target/linux/generic/backport-5.15/352-v6.3-regmap-apply-reg_base-and-reg_downshift-for-single-r.patch @@ -0,0 +1,57 @@ +From 697c3892d825fb78f42ec8e53bed065dd728db3e Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 30 Jan 2023 02:04:57 +0000 +Subject: [PATCH] regmap: apply reg_base and reg_downshift for single register + ops + +reg_base and reg_downshift currently don't have any effect if used with +a regmap_bus or regmap_config which only offers single register +operations (ie. reg_read, reg_write and optionally reg_update_bits). + +Fix that and take them into account also for regmap_bus with only +reg_read and read_write operations by applying reg_base and +reg_downshift in _regmap_bus_reg_write, _regmap_bus_reg_read. + +Also apply reg_base and reg_downshift in _regmap_update_bits, but only +in case the operation is carried out with a reg_update_bits call +defined in either regmap_bus or regmap_config. + +Fixes: 0074f3f2b1e43d ("regmap: allow a defined reg_base to be added to every address") +Fixes: 86fc59ef818beb ("regmap: add configurable downshift for addresses") +Signed-off-by: Daniel Golle +Tested-by: Colin Foster +Link: https://lore.kernel.org/r/Y9clyVS3tQEHlUhA@makrotopia.org +Signed-off-by: Mark Brown +--- + drivers/base/regmap/regmap.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/base/regmap/regmap.c ++++ b/drivers/base/regmap/regmap.c +@@ -1931,6 +1931,8 @@ static int _regmap_bus_reg_write(void *c + { + struct regmap *map = context; + ++ reg += map->reg_base; ++ reg >>= map->format.reg_downshift; + return map->bus->reg_write(map->bus_context, reg, val); + } + +@@ -2705,6 +2707,8 @@ static int _regmap_bus_reg_read(void *co + { + struct regmap *map = context; + ++ reg += map->reg_base; ++ reg >>= map->format.reg_downshift; + return map->bus->reg_read(map->bus_context, reg, val); + } + +@@ -3080,6 +3084,8 @@ static int _regmap_update_bits(struct re + *change = false; + + if (regmap_volatile(map, reg) && map->reg_update_bits) { ++ reg += map->reg_base; ++ reg >>= map->format.reg_downshift; + ret = map->reg_update_bits(map->bus_context, reg, mask, val); + if (ret == 0 && change) + *change = true; diff --git a/target/linux/generic/backport-5.15/400-v5.19-mtd-call-of_platform_populate-for-MTD-partitions.patch b/target/linux/generic/backport-5.15/400-v5.19-mtd-call-of_platform_populate-for-MTD-partitions.patch new file mode 100644 index 0000000000..1f3aae13b4 --- /dev/null +++ b/target/linux/generic/backport-5.15/400-v5.19-mtd-call-of_platform_populate-for-MTD-partitions.patch @@ -0,0 +1,72 @@ +From bcdf0315a61a29eb753a607d3a85a4032de72d94 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 10 May 2022 15:12:59 +0200 +Subject: [PATCH] mtd: call of_platform_populate() for MTD partitions +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Until this change MTD subsystem supported handling partitions only with +MTD partitions parsers. That's a specific / limited API designed around +partitions. + +Some MTD partitions may however require different handling. They may +contain specific data that needs to be parsed and somehow extracted. For +that purpose MTD subsystem should allow binding of standard platform +drivers. + +An example can be U-Boot (sub)partition with environment variables. +There exist a "u-boot,env" DT binding for MTD (sub)partition that +requires an NVMEM driver. + +Ref: 5db1c2dbc04c ("dt-bindings: nvmem: add U-Boot environment variables binding") +Signed-off-by: Rafał Miłecki +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220510131259.555-1-zajec5@gmail.com +--- + drivers/mtd/mtdpart.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/drivers/mtd/mtdpart.c ++++ b/drivers/mtd/mtdpart.c +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + + #include "mtdcore.h" + +@@ -577,10 +578,16 @@ static int mtd_part_of_parse(struct mtd_ + struct mtd_part_parser *parser; + struct device_node *np; + struct property *prop; ++ struct device *dev; + const char *compat; + const char *fixed = "fixed-partitions"; + int ret, err = 0; + ++ dev = &master->dev; ++ /* Use parent device (controller) if the top level MTD is not registered */ ++ if (!IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER) && !mtd_is_partition(master)) ++ dev = master->dev.parent; ++ + np = mtd_get_of_node(master); + if (mtd_is_partition(master)) + of_node_get(np); +@@ -593,6 +600,7 @@ static int mtd_part_of_parse(struct mtd_ + continue; + ret = mtd_part_do_parse(parser, master, pparts, NULL); + if (ret > 0) { ++ of_platform_populate(np, NULL, NULL, dev); + of_node_put(np); + return ret; + } +@@ -600,6 +608,7 @@ static int mtd_part_of_parse(struct mtd_ + if (ret < 0 && !err) + err = ret; + } ++ of_platform_populate(np, NULL, NULL, dev); + of_node_put(np); + + /* diff --git a/target/linux/generic/backport-5.15/401-v6.0-mtd-parsers-add-support-for-Sercomm-partitions.patch b/target/linux/generic/backport-5.15/401-v6.0-mtd-parsers-add-support-for-Sercomm-partitions.patch new file mode 100644 index 0000000000..67517fa67d --- /dev/null +++ b/target/linux/generic/backport-5.15/401-v6.0-mtd-parsers-add-support-for-Sercomm-partitions.patch @@ -0,0 +1,302 @@ +From 9b78ef0c7997052e9eaa0f7a4513d546fa17358c Mon Sep 17 00:00:00 2001 +From: Mikhail Zhilkin +Date: Sun, 29 May 2022 11:07:14 +0000 +Subject: [PATCH] mtd: parsers: add support for Sercomm partitions + +This adds an MTD partition parser for the Sercomm partition table that +is used in some Beeline, Netgear and Sercomm routers. + +The Sercomm partition map table contains real partition offsets, which +may differ from device to device depending on the number and location of +bad blocks on NAND. + +Original patch (proposed by NOGUCHI Hiroshi): +Link: https://github.com/librecmc/librecmc/pull/1318#issuecomment-420607394 + +Signed-off-by: NOGUCHI Hiroshi +Signed-off-by: Mikhail Zhilkin +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220529110714.189732-1-csharper2005@gmail.com +--- + drivers/mtd/parsers/Kconfig | 9 ++ + drivers/mtd/parsers/Makefile | 1 + + drivers/mtd/parsers/scpart.c | 248 +++++++++++++++++++++++++++++++++++ + 3 files changed, 258 insertions(+) + create mode 100644 drivers/mtd/parsers/scpart.c + +--- a/drivers/mtd/parsers/Kconfig ++++ b/drivers/mtd/parsers/Kconfig +@@ -186,3 +186,12 @@ config MTD_QCOMSMEM_PARTS + help + This provides support for parsing partitions from Shared Memory (SMEM) + for NAND and SPI flash on Qualcomm platforms. ++ ++config MTD_SERCOMM_PARTS ++ tristate "Sercomm partition table parser" ++ depends on MTD && RALINK ++ help ++ This provides partitions table parser for devices with Sercomm ++ partition map. This partition table contains real partition ++ offsets, which may differ from device to device depending on the ++ number and location of bad blocks on NAND. +--- a/drivers/mtd/parsers/Makefile ++++ b/drivers/mtd/parsers/Makefile +@@ -10,6 +10,7 @@ ofpart-$(CONFIG_MTD_OF_PARTS_LINKSYS_NS) + obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o + obj-$(CONFIG_MTD_AFS_PARTS) += afs.o + obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o ++obj-$(CONFIG_MTD_SERCOMM_PARTS) += scpart.o + obj-$(CONFIG_MTD_SHARPSL_PARTS) += sharpslpart.o + obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o + obj-$(CONFIG_MTD_QCOMSMEM_PARTS) += qcomsmempart.o +--- /dev/null ++++ b/drivers/mtd/parsers/scpart.c +@@ -0,0 +1,248 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++/* ++ * drivers/mtd/scpart.c: Sercomm Partition Parser ++ * ++ * Copyright (C) 2018 NOGUCHI Hiroshi ++ * Copyright (C) 2022 Mikhail Zhilkin ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define MOD_NAME "scpart" ++ ++#ifdef pr_fmt ++#undef pr_fmt ++#endif ++ ++#define pr_fmt(fmt) MOD_NAME ": " fmt ++ ++#define ID_ALREADY_FOUND 0xffffffffUL ++ ++#define MAP_OFFS_IN_BLK 0x800 ++#define MAP_MIRROR_NUM 2 ++ ++static const char sc_part_magic[] = { ++ 'S', 'C', 'F', 'L', 'M', 'A', 'P', 'O', 'K', '\0', ++}; ++#define PART_MAGIC_LEN sizeof(sc_part_magic) ++ ++/* assumes that all fields are set by CPU native endian */ ++struct sc_part_desc { ++ uint32_t part_id; ++ uint32_t part_offs; ++ uint32_t part_bytes; ++}; ++ ++static uint32_t scpart_desc_is_valid(struct sc_part_desc *pdesc) ++{ ++ return ((pdesc->part_id != 0xffffffffUL) && ++ (pdesc->part_offs != 0xffffffffUL) && ++ (pdesc->part_bytes != 0xffffffffUL)); ++} ++ ++static int scpart_scan_partmap(struct mtd_info *master, loff_t partmap_offs, ++ struct sc_part_desc **ppdesc) ++{ ++ int cnt = 0; ++ int res = 0; ++ int res2; ++ loff_t offs; ++ size_t retlen; ++ struct sc_part_desc *pdesc = NULL; ++ struct sc_part_desc *tmpdesc; ++ uint8_t *buf; ++ ++ buf = kzalloc(master->erasesize, GFP_KERNEL); ++ if (!buf) { ++ res = -ENOMEM; ++ goto out; ++ } ++ ++ res2 = mtd_read(master, partmap_offs, master->erasesize, &retlen, buf); ++ if (res2 || retlen != master->erasesize) { ++ res = -EIO; ++ goto free; ++ } ++ ++ for (offs = MAP_OFFS_IN_BLK; ++ offs < master->erasesize - sizeof(*tmpdesc); ++ offs += sizeof(*tmpdesc)) { ++ tmpdesc = (struct sc_part_desc *)&buf[offs]; ++ if (!scpart_desc_is_valid(tmpdesc)) ++ break; ++ cnt++; ++ } ++ ++ if (cnt > 0) { ++ int bytes = cnt * sizeof(*pdesc); ++ ++ pdesc = kcalloc(cnt, sizeof(*pdesc), GFP_KERNEL); ++ if (!pdesc) { ++ res = -ENOMEM; ++ goto free; ++ } ++ memcpy(pdesc, &(buf[MAP_OFFS_IN_BLK]), bytes); ++ ++ *ppdesc = pdesc; ++ res = cnt; ++ } ++ ++free: ++ kfree(buf); ++ ++out: ++ return res; ++} ++ ++static int scpart_find_partmap(struct mtd_info *master, ++ struct sc_part_desc **ppdesc) ++{ ++ int magic_found = 0; ++ int res = 0; ++ int res2; ++ loff_t offs = 0; ++ size_t retlen; ++ uint8_t rdbuf[PART_MAGIC_LEN]; ++ ++ while ((magic_found < MAP_MIRROR_NUM) && ++ (offs < master->size) && ++ !mtd_block_isbad(master, offs)) { ++ res2 = mtd_read(master, offs, PART_MAGIC_LEN, &retlen, rdbuf); ++ if (res2 || retlen != PART_MAGIC_LEN) { ++ res = -EIO; ++ goto out; ++ } ++ if (!memcmp(rdbuf, sc_part_magic, PART_MAGIC_LEN)) { ++ pr_debug("Signature found at 0x%llx\n", offs); ++ magic_found++; ++ res = scpart_scan_partmap(master, offs, ppdesc); ++ if (res > 0) ++ goto out; ++ } ++ offs += master->erasesize; ++ } ++ ++out: ++ if (res > 0) ++ pr_info("Valid 'SC PART MAP' (%d partitions) found at 0x%llx\n", res, offs); ++ else ++ pr_info("No valid 'SC PART MAP' was found\n"); ++ ++ return res; ++} ++ ++static int scpart_parse(struct mtd_info *master, ++ const struct mtd_partition **pparts, ++ struct mtd_part_parser_data *data) ++{ ++ const char *partname; ++ int n; ++ int nr_scparts; ++ int nr_parts = 0; ++ int res = 0; ++ struct sc_part_desc *scpart_map = NULL; ++ struct mtd_partition *parts = NULL; ++ struct device_node *mtd_node; ++ struct device_node *ofpart_node; ++ struct device_node *pp; ++ ++ mtd_node = mtd_get_of_node(master); ++ if (!mtd_node) { ++ res = -ENOENT; ++ goto out; ++ } ++ ++ ofpart_node = of_get_child_by_name(mtd_node, "partitions"); ++ if (!ofpart_node) { ++ pr_info("%s: 'partitions' subnode not found on %pOF.\n", ++ master->name, mtd_node); ++ res = -ENOENT; ++ goto out; ++ } ++ ++ nr_scparts = scpart_find_partmap(master, &scpart_map); ++ if (nr_scparts <= 0) { ++ pr_info("No any partitions was found in 'SC PART MAP'.\n"); ++ res = -ENOENT; ++ goto free; ++ } ++ ++ parts = kcalloc(of_get_child_count(ofpart_node), sizeof(*parts), ++ GFP_KERNEL); ++ if (!parts) { ++ res = -ENOMEM; ++ goto free; ++ } ++ ++ for_each_child_of_node(ofpart_node, pp) { ++ u32 scpart_id; ++ ++ if (of_property_read_u32(pp, "sercomm,scpart-id", &scpart_id)) ++ continue; ++ ++ for (n = 0 ; n < nr_scparts ; n++) ++ if ((scpart_map[n].part_id != ID_ALREADY_FOUND) && ++ (scpart_id == scpart_map[n].part_id)) ++ break; ++ if (n >= nr_scparts) ++ /* not match */ ++ continue; ++ ++ /* add the partition found in OF into MTD partition array */ ++ parts[nr_parts].offset = scpart_map[n].part_offs; ++ parts[nr_parts].size = scpart_map[n].part_bytes; ++ parts[nr_parts].of_node = pp; ++ ++ if (!of_property_read_string(pp, "label", &partname)) ++ parts[nr_parts].name = partname; ++ if (of_property_read_bool(pp, "read-only")) ++ parts[nr_parts].mask_flags |= MTD_WRITEABLE; ++ if (of_property_read_bool(pp, "lock")) ++ parts[nr_parts].mask_flags |= MTD_POWERUP_LOCK; ++ ++ /* mark as 'done' */ ++ scpart_map[n].part_id = ID_ALREADY_FOUND; ++ ++ nr_parts++; ++ } ++ ++ if (nr_parts > 0) { ++ *pparts = parts; ++ res = nr_parts; ++ } else ++ pr_info("No partition in OF matches partition ID with 'SC PART MAP'.\n"); ++ ++ of_node_put(pp); ++ ++free: ++ kfree(scpart_map); ++ if (res <= 0) ++ kfree(parts); ++ ++out: ++ return res; ++} ++ ++static const struct of_device_id scpart_parser_of_match_table[] = { ++ { .compatible = "sercomm,sc-partitions" }, ++ {}, ++}; ++MODULE_DEVICE_TABLE(of, scpart_parser_of_match_table); ++ ++static struct mtd_part_parser scpart_parser = { ++ .parse_fn = scpart_parse, ++ .name = "scpart", ++ .of_match_table = scpart_parser_of_match_table, ++}; ++module_mtd_part_parser(scpart_parser); ++ ++/* mtd parsers will request the module by parser name */ ++MODULE_ALIAS("scpart"); ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("NOGUCHI Hiroshi "); ++MODULE_AUTHOR("Mikhail Zhilkin "); ++MODULE_DESCRIPTION("Sercomm partition parser"); diff --git a/target/linux/generic/backport-5.15/402-v6.0-mtd-next-mtd-core-introduce-of-support-for-dynamic-partitions.patch b/target/linux/generic/backport-5.15/402-v6.0-mtd-next-mtd-core-introduce-of-support-for-dynamic-partitions.patch new file mode 100644 index 0000000000..ee385416d1 --- /dev/null +++ b/target/linux/generic/backport-5.15/402-v6.0-mtd-next-mtd-core-introduce-of-support-for-dynamic-partitions.patch @@ -0,0 +1,106 @@ +From ad9b10d1eaada169bd764abcab58f08538877e26 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 22 Jun 2022 03:06:28 +0200 +Subject: mtd: core: introduce of support for dynamic partitions + +We have many parser that register mtd partitions at runtime. One example +is the cmdlinepart or the smem-part parser where the compatible is defined +in the dts and the partitions gets detected and registered by the +parser. This is problematic for the NVMEM subsystem that requires an OF +node to detect NVMEM cells. + +To fix this problem, introduce an additional logic that will try to +assign an OF node to the MTD if declared. + +On MTD addition, it will be checked if the MTD has an OF node and if +not declared will check if a partition with the same label / node name is +declared in DTS. If an exact match is found, the partition dynamically +allocated by the parser will have a connected OF node. + +The NVMEM subsystem will detect the OF node and register any NVMEM cells +declared statically in the DTS. + +Signed-off-by: Christian Marangi +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220622010628.30414-4-ansuelsmth@gmail.com +--- + drivers/mtd/mtdcore.c | 61 +++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 61 insertions(+) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -564,6 +564,66 @@ static int mtd_nvmem_add(struct mtd_info + return 0; + } + ++static void mtd_check_of_node(struct mtd_info *mtd) ++{ ++ struct device_node *partitions, *parent_dn, *mtd_dn = NULL; ++ const char *pname, *prefix = "partition-"; ++ int plen, mtd_name_len, offset, prefix_len; ++ struct mtd_info *parent; ++ bool found = false; ++ ++ /* Check if MTD already has a device node */ ++ if (dev_of_node(&mtd->dev)) ++ return; ++ ++ /* Check if a partitions node exist */ ++ parent = mtd->parent; ++ parent_dn = dev_of_node(&parent->dev); ++ if (!parent_dn) ++ return; ++ ++ partitions = of_get_child_by_name(parent_dn, "partitions"); ++ if (!partitions) ++ goto exit_parent; ++ ++ prefix_len = strlen(prefix); ++ mtd_name_len = strlen(mtd->name); ++ ++ /* Search if a partition is defined with the same name */ ++ for_each_child_of_node(partitions, mtd_dn) { ++ offset = 0; ++ ++ /* Skip partition with no/wrong prefix */ ++ if (!of_node_name_prefix(mtd_dn, "partition-")) ++ continue; ++ ++ /* Label have priority. Check that first */ ++ if (of_property_read_string(mtd_dn, "label", &pname)) { ++ of_property_read_string(mtd_dn, "name", &pname); ++ offset = prefix_len; ++ } ++ ++ plen = strlen(pname) - offset; ++ if (plen == mtd_name_len && ++ !strncmp(mtd->name, pname + offset, plen)) { ++ found = true; ++ break; ++ } ++ } ++ ++ if (!found) ++ goto exit_partitions; ++ ++ /* Set of_node only for nvmem */ ++ if (of_device_is_compatible(mtd_dn, "nvmem-cells")) ++ mtd_set_of_node(mtd, mtd_dn); ++ ++exit_partitions: ++ of_node_put(partitions); ++exit_parent: ++ of_node_put(parent_dn); ++} ++ + /** + * add_mtd_device - register an MTD device + * @mtd: pointer to new MTD device info structure +@@ -669,6 +729,7 @@ int add_mtd_device(struct mtd_info *mtd) + mtd->dev.devt = MTD_DEVT(i); + dev_set_name(&mtd->dev, "mtd%d", i); + dev_set_drvdata(&mtd->dev, mtd); ++ mtd_check_of_node(mtd); + of_node_get(mtd_get_of_node(mtd)); + error = device_register(&mtd->dev); + if (error) { diff --git a/target/linux/generic/backport-5.15/403-v6.1-mtd-allow-getting-MTD-device-associated-with-a-speci.patch b/target/linux/generic/backport-5.15/403-v6.1-mtd-allow-getting-MTD-device-associated-with-a-speci.patch new file mode 100644 index 0000000000..3039eabea5 --- /dev/null +++ b/target/linux/generic/backport-5.15/403-v6.1-mtd-allow-getting-MTD-device-associated-with-a-speci.patch @@ -0,0 +1,72 @@ +From b0321721be50b80c03a51866a94fde4f94690e18 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Wed, 15 Jun 2022 21:42:59 +0200 +Subject: [PATCH] mtd: allow getting MTD device associated with a specific DT + node +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +MTD subsystem API allows interacting with MTD devices (e.g. reading, +writing, handling bad blocks). So far a random driver could get MTD +device only by its name (get_mtd_device_nm()). This change allows +getting them also by a DT node. + +This API is required for drivers handling DT defined MTD partitions in a +specific way (e.g. U-Boot (sub)partition with environment variables). + +Signed-off-by: Rafał Miłecki +Acked-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +--- + drivers/mtd/mtdcore.c | 28 ++++++++++++++++++++++++++++ + include/linux/mtd/mtd.h | 1 + + 2 files changed, 29 insertions(+) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -1236,6 +1236,34 @@ int __get_mtd_device(struct mtd_info *mt + EXPORT_SYMBOL_GPL(__get_mtd_device); + + /** ++ * of_get_mtd_device_by_node - obtain an MTD device associated with a given node ++ * ++ * @np: device tree node ++ */ ++struct mtd_info *of_get_mtd_device_by_node(struct device_node *np) ++{ ++ struct mtd_info *mtd = NULL; ++ struct mtd_info *tmp; ++ int err; ++ ++ mutex_lock(&mtd_table_mutex); ++ ++ err = -EPROBE_DEFER; ++ mtd_for_each_device(tmp) { ++ if (mtd_get_of_node(tmp) == np) { ++ mtd = tmp; ++ err = __get_mtd_device(mtd); ++ break; ++ } ++ } ++ ++ mutex_unlock(&mtd_table_mutex); ++ ++ return err ? ERR_PTR(err) : mtd; ++} ++EXPORT_SYMBOL_GPL(of_get_mtd_device_by_node); ++ ++/** + * get_mtd_device_nm - obtain a validated handle for an MTD device by + * device name + * @name: MTD device name to open +--- a/include/linux/mtd/mtd.h ++++ b/include/linux/mtd/mtd.h +@@ -682,6 +682,7 @@ extern int mtd_device_unregister(struct + extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num); + extern int __get_mtd_device(struct mtd_info *mtd); + extern void __put_mtd_device(struct mtd_info *mtd); ++extern struct mtd_info *of_get_mtd_device_by_node(struct device_node *np); + extern struct mtd_info *get_mtd_device_nm(const char *name); + extern void put_mtd_device(struct mtd_info *mtd); + diff --git a/target/linux/generic/backport-5.15/404-v6.0-mtd-core-check-partition-before-dereference.patch b/target/linux/generic/backport-5.15/404-v6.0-mtd-core-check-partition-before-dereference.patch new file mode 100644 index 0000000000..e45e2ab48e --- /dev/null +++ b/target/linux/generic/backport-5.15/404-v6.0-mtd-core-check-partition-before-dereference.patch @@ -0,0 +1,30 @@ +From 7ec4cdb321738d44ae5d405e7b6ac73dfbf99caa Mon Sep 17 00:00:00 2001 +From: Tetsuo Handa +Date: Mon, 25 Jul 2022 22:49:25 +0900 +Subject: [PATCH] mtd: core: check partition before dereference + +syzbot is reporting NULL pointer dereference at mtd_check_of_node() [1], +for mtdram test device (CONFIG_MTD_MTDRAM) is not partition. + +Link: https://syzkaller.appspot.com/bug?extid=fe013f55a2814a9e8cfd [1] +Reported-by: syzbot +Reported-by: kernel test robot +Fixes: ad9b10d1eaada169 ("mtd: core: introduce of support for dynamic partitions") +Signed-off-by: Tetsuo Handa +CC: stable@vger.kernel.org +Signed-off-by: Richard Weinberger +--- + drivers/mtd/mtdcore.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -577,6 +577,8 @@ static void mtd_check_of_node(struct mtd + return; + + /* Check if a partitions node exist */ ++ if (!mtd_is_partition(mtd)) ++ return; + parent = mtd->parent; + parent_dn = dev_of_node(&parent->dev); + if (!parent_dn) diff --git a/target/linux/generic/backport-5.15/405-v6.1-mtd-core-add-missing-of_node_get-in-dynamic-partitio.patch b/target/linux/generic/backport-5.15/405-v6.1-mtd-core-add-missing-of_node_get-in-dynamic-partitio.patch new file mode 100644 index 0000000000..9399a00aa1 --- /dev/null +++ b/target/linux/generic/backport-5.15/405-v6.1-mtd-core-add-missing-of_node_get-in-dynamic-partitio.patch @@ -0,0 +1,101 @@ +From 12b58961de0bd88b3c7dfa5d21f6d67f4678b780 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 18 Oct 2022 07:18:22 +0200 +Subject: [PATCH] mtd: core: add missing of_node_get() in dynamic partitions + code +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This fixes unbalanced of_node_put(): +[ 1.078910] 6 cmdlinepart partitions found on MTD device gpmi-nand +[ 1.085116] Creating 6 MTD partitions on "gpmi-nand": +[ 1.090181] 0x000000000000-0x000008000000 : "nandboot" +[ 1.096952] 0x000008000000-0x000009000000 : "nandfit" +[ 1.103547] 0x000009000000-0x00000b000000 : "nandkernel" +[ 1.110317] 0x00000b000000-0x00000c000000 : "nanddtb" +[ 1.115525] ------------[ cut here ]------------ +[ 1.120141] refcount_t: addition on 0; use-after-free. +[ 1.125328] WARNING: CPU: 0 PID: 1 at lib/refcount.c:25 refcount_warn_saturate+0xdc/0x148 +[ 1.133528] Modules linked in: +[ 1.136589] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.0.0-rc7-next-20220930-04543-g8cf3f7 +[ 1.146342] Hardware name: Freescale i.MX8DXL DDR3L EVK (DT) +[ 1.151999] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--) +[ 1.158965] pc : refcount_warn_saturate+0xdc/0x148 +[ 1.163760] lr : refcount_warn_saturate+0xdc/0x148 +[ 1.168556] sp : ffff800009ddb080 +[ 1.171866] x29: ffff800009ddb080 x28: ffff800009ddb35a x27: 0000000000000002 +[ 1.179015] x26: ffff8000098b06ad x25: ffffffffffffffff x24: ffff0a00ffffff05 +[ 1.186165] x23: ffff00001fdf6470 x22: ffff800009ddb367 x21: 0000000000000000 +[ 1.193314] x20: ffff00001fdfebe8 x19: ffff00001fdfec50 x18: ffffffffffffffff +[ 1.200464] x17: 0000000000000000 x16: 0000000000000118 x15: 0000000000000004 +[ 1.207614] x14: 0000000000000fff x13: ffff800009bca248 x12: 0000000000000003 +[ 1.214764] x11: 00000000ffffefff x10: c0000000ffffefff x9 : 4762cb2ccb52de00 +[ 1.221914] x8 : 4762cb2ccb52de00 x7 : 205d313431303231 x6 : 312e31202020205b +[ 1.229063] x5 : ffff800009d55c1f x4 : 0000000000000001 x3 : 0000000000000000 +[ 1.236213] x2 : 0000000000000000 x1 : ffff800009954be6 x0 : 000000000000002a +[ 1.243365] Call trace: +[ 1.245806] refcount_warn_saturate+0xdc/0x148 +[ 1.250253] kobject_get+0x98/0x9c +[ 1.253658] of_node_get+0x20/0x34 +[ 1.257072] of_fwnode_get+0x3c/0x54 +[ 1.260652] fwnode_get_nth_parent+0xd8/0xf4 +[ 1.264926] fwnode_full_name_string+0x3c/0xb4 +[ 1.269373] device_node_string+0x498/0x5b4 +[ 1.273561] pointer+0x41c/0x5d0 +[ 1.276793] vsnprintf+0x4d8/0x694 +[ 1.280198] vprintk_store+0x164/0x528 +[ 1.283951] vprintk_emit+0x98/0x164 +[ 1.287530] vprintk_default+0x44/0x6c +[ 1.291284] vprintk+0xf0/0x134 +[ 1.294428] _printk+0x54/0x7c +[ 1.297486] of_node_release+0xe8/0x128 +[ 1.301326] kobject_put+0x98/0xfc +[ 1.304732] of_node_put+0x1c/0x28 +[ 1.308137] add_mtd_device+0x484/0x6d4 +[ 1.311977] add_mtd_partitions+0xf0/0x1d0 +[ 1.316078] parse_mtd_partitions+0x45c/0x518 +[ 1.320439] mtd_device_parse_register+0xb0/0x274 +[ 1.325147] gpmi_nand_probe+0x51c/0x650 +[ 1.329074] platform_probe+0xa8/0xd0 +[ 1.332740] really_probe+0x130/0x334 +[ 1.336406] __driver_probe_device+0xb4/0xe0 +[ 1.340681] driver_probe_device+0x3c/0x1f8 +[ 1.344869] __driver_attach+0xdc/0x1a4 +[ 1.348708] bus_for_each_dev+0x80/0xcc +[ 1.352548] driver_attach+0x24/0x30 +[ 1.356127] bus_add_driver+0x108/0x1f4 +[ 1.359967] driver_register+0x78/0x114 +[ 1.363807] __platform_driver_register+0x24/0x30 +[ 1.368515] gpmi_nand_driver_init+0x1c/0x28 +[ 1.372798] do_one_initcall+0xbc/0x238 +[ 1.376638] do_initcall_level+0x94/0xb4 +[ 1.380565] do_initcalls+0x54/0x94 +[ 1.384058] do_basic_setup+0x1c/0x28 +[ 1.387724] kernel_init_freeable+0x110/0x188 +[ 1.392084] kernel_init+0x20/0x1a0 +[ 1.395578] ret_from_fork+0x10/0x20 +[ 1.399157] ---[ end trace 0000000000000000 ]--- +[ 1.403782] ------------[ cut here ]------------ + +Reported-by: Han Xu +Fixes: ad9b10d1eaada169 ("mtd: core: introduce of support for dynamic partitions") +Signed-off-by: Rafał Miłecki +Tested-by: Han Xu +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20221018051822.28685-1-zajec5@gmail.com +--- + drivers/mtd/mtdcore.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -580,7 +580,7 @@ static void mtd_check_of_node(struct mtd + if (!mtd_is_partition(mtd)) + return; + parent = mtd->parent; +- parent_dn = dev_of_node(&parent->dev); ++ parent_dn = of_node_get(dev_of_node(&parent->dev)); + if (!parent_dn) + return; + diff --git a/target/linux/generic/backport-5.15/406-v6.2-0001-mtd-core-simplify-a-bit-code-find-partition-matching.patch b/target/linux/generic/backport-5.15/406-v6.2-0001-mtd-core-simplify-a-bit-code-find-partition-matching.patch new file mode 100644 index 0000000000..7e9645ea98 --- /dev/null +++ b/target/linux/generic/backport-5.15/406-v6.2-0001-mtd-core-simplify-a-bit-code-find-partition-matching.patch @@ -0,0 +1,65 @@ +From 63db0cb35e1cb3b3c134906d1062f65513fdda2d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 4 Oct 2022 10:37:09 +0200 +Subject: [PATCH] mtd: core: simplify (a bit) code find partition-matching + dynamic OF node +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +1. Don't hardcode "partition-" string twice +2. Use simpler logic & use ->name to avoid of_property_read_string() +3. Use mtd_get_of_node() helper + +Cc: Christian Marangi +Signed-off-by: Rafał Miłecki +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20221004083710.27704-1-zajec5@gmail.com +--- + drivers/mtd/mtdcore.c | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -569,18 +569,16 @@ static void mtd_check_of_node(struct mtd + struct device_node *partitions, *parent_dn, *mtd_dn = NULL; + const char *pname, *prefix = "partition-"; + int plen, mtd_name_len, offset, prefix_len; +- struct mtd_info *parent; + bool found = false; + + /* Check if MTD already has a device node */ +- if (dev_of_node(&mtd->dev)) ++ if (mtd_get_of_node(mtd)) + return; + + /* Check if a partitions node exist */ + if (!mtd_is_partition(mtd)) + return; +- parent = mtd->parent; +- parent_dn = of_node_get(dev_of_node(&parent->dev)); ++ parent_dn = of_node_get(mtd_get_of_node(mtd->parent)); + if (!parent_dn) + return; + +@@ -593,15 +591,15 @@ static void mtd_check_of_node(struct mtd + + /* Search if a partition is defined with the same name */ + for_each_child_of_node(partitions, mtd_dn) { +- offset = 0; +- + /* Skip partition with no/wrong prefix */ +- if (!of_node_name_prefix(mtd_dn, "partition-")) ++ if (!of_node_name_prefix(mtd_dn, prefix)) + continue; + + /* Label have priority. Check that first */ +- if (of_property_read_string(mtd_dn, "label", &pname)) { +- of_property_read_string(mtd_dn, "name", &pname); ++ if (!of_property_read_string(mtd_dn, "label", &pname)) { ++ offset = 0; ++ } else { ++ pname = mtd_dn->name; + offset = prefix_len; + } + diff --git a/target/linux/generic/backport-5.15/406-v6.2-0002-mtd-core-try-to-find-OF-node-for-every-MTD-partition.patch b/target/linux/generic/backport-5.15/406-v6.2-0002-mtd-core-try-to-find-OF-node-for-every-MTD-partition.patch new file mode 100644 index 0000000000..48a7c13cd0 --- /dev/null +++ b/target/linux/generic/backport-5.15/406-v6.2-0002-mtd-core-try-to-find-OF-node-for-every-MTD-partition.patch @@ -0,0 +1,84 @@ +From ddb8cefb7af288950447ca6eeeafb09977dab56f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 4 Oct 2022 10:37:10 +0200 +Subject: [PATCH] mtd: core: try to find OF node for every MTD partition +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +So far this feature was limited to the top-level "nvmem-cells" node. +There are multiple parsers creating partitions and subpartitions +dynamically. Extend that code to handle them too. + +This allows finding partition-* node for every MTD (sub)partition. + +Random example: + +partitions { + compatible = "brcm,bcm947xx-cfe-partitions"; + + partition-firmware { + compatible = "brcm,trx"; + + partition-loader { + }; + }; +}; + +Cc: Christian Marangi +Signed-off-by: Rafał Miłecki +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20221004083710.27704-2-zajec5@gmail.com +--- + drivers/mtd/mtdcore.c | 18 ++++++------------ + 1 file changed, 6 insertions(+), 12 deletions(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -569,20 +569,22 @@ static void mtd_check_of_node(struct mtd + struct device_node *partitions, *parent_dn, *mtd_dn = NULL; + const char *pname, *prefix = "partition-"; + int plen, mtd_name_len, offset, prefix_len; +- bool found = false; + + /* Check if MTD already has a device node */ + if (mtd_get_of_node(mtd)) + return; + +- /* Check if a partitions node exist */ + if (!mtd_is_partition(mtd)) + return; ++ + parent_dn = of_node_get(mtd_get_of_node(mtd->parent)); + if (!parent_dn) + return; + +- partitions = of_get_child_by_name(parent_dn, "partitions"); ++ if (mtd_is_partition(mtd->parent)) ++ partitions = of_node_get(parent_dn); ++ else ++ partitions = of_get_child_by_name(parent_dn, "partitions"); + if (!partitions) + goto exit_parent; + +@@ -606,19 +608,11 @@ static void mtd_check_of_node(struct mtd + plen = strlen(pname) - offset; + if (plen == mtd_name_len && + !strncmp(mtd->name, pname + offset, plen)) { +- found = true; ++ mtd_set_of_node(mtd, mtd_dn); + break; + } + } + +- if (!found) +- goto exit_partitions; +- +- /* Set of_node only for nvmem */ +- if (of_device_is_compatible(mtd_dn, "nvmem-cells")) +- mtd_set_of_node(mtd, mtd_dn); +- +-exit_partitions: + of_node_put(partitions); + exit_parent: + of_node_put(parent_dn); diff --git a/target/linux/generic/backport-5.15/407-v5.17-mtd-parsers-qcom-Don-t-print-error-message-on-EPROBE.patch b/target/linux/generic/backport-5.15/407-v5.17-mtd-parsers-qcom-Don-t-print-error-message-on-EPROBE.patch new file mode 100644 index 0000000000..0efad99157 --- /dev/null +++ b/target/linux/generic/backport-5.15/407-v5.17-mtd-parsers-qcom-Don-t-print-error-message-on-EPROBE.patch @@ -0,0 +1,32 @@ +From 26bccc9671ba5e01f7153addbe94e7dc3f677375 Mon Sep 17 00:00:00 2001 +From: Bryan O'Donoghue +Date: Mon, 3 Jan 2022 03:03:16 +0000 +Subject: [PATCH 13/14] mtd: parsers: qcom: Don't print error message on + -EPROBE_DEFER + +Its possible for the main smem driver to not be loaded by the time we come +along to parse the smem partition description but, this is a perfectly +normal thing. + +No need to print out an error message in this case. + +Signed-off-by: Bryan O'Donoghue +Reviewed-by: Manivannan Sadhasivam +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220103030316.58301-3-bryan.odonoghue@linaro.org +--- + drivers/mtd/parsers/qcomsmempart.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/mtd/parsers/qcomsmempart.c ++++ b/drivers/mtd/parsers/qcomsmempart.c +@@ -75,7 +75,8 @@ static int parse_qcomsmem_part(struct mt + pr_debug("Parsing partition table info from SMEM\n"); + ptable = qcom_smem_get(SMEM_APPS, SMEM_AARM_PARTITION_TABLE, &len); + if (IS_ERR(ptable)) { +- pr_err("Error reading partition table header\n"); ++ if (PTR_ERR(ptable) != -EPROBE_DEFER) ++ pr_err("Error reading partition table header\n"); + return PTR_ERR(ptable); + } + diff --git a/target/linux/generic/backport-5.15/408-v6.2-mtd-core-set-ROOT_DEV-for-partitions-marked-as-rootf.patch b/target/linux/generic/backport-5.15/408-v6.2-mtd-core-set-ROOT_DEV-for-partitions-marked-as-rootf.patch new file mode 100644 index 0000000000..505e347e40 --- /dev/null +++ b/target/linux/generic/backport-5.15/408-v6.2-mtd-core-set-ROOT_DEV-for-partitions-marked-as-rootf.patch @@ -0,0 +1,47 @@ +From 26422ac78e9d8767bd4aabfbae616b15edbf6a1b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Sat, 22 Oct 2022 23:13:18 +0200 +Subject: [PATCH] mtd: core: set ROOT_DEV for partitions marked as rootfs in DT +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This adds support for "linux,rootfs" binding that is used to mark flash +partition containing rootfs. It's useful for devices using device tree +that don't have bootloader passing root info in cmdline. + +Signed-off-by: Rafał Miłecki +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20221022211318.32009-2-zajec5@gmail.com +--- + drivers/mtd/mtdcore.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -748,6 +749,17 @@ int add_mtd_device(struct mtd_info *mtd) + not->add(mtd); + + mutex_unlock(&mtd_table_mutex); ++ ++ if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL)) { ++ if (IS_BUILTIN(CONFIG_MTD)) { ++ pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name); ++ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index); ++ } else { ++ pr_warn("mtd: can't set mtd%d (%s) as root device - mtd must be builtin\n", ++ mtd->index, mtd->name); ++ } ++ } ++ + /* We _know_ we aren't being removed, because + our caller is still holding us here. So none + of this try_ nonsense, and no bitching about it diff --git a/target/linux/generic/backport-5.10/410-mtd-next-mtd-parsers-trx-allow-to-use-on-MediaTek-MIPS-SoCs.patch b/target/linux/generic/backport-5.15/410-v5.18-mtd-parsers-trx-allow-to-use-on-MediaTek-MIPS-SoCs.patch similarity index 100% rename from target/linux/generic/backport-5.10/410-mtd-next-mtd-parsers-trx-allow-to-use-on-MediaTek-MIPS-SoCs.patch rename to target/linux/generic/backport-5.15/410-v5.18-mtd-parsers-trx-allow-to-use-on-MediaTek-MIPS-SoCs.patch diff --git a/target/linux/generic/backport-5.15/420-v5.19-02-mtd-spinand-gigadevice-add-support-for-GD5FxGQ4xExxG.patch b/target/linux/generic/backport-5.15/420-v5.19-02-mtd-spinand-gigadevice-add-support-for-GD5FxGQ4xExxG.patch new file mode 100644 index 0000000000..181c912fbf --- /dev/null +++ b/target/linux/generic/backport-5.15/420-v5.19-02-mtd-spinand-gigadevice-add-support-for-GD5FxGQ4xExxG.patch @@ -0,0 +1,58 @@ +From 573eec222bc82fb5e724586267fbbb1aed9ffd03 Mon Sep 17 00:00:00 2001 +From: Chuanhong Guo +Date: Sun, 20 Mar 2022 17:59:58 +0800 +Subject: [PATCH 2/5] mtd: spinand: gigadevice: add support for GD5FxGQ4xExxG + +Add support for: + GD5F1GQ4RExxG + GD5F2GQ4{U,R}ExxG + +These chips differ from GD5F1GQ4UExxG only in chip ID, voltage +and capacity. + +Signed-off-by: Chuanhong Guo +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220320100001.247905-3-gch981213@gmail.com +--- + drivers/mtd/nand/spi/gigadevice.c | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + +--- a/drivers/mtd/nand/spi/gigadevice.c ++++ b/drivers/mtd/nand/spi/gigadevice.c +@@ -333,6 +333,36 @@ static const struct spinand_info gigadev + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F1GQ4RExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc1), ++ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F2GQ4UExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd2), ++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F2GQ4RExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc2), ++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F1GQ4UFxxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE, 0xb1, 0x48), + NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), diff --git a/target/linux/generic/backport-5.15/420-v5.19-03-mtd-spinand-gigadevice-add-support-for-GD5F1GQ5RExxG.patch b/target/linux/generic/backport-5.15/420-v5.19-03-mtd-spinand-gigadevice-add-support-for-GD5F1GQ5RExxG.patch new file mode 100644 index 0000000000..3a1cc9efcf --- /dev/null +++ b/target/linux/generic/backport-5.15/420-v5.19-03-mtd-spinand-gigadevice-add-support-for-GD5F1GQ5RExxG.patch @@ -0,0 +1,33 @@ +From 620a988813403318023296b61228ee8f3fcdb8e0 Mon Sep 17 00:00:00 2001 +From: Chuanhong Guo +Date: Sun, 20 Mar 2022 17:59:59 +0800 +Subject: [PATCH 3/5] mtd: spinand: gigadevice: add support for GD5F1GQ5RExxG + +This chip is the 1.8v version of GD5F1GQ5UExxG. + +Signed-off-by: Chuanhong Guo +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220320100001.247905-4-gch981213@gmail.com +--- + drivers/mtd/nand/spi/gigadevice.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/mtd/nand/spi/gigadevice.c ++++ b/drivers/mtd/nand/spi/gigadevice.c +@@ -383,6 +383,16 @@ static const struct spinand_info gigadev + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F1GQ5RExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x41), ++ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), ++ NAND_ECCREQ(4, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq5xexxg_ecc_get_status)), + }; + + static const struct spinand_manufacturer_ops gigadevice_spinand_manuf_ops = { diff --git a/target/linux/generic/backport-5.15/420-v5.19-04-mtd-spinand-gigadevice-add-support-for-GD5F-2-4-GQ5x.patch b/target/linux/generic/backport-5.15/420-v5.19-04-mtd-spinand-gigadevice-add-support-for-GD5F-2-4-GQ5x.patch new file mode 100644 index 0000000000..cee9d9db3e --- /dev/null +++ b/target/linux/generic/backport-5.15/420-v5.19-04-mtd-spinand-gigadevice-add-support-for-GD5F-2-4-GQ5x.patch @@ -0,0 +1,84 @@ +From 194ec04b3a9e7fa97d1fbef296410631bc3cf1c8 Mon Sep 17 00:00:00 2001 +From: Chuanhong Guo +Date: Sun, 20 Mar 2022 18:00:00 +0800 +Subject: [PATCH 4/5] mtd: spinand: gigadevice: add support for GD5F{2, + 4}GQ5xExxG + +Add support for: + GD5F2GQ5{U,R}ExxG + GD5F4GQ6{U,R}ExxG + +These chips uses 4 dummy bytes for quad io and 2 dummy bytes for dual io. +Besides that and memory layout, they are identical to their 1G variant. + +Signed-off-by: Chuanhong Guo +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220320100001.247905-5-gch981213@gmail.com +--- + drivers/mtd/nand/spi/gigadevice.c | 48 +++++++++++++++++++++++++++++++ + 1 file changed, 48 insertions(+) + +--- a/drivers/mtd/nand/spi/gigadevice.c ++++ b/drivers/mtd/nand/spi/gigadevice.c +@@ -47,6 +47,14 @@ static SPINAND_OP_VARIANTS(read_cache_va + SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); + ++static SPINAND_OP_VARIANTS(read_cache_variants_2gq5, ++ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 4, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 2, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); ++ + static SPINAND_OP_VARIANTS(write_cache_variants, + SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), + SPINAND_PROG_LOAD(true, 0, NULL, 0)); +@@ -391,6 +399,46 @@ static const struct spinand_info gigadev + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq5xexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F2GQ5UExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x52), ++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), ++ NAND_ECCREQ(4, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq5xexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F2GQ5RExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x42), ++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), ++ NAND_ECCREQ(4, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq5xexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F4GQ6UExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x55), ++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 2, 1), ++ NAND_ECCREQ(4, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq5xexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F4GQ6RExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x45), ++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 2, 1), ++ NAND_ECCREQ(4, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), + }; diff --git a/target/linux/generic/backport-5.15/420-v5.19-05-mtd-spinand-gigadevice-add-support-for-GD5FxGM7xExxG.patch b/target/linux/generic/backport-5.15/420-v5.19-05-mtd-spinand-gigadevice-add-support-for-GD5FxGM7xExxG.patch new file mode 100644 index 0000000000..d63113e1a6 --- /dev/null +++ b/target/linux/generic/backport-5.15/420-v5.19-05-mtd-spinand-gigadevice-add-support-for-GD5FxGM7xExxG.patch @@ -0,0 +1,91 @@ +From 54647cd003c08b714474a5b599a147ec6a160486 Mon Sep 17 00:00:00 2001 +From: Chuanhong Guo +Date: Sun, 20 Mar 2022 18:00:01 +0800 +Subject: [PATCH 5/5] mtd: spinand: gigadevice: add support for GD5FxGM7xExxG + +Add support for: + GD5F{1,2}GM7{U,R}ExxG + GD5F4GM8{U,R}ExxG + +These are new 27nm counterparts for the GD5FxGQ4 chips from GigaDevice +with 8b/512b on-die ECC capability. +These chips (and currently supported GD5FxGQ5 chips) have QIO DTR +instruction for reading page cache. It isn't added in this patch because +I don't have a DTR spi controller for testing. + +Signed-off-by: Chuanhong Guo +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220320100001.247905-6-gch981213@gmail.com +--- + drivers/mtd/nand/spi/gigadevice.c | 60 +++++++++++++++++++++++++++++++ + 1 file changed, 60 insertions(+) + +--- a/drivers/mtd/nand/spi/gigadevice.c ++++ b/drivers/mtd/nand/spi/gigadevice.c +@@ -441,6 +441,66 @@ static const struct spinand_info gigadev + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F1GM7UExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x91), ++ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F1GM7RExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x81), ++ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F2GM7UExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x92), ++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F2GM7RExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x82), ++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F4GM8UExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x95), ++ NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F4GM8RExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x85), ++ NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), + }; + + static const struct spinand_manufacturer_ops gigadevice_spinand_manuf_ops = { diff --git a/target/linux/generic/backport-5.15/421-v6.2-mtd-parsers-add-TP-Link-SafeLoader-partitions-table-.patch b/target/linux/generic/backport-5.15/421-v6.2-mtd-parsers-add-TP-Link-SafeLoader-partitions-table-.patch new file mode 100644 index 0000000000..9f543365a5 --- /dev/null +++ b/target/linux/generic/backport-5.15/421-v6.2-mtd-parsers-add-TP-Link-SafeLoader-partitions-table-.patch @@ -0,0 +1,229 @@ +From aec4d5f5ffd0f0092bd9dc21ea90e0bc237d4b74 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Sat, 15 Oct 2022 11:29:50 +0200 +Subject: [PATCH] mtd: parsers: add TP-Link SafeLoader partitions table parser +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This parser deals with most TP-Link home routers. It reads info about +partitions and registers them in the MTD subsystem. + +Example from TP-Link Archer C5 V2: + +spi-nor spi0.0: s25fl128s1 (16384 Kbytes) +15 tplink-safeloader partitions found on MTD device spi0.0 +Creating 15 MTD partitions on "spi0.0": +0x000000000000-0x000000040000 : "fs-uboot" +0x000000040000-0x000000440000 : "os-image" +0x000000440000-0x000000e40000 : "rootfs" +0x000000e40000-0x000000e40200 : "default-mac" +0x000000e40200-0x000000e40400 : "pin" +0x000000e40400-0x000000e40600 : "product-info" +0x000000e50000-0x000000e60000 : "partition-table" +0x000000e60000-0x000000e60200 : "soft-version" +0x000000e61000-0x000000e70000 : "support-list" +0x000000e70000-0x000000e80000 : "profile" +0x000000e80000-0x000000e90000 : "default-config" +0x000000e90000-0x000000ee0000 : "user-config" +0x000000ee0000-0x000000fe0000 : "log" +0x000000fe0000-0x000000ff0000 : "radio_bk" +0x000000ff0000-0x000001000000 : "radio" + +Signed-off-by: Rafał Miłecki +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20221015092950.27467-2-zajec5@gmail.com +--- + drivers/mtd/parsers/Kconfig | 15 +++ + drivers/mtd/parsers/Makefile | 1 + + drivers/mtd/parsers/tplink_safeloader.c | 150 ++++++++++++++++++++++++ + 3 files changed, 166 insertions(+) + create mode 100644 drivers/mtd/parsers/tplink_safeloader.c + +--- a/drivers/mtd/parsers/Kconfig ++++ b/drivers/mtd/parsers/Kconfig +@@ -113,6 +113,21 @@ config MTD_AFS_PARTS + for your particular device. It won't happen automatically. The + 'physmap' map driver (CONFIG_MTD_PHYSMAP) does this, for example. + ++config MTD_PARSER_TPLINK_SAFELOADER ++ tristate "TP-Link Safeloader partitions parser" ++ depends on MTD && (ARCH_BCM_5301X || ATH79 || SOC_MT7620 || SOC_MT7621 || COMPILE_TEST) ++ help ++ TP-Link home routers use flash partitions to store various data. Info ++ about flash space layout is stored in a partitions table using a ++ custom ASCII-based format. ++ ++ That format was first found in devices with SafeLoader bootloader and ++ was named after it. Later it was adapted to CFE and U-Boot ++ bootloaders. ++ ++ This driver reads partitions table, parses it and creates MTD ++ partitions. ++ + config MTD_PARSER_TRX + tristate "Parser for TRX format partitions" + depends on MTD && (BCM47XX || ARCH_BCM_5301X || ARCH_MEDIATEK || RALINK || COMPILE_TEST) +--- a/drivers/mtd/parsers/Makefile ++++ b/drivers/mtd/parsers/Makefile +@@ -9,6 +9,7 @@ ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += + ofpart-$(CONFIG_MTD_OF_PARTS_LINKSYS_NS)+= ofpart_linksys_ns.o + obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o + obj-$(CONFIG_MTD_AFS_PARTS) += afs.o ++obj-$(CONFIG_MTD_PARSER_TPLINK_SAFELOADER) += tplink_safeloader.o + obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o + obj-$(CONFIG_MTD_SERCOMM_PARTS) += scpart.o + obj-$(CONFIG_MTD_SHARPSL_PARTS) += sharpslpart.o +--- /dev/null ++++ b/drivers/mtd/parsers/tplink_safeloader.c +@@ -0,0 +1,150 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * Copyright © 2022 Rafał Miłecki ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define TPLINK_SAFELOADER_DATA_OFFSET 4 ++#define TPLINK_SAFELOADER_MAX_PARTS 32 ++ ++struct safeloader_cmn_header { ++ __be32 size; ++ uint32_t unused; ++} __packed; ++ ++static void *mtd_parser_tplink_safeloader_read_table(struct mtd_info *mtd) ++{ ++ struct safeloader_cmn_header hdr; ++ struct device_node *np; ++ size_t bytes_read; ++ size_t offset; ++ size_t size; ++ char *buf; ++ int err; ++ ++ np = mtd_get_of_node(mtd); ++ if (mtd_is_partition(mtd)) ++ of_node_get(np); ++ else ++ np = of_get_child_by_name(np, "partitions"); ++ ++ if (of_property_read_u32(np, "partitions-table-offset", (u32 *)&offset)) { ++ pr_err("Failed to get partitions table offset\n"); ++ goto err_put; ++ } ++ ++ err = mtd_read(mtd, offset, sizeof(hdr), &bytes_read, (uint8_t *)&hdr); ++ if (err && !mtd_is_bitflip(err)) { ++ pr_err("Failed to read from %s at 0x%zx\n", mtd->name, offset); ++ goto err_put; ++ } ++ ++ size = be32_to_cpu(hdr.size); ++ ++ buf = kmalloc(size + 1, GFP_KERNEL); ++ if (!buf) ++ goto err_put; ++ ++ err = mtd_read(mtd, offset + sizeof(hdr), size, &bytes_read, buf); ++ if (err && !mtd_is_bitflip(err)) { ++ pr_err("Failed to read from %s at 0x%zx\n", mtd->name, offset + sizeof(hdr)); ++ goto err_kfree; ++ } ++ ++ buf[size] = '\0'; ++ ++ of_node_put(np); ++ ++ return buf; ++ ++err_kfree: ++ kfree(buf); ++err_put: ++ of_node_put(np); ++ return NULL; ++} ++ ++static int mtd_parser_tplink_safeloader_parse(struct mtd_info *mtd, ++ const struct mtd_partition **pparts, ++ struct mtd_part_parser_data *data) ++{ ++ struct mtd_partition *parts; ++ char name[65]; ++ size_t offset; ++ size_t bytes; ++ char *buf; ++ int idx; ++ int err; ++ ++ parts = kcalloc(TPLINK_SAFELOADER_MAX_PARTS, sizeof(*parts), GFP_KERNEL); ++ if (!parts) { ++ err = -ENOMEM; ++ goto err_out; ++ } ++ ++ buf = mtd_parser_tplink_safeloader_read_table(mtd); ++ if (!buf) { ++ err = -ENOENT; ++ goto err_out; ++ } ++ ++ for (idx = 0, offset = TPLINK_SAFELOADER_DATA_OFFSET; ++ idx < TPLINK_SAFELOADER_MAX_PARTS && ++ sscanf(buf + offset, "partition %64s base 0x%llx size 0x%llx%zn\n", ++ name, &parts[idx].offset, &parts[idx].size, &bytes) == 3; ++ idx++, offset += bytes + 1) { ++ parts[idx].name = kstrdup(name, GFP_KERNEL); ++ if (!parts[idx].name) { ++ err = -ENOMEM; ++ goto err_free; ++ } ++ } ++ ++ if (idx == TPLINK_SAFELOADER_MAX_PARTS) ++ pr_warn("Reached maximum number of partitions!\n"); ++ ++ kfree(buf); ++ ++ *pparts = parts; ++ ++ return idx; ++ ++err_free: ++ for (idx -= 1; idx >= 0; idx--) ++ kfree(parts[idx].name); ++err_out: ++ return err; ++}; ++ ++static void mtd_parser_tplink_safeloader_cleanup(const struct mtd_partition *pparts, ++ int nr_parts) ++{ ++ int i; ++ ++ for (i = 0; i < nr_parts; i++) ++ kfree(pparts[i].name); ++ ++ kfree(pparts); ++} ++ ++static const struct of_device_id mtd_parser_tplink_safeloader_of_match_table[] = { ++ { .compatible = "tplink,safeloader-partitions" }, ++ {}, ++}; ++MODULE_DEVICE_TABLE(of, mtd_parser_tplink_safeloader_of_match_table); ++ ++static struct mtd_part_parser mtd_parser_tplink_safeloader = { ++ .parse_fn = mtd_parser_tplink_safeloader_parse, ++ .cleanup = mtd_parser_tplink_safeloader_cleanup, ++ .name = "tplink-safeloader", ++ .of_match_table = mtd_parser_tplink_safeloader_of_match_table, ++}; ++module_mtd_part_parser(mtd_parser_tplink_safeloader); ++ ++MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/backport-5.15/422-v5.19-mtd-spi-nor-support-eon-en25qh256a.patch b/target/linux/generic/backport-5.15/422-v5.19-mtd-spi-nor-support-eon-en25qh256a.patch new file mode 100644 index 0000000000..2358352e93 --- /dev/null +++ b/target/linux/generic/backport-5.15/422-v5.19-mtd-spi-nor-support-eon-en25qh256a.patch @@ -0,0 +1,49 @@ +From 6abef37d16d0c570ef5a149e63762fba2a30804b Mon Sep 17 00:00:00 2001 +From: "Leon M. George" +Date: Wed, 30 Mar 2022 16:16:56 +0200 +Subject: [PATCH] mtd: spi-nor: support eon en25qh256a variant + +The EN25QH256A variant of the EN25QH256 doesn't initialize correctly from SFDP +alone and only accesses memory below 8m (addr_width is 4 but read_opcode takes +only 3 bytes). + +Set SNOR_F_4B_OPCODES if the flash chip variant was detected using hwcaps. + +The fix submitted upstream uses the PARSE_SFDP initializer that is not +available in the kernel used with Openwrt. + +Signed-off-by: Leon M. George +--- + drivers/mtd/spi-nor/eon.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +--- a/drivers/mtd/spi-nor/eon.c ++++ b/drivers/mtd/spi-nor/eon.c +@@ -8,6 +8,16 @@ + + #include "core.h" + ++static void en25qh256_post_sfdp_fixups(struct spi_nor *nor) ++{ ++ if (nor->params->hwcaps.mask & SNOR_HWCAPS_READ_1_1_4) ++ nor->flags |= SNOR_F_4B_OPCODES; ++} ++ ++static const struct spi_nor_fixups en25qh256_fixups = { ++ .post_sfdp = en25qh256_post_sfdp_fixups, ++}; ++ + static const struct flash_info eon_parts[] = { + /* EON -- en25xxx */ + { "en25f32", INFO(0x1c3116, 0, 64 * 1024, 64, SECT_4K) }, +@@ -23,7 +33,9 @@ static const struct flash_info eon_parts + { "en25qh64", INFO(0x1c7017, 0, 64 * 1024, 128, + SECT_4K | SPI_NOR_DUAL_READ) }, + { "en25qh128", INFO(0x1c7018, 0, 64 * 1024, 256, 0) }, +- { "en25qh256", INFO(0x1c7019, 0, 64 * 1024, 512, 0) }, ++ { "en25qh256", INFO(0x1c7019, 0, 64 * 1024, 512, ++ SPI_NOR_DUAL_READ) ++ .fixups = &en25qh256_fixups }, + { "en25s64", INFO(0x1c3817, 0, 64 * 1024, 128, SECT_4K) }, + }; + diff --git a/target/linux/generic/backport-5.15/423-v6.1-0001-mtd-track-maximum-number-of-bitflips-for-each-read-r.patch b/target/linux/generic/backport-5.15/423-v6.1-0001-mtd-track-maximum-number-of-bitflips-for-each-read-r.patch new file mode 100644 index 0000000000..9f1757caa7 --- /dev/null +++ b/target/linux/generic/backport-5.15/423-v6.1-0001-mtd-track-maximum-number-of-bitflips-for-each-read-r.patch @@ -0,0 +1,73 @@ +From e237285113963bd1dd2e925770aa8b3aa8a1894c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20K=C4=99pie=C5=84?= +Date: Wed, 29 Jun 2022 14:57:34 +0200 +Subject: [PATCH 1/4] mtd: track maximum number of bitflips for each read + request +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +mtd_read_oob() callers are currently oblivious to the details of ECC +errors detected during the read operation - they only learn (through the +return value) whether any corrected bitflips or uncorrectable errors +occurred. More detailed ECC information can be useful to user-space +applications for making better-informed choices about moving data +around. + +Extend struct mtd_oob_ops with a pointer to a newly-introduced struct +mtd_req_stats and set its 'max_bitflips' field to the maximum number of +bitflips found in a single ECC step during the read operation performed +by mtd_read_oob(). This is a prerequisite for ultimately passing that +value back to user space. + +Suggested-by: Boris Brezillon +Signed-off-by: Michał Kępień +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220629125737.14418-2-kernel@kempniu.pl +--- + drivers/mtd/mtdcore.c | 5 +++++ + include/linux/mtd/mtd.h | 5 +++++ + 2 files changed, 10 insertions(+) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -1676,6 +1676,9 @@ int mtd_read_oob(struct mtd_info *mtd, l + if (!master->_read_oob && (!master->_read || ops->oobbuf)) + return -EOPNOTSUPP; + ++ if (ops->stats) ++ memset(ops->stats, 0, sizeof(*ops->stats)); ++ + if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) + ret_code = mtd_io_emulated_slc(mtd, from, true, ops); + else +@@ -1693,6 +1696,8 @@ int mtd_read_oob(struct mtd_info *mtd, l + return ret_code; + if (mtd->ecc_strength == 0) + return 0; /* device lacks ecc */ ++ if (ops->stats) ++ ops->stats->max_bitflips = ret_code; + return ret_code >= mtd->bitflip_threshold ? -EUCLEAN : 0; + } + EXPORT_SYMBOL_GPL(mtd_read_oob); +--- a/include/linux/mtd/mtd.h ++++ b/include/linux/mtd/mtd.h +@@ -40,6 +40,10 @@ struct mtd_erase_region_info { + unsigned long *lockmap; /* If keeping bitmap of locks */ + }; + ++struct mtd_req_stats { ++ unsigned int max_bitflips; ++}; ++ + /** + * struct mtd_oob_ops - oob operation operands + * @mode: operation mode +@@ -70,6 +74,7 @@ struct mtd_oob_ops { + uint32_t ooboffs; + uint8_t *datbuf; + uint8_t *oobbuf; ++ struct mtd_req_stats *stats; + }; + + #define MTD_MAX_OOBFREE_ENTRIES_LARGE 32 diff --git a/target/linux/generic/backport-5.15/423-v6.1-0002-mtd-always-initialize-stats-in-struct-mtd_oob_ops.patch b/target/linux/generic/backport-5.15/423-v6.1-0002-mtd-always-initialize-stats-in-struct-mtd_oob_ops.patch new file mode 100644 index 0000000000..1484624e4e --- /dev/null +++ b/target/linux/generic/backport-5.15/423-v6.1-0002-mtd-always-initialize-stats-in-struct-mtd_oob_ops.patch @@ -0,0 +1,325 @@ +From e97709c9d18903f5acd5fbe2985dd054da0432b1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20K=C4=99pie=C5=84?= +Date: Wed, 29 Jun 2022 14:57:35 +0200 +Subject: [PATCH 2/4] mtd: always initialize 'stats' in struct mtd_oob_ops +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +As the 'stats' field in struct mtd_oob_ops is used in conditional +expressions, ensure it is always zero-initialized in all such structures +to prevent random stack garbage from being interpreted as a pointer. + +Strictly speaking, this problem currently only needs to be fixed for +struct mtd_oob_ops structures subsequently passed to mtd_read_oob(). +However, this commit goes a step further and makes all instances of +struct mtd_oob_ops in the tree zero-initialized, in hope of preventing +future problems, e.g. if struct mtd_req_stats gets extended with write +statistics at some point. + +Signed-off-by: Michał Kępień +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220629125737.14418-3-kernel@kempniu.pl +--- + drivers/mtd/inftlcore.c | 6 +++--- + drivers/mtd/mtdswap.c | 6 +++--- + drivers/mtd/nand/onenand/onenand_base.c | 4 ++-- + drivers/mtd/nand/onenand/onenand_bbt.c | 2 +- + drivers/mtd/nand/raw/nand_bbt.c | 8 ++++---- + drivers/mtd/nand/raw/sm_common.c | 2 +- + drivers/mtd/nftlcore.c | 6 +++--- + drivers/mtd/sm_ftl.c | 4 ++-- + drivers/mtd/ssfdc.c | 2 +- + drivers/mtd/tests/nandbiterrs.c | 2 +- + drivers/mtd/tests/oobtest.c | 8 ++++---- + drivers/mtd/tests/readtest.c | 2 +- + fs/jffs2/wbuf.c | 6 +++--- + 13 files changed, 29 insertions(+), 29 deletions(-) + +--- a/drivers/mtd/inftlcore.c ++++ b/drivers/mtd/inftlcore.c +@@ -136,7 +136,7 @@ static void inftl_remove_dev(struct mtd_ + int inftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len, + size_t *retlen, uint8_t *buf) + { +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int res; + + ops.mode = MTD_OPS_PLACE_OOB; +@@ -156,7 +156,7 @@ int inftl_read_oob(struct mtd_info *mtd, + int inftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len, + size_t *retlen, uint8_t *buf) + { +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int res; + + ops.mode = MTD_OPS_PLACE_OOB; +@@ -176,7 +176,7 @@ int inftl_write_oob(struct mtd_info *mtd + static int inftl_write(struct mtd_info *mtd, loff_t offs, size_t len, + size_t *retlen, uint8_t *buf, uint8_t *oob) + { +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int res; + + ops.mode = MTD_OPS_PLACE_OOB; +--- a/drivers/mtd/mtdswap.c ++++ b/drivers/mtd/mtdswap.c +@@ -323,7 +323,7 @@ static int mtdswap_read_markers(struct m + struct mtdswap_oobdata *data, *data2; + int ret; + loff_t offset; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + + offset = mtdswap_eb_offset(d, eb); + +@@ -370,7 +370,7 @@ static int mtdswap_write_marker(struct m + struct mtdswap_oobdata n; + int ret; + loff_t offset; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + + ops.ooboffs = 0; + ops.oobbuf = (uint8_t *)&n; +@@ -879,7 +879,7 @@ static unsigned int mtdswap_eblk_passes( + loff_t base, pos; + unsigned int *p1 = (unsigned int *)d->page_buf; + unsigned char *p2 = (unsigned char *)d->oob_buf; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int ret; + + ops.mode = MTD_OPS_AUTO_OOB; +--- a/drivers/mtd/nand/onenand/onenand_base.c ++++ b/drivers/mtd/nand/onenand/onenand_base.c +@@ -2935,7 +2935,7 @@ static int do_otp_write(struct mtd_info + struct onenand_chip *this = mtd->priv; + unsigned char *pbuf = buf; + int ret; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + + /* Force buffer page aligned */ + if (len < mtd->writesize) { +@@ -2977,7 +2977,7 @@ static int do_otp_lock(struct mtd_info * + size_t *retlen, u_char *buf) + { + struct onenand_chip *this = mtd->priv; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int ret; + + if (FLEXONENAND(this)) { +--- a/drivers/mtd/nand/onenand/onenand_bbt.c ++++ b/drivers/mtd/nand/onenand/onenand_bbt.c +@@ -61,7 +61,7 @@ static int create_bbt(struct mtd_info *m + int startblock; + loff_t from; + size_t readlen, ooblen; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int rgn; + + printk(KERN_INFO "Scanning device for bad blocks\n"); +--- a/drivers/mtd/nand/raw/nand_bbt.c ++++ b/drivers/mtd/nand/raw/nand_bbt.c +@@ -313,7 +313,7 @@ static int scan_read_oob(struct nand_chi + size_t len) + { + struct mtd_info *mtd = nand_to_mtd(this); +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int res, ret = 0; + + ops.mode = MTD_OPS_PLACE_OOB; +@@ -354,7 +354,7 @@ static int scan_write_bbt(struct nand_ch + uint8_t *buf, uint8_t *oob) + { + struct mtd_info *mtd = nand_to_mtd(this); +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + + ops.mode = MTD_OPS_PLACE_OOB; + ops.ooboffs = 0; +@@ -416,7 +416,7 @@ static int scan_block_fast(struct nand_c + { + struct mtd_info *mtd = nand_to_mtd(this); + +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int ret, page_offset; + + ops.ooblen = mtd->oobsize; +@@ -756,7 +756,7 @@ static int write_bbt(struct nand_chip *t + uint8_t rcode = td->reserved_block_code; + size_t retlen, len = 0; + loff_t to; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + + ops.ooblen = mtd->oobsize; + ops.ooboffs = 0; +--- a/drivers/mtd/nand/raw/sm_common.c ++++ b/drivers/mtd/nand/raw/sm_common.c +@@ -99,7 +99,7 @@ static const struct mtd_ooblayout_ops oo + static int sm_block_markbad(struct nand_chip *chip, loff_t ofs) + { + struct mtd_info *mtd = nand_to_mtd(chip); +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + struct sm_oob oob; + int ret; + +--- a/drivers/mtd/nftlcore.c ++++ b/drivers/mtd/nftlcore.c +@@ -124,7 +124,7 @@ int nftl_read_oob(struct mtd_info *mtd, + size_t *retlen, uint8_t *buf) + { + loff_t mask = mtd->writesize - 1; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int res; + + ops.mode = MTD_OPS_PLACE_OOB; +@@ -145,7 +145,7 @@ int nftl_write_oob(struct mtd_info *mtd, + size_t *retlen, uint8_t *buf) + { + loff_t mask = mtd->writesize - 1; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int res; + + ops.mode = MTD_OPS_PLACE_OOB; +@@ -168,7 +168,7 @@ static int nftl_write(struct mtd_info *m + size_t *retlen, uint8_t *buf, uint8_t *oob) + { + loff_t mask = mtd->writesize - 1; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int res; + + ops.mode = MTD_OPS_PLACE_OOB; +--- a/drivers/mtd/sm_ftl.c ++++ b/drivers/mtd/sm_ftl.c +@@ -239,7 +239,7 @@ static int sm_read_sector(struct sm_ftl + uint8_t *buffer, struct sm_oob *oob) + { + struct mtd_info *mtd = ftl->trans->mtd; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + struct sm_oob tmp_oob; + int ret = -EIO; + int try = 0; +@@ -323,7 +323,7 @@ static int sm_write_sector(struct sm_ftl + int zone, int block, int boffset, + uint8_t *buffer, struct sm_oob *oob) + { +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + struct mtd_info *mtd = ftl->trans->mtd; + int ret; + +--- a/drivers/mtd/ssfdc.c ++++ b/drivers/mtd/ssfdc.c +@@ -163,7 +163,7 @@ static int read_physical_sector(struct m + /* Read redundancy area (wrapper to MTD_READ_OOB */ + static int read_raw_oob(struct mtd_info *mtd, loff_t offs, uint8_t *buf) + { +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int ret; + + ops.mode = MTD_OPS_RAW; +--- a/drivers/mtd/tests/nandbiterrs.c ++++ b/drivers/mtd/tests/nandbiterrs.c +@@ -99,7 +99,7 @@ static int write_page(int log) + static int rewrite_page(int log) + { + int err = 0; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + + if (log) + pr_info("rewrite page\n"); +--- a/drivers/mtd/tests/oobtest.c ++++ b/drivers/mtd/tests/oobtest.c +@@ -56,7 +56,7 @@ static void do_vary_offset(void) + static int write_eraseblock(int ebnum) + { + int i; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int err = 0; + loff_t addr = (loff_t)ebnum * mtd->erasesize; + +@@ -165,7 +165,7 @@ static size_t memffshow(loff_t addr, lof + static int verify_eraseblock(int ebnum) + { + int i; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int err = 0; + loff_t addr = (loff_t)ebnum * mtd->erasesize; + size_t bitflips; +@@ -260,7 +260,7 @@ static int verify_eraseblock(int ebnum) + + static int verify_eraseblock_in_one_go(int ebnum) + { +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int err = 0; + loff_t addr = (loff_t)ebnum * mtd->erasesize; + size_t len = mtd->oobavail * pgcnt; +@@ -338,7 +338,7 @@ static int __init mtd_oobtest_init(void) + int err = 0; + unsigned int i; + uint64_t tmp; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + loff_t addr = 0, addr0; + + printk(KERN_INFO "\n"); +--- a/drivers/mtd/tests/readtest.c ++++ b/drivers/mtd/tests/readtest.c +@@ -47,7 +47,7 @@ static int read_eraseblock_by_page(int e + err = ret; + } + if (mtd->oobsize) { +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + + ops.mode = MTD_OPS_PLACE_OOB; + ops.len = 0; +--- a/fs/jffs2/wbuf.c ++++ b/fs/jffs2/wbuf.c +@@ -1035,7 +1035,7 @@ int jffs2_check_oob_empty(struct jffs2_s + { + int i, ret; + int cmlen = min_t(int, c->oobavail, OOB_CM_SIZE); +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + + ops.mode = MTD_OPS_AUTO_OOB; + ops.ooblen = NR_OOB_SCAN_PAGES * c->oobavail; +@@ -1076,7 +1076,7 @@ int jffs2_check_oob_empty(struct jffs2_s + int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c, + struct jffs2_eraseblock *jeb) + { +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int ret, cmlen = min_t(int, c->oobavail, OOB_CM_SIZE); + + ops.mode = MTD_OPS_AUTO_OOB; +@@ -1101,7 +1101,7 @@ int jffs2_write_nand_cleanmarker(struct + struct jffs2_eraseblock *jeb) + { + int ret; +- struct mtd_oob_ops ops; ++ struct mtd_oob_ops ops = { }; + int cmlen = min_t(int, c->oobavail, OOB_CM_SIZE); + + ops.mode = MTD_OPS_AUTO_OOB; diff --git a/target/linux/generic/backport-5.15/423-v6.1-0003-mtd-add-ECC-error-accounting-for-each-read-request.patch b/target/linux/generic/backport-5.15/423-v6.1-0003-mtd-add-ECC-error-accounting-for-each-read-request.patch new file mode 100644 index 0000000000..f2f45eb7bc --- /dev/null +++ b/target/linux/generic/backport-5.15/423-v6.1-0003-mtd-add-ECC-error-accounting-for-each-read-request.patch @@ -0,0 +1,172 @@ +From 2ed18d818d1f7492172f8dd5904344c7d367e8ed Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20K=C4=99pie=C5=84?= +Date: Wed, 29 Jun 2022 14:57:36 +0200 +Subject: [PATCH 3/4] mtd: add ECC error accounting for each read request +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Extend struct mtd_req_stats with two new fields holding the number of +corrected bitflips and uncorrectable errors detected during a read +operation. This is a prerequisite for ultimately passing those counters +to user space, where they can be useful to applications for making +better-informed choices about moving data around. + +Unlike 'max_bitflips' (which is set - in a common code path - to the +return value of a function called while the MTD device's mutex is held), +these counters have to be maintained in each MTD driver which defines +the '_read_oob' callback because the statistics need to be calculated +while the MTD device's mutex is held. + +Suggested-by: Boris Brezillon +Signed-off-by: Michał Kępień +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220629125737.14418-4-kernel@kempniu.pl +--- + drivers/mtd/devices/docg3.c | 8 ++++++++ + drivers/mtd/nand/onenand/onenand_base.c | 12 ++++++++++++ + drivers/mtd/nand/raw/nand_base.c | 10 ++++++++++ + drivers/mtd/nand/spi/core.c | 10 ++++++++++ + include/linux/mtd/mtd.h | 2 ++ + 5 files changed, 42 insertions(+) + +--- a/drivers/mtd/devices/docg3.c ++++ b/drivers/mtd/devices/docg3.c +@@ -871,6 +871,7 @@ static int doc_read_oob(struct mtd_info + u8 *buf = ops->datbuf; + size_t len, ooblen, nbdata, nboob; + u8 hwecc[DOC_ECC_BCH_SIZE], eccconf1; ++ struct mtd_ecc_stats old_stats; + int max_bitflips = 0; + + if (buf) +@@ -895,6 +896,7 @@ static int doc_read_oob(struct mtd_info + ret = 0; + skip = from % DOC_LAYOUT_PAGE_SIZE; + mutex_lock(&docg3->cascade->lock); ++ old_stats = mtd->ecc_stats; + while (ret >= 0 && (len > 0 || ooblen > 0)) { + calc_block_sector(from - skip, &block0, &block1, &page, &ofs, + docg3->reliable); +@@ -966,6 +968,12 @@ static int doc_read_oob(struct mtd_info + } + + out: ++ if (ops->stats) { ++ ops->stats->uncorrectable_errors += ++ mtd->ecc_stats.failed - old_stats.failed; ++ ops->stats->corrected_bitflips += ++ mtd->ecc_stats.corrected - old_stats.corrected; ++ } + mutex_unlock(&docg3->cascade->lock); + return ret; + err_in_read: +--- a/drivers/mtd/nand/onenand/onenand_base.c ++++ b/drivers/mtd/nand/onenand/onenand_base.c +@@ -1440,6 +1440,7 @@ static int onenand_read_oob(struct mtd_i + struct mtd_oob_ops *ops) + { + struct onenand_chip *this = mtd->priv; ++ struct mtd_ecc_stats old_stats; + int ret; + + switch (ops->mode) { +@@ -1453,12 +1454,23 @@ static int onenand_read_oob(struct mtd_i + } + + onenand_get_device(mtd, FL_READING); ++ ++ old_stats = mtd->ecc_stats; ++ + if (ops->datbuf) + ret = ONENAND_IS_4KB_PAGE(this) ? + onenand_mlc_read_ops_nolock(mtd, from, ops) : + onenand_read_ops_nolock(mtd, from, ops); + else + ret = onenand_read_oob_nolock(mtd, from, ops); ++ ++ if (ops->stats) { ++ ops->stats->uncorrectable_errors += ++ mtd->ecc_stats.failed - old_stats.failed; ++ ops->stats->corrected_bitflips += ++ mtd->ecc_stats.corrected - old_stats.corrected; ++ } ++ + onenand_release_device(mtd); + + return ret; +--- a/drivers/mtd/nand/raw/nand_base.c ++++ b/drivers/mtd/nand/raw/nand_base.c +@@ -3815,6 +3815,7 @@ static int nand_read_oob(struct mtd_info + struct mtd_oob_ops *ops) + { + struct nand_chip *chip = mtd_to_nand(mtd); ++ struct mtd_ecc_stats old_stats; + int ret; + + ops->retlen = 0; +@@ -3826,11 +3827,20 @@ static int nand_read_oob(struct mtd_info + + nand_get_device(chip); + ++ old_stats = mtd->ecc_stats; ++ + if (!ops->datbuf) + ret = nand_do_read_oob(chip, from, ops); + else + ret = nand_do_read_ops(chip, from, ops); + ++ if (ops->stats) { ++ ops->stats->uncorrectable_errors += ++ mtd->ecc_stats.failed - old_stats.failed; ++ ops->stats->corrected_bitflips += ++ mtd->ecc_stats.corrected - old_stats.corrected; ++ } ++ + nand_release_device(chip); + return ret; + } +--- a/drivers/mtd/nand/spi/core.c ++++ b/drivers/mtd/nand/spi/core.c +@@ -629,6 +629,7 @@ static int spinand_mtd_read(struct mtd_i + { + struct spinand_device *spinand = mtd_to_spinand(mtd); + struct nand_device *nand = mtd_to_nanddev(mtd); ++ struct mtd_ecc_stats old_stats; + unsigned int max_bitflips = 0; + struct nand_io_iter iter; + bool disable_ecc = false; +@@ -640,6 +641,8 @@ static int spinand_mtd_read(struct mtd_i + + mutex_lock(&spinand->lock); + ++ old_stats = mtd->ecc_stats; ++ + nanddev_io_for_each_page(nand, NAND_PAGE_READ, from, ops, &iter) { + if (disable_ecc) + iter.req.mode = MTD_OPS_RAW; +@@ -662,6 +665,13 @@ static int spinand_mtd_read(struct mtd_i + ops->oobretlen += iter.req.ooblen; + } + ++ if (ops->stats) { ++ ops->stats->uncorrectable_errors += ++ mtd->ecc_stats.failed - old_stats.failed; ++ ops->stats->corrected_bitflips += ++ mtd->ecc_stats.corrected - old_stats.corrected; ++ } ++ + mutex_unlock(&spinand->lock); + + if (ecc_failed && !ret) +--- a/include/linux/mtd/mtd.h ++++ b/include/linux/mtd/mtd.h +@@ -41,6 +41,8 @@ struct mtd_erase_region_info { + }; + + struct mtd_req_stats { ++ unsigned int uncorrectable_errors; ++ unsigned int corrected_bitflips; + unsigned int max_bitflips; + }; + diff --git a/target/linux/generic/backport-5.15/423-v6.1-0004-mtdchar-add-MEMREAD-ioctl.patch b/target/linux/generic/backport-5.15/423-v6.1-0004-mtdchar-add-MEMREAD-ioctl.patch new file mode 100644 index 0000000000..182e4f6ab5 --- /dev/null +++ b/target/linux/generic/backport-5.15/423-v6.1-0004-mtdchar-add-MEMREAD-ioctl.patch @@ -0,0 +1,321 @@ +From 2c9745d36e04ac27161acd78514f647b9b587ad4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20K=C4=99pie=C5=84?= +Date: Wed, 29 Jun 2022 14:57:37 +0200 +Subject: [PATCH 4/4] mtdchar: add MEMREAD ioctl +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +User-space applications making use of MTD devices via /dev/mtd* +character devices currently have limited capabilities for reading data: + + - only deprecated methods of accessing OOB layout information exist, + + - there is no way to explicitly specify MTD operation mode to use; it + is auto-selected based on the MTD file mode (MTD_FILE_MODE_*) set + for the character device; in particular, this prevents using + MTD_OPS_AUTO_OOB for reads, + + - all existing user-space interfaces which cause mtd_read() or + mtd_read_oob() to be called (via mtdchar_read() and + mtdchar_read_oob(), respectively) return success even when those + functions return -EUCLEAN or -EBADMSG; this renders user-space + applications using these interfaces unaware of any corrected + bitflips or uncorrectable ECC errors detected during reads. + +Note that the existing MEMWRITE ioctl allows the MTD operation mode to +be explicitly set, allowing user-space applications to write page data +and OOB data without requiring them to know anything about the OOB +layout of the MTD device they are writing to (MTD_OPS_AUTO_OOB). Also, +the MEMWRITE ioctl does not mangle the return value of mtd_write_oob(). + +Add a new ioctl, MEMREAD, which addresses the above issues. It is +intended to be a read-side counterpart of the existing MEMWRITE ioctl. +Similarly to the latter, the read operation is performed in a loop which +processes at most mtd->erasesize bytes in each iteration. This is done +to prevent unbounded memory allocations caused by calling kmalloc() with +the 'size' argument taken directly from the struct mtd_read_req provided +by user space. However, the new ioctl is implemented so that the values +it returns match those that would have been returned if just a single +mtd_read_oob() call was issued to handle the entire read operation in +one go. + +Note that while just returning -EUCLEAN or -EBADMSG to user space would +already be a valid and useful indication of the ECC algorithm detecting +errors during a read operation, that signal would not be granular enough +to cover all use cases. For example, knowing the maximum number of +bitflips detected in a single ECC step during a read operation performed +on a given page may be useful when dealing with an MTD partition whose +ECC layout varies across pages (e.g. a partition consisting of a +bootloader area using a "custom" ECC layout followed by data pages using +a "standard" ECC layout). To address that, include ECC statistics in +the structure returned to user space by the new MEMREAD ioctl. + +Link: https://www.infradead.org/pipermail/linux-mtd/2016-April/067085.html + +Suggested-by: Boris Brezillon +Signed-off-by: Michał Kępień +Acked-by: Richard Weinberger +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220629125737.14418-5-kernel@kempniu.pl +--- + drivers/mtd/mtdchar.c | 139 +++++++++++++++++++++++++++++++++++++ + include/uapi/mtd/mtd-abi.h | 64 +++++++++++++++-- + 2 files changed, 198 insertions(+), 5 deletions(-) + +--- a/drivers/mtd/mtdchar.c ++++ b/drivers/mtd/mtdchar.c +@@ -621,6 +621,137 @@ static int mtdchar_write_ioctl(struct mt + return ret; + } + ++static int mtdchar_read_ioctl(struct mtd_info *mtd, ++ struct mtd_read_req __user *argp) ++{ ++ struct mtd_info *master = mtd_get_master(mtd); ++ struct mtd_read_req req; ++ void __user *usr_data, *usr_oob; ++ uint8_t *datbuf = NULL, *oobbuf = NULL; ++ size_t datbuf_len, oobbuf_len; ++ size_t orig_len, orig_ooblen; ++ int ret = 0; ++ ++ if (copy_from_user(&req, argp, sizeof(req))) ++ return -EFAULT; ++ ++ orig_len = req.len; ++ orig_ooblen = req.ooblen; ++ ++ usr_data = (void __user *)(uintptr_t)req.usr_data; ++ usr_oob = (void __user *)(uintptr_t)req.usr_oob; ++ ++ if (!master->_read_oob) ++ return -EOPNOTSUPP; ++ ++ if (!usr_data) ++ req.len = 0; ++ ++ if (!usr_oob) ++ req.ooblen = 0; ++ ++ req.ecc_stats.uncorrectable_errors = 0; ++ req.ecc_stats.corrected_bitflips = 0; ++ req.ecc_stats.max_bitflips = 0; ++ ++ req.len &= 0xffffffff; ++ req.ooblen &= 0xffffffff; ++ ++ if (req.start + req.len > mtd->size) { ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ datbuf_len = min_t(size_t, req.len, mtd->erasesize); ++ if (datbuf_len > 0) { ++ datbuf = kvmalloc(datbuf_len, GFP_KERNEL); ++ if (!datbuf) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ } ++ ++ oobbuf_len = min_t(size_t, req.ooblen, mtd->erasesize); ++ if (oobbuf_len > 0) { ++ oobbuf = kvmalloc(oobbuf_len, GFP_KERNEL); ++ if (!oobbuf) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ } ++ ++ while (req.len > 0 || (!usr_data && req.ooblen > 0)) { ++ struct mtd_req_stats stats; ++ struct mtd_oob_ops ops = { ++ .mode = req.mode, ++ .len = min_t(size_t, req.len, datbuf_len), ++ .ooblen = min_t(size_t, req.ooblen, oobbuf_len), ++ .datbuf = datbuf, ++ .oobbuf = oobbuf, ++ .stats = &stats, ++ }; ++ ++ /* ++ * Shorten non-page-aligned, eraseblock-sized reads so that the ++ * read ends on an eraseblock boundary. This is necessary in ++ * order to prevent OOB data for some pages from being ++ * duplicated in the output of non-page-aligned reads requiring ++ * multiple mtd_read_oob() calls to be completed. ++ */ ++ if (ops.len == mtd->erasesize) ++ ops.len -= mtd_mod_by_ws(req.start + ops.len, mtd); ++ ++ ret = mtd_read_oob(mtd, (loff_t)req.start, &ops); ++ ++ req.ecc_stats.uncorrectable_errors += ++ stats.uncorrectable_errors; ++ req.ecc_stats.corrected_bitflips += stats.corrected_bitflips; ++ req.ecc_stats.max_bitflips = ++ max(req.ecc_stats.max_bitflips, stats.max_bitflips); ++ ++ if (ret && !mtd_is_bitflip_or_eccerr(ret)) ++ break; ++ ++ if (copy_to_user(usr_data, ops.datbuf, ops.retlen) || ++ copy_to_user(usr_oob, ops.oobbuf, ops.oobretlen)) { ++ ret = -EFAULT; ++ break; ++ } ++ ++ req.start += ops.retlen; ++ req.len -= ops.retlen; ++ usr_data += ops.retlen; ++ ++ req.ooblen -= ops.oobretlen; ++ usr_oob += ops.oobretlen; ++ } ++ ++ /* ++ * As multiple iterations of the above loop (and therefore multiple ++ * mtd_read_oob() calls) may be necessary to complete the read request, ++ * adjust the final return code to ensure it accounts for all detected ++ * ECC errors. ++ */ ++ if (!ret || mtd_is_bitflip(ret)) { ++ if (req.ecc_stats.uncorrectable_errors > 0) ++ ret = -EBADMSG; ++ else if (req.ecc_stats.corrected_bitflips > 0) ++ ret = -EUCLEAN; ++ } ++ ++out: ++ req.len = orig_len - req.len; ++ req.ooblen = orig_ooblen - req.ooblen; ++ ++ if (copy_to_user(argp, &req, sizeof(req))) ++ ret = -EFAULT; ++ ++ kvfree(datbuf); ++ kvfree(oobbuf); ++ ++ return ret; ++} ++ + static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg) + { + struct mtd_file_info *mfi = file->private_data; +@@ -643,6 +774,7 @@ static int mtdchar_ioctl(struct file *fi + case MEMGETINFO: + case MEMREADOOB: + case MEMREADOOB64: ++ case MEMREAD: + case MEMISLOCKED: + case MEMGETOOBSEL: + case MEMGETBADBLOCK: +@@ -817,6 +949,13 @@ static int mtdchar_ioctl(struct file *fi + break; + } + ++ case MEMREAD: ++ { ++ ret = mtdchar_read_ioctl(mtd, ++ (struct mtd_read_req __user *)arg); ++ break; ++ } ++ + case MEMLOCK: + { + struct erase_info_user einfo; +--- a/include/uapi/mtd/mtd-abi.h ++++ b/include/uapi/mtd/mtd-abi.h +@@ -55,9 +55,9 @@ struct mtd_oob_buf64 { + * @MTD_OPS_RAW: data are transferred as-is, with no error correction; + * this mode implies %MTD_OPS_PLACE_OOB + * +- * These modes can be passed to ioctl(MEMWRITE) and are also used internally. +- * See notes on "MTD file modes" for discussion on %MTD_OPS_RAW vs. +- * %MTD_FILE_MODE_RAW. ++ * These modes can be passed to ioctl(MEMWRITE) and ioctl(MEMREAD); they are ++ * also used internally. See notes on "MTD file modes" for discussion on ++ * %MTD_OPS_RAW vs. %MTD_FILE_MODE_RAW. + */ + enum { + MTD_OPS_PLACE_OOB = 0, +@@ -91,6 +91,53 @@ struct mtd_write_req { + __u8 padding[7]; + }; + ++/** ++ * struct mtd_read_req_ecc_stats - ECC statistics for a read operation ++ * ++ * @uncorrectable_errors: the number of uncorrectable errors that happened ++ * during the read operation ++ * @corrected_bitflips: the number of bitflips corrected during the read ++ * operation ++ * @max_bitflips: the maximum number of bitflips detected in any single ECC ++ * step for the data read during the operation; this information ++ * can be used to decide whether the data stored in a specific ++ * region of the MTD device should be moved somewhere else to ++ * avoid data loss. ++ */ ++struct mtd_read_req_ecc_stats { ++ __u32 uncorrectable_errors; ++ __u32 corrected_bitflips; ++ __u32 max_bitflips; ++}; ++ ++/** ++ * struct mtd_read_req - data structure for requesting a read operation ++ * ++ * @start: start address ++ * @len: length of data buffer (only lower 32 bits are used) ++ * @ooblen: length of OOB buffer (only lower 32 bits are used) ++ * @usr_data: user-provided data buffer ++ * @usr_oob: user-provided OOB buffer ++ * @mode: MTD mode (see "MTD operation modes") ++ * @padding: reserved, must be set to 0 ++ * @ecc_stats: ECC statistics for the read operation ++ * ++ * This structure supports ioctl(MEMREAD) operations, allowing data and/or OOB ++ * reads in various modes. To read from OOB-only, set @usr_data == NULL, and to ++ * read data-only, set @usr_oob == NULL. However, setting both @usr_data and ++ * @usr_oob to NULL is not allowed. ++ */ ++struct mtd_read_req { ++ __u64 start; ++ __u64 len; ++ __u64 ooblen; ++ __u64 usr_data; ++ __u64 usr_oob; ++ __u8 mode; ++ __u8 padding[7]; ++ struct mtd_read_req_ecc_stats ecc_stats; ++}; ++ + #define MTD_ABSENT 0 + #define MTD_RAM 1 + #define MTD_ROM 2 +@@ -207,6 +254,12 @@ struct otp_info { + #define MEMWRITE _IOWR('M', 24, struct mtd_write_req) + /* Erase a given range of user data (must be in mode %MTD_FILE_MODE_OTP_USER) */ + #define OTPERASE _IOW('M', 25, struct otp_info) ++/* ++ * Most generic read interface; can read in-band and/or out-of-band in various ++ * modes (see "struct mtd_read_req"). This ioctl is not supported for flashes ++ * without OOB, e.g., NOR flash. ++ */ ++#define MEMREAD _IOWR('M', 26, struct mtd_read_req) + + /* + * Obsolete legacy interface. Keep it in order not to break userspace +@@ -270,8 +323,9 @@ struct mtd_ecc_stats { + * Note: %MTD_FILE_MODE_RAW provides the same functionality as %MTD_OPS_RAW - + * raw access to the flash, without error correction or autoplacement schemes. + * Wherever possible, the MTD_OPS_* mode will override the MTD_FILE_MODE_* mode +- * (e.g., when using ioctl(MEMWRITE)), but in some cases, the MTD_FILE_MODE is +- * used out of necessity (e.g., `write()', ioctl(MEMWRITEOOB64)). ++ * (e.g., when using ioctl(MEMWRITE) or ioctl(MEMREAD)), but in some cases, the ++ * MTD_FILE_MODE is used out of necessity (e.g., `write()', ++ * ioctl(MEMWRITEOOB64)). + */ + enum mtd_file_modes { + MTD_FILE_MODE_NORMAL = MTD_OTP_OFF, diff --git a/target/linux/generic/backport-5.15/423-v6.3-mtd-spinand-macronix-use-scratch-buffer-for-DMA-oper.patch b/target/linux/generic/backport-5.15/423-v6.3-mtd-spinand-macronix-use-scratch-buffer-for-DMA-oper.patch new file mode 100644 index 0000000000..7dbc271725 --- /dev/null +++ b/target/linux/generic/backport-5.15/423-v6.3-mtd-spinand-macronix-use-scratch-buffer-for-DMA-oper.patch @@ -0,0 +1,35 @@ +From ebed787a0becb9354f0a23620a5130cccd6c730c Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Thu, 19 Jan 2023 03:45:43 +0000 +Subject: [PATCH] mtd: spinand: macronix: use scratch buffer for DMA operation + +The mx35lf1ge4ab_get_eccsr() function uses an SPI DMA operation to +read the eccsr, hence the buffer should not be on stack. Since commit +380583227c0c7f ("spi: spi-mem: Add extra sanity checks on the op param") +the kernel emmits a warning and blocks such operations. + +Use the scratch buffer to get eccsr instead of trying to directly read +into a stack-allocated variable. + +Signed-off-by: Daniel Golle +Reviewed-by: Dhruva Gole +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/Y8i85zM0u4XdM46z@makrotopia.org +--- + drivers/mtd/nand/spi/macronix.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/mtd/nand/spi/macronix.c ++++ b/drivers/mtd/nand/spi/macronix.c +@@ -83,9 +83,10 @@ static int mx35lf1ge4ab_ecc_get_status(s + * in order to avoid forcing the wear-leveling layer to move + * data around if it's not necessary. + */ +- if (mx35lf1ge4ab_get_eccsr(spinand, &eccsr)) ++ if (mx35lf1ge4ab_get_eccsr(spinand, spinand->scratchbuf)) + return nanddev_get_ecc_conf(nand)->strength; + ++ eccsr = *spinand->scratchbuf; + if (WARN_ON(eccsr > nanddev_get_ecc_conf(nand)->strength || + !eccsr)) + return nanddev_get_ecc_conf(nand)->strength; diff --git a/target/linux/generic/backport-5.15/424-v6.4-0004-mtd-core-prepare-mtd_otp_nvmem_add-to-handle-EPROBE_.patch b/target/linux/generic/backport-5.15/424-v6.4-0004-mtd-core-prepare-mtd_otp_nvmem_add-to-handle-EPROBE_.patch new file mode 100644 index 0000000000..2d89a5db12 --- /dev/null +++ b/target/linux/generic/backport-5.15/424-v6.4-0004-mtd-core-prepare-mtd_otp_nvmem_add-to-handle-EPROBE_.patch @@ -0,0 +1,47 @@ +From 281f7a6c1a33fffcde32001bacbb4f672140fbf9 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Wed, 8 Mar 2023 09:20:21 +0100 +Subject: [PATCH] mtd: core: prepare mtd_otp_nvmem_add() to handle + -EPROBE_DEFER + +NVMEM soon will get the ability for nvmem layouts and these might +not be ready when nvmem_register() is called and thus it might +return -EPROBE_DEFER. Don't print the error message in this case. + +Signed-off-by: Michael Walle +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20230308082021.870459-4-michael@walle.cc +--- + drivers/mtd/mtdcore.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -960,8 +960,8 @@ static int mtd_otp_nvmem_add(struct mtd_ + nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size, + mtd_nvmem_user_otp_reg_read); + if (IS_ERR(nvmem)) { +- dev_err(dev, "Failed to register OTP NVMEM device\n"); +- return PTR_ERR(nvmem); ++ err = PTR_ERR(nvmem); ++ goto err; + } + mtd->otp_user_nvmem = nvmem; + } +@@ -978,7 +978,6 @@ static int mtd_otp_nvmem_add(struct mtd_ + nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size, + mtd_nvmem_fact_otp_reg_read); + if (IS_ERR(nvmem)) { +- dev_err(dev, "Failed to register OTP NVMEM device\n"); + err = PTR_ERR(nvmem); + goto err; + } +@@ -991,7 +990,7 @@ static int mtd_otp_nvmem_add(struct mtd_ + err: + if (mtd->otp_user_nvmem) + nvmem_unregister(mtd->otp_user_nvmem); +- return err; ++ return dev_err_probe(dev, err, "Failed to register OTP NVMEM device\n"); + } + + /** diff --git a/target/linux/generic/backport-5.15/600-v5.18-page_pool-Add-allocation-stats.patch b/target/linux/generic/backport-5.15/600-v5.18-page_pool-Add-allocation-stats.patch new file mode 100644 index 0000000000..dca1062be9 --- /dev/null +++ b/target/linux/generic/backport-5.15/600-v5.18-page_pool-Add-allocation-stats.patch @@ -0,0 +1,165 @@ +From 8610037e8106b48c79cfe0afb92b2b2466e51c3d Mon Sep 17 00:00:00 2001 +From: Joe Damato +Date: Tue, 1 Mar 2022 23:55:47 -0800 +Subject: [PATCH] page_pool: Add allocation stats + +Add per-pool statistics counters for the allocation path of a page pool. +These stats are incremented in softirq context, so no locking or per-cpu +variables are needed. + +This code is disabled by default and a kernel config option is provided for +users who wish to enable them. + +The statistics added are: + - fast: successful fast path allocations + - slow: slow path order-0 allocations + - slow_high_order: slow path high order allocations + - empty: ptr ring is empty, so a slow path allocation was forced. + - refill: an allocation which triggered a refill of the cache + - waive: pages obtained from the ptr ring that cannot be added to + the cache due to a NUMA mismatch. + +Signed-off-by: Joe Damato +Acked-by: Jesper Dangaard Brouer +Reviewed-by: Ilias Apalodimas +Signed-off-by: David S. Miller +--- + include/net/page_pool.h | 18 ++++++++++++++++++ + net/Kconfig | 13 +++++++++++++ + net/core/page_pool.c | 24 ++++++++++++++++++++---- + 3 files changed, 51 insertions(+), 4 deletions(-) + +--- a/include/net/page_pool.h ++++ b/include/net/page_pool.h +@@ -82,6 +82,19 @@ struct page_pool_params { + unsigned int offset; /* DMA addr offset */ + }; + ++#ifdef CONFIG_PAGE_POOL_STATS ++struct page_pool_alloc_stats { ++ u64 fast; /* fast path allocations */ ++ u64 slow; /* slow-path order 0 allocations */ ++ u64 slow_high_order; /* slow-path high order allocations */ ++ u64 empty; /* failed refills due to empty ptr ring, forcing ++ * slow path allocation ++ */ ++ u64 refill; /* allocations via successful refill */ ++ u64 waive; /* failed refills due to numa zone mismatch */ ++}; ++#endif ++ + struct page_pool { + struct page_pool_params p; + +@@ -132,6 +145,11 @@ struct page_pool { + refcount_t user_cnt; + + u64 destroy_cnt; ++ ++#ifdef CONFIG_PAGE_POOL_STATS ++ /* these stats are incremented while in softirq context */ ++ struct page_pool_alloc_stats alloc_stats; ++#endif + }; + + struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp); +--- a/net/Kconfig ++++ b/net/Kconfig +@@ -432,6 +432,19 @@ config NET_DEVLINK + config PAGE_POOL + bool + ++config PAGE_POOL_STATS ++ default n ++ bool "Page pool stats" ++ depends on PAGE_POOL ++ help ++ Enable page pool statistics to track page allocation and recycling ++ in page pools. This option incurs additional CPU cost in allocation ++ and recycle paths and additional memory cost to store the statistics. ++ These statistics are only available if this option is enabled and if ++ the driver using the page pool supports exporting this data. ++ ++ If unsure, say N. ++ + config FAILOVER + tristate "Generic failover module" + help +--- a/net/core/page_pool.c ++++ b/net/core/page_pool.c +@@ -49,6 +49,13 @@ static void page_pool_producer_unlock(st + spin_unlock_bh(&pool->ring.producer_lock); + } + ++#ifdef CONFIG_PAGE_POOL_STATS ++/* alloc_stat_inc is intended to be used in softirq context */ ++#define alloc_stat_inc(pool, __stat) (pool->alloc_stats.__stat++) ++#else ++#define alloc_stat_inc(pool, __stat) ++#endif ++ + static int page_pool_init(struct page_pool *pool, + const struct page_pool_params *params) + { +@@ -140,8 +147,10 @@ static struct page *page_pool_refill_all + int pref_nid; /* preferred NUMA node */ + + /* Quicker fallback, avoid locks when ring is empty */ +- if (__ptr_ring_empty(r)) ++ if (__ptr_ring_empty(r)) { ++ alloc_stat_inc(pool, empty); + return NULL; ++ } + + /* Softirq guarantee CPU and thus NUMA node is stable. This, + * assumes CPU refilling driver RX-ring will also run RX-NAPI. +@@ -171,14 +180,17 @@ static struct page *page_pool_refill_all + * This limit stress on page buddy alloactor. + */ + page_pool_return_page(pool, page); ++ alloc_stat_inc(pool, waive); + page = NULL; + break; + } + } while (pool->alloc.count < PP_ALLOC_CACHE_REFILL); + + /* Return last page */ +- if (likely(pool->alloc.count > 0)) ++ if (likely(pool->alloc.count > 0)) { + page = pool->alloc.cache[--pool->alloc.count]; ++ alloc_stat_inc(pool, refill); ++ } + + spin_unlock(&r->consumer_lock); + return page; +@@ -193,6 +205,7 @@ static struct page *__page_pool_get_cach + if (likely(pool->alloc.count)) { + /* Fast-path */ + page = pool->alloc.cache[--pool->alloc.count]; ++ alloc_stat_inc(pool, fast); + } else { + page = page_pool_refill_alloc_cache(pool); + } +@@ -264,6 +277,7 @@ static struct page *__page_pool_alloc_pa + return NULL; + } + ++ alloc_stat_inc(pool, slow_high_order); + page_pool_set_pp_info(pool, page); + + /* Track how many pages are held 'in-flight' */ +@@ -318,10 +332,12 @@ static struct page *__page_pool_alloc_pa + } + + /* Return last page */ +- if (likely(pool->alloc.count > 0)) ++ if (likely(pool->alloc.count > 0)) { + page = pool->alloc.cache[--pool->alloc.count]; +- else ++ alloc_stat_inc(pool, slow); ++ } else { + page = NULL; ++ } + + /* When page just alloc'ed is should/must have refcnt 1. */ + return page; diff --git a/target/linux/generic/backport-5.15/601-v5.18-page_pool-Add-recycle-stats.patch b/target/linux/generic/backport-5.15/601-v5.18-page_pool-Add-recycle-stats.patch new file mode 100644 index 0000000000..b425b78c75 --- /dev/null +++ b/target/linux/generic/backport-5.15/601-v5.18-page_pool-Add-recycle-stats.patch @@ -0,0 +1,140 @@ +From ad6fa1e1ab1b8164f1ba296b1b4dc556a483bcad Mon Sep 17 00:00:00 2001 +From: Joe Damato +Date: Tue, 1 Mar 2022 23:55:48 -0800 +Subject: [PATCH 2/3] page_pool: Add recycle stats + +Add per-cpu stats tracking page pool recycling events: + - cached: recycling placed page in the page pool cache + - cache_full: page pool cache was full + - ring: page placed into the ptr ring + - ring_full: page released from page pool because the ptr ring was full + - released_refcnt: page released (and not recycled) because refcnt > 1 + +Signed-off-by: Joe Damato +Acked-by: Jesper Dangaard Brouer +Reviewed-by: Ilias Apalodimas +Signed-off-by: David S. Miller +--- + include/net/page_pool.h | 16 ++++++++++++++++ + net/core/page_pool.c | 30 ++++++++++++++++++++++++++++-- + 2 files changed, 44 insertions(+), 2 deletions(-) + +--- a/include/net/page_pool.h ++++ b/include/net/page_pool.h +@@ -93,6 +93,18 @@ struct page_pool_alloc_stats { + u64 refill; /* allocations via successful refill */ + u64 waive; /* failed refills due to numa zone mismatch */ + }; ++ ++struct page_pool_recycle_stats { ++ u64 cached; /* recycling placed page in the cache. */ ++ u64 cache_full; /* cache was full */ ++ u64 ring; /* recycling placed page back into ptr ring */ ++ u64 ring_full; /* page was released from page-pool because ++ * PTR ring was full. ++ */ ++ u64 released_refcnt; /* page released because of elevated ++ * refcnt ++ */ ++}; + #endif + + struct page_pool { +@@ -136,6 +148,10 @@ struct page_pool { + */ + struct ptr_ring ring; + ++#ifdef CONFIG_PAGE_POOL_STATS ++ /* recycle stats are per-cpu to avoid locking */ ++ struct page_pool_recycle_stats __percpu *recycle_stats; ++#endif + atomic_t pages_state_release_cnt; + + /* A page_pool is strictly tied to a single RX-queue being +--- a/net/core/page_pool.c ++++ b/net/core/page_pool.c +@@ -52,8 +52,15 @@ static void page_pool_producer_unlock(st + #ifdef CONFIG_PAGE_POOL_STATS + /* alloc_stat_inc is intended to be used in softirq context */ + #define alloc_stat_inc(pool, __stat) (pool->alloc_stats.__stat++) ++/* recycle_stat_inc is safe to use when preemption is possible. */ ++#define recycle_stat_inc(pool, __stat) \ ++ do { \ ++ struct page_pool_recycle_stats __percpu *s = pool->recycle_stats; \ ++ this_cpu_inc(s->__stat); \ ++ } while (0) + #else + #define alloc_stat_inc(pool, __stat) ++#define recycle_stat_inc(pool, __stat) + #endif + + static int page_pool_init(struct page_pool *pool, +@@ -103,6 +110,12 @@ static int page_pool_init(struct page_po + pool->p.flags & PP_FLAG_PAGE_FRAG) + return -EINVAL; + ++#ifdef CONFIG_PAGE_POOL_STATS ++ pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats); ++ if (!pool->recycle_stats) ++ return -ENOMEM; ++#endif ++ + if (ptr_ring_init(&pool->ring, ring_qsize, GFP_KERNEL) < 0) + return -ENOMEM; + +@@ -435,7 +448,12 @@ static bool page_pool_recycle_in_ring(st + else + ret = ptr_ring_produce_bh(&pool->ring, page); + +- return (ret == 0) ? true : false; ++ if (!ret) { ++ recycle_stat_inc(pool, ring); ++ return true; ++ } ++ ++ return false; + } + + /* Only allow direct recycling in special circumstances, into the +@@ -446,11 +464,14 @@ static bool page_pool_recycle_in_ring(st + static bool page_pool_recycle_in_cache(struct page *page, + struct page_pool *pool) + { +- if (unlikely(pool->alloc.count == PP_ALLOC_CACHE_SIZE)) ++ if (unlikely(pool->alloc.count == PP_ALLOC_CACHE_SIZE)) { ++ recycle_stat_inc(pool, cache_full); + return false; ++ } + + /* Caller MUST have verified/know (page_ref_count(page) == 1) */ + pool->alloc.cache[pool->alloc.count++] = page; ++ recycle_stat_inc(pool, cached); + return true; + } + +@@ -505,6 +526,7 @@ __page_pool_put_page(struct page_pool *p + * doing refcnt based recycle tricks, meaning another process + * will be invoking put_page. + */ ++ recycle_stat_inc(pool, released_refcnt); + /* Do not replace this with page_pool_return_page() */ + page_pool_release_page(pool, page); + put_page(page); +@@ -518,6 +540,7 @@ void page_pool_put_page(struct page_pool + page = __page_pool_put_page(pool, page, dma_sync_size, allow_direct); + if (page && !page_pool_recycle_in_ring(pool, page)) { + /* Cache full, fallback to free pages */ ++ recycle_stat_inc(pool, ring_full); + page_pool_return_page(pool, page); + } + } +@@ -665,6 +688,9 @@ static void page_pool_free(struct page_p + if (pool->p.flags & PP_FLAG_DMA_MAP) + put_device(pool->p.dev); + ++#ifdef CONFIG_PAGE_POOL_STATS ++ free_percpu(pool->recycle_stats); ++#endif + kfree(pool); + } + diff --git a/target/linux/generic/backport-5.15/602-v5.18-page_pool-Add-function-to-batch-and-return-stats.patch b/target/linux/generic/backport-5.15/602-v5.18-page_pool-Add-function-to-batch-and-return-stats.patch new file mode 100644 index 0000000000..e1a7635133 --- /dev/null +++ b/target/linux/generic/backport-5.15/602-v5.18-page_pool-Add-function-to-batch-and-return-stats.patch @@ -0,0 +1,77 @@ +From 6b95e3388b1ea0ca63500c5a6e39162dbf828433 Mon Sep 17 00:00:00 2001 +From: Joe Damato +Date: Tue, 1 Mar 2022 23:55:49 -0800 +Subject: [PATCH 3/3] page_pool: Add function to batch and return stats + +Adds a function page_pool_get_stats which can be used by drivers to obtain +stats for a specified page_pool. + +Signed-off-by: Joe Damato +Acked-by: Jesper Dangaard Brouer +Reviewed-by: Ilias Apalodimas +Signed-off-by: David S. Miller +--- + include/net/page_pool.h | 17 +++++++++++++++++ + net/core/page_pool.c | 25 +++++++++++++++++++++++++ + 2 files changed, 42 insertions(+) + +--- a/include/net/page_pool.h ++++ b/include/net/page_pool.h +@@ -105,6 +105,23 @@ struct page_pool_recycle_stats { + * refcnt + */ + }; ++ ++/* This struct wraps the above stats structs so users of the ++ * page_pool_get_stats API can pass a single argument when requesting the ++ * stats for the page pool. ++ */ ++struct page_pool_stats { ++ struct page_pool_alloc_stats alloc_stats; ++ struct page_pool_recycle_stats recycle_stats; ++}; ++ ++/* ++ * Drivers that wish to harvest page pool stats and report them to users ++ * (perhaps via ethtool, debugfs, or another mechanism) can allocate a ++ * struct page_pool_stats call page_pool_get_stats to get stats for the specified pool. ++ */ ++bool page_pool_get_stats(struct page_pool *pool, ++ struct page_pool_stats *stats); + #endif + + struct page_pool { +--- a/net/core/page_pool.c ++++ b/net/core/page_pool.c +@@ -58,6 +58,31 @@ static void page_pool_producer_unlock(st + struct page_pool_recycle_stats __percpu *s = pool->recycle_stats; \ + this_cpu_inc(s->__stat); \ + } while (0) ++ ++bool page_pool_get_stats(struct page_pool *pool, ++ struct page_pool_stats *stats) ++{ ++ int cpu = 0; ++ ++ if (!stats) ++ return false; ++ ++ memcpy(&stats->alloc_stats, &pool->alloc_stats, sizeof(pool->alloc_stats)); ++ ++ for_each_possible_cpu(cpu) { ++ const struct page_pool_recycle_stats *pcpu = ++ per_cpu_ptr(pool->recycle_stats, cpu); ++ ++ stats->recycle_stats.cached += pcpu->cached; ++ stats->recycle_stats.cache_full += pcpu->cache_full; ++ stats->recycle_stats.ring += pcpu->ring; ++ stats->recycle_stats.ring_full += pcpu->ring_full; ++ stats->recycle_stats.released_refcnt += pcpu->released_refcnt; ++ } ++ ++ return true; ++} ++EXPORT_SYMBOL(page_pool_get_stats); + #else + #define alloc_stat_inc(pool, __stat) + #define recycle_stat_inc(pool, __stat) diff --git a/target/linux/generic/backport-5.15/603-v5.19-page_pool-Add-recycle-stats-to-page_pool_put_page_bu.patch b/target/linux/generic/backport-5.15/603-v5.19-page_pool-Add-recycle-stats-to-page_pool_put_page_bu.patch new file mode 100644 index 0000000000..f438ef3a59 --- /dev/null +++ b/target/linux/generic/backport-5.15/603-v5.19-page_pool-Add-recycle-stats-to-page_pool_put_page_bu.patch @@ -0,0 +1,55 @@ +From 590032a4d2133ecc10d3078a8db1d85a4842f12c Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Mon, 11 Apr 2022 16:05:26 +0200 +Subject: [PATCH] page_pool: Add recycle stats to page_pool_put_page_bulk + +Add missing recycle stats to page_pool_put_page_bulk routine. + +Reviewed-by: Joe Damato +Signed-off-by: Lorenzo Bianconi +Reviewed-by: Ilias Apalodimas +Link: https://lore.kernel.org/r/3712178b51c007cfaed910ea80e68f00c916b1fa.1649685634.git.lorenzo@kernel.org +Signed-off-by: Paolo Abeni +--- + net/core/page_pool.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +--- a/net/core/page_pool.c ++++ b/net/core/page_pool.c +@@ -59,6 +59,12 @@ static void page_pool_producer_unlock(st + this_cpu_inc(s->__stat); \ + } while (0) + ++#define recycle_stat_add(pool, __stat, val) \ ++ do { \ ++ struct page_pool_recycle_stats __percpu *s = pool->recycle_stats; \ ++ this_cpu_add(s->__stat, val); \ ++ } while (0) ++ + bool page_pool_get_stats(struct page_pool *pool, + struct page_pool_stats *stats) + { +@@ -86,6 +92,7 @@ EXPORT_SYMBOL(page_pool_get_stats); + #else + #define alloc_stat_inc(pool, __stat) + #define recycle_stat_inc(pool, __stat) ++#define recycle_stat_add(pool, __stat, val) + #endif + + static int page_pool_init(struct page_pool *pool, +@@ -593,9 +600,13 @@ void page_pool_put_page_bulk(struct page + /* Bulk producer into ptr_ring page_pool cache */ + in_softirq = page_pool_producer_lock(pool); + for (i = 0; i < bulk_len; i++) { +- if (__ptr_ring_produce(&pool->ring, data[i])) +- break; /* ring full */ ++ if (__ptr_ring_produce(&pool->ring, data[i])) { ++ /* ring full */ ++ recycle_stat_inc(pool, ring_full); ++ break; ++ } + } ++ recycle_stat_add(pool, ring, i); + page_pool_producer_unlock(pool, in_softirq); + + /* Hopefully all pages was return into ptr_ring */ diff --git a/target/linux/generic/backport-5.15/604-v5.19-net-page_pool-introduce-ethtool-stats.patch b/target/linux/generic/backport-5.15/604-v5.19-net-page_pool-introduce-ethtool-stats.patch new file mode 100644 index 0000000000..3ff136b084 --- /dev/null +++ b/target/linux/generic/backport-5.15/604-v5.19-net-page_pool-introduce-ethtool-stats.patch @@ -0,0 +1,147 @@ +From f3c5264f452a5b0ac1de1f2f657efbabdea3c76a Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Tue, 12 Apr 2022 18:31:58 +0200 +Subject: [PATCH] net: page_pool: introduce ethtool stats + +Introduce page_pool APIs to report stats through ethtool and reduce +duplicated code in each driver. + +Signed-off-by: Lorenzo Bianconi +Reviewed-by: Jakub Kicinski +Reviewed-by: Ilias Apalodimas +Signed-off-by: David S. Miller +--- + include/net/page_pool.h | 21 ++++++++++++++ + net/core/page_pool.c | 63 ++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 83 insertions(+), 1 deletion(-) + +--- a/include/net/page_pool.h ++++ b/include/net/page_pool.h +@@ -115,6 +115,10 @@ struct page_pool_stats { + struct page_pool_recycle_stats recycle_stats; + }; + ++int page_pool_ethtool_stats_get_count(void); ++u8 *page_pool_ethtool_stats_get_strings(u8 *data); ++u64 *page_pool_ethtool_stats_get(u64 *data, void *stats); ++ + /* + * Drivers that wish to harvest page pool stats and report them to users + * (perhaps via ethtool, debugfs, or another mechanism) can allocate a +@@ -122,6 +126,23 @@ struct page_pool_stats { + */ + bool page_pool_get_stats(struct page_pool *pool, + struct page_pool_stats *stats); ++#else ++ ++static inline int page_pool_ethtool_stats_get_count(void) ++{ ++ return 0; ++} ++ ++static inline u8 *page_pool_ethtool_stats_get_strings(u8 *data) ++{ ++ return data; ++} ++ ++static inline u64 *page_pool_ethtool_stats_get(u64 *data, void *stats) ++{ ++ return data; ++} ++ + #endif + + struct page_pool { +--- a/net/core/page_pool.c ++++ b/net/core/page_pool.c +@@ -18,6 +18,7 @@ + #include + #include /* for __put_page() */ + #include ++#include + + #include + +@@ -65,6 +66,20 @@ static void page_pool_producer_unlock(st + this_cpu_add(s->__stat, val); \ + } while (0) + ++static const char pp_stats[][ETH_GSTRING_LEN] = { ++ "rx_pp_alloc_fast", ++ "rx_pp_alloc_slow", ++ "rx_pp_alloc_slow_ho", ++ "rx_pp_alloc_empty", ++ "rx_pp_alloc_refill", ++ "rx_pp_alloc_waive", ++ "rx_pp_recycle_cached", ++ "rx_pp_recycle_cache_full", ++ "rx_pp_recycle_ring", ++ "rx_pp_recycle_ring_full", ++ "rx_pp_recycle_released_ref", ++}; ++ + bool page_pool_get_stats(struct page_pool *pool, + struct page_pool_stats *stats) + { +@@ -73,7 +88,13 @@ bool page_pool_get_stats(struct page_poo + if (!stats) + return false; + +- memcpy(&stats->alloc_stats, &pool->alloc_stats, sizeof(pool->alloc_stats)); ++ /* The caller is responsible to initialize stats. */ ++ stats->alloc_stats.fast += pool->alloc_stats.fast; ++ stats->alloc_stats.slow += pool->alloc_stats.slow; ++ stats->alloc_stats.slow_high_order += pool->alloc_stats.slow_high_order; ++ stats->alloc_stats.empty += pool->alloc_stats.empty; ++ stats->alloc_stats.refill += pool->alloc_stats.refill; ++ stats->alloc_stats.waive += pool->alloc_stats.waive; + + for_each_possible_cpu(cpu) { + const struct page_pool_recycle_stats *pcpu = +@@ -89,6 +110,46 @@ bool page_pool_get_stats(struct page_poo + return true; + } + EXPORT_SYMBOL(page_pool_get_stats); ++ ++u8 *page_pool_ethtool_stats_get_strings(u8 *data) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(pp_stats); i++) { ++ memcpy(data, pp_stats[i], ETH_GSTRING_LEN); ++ data += ETH_GSTRING_LEN; ++ } ++ ++ return data; ++} ++EXPORT_SYMBOL(page_pool_ethtool_stats_get_strings); ++ ++int page_pool_ethtool_stats_get_count(void) ++{ ++ return ARRAY_SIZE(pp_stats); ++} ++EXPORT_SYMBOL(page_pool_ethtool_stats_get_count); ++ ++u64 *page_pool_ethtool_stats_get(u64 *data, void *stats) ++{ ++ struct page_pool_stats *pool_stats = stats; ++ ++ *data++ = pool_stats->alloc_stats.fast; ++ *data++ = pool_stats->alloc_stats.slow; ++ *data++ = pool_stats->alloc_stats.slow_high_order; ++ *data++ = pool_stats->alloc_stats.empty; ++ *data++ = pool_stats->alloc_stats.refill; ++ *data++ = pool_stats->alloc_stats.waive; ++ *data++ = pool_stats->recycle_stats.cached; ++ *data++ = pool_stats->recycle_stats.cache_full; ++ *data++ = pool_stats->recycle_stats.ring; ++ *data++ = pool_stats->recycle_stats.ring_full; ++ *data++ = pool_stats->recycle_stats.released_refcnt; ++ ++ return data; ++} ++EXPORT_SYMBOL(page_pool_ethtool_stats_get); ++ + #else + #define alloc_stat_inc(pool, __stat) + #define recycle_stat_inc(pool, __stat) diff --git a/target/linux/generic/backport-5.15/605-v5.18-xdp-introduce-flags-field-in-xdp_buff-xdp_frame.patch b/target/linux/generic/backport-5.15/605-v5.18-xdp-introduce-flags-field-in-xdp_buff-xdp_frame.patch new file mode 100644 index 0000000000..4a914404a2 --- /dev/null +++ b/target/linux/generic/backport-5.15/605-v5.18-xdp-introduce-flags-field-in-xdp_buff-xdp_frame.patch @@ -0,0 +1,99 @@ +From 2e88d4ff03013937028f5397268b21e10cf68713 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Fri, 21 Jan 2022 11:09:45 +0100 +Subject: [PATCH] xdp: introduce flags field in xdp_buff/xdp_frame + +Introduce flags field in xdp_frame and xdp_buffer data structures +to define additional buffer features. At the moment the only +supported buffer feature is frags bit (XDP_FLAGS_HAS_FRAGS). +frags bit is used to specify if this is a linear buffer +(XDP_FLAGS_HAS_FRAGS not set) or a frags frame (XDP_FLAGS_HAS_FRAGS +set). In the latter case the driver is expected to initialize the +skb_shared_info structure at the end of the first buffer to link together +subsequent buffers belonging to the same frame. + +Acked-by: Toke Hoiland-Jorgensen +Acked-by: John Fastabend +Acked-by: Jesper Dangaard Brouer +Signed-off-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/e389f14f3a162c0a5bc6a2e1aa8dd01a90be117d.1642758637.git.lorenzo@kernel.org +Signed-off-by: Alexei Starovoitov +--- + include/net/xdp.h | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +--- a/include/net/xdp.h ++++ b/include/net/xdp.h +@@ -66,6 +66,10 @@ struct xdp_txq_info { + struct net_device *dev; + }; + ++enum xdp_buff_flags { ++ XDP_FLAGS_HAS_FRAGS = BIT(0), /* non-linear xdp buff */ ++}; ++ + struct xdp_buff { + void *data; + void *data_end; +@@ -74,13 +78,30 @@ struct xdp_buff { + struct xdp_rxq_info *rxq; + struct xdp_txq_info *txq; + u32 frame_sz; /* frame size to deduce data_hard_end/reserved tailroom*/ ++ u32 flags; /* supported values defined in xdp_buff_flags */ + }; + ++static __always_inline bool xdp_buff_has_frags(struct xdp_buff *xdp) ++{ ++ return !!(xdp->flags & XDP_FLAGS_HAS_FRAGS); ++} ++ ++static __always_inline void xdp_buff_set_frags_flag(struct xdp_buff *xdp) ++{ ++ xdp->flags |= XDP_FLAGS_HAS_FRAGS; ++} ++ ++static __always_inline void xdp_buff_clear_frags_flag(struct xdp_buff *xdp) ++{ ++ xdp->flags &= ~XDP_FLAGS_HAS_FRAGS; ++} ++ + static __always_inline void + xdp_init_buff(struct xdp_buff *xdp, u32 frame_sz, struct xdp_rxq_info *rxq) + { + xdp->frame_sz = frame_sz; + xdp->rxq = rxq; ++ xdp->flags = 0; + } + + static __always_inline void +@@ -122,8 +143,14 @@ struct xdp_frame { + */ + struct xdp_mem_info mem; + struct net_device *dev_rx; /* used by cpumap */ ++ u32 flags; /* supported values defined in xdp_buff_flags */ + }; + ++static __always_inline bool xdp_frame_has_frags(struct xdp_frame *frame) ++{ ++ return !!(frame->flags & XDP_FLAGS_HAS_FRAGS); ++} ++ + #define XDP_BULK_QUEUE_SIZE 16 + struct xdp_frame_bulk { + int count; +@@ -180,6 +207,7 @@ void xdp_convert_frame_to_buff(struct xd + xdp->data_end = frame->data + frame->len; + xdp->data_meta = frame->data - frame->metasize; + xdp->frame_sz = frame->frame_sz; ++ xdp->flags = frame->flags; + } + + static inline +@@ -206,6 +234,7 @@ int xdp_update_frame_from_buff(struct xd + xdp_frame->headroom = headroom - sizeof(*xdp_frame); + xdp_frame->metasize = metasize; + xdp_frame->frame_sz = xdp->frame_sz; ++ xdp_frame->flags = xdp->flags; + + return 0; + } diff --git a/target/linux/generic/backport-5.15/606-v5.18-xdp-add-frags-support-to-xdp_return_-buff-frame.patch b/target/linux/generic/backport-5.15/606-v5.18-xdp-add-frags-support-to-xdp_return_-buff-frame.patch new file mode 100644 index 0000000000..e126b21417 --- /dev/null +++ b/target/linux/generic/backport-5.15/606-v5.18-xdp-add-frags-support-to-xdp_return_-buff-frame.patch @@ -0,0 +1,137 @@ +From 7c48cb0176c6d6d3b55029f7ff4ffa05faee6446 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Fri, 21 Jan 2022 11:09:50 +0100 +Subject: [PATCH] xdp: add frags support to xdp_return_{buff/frame} + +Take into account if the received xdp_buff/xdp_frame is non-linear +recycling/returning the frame memory to the allocator or into +xdp_frame_bulk. + +Acked-by: Toke Hoiland-Jorgensen +Acked-by: John Fastabend +Signed-off-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/a961069febc868508ce1bdf5e53a343eb4e57cb2.1642758637.git.lorenzo@kernel.org +Signed-off-by: Alexei Starovoitov +--- + include/net/xdp.h | 18 ++++++++++++++-- + net/core/xdp.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 69 insertions(+), 3 deletions(-) + +--- a/include/net/xdp.h ++++ b/include/net/xdp.h +@@ -275,10 +275,24 @@ void __xdp_release_frame(void *data, str + static inline void xdp_release_frame(struct xdp_frame *xdpf) + { + struct xdp_mem_info *mem = &xdpf->mem; ++ struct skb_shared_info *sinfo; ++ int i; + + /* Curr only page_pool needs this */ +- if (mem->type == MEM_TYPE_PAGE_POOL) +- __xdp_release_frame(xdpf->data, mem); ++ if (mem->type != MEM_TYPE_PAGE_POOL) ++ return; ++ ++ if (likely(!xdp_frame_has_frags(xdpf))) ++ goto out; ++ ++ sinfo = xdp_get_shared_info_from_frame(xdpf); ++ for (i = 0; i < sinfo->nr_frags; i++) { ++ struct page *page = skb_frag_page(&sinfo->frags[i]); ++ ++ __xdp_release_frame(page_address(page), mem); ++ } ++out: ++ __xdp_release_frame(xdpf->data, mem); + } + + int xdp_rxq_info_reg(struct xdp_rxq_info *xdp_rxq, +--- a/net/core/xdp.c ++++ b/net/core/xdp.c +@@ -409,12 +409,38 @@ static void __xdp_return(void *data, str + + void xdp_return_frame(struct xdp_frame *xdpf) + { ++ struct skb_shared_info *sinfo; ++ int i; ++ ++ if (likely(!xdp_frame_has_frags(xdpf))) ++ goto out; ++ ++ sinfo = xdp_get_shared_info_from_frame(xdpf); ++ for (i = 0; i < sinfo->nr_frags; i++) { ++ struct page *page = skb_frag_page(&sinfo->frags[i]); ++ ++ __xdp_return(page_address(page), &xdpf->mem, false, NULL); ++ } ++out: + __xdp_return(xdpf->data, &xdpf->mem, false, NULL); + } + EXPORT_SYMBOL_GPL(xdp_return_frame); + + void xdp_return_frame_rx_napi(struct xdp_frame *xdpf) + { ++ struct skb_shared_info *sinfo; ++ int i; ++ ++ if (likely(!xdp_frame_has_frags(xdpf))) ++ goto out; ++ ++ sinfo = xdp_get_shared_info_from_frame(xdpf); ++ for (i = 0; i < sinfo->nr_frags; i++) { ++ struct page *page = skb_frag_page(&sinfo->frags[i]); ++ ++ __xdp_return(page_address(page), &xdpf->mem, true, NULL); ++ } ++out: + __xdp_return(xdpf->data, &xdpf->mem, true, NULL); + } + EXPORT_SYMBOL_GPL(xdp_return_frame_rx_napi); +@@ -450,7 +476,7 @@ void xdp_return_frame_bulk(struct xdp_fr + struct xdp_mem_allocator *xa; + + if (mem->type != MEM_TYPE_PAGE_POOL) { +- __xdp_return(xdpf->data, &xdpf->mem, false, NULL); ++ xdp_return_frame(xdpf); + return; + } + +@@ -469,12 +495,38 @@ void xdp_return_frame_bulk(struct xdp_fr + bq->xa = rhashtable_lookup(mem_id_ht, &mem->id, mem_id_rht_params); + } + ++ if (unlikely(xdp_frame_has_frags(xdpf))) { ++ struct skb_shared_info *sinfo; ++ int i; ++ ++ sinfo = xdp_get_shared_info_from_frame(xdpf); ++ for (i = 0; i < sinfo->nr_frags; i++) { ++ skb_frag_t *frag = &sinfo->frags[i]; ++ ++ bq->q[bq->count++] = skb_frag_address(frag); ++ if (bq->count == XDP_BULK_QUEUE_SIZE) ++ xdp_flush_frame_bulk(bq); ++ } ++ } + bq->q[bq->count++] = xdpf->data; + } + EXPORT_SYMBOL_GPL(xdp_return_frame_bulk); + + void xdp_return_buff(struct xdp_buff *xdp) + { ++ struct skb_shared_info *sinfo; ++ int i; ++ ++ if (likely(!xdp_buff_has_frags(xdp))) ++ goto out; ++ ++ sinfo = xdp_get_shared_info_from_buff(xdp); ++ for (i = 0; i < sinfo->nr_frags; i++) { ++ struct page *page = skb_frag_page(&sinfo->frags[i]); ++ ++ __xdp_return(page_address(page), &xdp->rxq->mem, true, xdp); ++ } ++out: + __xdp_return(xdp->data, &xdp->rxq->mem, true, xdp); + } + diff --git a/target/linux/generic/backport-5.15/607-v5.18-net-skbuff-add-size-metadata-to-skb_shared_info-for-.patch b/target/linux/generic/backport-5.15/607-v5.18-net-skbuff-add-size-metadata-to-skb_shared_info-for-.patch new file mode 100644 index 0000000000..36f55d511a --- /dev/null +++ b/target/linux/generic/backport-5.15/607-v5.18-net-skbuff-add-size-metadata-to-skb_shared_info-for-.patch @@ -0,0 +1,31 @@ +From d16697cb6261d4cc23422e6b1cb2759df8aa76d0 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Fri, 21 Jan 2022 11:09:44 +0100 +Subject: [PATCH] net: skbuff: add size metadata to skb_shared_info for xdp + +Introduce xdp_frags_size field in skb_shared_info data structure +to store xdp_buff/xdp_frame frame paged size (xdp_frags_size will +be used in xdp frags support). In order to not increase +skb_shared_info size we will use a hole due to skb_shared_info +alignment. + +Acked-by: Toke Hoiland-Jorgensen +Acked-by: John Fastabend +Acked-by: Jesper Dangaard Brouer +Signed-off-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/8a849819a3e0a143d540f78a3a5add76e17e980d.1642758637.git.lorenzo@kernel.org +Signed-off-by: Alexei Starovoitov +--- + include/linux/skbuff.h | 1 + + 1 file changed, 1 insertion(+) + +--- a/include/linux/skbuff.h ++++ b/include/linux/skbuff.h +@@ -568,6 +568,7 @@ struct skb_shared_info { + * Warning : all fields before dataref are cleared in __alloc_skb() + */ + atomic_t dataref; ++ unsigned int xdp_frags_size; + + /* Intermediate layers must ensure that destructor_arg + * remains valid until skb destructor */ diff --git a/target/linux/generic/backport-5.15/608-v5.18-net-veth-Account-total-xdp_frame-len-running-ndo_xdp.patch b/target/linux/generic/backport-5.15/608-v5.18-net-veth-Account-total-xdp_frame-len-running-ndo_xdp.patch new file mode 100644 index 0000000000..1ec260a2e6 --- /dev/null +++ b/target/linux/generic/backport-5.15/608-v5.18-net-veth-Account-total-xdp_frame-len-running-ndo_xdp.patch @@ -0,0 +1,65 @@ +From 5142239a22219921a7863cf00c9ab853c00689d8 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Fri, 11 Mar 2022 10:14:18 +0100 +Subject: [PATCH] net: veth: Account total xdp_frame len running ndo_xdp_xmit + +Even if this is a theoretical issue since it is not possible to perform +XDP_REDIRECT on a non-linear xdp_frame, veth driver does not account +paged area in ndo_xdp_xmit function pointer. +Introduce xdp_get_frame_len utility routine to get the xdp_frame full +length and account total frame size running XDP_REDIRECT of a +non-linear xdp frame into a veth device. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Daniel Borkmann +Acked-by: Toke Hoiland-Jorgensen +Acked-by: John Fastabend +Link: https://lore.kernel.org/bpf/54f9fd3bb65d190daf2c0bbae2f852ff16cfbaa0.1646989407.git.lorenzo@kernel.org +--- + drivers/net/veth.c | 4 ++-- + include/net/xdp.h | 14 ++++++++++++++ + 2 files changed, 16 insertions(+), 2 deletions(-) + +--- a/drivers/net/veth.c ++++ b/drivers/net/veth.c +@@ -503,7 +503,7 @@ static int veth_xdp_xmit(struct net_devi + struct xdp_frame *frame = frames[i]; + void *ptr = veth_xdp_to_ptr(frame); + +- if (unlikely(frame->len > max_len || ++ if (unlikely(xdp_get_frame_len(frame) > max_len || + __ptr_ring_produce(&rq->xdp_ring, ptr))) + break; + nxmit++; +@@ -864,7 +864,7 @@ static int veth_xdp_rcv(struct veth_rq * + /* ndo_xdp_xmit */ + struct xdp_frame *frame = veth_ptr_to_xdp(ptr); + +- stats->xdp_bytes += frame->len; ++ stats->xdp_bytes += xdp_get_frame_len(frame); + frame = veth_xdp_rcv_one(rq, frame, bq, stats); + if (frame) { + /* XDP_PASS */ +--- a/include/net/xdp.h ++++ b/include/net/xdp.h +@@ -295,6 +295,20 @@ out: + __xdp_release_frame(xdpf->data, mem); + } + ++static __always_inline unsigned int xdp_get_frame_len(struct xdp_frame *xdpf) ++{ ++ struct skb_shared_info *sinfo; ++ unsigned int len = xdpf->len; ++ ++ if (likely(!xdp_frame_has_frags(xdpf))) ++ goto out; ++ ++ sinfo = xdp_get_shared_info_from_frame(xdpf); ++ len += sinfo->xdp_frags_size; ++out: ++ return len; ++} ++ + int xdp_rxq_info_reg(struct xdp_rxq_info *xdp_rxq, + struct net_device *dev, u32 queue_index, unsigned int napi_id); + void xdp_rxq_info_unreg(struct xdp_rxq_info *xdp_rxq); diff --git a/target/linux/generic/backport-5.15/609-v5.18-veth-Allow-jumbo-frames-in-xdp-mode.patch b/target/linux/generic/backport-5.15/609-v5.18-veth-Allow-jumbo-frames-in-xdp-mode.patch new file mode 100644 index 0000000000..cab980a6dc --- /dev/null +++ b/target/linux/generic/backport-5.15/609-v5.18-veth-Allow-jumbo-frames-in-xdp-mode.patch @@ -0,0 +1,40 @@ +From 7cda76d858a4e71ac4a04066c093679a12e1312c Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Fri, 11 Mar 2022 10:14:20 +0100 +Subject: [PATCH] veth: Allow jumbo frames in xdp mode +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Allow increasing the MTU over page boundaries on veth devices +if the attached xdp program declares to support xdp fragments. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Daniel Borkmann +Acked-by: Toke Høiland-Jørgensen +Acked-by: John Fastabend +Link: https://lore.kernel.org/bpf/d5dc039c3d4123426e7023a488c449181a7bc57f.1646989407.git.lorenzo@kernel.org +--- + drivers/net/veth.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +--- a/drivers/net/veth.c ++++ b/drivers/net/veth.c +@@ -1473,9 +1473,14 @@ static int veth_xdp_set(struct net_devic + goto err; + } + +- max_mtu = PAGE_SIZE - VETH_XDP_HEADROOM - +- peer->hard_header_len - +- SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); ++ max_mtu = SKB_WITH_OVERHEAD(PAGE_SIZE - VETH_XDP_HEADROOM) - ++ peer->hard_header_len; ++ /* Allow increasing the max_mtu if the program supports ++ * XDP fragments. ++ */ ++ //if (prog->aux->xdp_has_frags) ++ max_mtu += PAGE_SIZE * MAX_SKB_FRAGS; ++ + if (peer->mtu > max_mtu) { + NL_SET_ERR_MSG_MOD(extack, "Peer MTU is too large to set XDP"); + err = -ERANGE; diff --git a/target/linux/generic/backport-5.15/611-v6.3-net-add-helper-eth_addr_add.patch b/target/linux/generic/backport-5.15/611-v6.3-net-add-helper-eth_addr_add.patch new file mode 100644 index 0000000000..c5d5d2c3a9 --- /dev/null +++ b/target/linux/generic/backport-5.15/611-v6.3-net-add-helper-eth_addr_add.patch @@ -0,0 +1,41 @@ +From 7390609b0121a1b982c5ecdfcd72dc328e5784ee Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Mon, 6 Feb 2023 13:43:42 +0000 +Subject: [PATCH] net: add helper eth_addr_add() + +Add a helper to add an offset to a ethernet address. This comes in handy +if you have a base ethernet address for multiple interfaces. + +Signed-off-by: Michael Walle +Reviewed-by: Andrew Lunn +Acked-by: Jakub Kicinski +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-9-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + include/linux/etherdevice.h | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +--- a/include/linux/etherdevice.h ++++ b/include/linux/etherdevice.h +@@ -478,6 +478,20 @@ static inline void eth_addr_inc(u8 *addr + } + + /** ++ * eth_addr_add() - Add (or subtract) an offset to/from the given MAC address. ++ * ++ * @offset: Offset to add. ++ * @addr: Pointer to a six-byte array containing Ethernet address to increment. ++ */ ++static inline void eth_addr_add(u8 *addr, long offset) ++{ ++ u64 u = ether_addr_to_u64(addr); ++ ++ u += offset; ++ u64_to_ether_addr(u, addr); ++} ++ ++/** + * is_etherdev_addr - Tell if given Ethernet address belongs to the device. + * @dev: Pointer to a device structure + * @addr: Pointer to a six-byte array containing the Ethernet address diff --git a/target/linux/generic/backport-5.15/700-v5.17-net-dsa-introduce-tagger-owned-storage-for-private.patch b/target/linux/generic/backport-5.15/700-v5.17-net-dsa-introduce-tagger-owned-storage-for-private.patch new file mode 100644 index 0000000000..f56a968589 --- /dev/null +++ b/target/linux/generic/backport-5.15/700-v5.17-net-dsa-introduce-tagger-owned-storage-for-private.patch @@ -0,0 +1,279 @@ +From dc452a471dbae8aca8257c565174212620880093 Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Fri, 10 Dec 2021 01:34:37 +0200 +Subject: net: dsa: introduce tagger-owned storage for private and shared data + +Ansuel is working on register access over Ethernet for the qca8k switch +family. This requires the qca8k tagging protocol driver to receive +frames which aren't intended for the network stack, but instead for the +qca8k switch driver itself. + +The dp->priv is currently the prevailing method for passing data back +and forth between the tagging protocol driver and the switch driver. +However, this method is riddled with caveats. + +The DSA design allows in principle for any switch driver to return any +protocol it desires in ->get_tag_protocol(). The dsa_loop driver can be +modified to do just that. But in the current design, the memory behind +dp->priv has to be allocated by the switch driver, so if the tagging +protocol is paired to an unexpected switch driver, we may end up in NULL +pointer dereferences inside the kernel, or worse (a switch driver may +allocate dp->priv according to the expectations of a different tagger). + +The latter possibility is even more plausible considering that DSA +switches can dynamically change tagging protocols in certain cases +(dsa <-> edsa, ocelot <-> ocelot-8021q), and the current design lends +itself to mistakes that are all too easy to make. + +This patch proposes that the tagging protocol driver should manage its +own memory, instead of relying on the switch driver to do so. +After analyzing the different in-tree needs, it can be observed that the +required tagger storage is per switch, therefore a ds->tagger_data +pointer is introduced. In principle, per-port storage could also be +introduced, although there is no need for it at the moment. Future +changes will replace the current usage of dp->priv with ds->tagger_data. + +We define a "binding" event between the DSA switch tree and the tagging +protocol. During this binding event, the tagging protocol's ->connect() +method is called first, and this may allocate some memory for each +switch of the tree. Then a cross-chip notifier is emitted for the +switches within that tree, and they are given the opportunity to fix up +the tagger's memory (for example, they might set up some function +pointers that represent virtual methods for consuming packets). +Because the memory is owned by the tagger, there exists a ->disconnect() +method for the tagger (which is the place to free the resources), but +there doesn't exist a ->disconnect() method for the switch driver. +This is part of the design. The switch driver should make minimal use of +the public part of the tagger data, and only after type-checking it +using the supplied "proto" argument. + +In the code there are in fact two binding events, one is the initial +event in dsa_switch_setup_tag_protocol(). At this stage, the cross chip +notifier chains aren't initialized, so we call each switch's connect() +method by hand. Then there is dsa_tree_bind_tag_proto() during +dsa_tree_change_tag_proto(), and here we have an old protocol and a new +one. We first connect to the new one before disconnecting from the old +one, to simplify error handling a bit and to ensure we remain in a valid +state at all times. + +Co-developed-by: Ansuel Smith +Signed-off-by: Ansuel Smith +Signed-off-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + include/net/dsa.h | 12 +++++++++ + net/dsa/dsa2.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++--- + net/dsa/dsa_priv.h | 1 + + net/dsa/switch.c | 14 +++++++++++ + 4 files changed, 96 insertions(+), 4 deletions(-) + +--- a/include/net/dsa.h ++++ b/include/net/dsa.h +@@ -80,12 +80,15 @@ enum dsa_tag_protocol { + }; + + struct dsa_switch; ++struct dsa_switch_tree; + + struct dsa_device_ops { + struct sk_buff *(*xmit)(struct sk_buff *skb, struct net_device *dev); + struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev); + void (*flow_dissect)(const struct sk_buff *skb, __be16 *proto, + int *offset); ++ int (*connect)(struct dsa_switch_tree *dst); ++ void (*disconnect)(struct dsa_switch_tree *dst); + unsigned int needed_headroom; + unsigned int needed_tailroom; + const char *name; +@@ -329,6 +332,8 @@ struct dsa_switch { + */ + void *priv; + ++ void *tagger_data; ++ + /* + * Configuration data for this switch. + */ +@@ -612,6 +617,13 @@ struct dsa_switch_ops { + enum dsa_tag_protocol mprot); + int (*change_tag_protocol)(struct dsa_switch *ds, int port, + enum dsa_tag_protocol proto); ++ /* ++ * Method for switch drivers to connect to the tagging protocol driver ++ * in current use. The switch driver can provide handlers for certain ++ * types of packets for switch management. ++ */ ++ int (*connect_tag_protocol)(struct dsa_switch *ds, ++ enum dsa_tag_protocol proto); + + /* Optional switch-wide initialization and destruction methods */ + int (*setup)(struct dsa_switch *ds); +--- a/net/dsa/dsa2.c ++++ b/net/dsa/dsa2.c +@@ -230,8 +230,12 @@ static struct dsa_switch_tree *dsa_tree_ + + static void dsa_tree_free(struct dsa_switch_tree *dst) + { +- if (dst->tag_ops) ++ if (dst->tag_ops) { ++ if (dst->tag_ops->disconnect) ++ dst->tag_ops->disconnect(dst); ++ + dsa_tag_driver_put(dst->tag_ops); ++ } + list_del(&dst->list); + kfree(dst); + } +@@ -805,7 +809,7 @@ static int dsa_switch_setup_tag_protocol + int port, err; + + if (tag_ops->proto == dst->default_proto) +- return 0; ++ goto connect; + + for (port = 0; port < ds->num_ports; port++) { + if (!dsa_is_cpu_port(ds, port)) +@@ -821,6 +825,17 @@ static int dsa_switch_setup_tag_protocol + } + } + ++connect: ++ if (ds->ops->connect_tag_protocol) { ++ err = ds->ops->connect_tag_protocol(ds, tag_ops->proto); ++ if (err) { ++ dev_err(ds->dev, ++ "Unable to connect to tag protocol \"%s\": %pe\n", ++ tag_ops->name, ERR_PTR(err)); ++ return err; ++ } ++ } ++ + return 0; + } + +@@ -1132,6 +1147,46 @@ static void dsa_tree_teardown(struct dsa + dst->setup = false; + } + ++static int dsa_tree_bind_tag_proto(struct dsa_switch_tree *dst, ++ const struct dsa_device_ops *tag_ops) ++{ ++ const struct dsa_device_ops *old_tag_ops = dst->tag_ops; ++ struct dsa_notifier_tag_proto_info info; ++ int err; ++ ++ dst->tag_ops = tag_ops; ++ ++ /* Notify the new tagger about the connection to this tree */ ++ if (tag_ops->connect) { ++ err = tag_ops->connect(dst); ++ if (err) ++ goto out_revert; ++ } ++ ++ /* Notify the switches from this tree about the connection ++ * to the new tagger ++ */ ++ info.tag_ops = tag_ops; ++ err = dsa_tree_notify(dst, DSA_NOTIFIER_TAG_PROTO_CONNECT, &info); ++ if (err && err != -EOPNOTSUPP) ++ goto out_disconnect; ++ ++ /* Notify the old tagger about the disconnection from this tree */ ++ if (old_tag_ops->disconnect) ++ old_tag_ops->disconnect(dst); ++ ++ return 0; ++ ++out_disconnect: ++ /* Revert the new tagger's connection to this tree */ ++ if (tag_ops->disconnect) ++ tag_ops->disconnect(dst); ++out_revert: ++ dst->tag_ops = old_tag_ops; ++ ++ return err; ++} ++ + /* Since the dsa/tagging sysfs device attribute is per master, the assumption + * is that all DSA switches within a tree share the same tagger, otherwise + * they would have formed disjoint trees (different "dsa,member" values). +@@ -1164,12 +1219,15 @@ int dsa_tree_change_tag_proto(struct dsa + goto out_unlock; + } + ++ /* Notify the tag protocol change */ + info.tag_ops = tag_ops; + err = dsa_tree_notify(dst, DSA_NOTIFIER_TAG_PROTO, &info); + if (err) +- goto out_unwind_tagger; ++ return err; + +- dst->tag_ops = tag_ops; ++ err = dsa_tree_bind_tag_proto(dst, tag_ops); ++ if (err) ++ goto out_unwind_tagger; + + rtnl_unlock(); + +@@ -1257,6 +1315,7 @@ static int dsa_port_parse_cpu(struct dsa + struct dsa_switch *ds = dp->ds; + struct dsa_switch_tree *dst = ds->dst; + enum dsa_tag_protocol default_proto; ++ int err; + + /* Find out which protocol the switch would prefer. */ + default_proto = dsa_get_tag_protocol(dp, master); +@@ -1311,6 +1370,12 @@ static int dsa_port_parse_cpu(struct dsa + */ + dsa_tag_driver_put(tag_ops); + } else { ++ if (tag_ops->connect) { ++ err = tag_ops->connect(dst); ++ if (err) ++ return err; ++ } ++ + dst->tag_ops = tag_ops; + } + +--- a/net/dsa/dsa_priv.h ++++ b/net/dsa/dsa_priv.h +@@ -37,6 +37,7 @@ enum { + DSA_NOTIFIER_VLAN_DEL, + DSA_NOTIFIER_MTU, + DSA_NOTIFIER_TAG_PROTO, ++ DSA_NOTIFIER_TAG_PROTO_CONNECT, + DSA_NOTIFIER_MRP_ADD, + DSA_NOTIFIER_MRP_DEL, + DSA_NOTIFIER_MRP_ADD_RING_ROLE, +--- a/net/dsa/switch.c ++++ b/net/dsa/switch.c +@@ -616,6 +616,17 @@ static int dsa_switch_change_tag_proto(s + return 0; + } + ++static int dsa_switch_connect_tag_proto(struct dsa_switch *ds, ++ struct dsa_notifier_tag_proto_info *info) ++{ ++ const struct dsa_device_ops *tag_ops = info->tag_ops; ++ ++ if (!ds->ops->connect_tag_protocol) ++ return -EOPNOTSUPP; ++ ++ return ds->ops->connect_tag_protocol(ds, tag_ops->proto); ++} ++ + static int dsa_switch_mrp_add(struct dsa_switch *ds, + struct dsa_notifier_mrp_info *info) + { +@@ -735,6 +746,9 @@ static int dsa_switch_event(struct notif + case DSA_NOTIFIER_TAG_PROTO: + err = dsa_switch_change_tag_proto(ds, info); + break; ++ case DSA_NOTIFIER_TAG_PROTO_CONNECT: ++ err = dsa_switch_connect_tag_proto(ds, info); ++ break; + case DSA_NOTIFIER_MRP_ADD: + err = dsa_switch_mrp_add(ds, info); + break; diff --git a/target/linux/generic/backport-5.15/701-v5.17-dsa-make-tagging-protocols-connect-to-individual-switches.patch b/target/linux/generic/backport-5.15/701-v5.17-dsa-make-tagging-protocols-connect-to-individual-switches.patch new file mode 100644 index 0000000000..0c50ae6fb9 --- /dev/null +++ b/target/linux/generic/backport-5.15/701-v5.17-dsa-make-tagging-protocols-connect-to-individual-switches.patch @@ -0,0 +1,274 @@ +From 7f2973149c22e7a6fee4c0c9fa6b8e4108e9c208 Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Tue, 14 Dec 2021 03:45:36 +0200 +Subject: net: dsa: make tagging protocols connect to individual switches from + a tree + +On the NXP Bluebox 3 board which uses a multi-switch setup with sja1105, +the mechanism through which the tagger connects to the switch tree is +broken, due to improper DSA code design. At the time when tag_ops->connect() +is called in dsa_port_parse_cpu(), DSA hasn't finished "touching" all +the ports, so it doesn't know how large the tree is and how many ports +it has. It has just seen the first CPU port by this time. As a result, +this function will call the tagger's ->connect method too early, and the +tagger will connect only to the first switch from the tree. + +This could be perhaps addressed a bit more simply by just moving the +tag_ops->connect(dst) call a bit later (for example in dsa_tree_setup), +but there is already a design inconsistency at present: on the switch +side, the notification is on a per-switch basis, but on the tagger side, +it is on a per-tree basis. Furthermore, the persistent storage itself is +per switch (ds->tagger_data). And the tagger connect and disconnect +procedures (at least the ones that exist currently) could see a fair bit +of simplification if they didn't have to iterate through the switches of +a tree. + +To fix the issue, this change transforms tag_ops->connect(dst) into +tag_ops->connect(ds) and moves it somewhere where we already iterate +over all switches of a tree. That is in dsa_switch_setup_tag_protocol(), +which is a good placement because we already have there the connection +call to the switch side of things. + +As for the dsa_tree_bind_tag_proto() method (called from the code path +that changes the tag protocol), things are a bit more complicated +because we receive the tree as argument, yet when we unwind on errors, +it would be nice to not call tag_ops->disconnect(ds) where we didn't +previously call tag_ops->connect(ds). We didn't have this problem before +because the tag_ops connection operations passed the entire dst before, +and this is more fine grained now. To solve the error rewind case using +the new API, we have to create yet one more cross-chip notifier for +disconnection, and stay connected with the old tag protocol to all the +switches in the tree until we've succeeded to connect with the new one +as well. So if something fails half way, the whole tree is still +connected to the old tagger. But there may still be leaks if the tagger +fails to connect to the 2nd out of 3 switches in a tree: somebody needs +to tell the tagger to disconnect from the first switch. Nothing comes +for free, and this was previously handled privately by the tagging +protocol driver before, but now we need to emit a disconnect cross-chip +notifier for that, because DSA has to take care of the unwind path. We +assume that the tagging protocol has connected to a switch if it has set +ds->tagger_data to something, otherwise we avoid calling its +disconnection method in the error rewind path. + +The rest of the changes are in the tagging protocol drivers, and have to +do with the replacement of dst with ds. The iteration is removed and the +error unwind path is simplified, as mentioned above. + +Signed-off-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + include/net/dsa.h | 5 ++-- + net/dsa/dsa2.c | 44 +++++++++++++----------------- + net/dsa/dsa_priv.h | 1 + + net/dsa/switch.c | 52 ++++++++++++++++++++++++++++++++--- + net/dsa/tag_ocelot_8021q.c | 53 +++++++++++------------------------- + net/dsa/tag_sja1105.c | 67 ++++++++++++++++------------------------------ + 6 files changed, 109 insertions(+), 113 deletions(-) + +--- a/include/net/dsa.h ++++ b/include/net/dsa.h +@@ -80,15 +80,14 @@ enum dsa_tag_protocol { + }; + + struct dsa_switch; +-struct dsa_switch_tree; + + struct dsa_device_ops { + struct sk_buff *(*xmit)(struct sk_buff *skb, struct net_device *dev); + struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev); + void (*flow_dissect)(const struct sk_buff *skb, __be16 *proto, + int *offset); +- int (*connect)(struct dsa_switch_tree *dst); +- void (*disconnect)(struct dsa_switch_tree *dst); ++ int (*connect)(struct dsa_switch *ds); ++ void (*disconnect)(struct dsa_switch *ds); + unsigned int needed_headroom; + unsigned int needed_tailroom; + const char *name; +--- a/net/dsa/dsa2.c ++++ b/net/dsa/dsa2.c +@@ -230,12 +230,8 @@ static struct dsa_switch_tree *dsa_tree_ + + static void dsa_tree_free(struct dsa_switch_tree *dst) + { +- if (dst->tag_ops) { +- if (dst->tag_ops->disconnect) +- dst->tag_ops->disconnect(dst); +- ++ if (dst->tag_ops) + dsa_tag_driver_put(dst->tag_ops); +- } + list_del(&dst->list); + kfree(dst); + } +@@ -826,17 +822,29 @@ static int dsa_switch_setup_tag_protocol + } + + connect: ++ if (tag_ops->connect) { ++ err = tag_ops->connect(ds); ++ if (err) ++ return err; ++ } ++ + if (ds->ops->connect_tag_protocol) { + err = ds->ops->connect_tag_protocol(ds, tag_ops->proto); + if (err) { + dev_err(ds->dev, + "Unable to connect to tag protocol \"%s\": %pe\n", + tag_ops->name, ERR_PTR(err)); +- return err; ++ goto disconnect; + } + } + + return 0; ++ ++disconnect: ++ if (tag_ops->disconnect) ++ tag_ops->disconnect(ds); ++ ++ return err; + } + + static int dsa_switch_setup(struct dsa_switch *ds) +@@ -1156,13 +1164,6 @@ static int dsa_tree_bind_tag_proto(struc + + dst->tag_ops = tag_ops; + +- /* Notify the new tagger about the connection to this tree */ +- if (tag_ops->connect) { +- err = tag_ops->connect(dst); +- if (err) +- goto out_revert; +- } +- + /* Notify the switches from this tree about the connection + * to the new tagger + */ +@@ -1172,16 +1173,14 @@ static int dsa_tree_bind_tag_proto(struc + goto out_disconnect; + + /* Notify the old tagger about the disconnection from this tree */ +- if (old_tag_ops->disconnect) +- old_tag_ops->disconnect(dst); ++ info.tag_ops = old_tag_ops; ++ dsa_tree_notify(dst, DSA_NOTIFIER_TAG_PROTO_DISCONNECT, &info); + + return 0; + + out_disconnect: +- /* Revert the new tagger's connection to this tree */ +- if (tag_ops->disconnect) +- tag_ops->disconnect(dst); +-out_revert: ++ info.tag_ops = tag_ops; ++ dsa_tree_notify(dst, DSA_NOTIFIER_TAG_PROTO_DISCONNECT, &info); + dst->tag_ops = old_tag_ops; + + return err; +@@ -1315,7 +1314,6 @@ static int dsa_port_parse_cpu(struct dsa + struct dsa_switch *ds = dp->ds; + struct dsa_switch_tree *dst = ds->dst; + enum dsa_tag_protocol default_proto; +- int err; + + /* Find out which protocol the switch would prefer. */ + default_proto = dsa_get_tag_protocol(dp, master); +@@ -1370,12 +1368,6 @@ static int dsa_port_parse_cpu(struct dsa + */ + dsa_tag_driver_put(tag_ops); + } else { +- if (tag_ops->connect) { +- err = tag_ops->connect(dst); +- if (err) +- return err; +- } +- + dst->tag_ops = tag_ops; + } + +--- a/net/dsa/dsa_priv.h ++++ b/net/dsa/dsa_priv.h +@@ -38,6 +38,7 @@ enum { + DSA_NOTIFIER_MTU, + DSA_NOTIFIER_TAG_PROTO, + DSA_NOTIFIER_TAG_PROTO_CONNECT, ++ DSA_NOTIFIER_TAG_PROTO_DISCONNECT, + DSA_NOTIFIER_MRP_ADD, + DSA_NOTIFIER_MRP_DEL, + DSA_NOTIFIER_MRP_ADD_RING_ROLE, +--- a/net/dsa/switch.c ++++ b/net/dsa/switch.c +@@ -616,15 +616,58 @@ static int dsa_switch_change_tag_proto(s + return 0; + } + +-static int dsa_switch_connect_tag_proto(struct dsa_switch *ds, +- struct dsa_notifier_tag_proto_info *info) ++/* We use the same cross-chip notifiers to inform both the tagger side, as well ++ * as the switch side, of connection and disconnection events. ++ * Since ds->tagger_data is owned by the tagger, it isn't a hard error if the ++ * switch side doesn't support connecting to this tagger, and therefore, the ++ * fact that we don't disconnect the tagger side doesn't constitute a memory ++ * leak: the tagger will still operate with persistent per-switch memory, just ++ * with the switch side unconnected to it. What does constitute a hard error is ++ * when the switch side supports connecting but fails. ++ */ ++static int ++dsa_switch_connect_tag_proto(struct dsa_switch *ds, ++ struct dsa_notifier_tag_proto_info *info) + { + const struct dsa_device_ops *tag_ops = info->tag_ops; ++ int err; ++ ++ /* Notify the new tagger about the connection to this switch */ ++ if (tag_ops->connect) { ++ err = tag_ops->connect(ds); ++ if (err) ++ return err; ++ } + + if (!ds->ops->connect_tag_protocol) + return -EOPNOTSUPP; + +- return ds->ops->connect_tag_protocol(ds, tag_ops->proto); ++ /* Notify the switch about the connection to the new tagger */ ++ err = ds->ops->connect_tag_protocol(ds, tag_ops->proto); ++ if (err) { ++ /* Revert the new tagger's connection to this tree */ ++ if (tag_ops->disconnect) ++ tag_ops->disconnect(ds); ++ return err; ++ } ++ ++ return 0; ++} ++ ++static int ++dsa_switch_disconnect_tag_proto(struct dsa_switch *ds, ++ struct dsa_notifier_tag_proto_info *info) ++{ ++ const struct dsa_device_ops *tag_ops = info->tag_ops; ++ ++ /* Notify the tagger about the disconnection from this switch */ ++ if (tag_ops->disconnect && ds->tagger_data) ++ tag_ops->disconnect(ds); ++ ++ /* No need to notify the switch, since it shouldn't have any ++ * resources to tear down ++ */ ++ return 0; + } + + static int dsa_switch_mrp_add(struct dsa_switch *ds, +@@ -749,6 +792,9 @@ static int dsa_switch_event(struct notif + case DSA_NOTIFIER_TAG_PROTO_CONNECT: + err = dsa_switch_connect_tag_proto(ds, info); + break; ++ case DSA_NOTIFIER_TAG_PROTO_DISCONNECT: ++ err = dsa_switch_disconnect_tag_proto(ds, info); ++ break; + case DSA_NOTIFIER_MRP_ADD: + err = dsa_switch_mrp_add(ds, info); + break; diff --git a/target/linux/generic/backport-5.15/702-v5.19-00-net-ethernet-mtk_eth_soc-add-support-for-coherent-DM.patch b/target/linux/generic/backport-5.15/702-v5.19-00-net-ethernet-mtk_eth_soc-add-support-for-coherent-DM.patch new file mode 100644 index 0000000000..3e7612b0d9 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-00-net-ethernet-mtk_eth_soc-add-support-for-coherent-DM.patch @@ -0,0 +1,327 @@ +From: Felix Fietkau +Date: Sat, 5 Feb 2022 17:59:07 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for coherent + DMA + +It improves performance by eliminating the need for a cache flush on rx and tx +In preparation for supporting WED (Wireless Ethernet Dispatch), also add a +function for disabling coherent DMA at runtime. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -840,7 +841,7 @@ static int mtk_init_fq_dma(struct mtk_et + dma_addr_t dma_addr; + int i; + +- eth->scratch_ring = dma_alloc_coherent(eth->dev, ++ eth->scratch_ring = dma_alloc_coherent(eth->dma_dev, + cnt * sizeof(struct mtk_tx_dma), + ð->phy_scratch_ring, + GFP_ATOMIC); +@@ -852,10 +853,10 @@ static int mtk_init_fq_dma(struct mtk_et + if (unlikely(!eth->scratch_head)) + return -ENOMEM; + +- dma_addr = dma_map_single(eth->dev, ++ dma_addr = dma_map_single(eth->dma_dev, + eth->scratch_head, cnt * MTK_QDMA_PAGE_SIZE, + DMA_FROM_DEVICE); +- if (unlikely(dma_mapping_error(eth->dev, dma_addr))) ++ if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) + return -ENOMEM; + + phy_ring_tail = eth->phy_scratch_ring + +@@ -909,26 +910,26 @@ static void mtk_tx_unmap(struct mtk_eth + { + if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { + if (tx_buf->flags & MTK_TX_FLAGS_SINGLE0) { +- dma_unmap_single(eth->dev, ++ dma_unmap_single(eth->dma_dev, + dma_unmap_addr(tx_buf, dma_addr0), + dma_unmap_len(tx_buf, dma_len0), + DMA_TO_DEVICE); + } else if (tx_buf->flags & MTK_TX_FLAGS_PAGE0) { +- dma_unmap_page(eth->dev, ++ dma_unmap_page(eth->dma_dev, + dma_unmap_addr(tx_buf, dma_addr0), + dma_unmap_len(tx_buf, dma_len0), + DMA_TO_DEVICE); + } + } else { + if (dma_unmap_len(tx_buf, dma_len0)) { +- dma_unmap_page(eth->dev, ++ dma_unmap_page(eth->dma_dev, + dma_unmap_addr(tx_buf, dma_addr0), + dma_unmap_len(tx_buf, dma_len0), + DMA_TO_DEVICE); + } + + if (dma_unmap_len(tx_buf, dma_len1)) { +- dma_unmap_page(eth->dev, ++ dma_unmap_page(eth->dma_dev, + dma_unmap_addr(tx_buf, dma_addr1), + dma_unmap_len(tx_buf, dma_len1), + DMA_TO_DEVICE); +@@ -1006,9 +1007,9 @@ static int mtk_tx_map(struct sk_buff *sk + if (skb_vlan_tag_present(skb)) + txd4 |= TX_DMA_INS_VLAN | skb_vlan_tag_get(skb); + +- mapped_addr = dma_map_single(eth->dev, skb->data, ++ mapped_addr = dma_map_single(eth->dma_dev, skb->data, + skb_headlen(skb), DMA_TO_DEVICE); +- if (unlikely(dma_mapping_error(eth->dev, mapped_addr))) ++ if (unlikely(dma_mapping_error(eth->dma_dev, mapped_addr))) + return -ENOMEM; + + WRITE_ONCE(itxd->txd1, mapped_addr); +@@ -1047,10 +1048,10 @@ static int mtk_tx_map(struct sk_buff *sk + + + frag_map_size = min(frag_size, MTK_TX_DMA_BUF_LEN); +- mapped_addr = skb_frag_dma_map(eth->dev, frag, offset, ++ mapped_addr = skb_frag_dma_map(eth->dma_dev, frag, offset, + frag_map_size, + DMA_TO_DEVICE); +- if (unlikely(dma_mapping_error(eth->dev, mapped_addr))) ++ if (unlikely(dma_mapping_error(eth->dma_dev, mapped_addr))) + goto err_dma; + + if (i == nr_frags - 1 && +@@ -1331,18 +1332,18 @@ static int mtk_poll_rx(struct napi_struc + netdev->stats.rx_dropped++; + goto release_desc; + } +- dma_addr = dma_map_single(eth->dev, ++ dma_addr = dma_map_single(eth->dma_dev, + new_data + NET_SKB_PAD + + eth->ip_align, + ring->buf_size, + DMA_FROM_DEVICE); +- if (unlikely(dma_mapping_error(eth->dev, dma_addr))) { ++ if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) { + skb_free_frag(new_data); + netdev->stats.rx_dropped++; + goto release_desc; + } + +- dma_unmap_single(eth->dev, trxd.rxd1, ++ dma_unmap_single(eth->dma_dev, trxd.rxd1, + ring->buf_size, DMA_FROM_DEVICE); + + /* receive data */ +@@ -1615,7 +1616,7 @@ static int mtk_tx_alloc(struct mtk_eth * + if (!ring->buf) + goto no_tx_mem; + +- ring->dma = dma_alloc_coherent(eth->dev, MTK_DMA_SIZE * sz, ++ ring->dma = dma_alloc_coherent(eth->dma_dev, MTK_DMA_SIZE * sz, + &ring->phys, GFP_ATOMIC); + if (!ring->dma) + goto no_tx_mem; +@@ -1633,7 +1634,7 @@ static int mtk_tx_alloc(struct mtk_eth * + * descriptors in ring->dma_pdma. + */ + if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { +- ring->dma_pdma = dma_alloc_coherent(eth->dev, MTK_DMA_SIZE * sz, ++ ring->dma_pdma = dma_alloc_coherent(eth->dma_dev, MTK_DMA_SIZE * sz, + &ring->phys_pdma, + GFP_ATOMIC); + if (!ring->dma_pdma) +@@ -1692,7 +1693,7 @@ static void mtk_tx_clean(struct mtk_eth + } + + if (ring->dma) { +- dma_free_coherent(eth->dev, ++ dma_free_coherent(eth->dma_dev, + MTK_DMA_SIZE * sizeof(*ring->dma), + ring->dma, + ring->phys); +@@ -1700,7 +1701,7 @@ static void mtk_tx_clean(struct mtk_eth + } + + if (ring->dma_pdma) { +- dma_free_coherent(eth->dev, ++ dma_free_coherent(eth->dma_dev, + MTK_DMA_SIZE * sizeof(*ring->dma_pdma), + ring->dma_pdma, + ring->phys_pdma); +@@ -1748,18 +1749,18 @@ static int mtk_rx_alloc(struct mtk_eth * + return -ENOMEM; + } + +- ring->dma = dma_alloc_coherent(eth->dev, ++ ring->dma = dma_alloc_coherent(eth->dma_dev, + rx_dma_size * sizeof(*ring->dma), + &ring->phys, GFP_ATOMIC); + if (!ring->dma) + return -ENOMEM; + + for (i = 0; i < rx_dma_size; i++) { +- dma_addr_t dma_addr = dma_map_single(eth->dev, ++ dma_addr_t dma_addr = dma_map_single(eth->dma_dev, + ring->data[i] + NET_SKB_PAD + eth->ip_align, + ring->buf_size, + DMA_FROM_DEVICE); +- if (unlikely(dma_mapping_error(eth->dev, dma_addr))) ++ if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) + return -ENOMEM; + ring->dma[i].rxd1 = (unsigned int)dma_addr; + +@@ -1795,7 +1796,7 @@ static void mtk_rx_clean(struct mtk_eth + continue; + if (!ring->dma[i].rxd1) + continue; +- dma_unmap_single(eth->dev, ++ dma_unmap_single(eth->dma_dev, + ring->dma[i].rxd1, + ring->buf_size, + DMA_FROM_DEVICE); +@@ -1806,7 +1807,7 @@ static void mtk_rx_clean(struct mtk_eth + } + + if (ring->dma) { +- dma_free_coherent(eth->dev, ++ dma_free_coherent(eth->dma_dev, + ring->dma_size * sizeof(*ring->dma), + ring->dma, + ring->phys); +@@ -2165,7 +2166,7 @@ static void mtk_dma_free(struct mtk_eth + if (eth->netdev[i]) + netdev_reset_queue(eth->netdev[i]); + if (eth->scratch_ring) { +- dma_free_coherent(eth->dev, ++ dma_free_coherent(eth->dma_dev, + MTK_DMA_SIZE * sizeof(struct mtk_tx_dma), + eth->scratch_ring, + eth->phy_scratch_ring); +@@ -2517,6 +2518,8 @@ static void mtk_dim_tx(struct work_struc + + static int mtk_hw_init(struct mtk_eth *eth) + { ++ u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA | ++ ETHSYS_DMA_AG_MAP_PPE; + int i, val, ret; + + if (test_and_set_bit(MTK_HW_INIT, ð->state)) +@@ -2529,6 +2532,10 @@ static int mtk_hw_init(struct mtk_eth *e + if (ret) + goto err_disable_pm; + ++ if (eth->ethsys) ++ regmap_update_bits(eth->ethsys, ETHSYS_DMA_AG_MAP, dma_mask, ++ of_dma_is_coherent(eth->dma_dev->of_node) * dma_mask); ++ + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) { + ret = device_reset(eth->dev); + if (ret) { +@@ -3075,6 +3082,35 @@ free_netdev: + return err; + } + ++void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev) ++{ ++ struct net_device *dev, *tmp; ++ LIST_HEAD(dev_list); ++ int i; ++ ++ rtnl_lock(); ++ ++ for (i = 0; i < MTK_MAC_COUNT; i++) { ++ dev = eth->netdev[i]; ++ ++ if (!dev || !(dev->flags & IFF_UP)) ++ continue; ++ ++ list_add_tail(&dev->close_list, &dev_list); ++ } ++ ++ dev_close_many(&dev_list, false); ++ ++ eth->dma_dev = dma_dev; ++ ++ list_for_each_entry_safe(dev, tmp, &dev_list, close_list) { ++ list_del_init(&dev->close_list); ++ dev_open(dev, NULL); ++ } ++ ++ rtnl_unlock(); ++} ++ + static int mtk_probe(struct platform_device *pdev) + { + struct device_node *mac_np; +@@ -3088,6 +3124,7 @@ static int mtk_probe(struct platform_dev + eth->soc = of_device_get_match_data(&pdev->dev); + + eth->dev = &pdev->dev; ++ eth->dma_dev = &pdev->dev; + eth->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(eth->base)) + return PTR_ERR(eth->base); +@@ -3136,6 +3173,16 @@ static int mtk_probe(struct platform_dev + } + } + ++ if (of_dma_is_coherent(pdev->dev.of_node)) { ++ struct regmap *cci; ++ ++ cci = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, ++ "mediatek,cci-control"); ++ /* enable CPU/bus coherency */ ++ if (!IS_ERR(cci)) ++ regmap_write(cci, 0, 3); ++ } ++ + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SGMII)) { + eth->sgmii = devm_kzalloc(eth->dev, sizeof(*eth->sgmii), + GFP_KERNEL); +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -463,6 +463,12 @@ + #define RSTCTRL_FE BIT(6) + #define RSTCTRL_PPE BIT(31) + ++/* ethernet dma channel agent map */ ++#define ETHSYS_DMA_AG_MAP 0x408 ++#define ETHSYS_DMA_AG_MAP_PDMA BIT(0) ++#define ETHSYS_DMA_AG_MAP_QDMA BIT(1) ++#define ETHSYS_DMA_AG_MAP_PPE BIT(2) ++ + /* SGMII subsystem config registers */ + /* Register to auto-negotiation restart */ + #define SGMSYS_PCS_CONTROL_1 0x0 +@@ -880,6 +886,7 @@ struct mtk_sgmii { + /* struct mtk_eth - This is the main datasructure for holding the state + * of the driver + * @dev: The device pointer ++ * @dev: The device pointer used for dma mapping/alloc + * @base: The mapped register i/o base + * @page_lock: Make sure that register operations are atomic + * @tx_irq__lock: Make sure that IRQ register operations are atomic +@@ -923,6 +930,7 @@ struct mtk_sgmii { + + struct mtk_eth { + struct device *dev; ++ struct device *dma_dev; + void __iomem *base; + spinlock_t page_lock; + spinlock_t tx_irq_lock; +@@ -1021,6 +1029,7 @@ int mtk_gmac_rgmii_path_setup(struct mtk + int mtk_eth_offload_init(struct mtk_eth *eth); + int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type, + void *type_data); ++void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev); + + + #endif /* MTK_ETH_H */ diff --git a/target/linux/generic/backport-5.15/702-v5.19-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch b/target/linux/generic/backport-5.15/702-v5.19-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch new file mode 100644 index 0000000000..9f2512a1d0 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch @@ -0,0 +1,30 @@ +From: Felix Fietkau +Date: Mon, 7 Feb 2022 10:27:22 +0100 +Subject: [PATCH] arm64: dts: mediatek: mt7622: add support for coherent + DMA + +It improves performance by eliminating the need for a cache flush on rx and tx + +Signed-off-by: Felix Fietkau +--- + +--- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi ++++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi +@@ -357,7 +357,7 @@ + }; + + cci_control2: slave-if@5000 { +- compatible = "arm,cci-400-ctrl-if"; ++ compatible = "arm,cci-400-ctrl-if", "syscon"; + interface-type = "ace"; + reg = <0x5000 0x1000>; + }; +@@ -938,6 +938,8 @@ + power-domains = <&scpsys MT7622_POWER_DOMAIN_ETHSYS>; + mediatek,ethsys = <ðsys>; + mediatek,sgmiisys = <&sgmiisys>; ++ mediatek,cci-control = <&cci_control2>; ++ dma-coherent; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; diff --git a/target/linux/generic/backport-5.15/702-v5.19-02-net-ethernet-mtk_eth_soc-add-support-for-Wireless-Et.patch b/target/linux/generic/backport-5.15/702-v5.19-02-net-ethernet-mtk_eth_soc-add-support-for-Wireless-Et.patch new file mode 100644 index 0000000000..ba72a796ee --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-02-net-ethernet-mtk_eth_soc-add-support-for-Wireless-Et.patch @@ -0,0 +1,1679 @@ +From: Felix Fietkau +Date: Sat, 5 Feb 2022 17:56:08 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for Wireless + Ethernet Dispatch (WED) + +The Wireless Ethernet Dispatch subsystem on the MT7622 SoC can be +configured to intercept and handle access to the DMA queues and +PCIe interrupts for a MT7615/MT7915 wireless card. +It can manage the internal WDMA (Wireless DMA) controller, which allows +ethernet packets to be passed from the packet switch engine (PSE) to the +wireless card, bypassing the CPU entirely. +This can be used to implement hardware flow offloading from ethernet to +WLAN. + +Signed-off-by: Felix Fietkau +--- + create mode 100644 drivers/net/ethernet/mediatek/mtk_wed.c + create mode 100644 drivers/net/ethernet/mediatek/mtk_wed.h + create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_debugfs.c + create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_ops.c + create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_regs.h + create mode 100644 include/linux/soc/mediatek/mtk_wed.h + +--- a/drivers/net/ethernet/mediatek/Kconfig ++++ b/drivers/net/ethernet/mediatek/Kconfig +@@ -7,6 +7,10 @@ config NET_VENDOR_MEDIATEK + + if NET_VENDOR_MEDIATEK + ++config NET_MEDIATEK_SOC_WED ++ depends on ARCH_MEDIATEK || COMPILE_TEST ++ def_bool NET_MEDIATEK_SOC != n ++ + config NET_MEDIATEK_SOC + tristate "MediaTek SoC Gigabit Ethernet support" + depends on NET_DSA || !NET_DSA +--- a/drivers/net/ethernet/mediatek/Makefile ++++ b/drivers/net/ethernet/mediatek/Makefile +@@ -5,4 +5,9 @@ + + obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o + mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_ppe_offload.o ++mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed.o ++ifdef CONFIG_DEBUG_FS ++mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_debugfs.o ++endif ++obj-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_ops.o + obj-$(CONFIG_NET_MEDIATEK_STAR_EMAC) += mtk_star_emac.o +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -24,6 +24,7 @@ + #include + + #include "mtk_eth_soc.h" ++#include "mtk_wed.h" + + static int mtk_msg_level = -1; + module_param_named(msg_level, mtk_msg_level, int, 0); +@@ -3205,6 +3206,22 @@ static int mtk_probe(struct platform_dev + } + } + ++ for (i = 0;; i++) { ++ struct device_node *np = of_parse_phandle(pdev->dev.of_node, ++ "mediatek,wed", i); ++ static const u32 wdma_regs[] = { ++ MTK_WDMA0_BASE, ++ MTK_WDMA1_BASE ++ }; ++ void __iomem *wdma; ++ ++ if (!np || i >= ARRAY_SIZE(wdma_regs)) ++ break; ++ ++ wdma = eth->base + wdma_regs[i]; ++ mtk_wed_add_hw(np, eth, wdma, i); ++ } ++ + for (i = 0; i < 3; i++) { + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT) && i > 0) + eth->irq[i] = eth->irq[0]; +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -295,6 +295,9 @@ + #define MTK_GDM1_TX_GPCNT 0x2438 + #define MTK_STAT_OFFSET 0x40 + ++#define MTK_WDMA0_BASE 0x2800 ++#define MTK_WDMA1_BASE 0x2c00 ++ + /* QDMA descriptor txd4 */ + #define TX_DMA_CHKSUM (0x7 << 29) + #define TX_DMA_TSO BIT(28) +--- /dev/null ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -0,0 +1,875 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* Copyright (C) 2021 Felix Fietkau */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "mtk_eth_soc.h" ++#include "mtk_wed_regs.h" ++#include "mtk_wed.h" ++#include "mtk_ppe.h" ++ ++#define MTK_PCIE_BASE(n) (0x1a143000 + (n) * 0x2000) ++ ++#define MTK_WED_PKT_SIZE 1900 ++#define MTK_WED_BUF_SIZE 2048 ++#define MTK_WED_BUF_PER_PAGE (PAGE_SIZE / 2048) ++ ++#define MTK_WED_TX_RING_SIZE 2048 ++#define MTK_WED_WDMA_RING_SIZE 1024 ++ ++static struct mtk_wed_hw *hw_list[2]; ++static DEFINE_MUTEX(hw_lock); ++ ++static void ++wed_m32(struct mtk_wed_device *dev, u32 reg, u32 mask, u32 val) ++{ ++ regmap_update_bits(dev->hw->regs, reg, mask | val, val); ++} ++ ++static void ++wed_set(struct mtk_wed_device *dev, u32 reg, u32 mask) ++{ ++ return wed_m32(dev, reg, 0, mask); ++} ++ ++static void ++wed_clr(struct mtk_wed_device *dev, u32 reg, u32 mask) ++{ ++ return wed_m32(dev, reg, mask, 0); ++} ++ ++static void ++wdma_m32(struct mtk_wed_device *dev, u32 reg, u32 mask, u32 val) ++{ ++ wdma_w32(dev, reg, (wdma_r32(dev, reg) & ~mask) | val); ++} ++ ++static void ++wdma_set(struct mtk_wed_device *dev, u32 reg, u32 mask) ++{ ++ wdma_m32(dev, reg, 0, mask); ++} ++ ++static u32 ++mtk_wed_read_reset(struct mtk_wed_device *dev) ++{ ++ return wed_r32(dev, MTK_WED_RESET); ++} ++ ++static void ++mtk_wed_reset(struct mtk_wed_device *dev, u32 mask) ++{ ++ u32 status; ++ ++ wed_w32(dev, MTK_WED_RESET, mask); ++ if (readx_poll_timeout(mtk_wed_read_reset, dev, status, ++ !(status & mask), 0, 1000)) ++ WARN_ON_ONCE(1); ++} ++ ++static struct mtk_wed_hw * ++mtk_wed_assign(struct mtk_wed_device *dev) ++{ ++ struct mtk_wed_hw *hw; ++ ++ hw = hw_list[pci_domain_nr(dev->wlan.pci_dev->bus)]; ++ if (!hw || hw->wed_dev) ++ return NULL; ++ ++ hw->wed_dev = dev; ++ return hw; ++} ++ ++static int ++mtk_wed_buffer_alloc(struct mtk_wed_device *dev) ++{ ++ struct mtk_wdma_desc *desc; ++ dma_addr_t desc_phys; ++ void **page_list; ++ int token = dev->wlan.token_start; ++ int ring_size; ++ int n_pages; ++ int i, page_idx; ++ ++ ring_size = dev->wlan.nbuf & ~(MTK_WED_BUF_PER_PAGE - 1); ++ n_pages = ring_size / MTK_WED_BUF_PER_PAGE; ++ ++ page_list = kcalloc(n_pages, sizeof(*page_list), GFP_KERNEL); ++ if (!page_list) ++ return -ENOMEM; ++ ++ dev->buf_ring.size = ring_size; ++ dev->buf_ring.pages = page_list; ++ ++ desc = dma_alloc_coherent(dev->hw->dev, ring_size * sizeof(*desc), ++ &desc_phys, GFP_KERNEL); ++ if (!desc) ++ return -ENOMEM; ++ ++ dev->buf_ring.desc = desc; ++ dev->buf_ring.desc_phys = desc_phys; ++ ++ for (i = 0, page_idx = 0; i < ring_size; i += MTK_WED_BUF_PER_PAGE) { ++ dma_addr_t page_phys, buf_phys; ++ struct page *page; ++ void *buf; ++ int s; ++ ++ page = __dev_alloc_pages(GFP_KERNEL, 0); ++ if (!page) ++ return -ENOMEM; ++ ++ page_phys = dma_map_page(dev->hw->dev, page, 0, PAGE_SIZE, ++ DMA_BIDIRECTIONAL); ++ if (dma_mapping_error(dev->hw->dev, page_phys)) { ++ __free_page(page); ++ return -ENOMEM; ++ } ++ ++ page_list[page_idx++] = page; ++ dma_sync_single_for_cpu(dev->hw->dev, page_phys, PAGE_SIZE, ++ DMA_BIDIRECTIONAL); ++ ++ buf = page_to_virt(page); ++ buf_phys = page_phys; ++ ++ for (s = 0; s < MTK_WED_BUF_PER_PAGE; s++) { ++ u32 txd_size; ++ ++ txd_size = dev->wlan.init_buf(buf, buf_phys, token++); ++ ++ desc->buf0 = buf_phys; ++ desc->buf1 = buf_phys + txd_size; ++ desc->ctrl = FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN0, ++ txd_size) | ++ FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN1, ++ MTK_WED_BUF_SIZE - txd_size) | ++ MTK_WDMA_DESC_CTRL_LAST_SEG1; ++ desc->info = 0; ++ desc++; ++ ++ buf += MTK_WED_BUF_SIZE; ++ buf_phys += MTK_WED_BUF_SIZE; ++ } ++ ++ dma_sync_single_for_device(dev->hw->dev, page_phys, PAGE_SIZE, ++ DMA_BIDIRECTIONAL); ++ } ++ ++ return 0; ++} ++ ++static void ++mtk_wed_free_buffer(struct mtk_wed_device *dev) ++{ ++ struct mtk_wdma_desc *desc = dev->buf_ring.desc; ++ void **page_list = dev->buf_ring.pages; ++ int page_idx; ++ int i; ++ ++ if (!page_list) ++ return; ++ ++ if (!desc) ++ goto free_pagelist; ++ ++ for (i = 0, page_idx = 0; i < dev->buf_ring.size; i += MTK_WED_BUF_PER_PAGE) { ++ void *page = page_list[page_idx++]; ++ ++ if (!page) ++ break; ++ ++ dma_unmap_page(dev->hw->dev, desc[i].buf0, ++ PAGE_SIZE, DMA_BIDIRECTIONAL); ++ __free_page(page); ++ } ++ ++ dma_free_coherent(dev->hw->dev, dev->buf_ring.size * sizeof(*desc), ++ desc, dev->buf_ring.desc_phys); ++ ++free_pagelist: ++ kfree(page_list); ++} ++ ++static void ++mtk_wed_free_ring(struct mtk_wed_device *dev, struct mtk_wed_ring *ring) ++{ ++ if (!ring->desc) ++ return; ++ ++ dma_free_coherent(dev->hw->dev, ring->size * sizeof(*ring->desc), ++ ring->desc, ring->desc_phys); ++} ++ ++static void ++mtk_wed_free_tx_rings(struct mtk_wed_device *dev) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(dev->tx_ring); i++) ++ mtk_wed_free_ring(dev, &dev->tx_ring[i]); ++ for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) ++ mtk_wed_free_ring(dev, &dev->tx_wdma[i]); ++} ++ ++static void ++mtk_wed_set_ext_int(struct mtk_wed_device *dev, bool en) ++{ ++ u32 mask = MTK_WED_EXT_INT_STATUS_ERROR_MASK; ++ ++ if (!dev->hw->num_flows) ++ mask &= ~MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD; ++ ++ wed_w32(dev, MTK_WED_EXT_INT_MASK, en ? mask : 0); ++ wed_r32(dev, MTK_WED_EXT_INT_MASK); ++} ++ ++static void ++mtk_wed_stop(struct mtk_wed_device *dev) ++{ ++ regmap_write(dev->hw->mirror, dev->hw->index * 4, 0); ++ mtk_wed_set_ext_int(dev, false); ++ ++ wed_clr(dev, MTK_WED_CTRL, ++ MTK_WED_CTRL_WDMA_INT_AGENT_EN | ++ MTK_WED_CTRL_WPDMA_INT_AGENT_EN | ++ MTK_WED_CTRL_WED_TX_BM_EN | ++ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); ++ wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, 0); ++ wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, 0); ++ wdma_w32(dev, MTK_WDMA_INT_MASK, 0); ++ wdma_w32(dev, MTK_WDMA_INT_GRP2, 0); ++ wed_w32(dev, MTK_WED_WPDMA_INT_MASK, 0); ++ ++ wed_clr(dev, MTK_WED_GLO_CFG, ++ MTK_WED_GLO_CFG_TX_DMA_EN | ++ MTK_WED_GLO_CFG_RX_DMA_EN); ++ wed_clr(dev, MTK_WED_WPDMA_GLO_CFG, ++ MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN | ++ MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN); ++ wed_clr(dev, MTK_WED_WDMA_GLO_CFG, ++ MTK_WED_WDMA_GLO_CFG_RX_DRV_EN); ++} ++ ++static void ++mtk_wed_detach(struct mtk_wed_device *dev) ++{ ++ struct device_node *wlan_node = dev->wlan.pci_dev->dev.of_node; ++ struct mtk_wed_hw *hw = dev->hw; ++ ++ mutex_lock(&hw_lock); ++ ++ mtk_wed_stop(dev); ++ ++ wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX); ++ wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); ++ ++ mtk_wed_reset(dev, MTK_WED_RESET_WED); ++ ++ mtk_wed_free_buffer(dev); ++ mtk_wed_free_tx_rings(dev); ++ ++ if (of_dma_is_coherent(wlan_node)) ++ regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP, ++ BIT(hw->index), BIT(hw->index)); ++ ++ if (!hw_list[!hw->index]->wed_dev && ++ hw->eth->dma_dev != hw->eth->dev) ++ mtk_eth_set_dma_device(hw->eth, hw->eth->dev); ++ ++ memset(dev, 0, sizeof(*dev)); ++ module_put(THIS_MODULE); ++ ++ hw->wed_dev = NULL; ++ mutex_unlock(&hw_lock); ++} ++ ++static void ++mtk_wed_hw_init_early(struct mtk_wed_device *dev) ++{ ++ u32 mask, set; ++ u32 offset; ++ ++ mtk_wed_stop(dev); ++ mtk_wed_reset(dev, MTK_WED_RESET_WED); ++ ++ mask = MTK_WED_WDMA_GLO_CFG_BT_SIZE | ++ MTK_WED_WDMA_GLO_CFG_DYNAMIC_DMAD_RECYCLE | ++ MTK_WED_WDMA_GLO_CFG_RX_DIS_FSM_AUTO_IDLE; ++ set = FIELD_PREP(MTK_WED_WDMA_GLO_CFG_BT_SIZE, 2) | ++ MTK_WED_WDMA_GLO_CFG_DYNAMIC_SKIP_DMAD_PREP | ++ MTK_WED_WDMA_GLO_CFG_IDLE_DMAD_SUPPLY; ++ wed_m32(dev, MTK_WED_WDMA_GLO_CFG, mask, set); ++ ++ wdma_set(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_RX_INFO_PRERES); ++ ++ offset = dev->hw->index ? 0x04000400 : 0; ++ wed_w32(dev, MTK_WED_WDMA_OFFSET0, 0x2a042a20 + offset); ++ wed_w32(dev, MTK_WED_WDMA_OFFSET1, 0x29002800 + offset); ++ ++ wed_w32(dev, MTK_WED_PCIE_CFG_BASE, MTK_PCIE_BASE(dev->hw->index)); ++ wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_phys); ++} ++ ++static void ++mtk_wed_hw_init(struct mtk_wed_device *dev) ++{ ++ if (dev->init_done) ++ return; ++ ++ dev->init_done = true; ++ mtk_wed_set_ext_int(dev, false); ++ wed_w32(dev, MTK_WED_TX_BM_CTRL, ++ MTK_WED_TX_BM_CTRL_PAUSE | ++ FIELD_PREP(MTK_WED_TX_BM_CTRL_VLD_GRP_NUM, ++ dev->buf_ring.size / 128) | ++ FIELD_PREP(MTK_WED_TX_BM_CTRL_RSV_GRP_NUM, ++ MTK_WED_TX_RING_SIZE / 256)); ++ ++ wed_w32(dev, MTK_WED_TX_BM_BASE, dev->buf_ring.desc_phys); ++ ++ wed_w32(dev, MTK_WED_TX_BM_TKID, ++ FIELD_PREP(MTK_WED_TX_BM_TKID_START, ++ dev->wlan.token_start) | ++ FIELD_PREP(MTK_WED_TX_BM_TKID_END, ++ dev->wlan.token_start + dev->wlan.nbuf - 1)); ++ ++ wed_w32(dev, MTK_WED_TX_BM_BUF_LEN, MTK_WED_PKT_SIZE); ++ ++ wed_w32(dev, MTK_WED_TX_BM_DYN_THR, ++ FIELD_PREP(MTK_WED_TX_BM_DYN_THR_LO, 1) | ++ MTK_WED_TX_BM_DYN_THR_HI); ++ ++ mtk_wed_reset(dev, MTK_WED_RESET_TX_BM); ++ ++ wed_set(dev, MTK_WED_CTRL, ++ MTK_WED_CTRL_WED_TX_BM_EN | ++ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); ++ ++ wed_clr(dev, MTK_WED_TX_BM_CTRL, MTK_WED_TX_BM_CTRL_PAUSE); ++} ++ ++static void ++mtk_wed_ring_reset(struct mtk_wdma_desc *desc, int size) ++{ ++ int i; ++ ++ for (i = 0; i < size; i++) { ++ desc[i].buf0 = 0; ++ desc[i].ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE); ++ desc[i].buf1 = 0; ++ desc[i].info = 0; ++ } ++} ++ ++static u32 ++mtk_wed_check_busy(struct mtk_wed_device *dev) ++{ ++ if (wed_r32(dev, MTK_WED_GLO_CFG) & MTK_WED_GLO_CFG_TX_DMA_BUSY) ++ return true; ++ ++ if (wed_r32(dev, MTK_WED_WPDMA_GLO_CFG) & ++ MTK_WED_WPDMA_GLO_CFG_TX_DRV_BUSY) ++ return true; ++ ++ if (wed_r32(dev, MTK_WED_CTRL) & MTK_WED_CTRL_WDMA_INT_AGENT_BUSY) ++ return true; ++ ++ if (wed_r32(dev, MTK_WED_WDMA_GLO_CFG) & ++ MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY) ++ return true; ++ ++ if (wdma_r32(dev, MTK_WDMA_GLO_CFG) & ++ MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY) ++ return true; ++ ++ if (wed_r32(dev, MTK_WED_CTRL) & ++ (MTK_WED_CTRL_WED_TX_BM_BUSY | MTK_WED_CTRL_WED_TX_FREE_AGENT_BUSY)) ++ return true; ++ ++ return false; ++} ++ ++static int ++mtk_wed_poll_busy(struct mtk_wed_device *dev) ++{ ++ int sleep = 15000; ++ int timeout = 100 * sleep; ++ u32 val; ++ ++ return read_poll_timeout(mtk_wed_check_busy, val, !val, sleep, ++ timeout, false, dev); ++} ++ ++static void ++mtk_wed_reset_dma(struct mtk_wed_device *dev) ++{ ++ bool busy = false; ++ u32 val; ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(dev->tx_ring); i++) { ++ struct mtk_wdma_desc *desc = dev->tx_ring[i].desc; ++ ++ if (!desc) ++ continue; ++ ++ mtk_wed_ring_reset(desc, MTK_WED_TX_RING_SIZE); ++ } ++ ++ if (mtk_wed_poll_busy(dev)) ++ busy = mtk_wed_check_busy(dev); ++ ++ if (busy) { ++ mtk_wed_reset(dev, MTK_WED_RESET_WED_TX_DMA); ++ } else { ++ wed_w32(dev, MTK_WED_RESET_IDX, ++ MTK_WED_RESET_IDX_TX | ++ MTK_WED_RESET_IDX_RX); ++ wed_w32(dev, MTK_WED_RESET_IDX, 0); ++ } ++ ++ wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX); ++ wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); ++ ++ if (busy) { ++ mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT); ++ mtk_wed_reset(dev, MTK_WED_RESET_WDMA_RX_DRV); ++ } else { ++ wed_w32(dev, MTK_WED_WDMA_RESET_IDX, ++ MTK_WED_WDMA_RESET_IDX_RX | MTK_WED_WDMA_RESET_IDX_DRV); ++ wed_w32(dev, MTK_WED_WDMA_RESET_IDX, 0); ++ ++ wed_set(dev, MTK_WED_WDMA_GLO_CFG, ++ MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE); ++ ++ wed_clr(dev, MTK_WED_WDMA_GLO_CFG, ++ MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE); ++ } ++ ++ for (i = 0; i < 100; i++) { ++ val = wed_r32(dev, MTK_WED_TX_BM_INTF); ++ if (FIELD_GET(MTK_WED_TX_BM_INTF_TKFIFO_FDEP, val) == 0x40) ++ break; ++ } ++ ++ mtk_wed_reset(dev, MTK_WED_RESET_TX_FREE_AGENT); ++ mtk_wed_reset(dev, MTK_WED_RESET_TX_BM); ++ ++ if (busy) { ++ mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT); ++ mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_TX_DRV); ++ mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_RX_DRV); ++ } else { ++ wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, ++ MTK_WED_WPDMA_RESET_IDX_TX | ++ MTK_WED_WPDMA_RESET_IDX_RX); ++ wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0); ++ } ++ ++} ++ ++static int ++mtk_wed_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring, ++ int size) ++{ ++ ring->desc = dma_alloc_coherent(dev->hw->dev, ++ size * sizeof(*ring->desc), ++ &ring->desc_phys, GFP_KERNEL); ++ if (!ring->desc) ++ return -ENOMEM; ++ ++ ring->size = size; ++ mtk_wed_ring_reset(ring->desc, size); ++ ++ return 0; ++} ++ ++static int ++mtk_wed_wdma_ring_setup(struct mtk_wed_device *dev, int idx, int size) ++{ ++ struct mtk_wed_ring *wdma = &dev->tx_wdma[idx]; ++ ++ if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE)) ++ return -ENOMEM; ++ ++ wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE, ++ wdma->desc_phys); ++ wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_COUNT, ++ size); ++ wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0); ++ ++ wed_w32(dev, MTK_WED_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE, ++ wdma->desc_phys); ++ wed_w32(dev, MTK_WED_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_COUNT, ++ size); ++ ++ return 0; ++} ++ ++static void ++mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask) ++{ ++ u32 wdma_mask; ++ u32 val; ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) ++ if (!dev->tx_wdma[i].desc) ++ mtk_wed_wdma_ring_setup(dev, i, 16); ++ ++ wdma_mask = FIELD_PREP(MTK_WDMA_INT_MASK_RX_DONE, GENMASK(1, 0)); ++ ++ mtk_wed_hw_init(dev); ++ ++ wed_set(dev, MTK_WED_CTRL, ++ MTK_WED_CTRL_WDMA_INT_AGENT_EN | ++ MTK_WED_CTRL_WPDMA_INT_AGENT_EN | ++ MTK_WED_CTRL_WED_TX_BM_EN | ++ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); ++ ++ wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, MTK_WED_PCIE_INT_TRIGGER_STATUS); ++ ++ wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, ++ MTK_WED_WPDMA_INT_TRIGGER_RX_DONE | ++ MTK_WED_WPDMA_INT_TRIGGER_TX_DONE); ++ ++ wed_set(dev, MTK_WED_WPDMA_INT_CTRL, ++ MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV); ++ ++ wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, wdma_mask); ++ wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask); ++ ++ wdma_w32(dev, MTK_WDMA_INT_MASK, wdma_mask); ++ wdma_w32(dev, MTK_WDMA_INT_GRP2, wdma_mask); ++ ++ wed_w32(dev, MTK_WED_WPDMA_INT_MASK, irq_mask); ++ wed_w32(dev, MTK_WED_INT_MASK, irq_mask); ++ ++ wed_set(dev, MTK_WED_GLO_CFG, ++ MTK_WED_GLO_CFG_TX_DMA_EN | ++ MTK_WED_GLO_CFG_RX_DMA_EN); ++ wed_set(dev, MTK_WED_WPDMA_GLO_CFG, ++ MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN | ++ MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN); ++ wed_set(dev, MTK_WED_WDMA_GLO_CFG, ++ MTK_WED_WDMA_GLO_CFG_RX_DRV_EN); ++ ++ mtk_wed_set_ext_int(dev, true); ++ val = dev->wlan.wpdma_phys | ++ MTK_PCIE_MIRROR_MAP_EN | ++ FIELD_PREP(MTK_PCIE_MIRROR_MAP_WED_ID, dev->hw->index); ++ ++ if (dev->hw->index) ++ val |= BIT(1); ++ val |= BIT(0); ++ regmap_write(dev->hw->mirror, dev->hw->index * 4, val); ++ ++ dev->running = true; ++} ++ ++static int ++mtk_wed_attach(struct mtk_wed_device *dev) ++ __releases(RCU) ++{ ++ struct mtk_wed_hw *hw; ++ int ret = 0; ++ ++ RCU_LOCKDEP_WARN(!rcu_read_lock_held(), ++ "mtk_wed_attach without holding the RCU read lock"); ++ ++ if (pci_domain_nr(dev->wlan.pci_dev->bus) > 1 || ++ !try_module_get(THIS_MODULE)) ++ ret = -ENODEV; ++ ++ rcu_read_unlock(); ++ ++ if (ret) ++ return ret; ++ ++ mutex_lock(&hw_lock); ++ ++ hw = mtk_wed_assign(dev); ++ if (!hw) { ++ module_put(THIS_MODULE); ++ ret = -ENODEV; ++ goto out; ++ } ++ ++ dev_info(&dev->wlan.pci_dev->dev, "attaching wed device %d\n", hw->index); ++ ++ dev->hw = hw; ++ dev->dev = hw->dev; ++ dev->irq = hw->irq; ++ dev->wdma_idx = hw->index; ++ ++ if (hw->eth->dma_dev == hw->eth->dev && ++ of_dma_is_coherent(hw->eth->dev->of_node)) ++ mtk_eth_set_dma_device(hw->eth, hw->dev); ++ ++ ret = mtk_wed_buffer_alloc(dev); ++ if (ret) { ++ mtk_wed_detach(dev); ++ goto out; ++ } ++ ++ mtk_wed_hw_init_early(dev); ++ regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP, BIT(hw->index), 0); ++ ++out: ++ mutex_unlock(&hw_lock); ++ ++ return ret; ++} ++ ++static int ++mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs) ++{ ++ struct mtk_wed_ring *ring = &dev->tx_ring[idx]; ++ ++ /* ++ * Tx ring redirection: ++ * Instead of configuring the WLAN PDMA TX ring directly, the WLAN ++ * driver allocated DMA ring gets configured into WED MTK_WED_RING_TX(n) ++ * registers. ++ * ++ * WED driver posts its own DMA ring as WLAN PDMA TX and configures it ++ * into MTK_WED_WPDMA_RING_TX(n) registers. ++ * It gets filled with packets picked up from WED TX ring and from ++ * WDMA RX. ++ */ ++ ++ BUG_ON(idx > ARRAY_SIZE(dev->tx_ring)); ++ ++ if (mtk_wed_ring_alloc(dev, ring, MTK_WED_TX_RING_SIZE)) ++ return -ENOMEM; ++ ++ if (mtk_wed_wdma_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) ++ return -ENOMEM; ++ ++ ring->reg_base = MTK_WED_RING_TX(idx); ++ ring->wpdma = regs; ++ ++ /* WED -> WPDMA */ ++ wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys); ++ wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_COUNT, MTK_WED_TX_RING_SIZE); ++ wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_CPU_IDX, 0); ++ ++ wed_w32(dev, MTK_WED_WPDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE, ++ ring->desc_phys); ++ wed_w32(dev, MTK_WED_WPDMA_RING_TX(idx) + MTK_WED_RING_OFS_COUNT, ++ MTK_WED_TX_RING_SIZE); ++ wed_w32(dev, MTK_WED_WPDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0); ++ ++ return 0; ++} ++ ++static int ++mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs) ++{ ++ struct mtk_wed_ring *ring = &dev->txfree_ring; ++ int i; ++ ++ /* ++ * For txfree event handling, the same DMA ring is shared between WED ++ * and WLAN. The WLAN driver accesses the ring index registers through ++ * WED ++ */ ++ ring->reg_base = MTK_WED_RING_RX(1); ++ ring->wpdma = regs; ++ ++ for (i = 0; i < 12; i += 4) { ++ u32 val = readl(regs + i); ++ ++ wed_w32(dev, MTK_WED_RING_RX(1) + i, val); ++ wed_w32(dev, MTK_WED_WPDMA_RING_RX(1) + i, val); ++ } ++ ++ return 0; ++} ++ ++static u32 ++mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask) ++{ ++ u32 val; ++ ++ val = wed_r32(dev, MTK_WED_EXT_INT_STATUS); ++ wed_w32(dev, MTK_WED_EXT_INT_STATUS, val); ++ val &= MTK_WED_EXT_INT_STATUS_ERROR_MASK; ++ if (!dev->hw->num_flows) ++ val &= ~MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD; ++ if (val && net_ratelimit()) ++ pr_err("mtk_wed%d: error status=%08x\n", dev->hw->index, val); ++ ++ val = wed_r32(dev, MTK_WED_INT_STATUS); ++ val &= mask; ++ wed_w32(dev, MTK_WED_INT_STATUS, val); /* ACK */ ++ ++ return val; ++} ++ ++static void ++mtk_wed_irq_set_mask(struct mtk_wed_device *dev, u32 mask) ++{ ++ if (!dev->running) ++ return; ++ ++ mtk_wed_set_ext_int(dev, !!mask); ++ wed_w32(dev, MTK_WED_INT_MASK, mask); ++} ++ ++int mtk_wed_flow_add(int index) ++{ ++ struct mtk_wed_hw *hw = hw_list[index]; ++ int ret; ++ ++ if (!hw || !hw->wed_dev) ++ return -ENODEV; ++ ++ if (hw->num_flows) { ++ hw->num_flows++; ++ return 0; ++ } ++ ++ mutex_lock(&hw_lock); ++ if (!hw->wed_dev) { ++ ret = -ENODEV; ++ goto out; ++ } ++ ++ ret = hw->wed_dev->wlan.offload_enable(hw->wed_dev); ++ if (!ret) ++ hw->num_flows++; ++ mtk_wed_set_ext_int(hw->wed_dev, true); ++ ++out: ++ mutex_unlock(&hw_lock); ++ ++ return ret; ++} ++ ++void mtk_wed_flow_remove(int index) ++{ ++ struct mtk_wed_hw *hw = hw_list[index]; ++ ++ if (!hw) ++ return; ++ ++ if (--hw->num_flows) ++ return; ++ ++ mutex_lock(&hw_lock); ++ if (!hw->wed_dev) ++ goto out; ++ ++ hw->wed_dev->wlan.offload_disable(hw->wed_dev); ++ mtk_wed_set_ext_int(hw->wed_dev, true); ++ ++out: ++ mutex_unlock(&hw_lock); ++} ++ ++void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, ++ void __iomem *wdma, int index) ++{ ++ static const struct mtk_wed_ops wed_ops = { ++ .attach = mtk_wed_attach, ++ .tx_ring_setup = mtk_wed_tx_ring_setup, ++ .txfree_ring_setup = mtk_wed_txfree_ring_setup, ++ .start = mtk_wed_start, ++ .stop = mtk_wed_stop, ++ .reset_dma = mtk_wed_reset_dma, ++ .reg_read = wed_r32, ++ .reg_write = wed_w32, ++ .irq_get = mtk_wed_irq_get, ++ .irq_set_mask = mtk_wed_irq_set_mask, ++ .detach = mtk_wed_detach, ++ }; ++ struct device_node *eth_np = eth->dev->of_node; ++ struct platform_device *pdev; ++ struct mtk_wed_hw *hw; ++ struct regmap *regs; ++ int irq; ++ ++ if (!np) ++ return; ++ ++ pdev = of_find_device_by_node(np); ++ if (!pdev) ++ return; ++ ++ get_device(&pdev->dev); ++ irq = platform_get_irq(pdev, 0); ++ if (irq < 0) ++ return; ++ ++ regs = syscon_regmap_lookup_by_phandle(np, NULL); ++ if (!regs) ++ return; ++ ++ rcu_assign_pointer(mtk_soc_wed_ops, &wed_ops); ++ ++ mutex_lock(&hw_lock); ++ ++ if (WARN_ON(hw_list[index])) ++ goto unlock; ++ ++ hw = kzalloc(sizeof(*hw), GFP_KERNEL); ++ hw->node = np; ++ hw->regs = regs; ++ hw->eth = eth; ++ hw->dev = &pdev->dev; ++ hw->wdma = wdma; ++ hw->index = index; ++ hw->irq = irq; ++ hw->mirror = syscon_regmap_lookup_by_phandle(eth_np, ++ "mediatek,pcie-mirror"); ++ hw->hifsys = syscon_regmap_lookup_by_phandle(eth_np, ++ "mediatek,hifsys"); ++ if (IS_ERR(hw->mirror) || IS_ERR(hw->hifsys)) { ++ kfree(hw); ++ goto unlock; ++ } ++ ++ if (!index) { ++ regmap_write(hw->mirror, 0, 0); ++ regmap_write(hw->mirror, 4, 0); ++ } ++ mtk_wed_hw_add_debugfs(hw); ++ ++ hw_list[index] = hw; ++ ++unlock: ++ mutex_unlock(&hw_lock); ++} ++ ++void mtk_wed_exit(void) ++{ ++ int i; ++ ++ rcu_assign_pointer(mtk_soc_wed_ops, NULL); ++ ++ synchronize_rcu(); ++ ++ for (i = 0; i < ARRAY_SIZE(hw_list); i++) { ++ struct mtk_wed_hw *hw; ++ ++ hw = hw_list[i]; ++ if (!hw) ++ continue; ++ ++ hw_list[i] = NULL; ++ debugfs_remove(hw->debugfs_dir); ++ put_device(hw->dev); ++ kfree(hw); ++ } ++} +--- /dev/null ++++ b/drivers/net/ethernet/mediatek/mtk_wed.h +@@ -0,0 +1,128 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* Copyright (C) 2021 Felix Fietkau */ ++ ++#ifndef __MTK_WED_PRIV_H ++#define __MTK_WED_PRIV_H ++ ++#include ++#include ++#include ++ ++struct mtk_eth; ++ ++struct mtk_wed_hw { ++ struct device_node *node; ++ struct mtk_eth *eth; ++ struct regmap *regs; ++ struct regmap *hifsys; ++ struct device *dev; ++ void __iomem *wdma; ++ struct regmap *mirror; ++ struct dentry *debugfs_dir; ++ struct mtk_wed_device *wed_dev; ++ u32 debugfs_reg; ++ u32 num_flows; ++ char dirname[5]; ++ int irq; ++ int index; ++}; ++ ++ ++#ifdef CONFIG_NET_MEDIATEK_SOC_WED ++static inline void ++wed_w32(struct mtk_wed_device *dev, u32 reg, u32 val) ++{ ++ regmap_write(dev->hw->regs, reg, val); ++} ++ ++static inline u32 ++wed_r32(struct mtk_wed_device *dev, u32 reg) ++{ ++ unsigned int val; ++ ++ regmap_read(dev->hw->regs, reg, &val); ++ ++ return val; ++} ++ ++static inline void ++wdma_w32(struct mtk_wed_device *dev, u32 reg, u32 val) ++{ ++ writel(val, dev->hw->wdma + reg); ++} ++ ++static inline u32 ++wdma_r32(struct mtk_wed_device *dev, u32 reg) ++{ ++ return readl(dev->hw->wdma + reg); ++} ++ ++static inline u32 ++wpdma_tx_r32(struct mtk_wed_device *dev, int ring, u32 reg) ++{ ++ if (!dev->tx_ring[ring].wpdma) ++ return 0; ++ ++ return readl(dev->tx_ring[ring].wpdma + reg); ++} ++ ++static inline void ++wpdma_tx_w32(struct mtk_wed_device *dev, int ring, u32 reg, u32 val) ++{ ++ if (!dev->tx_ring[ring].wpdma) ++ return; ++ ++ writel(val, dev->tx_ring[ring].wpdma + reg); ++} ++ ++static inline u32 ++wpdma_txfree_r32(struct mtk_wed_device *dev, u32 reg) ++{ ++ if (!dev->txfree_ring.wpdma) ++ return 0; ++ ++ return readl(dev->txfree_ring.wpdma + reg); ++} ++ ++static inline void ++wpdma_txfree_w32(struct mtk_wed_device *dev, u32 reg, u32 val) ++{ ++ if (!dev->txfree_ring.wpdma) ++ return; ++ ++ writel(val, dev->txfree_ring.wpdma + reg); ++} ++ ++void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, ++ void __iomem *wdma, int index); ++void mtk_wed_exit(void); ++int mtk_wed_flow_add(int index); ++void mtk_wed_flow_remove(int index); ++#else ++static inline void ++mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, ++ void __iomem *wdma, int index) ++{ ++} ++static inline void ++mtk_wed_exit(void) ++{ ++} ++static inline int mtk_wed_flow_add(int index) ++{ ++ return -EINVAL; ++} ++static inline void mtk_wed_flow_remove(int index) ++{ ++} ++#endif ++ ++#ifdef CONFIG_DEBUG_FS ++void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw); ++#else ++static inline void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw) ++{ ++} ++#endif ++ ++#endif +--- /dev/null ++++ b/drivers/net/ethernet/mediatek/mtk_wed_debugfs.c +@@ -0,0 +1,175 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* Copyright (C) 2021 Felix Fietkau */ ++ ++#include ++#include "mtk_wed.h" ++#include "mtk_wed_regs.h" ++ ++struct reg_dump { ++ const char *name; ++ u16 offset; ++ u8 type; ++ u8 base; ++}; ++ ++enum { ++ DUMP_TYPE_STRING, ++ DUMP_TYPE_WED, ++ DUMP_TYPE_WDMA, ++ DUMP_TYPE_WPDMA_TX, ++ DUMP_TYPE_WPDMA_TXFREE, ++}; ++ ++#define DUMP_STR(_str) { _str, 0, DUMP_TYPE_STRING } ++#define DUMP_REG(_reg, ...) { #_reg, MTK_##_reg, __VA_ARGS__ } ++#define DUMP_RING(_prefix, _base, ...) \ ++ { _prefix " BASE", _base, __VA_ARGS__ }, \ ++ { _prefix " CNT", _base + 0x4, __VA_ARGS__ }, \ ++ { _prefix " CIDX", _base + 0x8, __VA_ARGS__ }, \ ++ { _prefix " DIDX", _base + 0xc, __VA_ARGS__ } ++ ++#define DUMP_WED(_reg) DUMP_REG(_reg, DUMP_TYPE_WED) ++#define DUMP_WED_RING(_base) DUMP_RING(#_base, MTK_##_base, DUMP_TYPE_WED) ++ ++#define DUMP_WDMA(_reg) DUMP_REG(_reg, DUMP_TYPE_WDMA) ++#define DUMP_WDMA_RING(_base) DUMP_RING(#_base, MTK_##_base, DUMP_TYPE_WDMA) ++ ++#define DUMP_WPDMA_TX_RING(_n) DUMP_RING("WPDMA_TX" #_n, 0, DUMP_TYPE_WPDMA_TX, _n) ++#define DUMP_WPDMA_TXFREE_RING DUMP_RING("WPDMA_RX1", 0, DUMP_TYPE_WPDMA_TXFREE) ++ ++static void ++print_reg_val(struct seq_file *s, const char *name, u32 val) ++{ ++ seq_printf(s, "%-32s %08x\n", name, val); ++} ++ ++static void ++dump_wed_regs(struct seq_file *s, struct mtk_wed_device *dev, ++ const struct reg_dump *regs, int n_regs) ++{ ++ const struct reg_dump *cur; ++ u32 val; ++ ++ for (cur = regs; cur < ®s[n_regs]; cur++) { ++ switch (cur->type) { ++ case DUMP_TYPE_STRING: ++ seq_printf(s, "%s======== %s:\n", ++ cur > regs ? "\n" : "", ++ cur->name); ++ continue; ++ case DUMP_TYPE_WED: ++ val = wed_r32(dev, cur->offset); ++ break; ++ case DUMP_TYPE_WDMA: ++ val = wdma_r32(dev, cur->offset); ++ break; ++ case DUMP_TYPE_WPDMA_TX: ++ val = wpdma_tx_r32(dev, cur->base, cur->offset); ++ break; ++ case DUMP_TYPE_WPDMA_TXFREE: ++ val = wpdma_txfree_r32(dev, cur->offset); ++ break; ++ } ++ print_reg_val(s, cur->name, val); ++ } ++} ++ ++ ++static int ++wed_txinfo_show(struct seq_file *s, void *data) ++{ ++ static const struct reg_dump regs[] = { ++ DUMP_STR("WED TX"), ++ DUMP_WED(WED_TX_MIB(0)), ++ DUMP_WED_RING(WED_RING_TX(0)), ++ ++ DUMP_WED(WED_TX_MIB(1)), ++ DUMP_WED_RING(WED_RING_TX(1)), ++ ++ DUMP_STR("WPDMA TX"), ++ DUMP_WED(WED_WPDMA_TX_MIB(0)), ++ DUMP_WED_RING(WED_WPDMA_RING_TX(0)), ++ DUMP_WED(WED_WPDMA_TX_COHERENT_MIB(0)), ++ ++ DUMP_WED(WED_WPDMA_TX_MIB(1)), ++ DUMP_WED_RING(WED_WPDMA_RING_TX(1)), ++ DUMP_WED(WED_WPDMA_TX_COHERENT_MIB(1)), ++ ++ DUMP_STR("WPDMA TX"), ++ DUMP_WPDMA_TX_RING(0), ++ DUMP_WPDMA_TX_RING(1), ++ ++ DUMP_STR("WED WDMA RX"), ++ DUMP_WED(WED_WDMA_RX_MIB(0)), ++ DUMP_WED_RING(WED_WDMA_RING_RX(0)), ++ DUMP_WED(WED_WDMA_RX_THRES(0)), ++ DUMP_WED(WED_WDMA_RX_RECYCLE_MIB(0)), ++ DUMP_WED(WED_WDMA_RX_PROCESSED_MIB(0)), ++ ++ DUMP_WED(WED_WDMA_RX_MIB(1)), ++ DUMP_WED_RING(WED_WDMA_RING_RX(1)), ++ DUMP_WED(WED_WDMA_RX_THRES(1)), ++ DUMP_WED(WED_WDMA_RX_RECYCLE_MIB(1)), ++ DUMP_WED(WED_WDMA_RX_PROCESSED_MIB(1)), ++ ++ DUMP_STR("WDMA RX"), ++ DUMP_WDMA(WDMA_GLO_CFG), ++ DUMP_WDMA_RING(WDMA_RING_RX(0)), ++ DUMP_WDMA_RING(WDMA_RING_RX(1)), ++ }; ++ struct mtk_wed_hw *hw = s->private; ++ struct mtk_wed_device *dev = hw->wed_dev; ++ ++ if (!dev) ++ return 0; ++ ++ dump_wed_regs(s, dev, regs, ARRAY_SIZE(regs)); ++ ++ return 0; ++} ++DEFINE_SHOW_ATTRIBUTE(wed_txinfo); ++ ++ ++static int ++mtk_wed_reg_set(void *data, u64 val) ++{ ++ struct mtk_wed_hw *hw = data; ++ ++ regmap_write(hw->regs, hw->debugfs_reg, val); ++ ++ return 0; ++} ++ ++static int ++mtk_wed_reg_get(void *data, u64 *val) ++{ ++ struct mtk_wed_hw *hw = data; ++ unsigned int regval; ++ int ret; ++ ++ ret = regmap_read(hw->regs, hw->debugfs_reg, ®val); ++ if (ret) ++ return ret; ++ ++ *val = regval; ++ ++ return 0; ++} ++ ++DEFINE_DEBUGFS_ATTRIBUTE(fops_regval, mtk_wed_reg_get, mtk_wed_reg_set, ++ "0x%08llx\n"); ++ ++void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw) ++{ ++ struct dentry *dir; ++ ++ snprintf(hw->dirname, sizeof(hw->dirname), "wed%d", hw->index); ++ dir = debugfs_create_dir(hw->dirname, NULL); ++ if (!dir) ++ return; ++ ++ hw->debugfs_dir = dir; ++ debugfs_create_u32("regidx", 0600, dir, &hw->debugfs_reg); ++ debugfs_create_file_unsafe("regval", 0600, dir, hw, &fops_regval); ++ debugfs_create_file_unsafe("txinfo", 0400, dir, hw, &wed_txinfo_fops); ++} +--- /dev/null ++++ b/drivers/net/ethernet/mediatek/mtk_wed_ops.c +@@ -0,0 +1,8 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* Copyright (C) 2020 Felix Fietkau */ ++ ++#include ++#include ++ ++const struct mtk_wed_ops __rcu *mtk_soc_wed_ops; ++EXPORT_SYMBOL_GPL(mtk_soc_wed_ops); +--- /dev/null ++++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h +@@ -0,0 +1,251 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* Copyright (C) 2020 Felix Fietkau */ ++ ++#ifndef __MTK_WED_REGS_H ++#define __MTK_WED_REGS_H ++ ++#define MTK_WDMA_DESC_CTRL_LEN1 GENMASK(14, 0) ++#define MTK_WDMA_DESC_CTRL_LAST_SEG1 BIT(15) ++#define MTK_WDMA_DESC_CTRL_BURST BIT(16) ++#define MTK_WDMA_DESC_CTRL_LEN0 GENMASK(29, 16) ++#define MTK_WDMA_DESC_CTRL_LAST_SEG0 BIT(30) ++#define MTK_WDMA_DESC_CTRL_DMA_DONE BIT(31) ++ ++struct mtk_wdma_desc { ++ __le32 buf0; ++ __le32 ctrl; ++ __le32 buf1; ++ __le32 info; ++} __packed __aligned(4); ++ ++#define MTK_WED_RESET 0x008 ++#define MTK_WED_RESET_TX_BM BIT(0) ++#define MTK_WED_RESET_TX_FREE_AGENT BIT(4) ++#define MTK_WED_RESET_WPDMA_TX_DRV BIT(8) ++#define MTK_WED_RESET_WPDMA_RX_DRV BIT(9) ++#define MTK_WED_RESET_WPDMA_INT_AGENT BIT(11) ++#define MTK_WED_RESET_WED_TX_DMA BIT(12) ++#define MTK_WED_RESET_WDMA_RX_DRV BIT(17) ++#define MTK_WED_RESET_WDMA_INT_AGENT BIT(19) ++#define MTK_WED_RESET_WED BIT(31) ++ ++#define MTK_WED_CTRL 0x00c ++#define MTK_WED_CTRL_WPDMA_INT_AGENT_EN BIT(0) ++#define MTK_WED_CTRL_WPDMA_INT_AGENT_BUSY BIT(1) ++#define MTK_WED_CTRL_WDMA_INT_AGENT_EN BIT(2) ++#define MTK_WED_CTRL_WDMA_INT_AGENT_BUSY BIT(3) ++#define MTK_WED_CTRL_WED_TX_BM_EN BIT(8) ++#define MTK_WED_CTRL_WED_TX_BM_BUSY BIT(9) ++#define MTK_WED_CTRL_WED_TX_FREE_AGENT_EN BIT(10) ++#define MTK_WED_CTRL_WED_TX_FREE_AGENT_BUSY BIT(11) ++#define MTK_WED_CTRL_RESERVE_EN BIT(12) ++#define MTK_WED_CTRL_RESERVE_BUSY BIT(13) ++#define MTK_WED_CTRL_FINAL_DIDX_READ BIT(24) ++#define MTK_WED_CTRL_MIB_READ_CLEAR BIT(28) ++ ++#define MTK_WED_EXT_INT_STATUS 0x020 ++#define MTK_WED_EXT_INT_STATUS_TF_LEN_ERR BIT(0) ++#define MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD BIT(1) ++#define MTK_WED_EXT_INT_STATUS_TKID_TITO_INVALID BIT(4) ++#define MTK_WED_EXT_INT_STATUS_TX_FBUF_LO_TH BIT(8) ++#define MTK_WED_EXT_INT_STATUS_TX_FBUF_HI_TH BIT(9) ++#define MTK_WED_EXT_INT_STATUS_RX_FBUF_LO_TH BIT(12) ++#define MTK_WED_EXT_INT_STATUS_RX_FBUF_HI_TH BIT(13) ++#define MTK_WED_EXT_INT_STATUS_RX_DRV_R_RESP_ERR BIT(16) ++#define MTK_WED_EXT_INT_STATUS_RX_DRV_W_RESP_ERR BIT(17) ++#define MTK_WED_EXT_INT_STATUS_RX_DRV_COHERENT BIT(18) ++#define MTK_WED_EXT_INT_STATUS_RX_DRV_INIT_WDMA_EN BIT(19) ++#define MTK_WED_EXT_INT_STATUS_RX_DRV_BM_DMAD_COHERENT BIT(20) ++#define MTK_WED_EXT_INT_STATUS_TX_DRV_R_RESP_ERR BIT(21) ++#define MTK_WED_EXT_INT_STATUS_TX_DRV_W_RESP_ERR BIT(22) ++#define MTK_WED_EXT_INT_STATUS_RX_DRV_DMA_RECYCLE BIT(24) ++#define MTK_WED_EXT_INT_STATUS_ERROR_MASK (MTK_WED_EXT_INT_STATUS_TF_LEN_ERR | \ ++ MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD | \ ++ MTK_WED_EXT_INT_STATUS_TKID_TITO_INVALID | \ ++ MTK_WED_EXT_INT_STATUS_RX_DRV_R_RESP_ERR | \ ++ MTK_WED_EXT_INT_STATUS_RX_DRV_W_RESP_ERR | \ ++ MTK_WED_EXT_INT_STATUS_RX_DRV_INIT_WDMA_EN | \ ++ MTK_WED_EXT_INT_STATUS_TX_DRV_R_RESP_ERR | \ ++ MTK_WED_EXT_INT_STATUS_TX_DRV_W_RESP_ERR) ++ ++#define MTK_WED_EXT_INT_MASK 0x028 ++ ++#define MTK_WED_STATUS 0x060 ++#define MTK_WED_STATUS_TX GENMASK(15, 8) ++ ++#define MTK_WED_TX_BM_CTRL 0x080 ++#define MTK_WED_TX_BM_CTRL_VLD_GRP_NUM GENMASK(6, 0) ++#define MTK_WED_TX_BM_CTRL_RSV_GRP_NUM GENMASK(22, 16) ++#define MTK_WED_TX_BM_CTRL_PAUSE BIT(28) ++ ++#define MTK_WED_TX_BM_BASE 0x084 ++ ++#define MTK_WED_TX_BM_TKID 0x088 ++#define MTK_WED_TX_BM_TKID_START GENMASK(15, 0) ++#define MTK_WED_TX_BM_TKID_END GENMASK(31, 16) ++ ++#define MTK_WED_TX_BM_BUF_LEN 0x08c ++ ++#define MTK_WED_TX_BM_INTF 0x09c ++#define MTK_WED_TX_BM_INTF_TKID GENMASK(15, 0) ++#define MTK_WED_TX_BM_INTF_TKFIFO_FDEP GENMASK(23, 16) ++#define MTK_WED_TX_BM_INTF_TKID_VALID BIT(28) ++#define MTK_WED_TX_BM_INTF_TKID_READ BIT(29) ++ ++#define MTK_WED_TX_BM_DYN_THR 0x0a0 ++#define MTK_WED_TX_BM_DYN_THR_LO GENMASK(6, 0) ++#define MTK_WED_TX_BM_DYN_THR_HI GENMASK(22, 16) ++ ++#define MTK_WED_INT_STATUS 0x200 ++#define MTK_WED_INT_MASK 0x204 ++ ++#define MTK_WED_GLO_CFG 0x208 ++#define MTK_WED_GLO_CFG_TX_DMA_EN BIT(0) ++#define MTK_WED_GLO_CFG_TX_DMA_BUSY BIT(1) ++#define MTK_WED_GLO_CFG_RX_DMA_EN BIT(2) ++#define MTK_WED_GLO_CFG_RX_DMA_BUSY BIT(3) ++#define MTK_WED_GLO_CFG_RX_BT_SIZE GENMASK(5, 4) ++#define MTK_WED_GLO_CFG_TX_WB_DDONE BIT(6) ++#define MTK_WED_GLO_CFG_BIG_ENDIAN BIT(7) ++#define MTK_WED_GLO_CFG_DIS_BT_SIZE_ALIGN BIT(8) ++#define MTK_WED_GLO_CFG_TX_BT_SIZE_LO BIT(9) ++#define MTK_WED_GLO_CFG_MULTI_DMA_EN GENMASK(11, 10) ++#define MTK_WED_GLO_CFG_FIFO_LITTLE_ENDIAN BIT(12) ++#define MTK_WED_GLO_CFG_MI_DEPTH_RD GENMASK(21, 13) ++#define MTK_WED_GLO_CFG_TX_BT_SIZE_HI GENMASK(23, 22) ++#define MTK_WED_GLO_CFG_SW_RESET BIT(24) ++#define MTK_WED_GLO_CFG_FIRST_TOKEN_ONLY BIT(26) ++#define MTK_WED_GLO_CFG_OMIT_RX_INFO BIT(27) ++#define MTK_WED_GLO_CFG_OMIT_TX_INFO BIT(28) ++#define MTK_WED_GLO_CFG_BYTE_SWAP BIT(29) ++#define MTK_WED_GLO_CFG_RX_2B_OFFSET BIT(31) ++ ++#define MTK_WED_RESET_IDX 0x20c ++#define MTK_WED_RESET_IDX_TX GENMASK(3, 0) ++#define MTK_WED_RESET_IDX_RX GENMASK(17, 16) ++ ++#define MTK_WED_TX_MIB(_n) (0x2a0 + (_n) * 4) ++ ++#define MTK_WED_RING_TX(_n) (0x300 + (_n) * 0x10) ++ ++#define MTK_WED_RING_RX(_n) (0x400 + (_n) * 0x10) ++ ++#define MTK_WED_WPDMA_INT_TRIGGER 0x504 ++#define MTK_WED_WPDMA_INT_TRIGGER_RX_DONE BIT(1) ++#define MTK_WED_WPDMA_INT_TRIGGER_TX_DONE GENMASK(5, 4) ++ ++#define MTK_WED_WPDMA_GLO_CFG 0x508 ++#define MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN BIT(0) ++#define MTK_WED_WPDMA_GLO_CFG_TX_DRV_BUSY BIT(1) ++#define MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN BIT(2) ++#define MTK_WED_WPDMA_GLO_CFG_RX_DRV_BUSY BIT(3) ++#define MTK_WED_WPDMA_GLO_CFG_RX_BT_SIZE GENMASK(5, 4) ++#define MTK_WED_WPDMA_GLO_CFG_TX_WB_DDONE BIT(6) ++#define MTK_WED_WPDMA_GLO_CFG_BIG_ENDIAN BIT(7) ++#define MTK_WED_WPDMA_GLO_CFG_DIS_BT_SIZE_ALIGN BIT(8) ++#define MTK_WED_WPDMA_GLO_CFG_TX_BT_SIZE_LO BIT(9) ++#define MTK_WED_WPDMA_GLO_CFG_MULTI_DMA_EN GENMASK(11, 10) ++#define MTK_WED_WPDMA_GLO_CFG_FIFO_LITTLE_ENDIAN BIT(12) ++#define MTK_WED_WPDMA_GLO_CFG_MI_DEPTH_RD GENMASK(21, 13) ++#define MTK_WED_WPDMA_GLO_CFG_TX_BT_SIZE_HI GENMASK(23, 22) ++#define MTK_WED_WPDMA_GLO_CFG_SW_RESET BIT(24) ++#define MTK_WED_WPDMA_GLO_CFG_FIRST_TOKEN_ONLY BIT(26) ++#define MTK_WED_WPDMA_GLO_CFG_OMIT_RX_INFO BIT(27) ++#define MTK_WED_WPDMA_GLO_CFG_OMIT_TX_INFO BIT(28) ++#define MTK_WED_WPDMA_GLO_CFG_BYTE_SWAP BIT(29) ++#define MTK_WED_WPDMA_GLO_CFG_RX_2B_OFFSET BIT(31) ++ ++#define MTK_WED_WPDMA_RESET_IDX 0x50c ++#define MTK_WED_WPDMA_RESET_IDX_TX GENMASK(3, 0) ++#define MTK_WED_WPDMA_RESET_IDX_RX GENMASK(17, 16) ++ ++#define MTK_WED_WPDMA_INT_CTRL 0x520 ++#define MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV BIT(21) ++ ++#define MTK_WED_WPDMA_INT_MASK 0x524 ++ ++#define MTK_WED_PCIE_CFG_BASE 0x560 ++ ++#define MTK_WED_PCIE_INT_TRIGGER 0x570 ++#define MTK_WED_PCIE_INT_TRIGGER_STATUS BIT(16) ++ ++#define MTK_WED_WPDMA_CFG_BASE 0x580 ++ ++#define MTK_WED_WPDMA_TX_MIB(_n) (0x5a0 + (_n) * 4) ++#define MTK_WED_WPDMA_TX_COHERENT_MIB(_n) (0x5d0 + (_n) * 4) ++ ++#define MTK_WED_WPDMA_RING_TX(_n) (0x600 + (_n) * 0x10) ++#define MTK_WED_WPDMA_RING_RX(_n) (0x700 + (_n) * 0x10) ++#define MTK_WED_WDMA_RING_RX(_n) (0x900 + (_n) * 0x10) ++#define MTK_WED_WDMA_RX_THRES(_n) (0x940 + (_n) * 0x4) ++ ++#define MTK_WED_WDMA_GLO_CFG 0xa04 ++#define MTK_WED_WDMA_GLO_CFG_TX_DRV_EN BIT(0) ++#define MTK_WED_WDMA_GLO_CFG_RX_DRV_EN BIT(2) ++#define MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY BIT(3) ++#define MTK_WED_WDMA_GLO_CFG_BT_SIZE GENMASK(5, 4) ++#define MTK_WED_WDMA_GLO_CFG_TX_WB_DDONE BIT(6) ++#define MTK_WED_WDMA_GLO_CFG_RX_DIS_FSM_AUTO_IDLE BIT(13) ++#define MTK_WED_WDMA_GLO_CFG_WCOMPLETE_SEL BIT(16) ++#define MTK_WED_WDMA_GLO_CFG_INIT_PHASE_RXDMA_BYPASS BIT(17) ++#define MTK_WED_WDMA_GLO_CFG_INIT_PHASE_BYPASS BIT(18) ++#define MTK_WED_WDMA_GLO_CFG_FSM_RETURN_IDLE BIT(19) ++#define MTK_WED_WDMA_GLO_CFG_WAIT_COHERENT BIT(20) ++#define MTK_WED_WDMA_GLO_CFG_AXI_W_AFTER_AW BIT(21) ++#define MTK_WED_WDMA_GLO_CFG_IDLE_DMAD_SUPPLY_SINGLE_W BIT(22) ++#define MTK_WED_WDMA_GLO_CFG_IDLE_DMAD_SUPPLY BIT(23) ++#define MTK_WED_WDMA_GLO_CFG_DYNAMIC_SKIP_DMAD_PREP BIT(24) ++#define MTK_WED_WDMA_GLO_CFG_DYNAMIC_DMAD_RECYCLE BIT(25) ++#define MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE BIT(26) ++#define MTK_WED_WDMA_GLO_CFG_RXDRV_CLKGATE_BYPASS BIT(30) ++ ++#define MTK_WED_WDMA_RESET_IDX 0xa08 ++#define MTK_WED_WDMA_RESET_IDX_RX GENMASK(17, 16) ++#define MTK_WED_WDMA_RESET_IDX_DRV GENMASK(25, 24) ++ ++#define MTK_WED_WDMA_INT_TRIGGER 0xa28 ++#define MTK_WED_WDMA_INT_TRIGGER_RX_DONE GENMASK(17, 16) ++ ++#define MTK_WED_WDMA_INT_CTRL 0xa2c ++#define MTK_WED_WDMA_INT_CTRL_POLL_SRC_SEL GENMASK(17, 16) ++ ++#define MTK_WED_WDMA_OFFSET0 0xaa4 ++#define MTK_WED_WDMA_OFFSET1 0xaa8 ++ ++#define MTK_WED_WDMA_RX_MIB(_n) (0xae0 + (_n) * 4) ++#define MTK_WED_WDMA_RX_RECYCLE_MIB(_n) (0xae8 + (_n) * 4) ++#define MTK_WED_WDMA_RX_PROCESSED_MIB(_n) (0xaf0 + (_n) * 4) ++ ++#define MTK_WED_RING_OFS_BASE 0x00 ++#define MTK_WED_RING_OFS_COUNT 0x04 ++#define MTK_WED_RING_OFS_CPU_IDX 0x08 ++#define MTK_WED_RING_OFS_DMA_IDX 0x0c ++ ++#define MTK_WDMA_RING_RX(_n) (0x100 + (_n) * 0x10) ++ ++#define MTK_WDMA_GLO_CFG 0x204 ++#define MTK_WDMA_GLO_CFG_RX_INFO_PRERES GENMASK(28, 26) ++ ++#define MTK_WDMA_RESET_IDX 0x208 ++#define MTK_WDMA_RESET_IDX_TX GENMASK(3, 0) ++#define MTK_WDMA_RESET_IDX_RX GENMASK(17, 16) ++ ++#define MTK_WDMA_INT_MASK 0x228 ++#define MTK_WDMA_INT_MASK_TX_DONE GENMASK(3, 0) ++#define MTK_WDMA_INT_MASK_RX_DONE GENMASK(17, 16) ++#define MTK_WDMA_INT_MASK_TX_DELAY BIT(28) ++#define MTK_WDMA_INT_MASK_TX_COHERENT BIT(29) ++#define MTK_WDMA_INT_MASK_RX_DELAY BIT(30) ++#define MTK_WDMA_INT_MASK_RX_COHERENT BIT(31) ++ ++#define MTK_WDMA_INT_GRP1 0x250 ++#define MTK_WDMA_INT_GRP2 0x254 ++ ++#define MTK_PCIE_MIRROR_MAP(n) ((n) ? 0x4 : 0x0) ++#define MTK_PCIE_MIRROR_MAP_EN BIT(0) ++#define MTK_PCIE_MIRROR_MAP_WED_ID BIT(1) ++ ++/* DMA channel mapping */ ++#define HIFSYS_DMA_AG_MAP 0x008 ++ ++#endif +--- /dev/null ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -0,0 +1,131 @@ ++#ifndef __MTK_WED_H ++#define __MTK_WED_H ++ ++#include ++#include ++#include ++#include ++ ++#define MTK_WED_TX_QUEUES 2 ++ ++struct mtk_wed_hw; ++struct mtk_wdma_desc; ++ ++struct mtk_wed_ring { ++ struct mtk_wdma_desc *desc; ++ dma_addr_t desc_phys; ++ int size; ++ ++ u32 reg_base; ++ void __iomem *wpdma; ++}; ++ ++struct mtk_wed_device { ++#ifdef CONFIG_NET_MEDIATEK_SOC_WED ++ const struct mtk_wed_ops *ops; ++ struct device *dev; ++ struct mtk_wed_hw *hw; ++ bool init_done, running; ++ int wdma_idx; ++ int irq; ++ ++ struct mtk_wed_ring tx_ring[MTK_WED_TX_QUEUES]; ++ struct mtk_wed_ring txfree_ring; ++ struct mtk_wed_ring tx_wdma[MTK_WED_TX_QUEUES]; ++ ++ struct { ++ int size; ++ void **pages; ++ struct mtk_wdma_desc *desc; ++ dma_addr_t desc_phys; ++ } buf_ring; ++ ++ /* filled by driver: */ ++ struct { ++ struct pci_dev *pci_dev; ++ ++ u32 wpdma_phys; ++ ++ u16 token_start; ++ unsigned int nbuf; ++ ++ u32 (*init_buf)(void *ptr, dma_addr_t phys, int token_id); ++ int (*offload_enable)(struct mtk_wed_device *wed); ++ void (*offload_disable)(struct mtk_wed_device *wed); ++ } wlan; ++#endif ++}; ++ ++struct mtk_wed_ops { ++ int (*attach)(struct mtk_wed_device *dev); ++ int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring, ++ void __iomem *regs); ++ int (*txfree_ring_setup)(struct mtk_wed_device *dev, ++ void __iomem *regs); ++ void (*detach)(struct mtk_wed_device *dev); ++ ++ void (*stop)(struct mtk_wed_device *dev); ++ void (*start)(struct mtk_wed_device *dev, u32 irq_mask); ++ void (*reset_dma)(struct mtk_wed_device *dev); ++ ++ u32 (*reg_read)(struct mtk_wed_device *dev, u32 reg); ++ void (*reg_write)(struct mtk_wed_device *dev, u32 reg, u32 val); ++ ++ u32 (*irq_get)(struct mtk_wed_device *dev, u32 mask); ++ void (*irq_set_mask)(struct mtk_wed_device *dev, u32 mask); ++}; ++ ++extern const struct mtk_wed_ops __rcu *mtk_soc_wed_ops; ++ ++static inline int ++mtk_wed_device_attach(struct mtk_wed_device *dev) ++{ ++ int ret = -ENODEV; ++ ++#ifdef CONFIG_NET_MEDIATEK_SOC_WED ++ rcu_read_lock(); ++ dev->ops = rcu_dereference(mtk_soc_wed_ops); ++ if (dev->ops) ++ ret = dev->ops->attach(dev); ++ else ++ rcu_read_unlock(); ++ ++ if (ret) ++ dev->ops = NULL; ++#endif ++ ++ return ret; ++} ++ ++#ifdef CONFIG_NET_MEDIATEK_SOC_WED ++#define mtk_wed_device_active(_dev) !!(_dev)->ops ++#define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev) ++#define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask) ++#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) \ ++ (_dev)->ops->tx_ring_setup(_dev, _ring, _regs) ++#define mtk_wed_device_txfree_ring_setup(_dev, _regs) \ ++ (_dev)->ops->txfree_ring_setup(_dev, _regs) ++#define mtk_wed_device_reg_read(_dev, _reg) \ ++ (_dev)->ops->reg_read(_dev, _reg) ++#define mtk_wed_device_reg_write(_dev, _reg, _val) \ ++ (_dev)->ops->reg_write(_dev, _reg, _val) ++#define mtk_wed_device_irq_get(_dev, _mask) \ ++ (_dev)->ops->irq_get(_dev, _mask) ++#define mtk_wed_device_irq_set_mask(_dev, _mask) \ ++ (_dev)->ops->irq_set_mask(_dev, _mask) ++#else ++static inline bool mtk_wed_device_active(struct mtk_wed_device *dev) ++{ ++ return false; ++} ++#define mtk_wed_device_detach(_dev) do {} while (0) ++#define mtk_wed_device_start(_dev, _mask) do {} while (0) ++#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) -ENODEV ++#define mtk_wed_device_txfree_ring_setup(_dev, _ring, _regs) -ENODEV ++#define mtk_wed_device_reg_read(_dev, _reg) 0 ++#define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0) ++#define mtk_wed_device_irq_get(_dev, _mask) 0 ++#define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0) ++#endif ++ ++#endif diff --git a/target/linux/generic/backport-5.15/702-v5.19-03-net-ethernet-mtk_eth_soc-implement-flow-offloading-t.patch b/target/linux/generic/backport-5.15/702-v5.19-03-net-ethernet-mtk_eth_soc-implement-flow-offloading-t.patch new file mode 100644 index 0000000000..69113c2ffa --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-03-net-ethernet-mtk_eth_soc-implement-flow-offloading-t.patch @@ -0,0 +1,269 @@ +From: Felix Fietkau +Date: Sat, 5 Feb 2022 18:29:22 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: implement flow offloading + to WED devices + +This allows hardware flow offloading from Ethernet to WLAN on MT7622 SoC + +Co-developed-by: Lorenzo Bianconi +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -329,6 +329,24 @@ int mtk_foe_entry_set_pppoe(struct mtk_f + return 0; + } + ++int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq, ++ int bss, int wcid) ++{ ++ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry); ++ u32 *ib2 = mtk_foe_entry_ib2(entry); ++ ++ *ib2 &= ~MTK_FOE_IB2_PORT_MG; ++ *ib2 |= MTK_FOE_IB2_WDMA_WINFO; ++ if (wdma_idx) ++ *ib2 |= MTK_FOE_IB2_WDMA_DEVIDX; ++ ++ l2->vlan2 = FIELD_PREP(MTK_FOE_VLAN2_WINFO_BSS, bss) | ++ FIELD_PREP(MTK_FOE_VLAN2_WINFO_WCID, wcid) | ++ FIELD_PREP(MTK_FOE_VLAN2_WINFO_RING, txq); ++ ++ return 0; ++} ++ + static inline bool mtk_foe_entry_usable(struct mtk_foe_entry *entry) + { + return !(entry->ib1 & MTK_FOE_IB1_STATIC) && +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -48,9 +48,9 @@ enum { + #define MTK_FOE_IB2_DEST_PORT GENMASK(7, 5) + #define MTK_FOE_IB2_MULTICAST BIT(8) + +-#define MTK_FOE_IB2_WHNAT_QID2 GENMASK(13, 12) +-#define MTK_FOE_IB2_WHNAT_DEVIDX BIT(16) +-#define MTK_FOE_IB2_WHNAT_NAT BIT(17) ++#define MTK_FOE_IB2_WDMA_QID2 GENMASK(13, 12) ++#define MTK_FOE_IB2_WDMA_DEVIDX BIT(16) ++#define MTK_FOE_IB2_WDMA_WINFO BIT(17) + + #define MTK_FOE_IB2_PORT_MG GENMASK(17, 12) + +@@ -58,9 +58,9 @@ enum { + + #define MTK_FOE_IB2_DSCP GENMASK(31, 24) + +-#define MTK_FOE_VLAN2_WHNAT_BSS GEMMASK(5, 0) +-#define MTK_FOE_VLAN2_WHNAT_WCID GENMASK(13, 6) +-#define MTK_FOE_VLAN2_WHNAT_RING GENMASK(15, 14) ++#define MTK_FOE_VLAN2_WINFO_BSS GENMASK(5, 0) ++#define MTK_FOE_VLAN2_WINFO_WCID GENMASK(13, 6) ++#define MTK_FOE_VLAN2_WINFO_RING GENMASK(15, 14) + + enum { + MTK_FOE_STATE_INVALID, +@@ -281,6 +281,8 @@ int mtk_foe_entry_set_ipv6_tuple(struct + int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port); + int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid); + int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid); ++int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq, ++ int bss, int wcid); + int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, + u16 timestamp); + int mtk_ppe_debugfs_init(struct mtk_ppe *ppe); +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -10,6 +10,7 @@ + #include + #include + #include "mtk_eth_soc.h" ++#include "mtk_wed.h" + + struct mtk_flow_data { + struct ethhdr eth; +@@ -39,6 +40,7 @@ struct mtk_flow_entry { + struct rhash_head node; + unsigned long cookie; + u16 hash; ++ s8 wed_index; + }; + + static const struct rhashtable_params mtk_flow_ht_params = { +@@ -80,6 +82,35 @@ mtk_flow_offload_mangle_eth(const struct + memcpy(dest, src, act->mangle.mask ? 2 : 4); + } + ++static int ++mtk_flow_get_wdma_info(struct net_device *dev, const u8 *addr, struct mtk_wdma_info *info) ++{ ++ struct net_device_path_ctx ctx = { ++ .dev = dev, ++ .daddr = addr, ++ }; ++ struct net_device_path path = {}; ++ ++ if (!IS_ENABLED(CONFIG_NET_MEDIATEK_SOC_WED)) ++ return -1; ++ ++ if (!dev->netdev_ops->ndo_fill_forward_path) ++ return -1; ++ ++ if (dev->netdev_ops->ndo_fill_forward_path(&ctx, &path)) ++ return -1; ++ ++ if (path.type != DEV_PATH_MTK_WDMA) ++ return -1; ++ ++ info->wdma_idx = path.mtk_wdma.wdma_idx; ++ info->queue = path.mtk_wdma.queue; ++ info->bss = path.mtk_wdma.bss; ++ info->wcid = path.mtk_wdma.wcid; ++ ++ return 0; ++} ++ + + static int + mtk_flow_mangle_ports(const struct flow_action_entry *act, +@@ -149,10 +180,20 @@ mtk_flow_get_dsa_port(struct net_device + + static int + mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe, +- struct net_device *dev) ++ struct net_device *dev, const u8 *dest_mac, ++ int *wed_index) + { ++ struct mtk_wdma_info info = {}; + int pse_port, dsa_port; + ++ if (mtk_flow_get_wdma_info(dev, dest_mac, &info) == 0) { ++ mtk_foe_entry_set_wdma(foe, info.wdma_idx, info.queue, info.bss, ++ info.wcid); ++ pse_port = 3; ++ *wed_index = info.wdma_idx; ++ goto out; ++ } ++ + dsa_port = mtk_flow_get_dsa_port(&dev); + if (dsa_port >= 0) + mtk_foe_entry_set_dsa(foe, dsa_port); +@@ -164,6 +205,7 @@ mtk_flow_set_output_device(struct mtk_et + else + return -EOPNOTSUPP; + ++out: + mtk_foe_entry_set_pse_port(foe, pse_port); + + return 0; +@@ -179,6 +221,7 @@ mtk_flow_offload_replace(struct mtk_eth + struct net_device *odev = NULL; + struct mtk_flow_entry *entry; + int offload_type = 0; ++ int wed_index = -1; + u16 addr_type = 0; + u32 timestamp; + u8 l4proto = 0; +@@ -326,10 +369,14 @@ mtk_flow_offload_replace(struct mtk_eth + if (data.pppoe.num == 1) + mtk_foe_entry_set_pppoe(&foe, data.pppoe.sid); + +- err = mtk_flow_set_output_device(eth, &foe, odev); ++ err = mtk_flow_set_output_device(eth, &foe, odev, data.eth.h_dest, ++ &wed_index); + if (err) + return err; + ++ if (wed_index >= 0 && (err = mtk_wed_flow_add(wed_index)) < 0) ++ return err; ++ + entry = kzalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) + return -ENOMEM; +@@ -343,6 +390,7 @@ mtk_flow_offload_replace(struct mtk_eth + } + + entry->hash = hash; ++ entry->wed_index = wed_index; + err = rhashtable_insert_fast(ð->flow_table, &entry->node, + mtk_flow_ht_params); + if (err < 0) +@@ -353,6 +401,8 @@ clear_flow: + mtk_foe_entry_clear(ð->ppe, hash); + free: + kfree(entry); ++ if (wed_index >= 0) ++ mtk_wed_flow_remove(wed_index); + return err; + } + +@@ -369,6 +419,8 @@ mtk_flow_offload_destroy(struct mtk_eth + mtk_foe_entry_clear(ð->ppe, entry->hash); + rhashtable_remove_fast(ð->flow_table, &entry->node, + mtk_flow_ht_params); ++ if (entry->wed_index >= 0) ++ mtk_wed_flow_remove(entry->wed_index); + kfree(entry); + + return 0; +--- a/drivers/net/ethernet/mediatek/mtk_wed.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed.h +@@ -7,6 +7,7 @@ + #include + #include + #include ++#include + + struct mtk_eth; + +@@ -27,6 +28,12 @@ struct mtk_wed_hw { + int index; + }; + ++struct mtk_wdma_info { ++ u8 wdma_idx; ++ u8 queue; ++ u16 wcid; ++ u8 bss; ++}; + + #ifdef CONFIG_NET_MEDIATEK_SOC_WED + static inline void +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -875,6 +875,7 @@ enum net_device_path_type { + DEV_PATH_BRIDGE, + DEV_PATH_PPPOE, + DEV_PATH_DSA, ++ DEV_PATH_MTK_WDMA, + }; + + struct net_device_path { +@@ -900,6 +901,12 @@ struct net_device_path { + int port; + u16 proto; + } dsa; ++ struct { ++ u8 wdma_idx; ++ u8 queue; ++ u16 wcid; ++ u8 bss; ++ } mtk_wdma; + }; + }; + +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -769,6 +769,10 @@ int dev_fill_forward_path(const struct n + if (WARN_ON_ONCE(last_dev == ctx.dev)) + return -1; + } ++ ++ if (!ctx.dev) ++ return ret; ++ + path = dev_fwd_path(stack); + if (!path) + return -1; diff --git a/target/linux/generic/backport-5.15/702-v5.19-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch b/target/linux/generic/backport-5.15/702-v5.19-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch new file mode 100644 index 0000000000..2c6e3fd3cd --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch @@ -0,0 +1,62 @@ +From: Felix Fietkau +Date: Sat, 5 Feb 2022 18:36:36 +0100 +Subject: [PATCH] arm64: dts: mediatek: mt7622: introduce nodes for + Wireless Ethernet Dispatch + +Introduce wed0 and wed1 nodes in order to enable offloading forwarding +between ethernet and wireless devices on the mt7622 chipset. + +Signed-off-by: Felix Fietkau +--- + +--- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi ++++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi +@@ -894,6 +894,11 @@ + }; + }; + ++ hifsys: syscon@1af00000 { ++ compatible = "mediatek,mt7622-hifsys", "syscon"; ++ reg = <0 0x1af00000 0 0x70>; ++ }; ++ + ethsys: syscon@1b000000 { + compatible = "mediatek,mt7622-ethsys", + "syscon"; +@@ -912,6 +917,26 @@ + #dma-cells = <1>; + }; + ++ pcie_mirror: pcie-mirror@10000400 { ++ compatible = "mediatek,mt7622-pcie-mirror", ++ "syscon"; ++ reg = <0 0x10000400 0 0x10>; ++ }; ++ ++ wed0: wed@1020a000 { ++ compatible = "mediatek,mt7622-wed", ++ "syscon"; ++ reg = <0 0x1020a000 0 0x1000>; ++ interrupts = ; ++ }; ++ ++ wed1: wed@1020b000 { ++ compatible = "mediatek,mt7622-wed", ++ "syscon"; ++ reg = <0 0x1020b000 0 0x1000>; ++ interrupts = ; ++ }; ++ + eth: ethernet@1b100000 { + compatible = "mediatek,mt7622-eth", + "mediatek,mt2701-eth", +@@ -939,6 +964,9 @@ + mediatek,ethsys = <ðsys>; + mediatek,sgmiisys = <&sgmiisys>; + mediatek,cci-control = <&cci_control2>; ++ mediatek,wed = <&wed0>, <&wed1>; ++ mediatek,pcie-mirror = <&pcie_mirror>; ++ mediatek,hifsys = <&hifsys>; + dma-coherent; + #address-cells = <1>; + #size-cells = <0>; diff --git a/target/linux/generic/backport-5.15/702-v5.19-05-net-ethernet-mtk_eth_soc-add-ipv6-flow-offload-suppo.patch b/target/linux/generic/backport-5.15/702-v5.19-05-net-ethernet-mtk_eth_soc-add-ipv6-flow-offload-suppo.patch new file mode 100644 index 0000000000..9adb067015 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-05-net-ethernet-mtk_eth_soc-add-ipv6-flow-offload-suppo.patch @@ -0,0 +1,79 @@ +From: David Bentham +Date: Mon, 21 Feb 2022 15:36:16 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add ipv6 flow offload + support + +Add the missing IPv6 flow offloading support for routing only. +Hardware flow offloading is done by the packet processing engine (PPE) +of the Ethernet MAC and as it doesn't support mangling of IPv6 packets, +IPv6 NAT cannot be supported. + +Signed-off-by: David Bentham +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -6,6 +6,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -20,6 +21,11 @@ struct mtk_flow_data { + __be32 src_addr; + __be32 dst_addr; + } v4; ++ ++ struct { ++ struct in6_addr src_addr; ++ struct in6_addr dst_addr; ++ } v6; + }; + + __be16 src_port; +@@ -65,6 +71,14 @@ mtk_flow_set_ipv4_addr(struct mtk_foe_en + data->v4.dst_addr, data->dst_port); + } + ++static int ++mtk_flow_set_ipv6_addr(struct mtk_foe_entry *foe, struct mtk_flow_data *data) ++{ ++ return mtk_foe_entry_set_ipv6_tuple(foe, ++ data->v6.src_addr.s6_addr32, data->src_port, ++ data->v6.dst_addr.s6_addr32, data->dst_port); ++} ++ + static void + mtk_flow_offload_mangle_eth(const struct flow_action_entry *act, void *eth) + { +@@ -296,6 +310,9 @@ mtk_flow_offload_replace(struct mtk_eth + case FLOW_DISSECTOR_KEY_IPV4_ADDRS: + offload_type = MTK_PPE_PKT_TYPE_IPV4_HNAPT; + break; ++ case FLOW_DISSECTOR_KEY_IPV6_ADDRS: ++ offload_type = MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T; ++ break; + default: + return -EOPNOTSUPP; + } +@@ -331,6 +348,17 @@ mtk_flow_offload_replace(struct mtk_eth + mtk_flow_set_ipv4_addr(&foe, &data, false); + } + ++ if (addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) { ++ struct flow_match_ipv6_addrs addrs; ++ ++ flow_rule_match_ipv6_addrs(rule, &addrs); ++ ++ data.v6.src_addr = addrs.key->src; ++ data.v6.dst_addr = addrs.key->dst; ++ ++ mtk_flow_set_ipv6_addr(&foe, &data); ++ } ++ + flow_action_for_each(i, act, &rule->action) { + if (act->id != FLOW_ACTION_MANGLE) + continue; diff --git a/target/linux/generic/pending-5.10/701-06-net-ethernet-mtk_eth_soc-support-TC_SETUP_BLOCK-for-.patch b/target/linux/generic/backport-5.15/702-v5.19-06-net-ethernet-mtk_eth_soc-support-TC_SETUP_BLOCK-for-.patch similarity index 100% rename from target/linux/generic/pending-5.10/701-06-net-ethernet-mtk_eth_soc-support-TC_SETUP_BLOCK-for-.patch rename to target/linux/generic/backport-5.15/702-v5.19-06-net-ethernet-mtk_eth_soc-support-TC_SETUP_BLOCK-for-.patch diff --git a/target/linux/generic/backport-5.15/702-v5.19-07-net-ethernet-mtk_eth_soc-allocate-struct-mtk_ppe-sep.patch b/target/linux/generic/backport-5.15/702-v5.19-07-net-ethernet-mtk_eth_soc-allocate-struct-mtk_ppe-sep.patch new file mode 100644 index 0000000000..030a334676 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-07-net-ethernet-mtk_eth_soc-allocate-struct-mtk_ppe-sep.patch @@ -0,0 +1,159 @@ +From: Felix Fietkau +Date: Mon, 21 Feb 2022 15:38:20 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: allocate struct mtk_ppe + separately + +Preparation for adding more data to it, which will increase its size. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -2338,7 +2338,7 @@ static int mtk_open(struct net_device *d + return err; + } + +- if (eth->soc->offload_version && mtk_ppe_start(ð->ppe) == 0) ++ if (eth->soc->offload_version && mtk_ppe_start(eth->ppe) == 0) + gdm_config = MTK_GDMA_TO_PPE; + + mtk_gdm_config(eth, gdm_config); +@@ -2412,7 +2412,7 @@ static int mtk_stop(struct net_device *d + mtk_dma_free(eth); + + if (eth->soc->offload_version) +- mtk_ppe_stop(ð->ppe); ++ mtk_ppe_stop(eth->ppe); + + return 0; + } +@@ -3297,10 +3297,11 @@ static int mtk_probe(struct platform_dev + } + + if (eth->soc->offload_version) { +- err = mtk_ppe_init(ð->ppe, eth->dev, +- eth->base + MTK_ETH_PPE_BASE, 2); +- if (err) ++ eth->ppe = mtk_ppe_init(eth->dev, eth->base + MTK_ETH_PPE_BASE, 2); ++ if (!eth->ppe) { ++ err = -ENOMEM; + goto err_free_dev; ++ } + + err = mtk_eth_offload_init(eth); + if (err) +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -983,7 +983,7 @@ struct mtk_eth { + u32 rx_dma_l4_valid; + int ip_align; + +- struct mtk_ppe ppe; ++ struct mtk_ppe *ppe; + struct rhashtable flow_table; + }; + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -384,10 +384,15 @@ int mtk_foe_entry_commit(struct mtk_ppe + return hash; + } + +-int mtk_ppe_init(struct mtk_ppe *ppe, struct device *dev, void __iomem *base, ++struct mtk_ppe *mtk_ppe_init(struct device *dev, void __iomem *base, + int version) + { + struct mtk_foe_entry *foe; ++ struct mtk_ppe *ppe; ++ ++ ppe = devm_kzalloc(dev, sizeof(*ppe), GFP_KERNEL); ++ if (!ppe) ++ return NULL; + + /* need to allocate a separate device, since it PPE DMA access is + * not coherent. +@@ -399,13 +404,13 @@ int mtk_ppe_init(struct mtk_ppe *ppe, st + foe = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*foe), + &ppe->foe_phys, GFP_KERNEL); + if (!foe) +- return -ENOMEM; ++ return NULL; + + ppe->foe_table = foe; + + mtk_ppe_debugfs_init(ppe); + +- return 0; ++ return ppe; + } + + static void mtk_ppe_init_foe_table(struct mtk_ppe *ppe) +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -246,8 +246,7 @@ struct mtk_ppe { + void *acct_table; + }; + +-int mtk_ppe_init(struct mtk_ppe *ppe, struct device *dev, void __iomem *base, +- int version); ++struct mtk_ppe *mtk_ppe_init(struct device *dev, void __iomem *base, int version); + int mtk_ppe_start(struct mtk_ppe *ppe); + int mtk_ppe_stop(struct mtk_ppe *ppe); + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -411,7 +411,7 @@ mtk_flow_offload_replace(struct mtk_eth + + entry->cookie = f->cookie; + timestamp = mtk_eth_timestamp(eth); +- hash = mtk_foe_entry_commit(ð->ppe, &foe, timestamp); ++ hash = mtk_foe_entry_commit(eth->ppe, &foe, timestamp); + if (hash < 0) { + err = hash; + goto free; +@@ -426,7 +426,7 @@ mtk_flow_offload_replace(struct mtk_eth + + return 0; + clear_flow: +- mtk_foe_entry_clear(ð->ppe, hash); ++ mtk_foe_entry_clear(eth->ppe, hash); + free: + kfree(entry); + if (wed_index >= 0) +@@ -444,7 +444,7 @@ mtk_flow_offload_destroy(struct mtk_eth + if (!entry) + return -ENOENT; + +- mtk_foe_entry_clear(ð->ppe, entry->hash); ++ mtk_foe_entry_clear(eth->ppe, entry->hash); + rhashtable_remove_fast(ð->flow_table, &entry->node, + mtk_flow_ht_params); + if (entry->wed_index >= 0) +@@ -466,7 +466,7 @@ mtk_flow_offload_stats(struct mtk_eth *e + if (!entry) + return -ENOENT; + +- timestamp = mtk_foe_entry_timestamp(ð->ppe, entry->hash); ++ timestamp = mtk_foe_entry_timestamp(eth->ppe, entry->hash); + if (timestamp < 0) + return -ETIMEDOUT; + +@@ -522,7 +522,7 @@ mtk_eth_setup_tc_block(struct net_device + struct flow_block_cb *block_cb; + flow_setup_cb_t *cb; + +- if (!eth->ppe.foe_table) ++ if (!eth->ppe || !eth->ppe->foe_table) + return -EOPNOTSUPP; + + if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) +@@ -575,7 +575,7 @@ int mtk_eth_setup_tc(struct net_device * + + int mtk_eth_offload_init(struct mtk_eth *eth) + { +- if (!eth->ppe.foe_table) ++ if (!eth->ppe || !eth->ppe->foe_table) + return 0; + + return rhashtable_init(ð->flow_table, &mtk_flow_ht_params); diff --git a/target/linux/generic/backport-5.15/702-v5.19-08-net-ethernet-mtk_eth_soc-rework-hardware-flow-table-.patch b/target/linux/generic/backport-5.15/702-v5.19-08-net-ethernet-mtk_eth_soc-rework-hardware-flow-table-.patch new file mode 100644 index 0000000000..0bb3f906ac --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-08-net-ethernet-mtk_eth_soc-rework-hardware-flow-table-.patch @@ -0,0 +1,424 @@ +From: Felix Fietkau +Date: Mon, 21 Feb 2022 15:39:18 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: rework hardware flow table + management + +The hardware was designed to handle flow detection and creation of flow entries +by itself, relying on the software primarily for filling in egress routing +information. +When there is a hash collision between multiple flows, this allows the hardware +to maintain the entry for the most active flow. +Additionally, the hardware only keeps offloading active for entries with at +least 30 packets per second. + +With this rework, the code no longer creates a hardware entries directly. +Instead, the hardware entry is only created when the PPE reports a matching +unbound flow with the minimum target rate. +In order to reduce CPU overhead, looking for flows belonging to a hash entry +is rate limited to once every 100ms. + +This rework is also used as preparation for emulating bridge offload by +managing L4 offload entries on demand. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -21,6 +21,7 @@ + #include + #include + #include ++#include + #include + + #include "mtk_eth_soc.h" +@@ -1293,7 +1294,7 @@ static int mtk_poll_rx(struct napi_struc + struct net_device *netdev; + unsigned int pktlen; + dma_addr_t dma_addr; +- u32 hash; ++ u32 hash, reason; + int mac; + + ring = mtk_get_rx_ring(eth); +@@ -1372,6 +1373,11 @@ static int mtk_poll_rx(struct napi_struc + skb_set_hash(skb, hash, PKT_HASH_TYPE_L4); + } + ++ reason = FIELD_GET(MTK_RXD4_PPE_CPU_REASON, trxd.rxd4); ++ if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) ++ mtk_ppe_check_skb(eth->ppe, skb, ++ trxd.rxd4 & MTK_RXD4_FOE_ENTRY); ++ + if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX && + (trxd.rxd2 & RX_DMA_VTAG)) + __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), +@@ -3297,7 +3303,7 @@ static int mtk_probe(struct platform_dev + } + + if (eth->soc->offload_version) { +- eth->ppe = mtk_ppe_init(eth->dev, eth->base + MTK_ETH_PPE_BASE, 2); ++ eth->ppe = mtk_ppe_init(eth, eth->base + MTK_ETH_PPE_BASE, 2); + if (!eth->ppe) { + err = -ENOMEM; + goto err_free_dev; +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -6,9 +6,12 @@ + #include + #include + #include ++#include "mtk_eth_soc.h" + #include "mtk_ppe.h" + #include "mtk_ppe_regs.h" + ++static DEFINE_SPINLOCK(ppe_lock); ++ + static void ppe_w32(struct mtk_ppe *ppe, u32 reg, u32 val) + { + writel(val, ppe->base + reg); +@@ -41,6 +44,11 @@ static u32 ppe_clear(struct mtk_ppe *ppe + return ppe_m32(ppe, reg, val, 0); + } + ++static u32 mtk_eth_timestamp(struct mtk_eth *eth) ++{ ++ return mtk_r32(eth, 0x0010) & MTK_FOE_IB1_BIND_TIMESTAMP; ++} ++ + static int mtk_ppe_wait_busy(struct mtk_ppe *ppe) + { + int ret; +@@ -353,26 +361,59 @@ static inline bool mtk_foe_entry_usable( + FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1) != MTK_FOE_STATE_BIND; + } + +-int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, +- u16 timestamp) ++static bool ++mtk_flow_entry_match(struct mtk_flow_entry *entry, struct mtk_foe_entry *data) ++{ ++ int type, len; ++ ++ if ((data->ib1 ^ entry->data.ib1) & MTK_FOE_IB1_UDP) ++ return false; ++ ++ type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->data.ib1); ++ if (type > MTK_PPE_PKT_TYPE_IPV4_DSLITE) ++ len = offsetof(struct mtk_foe_entry, ipv6._rsv); ++ else ++ len = offsetof(struct mtk_foe_entry, ipv4.ib2); ++ ++ return !memcmp(&entry->data.data, &data->data, len - 4); ++} ++ ++static void ++mtk_flow_entry_update(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { + struct mtk_foe_entry *hwe; +- u32 hash; ++ struct mtk_foe_entry foe; + ++ spin_lock_bh(&ppe_lock); ++ if (entry->hash == 0xffff) ++ goto out; ++ ++ hwe = &ppe->foe_table[entry->hash]; ++ memcpy(&foe, hwe, sizeof(foe)); ++ if (!mtk_flow_entry_match(entry, &foe)) { ++ entry->hash = 0xffff; ++ goto out; ++ } ++ ++ entry->data.ib1 = foe.ib1; ++ ++out: ++ spin_unlock_bh(&ppe_lock); ++} ++ ++static void ++__mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, ++ u16 hash) ++{ ++ struct mtk_foe_entry *hwe; ++ u16 timestamp; ++ ++ timestamp = mtk_eth_timestamp(ppe->eth); + timestamp &= MTK_FOE_IB1_BIND_TIMESTAMP; + entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP; + entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_TIMESTAMP, timestamp); + +- hash = mtk_ppe_hash_entry(entry); + hwe = &ppe->foe_table[hash]; +- if (!mtk_foe_entry_usable(hwe)) { +- hwe++; +- hash++; +- +- if (!mtk_foe_entry_usable(hwe)) +- return -ENOSPC; +- } +- + memcpy(&hwe->data, &entry->data, sizeof(hwe->data)); + wmb(); + hwe->ib1 = entry->ib1; +@@ -380,13 +421,77 @@ int mtk_foe_entry_commit(struct mtk_ppe + dma_wmb(); + + mtk_ppe_cache_clear(ppe); ++} + +- return hash; ++void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) ++{ ++ spin_lock_bh(&ppe_lock); ++ hlist_del_init(&entry->list); ++ if (entry->hash != 0xffff) { ++ ppe->foe_table[entry->hash].ib1 &= ~MTK_FOE_IB1_STATE; ++ ppe->foe_table[entry->hash].ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, ++ MTK_FOE_STATE_BIND); ++ dma_wmb(); ++ } ++ entry->hash = 0xffff; ++ spin_unlock_bh(&ppe_lock); ++} ++ ++int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) ++{ ++ u32 hash = mtk_ppe_hash_entry(&entry->data); ++ ++ entry->hash = 0xffff; ++ spin_lock_bh(&ppe_lock); ++ hlist_add_head(&entry->list, &ppe->foe_flow[hash / 2]); ++ spin_unlock_bh(&ppe_lock); ++ ++ return 0; ++} ++ ++void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash) ++{ ++ struct hlist_head *head = &ppe->foe_flow[hash / 2]; ++ struct mtk_flow_entry *entry; ++ struct mtk_foe_entry *hwe = &ppe->foe_table[hash]; ++ bool found = false; ++ ++ if (hlist_empty(head)) ++ return; ++ ++ spin_lock_bh(&ppe_lock); ++ hlist_for_each_entry(entry, head, list) { ++ if (found || !mtk_flow_entry_match(entry, hwe)) { ++ if (entry->hash != 0xffff) ++ entry->hash = 0xffff; ++ continue; ++ } ++ ++ entry->hash = hash; ++ __mtk_foe_entry_commit(ppe, &entry->data, hash); ++ found = true; ++ } ++ spin_unlock_bh(&ppe_lock); ++} ++ ++int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) ++{ ++ u16 now = mtk_eth_timestamp(ppe->eth) & MTK_FOE_IB1_BIND_TIMESTAMP; ++ u16 timestamp; ++ ++ mtk_flow_entry_update(ppe, entry); ++ timestamp = entry->data.ib1 & MTK_FOE_IB1_BIND_TIMESTAMP; ++ ++ if (timestamp > now) ++ return MTK_FOE_IB1_BIND_TIMESTAMP + 1 - timestamp + now; ++ else ++ return now - timestamp; + } + +-struct mtk_ppe *mtk_ppe_init(struct device *dev, void __iomem *base, ++struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, + int version) + { ++ struct device *dev = eth->dev; + struct mtk_foe_entry *foe; + struct mtk_ppe *ppe; + +@@ -398,6 +503,7 @@ struct mtk_ppe *mtk_ppe_init(struct devi + * not coherent. + */ + ppe->base = base; ++ ppe->eth = eth; + ppe->dev = dev; + ppe->version = version; + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -235,7 +235,17 @@ enum { + MTK_PPE_CPU_REASON_INVALID = 0x1f, + }; + ++struct mtk_flow_entry { ++ struct rhash_head node; ++ struct hlist_node list; ++ unsigned long cookie; ++ struct mtk_foe_entry data; ++ u16 hash; ++ s8 wed_index; ++}; ++ + struct mtk_ppe { ++ struct mtk_eth *eth; + struct device *dev; + void __iomem *base; + int version; +@@ -243,18 +253,33 @@ struct mtk_ppe { + struct mtk_foe_entry *foe_table; + dma_addr_t foe_phys; + ++ u16 foe_check_time[MTK_PPE_ENTRIES]; ++ struct hlist_head foe_flow[MTK_PPE_ENTRIES / 2]; ++ + void *acct_table; + }; + +-struct mtk_ppe *mtk_ppe_init(struct device *dev, void __iomem *base, int version); ++struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version); + int mtk_ppe_start(struct mtk_ppe *ppe); + int mtk_ppe_stop(struct mtk_ppe *ppe); + ++void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash); ++ + static inline void +-mtk_foe_entry_clear(struct mtk_ppe *ppe, u16 hash) ++mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash) + { +- ppe->foe_table[hash].ib1 = 0; +- dma_wmb(); ++ u16 now, diff; ++ ++ if (!ppe) ++ return; ++ ++ now = (u16)jiffies; ++ diff = now - ppe->foe_check_time[hash]; ++ if (diff < HZ / 10) ++ return; ++ ++ ppe->foe_check_time[hash] = now; ++ __mtk_ppe_check_skb(ppe, skb, hash); + } + + static inline int +@@ -282,8 +307,9 @@ int mtk_foe_entry_set_vlan(struct mtk_fo + int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid); + int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq, + int bss, int wcid); +-int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, +- u16 timestamp); ++int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); ++void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); ++int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); + int mtk_ppe_debugfs_init(struct mtk_ppe *ppe); + + #endif +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -42,13 +42,6 @@ struct mtk_flow_data { + } pppoe; + }; + +-struct mtk_flow_entry { +- struct rhash_head node; +- unsigned long cookie; +- u16 hash; +- s8 wed_index; +-}; +- + static const struct rhashtable_params mtk_flow_ht_params = { + .head_offset = offsetof(struct mtk_flow_entry, node), + .key_offset = offsetof(struct mtk_flow_entry, cookie), +@@ -56,12 +49,6 @@ static const struct rhashtable_params mt + .automatic_shrinking = true, + }; + +-static u32 +-mtk_eth_timestamp(struct mtk_eth *eth) +-{ +- return mtk_r32(eth, 0x0010) & MTK_FOE_IB1_BIND_TIMESTAMP; +-} +- + static int + mtk_flow_set_ipv4_addr(struct mtk_foe_entry *foe, struct mtk_flow_data *data, + bool egress) +@@ -237,10 +224,8 @@ mtk_flow_offload_replace(struct mtk_eth + int offload_type = 0; + int wed_index = -1; + u16 addr_type = 0; +- u32 timestamp; + u8 l4proto = 0; + int err = 0; +- int hash; + int i; + + if (rhashtable_lookup(ð->flow_table, &f->cookie, mtk_flow_ht_params)) +@@ -410,23 +395,21 @@ mtk_flow_offload_replace(struct mtk_eth + return -ENOMEM; + + entry->cookie = f->cookie; +- timestamp = mtk_eth_timestamp(eth); +- hash = mtk_foe_entry_commit(eth->ppe, &foe, timestamp); +- if (hash < 0) { +- err = hash; ++ memcpy(&entry->data, &foe, sizeof(entry->data)); ++ entry->wed_index = wed_index; ++ ++ if (mtk_foe_entry_commit(eth->ppe, entry) < 0) + goto free; +- } + +- entry->hash = hash; +- entry->wed_index = wed_index; + err = rhashtable_insert_fast(ð->flow_table, &entry->node, + mtk_flow_ht_params); + if (err < 0) +- goto clear_flow; ++ goto clear; + + return 0; +-clear_flow: +- mtk_foe_entry_clear(eth->ppe, hash); ++ ++clear: ++ mtk_foe_entry_clear(eth->ppe, entry); + free: + kfree(entry); + if (wed_index >= 0) +@@ -444,7 +427,7 @@ mtk_flow_offload_destroy(struct mtk_eth + if (!entry) + return -ENOENT; + +- mtk_foe_entry_clear(eth->ppe, entry->hash); ++ mtk_foe_entry_clear(eth->ppe, entry); + rhashtable_remove_fast(ð->flow_table, &entry->node, + mtk_flow_ht_params); + if (entry->wed_index >= 0) +@@ -458,7 +441,6 @@ static int + mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f) + { + struct mtk_flow_entry *entry; +- int timestamp; + u32 idle; + + entry = rhashtable_lookup(ð->flow_table, &f->cookie, +@@ -466,11 +448,7 @@ mtk_flow_offload_stats(struct mtk_eth *e + if (!entry) + return -ENOENT; + +- timestamp = mtk_foe_entry_timestamp(eth->ppe, entry->hash); +- if (timestamp < 0) +- return -ETIMEDOUT; +- +- idle = mtk_eth_timestamp(eth) - timestamp; ++ idle = mtk_foe_entry_idle_time(eth->ppe, entry); + f->stats.lastused = jiffies - idle * HZ; + + return 0; diff --git a/target/linux/generic/pending-5.10/701-09-net-ethernet-mtk_eth_soc-remove-bridge-flow-offload-.patch b/target/linux/generic/backport-5.15/702-v5.19-09-net-ethernet-mtk_eth_soc-remove-bridge-flow-offload-.patch similarity index 100% rename from target/linux/generic/pending-5.10/701-09-net-ethernet-mtk_eth_soc-remove-bridge-flow-offload-.patch rename to target/linux/generic/backport-5.15/702-v5.19-09-net-ethernet-mtk_eth_soc-remove-bridge-flow-offload-.patch diff --git a/target/linux/generic/backport-5.15/702-v5.19-10-net-ethernet-mtk_eth_soc-support-creating-mac-addres.patch b/target/linux/generic/backport-5.15/702-v5.19-10-net-ethernet-mtk_eth_soc-support-creating-mac-addres.patch new file mode 100644 index 0000000000..209c65e66a --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-10-net-ethernet-mtk_eth_soc-support-creating-mac-addres.patch @@ -0,0 +1,553 @@ +From: Felix Fietkau +Date: Wed, 23 Feb 2022 10:56:34 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: support creating mac + address based offload entries + +This will be used to implement a limited form of bridge offloading. +Since the hardware does not support flow table entries with just source +and destination MAC address, the driver has to emulate it. + +The hardware automatically creates entries entries for incoming flows, even +when they are bridged instead of routed, and reports when packets for these +flows have reached the minimum PPS rate for offloading. + +After this happens, we look up the L2 flow offload entry based on the MAC +header and fill in the output routing information in the flow table. +The dynamically created per-flow entries are automatically removed when +either the hardware flowtable entry expires, is replaced, or if the offload +rule they belong to is removed + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -6,12 +6,22 @@ + #include + #include + #include ++#include ++#include ++#include + #include "mtk_eth_soc.h" + #include "mtk_ppe.h" + #include "mtk_ppe_regs.h" + + static DEFINE_SPINLOCK(ppe_lock); + ++static const struct rhashtable_params mtk_flow_l2_ht_params = { ++ .head_offset = offsetof(struct mtk_flow_entry, l2_node), ++ .key_offset = offsetof(struct mtk_flow_entry, data.bridge), ++ .key_len = offsetof(struct mtk_foe_bridge, key_end), ++ .automatic_shrinking = true, ++}; ++ + static void ppe_w32(struct mtk_ppe *ppe, u32 reg, u32 val) + { + writel(val, ppe->base + reg); +@@ -123,6 +133,9 @@ mtk_foe_entry_l2(struct mtk_foe_entry *e + { + int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); + ++ if (type == MTK_PPE_PKT_TYPE_BRIDGE) ++ return &entry->bridge.l2; ++ + if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) + return &entry->ipv6.l2; + +@@ -134,6 +147,9 @@ mtk_foe_entry_ib2(struct mtk_foe_entry * + { + int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); + ++ if (type == MTK_PPE_PKT_TYPE_BRIDGE) ++ return &entry->bridge.ib2; ++ + if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) + return &entry->ipv6.ib2; + +@@ -168,7 +184,12 @@ int mtk_foe_entry_prepare(struct mtk_foe + if (type == MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T) + entry->ipv6.ports = ports_pad; + +- if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) { ++ if (type == MTK_PPE_PKT_TYPE_BRIDGE) { ++ ether_addr_copy(entry->bridge.src_mac, src_mac); ++ ether_addr_copy(entry->bridge.dest_mac, dest_mac); ++ entry->bridge.ib2 = val; ++ l2 = &entry->bridge.l2; ++ } else if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) { + entry->ipv6.ib2 = val; + l2 = &entry->ipv6.l2; + } else { +@@ -372,12 +393,96 @@ mtk_flow_entry_match(struct mtk_flow_ent + } + + static void ++__mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) ++{ ++ struct hlist_head *head; ++ struct hlist_node *tmp; ++ ++ if (entry->type == MTK_FLOW_TYPE_L2) { ++ rhashtable_remove_fast(&ppe->l2_flows, &entry->l2_node, ++ mtk_flow_l2_ht_params); ++ ++ head = &entry->l2_flows; ++ hlist_for_each_entry_safe(entry, tmp, head, l2_data.list) ++ __mtk_foe_entry_clear(ppe, entry); ++ return; ++ } ++ ++ hlist_del_init(&entry->list); ++ if (entry->hash != 0xffff) { ++ ppe->foe_table[entry->hash].ib1 &= ~MTK_FOE_IB1_STATE; ++ ppe->foe_table[entry->hash].ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, ++ MTK_FOE_STATE_BIND); ++ dma_wmb(); ++ } ++ entry->hash = 0xffff; ++ ++ if (entry->type != MTK_FLOW_TYPE_L2_SUBFLOW) ++ return; ++ ++ hlist_del_init(&entry->l2_data.list); ++ kfree(entry); ++} ++ ++static int __mtk_foe_entry_idle_time(struct mtk_ppe *ppe, u32 ib1) ++{ ++ u16 timestamp; ++ u16 now; ++ ++ now = mtk_eth_timestamp(ppe->eth) & MTK_FOE_IB1_BIND_TIMESTAMP; ++ timestamp = ib1 & MTK_FOE_IB1_BIND_TIMESTAMP; ++ ++ if (timestamp > now) ++ return MTK_FOE_IB1_BIND_TIMESTAMP + 1 - timestamp + now; ++ else ++ return now - timestamp; ++} ++ ++static void ++mtk_flow_entry_update_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) ++{ ++ struct mtk_flow_entry *cur; ++ struct mtk_foe_entry *hwe; ++ struct hlist_node *tmp; ++ int idle; ++ ++ idle = __mtk_foe_entry_idle_time(ppe, entry->data.ib1); ++ hlist_for_each_entry_safe(cur, tmp, &entry->l2_flows, l2_data.list) { ++ int cur_idle; ++ u32 ib1; ++ ++ hwe = &ppe->foe_table[cur->hash]; ++ ib1 = READ_ONCE(hwe->ib1); ++ ++ if (FIELD_GET(MTK_FOE_IB1_STATE, ib1) != MTK_FOE_STATE_BIND) { ++ cur->hash = 0xffff; ++ __mtk_foe_entry_clear(ppe, cur); ++ continue; ++ } ++ ++ cur_idle = __mtk_foe_entry_idle_time(ppe, ib1); ++ if (cur_idle >= idle) ++ continue; ++ ++ idle = cur_idle; ++ entry->data.ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP; ++ entry->data.ib1 |= hwe->ib1 & MTK_FOE_IB1_BIND_TIMESTAMP; ++ } ++} ++ ++static void + mtk_flow_entry_update(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { + struct mtk_foe_entry *hwe; + struct mtk_foe_entry foe; + + spin_lock_bh(&ppe_lock); ++ ++ if (entry->type == MTK_FLOW_TYPE_L2) { ++ mtk_flow_entry_update_l2(ppe, entry); ++ goto out; ++ } ++ + if (entry->hash == 0xffff) + goto out; + +@@ -419,21 +524,28 @@ __mtk_foe_entry_commit(struct mtk_ppe *p + void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { + spin_lock_bh(&ppe_lock); +- hlist_del_init(&entry->list); +- if (entry->hash != 0xffff) { +- ppe->foe_table[entry->hash].ib1 &= ~MTK_FOE_IB1_STATE; +- ppe->foe_table[entry->hash].ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, +- MTK_FOE_STATE_BIND); +- dma_wmb(); +- } +- entry->hash = 0xffff; ++ __mtk_foe_entry_clear(ppe, entry); + spin_unlock_bh(&ppe_lock); + } + ++static int ++mtk_foe_entry_commit_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) ++{ ++ entry->type = MTK_FLOW_TYPE_L2; ++ ++ return rhashtable_insert_fast(&ppe->l2_flows, &entry->l2_node, ++ mtk_flow_l2_ht_params); ++} ++ + int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { +- u32 hash = mtk_ppe_hash_entry(&entry->data); ++ int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->data.ib1); ++ u32 hash; ++ ++ if (type == MTK_PPE_PKT_TYPE_BRIDGE) ++ return mtk_foe_entry_commit_l2(ppe, entry); + ++ hash = mtk_ppe_hash_entry(&entry->data); + entry->hash = 0xffff; + spin_lock_bh(&ppe_lock); + hlist_add_head(&entry->list, &ppe->foe_flow[hash / 2]); +@@ -442,18 +554,72 @@ int mtk_foe_entry_commit(struct mtk_ppe + return 0; + } + ++static void ++mtk_foe_entry_commit_subflow(struct mtk_ppe *ppe, struct mtk_flow_entry *entry, ++ u16 hash) ++{ ++ struct mtk_flow_entry *flow_info; ++ struct mtk_foe_entry foe, *hwe; ++ struct mtk_foe_mac_info *l2; ++ u32 ib1_mask = MTK_FOE_IB1_PACKET_TYPE | MTK_FOE_IB1_UDP; ++ int type; ++ ++ flow_info = kzalloc(offsetof(struct mtk_flow_entry, l2_data.end), ++ GFP_ATOMIC); ++ if (!flow_info) ++ return; ++ ++ flow_info->l2_data.base_flow = entry; ++ flow_info->type = MTK_FLOW_TYPE_L2_SUBFLOW; ++ flow_info->hash = hash; ++ hlist_add_head(&flow_info->list, &ppe->foe_flow[hash / 2]); ++ hlist_add_head(&flow_info->l2_data.list, &entry->l2_flows); ++ ++ hwe = &ppe->foe_table[hash]; ++ memcpy(&foe, hwe, sizeof(foe)); ++ foe.ib1 &= ib1_mask; ++ foe.ib1 |= entry->data.ib1 & ~ib1_mask; ++ ++ l2 = mtk_foe_entry_l2(&foe); ++ memcpy(l2, &entry->data.bridge.l2, sizeof(*l2)); ++ ++ type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, foe.ib1); ++ if (type == MTK_PPE_PKT_TYPE_IPV4_HNAPT) ++ memcpy(&foe.ipv4.new, &foe.ipv4.orig, sizeof(foe.ipv4.new)); ++ else if (type >= MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T && l2->etype == ETH_P_IP) ++ l2->etype = ETH_P_IPV6; ++ ++ *mtk_foe_entry_ib2(&foe) = entry->data.bridge.ib2; ++ ++ __mtk_foe_entry_commit(ppe, &foe, hash); ++} ++ + void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash) + { + struct hlist_head *head = &ppe->foe_flow[hash / 2]; +- struct mtk_flow_entry *entry; + struct mtk_foe_entry *hwe = &ppe->foe_table[hash]; ++ struct mtk_flow_entry *entry; ++ struct mtk_foe_bridge key = {}; ++ struct ethhdr *eh; + bool found = false; +- +- if (hlist_empty(head)) +- return; ++ u8 *tag; + + spin_lock_bh(&ppe_lock); ++ ++ if (FIELD_GET(MTK_FOE_IB1_STATE, hwe->ib1) == MTK_FOE_STATE_BIND) ++ goto out; ++ + hlist_for_each_entry(entry, head, list) { ++ if (entry->type == MTK_FLOW_TYPE_L2_SUBFLOW) { ++ if (unlikely(FIELD_GET(MTK_FOE_IB1_STATE, hwe->ib1) == ++ MTK_FOE_STATE_BIND)) ++ continue; ++ ++ entry->hash = 0xffff; ++ __mtk_foe_entry_clear(ppe, entry); ++ continue; ++ } ++ + if (found || !mtk_flow_entry_match(entry, hwe)) { + if (entry->hash != 0xffff) + entry->hash = 0xffff; +@@ -464,21 +630,50 @@ void __mtk_ppe_check_skb(struct mtk_ppe + __mtk_foe_entry_commit(ppe, &entry->data, hash); + found = true; + } ++ ++ if (found) ++ goto out; ++ ++ eh = eth_hdr(skb); ++ ether_addr_copy(key.dest_mac, eh->h_dest); ++ ether_addr_copy(key.src_mac, eh->h_source); ++ tag = skb->data - 2; ++ key.vlan = 0; ++ switch (skb->protocol) { ++#if IS_ENABLED(CONFIG_NET_DSA) ++ case htons(ETH_P_XDSA): ++ if (!netdev_uses_dsa(skb->dev) || ++ skb->dev->dsa_ptr->tag_ops->proto != DSA_TAG_PROTO_MTK) ++ goto out; ++ ++ tag += 4; ++ if (get_unaligned_be16(tag) != ETH_P_8021Q) ++ break; ++ ++ fallthrough; ++#endif ++ case htons(ETH_P_8021Q): ++ key.vlan = get_unaligned_be16(tag + 2) & VLAN_VID_MASK; ++ break; ++ default: ++ break; ++ } ++ ++ entry = rhashtable_lookup_fast(&ppe->l2_flows, &key, mtk_flow_l2_ht_params); ++ if (!entry) ++ goto out; ++ ++ mtk_foe_entry_commit_subflow(ppe, entry, hash); ++ ++out: + spin_unlock_bh(&ppe_lock); + } + + int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { +- u16 now = mtk_eth_timestamp(ppe->eth) & MTK_FOE_IB1_BIND_TIMESTAMP; +- u16 timestamp; +- + mtk_flow_entry_update(ppe, entry); +- timestamp = entry->data.ib1 & MTK_FOE_IB1_BIND_TIMESTAMP; + +- if (timestamp > now) +- return MTK_FOE_IB1_BIND_TIMESTAMP + 1 - timestamp + now; +- else +- return now - timestamp; ++ return __mtk_foe_entry_idle_time(ppe, entry->data.ib1); + } + + struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, +@@ -492,6 +687,8 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ + if (!ppe) + return NULL; + ++ rhashtable_init(&ppe->l2_flows, &mtk_flow_l2_ht_params); ++ + /* need to allocate a separate device, since it PPE DMA access is + * not coherent. + */ +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -6,6 +6,7 @@ + + #include + #include ++#include + + #define MTK_ETH_PPE_BASE 0xc00 + +@@ -84,19 +85,16 @@ struct mtk_foe_mac_info { + u16 src_mac_lo; + }; + ++/* software-only entry type */ + struct mtk_foe_bridge { +- u32 dest_mac_hi; +- +- u16 src_mac_lo; +- u16 dest_mac_lo; ++ u8 dest_mac[ETH_ALEN]; ++ u8 src_mac[ETH_ALEN]; ++ u16 vlan; + +- u32 src_mac_hi; ++ struct {} key_end; + + u32 ib2; + +- u32 _rsv[5]; +- +- u32 udf_tsid; + struct mtk_foe_mac_info l2; + }; + +@@ -235,13 +233,33 @@ enum { + MTK_PPE_CPU_REASON_INVALID = 0x1f, + }; + ++enum { ++ MTK_FLOW_TYPE_L4, ++ MTK_FLOW_TYPE_L2, ++ MTK_FLOW_TYPE_L2_SUBFLOW, ++}; ++ + struct mtk_flow_entry { ++ union { ++ struct hlist_node list; ++ struct { ++ struct rhash_head l2_node; ++ struct hlist_head l2_flows; ++ }; ++ }; ++ u8 type; ++ s8 wed_index; ++ u16 hash; ++ union { ++ struct mtk_foe_entry data; ++ struct { ++ struct mtk_flow_entry *base_flow; ++ struct hlist_node list; ++ struct {} end; ++ } l2_data; ++ }; + struct rhash_head node; +- struct hlist_node list; + unsigned long cookie; +- struct mtk_foe_entry data; +- u16 hash; +- s8 wed_index; + }; + + struct mtk_ppe { +@@ -256,6 +274,8 @@ struct mtk_ppe { + u16 foe_check_time[MTK_PPE_ENTRIES]; + struct hlist_head foe_flow[MTK_PPE_ENTRIES / 2]; + ++ struct rhashtable l2_flows; ++ + void *acct_table; + }; + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -31,6 +31,8 @@ struct mtk_flow_data { + __be16 src_port; + __be16 dst_port; + ++ u16 vlan_in; ++ + struct { + u16 id; + __be16 proto; +@@ -257,9 +259,45 @@ mtk_flow_offload_replace(struct mtk_eth + return -EOPNOTSUPP; + } + ++ switch (addr_type) { ++ case 0: ++ offload_type = MTK_PPE_PKT_TYPE_BRIDGE; ++ if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ETH_ADDRS)) { ++ struct flow_match_eth_addrs match; ++ ++ flow_rule_match_eth_addrs(rule, &match); ++ memcpy(data.eth.h_dest, match.key->dst, ETH_ALEN); ++ memcpy(data.eth.h_source, match.key->src, ETH_ALEN); ++ } else { ++ return -EOPNOTSUPP; ++ } ++ ++ if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_VLAN)) { ++ struct flow_match_vlan match; ++ ++ flow_rule_match_vlan(rule, &match); ++ ++ if (match.key->vlan_tpid != cpu_to_be16(ETH_P_8021Q)) ++ return -EOPNOTSUPP; ++ ++ data.vlan_in = match.key->vlan_id; ++ } ++ break; ++ case FLOW_DISSECTOR_KEY_IPV4_ADDRS: ++ offload_type = MTK_PPE_PKT_TYPE_IPV4_HNAPT; ++ break; ++ case FLOW_DISSECTOR_KEY_IPV6_ADDRS: ++ offload_type = MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T; ++ break; ++ default: ++ return -EOPNOTSUPP; ++ } ++ + flow_action_for_each(i, act, &rule->action) { + switch (act->id) { + case FLOW_ACTION_MANGLE: ++ if (offload_type == MTK_PPE_PKT_TYPE_BRIDGE) ++ return -EOPNOTSUPP; + if (act->mangle.htype == FLOW_ACT_MANGLE_HDR_TYPE_ETH) + mtk_flow_offload_mangle_eth(act, &data.eth); + break; +@@ -291,17 +329,6 @@ mtk_flow_offload_replace(struct mtk_eth + } + } + +- switch (addr_type) { +- case FLOW_DISSECTOR_KEY_IPV4_ADDRS: +- offload_type = MTK_PPE_PKT_TYPE_IPV4_HNAPT; +- break; +- case FLOW_DISSECTOR_KEY_IPV6_ADDRS: +- offload_type = MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T; +- break; +- default: +- return -EOPNOTSUPP; +- } +- + if (!is_valid_ether_addr(data.eth.h_source) || + !is_valid_ether_addr(data.eth.h_dest)) + return -EINVAL; +@@ -315,10 +342,13 @@ mtk_flow_offload_replace(struct mtk_eth + if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_PORTS)) { + struct flow_match_ports ports; + ++ if (offload_type == MTK_PPE_PKT_TYPE_BRIDGE) ++ return -EOPNOTSUPP; ++ + flow_rule_match_ports(rule, &ports); + data.src_port = ports.key->src; + data.dst_port = ports.key->dst; +- } else { ++ } else if (offload_type != MTK_PPE_PKT_TYPE_BRIDGE) { + return -EOPNOTSUPP; + } + +@@ -348,6 +378,9 @@ mtk_flow_offload_replace(struct mtk_eth + if (act->id != FLOW_ACTION_MANGLE) + continue; + ++ if (offload_type == MTK_PPE_PKT_TYPE_BRIDGE) ++ return -EOPNOTSUPP; ++ + switch (act->mangle.htype) { + case FLOW_ACT_MANGLE_HDR_TYPE_TCP: + case FLOW_ACT_MANGLE_HDR_TYPE_UDP: +@@ -373,6 +406,9 @@ mtk_flow_offload_replace(struct mtk_eth + return err; + } + ++ if (offload_type == MTK_PPE_PKT_TYPE_BRIDGE) ++ foe.bridge.vlan = data.vlan_in; ++ + if (data.vlan.num == 1) { + if (data.vlan.proto != htons(ETH_P_8021Q)) + return -EOPNOTSUPP; diff --git a/target/linux/generic/backport-5.15/702-v5.19-11-net-ethernet-mtk_eth_soc-wed-fix-sparse-endian-warni.patch b/target/linux/generic/backport-5.15/702-v5.19-11-net-ethernet-mtk_eth_soc-wed-fix-sparse-endian-warni.patch new file mode 100644 index 0000000000..8f3dfe8239 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-11-net-ethernet-mtk_eth_soc-wed-fix-sparse-endian-warni.patch @@ -0,0 +1,56 @@ +From: Felix Fietkau +Date: Fri, 8 Apr 2022 10:59:45 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc/wed: fix sparse endian warnings + +Descriptor fields are little-endian + +Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)") +Reported-by: kernel test robot +Signed-off-by: Felix Fietkau +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -144,16 +144,17 @@ mtk_wed_buffer_alloc(struct mtk_wed_devi + + for (s = 0; s < MTK_WED_BUF_PER_PAGE; s++) { + u32 txd_size; ++ u32 ctrl; + + txd_size = dev->wlan.init_buf(buf, buf_phys, token++); + +- desc->buf0 = buf_phys; +- desc->buf1 = buf_phys + txd_size; +- desc->ctrl = FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN0, +- txd_size) | +- FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN1, +- MTK_WED_BUF_SIZE - txd_size) | +- MTK_WDMA_DESC_CTRL_LAST_SEG1; ++ desc->buf0 = cpu_to_le32(buf_phys); ++ desc->buf1 = cpu_to_le32(buf_phys + txd_size); ++ ctrl = FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN0, txd_size) | ++ FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN1, ++ MTK_WED_BUF_SIZE - txd_size) | ++ MTK_WDMA_DESC_CTRL_LAST_SEG1; ++ desc->ctrl = cpu_to_le32(ctrl); + desc->info = 0; + desc++; + +@@ -184,12 +185,14 @@ mtk_wed_free_buffer(struct mtk_wed_devic + + for (i = 0, page_idx = 0; i < dev->buf_ring.size; i += MTK_WED_BUF_PER_PAGE) { + void *page = page_list[page_idx++]; ++ dma_addr_t buf_addr; + + if (!page) + break; + +- dma_unmap_page(dev->hw->dev, desc[i].buf0, +- PAGE_SIZE, DMA_BIDIRECTIONAL); ++ buf_addr = le32_to_cpu(desc[i].buf0); ++ dma_unmap_page(dev->hw->dev, buf_addr, PAGE_SIZE, ++ DMA_BIDIRECTIONAL); + __free_page(page); + } + diff --git a/target/linux/generic/backport-5.15/702-v5.19-12-net-ethernet-mtk_eth_soc-fix-return-value-check-in-m.patch b/target/linux/generic/backport-5.15/702-v5.19-12-net-ethernet-mtk_eth_soc-fix-return-value-check-in-m.patch new file mode 100644 index 0000000000..4ec8fe74bc --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-12-net-ethernet-mtk_eth_soc-fix-return-value-check-in-m.patch @@ -0,0 +1,25 @@ +From: Yang Yingliang +Date: Fri, 8 Apr 2022 11:22:46 +0800 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix return value check in + mtk_wed_add_hw() + +If syscon_regmap_lookup_by_phandle() fails, it never return NULL pointer, +change the check to IS_ERR(). + +Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)") +Reported-by: Hulk Robot +Signed-off-by: Yang Yingliang +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -816,7 +816,7 @@ void mtk_wed_add_hw(struct device_node * + return; + + regs = syscon_regmap_lookup_by_phandle(np, NULL); +- if (!regs) ++ if (IS_ERR(regs)) + return; + + rcu_assign_pointer(mtk_soc_wed_ops, &wed_ops); diff --git a/target/linux/generic/backport-5.15/702-v5.19-13-net-ethernet-mtk_eth_soc-use-standard-property-for-c.patch b/target/linux/generic/backport-5.15/702-v5.19-13-net-ethernet-mtk_eth_soc-use-standard-property-for-c.patch new file mode 100644 index 0000000000..fe5b9263df --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-13-net-ethernet-mtk_eth_soc-use-standard-property-for-c.patch @@ -0,0 +1,35 @@ +From: Lorenzo Bianconi +Date: Mon, 11 Apr 2022 12:13:25 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: use standard property for + cci-control-port + +Rely on standard cci-control-port property to identify CCI port +reference. +Update mt7622 dts binding. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi ++++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi +@@ -963,7 +963,7 @@ + power-domains = <&scpsys MT7622_POWER_DOMAIN_ETHSYS>; + mediatek,ethsys = <ðsys>; + mediatek,sgmiisys = <&sgmiisys>; +- mediatek,cci-control = <&cci_control2>; ++ cci-control-port = <&cci_control2>; + mediatek,wed = <&wed0>, <&wed1>; + mediatek,pcie-mirror = <&pcie_mirror>; + mediatek,hifsys = <&hifsys>; +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3184,7 +3184,7 @@ static int mtk_probe(struct platform_dev + struct regmap *cci; + + cci = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, +- "mediatek,cci-control"); ++ "cci-control-port"); + /* enable CPU/bus coherency */ + if (!IS_ERR(cci)) + regmap_write(cci, 0, 3); diff --git a/target/linux/generic/backport-5.15/702-v5.19-14-net-ethernet-mtk_eth_soc-use-after-free-in-__mtk_ppe.patch b/target/linux/generic/backport-5.15/702-v5.19-14-net-ethernet-mtk_eth_soc-use-after-free-in-__mtk_ppe.patch new file mode 100644 index 0000000000..656b3a159e --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-14-net-ethernet-mtk_eth_soc-use-after-free-in-__mtk_ppe.patch @@ -0,0 +1,33 @@ +From: Dan Carpenter +Date: Tue, 12 Apr 2022 12:24:19 +0300 +Subject: [PATCH] net: ethernet: mtk_eth_soc: use after free in + __mtk_ppe_check_skb() + +The __mtk_foe_entry_clear() function frees "entry" so we have to use +the _safe() version of hlist_for_each_entry() to prevent a use after +free. + +Fixes: 33fc42de3327 ("net: ethernet: mtk_eth_soc: support creating mac address based offload entries") +Signed-off-by: Dan Carpenter +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -600,6 +600,7 @@ void __mtk_ppe_check_skb(struct mtk_ppe + struct mtk_foe_entry *hwe = &ppe->foe_table[hash]; + struct mtk_flow_entry *entry; + struct mtk_foe_bridge key = {}; ++ struct hlist_node *n; + struct ethhdr *eh; + bool found = false; + u8 *tag; +@@ -609,7 +610,7 @@ void __mtk_ppe_check_skb(struct mtk_ppe + if (FIELD_GET(MTK_FOE_IB1_STATE, hwe->ib1) == MTK_FOE_STATE_BIND) + goto out; + +- hlist_for_each_entry(entry, head, list) { ++ hlist_for_each_entry_safe(entry, n, head, list) { + if (entry->type == MTK_FLOW_TYPE_L2_SUBFLOW) { + if (unlikely(FIELD_GET(MTK_FOE_IB1_STATE, hwe->ib1) == + MTK_FOE_STATE_BIND)) diff --git a/target/linux/generic/backport-5.15/702-v5.19-15-net-ethernet-mtk_eth_soc-add-check-for-allocation-fa.patch b/target/linux/generic/backport-5.15/702-v5.19-15-net-ethernet-mtk_eth_soc-add-check-for-allocation-fa.patch new file mode 100644 index 0000000000..714163c86b --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-15-net-ethernet-mtk_eth_soc-add-check-for-allocation-fa.patch @@ -0,0 +1,22 @@ +From: Dan Carpenter +Date: Thu, 21 Apr 2022 18:49:02 +0300 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add check for allocation failure + +Check if the kzalloc() failed. + +Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)") +Signed-off-by: Dan Carpenter +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -827,6 +827,8 @@ void mtk_wed_add_hw(struct device_node * + goto unlock; + + hw = kzalloc(sizeof(*hw), GFP_KERNEL); ++ if (!hw) ++ goto unlock; + hw->node = np; + hw->regs = regs; + hw->eth = eth; diff --git a/target/linux/generic/backport-5.15/702-v5.19-16-eth-mtk_eth_soc-silence-the-GCC-12-array-bounds-warn.patch b/target/linux/generic/backport-5.15/702-v5.19-16-eth-mtk_eth_soc-silence-the-GCC-12-array-bounds-warn.patch new file mode 100644 index 0000000000..aa98745ac6 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-16-eth-mtk_eth_soc-silence-the-GCC-12-array-bounds-warn.patch @@ -0,0 +1,26 @@ +From: Jakub Kicinski +Date: Fri, 20 May 2022 12:56:03 -0700 +Subject: [PATCH] eth: mtk_eth_soc: silence the GCC 12 array-bounds warning + +GCC 12 gets upset because in mtk_foe_entry_commit_subflow() +this driver allocates a partial structure. The writes are +within bounds. + +Silence these warnings for now, our build bot runs GCC 12 +so we won't allow any new instances. + +Signed-off-by: Jakub Kicinski +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/Makefile ++++ b/drivers/net/ethernet/mediatek/Makefile +@@ -11,3 +11,8 @@ mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) + + endif + obj-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_ops.o + obj-$(CONFIG_NET_MEDIATEK_STAR_EMAC) += mtk_star_emac.o ++ ++# FIXME: temporarily silence -Warray-bounds on non W=1+ builds ++ifndef KBUILD_EXTRA_WARN ++CFLAGS_mtk_ppe.o += -Wno-array-bounds ++endif diff --git a/target/linux/generic/backport-5.15/702-v5.19-17-net-ethernet-mtk_eth_soc-rely-on-GFP_KERNEL-for-dma_.patch b/target/linux/generic/backport-5.15/702-v5.19-17-net-ethernet-mtk_eth_soc-rely-on-GFP_KERNEL-for-dma_.patch new file mode 100644 index 0000000000..9b6321f1da --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-17-net-ethernet-mtk_eth_soc-rely-on-GFP_KERNEL-for-dma_.patch @@ -0,0 +1,52 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:26 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: rely on GFP_KERNEL for + dma_alloc_coherent whenever possible + +Rely on GFP_KERNEL for dma descriptors mappings in mtk_tx_alloc(), +mtk_rx_alloc() and mtk_init_fq_dma() since they are run in non-irq +context. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -846,7 +846,7 @@ static int mtk_init_fq_dma(struct mtk_et + eth->scratch_ring = dma_alloc_coherent(eth->dma_dev, + cnt * sizeof(struct mtk_tx_dma), + ð->phy_scratch_ring, +- GFP_ATOMIC); ++ GFP_KERNEL); + if (unlikely(!eth->scratch_ring)) + return -ENOMEM; + +@@ -1624,7 +1624,7 @@ static int mtk_tx_alloc(struct mtk_eth * + goto no_tx_mem; + + ring->dma = dma_alloc_coherent(eth->dma_dev, MTK_DMA_SIZE * sz, +- &ring->phys, GFP_ATOMIC); ++ &ring->phys, GFP_KERNEL); + if (!ring->dma) + goto no_tx_mem; + +@@ -1642,8 +1642,7 @@ static int mtk_tx_alloc(struct mtk_eth * + */ + if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { + ring->dma_pdma = dma_alloc_coherent(eth->dma_dev, MTK_DMA_SIZE * sz, +- &ring->phys_pdma, +- GFP_ATOMIC); ++ &ring->phys_pdma, GFP_KERNEL); + if (!ring->dma_pdma) + goto no_tx_mem; + +@@ -1758,7 +1757,7 @@ static int mtk_rx_alloc(struct mtk_eth * + + ring->dma = dma_alloc_coherent(eth->dma_dev, + rx_dma_size * sizeof(*ring->dma), +- &ring->phys, GFP_ATOMIC); ++ &ring->phys, GFP_KERNEL); + if (!ring->dma) + return -ENOMEM; + diff --git a/target/linux/generic/backport-5.15/702-v5.19-18-net-ethernet-mtk_eth_soc-move-tx-dma-desc-configurat.patch b/target/linux/generic/backport-5.15/702-v5.19-18-net-ethernet-mtk_eth_soc-move-tx-dma-desc-configurat.patch new file mode 100644 index 0000000000..8e16ea2556 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-18-net-ethernet-mtk_eth_soc-move-tx-dma-desc-configurat.patch @@ -0,0 +1,206 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:27 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: move tx dma desc configuration in + mtk_tx_set_dma_desc + +Move tx dma descriptor configuration in mtk_tx_set_dma_desc routine. +This is a preliminary patch to introduce mt7986 ethernet support since +it relies on a different tx dma descriptor layout. + +Tested-by: Sam Shih +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -972,18 +972,51 @@ static void setup_tx_buf(struct mtk_eth + } + } + ++static void mtk_tx_set_dma_desc(struct net_device *dev, struct mtk_tx_dma *desc, ++ struct mtk_tx_dma_desc_info *info) ++{ ++ struct mtk_mac *mac = netdev_priv(dev); ++ u32 data; ++ ++ WRITE_ONCE(desc->txd1, info->addr); ++ ++ data = TX_DMA_SWC | TX_DMA_PLEN0(info->size); ++ if (info->last) ++ data |= TX_DMA_LS0; ++ WRITE_ONCE(desc->txd3, data); ++ ++ data = (mac->id + 1) << TX_DMA_FPORT_SHIFT; /* forward port */ ++ if (info->first) { ++ if (info->gso) ++ data |= TX_DMA_TSO; ++ /* tx checksum offload */ ++ if (info->csum) ++ data |= TX_DMA_CHKSUM; ++ /* vlan header offload */ ++ if (info->vlan) ++ data |= TX_DMA_INS_VLAN | info->vlan_tci; ++ } ++ WRITE_ONCE(desc->txd4, data); ++} ++ + static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, + int tx_num, struct mtk_tx_ring *ring, bool gso) + { ++ struct mtk_tx_dma_desc_info txd_info = { ++ .size = skb_headlen(skb), ++ .gso = gso, ++ .csum = skb->ip_summed == CHECKSUM_PARTIAL, ++ .vlan = skb_vlan_tag_present(skb), ++ .vlan_tci = skb_vlan_tag_get(skb), ++ .first = true, ++ .last = !skb_is_nonlinear(skb), ++ }; + struct mtk_mac *mac = netdev_priv(dev); + struct mtk_eth *eth = mac->hw; + struct mtk_tx_dma *itxd, *txd; + struct mtk_tx_dma *itxd_pdma, *txd_pdma; + struct mtk_tx_buf *itx_buf, *tx_buf; +- dma_addr_t mapped_addr; +- unsigned int nr_frags; + int i, n_desc = 1; +- u32 txd4 = 0, fport; + int k = 0; + + itxd = ring->next_free; +@@ -991,49 +1024,32 @@ static int mtk_tx_map(struct sk_buff *sk + if (itxd == ring->last_free) + return -ENOMEM; + +- /* set the forward port */ +- fport = (mac->id + 1) << TX_DMA_FPORT_SHIFT; +- txd4 |= fport; +- + itx_buf = mtk_desc_to_tx_buf(ring, itxd); + memset(itx_buf, 0, sizeof(*itx_buf)); + +- if (gso) +- txd4 |= TX_DMA_TSO; +- +- /* TX Checksum offload */ +- if (skb->ip_summed == CHECKSUM_PARTIAL) +- txd4 |= TX_DMA_CHKSUM; +- +- /* VLAN header offload */ +- if (skb_vlan_tag_present(skb)) +- txd4 |= TX_DMA_INS_VLAN | skb_vlan_tag_get(skb); +- +- mapped_addr = dma_map_single(eth->dma_dev, skb->data, +- skb_headlen(skb), DMA_TO_DEVICE); +- if (unlikely(dma_mapping_error(eth->dma_dev, mapped_addr))) ++ txd_info.addr = dma_map_single(eth->dma_dev, skb->data, txd_info.size, ++ DMA_TO_DEVICE); ++ if (unlikely(dma_mapping_error(eth->dma_dev, txd_info.addr))) + return -ENOMEM; + +- WRITE_ONCE(itxd->txd1, mapped_addr); ++ mtk_tx_set_dma_desc(dev, itxd, &txd_info); ++ + itx_buf->flags |= MTK_TX_FLAGS_SINGLE0; + itx_buf->flags |= (!mac->id) ? MTK_TX_FLAGS_FPORT0 : + MTK_TX_FLAGS_FPORT1; +- setup_tx_buf(eth, itx_buf, itxd_pdma, mapped_addr, skb_headlen(skb), ++ setup_tx_buf(eth, itx_buf, itxd_pdma, txd_info.addr, txd_info.size, + k++); + + /* TX SG offload */ + txd = itxd; + txd_pdma = qdma_to_pdma(ring, txd); +- nr_frags = skb_shinfo(skb)->nr_frags; + +- for (i = 0; i < nr_frags; i++) { ++ for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; + unsigned int offset = 0; + int frag_size = skb_frag_size(frag); + + while (frag_size) { +- bool last_frag = false; +- unsigned int frag_map_size; + bool new_desc = true; + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA) || +@@ -1048,23 +1064,17 @@ static int mtk_tx_map(struct sk_buff *sk + new_desc = false; + } + +- +- frag_map_size = min(frag_size, MTK_TX_DMA_BUF_LEN); +- mapped_addr = skb_frag_dma_map(eth->dma_dev, frag, offset, +- frag_map_size, +- DMA_TO_DEVICE); +- if (unlikely(dma_mapping_error(eth->dma_dev, mapped_addr))) ++ memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info)); ++ txd_info.size = min(frag_size, MTK_TX_DMA_BUF_LEN); ++ txd_info.last = i == skb_shinfo(skb)->nr_frags - 1 && ++ !(frag_size - txd_info.size); ++ txd_info.addr = skb_frag_dma_map(eth->dma_dev, frag, ++ offset, txd_info.size, ++ DMA_TO_DEVICE); ++ if (unlikely(dma_mapping_error(eth->dma_dev, txd_info.addr))) + goto err_dma; + +- if (i == nr_frags - 1 && +- (frag_size - frag_map_size) == 0) +- last_frag = true; +- +- WRITE_ONCE(txd->txd1, mapped_addr); +- WRITE_ONCE(txd->txd3, (TX_DMA_SWC | +- TX_DMA_PLEN0(frag_map_size) | +- last_frag * TX_DMA_LS0)); +- WRITE_ONCE(txd->txd4, fport); ++ mtk_tx_set_dma_desc(dev, txd, &txd_info); + + tx_buf = mtk_desc_to_tx_buf(ring, txd); + if (new_desc) +@@ -1074,20 +1084,17 @@ static int mtk_tx_map(struct sk_buff *sk + tx_buf->flags |= (!mac->id) ? MTK_TX_FLAGS_FPORT0 : + MTK_TX_FLAGS_FPORT1; + +- setup_tx_buf(eth, tx_buf, txd_pdma, mapped_addr, +- frag_map_size, k++); ++ setup_tx_buf(eth, tx_buf, txd_pdma, txd_info.addr, ++ txd_info.size, k++); + +- frag_size -= frag_map_size; +- offset += frag_map_size; ++ frag_size -= txd_info.size; ++ offset += txd_info.size; + } + } + + /* store skb to cleanup */ + itx_buf->skb = skb; + +- WRITE_ONCE(itxd->txd4, txd4); +- WRITE_ONCE(itxd->txd3, (TX_DMA_SWC | TX_DMA_PLEN0(skb_headlen(skb)) | +- (!nr_frags * TX_DMA_LS0))); + if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { + if (k & 0x1) + txd_pdma->txd2 |= TX_DMA_LS0; +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -843,6 +843,17 @@ enum mkt_eth_capabilities { + MTK_MUX_U3_GMAC2_TO_QPHY | \ + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA) + ++struct mtk_tx_dma_desc_info { ++ dma_addr_t addr; ++ u32 size; ++ u16 vlan_tci; ++ u8 gso:1; ++ u8 csum:1; ++ u8 vlan:1; ++ u8 first:1; ++ u8 last:1; ++}; ++ + /* struct mtk_eth_data - This is the structure holding all differences + * among various plaforms + * @ana_rgc3: The offset for register ANA_RGC3 related to diff --git a/target/linux/generic/backport-5.15/702-v5.19-19-net-ethernet-mtk_eth_soc-add-txd_size-to-mtk_soc_dat.patch b/target/linux/generic/backport-5.15/702-v5.19-19-net-ethernet-mtk_eth_soc-add-txd_size-to-mtk_soc_dat.patch new file mode 100644 index 0000000000..cadebbfa75 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-19-net-ethernet-mtk_eth_soc-add-txd_size-to-mtk_soc_dat.patch @@ -0,0 +1,167 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:28 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add txd_size to mtk_soc_data + +In order to remove mtk_tx_dma size dependency, introduce txd_size in +mtk_soc_data data structure. Rely on txd_size in mtk_init_fq_dma() and +mtk_dma_free() routines. +This is a preliminary patch to add mt7986 ethernet support. + +Tested-by: Sam Shih +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -838,20 +838,20 @@ static void *mtk_max_lro_buf_alloc(gfp_t + /* the qdma core needs scratch memory to be setup */ + static int mtk_init_fq_dma(struct mtk_eth *eth) + { ++ const struct mtk_soc_data *soc = eth->soc; + dma_addr_t phy_ring_tail; + int cnt = MTK_DMA_SIZE; + dma_addr_t dma_addr; + int i; + + eth->scratch_ring = dma_alloc_coherent(eth->dma_dev, +- cnt * sizeof(struct mtk_tx_dma), ++ cnt * soc->txrx.txd_size, + ð->phy_scratch_ring, + GFP_KERNEL); + if (unlikely(!eth->scratch_ring)) + return -ENOMEM; + +- eth->scratch_head = kcalloc(cnt, MTK_QDMA_PAGE_SIZE, +- GFP_KERNEL); ++ eth->scratch_head = kcalloc(cnt, MTK_QDMA_PAGE_SIZE, GFP_KERNEL); + if (unlikely(!eth->scratch_head)) + return -ENOMEM; + +@@ -861,16 +861,19 @@ static int mtk_init_fq_dma(struct mtk_et + if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) + return -ENOMEM; + +- phy_ring_tail = eth->phy_scratch_ring + +- (sizeof(struct mtk_tx_dma) * (cnt - 1)); ++ phy_ring_tail = eth->phy_scratch_ring + soc->txrx.txd_size * (cnt - 1); + + for (i = 0; i < cnt; i++) { +- eth->scratch_ring[i].txd1 = +- (dma_addr + (i * MTK_QDMA_PAGE_SIZE)); ++ struct mtk_tx_dma *txd; ++ ++ txd = (void *)eth->scratch_ring + i * soc->txrx.txd_size; ++ txd->txd1 = dma_addr + i * MTK_QDMA_PAGE_SIZE; + if (i < cnt - 1) +- eth->scratch_ring[i].txd2 = (eth->phy_scratch_ring + +- ((i + 1) * sizeof(struct mtk_tx_dma))); +- eth->scratch_ring[i].txd3 = TX_DMA_SDL(MTK_QDMA_PAGE_SIZE); ++ txd->txd2 = eth->phy_scratch_ring + ++ (i + 1) * soc->txrx.txd_size; ++ ++ txd->txd3 = TX_DMA_PLEN0(MTK_QDMA_PAGE_SIZE); ++ txd->txd4 = 0; + } + + mtk_w32(eth, eth->phy_scratch_ring, MTK_QDMA_FQ_HEAD); +@@ -2173,6 +2176,7 @@ static int mtk_dma_init(struct mtk_eth * + + static void mtk_dma_free(struct mtk_eth *eth) + { ++ const struct mtk_soc_data *soc = eth->soc; + int i; + + for (i = 0; i < MTK_MAC_COUNT; i++) +@@ -2180,9 +2184,8 @@ static void mtk_dma_free(struct mtk_eth + netdev_reset_queue(eth->netdev[i]); + if (eth->scratch_ring) { + dma_free_coherent(eth->dma_dev, +- MTK_DMA_SIZE * sizeof(struct mtk_tx_dma), +- eth->scratch_ring, +- eth->phy_scratch_ring); ++ MTK_DMA_SIZE * soc->txrx.txd_size, ++ eth->scratch_ring, eth->phy_scratch_ring); + eth->scratch_ring = NULL; + eth->phy_scratch_ring = 0; + } +@@ -3387,6 +3390,9 @@ static const struct mtk_soc_data mt2701_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7623_CLKS_BITMAP, + .required_pctl = true, ++ .txrx = { ++ .txd_size = sizeof(struct mtk_tx_dma), ++ }, + }; + + static const struct mtk_soc_data mt7621_data = { +@@ -3395,6 +3401,9 @@ static const struct mtk_soc_data mt7621_ + .required_clks = MT7621_CLKS_BITMAP, + .required_pctl = false, + .offload_version = 2, ++ .txrx = { ++ .txd_size = sizeof(struct mtk_tx_dma), ++ }, + }; + + static const struct mtk_soc_data mt7622_data = { +@@ -3404,6 +3413,9 @@ static const struct mtk_soc_data mt7622_ + .required_clks = MT7622_CLKS_BITMAP, + .required_pctl = false, + .offload_version = 2, ++ .txrx = { ++ .txd_size = sizeof(struct mtk_tx_dma), ++ }, + }; + + static const struct mtk_soc_data mt7623_data = { +@@ -3412,6 +3424,9 @@ static const struct mtk_soc_data mt7623_ + .required_clks = MT7623_CLKS_BITMAP, + .required_pctl = true, + .offload_version = 2, ++ .txrx = { ++ .txd_size = sizeof(struct mtk_tx_dma), ++ }, + }; + + static const struct mtk_soc_data mt7629_data = { +@@ -3420,6 +3435,9 @@ static const struct mtk_soc_data mt7629_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7629_CLKS_BITMAP, + .required_pctl = false, ++ .txrx = { ++ .txd_size = sizeof(struct mtk_tx_dma), ++ }, + }; + + static const struct mtk_soc_data rt5350_data = { +@@ -3427,6 +3445,9 @@ static const struct mtk_soc_data rt5350_ + .hw_features = MTK_HW_FEATURES_MT7628, + .required_clks = MT7628_CLKS_BITMAP, + .required_pctl = false, ++ .txrx = { ++ .txd_size = sizeof(struct mtk_tx_dma), ++ }, + }; + + const struct of_device_id of_mtk_match[] = { +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -864,6 +864,7 @@ struct mtk_tx_dma_desc_info { + * the target SoC + * @required_pctl A bool value to show whether the SoC requires + * the extra setup for those pins used by GMAC. ++ * @txd_size Tx DMA descriptor size. + */ + struct mtk_soc_data { + u32 ana_rgc3; +@@ -872,6 +873,9 @@ struct mtk_soc_data { + bool required_pctl; + u8 offload_version; + netdev_features_t hw_features; ++ struct { ++ u32 txd_size; ++ } txrx; + }; + + /* currently no SoC has more than 2 macs */ diff --git a/target/linux/generic/backport-5.15/702-v5.19-20-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-mtk_tx_.patch b/target/linux/generic/backport-5.15/702-v5.19-20-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-mtk_tx_.patch new file mode 100644 index 0000000000..ebe1ee3d59 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-20-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-mtk_tx_.patch @@ -0,0 +1,78 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:29 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: rely on txd_size in + mtk_tx_alloc/mtk_tx_clean + +This is a preliminary patch to add mt7986 ethernet support. + +Tested-by: Sam Shih +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1625,8 +1625,10 @@ static int mtk_napi_rx(struct napi_struc + + static int mtk_tx_alloc(struct mtk_eth *eth) + { ++ const struct mtk_soc_data *soc = eth->soc; + struct mtk_tx_ring *ring = ð->tx_ring; +- int i, sz = sizeof(*ring->dma); ++ int i, sz = soc->txrx.txd_size; ++ struct mtk_tx_dma *txd; + + ring->buf = kcalloc(MTK_DMA_SIZE, sizeof(*ring->buf), + GFP_KERNEL); +@@ -1642,8 +1644,10 @@ static int mtk_tx_alloc(struct mtk_eth * + int next = (i + 1) % MTK_DMA_SIZE; + u32 next_ptr = ring->phys + next * sz; + +- ring->dma[i].txd2 = next_ptr; +- ring->dma[i].txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; ++ txd = (void *)ring->dma + i * sz; ++ txd->txd2 = next_ptr; ++ txd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; ++ txd->txd4 = 0; + } + + /* On MT7688 (PDMA only) this driver uses the ring->dma structs +@@ -1665,7 +1669,7 @@ static int mtk_tx_alloc(struct mtk_eth * + ring->dma_size = MTK_DMA_SIZE; + atomic_set(&ring->free_count, MTK_DMA_SIZE - 2); + ring->next_free = &ring->dma[0]; +- ring->last_free = &ring->dma[MTK_DMA_SIZE - 1]; ++ ring->last_free = (void *)txd; + ring->last_free_ptr = (u32)(ring->phys + ((MTK_DMA_SIZE - 1) * sz)); + ring->thresh = MAX_SKB_FRAGS; + +@@ -1698,6 +1702,7 @@ no_tx_mem: + + static void mtk_tx_clean(struct mtk_eth *eth) + { ++ const struct mtk_soc_data *soc = eth->soc; + struct mtk_tx_ring *ring = ð->tx_ring; + int i; + +@@ -1710,17 +1715,15 @@ static void mtk_tx_clean(struct mtk_eth + + if (ring->dma) { + dma_free_coherent(eth->dma_dev, +- MTK_DMA_SIZE * sizeof(*ring->dma), +- ring->dma, +- ring->phys); ++ MTK_DMA_SIZE * soc->txrx.txd_size, ++ ring->dma, ring->phys); + ring->dma = NULL; + } + + if (ring->dma_pdma) { + dma_free_coherent(eth->dma_dev, +- MTK_DMA_SIZE * sizeof(*ring->dma_pdma), +- ring->dma_pdma, +- ring->phys_pdma); ++ MTK_DMA_SIZE * soc->txrx.txd_size, ++ ring->dma_pdma, ring->phys_pdma); + ring->dma_pdma = NULL; + } + } diff --git a/target/linux/generic/backport-5.15/702-v5.19-21-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-mtk_des.patch b/target/linux/generic/backport-5.15/702-v5.19-21-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-mtk_des.patch new file mode 100644 index 0000000000..053412e749 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-21-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-mtk_des.patch @@ -0,0 +1,109 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:30 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: rely on txd_size in + mtk_desc_to_tx_buf + +This is a preliminary patch to add mt7986 ethernet support. + +Tested-by: Sam Shih +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -891,10 +891,11 @@ static inline void *mtk_qdma_phys_to_vir + return ret + (desc - ring->phys); + } + +-static inline struct mtk_tx_buf *mtk_desc_to_tx_buf(struct mtk_tx_ring *ring, +- struct mtk_tx_dma *txd) ++static struct mtk_tx_buf *mtk_desc_to_tx_buf(struct mtk_tx_ring *ring, ++ struct mtk_tx_dma *txd, ++ u32 txd_size) + { +- int idx = txd - ring->dma; ++ int idx = ((void *)txd - (void *)ring->dma) / txd_size; + + return &ring->buf[idx]; + } +@@ -1016,6 +1017,7 @@ static int mtk_tx_map(struct sk_buff *sk + }; + struct mtk_mac *mac = netdev_priv(dev); + struct mtk_eth *eth = mac->hw; ++ const struct mtk_soc_data *soc = eth->soc; + struct mtk_tx_dma *itxd, *txd; + struct mtk_tx_dma *itxd_pdma, *txd_pdma; + struct mtk_tx_buf *itx_buf, *tx_buf; +@@ -1027,7 +1029,7 @@ static int mtk_tx_map(struct sk_buff *sk + if (itxd == ring->last_free) + return -ENOMEM; + +- itx_buf = mtk_desc_to_tx_buf(ring, itxd); ++ itx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->txrx.txd_size); + memset(itx_buf, 0, sizeof(*itx_buf)); + + txd_info.addr = dma_map_single(eth->dma_dev, skb->data, txd_info.size, +@@ -1055,7 +1057,7 @@ static int mtk_tx_map(struct sk_buff *sk + while (frag_size) { + bool new_desc = true; + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA) || ++ if (MTK_HAS_CAPS(soc->caps, MTK_QDMA) || + (i & 0x1)) { + txd = mtk_qdma_phys_to_virt(ring, txd->txd2); + txd_pdma = qdma_to_pdma(ring, txd); +@@ -1079,7 +1081,8 @@ static int mtk_tx_map(struct sk_buff *sk + + mtk_tx_set_dma_desc(dev, txd, &txd_info); + +- tx_buf = mtk_desc_to_tx_buf(ring, txd); ++ tx_buf = mtk_desc_to_tx_buf(ring, txd, ++ soc->txrx.txd_size); + if (new_desc) + memset(tx_buf, 0, sizeof(*tx_buf)); + tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC; +@@ -1098,7 +1101,7 @@ static int mtk_tx_map(struct sk_buff *sk + /* store skb to cleanup */ + itx_buf->skb = skb; + +- if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { ++ if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { + if (k & 0x1) + txd_pdma->txd2 |= TX_DMA_LS0; + else +@@ -1116,7 +1119,7 @@ static int mtk_tx_map(struct sk_buff *sk + */ + wmb(); + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { ++ if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { + if (netif_xmit_stopped(netdev_get_tx_queue(dev, 0)) || + !netdev_xmit_more()) + mtk_w32(eth, txd->txd2, MTK_QTX_CTX_PTR); +@@ -1130,13 +1133,13 @@ static int mtk_tx_map(struct sk_buff *sk + + err_dma: + do { +- tx_buf = mtk_desc_to_tx_buf(ring, itxd); ++ tx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->txrx.txd_size); + + /* unmap dma */ + mtk_tx_unmap(eth, tx_buf, false); + + itxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; +- if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) ++ if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) + itxd_pdma->txd2 = TX_DMA_DESP2_DEF; + + itxd = mtk_qdma_phys_to_virt(ring, itxd->txd2); +@@ -1450,7 +1453,8 @@ static int mtk_poll_tx_qdma(struct mtk_e + if ((desc->txd3 & TX_DMA_OWNER_CPU) == 0) + break; + +- tx_buf = mtk_desc_to_tx_buf(ring, desc); ++ tx_buf = mtk_desc_to_tx_buf(ring, desc, ++ eth->soc->txrx.txd_size); + if (tx_buf->flags & MTK_TX_FLAGS_FPORT1) + mac = 1; + diff --git a/target/linux/generic/backport-5.15/702-v5.19-22-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-txd_to_.patch b/target/linux/generic/backport-5.15/702-v5.19-22-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-txd_to_.patch new file mode 100644 index 0000000000..251d583f29 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-22-net-ethernet-mtk_eth_soc-rely-on-txd_size-in-txd_to_.patch @@ -0,0 +1,39 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:31 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: rely on txd_size in txd_to_idx + +This is a preliminary patch to add mt7986 ethernet support. + +Tested-by: Sam Shih +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -906,9 +906,10 @@ static struct mtk_tx_dma *qdma_to_pdma(s + return ring->dma_pdma - ring->dma + dma; + } + +-static int txd_to_idx(struct mtk_tx_ring *ring, struct mtk_tx_dma *dma) ++static int txd_to_idx(struct mtk_tx_ring *ring, struct mtk_tx_dma *dma, ++ u32 txd_size) + { +- return ((void *)dma - (void *)ring->dma) / sizeof(*dma); ++ return ((void *)dma - (void *)ring->dma) / txd_size; + } + + static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf, +@@ -1124,8 +1125,10 @@ static int mtk_tx_map(struct sk_buff *sk + !netdev_xmit_more()) + mtk_w32(eth, txd->txd2, MTK_QTX_CTX_PTR); + } else { +- int next_idx = NEXT_DESP_IDX(txd_to_idx(ring, txd), +- ring->dma_size); ++ int next_idx; ++ ++ next_idx = NEXT_DESP_IDX(txd_to_idx(ring, txd, soc->txrx.txd_size), ++ ring->dma_size); + mtk_w32(eth, next_idx, MT7628_TX_CTX_IDX0); + } + diff --git a/target/linux/generic/backport-5.15/702-v5.19-23-net-ethernet-mtk_eth_soc-add-rxd_size-to-mtk_soc_dat.patch b/target/linux/generic/backport-5.15/702-v5.19-23-net-ethernet-mtk_eth_soc-add-rxd_size-to-mtk_soc_dat.patch new file mode 100644 index 0000000000..525882c956 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-23-net-ethernet-mtk_eth_soc-add-rxd_size-to-mtk_soc_dat.patch @@ -0,0 +1,102 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:32 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add rxd_size to mtk_soc_data + +Similar to tx counterpart, introduce rxd_size in mtk_soc_data data +structure. +This is a preliminary patch to add mt7986 ethernet support. + +Tested-by: Sam Shih +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1776,7 +1776,7 @@ static int mtk_rx_alloc(struct mtk_eth * + } + + ring->dma = dma_alloc_coherent(eth->dma_dev, +- rx_dma_size * sizeof(*ring->dma), ++ rx_dma_size * eth->soc->txrx.rxd_size, + &ring->phys, GFP_KERNEL); + if (!ring->dma) + return -ENOMEM; +@@ -1834,9 +1834,8 @@ static void mtk_rx_clean(struct mtk_eth + + if (ring->dma) { + dma_free_coherent(eth->dma_dev, +- ring->dma_size * sizeof(*ring->dma), +- ring->dma, +- ring->phys); ++ ring->dma_size * eth->soc->txrx.rxd_size, ++ ring->dma, ring->phys); + ring->dma = NULL; + } + } +@@ -3402,6 +3401,7 @@ static const struct mtk_soc_data mt2701_ + .required_pctl = true, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), ++ .rxd_size = sizeof(struct mtk_rx_dma), + }, + }; + +@@ -3413,6 +3413,7 @@ static const struct mtk_soc_data mt7621_ + .offload_version = 2, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), ++ .rxd_size = sizeof(struct mtk_rx_dma), + }, + }; + +@@ -3425,6 +3426,7 @@ static const struct mtk_soc_data mt7622_ + .offload_version = 2, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), ++ .rxd_size = sizeof(struct mtk_rx_dma), + }, + }; + +@@ -3436,6 +3438,7 @@ static const struct mtk_soc_data mt7623_ + .offload_version = 2, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), ++ .rxd_size = sizeof(struct mtk_rx_dma), + }, + }; + +@@ -3447,6 +3450,7 @@ static const struct mtk_soc_data mt7629_ + .required_pctl = false, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), ++ .rxd_size = sizeof(struct mtk_rx_dma), + }, + }; + +@@ -3457,6 +3461,7 @@ static const struct mtk_soc_data rt5350_ + .required_pctl = false, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), ++ .rxd_size = sizeof(struct mtk_rx_dma), + }, + }; + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -865,6 +865,7 @@ struct mtk_tx_dma_desc_info { + * @required_pctl A bool value to show whether the SoC requires + * the extra setup for those pins used by GMAC. + * @txd_size Tx DMA descriptor size. ++ * @rxd_size Rx DMA descriptor size. + */ + struct mtk_soc_data { + u32 ana_rgc3; +@@ -875,6 +876,7 @@ struct mtk_soc_data { + netdev_features_t hw_features; + struct { + u32 txd_size; ++ u32 rxd_size; + } txrx; + }; + diff --git a/target/linux/generic/backport-5.15/702-v5.19-24-net-ethernet-mtk_eth_soc-rely-on-txd_size-field-in-m.patch b/target/linux/generic/backport-5.15/702-v5.19-24-net-ethernet-mtk_eth_soc-rely-on-txd_size-field-in-m.patch new file mode 100644 index 0000000000..eb92b8c7a2 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-24-net-ethernet-mtk_eth_soc-rely-on-txd_size-field-in-m.patch @@ -0,0 +1,46 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:33 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: rely on txd_size field in + mtk_poll_tx/mtk_poll_rx + +This is a preliminary to ad mt7986 ethernet support. + +Tested-by: Sam Shih +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1265,9 +1265,12 @@ static struct mtk_rx_ring *mtk_get_rx_ri + return ð->rx_ring[0]; + + for (i = 0; i < MTK_MAX_RX_RING_NUM; i++) { ++ struct mtk_rx_dma *rxd; ++ + ring = ð->rx_ring[i]; + idx = NEXT_DESP_IDX(ring->calc_idx, ring->dma_size); +- if (ring->dma[idx].rxd2 & RX_DMA_DONE) { ++ rxd = (void *)ring->dma + idx * eth->soc->txrx.rxd_size; ++ if (rxd->rxd2 & RX_DMA_DONE) { + ring->calc_idx_update = true; + return ring; + } +@@ -1318,7 +1321,7 @@ static int mtk_poll_rx(struct napi_struc + goto rx_done; + + idx = NEXT_DESP_IDX(ring->calc_idx, ring->dma_size); +- rxd = &ring->dma[idx]; ++ rxd = (void *)ring->dma + idx * eth->soc->txrx.rxd_size; + data = ring->data[idx]; + + if (!mtk_rx_get_desc(&trxd, rxd)) +@@ -1510,7 +1513,7 @@ static int mtk_poll_tx_pdma(struct mtk_e + + mtk_tx_unmap(eth, tx_buf, true); + +- desc = &ring->dma[cpu]; ++ desc = (void *)ring->dma + cpu * eth->soc->txrx.txd_size; + ring->last_free = desc; + atomic_inc(&ring->free_count); + diff --git a/target/linux/generic/backport-5.15/702-v5.19-25-net-ethernet-mtk_eth_soc-rely-on-rxd_size-field-in-m.patch b/target/linux/generic/backport-5.15/702-v5.19-25-net-ethernet-mtk_eth_soc-rely-on-rxd_size-field-in-m.patch new file mode 100644 index 0000000000..456eec247c --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-25-net-ethernet-mtk_eth_soc-rely-on-rxd_size-field-in-m.patch @@ -0,0 +1,68 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:34 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: rely on rxd_size field in + mtk_rx_alloc/mtk_rx_clean + +Remove mtk_rx_dma structure layout dependency in mtk_rx_alloc/mtk_rx_clean. +Initialize to 0 rxd3 and rxd4 in mtk_rx_alloc. +This is a preliminary patch to add mt7986 ethernet support. + +Tested-by: Sam Shih +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1785,18 +1785,25 @@ static int mtk_rx_alloc(struct mtk_eth * + return -ENOMEM; + + for (i = 0; i < rx_dma_size; i++) { ++ struct mtk_rx_dma *rxd; ++ + dma_addr_t dma_addr = dma_map_single(eth->dma_dev, + ring->data[i] + NET_SKB_PAD + eth->ip_align, + ring->buf_size, + DMA_FROM_DEVICE); + if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) + return -ENOMEM; +- ring->dma[i].rxd1 = (unsigned int)dma_addr; ++ ++ rxd = (void *)ring->dma + i * eth->soc->txrx.rxd_size; ++ rxd->rxd1 = (unsigned int)dma_addr; + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) +- ring->dma[i].rxd2 = RX_DMA_LSO; ++ rxd->rxd2 = RX_DMA_LSO; + else +- ring->dma[i].rxd2 = RX_DMA_PLEN0(ring->buf_size); ++ rxd->rxd2 = RX_DMA_PLEN0(ring->buf_size); ++ ++ rxd->rxd3 = 0; ++ rxd->rxd4 = 0; + } + ring->dma_size = rx_dma_size; + ring->calc_idx_update = false; +@@ -1821,14 +1828,17 @@ static void mtk_rx_clean(struct mtk_eth + + if (ring->data && ring->dma) { + for (i = 0; i < ring->dma_size; i++) { ++ struct mtk_rx_dma *rxd; ++ + if (!ring->data[i]) + continue; +- if (!ring->dma[i].rxd1) ++ ++ rxd = (void *)ring->dma + i * eth->soc->txrx.rxd_size; ++ if (!rxd->rxd1) + continue; +- dma_unmap_single(eth->dma_dev, +- ring->dma[i].rxd1, +- ring->buf_size, +- DMA_FROM_DEVICE); ++ ++ dma_unmap_single(eth->dma_dev, rxd->rxd1, ++ ring->buf_size, DMA_FROM_DEVICE); + skb_free_frag(ring->data[i]); + } + kfree(ring->data); diff --git a/target/linux/generic/backport-5.15/702-v5.19-26-net-ethernet-mtk_eth_soc-introduce-device-register-m.patch b/target/linux/generic/backport-5.15/702-v5.19-26-net-ethernet-mtk_eth_soc-introduce-device-register-m.patch new file mode 100644 index 0000000000..11941d5c37 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-26-net-ethernet-mtk_eth_soc-introduce-device-register-m.patch @@ -0,0 +1,814 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:35 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: introduce device register map + +Introduce reg_map structure to add the capability to support different +register definitions. Move register definitions in mtk_regmap structure. +This is a preliminary patch to introduce mt7986 ethernet support. + +Tested-by: Sam Shih +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -34,6 +34,59 @@ MODULE_PARM_DESC(msg_level, "Message lev + #define MTK_ETHTOOL_STAT(x) { #x, \ + offsetof(struct mtk_hw_stats, x) / sizeof(u64) } + ++static const struct mtk_reg_map mtk_reg_map = { ++ .tx_irq_mask = 0x1a1c, ++ .tx_irq_status = 0x1a18, ++ .pdma = { ++ .rx_ptr = 0x0900, ++ .rx_cnt_cfg = 0x0904, ++ .pcrx_ptr = 0x0908, ++ .glo_cfg = 0x0a04, ++ .rst_idx = 0x0a08, ++ .delay_irq = 0x0a0c, ++ .irq_status = 0x0a20, ++ .irq_mask = 0x0a28, ++ .int_grp = 0x0a50, ++ }, ++ .qdma = { ++ .qtx_cfg = 0x1800, ++ .rx_ptr = 0x1900, ++ .rx_cnt_cfg = 0x1904, ++ .qcrx_ptr = 0x1908, ++ .glo_cfg = 0x1a04, ++ .rst_idx = 0x1a08, ++ .delay_irq = 0x1a0c, ++ .fc_th = 0x1a10, ++ .int_grp = 0x1a20, ++ .hred = 0x1a44, ++ .ctx_ptr = 0x1b00, ++ .dtx_ptr = 0x1b04, ++ .crx_ptr = 0x1b10, ++ .drx_ptr = 0x1b14, ++ .fq_head = 0x1b20, ++ .fq_tail = 0x1b24, ++ .fq_count = 0x1b28, ++ .fq_blen = 0x1b2c, ++ }, ++ .gdm1_cnt = 0x2400, ++}; ++ ++static const struct mtk_reg_map mt7628_reg_map = { ++ .tx_irq_mask = 0x0a28, ++ .tx_irq_status = 0x0a20, ++ .pdma = { ++ .rx_ptr = 0x0900, ++ .rx_cnt_cfg = 0x0904, ++ .pcrx_ptr = 0x0908, ++ .glo_cfg = 0x0a04, ++ .rst_idx = 0x0a08, ++ .delay_irq = 0x0a0c, ++ .irq_status = 0x0a20, ++ .irq_mask = 0x0a28, ++ .int_grp = 0x0a50, ++ }, ++}; ++ + /* strings used by ethtool */ + static const struct mtk_ethtool_stats { + char str[ETH_GSTRING_LEN]; +@@ -619,8 +672,8 @@ static inline void mtk_tx_irq_disable(st + u32 val; + + spin_lock_irqsave(ð->tx_irq_lock, flags); +- val = mtk_r32(eth, eth->tx_int_mask_reg); +- mtk_w32(eth, val & ~mask, eth->tx_int_mask_reg); ++ val = mtk_r32(eth, eth->soc->reg_map->tx_irq_mask); ++ mtk_w32(eth, val & ~mask, eth->soc->reg_map->tx_irq_mask); + spin_unlock_irqrestore(ð->tx_irq_lock, flags); + } + +@@ -630,8 +683,8 @@ static inline void mtk_tx_irq_enable(str + u32 val; + + spin_lock_irqsave(ð->tx_irq_lock, flags); +- val = mtk_r32(eth, eth->tx_int_mask_reg); +- mtk_w32(eth, val | mask, eth->tx_int_mask_reg); ++ val = mtk_r32(eth, eth->soc->reg_map->tx_irq_mask); ++ mtk_w32(eth, val | mask, eth->soc->reg_map->tx_irq_mask); + spin_unlock_irqrestore(ð->tx_irq_lock, flags); + } + +@@ -641,8 +694,8 @@ static inline void mtk_rx_irq_disable(st + u32 val; + + spin_lock_irqsave(ð->rx_irq_lock, flags); +- val = mtk_r32(eth, MTK_PDMA_INT_MASK); +- mtk_w32(eth, val & ~mask, MTK_PDMA_INT_MASK); ++ val = mtk_r32(eth, eth->soc->reg_map->pdma.irq_mask); ++ mtk_w32(eth, val & ~mask, eth->soc->reg_map->pdma.irq_mask); + spin_unlock_irqrestore(ð->rx_irq_lock, flags); + } + +@@ -652,8 +705,8 @@ static inline void mtk_rx_irq_enable(str + u32 val; + + spin_lock_irqsave(ð->rx_irq_lock, flags); +- val = mtk_r32(eth, MTK_PDMA_INT_MASK); +- mtk_w32(eth, val | mask, MTK_PDMA_INT_MASK); ++ val = mtk_r32(eth, eth->soc->reg_map->pdma.irq_mask); ++ mtk_w32(eth, val | mask, eth->soc->reg_map->pdma.irq_mask); + spin_unlock_irqrestore(ð->rx_irq_lock, flags); + } + +@@ -704,39 +757,39 @@ void mtk_stats_update_mac(struct mtk_mac + hw_stats->rx_checksum_errors += + mtk_r32(mac->hw, MT7628_SDM_CS_ERR); + } else { ++ const struct mtk_reg_map *reg_map = eth->soc->reg_map; + unsigned int offs = hw_stats->reg_offset; + u64 stats; + +- hw_stats->rx_bytes += mtk_r32(mac->hw, +- MTK_GDM1_RX_GBCNT_L + offs); +- stats = mtk_r32(mac->hw, MTK_GDM1_RX_GBCNT_H + offs); ++ hw_stats->rx_bytes += mtk_r32(mac->hw, reg_map->gdm1_cnt + offs); ++ stats = mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x4 + offs); + if (stats) + hw_stats->rx_bytes += (stats << 32); + hw_stats->rx_packets += +- mtk_r32(mac->hw, MTK_GDM1_RX_GPCNT + offs); ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x8 + offs); + hw_stats->rx_overflow += +- mtk_r32(mac->hw, MTK_GDM1_RX_OERCNT + offs); ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x10 + offs); + hw_stats->rx_fcs_errors += +- mtk_r32(mac->hw, MTK_GDM1_RX_FERCNT + offs); ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x14 + offs); + hw_stats->rx_short_errors += +- mtk_r32(mac->hw, MTK_GDM1_RX_SERCNT + offs); ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x18 + offs); + hw_stats->rx_long_errors += +- mtk_r32(mac->hw, MTK_GDM1_RX_LENCNT + offs); ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x1c + offs); + hw_stats->rx_checksum_errors += +- mtk_r32(mac->hw, MTK_GDM1_RX_CERCNT + offs); ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x20 + offs); + hw_stats->rx_flow_control_packets += +- mtk_r32(mac->hw, MTK_GDM1_RX_FCCNT + offs); ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x24 + offs); + hw_stats->tx_skip += +- mtk_r32(mac->hw, MTK_GDM1_TX_SKIPCNT + offs); ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x28 + offs); + hw_stats->tx_collisions += +- mtk_r32(mac->hw, MTK_GDM1_TX_COLCNT + offs); ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x2c + offs); + hw_stats->tx_bytes += +- mtk_r32(mac->hw, MTK_GDM1_TX_GBCNT_L + offs); +- stats = mtk_r32(mac->hw, MTK_GDM1_TX_GBCNT_H + offs); ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x30 + offs); ++ stats = mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x34 + offs); + if (stats) + hw_stats->tx_bytes += (stats << 32); + hw_stats->tx_packets += +- mtk_r32(mac->hw, MTK_GDM1_TX_GPCNT + offs); ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x38 + offs); + } + + u64_stats_update_end(&hw_stats->syncp); +@@ -876,10 +929,10 @@ static int mtk_init_fq_dma(struct mtk_et + txd->txd4 = 0; + } + +- mtk_w32(eth, eth->phy_scratch_ring, MTK_QDMA_FQ_HEAD); +- mtk_w32(eth, phy_ring_tail, MTK_QDMA_FQ_TAIL); +- mtk_w32(eth, (cnt << 16) | cnt, MTK_QDMA_FQ_CNT); +- mtk_w32(eth, MTK_QDMA_PAGE_SIZE << 16, MTK_QDMA_FQ_BLEN); ++ mtk_w32(eth, eth->phy_scratch_ring, soc->reg_map->qdma.fq_head); ++ mtk_w32(eth, phy_ring_tail, soc->reg_map->qdma.fq_tail); ++ mtk_w32(eth, (cnt << 16) | cnt, soc->reg_map->qdma.fq_count); ++ mtk_w32(eth, MTK_QDMA_PAGE_SIZE << 16, soc->reg_map->qdma.fq_blen); + + return 0; + } +@@ -1123,7 +1176,7 @@ static int mtk_tx_map(struct sk_buff *sk + if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { + if (netif_xmit_stopped(netdev_get_tx_queue(dev, 0)) || + !netdev_xmit_more()) +- mtk_w32(eth, txd->txd2, MTK_QTX_CTX_PTR); ++ mtk_w32(eth, txd->txd2, soc->reg_map->qdma.ctx_ptr); + } else { + int next_idx; + +@@ -1440,6 +1493,7 @@ rx_done: + static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget, + unsigned int *done, unsigned int *bytes) + { ++ const struct mtk_reg_map *reg_map = eth->soc->reg_map; + struct mtk_tx_ring *ring = ð->tx_ring; + struct mtk_tx_dma *desc; + struct sk_buff *skb; +@@ -1447,7 +1501,7 @@ static int mtk_poll_tx_qdma(struct mtk_e + u32 cpu, dma; + + cpu = ring->last_free_ptr; +- dma = mtk_r32(eth, MTK_QTX_DRX_PTR); ++ dma = mtk_r32(eth, reg_map->qdma.drx_ptr); + + desc = mtk_qdma_phys_to_virt(ring, cpu); + +@@ -1482,7 +1536,7 @@ static int mtk_poll_tx_qdma(struct mtk_e + } + + ring->last_free_ptr = cpu; +- mtk_w32(eth, cpu, MTK_QTX_CRX_PTR); ++ mtk_w32(eth, cpu, reg_map->qdma.crx_ptr); + + return budget; + } +@@ -1575,24 +1629,25 @@ static void mtk_handle_status_irq(struct + static int mtk_napi_tx(struct napi_struct *napi, int budget) + { + struct mtk_eth *eth = container_of(napi, struct mtk_eth, tx_napi); ++ const struct mtk_reg_map *reg_map = eth->soc->reg_map; + int tx_done = 0; + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) + mtk_handle_status_irq(eth); +- mtk_w32(eth, MTK_TX_DONE_INT, eth->tx_int_status_reg); ++ mtk_w32(eth, MTK_TX_DONE_INT, reg_map->tx_irq_status); + tx_done = mtk_poll_tx(eth, budget); + + if (unlikely(netif_msg_intr(eth))) { + dev_info(eth->dev, + "done tx %d, intr 0x%08x/0x%x\n", tx_done, +- mtk_r32(eth, eth->tx_int_status_reg), +- mtk_r32(eth, eth->tx_int_mask_reg)); ++ mtk_r32(eth, reg_map->tx_irq_status), ++ mtk_r32(eth, reg_map->tx_irq_mask)); + } + + if (tx_done == budget) + return budget; + +- if (mtk_r32(eth, eth->tx_int_status_reg) & MTK_TX_DONE_INT) ++ if (mtk_r32(eth, reg_map->tx_irq_status) & MTK_TX_DONE_INT) + return budget; + + if (napi_complete_done(napi, tx_done)) +@@ -1604,6 +1659,7 @@ static int mtk_napi_tx(struct napi_struc + static int mtk_napi_rx(struct napi_struct *napi, int budget) + { + struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi); ++ const struct mtk_reg_map *reg_map = eth->soc->reg_map; + int rx_done_total = 0; + + mtk_handle_status_irq(eth); +@@ -1611,21 +1667,21 @@ static int mtk_napi_rx(struct napi_struc + do { + int rx_done; + +- mtk_w32(eth, MTK_RX_DONE_INT, MTK_PDMA_INT_STATUS); ++ mtk_w32(eth, MTK_RX_DONE_INT, reg_map->pdma.irq_status); + rx_done = mtk_poll_rx(napi, budget - rx_done_total, eth); + rx_done_total += rx_done; + + if (unlikely(netif_msg_intr(eth))) { + dev_info(eth->dev, + "done rx %d, intr 0x%08x/0x%x\n", rx_done, +- mtk_r32(eth, MTK_PDMA_INT_STATUS), +- mtk_r32(eth, MTK_PDMA_INT_MASK)); ++ mtk_r32(eth, reg_map->pdma.irq_status), ++ mtk_r32(eth, reg_map->pdma.irq_mask)); + } + + if (rx_done_total == budget) + return budget; + +- } while (mtk_r32(eth, MTK_PDMA_INT_STATUS) & MTK_RX_DONE_INT); ++ } while (mtk_r32(eth, reg_map->pdma.irq_status) & MTK_RX_DONE_INT); + + if (napi_complete_done(napi, rx_done_total)) + mtk_rx_irq_enable(eth, MTK_RX_DONE_INT); +@@ -1688,20 +1744,20 @@ static int mtk_tx_alloc(struct mtk_eth * + */ + wmb(); + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { +- mtk_w32(eth, ring->phys, MTK_QTX_CTX_PTR); +- mtk_w32(eth, ring->phys, MTK_QTX_DTX_PTR); ++ if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { ++ mtk_w32(eth, ring->phys, soc->reg_map->qdma.ctx_ptr); ++ mtk_w32(eth, ring->phys, soc->reg_map->qdma.dtx_ptr); + mtk_w32(eth, + ring->phys + ((MTK_DMA_SIZE - 1) * sz), +- MTK_QTX_CRX_PTR); +- mtk_w32(eth, ring->last_free_ptr, MTK_QTX_DRX_PTR); ++ soc->reg_map->qdma.crx_ptr); ++ mtk_w32(eth, ring->last_free_ptr, soc->reg_map->qdma.drx_ptr); + mtk_w32(eth, (QDMA_RES_THRES << 8) | QDMA_RES_THRES, +- MTK_QTX_CFG(0)); ++ soc->reg_map->qdma.qtx_cfg); + } else { + mtk_w32(eth, ring->phys_pdma, MT7628_TX_BASE_PTR0); + mtk_w32(eth, MTK_DMA_SIZE, MT7628_TX_MAX_CNT0); + mtk_w32(eth, 0, MT7628_TX_CTX_IDX0); +- mtk_w32(eth, MT7628_PST_DTX_IDX0, MTK_PDMA_RST_IDX); ++ mtk_w32(eth, MT7628_PST_DTX_IDX0, soc->reg_map->pdma.rst_idx); + } + + return 0; +@@ -1740,6 +1796,7 @@ static void mtk_tx_clean(struct mtk_eth + + static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag) + { ++ const struct mtk_reg_map *reg_map = eth->soc->reg_map; + struct mtk_rx_ring *ring; + int rx_data_len, rx_dma_size; + int i; +@@ -1808,16 +1865,18 @@ static int mtk_rx_alloc(struct mtk_eth * + ring->dma_size = rx_dma_size; + ring->calc_idx_update = false; + ring->calc_idx = rx_dma_size - 1; +- ring->crx_idx_reg = MTK_PRX_CRX_IDX_CFG(ring_no); ++ ring->crx_idx_reg = reg_map->pdma.pcrx_ptr + ring_no * MTK_QRX_OFFSET; + /* make sure that all changes to the dma ring are flushed before we + * continue + */ + wmb(); + +- mtk_w32(eth, ring->phys, MTK_PRX_BASE_PTR_CFG(ring_no) + offset); +- mtk_w32(eth, rx_dma_size, MTK_PRX_MAX_CNT_CFG(ring_no) + offset); ++ mtk_w32(eth, ring->phys, ++ reg_map->pdma.rx_ptr + ring_no * MTK_QRX_OFFSET + offset); ++ mtk_w32(eth, rx_dma_size, ++ reg_map->pdma.rx_cnt_cfg + ring_no * MTK_QRX_OFFSET + offset); + mtk_w32(eth, ring->calc_idx, ring->crx_idx_reg + offset); +- mtk_w32(eth, MTK_PST_DRX_IDX_CFG(ring_no), MTK_PDMA_RST_IDX + offset); ++ mtk_w32(eth, MTK_PST_DRX_IDX_CFG(ring_no), reg_map->pdma.rst_idx + offset); + + return 0; + } +@@ -2129,9 +2188,9 @@ static int mtk_dma_busy_wait(struct mtk_ + u32 val; + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) +- reg = MTK_QDMA_GLO_CFG; ++ reg = eth->soc->reg_map->qdma.glo_cfg; + else +- reg = MTK_PDMA_GLO_CFG; ++ reg = eth->soc->reg_map->pdma.glo_cfg; + + ret = readx_poll_timeout_atomic(__raw_readl, eth->base + reg, val, + !(val & (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY)), +@@ -2189,8 +2248,8 @@ static int mtk_dma_init(struct mtk_eth * + * automatically + */ + mtk_w32(eth, FC_THRES_DROP_MODE | FC_THRES_DROP_EN | +- FC_THRES_MIN, MTK_QDMA_FC_THRES); +- mtk_w32(eth, 0x0, MTK_QDMA_HRED2); ++ FC_THRES_MIN, eth->soc->reg_map->qdma.fc_th); ++ mtk_w32(eth, 0x0, eth->soc->reg_map->qdma.hred); + } + + return 0; +@@ -2264,13 +2323,14 @@ static irqreturn_t mtk_handle_irq_tx(int + static irqreturn_t mtk_handle_irq(int irq, void *_eth) + { + struct mtk_eth *eth = _eth; ++ const struct mtk_reg_map *reg_map = eth->soc->reg_map; + +- if (mtk_r32(eth, MTK_PDMA_INT_MASK) & MTK_RX_DONE_INT) { +- if (mtk_r32(eth, MTK_PDMA_INT_STATUS) & MTK_RX_DONE_INT) ++ if (mtk_r32(eth, reg_map->pdma.irq_mask) & MTK_RX_DONE_INT) { ++ if (mtk_r32(eth, reg_map->pdma.irq_status) & MTK_RX_DONE_INT) + mtk_handle_irq_rx(irq, _eth); + } +- if (mtk_r32(eth, eth->tx_int_mask_reg) & MTK_TX_DONE_INT) { +- if (mtk_r32(eth, eth->tx_int_status_reg) & MTK_TX_DONE_INT) ++ if (mtk_r32(eth, reg_map->tx_irq_mask) & MTK_TX_DONE_INT) { ++ if (mtk_r32(eth, reg_map->tx_irq_status) & MTK_TX_DONE_INT) + mtk_handle_irq_tx(irq, _eth); + } + +@@ -2294,6 +2354,7 @@ static void mtk_poll_controller(struct n + static int mtk_start_dma(struct mtk_eth *eth) + { + u32 rx_2b_offset = (NET_IP_ALIGN == 2) ? MTK_RX_2B_OFFSET : 0; ++ const struct mtk_reg_map *reg_map = eth->soc->reg_map; + int err; + + err = mtk_dma_init(eth); +@@ -2308,16 +2369,15 @@ static int mtk_start_dma(struct mtk_eth + MTK_TX_BT_32DWORDS | MTK_NDP_CO_PRO | + MTK_RX_DMA_EN | MTK_RX_2B_OFFSET | + MTK_RX_BT_32DWORDS, +- MTK_QDMA_GLO_CFG); +- ++ reg_map->qdma.glo_cfg); + mtk_w32(eth, + MTK_RX_DMA_EN | rx_2b_offset | + MTK_RX_BT_32DWORDS | MTK_MULTI_EN, +- MTK_PDMA_GLO_CFG); ++ reg_map->pdma.glo_cfg); + } else { + mtk_w32(eth, MTK_TX_WB_DDONE | MTK_TX_DMA_EN | MTK_RX_DMA_EN | + MTK_MULTI_EN | MTK_PDMA_SIZE_8DWORDS, +- MTK_PDMA_GLO_CFG); ++ reg_map->pdma.glo_cfg); + } + + return 0; +@@ -2443,8 +2503,8 @@ static int mtk_stop(struct net_device *d + cancel_work_sync(ð->tx_dim.work); + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) +- mtk_stop_dma(eth, MTK_QDMA_GLO_CFG); +- mtk_stop_dma(eth, MTK_PDMA_GLO_CFG); ++ mtk_stop_dma(eth, eth->soc->reg_map->qdma.glo_cfg); ++ mtk_stop_dma(eth, eth->soc->reg_map->pdma.glo_cfg); + + mtk_dma_free(eth); + +@@ -2498,6 +2558,7 @@ static void mtk_dim_rx(struct work_struc + { + struct dim *dim = container_of(work, struct dim, work); + struct mtk_eth *eth = container_of(dim, struct mtk_eth, rx_dim); ++ const struct mtk_reg_map *reg_map = eth->soc->reg_map; + struct dim_cq_moder cur_profile; + u32 val, cur; + +@@ -2505,7 +2566,7 @@ static void mtk_dim_rx(struct work_struc + dim->profile_ix); + spin_lock_bh(ð->dim_lock); + +- val = mtk_r32(eth, MTK_PDMA_DELAY_INT); ++ val = mtk_r32(eth, reg_map->pdma.delay_irq); + val &= MTK_PDMA_DELAY_TX_MASK; + val |= MTK_PDMA_DELAY_RX_EN; + +@@ -2515,9 +2576,9 @@ static void mtk_dim_rx(struct work_struc + cur = min_t(u32, cur_profile.pkts, MTK_PDMA_DELAY_PINT_MASK); + val |= cur << MTK_PDMA_DELAY_RX_PINT_SHIFT; + +- mtk_w32(eth, val, MTK_PDMA_DELAY_INT); ++ mtk_w32(eth, val, reg_map->pdma.delay_irq); + if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) +- mtk_w32(eth, val, MTK_QDMA_DELAY_INT); ++ mtk_w32(eth, val, reg_map->qdma.delay_irq); + + spin_unlock_bh(ð->dim_lock); + +@@ -2528,6 +2589,7 @@ static void mtk_dim_tx(struct work_struc + { + struct dim *dim = container_of(work, struct dim, work); + struct mtk_eth *eth = container_of(dim, struct mtk_eth, tx_dim); ++ const struct mtk_reg_map *reg_map = eth->soc->reg_map; + struct dim_cq_moder cur_profile; + u32 val, cur; + +@@ -2535,7 +2597,7 @@ static void mtk_dim_tx(struct work_struc + dim->profile_ix); + spin_lock_bh(ð->dim_lock); + +- val = mtk_r32(eth, MTK_PDMA_DELAY_INT); ++ val = mtk_r32(eth, reg_map->pdma.delay_irq); + val &= MTK_PDMA_DELAY_RX_MASK; + val |= MTK_PDMA_DELAY_TX_EN; + +@@ -2545,9 +2607,9 @@ static void mtk_dim_tx(struct work_struc + cur = min_t(u32, cur_profile.pkts, MTK_PDMA_DELAY_PINT_MASK); + val |= cur << MTK_PDMA_DELAY_TX_PINT_SHIFT; + +- mtk_w32(eth, val, MTK_PDMA_DELAY_INT); ++ mtk_w32(eth, val, reg_map->pdma.delay_irq); + if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) +- mtk_w32(eth, val, MTK_QDMA_DELAY_INT); ++ mtk_w32(eth, val, reg_map->qdma.delay_irq); + + spin_unlock_bh(ð->dim_lock); + +@@ -2558,6 +2620,7 @@ static int mtk_hw_init(struct mtk_eth *e + { + u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA | + ETHSYS_DMA_AG_MAP_PPE; ++ const struct mtk_reg_map *reg_map = eth->soc->reg_map; + int i, val, ret; + + if (test_and_set_bit(MTK_HW_INIT, ð->state)) +@@ -2632,10 +2695,10 @@ static int mtk_hw_init(struct mtk_eth *e + mtk_rx_irq_disable(eth, ~0); + + /* FE int grouping */ +- mtk_w32(eth, MTK_TX_DONE_INT, MTK_PDMA_INT_GRP1); +- mtk_w32(eth, MTK_RX_DONE_INT, MTK_PDMA_INT_GRP2); +- mtk_w32(eth, MTK_TX_DONE_INT, MTK_QDMA_INT_GRP1); +- mtk_w32(eth, MTK_RX_DONE_INT, MTK_QDMA_INT_GRP2); ++ mtk_w32(eth, MTK_TX_DONE_INT, reg_map->pdma.int_grp); ++ mtk_w32(eth, MTK_RX_DONE_INT, reg_map->pdma.int_grp + 4); ++ mtk_w32(eth, MTK_TX_DONE_INT, reg_map->qdma.int_grp); ++ mtk_w32(eth, MTK_RX_DONE_INT, reg_map->qdma.int_grp + 4); + mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP); + + return 0; +@@ -3167,14 +3230,6 @@ static int mtk_probe(struct platform_dev + if (IS_ERR(eth->base)) + return PTR_ERR(eth->base); + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { +- eth->tx_int_mask_reg = MTK_QDMA_INT_MASK; +- eth->tx_int_status_reg = MTK_QDMA_INT_STATUS; +- } else { +- eth->tx_int_mask_reg = MTK_PDMA_INT_MASK; +- eth->tx_int_status_reg = MTK_PDMA_INT_STATUS; +- } +- + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) { + eth->rx_dma_l4_valid = RX_DMA_L4_VALID_PDMA; + eth->ip_align = NET_IP_ALIGN; +@@ -3408,6 +3463,7 @@ static int mtk_remove(struct platform_de + } + + static const struct mtk_soc_data mt2701_data = { ++ .reg_map = &mtk_reg_map, + .caps = MT7623_CAPS | MTK_HWLRO, + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7623_CLKS_BITMAP, +@@ -3419,6 +3475,7 @@ static const struct mtk_soc_data mt2701_ + }; + + static const struct mtk_soc_data mt7621_data = { ++ .reg_map = &mtk_reg_map, + .caps = MT7621_CAPS, + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7621_CLKS_BITMAP, +@@ -3431,6 +3488,7 @@ static const struct mtk_soc_data mt7621_ + }; + + static const struct mtk_soc_data mt7622_data = { ++ .reg_map = &mtk_reg_map, + .ana_rgc3 = 0x2028, + .caps = MT7622_CAPS | MTK_HWLRO, + .hw_features = MTK_HW_FEATURES, +@@ -3444,6 +3502,7 @@ static const struct mtk_soc_data mt7622_ + }; + + static const struct mtk_soc_data mt7623_data = { ++ .reg_map = &mtk_reg_map, + .caps = MT7623_CAPS | MTK_HWLRO, + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7623_CLKS_BITMAP, +@@ -3456,6 +3515,7 @@ static const struct mtk_soc_data mt7623_ + }; + + static const struct mtk_soc_data mt7629_data = { ++ .reg_map = &mtk_reg_map, + .ana_rgc3 = 0x128, + .caps = MT7629_CAPS | MTK_HWLRO, + .hw_features = MTK_HW_FEATURES, +@@ -3468,6 +3528,7 @@ static const struct mtk_soc_data mt7629_ + }; + + static const struct mtk_soc_data rt5350_data = { ++ .reg_map = &mt7628_reg_map, + .caps = MT7628_CAPS, + .hw_features = MTK_HW_FEATURES_MT7628, + .required_clks = MT7628_CLKS_BITMAP, +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -48,6 +48,8 @@ + #define MTK_HW_FEATURES_MT7628 (NETIF_F_SG | NETIF_F_RXCSUM) + #define NEXT_DESP_IDX(X, Y) (((X) + 1) & ((Y) - 1)) + ++#define MTK_QRX_OFFSET 0x10 ++ + #define MTK_MAX_RX_RING_NUM 4 + #define MTK_HW_LRO_DMA_SIZE 8 + +@@ -100,18 +102,6 @@ + /* Unicast Filter MAC Address Register - High */ + #define MTK_GDMA_MAC_ADRH(x) (0x50C + (x * 0x1000)) + +-/* PDMA RX Base Pointer Register */ +-#define MTK_PRX_BASE_PTR0 0x900 +-#define MTK_PRX_BASE_PTR_CFG(x) (MTK_PRX_BASE_PTR0 + (x * 0x10)) +- +-/* PDMA RX Maximum Count Register */ +-#define MTK_PRX_MAX_CNT0 0x904 +-#define MTK_PRX_MAX_CNT_CFG(x) (MTK_PRX_MAX_CNT0 + (x * 0x10)) +- +-/* PDMA RX CPU Pointer Register */ +-#define MTK_PRX_CRX_IDX0 0x908 +-#define MTK_PRX_CRX_IDX_CFG(x) (MTK_PRX_CRX_IDX0 + (x * 0x10)) +- + /* PDMA HW LRO Control Registers */ + #define MTK_PDMA_LRO_CTRL_DW0 0x980 + #define MTK_LRO_EN BIT(0) +@@ -126,18 +116,19 @@ + #define MTK_ADMA_MODE BIT(15) + #define MTK_LRO_MIN_RXD_SDL (MTK_HW_LRO_SDL_REMAIN_ROOM << 16) + +-/* PDMA Global Configuration Register */ +-#define MTK_PDMA_GLO_CFG 0xa04 ++#define MTK_RX_DMA_LRO_EN BIT(8) + #define MTK_MULTI_EN BIT(10) + #define MTK_PDMA_SIZE_8DWORDS (1 << 4) + ++/* PDMA Global Configuration Register */ ++#define MTK_PDMA_LRO_SDL 0x3000 ++#define MTK_RX_CFG_SDL_OFFSET 16 ++ + /* PDMA Reset Index Register */ +-#define MTK_PDMA_RST_IDX 0xa08 + #define MTK_PST_DRX_IDX0 BIT(16) + #define MTK_PST_DRX_IDX_CFG(x) (MTK_PST_DRX_IDX0 << (x)) + + /* PDMA Delay Interrupt Register */ +-#define MTK_PDMA_DELAY_INT 0xa0c + #define MTK_PDMA_DELAY_RX_MASK GENMASK(15, 0) + #define MTK_PDMA_DELAY_RX_EN BIT(15) + #define MTK_PDMA_DELAY_RX_PINT_SHIFT 8 +@@ -151,19 +142,9 @@ + #define MTK_PDMA_DELAY_PINT_MASK 0x7f + #define MTK_PDMA_DELAY_PTIME_MASK 0xff + +-/* PDMA Interrupt Status Register */ +-#define MTK_PDMA_INT_STATUS 0xa20 +- +-/* PDMA Interrupt Mask Register */ +-#define MTK_PDMA_INT_MASK 0xa28 +- + /* PDMA HW LRO Alter Flow Delta Register */ + #define MTK_PDMA_LRO_ALT_SCORE_DELTA 0xa4c + +-/* PDMA Interrupt grouping registers */ +-#define MTK_PDMA_INT_GRP1 0xa50 +-#define MTK_PDMA_INT_GRP2 0xa54 +- + /* PDMA HW LRO IP Setting Registers */ + #define MTK_LRO_RX_RING0_DIP_DW0 0xb04 + #define MTK_LRO_DIP_DW0_CFG(x) (MTK_LRO_RX_RING0_DIP_DW0 + (x * 0x40)) +@@ -185,26 +166,9 @@ + #define MTK_RING_MAX_AGG_CNT_H ((MTK_HW_LRO_MAX_AGG_CNT >> 6) & 0x3) + + /* QDMA TX Queue Configuration Registers */ +-#define MTK_QTX_CFG(x) (0x1800 + (x * 0x10)) + #define QDMA_RES_THRES 4 + +-/* QDMA TX Queue Scheduler Registers */ +-#define MTK_QTX_SCH(x) (0x1804 + (x * 0x10)) +- +-/* QDMA RX Base Pointer Register */ +-#define MTK_QRX_BASE_PTR0 0x1900 +- +-/* QDMA RX Maximum Count Register */ +-#define MTK_QRX_MAX_CNT0 0x1904 +- +-/* QDMA RX CPU Pointer Register */ +-#define MTK_QRX_CRX_IDX0 0x1908 +- +-/* QDMA RX DMA Pointer Register */ +-#define MTK_QRX_DRX_IDX0 0x190C +- + /* QDMA Global Configuration Register */ +-#define MTK_QDMA_GLO_CFG 0x1A04 + #define MTK_RX_2B_OFFSET BIT(31) + #define MTK_RX_BT_32DWORDS (3 << 11) + #define MTK_NDP_CO_PRO BIT(10) +@@ -216,20 +180,12 @@ + #define MTK_TX_DMA_EN BIT(0) + #define MTK_DMA_BUSY_TIMEOUT_US 1000000 + +-/* QDMA Reset Index Register */ +-#define MTK_QDMA_RST_IDX 0x1A08 +- +-/* QDMA Delay Interrupt Register */ +-#define MTK_QDMA_DELAY_INT 0x1A0C +- + /* QDMA Flow Control Register */ +-#define MTK_QDMA_FC_THRES 0x1A10 + #define FC_THRES_DROP_MODE BIT(20) + #define FC_THRES_DROP_EN (7 << 16) + #define FC_THRES_MIN 0x4444 + + /* QDMA Interrupt Status Register */ +-#define MTK_QDMA_INT_STATUS 0x1A18 + #define MTK_RX_DONE_DLY BIT(30) + #define MTK_TX_DONE_DLY BIT(28) + #define MTK_RX_DONE_INT3 BIT(19) +@@ -244,55 +200,8 @@ + #define MTK_TX_DONE_INT MTK_TX_DONE_DLY + + /* QDMA Interrupt grouping registers */ +-#define MTK_QDMA_INT_GRP1 0x1a20 +-#define MTK_QDMA_INT_GRP2 0x1a24 + #define MTK_RLS_DONE_INT BIT(0) + +-/* QDMA Interrupt Status Register */ +-#define MTK_QDMA_INT_MASK 0x1A1C +- +-/* QDMA Interrupt Mask Register */ +-#define MTK_QDMA_HRED2 0x1A44 +- +-/* QDMA TX Forward CPU Pointer Register */ +-#define MTK_QTX_CTX_PTR 0x1B00 +- +-/* QDMA TX Forward DMA Pointer Register */ +-#define MTK_QTX_DTX_PTR 0x1B04 +- +-/* QDMA TX Release CPU Pointer Register */ +-#define MTK_QTX_CRX_PTR 0x1B10 +- +-/* QDMA TX Release DMA Pointer Register */ +-#define MTK_QTX_DRX_PTR 0x1B14 +- +-/* QDMA FQ Head Pointer Register */ +-#define MTK_QDMA_FQ_HEAD 0x1B20 +- +-/* QDMA FQ Head Pointer Register */ +-#define MTK_QDMA_FQ_TAIL 0x1B24 +- +-/* QDMA FQ Free Page Counter Register */ +-#define MTK_QDMA_FQ_CNT 0x1B28 +- +-/* QDMA FQ Free Page Buffer Length Register */ +-#define MTK_QDMA_FQ_BLEN 0x1B2C +- +-/* GMA1 counter / statics register */ +-#define MTK_GDM1_RX_GBCNT_L 0x2400 +-#define MTK_GDM1_RX_GBCNT_H 0x2404 +-#define MTK_GDM1_RX_GPCNT 0x2408 +-#define MTK_GDM1_RX_OERCNT 0x2410 +-#define MTK_GDM1_RX_FERCNT 0x2414 +-#define MTK_GDM1_RX_SERCNT 0x2418 +-#define MTK_GDM1_RX_LENCNT 0x241c +-#define MTK_GDM1_RX_CERCNT 0x2420 +-#define MTK_GDM1_RX_FCCNT 0x2424 +-#define MTK_GDM1_TX_SKIPCNT 0x2428 +-#define MTK_GDM1_TX_COLCNT 0x242c +-#define MTK_GDM1_TX_GBCNT_L 0x2430 +-#define MTK_GDM1_TX_GBCNT_H 0x2434 +-#define MTK_GDM1_TX_GPCNT 0x2438 + #define MTK_STAT_OFFSET 0x40 + + #define MTK_WDMA0_BASE 0x2800 +@@ -854,8 +763,46 @@ struct mtk_tx_dma_desc_info { + u8 last:1; + }; + ++struct mtk_reg_map { ++ u32 tx_irq_mask; ++ u32 tx_irq_status; ++ struct { ++ u32 rx_ptr; /* rx base pointer */ ++ u32 rx_cnt_cfg; /* rx max count configuration */ ++ u32 pcrx_ptr; /* rx cpu pointer */ ++ u32 glo_cfg; /* global configuration */ ++ u32 rst_idx; /* reset index */ ++ u32 delay_irq; /* delay interrupt */ ++ u32 irq_status; /* interrupt status */ ++ u32 irq_mask; /* interrupt mask */ ++ u32 int_grp; ++ } pdma; ++ struct { ++ u32 qtx_cfg; /* tx queue configuration */ ++ u32 rx_ptr; /* rx base pointer */ ++ u32 rx_cnt_cfg; /* rx max count configuration */ ++ u32 qcrx_ptr; /* rx cpu pointer */ ++ u32 glo_cfg; /* global configuration */ ++ u32 rst_idx; /* reset index */ ++ u32 delay_irq; /* delay interrupt */ ++ u32 fc_th; /* flow control */ ++ u32 int_grp; ++ u32 hred; /* interrupt mask */ ++ u32 ctx_ptr; /* tx acquire cpu pointer */ ++ u32 dtx_ptr; /* tx acquire dma pointer */ ++ u32 crx_ptr; /* tx release cpu pointer */ ++ u32 drx_ptr; /* tx release dma pointer */ ++ u32 fq_head; /* fq head pointer */ ++ u32 fq_tail; /* fq tail pointer */ ++ u32 fq_count; /* fq free page count */ ++ u32 fq_blen; /* fq free page buffer length */ ++ } qdma; ++ u32 gdm1_cnt; ++}; ++ + /* struct mtk_eth_data - This is the structure holding all differences + * among various plaforms ++ * @reg_map Soc register map. + * @ana_rgc3: The offset for register ANA_RGC3 related to + * sgmiisys syscon + * @caps Flags shown the extra capability for the SoC +@@ -868,6 +815,7 @@ struct mtk_tx_dma_desc_info { + * @rxd_size Rx DMA descriptor size. + */ + struct mtk_soc_data { ++ const struct mtk_reg_map *reg_map; + u32 ana_rgc3; + u32 caps; + u32 required_clks; +@@ -995,8 +943,6 @@ struct mtk_eth { + u32 tx_bytes; + struct dim tx_dim; + +- u32 tx_int_mask_reg; +- u32 tx_int_status_reg; + u32 rx_dma_l4_valid; + int ip_align; + diff --git a/target/linux/generic/backport-5.15/702-v5.19-27-net-ethernet-mtk_eth_soc-introduce-MTK_NETSYS_V2-sup.patch b/target/linux/generic/backport-5.15/702-v5.19-27-net-ethernet-mtk_eth_soc-introduce-MTK_NETSYS_V2-sup.patch new file mode 100644 index 0000000000..91739ddd34 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-27-net-ethernet-mtk_eth_soc-introduce-MTK_NETSYS_V2-sup.patch @@ -0,0 +1,917 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:36 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: introduce MTK_NETSYS_V2 support + +Introduce MTK_NETSYS_V2 support. MTK_NETSYS_V2 defines 32B TX/RX DMA +descriptors. +This is a preliminary patch to add mt7986 ethernet support. + +Tested-by: Sam Shih +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -863,8 +863,8 @@ static inline int mtk_max_buf_size(int f + return buf_size; + } + +-static inline bool mtk_rx_get_desc(struct mtk_rx_dma *rxd, +- struct mtk_rx_dma *dma_rxd) ++static bool mtk_rx_get_desc(struct mtk_eth *eth, struct mtk_rx_dma_v2 *rxd, ++ struct mtk_rx_dma_v2 *dma_rxd) + { + rxd->rxd2 = READ_ONCE(dma_rxd->rxd2); + if (!(rxd->rxd2 & RX_DMA_DONE)) +@@ -873,6 +873,10 @@ static inline bool mtk_rx_get_desc(struc + rxd->rxd1 = READ_ONCE(dma_rxd->rxd1); + rxd->rxd3 = READ_ONCE(dma_rxd->rxd3); + rxd->rxd4 = READ_ONCE(dma_rxd->rxd4); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ rxd->rxd5 = READ_ONCE(dma_rxd->rxd5); ++ rxd->rxd6 = READ_ONCE(dma_rxd->rxd6); ++ } + + return true; + } +@@ -917,7 +921,7 @@ static int mtk_init_fq_dma(struct mtk_et + phy_ring_tail = eth->phy_scratch_ring + soc->txrx.txd_size * (cnt - 1); + + for (i = 0; i < cnt; i++) { +- struct mtk_tx_dma *txd; ++ struct mtk_tx_dma_v2 *txd; + + txd = (void *)eth->scratch_ring + i * soc->txrx.txd_size; + txd->txd1 = dma_addr + i * MTK_QDMA_PAGE_SIZE; +@@ -927,6 +931,12 @@ static int mtk_init_fq_dma(struct mtk_et + + txd->txd3 = TX_DMA_PLEN0(MTK_QDMA_PAGE_SIZE); + txd->txd4 = 0; ++ if (MTK_HAS_CAPS(soc->caps, MTK_NETSYS_V2)) { ++ txd->txd5 = 0; ++ txd->txd6 = 0; ++ txd->txd7 = 0; ++ txd->txd8 = 0; ++ } + } + + mtk_w32(eth, eth->phy_scratch_ring, soc->reg_map->qdma.fq_head); +@@ -1030,10 +1040,12 @@ static void setup_tx_buf(struct mtk_eth + } + } + +-static void mtk_tx_set_dma_desc(struct net_device *dev, struct mtk_tx_dma *desc, +- struct mtk_tx_dma_desc_info *info) ++static void mtk_tx_set_dma_desc_v1(struct net_device *dev, void *txd, ++ struct mtk_tx_dma_desc_info *info) + { + struct mtk_mac *mac = netdev_priv(dev); ++ struct mtk_eth *eth = mac->hw; ++ struct mtk_tx_dma *desc = txd; + u32 data; + + WRITE_ONCE(desc->txd1, info->addr); +@@ -1057,6 +1069,59 @@ static void mtk_tx_set_dma_desc(struct n + WRITE_ONCE(desc->txd4, data); + } + ++static void mtk_tx_set_dma_desc_v2(struct net_device *dev, void *txd, ++ struct mtk_tx_dma_desc_info *info) ++{ ++ struct mtk_mac *mac = netdev_priv(dev); ++ struct mtk_tx_dma_v2 *desc = txd; ++ struct mtk_eth *eth = mac->hw; ++ u32 data; ++ ++ WRITE_ONCE(desc->txd1, info->addr); ++ ++ data = TX_DMA_PLEN0(info->size); ++ if (info->last) ++ data |= TX_DMA_LS0; ++ WRITE_ONCE(desc->txd3, data); ++ ++ if (!info->qid && mac->id) ++ info->qid = MTK_QDMA_GMAC2_QID; ++ ++ data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */ ++ data |= TX_DMA_SWC_V2 | QID_BITS_V2(info->qid); ++ WRITE_ONCE(desc->txd4, data); ++ ++ data = 0; ++ if (info->first) { ++ if (info->gso) ++ data |= TX_DMA_TSO_V2; ++ /* tx checksum offload */ ++ if (info->csum) ++ data |= TX_DMA_CHKSUM_V2; ++ } ++ WRITE_ONCE(desc->txd5, data); ++ ++ data = 0; ++ if (info->first && info->vlan) ++ data |= TX_DMA_INS_VLAN_V2 | info->vlan_tci; ++ WRITE_ONCE(desc->txd6, data); ++ ++ WRITE_ONCE(desc->txd7, 0); ++ WRITE_ONCE(desc->txd8, 0); ++} ++ ++static void mtk_tx_set_dma_desc(struct net_device *dev, void *txd, ++ struct mtk_tx_dma_desc_info *info) ++{ ++ struct mtk_mac *mac = netdev_priv(dev); ++ struct mtk_eth *eth = mac->hw; ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ mtk_tx_set_dma_desc_v2(dev, txd, info); ++ else ++ mtk_tx_set_dma_desc_v1(dev, txd, info); ++} ++ + static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, + int tx_num, struct mtk_tx_ring *ring, bool gso) + { +@@ -1065,6 +1130,7 @@ static int mtk_tx_map(struct sk_buff *sk + .gso = gso, + .csum = skb->ip_summed == CHECKSUM_PARTIAL, + .vlan = skb_vlan_tag_present(skb), ++ .qid = skb->mark & MTK_QDMA_TX_MASK, + .vlan_tci = skb_vlan_tag_get(skb), + .first = true, + .last = !skb_is_nonlinear(skb), +@@ -1124,7 +1190,9 @@ static int mtk_tx_map(struct sk_buff *sk + } + + memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info)); +- txd_info.size = min(frag_size, MTK_TX_DMA_BUF_LEN); ++ txd_info.size = min_t(unsigned int, frag_size, ++ soc->txrx.dma_max_len); ++ txd_info.qid = skb->mark & MTK_QDMA_TX_MASK; + txd_info.last = i == skb_shinfo(skb)->nr_frags - 1 && + !(frag_size - txd_info.size); + txd_info.addr = skb_frag_dma_map(eth->dma_dev, frag, +@@ -1205,17 +1273,16 @@ err_dma: + return -ENOMEM; + } + +-static inline int mtk_cal_txd_req(struct sk_buff *skb) ++static int mtk_cal_txd_req(struct mtk_eth *eth, struct sk_buff *skb) + { +- int i, nfrags; ++ int i, nfrags = 1; + skb_frag_t *frag; + +- nfrags = 1; + if (skb_is_gso(skb)) { + for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { + frag = &skb_shinfo(skb)->frags[i]; + nfrags += DIV_ROUND_UP(skb_frag_size(frag), +- MTK_TX_DMA_BUF_LEN); ++ eth->soc->txrx.dma_max_len); + } + } else { + nfrags += skb_shinfo(skb)->nr_frags; +@@ -1267,7 +1334,7 @@ static netdev_tx_t mtk_start_xmit(struct + if (unlikely(test_bit(MTK_RESETTING, ð->state))) + goto drop; + +- tx_num = mtk_cal_txd_req(skb); ++ tx_num = mtk_cal_txd_req(eth, skb); + if (unlikely(atomic_read(&ring->free_count) <= tx_num)) { + netif_stop_queue(dev); + netif_err(eth, tx_queued, dev, +@@ -1359,7 +1426,7 @@ static int mtk_poll_rx(struct napi_struc + int idx; + struct sk_buff *skb; + u8 *data, *new_data; +- struct mtk_rx_dma *rxd, trxd; ++ struct mtk_rx_dma_v2 *rxd, trxd; + int done = 0, bytes = 0; + + while (done < budget) { +@@ -1367,7 +1434,7 @@ static int mtk_poll_rx(struct napi_struc + unsigned int pktlen; + dma_addr_t dma_addr; + u32 hash, reason; +- int mac; ++ int mac = 0; + + ring = mtk_get_rx_ring(eth); + if (unlikely(!ring)) +@@ -1377,16 +1444,15 @@ static int mtk_poll_rx(struct napi_struc + rxd = (void *)ring->dma + idx * eth->soc->txrx.rxd_size; + data = ring->data[idx]; + +- if (!mtk_rx_get_desc(&trxd, rxd)) ++ if (!mtk_rx_get_desc(eth, &trxd, rxd)) + break; + + /* find out which mac the packet come from. values start at 1 */ +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) || +- (trxd.rxd4 & RX_DMA_SPECIAL_TAG)) +- mac = 0; +- else +- mac = ((trxd.rxd4 >> RX_DMA_FPORT_SHIFT) & +- RX_DMA_FPORT_MASK) - 1; ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ mac = RX_DMA_GET_SPORT_V2(trxd.rxd5) - 1; ++ else if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) && ++ !(trxd.rxd4 & RX_DMA_SPECIAL_TAG)) ++ mac = RX_DMA_GET_SPORT(trxd.rxd4) - 1; + + if (unlikely(mac < 0 || mac >= MTK_MAC_COUNT || + !eth->netdev[mac])) +@@ -1432,7 +1498,7 @@ static int mtk_poll_rx(struct napi_struc + pktlen = RX_DMA_GET_PLEN0(trxd.rxd2); + skb->dev = netdev; + skb_put(skb, pktlen); +- if (trxd.rxd4 & eth->rx_dma_l4_valid) ++ if (trxd.rxd4 & eth->soc->txrx.rx_dma_l4_valid) + skb->ip_summed = CHECKSUM_UNNECESSARY; + else + skb_checksum_none_assert(skb); +@@ -1450,10 +1516,25 @@ static int mtk_poll_rx(struct napi_struc + mtk_ppe_check_skb(eth->ppe, skb, + trxd.rxd4 & MTK_RXD4_FOE_ENTRY); + +- if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX && +- (trxd.rxd2 & RX_DMA_VTAG)) +- __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), +- RX_DMA_VID(trxd.rxd3)); ++ if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) { ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (trxd.rxd3 & RX_DMA_VTAG_V2) ++ __vlan_hwaccel_put_tag(skb, ++ htons(RX_DMA_VPID(trxd.rxd4)), ++ RX_DMA_VID(trxd.rxd4)); ++ } else if (trxd.rxd2 & RX_DMA_VTAG) { ++ __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ++ RX_DMA_VID(trxd.rxd3)); ++ } ++ ++ /* If the device is attached to a dsa switch, the special ++ * tag inserted in VLAN field by hw switch can * be offloaded ++ * by RX HW VLAN offload. Clear vlan info. ++ */ ++ if (netdev_uses_dsa(netdev)) ++ __vlan_hwaccel_clear_tag(skb); ++ } ++ + skb_record_rx_queue(skb, 0); + napi_gro_receive(napi, skb); + +@@ -1465,7 +1546,7 @@ release_desc: + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) + rxd->rxd2 = RX_DMA_LSO; + else +- rxd->rxd2 = RX_DMA_PLEN0(ring->buf_size); ++ rxd->rxd2 = RX_DMA_PREP_PLEN0(ring->buf_size); + + ring->calc_idx = idx; + +@@ -1667,7 +1748,8 @@ static int mtk_napi_rx(struct napi_struc + do { + int rx_done; + +- mtk_w32(eth, MTK_RX_DONE_INT, reg_map->pdma.irq_status); ++ mtk_w32(eth, eth->soc->txrx.rx_irq_done_mask, ++ reg_map->pdma.irq_status); + rx_done = mtk_poll_rx(napi, budget - rx_done_total, eth); + rx_done_total += rx_done; + +@@ -1681,10 +1763,11 @@ static int mtk_napi_rx(struct napi_struc + if (rx_done_total == budget) + return budget; + +- } while (mtk_r32(eth, reg_map->pdma.irq_status) & MTK_RX_DONE_INT); ++ } while (mtk_r32(eth, reg_map->pdma.irq_status) & ++ eth->soc->txrx.rx_irq_done_mask); + + if (napi_complete_done(napi, rx_done_total)) +- mtk_rx_irq_enable(eth, MTK_RX_DONE_INT); ++ mtk_rx_irq_enable(eth, eth->soc->txrx.rx_irq_done_mask); + + return rx_done_total; + } +@@ -1694,7 +1777,7 @@ static int mtk_tx_alloc(struct mtk_eth * + const struct mtk_soc_data *soc = eth->soc; + struct mtk_tx_ring *ring = ð->tx_ring; + int i, sz = soc->txrx.txd_size; +- struct mtk_tx_dma *txd; ++ struct mtk_tx_dma_v2 *txd; + + ring->buf = kcalloc(MTK_DMA_SIZE, sizeof(*ring->buf), + GFP_KERNEL); +@@ -1714,13 +1797,19 @@ static int mtk_tx_alloc(struct mtk_eth * + txd->txd2 = next_ptr; + txd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; + txd->txd4 = 0; ++ if (MTK_HAS_CAPS(soc->caps, MTK_NETSYS_V2)) { ++ txd->txd5 = 0; ++ txd->txd6 = 0; ++ txd->txd7 = 0; ++ txd->txd8 = 0; ++ } + } + + /* On MT7688 (PDMA only) this driver uses the ring->dma structs + * only as the framework. The real HW descriptors are the PDMA + * descriptors in ring->dma_pdma. + */ +- if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { ++ if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { + ring->dma_pdma = dma_alloc_coherent(eth->dma_dev, MTK_DMA_SIZE * sz, + &ring->phys_pdma, GFP_KERNEL); + if (!ring->dma_pdma) +@@ -1800,13 +1889,11 @@ static int mtk_rx_alloc(struct mtk_eth * + struct mtk_rx_ring *ring; + int rx_data_len, rx_dma_size; + int i; +- u32 offset = 0; + + if (rx_flag == MTK_RX_FLAGS_QDMA) { + if (ring_no) + return -EINVAL; + ring = ð->rx_ring_qdma; +- offset = 0x1000; + } else { + ring = ð->rx_ring[ring_no]; + } +@@ -1842,7 +1929,7 @@ static int mtk_rx_alloc(struct mtk_eth * + return -ENOMEM; + + for (i = 0; i < rx_dma_size; i++) { +- struct mtk_rx_dma *rxd; ++ struct mtk_rx_dma_v2 *rxd; + + dma_addr_t dma_addr = dma_map_single(eth->dma_dev, + ring->data[i] + NET_SKB_PAD + eth->ip_align, +@@ -1857,26 +1944,47 @@ static int mtk_rx_alloc(struct mtk_eth * + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) + rxd->rxd2 = RX_DMA_LSO; + else +- rxd->rxd2 = RX_DMA_PLEN0(ring->buf_size); ++ rxd->rxd2 = RX_DMA_PREP_PLEN0(ring->buf_size); + + rxd->rxd3 = 0; + rxd->rxd4 = 0; ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ rxd->rxd5 = 0; ++ rxd->rxd6 = 0; ++ rxd->rxd7 = 0; ++ rxd->rxd8 = 0; ++ } + } + ring->dma_size = rx_dma_size; + ring->calc_idx_update = false; + ring->calc_idx = rx_dma_size - 1; +- ring->crx_idx_reg = reg_map->pdma.pcrx_ptr + ring_no * MTK_QRX_OFFSET; ++ if (rx_flag == MTK_RX_FLAGS_QDMA) ++ ring->crx_idx_reg = reg_map->qdma.qcrx_ptr + ++ ring_no * MTK_QRX_OFFSET; ++ else ++ ring->crx_idx_reg = reg_map->pdma.pcrx_ptr + ++ ring_no * MTK_QRX_OFFSET; + /* make sure that all changes to the dma ring are flushed before we + * continue + */ + wmb(); + +- mtk_w32(eth, ring->phys, +- reg_map->pdma.rx_ptr + ring_no * MTK_QRX_OFFSET + offset); +- mtk_w32(eth, rx_dma_size, +- reg_map->pdma.rx_cnt_cfg + ring_no * MTK_QRX_OFFSET + offset); +- mtk_w32(eth, ring->calc_idx, ring->crx_idx_reg + offset); +- mtk_w32(eth, MTK_PST_DRX_IDX_CFG(ring_no), reg_map->pdma.rst_idx + offset); ++ if (rx_flag == MTK_RX_FLAGS_QDMA) { ++ mtk_w32(eth, ring->phys, ++ reg_map->qdma.rx_ptr + ring_no * MTK_QRX_OFFSET); ++ mtk_w32(eth, rx_dma_size, ++ reg_map->qdma.rx_cnt_cfg + ring_no * MTK_QRX_OFFSET); ++ mtk_w32(eth, MTK_PST_DRX_IDX_CFG(ring_no), ++ reg_map->qdma.rst_idx); ++ } else { ++ mtk_w32(eth, ring->phys, ++ reg_map->pdma.rx_ptr + ring_no * MTK_QRX_OFFSET); ++ mtk_w32(eth, rx_dma_size, ++ reg_map->pdma.rx_cnt_cfg + ring_no * MTK_QRX_OFFSET); ++ mtk_w32(eth, MTK_PST_DRX_IDX_CFG(ring_no), ++ reg_map->pdma.rst_idx); ++ } ++ mtk_w32(eth, ring->calc_idx, ring->crx_idx_reg); + + return 0; + } +@@ -2301,7 +2409,7 @@ static irqreturn_t mtk_handle_irq_rx(int + eth->rx_events++; + if (likely(napi_schedule_prep(ð->rx_napi))) { + __napi_schedule(ð->rx_napi); +- mtk_rx_irq_disable(eth, MTK_RX_DONE_INT); ++ mtk_rx_irq_disable(eth, eth->soc->txrx.rx_irq_done_mask); + } + + return IRQ_HANDLED; +@@ -2325,8 +2433,10 @@ static irqreturn_t mtk_handle_irq(int ir + struct mtk_eth *eth = _eth; + const struct mtk_reg_map *reg_map = eth->soc->reg_map; + +- if (mtk_r32(eth, reg_map->pdma.irq_mask) & MTK_RX_DONE_INT) { +- if (mtk_r32(eth, reg_map->pdma.irq_status) & MTK_RX_DONE_INT) ++ if (mtk_r32(eth, reg_map->pdma.irq_mask) & ++ eth->soc->txrx.rx_irq_done_mask) { ++ if (mtk_r32(eth, reg_map->pdma.irq_status) & ++ eth->soc->txrx.rx_irq_done_mask) + mtk_handle_irq_rx(irq, _eth); + } + if (mtk_r32(eth, reg_map->tx_irq_mask) & MTK_TX_DONE_INT) { +@@ -2344,16 +2454,16 @@ static void mtk_poll_controller(struct n + struct mtk_eth *eth = mac->hw; + + mtk_tx_irq_disable(eth, MTK_TX_DONE_INT); +- mtk_rx_irq_disable(eth, MTK_RX_DONE_INT); ++ mtk_rx_irq_disable(eth, eth->soc->txrx.rx_irq_done_mask); + mtk_handle_irq_rx(eth->irq[2], dev); + mtk_tx_irq_enable(eth, MTK_TX_DONE_INT); +- mtk_rx_irq_enable(eth, MTK_RX_DONE_INT); ++ mtk_rx_irq_enable(eth, eth->soc->txrx.rx_irq_done_mask); + } + #endif + + static int mtk_start_dma(struct mtk_eth *eth) + { +- u32 rx_2b_offset = (NET_IP_ALIGN == 2) ? MTK_RX_2B_OFFSET : 0; ++ u32 val, rx_2b_offset = (NET_IP_ALIGN == 2) ? MTK_RX_2B_OFFSET : 0; + const struct mtk_reg_map *reg_map = eth->soc->reg_map; + int err; + +@@ -2364,12 +2474,19 @@ static int mtk_start_dma(struct mtk_eth + } + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { +- mtk_w32(eth, +- MTK_TX_WB_DDONE | MTK_TX_DMA_EN | +- MTK_TX_BT_32DWORDS | MTK_NDP_CO_PRO | +- MTK_RX_DMA_EN | MTK_RX_2B_OFFSET | +- MTK_RX_BT_32DWORDS, +- reg_map->qdma.glo_cfg); ++ val = mtk_r32(eth, reg_map->qdma.glo_cfg); ++ val |= MTK_TX_DMA_EN | MTK_RX_DMA_EN | ++ MTK_TX_BT_32DWORDS | MTK_NDP_CO_PRO | ++ MTK_RX_2B_OFFSET | MTK_TX_WB_DDONE; ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ val |= MTK_MUTLI_CNT | MTK_RESV_BUF | ++ MTK_WCOMP_EN | MTK_DMAD_WR_WDONE | ++ MTK_CHK_DDONE_EN; ++ else ++ val |= MTK_RX_BT_32DWORDS; ++ mtk_w32(eth, val, reg_map->qdma.glo_cfg); ++ + mtk_w32(eth, + MTK_RX_DMA_EN | rx_2b_offset | + MTK_RX_BT_32DWORDS | MTK_MULTI_EN, +@@ -2443,7 +2560,7 @@ static int mtk_open(struct net_device *d + napi_enable(ð->tx_napi); + napi_enable(ð->rx_napi); + mtk_tx_irq_enable(eth, MTK_TX_DONE_INT); +- mtk_rx_irq_enable(eth, MTK_RX_DONE_INT); ++ mtk_rx_irq_enable(eth, eth->soc->txrx.rx_irq_done_mask); + refcount_set(ð->dma_refcnt, 1); + } + else +@@ -2495,7 +2612,7 @@ static int mtk_stop(struct net_device *d + mtk_gdm_config(eth, MTK_GDMA_DROP_ALL); + + mtk_tx_irq_disable(eth, MTK_TX_DONE_INT); +- mtk_rx_irq_disable(eth, MTK_RX_DONE_INT); ++ mtk_rx_irq_disable(eth, eth->soc->txrx.rx_irq_done_mask); + napi_disable(ð->tx_napi); + napi_disable(ð->rx_napi); + +@@ -2655,9 +2772,25 @@ static int mtk_hw_init(struct mtk_eth *e + return 0; + } + +- /* Non-MT7628 handling... */ +- ethsys_reset(eth, RSTCTRL_FE); +- ethsys_reset(eth, RSTCTRL_PPE); ++ val = RSTCTRL_FE | RSTCTRL_PPE; ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, 0); ++ ++ val |= RSTCTRL_ETH; ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ val |= RSTCTRL_PPE1; ++ } ++ ++ ethsys_reset(eth, val); ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, ++ 0x3ffffff); ++ ++ /* Set FE to PDMAv2 if necessary */ ++ val = mtk_r32(eth, MTK_FE_GLO_MISC); ++ mtk_w32(eth, val | BIT(4), MTK_FE_GLO_MISC); ++ } + + if (eth->pctl) { + /* Set GE2 driving and slew rate */ +@@ -2696,11 +2829,47 @@ static int mtk_hw_init(struct mtk_eth *e + + /* FE int grouping */ + mtk_w32(eth, MTK_TX_DONE_INT, reg_map->pdma.int_grp); +- mtk_w32(eth, MTK_RX_DONE_INT, reg_map->pdma.int_grp + 4); ++ mtk_w32(eth, eth->soc->txrx.rx_irq_done_mask, reg_map->pdma.int_grp + 4); + mtk_w32(eth, MTK_TX_DONE_INT, reg_map->qdma.int_grp); +- mtk_w32(eth, MTK_RX_DONE_INT, reg_map->qdma.int_grp + 4); ++ mtk_w32(eth, eth->soc->txrx.rx_irq_done_mask, reg_map->qdma.int_grp + 4); + mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP); + ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ /* PSE should not drop port8 and port9 packets */ ++ mtk_w32(eth, 0x00000300, PSE_DROP_CFG); ++ ++ /* PSE Free Queue Flow Control */ ++ mtk_w32(eth, 0x01fa01f4, PSE_FQFC_CFG2); ++ ++ /* PSE config input queue threshold */ ++ mtk_w32(eth, 0x001a000e, PSE_IQ_REV(1)); ++ mtk_w32(eth, 0x01ff001a, PSE_IQ_REV(2)); ++ mtk_w32(eth, 0x000e01ff, PSE_IQ_REV(3)); ++ mtk_w32(eth, 0x000e000e, PSE_IQ_REV(4)); ++ mtk_w32(eth, 0x000e000e, PSE_IQ_REV(5)); ++ mtk_w32(eth, 0x000e000e, PSE_IQ_REV(6)); ++ mtk_w32(eth, 0x000e000e, PSE_IQ_REV(7)); ++ mtk_w32(eth, 0x000e000e, PSE_IQ_REV(8)); ++ ++ /* PSE config output queue threshold */ ++ mtk_w32(eth, 0x000f000a, PSE_OQ_TH(1)); ++ mtk_w32(eth, 0x001a000f, PSE_OQ_TH(2)); ++ mtk_w32(eth, 0x000f001a, PSE_OQ_TH(3)); ++ mtk_w32(eth, 0x01ff000f, PSE_OQ_TH(4)); ++ mtk_w32(eth, 0x000f000f, PSE_OQ_TH(5)); ++ mtk_w32(eth, 0x0006000f, PSE_OQ_TH(6)); ++ mtk_w32(eth, 0x00060006, PSE_OQ_TH(7)); ++ mtk_w32(eth, 0x00060006, PSE_OQ_TH(8)); ++ ++ /* GDM and CDM Threshold */ ++ mtk_w32(eth, 0x00000004, MTK_GDM2_THRES); ++ mtk_w32(eth, 0x00000004, MTK_CDMW0_THRES); ++ mtk_w32(eth, 0x00000004, MTK_CDMW1_THRES); ++ mtk_w32(eth, 0x00000004, MTK_CDME0_THRES); ++ mtk_w32(eth, 0x00000004, MTK_CDME1_THRES); ++ mtk_w32(eth, 0x00000004, MTK_CDMM_THRES); ++ } ++ + return 0; + + err_disable_pm: +@@ -3230,12 +3399,8 @@ static int mtk_probe(struct platform_dev + if (IS_ERR(eth->base)) + return PTR_ERR(eth->base); + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) { +- eth->rx_dma_l4_valid = RX_DMA_L4_VALID_PDMA; ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) + eth->ip_align = NET_IP_ALIGN; +- } else { +- eth->rx_dma_l4_valid = RX_DMA_L4_VALID; +- } + + spin_lock_init(ð->page_lock); + spin_lock_init(ð->tx_irq_lock); +@@ -3471,6 +3636,10 @@ static const struct mtk_soc_data mt2701_ + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), ++ .rx_irq_done_mask = MTK_RX_DONE_INT, ++ .rx_dma_l4_valid = RX_DMA_L4_VALID, ++ .dma_max_len = MTK_TX_DMA_BUF_LEN, ++ .dma_len_offset = 16, + }, + }; + +@@ -3484,6 +3653,10 @@ static const struct mtk_soc_data mt7621_ + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), ++ .rx_irq_done_mask = MTK_RX_DONE_INT, ++ .rx_dma_l4_valid = RX_DMA_L4_VALID, ++ .dma_max_len = MTK_TX_DMA_BUF_LEN, ++ .dma_len_offset = 16, + }, + }; + +@@ -3498,6 +3671,10 @@ static const struct mtk_soc_data mt7622_ + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), ++ .rx_irq_done_mask = MTK_RX_DONE_INT, ++ .rx_dma_l4_valid = RX_DMA_L4_VALID, ++ .dma_max_len = MTK_TX_DMA_BUF_LEN, ++ .dma_len_offset = 16, + }, + }; + +@@ -3511,6 +3688,10 @@ static const struct mtk_soc_data mt7623_ + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), ++ .rx_irq_done_mask = MTK_RX_DONE_INT, ++ .rx_dma_l4_valid = RX_DMA_L4_VALID, ++ .dma_max_len = MTK_TX_DMA_BUF_LEN, ++ .dma_len_offset = 16, + }, + }; + +@@ -3524,6 +3705,10 @@ static const struct mtk_soc_data mt7629_ + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), ++ .rx_irq_done_mask = MTK_RX_DONE_INT, ++ .rx_dma_l4_valid = RX_DMA_L4_VALID, ++ .dma_max_len = MTK_TX_DMA_BUF_LEN, ++ .dma_len_offset = 16, + }, + }; + +@@ -3536,6 +3721,10 @@ static const struct mtk_soc_data rt5350_ + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), ++ .rx_irq_done_mask = MTK_RX_DONE_INT, ++ .rx_dma_l4_valid = RX_DMA_L4_VALID_PDMA, ++ .dma_max_len = MTK_TX_DMA_BUF_LEN, ++ .dma_len_offset = 16, + }, + }; + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -23,6 +23,7 @@ + #define MTK_MAX_RX_LENGTH 1536 + #define MTK_MAX_RX_LENGTH_2K 2048 + #define MTK_TX_DMA_BUF_LEN 0x3fff ++#define MTK_TX_DMA_BUF_LEN_V2 0xffff + #define MTK_DMA_SIZE 512 + #define MTK_NAPI_WEIGHT 64 + #define MTK_MAC_COUNT 2 +@@ -83,6 +84,10 @@ + #define MTK_CDMQ_IG_CTRL 0x1400 + #define MTK_CDMQ_STAG_EN BIT(0) + ++/* CDMP Ingress Control Register */ ++#define MTK_CDMP_IG_CTRL 0x400 ++#define MTK_CDMP_STAG_EN BIT(0) ++ + /* CDMP Exgress Control Register */ + #define MTK_CDMP_EG_CTRL 0x404 + +@@ -102,13 +107,38 @@ + /* Unicast Filter MAC Address Register - High */ + #define MTK_GDMA_MAC_ADRH(x) (0x50C + (x * 0x1000)) + ++/* FE global misc reg*/ ++#define MTK_FE_GLO_MISC 0x124 ++ ++/* PSE Free Queue Flow Control */ ++#define PSE_FQFC_CFG1 0x100 ++#define PSE_FQFC_CFG2 0x104 ++#define PSE_DROP_CFG 0x108 ++ ++/* PSE Input Queue Reservation Register*/ ++#define PSE_IQ_REV(x) (0x140 + (((x) - 1) << 2)) ++ ++/* PSE Output Queue Threshold Register*/ ++#define PSE_OQ_TH(x) (0x160 + (((x) - 1) << 2)) ++ ++/* GDM and CDM Threshold */ ++#define MTK_GDM2_THRES 0x1530 ++#define MTK_CDMW0_THRES 0x164c ++#define MTK_CDMW1_THRES 0x1650 ++#define MTK_CDME0_THRES 0x1654 ++#define MTK_CDME1_THRES 0x1658 ++#define MTK_CDMM_THRES 0x165c ++ + /* PDMA HW LRO Control Registers */ + #define MTK_PDMA_LRO_CTRL_DW0 0x980 + #define MTK_LRO_EN BIT(0) + #define MTK_L3_CKS_UPD_EN BIT(7) ++#define MTK_L3_CKS_UPD_EN_V2 BIT(19) + #define MTK_LRO_ALT_PKT_CNT_MODE BIT(21) + #define MTK_LRO_RING_RELINQUISH_REQ (0x7 << 26) ++#define MTK_LRO_RING_RELINQUISH_REQ_V2 (0xf << 24) + #define MTK_LRO_RING_RELINQUISH_DONE (0x7 << 29) ++#define MTK_LRO_RING_RELINQUISH_DONE_V2 (0xf << 28) + + #define MTK_PDMA_LRO_CTRL_DW1 0x984 + #define MTK_PDMA_LRO_CTRL_DW2 0x988 +@@ -180,6 +210,13 @@ + #define MTK_TX_DMA_EN BIT(0) + #define MTK_DMA_BUSY_TIMEOUT_US 1000000 + ++/* QDMA V2 Global Configuration Register */ ++#define MTK_CHK_DDONE_EN BIT(28) ++#define MTK_DMAD_WR_WDONE BIT(26) ++#define MTK_WCOMP_EN BIT(24) ++#define MTK_RESV_BUF (0x40 << 16) ++#define MTK_MUTLI_CNT (0x4 << 12) ++ + /* QDMA Flow Control Register */ + #define FC_THRES_DROP_MODE BIT(20) + #define FC_THRES_DROP_EN (7 << 16) +@@ -199,11 +236,32 @@ + #define MTK_RX_DONE_INT MTK_RX_DONE_DLY + #define MTK_TX_DONE_INT MTK_TX_DONE_DLY + ++#define MTK_RX_DONE_INT_V2 BIT(14) ++ + /* QDMA Interrupt grouping registers */ + #define MTK_RLS_DONE_INT BIT(0) + + #define MTK_STAT_OFFSET 0x40 + ++/* QDMA TX NUM */ ++#define MTK_QDMA_TX_NUM 16 ++#define MTK_QDMA_TX_MASK (MTK_QDMA_TX_NUM - 1) ++#define QID_BITS_V2(x) (((x) & 0x3f) << 16) ++#define MTK_QDMA_GMAC2_QID 8 ++ ++#define MTK_TX_DMA_BUF_SHIFT 8 ++ ++/* QDMA V2 descriptor txd6 */ ++#define TX_DMA_INS_VLAN_V2 BIT(16) ++/* QDMA V2 descriptor txd5 */ ++#define TX_DMA_CHKSUM_V2 (0x7 << 28) ++#define TX_DMA_TSO_V2 BIT(31) ++ ++/* QDMA V2 descriptor txd4 */ ++#define TX_DMA_FPORT_SHIFT_V2 8 ++#define TX_DMA_FPORT_MASK_V2 0xf ++#define TX_DMA_SWC_V2 BIT(30) ++ + #define MTK_WDMA0_BASE 0x2800 + #define MTK_WDMA1_BASE 0x2c00 + +@@ -217,10 +275,9 @@ + /* QDMA descriptor txd3 */ + #define TX_DMA_OWNER_CPU BIT(31) + #define TX_DMA_LS0 BIT(30) +-#define TX_DMA_PLEN0(_x) (((_x) & MTK_TX_DMA_BUF_LEN) << 16) +-#define TX_DMA_PLEN1(_x) ((_x) & MTK_TX_DMA_BUF_LEN) ++#define TX_DMA_PLEN0(x) (((x) & eth->soc->txrx.dma_max_len) << eth->soc->txrx.dma_len_offset) ++#define TX_DMA_PLEN1(x) ((x) & eth->soc->txrx.dma_max_len) + #define TX_DMA_SWC BIT(14) +-#define TX_DMA_SDL(_x) (((_x) & 0x3fff) << 16) + + /* PDMA on MT7628 */ + #define TX_DMA_DONE BIT(31) +@@ -230,12 +287,14 @@ + /* QDMA descriptor rxd2 */ + #define RX_DMA_DONE BIT(31) + #define RX_DMA_LSO BIT(30) +-#define RX_DMA_PLEN0(_x) (((_x) & 0x3fff) << 16) +-#define RX_DMA_GET_PLEN0(_x) (((_x) >> 16) & 0x3fff) ++#define RX_DMA_PREP_PLEN0(x) (((x) & eth->soc->txrx.dma_max_len) << eth->soc->txrx.dma_len_offset) ++#define RX_DMA_GET_PLEN0(x) (((x) >> eth->soc->txrx.dma_len_offset) & eth->soc->txrx.dma_max_len) + #define RX_DMA_VTAG BIT(15) + + /* QDMA descriptor rxd3 */ +-#define RX_DMA_VID(_x) ((_x) & 0xfff) ++#define RX_DMA_VID(x) ((x) & VLAN_VID_MASK) ++#define RX_DMA_TCI(x) ((x) & (VLAN_PRIO_MASK | VLAN_VID_MASK)) ++#define RX_DMA_VPID(x) (((x) >> 16) & 0xffff) + + /* QDMA descriptor rxd4 */ + #define MTK_RXD4_FOE_ENTRY GENMASK(13, 0) +@@ -246,10 +305,15 @@ + /* QDMA descriptor rxd4 */ + #define RX_DMA_L4_VALID BIT(24) + #define RX_DMA_L4_VALID_PDMA BIT(30) /* when PDMA is used */ +-#define RX_DMA_FPORT_SHIFT 19 +-#define RX_DMA_FPORT_MASK 0x7 + #define RX_DMA_SPECIAL_TAG BIT(22) + ++#define RX_DMA_GET_SPORT(x) (((x) >> 19) & 0xf) ++#define RX_DMA_GET_SPORT_V2(x) (((x) >> 26) & 0x7) ++ ++/* PDMA V2 descriptor rxd3 */ ++#define RX_DMA_VTAG_V2 BIT(0) ++#define RX_DMA_L4_VALID_V2 BIT(2) ++ + /* PHY Indirect Access Control registers */ + #define MTK_PHY_IAC 0x10004 + #define PHY_IAC_ACCESS BIT(31) +@@ -371,6 +435,16 @@ + #define ETHSYS_TRGMII_MT7621_DDR_PLL BIT(5) + + /* ethernet reset control register */ ++#define ETHSYS_RSTCTRL 0x34 ++#define RSTCTRL_FE BIT(6) ++#define RSTCTRL_PPE BIT(31) ++#define RSTCTRL_PPE1 BIT(30) ++#define RSTCTRL_ETH BIT(23) ++ ++/* ethernet reset check idle register */ ++#define ETHSYS_FE_RST_CHK_IDLE_EN 0x28 ++ ++/* ethernet reset control register */ + #define ETHSYS_RSTCTRL 0x34 + #define RSTCTRL_FE BIT(6) + #define RSTCTRL_PPE BIT(31) +@@ -454,6 +528,17 @@ struct mtk_rx_dma { + unsigned int rxd4; + } __packed __aligned(4); + ++struct mtk_rx_dma_v2 { ++ unsigned int rxd1; ++ unsigned int rxd2; ++ unsigned int rxd3; ++ unsigned int rxd4; ++ unsigned int rxd5; ++ unsigned int rxd6; ++ unsigned int rxd7; ++ unsigned int rxd8; ++} __packed __aligned(4); ++ + struct mtk_tx_dma { + unsigned int txd1; + unsigned int txd2; +@@ -461,6 +546,17 @@ struct mtk_tx_dma { + unsigned int txd4; + } __packed __aligned(4); + ++struct mtk_tx_dma_v2 { ++ unsigned int txd1; ++ unsigned int txd2; ++ unsigned int txd3; ++ unsigned int txd4; ++ unsigned int txd5; ++ unsigned int txd6; ++ unsigned int txd7; ++ unsigned int txd8; ++} __packed __aligned(4); ++ + struct mtk_eth; + struct mtk_mac; + +@@ -647,7 +743,9 @@ enum mkt_eth_capabilities { + MTK_SHARED_INT_BIT, + MTK_TRGMII_MT7621_CLK_BIT, + MTK_QDMA_BIT, ++ MTK_NETSYS_V2_BIT, + MTK_SOC_MT7628_BIT, ++ MTK_RSTCTRL_PPE1_BIT, + + /* MUX BITS*/ + MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT, +@@ -679,7 +777,9 @@ enum mkt_eth_capabilities { + #define MTK_SHARED_INT BIT(MTK_SHARED_INT_BIT) + #define MTK_TRGMII_MT7621_CLK BIT(MTK_TRGMII_MT7621_CLK_BIT) + #define MTK_QDMA BIT(MTK_QDMA_BIT) ++#define MTK_NETSYS_V2 BIT(MTK_NETSYS_V2_BIT) + #define MTK_SOC_MT7628 BIT(MTK_SOC_MT7628_BIT) ++#define MTK_RSTCTRL_PPE1 BIT(MTK_RSTCTRL_PPE1_BIT) + + #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \ + BIT(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT) +@@ -756,6 +856,7 @@ struct mtk_tx_dma_desc_info { + dma_addr_t addr; + u32 size; + u16 vlan_tci; ++ u16 qid; + u8 gso:1; + u8 csum:1; + u8 vlan:1; +@@ -813,6 +914,10 @@ struct mtk_reg_map { + * the extra setup for those pins used by GMAC. + * @txd_size Tx DMA descriptor size. + * @rxd_size Rx DMA descriptor size. ++ * @rx_irq_done_mask Rx irq done register mask. ++ * @rx_dma_l4_valid Rx DMA valid register mask. ++ * @dma_max_len Max DMA tx/rx buffer length. ++ * @dma_len_offset Tx/Rx DMA length field offset. + */ + struct mtk_soc_data { + const struct mtk_reg_map *reg_map; +@@ -825,6 +930,10 @@ struct mtk_soc_data { + struct { + u32 txd_size; + u32 rxd_size; ++ u32 rx_irq_done_mask; ++ u32 rx_dma_l4_valid; ++ u32 dma_max_len; ++ u32 dma_len_offset; + } txrx; + }; + +@@ -943,7 +1052,6 @@ struct mtk_eth { + u32 tx_bytes; + struct dim tx_dim; + +- u32 rx_dma_l4_valid; + int ip_align; + + struct mtk_ppe *ppe; diff --git a/target/linux/generic/backport-5.15/702-v5.19-28-net-ethernet-mtk_eth_soc-convert-ring-dma-pointer-to.patch b/target/linux/generic/backport-5.15/702-v5.19-28-net-ethernet-mtk_eth_soc-convert-ring-dma-pointer-to.patch new file mode 100644 index 0000000000..1ecb5e71b3 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-28-net-ethernet-mtk_eth_soc-convert-ring-dma-pointer-to.patch @@ -0,0 +1,135 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:37 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: convert ring dma pointer to void + +Simplify the code converting {tx,rx} ring dma pointer to void + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -947,18 +947,15 @@ static int mtk_init_fq_dma(struct mtk_et + return 0; + } + +-static inline void *mtk_qdma_phys_to_virt(struct mtk_tx_ring *ring, u32 desc) ++static void *mtk_qdma_phys_to_virt(struct mtk_tx_ring *ring, u32 desc) + { +- void *ret = ring->dma; +- +- return ret + (desc - ring->phys); ++ return ring->dma + (desc - ring->phys); + } + + static struct mtk_tx_buf *mtk_desc_to_tx_buf(struct mtk_tx_ring *ring, +- struct mtk_tx_dma *txd, +- u32 txd_size) ++ void *txd, u32 txd_size) + { +- int idx = ((void *)txd - (void *)ring->dma) / txd_size; ++ int idx = (txd - ring->dma) / txd_size; + + return &ring->buf[idx]; + } +@@ -966,13 +963,12 @@ static struct mtk_tx_buf *mtk_desc_to_tx + static struct mtk_tx_dma *qdma_to_pdma(struct mtk_tx_ring *ring, + struct mtk_tx_dma *dma) + { +- return ring->dma_pdma - ring->dma + dma; ++ return ring->dma_pdma - (struct mtk_tx_dma *)ring->dma + dma; + } + +-static int txd_to_idx(struct mtk_tx_ring *ring, struct mtk_tx_dma *dma, +- u32 txd_size) ++static int txd_to_idx(struct mtk_tx_ring *ring, void *dma, u32 txd_size) + { +- return ((void *)dma - (void *)ring->dma) / txd_size; ++ return (dma - ring->dma) / txd_size; + } + + static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf, +@@ -1389,7 +1385,7 @@ static struct mtk_rx_ring *mtk_get_rx_ri + + ring = ð->rx_ring[i]; + idx = NEXT_DESP_IDX(ring->calc_idx, ring->dma_size); +- rxd = (void *)ring->dma + idx * eth->soc->txrx.rxd_size; ++ rxd = ring->dma + idx * eth->soc->txrx.rxd_size; + if (rxd->rxd2 & RX_DMA_DONE) { + ring->calc_idx_update = true; + return ring; +@@ -1441,7 +1437,7 @@ static int mtk_poll_rx(struct napi_struc + goto rx_done; + + idx = NEXT_DESP_IDX(ring->calc_idx, ring->dma_size); +- rxd = (void *)ring->dma + idx * eth->soc->txrx.rxd_size; ++ rxd = ring->dma + idx * eth->soc->txrx.rxd_size; + data = ring->data[idx]; + + if (!mtk_rx_get_desc(eth, &trxd, rxd)) +@@ -1648,7 +1644,7 @@ static int mtk_poll_tx_pdma(struct mtk_e + + mtk_tx_unmap(eth, tx_buf, true); + +- desc = (void *)ring->dma + cpu * eth->soc->txrx.txd_size; ++ desc = ring->dma + cpu * eth->soc->txrx.txd_size; + ring->last_free = desc; + atomic_inc(&ring->free_count); + +@@ -1793,7 +1789,7 @@ static int mtk_tx_alloc(struct mtk_eth * + int next = (i + 1) % MTK_DMA_SIZE; + u32 next_ptr = ring->phys + next * sz; + +- txd = (void *)ring->dma + i * sz; ++ txd = ring->dma + i * sz; + txd->txd2 = next_ptr; + txd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; + txd->txd4 = 0; +@@ -1823,7 +1819,7 @@ static int mtk_tx_alloc(struct mtk_eth * + + ring->dma_size = MTK_DMA_SIZE; + atomic_set(&ring->free_count, MTK_DMA_SIZE - 2); +- ring->next_free = &ring->dma[0]; ++ ring->next_free = ring->dma; + ring->last_free = (void *)txd; + ring->last_free_ptr = (u32)(ring->phys + ((MTK_DMA_SIZE - 1) * sz)); + ring->thresh = MAX_SKB_FRAGS; +@@ -1938,7 +1934,7 @@ static int mtk_rx_alloc(struct mtk_eth * + if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) + return -ENOMEM; + +- rxd = (void *)ring->dma + i * eth->soc->txrx.rxd_size; ++ rxd = ring->dma + i * eth->soc->txrx.rxd_size; + rxd->rxd1 = (unsigned int)dma_addr; + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) +@@ -2000,7 +1996,7 @@ static void mtk_rx_clean(struct mtk_eth + if (!ring->data[i]) + continue; + +- rxd = (void *)ring->dma + i * eth->soc->txrx.rxd_size; ++ rxd = ring->dma + i * eth->soc->txrx.rxd_size; + if (!rxd->rxd1) + continue; + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -689,7 +689,7 @@ struct mtk_tx_buf { + * are present + */ + struct mtk_tx_ring { +- struct mtk_tx_dma *dma; ++ void *dma; + struct mtk_tx_buf *buf; + dma_addr_t phys; + struct mtk_tx_dma *next_free; +@@ -719,7 +719,7 @@ enum mtk_rx_flags { + * @calc_idx: The current head of ring + */ + struct mtk_rx_ring { +- struct mtk_rx_dma *dma; ++ void *dma; + u8 **data; + dma_addr_t phys; + u16 frag_size; diff --git a/target/linux/generic/backport-5.15/702-v5.19-29-net-ethernet-mtk_eth_soc-convert-scratch_ring-pointe.patch b/target/linux/generic/backport-5.15/702-v5.19-29-net-ethernet-mtk_eth_soc-convert-scratch_ring-pointe.patch new file mode 100644 index 0000000000..f7318e68bb --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-29-net-ethernet-mtk_eth_soc-convert-scratch_ring-pointe.patch @@ -0,0 +1,33 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:38 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: convert scratch_ring pointer to + void + +Simplify the code converting scratch_ring pointer to void + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -923,7 +923,7 @@ static int mtk_init_fq_dma(struct mtk_et + for (i = 0; i < cnt; i++) { + struct mtk_tx_dma_v2 *txd; + +- txd = (void *)eth->scratch_ring + i * soc->txrx.txd_size; ++ txd = eth->scratch_ring + i * soc->txrx.txd_size; + txd->txd1 = dma_addr + i * MTK_QDMA_PAGE_SIZE; + if (i < cnt - 1) + txd->txd2 = eth->phy_scratch_ring + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1029,7 +1029,7 @@ struct mtk_eth { + struct mtk_rx_ring rx_ring_qdma; + struct napi_struct tx_napi; + struct napi_struct rx_napi; +- struct mtk_tx_dma *scratch_ring; ++ void *scratch_ring; + dma_addr_t phy_scratch_ring; + void *scratch_head; + struct clk *clks[MTK_CLK_MAX]; diff --git a/target/linux/generic/backport-5.15/702-v5.19-30-net-ethernet-mtk_eth_soc-introduce-support-for-mt798.patch b/target/linux/generic/backport-5.15/702-v5.19-30-net-ethernet-mtk_eth_soc-introduce-support-for-mt798.patch new file mode 100644 index 0000000000..713d24b3c9 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-30-net-ethernet-mtk_eth_soc-introduce-support-for-mt798.patch @@ -0,0 +1,138 @@ +From: Lorenzo Bianconi +Date: Fri, 20 May 2022 20:11:39 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: introduce support for mt7986 + chipset + +Add support for mt7986-eth driver available on mt7986 soc. + +Tested-by: Sam Shih +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -87,6 +87,43 @@ static const struct mtk_reg_map mt7628_r + }, + }; + ++static const struct mtk_reg_map mt7986_reg_map = { ++ .tx_irq_mask = 0x461c, ++ .tx_irq_status = 0x4618, ++ .pdma = { ++ .rx_ptr = 0x6100, ++ .rx_cnt_cfg = 0x6104, ++ .pcrx_ptr = 0x6108, ++ .glo_cfg = 0x6204, ++ .rst_idx = 0x6208, ++ .delay_irq = 0x620c, ++ .irq_status = 0x6220, ++ .irq_mask = 0x6228, ++ .int_grp = 0x6250, ++ }, ++ .qdma = { ++ .qtx_cfg = 0x4400, ++ .rx_ptr = 0x4500, ++ .rx_cnt_cfg = 0x4504, ++ .qcrx_ptr = 0x4508, ++ .glo_cfg = 0x4604, ++ .rst_idx = 0x4608, ++ .delay_irq = 0x460c, ++ .fc_th = 0x4610, ++ .int_grp = 0x4620, ++ .hred = 0x4644, ++ .ctx_ptr = 0x4700, ++ .dtx_ptr = 0x4704, ++ .crx_ptr = 0x4710, ++ .drx_ptr = 0x4714, ++ .fq_head = 0x4720, ++ .fq_tail = 0x4724, ++ .fq_count = 0x4728, ++ .fq_blen = 0x472c, ++ }, ++ .gdm1_cnt = 0x1c00, ++}; ++ + /* strings used by ethtool */ + static const struct mtk_ethtool_stats { + char str[ETH_GSTRING_LEN]; +@@ -110,7 +147,7 @@ static const char * const mtk_clks_sourc + "ethif", "sgmiitop", "esw", "gp0", "gp1", "gp2", "fe", "trgpll", + "sgmii_tx250m", "sgmii_rx250m", "sgmii_cdr_ref", "sgmii_cdr_fb", + "sgmii2_tx250m", "sgmii2_rx250m", "sgmii2_cdr_ref", "sgmii2_cdr_fb", +- "sgmii_ck", "eth2pll", ++ "sgmii_ck", "eth2pll", "wocpu0", "wocpu1", "netsys0", "netsys1" + }; + + void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg) +@@ -3708,6 +3745,21 @@ static const struct mtk_soc_data mt7629_ + }, + }; + ++static const struct mtk_soc_data mt7986_data = { ++ .reg_map = &mt7986_reg_map, ++ .ana_rgc3 = 0x128, ++ .caps = MT7986_CAPS, ++ .required_clks = MT7986_CLKS_BITMAP, ++ .required_pctl = false, ++ .txrx = { ++ .txd_size = sizeof(struct mtk_tx_dma_v2), ++ .rxd_size = sizeof(struct mtk_rx_dma_v2), ++ .rx_irq_done_mask = MTK_RX_DONE_INT_V2, ++ .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, ++ .dma_len_offset = 8, ++ }, ++}; ++ + static const struct mtk_soc_data rt5350_data = { + .reg_map = &mt7628_reg_map, + .caps = MT7628_CAPS, +@@ -3730,6 +3782,7 @@ const struct of_device_id of_mtk_match[] + { .compatible = "mediatek,mt7622-eth", .data = &mt7622_data}, + { .compatible = "mediatek,mt7623-eth", .data = &mt7623_data}, + { .compatible = "mediatek,mt7629-eth", .data = &mt7629_data}, ++ { .compatible = "mediatek,mt7986-eth", .data = &mt7986_data}, + { .compatible = "ralink,rt5350-eth", .data = &rt5350_data}, + {}, + }; +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -624,6 +624,10 @@ enum mtk_clks_map { + MTK_CLK_SGMII2_CDR_FB, + MTK_CLK_SGMII_CK, + MTK_CLK_ETH2PLL, ++ MTK_CLK_WOCPU0, ++ MTK_CLK_WOCPU1, ++ MTK_CLK_NETSYS0, ++ MTK_CLK_NETSYS1, + MTK_CLK_MAX + }; + +@@ -654,6 +658,16 @@ enum mtk_clks_map { + BIT(MTK_CLK_SGMII2_CDR_FB) | \ + BIT(MTK_CLK_SGMII_CK) | \ + BIT(MTK_CLK_ETH2PLL) | BIT(MTK_CLK_SGMIITOP)) ++#define MT7986_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \ ++ BIT(MTK_CLK_WOCPU1) | BIT(MTK_CLK_WOCPU0) | \ ++ BIT(MTK_CLK_SGMII_TX_250M) | \ ++ BIT(MTK_CLK_SGMII_RX_250M) | \ ++ BIT(MTK_CLK_SGMII_CDR_REF) | \ ++ BIT(MTK_CLK_SGMII_CDR_FB) | \ ++ BIT(MTK_CLK_SGMII2_TX_250M) | \ ++ BIT(MTK_CLK_SGMII2_RX_250M) | \ ++ BIT(MTK_CLK_SGMII2_CDR_REF) | \ ++ BIT(MTK_CLK_SGMII2_CDR_FB)) + + enum mtk_dev_state { + MTK_HW_INIT, +@@ -852,6 +866,10 @@ enum mkt_eth_capabilities { + MTK_MUX_U3_GMAC2_TO_QPHY | \ + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA) + ++#define MT7986_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \ ++ MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ ++ MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1) ++ + struct mtk_tx_dma_desc_info { + dma_addr_t addr; + u32 size; diff --git a/target/linux/generic/backport-5.15/702-v5.19-31-net-ethernet-mtk_eth_soc-fix-error-code-in-mtk_flow_.patch b/target/linux/generic/backport-5.15/702-v5.19-31-net-ethernet-mtk_eth_soc-fix-error-code-in-mtk_flow_.patch new file mode 100644 index 0000000000..e490333a9b --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-31-net-ethernet-mtk_eth_soc-fix-error-code-in-mtk_flow_.patch @@ -0,0 +1,25 @@ +From: Dan Carpenter +Date: Thu, 19 May 2022 17:08:00 +0300 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix error code in + mtk_flow_offload_replace() + +Preserve the error code from mtk_foe_entry_commit(). Do not return +success. + +Fixes: c4f033d9e03e ("net: ethernet: mtk_eth_soc: rework hardware flow table management") +Signed-off-by: Dan Carpenter +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -434,7 +434,8 @@ mtk_flow_offload_replace(struct mtk_eth + memcpy(&entry->data, &foe, sizeof(entry->data)); + entry->wed_index = wed_index; + +- if (mtk_foe_entry_commit(eth->ppe, entry) < 0) ++ err = mtk_foe_entry_commit(eth->ppe, entry); ++ if (err < 0) + goto free; + + err = rhashtable_insert_fast(ð->flow_table, &entry->node, diff --git a/target/linux/generic/backport-5.15/702-v5.19-33-net-ethernet-mtk_eth_soc-enable-rx-cksum-offload-for.patch b/target/linux/generic/backport-5.15/702-v5.19-33-net-ethernet-mtk_eth_soc-enable-rx-cksum-offload-for.patch new file mode 100644 index 0000000000..b05faa9c4b --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-33-net-ethernet-mtk_eth_soc-enable-rx-cksum-offload-for.patch @@ -0,0 +1,47 @@ +From: Lorenzo Bianconi +Date: Mon, 6 Jun 2022 21:49:00 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: enable rx cksum offload for + MTK_NETSYS_V2 + +Enable rx checksum offload for mt7986 chipset. + +Signed-off-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/c8699805c18f7fd38315fcb8da2787676d83a32c.1654544585.git.lorenzo@kernel.org +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1463,8 +1463,8 @@ static int mtk_poll_rx(struct napi_struc + int done = 0, bytes = 0; + + while (done < budget) { ++ unsigned int pktlen, *rxdcsum; + struct net_device *netdev; +- unsigned int pktlen; + dma_addr_t dma_addr; + u32 hash, reason; + int mac = 0; +@@ -1531,7 +1531,13 @@ static int mtk_poll_rx(struct napi_struc + pktlen = RX_DMA_GET_PLEN0(trxd.rxd2); + skb->dev = netdev; + skb_put(skb, pktlen); +- if (trxd.rxd4 & eth->soc->txrx.rx_dma_l4_valid) ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ rxdcsum = &trxd.rxd3; ++ else ++ rxdcsum = &trxd.rxd4; ++ ++ if (*rxdcsum & eth->soc->txrx.rx_dma_l4_valid) + skb->ip_summed = CHECKSUM_UNNECESSARY; + else + skb_checksum_none_assert(skb); +@@ -3755,6 +3761,7 @@ static const struct mtk_soc_data mt7986_ + .txd_size = sizeof(struct mtk_tx_dma_v2), + .rxd_size = sizeof(struct mtk_rx_dma_v2), + .rx_irq_done_mask = MTK_RX_DONE_INT_V2, ++ .rx_dma_l4_valid = RX_DMA_L4_VALID_V2, + .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, + .dma_len_offset = 8, + }, diff --git a/target/linux/generic/backport-5.15/702-v5.19-34-eth-mtk_ppe-fix-up-after-merge.patch b/target/linux/generic/backport-5.15/702-v5.19-34-eth-mtk_ppe-fix-up-after-merge.patch new file mode 100644 index 0000000000..5303ca48a7 --- /dev/null +++ b/target/linux/generic/backport-5.15/702-v5.19-34-eth-mtk_ppe-fix-up-after-merge.patch @@ -0,0 +1,28 @@ +From: Jakub Kicinski +Date: Thu, 19 May 2022 18:25:55 -0700 +Subject: [PATCH] eth: mtk_ppe: fix up after merge + +I missed this in the barrage of GCC 12 warnings. Commit cf2df74e202d +("net: fix dev_fill_forward_path with pppoe + bridge") changed +the pointer into an array. + +Fixes: d7e6f5836038 ("Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net") +Link: https://lore.kernel.org/r/20220520012555.2262461-1-kuba@kernel.org +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -90,10 +90,11 @@ mtk_flow_get_wdma_info(struct net_device + { + struct net_device_path_ctx ctx = { + .dev = dev, +- .daddr = addr, + }; + struct net_device_path path = {}; + ++ memcpy(ctx.daddr, addr, sizeof(ctx.daddr)); ++ + if (!IS_ENABLED(CONFIG_NET_MEDIATEK_SOC_WED)) + return -1; + diff --git a/target/linux/generic/backport-5.15/703-00-v5.16-net-convert-users-of-bitmap_foo-to-linkmode_foo.patch b/target/linux/generic/backport-5.15/703-00-v5.16-net-convert-users-of-bitmap_foo-to-linkmode_foo.patch new file mode 100644 index 0000000000..eca3c7ff9f --- /dev/null +++ b/target/linux/generic/backport-5.15/703-00-v5.16-net-convert-users-of-bitmap_foo-to-linkmode_foo.patch @@ -0,0 +1,948 @@ +From 4973056cceacc70966396039fae99867dfafd796 Mon Sep 17 00:00:00 2001 +From: Sean Anderson +Date: Fri, 22 Oct 2021 18:41:04 -0400 +Subject: [PATCH] net: convert users of bitmap_foo() to linkmode_foo() + +This converts instances of + bitmap_foo(args..., __ETHTOOL_LINK_MODE_MASK_NBITS) +to + linkmode_foo(args...) + +I manually fixed up some lines to prevent them from being excessively +long. Otherwise, this change was generated with the following semantic +patch: + +// Generated with +// echo linux/linkmode.h > includes +// git grep -Flf includes include/ | cut -f 2- -d / | cat includes - \ +// | sort | uniq | tee new_includes | wc -l && mv new_includes includes +// and repeating until the number stopped going up +@i@ +@@ + +( + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +| + #include +) + +@depends on i@ +expression list args; +@@ + +( +- bitmap_zero(args, __ETHTOOL_LINK_MODE_MASK_NBITS) ++ linkmode_zero(args) +| +- bitmap_copy(args, __ETHTOOL_LINK_MODE_MASK_NBITS) ++ linkmode_copy(args) +| +- bitmap_and(args, __ETHTOOL_LINK_MODE_MASK_NBITS) ++ linkmode_and(args) +| +- bitmap_or(args, __ETHTOOL_LINK_MODE_MASK_NBITS) ++ linkmode_or(args) +| +- bitmap_empty(args, ETHTOOL_LINK_MODE_MASK_NBITS) ++ linkmode_empty(args) +| +- bitmap_andnot(args, __ETHTOOL_LINK_MODE_MASK_NBITS) ++ linkmode_andnot(args) +| +- bitmap_equal(args, __ETHTOOL_LINK_MODE_MASK_NBITS) ++ linkmode_equal(args) +| +- bitmap_intersects(args, __ETHTOOL_LINK_MODE_MASK_NBITS) ++ linkmode_intersects(args) +| +- bitmap_subset(args, __ETHTOOL_LINK_MODE_MASK_NBITS) ++ linkmode_subset(args) +) + +Add missing linux/mii.h include to mellanox. -DaveM + +Signed-off-by: Sean Anderson +Signed-off-by: David S. Miller +--- + drivers/net/dsa/b53/b53_common.c | 6 ++---- + drivers/net/dsa/bcm_sf2.c | 8 +++---- + drivers/net/dsa/hirschmann/hellcreek.c | 6 ++---- + drivers/net/dsa/lantiq_gswip.c | 14 ++++++------- + drivers/net/dsa/microchip/ksz8795.c | 8 +++---- + drivers/net/dsa/mv88e6xxx/chip.c | 5 ++--- + drivers/net/dsa/ocelot/felix_vsc9959.c | 8 +++---- + drivers/net/dsa/ocelot/seville_vsc9953.c | 8 +++---- + drivers/net/dsa/qca/ar9331.c | 10 ++++----- + drivers/net/dsa/sja1105/sja1105_main.c | 7 +++---- + drivers/net/dsa/xrs700x/xrs700x.c | 8 +++---- + drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c | 8 +++---- + drivers/net/ethernet/atheros/ag71xx.c | 8 +++---- + drivers/net/ethernet/cadence/macb_main.c | 11 +++++----- + .../net/ethernet/freescale/enetc/enetc_pf.c | 8 +++---- + .../net/ethernet/huawei/hinic/hinic_ethtool.c | 10 ++++----- + .../net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 5 ++--- + drivers/net/ethernet/marvell/mvneta.c | 10 ++++----- + .../net/ethernet/marvell/mvpp2/mvpp2_main.c | 7 +++---- + .../marvell/octeontx2/nic/otx2_ethtool.c | 5 ++--- + drivers/net/ethernet/marvell/pxa168_eth.c | 3 +-- + .../net/ethernet/mellanox/mlx4/en_ethtool.c | 21 +++++++------------ + .../microchip/sparx5/sparx5_phylink.c | 7 +++---- + drivers/net/ethernet/mscc/ocelot_net.c | 7 +++---- + .../ethernet/pensando/ionic/ionic_ethtool.c | 3 +-- + .../net/ethernet/xilinx/xilinx_axienet_main.c | 8 +++---- + drivers/net/pcs/pcs-xpcs.c | 2 +- + drivers/net/phy/sfp-bus.c | 2 +- + net/ethtool/ioctl.c | 7 +++---- + 29 files changed, 87 insertions(+), 133 deletions(-) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -1349,10 +1349,8 @@ void b53_phylink_validate(struct dsa_swi + phylink_set(mask, 100baseT_Full); + } + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + + phylink_helper_basex_speed(state); + } +--- a/drivers/net/dsa/bcm_sf2.c ++++ b/drivers/net/dsa/bcm_sf2.c +@@ -692,7 +692,7 @@ static void bcm_sf2_sw_validate(struct d + state->interface != PHY_INTERFACE_MODE_GMII && + state->interface != PHY_INTERFACE_MODE_INTERNAL && + state->interface != PHY_INTERFACE_MODE_MOCA) { +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + if (port != core_readl(priv, CORE_IMP0_PRT_ID)) + dev_err(ds->dev, + "Unsupported interface: %d for port %d\n", +@@ -720,10 +720,8 @@ static void bcm_sf2_sw_validate(struct d + phylink_set(mask, 100baseT_Half); + phylink_set(mask, 100baseT_Full); + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static void bcm_sf2_sw_mac_config(struct dsa_switch *ds, int port, +--- a/drivers/net/dsa/hirschmann/hellcreek.c ++++ b/drivers/net/dsa/hirschmann/hellcreek.c +@@ -1476,10 +1476,8 @@ static void hellcreek_phylink_validate(s + else + phylink_set(mask, 1000baseT_Full); + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static int +--- a/drivers/net/dsa/lantiq_gswip.c ++++ b/drivers/net/dsa/lantiq_gswip.c +@@ -1452,10 +1452,8 @@ static void gswip_phylink_set_capab(unsi + phylink_set(mask, 100baseT_Half); + phylink_set(mask, 100baseT_Full); + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static void gswip_xrx200_phylink_validate(struct dsa_switch *ds, int port, +@@ -1483,7 +1481,7 @@ static void gswip_xrx200_phylink_validat + goto unsupported; + break; + default: +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + dev_err(ds->dev, "Unsupported port: %i\n", port); + return; + } +@@ -1493,7 +1491,7 @@ static void gswip_xrx200_phylink_validat + return; + + unsupported: +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + dev_err(ds->dev, "Unsupported interface '%s' for port %d\n", + phy_modes(state->interface), port); + } +@@ -1523,7 +1521,7 @@ static void gswip_xrx300_phylink_validat + goto unsupported; + break; + default: +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + dev_err(ds->dev, "Unsupported port: %i\n", port); + return; + } +@@ -1533,7 +1531,7 @@ static void gswip_xrx300_phylink_validat + return; + + unsupported: +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + dev_err(ds->dev, "Unsupported interface '%s' for port %d\n", + phy_modes(state->interface), port); + } +--- a/drivers/net/dsa/microchip/ksz8795.c ++++ b/drivers/net/dsa/microchip/ksz8795.c +@@ -1542,15 +1542,13 @@ static void ksz8_validate(struct dsa_swi + phylink_set(mask, 100baseT_Half); + phylink_set(mask, 100baseT_Full); + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + + return; + + unsupported: +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + dev_err(ds->dev, "Unsupported interface: %s, port: %d\n", + phy_modes(state->interface), port); + } +--- a/drivers/net/dsa/mv88e6xxx/chip.c ++++ b/drivers/net/dsa/mv88e6xxx/chip.c +@@ -683,9 +683,8 @@ static void mv88e6xxx_validate(struct ds + if (chip->info->ops->phylink_validate) + chip->info->ops->phylink_validate(chip, port, mask, state); + +- bitmap_and(supported, supported, mask, __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + + /* We can only operate at 2500BaseX or 1000BaseX. If requested + * to advertise both, only report advertising at 2500BaseX. +--- a/drivers/net/dsa/ocelot/felix_vsc9959.c ++++ b/drivers/net/dsa/ocelot/felix_vsc9959.c +@@ -944,7 +944,7 @@ static void vsc9959_phylink_validate(str + + if (state->interface != PHY_INTERFACE_MODE_NA && + state->interface != ocelot_port->phy_mode) { +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } + +@@ -966,10 +966,8 @@ static void vsc9959_phylink_validate(str + phylink_set(mask, 2500baseX_Full); + } + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static int vsc9959_prevalidate_phy_mode(struct ocelot *ocelot, int port, +--- a/drivers/net/dsa/ocelot/seville_vsc9953.c ++++ b/drivers/net/dsa/ocelot/seville_vsc9953.c +@@ -1000,7 +1000,7 @@ static void vsc9953_phylink_validate(str + + if (state->interface != PHY_INTERFACE_MODE_NA && + state->interface != ocelot_port->phy_mode) { +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } + +@@ -1019,10 +1019,8 @@ static void vsc9953_phylink_validate(str + phylink_set(mask, 2500baseX_Full); + } + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static int vsc9953_prevalidate_phy_mode(struct ocelot *ocelot, int port, +--- a/drivers/net/dsa/qca/ar9331.c ++++ b/drivers/net/dsa/qca/ar9331.c +@@ -522,7 +522,7 @@ static void ar9331_sw_phylink_validate(s + goto unsupported; + break; + default: +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + dev_err(ds->dev, "Unsupported port: %i\n", port); + return; + } +@@ -536,15 +536,13 @@ static void ar9331_sw_phylink_validate(s + phylink_set(mask, 100baseT_Half); + phylink_set(mask, 100baseT_Full); + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + + return; + + unsupported: +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + dev_err(ds->dev, "Unsupported interface: %d, port: %d\n", + state->interface, port); + } +--- a/drivers/net/dsa/sja1105/sja1105_main.c ++++ b/drivers/net/dsa/sja1105/sja1105_main.c +@@ -1360,7 +1360,7 @@ static void sja1105_phylink_validate(str + */ + if (state->interface != PHY_INTERFACE_MODE_NA && + sja1105_phy_mode_mismatch(priv, port, state->interface)) { +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } + +@@ -1380,9 +1380,8 @@ static void sja1105_phylink_validate(str + phylink_set(mask, 2500baseX_Full); + } + +- bitmap_and(supported, supported, mask, __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static int +--- a/drivers/net/dsa/xrs700x/xrs700x.c ++++ b/drivers/net/dsa/xrs700x/xrs700x.c +@@ -457,7 +457,7 @@ static void xrs700x_phylink_validate(str + phylink_set(mask, 1000baseT_Full); + break; + default: +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + dev_err(ds->dev, "Unsupported port: %i\n", port); + return; + } +@@ -468,10 +468,8 @@ static void xrs700x_phylink_validate(str + phylink_set(mask, 10baseT_Full); + phylink_set(mask, 100baseT_Full); + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static void xrs700x_mac_link_up(struct dsa_switch *ds, int port, +--- a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c +@@ -374,9 +374,8 @@ static int xgbe_set_link_ksettings(struc + __ETHTOOL_LINK_MODE_MASK_NBITS, cmd->link_modes.advertising, + __ETHTOOL_LINK_MODE_MASK_NBITS, lks->link_modes.supported); + +- bitmap_and(advertising, +- cmd->link_modes.advertising, lks->link_modes.supported, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(advertising, cmd->link_modes.advertising, ++ lks->link_modes.supported); + + if ((cmd->base.autoneg == AUTONEG_ENABLE) && + bitmap_empty(advertising, __ETHTOOL_LINK_MODE_MASK_NBITS)) { +@@ -389,8 +388,7 @@ static int xgbe_set_link_ksettings(struc + pdata->phy.autoneg = cmd->base.autoneg; + pdata->phy.speed = speed; + pdata->phy.duplex = cmd->base.duplex; +- bitmap_copy(lks->link_modes.advertising, advertising, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_copy(lks->link_modes.advertising, advertising); + + if (cmd->base.autoneg == AUTONEG_ENABLE) + XGBE_SET_ADV(lks, Autoneg); +--- a/drivers/net/ethernet/atheros/ag71xx.c ++++ b/drivers/net/ethernet/atheros/ag71xx.c +@@ -1082,14 +1082,12 @@ static void ag71xx_mac_validate(struct p + phylink_set(mask, 1000baseX_Full); + } + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + + return; + unsupported: +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + } + + static void ag71xx_mac_pcs_get_state(struct phylink_config *config, +--- a/drivers/net/ethernet/cadence/macb_main.c ++++ b/drivers/net/ethernet/cadence/macb_main.c +@@ -523,21 +523,21 @@ static void macb_validate(struct phylink + state->interface != PHY_INTERFACE_MODE_SGMII && + state->interface != PHY_INTERFACE_MODE_10GBASER && + !phy_interface_mode_is_rgmii(state->interface)) { +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } + + if (!macb_is_gem(bp) && + (state->interface == PHY_INTERFACE_MODE_GMII || + phy_interface_mode_is_rgmii(state->interface))) { +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } + + if (state->interface == PHY_INTERFACE_MODE_10GBASER && + !(bp->caps & MACB_CAPS_HIGH_SPEED && + bp->caps & MACB_CAPS_PCS)) { +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } + +@@ -576,9 +576,8 @@ static void macb_validate(struct phylink + phylink_set(mask, 1000baseT_Half); + } + out: +- bitmap_and(supported, supported, mask, __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static void macb_usx_pcs_link_up(struct phylink_pcs *pcs, unsigned int mode, +--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c ++++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c +@@ -965,7 +965,7 @@ static void enetc_pl_mac_validate(struct + state->interface != PHY_INTERFACE_MODE_2500BASEX && + state->interface != PHY_INTERFACE_MODE_USXGMII && + !phy_interface_mode_is_rgmii(state->interface)) { +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } + +@@ -988,10 +988,8 @@ static void enetc_pl_mac_validate(struct + phylink_set(mask, 2500baseX_Full); + } + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static void enetc_pl_mac_config(struct phylink_config *config, +--- a/drivers/net/ethernet/huawei/hinic/hinic_ethtool.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_ethtool.c +@@ -322,12 +322,10 @@ static int hinic_get_link_ksettings(stru + } + } + +- bitmap_copy(link_ksettings->link_modes.supported, +- (unsigned long *)&settings.supported, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_copy(link_ksettings->link_modes.advertising, +- (unsigned long *)&settings.advertising, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_copy(link_ksettings->link_modes.supported, ++ (unsigned long *)&settings.supported); ++ linkmode_copy(link_ksettings->link_modes.advertising, ++ (unsigned long *)&settings.advertising); + + return 0; + } +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +@@ -467,9 +467,8 @@ static int ixgbe_set_link_ksettings(stru + * this function does not support duplex forcing, but can + * limit the advertising of the adapter to the specified speed + */ +- if (!bitmap_subset(cmd->link_modes.advertising, +- cmd->link_modes.supported, +- __ETHTOOL_LINK_MODE_MASK_NBITS)) ++ if (!linkmode_subset(cmd->link_modes.advertising, ++ cmd->link_modes.supported)) + return -EINVAL; + + /* only allow one speed at a time if no autoneg */ +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -3835,14 +3835,14 @@ static void mvneta_validate(struct phyli + */ + if (phy_interface_mode_is_8023z(state->interface)) { + if (!phylink_test(state->advertising, Autoneg)) { +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } + } else if (state->interface != PHY_INTERFACE_MODE_NA && + state->interface != PHY_INTERFACE_MODE_QSGMII && + state->interface != PHY_INTERFACE_MODE_SGMII && + !phy_interface_mode_is_rgmii(state->interface)) { +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } + +@@ -3871,10 +3871,8 @@ static void mvneta_validate(struct phyli + phylink_set(mask, 100baseT_Full); + } + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + + /* We can only operate at 2500BaseX or 1000BaseX. If requested + * to advertise both, only report advertising at 2500BaseX. +--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c ++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +@@ -6352,15 +6352,14 @@ static void mvpp2_phylink_validate(struc + goto empty_set; + } + +- bitmap_and(supported, supported, mask, __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + + phylink_helper_basex_speed(state); + return; + + empty_set: +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + } + + static void mvpp2_xlg_config(struct mvpp2_port *port, unsigned int mode, +--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c ++++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c +@@ -1172,9 +1172,8 @@ static int otx2_set_link_ksettings(struc + otx2_get_link_ksettings(netdev, &cur_ks); + + /* Check requested modes against supported modes by hardware */ +- if (!bitmap_subset(cmd->link_modes.advertising, +- cur_ks.link_modes.supported, +- __ETHTOOL_LINK_MODE_MASK_NBITS)) ++ if (!linkmode_subset(cmd->link_modes.advertising, ++ cur_ks.link_modes.supported)) + return -EINVAL; + + mutex_lock(&mbox->lock); +--- a/drivers/net/ethernet/marvell/pxa168_eth.c ++++ b/drivers/net/ethernet/marvell/pxa168_eth.c +@@ -977,8 +977,7 @@ static int pxa168_init_phy(struct net_de + cmd.base.phy_address = pep->phy_addr; + cmd.base.speed = pep->phy_speed; + cmd.base.duplex = pep->phy_duplex; +- bitmap_copy(cmd.link_modes.advertising, PHY_BASIC_FEATURES, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_copy(cmd.link_modes.advertising, PHY_BASIC_FEATURES); + cmd.base.autoneg = AUTONEG_ENABLE; + + if (cmd.base.speed != 0) +--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +@@ -39,6 +39,7 @@ + #include + #include + #include ++#include + + #include "mlx4_en.h" + #include "en_port.h" +@@ -643,10 +644,8 @@ static unsigned long *ptys2ethtool_link_ + unsigned int i; \ + cfg = &ptys2ethtool_map[reg_]; \ + cfg->speed = speed_; \ +- bitmap_zero(cfg->supported, \ +- __ETHTOOL_LINK_MODE_MASK_NBITS); \ +- bitmap_zero(cfg->advertised, \ +- __ETHTOOL_LINK_MODE_MASK_NBITS); \ ++ linkmode_zero(cfg->supported); \ ++ linkmode_zero(cfg->advertised); \ + for (i = 0 ; i < ARRAY_SIZE(modes) ; ++i) { \ + __set_bit(modes[i], cfg->supported); \ + __set_bit(modes[i], cfg->advertised); \ +@@ -702,10 +701,8 @@ static void ptys2ethtool_update_link_mod + int i; + for (i = 0; i < MLX4_LINK_MODES_SZ; i++) { + if (eth_proto & MLX4_PROT_MASK(i)) +- bitmap_or(link_modes, link_modes, +- ptys2ethtool_link_mode(&ptys2ethtool_map[i], +- report), +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_or(link_modes, link_modes, ++ ptys2ethtool_link_mode(&ptys2ethtool_map[i], report)); + } + } + +@@ -716,11 +713,9 @@ static u32 ethtool2ptys_link_modes(const + u32 ptys_modes = 0; + + for (i = 0; i < MLX4_LINK_MODES_SZ; i++) { +- if (bitmap_intersects( +- ptys2ethtool_link_mode(&ptys2ethtool_map[i], +- report), +- link_modes, +- __ETHTOOL_LINK_MODE_MASK_NBITS)) ++ ulong *map_mode = ptys2ethtool_link_mode(&ptys2ethtool_map[i], ++ report); ++ if (linkmode_intersects(map_mode, link_modes)) + ptys_modes |= 1 << i; + } + return ptys_modes; +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_phylink.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_phylink.c +@@ -92,12 +92,11 @@ static void sparx5_phylink_validate(stru + } + break; + default: +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } +- bitmap_and(supported, supported, mask, __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static void sparx5_phylink_mac_config(struct phylink_config *config, +--- a/drivers/net/ethernet/mscc/ocelot_net.c ++++ b/drivers/net/ethernet/mscc/ocelot_net.c +@@ -1509,7 +1509,7 @@ static void vsc7514_phylink_validate(str + + if (state->interface != PHY_INTERFACE_MODE_NA && + state->interface != ocelot_port->phy_mode) { +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } + +@@ -1528,9 +1528,8 @@ static void vsc7514_phylink_validate(str + phylink_set(mask, 2500baseT_Full); + phylink_set(mask, 2500baseX_Full); + +- bitmap_and(supported, supported, mask, __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static void vsc7514_phylink_mac_config(struct phylink_config *config, +--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c ++++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c +@@ -228,8 +228,7 @@ static int ionic_get_link_ksettings(stru + break; + } + +- bitmap_copy(ks->link_modes.advertising, ks->link_modes.supported, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_copy(ks->link_modes.advertising, ks->link_modes.supported); + + ethtool_link_ksettings_add_link_mode(ks, supported, FEC_BASER); + ethtool_link_ksettings_add_link_mode(ks, supported, FEC_RS); +--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c ++++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +@@ -1565,7 +1565,7 @@ static void axienet_validate(struct phyl + netdev_warn(ndev, "Cannot use PHY mode %s, supported: %s\n", + phy_modes(state->interface), + phy_modes(lp->phy_mode)); +- bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(supported); + return; + } + } +@@ -1598,10 +1598,8 @@ static void axienet_validate(struct phyl + break; + } + +- bitmap_and(supported, supported, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); +- bitmap_and(state->advertising, state->advertising, mask, +- __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); + } + + static void axienet_mac_pcs_get_state(struct phylink_config *config, +--- a/drivers/net/pcs/pcs-xpcs.c ++++ b/drivers/net/pcs/pcs-xpcs.c +@@ -637,7 +637,7 @@ void xpcs_validate(struct dw_xpcs *xpcs, + if (state->interface == PHY_INTERFACE_MODE_NA) + return; + +- bitmap_zero(xpcs_supported, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(xpcs_supported); + + compat = xpcs_find_compat(xpcs->id, state->interface); + +--- a/drivers/net/phy/sfp-bus.c ++++ b/drivers/net/phy/sfp-bus.c +@@ -379,7 +379,7 @@ void sfp_parse_support(struct sfp_bus *b + if (bus->sfp_quirk) + bus->sfp_quirk->modes(id, modes); + +- bitmap_or(support, support, modes, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_or(support, support, modes); + + phylink_set(support, Autoneg); + phylink_set(support, Pause); +--- a/net/ethtool/ioctl.c ++++ b/net/ethtool/ioctl.c +@@ -335,7 +335,7 @@ EXPORT_SYMBOL(ethtool_intersect_link_mas + void ethtool_convert_legacy_u32_to_link_mode(unsigned long *dst, + u32 legacy_u32) + { +- bitmap_zero(dst, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(dst); + dst[0] = legacy_u32; + } + EXPORT_SYMBOL(ethtool_convert_legacy_u32_to_link_mode); +@@ -350,11 +350,10 @@ bool ethtool_convert_link_mode_to_legacy + if (__ETHTOOL_LINK_MODE_MASK_NBITS > 32) { + __ETHTOOL_DECLARE_LINK_MODE_MASK(ext); + +- bitmap_zero(ext, __ETHTOOL_LINK_MODE_MASK_NBITS); ++ linkmode_zero(ext); + bitmap_fill(ext, 32); + bitmap_complement(ext, ext, __ETHTOOL_LINK_MODE_MASK_NBITS); +- if (bitmap_intersects(ext, src, +- __ETHTOOL_LINK_MODE_MASK_NBITS)) { ++ if (linkmode_intersects(ext, src)) { + /* src mask goes beyond bit 31 */ + retval = false; + } diff --git a/target/linux/generic/backport-5.15/703-01-v5.16-net-phylink-add-MAC-phy_interface_t-bitmap.patch b/target/linux/generic/backport-5.15/703-01-v5.16-net-phylink-add-MAC-phy_interface_t-bitmap.patch new file mode 100644 index 0000000000..885c2fcf25 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-01-v5.16-net-phylink-add-MAC-phy_interface_t-bitmap.patch @@ -0,0 +1,24 @@ +From 38c310eb46f5f80213a92093af11af270c209a76 Mon Sep 17 00:00:00 2001 +From: Russell King +Date: Tue, 26 Oct 2021 11:06:06 +0100 +Subject: [PATCH] net: phylink: add MAC phy_interface_t bitmap + +Add a phy_interface_t bitmap so the MAC driver can specifiy which PHY +interface modes it supports. + +Signed-off-by: Russell King +Signed-off-by: David S. Miller +--- + include/linux/phylink.h | 1 + + 1 file changed, 1 insertion(+) + +--- a/include/linux/phylink.h ++++ b/include/linux/phylink.h +@@ -78,6 +78,7 @@ struct phylink_config { + bool ovr_an_inband; + void (*get_fixed_state)(struct phylink_config *config, + struct phylink_link_state *state); ++ DECLARE_PHY_INTERFACE_MASK(supported_interfaces); + }; + + /** diff --git a/target/linux/generic/backport-5.15/703-02-v5.16-net-phylink-use-supported_interfaces-for-phylink-val.patch b/target/linux/generic/backport-5.15/703-02-v5.16-net-phylink-use-supported_interfaces-for-phylink-val.patch new file mode 100644 index 0000000000..9800884f6e --- /dev/null +++ b/target/linux/generic/backport-5.15/703-02-v5.16-net-phylink-use-supported_interfaces-for-phylink-val.patch @@ -0,0 +1,98 @@ +From d25f3a74f30aace819163dfa54f2a4b8ca1dc932 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 26 Oct 2021 11:06:11 +0100 +Subject: [PATCH] net: phylink: use supported_interfaces for phylink + validation + +If the network device supplies a supported interface bitmap, we can use +that during phylink's validation to simplify MAC drivers in two ways by +using the supported_interfaces bitmap to: + +1. reject unsupported interfaces before calling into the MAC driver. +2. generate the set of all supported link modes across all supported + interfaces (used mainly for SFP, but also some 10G PHYs.) + +Suggested-by: Sean Anderson +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/phy/phylink.c | 36 ++++++++++++++++++++++++++++++++++++ + include/linux/phylink.h | 12 ++++++++++-- + 2 files changed, 46 insertions(+), 2 deletions(-) + +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -155,9 +155,45 @@ static const char *phylink_an_mode_str(u + return mode < ARRAY_SIZE(modestr) ? modestr[mode] : "unknown"; + } + ++static int phylink_validate_any(struct phylink *pl, unsigned long *supported, ++ struct phylink_link_state *state) ++{ ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(all_adv) = { 0, }; ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(all_s) = { 0, }; ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(s); ++ struct phylink_link_state t; ++ int intf; ++ ++ for (intf = 0; intf < PHY_INTERFACE_MODE_MAX; intf++) { ++ if (test_bit(intf, pl->config->supported_interfaces)) { ++ linkmode_copy(s, supported); ++ ++ t = *state; ++ t.interface = intf; ++ pl->mac_ops->validate(pl->config, s, &t); ++ linkmode_or(all_s, all_s, s); ++ linkmode_or(all_adv, all_adv, t.advertising); ++ } ++ } ++ ++ linkmode_copy(supported, all_s); ++ linkmode_copy(state->advertising, all_adv); ++ ++ return phylink_is_empty_linkmode(supported) ? -EINVAL : 0; ++} ++ + static int phylink_validate(struct phylink *pl, unsigned long *supported, + struct phylink_link_state *state) + { ++ if (!phy_interface_empty(pl->config->supported_interfaces)) { ++ if (state->interface == PHY_INTERFACE_MODE_NA) ++ return phylink_validate_any(pl, supported, state); ++ ++ if (!test_bit(state->interface, ++ pl->config->supported_interfaces)) ++ return -EINVAL; ++ } ++ + pl->mac_ops->validate(pl->config, supported, state); + + return phylink_is_empty_linkmode(supported) ? -EINVAL : 0; +--- a/include/linux/phylink.h ++++ b/include/linux/phylink.h +@@ -68,6 +68,8 @@ enum phylink_op_type { + * @ovr_an_inband: if true, override PCS to MLO_AN_INBAND + * @get_fixed_state: callback to execute to determine the fixed link state, + * if MAC link is at %MLO_AN_FIXED mode. ++ * @supported_interfaces: bitmap describing which PHY_INTERFACE_MODE_xxx ++ * are supported by the MAC/PCS. + */ + struct phylink_config { + struct device *dev; +@@ -136,8 +138,14 @@ struct phylink_mac_ops { + * based on @state->advertising and/or @state->speed and update + * @state->interface accordingly. See phylink_helper_basex_speed(). + * +- * When @state->interface is %PHY_INTERFACE_MODE_NA, phylink expects the +- * MAC driver to return all supported link modes. ++ * When @config->supported_interfaces has been set, phylink will iterate ++ * over the supported interfaces to determine the full capability of the ++ * MAC. The validation function must not print errors if @state->interface ++ * is set to an unexpected value. ++ * ++ * When @config->supported_interfaces is empty, phylink will call this ++ * function with @state->interface set to %PHY_INTERFACE_MODE_NA, and ++ * expects the MAC driver to return all supported link modes. + * + * If the @state->interface mode is not supported, then the @supported + * mask must be cleared. diff --git a/target/linux/generic/backport-5.15/703-03-v5.16-net-dsa-populate-supported_interfaces-member.patch b/target/linux/generic/backport-5.15/703-03-v5.16-net-dsa-populate-supported_interfaces-member.patch new file mode 100644 index 0000000000..b438786536 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-03-v5.16-net-dsa-populate-supported_interfaces-member.patch @@ -0,0 +1,63 @@ +From c07c6e8eb4b38bae921f9e2f108d1e7f8e14226e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marek=20Beh=C3=BAn?= +Date: Thu, 28 Oct 2021 18:00:14 +0100 +Subject: [PATCH] net: dsa: populate supported_interfaces member +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add a new DSA switch operation, phylink_get_interfaces, which should +fill in which PHY_INTERFACE_MODE_* are supported by given port. + +Use this before phylink_create() to fill phylinks supported_interfaces +member, allowing phylink to determine which PHY_INTERFACE_MODEs are +supported. + +Signed-off-by: Marek Behún +[tweaked patch and description to add more complete support -- rmk] +Signed-off-by: Russell King +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + include/net/dsa.h | 2 ++ + net/dsa/port.c | 4 ++++ + net/dsa/slave.c | 4 ++++ + 3 files changed, 10 insertions(+) + +--- a/include/net/dsa.h ++++ b/include/net/dsa.h +@@ -654,6 +654,8 @@ struct dsa_switch_ops { + /* + * PHYLINK integration + */ ++ void (*phylink_get_interfaces)(struct dsa_switch *ds, int port, ++ unsigned long *supported_interfaces); + void (*phylink_validate)(struct dsa_switch *ds, int port, + unsigned long *supported, + struct phylink_link_state *state); +--- a/net/dsa/port.c ++++ b/net/dsa/port.c +@@ -1188,6 +1188,10 @@ static int dsa_port_phylink_register(str + dp->pl_config.type = PHYLINK_DEV; + dp->pl_config.pcs_poll = ds->pcs_poll; + ++ if (ds->ops->phylink_get_interfaces) ++ ds->ops->phylink_get_interfaces(ds, dp->index, ++ dp->pl_config.supported_interfaces); ++ + dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(port_dn), + mode, &dsa_port_phylink_mac_ops); + if (IS_ERR(dp->pl)) { +--- a/net/dsa/slave.c ++++ b/net/dsa/slave.c +@@ -1837,6 +1837,10 @@ static int dsa_slave_phy_setup(struct ne + dp->pl_config.poll_fixed_state = true; + } + ++ if (ds->ops->phylink_get_interfaces) ++ ds->ops->phylink_get_interfaces(ds, dp->index, ++ dp->pl_config.supported_interfaces); ++ + dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(port_dn), mode, + &dsa_port_phylink_mac_ops); + if (IS_ERR(dp->pl)) { diff --git a/target/linux/generic/backport-5.15/703-04-v5.17-net-dsa-consolidate-phylink-creation.patch b/target/linux/generic/backport-5.15/703-04-v5.17-net-dsa-consolidate-phylink-creation.patch new file mode 100644 index 0000000000..9b67a8a518 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-04-v5.17-net-dsa-consolidate-phylink-creation.patch @@ -0,0 +1,149 @@ +From 21bd64bd717dedac96f53b668144cbe37d3c12d4 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 30 Nov 2021 13:09:55 +0000 +Subject: [PATCH] net: dsa: consolidate phylink creation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The code in port.c and slave.c creating the phylink instance is very +similar - let's consolidate this into a single function. + +Signed-off-by: Russell King (Oracle) +Reviewed-by: Marek Behún +Reviewed-by: Andrew Lunn +Signed-off-by: Jakub Kicinski +--- + net/dsa/dsa_priv.h | 2 +- + net/dsa/port.c | 44 ++++++++++++++++++++++++++++---------------- + net/dsa/slave.c | 19 +++---------------- + 3 files changed, 32 insertions(+), 33 deletions(-) + +--- a/net/dsa/dsa_priv.h ++++ b/net/dsa/dsa_priv.h +@@ -261,13 +261,13 @@ int dsa_port_mrp_add_ring_role(const str + const struct switchdev_obj_ring_role_mrp *mrp); + int dsa_port_mrp_del_ring_role(const struct dsa_port *dp, + const struct switchdev_obj_ring_role_mrp *mrp); ++int dsa_port_phylink_create(struct dsa_port *dp); + int dsa_port_link_register_of(struct dsa_port *dp); + void dsa_port_link_unregister_of(struct dsa_port *dp); + int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr); + void dsa_port_hsr_leave(struct dsa_port *dp, struct net_device *hsr); + int dsa_port_tag_8021q_vlan_add(struct dsa_port *dp, u16 vid, bool broadcast); + void dsa_port_tag_8021q_vlan_del(struct dsa_port *dp, u16 vid, bool broadcast); +-extern const struct phylink_mac_ops dsa_port_phylink_mac_ops; + + static inline bool dsa_port_offloads_bridge_port(struct dsa_port *dp, + const struct net_device *dev) +--- a/net/dsa/port.c ++++ b/net/dsa/port.c +@@ -1092,7 +1092,7 @@ static void dsa_port_phylink_mac_link_up + speed, duplex, tx_pause, rx_pause); + } + +-const struct phylink_mac_ops dsa_port_phylink_mac_ops = { ++static const struct phylink_mac_ops dsa_port_phylink_mac_ops = { + .validate = dsa_port_phylink_validate, + .mac_pcs_get_state = dsa_port_phylink_mac_pcs_get_state, + .mac_config = dsa_port_phylink_mac_config, +@@ -1101,6 +1101,30 @@ const struct phylink_mac_ops dsa_port_ph + .mac_link_up = dsa_port_phylink_mac_link_up, + }; + ++int dsa_port_phylink_create(struct dsa_port *dp) ++{ ++ struct dsa_switch *ds = dp->ds; ++ phy_interface_t mode; ++ int err; ++ ++ err = of_get_phy_mode(dp->dn, &mode); ++ if (err) ++ mode = PHY_INTERFACE_MODE_NA; ++ ++ if (ds->ops->phylink_get_interfaces) ++ ds->ops->phylink_get_interfaces(ds, dp->index, ++ dp->pl_config.supported_interfaces); ++ ++ dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(dp->dn), ++ mode, &dsa_port_phylink_mac_ops); ++ if (IS_ERR(dp->pl)) { ++ pr_err("error creating PHYLINK: %ld\n", PTR_ERR(dp->pl)); ++ return PTR_ERR(dp->pl); ++ } ++ ++ return 0; ++} ++ + static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable) + { + struct dsa_switch *ds = dp->ds; +@@ -1177,27 +1201,15 @@ static int dsa_port_phylink_register(str + { + struct dsa_switch *ds = dp->ds; + struct device_node *port_dn = dp->dn; +- phy_interface_t mode; + int err; + +- err = of_get_phy_mode(port_dn, &mode); +- if (err) +- mode = PHY_INTERFACE_MODE_NA; +- + dp->pl_config.dev = ds->dev; + dp->pl_config.type = PHYLINK_DEV; + dp->pl_config.pcs_poll = ds->pcs_poll; + +- if (ds->ops->phylink_get_interfaces) +- ds->ops->phylink_get_interfaces(ds, dp->index, +- dp->pl_config.supported_interfaces); +- +- dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(port_dn), +- mode, &dsa_port_phylink_mac_ops); +- if (IS_ERR(dp->pl)) { +- pr_err("error creating PHYLINK: %ld\n", PTR_ERR(dp->pl)); +- return PTR_ERR(dp->pl); +- } ++ err = dsa_port_phylink_create(dp); ++ if (err) ++ return err; + + err = phylink_of_phy_connect(dp->pl, port_dn, 0); + if (err && err != -ENODEV) { +--- a/net/dsa/slave.c ++++ b/net/dsa/slave.c +@@ -1817,14 +1817,9 @@ static int dsa_slave_phy_setup(struct ne + struct dsa_port *dp = dsa_slave_to_port(slave_dev); + struct device_node *port_dn = dp->dn; + struct dsa_switch *ds = dp->ds; +- phy_interface_t mode; + u32 phy_flags = 0; + int ret; + +- ret = of_get_phy_mode(port_dn, &mode); +- if (ret) +- mode = PHY_INTERFACE_MODE_NA; +- + dp->pl_config.dev = &slave_dev->dev; + dp->pl_config.type = PHYLINK_NETDEV; + +@@ -1837,17 +1832,9 @@ static int dsa_slave_phy_setup(struct ne + dp->pl_config.poll_fixed_state = true; + } + +- if (ds->ops->phylink_get_interfaces) +- ds->ops->phylink_get_interfaces(ds, dp->index, +- dp->pl_config.supported_interfaces); +- +- dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(port_dn), mode, +- &dsa_port_phylink_mac_ops); +- if (IS_ERR(dp->pl)) { +- netdev_err(slave_dev, +- "error creating PHYLINK: %ld\n", PTR_ERR(dp->pl)); +- return PTR_ERR(dp->pl); +- } ++ ret = dsa_port_phylink_create(dp); ++ if (ret) ++ return ret; + + if (ds->ops->get_phy_flags) + phy_flags = ds->ops->get_phy_flags(ds, dp->index); diff --git a/target/linux/generic/backport-5.15/703-05-v5.17-net-dsa-replace-phylink_get_interfaces-with-phylink_.patch b/target/linux/generic/backport-5.15/703-05-v5.17-net-dsa-replace-phylink_get_interfaces-with-phylink_.patch new file mode 100644 index 0000000000..1d9616c0db --- /dev/null +++ b/target/linux/generic/backport-5.15/703-05-v5.17-net-dsa-replace-phylink_get_interfaces-with-phylink_.patch @@ -0,0 +1,51 @@ +From 072eea6c22b2af680c3949e64f9adde278c71e68 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 30 Nov 2021 13:10:01 +0000 +Subject: [PATCH] net: dsa: replace phylink_get_interfaces() with + phylink_get_caps() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Phylink needs slightly more information than phylink_get_interfaces() +allows us to get from the DSA drivers - we need the MAC capabilities. +Replace the phylink_get_interfaces() method with phylink_get_caps() to +allow DSA drivers to fill in the phylink_config MAC capabilities field +as well. + +Signed-off-by: Russell King (Oracle) +Reviewed-by: Marek Behún +Reviewed-by: Andrew Lunn +Signed-off-by: Jakub Kicinski +--- + include/net/dsa.h | 4 ++-- + net/dsa/port.c | 5 ++--- + 2 files changed, 4 insertions(+), 5 deletions(-) + +--- a/include/net/dsa.h ++++ b/include/net/dsa.h +@@ -654,8 +654,8 @@ struct dsa_switch_ops { + /* + * PHYLINK integration + */ +- void (*phylink_get_interfaces)(struct dsa_switch *ds, int port, +- unsigned long *supported_interfaces); ++ void (*phylink_get_caps)(struct dsa_switch *ds, int port, ++ struct phylink_config *config); + void (*phylink_validate)(struct dsa_switch *ds, int port, + unsigned long *supported, + struct phylink_link_state *state); +--- a/net/dsa/port.c ++++ b/net/dsa/port.c +@@ -1111,9 +1111,8 @@ int dsa_port_phylink_create(struct dsa_p + if (err) + mode = PHY_INTERFACE_MODE_NA; + +- if (ds->ops->phylink_get_interfaces) +- ds->ops->phylink_get_interfaces(ds, dp->index, +- dp->pl_config.supported_interfaces); ++ if (ds->ops->phylink_get_caps) ++ ds->ops->phylink_get_caps(ds, dp->index, &dp->pl_config); + + dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(dp->dn), + mode, &dsa_port_phylink_mac_ops); diff --git a/target/linux/generic/backport-5.15/703-06-v5.18-net-dsa-add-support-for-phylink-mac_select_pcs.patch b/target/linux/generic/backport-5.15/703-06-v5.18-net-dsa-add-support-for-phylink-mac_select_pcs.patch new file mode 100644 index 0000000000..9791ad2ac9 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-06-v5.18-net-dsa-add-support-for-phylink-mac_select_pcs.patch @@ -0,0 +1,59 @@ +From bde018222c6b084ac32933a9f933581dd83da18e Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 17 Feb 2022 18:30:35 +0000 +Subject: [PATCH] net: dsa: add support for phylink mac_select_pcs() + +Add DSA support for the phylink mac_select_pcs() method so DSA drivers +can return provide phylink with the appropriate PCS for the PHY +interface mode. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + include/net/dsa.h | 3 +++ + net/dsa/port.c | 15 +++++++++++++++ + 2 files changed, 18 insertions(+) + +--- a/include/net/dsa.h ++++ b/include/net/dsa.h +@@ -659,6 +659,9 @@ struct dsa_switch_ops { + void (*phylink_validate)(struct dsa_switch *ds, int port, + unsigned long *supported, + struct phylink_link_state *state); ++ struct phylink_pcs *(*phylink_mac_select_pcs)(struct dsa_switch *ds, ++ int port, ++ phy_interface_t iface); + int (*phylink_mac_link_state)(struct dsa_switch *ds, int port, + struct phylink_link_state *state); + void (*phylink_mac_config)(struct dsa_switch *ds, int port, +--- a/net/dsa/port.c ++++ b/net/dsa/port.c +@@ -1028,6 +1028,20 @@ static void dsa_port_phylink_mac_pcs_get + } + } + ++static struct phylink_pcs * ++dsa_port_phylink_mac_select_pcs(struct phylink_config *config, ++ phy_interface_t interface) ++{ ++ struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); ++ struct dsa_switch *ds = dp->ds; ++ struct phylink_pcs *pcs = NULL; ++ ++ if (ds->ops->phylink_mac_select_pcs) ++ pcs = ds->ops->phylink_mac_select_pcs(ds, dp->index, interface); ++ ++ return pcs; ++} ++ + static void dsa_port_phylink_mac_config(struct phylink_config *config, + unsigned int mode, + const struct phylink_link_state *state) +@@ -1094,6 +1108,7 @@ static void dsa_port_phylink_mac_link_up + + static const struct phylink_mac_ops dsa_port_phylink_mac_ops = { + .validate = dsa_port_phylink_validate, ++ .mac_select_pcs = dsa_port_phylink_mac_select_pcs, + .mac_pcs_get_state = dsa_port_phylink_mac_pcs_get_state, + .mac_config = dsa_port_phylink_mac_config, + .mac_an_restart = dsa_port_phylink_mac_an_restart, diff --git a/target/linux/generic/backport-5.15/703-07-v5.16-net-phy-add-phy_interface_t-bitmap-support.patch b/target/linux/generic/backport-5.15/703-07-v5.16-net-phy-add-phy_interface_t-bitmap-support.patch new file mode 100644 index 0000000000..1a7817b0f9 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-07-v5.16-net-phy-add-phy_interface_t-bitmap-support.patch @@ -0,0 +1,61 @@ +From 8e20f591f204f8db7f1182918f8e2285d3f589e0 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 26 Oct 2021 11:06:01 +0100 +Subject: [PATCH] net: phy: add phy_interface_t bitmap support + +Add support for a bitmap for phy interface modes, which includes: +- a macro to declare the interface bitmap +- an inline helper to zero the interface bitmap +- an inline helper to detect an empty interface bitmap +- inline helpers to do a bitwise AND and OR operations on two interface + bitmaps + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + include/linux/phy.h | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +--- a/include/linux/phy.h ++++ b/include/linux/phy.h +@@ -155,6 +155,40 @@ typedef enum { + PHY_INTERFACE_MODE_MAX, + } phy_interface_t; + ++/* PHY interface mode bitmap handling */ ++#define DECLARE_PHY_INTERFACE_MASK(name) \ ++ DECLARE_BITMAP(name, PHY_INTERFACE_MODE_MAX) ++ ++static inline void phy_interface_zero(unsigned long *intf) ++{ ++ bitmap_zero(intf, PHY_INTERFACE_MODE_MAX); ++} ++ ++static inline bool phy_interface_empty(const unsigned long *intf) ++{ ++ return bitmap_empty(intf, PHY_INTERFACE_MODE_MAX); ++} ++ ++static inline void phy_interface_and(unsigned long *dst, const unsigned long *a, ++ const unsigned long *b) ++{ ++ bitmap_and(dst, a, b, PHY_INTERFACE_MODE_MAX); ++} ++ ++static inline void phy_interface_or(unsigned long *dst, const unsigned long *a, ++ const unsigned long *b) ++{ ++ bitmap_or(dst, a, b, PHY_INTERFACE_MODE_MAX); ++} ++ ++static inline void phy_interface_set_rgmii(unsigned long *intf) ++{ ++ __set_bit(PHY_INTERFACE_MODE_RGMII, intf); ++ __set_bit(PHY_INTERFACE_MODE_RGMII_ID, intf); ++ __set_bit(PHY_INTERFACE_MODE_RGMII_RXID, intf); ++ __set_bit(PHY_INTERFACE_MODE_RGMII_TXID, intf); ++} ++ + /* + * phy_supported_speeds - return all speeds currently supported by a PHY device + */ diff --git a/target/linux/generic/backport-5.15/703-08-v5.17-net-phylink-add-mac_select_pcs-method-to-phylink_mac.patch b/target/linux/generic/backport-5.15/703-08-v5.17-net-phylink-add-mac_select_pcs-method-to-phylink_mac.patch new file mode 100644 index 0000000000..5d5ac4b009 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-08-v5.17-net-phylink-add-mac_select_pcs-method-to-phylink_mac.patch @@ -0,0 +1,197 @@ +From d1e86325af377129adb7fc6f34eb044ca6068b47 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 15 Dec 2021 15:34:15 +0000 +Subject: [PATCH] net: phylink: add mac_select_pcs() method to phylink_mac_ops + +mac_select_pcs() allows us to have an explicit point to query which +PCS the MAC wishes to use for a particular PHY interface mode, thereby +allowing us to add support to validate the link settings with the PCS. + +Phylink will also use this to select the PCS to be used during a major +configuration event without the MAC driver needing to call +phylink_set_pcs(). + +Note that if mac_select_pcs() is present, the supported_interfaces +bitmap must be filled in; this avoids mac_select_pcs() being called +with PHY_INTERFACE_MODE_NA when we want to get support for all +interface types. Phylink will return an error in phylink_create() +unless this condition is satisfied. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/phy/phylink.c | 68 +++++++++++++++++++++++++++++++++------ + include/linux/phylink.h | 18 +++++++++++ + 2 files changed, 77 insertions(+), 9 deletions(-) + +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -155,6 +155,23 @@ static const char *phylink_an_mode_str(u + return mode < ARRAY_SIZE(modestr) ? modestr[mode] : "unknown"; + } + ++static int phylink_validate_mac_and_pcs(struct phylink *pl, ++ unsigned long *supported, ++ struct phylink_link_state *state) ++{ ++ struct phylink_pcs *pcs; ++ ++ if (pl->mac_ops->mac_select_pcs) { ++ pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface); ++ if (IS_ERR(pcs)) ++ return PTR_ERR(pcs); ++ } ++ ++ pl->mac_ops->validate(pl->config, supported, state); ++ ++ return phylink_is_empty_linkmode(supported) ? -EINVAL : 0; ++} ++ + static int phylink_validate_any(struct phylink *pl, unsigned long *supported, + struct phylink_link_state *state) + { +@@ -170,9 +187,10 @@ static int phylink_validate_any(struct p + + t = *state; + t.interface = intf; +- pl->mac_ops->validate(pl->config, s, &t); +- linkmode_or(all_s, all_s, s); +- linkmode_or(all_adv, all_adv, t.advertising); ++ if (!phylink_validate_mac_and_pcs(pl, s, &t)) { ++ linkmode_or(all_s, all_s, s); ++ linkmode_or(all_adv, all_adv, t.advertising); ++ } + } + } + +@@ -194,9 +212,7 @@ static int phylink_validate(struct phyli + return -EINVAL; + } + +- pl->mac_ops->validate(pl->config, supported, state); +- +- return phylink_is_empty_linkmode(supported) ? -EINVAL : 0; ++ return phylink_validate_mac_and_pcs(pl, supported, state); + } + + static int phylink_parse_fixedlink(struct phylink *pl, +@@ -486,10 +502,21 @@ static void phylink_mac_pcs_an_restart(s + static void phylink_major_config(struct phylink *pl, bool restart, + const struct phylink_link_state *state) + { ++ struct phylink_pcs *pcs = NULL; + int err; + + phylink_dbg(pl, "major config %s\n", phy_modes(state->interface)); + ++ if (pl->mac_ops->mac_select_pcs) { ++ pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface); ++ if (IS_ERR(pcs)) { ++ phylink_err(pl, ++ "mac_select_pcs unexpectedly failed: %pe\n", ++ pcs); ++ return; ++ } ++ } ++ + if (pl->mac_ops->mac_prepare) { + err = pl->mac_ops->mac_prepare(pl->config, pl->cur_link_an_mode, + state->interface); +@@ -500,6 +527,12 @@ static void phylink_major_config(struct + } + } + ++ /* If we have a new PCS, switch to the new PCS after preparing the MAC ++ * for the change. ++ */ ++ if (pcs) ++ phylink_set_pcs(pl, pcs); ++ + phylink_mac_config(pl, state); + + if (pl->pcs_ops) { +@@ -879,6 +912,14 @@ struct phylink *phylink_create(struct ph + struct phylink *pl; + int ret; + ++ /* Validate the supplied configuration */ ++ if (mac_ops->mac_select_pcs && ++ phy_interface_empty(config->supported_interfaces)) { ++ dev_err(config->dev, ++ "phylink: error: empty supported_interfaces but mac_select_pcs() method present\n"); ++ return ERR_PTR(-EINVAL); ++ } ++ + pl = kzalloc(sizeof(*pl), GFP_KERNEL); + if (!pl) + return ERR_PTR(-ENOMEM); +@@ -947,9 +988,10 @@ EXPORT_SYMBOL_GPL(phylink_create); + * @pl: a pointer to a &struct phylink returned from phylink_create() + * @pcs: a pointer to the &struct phylink_pcs + * +- * Bind the MAC PCS to phylink. This may be called after phylink_create(), +- * in mac_prepare() or mac_config() methods if it is desired to dynamically +- * change the PCS. ++ * Bind the MAC PCS to phylink. This may be called after phylink_create(). ++ * If it is desired to dynamically change the PCS, then the preferred method ++ * is to use mac_select_pcs(), but it may also be called in mac_prepare() ++ * or mac_config(). + * + * Please note that there are behavioural changes with the mac_config() + * callback if a PCS is present (denoting a newer setup) so removing a PCS +@@ -960,6 +1002,14 @@ void phylink_set_pcs(struct phylink *pl, + { + pl->pcs = pcs; + pl->pcs_ops = pcs->ops; ++ ++ if (!pl->phylink_disable_state && ++ pl->cfg_link_an_mode == MLO_AN_INBAND) { ++ if (pl->config->pcs_poll || pcs->poll) ++ mod_timer(&pl->link_poll, jiffies + HZ); ++ else ++ del_timer(&pl->link_poll); ++ } + } + EXPORT_SYMBOL_GPL(phylink_set_pcs); + +--- a/include/linux/phylink.h ++++ b/include/linux/phylink.h +@@ -86,6 +86,7 @@ struct phylink_config { + /** + * struct phylink_mac_ops - MAC operations structure. + * @validate: Validate and update the link configuration. ++ * @mac_select_pcs: Select a PCS for the interface mode. + * @mac_pcs_get_state: Read the current link state from the hardware. + * @mac_prepare: prepare for a major reconfiguration of the interface. + * @mac_config: configure the MAC for the selected mode and state. +@@ -100,6 +101,8 @@ struct phylink_mac_ops { + void (*validate)(struct phylink_config *config, + unsigned long *supported, + struct phylink_link_state *state); ++ struct phylink_pcs *(*mac_select_pcs)(struct phylink_config *config, ++ phy_interface_t interface); + void (*mac_pcs_get_state)(struct phylink_config *config, + struct phylink_link_state *state); + int (*mac_prepare)(struct phylink_config *config, unsigned int mode, +@@ -152,6 +155,21 @@ struct phylink_mac_ops { + */ + void validate(struct phylink_config *config, unsigned long *supported, + struct phylink_link_state *state); ++/** ++ * mac_select_pcs: Select a PCS for the interface mode. ++ * @config: a pointer to a &struct phylink_config. ++ * @interface: PHY interface mode for PCS ++ * ++ * Return the &struct phylink_pcs for the specified interface mode, or ++ * NULL if none is required, or an error pointer on error. ++ * ++ * This must not modify any state. It is used to query which PCS should ++ * be used. Phylink will use this during validation to ensure that the ++ * configuration is valid, and when setting a configuration to internally ++ * set the PCS that will be used. ++ */ ++struct phylink_pcs *mac_select_pcs(struct phylink_config *config, ++ phy_interface_t interface); + + /** + * mac_pcs_get_state() - Read the current inband link state from the hardware diff --git a/target/linux/generic/backport-5.15/703-09-v5.17-net-phylink-add-generic-validate-implementation.patch b/target/linux/generic/backport-5.15/703-09-v5.17-net-phylink-add-generic-validate-implementation.patch new file mode 100644 index 0000000000..f30a566c81 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-09-v5.17-net-phylink-add-generic-validate-implementation.patch @@ -0,0 +1,341 @@ +From 34ae2c09d46a2d0abd907e139b466f798e4095a8 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 15 Nov 2021 10:00:27 +0000 +Subject: [PATCH] net: phylink: add generic validate implementation + +Add a generic validate() implementation using the supported_interfaces +and a bitmask of MAC pause/speed/duplex capabilities. This allows us +to entirely eliminate many driver private validate() implementations. + +We expose the underlying phylink_get_linkmodes() function so that +drivers which have special needs can still benefit from conversion. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/phy/phylink.c | 252 ++++++++++++++++++++++++++++++++++++++ + include/linux/phylink.h | 31 +++++ + 2 files changed, 283 insertions(+) + +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -172,6 +172,258 @@ static int phylink_validate_mac_and_pcs( + return phylink_is_empty_linkmode(supported) ? -EINVAL : 0; + } + ++static void phylink_caps_to_linkmodes(unsigned long *linkmodes, ++ unsigned long caps) ++{ ++ if (caps & MAC_SYM_PAUSE) ++ __set_bit(ETHTOOL_LINK_MODE_Pause_BIT, linkmodes); ++ ++ if (caps & MAC_ASYM_PAUSE) ++ __set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, linkmodes); ++ ++ if (caps & MAC_10HD) ++ __set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, linkmodes); ++ ++ if (caps & MAC_10FD) ++ __set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, linkmodes); ++ ++ if (caps & MAC_100HD) { ++ __set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100baseFX_Half_BIT, linkmodes); ++ } ++ ++ if (caps & MAC_100FD) { ++ __set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100baseT1_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100baseFX_Full_BIT, linkmodes); ++ } ++ ++ if (caps & MAC_1000HD) ++ __set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, linkmodes); ++ ++ if (caps & MAC_1000FD) { ++ __set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_1000baseT1_Full_BIT, linkmodes); ++ } ++ ++ if (caps & MAC_2500FD) { ++ __set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_2500baseX_Full_BIT, linkmodes); ++ } ++ ++ if (caps & MAC_5000FD) ++ __set_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, linkmodes); ++ ++ if (caps & MAC_10000FD) { ++ __set_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_10000baseR_FEC_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_10000baseCR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_10000baseSR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_10000baseLR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_10000baseER_Full_BIT, linkmodes); ++ } ++ ++ if (caps & MAC_25000FD) { ++ __set_bit(ETHTOOL_LINK_MODE_25000baseCR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_25000baseKR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_25000baseSR_Full_BIT, linkmodes); ++ } ++ ++ if (caps & MAC_40000FD) { ++ __set_bit(ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT, linkmodes); ++ } ++ ++ if (caps & MAC_50000FD) { ++ __set_bit(ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_50000baseKR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_50000baseSR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_50000baseCR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT, ++ linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_50000baseDR_Full_BIT, linkmodes); ++ } ++ ++ if (caps & MAC_56000FD) { ++ __set_bit(ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT, linkmodes); ++ } ++ ++ if (caps & MAC_100000FD) { ++ __set_bit(ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT, ++ linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT, ++ linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseKR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseSR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT, ++ linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseCR_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_100000baseDR_Full_BIT, linkmodes); ++ } ++ ++ if (caps & MAC_200000FD) { ++ __set_bit(ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT, ++ linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT, ++ linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT, linkmodes); ++ } ++ ++ if (caps & MAC_400000FD) { ++ __set_bit(ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT, ++ linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_400000baseDR8_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT, ++ linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT, linkmodes); ++ __set_bit(ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT, linkmodes); ++ } ++} ++ ++/** ++ * phylink_get_linkmodes() - get acceptable link modes ++ * @linkmodes: ethtool linkmode mask (must be already initialised) ++ * @interface: phy interface mode defined by &typedef phy_interface_t ++ * @mac_capabilities: bitmask of MAC capabilities ++ * ++ * Set all possible pause, speed and duplex linkmodes in @linkmodes that ++ * are supported by the @interface mode and @mac_capabilities. @linkmodes ++ * must have been initialised previously. ++ */ ++void phylink_get_linkmodes(unsigned long *linkmodes, phy_interface_t interface, ++ unsigned long mac_capabilities) ++{ ++ unsigned long caps = MAC_SYM_PAUSE | MAC_ASYM_PAUSE; ++ ++ switch (interface) { ++ case PHY_INTERFACE_MODE_USXGMII: ++ caps |= MAC_10000FD | MAC_5000FD | MAC_2500FD; ++ fallthrough; ++ ++ case PHY_INTERFACE_MODE_RGMII_TXID: ++ case PHY_INTERFACE_MODE_RGMII_RXID: ++ case PHY_INTERFACE_MODE_RGMII_ID: ++ case PHY_INTERFACE_MODE_RGMII: ++ case PHY_INTERFACE_MODE_QSGMII: ++ case PHY_INTERFACE_MODE_SGMII: ++ case PHY_INTERFACE_MODE_GMII: ++ caps |= MAC_1000HD | MAC_1000FD; ++ fallthrough; ++ ++ case PHY_INTERFACE_MODE_REVRMII: ++ case PHY_INTERFACE_MODE_RMII: ++ case PHY_INTERFACE_MODE_REVMII: ++ case PHY_INTERFACE_MODE_MII: ++ caps |= MAC_10HD | MAC_10FD; ++ fallthrough; ++ ++ case PHY_INTERFACE_MODE_100BASEX: ++ caps |= MAC_100HD | MAC_100FD; ++ break; ++ ++ case PHY_INTERFACE_MODE_TBI: ++ case PHY_INTERFACE_MODE_MOCA: ++ case PHY_INTERFACE_MODE_RTBI: ++ case PHY_INTERFACE_MODE_1000BASEX: ++ caps |= MAC_1000HD; ++ fallthrough; ++ case PHY_INTERFACE_MODE_TRGMII: ++ caps |= MAC_1000FD; ++ break; ++ ++ case PHY_INTERFACE_MODE_2500BASEX: ++ caps |= MAC_2500FD; ++ break; ++ ++ case PHY_INTERFACE_MODE_5GBASER: ++ caps |= MAC_5000FD; ++ break; ++ ++ case PHY_INTERFACE_MODE_XGMII: ++ case PHY_INTERFACE_MODE_RXAUI: ++ case PHY_INTERFACE_MODE_XAUI: ++ case PHY_INTERFACE_MODE_10GBASER: ++ case PHY_INTERFACE_MODE_10GKR: ++ caps |= MAC_10000FD; ++ break; ++ ++ case PHY_INTERFACE_MODE_25GBASER: ++ caps |= MAC_25000FD; ++ break; ++ ++ case PHY_INTERFACE_MODE_XLGMII: ++ caps |= MAC_40000FD; ++ break; ++ ++ case PHY_INTERFACE_MODE_INTERNAL: ++ caps |= ~0; ++ break; ++ ++ case PHY_INTERFACE_MODE_NA: ++ case PHY_INTERFACE_MODE_MAX: ++ case PHY_INTERFACE_MODE_SMII: ++ break; ++ } ++ ++ phylink_caps_to_linkmodes(linkmodes, caps & mac_capabilities); ++} ++EXPORT_SYMBOL_GPL(phylink_get_linkmodes); ++ ++/** ++ * phylink_generic_validate() - generic validate() callback implementation ++ * @config: a pointer to a &struct phylink_config. ++ * @supported: ethtool bitmask for supported link modes. ++ * @state: a pointer to a &struct phylink_link_state. ++ * ++ * Generic implementation of the validate() callback that MAC drivers can ++ * use when they pass the range of supported interfaces and MAC capabilities. ++ * This makes use of phylink_get_linkmodes(). ++ */ ++void phylink_generic_validate(struct phylink_config *config, ++ unsigned long *supported, ++ struct phylink_link_state *state) ++{ ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; ++ ++ phylink_set_port_modes(mask); ++ phylink_set(mask, Autoneg); ++ phylink_get_linkmodes(mask, state->interface, config->mac_capabilities); ++ ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); ++} ++EXPORT_SYMBOL_GPL(phylink_generic_validate); ++ + static int phylink_validate_any(struct phylink *pl, unsigned long *supported, + struct phylink_link_state *state) + { +--- a/include/linux/phylink.h ++++ b/include/linux/phylink.h +@@ -20,6 +20,29 @@ enum { + MLO_AN_PHY = 0, /* Conventional PHY */ + MLO_AN_FIXED, /* Fixed-link mode */ + MLO_AN_INBAND, /* In-band protocol */ ++ ++ MAC_SYM_PAUSE = BIT(0), ++ MAC_ASYM_PAUSE = BIT(1), ++ MAC_10HD = BIT(2), ++ MAC_10FD = BIT(3), ++ MAC_10 = MAC_10HD | MAC_10FD, ++ MAC_100HD = BIT(4), ++ MAC_100FD = BIT(5), ++ MAC_100 = MAC_100HD | MAC_100FD, ++ MAC_1000HD = BIT(6), ++ MAC_1000FD = BIT(7), ++ MAC_1000 = MAC_1000HD | MAC_1000FD, ++ MAC_2500FD = BIT(8), ++ MAC_5000FD = BIT(9), ++ MAC_10000FD = BIT(10), ++ MAC_20000FD = BIT(11), ++ MAC_25000FD = BIT(12), ++ MAC_40000FD = BIT(13), ++ MAC_50000FD = BIT(14), ++ MAC_56000FD = BIT(15), ++ MAC_100000FD = BIT(16), ++ MAC_200000FD = BIT(17), ++ MAC_400000FD = BIT(18), + }; + + static inline bool phylink_autoneg_inband(unsigned int mode) +@@ -70,6 +93,7 @@ enum phylink_op_type { + * if MAC link is at %MLO_AN_FIXED mode. + * @supported_interfaces: bitmap describing which PHY_INTERFACE_MODE_xxx + * are supported by the MAC/PCS. ++ * @mac_capabilities: MAC pause/speed/duplex capabilities. + */ + struct phylink_config { + struct device *dev; +@@ -81,6 +105,7 @@ struct phylink_config { + void (*get_fixed_state)(struct phylink_config *config, + struct phylink_link_state *state); + DECLARE_PHY_INTERFACE_MASK(supported_interfaces); ++ unsigned long mac_capabilities; + }; + + /** +@@ -462,6 +487,12 @@ void pcs_link_up(struct phylink_pcs *pcs + phy_interface_t interface, int speed, int duplex); + #endif + ++void phylink_get_linkmodes(unsigned long *linkmodes, phy_interface_t interface, ++ unsigned long mac_capabilities); ++void phylink_generic_validate(struct phylink_config *config, ++ unsigned long *supported, ++ struct phylink_link_state *state); ++ + struct phylink *phylink_create(struct phylink_config *, struct fwnode_handle *, + phy_interface_t iface, + const struct phylink_mac_ops *mac_ops); diff --git a/target/linux/generic/backport-5.15/703-11-v5.17-net-phylink-add-pcs_validate-method.patch b/target/linux/generic/backport-5.15/703-11-v5.17-net-phylink-add-pcs_validate-method.patch new file mode 100644 index 0000000000..524ce9bd92 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-11-v5.17-net-phylink-add-pcs_validate-method.patch @@ -0,0 +1,106 @@ +From 0d22d4b626a4eaa3196019092eb6c1919e9f8caa Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 15 Dec 2021 15:34:20 +0000 +Subject: [PATCH] net: phylink: add pcs_validate() method + +Add a hook for PCS to validate the link parameters. This avoids MAC +drivers having to have knowledge of their PCS in their validate() +method, thereby allowing several MAC drivers to be simplfied. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/phy/phylink.c | 31 +++++++++++++++++++++++++++++++ + include/linux/phylink.h | 20 ++++++++++++++++++++ + 2 files changed, 51 insertions(+) + +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -160,13 +160,44 @@ static int phylink_validate_mac_and_pcs( + struct phylink_link_state *state) + { + struct phylink_pcs *pcs; ++ int ret; + ++ /* Get the PCS for this interface mode */ + if (pl->mac_ops->mac_select_pcs) { + pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface); + if (IS_ERR(pcs)) + return PTR_ERR(pcs); ++ } else { ++ pcs = pl->pcs; + } + ++ if (pcs) { ++ /* The PCS, if present, must be setup before phylink_create() ++ * has been called. If the ops is not initialised, print an ++ * error and backtrace rather than oopsing the kernel. ++ */ ++ if (!pcs->ops) { ++ phylink_err(pl, "interface %s: uninitialised PCS\n", ++ phy_modes(state->interface)); ++ dump_stack(); ++ return -EINVAL; ++ } ++ ++ /* Validate the link parameters with the PCS */ ++ if (pcs->ops->pcs_validate) { ++ ret = pcs->ops->pcs_validate(pcs, supported, state); ++ if (ret < 0 || phylink_is_empty_linkmode(supported)) ++ return -EINVAL; ++ ++ /* Ensure the advertising mask is a subset of the ++ * supported mask. ++ */ ++ linkmode_and(state->advertising, state->advertising, ++ supported); ++ } ++ } ++ ++ /* Then validate the link parameters with the MAC */ + pl->mac_ops->validate(pl->config, supported, state); + + return phylink_is_empty_linkmode(supported) ? -EINVAL : 0; +--- a/include/linux/phylink.h ++++ b/include/linux/phylink.h +@@ -398,6 +398,7 @@ struct phylink_pcs { + + /** + * struct phylink_pcs_ops - MAC PCS operations structure. ++ * @pcs_validate: validate the link configuration. + * @pcs_get_state: read the current MAC PCS link state from the hardware. + * @pcs_config: configure the MAC PCS for the selected mode and state. + * @pcs_an_restart: restart 802.3z BaseX autonegotiation. +@@ -405,6 +406,8 @@ struct phylink_pcs { + * (where necessary). + */ + struct phylink_pcs_ops { ++ int (*pcs_validate)(struct phylink_pcs *pcs, unsigned long *supported, ++ const struct phylink_link_state *state); + void (*pcs_get_state)(struct phylink_pcs *pcs, + struct phylink_link_state *state); + int (*pcs_config)(struct phylink_pcs *pcs, unsigned int mode, +@@ -418,6 +421,23 @@ struct phylink_pcs_ops { + + #if 0 /* For kernel-doc purposes only. */ + /** ++ * pcs_validate() - validate the link configuration. ++ * @pcs: a pointer to a &struct phylink_pcs. ++ * @supported: ethtool bitmask for supported link modes. ++ * @state: a const pointer to a &struct phylink_link_state. ++ * ++ * Validate the interface mode, and advertising's autoneg bit, removing any ++ * media ethtool link modes that would not be supportable from the supported ++ * mask. Phylink will propagate the changes to the advertising mask. See the ++ * &struct phylink_mac_ops validate() method. ++ * ++ * Returns -EINVAL if the interface mode/autoneg mode is not supported. ++ * Returns non-zero positive if the link state can be supported. ++ */ ++int pcs_validate(struct phylink_pcs *pcs, unsigned long *supported, ++ const struct phylink_link_state *state); ++ ++/** + * pcs_get_state() - Read the current inband link state from the hardware + * @pcs: a pointer to a &struct phylink_pcs. + * @state: a pointer to a &struct phylink_link_state. diff --git a/target/linux/generic/backport-5.15/703-12-v5.17-net-phylink-add-legacy_pre_march2020-indicator.patch b/target/linux/generic/backport-5.15/703-12-v5.17-net-phylink-add-legacy_pre_march2020-indicator.patch new file mode 100644 index 0000000000..16d5da9c70 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-12-v5.17-net-phylink-add-legacy_pre_march2020-indicator.patch @@ -0,0 +1,43 @@ +From 3e5b1feccea7db576353ffc302f78d522e4116e6 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 9 Dec 2021 13:11:32 +0000 +Subject: [PATCH] net: phylink: add legacy_pre_march2020 indicator + +Add a boolean to phylink_config to indicate whether a driver has not +been updated for the changes in commit 7cceb599d15d ("net: phylink: +avoid mac_config calls"), and thus are reliant on the old behaviour. + +We were currently keying the phylink behaviour on the presence of a +PCS, but this is sub-optimal for modern drivers that may not have a +PCS. + +This commit merely introduces the new flag, but does not add any use, +since we need all legacy drivers to set this flag before it can be +used. Once these legacy drivers have been updated, we can remove this +flag. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + include/linux/phylink.h | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/include/linux/phylink.h ++++ b/include/linux/phylink.h +@@ -84,6 +84,8 @@ enum phylink_op_type { + * struct phylink_config - PHYLINK configuration structure + * @dev: a pointer to a struct device associated with the MAC + * @type: operation type of PHYLINK instance ++ * @legacy_pre_march2020: driver has not been updated for March 2020 updates ++ * (See commit 7cceb599d15d ("net: phylink: avoid mac_config calls") + * @pcs_poll: MAC PCS cannot provide link change interrupt + * @poll_fixed_state: if true, starts link_poll, + * if MAC link is at %MLO_AN_FIXED mode. +@@ -98,6 +100,7 @@ enum phylink_op_type { + struct phylink_config { + struct device *dev; + enum phylink_op_type type; ++ bool legacy_pre_march2020; + bool pcs_poll; + bool poll_fixed_state; + bool mac_managed_pm; diff --git a/target/linux/generic/backport-5.15/703-13-v5.17-net-dsa-mark-DSA-phylink-as-legacy_pre_march2020.patch b/target/linux/generic/backport-5.15/703-13-v5.17-net-dsa-mark-DSA-phylink-as-legacy_pre_march2020.patch new file mode 100644 index 0000000000..849881942e --- /dev/null +++ b/target/linux/generic/backport-5.15/703-13-v5.17-net-dsa-mark-DSA-phylink-as-legacy_pre_march2020.patch @@ -0,0 +1,36 @@ +From 0a9f0794d9bd67e590a9488afe87fbb0419d9539 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 9 Dec 2021 13:11:38 +0000 +Subject: [PATCH] net: dsa: mark DSA phylink as legacy_pre_march2020 + +The majority of DSA drivers do not make use of the PCS support, and +thus operate in legacy mode. In order to preserve this behaviour in +future, we need to set the legacy_pre_march2020 flag so phylink knows +this may require the legacy calls. + +There are some DSA drivers that do make use of PCS support, and these +will continue operating as before - legacy_pre_march2020 will not +prevent split-PCS support enabling the newer phylink behaviour. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + net/dsa/port.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/net/dsa/port.c ++++ b/net/dsa/port.c +@@ -1126,6 +1126,13 @@ int dsa_port_phylink_create(struct dsa_p + if (err) + mode = PHY_INTERFACE_MODE_NA; + ++ /* Presence of phylink_mac_link_state or phylink_mac_an_restart is ++ * an indicator of a legacy phylink driver. ++ */ ++ if (ds->ops->phylink_mac_link_state || ++ ds->ops->phylink_mac_an_restart) ++ dp->pl_config.legacy_pre_march2020 = true; ++ + if (ds->ops->phylink_get_caps) + ds->ops->phylink_get_caps(ds, dp->index, &dp->pl_config); + diff --git a/target/linux/generic/backport-5.15/703-14-v5.17-net-phylink-use-legacy_pre_march2020.patch b/target/linux/generic/backport-5.15/703-14-v5.17-net-phylink-use-legacy_pre_march2020.patch new file mode 100644 index 0000000000..73e53068b8 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-14-v5.17-net-phylink-use-legacy_pre_march2020.patch @@ -0,0 +1,115 @@ +From 001f4261fe4d5ae710cf1f445b6cae6d9d3ae26e Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 9 Dec 2021 13:11:48 +0000 +Subject: [PATCH] net: phylink: use legacy_pre_march2020 + +Use the legacy flag to indicate whether we should operate in legacy +mode. This allows us to stop using the presence of a PCS as an +indicator to the age of the phylink user, and make PCS presence +optional. + +Legacy mode involves: +1) calling mac_config() whenever the link comes up +2) calling mac_config() whenever the inband advertisement changes, + possibly followed by a call to mac_an_restart() +3) making use of mac_an_restart() +4) making use of mac_pcs_get_state() + +All the above functionality was moved to a seperate "PCS" block of +operations in March 2020. + +Update the documents to indicate that the differences that this flag +makes. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/phylink.c | 12 ++++++------ + include/linux/phylink.h | 17 +++++++++++++++++ + 2 files changed, 23 insertions(+), 6 deletions(-) + +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -777,7 +777,7 @@ static void phylink_mac_pcs_an_restart(s + phylink_autoneg_inband(pl->cur_link_an_mode)) { + if (pl->pcs_ops) + pl->pcs_ops->pcs_an_restart(pl->pcs); +- else ++ else if (pl->config->legacy_pre_march2020) + pl->mac_ops->mac_an_restart(pl->config); + } + } +@@ -855,7 +855,7 @@ static int phylink_change_inband_advert( + if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) + return 0; + +- if (!pl->pcs_ops) { ++ if (!pl->pcs_ops && pl->config->legacy_pre_march2020) { + /* Legacy method */ + phylink_mac_config(pl, &pl->link_config); + phylink_mac_pcs_an_restart(pl); +@@ -900,7 +900,8 @@ static void phylink_mac_pcs_get_state(st + + if (pl->pcs_ops) + pl->pcs_ops->pcs_get_state(pl->pcs, state); +- else if (pl->mac_ops->mac_pcs_get_state) ++ else if (pl->mac_ops->mac_pcs_get_state && ++ pl->config->legacy_pre_march2020) + pl->mac_ops->mac_pcs_get_state(pl->config, state); + else + state->link = 0; +@@ -1094,12 +1095,11 @@ static void phylink_resolve(struct work_ + } + phylink_major_config(pl, false, &link_state); + pl->link_config.interface = link_state.interface; +- } else if (!pl->pcs_ops) { ++ } else if (!pl->pcs_ops && pl->config->legacy_pre_march2020) { + /* The interface remains unchanged, only the speed, + * duplex or pause settings have changed. Call the + * old mac_config() method to configure the MAC/PCS +- * only if we do not have a PCS installed (an +- * unconverted user.) ++ * only if we do not have a legacy MAC driver. + */ + phylink_mac_config(pl, &link_state); + } +--- a/include/linux/phylink.h ++++ b/include/linux/phylink.h +@@ -210,6 +210,10 @@ struct phylink_pcs *mac_select_pcs(struc + * negotiation completion state in @state->an_complete, and link up state + * in @state->link. If possible, @state->lp_advertising should also be + * populated. ++ * ++ * Note: This is a legacy method. This function will not be called unless ++ * legacy_pre_march2020 is set in &struct phylink_config and there is no ++ * PCS attached. + */ + void mac_pcs_get_state(struct phylink_config *config, + struct phylink_link_state *state); +@@ -250,6 +254,15 @@ int mac_prepare(struct phylink_config *c + * guaranteed to be correct, and so any mac_config() implementation must + * never reference these fields. + * ++ * Note: For legacy March 2020 drivers (drivers with legacy_pre_march2020 set ++ * in their &phylnk_config and which don't have a PCS), this function will be ++ * called on each link up event, and to also change the in-band advert. For ++ * non-legacy drivers, it will only be called to reconfigure the MAC for a ++ * "major" change in e.g. interface mode. It will not be called for changes ++ * in speed, duplex or pause modes or to change the in-band advertisement. ++ * In any case, it is strongly preferred that speed, duplex and pause settings ++ * are handled in the mac_link_up() method and not in this method. ++ * + * (this requires a rewrite - please refer to mac_link_up() for situations + * where the PCS and MAC are not tightly integrated.) + * +@@ -334,6 +347,10 @@ int mac_finish(struct phylink_config *co + /** + * mac_an_restart() - restart 802.3z BaseX autonegotiation + * @config: a pointer to a &struct phylink_config. ++ * ++ * Note: This is a legacy method. This function will not be called unless ++ * legacy_pre_march2020 is set in &struct phylink_config and there is no ++ * PCS attached. + */ + void mac_an_restart(struct phylink_config *config); + diff --git a/target/linux/generic/backport-5.15/703-15-v5.18-net-phy-phylink-fix-DSA-mac_select_pcs-introduction.patch b/target/linux/generic/backport-5.15/703-15-v5.18-net-phy-phylink-fix-DSA-mac_select_pcs-introduction.patch new file mode 100644 index 0000000000..924d0e954a --- /dev/null +++ b/target/linux/generic/backport-5.15/703-15-v5.18-net-phy-phylink-fix-DSA-mac_select_pcs-introduction.patch @@ -0,0 +1,88 @@ +From 1054457006d4a14de4ae4132030e33d7eedaeba1 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 21 Feb 2022 17:10:52 +0000 +Subject: [PATCH] net: phy: phylink: fix DSA mac_select_pcs() introduction + +Vladimir Oltean reports that probing on DSA drivers that aren't yet +populating supported_interfaces now fails. Fix this by allowing +phylink to detect whether DSA actually provides an underlying +mac_select_pcs() implementation. + +Reported-by: Vladimir Oltean +Fixes: bde018222c6b ("net: dsa: add support for phylink mac_select_pcs()") +Signed-off-by: Russell King (Oracle) +Tested-by: Vladimir Oltean +Link: https://lore.kernel.org/r/E1nMCD6-00A0wC-FG@rmk-PC.armlinux.org.uk +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/phylink.c | 14 +++++++++++--- + net/dsa/port.c | 2 +- + 2 files changed, 12 insertions(+), 4 deletions(-) + +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -74,6 +74,7 @@ struct phylink { + struct work_struct resolve; + + bool mac_link_dropped; ++ bool using_mac_select_pcs; + + struct sfp_bus *sfp_bus; + bool sfp_may_have_phy; +@@ -163,7 +164,7 @@ static int phylink_validate_mac_and_pcs( + int ret; + + /* Get the PCS for this interface mode */ +- if (pl->mac_ops->mac_select_pcs) { ++ if (pl->using_mac_select_pcs) { + pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface); + if (IS_ERR(pcs)) + return PTR_ERR(pcs); +@@ -790,7 +791,7 @@ static void phylink_major_config(struct + + phylink_dbg(pl, "major config %s\n", phy_modes(state->interface)); + +- if (pl->mac_ops->mac_select_pcs) { ++ if (pl->using_mac_select_pcs) { + pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface); + if (IS_ERR(pcs)) { + phylink_err(pl, +@@ -1192,11 +1193,17 @@ struct phylink *phylink_create(struct ph + phy_interface_t iface, + const struct phylink_mac_ops *mac_ops) + { ++ bool using_mac_select_pcs = false; + struct phylink *pl; + int ret; + +- /* Validate the supplied configuration */ + if (mac_ops->mac_select_pcs && ++ mac_ops->mac_select_pcs(config, PHY_INTERFACE_MODE_NA) != ++ ERR_PTR(-EOPNOTSUPP)) ++ using_mac_select_pcs = true; ++ ++ /* Validate the supplied configuration */ ++ if (using_mac_select_pcs && + phy_interface_empty(config->supported_interfaces)) { + dev_err(config->dev, + "phylink: error: empty supported_interfaces but mac_select_pcs() method present\n"); +@@ -1221,6 +1228,7 @@ struct phylink *phylink_create(struct ph + return ERR_PTR(-EINVAL); + } + ++ pl->using_mac_select_pcs = using_mac_select_pcs; + pl->phy_state.interface = iface; + pl->link_interface = iface; + if (iface == PHY_INTERFACE_MODE_MOCA) +--- a/net/dsa/port.c ++++ b/net/dsa/port.c +@@ -1033,8 +1033,8 @@ dsa_port_phylink_mac_select_pcs(struct p + phy_interface_t interface) + { + struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); ++ struct phylink_pcs *pcs = ERR_PTR(-EOPNOTSUPP); + struct dsa_switch *ds = dp->ds; +- struct phylink_pcs *pcs = NULL; + + if (ds->ops->phylink_mac_select_pcs) + pcs = ds->ops->phylink_mac_select_pcs(ds, dp->index, interface); diff --git a/target/linux/generic/backport-5.15/703-16-v5.16-net-mvneta-populate-supported_interfaces-member.patch b/target/linux/generic/backport-5.15/703-16-v5.16-net-mvneta-populate-supported_interfaces-member.patch new file mode 100644 index 0000000000..f21fa4b277 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-16-v5.16-net-mvneta-populate-supported_interfaces-member.patch @@ -0,0 +1,48 @@ +From fdedb695e6a8657302341cda81d519ef04f9acaa Mon Sep 17 00:00:00 2001 +From: Russell King +Date: Wed, 27 Oct 2021 10:03:43 +0100 +Subject: [PATCH] net: mvneta: populate supported_interfaces member + +Populate the phy_interface_t bitmap for the Marvell mvneta driver with +interfaces modes supported by the MAC. + +Signed-off-by: Russell King +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/marvell/mvneta.c | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -5180,6 +5180,31 @@ static int mvneta_probe(struct platform_ + + pp->phylink_config.dev = &dev->dev; + pp->phylink_config.type = PHYLINK_NETDEV; ++ phy_interface_set_rgmii(pp->phylink_config.supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_QSGMII, ++ pp->phylink_config.supported_interfaces); ++ if (comphy) { ++ /* If a COMPHY is present, we can support any of the serdes ++ * modes and switch between them. ++ */ ++ __set_bit(PHY_INTERFACE_MODE_SGMII, ++ pp->phylink_config.supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_1000BASEX, ++ pp->phylink_config.supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_2500BASEX, ++ pp->phylink_config.supported_interfaces); ++ } else if (phy_mode == PHY_INTERFACE_MODE_2500BASEX) { ++ /* No COMPHY, with only 2500BASE-X mode supported */ ++ __set_bit(PHY_INTERFACE_MODE_2500BASEX, ++ pp->phylink_config.supported_interfaces); ++ } else if (phy_mode == PHY_INTERFACE_MODE_1000BASEX || ++ phy_mode == PHY_INTERFACE_MODE_SGMII) { ++ /* No COMPHY, we can switch between 1000BASE-X and SGMII */ ++ __set_bit(PHY_INTERFACE_MODE_1000BASEX, ++ pp->phylink_config.supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_SGMII, ++ pp->phylink_config.supported_interfaces); ++ } + + phylink = phylink_create(&pp->phylink_config, pdev->dev.fwnode, + phy_mode, &mvneta_phylink_ops); diff --git a/target/linux/generic/backport-5.15/703-17-v5.16-net-mvneta-remove-interface-checks-in-mvneta_validat.patch b/target/linux/generic/backport-5.15/703-17-v5.16-net-mvneta-remove-interface-checks-in-mvneta_validat.patch new file mode 100644 index 0000000000..e287e39d6a --- /dev/null +++ b/target/linux/generic/backport-5.15/703-17-v5.16-net-mvneta-remove-interface-checks-in-mvneta_validat.patch @@ -0,0 +1,35 @@ +From d9ca72807ecb236f679b960c70ef5b7d4a5f0222 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 27 Oct 2021 10:03:48 +0100 +Subject: [PATCH] net: mvneta: remove interface checks in mvneta_validate() + +As phylink checks the interface mode against the supported_interfaces +bitmap, we no longer need to validate the interface mode in the +validation function. Remove this to simplify it. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/marvell/mvneta.c | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -3833,15 +3833,8 @@ static void mvneta_validate(struct phyli + * "Bit 2 Field InBandAnEn In-band Auto-Negotiation enable. ... + * When = 1 (1000BASE-X) this field must be set to 1." + */ +- if (phy_interface_mode_is_8023z(state->interface)) { +- if (!phylink_test(state->advertising, Autoneg)) { +- linkmode_zero(supported); +- return; +- } +- } else if (state->interface != PHY_INTERFACE_MODE_NA && +- state->interface != PHY_INTERFACE_MODE_QSGMII && +- state->interface != PHY_INTERFACE_MODE_SGMII && +- !phy_interface_mode_is_rgmii(state->interface)) { ++ if (phy_interface_mode_is_8023z(state->interface) && ++ !phylink_test(state->advertising, Autoneg)) { + linkmode_zero(supported); + return; + } diff --git a/target/linux/generic/backport-5.15/703-18-v5.16-net-mvneta-drop-use-of-phylink_helper_basex_speed.patch b/target/linux/generic/backport-5.15/703-18-v5.16-net-mvneta-drop-use-of-phylink_helper_basex_speed.patch new file mode 100644 index 0000000000..9121612bf8 --- /dev/null +++ b/target/linux/generic/backport-5.15/703-18-v5.16-net-mvneta-drop-use-of-phylink_helper_basex_speed.patch @@ -0,0 +1,55 @@ +From 099cbfa286ab937d8213c2dc5c0b401969b78042 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 27 Oct 2021 10:03:53 +0100 +Subject: [PATCH] net: mvneta: drop use of phylink_helper_basex_speed() + +Now that we have a better method to select SFP interface modes, we +no longer need to use phylink_helper_basex_speed() in a driver's +validation function, and we can also get rid of our hack to indicate +both 1000base-X and 2500base-X if the comphy is present to make that +work. Remove this hack and use of phylink_helper_basex_speed(). + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/marvell/mvneta.c | 12 +++--------- + 1 file changed, 3 insertions(+), 9 deletions(-) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -3824,8 +3824,6 @@ static void mvneta_validate(struct phyli + unsigned long *supported, + struct phylink_link_state *state) + { +- struct net_device *ndev = to_net_dev(config->dev); +- struct mvneta_port *pp = netdev_priv(ndev); + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; + + /* We only support QSGMII, SGMII, 802.3z and RGMII modes. +@@ -3847,11 +3845,12 @@ static void mvneta_validate(struct phyli + phylink_set(mask, Pause); + + /* Half-duplex at speeds higher than 100Mbit is unsupported */ +- if (pp->comphy || state->interface != PHY_INTERFACE_MODE_2500BASEX) { ++ if (state->interface != PHY_INTERFACE_MODE_2500BASEX) { + phylink_set(mask, 1000baseT_Full); + phylink_set(mask, 1000baseX_Full); + } +- if (pp->comphy || state->interface == PHY_INTERFACE_MODE_2500BASEX) { ++ ++ if (state->interface == PHY_INTERFACE_MODE_2500BASEX) { + phylink_set(mask, 2500baseT_Full); + phylink_set(mask, 2500baseX_Full); + } +@@ -3866,11 +3865,6 @@ static void mvneta_validate(struct phyli + + linkmode_and(supported, supported, mask); + linkmode_and(state->advertising, state->advertising, mask); +- +- /* We can only operate at 2500BaseX or 1000BaseX. If requested +- * to advertise both, only report advertising at 2500BaseX. +- */ +- phylink_helper_basex_speed(state); + } + + static void mvneta_mac_pcs_get_state(struct phylink_config *config, diff --git a/target/linux/generic/backport-5.15/703-19-v5.17-net-mvneta-use-phylink_generic_validate.patch b/target/linux/generic/backport-5.15/703-19-v5.17-net-mvneta-use-phylink_generic_validate.patch new file mode 100644 index 0000000000..209dfbc0de --- /dev/null +++ b/target/linux/generic/backport-5.15/703-19-v5.17-net-mvneta-use-phylink_generic_validate.patch @@ -0,0 +1,72 @@ +From 02a0988b98930491db95966fb8086072e47dabb6 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 15 Nov 2021 10:00:32 +0000 +Subject: [PATCH] net: mvneta: use phylink_generic_validate() + +Convert mvneta to use phylink_generic_validate() for the bulk of its +validate() implementation. This network adapter has a restriction +that for 802.3z links, autonegotiation must be enabled. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/marvell/mvneta.c | 34 ++++----------------------- + 1 file changed, 4 insertions(+), 30 deletions(-) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -3824,8 +3824,6 @@ static void mvneta_validate(struct phyli + unsigned long *supported, + struct phylink_link_state *state) + { +- __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; +- + /* We only support QSGMII, SGMII, 802.3z and RGMII modes. + * When in 802.3z mode, we must have AN enabled: + * "Bit 2 Field InBandAnEn In-band Auto-Negotiation enable. ... +@@ -3837,34 +3835,7 @@ static void mvneta_validate(struct phyli + return; + } + +- /* Allow all the expected bits */ +- phylink_set(mask, Autoneg); +- phylink_set_port_modes(mask); +- +- /* Asymmetric pause is unsupported */ +- phylink_set(mask, Pause); +- +- /* Half-duplex at speeds higher than 100Mbit is unsupported */ +- if (state->interface != PHY_INTERFACE_MODE_2500BASEX) { +- phylink_set(mask, 1000baseT_Full); +- phylink_set(mask, 1000baseX_Full); +- } +- +- if (state->interface == PHY_INTERFACE_MODE_2500BASEX) { +- phylink_set(mask, 2500baseT_Full); +- phylink_set(mask, 2500baseX_Full); +- } +- +- if (!phy_interface_mode_is_8023z(state->interface)) { +- /* 10M and 100M are only supported in non-802.3z mode */ +- phylink_set(mask, 10baseT_Half); +- phylink_set(mask, 10baseT_Full); +- phylink_set(mask, 100baseT_Half); +- phylink_set(mask, 100baseT_Full); +- } +- +- linkmode_and(supported, supported, mask); +- linkmode_and(state->advertising, state->advertising, mask); ++ phylink_generic_validate(config, supported, state); + } + + static void mvneta_mac_pcs_get_state(struct phylink_config *config, +@@ -5167,6 +5138,9 @@ static int mvneta_probe(struct platform_ + + pp->phylink_config.dev = &dev->dev; + pp->phylink_config.type = PHYLINK_NETDEV; ++ pp->phylink_config.mac_capabilities = MAC_SYM_PAUSE | MAC_10 | ++ MAC_100 | MAC_1000FD | MAC_2500FD; ++ + phy_interface_set_rgmii(pp->phylink_config.supported_interfaces); + __set_bit(PHY_INTERFACE_MODE_QSGMII, + pp->phylink_config.supported_interfaces); diff --git a/target/linux/generic/backport-5.15/703-20-v5.17-net-mvneta-mark-as-a-legacy_pre_march2020-driver.patch b/target/linux/generic/backport-5.15/703-20-v5.17-net-mvneta-mark-as-a-legacy_pre_march2020-driver.patch new file mode 100644 index 0000000000..31717565bf --- /dev/null +++ b/target/linux/generic/backport-5.15/703-20-v5.17-net-mvneta-mark-as-a-legacy_pre_march2020-driver.patch @@ -0,0 +1,29 @@ +From 2106be4fdf3223d9c5bd485e6ef094139e3197ba Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Sun, 12 Dec 2021 13:01:21 +0000 +Subject: [PATCH] net: mvneta: mark as a legacy_pre_march2020 driver +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +mvneta provides mac_an_restart and mac_pcs_get_state methods, so needs +to be marked as a legacy driver. Marek spotted that mvneta had stopped +working in 2500base-X mode - thanks for reporting. + +Reported-by: Marek Behún +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/marvell/mvneta.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -5138,6 +5138,7 @@ static int mvneta_probe(struct platform_ + + pp->phylink_config.dev = &dev->dev; + pp->phylink_config.type = PHYLINK_NETDEV; ++ pp->phylink_config.legacy_pre_march2020 = true; + pp->phylink_config.mac_capabilities = MAC_SYM_PAUSE | MAC_10 | + MAC_100 | MAC_1000FD | MAC_2500FD; + diff --git a/target/linux/generic/backport-5.15/704-01-v5.17-net-mtk_eth_soc-populate-supported_interfaces-member.patch b/target/linux/generic/backport-5.15/704-01-v5.17-net-mtk_eth_soc-populate-supported_interfaces-member.patch new file mode 100644 index 0000000000..b26b15e60d --- /dev/null +++ b/target/linux/generic/backport-5.15/704-01-v5.17-net-mtk_eth_soc-populate-supported_interfaces-member.patch @@ -0,0 +1,43 @@ +From 83800d29f0c578e82554e7d4c6bfdbdf9b6cf428 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 16 Nov 2021 10:06:43 +0000 +Subject: [PATCH] net: mtk_eth_soc: populate supported_interfaces member + +Populate the phy interface mode bitmap for the Mediatek driver with +interfaces modes supported by the MAC. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3351,6 +3351,26 @@ static int mtk_add_mac(struct mtk_eth *e + + mac->phylink_config.dev = ð->netdev[id]->dev; + mac->phylink_config.type = PHYLINK_NETDEV; ++ __set_bit(PHY_INTERFACE_MODE_MII, ++ mac->phylink_config.supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_GMII, ++ mac->phylink_config.supported_interfaces); ++ ++ if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_RGMII)) ++ phy_interface_set_rgmii(mac->phylink_config.supported_interfaces); ++ ++ if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_TRGMII) && !mac->id) ++ __set_bit(PHY_INTERFACE_MODE_TRGMII, ++ mac->phylink_config.supported_interfaces); ++ ++ if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_SGMII)) { ++ __set_bit(PHY_INTERFACE_MODE_SGMII, ++ mac->phylink_config.supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_1000BASEX, ++ mac->phylink_config.supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_2500BASEX, ++ mac->phylink_config.supported_interfaces); ++ } + + phylink = phylink_create(&mac->phylink_config, + of_fwnode_handle(mac->of_node), diff --git a/target/linux/generic/backport-5.15/704-02-v5.17-net-mtk_eth_soc-remove-interface-checks-in-mtk_valid.patch b/target/linux/generic/backport-5.15/704-02-v5.17-net-mtk_eth_soc-remove-interface-checks-in-mtk_valid.patch new file mode 100644 index 0000000000..0a33ab0093 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-02-v5.17-net-mtk_eth_soc-remove-interface-checks-in-mtk_valid.patch @@ -0,0 +1,75 @@ +From db81ca153814475d7e07365d46a4d1134bd122e2 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 16 Nov 2021 10:06:48 +0000 +Subject: [PATCH] net: mtk_eth_soc: remove interface checks in mtk_validate() + +As phylink checks the interface mode against the supported_interfaces +bitmap, we no longer need to validate the interface mode, nor handle +PHY_INTERFACE_MODE_NA in the validation function. Remove these to +simplify the implementation. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 34 --------------------- + 1 file changed, 34 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -568,24 +568,8 @@ static void mtk_validate(struct phylink_ + unsigned long *supported, + struct phylink_link_state *state) + { +- struct mtk_mac *mac = container_of(config, struct mtk_mac, +- phylink_config); + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; + +- if (state->interface != PHY_INTERFACE_MODE_NA && +- state->interface != PHY_INTERFACE_MODE_MII && +- state->interface != PHY_INTERFACE_MODE_GMII && +- !(MTK_HAS_CAPS(mac->hw->soc->caps, MTK_RGMII) && +- phy_interface_mode_is_rgmii(state->interface)) && +- !(MTK_HAS_CAPS(mac->hw->soc->caps, MTK_TRGMII) && +- !mac->id && state->interface == PHY_INTERFACE_MODE_TRGMII) && +- !(MTK_HAS_CAPS(mac->hw->soc->caps, MTK_SGMII) && +- (state->interface == PHY_INTERFACE_MODE_SGMII || +- phy_interface_mode_is_8023z(state->interface)))) { +- linkmode_zero(supported); +- return; +- } +- + phylink_set_port_modes(mask); + phylink_set(mask, Autoneg); + +@@ -612,7 +596,6 @@ static void mtk_validate(struct phylink_ + case PHY_INTERFACE_MODE_MII: + case PHY_INTERFACE_MODE_RMII: + case PHY_INTERFACE_MODE_REVMII: +- case PHY_INTERFACE_MODE_NA: + default: + phylink_set(mask, 10baseT_Half); + phylink_set(mask, 10baseT_Full); +@@ -621,23 +604,6 @@ static void mtk_validate(struct phylink_ + break; + } + +- if (state->interface == PHY_INTERFACE_MODE_NA) { +- if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_SGMII)) { +- phylink_set(mask, 1000baseT_Full); +- phylink_set(mask, 1000baseX_Full); +- phylink_set(mask, 2500baseX_Full); +- } +- if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_RGMII)) { +- phylink_set(mask, 1000baseT_Full); +- phylink_set(mask, 1000baseT_Half); +- phylink_set(mask, 1000baseX_Full); +- } +- if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_GEPHY)) { +- phylink_set(mask, 1000baseT_Full); +- phylink_set(mask, 1000baseT_Half); +- } +- } +- + phylink_set(mask, Pause); + phylink_set(mask, Asym_Pause); + diff --git a/target/linux/generic/backport-5.15/704-03-v5.17-net-mtk_eth_soc-drop-use-of-phylink_helper_basex_spe.patch b/target/linux/generic/backport-5.15/704-03-v5.17-net-mtk_eth_soc-drop-use-of-phylink_helper_basex_spe.patch new file mode 100644 index 0000000000..f8cc8105a4 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-03-v5.17-net-mtk_eth_soc-drop-use-of-phylink_helper_basex_spe.patch @@ -0,0 +1,42 @@ +From 71d927494463c4f016d828e1134da26b7e961af5 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 16 Nov 2021 10:06:53 +0000 +Subject: [PATCH] net: mtk_eth_soc: drop use of phylink_helper_basex_speed() + +Now that we have a better method to select SFP interface modes, we +no longer need to use phylink_helper_basex_speed() in a driver's +validation function, and we can also get rid of our hack to indicate +both 1000base-X and 2500base-X if the comphy is present to make that +work. Remove this hack and use of phylink_helper_basex_speed(). + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -578,8 +578,9 @@ static void mtk_validate(struct phylink_ + phylink_set(mask, 1000baseT_Full); + break; + case PHY_INTERFACE_MODE_1000BASEX: +- case PHY_INTERFACE_MODE_2500BASEX: + phylink_set(mask, 1000baseX_Full); ++ break; ++ case PHY_INTERFACE_MODE_2500BASEX: + phylink_set(mask, 2500baseX_Full); + break; + case PHY_INTERFACE_MODE_GMII: +@@ -609,11 +610,6 @@ static void mtk_validate(struct phylink_ + + linkmode_and(supported, supported, mask); + linkmode_and(state->advertising, state->advertising, mask); +- +- /* We can only operate at 2500BaseX or 1000BaseX. If requested +- * to advertise both, only report advertising at 2500BaseX. +- */ +- phylink_helper_basex_speed(state); + } + + static const struct phylink_mac_ops mtk_phylink_ops = { diff --git a/target/linux/generic/backport-5.15/704-04-v5.17-net-mtk_eth_soc-use-phylink_generic_validate.patch b/target/linux/generic/backport-5.15/704-04-v5.17-net-mtk_eth_soc-use-phylink_generic_validate.patch new file mode 100644 index 0000000000..6d52e4e37f --- /dev/null +++ b/target/linux/generic/backport-5.15/704-04-v5.17-net-mtk_eth_soc-use-phylink_generic_validate.patch @@ -0,0 +1,84 @@ +From a4238f6ce151afa331375d74a5033b76da637644 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 16 Nov 2021 10:06:58 +0000 +Subject: [PATCH] net: mtk_eth_soc: use phylink_generic_validate() + +mtk_eth_soc has no special behaviour in its validation implementation, +so can be switched to phylink_generic_validate(). + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 53 ++------------------- + 1 file changed, 4 insertions(+), 49 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -564,56 +564,8 @@ static void mtk_mac_link_up(struct phyli + mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id)); + } + +-static void mtk_validate(struct phylink_config *config, +- unsigned long *supported, +- struct phylink_link_state *state) +-{ +- __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; +- +- phylink_set_port_modes(mask); +- phylink_set(mask, Autoneg); +- +- switch (state->interface) { +- case PHY_INTERFACE_MODE_TRGMII: +- phylink_set(mask, 1000baseT_Full); +- break; +- case PHY_INTERFACE_MODE_1000BASEX: +- phylink_set(mask, 1000baseX_Full); +- break; +- case PHY_INTERFACE_MODE_2500BASEX: +- phylink_set(mask, 2500baseX_Full); +- break; +- case PHY_INTERFACE_MODE_GMII: +- case PHY_INTERFACE_MODE_RGMII: +- case PHY_INTERFACE_MODE_RGMII_ID: +- case PHY_INTERFACE_MODE_RGMII_RXID: +- case PHY_INTERFACE_MODE_RGMII_TXID: +- phylink_set(mask, 1000baseT_Half); +- fallthrough; +- case PHY_INTERFACE_MODE_SGMII: +- phylink_set(mask, 1000baseT_Full); +- phylink_set(mask, 1000baseX_Full); +- fallthrough; +- case PHY_INTERFACE_MODE_MII: +- case PHY_INTERFACE_MODE_RMII: +- case PHY_INTERFACE_MODE_REVMII: +- default: +- phylink_set(mask, 10baseT_Half); +- phylink_set(mask, 10baseT_Full); +- phylink_set(mask, 100baseT_Half); +- phylink_set(mask, 100baseT_Full); +- break; +- } +- +- phylink_set(mask, Pause); +- phylink_set(mask, Asym_Pause); +- +- linkmode_and(supported, supported, mask); +- linkmode_and(state->advertising, state->advertising, mask); +-} +- + static const struct phylink_mac_ops mtk_phylink_ops = { +- .validate = mtk_validate, ++ .validate = phylink_generic_validate, + .mac_pcs_get_state = mtk_mac_pcs_get_state, + .mac_an_restart = mtk_mac_an_restart, + .mac_config = mtk_mac_config, +@@ -3313,6 +3265,9 @@ static int mtk_add_mac(struct mtk_eth *e + + mac->phylink_config.dev = ð->netdev[id]->dev; + mac->phylink_config.type = PHYLINK_NETDEV; ++ mac->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | ++ MAC_10 | MAC_100 | MAC_1000 | MAC_2500FD; ++ + __set_bit(PHY_INTERFACE_MODE_MII, + mac->phylink_config.supported_interfaces); + __set_bit(PHY_INTERFACE_MODE_GMII, diff --git a/target/linux/generic/backport-5.15/704-05-v5.17-net-mtk_eth_soc-mark-as-a-legacy_pre_march2020-drive.patch b/target/linux/generic/backport-5.15/704-05-v5.17-net-mtk_eth_soc-mark-as-a-legacy_pre_march2020-drive.patch new file mode 100644 index 0000000000..381c51b81a --- /dev/null +++ b/target/linux/generic/backport-5.15/704-05-v5.17-net-mtk_eth_soc-mark-as-a-legacy_pre_march2020-drive.patch @@ -0,0 +1,29 @@ +From b06515367facfadcf5e70cf6f39db749cf4eb5e3 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 9 Dec 2021 13:11:43 +0000 +Subject: [PATCH] net: mtk_eth_soc: mark as a legacy_pre_march2020 driver + +mtk_eth_soc has not been updated for commit 7cceb599d15d ("net: phylink: +avoid mac_config calls"), and makes use of state->speed and +state->duplex in contravention of the phylink documentation. This makes +reliant on the legacy behaviours, so mark it as a legacy driver. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3265,6 +3265,10 @@ static int mtk_add_mac(struct mtk_eth *e + + mac->phylink_config.dev = ð->netdev[id]->dev; + mac->phylink_config.type = PHYLINK_NETDEV; ++ /* This driver makes use of state->speed/state->duplex in ++ * mac_config ++ */ ++ mac->phylink_config.legacy_pre_march2020 = true; + mac->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | + MAC_10 | MAC_100 | MAC_1000 | MAC_2500FD; + diff --git a/target/linux/generic/backport-5.15/704-06-v5.19-eth-mtk_eth_soc-remove-a-copy-of-the-NAPI_POLL_WEIGH.patch b/target/linux/generic/backport-5.15/704-06-v5.19-eth-mtk_eth_soc-remove-a-copy-of-the-NAPI_POLL_WEIGH.patch new file mode 100644 index 0000000000..887ff56578 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-06-v5.19-eth-mtk_eth_soc-remove-a-copy-of-the-NAPI_POLL_WEIGH.patch @@ -0,0 +1,40 @@ +From 889e3691b9d6573de133da1f5e78f590e52152cd Mon Sep 17 00:00:00 2001 +From: Jakub Kicinski +Date: Thu, 28 Apr 2022 14:23:13 -0700 +Subject: [PATCH] eth: mtk_eth_soc: remove a copy of the NAPI_POLL_WEIGHT + define + +Defining local versions of NAPI_POLL_WEIGHT with the same +values in the drivers just makes refactoring harder. + +Signed-off-by: Jakub Kicinski +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ++-- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 - + 2 files changed, 2 insertions(+), 3 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3564,9 +3564,9 @@ static int mtk_probe(struct platform_dev + */ + init_dummy_netdev(ð->dummy_dev); + netif_napi_add(ð->dummy_dev, ð->tx_napi, mtk_napi_tx, +- MTK_NAPI_WEIGHT); ++ NAPI_POLL_WEIGHT); + netif_napi_add(ð->dummy_dev, ð->rx_napi, mtk_napi_rx, +- MTK_NAPI_WEIGHT); ++ NAPI_POLL_WEIGHT); + + platform_set_drvdata(pdev, eth); + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -25,7 +25,6 @@ + #define MTK_TX_DMA_BUF_LEN 0x3fff + #define MTK_TX_DMA_BUF_LEN_V2 0xffff + #define MTK_DMA_SIZE 512 +-#define MTK_NAPI_WEIGHT 64 + #define MTK_MAC_COUNT 2 + #define MTK_RX_ETH_HLEN (ETH_HLEN + ETH_FCS_LEN) + #define MTK_RX_HLEN (NET_SKB_PAD + MTK_RX_ETH_HLEN + NET_IP_ALIGN) diff --git a/target/linux/generic/backport-5.15/704-07-v5.19-mtk_eth_soc-remove-unused-mac-mode.patch b/target/linux/generic/backport-5.15/704-07-v5.19-mtk_eth_soc-remove-unused-mac-mode.patch new file mode 100644 index 0000000000..58aa54f4e5 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-07-v5.19-mtk_eth_soc-remove-unused-mac-mode.patch @@ -0,0 +1,35 @@ +From 0600bdde1fae75fb9bad72033d28edddc72b44b2 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 18 May 2022 15:54:31 +0100 +Subject: [PATCH 01/12] net: mtk_eth_soc: remove unused mac->mode + +mac->mode is only ever written to in one location, and is thus +superflous. Remove it. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 1 - + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 - + 2 files changed, 2 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3260,7 +3260,6 @@ static int mtk_add_mac(struct mtk_eth *e + + /* mac config is not set */ + mac->interface = PHY_INTERFACE_MODE_NA; +- mac->mode = MLO_AN_PHY; + mac->speed = SPEED_UNKNOWN; + + mac->phylink_config.dev = ð->netdev[id]->dev; +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1086,7 +1086,6 @@ struct mtk_eth { + struct mtk_mac { + int id; + phy_interface_t interface; +- unsigned int mode; + int speed; + struct device_node *of_node; + struct phylink *phylink; diff --git a/target/linux/generic/backport-5.15/704-08-v5.19-net-mtk_eth_soc-remove-unused-sgmii-flags.patch b/target/linux/generic/backport-5.15/704-08-v5.19-net-mtk_eth_soc-remove-unused-sgmii-flags.patch new file mode 100644 index 0000000000..a15914bd55 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-08-v5.19-net-mtk_eth_soc-remove-unused-sgmii-flags.patch @@ -0,0 +1,40 @@ +From 5a7a2f4b29d7546244da7d8bbc1962fce5b230f2 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 18 May 2022 15:54:36 +0100 +Subject: [PATCH 02/12] net: mtk_eth_soc: remove unused sgmii flags + +The "flags" member of struct mtk_sgmii appears to be unused, as are +the MTK_SGMII_PHYSPEED_* and MTK_HAS_FLAGS() macros. Remove them. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 8 -------- + 1 file changed, 8 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -957,23 +957,15 @@ struct mtk_soc_data { + /* currently no SoC has more than 2 macs */ + #define MTK_MAX_DEVS 2 + +-#define MTK_SGMII_PHYSPEED_AN BIT(31) +-#define MTK_SGMII_PHYSPEED_MASK GENMASK(2, 0) +-#define MTK_SGMII_PHYSPEED_1000 BIT(0) +-#define MTK_SGMII_PHYSPEED_2500 BIT(1) +-#define MTK_HAS_FLAGS(flags, _x) (((flags) & (_x)) == (_x)) +- + /* struct mtk_sgmii - This is the structure holding sgmii regmap and its + * characteristics + * @regmap: The register map pointing at the range used to setup + * SGMII modes +- * @flags: The enum refers to which mode the sgmii wants to run on + * @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap + */ + + struct mtk_sgmii { + struct regmap *regmap[MTK_MAX_DEVS]; +- u32 flags[MTK_MAX_DEVS]; + u32 ana_rgc3; + }; + diff --git a/target/linux/generic/backport-5.15/704-09-v5.19-net-mtk_eth_soc-add-mask-and-update-PCS-speed-defini.patch b/target/linux/generic/backport-5.15/704-09-v5.19-net-mtk_eth_soc-add-mask-and-update-PCS-speed-defini.patch new file mode 100644 index 0000000000..e16bc875e5 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-09-v5.19-net-mtk_eth_soc-add-mask-and-update-PCS-speed-defini.patch @@ -0,0 +1,40 @@ +From bc5e93e0cd22e360eda23859b939280205567580 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 18 May 2022 15:54:42 +0100 +Subject: [PATCH 03/12] net: mtk_eth_soc: add mask and update PCS speed + definitions + +The PCS speed setting is a two bit field, but it is defined as two +separate bits. Add a bitfield mask for the speed definitions, an + use the FIELD_PREP() macro to define each PCS speed. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + #include "mtk_ppe.h" + + #define MTK_QDMA_PAGE_SIZE 2048 +@@ -474,9 +475,10 @@ + #define SGMSYS_SGMII_MODE 0x20 + #define SGMII_IF_MODE_BIT0 BIT(0) + #define SGMII_SPEED_DUPLEX_AN BIT(1) +-#define SGMII_SPEED_10 0x0 +-#define SGMII_SPEED_100 BIT(2) +-#define SGMII_SPEED_1000 BIT(3) ++#define SGMII_SPEED_MASK GENMASK(3, 2) ++#define SGMII_SPEED_10 FIELD_PREP(SGMII_SPEED_MASK, 0) ++#define SGMII_SPEED_100 FIELD_PREP(SGMII_SPEED_MASK, 1) ++#define SGMII_SPEED_1000 FIELD_PREP(SGMII_SPEED_MASK, 2) + #define SGMII_DUPLEX_FULL BIT(4) + #define SGMII_IF_MODE_BIT5 BIT(5) + #define SGMII_REMOTE_FAULT_DIS BIT(8) diff --git a/target/linux/generic/backport-5.15/704-10-v5.19-net-mtk_eth_soc-correct-802.3z-speed-setting.patch b/target/linux/generic/backport-5.15/704-10-v5.19-net-mtk_eth_soc-correct-802.3z-speed-setting.patch new file mode 100644 index 0000000000..fb1ee4e310 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-10-v5.19-net-mtk_eth_soc-correct-802.3z-speed-setting.patch @@ -0,0 +1,60 @@ +From 7da3f901f8ecb425105fad39a0f5de73306abe52 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 18 May 2022 15:54:47 +0100 +Subject: [PATCH 04/12] net: mtk_eth_soc: correct 802.3z speed setting + +Phylink does not guarantee that state->speed will be set correctly in +the mac_config() call, so it's a bug that the driver makes use of it. +Moreover, it is making use of it in a function that is only ever called +for 1000BASE-X and 2500BASE-X which operate at a fixed speed which +happens to be the same setting irrespective of the interface mode. We +can simply remove the switch statement and just set the SGMII interface +speed. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 18 +++++------------- + 1 file changed, 5 insertions(+), 13 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -34,6 +34,7 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, + return 0; + } + ++/* For SGMII interface mode */ + int mtk_sgmii_setup_mode_an(struct mtk_sgmii *ss, int id) + { + unsigned int val; +@@ -60,6 +61,9 @@ int mtk_sgmii_setup_mode_an(struct mtk_s + return 0; + } + ++/* For 1000BASE-X and 2500BASE-X interface modes, which operate at a ++ * fixed speed. ++ */ + int mtk_sgmii_setup_mode_force(struct mtk_sgmii *ss, int id, + const struct phylink_link_state *state) + { +@@ -82,19 +86,7 @@ int mtk_sgmii_setup_mode_force(struct mt + /* SGMII force mode setting */ + regmap_read(ss->regmap[id], SGMSYS_SGMII_MODE, &val); + val &= ~SGMII_IF_MODE_MASK; +- +- switch (state->speed) { +- case SPEED_10: +- val |= SGMII_SPEED_10; +- break; +- case SPEED_100: +- val |= SGMII_SPEED_100; +- break; +- case SPEED_2500: +- case SPEED_1000: +- val |= SGMII_SPEED_1000; +- break; +- } ++ val |= SGMII_SPEED_1000; + + if (state->duplex == DUPLEX_FULL) + val |= SGMII_DUPLEX_FULL; diff --git a/target/linux/generic/backport-5.15/704-11-v5.19-net-mtk_eth_soc-correct-802.3z-duplex-setting.patch b/target/linux/generic/backport-5.15/704-11-v5.19-net-mtk_eth_soc-correct-802.3z-duplex-setting.patch new file mode 100644 index 0000000000..951c8fea84 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-11-v5.19-net-mtk_eth_soc-correct-802.3z-duplex-setting.patch @@ -0,0 +1,101 @@ +From a459187390bb221827f9c07866c3a5ffbdf9622b Mon Sep 17 00:00:00 2001 +From: Russell King +Date: Wed, 18 May 2022 15:54:52 +0100 +Subject: [PATCH 05/12] net: mtk_eth_soc: correct 802.3z duplex setting + +Phylink does not guarantee that state->duplex will be set correctly in +the mac_config() call, so it's a bug that the driver makes use of it. + +Move the 802.3z PCS duplex configuration to mac_link_up(). + +Signed-off-by: Russell King +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 16 +++++++++++---- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 + + drivers/net/ethernet/mediatek/mtk_sgmii.c | 22 +++++++++++++++------ + 3 files changed, 29 insertions(+), 10 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -533,8 +533,18 @@ static void mtk_mac_link_up(struct phyli + { + struct mtk_mac *mac = container_of(config, struct mtk_mac, + phylink_config); +- u32 mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); ++ u32 mcr; + ++ if (phy_interface_mode_is_8023z(interface)) { ++ struct mtk_eth *eth = mac->hw; ++ ++ /* Decide how GMAC and SGMIISYS be mapped */ ++ int sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ? ++ 0 : mac->id; ++ mtk_sgmii_link_up(eth->sgmii, sid, speed, duplex); ++ } ++ ++ mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); + mcr &= ~(MAC_MCR_SPEED_100 | MAC_MCR_SPEED_1000 | + MAC_MCR_FORCE_DPX | MAC_MCR_FORCE_TX_FC | + MAC_MCR_FORCE_RX_FC); +@@ -3264,9 +3274,7 @@ static int mtk_add_mac(struct mtk_eth *e + + mac->phylink_config.dev = ð->netdev[id]->dev; + mac->phylink_config.type = PHYLINK_NETDEV; +- /* This driver makes use of state->speed/state->duplex in +- * mac_config +- */ ++ /* This driver makes use of state->speed in mac_config */ + mac->phylink_config.legacy_pre_march2020 = true; + mac->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | + MAC_10 | MAC_100 | MAC_1000 | MAC_2500FD; +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1104,6 +1104,7 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, + int mtk_sgmii_setup_mode_an(struct mtk_sgmii *ss, int id); + int mtk_sgmii_setup_mode_force(struct mtk_sgmii *ss, int id, + const struct phylink_link_state *state); ++void mtk_sgmii_link_up(struct mtk_sgmii *ss, int id, int speed, int duplex); + void mtk_sgmii_restart_an(struct mtk_eth *eth, int mac_id); + + int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id); +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -83,14 +83,10 @@ int mtk_sgmii_setup_mode_force(struct mt + val &= ~SGMII_AN_ENABLE; + regmap_write(ss->regmap[id], SGMSYS_PCS_CONTROL_1, val); + +- /* SGMII force mode setting */ ++ /* Set the speed etc but leave the duplex unchanged */ + regmap_read(ss->regmap[id], SGMSYS_SGMII_MODE, &val); +- val &= ~SGMII_IF_MODE_MASK; ++ val &= SGMII_DUPLEX_FULL | ~SGMII_IF_MODE_MASK; + val |= SGMII_SPEED_1000; +- +- if (state->duplex == DUPLEX_FULL) +- val |= SGMII_DUPLEX_FULL; +- + regmap_write(ss->regmap[id], SGMSYS_SGMII_MODE, val); + + /* Release PHYA power down state */ +@@ -101,6 +97,20 @@ int mtk_sgmii_setup_mode_force(struct mt + return 0; + } + ++/* For 1000BASE-X and 2500BASE-X interface modes */ ++void mtk_sgmii_link_up(struct mtk_sgmii *ss, int id, int speed, int duplex) ++{ ++ unsigned int val; ++ ++ /* SGMII force duplex setting */ ++ regmap_read(ss->regmap[id], SGMSYS_SGMII_MODE, &val); ++ val &= ~SGMII_DUPLEX_FULL; ++ if (duplex == DUPLEX_FULL) ++ val |= SGMII_DUPLEX_FULL; ++ ++ regmap_write(ss->regmap[id], SGMSYS_SGMII_MODE, val); ++} ++ + void mtk_sgmii_restart_an(struct mtk_eth *eth, int mac_id) + { + struct mtk_sgmii *ss = eth->sgmii; diff --git a/target/linux/generic/backport-5.15/704-12-v5.19-net-mtk_eth_soc-stop-passing-phylink-state-to-sgmii-.patch b/target/linux/generic/backport-5.15/704-12-v5.19-net-mtk_eth_soc-stop-passing-phylink-state-to-sgmii-.patch new file mode 100644 index 0000000000..6556bb7d07 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-12-v5.19-net-mtk_eth_soc-stop-passing-phylink-state-to-sgmii-.patch @@ -0,0 +1,60 @@ +From 4ce5a0bd3958ed248f0325bfcb95339f7c74feb2 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 18 May 2022 15:54:57 +0100 +Subject: [PATCH 06/12] net: mtk_eth_soc: stop passing phylink state to sgmii + setup + +Now that mtk_sgmii_setup_mode_force() only uses the interface mode +from the phylink state, pass just the interface mode into this +function. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 4 ++-- + 3 files changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -437,7 +437,7 @@ static void mtk_mac_config(struct phylin + /* Setup SGMIISYS with the determined property */ + if (state->interface != PHY_INTERFACE_MODE_SGMII) + err = mtk_sgmii_setup_mode_force(eth->sgmii, sid, +- state); ++ state->interface); + else if (phylink_autoneg_inband(mode)) + err = mtk_sgmii_setup_mode_an(eth->sgmii, sid); + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1103,7 +1103,7 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, + u32 ana_rgc3); + int mtk_sgmii_setup_mode_an(struct mtk_sgmii *ss, int id); + int mtk_sgmii_setup_mode_force(struct mtk_sgmii *ss, int id, +- const struct phylink_link_state *state); ++ phy_interface_t interface); + void mtk_sgmii_link_up(struct mtk_sgmii *ss, int id, int speed, int duplex); + void mtk_sgmii_restart_an(struct mtk_eth *eth, int mac_id); + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -65,7 +65,7 @@ int mtk_sgmii_setup_mode_an(struct mtk_s + * fixed speed. + */ + int mtk_sgmii_setup_mode_force(struct mtk_sgmii *ss, int id, +- const struct phylink_link_state *state) ++ phy_interface_t interface) + { + unsigned int val; + +@@ -74,7 +74,7 @@ int mtk_sgmii_setup_mode_force(struct mt + + regmap_read(ss->regmap[id], ss->ana_rgc3, &val); + val &= ~RG_PHY_SPEED_MASK; +- if (state->interface == PHY_INTERFACE_MODE_2500BASEX) ++ if (interface == PHY_INTERFACE_MODE_2500BASEX) + val |= RG_PHY_SPEED_3_125G; + regmap_write(ss->regmap[id], ss->ana_rgc3, val); + diff --git a/target/linux/generic/backport-5.15/704-13-v5.19-net-mtk_eth_soc-provide-mtk_sgmii_config.patch b/target/linux/generic/backport-5.15/704-13-v5.19-net-mtk_eth_soc-provide-mtk_sgmii_config.patch new file mode 100644 index 0000000000..0e22c7fd67 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-13-v5.19-net-mtk_eth_soc-provide-mtk_sgmii_config.patch @@ -0,0 +1,89 @@ +From 1ec619ee4a052fb9ac48b57554ac2722a0bfe73c Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 18 May 2022 15:55:02 +0100 +Subject: [PATCH 07/12] net: mtk_eth_soc: provide mtk_sgmii_config() + +Provide mtk_sgmii_config() to wrap up the decisions about which SGMII +configuration will be called. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 7 +------ + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 5 ++--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 20 +++++++++++++++++--- + 3 files changed, 20 insertions(+), 12 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -435,12 +435,7 @@ static void mtk_mac_config(struct phylin + 0 : mac->id; + + /* Setup SGMIISYS with the determined property */ +- if (state->interface != PHY_INTERFACE_MODE_SGMII) +- err = mtk_sgmii_setup_mode_force(eth->sgmii, sid, +- state->interface); +- else if (phylink_autoneg_inband(mode)) +- err = mtk_sgmii_setup_mode_an(eth->sgmii, sid); +- ++ err = mtk_sgmii_config(eth->sgmii, sid, mode, state->interface); + if (err) + goto init_err; + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1101,9 +1101,8 @@ u32 mtk_r32(struct mtk_eth *eth, unsigne + + int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *np, + u32 ana_rgc3); +-int mtk_sgmii_setup_mode_an(struct mtk_sgmii *ss, int id); +-int mtk_sgmii_setup_mode_force(struct mtk_sgmii *ss, int id, +- phy_interface_t interface); ++int mtk_sgmii_config(struct mtk_sgmii *ss, int id, unsigned int mode, ++ phy_interface_t interface); + void mtk_sgmii_link_up(struct mtk_sgmii *ss, int id, int speed, int duplex); + void mtk_sgmii_restart_an(struct mtk_eth *eth, int mac_id); + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -35,7 +35,7 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, + } + + /* For SGMII interface mode */ +-int mtk_sgmii_setup_mode_an(struct mtk_sgmii *ss, int id) ++static int mtk_sgmii_setup_mode_an(struct mtk_sgmii *ss, int id) + { + unsigned int val; + +@@ -64,8 +64,8 @@ int mtk_sgmii_setup_mode_an(struct mtk_s + /* For 1000BASE-X and 2500BASE-X interface modes, which operate at a + * fixed speed. + */ +-int mtk_sgmii_setup_mode_force(struct mtk_sgmii *ss, int id, +- phy_interface_t interface) ++static int mtk_sgmii_setup_mode_force(struct mtk_sgmii *ss, int id, ++ phy_interface_t interface) + { + unsigned int val; + +@@ -97,6 +97,20 @@ int mtk_sgmii_setup_mode_force(struct mt + return 0; + } + ++int mtk_sgmii_config(struct mtk_sgmii *ss, int id, unsigned int mode, ++ phy_interface_t interface) ++{ ++ int err = 0; ++ ++ /* Setup SGMIISYS with the determined property */ ++ if (interface != PHY_INTERFACE_MODE_SGMII) ++ err = mtk_sgmii_setup_mode_force(ss, id, interface); ++ else if (phylink_autoneg_inband(mode)) ++ err = mtk_sgmii_setup_mode_an(ss, id); ++ ++ return err; ++} ++ + /* For 1000BASE-X and 2500BASE-X interface modes */ + void mtk_sgmii_link_up(struct mtk_sgmii *ss, int id, int speed, int duplex) + { diff --git a/target/linux/generic/backport-5.15/704-14-v5.19-net-mtk_eth_soc-add-fixme-comment-for-state-speed-us.patch b/target/linux/generic/backport-5.15/704-14-v5.19-net-mtk_eth_soc-add-fixme-comment-for-state-speed-us.patch new file mode 100644 index 0000000000..8080a2ca44 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-14-v5.19-net-mtk_eth_soc-add-fixme-comment-for-state-speed-us.patch @@ -0,0 +1,38 @@ +From 650a49bc65df6b0e0051a8f62d7c22d95a8f350d Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 18 May 2022 15:55:07 +0100 +Subject: [PATCH 08/12] net: mtk_eth_soc: add fixme comment for state->speed + use + +Add a fixme comment for the last remaining incorrect usage of +state->speed in the mac_config() method, which is strangely in a code +path which is only run when the PHY interface mode changes. + +This means if we are in RGMII mode, changes in state->speed will not +cause the INTF_MODE, TRGMII_RCK_CTRL and TRGMII_TCK_CTRL registers to +be set according to the speed, nor will the TRGPLL clock be set to the +correct value. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -374,6 +374,14 @@ static void mtk_mac_config(struct phylin + state->interface)) + goto err_phy; + } else { ++ /* FIXME: this is incorrect. Not only does it ++ * use state->speed (which is not guaranteed ++ * to be correct) but it also makes use of it ++ * in a code path that will only be reachable ++ * when the PHY interface mode changes, not ++ * when the speed changes. Consequently, RGMII ++ * is probably broken. ++ */ + mtk_gmac0_rgmii_adjust(mac->hw, + state->interface, + state->speed); diff --git a/target/linux/generic/backport-5.15/704-15-v5.19-net-mtk_eth_soc-move-MAC_MCR-setting-to-mac_finish.patch b/target/linux/generic/backport-5.15/704-15-v5.19-net-mtk_eth_soc-move-MAC_MCR-setting-to-mac_finish.patch new file mode 100644 index 0000000000..337c6112d6 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-15-v5.19-net-mtk_eth_soc-move-MAC_MCR-setting-to-mac_finish.patch @@ -0,0 +1,79 @@ +From 0e37ad71b2ff772009595002da2860999e98e14e Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 18 May 2022 15:55:12 +0100 +Subject: [PATCH 09/12] net: mtk_eth_soc: move MAC_MCR setting to mac_finish() + +Move the setting of the MTK_MAC_MCR register from the end of mac_config +into the phylink mac_finish() method, to keep it as the very last write +that is done during configuration. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 33 ++++++++++++++------- + 1 file changed, 22 insertions(+), 11 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -316,8 +316,8 @@ static void mtk_mac_config(struct phylin + struct mtk_mac *mac = container_of(config, struct mtk_mac, + phylink_config); + struct mtk_eth *eth = mac->hw; +- u32 mcr_cur, mcr_new, sid, i; + int val, ge_mode, err = 0; ++ u32 sid, i; + + /* MT76x8 has no hardware settings between for the MAC */ + if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) && +@@ -455,6 +455,25 @@ static void mtk_mac_config(struct phylin + return; + } + ++ return; ++ ++err_phy: ++ dev_err(eth->dev, "%s: GMAC%d mode %s not supported!\n", __func__, ++ mac->id, phy_modes(state->interface)); ++ return; ++ ++init_err: ++ dev_err(eth->dev, "%s: GMAC%d mode %s err: %d!\n", __func__, ++ mac->id, phy_modes(state->interface), err); ++} ++ ++static int mtk_mac_finish(struct phylink_config *config, unsigned int mode, ++ phy_interface_t interface) ++{ ++ struct mtk_mac *mac = container_of(config, struct mtk_mac, ++ phylink_config); ++ u32 mcr_cur, mcr_new; ++ + /* Setup gmac */ + mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); + mcr_new = mcr_cur; +@@ -466,16 +485,7 @@ static void mtk_mac_config(struct phylin + if (mcr_new != mcr_cur) + mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); + +- return; +- +-err_phy: +- dev_err(eth->dev, "%s: GMAC%d mode %s not supported!\n", __func__, +- mac->id, phy_modes(state->interface)); +- return; +- +-init_err: +- dev_err(eth->dev, "%s: GMAC%d mode %s err: %d!\n", __func__, +- mac->id, phy_modes(state->interface), err); ++ return 0; + } + + static void mtk_mac_pcs_get_state(struct phylink_config *config, +@@ -582,6 +592,7 @@ static const struct phylink_mac_ops mtk_ + .mac_pcs_get_state = mtk_mac_pcs_get_state, + .mac_an_restart = mtk_mac_an_restart, + .mac_config = mtk_mac_config, ++ .mac_finish = mtk_mac_finish, + .mac_link_down = mtk_mac_link_down, + .mac_link_up = mtk_mac_link_up, + }; diff --git a/target/linux/generic/backport-5.15/704-16-v5.19-net-mtk_eth_soc-move-restoration-of-SYSCFG0-to-mac_f.patch b/target/linux/generic/backport-5.15/704-16-v5.19-net-mtk_eth_soc-move-restoration-of-SYSCFG0-to-mac_f.patch new file mode 100644 index 0000000000..b03ef436bd --- /dev/null +++ b/target/linux/generic/backport-5.15/704-16-v5.19-net-mtk_eth_soc-move-restoration-of-SYSCFG0-to-mac_f.patch @@ -0,0 +1,57 @@ +From 21089867278deb2a110b685e3cd33f64f9ce41e2 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 18 May 2022 15:55:17 +0100 +Subject: [PATCH 10/12] net: mtk_eth_soc: move restoration of SYSCFG0 to + mac_finish() + +The SGMIISYS configuration is performed while ETHSYS_SYSCFG0 is in a +disabled state. In order to preserve this when we switch to phylink_pcs +we need to move the restoration of this register to the mac_finish() +callback. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 11 +++++++++-- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 + + 2 files changed, 10 insertions(+), 2 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -447,8 +447,8 @@ static void mtk_mac_config(struct phylin + if (err) + goto init_err; + +- regmap_update_bits(eth->ethsys, ETHSYS_SYSCFG0, +- SYSCFG0_SGMII_MASK, val); ++ /* Save the syscfg0 value for mac_finish */ ++ mac->syscfg0 = val; + } else if (phylink_autoneg_inband(mode)) { + dev_err(eth->dev, + "In-band mode not supported in non SGMII mode!\n"); +@@ -472,8 +472,15 @@ static int mtk_mac_finish(struct phylink + { + struct mtk_mac *mac = container_of(config, struct mtk_mac, + phylink_config); ++ struct mtk_eth *eth = mac->hw; + u32 mcr_cur, mcr_new; + ++ /* Enable SGMII */ ++ if (interface == PHY_INTERFACE_MODE_SGMII || ++ phy_interface_mode_is_8023z(interface)) ++ regmap_update_bits(eth->ethsys, ETHSYS_SYSCFG0, ++ SYSCFG0_SGMII_MASK, mac->syscfg0); ++ + /* Setup gmac */ + mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); + mcr_new = mcr_cur; +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1088,6 +1088,7 @@ struct mtk_mac { + struct mtk_hw_stats *hw_stats; + __be32 hwlro_ip[MTK_MAX_LRO_IP_CNT]; + int hwlro_ip_cnt; ++ unsigned int syscfg0; + }; + + /* the struct describing the SoC. these are declared in the soc_xyz.c files */ diff --git a/target/linux/generic/backport-5.15/704-17-v5.19-net-mtk_eth_soc-convert-code-structure-to-suit-split.patch b/target/linux/generic/backport-5.15/704-17-v5.19-net-mtk_eth_soc-convert-code-structure-to-suit-split.patch new file mode 100644 index 0000000000..4c84703cd9 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-17-v5.19-net-mtk_eth_soc-convert-code-structure-to-suit-split.patch @@ -0,0 +1,254 @@ +From 901f3fbe13c3e56f0742e02717ccbfabbc95c463 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 18 May 2022 15:55:22 +0100 +Subject: [PATCH 11/12] net: mtk_eth_soc: convert code structure to suit split + PCS support + +Provide a mtk_pcs structure which encapsulates everything that the PCS +functions need (the regmap and ana_rgc3 offset), and use this in the +PCS functions. Provide shim functions to convert from the existing +"mtk_sgmii_*" interface to the converted PCS functions. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 15 ++- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 123 +++++++++++--------- + 2 files changed, 79 insertions(+), 59 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -959,16 +959,23 @@ struct mtk_soc_data { + /* currently no SoC has more than 2 macs */ + #define MTK_MAX_DEVS 2 + +-/* struct mtk_sgmii - This is the structure holding sgmii regmap and its +- * characteristics ++/* struct mtk_pcs - This structure holds each sgmii regmap and associated ++ * data + * @regmap: The register map pointing at the range used to setup + * SGMII modes + * @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap + */ ++struct mtk_pcs { ++ struct regmap *regmap; ++ u32 ana_rgc3; ++}; + ++/* struct mtk_sgmii - This is the structure holding sgmii regmap and its ++ * characteristics ++ * @pcs Array of individual PCS structures ++ */ + struct mtk_sgmii { +- struct regmap *regmap[MTK_MAX_DEVS]; +- u32 ana_rgc3; ++ struct mtk_pcs pcs[MTK_MAX_DEVS]; + }; + + /* struct mtk_eth - This is the main datasructure for holding the state +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -9,90 +9,71 @@ + + #include + #include ++#include + #include + + #include "mtk_eth_soc.h" + +-int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *r, u32 ana_rgc3) +-{ +- struct device_node *np; +- int i; +- +- ss->ana_rgc3 = ana_rgc3; +- +- for (i = 0; i < MTK_MAX_DEVS; i++) { +- np = of_parse_phandle(r, "mediatek,sgmiisys", i); +- if (!np) +- break; +- +- ss->regmap[i] = syscon_node_to_regmap(np); +- of_node_put(np); +- if (IS_ERR(ss->regmap[i])) +- return PTR_ERR(ss->regmap[i]); +- } +- +- return 0; +-} +- + /* For SGMII interface mode */ +-static int mtk_sgmii_setup_mode_an(struct mtk_sgmii *ss, int id) ++static int mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs) + { + unsigned int val; + +- if (!ss->regmap[id]) ++ if (!mpcs->regmap) + return -EINVAL; + + /* Setup the link timer and QPHY power up inside SGMIISYS */ +- regmap_write(ss->regmap[id], SGMSYS_PCS_LINK_TIMER, ++ regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER, + SGMII_LINK_TIMER_DEFAULT); + +- regmap_read(ss->regmap[id], SGMSYS_SGMII_MODE, &val); ++ regmap_read(mpcs->regmap, SGMSYS_SGMII_MODE, &val); + val |= SGMII_REMOTE_FAULT_DIS; +- regmap_write(ss->regmap[id], SGMSYS_SGMII_MODE, val); ++ regmap_write(mpcs->regmap, SGMSYS_SGMII_MODE, val); + +- regmap_read(ss->regmap[id], SGMSYS_PCS_CONTROL_1, &val); ++ regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &val); + val |= SGMII_AN_RESTART; +- regmap_write(ss->regmap[id], SGMSYS_PCS_CONTROL_1, val); ++ regmap_write(mpcs->regmap, SGMSYS_PCS_CONTROL_1, val); + +- regmap_read(ss->regmap[id], SGMSYS_QPHY_PWR_STATE_CTRL, &val); ++ regmap_read(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, &val); + val &= ~SGMII_PHYA_PWD; +- regmap_write(ss->regmap[id], SGMSYS_QPHY_PWR_STATE_CTRL, val); ++ regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, val); + + return 0; ++ + } + + /* For 1000BASE-X and 2500BASE-X interface modes, which operate at a + * fixed speed. + */ +-static int mtk_sgmii_setup_mode_force(struct mtk_sgmii *ss, int id, +- phy_interface_t interface) ++static int mtk_pcs_setup_mode_force(struct mtk_pcs *mpcs, ++ phy_interface_t interface) + { + unsigned int val; + +- if (!ss->regmap[id]) ++ if (!mpcs->regmap) + return -EINVAL; + +- regmap_read(ss->regmap[id], ss->ana_rgc3, &val); ++ regmap_read(mpcs->regmap, mpcs->ana_rgc3, &val); + val &= ~RG_PHY_SPEED_MASK; + if (interface == PHY_INTERFACE_MODE_2500BASEX) + val |= RG_PHY_SPEED_3_125G; +- regmap_write(ss->regmap[id], ss->ana_rgc3, val); ++ regmap_write(mpcs->regmap, mpcs->ana_rgc3, val); + + /* Disable SGMII AN */ +- regmap_read(ss->regmap[id], SGMSYS_PCS_CONTROL_1, &val); ++ regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &val); + val &= ~SGMII_AN_ENABLE; +- regmap_write(ss->regmap[id], SGMSYS_PCS_CONTROL_1, val); ++ regmap_write(mpcs->regmap, SGMSYS_PCS_CONTROL_1, val); + + /* Set the speed etc but leave the duplex unchanged */ +- regmap_read(ss->regmap[id], SGMSYS_SGMII_MODE, &val); ++ regmap_read(mpcs->regmap, SGMSYS_SGMII_MODE, &val); + val &= SGMII_DUPLEX_FULL | ~SGMII_IF_MODE_MASK; + val |= SGMII_SPEED_1000; +- regmap_write(ss->regmap[id], SGMSYS_SGMII_MODE, val); ++ regmap_write(mpcs->regmap, SGMSYS_SGMII_MODE, val); + + /* Release PHYA power down state */ +- regmap_read(ss->regmap[id], SGMSYS_QPHY_PWR_STATE_CTRL, &val); ++ regmap_read(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, &val); + val &= ~SGMII_PHYA_PWD; +- regmap_write(ss->regmap[id], SGMSYS_QPHY_PWR_STATE_CTRL, val); ++ regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, val); + + return 0; + } +@@ -100,44 +81,76 @@ static int mtk_sgmii_setup_mode_force(st + int mtk_sgmii_config(struct mtk_sgmii *ss, int id, unsigned int mode, + phy_interface_t interface) + { ++ struct mtk_pcs *mpcs = &ss->pcs[id]; + int err = 0; + + /* Setup SGMIISYS with the determined property */ + if (interface != PHY_INTERFACE_MODE_SGMII) +- err = mtk_sgmii_setup_mode_force(ss, id, interface); ++ err = mtk_pcs_setup_mode_force(mpcs, interface); + else if (phylink_autoneg_inband(mode)) +- err = mtk_sgmii_setup_mode_an(ss, id); ++ err = mtk_pcs_setup_mode_an(mpcs); + + return err; + } + +-/* For 1000BASE-X and 2500BASE-X interface modes */ +-void mtk_sgmii_link_up(struct mtk_sgmii *ss, int id, int speed, int duplex) ++static void mtk_pcs_restart_an(struct mtk_pcs *mpcs) ++{ ++ unsigned int val; ++ ++ if (!mpcs->regmap) ++ return; ++ ++ regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &val); ++ val |= SGMII_AN_RESTART; ++ regmap_write(mpcs->regmap, SGMSYS_PCS_CONTROL_1, val); ++} ++ ++static void mtk_pcs_link_up(struct mtk_pcs *mpcs, int speed, int duplex) + { + unsigned int val; + + /* SGMII force duplex setting */ +- regmap_read(ss->regmap[id], SGMSYS_SGMII_MODE, &val); ++ regmap_read(mpcs->regmap, SGMSYS_SGMII_MODE, &val); + val &= ~SGMII_DUPLEX_FULL; + if (duplex == DUPLEX_FULL) + val |= SGMII_DUPLEX_FULL; + +- regmap_write(ss->regmap[id], SGMSYS_SGMII_MODE, val); ++ regmap_write(mpcs->regmap, SGMSYS_SGMII_MODE, val); ++} ++ ++/* For 1000BASE-X and 2500BASE-X interface modes */ ++void mtk_sgmii_link_up(struct mtk_sgmii *ss, int id, int speed, int duplex) ++{ ++ mtk_pcs_link_up(&ss->pcs[id], speed, duplex); ++} ++ ++int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *r, u32 ana_rgc3) ++{ ++ struct device_node *np; ++ int i; ++ ++ for (i = 0; i < MTK_MAX_DEVS; i++) { ++ np = of_parse_phandle(r, "mediatek,sgmiisys", i); ++ if (!np) ++ break; ++ ++ ss->pcs[i].ana_rgc3 = ana_rgc3; ++ ss->pcs[i].regmap = syscon_node_to_regmap(np); ++ of_node_put(np); ++ if (IS_ERR(ss->pcs[i].regmap)) ++ return PTR_ERR(ss->pcs[i].regmap); ++ } ++ ++ return 0; + } + + void mtk_sgmii_restart_an(struct mtk_eth *eth, int mac_id) + { +- struct mtk_sgmii *ss = eth->sgmii; +- unsigned int val, sid; ++ unsigned int sid; + + /* Decide how GMAC and SGMIISYS be mapped */ + sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ? + 0 : mac_id; + +- if (!ss->regmap[sid]) +- return; +- +- regmap_read(ss->regmap[sid], SGMSYS_PCS_CONTROL_1, &val); +- val |= SGMII_AN_RESTART; +- regmap_write(ss->regmap[sid], SGMSYS_PCS_CONTROL_1, val); ++ mtk_pcs_restart_an(ð->sgmii->pcs[sid]); + } diff --git a/target/linux/generic/backport-5.15/704-18-v5.19-net-mtk_eth_soc-partially-convert-to-phylink_pcs.patch b/target/linux/generic/backport-5.15/704-18-v5.19-net-mtk_eth_soc-partially-convert-to-phylink_pcs.patch new file mode 100644 index 0000000000..b585867935 --- /dev/null +++ b/target/linux/generic/backport-5.15/704-18-v5.19-net-mtk_eth_soc-partially-convert-to-phylink_pcs.patch @@ -0,0 +1,262 @@ +From 14a44ab0330d290fade1403a920e299cc56d7300 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 18 May 2022 15:55:28 +0100 +Subject: [PATCH 12/12] net: mtk_eth_soc: partially convert to phylink_pcs + +Partially convert mtk_eth_soc to phylink_pcs, moving the configuration, +link up and AN restart over. However, it seems mac_pcs_get_state() +doesn't actually get the state from the PCS, so we can't convert that +over without a better understanding of the hardware. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 49 ++++++++---------- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 7 ++- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 55 +++++++++++---------- + 3 files changed, 53 insertions(+), 58 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -310,6 +310,25 @@ static void mtk_gmac0_rgmii_adjust(struc + mtk_w32(eth, val, TRGMII_TCK_CTRL); + } + ++static struct phylink_pcs *mtk_mac_select_pcs(struct phylink_config *config, ++ phy_interface_t interface) ++{ ++ struct mtk_mac *mac = container_of(config, struct mtk_mac, ++ phylink_config); ++ struct mtk_eth *eth = mac->hw; ++ unsigned int sid; ++ ++ if (interface == PHY_INTERFACE_MODE_SGMII || ++ phy_interface_mode_is_8023z(interface)) { ++ sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ? ++ 0 : mac->id; ++ ++ return mtk_sgmii_select_pcs(eth->sgmii, sid); ++ } ++ ++ return NULL; ++} ++ + static void mtk_mac_config(struct phylink_config *config, unsigned int mode, + const struct phylink_link_state *state) + { +@@ -317,7 +336,7 @@ static void mtk_mac_config(struct phylin + phylink_config); + struct mtk_eth *eth = mac->hw; + int val, ge_mode, err = 0; +- u32 sid, i; ++ u32 i; + + /* MT76x8 has no hardware settings between for the MAC */ + if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) && +@@ -438,15 +457,6 @@ static void mtk_mac_config(struct phylin + SYSCFG0_SGMII_MASK, + ~(u32)SYSCFG0_SGMII_MASK); + +- /* Decide how GMAC and SGMIISYS be mapped */ +- sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ? +- 0 : mac->id; +- +- /* Setup SGMIISYS with the determined property */ +- err = mtk_sgmii_config(eth->sgmii, sid, mode, state->interface); +- if (err) +- goto init_err; +- + /* Save the syscfg0 value for mac_finish */ + mac->syscfg0 = val; + } else if (phylink_autoneg_inband(mode)) { +@@ -527,14 +537,6 @@ static void mtk_mac_pcs_get_state(struct + state->pause |= MLO_PAUSE_TX; + } + +-static void mtk_mac_an_restart(struct phylink_config *config) +-{ +- struct mtk_mac *mac = container_of(config, struct mtk_mac, +- phylink_config); +- +- mtk_sgmii_restart_an(mac->hw, mac->id); +-} +- + static void mtk_mac_link_down(struct phylink_config *config, unsigned int mode, + phy_interface_t interface) + { +@@ -555,15 +557,6 @@ static void mtk_mac_link_up(struct phyli + phylink_config); + u32 mcr; + +- if (phy_interface_mode_is_8023z(interface)) { +- struct mtk_eth *eth = mac->hw; +- +- /* Decide how GMAC and SGMIISYS be mapped */ +- int sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ? +- 0 : mac->id; +- mtk_sgmii_link_up(eth->sgmii, sid, speed, duplex); +- } +- + mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); + mcr &= ~(MAC_MCR_SPEED_100 | MAC_MCR_SPEED_1000 | + MAC_MCR_FORCE_DPX | MAC_MCR_FORCE_TX_FC | +@@ -596,8 +589,8 @@ static void mtk_mac_link_up(struct phyli + + static const struct phylink_mac_ops mtk_phylink_ops = { + .validate = phylink_generic_validate, ++ .mac_select_pcs = mtk_mac_select_pcs, + .mac_pcs_get_state = mtk_mac_pcs_get_state, +- .mac_an_restart = mtk_mac_an_restart, + .mac_config = mtk_mac_config, + .mac_finish = mtk_mac_finish, + .mac_link_down = mtk_mac_link_down, +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -964,10 +964,12 @@ struct mtk_soc_data { + * @regmap: The register map pointing at the range used to setup + * SGMII modes + * @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap ++ * @pcs: Phylink PCS structure + */ + struct mtk_pcs { + struct regmap *regmap; + u32 ana_rgc3; ++ struct phylink_pcs pcs; + }; + + /* struct mtk_sgmii - This is the structure holding sgmii regmap and its +@@ -1107,12 +1109,9 @@ void mtk_stats_update_mac(struct mtk_mac + void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg); + u32 mtk_r32(struct mtk_eth *eth, unsigned reg); + ++struct phylink_pcs *mtk_sgmii_select_pcs(struct mtk_sgmii *ss, int id); + int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *np, + u32 ana_rgc3); +-int mtk_sgmii_config(struct mtk_sgmii *ss, int id, unsigned int mode, +- phy_interface_t interface); +-void mtk_sgmii_link_up(struct mtk_sgmii *ss, int id, int speed, int duplex); +-void mtk_sgmii_restart_an(struct mtk_eth *eth, int mac_id); + + int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id); + int mtk_gmac_gephy_path_setup(struct mtk_eth *eth, int mac_id); +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -14,14 +14,16 @@ + + #include "mtk_eth_soc.h" + ++static struct mtk_pcs *pcs_to_mtk_pcs(struct phylink_pcs *pcs) ++{ ++ return container_of(pcs, struct mtk_pcs, pcs); ++} ++ + /* For SGMII interface mode */ + static int mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs) + { + unsigned int val; + +- if (!mpcs->regmap) +- return -EINVAL; +- + /* Setup the link timer and QPHY power up inside SGMIISYS */ + regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER, + SGMII_LINK_TIMER_DEFAULT); +@@ -50,9 +52,6 @@ static int mtk_pcs_setup_mode_force(stru + { + unsigned int val; + +- if (!mpcs->regmap) +- return -EINVAL; +- + regmap_read(mpcs->regmap, mpcs->ana_rgc3, &val); + val &= ~RG_PHY_SPEED_MASK; + if (interface == PHY_INTERFACE_MODE_2500BASEX) +@@ -78,10 +77,12 @@ static int mtk_pcs_setup_mode_force(stru + return 0; + } + +-int mtk_sgmii_config(struct mtk_sgmii *ss, int id, unsigned int mode, +- phy_interface_t interface) ++static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode, ++ phy_interface_t interface, ++ const unsigned long *advertising, ++ bool permit_pause_to_mac) + { +- struct mtk_pcs *mpcs = &ss->pcs[id]; ++ struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); + int err = 0; + + /* Setup SGMIISYS with the determined property */ +@@ -93,22 +94,25 @@ int mtk_sgmii_config(struct mtk_sgmii *s + return err; + } + +-static void mtk_pcs_restart_an(struct mtk_pcs *mpcs) ++static void mtk_pcs_restart_an(struct phylink_pcs *pcs) + { ++ struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); + unsigned int val; + +- if (!mpcs->regmap) +- return; +- + regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &val); + val |= SGMII_AN_RESTART; + regmap_write(mpcs->regmap, SGMSYS_PCS_CONTROL_1, val); + } + +-static void mtk_pcs_link_up(struct mtk_pcs *mpcs, int speed, int duplex) ++static void mtk_pcs_link_up(struct phylink_pcs *pcs, unsigned int mode, ++ phy_interface_t interface, int speed, int duplex) + { ++ struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); + unsigned int val; + ++ if (!phy_interface_mode_is_8023z(interface)) ++ return; ++ + /* SGMII force duplex setting */ + regmap_read(mpcs->regmap, SGMSYS_SGMII_MODE, &val); + val &= ~SGMII_DUPLEX_FULL; +@@ -118,11 +122,11 @@ static void mtk_pcs_link_up(struct mtk_p + regmap_write(mpcs->regmap, SGMSYS_SGMII_MODE, val); + } + +-/* For 1000BASE-X and 2500BASE-X interface modes */ +-void mtk_sgmii_link_up(struct mtk_sgmii *ss, int id, int speed, int duplex) +-{ +- mtk_pcs_link_up(&ss->pcs[id], speed, duplex); +-} ++static const struct phylink_pcs_ops mtk_pcs_ops = { ++ .pcs_config = mtk_pcs_config, ++ .pcs_an_restart = mtk_pcs_restart_an, ++ .pcs_link_up = mtk_pcs_link_up, ++}; + + int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *r, u32 ana_rgc3) + { +@@ -139,18 +143,17 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, + of_node_put(np); + if (IS_ERR(ss->pcs[i].regmap)) + return PTR_ERR(ss->pcs[i].regmap); ++ ++ ss->pcs[i].pcs.ops = &mtk_pcs_ops; + } + + return 0; + } + +-void mtk_sgmii_restart_an(struct mtk_eth *eth, int mac_id) ++struct phylink_pcs *mtk_sgmii_select_pcs(struct mtk_sgmii *ss, int id) + { +- unsigned int sid; +- +- /* Decide how GMAC and SGMIISYS be mapped */ +- sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ? +- 0 : mac_id; ++ if (!ss->pcs[id].regmap) ++ return NULL; + +- mtk_pcs_restart_an(ð->sgmii->pcs[sid]); ++ return &ss->pcs[id].pcs; + } diff --git a/target/linux/generic/backport-5.15/705-01-v5.17-net-dsa-mt7530-iterate-using-dsa_switch_for_each_use.patch b/target/linux/generic/backport-5.15/705-01-v5.17-net-dsa-mt7530-iterate-using-dsa_switch_for_each_use.patch new file mode 100644 index 0000000000..d54819120e --- /dev/null +++ b/target/linux/generic/backport-5.15/705-01-v5.17-net-dsa-mt7530-iterate-using-dsa_switch_for_each_use.patch @@ -0,0 +1,106 @@ +From 505560028b6deb9b4385cf6100f05ca6f4aacaf8 Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Mon, 6 Dec 2021 18:57:49 +0200 +Subject: [PATCH 01/13] net: dsa: mt7530: iterate using + dsa_switch_for_each_user_port in bridging ops + +Avoid repeated calls to dsa_to_port() (some hidden behind dsa_is_user_port +and some in plain sight) by keeping two struct dsa_port references: one +to the port passed as argument, and another to the other ports of the +switch that we're iterating over. + +dsa_to_port(ds, i) gets replaced by other_dp, i gets replaced by +other_port which is derived from other_dp->index, dsa_is_user_port is +handled by the DSA iterator. + +Signed-off-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/mt7530.c | 52 +++++++++++++++++++++++----------------- + 1 file changed, 30 insertions(+), 22 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -1198,27 +1198,31 @@ static int + mt7530_port_bridge_join(struct dsa_switch *ds, int port, + struct net_device *bridge) + { +- struct mt7530_priv *priv = ds->priv; ++ struct dsa_port *dp = dsa_to_port(ds, port), *other_dp; + u32 port_bitmap = BIT(MT7530_CPU_PORT); +- int i; ++ struct mt7530_priv *priv = ds->priv; + + mutex_lock(&priv->reg_mutex); + +- for (i = 0; i < MT7530_NUM_PORTS; i++) { ++ dsa_switch_for_each_user_port(other_dp, ds) { ++ int other_port = other_dp->index; ++ ++ if (dp == other_dp) ++ continue; ++ + /* Add this port to the port matrix of the other ports in the + * same bridge. If the port is disabled, port matrix is kept + * and not being setup until the port becomes enabled. + */ +- if (dsa_is_user_port(ds, i) && i != port) { +- if (dsa_to_port(ds, i)->bridge_dev != bridge) +- continue; +- if (priv->ports[i].enable) +- mt7530_set(priv, MT7530_PCR_P(i), +- PCR_MATRIX(BIT(port))); +- priv->ports[i].pm |= PCR_MATRIX(BIT(port)); ++ if (other_dp->bridge_dev != bridge) ++ continue; + +- port_bitmap |= BIT(i); +- } ++ if (priv->ports[other_port].enable) ++ mt7530_set(priv, MT7530_PCR_P(other_port), ++ PCR_MATRIX(BIT(port))); ++ priv->ports[other_port].pm |= PCR_MATRIX(BIT(port)); ++ ++ port_bitmap |= BIT(other_port); + } + + /* Add the all other ports to this port matrix. */ +@@ -1323,24 +1327,28 @@ static void + mt7530_port_bridge_leave(struct dsa_switch *ds, int port, + struct net_device *bridge) + { ++ struct dsa_port *dp = dsa_to_port(ds, port), *other_dp; + struct mt7530_priv *priv = ds->priv; +- int i; + + mutex_lock(&priv->reg_mutex); + +- for (i = 0; i < MT7530_NUM_PORTS; i++) { ++ dsa_switch_for_each_user_port(other_dp, ds) { ++ int other_port = other_dp->index; ++ ++ if (dp == other_dp) ++ continue; ++ + /* Remove this port from the port matrix of the other ports + * in the same bridge. If the port is disabled, port matrix + * is kept and not being setup until the port becomes enabled. + */ +- if (dsa_is_user_port(ds, i) && i != port) { +- if (dsa_to_port(ds, i)->bridge_dev != bridge) +- continue; +- if (priv->ports[i].enable) +- mt7530_clear(priv, MT7530_PCR_P(i), +- PCR_MATRIX(BIT(port))); +- priv->ports[i].pm &= ~PCR_MATRIX(BIT(port)); +- } ++ if (other_dp->bridge_dev != bridge) ++ continue; ++ ++ if (priv->ports[other_port].enable) ++ mt7530_clear(priv, MT7530_PCR_P(other_port), ++ PCR_MATRIX(BIT(port))); ++ priv->ports[other_port].pm &= ~PCR_MATRIX(BIT(port)); + } + + /* Set the cpu port to be the only one in the port matrix of diff --git a/target/linux/generic/backport-5.15/705-02-v5.19-net-dsa-mt7530-populate-supported_interfaces-and-mac.patch b/target/linux/generic/backport-5.15/705-02-v5.19-net-dsa-mt7530-populate-supported_interfaces-and-mac.patch new file mode 100644 index 0000000000..391934a30a --- /dev/null +++ b/target/linux/generic/backport-5.15/705-02-v5.19-net-dsa-mt7530-populate-supported_interfaces-and-mac.patch @@ -0,0 +1,166 @@ +From a1da54bcd664fc27169386db966575675ac3ccb0 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 11 Apr 2022 10:46:01 +0100 +Subject: [PATCH 02/13] net: dsa: mt7530: populate supported_interfaces and + mac_capabilities +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Populate the supported interfaces and MAC capabilities for mt7530, +mt7531 and mt7621 DSA switches. Filling this in will enable phylink +to pre-check the PHY interface mode against the the supported +interfaces bitmap prior to calling the validate function, and will +eventually allow us to convert to using the generic validation. + +Tested-by: Marek Behún +Signed-off-by: Russell King (Oracle) +Signed-off-by: Paolo Abeni +--- + drivers/net/dsa/mt7530.c | 74 ++++++++++++++++++++++++++++++++++++++++ + drivers/net/dsa/mt7530.h | 2 ++ + 2 files changed, 76 insertions(+) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2454,6 +2454,32 @@ mt7531_setup(struct dsa_switch *ds) + return 0; + } + ++static void mt7530_mac_port_get_caps(struct dsa_switch *ds, int port, ++ struct phylink_config *config) ++{ ++ switch (port) { ++ case 0 ... 4: /* Internal phy */ ++ __set_bit(PHY_INTERFACE_MODE_GMII, ++ config->supported_interfaces); ++ break; ++ ++ case 5: /* 2nd cpu port with phy of port 0 or 4 / external phy */ ++ phy_interface_set_rgmii(config->supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_MII, ++ config->supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_GMII, ++ config->supported_interfaces); ++ break; ++ ++ case 6: /* 1st cpu port */ ++ __set_bit(PHY_INTERFACE_MODE_RGMII, ++ config->supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_TRGMII, ++ config->supported_interfaces); ++ break; ++ } ++} ++ + static bool + mt7530_phy_mode_supported(struct dsa_switch *ds, int port, + const struct phylink_link_state *state) +@@ -2490,6 +2516,37 @@ static bool mt7531_is_rgmii_port(struct + return (port == 5) && (priv->p5_intf_sel != P5_INTF_SEL_GMAC5_SGMII); + } + ++static void mt7531_mac_port_get_caps(struct dsa_switch *ds, int port, ++ struct phylink_config *config) ++{ ++ struct mt7530_priv *priv = ds->priv; ++ ++ switch (port) { ++ case 0 ... 4: /* Internal phy */ ++ __set_bit(PHY_INTERFACE_MODE_GMII, ++ config->supported_interfaces); ++ break; ++ ++ case 5: /* 2nd cpu port supports either rgmii or sgmii/8023z */ ++ if (mt7531_is_rgmii_port(priv, port)) { ++ phy_interface_set_rgmii(config->supported_interfaces); ++ break; ++ } ++ fallthrough; ++ ++ case 6: /* 1st cpu port supports sgmii/8023z only */ ++ __set_bit(PHY_INTERFACE_MODE_SGMII, ++ config->supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_1000BASEX, ++ config->supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_2500BASEX, ++ config->supported_interfaces); ++ ++ config->mac_capabilities |= MAC_2500FD; ++ break; ++ } ++} ++ + static bool + mt7531_phy_mode_supported(struct dsa_switch *ds, int port, + const struct phylink_link_state *state) +@@ -2966,6 +3023,18 @@ mt7531_cpu_port_config(struct dsa_switch + return 0; + } + ++static void mt753x_phylink_get_caps(struct dsa_switch *ds, int port, ++ struct phylink_config *config) ++{ ++ struct mt7530_priv *priv = ds->priv; ++ ++ /* This switch only supports full-duplex at 1Gbps */ ++ config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | ++ MAC_10 | MAC_100 | MAC_1000FD; ++ ++ priv->info->mac_port_get_caps(ds, port, config); ++} ++ + static void + mt7530_mac_port_validate(struct dsa_switch *ds, int port, + unsigned long *supported) +@@ -3201,6 +3270,7 @@ static const struct dsa_switch_ops mt753 + .port_vlan_del = mt7530_port_vlan_del, + .port_mirror_add = mt753x_port_mirror_add, + .port_mirror_del = mt753x_port_mirror_del, ++ .phylink_get_caps = mt753x_phylink_get_caps, + .phylink_validate = mt753x_phylink_validate, + .phylink_mac_link_state = mt753x_phylink_mac_link_state, + .phylink_mac_config = mt753x_phylink_mac_config, +@@ -3218,6 +3288,7 @@ static const struct mt753x_info mt753x_t + .phy_read = mt7530_phy_read, + .phy_write = mt7530_phy_write, + .pad_setup = mt7530_pad_clk_setup, ++ .mac_port_get_caps = mt7530_mac_port_get_caps, + .phy_mode_supported = mt7530_phy_mode_supported, + .mac_port_validate = mt7530_mac_port_validate, + .mac_port_get_state = mt7530_phylink_mac_link_state, +@@ -3229,6 +3300,7 @@ static const struct mt753x_info mt753x_t + .phy_read = mt7530_phy_read, + .phy_write = mt7530_phy_write, + .pad_setup = mt7530_pad_clk_setup, ++ .mac_port_get_caps = mt7530_mac_port_get_caps, + .phy_mode_supported = mt7530_phy_mode_supported, + .mac_port_validate = mt7530_mac_port_validate, + .mac_port_get_state = mt7530_phylink_mac_link_state, +@@ -3241,6 +3313,7 @@ static const struct mt753x_info mt753x_t + .phy_write = mt7531_ind_phy_write, + .pad_setup = mt7531_pad_setup, + .cpu_port_config = mt7531_cpu_port_config, ++ .mac_port_get_caps = mt7531_mac_port_get_caps, + .phy_mode_supported = mt7531_phy_mode_supported, + .mac_port_validate = mt7531_mac_port_validate, + .mac_port_get_state = mt7531_phylink_mac_link_state, +@@ -3303,6 +3376,7 @@ mt7530_probe(struct mdio_device *mdiodev + */ + if (!priv->info->sw_setup || !priv->info->pad_setup || + !priv->info->phy_read || !priv->info->phy_write || ++ !priv->info->mac_port_get_caps || + !priv->info->phy_mode_supported || + !priv->info->mac_port_validate || + !priv->info->mac_port_get_state || !priv->info->mac_port_config) +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -769,6 +769,8 @@ struct mt753x_info { + int (*phy_write)(struct mt7530_priv *priv, int port, int regnum, u16 val); + int (*pad_setup)(struct dsa_switch *ds, phy_interface_t interface); + int (*cpu_port_config)(struct dsa_switch *ds, int port); ++ void (*mac_port_get_caps)(struct dsa_switch *ds, int port, ++ struct phylink_config *config); + bool (*phy_mode_supported)(struct dsa_switch *ds, int port, + const struct phylink_link_state *state); + void (*mac_port_validate)(struct dsa_switch *ds, int port, diff --git a/target/linux/generic/backport-5.15/705-03-v5.19-net-dsa-mt7530-remove-interface-checks.patch b/target/linux/generic/backport-5.15/705-03-v5.19-net-dsa-mt7530-remove-interface-checks.patch new file mode 100644 index 0000000000..ac19163310 --- /dev/null +++ b/target/linux/generic/backport-5.15/705-03-v5.19-net-dsa-mt7530-remove-interface-checks.patch @@ -0,0 +1,172 @@ +From e3f6719e2269868ca129b05da50cd55786848954 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 11 Apr 2022 10:46:06 +0100 +Subject: [PATCH 03/13] net: dsa: mt7530: remove interface checks +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +As phylink checks the interface mode against the supported_interfaces +bitmap, we no longer need to validate the interface mode, nor handle +PHY_INTERFACE_MODE_NA in the validation function. Remove these to +simplify the implementation. + +Tested-by: Marek Behún +Signed-off-by: Russell King (Oracle) +Signed-off-by: Paolo Abeni +--- + drivers/net/dsa/mt7530.c | 82 ---------------------------------------- + drivers/net/dsa/mt7530.h | 2 - + 2 files changed, 84 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2480,37 +2480,6 @@ static void mt7530_mac_port_get_caps(str + } + } + +-static bool +-mt7530_phy_mode_supported(struct dsa_switch *ds, int port, +- const struct phylink_link_state *state) +-{ +- struct mt7530_priv *priv = ds->priv; +- +- switch (port) { +- case 0 ... 4: /* Internal phy */ +- if (state->interface != PHY_INTERFACE_MODE_GMII) +- return false; +- break; +- case 5: /* 2nd cpu port with phy of port 0 or 4 / external phy */ +- if (!phy_interface_mode_is_rgmii(state->interface) && +- state->interface != PHY_INTERFACE_MODE_MII && +- state->interface != PHY_INTERFACE_MODE_GMII) +- return false; +- break; +- case 6: /* 1st cpu port */ +- if (state->interface != PHY_INTERFACE_MODE_RGMII && +- state->interface != PHY_INTERFACE_MODE_TRGMII) +- return false; +- break; +- default: +- dev_err(priv->dev, "%s: unsupported port: %i\n", __func__, +- port); +- return false; +- } +- +- return true; +-} +- + static bool mt7531_is_rgmii_port(struct mt7530_priv *priv, u32 port) + { + return (port == 5) && (priv->p5_intf_sel != P5_INTF_SEL_GMAC5_SGMII); +@@ -2547,44 +2516,6 @@ static void mt7531_mac_port_get_caps(str + } + } + +-static bool +-mt7531_phy_mode_supported(struct dsa_switch *ds, int port, +- const struct phylink_link_state *state) +-{ +- struct mt7530_priv *priv = ds->priv; +- +- switch (port) { +- case 0 ... 4: /* Internal phy */ +- if (state->interface != PHY_INTERFACE_MODE_GMII) +- return false; +- break; +- case 5: /* 2nd cpu port supports either rgmii or sgmii/8023z */ +- if (mt7531_is_rgmii_port(priv, port)) +- return phy_interface_mode_is_rgmii(state->interface); +- fallthrough; +- case 6: /* 1st cpu port supports sgmii/8023z only */ +- if (state->interface != PHY_INTERFACE_MODE_SGMII && +- !phy_interface_mode_is_8023z(state->interface)) +- return false; +- break; +- default: +- dev_err(priv->dev, "%s: unsupported port: %i\n", __func__, +- port); +- return false; +- } +- +- return true; +-} +- +-static bool +-mt753x_phy_mode_supported(struct dsa_switch *ds, int port, +- const struct phylink_link_state *state) +-{ +- struct mt7530_priv *priv = ds->priv; +- +- return priv->info->phy_mode_supported(ds, port, state); +-} +- + static int + mt753x_pad_setup(struct dsa_switch *ds, const struct phylink_link_state *state) + { +@@ -2839,9 +2770,6 @@ mt753x_phylink_mac_config(struct dsa_swi + struct mt7530_priv *priv = ds->priv; + u32 mcr_cur, mcr_new; + +- if (!mt753x_phy_mode_supported(ds, port, state)) +- goto unsupported; +- + switch (port) { + case 0 ... 4: /* Internal phy */ + if (state->interface != PHY_INTERFACE_MODE_GMII) +@@ -3057,12 +2985,6 @@ mt753x_phylink_validate(struct dsa_switc + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; + struct mt7530_priv *priv = ds->priv; + +- if (state->interface != PHY_INTERFACE_MODE_NA && +- !mt753x_phy_mode_supported(ds, port, state)) { +- linkmode_zero(supported); +- return; +- } +- + phylink_set_port_modes(mask); + + if (state->interface != PHY_INTERFACE_MODE_TRGMII && +@@ -3289,7 +3211,6 @@ static const struct mt753x_info mt753x_t + .phy_write = mt7530_phy_write, + .pad_setup = mt7530_pad_clk_setup, + .mac_port_get_caps = mt7530_mac_port_get_caps, +- .phy_mode_supported = mt7530_phy_mode_supported, + .mac_port_validate = mt7530_mac_port_validate, + .mac_port_get_state = mt7530_phylink_mac_link_state, + .mac_port_config = mt7530_mac_config, +@@ -3301,7 +3222,6 @@ static const struct mt753x_info mt753x_t + .phy_write = mt7530_phy_write, + .pad_setup = mt7530_pad_clk_setup, + .mac_port_get_caps = mt7530_mac_port_get_caps, +- .phy_mode_supported = mt7530_phy_mode_supported, + .mac_port_validate = mt7530_mac_port_validate, + .mac_port_get_state = mt7530_phylink_mac_link_state, + .mac_port_config = mt7530_mac_config, +@@ -3314,7 +3234,6 @@ static const struct mt753x_info mt753x_t + .pad_setup = mt7531_pad_setup, + .cpu_port_config = mt7531_cpu_port_config, + .mac_port_get_caps = mt7531_mac_port_get_caps, +- .phy_mode_supported = mt7531_phy_mode_supported, + .mac_port_validate = mt7531_mac_port_validate, + .mac_port_get_state = mt7531_phylink_mac_link_state, + .mac_port_config = mt7531_mac_config, +@@ -3377,7 +3296,6 @@ mt7530_probe(struct mdio_device *mdiodev + if (!priv->info->sw_setup || !priv->info->pad_setup || + !priv->info->phy_read || !priv->info->phy_write || + !priv->info->mac_port_get_caps || +- !priv->info->phy_mode_supported || + !priv->info->mac_port_validate || + !priv->info->mac_port_get_state || !priv->info->mac_port_config) + return -EINVAL; +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -771,8 +771,6 @@ struct mt753x_info { + int (*cpu_port_config)(struct dsa_switch *ds, int port); + void (*mac_port_get_caps)(struct dsa_switch *ds, int port, + struct phylink_config *config); +- bool (*phy_mode_supported)(struct dsa_switch *ds, int port, +- const struct phylink_link_state *state); + void (*mac_port_validate)(struct dsa_switch *ds, int port, + unsigned long *supported); + int (*mac_port_get_state)(struct dsa_switch *ds, int port, diff --git a/target/linux/generic/backport-5.15/705-04-v5.19-net-dsa-mt7530-drop-use-of-phylink_helper_basex_spee.patch b/target/linux/generic/backport-5.15/705-04-v5.19-net-dsa-mt7530-drop-use-of-phylink_helper_basex_spee.patch new file mode 100644 index 0000000000..63f6e9b954 --- /dev/null +++ b/target/linux/generic/backport-5.15/705-04-v5.19-net-dsa-mt7530-drop-use-of-phylink_helper_basex_spee.patch @@ -0,0 +1,34 @@ +From 58344a3b85f1bd5ffddfc2c11f6f2bf688b5f990 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 11 Apr 2022 10:46:12 +0100 +Subject: [PATCH 04/13] net: dsa: mt7530: drop use of + phylink_helper_basex_speed() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Now that we have a better method to select SFP interface modes, we +no longer need to use phylink_helper_basex_speed() in a driver's +validation function. + +Tested-by: Marek Behún +Signed-off-by: Russell King (Oracle) +Signed-off-by: Paolo Abeni +--- + drivers/net/dsa/mt7530.c | 5 ----- + 1 file changed, 5 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -3009,11 +3009,6 @@ mt753x_phylink_validate(struct dsa_switc + + linkmode_and(supported, supported, mask); + linkmode_and(state->advertising, state->advertising, mask); +- +- /* We can only operate at 2500BaseX or 1000BaseX. If requested +- * to advertise both, only report advertising at 2500BaseX. +- */ +- phylink_helper_basex_speed(state); + } + + static int diff --git a/target/linux/generic/backport-5.15/705-05-v5.19-net-dsa-mt7530-only-indicate-linkmodes-that-can-be-s.patch b/target/linux/generic/backport-5.15/705-05-v5.19-net-dsa-mt7530-only-indicate-linkmodes-that-can-be-s.patch new file mode 100644 index 0000000000..5a3098ade3 --- /dev/null +++ b/target/linux/generic/backport-5.15/705-05-v5.19-net-dsa-mt7530-only-indicate-linkmodes-that-can-be-s.patch @@ -0,0 +1,86 @@ +From 3c1d788a62dc648d1846049b66119ebb69dedd52 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 11 Apr 2022 10:46:17 +0100 +Subject: [PATCH 05/13] net: dsa: mt7530: only indicate linkmodes that can be + supported +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Now that mt7530 is not using the basex helper, it becomes unnecessary to +indicate support for both 1000baseX and 2500baseX when one of the 803.3z +PHY interface modes is being selected. Ensure that the driver indicates +only those linkmodes that can actually be supported by the PHY interface +mode. + +Tested-by: Marek Behún +Signed-off-by: Russell King (Oracle) +Signed-off-by: Paolo Abeni +--- + drivers/net/dsa/mt7530.c | 12 ++++++++---- + drivers/net/dsa/mt7530.h | 1 + + 2 files changed, 9 insertions(+), 4 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2587,12 +2587,13 @@ static int mt7531_rgmii_setup(struct mt7 + } + + static void mt7531_sgmii_validate(struct mt7530_priv *priv, int port, ++ phy_interface_t interface, + unsigned long *supported) + { + /* Port5 supports ethier RGMII or SGMII. + * Port6 supports SGMII only. + */ +- if (port == 6) { ++ if (port == 6 && interface == PHY_INTERFACE_MODE_2500BASEX) { + phylink_set(supported, 2500baseX_Full); + phylink_set(supported, 2500baseT_Full); + } +@@ -2965,16 +2966,18 @@ static void mt753x_phylink_get_caps(stru + + static void + mt7530_mac_port_validate(struct dsa_switch *ds, int port, ++ phy_interface_t interface, + unsigned long *supported) + { + } + + static void mt7531_mac_port_validate(struct dsa_switch *ds, int port, ++ phy_interface_t interface, + unsigned long *supported) + { + struct mt7530_priv *priv = ds->priv; + +- mt7531_sgmii_validate(priv, port, supported); ++ mt7531_sgmii_validate(priv, port, interface, supported); + } + + static void +@@ -2997,12 +3000,13 @@ mt753x_phylink_validate(struct dsa_switc + } + + /* This switch only supports 1G full-duplex. */ +- if (state->interface != PHY_INTERFACE_MODE_MII) { ++ if (state->interface != PHY_INTERFACE_MODE_MII && ++ state->interface != PHY_INTERFACE_MODE_2500BASEX) { + phylink_set(mask, 1000baseT_Full); + phylink_set(mask, 1000baseX_Full); + } + +- priv->info->mac_port_validate(ds, port, mask); ++ priv->info->mac_port_validate(ds, port, state->interface, mask); + + phylink_set(mask, Pause); + phylink_set(mask, Asym_Pause); +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -772,6 +772,7 @@ struct mt753x_info { + void (*mac_port_get_caps)(struct dsa_switch *ds, int port, + struct phylink_config *config); + void (*mac_port_validate)(struct dsa_switch *ds, int port, ++ phy_interface_t interface, + unsigned long *supported); + int (*mac_port_get_state)(struct dsa_switch *ds, int port, + struct phylink_link_state *state); diff --git a/target/linux/generic/backport-5.15/705-06-v5.19-net-dsa-mt7530-switch-to-use-phylink_get_linkmodes.patch b/target/linux/generic/backport-5.15/705-06-v5.19-net-dsa-mt7530-switch-to-use-phylink_get_linkmodes.patch new file mode 100644 index 0000000000..c779cb141e --- /dev/null +++ b/target/linux/generic/backport-5.15/705-06-v5.19-net-dsa-mt7530-switch-to-use-phylink_get_linkmodes.patch @@ -0,0 +1,131 @@ +From 1c2211cb15dd3957fb26c0e1615eceb5db851ad6 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 11 Apr 2022 10:46:22 +0100 +Subject: [PATCH 06/13] net: dsa: mt7530: switch to use phylink_get_linkmodes() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Switch mt7530 to use phylink_get_linkmodes() to generate the ethtool +linkmodes that can be supported. We are unable to use the generic +helper for this as pause modes are dependent on the interface as +the Autoneg bit depends on the interface mode. + +Tested-by: Marek Behún +Signed-off-by: Russell King (Oracle) +Signed-off-by: Paolo Abeni +--- + drivers/net/dsa/mt7530.c | 57 ++++------------------------------------ + 1 file changed, 5 insertions(+), 52 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2586,19 +2586,6 @@ static int mt7531_rgmii_setup(struct mt7 + return 0; + } + +-static void mt7531_sgmii_validate(struct mt7530_priv *priv, int port, +- phy_interface_t interface, +- unsigned long *supported) +-{ +- /* Port5 supports ethier RGMII or SGMII. +- * Port6 supports SGMII only. +- */ +- if (port == 6 && interface == PHY_INTERFACE_MODE_2500BASEX) { +- phylink_set(supported, 2500baseX_Full); +- phylink_set(supported, 2500baseT_Full); +- } +-} +- + static void + mt7531_sgmii_link_up_force(struct dsa_switch *ds, int port, + unsigned int mode, phy_interface_t interface, +@@ -2965,51 +2952,21 @@ static void mt753x_phylink_get_caps(stru + } + + static void +-mt7530_mac_port_validate(struct dsa_switch *ds, int port, +- phy_interface_t interface, +- unsigned long *supported) +-{ +-} +- +-static void mt7531_mac_port_validate(struct dsa_switch *ds, int port, +- phy_interface_t interface, +- unsigned long *supported) +-{ +- struct mt7530_priv *priv = ds->priv; +- +- mt7531_sgmii_validate(priv, port, interface, supported); +-} +- +-static void + mt753x_phylink_validate(struct dsa_switch *ds, int port, + unsigned long *supported, + struct phylink_link_state *state) + { + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; +- struct mt7530_priv *priv = ds->priv; ++ u32 caps; ++ ++ caps = dsa_to_port(ds, port)->pl_config.mac_capabilities; + + phylink_set_port_modes(mask); ++ phylink_get_linkmodes(mask, state->interface, caps); + + if (state->interface != PHY_INTERFACE_MODE_TRGMII && +- !phy_interface_mode_is_8023z(state->interface)) { +- phylink_set(mask, 10baseT_Half); +- phylink_set(mask, 10baseT_Full); +- phylink_set(mask, 100baseT_Half); +- phylink_set(mask, 100baseT_Full); ++ !phy_interface_mode_is_8023z(state->interface)) + phylink_set(mask, Autoneg); +- } +- +- /* This switch only supports 1G full-duplex. */ +- if (state->interface != PHY_INTERFACE_MODE_MII && +- state->interface != PHY_INTERFACE_MODE_2500BASEX) { +- phylink_set(mask, 1000baseT_Full); +- phylink_set(mask, 1000baseX_Full); +- } +- +- priv->info->mac_port_validate(ds, port, state->interface, mask); +- +- phylink_set(mask, Pause); +- phylink_set(mask, Asym_Pause); + + linkmode_and(supported, supported, mask); + linkmode_and(state->advertising, state->advertising, mask); +@@ -3210,7 +3167,6 @@ static const struct mt753x_info mt753x_t + .phy_write = mt7530_phy_write, + .pad_setup = mt7530_pad_clk_setup, + .mac_port_get_caps = mt7530_mac_port_get_caps, +- .mac_port_validate = mt7530_mac_port_validate, + .mac_port_get_state = mt7530_phylink_mac_link_state, + .mac_port_config = mt7530_mac_config, + }, +@@ -3221,7 +3177,6 @@ static const struct mt753x_info mt753x_t + .phy_write = mt7530_phy_write, + .pad_setup = mt7530_pad_clk_setup, + .mac_port_get_caps = mt7530_mac_port_get_caps, +- .mac_port_validate = mt7530_mac_port_validate, + .mac_port_get_state = mt7530_phylink_mac_link_state, + .mac_port_config = mt7530_mac_config, + }, +@@ -3233,7 +3188,6 @@ static const struct mt753x_info mt753x_t + .pad_setup = mt7531_pad_setup, + .cpu_port_config = mt7531_cpu_port_config, + .mac_port_get_caps = mt7531_mac_port_get_caps, +- .mac_port_validate = mt7531_mac_port_validate, + .mac_port_get_state = mt7531_phylink_mac_link_state, + .mac_port_config = mt7531_mac_config, + .mac_pcs_an_restart = mt7531_sgmii_restart_an, +@@ -3295,7 +3249,6 @@ mt7530_probe(struct mdio_device *mdiodev + if (!priv->info->sw_setup || !priv->info->pad_setup || + !priv->info->phy_read || !priv->info->phy_write || + !priv->info->mac_port_get_caps || +- !priv->info->mac_port_validate || + !priv->info->mac_port_get_state || !priv->info->mac_port_config) + return -EINVAL; + diff --git a/target/linux/generic/backport-5.15/705-07-v5.19-net-dsa-mt7530-partially-convert-to-phylink_pcs.patch b/target/linux/generic/backport-5.15/705-07-v5.19-net-dsa-mt7530-partially-convert-to-phylink_pcs.patch new file mode 100644 index 0000000000..3854d0e6d5 --- /dev/null +++ b/target/linux/generic/backport-5.15/705-07-v5.19-net-dsa-mt7530-partially-convert-to-phylink_pcs.patch @@ -0,0 +1,385 @@ +From fd993fd59d96d5e2d5972ec4ca1f9651025c987b Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 11 Apr 2022 10:46:27 +0100 +Subject: [PATCH 07/13] net: dsa: mt7530: partially convert to phylink_pcs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Partially convert the mt7530 driver to use phylink's PCS support. This +is a partial implementation as we don't move anything into the +pcs_config method yet - this driver supports SGMII or 1000BASE-X +without in-band. + +Tested-by: Marek Behún +Signed-off-by: Russell King (Oracle) +Signed-off-by: Paolo Abeni +--- + drivers/net/dsa/mt7530.c | 144 +++++++++++++++++++++++---------------- + drivers/net/dsa/mt7530.h | 21 +++--- + 2 files changed, 95 insertions(+), 70 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -24,6 +24,11 @@ + + #include "mt7530.h" + ++static struct mt753x_pcs *pcs_to_mt753x_pcs(struct phylink_pcs *pcs) ++{ ++ return container_of(pcs, struct mt753x_pcs, pcs); ++} ++ + /* String, offset, and register size in bytes if different from 4 bytes */ + static const struct mt7530_mib_desc mt7530_mib[] = { + MIB_DESC(1, 0x00, "TxDrop"), +@@ -2586,12 +2591,11 @@ static int mt7531_rgmii_setup(struct mt7 + return 0; + } + +-static void +-mt7531_sgmii_link_up_force(struct dsa_switch *ds, int port, +- unsigned int mode, phy_interface_t interface, +- int speed, int duplex) ++static void mt7531_pcs_link_up(struct phylink_pcs *pcs, unsigned int mode, ++ phy_interface_t interface, int speed, int duplex) + { +- struct mt7530_priv *priv = ds->priv; ++ struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv; ++ int port = pcs_to_mt753x_pcs(pcs)->port; + unsigned int val; + + /* For adjusting speed and duplex of SGMII force mode. */ +@@ -2617,6 +2621,9 @@ mt7531_sgmii_link_up_force(struct dsa_sw + + /* MT7531 SGMII 1G force mode can only work in full duplex mode, + * no matter MT7531_SGMII_FORCE_HALF_DUPLEX is set or not. ++ * ++ * The speed check is unnecessary as the MAC capabilities apply ++ * this restriction. --rmk + */ + if ((speed == SPEED_10 || speed == SPEED_100) && + duplex != DUPLEX_FULL) +@@ -2692,9 +2699,10 @@ static int mt7531_sgmii_setup_mode_an(st + return 0; + } + +-static void mt7531_sgmii_restart_an(struct dsa_switch *ds, int port) ++static void mt7531_pcs_an_restart(struct phylink_pcs *pcs) + { +- struct mt7530_priv *priv = ds->priv; ++ struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv; ++ int port = pcs_to_mt753x_pcs(pcs)->port; + u32 val; + + /* Only restart AN when AN is enabled */ +@@ -2751,6 +2759,24 @@ mt753x_mac_config(struct dsa_switch *ds, + return priv->info->mac_port_config(ds, port, mode, state->interface); + } + ++static struct phylink_pcs * ++mt753x_phylink_mac_select_pcs(struct dsa_switch *ds, int port, ++ phy_interface_t interface) ++{ ++ struct mt7530_priv *priv = ds->priv; ++ ++ switch (interface) { ++ case PHY_INTERFACE_MODE_TRGMII: ++ case PHY_INTERFACE_MODE_SGMII: ++ case PHY_INTERFACE_MODE_1000BASEX: ++ case PHY_INTERFACE_MODE_2500BASEX: ++ return &priv->pcs[port].pcs; ++ ++ default: ++ return NULL; ++ } ++} ++ + static void + mt753x_phylink_mac_config(struct dsa_switch *ds, int port, unsigned int mode, + const struct phylink_link_state *state) +@@ -2812,17 +2838,6 @@ unsupported: + mt7530_write(priv, MT7530_PMCR_P(port), mcr_new); + } + +-static void +-mt753x_phylink_mac_an_restart(struct dsa_switch *ds, int port) +-{ +- struct mt7530_priv *priv = ds->priv; +- +- if (!priv->info->mac_pcs_an_restart) +- return; +- +- priv->info->mac_pcs_an_restart(ds, port); +-} +- + static void mt753x_phylink_mac_link_down(struct dsa_switch *ds, int port, + unsigned int mode, + phy_interface_t interface) +@@ -2832,16 +2847,13 @@ static void mt753x_phylink_mac_link_down + mt7530_clear(priv, MT7530_PMCR_P(port), PMCR_LINK_SETTINGS_MASK); + } + +-static void mt753x_mac_pcs_link_up(struct dsa_switch *ds, int port, +- unsigned int mode, phy_interface_t interface, +- int speed, int duplex) ++static void mt753x_phylink_pcs_link_up(struct phylink_pcs *pcs, ++ unsigned int mode, ++ phy_interface_t interface, ++ int speed, int duplex) + { +- struct mt7530_priv *priv = ds->priv; +- +- if (!priv->info->mac_pcs_link_up) +- return; +- +- priv->info->mac_pcs_link_up(ds, port, mode, interface, speed, duplex); ++ if (pcs->ops->pcs_link_up) ++ pcs->ops->pcs_link_up(pcs, mode, interface, speed, duplex); + } + + static void mt753x_phylink_mac_link_up(struct dsa_switch *ds, int port, +@@ -2854,8 +2866,6 @@ static void mt753x_phylink_mac_link_up(s + struct mt7530_priv *priv = ds->priv; + u32 mcr; + +- mt753x_mac_pcs_link_up(ds, port, mode, interface, speed, duplex); +- + mcr = PMCR_RX_EN | PMCR_TX_EN | PMCR_FORCE_LNK; + + /* MT753x MAC works in 1G full duplex mode for all up-clocked +@@ -2933,6 +2943,8 @@ mt7531_cpu_port_config(struct dsa_switch + return ret; + mt7530_write(priv, MT7530_PMCR_P(port), + PMCR_CPU_PORT_SETTING(priv->id)); ++ mt753x_phylink_pcs_link_up(&priv->pcs[port].pcs, MLO_AN_FIXED, ++ interface, speed, DUPLEX_FULL); + mt753x_phylink_mac_link_up(ds, port, MLO_AN_FIXED, interface, NULL, + speed, DUPLEX_FULL, true, true); + +@@ -2972,16 +2984,13 @@ mt753x_phylink_validate(struct dsa_switc + linkmode_and(state->advertising, state->advertising, mask); + } + +-static int +-mt7530_phylink_mac_link_state(struct dsa_switch *ds, int port, +- struct phylink_link_state *state) ++static void mt7530_pcs_get_state(struct phylink_pcs *pcs, ++ struct phylink_link_state *state) + { +- struct mt7530_priv *priv = ds->priv; ++ struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv; ++ int port = pcs_to_mt753x_pcs(pcs)->port; + u32 pmsr; + +- if (port < 0 || port >= MT7530_NUM_PORTS) +- return -EINVAL; +- + pmsr = mt7530_read(priv, MT7530_PMSR_P(port)); + + state->link = (pmsr & PMSR_LINK); +@@ -3008,8 +3017,6 @@ mt7530_phylink_mac_link_state(struct dsa + state->pause |= MLO_PAUSE_RX; + if (pmsr & PMSR_TX_FC) + state->pause |= MLO_PAUSE_TX; +- +- return 1; + } + + static int +@@ -3051,32 +3058,49 @@ mt7531_sgmii_pcs_get_state_an(struct mt7 + return 0; + } + +-static int +-mt7531_phylink_mac_link_state(struct dsa_switch *ds, int port, +- struct phylink_link_state *state) ++static void mt7531_pcs_get_state(struct phylink_pcs *pcs, ++ struct phylink_link_state *state) + { +- struct mt7530_priv *priv = ds->priv; ++ struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv; ++ int port = pcs_to_mt753x_pcs(pcs)->port; + + if (state->interface == PHY_INTERFACE_MODE_SGMII) +- return mt7531_sgmii_pcs_get_state_an(priv, port, state); +- +- return -EOPNOTSUPP; ++ mt7531_sgmii_pcs_get_state_an(priv, port, state); ++ else ++ state->link = false; + } + +-static int +-mt753x_phylink_mac_link_state(struct dsa_switch *ds, int port, +- struct phylink_link_state *state) ++static int mt753x_pcs_config(struct phylink_pcs *pcs, unsigned int mode, ++ phy_interface_t interface, ++ const unsigned long *advertising, ++ bool permit_pause_to_mac) + { +- struct mt7530_priv *priv = ds->priv; ++ return 0; ++} + +- return priv->info->mac_port_get_state(ds, port, state); ++static void mt7530_pcs_an_restart(struct phylink_pcs *pcs) ++{ + } + ++static const struct phylink_pcs_ops mt7530_pcs_ops = { ++ .pcs_get_state = mt7530_pcs_get_state, ++ .pcs_config = mt753x_pcs_config, ++ .pcs_an_restart = mt7530_pcs_an_restart, ++}; ++ ++static const struct phylink_pcs_ops mt7531_pcs_ops = { ++ .pcs_get_state = mt7531_pcs_get_state, ++ .pcs_config = mt753x_pcs_config, ++ .pcs_an_restart = mt7531_pcs_an_restart, ++ .pcs_link_up = mt7531_pcs_link_up, ++}; ++ + static int + mt753x_setup(struct dsa_switch *ds) + { + struct mt7530_priv *priv = ds->priv; + int ret = priv->info->sw_setup(ds); ++ int i; + + if (ret) + return ret; +@@ -3089,6 +3113,13 @@ mt753x_setup(struct dsa_switch *ds) + if (ret && priv->irq) + mt7530_free_irq_common(priv); + ++ /* Initialise the PCS devices */ ++ for (i = 0; i < priv->ds->num_ports; i++) { ++ priv->pcs[i].pcs.ops = priv->info->pcs_ops; ++ priv->pcs[i].priv = priv; ++ priv->pcs[i].port = i; ++ } ++ + return ret; + } + +@@ -3150,9 +3181,8 @@ static const struct dsa_switch_ops mt753 + .port_mirror_del = mt753x_port_mirror_del, + .phylink_get_caps = mt753x_phylink_get_caps, + .phylink_validate = mt753x_phylink_validate, +- .phylink_mac_link_state = mt753x_phylink_mac_link_state, ++ .phylink_mac_select_pcs = mt753x_phylink_mac_select_pcs, + .phylink_mac_config = mt753x_phylink_mac_config, +- .phylink_mac_an_restart = mt753x_phylink_mac_an_restart, + .phylink_mac_link_down = mt753x_phylink_mac_link_down, + .phylink_mac_link_up = mt753x_phylink_mac_link_up, + .get_mac_eee = mt753x_get_mac_eee, +@@ -3162,36 +3192,34 @@ static const struct dsa_switch_ops mt753 + static const struct mt753x_info mt753x_table[] = { + [ID_MT7621] = { + .id = ID_MT7621, ++ .pcs_ops = &mt7530_pcs_ops, + .sw_setup = mt7530_setup, + .phy_read = mt7530_phy_read, + .phy_write = mt7530_phy_write, + .pad_setup = mt7530_pad_clk_setup, + .mac_port_get_caps = mt7530_mac_port_get_caps, +- .mac_port_get_state = mt7530_phylink_mac_link_state, + .mac_port_config = mt7530_mac_config, + }, + [ID_MT7530] = { + .id = ID_MT7530, ++ .pcs_ops = &mt7530_pcs_ops, + .sw_setup = mt7530_setup, + .phy_read = mt7530_phy_read, + .phy_write = mt7530_phy_write, + .pad_setup = mt7530_pad_clk_setup, + .mac_port_get_caps = mt7530_mac_port_get_caps, +- .mac_port_get_state = mt7530_phylink_mac_link_state, + .mac_port_config = mt7530_mac_config, + }, + [ID_MT7531] = { + .id = ID_MT7531, ++ .pcs_ops = &mt7531_pcs_ops, + .sw_setup = mt7531_setup, + .phy_read = mt7531_ind_phy_read, + .phy_write = mt7531_ind_phy_write, + .pad_setup = mt7531_pad_setup, + .cpu_port_config = mt7531_cpu_port_config, + .mac_port_get_caps = mt7531_mac_port_get_caps, +- .mac_port_get_state = mt7531_phylink_mac_link_state, + .mac_port_config = mt7531_mac_config, +- .mac_pcs_an_restart = mt7531_sgmii_restart_an, +- .mac_pcs_link_up = mt7531_sgmii_link_up_force, + }, + }; + +@@ -3249,7 +3277,7 @@ mt7530_probe(struct mdio_device *mdiodev + if (!priv->info->sw_setup || !priv->info->pad_setup || + !priv->info->phy_read || !priv->info->phy_write || + !priv->info->mac_port_get_caps || +- !priv->info->mac_port_get_state || !priv->info->mac_port_config) ++ !priv->info->mac_port_config) + return -EINVAL; + + priv->id = priv->info->id; +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -741,6 +741,12 @@ static const char *p5_intf_modes(unsigne + + struct mt7530_priv; + ++struct mt753x_pcs { ++ struct phylink_pcs pcs; ++ struct mt7530_priv *priv; ++ int port; ++}; ++ + /* struct mt753x_info - This is the main data structure for holding the specific + * part for each supported device + * @sw_setup: Holding the handler to a device initialization +@@ -752,18 +758,14 @@ struct mt7530_priv; + * port + * @mac_port_validate: Holding the way to set addition validate type for a + * certan MAC port +- * @mac_port_get_state: Holding the way getting the MAC/PCS state for a certain +- * MAC port + * @mac_port_config: Holding the way setting up the PHY attribute to a + * certain MAC port +- * @mac_pcs_an_restart Holding the way restarting PCS autonegotiation for a +- * certain MAC port +- * @mac_pcs_link_up: Holding the way setting up the PHY attribute to the pcs +- * of the certain MAC port + */ + struct mt753x_info { + enum mt753x_id id; + ++ const struct phylink_pcs_ops *pcs_ops; ++ + int (*sw_setup)(struct dsa_switch *ds); + int (*phy_read)(struct mt7530_priv *priv, int port, int regnum); + int (*phy_write)(struct mt7530_priv *priv, int port, int regnum, u16 val); +@@ -774,15 +776,9 @@ struct mt753x_info { + void (*mac_port_validate)(struct dsa_switch *ds, int port, + phy_interface_t interface, + unsigned long *supported); +- int (*mac_port_get_state)(struct dsa_switch *ds, int port, +- struct phylink_link_state *state); + int (*mac_port_config)(struct dsa_switch *ds, int port, + unsigned int mode, + phy_interface_t interface); +- void (*mac_pcs_an_restart)(struct dsa_switch *ds, int port); +- void (*mac_pcs_link_up)(struct dsa_switch *ds, int port, +- unsigned int mode, phy_interface_t interface, +- int speed, int duplex); + }; + + /* struct mt7530_priv - This is the main data structure for holding the state +@@ -824,6 +820,7 @@ struct mt7530_priv { + u8 mirror_tx; + + struct mt7530_port ports[MT7530_NUM_PORTS]; ++ struct mt753x_pcs pcs[MT7530_NUM_PORTS]; + /* protect among processes for registers access*/ + struct mutex reg_mutex; + int irq; diff --git a/target/linux/generic/backport-5.15/705-08-v5.19-net-dsa-mt7530-move-autoneg-handling-to-PCS-validati.patch b/target/linux/generic/backport-5.15/705-08-v5.19-net-dsa-mt7530-move-autoneg-handling-to-PCS-validati.patch new file mode 100644 index 0000000000..220e34d1df --- /dev/null +++ b/target/linux/generic/backport-5.15/705-08-v5.19-net-dsa-mt7530-move-autoneg-handling-to-PCS-validati.patch @@ -0,0 +1,80 @@ +From 2b0ee6768f3ac09072e5fd60b36580924e1cfa1c Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 11 Apr 2022 10:46:32 +0100 +Subject: [PATCH 08/13] net: dsa: mt7530: move autoneg handling to PCS + validation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Move the autoneg bit handling to the PCS validation, which allows us to +get rid of mt753x_phylink_validate() and rely on the default +phylink_generic_validate() implementation for the MAC side. + +Tested-by: Marek Behún +Signed-off-by: Russell King (Oracle) +Signed-off-by: Paolo Abeni +--- + drivers/net/dsa/mt7530.c | 28 ++++++++++------------------ + 1 file changed, 10 insertions(+), 18 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2963,25 +2963,16 @@ static void mt753x_phylink_get_caps(stru + priv->info->mac_port_get_caps(ds, port, config); + } + +-static void +-mt753x_phylink_validate(struct dsa_switch *ds, int port, +- unsigned long *supported, +- struct phylink_link_state *state) +-{ +- __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; +- u32 caps; +- +- caps = dsa_to_port(ds, port)->pl_config.mac_capabilities; +- +- phylink_set_port_modes(mask); +- phylink_get_linkmodes(mask, state->interface, caps); ++static int mt753x_pcs_validate(struct phylink_pcs *pcs, ++ unsigned long *supported, ++ const struct phylink_link_state *state) ++{ ++ /* Autonegotiation is not supported in TRGMII nor 802.3z modes */ ++ if (state->interface == PHY_INTERFACE_MODE_TRGMII || ++ phy_interface_mode_is_8023z(state->interface)) ++ phylink_clear(supported, Autoneg); + +- if (state->interface != PHY_INTERFACE_MODE_TRGMII && +- !phy_interface_mode_is_8023z(state->interface)) +- phylink_set(mask, Autoneg); +- +- linkmode_and(supported, supported, mask); +- linkmode_and(state->advertising, state->advertising, mask); ++ return 0; + } + + static void mt7530_pcs_get_state(struct phylink_pcs *pcs, +@@ -3083,12 +3074,14 @@ static void mt7530_pcs_an_restart(struct + } + + static const struct phylink_pcs_ops mt7530_pcs_ops = { ++ .pcs_validate = mt753x_pcs_validate, + .pcs_get_state = mt7530_pcs_get_state, + .pcs_config = mt753x_pcs_config, + .pcs_an_restart = mt7530_pcs_an_restart, + }; + + static const struct phylink_pcs_ops mt7531_pcs_ops = { ++ .pcs_validate = mt753x_pcs_validate, + .pcs_get_state = mt7531_pcs_get_state, + .pcs_config = mt753x_pcs_config, + .pcs_an_restart = mt7531_pcs_an_restart, +@@ -3180,7 +3173,6 @@ static const struct dsa_switch_ops mt753 + .port_mirror_add = mt753x_port_mirror_add, + .port_mirror_del = mt753x_port_mirror_del, + .phylink_get_caps = mt753x_phylink_get_caps, +- .phylink_validate = mt753x_phylink_validate, + .phylink_mac_select_pcs = mt753x_phylink_mac_select_pcs, + .phylink_mac_config = mt753x_phylink_mac_config, + .phylink_mac_link_down = mt753x_phylink_mac_link_down, diff --git a/target/linux/generic/backport-5.15/705-09-v5.19-net-dsa-mt7530-mark-as-non-legacy.patch b/target/linux/generic/backport-5.15/705-09-v5.19-net-dsa-mt7530-mark-as-non-legacy.patch new file mode 100644 index 0000000000..71ececd074 --- /dev/null +++ b/target/linux/generic/backport-5.15/705-09-v5.19-net-dsa-mt7530-mark-as-non-legacy.patch @@ -0,0 +1,34 @@ +From 5bc26de9bfaa6bb5539c09d4435dced98f429cfc Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 11 Apr 2022 10:46:37 +0100 +Subject: [PATCH 09/13] net: dsa: mt7530: mark as non-legacy +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The mt7530 driver does not make use of the speed, duplex, pause or +advertisement in its phylink_mac_config() implementation, so it can be +marked as a non-legacy driver. + +Tested-by: Marek Behún +Signed-off-by: Russell King (Oracle) +Signed-off-by: Paolo Abeni +--- + drivers/net/dsa/mt7530.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2960,6 +2960,12 @@ static void mt753x_phylink_get_caps(stru + config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | + MAC_10 | MAC_100 | MAC_1000FD; + ++ /* This driver does not make use of the speed, duplex, pause or the ++ * advertisement in its mac_config, so it is safe to mark this driver ++ * as non-legacy. ++ */ ++ config->legacy_pre_march2020 = false; ++ + priv->info->mac_port_get_caps(ds, port, config); + } + diff --git a/target/linux/generic/backport-5.15/705-10-v5.19-net-dsa-mt753x-fix-pcs-conversion-regression.patch b/target/linux/generic/backport-5.15/705-10-v5.19-net-dsa-mt753x-fix-pcs-conversion-regression.patch new file mode 100644 index 0000000000..26c465d67e --- /dev/null +++ b/target/linux/generic/backport-5.15/705-10-v5.19-net-dsa-mt753x-fix-pcs-conversion-regression.patch @@ -0,0 +1,116 @@ +From 1f15b5e8733115cee65342bcaafeaf0368809fae Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 25 Apr 2022 22:28:02 +0100 +Subject: [PATCH 10/13] net: dsa: mt753x: fix pcs conversion regression + +Daniel Golle reports that the conversion of mt753x to phylink PCS caused +an oops as below. + +The problem is with the placement of the PCS initialisation, which +occurs after mt7531_setup() has been called. However, burited in this +function is a call to setup the CPU port, which requires the PCS +structure to be already setup. + +Fix this by changing the initialisation order. + +Unable to handle kernel NULL pointer dereference at virtual address 0000000000000020 +Mem abort info: + ESR = 0x96000005 + EC = 0x25: DABT (current EL), IL = 32 bits + SET = 0, FnV = 0 + EA = 0, S1PTW = 0 + FSC = 0x05: level 1 translation fault +Data abort info: + ISV = 0, ISS = 0x00000005 + CM = 0, WnR = 0 +user pgtable: 4k pages, 39-bit VAs, pgdp=0000000046057000 +[0000000000000020] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000 +Internal error: Oops: 96000005 [#1] SMP +Modules linked in: +CPU: 0 PID: 32 Comm: kworker/u4:1 Tainted: G S 5.18.0-rc3-next-20220422+ #0 +Hardware name: Bananapi BPI-R64 (DT) +Workqueue: events_unbound deferred_probe_work_func +pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) +pc : mt7531_cpu_port_config+0xcc/0x1b0 +lr : mt7531_cpu_port_config+0xc0/0x1b0 +sp : ffffffc008d5b980 +x29: ffffffc008d5b990 x28: ffffff80060562c8 x27: 00000000f805633b +x26: ffffff80001a8880 x25: 00000000000009c4 x24: 0000000000000016 +x23: ffffff8005eb6470 x22: 0000000000003600 x21: ffffff8006948080 +x20: 0000000000000000 x19: 0000000000000006 x18: 0000000000000000 +x17: 0000000000000001 x16: 0000000000000001 x15: 02963607fcee069e +x14: 0000000000000000 x13: 0000000000000030 x12: 0101010101010101 +x11: ffffffc037302000 x10: 0000000000000870 x9 : ffffffc008d5b800 +x8 : ffffff800028f950 x7 : 0000000000000001 x6 : 00000000662b3000 +x5 : 00000000000002f0 x4 : 0000000000000000 x3 : ffffff800028f080 +x2 : 0000000000000000 x1 : ffffff800028f080 x0 : 0000000000000000 +Call trace: + mt7531_cpu_port_config+0xcc/0x1b0 + mt753x_cpu_port_enable+0x24/0x1f0 + mt7531_setup+0x49c/0x5c0 + mt753x_setup+0x20/0x31c + dsa_register_switch+0x8bc/0x1020 + mt7530_probe+0x118/0x200 + mdio_probe+0x30/0x64 + really_probe.part.0+0x98/0x280 + __driver_probe_device+0x94/0x140 + driver_probe_device+0x40/0x114 + __device_attach_driver+0xb0/0x10c + bus_for_each_drv+0x64/0xa0 + __device_attach+0xa8/0x16c + device_initial_probe+0x10/0x20 + bus_probe_device+0x94/0x9c + deferred_probe_work_func+0x80/0xb4 + process_one_work+0x200/0x3a0 + worker_thread+0x260/0x4c0 + kthread+0xd4/0xe0 + ret_from_fork+0x10/0x20 +Code: 9409e911 937b7e60 8b0002a0 f9405800 (f9401005) +---[ end trace 0000000000000000 ]--- + +Reported-by: Daniel Golle +Tested-by: Daniel Golle +Fixes: cbd1f243bc41 ("net: dsa: mt7530: partially convert to phylink_pcs") +Signed-off-by: Russell King (Oracle) +Reviewed-by: Florian Fainelli +Link: https://lore.kernel.org/r/E1nj6FW-007WZB-5Y@rmk-PC.armlinux.org.uk +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/mt7530.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -3098,9 +3098,16 @@ static int + mt753x_setup(struct dsa_switch *ds) + { + struct mt7530_priv *priv = ds->priv; +- int ret = priv->info->sw_setup(ds); +- int i; ++ int i, ret; + ++ /* Initialise the PCS devices */ ++ for (i = 0; i < priv->ds->num_ports; i++) { ++ priv->pcs[i].pcs.ops = priv->info->pcs_ops; ++ priv->pcs[i].priv = priv; ++ priv->pcs[i].port = i; ++ } ++ ++ ret = priv->info->sw_setup(ds); + if (ret) + return ret; + +@@ -3112,13 +3119,6 @@ mt753x_setup(struct dsa_switch *ds) + if (ret && priv->irq) + mt7530_free_irq_common(priv); + +- /* Initialise the PCS devices */ +- for (i = 0; i < priv->ds->num_ports; i++) { +- priv->pcs[i].pcs.ops = priv->info->pcs_ops; +- priv->pcs[i].priv = priv; +- priv->pcs[i].port = i; +- } +- + return ret; + } + diff --git a/target/linux/generic/backport-5.15/705-11-v6.0-net-dsa-mt7530-rework-mt7530_hw_vlan_-add-del.patch b/target/linux/generic/backport-5.15/705-11-v6.0-net-dsa-mt7530-rework-mt7530_hw_vlan_-add-del.patch new file mode 100644 index 0000000000..4adb167199 --- /dev/null +++ b/target/linux/generic/backport-5.15/705-11-v6.0-net-dsa-mt7530-rework-mt7530_hw_vlan_-add-del.patch @@ -0,0 +1,87 @@ +From e26be16262e1fc1e9f1798c12762663bd9c265c6 Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich +Date: Fri, 10 Jun 2022 19:05:37 +0200 +Subject: [PATCH 11/13] net: dsa: mt7530: rework mt7530_hw_vlan_{add,del} + +Rework vlan_add/vlan_del functions in preparation for dynamic cpu port. + +Currently BIT(MT7530_CPU_PORT) is added to new_members, even though +mt7530_port_vlan_add() will be called on the CPU port too. + +Let DSA core decide when to call port_vlan_add for the CPU port, rather +than doing it implicitly. + +We can do autonomous forwarding in a certain VLAN, but not add br0 to that +VLAN and avoid flooding the CPU with those packets, if software knows it +doesn't need to process them. + +Suggested-by: Vladimir Oltean +Signed-off-by: Frank Wunderlich +Reviewed-by: Vladimir Oltean +Reviewed-by: Florian Fainelli +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/mt7530.c | 30 ++++++++++++------------------ + 1 file changed, 12 insertions(+), 18 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -1544,11 +1544,11 @@ static void + mt7530_hw_vlan_add(struct mt7530_priv *priv, + struct mt7530_hw_vlan_entry *entry) + { ++ struct dsa_port *dp = dsa_to_port(priv->ds, entry->port); + u8 new_members; + u32 val; + +- new_members = entry->old_members | BIT(entry->port) | +- BIT(MT7530_CPU_PORT); ++ new_members = entry->old_members | BIT(entry->port); + + /* Validate the entry with independent learning, create egress tag per + * VLAN and joining the port as one of the port members. +@@ -1559,22 +1559,20 @@ mt7530_hw_vlan_add(struct mt7530_priv *p + + /* Decide whether adding tag or not for those outgoing packets from the + * port inside the VLAN. +- */ +- val = entry->untagged ? MT7530_VLAN_EGRESS_UNTAG : +- MT7530_VLAN_EGRESS_TAG; +- mt7530_rmw(priv, MT7530_VAWD2, +- ETAG_CTRL_P_MASK(entry->port), +- ETAG_CTRL_P(entry->port, val)); +- +- /* CPU port is always taken as a tagged port for serving more than one ++ * CPU port is always taken as a tagged port for serving more than one + * VLANs across and also being applied with egress type stack mode for + * that VLAN tags would be appended after hardware special tag used as + * DSA tag. + */ ++ if (dsa_port_is_cpu(dp)) ++ val = MT7530_VLAN_EGRESS_STACK; ++ else if (entry->untagged) ++ val = MT7530_VLAN_EGRESS_UNTAG; ++ else ++ val = MT7530_VLAN_EGRESS_TAG; + mt7530_rmw(priv, MT7530_VAWD2, +- ETAG_CTRL_P_MASK(MT7530_CPU_PORT), +- ETAG_CTRL_P(MT7530_CPU_PORT, +- MT7530_VLAN_EGRESS_STACK)); ++ ETAG_CTRL_P_MASK(entry->port), ++ ETAG_CTRL_P(entry->port, val)); + } + + static void +@@ -1593,11 +1591,7 @@ mt7530_hw_vlan_del(struct mt7530_priv *p + return; + } + +- /* If certain member apart from CPU port is still alive in the VLAN, +- * the entry would be kept valid. Otherwise, the entry is got to be +- * disabled. +- */ +- if (new_members && new_members != BIT(MT7530_CPU_PORT)) { ++ if (new_members) { + val = IVL_MAC | VTAG_EN | PORT_MEM(new_members) | + VLAN_VALID; + mt7530_write(priv, MT7530_VAWD1, val); diff --git a/target/linux/generic/backport-5.15/705-13-v6.0-net-dsa-mt7530-get-cpu-port-via-dp-cpu_dp-instead-of.patch b/target/linux/generic/backport-5.15/705-13-v6.0-net-dsa-mt7530-get-cpu-port-via-dp-cpu_dp-instead-of.patch new file mode 100644 index 0000000000..276251f509 --- /dev/null +++ b/target/linux/generic/backport-5.15/705-13-v6.0-net-dsa-mt7530-get-cpu-port-via-dp-cpu_dp-instead-of.patch @@ -0,0 +1,117 @@ +From ad2606f6fafae3a7d41c4f2af5554c8f6adecbc7 Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich +Date: Fri, 10 Jun 2022 19:05:39 +0200 +Subject: [PATCH 13/13] net: dsa: mt7530: get cpu-port via dp->cpu_dp instead + of constant + +Replace last occurences of hardcoded cpu-port by cpu_dp member of +dsa_port struct. + +Now the constant can be dropped. + +Suggested-by: Vladimir Oltean +Signed-off-by: Frank Wunderlich +Reviewed-by: Vladimir Oltean +Reviewed-by: Florian Fainelli +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/mt7530.c | 27 ++++++++++++++++++++------- + drivers/net/dsa/mt7530.h | 1 - + 2 files changed, 20 insertions(+), 8 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -1048,6 +1048,7 @@ static int + mt7530_port_enable(struct dsa_switch *ds, int port, + struct phy_device *phy) + { ++ struct dsa_port *dp = dsa_to_port(ds, port); + struct mt7530_priv *priv = ds->priv; + + mutex_lock(&priv->reg_mutex); +@@ -1056,7 +1057,11 @@ mt7530_port_enable(struct dsa_switch *ds + * restore the port matrix if the port is the member of a certain + * bridge. + */ +- priv->ports[port].pm |= PCR_MATRIX(BIT(MT7530_CPU_PORT)); ++ if (dsa_port_is_user(dp)) { ++ struct dsa_port *cpu_dp = dp->cpu_dp; ++ ++ priv->ports[port].pm |= PCR_MATRIX(BIT(cpu_dp->index)); ++ } + priv->ports[port].enable = true; + mt7530_rmw(priv, MT7530_PCR_P(port), PCR_MATRIX_MASK, + priv->ports[port].pm); +@@ -1204,7 +1209,8 @@ mt7530_port_bridge_join(struct dsa_switc + struct net_device *bridge) + { + struct dsa_port *dp = dsa_to_port(ds, port), *other_dp; +- u32 port_bitmap = BIT(MT7530_CPU_PORT); ++ struct dsa_port *cpu_dp = dp->cpu_dp; ++ u32 port_bitmap = BIT(cpu_dp->index); + struct mt7530_priv *priv = ds->priv; + + mutex_lock(&priv->reg_mutex); +@@ -1281,9 +1287,12 @@ mt7530_port_set_vlan_unaware(struct dsa_ + * the CPU port get out of VLAN filtering mode. + */ + if (all_user_ports_removed) { +- mt7530_write(priv, MT7530_PCR_P(MT7530_CPU_PORT), ++ struct dsa_port *dp = dsa_to_port(ds, port); ++ struct dsa_port *cpu_dp = dp->cpu_dp; ++ ++ mt7530_write(priv, MT7530_PCR_P(cpu_dp->index), + PCR_MATRIX(dsa_user_ports(priv->ds))); +- mt7530_write(priv, MT7530_PVC_P(MT7530_CPU_PORT), PORT_SPEC_TAG ++ mt7530_write(priv, MT7530_PVC_P(cpu_dp->index), PORT_SPEC_TAG + | PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT)); + } + } +@@ -1333,6 +1342,7 @@ mt7530_port_bridge_leave(struct dsa_swit + struct net_device *bridge) + { + struct dsa_port *dp = dsa_to_port(ds, port), *other_dp; ++ struct dsa_port *cpu_dp = dp->cpu_dp; + struct mt7530_priv *priv = ds->priv; + + mutex_lock(&priv->reg_mutex); +@@ -1361,8 +1371,8 @@ mt7530_port_bridge_leave(struct dsa_swit + */ + if (priv->ports[port].enable) + mt7530_rmw(priv, MT7530_PCR_P(port), PCR_MATRIX_MASK, +- PCR_MATRIX(BIT(MT7530_CPU_PORT))); +- priv->ports[port].pm = PCR_MATRIX(BIT(MT7530_CPU_PORT)); ++ PCR_MATRIX(BIT(cpu_dp->index))); ++ priv->ports[port].pm = PCR_MATRIX(BIT(cpu_dp->index)); + + /* When a port is removed from the bridge, the port would be set up + * back to the default as is at initial boot which is a VLAN-unaware +@@ -1525,6 +1535,9 @@ static int + mt7530_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, + struct netlink_ext_ack *extack) + { ++ struct dsa_port *dp = dsa_to_port(ds, port); ++ struct dsa_port *cpu_dp = dp->cpu_dp; ++ + if (vlan_filtering) { + /* The port is being kept as VLAN-unaware port when bridge is + * set up with vlan_filtering not being set, Otherwise, the +@@ -1532,7 +1545,7 @@ mt7530_port_vlan_filtering(struct dsa_sw + * for becoming a VLAN-aware port. + */ + mt7530_port_set_vlan_aware(ds, port); +- mt7530_port_set_vlan_aware(ds, MT7530_CPU_PORT); ++ mt7530_port_set_vlan_aware(ds, cpu_dp->index); + } else { + mt7530_port_set_vlan_unaware(ds, port); + } +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -8,7 +8,6 @@ + + #define MT7530_NUM_PORTS 7 + #define MT7530_NUM_PHYS 5 +-#define MT7530_CPU_PORT 6 + #define MT7530_NUM_FDB_RECORDS 2048 + #define MT7530_ALL_MEMBERS 0xff + diff --git a/target/linux/generic/backport-5.15/706-00-v6.0-net-ethernet-mtk_eth_soc-rely-on-page_pool-for-singl.patch b/target/linux/generic/backport-5.15/706-00-v6.0-net-ethernet-mtk_eth_soc-rely-on-page_pool-for-singl.patch new file mode 100644 index 0000000000..c5501fb040 --- /dev/null +++ b/target/linux/generic/backport-5.15/706-00-v6.0-net-ethernet-mtk_eth_soc-rely-on-page_pool-for-singl.patch @@ -0,0 +1,330 @@ +From 23233e577ef973c2c5d0dd757a0a4605e34ecb57 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Fri, 22 Jul 2022 09:19:36 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: rely on page_pool for single page + buffers + +Rely on page_pool allocator for single page buffers in order to keep +them dma mapped and add skb recycling support. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/Kconfig | 1 + + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 185 +++++++++++++++----- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 10 ++ + 3 files changed, 156 insertions(+), 40 deletions(-) + +--- a/drivers/net/ethernet/mediatek/Kconfig ++++ b/drivers/net/ethernet/mediatek/Kconfig +@@ -16,6 +16,7 @@ config NET_MEDIATEK_SOC + depends on NET_DSA || !NET_DSA + select PHYLINK + select DIMLIB ++ select PAGE_POOL + help + This driver supports the gigabit ethernet MACs in the + MediaTek SoC family. +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1389,6 +1389,68 @@ static void mtk_update_rx_cpu_idx(struct + } + } + ++static struct page_pool *mtk_create_page_pool(struct mtk_eth *eth, ++ struct xdp_rxq_info *xdp_q, ++ int id, int size) ++{ ++ struct page_pool_params pp_params = { ++ .order = 0, ++ .flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV, ++ .pool_size = size, ++ .nid = NUMA_NO_NODE, ++ .dev = eth->dma_dev, ++ .dma_dir = DMA_FROM_DEVICE, ++ .offset = MTK_PP_HEADROOM, ++ .max_len = MTK_PP_MAX_BUF_SIZE, ++ }; ++ struct page_pool *pp; ++ int err; ++ ++ pp = page_pool_create(&pp_params); ++ if (IS_ERR(pp)) ++ return pp; ++ ++ err = xdp_rxq_info_reg(xdp_q, ð->dummy_dev, id, ++ eth->rx_napi.napi_id); ++ if (err < 0) ++ goto err_free_pp; ++ ++ err = xdp_rxq_info_reg_mem_model(xdp_q, MEM_TYPE_PAGE_POOL, pp); ++ if (err) ++ goto err_unregister_rxq; ++ ++ return pp; ++ ++err_unregister_rxq: ++ xdp_rxq_info_unreg(xdp_q); ++err_free_pp: ++ page_pool_destroy(pp); ++ ++ return ERR_PTR(err); ++} ++ ++static void *mtk_page_pool_get_buff(struct page_pool *pp, dma_addr_t *dma_addr, ++ gfp_t gfp_mask) ++{ ++ struct page *page; ++ ++ page = page_pool_alloc_pages(pp, gfp_mask | __GFP_NOWARN); ++ if (!page) ++ return NULL; ++ ++ *dma_addr = page_pool_get_dma_addr(page) + MTK_PP_HEADROOM; ++ return page_address(page); ++} ++ ++static void mtk_rx_put_buff(struct mtk_rx_ring *ring, void *data, bool napi) ++{ ++ if (ring->page_pool) ++ page_pool_put_full_page(ring->page_pool, ++ virt_to_head_page(data), napi); ++ else ++ skb_free_frag(data); ++} ++ + static int mtk_poll_rx(struct napi_struct *napi, int budget, + struct mtk_eth *eth) + { +@@ -1402,9 +1464,9 @@ static int mtk_poll_rx(struct napi_struc + + while (done < budget) { + unsigned int pktlen, *rxdcsum; ++ u32 hash, reason, reserve_len; + struct net_device *netdev; + dma_addr_t dma_addr; +- u32 hash, reason; + int mac = 0; + + ring = mtk_get_rx_ring(eth); +@@ -1435,36 +1497,54 @@ static int mtk_poll_rx(struct napi_struc + goto release_desc; + + /* alloc new buffer */ +- if (ring->frag_size <= PAGE_SIZE) +- new_data = napi_alloc_frag(ring->frag_size); +- else +- new_data = mtk_max_lro_buf_alloc(GFP_ATOMIC); +- if (unlikely(!new_data)) { +- netdev->stats.rx_dropped++; +- goto release_desc; +- } +- dma_addr = dma_map_single(eth->dma_dev, +- new_data + NET_SKB_PAD + +- eth->ip_align, +- ring->buf_size, +- DMA_FROM_DEVICE); +- if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) { +- skb_free_frag(new_data); +- netdev->stats.rx_dropped++; +- goto release_desc; +- } ++ if (ring->page_pool) { ++ new_data = mtk_page_pool_get_buff(ring->page_pool, ++ &dma_addr, ++ GFP_ATOMIC); ++ if (unlikely(!new_data)) { ++ netdev->stats.rx_dropped++; ++ goto release_desc; ++ } ++ } else { ++ if (ring->frag_size <= PAGE_SIZE) ++ new_data = napi_alloc_frag(ring->frag_size); ++ else ++ new_data = mtk_max_lro_buf_alloc(GFP_ATOMIC); ++ ++ if (unlikely(!new_data)) { ++ netdev->stats.rx_dropped++; ++ goto release_desc; ++ } + +- dma_unmap_single(eth->dma_dev, trxd.rxd1, +- ring->buf_size, DMA_FROM_DEVICE); ++ dma_addr = dma_map_single(eth->dma_dev, ++ new_data + NET_SKB_PAD + eth->ip_align, ++ ring->buf_size, DMA_FROM_DEVICE); ++ if (unlikely(dma_mapping_error(eth->dma_dev, ++ dma_addr))) { ++ skb_free_frag(new_data); ++ netdev->stats.rx_dropped++; ++ goto release_desc; ++ } ++ ++ dma_unmap_single(eth->dma_dev, trxd.rxd1, ++ ring->buf_size, DMA_FROM_DEVICE); ++ } + + /* receive data */ + skb = build_skb(data, ring->frag_size); + if (unlikely(!skb)) { +- skb_free_frag(data); ++ mtk_rx_put_buff(ring, data, true); + netdev->stats.rx_dropped++; + goto skip_rx; + } +- skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN); ++ ++ if (ring->page_pool) { ++ reserve_len = MTK_PP_HEADROOM; ++ skb_mark_for_recycle(skb); ++ } else { ++ reserve_len = NET_SKB_PAD + NET_IP_ALIGN; ++ } ++ skb_reserve(skb, reserve_len); + + pktlen = RX_DMA_GET_PLEN0(trxd.rxd2); + skb->dev = netdev; +@@ -1518,7 +1598,6 @@ static int mtk_poll_rx(struct napi_struc + skip_rx: + ring->data[idx] = new_data; + rxd->rxd1 = (unsigned int)dma_addr; +- + release_desc: + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) + rxd->rxd2 = RX_DMA_LSO; +@@ -1526,7 +1605,6 @@ release_desc: + rxd->rxd2 = RX_DMA_PREP_PLEN0(ring->buf_size); + + ring->calc_idx = idx; +- + done++; + } + +@@ -1890,13 +1968,15 @@ static int mtk_rx_alloc(struct mtk_eth * + if (!ring->data) + return -ENOMEM; + +- for (i = 0; i < rx_dma_size; i++) { +- if (ring->frag_size <= PAGE_SIZE) +- ring->data[i] = netdev_alloc_frag(ring->frag_size); +- else +- ring->data[i] = mtk_max_lro_buf_alloc(GFP_KERNEL); +- if (!ring->data[i]) +- return -ENOMEM; ++ if (!eth->hwlro) { ++ struct page_pool *pp; ++ ++ pp = mtk_create_page_pool(eth, &ring->xdp_q, ring_no, ++ rx_dma_size); ++ if (IS_ERR(pp)) ++ return PTR_ERR(pp); ++ ++ ring->page_pool = pp; + } + + ring->dma = dma_alloc_coherent(eth->dma_dev, +@@ -1907,16 +1987,33 @@ static int mtk_rx_alloc(struct mtk_eth * + + for (i = 0; i < rx_dma_size; i++) { + struct mtk_rx_dma_v2 *rxd; +- +- dma_addr_t dma_addr = dma_map_single(eth->dma_dev, +- ring->data[i] + NET_SKB_PAD + eth->ip_align, +- ring->buf_size, +- DMA_FROM_DEVICE); +- if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) +- return -ENOMEM; ++ dma_addr_t dma_addr; ++ void *data; + + rxd = ring->dma + i * eth->soc->txrx.rxd_size; ++ if (ring->page_pool) { ++ data = mtk_page_pool_get_buff(ring->page_pool, ++ &dma_addr, GFP_KERNEL); ++ if (!data) ++ return -ENOMEM; ++ } else { ++ if (ring->frag_size <= PAGE_SIZE) ++ data = netdev_alloc_frag(ring->frag_size); ++ else ++ data = mtk_max_lro_buf_alloc(GFP_KERNEL); ++ ++ if (!data) ++ return -ENOMEM; ++ ++ dma_addr = dma_map_single(eth->dma_dev, ++ data + NET_SKB_PAD + eth->ip_align, ++ ring->buf_size, DMA_FROM_DEVICE); ++ if (unlikely(dma_mapping_error(eth->dma_dev, ++ dma_addr))) ++ return -ENOMEM; ++ } + rxd->rxd1 = (unsigned int)dma_addr; ++ ring->data[i] = data; + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) + rxd->rxd2 = RX_DMA_LSO; +@@ -1932,6 +2029,7 @@ static int mtk_rx_alloc(struct mtk_eth * + rxd->rxd8 = 0; + } + } ++ + ring->dma_size = rx_dma_size; + ring->calc_idx_update = false; + ring->calc_idx = rx_dma_size - 1; +@@ -1983,7 +2081,7 @@ static void mtk_rx_clean(struct mtk_eth + + dma_unmap_single(eth->dma_dev, rxd->rxd1, + ring->buf_size, DMA_FROM_DEVICE); +- skb_free_frag(ring->data[i]); ++ mtk_rx_put_buff(ring, ring->data[i], false); + } + kfree(ring->data); + ring->data = NULL; +@@ -1995,6 +2093,13 @@ static void mtk_rx_clean(struct mtk_eth + ring->dma, ring->phys); + ring->dma = NULL; + } ++ ++ if (ring->page_pool) { ++ if (xdp_rxq_info_is_reg(&ring->xdp_q)) ++ xdp_rxq_info_unreg(&ring->xdp_q); ++ page_pool_destroy(ring->page_pool); ++ ring->page_pool = NULL; ++ } + } + + static int mtk_hwlro_rx_init(struct mtk_eth *eth) +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -18,6 +18,8 @@ + #include + #include + #include ++#include ++#include + #include "mtk_ppe.h" + + #define MTK_QDMA_PAGE_SIZE 2048 +@@ -49,6 +51,11 @@ + #define MTK_HW_FEATURES_MT7628 (NETIF_F_SG | NETIF_F_RXCSUM) + #define NEXT_DESP_IDX(X, Y) (((X) + 1) & ((Y) - 1)) + ++#define MTK_PP_HEADROOM XDP_PACKET_HEADROOM ++#define MTK_PP_PAD (MTK_PP_HEADROOM + \ ++ SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) ++#define MTK_PP_MAX_BUF_SIZE (PAGE_SIZE - MTK_PP_PAD) ++ + #define MTK_QRX_OFFSET 0x10 + + #define MTK_MAX_RX_RING_NUM 4 +@@ -743,6 +750,9 @@ struct mtk_rx_ring { + bool calc_idx_update; + u16 calc_idx; + u32 crx_idx_reg; ++ /* page_pool */ ++ struct page_pool *page_pool; ++ struct xdp_rxq_info xdp_q; + }; + + enum mkt_eth_capabilities { diff --git a/target/linux/generic/backport-5.15/706-01-v6.0-net-ethernet-mtk_eth_soc-add-basic-XDP-support.patch b/target/linux/generic/backport-5.15/706-01-v6.0-net-ethernet-mtk_eth_soc-add-basic-XDP-support.patch new file mode 100644 index 0000000000..49b2355ce4 --- /dev/null +++ b/target/linux/generic/backport-5.15/706-01-v6.0-net-ethernet-mtk_eth_soc-add-basic-XDP-support.patch @@ -0,0 +1,291 @@ +From 7c26c20da5d420cde55618263be4aa2f6de53056 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Fri, 22 Jul 2022 09:19:37 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add basic XDP support + +Introduce basic XDP support to mtk_eth_soc driver. +Supported XDP verdicts: +- XDP_PASS +- XDP_DROP +- XDP_REDIRECT + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 162 +++++++++++++++++--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 + + 2 files changed, 145 insertions(+), 19 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1389,6 +1389,11 @@ static void mtk_update_rx_cpu_idx(struct + } + } + ++static bool mtk_page_pool_enabled(struct mtk_eth *eth) ++{ ++ return !eth->hwlro; ++} ++ + static struct page_pool *mtk_create_page_pool(struct mtk_eth *eth, + struct xdp_rxq_info *xdp_q, + int id, int size) +@@ -1451,11 +1456,52 @@ static void mtk_rx_put_buff(struct mtk_r + skb_free_frag(data); + } + ++static u32 mtk_xdp_run(struct mtk_eth *eth, struct mtk_rx_ring *ring, ++ struct xdp_buff *xdp, struct net_device *dev) ++{ ++ struct bpf_prog *prog; ++ u32 act = XDP_PASS; ++ ++ rcu_read_lock(); ++ ++ prog = rcu_dereference(eth->prog); ++ if (!prog) ++ goto out; ++ ++ act = bpf_prog_run_xdp(prog, xdp); ++ switch (act) { ++ case XDP_PASS: ++ goto out; ++ case XDP_REDIRECT: ++ if (unlikely(xdp_do_redirect(dev, xdp, prog))) { ++ act = XDP_DROP; ++ break; ++ } ++ goto out; ++ default: ++ bpf_warn_invalid_xdp_action(act); ++ fallthrough; ++ case XDP_ABORTED: ++ trace_xdp_exception(dev, prog, act); ++ fallthrough; ++ case XDP_DROP: ++ break; ++ } ++ ++ page_pool_put_full_page(ring->page_pool, ++ virt_to_head_page(xdp->data), true); ++out: ++ rcu_read_unlock(); ++ ++ return act; ++} ++ + static int mtk_poll_rx(struct napi_struct *napi, int budget, + struct mtk_eth *eth) + { + struct dim_sample dim_sample = {}; + struct mtk_rx_ring *ring; ++ bool xdp_flush = false; + int idx; + struct sk_buff *skb; + u8 *data, *new_data; +@@ -1464,9 +1510,9 @@ static int mtk_poll_rx(struct napi_struc + + while (done < budget) { + unsigned int pktlen, *rxdcsum; +- u32 hash, reason, reserve_len; + struct net_device *netdev; + dma_addr_t dma_addr; ++ u32 hash, reason; + int mac = 0; + + ring = mtk_get_rx_ring(eth); +@@ -1496,8 +1542,14 @@ static int mtk_poll_rx(struct napi_struc + if (unlikely(test_bit(MTK_RESETTING, ð->state))) + goto release_desc; + ++ pktlen = RX_DMA_GET_PLEN0(trxd.rxd2); ++ + /* alloc new buffer */ + if (ring->page_pool) { ++ struct page *page = virt_to_head_page(data); ++ struct xdp_buff xdp; ++ u32 ret; ++ + new_data = mtk_page_pool_get_buff(ring->page_pool, + &dma_addr, + GFP_ATOMIC); +@@ -1505,6 +1557,34 @@ static int mtk_poll_rx(struct napi_struc + netdev->stats.rx_dropped++; + goto release_desc; + } ++ ++ dma_sync_single_for_cpu(eth->dma_dev, ++ page_pool_get_dma_addr(page) + MTK_PP_HEADROOM, ++ pktlen, page_pool_get_dma_dir(ring->page_pool)); ++ ++ xdp_init_buff(&xdp, PAGE_SIZE, &ring->xdp_q); ++ xdp_prepare_buff(&xdp, data, MTK_PP_HEADROOM, pktlen, ++ false); ++ xdp_buff_clear_frags_flag(&xdp); ++ ++ ret = mtk_xdp_run(eth, ring, &xdp, netdev); ++ if (ret == XDP_REDIRECT) ++ xdp_flush = true; ++ ++ if (ret != XDP_PASS) ++ goto skip_rx; ++ ++ skb = build_skb(data, PAGE_SIZE); ++ if (unlikely(!skb)) { ++ page_pool_put_full_page(ring->page_pool, ++ page, true); ++ netdev->stats.rx_dropped++; ++ goto skip_rx; ++ } ++ ++ skb_reserve(skb, xdp.data - xdp.data_hard_start); ++ skb_put(skb, xdp.data_end - xdp.data); ++ skb_mark_for_recycle(skb); + } else { + if (ring->frag_size <= PAGE_SIZE) + new_data = napi_alloc_frag(ring->frag_size); +@@ -1528,27 +1608,20 @@ static int mtk_poll_rx(struct napi_struc + + dma_unmap_single(eth->dma_dev, trxd.rxd1, + ring->buf_size, DMA_FROM_DEVICE); +- } + +- /* receive data */ +- skb = build_skb(data, ring->frag_size); +- if (unlikely(!skb)) { +- mtk_rx_put_buff(ring, data, true); +- netdev->stats.rx_dropped++; +- goto skip_rx; +- } ++ skb = build_skb(data, ring->frag_size); ++ if (unlikely(!skb)) { ++ netdev->stats.rx_dropped++; ++ skb_free_frag(data); ++ goto skip_rx; ++ } + +- if (ring->page_pool) { +- reserve_len = MTK_PP_HEADROOM; +- skb_mark_for_recycle(skb); +- } else { +- reserve_len = NET_SKB_PAD + NET_IP_ALIGN; ++ skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN); ++ skb_put(skb, pktlen); + } +- skb_reserve(skb, reserve_len); + +- pktlen = RX_DMA_GET_PLEN0(trxd.rxd2); + skb->dev = netdev; +- skb_put(skb, pktlen); ++ bytes += skb->len; + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) + rxdcsum = &trxd.rxd3; +@@ -1560,7 +1633,6 @@ static int mtk_poll_rx(struct napi_struc + else + skb_checksum_none_assert(skb); + skb->protocol = eth_type_trans(skb, netdev); +- bytes += pktlen; + + hash = trxd.rxd4 & MTK_RXD4_FOE_ENTRY; + if (hash != MTK_RXD4_FOE_ENTRY) { +@@ -1623,6 +1695,9 @@ rx_done: + &dim_sample); + net_dim(ð->rx_dim, dim_sample); + ++ if (xdp_flush) ++ xdp_do_flush_map(); ++ + return done; + } + +@@ -1968,7 +2043,7 @@ static int mtk_rx_alloc(struct mtk_eth * + if (!ring->data) + return -ENOMEM; + +- if (!eth->hwlro) { ++ if (mtk_page_pool_enabled(eth)) { + struct page_pool *pp; + + pp = mtk_create_page_pool(eth, &ring->xdp_q, ring_no, +@@ -2713,6 +2788,48 @@ static int mtk_stop(struct net_device *d + return 0; + } + ++static int mtk_xdp_setup(struct net_device *dev, struct bpf_prog *prog, ++ struct netlink_ext_ack *extack) ++{ ++ struct mtk_mac *mac = netdev_priv(dev); ++ struct mtk_eth *eth = mac->hw; ++ struct bpf_prog *old_prog; ++ bool need_update; ++ ++ if (eth->hwlro) { ++ NL_SET_ERR_MSG_MOD(extack, "XDP not supported with HWLRO"); ++ return -EOPNOTSUPP; ++ } ++ ++ if (dev->mtu > MTK_PP_MAX_BUF_SIZE) { ++ NL_SET_ERR_MSG_MOD(extack, "MTU too large for XDP"); ++ return -EOPNOTSUPP; ++ } ++ ++ need_update = !!eth->prog != !!prog; ++ if (netif_running(dev) && need_update) ++ mtk_stop(dev); ++ ++ old_prog = rcu_replace_pointer(eth->prog, prog, lockdep_rtnl_is_held()); ++ if (old_prog) ++ bpf_prog_put(old_prog); ++ ++ if (netif_running(dev) && need_update) ++ return mtk_open(dev); ++ ++ return 0; ++} ++ ++static int mtk_xdp(struct net_device *dev, struct netdev_bpf *xdp) ++{ ++ switch (xdp->command) { ++ case XDP_SETUP_PROG: ++ return mtk_xdp_setup(dev, xdp->prog, xdp->extack); ++ default: ++ return -EINVAL; ++ } ++} ++ + static void ethsys_reset(struct mtk_eth *eth, u32 reset_bits) + { + regmap_update_bits(eth->ethsys, ETHSYS_RSTCTRL, +@@ -2991,6 +3108,12 @@ static int mtk_change_mtu(struct net_dev + struct mtk_eth *eth = mac->hw; + u32 mcr_cur, mcr_new; + ++ if (rcu_access_pointer(eth->prog) && ++ length > MTK_PP_MAX_BUF_SIZE) { ++ netdev_err(dev, "Invalid MTU for XDP mode\n"); ++ return -EINVAL; ++ } ++ + if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) { + mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); + mcr_new = mcr_cur & ~MAC_MCR_MAX_RX_MASK; +@@ -3317,6 +3440,7 @@ static const struct net_device_ops mtk_n + .ndo_poll_controller = mtk_poll_controller, + #endif + .ndo_setup_tc = mtk_eth_setup_tc, ++ .ndo_bpf = mtk_xdp, + }; + + static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1086,6 +1086,8 @@ struct mtk_eth { + + struct mtk_ppe *ppe; + struct rhashtable flow_table; ++ ++ struct bpf_prog __rcu *prog; + }; + + /* struct mtk_mac - the structure that holds the info about the MACs of the diff --git a/target/linux/generic/backport-5.15/706-02-v6.0-net-ethernet-mtk_eth_soc-introduce-xdp-ethtool-count.patch b/target/linux/generic/backport-5.15/706-02-v6.0-net-ethernet-mtk_eth_soc-introduce-xdp-ethtool-count.patch new file mode 100644 index 0000000000..cf4d658684 --- /dev/null +++ b/target/linux/generic/backport-5.15/706-02-v6.0-net-ethernet-mtk_eth_soc-introduce-xdp-ethtool-count.patch @@ -0,0 +1,110 @@ +From 916a6ee836d6b7b8ef1ed5f0515e256ca60e9968 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Fri, 22 Jul 2022 09:19:38 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: introduce xdp ethtool counters + +Report xdp stats through ethtool + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 26 +++++++++++++++++++-- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 12 ++++++++++ + 2 files changed, 36 insertions(+), 2 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -34,6 +34,10 @@ MODULE_PARM_DESC(msg_level, "Message lev + #define MTK_ETHTOOL_STAT(x) { #x, \ + offsetof(struct mtk_hw_stats, x) / sizeof(u64) } + ++#define MTK_ETHTOOL_XDP_STAT(x) { #x, \ ++ offsetof(struct mtk_hw_stats, xdp_stats.x) / \ ++ sizeof(u64) } ++ + static const struct mtk_reg_map mtk_reg_map = { + .tx_irq_mask = 0x1a1c, + .tx_irq_status = 0x1a18, +@@ -141,6 +145,13 @@ static const struct mtk_ethtool_stats { + MTK_ETHTOOL_STAT(rx_long_errors), + MTK_ETHTOOL_STAT(rx_checksum_errors), + MTK_ETHTOOL_STAT(rx_flow_control_packets), ++ MTK_ETHTOOL_XDP_STAT(rx_xdp_redirect), ++ MTK_ETHTOOL_XDP_STAT(rx_xdp_pass), ++ MTK_ETHTOOL_XDP_STAT(rx_xdp_drop), ++ MTK_ETHTOOL_XDP_STAT(rx_xdp_tx), ++ MTK_ETHTOOL_XDP_STAT(rx_xdp_tx_errors), ++ MTK_ETHTOOL_XDP_STAT(tx_xdp_xmit), ++ MTK_ETHTOOL_XDP_STAT(tx_xdp_xmit_errors), + }; + + static const char * const mtk_clks_source_name[] = { +@@ -1459,6 +1470,9 @@ static void mtk_rx_put_buff(struct mtk_r + static u32 mtk_xdp_run(struct mtk_eth *eth, struct mtk_rx_ring *ring, + struct xdp_buff *xdp, struct net_device *dev) + { ++ struct mtk_mac *mac = netdev_priv(dev); ++ struct mtk_hw_stats *hw_stats = mac->hw_stats; ++ u64 *count = &hw_stats->xdp_stats.rx_xdp_drop; + struct bpf_prog *prog; + u32 act = XDP_PASS; + +@@ -1471,13 +1485,16 @@ static u32 mtk_xdp_run(struct mtk_eth *e + act = bpf_prog_run_xdp(prog, xdp); + switch (act) { + case XDP_PASS: +- goto out; ++ count = &hw_stats->xdp_stats.rx_xdp_pass; ++ goto update_stats; + case XDP_REDIRECT: + if (unlikely(xdp_do_redirect(dev, xdp, prog))) { + act = XDP_DROP; + break; + } +- goto out; ++ ++ count = &hw_stats->xdp_stats.rx_xdp_redirect; ++ goto update_stats; + default: + bpf_warn_invalid_xdp_action(act); + fallthrough; +@@ -1490,6 +1507,11 @@ static u32 mtk_xdp_run(struct mtk_eth *e + + page_pool_put_full_page(ring->page_pool, + virt_to_head_page(xdp->data), true); ++ ++update_stats: ++ u64_stats_update_begin(&hw_stats->syncp); ++ *count = *count + 1; ++ u64_stats_update_end(&hw_stats->syncp); + out: + rcu_read_unlock(); + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -568,6 +568,16 @@ struct mtk_tx_dma_v2 { + struct mtk_eth; + struct mtk_mac; + ++struct mtk_xdp_stats { ++ u64 rx_xdp_redirect; ++ u64 rx_xdp_pass; ++ u64 rx_xdp_drop; ++ u64 rx_xdp_tx; ++ u64 rx_xdp_tx_errors; ++ u64 tx_xdp_xmit; ++ u64 tx_xdp_xmit_errors; ++}; ++ + /* struct mtk_hw_stats - the structure that holds the traffic statistics. + * @stats_lock: make sure that stats operations are atomic + * @reg_offset: the status register offset of the SoC +@@ -591,6 +601,8 @@ struct mtk_hw_stats { + u64 rx_checksum_errors; + u64 rx_flow_control_packets; + ++ struct mtk_xdp_stats xdp_stats; ++ + spinlock_t stats_lock; + u32 reg_offset; + struct u64_stats_sync syncp; diff --git a/target/linux/generic/backport-5.15/706-03-v6.0-net-ethernet-mtk_eth_soc-add-xmit-XDP-support.patch b/target/linux/generic/backport-5.15/706-03-v6.0-net-ethernet-mtk_eth_soc-add-xmit-XDP-support.patch new file mode 100644 index 0000000000..f774f9875d --- /dev/null +++ b/target/linux/generic/backport-5.15/706-03-v6.0-net-ethernet-mtk_eth_soc-add-xmit-XDP-support.patch @@ -0,0 +1,340 @@ +From 5886d26fd25bbe26130e3e5f7474b9b3e98a3469 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Fri, 22 Jul 2022 09:19:39 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add xmit XDP support + +Introduce XDP support for XDP_TX verdict and ndo_xdp_xmit function +pointer. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 192 +++++++++++++++++--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 10 +- + 2 files changed, 180 insertions(+), 22 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -988,15 +988,26 @@ static void mtk_tx_unmap(struct mtk_eth + } + } + +- tx_buf->flags = 0; +- if (tx_buf->skb && +- (tx_buf->skb != (struct sk_buff *)MTK_DMA_DUMMY_DESC)) { +- if (napi) +- napi_consume_skb(tx_buf->skb, napi); ++ if (tx_buf->type == MTK_TYPE_SKB) { ++ if (tx_buf->data && ++ tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { ++ struct sk_buff *skb = tx_buf->data; ++ ++ if (napi) ++ napi_consume_skb(skb, napi); ++ else ++ dev_kfree_skb_any(skb); ++ } ++ } else if (tx_buf->data) { ++ struct xdp_frame *xdpf = tx_buf->data; ++ ++ if (napi && tx_buf->type == MTK_TYPE_XDP_TX) ++ xdp_return_frame_rx_napi(xdpf); + else +- dev_kfree_skb_any(tx_buf->skb); ++ xdp_return_frame(xdpf); + } +- tx_buf->skb = NULL; ++ tx_buf->flags = 0; ++ tx_buf->data = NULL; + } + + static void setup_tx_buf(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf, +@@ -1013,7 +1024,7 @@ static void setup_tx_buf(struct mtk_eth + dma_unmap_addr_set(tx_buf, dma_addr1, mapped_addr); + dma_unmap_len_set(tx_buf, dma_len1, size); + } else { +- tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC; ++ tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; + txd->txd1 = mapped_addr; + txd->txd2 = TX_DMA_PLEN0(size); + dma_unmap_addr_set(tx_buf, dma_addr0, mapped_addr); +@@ -1189,7 +1200,7 @@ static int mtk_tx_map(struct sk_buff *sk + soc->txrx.txd_size); + if (new_desc) + memset(tx_buf, 0, sizeof(*tx_buf)); +- tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC; ++ tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; + tx_buf->flags |= MTK_TX_FLAGS_PAGE0; + tx_buf->flags |= (!mac->id) ? MTK_TX_FLAGS_FPORT0 : + MTK_TX_FLAGS_FPORT1; +@@ -1203,7 +1214,8 @@ static int mtk_tx_map(struct sk_buff *sk + } + + /* store skb to cleanup */ +- itx_buf->skb = skb; ++ itx_buf->type = MTK_TYPE_SKB; ++ itx_buf->data = skb; + + if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { + if (k & 0x1) +@@ -1415,13 +1427,14 @@ static struct page_pool *mtk_create_page + .pool_size = size, + .nid = NUMA_NO_NODE, + .dev = eth->dma_dev, +- .dma_dir = DMA_FROM_DEVICE, + .offset = MTK_PP_HEADROOM, + .max_len = MTK_PP_MAX_BUF_SIZE, + }; + struct page_pool *pp; + int err; + ++ pp_params.dma_dir = rcu_access_pointer(eth->prog) ? DMA_BIDIRECTIONAL ++ : DMA_FROM_DEVICE; + pp = page_pool_create(&pp_params); + if (IS_ERR(pp)) + return pp; +@@ -1467,6 +1480,122 @@ static void mtk_rx_put_buff(struct mtk_r + skb_free_frag(data); + } + ++static int mtk_xdp_submit_frame(struct mtk_eth *eth, struct xdp_frame *xdpf, ++ struct net_device *dev, bool dma_map) ++{ ++ const struct mtk_soc_data *soc = eth->soc; ++ struct mtk_tx_ring *ring = ð->tx_ring; ++ struct mtk_tx_dma_desc_info txd_info = { ++ .size = xdpf->len, ++ .first = true, ++ .last = true, ++ }; ++ struct mtk_mac *mac = netdev_priv(dev); ++ struct mtk_tx_dma *txd, *txd_pdma; ++ int err = 0, index = 0, n_desc = 1; ++ struct mtk_tx_buf *tx_buf; ++ ++ if (unlikely(test_bit(MTK_RESETTING, ð->state))) ++ return -EBUSY; ++ ++ if (unlikely(atomic_read(&ring->free_count) <= 1)) ++ return -EBUSY; ++ ++ spin_lock(ð->page_lock); ++ ++ txd = ring->next_free; ++ if (txd == ring->last_free) { ++ err = -ENOMEM; ++ goto out; ++ } ++ ++ tx_buf = mtk_desc_to_tx_buf(ring, txd, soc->txrx.txd_size); ++ memset(tx_buf, 0, sizeof(*tx_buf)); ++ ++ if (dma_map) { /* ndo_xdp_xmit */ ++ txd_info.addr = dma_map_single(eth->dma_dev, xdpf->data, ++ txd_info.size, DMA_TO_DEVICE); ++ if (unlikely(dma_mapping_error(eth->dma_dev, txd_info.addr))) { ++ err = -ENOMEM; ++ goto out; ++ } ++ tx_buf->flags |= MTK_TX_FLAGS_SINGLE0; ++ } else { ++ struct page *page = virt_to_head_page(xdpf->data); ++ ++ txd_info.addr = page_pool_get_dma_addr(page) + ++ sizeof(*xdpf) + xdpf->headroom; ++ dma_sync_single_for_device(eth->dma_dev, txd_info.addr, ++ txd_info.size, ++ DMA_BIDIRECTIONAL); ++ } ++ mtk_tx_set_dma_desc(dev, txd, &txd_info); ++ ++ tx_buf->flags |= !mac->id ? MTK_TX_FLAGS_FPORT0 : MTK_TX_FLAGS_FPORT1; ++ ++ txd_pdma = qdma_to_pdma(ring, txd); ++ setup_tx_buf(eth, tx_buf, txd_pdma, txd_info.addr, txd_info.size, ++ index++); ++ ++ /* store xdpf for cleanup */ ++ tx_buf->type = dma_map ? MTK_TYPE_XDP_NDO : MTK_TYPE_XDP_TX; ++ tx_buf->data = xdpf; ++ ++ if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { ++ if (index & 1) ++ txd_pdma->txd2 |= TX_DMA_LS0; ++ else ++ txd_pdma->txd2 |= TX_DMA_LS1; ++ } ++ ++ ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2); ++ atomic_sub(n_desc, &ring->free_count); ++ ++ /* make sure that all changes to the dma ring are flushed before we ++ * continue ++ */ ++ wmb(); ++ ++ if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { ++ mtk_w32(eth, txd->txd2, soc->reg_map->qdma.ctx_ptr); ++ } else { ++ int idx; ++ ++ idx = txd_to_idx(ring, txd, soc->txrx.txd_size); ++ mtk_w32(eth, NEXT_DESP_IDX(idx, ring->dma_size), ++ MT7628_TX_CTX_IDX0); ++ } ++out: ++ spin_unlock(ð->page_lock); ++ ++ return err; ++} ++ ++static int mtk_xdp_xmit(struct net_device *dev, int num_frame, ++ struct xdp_frame **frames, u32 flags) ++{ ++ struct mtk_mac *mac = netdev_priv(dev); ++ struct mtk_hw_stats *hw_stats = mac->hw_stats; ++ struct mtk_eth *eth = mac->hw; ++ int i, nxmit = 0; ++ ++ if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) ++ return -EINVAL; ++ ++ for (i = 0; i < num_frame; i++) { ++ if (mtk_xdp_submit_frame(eth, frames[i], dev, true)) ++ break; ++ nxmit++; ++ } ++ ++ u64_stats_update_begin(&hw_stats->syncp); ++ hw_stats->xdp_stats.tx_xdp_xmit += nxmit; ++ hw_stats->xdp_stats.tx_xdp_xmit_errors += num_frame - nxmit; ++ u64_stats_update_end(&hw_stats->syncp); ++ ++ return nxmit; ++} ++ + static u32 mtk_xdp_run(struct mtk_eth *eth, struct mtk_rx_ring *ring, + struct xdp_buff *xdp, struct net_device *dev) + { +@@ -1495,6 +1624,18 @@ static u32 mtk_xdp_run(struct mtk_eth *e + + count = &hw_stats->xdp_stats.rx_xdp_redirect; + goto update_stats; ++ case XDP_TX: { ++ struct xdp_frame *xdpf = xdp_convert_buff_to_frame(xdp); ++ ++ if (mtk_xdp_submit_frame(eth, xdpf, dev, false)) { ++ count = &hw_stats->xdp_stats.rx_xdp_tx_errors; ++ act = XDP_DROP; ++ break; ++ } ++ ++ count = &hw_stats->xdp_stats.rx_xdp_tx; ++ goto update_stats; ++ } + default: + bpf_warn_invalid_xdp_action(act); + fallthrough; +@@ -1728,9 +1869,8 @@ static int mtk_poll_tx_qdma(struct mtk_e + { + const struct mtk_reg_map *reg_map = eth->soc->reg_map; + struct mtk_tx_ring *ring = ð->tx_ring; +- struct mtk_tx_dma *desc; +- struct sk_buff *skb; + struct mtk_tx_buf *tx_buf; ++ struct mtk_tx_dma *desc; + u32 cpu, dma; + + cpu = ring->last_free_ptr; +@@ -1751,15 +1891,21 @@ static int mtk_poll_tx_qdma(struct mtk_e + if (tx_buf->flags & MTK_TX_FLAGS_FPORT1) + mac = 1; + +- skb = tx_buf->skb; +- if (!skb) ++ if (!tx_buf->data) + break; + +- if (skb != (struct sk_buff *)MTK_DMA_DUMMY_DESC) { ++ if (tx_buf->type == MTK_TYPE_SKB && ++ tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { ++ struct sk_buff *skb = tx_buf->data; ++ + bytes[mac] += skb->len; + done[mac]++; + budget--; ++ } else if (tx_buf->type == MTK_TYPE_XDP_TX || ++ tx_buf->type == MTK_TYPE_XDP_NDO) { ++ budget--; + } ++ + mtk_tx_unmap(eth, tx_buf, true); + + ring->last_free = desc; +@@ -1778,9 +1924,8 @@ static int mtk_poll_tx_pdma(struct mtk_e + unsigned int *done, unsigned int *bytes) + { + struct mtk_tx_ring *ring = ð->tx_ring; +- struct mtk_tx_dma *desc; +- struct sk_buff *skb; + struct mtk_tx_buf *tx_buf; ++ struct mtk_tx_dma *desc; + u32 cpu, dma; + + cpu = ring->cpu_idx; +@@ -1788,14 +1933,18 @@ static int mtk_poll_tx_pdma(struct mtk_e + + while ((cpu != dma) && budget) { + tx_buf = &ring->buf[cpu]; +- skb = tx_buf->skb; +- if (!skb) ++ if (!tx_buf->data) + break; + +- if (skb != (struct sk_buff *)MTK_DMA_DUMMY_DESC) { ++ if (tx_buf->type == MTK_TYPE_SKB && ++ tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { ++ struct sk_buff *skb = tx_buf->data; + bytes[0] += skb->len; + done[0]++; + budget--; ++ } else if (tx_buf->type == MTK_TYPE_XDP_TX || ++ tx_buf->type == MTK_TYPE_XDP_NDO) { ++ budget--; + } + + mtk_tx_unmap(eth, tx_buf, true); +@@ -3463,6 +3612,7 @@ static const struct net_device_ops mtk_n + #endif + .ndo_setup_tc = mtk_eth_setup_tc, + .ndo_bpf = mtk_xdp, ++ .ndo_xdp_xmit = mtk_xdp_xmit, + }; + + static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -694,6 +694,12 @@ enum mtk_dev_state { + MTK_RESETTING + }; + ++enum mtk_tx_buf_type { ++ MTK_TYPE_SKB, ++ MTK_TYPE_XDP_TX, ++ MTK_TYPE_XDP_NDO, ++}; ++ + /* struct mtk_tx_buf - This struct holds the pointers to the memory pointed at + * by the TX descriptor s + * @skb: The SKB pointer of the packet being sent +@@ -703,7 +709,9 @@ enum mtk_dev_state { + * @dma_len1: The length of the second segment + */ + struct mtk_tx_buf { +- struct sk_buff *skb; ++ enum mtk_tx_buf_type type; ++ void *data; ++ + u32 flags; + DEFINE_DMA_UNMAP_ADDR(dma_addr0); + DEFINE_DMA_UNMAP_LEN(dma_len0); diff --git a/target/linux/generic/backport-5.15/706-04-v6.0-net-ethernet-mtk_eth_soc-add-support-for-page_pool_g.patch b/target/linux/generic/backport-5.15/706-04-v6.0-net-ethernet-mtk_eth_soc-add-support-for-page_pool_g.patch new file mode 100644 index 0000000000..d3d95a34b8 --- /dev/null +++ b/target/linux/generic/backport-5.15/706-04-v6.0-net-ethernet-mtk_eth_soc-add-support-for-page_pool_g.patch @@ -0,0 +1,95 @@ +From 84b9cd389036d4a262d8cee794d56c04095358a7 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Fri, 22 Jul 2022 09:19:40 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for + page_pool_get_stats + +Introduce support for the page_pool stats API into mtk_eth_soc driver. +Report page_pool stats through ethtool. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/Kconfig | 1 + + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 37 +++++++++++++++++++-- + 2 files changed, 35 insertions(+), 3 deletions(-) + +--- a/drivers/net/ethernet/mediatek/Kconfig ++++ b/drivers/net/ethernet/mediatek/Kconfig +@@ -17,6 +17,7 @@ config NET_MEDIATEK_SOC + select PHYLINK + select DIMLIB + select PAGE_POOL ++ select PAGE_POOL_STATS + help + This driver supports the gigabit ethernet MACs in the + MediaTek SoC family. +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3474,11 +3474,18 @@ static void mtk_get_strings(struct net_d + int i; + + switch (stringset) { +- case ETH_SS_STATS: ++ case ETH_SS_STATS: { ++ struct mtk_mac *mac = netdev_priv(dev); ++ + for (i = 0; i < ARRAY_SIZE(mtk_ethtool_stats); i++) { + memcpy(data, mtk_ethtool_stats[i].str, ETH_GSTRING_LEN); + data += ETH_GSTRING_LEN; + } ++ if (mtk_page_pool_enabled(mac->hw)) ++ page_pool_ethtool_stats_get_strings(data); ++ break; ++ } ++ default: + break; + } + } +@@ -3486,13 +3493,35 @@ static void mtk_get_strings(struct net_d + static int mtk_get_sset_count(struct net_device *dev, int sset) + { + switch (sset) { +- case ETH_SS_STATS: +- return ARRAY_SIZE(mtk_ethtool_stats); ++ case ETH_SS_STATS: { ++ int count = ARRAY_SIZE(mtk_ethtool_stats); ++ struct mtk_mac *mac = netdev_priv(dev); ++ ++ if (mtk_page_pool_enabled(mac->hw)) ++ count += page_pool_ethtool_stats_get_count(); ++ return count; ++ } + default: + return -EOPNOTSUPP; + } + } + ++static void mtk_ethtool_pp_stats(struct mtk_eth *eth, u64 *data) ++{ ++ struct page_pool_stats stats = {}; ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(eth->rx_ring); i++) { ++ struct mtk_rx_ring *ring = ð->rx_ring[i]; ++ ++ if (!ring->page_pool) ++ continue; ++ ++ page_pool_get_stats(ring->page_pool, &stats); ++ } ++ page_pool_ethtool_stats_get(data, &stats); ++} ++ + static void mtk_get_ethtool_stats(struct net_device *dev, + struct ethtool_stats *stats, u64 *data) + { +@@ -3520,6 +3549,8 @@ static void mtk_get_ethtool_stats(struct + + for (i = 0; i < ARRAY_SIZE(mtk_ethtool_stats); i++) + *data_dst++ = *(data_src + mtk_ethtool_stats[i].offset); ++ if (mtk_page_pool_enabled(mac->hw)) ++ mtk_ethtool_pp_stats(mac->hw, data_dst); + } while (u64_stats_fetch_retry_irq(&hwstats->syncp, start)); + } + diff --git a/target/linux/generic/backport-5.15/706-05-v6.0-net-ethernet-mtk_eth_soc-introduce-mtk_xdp_frame_map.patch b/target/linux/generic/backport-5.15/706-05-v6.0-net-ethernet-mtk_eth_soc-introduce-mtk_xdp_frame_map.patch new file mode 100644 index 0000000000..8e6895fe97 --- /dev/null +++ b/target/linux/generic/backport-5.15/706-05-v6.0-net-ethernet-mtk_eth_soc-introduce-mtk_xdp_frame_map.patch @@ -0,0 +1,113 @@ +From b16fe6d82b71fa0dd5c957bc22d66a694976d6eb Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Wed, 27 Jul 2022 23:20:50 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: introduce mtk_xdp_frame_map + utility routine + +This is a preliminary patch to add xdp multi-frag support to mtk_eth_soc +driver + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 68 +++++++++++++-------- + 1 file changed, 42 insertions(+), 26 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1480,6 +1480,41 @@ static void mtk_rx_put_buff(struct mtk_r + skb_free_frag(data); + } + ++static int mtk_xdp_frame_map(struct mtk_eth *eth, struct net_device *dev, ++ struct mtk_tx_dma_desc_info *txd_info, ++ struct mtk_tx_dma *txd, struct mtk_tx_buf *tx_buf, ++ void *data, u16 headroom, int index, bool dma_map) ++{ ++ struct mtk_tx_ring *ring = ð->tx_ring; ++ struct mtk_mac *mac = netdev_priv(dev); ++ struct mtk_tx_dma *txd_pdma; ++ ++ if (dma_map) { /* ndo_xdp_xmit */ ++ txd_info->addr = dma_map_single(eth->dma_dev, data, ++ txd_info->size, DMA_TO_DEVICE); ++ if (unlikely(dma_mapping_error(eth->dma_dev, txd_info->addr))) ++ return -ENOMEM; ++ ++ tx_buf->flags |= MTK_TX_FLAGS_SINGLE0; ++ } else { ++ struct page *page = virt_to_head_page(data); ++ ++ txd_info->addr = page_pool_get_dma_addr(page) + ++ sizeof(struct xdp_frame) + headroom; ++ dma_sync_single_for_device(eth->dma_dev, txd_info->addr, ++ txd_info->size, DMA_BIDIRECTIONAL); ++ } ++ mtk_tx_set_dma_desc(dev, txd, txd_info); ++ ++ tx_buf->flags |= !mac->id ? MTK_TX_FLAGS_FPORT0 : MTK_TX_FLAGS_FPORT1; ++ ++ txd_pdma = qdma_to_pdma(ring, txd); ++ setup_tx_buf(eth, tx_buf, txd_pdma, txd_info->addr, txd_info->size, ++ index); ++ ++ return 0; ++} ++ + static int mtk_xdp_submit_frame(struct mtk_eth *eth, struct xdp_frame *xdpf, + struct net_device *dev, bool dma_map) + { +@@ -1490,9 +1525,8 @@ static int mtk_xdp_submit_frame(struct m + .first = true, + .last = true, + }; +- struct mtk_mac *mac = netdev_priv(dev); +- struct mtk_tx_dma *txd, *txd_pdma; + int err = 0, index = 0, n_desc = 1; ++ struct mtk_tx_dma *txd, *txd_pdma; + struct mtk_tx_buf *tx_buf; + + if (unlikely(test_bit(MTK_RESETTING, ð->state))) +@@ -1512,36 +1546,18 @@ static int mtk_xdp_submit_frame(struct m + tx_buf = mtk_desc_to_tx_buf(ring, txd, soc->txrx.txd_size); + memset(tx_buf, 0, sizeof(*tx_buf)); + +- if (dma_map) { /* ndo_xdp_xmit */ +- txd_info.addr = dma_map_single(eth->dma_dev, xdpf->data, +- txd_info.size, DMA_TO_DEVICE); +- if (unlikely(dma_mapping_error(eth->dma_dev, txd_info.addr))) { +- err = -ENOMEM; +- goto out; +- } +- tx_buf->flags |= MTK_TX_FLAGS_SINGLE0; +- } else { +- struct page *page = virt_to_head_page(xdpf->data); +- +- txd_info.addr = page_pool_get_dma_addr(page) + +- sizeof(*xdpf) + xdpf->headroom; +- dma_sync_single_for_device(eth->dma_dev, txd_info.addr, +- txd_info.size, +- DMA_BIDIRECTIONAL); +- } +- mtk_tx_set_dma_desc(dev, txd, &txd_info); +- +- tx_buf->flags |= !mac->id ? MTK_TX_FLAGS_FPORT0 : MTK_TX_FLAGS_FPORT1; +- +- txd_pdma = qdma_to_pdma(ring, txd); +- setup_tx_buf(eth, tx_buf, txd_pdma, txd_info.addr, txd_info.size, +- index++); ++ err = mtk_xdp_frame_map(eth, dev, &txd_info, txd, tx_buf, ++ xdpf->data, xdpf->headroom, index, ++ dma_map); ++ if (err < 0) ++ goto out; + + /* store xdpf for cleanup */ + tx_buf->type = dma_map ? MTK_TYPE_XDP_NDO : MTK_TYPE_XDP_TX; + tx_buf->data = xdpf; + + if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { ++ txd_pdma = qdma_to_pdma(ring, txd); + if (index & 1) + txd_pdma->txd2 |= TX_DMA_LS0; + else diff --git a/target/linux/generic/backport-5.15/706-06-v6.0-net-ethernet-mtk_eth_soc-introduce-xdp-multi-frag-su.patch b/target/linux/generic/backport-5.15/706-06-v6.0-net-ethernet-mtk_eth_soc-introduce-xdp-multi-frag-su.patch new file mode 100644 index 0000000000..23e4a4dfcb --- /dev/null +++ b/target/linux/generic/backport-5.15/706-06-v6.0-net-ethernet-mtk_eth_soc-introduce-xdp-multi-frag-su.patch @@ -0,0 +1,218 @@ +From 155738a4f319538a09f734ce1f5a2eac3ada1de2 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Wed, 27 Jul 2022 23:20:51 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: introduce xdp multi-frag support + +Add the capability to map non-linear xdp frames in XDP_TX and +ndo_xdp_xmit callback. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 125 +++++++++++++------- + 1 file changed, 82 insertions(+), 43 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -988,23 +988,22 @@ static void mtk_tx_unmap(struct mtk_eth + } + } + +- if (tx_buf->type == MTK_TYPE_SKB) { +- if (tx_buf->data && +- tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { ++ if (tx_buf->data && tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { ++ if (tx_buf->type == MTK_TYPE_SKB) { + struct sk_buff *skb = tx_buf->data; + + if (napi) + napi_consume_skb(skb, napi); + else + dev_kfree_skb_any(skb); +- } +- } else if (tx_buf->data) { +- struct xdp_frame *xdpf = tx_buf->data; ++ } else { ++ struct xdp_frame *xdpf = tx_buf->data; + +- if (napi && tx_buf->type == MTK_TYPE_XDP_TX) +- xdp_return_frame_rx_napi(xdpf); +- else +- xdp_return_frame(xdpf); ++ if (napi && tx_buf->type == MTK_TYPE_XDP_TX) ++ xdp_return_frame_rx_napi(xdpf); ++ else ++ xdp_return_frame(xdpf); ++ } + } + tx_buf->flags = 0; + tx_buf->data = NULL; +@@ -1507,6 +1506,8 @@ static int mtk_xdp_frame_map(struct mtk_ + mtk_tx_set_dma_desc(dev, txd, txd_info); + + tx_buf->flags |= !mac->id ? MTK_TX_FLAGS_FPORT0 : MTK_TX_FLAGS_FPORT1; ++ tx_buf->type = dma_map ? MTK_TYPE_XDP_NDO : MTK_TYPE_XDP_TX; ++ tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; + + txd_pdma = qdma_to_pdma(ring, txd); + setup_tx_buf(eth, tx_buf, txd_pdma, txd_info->addr, txd_info->size, +@@ -1518,43 +1519,69 @@ static int mtk_xdp_frame_map(struct mtk_ + static int mtk_xdp_submit_frame(struct mtk_eth *eth, struct xdp_frame *xdpf, + struct net_device *dev, bool dma_map) + { ++ struct skb_shared_info *sinfo = xdp_get_shared_info_from_frame(xdpf); + const struct mtk_soc_data *soc = eth->soc; + struct mtk_tx_ring *ring = ð->tx_ring; + struct mtk_tx_dma_desc_info txd_info = { + .size = xdpf->len, + .first = true, +- .last = true, ++ .last = !xdp_frame_has_frags(xdpf), + }; +- int err = 0, index = 0, n_desc = 1; +- struct mtk_tx_dma *txd, *txd_pdma; +- struct mtk_tx_buf *tx_buf; ++ int err, index = 0, n_desc = 1, nr_frags; ++ struct mtk_tx_dma *htxd, *txd, *txd_pdma; ++ struct mtk_tx_buf *htx_buf, *tx_buf; ++ void *data = xdpf->data; + + if (unlikely(test_bit(MTK_RESETTING, ð->state))) + return -EBUSY; + +- if (unlikely(atomic_read(&ring->free_count) <= 1)) ++ nr_frags = unlikely(xdp_frame_has_frags(xdpf)) ? sinfo->nr_frags : 0; ++ if (unlikely(atomic_read(&ring->free_count) <= 1 + nr_frags)) + return -EBUSY; + + spin_lock(ð->page_lock); + + txd = ring->next_free; + if (txd == ring->last_free) { +- err = -ENOMEM; +- goto out; ++ spin_unlock(ð->page_lock); ++ return -ENOMEM; + } ++ htxd = txd; + + tx_buf = mtk_desc_to_tx_buf(ring, txd, soc->txrx.txd_size); + memset(tx_buf, 0, sizeof(*tx_buf)); ++ htx_buf = tx_buf; + +- err = mtk_xdp_frame_map(eth, dev, &txd_info, txd, tx_buf, +- xdpf->data, xdpf->headroom, index, +- dma_map); +- if (err < 0) +- goto out; ++ for (;;) { ++ err = mtk_xdp_frame_map(eth, dev, &txd_info, txd, tx_buf, ++ data, xdpf->headroom, index, dma_map); ++ if (err < 0) ++ goto unmap; ++ ++ if (txd_info.last) ++ break; + ++ if (MTK_HAS_CAPS(soc->caps, MTK_QDMA) || (index & 0x1)) { ++ txd = mtk_qdma_phys_to_virt(ring, txd->txd2); ++ txd_pdma = qdma_to_pdma(ring, txd); ++ if (txd == ring->last_free) ++ goto unmap; ++ ++ tx_buf = mtk_desc_to_tx_buf(ring, txd, ++ soc->txrx.txd_size); ++ memset(tx_buf, 0, sizeof(*tx_buf)); ++ n_desc++; ++ } ++ ++ memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info)); ++ txd_info.size = skb_frag_size(&sinfo->frags[index]); ++ txd_info.last = index + 1 == nr_frags; ++ data = skb_frag_address(&sinfo->frags[index]); ++ ++ index++; ++ } + /* store xdpf for cleanup */ +- tx_buf->type = dma_map ? MTK_TYPE_XDP_NDO : MTK_TYPE_XDP_TX; +- tx_buf->data = xdpf; ++ htx_buf->data = xdpf; + + if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { + txd_pdma = qdma_to_pdma(ring, txd); +@@ -1581,7 +1608,24 @@ static int mtk_xdp_submit_frame(struct m + mtk_w32(eth, NEXT_DESP_IDX(idx, ring->dma_size), + MT7628_TX_CTX_IDX0); + } +-out: ++ ++ spin_unlock(ð->page_lock); ++ ++ return 0; ++ ++unmap: ++ while (htxd != txd) { ++ txd_pdma = qdma_to_pdma(ring, htxd); ++ tx_buf = mtk_desc_to_tx_buf(ring, htxd, soc->txrx.txd_size); ++ mtk_tx_unmap(eth, tx_buf, false); ++ ++ htxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; ++ if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) ++ txd_pdma->txd2 = TX_DMA_DESP2_DEF; ++ ++ htxd = mtk_qdma_phys_to_virt(ring, htxd->txd2); ++ } ++ + spin_unlock(ð->page_lock); + + return err; +@@ -1910,18 +1954,15 @@ static int mtk_poll_tx_qdma(struct mtk_e + if (!tx_buf->data) + break; + +- if (tx_buf->type == MTK_TYPE_SKB && +- tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { +- struct sk_buff *skb = tx_buf->data; ++ if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { ++ if (tx_buf->type == MTK_TYPE_SKB) { ++ struct sk_buff *skb = tx_buf->data; + +- bytes[mac] += skb->len; +- done[mac]++; +- budget--; +- } else if (tx_buf->type == MTK_TYPE_XDP_TX || +- tx_buf->type == MTK_TYPE_XDP_NDO) { ++ bytes[mac] += skb->len; ++ done[mac]++; ++ } + budget--; + } +- + mtk_tx_unmap(eth, tx_buf, true); + + ring->last_free = desc; +@@ -1952,17 +1993,15 @@ static int mtk_poll_tx_pdma(struct mtk_e + if (!tx_buf->data) + break; + +- if (tx_buf->type == MTK_TYPE_SKB && +- tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { +- struct sk_buff *skb = tx_buf->data; +- bytes[0] += skb->len; +- done[0]++; +- budget--; +- } else if (tx_buf->type == MTK_TYPE_XDP_TX || +- tx_buf->type == MTK_TYPE_XDP_NDO) { ++ if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { ++ if (tx_buf->type == MTK_TYPE_SKB) { ++ struct sk_buff *skb = tx_buf->data; ++ ++ bytes[0] += skb->len; ++ done[0]++; ++ } + budget--; + } +- + mtk_tx_unmap(eth, tx_buf, true); + + desc = ring->dma + cpu * eth->soc->txrx.txd_size; diff --git a/target/linux/generic/backport-5.15/707-v6.3-net-pcs-add-driver-for-MediaTek-SGMII-PCS.patch b/target/linux/generic/backport-5.15/707-v6.3-net-pcs-add-driver-for-MediaTek-SGMII-PCS.patch new file mode 100644 index 0000000000..1cae648358 --- /dev/null +++ b/target/linux/generic/backport-5.15/707-v6.3-net-pcs-add-driver-for-MediaTek-SGMII-PCS.patch @@ -0,0 +1,394 @@ +From 4765a9722e09765866e131ec31f7b9cf4c1f4854 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sun, 19 Mar 2023 12:57:50 +0000 +Subject: [PATCH] net: pcs: add driver for MediaTek SGMII PCS + +The SGMII core found in several MediaTek SoCs is identical to what can +also be found in MediaTek's MT7531 Ethernet switch IC. +As this has not always been clear, both drivers developed different +implementations to deal with the PCS. +Recently Alexander Couzens pointed out this fact which lead to the +development of this shared driver. + +Add a dedicated driver, mostly by copying the code now found in the +Ethernet driver. The now redundant code will be removed by a follow-up +commit. + +Suggested-by: Alexander Couzens +Suggested-by: Russell King (Oracle) +Signed-off-by: Daniel Golle +Tested-by: Frank Wunderlich +Reviewed-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + MAINTAINERS | 8 + + drivers/net/pcs/Kconfig | 7 + + drivers/net/pcs/Makefile | 1 + + drivers/net/pcs/pcs-mtk-lynxi.c | 305 ++++++++++++++++++++++++++++++ + include/linux/pcs/pcs-mtk-lynxi.h | 13 ++ + 5 files changed, 334 insertions(+) + create mode 100644 drivers/net/pcs/pcs-mtk-lynxi.c + create mode 100644 include/linux/pcs/pcs-mtk-lynxi.h + +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -11783,6 +11783,14 @@ L: netdev@vger.kernel.org + S: Maintained + F: drivers/net/ethernet/mediatek/ + ++MEDIATEK ETHERNET PCS DRIVER ++M: Alexander Couzens ++M: Daniel Golle ++L: netdev@vger.kernel.org ++S: Maintained ++F: drivers/net/pcs/pcs-mtk-lynxi.c ++F: include/linux/pcs/pcs-mtk-lynxi.h ++ + MEDIATEK I2C CONTROLLER DRIVER + M: Qii Wang + L: linux-i2c@vger.kernel.org +--- a/drivers/net/pcs/Kconfig ++++ b/drivers/net/pcs/Kconfig +@@ -18,4 +18,11 @@ config PCS_LYNX + This module provides helpers to phylink for managing the Lynx PCS + which is part of the Layerscape and QorIQ Ethernet SERDES. + ++config PCS_MTK_LYNXI ++ tristate ++ select REGMAP ++ help ++ This module provides helpers to phylink for managing the LynxI PCS ++ which is part of MediaTek's SoC and Ethernet switch ICs. ++ + endmenu +--- a/drivers/net/pcs/Makefile ++++ b/drivers/net/pcs/Makefile +@@ -5,3 +5,4 @@ pcs_xpcs-$(CONFIG_PCS_XPCS) := pcs-xpcs. + + obj-$(CONFIG_PCS_XPCS) += pcs_xpcs.o + obj-$(CONFIG_PCS_LYNX) += pcs-lynx.o ++obj-$(CONFIG_PCS_MTK_LYNXI) += pcs-mtk-lynxi.o +--- /dev/null ++++ b/drivers/net/pcs/pcs-mtk-lynxi.c +@@ -0,0 +1,305 @@ ++// SPDX-License-Identifier: GPL-2.0 ++// Copyright (c) 2018-2019 MediaTek Inc. ++/* A library for MediaTek SGMII circuit ++ * ++ * Author: Sean Wang ++ * Author: Alexander Couzens ++ * Author: Daniel Golle ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++/* SGMII subsystem config registers */ ++/* BMCR (low 16) BMSR (high 16) */ ++#define SGMSYS_PCS_CONTROL_1 0x0 ++#define SGMII_BMCR GENMASK(15, 0) ++#define SGMII_BMSR GENMASK(31, 16) ++ ++#define SGMSYS_PCS_DEVICE_ID 0x4 ++#define SGMII_LYNXI_DEV_ID 0x4d544950 ++ ++#define SGMSYS_PCS_ADVERTISE 0x8 ++#define SGMII_ADVERTISE GENMASK(15, 0) ++#define SGMII_LPA GENMASK(31, 16) ++ ++#define SGMSYS_PCS_SCRATCH 0x14 ++#define SGMII_DEV_VERSION GENMASK(31, 16) ++ ++/* Register to programmable link timer, the unit in 2 * 8ns */ ++#define SGMSYS_PCS_LINK_TIMER 0x18 ++#define SGMII_LINK_TIMER_MASK GENMASK(19, 0) ++#define SGMII_LINK_TIMER_VAL(ns) FIELD_PREP(SGMII_LINK_TIMER_MASK, \ ++ ((ns) / 2 / 8)) ++ ++/* Register to control remote fault */ ++#define SGMSYS_SGMII_MODE 0x20 ++#define SGMII_IF_MODE_SGMII BIT(0) ++#define SGMII_SPEED_DUPLEX_AN BIT(1) ++#define SGMII_SPEED_MASK GENMASK(3, 2) ++#define SGMII_SPEED_10 FIELD_PREP(SGMII_SPEED_MASK, 0) ++#define SGMII_SPEED_100 FIELD_PREP(SGMII_SPEED_MASK, 1) ++#define SGMII_SPEED_1000 FIELD_PREP(SGMII_SPEED_MASK, 2) ++#define SGMII_DUPLEX_HALF BIT(4) ++#define SGMII_REMOTE_FAULT_DIS BIT(8) ++ ++/* Register to reset SGMII design */ ++#define SGMSYS_RESERVED_0 0x34 ++#define SGMII_SW_RESET BIT(0) ++ ++/* Register to set SGMII speed, ANA RG_ Control Signals III */ ++#define SGMII_PHY_SPEED_MASK GENMASK(3, 2) ++#define SGMII_PHY_SPEED_1_25G FIELD_PREP(SGMII_PHY_SPEED_MASK, 0) ++#define SGMII_PHY_SPEED_3_125G FIELD_PREP(SGMII_PHY_SPEED_MASK, 1) ++ ++/* Register to power up QPHY */ ++#define SGMSYS_QPHY_PWR_STATE_CTRL 0xe8 ++#define SGMII_PHYA_PWD BIT(4) ++ ++/* Register to QPHY wrapper control */ ++#define SGMSYS_QPHY_WRAP_CTRL 0xec ++#define SGMII_PN_SWAP_MASK GENMASK(1, 0) ++#define SGMII_PN_SWAP_TX_RX (BIT(0) | BIT(1)) ++ ++/* struct mtk_pcs_lynxi - This structure holds each sgmii regmap andassociated ++ * data ++ * @regmap: The register map pointing at the range used to setup ++ * SGMII modes ++ * @dev: Pointer to device owning the PCS ++ * @ana_rgc3: The offset of register ANA_RGC3 relative to regmap ++ * @interface: Currently configured interface mode ++ * @pcs: Phylink PCS structure ++ * @flags: Flags indicating hardware properties ++ */ ++struct mtk_pcs_lynxi { ++ struct regmap *regmap; ++ u32 ana_rgc3; ++ phy_interface_t interface; ++ struct phylink_pcs pcs; ++ u32 flags; ++}; ++ ++static struct mtk_pcs_lynxi *pcs_to_mtk_pcs_lynxi(struct phylink_pcs *pcs) ++{ ++ return container_of(pcs, struct mtk_pcs_lynxi, pcs); ++} ++ ++static void mtk_pcs_lynxi_get_state(struct phylink_pcs *pcs, ++ struct phylink_link_state *state) ++{ ++ struct mtk_pcs_lynxi *mpcs = pcs_to_mtk_pcs_lynxi(pcs); ++ unsigned int bm, adv; ++ ++ /* Read the BMSR and LPA */ ++ regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &bm); ++ regmap_read(mpcs->regmap, SGMSYS_PCS_ADVERTISE, &adv); ++ ++ phylink_mii_c22_pcs_decode_state(state, FIELD_GET(SGMII_BMSR, bm), ++ FIELD_GET(SGMII_LPA, adv)); ++} ++ ++static int mtk_pcs_lynxi_config(struct phylink_pcs *pcs, unsigned int mode, ++ phy_interface_t interface, ++ const unsigned long *advertising, ++ bool permit_pause_to_mac) ++{ ++ struct mtk_pcs_lynxi *mpcs = pcs_to_mtk_pcs_lynxi(pcs); ++ bool mode_changed = false, changed, use_an; ++ unsigned int rgc3, sgm_mode, bmcr; ++ int advertise, link_timer; ++ ++ advertise = phylink_mii_c22_pcs_encode_advertisement(interface, ++ advertising); ++ if (advertise < 0) ++ return advertise; ++ ++ /* Clearing IF_MODE_BIT0 switches the PCS to BASE-X mode, and ++ * we assume that fixes it's speed at bitrate = line rate (in ++ * other words, 1000Mbps or 2500Mbps). ++ */ ++ if (interface == PHY_INTERFACE_MODE_SGMII) { ++ sgm_mode = SGMII_IF_MODE_SGMII; ++ if (phylink_autoneg_inband(mode)) { ++ sgm_mode |= SGMII_REMOTE_FAULT_DIS | ++ SGMII_SPEED_DUPLEX_AN; ++ use_an = true; ++ } else { ++ use_an = false; ++ } ++ } else if (phylink_autoneg_inband(mode)) { ++ /* 1000base-X or 2500base-X autoneg */ ++ sgm_mode = SGMII_REMOTE_FAULT_DIS; ++ use_an = linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, ++ advertising); ++ } else { ++ /* 1000base-X or 2500base-X without autoneg */ ++ sgm_mode = 0; ++ use_an = false; ++ } ++ ++ if (use_an) ++ bmcr = BMCR_ANENABLE; ++ else ++ bmcr = 0; ++ ++ if (mpcs->interface != interface) { ++ link_timer = phylink_get_link_timer_ns(interface); ++ if (link_timer < 0) ++ return link_timer; ++ ++ /* PHYA power down */ ++ regmap_set_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, ++ SGMII_PHYA_PWD); ++ ++ /* Reset SGMII PCS state */ ++ regmap_set_bits(mpcs->regmap, SGMSYS_RESERVED_0, ++ SGMII_SW_RESET); ++ ++ if (mpcs->flags & MTK_SGMII_FLAG_PN_SWAP) ++ regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_WRAP_CTRL, ++ SGMII_PN_SWAP_MASK, ++ SGMII_PN_SWAP_TX_RX); ++ ++ if (interface == PHY_INTERFACE_MODE_2500BASEX) ++ rgc3 = SGMII_PHY_SPEED_3_125G; ++ else ++ rgc3 = SGMII_PHY_SPEED_1_25G; ++ ++ /* Configure the underlying interface speed */ ++ regmap_update_bits(mpcs->regmap, mpcs->ana_rgc3, ++ SGMII_PHY_SPEED_MASK, rgc3); ++ ++ /* Setup the link timer */ ++ regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER, ++ SGMII_LINK_TIMER_VAL(link_timer)); ++ ++ mpcs->interface = interface; ++ mode_changed = true; ++ } ++ ++ /* Update the advertisement, noting whether it has changed */ ++ regmap_update_bits_check(mpcs->regmap, SGMSYS_PCS_ADVERTISE, ++ SGMII_ADVERTISE, advertise, &changed); ++ ++ /* Update the sgmsys mode register */ ++ regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, ++ SGMII_REMOTE_FAULT_DIS | SGMII_SPEED_DUPLEX_AN | ++ SGMII_IF_MODE_SGMII, sgm_mode); ++ ++ /* Update the BMCR */ ++ regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, ++ BMCR_ANENABLE, bmcr); ++ ++ /* Release PHYA power down state ++ * Only removing bit SGMII_PHYA_PWD isn't enough. ++ * There are cases when the SGMII_PHYA_PWD register contains 0x9 which ++ * prevents SGMII from working. The SGMII still shows link but no traffic ++ * can flow. Writing 0x0 to the PHYA_PWD register fix the issue. 0x0 was ++ * taken from a good working state of the SGMII interface. ++ * Unknown how much the QPHY needs but it is racy without a sleep. ++ * Tested on mt7622 & mt7986. ++ */ ++ usleep_range(50, 100); ++ regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, 0); ++ ++ return changed || mode_changed; ++} ++ ++static void mtk_pcs_lynxi_restart_an(struct phylink_pcs *pcs) ++{ ++ struct mtk_pcs_lynxi *mpcs = pcs_to_mtk_pcs_lynxi(pcs); ++ ++ regmap_set_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, BMCR_ANRESTART); ++} ++ ++static void mtk_pcs_lynxi_link_up(struct phylink_pcs *pcs, unsigned int mode, ++ phy_interface_t interface, int speed, ++ int duplex) ++{ ++ struct mtk_pcs_lynxi *mpcs = pcs_to_mtk_pcs_lynxi(pcs); ++ unsigned int sgm_mode; ++ ++ if (!phylink_autoneg_inband(mode)) { ++ /* Force the speed and duplex setting */ ++ if (speed == SPEED_10) ++ sgm_mode = SGMII_SPEED_10; ++ else if (speed == SPEED_100) ++ sgm_mode = SGMII_SPEED_100; ++ else ++ sgm_mode = SGMII_SPEED_1000; ++ ++ if (duplex != DUPLEX_FULL) ++ sgm_mode |= SGMII_DUPLEX_HALF; ++ ++ regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, ++ SGMII_DUPLEX_HALF | SGMII_SPEED_MASK, ++ sgm_mode); ++ } ++} ++ ++static const struct phylink_pcs_ops mtk_pcs_lynxi_ops = { ++ .pcs_get_state = mtk_pcs_lynxi_get_state, ++ .pcs_config = mtk_pcs_lynxi_config, ++ .pcs_an_restart = mtk_pcs_lynxi_restart_an, ++ .pcs_link_up = mtk_pcs_lynxi_link_up, ++}; ++ ++struct phylink_pcs *mtk_pcs_lynxi_create(struct device *dev, ++ struct regmap *regmap, u32 ana_rgc3, ++ u32 flags) ++{ ++ struct mtk_pcs_lynxi *mpcs; ++ u32 id, ver; ++ int ret; ++ ++ ret = regmap_read(regmap, SGMSYS_PCS_DEVICE_ID, &id); ++ if (ret < 0) ++ return NULL; ++ ++ if (id != SGMII_LYNXI_DEV_ID) { ++ dev_err(dev, "unknown PCS device id %08x\n", id); ++ return NULL; ++ } ++ ++ ret = regmap_read(regmap, SGMSYS_PCS_SCRATCH, &ver); ++ if (ret < 0) ++ return NULL; ++ ++ ver = FIELD_GET(SGMII_DEV_VERSION, ver); ++ if (ver != 0x1) { ++ dev_err(dev, "unknown PCS device version %04x\n", ver); ++ return NULL; ++ } ++ ++ dev_dbg(dev, "MediaTek LynxI SGMII PCS (id 0x%08x, ver 0x%04x)\n", id, ++ ver); ++ ++ mpcs = kzalloc(sizeof(*mpcs), GFP_KERNEL); ++ if (!mpcs) ++ return NULL; ++ ++ mpcs->ana_rgc3 = ana_rgc3; ++ mpcs->regmap = regmap; ++ mpcs->flags = flags; ++ mpcs->pcs.ops = &mtk_pcs_lynxi_ops; ++ mpcs->pcs.poll = true; ++ mpcs->interface = PHY_INTERFACE_MODE_NA; ++ ++ return &mpcs->pcs; ++} ++EXPORT_SYMBOL(mtk_pcs_lynxi_create); ++ ++void mtk_pcs_lynxi_destroy(struct phylink_pcs *pcs) ++{ ++ if (!pcs) ++ return; ++ ++ kfree(pcs_to_mtk_pcs_lynxi(pcs)); ++} ++EXPORT_SYMBOL(mtk_pcs_lynxi_destroy); ++ ++MODULE_LICENSE("GPL"); +--- /dev/null ++++ b/include/linux/pcs/pcs-mtk-lynxi.h +@@ -0,0 +1,13 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++#ifndef __LINUX_PCS_MTK_LYNXI_H ++#define __LINUX_PCS_MTK_LYNXI_H ++ ++#include ++#include ++ ++#define MTK_SGMII_FLAG_PN_SWAP BIT(0) ++struct phylink_pcs *mtk_pcs_lynxi_create(struct device *dev, ++ struct regmap *regmap, ++ u32 ana_rgc3, u32 flags); ++void mtk_pcs_lynxi_destroy(struct phylink_pcs *pcs); ++#endif diff --git a/target/linux/generic/backport-5.15/708-01-v5.16-net-mvneta-Delete-unused-variable.patch b/target/linux/generic/backport-5.15/708-01-v5.16-net-mvneta-Delete-unused-variable.patch new file mode 100644 index 0000000000..421563ef08 --- /dev/null +++ b/target/linux/generic/backport-5.15/708-01-v5.16-net-mvneta-Delete-unused-variable.patch @@ -0,0 +1,62 @@ +From 43ed6fff01333868a1d0e19876f67c22d9939952 Mon Sep 17 00:00:00 2001 +From: Yuval Shaia +Date: Wed, 13 Oct 2021 09:49:21 +0300 +Subject: [PATCH] net: mvneta: Delete unused variable + +The variable pp is not in use - delete it. + +Signed-off-by: Yuval Shaia +Link: https://lore.kernel.org/r/20211013064921.26346-1-yshaia@marvell.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/marvell/mvneta.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -1914,7 +1914,7 @@ static int mvneta_rx_refill(struct mvnet + } + + /* Handle tx checksum */ +-static u32 mvneta_skb_tx_csum(struct mvneta_port *pp, struct sk_buff *skb) ++static u32 mvneta_skb_tx_csum(struct sk_buff *skb) + { + if (skb->ip_summed == CHECKSUM_PARTIAL) { + int ip_hdr_len = 0; +@@ -2595,8 +2595,7 @@ err_drop_frame: + } + + static inline void +-mvneta_tso_put_hdr(struct sk_buff *skb, +- struct mvneta_port *pp, struct mvneta_tx_queue *txq) ++mvneta_tso_put_hdr(struct sk_buff *skb, struct mvneta_tx_queue *txq) + { + int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); + struct mvneta_tx_buf *buf = &txq->buf[txq->txq_put_index]; +@@ -2604,7 +2603,7 @@ mvneta_tso_put_hdr(struct sk_buff *skb, + + tx_desc = mvneta_txq_next_desc_get(txq); + tx_desc->data_size = hdr_len; +- tx_desc->command = mvneta_skb_tx_csum(pp, skb); ++ tx_desc->command = mvneta_skb_tx_csum(skb); + tx_desc->command |= MVNETA_TXD_F_DESC; + tx_desc->buf_phys_addr = txq->tso_hdrs_phys + + txq->txq_put_index * TSO_HEADER_SIZE; +@@ -2681,7 +2680,7 @@ static int mvneta_tx_tso(struct sk_buff + hdr = txq->tso_hdrs + txq->txq_put_index * TSO_HEADER_SIZE; + tso_build_hdr(skb, hdr, &tso, data_left, total_len == 0); + +- mvneta_tso_put_hdr(skb, pp, txq); ++ mvneta_tso_put_hdr(skb, txq); + + while (data_left > 0) { + int size; +@@ -2799,7 +2798,7 @@ static netdev_tx_t mvneta_tx(struct sk_b + /* Get a descriptor for the first part of the packet */ + tx_desc = mvneta_txq_next_desc_get(txq); + +- tx_cmd = mvneta_skb_tx_csum(pp, skb); ++ tx_cmd = mvneta_skb_tx_csum(skb); + + tx_desc->data_size = skb_headlen(skb); + diff --git a/target/linux/generic/backport-5.15/708-02-v6.3-net-mvneta-fix-potential-double-frees-in-mvneta_txq_.patch b/target/linux/generic/backport-5.15/708-02-v6.3-net-mvneta-fix-potential-double-frees-in-mvneta_txq_.patch new file mode 100644 index 0000000000..a16e68ee4f --- /dev/null +++ b/target/linux/generic/backport-5.15/708-02-v6.3-net-mvneta-fix-potential-double-frees-in-mvneta_txq_.patch @@ -0,0 +1,37 @@ +From 0cf39c6543469aae4a30cba354243125514ed568 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Wed, 29 Mar 2023 13:11:17 +0100 +Subject: [PATCH] net: mvneta: fix potential double-frees in + mvneta_txq_sw_deinit() + +Reported on the Turris forum, mvneta provokes kernel warnings in the +architecture DMA mapping code when mvneta_setup_txqs() fails to +allocate memory. This happens because when mvneta_cleanup_txqs() is +called in the mvneta_stop() path, we leave pointers in the structure +that have been freed. + +Then on mvneta_open(), we call mvneta_setup_txqs(), which starts +allocating memory. On memory allocation failure, mvneta_cleanup_txqs() +will walk all the queues freeing any non-NULL pointers - which includes +pointers that were previously freed in mvneta_stop(). + +Fix this by setting these pointers to NULL to prevent double-freeing +of the same memory. + +Link: https://forum.turris.cz/t/random-kernel-exceptions-on-hbl-tos-7-0/18865/8 +Signed-off-by: Russell King (Oracle) +--- + drivers/net/ethernet/marvell/mvneta.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -3481,6 +3481,8 @@ static void mvneta_txq_sw_deinit(struct + + netdev_tx_reset_queue(nq); + ++ txq->buf = NULL; ++ txq->tso_hdrs = NULL; + txq->descs = NULL; + txq->last_desc = 0; + txq->next_desc_to_proc = 0; diff --git a/target/linux/generic/backport-5.15/710-v6.0-net-ethernet-mtk_eth_soc-fix-hw-hash-reporting-for-M.patch b/target/linux/generic/backport-5.15/710-v6.0-net-ethernet-mtk_eth_soc-fix-hw-hash-reporting-for-M.patch new file mode 100644 index 0000000000..817b3e10fd --- /dev/null +++ b/target/linux/generic/backport-5.15/710-v6.0-net-ethernet-mtk_eth_soc-fix-hw-hash-reporting-for-M.patch @@ -0,0 +1,74 @@ +From 0cf731f9ebb5bf6f252055bebf4463a5c0bd490b Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Tue, 23 Aug 2022 14:24:07 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix hw hash reporting for + MTK_NETSYS_V2 + +Properly report hw rx hash for mt7986 chipset accroding to the new dma +descriptor layout. + +Fixes: 197c9e9b17b11 ("net: ethernet: mtk_eth_soc: introduce support for mt7986 chipset") +Signed-off-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/091394ea4e705fbb35f828011d98d0ba33808f69.1661257293.git.lorenzo@kernel.org +Signed-off-by: Paolo Abeni +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 22 +++++++++++---------- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 5 +++++ + 2 files changed, 17 insertions(+), 10 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1846,10 +1846,19 @@ static int mtk_poll_rx(struct napi_struc + skb->dev = netdev; + bytes += skb->len; + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ hash = trxd.rxd5 & MTK_RXD5_FOE_ENTRY; ++ if (hash != MTK_RXD5_FOE_ENTRY) ++ skb_set_hash(skb, jhash_1word(hash, 0), ++ PKT_HASH_TYPE_L4); + rxdcsum = &trxd.rxd3; +- else ++ } else { ++ hash = trxd.rxd4 & MTK_RXD4_FOE_ENTRY; ++ if (hash != MTK_RXD4_FOE_ENTRY) ++ skb_set_hash(skb, jhash_1word(hash, 0), ++ PKT_HASH_TYPE_L4); + rxdcsum = &trxd.rxd4; ++ } + + if (*rxdcsum & eth->soc->txrx.rx_dma_l4_valid) + skb->ip_summed = CHECKSUM_UNNECESSARY; +@@ -1857,16 +1866,9 @@ static int mtk_poll_rx(struct napi_struc + skb_checksum_none_assert(skb); + skb->protocol = eth_type_trans(skb, netdev); + +- hash = trxd.rxd4 & MTK_RXD4_FOE_ENTRY; +- if (hash != MTK_RXD4_FOE_ENTRY) { +- hash = jhash_1word(hash, 0); +- skb_set_hash(skb, hash, PKT_HASH_TYPE_L4); +- } +- + reason = FIELD_GET(MTK_RXD4_PPE_CPU_REASON, trxd.rxd4); + if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) +- mtk_ppe_check_skb(eth->ppe, skb, +- trxd.rxd4 & MTK_RXD4_FOE_ENTRY); ++ mtk_ppe_check_skb(eth->ppe, skb, hash); + + if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) { + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -314,6 +314,11 @@ + #define RX_DMA_L4_VALID_PDMA BIT(30) /* when PDMA is used */ + #define RX_DMA_SPECIAL_TAG BIT(22) + ++/* PDMA descriptor rxd5 */ ++#define MTK_RXD5_FOE_ENTRY GENMASK(14, 0) ++#define MTK_RXD5_PPE_CPU_REASON GENMASK(22, 18) ++#define MTK_RXD5_SRC_PORT GENMASK(29, 26) ++ + #define RX_DMA_GET_SPORT(x) (((x) >> 19) & 0xf) + #define RX_DMA_GET_SPORT_V2(x) (((x) >> 26) & 0x7) + diff --git a/target/linux/generic/backport-5.15/711-v6.0-01-net-ethernet-mtk_eth_soc-fix-off-by-one-check-of-ARR.patch b/target/linux/generic/backport-5.15/711-v6.0-01-net-ethernet-mtk_eth_soc-fix-off-by-one-check-of-ARR.patch new file mode 100644 index 0000000000..0de8ab4376 --- /dev/null +++ b/target/linux/generic/backport-5.15/711-v6.0-01-net-ethernet-mtk_eth_soc-fix-off-by-one-check-of-ARR.patch @@ -0,0 +1,31 @@ +From: Tom Rix +Date: Sat, 16 Jul 2022 17:46:54 -0400 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix off by one check of + ARRAY_SIZE + +In mtk_wed_tx_ring_setup(.., int idx, ..), idx is used as an index here + struct mtk_wed_ring *ring = &dev->tx_ring[idx]; + +The bounds of idx are checked here + BUG_ON(idx > ARRAY_SIZE(dev->tx_ring)); + +If idx is the size of the array, it will pass this check and overflow. +So change the check to >= . + +Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)") +Signed-off-by: Tom Rix +Link: https://lore.kernel.org/r/20220716214654.1540240-1-trix@redhat.com +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -651,7 +651,7 @@ mtk_wed_tx_ring_setup(struct mtk_wed_dev + * WDMA RX. + */ + +- BUG_ON(idx > ARRAY_SIZE(dev->tx_ring)); ++ BUG_ON(idx >= ARRAY_SIZE(dev->tx_ring)); + + if (mtk_wed_ring_alloc(dev, ring, MTK_WED_TX_RING_SIZE)) + return -ENOMEM; diff --git a/target/linux/generic/backport-5.15/711-v6.0-02-net-ethernet-mtk_ppe-fix-possible-NULL-pointer-deref.patch b/target/linux/generic/backport-5.15/711-v6.0-02-net-ethernet-mtk_ppe-fix-possible-NULL-pointer-deref.patch new file mode 100644 index 0000000000..fc6e246468 --- /dev/null +++ b/target/linux/generic/backport-5.15/711-v6.0-02-net-ethernet-mtk_ppe-fix-possible-NULL-pointer-deref.patch @@ -0,0 +1,27 @@ +From: Lorenzo Bianconi +Date: Mon, 18 Jul 2022 11:51:53 +0200 +Subject: [PATCH] net: ethernet: mtk_ppe: fix possible NULL pointer dereference + in mtk_flow_get_wdma_info + +odev pointer can be NULL in mtk_flow_offload_replace routine according +to the flower action rules. Fix possible NULL pointer dereference in +mtk_flow_get_wdma_info. + +Fixes: a333215e10cb5 ("net: ethernet: mtk_eth_soc: implement flow offloading to WED devices") +Signed-off-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/4e1685bc4976e21e364055f6bee86261f8f9ee93.1658137753.git.lorenzo@kernel.org +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -93,6 +93,9 @@ mtk_flow_get_wdma_info(struct net_device + }; + struct net_device_path path = {}; + ++ if (!ctx.dev) ++ return -ENODEV; ++ + memcpy(ctx.daddr, addr, sizeof(ctx.daddr)); + + if (!IS_ENABLED(CONFIG_NET_MEDIATEK_SOC_WED)) diff --git a/target/linux/generic/backport-5.15/711-v6.0-03-net-ethernet-mtk-ppe-fix-traffic-offload-with-bridge.patch b/target/linux/generic/backport-5.15/711-v6.0-03-net-ethernet-mtk-ppe-fix-traffic-offload-with-bridge.patch new file mode 100644 index 0000000000..7e44fbb71b --- /dev/null +++ b/target/linux/generic/backport-5.15/711-v6.0-03-net-ethernet-mtk-ppe-fix-traffic-offload-with-bridge.patch @@ -0,0 +1,64 @@ +From: Lorenzo Bianconi +Date: Fri, 22 Jul 2022 09:06:19 +0200 +Subject: [PATCH] net: ethernet: mtk-ppe: fix traffic offload with bridged wlan + +A typical flow offload scenario for libreCMC users is routed traffic +received by the wan interface that is redirected to a wlan device +belonging to the lan bridge. Current implementation fails to +fill wdma offload info in mtk_flow_get_wdma_info() since odev device is +the local bridge. Fix the issue running dev_fill_forward_path routine in +mtk_flow_get_wdma_info in order to identify the wlan device. + +Tested-by: Paolo Valerio +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -88,32 +88,28 @@ mtk_flow_offload_mangle_eth(const struct + static int + mtk_flow_get_wdma_info(struct net_device *dev, const u8 *addr, struct mtk_wdma_info *info) + { +- struct net_device_path_ctx ctx = { +- .dev = dev, +- }; +- struct net_device_path path = {}; ++ struct net_device_path_stack stack; ++ struct net_device_path *path; ++ int err; + +- if (!ctx.dev) ++ if (!dev) + return -ENODEV; + +- memcpy(ctx.daddr, addr, sizeof(ctx.daddr)); +- + if (!IS_ENABLED(CONFIG_NET_MEDIATEK_SOC_WED)) + return -1; + +- if (!dev->netdev_ops->ndo_fill_forward_path) +- return -1; +- +- if (dev->netdev_ops->ndo_fill_forward_path(&ctx, &path)) +- return -1; ++ err = dev_fill_forward_path(dev, addr, &stack); ++ if (err) ++ return err; + +- if (path.type != DEV_PATH_MTK_WDMA) ++ path = &stack.path[stack.num_paths - 1]; ++ if (path->type != DEV_PATH_MTK_WDMA) + return -1; + +- info->wdma_idx = path.mtk_wdma.wdma_idx; +- info->queue = path.mtk_wdma.queue; +- info->bss = path.mtk_wdma.bss; +- info->wcid = path.mtk_wdma.wcid; ++ info->wdma_idx = path->mtk_wdma.wdma_idx; ++ info->queue = path->mtk_wdma.queue; ++ info->bss = path->mtk_wdma.bss; ++ info->wcid = path->mtk_wdma.wcid; + + return 0; + } diff --git a/target/linux/generic/backport-5.15/711-v6.0-04-net-ethernet-mtk_eth_soc-remove-mtk_foe_entry_timest.patch b/target/linux/generic/backport-5.15/711-v6.0-04-net-ethernet-mtk_eth_soc-remove-mtk_foe_entry_timest.patch new file mode 100644 index 0000000000..3c28e83551 --- /dev/null +++ b/target/linux/generic/backport-5.15/711-v6.0-04-net-ethernet-mtk_eth_soc-remove-mtk_foe_entry_timest.patch @@ -0,0 +1,33 @@ +From c9daab322313087afde8c46f41df3c628410ae20 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Mon, 5 Sep 2022 14:46:01 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: remove mtk_foe_entry_timestamp + +Get rid of mtk_foe_entry_timestamp routine since it is no longer used. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_ppe.h | 11 ----------- + 1 file changed, 11 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -302,17 +302,6 @@ mtk_ppe_check_skb(struct mtk_ppe *ppe, s + __mtk_ppe_check_skb(ppe, skb, hash); + } + +-static inline int +-mtk_foe_entry_timestamp(struct mtk_ppe *ppe, u16 hash) +-{ +- u32 ib1 = READ_ONCE(ppe->foe_table[hash].ib1); +- +- if (FIELD_GET(MTK_FOE_IB1_STATE, ib1) != MTK_FOE_STATE_BIND) +- return -1; +- +- return FIELD_GET(MTK_FOE_IB1_BIND_TIMESTAMP, ib1); +-} +- + int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto, + u8 pse_port, u8 *src_mac, u8 *dest_mac); + int mtk_foe_entry_set_pse_port(struct mtk_foe_entry *entry, u8 port); diff --git a/target/linux/generic/backport-5.15/712-v6.0-net-ethernet-mtk_eth_soc-enable-XDP-support-just-for.patch b/target/linux/generic/backport-5.15/712-v6.0-net-ethernet-mtk_eth_soc-enable-XDP-support-just-for.patch new file mode 100644 index 0000000000..f6fc734079 --- /dev/null +++ b/target/linux/generic/backport-5.15/712-v6.0-net-ethernet-mtk_eth_soc-enable-XDP-support-just-for.patch @@ -0,0 +1,35 @@ +From 5e69163d3b9931098922b3fc2f8e786af8c1f37e Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Tue, 13 Sep 2022 15:03:05 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: enable XDP support just for + MT7986 SoC +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Disable page_pool/XDP support for MT7621 SoC in order fix a regression +introduce adding XDP for MT7986 SoC. There is no a real use case for XDP +on MT7621 since it is a low-end cpu. Moreover this patch reduces the +memory footprint. + +Tested-by: Sergio Paracuellos +Tested-by: Arınç ÜNAL +Fixes: 23233e577ef9 ("net: ethernet: mtk_eth_soc: rely on page_pool for single page buffers") +Signed-off-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/2bf31e27b888c43228b0d84dd2ef5033338269e2.1663074002.git.lorenzo@kernel.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1413,7 +1413,7 @@ static void mtk_update_rx_cpu_idx(struct + + static bool mtk_page_pool_enabled(struct mtk_eth *eth) + { +- return !eth->hwlro; ++ return MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2); + } + + static struct page_pool *mtk_create_page_pool(struct mtk_eth *eth, diff --git a/target/linux/generic/backport-5.15/713-v6.0-net-ethernet-mtk_eth_soc-move-gdma_to_ppe-and-ppe_ba.patch b/target/linux/generic/backport-5.15/713-v6.0-net-ethernet-mtk_eth_soc-move-gdma_to_ppe-and-ppe_ba.patch new file mode 100644 index 0000000000..66e2778709 --- /dev/null +++ b/target/linux/generic/backport-5.15/713-v6.0-net-ethernet-mtk_eth_soc-move-gdma_to_ppe-and-ppe_ba.patch @@ -0,0 +1,127 @@ +From patchwork Thu Sep 8 19:33:38 2022 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Lorenzo Bianconi +X-Patchwork-Id: 12970556 +X-Patchwork-Delegate: kuba@kernel.org +From: Lorenzo Bianconi +To: netdev@vger.kernel.org +Cc: nbd@nbd.name, john@phrozen.org, sean.wang@mediatek.com, + Mark-MC.Lee@mediatek.com, davem@davemloft.net, edumazet@google.com, + kuba@kernel.org, pabeni@redhat.com, matthias.bgg@gmail.com, + linux-mediatek@lists.infradead.org, lorenzo.bianconi@redhat.com, + Bo.Jiao@mediatek.com, sujuan.chen@mediatek.com, + ryder.Lee@mediatek.com, evelyn.tsai@mediatek.com, + devicetree@vger.kernel.org, robh@kernel.org +Subject: [PATCH net-next 03/12] net: ethernet: mtk_eth_soc: move gdma_to_ppe + and ppe_base definitions in mtk register map +Date: Thu, 8 Sep 2022 21:33:37 +0200 +Message-Id: + <95938fc9cbe0223714be2658a49ca58e9baace00.1662661555.git.lorenzo@kernel.org> +X-Mailer: git-send-email 2.37.3 +In-Reply-To: +References: +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: netdev@vger.kernel.org +X-Patchwork-Delegate: kuba@kernel.org + +This is a preliminary patch to introduce mt7986 hw packet engine. + +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 15 +++++++++++---- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 3 ++- + drivers/net/ethernet/mediatek/mtk_ppe.h | 2 -- + 3 files changed, 13 insertions(+), 7 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -73,6 +73,8 @@ static const struct mtk_reg_map mtk_reg_ + .fq_blen = 0x1b2c, + }, + .gdm1_cnt = 0x2400, ++ .gdma_to_ppe0 = 0x4444, ++ .ppe_base = 0x0c00, + }; + + static const struct mtk_reg_map mt7628_reg_map = { +@@ -126,6 +128,8 @@ static const struct mtk_reg_map mt7986_r + .fq_blen = 0x472c, + }, + .gdm1_cnt = 0x1c00, ++ .gdma_to_ppe0 = 0x3333, ++ .ppe_base = 0x2000, + }; + + /* strings used by ethtool */ +@@ -2928,6 +2932,7 @@ static int mtk_open(struct net_device *d + + /* we run 2 netdevs on the same dma ring so we only bring it up once */ + if (!refcount_read(ð->dma_refcnt)) { ++ const struct mtk_soc_data *soc = eth->soc; + u32 gdm_config = MTK_GDMA_TO_PDMA; + int err; + +@@ -2937,15 +2942,15 @@ static int mtk_open(struct net_device *d + return err; + } + +- if (eth->soc->offload_version && mtk_ppe_start(eth->ppe) == 0) +- gdm_config = MTK_GDMA_TO_PPE; ++ if (soc->offload_version && mtk_ppe_start(eth->ppe) == 0) ++ gdm_config = soc->reg_map->gdma_to_ppe0; + + mtk_gdm_config(eth, gdm_config); + + napi_enable(ð->tx_napi); + napi_enable(ð->rx_napi); + mtk_tx_irq_enable(eth, MTK_TX_DONE_INT); +- mtk_rx_irq_enable(eth, eth->soc->txrx.rx_irq_done_mask); ++ mtk_rx_irq_enable(eth, soc->txrx.rx_irq_done_mask); + refcount_set(ð->dma_refcnt, 1); + } + else +@@ -4044,7 +4049,9 @@ static int mtk_probe(struct platform_dev + } + + if (eth->soc->offload_version) { +- eth->ppe = mtk_ppe_init(eth, eth->base + MTK_ETH_PPE_BASE, 2); ++ u32 ppe_addr = eth->soc->reg_map->ppe_base; ++ ++ eth->ppe = mtk_ppe_init(eth, eth->base + ppe_addr, 2); + if (!eth->ppe) { + err = -ENOMEM; + goto err_free_dev; +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -105,7 +105,6 @@ + #define MTK_GDMA_TCS_EN BIT(21) + #define MTK_GDMA_UCS_EN BIT(20) + #define MTK_GDMA_TO_PDMA 0x0 +-#define MTK_GDMA_TO_PPE 0x4444 + #define MTK_GDMA_DROP_ALL 0x7777 + + /* Unicast Filter MAC Address Register - Low */ +@@ -953,6 +952,8 @@ struct mtk_reg_map { + u32 fq_blen; /* fq free page buffer length */ + } qdma; + u32 gdm1_cnt; ++ u32 gdma_to_ppe0; ++ u32 ppe_base; + }; + + /* struct mtk_eth_data - This is the structure holding all differences +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -8,8 +8,6 @@ + #include + #include + +-#define MTK_ETH_PPE_BASE 0xc00 +- + #define MTK_PPE_ENTRIES_SHIFT 3 + #define MTK_PPE_ENTRIES (1024 << MTK_PPE_ENTRIES_SHIFT) + #define MTK_PPE_HASH_MASK (MTK_PPE_ENTRIES - 1) diff --git a/target/linux/generic/backport-5.15/714-v6.0-net-ethernet-mtk_eth_soc-move-ppe-table-hash-offset-.patch b/target/linux/generic/backport-5.15/714-v6.0-net-ethernet-mtk_eth_soc-move-ppe-table-hash-offset-.patch new file mode 100644 index 0000000000..1dfcc862d6 --- /dev/null +++ b/target/linux/generic/backport-5.15/714-v6.0-net-ethernet-mtk_eth_soc-move-ppe-table-hash-offset-.patch @@ -0,0 +1,199 @@ +From patchwork Thu Sep 8 19:33:38 2022 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Lorenzo Bianconi +X-Patchwork-Id: 12970557 +X-Patchwork-Delegate: kuba@kernel.org +From: Lorenzo Bianconi +To: netdev@vger.kernel.org +Cc: nbd@nbd.name, john@phrozen.org, sean.wang@mediatek.com, + Mark-MC.Lee@mediatek.com, davem@davemloft.net, edumazet@google.com, + kuba@kernel.org, pabeni@redhat.com, matthias.bgg@gmail.com, + linux-mediatek@lists.infradead.org, lorenzo.bianconi@redhat.com, + Bo.Jiao@mediatek.com, sujuan.chen@mediatek.com, + ryder.Lee@mediatek.com, evelyn.tsai@mediatek.com, + devicetree@vger.kernel.org, robh@kernel.org +Subject: [PATCH net-next 04/12] net: ethernet: mtk_eth_soc: move ppe table + hash offset to mtk_soc_data structure +Date: Thu, 8 Sep 2022 21:33:38 +0200 +Message-Id: + +X-Mailer: git-send-email 2.37.3 +In-Reply-To: +References: +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: netdev@vger.kernel.org +X-Patchwork-Delegate: kuba@kernel.org + +This is a preliminary patch to introduce mt7986 hw packet engine. + +Co-developed-by: Bo Jiao +Signed-off-by: Bo Jiao +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ++++ + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 ++ + drivers/net/ethernet/mediatek/mtk_ppe.c | 24 +++++++++++++++------ + drivers/net/ethernet/mediatek/mtk_ppe.h | 2 +- + 4 files changed, 25 insertions(+), 7 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4147,6 +4147,7 @@ static const struct mtk_soc_data mt7621_ + .required_clks = MT7621_CLKS_BITMAP, + .required_pctl = false, + .offload_version = 2, ++ .hash_offset = 2, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4165,6 +4166,7 @@ static const struct mtk_soc_data mt7622_ + .required_clks = MT7622_CLKS_BITMAP, + .required_pctl = false, + .offload_version = 2, ++ .hash_offset = 2, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4182,6 +4184,7 @@ static const struct mtk_soc_data mt7623_ + .required_clks = MT7623_CLKS_BITMAP, + .required_pctl = true, + .offload_version = 2, ++ .hash_offset = 2, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4215,6 +4218,7 @@ static const struct mtk_soc_data mt7986_ + .caps = MT7986_CAPS, + .required_clks = MT7986_CLKS_BITMAP, + .required_pctl = false, ++ .hash_offset = 4, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma_v2), + .rxd_size = sizeof(struct mtk_rx_dma_v2), +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -967,6 +967,7 @@ struct mtk_reg_map { + * the target SoC + * @required_pctl A bool value to show whether the SoC requires + * the extra setup for those pins used by GMAC. ++ * @hash_offset Flow table hash offset. + * @txd_size Tx DMA descriptor size. + * @rxd_size Rx DMA descriptor size. + * @rx_irq_done_mask Rx irq done register mask. +@@ -981,6 +982,7 @@ struct mtk_soc_data { + u32 required_clks; + bool required_pctl; + u8 offload_version; ++ u8 hash_offset; + netdev_features_t hw_features; + struct { + u32 txd_size; +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -88,7 +88,7 @@ static void mtk_ppe_cache_enable(struct + enable * MTK_PPE_CACHE_CTL_EN); + } + +-static u32 mtk_ppe_hash_entry(struct mtk_foe_entry *e) ++static u32 mtk_ppe_hash_entry(struct mtk_eth *eth, struct mtk_foe_entry *e) + { + u32 hv1, hv2, hv3; + u32 hash; +@@ -122,7 +122,7 @@ static u32 mtk_ppe_hash_entry(struct mtk + hash = (hash >> 24) | ((hash & 0xffffff) << 8); + hash ^= hv1 ^ hv2 ^ hv3; + hash ^= hash >> 16; +- hash <<= 1; ++ hash <<= (ffs(eth->soc->hash_offset) - 1); + hash &= MTK_PPE_ENTRIES - 1; + + return hash; +@@ -540,15 +540,16 @@ mtk_foe_entry_commit_l2(struct mtk_ppe * + int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { + int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->data.ib1); ++ const struct mtk_soc_data *soc = ppe->eth->soc; + u32 hash; + + if (type == MTK_PPE_PKT_TYPE_BRIDGE) + return mtk_foe_entry_commit_l2(ppe, entry); + +- hash = mtk_ppe_hash_entry(&entry->data); ++ hash = mtk_ppe_hash_entry(ppe->eth, &entry->data); + entry->hash = 0xffff; + spin_lock_bh(&ppe_lock); +- hlist_add_head(&entry->list, &ppe->foe_flow[hash / 2]); ++ hlist_add_head(&entry->list, &ppe->foe_flow[hash / soc->hash_offset]); + spin_unlock_bh(&ppe_lock); + + return 0; +@@ -558,6 +559,7 @@ static void + mtk_foe_entry_commit_subflow(struct mtk_ppe *ppe, struct mtk_flow_entry *entry, + u16 hash) + { ++ const struct mtk_soc_data *soc = ppe->eth->soc; + struct mtk_flow_entry *flow_info; + struct mtk_foe_entry foe, *hwe; + struct mtk_foe_mac_info *l2; +@@ -572,7 +574,8 @@ mtk_foe_entry_commit_subflow(struct mtk_ + flow_info->l2_data.base_flow = entry; + flow_info->type = MTK_FLOW_TYPE_L2_SUBFLOW; + flow_info->hash = hash; +- hlist_add_head(&flow_info->list, &ppe->foe_flow[hash / 2]); ++ hlist_add_head(&flow_info->list, ++ &ppe->foe_flow[hash / soc->hash_offset]); + hlist_add_head(&flow_info->l2_data.list, &entry->l2_flows); + + hwe = &ppe->foe_table[hash]; +@@ -596,7 +599,8 @@ mtk_foe_entry_commit_subflow(struct mtk_ + + void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash) + { +- struct hlist_head *head = &ppe->foe_flow[hash / 2]; ++ const struct mtk_soc_data *soc = ppe->eth->soc; ++ struct hlist_head *head = &ppe->foe_flow[hash / soc->hash_offset]; + struct mtk_foe_entry *hwe = &ppe->foe_table[hash]; + struct mtk_flow_entry *entry; + struct mtk_foe_bridge key = {}; +@@ -680,9 +684,11 @@ int mtk_foe_entry_idle_time(struct mtk_p + struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, + int version) + { ++ const struct mtk_soc_data *soc = eth->soc; + struct device *dev = eth->dev; + struct mtk_foe_entry *foe; + struct mtk_ppe *ppe; ++ u32 foe_flow_size; + + ppe = devm_kzalloc(dev, sizeof(*ppe), GFP_KERNEL); + if (!ppe) +@@ -705,6 +711,12 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ + + ppe->foe_table = foe; + ++ foe_flow_size = (MTK_PPE_ENTRIES / soc->hash_offset) * ++ sizeof(*ppe->foe_flow); ++ ppe->foe_flow = devm_kzalloc(dev, foe_flow_size, GFP_KERNEL); ++ if (!ppe->foe_flow) ++ return NULL; ++ + mtk_ppe_debugfs_init(ppe); + + return ppe; +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -270,7 +270,7 @@ struct mtk_ppe { + dma_addr_t foe_phys; + + u16 foe_check_time[MTK_PPE_ENTRIES]; +- struct hlist_head foe_flow[MTK_PPE_ENTRIES / 2]; ++ struct hlist_head *foe_flow; + + struct rhashtable l2_flows; + diff --git a/target/linux/generic/backport-5.15/715-v6.0-net-ethernet-mtk_eth_soc-add-the-capability-to-run-m.patch b/target/linux/generic/backport-5.15/715-v6.0-net-ethernet-mtk_eth_soc-add-the-capability-to-run-m.patch new file mode 100644 index 0000000000..e779d3b344 --- /dev/null +++ b/target/linux/generic/backport-5.15/715-v6.0-net-ethernet-mtk_eth_soc-add-the-capability-to-run-m.patch @@ -0,0 +1,318 @@ +From patchwork Thu Sep 8 19:33:39 2022 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Lorenzo Bianconi +X-Patchwork-Id: 12970559 +X-Patchwork-Delegate: kuba@kernel.org +Return-Path: +From: Lorenzo Bianconi +To: netdev@vger.kernel.org +Cc: nbd@nbd.name, john@phrozen.org, sean.wang@mediatek.com, + Mark-MC.Lee@mediatek.com, davem@davemloft.net, edumazet@google.com, + kuba@kernel.org, pabeni@redhat.com, matthias.bgg@gmail.com, + linux-mediatek@lists.infradead.org, lorenzo.bianconi@redhat.com, + Bo.Jiao@mediatek.com, sujuan.chen@mediatek.com, + ryder.Lee@mediatek.com, evelyn.tsai@mediatek.com, + devicetree@vger.kernel.org, robh@kernel.org +Subject: [PATCH net-next 05/12] net: ethernet: mtk_eth_soc: add the capability + to run multiple ppe +Date: Thu, 8 Sep 2022 21:33:39 +0200 +Message-Id: + +X-Mailer: git-send-email 2.37.3 +In-Reply-To: +References: +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: netdev@vger.kernel.org +X-Patchwork-Delegate: kuba@kernel.org + +mt7986 chipset support multiple packet engines for wlan <-> eth +packet forwarding. + +Co-developed-by: Bo Jiao +Signed-off-by: Bo Jiao +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 35 ++++++++++++------- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +- + drivers/net/ethernet/mediatek/mtk_ppe.c | 14 +++++--- + drivers/net/ethernet/mediatek/mtk_ppe.h | 9 +++-- + .../net/ethernet/mediatek/mtk_ppe_debugfs.c | 8 ++--- + .../net/ethernet/mediatek/mtk_ppe_offload.c | 13 +++---- + 6 files changed, 48 insertions(+), 33 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1872,7 +1872,7 @@ static int mtk_poll_rx(struct napi_struc + + reason = FIELD_GET(MTK_RXD4_PPE_CPU_REASON, trxd.rxd4); + if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) +- mtk_ppe_check_skb(eth->ppe, skb, hash); ++ mtk_ppe_check_skb(eth->ppe[0], skb, hash); + + if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) { + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { +@@ -2933,7 +2933,8 @@ static int mtk_open(struct net_device *d + /* we run 2 netdevs on the same dma ring so we only bring it up once */ + if (!refcount_read(ð->dma_refcnt)) { + const struct mtk_soc_data *soc = eth->soc; +- u32 gdm_config = MTK_GDMA_TO_PDMA; ++ u32 gdm_config; ++ int i; + int err; + + err = mtk_start_dma(eth); +@@ -2942,8 +2943,11 @@ static int mtk_open(struct net_device *d + return err; + } + +- if (soc->offload_version && mtk_ppe_start(eth->ppe) == 0) +- gdm_config = soc->reg_map->gdma_to_ppe0; ++ for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) ++ mtk_ppe_start(eth->ppe[i]); ++ ++ gdm_config = soc->offload_version ? soc->reg_map->gdma_to_ppe0 ++ : MTK_GDMA_TO_PDMA; + + mtk_gdm_config(eth, gdm_config); + +@@ -2988,6 +2992,7 @@ static int mtk_stop(struct net_device *d + { + struct mtk_mac *mac = netdev_priv(dev); + struct mtk_eth *eth = mac->hw; ++ int i; + + phylink_stop(mac->phylink); + +@@ -3015,8 +3020,8 @@ static int mtk_stop(struct net_device *d + + mtk_dma_free(eth); + +- if (eth->soc->offload_version) +- mtk_ppe_stop(eth->ppe); ++ for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) ++ mtk_ppe_stop(eth->ppe[i]); + + return 0; + } +@@ -4049,12 +4054,19 @@ static int mtk_probe(struct platform_dev + } + + if (eth->soc->offload_version) { +- u32 ppe_addr = eth->soc->reg_map->ppe_base; ++ u32 num_ppe; + +- eth->ppe = mtk_ppe_init(eth, eth->base + ppe_addr, 2); +- if (!eth->ppe) { +- err = -ENOMEM; +- goto err_free_dev; ++ num_ppe = MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) ? 2 : 1; ++ num_ppe = min_t(u32, ARRAY_SIZE(eth->ppe), num_ppe); ++ for (i = 0; i < num_ppe; i++) { ++ u32 ppe_addr = eth->soc->reg_map->ppe_base + i * 0x400; ++ ++ eth->ppe[i] = mtk_ppe_init(eth, eth->base + ppe_addr, ++ eth->soc->offload_version, i); ++ if (!eth->ppe[i]) { ++ err = -ENOMEM; ++ goto err_free_dev; ++ } + } + + err = mtk_eth_offload_init(eth); +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1112,7 +1112,7 @@ struct mtk_eth { + + int ip_align; + +- struct mtk_ppe *ppe; ++ struct mtk_ppe *ppe[2]; + struct rhashtable flow_table; + + struct bpf_prog __rcu *prog; +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -682,7 +682,7 @@ int mtk_foe_entry_idle_time(struct mtk_p + } + + struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, +- int version) ++ int version, int index) + { + const struct mtk_soc_data *soc = eth->soc; + struct device *dev = eth->dev; +@@ -717,7 +717,7 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ + if (!ppe->foe_flow) + return NULL; + +- mtk_ppe_debugfs_init(ppe); ++ mtk_ppe_debugfs_init(ppe, index); + + return ppe; + } +@@ -738,10 +738,13 @@ static void mtk_ppe_init_foe_table(struc + ppe->foe_table[i + skip[k]].ib1 |= MTK_FOE_IB1_STATIC; + } + +-int mtk_ppe_start(struct mtk_ppe *ppe) ++void mtk_ppe_start(struct mtk_ppe *ppe) + { + u32 val; + ++ if (!ppe) ++ return; ++ + mtk_ppe_init_foe_table(ppe); + ppe_w32(ppe, MTK_PPE_TB_BASE, ppe->foe_phys); + +@@ -809,8 +812,6 @@ int mtk_ppe_start(struct mtk_ppe *ppe) + ppe_w32(ppe, MTK_PPE_GLO_CFG, val); + + ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT, 0); +- +- return 0; + } + + int mtk_ppe_stop(struct mtk_ppe *ppe) +@@ -818,6 +819,9 @@ int mtk_ppe_stop(struct mtk_ppe *ppe) + u32 val; + int i; + ++ if (!ppe) ++ return 0; ++ + for (i = 0; i < MTK_PPE_ENTRIES; i++) + ppe->foe_table[i].ib1 = FIELD_PREP(MTK_FOE_IB1_STATE, + MTK_FOE_STATE_INVALID); +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -247,6 +247,7 @@ struct mtk_flow_entry { + }; + u8 type; + s8 wed_index; ++ u8 ppe_index; + u16 hash; + union { + struct mtk_foe_entry data; +@@ -265,6 +266,7 @@ struct mtk_ppe { + struct device *dev; + void __iomem *base; + int version; ++ char dirname[5]; + + struct mtk_foe_entry *foe_table; + dma_addr_t foe_phys; +@@ -277,8 +279,9 @@ struct mtk_ppe { + void *acct_table; + }; + +-struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version); +-int mtk_ppe_start(struct mtk_ppe *ppe); ++struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, ++ int version, int index); ++void mtk_ppe_start(struct mtk_ppe *ppe); + int mtk_ppe_stop(struct mtk_ppe *ppe); + + void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash); +@@ -317,6 +320,6 @@ int mtk_foe_entry_set_wdma(struct mtk_fo + int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); + void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); + int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); +-int mtk_ppe_debugfs_init(struct mtk_ppe *ppe); ++int mtk_ppe_debugfs_init(struct mtk_ppe *ppe, int index); + + #endif +--- a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c +@@ -187,7 +187,7 @@ mtk_ppe_debugfs_foe_open_bind(struct ino + inode->i_private); + } + +-int mtk_ppe_debugfs_init(struct mtk_ppe *ppe) ++int mtk_ppe_debugfs_init(struct mtk_ppe *ppe, int index) + { + static const struct file_operations fops_all = { + .open = mtk_ppe_debugfs_foe_open_all, +@@ -195,17 +195,17 @@ int mtk_ppe_debugfs_init(struct mtk_ppe + .llseek = seq_lseek, + .release = single_release, + }; +- + static const struct file_operations fops_bind = { + .open = mtk_ppe_debugfs_foe_open_bind, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, + }; +- + struct dentry *root; + +- root = debugfs_create_dir("mtk_ppe", NULL); ++ snprintf(ppe->dirname, sizeof(ppe->dirname), "ppe%d", index); ++ ++ root = debugfs_create_dir(ppe->dirname, NULL); + if (!root) + return -ENOMEM; + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -434,7 +434,7 @@ mtk_flow_offload_replace(struct mtk_eth + memcpy(&entry->data, &foe, sizeof(entry->data)); + entry->wed_index = wed_index; + +- err = mtk_foe_entry_commit(eth->ppe, entry); ++ err = mtk_foe_entry_commit(eth->ppe[entry->ppe_index], entry); + if (err < 0) + goto free; + +@@ -446,7 +446,7 @@ mtk_flow_offload_replace(struct mtk_eth + return 0; + + clear: +- mtk_foe_entry_clear(eth->ppe, entry); ++ mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry); + free: + kfree(entry); + if (wed_index >= 0) +@@ -464,7 +464,7 @@ mtk_flow_offload_destroy(struct mtk_eth + if (!entry) + return -ENOENT; + +- mtk_foe_entry_clear(eth->ppe, entry); ++ mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry); + rhashtable_remove_fast(ð->flow_table, &entry->node, + mtk_flow_ht_params); + if (entry->wed_index >= 0) +@@ -485,7 +485,7 @@ mtk_flow_offload_stats(struct mtk_eth *e + if (!entry) + return -ENOENT; + +- idle = mtk_foe_entry_idle_time(eth->ppe, entry); ++ idle = mtk_foe_entry_idle_time(eth->ppe[entry->ppe_index], entry); + f->stats.lastused = jiffies - idle * HZ; + + return 0; +@@ -537,7 +537,7 @@ mtk_eth_setup_tc_block(struct net_device + struct flow_block_cb *block_cb; + flow_setup_cb_t *cb; + +- if (!eth->ppe || !eth->ppe->foe_table) ++ if (!eth->soc->offload_version) + return -EOPNOTSUPP; + + if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) +@@ -590,8 +590,5 @@ int mtk_eth_setup_tc(struct net_device * + + int mtk_eth_offload_init(struct mtk_eth *eth) + { +- if (!eth->ppe || !eth->ppe->foe_table) +- return 0; +- + return rhashtable_init(ð->flow_table, &mtk_flow_ht_params); + } diff --git a/target/linux/generic/backport-5.15/716-v6.0-net-ethernet-mtk_eth_soc-move-wdma_base-definitions-.patch b/target/linux/generic/backport-5.15/716-v6.0-net-ethernet-mtk_eth_soc-move-wdma_base-definitions-.patch new file mode 100644 index 0000000000..f93285642d --- /dev/null +++ b/target/linux/generic/backport-5.15/716-v6.0-net-ethernet-mtk_eth_soc-move-wdma_base-definitions-.patch @@ -0,0 +1,80 @@ +From 0dcbe607cec32ccae23b02a641b8bd6191a328ae Mon Sep 17 00:00:00 2001 +Message-Id: <0dcbe607cec32ccae23b02a641b8bd6191a328ae.1662243796.git.lorenzo@kernel.org> +In-Reply-To: <43a21841ce0175d29f23c34a65ceaaf9dd7eb8b7.1662243796.git.lorenzo@kernel.org> +References: <43a21841ce0175d29f23c34a65ceaaf9dd7eb8b7.1662243796.git.lorenzo@kernel.org> +From: Lorenzo Bianconi +Date: Tue, 23 Aug 2022 23:09:05 +0200 +Subject: [PATCH net-next 2/4] net: ethernet: mtk_eth_soc: move wdma_base + definitions in mtk register map + +This is a preliminary patch to introduce mt7986 wed support. + +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 16 ++++++++++------ + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 4 +--- + 2 files changed, 11 insertions(+), 9 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -75,6 +75,10 @@ static const struct mtk_reg_map mtk_reg_ + .gdm1_cnt = 0x2400, + .gdma_to_ppe0 = 0x4444, + .ppe_base = 0x0c00, ++ .wdma_base = { ++ [0] = 0x2800, ++ [1] = 0x2c00, ++ }, + }; + + static const struct mtk_reg_map mt7628_reg_map = { +@@ -130,6 +134,10 @@ static const struct mtk_reg_map mt7986_r + .gdm1_cnt = 0x1c00, + .gdma_to_ppe0 = 0x3333, + .ppe_base = 0x2000, ++ .wdma_base = { ++ [0] = 0x4800, ++ [1] = 0x4c00, ++ }, + }; + + /* strings used by ethtool */ +@@ -3966,16 +3974,12 @@ static int mtk_probe(struct platform_dev + for (i = 0;; i++) { + struct device_node *np = of_parse_phandle(pdev->dev.of_node, + "mediatek,wed", i); +- static const u32 wdma_regs[] = { +- MTK_WDMA0_BASE, +- MTK_WDMA1_BASE +- }; + void __iomem *wdma; + +- if (!np || i >= ARRAY_SIZE(wdma_regs)) ++ if (!np || i >= ARRAY_SIZE(eth->soc->reg_map->wdma_base)) + break; + +- wdma = eth->base + wdma_regs[i]; ++ wdma = eth->base + eth->soc->reg_map->wdma_base[i]; + mtk_wed_add_hw(np, eth, wdma, i); + } + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -268,9 +268,6 @@ + #define TX_DMA_FPORT_MASK_V2 0xf + #define TX_DMA_SWC_V2 BIT(30) + +-#define MTK_WDMA0_BASE 0x2800 +-#define MTK_WDMA1_BASE 0x2c00 +- + /* QDMA descriptor txd4 */ + #define TX_DMA_CHKSUM (0x7 << 29) + #define TX_DMA_TSO BIT(28) +@@ -954,6 +951,7 @@ struct mtk_reg_map { + u32 gdm1_cnt; + u32 gdma_to_ppe0; + u32 ppe_base; ++ u32 wdma_base[2]; + }; + + /* struct mtk_eth_data - This is the structure holding all differences diff --git a/target/linux/generic/backport-5.15/717-v6.0-net-ethernet-mtk_eth_soc-add-foe_entry_size-to-mtk_e.patch b/target/linux/generic/backport-5.15/717-v6.0-net-ethernet-mtk_eth_soc-add-foe_entry_size-to-mtk_e.patch new file mode 100644 index 0000000000..656a60b15a --- /dev/null +++ b/target/linux/generic/backport-5.15/717-v6.0-net-ethernet-mtk_eth_soc-add-foe_entry_size-to-mtk_e.patch @@ -0,0 +1,251 @@ +From e3c27d869fccc1f2b8d0b4cde4763ab223874e8c Mon Sep 17 00:00:00 2001 +Message-Id: +In-Reply-To: <43a21841ce0175d29f23c34a65ceaaf9dd7eb8b7.1662243796.git.lorenzo@kernel.org> +References: <43a21841ce0175d29f23c34a65ceaaf9dd7eb8b7.1662243796.git.lorenzo@kernel.org> +From: Lorenzo Bianconi +Date: Sun, 21 Aug 2022 17:51:17 +0200 +Subject: [PATCH net-next 3/4] net: ethernet: mtk_eth_soc: add foe_entry_size + to mtk_eth_soc + +Introduce foe_entry_size to mtk_eth_soc data structure since mt7986 +relies on a bigger mtk_foe_entry data structure. + +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 3 + + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 10 ++++ + drivers/net/ethernet/mediatek/mtk_ppe.c | 55 +++++++++++-------- + drivers/net/ethernet/mediatek/mtk_ppe.h | 2 +- + .../net/ethernet/mediatek/mtk_ppe_debugfs.c | 2 +- + 5 files changed, 48 insertions(+), 24 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4164,6 +4164,7 @@ static const struct mtk_soc_data mt7621_ + .required_pctl = false, + .offload_version = 2, + .hash_offset = 2, ++ .foe_entry_size = sizeof(struct mtk_foe_entry), + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4183,6 +4184,7 @@ static const struct mtk_soc_data mt7622_ + .required_pctl = false, + .offload_version = 2, + .hash_offset = 2, ++ .foe_entry_size = sizeof(struct mtk_foe_entry), + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4201,6 +4203,7 @@ static const struct mtk_soc_data mt7623_ + .required_pctl = true, + .offload_version = 2, + .hash_offset = 2, ++ .foe_entry_size = sizeof(struct mtk_foe_entry), + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -966,6 +966,7 @@ struct mtk_reg_map { + * @required_pctl A bool value to show whether the SoC requires + * the extra setup for those pins used by GMAC. + * @hash_offset Flow table hash offset. ++ * @foe_entry_size Foe table entry size. + * @txd_size Tx DMA descriptor size. + * @rxd_size Rx DMA descriptor size. + * @rx_irq_done_mask Rx irq done register mask. +@@ -981,6 +982,7 @@ struct mtk_soc_data { + bool required_pctl; + u8 offload_version; + u8 hash_offset; ++ u16 foe_entry_size; + netdev_features_t hw_features; + struct { + u32 txd_size; +@@ -1141,6 +1143,14 @@ struct mtk_mac { + /* the struct describing the SoC. these are declared in the soc_xyz.c files */ + extern const struct of_device_id of_mtk_match[]; + ++static inline struct mtk_foe_entry * ++mtk_foe_get_entry(struct mtk_ppe *ppe, u16 hash) ++{ ++ const struct mtk_soc_data *soc = ppe->eth->soc; ++ ++ return ppe->foe_table + hash * soc->foe_entry_size; ++} ++ + /* read the hardware status register */ + void mtk_stats_update_mac(struct mtk_mac *mac); + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -410,9 +410,10 @@ __mtk_foe_entry_clear(struct mtk_ppe *pp + + hlist_del_init(&entry->list); + if (entry->hash != 0xffff) { +- ppe->foe_table[entry->hash].ib1 &= ~MTK_FOE_IB1_STATE; +- ppe->foe_table[entry->hash].ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, +- MTK_FOE_STATE_BIND); ++ struct mtk_foe_entry *hwe = mtk_foe_get_entry(ppe, entry->hash); ++ ++ hwe->ib1 &= ~MTK_FOE_IB1_STATE; ++ hwe->ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND); + dma_wmb(); + } + entry->hash = 0xffff; +@@ -451,7 +452,7 @@ mtk_flow_entry_update_l2(struct mtk_ppe + int cur_idle; + u32 ib1; + +- hwe = &ppe->foe_table[cur->hash]; ++ hwe = mtk_foe_get_entry(ppe, cur->hash); + ib1 = READ_ONCE(hwe->ib1); + + if (FIELD_GET(MTK_FOE_IB1_STATE, ib1) != MTK_FOE_STATE_BIND) { +@@ -473,8 +474,8 @@ mtk_flow_entry_update_l2(struct mtk_ppe + static void + mtk_flow_entry_update(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { ++ struct mtk_foe_entry foe = {}; + struct mtk_foe_entry *hwe; +- struct mtk_foe_entry foe; + + spin_lock_bh(&ppe_lock); + +@@ -486,8 +487,8 @@ mtk_flow_entry_update(struct mtk_ppe *pp + if (entry->hash == 0xffff) + goto out; + +- hwe = &ppe->foe_table[entry->hash]; +- memcpy(&foe, hwe, sizeof(foe)); ++ hwe = mtk_foe_get_entry(ppe, entry->hash); ++ memcpy(&foe, hwe, ppe->eth->soc->foe_entry_size); + if (!mtk_flow_entry_match(entry, &foe)) { + entry->hash = 0xffff; + goto out; +@@ -511,8 +512,8 @@ __mtk_foe_entry_commit(struct mtk_ppe *p + entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP; + entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_TIMESTAMP, timestamp); + +- hwe = &ppe->foe_table[hash]; +- memcpy(&hwe->data, &entry->data, sizeof(hwe->data)); ++ hwe = mtk_foe_get_entry(ppe, hash); ++ memcpy(&hwe->data, &entry->data, ppe->eth->soc->foe_entry_size); + wmb(); + hwe->ib1 = entry->ib1; + +@@ -561,7 +562,7 @@ mtk_foe_entry_commit_subflow(struct mtk_ + { + const struct mtk_soc_data *soc = ppe->eth->soc; + struct mtk_flow_entry *flow_info; +- struct mtk_foe_entry foe, *hwe; ++ struct mtk_foe_entry foe = {}, *hwe; + struct mtk_foe_mac_info *l2; + u32 ib1_mask = MTK_FOE_IB1_PACKET_TYPE | MTK_FOE_IB1_UDP; + int type; +@@ -578,8 +579,8 @@ mtk_foe_entry_commit_subflow(struct mtk_ + &ppe->foe_flow[hash / soc->hash_offset]); + hlist_add_head(&flow_info->l2_data.list, &entry->l2_flows); + +- hwe = &ppe->foe_table[hash]; +- memcpy(&foe, hwe, sizeof(foe)); ++ hwe = mtk_foe_get_entry(ppe, hash); ++ memcpy(&foe, hwe, soc->foe_entry_size); + foe.ib1 &= ib1_mask; + foe.ib1 |= entry->data.ib1 & ~ib1_mask; + +@@ -601,7 +602,7 @@ void __mtk_ppe_check_skb(struct mtk_ppe + { + const struct mtk_soc_data *soc = ppe->eth->soc; + struct hlist_head *head = &ppe->foe_flow[hash / soc->hash_offset]; +- struct mtk_foe_entry *hwe = &ppe->foe_table[hash]; ++ struct mtk_foe_entry *hwe = mtk_foe_get_entry(ppe, hash); + struct mtk_flow_entry *entry; + struct mtk_foe_bridge key = {}; + struct hlist_node *n; +@@ -686,9 +687,9 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ + { + const struct mtk_soc_data *soc = eth->soc; + struct device *dev = eth->dev; +- struct mtk_foe_entry *foe; + struct mtk_ppe *ppe; + u32 foe_flow_size; ++ void *foe; + + ppe = devm_kzalloc(dev, sizeof(*ppe), GFP_KERNEL); + if (!ppe) +@@ -704,7 +705,8 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ + ppe->dev = dev; + ppe->version = version; + +- foe = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*foe), ++ foe = dmam_alloc_coherent(ppe->dev, ++ MTK_PPE_ENTRIES * soc->foe_entry_size, + &ppe->foe_phys, GFP_KERNEL); + if (!foe) + return NULL; +@@ -727,15 +729,21 @@ static void mtk_ppe_init_foe_table(struc + static const u8 skip[] = { 12, 25, 38, 51, 76, 89, 102 }; + int i, k; + +- memset(ppe->foe_table, 0, MTK_PPE_ENTRIES * sizeof(*ppe->foe_table)); ++ memset(ppe->foe_table, 0, ++ MTK_PPE_ENTRIES * ppe->eth->soc->foe_entry_size); + + if (!IS_ENABLED(CONFIG_SOC_MT7621)) + return; + + /* skip all entries that cross the 1024 byte boundary */ +- for (i = 0; i < MTK_PPE_ENTRIES; i += 128) +- for (k = 0; k < ARRAY_SIZE(skip); k++) +- ppe->foe_table[i + skip[k]].ib1 |= MTK_FOE_IB1_STATIC; ++ for (i = 0; i < MTK_PPE_ENTRIES; i += 128) { ++ for (k = 0; k < ARRAY_SIZE(skip); k++) { ++ struct mtk_foe_entry *hwe; ++ ++ hwe = mtk_foe_get_entry(ppe, i + skip[k]); ++ hwe->ib1 |= MTK_FOE_IB1_STATIC; ++ } ++ } + } + + void mtk_ppe_start(struct mtk_ppe *ppe) +@@ -822,9 +830,12 @@ int mtk_ppe_stop(struct mtk_ppe *ppe) + if (!ppe) + return 0; + +- for (i = 0; i < MTK_PPE_ENTRIES; i++) +- ppe->foe_table[i].ib1 = FIELD_PREP(MTK_FOE_IB1_STATE, +- MTK_FOE_STATE_INVALID); ++ for (i = 0; i < MTK_PPE_ENTRIES; i++) { ++ struct mtk_foe_entry *hwe = mtk_foe_get_entry(ppe, i); ++ ++ hwe->ib1 = FIELD_PREP(MTK_FOE_IB1_STATE, ++ MTK_FOE_STATE_INVALID); ++ } + + mtk_ppe_cache_enable(ppe, false); + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -268,7 +268,7 @@ struct mtk_ppe { + int version; + char dirname[5]; + +- struct mtk_foe_entry *foe_table; ++ void *foe_table; + dma_addr_t foe_phys; + + u16 foe_check_time[MTK_PPE_ENTRIES]; +--- a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c +@@ -79,7 +79,7 @@ mtk_ppe_debugfs_foe_show(struct seq_file + int i; + + for (i = 0; i < MTK_PPE_ENTRIES; i++) { +- struct mtk_foe_entry *entry = &ppe->foe_table[i]; ++ struct mtk_foe_entry *entry = mtk_foe_get_entry(ppe, i); + struct mtk_foe_mac_info *l2; + struct mtk_flow_addr_info ai = {}; + unsigned char h_source[ETH_ALEN]; diff --git a/target/linux/generic/backport-5.15/718-v6.0-net-ethernet-mtk_eth_soc-fix-typo-in-__mtk_foe_entry.patch b/target/linux/generic/backport-5.15/718-v6.0-net-ethernet-mtk_eth_soc-fix-typo-in-__mtk_foe_entry.patch new file mode 100644 index 0000000000..77daf6c8bf --- /dev/null +++ b/target/linux/generic/backport-5.15/718-v6.0-net-ethernet-mtk_eth_soc-fix-typo-in-__mtk_foe_entry.patch @@ -0,0 +1,27 @@ +From 12ff69304c83c679ca01ef3db963ab0db9de19fb Mon Sep 17 00:00:00 2001 +Message-Id: <12ff69304c83c679ca01ef3db963ab0db9de19fb.1662332102.git.lorenzo@kernel.org> +In-Reply-To: <2a60545635c2705312299384f4e9fec2f2a3acd6.1662332102.git.lorenzo@kernel.org> +References: <2a60545635c2705312299384f4e9fec2f2a3acd6.1662332102.git.lorenzo@kernel.org> +From: Lorenzo Bianconi +Date: Mon, 5 Sep 2022 00:43:43 +0200 +Subject: [PATCH net-next 2/6] net: ethernet: mtk_eth_soc: fix typo in + __mtk_foe_entry_clear + +Set ib1 state to MTK_FOE_STATE_UNBIND in __mtk_foe_entry_clear routine. + +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_ppe.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -413,7 +413,7 @@ __mtk_foe_entry_clear(struct mtk_ppe *pp + struct mtk_foe_entry *hwe = mtk_foe_get_entry(ppe, entry->hash); + + hwe->ib1 &= ~MTK_FOE_IB1_STATE; +- hwe->ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND); ++ hwe->ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_UNBIND); + dma_wmb(); + } + entry->hash = 0xffff; diff --git a/target/linux/generic/backport-5.15/719-v6.0-net-ethernet-mtk_eth_soc-check-max-allowed-value-in-.patch b/target/linux/generic/backport-5.15/719-v6.0-net-ethernet-mtk_eth_soc-check-max-allowed-value-in-.patch new file mode 100644 index 0000000000..7ab6d486b2 --- /dev/null +++ b/target/linux/generic/backport-5.15/719-v6.0-net-ethernet-mtk_eth_soc-check-max-allowed-value-in-.patch @@ -0,0 +1,28 @@ +From 4253e6e2b795a18ab534adcd5c313d3fc4150975 Mon Sep 17 00:00:00 2001 +Message-Id: <4253e6e2b795a18ab534adcd5c313d3fc4150975.1662332102.git.lorenzo@kernel.org> +In-Reply-To: <2a60545635c2705312299384f4e9fec2f2a3acd6.1662332102.git.lorenzo@kernel.org> +References: <2a60545635c2705312299384f4e9fec2f2a3acd6.1662332102.git.lorenzo@kernel.org> +From: Lorenzo Bianconi +Date: Mon, 5 Sep 2022 00:48:52 +0200 +Subject: [PATCH net-next 3/6] net: ethernet: mtk_eth_soc: check max allowed + value in mtk_ppe_check_skb + +Check theoretical OOB accesses in mtk_ppe_check_skb routine + +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_ppe.h | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -294,6 +294,9 @@ mtk_ppe_check_skb(struct mtk_ppe *ppe, s + if (!ppe) + return; + ++ if (hash > MTK_PPE_HASH_MASK) ++ return; ++ + now = (u16)jiffies; + diff = now - ppe->foe_check_time[hash]; + if (diff < HZ / 10) diff --git a/target/linux/generic/backport-5.15/720-v6.0-net-ethernet-mtk_eth_wed-add-mtk_wed_configure_irq-a.patch b/target/linux/generic/backport-5.15/720-v6.0-net-ethernet-mtk_eth_wed-add-mtk_wed_configure_irq-a.patch new file mode 100644 index 0000000000..a8c88daf1f --- /dev/null +++ b/target/linux/generic/backport-5.15/720-v6.0-net-ethernet-mtk_eth_wed-add-mtk_wed_configure_irq-a.patch @@ -0,0 +1,189 @@ +From e5ecb4f619197b93fa682d722452dc8412864cdb Mon Sep 17 00:00:00 2001 +Message-Id: +From: Lorenzo Bianconi +Date: Fri, 26 Aug 2022 01:12:57 +0200 +Subject: [PATCH net-next 1/5] net: ethernet: mtk_eth_wed: add + mtk_wed_configure_irq and mtk_wed_dma_{enable/disable} + +Introduce mtk_wed_configure_irq, mtk_wed_dma_enable and mtk_wed_dma_disable +utility routines. +This is a preliminary patch to introduce mt7986 wed support. + +Co-developed-by: Bo Jiao +Signed-off-by: Bo Jiao +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_wed.c | 87 +++++++++++++------- + drivers/net/ethernet/mediatek/mtk_wed_regs.h | 6 +- + 2 files changed, 64 insertions(+), 29 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -237,9 +237,30 @@ mtk_wed_set_ext_int(struct mtk_wed_devic + } + + static void +-mtk_wed_stop(struct mtk_wed_device *dev) ++mtk_wed_dma_disable(struct mtk_wed_device *dev) + { ++ wed_clr(dev, MTK_WED_WPDMA_GLO_CFG, ++ MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN | ++ MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN); ++ ++ wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_RX_DRV_EN); ++ ++ wed_clr(dev, MTK_WED_GLO_CFG, ++ MTK_WED_GLO_CFG_TX_DMA_EN | ++ MTK_WED_GLO_CFG_RX_DMA_EN); ++ + regmap_write(dev->hw->mirror, dev->hw->index * 4, 0); ++ wdma_m32(dev, MTK_WDMA_GLO_CFG, ++ MTK_WDMA_GLO_CFG_TX_DMA_EN | ++ MTK_WDMA_GLO_CFG_RX_INFO1_PRERES | ++ MTK_WDMA_GLO_CFG_RX_INFO2_PRERES | ++ MTK_WDMA_GLO_CFG_RX_INFO3_PRERES, 0); ++} ++ ++static void ++mtk_wed_stop(struct mtk_wed_device *dev) ++{ ++ mtk_wed_dma_disable(dev); + mtk_wed_set_ext_int(dev, false); + + wed_clr(dev, MTK_WED_CTRL, +@@ -252,15 +273,6 @@ mtk_wed_stop(struct mtk_wed_device *dev) + wdma_w32(dev, MTK_WDMA_INT_MASK, 0); + wdma_w32(dev, MTK_WDMA_INT_GRP2, 0); + wed_w32(dev, MTK_WED_WPDMA_INT_MASK, 0); +- +- wed_clr(dev, MTK_WED_GLO_CFG, +- MTK_WED_GLO_CFG_TX_DMA_EN | +- MTK_WED_GLO_CFG_RX_DMA_EN); +- wed_clr(dev, MTK_WED_WPDMA_GLO_CFG, +- MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN | +- MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN); +- wed_clr(dev, MTK_WED_WDMA_GLO_CFG, +- MTK_WED_WDMA_GLO_CFG_RX_DRV_EN); + } + + static void +@@ -313,7 +325,10 @@ mtk_wed_hw_init_early(struct mtk_wed_dev + MTK_WED_WDMA_GLO_CFG_IDLE_DMAD_SUPPLY; + wed_m32(dev, MTK_WED_WDMA_GLO_CFG, mask, set); + +- wdma_set(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_RX_INFO_PRERES); ++ wdma_set(dev, MTK_WDMA_GLO_CFG, ++ MTK_WDMA_GLO_CFG_RX_INFO1_PRERES | ++ MTK_WDMA_GLO_CFG_RX_INFO2_PRERES | ++ MTK_WDMA_GLO_CFG_RX_INFO3_PRERES); + + offset = dev->hw->index ? 0x04000400 : 0; + wed_w32(dev, MTK_WED_WDMA_OFFSET0, 0x2a042a20 + offset); +@@ -520,43 +535,38 @@ mtk_wed_wdma_ring_setup(struct mtk_wed_d + } + + static void +-mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask) ++mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask) + { +- u32 wdma_mask; +- u32 val; +- int i; +- +- for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) +- if (!dev->tx_wdma[i].desc) +- mtk_wed_wdma_ring_setup(dev, i, 16); +- +- wdma_mask = FIELD_PREP(MTK_WDMA_INT_MASK_RX_DONE, GENMASK(1, 0)); +- +- mtk_wed_hw_init(dev); ++ u32 wdma_mask = FIELD_PREP(MTK_WDMA_INT_MASK_RX_DONE, GENMASK(1, 0)); + ++ /* wed control cr set */ + wed_set(dev, MTK_WED_CTRL, + MTK_WED_CTRL_WDMA_INT_AGENT_EN | + MTK_WED_CTRL_WPDMA_INT_AGENT_EN | + MTK_WED_CTRL_WED_TX_BM_EN | + MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); + +- wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, MTK_WED_PCIE_INT_TRIGGER_STATUS); ++ wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, ++ MTK_WED_PCIE_INT_TRIGGER_STATUS); + + wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, + MTK_WED_WPDMA_INT_TRIGGER_RX_DONE | + MTK_WED_WPDMA_INT_TRIGGER_TX_DONE); + +- wed_set(dev, MTK_WED_WPDMA_INT_CTRL, +- MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV); +- ++ /* initail wdma interrupt agent */ + wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, wdma_mask); + wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask); + + wdma_w32(dev, MTK_WDMA_INT_MASK, wdma_mask); + wdma_w32(dev, MTK_WDMA_INT_GRP2, wdma_mask); +- + wed_w32(dev, MTK_WED_WPDMA_INT_MASK, irq_mask); + wed_w32(dev, MTK_WED_INT_MASK, irq_mask); ++} ++ ++static void ++mtk_wed_dma_enable(struct mtk_wed_device *dev) ++{ ++ wed_set(dev, MTK_WED_WPDMA_INT_CTRL, MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV); + + wed_set(dev, MTK_WED_GLO_CFG, + MTK_WED_GLO_CFG_TX_DMA_EN | +@@ -567,6 +577,26 @@ mtk_wed_start(struct mtk_wed_device *dev + wed_set(dev, MTK_WED_WDMA_GLO_CFG, + MTK_WED_WDMA_GLO_CFG_RX_DRV_EN); + ++ wdma_set(dev, MTK_WDMA_GLO_CFG, ++ MTK_WDMA_GLO_CFG_TX_DMA_EN | ++ MTK_WDMA_GLO_CFG_RX_INFO1_PRERES | ++ MTK_WDMA_GLO_CFG_RX_INFO2_PRERES | ++ MTK_WDMA_GLO_CFG_RX_INFO3_PRERES); ++} ++ ++static void ++mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask) ++{ ++ u32 val; ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) ++ if (!dev->tx_wdma[i].desc) ++ mtk_wed_wdma_ring_setup(dev, i, 16); ++ ++ mtk_wed_hw_init(dev); ++ mtk_wed_configure_irq(dev, irq_mask); ++ + mtk_wed_set_ext_int(dev, true); + val = dev->wlan.wpdma_phys | + MTK_PCIE_MIRROR_MAP_EN | +@@ -577,6 +607,7 @@ mtk_wed_start(struct mtk_wed_device *dev + val |= BIT(0); + regmap_write(dev->hw->mirror, dev->hw->index * 4, val); + ++ mtk_wed_dma_enable(dev); + dev->running = true; + } + +--- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h +@@ -224,7 +224,11 @@ struct mtk_wdma_desc { + #define MTK_WDMA_RING_RX(_n) (0x100 + (_n) * 0x10) + + #define MTK_WDMA_GLO_CFG 0x204 +-#define MTK_WDMA_GLO_CFG_RX_INFO_PRERES GENMASK(28, 26) ++#define MTK_WDMA_GLO_CFG_TX_DMA_EN BIT(0) ++#define MTK_WDMA_GLO_CFG_RX_DMA_EN BIT(2) ++#define MTK_WDMA_GLO_CFG_RX_INFO3_PRERES BIT(26) ++#define MTK_WDMA_GLO_CFG_RX_INFO2_PRERES BIT(27) ++#define MTK_WDMA_GLO_CFG_RX_INFO1_PRERES BIT(28) + + #define MTK_WDMA_RESET_IDX 0x208 + #define MTK_WDMA_RESET_IDX_TX GENMASK(3, 0) diff --git a/target/linux/generic/backport-5.15/721-v6.0-net-ethernet-mtk_eth_wed-add-wed-support-for-mt7986-.patch b/target/linux/generic/backport-5.15/721-v6.0-net-ethernet-mtk_eth_wed-add-wed-support-for-mt7986-.patch new file mode 100644 index 0000000000..f28997c7b2 --- /dev/null +++ b/target/linux/generic/backport-5.15/721-v6.0-net-ethernet-mtk_eth_wed-add-wed-support-for-mt7986-.patch @@ -0,0 +1,942 @@ +From 463a71af080fbc77339bee2037fb1e081e3824f7 Mon Sep 17 00:00:00 2001 +Message-Id: <463a71af080fbc77339bee2037fb1e081e3824f7.1662886034.git.lorenzo@kernel.org> +In-Reply-To: +References: +From: Lorenzo Bianconi +Date: Sat, 27 Aug 2022 16:15:14 +0200 +Subject: [PATCH net-next 2/5] net: ethernet: mtk_eth_wed: add wed support for + mt7986 chipset + +Introduce Wireless Etherne Dispatcher support on transmission side +for mt7986 chipset + +Co-developed-by: Bo Jiao +Signed-off-by: Bo Jiao +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 34 +- + drivers/net/ethernet/mediatek/mtk_wed.c | 371 ++++++++++++++---- + drivers/net/ethernet/mediatek/mtk_wed.h | 8 +- + .../net/ethernet/mediatek/mtk_wed_debugfs.c | 3 + + drivers/net/ethernet/mediatek/mtk_wed_regs.h | 81 +++- + include/linux/soc/mediatek/mtk_wed.h | 8 + + 6 files changed, 408 insertions(+), 97 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3891,6 +3891,7 @@ void mtk_eth_set_dma_device(struct mtk_e + + static int mtk_probe(struct platform_device *pdev) + { ++ struct resource *res = NULL; + struct device_node *mac_np; + struct mtk_eth *eth; + int err, i; +@@ -3971,16 +3972,31 @@ static int mtk_probe(struct platform_dev + } + } + +- for (i = 0;; i++) { +- struct device_node *np = of_parse_phandle(pdev->dev.of_node, +- "mediatek,wed", i); +- void __iomem *wdma; +- +- if (!np || i >= ARRAY_SIZE(eth->soc->reg_map->wdma_base)) +- break; +- +- wdma = eth->base + eth->soc->reg_map->wdma_base[i]; +- mtk_wed_add_hw(np, eth, wdma, i); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) ++ return -EINVAL; ++ } ++ ++ if (eth->soc->offload_version) { ++ for (i = 0;; i++) { ++ struct device_node *np; ++ phys_addr_t wdma_phy; ++ u32 wdma_base; ++ ++ if (i >= ARRAY_SIZE(eth->soc->reg_map->wdma_base)) ++ break; ++ ++ np = of_parse_phandle(pdev->dev.of_node, ++ "mediatek,wed", i); ++ if (!np) ++ break; ++ ++ wdma_base = eth->soc->reg_map->wdma_base[i]; ++ wdma_phy = res ? res->start + wdma_base : 0; ++ mtk_wed_add_hw(np, eth, eth->base + wdma_base, ++ wdma_phy, i); ++ } + } + + for (i = 0; i < 3; i++) { +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -25,6 +25,11 @@ + + #define MTK_WED_TX_RING_SIZE 2048 + #define MTK_WED_WDMA_RING_SIZE 1024 ++#define MTK_WED_MAX_GROUP_SIZE 0x100 ++#define MTK_WED_VLD_GROUP_SIZE 0x40 ++#define MTK_WED_PER_GROUP_PKT 128 ++ ++#define MTK_WED_FBUF_SIZE 128 + + static struct mtk_wed_hw *hw_list[2]; + static DEFINE_MUTEX(hw_lock); +@@ -150,10 +155,17 @@ mtk_wed_buffer_alloc(struct mtk_wed_devi + + desc->buf0 = cpu_to_le32(buf_phys); + desc->buf1 = cpu_to_le32(buf_phys + txd_size); +- ctrl = FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN0, txd_size) | +- FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN1, +- MTK_WED_BUF_SIZE - txd_size) | +- MTK_WDMA_DESC_CTRL_LAST_SEG1; ++ ++ if (dev->hw->version == 1) ++ ctrl = FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN0, txd_size) | ++ FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN1, ++ MTK_WED_BUF_SIZE - txd_size) | ++ MTK_WDMA_DESC_CTRL_LAST_SEG1; ++ else ++ ctrl = FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN0, txd_size) | ++ FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN1_V2, ++ MTK_WED_BUF_SIZE - txd_size) | ++ MTK_WDMA_DESC_CTRL_LAST_SEG0; + desc->ctrl = cpu_to_le32(ctrl); + desc->info = 0; + desc++; +@@ -209,7 +221,7 @@ mtk_wed_free_ring(struct mtk_wed_device + if (!ring->desc) + return; + +- dma_free_coherent(dev->hw->dev, ring->size * sizeof(*ring->desc), ++ dma_free_coherent(dev->hw->dev, ring->size * ring->desc_size, + ring->desc, ring->desc_phys); + } + +@@ -229,6 +241,14 @@ mtk_wed_set_ext_int(struct mtk_wed_devic + { + u32 mask = MTK_WED_EXT_INT_STATUS_ERROR_MASK; + ++ if (dev->hw->version == 1) ++ mask |= MTK_WED_EXT_INT_STATUS_TX_DRV_R_RESP_ERR; ++ else ++ mask |= MTK_WED_EXT_INT_STATUS_RX_FBUF_LO_TH | ++ MTK_WED_EXT_INT_STATUS_RX_FBUF_HI_TH | ++ MTK_WED_EXT_INT_STATUS_RX_DRV_COHERENT | ++ MTK_WED_EXT_INT_STATUS_TX_DMA_W_RESP_ERR; ++ + if (!dev->hw->num_flows) + mask &= ~MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD; + +@@ -237,6 +257,20 @@ mtk_wed_set_ext_int(struct mtk_wed_devic + } + + static void ++mtk_wed_set_512_support(struct mtk_wed_device *dev, bool enable) ++{ ++ if (enable) { ++ wed_w32(dev, MTK_WED_TXDP_CTRL, MTK_WED_TXDP_DW9_OVERWR); ++ wed_w32(dev, MTK_WED_TXP_DW1, ++ FIELD_PREP(MTK_WED_WPDMA_WRITE_TXP, 0x0103)); ++ } else { ++ wed_w32(dev, MTK_WED_TXP_DW1, ++ FIELD_PREP(MTK_WED_WPDMA_WRITE_TXP, 0x0100)); ++ wed_clr(dev, MTK_WED_TXDP_CTRL, MTK_WED_TXDP_DW9_OVERWR); ++ } ++} ++ ++static void + mtk_wed_dma_disable(struct mtk_wed_device *dev) + { + wed_clr(dev, MTK_WED_WPDMA_GLO_CFG, +@@ -249,12 +283,22 @@ mtk_wed_dma_disable(struct mtk_wed_devic + MTK_WED_GLO_CFG_TX_DMA_EN | + MTK_WED_GLO_CFG_RX_DMA_EN); + +- regmap_write(dev->hw->mirror, dev->hw->index * 4, 0); + wdma_m32(dev, MTK_WDMA_GLO_CFG, + MTK_WDMA_GLO_CFG_TX_DMA_EN | + MTK_WDMA_GLO_CFG_RX_INFO1_PRERES | +- MTK_WDMA_GLO_CFG_RX_INFO2_PRERES | +- MTK_WDMA_GLO_CFG_RX_INFO3_PRERES, 0); ++ MTK_WDMA_GLO_CFG_RX_INFO2_PRERES, 0); ++ ++ if (dev->hw->version == 1) { ++ regmap_write(dev->hw->mirror, dev->hw->index * 4, 0); ++ wdma_m32(dev, MTK_WDMA_GLO_CFG, ++ MTK_WDMA_GLO_CFG_RX_INFO3_PRERES, 0); ++ } else { ++ wed_clr(dev, MTK_WED_WPDMA_GLO_CFG, ++ MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC | ++ MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC); ++ ++ mtk_wed_set_512_support(dev, false); ++ } + } + + static void +@@ -293,7 +337,7 @@ mtk_wed_detach(struct mtk_wed_device *de + mtk_wed_free_buffer(dev); + mtk_wed_free_tx_rings(dev); + +- if (of_dma_is_coherent(wlan_node)) ++ if (of_dma_is_coherent(wlan_node) && hw->hifsys) + regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP, + BIT(hw->index), BIT(hw->index)); + +@@ -308,14 +352,69 @@ mtk_wed_detach(struct mtk_wed_device *de + mutex_unlock(&hw_lock); + } + ++#define PCIE_BASE_ADDR0 0x11280000 ++static void ++mtk_wed_bus_init(struct mtk_wed_device *dev) ++{ ++ struct device_node *np = dev->hw->eth->dev->of_node; ++ struct regmap *regs; ++ u32 val; ++ ++ regs = syscon_regmap_lookup_by_phandle(np, "mediatek,wed-pcie"); ++ if (IS_ERR(regs)) ++ return; ++ ++ regmap_update_bits(regs, 0, BIT(0), BIT(0)); ++ ++ wed_w32(dev, MTK_WED_PCIE_INT_CTRL, ++ FIELD_PREP(MTK_WED_PCIE_INT_CTRL_POLL_EN, 2)); ++ ++ /* pcie interrupt control: pola/source selection */ ++ wed_set(dev, MTK_WED_PCIE_INT_CTRL, ++ MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA | ++ FIELD_PREP(MTK_WED_PCIE_INT_CTRL_SRC_SEL, 1)); ++ wed_r32(dev, MTK_WED_PCIE_INT_CTRL); ++ ++ val = wed_r32(dev, MTK_WED_PCIE_CFG_INTM); ++ val = wed_r32(dev, MTK_WED_PCIE_CFG_BASE); ++ wed_w32(dev, MTK_WED_PCIE_CFG_INTM, PCIE_BASE_ADDR0 | 0x180); ++ wed_w32(dev, MTK_WED_PCIE_CFG_BASE, PCIE_BASE_ADDR0 | 0x184); ++ ++ val = wed_r32(dev, MTK_WED_PCIE_CFG_INTM); ++ val = wed_r32(dev, MTK_WED_PCIE_CFG_BASE); ++ ++ /* pcie interrupt status trigger register */ ++ wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, BIT(24)); ++ wed_r32(dev, MTK_WED_PCIE_INT_TRIGGER); ++ ++ /* pola setting */ ++ val = wed_r32(dev, MTK_WED_PCIE_INT_CTRL); ++ wed_set(dev, MTK_WED_PCIE_INT_CTRL, MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA); ++} ++ ++static void ++mtk_wed_set_wpdma(struct mtk_wed_device *dev) ++{ ++ if (dev->hw->version == 1) { ++ wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_phys); ++ } else { ++ mtk_wed_bus_init(dev); ++ ++ wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_int); ++ wed_w32(dev, MTK_WED_WPDMA_CFG_INT_MASK, dev->wlan.wpdma_mask); ++ wed_w32(dev, MTK_WED_WPDMA_CFG_TX, dev->wlan.wpdma_tx); ++ wed_w32(dev, MTK_WED_WPDMA_CFG_TX_FREE, dev->wlan.wpdma_txfree); ++ } ++} ++ + static void + mtk_wed_hw_init_early(struct mtk_wed_device *dev) + { + u32 mask, set; +- u32 offset; + + mtk_wed_stop(dev); + mtk_wed_reset(dev, MTK_WED_RESET_WED); ++ mtk_wed_set_wpdma(dev); + + mask = MTK_WED_WDMA_GLO_CFG_BT_SIZE | + MTK_WED_WDMA_GLO_CFG_DYNAMIC_DMAD_RECYCLE | +@@ -325,17 +424,33 @@ mtk_wed_hw_init_early(struct mtk_wed_dev + MTK_WED_WDMA_GLO_CFG_IDLE_DMAD_SUPPLY; + wed_m32(dev, MTK_WED_WDMA_GLO_CFG, mask, set); + +- wdma_set(dev, MTK_WDMA_GLO_CFG, +- MTK_WDMA_GLO_CFG_RX_INFO1_PRERES | +- MTK_WDMA_GLO_CFG_RX_INFO2_PRERES | +- MTK_WDMA_GLO_CFG_RX_INFO3_PRERES); +- +- offset = dev->hw->index ? 0x04000400 : 0; +- wed_w32(dev, MTK_WED_WDMA_OFFSET0, 0x2a042a20 + offset); +- wed_w32(dev, MTK_WED_WDMA_OFFSET1, 0x29002800 + offset); ++ if (dev->hw->version == 1) { ++ u32 offset = dev->hw->index ? 0x04000400 : 0; + +- wed_w32(dev, MTK_WED_PCIE_CFG_BASE, MTK_PCIE_BASE(dev->hw->index)); +- wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_phys); ++ wdma_set(dev, MTK_WDMA_GLO_CFG, ++ MTK_WDMA_GLO_CFG_RX_INFO1_PRERES | ++ MTK_WDMA_GLO_CFG_RX_INFO2_PRERES | ++ MTK_WDMA_GLO_CFG_RX_INFO3_PRERES); ++ ++ wed_w32(dev, MTK_WED_WDMA_OFFSET0, 0x2a042a20 + offset); ++ wed_w32(dev, MTK_WED_WDMA_OFFSET1, 0x29002800 + offset); ++ wed_w32(dev, MTK_WED_PCIE_CFG_BASE, ++ MTK_PCIE_BASE(dev->hw->index)); ++ } else { ++ wed_w32(dev, MTK_WED_WDMA_CFG_BASE, dev->hw->wdma_phy); ++ wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_ETH_DMAD_FMT); ++ wed_w32(dev, MTK_WED_WDMA_OFFSET0, ++ FIELD_PREP(MTK_WED_WDMA_OFST0_GLO_INTS, ++ MTK_WDMA_INT_STATUS) | ++ FIELD_PREP(MTK_WED_WDMA_OFST0_GLO_CFG, ++ MTK_WDMA_GLO_CFG)); ++ ++ wed_w32(dev, MTK_WED_WDMA_OFFSET1, ++ FIELD_PREP(MTK_WED_WDMA_OFST1_TX_CTRL, ++ MTK_WDMA_RING_TX(0)) | ++ FIELD_PREP(MTK_WED_WDMA_OFST1_RX_CTRL, ++ MTK_WDMA_RING_RX(0))); ++ } + } + + static void +@@ -355,37 +470,65 @@ mtk_wed_hw_init(struct mtk_wed_device *d + + wed_w32(dev, MTK_WED_TX_BM_BASE, dev->buf_ring.desc_phys); + +- wed_w32(dev, MTK_WED_TX_BM_TKID, +- FIELD_PREP(MTK_WED_TX_BM_TKID_START, +- dev->wlan.token_start) | +- FIELD_PREP(MTK_WED_TX_BM_TKID_END, +- dev->wlan.token_start + dev->wlan.nbuf - 1)); +- + wed_w32(dev, MTK_WED_TX_BM_BUF_LEN, MTK_WED_PKT_SIZE); + +- wed_w32(dev, MTK_WED_TX_BM_DYN_THR, +- FIELD_PREP(MTK_WED_TX_BM_DYN_THR_LO, 1) | +- MTK_WED_TX_BM_DYN_THR_HI); ++ if (dev->hw->version == 1) { ++ wed_w32(dev, MTK_WED_TX_BM_TKID, ++ FIELD_PREP(MTK_WED_TX_BM_TKID_START, ++ dev->wlan.token_start) | ++ FIELD_PREP(MTK_WED_TX_BM_TKID_END, ++ dev->wlan.token_start + ++ dev->wlan.nbuf - 1)); ++ wed_w32(dev, MTK_WED_TX_BM_DYN_THR, ++ FIELD_PREP(MTK_WED_TX_BM_DYN_THR_LO, 1) | ++ MTK_WED_TX_BM_DYN_THR_HI); ++ } else { ++ wed_w32(dev, MTK_WED_TX_BM_TKID_V2, ++ FIELD_PREP(MTK_WED_TX_BM_TKID_START, ++ dev->wlan.token_start) | ++ FIELD_PREP(MTK_WED_TX_BM_TKID_END, ++ dev->wlan.token_start + ++ dev->wlan.nbuf - 1)); ++ wed_w32(dev, MTK_WED_TX_BM_DYN_THR, ++ FIELD_PREP(MTK_WED_TX_BM_DYN_THR_LO_V2, 0) | ++ MTK_WED_TX_BM_DYN_THR_HI_V2); ++ wed_w32(dev, MTK_WED_TX_TKID_CTRL, ++ MTK_WED_TX_TKID_CTRL_PAUSE | ++ FIELD_PREP(MTK_WED_TX_TKID_CTRL_VLD_GRP_NUM, ++ dev->buf_ring.size / 128) | ++ FIELD_PREP(MTK_WED_TX_TKID_CTRL_RSV_GRP_NUM, ++ dev->buf_ring.size / 128)); ++ wed_w32(dev, MTK_WED_TX_TKID_DYN_THR, ++ FIELD_PREP(MTK_WED_TX_TKID_DYN_THR_LO, 0) | ++ MTK_WED_TX_TKID_DYN_THR_HI); ++ } + + mtk_wed_reset(dev, MTK_WED_RESET_TX_BM); + +- wed_set(dev, MTK_WED_CTRL, +- MTK_WED_CTRL_WED_TX_BM_EN | +- MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); ++ if (dev->hw->version == 1) ++ wed_set(dev, MTK_WED_CTRL, ++ MTK_WED_CTRL_WED_TX_BM_EN | ++ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); ++ else ++ wed_clr(dev, MTK_WED_TX_TKID_CTRL, MTK_WED_TX_TKID_CTRL_PAUSE); + + wed_clr(dev, MTK_WED_TX_BM_CTRL, MTK_WED_TX_BM_CTRL_PAUSE); + } + + static void +-mtk_wed_ring_reset(struct mtk_wdma_desc *desc, int size) ++mtk_wed_ring_reset(struct mtk_wed_ring *ring, int size) + { ++ void *head = (void *)ring->desc; + int i; + + for (i = 0; i < size; i++) { +- desc[i].buf0 = 0; +- desc[i].ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE); +- desc[i].buf1 = 0; +- desc[i].info = 0; ++ struct mtk_wdma_desc *desc; ++ ++ desc = (struct mtk_wdma_desc *)(head + i * ring->desc_size); ++ desc->buf0 = 0; ++ desc->ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE); ++ desc->buf1 = 0; ++ desc->info = 0; + } + } + +@@ -436,12 +579,10 @@ mtk_wed_reset_dma(struct mtk_wed_device + int i; + + for (i = 0; i < ARRAY_SIZE(dev->tx_ring); i++) { +- struct mtk_wdma_desc *desc = dev->tx_ring[i].desc; +- +- if (!desc) ++ if (!dev->tx_ring[i].desc) + continue; + +- mtk_wed_ring_reset(desc, MTK_WED_TX_RING_SIZE); ++ mtk_wed_ring_reset(&dev->tx_ring[i], MTK_WED_TX_RING_SIZE); + } + + if (mtk_wed_poll_busy(dev)) +@@ -498,16 +639,16 @@ mtk_wed_reset_dma(struct mtk_wed_device + + static int + mtk_wed_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring, +- int size) ++ int size, u32 desc_size) + { +- ring->desc = dma_alloc_coherent(dev->hw->dev, +- size * sizeof(*ring->desc), ++ ring->desc = dma_alloc_coherent(dev->hw->dev, size * desc_size, + &ring->desc_phys, GFP_KERNEL); + if (!ring->desc) + return -ENOMEM; + ++ ring->desc_size = desc_size; + ring->size = size; +- mtk_wed_ring_reset(ring->desc, size); ++ mtk_wed_ring_reset(ring, size); + + return 0; + } +@@ -515,9 +656,10 @@ mtk_wed_ring_alloc(struct mtk_wed_device + static int + mtk_wed_wdma_ring_setup(struct mtk_wed_device *dev, int idx, int size) + { ++ u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; + struct mtk_wed_ring *wdma = &dev->tx_wdma[idx]; + +- if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE)) ++ if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size)) + return -ENOMEM; + + wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE, +@@ -546,16 +688,41 @@ mtk_wed_configure_irq(struct mtk_wed_dev + MTK_WED_CTRL_WED_TX_BM_EN | + MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); + +- wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, +- MTK_WED_PCIE_INT_TRIGGER_STATUS); ++ if (dev->hw->version == 1) { ++ wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, ++ MTK_WED_PCIE_INT_TRIGGER_STATUS); ++ ++ wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, ++ MTK_WED_WPDMA_INT_TRIGGER_RX_DONE | ++ MTK_WED_WPDMA_INT_TRIGGER_TX_DONE); + +- wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, +- MTK_WED_WPDMA_INT_TRIGGER_RX_DONE | +- MTK_WED_WPDMA_INT_TRIGGER_TX_DONE); ++ wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask); ++ } else { ++ /* initail tx interrupt trigger */ ++ wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_TX, ++ MTK_WED_WPDMA_INT_CTRL_TX0_DONE_EN | ++ MTK_WED_WPDMA_INT_CTRL_TX0_DONE_CLR | ++ MTK_WED_WPDMA_INT_CTRL_TX1_DONE_EN | ++ MTK_WED_WPDMA_INT_CTRL_TX1_DONE_CLR | ++ FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX0_DONE_TRIG, ++ dev->wlan.tx_tbit[0]) | ++ FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX1_DONE_TRIG, ++ dev->wlan.tx_tbit[1])); ++ ++ /* initail txfree interrupt trigger */ ++ wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_TX_FREE, ++ MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_EN | ++ MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_CLR | ++ FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_TRIG, ++ dev->wlan.txfree_tbit)); ++ ++ wed_w32(dev, MTK_WED_WDMA_INT_CLR, wdma_mask); ++ wed_set(dev, MTK_WED_WDMA_INT_CTRL, ++ FIELD_PREP(MTK_WED_WDMA_INT_CTRL_POLL_SRC_SEL, ++ dev->wdma_idx)); ++ } + +- /* initail wdma interrupt agent */ + wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, wdma_mask); +- wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask); + + wdma_w32(dev, MTK_WDMA_INT_MASK, wdma_mask); + wdma_w32(dev, MTK_WDMA_INT_GRP2, wdma_mask); +@@ -580,14 +747,28 @@ mtk_wed_dma_enable(struct mtk_wed_device + wdma_set(dev, MTK_WDMA_GLO_CFG, + MTK_WDMA_GLO_CFG_TX_DMA_EN | + MTK_WDMA_GLO_CFG_RX_INFO1_PRERES | +- MTK_WDMA_GLO_CFG_RX_INFO2_PRERES | +- MTK_WDMA_GLO_CFG_RX_INFO3_PRERES); ++ MTK_WDMA_GLO_CFG_RX_INFO2_PRERES); ++ ++ if (dev->hw->version == 1) { ++ wdma_set(dev, MTK_WDMA_GLO_CFG, ++ MTK_WDMA_GLO_CFG_RX_INFO3_PRERES); ++ } else { ++ wed_set(dev, MTK_WED_WPDMA_CTRL, ++ MTK_WED_WPDMA_CTRL_SDL1_FIXED); ++ ++ wed_set(dev, MTK_WED_WPDMA_GLO_CFG, ++ MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC | ++ MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC); ++ ++ wed_clr(dev, MTK_WED_WPDMA_GLO_CFG, ++ MTK_WED_WPDMA_GLO_CFG_TX_TKID_KEEP | ++ MTK_WED_WPDMA_GLO_CFG_TX_DMAD_DW3_PREV); ++ } + } + + static void + mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask) + { +- u32 val; + int i; + + for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) +@@ -598,14 +779,17 @@ mtk_wed_start(struct mtk_wed_device *dev + mtk_wed_configure_irq(dev, irq_mask); + + mtk_wed_set_ext_int(dev, true); +- val = dev->wlan.wpdma_phys | +- MTK_PCIE_MIRROR_MAP_EN | +- FIELD_PREP(MTK_PCIE_MIRROR_MAP_WED_ID, dev->hw->index); +- +- if (dev->hw->index) +- val |= BIT(1); +- val |= BIT(0); +- regmap_write(dev->hw->mirror, dev->hw->index * 4, val); ++ ++ if (dev->hw->version == 1) { ++ u32 val = dev->wlan.wpdma_phys | MTK_PCIE_MIRROR_MAP_EN | ++ FIELD_PREP(MTK_PCIE_MIRROR_MAP_WED_ID, ++ dev->hw->index); ++ ++ val |= BIT(0) | (BIT(1) * !!dev->hw->index); ++ regmap_write(dev->hw->mirror, dev->hw->index * 4, val); ++ } else { ++ mtk_wed_set_512_support(dev, true); ++ } + + mtk_wed_dma_enable(dev); + dev->running = true; +@@ -639,7 +823,9 @@ mtk_wed_attach(struct mtk_wed_device *de + goto out; + } + +- dev_info(&dev->wlan.pci_dev->dev, "attaching wed device %d\n", hw->index); ++ dev_info(&dev->wlan.pci_dev->dev, ++ "attaching wed device %d version %d\n", ++ hw->index, hw->version); + + dev->hw = hw; + dev->dev = hw->dev; +@@ -657,7 +843,9 @@ mtk_wed_attach(struct mtk_wed_device *de + } + + mtk_wed_hw_init_early(dev); +- regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP, BIT(hw->index), 0); ++ if (hw->hifsys) ++ regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP, ++ BIT(hw->index), 0); + + out: + mutex_unlock(&hw_lock); +@@ -684,7 +872,8 @@ mtk_wed_tx_ring_setup(struct mtk_wed_dev + + BUG_ON(idx >= ARRAY_SIZE(dev->tx_ring)); + +- if (mtk_wed_ring_alloc(dev, ring, MTK_WED_TX_RING_SIZE)) ++ if (mtk_wed_ring_alloc(dev, ring, MTK_WED_TX_RING_SIZE, ++ sizeof(*ring->desc))) + return -ENOMEM; + + if (mtk_wed_wdma_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) +@@ -711,21 +900,21 @@ static int + mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs) + { + struct mtk_wed_ring *ring = &dev->txfree_ring; +- int i; ++ int i, index = dev->hw->version == 1; + + /* + * For txfree event handling, the same DMA ring is shared between WED + * and WLAN. The WLAN driver accesses the ring index registers through + * WED + */ +- ring->reg_base = MTK_WED_RING_RX(1); ++ ring->reg_base = MTK_WED_RING_RX(index); + ring->wpdma = regs; + + for (i = 0; i < 12; i += 4) { + u32 val = readl(regs + i); + +- wed_w32(dev, MTK_WED_RING_RX(1) + i, val); +- wed_w32(dev, MTK_WED_WPDMA_RING_RX(1) + i, val); ++ wed_w32(dev, MTK_WED_RING_RX(index) + i, val); ++ wed_w32(dev, MTK_WED_WPDMA_RING_RX(index) + i, val); + } + + return 0; +@@ -734,11 +923,19 @@ mtk_wed_txfree_ring_setup(struct mtk_wed + static u32 + mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask) + { +- u32 val; ++ u32 val, ext_mask = MTK_WED_EXT_INT_STATUS_ERROR_MASK; ++ ++ if (dev->hw->version == 1) ++ ext_mask |= MTK_WED_EXT_INT_STATUS_TX_DRV_R_RESP_ERR; ++ else ++ ext_mask |= MTK_WED_EXT_INT_STATUS_RX_FBUF_LO_TH | ++ MTK_WED_EXT_INT_STATUS_RX_FBUF_HI_TH | ++ MTK_WED_EXT_INT_STATUS_RX_DRV_COHERENT | ++ MTK_WED_EXT_INT_STATUS_TX_DMA_W_RESP_ERR; + + val = wed_r32(dev, MTK_WED_EXT_INT_STATUS); + wed_w32(dev, MTK_WED_EXT_INT_STATUS, val); +- val &= MTK_WED_EXT_INT_STATUS_ERROR_MASK; ++ val &= ext_mask; + if (!dev->hw->num_flows) + val &= ~MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD; + if (val && net_ratelimit()) +@@ -813,7 +1010,8 @@ out: + } + + void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, +- void __iomem *wdma, int index) ++ void __iomem *wdma, phys_addr_t wdma_phy, ++ int index) + { + static const struct mtk_wed_ops wed_ops = { + .attach = mtk_wed_attach, +@@ -860,26 +1058,33 @@ void mtk_wed_add_hw(struct device_node * + hw = kzalloc(sizeof(*hw), GFP_KERNEL); + if (!hw) + goto unlock; ++ + hw->node = np; + hw->regs = regs; + hw->eth = eth; + hw->dev = &pdev->dev; ++ hw->wdma_phy = wdma_phy; + hw->wdma = wdma; + hw->index = index; + hw->irq = irq; +- hw->mirror = syscon_regmap_lookup_by_phandle(eth_np, +- "mediatek,pcie-mirror"); +- hw->hifsys = syscon_regmap_lookup_by_phandle(eth_np, +- "mediatek,hifsys"); +- if (IS_ERR(hw->mirror) || IS_ERR(hw->hifsys)) { +- kfree(hw); +- goto unlock; +- } ++ hw->version = MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) ? 2 : 1; + +- if (!index) { +- regmap_write(hw->mirror, 0, 0); +- regmap_write(hw->mirror, 4, 0); ++ if (hw->version == 1) { ++ hw->mirror = syscon_regmap_lookup_by_phandle(eth_np, ++ "mediatek,pcie-mirror"); ++ hw->hifsys = syscon_regmap_lookup_by_phandle(eth_np, ++ "mediatek,hifsys"); ++ if (IS_ERR(hw->mirror) || IS_ERR(hw->hifsys)) { ++ kfree(hw); ++ goto unlock; ++ } ++ ++ if (!index) { ++ regmap_write(hw->mirror, 0, 0); ++ regmap_write(hw->mirror, 4, 0); ++ } + } ++ + mtk_wed_hw_add_debugfs(hw); + + hw_list[index] = hw; +--- a/drivers/net/ethernet/mediatek/mtk_wed.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed.h +@@ -18,11 +18,13 @@ struct mtk_wed_hw { + struct regmap *hifsys; + struct device *dev; + void __iomem *wdma; ++ phys_addr_t wdma_phy; + struct regmap *mirror; + struct dentry *debugfs_dir; + struct mtk_wed_device *wed_dev; + u32 debugfs_reg; + u32 num_flows; ++ u8 version; + char dirname[5]; + int irq; + int index; +@@ -101,14 +103,16 @@ wpdma_txfree_w32(struct mtk_wed_device * + } + + void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, +- void __iomem *wdma, int index); ++ void __iomem *wdma, phys_addr_t wdma_phy, ++ int index); + void mtk_wed_exit(void); + int mtk_wed_flow_add(int index); + void mtk_wed_flow_remove(int index); + #else + static inline void + mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, +- void __iomem *wdma, int index) ++ void __iomem *wdma, phys_addr_t wdma_phy, ++ int index) + { + } + static inline void +--- a/drivers/net/ethernet/mediatek/mtk_wed_debugfs.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed_debugfs.c +@@ -116,6 +116,9 @@ wed_txinfo_show(struct seq_file *s, void + DUMP_WDMA(WDMA_GLO_CFG), + DUMP_WDMA_RING(WDMA_RING_RX(0)), + DUMP_WDMA_RING(WDMA_RING_RX(1)), ++ ++ DUMP_STR("TX FREE"), ++ DUMP_WED(WED_RX_MIB(0)), + }; + struct mtk_wed_hw *hw = s->private; + struct mtk_wed_device *dev = hw->wed_dev; +--- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h +@@ -5,6 +5,7 @@ + #define __MTK_WED_REGS_H + + #define MTK_WDMA_DESC_CTRL_LEN1 GENMASK(14, 0) ++#define MTK_WDMA_DESC_CTRL_LEN1_V2 GENMASK(13, 0) + #define MTK_WDMA_DESC_CTRL_LAST_SEG1 BIT(15) + #define MTK_WDMA_DESC_CTRL_BURST BIT(16) + #define MTK_WDMA_DESC_CTRL_LEN0 GENMASK(29, 16) +@@ -41,6 +42,7 @@ struct mtk_wdma_desc { + #define MTK_WED_CTRL_RESERVE_EN BIT(12) + #define MTK_WED_CTRL_RESERVE_BUSY BIT(13) + #define MTK_WED_CTRL_FINAL_DIDX_READ BIT(24) ++#define MTK_WED_CTRL_ETH_DMAD_FMT BIT(25) + #define MTK_WED_CTRL_MIB_READ_CLEAR BIT(28) + + #define MTK_WED_EXT_INT_STATUS 0x020 +@@ -57,7 +59,8 @@ struct mtk_wdma_desc { + #define MTK_WED_EXT_INT_STATUS_RX_DRV_INIT_WDMA_EN BIT(19) + #define MTK_WED_EXT_INT_STATUS_RX_DRV_BM_DMAD_COHERENT BIT(20) + #define MTK_WED_EXT_INT_STATUS_TX_DRV_R_RESP_ERR BIT(21) +-#define MTK_WED_EXT_INT_STATUS_TX_DRV_W_RESP_ERR BIT(22) ++#define MTK_WED_EXT_INT_STATUS_TX_DMA_R_RESP_ERR BIT(22) ++#define MTK_WED_EXT_INT_STATUS_TX_DMA_W_RESP_ERR BIT(23) + #define MTK_WED_EXT_INT_STATUS_RX_DRV_DMA_RECYCLE BIT(24) + #define MTK_WED_EXT_INT_STATUS_ERROR_MASK (MTK_WED_EXT_INT_STATUS_TF_LEN_ERR | \ + MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD | \ +@@ -65,8 +68,7 @@ struct mtk_wdma_desc { + MTK_WED_EXT_INT_STATUS_RX_DRV_R_RESP_ERR | \ + MTK_WED_EXT_INT_STATUS_RX_DRV_W_RESP_ERR | \ + MTK_WED_EXT_INT_STATUS_RX_DRV_INIT_WDMA_EN | \ +- MTK_WED_EXT_INT_STATUS_TX_DRV_R_RESP_ERR | \ +- MTK_WED_EXT_INT_STATUS_TX_DRV_W_RESP_ERR) ++ MTK_WED_EXT_INT_STATUS_TX_DMA_R_RESP_ERR) + + #define MTK_WED_EXT_INT_MASK 0x028 + +@@ -81,6 +83,7 @@ struct mtk_wdma_desc { + #define MTK_WED_TX_BM_BASE 0x084 + + #define MTK_WED_TX_BM_TKID 0x088 ++#define MTK_WED_TX_BM_TKID_V2 0x0c8 + #define MTK_WED_TX_BM_TKID_START GENMASK(15, 0) + #define MTK_WED_TX_BM_TKID_END GENMASK(31, 16) + +@@ -94,7 +97,25 @@ struct mtk_wdma_desc { + + #define MTK_WED_TX_BM_DYN_THR 0x0a0 + #define MTK_WED_TX_BM_DYN_THR_LO GENMASK(6, 0) ++#define MTK_WED_TX_BM_DYN_THR_LO_V2 GENMASK(8, 0) + #define MTK_WED_TX_BM_DYN_THR_HI GENMASK(22, 16) ++#define MTK_WED_TX_BM_DYN_THR_HI_V2 GENMASK(24, 16) ++ ++#define MTK_WED_TX_TKID_CTRL 0x0c0 ++#define MTK_WED_TX_TKID_CTRL_VLD_GRP_NUM GENMASK(6, 0) ++#define MTK_WED_TX_TKID_CTRL_RSV_GRP_NUM GENMASK(22, 16) ++#define MTK_WED_TX_TKID_CTRL_PAUSE BIT(28) ++ ++#define MTK_WED_TX_TKID_DYN_THR 0x0e0 ++#define MTK_WED_TX_TKID_DYN_THR_LO GENMASK(6, 0) ++#define MTK_WED_TX_TKID_DYN_THR_HI GENMASK(22, 16) ++ ++#define MTK_WED_TXP_DW0 0x120 ++#define MTK_WED_TXP_DW1 0x124 ++#define MTK_WED_WPDMA_WRITE_TXP GENMASK(31, 16) ++#define MTK_WED_TXDP_CTRL 0x130 ++#define MTK_WED_TXDP_DW9_OVERWR BIT(9) ++#define MTK_WED_RX_BM_TKID_MIB 0x1cc + + #define MTK_WED_INT_STATUS 0x200 + #define MTK_WED_INT_MASK 0x204 +@@ -125,6 +146,7 @@ struct mtk_wdma_desc { + #define MTK_WED_RESET_IDX_RX GENMASK(17, 16) + + #define MTK_WED_TX_MIB(_n) (0x2a0 + (_n) * 4) ++#define MTK_WED_RX_MIB(_n) (0x2e0 + (_n) * 4) + + #define MTK_WED_RING_TX(_n) (0x300 + (_n) * 0x10) + +@@ -155,21 +177,62 @@ struct mtk_wdma_desc { + #define MTK_WED_WPDMA_GLO_CFG_BYTE_SWAP BIT(29) + #define MTK_WED_WPDMA_GLO_CFG_RX_2B_OFFSET BIT(31) + ++/* CONFIG_MEDIATEK_NETSYS_V2 */ ++#define MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC BIT(4) ++#define MTK_WED_WPDMA_GLO_CFG_RX_DRV_R1_PKT_PROC BIT(5) ++#define MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC BIT(6) ++#define MTK_WED_WPDMA_GLO_CFG_RX_DRV_R1_CRX_SYNC BIT(7) ++#define MTK_WED_WPDMA_GLO_CFG_RX_DRV_EVENT_PKT_FMT_VER GENMASK(18, 16) ++#define MTK_WED_WPDMA_GLO_CFG_RX_DRV_UNSUPPORT_FMT BIT(19) ++#define MTK_WED_WPDMA_GLO_CFG_RX_DRV_UEVENT_PKT_FMT_CHK BIT(20) ++#define MTK_WED_WPDMA_GLO_CFG_RX_DDONE2_WR BIT(21) ++#define MTK_WED_WPDMA_GLO_CFG_TX_TKID_KEEP BIT(24) ++#define MTK_WED_WPDMA_GLO_CFG_TX_DMAD_DW3_PREV BIT(28) ++ + #define MTK_WED_WPDMA_RESET_IDX 0x50c + #define MTK_WED_WPDMA_RESET_IDX_TX GENMASK(3, 0) + #define MTK_WED_WPDMA_RESET_IDX_RX GENMASK(17, 16) + ++#define MTK_WED_WPDMA_CTRL 0x518 ++#define MTK_WED_WPDMA_CTRL_SDL1_FIXED BIT(31) ++ + #define MTK_WED_WPDMA_INT_CTRL 0x520 + #define MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV BIT(21) + + #define MTK_WED_WPDMA_INT_MASK 0x524 + ++#define MTK_WED_WPDMA_INT_CTRL_TX 0x530 ++#define MTK_WED_WPDMA_INT_CTRL_TX0_DONE_EN BIT(0) ++#define MTK_WED_WPDMA_INT_CTRL_TX0_DONE_CLR BIT(1) ++#define MTK_WED_WPDMA_INT_CTRL_TX0_DONE_TRIG GENMASK(6, 2) ++#define MTK_WED_WPDMA_INT_CTRL_TX1_DONE_EN BIT(8) ++#define MTK_WED_WPDMA_INT_CTRL_TX1_DONE_CLR BIT(9) ++#define MTK_WED_WPDMA_INT_CTRL_TX1_DONE_TRIG GENMASK(14, 10) ++ ++#define MTK_WED_WPDMA_INT_CTRL_RX 0x534 ++ ++#define MTK_WED_WPDMA_INT_CTRL_TX_FREE 0x538 ++#define MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_EN BIT(0) ++#define MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_CLR BIT(1) ++#define MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_TRIG GENMASK(6, 2) ++ + #define MTK_WED_PCIE_CFG_BASE 0x560 + ++#define MTK_WED_PCIE_CFG_BASE 0x560 ++#define MTK_WED_PCIE_CFG_INTM 0x564 ++#define MTK_WED_PCIE_CFG_MSIS 0x568 + #define MTK_WED_PCIE_INT_TRIGGER 0x570 + #define MTK_WED_PCIE_INT_TRIGGER_STATUS BIT(16) + ++#define MTK_WED_PCIE_INT_CTRL 0x57c ++#define MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA BIT(20) ++#define MTK_WED_PCIE_INT_CTRL_SRC_SEL GENMASK(17, 16) ++#define MTK_WED_PCIE_INT_CTRL_POLL_EN GENMASK(13, 12) ++ + #define MTK_WED_WPDMA_CFG_BASE 0x580 ++#define MTK_WED_WPDMA_CFG_INT_MASK 0x584 ++#define MTK_WED_WPDMA_CFG_TX 0x588 ++#define MTK_WED_WPDMA_CFG_TX_FREE 0x58c + + #define MTK_WED_WPDMA_TX_MIB(_n) (0x5a0 + (_n) * 4) + #define MTK_WED_WPDMA_TX_COHERENT_MIB(_n) (0x5d0 + (_n) * 4) +@@ -203,15 +266,24 @@ struct mtk_wdma_desc { + #define MTK_WED_WDMA_RESET_IDX_RX GENMASK(17, 16) + #define MTK_WED_WDMA_RESET_IDX_DRV GENMASK(25, 24) + ++#define MTK_WED_WDMA_INT_CLR 0xa24 ++#define MTK_WED_WDMA_INT_CLR_RX_DONE GENMASK(17, 16) ++ + #define MTK_WED_WDMA_INT_TRIGGER 0xa28 + #define MTK_WED_WDMA_INT_TRIGGER_RX_DONE GENMASK(17, 16) + + #define MTK_WED_WDMA_INT_CTRL 0xa2c + #define MTK_WED_WDMA_INT_CTRL_POLL_SRC_SEL GENMASK(17, 16) + ++#define MTK_WED_WDMA_CFG_BASE 0xaa0 + #define MTK_WED_WDMA_OFFSET0 0xaa4 + #define MTK_WED_WDMA_OFFSET1 0xaa8 + ++#define MTK_WED_WDMA_OFST0_GLO_INTS GENMASK(15, 0) ++#define MTK_WED_WDMA_OFST0_GLO_CFG GENMASK(31, 16) ++#define MTK_WED_WDMA_OFST1_TX_CTRL GENMASK(15, 0) ++#define MTK_WED_WDMA_OFST1_RX_CTRL GENMASK(31, 16) ++ + #define MTK_WED_WDMA_RX_MIB(_n) (0xae0 + (_n) * 4) + #define MTK_WED_WDMA_RX_RECYCLE_MIB(_n) (0xae8 + (_n) * 4) + #define MTK_WED_WDMA_RX_PROCESSED_MIB(_n) (0xaf0 + (_n) * 4) +@@ -221,6 +293,7 @@ struct mtk_wdma_desc { + #define MTK_WED_RING_OFS_CPU_IDX 0x08 + #define MTK_WED_RING_OFS_DMA_IDX 0x0c + ++#define MTK_WDMA_RING_TX(_n) (0x000 + (_n) * 0x10) + #define MTK_WDMA_RING_RX(_n) (0x100 + (_n) * 0x10) + + #define MTK_WDMA_GLO_CFG 0x204 +@@ -234,6 +307,8 @@ struct mtk_wdma_desc { + #define MTK_WDMA_RESET_IDX_TX GENMASK(3, 0) + #define MTK_WDMA_RESET_IDX_RX GENMASK(17, 16) + ++#define MTK_WDMA_INT_STATUS 0x220 ++ + #define MTK_WDMA_INT_MASK 0x228 + #define MTK_WDMA_INT_MASK_TX_DONE GENMASK(3, 0) + #define MTK_WDMA_INT_MASK_RX_DONE GENMASK(17, 16) +--- a/include/linux/soc/mediatek/mtk_wed.h ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -14,6 +14,7 @@ struct mtk_wdma_desc; + struct mtk_wed_ring { + struct mtk_wdma_desc *desc; + dma_addr_t desc_phys; ++ u32 desc_size; + int size; + + u32 reg_base; +@@ -45,10 +46,17 @@ struct mtk_wed_device { + struct pci_dev *pci_dev; + + u32 wpdma_phys; ++ u32 wpdma_int; ++ u32 wpdma_mask; ++ u32 wpdma_tx; ++ u32 wpdma_txfree; + + u16 token_start; + unsigned int nbuf; + ++ u8 tx_tbit[MTK_WED_TX_QUEUES]; ++ u8 txfree_tbit; ++ + u32 (*init_buf)(void *ptr, dma_addr_t phys, int token_id); + int (*offload_enable)(struct mtk_wed_device *wed); + void (*offload_disable)(struct mtk_wed_device *wed); diff --git a/target/linux/generic/backport-5.15/722-v6.0-net-ethernet-mtk_eth_wed-add-axi-bus-support.patch b/target/linux/generic/backport-5.15/722-v6.0-net-ethernet-mtk_eth_wed-add-axi-bus-support.patch new file mode 100644 index 0000000000..70b7bad31f --- /dev/null +++ b/target/linux/generic/backport-5.15/722-v6.0-net-ethernet-mtk_eth_wed-add-axi-bus-support.patch @@ -0,0 +1,237 @@ +From 6e1df49f330dce7c58a39d6772f1385b6887bb03 Mon Sep 17 00:00:00 2001 +Message-Id: <6e1df49f330dce7c58a39d6772f1385b6887bb03.1662990860.git.lorenzo@kernel.org> +From: Lorenzo Bianconi +Date: Thu, 8 Sep 2022 11:26:10 +0200 +Subject: [PATCH net-next] net: ethernet: mtk_eth_wed: add axi bus support + +Other than pcie bus, introduce support for axi bus to mtk wed driver. +Axi bus is used to connect mt7986-wmac soc chip available on mt7986 +device. + +Co-developed-by: Bo Jiao +Signed-off-by: Bo Jiao +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_wed.c | 116 +++++++++++++------ + drivers/net/ethernet/mediatek/mtk_wed_regs.h | 2 + + include/linux/soc/mediatek/mtk_wed.h | 11 +- + 3 files changed, 91 insertions(+), 38 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -85,11 +85,31 @@ static struct mtk_wed_hw * + mtk_wed_assign(struct mtk_wed_device *dev) + { + struct mtk_wed_hw *hw; ++ int i; ++ ++ if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) { ++ hw = hw_list[pci_domain_nr(dev->wlan.pci_dev->bus)]; ++ if (!hw) ++ return NULL; ++ ++ if (!hw->wed_dev) ++ goto out; ++ ++ if (hw->version == 1) ++ return NULL; ++ ++ /* MT7986 WED devices do not have any pcie slot restrictions */ ++ } ++ /* MT7986 PCIE or AXI */ ++ for (i = 0; i < ARRAY_SIZE(hw_list); i++) { ++ hw = hw_list[i]; ++ if (hw && !hw->wed_dev) ++ goto out; ++ } + +- hw = hw_list[pci_domain_nr(dev->wlan.pci_dev->bus)]; +- if (!hw || hw->wed_dev) +- return NULL; ++ return NULL; + ++out: + hw->wed_dev = dev; + return hw; + } +@@ -322,7 +342,6 @@ mtk_wed_stop(struct mtk_wed_device *dev) + static void + mtk_wed_detach(struct mtk_wed_device *dev) + { +- struct device_node *wlan_node = dev->wlan.pci_dev->dev.of_node; + struct mtk_wed_hw *hw = dev->hw; + + mutex_lock(&hw_lock); +@@ -337,9 +356,14 @@ mtk_wed_detach(struct mtk_wed_device *de + mtk_wed_free_buffer(dev); + mtk_wed_free_tx_rings(dev); + +- if (of_dma_is_coherent(wlan_node) && hw->hifsys) +- regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP, +- BIT(hw->index), BIT(hw->index)); ++ if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) { ++ struct device_node *wlan_node; ++ ++ wlan_node = dev->wlan.pci_dev->dev.of_node; ++ if (of_dma_is_coherent(wlan_node) && hw->hifsys) ++ regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP, ++ BIT(hw->index), BIT(hw->index)); ++ } + + if (!hw_list[!hw->index]->wed_dev && + hw->eth->dma_dev != hw->eth->dev) +@@ -356,40 +380,54 @@ mtk_wed_detach(struct mtk_wed_device *de + static void + mtk_wed_bus_init(struct mtk_wed_device *dev) + { +- struct device_node *np = dev->hw->eth->dev->of_node; +- struct regmap *regs; +- u32 val; +- +- regs = syscon_regmap_lookup_by_phandle(np, "mediatek,wed-pcie"); +- if (IS_ERR(regs)) +- return; ++ switch (dev->wlan.bus_type) { ++ case MTK_WED_BUS_PCIE: { ++ struct device_node *np = dev->hw->eth->dev->of_node; ++ struct regmap *regs; ++ u32 val; ++ ++ regs = syscon_regmap_lookup_by_phandle(np, ++ "mediatek,wed-pcie"); ++ if (IS_ERR(regs)) ++ break; + +- regmap_update_bits(regs, 0, BIT(0), BIT(0)); ++ regmap_update_bits(regs, 0, BIT(0), BIT(0)); + +- wed_w32(dev, MTK_WED_PCIE_INT_CTRL, +- FIELD_PREP(MTK_WED_PCIE_INT_CTRL_POLL_EN, 2)); ++ wed_w32(dev, MTK_WED_PCIE_INT_CTRL, ++ FIELD_PREP(MTK_WED_PCIE_INT_CTRL_POLL_EN, 2)); + +- /* pcie interrupt control: pola/source selection */ +- wed_set(dev, MTK_WED_PCIE_INT_CTRL, +- MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA | +- FIELD_PREP(MTK_WED_PCIE_INT_CTRL_SRC_SEL, 1)); +- wed_r32(dev, MTK_WED_PCIE_INT_CTRL); +- +- val = wed_r32(dev, MTK_WED_PCIE_CFG_INTM); +- val = wed_r32(dev, MTK_WED_PCIE_CFG_BASE); +- wed_w32(dev, MTK_WED_PCIE_CFG_INTM, PCIE_BASE_ADDR0 | 0x180); +- wed_w32(dev, MTK_WED_PCIE_CFG_BASE, PCIE_BASE_ADDR0 | 0x184); +- +- val = wed_r32(dev, MTK_WED_PCIE_CFG_INTM); +- val = wed_r32(dev, MTK_WED_PCIE_CFG_BASE); +- +- /* pcie interrupt status trigger register */ +- wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, BIT(24)); +- wed_r32(dev, MTK_WED_PCIE_INT_TRIGGER); +- +- /* pola setting */ +- val = wed_r32(dev, MTK_WED_PCIE_INT_CTRL); +- wed_set(dev, MTK_WED_PCIE_INT_CTRL, MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA); ++ /* pcie interrupt control: pola/source selection */ ++ wed_set(dev, MTK_WED_PCIE_INT_CTRL, ++ MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA | ++ FIELD_PREP(MTK_WED_PCIE_INT_CTRL_SRC_SEL, 1)); ++ wed_r32(dev, MTK_WED_PCIE_INT_CTRL); ++ ++ val = wed_r32(dev, MTK_WED_PCIE_CFG_INTM); ++ val = wed_r32(dev, MTK_WED_PCIE_CFG_BASE); ++ wed_w32(dev, MTK_WED_PCIE_CFG_INTM, PCIE_BASE_ADDR0 | 0x180); ++ wed_w32(dev, MTK_WED_PCIE_CFG_BASE, PCIE_BASE_ADDR0 | 0x184); ++ ++ val = wed_r32(dev, MTK_WED_PCIE_CFG_INTM); ++ val = wed_r32(dev, MTK_WED_PCIE_CFG_BASE); ++ ++ /* pcie interrupt status trigger register */ ++ wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, BIT(24)); ++ wed_r32(dev, MTK_WED_PCIE_INT_TRIGGER); ++ ++ /* pola setting */ ++ val = wed_r32(dev, MTK_WED_PCIE_INT_CTRL); ++ wed_set(dev, MTK_WED_PCIE_INT_CTRL, ++ MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA); ++ break; ++ } ++ case MTK_WED_BUS_AXI: ++ wed_set(dev, MTK_WED_WPDMA_INT_CTRL, ++ MTK_WED_WPDMA_INT_CTRL_SIG_SRC | ++ FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_SRC_SEL, 0)); ++ break; ++ default: ++ break; ++ } + } + + static void +@@ -800,12 +838,14 @@ mtk_wed_attach(struct mtk_wed_device *de + __releases(RCU) + { + struct mtk_wed_hw *hw; ++ struct device *device; + int ret = 0; + + RCU_LOCKDEP_WARN(!rcu_read_lock_held(), + "mtk_wed_attach without holding the RCU read lock"); + +- if (pci_domain_nr(dev->wlan.pci_dev->bus) > 1 || ++ if ((dev->wlan.bus_type == MTK_WED_BUS_PCIE && ++ pci_domain_nr(dev->wlan.pci_dev->bus) > 1) || + !try_module_get(THIS_MODULE)) + ret = -ENODEV; + +@@ -823,8 +863,10 @@ mtk_wed_attach(struct mtk_wed_device *de + goto out; + } + +- dev_info(&dev->wlan.pci_dev->dev, +- "attaching wed device %d version %d\n", ++ device = dev->wlan.bus_type == MTK_WED_BUS_PCIE ++ ? &dev->wlan.pci_dev->dev ++ : &dev->wlan.platform_dev->dev; ++ dev_info(device, "attaching wed device %d version %d\n", + hw->index, hw->version); + + dev->hw = hw; +--- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h +@@ -198,6 +198,8 @@ struct mtk_wdma_desc { + + #define MTK_WED_WPDMA_INT_CTRL 0x520 + #define MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV BIT(21) ++#define MTK_WED_WPDMA_INT_CTRL_SIG_SRC BIT(22) ++#define MTK_WED_WPDMA_INT_CTRL_SRC_SEL GENMASK(17, 16) + + #define MTK_WED_WPDMA_INT_MASK 0x524 + +--- a/include/linux/soc/mediatek/mtk_wed.h ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -11,6 +11,11 @@ + struct mtk_wed_hw; + struct mtk_wdma_desc; + ++enum mtk_wed_bus_tye { ++ MTK_WED_BUS_PCIE, ++ MTK_WED_BUS_AXI, ++}; ++ + struct mtk_wed_ring { + struct mtk_wdma_desc *desc; + dma_addr_t desc_phys; +@@ -43,7 +48,11 @@ struct mtk_wed_device { + + /* filled by driver: */ + struct { +- struct pci_dev *pci_dev; ++ union { ++ struct platform_device *platform_dev; ++ struct pci_dev *pci_dev; ++ }; ++ enum mtk_wed_bus_tye bus_type; + + u32 wpdma_phys; + u32 wpdma_int; diff --git a/target/linux/generic/backport-5.15/723-v6.0-net-ethernet-mtk_eth_soc-introduce-flow-offloading-s.patch b/target/linux/generic/backport-5.15/723-v6.0-net-ethernet-mtk_eth_soc-introduce-flow-offloading-s.patch new file mode 100644 index 0000000000..f10878da43 --- /dev/null +++ b/target/linux/generic/backport-5.15/723-v6.0-net-ethernet-mtk_eth_soc-introduce-flow-offloading-s.patch @@ -0,0 +1,882 @@ +From 93408c858e5dc01d97c55efa721268f63fde2ae5 Mon Sep 17 00:00:00 2001 +Message-Id: <93408c858e5dc01d97c55efa721268f63fde2ae5.1662886034.git.lorenzo@kernel.org> +In-Reply-To: +References: +From: Lorenzo Bianconi +Date: Sat, 3 Sep 2022 18:34:09 +0200 +Subject: [PATCH net-next 4/5] net: ethernet: mtk_eth_soc: introduce flow + offloading support for mt7986 + +Introduce hw flow offload support for mt7986 chipset. PPE is not enabled +yet in mt7986 since mt76 support is not available yet. + +Co-developed-by: Bo Jiao +Signed-off-by: Bo Jiao +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 11 +- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 72 ++++++ + drivers/net/ethernet/mediatek/mtk_ppe.c | 213 +++++++++++------- + drivers/net/ethernet/mediatek/mtk_ppe.h | 52 ++++- + .../net/ethernet/mediatek/mtk_ppe_offload.c | 49 ++-- + drivers/net/ethernet/mediatek/mtk_ppe_regs.h | 8 + + 6 files changed, 289 insertions(+), 116 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1859,12 +1859,14 @@ static int mtk_poll_rx(struct napi_struc + bytes += skb->len; + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ reason = FIELD_GET(MTK_RXD5_PPE_CPU_REASON, trxd.rxd5); + hash = trxd.rxd5 & MTK_RXD5_FOE_ENTRY; + if (hash != MTK_RXD5_FOE_ENTRY) + skb_set_hash(skb, jhash_1word(hash, 0), + PKT_HASH_TYPE_L4); + rxdcsum = &trxd.rxd3; + } else { ++ reason = FIELD_GET(MTK_RXD4_PPE_CPU_REASON, trxd.rxd4); + hash = trxd.rxd4 & MTK_RXD4_FOE_ENTRY; + if (hash != MTK_RXD4_FOE_ENTRY) + skb_set_hash(skb, jhash_1word(hash, 0), +@@ -1878,7 +1880,6 @@ static int mtk_poll_rx(struct napi_struc + skb_checksum_none_assert(skb); + skb->protocol = eth_type_trans(skb, netdev); + +- reason = FIELD_GET(MTK_RXD4_PPE_CPU_REASON, trxd.rxd4); + if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) + mtk_ppe_check_skb(eth->ppe[0], skb, hash); + +@@ -4180,7 +4181,7 @@ static const struct mtk_soc_data mt7621_ + .required_pctl = false, + .offload_version = 2, + .hash_offset = 2, +- .foe_entry_size = sizeof(struct mtk_foe_entry), ++ .foe_entry_size = sizeof(struct mtk_foe_entry) - 16, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4200,7 +4201,7 @@ static const struct mtk_soc_data mt7622_ + .required_pctl = false, + .offload_version = 2, + .hash_offset = 2, +- .foe_entry_size = sizeof(struct mtk_foe_entry), ++ .foe_entry_size = sizeof(struct mtk_foe_entry) - 16, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4219,7 +4220,7 @@ static const struct mtk_soc_data mt7623_ + .required_pctl = true, + .offload_version = 2, + .hash_offset = 2, +- .foe_entry_size = sizeof(struct mtk_foe_entry), ++ .foe_entry_size = sizeof(struct mtk_foe_entry) - 16, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4251,9 +4252,11 @@ static const struct mtk_soc_data mt7986_ + .reg_map = &mt7986_reg_map, + .ana_rgc3 = 0x128, + .caps = MT7986_CAPS, ++ .hw_features = MTK_HW_FEATURES, + .required_clks = MT7986_CLKS_BITMAP, + .required_pctl = false, + .hash_offset = 4, ++ .foe_entry_size = sizeof(struct mtk_foe_entry), + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma_v2), + .rxd_size = sizeof(struct mtk_rx_dma_v2), +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1151,6 +1151,78 @@ mtk_foe_get_entry(struct mtk_ppe *ppe, u + return ppe->foe_table + hash * soc->foe_entry_size; + } + ++static inline u32 mtk_get_ib1_ts_mask(struct mtk_eth *eth) ++{ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ return MTK_FOE_IB1_BIND_TIMESTAMP_V2; ++ ++ return MTK_FOE_IB1_BIND_TIMESTAMP; ++} ++ ++static inline u32 mtk_get_ib1_ppoe_mask(struct mtk_eth *eth) ++{ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ return MTK_FOE_IB1_BIND_PPPOE_V2; ++ ++ return MTK_FOE_IB1_BIND_PPPOE; ++} ++ ++static inline u32 mtk_get_ib1_vlan_tag_mask(struct mtk_eth *eth) ++{ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ return MTK_FOE_IB1_BIND_VLAN_TAG_V2; ++ ++ return MTK_FOE_IB1_BIND_VLAN_TAG; ++} ++ ++static inline u32 mtk_get_ib1_vlan_layer_mask(struct mtk_eth *eth) ++{ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ return MTK_FOE_IB1_BIND_VLAN_LAYER_V2; ++ ++ return MTK_FOE_IB1_BIND_VLAN_LAYER; ++} ++ ++static inline u32 mtk_prep_ib1_vlan_layer(struct mtk_eth *eth, u32 val) ++{ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ return FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER_V2, val); ++ ++ return FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, val); ++} ++ ++static inline u32 mtk_get_ib1_vlan_layer(struct mtk_eth *eth, u32 val) ++{ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ return FIELD_GET(MTK_FOE_IB1_BIND_VLAN_LAYER_V2, val); ++ ++ return FIELD_GET(MTK_FOE_IB1_BIND_VLAN_LAYER, val); ++} ++ ++static inline u32 mtk_get_ib1_pkt_type_mask(struct mtk_eth *eth) ++{ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ return MTK_FOE_IB1_PACKET_TYPE_V2; ++ ++ return MTK_FOE_IB1_PACKET_TYPE; ++} ++ ++static inline u32 mtk_get_ib1_pkt_type(struct mtk_eth *eth, u32 val) ++{ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ return FIELD_GET(MTK_FOE_IB1_PACKET_TYPE_V2, val); ++ ++ return FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, val); ++} ++ ++static inline u32 mtk_get_ib2_multicast_mask(struct mtk_eth *eth) ++{ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ return MTK_FOE_IB2_MULTICAST_V2; ++ ++ return MTK_FOE_IB2_MULTICAST; ++} ++ + /* read the hardware status register */ + void mtk_stats_update_mac(struct mtk_mac *mac); + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -56,7 +56,7 @@ static u32 ppe_clear(struct mtk_ppe *ppe + + static u32 mtk_eth_timestamp(struct mtk_eth *eth) + { +- return mtk_r32(eth, 0x0010) & MTK_FOE_IB1_BIND_TIMESTAMP; ++ return mtk_r32(eth, 0x0010) & mtk_get_ib1_ts_mask(eth); + } + + static int mtk_ppe_wait_busy(struct mtk_ppe *ppe) +@@ -93,7 +93,7 @@ static u32 mtk_ppe_hash_entry(struct mtk + u32 hv1, hv2, hv3; + u32 hash; + +- switch (FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, e->ib1)) { ++ switch (mtk_get_ib1_pkt_type(eth, e->ib1)) { + case MTK_PPE_PKT_TYPE_IPV4_ROUTE: + case MTK_PPE_PKT_TYPE_IPV4_HNAPT: + hv1 = e->ipv4.orig.ports; +@@ -129,9 +129,9 @@ static u32 mtk_ppe_hash_entry(struct mtk + } + + static inline struct mtk_foe_mac_info * +-mtk_foe_entry_l2(struct mtk_foe_entry *entry) ++mtk_foe_entry_l2(struct mtk_eth *eth, struct mtk_foe_entry *entry) + { +- int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); ++ int type = mtk_get_ib1_pkt_type(eth, entry->ib1); + + if (type == MTK_PPE_PKT_TYPE_BRIDGE) + return &entry->bridge.l2; +@@ -143,9 +143,9 @@ mtk_foe_entry_l2(struct mtk_foe_entry *e + } + + static inline u32 * +-mtk_foe_entry_ib2(struct mtk_foe_entry *entry) ++mtk_foe_entry_ib2(struct mtk_eth *eth, struct mtk_foe_entry *entry) + { +- int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); ++ int type = mtk_get_ib1_pkt_type(eth, entry->ib1); + + if (type == MTK_PPE_PKT_TYPE_BRIDGE) + return &entry->bridge.ib2; +@@ -156,27 +156,38 @@ mtk_foe_entry_ib2(struct mtk_foe_entry * + return &entry->ipv4.ib2; + } + +-int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto, +- u8 pse_port, u8 *src_mac, u8 *dest_mac) ++int mtk_foe_entry_prepare(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ int type, int l4proto, u8 pse_port, u8 *src_mac, ++ u8 *dest_mac) + { + struct mtk_foe_mac_info *l2; + u32 ports_pad, val; + + memset(entry, 0, sizeof(*entry)); + +- val = FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND) | +- FIELD_PREP(MTK_FOE_IB1_PACKET_TYPE, type) | +- FIELD_PREP(MTK_FOE_IB1_UDP, l4proto == IPPROTO_UDP) | +- MTK_FOE_IB1_BIND_TTL | +- MTK_FOE_IB1_BIND_CACHE; +- entry->ib1 = val; +- +- val = FIELD_PREP(MTK_FOE_IB2_PORT_MG, 0x3f) | +- FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0x1f) | +- FIELD_PREP(MTK_FOE_IB2_DEST_PORT, pse_port); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ val = FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND) | ++ FIELD_PREP(MTK_FOE_IB1_PACKET_TYPE_V2, type) | ++ FIELD_PREP(MTK_FOE_IB1_UDP, l4proto == IPPROTO_UDP) | ++ MTK_FOE_IB1_BIND_CACHE_V2 | MTK_FOE_IB1_BIND_TTL_V2; ++ entry->ib1 = val; ++ ++ val = FIELD_PREP(MTK_FOE_IB2_DEST_PORT_V2, pse_port) | ++ FIELD_PREP(MTK_FOE_IB2_PORT_AG_V2, 0xf); ++ } else { ++ val = FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND) | ++ FIELD_PREP(MTK_FOE_IB1_PACKET_TYPE, type) | ++ FIELD_PREP(MTK_FOE_IB1_UDP, l4proto == IPPROTO_UDP) | ++ MTK_FOE_IB1_BIND_CACHE | MTK_FOE_IB1_BIND_TTL; ++ entry->ib1 = val; ++ ++ val = FIELD_PREP(MTK_FOE_IB2_DEST_PORT, pse_port) | ++ FIELD_PREP(MTK_FOE_IB2_PORT_MG, 0x3f) | ++ FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0x1f); ++ } + + if (is_multicast_ether_addr(dest_mac)) +- val |= MTK_FOE_IB2_MULTICAST; ++ val |= mtk_get_ib2_multicast_mask(eth); + + ports_pad = 0xa5a5a500 | (l4proto & 0xff); + if (type == MTK_PPE_PKT_TYPE_IPV4_ROUTE) +@@ -210,24 +221,30 @@ int mtk_foe_entry_prepare(struct mtk_foe + return 0; + } + +-int mtk_foe_entry_set_pse_port(struct mtk_foe_entry *entry, u8 port) ++int mtk_foe_entry_set_pse_port(struct mtk_eth *eth, ++ struct mtk_foe_entry *entry, u8 port) + { +- u32 *ib2 = mtk_foe_entry_ib2(entry); +- u32 val; ++ u32 *ib2 = mtk_foe_entry_ib2(eth, entry); ++ u32 val = *ib2; + +- val = *ib2; +- val &= ~MTK_FOE_IB2_DEST_PORT; +- val |= FIELD_PREP(MTK_FOE_IB2_DEST_PORT, port); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ val &= ~MTK_FOE_IB2_DEST_PORT_V2; ++ val |= FIELD_PREP(MTK_FOE_IB2_DEST_PORT_V2, port); ++ } else { ++ val &= ~MTK_FOE_IB2_DEST_PORT; ++ val |= FIELD_PREP(MTK_FOE_IB2_DEST_PORT, port); ++ } + *ib2 = val; + + return 0; + } + +-int mtk_foe_entry_set_ipv4_tuple(struct mtk_foe_entry *entry, bool egress, ++int mtk_foe_entry_set_ipv4_tuple(struct mtk_eth *eth, ++ struct mtk_foe_entry *entry, bool egress, + __be32 src_addr, __be16 src_port, + __be32 dest_addr, __be16 dest_port) + { +- int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); ++ int type = mtk_get_ib1_pkt_type(eth, entry->ib1); + struct mtk_ipv4_tuple *t; + + switch (type) { +@@ -262,11 +279,12 @@ int mtk_foe_entry_set_ipv4_tuple(struct + return 0; + } + +-int mtk_foe_entry_set_ipv6_tuple(struct mtk_foe_entry *entry, ++int mtk_foe_entry_set_ipv6_tuple(struct mtk_eth *eth, ++ struct mtk_foe_entry *entry, + __be32 *src_addr, __be16 src_port, + __be32 *dest_addr, __be16 dest_port) + { +- int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); ++ int type = mtk_get_ib1_pkt_type(eth, entry->ib1); + u32 *src, *dest; + int i; + +@@ -297,39 +315,41 @@ int mtk_foe_entry_set_ipv6_tuple(struct + return 0; + } + +-int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port) ++int mtk_foe_entry_set_dsa(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ int port) + { +- struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry); ++ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(eth, entry); + + l2->etype = BIT(port); + +- if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_LAYER)) +- entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1); ++ if (!(entry->ib1 & mtk_get_ib1_vlan_layer_mask(eth))) ++ entry->ib1 |= mtk_prep_ib1_vlan_layer(eth, 1); + else + l2->etype |= BIT(8); + +- entry->ib1 &= ~MTK_FOE_IB1_BIND_VLAN_TAG; ++ entry->ib1 &= ~mtk_get_ib1_vlan_tag_mask(eth); + + return 0; + } + +-int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid) ++int mtk_foe_entry_set_vlan(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ int vid) + { +- struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry); ++ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(eth, entry); + +- switch (FIELD_GET(MTK_FOE_IB1_BIND_VLAN_LAYER, entry->ib1)) { ++ switch (mtk_prep_ib1_vlan_layer(eth, entry->ib1)) { + case 0: +- entry->ib1 |= MTK_FOE_IB1_BIND_VLAN_TAG | +- FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1); ++ entry->ib1 |= mtk_get_ib1_vlan_tag_mask(eth) | ++ mtk_prep_ib1_vlan_layer(eth, 1); + l2->vlan1 = vid; + return 0; + case 1: +- if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_TAG)) { ++ if (!(entry->ib1 & mtk_get_ib1_vlan_tag_mask(eth))) { + l2->vlan1 = vid; + l2->etype |= BIT(8); + } else { + l2->vlan2 = vid; +- entry->ib1 += FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1); ++ entry->ib1 += mtk_prep_ib1_vlan_layer(eth, 1); + } + return 0; + default: +@@ -337,34 +357,42 @@ int mtk_foe_entry_set_vlan(struct mtk_fo + } + } + +-int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid) ++int mtk_foe_entry_set_pppoe(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ int sid) + { +- struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry); ++ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(eth, entry); + +- if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_LAYER) || +- (entry->ib1 & MTK_FOE_IB1_BIND_VLAN_TAG)) ++ if (!(entry->ib1 & mtk_get_ib1_vlan_layer_mask(eth)) || ++ (entry->ib1 & mtk_get_ib1_vlan_tag_mask(eth))) + l2->etype = ETH_P_PPP_SES; + +- entry->ib1 |= MTK_FOE_IB1_BIND_PPPOE; ++ entry->ib1 |= mtk_get_ib1_ppoe_mask(eth); + l2->pppoe_id = sid; + + return 0; + } + +-int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq, +- int bss, int wcid) ++int mtk_foe_entry_set_wdma(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ int wdma_idx, int txq, int bss, int wcid) + { +- struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry); +- u32 *ib2 = mtk_foe_entry_ib2(entry); ++ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(eth, entry); ++ u32 *ib2 = mtk_foe_entry_ib2(eth, entry); + +- *ib2 &= ~MTK_FOE_IB2_PORT_MG; +- *ib2 |= MTK_FOE_IB2_WDMA_WINFO; +- if (wdma_idx) +- *ib2 |= MTK_FOE_IB2_WDMA_DEVIDX; +- +- l2->vlan2 = FIELD_PREP(MTK_FOE_VLAN2_WINFO_BSS, bss) | +- FIELD_PREP(MTK_FOE_VLAN2_WINFO_WCID, wcid) | +- FIELD_PREP(MTK_FOE_VLAN2_WINFO_RING, txq); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ *ib2 &= ~MTK_FOE_IB2_PORT_MG_V2; ++ *ib2 |= FIELD_PREP(MTK_FOE_IB2_RX_IDX, txq) | ++ MTK_FOE_IB2_WDMA_WINFO_V2; ++ l2->winfo = FIELD_PREP(MTK_FOE_WINFO_WCID, wcid) | ++ FIELD_PREP(MTK_FOE_WINFO_BSS, bss); ++ } else { ++ *ib2 &= ~MTK_FOE_IB2_PORT_MG; ++ *ib2 |= MTK_FOE_IB2_WDMA_WINFO; ++ if (wdma_idx) ++ *ib2 |= MTK_FOE_IB2_WDMA_DEVIDX; ++ l2->vlan2 = FIELD_PREP(MTK_FOE_VLAN2_WINFO_BSS, bss) | ++ FIELD_PREP(MTK_FOE_VLAN2_WINFO_WCID, wcid) | ++ FIELD_PREP(MTK_FOE_VLAN2_WINFO_RING, txq); ++ } + + return 0; + } +@@ -376,14 +404,15 @@ static inline bool mtk_foe_entry_usable( + } + + static bool +-mtk_flow_entry_match(struct mtk_flow_entry *entry, struct mtk_foe_entry *data) ++mtk_flow_entry_match(struct mtk_eth *eth, struct mtk_flow_entry *entry, ++ struct mtk_foe_entry *data) + { + int type, len; + + if ((data->ib1 ^ entry->data.ib1) & MTK_FOE_IB1_UDP) + return false; + +- type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->data.ib1); ++ type = mtk_get_ib1_pkt_type(eth, entry->data.ib1); + if (type > MTK_PPE_PKT_TYPE_IPV4_DSLITE) + len = offsetof(struct mtk_foe_entry, ipv6._rsv); + else +@@ -427,14 +456,12 @@ __mtk_foe_entry_clear(struct mtk_ppe *pp + + static int __mtk_foe_entry_idle_time(struct mtk_ppe *ppe, u32 ib1) + { +- u16 timestamp; +- u16 now; +- +- now = mtk_eth_timestamp(ppe->eth) & MTK_FOE_IB1_BIND_TIMESTAMP; +- timestamp = ib1 & MTK_FOE_IB1_BIND_TIMESTAMP; ++ u32 ib1_ts_mask = mtk_get_ib1_ts_mask(ppe->eth); ++ u16 now = mtk_eth_timestamp(ppe->eth); ++ u16 timestamp = ib1 & ib1_ts_mask; + + if (timestamp > now) +- return MTK_FOE_IB1_BIND_TIMESTAMP + 1 - timestamp + now; ++ return ib1_ts_mask + 1 - timestamp + now; + else + return now - timestamp; + } +@@ -442,6 +469,7 @@ static int __mtk_foe_entry_idle_time(str + static void + mtk_flow_entry_update_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { ++ u32 ib1_ts_mask = mtk_get_ib1_ts_mask(ppe->eth); + struct mtk_flow_entry *cur; + struct mtk_foe_entry *hwe; + struct hlist_node *tmp; +@@ -466,8 +494,8 @@ mtk_flow_entry_update_l2(struct mtk_ppe + continue; + + idle = cur_idle; +- entry->data.ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP; +- entry->data.ib1 |= hwe->ib1 & MTK_FOE_IB1_BIND_TIMESTAMP; ++ entry->data.ib1 &= ~ib1_ts_mask; ++ entry->data.ib1 |= hwe->ib1 & ib1_ts_mask; + } + } + +@@ -489,7 +517,7 @@ mtk_flow_entry_update(struct mtk_ppe *pp + + hwe = mtk_foe_get_entry(ppe, entry->hash); + memcpy(&foe, hwe, ppe->eth->soc->foe_entry_size); +- if (!mtk_flow_entry_match(entry, &foe)) { ++ if (!mtk_flow_entry_match(ppe->eth, entry, &foe)) { + entry->hash = 0xffff; + goto out; + } +@@ -504,16 +532,22 @@ static void + __mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, + u16 hash) + { ++ struct mtk_eth *eth = ppe->eth; ++ u16 timestamp = mtk_eth_timestamp(eth); + struct mtk_foe_entry *hwe; +- u16 timestamp; + +- timestamp = mtk_eth_timestamp(ppe->eth); +- timestamp &= MTK_FOE_IB1_BIND_TIMESTAMP; +- entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP; +- entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_TIMESTAMP, timestamp); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP_V2; ++ entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_TIMESTAMP_V2, ++ timestamp); ++ } else { ++ entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP; ++ entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_TIMESTAMP, ++ timestamp); ++ } + + hwe = mtk_foe_get_entry(ppe, hash); +- memcpy(&hwe->data, &entry->data, ppe->eth->soc->foe_entry_size); ++ memcpy(&hwe->data, &entry->data, eth->soc->foe_entry_size); + wmb(); + hwe->ib1 = entry->ib1; + +@@ -540,8 +574,8 @@ mtk_foe_entry_commit_l2(struct mtk_ppe * + + int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { +- int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->data.ib1); + const struct mtk_soc_data *soc = ppe->eth->soc; ++ int type = mtk_get_ib1_pkt_type(ppe->eth, entry->data.ib1); + u32 hash; + + if (type == MTK_PPE_PKT_TYPE_BRIDGE) +@@ -564,7 +598,7 @@ mtk_foe_entry_commit_subflow(struct mtk_ + struct mtk_flow_entry *flow_info; + struct mtk_foe_entry foe = {}, *hwe; + struct mtk_foe_mac_info *l2; +- u32 ib1_mask = MTK_FOE_IB1_PACKET_TYPE | MTK_FOE_IB1_UDP; ++ u32 ib1_mask = mtk_get_ib1_pkt_type_mask(ppe->eth) | MTK_FOE_IB1_UDP; + int type; + + flow_info = kzalloc(offsetof(struct mtk_flow_entry, l2_data.end), +@@ -584,16 +618,16 @@ mtk_foe_entry_commit_subflow(struct mtk_ + foe.ib1 &= ib1_mask; + foe.ib1 |= entry->data.ib1 & ~ib1_mask; + +- l2 = mtk_foe_entry_l2(&foe); ++ l2 = mtk_foe_entry_l2(ppe->eth, &foe); + memcpy(l2, &entry->data.bridge.l2, sizeof(*l2)); + +- type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, foe.ib1); ++ type = mtk_get_ib1_pkt_type(ppe->eth, foe.ib1); + if (type == MTK_PPE_PKT_TYPE_IPV4_HNAPT) + memcpy(&foe.ipv4.new, &foe.ipv4.orig, sizeof(foe.ipv4.new)); + else if (type >= MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T && l2->etype == ETH_P_IP) + l2->etype = ETH_P_IPV6; + +- *mtk_foe_entry_ib2(&foe) = entry->data.bridge.ib2; ++ *mtk_foe_entry_ib2(ppe->eth, &foe) = entry->data.bridge.ib2; + + __mtk_foe_entry_commit(ppe, &foe, hash); + } +@@ -626,7 +660,7 @@ void __mtk_ppe_check_skb(struct mtk_ppe + continue; + } + +- if (found || !mtk_flow_entry_match(entry, hwe)) { ++ if (found || !mtk_flow_entry_match(ppe->eth, entry, hwe)) { + if (entry->hash != 0xffff) + entry->hash = 0xffff; + continue; +@@ -771,6 +805,8 @@ void mtk_ppe_start(struct mtk_ppe *ppe) + MTK_PPE_SCAN_MODE_KEEPALIVE_AGE) | + FIELD_PREP(MTK_PPE_TB_CFG_ENTRY_NUM, + MTK_PPE_ENTRIES_SHIFT); ++ if (MTK_HAS_CAPS(ppe->eth->soc->caps, MTK_NETSYS_V2)) ++ val |= MTK_PPE_TB_CFG_INFO_SEL; + ppe_w32(ppe, MTK_PPE_TB_CFG, val); + + ppe_w32(ppe, MTK_PPE_IP_PROTO_CHK, +@@ -778,15 +814,21 @@ void mtk_ppe_start(struct mtk_ppe *ppe) + + mtk_ppe_cache_enable(ppe, true); + +- val = MTK_PPE_FLOW_CFG_IP4_TCP_FRAG | +- MTK_PPE_FLOW_CFG_IP4_UDP_FRAG | +- MTK_PPE_FLOW_CFG_IP6_3T_ROUTE | ++ val = MTK_PPE_FLOW_CFG_IP6_3T_ROUTE | + MTK_PPE_FLOW_CFG_IP6_5T_ROUTE | + MTK_PPE_FLOW_CFG_IP6_6RD | + MTK_PPE_FLOW_CFG_IP4_NAT | + MTK_PPE_FLOW_CFG_IP4_NAPT | + MTK_PPE_FLOW_CFG_IP4_DSLITE | + MTK_PPE_FLOW_CFG_IP4_NAT_FRAG; ++ if (MTK_HAS_CAPS(ppe->eth->soc->caps, MTK_NETSYS_V2)) ++ val |= MTK_PPE_MD_TOAP_BYP_CRSN0 | ++ MTK_PPE_MD_TOAP_BYP_CRSN1 | ++ MTK_PPE_MD_TOAP_BYP_CRSN2 | ++ MTK_PPE_FLOW_CFG_IP4_HASH_GRE_KEY; ++ else ++ val |= MTK_PPE_FLOW_CFG_IP4_TCP_FRAG | ++ MTK_PPE_FLOW_CFG_IP4_UDP_FRAG; + ppe_w32(ppe, MTK_PPE_FLOW_CFG, val); + + val = FIELD_PREP(MTK_PPE_UNBIND_AGE_MIN_PACKETS, 1000) | +@@ -820,6 +862,11 @@ void mtk_ppe_start(struct mtk_ppe *ppe) + ppe_w32(ppe, MTK_PPE_GLO_CFG, val); + + ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT, 0); ++ ++ if (MTK_HAS_CAPS(ppe->eth->soc->caps, MTK_NETSYS_V2)) { ++ ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT1, 0xcb777); ++ ppe_w32(ppe, MTK_PPE_SBW_CTRL, 0x7f); ++ } + } + + int mtk_ppe_stop(struct mtk_ppe *ppe) +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -32,6 +32,15 @@ + #define MTK_FOE_IB1_UDP BIT(30) + #define MTK_FOE_IB1_STATIC BIT(31) + ++/* CONFIG_MEDIATEK_NETSYS_V2 */ ++#define MTK_FOE_IB1_BIND_TIMESTAMP_V2 GENMASK(7, 0) ++#define MTK_FOE_IB1_BIND_VLAN_LAYER_V2 GENMASK(16, 14) ++#define MTK_FOE_IB1_BIND_PPPOE_V2 BIT(17) ++#define MTK_FOE_IB1_BIND_VLAN_TAG_V2 BIT(18) ++#define MTK_FOE_IB1_BIND_CACHE_V2 BIT(20) ++#define MTK_FOE_IB1_BIND_TTL_V2 BIT(22) ++#define MTK_FOE_IB1_PACKET_TYPE_V2 GENMASK(27, 23) ++ + enum { + MTK_PPE_PKT_TYPE_IPV4_HNAPT = 0, + MTK_PPE_PKT_TYPE_IPV4_ROUTE = 1, +@@ -53,14 +62,25 @@ enum { + + #define MTK_FOE_IB2_PORT_MG GENMASK(17, 12) + ++#define MTK_FOE_IB2_RX_IDX GENMASK(18, 17) + #define MTK_FOE_IB2_PORT_AG GENMASK(23, 18) + + #define MTK_FOE_IB2_DSCP GENMASK(31, 24) + ++/* CONFIG_MEDIATEK_NETSYS_V2 */ ++#define MTK_FOE_IB2_PORT_MG_V2 BIT(7) ++#define MTK_FOE_IB2_DEST_PORT_V2 GENMASK(12, 9) ++#define MTK_FOE_IB2_MULTICAST_V2 BIT(13) ++#define MTK_FOE_IB2_WDMA_WINFO_V2 BIT(19) ++#define MTK_FOE_IB2_PORT_AG_V2 GENMASK(23, 20) ++ + #define MTK_FOE_VLAN2_WINFO_BSS GENMASK(5, 0) + #define MTK_FOE_VLAN2_WINFO_WCID GENMASK(13, 6) + #define MTK_FOE_VLAN2_WINFO_RING GENMASK(15, 14) + ++#define MTK_FOE_WINFO_BSS GENMASK(5, 0) ++#define MTK_FOE_WINFO_WCID GENMASK(15, 6) ++ + enum { + MTK_FOE_STATE_INVALID, + MTK_FOE_STATE_UNBIND, +@@ -81,6 +101,9 @@ struct mtk_foe_mac_info { + + u16 pppoe_id; + u16 src_mac_lo; ++ ++ u16 minfo; ++ u16 winfo; + }; + + /* software-only entry type */ +@@ -198,7 +221,7 @@ struct mtk_foe_entry { + struct mtk_foe_ipv4_dslite dslite; + struct mtk_foe_ipv6 ipv6; + struct mtk_foe_ipv6_6rd ipv6_6rd; +- u32 data[19]; ++ u32 data[23]; + }; + }; + +@@ -306,20 +329,27 @@ mtk_ppe_check_skb(struct mtk_ppe *ppe, s + __mtk_ppe_check_skb(ppe, skb, hash); + } + +-int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto, +- u8 pse_port, u8 *src_mac, u8 *dest_mac); +-int mtk_foe_entry_set_pse_port(struct mtk_foe_entry *entry, u8 port); +-int mtk_foe_entry_set_ipv4_tuple(struct mtk_foe_entry *entry, bool orig, ++int mtk_foe_entry_prepare(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ int type, int l4proto, u8 pse_port, u8 *src_mac, ++ u8 *dest_mac); ++int mtk_foe_entry_set_pse_port(struct mtk_eth *eth, ++ struct mtk_foe_entry *entry, u8 port); ++int mtk_foe_entry_set_ipv4_tuple(struct mtk_eth *eth, ++ struct mtk_foe_entry *entry, bool orig, + __be32 src_addr, __be16 src_port, + __be32 dest_addr, __be16 dest_port); +-int mtk_foe_entry_set_ipv6_tuple(struct mtk_foe_entry *entry, ++int mtk_foe_entry_set_ipv6_tuple(struct mtk_eth *eth, ++ struct mtk_foe_entry *entry, + __be32 *src_addr, __be16 src_port, + __be32 *dest_addr, __be16 dest_port); +-int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port); +-int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid); +-int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid); +-int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq, +- int bss, int wcid); ++int mtk_foe_entry_set_dsa(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ int port); ++int mtk_foe_entry_set_vlan(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ int vid); ++int mtk_foe_entry_set_pppoe(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ int sid); ++int mtk_foe_entry_set_wdma(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ int wdma_idx, int txq, int bss, int wcid); + int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); + void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); + int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -52,18 +52,19 @@ static const struct rhashtable_params mt + }; + + static int +-mtk_flow_set_ipv4_addr(struct mtk_foe_entry *foe, struct mtk_flow_data *data, +- bool egress) ++mtk_flow_set_ipv4_addr(struct mtk_eth *eth, struct mtk_foe_entry *foe, ++ struct mtk_flow_data *data, bool egress) + { +- return mtk_foe_entry_set_ipv4_tuple(foe, egress, ++ return mtk_foe_entry_set_ipv4_tuple(eth, foe, egress, + data->v4.src_addr, data->src_port, + data->v4.dst_addr, data->dst_port); + } + + static int +-mtk_flow_set_ipv6_addr(struct mtk_foe_entry *foe, struct mtk_flow_data *data) ++mtk_flow_set_ipv6_addr(struct mtk_eth *eth, struct mtk_foe_entry *foe, ++ struct mtk_flow_data *data) + { +- return mtk_foe_entry_set_ipv6_tuple(foe, ++ return mtk_foe_entry_set_ipv6_tuple(eth, foe, + data->v6.src_addr.s6_addr32, data->src_port, + data->v6.dst_addr.s6_addr32, data->dst_port); + } +@@ -190,16 +191,29 @@ mtk_flow_set_output_device(struct mtk_et + int pse_port, dsa_port; + + if (mtk_flow_get_wdma_info(dev, dest_mac, &info) == 0) { +- mtk_foe_entry_set_wdma(foe, info.wdma_idx, info.queue, info.bss, +- info.wcid); +- pse_port = 3; ++ mtk_foe_entry_set_wdma(eth, foe, info.wdma_idx, info.queue, ++ info.bss, info.wcid); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ switch (info.wdma_idx) { ++ case 0: ++ pse_port = 8; ++ break; ++ case 1: ++ pse_port = 9; ++ break; ++ default: ++ return -EINVAL; ++ } ++ } else { ++ pse_port = 3; ++ } + *wed_index = info.wdma_idx; + goto out; + } + + dsa_port = mtk_flow_get_dsa_port(&dev); + if (dsa_port >= 0) +- mtk_foe_entry_set_dsa(foe, dsa_port); ++ mtk_foe_entry_set_dsa(eth, foe, dsa_port); + + if (dev == eth->netdev[0]) + pse_port = 1; +@@ -209,7 +223,7 @@ mtk_flow_set_output_device(struct mtk_et + return -EOPNOTSUPP; + + out: +- mtk_foe_entry_set_pse_port(foe, pse_port); ++ mtk_foe_entry_set_pse_port(eth, foe, pse_port); + + return 0; + } +@@ -333,9 +347,8 @@ mtk_flow_offload_replace(struct mtk_eth + !is_valid_ether_addr(data.eth.h_dest)) + return -EINVAL; + +- err = mtk_foe_entry_prepare(&foe, offload_type, l4proto, 0, +- data.eth.h_source, +- data.eth.h_dest); ++ err = mtk_foe_entry_prepare(eth, &foe, offload_type, l4proto, 0, ++ data.eth.h_source, data.eth.h_dest); + if (err) + return err; + +@@ -360,7 +373,7 @@ mtk_flow_offload_replace(struct mtk_eth + data.v4.src_addr = addrs.key->src; + data.v4.dst_addr = addrs.key->dst; + +- mtk_flow_set_ipv4_addr(&foe, &data, false); ++ mtk_flow_set_ipv4_addr(eth, &foe, &data, false); + } + + if (addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) { +@@ -371,7 +384,7 @@ mtk_flow_offload_replace(struct mtk_eth + data.v6.src_addr = addrs.key->src; + data.v6.dst_addr = addrs.key->dst; + +- mtk_flow_set_ipv6_addr(&foe, &data); ++ mtk_flow_set_ipv6_addr(eth, &foe, &data); + } + + flow_action_for_each(i, act, &rule->action) { +@@ -401,7 +414,7 @@ mtk_flow_offload_replace(struct mtk_eth + } + + if (addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) { +- err = mtk_flow_set_ipv4_addr(&foe, &data, true); ++ err = mtk_flow_set_ipv4_addr(eth, &foe, &data, true); + if (err) + return err; + } +@@ -413,10 +426,10 @@ mtk_flow_offload_replace(struct mtk_eth + if (data.vlan.proto != htons(ETH_P_8021Q)) + return -EOPNOTSUPP; + +- mtk_foe_entry_set_vlan(&foe, data.vlan.id); ++ mtk_foe_entry_set_vlan(eth, &foe, data.vlan.id); + } + if (data.pppoe.num == 1) +- mtk_foe_entry_set_pppoe(&foe, data.pppoe.sid); ++ mtk_foe_entry_set_pppoe(eth, &foe, data.pppoe.sid); + + err = mtk_flow_set_output_device(eth, &foe, odev, data.eth.h_dest, + &wed_index); +--- a/drivers/net/ethernet/mediatek/mtk_ppe_regs.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_regs.h +@@ -21,6 +21,9 @@ + #define MTK_PPE_GLO_CFG_BUSY BIT(31) + + #define MTK_PPE_FLOW_CFG 0x204 ++#define MTK_PPE_MD_TOAP_BYP_CRSN0 BIT(1) ++#define MTK_PPE_MD_TOAP_BYP_CRSN1 BIT(2) ++#define MTK_PPE_MD_TOAP_BYP_CRSN2 BIT(3) + #define MTK_PPE_FLOW_CFG_IP4_TCP_FRAG BIT(6) + #define MTK_PPE_FLOW_CFG_IP4_UDP_FRAG BIT(7) + #define MTK_PPE_FLOW_CFG_IP6_3T_ROUTE BIT(8) +@@ -54,6 +57,7 @@ + #define MTK_PPE_TB_CFG_HASH_MODE GENMASK(15, 14) + #define MTK_PPE_TB_CFG_SCAN_MODE GENMASK(17, 16) + #define MTK_PPE_TB_CFG_HASH_DEBUG GENMASK(19, 18) ++#define MTK_PPE_TB_CFG_INFO_SEL BIT(20) + + enum { + MTK_PPE_SCAN_MODE_DISABLED, +@@ -112,6 +116,8 @@ enum { + #define MTK_PPE_DEFAULT_CPU_PORT 0x248 + #define MTK_PPE_DEFAULT_CPU_PORT_MASK(_n) (GENMASK(2, 0) << ((_n) * 4)) + ++#define MTK_PPE_DEFAULT_CPU_PORT1 0x24c ++ + #define MTK_PPE_MTU_DROP 0x308 + + #define MTK_PPE_VLAN_MTU0 0x30c +@@ -141,4 +147,6 @@ enum { + #define MTK_PPE_MIB_CACHE_CTL_EN BIT(0) + #define MTK_PPE_MIB_CACHE_CTL_FLUSH BIT(2) + ++#define MTK_PPE_SBW_CTRL 0x374 ++ + #endif diff --git a/target/linux/generic/backport-5.15/724-v6.0-net-ethernet-mtk_eth_soc-enable-flow-offloading-supp.patch b/target/linux/generic/backport-5.15/724-v6.0-net-ethernet-mtk_eth_soc-enable-flow-offloading-supp.patch new file mode 100644 index 0000000000..aba5673b76 --- /dev/null +++ b/target/linux/generic/backport-5.15/724-v6.0-net-ethernet-mtk_eth_soc-enable-flow-offloading-supp.patch @@ -0,0 +1,26 @@ +From b94b02a270471337bef73c44fa3493a521e31a61 Mon Sep 17 00:00:00 2001 +Message-Id: +In-Reply-To: +References: +From: Lorenzo Bianconi +Date: Mon, 5 Sep 2022 13:56:13 +0200 +Subject: [PATCH net-next 5/5] net: ethernet: mtk_eth_soc: enable flow + offloading support for mt7986 + +Enable hw packet engine and wireless packet dispatcher for mt7986 + +Signed-off-by: Lorenzo Bianconi +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4255,6 +4255,7 @@ static const struct mtk_soc_data mt7986_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7986_CLKS_BITMAP, + .required_pctl = false, ++ .offload_version = 2, + .hash_offset = 4, + .foe_entry_size = sizeof(struct mtk_foe_entry), + .txrx = { diff --git a/target/linux/generic/backport-5.15/724-v6.0-net-ethernet-mtk_eth_soc-fix-wrong-use-of-new-helper.patch b/target/linux/generic/backport-5.15/724-v6.0-net-ethernet-mtk_eth_soc-fix-wrong-use-of-new-helper.patch new file mode 100644 index 0000000000..c4bd29365c --- /dev/null +++ b/target/linux/generic/backport-5.15/724-v6.0-net-ethernet-mtk_eth_soc-fix-wrong-use-of-new-helper.patch @@ -0,0 +1,46 @@ +From 40350ce3ae8701146aafd79c5f7b5582d9955e58 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sun, 25 Sep 2022 15:12:35 +0100 +Subject: [PATCH 1/2] net: ethernet: mtk_eth_soc: fix wrong use of new helper + function +To: linux-mediatek@lists.infradead.org, + netdev@vger.kernel.org, + Lorenzo Bianconi +Cc: Sujuan Chen , + Bo Jiao , + Felix Fietkau , + John Crispin , + Sean Wang , + Mark Lee , + David S. Miller , + Eric Dumazet , + Jakub Kicinski , + Paolo Abeni , + Matthias Brugger , + Chen Minqiang + +In function mtk_foe_entry_set_vlan() the call to field accessor macro +FIELD_GET(MTK_FOE_IB1_BIND_VLAN_LAYER, entry->ib1) +has been wrongly replaced by +mtk_prep_ib1_vlan_layer(eth, entry->ib1) + +Use correct helper function mtk_get_ib1_vlan_layer instead. + +Reported-by: Chen Minqiang +Fixes: 03a3180e5c09e1 ("net: ethernet: mtk_eth_soc: introduce flow offloading support for mt7986") +Signed-off-by: Daniel Golle +--- + drivers/net/ethernet/mediatek/mtk_ppe.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -337,7 +337,7 @@ int mtk_foe_entry_set_vlan(struct mtk_et + { + struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(eth, entry); + +- switch (mtk_prep_ib1_vlan_layer(eth, entry->ib1)) { ++ switch (mtk_get_ib1_vlan_layer(eth, entry->ib1)) { + case 0: + entry->ib1 |= mtk_get_ib1_vlan_tag_mask(eth) | + mtk_prep_ib1_vlan_layer(eth, 1); diff --git a/target/linux/generic/backport-5.15/725-v6.0-net-ethernet-mtk_eth_soc-fix-usage-of-foe_entry_size.patch b/target/linux/generic/backport-5.15/725-v6.0-net-ethernet-mtk_eth_soc-fix-usage-of-foe_entry_size.patch new file mode 100644 index 0000000000..bb02f401a2 --- /dev/null +++ b/target/linux/generic/backport-5.15/725-v6.0-net-ethernet-mtk_eth_soc-fix-usage-of-foe_entry_size.patch @@ -0,0 +1,49 @@ +From fcf14c2c5deae8f8c3d25530bab10856f63f8a63 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sun, 25 Sep 2022 15:18:54 +0100 +Subject: [PATCH 2/2] net: ethernet: mtk_eth_soc: fix usage of foe_entry_size +To: linux-mediatek@lists.infradead.org, + netdev@vger.kernel.org, + Lorenzo Bianconi +Cc: Sujuan Chen , + Bo Jiao , + Felix Fietkau , + John Crispin , + Sean Wang , + Mark Lee , + David S. Miller , + Eric Dumazet , + Jakub Kicinski , + Paolo Abeni , + Matthias Brugger , + Chen Minqiang + +As sizeof(hwe->data) can now longer be used as the actual size depends +on foe_entry_size, in commit 9d8cb4c096ab02 +("net: ethernet: mtk_eth_soc: add foe_entry_size to mtk_eth_soc") the +use of sizeof(hwe->data) is hence replaced. +However, replacing it with ppe->eth->soc->foe_entry_size is wrong as +foe_entry_size represents the size of the whole descriptor and not just +the 'data' field. +Fix this by subtracing the size of the only other field in the struct +'ib1', so we actually end up with the correct size to be copied to the +data field. + +Reported-by: Chen Minqiang +Fixes: 9d8cb4c096ab02 ("net: ethernet: mtk_eth_soc: add foe_entry_size to mtk_eth_soc") +Signed-off-by: Daniel Golle +--- + drivers/net/ethernet/mediatek/mtk_ppe.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -547,7 +547,7 @@ __mtk_foe_entry_commit(struct mtk_ppe *p + } + + hwe = mtk_foe_get_entry(ppe, hash); +- memcpy(&hwe->data, &entry->data, eth->soc->foe_entry_size); ++ memcpy(&hwe->data, &entry->data, eth->soc->foe_entry_size - sizeof(hwe->ib1)); + wmb(); + hwe->ib1 = entry->ib1; + diff --git a/target/linux/generic/backport-5.15/726-v6.0-net-ethernet-mtk_eth_soc-fix-mask-of-RX_DMA_GET_SPOR.patch b/target/linux/generic/backport-5.15/726-v6.0-net-ethernet-mtk_eth_soc-fix-mask-of-RX_DMA_GET_SPOR.patch new file mode 100644 index 0000000000..27c719b663 --- /dev/null +++ b/target/linux/generic/backport-5.15/726-v6.0-net-ethernet-mtk_eth_soc-fix-mask-of-RX_DMA_GET_SPOR.patch @@ -0,0 +1,32 @@ +From c9da02bfb1112461e048d3b736afb1873f6f4ccf Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 27 Sep 2022 16:30:02 +0100 +Subject: [PATCH 1/1] net: ethernet: mtk_eth_soc: fix mask of + RX_DMA_GET_SPORT{,_V2} + +The bitmasks applied in RX_DMA_GET_SPORT and RX_DMA_GET_SPORT_V2 macros +were swapped. Fix that. + +Reported-by: Chen Minqiang +Fixes: 160d3a9b192985 ("net: ethernet: mtk_eth_soc: introduce MTK_NETSYS_V2 support") +Acked-by: Lorenzo Bianconi +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/YzMW+mg9UsaCdKRQ@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -315,8 +315,8 @@ + #define MTK_RXD5_PPE_CPU_REASON GENMASK(22, 18) + #define MTK_RXD5_SRC_PORT GENMASK(29, 26) + +-#define RX_DMA_GET_SPORT(x) (((x) >> 19) & 0xf) +-#define RX_DMA_GET_SPORT_V2(x) (((x) >> 26) & 0x7) ++#define RX_DMA_GET_SPORT(x) (((x) >> 19) & 0x7) ++#define RX_DMA_GET_SPORT_V2(x) (((x) >> 26) & 0xf) + + /* PDMA V2 descriptor rxd3 */ + #define RX_DMA_VTAG_V2 BIT(0) diff --git a/target/linux/generic/backport-5.15/727-v6.1-net-ethernet-mtk_eth_soc-fix-state-in-__mtk_foe_entr.patch b/target/linux/generic/backport-5.15/727-v6.1-net-ethernet-mtk_eth_soc-fix-state-in-__mtk_foe_entr.patch new file mode 100644 index 0000000000..c4e66ab876 --- /dev/null +++ b/target/linux/generic/backport-5.15/727-v6.1-net-ethernet-mtk_eth_soc-fix-state-in-__mtk_foe_entr.patch @@ -0,0 +1,37 @@ +From ae3ed15da5889263de372ff9df2e83e16acca4cb Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Fri, 30 Sep 2022 01:56:53 +0100 +Subject: [PATCH 1/1] net: ethernet: mtk_eth_soc: fix state in + __mtk_foe_entry_clear + +Setting ib1 state to MTK_FOE_STATE_UNBIND in __mtk_foe_entry_clear +routine as done by commit 0e80707d94e4c8 ("net: ethernet: mtk_eth_soc: +fix typo in __mtk_foe_entry_clear") breaks flow offloading, at least +on older MTK_NETSYS_V1 SoCs, libreCMC users have confirmed the bug on +MT7622 and MT7621 systems. +Felix Fietkau suggested to use MTK_FOE_STATE_INVALID instead which +works well on both, MTK_NETSYS_V1 and MTK_NETSYS_V2. + +Tested on MT7622 (Linksys E8450) and MT7986 (BananaPi BPI-R3). + +Suggested-by: Felix Fietkau +Fixes: 0e80707d94e4c8 ("net: ethernet: mtk_eth_soc: fix typo in __mtk_foe_entry_clear") +Fixes: 33fc42de33278b ("net: ethernet: mtk_eth_soc: support creating mac address based offload entries") +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/YzY+1Yg0FBXcnrtc@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_ppe.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -442,7 +442,7 @@ __mtk_foe_entry_clear(struct mtk_ppe *pp + struct mtk_foe_entry *hwe = mtk_foe_get_entry(ppe, entry->hash); + + hwe->ib1 &= ~MTK_FOE_IB1_STATE; +- hwe->ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_UNBIND); ++ hwe->ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_INVALID); + dma_wmb(); + } + entry->hash = 0xffff; diff --git a/target/linux/generic/backport-5.15/728-v6.1-01-net-ethernet-mtk_eth_soc-fix-possible-memory-leak-in.patch b/target/linux/generic/backport-5.15/728-v6.1-01-net-ethernet-mtk_eth_soc-fix-possible-memory-leak-in.patch new file mode 100644 index 0000000000..7ebe8566a0 --- /dev/null +++ b/target/linux/generic/backport-5.15/728-v6.1-01-net-ethernet-mtk_eth_soc-fix-possible-memory-leak-in.patch @@ -0,0 +1,73 @@ +From b3d0d98179d62f9d55635a600679c4fa362baf8d Mon Sep 17 00:00:00 2001 +From: Yang Yingliang +Date: Mon, 17 Oct 2022 11:51:54 +0800 +Subject: [PATCH 1/3] net: ethernet: mtk_eth_soc: fix possible memory leak in + mtk_probe() + +If mtk_wed_add_hw() has been called, mtk_wed_exit() needs be called +in error path or removing module to free the memory allocated in +mtk_wed_add_hw(). + +Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)") +Signed-off-by: Yang Yingliang +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4007,19 +4007,23 @@ static int mtk_probe(struct platform_dev + eth->irq[i] = platform_get_irq(pdev, i); + if (eth->irq[i] < 0) { + dev_err(&pdev->dev, "no IRQ%d resource found\n", i); +- return -ENXIO; ++ err = -ENXIO; ++ goto err_wed_exit; + } + } + for (i = 0; i < ARRAY_SIZE(eth->clks); i++) { + eth->clks[i] = devm_clk_get(eth->dev, + mtk_clks_source_name[i]); + if (IS_ERR(eth->clks[i])) { +- if (PTR_ERR(eth->clks[i]) == -EPROBE_DEFER) +- return -EPROBE_DEFER; ++ if (PTR_ERR(eth->clks[i]) == -EPROBE_DEFER) { ++ err = -EPROBE_DEFER; ++ goto err_wed_exit; ++ } + if (eth->soc->required_clks & BIT(i)) { + dev_err(&pdev->dev, "clock %s not found\n", + mtk_clks_source_name[i]); +- return -EINVAL; ++ err = -EINVAL; ++ goto err_wed_exit; + } + eth->clks[i] = NULL; + } +@@ -4030,7 +4034,7 @@ static int mtk_probe(struct platform_dev + + err = mtk_hw_init(eth); + if (err) +- return err; ++ goto err_wed_exit; + + eth->hwlro = MTK_HAS_CAPS(eth->soc->caps, MTK_HWLRO); + +@@ -4128,6 +4132,8 @@ err_free_dev: + mtk_free_dev(eth); + err_deinit_hw: + mtk_hw_deinit(eth); ++err_wed_exit: ++ mtk_wed_exit(); + + return err; + } +@@ -4147,6 +4153,7 @@ static int mtk_remove(struct platform_de + phylink_disconnect_phy(mac->phylink); + } + ++ mtk_wed_exit(); + mtk_hw_deinit(eth); + + netif_napi_del(ð->tx_napi); diff --git a/target/linux/generic/backport-5.15/728-v6.1-02-net-ethernet-mtk_eth_wed-add-missing-put_device-in-m.patch b/target/linux/generic/backport-5.15/728-v6.1-02-net-ethernet-mtk_eth_wed-add-missing-put_device-in-m.patch new file mode 100644 index 0000000000..ef5374dcc5 --- /dev/null +++ b/target/linux/generic/backport-5.15/728-v6.1-02-net-ethernet-mtk_eth_wed-add-missing-put_device-in-m.patch @@ -0,0 +1,47 @@ +From 9d4f20a476ca57e4c9246eb1fa2a61bea2354720 Mon Sep 17 00:00:00 2001 +From: Yang Yingliang +Date: Mon, 17 Oct 2022 11:51:55 +0800 +Subject: [PATCH 2/3] net: ethernet: mtk_eth_wed: add missing put_device() in + mtk_wed_add_hw() + +After calling get_device() in mtk_wed_add_hw(), in error path, put_device() +needs be called. + +Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)") +Signed-off-by: Yang Yingliang +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_wed.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -1084,11 +1084,11 @@ void mtk_wed_add_hw(struct device_node * + get_device(&pdev->dev); + irq = platform_get_irq(pdev, 0); + if (irq < 0) +- return; ++ goto err_put_device; + + regs = syscon_regmap_lookup_by_phandle(np, NULL); + if (IS_ERR(regs)) +- return; ++ goto err_put_device; + + rcu_assign_pointer(mtk_soc_wed_ops, &wed_ops); + +@@ -1131,8 +1131,14 @@ void mtk_wed_add_hw(struct device_node * + + hw_list[index] = hw; + ++ mutex_unlock(&hw_lock); ++ ++ return; ++ + unlock: + mutex_unlock(&hw_lock); ++err_put_device: ++ put_device(&pdev->dev); + } + + void mtk_wed_exit(void) diff --git a/target/linux/generic/backport-5.15/728-v6.1-03-net-ethernet-mtk_eth_wed-add-missing-of_node_put.patch b/target/linux/generic/backport-5.15/728-v6.1-03-net-ethernet-mtk_eth_wed-add-missing-of_node_put.patch new file mode 100644 index 0000000000..0a452d4a7d --- /dev/null +++ b/target/linux/generic/backport-5.15/728-v6.1-03-net-ethernet-mtk_eth_wed-add-missing-of_node_put.patch @@ -0,0 +1,43 @@ +From e0bb4659e235770e6f53b3692e958591f49448f5 Mon Sep 17 00:00:00 2001 +From: Yang Yingliang +Date: Mon, 17 Oct 2022 11:51:56 +0800 +Subject: [PATCH 3/3] net: ethernet: mtk_eth_wed: add missing of_node_put() + +The device_node pointer returned by of_parse_phandle() with refcount +incremented, when finish using it, the refcount need be decreased. + +Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)") +Signed-off-by: Yang Yingliang +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_wed.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -1079,7 +1079,7 @@ void mtk_wed_add_hw(struct device_node * + + pdev = of_find_device_by_node(np); + if (!pdev) +- return; ++ goto err_of_node_put; + + get_device(&pdev->dev); + irq = platform_get_irq(pdev, 0); +@@ -1139,6 +1139,8 @@ unlock: + mutex_unlock(&hw_lock); + err_put_device: + put_device(&pdev->dev); ++err_of_node_put: ++ of_node_put(np); + } + + void mtk_wed_exit(void) +@@ -1159,6 +1161,7 @@ void mtk_wed_exit(void) + hw_list[i] = NULL; + debugfs_remove(hw->debugfs_dir); + put_device(hw->dev); ++ of_node_put(hw->node); + kfree(hw); + } + } diff --git a/target/linux/generic/backport-5.15/728-v6.1-04-net-ethernet-mtk_eth_soc-fix-resource-leak-in-error-.patch b/target/linux/generic/backport-5.15/728-v6.1-04-net-ethernet-mtk_eth_soc-fix-resource-leak-in-error-.patch new file mode 100644 index 0000000000..9c526ecec9 --- /dev/null +++ b/target/linux/generic/backport-5.15/728-v6.1-04-net-ethernet-mtk_eth_soc-fix-resource-leak-in-error-.patch @@ -0,0 +1,35 @@ +From 8110437e59616293228cd781c486d8495a61e36a Mon Sep 17 00:00:00 2001 +From: Yan Cangang +Date: Sun, 20 Nov 2022 13:52:58 +0800 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix resource leak in error path + +In mtk_probe(), when mtk_ppe_init() or mtk_eth_offload_init() failed, +mtk_mdio_cleanup() isn't called. Fix it. + +Fixes: ba37b7caf1ed ("net: ethernet: mtk_eth_soc: add support for initializing the PPE") +Fixes: 502e84e2382d ("net: ethernet: mtk_eth_soc: add flow offloading support") +Signed-off-by: Yan Cangang +Reviewed-by: Leon Romanovsky +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4090,13 +4090,13 @@ static int mtk_probe(struct platform_dev + eth->soc->offload_version, i); + if (!eth->ppe[i]) { + err = -ENOMEM; +- goto err_free_dev; ++ goto err_deinit_mdio; + } + } + + err = mtk_eth_offload_init(eth); + if (err) +- goto err_free_dev; ++ goto err_deinit_mdio; + } + + for (i = 0; i < MTK_MAX_DEVS; i++) { diff --git a/target/linux/generic/backport-5.15/728-v6.1-05-net-ethernet-mtk_eth_soc-fix-memory-leak-in-error-pa.patch b/target/linux/generic/backport-5.15/728-v6.1-05-net-ethernet-mtk_eth_soc-fix-memory-leak-in-error-pa.patch new file mode 100644 index 0000000000..55c9b35238 --- /dev/null +++ b/target/linux/generic/backport-5.15/728-v6.1-05-net-ethernet-mtk_eth_soc-fix-memory-leak-in-error-pa.patch @@ -0,0 +1,107 @@ +From 603ea5e7ffa73c7fac07d8713d97285990695213 Mon Sep 17 00:00:00 2001 +From: Yan Cangang +Date: Sun, 20 Nov 2022 13:52:59 +0800 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix memory leak in error path + +In mtk_ppe_init(), when dmam_alloc_coherent() or devm_kzalloc() failed, +the rhashtable ppe->l2_flows isn't destroyed. Fix it. + +In mtk_probe(), when mtk_ppe_init() or mtk_eth_offload_init() or +register_netdev() failed, have the same problem. Fix it. + +Fixes: 33fc42de3327 ("net: ethernet: mtk_eth_soc: support creating mac address based offload entries") +Signed-off-by: Yan Cangang +Reviewed-by: Leon Romanovsky +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 9 +++++---- + drivers/net/ethernet/mediatek/mtk_ppe.c | 19 +++++++++++++++++-- + drivers/net/ethernet/mediatek/mtk_ppe.h | 1 + + 3 files changed, 23 insertions(+), 6 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4090,13 +4090,13 @@ static int mtk_probe(struct platform_dev + eth->soc->offload_version, i); + if (!eth->ppe[i]) { + err = -ENOMEM; +- goto err_deinit_mdio; ++ goto err_deinit_ppe; + } + } + + err = mtk_eth_offload_init(eth); + if (err) +- goto err_deinit_mdio; ++ goto err_deinit_ppe; + } + + for (i = 0; i < MTK_MAX_DEVS; i++) { +@@ -4106,7 +4106,7 @@ static int mtk_probe(struct platform_dev + err = register_netdev(eth->netdev[i]); + if (err) { + dev_err(eth->dev, "error bringing up device\n"); +- goto err_deinit_mdio; ++ goto err_deinit_ppe; + } else + netif_info(eth, probe, eth->netdev[i], + "mediatek frame engine at 0x%08lx, irq %d\n", +@@ -4126,7 +4126,8 @@ static int mtk_probe(struct platform_dev + + return 0; + +-err_deinit_mdio: ++err_deinit_ppe: ++ mtk_ppe_deinit(eth); + mtk_mdio_cleanup(eth); + err_free_dev: + mtk_free_dev(eth); +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -743,7 +743,7 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ + MTK_PPE_ENTRIES * soc->foe_entry_size, + &ppe->foe_phys, GFP_KERNEL); + if (!foe) +- return NULL; ++ goto err_free_l2_flows; + + ppe->foe_table = foe; + +@@ -751,11 +751,26 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ + sizeof(*ppe->foe_flow); + ppe->foe_flow = devm_kzalloc(dev, foe_flow_size, GFP_KERNEL); + if (!ppe->foe_flow) +- return NULL; ++ goto err_free_l2_flows; + + mtk_ppe_debugfs_init(ppe, index); + + return ppe; ++ ++err_free_l2_flows: ++ rhashtable_destroy(&ppe->l2_flows); ++ return NULL; ++} ++ ++void mtk_ppe_deinit(struct mtk_eth *eth) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) { ++ if (!eth->ppe[i]) ++ return; ++ rhashtable_destroy(ð->ppe[i]->l2_flows); ++ } + } + + static void mtk_ppe_init_foe_table(struct mtk_ppe *ppe) +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -304,6 +304,7 @@ struct mtk_ppe { + + struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, + int version, int index); ++void mtk_ppe_deinit(struct mtk_eth *eth); + void mtk_ppe_start(struct mtk_ppe *ppe); + int mtk_ppe_stop(struct mtk_ppe *ppe); + diff --git a/target/linux/generic/backport-5.15/729-01-v6.1-net-ethernet-mtk_wed-introduce-wed-mcu-support.patch b/target/linux/generic/backport-5.15/729-01-v6.1-net-ethernet-mtk_wed-introduce-wed-mcu-support.patch new file mode 100644 index 0000000000..c48613929d --- /dev/null +++ b/target/linux/generic/backport-5.15/729-01-v6.1-net-ethernet-mtk_wed-introduce-wed-mcu-support.patch @@ -0,0 +1,591 @@ +From: Sujuan Chen +Date: Sat, 5 Nov 2022 23:36:18 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: introduce wed mcu support + +Introduce WED mcu support used to configure WED WO chip. +This is a preliminary patch in order to add RX Wireless +Ethernet Dispatch available on MT7986 SoC. + +Tested-by: Daniel Golle +Co-developed-by: Lorenzo Bianconi +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Sujuan Chen +Signed-off-by: David S. Miller +--- + create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_mcu.c + create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_wo.h + +--- a/drivers/net/ethernet/mediatek/Makefile ++++ b/drivers/net/ethernet/mediatek/Makefile +@@ -5,7 +5,7 @@ + + obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o + mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_ppe_offload.o +-mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed.o ++mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed.o mtk_wed_mcu.o + ifdef CONFIG_DEBUG_FS + mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_debugfs.o + endif +--- /dev/null ++++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c +@@ -0,0 +1,359 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* Copyright (C) 2022 MediaTek Inc. ++ * ++ * Author: Lorenzo Bianconi ++ * Sujuan Chen ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include "mtk_wed_regs.h" ++#include "mtk_wed_wo.h" ++#include "mtk_wed.h" ++ ++static u32 wo_r32(struct mtk_wed_wo *wo, u32 reg) ++{ ++ return readl(wo->boot.addr + reg); ++} ++ ++static void wo_w32(struct mtk_wed_wo *wo, u32 reg, u32 val) ++{ ++ writel(val, wo->boot.addr + reg); ++} ++ ++static struct sk_buff * ++mtk_wed_mcu_msg_alloc(const void *data, int data_len) ++{ ++ int length = sizeof(struct mtk_wed_mcu_hdr) + data_len; ++ struct sk_buff *skb; ++ ++ skb = alloc_skb(length, GFP_KERNEL); ++ if (!skb) ++ return NULL; ++ ++ memset(skb->head, 0, length); ++ skb_reserve(skb, sizeof(struct mtk_wed_mcu_hdr)); ++ if (data && data_len) ++ skb_put_data(skb, data, data_len); ++ ++ return skb; ++} ++ ++static struct sk_buff * ++mtk_wed_mcu_get_response(struct mtk_wed_wo *wo, unsigned long expires) ++{ ++ if (!time_is_after_jiffies(expires)) ++ return NULL; ++ ++ wait_event_timeout(wo->mcu.wait, !skb_queue_empty(&wo->mcu.res_q), ++ expires - jiffies); ++ return skb_dequeue(&wo->mcu.res_q); ++} ++ ++void mtk_wed_mcu_rx_event(struct mtk_wed_wo *wo, struct sk_buff *skb) ++{ ++ skb_queue_tail(&wo->mcu.res_q, skb); ++ wake_up(&wo->mcu.wait); ++} ++ ++void mtk_wed_mcu_rx_unsolicited_event(struct mtk_wed_wo *wo, ++ struct sk_buff *skb) ++{ ++ struct mtk_wed_mcu_hdr *hdr = (struct mtk_wed_mcu_hdr *)skb->data; ++ ++ switch (hdr->cmd) { ++ case MTK_WED_WO_EVT_LOG_DUMP: { ++ const char *msg = (const char *)(skb->data + sizeof(*hdr)); ++ ++ dev_notice(wo->hw->dev, "%s\n", msg); ++ break; ++ } ++ case MTK_WED_WO_EVT_PROFILING: { ++ struct mtk_wed_wo_log_info *info; ++ u32 count = (skb->len - sizeof(*hdr)) / sizeof(*info); ++ int i; ++ ++ info = (struct mtk_wed_wo_log_info *)(skb->data + sizeof(*hdr)); ++ for (i = 0 ; i < count ; i++) ++ dev_notice(wo->hw->dev, ++ "SN:%u latency: total=%u, rro:%u, mod:%u\n", ++ le32_to_cpu(info[i].sn), ++ le32_to_cpu(info[i].total), ++ le32_to_cpu(info[i].rro), ++ le32_to_cpu(info[i].mod)); ++ break; ++ } ++ case MTK_WED_WO_EVT_RXCNT_INFO: ++ break; ++ default: ++ break; ++ } ++ ++ dev_kfree_skb(skb); ++} ++ ++static int ++mtk_wed_mcu_skb_send_msg(struct mtk_wed_wo *wo, struct sk_buff *skb, ++ int id, int cmd, u16 *wait_seq, bool wait_resp) ++{ ++ struct mtk_wed_mcu_hdr *hdr; ++ ++ /* TODO: make it dynamic based on cmd */ ++ wo->mcu.timeout = 20 * HZ; ++ ++ hdr = (struct mtk_wed_mcu_hdr *)skb_push(skb, sizeof(*hdr)); ++ hdr->cmd = cmd; ++ hdr->length = cpu_to_le16(skb->len); ++ ++ if (wait_resp && wait_seq) { ++ u16 seq = ++wo->mcu.seq; ++ ++ if (!seq) ++ seq = ++wo->mcu.seq; ++ *wait_seq = seq; ++ ++ hdr->flag |= cpu_to_le16(MTK_WED_WARP_CMD_FLAG_NEED_RSP); ++ hdr->seq = cpu_to_le16(seq); ++ } ++ if (id == MTK_WED_MODULE_ID_WO) ++ hdr->flag |= cpu_to_le16(MTK_WED_WARP_CMD_FLAG_FROM_TO_WO); ++ ++ dev_kfree_skb(skb); ++ return 0; ++} ++ ++static int ++mtk_wed_mcu_parse_response(struct mtk_wed_wo *wo, struct sk_buff *skb, ++ int cmd, int seq) ++{ ++ struct mtk_wed_mcu_hdr *hdr; ++ ++ if (!skb) { ++ dev_err(wo->hw->dev, "Message %08x (seq %d) timeout\n", ++ cmd, seq); ++ return -ETIMEDOUT; ++ } ++ ++ hdr = (struct mtk_wed_mcu_hdr *)skb->data; ++ if (le16_to_cpu(hdr->seq) != seq) ++ return -EAGAIN; ++ ++ skb_pull(skb, sizeof(*hdr)); ++ switch (cmd) { ++ case MTK_WED_WO_CMD_RXCNT_INFO: ++ default: ++ break; ++ } ++ ++ return 0; ++} ++ ++int mtk_wed_mcu_send_msg(struct mtk_wed_wo *wo, int id, int cmd, ++ const void *data, int len, bool wait_resp) ++{ ++ unsigned long expires; ++ struct sk_buff *skb; ++ u16 seq; ++ int ret; ++ ++ skb = mtk_wed_mcu_msg_alloc(data, len); ++ if (!skb) ++ return -ENOMEM; ++ ++ mutex_lock(&wo->mcu.mutex); ++ ++ ret = mtk_wed_mcu_skb_send_msg(wo, skb, id, cmd, &seq, wait_resp); ++ if (ret || !wait_resp) ++ goto unlock; ++ ++ expires = jiffies + wo->mcu.timeout; ++ do { ++ skb = mtk_wed_mcu_get_response(wo, expires); ++ ret = mtk_wed_mcu_parse_response(wo, skb, cmd, seq); ++ dev_kfree_skb(skb); ++ } while (ret == -EAGAIN); ++ ++unlock: ++ mutex_unlock(&wo->mcu.mutex); ++ ++ return ret; ++} ++ ++static int ++mtk_wed_get_memory_region(struct mtk_wed_wo *wo, ++ struct mtk_wed_wo_memory_region *region) ++{ ++ struct reserved_mem *rmem; ++ struct device_node *np; ++ int index; ++ ++ index = of_property_match_string(wo->hw->node, "memory-region-names", ++ region->name); ++ if (index < 0) ++ return index; ++ ++ np = of_parse_phandle(wo->hw->node, "memory-region", index); ++ if (!np) ++ return -ENODEV; ++ ++ rmem = of_reserved_mem_lookup(np); ++ of_node_put(np); ++ ++ if (!rmem) ++ return -ENODEV; ++ ++ region->phy_addr = rmem->base; ++ region->size = rmem->size; ++ region->addr = devm_ioremap(wo->hw->dev, region->phy_addr, region->size); ++ ++ return !region->addr ? -EINVAL : 0; ++} ++ ++static int ++mtk_wed_mcu_run_firmware(struct mtk_wed_wo *wo, const struct firmware *fw, ++ struct mtk_wed_wo_memory_region *region) ++{ ++ const u8 *first_region_ptr, *region_ptr, *trailer_ptr, *ptr = fw->data; ++ const struct mtk_wed_fw_trailer *trailer; ++ const struct mtk_wed_fw_region *fw_region; ++ ++ trailer_ptr = fw->data + fw->size - sizeof(*trailer); ++ trailer = (const struct mtk_wed_fw_trailer *)trailer_ptr; ++ region_ptr = trailer_ptr - trailer->num_region * sizeof(*fw_region); ++ first_region_ptr = region_ptr; ++ ++ while (region_ptr < trailer_ptr) { ++ u32 length; ++ ++ fw_region = (const struct mtk_wed_fw_region *)region_ptr; ++ length = le32_to_cpu(fw_region->len); ++ ++ if (region->phy_addr != le32_to_cpu(fw_region->addr)) ++ goto next; ++ ++ if (region->size < length) ++ goto next; ++ ++ if (first_region_ptr < ptr + length) ++ goto next; ++ ++ if (region->shared && region->consumed) ++ return 0; ++ ++ if (!region->shared || !region->consumed) { ++ memcpy_toio(region->addr, ptr, length); ++ region->consumed = true; ++ return 0; ++ } ++next: ++ region_ptr += sizeof(*fw_region); ++ ptr += length; ++ } ++ ++ return -EINVAL; ++} ++ ++static int ++mtk_wed_mcu_load_firmware(struct mtk_wed_wo *wo) ++{ ++ static struct mtk_wed_wo_memory_region mem_region[] = { ++ [MTK_WED_WO_REGION_EMI] = { ++ .name = "wo-emi", ++ }, ++ [MTK_WED_WO_REGION_ILM] = { ++ .name = "wo-ilm", ++ }, ++ [MTK_WED_WO_REGION_DATA] = { ++ .name = "wo-data", ++ .shared = true, ++ }, ++ }; ++ const struct mtk_wed_fw_trailer *trailer; ++ const struct firmware *fw; ++ const char *fw_name; ++ u32 val, boot_cr; ++ int ret, i; ++ ++ /* load firmware region metadata */ ++ for (i = 0; i < ARRAY_SIZE(mem_region); i++) { ++ ret = mtk_wed_get_memory_region(wo, &mem_region[i]); ++ if (ret) ++ return ret; ++ } ++ ++ wo->boot.name = "wo-boot"; ++ ret = mtk_wed_get_memory_region(wo, &wo->boot); ++ if (ret) ++ return ret; ++ ++ /* set dummy cr */ ++ wed_w32(wo->hw->wed_dev, MTK_WED_SCR0 + 4 * MTK_WED_DUMMY_CR_FWDL, ++ wo->hw->index + 1); ++ ++ /* load firmware */ ++ fw_name = wo->hw->index ? MT7986_FIRMWARE_WO1 : MT7986_FIRMWARE_WO0; ++ ret = request_firmware(&fw, fw_name, wo->hw->dev); ++ if (ret) ++ return ret; ++ ++ trailer = (void *)(fw->data + fw->size - ++ sizeof(struct mtk_wed_fw_trailer)); ++ dev_info(wo->hw->dev, ++ "MTK WED WO Firmware Version: %.10s, Build Time: %.15s\n", ++ trailer->fw_ver, trailer->build_date); ++ dev_info(wo->hw->dev, "MTK WED WO Chip ID %02x Region %d\n", ++ trailer->chip_id, trailer->num_region); ++ ++ for (i = 0; i < ARRAY_SIZE(mem_region); i++) { ++ ret = mtk_wed_mcu_run_firmware(wo, fw, &mem_region[i]); ++ if (ret) ++ goto out; ++ } ++ ++ /* set the start address */ ++ boot_cr = wo->hw->index ? MTK_WO_MCU_CFG_LS_WA_BOOT_ADDR_ADDR ++ : MTK_WO_MCU_CFG_LS_WM_BOOT_ADDR_ADDR; ++ wo_w32(wo, boot_cr, mem_region[MTK_WED_WO_REGION_EMI].phy_addr >> 16); ++ /* wo firmware reset */ ++ wo_w32(wo, MTK_WO_MCU_CFG_LS_WF_MCCR_CLR_ADDR, 0xc00); ++ ++ val = wo_r32(wo, MTK_WO_MCU_CFG_LS_WF_MCU_CFG_WM_WA_ADDR); ++ val |= wo->hw->index ? MTK_WO_MCU_CFG_LS_WF_WM_WA_WA_CPU_RSTB_MASK ++ : MTK_WO_MCU_CFG_LS_WF_WM_WA_WM_CPU_RSTB_MASK; ++ wo_w32(wo, MTK_WO_MCU_CFG_LS_WF_MCU_CFG_WM_WA_ADDR, val); ++out: ++ release_firmware(fw); ++ ++ return ret; ++} ++ ++static u32 ++mtk_wed_mcu_read_fw_dl(struct mtk_wed_wo *wo) ++{ ++ return wed_r32(wo->hw->wed_dev, ++ MTK_WED_SCR0 + 4 * MTK_WED_DUMMY_CR_FWDL); ++} ++ ++int mtk_wed_mcu_init(struct mtk_wed_wo *wo) ++{ ++ u32 val; ++ int ret; ++ ++ skb_queue_head_init(&wo->mcu.res_q); ++ init_waitqueue_head(&wo->mcu.wait); ++ mutex_init(&wo->mcu.mutex); ++ ++ ret = mtk_wed_mcu_load_firmware(wo); ++ if (ret) ++ return ret; ++ ++ return readx_poll_timeout(mtk_wed_mcu_read_fw_dl, wo, val, !val, ++ 100, MTK_FW_DL_TIMEOUT); ++} ++ ++MODULE_FIRMWARE(MT7986_FIRMWARE_WO0); ++MODULE_FIRMWARE(MT7986_FIRMWARE_WO1); +--- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h +@@ -152,6 +152,7 @@ struct mtk_wdma_desc { + + #define MTK_WED_RING_RX(_n) (0x400 + (_n) * 0x10) + ++#define MTK_WED_SCR0 0x3c0 + #define MTK_WED_WPDMA_INT_TRIGGER 0x504 + #define MTK_WED_WPDMA_INT_TRIGGER_RX_DONE BIT(1) + #define MTK_WED_WPDMA_INT_TRIGGER_TX_DONE GENMASK(5, 4) +--- /dev/null ++++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.h +@@ -0,0 +1,150 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++/* Copyright (C) 2022 Lorenzo Bianconi */ ++ ++#ifndef __MTK_WED_WO_H ++#define __MTK_WED_WO_H ++ ++#include ++#include ++ ++struct mtk_wed_hw; ++ ++struct mtk_wed_mcu_hdr { ++ /* DW0 */ ++ u8 version; ++ u8 cmd; ++ __le16 length; ++ ++ /* DW1 */ ++ __le16 seq; ++ __le16 flag; ++ ++ /* DW2 */ ++ __le32 status; ++ ++ /* DW3 */ ++ u8 rsv[20]; ++}; ++ ++struct mtk_wed_wo_log_info { ++ __le32 sn; ++ __le32 total; ++ __le32 rro; ++ __le32 mod; ++}; ++ ++enum mtk_wed_wo_event { ++ MTK_WED_WO_EVT_LOG_DUMP = 0x1, ++ MTK_WED_WO_EVT_PROFILING = 0x2, ++ MTK_WED_WO_EVT_RXCNT_INFO = 0x3, ++}; ++ ++#define MTK_WED_MODULE_ID_WO 1 ++#define MTK_FW_DL_TIMEOUT 4000000 /* us */ ++#define MTK_WOCPU_TIMEOUT 2000000 /* us */ ++ ++enum { ++ MTK_WED_WARP_CMD_FLAG_RSP = BIT(0), ++ MTK_WED_WARP_CMD_FLAG_NEED_RSP = BIT(1), ++ MTK_WED_WARP_CMD_FLAG_FROM_TO_WO = BIT(2), ++}; ++ ++enum { ++ MTK_WED_WO_REGION_EMI, ++ MTK_WED_WO_REGION_ILM, ++ MTK_WED_WO_REGION_DATA, ++ MTK_WED_WO_REGION_BOOT, ++ __MTK_WED_WO_REGION_MAX, ++}; ++ ++enum mtk_wed_dummy_cr_idx { ++ MTK_WED_DUMMY_CR_FWDL, ++ MTK_WED_DUMMY_CR_WO_STATUS, ++}; ++ ++#define MT7986_FIRMWARE_WO0 "mediatek/mt7986_wo_0.bin" ++#define MT7986_FIRMWARE_WO1 "mediatek/mt7986_wo_1.bin" ++ ++#define MTK_WO_MCU_CFG_LS_BASE 0 ++#define MTK_WO_MCU_CFG_LS_HW_VER_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x000) ++#define MTK_WO_MCU_CFG_LS_FW_VER_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x004) ++#define MTK_WO_MCU_CFG_LS_CFG_DBG1_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x00c) ++#define MTK_WO_MCU_CFG_LS_CFG_DBG2_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x010) ++#define MTK_WO_MCU_CFG_LS_WF_MCCR_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x014) ++#define MTK_WO_MCU_CFG_LS_WF_MCCR_SET_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x018) ++#define MTK_WO_MCU_CFG_LS_WF_MCCR_CLR_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x01c) ++#define MTK_WO_MCU_CFG_LS_WF_MCU_CFG_WM_WA_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x050) ++#define MTK_WO_MCU_CFG_LS_WM_BOOT_ADDR_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x060) ++#define MTK_WO_MCU_CFG_LS_WA_BOOT_ADDR_ADDR (MTK_WO_MCU_CFG_LS_BASE + 0x064) ++ ++#define MTK_WO_MCU_CFG_LS_WF_WM_WA_WM_CPU_RSTB_MASK BIT(5) ++#define MTK_WO_MCU_CFG_LS_WF_WM_WA_WA_CPU_RSTB_MASK BIT(0) ++ ++struct mtk_wed_wo_memory_region { ++ const char *name; ++ void __iomem *addr; ++ phys_addr_t phy_addr; ++ u32 size; ++ bool shared:1; ++ bool consumed:1; ++}; ++ ++struct mtk_wed_fw_region { ++ __le32 decomp_crc; ++ __le32 decomp_len; ++ __le32 decomp_blk_sz; ++ u8 rsv0[4]; ++ __le32 addr; ++ __le32 len; ++ u8 feature_set; ++ u8 rsv1[15]; ++} __packed; ++ ++struct mtk_wed_fw_trailer { ++ u8 chip_id; ++ u8 eco_code; ++ u8 num_region; ++ u8 format_ver; ++ u8 format_flag; ++ u8 rsv[2]; ++ char fw_ver[10]; ++ char build_date[15]; ++ u32 crc; ++}; ++ ++struct mtk_wed_wo { ++ struct mtk_wed_hw *hw; ++ struct mtk_wed_wo_memory_region boot; ++ ++ struct { ++ struct mutex mutex; ++ int timeout; ++ u16 seq; ++ ++ struct sk_buff_head res_q; ++ wait_queue_head_t wait; ++ } mcu; ++}; ++ ++static inline int ++mtk_wed_mcu_check_msg(struct mtk_wed_wo *wo, struct sk_buff *skb) ++{ ++ struct mtk_wed_mcu_hdr *hdr = (struct mtk_wed_mcu_hdr *)skb->data; ++ ++ if (hdr->version) ++ return -EINVAL; ++ ++ if (skb->len < sizeof(*hdr) || skb->len != le16_to_cpu(hdr->length)) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++void mtk_wed_mcu_rx_event(struct mtk_wed_wo *wo, struct sk_buff *skb); ++void mtk_wed_mcu_rx_unsolicited_event(struct mtk_wed_wo *wo, ++ struct sk_buff *skb); ++int mtk_wed_mcu_send_msg(struct mtk_wed_wo *wo, int id, int cmd, ++ const void *data, int len, bool wait_resp); ++int mtk_wed_mcu_init(struct mtk_wed_wo *wo); ++ ++#endif /* __MTK_WED_WO_H */ +--- a/include/linux/soc/mediatek/mtk_wed.h ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -11,6 +11,35 @@ + struct mtk_wed_hw; + struct mtk_wdma_desc; + ++enum mtk_wed_wo_cmd { ++ MTK_WED_WO_CMD_WED_CFG, ++ MTK_WED_WO_CMD_WED_RX_STAT, ++ MTK_WED_WO_CMD_RRO_SER, ++ MTK_WED_WO_CMD_DBG_INFO, ++ MTK_WED_WO_CMD_DEV_INFO, ++ MTK_WED_WO_CMD_BSS_INFO, ++ MTK_WED_WO_CMD_STA_REC, ++ MTK_WED_WO_CMD_DEV_INFO_DUMP, ++ MTK_WED_WO_CMD_BSS_INFO_DUMP, ++ MTK_WED_WO_CMD_STA_REC_DUMP, ++ MTK_WED_WO_CMD_BA_INFO_DUMP, ++ MTK_WED_WO_CMD_FBCMD_Q_DUMP, ++ MTK_WED_WO_CMD_FW_LOG_CTRL, ++ MTK_WED_WO_CMD_LOG_FLUSH, ++ MTK_WED_WO_CMD_CHANGE_STATE, ++ MTK_WED_WO_CMD_CPU_STATS_ENABLE, ++ MTK_WED_WO_CMD_CPU_STATS_DUMP, ++ MTK_WED_WO_CMD_EXCEPTION_INIT, ++ MTK_WED_WO_CMD_PROF_CTRL, ++ MTK_WED_WO_CMD_STA_BA_DUMP, ++ MTK_WED_WO_CMD_BA_CTRL_DUMP, ++ MTK_WED_WO_CMD_RXCNT_CTRL, ++ MTK_WED_WO_CMD_RXCNT_INFO, ++ MTK_WED_WO_CMD_SET_CAP, ++ MTK_WED_WO_CMD_CCIF_RING_DUMP, ++ MTK_WED_WO_CMD_WED_END ++}; ++ + enum mtk_wed_bus_tye { + MTK_WED_BUS_PCIE, + MTK_WED_BUS_AXI, diff --git a/target/linux/generic/backport-5.15/729-02-v6.1-net-ethernet-mtk_wed-introduce-wed-wo-support.patch b/target/linux/generic/backport-5.15/729-02-v6.1-net-ethernet-mtk_wed-introduce-wed-wo-support.patch new file mode 100644 index 0000000000..dbd7e30fbb --- /dev/null +++ b/target/linux/generic/backport-5.15/729-02-v6.1-net-ethernet-mtk_wed-introduce-wed-wo-support.patch @@ -0,0 +1,737 @@ +From: Lorenzo Bianconi +Date: Sat, 5 Nov 2022 23:36:19 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: introduce wed wo support + +Introduce WO chip support to mtk wed driver. MTK WED WO is used to +implement RX Wireless Ethernet Dispatch and offload traffic received by +wlan nic to the wired interface. + +Tested-by: Daniel Golle +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_wo.c + +--- a/drivers/net/ethernet/mediatek/Makefile ++++ b/drivers/net/ethernet/mediatek/Makefile +@@ -5,7 +5,7 @@ + + obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o + mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_ppe_offload.o +-mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed.o mtk_wed_mcu.o ++mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed.o mtk_wed_mcu.o mtk_wed_wo.o + ifdef CONFIG_DEBUG_FS + mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_debugfs.o + endif +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -16,6 +16,7 @@ + #include "mtk_wed_regs.h" + #include "mtk_wed.h" + #include "mtk_ppe.h" ++#include "mtk_wed_wo.h" + + #define MTK_PCIE_BASE(n) (0x1a143000 + (n) * 0x2000) + +@@ -355,6 +356,8 @@ mtk_wed_detach(struct mtk_wed_device *de + + mtk_wed_free_buffer(dev); + mtk_wed_free_tx_rings(dev); ++ if (hw->version != 1) ++ mtk_wed_wo_deinit(hw); + + if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) { + struct device_node *wlan_node; +@@ -885,9 +888,11 @@ mtk_wed_attach(struct mtk_wed_device *de + } + + mtk_wed_hw_init_early(dev); +- if (hw->hifsys) ++ if (hw->version == 1) + regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP, + BIT(hw->index), 0); ++ else ++ ret = mtk_wed_wo_init(hw); + + out: + mutex_unlock(&hw_lock); +--- a/drivers/net/ethernet/mediatek/mtk_wed.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed.h +@@ -10,6 +10,7 @@ + #include + + struct mtk_eth; ++struct mtk_wed_wo; + + struct mtk_wed_hw { + struct device_node *node; +@@ -22,6 +23,7 @@ struct mtk_wed_hw { + struct regmap *mirror; + struct dentry *debugfs_dir; + struct mtk_wed_device *wed_dev; ++ struct mtk_wed_wo *wed_wo; + u32 debugfs_reg; + u32 num_flows; + u8 version; +--- a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c +@@ -122,8 +122,7 @@ mtk_wed_mcu_skb_send_msg(struct mtk_wed_ + if (id == MTK_WED_MODULE_ID_WO) + hdr->flag |= cpu_to_le16(MTK_WED_WARP_CMD_FLAG_FROM_TO_WO); + +- dev_kfree_skb(skb); +- return 0; ++ return mtk_wed_wo_queue_tx_skb(wo, &wo->q_tx, skb); + } + + static int +--- /dev/null ++++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.c +@@ -0,0 +1,508 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* Copyright (C) 2022 MediaTek Inc. ++ * ++ * Author: Lorenzo Bianconi ++ * Sujuan Chen ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "mtk_wed.h" ++#include "mtk_wed_regs.h" ++#include "mtk_wed_wo.h" ++ ++static u32 ++mtk_wed_mmio_r32(struct mtk_wed_wo *wo, u32 reg) ++{ ++ u32 val; ++ ++ if (regmap_read(wo->mmio.regs, reg, &val)) ++ val = ~0; ++ ++ return val; ++} ++ ++static void ++mtk_wed_mmio_w32(struct mtk_wed_wo *wo, u32 reg, u32 val) ++{ ++ regmap_write(wo->mmio.regs, reg, val); ++} ++ ++static u32 ++mtk_wed_wo_get_isr(struct mtk_wed_wo *wo) ++{ ++ u32 val = mtk_wed_mmio_r32(wo, MTK_WED_WO_CCIF_RCHNUM); ++ ++ return val & MTK_WED_WO_CCIF_RCHNUM_MASK; ++} ++ ++static void ++mtk_wed_wo_set_isr(struct mtk_wed_wo *wo, u32 mask) ++{ ++ mtk_wed_mmio_w32(wo, MTK_WED_WO_CCIF_IRQ0_MASK, mask); ++} ++ ++static void ++mtk_wed_wo_set_ack(struct mtk_wed_wo *wo, u32 mask) ++{ ++ mtk_wed_mmio_w32(wo, MTK_WED_WO_CCIF_ACK, mask); ++} ++ ++static void ++mtk_wed_wo_set_isr_mask(struct mtk_wed_wo *wo, u32 mask, u32 val, bool set) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&wo->mmio.lock, flags); ++ wo->mmio.irq_mask &= ~mask; ++ wo->mmio.irq_mask |= val; ++ if (set) ++ mtk_wed_wo_set_isr(wo, wo->mmio.irq_mask); ++ spin_unlock_irqrestore(&wo->mmio.lock, flags); ++} ++ ++static void ++mtk_wed_wo_irq_enable(struct mtk_wed_wo *wo, u32 mask) ++{ ++ mtk_wed_wo_set_isr_mask(wo, 0, mask, false); ++ tasklet_schedule(&wo->mmio.irq_tasklet); ++} ++ ++static void ++mtk_wed_wo_irq_disable(struct mtk_wed_wo *wo, u32 mask) ++{ ++ mtk_wed_wo_set_isr_mask(wo, mask, 0, true); ++} ++ ++static void ++mtk_wed_wo_kickout(struct mtk_wed_wo *wo) ++{ ++ mtk_wed_mmio_w32(wo, MTK_WED_WO_CCIF_BUSY, 1 << MTK_WED_WO_TXCH_NUM); ++ mtk_wed_mmio_w32(wo, MTK_WED_WO_CCIF_TCHNUM, MTK_WED_WO_TXCH_NUM); ++} ++ ++static void ++mtk_wed_wo_queue_kick(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q, ++ u32 val) ++{ ++ wmb(); ++ mtk_wed_mmio_w32(wo, q->regs.cpu_idx, val); ++} ++ ++static void * ++mtk_wed_wo_dequeue(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q, u32 *len, ++ bool flush) ++{ ++ int buf_len = SKB_WITH_OVERHEAD(q->buf_size); ++ int index = (q->tail + 1) % q->n_desc; ++ struct mtk_wed_wo_queue_entry *entry; ++ struct mtk_wed_wo_queue_desc *desc; ++ void *buf; ++ ++ if (!q->queued) ++ return NULL; ++ ++ if (flush) ++ q->desc[index].ctrl |= cpu_to_le32(MTK_WED_WO_CTL_DMA_DONE); ++ else if (!(q->desc[index].ctrl & cpu_to_le32(MTK_WED_WO_CTL_DMA_DONE))) ++ return NULL; ++ ++ q->tail = index; ++ q->queued--; ++ ++ desc = &q->desc[index]; ++ entry = &q->entry[index]; ++ buf = entry->buf; ++ if (len) ++ *len = FIELD_GET(MTK_WED_WO_CTL_SD_LEN0, ++ le32_to_cpu(READ_ONCE(desc->ctrl))); ++ if (buf) ++ dma_unmap_single(wo->hw->dev, entry->addr, buf_len, ++ DMA_FROM_DEVICE); ++ entry->buf = NULL; ++ ++ return buf; ++} ++ ++static int ++mtk_wed_wo_queue_refill(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q, ++ gfp_t gfp, bool rx) ++{ ++ enum dma_data_direction dir = rx ? DMA_FROM_DEVICE : DMA_TO_DEVICE; ++ int n_buf = 0; ++ ++ spin_lock_bh(&q->lock); ++ while (q->queued < q->n_desc) { ++ void *buf = page_frag_alloc(&q->cache, q->buf_size, gfp); ++ struct mtk_wed_wo_queue_entry *entry; ++ dma_addr_t addr; ++ ++ if (!buf) ++ break; ++ ++ addr = dma_map_single(wo->hw->dev, buf, q->buf_size, dir); ++ if (unlikely(dma_mapping_error(wo->hw->dev, addr))) { ++ skb_free_frag(buf); ++ break; ++ } ++ ++ q->head = (q->head + 1) % q->n_desc; ++ entry = &q->entry[q->head]; ++ entry->addr = addr; ++ entry->len = q->buf_size; ++ q->entry[q->head].buf = buf; ++ ++ if (rx) { ++ struct mtk_wed_wo_queue_desc *desc = &q->desc[q->head]; ++ u32 ctrl = MTK_WED_WO_CTL_LAST_SEC0 | ++ FIELD_PREP(MTK_WED_WO_CTL_SD_LEN0, ++ entry->len); ++ ++ WRITE_ONCE(desc->buf0, cpu_to_le32(addr)); ++ WRITE_ONCE(desc->ctrl, cpu_to_le32(ctrl)); ++ } ++ q->queued++; ++ n_buf++; ++ } ++ spin_unlock_bh(&q->lock); ++ ++ return n_buf; ++} ++ ++static void ++mtk_wed_wo_rx_complete(struct mtk_wed_wo *wo) ++{ ++ mtk_wed_wo_set_ack(wo, MTK_WED_WO_RXCH_INT_MASK); ++ mtk_wed_wo_irq_enable(wo, MTK_WED_WO_RXCH_INT_MASK); ++} ++ ++static void ++mtk_wed_wo_rx_run_queue(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q) ++{ ++ for (;;) { ++ struct mtk_wed_mcu_hdr *hdr; ++ struct sk_buff *skb; ++ void *data; ++ u32 len; ++ ++ data = mtk_wed_wo_dequeue(wo, q, &len, false); ++ if (!data) ++ break; ++ ++ skb = build_skb(data, q->buf_size); ++ if (!skb) { ++ skb_free_frag(data); ++ continue; ++ } ++ ++ __skb_put(skb, len); ++ if (mtk_wed_mcu_check_msg(wo, skb)) { ++ dev_kfree_skb(skb); ++ continue; ++ } ++ ++ hdr = (struct mtk_wed_mcu_hdr *)skb->data; ++ if (hdr->flag & cpu_to_le16(MTK_WED_WARP_CMD_FLAG_RSP)) ++ mtk_wed_mcu_rx_event(wo, skb); ++ else ++ mtk_wed_mcu_rx_unsolicited_event(wo, skb); ++ } ++ ++ if (mtk_wed_wo_queue_refill(wo, q, GFP_ATOMIC, true)) { ++ u32 index = (q->head - 1) % q->n_desc; ++ ++ mtk_wed_wo_queue_kick(wo, q, index); ++ } ++} ++ ++static irqreturn_t ++mtk_wed_wo_irq_handler(int irq, void *data) ++{ ++ struct mtk_wed_wo *wo = data; ++ ++ mtk_wed_wo_set_isr(wo, 0); ++ tasklet_schedule(&wo->mmio.irq_tasklet); ++ ++ return IRQ_HANDLED; ++} ++ ++static void mtk_wed_wo_irq_tasklet(struct tasklet_struct *t) ++{ ++ struct mtk_wed_wo *wo = from_tasklet(wo, t, mmio.irq_tasklet); ++ u32 intr, mask; ++ ++ /* disable interrupts */ ++ mtk_wed_wo_set_isr(wo, 0); ++ ++ intr = mtk_wed_wo_get_isr(wo); ++ intr &= wo->mmio.irq_mask; ++ mask = intr & (MTK_WED_WO_RXCH_INT_MASK | MTK_WED_WO_EXCEPTION_INT_MASK); ++ mtk_wed_wo_irq_disable(wo, mask); ++ ++ if (intr & MTK_WED_WO_RXCH_INT_MASK) { ++ mtk_wed_wo_rx_run_queue(wo, &wo->q_rx); ++ mtk_wed_wo_rx_complete(wo); ++ } ++} ++ ++/* mtk wed wo hw queues */ ++ ++static int ++mtk_wed_wo_queue_alloc(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q, ++ int n_desc, int buf_size, int index, ++ struct mtk_wed_wo_queue_regs *regs) ++{ ++ spin_lock_init(&q->lock); ++ q->regs = *regs; ++ q->n_desc = n_desc; ++ q->buf_size = buf_size; ++ ++ q->desc = dmam_alloc_coherent(wo->hw->dev, n_desc * sizeof(*q->desc), ++ &q->desc_dma, GFP_KERNEL); ++ if (!q->desc) ++ return -ENOMEM; ++ ++ q->entry = devm_kzalloc(wo->hw->dev, n_desc * sizeof(*q->entry), ++ GFP_KERNEL); ++ if (!q->entry) ++ return -ENOMEM; ++ ++ return 0; ++} ++ ++static void ++mtk_wed_wo_queue_free(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q) ++{ ++ mtk_wed_mmio_w32(wo, q->regs.cpu_idx, 0); ++ dma_free_coherent(wo->hw->dev, q->n_desc * sizeof(*q->desc), q->desc, ++ q->desc_dma); ++} ++ ++static void ++mtk_wed_wo_queue_tx_clean(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q) ++{ ++ struct page *page; ++ int i; ++ ++ spin_lock_bh(&q->lock); ++ for (i = 0; i < q->n_desc; i++) { ++ struct mtk_wed_wo_queue_entry *entry = &q->entry[i]; ++ ++ dma_unmap_single(wo->hw->dev, entry->addr, entry->len, ++ DMA_TO_DEVICE); ++ skb_free_frag(entry->buf); ++ entry->buf = NULL; ++ } ++ spin_unlock_bh(&q->lock); ++ ++ if (!q->cache.va) ++ return; ++ ++ page = virt_to_page(q->cache.va); ++ __page_frag_cache_drain(page, q->cache.pagecnt_bias); ++ memset(&q->cache, 0, sizeof(q->cache)); ++} ++ ++static void ++mtk_wed_wo_queue_rx_clean(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q) ++{ ++ struct page *page; ++ ++ spin_lock_bh(&q->lock); ++ for (;;) { ++ void *buf = mtk_wed_wo_dequeue(wo, q, NULL, true); ++ ++ if (!buf) ++ break; ++ ++ skb_free_frag(buf); ++ } ++ spin_unlock_bh(&q->lock); ++ ++ if (!q->cache.va) ++ return; ++ ++ page = virt_to_page(q->cache.va); ++ __page_frag_cache_drain(page, q->cache.pagecnt_bias); ++ memset(&q->cache, 0, sizeof(q->cache)); ++} ++ ++static void ++mtk_wed_wo_queue_reset(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q) ++{ ++ mtk_wed_mmio_w32(wo, q->regs.cpu_idx, 0); ++ mtk_wed_mmio_w32(wo, q->regs.desc_base, q->desc_dma); ++ mtk_wed_mmio_w32(wo, q->regs.ring_size, q->n_desc); ++} ++ ++int mtk_wed_wo_queue_tx_skb(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q, ++ struct sk_buff *skb) ++{ ++ struct mtk_wed_wo_queue_entry *entry; ++ struct mtk_wed_wo_queue_desc *desc; ++ int ret = 0, index; ++ u32 ctrl; ++ ++ spin_lock_bh(&q->lock); ++ ++ q->tail = mtk_wed_mmio_r32(wo, q->regs.dma_idx); ++ index = (q->head + 1) % q->n_desc; ++ if (q->tail == index) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ ++ entry = &q->entry[index]; ++ if (skb->len > entry->len) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ ++ desc = &q->desc[index]; ++ q->head = index; ++ ++ dma_sync_single_for_cpu(wo->hw->dev, entry->addr, skb->len, ++ DMA_TO_DEVICE); ++ memcpy(entry->buf, skb->data, skb->len); ++ dma_sync_single_for_device(wo->hw->dev, entry->addr, skb->len, ++ DMA_TO_DEVICE); ++ ++ ctrl = FIELD_PREP(MTK_WED_WO_CTL_SD_LEN0, skb->len) | ++ MTK_WED_WO_CTL_LAST_SEC0 | MTK_WED_WO_CTL_DMA_DONE; ++ WRITE_ONCE(desc->buf0, cpu_to_le32(entry->addr)); ++ WRITE_ONCE(desc->ctrl, cpu_to_le32(ctrl)); ++ ++ mtk_wed_wo_queue_kick(wo, q, q->head); ++ mtk_wed_wo_kickout(wo); ++out: ++ spin_unlock_bh(&q->lock); ++ ++ dev_kfree_skb(skb); ++ ++ return ret; ++} ++ ++static int ++mtk_wed_wo_exception_init(struct mtk_wed_wo *wo) ++{ ++ return 0; ++} ++ ++static int ++mtk_wed_wo_hardware_init(struct mtk_wed_wo *wo) ++{ ++ struct mtk_wed_wo_queue_regs regs; ++ struct device_node *np; ++ int ret; ++ ++ np = of_parse_phandle(wo->hw->node, "mediatek,wo-ccif", 0); ++ if (!np) ++ return -ENODEV; ++ ++ wo->mmio.regs = syscon_regmap_lookup_by_phandle(np, NULL); ++ if (IS_ERR_OR_NULL(wo->mmio.regs)) ++ return PTR_ERR(wo->mmio.regs); ++ ++ wo->mmio.irq = irq_of_parse_and_map(np, 0); ++ wo->mmio.irq_mask = MTK_WED_WO_ALL_INT_MASK; ++ spin_lock_init(&wo->mmio.lock); ++ tasklet_setup(&wo->mmio.irq_tasklet, mtk_wed_wo_irq_tasklet); ++ ++ ret = devm_request_irq(wo->hw->dev, wo->mmio.irq, ++ mtk_wed_wo_irq_handler, IRQF_TRIGGER_HIGH, ++ KBUILD_MODNAME, wo); ++ if (ret) ++ goto error; ++ ++ regs.desc_base = MTK_WED_WO_CCIF_DUMMY1; ++ regs.ring_size = MTK_WED_WO_CCIF_DUMMY2; ++ regs.dma_idx = MTK_WED_WO_CCIF_SHADOW4; ++ regs.cpu_idx = MTK_WED_WO_CCIF_DUMMY3; ++ ++ ret = mtk_wed_wo_queue_alloc(wo, &wo->q_tx, MTK_WED_WO_RING_SIZE, ++ MTK_WED_WO_CMD_LEN, MTK_WED_WO_TXCH_NUM, ++ ®s); ++ if (ret) ++ goto error; ++ ++ mtk_wed_wo_queue_refill(wo, &wo->q_tx, GFP_KERNEL, false); ++ mtk_wed_wo_queue_reset(wo, &wo->q_tx); ++ ++ regs.desc_base = MTK_WED_WO_CCIF_DUMMY5; ++ regs.ring_size = MTK_WED_WO_CCIF_DUMMY6; ++ regs.dma_idx = MTK_WED_WO_CCIF_SHADOW8; ++ regs.cpu_idx = MTK_WED_WO_CCIF_DUMMY7; ++ ++ ret = mtk_wed_wo_queue_alloc(wo, &wo->q_rx, MTK_WED_WO_RING_SIZE, ++ MTK_WED_WO_CMD_LEN, MTK_WED_WO_RXCH_NUM, ++ ®s); ++ if (ret) ++ goto error; ++ ++ mtk_wed_wo_queue_refill(wo, &wo->q_rx, GFP_KERNEL, true); ++ mtk_wed_wo_queue_reset(wo, &wo->q_rx); ++ ++ /* rx queue irqmask */ ++ mtk_wed_wo_set_isr(wo, wo->mmio.irq_mask); ++ ++ return 0; ++ ++error: ++ devm_free_irq(wo->hw->dev, wo->mmio.irq, wo); ++ ++ return ret; ++} ++ ++static void ++mtk_wed_wo_hw_deinit(struct mtk_wed_wo *wo) ++{ ++ /* disable interrupts */ ++ mtk_wed_wo_set_isr(wo, 0); ++ ++ tasklet_disable(&wo->mmio.irq_tasklet); ++ ++ disable_irq(wo->mmio.irq); ++ devm_free_irq(wo->hw->dev, wo->mmio.irq, wo); ++ ++ mtk_wed_wo_queue_tx_clean(wo, &wo->q_tx); ++ mtk_wed_wo_queue_rx_clean(wo, &wo->q_rx); ++ mtk_wed_wo_queue_free(wo, &wo->q_tx); ++ mtk_wed_wo_queue_free(wo, &wo->q_rx); ++} ++ ++int mtk_wed_wo_init(struct mtk_wed_hw *hw) ++{ ++ struct mtk_wed_wo *wo; ++ int ret; ++ ++ wo = devm_kzalloc(hw->dev, sizeof(*wo), GFP_KERNEL); ++ if (!wo) ++ return -ENOMEM; ++ ++ hw->wed_wo = wo; ++ wo->hw = hw; ++ ++ ret = mtk_wed_wo_hardware_init(wo); ++ if (ret) ++ return ret; ++ ++ ret = mtk_wed_mcu_init(wo); ++ if (ret) ++ return ret; ++ ++ return mtk_wed_wo_exception_init(wo); ++} ++ ++void mtk_wed_wo_deinit(struct mtk_wed_hw *hw) ++{ ++ struct mtk_wed_wo *wo = hw->wed_wo; ++ ++ mtk_wed_wo_hw_deinit(wo); ++} +--- a/drivers/net/ethernet/mediatek/mtk_wed_wo.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.h +@@ -80,6 +80,54 @@ enum mtk_wed_dummy_cr_idx { + #define MTK_WO_MCU_CFG_LS_WF_WM_WA_WM_CPU_RSTB_MASK BIT(5) + #define MTK_WO_MCU_CFG_LS_WF_WM_WA_WA_CPU_RSTB_MASK BIT(0) + ++#define MTK_WED_WO_RING_SIZE 256 ++#define MTK_WED_WO_CMD_LEN 1504 ++ ++#define MTK_WED_WO_TXCH_NUM 0 ++#define MTK_WED_WO_RXCH_NUM 1 ++#define MTK_WED_WO_RXCH_WO_EXCEPTION 7 ++ ++#define MTK_WED_WO_TXCH_INT_MASK BIT(0) ++#define MTK_WED_WO_RXCH_INT_MASK BIT(1) ++#define MTK_WED_WO_EXCEPTION_INT_MASK BIT(7) ++#define MTK_WED_WO_ALL_INT_MASK (MTK_WED_WO_RXCH_INT_MASK | \ ++ MTK_WED_WO_EXCEPTION_INT_MASK) ++ ++#define MTK_WED_WO_CCIF_BUSY 0x004 ++#define MTK_WED_WO_CCIF_START 0x008 ++#define MTK_WED_WO_CCIF_TCHNUM 0x00c ++#define MTK_WED_WO_CCIF_RCHNUM 0x010 ++#define MTK_WED_WO_CCIF_RCHNUM_MASK GENMASK(7, 0) ++ ++#define MTK_WED_WO_CCIF_ACK 0x014 ++#define MTK_WED_WO_CCIF_IRQ0_MASK 0x018 ++#define MTK_WED_WO_CCIF_IRQ1_MASK 0x01c ++#define MTK_WED_WO_CCIF_DUMMY1 0x020 ++#define MTK_WED_WO_CCIF_DUMMY2 0x024 ++#define MTK_WED_WO_CCIF_DUMMY3 0x028 ++#define MTK_WED_WO_CCIF_DUMMY4 0x02c ++#define MTK_WED_WO_CCIF_SHADOW1 0x030 ++#define MTK_WED_WO_CCIF_SHADOW2 0x034 ++#define MTK_WED_WO_CCIF_SHADOW3 0x038 ++#define MTK_WED_WO_CCIF_SHADOW4 0x03c ++#define MTK_WED_WO_CCIF_DUMMY5 0x050 ++#define MTK_WED_WO_CCIF_DUMMY6 0x054 ++#define MTK_WED_WO_CCIF_DUMMY7 0x058 ++#define MTK_WED_WO_CCIF_DUMMY8 0x05c ++#define MTK_WED_WO_CCIF_SHADOW5 0x060 ++#define MTK_WED_WO_CCIF_SHADOW6 0x064 ++#define MTK_WED_WO_CCIF_SHADOW7 0x068 ++#define MTK_WED_WO_CCIF_SHADOW8 0x06c ++ ++#define MTK_WED_WO_CTL_SD_LEN1 GENMASK(13, 0) ++#define MTK_WED_WO_CTL_LAST_SEC1 BIT(14) ++#define MTK_WED_WO_CTL_BURST BIT(15) ++#define MTK_WED_WO_CTL_SD_LEN0_SHIFT 16 ++#define MTK_WED_WO_CTL_SD_LEN0 GENMASK(29, 16) ++#define MTK_WED_WO_CTL_LAST_SEC0 BIT(30) ++#define MTK_WED_WO_CTL_DMA_DONE BIT(31) ++#define MTK_WED_WO_INFO_WINFO GENMASK(15, 0) ++ + struct mtk_wed_wo_memory_region { + const char *name; + void __iomem *addr; +@@ -112,10 +160,53 @@ struct mtk_wed_fw_trailer { + u32 crc; + }; + ++struct mtk_wed_wo_queue_regs { ++ u32 desc_base; ++ u32 ring_size; ++ u32 cpu_idx; ++ u32 dma_idx; ++}; ++ ++struct mtk_wed_wo_queue_desc { ++ __le32 buf0; ++ __le32 ctrl; ++ __le32 buf1; ++ __le32 info; ++ __le32 reserved[4]; ++} __packed __aligned(32); ++ ++struct mtk_wed_wo_queue_entry { ++ dma_addr_t addr; ++ void *buf; ++ u32 len; ++}; ++ ++struct mtk_wed_wo_queue { ++ struct mtk_wed_wo_queue_regs regs; ++ ++ struct page_frag_cache cache; ++ spinlock_t lock; ++ ++ struct mtk_wed_wo_queue_desc *desc; ++ dma_addr_t desc_dma; ++ ++ struct mtk_wed_wo_queue_entry *entry; ++ ++ u16 head; ++ u16 tail; ++ int n_desc; ++ int queued; ++ int buf_size; ++ ++}; ++ + struct mtk_wed_wo { + struct mtk_wed_hw *hw; + struct mtk_wed_wo_memory_region boot; + ++ struct mtk_wed_wo_queue q_tx; ++ struct mtk_wed_wo_queue q_rx; ++ + struct { + struct mutex mutex; + int timeout; +@@ -124,6 +215,15 @@ struct mtk_wed_wo { + struct sk_buff_head res_q; + wait_queue_head_t wait; + } mcu; ++ ++ struct { ++ struct regmap *regs; ++ ++ spinlock_t lock; ++ struct tasklet_struct irq_tasklet; ++ int irq; ++ u32 irq_mask; ++ } mmio; + }; + + static inline int +@@ -146,5 +246,9 @@ void mtk_wed_mcu_rx_unsolicited_event(st + int mtk_wed_mcu_send_msg(struct mtk_wed_wo *wo, int id, int cmd, + const void *data, int len, bool wait_resp); + int mtk_wed_mcu_init(struct mtk_wed_wo *wo); ++int mtk_wed_wo_init(struct mtk_wed_hw *hw); ++void mtk_wed_wo_deinit(struct mtk_wed_hw *hw); ++int mtk_wed_wo_queue_tx_skb(struct mtk_wed_wo *dev, struct mtk_wed_wo_queue *q, ++ struct sk_buff *skb); + + #endif /* __MTK_WED_WO_H */ diff --git a/target/linux/generic/backport-5.15/729-03-v6.1-net-ethernet-mtk_wed-rename-tx_wdma-array-in-rx_wdma.patch b/target/linux/generic/backport-5.15/729-03-v6.1-net-ethernet-mtk_wed-rename-tx_wdma-array-in-rx_wdma.patch new file mode 100644 index 0000000000..ffd6bc3589 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-03-v6.1-net-ethernet-mtk_wed-rename-tx_wdma-array-in-rx_wdma.patch @@ -0,0 +1,79 @@ +From: Lorenzo Bianconi +Date: Sat, 5 Nov 2022 23:36:20 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: rename tx_wdma array in rx_wdma + +Rename tx_wdma queue array in rx_wdma since this is rx side of wdma soc. +Moreover rename mtk_wed_wdma_ring_setup routine in +mtk_wed_wdma_rx_ring_setup() + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -253,8 +253,8 @@ mtk_wed_free_tx_rings(struct mtk_wed_dev + + for (i = 0; i < ARRAY_SIZE(dev->tx_ring); i++) + mtk_wed_free_ring(dev, &dev->tx_ring[i]); +- for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) +- mtk_wed_free_ring(dev, &dev->tx_wdma[i]); ++ for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++) ++ mtk_wed_free_ring(dev, &dev->rx_wdma[i]); + } + + static void +@@ -695,10 +695,10 @@ mtk_wed_ring_alloc(struct mtk_wed_device + } + + static int +-mtk_wed_wdma_ring_setup(struct mtk_wed_device *dev, int idx, int size) ++mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size) + { + u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; +- struct mtk_wed_ring *wdma = &dev->tx_wdma[idx]; ++ struct mtk_wed_ring *wdma = &dev->rx_wdma[idx]; + + if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size)) + return -ENOMEM; +@@ -812,9 +812,9 @@ mtk_wed_start(struct mtk_wed_device *dev + { + int i; + +- for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) +- if (!dev->tx_wdma[i].desc) +- mtk_wed_wdma_ring_setup(dev, i, 16); ++ for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++) ++ if (!dev->rx_wdma[i].desc) ++ mtk_wed_wdma_rx_ring_setup(dev, i, 16); + + mtk_wed_hw_init(dev); + mtk_wed_configure_irq(dev, irq_mask); +@@ -923,7 +923,7 @@ mtk_wed_tx_ring_setup(struct mtk_wed_dev + sizeof(*ring->desc))) + return -ENOMEM; + +- if (mtk_wed_wdma_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) ++ if (mtk_wed_wdma_rx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) + return -ENOMEM; + + ring->reg_base = MTK_WED_RING_TX(idx); +--- a/include/linux/soc/mediatek/mtk_wed.h ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -7,6 +7,7 @@ + #include + + #define MTK_WED_TX_QUEUES 2 ++#define MTK_WED_RX_QUEUES 2 + + struct mtk_wed_hw; + struct mtk_wdma_desc; +@@ -66,7 +67,7 @@ struct mtk_wed_device { + + struct mtk_wed_ring tx_ring[MTK_WED_TX_QUEUES]; + struct mtk_wed_ring txfree_ring; +- struct mtk_wed_ring tx_wdma[MTK_WED_TX_QUEUES]; ++ struct mtk_wed_ring rx_wdma[MTK_WED_RX_QUEUES]; + + struct { + int size; diff --git a/target/linux/generic/backport-5.15/729-04-v6.1-net-ethernet-mtk_wed-add-configure-wed-wo-support.patch b/target/linux/generic/backport-5.15/729-04-v6.1-net-ethernet-mtk_wed-add-configure-wed-wo-support.patch new file mode 100644 index 0000000000..4c34d0cb33 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-04-v6.1-net-ethernet-mtk_wed-add-configure-wed-wo-support.patch @@ -0,0 +1,1521 @@ +From: Lorenzo Bianconi +Date: Sat, 5 Nov 2022 23:36:21 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: add configure wed wo support + +Enable RX Wireless Ethernet Dispatch available on MT7986 Soc. + +Tested-by: Daniel Golle +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -23,6 +24,7 @@ + #define MTK_WED_PKT_SIZE 1900 + #define MTK_WED_BUF_SIZE 2048 + #define MTK_WED_BUF_PER_PAGE (PAGE_SIZE / 2048) ++#define MTK_WED_RX_RING_SIZE 1536 + + #define MTK_WED_TX_RING_SIZE 2048 + #define MTK_WED_WDMA_RING_SIZE 1024 +@@ -31,6 +33,10 @@ + #define MTK_WED_PER_GROUP_PKT 128 + + #define MTK_WED_FBUF_SIZE 128 ++#define MTK_WED_MIOD_CNT 16 ++#define MTK_WED_FB_CMD_CNT 1024 ++#define MTK_WED_RRO_QUE_CNT 8192 ++#define MTK_WED_MIOD_ENTRY_CNT 128 + + static struct mtk_wed_hw *hw_list[2]; + static DEFINE_MUTEX(hw_lock); +@@ -65,12 +71,76 @@ wdma_set(struct mtk_wed_device *dev, u32 + wdma_m32(dev, reg, 0, mask); + } + ++static void ++wdma_clr(struct mtk_wed_device *dev, u32 reg, u32 mask) ++{ ++ wdma_m32(dev, reg, mask, 0); ++} ++ ++static u32 ++wifi_r32(struct mtk_wed_device *dev, u32 reg) ++{ ++ return readl(dev->wlan.base + reg); ++} ++ ++static void ++wifi_w32(struct mtk_wed_device *dev, u32 reg, u32 val) ++{ ++ writel(val, dev->wlan.base + reg); ++} ++ + static u32 + mtk_wed_read_reset(struct mtk_wed_device *dev) + { + return wed_r32(dev, MTK_WED_RESET); + } + ++static u32 ++mtk_wdma_read_reset(struct mtk_wed_device *dev) ++{ ++ return wdma_r32(dev, MTK_WDMA_GLO_CFG); ++} ++ ++static void ++mtk_wdma_rx_reset(struct mtk_wed_device *dev) ++{ ++ u32 status, mask = MTK_WDMA_GLO_CFG_RX_DMA_BUSY; ++ int i; ++ ++ wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_RX_DMA_EN); ++ if (readx_poll_timeout(mtk_wdma_read_reset, dev, status, ++ !(status & mask), 0, 1000)) ++ dev_err(dev->hw->dev, "rx reset failed\n"); ++ ++ for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++) { ++ if (dev->rx_wdma[i].desc) ++ continue; ++ ++ wdma_w32(dev, ++ MTK_WDMA_RING_RX(i) + MTK_WED_RING_OFS_CPU_IDX, 0); ++ } ++} ++ ++static void ++mtk_wdma_tx_reset(struct mtk_wed_device *dev) ++{ ++ u32 status, mask = MTK_WDMA_GLO_CFG_TX_DMA_BUSY; ++ int i; ++ ++ wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_TX_DMA_EN); ++ if (readx_poll_timeout(mtk_wdma_read_reset, dev, status, ++ !(status & mask), 0, 1000)) ++ dev_err(dev->hw->dev, "tx reset failed\n"); ++ ++ for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) { ++ if (dev->tx_wdma[i].desc) ++ continue; ++ ++ wdma_w32(dev, ++ MTK_WDMA_RING_TX(i) + MTK_WED_RING_OFS_CPU_IDX, 0); ++ } ++} ++ + static void + mtk_wed_reset(struct mtk_wed_device *dev, u32 mask) + { +@@ -82,6 +152,54 @@ mtk_wed_reset(struct mtk_wed_device *dev + WARN_ON_ONCE(1); + } + ++static u32 ++mtk_wed_wo_read_status(struct mtk_wed_device *dev) ++{ ++ return wed_r32(dev, MTK_WED_SCR0 + 4 * MTK_WED_DUMMY_CR_WO_STATUS); ++} ++ ++static void ++mtk_wed_wo_reset(struct mtk_wed_device *dev) ++{ ++ struct mtk_wed_wo *wo = dev->hw->wed_wo; ++ u8 state = MTK_WED_WO_STATE_DISABLE; ++ void __iomem *reg; ++ u32 val; ++ ++ mtk_wdma_tx_reset(dev); ++ mtk_wed_reset(dev, MTK_WED_RESET_WED); ++ ++ mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, ++ MTK_WED_WO_CMD_CHANGE_STATE, &state, ++ sizeof(state), false); ++ ++ if (readx_poll_timeout(mtk_wed_wo_read_status, dev, val, ++ val == MTK_WED_WOIF_DISABLE_DONE, ++ 100, MTK_WOCPU_TIMEOUT)) ++ dev_err(dev->hw->dev, "failed to disable wed-wo\n"); ++ ++ reg = ioremap(MTK_WED_WO_CPU_MCUSYS_RESET_ADDR, 4); ++ ++ val = readl(reg); ++ switch (dev->hw->index) { ++ case 0: ++ val |= MTK_WED_WO_CPU_WO0_MCUSYS_RESET_MASK; ++ writel(val, reg); ++ val &= ~MTK_WED_WO_CPU_WO0_MCUSYS_RESET_MASK; ++ writel(val, reg); ++ break; ++ case 1: ++ val |= MTK_WED_WO_CPU_WO1_MCUSYS_RESET_MASK; ++ writel(val, reg); ++ val &= ~MTK_WED_WO_CPU_WO1_MCUSYS_RESET_MASK; ++ writel(val, reg); ++ break; ++ default: ++ break; ++ } ++ iounmap(reg); ++} ++ + static struct mtk_wed_hw * + mtk_wed_assign(struct mtk_wed_device *dev) + { +@@ -116,7 +234,7 @@ out: + } + + static int +-mtk_wed_buffer_alloc(struct mtk_wed_device *dev) ++mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev) + { + struct mtk_wdma_desc *desc; + dma_addr_t desc_phys; +@@ -133,16 +251,16 @@ mtk_wed_buffer_alloc(struct mtk_wed_devi + if (!page_list) + return -ENOMEM; + +- dev->buf_ring.size = ring_size; +- dev->buf_ring.pages = page_list; ++ dev->tx_buf_ring.size = ring_size; ++ dev->tx_buf_ring.pages = page_list; + + desc = dma_alloc_coherent(dev->hw->dev, ring_size * sizeof(*desc), + &desc_phys, GFP_KERNEL); + if (!desc) + return -ENOMEM; + +- dev->buf_ring.desc = desc; +- dev->buf_ring.desc_phys = desc_phys; ++ dev->tx_buf_ring.desc = desc; ++ dev->tx_buf_ring.desc_phys = desc_phys; + + for (i = 0, page_idx = 0; i < ring_size; i += MTK_WED_BUF_PER_PAGE) { + dma_addr_t page_phys, buf_phys; +@@ -203,10 +321,10 @@ mtk_wed_buffer_alloc(struct mtk_wed_devi + } + + static void +-mtk_wed_free_buffer(struct mtk_wed_device *dev) ++mtk_wed_free_tx_buffer(struct mtk_wed_device *dev) + { +- struct mtk_wdma_desc *desc = dev->buf_ring.desc; +- void **page_list = dev->buf_ring.pages; ++ struct mtk_wdma_desc *desc = dev->tx_buf_ring.desc; ++ void **page_list = dev->tx_buf_ring.pages; + int page_idx; + int i; + +@@ -216,7 +334,8 @@ mtk_wed_free_buffer(struct mtk_wed_devic + if (!desc) + goto free_pagelist; + +- for (i = 0, page_idx = 0; i < dev->buf_ring.size; i += MTK_WED_BUF_PER_PAGE) { ++ for (i = 0, page_idx = 0; i < dev->tx_buf_ring.size; ++ i += MTK_WED_BUF_PER_PAGE) { + void *page = page_list[page_idx++]; + dma_addr_t buf_addr; + +@@ -229,13 +348,59 @@ mtk_wed_free_buffer(struct mtk_wed_devic + __free_page(page); + } + +- dma_free_coherent(dev->hw->dev, dev->buf_ring.size * sizeof(*desc), +- desc, dev->buf_ring.desc_phys); ++ dma_free_coherent(dev->hw->dev, dev->tx_buf_ring.size * sizeof(*desc), ++ desc, dev->tx_buf_ring.desc_phys); + + free_pagelist: + kfree(page_list); + } + ++static int ++mtk_wed_rx_buffer_alloc(struct mtk_wed_device *dev) ++{ ++ struct mtk_rxbm_desc *desc; ++ dma_addr_t desc_phys; ++ ++ dev->rx_buf_ring.size = dev->wlan.rx_nbuf; ++ desc = dma_alloc_coherent(dev->hw->dev, ++ dev->wlan.rx_nbuf * sizeof(*desc), ++ &desc_phys, GFP_KERNEL); ++ if (!desc) ++ return -ENOMEM; ++ ++ dev->rx_buf_ring.desc = desc; ++ dev->rx_buf_ring.desc_phys = desc_phys; ++ dev->wlan.init_rx_buf(dev, dev->wlan.rx_npkt); ++ ++ return 0; ++} ++ ++static void ++mtk_wed_free_rx_buffer(struct mtk_wed_device *dev) ++{ ++ struct mtk_rxbm_desc *desc = dev->rx_buf_ring.desc; ++ ++ if (!desc) ++ return; ++ ++ dev->wlan.release_rx_buf(dev); ++ dma_free_coherent(dev->hw->dev, dev->rx_buf_ring.size * sizeof(*desc), ++ desc, dev->rx_buf_ring.desc_phys); ++} ++ ++static void ++mtk_wed_rx_buffer_hw_init(struct mtk_wed_device *dev) ++{ ++ wed_w32(dev, MTK_WED_RX_BM_RX_DMAD, ++ FIELD_PREP(MTK_WED_RX_BM_RX_DMAD_SDL0, dev->wlan.rx_size)); ++ wed_w32(dev, MTK_WED_RX_BM_BASE, dev->rx_buf_ring.desc_phys); ++ wed_w32(dev, MTK_WED_RX_BM_INIT_PTR, MTK_WED_RX_BM_INIT_SW_TAIL | ++ FIELD_PREP(MTK_WED_RX_BM_SW_TAIL, dev->wlan.rx_npkt)); ++ wed_w32(dev, MTK_WED_RX_BM_DYN_ALLOC_TH, ++ FIELD_PREP(MTK_WED_RX_BM_DYN_ALLOC_TH_H, 0xffff)); ++ wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_BM_EN); ++} ++ + static void + mtk_wed_free_ring(struct mtk_wed_device *dev, struct mtk_wed_ring *ring) + { +@@ -247,6 +412,13 @@ mtk_wed_free_ring(struct mtk_wed_device + } + + static void ++mtk_wed_free_rx_rings(struct mtk_wed_device *dev) ++{ ++ mtk_wed_free_rx_buffer(dev); ++ mtk_wed_free_ring(dev, &dev->rro.ring); ++} ++ ++static void + mtk_wed_free_tx_rings(struct mtk_wed_device *dev) + { + int i; +@@ -291,6 +463,38 @@ mtk_wed_set_512_support(struct mtk_wed_d + } + } + ++#define MTK_WFMDA_RX_DMA_EN BIT(2) ++static void ++mtk_wed_check_wfdma_rx_fill(struct mtk_wed_device *dev, int idx) ++{ ++ u32 val; ++ int i; ++ ++ if (!(dev->rx_ring[idx].flags & MTK_WED_RING_CONFIGURED)) ++ return; /* queue is not configured by mt76 */ ++ ++ for (i = 0; i < 3; i++) { ++ u32 cur_idx; ++ ++ cur_idx = wed_r32(dev, ++ MTK_WED_WPDMA_RING_RX_DATA(idx) + ++ MTK_WED_RING_OFS_CPU_IDX); ++ if (cur_idx == MTK_WED_RX_RING_SIZE - 1) ++ break; ++ ++ usleep_range(100000, 200000); ++ } ++ ++ if (i == 3) { ++ dev_err(dev->hw->dev, "rx dma enable failed\n"); ++ return; ++ } ++ ++ val = wifi_r32(dev, dev->wlan.wpdma_rx_glo - dev->wlan.phy_base) | ++ MTK_WFMDA_RX_DMA_EN; ++ wifi_w32(dev, dev->wlan.wpdma_rx_glo - dev->wlan.phy_base, val); ++} ++ + static void + mtk_wed_dma_disable(struct mtk_wed_device *dev) + { +@@ -304,20 +508,25 @@ mtk_wed_dma_disable(struct mtk_wed_devic + MTK_WED_GLO_CFG_TX_DMA_EN | + MTK_WED_GLO_CFG_RX_DMA_EN); + +- wdma_m32(dev, MTK_WDMA_GLO_CFG, ++ wdma_clr(dev, MTK_WDMA_GLO_CFG, + MTK_WDMA_GLO_CFG_TX_DMA_EN | + MTK_WDMA_GLO_CFG_RX_INFO1_PRERES | +- MTK_WDMA_GLO_CFG_RX_INFO2_PRERES, 0); ++ MTK_WDMA_GLO_CFG_RX_INFO2_PRERES); + + if (dev->hw->version == 1) { + regmap_write(dev->hw->mirror, dev->hw->index * 4, 0); +- wdma_m32(dev, MTK_WDMA_GLO_CFG, +- MTK_WDMA_GLO_CFG_RX_INFO3_PRERES, 0); ++ wdma_clr(dev, MTK_WDMA_GLO_CFG, ++ MTK_WDMA_GLO_CFG_RX_INFO3_PRERES); + } else { + wed_clr(dev, MTK_WED_WPDMA_GLO_CFG, + MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC | + MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC); + ++ wed_clr(dev, MTK_WED_WPDMA_RX_D_GLO_CFG, ++ MTK_WED_WPDMA_RX_D_RX_DRV_EN); ++ wed_clr(dev, MTK_WED_WDMA_GLO_CFG, ++ MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK); ++ + mtk_wed_set_512_support(dev, false); + } + } +@@ -338,6 +547,13 @@ mtk_wed_stop(struct mtk_wed_device *dev) + wdma_w32(dev, MTK_WDMA_INT_MASK, 0); + wdma_w32(dev, MTK_WDMA_INT_GRP2, 0); + wed_w32(dev, MTK_WED_WPDMA_INT_MASK, 0); ++ ++ if (dev->hw->version == 1) ++ return; ++ ++ wed_w32(dev, MTK_WED_EXT_INT_MASK1, 0); ++ wed_w32(dev, MTK_WED_EXT_INT_MASK2, 0); ++ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_BM_EN); + } + + static void +@@ -353,11 +569,21 @@ mtk_wed_detach(struct mtk_wed_device *de + wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); + + mtk_wed_reset(dev, MTK_WED_RESET_WED); ++ if (mtk_wed_get_rx_capa(dev)) { ++ wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_TX_DMA_EN); ++ wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_TX); ++ wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); ++ } + +- mtk_wed_free_buffer(dev); ++ mtk_wed_free_tx_buffer(dev); + mtk_wed_free_tx_rings(dev); +- if (hw->version != 1) ++ ++ if (mtk_wed_get_rx_capa(dev)) { ++ mtk_wed_wo_reset(dev); ++ mtk_wed_free_rx_rings(dev); + mtk_wed_wo_deinit(hw); ++ mtk_wdma_rx_reset(dev); ++ } + + if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) { + struct device_node *wlan_node; +@@ -441,10 +667,12 @@ mtk_wed_set_wpdma(struct mtk_wed_device + } else { + mtk_wed_bus_init(dev); + +- wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_int); +- wed_w32(dev, MTK_WED_WPDMA_CFG_INT_MASK, dev->wlan.wpdma_mask); +- wed_w32(dev, MTK_WED_WPDMA_CFG_TX, dev->wlan.wpdma_tx); +- wed_w32(dev, MTK_WED_WPDMA_CFG_TX_FREE, dev->wlan.wpdma_txfree); ++ wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_int); ++ wed_w32(dev, MTK_WED_WPDMA_CFG_INT_MASK, dev->wlan.wpdma_mask); ++ wed_w32(dev, MTK_WED_WPDMA_CFG_TX, dev->wlan.wpdma_tx); ++ wed_w32(dev, MTK_WED_WPDMA_CFG_TX_FREE, dev->wlan.wpdma_txfree); ++ wed_w32(dev, MTK_WED_WPDMA_RX_GLO_CFG, dev->wlan.wpdma_rx_glo); ++ wed_w32(dev, MTK_WED_WPDMA_RX_RING, dev->wlan.wpdma_rx); + } + } + +@@ -494,6 +722,132 @@ mtk_wed_hw_init_early(struct mtk_wed_dev + } + } + ++static int ++mtk_wed_rro_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring, ++ int size) ++{ ++ ring->desc = dma_alloc_coherent(dev->hw->dev, ++ size * sizeof(*ring->desc), ++ &ring->desc_phys, GFP_KERNEL); ++ if (!ring->desc) ++ return -ENOMEM; ++ ++ ring->desc_size = sizeof(*ring->desc); ++ ring->size = size; ++ memset(ring->desc, 0, size); ++ ++ return 0; ++} ++ ++#define MTK_WED_MIOD_COUNT (MTK_WED_MIOD_ENTRY_CNT * MTK_WED_MIOD_CNT) ++static int ++mtk_wed_rro_alloc(struct mtk_wed_device *dev) ++{ ++ struct reserved_mem *rmem; ++ struct device_node *np; ++ int index; ++ ++ index = of_property_match_string(dev->hw->node, "memory-region-names", ++ "wo-dlm"); ++ if (index < 0) ++ return index; ++ ++ np = of_parse_phandle(dev->hw->node, "memory-region", index); ++ if (!np) ++ return -ENODEV; ++ ++ rmem = of_reserved_mem_lookup(np); ++ of_node_put(np); ++ ++ if (!rmem) ++ return -ENODEV; ++ ++ dev->rro.miod_phys = rmem->base; ++ dev->rro.fdbk_phys = MTK_WED_MIOD_COUNT + dev->rro.miod_phys; ++ ++ return mtk_wed_rro_ring_alloc(dev, &dev->rro.ring, ++ MTK_WED_RRO_QUE_CNT); ++} ++ ++static int ++mtk_wed_rro_cfg(struct mtk_wed_device *dev) ++{ ++ struct mtk_wed_wo *wo = dev->hw->wed_wo; ++ struct { ++ struct { ++ __le32 base; ++ __le32 cnt; ++ __le32 unit; ++ } ring[2]; ++ __le32 wed; ++ u8 version; ++ } req = { ++ .ring[0] = { ++ .base = cpu_to_le32(MTK_WED_WOCPU_VIEW_MIOD_BASE), ++ .cnt = cpu_to_le32(MTK_WED_MIOD_CNT), ++ .unit = cpu_to_le32(MTK_WED_MIOD_ENTRY_CNT), ++ }, ++ .ring[1] = { ++ .base = cpu_to_le32(MTK_WED_WOCPU_VIEW_MIOD_BASE + ++ MTK_WED_MIOD_COUNT), ++ .cnt = cpu_to_le32(MTK_WED_FB_CMD_CNT), ++ .unit = cpu_to_le32(4), ++ }, ++ }; ++ ++ return mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, ++ MTK_WED_WO_CMD_WED_CFG, ++ &req, sizeof(req), true); ++} ++ ++static void ++mtk_wed_rro_hw_init(struct mtk_wed_device *dev) ++{ ++ wed_w32(dev, MTK_WED_RROQM_MIOD_CFG, ++ FIELD_PREP(MTK_WED_RROQM_MIOD_MID_DW, 0x70 >> 2) | ++ FIELD_PREP(MTK_WED_RROQM_MIOD_MOD_DW, 0x10 >> 2) | ++ FIELD_PREP(MTK_WED_RROQM_MIOD_ENTRY_DW, ++ MTK_WED_MIOD_ENTRY_CNT >> 2)); ++ ++ wed_w32(dev, MTK_WED_RROQM_MIOD_CTRL0, dev->rro.miod_phys); ++ wed_w32(dev, MTK_WED_RROQM_MIOD_CTRL1, ++ FIELD_PREP(MTK_WED_RROQM_MIOD_CNT, MTK_WED_MIOD_CNT)); ++ wed_w32(dev, MTK_WED_RROQM_FDBK_CTRL0, dev->rro.fdbk_phys); ++ wed_w32(dev, MTK_WED_RROQM_FDBK_CTRL1, ++ FIELD_PREP(MTK_WED_RROQM_FDBK_CNT, MTK_WED_FB_CMD_CNT)); ++ wed_w32(dev, MTK_WED_RROQM_FDBK_CTRL2, 0); ++ wed_w32(dev, MTK_WED_RROQ_BASE_L, dev->rro.ring.desc_phys); ++ ++ wed_set(dev, MTK_WED_RROQM_RST_IDX, ++ MTK_WED_RROQM_RST_IDX_MIOD | ++ MTK_WED_RROQM_RST_IDX_FDBK); ++ ++ wed_w32(dev, MTK_WED_RROQM_RST_IDX, 0); ++ wed_w32(dev, MTK_WED_RROQM_MIOD_CTRL2, MTK_WED_MIOD_CNT - 1); ++ wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_RRO_QM_EN); ++} ++ ++static void ++mtk_wed_route_qm_hw_init(struct mtk_wed_device *dev) ++{ ++ wed_w32(dev, MTK_WED_RESET, MTK_WED_RESET_RX_ROUTE_QM); ++ ++ for (;;) { ++ usleep_range(100, 200); ++ if (!(wed_r32(dev, MTK_WED_RESET) & MTK_WED_RESET_RX_ROUTE_QM)) ++ break; ++ } ++ ++ /* configure RX_ROUTE_QM */ ++ wed_clr(dev, MTK_WED_RTQM_GLO_CFG, MTK_WED_RTQM_Q_RST); ++ wed_clr(dev, MTK_WED_RTQM_GLO_CFG, MTK_WED_RTQM_TXDMAD_FPORT); ++ wed_set(dev, MTK_WED_RTQM_GLO_CFG, ++ FIELD_PREP(MTK_WED_RTQM_TXDMAD_FPORT, 0x3 + dev->hw->index)); ++ wed_clr(dev, MTK_WED_RTQM_GLO_CFG, MTK_WED_RTQM_Q_RST); ++ /* enable RX_ROUTE_QM */ ++ wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_ROUTE_QM_EN); ++} ++ + static void + mtk_wed_hw_init(struct mtk_wed_device *dev) + { +@@ -505,11 +859,11 @@ mtk_wed_hw_init(struct mtk_wed_device *d + wed_w32(dev, MTK_WED_TX_BM_CTRL, + MTK_WED_TX_BM_CTRL_PAUSE | + FIELD_PREP(MTK_WED_TX_BM_CTRL_VLD_GRP_NUM, +- dev->buf_ring.size / 128) | ++ dev->tx_buf_ring.size / 128) | + FIELD_PREP(MTK_WED_TX_BM_CTRL_RSV_GRP_NUM, + MTK_WED_TX_RING_SIZE / 256)); + +- wed_w32(dev, MTK_WED_TX_BM_BASE, dev->buf_ring.desc_phys); ++ wed_w32(dev, MTK_WED_TX_BM_BASE, dev->tx_buf_ring.desc_phys); + + wed_w32(dev, MTK_WED_TX_BM_BUF_LEN, MTK_WED_PKT_SIZE); + +@@ -536,9 +890,9 @@ mtk_wed_hw_init(struct mtk_wed_device *d + wed_w32(dev, MTK_WED_TX_TKID_CTRL, + MTK_WED_TX_TKID_CTRL_PAUSE | + FIELD_PREP(MTK_WED_TX_TKID_CTRL_VLD_GRP_NUM, +- dev->buf_ring.size / 128) | ++ dev->tx_buf_ring.size / 128) | + FIELD_PREP(MTK_WED_TX_TKID_CTRL_RSV_GRP_NUM, +- dev->buf_ring.size / 128)); ++ dev->tx_buf_ring.size / 128)); + wed_w32(dev, MTK_WED_TX_TKID_DYN_THR, + FIELD_PREP(MTK_WED_TX_TKID_DYN_THR_LO, 0) | + MTK_WED_TX_TKID_DYN_THR_HI); +@@ -546,18 +900,28 @@ mtk_wed_hw_init(struct mtk_wed_device *d + + mtk_wed_reset(dev, MTK_WED_RESET_TX_BM); + +- if (dev->hw->version == 1) ++ if (dev->hw->version == 1) { + wed_set(dev, MTK_WED_CTRL, + MTK_WED_CTRL_WED_TX_BM_EN | + MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); +- else ++ } else { + wed_clr(dev, MTK_WED_TX_TKID_CTRL, MTK_WED_TX_TKID_CTRL_PAUSE); ++ /* rx hw init */ ++ wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, ++ MTK_WED_WPDMA_RX_D_RST_CRX_IDX | ++ MTK_WED_WPDMA_RX_D_RST_DRV_IDX); ++ wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, 0); ++ ++ mtk_wed_rx_buffer_hw_init(dev); ++ mtk_wed_rro_hw_init(dev); ++ mtk_wed_route_qm_hw_init(dev); ++ } + + wed_clr(dev, MTK_WED_TX_BM_CTRL, MTK_WED_TX_BM_CTRL_PAUSE); + } + + static void +-mtk_wed_ring_reset(struct mtk_wed_ring *ring, int size) ++mtk_wed_ring_reset(struct mtk_wed_ring *ring, int size, bool tx) + { + void *head = (void *)ring->desc; + int i; +@@ -567,7 +931,10 @@ mtk_wed_ring_reset(struct mtk_wed_ring * + + desc = (struct mtk_wdma_desc *)(head + i * ring->desc_size); + desc->buf0 = 0; +- desc->ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE); ++ if (tx) ++ desc->ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE); ++ else ++ desc->ctrl = cpu_to_le32(MTK_WFDMA_DESC_CTRL_TO_HOST); + desc->buf1 = 0; + desc->info = 0; + } +@@ -623,7 +990,8 @@ mtk_wed_reset_dma(struct mtk_wed_device + if (!dev->tx_ring[i].desc) + continue; + +- mtk_wed_ring_reset(&dev->tx_ring[i], MTK_WED_TX_RING_SIZE); ++ mtk_wed_ring_reset(&dev->tx_ring[i], MTK_WED_TX_RING_SIZE, ++ true); + } + + if (mtk_wed_poll_busy(dev)) +@@ -641,6 +1009,9 @@ mtk_wed_reset_dma(struct mtk_wed_device + wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX); + wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); + ++ if (mtk_wed_get_rx_capa(dev)) ++ mtk_wdma_rx_reset(dev); ++ + if (busy) { + mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT); + mtk_wed_reset(dev, MTK_WED_RESET_WDMA_RX_DRV); +@@ -675,12 +1046,11 @@ mtk_wed_reset_dma(struct mtk_wed_device + MTK_WED_WPDMA_RESET_IDX_RX); + wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0); + } +- + } + + static int + mtk_wed_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring, +- int size, u32 desc_size) ++ int size, u32 desc_size, bool tx) + { + ring->desc = dma_alloc_coherent(dev->hw->dev, size * desc_size, + &ring->desc_phys, GFP_KERNEL); +@@ -689,7 +1059,7 @@ mtk_wed_ring_alloc(struct mtk_wed_device + + ring->desc_size = desc_size; + ring->size = size; +- mtk_wed_ring_reset(ring, size); ++ mtk_wed_ring_reset(ring, size, tx); + + return 0; + } +@@ -698,9 +1068,14 @@ static int + mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size) + { + u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; +- struct mtk_wed_ring *wdma = &dev->rx_wdma[idx]; ++ struct mtk_wed_ring *wdma; + +- if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size)) ++ if (idx >= ARRAY_SIZE(dev->rx_wdma)) ++ return -EINVAL; ++ ++ wdma = &dev->rx_wdma[idx]; ++ if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size, ++ true)) + return -ENOMEM; + + wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE, +@@ -717,6 +1092,60 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_we + return 0; + } + ++static int ++mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) ++{ ++ u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; ++ struct mtk_wed_ring *wdma; ++ ++ if (idx >= ARRAY_SIZE(dev->tx_wdma)) ++ return -EINVAL; ++ ++ wdma = &dev->tx_wdma[idx]; ++ if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size, ++ true)) ++ return -ENOMEM; ++ ++ wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE, ++ wdma->desc_phys); ++ wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_COUNT, ++ size); ++ wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0); ++ wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0); ++ ++ if (!idx) { ++ wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_BASE, ++ wdma->desc_phys); ++ wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_COUNT, ++ size); ++ wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_CPU_IDX, ++ 0); ++ wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_DMA_IDX, ++ 0); ++ } ++ ++ return 0; ++} ++ ++static void ++mtk_wed_ppe_check(struct mtk_wed_device *dev, struct sk_buff *skb, ++ u32 reason, u32 hash) ++{ ++ struct mtk_eth *eth = dev->hw->eth; ++ struct ethhdr *eh; ++ ++ if (!skb) ++ return; ++ ++ if (reason != MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) ++ return; ++ ++ skb_set_mac_header(skb, 0); ++ eh = eth_hdr(skb); ++ skb->protocol = eh->h_proto; ++ mtk_ppe_check_skb(eth->ppe[dev->hw->index], skb, hash); ++} ++ + static void + mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask) + { +@@ -739,6 +1168,8 @@ mtk_wed_configure_irq(struct mtk_wed_dev + + wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask); + } else { ++ wdma_mask |= FIELD_PREP(MTK_WDMA_INT_MASK_TX_DONE, ++ GENMASK(1, 0)); + /* initail tx interrupt trigger */ + wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_TX, + MTK_WED_WPDMA_INT_CTRL_TX0_DONE_EN | +@@ -757,6 +1188,16 @@ mtk_wed_configure_irq(struct mtk_wed_dev + FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_TRIG, + dev->wlan.txfree_tbit)); + ++ wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_RX, ++ MTK_WED_WPDMA_INT_CTRL_RX0_EN | ++ MTK_WED_WPDMA_INT_CTRL_RX0_CLR | ++ MTK_WED_WPDMA_INT_CTRL_RX1_EN | ++ MTK_WED_WPDMA_INT_CTRL_RX1_CLR | ++ FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX0_DONE_TRIG, ++ dev->wlan.rx_tbit[0]) | ++ FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX1_DONE_TRIG, ++ dev->wlan.rx_tbit[1])); ++ + wed_w32(dev, MTK_WED_WDMA_INT_CLR, wdma_mask); + wed_set(dev, MTK_WED_WDMA_INT_CTRL, + FIELD_PREP(MTK_WED_WDMA_INT_CTRL_POLL_SRC_SEL, +@@ -794,9 +1235,15 @@ mtk_wed_dma_enable(struct mtk_wed_device + wdma_set(dev, MTK_WDMA_GLO_CFG, + MTK_WDMA_GLO_CFG_RX_INFO3_PRERES); + } else { ++ int i; ++ + wed_set(dev, MTK_WED_WPDMA_CTRL, + MTK_WED_WPDMA_CTRL_SDL1_FIXED); + ++ wed_set(dev, MTK_WED_WDMA_GLO_CFG, ++ MTK_WED_WDMA_GLO_CFG_TX_DRV_EN | ++ MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK); ++ + wed_set(dev, MTK_WED_WPDMA_GLO_CFG, + MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC | + MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC); +@@ -804,6 +1251,15 @@ mtk_wed_dma_enable(struct mtk_wed_device + wed_clr(dev, MTK_WED_WPDMA_GLO_CFG, + MTK_WED_WPDMA_GLO_CFG_TX_TKID_KEEP | + MTK_WED_WPDMA_GLO_CFG_TX_DMAD_DW3_PREV); ++ ++ wed_set(dev, MTK_WED_WPDMA_RX_D_GLO_CFG, ++ MTK_WED_WPDMA_RX_D_RX_DRV_EN | ++ FIELD_PREP(MTK_WED_WPDMA_RX_D_RXD_READ_LEN, 0x18) | ++ FIELD_PREP(MTK_WED_WPDMA_RX_D_INIT_PHASE_RXEN_SEL, ++ 0x2)); ++ ++ for (i = 0; i < MTK_WED_RX_QUEUES; i++) ++ mtk_wed_check_wfdma_rx_fill(dev, i); + } + } + +@@ -829,7 +1285,19 @@ mtk_wed_start(struct mtk_wed_device *dev + val |= BIT(0) | (BIT(1) * !!dev->hw->index); + regmap_write(dev->hw->mirror, dev->hw->index * 4, val); + } else { +- mtk_wed_set_512_support(dev, true); ++ /* driver set mid ready and only once */ ++ wed_w32(dev, MTK_WED_EXT_INT_MASK1, ++ MTK_WED_EXT_INT_STATUS_WPDMA_MID_RDY); ++ wed_w32(dev, MTK_WED_EXT_INT_MASK2, ++ MTK_WED_EXT_INT_STATUS_WPDMA_MID_RDY); ++ ++ wed_r32(dev, MTK_WED_EXT_INT_MASK1); ++ wed_r32(dev, MTK_WED_EXT_INT_MASK2); ++ ++ if (mtk_wed_rro_cfg(dev)) ++ return; ++ ++ mtk_wed_set_512_support(dev, dev->wlan.wcid_512); + } + + mtk_wed_dma_enable(dev); +@@ -863,7 +1331,7 @@ mtk_wed_attach(struct mtk_wed_device *de + if (!hw) { + module_put(THIS_MODULE); + ret = -ENODEV; +- goto out; ++ goto unlock; + } + + device = dev->wlan.bus_type == MTK_WED_BUS_PCIE +@@ -876,15 +1344,24 @@ mtk_wed_attach(struct mtk_wed_device *de + dev->dev = hw->dev; + dev->irq = hw->irq; + dev->wdma_idx = hw->index; ++ dev->version = hw->version; + + if (hw->eth->dma_dev == hw->eth->dev && + of_dma_is_coherent(hw->eth->dev->of_node)) + mtk_eth_set_dma_device(hw->eth, hw->dev); + +- ret = mtk_wed_buffer_alloc(dev); +- if (ret) { +- mtk_wed_detach(dev); ++ ret = mtk_wed_tx_buffer_alloc(dev); ++ if (ret) + goto out; ++ ++ if (mtk_wed_get_rx_capa(dev)) { ++ ret = mtk_wed_rx_buffer_alloc(dev); ++ if (ret) ++ goto out; ++ ++ ret = mtk_wed_rro_alloc(dev); ++ if (ret) ++ goto out; + } + + mtk_wed_hw_init_early(dev); +@@ -893,8 +1370,10 @@ mtk_wed_attach(struct mtk_wed_device *de + BIT(hw->index), 0); + else + ret = mtk_wed_wo_init(hw); +- + out: ++ if (ret) ++ mtk_wed_detach(dev); ++unlock: + mutex_unlock(&hw_lock); + + return ret; +@@ -917,10 +1396,11 @@ mtk_wed_tx_ring_setup(struct mtk_wed_dev + * WDMA RX. + */ + +- BUG_ON(idx >= ARRAY_SIZE(dev->tx_ring)); ++ if (WARN_ON(idx >= ARRAY_SIZE(dev->tx_ring))) ++ return -EINVAL; + + if (mtk_wed_ring_alloc(dev, ring, MTK_WED_TX_RING_SIZE, +- sizeof(*ring->desc))) ++ sizeof(*ring->desc), true)) + return -ENOMEM; + + if (mtk_wed_wdma_rx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) +@@ -967,6 +1447,37 @@ mtk_wed_txfree_ring_setup(struct mtk_wed + return 0; + } + ++static int ++mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs) ++{ ++ struct mtk_wed_ring *ring = &dev->rx_ring[idx]; ++ ++ if (WARN_ON(idx >= ARRAY_SIZE(dev->rx_ring))) ++ return -EINVAL; ++ ++ if (mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, ++ sizeof(*ring->desc), false)) ++ return -ENOMEM; ++ ++ if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) ++ return -ENOMEM; ++ ++ ring->reg_base = MTK_WED_RING_RX_DATA(idx); ++ ring->wpdma = regs; ++ ring->flags |= MTK_WED_RING_CONFIGURED; ++ ++ /* WPDMA -> WED */ ++ wpdma_rx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys); ++ wpdma_rx_w32(dev, idx, MTK_WED_RING_OFS_COUNT, MTK_WED_RX_RING_SIZE); ++ ++ wed_w32(dev, MTK_WED_WPDMA_RING_RX_DATA(idx) + MTK_WED_RING_OFS_BASE, ++ ring->desc_phys); ++ wed_w32(dev, MTK_WED_WPDMA_RING_RX_DATA(idx) + MTK_WED_RING_OFS_COUNT, ++ MTK_WED_RX_RING_SIZE); ++ ++ return 0; ++} ++ + static u32 + mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask) + { +@@ -1063,7 +1574,9 @@ void mtk_wed_add_hw(struct device_node * + static const struct mtk_wed_ops wed_ops = { + .attach = mtk_wed_attach, + .tx_ring_setup = mtk_wed_tx_ring_setup, ++ .rx_ring_setup = mtk_wed_rx_ring_setup, + .txfree_ring_setup = mtk_wed_txfree_ring_setup, ++ .msg_update = mtk_wed_mcu_msg_update, + .start = mtk_wed_start, + .stop = mtk_wed_stop, + .reset_dma = mtk_wed_reset_dma, +@@ -1072,6 +1585,7 @@ void mtk_wed_add_hw(struct device_node * + .irq_get = mtk_wed_irq_get, + .irq_set_mask = mtk_wed_irq_set_mask, + .detach = mtk_wed_detach, ++ .ppe_check = mtk_wed_ppe_check, + }; + struct device_node *eth_np = eth->dev->of_node; + struct platform_device *pdev; +--- a/drivers/net/ethernet/mediatek/mtk_wed.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed.h +@@ -87,6 +87,24 @@ wpdma_tx_w32(struct mtk_wed_device *dev, + } + + static inline u32 ++wpdma_rx_r32(struct mtk_wed_device *dev, int ring, u32 reg) ++{ ++ if (!dev->rx_ring[ring].wpdma) ++ return 0; ++ ++ return readl(dev->rx_ring[ring].wpdma + reg); ++} ++ ++static inline void ++wpdma_rx_w32(struct mtk_wed_device *dev, int ring, u32 reg, u32 val) ++{ ++ if (!dev->rx_ring[ring].wpdma) ++ return; ++ ++ writel(val, dev->rx_ring[ring].wpdma + reg); ++} ++ ++static inline u32 + wpdma_txfree_r32(struct mtk_wed_device *dev, u32 reg) + { + if (!dev->txfree_ring.wpdma) +@@ -128,6 +146,7 @@ static inline int mtk_wed_flow_add(int i + static inline void mtk_wed_flow_remove(int index) + { + } ++ + #endif + + #ifdef CONFIG_DEBUG_FS +--- a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + + #include "mtk_wed_regs.h" + #include "mtk_wed_wo.h" +@@ -60,24 +61,37 @@ void mtk_wed_mcu_rx_event(struct mtk_wed + wake_up(&wo->mcu.wait); + } + ++static void ++mtk_wed_update_rx_stats(struct mtk_wed_device *wed, struct sk_buff *skb) ++{ ++ u32 count = get_unaligned_le32(skb->data); ++ struct mtk_wed_wo_rx_stats *stats; ++ int i; ++ ++ if (count * sizeof(*stats) > skb->len - sizeof(u32)) ++ return; ++ ++ stats = (struct mtk_wed_wo_rx_stats *)(skb->data + sizeof(u32)); ++ for (i = 0 ; i < count ; i++) ++ wed->wlan.update_wo_rx_stats(wed, &stats[i]); ++} ++ + void mtk_wed_mcu_rx_unsolicited_event(struct mtk_wed_wo *wo, + struct sk_buff *skb) + { + struct mtk_wed_mcu_hdr *hdr = (struct mtk_wed_mcu_hdr *)skb->data; + +- switch (hdr->cmd) { +- case MTK_WED_WO_EVT_LOG_DUMP: { +- const char *msg = (const char *)(skb->data + sizeof(*hdr)); ++ skb_pull(skb, sizeof(*hdr)); + +- dev_notice(wo->hw->dev, "%s\n", msg); ++ switch (hdr->cmd) { ++ case MTK_WED_WO_EVT_LOG_DUMP: ++ dev_notice(wo->hw->dev, "%s\n", skb->data); + break; +- } + case MTK_WED_WO_EVT_PROFILING: { +- struct mtk_wed_wo_log_info *info; +- u32 count = (skb->len - sizeof(*hdr)) / sizeof(*info); ++ struct mtk_wed_wo_log_info *info = (void *)skb->data; ++ u32 count = skb->len / sizeof(*info); + int i; + +- info = (struct mtk_wed_wo_log_info *)(skb->data + sizeof(*hdr)); + for (i = 0 ; i < count ; i++) + dev_notice(wo->hw->dev, + "SN:%u latency: total=%u, rro:%u, mod:%u\n", +@@ -88,6 +102,7 @@ void mtk_wed_mcu_rx_unsolicited_event(st + break; + } + case MTK_WED_WO_EVT_RXCNT_INFO: ++ mtk_wed_update_rx_stats(wo->hw->wed_dev, skb); + break; + default: + break; +@@ -144,6 +159,8 @@ mtk_wed_mcu_parse_response(struct mtk_we + skb_pull(skb, sizeof(*hdr)); + switch (cmd) { + case MTK_WED_WO_CMD_RXCNT_INFO: ++ mtk_wed_update_rx_stats(wo->hw->wed_dev, skb); ++ break; + default: + break; + } +@@ -182,6 +199,18 @@ unlock: + return ret; + } + ++int mtk_wed_mcu_msg_update(struct mtk_wed_device *dev, int id, void *data, ++ int len) ++{ ++ struct mtk_wed_wo *wo = dev->hw->wed_wo; ++ ++ if (dev->hw->version == 1) ++ return 0; ++ ++ return mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, id, data, len, ++ true); ++} ++ + static int + mtk_wed_get_memory_region(struct mtk_wed_wo *wo, + struct mtk_wed_wo_memory_region *region) +--- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h +@@ -4,6 +4,7 @@ + #ifndef __MTK_WED_REGS_H + #define __MTK_WED_REGS_H + ++#define MTK_WFDMA_DESC_CTRL_TO_HOST BIT(8) + #define MTK_WDMA_DESC_CTRL_LEN1 GENMASK(14, 0) + #define MTK_WDMA_DESC_CTRL_LEN1_V2 GENMASK(13, 0) + #define MTK_WDMA_DESC_CTRL_LAST_SEG1 BIT(15) +@@ -28,6 +29,8 @@ struct mtk_wdma_desc { + #define MTK_WED_RESET_WED_TX_DMA BIT(12) + #define MTK_WED_RESET_WDMA_RX_DRV BIT(17) + #define MTK_WED_RESET_WDMA_INT_AGENT BIT(19) ++#define MTK_WED_RESET_RX_RRO_QM BIT(20) ++#define MTK_WED_RESET_RX_ROUTE_QM BIT(21) + #define MTK_WED_RESET_WED BIT(31) + + #define MTK_WED_CTRL 0x00c +@@ -39,8 +42,12 @@ struct mtk_wdma_desc { + #define MTK_WED_CTRL_WED_TX_BM_BUSY BIT(9) + #define MTK_WED_CTRL_WED_TX_FREE_AGENT_EN BIT(10) + #define MTK_WED_CTRL_WED_TX_FREE_AGENT_BUSY BIT(11) +-#define MTK_WED_CTRL_RESERVE_EN BIT(12) +-#define MTK_WED_CTRL_RESERVE_BUSY BIT(13) ++#define MTK_WED_CTRL_WED_RX_BM_EN BIT(12) ++#define MTK_WED_CTRL_WED_RX_BM_BUSY BIT(13) ++#define MTK_WED_CTRL_RX_RRO_QM_EN BIT(14) ++#define MTK_WED_CTRL_RX_RRO_QM_BUSY BIT(15) ++#define MTK_WED_CTRL_RX_ROUTE_QM_EN BIT(16) ++#define MTK_WED_CTRL_RX_ROUTE_QM_BUSY BIT(17) + #define MTK_WED_CTRL_FINAL_DIDX_READ BIT(24) + #define MTK_WED_CTRL_ETH_DMAD_FMT BIT(25) + #define MTK_WED_CTRL_MIB_READ_CLEAR BIT(28) +@@ -62,6 +69,9 @@ struct mtk_wdma_desc { + #define MTK_WED_EXT_INT_STATUS_TX_DMA_R_RESP_ERR BIT(22) + #define MTK_WED_EXT_INT_STATUS_TX_DMA_W_RESP_ERR BIT(23) + #define MTK_WED_EXT_INT_STATUS_RX_DRV_DMA_RECYCLE BIT(24) ++#define MTK_WED_EXT_INT_STATUS_RX_DRV_GET_BM_DMAD_SKIP BIT(25) ++#define MTK_WED_EXT_INT_STATUS_WPDMA_RX_D_DRV_ERR BIT(26) ++#define MTK_WED_EXT_INT_STATUS_WPDMA_MID_RDY BIT(27) + #define MTK_WED_EXT_INT_STATUS_ERROR_MASK (MTK_WED_EXT_INT_STATUS_TF_LEN_ERR | \ + MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD | \ + MTK_WED_EXT_INT_STATUS_TKID_TITO_INVALID | \ +@@ -71,6 +81,8 @@ struct mtk_wdma_desc { + MTK_WED_EXT_INT_STATUS_TX_DMA_R_RESP_ERR) + + #define MTK_WED_EXT_INT_MASK 0x028 ++#define MTK_WED_EXT_INT_MASK1 0x02c ++#define MTK_WED_EXT_INT_MASK2 0x030 + + #define MTK_WED_STATUS 0x060 + #define MTK_WED_STATUS_TX GENMASK(15, 8) +@@ -151,6 +163,7 @@ struct mtk_wdma_desc { + #define MTK_WED_RING_TX(_n) (0x300 + (_n) * 0x10) + + #define MTK_WED_RING_RX(_n) (0x400 + (_n) * 0x10) ++#define MTK_WED_RING_RX_DATA(_n) (0x420 + (_n) * 0x10) + + #define MTK_WED_SCR0 0x3c0 + #define MTK_WED_WPDMA_INT_TRIGGER 0x504 +@@ -213,6 +226,12 @@ struct mtk_wdma_desc { + #define MTK_WED_WPDMA_INT_CTRL_TX1_DONE_TRIG GENMASK(14, 10) + + #define MTK_WED_WPDMA_INT_CTRL_RX 0x534 ++#define MTK_WED_WPDMA_INT_CTRL_RX0_EN BIT(0) ++#define MTK_WED_WPDMA_INT_CTRL_RX0_CLR BIT(1) ++#define MTK_WED_WPDMA_INT_CTRL_RX0_DONE_TRIG GENMASK(6, 2) ++#define MTK_WED_WPDMA_INT_CTRL_RX1_EN BIT(8) ++#define MTK_WED_WPDMA_INT_CTRL_RX1_CLR BIT(9) ++#define MTK_WED_WPDMA_INT_CTRL_RX1_DONE_TRIG GENMASK(14, 10) + + #define MTK_WED_WPDMA_INT_CTRL_TX_FREE 0x538 + #define MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_EN BIT(0) +@@ -242,11 +261,34 @@ struct mtk_wdma_desc { + + #define MTK_WED_WPDMA_RING_TX(_n) (0x600 + (_n) * 0x10) + #define MTK_WED_WPDMA_RING_RX(_n) (0x700 + (_n) * 0x10) ++#define MTK_WED_WPDMA_RING_RX_DATA(_n) (0x730 + (_n) * 0x10) ++ ++#define MTK_WED_WPDMA_RX_D_GLO_CFG 0x75c ++#define MTK_WED_WPDMA_RX_D_RX_DRV_EN BIT(0) ++#define MTK_WED_WPDMA_RX_D_INIT_PHASE_RXEN_SEL GENMASK(11, 7) ++#define MTK_WED_WPDMA_RX_D_RXD_READ_LEN GENMASK(31, 24) ++ ++#define MTK_WED_WPDMA_RX_D_RST_IDX 0x760 ++#define MTK_WED_WPDMA_RX_D_RST_CRX_IDX GENMASK(17, 16) ++#define MTK_WED_WPDMA_RX_D_RST_DRV_IDX GENMASK(25, 24) ++ ++#define MTK_WED_WPDMA_RX_GLO_CFG 0x76c ++#define MTK_WED_WPDMA_RX_RING 0x770 ++ ++#define MTK_WED_WPDMA_RX_D_MIB(_n) (0x774 + (_n) * 4) ++#define MTK_WED_WPDMA_RX_D_PROCESSED_MIB(_n) (0x784 + (_n) * 4) ++#define MTK_WED_WPDMA_RX_D_COHERENT_MIB 0x78c ++ ++#define MTK_WED_WDMA_RING_TX 0x800 ++ ++#define MTK_WED_WDMA_TX_MIB 0x810 ++ + #define MTK_WED_WDMA_RING_RX(_n) (0x900 + (_n) * 0x10) + #define MTK_WED_WDMA_RX_THRES(_n) (0x940 + (_n) * 0x4) + + #define MTK_WED_WDMA_GLO_CFG 0xa04 + #define MTK_WED_WDMA_GLO_CFG_TX_DRV_EN BIT(0) ++#define MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK BIT(1) + #define MTK_WED_WDMA_GLO_CFG_RX_DRV_EN BIT(2) + #define MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY BIT(3) + #define MTK_WED_WDMA_GLO_CFG_BT_SIZE GENMASK(5, 4) +@@ -291,6 +333,20 @@ struct mtk_wdma_desc { + #define MTK_WED_WDMA_RX_RECYCLE_MIB(_n) (0xae8 + (_n) * 4) + #define MTK_WED_WDMA_RX_PROCESSED_MIB(_n) (0xaf0 + (_n) * 4) + ++#define MTK_WED_RX_BM_RX_DMAD 0xd80 ++#define MTK_WED_RX_BM_RX_DMAD_SDL0 GENMASK(13, 0) ++ ++#define MTK_WED_RX_BM_BASE 0xd84 ++#define MTK_WED_RX_BM_INIT_PTR 0xd88 ++#define MTK_WED_RX_BM_SW_TAIL GENMASK(15, 0) ++#define MTK_WED_RX_BM_INIT_SW_TAIL BIT(16) ++ ++#define MTK_WED_RX_PTR 0xd8c ++ ++#define MTK_WED_RX_BM_DYN_ALLOC_TH 0xdb4 ++#define MTK_WED_RX_BM_DYN_ALLOC_TH_H GENMASK(31, 16) ++#define MTK_WED_RX_BM_DYN_ALLOC_TH_L GENMASK(15, 0) ++ + #define MTK_WED_RING_OFS_BASE 0x00 + #define MTK_WED_RING_OFS_COUNT 0x04 + #define MTK_WED_RING_OFS_CPU_IDX 0x08 +@@ -301,7 +357,9 @@ struct mtk_wdma_desc { + + #define MTK_WDMA_GLO_CFG 0x204 + #define MTK_WDMA_GLO_CFG_TX_DMA_EN BIT(0) ++#define MTK_WDMA_GLO_CFG_TX_DMA_BUSY BIT(1) + #define MTK_WDMA_GLO_CFG_RX_DMA_EN BIT(2) ++#define MTK_WDMA_GLO_CFG_RX_DMA_BUSY BIT(3) + #define MTK_WDMA_GLO_CFG_RX_INFO3_PRERES BIT(26) + #define MTK_WDMA_GLO_CFG_RX_INFO2_PRERES BIT(27) + #define MTK_WDMA_GLO_CFG_RX_INFO1_PRERES BIT(28) +@@ -330,4 +388,70 @@ struct mtk_wdma_desc { + /* DMA channel mapping */ + #define HIFSYS_DMA_AG_MAP 0x008 + ++#define MTK_WED_RTQM_GLO_CFG 0xb00 ++#define MTK_WED_RTQM_BUSY BIT(1) ++#define MTK_WED_RTQM_Q_RST BIT(2) ++#define MTK_WED_RTQM_Q_DBG_BYPASS BIT(5) ++#define MTK_WED_RTQM_TXDMAD_FPORT GENMASK(23, 20) ++ ++#define MTK_WED_RTQM_R2H_MIB(_n) (0xb70 + (_n) * 0x4) ++#define MTK_WED_RTQM_R2Q_MIB(_n) (0xb78 + (_n) * 0x4) ++#define MTK_WED_RTQM_Q2N_MIB 0xb80 ++#define MTK_WED_RTQM_Q2H_MIB(_n) (0xb84 + (_n) * 0x4) ++ ++#define MTK_WED_RTQM_Q2B_MIB 0xb8c ++#define MTK_WED_RTQM_PFDBK_MIB 0xb90 ++ ++#define MTK_WED_RROQM_GLO_CFG 0xc04 ++#define MTK_WED_RROQM_RST_IDX 0xc08 ++#define MTK_WED_RROQM_RST_IDX_MIOD BIT(0) ++#define MTK_WED_RROQM_RST_IDX_FDBK BIT(4) ++ ++#define MTK_WED_RROQM_MIOD_CTRL0 0xc40 ++#define MTK_WED_RROQM_MIOD_CTRL1 0xc44 ++#define MTK_WED_RROQM_MIOD_CNT GENMASK(11, 0) ++ ++#define MTK_WED_RROQM_MIOD_CTRL2 0xc48 ++#define MTK_WED_RROQM_MIOD_CTRL3 0xc4c ++ ++#define MTK_WED_RROQM_FDBK_CTRL0 0xc50 ++#define MTK_WED_RROQM_FDBK_CTRL1 0xc54 ++#define MTK_WED_RROQM_FDBK_CNT GENMASK(11, 0) ++ ++#define MTK_WED_RROQM_FDBK_CTRL2 0xc58 ++ ++#define MTK_WED_RROQ_BASE_L 0xc80 ++#define MTK_WED_RROQ_BASE_H 0xc84 ++ ++#define MTK_WED_RROQM_MIOD_CFG 0xc8c ++#define MTK_WED_RROQM_MIOD_MID_DW GENMASK(5, 0) ++#define MTK_WED_RROQM_MIOD_MOD_DW GENMASK(13, 8) ++#define MTK_WED_RROQM_MIOD_ENTRY_DW GENMASK(22, 16) ++ ++#define MTK_WED_RROQM_MID_MIB 0xcc0 ++#define MTK_WED_RROQM_MOD_MIB 0xcc4 ++#define MTK_WED_RROQM_MOD_COHERENT_MIB 0xcc8 ++#define MTK_WED_RROQM_FDBK_MIB 0xcd0 ++#define MTK_WED_RROQM_FDBK_COHERENT_MIB 0xcd4 ++#define MTK_WED_RROQM_FDBK_IND_MIB 0xce0 ++#define MTK_WED_RROQM_FDBK_ENQ_MIB 0xce4 ++#define MTK_WED_RROQM_FDBK_ANC_MIB 0xce8 ++#define MTK_WED_RROQM_FDBK_ANC2H_MIB 0xcec ++ ++#define MTK_WED_RX_BM_RX_DMAD 0xd80 ++#define MTK_WED_RX_BM_BASE 0xd84 ++#define MTK_WED_RX_BM_INIT_PTR 0xd88 ++#define MTK_WED_RX_BM_PTR 0xd8c ++#define MTK_WED_RX_BM_PTR_HEAD GENMASK(32, 16) ++#define MTK_WED_RX_BM_PTR_TAIL GENMASK(15, 0) ++ ++#define MTK_WED_RX_BM_BLEN 0xd90 ++#define MTK_WED_RX_BM_STS 0xd94 ++#define MTK_WED_RX_BM_INTF2 0xd98 ++#define MTK_WED_RX_BM_INTF 0xd9c ++#define MTK_WED_RX_BM_ERR_STS 0xda8 ++ ++#define MTK_WED_WOCPU_VIEW_MIOD_BASE 0x8000 ++#define MTK_WED_PCIE_INT_MASK 0x0 ++ + #endif +--- a/drivers/net/ethernet/mediatek/mtk_wed_wo.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.h +@@ -49,6 +49,10 @@ enum { + MTK_WED_WARP_CMD_FLAG_FROM_TO_WO = BIT(2), + }; + ++#define MTK_WED_WO_CPU_MCUSYS_RESET_ADDR 0x15194050 ++#define MTK_WED_WO_CPU_WO0_MCUSYS_RESET_MASK 0x20 ++#define MTK_WED_WO_CPU_WO1_MCUSYS_RESET_MASK 0x1 ++ + enum { + MTK_WED_WO_REGION_EMI, + MTK_WED_WO_REGION_ILM, +@@ -57,6 +61,28 @@ enum { + __MTK_WED_WO_REGION_MAX, + }; + ++enum mtk_wed_wo_state { ++ MTK_WED_WO_STATE_UNDEFINED, ++ MTK_WED_WO_STATE_INIT, ++ MTK_WED_WO_STATE_ENABLE, ++ MTK_WED_WO_STATE_DISABLE, ++ MTK_WED_WO_STATE_HALT, ++ MTK_WED_WO_STATE_GATING, ++ MTK_WED_WO_STATE_SER_RESET, ++ MTK_WED_WO_STATE_WF_RESET, ++}; ++ ++enum mtk_wed_wo_done_state { ++ MTK_WED_WOIF_UNDEFINED, ++ MTK_WED_WOIF_DISABLE_DONE, ++ MTK_WED_WOIF_TRIGGER_ENABLE, ++ MTK_WED_WOIF_ENABLE_DONE, ++ MTK_WED_WOIF_TRIGGER_GATING, ++ MTK_WED_WOIF_GATING_DONE, ++ MTK_WED_WOIF_TRIGGER_HALT, ++ MTK_WED_WOIF_HALT_DONE, ++}; ++ + enum mtk_wed_dummy_cr_idx { + MTK_WED_DUMMY_CR_FWDL, + MTK_WED_DUMMY_CR_WO_STATUS, +@@ -245,6 +271,8 @@ void mtk_wed_mcu_rx_unsolicited_event(st + struct sk_buff *skb); + int mtk_wed_mcu_send_msg(struct mtk_wed_wo *wo, int id, int cmd, + const void *data, int len, bool wait_resp); ++int mtk_wed_mcu_msg_update(struct mtk_wed_device *dev, int id, void *data, ++ int len); + int mtk_wed_mcu_init(struct mtk_wed_wo *wo); + int mtk_wed_wo_init(struct mtk_wed_hw *hw); + void mtk_wed_wo_deinit(struct mtk_wed_hw *hw); +--- a/include/linux/soc/mediatek/mtk_wed.h ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -5,10 +5,13 @@ + #include + #include + #include ++#include + + #define MTK_WED_TX_QUEUES 2 + #define MTK_WED_RX_QUEUES 2 + ++#define WED_WO_STA_REC 0x6 ++ + struct mtk_wed_hw; + struct mtk_wdma_desc; + +@@ -41,21 +44,37 @@ enum mtk_wed_wo_cmd { + MTK_WED_WO_CMD_WED_END + }; + ++struct mtk_rxbm_desc { ++ __le32 buf0; ++ __le32 token; ++} __packed __aligned(4); ++ + enum mtk_wed_bus_tye { + MTK_WED_BUS_PCIE, + MTK_WED_BUS_AXI, + }; + ++#define MTK_WED_RING_CONFIGURED BIT(0) + struct mtk_wed_ring { + struct mtk_wdma_desc *desc; + dma_addr_t desc_phys; + u32 desc_size; + int size; ++ u32 flags; + + u32 reg_base; + void __iomem *wpdma; + }; + ++struct mtk_wed_wo_rx_stats { ++ __le16 wlan_idx; ++ __le16 tid; ++ __le32 rx_pkt_cnt; ++ __le32 rx_byte_cnt; ++ __le32 rx_err_cnt; ++ __le32 rx_drop_cnt; ++}; ++ + struct mtk_wed_device { + #ifdef CONFIG_NET_MEDIATEK_SOC_WED + const struct mtk_wed_ops *ops; +@@ -64,9 +83,12 @@ struct mtk_wed_device { + bool init_done, running; + int wdma_idx; + int irq; ++ u8 version; + + struct mtk_wed_ring tx_ring[MTK_WED_TX_QUEUES]; ++ struct mtk_wed_ring rx_ring[MTK_WED_RX_QUEUES]; + struct mtk_wed_ring txfree_ring; ++ struct mtk_wed_ring tx_wdma[MTK_WED_TX_QUEUES]; + struct mtk_wed_ring rx_wdma[MTK_WED_RX_QUEUES]; + + struct { +@@ -74,7 +96,20 @@ struct mtk_wed_device { + void **pages; + struct mtk_wdma_desc *desc; + dma_addr_t desc_phys; +- } buf_ring; ++ } tx_buf_ring; ++ ++ struct { ++ int size; ++ struct page_frag_cache rx_page; ++ struct mtk_rxbm_desc *desc; ++ dma_addr_t desc_phys; ++ } rx_buf_ring; ++ ++ struct { ++ struct mtk_wed_ring ring; ++ dma_addr_t miod_phys; ++ dma_addr_t fdbk_phys; ++ } rro; + + /* filled by driver: */ + struct { +@@ -83,22 +118,36 @@ struct mtk_wed_device { + struct pci_dev *pci_dev; + }; + enum mtk_wed_bus_tye bus_type; ++ void __iomem *base; ++ u32 phy_base; + + u32 wpdma_phys; + u32 wpdma_int; + u32 wpdma_mask; + u32 wpdma_tx; + u32 wpdma_txfree; ++ u32 wpdma_rx_glo; ++ u32 wpdma_rx; ++ ++ bool wcid_512; + + u16 token_start; + unsigned int nbuf; ++ unsigned int rx_nbuf; ++ unsigned int rx_npkt; ++ unsigned int rx_size; + + u8 tx_tbit[MTK_WED_TX_QUEUES]; ++ u8 rx_tbit[MTK_WED_RX_QUEUES]; + u8 txfree_tbit; + + u32 (*init_buf)(void *ptr, dma_addr_t phys, int token_id); + int (*offload_enable)(struct mtk_wed_device *wed); + void (*offload_disable)(struct mtk_wed_device *wed); ++ u32 (*init_rx_buf)(struct mtk_wed_device *wed, int size); ++ void (*release_rx_buf)(struct mtk_wed_device *wed); ++ void (*update_wo_rx_stats)(struct mtk_wed_device *wed, ++ struct mtk_wed_wo_rx_stats *stats); + } wlan; + #endif + }; +@@ -107,9 +156,15 @@ struct mtk_wed_ops { + int (*attach)(struct mtk_wed_device *dev); + int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring, + void __iomem *regs); ++ int (*rx_ring_setup)(struct mtk_wed_device *dev, int ring, ++ void __iomem *regs); + int (*txfree_ring_setup)(struct mtk_wed_device *dev, + void __iomem *regs); ++ int (*msg_update)(struct mtk_wed_device *dev, int cmd_id, ++ void *data, int len); + void (*detach)(struct mtk_wed_device *dev); ++ void (*ppe_check)(struct mtk_wed_device *dev, struct sk_buff *skb, ++ u32 reason, u32 hash); + + void (*stop)(struct mtk_wed_device *dev); + void (*start)(struct mtk_wed_device *dev, u32 irq_mask); +@@ -144,6 +199,16 @@ mtk_wed_device_attach(struct mtk_wed_dev + return ret; + } + ++static inline bool ++mtk_wed_get_rx_capa(struct mtk_wed_device *dev) ++{ ++#ifdef CONFIG_NET_MEDIATEK_SOC_WED ++ return dev->version != 1; ++#else ++ return false; ++#endif ++} ++ + #ifdef CONFIG_NET_MEDIATEK_SOC_WED + #define mtk_wed_device_active(_dev) !!(_dev)->ops + #define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev) +@@ -160,6 +225,12 @@ mtk_wed_device_attach(struct mtk_wed_dev + (_dev)->ops->irq_get(_dev, _mask) + #define mtk_wed_device_irq_set_mask(_dev, _mask) \ + (_dev)->ops->irq_set_mask(_dev, _mask) ++#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) \ ++ (_dev)->ops->rx_ring_setup(_dev, _ring, _regs) ++#define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) \ ++ (_dev)->ops->ppe_check(_dev, _skb, _reason, _hash) ++#define mtk_wed_device_update_msg(_dev, _id, _msg, _len) \ ++ (_dev)->ops->msg_update(_dev, _id, _msg, _len) + #else + static inline bool mtk_wed_device_active(struct mtk_wed_device *dev) + { +@@ -173,6 +244,9 @@ static inline bool mtk_wed_device_active + #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0) + #define mtk_wed_device_irq_get(_dev, _mask) 0 + #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0) ++#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) -ENODEV ++#define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) do {} while (0) ++#define mtk_wed_device_update_msg(_dev, _id, _msg, _len) -ENODEV + #endif + + #endif diff --git a/target/linux/generic/backport-5.15/729-05-v6.1-net-ethernet-mtk_wed-add-rx-mib-counters.patch b/target/linux/generic/backport-5.15/729-05-v6.1-net-ethernet-mtk_wed-add-rx-mib-counters.patch new file mode 100644 index 0000000000..bb1066dece --- /dev/null +++ b/target/linux/generic/backport-5.15/729-05-v6.1-net-ethernet-mtk_wed-add-rx-mib-counters.patch @@ -0,0 +1,149 @@ +From: Lorenzo Bianconi +Date: Sat, 5 Nov 2022 23:36:22 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: add rx mib counters + +Introduce WED RX MIB counters support available on MT7986a SoC. + +Tested-by: Daniel Golle +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed_debugfs.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed_debugfs.c +@@ -2,6 +2,7 @@ + /* Copyright (C) 2021 Felix Fietkau */ + + #include ++#include + #include "mtk_wed.h" + #include "mtk_wed_regs.h" + +@@ -18,6 +19,8 @@ enum { + DUMP_TYPE_WDMA, + DUMP_TYPE_WPDMA_TX, + DUMP_TYPE_WPDMA_TXFREE, ++ DUMP_TYPE_WPDMA_RX, ++ DUMP_TYPE_WED_RRO, + }; + + #define DUMP_STR(_str) { _str, 0, DUMP_TYPE_STRING } +@@ -36,6 +39,9 @@ enum { + + #define DUMP_WPDMA_TX_RING(_n) DUMP_RING("WPDMA_TX" #_n, 0, DUMP_TYPE_WPDMA_TX, _n) + #define DUMP_WPDMA_TXFREE_RING DUMP_RING("WPDMA_RX1", 0, DUMP_TYPE_WPDMA_TXFREE) ++#define DUMP_WPDMA_RX_RING(_n) DUMP_RING("WPDMA_RX" #_n, 0, DUMP_TYPE_WPDMA_RX, _n) ++#define DUMP_WED_RRO_RING(_base)DUMP_RING("WED_RRO_MIOD", MTK_##_base, DUMP_TYPE_WED_RRO) ++#define DUMP_WED_RRO_FDBK(_base)DUMP_RING("WED_RRO_FDBK", MTK_##_base, DUMP_TYPE_WED_RRO) + + static void + print_reg_val(struct seq_file *s, const char *name, u32 val) +@@ -57,6 +63,7 @@ dump_wed_regs(struct seq_file *s, struct + cur > regs ? "\n" : "", + cur->name); + continue; ++ case DUMP_TYPE_WED_RRO: + case DUMP_TYPE_WED: + val = wed_r32(dev, cur->offset); + break; +@@ -69,6 +76,9 @@ dump_wed_regs(struct seq_file *s, struct + case DUMP_TYPE_WPDMA_TXFREE: + val = wpdma_txfree_r32(dev, cur->offset); + break; ++ case DUMP_TYPE_WPDMA_RX: ++ val = wpdma_rx_r32(dev, cur->base, cur->offset); ++ break; + } + print_reg_val(s, cur->name, val); + } +@@ -132,6 +142,80 @@ wed_txinfo_show(struct seq_file *s, void + } + DEFINE_SHOW_ATTRIBUTE(wed_txinfo); + ++static int ++wed_rxinfo_show(struct seq_file *s, void *data) ++{ ++ static const struct reg_dump regs[] = { ++ DUMP_STR("WPDMA RX"), ++ DUMP_WPDMA_RX_RING(0), ++ DUMP_WPDMA_RX_RING(1), ++ ++ DUMP_STR("WPDMA RX"), ++ DUMP_WED(WED_WPDMA_RX_D_MIB(0)), ++ DUMP_WED_RING(WED_WPDMA_RING_RX_DATA(0)), ++ DUMP_WED(WED_WPDMA_RX_D_PROCESSED_MIB(0)), ++ DUMP_WED(WED_WPDMA_RX_D_MIB(1)), ++ DUMP_WED_RING(WED_WPDMA_RING_RX_DATA(1)), ++ DUMP_WED(WED_WPDMA_RX_D_PROCESSED_MIB(1)), ++ DUMP_WED(WED_WPDMA_RX_D_COHERENT_MIB), ++ ++ DUMP_STR("WED RX"), ++ DUMP_WED_RING(WED_RING_RX_DATA(0)), ++ DUMP_WED_RING(WED_RING_RX_DATA(1)), ++ ++ DUMP_STR("WED RRO"), ++ DUMP_WED_RRO_RING(WED_RROQM_MIOD_CTRL0), ++ DUMP_WED(WED_RROQM_MID_MIB), ++ DUMP_WED(WED_RROQM_MOD_MIB), ++ DUMP_WED(WED_RROQM_MOD_COHERENT_MIB), ++ DUMP_WED_RRO_FDBK(WED_RROQM_FDBK_CTRL0), ++ DUMP_WED(WED_RROQM_FDBK_IND_MIB), ++ DUMP_WED(WED_RROQM_FDBK_ENQ_MIB), ++ DUMP_WED(WED_RROQM_FDBK_ANC_MIB), ++ DUMP_WED(WED_RROQM_FDBK_ANC2H_MIB), ++ ++ DUMP_STR("WED Route QM"), ++ DUMP_WED(WED_RTQM_R2H_MIB(0)), ++ DUMP_WED(WED_RTQM_R2Q_MIB(0)), ++ DUMP_WED(WED_RTQM_Q2H_MIB(0)), ++ DUMP_WED(WED_RTQM_R2H_MIB(1)), ++ DUMP_WED(WED_RTQM_R2Q_MIB(1)), ++ DUMP_WED(WED_RTQM_Q2H_MIB(1)), ++ DUMP_WED(WED_RTQM_Q2N_MIB), ++ DUMP_WED(WED_RTQM_Q2B_MIB), ++ DUMP_WED(WED_RTQM_PFDBK_MIB), ++ ++ DUMP_STR("WED WDMA TX"), ++ DUMP_WED(WED_WDMA_TX_MIB), ++ DUMP_WED_RING(WED_WDMA_RING_TX), ++ ++ DUMP_STR("WDMA TX"), ++ DUMP_WDMA(WDMA_GLO_CFG), ++ DUMP_WDMA_RING(WDMA_RING_TX(0)), ++ DUMP_WDMA_RING(WDMA_RING_TX(1)), ++ ++ DUMP_STR("WED RX BM"), ++ DUMP_WED(WED_RX_BM_BASE), ++ DUMP_WED(WED_RX_BM_RX_DMAD), ++ DUMP_WED(WED_RX_BM_PTR), ++ DUMP_WED(WED_RX_BM_TKID_MIB), ++ DUMP_WED(WED_RX_BM_BLEN), ++ DUMP_WED(WED_RX_BM_STS), ++ DUMP_WED(WED_RX_BM_INTF2), ++ DUMP_WED(WED_RX_BM_INTF), ++ DUMP_WED(WED_RX_BM_ERR_STS), ++ }; ++ struct mtk_wed_hw *hw = s->private; ++ struct mtk_wed_device *dev = hw->wed_dev; ++ ++ if (!dev) ++ return 0; ++ ++ dump_wed_regs(s, dev, regs, ARRAY_SIZE(regs)); ++ ++ return 0; ++} ++DEFINE_SHOW_ATTRIBUTE(wed_rxinfo); + + static int + mtk_wed_reg_set(void *data, u64 val) +@@ -175,4 +259,7 @@ void mtk_wed_hw_add_debugfs(struct mtk_w + debugfs_create_u32("regidx", 0600, dir, &hw->debugfs_reg); + debugfs_create_file_unsafe("regval", 0600, dir, hw, &fops_regval); + debugfs_create_file_unsafe("txinfo", 0400, dir, hw, &wed_txinfo_fops); ++ if (hw->version != 1) ++ debugfs_create_file_unsafe("rxinfo", 0400, dir, hw, ++ &wed_rxinfo_fops); + } diff --git a/target/linux/generic/backport-5.15/729-06-v6.1-net-ethernet-mtk_eth_soc-do-not-overwrite-mtu-config.patch b/target/linux/generic/backport-5.15/729-06-v6.1-net-ethernet-mtk_eth_soc-do-not-overwrite-mtu-config.patch new file mode 100644 index 0000000000..9206be370f --- /dev/null +++ b/target/linux/generic/backport-5.15/729-06-v6.1-net-ethernet-mtk_eth_soc-do-not-overwrite-mtu-config.patch @@ -0,0 +1,98 @@ +From: Lorenzo Bianconi +Date: Thu, 17 Nov 2022 00:35:04 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: do not overwrite mtu + configuration running reset routine + +Restore user configured MTU running mtk_hw_init() during tx timeout routine +since it will be overwritten after a hw reset. + +Reported-by: Felix Fietkau +Fixes: 9ea4d311509f ("net: ethernet: mediatek: add the whole ethernet reset into the reset process") +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3179,6 +3179,30 @@ static void mtk_dim_tx(struct work_struc + dim->state = DIM_START_MEASURE; + } + ++static void mtk_set_mcr_max_rx(struct mtk_mac *mac, u32 val) ++{ ++ struct mtk_eth *eth = mac->hw; ++ u32 mcr_cur, mcr_new; ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) ++ return; ++ ++ mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); ++ mcr_new = mcr_cur & ~MAC_MCR_MAX_RX_MASK; ++ ++ if (val <= 1518) ++ mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1518); ++ else if (val <= 1536) ++ mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1536); ++ else if (val <= 1552) ++ mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1552); ++ else ++ mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_2048); ++ ++ if (mcr_new != mcr_cur) ++ mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); ++} ++ + static int mtk_hw_init(struct mtk_eth *eth) + { + u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA | +@@ -3253,8 +3277,16 @@ static int mtk_hw_init(struct mtk_eth *e + * up with the more appropriate value when mtk_mac_config call is being + * invoked. + */ +- for (i = 0; i < MTK_MAC_COUNT; i++) ++ for (i = 0; i < MTK_MAC_COUNT; i++) { ++ struct net_device *dev = eth->netdev[i]; ++ + mtk_w32(eth, MAC_MCR_FORCE_LINK_DOWN, MTK_MAC_MCR(i)); ++ if (dev) { ++ struct mtk_mac *mac = netdev_priv(dev); ++ ++ mtk_set_mcr_max_rx(mac, dev->mtu + MTK_RX_ETH_HLEN); ++ } ++ } + + /* Indicates CDM to parse the MTK special tag from CPU + * which also is working out for untag packets. +@@ -3353,7 +3385,6 @@ static int mtk_change_mtu(struct net_dev + int length = new_mtu + MTK_RX_ETH_HLEN; + struct mtk_mac *mac = netdev_priv(dev); + struct mtk_eth *eth = mac->hw; +- u32 mcr_cur, mcr_new; + + if (rcu_access_pointer(eth->prog) && + length > MTK_PP_MAX_BUF_SIZE) { +@@ -3361,23 +3392,7 @@ static int mtk_change_mtu(struct net_dev + return -EINVAL; + } + +- if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) { +- mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); +- mcr_new = mcr_cur & ~MAC_MCR_MAX_RX_MASK; +- +- if (length <= 1518) +- mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1518); +- else if (length <= 1536) +- mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1536); +- else if (length <= 1552) +- mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1552); +- else +- mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_2048); +- +- if (mcr_new != mcr_cur) +- mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); +- } +- ++ mtk_set_mcr_max_rx(mac, length); + dev->mtu = new_mtu; + + return 0; diff --git a/target/linux/generic/backport-5.15/729-07-v6.1-net-ethernet-mtk_eth_soc-remove-cpu_relax-in-mtk_pen.patch b/target/linux/generic/backport-5.15/729-07-v6.1-net-ethernet-mtk_eth_soc-remove-cpu_relax-in-mtk_pen.patch new file mode 100644 index 0000000000..063415c618 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-07-v6.1-net-ethernet-mtk_eth_soc-remove-cpu_relax-in-mtk_pen.patch @@ -0,0 +1,36 @@ +From: Lorenzo Bianconi +Date: Thu, 17 Nov 2022 00:58:46 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: remove cpu_relax in + mtk_pending_work + +Get rid of cpu_relax in mtk_pending_work routine since MTK_RESETTING is +set only in mtk_pending_work() and it runs holding rtnl lock + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3423,11 +3423,8 @@ static void mtk_pending_work(struct work + rtnl_lock(); + + dev_dbg(eth->dev, "[%s][%d] reset\n", __func__, __LINE__); ++ set_bit(MTK_RESETTING, ð->state); + +- while (test_and_set_bit_lock(MTK_RESETTING, ð->state)) +- cpu_relax(); +- +- dev_dbg(eth->dev, "[%s][%d] mtk_stop starts\n", __func__, __LINE__); + /* stop all devices to make sure that dma is properly shut down */ + for (i = 0; i < MTK_MAC_COUNT; i++) { + if (!eth->netdev[i]) +@@ -3461,7 +3458,7 @@ static void mtk_pending_work(struct work + + dev_dbg(eth->dev, "[%s][%d] reset done\n", __func__, __LINE__); + +- clear_bit_unlock(MTK_RESETTING, ð->state); ++ clear_bit(MTK_RESETTING, ð->state); + + rtnl_unlock(); + } diff --git a/target/linux/generic/backport-5.15/729-08-v6.2-net-ethernet-mtk_eth_soc-fix-RSTCTRL_PPE-0-1-definit.patch b/target/linux/generic/backport-5.15/729-08-v6.2-net-ethernet-mtk_eth_soc-fix-RSTCTRL_PPE-0-1-definit.patch new file mode 100644 index 0000000000..30be5b392b --- /dev/null +++ b/target/linux/generic/backport-5.15/729-08-v6.2-net-ethernet-mtk_eth_soc-fix-RSTCTRL_PPE-0-1-definit.patch @@ -0,0 +1,63 @@ +From: Lorenzo Bianconi +Date: Thu, 17 Nov 2022 15:29:53 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix RSTCTRL_PPE{0,1} definitions + +Fix RSTCTRL_PPE0 and RSTCTRL_PPE1 register mask definitions for +MTK_NETSYS_V2. +Remove duplicated definitions. + +Fixes: 160d3a9b1929 ("net: ethernet: mtk_eth_soc: introduce MTK_NETSYS_V2 support") +Signed-off-by: Lorenzo Bianconi +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3242,16 +3242,17 @@ static int mtk_hw_init(struct mtk_eth *e + return 0; + } + +- val = RSTCTRL_FE | RSTCTRL_PPE; + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { + regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, 0); +- +- val |= RSTCTRL_ETH; +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) +- val |= RSTCTRL_PPE1; ++ val = RSTCTRL_PPE0_V2; ++ } else { ++ val = RSTCTRL_PPE0; + } + +- ethsys_reset(eth, val); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ val |= RSTCTRL_PPE1; ++ ++ ethsys_reset(eth, RSTCTRL_ETH | RSTCTRL_FE | val); + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { + regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -445,18 +445,14 @@ + /* ethernet reset control register */ + #define ETHSYS_RSTCTRL 0x34 + #define RSTCTRL_FE BIT(6) +-#define RSTCTRL_PPE BIT(31) +-#define RSTCTRL_PPE1 BIT(30) ++#define RSTCTRL_PPE0 BIT(31) ++#define RSTCTRL_PPE0_V2 BIT(30) ++#define RSTCTRL_PPE1 BIT(31) + #define RSTCTRL_ETH BIT(23) + + /* ethernet reset check idle register */ + #define ETHSYS_FE_RST_CHK_IDLE_EN 0x28 + +-/* ethernet reset control register */ +-#define ETHSYS_RSTCTRL 0x34 +-#define RSTCTRL_FE BIT(6) +-#define RSTCTRL_PPE BIT(31) +- + /* ethernet dma channel agent map */ + #define ETHSYS_DMA_AG_MAP 0x408 + #define ETHSYS_DMA_AG_MAP_PDMA BIT(0) diff --git a/target/linux/generic/backport-5.15/729-09-v6.2-net-ethernet-mtk_wed-add-wcid-overwritten-support-fo.patch b/target/linux/generic/backport-5.15/729-09-v6.2-net-ethernet-mtk_wed-add-wcid-overwritten-support-fo.patch new file mode 100644 index 0000000000..d91d829911 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-09-v6.2-net-ethernet-mtk_wed-add-wcid-overwritten-support-fo.patch @@ -0,0 +1,80 @@ +From: Sujuan Chen +Date: Thu, 24 Nov 2022 11:18:14 +0800 +Subject: [PATCH] net: ethernet: mtk_wed: add wcid overwritten support for wed + v1 + +All wed versions should enable the wcid overwritten feature, +since the wcid size is controlled by the wlan driver. + +Tested-by: Sujuan Chen +Co-developed-by: Bo Jiao +Signed-off-by: Bo Jiao +Signed-off-by: Sujuan Chen +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -526,9 +526,9 @@ mtk_wed_dma_disable(struct mtk_wed_devic + MTK_WED_WPDMA_RX_D_RX_DRV_EN); + wed_clr(dev, MTK_WED_WDMA_GLO_CFG, + MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK); +- +- mtk_wed_set_512_support(dev, false); + } ++ ++ mtk_wed_set_512_support(dev, false); + } + + static void +@@ -1297,9 +1297,10 @@ mtk_wed_start(struct mtk_wed_device *dev + if (mtk_wed_rro_cfg(dev)) + return; + +- mtk_wed_set_512_support(dev, dev->wlan.wcid_512); + } + ++ mtk_wed_set_512_support(dev, dev->wlan.wcid_512); ++ + mtk_wed_dma_enable(dev); + dev->running = true; + } +@@ -1365,11 +1366,13 @@ mtk_wed_attach(struct mtk_wed_device *de + } + + mtk_wed_hw_init_early(dev); +- if (hw->version == 1) ++ if (hw->version == 1) { + regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP, + BIT(hw->index), 0); +- else ++ } else { ++ dev->rev_id = wed_r32(dev, MTK_WED_REV_ID); + ret = mtk_wed_wo_init(hw); ++ } + out: + if (ret) + mtk_wed_detach(dev); +--- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h +@@ -20,6 +20,8 @@ struct mtk_wdma_desc { + __le32 info; + } __packed __aligned(4); + ++#define MTK_WED_REV_ID 0x004 ++ + #define MTK_WED_RESET 0x008 + #define MTK_WED_RESET_TX_BM BIT(0) + #define MTK_WED_RESET_TX_FREE_AGENT BIT(4) +--- a/include/linux/soc/mediatek/mtk_wed.h ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -85,6 +85,9 @@ struct mtk_wed_device { + int irq; + u8 version; + ++ /* used by wlan driver */ ++ u32 rev_id; ++ + struct mtk_wed_ring tx_ring[MTK_WED_TX_QUEUES]; + struct mtk_wed_ring rx_ring[MTK_WED_RX_QUEUES]; + struct mtk_wed_ring txfree_ring; diff --git a/target/linux/generic/backport-5.15/729-10-v6.2-net-ethernet-mtk_wed-return-status-value-in-mtk_wdma.patch b/target/linux/generic/backport-5.15/729-10-v6.2-net-ethernet-mtk_wed-return-status-value-in-mtk_wdma.patch new file mode 100644 index 0000000000..d97bb715e0 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-10-v6.2-net-ethernet-mtk_wed-return-status-value-in-mtk_wdma.patch @@ -0,0 +1,85 @@ +From: Lorenzo Bianconi +Date: Thu, 24 Nov 2022 16:22:51 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: return status value in + mtk_wdma_rx_reset + +Move MTK_WDMA_RESET_IDX configuration in mtk_wdma_rx_reset routine. +Increase poll timeout to 10ms in order to be aligned with vendor sdk. +This is a preliminary patch to add Wireless Ethernet Dispatcher reset +support. + +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Paolo Abeni +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -101,17 +101,21 @@ mtk_wdma_read_reset(struct mtk_wed_devic + return wdma_r32(dev, MTK_WDMA_GLO_CFG); + } + +-static void ++static int + mtk_wdma_rx_reset(struct mtk_wed_device *dev) + { + u32 status, mask = MTK_WDMA_GLO_CFG_RX_DMA_BUSY; +- int i; ++ int i, ret; + + wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_RX_DMA_EN); +- if (readx_poll_timeout(mtk_wdma_read_reset, dev, status, +- !(status & mask), 0, 1000)) ++ ret = readx_poll_timeout(mtk_wdma_read_reset, dev, status, ++ !(status & mask), 0, 10000); ++ if (ret) + dev_err(dev->hw->dev, "rx reset failed\n"); + ++ wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX); ++ wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); ++ + for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++) { + if (dev->rx_wdma[i].desc) + continue; +@@ -119,6 +123,8 @@ mtk_wdma_rx_reset(struct mtk_wed_device + wdma_w32(dev, + MTK_WDMA_RING_RX(i) + MTK_WED_RING_OFS_CPU_IDX, 0); + } ++ ++ return ret; + } + + static void +@@ -565,9 +571,7 @@ mtk_wed_detach(struct mtk_wed_device *de + + mtk_wed_stop(dev); + +- wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX); +- wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); +- ++ mtk_wdma_rx_reset(dev); + mtk_wed_reset(dev, MTK_WED_RESET_WED); + if (mtk_wed_get_rx_capa(dev)) { + wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_TX_DMA_EN); +@@ -582,7 +586,6 @@ mtk_wed_detach(struct mtk_wed_device *de + mtk_wed_wo_reset(dev); + mtk_wed_free_rx_rings(dev); + mtk_wed_wo_deinit(hw); +- mtk_wdma_rx_reset(dev); + } + + if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) { +@@ -1006,11 +1009,7 @@ mtk_wed_reset_dma(struct mtk_wed_device + wed_w32(dev, MTK_WED_RESET_IDX, 0); + } + +- wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX); +- wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); +- +- if (mtk_wed_get_rx_capa(dev)) +- mtk_wdma_rx_reset(dev); ++ mtk_wdma_rx_reset(dev); + + if (busy) { + mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT); diff --git a/target/linux/generic/backport-5.15/729-11-v6.2-net-ethernet-mtk_wed-move-MTK_WDMA_RESET_IDX_TX-conf.patch b/target/linux/generic/backport-5.15/729-11-v6.2-net-ethernet-mtk_wed-move-MTK_WDMA_RESET_IDX_TX-conf.patch new file mode 100644 index 0000000000..10c1732c96 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-11-v6.2-net-ethernet-mtk_wed-move-MTK_WDMA_RESET_IDX_TX-conf.patch @@ -0,0 +1,52 @@ +From: Lorenzo Bianconi +Date: Thu, 24 Nov 2022 16:22:52 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: move MTK_WDMA_RESET_IDX_TX + configuration in mtk_wdma_tx_reset + +Remove duplicated code. Increase poll timeout to 10ms in order to be +aligned with vendor sdk. +This is a preliminary patch to add Wireless Ethernet Dispatcher reset +support. + +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Paolo Abeni +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -135,16 +135,15 @@ mtk_wdma_tx_reset(struct mtk_wed_device + + wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_TX_DMA_EN); + if (readx_poll_timeout(mtk_wdma_read_reset, dev, status, +- !(status & mask), 0, 1000)) ++ !(status & mask), 0, 10000)) + dev_err(dev->hw->dev, "tx reset failed\n"); + +- for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) { +- if (dev->tx_wdma[i].desc) +- continue; ++ wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_TX); ++ wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); + ++ for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) + wdma_w32(dev, + MTK_WDMA_RING_TX(i) + MTK_WED_RING_OFS_CPU_IDX, 0); +- } + } + + static void +@@ -573,12 +572,6 @@ mtk_wed_detach(struct mtk_wed_device *de + + mtk_wdma_rx_reset(dev); + mtk_wed_reset(dev, MTK_WED_RESET_WED); +- if (mtk_wed_get_rx_capa(dev)) { +- wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_TX_DMA_EN); +- wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_TX); +- wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); +- } +- + mtk_wed_free_tx_buffer(dev); + mtk_wed_free_tx_rings(dev); + diff --git a/target/linux/generic/backport-5.15/729-12-v6.2-net-ethernet-mtk_wed-update-mtk_wed_stop.patch b/target/linux/generic/backport-5.15/729-12-v6.2-net-ethernet-mtk_wed-update-mtk_wed_stop.patch new file mode 100644 index 0000000000..dfc0f8c3f3 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-12-v6.2-net-ethernet-mtk_wed-update-mtk_wed_stop.patch @@ -0,0 +1,98 @@ +From: Lorenzo Bianconi +Date: Thu, 24 Nov 2022 16:22:53 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: update mtk_wed_stop + +Update mtk_wed_stop routine and rename old mtk_wed_stop() to +mtk_wed_deinit(). This is a preliminary patch to add Wireless Ethernet +Dispatcher reset support. + +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Paolo Abeni +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -539,14 +539,8 @@ mtk_wed_dma_disable(struct mtk_wed_devic + static void + mtk_wed_stop(struct mtk_wed_device *dev) + { +- mtk_wed_dma_disable(dev); + mtk_wed_set_ext_int(dev, false); + +- wed_clr(dev, MTK_WED_CTRL, +- MTK_WED_CTRL_WDMA_INT_AGENT_EN | +- MTK_WED_CTRL_WPDMA_INT_AGENT_EN | +- MTK_WED_CTRL_WED_TX_BM_EN | +- MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); + wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, 0); + wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, 0); + wdma_w32(dev, MTK_WDMA_INT_MASK, 0); +@@ -558,7 +552,27 @@ mtk_wed_stop(struct mtk_wed_device *dev) + + wed_w32(dev, MTK_WED_EXT_INT_MASK1, 0); + wed_w32(dev, MTK_WED_EXT_INT_MASK2, 0); +- wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_BM_EN); ++} ++ ++static void ++mtk_wed_deinit(struct mtk_wed_device *dev) ++{ ++ mtk_wed_stop(dev); ++ mtk_wed_dma_disable(dev); ++ ++ wed_clr(dev, MTK_WED_CTRL, ++ MTK_WED_CTRL_WDMA_INT_AGENT_EN | ++ MTK_WED_CTRL_WPDMA_INT_AGENT_EN | ++ MTK_WED_CTRL_WED_TX_BM_EN | ++ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); ++ ++ if (dev->hw->version == 1) ++ return; ++ ++ wed_clr(dev, MTK_WED_CTRL, ++ MTK_WED_CTRL_RX_ROUTE_QM_EN | ++ MTK_WED_CTRL_WED_RX_BM_EN | ++ MTK_WED_CTRL_RX_RRO_QM_EN); + } + + static void +@@ -568,7 +582,7 @@ mtk_wed_detach(struct mtk_wed_device *de + + mutex_lock(&hw_lock); + +- mtk_wed_stop(dev); ++ mtk_wed_deinit(dev); + + mtk_wdma_rx_reset(dev); + mtk_wed_reset(dev, MTK_WED_RESET_WED); +@@ -677,7 +691,7 @@ mtk_wed_hw_init_early(struct mtk_wed_dev + { + u32 mask, set; + +- mtk_wed_stop(dev); ++ mtk_wed_deinit(dev); + mtk_wed_reset(dev, MTK_WED_RESET_WED); + mtk_wed_set_wpdma(dev); + +--- a/include/linux/soc/mediatek/mtk_wed.h ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -234,6 +234,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_devic + (_dev)->ops->ppe_check(_dev, _skb, _reason, _hash) + #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) \ + (_dev)->ops->msg_update(_dev, _id, _msg, _len) ++#define mtk_wed_device_stop(_dev) (_dev)->ops->stop(_dev) ++#define mtk_wed_device_dma_reset(_dev) (_dev)->ops->reset_dma(_dev) + #else + static inline bool mtk_wed_device_active(struct mtk_wed_device *dev) + { +@@ -250,6 +252,8 @@ static inline bool mtk_wed_device_active + #define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) -ENODEV + #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) do {} while (0) + #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) -ENODEV ++#define mtk_wed_device_stop(_dev) do {} while (0) ++#define mtk_wed_device_dma_reset(_dev) do {} while (0) + #endif + + #endif diff --git a/target/linux/generic/backport-5.15/729-13-v6.2-net-ethernet-mtk_wed-add-mtk_wed_rx_reset-routine.patch b/target/linux/generic/backport-5.15/729-13-v6.2-net-ethernet-mtk_wed-add-mtk_wed_rx_reset-routine.patch new file mode 100644 index 0000000000..2205fea513 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-13-v6.2-net-ethernet-mtk_wed-add-mtk_wed_rx_reset-routine.patch @@ -0,0 +1,309 @@ +From: Lorenzo Bianconi +Date: Thu, 24 Nov 2022 16:22:54 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: add mtk_wed_rx_reset routine + +Introduce mtk_wed_rx_reset routine in order to reset rx DMA for Wireless +Ethernet Dispatcher available on MT7986 SoC. + +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Paolo Abeni +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -951,42 +951,130 @@ mtk_wed_ring_reset(struct mtk_wed_ring * + } + + static u32 +-mtk_wed_check_busy(struct mtk_wed_device *dev) ++mtk_wed_check_busy(struct mtk_wed_device *dev, u32 reg, u32 mask) + { +- if (wed_r32(dev, MTK_WED_GLO_CFG) & MTK_WED_GLO_CFG_TX_DMA_BUSY) +- return true; +- +- if (wed_r32(dev, MTK_WED_WPDMA_GLO_CFG) & +- MTK_WED_WPDMA_GLO_CFG_TX_DRV_BUSY) +- return true; +- +- if (wed_r32(dev, MTK_WED_CTRL) & MTK_WED_CTRL_WDMA_INT_AGENT_BUSY) +- return true; +- +- if (wed_r32(dev, MTK_WED_WDMA_GLO_CFG) & +- MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY) +- return true; +- +- if (wdma_r32(dev, MTK_WDMA_GLO_CFG) & +- MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY) +- return true; +- +- if (wed_r32(dev, MTK_WED_CTRL) & +- (MTK_WED_CTRL_WED_TX_BM_BUSY | MTK_WED_CTRL_WED_TX_FREE_AGENT_BUSY)) +- return true; +- +- return false; ++ return !!(wed_r32(dev, reg) & mask); + } + + static int +-mtk_wed_poll_busy(struct mtk_wed_device *dev) ++mtk_wed_poll_busy(struct mtk_wed_device *dev, u32 reg, u32 mask) + { + int sleep = 15000; + int timeout = 100 * sleep; + u32 val; + + return read_poll_timeout(mtk_wed_check_busy, val, !val, sleep, +- timeout, false, dev); ++ timeout, false, dev, reg, mask); ++} ++ ++static int ++mtk_wed_rx_reset(struct mtk_wed_device *dev) ++{ ++ struct mtk_wed_wo *wo = dev->hw->wed_wo; ++ u8 val = MTK_WED_WO_STATE_SER_RESET; ++ int i, ret; ++ ++ ret = mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, ++ MTK_WED_WO_CMD_CHANGE_STATE, &val, ++ sizeof(val), true); ++ if (ret) ++ return ret; ++ ++ wed_clr(dev, MTK_WED_WPDMA_RX_D_GLO_CFG, MTK_WED_WPDMA_RX_D_RX_DRV_EN); ++ ret = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_RX_D_GLO_CFG, ++ MTK_WED_WPDMA_RX_D_RX_DRV_BUSY); ++ if (ret) { ++ mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT); ++ mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_RX_D_DRV); ++ } else { ++ wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, ++ MTK_WED_WPDMA_RX_D_RST_CRX_IDX | ++ MTK_WED_WPDMA_RX_D_RST_DRV_IDX); ++ ++ wed_set(dev, MTK_WED_WPDMA_RX_D_GLO_CFG, ++ MTK_WED_WPDMA_RX_D_RST_INIT_COMPLETE | ++ MTK_WED_WPDMA_RX_D_FSM_RETURN_IDLE); ++ wed_clr(dev, MTK_WED_WPDMA_RX_D_GLO_CFG, ++ MTK_WED_WPDMA_RX_D_RST_INIT_COMPLETE | ++ MTK_WED_WPDMA_RX_D_FSM_RETURN_IDLE); ++ ++ wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, 0); ++ } ++ ++ /* reset rro qm */ ++ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_RRO_QM_EN); ++ ret = mtk_wed_poll_busy(dev, MTK_WED_CTRL, ++ MTK_WED_CTRL_RX_RRO_QM_BUSY); ++ if (ret) { ++ mtk_wed_reset(dev, MTK_WED_RESET_RX_RRO_QM); ++ } else { ++ wed_set(dev, MTK_WED_RROQM_RST_IDX, ++ MTK_WED_RROQM_RST_IDX_MIOD | ++ MTK_WED_RROQM_RST_IDX_FDBK); ++ wed_w32(dev, MTK_WED_RROQM_RST_IDX, 0); ++ } ++ ++ /* reset route qm */ ++ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_ROUTE_QM_EN); ++ ret = mtk_wed_poll_busy(dev, MTK_WED_CTRL, ++ MTK_WED_CTRL_RX_ROUTE_QM_BUSY); ++ if (ret) ++ mtk_wed_reset(dev, MTK_WED_RESET_RX_ROUTE_QM); ++ else ++ wed_set(dev, MTK_WED_RTQM_GLO_CFG, ++ MTK_WED_RTQM_Q_RST); ++ ++ /* reset tx wdma */ ++ mtk_wdma_tx_reset(dev); ++ ++ /* reset tx wdma drv */ ++ wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_TX_DRV_EN); ++ mtk_wed_poll_busy(dev, MTK_WED_CTRL, ++ MTK_WED_CTRL_WDMA_INT_AGENT_BUSY); ++ mtk_wed_reset(dev, MTK_WED_RESET_WDMA_TX_DRV); ++ ++ /* reset wed rx dma */ ++ ret = mtk_wed_poll_busy(dev, MTK_WED_GLO_CFG, ++ MTK_WED_GLO_CFG_RX_DMA_BUSY); ++ wed_clr(dev, MTK_WED_GLO_CFG, MTK_WED_GLO_CFG_RX_DMA_EN); ++ if (ret) { ++ mtk_wed_reset(dev, MTK_WED_RESET_WED_RX_DMA); ++ } else { ++ struct mtk_eth *eth = dev->hw->eth; ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ wed_set(dev, MTK_WED_RESET_IDX, ++ MTK_WED_RESET_IDX_RX_V2); ++ else ++ wed_set(dev, MTK_WED_RESET_IDX, MTK_WED_RESET_IDX_RX); ++ wed_w32(dev, MTK_WED_RESET_IDX, 0); ++ } ++ ++ /* reset rx bm */ ++ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_BM_EN); ++ mtk_wed_poll_busy(dev, MTK_WED_CTRL, ++ MTK_WED_CTRL_WED_RX_BM_BUSY); ++ mtk_wed_reset(dev, MTK_WED_RESET_RX_BM); ++ ++ /* wo change to enable state */ ++ val = MTK_WED_WO_STATE_ENABLE; ++ ret = mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, ++ MTK_WED_WO_CMD_CHANGE_STATE, &val, ++ sizeof(val), true); ++ if (ret) ++ return ret; ++ ++ /* wed_rx_ring_reset */ ++ for (i = 0; i < ARRAY_SIZE(dev->rx_ring); i++) { ++ if (!dev->rx_ring[i].desc) ++ continue; ++ ++ mtk_wed_ring_reset(&dev->rx_ring[i], MTK_WED_RX_RING_SIZE, ++ false); ++ } ++ mtk_wed_free_rx_buffer(dev); ++ ++ return 0; + } + + static void +@@ -1004,19 +1092,23 @@ mtk_wed_reset_dma(struct mtk_wed_device + true); + } + +- if (mtk_wed_poll_busy(dev)) +- busy = mtk_wed_check_busy(dev); +- ++ /* 1. reset WED tx DMA */ ++ wed_clr(dev, MTK_WED_GLO_CFG, MTK_WED_GLO_CFG_TX_DMA_EN); ++ busy = mtk_wed_poll_busy(dev, MTK_WED_GLO_CFG, ++ MTK_WED_GLO_CFG_TX_DMA_BUSY); + if (busy) { + mtk_wed_reset(dev, MTK_WED_RESET_WED_TX_DMA); + } else { +- wed_w32(dev, MTK_WED_RESET_IDX, +- MTK_WED_RESET_IDX_TX | +- MTK_WED_RESET_IDX_RX); ++ wed_w32(dev, MTK_WED_RESET_IDX, MTK_WED_RESET_IDX_TX); + wed_w32(dev, MTK_WED_RESET_IDX, 0); + } + +- mtk_wdma_rx_reset(dev); ++ /* 2. reset WDMA rx DMA */ ++ busy = !!mtk_wdma_rx_reset(dev); ++ wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_RX_DRV_EN); ++ if (!busy) ++ busy = mtk_wed_poll_busy(dev, MTK_WED_WDMA_GLO_CFG, ++ MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY); + + if (busy) { + mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT); +@@ -1033,6 +1125,9 @@ mtk_wed_reset_dma(struct mtk_wed_device + MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE); + } + ++ /* 3. reset WED WPDMA tx */ ++ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); ++ + for (i = 0; i < 100; i++) { + val = wed_r32(dev, MTK_WED_TX_BM_INTF); + if (FIELD_GET(MTK_WED_TX_BM_INTF_TKFIFO_FDEP, val) == 0x40) +@@ -1040,8 +1135,19 @@ mtk_wed_reset_dma(struct mtk_wed_device + } + + mtk_wed_reset(dev, MTK_WED_RESET_TX_FREE_AGENT); ++ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_TX_BM_EN); + mtk_wed_reset(dev, MTK_WED_RESET_TX_BM); + ++ /* 4. reset WED WPDMA tx */ ++ busy = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_GLO_CFG, ++ MTK_WED_WPDMA_GLO_CFG_TX_DRV_BUSY); ++ wed_clr(dev, MTK_WED_WPDMA_GLO_CFG, ++ MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN | ++ MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN); ++ if (!busy) ++ busy = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_GLO_CFG, ++ MTK_WED_WPDMA_GLO_CFG_RX_DRV_BUSY); ++ + if (busy) { + mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT); + mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_TX_DRV); +@@ -1052,6 +1158,17 @@ mtk_wed_reset_dma(struct mtk_wed_device + MTK_WED_WPDMA_RESET_IDX_RX); + wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0); + } ++ ++ dev->init_done = false; ++ if (dev->hw->version == 1) ++ return; ++ ++ if (!busy) { ++ wed_w32(dev, MTK_WED_RESET_IDX, MTK_WED_RESET_WPDMA_IDX_RX); ++ wed_w32(dev, MTK_WED_RESET_IDX, 0); ++ } ++ ++ mtk_wed_rx_reset(dev); + } + + static int +@@ -1274,6 +1391,9 @@ mtk_wed_start(struct mtk_wed_device *dev + { + int i; + ++ if (mtk_wed_get_rx_capa(dev) && mtk_wed_rx_buffer_alloc(dev)) ++ return; ++ + for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++) + if (!dev->rx_wdma[i].desc) + mtk_wed_wdma_rx_ring_setup(dev, i, 16); +@@ -1362,10 +1482,6 @@ mtk_wed_attach(struct mtk_wed_device *de + goto out; + + if (mtk_wed_get_rx_capa(dev)) { +- ret = mtk_wed_rx_buffer_alloc(dev); +- if (ret) +- goto out; +- + ret = mtk_wed_rro_alloc(dev); + if (ret) + goto out; +--- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h +@@ -24,11 +24,15 @@ struct mtk_wdma_desc { + + #define MTK_WED_RESET 0x008 + #define MTK_WED_RESET_TX_BM BIT(0) ++#define MTK_WED_RESET_RX_BM BIT(1) + #define MTK_WED_RESET_TX_FREE_AGENT BIT(4) + #define MTK_WED_RESET_WPDMA_TX_DRV BIT(8) + #define MTK_WED_RESET_WPDMA_RX_DRV BIT(9) ++#define MTK_WED_RESET_WPDMA_RX_D_DRV BIT(10) + #define MTK_WED_RESET_WPDMA_INT_AGENT BIT(11) + #define MTK_WED_RESET_WED_TX_DMA BIT(12) ++#define MTK_WED_RESET_WED_RX_DMA BIT(13) ++#define MTK_WED_RESET_WDMA_TX_DRV BIT(16) + #define MTK_WED_RESET_WDMA_RX_DRV BIT(17) + #define MTK_WED_RESET_WDMA_INT_AGENT BIT(19) + #define MTK_WED_RESET_RX_RRO_QM BIT(20) +@@ -158,6 +162,8 @@ struct mtk_wdma_desc { + #define MTK_WED_RESET_IDX 0x20c + #define MTK_WED_RESET_IDX_TX GENMASK(3, 0) + #define MTK_WED_RESET_IDX_RX GENMASK(17, 16) ++#define MTK_WED_RESET_IDX_RX_V2 GENMASK(7, 6) ++#define MTK_WED_RESET_WPDMA_IDX_RX GENMASK(31, 30) + + #define MTK_WED_TX_MIB(_n) (0x2a0 + (_n) * 4) + #define MTK_WED_RX_MIB(_n) (0x2e0 + (_n) * 4) +@@ -267,6 +273,9 @@ struct mtk_wdma_desc { + + #define MTK_WED_WPDMA_RX_D_GLO_CFG 0x75c + #define MTK_WED_WPDMA_RX_D_RX_DRV_EN BIT(0) ++#define MTK_WED_WPDMA_RX_D_RX_DRV_BUSY BIT(1) ++#define MTK_WED_WPDMA_RX_D_FSM_RETURN_IDLE BIT(3) ++#define MTK_WED_WPDMA_RX_D_RST_INIT_COMPLETE BIT(4) + #define MTK_WED_WPDMA_RX_D_INIT_PHASE_RXEN_SEL GENMASK(11, 7) + #define MTK_WED_WPDMA_RX_D_RXD_READ_LEN GENMASK(31, 24) + diff --git a/target/linux/generic/backport-5.15/729-14-v6.2-net-ethernet-mtk_wed-add-reset-to-tx_ring_setup-call.patch b/target/linux/generic/backport-5.15/729-14-v6.2-net-ethernet-mtk_wed-add-reset-to-tx_ring_setup-call.patch new file mode 100644 index 0000000000..602483bcb8 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-14-v6.2-net-ethernet-mtk_wed-add-reset-to-tx_ring_setup-call.patch @@ -0,0 +1,103 @@ +From: Lorenzo Bianconi +Date: Thu, 24 Nov 2022 16:22:55 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: add reset to tx_ring_setup callback + +Introduce reset parameter to mtk_wed_tx_ring_setup signature. +This is a preliminary patch to add Wireless Ethernet Dispatcher reset +support. + +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Paolo Abeni +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -1188,7 +1188,8 @@ mtk_wed_ring_alloc(struct mtk_wed_device + } + + static int +-mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size) ++mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size, ++ bool reset) + { + u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; + struct mtk_wed_ring *wdma; +@@ -1197,8 +1198,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_we + return -EINVAL; + + wdma = &dev->rx_wdma[idx]; +- if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size, +- true)) ++ if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, ++ desc_size, true)) + return -ENOMEM; + + wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE, +@@ -1396,7 +1397,7 @@ mtk_wed_start(struct mtk_wed_device *dev + + for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++) + if (!dev->rx_wdma[i].desc) +- mtk_wed_wdma_rx_ring_setup(dev, i, 16); ++ mtk_wed_wdma_rx_ring_setup(dev, i, 16, false); + + mtk_wed_hw_init(dev); + mtk_wed_configure_irq(dev, irq_mask); +@@ -1505,7 +1506,8 @@ unlock: + } + + static int +-mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs) ++mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs, ++ bool reset) + { + struct mtk_wed_ring *ring = &dev->tx_ring[idx]; + +@@ -1524,11 +1526,12 @@ mtk_wed_tx_ring_setup(struct mtk_wed_dev + if (WARN_ON(idx >= ARRAY_SIZE(dev->tx_ring))) + return -EINVAL; + +- if (mtk_wed_ring_alloc(dev, ring, MTK_WED_TX_RING_SIZE, +- sizeof(*ring->desc), true)) ++ if (!reset && mtk_wed_ring_alloc(dev, ring, MTK_WED_TX_RING_SIZE, ++ sizeof(*ring->desc), true)) + return -ENOMEM; + +- if (mtk_wed_wdma_rx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) ++ if (mtk_wed_wdma_rx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE, ++ reset)) + return -ENOMEM; + + ring->reg_base = MTK_WED_RING_TX(idx); +--- a/include/linux/soc/mediatek/mtk_wed.h ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -158,7 +158,7 @@ struct mtk_wed_device { + struct mtk_wed_ops { + int (*attach)(struct mtk_wed_device *dev); + int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring, +- void __iomem *regs); ++ void __iomem *regs, bool reset); + int (*rx_ring_setup)(struct mtk_wed_device *dev, int ring, + void __iomem *regs); + int (*txfree_ring_setup)(struct mtk_wed_device *dev, +@@ -216,8 +216,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_devic + #define mtk_wed_device_active(_dev) !!(_dev)->ops + #define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev) + #define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask) +-#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) \ +- (_dev)->ops->tx_ring_setup(_dev, _ring, _regs) ++#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) \ ++ (_dev)->ops->tx_ring_setup(_dev, _ring, _regs, _reset) + #define mtk_wed_device_txfree_ring_setup(_dev, _regs) \ + (_dev)->ops->txfree_ring_setup(_dev, _regs) + #define mtk_wed_device_reg_read(_dev, _reg) \ +@@ -243,7 +243,7 @@ static inline bool mtk_wed_device_active + } + #define mtk_wed_device_detach(_dev) do {} while (0) + #define mtk_wed_device_start(_dev, _mask) do {} while (0) +-#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) -ENODEV ++#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) -ENODEV + #define mtk_wed_device_txfree_ring_setup(_dev, _ring, _regs) -ENODEV + #define mtk_wed_device_reg_read(_dev, _reg) 0 + #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0) diff --git a/target/linux/generic/backport-5.15/729-15-v6.2-net-ethernet-mtk_wed-fix-sleep-while-atomic-in-mtk_w.patch b/target/linux/generic/backport-5.15/729-15-v6.2-net-ethernet-mtk_wed-fix-sleep-while-atomic-in-mtk_w.patch new file mode 100644 index 0000000000..f9b11326b1 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-15-v6.2-net-ethernet-mtk_wed-fix-sleep-while-atomic-in-mtk_w.patch @@ -0,0 +1,103 @@ +From: Lorenzo Bianconi +Date: Thu, 1 Dec 2022 16:26:53 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: fix sleep while atomic in + mtk_wed_wo_queue_refill + +In order to fix the following sleep while atomic bug always alloc pages +with GFP_ATOMIC in mtk_wed_wo_queue_refill since page_frag_alloc runs in +spin_lock critical section. + +[ 9.049719] Hardware name: MediaTek MT7986a RFB (DT) +[ 9.054665] Call trace: +[ 9.057096] dump_backtrace+0x0/0x154 +[ 9.060751] show_stack+0x14/0x1c +[ 9.064052] dump_stack_lvl+0x64/0x7c +[ 9.067702] dump_stack+0x14/0x2c +[ 9.071001] ___might_sleep+0xec/0x120 +[ 9.074736] __might_sleep+0x4c/0x9c +[ 9.078296] __alloc_pages+0x184/0x2e4 +[ 9.082030] page_frag_alloc_align+0x98/0x1ac +[ 9.086369] mtk_wed_wo_queue_refill+0x134/0x234 +[ 9.090974] mtk_wed_wo_init+0x174/0x2c0 +[ 9.094881] mtk_wed_attach+0x7c8/0x7e0 +[ 9.098701] mt7915_mmio_wed_init+0x1f0/0x3a0 [mt7915e] +[ 9.103940] mt7915_pci_probe+0xec/0x3bc [mt7915e] +[ 9.108727] pci_device_probe+0xac/0x13c +[ 9.112638] really_probe.part.0+0x98/0x2f4 +[ 9.116807] __driver_probe_device+0x94/0x13c +[ 9.121147] driver_probe_device+0x40/0x114 +[ 9.125314] __driver_attach+0x7c/0x180 +[ 9.129133] bus_for_each_dev+0x5c/0x90 +[ 9.132953] driver_attach+0x20/0x2c +[ 9.136513] bus_add_driver+0x104/0x1fc +[ 9.140333] driver_register+0x74/0x120 +[ 9.144153] __pci_register_driver+0x40/0x50 +[ 9.148407] mt7915_init+0x5c/0x1000 [mt7915e] +[ 9.152848] do_one_initcall+0x40/0x25c +[ 9.156669] do_init_module+0x44/0x230 +[ 9.160403] load_module+0x1f30/0x2750 +[ 9.164135] __do_sys_init_module+0x150/0x200 +[ 9.168475] __arm64_sys_init_module+0x18/0x20 +[ 9.172901] invoke_syscall.constprop.0+0x4c/0xe0 +[ 9.177589] do_el0_svc+0x48/0xe0 +[ 9.180889] el0_svc+0x14/0x50 +[ 9.183929] el0t_64_sync_handler+0x9c/0x120 +[ 9.188183] el0t_64_sync+0x158/0x15c + +Fixes: 799684448e3e ("net: ethernet: mtk_wed: introduce wed wo support") +Signed-off-by: Lorenzo Bianconi +Reviewed-by: Pavan Chebbi +Link: https://lore.kernel.org/r/67ca94bdd3d9eaeb86e52b3050fbca0bcf7bb02f.1669908312.git.lorenzo@kernel.org +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed_wo.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.c +@@ -133,17 +133,18 @@ mtk_wed_wo_dequeue(struct mtk_wed_wo *wo + + static int + mtk_wed_wo_queue_refill(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q, +- gfp_t gfp, bool rx) ++ bool rx) + { + enum dma_data_direction dir = rx ? DMA_FROM_DEVICE : DMA_TO_DEVICE; + int n_buf = 0; + + spin_lock_bh(&q->lock); + while (q->queued < q->n_desc) { +- void *buf = page_frag_alloc(&q->cache, q->buf_size, gfp); + struct mtk_wed_wo_queue_entry *entry; + dma_addr_t addr; ++ void *buf; + ++ buf = page_frag_alloc(&q->cache, q->buf_size, GFP_ATOMIC); + if (!buf) + break; + +@@ -215,7 +216,7 @@ mtk_wed_wo_rx_run_queue(struct mtk_wed_w + mtk_wed_mcu_rx_unsolicited_event(wo, skb); + } + +- if (mtk_wed_wo_queue_refill(wo, q, GFP_ATOMIC, true)) { ++ if (mtk_wed_wo_queue_refill(wo, q, true)) { + u32 index = (q->head - 1) % q->n_desc; + + mtk_wed_wo_queue_kick(wo, q, index); +@@ -432,7 +433,7 @@ mtk_wed_wo_hardware_init(struct mtk_wed_ + if (ret) + goto error; + +- mtk_wed_wo_queue_refill(wo, &wo->q_tx, GFP_KERNEL, false); ++ mtk_wed_wo_queue_refill(wo, &wo->q_tx, false); + mtk_wed_wo_queue_reset(wo, &wo->q_tx); + + regs.desc_base = MTK_WED_WO_CCIF_DUMMY5; +@@ -446,7 +447,7 @@ mtk_wed_wo_hardware_init(struct mtk_wed_ + if (ret) + goto error; + +- mtk_wed_wo_queue_refill(wo, &wo->q_rx, GFP_KERNEL, true); ++ mtk_wed_wo_queue_refill(wo, &wo->q_rx, true); + mtk_wed_wo_queue_reset(wo, &wo->q_rx); + + /* rx queue irqmask */ diff --git a/target/linux/generic/backport-5.15/729-16-v6.3-net-ethernet-mtk_wed-get-rid-of-queue-lock-for-rx-qu.patch b/target/linux/generic/backport-5.15/729-16-v6.3-net-ethernet-mtk_wed-get-rid-of-queue-lock-for-rx-qu.patch new file mode 100644 index 0000000000..fa6f56dbe7 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-16-v6.3-net-ethernet-mtk_wed-get-rid-of-queue-lock-for-rx-qu.patch @@ -0,0 +1,52 @@ +From: Lorenzo Bianconi +Date: Tue, 10 Jan 2023 10:31:26 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: get rid of queue lock for rx queue + +Queue spinlock is currently held in mtk_wed_wo_queue_rx_clean and +mtk_wed_wo_queue_refill routines for MTK Wireless Ethernet Dispatcher +MCU rx queue. mtk_wed_wo_queue_refill() is running during initialization +and in rx tasklet while mtk_wed_wo_queue_rx_clean() is running in +mtk_wed_wo_hw_deinit() during hw de-init phase after rx tasklet has been +disabled. Since mtk_wed_wo_queue_rx_clean and mtk_wed_wo_queue_refill +routines can't run concurrently get rid of spinlock for mcu rx queue. + +Reviewed-by: Alexander Duyck +Signed-off-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/36ec3b729542ea60898471d890796f745479ba32.1673342990.git.lorenzo@kernel.org +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed_wo.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.c +@@ -138,7 +138,6 @@ mtk_wed_wo_queue_refill(struct mtk_wed_w + enum dma_data_direction dir = rx ? DMA_FROM_DEVICE : DMA_TO_DEVICE; + int n_buf = 0; + +- spin_lock_bh(&q->lock); + while (q->queued < q->n_desc) { + struct mtk_wed_wo_queue_entry *entry; + dma_addr_t addr; +@@ -172,7 +171,6 @@ mtk_wed_wo_queue_refill(struct mtk_wed_w + q->queued++; + n_buf++; + } +- spin_unlock_bh(&q->lock); + + return n_buf; + } +@@ -316,7 +314,6 @@ mtk_wed_wo_queue_rx_clean(struct mtk_wed + { + struct page *page; + +- spin_lock_bh(&q->lock); + for (;;) { + void *buf = mtk_wed_wo_dequeue(wo, q, NULL, true); + +@@ -325,7 +322,6 @@ mtk_wed_wo_queue_rx_clean(struct mtk_wed + + skb_free_frag(buf); + } +- spin_unlock_bh(&q->lock); + + if (!q->cache.va) + return; diff --git a/target/linux/generic/backport-5.15/729-17-v6.3-net-ethernet-mtk_wed-get-rid-of-queue-lock-for-tx-qu.patch b/target/linux/generic/backport-5.15/729-17-v6.3-net-ethernet-mtk_wed-get-rid-of-queue-lock-for-tx-qu.patch new file mode 100644 index 0000000000..9b1e4c3250 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-17-v6.3-net-ethernet-mtk_wed-get-rid-of-queue-lock-for-tx-qu.patch @@ -0,0 +1,75 @@ +From: Lorenzo Bianconi +Date: Thu, 12 Jan 2023 10:21:29 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: get rid of queue lock for tx queue + +Similar to MTK Wireless Ethernet Dispatcher (WED) MCU rx queue, +we do not need to protect WED MCU tx queue with a spin lock since +the tx queue is accessed in the two following routines: +- mtk_wed_wo_queue_tx_skb(): + it is run at initialization and during mt7915 normal operation. + Moreover MCU messages are serialized through MCU mutex. +- mtk_wed_wo_queue_tx_clean(): + it runs just at mt7915 driver module unload when no more messages + are sent to the MCU. + +Remove tx queue spinlock. + +Signed-off-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/7bd0337b2a13ab1a63673b7c03fd35206b3b284e.1673515140.git.lorenzo@kernel.org +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed_wo.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.c +@@ -258,7 +258,6 @@ mtk_wed_wo_queue_alloc(struct mtk_wed_wo + int n_desc, int buf_size, int index, + struct mtk_wed_wo_queue_regs *regs) + { +- spin_lock_init(&q->lock); + q->regs = *regs; + q->n_desc = n_desc; + q->buf_size = buf_size; +@@ -290,7 +289,6 @@ mtk_wed_wo_queue_tx_clean(struct mtk_wed + struct page *page; + int i; + +- spin_lock_bh(&q->lock); + for (i = 0; i < q->n_desc; i++) { + struct mtk_wed_wo_queue_entry *entry = &q->entry[i]; + +@@ -299,7 +297,6 @@ mtk_wed_wo_queue_tx_clean(struct mtk_wed + skb_free_frag(entry->buf); + entry->buf = NULL; + } +- spin_unlock_bh(&q->lock); + + if (!q->cache.va) + return; +@@ -347,8 +344,6 @@ int mtk_wed_wo_queue_tx_skb(struct mtk_w + int ret = 0, index; + u32 ctrl; + +- spin_lock_bh(&q->lock); +- + q->tail = mtk_wed_mmio_r32(wo, q->regs.dma_idx); + index = (q->head + 1) % q->n_desc; + if (q->tail == index) { +@@ -379,8 +374,6 @@ int mtk_wed_wo_queue_tx_skb(struct mtk_w + mtk_wed_wo_queue_kick(wo, q, q->head); + mtk_wed_wo_kickout(wo); + out: +- spin_unlock_bh(&q->lock); +- + dev_kfree_skb(skb); + + return ret; +--- a/drivers/net/ethernet/mediatek/mtk_wed_wo.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.h +@@ -211,7 +211,6 @@ struct mtk_wed_wo_queue { + struct mtk_wed_wo_queue_regs regs; + + struct page_frag_cache cache; +- spinlock_t lock; + + struct mtk_wed_wo_queue_desc *desc; + dma_addr_t desc_dma; diff --git a/target/linux/generic/backport-5.15/729-18-v6.3-net-ethernet-mtk_eth_soc-introduce-mtk_hw_reset-util.patch b/target/linux/generic/backport-5.15/729-18-v6.3-net-ethernet-mtk_eth_soc-introduce-mtk_hw_reset-util.patch new file mode 100644 index 0000000000..3ab5dba434 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-18-v6.3-net-ethernet-mtk_eth_soc-introduce-mtk_hw_reset-util.patch @@ -0,0 +1,70 @@ +From: Lorenzo Bianconi +Date: Sat, 14 Jan 2023 18:01:28 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: introduce mtk_hw_reset utility + routine + +This is a preliminary patch to add Wireless Ethernet Dispatcher reset +support. + +Reviewed-by: Leon Romanovsky +Tested-by: Daniel Golle +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Paolo Abeni +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3203,6 +3203,27 @@ static void mtk_set_mcr_max_rx(struct mt + mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); + } + ++static void mtk_hw_reset(struct mtk_eth *eth) ++{ ++ u32 val; ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, 0); ++ val = RSTCTRL_PPE0_V2; ++ } else { ++ val = RSTCTRL_PPE0; ++ } ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ val |= RSTCTRL_PPE1; ++ ++ ethsys_reset(eth, RSTCTRL_ETH | RSTCTRL_FE | val); ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, ++ 0x3ffffff); ++} ++ + static int mtk_hw_init(struct mtk_eth *eth) + { + u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA | +@@ -3242,22 +3263,9 @@ static int mtk_hw_init(struct mtk_eth *e + return 0; + } + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { +- regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, 0); +- val = RSTCTRL_PPE0_V2; +- } else { +- val = RSTCTRL_PPE0; +- } +- +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) +- val |= RSTCTRL_PPE1; +- +- ethsys_reset(eth, RSTCTRL_ETH | RSTCTRL_FE | val); ++ mtk_hw_reset(eth); + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { +- regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, +- 0x3ffffff); +- + /* Set FE to PDMAv2 if necessary */ + val = mtk_r32(eth, MTK_FE_GLO_MISC); + mtk_w32(eth, val | BIT(4), MTK_FE_GLO_MISC); diff --git a/target/linux/generic/backport-5.15/729-19-v6.3-net-ethernet-mtk_eth_soc-introduce-mtk_hw_warm_reset.patch b/target/linux/generic/backport-5.15/729-19-v6.3-net-ethernet-mtk_eth_soc-introduce-mtk_hw_warm_reset.patch new file mode 100644 index 0000000000..deb39477ec --- /dev/null +++ b/target/linux/generic/backport-5.15/729-19-v6.3-net-ethernet-mtk_eth_soc-introduce-mtk_hw_warm_reset.patch @@ -0,0 +1,107 @@ +From: Lorenzo Bianconi +Date: Sat, 14 Jan 2023 18:01:29 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: introduce mtk_hw_warm_reset + support + +Introduce mtk_hw_warm_reset utility routine. This is a preliminary patch +to align reset procedure to vendor sdk and avoid to power down the chip +during hw reset. + +Reviewed-by: Leon Romanovsky +Tested-by: Daniel Golle +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Paolo Abeni +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3224,7 +3224,54 @@ static void mtk_hw_reset(struct mtk_eth + 0x3ffffff); + } + +-static int mtk_hw_init(struct mtk_eth *eth) ++static u32 mtk_hw_reset_read(struct mtk_eth *eth) ++{ ++ u32 val; ++ ++ regmap_read(eth->ethsys, ETHSYS_RSTCTRL, &val); ++ return val; ++} ++ ++static void mtk_hw_warm_reset(struct mtk_eth *eth) ++{ ++ u32 rst_mask, val; ++ ++ regmap_update_bits(eth->ethsys, ETHSYS_RSTCTRL, RSTCTRL_FE, ++ RSTCTRL_FE); ++ if (readx_poll_timeout_atomic(mtk_hw_reset_read, eth, val, ++ val & RSTCTRL_FE, 1, 1000)) { ++ dev_err(eth->dev, "warm reset failed\n"); ++ mtk_hw_reset(eth); ++ return; ++ } ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ rst_mask = RSTCTRL_ETH | RSTCTRL_PPE0_V2; ++ else ++ rst_mask = RSTCTRL_ETH | RSTCTRL_PPE0; ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ rst_mask |= RSTCTRL_PPE1; ++ ++ regmap_update_bits(eth->ethsys, ETHSYS_RSTCTRL, rst_mask, rst_mask); ++ ++ udelay(1); ++ val = mtk_hw_reset_read(eth); ++ if (!(val & rst_mask)) ++ dev_err(eth->dev, "warm reset stage0 failed %08x (%08x)\n", ++ val, rst_mask); ++ ++ rst_mask |= RSTCTRL_FE; ++ regmap_update_bits(eth->ethsys, ETHSYS_RSTCTRL, rst_mask, ~rst_mask); ++ ++ udelay(1); ++ val = mtk_hw_reset_read(eth); ++ if (val & rst_mask) ++ dev_err(eth->dev, "warm reset stage1 failed %08x (%08x)\n", ++ val, rst_mask); ++} ++ ++static int mtk_hw_init(struct mtk_eth *eth, bool reset) + { + u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA | + ETHSYS_DMA_AG_MAP_PPE; +@@ -3263,7 +3310,12 @@ static int mtk_hw_init(struct mtk_eth *e + return 0; + } + +- mtk_hw_reset(eth); ++ msleep(100); ++ ++ if (reset) ++ mtk_hw_warm_reset(eth); ++ else ++ mtk_hw_reset(eth); + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { + /* Set FE to PDMAv2 if necessary */ +@@ -3451,7 +3503,7 @@ static void mtk_pending_work(struct work + if (eth->dev->pins) + pinctrl_select_state(eth->dev->pins->p, + eth->dev->pins->default_state); +- mtk_hw_init(eth); ++ mtk_hw_init(eth, true); + + /* restart DMA and enable IRQs */ + for (i = 0; i < MTK_MAC_COUNT; i++) { +@@ -4053,7 +4105,7 @@ static int mtk_probe(struct platform_dev + eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE); + INIT_WORK(ð->pending_work, mtk_pending_work); + +- err = mtk_hw_init(eth); ++ err = mtk_hw_init(eth, false); + if (err) + goto err_wed_exit; + diff --git a/target/linux/generic/backport-5.15/729-20-v6.3-net-ethernet-mtk_eth_soc-align-reset-procedure-to-ve.patch b/target/linux/generic/backport-5.15/729-20-v6.3-net-ethernet-mtk_eth_soc-align-reset-procedure-to-ve.patch new file mode 100644 index 0000000000..b3812cccbb --- /dev/null +++ b/target/linux/generic/backport-5.15/729-20-v6.3-net-ethernet-mtk_eth_soc-align-reset-procedure-to-ve.patch @@ -0,0 +1,262 @@ +From: Lorenzo Bianconi +Date: Sat, 14 Jan 2023 18:01:30 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: align reset procedure to vendor + sdk + +Avoid to power-down the ethernet chip during hw reset and align reset +procedure to vendor sdk. + +Reviewed-by: Leon Romanovsky +Tested-by: Daniel Golle +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Paolo Abeni +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -2789,14 +2789,29 @@ static void mtk_dma_free(struct mtk_eth + kfree(eth->scratch_head); + } + ++static bool mtk_hw_reset_check(struct mtk_eth *eth) ++{ ++ u32 val = mtk_r32(eth, MTK_INT_STATUS2); ++ ++ return (val & MTK_FE_INT_FQ_EMPTY) || (val & MTK_FE_INT_RFIFO_UF) || ++ (val & MTK_FE_INT_RFIFO_OV) || (val & MTK_FE_INT_TSO_FAIL) || ++ (val & MTK_FE_INT_TSO_ALIGN) || (val & MTK_FE_INT_TSO_ILLEGAL); ++} ++ + static void mtk_tx_timeout(struct net_device *dev, unsigned int txqueue) + { + struct mtk_mac *mac = netdev_priv(dev); + struct mtk_eth *eth = mac->hw; + ++ if (test_bit(MTK_RESETTING, ð->state)) ++ return; ++ ++ if (!mtk_hw_reset_check(eth)) ++ return; ++ + eth->netdev[mac->id]->stats.tx_errors++; +- netif_err(eth, tx_err, dev, +- "transmit timed out\n"); ++ netif_err(eth, tx_err, dev, "transmit timed out\n"); ++ + schedule_work(ð->pending_work); + } + +@@ -3278,15 +3293,17 @@ static int mtk_hw_init(struct mtk_eth *e + const struct mtk_reg_map *reg_map = eth->soc->reg_map; + int i, val, ret; + +- if (test_and_set_bit(MTK_HW_INIT, ð->state)) ++ if (!reset && test_and_set_bit(MTK_HW_INIT, ð->state)) + return 0; + +- pm_runtime_enable(eth->dev); +- pm_runtime_get_sync(eth->dev); ++ if (!reset) { ++ pm_runtime_enable(eth->dev); ++ pm_runtime_get_sync(eth->dev); + +- ret = mtk_clk_enable(eth); +- if (ret) +- goto err_disable_pm; ++ ret = mtk_clk_enable(eth); ++ if (ret) ++ goto err_disable_pm; ++ } + + if (eth->ethsys) + regmap_update_bits(eth->ethsys, ETHSYS_DMA_AG_MAP, dma_mask, +@@ -3412,8 +3429,10 @@ static int mtk_hw_init(struct mtk_eth *e + return 0; + + err_disable_pm: +- pm_runtime_put_sync(eth->dev); +- pm_runtime_disable(eth->dev); ++ if (!reset) { ++ pm_runtime_put_sync(eth->dev); ++ pm_runtime_disable(eth->dev); ++ } + + return ret; + } +@@ -3475,30 +3494,53 @@ static int mtk_do_ioctl(struct net_devic + return -EOPNOTSUPP; + } + ++static void mtk_prepare_for_reset(struct mtk_eth *eth) ++{ ++ u32 val; ++ int i; ++ ++ /* disabe FE P3 and P4 */ ++ val = mtk_r32(eth, MTK_FE_GLO_CFG) | MTK_FE_LINK_DOWN_P3; ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ val |= MTK_FE_LINK_DOWN_P4; ++ mtk_w32(eth, val, MTK_FE_GLO_CFG); ++ ++ /* adjust PPE configurations to prepare for reset */ ++ for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) ++ mtk_ppe_prepare_reset(eth->ppe[i]); ++ ++ /* disable NETSYS interrupts */ ++ mtk_w32(eth, 0, MTK_FE_INT_ENABLE); ++ ++ /* force link down GMAC */ ++ for (i = 0; i < 2; i++) { ++ val = mtk_r32(eth, MTK_MAC_MCR(i)) & ~MAC_MCR_FORCE_LINK; ++ mtk_w32(eth, val, MTK_MAC_MCR(i)); ++ } ++} ++ + static void mtk_pending_work(struct work_struct *work) + { + struct mtk_eth *eth = container_of(work, struct mtk_eth, pending_work); +- int err, i; + unsigned long restart = 0; ++ u32 val; ++ int i; + + rtnl_lock(); +- +- dev_dbg(eth->dev, "[%s][%d] reset\n", __func__, __LINE__); + set_bit(MTK_RESETTING, ð->state); + ++ mtk_prepare_for_reset(eth); ++ + /* stop all devices to make sure that dma is properly shut down */ + for (i = 0; i < MTK_MAC_COUNT; i++) { +- if (!eth->netdev[i]) ++ if (!eth->netdev[i] || !netif_running(eth->netdev[i])) + continue; ++ + mtk_stop(eth->netdev[i]); + __set_bit(i, &restart); + } +- dev_dbg(eth->dev, "[%s][%d] mtk_stop ends\n", __func__, __LINE__); + +- /* restart underlying hardware such as power, clock, pin mux +- * and the connected phy +- */ +- mtk_hw_deinit(eth); ++ usleep_range(15000, 16000); + + if (eth->dev->pins) + pinctrl_select_state(eth->dev->pins->p, +@@ -3509,15 +3551,19 @@ static void mtk_pending_work(struct work + for (i = 0; i < MTK_MAC_COUNT; i++) { + if (!test_bit(i, &restart)) + continue; +- err = mtk_open(eth->netdev[i]); +- if (err) { ++ ++ if (mtk_open(eth->netdev[i])) { + netif_alert(eth, ifup, eth->netdev[i], +- "Driver up/down cycle failed, closing device.\n"); ++ "Driver up/down cycle failed\n"); + dev_close(eth->netdev[i]); + } + } + +- dev_dbg(eth->dev, "[%s][%d] reset done\n", __func__, __LINE__); ++ /* enabe FE P3 and P4 */ ++ val = mtk_r32(eth, MTK_FE_GLO_CFG) & ~MTK_FE_LINK_DOWN_P3; ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ val &= ~MTK_FE_LINK_DOWN_P4; ++ mtk_w32(eth, val, MTK_FE_GLO_CFG); + + clear_bit(MTK_RESETTING, ð->state); + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -72,12 +72,24 @@ + #define MTK_HW_LRO_REPLACE_DELTA 1000 + #define MTK_HW_LRO_SDL_REMAIN_ROOM 1522 + ++/* Frame Engine Global Configuration */ ++#define MTK_FE_GLO_CFG 0x00 ++#define MTK_FE_LINK_DOWN_P3 BIT(11) ++#define MTK_FE_LINK_DOWN_P4 BIT(12) ++ + /* Frame Engine Global Reset Register */ + #define MTK_RST_GL 0x04 + #define RST_GL_PSE BIT(0) + + /* Frame Engine Interrupt Status Register */ + #define MTK_INT_STATUS2 0x08 ++#define MTK_FE_INT_ENABLE 0x0c ++#define MTK_FE_INT_FQ_EMPTY BIT(8) ++#define MTK_FE_INT_TSO_FAIL BIT(12) ++#define MTK_FE_INT_TSO_ILLEGAL BIT(13) ++#define MTK_FE_INT_TSO_ALIGN BIT(14) ++#define MTK_FE_INT_RFIFO_OV BIT(18) ++#define MTK_FE_INT_RFIFO_UF BIT(19) + #define MTK_GDM1_AF BIT(28) + #define MTK_GDM2_AF BIT(29) + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -716,6 +716,33 @@ int mtk_foe_entry_idle_time(struct mtk_p + return __mtk_foe_entry_idle_time(ppe, entry->data.ib1); + } + ++int mtk_ppe_prepare_reset(struct mtk_ppe *ppe) ++{ ++ if (!ppe) ++ return -EINVAL; ++ ++ /* disable KA */ ++ ppe_clear(ppe, MTK_PPE_TB_CFG, MTK_PPE_TB_CFG_KEEPALIVE); ++ ppe_clear(ppe, MTK_PPE_BIND_LMT1, MTK_PPE_NTU_KEEPALIVE); ++ ppe_w32(ppe, MTK_PPE_KEEPALIVE, 0); ++ usleep_range(10000, 11000); ++ ++ /* set KA timer to maximum */ ++ ppe_set(ppe, MTK_PPE_BIND_LMT1, MTK_PPE_NTU_KEEPALIVE); ++ ppe_w32(ppe, MTK_PPE_KEEPALIVE, 0xffffffff); ++ ++ /* set KA tick select */ ++ ppe_set(ppe, MTK_PPE_TB_CFG, MTK_PPE_TB_TICK_SEL); ++ ppe_set(ppe, MTK_PPE_TB_CFG, MTK_PPE_TB_CFG_KEEPALIVE); ++ usleep_range(10000, 11000); ++ ++ /* disable scan mode */ ++ ppe_clear(ppe, MTK_PPE_TB_CFG, MTK_PPE_TB_CFG_SCAN_MODE); ++ usleep_range(10000, 11000); ++ ++ return mtk_ppe_wait_busy(ppe); ++} ++ + struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, + int version, int index) + { +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -307,6 +307,7 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ + void mtk_ppe_deinit(struct mtk_eth *eth); + void mtk_ppe_start(struct mtk_ppe *ppe); + int mtk_ppe_stop(struct mtk_ppe *ppe); ++int mtk_ppe_prepare_reset(struct mtk_ppe *ppe); + + void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash); + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_regs.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_regs.h +@@ -58,6 +58,12 @@ + #define MTK_PPE_TB_CFG_SCAN_MODE GENMASK(17, 16) + #define MTK_PPE_TB_CFG_HASH_DEBUG GENMASK(19, 18) + #define MTK_PPE_TB_CFG_INFO_SEL BIT(20) ++#define MTK_PPE_TB_TICK_SEL BIT(24) ++ ++#define MTK_PPE_BIND_LMT1 0x230 ++#define MTK_PPE_NTU_KEEPALIVE GENMASK(23, 16) ++ ++#define MTK_PPE_KEEPALIVE 0x234 + + enum { + MTK_PPE_SCAN_MODE_DISABLED, diff --git a/target/linux/generic/backport-5.15/729-21-v6.3-net-ethernet-mtk_eth_soc-add-dma-checks-to-mtk_hw_re.patch b/target/linux/generic/backport-5.15/729-21-v6.3-net-ethernet-mtk_eth_soc-add-dma-checks-to-mtk_hw_re.patch new file mode 100644 index 0000000000..633c66f1c2 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-21-v6.3-net-ethernet-mtk_eth_soc-add-dma-checks-to-mtk_hw_re.patch @@ -0,0 +1,249 @@ +From: Lorenzo Bianconi +Date: Sat, 14 Jan 2023 18:01:31 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add dma checks to + mtk_hw_reset_check + +Introduce mtk_hw_check_dma_hang routine to monitor possible dma hangs. + +Reviewed-by: Leon Romanovsky +Tested-by: Daniel Golle +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Paolo Abeni +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -50,6 +50,7 @@ static const struct mtk_reg_map mtk_reg_ + .delay_irq = 0x0a0c, + .irq_status = 0x0a20, + .irq_mask = 0x0a28, ++ .adma_rx_dbg0 = 0x0a38, + .int_grp = 0x0a50, + }, + .qdma = { +@@ -79,6 +80,8 @@ static const struct mtk_reg_map mtk_reg_ + [0] = 0x2800, + [1] = 0x2c00, + }, ++ .pse_iq_sta = 0x0110, ++ .pse_oq_sta = 0x0118, + }; + + static const struct mtk_reg_map mt7628_reg_map = { +@@ -109,6 +112,7 @@ static const struct mtk_reg_map mt7986_r + .delay_irq = 0x620c, + .irq_status = 0x6220, + .irq_mask = 0x6228, ++ .adma_rx_dbg0 = 0x6238, + .int_grp = 0x6250, + }, + .qdma = { +@@ -138,6 +142,8 @@ static const struct mtk_reg_map mt7986_r + [0] = 0x4800, + [1] = 0x4c00, + }, ++ .pse_iq_sta = 0x0180, ++ .pse_oq_sta = 0x01a0, + }; + + /* strings used by ethtool */ +@@ -3286,6 +3292,102 @@ static void mtk_hw_warm_reset(struct mtk + val, rst_mask); + } + ++static bool mtk_hw_check_dma_hang(struct mtk_eth *eth) ++{ ++ const struct mtk_reg_map *reg_map = eth->soc->reg_map; ++ bool gmac1_tx, gmac2_tx, gdm1_tx, gdm2_tx; ++ bool oq_hang, cdm1_busy, adma_busy; ++ bool wtx_busy, cdm_full, oq_free; ++ u32 wdidx, val, gdm1_fc, gdm2_fc; ++ bool qfsm_hang, qfwd_hang; ++ bool ret = false; ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) ++ return false; ++ ++ /* WDMA sanity checks */ ++ wdidx = mtk_r32(eth, reg_map->wdma_base[0] + 0xc); ++ ++ val = mtk_r32(eth, reg_map->wdma_base[0] + 0x204); ++ wtx_busy = FIELD_GET(MTK_TX_DMA_BUSY, val); ++ ++ val = mtk_r32(eth, reg_map->wdma_base[0] + 0x230); ++ cdm_full = !FIELD_GET(MTK_CDM_TXFIFO_RDY, val); ++ ++ oq_free = (!(mtk_r32(eth, reg_map->pse_oq_sta) & GENMASK(24, 16)) && ++ !(mtk_r32(eth, reg_map->pse_oq_sta + 0x4) & GENMASK(8, 0)) && ++ !(mtk_r32(eth, reg_map->pse_oq_sta + 0x10) & GENMASK(24, 16))); ++ ++ if (wdidx == eth->reset.wdidx && wtx_busy && cdm_full && oq_free) { ++ if (++eth->reset.wdma_hang_count > 2) { ++ eth->reset.wdma_hang_count = 0; ++ ret = true; ++ } ++ goto out; ++ } ++ ++ /* QDMA sanity checks */ ++ qfsm_hang = !!mtk_r32(eth, reg_map->qdma.qtx_cfg + 0x234); ++ qfwd_hang = !mtk_r32(eth, reg_map->qdma.qtx_cfg + 0x308); ++ ++ gdm1_tx = FIELD_GET(GENMASK(31, 16), mtk_r32(eth, MTK_FE_GDM1_FSM)) > 0; ++ gdm2_tx = FIELD_GET(GENMASK(31, 16), mtk_r32(eth, MTK_FE_GDM2_FSM)) > 0; ++ gmac1_tx = FIELD_GET(GENMASK(31, 24), mtk_r32(eth, MTK_MAC_FSM(0))) != 1; ++ gmac2_tx = FIELD_GET(GENMASK(31, 24), mtk_r32(eth, MTK_MAC_FSM(1))) != 1; ++ gdm1_fc = mtk_r32(eth, reg_map->gdm1_cnt + 0x24); ++ gdm2_fc = mtk_r32(eth, reg_map->gdm1_cnt + 0x64); ++ ++ if (qfsm_hang && qfwd_hang && ++ ((gdm1_tx && gmac1_tx && gdm1_fc < 1) || ++ (gdm2_tx && gmac2_tx && gdm2_fc < 1))) { ++ if (++eth->reset.qdma_hang_count > 2) { ++ eth->reset.qdma_hang_count = 0; ++ ret = true; ++ } ++ goto out; ++ } ++ ++ /* ADMA sanity checks */ ++ oq_hang = !!(mtk_r32(eth, reg_map->pse_oq_sta) & GENMASK(8, 0)); ++ cdm1_busy = !!(mtk_r32(eth, MTK_FE_CDM1_FSM) & GENMASK(31, 16)); ++ adma_busy = !(mtk_r32(eth, reg_map->pdma.adma_rx_dbg0) & GENMASK(4, 0)) && ++ !(mtk_r32(eth, reg_map->pdma.adma_rx_dbg0) & BIT(6)); ++ ++ if (oq_hang && cdm1_busy && adma_busy) { ++ if (++eth->reset.adma_hang_count > 2) { ++ eth->reset.adma_hang_count = 0; ++ ret = true; ++ } ++ goto out; ++ } ++ ++ eth->reset.wdma_hang_count = 0; ++ eth->reset.qdma_hang_count = 0; ++ eth->reset.adma_hang_count = 0; ++out: ++ eth->reset.wdidx = wdidx; ++ ++ return ret; ++} ++ ++static void mtk_hw_reset_monitor_work(struct work_struct *work) ++{ ++ struct delayed_work *del_work = to_delayed_work(work); ++ struct mtk_eth *eth = container_of(del_work, struct mtk_eth, ++ reset.monitor_work); ++ ++ if (test_bit(MTK_RESETTING, ð->state)) ++ goto out; ++ ++ /* DMA stuck checks */ ++ if (mtk_hw_check_dma_hang(eth)) ++ schedule_work(ð->pending_work); ++ ++out: ++ schedule_delayed_work(ð->reset.monitor_work, ++ MTK_DMA_MONITOR_TIMEOUT); ++} ++ + static int mtk_hw_init(struct mtk_eth *eth, bool reset) + { + u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA | +@@ -3601,6 +3703,7 @@ static int mtk_cleanup(struct mtk_eth *e + mtk_unreg_dev(eth); + mtk_free_dev(eth); + cancel_work_sync(ð->pending_work); ++ cancel_delayed_work_sync(ð->reset.monitor_work); + + return 0; + } +@@ -4038,6 +4141,7 @@ static int mtk_probe(struct platform_dev + + eth->rx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE; + INIT_WORK(ð->rx_dim.work, mtk_dim_rx); ++ INIT_DELAYED_WORK(ð->reset.monitor_work, mtk_hw_reset_monitor_work); + + eth->tx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE; + INIT_WORK(ð->tx_dim.work, mtk_dim_tx); +@@ -4242,6 +4346,8 @@ static int mtk_probe(struct platform_dev + NAPI_POLL_WEIGHT); + + platform_set_drvdata(pdev, eth); ++ schedule_delayed_work(ð->reset.monitor_work, ++ MTK_DMA_MONITOR_TIMEOUT); + + return 0; + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -256,6 +256,8 @@ + + #define MTK_RX_DONE_INT_V2 BIT(14) + ++#define MTK_CDM_TXFIFO_RDY BIT(7) ++ + /* QDMA Interrupt grouping registers */ + #define MTK_RLS_DONE_INT BIT(0) + +@@ -538,6 +540,17 @@ + #define MT7628_SDM_RBCNT (MT7628_SDM_OFFSET + 0x10c) + #define MT7628_SDM_CS_ERR (MT7628_SDM_OFFSET + 0x110) + ++#define MTK_FE_CDM1_FSM 0x220 ++#define MTK_FE_CDM2_FSM 0x224 ++#define MTK_FE_CDM3_FSM 0x238 ++#define MTK_FE_CDM4_FSM 0x298 ++#define MTK_FE_CDM5_FSM 0x318 ++#define MTK_FE_CDM6_FSM 0x328 ++#define MTK_FE_GDM1_FSM 0x228 ++#define MTK_FE_GDM2_FSM 0x22C ++ ++#define MTK_MAC_FSM(x) (0x1010C + ((x) * 0x100)) ++ + struct mtk_rx_dma { + unsigned int rxd1; + unsigned int rxd2; +@@ -934,6 +947,7 @@ struct mtk_reg_map { + u32 delay_irq; /* delay interrupt */ + u32 irq_status; /* interrupt status */ + u32 irq_mask; /* interrupt mask */ ++ u32 adma_rx_dbg0; + u32 int_grp; + } pdma; + struct { +@@ -960,6 +974,8 @@ struct mtk_reg_map { + u32 gdma_to_ppe0; + u32 ppe_base; + u32 wdma_base[2]; ++ u32 pse_iq_sta; ++ u32 pse_oq_sta; + }; + + /* struct mtk_eth_data - This is the structure holding all differences +@@ -1002,6 +1018,8 @@ struct mtk_soc_data { + } txrx; + }; + ++#define MTK_DMA_MONITOR_TIMEOUT msecs_to_jiffies(1000) ++ + /* currently no SoC has more than 2 macs */ + #define MTK_MAX_DEVS 2 + +@@ -1124,6 +1142,14 @@ struct mtk_eth { + struct rhashtable flow_table; + + struct bpf_prog __rcu *prog; ++ ++ struct { ++ struct delayed_work monitor_work; ++ u32 wdidx; ++ u8 wdma_hang_count; ++ u8 qdma_hang_count; ++ u8 adma_hang_count; ++ } reset; + }; + + /* struct mtk_mac - the structure that holds the info about the MACs of the diff --git a/target/linux/generic/backport-5.15/729-22-v6.3-net-ethernet-mtk_wed-add-reset-reset_complete-callba.patch b/target/linux/generic/backport-5.15/729-22-v6.3-net-ethernet-mtk_wed-add-reset-reset_complete-callba.patch new file mode 100644 index 0000000000..1f61be0a1f --- /dev/null +++ b/target/linux/generic/backport-5.15/729-22-v6.3-net-ethernet-mtk_wed-add-reset-reset_complete-callba.patch @@ -0,0 +1,124 @@ +From: Lorenzo Bianconi +Date: Sat, 14 Jan 2023 18:01:32 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: add reset/reset_complete callbacks + +Introduce reset and reset_complete wlan callback to schedule WLAN driver +reset when ethernet/wed driver is resetting. + +Tested-by: Daniel Golle +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Paolo Abeni +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3632,6 +3632,11 @@ static void mtk_pending_work(struct work + set_bit(MTK_RESETTING, ð->state); + + mtk_prepare_for_reset(eth); ++ mtk_wed_fe_reset(); ++ /* Run again reset preliminary configuration in order to avoid any ++ * possible race during FE reset since it can run releasing RTNL lock. ++ */ ++ mtk_prepare_for_reset(eth); + + /* stop all devices to make sure that dma is properly shut down */ + for (i = 0; i < MTK_MAC_COUNT; i++) { +@@ -3669,6 +3674,8 @@ static void mtk_pending_work(struct work + + clear_bit(MTK_RESETTING, ð->state); + ++ mtk_wed_fe_reset_complete(); ++ + rtnl_unlock(); + } + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -205,6 +205,48 @@ mtk_wed_wo_reset(struct mtk_wed_device * + iounmap(reg); + } + ++void mtk_wed_fe_reset(void) ++{ ++ int i; ++ ++ mutex_lock(&hw_lock); ++ ++ for (i = 0; i < ARRAY_SIZE(hw_list); i++) { ++ struct mtk_wed_hw *hw = hw_list[i]; ++ struct mtk_wed_device *dev = hw->wed_dev; ++ int err; ++ ++ if (!dev || !dev->wlan.reset) ++ continue; ++ ++ /* reset callback blocks until WLAN reset is completed */ ++ err = dev->wlan.reset(dev); ++ if (err) ++ dev_err(dev->dev, "wlan reset failed: %d\n", err); ++ } ++ ++ mutex_unlock(&hw_lock); ++} ++ ++void mtk_wed_fe_reset_complete(void) ++{ ++ int i; ++ ++ mutex_lock(&hw_lock); ++ ++ for (i = 0; i < ARRAY_SIZE(hw_list); i++) { ++ struct mtk_wed_hw *hw = hw_list[i]; ++ struct mtk_wed_device *dev = hw->wed_dev; ++ ++ if (!dev || !dev->wlan.reset_complete) ++ continue; ++ ++ dev->wlan.reset_complete(dev); ++ } ++ ++ mutex_unlock(&hw_lock); ++} ++ + static struct mtk_wed_hw * + mtk_wed_assign(struct mtk_wed_device *dev) + { +--- a/drivers/net/ethernet/mediatek/mtk_wed.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed.h +@@ -128,6 +128,8 @@ void mtk_wed_add_hw(struct device_node * + void mtk_wed_exit(void); + int mtk_wed_flow_add(int index); + void mtk_wed_flow_remove(int index); ++void mtk_wed_fe_reset(void); ++void mtk_wed_fe_reset_complete(void); + #else + static inline void + mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, +@@ -147,6 +149,13 @@ static inline void mtk_wed_flow_remove(i + { + } + ++static inline void mtk_wed_fe_reset(void) ++{ ++} ++ ++static inline void mtk_wed_fe_reset_complete(void) ++{ ++} + #endif + + #ifdef CONFIG_DEBUG_FS +--- a/include/linux/soc/mediatek/mtk_wed.h ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -151,6 +151,8 @@ struct mtk_wed_device { + void (*release_rx_buf)(struct mtk_wed_device *wed); + void (*update_wo_rx_stats)(struct mtk_wed_device *wed, + struct mtk_wed_wo_rx_stats *stats); ++ int (*reset)(struct mtk_wed_device *wed); ++ void (*reset_complete)(struct mtk_wed_device *wed); + } wlan; + #endif + }; diff --git a/target/linux/generic/backport-5.15/729-23-v6.3-net-ethernet-mtk_wed-add-reset-to-rx_ring_setup-call.patch b/target/linux/generic/backport-5.15/729-23-v6.3-net-ethernet-mtk_wed-add-reset-to-rx_ring_setup-call.patch new file mode 100644 index 0000000000..cf81acf491 --- /dev/null +++ b/target/linux/generic/backport-5.15/729-23-v6.3-net-ethernet-mtk_wed-add-reset-to-rx_ring_setup-call.patch @@ -0,0 +1,106 @@ +From: Lorenzo Bianconi +Date: Mon, 5 Dec 2022 12:34:42 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: add reset to rx_ring_setup callback + +This patch adds reset parameter to mtk_wed_rx_ring_setup signature +in order to align rx_ring_setup callback to tx_ring_setup one introduced +in 'commit 23dca7a90017 ("net: ethernet: mtk_wed: add reset to +tx_ring_setup callback")' + +Co-developed-by: Sujuan Chen +Signed-off-by: Sujuan Chen +Signed-off-by: Lorenzo Bianconi +Reviewed-by: Leon Romanovsky +Link: https://lore.kernel.org/r/29c6e7a5469e784406cf3e2920351d1207713d05.1670239984.git.lorenzo@kernel.org +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -1259,7 +1259,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_we + } + + static int +-mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size) ++mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size, ++ bool reset) + { + u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; + struct mtk_wed_ring *wdma; +@@ -1268,8 +1269,8 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_we + return -EINVAL; + + wdma = &dev->tx_wdma[idx]; +- if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size, +- true)) ++ if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, ++ desc_size, true)) + return -ENOMEM; + + wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE, +@@ -1279,6 +1280,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_we + wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0); + wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0); + ++ if (reset) ++ mtk_wed_ring_reset(wdma, MTK_WED_WDMA_RING_SIZE, true); ++ + if (!idx) { + wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_BASE, + wdma->desc_phys); +@@ -1618,18 +1622,20 @@ mtk_wed_txfree_ring_setup(struct mtk_wed + } + + static int +-mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs) ++mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs, ++ bool reset) + { + struct mtk_wed_ring *ring = &dev->rx_ring[idx]; + + if (WARN_ON(idx >= ARRAY_SIZE(dev->rx_ring))) + return -EINVAL; + +- if (mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, +- sizeof(*ring->desc), false)) ++ if (!reset && mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, ++ sizeof(*ring->desc), false)) + return -ENOMEM; + +- if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) ++ if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE, ++ reset)) + return -ENOMEM; + + ring->reg_base = MTK_WED_RING_RX_DATA(idx); +--- a/include/linux/soc/mediatek/mtk_wed.h ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -162,7 +162,7 @@ struct mtk_wed_ops { + int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring, + void __iomem *regs, bool reset); + int (*rx_ring_setup)(struct mtk_wed_device *dev, int ring, +- void __iomem *regs); ++ void __iomem *regs, bool reset); + int (*txfree_ring_setup)(struct mtk_wed_device *dev, + void __iomem *regs); + int (*msg_update)(struct mtk_wed_device *dev, int cmd_id, +@@ -230,8 +230,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_devic + (_dev)->ops->irq_get(_dev, _mask) + #define mtk_wed_device_irq_set_mask(_dev, _mask) \ + (_dev)->ops->irq_set_mask(_dev, _mask) +-#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) \ +- (_dev)->ops->rx_ring_setup(_dev, _ring, _regs) ++#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) \ ++ (_dev)->ops->rx_ring_setup(_dev, _ring, _regs, _reset) + #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) \ + (_dev)->ops->ppe_check(_dev, _skb, _reason, _hash) + #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) \ +@@ -251,7 +251,7 @@ static inline bool mtk_wed_device_active + #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0) + #define mtk_wed_device_irq_get(_dev, _mask) 0 + #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0) +-#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) -ENODEV ++#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) -ENODEV + #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) do {} while (0) + #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) -ENODEV + #define mtk_wed_device_stop(_dev) do {} while (0) diff --git a/target/linux/generic/backport-5.15/730-01-v6.3-net-ethernet-mtk_eth_soc-account-for-vlan-in-rx-head.patch b/target/linux/generic/backport-5.15/730-01-v6.3-net-ethernet-mtk_eth_soc-account-for-vlan-in-rx-head.patch new file mode 100644 index 0000000000..45af898cf0 --- /dev/null +++ b/target/linux/generic/backport-5.15/730-01-v6.3-net-ethernet-mtk_eth_soc-account-for-vlan-in-rx-head.patch @@ -0,0 +1,22 @@ +From: Felix Fietkau +Date: Thu, 27 Oct 2022 19:50:31 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: account for vlan in rx + header length + +The network stack assumes that devices can handle an extra VLAN tag without +increasing the MTU + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -29,7 +29,7 @@ + #define MTK_TX_DMA_BUF_LEN_V2 0xffff + #define MTK_DMA_SIZE 512 + #define MTK_MAC_COUNT 2 +-#define MTK_RX_ETH_HLEN (ETH_HLEN + ETH_FCS_LEN) ++#define MTK_RX_ETH_HLEN (VLAN_ETH_HLEN + ETH_FCS_LEN) + #define MTK_RX_HLEN (NET_SKB_PAD + MTK_RX_ETH_HLEN + NET_IP_ALIGN) + #define MTK_DMA_DUMMY_DESC 0xffffffff + #define MTK_DEFAULT_MSG_ENABLE (NETIF_MSG_DRV | \ diff --git a/target/linux/generic/backport-5.15/730-02-v6.3-net-ethernet-mtk_eth_soc-increase-tx-ring-side-for-Q.patch b/target/linux/generic/backport-5.15/730-02-v6.3-net-ethernet-mtk_eth_soc-increase-tx-ring-side-for-Q.patch new file mode 100644 index 0000000000..8b6d9e908f --- /dev/null +++ b/target/linux/generic/backport-5.15/730-02-v6.3-net-ethernet-mtk_eth_soc-increase-tx-ring-side-for-Q.patch @@ -0,0 +1,143 @@ +From: Felix Fietkau +Date: Thu, 27 Oct 2022 19:53:57 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: increase tx ring side for + QDMA devices + +In order to use the hardware traffic shaper feature, a larger tx ring is +needed, especially for the scratch ring, which the hardware shaper uses to +reorder packets. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -901,7 +901,7 @@ static int mtk_init_fq_dma(struct mtk_et + { + const struct mtk_soc_data *soc = eth->soc; + dma_addr_t phy_ring_tail; +- int cnt = MTK_DMA_SIZE; ++ int cnt = MTK_QDMA_RING_SIZE; + dma_addr_t dma_addr; + int i; + +@@ -2155,19 +2155,25 @@ static int mtk_tx_alloc(struct mtk_eth * + struct mtk_tx_ring *ring = ð->tx_ring; + int i, sz = soc->txrx.txd_size; + struct mtk_tx_dma_v2 *txd; ++ int ring_size; + +- ring->buf = kcalloc(MTK_DMA_SIZE, sizeof(*ring->buf), ++ if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) ++ ring_size = MTK_QDMA_RING_SIZE; ++ else ++ ring_size = MTK_DMA_SIZE; ++ ++ ring->buf = kcalloc(ring_size, sizeof(*ring->buf), + GFP_KERNEL); + if (!ring->buf) + goto no_tx_mem; + +- ring->dma = dma_alloc_coherent(eth->dma_dev, MTK_DMA_SIZE * sz, ++ ring->dma = dma_alloc_coherent(eth->dma_dev, ring_size * sz, + &ring->phys, GFP_KERNEL); + if (!ring->dma) + goto no_tx_mem; + +- for (i = 0; i < MTK_DMA_SIZE; i++) { +- int next = (i + 1) % MTK_DMA_SIZE; ++ for (i = 0; i < ring_size; i++) { ++ int next = (i + 1) % ring_size; + u32 next_ptr = ring->phys + next * sz; + + txd = ring->dma + i * sz; +@@ -2187,22 +2193,22 @@ static int mtk_tx_alloc(struct mtk_eth * + * descriptors in ring->dma_pdma. + */ + if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { +- ring->dma_pdma = dma_alloc_coherent(eth->dma_dev, MTK_DMA_SIZE * sz, ++ ring->dma_pdma = dma_alloc_coherent(eth->dma_dev, ring_size * sz, + &ring->phys_pdma, GFP_KERNEL); + if (!ring->dma_pdma) + goto no_tx_mem; + +- for (i = 0; i < MTK_DMA_SIZE; i++) { ++ for (i = 0; i < ring_size; i++) { + ring->dma_pdma[i].txd2 = TX_DMA_DESP2_DEF; + ring->dma_pdma[i].txd4 = 0; + } + } + +- ring->dma_size = MTK_DMA_SIZE; +- atomic_set(&ring->free_count, MTK_DMA_SIZE - 2); ++ ring->dma_size = ring_size; ++ atomic_set(&ring->free_count, ring_size - 2); + ring->next_free = ring->dma; + ring->last_free = (void *)txd; +- ring->last_free_ptr = (u32)(ring->phys + ((MTK_DMA_SIZE - 1) * sz)); ++ ring->last_free_ptr = (u32)(ring->phys + ((ring_size - 1) * sz)); + ring->thresh = MAX_SKB_FRAGS; + + /* make sure that all changes to the dma ring are flushed before we +@@ -2214,14 +2220,14 @@ static int mtk_tx_alloc(struct mtk_eth * + mtk_w32(eth, ring->phys, soc->reg_map->qdma.ctx_ptr); + mtk_w32(eth, ring->phys, soc->reg_map->qdma.dtx_ptr); + mtk_w32(eth, +- ring->phys + ((MTK_DMA_SIZE - 1) * sz), ++ ring->phys + ((ring_size - 1) * sz), + soc->reg_map->qdma.crx_ptr); + mtk_w32(eth, ring->last_free_ptr, soc->reg_map->qdma.drx_ptr); + mtk_w32(eth, (QDMA_RES_THRES << 8) | QDMA_RES_THRES, + soc->reg_map->qdma.qtx_cfg); + } else { + mtk_w32(eth, ring->phys_pdma, MT7628_TX_BASE_PTR0); +- mtk_w32(eth, MTK_DMA_SIZE, MT7628_TX_MAX_CNT0); ++ mtk_w32(eth, ring_size, MT7628_TX_MAX_CNT0); + mtk_w32(eth, 0, MT7628_TX_CTX_IDX0); + mtk_w32(eth, MT7628_PST_DTX_IDX0, soc->reg_map->pdma.rst_idx); + } +@@ -2239,7 +2245,7 @@ static void mtk_tx_clean(struct mtk_eth + int i; + + if (ring->buf) { +- for (i = 0; i < MTK_DMA_SIZE; i++) ++ for (i = 0; i < ring->dma_size; i++) + mtk_tx_unmap(eth, &ring->buf[i], false); + kfree(ring->buf); + ring->buf = NULL; +@@ -2247,14 +2253,14 @@ static void mtk_tx_clean(struct mtk_eth + + if (ring->dma) { + dma_free_coherent(eth->dma_dev, +- MTK_DMA_SIZE * soc->txrx.txd_size, ++ ring->dma_size * soc->txrx.txd_size, + ring->dma, ring->phys); + ring->dma = NULL; + } + + if (ring->dma_pdma) { + dma_free_coherent(eth->dma_dev, +- MTK_DMA_SIZE * soc->txrx.txd_size, ++ ring->dma_size * soc->txrx.txd_size, + ring->dma_pdma, ring->phys_pdma); + ring->dma_pdma = NULL; + } +@@ -2777,7 +2783,7 @@ static void mtk_dma_free(struct mtk_eth + netdev_reset_queue(eth->netdev[i]); + if (eth->scratch_ring) { + dma_free_coherent(eth->dma_dev, +- MTK_DMA_SIZE * soc->txrx.txd_size, ++ MTK_QDMA_RING_SIZE * soc->txrx.txd_size, + eth->scratch_ring, eth->phy_scratch_ring); + eth->scratch_ring = NULL; + eth->phy_scratch_ring = 0; +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -27,6 +27,7 @@ + #define MTK_MAX_RX_LENGTH_2K 2048 + #define MTK_TX_DMA_BUF_LEN 0x3fff + #define MTK_TX_DMA_BUF_LEN_V2 0xffff ++#define MTK_QDMA_RING_SIZE 2048 + #define MTK_DMA_SIZE 512 + #define MTK_MAC_COUNT 2 + #define MTK_RX_ETH_HLEN (VLAN_ETH_HLEN + ETH_FCS_LEN) diff --git a/target/linux/generic/backport-5.15/730-03-v6.3-net-ethernet-mtk_eth_soc-avoid-port_mg-assignment-on.patch b/target/linux/generic/backport-5.15/730-03-v6.3-net-ethernet-mtk_eth_soc-avoid-port_mg-assignment-on.patch new file mode 100644 index 0000000000..391727b30d --- /dev/null +++ b/target/linux/generic/backport-5.15/730-03-v6.3-net-ethernet-mtk_eth_soc-avoid-port_mg-assignment-on.patch @@ -0,0 +1,52 @@ +From: Felix Fietkau +Date: Fri, 4 Nov 2022 19:49:08 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: avoid port_mg assignment on + MT7622 and newer + +On newer chips, this field is unused and contains some bits related to queue +assignment. Initialize it to 0 in those cases. +Fix offload_version on MT7621 and MT7623, which still need the previous value. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4425,7 +4425,7 @@ static const struct mtk_soc_data mt7621_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7621_CLKS_BITMAP, + .required_pctl = false, +- .offload_version = 2, ++ .offload_version = 1, + .hash_offset = 2, + .foe_entry_size = sizeof(struct mtk_foe_entry) - 16, + .txrx = { +@@ -4464,7 +4464,7 @@ static const struct mtk_soc_data mt7623_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7623_CLKS_BITMAP, + .required_pctl = true, +- .offload_version = 2, ++ .offload_version = 1, + .hash_offset = 2, + .foe_entry_size = sizeof(struct mtk_foe_entry) - 16, + .txrx = { +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -175,6 +175,8 @@ int mtk_foe_entry_prepare(struct mtk_eth + val = FIELD_PREP(MTK_FOE_IB2_DEST_PORT_V2, pse_port) | + FIELD_PREP(MTK_FOE_IB2_PORT_AG_V2, 0xf); + } else { ++ int port_mg = eth->soc->offload_version > 1 ? 0 : 0x3f; ++ + val = FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND) | + FIELD_PREP(MTK_FOE_IB1_PACKET_TYPE, type) | + FIELD_PREP(MTK_FOE_IB1_UDP, l4proto == IPPROTO_UDP) | +@@ -182,7 +184,7 @@ int mtk_foe_entry_prepare(struct mtk_eth + entry->ib1 = val; + + val = FIELD_PREP(MTK_FOE_IB2_DEST_PORT, pse_port) | +- FIELD_PREP(MTK_FOE_IB2_PORT_MG, 0x3f) | ++ FIELD_PREP(MTK_FOE_IB2_PORT_MG, port_mg) | + FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0x1f); + } + diff --git a/target/linux/generic/backport-5.15/730-04-v6.3-net-ethernet-mtk_eth_soc-implement-multi-queue-suppo.patch b/target/linux/generic/backport-5.15/730-04-v6.3-net-ethernet-mtk_eth_soc-implement-multi-queue-suppo.patch new file mode 100644 index 0000000000..8e743dd02a --- /dev/null +++ b/target/linux/generic/backport-5.15/730-04-v6.3-net-ethernet-mtk_eth_soc-implement-multi-queue-suppo.patch @@ -0,0 +1,654 @@ +From: Felix Fietkau +Date: Thu, 27 Oct 2022 20:17:27 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: implement multi-queue + support for per-port queues + +When sending traffic to multiple ports with different link speeds, queued +packets to one port can drown out tx to other ports. +In order to better handle transmission to multiple ports, use the hardware +shaper feature to implement weighted fair queueing between ports. +Weight and maximum rate are automatically adjusted based on the link speed +of the port. +The first 3 queues are unrestricted and reserved for non-DSA direct tx on +GMAC ports. The following queues are automatically assigned by the MTK DSA +tag driver based on the target port number. +The PPE offload code configures the queues for offloaded traffic in the same +way. +This feature is only supported on devices supporting QDMA. All queues still +share the same DMA ring and descriptor pool. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -55,6 +55,7 @@ static const struct mtk_reg_map mtk_reg_ + }, + .qdma = { + .qtx_cfg = 0x1800, ++ .qtx_sch = 0x1804, + .rx_ptr = 0x1900, + .rx_cnt_cfg = 0x1904, + .qcrx_ptr = 0x1908, +@@ -62,6 +63,7 @@ static const struct mtk_reg_map mtk_reg_ + .rst_idx = 0x1a08, + .delay_irq = 0x1a0c, + .fc_th = 0x1a10, ++ .tx_sch_rate = 0x1a14, + .int_grp = 0x1a20, + .hred = 0x1a44, + .ctx_ptr = 0x1b00, +@@ -117,6 +119,7 @@ static const struct mtk_reg_map mt7986_r + }, + .qdma = { + .qtx_cfg = 0x4400, ++ .qtx_sch = 0x4404, + .rx_ptr = 0x4500, + .rx_cnt_cfg = 0x4504, + .qcrx_ptr = 0x4508, +@@ -134,6 +137,7 @@ static const struct mtk_reg_map mt7986_r + .fq_tail = 0x4724, + .fq_count = 0x4728, + .fq_blen = 0x472c, ++ .tx_sch_rate = 0x4798, + }, + .gdm1_cnt = 0x1c00, + .gdma_to_ppe0 = 0x3333, +@@ -577,6 +581,75 @@ static void mtk_mac_link_down(struct phy + mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id)); + } + ++static void mtk_set_queue_speed(struct mtk_eth *eth, unsigned int idx, ++ int speed) ++{ ++ const struct mtk_soc_data *soc = eth->soc; ++ u32 ofs, val; ++ ++ if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) ++ return; ++ ++ val = MTK_QTX_SCH_MIN_RATE_EN | ++ /* minimum: 10 Mbps */ ++ FIELD_PREP(MTK_QTX_SCH_MIN_RATE_MAN, 1) | ++ FIELD_PREP(MTK_QTX_SCH_MIN_RATE_EXP, 4) | ++ MTK_QTX_SCH_LEAKY_BUCKET_SIZE; ++ if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ val |= MTK_QTX_SCH_LEAKY_BUCKET_EN; ++ ++ if (IS_ENABLED(CONFIG_SOC_MT7621)) { ++ switch (speed) { ++ case SPEED_10: ++ val |= MTK_QTX_SCH_MAX_RATE_EN | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_MAN, 103) | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_EXP, 2) | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_WEIGHT, 1); ++ break; ++ case SPEED_100: ++ val |= MTK_QTX_SCH_MAX_RATE_EN | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_MAN, 103) | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_EXP, 3); ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_WEIGHT, 1); ++ break; ++ case SPEED_1000: ++ val |= MTK_QTX_SCH_MAX_RATE_EN | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_MAN, 105) | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_EXP, 4) | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_WEIGHT, 10); ++ break; ++ default: ++ break; ++ } ++ } else { ++ switch (speed) { ++ case SPEED_10: ++ val |= MTK_QTX_SCH_MAX_RATE_EN | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_MAN, 1) | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_EXP, 4) | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_WEIGHT, 1); ++ break; ++ case SPEED_100: ++ val |= MTK_QTX_SCH_MAX_RATE_EN | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_MAN, 1) | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_EXP, 5); ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_WEIGHT, 1); ++ break; ++ case SPEED_1000: ++ val |= MTK_QTX_SCH_MAX_RATE_EN | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_MAN, 10) | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_EXP, 5) | ++ FIELD_PREP(MTK_QTX_SCH_MAX_RATE_WEIGHT, 10); ++ break; ++ default: ++ break; ++ } ++ } ++ ++ ofs = MTK_QTX_OFFSET * idx; ++ mtk_w32(eth, val, soc->reg_map->qdma.qtx_sch + ofs); ++} ++ + static void mtk_mac_link_up(struct phylink_config *config, + struct phy_device *phy, + unsigned int mode, phy_interface_t interface, +@@ -602,6 +675,8 @@ static void mtk_mac_link_up(struct phyli + break; + } + ++ mtk_set_queue_speed(mac->hw, mac->id, speed); ++ + /* Configure duplex */ + if (duplex == DUPLEX_FULL) + mcr |= MAC_MCR_FORCE_DPX; +@@ -1060,7 +1135,8 @@ static void mtk_tx_set_dma_desc_v1(struc + + WRITE_ONCE(desc->txd1, info->addr); + +- data = TX_DMA_SWC | TX_DMA_PLEN0(info->size); ++ data = TX_DMA_SWC | TX_DMA_PLEN0(info->size) | ++ FIELD_PREP(TX_DMA_PQID, info->qid); + if (info->last) + data |= TX_DMA_LS0; + WRITE_ONCE(desc->txd3, data); +@@ -1094,9 +1170,6 @@ static void mtk_tx_set_dma_desc_v2(struc + data |= TX_DMA_LS0; + WRITE_ONCE(desc->txd3, data); + +- if (!info->qid && mac->id) +- info->qid = MTK_QDMA_GMAC2_QID; +- + data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */ + data |= TX_DMA_SWC_V2 | QID_BITS_V2(info->qid); + WRITE_ONCE(desc->txd4, data); +@@ -1140,11 +1213,12 @@ static int mtk_tx_map(struct sk_buff *sk + .gso = gso, + .csum = skb->ip_summed == CHECKSUM_PARTIAL, + .vlan = skb_vlan_tag_present(skb), +- .qid = skb->mark & MTK_QDMA_TX_MASK, ++ .qid = skb_get_queue_mapping(skb), + .vlan_tci = skb_vlan_tag_get(skb), + .first = true, + .last = !skb_is_nonlinear(skb), + }; ++ struct netdev_queue *txq; + struct mtk_mac *mac = netdev_priv(dev); + struct mtk_eth *eth = mac->hw; + const struct mtk_soc_data *soc = eth->soc; +@@ -1152,8 +1226,10 @@ static int mtk_tx_map(struct sk_buff *sk + struct mtk_tx_dma *itxd_pdma, *txd_pdma; + struct mtk_tx_buf *itx_buf, *tx_buf; + int i, n_desc = 1; ++ int queue = skb_get_queue_mapping(skb); + int k = 0; + ++ txq = netdev_get_tx_queue(dev, queue); + itxd = ring->next_free; + itxd_pdma = qdma_to_pdma(ring, itxd); + if (itxd == ring->last_free) +@@ -1202,7 +1278,7 @@ static int mtk_tx_map(struct sk_buff *sk + memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info)); + txd_info.size = min_t(unsigned int, frag_size, + soc->txrx.dma_max_len); +- txd_info.qid = skb->mark & MTK_QDMA_TX_MASK; ++ txd_info.qid = queue; + txd_info.last = i == skb_shinfo(skb)->nr_frags - 1 && + !(frag_size - txd_info.size); + txd_info.addr = skb_frag_dma_map(eth->dma_dev, frag, +@@ -1241,7 +1317,7 @@ static int mtk_tx_map(struct sk_buff *sk + txd_pdma->txd2 |= TX_DMA_LS1; + } + +- netdev_sent_queue(dev, skb->len); ++ netdev_tx_sent_queue(txq, skb->len); + skb_tx_timestamp(skb); + + ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2); +@@ -1253,8 +1329,7 @@ static int mtk_tx_map(struct sk_buff *sk + wmb(); + + if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { +- if (netif_xmit_stopped(netdev_get_tx_queue(dev, 0)) || +- !netdev_xmit_more()) ++ if (netif_xmit_stopped(txq) || !netdev_xmit_more()) + mtk_w32(eth, txd->txd2, soc->reg_map->qdma.ctx_ptr); + } else { + int next_idx; +@@ -1323,7 +1398,7 @@ static void mtk_wake_queue(struct mtk_et + for (i = 0; i < MTK_MAC_COUNT; i++) { + if (!eth->netdev[i]) + continue; +- netif_wake_queue(eth->netdev[i]); ++ netif_tx_wake_all_queues(eth->netdev[i]); + } + } + +@@ -1347,7 +1422,7 @@ static netdev_tx_t mtk_start_xmit(struct + + tx_num = mtk_cal_txd_req(eth, skb); + if (unlikely(atomic_read(&ring->free_count) <= tx_num)) { +- netif_stop_queue(dev); ++ netif_tx_stop_all_queues(dev); + netif_err(eth, tx_queued, dev, + "Tx Ring full when queue awake!\n"); + spin_unlock(ð->page_lock); +@@ -1373,7 +1448,7 @@ static netdev_tx_t mtk_start_xmit(struct + goto drop; + + if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) +- netif_stop_queue(dev); ++ netif_tx_stop_all_queues(dev); + + spin_unlock(ð->page_lock); + +@@ -1540,10 +1615,12 @@ static int mtk_xdp_submit_frame(struct m + struct skb_shared_info *sinfo = xdp_get_shared_info_from_frame(xdpf); + const struct mtk_soc_data *soc = eth->soc; + struct mtk_tx_ring *ring = ð->tx_ring; ++ struct mtk_mac *mac = netdev_priv(dev); + struct mtk_tx_dma_desc_info txd_info = { + .size = xdpf->len, + .first = true, + .last = !xdp_frame_has_frags(xdpf), ++ .qid = mac->id, + }; + int err, index = 0, n_desc = 1, nr_frags; + struct mtk_tx_dma *htxd, *txd, *txd_pdma; +@@ -1594,6 +1671,7 @@ static int mtk_xdp_submit_frame(struct m + memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info)); + txd_info.size = skb_frag_size(&sinfo->frags[index]); + txd_info.last = index + 1 == nr_frags; ++ txd_info.qid = mac->id; + data = skb_frag_address(&sinfo->frags[index]); + + index++; +@@ -1945,8 +2023,46 @@ rx_done: + return done; + } + ++struct mtk_poll_state { ++ struct netdev_queue *txq; ++ unsigned int total; ++ unsigned int done; ++ unsigned int bytes; ++}; ++ ++static void ++mtk_poll_tx_done(struct mtk_eth *eth, struct mtk_poll_state *state, u8 mac, ++ struct sk_buff *skb) ++{ ++ struct netdev_queue *txq; ++ struct net_device *dev; ++ unsigned int bytes = skb->len; ++ ++ state->total++; ++ eth->tx_packets++; ++ eth->tx_bytes += bytes; ++ ++ dev = eth->netdev[mac]; ++ if (!dev) ++ return; ++ ++ txq = netdev_get_tx_queue(dev, skb_get_queue_mapping(skb)); ++ if (state->txq == txq) { ++ state->done++; ++ state->bytes += bytes; ++ return; ++ } ++ ++ if (state->txq) ++ netdev_tx_completed_queue(state->txq, state->done, state->bytes); ++ ++ state->txq = txq; ++ state->done = 1; ++ state->bytes = bytes; ++} ++ + static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget, +- unsigned int *done, unsigned int *bytes) ++ struct mtk_poll_state *state) + { + const struct mtk_reg_map *reg_map = eth->soc->reg_map; + struct mtk_tx_ring *ring = ð->tx_ring; +@@ -1976,12 +2092,9 @@ static int mtk_poll_tx_qdma(struct mtk_e + break; + + if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { +- if (tx_buf->type == MTK_TYPE_SKB) { +- struct sk_buff *skb = tx_buf->data; ++ if (tx_buf->type == MTK_TYPE_SKB) ++ mtk_poll_tx_done(eth, state, mac, tx_buf->data); + +- bytes[mac] += skb->len; +- done[mac]++; +- } + budget--; + } + mtk_tx_unmap(eth, tx_buf, true); +@@ -1999,7 +2112,7 @@ static int mtk_poll_tx_qdma(struct mtk_e + } + + static int mtk_poll_tx_pdma(struct mtk_eth *eth, int budget, +- unsigned int *done, unsigned int *bytes) ++ struct mtk_poll_state *state) + { + struct mtk_tx_ring *ring = ð->tx_ring; + struct mtk_tx_buf *tx_buf; +@@ -2015,12 +2128,8 @@ static int mtk_poll_tx_pdma(struct mtk_e + break; + + if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { +- if (tx_buf->type == MTK_TYPE_SKB) { +- struct sk_buff *skb = tx_buf->data; +- +- bytes[0] += skb->len; +- done[0]++; +- } ++ if (tx_buf->type == MTK_TYPE_SKB) ++ mtk_poll_tx_done(eth, state, 0, tx_buf->data); + budget--; + } + mtk_tx_unmap(eth, tx_buf, true); +@@ -2041,26 +2150,15 @@ static int mtk_poll_tx(struct mtk_eth *e + { + struct mtk_tx_ring *ring = ð->tx_ring; + struct dim_sample dim_sample = {}; +- unsigned int done[MTK_MAX_DEVS]; +- unsigned int bytes[MTK_MAX_DEVS]; +- int total = 0, i; +- +- memset(done, 0, sizeof(done)); +- memset(bytes, 0, sizeof(bytes)); ++ struct mtk_poll_state state = {}; + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) +- budget = mtk_poll_tx_qdma(eth, budget, done, bytes); ++ budget = mtk_poll_tx_qdma(eth, budget, &state); + else +- budget = mtk_poll_tx_pdma(eth, budget, done, bytes); ++ budget = mtk_poll_tx_pdma(eth, budget, &state); + +- for (i = 0; i < MTK_MAC_COUNT; i++) { +- if (!eth->netdev[i] || !done[i]) +- continue; +- netdev_completed_queue(eth->netdev[i], done[i], bytes[i]); +- total += done[i]; +- eth->tx_packets += done[i]; +- eth->tx_bytes += bytes[i]; +- } ++ if (state.txq) ++ netdev_tx_completed_queue(state.txq, state.done, state.bytes); + + dim_update_sample(eth->tx_events, eth->tx_packets, eth->tx_bytes, + &dim_sample); +@@ -2070,7 +2168,7 @@ static int mtk_poll_tx(struct mtk_eth *e + (atomic_read(&ring->free_count) > ring->thresh)) + mtk_wake_queue(eth); + +- return total; ++ return state.total; + } + + static void mtk_handle_status_irq(struct mtk_eth *eth) +@@ -2156,6 +2254,7 @@ static int mtk_tx_alloc(struct mtk_eth * + int i, sz = soc->txrx.txd_size; + struct mtk_tx_dma_v2 *txd; + int ring_size; ++ u32 ofs, val; + + if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) + ring_size = MTK_QDMA_RING_SIZE; +@@ -2223,8 +2322,25 @@ static int mtk_tx_alloc(struct mtk_eth * + ring->phys + ((ring_size - 1) * sz), + soc->reg_map->qdma.crx_ptr); + mtk_w32(eth, ring->last_free_ptr, soc->reg_map->qdma.drx_ptr); +- mtk_w32(eth, (QDMA_RES_THRES << 8) | QDMA_RES_THRES, +- soc->reg_map->qdma.qtx_cfg); ++ ++ for (i = 0, ofs = 0; i < MTK_QDMA_NUM_QUEUES; i++) { ++ val = (QDMA_RES_THRES << 8) | QDMA_RES_THRES; ++ mtk_w32(eth, val, soc->reg_map->qdma.qtx_cfg + ofs); ++ ++ val = MTK_QTX_SCH_MIN_RATE_EN | ++ /* minimum: 10 Mbps */ ++ FIELD_PREP(MTK_QTX_SCH_MIN_RATE_MAN, 1) | ++ FIELD_PREP(MTK_QTX_SCH_MIN_RATE_EXP, 4) | ++ MTK_QTX_SCH_LEAKY_BUCKET_SIZE; ++ if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ val |= MTK_QTX_SCH_LEAKY_BUCKET_EN; ++ mtk_w32(eth, val, soc->reg_map->qdma.qtx_sch + ofs); ++ ofs += MTK_QTX_OFFSET; ++ } ++ val = MTK_QDMA_TX_SCH_MAX_WFQ | (MTK_QDMA_TX_SCH_MAX_WFQ << 16); ++ mtk_w32(eth, val, soc->reg_map->qdma.tx_sch_rate); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ mtk_w32(eth, val, soc->reg_map->qdma.tx_sch_rate + 4); + } else { + mtk_w32(eth, ring->phys_pdma, MT7628_TX_BASE_PTR0); + mtk_w32(eth, ring_size, MT7628_TX_MAX_CNT0); +@@ -2907,7 +3023,7 @@ static int mtk_start_dma(struct mtk_eth + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) + val |= MTK_MUTLI_CNT | MTK_RESV_BUF | + MTK_WCOMP_EN | MTK_DMAD_WR_WDONE | +- MTK_CHK_DDONE_EN; ++ MTK_CHK_DDONE_EN | MTK_LEAKY_BUCKET_EN; + else + val |= MTK_RX_BT_32DWORDS; + mtk_w32(eth, val, reg_map->qdma.glo_cfg); +@@ -2953,6 +3069,45 @@ static void mtk_gdm_config(struct mtk_et + mtk_w32(eth, 0, MTK_RST_GL); + } + ++static int mtk_device_event(struct notifier_block *n, unsigned long event, void *ptr) ++{ ++ struct mtk_mac *mac = container_of(n, struct mtk_mac, device_notifier); ++ struct mtk_eth *eth = mac->hw; ++ struct net_device *dev = netdev_notifier_info_to_dev(ptr); ++ struct ethtool_link_ksettings s; ++ struct net_device *ldev; ++ struct list_head *iter; ++ struct dsa_port *dp; ++ ++ if (event != NETDEV_CHANGE) ++ return NOTIFY_DONE; ++ ++ netdev_for_each_lower_dev(dev, ldev, iter) { ++ if (netdev_priv(ldev) == mac) ++ goto found; ++ } ++ ++ return NOTIFY_DONE; ++ ++found: ++ if (!dsa_slave_dev_check(dev)) ++ return NOTIFY_DONE; ++ ++ if (__ethtool_get_link_ksettings(dev, &s)) ++ return NOTIFY_DONE; ++ ++ if (s.base.speed == 0 || s.base.speed == ((__u32)-1)) ++ return NOTIFY_DONE; ++ ++ dp = dsa_port_from_netdev(dev); ++ if (dp->index >= MTK_QDMA_NUM_QUEUES) ++ return NOTIFY_DONE; ++ ++ mtk_set_queue_speed(eth, dp->index + 3, s.base.speed); ++ ++ return NOTIFY_DONE; ++} ++ + static int mtk_open(struct net_device *dev) + { + struct mtk_mac *mac = netdev_priv(dev); +@@ -2997,7 +3152,8 @@ static int mtk_open(struct net_device *d + refcount_inc(ð->dma_refcnt); + + phylink_start(mac->phylink); +- netif_start_queue(dev); ++ netif_tx_start_all_queues(dev); ++ + return 0; + } + +@@ -3703,8 +3859,12 @@ static int mtk_unreg_dev(struct mtk_eth + int i; + + for (i = 0; i < MTK_MAC_COUNT; i++) { ++ struct mtk_mac *mac; + if (!eth->netdev[i]) + continue; ++ mac = netdev_priv(eth->netdev[i]); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) ++ unregister_netdevice_notifier(&mac->device_notifier); + unregister_netdev(eth->netdev[i]); + } + +@@ -3921,6 +4081,23 @@ static int mtk_set_rxnfc(struct net_devi + return ret; + } + ++static u16 mtk_select_queue(struct net_device *dev, struct sk_buff *skb, ++ struct net_device *sb_dev) ++{ ++ struct mtk_mac *mac = netdev_priv(dev); ++ unsigned int queue = 0; ++ ++ if (netdev_uses_dsa(dev)) ++ queue = skb_get_queue_mapping(skb) + 3; ++ else ++ queue = mac->id; ++ ++ if (queue >= dev->num_tx_queues) ++ queue = 0; ++ ++ return queue; ++} ++ + static const struct ethtool_ops mtk_ethtool_ops = { + .get_link_ksettings = mtk_get_link_ksettings, + .set_link_ksettings = mtk_set_link_ksettings, +@@ -3955,6 +4132,7 @@ static const struct net_device_ops mtk_n + .ndo_setup_tc = mtk_eth_setup_tc, + .ndo_bpf = mtk_xdp, + .ndo_xdp_xmit = mtk_xdp_xmit, ++ .ndo_select_queue = mtk_select_queue, + }; + + static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) +@@ -3964,6 +4142,7 @@ static int mtk_add_mac(struct mtk_eth *e + struct phylink *phylink; + struct mtk_mac *mac; + int id, err; ++ int txqs = 1; + + if (!_id) { + dev_err(eth->dev, "missing mac id\n"); +@@ -3981,7 +4160,10 @@ static int mtk_add_mac(struct mtk_eth *e + return -EINVAL; + } + +- eth->netdev[id] = alloc_etherdev(sizeof(*mac)); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) ++ txqs = MTK_QDMA_NUM_QUEUES; ++ ++ eth->netdev[id] = alloc_etherdev_mqs(sizeof(*mac), txqs, 1); + if (!eth->netdev[id]) { + dev_err(eth->dev, "alloc_etherdev failed\n"); + return -ENOMEM; +@@ -4089,6 +4271,11 @@ static int mtk_add_mac(struct mtk_eth *e + else + eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH_2K - MTK_RX_ETH_HLEN; + ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { ++ mac->device_notifier.notifier_call = mtk_device_event; ++ register_netdevice_notifier(&mac->device_notifier); ++ } ++ + return 0; + + free_netdev: +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -22,6 +22,7 @@ + #include + #include "mtk_ppe.h" + ++#define MTK_QDMA_NUM_QUEUES 16 + #define MTK_QDMA_PAGE_SIZE 2048 + #define MTK_MAX_RX_LENGTH 1536 + #define MTK_MAX_RX_LENGTH_2K 2048 +@@ -215,8 +216,26 @@ + #define MTK_RING_MAX_AGG_CNT_H ((MTK_HW_LRO_MAX_AGG_CNT >> 6) & 0x3) + + /* QDMA TX Queue Configuration Registers */ ++#define MTK_QTX_OFFSET 0x10 + #define QDMA_RES_THRES 4 + ++/* QDMA Tx Queue Scheduler Configuration Registers */ ++#define MTK_QTX_SCH_TX_SEL BIT(31) ++#define MTK_QTX_SCH_TX_SEL_V2 GENMASK(31, 30) ++ ++#define MTK_QTX_SCH_LEAKY_BUCKET_EN BIT(30) ++#define MTK_QTX_SCH_LEAKY_BUCKET_SIZE GENMASK(29, 28) ++#define MTK_QTX_SCH_MIN_RATE_EN BIT(27) ++#define MTK_QTX_SCH_MIN_RATE_MAN GENMASK(26, 20) ++#define MTK_QTX_SCH_MIN_RATE_EXP GENMASK(19, 16) ++#define MTK_QTX_SCH_MAX_RATE_WEIGHT GENMASK(15, 12) ++#define MTK_QTX_SCH_MAX_RATE_EN BIT(11) ++#define MTK_QTX_SCH_MAX_RATE_MAN GENMASK(10, 4) ++#define MTK_QTX_SCH_MAX_RATE_EXP GENMASK(3, 0) ++ ++/* QDMA TX Scheduler Rate Control Register */ ++#define MTK_QDMA_TX_SCH_MAX_WFQ BIT(15) ++ + /* QDMA Global Configuration Register */ + #define MTK_RX_2B_OFFSET BIT(31) + #define MTK_RX_BT_32DWORDS (3 << 11) +@@ -235,6 +254,7 @@ + #define MTK_WCOMP_EN BIT(24) + #define MTK_RESV_BUF (0x40 << 16) + #define MTK_MUTLI_CNT (0x4 << 12) ++#define MTK_LEAKY_BUCKET_EN BIT(11) + + /* QDMA Flow Control Register */ + #define FC_THRES_DROP_MODE BIT(20) +@@ -265,8 +285,6 @@ + #define MTK_STAT_OFFSET 0x40 + + /* QDMA TX NUM */ +-#define MTK_QDMA_TX_NUM 16 +-#define MTK_QDMA_TX_MASK (MTK_QDMA_TX_NUM - 1) + #define QID_BITS_V2(x) (((x) & 0x3f) << 16) + #define MTK_QDMA_GMAC2_QID 8 + +@@ -296,6 +314,7 @@ + #define TX_DMA_PLEN0(x) (((x) & eth->soc->txrx.dma_max_len) << eth->soc->txrx.dma_len_offset) + #define TX_DMA_PLEN1(x) ((x) & eth->soc->txrx.dma_max_len) + #define TX_DMA_SWC BIT(14) ++#define TX_DMA_PQID GENMASK(3, 0) + + /* PDMA on MT7628 */ + #define TX_DMA_DONE BIT(31) +@@ -953,6 +972,7 @@ struct mtk_reg_map { + } pdma; + struct { + u32 qtx_cfg; /* tx queue configuration */ ++ u32 qtx_sch; /* tx queue scheduler configuration */ + u32 rx_ptr; /* rx base pointer */ + u32 rx_cnt_cfg; /* rx max count configuration */ + u32 qcrx_ptr; /* rx cpu pointer */ +@@ -970,6 +990,7 @@ struct mtk_reg_map { + u32 fq_tail; /* fq tail pointer */ + u32 fq_count; /* fq free page count */ + u32 fq_blen; /* fq free page buffer length */ ++ u32 tx_sch_rate; /* tx scheduler rate control registers */ + } qdma; + u32 gdm1_cnt; + u32 gdma_to_ppe0; +@@ -1173,6 +1194,7 @@ struct mtk_mac { + __be32 hwlro_ip[MTK_MAX_LRO_IP_CNT]; + int hwlro_ip_cnt; + unsigned int syscfg0; ++ struct notifier_block device_notifier; + }; + + /* the struct describing the SoC. these are declared in the soc_xyz.c files */ diff --git a/target/linux/generic/backport-5.15/730-05-v6.3-net-dsa-tag_mtk-assign-per-port-queues.patch b/target/linux/generic/backport-5.15/730-05-v6.3-net-dsa-tag_mtk-assign-per-port-queues.patch new file mode 100644 index 0000000000..186df4bdc9 --- /dev/null +++ b/target/linux/generic/backport-5.15/730-05-v6.3-net-dsa-tag_mtk-assign-per-port-queues.patch @@ -0,0 +1,20 @@ +From: Felix Fietkau +Date: Fri, 28 Oct 2022 18:16:03 +0200 +Subject: [PATCH] net: dsa: tag_mtk: assign per-port queues + +Keeps traffic sent to the switch within link speed limits + +Signed-off-by: Felix Fietkau +--- + +--- a/net/dsa/tag_mtk.c ++++ b/net/dsa/tag_mtk.c +@@ -25,6 +25,8 @@ static struct sk_buff *mtk_tag_xmit(stru + u8 xmit_tpid; + u8 *mtk_tag; + ++ skb_set_queue_mapping(skb, dp->index); ++ + /* Build the special tag after the MAC Source Address. If VLAN header + * is present, it's required that VLAN header and special tag is + * being combined. Only in this way we can allow the switch can parse diff --git a/target/linux/generic/backport-5.15/730-06-v6.3-net-ethernet-mediatek-ppe-assign-per-port-queues-for.patch b/target/linux/generic/backport-5.15/730-06-v6.3-net-ethernet-mediatek-ppe-assign-per-port-queues-for.patch new file mode 100644 index 0000000000..e05042c204 --- /dev/null +++ b/target/linux/generic/backport-5.15/730-06-v6.3-net-ethernet-mediatek-ppe-assign-per-port-queues-for.patch @@ -0,0 +1,93 @@ +From: Felix Fietkau +Date: Thu, 3 Nov 2022 17:49:44 +0100 +Subject: [PATCH] net: ethernet: mediatek: ppe: assign per-port queues + for offloaded traffic + +Keeps traffic sent to the switch within link speed limits + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -405,6 +405,24 @@ static inline bool mtk_foe_entry_usable( + FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1) != MTK_FOE_STATE_BIND; + } + ++int mtk_foe_entry_set_queue(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ unsigned int queue) ++{ ++ u32 *ib2 = mtk_foe_entry_ib2(eth, entry); ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ *ib2 &= ~MTK_FOE_IB2_QID_V2; ++ *ib2 |= FIELD_PREP(MTK_FOE_IB2_QID_V2, queue); ++ *ib2 |= MTK_FOE_IB2_PSE_QOS_V2; ++ } else { ++ *ib2 &= ~MTK_FOE_IB2_QID; ++ *ib2 |= FIELD_PREP(MTK_FOE_IB2_QID, queue); ++ *ib2 |= MTK_FOE_IB2_PSE_QOS; ++ } ++ ++ return 0; ++} ++ + static bool + mtk_flow_entry_match(struct mtk_eth *eth, struct mtk_flow_entry *entry, + struct mtk_foe_entry *data) +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -68,7 +68,9 @@ enum { + #define MTK_FOE_IB2_DSCP GENMASK(31, 24) + + /* CONFIG_MEDIATEK_NETSYS_V2 */ ++#define MTK_FOE_IB2_QID_V2 GENMASK(6, 0) + #define MTK_FOE_IB2_PORT_MG_V2 BIT(7) ++#define MTK_FOE_IB2_PSE_QOS_V2 BIT(8) + #define MTK_FOE_IB2_DEST_PORT_V2 GENMASK(12, 9) + #define MTK_FOE_IB2_MULTICAST_V2 BIT(13) + #define MTK_FOE_IB2_WDMA_WINFO_V2 BIT(19) +@@ -352,6 +354,8 @@ int mtk_foe_entry_set_pppoe(struct mtk_e + int sid); + int mtk_foe_entry_set_wdma(struct mtk_eth *eth, struct mtk_foe_entry *entry, + int wdma_idx, int txq, int bss, int wcid); ++int mtk_foe_entry_set_queue(struct mtk_eth *eth, struct mtk_foe_entry *entry, ++ unsigned int queue); + int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); + void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); + int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -188,7 +188,7 @@ mtk_flow_set_output_device(struct mtk_et + int *wed_index) + { + struct mtk_wdma_info info = {}; +- int pse_port, dsa_port; ++ int pse_port, dsa_port, queue; + + if (mtk_flow_get_wdma_info(dev, dest_mac, &info) == 0) { + mtk_foe_entry_set_wdma(eth, foe, info.wdma_idx, info.queue, +@@ -212,8 +212,6 @@ mtk_flow_set_output_device(struct mtk_et + } + + dsa_port = mtk_flow_get_dsa_port(&dev); +- if (dsa_port >= 0) +- mtk_foe_entry_set_dsa(eth, foe, dsa_port); + + if (dev == eth->netdev[0]) + pse_port = 1; +@@ -222,6 +220,14 @@ mtk_flow_set_output_device(struct mtk_et + else + return -EOPNOTSUPP; + ++ if (dsa_port >= 0) { ++ mtk_foe_entry_set_dsa(eth, foe, dsa_port); ++ queue = 3 + dsa_port; ++ } else { ++ queue = pse_port - 1; ++ } ++ mtk_foe_entry_set_queue(eth, foe, queue); ++ + out: + mtk_foe_entry_set_pse_port(eth, foe, pse_port); + diff --git a/target/linux/generic/backport-5.15/730-08-v6.3-net-dsa-add-support-for-DSA-rx-offloading-via-metada.patch b/target/linux/generic/backport-5.15/730-08-v6.3-net-dsa-add-support-for-DSA-rx-offloading-via-metada.patch new file mode 100644 index 0000000000..0478cb528e --- /dev/null +++ b/target/linux/generic/backport-5.15/730-08-v6.3-net-dsa-add-support-for-DSA-rx-offloading-via-metada.patch @@ -0,0 +1,72 @@ +From: Felix Fietkau +Date: Tue, 8 Nov 2022 15:03:15 +0100 +Subject: [PATCH] net: dsa: add support for DSA rx offloading via + metadata dst + +If a metadata dst is present with the type METADATA_HW_PORT_MUX on a dsa cpu +port netdev, assume that it carries the port number and that there is no DSA +tag present in the skb data. + +Signed-off-by: Felix Fietkau +--- + +--- a/net/core/flow_dissector.c ++++ b/net/core/flow_dissector.c +@@ -940,12 +940,14 @@ bool __skb_flow_dissect(const struct net + #if IS_ENABLED(CONFIG_NET_DSA) + if (unlikely(skb->dev && netdev_uses_dsa(skb->dev) && + proto == htons(ETH_P_XDSA))) { ++ struct metadata_dst *md_dst = skb_metadata_dst(skb); + const struct dsa_device_ops *ops; + int offset = 0; + + ops = skb->dev->dsa_ptr->tag_ops; + /* Only DSA header taggers break flow dissection */ +- if (ops->needed_headroom) { ++ if (ops->needed_headroom && ++ (!md_dst || md_dst->type != METADATA_HW_PORT_MUX)) { + if (ops->flow_dissect) + ops->flow_dissect(skb, &proto, &offset); + else +--- a/net/dsa/dsa.c ++++ b/net/dsa/dsa.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + + #include "dsa_priv.h" + +@@ -225,6 +226,7 @@ static bool dsa_skb_defer_rx_timestamp(s + static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev, + struct packet_type *pt, struct net_device *unused) + { ++ struct metadata_dst *md_dst = skb_metadata_dst(skb); + struct dsa_port *cpu_dp = dev->dsa_ptr; + struct sk_buff *nskb = NULL; + struct dsa_slave_priv *p; +@@ -238,7 +240,22 @@ static int dsa_switch_rcv(struct sk_buff + if (!skb) + return 0; + +- nskb = cpu_dp->rcv(skb, dev); ++ if (md_dst && md_dst->type == METADATA_HW_PORT_MUX) { ++ unsigned int port = md_dst->u.port_info.port_id; ++ ++ skb_dst_drop(skb); ++ if (!skb_has_extensions(skb)) ++ skb->slow_gro = 0; ++ ++ skb->dev = dsa_master_find_slave(dev, 0, port); ++ if (likely(skb->dev)) { ++ dsa_default_offload_fwd_mark(skb); ++ nskb = skb; ++ } ++ } else { ++ nskb = cpu_dp->rcv(skb, dev); ++ } ++ + if (!nskb) { + kfree_skb(skb); + return 0; diff --git a/target/linux/generic/backport-5.15/730-09-v6.3-net-ethernet-mtk_eth_soc-fix-VLAN-rx-hardware-accele.patch b/target/linux/generic/backport-5.15/730-09-v6.3-net-ethernet-mtk_eth_soc-fix-VLAN-rx-hardware-accele.patch new file mode 100644 index 0000000000..3733b7279f --- /dev/null +++ b/target/linux/generic/backport-5.15/730-09-v6.3-net-ethernet-mtk_eth_soc-fix-VLAN-rx-hardware-accele.patch @@ -0,0 +1,192 @@ +From: Felix Fietkau +Date: Fri, 28 Oct 2022 11:01:12 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix VLAN rx hardware + acceleration + +- enable VLAN untagging for PDMA rx +- make it possible to disable the feature via ethtool +- pass VLAN tag to the DSA driver +- untag special tag on PDMA only if no non-DSA devices are in use +- disable special tag untagging on 7986 for now, since it's not working yet + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + + #include "mtk_eth_soc.h" + #include "mtk_wed.h" +@@ -1974,16 +1975,22 @@ static int mtk_poll_rx(struct napi_struc + htons(RX_DMA_VPID(trxd.rxd4)), + RX_DMA_VID(trxd.rxd4)); + } else if (trxd.rxd2 & RX_DMA_VTAG) { +- __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ++ __vlan_hwaccel_put_tag(skb, htons(RX_DMA_VPID(trxd.rxd3)), + RX_DMA_VID(trxd.rxd3)); + } ++ } ++ ++ /* When using VLAN untagging in combination with DSA, the ++ * hardware treats the MTK special tag as a VLAN and untags it. ++ */ ++ if (skb_vlan_tag_present(skb) && netdev_uses_dsa(netdev)) { ++ unsigned int port = ntohs(skb->vlan_proto) & GENMASK(2, 0); + +- /* If the device is attached to a dsa switch, the special +- * tag inserted in VLAN field by hw switch can * be offloaded +- * by RX HW VLAN offload. Clear vlan info. +- */ +- if (netdev_uses_dsa(netdev)) +- __vlan_hwaccel_clear_tag(skb); ++ if (port < ARRAY_SIZE(eth->dsa_meta) && ++ eth->dsa_meta[port]) ++ skb_dst_set_noref(skb, ð->dsa_meta[port]->dst); ++ ++ __vlan_hwaccel_clear_tag(skb); + } + + skb_record_rx_queue(skb, 0); +@@ -2803,15 +2810,30 @@ static netdev_features_t mtk_fix_feature + + static int mtk_set_features(struct net_device *dev, netdev_features_t features) + { +- int err = 0; ++ struct mtk_mac *mac = netdev_priv(dev); ++ struct mtk_eth *eth = mac->hw; ++ netdev_features_t diff = dev->features ^ features; ++ int i; ++ ++ if ((diff & NETIF_F_LRO) && !(features & NETIF_F_LRO)) ++ mtk_hwlro_netdev_disable(dev); + +- if (!((dev->features ^ features) & NETIF_F_LRO)) ++ /* Set RX VLAN offloading */ ++ if (!(diff & NETIF_F_HW_VLAN_CTAG_RX)) + return 0; + +- if (!(features & NETIF_F_LRO)) +- mtk_hwlro_netdev_disable(dev); ++ mtk_w32(eth, !!(features & NETIF_F_HW_VLAN_CTAG_RX), ++ MTK_CDMP_EG_CTRL); + +- return err; ++ /* sync features with other MAC */ ++ for (i = 0; i < MTK_MAC_COUNT; i++) { ++ if (!eth->netdev[i] || eth->netdev[i] == dev) ++ continue; ++ eth->netdev[i]->features &= ~NETIF_F_HW_VLAN_CTAG_RX; ++ eth->netdev[i]->features |= features & NETIF_F_HW_VLAN_CTAG_RX; ++ } ++ ++ return 0; + } + + /* wait for DMA to finish whatever it is doing before we start using it again */ +@@ -3108,11 +3130,45 @@ found: + return NOTIFY_DONE; + } + ++static bool mtk_uses_dsa(struct net_device *dev) ++{ ++#if IS_ENABLED(CONFIG_NET_DSA) ++ return netdev_uses_dsa(dev) && ++ dev->dsa_ptr->tag_ops->proto == DSA_TAG_PROTO_MTK; ++#else ++ return false; ++#endif ++} ++ + static int mtk_open(struct net_device *dev) + { + struct mtk_mac *mac = netdev_priv(dev); + struct mtk_eth *eth = mac->hw; +- int err; ++ int i, err; ++ ++ if (mtk_uses_dsa(dev) && !eth->prog) { ++ for (i = 0; i < ARRAY_SIZE(eth->dsa_meta); i++) { ++ struct metadata_dst *md_dst = eth->dsa_meta[i]; ++ ++ if (md_dst) ++ continue; ++ ++ md_dst = metadata_dst_alloc(0, METADATA_HW_PORT_MUX, ++ GFP_KERNEL); ++ if (!md_dst) ++ return -ENOMEM; ++ ++ md_dst->u.port_info.port_id = i; ++ eth->dsa_meta[i] = md_dst; ++ } ++ } else { ++ /* Hardware special tag parsing needs to be disabled if at least ++ * one MAC does not use DSA. ++ */ ++ u32 val = mtk_r32(eth, MTK_CDMP_IG_CTRL); ++ val &= ~MTK_CDMP_STAG_EN; ++ mtk_w32(eth, val, MTK_CDMP_IG_CTRL); ++ } + + err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0); + if (err) { +@@ -3635,6 +3691,10 @@ static int mtk_hw_init(struct mtk_eth *e + */ + val = mtk_r32(eth, MTK_CDMQ_IG_CTRL); + mtk_w32(eth, val | MTK_CDMQ_STAG_EN, MTK_CDMQ_IG_CTRL); ++ if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ val = mtk_r32(eth, MTK_CDMP_IG_CTRL); ++ mtk_w32(eth, val | MTK_CDMP_STAG_EN, MTK_CDMP_IG_CTRL); ++ } + + /* Enable RX VLan Offloading */ + mtk_w32(eth, 1, MTK_CDMP_EG_CTRL); +@@ -3851,6 +3911,12 @@ static int mtk_free_dev(struct mtk_eth * + free_netdev(eth->netdev[i]); + } + ++ for (i = 0; i < ARRAY_SIZE(eth->dsa_meta); i++) { ++ if (!eth->dsa_meta[i]) ++ break; ++ metadata_dst_free(eth->dsa_meta[i]); ++ } ++ + return 0; + } + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -22,6 +22,9 @@ + #include + #include "mtk_ppe.h" + ++#define MTK_MAX_DSA_PORTS 7 ++#define MTK_DSA_PORT_MASK GENMASK(2, 0) ++ + #define MTK_QDMA_NUM_QUEUES 16 + #define MTK_QDMA_PAGE_SIZE 2048 + #define MTK_MAX_RX_LENGTH 1536 +@@ -105,6 +108,9 @@ + #define MTK_CDMQ_IG_CTRL 0x1400 + #define MTK_CDMQ_STAG_EN BIT(0) + ++/* CDMQ Exgress Control Register */ ++#define MTK_CDMQ_EG_CTRL 0x1404 ++ + /* CDMP Ingress Control Register */ + #define MTK_CDMP_IG_CTRL 0x400 + #define MTK_CDMP_STAG_EN BIT(0) +@@ -1160,6 +1166,8 @@ struct mtk_eth { + + int ip_align; + ++ struct metadata_dst *dsa_meta[MTK_MAX_DSA_PORTS]; ++ + struct mtk_ppe *ppe[2]; + struct rhashtable flow_table; + diff --git a/target/linux/generic/backport-5.15/730-10-v6.3-net-ethernet-mtk_eth_soc-drop-packets-to-WDMA-if-the.patch b/target/linux/generic/backport-5.15/730-10-v6.3-net-ethernet-mtk_eth_soc-drop-packets-to-WDMA-if-the.patch new file mode 100644 index 0000000000..9c2843a6c9 --- /dev/null +++ b/target/linux/generic/backport-5.15/730-10-v6.3-net-ethernet-mtk_eth_soc-drop-packets-to-WDMA-if-the.patch @@ -0,0 +1,37 @@ +From: Felix Fietkau +Date: Thu, 3 Nov 2022 17:46:25 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: drop packets to WDMA if the + ring is full + +Improves handling of DMA ring overflow. +Clarify other WDMA drop related comment. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3715,9 +3715,12 @@ static int mtk_hw_init(struct mtk_eth *e + mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP); + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { +- /* PSE should not drop port8 and port9 packets */ ++ /* PSE should not drop port8 and port9 packets from WDMA Tx */ + mtk_w32(eth, 0x00000300, PSE_DROP_CFG); + ++ /* PSE should drop packets to port 8/9 on WDMA Rx ring full */ ++ mtk_w32(eth, 0x00000300, PSE_PPE0_DROP); ++ + /* PSE Free Queue Flow Control */ + mtk_w32(eth, 0x01fa01f4, PSE_FQFC_CFG2); + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -140,6 +140,7 @@ + #define PSE_FQFC_CFG1 0x100 + #define PSE_FQFC_CFG2 0x104 + #define PSE_DROP_CFG 0x108 ++#define PSE_PPE0_DROP 0x110 + + /* PSE Input Queue Reservation Register*/ + #define PSE_IQ_REV(x) (0x140 + (((x) - 1) << 2)) diff --git a/target/linux/generic/backport-5.15/730-12-v6.3-net-ethernet-mtk_eth_soc-disable-hardware-DSA-untagg.patch b/target/linux/generic/backport-5.15/730-12-v6.3-net-ethernet-mtk_eth_soc-disable-hardware-DSA-untagg.patch new file mode 100644 index 0000000000..5a4d343a72 --- /dev/null +++ b/target/linux/generic/backport-5.15/730-12-v6.3-net-ethernet-mtk_eth_soc-disable-hardware-DSA-untagg.patch @@ -0,0 +1,42 @@ +From: =?UTF-8?q?Ar=C4=B1n=C3=A7=20=C3=9CNAL?= +Date: Sat, 28 Jan 2023 12:42:32 +0300 +Subject: [PATCH] net: ethernet: mtk_eth_soc: disable hardware DSA untagging + for second MAC +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +According to my tests on MT7621AT and MT7623NI SoCs, hardware DSA untagging +won't work on the second MAC. Therefore, disable this feature when the +second MAC of the MT7621 and MT7623 SoCs is being used. + +Fixes: 2d7605a72906 ("net: ethernet: mtk_eth_soc: enable hardware DSA untagging") +Link: https://lore.kernel.org/netdev/6249fc14-b38a-c770-36b4-5af6d41c21d3@arinc9.com/ +Tested-by: Arınç ÜNAL +Signed-off-by: Arınç ÜNAL +Link: https://lore.kernel.org/r/20230128094232.2451947-1-arinc.unal@arinc9.com +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3146,7 +3146,8 @@ static int mtk_open(struct net_device *d + struct mtk_eth *eth = mac->hw; + int i, err; + +- if (mtk_uses_dsa(dev) && !eth->prog) { ++ if ((mtk_uses_dsa(dev) && !eth->prog) && ++ !(mac->id == 1 && MTK_HAS_CAPS(eth->soc->caps, MTK_GMAC1_TRGMII))) { + for (i = 0; i < ARRAY_SIZE(eth->dsa_meta); i++) { + struct metadata_dst *md_dst = eth->dsa_meta[i]; + +@@ -3163,7 +3164,8 @@ static int mtk_open(struct net_device *d + } + } else { + /* Hardware special tag parsing needs to be disabled if at least +- * one MAC does not use DSA. ++ * one MAC does not use DSA, or the second MAC of the MT7621 and ++ * MT7623 SoCs is being used. + */ + u32 val = mtk_r32(eth, MTK_CDMP_IG_CTRL); + val &= ~MTK_CDMP_STAG_EN; diff --git a/target/linux/generic/backport-5.15/730-13-v6.3-net-ethernet-mtk_eth_soc-enable-special-tag-when-any.patch b/target/linux/generic/backport-5.15/730-13-v6.3-net-ethernet-mtk_eth_soc-enable-special-tag-when-any.patch new file mode 100644 index 0000000000..e93e62125d --- /dev/null +++ b/target/linux/generic/backport-5.15/730-13-v6.3-net-ethernet-mtk_eth_soc-enable-special-tag-when-any.patch @@ -0,0 +1,54 @@ +From: =?UTF-8?q?Ar=C4=B1n=C3=A7=20=C3=9CNAL?= +Date: Sun, 5 Feb 2023 20:53:31 +0300 +Subject: [PATCH] net: ethernet: mtk_eth_soc: enable special tag when any MAC + uses DSA +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The special tag is only enabled when the first MAC uses DSA. However, it +must be enabled when any MAC uses DSA. Change the check accordingly. + +This fixes hardware DSA untagging not working on the second MAC of the +MT7621 and MT7623 SoCs, and likely other SoCs too. Therefore, remove the +check that disables hardware DSA untagging for the second MAC of the MT7621 +and MT7623 SoCs. + +Fixes: a1f47752fd62 ("net: ethernet: mtk_eth_soc: disable hardware DSA untagging for second MAC") +Co-developed-by: Richard van Schagen +Signed-off-by: Richard van Schagen +Signed-off-by: Arınç ÜNAL +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3081,7 +3081,7 @@ static void mtk_gdm_config(struct mtk_et + + val |= config; + +- if (!i && eth->netdev[0] && netdev_uses_dsa(eth->netdev[0])) ++ if (eth->netdev[i] && netdev_uses_dsa(eth->netdev[i])) + val |= MTK_GDMA_SPECIAL_TAG; + + mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i)); +@@ -3146,8 +3146,7 @@ static int mtk_open(struct net_device *d + struct mtk_eth *eth = mac->hw; + int i, err; + +- if ((mtk_uses_dsa(dev) && !eth->prog) && +- !(mac->id == 1 && MTK_HAS_CAPS(eth->soc->caps, MTK_GMAC1_TRGMII))) { ++ if (mtk_uses_dsa(dev) && !eth->prog) { + for (i = 0; i < ARRAY_SIZE(eth->dsa_meta); i++) { + struct metadata_dst *md_dst = eth->dsa_meta[i]; + +@@ -3164,8 +3163,7 @@ static int mtk_open(struct net_device *d + } + } else { + /* Hardware special tag parsing needs to be disabled if at least +- * one MAC does not use DSA, or the second MAC of the MT7621 and +- * MT7623 SoCs is being used. ++ * one MAC does not use DSA. + */ + u32 val = mtk_r32(eth, MTK_CDMP_IG_CTRL); + val &= ~MTK_CDMP_STAG_EN; diff --git a/target/linux/generic/backport-5.15/730-14-v6.3-net-ethernet-mtk_eth_soc-fix-DSA-TX-tag-hwaccel-for-.patch b/target/linux/generic/backport-5.15/730-14-v6.3-net-ethernet-mtk_eth_soc-fix-DSA-TX-tag-hwaccel-for-.patch new file mode 100644 index 0000000000..c392429b88 --- /dev/null +++ b/target/linux/generic/backport-5.15/730-14-v6.3-net-ethernet-mtk_eth_soc-fix-DSA-TX-tag-hwaccel-for-.patch @@ -0,0 +1,129 @@ +From: Vladimir Oltean +Date: Tue, 7 Feb 2023 12:30:27 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix DSA TX tag hwaccel for switch + port 0 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Arınç reports that on his MT7621AT Unielec U7621-06 board and MT7623NI +Bananapi BPI-R2, packets received by the CPU over mt7530 switch port 0 +(of which this driver acts as the DSA master) are not processed +correctly by software. More precisely, they arrive without a DSA tag +(in packet or in the hwaccel area - skb_metadata_dst()), so DSA cannot +demux them towards the switch's interface for port 0. Traffic from other +ports receives a skb_metadata_dst() with the correct port and is demuxed +properly. + +Looking at mtk_poll_rx(), it becomes apparent that this driver uses the +skb vlan hwaccel area: + + union { + u32 vlan_all; + struct { + __be16 vlan_proto; + __u16 vlan_tci; + }; + }; + +as a temporary storage for the VLAN hwaccel tag, or the DSA hwaccel tag. +If this is a DSA master it's a DSA hwaccel tag, and finally clears up +the skb VLAN hwaccel header. + +I'm guessing that the problem is the (mis)use of API. +skb_vlan_tag_present() looks like this: + + #define skb_vlan_tag_present(__skb) (!!(__skb)->vlan_all) + +So if both vlan_proto and vlan_tci are zeroes, skb_vlan_tag_present() +returns precisely false. I don't know for sure what is the format of the +DSA hwaccel tag, but I surely know that lowermost 3 bits of vlan_proto +are 0 when receiving from port 0: + + unsigned int port = vlan_proto & GENMASK(2, 0); + +If the RX descriptor has no other bits set to non-zero values in +RX_DMA_VTAG, then the call to __vlan_hwaccel_put_tag() will not, in +fact, make the subsequent skb_vlan_tag_present() return true, because +it's implemented like this: + +static inline void __vlan_hwaccel_put_tag(struct sk_buff *skb, + __be16 vlan_proto, u16 vlan_tci) +{ + skb->vlan_proto = vlan_proto; + skb->vlan_tci = vlan_tci; +} + +What we need to do to fix this problem (assuming this is the problem) is +to stop using skb->vlan_all as temporary storage for driver affairs, and +just create some local variables that serve the same purpose, but +hopefully better. Instead of calling skb_vlan_tag_present(), let's look +at a boolean has_hwaccel_tag which we set to true when the RX DMA +descriptors have something. Disambiguate based on netdev_uses_dsa() +whether this is a VLAN or DSA hwaccel tag, and only call +__vlan_hwaccel_put_tag() if we're certain it's a VLAN tag. + +Arınç confirms that the treatment works, so this validates the +assumption. + +Link: https://lore.kernel.org/netdev/704f3a72-fc9e-714a-db54-272e17612637@arinc9.com/ +Fixes: 2d7605a72906 ("net: ethernet: mtk_eth_soc: enable hardware DSA untagging") +Reported-by: Arınç ÜNAL +Tested-by: Arınç ÜNAL +Signed-off-by: Vladimir Oltean +Reviewed-by: Felix Fietkau +Signed-off-by: David S. Miller +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1830,7 +1830,9 @@ static int mtk_poll_rx(struct napi_struc + + while (done < budget) { + unsigned int pktlen, *rxdcsum; ++ bool has_hwaccel_tag = false; + struct net_device *netdev; ++ u16 vlan_proto, vlan_tci; + dma_addr_t dma_addr; + u32 hash, reason; + int mac = 0; +@@ -1970,27 +1972,29 @@ static int mtk_poll_rx(struct napi_struc + + if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) { + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { +- if (trxd.rxd3 & RX_DMA_VTAG_V2) +- __vlan_hwaccel_put_tag(skb, +- htons(RX_DMA_VPID(trxd.rxd4)), +- RX_DMA_VID(trxd.rxd4)); ++ if (trxd.rxd3 & RX_DMA_VTAG_V2) { ++ vlan_proto = RX_DMA_VPID(trxd.rxd4); ++ vlan_tci = RX_DMA_VID(trxd.rxd4); ++ has_hwaccel_tag = true; ++ } + } else if (trxd.rxd2 & RX_DMA_VTAG) { +- __vlan_hwaccel_put_tag(skb, htons(RX_DMA_VPID(trxd.rxd3)), +- RX_DMA_VID(trxd.rxd3)); ++ vlan_proto = RX_DMA_VPID(trxd.rxd3); ++ vlan_tci = RX_DMA_VID(trxd.rxd3); ++ has_hwaccel_tag = true; + } + } + + /* When using VLAN untagging in combination with DSA, the + * hardware treats the MTK special tag as a VLAN and untags it. + */ +- if (skb_vlan_tag_present(skb) && netdev_uses_dsa(netdev)) { +- unsigned int port = ntohs(skb->vlan_proto) & GENMASK(2, 0); ++ if (has_hwaccel_tag && netdev_uses_dsa(netdev)) { ++ unsigned int port = vlan_proto & GENMASK(2, 0); + + if (port < ARRAY_SIZE(eth->dsa_meta) && + eth->dsa_meta[port]) + skb_dst_set_noref(skb, ð->dsa_meta[port]->dst); +- +- __vlan_hwaccel_clear_tag(skb); ++ } else if (has_hwaccel_tag) { ++ __vlan_hwaccel_put_tag(skb, htons(vlan_proto), vlan_tci); + } + + skb_record_rx_queue(skb, 0); diff --git a/target/linux/generic/backport-5.15/730-15-v6.3-net-ethernet-mtk_wed-No-need-to-clear-memory-after-a.patch b/target/linux/generic/backport-5.15/730-15-v6.3-net-ethernet-mtk_wed-No-need-to-clear-memory-after-a.patch new file mode 100644 index 0000000000..74a77ddaca --- /dev/null +++ b/target/linux/generic/backport-5.15/730-15-v6.3-net-ethernet-mtk_wed-No-need-to-clear-memory-after-a.patch @@ -0,0 +1,26 @@ +From: Christophe JAILLET +Date: Sun, 12 Feb 2023 07:51:51 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: No need to clear memory after a + dma_alloc_coherent() call + +dma_alloc_coherent() already clears the allocated memory, there is no need +to explicitly call memset(). + +Moreover, it is likely that the size in the memset() is incorrect and +should be "size * sizeof(*ring->desc)". + +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/d5acce7dd108887832c9719f62c7201b4c83b3fb.1676184599.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -786,7 +786,6 @@ mtk_wed_rro_ring_alloc(struct mtk_wed_de + + ring->desc_size = sizeof(*ring->desc); + ring->size = size; +- memset(ring->desc, 0, size); + + return 0; + } diff --git a/target/linux/generic/backport-5.15/730-16-v6.3-net-ethernet-mtk_wed-fix-some-possible-NULL-pointer-.patch b/target/linux/generic/backport-5.15/730-16-v6.3-net-ethernet-mtk_wed-fix-some-possible-NULL-pointer-.patch new file mode 100644 index 0000000000..e043a681da --- /dev/null +++ b/target/linux/generic/backport-5.15/730-16-v6.3-net-ethernet-mtk_wed-fix-some-possible-NULL-pointer-.patch @@ -0,0 +1,61 @@ +From: Lorenzo Bianconi +Date: Wed, 7 Dec 2022 15:04:54 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: fix some possible NULL pointer + dereferences + +Fix possible NULL pointer dereference in mtk_wed_detach routine checking +wo pointer is properly allocated before running mtk_wed_wo_reset() and +mtk_wed_wo_deinit(). +Even if it is just a theoretical issue at the moment check wo pointer is +not NULL in mtk_wed_mcu_msg_update. +Moreover, honor mtk_wed_mcu_send_msg return value in mtk_wed_wo_reset() + +Fixes: 799684448e3e ("net: ethernet: mtk_wed: introduce wed wo support") +Fixes: 4c5de09eb0d0 ("net: ethernet: mtk_wed: add configure wed wo support") +Signed-off-by: Lorenzo Bianconi +Reviewed-by: Leon Romanovsky +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -174,9 +174,10 @@ mtk_wed_wo_reset(struct mtk_wed_device * + mtk_wdma_tx_reset(dev); + mtk_wed_reset(dev, MTK_WED_RESET_WED); + +- mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, +- MTK_WED_WO_CMD_CHANGE_STATE, &state, +- sizeof(state), false); ++ if (mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, ++ MTK_WED_WO_CMD_CHANGE_STATE, &state, ++ sizeof(state), false)) ++ return; + + if (readx_poll_timeout(mtk_wed_wo_read_status, dev, val, + val == MTK_WED_WOIF_DISABLE_DONE, +@@ -632,9 +633,11 @@ mtk_wed_detach(struct mtk_wed_device *de + mtk_wed_free_tx_rings(dev); + + if (mtk_wed_get_rx_capa(dev)) { +- mtk_wed_wo_reset(dev); ++ if (hw->wed_wo) ++ mtk_wed_wo_reset(dev); + mtk_wed_free_rx_rings(dev); +- mtk_wed_wo_deinit(hw); ++ if (hw->wed_wo) ++ mtk_wed_wo_deinit(hw); + } + + if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) { +--- a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c +@@ -207,6 +207,9 @@ int mtk_wed_mcu_msg_update(struct mtk_we + if (dev->hw->version == 1) + return 0; + ++ if (WARN_ON(!wo)) ++ return -ENODEV; ++ + return mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, id, data, len, + true); + } diff --git a/target/linux/generic/backport-5.15/730-17-v6.3-net-ethernet-mtk_wed-fix-possible-deadlock-if-mtk_we.patch b/target/linux/generic/backport-5.15/730-17-v6.3-net-ethernet-mtk_wed-fix-possible-deadlock-if-mtk_we.patch new file mode 100644 index 0000000000..d1c5fb6656 --- /dev/null +++ b/target/linux/generic/backport-5.15/730-17-v6.3-net-ethernet-mtk_wed-fix-possible-deadlock-if-mtk_we.patch @@ -0,0 +1,58 @@ +From: Lorenzo Bianconi +Date: Wed, 7 Dec 2022 15:04:55 +0100 +Subject: [PATCH] net: ethernet: mtk_wed: fix possible deadlock if + mtk_wed_wo_init fails + +Introduce __mtk_wed_detach() in order to avoid a deadlock in +mtk_wed_attach routine if mtk_wed_wo_init fails since both +mtk_wed_attach and mtk_wed_detach run holding hw_lock mutex. + +Fixes: 4c5de09eb0d0 ("net: ethernet: mtk_wed: add configure wed wo support") +Signed-off-by: Lorenzo Bianconi +Reviewed-by: Leon Romanovsky +Signed-off-by: Jakub Kicinski +--- + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -619,12 +619,10 @@ mtk_wed_deinit(struct mtk_wed_device *de + } + + static void +-mtk_wed_detach(struct mtk_wed_device *dev) ++__mtk_wed_detach(struct mtk_wed_device *dev) + { + struct mtk_wed_hw *hw = dev->hw; + +- mutex_lock(&hw_lock); +- + mtk_wed_deinit(dev); + + mtk_wdma_rx_reset(dev); +@@ -657,6 +655,13 @@ mtk_wed_detach(struct mtk_wed_device *de + module_put(THIS_MODULE); + + hw->wed_dev = NULL; ++} ++ ++static void ++mtk_wed_detach(struct mtk_wed_device *dev) ++{ ++ mutex_lock(&hw_lock); ++ __mtk_wed_detach(dev); + mutex_unlock(&hw_lock); + } + +@@ -1545,8 +1550,10 @@ mtk_wed_attach(struct mtk_wed_device *de + ret = mtk_wed_wo_init(hw); + } + out: +- if (ret) +- mtk_wed_detach(dev); ++ if (ret) { ++ dev_err(dev->hw->dev, "failed to attach wed device\n"); ++ __mtk_wed_detach(dev); ++ } + unlock: + mutex_unlock(&hw_lock); + diff --git a/target/linux/generic/backport-5.15/730-18-v6.3-net-ethernet-mtk_eth_soc-fix-tx-throughput-regressio.patch b/target/linux/generic/backport-5.15/730-18-v6.3-net-ethernet-mtk_eth_soc-fix-tx-throughput-regressio.patch new file mode 100644 index 0000000000..e633f6f1fb --- /dev/null +++ b/target/linux/generic/backport-5.15/730-18-v6.3-net-ethernet-mtk_eth_soc-fix-tx-throughput-regressio.patch @@ -0,0 +1,31 @@ +From: Felix Fietkau +Date: Fri, 24 Mar 2023 14:56:58 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix tx throughput regression with + direct 1G links + +Using the QDMA tx scheduler to throttle tx to line speed works fine for +switch ports, but apparently caused a regression on non-switch ports. + +Based on a number of tests, it seems that this throttling can be safely +dropped without re-introducing the issues on switch ports that the +tx scheduling changes resolved. + +Link: https://lore.kernel.org/netdev/trinity-92c3826f-c2c8-40af-8339-bc6d0d3ffea4-1678213958520@3c-app-gmx-bs16/ +Fixes: f63959c7eec3 ("net: ethernet: mtk_eth_soc: implement multi-queue support for per-port queues") +Reported-by: Frank Wunderlich +Reported-by: Daniel Golle +Tested-by: Daniel Golle +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -676,8 +676,6 @@ static void mtk_mac_link_up(struct phyli + break; + } + +- mtk_set_queue_speed(mac->hw, mac->id, speed); +- + /* Configure duplex */ + if (duplex == DUPLEX_FULL) + mcr |= MAC_MCR_FORCE_DPX; diff --git a/target/linux/generic/backport-5.15/733-v6.2-01-net-ethernet-mtk_eth_soc-Avoid-truncating-allocation.patch b/target/linux/generic/backport-5.15/733-v6.2-01-net-ethernet-mtk_eth_soc-Avoid-truncating-allocation.patch new file mode 100644 index 0000000000..460c5c2317 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-01-net-ethernet-mtk_eth_soc-Avoid-truncating-allocation.patch @@ -0,0 +1,60 @@ +From f3eceaed9edd7c0e0d9fb057613131f92973626f Mon Sep 17 00:00:00 2001 +From: Kees Cook +Date: Fri, 27 Jan 2023 14:38:54 -0800 +Subject: [PATCH] net: ethernet: mtk_eth_soc: Avoid truncating allocation + +There doesn't appear to be a reason to truncate the allocation used for +flow_info, so do a full allocation and remove the unused empty struct. +GCC does not like having a reference to an object that has been +partially allocated, as bounds checking may become impossible when +such an object is passed to other code. Seen with GCC 13: + +../drivers/net/ethernet/mediatek/mtk_ppe.c: In function 'mtk_foe_entry_commit_subflow': +../drivers/net/ethernet/mediatek/mtk_ppe.c:623:18: warning: array subscript 'struct mtk_flow_entry[0]' is partly outside array bounds of 'unsigned char[48]' [-Warray-bounds=] + 623 | flow_info->l2_data.base_flow = entry; + | ^~ + +Cc: Felix Fietkau +Cc: John Crispin +Cc: Sean Wang +Cc: Mark Lee +Cc: Lorenzo Bianconi +Cc: "David S. Miller" +Cc: Eric Dumazet +Cc: Jakub Kicinski +Cc: Paolo Abeni +Cc: Matthias Brugger +Cc: netdev@vger.kernel.org +Cc: linux-arm-kernel@lists.infradead.org +Cc: linux-mediatek@lists.infradead.org +Signed-off-by: Kees Cook +Reviewed-by: Simon Horman +Link: https://lore.kernel.org/r/20230127223853.never.014-kees@kernel.org +Signed-off-by: Paolo Abeni +--- + drivers/net/ethernet/mediatek/mtk_ppe.c | 3 +-- + drivers/net/ethernet/mediatek/mtk_ppe.h | 1 - + 2 files changed, 1 insertion(+), 3 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -621,8 +621,7 @@ mtk_foe_entry_commit_subflow(struct mtk_ + u32 ib1_mask = mtk_get_ib1_pkt_type_mask(ppe->eth) | MTK_FOE_IB1_UDP; + int type; + +- flow_info = kzalloc(offsetof(struct mtk_flow_entry, l2_data.end), +- GFP_ATOMIC); ++ flow_info = kzalloc(sizeof(*flow_info), GFP_ATOMIC); + if (!flow_info) + return; + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -279,7 +279,6 @@ struct mtk_flow_entry { + struct { + struct mtk_flow_entry *base_flow; + struct hlist_node list; +- struct {} end; + } l2_data; + }; + struct rhash_head node; diff --git a/target/linux/generic/backport-5.15/733-v6.2-02-net-mtk_eth_soc-add-definitions-for-PCS.patch b/target/linux/generic/backport-5.15/733-v6.2-02-net-mtk_eth_soc-add-definitions-for-PCS.patch new file mode 100644 index 0000000000..68f3659367 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-02-net-mtk_eth_soc-add-definitions-for-PCS.patch @@ -0,0 +1,55 @@ +From b6a709cb51f7bdc55c01cec886098a9753ce8c28 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 27 Oct 2022 14:10:42 +0100 +Subject: [PATCH 01/10] net: mtk_eth_soc: add definitions for PCS + +As a result of help from Frank Wunderlich to investigate and test, we +know a bit more about the PCS on the Mediatek platforms. Update the +definitions from this investigation. + +This PCS appears similar, but not identical to the Lynx PCS. + +Although not included in this patch, but for future reference, the PHY +ID registers at offset 4 read as 0x4d544950 'MTIP'. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -501,8 +501,10 @@ + #define ETHSYS_DMA_AG_MAP_PPE BIT(2) + + /* SGMII subsystem config registers */ +-/* Register to auto-negotiation restart */ ++/* BMCR (low 16) BMSR (high 16) */ + #define SGMSYS_PCS_CONTROL_1 0x0 ++#define SGMII_BMCR GENMASK(15, 0) ++#define SGMII_BMSR GENMASK(31, 16) + #define SGMII_AN_RESTART BIT(9) + #define SGMII_ISOLATE BIT(10) + #define SGMII_AN_ENABLE BIT(12) +@@ -512,13 +514,18 @@ + #define SGMII_PCS_FAULT BIT(23) + #define SGMII_AN_EXPANSION_CLR BIT(30) + ++#define SGMSYS_PCS_ADVERTISE 0x8 ++#define SGMII_ADVERTISE GENMASK(15, 0) ++#define SGMII_LPA GENMASK(31, 16) ++ + /* Register to programmable link timer, the unit in 2 * 8ns */ + #define SGMSYS_PCS_LINK_TIMER 0x18 +-#define SGMII_LINK_TIMER_DEFAULT (0x186a0 & GENMASK(19, 0)) ++#define SGMII_LINK_TIMER_MASK GENMASK(19, 0) ++#define SGMII_LINK_TIMER_DEFAULT (0x186a0 & SGMII_LINK_TIMER_MASK) + + /* Register to control remote fault */ + #define SGMSYS_SGMII_MODE 0x20 +-#define SGMII_IF_MODE_BIT0 BIT(0) ++#define SGMII_IF_MODE_SGMII BIT(0) + #define SGMII_SPEED_DUPLEX_AN BIT(1) + #define SGMII_SPEED_MASK GENMASK(3, 2) + #define SGMII_SPEED_10 FIELD_PREP(SGMII_SPEED_MASK, 0) diff --git a/target/linux/generic/backport-5.15/733-v6.2-03-net-mtk_eth_soc-eliminate-unnecessary-error-handling.patch b/target/linux/generic/backport-5.15/733-v6.2-03-net-mtk_eth_soc-eliminate-unnecessary-error-handling.patch new file mode 100644 index 0000000000..4ea428c9d6 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-03-net-mtk_eth_soc-eliminate-unnecessary-error-handling.patch @@ -0,0 +1,74 @@ +From 5cf7797526ee81bea0f627bccaa3d887f48f53e0 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 27 Oct 2022 14:10:47 +0100 +Subject: [PATCH 02/10] net: mtk_eth_soc: eliminate unnecessary error handling + +The functions called by the pcs_config() method always return zero, so +there is no point trying to handle an error from these functions. Make +these functions void, eliminate the "err" variable and simply return +zero from the pcs_config() function itself. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 18 ++++++------------ + 1 file changed, 6 insertions(+), 12 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -20,7 +20,7 @@ static struct mtk_pcs *pcs_to_mtk_pcs(st + } + + /* For SGMII interface mode */ +-static int mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs) ++static void mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs) + { + unsigned int val; + +@@ -39,16 +39,13 @@ static int mtk_pcs_setup_mode_an(struct + regmap_read(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, &val); + val &= ~SGMII_PHYA_PWD; + regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, val); +- +- return 0; +- + } + + /* For 1000BASE-X and 2500BASE-X interface modes, which operate at a + * fixed speed. + */ +-static int mtk_pcs_setup_mode_force(struct mtk_pcs *mpcs, +- phy_interface_t interface) ++static void mtk_pcs_setup_mode_force(struct mtk_pcs *mpcs, ++ phy_interface_t interface) + { + unsigned int val; + +@@ -73,8 +70,6 @@ static int mtk_pcs_setup_mode_force(stru + regmap_read(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, &val); + val &= ~SGMII_PHYA_PWD; + regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, val); +- +- return 0; + } + + static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode, +@@ -83,15 +78,14 @@ static int mtk_pcs_config(struct phylink + bool permit_pause_to_mac) + { + struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); +- int err = 0; + + /* Setup SGMIISYS with the determined property */ + if (interface != PHY_INTERFACE_MODE_SGMII) +- err = mtk_pcs_setup_mode_force(mpcs, interface); ++ mtk_pcs_setup_mode_force(mpcs, interface); + else if (phylink_autoneg_inband(mode)) +- err = mtk_pcs_setup_mode_an(mpcs); ++ mtk_pcs_setup_mode_an(mpcs); + +- return err; ++ return 0; + } + + static void mtk_pcs_restart_an(struct phylink_pcs *pcs) diff --git a/target/linux/generic/backport-5.15/733-v6.2-04-net-mtk_eth_soc-add-pcs_get_state-implementation.patch b/target/linux/generic/backport-5.15/733-v6.2-04-net-mtk_eth_soc-add-pcs_get_state-implementation.patch new file mode 100644 index 0000000000..64a4a72fa6 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-04-net-mtk_eth_soc-add-pcs_get_state-implementation.patch @@ -0,0 +1,46 @@ +From c000dca098002da193b98099df051c9ead0cacb4 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 27 Oct 2022 14:10:52 +0100 +Subject: [PATCH 03/10] net: mtk_eth_soc: add pcs_get_state() implementation + +Add a pcs_get_state() implementation which uses the advertisements +to compute the resulting link modes, and BMSR contents to determine +negotiation and link status. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -19,6 +19,20 @@ static struct mtk_pcs *pcs_to_mtk_pcs(st + return container_of(pcs, struct mtk_pcs, pcs); + } + ++static void mtk_pcs_get_state(struct phylink_pcs *pcs, ++ struct phylink_link_state *state) ++{ ++ struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); ++ unsigned int bm, adv; ++ ++ /* Read the BMSR and LPA */ ++ regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &bm); ++ regmap_read(mpcs->regmap, SGMSYS_PCS_ADVERTISE, &adv); ++ ++ phylink_mii_c22_pcs_decode_state(state, FIELD_GET(SGMII_BMSR, bm), ++ FIELD_GET(SGMII_LPA, adv)); ++} ++ + /* For SGMII interface mode */ + static void mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs) + { +@@ -117,6 +131,7 @@ static void mtk_pcs_link_up(struct phyli + } + + static const struct phylink_pcs_ops mtk_pcs_ops = { ++ .pcs_get_state = mtk_pcs_get_state, + .pcs_config = mtk_pcs_config, + .pcs_an_restart = mtk_pcs_restart_an, + .pcs_link_up = mtk_pcs_link_up, diff --git a/target/linux/generic/backport-5.15/733-v6.2-05-net-mtk_eth_soc-convert-mtk_sgmii-to-use-regmap_upda.patch b/target/linux/generic/backport-5.15/733-v6.2-05-net-mtk_eth_soc-convert-mtk_sgmii-to-use-regmap_upda.patch new file mode 100644 index 0000000000..24610fe11e --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-05-net-mtk_eth_soc-convert-mtk_sgmii-to-use-regmap_upda.patch @@ -0,0 +1,130 @@ +From 0d2351dc2768061689abd4de1529fa206bbd574e Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 27 Oct 2022 14:10:58 +0100 +Subject: [PATCH 04/10] net: mtk_eth_soc: convert mtk_sgmii to use + regmap_update_bits() + +mtk_sgmii does a lot of read-modify-write operations, for which there +is a specific regmap function. Use this function instead of open-coding +the operations. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 61 ++++++++++------------- + 1 file changed, 26 insertions(+), 35 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -36,23 +36,18 @@ static void mtk_pcs_get_state(struct phy + /* For SGMII interface mode */ + static void mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs) + { +- unsigned int val; +- + /* Setup the link timer and QPHY power up inside SGMIISYS */ + regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER, + SGMII_LINK_TIMER_DEFAULT); + +- regmap_read(mpcs->regmap, SGMSYS_SGMII_MODE, &val); +- val |= SGMII_REMOTE_FAULT_DIS; +- regmap_write(mpcs->regmap, SGMSYS_SGMII_MODE, val); +- +- regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &val); +- val |= SGMII_AN_RESTART; +- regmap_write(mpcs->regmap, SGMSYS_PCS_CONTROL_1, val); +- +- regmap_read(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, &val); +- val &= ~SGMII_PHYA_PWD; +- regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, val); ++ regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, ++ SGMII_REMOTE_FAULT_DIS, SGMII_REMOTE_FAULT_DIS); ++ ++ regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, ++ SGMII_AN_RESTART, SGMII_AN_RESTART); ++ ++ regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, ++ SGMII_PHYA_PWD, 0); + } + + /* For 1000BASE-X and 2500BASE-X interface modes, which operate at a +@@ -61,29 +56,26 @@ static void mtk_pcs_setup_mode_an(struct + static void mtk_pcs_setup_mode_force(struct mtk_pcs *mpcs, + phy_interface_t interface) + { +- unsigned int val; ++ unsigned int rgc3; + +- regmap_read(mpcs->regmap, mpcs->ana_rgc3, &val); +- val &= ~RG_PHY_SPEED_MASK; + if (interface == PHY_INTERFACE_MODE_2500BASEX) +- val |= RG_PHY_SPEED_3_125G; +- regmap_write(mpcs->regmap, mpcs->ana_rgc3, val); ++ rgc3 = RG_PHY_SPEED_3_125G; ++ ++ regmap_update_bits(mpcs->regmap, mpcs->ana_rgc3, ++ RG_PHY_SPEED_3_125G, rgc3); + + /* Disable SGMII AN */ +- regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &val); +- val &= ~SGMII_AN_ENABLE; +- regmap_write(mpcs->regmap, SGMSYS_PCS_CONTROL_1, val); ++ regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, ++ SGMII_AN_ENABLE, 0); + + /* Set the speed etc but leave the duplex unchanged */ +- regmap_read(mpcs->regmap, SGMSYS_SGMII_MODE, &val); +- val &= SGMII_DUPLEX_FULL | ~SGMII_IF_MODE_MASK; +- val |= SGMII_SPEED_1000; +- regmap_write(mpcs->regmap, SGMSYS_SGMII_MODE, val); ++ regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, ++ SGMII_IF_MODE_MASK & ~SGMII_DUPLEX_FULL, ++ SGMII_SPEED_1000); + + /* Release PHYA power down state */ +- regmap_read(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, &val); +- val &= ~SGMII_PHYA_PWD; +- regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, val); ++ regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, ++ SGMII_PHYA_PWD, 0); + } + + static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode, +@@ -105,29 +97,28 @@ static int mtk_pcs_config(struct phylink + static void mtk_pcs_restart_an(struct phylink_pcs *pcs) + { + struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); +- unsigned int val; + +- regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &val); +- val |= SGMII_AN_RESTART; +- regmap_write(mpcs->regmap, SGMSYS_PCS_CONTROL_1, val); ++ regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, ++ SGMII_AN_RESTART, SGMII_AN_RESTART); + } + + static void mtk_pcs_link_up(struct phylink_pcs *pcs, unsigned int mode, + phy_interface_t interface, int speed, int duplex) + { + struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); +- unsigned int val; ++ unsigned int sgm_mode; + + if (!phy_interface_mode_is_8023z(interface)) + return; + + /* SGMII force duplex setting */ +- regmap_read(mpcs->regmap, SGMSYS_SGMII_MODE, &val); +- val &= ~SGMII_DUPLEX_FULL; + if (duplex == DUPLEX_FULL) +- val |= SGMII_DUPLEX_FULL; ++ sgm_mode = SGMII_DUPLEX_FULL; ++ else ++ sgm_mode = 0; + +- regmap_write(mpcs->regmap, SGMSYS_SGMII_MODE, val); ++ regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, ++ SGMII_DUPLEX_FULL, sgm_mode); + } + + static const struct phylink_pcs_ops mtk_pcs_ops = { diff --git a/target/linux/generic/backport-5.15/733-v6.2-06-net-mtk_eth_soc-add-out-of-band-forcing-of-speed-and.patch b/target/linux/generic/backport-5.15/733-v6.2-06-net-mtk_eth_soc-add-out-of-band-forcing-of-speed-and.patch new file mode 100644 index 0000000000..ba76ca40ff --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-06-net-mtk_eth_soc-add-out-of-band-forcing-of-speed-and.patch @@ -0,0 +1,52 @@ +From 12198c3a410fe69843e335c1bbf6d4c2a4d48e4e Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 27 Oct 2022 14:11:03 +0100 +Subject: [PATCH 05/10] net: mtk_eth_soc: add out of band forcing of speed and + duplex in pcs_link_up + +Add support for forcing the link speed and duplex setting in the +pcs_link_up() method for out of band modes, which will be useful when +we finish converting the pcs_config() method. Until then, we still have +to force duplex for 802.3z modes to work correctly. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 28 ++++++++++++++--------- + 1 file changed, 17 insertions(+), 11 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -108,17 +108,23 @@ static void mtk_pcs_link_up(struct phyli + struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); + unsigned int sgm_mode; + +- if (!phy_interface_mode_is_8023z(interface)) +- return; ++ if (!phylink_autoneg_inband(mode) || ++ phy_interface_mode_is_8023z(interface)) { ++ /* Force the speed and duplex setting */ ++ if (speed == SPEED_10) ++ sgm_mode = SGMII_SPEED_10; ++ else if (speed == SPEED_100) ++ sgm_mode = SGMII_SPEED_100; ++ else ++ sgm_mode = SGMII_SPEED_1000; + +- /* SGMII force duplex setting */ +- if (duplex == DUPLEX_FULL) +- sgm_mode = SGMII_DUPLEX_FULL; +- else +- sgm_mode = 0; ++ if (duplex == DUPLEX_FULL) ++ sgm_mode |= SGMII_DUPLEX_FULL; + +- regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, +- SGMII_DUPLEX_FULL, sgm_mode); ++ regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, ++ SGMII_DUPLEX_FULL | SGMII_SPEED_MASK, ++ sgm_mode); ++ } + } + + static const struct phylink_pcs_ops mtk_pcs_ops = { diff --git a/target/linux/generic/backport-5.15/733-v6.2-07-net-mtk_eth_soc-move-PHY-power-up.patch b/target/linux/generic/backport-5.15/733-v6.2-07-net-mtk_eth_soc-move-PHY-power-up.patch new file mode 100644 index 0000000000..b76e159275 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-07-net-mtk_eth_soc-move-PHY-power-up.patch @@ -0,0 +1,48 @@ +From 6f38fffe2179dd29612aea2c67c46ed6682b4e46 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 27 Oct 2022 14:11:08 +0100 +Subject: [PATCH 06/10] net: mtk_eth_soc: move PHY power up + +The PHY power up is common to both configuration paths, so move it into +the parent function. We need to do this for all serdes modes. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -45,9 +45,6 @@ static void mtk_pcs_setup_mode_an(struct + + regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, + SGMII_AN_RESTART, SGMII_AN_RESTART); +- +- regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, +- SGMII_PHYA_PWD, 0); + } + + /* For 1000BASE-X and 2500BASE-X interface modes, which operate at a +@@ -72,10 +69,6 @@ static void mtk_pcs_setup_mode_force(str + regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, + SGMII_IF_MODE_MASK & ~SGMII_DUPLEX_FULL, + SGMII_SPEED_1000); +- +- /* Release PHYA power down state */ +- regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, +- SGMII_PHYA_PWD, 0); + } + + static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode, +@@ -91,6 +84,10 @@ static int mtk_pcs_config(struct phylink + else if (phylink_autoneg_inband(mode)) + mtk_pcs_setup_mode_an(mpcs); + ++ /* Release PHYA power down state */ ++ regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, ++ SGMII_PHYA_PWD, 0); ++ + return 0; + } + diff --git a/target/linux/generic/backport-5.15/733-v6.2-08-net-mtk_eth_soc-move-interface-speed-selection.patch b/target/linux/generic/backport-5.15/733-v6.2-08-net-mtk_eth_soc-move-interface-speed-selection.patch new file mode 100644 index 0000000000..cd9f0699b3 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-08-net-mtk_eth_soc-move-interface-speed-selection.patch @@ -0,0 +1,48 @@ +From f752c0df13dfeb721c11d3debb79f08cf437344f Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 27 Oct 2022 14:11:13 +0100 +Subject: [PATCH 07/10] net: mtk_eth_soc: move interface speed selection + +Move the selection of the underlying interface speed to the pcs_config +function, so we always program the interface speed. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -53,14 +53,6 @@ static void mtk_pcs_setup_mode_an(struct + static void mtk_pcs_setup_mode_force(struct mtk_pcs *mpcs, + phy_interface_t interface) + { +- unsigned int rgc3; +- +- if (interface == PHY_INTERFACE_MODE_2500BASEX) +- rgc3 = RG_PHY_SPEED_3_125G; +- +- regmap_update_bits(mpcs->regmap, mpcs->ana_rgc3, +- RG_PHY_SPEED_3_125G, rgc3); +- + /* Disable SGMII AN */ + regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, + SGMII_AN_ENABLE, 0); +@@ -77,6 +69,16 @@ static int mtk_pcs_config(struct phylink + bool permit_pause_to_mac) + { + struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); ++ unsigned int rgc3; ++ ++ if (interface == PHY_INTERFACE_MODE_2500BASEX) ++ rgc3 = RG_PHY_SPEED_3_125G; ++ else ++ rgc3 = 0; ++ ++ /* Configure the underlying interface speed */ ++ regmap_update_bits(mpcs->regmap, mpcs->ana_rgc3, ++ RG_PHY_SPEED_3_125G, rgc3); + + /* Setup SGMIISYS with the determined property */ + if (interface != PHY_INTERFACE_MODE_SGMII) diff --git a/target/linux/generic/backport-5.15/733-v6.2-09-net-mtk_eth_soc-add-advertisement-programming.patch b/target/linux/generic/backport-5.15/733-v6.2-09-net-mtk_eth_soc-add-advertisement-programming.patch new file mode 100644 index 0000000000..f08358e963 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-09-net-mtk_eth_soc-add-advertisement-programming.patch @@ -0,0 +1,52 @@ +From c125c66ea71b9377ae2478c4f1b87b180cc5c6ef Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 27 Oct 2022 14:11:18 +0100 +Subject: [PATCH 08/10] net: mtk_eth_soc: add advertisement programming + +Program the advertisement into the mtk PCS block. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -70,16 +70,27 @@ static int mtk_pcs_config(struct phylink + { + struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); + unsigned int rgc3; ++ int advertise; ++ bool changed; + + if (interface == PHY_INTERFACE_MODE_2500BASEX) + rgc3 = RG_PHY_SPEED_3_125G; + else + rgc3 = 0; + ++ advertise = phylink_mii_c22_pcs_encode_advertisement(interface, ++ advertising); ++ if (advertise < 0) ++ return advertise; ++ + /* Configure the underlying interface speed */ + regmap_update_bits(mpcs->regmap, mpcs->ana_rgc3, + RG_PHY_SPEED_3_125G, rgc3); + ++ /* Update the advertisement, noting whether it has changed */ ++ regmap_update_bits_check(mpcs->regmap, SGMSYS_PCS_ADVERTISE, ++ SGMII_ADVERTISE, advertise, &changed); ++ + /* Setup SGMIISYS with the determined property */ + if (interface != PHY_INTERFACE_MODE_SGMII) + mtk_pcs_setup_mode_force(mpcs, interface); +@@ -90,7 +101,7 @@ static int mtk_pcs_config(struct phylink + regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, + SGMII_PHYA_PWD, 0); + +- return 0; ++ return changed; + } + + static void mtk_pcs_restart_an(struct phylink_pcs *pcs) diff --git a/target/linux/generic/backport-5.15/733-v6.2-10-net-mtk_eth_soc-move-and-correct-link-timer-programm.patch b/target/linux/generic/backport-5.15/733-v6.2-10-net-mtk_eth_soc-move-and-correct-link-timer-programm.patch new file mode 100644 index 0000000000..602d52c6f4 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-10-net-mtk_eth_soc-move-and-correct-link-timer-programm.patch @@ -0,0 +1,63 @@ +From 3027d89f87707e7f3e5b683e0d37a32afb5bde96 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 27 Oct 2022 14:11:23 +0100 +Subject: [PATCH 09/10] net: mtk_eth_soc: move and correct link timer + programming + +Program the link timer appropriately for the interface mode being +used, using the newly introduced phylink helper that provides the +nanosecond link timer interval. + +The intervals are 1.6ms for SGMII based protocols and 10ms for +802.3z based protocols. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -36,10 +36,6 @@ static void mtk_pcs_get_state(struct phy + /* For SGMII interface mode */ + static void mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs) + { +- /* Setup the link timer and QPHY power up inside SGMIISYS */ +- regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER, +- SGMII_LINK_TIMER_DEFAULT); +- + regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, + SGMII_REMOTE_FAULT_DIS, SGMII_REMOTE_FAULT_DIS); + +@@ -69,8 +65,8 @@ static int mtk_pcs_config(struct phylink + bool permit_pause_to_mac) + { + struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); ++ int advertise, link_timer; + unsigned int rgc3; +- int advertise; + bool changed; + + if (interface == PHY_INTERFACE_MODE_2500BASEX) +@@ -83,6 +79,10 @@ static int mtk_pcs_config(struct phylink + if (advertise < 0) + return advertise; + ++ link_timer = phylink_get_link_timer_ns(interface); ++ if (link_timer < 0) ++ return link_timer; ++ + /* Configure the underlying interface speed */ + regmap_update_bits(mpcs->regmap, mpcs->ana_rgc3, + RG_PHY_SPEED_3_125G, rgc3); +@@ -91,6 +91,9 @@ static int mtk_pcs_config(struct phylink + regmap_update_bits_check(mpcs->regmap, SGMSYS_PCS_ADVERTISE, + SGMII_ADVERTISE, advertise, &changed); + ++ /* Setup the link timer and QPHY power up inside SGMIISYS */ ++ regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER, link_timer / 2 / 8); ++ + /* Setup SGMIISYS with the determined property */ + if (interface != PHY_INTERFACE_MODE_SGMII) + mtk_pcs_setup_mode_force(mpcs, interface); diff --git a/target/linux/generic/backport-5.15/733-v6.2-11-net-mtk_eth_soc-add-support-for-in-band-802.3z-negot.patch b/target/linux/generic/backport-5.15/733-v6.2-11-net-mtk_eth_soc-add-support-for-in-band-802.3z-negot.patch new file mode 100644 index 0000000000..0e9a0535a7 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-11-net-mtk_eth_soc-add-support-for-in-band-802.3z-negot.patch @@ -0,0 +1,132 @@ +From 81b0f12a2a8a1699a7d49c3995e5f71e4ec018e6 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 27 Oct 2022 14:11:28 +0100 +Subject: [PATCH 10/10] net: mtk_eth_soc: add support for in-band 802.3z + negotiation + +As a result of help from Frank Wunderlich to investigate and test, we +now know how to program this PCS for in-band 802.3z negotiation. Add +support for this by moving the contents of the two functions into the +common mtk_pcs_config() function and adding the register settings for +802.3z negotiation. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 77 ++++++++++++----------- + 1 file changed, 42 insertions(+), 35 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -33,41 +33,15 @@ static void mtk_pcs_get_state(struct phy + FIELD_GET(SGMII_LPA, adv)); + } + +-/* For SGMII interface mode */ +-static void mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs) +-{ +- regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, +- SGMII_REMOTE_FAULT_DIS, SGMII_REMOTE_FAULT_DIS); +- +- regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, +- SGMII_AN_RESTART, SGMII_AN_RESTART); +-} +- +-/* For 1000BASE-X and 2500BASE-X interface modes, which operate at a +- * fixed speed. +- */ +-static void mtk_pcs_setup_mode_force(struct mtk_pcs *mpcs, +- phy_interface_t interface) +-{ +- /* Disable SGMII AN */ +- regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, +- SGMII_AN_ENABLE, 0); +- +- /* Set the speed etc but leave the duplex unchanged */ +- regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, +- SGMII_IF_MODE_MASK & ~SGMII_DUPLEX_FULL, +- SGMII_SPEED_1000); +-} +- + static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode, + phy_interface_t interface, + const unsigned long *advertising, + bool permit_pause_to_mac) + { + struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); ++ unsigned int rgc3, sgm_mode, bmcr; + int advertise, link_timer; +- unsigned int rgc3; +- bool changed; ++ bool changed, use_an; + + if (interface == PHY_INTERFACE_MODE_2500BASEX) + rgc3 = RG_PHY_SPEED_3_125G; +@@ -83,6 +57,37 @@ static int mtk_pcs_config(struct phylink + if (link_timer < 0) + return link_timer; + ++ /* Clearing IF_MODE_BIT0 switches the PCS to BASE-X mode, and ++ * we assume that fixes it's speed at bitrate = line rate (in ++ * other words, 1000Mbps or 2500Mbps). ++ */ ++ if (interface == PHY_INTERFACE_MODE_SGMII) { ++ sgm_mode = SGMII_IF_MODE_SGMII; ++ if (phylink_autoneg_inband(mode)) { ++ sgm_mode |= SGMII_REMOTE_FAULT_DIS | ++ SGMII_SPEED_DUPLEX_AN; ++ use_an = true; ++ } else { ++ use_an = false; ++ } ++ } else if (phylink_autoneg_inband(mode)) { ++ /* 1000base-X or 2500base-X autoneg */ ++ sgm_mode = SGMII_REMOTE_FAULT_DIS; ++ use_an = linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, ++ advertising); ++ } else { ++ /* 1000base-X or 2500base-X without autoneg */ ++ sgm_mode = 0; ++ use_an = false; ++ } ++ ++ if (use_an) { ++ /* FIXME: Do we need to set AN_RESTART here? */ ++ bmcr = SGMII_AN_RESTART | SGMII_AN_ENABLE; ++ } else { ++ bmcr = 0; ++ } ++ + /* Configure the underlying interface speed */ + regmap_update_bits(mpcs->regmap, mpcs->ana_rgc3, + RG_PHY_SPEED_3_125G, rgc3); +@@ -94,11 +99,14 @@ static int mtk_pcs_config(struct phylink + /* Setup the link timer and QPHY power up inside SGMIISYS */ + regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER, link_timer / 2 / 8); + +- /* Setup SGMIISYS with the determined property */ +- if (interface != PHY_INTERFACE_MODE_SGMII) +- mtk_pcs_setup_mode_force(mpcs, interface); +- else if (phylink_autoneg_inband(mode)) +- mtk_pcs_setup_mode_an(mpcs); ++ /* Update the sgmsys mode register */ ++ regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, ++ SGMII_REMOTE_FAULT_DIS | SGMII_SPEED_DUPLEX_AN | ++ SGMII_IF_MODE_SGMII, sgm_mode); ++ ++ /* Update the BMCR */ ++ regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, ++ SGMII_AN_RESTART | SGMII_AN_ENABLE, bmcr); + + /* Release PHYA power down state */ + regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, +@@ -121,8 +129,7 @@ static void mtk_pcs_link_up(struct phyli + struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); + unsigned int sgm_mode; + +- if (!phylink_autoneg_inband(mode) || +- phy_interface_mode_is_8023z(interface)) { ++ if (!phylink_autoneg_inband(mode)) { + /* Force the speed and duplex setting */ + if (speed == SPEED_10) + sgm_mode = SGMII_SPEED_10; diff --git a/target/linux/generic/backport-5.15/733-v6.2-12-net-mediatek-sgmii-ensure-the-SGMII-PHY-is-powered-d.patch b/target/linux/generic/backport-5.15/733-v6.2-12-net-mediatek-sgmii-ensure-the-SGMII-PHY-is-powered-d.patch new file mode 100644 index 0000000000..598788d998 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-12-net-mediatek-sgmii-ensure-the-SGMII-PHY-is-powered-d.patch @@ -0,0 +1,119 @@ +From 7ff82416de8295c61423ef6fd75f052d3837d2f7 Mon Sep 17 00:00:00 2001 +From: Alexander Couzens +Date: Wed, 1 Feb 2023 19:23:29 +0100 +Subject: [PATCH 11/13] net: mediatek: sgmii: ensure the SGMII PHY is powered + down on configuration +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The code expect the PHY to be in power down which is only true after reset. +Allow changes of the SGMII parameters more than once. + +Only power down when reconfiguring to avoid bouncing the link when there's +no reason to - based on code from Russell King. + +There are cases when the SGMII_PHYA_PWD register contains 0x9 which +prevents SGMII from working. The SGMII still shows link but no traffic +can flow. Writing 0x0 to the PHYA_PWD register fix the issue. 0x0 was +taken from a good working state of the SGMII interface. + +Fixes: 42c03844e93d ("net-next: mediatek: add support for MediaTek MT7622 SoC") +Suggested-by: Russell King (Oracle) +Signed-off-by: Alexander Couzens +[ bmork: rebased and squashed into one patch ] +Reviewed-by: Russell King (Oracle) +Signed-off-by: Bjørn Mork +Acked-by: Daniel Golle +Tested-by: Daniel Golle +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 ++ + drivers/net/ethernet/mediatek/mtk_sgmii.c | 39 +++++++++++++++------ + 2 files changed, 30 insertions(+), 11 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1064,11 +1064,13 @@ struct mtk_soc_data { + * @regmap: The register map pointing at the range used to setup + * SGMII modes + * @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap ++ * @interface: Currently configured interface mode + * @pcs: Phylink PCS structure + */ + struct mtk_pcs { + struct regmap *regmap; + u32 ana_rgc3; ++ phy_interface_t interface; + struct phylink_pcs pcs; + }; + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -43,11 +43,6 @@ static int mtk_pcs_config(struct phylink + int advertise, link_timer; + bool changed, use_an; + +- if (interface == PHY_INTERFACE_MODE_2500BASEX) +- rgc3 = RG_PHY_SPEED_3_125G; +- else +- rgc3 = 0; +- + advertise = phylink_mii_c22_pcs_encode_advertisement(interface, + advertising); + if (advertise < 0) +@@ -88,9 +83,22 @@ static int mtk_pcs_config(struct phylink + bmcr = 0; + } + +- /* Configure the underlying interface speed */ +- regmap_update_bits(mpcs->regmap, mpcs->ana_rgc3, +- RG_PHY_SPEED_3_125G, rgc3); ++ if (mpcs->interface != interface) { ++ /* PHYA power down */ ++ regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, ++ SGMII_PHYA_PWD, SGMII_PHYA_PWD); ++ ++ if (interface == PHY_INTERFACE_MODE_2500BASEX) ++ rgc3 = RG_PHY_SPEED_3_125G; ++ else ++ rgc3 = 0; ++ ++ /* Configure the underlying interface speed */ ++ regmap_update_bits(mpcs->regmap, mpcs->ana_rgc3, ++ RG_PHY_SPEED_3_125G, rgc3); ++ ++ mpcs->interface = interface; ++ } + + /* Update the advertisement, noting whether it has changed */ + regmap_update_bits_check(mpcs->regmap, SGMSYS_PCS_ADVERTISE, +@@ -108,9 +116,17 @@ static int mtk_pcs_config(struct phylink + regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, + SGMII_AN_RESTART | SGMII_AN_ENABLE, bmcr); + +- /* Release PHYA power down state */ +- regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, +- SGMII_PHYA_PWD, 0); ++ /* Release PHYA power down state ++ * Only removing bit SGMII_PHYA_PWD isn't enough. ++ * There are cases when the SGMII_PHYA_PWD register contains 0x9 which ++ * prevents SGMII from working. The SGMII still shows link but no traffic ++ * can flow. Writing 0x0 to the PHYA_PWD register fix the issue. 0x0 was ++ * taken from a good working state of the SGMII interface. ++ * Unknown how much the QPHY needs but it is racy without a sleep. ++ * Tested on mt7622 & mt7986. ++ */ ++ usleep_range(50, 100); ++ regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, 0); + + return changed; + } +@@ -171,6 +187,7 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, + return PTR_ERR(ss->pcs[i].regmap); + + ss->pcs[i].pcs.ops = &mtk_pcs_ops; ++ ss->pcs[i].interface = PHY_INTERFACE_MODE_NA; + } + + return 0; diff --git a/target/linux/generic/backport-5.15/733-v6.2-13-net-mediatek-sgmii-fix-duplex-configuration.patch b/target/linux/generic/backport-5.15/733-v6.2-13-net-mediatek-sgmii-fix-duplex-configuration.patch new file mode 100644 index 0000000000..79e5ad147c --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-13-net-mediatek-sgmii-fix-duplex-configuration.patch @@ -0,0 +1,52 @@ +From 9d32637122de88f1ef614c29703f0e050cad342e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= +Date: Wed, 1 Feb 2023 19:23:30 +0100 +Subject: [PATCH 12/13] net: mediatek: sgmii: fix duplex configuration +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The logic of the duplex bit is inverted. Setting it means half +duplex, not full duplex. + +Fix and rename macro to avoid confusion. + +Fixes: 7e538372694b ("net: ethernet: mediatek: Re-add support SGMII") +Reviewed-by: Russell King (Oracle) +Signed-off-by: Bjørn Mork +Acked-by: Daniel Golle +Tested-by: Daniel Golle +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -531,7 +531,7 @@ + #define SGMII_SPEED_10 FIELD_PREP(SGMII_SPEED_MASK, 0) + #define SGMII_SPEED_100 FIELD_PREP(SGMII_SPEED_MASK, 1) + #define SGMII_SPEED_1000 FIELD_PREP(SGMII_SPEED_MASK, 2) +-#define SGMII_DUPLEX_FULL BIT(4) ++#define SGMII_DUPLEX_HALF BIT(4) + #define SGMII_IF_MODE_BIT5 BIT(5) + #define SGMII_REMOTE_FAULT_DIS BIT(8) + #define SGMII_CODE_SYNC_SET_VAL BIT(9) +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -154,11 +154,11 @@ static void mtk_pcs_link_up(struct phyli + else + sgm_mode = SGMII_SPEED_1000; + +- if (duplex == DUPLEX_FULL) +- sgm_mode |= SGMII_DUPLEX_FULL; ++ if (duplex != DUPLEX_FULL) ++ sgm_mode |= SGMII_DUPLEX_HALF; + + regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, +- SGMII_DUPLEX_FULL | SGMII_SPEED_MASK, ++ SGMII_DUPLEX_HALF | SGMII_SPEED_MASK, + sgm_mode); + } + } diff --git a/target/linux/generic/backport-5.15/733-v6.2-14-mtk_sgmii-enable-PCS-polling-to-allow-SFP-work.patch b/target/linux/generic/backport-5.15/733-v6.2-14-mtk_sgmii-enable-PCS-polling-to-allow-SFP-work.patch new file mode 100644 index 0000000000..56d7a1348f --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.2-14-mtk_sgmii-enable-PCS-polling-to-allow-SFP-work.patch @@ -0,0 +1,33 @@ +From 3337a6e04ddf2923a1bdcf3d31b3b52412bf82dd Mon Sep 17 00:00:00 2001 +From: Alexander Couzens +Date: Wed, 1 Feb 2023 19:23:31 +0100 +Subject: [PATCH 13/13] mtk_sgmii: enable PCS polling to allow SFP work +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Currently there is no IRQ handling (even the SGMII supports it). +Enable polling to support SFP ports. + +Fixes: 14a44ab0330d ("net: mtk_eth_soc: partially convert to phylink_pcs") +Reviewed-by: Russell King (Oracle) +Signed-off-by: Alexander Couzens +[ bmork: changed "1" => "true" ] +Signed-off-by: Bjørn Mork +Acked-by: Daniel Golle +Tested-by: Daniel Golle +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -187,6 +187,7 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, + return PTR_ERR(ss->pcs[i].regmap); + + ss->pcs[i].pcs.ops = &mtk_pcs_ops; ++ ss->pcs[i].pcs.poll = true; + ss->pcs[i].interface = PHY_INTERFACE_MODE_NA; + } + diff --git a/target/linux/generic/backport-5.15/733-v6.3-15-net-ethernet-mtk_eth_soc-reset-PCS-state.patch b/target/linux/generic/backport-5.15/733-v6.3-15-net-ethernet-mtk_eth_soc-reset-PCS-state.patch new file mode 100644 index 0000000000..a63b110914 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.3-15-net-ethernet-mtk_eth_soc-reset-PCS-state.patch @@ -0,0 +1,48 @@ +From 611e2dabb4b3243d176739fd6a5a34d007fa3f86 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 14 Mar 2023 00:34:26 +0000 +Subject: [PATCH 1/2] net: ethernet: mtk_eth_soc: reset PCS state +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Reset the internal PCS state machine when changing interface mode. +This prevents confusing the state machine when changing interface +modes, e.g. from SGMII to 2500Base-X or vice-versa. + +Fixes: 7e538372694b ("net: ethernet: mediatek: Re-add support SGMII") +Reviewed-by: Russell King (Oracle) +Tested-by: Bjørn Mork +Signed-off-by: Daniel Golle +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 4 ++++ + drivers/net/ethernet/mediatek/mtk_sgmii.c | 4 ++++ + 2 files changed, 8 insertions(+) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -539,6 +539,10 @@ + #define SGMII_SEND_AN_ERROR_EN BIT(11) + #define SGMII_IF_MODE_MASK GENMASK(5, 1) + ++/* Register to reset SGMII design */ ++#define SGMII_RESERVED_0 0x34 ++#define SGMII_SW_RESET BIT(0) ++ + /* Register to set SGMII speed, ANA RG_ Control Signals III*/ + #define SGMSYS_ANA_RG_CS3 0x2028 + #define RG_PHY_SPEED_MASK (BIT(2) | BIT(3)) +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -88,6 +88,10 @@ static int mtk_pcs_config(struct phylink + regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, + SGMII_PHYA_PWD, SGMII_PHYA_PWD); + ++ /* Reset SGMII PCS state */ ++ regmap_update_bits(mpcs->regmap, SGMII_RESERVED_0, ++ SGMII_SW_RESET, SGMII_SW_RESET); ++ + if (interface == PHY_INTERFACE_MODE_2500BASEX) + rgc3 = RG_PHY_SPEED_3_125G; + else diff --git a/target/linux/generic/backport-5.15/733-v6.3-16-net-ethernet-mtk_eth_soc-only-write-values-if-needed.patch b/target/linux/generic/backport-5.15/733-v6.3-16-net-ethernet-mtk_eth_soc-only-write-values-if-needed.patch new file mode 100644 index 0000000000..0fabeea20c --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.3-16-net-ethernet-mtk_eth_soc-only-write-values-if-needed.patch @@ -0,0 +1,103 @@ +From 6e933a804c7db8be64f367f33e63cd7dcc302ebb Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 14 Mar 2023 00:34:45 +0000 +Subject: [PATCH 2/2] net: ethernet: mtk_eth_soc: only write values if needed +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Only restart auto-negotiation and write link timer if actually +necessary. This prevents losing the link in case of minor +changes. + +Fixes: 7e538372694b ("net: ethernet: mediatek: Re-add support SGMII") +Reviewed-by: Russell King (Oracle) +Tested-by: Bjørn Mork +Signed-off-by: Daniel Golle +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 24 +++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -38,20 +38,16 @@ static int mtk_pcs_config(struct phylink + const unsigned long *advertising, + bool permit_pause_to_mac) + { ++ bool mode_changed = false, changed, use_an; + struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); + unsigned int rgc3, sgm_mode, bmcr; + int advertise, link_timer; +- bool changed, use_an; + + advertise = phylink_mii_c22_pcs_encode_advertisement(interface, + advertising); + if (advertise < 0) + return advertise; + +- link_timer = phylink_get_link_timer_ns(interface); +- if (link_timer < 0) +- return link_timer; +- + /* Clearing IF_MODE_BIT0 switches the PCS to BASE-X mode, and + * we assume that fixes it's speed at bitrate = line rate (in + * other words, 1000Mbps or 2500Mbps). +@@ -77,13 +73,16 @@ static int mtk_pcs_config(struct phylink + } + + if (use_an) { +- /* FIXME: Do we need to set AN_RESTART here? */ +- bmcr = SGMII_AN_RESTART | SGMII_AN_ENABLE; ++ bmcr = SGMII_AN_ENABLE; + } else { + bmcr = 0; + } + + if (mpcs->interface != interface) { ++ link_timer = phylink_get_link_timer_ns(interface); ++ if (link_timer < 0) ++ return link_timer; ++ + /* PHYA power down */ + regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, + SGMII_PHYA_PWD, SGMII_PHYA_PWD); +@@ -101,16 +100,17 @@ static int mtk_pcs_config(struct phylink + regmap_update_bits(mpcs->regmap, mpcs->ana_rgc3, + RG_PHY_SPEED_3_125G, rgc3); + ++ /* Setup the link timer */ ++ regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER, link_timer / 2 / 8); ++ + mpcs->interface = interface; ++ mode_changed = true; + } + + /* Update the advertisement, noting whether it has changed */ + regmap_update_bits_check(mpcs->regmap, SGMSYS_PCS_ADVERTISE, + SGMII_ADVERTISE, advertise, &changed); + +- /* Setup the link timer and QPHY power up inside SGMIISYS */ +- regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER, link_timer / 2 / 8); +- + /* Update the sgmsys mode register */ + regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, + SGMII_REMOTE_FAULT_DIS | SGMII_SPEED_DUPLEX_AN | +@@ -118,7 +118,7 @@ static int mtk_pcs_config(struct phylink + + /* Update the BMCR */ + regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, +- SGMII_AN_RESTART | SGMII_AN_ENABLE, bmcr); ++ SGMII_AN_ENABLE, bmcr); + + /* Release PHYA power down state + * Only removing bit SGMII_PHYA_PWD isn't enough. +@@ -132,7 +132,7 @@ static int mtk_pcs_config(struct phylink + usleep_range(50, 100); + regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, 0); + +- return changed; ++ return changed || mode_changed; + } + + static void mtk_pcs_restart_an(struct phylink_pcs *pcs) diff --git a/target/linux/generic/backport-5.15/733-v6.3-18-net-ethernet-mtk_eth_soc-add-support-for-MT7981.patch b/target/linux/generic/backport-5.15/733-v6.3-18-net-ethernet-mtk_eth_soc-add-support-for-MT7981.patch new file mode 100644 index 0000000000..b59638e772 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.3-18-net-ethernet-mtk_eth_soc-add-support-for-MT7981.patch @@ -0,0 +1,200 @@ +From f5d43ddd334b7c32fcaed9ba46afbd85cb467f1f Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sun, 19 Mar 2023 12:56:28 +0000 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for MT7981 SoC + +The MediaTek MT7981 SoC comes with two 1G/2.5G SGMII ports, just like +MT7986. + +In addition MT7981 is equipped with a built-in 1000Base-T PHY which can +be used with GMAC1. + +As many MT7981 boards make use of inverting SGMII signal polarity, add +new device-tree attribute 'mediatek,pn_swap' to support them. + +Signed-off-by: Daniel Golle +Signed-off-by: Jakub Kicinski + +--- a/drivers/net/ethernet/mediatek/mtk_eth_path.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_path.c +@@ -96,12 +96,20 @@ static int set_mux_gmac2_gmac0_to_gephy( + + static int set_mux_u3_gmac2_to_qphy(struct mtk_eth *eth, int path) + { +- unsigned int val = 0; ++ unsigned int val = 0, mask = 0, reg = 0; + bool updated = true; + + switch (path) { + case MTK_ETH_PATH_GMAC2_SGMII: +- val = CO_QPHY_SEL; ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_U3_COPHY_V2)) { ++ reg = USB_PHY_SWITCH_REG; ++ val = SGMII_QPHY_SEL; ++ mask = QPHY_SEL_MASK; ++ } else { ++ reg = INFRA_MISC2; ++ val = CO_QPHY_SEL; ++ mask = val; ++ } + break; + default: + updated = false; +@@ -109,7 +117,7 @@ static int set_mux_u3_gmac2_to_qphy(stru + } + + if (updated) +- regmap_update_bits(eth->infra, INFRA_MISC2, CO_QPHY_SEL, val); ++ regmap_update_bits(eth->infra, reg, mask, val); + + dev_dbg(eth->dev, "path %s in %s updated = %d\n", + mtk_eth_path_name(path), __func__, updated); +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4752,6 +4752,26 @@ static const struct mtk_soc_data mt7629_ + }, + }; + ++static const struct mtk_soc_data mt7981_data = { ++ .reg_map = &mt7986_reg_map, ++ .ana_rgc3 = 0x128, ++ .caps = MT7981_CAPS, ++ .hw_features = MTK_HW_FEATURES, ++ .required_clks = MT7981_CLKS_BITMAP, ++ .required_pctl = false, ++ .offload_version = 2, ++ .hash_offset = 4, ++ .foe_entry_size = sizeof(struct mtk_foe_entry), ++ .txrx = { ++ .txd_size = sizeof(struct mtk_tx_dma_v2), ++ .rxd_size = sizeof(struct mtk_rx_dma_v2), ++ .rx_irq_done_mask = MTK_RX_DONE_INT_V2, ++ .rx_dma_l4_valid = RX_DMA_L4_VALID_V2, ++ .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, ++ .dma_len_offset = 8, ++ }, ++}; ++ + static const struct mtk_soc_data mt7986_data = { + .reg_map = &mt7986_reg_map, + .ana_rgc3 = 0x128, +@@ -4794,6 +4814,7 @@ const struct of_device_id of_mtk_match[] + { .compatible = "mediatek,mt7622-eth", .data = &mt7622_data}, + { .compatible = "mediatek,mt7623-eth", .data = &mt7623_data}, + { .compatible = "mediatek,mt7629-eth", .data = &mt7629_data}, ++ { .compatible = "mediatek,mt7981-eth", .data = &mt7981_data}, + { .compatible = "mediatek,mt7986-eth", .data = &mt7986_data}, + { .compatible = "ralink,rt5350-eth", .data = &rt5350_data}, + {}, +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -553,11 +553,22 @@ + #define SGMSYS_QPHY_PWR_STATE_CTRL 0xe8 + #define SGMII_PHYA_PWD BIT(4) + ++/* Register to QPHY wrapper control */ ++#define SGMSYS_QPHY_WRAP_CTRL 0xec ++#define SGMII_PN_SWAP_MASK GENMASK(1, 0) ++#define SGMII_PN_SWAP_TX_RX (BIT(0) | BIT(1)) ++#define MTK_SGMII_FLAG_PN_SWAP BIT(0) ++ + /* Infrasys subsystem config registers */ + #define INFRA_MISC2 0x70c + #define CO_QPHY_SEL BIT(0) + #define GEPHY_MAC_SEL BIT(1) + ++/* Top misc registers */ ++#define USB_PHY_SWITCH_REG 0x218 ++#define QPHY_SEL_MASK GENMASK(1, 0) ++#define SGMII_QPHY_SEL 0x2 ++ + /* MT7628/88 specific stuff */ + #define MT7628_PDMA_OFFSET 0x0800 + #define MT7628_SDM_OFFSET 0x0c00 +@@ -738,6 +749,17 @@ enum mtk_clks_map { + BIT(MTK_CLK_SGMII2_CDR_FB) | \ + BIT(MTK_CLK_SGMII_CK) | \ + BIT(MTK_CLK_ETH2PLL) | BIT(MTK_CLK_SGMIITOP)) ++#define MT7981_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \ ++ BIT(MTK_CLK_WOCPU0) | \ ++ BIT(MTK_CLK_SGMII_TX_250M) | \ ++ BIT(MTK_CLK_SGMII_RX_250M) | \ ++ BIT(MTK_CLK_SGMII_CDR_REF) | \ ++ BIT(MTK_CLK_SGMII_CDR_FB) | \ ++ BIT(MTK_CLK_SGMII2_TX_250M) | \ ++ BIT(MTK_CLK_SGMII2_RX_250M) | \ ++ BIT(MTK_CLK_SGMII2_CDR_REF) | \ ++ BIT(MTK_CLK_SGMII2_CDR_FB) | \ ++ BIT(MTK_CLK_SGMII_CK)) + #define MT7986_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \ + BIT(MTK_CLK_WOCPU1) | BIT(MTK_CLK_WOCPU0) | \ + BIT(MTK_CLK_SGMII_TX_250M) | \ +@@ -851,6 +873,7 @@ enum mkt_eth_capabilities { + MTK_NETSYS_V2_BIT, + MTK_SOC_MT7628_BIT, + MTK_RSTCTRL_PPE1_BIT, ++ MTK_U3_COPHY_V2_BIT, + + /* MUX BITS*/ + MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT, +@@ -885,6 +908,7 @@ enum mkt_eth_capabilities { + #define MTK_NETSYS_V2 BIT(MTK_NETSYS_V2_BIT) + #define MTK_SOC_MT7628 BIT(MTK_SOC_MT7628_BIT) + #define MTK_RSTCTRL_PPE1 BIT(MTK_RSTCTRL_PPE1_BIT) ++#define MTK_U3_COPHY_V2 BIT(MTK_U3_COPHY_V2_BIT) + + #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \ + BIT(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT) +@@ -957,6 +981,11 @@ enum mkt_eth_capabilities { + MTK_MUX_U3_GMAC2_TO_QPHY | \ + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA) + ++#define MT7981_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | MTK_GMAC2_GEPHY | \ ++ MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ ++ MTK_MUX_U3_GMAC2_TO_QPHY | MTK_U3_COPHY_V2 | \ ++ MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1) ++ + #define MT7986_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \ + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ + MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1) +@@ -1070,12 +1099,14 @@ struct mtk_soc_data { + * @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap + * @interface: Currently configured interface mode + * @pcs: Phylink PCS structure ++ * @flags: Flags indicating hardware properties + */ + struct mtk_pcs { + struct regmap *regmap; + u32 ana_rgc3; + phy_interface_t interface; + struct phylink_pcs pcs; ++ u32 flags; + }; + + /* struct mtk_sgmii - This is the structure holding sgmii regmap and its +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c +@@ -87,6 +87,11 @@ static int mtk_pcs_config(struct phylink + regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, + SGMII_PHYA_PWD, SGMII_PHYA_PWD); + ++ if (mpcs->flags & MTK_SGMII_FLAG_PN_SWAP) ++ regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_WRAP_CTRL, ++ SGMII_PN_SWAP_MASK, ++ SGMII_PN_SWAP_TX_RX); ++ + /* Reset SGMII PCS state */ + regmap_update_bits(mpcs->regmap, SGMII_RESERVED_0, + SGMII_SW_RESET, SGMII_SW_RESET); +@@ -186,6 +191,11 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, + + ss->pcs[i].ana_rgc3 = ana_rgc3; + ss->pcs[i].regmap = syscon_node_to_regmap(np); ++ ++ ss->pcs[i].flags = 0; ++ if (of_property_read_bool(np, "mediatek,pnswap")) ++ ss->pcs[i].flags |= MTK_SGMII_FLAG_PN_SWAP; ++ + of_node_put(np); + if (IS_ERR(ss->pcs[i].regmap)) + return PTR_ERR(ss->pcs[i].regmap); diff --git a/target/linux/generic/backport-5.15/733-v6.3-19-net-ethernet-mtk_eth_soc-set-MDIO-bus-clock-frequenc.patch b/target/linux/generic/backport-5.15/733-v6.3-19-net-ethernet-mtk_eth_soc-set-MDIO-bus-clock-frequenc.patch new file mode 100644 index 0000000000..9def19d67e --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.3-19-net-ethernet-mtk_eth_soc-set-MDIO-bus-clock-frequenc.patch @@ -0,0 +1,76 @@ +From c0a440031d4314d1023c1b87f43a4233634eebdb Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sun, 19 Mar 2023 12:57:15 +0000 +Subject: [PATCH] net: ethernet: mtk_eth_soc: set MDIO bus clock frequency +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Set MDIO bus clock frequency and allow setting a custom maximum +frequency from device tree. + +Reviewed-by: Andrew Lunn +Reviewed-by: Florian Fainelli +Tested-by: Bjørn Mork +Signed-off-by: Daniel Golle +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 21 +++++++++++++++++++++ + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 7 +++++++ + 2 files changed, 28 insertions(+) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -702,8 +702,10 @@ static const struct phylink_mac_ops mtk_ + + static int mtk_mdio_init(struct mtk_eth *eth) + { ++ unsigned int max_clk = 2500000, divider; + struct device_node *mii_np; + int ret; ++ u32 val; + + mii_np = of_get_child_by_name(eth->dev->of_node, "mdio-bus"); + if (!mii_np) { +@@ -729,6 +731,25 @@ static int mtk_mdio_init(struct mtk_eth + eth->mii_bus->parent = eth->dev; + + snprintf(eth->mii_bus->id, MII_BUS_ID_SIZE, "%pOFn", mii_np); ++ ++ if (!of_property_read_u32(mii_np, "clock-frequency", &val)) { ++ if (val > MDC_MAX_FREQ || val < MDC_MAX_FREQ / MDC_MAX_DIVIDER) { ++ dev_err(eth->dev, "MDIO clock frequency out of range"); ++ ret = -EINVAL; ++ goto err_put_node; ++ } ++ max_clk = val; ++ } ++ divider = min_t(unsigned int, DIV_ROUND_UP(MDC_MAX_FREQ, max_clk), 63); ++ ++ /* Configure MDC Divider */ ++ val = mtk_r32(eth, MTK_PPSC); ++ val &= ~PPSC_MDC_CFG; ++ val |= FIELD_PREP(PPSC_MDC_CFG, divider) | PPSC_MDC_TURBO; ++ mtk_w32(eth, val, MTK_PPSC); ++ ++ dev_dbg(eth->dev, "MDC is running on %d Hz\n", MDC_MAX_FREQ / divider); ++ + ret = of_mdiobus_register(eth->mii_bus, mii_np); + + err_put_node: +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -363,6 +363,13 @@ + #define RX_DMA_VTAG_V2 BIT(0) + #define RX_DMA_L4_VALID_V2 BIT(2) + ++/* PHY Polling and SMI Master Control registers */ ++#define MTK_PPSC 0x10000 ++#define PPSC_MDC_CFG GENMASK(29, 24) ++#define PPSC_MDC_TURBO BIT(20) ++#define MDC_MAX_FREQ 25000000 ++#define MDC_MAX_DIVIDER 63 ++ + /* PHY Indirect Access Control registers */ + #define MTK_PHY_IAC 0x10004 + #define PHY_IAC_ACCESS BIT(31) diff --git a/target/linux/generic/backport-5.15/733-v6.3-20-net-ethernet-mtk_eth_soc-switch-to-external-PCS-driv.patch b/target/linux/generic/backport-5.15/733-v6.3-20-net-ethernet-mtk_eth_soc-switch-to-external-PCS-driv.patch new file mode 100644 index 0000000000..c55d6b6428 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.3-20-net-ethernet-mtk_eth_soc-switch-to-external-PCS-driv.patch @@ -0,0 +1,512 @@ +From 2a3ec7ae313310c1092e4256208cc04d1958e469 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sun, 19 Mar 2023 12:58:02 +0000 +Subject: [PATCH] net: ethernet: mtk_eth_soc: switch to external PCS driver + +Now that we got a PCS driver, use it and remove the now redundant +PCS code and it's header macros from the Ethernet driver. + +Signed-off-by: Daniel Golle +Tested-by: Frank Wunderlich +Reviewed-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/Kconfig | 2 + + drivers/net/ethernet/mediatek/Makefile | 2 +- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 61 +++++- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 93 +-------- + drivers/net/ethernet/mediatek/mtk_sgmii.c | 217 -------------------- + 5 files changed, 56 insertions(+), 319 deletions(-) + delete mode 100644 drivers/net/ethernet/mediatek/mtk_sgmii.c + +--- a/drivers/net/ethernet/mediatek/Kconfig ++++ b/drivers/net/ethernet/mediatek/Kconfig +@@ -18,6 +18,8 @@ config NET_MEDIATEK_SOC + select DIMLIB + select PAGE_POOL + select PAGE_POOL_STATS ++ select PCS_MTK_LYNXI ++ select REGMAP_MMIO + help + This driver supports the gigabit ethernet MACs in the + MediaTek SoC family. +--- a/drivers/net/ethernet/mediatek/Makefile ++++ b/drivers/net/ethernet/mediatek/Makefile +@@ -4,7 +4,7 @@ + # + + obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o +-mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_ppe_offload.o ++mtk_eth-y := mtk_eth_soc.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_ppe_offload.o + mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed.o mtk_wed_mcu.o mtk_wed_wo.o + ifdef CONFIG_DEBUG_FS + mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_debugfs.o +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -357,7 +358,7 @@ static struct phylink_pcs *mtk_mac_selec + sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ? + 0 : mac->id; + +- return mtk_sgmii_select_pcs(eth->sgmii, sid); ++ return eth->sgmii_pcs[sid]; + } + + return NULL; +@@ -3963,8 +3964,17 @@ static int mtk_unreg_dev(struct mtk_eth + return 0; + } + ++static void mtk_sgmii_destroy(struct mtk_eth *eth) ++{ ++ int i; ++ ++ for (i = 0; i < MTK_MAX_DEVS; i++) ++ mtk_pcs_lynxi_destroy(eth->sgmii_pcs[i]); ++} ++ + static int mtk_cleanup(struct mtk_eth *eth) + { ++ mtk_sgmii_destroy(eth); + mtk_unreg_dev(eth); + mtk_free_dev(eth); + cancel_work_sync(ð->pending_work); +@@ -4404,6 +4414,36 @@ void mtk_eth_set_dma_device(struct mtk_e + rtnl_unlock(); + } + ++static int mtk_sgmii_init(struct mtk_eth *eth) ++{ ++ struct device_node *np; ++ struct regmap *regmap; ++ u32 flags; ++ int i; ++ ++ for (i = 0; i < MTK_MAX_DEVS; i++) { ++ np = of_parse_phandle(eth->dev->of_node, "mediatek,sgmiisys", i); ++ if (!np) ++ break; ++ ++ regmap = syscon_node_to_regmap(np); ++ flags = 0; ++ if (of_property_read_bool(np, "mediatek,pnswap")) ++ flags |= MTK_SGMII_FLAG_PN_SWAP; ++ ++ of_node_put(np); ++ ++ if (IS_ERR(regmap)) ++ return PTR_ERR(regmap); ++ ++ eth->sgmii_pcs[i] = mtk_pcs_lynxi_create(eth->dev, regmap, ++ eth->soc->ana_rgc3, ++ flags); ++ } ++ ++ return 0; ++} ++ + static int mtk_probe(struct platform_device *pdev) + { + struct resource *res = NULL; +@@ -4467,13 +4507,7 @@ static int mtk_probe(struct platform_dev + } + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SGMII)) { +- eth->sgmii = devm_kzalloc(eth->dev, sizeof(*eth->sgmii), +- GFP_KERNEL); +- if (!eth->sgmii) +- return -ENOMEM; +- +- err = mtk_sgmii_init(eth->sgmii, pdev->dev.of_node, +- eth->soc->ana_rgc3); ++ err = mtk_sgmii_init(eth); + + if (err) + return err; +@@ -4484,14 +4518,17 @@ static int mtk_probe(struct platform_dev + "mediatek,pctl"); + if (IS_ERR(eth->pctl)) { + dev_err(&pdev->dev, "no pctl regmap found\n"); +- return PTR_ERR(eth->pctl); ++ err = PTR_ERR(eth->pctl); ++ goto err_destroy_sgmii; + } + } + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- if (!res) +- return -EINVAL; ++ if (!res) { ++ err = -EINVAL; ++ goto err_destroy_sgmii; ++ } + } + + if (eth->soc->offload_version) { +@@ -4652,6 +4689,8 @@ err_deinit_hw: + mtk_hw_deinit(eth); + err_wed_exit: + mtk_wed_exit(); ++err_destroy_sgmii: ++ mtk_sgmii_destroy(eth); + + return err; + } +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -507,65 +507,6 @@ + #define ETHSYS_DMA_AG_MAP_QDMA BIT(1) + #define ETHSYS_DMA_AG_MAP_PPE BIT(2) + +-/* SGMII subsystem config registers */ +-/* BMCR (low 16) BMSR (high 16) */ +-#define SGMSYS_PCS_CONTROL_1 0x0 +-#define SGMII_BMCR GENMASK(15, 0) +-#define SGMII_BMSR GENMASK(31, 16) +-#define SGMII_AN_RESTART BIT(9) +-#define SGMII_ISOLATE BIT(10) +-#define SGMII_AN_ENABLE BIT(12) +-#define SGMII_LINK_STATYS BIT(18) +-#define SGMII_AN_ABILITY BIT(19) +-#define SGMII_AN_COMPLETE BIT(21) +-#define SGMII_PCS_FAULT BIT(23) +-#define SGMII_AN_EXPANSION_CLR BIT(30) +- +-#define SGMSYS_PCS_ADVERTISE 0x8 +-#define SGMII_ADVERTISE GENMASK(15, 0) +-#define SGMII_LPA GENMASK(31, 16) +- +-/* Register to programmable link timer, the unit in 2 * 8ns */ +-#define SGMSYS_PCS_LINK_TIMER 0x18 +-#define SGMII_LINK_TIMER_MASK GENMASK(19, 0) +-#define SGMII_LINK_TIMER_DEFAULT (0x186a0 & SGMII_LINK_TIMER_MASK) +- +-/* Register to control remote fault */ +-#define SGMSYS_SGMII_MODE 0x20 +-#define SGMII_IF_MODE_SGMII BIT(0) +-#define SGMII_SPEED_DUPLEX_AN BIT(1) +-#define SGMII_SPEED_MASK GENMASK(3, 2) +-#define SGMII_SPEED_10 FIELD_PREP(SGMII_SPEED_MASK, 0) +-#define SGMII_SPEED_100 FIELD_PREP(SGMII_SPEED_MASK, 1) +-#define SGMII_SPEED_1000 FIELD_PREP(SGMII_SPEED_MASK, 2) +-#define SGMII_DUPLEX_HALF BIT(4) +-#define SGMII_IF_MODE_BIT5 BIT(5) +-#define SGMII_REMOTE_FAULT_DIS BIT(8) +-#define SGMII_CODE_SYNC_SET_VAL BIT(9) +-#define SGMII_CODE_SYNC_SET_EN BIT(10) +-#define SGMII_SEND_AN_ERROR_EN BIT(11) +-#define SGMII_IF_MODE_MASK GENMASK(5, 1) +- +-/* Register to reset SGMII design */ +-#define SGMII_RESERVED_0 0x34 +-#define SGMII_SW_RESET BIT(0) +- +-/* Register to set SGMII speed, ANA RG_ Control Signals III*/ +-#define SGMSYS_ANA_RG_CS3 0x2028 +-#define RG_PHY_SPEED_MASK (BIT(2) | BIT(3)) +-#define RG_PHY_SPEED_1_25G 0x0 +-#define RG_PHY_SPEED_3_125G BIT(2) +- +-/* Register to power up QPHY */ +-#define SGMSYS_QPHY_PWR_STATE_CTRL 0xe8 +-#define SGMII_PHYA_PWD BIT(4) +- +-/* Register to QPHY wrapper control */ +-#define SGMSYS_QPHY_WRAP_CTRL 0xec +-#define SGMII_PN_SWAP_MASK GENMASK(1, 0) +-#define SGMII_PN_SWAP_TX_RX (BIT(0) | BIT(1)) +-#define MTK_SGMII_FLAG_PN_SWAP BIT(0) +- + /* Infrasys subsystem config registers */ + #define INFRA_MISC2 0x70c + #define CO_QPHY_SEL BIT(0) +@@ -1099,31 +1040,6 @@ struct mtk_soc_data { + /* currently no SoC has more than 2 macs */ + #define MTK_MAX_DEVS 2 + +-/* struct mtk_pcs - This structure holds each sgmii regmap and associated +- * data +- * @regmap: The register map pointing at the range used to setup +- * SGMII modes +- * @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap +- * @interface: Currently configured interface mode +- * @pcs: Phylink PCS structure +- * @flags: Flags indicating hardware properties +- */ +-struct mtk_pcs { +- struct regmap *regmap; +- u32 ana_rgc3; +- phy_interface_t interface; +- struct phylink_pcs pcs; +- u32 flags; +-}; +- +-/* struct mtk_sgmii - This is the structure holding sgmii regmap and its +- * characteristics +- * @pcs Array of individual PCS structures +- */ +-struct mtk_sgmii { +- struct mtk_pcs pcs[MTK_MAX_DEVS]; +-}; +- + /* struct mtk_eth - This is the main datasructure for holding the state + * of the driver + * @dev: The device pointer +@@ -1143,6 +1059,7 @@ struct mtk_sgmii { + * MII modes + * @infra: The register map pointing at the range used to setup + * SGMII and GePHY path ++ * @sgmii_pcs: Pointers to mtk-pcs-lynxi phylink_pcs instances + * @pctl: The register map pointing at the range used to setup + * GMAC port drive/slew values + * @dma_refcnt: track how many netdevs are using the DMA engine +@@ -1183,8 +1100,8 @@ struct mtk_eth { + u32 msg_enable; + unsigned long sysclk; + struct regmap *ethsys; +- struct regmap *infra; +- struct mtk_sgmii *sgmii; ++ struct regmap *infra; ++ struct phylink_pcs *sgmii_pcs[MTK_MAX_DEVS]; + struct regmap *pctl; + bool hwlro; + refcount_t dma_refcnt; +@@ -1346,10 +1263,6 @@ void mtk_stats_update_mac(struct mtk_mac + void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg); + u32 mtk_r32(struct mtk_eth *eth, unsigned reg); + +-struct phylink_pcs *mtk_sgmii_select_pcs(struct mtk_sgmii *ss, int id); +-int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *np, +- u32 ana_rgc3); +- + int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id); + int mtk_gmac_gephy_path_setup(struct mtk_eth *eth, int mac_id); + int mtk_gmac_rgmii_path_setup(struct mtk_eth *eth, int mac_id); +--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c ++++ /dev/null +@@ -1,217 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0 +-// Copyright (c) 2018-2019 MediaTek Inc. +- +-/* A library for MediaTek SGMII circuit +- * +- * Author: Sean Wang +- * +- */ +- +-#include +-#include +-#include +-#include +- +-#include "mtk_eth_soc.h" +- +-static struct mtk_pcs *pcs_to_mtk_pcs(struct phylink_pcs *pcs) +-{ +- return container_of(pcs, struct mtk_pcs, pcs); +-} +- +-static void mtk_pcs_get_state(struct phylink_pcs *pcs, +- struct phylink_link_state *state) +-{ +- struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); +- unsigned int bm, adv; +- +- /* Read the BMSR and LPA */ +- regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &bm); +- regmap_read(mpcs->regmap, SGMSYS_PCS_ADVERTISE, &adv); +- +- phylink_mii_c22_pcs_decode_state(state, FIELD_GET(SGMII_BMSR, bm), +- FIELD_GET(SGMII_LPA, adv)); +-} +- +-static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode, +- phy_interface_t interface, +- const unsigned long *advertising, +- bool permit_pause_to_mac) +-{ +- bool mode_changed = false, changed, use_an; +- struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); +- unsigned int rgc3, sgm_mode, bmcr; +- int advertise, link_timer; +- +- advertise = phylink_mii_c22_pcs_encode_advertisement(interface, +- advertising); +- if (advertise < 0) +- return advertise; +- +- /* Clearing IF_MODE_BIT0 switches the PCS to BASE-X mode, and +- * we assume that fixes it's speed at bitrate = line rate (in +- * other words, 1000Mbps or 2500Mbps). +- */ +- if (interface == PHY_INTERFACE_MODE_SGMII) { +- sgm_mode = SGMII_IF_MODE_SGMII; +- if (phylink_autoneg_inband(mode)) { +- sgm_mode |= SGMII_REMOTE_FAULT_DIS | +- SGMII_SPEED_DUPLEX_AN; +- use_an = true; +- } else { +- use_an = false; +- } +- } else if (phylink_autoneg_inband(mode)) { +- /* 1000base-X or 2500base-X autoneg */ +- sgm_mode = SGMII_REMOTE_FAULT_DIS; +- use_an = linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, +- advertising); +- } else { +- /* 1000base-X or 2500base-X without autoneg */ +- sgm_mode = 0; +- use_an = false; +- } +- +- if (use_an) { +- bmcr = SGMII_AN_ENABLE; +- } else { +- bmcr = 0; +- } +- +- if (mpcs->interface != interface) { +- link_timer = phylink_get_link_timer_ns(interface); +- if (link_timer < 0) +- return link_timer; +- +- /* PHYA power down */ +- regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, +- SGMII_PHYA_PWD, SGMII_PHYA_PWD); +- +- if (mpcs->flags & MTK_SGMII_FLAG_PN_SWAP) +- regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_WRAP_CTRL, +- SGMII_PN_SWAP_MASK, +- SGMII_PN_SWAP_TX_RX); +- +- /* Reset SGMII PCS state */ +- regmap_update_bits(mpcs->regmap, SGMII_RESERVED_0, +- SGMII_SW_RESET, SGMII_SW_RESET); +- +- if (interface == PHY_INTERFACE_MODE_2500BASEX) +- rgc3 = RG_PHY_SPEED_3_125G; +- else +- rgc3 = 0; +- +- /* Configure the underlying interface speed */ +- regmap_update_bits(mpcs->regmap, mpcs->ana_rgc3, +- RG_PHY_SPEED_3_125G, rgc3); +- +- /* Setup the link timer */ +- regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER, link_timer / 2 / 8); +- +- mpcs->interface = interface; +- mode_changed = true; +- } +- +- /* Update the advertisement, noting whether it has changed */ +- regmap_update_bits_check(mpcs->regmap, SGMSYS_PCS_ADVERTISE, +- SGMII_ADVERTISE, advertise, &changed); +- +- /* Update the sgmsys mode register */ +- regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, +- SGMII_REMOTE_FAULT_DIS | SGMII_SPEED_DUPLEX_AN | +- SGMII_IF_MODE_SGMII, sgm_mode); +- +- /* Update the BMCR */ +- regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, +- SGMII_AN_ENABLE, bmcr); +- +- /* Release PHYA power down state +- * Only removing bit SGMII_PHYA_PWD isn't enough. +- * There are cases when the SGMII_PHYA_PWD register contains 0x9 which +- * prevents SGMII from working. The SGMII still shows link but no traffic +- * can flow. Writing 0x0 to the PHYA_PWD register fix the issue. 0x0 was +- * taken from a good working state of the SGMII interface. +- * Unknown how much the QPHY needs but it is racy without a sleep. +- * Tested on mt7622 & mt7986. +- */ +- usleep_range(50, 100); +- regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, 0); +- +- return changed || mode_changed; +-} +- +-static void mtk_pcs_restart_an(struct phylink_pcs *pcs) +-{ +- struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); +- +- regmap_update_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, +- SGMII_AN_RESTART, SGMII_AN_RESTART); +-} +- +-static void mtk_pcs_link_up(struct phylink_pcs *pcs, unsigned int mode, +- phy_interface_t interface, int speed, int duplex) +-{ +- struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); +- unsigned int sgm_mode; +- +- if (!phylink_autoneg_inband(mode)) { +- /* Force the speed and duplex setting */ +- if (speed == SPEED_10) +- sgm_mode = SGMII_SPEED_10; +- else if (speed == SPEED_100) +- sgm_mode = SGMII_SPEED_100; +- else +- sgm_mode = SGMII_SPEED_1000; +- +- if (duplex != DUPLEX_FULL) +- sgm_mode |= SGMII_DUPLEX_HALF; +- +- regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, +- SGMII_DUPLEX_HALF | SGMII_SPEED_MASK, +- sgm_mode); +- } +-} +- +-static const struct phylink_pcs_ops mtk_pcs_ops = { +- .pcs_get_state = mtk_pcs_get_state, +- .pcs_config = mtk_pcs_config, +- .pcs_an_restart = mtk_pcs_restart_an, +- .pcs_link_up = mtk_pcs_link_up, +-}; +- +-int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *r, u32 ana_rgc3) +-{ +- struct device_node *np; +- int i; +- +- for (i = 0; i < MTK_MAX_DEVS; i++) { +- np = of_parse_phandle(r, "mediatek,sgmiisys", i); +- if (!np) +- break; +- +- ss->pcs[i].ana_rgc3 = ana_rgc3; +- ss->pcs[i].regmap = syscon_node_to_regmap(np); +- +- ss->pcs[i].flags = 0; +- if (of_property_read_bool(np, "mediatek,pnswap")) +- ss->pcs[i].flags |= MTK_SGMII_FLAG_PN_SWAP; +- +- of_node_put(np); +- if (IS_ERR(ss->pcs[i].regmap)) +- return PTR_ERR(ss->pcs[i].regmap); +- +- ss->pcs[i].pcs.ops = &mtk_pcs_ops; +- ss->pcs[i].pcs.poll = true; +- ss->pcs[i].interface = PHY_INTERFACE_MODE_NA; +- } +- +- return 0; +-} +- +-struct phylink_pcs *mtk_sgmii_select_pcs(struct mtk_sgmii *ss, int id) +-{ +- if (!ss->pcs[id].regmap) +- return NULL; +- +- return &ss->pcs[id].pcs; +-} diff --git a/target/linux/generic/backport-5.15/733-v6.3-21-net-ethernet-mtk_eth_soc-add-missing-ppe-cache-flush.patch b/target/linux/generic/backport-5.15/733-v6.3-21-net-ethernet-mtk_eth_soc-add-missing-ppe-cache-flush.patch new file mode 100644 index 0000000000..7742b0925b --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.3-21-net-ethernet-mtk_eth_soc-add-missing-ppe-cache-flush.patch @@ -0,0 +1,21 @@ +From: Felix Fietkau +Date: Thu, 23 Mar 2023 11:19:14 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add missing ppe cache flush when + deleting a flow + +The cache needs to be flushed to ensure that the hardware stops offloading +the flow immediately. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -464,6 +464,7 @@ __mtk_foe_entry_clear(struct mtk_ppe *pp + hwe->ib1 &= ~MTK_FOE_IB1_STATE; + hwe->ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_INVALID); + dma_wmb(); ++ mtk_ppe_cache_clear(ppe); + } + entry->hash = 0xffff; + diff --git a/target/linux/generic/backport-5.15/733-v6.4-22-net-mtk_eth_soc-use-WO-firmware-for-MT7981.patch b/target/linux/generic/backport-5.15/733-v6.4-22-net-mtk_eth_soc-use-WO-firmware-for-MT7981.patch new file mode 100644 index 0000000000..9ce2735951 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.4-22-net-mtk_eth_soc-use-WO-firmware-for-MT7981.patch @@ -0,0 +1,46 @@ +From f5af7931d2a2cae66d0f9dad4ba517b1b00620b3 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Wed, 19 Apr 2023 19:07:23 +0100 +Subject: [PATCH] net: mtk_eth_soc: use WO firmware for MT7981 + +In order to support wireless offloading on MT7981 we need to load the +appropriate firmware. Recognize MT7981 and load mt7981_wo.bin. + +Signed-off-by: Daniel Golle +--- + drivers/net/ethernet/mediatek/mtk_wed_mcu.c | 7 ++++++- + drivers/net/ethernet/mediatek/mtk_wed_wo.h | 1 + + 2 files changed, 7 insertions(+), 1 deletion(-) + +--- a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c +@@ -326,7 +326,11 @@ mtk_wed_mcu_load_firmware(struct mtk_wed + wo->hw->index + 1); + + /* load firmware */ +- fw_name = wo->hw->index ? MT7986_FIRMWARE_WO1 : MT7986_FIRMWARE_WO0; ++ if (of_device_is_compatible(wo->hw->node, "mediatek,mt7981-wed")) ++ fw_name = MT7981_FIRMWARE_WO; ++ else ++ fw_name = wo->hw->index ? MT7986_FIRMWARE_WO1 : MT7986_FIRMWARE_WO0; ++ + ret = request_firmware(&fw, fw_name, wo->hw->dev); + if (ret) + return ret; +@@ -386,5 +390,6 @@ int mtk_wed_mcu_init(struct mtk_wed_wo * + 100, MTK_FW_DL_TIMEOUT); + } + ++MODULE_FIRMWARE(MT7981_FIRMWARE_WO); + MODULE_FIRMWARE(MT7986_FIRMWARE_WO0); + MODULE_FIRMWARE(MT7986_FIRMWARE_WO1); +--- a/drivers/net/ethernet/mediatek/mtk_wed_wo.h ++++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.h +@@ -88,6 +88,7 @@ enum mtk_wed_dummy_cr_idx { + MTK_WED_DUMMY_CR_WO_STATUS, + }; + ++#define MT7981_FIRMWARE_WO "mediatek/mt7981_wo.bin" + #define MT7986_FIRMWARE_WO0 "mediatek/mt7986_wo_0.bin" + #define MT7986_FIRMWARE_WO1 "mediatek/mt7986_wo_1.bin" + diff --git a/target/linux/generic/backport-5.15/733-v6.4-23-net-ethernet-mtk_eth_soc-fix-NULL-pointer-dereferenc.patch b/target/linux/generic/backport-5.15/733-v6.4-23-net-ethernet-mtk_eth_soc-fix-NULL-pointer-dereferenc.patch new file mode 100644 index 0000000000..d715c4aa68 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.4-23-net-ethernet-mtk_eth_soc-fix-NULL-pointer-dereferenc.patch @@ -0,0 +1,28 @@ +From 7c83e28f10830aa5105c25eaabe890e3adac36aa Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 9 May 2023 03:20:06 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix NULL pointer dereference + +Check for NULL pointer to avoid kernel crashing in case of missing WO +firmware in case only a single WEDv2 device has been initialized, e.g. on +MT7981 which can connect just one wireless frontend. + +Fixes: 86ce0d09e424 ("net: ethernet: mtk_eth_soc: use WO firmware for MT7981") +Signed-off-by: Daniel Golle +Reviewed-by: Simon Horman +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_wed.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -647,7 +647,7 @@ __mtk_wed_detach(struct mtk_wed_device * + BIT(hw->index), BIT(hw->index)); + } + +- if (!hw_list[!hw->index]->wed_dev && ++ if ((!hw_list[!hw->index] || !hw_list[!hw->index]->wed_dev) && + hw->eth->dma_dev != hw->eth->dev) + mtk_eth_set_dma_device(hw->eth, hw->eth->dev); + diff --git a/target/linux/generic/backport-5.15/733-v6.4-24-net-ethernet-mtk_eth_soc-ppe-add-support-for-flow-ac.patch b/target/linux/generic/backport-5.15/733-v6.4-24-net-ethernet-mtk_eth_soc-ppe-add-support-for-flow-ac.patch new file mode 100644 index 0000000000..81f9c79655 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.4-24-net-ethernet-mtk_eth_soc-ppe-add-support-for-flow-ac.patch @@ -0,0 +1,428 @@ +From patchwork Wed Nov 2 00:58:01 2022 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Daniel Golle +X-Patchwork-Id: 13027653 +X-Patchwork-Delegate: kuba@kernel.org +Return-Path: +Date: Wed, 2 Nov 2022 00:58:01 +0000 +From: Daniel Golle +To: Felix Fietkau , John Crispin , + Sean Wang , + Mark Lee , + "David S. Miller" , + Eric Dumazet , + Jakub Kicinski , + Paolo Abeni , + Matthias Brugger , + netdev@vger.kernel.org, linux-arm-kernel@lists.infradead.org, + linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org +Subject: [PATCH v4] net: ethernet: mediatek: ppe: add support for flow + accounting +Message-ID: +MIME-Version: 1.0 +Content-Disposition: inline +Precedence: bulk +List-ID: +X-Mailing-List: netdev@vger.kernel.org +X-Patchwork-Delegate: kuba@kernel.org + +The PPE units found in MT7622 and newer support packet and byte +accounting of hw-offloaded flows. Add support for reading those +counters as found in MediaTek's SDK[1]. + +[1]: https://git01.mediatek.com/plugins/gitiles/librecmc/feeds/mtk-librecmc-feeds/+/bc6a6a375c800dc2b80e1a325a2c732d1737df92 +Signed-off-by: Daniel Golle +--- +v4: declare function mtk_mib_entry_read as static +v3: don't bother to set 'false' values in any zero-initialized struct + use mtk_foe_entry_ib2 + both changes were requested by Felix Fietkau + +v2: fix wrong variable name in return value check spotted by Denis Kirjanov + + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 7 +- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 + + drivers/net/ethernet/mediatek/mtk_ppe.c | 110 +++++++++++++++++- + drivers/net/ethernet/mediatek/mtk_ppe.h | 23 +++- + .../net/ethernet/mediatek/mtk_ppe_debugfs.c | 9 +- + .../net/ethernet/mediatek/mtk_ppe_offload.c | 7 ++ + drivers/net/ethernet/mediatek/mtk_ppe_regs.h | 14 +++ + 7 files changed, 166 insertions(+), 5 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4638,8 +4638,8 @@ static int mtk_probe(struct platform_dev + for (i = 0; i < num_ppe; i++) { + u32 ppe_addr = eth->soc->reg_map->ppe_base + i * 0x400; + +- eth->ppe[i] = mtk_ppe_init(eth, eth->base + ppe_addr, +- eth->soc->offload_version, i); ++ eth->ppe[i] = mtk_ppe_init(eth, eth->base + ppe_addr, i); ++ + if (!eth->ppe[i]) { + err = -ENOMEM; + goto err_deinit_ppe; +@@ -4765,6 +4765,7 @@ static const struct mtk_soc_data mt7622_ + .required_pctl = false, + .offload_version = 2, + .hash_offset = 2, ++ .has_accounting = true, + .foe_entry_size = sizeof(struct mtk_foe_entry) - 16, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), +@@ -4802,6 +4803,7 @@ static const struct mtk_soc_data mt7629_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7629_CLKS_BITMAP, + .required_pctl = false, ++ .has_accounting = true, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4822,6 +4824,7 @@ static const struct mtk_soc_data mt7981_ + .offload_version = 2, + .hash_offset = 4, + .foe_entry_size = sizeof(struct mtk_foe_entry), ++ .has_accounting = true, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma_v2), + .rxd_size = sizeof(struct mtk_rx_dma_v2), +@@ -4842,6 +4845,7 @@ static const struct mtk_soc_data mt7986_ + .offload_version = 2, + .hash_offset = 4, + .foe_entry_size = sizeof(struct mtk_foe_entry), ++ .has_accounting = true, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma_v2), + .rxd_size = sizeof(struct mtk_rx_dma_v2), +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1008,6 +1008,8 @@ struct mtk_reg_map { + * the extra setup for those pins used by GMAC. + * @hash_offset Flow table hash offset. + * @foe_entry_size Foe table entry size. ++ * @has_accounting Bool indicating support for accounting of ++ * offloaded flows. + * @txd_size Tx DMA descriptor size. + * @rxd_size Rx DMA descriptor size. + * @rx_irq_done_mask Rx irq done register mask. +@@ -1025,6 +1027,7 @@ struct mtk_soc_data { + u8 hash_offset; + u16 foe_entry_size; + netdev_features_t hw_features; ++ bool has_accounting; + struct { + u32 txd_size; + u32 rxd_size; +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -74,6 +74,48 @@ static int mtk_ppe_wait_busy(struct mtk_ + return ret; + } + ++static int mtk_ppe_mib_wait_busy(struct mtk_ppe *ppe) ++{ ++ int ret; ++ u32 val; ++ ++ ret = readl_poll_timeout(ppe->base + MTK_PPE_MIB_SER_CR, val, ++ !(val & MTK_PPE_MIB_SER_CR_ST), ++ 20, MTK_PPE_WAIT_TIMEOUT_US); ++ ++ if (ret) ++ dev_err(ppe->dev, "MIB table busy"); ++ ++ return ret; ++} ++ ++static int mtk_mib_entry_read(struct mtk_ppe *ppe, u16 index, u64 *bytes, u64 *packets) ++{ ++ u32 byte_cnt_low, byte_cnt_high, pkt_cnt_low, pkt_cnt_high; ++ u32 val, cnt_r0, cnt_r1, cnt_r2; ++ int ret; ++ ++ val = FIELD_PREP(MTK_PPE_MIB_SER_CR_ADDR, index) | MTK_PPE_MIB_SER_CR_ST; ++ ppe_w32(ppe, MTK_PPE_MIB_SER_CR, val); ++ ++ ret = mtk_ppe_mib_wait_busy(ppe); ++ if (ret) ++ return ret; ++ ++ cnt_r0 = readl(ppe->base + MTK_PPE_MIB_SER_R0); ++ cnt_r1 = readl(ppe->base + MTK_PPE_MIB_SER_R1); ++ cnt_r2 = readl(ppe->base + MTK_PPE_MIB_SER_R2); ++ ++ byte_cnt_low = FIELD_GET(MTK_PPE_MIB_SER_R0_BYTE_CNT_LOW, cnt_r0); ++ byte_cnt_high = FIELD_GET(MTK_PPE_MIB_SER_R1_BYTE_CNT_HIGH, cnt_r1); ++ pkt_cnt_low = FIELD_GET(MTK_PPE_MIB_SER_R1_PKT_CNT_LOW, cnt_r1); ++ pkt_cnt_high = FIELD_GET(MTK_PPE_MIB_SER_R2_PKT_CNT_HIGH, cnt_r2); ++ *bytes = ((u64)byte_cnt_high << 32) | byte_cnt_low; ++ *packets = (pkt_cnt_high << 16) | pkt_cnt_low; ++ ++ return 0; ++} ++ + static void mtk_ppe_cache_clear(struct mtk_ppe *ppe) + { + ppe_set(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR); +@@ -465,6 +507,13 @@ __mtk_foe_entry_clear(struct mtk_ppe *pp + hwe->ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_INVALID); + dma_wmb(); + mtk_ppe_cache_clear(ppe); ++ if (ppe->accounting) { ++ struct mtk_foe_accounting *acct; ++ ++ acct = ppe->acct_table + entry->hash * sizeof(*acct); ++ acct->packets = 0; ++ acct->bytes = 0; ++ } + } + entry->hash = 0xffff; + +@@ -572,6 +621,9 @@ __mtk_foe_entry_commit(struct mtk_ppe *p + wmb(); + hwe->ib1 = entry->ib1; + ++ if (ppe->accounting) ++ *mtk_foe_entry_ib2(eth, hwe) |= MTK_FOE_IB2_MIB_CNT; ++ + dma_wmb(); + + mtk_ppe_cache_clear(ppe); +@@ -763,11 +815,39 @@ int mtk_ppe_prepare_reset(struct mtk_ppe + return mtk_ppe_wait_busy(ppe); + } + +-struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, +- int version, int index) ++struct mtk_foe_accounting *mtk_foe_entry_get_mib(struct mtk_ppe *ppe, u32 index, ++ struct mtk_foe_accounting *diff) ++{ ++ struct mtk_foe_accounting *acct; ++ int size = sizeof(struct mtk_foe_accounting); ++ u64 bytes, packets; ++ ++ if (!ppe->accounting) ++ return NULL; ++ ++ if (mtk_mib_entry_read(ppe, index, &bytes, &packets)) ++ return NULL; ++ ++ acct = ppe->acct_table + index * size; ++ ++ acct->bytes += bytes; ++ acct->packets += packets; ++ ++ if (diff) { ++ diff->bytes = bytes; ++ diff->packets = packets; ++ } ++ ++ return acct; ++} ++ ++struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int index) + { ++ bool accounting = eth->soc->has_accounting; + const struct mtk_soc_data *soc = eth->soc; ++ struct mtk_foe_accounting *acct; + struct device *dev = eth->dev; ++ struct mtk_mib_entry *mib; + struct mtk_ppe *ppe; + u32 foe_flow_size; + void *foe; +@@ -784,7 +864,8 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ + ppe->base = base; + ppe->eth = eth; + ppe->dev = dev; +- ppe->version = version; ++ ppe->version = eth->soc->offload_version; ++ ppe->accounting = accounting; + + foe = dmam_alloc_coherent(ppe->dev, + MTK_PPE_ENTRIES * soc->foe_entry_size, +@@ -800,6 +881,23 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ + if (!ppe->foe_flow) + goto err_free_l2_flows; + ++ if (accounting) { ++ mib = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*mib), ++ &ppe->mib_phys, GFP_KERNEL); ++ if (!mib) ++ return NULL; ++ ++ ppe->mib_table = mib; ++ ++ acct = devm_kzalloc(dev, MTK_PPE_ENTRIES * sizeof(*acct), ++ GFP_KERNEL); ++ ++ if (!acct) ++ return NULL; ++ ++ ppe->acct_table = acct; ++ } ++ + mtk_ppe_debugfs_init(ppe, index); + + return ppe; +@@ -929,6 +1027,16 @@ void mtk_ppe_start(struct mtk_ppe *ppe) + ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT1, 0xcb777); + ppe_w32(ppe, MTK_PPE_SBW_CTRL, 0x7f); + } ++ ++ if (ppe->accounting && ppe->mib_phys) { ++ ppe_w32(ppe, MTK_PPE_MIB_TB_BASE, ppe->mib_phys); ++ ppe_m32(ppe, MTK_PPE_MIB_CFG, MTK_PPE_MIB_CFG_EN, ++ MTK_PPE_MIB_CFG_EN); ++ ppe_m32(ppe, MTK_PPE_MIB_CFG, MTK_PPE_MIB_CFG_RD_CLR, ++ MTK_PPE_MIB_CFG_RD_CLR); ++ ppe_m32(ppe, MTK_PPE_MIB_CACHE_CTL, MTK_PPE_MIB_CACHE_CTL_EN, ++ MTK_PPE_MIB_CFG_RD_CLR); ++ } + } + + int mtk_ppe_stop(struct mtk_ppe *ppe) +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -57,6 +57,7 @@ enum { + #define MTK_FOE_IB2_MULTICAST BIT(8) + + #define MTK_FOE_IB2_WDMA_QID2 GENMASK(13, 12) ++#define MTK_FOE_IB2_MIB_CNT BIT(15) + #define MTK_FOE_IB2_WDMA_DEVIDX BIT(16) + #define MTK_FOE_IB2_WDMA_WINFO BIT(17) + +@@ -285,16 +286,34 @@ struct mtk_flow_entry { + unsigned long cookie; + }; + ++struct mtk_mib_entry { ++ u32 byt_cnt_l; ++ u16 byt_cnt_h; ++ u32 pkt_cnt_l; ++ u8 pkt_cnt_h; ++ u8 _rsv0; ++ u32 _rsv1; ++} __packed; ++ ++struct mtk_foe_accounting { ++ u64 bytes; ++ u64 packets; ++}; ++ + struct mtk_ppe { + struct mtk_eth *eth; + struct device *dev; + void __iomem *base; + int version; + char dirname[5]; ++ bool accounting; + + void *foe_table; + dma_addr_t foe_phys; + ++ struct mtk_mib_entry *mib_table; ++ dma_addr_t mib_phys; ++ + u16 foe_check_time[MTK_PPE_ENTRIES]; + struct hlist_head *foe_flow; + +@@ -303,8 +322,7 @@ struct mtk_ppe { + void *acct_table; + }; + +-struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, +- int version, int index); ++struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int index); + void mtk_ppe_deinit(struct mtk_eth *eth); + void mtk_ppe_start(struct mtk_ppe *ppe); + int mtk_ppe_stop(struct mtk_ppe *ppe); +@@ -359,5 +377,7 @@ int mtk_foe_entry_commit(struct mtk_ppe + void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); + int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); + int mtk_ppe_debugfs_init(struct mtk_ppe *ppe, int index); ++struct mtk_foe_accounting *mtk_foe_entry_get_mib(struct mtk_ppe *ppe, u32 index, ++ struct mtk_foe_accounting *diff); + + #endif +--- a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c +@@ -82,6 +82,7 @@ mtk_ppe_debugfs_foe_show(struct seq_file + struct mtk_foe_entry *entry = mtk_foe_get_entry(ppe, i); + struct mtk_foe_mac_info *l2; + struct mtk_flow_addr_info ai = {}; ++ struct mtk_foe_accounting *acct; + unsigned char h_source[ETH_ALEN]; + unsigned char h_dest[ETH_ALEN]; + int type, state; +@@ -95,6 +96,8 @@ mtk_ppe_debugfs_foe_show(struct seq_file + if (bind && state != MTK_FOE_STATE_BIND) + continue; + ++ acct = mtk_foe_entry_get_mib(ppe, i, NULL); ++ + type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); + seq_printf(m, "%05x %s %7s", i, + mtk_foe_entry_state_str(state), +@@ -153,9 +156,11 @@ mtk_ppe_debugfs_foe_show(struct seq_file + *((__be16 *)&h_dest[4]) = htons(l2->dest_mac_lo); + + seq_printf(m, " eth=%pM->%pM etype=%04x" +- " vlan=%d,%d ib1=%08x ib2=%08x\n", ++ " vlan=%d,%d ib1=%08x ib2=%08x" ++ " packets=%llu bytes=%llu\n", + h_source, h_dest, ntohs(l2->etype), +- l2->vlan1, l2->vlan2, entry->ib1, ib2); ++ l2->vlan1, l2->vlan2, entry->ib1, ib2, ++ acct ? acct->packets : 0, acct ? acct->bytes : 0); + } + + return 0; +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -497,6 +497,7 @@ static int + mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f) + { + struct mtk_flow_entry *entry; ++ struct mtk_foe_accounting diff; + u32 idle; + + entry = rhashtable_lookup(ð->flow_table, &f->cookie, +@@ -507,6 +508,13 @@ mtk_flow_offload_stats(struct mtk_eth *e + idle = mtk_foe_entry_idle_time(eth->ppe[entry->ppe_index], entry); + f->stats.lastused = jiffies - idle * HZ; + ++ if (entry->hash != 0xFFFF && ++ mtk_foe_entry_get_mib(eth->ppe[entry->ppe_index], entry->hash, ++ &diff)) { ++ f->stats.pkts += diff.packets; ++ f->stats.bytes += diff.bytes; ++ } ++ + return 0; + } + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_regs.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_regs.h +@@ -149,6 +149,20 @@ enum { + + #define MTK_PPE_MIB_TB_BASE 0x338 + ++#define MTK_PPE_MIB_SER_CR 0x33C ++#define MTK_PPE_MIB_SER_CR_ST BIT(16) ++#define MTK_PPE_MIB_SER_CR_ADDR GENMASK(13, 0) ++ ++#define MTK_PPE_MIB_SER_R0 0x340 ++#define MTK_PPE_MIB_SER_R0_BYTE_CNT_LOW GENMASK(31, 0) ++ ++#define MTK_PPE_MIB_SER_R1 0x344 ++#define MTK_PPE_MIB_SER_R1_PKT_CNT_LOW GENMASK(31, 16) ++#define MTK_PPE_MIB_SER_R1_BYTE_CNT_HIGH GENMASK(15, 0) ++ ++#define MTK_PPE_MIB_SER_R2 0x348 ++#define MTK_PPE_MIB_SER_R2_PKT_CNT_HIGH GENMASK(23, 0) ++ + #define MTK_PPE_MIB_CACHE_CTL 0x350 + #define MTK_PPE_MIB_CACHE_CTL_EN BIT(0) + #define MTK_PPE_MIB_CACHE_CTL_FLUSH BIT(2) diff --git a/target/linux/generic/backport-5.15/733-v6.4-25-net-ethernet-mediatek-fix-ppe-flow-accounting-for-v1.patch b/target/linux/generic/backport-5.15/733-v6.4-25-net-ethernet-mediatek-fix-ppe-flow-accounting-for-v1.patch new file mode 100644 index 0000000000..3a02c3a718 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.4-25-net-ethernet-mediatek-fix-ppe-flow-accounting-for-v1.patch @@ -0,0 +1,51 @@ +From: Felix Fietkau +Date: Thu, 23 Mar 2023 21:45:43 +0100 +Subject: [PATCH] net: ethernet: mediatek: fix ppe flow accounting for v1 + hardware + +Older chips (like MT7622) use a different bit in ib2 to enable hardware +counter support. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -605,6 +605,7 @@ __mtk_foe_entry_commit(struct mtk_ppe *p + struct mtk_eth *eth = ppe->eth; + u16 timestamp = mtk_eth_timestamp(eth); + struct mtk_foe_entry *hwe; ++ u32 val; + + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { + entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP_V2; +@@ -621,8 +622,13 @@ __mtk_foe_entry_commit(struct mtk_ppe *p + wmb(); + hwe->ib1 = entry->ib1; + +- if (ppe->accounting) +- *mtk_foe_entry_ib2(eth, hwe) |= MTK_FOE_IB2_MIB_CNT; ++ if (ppe->accounting) { ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ val = MTK_FOE_IB2_MIB_CNT_V2; ++ else ++ val = MTK_FOE_IB2_MIB_CNT; ++ *mtk_foe_entry_ib2(eth, hwe) |= val; ++ } + + dma_wmb(); + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -55,9 +55,10 @@ enum { + #define MTK_FOE_IB2_PSE_QOS BIT(4) + #define MTK_FOE_IB2_DEST_PORT GENMASK(7, 5) + #define MTK_FOE_IB2_MULTICAST BIT(8) ++#define MTK_FOE_IB2_MIB_CNT BIT(10) + + #define MTK_FOE_IB2_WDMA_QID2 GENMASK(13, 12) +-#define MTK_FOE_IB2_MIB_CNT BIT(15) ++#define MTK_FOE_IB2_MIB_CNT_V2 BIT(15) + #define MTK_FOE_IB2_WDMA_DEVIDX BIT(16) + #define MTK_FOE_IB2_WDMA_WINFO BIT(17) + diff --git a/target/linux/generic/backport-5.15/733-v6.4-26-net-ethernet-mtk_eth_soc-drop-generic-vlan-rx-offloa.patch b/target/linux/generic/backport-5.15/733-v6.4-26-net-ethernet-mtk_eth_soc-drop-generic-vlan-rx-offloa.patch new file mode 100644 index 0000000000..6126dfeadc --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.4-26-net-ethernet-mtk_eth_soc-drop-generic-vlan-rx-offloa.patch @@ -0,0 +1,201 @@ +From: Felix Fietkau +Date: Sun, 20 Nov 2022 23:01:00 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: drop generic vlan rx offload, + only use DSA untagging + +Through testing I found out that hardware vlan rx offload support seems to +have some hardware issues. At least when using multiple MACs and when receiving +tagged packets on the secondary MAC, the hardware can sometimes start to emit +wrong tags on the first MAC as well. + +In order to avoid such issues, drop the feature configuration and use the +offload feature only for DSA hardware untagging on MT7621/MT7622 devices which +only use one MAC. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1850,9 +1850,7 @@ static int mtk_poll_rx(struct napi_struc + + while (done < budget) { + unsigned int pktlen, *rxdcsum; +- bool has_hwaccel_tag = false; + struct net_device *netdev; +- u16 vlan_proto, vlan_tci; + dma_addr_t dma_addr; + u32 hash, reason; + int mac = 0; +@@ -1987,36 +1985,21 @@ static int mtk_poll_rx(struct napi_struc + skb_checksum_none_assert(skb); + skb->protocol = eth_type_trans(skb, netdev); + +- if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) +- mtk_ppe_check_skb(eth->ppe[0], skb, hash); +- +- if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) { +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { +- if (trxd.rxd3 & RX_DMA_VTAG_V2) { +- vlan_proto = RX_DMA_VPID(trxd.rxd4); +- vlan_tci = RX_DMA_VID(trxd.rxd4); +- has_hwaccel_tag = true; +- } +- } else if (trxd.rxd2 & RX_DMA_VTAG) { +- vlan_proto = RX_DMA_VPID(trxd.rxd3); +- vlan_tci = RX_DMA_VID(trxd.rxd3); +- has_hwaccel_tag = true; +- } +- } +- + /* When using VLAN untagging in combination with DSA, the + * hardware treats the MTK special tag as a VLAN and untags it. + */ +- if (has_hwaccel_tag && netdev_uses_dsa(netdev)) { +- unsigned int port = vlan_proto & GENMASK(2, 0); ++ if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) && ++ (trxd.rxd2 & RX_DMA_VTAG) && netdev_uses_dsa(netdev)) { ++ unsigned int port = RX_DMA_VPID(trxd.rxd3) & GENMASK(2, 0); + + if (port < ARRAY_SIZE(eth->dsa_meta) && + eth->dsa_meta[port]) + skb_dst_set_noref(skb, ð->dsa_meta[port]->dst); +- } else if (has_hwaccel_tag) { +- __vlan_hwaccel_put_tag(skb, htons(vlan_proto), vlan_tci); + } + ++ if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) ++ mtk_ppe_check_skb(eth->ppe[0], skb, hash); ++ + skb_record_rx_queue(skb, 0); + napi_gro_receive(napi, skb); + +@@ -2834,29 +2817,11 @@ static netdev_features_t mtk_fix_feature + + static int mtk_set_features(struct net_device *dev, netdev_features_t features) + { +- struct mtk_mac *mac = netdev_priv(dev); +- struct mtk_eth *eth = mac->hw; + netdev_features_t diff = dev->features ^ features; +- int i; + + if ((diff & NETIF_F_LRO) && !(features & NETIF_F_LRO)) + mtk_hwlro_netdev_disable(dev); + +- /* Set RX VLAN offloading */ +- if (!(diff & NETIF_F_HW_VLAN_CTAG_RX)) +- return 0; +- +- mtk_w32(eth, !!(features & NETIF_F_HW_VLAN_CTAG_RX), +- MTK_CDMP_EG_CTRL); +- +- /* sync features with other MAC */ +- for (i = 0; i < MTK_MAC_COUNT; i++) { +- if (!eth->netdev[i] || eth->netdev[i] == dev) +- continue; +- eth->netdev[i]->features &= ~NETIF_F_HW_VLAN_CTAG_RX; +- eth->netdev[i]->features |= features & NETIF_F_HW_VLAN_CTAG_RX; +- } +- + return 0; + } + +@@ -3170,30 +3135,6 @@ static int mtk_open(struct net_device *d + struct mtk_eth *eth = mac->hw; + int i, err; + +- if (mtk_uses_dsa(dev) && !eth->prog) { +- for (i = 0; i < ARRAY_SIZE(eth->dsa_meta); i++) { +- struct metadata_dst *md_dst = eth->dsa_meta[i]; +- +- if (md_dst) +- continue; +- +- md_dst = metadata_dst_alloc(0, METADATA_HW_PORT_MUX, +- GFP_KERNEL); +- if (!md_dst) +- return -ENOMEM; +- +- md_dst->u.port_info.port_id = i; +- eth->dsa_meta[i] = md_dst; +- } +- } else { +- /* Hardware special tag parsing needs to be disabled if at least +- * one MAC does not use DSA. +- */ +- u32 val = mtk_r32(eth, MTK_CDMP_IG_CTRL); +- val &= ~MTK_CDMP_STAG_EN; +- mtk_w32(eth, val, MTK_CDMP_IG_CTRL); +- } +- + err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0); + if (err) { + netdev_err(dev, "%s: could not attach PHY: %d\n", __func__, +@@ -3234,6 +3175,35 @@ static int mtk_open(struct net_device *d + phylink_start(mac->phylink); + netif_tx_start_all_queues(dev); + ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ return 0; ++ ++ if (mtk_uses_dsa(dev) && !eth->prog) { ++ for (i = 0; i < ARRAY_SIZE(eth->dsa_meta); i++) { ++ struct metadata_dst *md_dst = eth->dsa_meta[i]; ++ ++ if (md_dst) ++ continue; ++ ++ md_dst = metadata_dst_alloc(0, METADATA_HW_PORT_MUX, ++ GFP_KERNEL); ++ if (!md_dst) ++ return -ENOMEM; ++ ++ md_dst->u.port_info.port_id = i; ++ eth->dsa_meta[i] = md_dst; ++ } ++ } else { ++ /* Hardware special tag parsing needs to be disabled if at least ++ * one MAC does not use DSA. ++ */ ++ u32 val = mtk_r32(eth, MTK_CDMP_IG_CTRL); ++ val &= ~MTK_CDMP_STAG_EN; ++ mtk_w32(eth, val, MTK_CDMP_IG_CTRL); ++ ++ mtk_w32(eth, 0, MTK_CDMP_EG_CTRL); ++ } ++ + return 0; + } + +@@ -3718,10 +3688,9 @@ static int mtk_hw_init(struct mtk_eth *e + if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { + val = mtk_r32(eth, MTK_CDMP_IG_CTRL); + mtk_w32(eth, val | MTK_CDMP_STAG_EN, MTK_CDMP_IG_CTRL); +- } + +- /* Enable RX VLan Offloading */ +- mtk_w32(eth, 1, MTK_CDMP_EG_CTRL); ++ mtk_w32(eth, 1, MTK_CDMP_EG_CTRL); ++ } + + /* set interrupt delays based on current Net DIM sample */ + mtk_dim_rx(ð->rx_dim.work); +@@ -4361,7 +4330,7 @@ static int mtk_add_mac(struct mtk_eth *e + eth->netdev[id]->hw_features |= NETIF_F_LRO; + + eth->netdev[id]->vlan_features = eth->soc->hw_features & +- ~(NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX); ++ ~NETIF_F_HW_VLAN_CTAG_TX; + eth->netdev[id]->features |= eth->soc->hw_features; + eth->netdev[id]->ethtool_ops = &mtk_ethtool_ops; + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -48,7 +48,6 @@ + #define MTK_HW_FEATURES (NETIF_F_IP_CSUM | \ + NETIF_F_RXCSUM | \ + NETIF_F_HW_VLAN_CTAG_TX | \ +- NETIF_F_HW_VLAN_CTAG_RX | \ + NETIF_F_SG | NETIF_F_TSO | \ + NETIF_F_TSO6 | \ + NETIF_F_IPV6_CSUM |\ diff --git a/target/linux/generic/backport-5.15/733-v6.5-27-net-ethernet-mtk_eth_soc-always-mtk_get_ib1_pkt_type.patch b/target/linux/generic/backport-5.15/733-v6.5-27-net-ethernet-mtk_eth_soc-always-mtk_get_ib1_pkt_type.patch new file mode 100644 index 0000000000..2704faec12 --- /dev/null +++ b/target/linux/generic/backport-5.15/733-v6.5-27-net-ethernet-mtk_eth_soc-always-mtk_get_ib1_pkt_type.patch @@ -0,0 +1,31 @@ +From b804f765485109f9644cc05d1e8fc79ca6c6e4aa Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Wed, 19 Jul 2023 01:39:36 +0100 +Subject: [PATCH 094/250] net: ethernet: mtk_eth_soc: always + mtk_get_ib1_pkt_type + +entries and bind debugfs files would display wrong data on NETSYS_V2 and +later because instead of using mtk_get_ib1_pkt_type the driver would use +MTK_FOE_IB1_PACKET_TYPE which corresponds to NETSYS_V1(.x) SoCs. +Use mtk_get_ib1_pkt_type so entries and bind records display correctly. + +Fixes: 03a3180e5c09e ("net: ethernet: mtk_eth_soc: introduce flow offloading support for mt7986") +Signed-off-by: Daniel Golle +Acked-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/c0ae03d0182f4d27b874cbdf0059bc972c317f3c.1689727134.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c +@@ -98,7 +98,7 @@ mtk_ppe_debugfs_foe_show(struct seq_file + + acct = mtk_foe_entry_get_mib(ppe, i, NULL); + +- type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); ++ type = mtk_get_ib1_pkt_type(ppe->eth, entry->ib1); + seq_printf(m, "%05x %s %7s", i, + mtk_foe_entry_state_str(state), + mtk_foe_pkt_type_str(type)); diff --git a/target/linux/generic/backport-5.10/734-v5.16-0001-net-bgmac-improve-handling-PHY.patch b/target/linux/generic/backport-5.15/734-v5.16-0001-net-bgmac-improve-handling-PHY.patch similarity index 100% rename from target/linux/generic/backport-5.10/734-v5.16-0001-net-bgmac-improve-handling-PHY.patch rename to target/linux/generic/backport-5.15/734-v5.16-0001-net-bgmac-improve-handling-PHY.patch diff --git a/target/linux/generic/backport-5.10/734-v5.16-0002-net-bgmac-support-MDIO-described-in-DT.patch b/target/linux/generic/backport-5.15/734-v5.16-0002-net-bgmac-support-MDIO-described-in-DT.patch similarity index 100% rename from target/linux/generic/backport-5.10/734-v5.16-0002-net-bgmac-support-MDIO-described-in-DT.patch rename to target/linux/generic/backport-5.15/734-v5.16-0002-net-bgmac-support-MDIO-described-in-DT.patch diff --git a/target/linux/generic/backport-5.15/742-v5.16-net-phy-at803x-add-support-for-qca-8327-internal-phy.patch b/target/linux/generic/backport-5.15/742-v5.16-net-phy-at803x-add-support-for-qca-8327-internal-phy.patch new file mode 100644 index 0000000000..03171d72cc --- /dev/null +++ b/target/linux/generic/backport-5.15/742-v5.16-net-phy-at803x-add-support-for-qca-8327-internal-phy.patch @@ -0,0 +1,48 @@ +From 0ccf8511182436183c031e8a2f740ae91a02c625 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Tue, 14 Sep 2021 14:33:45 +0200 +Subject: net: phy: at803x: add support for qca 8327 internal phy + +Add support for qca8327 internal phy needed for correct init of the +switch port. It does use the same qca8337 function and reg just with a +different id. + +Signed-off-by: Ansuel Smith +Tested-by: Rosen Penev +Tested-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/at803x.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -1410,6 +1410,19 @@ static struct phy_driver at803x_driver[] + .get_sset_count = at803x_get_sset_count, + .get_strings = at803x_get_strings, + .get_stats = at803x_get_stats, ++}, { ++ /* QCA8327 */ ++ .phy_id = QCA8327_PHY_ID, ++ .phy_id_mask = QCA8K_PHY_ID_MASK, ++ .name = "QCA PHY 8327", ++ /* PHY_GBIT_FEATURES */ ++ .probe = at803x_probe, ++ .flags = PHY_IS_INTERNAL, ++ .config_init = qca83xx_config_init, ++ .soft_reset = genphy_soft_reset, ++ .get_sset_count = at803x_get_sset_count, ++ .get_strings = at803x_get_strings, ++ .get_stats = at803x_get_stats, + }, }; + + module_phy_driver(at803x_driver); +@@ -1420,6 +1433,8 @@ static struct mdio_device_id __maybe_unu + { PHY_ID_MATCH_EXACT(ATH8032_PHY_ID) }, + { PHY_ID_MATCH_EXACT(ATH8035_PHY_ID) }, + { PHY_ID_MATCH_EXACT(ATH9331_PHY_ID) }, ++ { PHY_ID_MATCH_EXACT(QCA8337_PHY_ID) }, ++ { PHY_ID_MATCH_EXACT(QCA8327_PHY_ID) }, + { } + }; + diff --git a/target/linux/generic/backport-5.15/743-v5.16-0001-net-dsa-b53-Include-all-ports-in-enabled_ports.patch b/target/linux/generic/backport-5.15/743-v5.16-0001-net-dsa-b53-Include-all-ports-in-enabled_ports.patch new file mode 100644 index 0000000000..dc149a742b --- /dev/null +++ b/target/linux/generic/backport-5.15/743-v5.16-0001-net-dsa-b53-Include-all-ports-in-enabled_ports.patch @@ -0,0 +1,131 @@ +From 983d96a9116a328668601555d96736261d33170c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 16 Sep 2021 14:03:51 +0200 +Subject: [PATCH] net: dsa: b53: Include all ports in "enabled_ports" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Make "enabled_ports" bitfield contain all available switch ports +including a CPU port. This way there is no need for fixup during +initialization. + +For BCM53010, BCM53018 and BCM53019 include also other available ports. + +Signed-off-by: Rafał Miłecki +Reviewed-by: Florian Fainelli +Tested-by: Florian Fainelli +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/b53/b53_common.c | 23 +++++++++++------------ + 1 file changed, 11 insertions(+), 12 deletions(-) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -2300,7 +2300,7 @@ static const struct b53_chip_data b53_sw + .chip_id = BCM5325_DEVICE_ID, + .dev_name = "BCM5325", + .vlans = 16, +- .enabled_ports = 0x1f, ++ .enabled_ports = 0x3f, + .arl_bins = 2, + .arl_buckets = 1024, + .imp_port = 5, +@@ -2311,7 +2311,7 @@ static const struct b53_chip_data b53_sw + .chip_id = BCM5365_DEVICE_ID, + .dev_name = "BCM5365", + .vlans = 256, +- .enabled_ports = 0x1f, ++ .enabled_ports = 0x3f, + .arl_bins = 2, + .arl_buckets = 1024, + .imp_port = 5, +@@ -2322,7 +2322,7 @@ static const struct b53_chip_data b53_sw + .chip_id = BCM5389_DEVICE_ID, + .dev_name = "BCM5389", + .vlans = 4096, +- .enabled_ports = 0x1f, ++ .enabled_ports = 0x11f, + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +@@ -2336,7 +2336,7 @@ static const struct b53_chip_data b53_sw + .chip_id = BCM5395_DEVICE_ID, + .dev_name = "BCM5395", + .vlans = 4096, +- .enabled_ports = 0x1f, ++ .enabled_ports = 0x11f, + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +@@ -2350,7 +2350,7 @@ static const struct b53_chip_data b53_sw + .chip_id = BCM5397_DEVICE_ID, + .dev_name = "BCM5397", + .vlans = 4096, +- .enabled_ports = 0x1f, ++ .enabled_ports = 0x11f, + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +@@ -2364,7 +2364,7 @@ static const struct b53_chip_data b53_sw + .chip_id = BCM5398_DEVICE_ID, + .dev_name = "BCM5398", + .vlans = 4096, +- .enabled_ports = 0x7f, ++ .enabled_ports = 0x17f, + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +@@ -2378,7 +2378,7 @@ static const struct b53_chip_data b53_sw + .chip_id = BCM53115_DEVICE_ID, + .dev_name = "BCM53115", + .vlans = 4096, +- .enabled_ports = 0x1f, ++ .enabled_ports = 0x11f, + .arl_bins = 4, + .arl_buckets = 1024, + .vta_regs = B53_VTA_REGS, +@@ -2392,7 +2392,7 @@ static const struct b53_chip_data b53_sw + .chip_id = BCM53125_DEVICE_ID, + .dev_name = "BCM53125", + .vlans = 4096, +- .enabled_ports = 0xff, ++ .enabled_ports = 0x1ff, + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +@@ -2434,7 +2434,7 @@ static const struct b53_chip_data b53_sw + .chip_id = BCM53010_DEVICE_ID, + .dev_name = "BCM53010", + .vlans = 4096, +- .enabled_ports = 0x1f, ++ .enabled_ports = 0x1bf, + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +@@ -2476,7 +2476,7 @@ static const struct b53_chip_data b53_sw + .chip_id = BCM53018_DEVICE_ID, + .dev_name = "BCM53018", + .vlans = 4096, +- .enabled_ports = 0x1f, ++ .enabled_ports = 0x1bf, + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +@@ -2490,7 +2490,7 @@ static const struct b53_chip_data b53_sw + .chip_id = BCM53019_DEVICE_ID, + .dev_name = "BCM53019", + .vlans = 4096, +- .enabled_ports = 0x1f, ++ .enabled_ports = 0x1bf, + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +@@ -2632,7 +2632,6 @@ static int b53_switch_init(struct b53_de + dev->cpu_port = 5; + } + +- dev->enabled_ports |= BIT(dev->cpu_port); + dev->num_ports = fls(dev->enabled_ports); + + dev->ds->num_ports = min_t(unsigned int, dev->num_ports, DSA_MAX_PORTS); diff --git a/target/linux/generic/backport-5.15/743-v5.16-0002-net-dsa-b53-Drop-BCM5301x-workaround-for-a-wrong-CPU.patch b/target/linux/generic/backport-5.15/743-v5.16-0002-net-dsa-b53-Drop-BCM5301x-workaround-for-a-wrong-CPU.patch new file mode 100644 index 0000000000..1286911d2e --- /dev/null +++ b/target/linux/generic/backport-5.15/743-v5.16-0002-net-dsa-b53-Drop-BCM5301x-workaround-for-a-wrong-CPU.patch @@ -0,0 +1,42 @@ +From b290c6384afabbca5ae6e2af72fb1b2bc37922be Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 16 Sep 2021 14:03:52 +0200 +Subject: [PATCH] net: dsa: b53: Drop BCM5301x workaround for a wrong CPU/IMP + port +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +On BCM5301x port 8 requires a fixed link when used. + +Years ago when b53 was an libreCMC downstream driver (with configuration +based on sometimes bugged NVRAM) there was a need for a fixup. In case +of forcing fixed link for (incorrectly specified) port 5 the code had to +actually setup port 8 link. + +For upstream b53 driver with setup based on DT there is no need for that +workaround. In DT we have and require correct ports setup. + +Signed-off-by: Rafał Miłecki +Reviewed-by: Florian Fainelli +Tested-by: Florian Fainelli +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/b53/b53_common.c | 6 ------ + 1 file changed, 6 deletions(-) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -1291,12 +1291,6 @@ static void b53_adjust_link(struct dsa_s + return; + } + } +- } else if (is5301x(dev)) { +- if (port != dev->cpu_port) { +- b53_force_port_config(dev, dev->cpu_port, 2000, +- DUPLEX_FULL, true, true); +- b53_force_link(dev, dev->cpu_port, 1); +- } + } + + /* Re-negotiate EEE if it was enabled already */ diff --git a/target/linux/generic/backport-5.15/743-v5.16-0003-net-dsa-b53-Improve-flow-control-setup-on-BCM5301x.patch b/target/linux/generic/backport-5.15/743-v5.16-0003-net-dsa-b53-Improve-flow-control-setup-on-BCM5301x.patch new file mode 100644 index 0000000000..941fa23eb4 --- /dev/null +++ b/target/linux/generic/backport-5.15/743-v5.16-0003-net-dsa-b53-Improve-flow-control-setup-on-BCM5301x.patch @@ -0,0 +1,32 @@ +From 3ff26b29230c54fea2353b63124c589b61953e14 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 16 Sep 2021 14:03:53 +0200 +Subject: [PATCH] net: dsa: b53: Improve flow control setup on BCM5301x +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +According to the Broadcom's reference driver flow control needs to be +enabled for any CPU switch port (5, 7 or 8 - depending on which one is +used). Current code makes it work only for the port 5. Use +dsa_is_cpu_port() which solved that problem. + +Signed-off-by: Rafał Miłecki +Reviewed-by: Florian Fainelli +Tested-by: Florian Fainelli +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/b53/b53_common.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -1222,7 +1222,7 @@ static void b53_adjust_link(struct dsa_s + return; + + /* Enable flow control on BCM5301x's CPU port */ +- if (is5301x(dev) && port == dev->cpu_port) ++ if (is5301x(dev) && dsa_is_cpu_port(ds, port)) + tx_pause = rx_pause = true; + + if (phydev->pause) { diff --git a/target/linux/generic/backport-5.15/743-v5.16-0004-net-dsa-b53-Drop-unused-cpu_port-field.patch b/target/linux/generic/backport-5.15/743-v5.16-0004-net-dsa-b53-Drop-unused-cpu_port-field.patch new file mode 100644 index 0000000000..07d0ec03cf --- /dev/null +++ b/target/linux/generic/backport-5.15/743-v5.16-0004-net-dsa-b53-Drop-unused-cpu_port-field.patch @@ -0,0 +1,205 @@ +From 7d5af56418d7d01e43247a33b6fe6492ea871923 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 16 Sep 2021 14:03:54 +0200 +Subject: [PATCH] net: dsa: b53: Drop unused "cpu_port" field +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It's set but never used anymore. + +Signed-off-by: Rafał Miłecki +Reviewed-by: Florian Fainelli +Tested-by: Florian Fainelli +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/b53/b53_common.c | 28 ---------------------------- + drivers/net/dsa/b53/b53_priv.h | 1 - + 2 files changed, 29 deletions(-) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -2298,7 +2298,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 2, + .arl_buckets = 1024, + .imp_port = 5, +- .cpu_port = B53_CPU_PORT_25, + .duplex_reg = B53_DUPLEX_STAT_FE, + }, + { +@@ -2309,7 +2308,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 2, + .arl_buckets = 1024, + .imp_port = 5, +- .cpu_port = B53_CPU_PORT_25, + .duplex_reg = B53_DUPLEX_STAT_FE, + }, + { +@@ -2320,7 +2318,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2334,7 +2331,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2348,7 +2344,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .vta_regs = B53_VTA_REGS_9798, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2362,7 +2357,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .vta_regs = B53_VTA_REGS_9798, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2377,7 +2371,6 @@ static const struct b53_chip_data b53_sw + .arl_buckets = 1024, + .vta_regs = B53_VTA_REGS, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, + .jumbo_size_reg = B53_JUMBO_MAX_SIZE, +@@ -2390,7 +2383,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2404,7 +2396,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2418,7 +2409,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .vta_regs = B53_VTA_REGS_63XX, + .duplex_reg = B53_DUPLEX_STAT_63XX, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK_63XX, +@@ -2432,7 +2422,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2446,7 +2435,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2460,7 +2448,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2474,7 +2461,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2488,7 +2474,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2502,7 +2487,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2516,7 +2500,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2545,7 +2528,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 1024, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2559,7 +2541,6 @@ static const struct b53_chip_data b53_sw + .arl_bins = 4, + .arl_buckets = 256, + .imp_port = 8, +- .cpu_port = B53_CPU_PORT, + .vta_regs = B53_VTA_REGS, + .duplex_reg = B53_DUPLEX_STAT_GE, + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, +@@ -2585,7 +2566,6 @@ static int b53_switch_init(struct b53_de + dev->vta_regs[2] = chip->vta_regs[2]; + dev->jumbo_pm_reg = chip->jumbo_pm_reg; + dev->imp_port = chip->imp_port; +- dev->cpu_port = chip->cpu_port; + dev->num_vlans = chip->vlans; + dev->num_arl_bins = chip->arl_bins; + dev->num_arl_buckets = chip->arl_buckets; +@@ -2617,13 +2597,6 @@ static int b53_switch_init(struct b53_de + break; + #endif + } +- } else if (dev->chip_id == BCM53115_DEVICE_ID) { +- u64 strap_value; +- +- b53_read48(dev, B53_STAT_PAGE, B53_STRAP_VALUE, &strap_value); +- /* use second IMP port if GMII is enabled */ +- if (strap_value & SV_GMII_CTRL_115) +- dev->cpu_port = 5; + } + + dev->num_ports = fls(dev->enabled_ports); +--- a/drivers/net/dsa/b53/b53_priv.h ++++ b/drivers/net/dsa/b53/b53_priv.h +@@ -124,7 +124,6 @@ struct b53_device { + /* used ports mask */ + u16 enabled_ports; + unsigned int imp_port; +- unsigned int cpu_port; + + /* connect specific data */ + u8 current_page; diff --git a/target/linux/generic/backport-5.15/745-v5.16-01-net-phy-at803x-add-support-for-qca-8327-A-variant.patch b/target/linux/generic/backport-5.15/745-v5.16-01-net-phy-at803x-add-support-for-qca-8327-A-variant.patch new file mode 100644 index 0000000000..7e4e9462e8 --- /dev/null +++ b/target/linux/generic/backport-5.15/745-v5.16-01-net-phy-at803x-add-support-for-qca-8327-A-variant.patch @@ -0,0 +1,65 @@ +From b4df02b562f4aa14ff6811f30e1b4d2159585c59 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sun, 19 Sep 2021 18:28:15 +0200 +Subject: net: phy: at803x: add support for qca 8327 A variant internal phy + +For qca8327 internal phy there are 2 different switch variant with 2 +different phy id. Add this missing variant so the internal phy can be +correctly identified and fixed. + +Signed-off-by: Ansuel Smith +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/at803x.c | 25 ++++++++++++++++++++----- + 1 file changed, 20 insertions(+), 5 deletions(-) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -150,7 +150,8 @@ + #define ATH8035_PHY_ID 0x004dd072 + #define AT8030_PHY_ID_MASK 0xffffffef + +-#define QCA8327_PHY_ID 0x004dd034 ++#define QCA8327_A_PHY_ID 0x004dd033 ++#define QCA8327_B_PHY_ID 0x004dd034 + #define QCA8337_PHY_ID 0x004dd036 + #define QCA8K_PHY_ID_MASK 0xffffffff + +@@ -1411,10 +1412,23 @@ static struct phy_driver at803x_driver[] + .get_strings = at803x_get_strings, + .get_stats = at803x_get_stats, + }, { +- /* QCA8327 */ +- .phy_id = QCA8327_PHY_ID, ++ /* QCA8327-A from switch QCA8327-AL1A */ ++ .phy_id = QCA8327_A_PHY_ID, + .phy_id_mask = QCA8K_PHY_ID_MASK, +- .name = "QCA PHY 8327", ++ .name = "QCA PHY 8327-A", ++ /* PHY_GBIT_FEATURES */ ++ .probe = at803x_probe, ++ .flags = PHY_IS_INTERNAL, ++ .config_init = qca83xx_config_init, ++ .soft_reset = genphy_soft_reset, ++ .get_sset_count = at803x_get_sset_count, ++ .get_strings = at803x_get_strings, ++ .get_stats = at803x_get_stats, ++}, { ++ /* QCA8327-B from switch QCA8327-BL1A */ ++ .phy_id = QCA8327_B_PHY_ID, ++ .phy_id_mask = QCA8K_PHY_ID_MASK, ++ .name = "QCA PHY 8327-B", + /* PHY_GBIT_FEATURES */ + .probe = at803x_probe, + .flags = PHY_IS_INTERNAL, +@@ -1434,7 +1448,8 @@ static struct mdio_device_id __maybe_unu + { PHY_ID_MATCH_EXACT(ATH8035_PHY_ID) }, + { PHY_ID_MATCH_EXACT(ATH9331_PHY_ID) }, + { PHY_ID_MATCH_EXACT(QCA8337_PHY_ID) }, +- { PHY_ID_MATCH_EXACT(QCA8327_PHY_ID) }, ++ { PHY_ID_MATCH_EXACT(QCA8327_A_PHY_ID) }, ++ { PHY_ID_MATCH_EXACT(QCA8327_B_PHY_ID) }, + { } + }; + diff --git a/target/linux/generic/backport-5.15/745-v5.16-02-net-phy-at803x-add-resume-suspend-function-to-qca83x.patch b/target/linux/generic/backport-5.15/745-v5.16-02-net-phy-at803x-add-resume-suspend-function-to-qca83x.patch new file mode 100644 index 0000000000..89aca23194 --- /dev/null +++ b/target/linux/generic/backport-5.15/745-v5.16-02-net-phy-at803x-add-resume-suspend-function-to-qca83x.patch @@ -0,0 +1,45 @@ +From 15b9df4ece17d084f14eb0ca1cf05f2ad497e425 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sun, 19 Sep 2021 18:28:16 +0200 +Subject: net: phy: at803x: add resume/suspend function to qca83xx phy + +Add resume/suspend function to qca83xx internal phy. +We can't use the at803x generic function as the documentation lacks of +any support for WoL regs. + +Signed-off-by: Ansuel Smith +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/at803x.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -1411,6 +1411,8 @@ static struct phy_driver at803x_driver[] + .get_sset_count = at803x_get_sset_count, + .get_strings = at803x_get_strings, + .get_stats = at803x_get_stats, ++ .suspend = genphy_suspend, ++ .resume = genphy_resume, + }, { + /* QCA8327-A from switch QCA8327-AL1A */ + .phy_id = QCA8327_A_PHY_ID, +@@ -1424,6 +1426,8 @@ static struct phy_driver at803x_driver[] + .get_sset_count = at803x_get_sset_count, + .get_strings = at803x_get_strings, + .get_stats = at803x_get_stats, ++ .suspend = genphy_suspend, ++ .resume = genphy_resume, + }, { + /* QCA8327-B from switch QCA8327-BL1A */ + .phy_id = QCA8327_B_PHY_ID, +@@ -1437,6 +1441,8 @@ static struct phy_driver at803x_driver[] + .get_sset_count = at803x_get_sset_count, + .get_strings = at803x_get_strings, + .get_stats = at803x_get_stats, ++ .suspend = genphy_suspend, ++ .resume = genphy_resume, + }, }; + + module_phy_driver(at803x_driver); diff --git a/target/linux/generic/backport-5.15/745-v5.16-03-net-phy-at803x-fix-spacing-and-improve-name-for-83xx.patch b/target/linux/generic/backport-5.15/745-v5.16-03-net-phy-at803x-fix-spacing-and-improve-name-for-83xx.patch new file mode 100644 index 0000000000..920bef24fd --- /dev/null +++ b/target/linux/generic/backport-5.15/745-v5.16-03-net-phy-at803x-fix-spacing-and-improve-name-for-83xx.patch @@ -0,0 +1,95 @@ +From d44fd8604a4ab92119adb35f05fd87612af722b5 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sun, 19 Sep 2021 18:28:17 +0200 +Subject: net: phy: at803x: fix spacing and improve name for 83xx phy + +Fix spacing and improve name for 83xx phy following other phy in the +same driver. + +Signed-off-by: Ansuel Smith +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/at803x.c | 60 ++++++++++++++++++++++++------------------------ + 1 file changed, 30 insertions(+), 30 deletions(-) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -1400,47 +1400,47 @@ static struct phy_driver at803x_driver[] + .config_aneg = at803x_config_aneg, + }, { + /* QCA8337 */ +- .phy_id = QCA8337_PHY_ID, +- .phy_id_mask = QCA8K_PHY_ID_MASK, +- .name = "QCA PHY 8337", ++ .phy_id = QCA8337_PHY_ID, ++ .phy_id_mask = QCA8K_PHY_ID_MASK, ++ .name = "Qualcomm Atheros 8337 internal PHY", + /* PHY_GBIT_FEATURES */ +- .probe = at803x_probe, +- .flags = PHY_IS_INTERNAL, +- .config_init = qca83xx_config_init, +- .soft_reset = genphy_soft_reset, +- .get_sset_count = at803x_get_sset_count, +- .get_strings = at803x_get_strings, +- .get_stats = at803x_get_stats, ++ .probe = at803x_probe, ++ .flags = PHY_IS_INTERNAL, ++ .config_init = qca83xx_config_init, ++ .soft_reset = genphy_soft_reset, ++ .get_sset_count = at803x_get_sset_count, ++ .get_strings = at803x_get_strings, ++ .get_stats = at803x_get_stats, + .suspend = genphy_suspend, + .resume = genphy_resume, + }, { + /* QCA8327-A from switch QCA8327-AL1A */ +- .phy_id = QCA8327_A_PHY_ID, +- .phy_id_mask = QCA8K_PHY_ID_MASK, +- .name = "QCA PHY 8327-A", ++ .phy_id = QCA8327_A_PHY_ID, ++ .phy_id_mask = QCA8K_PHY_ID_MASK, ++ .name = "Qualcomm Atheros 8327-A internal PHY", + /* PHY_GBIT_FEATURES */ +- .probe = at803x_probe, +- .flags = PHY_IS_INTERNAL, +- .config_init = qca83xx_config_init, +- .soft_reset = genphy_soft_reset, +- .get_sset_count = at803x_get_sset_count, +- .get_strings = at803x_get_strings, +- .get_stats = at803x_get_stats, ++ .probe = at803x_probe, ++ .flags = PHY_IS_INTERNAL, ++ .config_init = qca83xx_config_init, ++ .soft_reset = genphy_soft_reset, ++ .get_sset_count = at803x_get_sset_count, ++ .get_strings = at803x_get_strings, ++ .get_stats = at803x_get_stats, + .suspend = genphy_suspend, + .resume = genphy_resume, + }, { + /* QCA8327-B from switch QCA8327-BL1A */ +- .phy_id = QCA8327_B_PHY_ID, +- .phy_id_mask = QCA8K_PHY_ID_MASK, +- .name = "QCA PHY 8327-B", ++ .phy_id = QCA8327_B_PHY_ID, ++ .phy_id_mask = QCA8K_PHY_ID_MASK, ++ .name = "Qualcomm Atheros 8327-B internal PHY", + /* PHY_GBIT_FEATURES */ +- .probe = at803x_probe, +- .flags = PHY_IS_INTERNAL, +- .config_init = qca83xx_config_init, +- .soft_reset = genphy_soft_reset, +- .get_sset_count = at803x_get_sset_count, +- .get_strings = at803x_get_strings, +- .get_stats = at803x_get_stats, ++ .probe = at803x_probe, ++ .flags = PHY_IS_INTERNAL, ++ .config_init = qca83xx_config_init, ++ .soft_reset = genphy_soft_reset, ++ .get_sset_count = at803x_get_sset_count, ++ .get_strings = at803x_get_strings, ++ .get_stats = at803x_get_stats, + .suspend = genphy_suspend, + .resume = genphy_resume, + }, }; diff --git a/target/linux/generic/backport-5.15/746-v5.16-01-net-phy-at803x-fix-resume-for-QCA8327-phy.patch b/target/linux/generic/backport-5.15/746-v5.16-01-net-phy-at803x-fix-resume-for-QCA8327-phy.patch new file mode 100644 index 0000000000..1029420ea9 --- /dev/null +++ b/target/linux/generic/backport-5.15/746-v5.16-01-net-phy-at803x-fix-resume-for-QCA8327-phy.patch @@ -0,0 +1,131 @@ +From ba3c01ee02ed0d821c9f241f179bbc9457542b8f Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sun, 10 Oct 2021 00:46:15 +0200 +Subject: net: phy: at803x: fix resume for QCA8327 phy + +From Documentation phy resume triggers phy reset and restart +auto-negotiation. Add a dedicated function to wait reset to finish as +it was notice a regression where port sometime are not reliable after a +suspend/resume session. The reset wait logic is copied from phy_poll_reset. +Add dedicated suspend function to use genphy_suspend only with QCA8337 +phy and set only additional debug settings for QCA8327. With more test +it was reported that QCA8327 doesn't proprely support this mode and +using this cause the unreliability of the switch ports, especially the +malfunction of the port0. + +Fixes: 15b9df4ece17 ("net: phy: at803x: add resume/suspend function to qca83xx phy") +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/phy/at803x.c | 69 +++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 63 insertions(+), 6 deletions(-) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -92,9 +92,14 @@ + #define AT803X_DEBUG_REG_5 0x05 + #define AT803X_DEBUG_TX_CLK_DLY_EN BIT(8) + ++#define AT803X_DEBUG_REG_HIB_CTRL 0x0b ++#define AT803X_DEBUG_HIB_CTRL_SEL_RST_80U BIT(10) ++#define AT803X_DEBUG_HIB_CTRL_EN_ANY_CHANGE BIT(13) ++ + #define AT803X_DEBUG_REG_3C 0x3C + + #define AT803X_DEBUG_REG_3D 0x3D ++#define AT803X_DEBUG_GATE_CLK_IN1000 BIT(6) + + #define AT803X_DEBUG_REG_1F 0x1F + #define AT803X_DEBUG_PLL_ON BIT(2) +@@ -1304,6 +1309,58 @@ static int qca83xx_config_init(struct ph + return 0; + } + ++static int qca83xx_resume(struct phy_device *phydev) ++{ ++ int ret, val; ++ ++ /* Skip reset if not suspended */ ++ if (!phydev->suspended) ++ return 0; ++ ++ /* Reinit the port, reset values set by suspend */ ++ qca83xx_config_init(phydev); ++ ++ /* Reset the port on port resume */ ++ phy_set_bits(phydev, MII_BMCR, BMCR_RESET | BMCR_ANENABLE); ++ ++ /* On resume from suspend the switch execute a reset and ++ * restart auto-negotiation. Wait for reset to complete. ++ */ ++ ret = phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET), ++ 50000, 600000, true); ++ if (ret) ++ return ret; ++ ++ msleep(1); ++ ++ return 0; ++} ++ ++static int qca83xx_suspend(struct phy_device *phydev) ++{ ++ u16 mask = 0; ++ ++ /* Only QCA8337 support actual suspend. ++ * QCA8327 cause port unreliability when phy suspend ++ * is set. ++ */ ++ if (phydev->drv->phy_id == QCA8337_PHY_ID) { ++ genphy_suspend(phydev); ++ } else { ++ mask |= ~(BMCR_SPEED1000 | BMCR_FULLDPLX); ++ phy_modify(phydev, MII_BMCR, mask, 0); ++ } ++ ++ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_3D, ++ AT803X_DEBUG_GATE_CLK_IN1000, 0); ++ ++ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_HIB_CTRL, ++ AT803X_DEBUG_HIB_CTRL_EN_ANY_CHANGE | ++ AT803X_DEBUG_HIB_CTRL_SEL_RST_80U, 0); ++ ++ return 0; ++} ++ + static struct phy_driver at803x_driver[] = { + { + /* Qualcomm Atheros AR8035 */ +@@ -1411,8 +1468,8 @@ static struct phy_driver at803x_driver[] + .get_sset_count = at803x_get_sset_count, + .get_strings = at803x_get_strings, + .get_stats = at803x_get_stats, +- .suspend = genphy_suspend, +- .resume = genphy_resume, ++ .suspend = qca83xx_suspend, ++ .resume = qca83xx_resume, + }, { + /* QCA8327-A from switch QCA8327-AL1A */ + .phy_id = QCA8327_A_PHY_ID, +@@ -1426,8 +1483,8 @@ static struct phy_driver at803x_driver[] + .get_sset_count = at803x_get_sset_count, + .get_strings = at803x_get_strings, + .get_stats = at803x_get_stats, +- .suspend = genphy_suspend, +- .resume = genphy_resume, ++ .suspend = qca83xx_suspend, ++ .resume = qca83xx_resume, + }, { + /* QCA8327-B from switch QCA8327-BL1A */ + .phy_id = QCA8327_B_PHY_ID, +@@ -1441,8 +1498,8 @@ static struct phy_driver at803x_driver[] + .get_sset_count = at803x_get_sset_count, + .get_strings = at803x_get_strings, + .get_stats = at803x_get_stats, +- .suspend = genphy_suspend, +- .resume = genphy_resume, ++ .suspend = qca83xx_suspend, ++ .resume = qca83xx_resume, + }, }; + + module_phy_driver(at803x_driver); diff --git a/target/linux/generic/backport-5.15/746-v5.16-02-net-phy-at803x-add-DAC-amplitude-fix-for-8327-phy.patch b/target/linux/generic/backport-5.15/746-v5.16-02-net-phy-at803x-add-DAC-amplitude-fix-for-8327-phy.patch new file mode 100644 index 0000000000..5813619c5c --- /dev/null +++ b/target/linux/generic/backport-5.15/746-v5.16-02-net-phy-at803x-add-DAC-amplitude-fix-for-8327-phy.patch @@ -0,0 +1,91 @@ +From 1ca8311949aec5c9447645731ef1c6bc5bd71350 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sun, 10 Oct 2021 00:46:16 +0200 +Subject: net: phy: at803x: add DAC amplitude fix for 8327 phy + +QCA8327 internal phy require DAC amplitude adjustement set to +6% with +100m speed. Also add additional define to report a change of the same +reg in QCA8337. (different scope it does set 1000m voltage) +Add link_change_notify function to set the proper amplitude adjustement +on PHY_RUNNING state and disable on any other state. + +Fixes: b4df02b562f4 ("net: phy: at803x: add support for qca 8327 A variant internal phy") +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/phy/at803x.c | 33 +++++++++++++++++++++++++++++++++ + 1 file changed, 33 insertions(+) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -87,6 +87,8 @@ + #define AT803X_PSSR_MR_AN_COMPLETE 0x0200 + + #define AT803X_DEBUG_REG_0 0x00 ++#define QCA8327_DEBUG_MANU_CTRL_EN BIT(2) ++#define QCA8337_DEBUG_MANU_CTRL_EN GENMASK(3, 2) + #define AT803X_DEBUG_RX_CLK_DLY_EN BIT(15) + + #define AT803X_DEBUG_REG_5 0x05 +@@ -1306,9 +1308,37 @@ static int qca83xx_config_init(struct ph + break; + } + ++ /* QCA8327 require DAC amplitude adjustment for 100m set to +6%. ++ * Disable on init and enable only with 100m speed following ++ * qca original source code. ++ */ ++ if (phydev->drv->phy_id == QCA8327_A_PHY_ID || ++ phydev->drv->phy_id == QCA8327_B_PHY_ID) ++ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, ++ QCA8327_DEBUG_MANU_CTRL_EN, 0); ++ + return 0; + } + ++static void qca83xx_link_change_notify(struct phy_device *phydev) ++{ ++ /* QCA8337 doesn't require DAC Amplitude adjustement */ ++ if (phydev->drv->phy_id == QCA8337_PHY_ID) ++ return; ++ ++ /* Set DAC Amplitude adjustment to +6% for 100m on link running */ ++ if (phydev->state == PHY_RUNNING) { ++ if (phydev->speed == SPEED_100) ++ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, ++ QCA8327_DEBUG_MANU_CTRL_EN, ++ QCA8327_DEBUG_MANU_CTRL_EN); ++ } else { ++ /* Reset DAC Amplitude adjustment */ ++ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, ++ QCA8327_DEBUG_MANU_CTRL_EN, 0); ++ } ++} ++ + static int qca83xx_resume(struct phy_device *phydev) + { + int ret, val; +@@ -1461,6 +1491,7 @@ static struct phy_driver at803x_driver[] + .phy_id_mask = QCA8K_PHY_ID_MASK, + .name = "Qualcomm Atheros 8337 internal PHY", + /* PHY_GBIT_FEATURES */ ++ .link_change_notify = qca83xx_link_change_notify, + .probe = at803x_probe, + .flags = PHY_IS_INTERNAL, + .config_init = qca83xx_config_init, +@@ -1476,6 +1507,7 @@ static struct phy_driver at803x_driver[] + .phy_id_mask = QCA8K_PHY_ID_MASK, + .name = "Qualcomm Atheros 8327-A internal PHY", + /* PHY_GBIT_FEATURES */ ++ .link_change_notify = qca83xx_link_change_notify, + .probe = at803x_probe, + .flags = PHY_IS_INTERNAL, + .config_init = qca83xx_config_init, +@@ -1491,6 +1523,7 @@ static struct phy_driver at803x_driver[] + .phy_id_mask = QCA8K_PHY_ID_MASK, + .name = "Qualcomm Atheros 8327-B internal PHY", + /* PHY_GBIT_FEATURES */ ++ .link_change_notify = qca83xx_link_change_notify, + .probe = at803x_probe, + .flags = PHY_IS_INTERNAL, + .config_init = qca83xx_config_init, diff --git a/target/linux/generic/backport-5.15/746-v5.16-03-net-phy-at803x-enable-prefer-master-for-83xx-interna.patch b/target/linux/generic/backport-5.15/746-v5.16-03-net-phy-at803x-enable-prefer-master-for-83xx-interna.patch new file mode 100644 index 0000000000..9f880593f1 --- /dev/null +++ b/target/linux/generic/backport-5.15/746-v5.16-03-net-phy-at803x-enable-prefer-master-for-83xx-interna.patch @@ -0,0 +1,27 @@ +From 9d1c29b4028557a496be9c5eb2b4b86063700636 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sun, 10 Oct 2021 00:46:17 +0200 +Subject: net: phy: at803x: enable prefer master for 83xx internal phy + +From original QCA source code the port was set to prefer master as port +type in 1000BASE-T mode. Apply the same settings also here. + +Signed-off-by: Ansuel Smith +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/at803x.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -1317,6 +1317,9 @@ static int qca83xx_config_init(struct ph + at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, + QCA8327_DEBUG_MANU_CTRL_EN, 0); + ++ /* Following original QCA sourcecode set port to prefer master */ ++ phy_set_bits(phydev, MII_CTRL1000, CTL1000_PREFER_MASTER); ++ + return 0; + } + diff --git a/target/linux/generic/backport-5.15/746-v5.16-04-net-phy-at803x-better-describe-debug-regs.patch b/target/linux/generic/backport-5.15/746-v5.16-04-net-phy-at803x-better-describe-debug-regs.patch new file mode 100644 index 0000000000..89e9b3f662 --- /dev/null +++ b/target/linux/generic/backport-5.15/746-v5.16-04-net-phy-at803x-better-describe-debug-regs.patch @@ -0,0 +1,127 @@ +From 67999555ff42e91de7654488d9a7735bd9e84555 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sun, 10 Oct 2021 00:46:18 +0200 +Subject: net: phy: at803x: better describe debug regs + +Give a name to known debug regs from Documentation instead of using +unknown hex values. + +Signed-off-by: Ansuel Smith +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/at803x.c | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -86,12 +86,12 @@ + #define AT803X_PSSR 0x11 /*PHY-Specific Status Register*/ + #define AT803X_PSSR_MR_AN_COMPLETE 0x0200 + +-#define AT803X_DEBUG_REG_0 0x00 ++#define AT803X_DEBUG_ANALOG_TEST_CTRL 0x00 + #define QCA8327_DEBUG_MANU_CTRL_EN BIT(2) + #define QCA8337_DEBUG_MANU_CTRL_EN GENMASK(3, 2) + #define AT803X_DEBUG_RX_CLK_DLY_EN BIT(15) + +-#define AT803X_DEBUG_REG_5 0x05 ++#define AT803X_DEBUG_SYSTEM_CTRL_MODE 0x05 + #define AT803X_DEBUG_TX_CLK_DLY_EN BIT(8) + + #define AT803X_DEBUG_REG_HIB_CTRL 0x0b +@@ -100,7 +100,7 @@ + + #define AT803X_DEBUG_REG_3C 0x3C + +-#define AT803X_DEBUG_REG_3D 0x3D ++#define AT803X_DEBUG_REG_GREEN 0x3D + #define AT803X_DEBUG_GATE_CLK_IN1000 BIT(6) + + #define AT803X_DEBUG_REG_1F 0x1F +@@ -284,25 +284,25 @@ static int at803x_read_page(struct phy_d + + static int at803x_enable_rx_delay(struct phy_device *phydev) + { +- return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, 0, ++ return at803x_debug_reg_mask(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, 0, + AT803X_DEBUG_RX_CLK_DLY_EN); + } + + static int at803x_enable_tx_delay(struct phy_device *phydev) + { +- return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_5, 0, ++ return at803x_debug_reg_mask(phydev, AT803X_DEBUG_SYSTEM_CTRL_MODE, 0, + AT803X_DEBUG_TX_CLK_DLY_EN); + } + + static int at803x_disable_rx_delay(struct phy_device *phydev) + { +- return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, ++ return at803x_debug_reg_mask(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, + AT803X_DEBUG_RX_CLK_DLY_EN, 0); + } + + static int at803x_disable_tx_delay(struct phy_device *phydev) + { +- return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_5, ++ return at803x_debug_reg_mask(phydev, AT803X_DEBUG_SYSTEM_CTRL_MODE, + AT803X_DEBUG_TX_CLK_DLY_EN, 0); + } + +@@ -1292,9 +1292,9 @@ static int qca83xx_config_init(struct ph + switch (switch_revision) { + case 1: + /* For 100M waveform */ +- at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_0, 0x02ea); ++ at803x_debug_reg_write(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, 0x02ea); + /* Turn on Gigabit clock */ +- at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_3D, 0x68a0); ++ at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_GREEN, 0x68a0); + break; + + case 2: +@@ -1302,8 +1302,8 @@ static int qca83xx_config_init(struct ph + fallthrough; + case 4: + phy_write_mmd(phydev, MDIO_MMD_PCS, MDIO_AZ_DEBUG, 0x803f); +- at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_3D, 0x6860); +- at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_5, 0x2c46); ++ at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_GREEN, 0x6860); ++ at803x_debug_reg_write(phydev, AT803X_DEBUG_SYSTEM_CTRL_MODE, 0x2c46); + at803x_debug_reg_write(phydev, AT803X_DEBUG_REG_3C, 0x6000); + break; + } +@@ -1314,7 +1314,7 @@ static int qca83xx_config_init(struct ph + */ + if (phydev->drv->phy_id == QCA8327_A_PHY_ID || + phydev->drv->phy_id == QCA8327_B_PHY_ID) +- at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, ++ at803x_debug_reg_mask(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, + QCA8327_DEBUG_MANU_CTRL_EN, 0); + + /* Following original QCA sourcecode set port to prefer master */ +@@ -1332,12 +1332,12 @@ static void qca83xx_link_change_notify(s + /* Set DAC Amplitude adjustment to +6% for 100m on link running */ + if (phydev->state == PHY_RUNNING) { + if (phydev->speed == SPEED_100) +- at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, ++ at803x_debug_reg_mask(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, + QCA8327_DEBUG_MANU_CTRL_EN, + QCA8327_DEBUG_MANU_CTRL_EN); + } else { + /* Reset DAC Amplitude adjustment */ +- at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, ++ at803x_debug_reg_mask(phydev, AT803X_DEBUG_ANALOG_TEST_CTRL, + QCA8327_DEBUG_MANU_CTRL_EN, 0); + } + } +@@ -1384,7 +1384,7 @@ static int qca83xx_suspend(struct phy_de + phy_modify(phydev, MII_BMCR, mask, 0); + } + +- at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_3D, ++ at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_GREEN, + AT803X_DEBUG_GATE_CLK_IN1000, 0); + + at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_HIB_CTRL, diff --git a/target/linux/generic/backport-5.10/747-v5.16-01-dsa-qca8k-add-mac-power-sel-support.patch b/target/linux/generic/backport-5.15/747-v5.16-01-dsa-qca8k-add-mac-power-sel-support.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-01-dsa-qca8k-add-mac-power-sel-support.patch rename to target/linux/generic/backport-5.15/747-v5.16-01-dsa-qca8k-add-mac-power-sel-support.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-02-dt-bindings-net-dsa-qca8k-Add-SGMII-clock-phase-prop.patch b/target/linux/generic/backport-5.15/747-v5.16-02-dt-bindings-net-dsa-qca8k-Add-SGMII-clock-phase-prop.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-02-dt-bindings-net-dsa-qca8k-Add-SGMII-clock-phase-prop.patch rename to target/linux/generic/backport-5.15/747-v5.16-02-dt-bindings-net-dsa-qca8k-Add-SGMII-clock-phase-prop.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-03-net-dsa-qca8k-add-support-for-sgmii-falling-edge.patch b/target/linux/generic/backport-5.15/747-v5.16-03-net-dsa-qca8k-add-support-for-sgmii-falling-edge.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-03-net-dsa-qca8k-add-support-for-sgmii-falling-edge.patch rename to target/linux/generic/backport-5.15/747-v5.16-03-net-dsa-qca8k-add-support-for-sgmii-falling-edge.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-04-dt-bindings-net-dsa-qca8k-Document-support-for-CPU-p.patch b/target/linux/generic/backport-5.15/747-v5.16-04-dt-bindings-net-dsa-qca8k-Document-support-for-CPU-p.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-04-dt-bindings-net-dsa-qca8k-Document-support-for-CPU-p.patch rename to target/linux/generic/backport-5.15/747-v5.16-04-dt-bindings-net-dsa-qca8k-Document-support-for-CPU-p.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-05-net-dsa-qca8k-add-support-for-cpu-port-6.patch b/target/linux/generic/backport-5.15/747-v5.16-05-net-dsa-qca8k-add-support-for-cpu-port-6.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-05-net-dsa-qca8k-add-support-for-cpu-port-6.patch rename to target/linux/generic/backport-5.15/747-v5.16-05-net-dsa-qca8k-add-support-for-cpu-port-6.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-06-net-dsa-qca8k-rework-rgmii-delay-logic-and-scan-for-.patch b/target/linux/generic/backport-5.15/747-v5.16-06-net-dsa-qca8k-rework-rgmii-delay-logic-and-scan-for-.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-06-net-dsa-qca8k-rework-rgmii-delay-logic-and-scan-for-.patch rename to target/linux/generic/backport-5.15/747-v5.16-06-net-dsa-qca8k-rework-rgmii-delay-logic-and-scan-for-.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-07-dt-bindings-net-dsa-qca8k-Document-qca-sgmii-enable-.patch b/target/linux/generic/backport-5.15/747-v5.16-07-dt-bindings-net-dsa-qca8k-Document-qca-sgmii-enable-.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-07-dt-bindings-net-dsa-qca8k-Document-qca-sgmii-enable-.patch rename to target/linux/generic/backport-5.15/747-v5.16-07-dt-bindings-net-dsa-qca8k-Document-qca-sgmii-enable-.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-08-net-dsa-qca8k-add-explicit-SGMII-PLL-enable.patch b/target/linux/generic/backport-5.15/747-v5.16-08-net-dsa-qca8k-add-explicit-SGMII-PLL-enable.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-08-net-dsa-qca8k-add-explicit-SGMII-PLL-enable.patch rename to target/linux/generic/backport-5.15/747-v5.16-08-net-dsa-qca8k-add-explicit-SGMII-PLL-enable.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-09-dt-bindings-net-dsa-qca8k-Document-qca-led-open-drai.patch b/target/linux/generic/backport-5.15/747-v5.16-09-dt-bindings-net-dsa-qca8k-Document-qca-led-open-drai.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-09-dt-bindings-net-dsa-qca8k-Document-qca-led-open-drai.patch rename to target/linux/generic/backport-5.15/747-v5.16-09-dt-bindings-net-dsa-qca8k-Document-qca-led-open-drai.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-10-net-dsa-qca8k-add-support-for-pws-config-reg.patch b/target/linux/generic/backport-5.15/747-v5.16-10-net-dsa-qca8k-add-support-for-pws-config-reg.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-10-net-dsa-qca8k-add-support-for-pws-config-reg.patch rename to target/linux/generic/backport-5.15/747-v5.16-10-net-dsa-qca8k-add-support-for-pws-config-reg.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-11-dt-bindings-net-dsa-qca8k-document-support-for-qca83.patch b/target/linux/generic/backport-5.15/747-v5.16-11-dt-bindings-net-dsa-qca8k-document-support-for-qca83.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-11-dt-bindings-net-dsa-qca8k-document-support-for-qca83.patch rename to target/linux/generic/backport-5.15/747-v5.16-11-dt-bindings-net-dsa-qca8k-document-support-for-qca83.patch diff --git a/target/linux/generic/backport-5.15/747-v5.16-12-net-dsa-qca8k-add-support-for-QCA8328.patch b/target/linux/generic/backport-5.15/747-v5.16-12-net-dsa-qca8k-add-support-for-QCA8328.patch new file mode 100644 index 0000000000..b300621e63 --- /dev/null +++ b/target/linux/generic/backport-5.15/747-v5.16-12-net-dsa-qca8k-add-support-for-QCA8328.patch @@ -0,0 +1,78 @@ +From f477d1c8bdbef4f400718238e350f16f521d2a3e Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Thu, 14 Oct 2021 00:39:17 +0200 +Subject: net: dsa: qca8k: add support for QCA8328 + +QCA8328 switch is the bigger brother of the qca8327. Same regs different +chip. Change the function to set the correct pin layout and introduce a +new match_data to differentiate the 2 switch as they have the same ID +and their internal PHY have the same ID. + +Signed-off-by: Ansuel Smith +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 19 ++++++++++++++++--- + drivers/net/dsa/qca8k.h | 1 + + 2 files changed, 17 insertions(+), 3 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -935,6 +935,7 @@ static int + qca8k_setup_of_pws_reg(struct qca8k_priv *priv) + { + struct device_node *node = priv->dev->of_node; ++ const struct qca8k_match_data *data; + u32 val = 0; + int ret; + +@@ -943,8 +944,14 @@ qca8k_setup_of_pws_reg(struct qca8k_priv + * Should be applied by default but we set this just to make sure. + */ + if (priv->switch_id == QCA8K_ID_QCA8327) { ++ data = of_device_get_match_data(priv->dev); ++ ++ /* Set the correct package of 148 pin for QCA8327 */ ++ if (data->reduced_package) ++ val |= QCA8327_PWS_PACKAGE148_EN; ++ + ret = qca8k_rmw(priv, QCA8K_REG_PWS, QCA8327_PWS_PACKAGE148_EN, +- QCA8327_PWS_PACKAGE148_EN); ++ val); + if (ret) + return ret; + } +@@ -2124,7 +2131,12 @@ static int qca8k_resume(struct device *d + static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, + qca8k_suspend, qca8k_resume); + +-static const struct qca8k_match_data qca832x = { ++static const struct qca8k_match_data qca8327 = { ++ .id = QCA8K_ID_QCA8327, ++ .reduced_package = true, ++}; ++ ++static const struct qca8k_match_data qca8328 = { + .id = QCA8K_ID_QCA8327, + }; + +@@ -2133,7 +2145,8 @@ static const struct qca8k_match_data qca + }; + + static const struct of_device_id qca8k_of_match[] = { +- { .compatible = "qca,qca8327", .data = &qca832x }, ++ { .compatible = "qca,qca8327", .data = &qca8327 }, ++ { .compatible = "qca,qca8328", .data = &qca8328 }, + { .compatible = "qca,qca8334", .data = &qca833x }, + { .compatible = "qca,qca8337", .data = &qca833x }, + { /* sentinel */ }, +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -260,6 +260,7 @@ struct ar8xxx_port_status { + + struct qca8k_match_data { + u8 id; ++ bool reduced_package; + }; + + enum { diff --git a/target/linux/generic/backport-5.10/747-v5.16-13-net-dsa-qca8k-set-internal-delay-also-for-sgmii.patch b/target/linux/generic/backport-5.15/747-v5.16-13-net-dsa-qca8k-set-internal-delay-also-for-sgmii.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-13-net-dsa-qca8k-set-internal-delay-also-for-sgmii.patch rename to target/linux/generic/backport-5.15/747-v5.16-13-net-dsa-qca8k-set-internal-delay-also-for-sgmii.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-14-net-dsa-qca8k-move-port-config-to-dedicated-struct.patch b/target/linux/generic/backport-5.15/747-v5.16-14-net-dsa-qca8k-move-port-config-to-dedicated-struct.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-14-net-dsa-qca8k-move-port-config-to-dedicated-struct.patch rename to target/linux/generic/backport-5.15/747-v5.16-14-net-dsa-qca8k-move-port-config-to-dedicated-struct.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-15-dt-bindings-net-ipq8064-mdio-fix-warning-with-new-qc.patch b/target/linux/generic/backport-5.15/747-v5.16-15-dt-bindings-net-ipq8064-mdio-fix-warning-with-new-qc.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-15-dt-bindings-net-ipq8064-mdio-fix-warning-with-new-qc.patch rename to target/linux/generic/backport-5.15/747-v5.16-15-dt-bindings-net-ipq8064-mdio-fix-warning-with-new-qc.patch diff --git a/target/linux/generic/backport-5.10/747-v5.16-16-dt-bindings-net-dsa-qca8k-convert-to-YAML-schema.patch b/target/linux/generic/backport-5.15/747-v5.16-16-dt-bindings-net-dsa-qca8k-convert-to-YAML-schema.patch similarity index 100% rename from target/linux/generic/backport-5.10/747-v5.16-16-dt-bindings-net-dsa-qca8k-convert-to-YAML-schema.patch rename to target/linux/generic/backport-5.15/747-v5.16-16-dt-bindings-net-dsa-qca8k-convert-to-YAML-schema.patch diff --git a/target/linux/generic/backport-5.10/748-v5.16-net-dsa-qca8k-fix-delay-applied-to-wrong-cpu-in-parse-p.patch b/target/linux/generic/backport-5.15/748-v5.16-net-dsa-qca8k-fix-delay-applied-to-wrong-cpu-in-parse-p.patch similarity index 100% rename from target/linux/generic/backport-5.10/748-v5.16-net-dsa-qca8k-fix-delay-applied-to-wrong-cpu-in-parse-p.patch rename to target/linux/generic/backport-5.15/748-v5.16-net-dsa-qca8k-fix-delay-applied-to-wrong-cpu-in-parse-p.patch diff --git a/target/linux/generic/backport-5.10/749-v5.16-net-dsa-qca8k-tidy-for-loop-in-setup-and-add-cpu-port-c.patch b/target/linux/generic/backport-5.15/749-v5.16-net-dsa-qca8k-tidy-for-loop-in-setup-and-add-cpu-port-c.patch similarity index 100% rename from target/linux/generic/backport-5.10/749-v5.16-net-dsa-qca8k-tidy-for-loop-in-setup-and-add-cpu-port-c.patch rename to target/linux/generic/backport-5.15/749-v5.16-net-dsa-qca8k-tidy-for-loop-in-setup-and-add-cpu-port-c.patch diff --git a/target/linux/generic/backport-5.10/750-v5.16-net-dsa-qca8k-make-sure-pad0-mac06-exchange-is-disabled.patch b/target/linux/generic/backport-5.15/750-v5.16-net-dsa-qca8k-make-sure-pad0-mac06-exchange-is-disabled.patch similarity index 100% rename from target/linux/generic/backport-5.10/750-v5.16-net-dsa-qca8k-make-sure-pad0-mac06-exchange-is-disabled.patch rename to target/linux/generic/backport-5.15/750-v5.16-net-dsa-qca8k-make-sure-pad0-mac06-exchange-is-disabled.patch diff --git a/target/linux/generic/backport-5.15/750-v6.5-01-net-ethernet-mtk_ppe-add-MTK_FOE_ENTRY_V-1-2-_SIZE-m.patch b/target/linux/generic/backport-5.15/750-v6.5-01-net-ethernet-mtk_ppe-add-MTK_FOE_ENTRY_V-1-2-_SIZE-m.patch new file mode 100644 index 0000000000..ad63dd6196 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-01-net-ethernet-mtk_ppe-add-MTK_FOE_ENTRY_V-1-2-_SIZE-m.patch @@ -0,0 +1,78 @@ +From 5ea0e1312bcfebc06b5f91d1bb82b823d6395125 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Wed, 19 Jul 2023 12:29:49 +0200 +Subject: [PATCH 095/250] net: ethernet: mtk_ppe: add MTK_FOE_ENTRY_V{1,2}_SIZE + macros + +Introduce MTK_FOE_ENTRY_V{1,2}_SIZE macros in order to make more +explicit foe_entry size for different chipset revisions. + +Signed-off-by: Lorenzo Bianconi +Reviewed-by: Simon Horman +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 10 +++++----- + drivers/net/ethernet/mediatek/mtk_ppe.h | 3 +++ + 2 files changed, 8 insertions(+), 5 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4714,7 +4714,7 @@ static const struct mtk_soc_data mt7621_ + .required_pctl = false, + .offload_version = 1, + .hash_offset = 2, +- .foe_entry_size = sizeof(struct mtk_foe_entry) - 16, ++ .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4735,7 +4735,7 @@ static const struct mtk_soc_data mt7622_ + .offload_version = 2, + .hash_offset = 2, + .has_accounting = true, +- .foe_entry_size = sizeof(struct mtk_foe_entry) - 16, ++ .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4754,7 +4754,7 @@ static const struct mtk_soc_data mt7623_ + .required_pctl = true, + .offload_version = 1, + .hash_offset = 2, +- .foe_entry_size = sizeof(struct mtk_foe_entry) - 16, ++ .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4792,8 +4792,8 @@ static const struct mtk_soc_data mt7981_ + .required_pctl = false, + .offload_version = 2, + .hash_offset = 4, +- .foe_entry_size = sizeof(struct mtk_foe_entry), + .has_accounting = true, ++ .foe_entry_size = MTK_FOE_ENTRY_V2_SIZE, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma_v2), + .rxd_size = sizeof(struct mtk_rx_dma_v2), +@@ -4813,8 +4813,8 @@ static const struct mtk_soc_data mt7986_ + .required_pctl = false, + .offload_version = 2, + .hash_offset = 4, +- .foe_entry_size = sizeof(struct mtk_foe_entry), + .has_accounting = true, ++ .foe_entry_size = MTK_FOE_ENTRY_V2_SIZE, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma_v2), + .rxd_size = sizeof(struct mtk_rx_dma_v2), +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -216,6 +216,9 @@ struct mtk_foe_ipv6_6rd { + struct mtk_foe_mac_info l2; + }; + ++#define MTK_FOE_ENTRY_V1_SIZE 80 ++#define MTK_FOE_ENTRY_V2_SIZE 96 ++ + struct mtk_foe_entry { + u32 ib1; + diff --git a/target/linux/generic/backport-5.15/750-v6.5-02-net-ethernet-mtk_eth_soc-remove-incorrect-PLL-config.patch b/target/linux/generic/backport-5.15/750-v6.5-02-net-ethernet-mtk_eth_soc-remove-incorrect-PLL-config.patch new file mode 100644 index 0000000000..c502c4c28c --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-02-net-ethernet-mtk_eth_soc-remove-incorrect-PLL-config.patch @@ -0,0 +1,141 @@ +From 8cfa2576d79f9379d167a8994f0fca935c07a8bc Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Sat, 22 Jul 2023 21:32:49 +0100 +Subject: [PATCH 096/250] net: ethernet: mtk_eth_soc: remove incorrect PLL + configuration + +MT7623 GMAC0 attempts to configure the system clocking according to the +required speed in the .mac_config callback for non-SGMII, non-baseX and +non-TRGMII modes. + +state->speed setting has never been reliable in the .mac_config +callback - there are cases where this is not the link speed, +particularly via ethtool paths, so this has always been unreliable (as +detailed in phylink's documentation.) + +There is the additional issue that mtk_gmac0_rgmii_adjust() will only +be called if state->interface changes, which means it only configures +the system clocking on the very first .mac_config call, which will be +made when the network device is first brought up before any link is +established. + +Essentially, this code is incredibly buggy, and probably never worked. + +Moreover, checking the in-kernel DT files, it seems no platform makes +use of this code path. + +Therefore, let's remove it, and disable interface modes for port 0 that +are not SGMII, 1000base-X, 2500base-X or TRGMII on the MT7623. + +Reviewed-by: Daniel Golle +Tested-by: Daniel Golle +Tested-by: Frank Wunderlich +Signed-off-by: Russell King (Oracle) +Signed-off-by: Paolo Abeni +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 54 ++++++--------------- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 + + 2 files changed, 17 insertions(+), 38 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -309,7 +309,7 @@ static int mt7621_gmac0_rgmii_adjust(str + } + + static void mtk_gmac0_rgmii_adjust(struct mtk_eth *eth, +- phy_interface_t interface, int speed) ++ phy_interface_t interface) + { + u32 val; + int ret; +@@ -323,26 +323,7 @@ static void mtk_gmac0_rgmii_adjust(struc + return; + } + +- val = (speed == SPEED_1000) ? +- INTF_MODE_RGMII_1000 : INTF_MODE_RGMII_10_100; +- mtk_w32(eth, val, INTF_MODE); +- +- regmap_update_bits(eth->ethsys, ETHSYS_CLKCFG0, +- ETHSYS_TRGMII_CLK_SEL362_5, +- ETHSYS_TRGMII_CLK_SEL362_5); +- +- val = (speed == SPEED_1000) ? 250000000 : 500000000; +- ret = clk_set_rate(eth->clks[MTK_CLK_TRGPLL], val); +- if (ret) +- dev_err(eth->dev, "Failed to set trgmii pll: %d\n", ret); +- +- val = (speed == SPEED_1000) ? +- RCK_CTRL_RGMII_1000 : RCK_CTRL_RGMII_10_100; +- mtk_w32(eth, val, TRGMII_RCK_CTRL); +- +- val = (speed == SPEED_1000) ? +- TCK_CTRL_RGMII_1000 : TCK_CTRL_RGMII_10_100; +- mtk_w32(eth, val, TRGMII_TCK_CTRL); ++ dev_err(eth->dev, "Missing PLL configuration, ethernet may not work\n"); + } + + static struct phylink_pcs *mtk_mac_select_pcs(struct phylink_config *config, +@@ -428,17 +409,8 @@ static void mtk_mac_config(struct phylin + state->interface)) + goto err_phy; + } else { +- /* FIXME: this is incorrect. Not only does it +- * use state->speed (which is not guaranteed +- * to be correct) but it also makes use of it +- * in a code path that will only be reachable +- * when the PHY interface mode changes, not +- * when the speed changes. Consequently, RGMII +- * is probably broken. +- */ + mtk_gmac0_rgmii_adjust(mac->hw, +- state->interface, +- state->speed); ++ state->interface); + + /* mt7623_pad_clk_setup */ + for (i = 0 ; i < NUM_TRGMII_CTRL; i++) +@@ -4289,13 +4261,19 @@ static int mtk_add_mac(struct mtk_eth *e + mac->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | + MAC_10 | MAC_100 | MAC_1000 | MAC_2500FD; + +- __set_bit(PHY_INTERFACE_MODE_MII, +- mac->phylink_config.supported_interfaces); +- __set_bit(PHY_INTERFACE_MODE_GMII, +- mac->phylink_config.supported_interfaces); ++ /* MT7623 gmac0 is now missing its speed-specific PLL configuration ++ * in its .mac_config method (since state->speed is not valid there. ++ * Disable support for MII, GMII and RGMII. ++ */ ++ if (!mac->hw->soc->disable_pll_modes || mac->id != 0) { ++ __set_bit(PHY_INTERFACE_MODE_MII, ++ mac->phylink_config.supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_GMII, ++ mac->phylink_config.supported_interfaces); + +- if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_RGMII)) +- phy_interface_set_rgmii(mac->phylink_config.supported_interfaces); ++ if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_RGMII)) ++ phy_interface_set_rgmii(mac->phylink_config.supported_interfaces); ++ } + + if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_TRGMII) && !mac->id) + __set_bit(PHY_INTERFACE_MODE_TRGMII, +@@ -4755,6 +4733,7 @@ static const struct mtk_soc_data mt7623_ + .offload_version = 1, + .hash_offset = 2, + .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, ++ .disable_pll_modes = true, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1027,6 +1027,7 @@ struct mtk_soc_data { + u16 foe_entry_size; + netdev_features_t hw_features; + bool has_accounting; ++ bool disable_pll_modes; + struct { + u32 txd_size; + u32 rxd_size; diff --git a/target/linux/generic/backport-5.15/750-v6.5-03-net-ethernet-mtk_eth_soc-remove-mac_pcs_get_state-an.patch b/target/linux/generic/backport-5.15/750-v6.5-03-net-ethernet-mtk_eth_soc-remove-mac_pcs_get_state-an.patch new file mode 100644 index 0000000000..21ca0b1c08 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-03-net-ethernet-mtk_eth_soc-remove-mac_pcs_get_state-an.patch @@ -0,0 +1,81 @@ +From a4c2233b1e4359b6c64b6f9ba98c8718a11fffee Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Sat, 22 Jul 2023 21:32:54 +0100 +Subject: [PATCH 097/250] net: ethernet: mtk_eth_soc: remove mac_pcs_get_state + and modernise + +Remove the .mac_pcs_get_state function, since as far as I can tell is +never called - no DT appears to specify an in-band-status management +nor SFP support for this driver. + +Removal of this, along with the previous patch to remove the incorrect +clocking configuration, means that the driver becomes non-legacy, so +we can remove the "legacy_pre_march2020" status from this driver. + +Reviewed-by: Daniel Golle +Tested-by: Daniel Golle +Tested-by: Frank Wunderlich +Signed-off-by: Russell King (Oracle) +Signed-off-by: Paolo Abeni +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 35 --------------------- + 1 file changed, 35 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -512,38 +512,6 @@ static int mtk_mac_finish(struct phylink + return 0; + } + +-static void mtk_mac_pcs_get_state(struct phylink_config *config, +- struct phylink_link_state *state) +-{ +- struct mtk_mac *mac = container_of(config, struct mtk_mac, +- phylink_config); +- u32 pmsr = mtk_r32(mac->hw, MTK_MAC_MSR(mac->id)); +- +- state->link = (pmsr & MAC_MSR_LINK); +- state->duplex = (pmsr & MAC_MSR_DPX) >> 1; +- +- switch (pmsr & (MAC_MSR_SPEED_1000 | MAC_MSR_SPEED_100)) { +- case 0: +- state->speed = SPEED_10; +- break; +- case MAC_MSR_SPEED_100: +- state->speed = SPEED_100; +- break; +- case MAC_MSR_SPEED_1000: +- state->speed = SPEED_1000; +- break; +- default: +- state->speed = SPEED_UNKNOWN; +- break; +- } +- +- state->pause &= (MLO_PAUSE_RX | MLO_PAUSE_TX); +- if (pmsr & MAC_MSR_RX_FC) +- state->pause |= MLO_PAUSE_RX; +- if (pmsr & MAC_MSR_TX_FC) +- state->pause |= MLO_PAUSE_TX; +-} +- + static void mtk_mac_link_down(struct phylink_config *config, unsigned int mode, + phy_interface_t interface) + { +@@ -666,7 +634,6 @@ static void mtk_mac_link_up(struct phyli + static const struct phylink_mac_ops mtk_phylink_ops = { + .validate = phylink_generic_validate, + .mac_select_pcs = mtk_mac_select_pcs, +- .mac_pcs_get_state = mtk_mac_pcs_get_state, + .mac_config = mtk_mac_config, + .mac_finish = mtk_mac_finish, + .mac_link_down = mtk_mac_link_down, +@@ -4256,8 +4223,6 @@ static int mtk_add_mac(struct mtk_eth *e + + mac->phylink_config.dev = ð->netdev[id]->dev; + mac->phylink_config.type = PHYLINK_NETDEV; +- /* This driver makes use of state->speed in mac_config */ +- mac->phylink_config.legacy_pre_march2020 = true; + mac->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | + MAC_10 | MAC_100 | MAC_1000 | MAC_2500FD; + diff --git a/target/linux/generic/backport-5.15/750-v6.5-05-net-ethernet-mtk_eth_soc-add-version-in-mtk_soc_data.patch b/target/linux/generic/backport-5.15/750-v6.5-05-net-ethernet-mtk_eth_soc-add-version-in-mtk_soc_data.patch new file mode 100644 index 0000000000..d1d692002d --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-05-net-ethernet-mtk_eth_soc-add-version-in-mtk_soc_data.patch @@ -0,0 +1,550 @@ +From 5d8d05fbf804b4485646d39551ac27452e45afd3 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Tue, 25 Jul 2023 01:52:02 +0100 +Subject: [PATCH 099/250] net: ethernet: mtk_eth_soc: add version in + mtk_soc_data + +Introduce version field in mtk_soc_data data structure in order to +make mtk_eth driver easier to maintain for chipset configuration +codebase. Get rid of MTK_NETSYS_V2 bit in chip capabilities. +This is a preliminary patch to introduce support for MT7988 SoC. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/e52fae302ca135436e5cdd26d38d87be2da63055.1690246066.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 55 +++++++++++-------- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 36 +++++++----- + drivers/net/ethernet/mediatek/mtk_ppe.c | 18 +++--- + .../net/ethernet/mediatek/mtk_ppe_offload.c | 2 +- + drivers/net/ethernet/mediatek/mtk_wed.c | 4 +- + 5 files changed, 66 insertions(+), 49 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -537,7 +537,7 @@ static void mtk_set_queue_speed(struct m + FIELD_PREP(MTK_QTX_SCH_MIN_RATE_MAN, 1) | + FIELD_PREP(MTK_QTX_SCH_MIN_RATE_EXP, 4) | + MTK_QTX_SCH_LEAKY_BUCKET_SIZE; +- if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v1(eth)) + val |= MTK_QTX_SCH_LEAKY_BUCKET_EN; + + if (IS_ENABLED(CONFIG_SOC_MT7621)) { +@@ -912,7 +912,7 @@ static bool mtk_rx_get_desc(struct mtk_e + rxd->rxd1 = READ_ONCE(dma_rxd->rxd1); + rxd->rxd3 = READ_ONCE(dma_rxd->rxd3); + rxd->rxd4 = READ_ONCE(dma_rxd->rxd4); +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + rxd->rxd5 = READ_ONCE(dma_rxd->rxd5); + rxd->rxd6 = READ_ONCE(dma_rxd->rxd6); + } +@@ -970,7 +970,7 @@ static int mtk_init_fq_dma(struct mtk_et + + txd->txd3 = TX_DMA_PLEN0(MTK_QDMA_PAGE_SIZE); + txd->txd4 = 0; +- if (MTK_HAS_CAPS(soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + txd->txd5 = 0; + txd->txd6 = 0; + txd->txd7 = 0; +@@ -1159,7 +1159,7 @@ static void mtk_tx_set_dma_desc(struct n + struct mtk_mac *mac = netdev_priv(dev); + struct mtk_eth *eth = mac->hw; + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + mtk_tx_set_dma_desc_v2(dev, txd, info); + else + mtk_tx_set_dma_desc_v1(dev, txd, info); +@@ -1466,7 +1466,7 @@ static void mtk_update_rx_cpu_idx(struct + + static bool mtk_page_pool_enabled(struct mtk_eth *eth) + { +- return MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2); ++ return eth->soc->version == 2; + } + + static struct page_pool *mtk_create_page_pool(struct mtk_eth *eth, +@@ -1806,7 +1806,7 @@ static int mtk_poll_rx(struct napi_struc + break; + + /* find out which mac the packet come from. values start at 1 */ +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + mac = RX_DMA_GET_SPORT_V2(trxd.rxd5) - 1; + else if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) && + !(trxd.rxd4 & RX_DMA_SPECIAL_TAG)) +@@ -1902,7 +1902,7 @@ static int mtk_poll_rx(struct napi_struc + skb->dev = netdev; + bytes += skb->len; + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + reason = FIELD_GET(MTK_RXD5_PPE_CPU_REASON, trxd.rxd5); + hash = trxd.rxd5 & MTK_RXD5_FOE_ENTRY; + if (hash != MTK_RXD5_FOE_ENTRY) +@@ -1927,8 +1927,8 @@ static int mtk_poll_rx(struct napi_struc + /* When using VLAN untagging in combination with DSA, the + * hardware treats the MTK special tag as a VLAN and untags it. + */ +- if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) && +- (trxd.rxd2 & RX_DMA_VTAG) && netdev_uses_dsa(netdev)) { ++ if (mtk_is_netsys_v1(eth) && (trxd.rxd2 & RX_DMA_VTAG) && ++ netdev_uses_dsa(netdev)) { + unsigned int port = RX_DMA_VPID(trxd.rxd3) & GENMASK(2, 0); + + if (port < ARRAY_SIZE(eth->dsa_meta) && +@@ -2232,7 +2232,7 @@ static int mtk_tx_alloc(struct mtk_eth * + txd->txd2 = next_ptr; + txd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; + txd->txd4 = 0; +- if (MTK_HAS_CAPS(soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + txd->txd5 = 0; + txd->txd6 = 0; + txd->txd7 = 0; +@@ -2285,14 +2285,14 @@ static int mtk_tx_alloc(struct mtk_eth * + FIELD_PREP(MTK_QTX_SCH_MIN_RATE_MAN, 1) | + FIELD_PREP(MTK_QTX_SCH_MIN_RATE_EXP, 4) | + MTK_QTX_SCH_LEAKY_BUCKET_SIZE; +- if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v1(eth)) + val |= MTK_QTX_SCH_LEAKY_BUCKET_EN; + mtk_w32(eth, val, soc->reg_map->qdma.qtx_sch + ofs); + ofs += MTK_QTX_OFFSET; + } + val = MTK_QDMA_TX_SCH_MAX_WFQ | (MTK_QDMA_TX_SCH_MAX_WFQ << 16); + mtk_w32(eth, val, soc->reg_map->qdma.tx_sch_rate); +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + mtk_w32(eth, val, soc->reg_map->qdma.tx_sch_rate + 4); + } else { + mtk_w32(eth, ring->phys_pdma, MT7628_TX_BASE_PTR0); +@@ -2419,7 +2419,7 @@ static int mtk_rx_alloc(struct mtk_eth * + + rxd->rxd3 = 0; + rxd->rxd4 = 0; +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + rxd->rxd5 = 0; + rxd->rxd6 = 0; + rxd->rxd7 = 0; +@@ -2970,7 +2970,7 @@ static int mtk_start_dma(struct mtk_eth + MTK_TX_BT_32DWORDS | MTK_NDP_CO_PRO | + MTK_RX_2B_OFFSET | MTK_TX_WB_DDONE; + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + val |= MTK_MUTLI_CNT | MTK_RESV_BUF | + MTK_WCOMP_EN | MTK_DMAD_WR_WDONE | + MTK_CHK_DDONE_EN | MTK_LEAKY_BUCKET_EN; +@@ -3114,7 +3114,7 @@ static int mtk_open(struct net_device *d + phylink_start(mac->phylink); + netif_tx_start_all_queues(dev); + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + return 0; + + if (mtk_uses_dsa(dev) && !eth->prog) { +@@ -3379,7 +3379,7 @@ static void mtk_hw_reset(struct mtk_eth + { + u32 val; + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, 0); + val = RSTCTRL_PPE0_V2; + } else { +@@ -3391,7 +3391,7 @@ static void mtk_hw_reset(struct mtk_eth + + ethsys_reset(eth, RSTCTRL_ETH | RSTCTRL_FE | val); + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, + 0x3ffffff); + } +@@ -3417,7 +3417,7 @@ static void mtk_hw_warm_reset(struct mtk + return; + } + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + rst_mask = RSTCTRL_ETH | RSTCTRL_PPE0_V2; + else + rst_mask = RSTCTRL_ETH | RSTCTRL_PPE0; +@@ -3587,7 +3587,7 @@ static int mtk_hw_init(struct mtk_eth *e + else + mtk_hw_reset(eth); + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + /* Set FE to PDMAv2 if necessary */ + val = mtk_r32(eth, MTK_FE_GLO_MISC); + mtk_w32(eth, val | BIT(4), MTK_FE_GLO_MISC); +@@ -3624,7 +3624,7 @@ static int mtk_hw_init(struct mtk_eth *e + */ + val = mtk_r32(eth, MTK_CDMQ_IG_CTRL); + mtk_w32(eth, val | MTK_CDMQ_STAG_EN, MTK_CDMQ_IG_CTRL); +- if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v1(eth)) { + val = mtk_r32(eth, MTK_CDMP_IG_CTRL); + mtk_w32(eth, val | MTK_CDMP_STAG_EN, MTK_CDMP_IG_CTRL); + +@@ -3646,7 +3646,7 @@ static int mtk_hw_init(struct mtk_eth *e + mtk_w32(eth, eth->soc->txrx.rx_irq_done_mask, reg_map->qdma.int_grp + 4); + mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP); + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + /* PSE should not drop port8 and port9 packets from WDMA Tx */ + mtk_w32(eth, 0x00000300, PSE_DROP_CFG); + +@@ -4435,7 +4435,7 @@ static int mtk_probe(struct platform_dev + } + } + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + err = -EINVAL; +@@ -4543,9 +4543,8 @@ static int mtk_probe(struct platform_dev + } + + if (eth->soc->offload_version) { +- u32 num_ppe; ++ u32 num_ppe = mtk_is_netsys_v2_or_greater(eth) ? 2 : 1; + +- num_ppe = MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) ? 2 : 1; + num_ppe = min_t(u32, ARRAY_SIZE(eth->ppe), num_ppe); + for (i = 0; i < num_ppe; i++) { + u32 ppe_addr = eth->soc->reg_map->ppe_base + i * 0x400; +@@ -4639,6 +4638,7 @@ static const struct mtk_soc_data mt2701_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7623_CLKS_BITMAP, + .required_pctl = true, ++ .version = 1, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4655,6 +4655,7 @@ static const struct mtk_soc_data mt7621_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7621_CLKS_BITMAP, + .required_pctl = false, ++ .version = 1, + .offload_version = 1, + .hash_offset = 2, + .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, +@@ -4675,6 +4676,7 @@ static const struct mtk_soc_data mt7622_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7622_CLKS_BITMAP, + .required_pctl = false, ++ .version = 1, + .offload_version = 2, + .hash_offset = 2, + .has_accounting = true, +@@ -4695,6 +4697,7 @@ static const struct mtk_soc_data mt7623_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7623_CLKS_BITMAP, + .required_pctl = true, ++ .version = 1, + .offload_version = 1, + .hash_offset = 2, + .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, +@@ -4717,6 +4720,7 @@ static const struct mtk_soc_data mt7629_ + .required_clks = MT7629_CLKS_BITMAP, + .required_pctl = false, + .has_accounting = true, ++ .version = 1, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +@@ -4734,6 +4738,7 @@ static const struct mtk_soc_data mt7981_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7981_CLKS_BITMAP, + .required_pctl = false, ++ .version = 2, + .offload_version = 2, + .hash_offset = 4, + .has_accounting = true, +@@ -4755,6 +4760,7 @@ static const struct mtk_soc_data mt7986_ + .hw_features = MTK_HW_FEATURES, + .required_clks = MT7986_CLKS_BITMAP, + .required_pctl = false, ++ .version = 2, + .offload_version = 2, + .hash_offset = 4, + .has_accounting = true, +@@ -4775,6 +4781,7 @@ static const struct mtk_soc_data rt5350_ + .hw_features = MTK_HW_FEATURES_MT7628, + .required_clks = MT7628_CLKS_BITMAP, + .required_pctl = false, ++ .version = 1, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -817,7 +817,6 @@ enum mkt_eth_capabilities { + MTK_SHARED_INT_BIT, + MTK_TRGMII_MT7621_CLK_BIT, + MTK_QDMA_BIT, +- MTK_NETSYS_V2_BIT, + MTK_SOC_MT7628_BIT, + MTK_RSTCTRL_PPE1_BIT, + MTK_U3_COPHY_V2_BIT, +@@ -852,7 +851,6 @@ enum mkt_eth_capabilities { + #define MTK_SHARED_INT BIT(MTK_SHARED_INT_BIT) + #define MTK_TRGMII_MT7621_CLK BIT(MTK_TRGMII_MT7621_CLK_BIT) + #define MTK_QDMA BIT(MTK_QDMA_BIT) +-#define MTK_NETSYS_V2 BIT(MTK_NETSYS_V2_BIT) + #define MTK_SOC_MT7628 BIT(MTK_SOC_MT7628_BIT) + #define MTK_RSTCTRL_PPE1 BIT(MTK_RSTCTRL_PPE1_BIT) + #define MTK_U3_COPHY_V2 BIT(MTK_U3_COPHY_V2_BIT) +@@ -931,11 +929,11 @@ enum mkt_eth_capabilities { + #define MT7981_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | MTK_GMAC2_GEPHY | \ + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ + MTK_MUX_U3_GMAC2_TO_QPHY | MTK_U3_COPHY_V2 | \ +- MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1) ++ MTK_RSTCTRL_PPE1) + + #define MT7986_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \ + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ +- MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1) ++ MTK_RSTCTRL_PPE1) + + struct mtk_tx_dma_desc_info { + dma_addr_t addr; +@@ -1006,6 +1004,7 @@ struct mtk_reg_map { + * @required_pctl A bool value to show whether the SoC requires + * the extra setup for those pins used by GMAC. + * @hash_offset Flow table hash offset. ++ * @version SoC version. + * @foe_entry_size Foe table entry size. + * @has_accounting Bool indicating support for accounting of + * offloaded flows. +@@ -1024,6 +1023,7 @@ struct mtk_soc_data { + bool required_pctl; + u8 offload_version; + u8 hash_offset; ++ u8 version; + u16 foe_entry_size; + netdev_features_t hw_features; + bool has_accounting; +@@ -1180,6 +1180,16 @@ struct mtk_mac { + /* the struct describing the SoC. these are declared in the soc_xyz.c files */ + extern const struct of_device_id of_mtk_match[]; + ++static inline bool mtk_is_netsys_v1(struct mtk_eth *eth) ++{ ++ return eth->soc->version == 1; ++} ++ ++static inline bool mtk_is_netsys_v2_or_greater(struct mtk_eth *eth) ++{ ++ return eth->soc->version > 1; ++} ++ + static inline struct mtk_foe_entry * + mtk_foe_get_entry(struct mtk_ppe *ppe, u16 hash) + { +@@ -1190,7 +1200,7 @@ mtk_foe_get_entry(struct mtk_ppe *ppe, u + + static inline u32 mtk_get_ib1_ts_mask(struct mtk_eth *eth) + { +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + return MTK_FOE_IB1_BIND_TIMESTAMP_V2; + + return MTK_FOE_IB1_BIND_TIMESTAMP; +@@ -1198,7 +1208,7 @@ static inline u32 mtk_get_ib1_ts_mask(st + + static inline u32 mtk_get_ib1_ppoe_mask(struct mtk_eth *eth) + { +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + return MTK_FOE_IB1_BIND_PPPOE_V2; + + return MTK_FOE_IB1_BIND_PPPOE; +@@ -1206,7 +1216,7 @@ static inline u32 mtk_get_ib1_ppoe_mask( + + static inline u32 mtk_get_ib1_vlan_tag_mask(struct mtk_eth *eth) + { +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + return MTK_FOE_IB1_BIND_VLAN_TAG_V2; + + return MTK_FOE_IB1_BIND_VLAN_TAG; +@@ -1214,7 +1224,7 @@ static inline u32 mtk_get_ib1_vlan_tag_m + + static inline u32 mtk_get_ib1_vlan_layer_mask(struct mtk_eth *eth) + { +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + return MTK_FOE_IB1_BIND_VLAN_LAYER_V2; + + return MTK_FOE_IB1_BIND_VLAN_LAYER; +@@ -1222,7 +1232,7 @@ static inline u32 mtk_get_ib1_vlan_layer + + static inline u32 mtk_prep_ib1_vlan_layer(struct mtk_eth *eth, u32 val) + { +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + return FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER_V2, val); + + return FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, val); +@@ -1230,7 +1240,7 @@ static inline u32 mtk_prep_ib1_vlan_laye + + static inline u32 mtk_get_ib1_vlan_layer(struct mtk_eth *eth, u32 val) + { +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + return FIELD_GET(MTK_FOE_IB1_BIND_VLAN_LAYER_V2, val); + + return FIELD_GET(MTK_FOE_IB1_BIND_VLAN_LAYER, val); +@@ -1238,7 +1248,7 @@ static inline u32 mtk_get_ib1_vlan_layer + + static inline u32 mtk_get_ib1_pkt_type_mask(struct mtk_eth *eth) + { +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + return MTK_FOE_IB1_PACKET_TYPE_V2; + + return MTK_FOE_IB1_PACKET_TYPE; +@@ -1246,7 +1256,7 @@ static inline u32 mtk_get_ib1_pkt_type_m + + static inline u32 mtk_get_ib1_pkt_type(struct mtk_eth *eth, u32 val) + { +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + return FIELD_GET(MTK_FOE_IB1_PACKET_TYPE_V2, val); + + return FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, val); +@@ -1254,7 +1264,7 @@ static inline u32 mtk_get_ib1_pkt_type(s + + static inline u32 mtk_get_ib2_multicast_mask(struct mtk_eth *eth) + { +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + return MTK_FOE_IB2_MULTICAST_V2; + + return MTK_FOE_IB2_MULTICAST; +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -207,7 +207,7 @@ int mtk_foe_entry_prepare(struct mtk_eth + + memset(entry, 0, sizeof(*entry)); + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + val = FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND) | + FIELD_PREP(MTK_FOE_IB1_PACKET_TYPE_V2, type) | + FIELD_PREP(MTK_FOE_IB1_UDP, l4proto == IPPROTO_UDP) | +@@ -271,7 +271,7 @@ int mtk_foe_entry_set_pse_port(struct mt + u32 *ib2 = mtk_foe_entry_ib2(eth, entry); + u32 val = *ib2; + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + val &= ~MTK_FOE_IB2_DEST_PORT_V2; + val |= FIELD_PREP(MTK_FOE_IB2_DEST_PORT_V2, port); + } else { +@@ -422,7 +422,7 @@ int mtk_foe_entry_set_wdma(struct mtk_et + struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(eth, entry); + u32 *ib2 = mtk_foe_entry_ib2(eth, entry); + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + *ib2 &= ~MTK_FOE_IB2_PORT_MG_V2; + *ib2 |= FIELD_PREP(MTK_FOE_IB2_RX_IDX, txq) | + MTK_FOE_IB2_WDMA_WINFO_V2; +@@ -452,7 +452,7 @@ int mtk_foe_entry_set_queue(struct mtk_e + { + u32 *ib2 = mtk_foe_entry_ib2(eth, entry); + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + *ib2 &= ~MTK_FOE_IB2_QID_V2; + *ib2 |= FIELD_PREP(MTK_FOE_IB2_QID_V2, queue); + *ib2 |= MTK_FOE_IB2_PSE_QOS_V2; +@@ -607,7 +607,7 @@ __mtk_foe_entry_commit(struct mtk_ppe *p + struct mtk_foe_entry *hwe; + u32 val; + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP_V2; + entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_TIMESTAMP_V2, + timestamp); +@@ -623,7 +623,7 @@ __mtk_foe_entry_commit(struct mtk_ppe *p + hwe->ib1 = entry->ib1; + + if (ppe->accounting) { +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + val = MTK_FOE_IB2_MIB_CNT_V2; + else + val = MTK_FOE_IB2_MIB_CNT; +@@ -971,7 +971,7 @@ void mtk_ppe_start(struct mtk_ppe *ppe) + MTK_PPE_SCAN_MODE_KEEPALIVE_AGE) | + FIELD_PREP(MTK_PPE_TB_CFG_ENTRY_NUM, + MTK_PPE_ENTRIES_SHIFT); +- if (MTK_HAS_CAPS(ppe->eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(ppe->eth)) + val |= MTK_PPE_TB_CFG_INFO_SEL; + ppe_w32(ppe, MTK_PPE_TB_CFG, val); + +@@ -987,7 +987,7 @@ void mtk_ppe_start(struct mtk_ppe *ppe) + MTK_PPE_FLOW_CFG_IP4_NAPT | + MTK_PPE_FLOW_CFG_IP4_DSLITE | + MTK_PPE_FLOW_CFG_IP4_NAT_FRAG; +- if (MTK_HAS_CAPS(ppe->eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(ppe->eth)) + val |= MTK_PPE_MD_TOAP_BYP_CRSN0 | + MTK_PPE_MD_TOAP_BYP_CRSN1 | + MTK_PPE_MD_TOAP_BYP_CRSN2 | +@@ -1029,7 +1029,7 @@ void mtk_ppe_start(struct mtk_ppe *ppe) + + ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT, 0); + +- if (MTK_HAS_CAPS(ppe->eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(ppe->eth)) { + ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT1, 0xcb777); + ppe_w32(ppe, MTK_PPE_SBW_CTRL, 0x7f); + } +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -193,7 +193,7 @@ mtk_flow_set_output_device(struct mtk_et + if (mtk_flow_get_wdma_info(dev, dest_mac, &info) == 0) { + mtk_foe_entry_set_wdma(eth, foe, info.wdma_idx, info.queue, + info.bss, info.wcid); +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) { + switch (info.wdma_idx) { + case 0: + pse_port = 8; +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -1091,7 +1091,7 @@ mtk_wed_rx_reset(struct mtk_wed_device * + } else { + struct mtk_eth *eth = dev->hw->eth; + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) ++ if (mtk_is_netsys_v2_or_greater(eth)) + wed_set(dev, MTK_WED_RESET_IDX, + MTK_WED_RESET_IDX_RX_V2); + else +@@ -1813,7 +1813,7 @@ void mtk_wed_add_hw(struct device_node * + hw->wdma = wdma; + hw->index = index; + hw->irq = irq; +- hw->version = MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) ? 2 : 1; ++ hw->version = mtk_is_netsys_v1(eth) ? 1 : 2; + + if (hw->version == 1) { + hw->mirror = syscon_regmap_lookup_by_phandle(eth_np, diff --git a/target/linux/generic/backport-5.15/750-v6.5-06-net-ethernet-mtk_eth_soc-increase-MAX_DEVS-to-3.patch b/target/linux/generic/backport-5.15/750-v6.5-06-net-ethernet-mtk_eth_soc-increase-MAX_DEVS-to-3.patch new file mode 100644 index 0000000000..5a08b9dddf --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-06-net-ethernet-mtk_eth_soc-increase-MAX_DEVS-to-3.patch @@ -0,0 +1,29 @@ +From f8fb8dbd158c585be7574faf92db7d614b6722ff Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Tue, 25 Jul 2023 01:52:27 +0100 +Subject: [PATCH 100/250] net: ethernet: mtk_eth_soc: increase MAX_DEVS to 3 + +This is a preliminary patch to add MT7988 SoC support since it runs 3 +macs instead of 2. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/3563e5fab367e7d79a7f1296fabaa5c20f202d7a.1690246066.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1040,8 +1040,8 @@ struct mtk_soc_data { + + #define MTK_DMA_MONITOR_TIMEOUT msecs_to_jiffies(1000) + +-/* currently no SoC has more than 2 macs */ +-#define MTK_MAX_DEVS 2 ++/* currently no SoC has more than 3 macs */ ++#define MTK_MAX_DEVS 3 + + /* struct mtk_eth - This is the main datasructure for holding the state + * of the driver diff --git a/target/linux/generic/backport-5.15/750-v6.5-07-net-ethernet-mtk_eth_soc-rely-on-MTK_MAX_DEVS-and-re.patch b/target/linux/generic/backport-5.15/750-v6.5-07-net-ethernet-mtk_eth_soc-rely-on-MTK_MAX_DEVS-and-re.patch new file mode 100644 index 0000000000..281291252b --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-07-net-ethernet-mtk_eth_soc-rely-on-MTK_MAX_DEVS-and-re.patch @@ -0,0 +1,186 @@ +From 856be974290f28d7943be2ac5a382c4139486196 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Tue, 25 Jul 2023 01:52:44 +0100 +Subject: [PATCH 101/250] net: ethernet: mtk_eth_soc: rely on MTK_MAX_DEVS and + remove MTK_MAC_COUNT + +Get rid of MTK_MAC_COUNT since it is a duplicated of MTK_MAX_DEVS. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/1856f4266f2fc80677807b1bad867659e7b00c65.1690246066.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 49 ++++++++++++--------- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 - + 2 files changed, 27 insertions(+), 23 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -838,7 +838,7 @@ static void mtk_stats_update(struct mtk_ + { + int i; + +- for (i = 0; i < MTK_MAC_COUNT; i++) { ++ for (i = 0; i < MTK_MAX_DEVS; i++) { + if (!eth->mac[i] || !eth->mac[i]->hw_stats) + continue; + if (spin_trylock(ð->mac[i]->hw_stats->stats_lock)) { +@@ -1341,7 +1341,7 @@ static int mtk_queue_stopped(struct mtk_ + { + int i; + +- for (i = 0; i < MTK_MAC_COUNT; i++) { ++ for (i = 0; i < MTK_MAX_DEVS; i++) { + if (!eth->netdev[i]) + continue; + if (netif_queue_stopped(eth->netdev[i])) +@@ -1355,7 +1355,7 @@ static void mtk_wake_queue(struct mtk_et + { + int i; + +- for (i = 0; i < MTK_MAC_COUNT; i++) { ++ for (i = 0; i < MTK_MAX_DEVS; i++) { + if (!eth->netdev[i]) + continue; + netif_tx_wake_all_queues(eth->netdev[i]); +@@ -1812,7 +1812,7 @@ static int mtk_poll_rx(struct napi_struc + !(trxd.rxd4 & RX_DMA_SPECIAL_TAG)) + mac = RX_DMA_GET_SPORT(trxd.rxd4) - 1; + +- if (unlikely(mac < 0 || mac >= MTK_MAC_COUNT || ++ if (unlikely(mac < 0 || mac >= MTK_MAX_DEVS || + !eth->netdev[mac])) + goto release_desc; + +@@ -2844,7 +2844,7 @@ static void mtk_dma_free(struct mtk_eth + const struct mtk_soc_data *soc = eth->soc; + int i; + +- for (i = 0; i < MTK_MAC_COUNT; i++) ++ for (i = 0; i < MTK_MAX_DEVS; i++) + if (eth->netdev[i]) + netdev_reset_queue(eth->netdev[i]); + if (eth->scratch_ring) { +@@ -2998,8 +2998,13 @@ static void mtk_gdm_config(struct mtk_et + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) + return; + +- for (i = 0; i < MTK_MAC_COUNT; i++) { +- u32 val = mtk_r32(eth, MTK_GDMA_FWD_CFG(i)); ++ for (i = 0; i < MTK_MAX_DEVS; i++) { ++ u32 val; ++ ++ if (!eth->netdev[i]) ++ continue; ++ ++ val = mtk_r32(eth, MTK_GDMA_FWD_CFG(i)); + + /* default setup the forward port to send frame to PDMA */ + val &= ~0xffff; +@@ -3009,7 +3014,7 @@ static void mtk_gdm_config(struct mtk_et + + val |= config; + +- if (eth->netdev[i] && netdev_uses_dsa(eth->netdev[i])) ++ if (netdev_uses_dsa(eth->netdev[i])) + val |= MTK_GDMA_SPECIAL_TAG; + + mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i)); +@@ -3608,15 +3613,15 @@ static int mtk_hw_init(struct mtk_eth *e + * up with the more appropriate value when mtk_mac_config call is being + * invoked. + */ +- for (i = 0; i < MTK_MAC_COUNT; i++) { ++ for (i = 0; i < MTK_MAX_DEVS; i++) { + struct net_device *dev = eth->netdev[i]; + +- mtk_w32(eth, MAC_MCR_FORCE_LINK_DOWN, MTK_MAC_MCR(i)); +- if (dev) { +- struct mtk_mac *mac = netdev_priv(dev); ++ if (!dev) ++ continue; + +- mtk_set_mcr_max_rx(mac, dev->mtu + MTK_RX_ETH_HLEN); +- } ++ mtk_w32(eth, MAC_MCR_FORCE_LINK_DOWN, MTK_MAC_MCR(i)); ++ mtk_set_mcr_max_rx(netdev_priv(dev), ++ dev->mtu + MTK_RX_ETH_HLEN); + } + + /* Indicates CDM to parse the MTK special tag from CPU +@@ -3796,7 +3801,7 @@ static void mtk_pending_work(struct work + mtk_prepare_for_reset(eth); + + /* stop all devices to make sure that dma is properly shut down */ +- for (i = 0; i < MTK_MAC_COUNT; i++) { ++ for (i = 0; i < MTK_MAX_DEVS; i++) { + if (!eth->netdev[i] || !netif_running(eth->netdev[i])) + continue; + +@@ -3812,8 +3817,8 @@ static void mtk_pending_work(struct work + mtk_hw_init(eth, true); + + /* restart DMA and enable IRQs */ +- for (i = 0; i < MTK_MAC_COUNT; i++) { +- if (!test_bit(i, &restart)) ++ for (i = 0; i < MTK_MAX_DEVS; i++) { ++ if (!eth->netdev[i] || !test_bit(i, &restart)) + continue; + + if (mtk_open(eth->netdev[i])) { +@@ -3840,7 +3845,7 @@ static int mtk_free_dev(struct mtk_eth * + { + int i; + +- for (i = 0; i < MTK_MAC_COUNT; i++) { ++ for (i = 0; i < MTK_MAX_DEVS; i++) { + if (!eth->netdev[i]) + continue; + free_netdev(eth->netdev[i]); +@@ -3859,7 +3864,7 @@ static int mtk_unreg_dev(struct mtk_eth + { + int i; + +- for (i = 0; i < MTK_MAC_COUNT; i++) { ++ for (i = 0; i < MTK_MAX_DEVS; i++) { + struct mtk_mac *mac; + if (!eth->netdev[i]) + continue; +@@ -4160,7 +4165,7 @@ static int mtk_add_mac(struct mtk_eth *e + } + + id = be32_to_cpup(_id); +- if (id >= MTK_MAC_COUNT) { ++ if (id >= MTK_MAX_DEVS) { + dev_err(eth->dev, "%d is not a valid mac id\n", id); + return -EINVAL; + } +@@ -4305,7 +4310,7 @@ void mtk_eth_set_dma_device(struct mtk_e + + rtnl_lock(); + +- for (i = 0; i < MTK_MAC_COUNT; i++) { ++ for (i = 0; i < MTK_MAX_DEVS; i++) { + dev = eth->netdev[i]; + + if (!dev || !(dev->flags & IFF_UP)) +@@ -4613,7 +4618,7 @@ static int mtk_remove(struct platform_de + int i; + + /* stop all devices to make sure that dma is properly shut down */ +- for (i = 0; i < MTK_MAC_COUNT; i++) { ++ for (i = 0; i < MTK_MAX_DEVS; i++) { + if (!eth->netdev[i]) + continue; + mtk_stop(eth->netdev[i]); +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -33,7 +33,6 @@ + #define MTK_TX_DMA_BUF_LEN_V2 0xffff + #define MTK_QDMA_RING_SIZE 2048 + #define MTK_DMA_SIZE 512 +-#define MTK_MAC_COUNT 2 + #define MTK_RX_ETH_HLEN (VLAN_ETH_HLEN + ETH_FCS_LEN) + #define MTK_RX_HLEN (NET_SKB_PAD + MTK_RX_ETH_HLEN + NET_IP_ALIGN) + #define MTK_DMA_DUMMY_DESC 0xffffffff diff --git a/target/linux/generic/backport-5.15/750-v6.5-08-net-ethernet-mtk_eth_soc-add-NETSYS_V3-version-suppo.patch b/target/linux/generic/backport-5.15/750-v6.5-08-net-ethernet-mtk_eth_soc-add-NETSYS_V3-version-suppo.patch new file mode 100644 index 0000000000..abfda59339 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-08-net-ethernet-mtk_eth_soc-add-NETSYS_V3-version-suppo.patch @@ -0,0 +1,307 @@ +From a41d535855976838d246c079143c948dcf0f7931 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Tue, 25 Jul 2023 01:52:59 +0100 +Subject: [PATCH 102/250] net: ethernet: mtk_eth_soc: add NETSYS_V3 version + support + +Introduce NETSYS_V3 chipset version support. +This is a preliminary patch to introduce support for MT7988 SoC. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/0db2260910755d76fa48e303b9f9bdf4e5a82340.1690246066.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 105 ++++++++++++++------ + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 48 +++++++-- + 2 files changed, 116 insertions(+), 37 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -818,17 +818,32 @@ void mtk_stats_update_mac(struct mtk_mac + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x20 + offs); + hw_stats->rx_flow_control_packets += + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x24 + offs); +- hw_stats->tx_skip += +- mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x28 + offs); +- hw_stats->tx_collisions += +- mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x2c + offs); +- hw_stats->tx_bytes += +- mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x30 + offs); +- stats = mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x34 + offs); +- if (stats) +- hw_stats->tx_bytes += (stats << 32); +- hw_stats->tx_packets += +- mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x38 + offs); ++ ++ if (mtk_is_netsys_v3_or_greater(eth)) { ++ hw_stats->tx_skip += ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x50 + offs); ++ hw_stats->tx_collisions += ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x54 + offs); ++ hw_stats->tx_bytes += ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x40 + offs); ++ stats = mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x44 + offs); ++ if (stats) ++ hw_stats->tx_bytes += (stats << 32); ++ hw_stats->tx_packets += ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x48 + offs); ++ } else { ++ hw_stats->tx_skip += ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x28 + offs); ++ hw_stats->tx_collisions += ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x2c + offs); ++ hw_stats->tx_bytes += ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x30 + offs); ++ stats = mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x34 + offs); ++ if (stats) ++ hw_stats->tx_bytes += (stats << 32); ++ hw_stats->tx_packets += ++ mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x38 + offs); ++ } + } + + u64_stats_update_end(&hw_stats->syncp); +@@ -1130,7 +1145,10 @@ static void mtk_tx_set_dma_desc_v2(struc + data |= TX_DMA_LS0; + WRITE_ONCE(desc->txd3, data); + +- data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */ ++ if (mac->id == MTK_GMAC3_ID) ++ data = PSE_GDM3_PORT; ++ else ++ data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */ + data |= TX_DMA_SWC_V2 | QID_BITS_V2(info->qid); + WRITE_ONCE(desc->txd4, data); + +@@ -1141,6 +1159,8 @@ static void mtk_tx_set_dma_desc_v2(struc + /* tx checksum offload */ + if (info->csum) + data |= TX_DMA_CHKSUM_V2; ++ if (mtk_is_netsys_v3_or_greater(eth) && netdev_uses_dsa(dev)) ++ data |= TX_DMA_SPTAG_V3; + } + WRITE_ONCE(desc->txd5, data); + +@@ -1206,8 +1226,7 @@ static int mtk_tx_map(struct sk_buff *sk + mtk_tx_set_dma_desc(dev, itxd, &txd_info); + + itx_buf->flags |= MTK_TX_FLAGS_SINGLE0; +- itx_buf->flags |= (!mac->id) ? MTK_TX_FLAGS_FPORT0 : +- MTK_TX_FLAGS_FPORT1; ++ itx_buf->mac_id = mac->id; + setup_tx_buf(eth, itx_buf, itxd_pdma, txd_info.addr, txd_info.size, + k++); + +@@ -1255,8 +1274,7 @@ static int mtk_tx_map(struct sk_buff *sk + memset(tx_buf, 0, sizeof(*tx_buf)); + tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; + tx_buf->flags |= MTK_TX_FLAGS_PAGE0; +- tx_buf->flags |= (!mac->id) ? MTK_TX_FLAGS_FPORT0 : +- MTK_TX_FLAGS_FPORT1; ++ tx_buf->mac_id = mac->id; + + setup_tx_buf(eth, tx_buf, txd_pdma, txd_info.addr, + txd_info.size, k++); +@@ -1558,7 +1576,7 @@ static int mtk_xdp_frame_map(struct mtk_ + } + mtk_tx_set_dma_desc(dev, txd, txd_info); + +- tx_buf->flags |= !mac->id ? MTK_TX_FLAGS_FPORT0 : MTK_TX_FLAGS_FPORT1; ++ tx_buf->mac_id = mac->id; + tx_buf->type = dma_map ? MTK_TYPE_XDP_NDO : MTK_TYPE_XDP_TX; + tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; + +@@ -1806,11 +1824,24 @@ static int mtk_poll_rx(struct napi_struc + break; + + /* find out which mac the packet come from. values start at 1 */ +- if (mtk_is_netsys_v2_or_greater(eth)) +- mac = RX_DMA_GET_SPORT_V2(trxd.rxd5) - 1; +- else if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) && +- !(trxd.rxd4 & RX_DMA_SPECIAL_TAG)) ++ if (mtk_is_netsys_v2_or_greater(eth)) { ++ u32 val = RX_DMA_GET_SPORT_V2(trxd.rxd5); ++ ++ switch (val) { ++ case PSE_GDM1_PORT: ++ case PSE_GDM2_PORT: ++ mac = val - 1; ++ break; ++ case PSE_GDM3_PORT: ++ mac = MTK_GMAC3_ID; ++ break; ++ default: ++ break; ++ } ++ } else if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) && ++ !(trxd.rxd4 & RX_DMA_SPECIAL_TAG)) { + mac = RX_DMA_GET_SPORT(trxd.rxd4) - 1; ++ } + + if (unlikely(mac < 0 || mac >= MTK_MAX_DEVS || + !eth->netdev[mac])) +@@ -2030,7 +2061,6 @@ static int mtk_poll_tx_qdma(struct mtk_e + + while ((cpu != dma) && budget) { + u32 next_cpu = desc->txd2; +- int mac = 0; + + desc = mtk_qdma_phys_to_virt(ring, desc->txd2); + if ((desc->txd3 & TX_DMA_OWNER_CPU) == 0) +@@ -2038,15 +2068,13 @@ static int mtk_poll_tx_qdma(struct mtk_e + + tx_buf = mtk_desc_to_tx_buf(ring, desc, + eth->soc->txrx.txd_size); +- if (tx_buf->flags & MTK_TX_FLAGS_FPORT1) +- mac = 1; +- + if (!tx_buf->data) + break; + + if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { + if (tx_buf->type == MTK_TYPE_SKB) +- mtk_poll_tx_done(eth, state, mac, tx_buf->data); ++ mtk_poll_tx_done(eth, state, tx_buf->mac_id, ++ tx_buf->data); + + budget--; + } +@@ -3651,7 +3679,24 @@ static int mtk_hw_init(struct mtk_eth *e + mtk_w32(eth, eth->soc->txrx.rx_irq_done_mask, reg_map->qdma.int_grp + 4); + mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP); + +- if (mtk_is_netsys_v2_or_greater(eth)) { ++ if (mtk_is_netsys_v3_or_greater(eth)) { ++ /* PSE should not drop port1, port8 and port9 packets */ ++ mtk_w32(eth, 0x00000302, PSE_DROP_CFG); ++ ++ /* GDM and CDM Threshold */ ++ mtk_w32(eth, 0x00000707, MTK_CDMW0_THRES); ++ mtk_w32(eth, 0x00000077, MTK_CDMW1_THRES); ++ ++ /* Disable GDM1 RX CRC stripping */ ++ mtk_m32(eth, MTK_GDMA_STRP_CRC, 0, MTK_GDMA_FWD_CFG(0)); ++ ++ /* PSE GDM3 MIB counter has incorrect hw default values, ++ * so the driver ought to read clear the values beforehand ++ * in case ethtool retrieve wrong mib values. ++ */ ++ for (i = 0; i < 0x80; i += 0x4) ++ mtk_r32(eth, reg_map->gdm1_cnt + 0x100 + i); ++ } else if (!mtk_is_netsys_v1(eth)) { + /* PSE should not drop port8 and port9 packets from WDMA Tx */ + mtk_w32(eth, 0x00000300, PSE_DROP_CFG); + +@@ -4213,7 +4258,11 @@ static int mtk_add_mac(struct mtk_eth *e + } + spin_lock_init(&mac->hw_stats->stats_lock); + u64_stats_init(&mac->hw_stats->syncp); +- mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET; ++ ++ if (mtk_is_netsys_v3_or_greater(eth)) ++ mac->hw_stats->reg_offset = id * 0x80; ++ else ++ mac->hw_stats->reg_offset = id * 0x40; + + /* phylink create */ + err = of_get_phy_mode(np, &phy_mode); +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -122,6 +122,7 @@ + #define MTK_GDMA_ICS_EN BIT(22) + #define MTK_GDMA_TCS_EN BIT(21) + #define MTK_GDMA_UCS_EN BIT(20) ++#define MTK_GDMA_STRP_CRC BIT(16) + #define MTK_GDMA_TO_PDMA 0x0 + #define MTK_GDMA_DROP_ALL 0x7777 + +@@ -287,8 +288,6 @@ + /* QDMA Interrupt grouping registers */ + #define MTK_RLS_DONE_INT BIT(0) + +-#define MTK_STAT_OFFSET 0x40 +- + /* QDMA TX NUM */ + #define QID_BITS_V2(x) (((x) & 0x3f) << 16) + #define MTK_QDMA_GMAC2_QID 8 +@@ -301,6 +300,8 @@ + #define TX_DMA_CHKSUM_V2 (0x7 << 28) + #define TX_DMA_TSO_V2 BIT(31) + ++#define TX_DMA_SPTAG_V3 BIT(27) ++ + /* QDMA V2 descriptor txd4 */ + #define TX_DMA_FPORT_SHIFT_V2 8 + #define TX_DMA_FPORT_MASK_V2 0xf +@@ -631,12 +632,6 @@ enum mtk_tx_flags { + */ + MTK_TX_FLAGS_SINGLE0 = 0x01, + MTK_TX_FLAGS_PAGE0 = 0x02, +- +- /* MTK_TX_FLAGS_FPORTx allows tracking which port the transmitted +- * SKB out instead of looking up through hardware TX descriptor. +- */ +- MTK_TX_FLAGS_FPORT0 = 0x04, +- MTK_TX_FLAGS_FPORT1 = 0x08, + }; + + /* This enum allows us to identify how the clock is defined on the array of the +@@ -722,6 +717,35 @@ enum mtk_dev_state { + MTK_RESETTING + }; + ++/* PSE Port Definition */ ++enum mtk_pse_port { ++ PSE_ADMA_PORT = 0, ++ PSE_GDM1_PORT, ++ PSE_GDM2_PORT, ++ PSE_PPE0_PORT, ++ PSE_PPE1_PORT, ++ PSE_QDMA_TX_PORT, ++ PSE_QDMA_RX_PORT, ++ PSE_DROP_PORT, ++ PSE_WDMA0_PORT, ++ PSE_WDMA1_PORT, ++ PSE_TDMA_PORT, ++ PSE_NONE_PORT, ++ PSE_PPE2_PORT, ++ PSE_WDMA2_PORT, ++ PSE_EIP197_PORT, ++ PSE_GDM3_PORT, ++ PSE_PORT_MAX ++}; ++ ++/* GMAC Identifier */ ++enum mtk_gmac_id { ++ MTK_GMAC1_ID = 0, ++ MTK_GMAC2_ID, ++ MTK_GMAC3_ID, ++ MTK_GMAC_ID_MAX ++}; ++ + enum mtk_tx_buf_type { + MTK_TYPE_SKB, + MTK_TYPE_XDP_TX, +@@ -740,7 +764,8 @@ struct mtk_tx_buf { + enum mtk_tx_buf_type type; + void *data; + +- u32 flags; ++ u16 mac_id; ++ u16 flags; + DEFINE_DMA_UNMAP_ADDR(dma_addr0); + DEFINE_DMA_UNMAP_LEN(dma_len0); + DEFINE_DMA_UNMAP_ADDR(dma_addr1); +@@ -1189,6 +1214,11 @@ static inline bool mtk_is_netsys_v2_or_g + return eth->soc->version > 1; + } + ++static inline bool mtk_is_netsys_v3_or_greater(struct mtk_eth *eth) ++{ ++ return eth->soc->version > 2; ++} ++ + static inline struct mtk_foe_entry * + mtk_foe_get_entry(struct mtk_ppe *ppe, u16 hash) + { diff --git a/target/linux/generic/backport-5.15/750-v6.5-09-net-ethernet-mtk_eth_soc-convert-caps-in-mtk_soc_dat.patch b/target/linux/generic/backport-5.15/750-v6.5-09-net-ethernet-mtk_eth_soc-convert-caps-in-mtk_soc_dat.patch new file mode 100644 index 0000000000..0a72eec2fc --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-09-net-ethernet-mtk_eth_soc-convert-caps-in-mtk_soc_dat.patch @@ -0,0 +1,193 @@ +From db797ae0542220a98658229397da464c383c991c Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Tue, 25 Jul 2023 01:53:13 +0100 +Subject: [PATCH 103/250] net: ethernet: mtk_eth_soc: convert caps in + mtk_soc_data struct to u64 + +This is a preliminary patch to introduce support for MT7988 SoC. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/9499ac3670b2fc5b444404b84e8a4a169beabbf2.1690246066.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_path.c | 22 ++++---- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 56 ++++++++++---------- + 2 files changed, 39 insertions(+), 39 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_path.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_path.c +@@ -15,10 +15,10 @@ + struct mtk_eth_muxc { + const char *name; + int cap_bit; +- int (*set_path)(struct mtk_eth *eth, int path); ++ int (*set_path)(struct mtk_eth *eth, u64 path); + }; + +-static const char *mtk_eth_path_name(int path) ++static const char *mtk_eth_path_name(u64 path) + { + switch (path) { + case MTK_ETH_PATH_GMAC1_RGMII: +@@ -40,7 +40,7 @@ static const char *mtk_eth_path_name(int + } + } + +-static int set_mux_gdm1_to_gmac1_esw(struct mtk_eth *eth, int path) ++static int set_mux_gdm1_to_gmac1_esw(struct mtk_eth *eth, u64 path) + { + bool updated = true; + u32 val, mask, set; +@@ -71,7 +71,7 @@ static int set_mux_gdm1_to_gmac1_esw(str + return 0; + } + +-static int set_mux_gmac2_gmac0_to_gephy(struct mtk_eth *eth, int path) ++static int set_mux_gmac2_gmac0_to_gephy(struct mtk_eth *eth, u64 path) + { + unsigned int val = 0; + bool updated = true; +@@ -94,7 +94,7 @@ static int set_mux_gmac2_gmac0_to_gephy( + return 0; + } + +-static int set_mux_u3_gmac2_to_qphy(struct mtk_eth *eth, int path) ++static int set_mux_u3_gmac2_to_qphy(struct mtk_eth *eth, u64 path) + { + unsigned int val = 0, mask = 0, reg = 0; + bool updated = true; +@@ -125,7 +125,7 @@ static int set_mux_u3_gmac2_to_qphy(stru + return 0; + } + +-static int set_mux_gmac1_gmac2_to_sgmii_rgmii(struct mtk_eth *eth, int path) ++static int set_mux_gmac1_gmac2_to_sgmii_rgmii(struct mtk_eth *eth, u64 path) + { + unsigned int val = 0; + bool updated = true; +@@ -163,7 +163,7 @@ static int set_mux_gmac1_gmac2_to_sgmii_ + return 0; + } + +-static int set_mux_gmac12_to_gephy_sgmii(struct mtk_eth *eth, int path) ++static int set_mux_gmac12_to_gephy_sgmii(struct mtk_eth *eth, u64 path) + { + unsigned int val = 0; + bool updated = true; +@@ -218,7 +218,7 @@ static const struct mtk_eth_muxc mtk_eth + }, + }; + +-static int mtk_eth_mux_setup(struct mtk_eth *eth, int path) ++static int mtk_eth_mux_setup(struct mtk_eth *eth, u64 path) + { + int i, err = 0; + +@@ -249,7 +249,7 @@ out: + + int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id) + { +- int path; ++ u64 path; + + path = (mac_id == 0) ? MTK_ETH_PATH_GMAC1_SGMII : + MTK_ETH_PATH_GMAC2_SGMII; +@@ -260,7 +260,7 @@ int mtk_gmac_sgmii_path_setup(struct mtk + + int mtk_gmac_gephy_path_setup(struct mtk_eth *eth, int mac_id) + { +- int path = 0; ++ u64 path = 0; + + if (mac_id == 1) + path = MTK_ETH_PATH_GMAC2_GEPHY; +@@ -274,7 +274,7 @@ int mtk_gmac_gephy_path_setup(struct mtk + + int mtk_gmac_rgmii_path_setup(struct mtk_eth *eth, int mac_id) + { +- int path; ++ u64 path; + + path = (mac_id == 0) ? MTK_ETH_PATH_GMAC1_RGMII : + MTK_ETH_PATH_GMAC2_RGMII; +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -863,41 +863,41 @@ enum mkt_eth_capabilities { + }; + + /* Supported hardware group on SoCs */ +-#define MTK_RGMII BIT(MTK_RGMII_BIT) +-#define MTK_TRGMII BIT(MTK_TRGMII_BIT) +-#define MTK_SGMII BIT(MTK_SGMII_BIT) +-#define MTK_ESW BIT(MTK_ESW_BIT) +-#define MTK_GEPHY BIT(MTK_GEPHY_BIT) +-#define MTK_MUX BIT(MTK_MUX_BIT) +-#define MTK_INFRA BIT(MTK_INFRA_BIT) +-#define MTK_SHARED_SGMII BIT(MTK_SHARED_SGMII_BIT) +-#define MTK_HWLRO BIT(MTK_HWLRO_BIT) +-#define MTK_SHARED_INT BIT(MTK_SHARED_INT_BIT) +-#define MTK_TRGMII_MT7621_CLK BIT(MTK_TRGMII_MT7621_CLK_BIT) +-#define MTK_QDMA BIT(MTK_QDMA_BIT) +-#define MTK_SOC_MT7628 BIT(MTK_SOC_MT7628_BIT) +-#define MTK_RSTCTRL_PPE1 BIT(MTK_RSTCTRL_PPE1_BIT) +-#define MTK_U3_COPHY_V2 BIT(MTK_U3_COPHY_V2_BIT) ++#define MTK_RGMII BIT_ULL(MTK_RGMII_BIT) ++#define MTK_TRGMII BIT_ULL(MTK_TRGMII_BIT) ++#define MTK_SGMII BIT_ULL(MTK_SGMII_BIT) ++#define MTK_ESW BIT_ULL(MTK_ESW_BIT) ++#define MTK_GEPHY BIT_ULL(MTK_GEPHY_BIT) ++#define MTK_MUX BIT_ULL(MTK_MUX_BIT) ++#define MTK_INFRA BIT_ULL(MTK_INFRA_BIT) ++#define MTK_SHARED_SGMII BIT_ULL(MTK_SHARED_SGMII_BIT) ++#define MTK_HWLRO BIT_ULL(MTK_HWLRO_BIT) ++#define MTK_SHARED_INT BIT_ULL(MTK_SHARED_INT_BIT) ++#define MTK_TRGMII_MT7621_CLK BIT_ULL(MTK_TRGMII_MT7621_CLK_BIT) ++#define MTK_QDMA BIT_ULL(MTK_QDMA_BIT) ++#define MTK_SOC_MT7628 BIT_ULL(MTK_SOC_MT7628_BIT) ++#define MTK_RSTCTRL_PPE1 BIT_ULL(MTK_RSTCTRL_PPE1_BIT) ++#define MTK_U3_COPHY_V2 BIT_ULL(MTK_U3_COPHY_V2_BIT) + + #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \ +- BIT(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT) ++ BIT_ULL(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT) + #define MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY \ +- BIT(MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY_BIT) ++ BIT_ULL(MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY_BIT) + #define MTK_ETH_MUX_U3_GMAC2_TO_QPHY \ +- BIT(MTK_ETH_MUX_U3_GMAC2_TO_QPHY_BIT) ++ BIT_ULL(MTK_ETH_MUX_U3_GMAC2_TO_QPHY_BIT) + #define MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII \ +- BIT(MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII_BIT) ++ BIT_ULL(MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII_BIT) + #define MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII \ +- BIT(MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII_BIT) ++ BIT_ULL(MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII_BIT) + + /* Supported path present on SoCs */ +-#define MTK_ETH_PATH_GMAC1_RGMII BIT(MTK_ETH_PATH_GMAC1_RGMII_BIT) +-#define MTK_ETH_PATH_GMAC1_TRGMII BIT(MTK_ETH_PATH_GMAC1_TRGMII_BIT) +-#define MTK_ETH_PATH_GMAC1_SGMII BIT(MTK_ETH_PATH_GMAC1_SGMII_BIT) +-#define MTK_ETH_PATH_GMAC2_RGMII BIT(MTK_ETH_PATH_GMAC2_RGMII_BIT) +-#define MTK_ETH_PATH_GMAC2_SGMII BIT(MTK_ETH_PATH_GMAC2_SGMII_BIT) +-#define MTK_ETH_PATH_GMAC2_GEPHY BIT(MTK_ETH_PATH_GMAC2_GEPHY_BIT) +-#define MTK_ETH_PATH_GDM1_ESW BIT(MTK_ETH_PATH_GDM1_ESW_BIT) ++#define MTK_ETH_PATH_GMAC1_RGMII BIT_ULL(MTK_ETH_PATH_GMAC1_RGMII_BIT) ++#define MTK_ETH_PATH_GMAC1_TRGMII BIT_ULL(MTK_ETH_PATH_GMAC1_TRGMII_BIT) ++#define MTK_ETH_PATH_GMAC1_SGMII BIT_ULL(MTK_ETH_PATH_GMAC1_SGMII_BIT) ++#define MTK_ETH_PATH_GMAC2_RGMII BIT_ULL(MTK_ETH_PATH_GMAC2_RGMII_BIT) ++#define MTK_ETH_PATH_GMAC2_SGMII BIT_ULL(MTK_ETH_PATH_GMAC2_SGMII_BIT) ++#define MTK_ETH_PATH_GMAC2_GEPHY BIT_ULL(MTK_ETH_PATH_GMAC2_GEPHY_BIT) ++#define MTK_ETH_PATH_GDM1_ESW BIT_ULL(MTK_ETH_PATH_GDM1_ESW_BIT) + + #define MTK_GMAC1_RGMII (MTK_ETH_PATH_GMAC1_RGMII | MTK_RGMII) + #define MTK_GMAC1_TRGMII (MTK_ETH_PATH_GMAC1_TRGMII | MTK_TRGMII) +@@ -1042,7 +1042,7 @@ struct mtk_reg_map { + struct mtk_soc_data { + const struct mtk_reg_map *reg_map; + u32 ana_rgc3; +- u32 caps; ++ u64 caps; + u32 required_clks; + bool required_pctl; + u8 offload_version; diff --git a/target/linux/generic/backport-5.15/750-v6.5-10-net-ethernet-mtk_eth_soc-convert-clock-bitmap-to-u64.patch b/target/linux/generic/backport-5.15/750-v6.5-10-net-ethernet-mtk_eth_soc-convert-clock-bitmap-to-u64.patch new file mode 100644 index 0000000000..4e5b857d48 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-10-net-ethernet-mtk_eth_soc-convert-clock-bitmap-to-u64.patch @@ -0,0 +1,132 @@ +From a1c9f7d1d24e90294f6a6755b137fcf306851e93 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 25 Jul 2023 01:53:28 +0100 +Subject: [PATCH 104/250] net: ethernet: mtk_eth_soc: convert clock bitmap to + u64 + +The to-be-added MT7988 SoC adds many new clocks which need to be +controlled by the Ethernet driver, which will result in their total +number exceeding 32. +Prepare by converting clock bitmaps into 64-bit types. + +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/6960a39bb0078cf84d7642a9558e6a91c6cc9df3.1690246066.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 96 +++++++++++---------- + 1 file changed, 49 insertions(+), 47 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -663,54 +663,56 @@ enum mtk_clks_map { + MTK_CLK_MAX + }; + +-#define MT7623_CLKS_BITMAP (BIT(MTK_CLK_ETHIF) | BIT(MTK_CLK_ESW) | \ +- BIT(MTK_CLK_GP1) | BIT(MTK_CLK_GP2) | \ +- BIT(MTK_CLK_TRGPLL)) +-#define MT7622_CLKS_BITMAP (BIT(MTK_CLK_ETHIF) | BIT(MTK_CLK_ESW) | \ +- BIT(MTK_CLK_GP0) | BIT(MTK_CLK_GP1) | \ +- BIT(MTK_CLK_GP2) | \ +- BIT(MTK_CLK_SGMII_TX_250M) | \ +- BIT(MTK_CLK_SGMII_RX_250M) | \ +- BIT(MTK_CLK_SGMII_CDR_REF) | \ +- BIT(MTK_CLK_SGMII_CDR_FB) | \ +- BIT(MTK_CLK_SGMII_CK) | \ +- BIT(MTK_CLK_ETH2PLL)) ++#define MT7623_CLKS_BITMAP (BIT_ULL(MTK_CLK_ETHIF) | BIT_ULL(MTK_CLK_ESW) | \ ++ BIT_ULL(MTK_CLK_GP1) | BIT_ULL(MTK_CLK_GP2) | \ ++ BIT_ULL(MTK_CLK_TRGPLL)) ++#define MT7622_CLKS_BITMAP (BIT_ULL(MTK_CLK_ETHIF) | BIT_ULL(MTK_CLK_ESW) | \ ++ BIT_ULL(MTK_CLK_GP0) | BIT_ULL(MTK_CLK_GP1) | \ ++ BIT_ULL(MTK_CLK_GP2) | \ ++ BIT_ULL(MTK_CLK_SGMII_TX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII_RX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII_CDR_REF) | \ ++ BIT_ULL(MTK_CLK_SGMII_CDR_FB) | \ ++ BIT_ULL(MTK_CLK_SGMII_CK) | \ ++ BIT_ULL(MTK_CLK_ETH2PLL)) + #define MT7621_CLKS_BITMAP (0) + #define MT7628_CLKS_BITMAP (0) +-#define MT7629_CLKS_BITMAP (BIT(MTK_CLK_ETHIF) | BIT(MTK_CLK_ESW) | \ +- BIT(MTK_CLK_GP0) | BIT(MTK_CLK_GP1) | \ +- BIT(MTK_CLK_GP2) | BIT(MTK_CLK_FE) | \ +- BIT(MTK_CLK_SGMII_TX_250M) | \ +- BIT(MTK_CLK_SGMII_RX_250M) | \ +- BIT(MTK_CLK_SGMII_CDR_REF) | \ +- BIT(MTK_CLK_SGMII_CDR_FB) | \ +- BIT(MTK_CLK_SGMII2_TX_250M) | \ +- BIT(MTK_CLK_SGMII2_RX_250M) | \ +- BIT(MTK_CLK_SGMII2_CDR_REF) | \ +- BIT(MTK_CLK_SGMII2_CDR_FB) | \ +- BIT(MTK_CLK_SGMII_CK) | \ +- BIT(MTK_CLK_ETH2PLL) | BIT(MTK_CLK_SGMIITOP)) +-#define MT7981_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \ +- BIT(MTK_CLK_WOCPU0) | \ +- BIT(MTK_CLK_SGMII_TX_250M) | \ +- BIT(MTK_CLK_SGMII_RX_250M) | \ +- BIT(MTK_CLK_SGMII_CDR_REF) | \ +- BIT(MTK_CLK_SGMII_CDR_FB) | \ +- BIT(MTK_CLK_SGMII2_TX_250M) | \ +- BIT(MTK_CLK_SGMII2_RX_250M) | \ +- BIT(MTK_CLK_SGMII2_CDR_REF) | \ +- BIT(MTK_CLK_SGMII2_CDR_FB) | \ +- BIT(MTK_CLK_SGMII_CK)) +-#define MT7986_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \ +- BIT(MTK_CLK_WOCPU1) | BIT(MTK_CLK_WOCPU0) | \ +- BIT(MTK_CLK_SGMII_TX_250M) | \ +- BIT(MTK_CLK_SGMII_RX_250M) | \ +- BIT(MTK_CLK_SGMII_CDR_REF) | \ +- BIT(MTK_CLK_SGMII_CDR_FB) | \ +- BIT(MTK_CLK_SGMII2_TX_250M) | \ +- BIT(MTK_CLK_SGMII2_RX_250M) | \ +- BIT(MTK_CLK_SGMII2_CDR_REF) | \ +- BIT(MTK_CLK_SGMII2_CDR_FB)) ++#define MT7629_CLKS_BITMAP (BIT_ULL(MTK_CLK_ETHIF) | BIT_ULL(MTK_CLK_ESW) | \ ++ BIT_ULL(MTK_CLK_GP0) | BIT_ULL(MTK_CLK_GP1) | \ ++ BIT_ULL(MTK_CLK_GP2) | BIT_ULL(MTK_CLK_FE) | \ ++ BIT_ULL(MTK_CLK_SGMII_TX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII_RX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII_CDR_REF) | \ ++ BIT_ULL(MTK_CLK_SGMII_CDR_FB) | \ ++ BIT_ULL(MTK_CLK_SGMII2_TX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII2_RX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII2_CDR_REF) | \ ++ BIT_ULL(MTK_CLK_SGMII2_CDR_FB) | \ ++ BIT_ULL(MTK_CLK_SGMII_CK) | \ ++ BIT_ULL(MTK_CLK_ETH2PLL) | BIT_ULL(MTK_CLK_SGMIITOP)) ++#define MT7981_CLKS_BITMAP (BIT_ULL(MTK_CLK_FE) | BIT_ULL(MTK_CLK_GP2) | \ ++ BIT_ULL(MTK_CLK_GP1) | \ ++ BIT_ULL(MTK_CLK_WOCPU0) | \ ++ BIT_ULL(MTK_CLK_SGMII_TX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII_RX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII_CDR_REF) | \ ++ BIT_ULL(MTK_CLK_SGMII_CDR_FB) | \ ++ BIT_ULL(MTK_CLK_SGMII2_TX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII2_RX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII2_CDR_REF) | \ ++ BIT_ULL(MTK_CLK_SGMII2_CDR_FB) | \ ++ BIT_ULL(MTK_CLK_SGMII_CK)) ++#define MT7986_CLKS_BITMAP (BIT_ULL(MTK_CLK_FE) | BIT_ULL(MTK_CLK_GP2) | \ ++ BIT_ULL(MTK_CLK_GP1) | \ ++ BIT_ULL(MTK_CLK_WOCPU1) | BIT_ULL(MTK_CLK_WOCPU0) | \ ++ BIT_ULL(MTK_CLK_SGMII_TX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII_RX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII_CDR_REF) | \ ++ BIT_ULL(MTK_CLK_SGMII_CDR_FB) | \ ++ BIT_ULL(MTK_CLK_SGMII2_TX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII2_RX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII2_CDR_REF) | \ ++ BIT_ULL(MTK_CLK_SGMII2_CDR_FB)) + + enum mtk_dev_state { + MTK_HW_INIT, +@@ -1043,7 +1045,7 @@ struct mtk_soc_data { + const struct mtk_reg_map *reg_map; + u32 ana_rgc3; + u64 caps; +- u32 required_clks; ++ u64 required_clks; + bool required_pctl; + u8 offload_version; + u8 hash_offset; diff --git a/target/linux/generic/backport-5.15/750-v6.5-11-net-ethernet-mtk_eth_soc-add-basic-support-for-MT798.patch b/target/linux/generic/backport-5.15/750-v6.5-11-net-ethernet-mtk_eth_soc-add-basic-support-for-MT798.patch new file mode 100644 index 0000000000..cc08ef1338 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-11-net-ethernet-mtk_eth_soc-add-basic-support-for-MT798.patch @@ -0,0 +1,477 @@ +From 94f825a7eadfc8b4c8828efdb7705d9703f9c73e Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Tue, 25 Jul 2023 01:57:42 +0100 +Subject: [PATCH 105/250] net: ethernet: mtk_eth_soc: add basic support for + MT7988 SoC + +Introduce support for ethernet chip available in MT7988 SoC to +mtk_eth_soc driver. As a first step support only the first GMAC which +is hard-wired to the internal DSA switch having 4 built-in gigabit +Ethernet PHYs. + +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/25c8377095b95d186872eeda7aa055da83e8f0ca.1690246605.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_path.c | 14 +- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 201 +++++++++++++++++-- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 86 +++++++- + 3 files changed, 273 insertions(+), 28 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_path.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_path.c +@@ -43,7 +43,7 @@ static const char *mtk_eth_path_name(u64 + static int set_mux_gdm1_to_gmac1_esw(struct mtk_eth *eth, u64 path) + { + bool updated = true; +- u32 val, mask, set; ++ u32 mask, set, reg; + + switch (path) { + case MTK_ETH_PATH_GMAC1_SGMII: +@@ -59,11 +59,13 @@ static int set_mux_gdm1_to_gmac1_esw(str + break; + } + +- if (updated) { +- val = mtk_r32(eth, MTK_MAC_MISC); +- val = (val & mask) | set; +- mtk_w32(eth, val, MTK_MAC_MISC); +- } ++ if (mtk_is_netsys_v3_or_greater(eth)) ++ reg = MTK_MAC_MISC_V3; ++ else ++ reg = MTK_MAC_MISC; ++ ++ if (updated) ++ mtk_m32(eth, mask, set, reg); + + dev_dbg(eth->dev, "path %s in %s updated = %d\n", + mtk_eth_path_name(path), __func__, updated); +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -152,6 +152,54 @@ static const struct mtk_reg_map mt7986_r + .pse_oq_sta = 0x01a0, + }; + ++static const struct mtk_reg_map mt7988_reg_map = { ++ .tx_irq_mask = 0x461c, ++ .tx_irq_status = 0x4618, ++ .pdma = { ++ .rx_ptr = 0x6900, ++ .rx_cnt_cfg = 0x6904, ++ .pcrx_ptr = 0x6908, ++ .glo_cfg = 0x6a04, ++ .rst_idx = 0x6a08, ++ .delay_irq = 0x6a0c, ++ .irq_status = 0x6a20, ++ .irq_mask = 0x6a28, ++ .adma_rx_dbg0 = 0x6a38, ++ .int_grp = 0x6a50, ++ }, ++ .qdma = { ++ .qtx_cfg = 0x4400, ++ .qtx_sch = 0x4404, ++ .rx_ptr = 0x4500, ++ .rx_cnt_cfg = 0x4504, ++ .qcrx_ptr = 0x4508, ++ .glo_cfg = 0x4604, ++ .rst_idx = 0x4608, ++ .delay_irq = 0x460c, ++ .fc_th = 0x4610, ++ .int_grp = 0x4620, ++ .hred = 0x4644, ++ .ctx_ptr = 0x4700, ++ .dtx_ptr = 0x4704, ++ .crx_ptr = 0x4710, ++ .drx_ptr = 0x4714, ++ .fq_head = 0x4720, ++ .fq_tail = 0x4724, ++ .fq_count = 0x4728, ++ .fq_blen = 0x472c, ++ .tx_sch_rate = 0x4798, ++ }, ++ .gdm1_cnt = 0x1c00, ++ .gdma_to_ppe0 = 0x3333, ++ .ppe_base = 0x2000, ++ .wdma_base = { ++ [0] = 0x4800, ++ [1] = 0x4c00, ++ }, ++ .pse_iq_sta = 0x0180, ++ .pse_oq_sta = 0x01a0, ++}; ++ + /* strings used by ethtool */ + static const struct mtk_ethtool_stats { + char str[ETH_GSTRING_LEN]; +@@ -179,10 +227,54 @@ static const struct mtk_ethtool_stats { + }; + + static const char * const mtk_clks_source_name[] = { +- "ethif", "sgmiitop", "esw", "gp0", "gp1", "gp2", "fe", "trgpll", +- "sgmii_tx250m", "sgmii_rx250m", "sgmii_cdr_ref", "sgmii_cdr_fb", +- "sgmii2_tx250m", "sgmii2_rx250m", "sgmii2_cdr_ref", "sgmii2_cdr_fb", +- "sgmii_ck", "eth2pll", "wocpu0", "wocpu1", "netsys0", "netsys1" ++ "ethif", ++ "sgmiitop", ++ "esw", ++ "gp0", ++ "gp1", ++ "gp2", ++ "gp3", ++ "xgp1", ++ "xgp2", ++ "xgp3", ++ "crypto", ++ "fe", ++ "trgpll", ++ "sgmii_tx250m", ++ "sgmii_rx250m", ++ "sgmii_cdr_ref", ++ "sgmii_cdr_fb", ++ "sgmii2_tx250m", ++ "sgmii2_rx250m", ++ "sgmii2_cdr_ref", ++ "sgmii2_cdr_fb", ++ "sgmii_ck", ++ "eth2pll", ++ "wocpu0", ++ "wocpu1", ++ "netsys0", ++ "netsys1", ++ "ethwarp_wocpu2", ++ "ethwarp_wocpu1", ++ "ethwarp_wocpu0", ++ "top_usxgmii0_sel", ++ "top_usxgmii1_sel", ++ "top_sgm0_sel", ++ "top_sgm1_sel", ++ "top_xfi_phy0_xtal_sel", ++ "top_xfi_phy1_xtal_sel", ++ "top_eth_gmii_sel", ++ "top_eth_refck_50m_sel", ++ "top_eth_sys_200m_sel", ++ "top_eth_sys_sel", ++ "top_eth_xgmii_sel", ++ "top_eth_mii_sel", ++ "top_netsys_sel", ++ "top_netsys_500m_sel", ++ "top_netsys_pao_2x_sel", ++ "top_netsys_sync_250m_sel", ++ "top_netsys_ppefb_250m_sel", ++ "top_netsys_warp_sel", + }; + + void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg) +@@ -195,7 +287,7 @@ u32 mtk_r32(struct mtk_eth *eth, unsigne + return __raw_readl(eth->base + reg); + } + +-static u32 mtk_m32(struct mtk_eth *eth, u32 mask, u32 set, unsigned reg) ++u32 mtk_m32(struct mtk_eth *eth, u32 mask, u32 set, unsigned int reg) + { + u32 val; + +@@ -326,6 +418,19 @@ static void mtk_gmac0_rgmii_adjust(struc + dev_err(eth->dev, "Missing PLL configuration, ethernet may not work\n"); + } + ++static void mtk_setup_bridge_switch(struct mtk_eth *eth) ++{ ++ /* Force Port1 XGMAC Link Up */ ++ mtk_m32(eth, 0, MTK_XGMAC_FORCE_LINK(MTK_GMAC1_ID), ++ MTK_XGMAC_STS(MTK_GMAC1_ID)); ++ ++ /* Adjust GSW bridge IPG to 11 */ ++ mtk_m32(eth, GSWTX_IPG_MASK | GSWRX_IPG_MASK, ++ (GSW_IPG_11 << GSWTX_IPG_SHIFT) | ++ (GSW_IPG_11 << GSWRX_IPG_SHIFT), ++ MTK_GSW_CFG); ++} ++ + static struct phylink_pcs *mtk_mac_select_pcs(struct phylink_config *config, + phy_interface_t interface) + { +@@ -395,6 +500,8 @@ static void mtk_mac_config(struct phylin + goto init_err; + } + break; ++ case PHY_INTERFACE_MODE_INTERNAL: ++ break; + default: + goto err_phy; + } +@@ -472,6 +579,15 @@ static void mtk_mac_config(struct phylin + return; + } + ++ /* Setup gmac */ ++ if (mtk_is_netsys_v3_or_greater(eth) && ++ mac->interface == PHY_INTERFACE_MODE_INTERNAL) { ++ mtk_w32(mac->hw, MTK_GDMA_XGDM_SEL, MTK_GDMA_EG_CTRL(mac->id)); ++ mtk_w32(mac->hw, MAC_MCR_FORCE_LINK_DOWN, MTK_MAC_MCR(mac->id)); ++ ++ mtk_setup_bridge_switch(eth); ++ } ++ + return; + + err_phy: +@@ -682,11 +798,15 @@ static int mtk_mdio_init(struct mtk_eth + } + divider = min_t(unsigned int, DIV_ROUND_UP(MDC_MAX_FREQ, max_clk), 63); + ++ /* Configure MDC Turbo Mode */ ++ if (mtk_is_netsys_v3_or_greater(eth)) ++ mtk_m32(eth, 0, MISC_MDC_TURBO, MTK_MAC_MISC_V3); ++ + /* Configure MDC Divider */ +- val = mtk_r32(eth, MTK_PPSC); +- val &= ~PPSC_MDC_CFG; +- val |= FIELD_PREP(PPSC_MDC_CFG, divider) | PPSC_MDC_TURBO; +- mtk_w32(eth, val, MTK_PPSC); ++ val = FIELD_PREP(PPSC_MDC_CFG, divider); ++ if (!mtk_is_netsys_v3_or_greater(eth)) ++ val |= PPSC_MDC_TURBO; ++ mtk_m32(eth, PPSC_MDC_CFG, val, MTK_PPSC); + + dev_dbg(eth->dev, "MDC is running on %d Hz\n", MDC_MAX_FREQ / divider); + +@@ -1145,10 +1265,19 @@ static void mtk_tx_set_dma_desc_v2(struc + data |= TX_DMA_LS0; + WRITE_ONCE(desc->txd3, data); + +- if (mac->id == MTK_GMAC3_ID) +- data = PSE_GDM3_PORT; +- else +- data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */ ++ /* set forward port */ ++ switch (mac->id) { ++ case MTK_GMAC1_ID: ++ data = PSE_GDM1_PORT << TX_DMA_FPORT_SHIFT_V2; ++ break; ++ case MTK_GMAC2_ID: ++ data = PSE_GDM2_PORT << TX_DMA_FPORT_SHIFT_V2; ++ break; ++ case MTK_GMAC3_ID: ++ data = PSE_GDM3_PORT << TX_DMA_FPORT_SHIFT_V2; ++ break; ++ } ++ + data |= TX_DMA_SWC_V2 | QID_BITS_V2(info->qid); + WRITE_ONCE(desc->txd4, data); + +@@ -4307,6 +4436,17 @@ static int mtk_add_mac(struct mtk_eth *e + mac->phylink_config.supported_interfaces); + } + ++ if (mtk_is_netsys_v3_or_greater(mac->hw) && ++ MTK_HAS_CAPS(mac->hw->soc->caps, MTK_ESW_BIT) && ++ id == MTK_GMAC1_ID) { ++ mac->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | ++ MAC_SYM_PAUSE | ++ MAC_10000FD; ++ phy_interface_zero(mac->phylink_config.supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_INTERNAL, ++ mac->phylink_config.supported_interfaces); ++ } ++ + phylink = phylink_create(&mac->phylink_config, + of_fwnode_handle(mac->of_node), + phy_mode, &mtk_phylink_ops); +@@ -4829,6 +4969,24 @@ static const struct mtk_soc_data mt7986_ + }, + }; + ++static const struct mtk_soc_data mt7988_data = { ++ .reg_map = &mt7988_reg_map, ++ .ana_rgc3 = 0x128, ++ .caps = MT7988_CAPS, ++ .hw_features = MTK_HW_FEATURES, ++ .required_clks = MT7988_CLKS_BITMAP, ++ .required_pctl = false, ++ .version = 3, ++ .txrx = { ++ .txd_size = sizeof(struct mtk_tx_dma_v2), ++ .rxd_size = sizeof(struct mtk_rx_dma_v2), ++ .rx_irq_done_mask = MTK_RX_DONE_INT_V2, ++ .rx_dma_l4_valid = RX_DMA_L4_VALID_V2, ++ .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, ++ .dma_len_offset = 8, ++ }, ++}; ++ + static const struct mtk_soc_data rt5350_data = { + .reg_map = &mt7628_reg_map, + .caps = MT7628_CAPS, +@@ -4847,14 +5005,15 @@ static const struct mtk_soc_data rt5350_ + }; + + const struct of_device_id of_mtk_match[] = { +- { .compatible = "mediatek,mt2701-eth", .data = &mt2701_data}, +- { .compatible = "mediatek,mt7621-eth", .data = &mt7621_data}, +- { .compatible = "mediatek,mt7622-eth", .data = &mt7622_data}, +- { .compatible = "mediatek,mt7623-eth", .data = &mt7623_data}, +- { .compatible = "mediatek,mt7629-eth", .data = &mt7629_data}, +- { .compatible = "mediatek,mt7981-eth", .data = &mt7981_data}, +- { .compatible = "mediatek,mt7986-eth", .data = &mt7986_data}, +- { .compatible = "ralink,rt5350-eth", .data = &rt5350_data}, ++ { .compatible = "mediatek,mt2701-eth", .data = &mt2701_data }, ++ { .compatible = "mediatek,mt7621-eth", .data = &mt7621_data }, ++ { .compatible = "mediatek,mt7622-eth", .data = &mt7622_data }, ++ { .compatible = "mediatek,mt7623-eth", .data = &mt7623_data }, ++ { .compatible = "mediatek,mt7629-eth", .data = &mt7629_data }, ++ { .compatible = "mediatek,mt7981-eth", .data = &mt7981_data }, ++ { .compatible = "mediatek,mt7986-eth", .data = &mt7986_data }, ++ { .compatible = "mediatek,mt7988-eth", .data = &mt7988_data }, ++ { .compatible = "ralink,rt5350-eth", .data = &rt5350_data }, + {}, + }; + MODULE_DEVICE_TABLE(of, of_mtk_match); +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -117,7 +117,8 @@ + #define MTK_CDMP_EG_CTRL 0x404 + + /* GDM Exgress Control Register */ +-#define MTK_GDMA_FWD_CFG(x) (0x500 + (x * 0x1000)) ++#define MTK_GDMA_FWD_CFG(x) ({ typeof(x) _x = (x); (_x == MTK_GMAC3_ID) ? \ ++ 0x540 : 0x500 + (_x * 0x1000); }) + #define MTK_GDMA_SPECIAL_TAG BIT(24) + #define MTK_GDMA_ICS_EN BIT(22) + #define MTK_GDMA_TCS_EN BIT(21) +@@ -126,6 +127,11 @@ + #define MTK_GDMA_TO_PDMA 0x0 + #define MTK_GDMA_DROP_ALL 0x7777 + ++/* GDM Egress Control Register */ ++#define MTK_GDMA_EG_CTRL(x) ({ typeof(x) _x = (x); (_x == MTK_GMAC3_ID) ? \ ++ 0x544 : 0x504 + (_x * 0x1000); }) ++#define MTK_GDMA_XGDM_SEL BIT(31) ++ + /* Unicast Filter MAC Address Register - Low */ + #define MTK_GDMA_MAC_ADRL(x) (0x508 + (x * 0x1000)) + +@@ -386,7 +392,26 @@ + #define PHY_IAC_TIMEOUT HZ + + #define MTK_MAC_MISC 0x1000c ++#define MTK_MAC_MISC_V3 0x10010 + #define MTK_MUX_TO_ESW BIT(0) ++#define MISC_MDC_TURBO BIT(4) ++ ++/* XMAC status registers */ ++#define MTK_XGMAC_STS(x) (((x) == MTK_GMAC3_ID) ? 0x1001C : 0x1000C) ++#define MTK_XGMAC_FORCE_LINK(x) (((x) == MTK_GMAC2_ID) ? BIT(31) : BIT(15)) ++#define MTK_USXGMII_PCS_LINK BIT(8) ++#define MTK_XGMAC_RX_FC BIT(5) ++#define MTK_XGMAC_TX_FC BIT(4) ++#define MTK_USXGMII_PCS_MODE GENMASK(3, 1) ++#define MTK_XGMAC_LINK_STS BIT(0) ++ ++/* GSW bridge registers */ ++#define MTK_GSW_CFG (0x10080) ++#define GSWTX_IPG_MASK GENMASK(19, 16) ++#define GSWTX_IPG_SHIFT 16 ++#define GSWRX_IPG_MASK GENMASK(3, 0) ++#define GSWRX_IPG_SHIFT 0 ++#define GSW_IPG_11 11 + + /* Mac control registers */ + #define MTK_MAC_MCR(x) (0x10100 + (x * 0x100)) +@@ -644,6 +669,11 @@ enum mtk_clks_map { + MTK_CLK_GP0, + MTK_CLK_GP1, + MTK_CLK_GP2, ++ MTK_CLK_GP3, ++ MTK_CLK_XGP1, ++ MTK_CLK_XGP2, ++ MTK_CLK_XGP3, ++ MTK_CLK_CRYPTO, + MTK_CLK_FE, + MTK_CLK_TRGPLL, + MTK_CLK_SGMII_TX_250M, +@@ -660,6 +690,27 @@ enum mtk_clks_map { + MTK_CLK_WOCPU1, + MTK_CLK_NETSYS0, + MTK_CLK_NETSYS1, ++ MTK_CLK_ETHWARP_WOCPU2, ++ MTK_CLK_ETHWARP_WOCPU1, ++ MTK_CLK_ETHWARP_WOCPU0, ++ MTK_CLK_TOP_USXGMII_SBUS_0_SEL, ++ MTK_CLK_TOP_USXGMII_SBUS_1_SEL, ++ MTK_CLK_TOP_SGM_0_SEL, ++ MTK_CLK_TOP_SGM_1_SEL, ++ MTK_CLK_TOP_XFI_PHY_0_XTAL_SEL, ++ MTK_CLK_TOP_XFI_PHY_1_XTAL_SEL, ++ MTK_CLK_TOP_ETH_GMII_SEL, ++ MTK_CLK_TOP_ETH_REFCK_50M_SEL, ++ MTK_CLK_TOP_ETH_SYS_200M_SEL, ++ MTK_CLK_TOP_ETH_SYS_SEL, ++ MTK_CLK_TOP_ETH_XGMII_SEL, ++ MTK_CLK_TOP_ETH_MII_SEL, ++ MTK_CLK_TOP_NETSYS_SEL, ++ MTK_CLK_TOP_NETSYS_500M_SEL, ++ MTK_CLK_TOP_NETSYS_PAO_2X_SEL, ++ MTK_CLK_TOP_NETSYS_SYNC_250M_SEL, ++ MTK_CLK_TOP_NETSYS_PPEFB_250M_SEL, ++ MTK_CLK_TOP_NETSYS_WARP_SEL, + MTK_CLK_MAX + }; + +@@ -713,6 +764,36 @@ enum mtk_clks_map { + BIT_ULL(MTK_CLK_SGMII2_RX_250M) | \ + BIT_ULL(MTK_CLK_SGMII2_CDR_REF) | \ + BIT_ULL(MTK_CLK_SGMII2_CDR_FB)) ++#define MT7988_CLKS_BITMAP (BIT_ULL(MTK_CLK_FE) | BIT_ULL(MTK_CLK_ESW) | \ ++ BIT_ULL(MTK_CLK_GP1) | BIT_ULL(MTK_CLK_GP2) | \ ++ BIT_ULL(MTK_CLK_GP3) | BIT_ULL(MTK_CLK_XGP1) | \ ++ BIT_ULL(MTK_CLK_XGP2) | BIT_ULL(MTK_CLK_XGP3) | \ ++ BIT_ULL(MTK_CLK_CRYPTO) | \ ++ BIT_ULL(MTK_CLK_SGMII_TX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII_RX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII2_TX_250M) | \ ++ BIT_ULL(MTK_CLK_SGMII2_RX_250M) | \ ++ BIT_ULL(MTK_CLK_ETHWARP_WOCPU2) | \ ++ BIT_ULL(MTK_CLK_ETHWARP_WOCPU1) | \ ++ BIT_ULL(MTK_CLK_ETHWARP_WOCPU0) | \ ++ BIT_ULL(MTK_CLK_TOP_USXGMII_SBUS_0_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_USXGMII_SBUS_1_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_SGM_0_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_SGM_1_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_XFI_PHY_0_XTAL_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_XFI_PHY_1_XTAL_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_ETH_GMII_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_ETH_REFCK_50M_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_ETH_SYS_200M_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_ETH_SYS_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_ETH_XGMII_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_ETH_MII_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_NETSYS_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_NETSYS_500M_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_NETSYS_PAO_2X_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_NETSYS_SYNC_250M_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_NETSYS_PPEFB_250M_SEL) | \ ++ BIT_ULL(MTK_CLK_TOP_NETSYS_WARP_SEL)) + + enum mtk_dev_state { + MTK_HW_INIT, +@@ -961,6 +1042,8 @@ enum mkt_eth_capabilities { + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ + MTK_RSTCTRL_PPE1) + ++#define MT7988_CAPS (MTK_GDM1_ESW | MTK_QDMA | MTK_RSTCTRL_PPE1) ++ + struct mtk_tx_dma_desc_info { + dma_addr_t addr; + u32 size; +@@ -1306,6 +1389,7 @@ void mtk_stats_update_mac(struct mtk_mac + + void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg); + u32 mtk_r32(struct mtk_eth *eth, unsigned reg); ++u32 mtk_m32(struct mtk_eth *eth, u32 mask, u32 set, unsigned int reg); + + int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id); + int mtk_gmac_gephy_path_setup(struct mtk_eth *eth, int mac_id); diff --git a/target/linux/generic/backport-5.15/750-v6.5-12-net-ethernet-mtk_eth_soc-enable-page_pool-support-fo.patch b/target/linux/generic/backport-5.15/750-v6.5-12-net-ethernet-mtk_eth_soc-enable-page_pool-support-fo.patch new file mode 100644 index 0000000000..0a2bc6ae78 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-12-net-ethernet-mtk_eth_soc-enable-page_pool-support-fo.patch @@ -0,0 +1,27 @@ +From 38a7eb76220731eff40602cf433f24880be0a6c2 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Thu, 27 Jul 2023 09:02:26 +0200 +Subject: [PATCH 106/250] net: ethernet: mtk_eth_soc: enable page_pool support + for MT7988 SoC + +In order to recycle pages, enable page_pool allocator for MT7988 SoC. + +Tested-by: Daniel Golle +Signed-off-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/fd4e8693980e47385a543e7b002eec0b88bd09df.1690440675.git.lorenzo@kernel.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1613,7 +1613,7 @@ static void mtk_update_rx_cpu_idx(struct + + static bool mtk_page_pool_enabled(struct mtk_eth *eth) + { +- return eth->soc->version == 2; ++ return mtk_is_netsys_v2_or_greater(eth); + } + + static struct page_pool *mtk_create_page_pool(struct mtk_eth *eth, diff --git a/target/linux/generic/backport-5.15/750-v6.5-13-net-ethernet-mtk_eth_soc-enable-nft-hw-flowtable_off.patch b/target/linux/generic/backport-5.15/750-v6.5-13-net-ethernet-mtk_eth_soc-enable-nft-hw-flowtable_off.patch new file mode 100644 index 0000000000..ebfb1f0c35 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-13-net-ethernet-mtk_eth_soc-enable-nft-hw-flowtable_off.patch @@ -0,0 +1,135 @@ +From 199e7d5a7f03dd377f3a7a458360dbedd71d50ba Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Thu, 27 Jul 2023 09:07:28 +0200 +Subject: [PATCH 107/250] net: ethernet: mtk_eth_soc: enable nft hw + flowtable_offload for MT7988 SoC + +Enable hw Packet Process Engine (PPE) for MT7988 SoC. + +Tested-by: Daniel Golle +Signed-off-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/5e86341b0220a49620dadc02d77970de5ded9efc.1690441576.git.lorenzo@kernel.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 3 +++ + drivers/net/ethernet/mediatek/mtk_ppe.c | 19 +++++++++++++++---- + drivers/net/ethernet/mediatek/mtk_ppe.h | 19 ++++++++++++++++++- + 3 files changed, 36 insertions(+), 5 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4977,6 +4977,9 @@ static const struct mtk_soc_data mt7988_ + .required_clks = MT7988_CLKS_BITMAP, + .required_pctl = false, + .version = 3, ++ .offload_version = 2, ++ .hash_offset = 4, ++ .foe_entry_size = MTK_FOE_ENTRY_V3_SIZE, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma_v2), + .rxd_size = sizeof(struct mtk_rx_dma_v2), +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -422,13 +422,22 @@ int mtk_foe_entry_set_wdma(struct mtk_et + struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(eth, entry); + u32 *ib2 = mtk_foe_entry_ib2(eth, entry); + +- if (mtk_is_netsys_v2_or_greater(eth)) { ++ switch (eth->soc->version) { ++ case 3: ++ *ib2 &= ~MTK_FOE_IB2_PORT_MG_V2; ++ *ib2 |= FIELD_PREP(MTK_FOE_IB2_RX_IDX, txq) | ++ MTK_FOE_IB2_WDMA_WINFO_V2; ++ l2->w3info = FIELD_PREP(MTK_FOE_WINFO_WCID_V3, wcid) | ++ FIELD_PREP(MTK_FOE_WINFO_BSS_V3, bss); ++ break; ++ case 2: + *ib2 &= ~MTK_FOE_IB2_PORT_MG_V2; + *ib2 |= FIELD_PREP(MTK_FOE_IB2_RX_IDX, txq) | + MTK_FOE_IB2_WDMA_WINFO_V2; + l2->winfo = FIELD_PREP(MTK_FOE_WINFO_WCID, wcid) | + FIELD_PREP(MTK_FOE_WINFO_BSS, bss); +- } else { ++ break; ++ default: + *ib2 &= ~MTK_FOE_IB2_PORT_MG; + *ib2 |= MTK_FOE_IB2_WDMA_WINFO; + if (wdma_idx) +@@ -436,6 +445,7 @@ int mtk_foe_entry_set_wdma(struct mtk_et + l2->vlan2 = FIELD_PREP(MTK_FOE_VLAN2_WINFO_BSS, bss) | + FIELD_PREP(MTK_FOE_VLAN2_WINFO_WCID, wcid) | + FIELD_PREP(MTK_FOE_VLAN2_WINFO_RING, txq); ++ break; + } + + return 0; +@@ -956,8 +966,7 @@ void mtk_ppe_start(struct mtk_ppe *ppe) + mtk_ppe_init_foe_table(ppe); + ppe_w32(ppe, MTK_PPE_TB_BASE, ppe->foe_phys); + +- val = MTK_PPE_TB_CFG_ENTRY_80B | +- MTK_PPE_TB_CFG_AGE_NON_L4 | ++ val = MTK_PPE_TB_CFG_AGE_NON_L4 | + MTK_PPE_TB_CFG_AGE_UNBIND | + MTK_PPE_TB_CFG_AGE_TCP | + MTK_PPE_TB_CFG_AGE_UDP | +@@ -973,6 +982,8 @@ void mtk_ppe_start(struct mtk_ppe *ppe) + MTK_PPE_ENTRIES_SHIFT); + if (mtk_is_netsys_v2_or_greater(ppe->eth)) + val |= MTK_PPE_TB_CFG_INFO_SEL; ++ if (!mtk_is_netsys_v3_or_greater(ppe->eth)) ++ val |= MTK_PPE_TB_CFG_ENTRY_80B; + ppe_w32(ppe, MTK_PPE_TB_CFG, val); + + ppe_w32(ppe, MTK_PPE_IP_PROTO_CHK, +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -85,6 +85,17 @@ enum { + #define MTK_FOE_WINFO_BSS GENMASK(5, 0) + #define MTK_FOE_WINFO_WCID GENMASK(15, 6) + ++#define MTK_FOE_WINFO_BSS_V3 GENMASK(23, 16) ++#define MTK_FOE_WINFO_WCID_V3 GENMASK(15, 0) ++ ++#define MTK_FOE_WINFO_PAO_USR_INFO GENMASK(15, 0) ++#define MTK_FOE_WINFO_PAO_TID GENMASK(19, 16) ++#define MTK_FOE_WINFO_PAO_IS_FIXEDRATE BIT(20) ++#define MTK_FOE_WINFO_PAO_IS_PRIOR BIT(21) ++#define MTK_FOE_WINFO_PAO_IS_SP BIT(22) ++#define MTK_FOE_WINFO_PAO_HF BIT(23) ++#define MTK_FOE_WINFO_PAO_AMSDU_EN BIT(24) ++ + enum { + MTK_FOE_STATE_INVALID, + MTK_FOE_STATE_UNBIND, +@@ -106,8 +117,13 @@ struct mtk_foe_mac_info { + u16 pppoe_id; + u16 src_mac_lo; + ++ /* netsys_v2 */ + u16 minfo; + u16 winfo; ++ ++ /* netsys_v3 */ ++ u32 w3info; ++ u32 wpao; + }; + + /* software-only entry type */ +@@ -218,6 +234,7 @@ struct mtk_foe_ipv6_6rd { + + #define MTK_FOE_ENTRY_V1_SIZE 80 + #define MTK_FOE_ENTRY_V2_SIZE 96 ++#define MTK_FOE_ENTRY_V3_SIZE 128 + + struct mtk_foe_entry { + u32 ib1; +@@ -228,7 +245,7 @@ struct mtk_foe_entry { + struct mtk_foe_ipv4_dslite dslite; + struct mtk_foe_ipv6 ipv6; + struct mtk_foe_ipv6_6rd ipv6_6rd; +- u32 data[23]; ++ u32 data[31]; + }; + }; + diff --git a/target/linux/generic/backport-5.15/750-v6.5-14-net-ethernet-mtk_eth_soc-support-per-flow-accounting.patch b/target/linux/generic/backport-5.15/750-v6.5-14-net-ethernet-mtk_eth_soc-support-per-flow-accounting.patch new file mode 100644 index 0000000000..aab3b848a6 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-14-net-ethernet-mtk_eth_soc-support-per-flow-accounting.patch @@ -0,0 +1,78 @@ +From 0c024632c1e7ff69914329bfd87bec749b9c0aed Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Wed, 2 Aug 2023 04:31:09 +0100 +Subject: [PATCH 108/250] net: ethernet: mtk_eth_soc: support per-flow + accounting on MT7988 + +NETSYS_V3 uses 64 bits for each counters while older SoCs are using +48/40 bits for each counter. +Support reading per-flow byte and package counters on NETSYS_V3. + +Signed-off-by: Daniel Golle +Reviewed-by: Simon Horman +Link: https://lore.kernel.org/r/37a0928fa8c1253b197884c68ce1f54239421ac5.1690946442.git.daniel@makrotopia.org +Signed-off-by: Paolo Abeni +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 1 + + drivers/net/ethernet/mediatek/mtk_ppe.c | 21 +++++++++++++------- + drivers/net/ethernet/mediatek/mtk_ppe_regs.h | 2 ++ + 3 files changed, 17 insertions(+), 7 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -4979,6 +4979,7 @@ static const struct mtk_soc_data mt7988_ + .version = 3, + .offload_version = 2, + .hash_offset = 4, ++ .has_accounting = true, + .foe_entry_size = MTK_FOE_ENTRY_V3_SIZE, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma_v2), +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -91,7 +91,6 @@ static int mtk_ppe_mib_wait_busy(struct + + static int mtk_mib_entry_read(struct mtk_ppe *ppe, u16 index, u64 *bytes, u64 *packets) + { +- u32 byte_cnt_low, byte_cnt_high, pkt_cnt_low, pkt_cnt_high; + u32 val, cnt_r0, cnt_r1, cnt_r2; + int ret; + +@@ -106,12 +105,20 @@ static int mtk_mib_entry_read(struct mtk + cnt_r1 = readl(ppe->base + MTK_PPE_MIB_SER_R1); + cnt_r2 = readl(ppe->base + MTK_PPE_MIB_SER_R2); + +- byte_cnt_low = FIELD_GET(MTK_PPE_MIB_SER_R0_BYTE_CNT_LOW, cnt_r0); +- byte_cnt_high = FIELD_GET(MTK_PPE_MIB_SER_R1_BYTE_CNT_HIGH, cnt_r1); +- pkt_cnt_low = FIELD_GET(MTK_PPE_MIB_SER_R1_PKT_CNT_LOW, cnt_r1); +- pkt_cnt_high = FIELD_GET(MTK_PPE_MIB_SER_R2_PKT_CNT_HIGH, cnt_r2); +- *bytes = ((u64)byte_cnt_high << 32) | byte_cnt_low; +- *packets = (pkt_cnt_high << 16) | pkt_cnt_low; ++ if (mtk_is_netsys_v3_or_greater(ppe->eth)) { ++ /* 64 bit for each counter */ ++ u32 cnt_r3 = readl(ppe->base + MTK_PPE_MIB_SER_R3); ++ *bytes = ((u64)cnt_r1 << 32) | cnt_r0; ++ *packets = ((u64)cnt_r3 << 32) | cnt_r2; ++ } else { ++ /* 48 bit byte counter, 40 bit packet counter */ ++ u32 byte_cnt_low = FIELD_GET(MTK_PPE_MIB_SER_R0_BYTE_CNT_LOW, cnt_r0); ++ u32 byte_cnt_high = FIELD_GET(MTK_PPE_MIB_SER_R1_BYTE_CNT_HIGH, cnt_r1); ++ u32 pkt_cnt_low = FIELD_GET(MTK_PPE_MIB_SER_R1_PKT_CNT_LOW, cnt_r1); ++ u32 pkt_cnt_high = FIELD_GET(MTK_PPE_MIB_SER_R2_PKT_CNT_HIGH, cnt_r2); ++ *bytes = ((u64)byte_cnt_high << 32) | byte_cnt_low; ++ *packets = (pkt_cnt_high << 16) | pkt_cnt_low; ++ } + + return 0; + } +--- a/drivers/net/ethernet/mediatek/mtk_ppe_regs.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_regs.h +@@ -163,6 +163,8 @@ enum { + #define MTK_PPE_MIB_SER_R2 0x348 + #define MTK_PPE_MIB_SER_R2_PKT_CNT_HIGH GENMASK(23, 0) + ++#define MTK_PPE_MIB_SER_R3 0x34c ++ + #define MTK_PPE_MIB_CACHE_CTL 0x350 + #define MTK_PPE_MIB_CACHE_CTL_EN BIT(0) + #define MTK_PPE_MIB_CACHE_CTL_FLUSH BIT(2) diff --git a/target/linux/generic/backport-5.15/750-v6.5-15-net-ethernet-mtk_eth_soc-fix-NULL-pointer-on-hw-rese.patch b/target/linux/generic/backport-5.15/750-v6.5-15-net-ethernet-mtk_eth_soc-fix-NULL-pointer-on-hw-rese.patch new file mode 100644 index 0000000000..6f1639a572 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-15-net-ethernet-mtk_eth_soc-fix-NULL-pointer-on-hw-rese.patch @@ -0,0 +1,52 @@ +From 3b12f42772c26869d60398c1710aa27b27cd945c Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 21 Aug 2023 17:12:44 +0100 +Subject: [PATCH 109/250] net: ethernet: mtk_eth_soc: fix NULL pointer on hw + reset + +When a hardware reset is triggered on devices not initializing WED the +calls to mtk_wed_fe_reset and mtk_wed_fe_reset_complete dereference a +pointer on uninitialized stack memory. +Break out of both functions in case a hw_list entry is 0. + +Fixes: 08a764a7c51b ("net: ethernet: mtk_wed: add reset/reset_complete callbacks") +Signed-off-by: Daniel Golle +Reviewed-by: Simon Horman +Acked-by: Lorenzo Bianconi +Link: https://lore.kernel.org/r/5465c1609b464cc7407ae1530c40821dcdf9d3e6.1692634266.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_wed.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -214,9 +214,13 @@ void mtk_wed_fe_reset(void) + + for (i = 0; i < ARRAY_SIZE(hw_list); i++) { + struct mtk_wed_hw *hw = hw_list[i]; +- struct mtk_wed_device *dev = hw->wed_dev; ++ struct mtk_wed_device *dev; + int err; + ++ if (!hw) ++ break; ++ ++ dev = hw->wed_dev; + if (!dev || !dev->wlan.reset) + continue; + +@@ -237,8 +241,12 @@ void mtk_wed_fe_reset_complete(void) + + for (i = 0; i < ARRAY_SIZE(hw_list); i++) { + struct mtk_wed_hw *hw = hw_list[i]; +- struct mtk_wed_device *dev = hw->wed_dev; ++ struct mtk_wed_device *dev; ++ ++ if (!hw) ++ break; + ++ dev = hw->wed_dev; + if (!dev || !dev->wlan.reset_complete) + continue; + diff --git a/target/linux/generic/backport-5.15/750-v6.5-16-net-ethernet-mtk_eth_soc-fix-register-definitions-fo.patch b/target/linux/generic/backport-5.15/750-v6.5-16-net-ethernet-mtk_eth_soc-fix-register-definitions-fo.patch new file mode 100644 index 0000000000..35977946d3 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-16-net-ethernet-mtk_eth_soc-fix-register-definitions-fo.patch @@ -0,0 +1,44 @@ +From 489aea123d74a846ce746bfdb3efe1e7ad512e0d Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 22 Aug 2023 17:31:24 +0100 +Subject: [PATCH 110/250] net: ethernet: mtk_eth_soc: fix register definitions + for MT7988 + +More register macros need to be adjusted for the 3rd GMAC on MT7988. +Account for added bit in SYSCFG0_SGMII_MASK. + +Fixes: 445eb6448ed3 ("net: ethernet: mtk_eth_soc: add basic support for MT7988 SoC") +Signed-off-by: Daniel Golle +Reviewed-by: Simon Horman +Link: https://lore.kernel.org/r/1c8da012e2ca80939906d85f314138c552139f0f.1692721443.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -133,10 +133,12 @@ + #define MTK_GDMA_XGDM_SEL BIT(31) + + /* Unicast Filter MAC Address Register - Low */ +-#define MTK_GDMA_MAC_ADRL(x) (0x508 + (x * 0x1000)) ++#define MTK_GDMA_MAC_ADRL(x) ({ typeof(x) _x = (x); (_x == MTK_GMAC3_ID) ? \ ++ 0x548 : 0x508 + (_x * 0x1000); }) + + /* Unicast Filter MAC Address Register - High */ +-#define MTK_GDMA_MAC_ADRH(x) (0x50C + (x * 0x1000)) ++#define MTK_GDMA_MAC_ADRH(x) ({ typeof(x) _x = (x); (_x == MTK_GMAC3_ID) ? \ ++ 0x54C : 0x50C + (_x * 0x1000); }) + + /* FE global misc reg*/ + #define MTK_FE_GLO_MISC 0x124 +@@ -500,7 +502,7 @@ + #define ETHSYS_SYSCFG0 0x14 + #define SYSCFG0_GE_MASK 0x3 + #define SYSCFG0_GE_MODE(x, y) (x << (12 + (y * 2))) +-#define SYSCFG0_SGMII_MASK GENMASK(9, 8) ++#define SYSCFG0_SGMII_MASK GENMASK(9, 7) + #define SYSCFG0_SGMII_GMAC1 ((2 << 8) & SYSCFG0_SGMII_MASK) + #define SYSCFG0_SGMII_GMAC2 ((3 << 8) & SYSCFG0_SGMII_MASK) + #define SYSCFG0_SGMII_GMAC1_V2 BIT(9) diff --git a/target/linux/generic/backport-5.15/750-v6.5-17-net-ethernet-mtk_eth_soc-add-reset-bits-for-MT7988.patch b/target/linux/generic/backport-5.15/750-v6.5-17-net-ethernet-mtk_eth_soc-add-reset-bits-for-MT7988.patch new file mode 100644 index 0000000000..2d750abb45 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-17-net-ethernet-mtk_eth_soc-add-reset-bits-for-MT7988.patch @@ -0,0 +1,188 @@ +From 15a84d1c44ae8c1451c265ee60500588a24e8cd6 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 22 Aug 2023 17:32:03 +0100 +Subject: [PATCH 111/250] net: ethernet: mtk_eth_soc: add reset bits for MT7988 + +Add bits needed to reset the frame engine on MT7988. + +Fixes: 445eb6448ed3 ("net: ethernet: mtk_eth_soc: add basic support for MT7988 SoC") +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/89b6c38380e7a3800c1362aa7575600717bc7543.1692721443.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 76 +++++++++++++++------ + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 16 +++-- + 2 files changed, 68 insertions(+), 24 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3541,19 +3541,34 @@ static void mtk_hw_reset(struct mtk_eth + { + u32 val; + +- if (mtk_is_netsys_v2_or_greater(eth)) { ++ if (mtk_is_netsys_v2_or_greater(eth)) + regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, 0); ++ ++ if (mtk_is_netsys_v3_or_greater(eth)) { ++ val = RSTCTRL_PPE0_V3; ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ val |= RSTCTRL_PPE1_V3; ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE2)) ++ val |= RSTCTRL_PPE2; ++ ++ val |= RSTCTRL_WDMA0 | RSTCTRL_WDMA1 | RSTCTRL_WDMA2; ++ } else if (mtk_is_netsys_v2_or_greater(eth)) { + val = RSTCTRL_PPE0_V2; ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ val |= RSTCTRL_PPE1; + } else { + val = RSTCTRL_PPE0; + } + +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) +- val |= RSTCTRL_PPE1; +- + ethsys_reset(eth, RSTCTRL_ETH | RSTCTRL_FE | val); + +- if (mtk_is_netsys_v2_or_greater(eth)) ++ if (mtk_is_netsys_v3_or_greater(eth)) ++ regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, ++ 0x6f8ff); ++ else if (mtk_is_netsys_v2_or_greater(eth)) + regmap_write(eth->ethsys, ETHSYS_FE_RST_CHK_IDLE_EN, + 0x3ffffff); + } +@@ -3579,13 +3594,21 @@ static void mtk_hw_warm_reset(struct mtk + return; + } + +- if (mtk_is_netsys_v2_or_greater(eth)) ++ if (mtk_is_netsys_v3_or_greater(eth)) { ++ rst_mask = RSTCTRL_ETH | RSTCTRL_PPE0_V3; ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ rst_mask |= RSTCTRL_PPE1_V3; ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE2)) ++ rst_mask |= RSTCTRL_PPE2; ++ ++ rst_mask |= RSTCTRL_WDMA0 | RSTCTRL_WDMA1 | RSTCTRL_WDMA2; ++ } else if (mtk_is_netsys_v2_or_greater(eth)) { + rst_mask = RSTCTRL_ETH | RSTCTRL_PPE0_V2; +- else ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ rst_mask |= RSTCTRL_PPE1; ++ } else { + rst_mask = RSTCTRL_ETH | RSTCTRL_PPE0; +- +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) +- rst_mask |= RSTCTRL_PPE1; ++ } + + regmap_update_bits(eth->ethsys, ETHSYS_RSTCTRL, rst_mask, rst_mask); + +@@ -3937,11 +3960,17 @@ static void mtk_prepare_for_reset(struct + u32 val; + int i; + +- /* disabe FE P3 and P4 */ +- val = mtk_r32(eth, MTK_FE_GLO_CFG) | MTK_FE_LINK_DOWN_P3; +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) +- val |= MTK_FE_LINK_DOWN_P4; +- mtk_w32(eth, val, MTK_FE_GLO_CFG); ++ /* set FE PPE ports link down */ ++ for (i = MTK_GMAC1_ID; ++ i <= (mtk_is_netsys_v3_or_greater(eth) ? MTK_GMAC3_ID : MTK_GMAC2_ID); ++ i += 2) { ++ val = mtk_r32(eth, MTK_FE_GLO_CFG(i)) | MTK_FE_LINK_DOWN_P(PSE_PPE0_PORT); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ val |= MTK_FE_LINK_DOWN_P(PSE_PPE1_PORT); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE2)) ++ val |= MTK_FE_LINK_DOWN_P(PSE_PPE2_PORT); ++ mtk_w32(eth, val, MTK_FE_GLO_CFG(i)); ++ } + + /* adjust PPE configurations to prepare for reset */ + for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) +@@ -4002,11 +4031,18 @@ static void mtk_pending_work(struct work + } + } + +- /* enabe FE P3 and P4 */ +- val = mtk_r32(eth, MTK_FE_GLO_CFG) & ~MTK_FE_LINK_DOWN_P3; +- if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) +- val &= ~MTK_FE_LINK_DOWN_P4; +- mtk_w32(eth, val, MTK_FE_GLO_CFG); ++ /* set FE PPE ports link up */ ++ for (i = MTK_GMAC1_ID; ++ i <= (mtk_is_netsys_v3_or_greater(eth) ? MTK_GMAC3_ID : MTK_GMAC2_ID); ++ i += 2) { ++ val = mtk_r32(eth, MTK_FE_GLO_CFG(i)) & ~MTK_FE_LINK_DOWN_P(PSE_PPE0_PORT); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE1)) ++ val &= ~MTK_FE_LINK_DOWN_P(PSE_PPE1_PORT); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSTCTRL_PPE2)) ++ val &= ~MTK_FE_LINK_DOWN_P(PSE_PPE2_PORT); ++ ++ mtk_w32(eth, val, MTK_FE_GLO_CFG(i)); ++ } + + clear_bit(MTK_RESETTING, ð->state); + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -76,9 +76,8 @@ + #define MTK_HW_LRO_SDL_REMAIN_ROOM 1522 + + /* Frame Engine Global Configuration */ +-#define MTK_FE_GLO_CFG 0x00 +-#define MTK_FE_LINK_DOWN_P3 BIT(11) +-#define MTK_FE_LINK_DOWN_P4 BIT(12) ++#define MTK_FE_GLO_CFG(x) (((x) == MTK_GMAC3_ID) ? 0x24 : 0x00) ++#define MTK_FE_LINK_DOWN_P(x) BIT(((x) + 8) % 16) + + /* Frame Engine Global Reset Register */ + #define MTK_RST_GL 0x04 +@@ -519,9 +518,15 @@ + /* ethernet reset control register */ + #define ETHSYS_RSTCTRL 0x34 + #define RSTCTRL_FE BIT(6) ++#define RSTCTRL_WDMA0 BIT(24) ++#define RSTCTRL_WDMA1 BIT(25) ++#define RSTCTRL_WDMA2 BIT(26) + #define RSTCTRL_PPE0 BIT(31) + #define RSTCTRL_PPE0_V2 BIT(30) + #define RSTCTRL_PPE1 BIT(31) ++#define RSTCTRL_PPE0_V3 BIT(29) ++#define RSTCTRL_PPE1_V3 BIT(30) ++#define RSTCTRL_PPE2 BIT(31) + #define RSTCTRL_ETH BIT(23) + + /* ethernet reset check idle register */ +@@ -928,6 +933,7 @@ enum mkt_eth_capabilities { + MTK_QDMA_BIT, + MTK_SOC_MT7628_BIT, + MTK_RSTCTRL_PPE1_BIT, ++ MTK_RSTCTRL_PPE2_BIT, + MTK_U3_COPHY_V2_BIT, + + /* MUX BITS*/ +@@ -962,6 +968,7 @@ enum mkt_eth_capabilities { + #define MTK_QDMA BIT_ULL(MTK_QDMA_BIT) + #define MTK_SOC_MT7628 BIT_ULL(MTK_SOC_MT7628_BIT) + #define MTK_RSTCTRL_PPE1 BIT_ULL(MTK_RSTCTRL_PPE1_BIT) ++#define MTK_RSTCTRL_PPE2 BIT_ULL(MTK_RSTCTRL_PPE2_BIT) + #define MTK_U3_COPHY_V2 BIT_ULL(MTK_U3_COPHY_V2_BIT) + + #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \ +@@ -1044,7 +1051,8 @@ enum mkt_eth_capabilities { + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ + MTK_RSTCTRL_PPE1) + +-#define MT7988_CAPS (MTK_GDM1_ESW | MTK_QDMA | MTK_RSTCTRL_PPE1) ++#define MT7988_CAPS (MTK_GDM1_ESW | MTK_QDMA | MTK_RSTCTRL_PPE1 | \ ++ MTK_RSTCTRL_PPE2) + + struct mtk_tx_dma_desc_info { + dma_addr_t addr; diff --git a/target/linux/generic/backport-5.15/750-v6.5-18-net-ethernet-mtk_eth_soc-add-support-for-in-SoC-SRAM.patch b/target/linux/generic/backport-5.15/750-v6.5-18-net-ethernet-mtk_eth_soc-add-support-for-in-SoC-SRAM.patch new file mode 100644 index 0000000000..52bd017300 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-18-net-ethernet-mtk_eth_soc-add-support-for-in-SoC-SRAM.patch @@ -0,0 +1,254 @@ +From 25ce45fe40b574e5d7ffa407f7f2db03e7d5a910 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 22 Aug 2023 17:32:54 +0100 +Subject: [PATCH 112/250] net: ethernet: mtk_eth_soc: add support for in-SoC + SRAM + +MT7981, MT7986 and MT7988 come with in-SoC SRAM dedicated for Ethernet +DMA rings. Support using the SRAM without breaking existing device tree +bindings, ie. only new SoC starting from MT7988 will have the SRAM +declared as additional resource in device tree. For MT7981 and MT7986 +an offset on top of the main I/O base is used. + +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/e45e0f230c63ad58869e8fe35b95a2fb8925b625.1692721443.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 88 ++++++++++++++++----- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 12 ++- + 2 files changed, 78 insertions(+), 22 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1075,10 +1075,13 @@ static int mtk_init_fq_dma(struct mtk_et + dma_addr_t dma_addr; + int i; + +- eth->scratch_ring = dma_alloc_coherent(eth->dma_dev, +- cnt * soc->txrx.txd_size, +- ð->phy_scratch_ring, +- GFP_KERNEL); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM)) ++ eth->scratch_ring = eth->sram_base; ++ else ++ eth->scratch_ring = dma_alloc_coherent(eth->dma_dev, ++ cnt * soc->txrx.txd_size, ++ ð->phy_scratch_ring, ++ GFP_KERNEL); + if (unlikely(!eth->scratch_ring)) + return -ENOMEM; + +@@ -2376,8 +2379,14 @@ static int mtk_tx_alloc(struct mtk_eth * + if (!ring->buf) + goto no_tx_mem; + +- ring->dma = dma_alloc_coherent(eth->dma_dev, ring_size * sz, +- &ring->phys, GFP_KERNEL); ++ if (MTK_HAS_CAPS(soc->caps, MTK_SRAM)) { ++ ring->dma = eth->sram_base + ring_size * sz; ++ ring->phys = eth->phy_scratch_ring + ring_size * (dma_addr_t)sz; ++ } else { ++ ring->dma = dma_alloc_coherent(eth->dma_dev, ring_size * sz, ++ &ring->phys, GFP_KERNEL); ++ } ++ + if (!ring->dma) + goto no_tx_mem; + +@@ -2476,8 +2485,7 @@ static void mtk_tx_clean(struct mtk_eth + kfree(ring->buf); + ring->buf = NULL; + } +- +- if (ring->dma) { ++ if (!MTK_HAS_CAPS(soc->caps, MTK_SRAM) && ring->dma) { + dma_free_coherent(eth->dma_dev, + ring->dma_size * soc->txrx.txd_size, + ring->dma, ring->phys); +@@ -2496,9 +2504,14 @@ static int mtk_rx_alloc(struct mtk_eth * + { + const struct mtk_reg_map *reg_map = eth->soc->reg_map; + struct mtk_rx_ring *ring; +- int rx_data_len, rx_dma_size; ++ int rx_data_len, rx_dma_size, tx_ring_size; + int i; + ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) ++ tx_ring_size = MTK_QDMA_RING_SIZE; ++ else ++ tx_ring_size = MTK_DMA_SIZE; ++ + if (rx_flag == MTK_RX_FLAGS_QDMA) { + if (ring_no) + return -EINVAL; +@@ -2533,9 +2546,20 @@ static int mtk_rx_alloc(struct mtk_eth * + ring->page_pool = pp; + } + +- ring->dma = dma_alloc_coherent(eth->dma_dev, +- rx_dma_size * eth->soc->txrx.rxd_size, +- &ring->phys, GFP_KERNEL); ++ if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM) || ++ rx_flag != MTK_RX_FLAGS_NORMAL) { ++ ring->dma = dma_alloc_coherent(eth->dma_dev, ++ rx_dma_size * eth->soc->txrx.rxd_size, ++ &ring->phys, GFP_KERNEL); ++ } else { ++ struct mtk_tx_ring *tx_ring = ð->tx_ring; ++ ++ ring->dma = tx_ring->dma + tx_ring_size * ++ eth->soc->txrx.txd_size * (ring_no + 1); ++ ring->phys = tx_ring->phys + tx_ring_size * ++ eth->soc->txrx.txd_size * (ring_no + 1); ++ } ++ + if (!ring->dma) + return -ENOMEM; + +@@ -2618,7 +2642,7 @@ static int mtk_rx_alloc(struct mtk_eth * + return 0; + } + +-static void mtk_rx_clean(struct mtk_eth *eth, struct mtk_rx_ring *ring) ++static void mtk_rx_clean(struct mtk_eth *eth, struct mtk_rx_ring *ring, bool in_sram) + { + int i; + +@@ -2641,7 +2665,7 @@ static void mtk_rx_clean(struct mtk_eth + ring->data = NULL; + } + +- if (ring->dma) { ++ if (!in_sram && ring->dma) { + dma_free_coherent(eth->dma_dev, + ring->dma_size * eth->soc->txrx.rxd_size, + ring->dma, ring->phys); +@@ -3004,7 +3028,7 @@ static void mtk_dma_free(struct mtk_eth + for (i = 0; i < MTK_MAX_DEVS; i++) + if (eth->netdev[i]) + netdev_reset_queue(eth->netdev[i]); +- if (eth->scratch_ring) { ++ if (!MTK_HAS_CAPS(soc->caps, MTK_SRAM) && eth->scratch_ring) { + dma_free_coherent(eth->dma_dev, + MTK_QDMA_RING_SIZE * soc->txrx.txd_size, + eth->scratch_ring, eth->phy_scratch_ring); +@@ -3012,13 +3036,13 @@ static void mtk_dma_free(struct mtk_eth + eth->phy_scratch_ring = 0; + } + mtk_tx_clean(eth); +- mtk_rx_clean(eth, ð->rx_ring[0]); +- mtk_rx_clean(eth, ð->rx_ring_qdma); ++ mtk_rx_clean(eth, ð->rx_ring[0], MTK_HAS_CAPS(soc->caps, MTK_SRAM)); ++ mtk_rx_clean(eth, ð->rx_ring_qdma, false); + + if (eth->hwlro) { + mtk_hwlro_rx_uninit(eth); + for (i = 1; i < MTK_MAX_RX_RING_NUM; i++) +- mtk_rx_clean(eth, ð->rx_ring[i]); ++ mtk_rx_clean(eth, ð->rx_ring[i], false); + } + + kfree(eth->scratch_head); +@@ -4588,7 +4612,7 @@ static int mtk_sgmii_init(struct mtk_eth + + static int mtk_probe(struct platform_device *pdev) + { +- struct resource *res = NULL; ++ struct resource *res = NULL, *res_sram; + struct device_node *mac_np; + struct mtk_eth *eth; + int err, i; +@@ -4608,6 +4632,20 @@ static int mtk_probe(struct platform_dev + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) + eth->ip_align = NET_IP_ALIGN; + ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM)) { ++ /* SRAM is actual memory and supports transparent access just like DRAM. ++ * Hence we don't require __iomem being set and don't need to use accessor ++ * functions to read from or write to SRAM. ++ */ ++ if (mtk_is_netsys_v3_or_greater(eth)) { ++ eth->sram_base = (void __force *)devm_platform_ioremap_resource(pdev, 1); ++ if (IS_ERR(eth->sram_base)) ++ return PTR_ERR(eth->sram_base); ++ } else { ++ eth->sram_base = (void __force *)eth->base + MTK_ETH_SRAM_OFFSET; ++ } ++ } ++ + spin_lock_init(ð->page_lock); + spin_lock_init(ð->tx_irq_lock); + spin_lock_init(ð->rx_irq_lock); +@@ -4671,6 +4709,18 @@ static int mtk_probe(struct platform_dev + err = -EINVAL; + goto err_destroy_sgmii; + } ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM)) { ++ if (mtk_is_netsys_v3_or_greater(eth)) { ++ res_sram = platform_get_resource(pdev, IORESOURCE_MEM, 1); ++ if (!res_sram) { ++ err = -EINVAL; ++ goto err_destroy_sgmii; ++ } ++ eth->phy_scratch_ring = res_sram->start; ++ } else { ++ eth->phy_scratch_ring = res->start + MTK_ETH_SRAM_OFFSET; ++ } ++ } + } + + if (eth->soc->offload_version) { +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -139,6 +139,9 @@ + #define MTK_GDMA_MAC_ADRH(x) ({ typeof(x) _x = (x); (_x == MTK_GMAC3_ID) ? \ + 0x54C : 0x50C + (_x * 0x1000); }) + ++/* Internal SRAM offset */ ++#define MTK_ETH_SRAM_OFFSET 0x40000 ++ + /* FE global misc reg*/ + #define MTK_FE_GLO_MISC 0x124 + +@@ -935,6 +938,7 @@ enum mkt_eth_capabilities { + MTK_RSTCTRL_PPE1_BIT, + MTK_RSTCTRL_PPE2_BIT, + MTK_U3_COPHY_V2_BIT, ++ MTK_SRAM_BIT, + + /* MUX BITS*/ + MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT, +@@ -970,6 +974,7 @@ enum mkt_eth_capabilities { + #define MTK_RSTCTRL_PPE1 BIT_ULL(MTK_RSTCTRL_PPE1_BIT) + #define MTK_RSTCTRL_PPE2 BIT_ULL(MTK_RSTCTRL_PPE2_BIT) + #define MTK_U3_COPHY_V2 BIT_ULL(MTK_U3_COPHY_V2_BIT) ++#define MTK_SRAM BIT_ULL(MTK_SRAM_BIT) + + #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \ + BIT_ULL(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT) +@@ -1045,14 +1050,14 @@ enum mkt_eth_capabilities { + #define MT7981_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | MTK_GMAC2_GEPHY | \ + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ + MTK_MUX_U3_GMAC2_TO_QPHY | MTK_U3_COPHY_V2 | \ +- MTK_RSTCTRL_PPE1) ++ MTK_RSTCTRL_PPE1 | MTK_SRAM) + + #define MT7986_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \ + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ +- MTK_RSTCTRL_PPE1) ++ MTK_RSTCTRL_PPE1 | MTK_SRAM) + + #define MT7988_CAPS (MTK_GDM1_ESW | MTK_QDMA | MTK_RSTCTRL_PPE1 | \ +- MTK_RSTCTRL_PPE2) ++ MTK_RSTCTRL_PPE2 | MTK_SRAM) + + struct mtk_tx_dma_desc_info { + dma_addr_t addr; +@@ -1212,6 +1217,7 @@ struct mtk_eth { + struct device *dev; + struct device *dma_dev; + void __iomem *base; ++ void *sram_base; + spinlock_t page_lock; + spinlock_t tx_irq_lock; + spinlock_t rx_irq_lock; diff --git a/target/linux/generic/backport-5.15/750-v6.5-19-net-ethernet-mtk_eth_soc-support-36-bit-DMA-addressi.patch b/target/linux/generic/backport-5.15/750-v6.5-19-net-ethernet-mtk_eth_soc-support-36-bit-DMA-addressi.patch new file mode 100644 index 0000000000..26c5889545 --- /dev/null +++ b/target/linux/generic/backport-5.15/750-v6.5-19-net-ethernet-mtk_eth_soc-support-36-bit-DMA-addressi.patch @@ -0,0 +1,166 @@ +From 0b0d606eb9650fa01dd5621e072aa29a10544399 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 22 Aug 2023 17:33:12 +0100 +Subject: [PATCH 113/250] net: ethernet: mtk_eth_soc: support 36-bit DMA + addressing on MT7988 + +Systems having 4 GiB of RAM and more require DMA addressing beyond the +current 32-bit limit. Starting from MT7988 the hardware now supports +36-bit DMA addressing, let's use that new capability in the driver to +avoid running into swiotlb on systems with 4 GiB of RAM or more. + +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/95b919c98876c9e49761e44662e7c937479eecb8.1692721443.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 30 +++++++++++++++++++-- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 22 +++++++++++++-- + 2 files changed, 48 insertions(+), 4 deletions(-) + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1266,6 +1266,10 @@ static void mtk_tx_set_dma_desc_v2(struc + data = TX_DMA_PLEN0(info->size); + if (info->last) + data |= TX_DMA_LS0; ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA)) ++ data |= TX_DMA_PREP_ADDR64(info->addr); ++ + WRITE_ONCE(desc->txd3, data); + + /* set forward port */ +@@ -1933,6 +1937,7 @@ static int mtk_poll_rx(struct napi_struc + bool xdp_flush = false; + int idx; + struct sk_buff *skb; ++ u64 addr64 = 0; + u8 *data, *new_data; + struct mtk_rx_dma_v2 *rxd, trxd; + int done = 0, bytes = 0; +@@ -2048,7 +2053,10 @@ static int mtk_poll_rx(struct napi_struc + goto release_desc; + } + +- dma_unmap_single(eth->dma_dev, trxd.rxd1, ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA)) ++ addr64 = RX_DMA_GET_ADDR64(trxd.rxd2); ++ ++ dma_unmap_single(eth->dma_dev, ((u64)trxd.rxd1 | addr64), + ring->buf_size, DMA_FROM_DEVICE); + + skb = build_skb(data, ring->frag_size); +@@ -2114,6 +2122,9 @@ release_desc: + else + rxd->rxd2 = RX_DMA_PREP_PLEN0(ring->buf_size); + ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA)) ++ rxd->rxd2 |= RX_DMA_PREP_ADDR64(dma_addr); ++ + ring->calc_idx = idx; + done++; + } +@@ -2598,6 +2609,9 @@ static int mtk_rx_alloc(struct mtk_eth * + else + rxd->rxd2 = RX_DMA_PREP_PLEN0(ring->buf_size); + ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA)) ++ rxd->rxd2 |= RX_DMA_PREP_ADDR64(dma_addr); ++ + rxd->rxd3 = 0; + rxd->rxd4 = 0; + if (mtk_is_netsys_v2_or_greater(eth)) { +@@ -2644,6 +2658,7 @@ static int mtk_rx_alloc(struct mtk_eth * + + static void mtk_rx_clean(struct mtk_eth *eth, struct mtk_rx_ring *ring, bool in_sram) + { ++ u64 addr64 = 0; + int i; + + if (ring->data && ring->dma) { +@@ -2657,7 +2672,10 @@ static void mtk_rx_clean(struct mtk_eth + if (!rxd->rxd1) + continue; + +- dma_unmap_single(eth->dma_dev, rxd->rxd1, ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA)) ++ addr64 = RX_DMA_GET_ADDR64(rxd->rxd2); ++ ++ dma_unmap_single(eth->dma_dev, ((u64)rxd->rxd1 | addr64), + ring->buf_size, DMA_FROM_DEVICE); + mtk_rx_put_buff(ring, ring->data[i], false); + } +@@ -4646,6 +4664,14 @@ static int mtk_probe(struct platform_dev + } + } + ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA)) { ++ err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(36)); ++ if (err) { ++ dev_err(&pdev->dev, "Wrong DMA config\n"); ++ return -EINVAL; ++ } ++ } ++ + spin_lock_init(ð->page_lock); + spin_lock_init(ð->tx_irq_lock); + spin_lock_init(ð->rx_irq_lock); +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -331,6 +331,14 @@ + #define TX_DMA_PLEN1(x) ((x) & eth->soc->txrx.dma_max_len) + #define TX_DMA_SWC BIT(14) + #define TX_DMA_PQID GENMASK(3, 0) ++#define TX_DMA_ADDR64_MASK GENMASK(3, 0) ++#if IS_ENABLED(CONFIG_64BIT) ++# define TX_DMA_GET_ADDR64(x) (((u64)FIELD_GET(TX_DMA_ADDR64_MASK, (x))) << 32) ++# define TX_DMA_PREP_ADDR64(x) FIELD_PREP(TX_DMA_ADDR64_MASK, ((x) >> 32)) ++#else ++# define TX_DMA_GET_ADDR64(x) (0) ++# define TX_DMA_PREP_ADDR64(x) (0) ++#endif + + /* PDMA on MT7628 */ + #define TX_DMA_DONE BIT(31) +@@ -343,6 +351,14 @@ + #define RX_DMA_PREP_PLEN0(x) (((x) & eth->soc->txrx.dma_max_len) << eth->soc->txrx.dma_len_offset) + #define RX_DMA_GET_PLEN0(x) (((x) >> eth->soc->txrx.dma_len_offset) & eth->soc->txrx.dma_max_len) + #define RX_DMA_VTAG BIT(15) ++#define RX_DMA_ADDR64_MASK GENMASK(3, 0) ++#if IS_ENABLED(CONFIG_64BIT) ++# define RX_DMA_GET_ADDR64(x) (((u64)FIELD_GET(RX_DMA_ADDR64_MASK, (x))) << 32) ++# define RX_DMA_PREP_ADDR64(x) FIELD_PREP(RX_DMA_ADDR64_MASK, ((x) >> 32)) ++#else ++# define RX_DMA_GET_ADDR64(x) (0) ++# define RX_DMA_PREP_ADDR64(x) (0) ++#endif + + /* QDMA descriptor rxd3 */ + #define RX_DMA_VID(x) ((x) & VLAN_VID_MASK) +@@ -939,6 +955,7 @@ enum mkt_eth_capabilities { + MTK_RSTCTRL_PPE2_BIT, + MTK_U3_COPHY_V2_BIT, + MTK_SRAM_BIT, ++ MTK_36BIT_DMA_BIT, + + /* MUX BITS*/ + MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT, +@@ -975,6 +992,7 @@ enum mkt_eth_capabilities { + #define MTK_RSTCTRL_PPE2 BIT_ULL(MTK_RSTCTRL_PPE2_BIT) + #define MTK_U3_COPHY_V2 BIT_ULL(MTK_U3_COPHY_V2_BIT) + #define MTK_SRAM BIT_ULL(MTK_SRAM_BIT) ++#define MTK_36BIT_DMA BIT_ULL(MTK_36BIT_DMA_BIT) + + #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \ + BIT_ULL(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT) +@@ -1056,8 +1074,8 @@ enum mkt_eth_capabilities { + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ + MTK_RSTCTRL_PPE1 | MTK_SRAM) + +-#define MT7988_CAPS (MTK_GDM1_ESW | MTK_QDMA | MTK_RSTCTRL_PPE1 | \ +- MTK_RSTCTRL_PPE2 | MTK_SRAM) ++#define MT7988_CAPS (MTK_36BIT_DMA | MTK_GDM1_ESW | MTK_QDMA | \ ++ MTK_RSTCTRL_PPE1 | MTK_RSTCTRL_PPE2 | MTK_SRAM) + + struct mtk_tx_dma_desc_info { + dma_addr_t addr; diff --git a/target/linux/generic/backport-5.10/751-v5.16-net-dsa-qca8k-fix-internal-delay-applied-to-the-wrong-PAD.patch b/target/linux/generic/backport-5.15/751-v5.16-net-dsa-qca8k-fix-internal-delay-applied-to-the-wrong-PAD.patch similarity index 100% rename from target/linux/generic/backport-5.10/751-v5.16-net-dsa-qca8k-fix-internal-delay-applied-to-the-wrong-PAD.patch rename to target/linux/generic/backport-5.15/751-v5.16-net-dsa-qca8k-fix-internal-delay-applied-to-the-wrong-PAD.patch diff --git a/target/linux/generic/backport-5.10/752-v5.16-net-dsa-qca8k-fix-MTU-calculation.patch b/target/linux/generic/backport-5.15/752-v5.16-net-dsa-qca8k-fix-MTU-calculation.patch similarity index 100% rename from target/linux/generic/backport-5.10/752-v5.16-net-dsa-qca8k-fix-MTU-calculation.patch rename to target/linux/generic/backport-5.15/752-v5.16-net-dsa-qca8k-fix-MTU-calculation.patch diff --git a/target/linux/generic/backport-5.10/753-net-next-net-dsa-qca8k-remove-redundant-check-in-parse_port_config.patch b/target/linux/generic/backport-5.15/753-v5.17-net-next-net-dsa-qca8k-remove-redundant-check-in-parse_port_config.patch similarity index 100% rename from target/linux/generic/backport-5.10/753-net-next-net-dsa-qca8k-remove-redundant-check-in-parse_port_config.patch rename to target/linux/generic/backport-5.15/753-v5.17-net-next-net-dsa-qca8k-remove-redundant-check-in-parse_port_config.patch diff --git a/target/linux/generic/backport-5.15/754-v5.17-net-next-net-dsa-qca8k-convert-to-GENMASK_FIELD_PREP_FIELD_GET.patch b/target/linux/generic/backport-5.15/754-v5.17-net-next-net-dsa-qca8k-convert-to-GENMASK_FIELD_PREP_FIELD_GET.patch new file mode 100644 index 0000000000..2cea88089d --- /dev/null +++ b/target/linux/generic/backport-5.15/754-v5.17-net-next-net-dsa-qca8k-convert-to-GENMASK_FIELD_PREP_FIELD_GET.patch @@ -0,0 +1,507 @@ +From 90ae68bfc2ffcb54a4ba4f64edbeb84a80cbb57c Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Mon, 22 Nov 2021 16:23:41 +0100 +Subject: net: dsa: qca8k: convert to GENMASK/FIELD_PREP/FIELD_GET + +Convert and try to standardize bit fields using +GENMASK/FIELD_PREP/FIELD_GET macros. Rework some logic to support the +standard macro and tidy things up. No functional change intended. + +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 98 +++++++++++++++---------------- + drivers/net/dsa/qca8k.h | 153 ++++++++++++++++++++++++++---------------------- + 2 files changed, 130 insertions(+), 121 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -319,18 +320,18 @@ qca8k_fdb_read(struct qca8k_priv *priv, + } + + /* vid - 83:72 */ +- fdb->vid = (reg[2] >> QCA8K_ATU_VID_S) & QCA8K_ATU_VID_M; ++ fdb->vid = FIELD_GET(QCA8K_ATU_VID_MASK, reg[2]); + /* aging - 67:64 */ +- fdb->aging = reg[2] & QCA8K_ATU_STATUS_M; ++ fdb->aging = FIELD_GET(QCA8K_ATU_STATUS_MASK, reg[2]); + /* portmask - 54:48 */ +- fdb->port_mask = (reg[1] >> QCA8K_ATU_PORT_S) & QCA8K_ATU_PORT_M; ++ fdb->port_mask = FIELD_GET(QCA8K_ATU_PORT_MASK, reg[1]); + /* mac - 47:0 */ +- fdb->mac[0] = (reg[1] >> QCA8K_ATU_ADDR0_S) & 0xff; +- fdb->mac[1] = reg[1] & 0xff; +- fdb->mac[2] = (reg[0] >> QCA8K_ATU_ADDR2_S) & 0xff; +- fdb->mac[3] = (reg[0] >> QCA8K_ATU_ADDR3_S) & 0xff; +- fdb->mac[4] = (reg[0] >> QCA8K_ATU_ADDR4_S) & 0xff; +- fdb->mac[5] = reg[0] & 0xff; ++ fdb->mac[0] = FIELD_GET(QCA8K_ATU_ADDR0_MASK, reg[1]); ++ fdb->mac[1] = FIELD_GET(QCA8K_ATU_ADDR1_MASK, reg[1]); ++ fdb->mac[2] = FIELD_GET(QCA8K_ATU_ADDR2_MASK, reg[0]); ++ fdb->mac[3] = FIELD_GET(QCA8K_ATU_ADDR3_MASK, reg[0]); ++ fdb->mac[4] = FIELD_GET(QCA8K_ATU_ADDR4_MASK, reg[0]); ++ fdb->mac[5] = FIELD_GET(QCA8K_ATU_ADDR5_MASK, reg[0]); + + return 0; + } +@@ -343,18 +344,18 @@ qca8k_fdb_write(struct qca8k_priv *priv, + int i; + + /* vid - 83:72 */ +- reg[2] = (vid & QCA8K_ATU_VID_M) << QCA8K_ATU_VID_S; ++ reg[2] = FIELD_PREP(QCA8K_ATU_VID_MASK, vid); + /* aging - 67:64 */ +- reg[2] |= aging & QCA8K_ATU_STATUS_M; ++ reg[2] |= FIELD_PREP(QCA8K_ATU_STATUS_MASK, aging); + /* portmask - 54:48 */ +- reg[1] = (port_mask & QCA8K_ATU_PORT_M) << QCA8K_ATU_PORT_S; ++ reg[1] = FIELD_PREP(QCA8K_ATU_PORT_MASK, port_mask); + /* mac - 47:0 */ +- reg[1] |= mac[0] << QCA8K_ATU_ADDR0_S; +- reg[1] |= mac[1]; +- reg[0] |= mac[2] << QCA8K_ATU_ADDR2_S; +- reg[0] |= mac[3] << QCA8K_ATU_ADDR3_S; +- reg[0] |= mac[4] << QCA8K_ATU_ADDR4_S; +- reg[0] |= mac[5]; ++ reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR0_MASK, mac[0]); ++ reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR1_MASK, mac[1]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR2_MASK, mac[2]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR3_MASK, mac[3]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR4_MASK, mac[4]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR5_MASK, mac[5]); + + /* load the array into the ARL table */ + for (i = 0; i < 3; i++) +@@ -372,7 +373,7 @@ qca8k_fdb_access(struct qca8k_priv *priv + reg |= cmd; + if (port >= 0) { + reg |= QCA8K_ATU_FUNC_PORT_EN; +- reg |= (port & QCA8K_ATU_FUNC_PORT_M) << QCA8K_ATU_FUNC_PORT_S; ++ reg |= FIELD_PREP(QCA8K_ATU_FUNC_PORT_MASK, port); + } + + /* Write the function register triggering the table access */ +@@ -454,7 +455,7 @@ qca8k_vlan_access(struct qca8k_priv *pri + /* Set the command and VLAN index */ + reg = QCA8K_VTU_FUNC1_BUSY; + reg |= cmd; +- reg |= vid << QCA8K_VTU_FUNC1_VID_S; ++ reg |= FIELD_PREP(QCA8K_VTU_FUNC1_VID_MASK, vid); + + /* Write the function register triggering the table access */ + ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC1, reg); +@@ -500,13 +501,11 @@ qca8k_vlan_add(struct qca8k_priv *priv, + if (ret < 0) + goto out; + reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; +- reg &= ~(QCA8K_VTU_FUNC0_EG_MODE_MASK << QCA8K_VTU_FUNC0_EG_MODE_S(port)); ++ reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); + if (untagged) +- reg |= QCA8K_VTU_FUNC0_EG_MODE_UNTAG << +- QCA8K_VTU_FUNC0_EG_MODE_S(port); ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(port); + else +- reg |= QCA8K_VTU_FUNC0_EG_MODE_TAG << +- QCA8K_VTU_FUNC0_EG_MODE_S(port); ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(port); + + ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); + if (ret) +@@ -534,15 +533,13 @@ qca8k_vlan_del(struct qca8k_priv *priv, + ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); + if (ret < 0) + goto out; +- reg &= ~(3 << QCA8K_VTU_FUNC0_EG_MODE_S(port)); +- reg |= QCA8K_VTU_FUNC0_EG_MODE_NOT << +- QCA8K_VTU_FUNC0_EG_MODE_S(port); ++ reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(port); + + /* Check if we're the last member to be removed */ + del = true; + for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- mask = QCA8K_VTU_FUNC0_EG_MODE_NOT; +- mask <<= QCA8K_VTU_FUNC0_EG_MODE_S(i); ++ mask = QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(i); + + if ((reg & mask) != mask) { + del = false; +@@ -1014,7 +1011,7 @@ qca8k_parse_port_config(struct qca8k_pri + mode == PHY_INTERFACE_MODE_RGMII_TXID) + delay = 1; + +- if (delay > QCA8K_MAX_DELAY) { ++ if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK, delay)) { + dev_err(priv->dev, "rgmii tx delay is limited to a max value of 3ns, setting to the max value"); + delay = 3; + } +@@ -1030,7 +1027,7 @@ qca8k_parse_port_config(struct qca8k_pri + mode == PHY_INTERFACE_MODE_RGMII_RXID) + delay = 2; + +- if (delay > QCA8K_MAX_DELAY) { ++ if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK, delay)) { + dev_err(priv->dev, "rgmii rx delay is limited to a max value of 3ns, setting to the max value"); + delay = 3; + } +@@ -1141,8 +1138,8 @@ qca8k_setup(struct dsa_switch *ds) + /* Enable QCA header mode on all cpu ports */ + if (dsa_is_cpu_port(ds, i)) { + ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(i), +- QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_TX_S | +- QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_RX_S); ++ FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) | ++ FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL)); + if (ret) { + dev_err(priv->dev, "failed enabling QCA header mode"); + return ret; +@@ -1159,10 +1156,10 @@ qca8k_setup(struct dsa_switch *ds) + * for igmp, unknown, multicast and broadcast packet + */ + ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1, +- BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_S | +- BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_BC_DP_S | +- BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_MC_DP_S | +- BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_UC_DP_S); ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK, BIT(cpu_port)) | ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK, BIT(cpu_port)) | ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK, BIT(cpu_port)) | ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK, BIT(cpu_port))); + if (ret) + return ret; + +@@ -1180,8 +1177,6 @@ qca8k_setup(struct dsa_switch *ds) + + /* Individual user ports get connected to CPU port only */ + if (dsa_is_user_port(ds, i)) { +- int shift = 16 * (i % 2); +- + ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), + QCA8K_PORT_LOOKUP_MEMBER, + BIT(cpu_port)); +@@ -1198,8 +1193,8 @@ qca8k_setup(struct dsa_switch *ds) + * default egress vid + */ + ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i), +- 0xfff << shift, +- QCA8K_PORT_VID_DEF << shift); ++ QCA8K_EGREES_VLAN_PORT_MASK(i), ++ QCA8K_EGREES_VLAN_PORT(i, QCA8K_PORT_VID_DEF)); + if (ret) + return ret; + +@@ -1246,7 +1241,7 @@ qca8k_setup(struct dsa_switch *ds) + QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | + QCA8K_PORT_HOL_CTRL1_WRED_EN; + qca8k_rmw(priv, QCA8K_REG_PORT_HOL_CTRL1(i), +- QCA8K_PORT_HOL_CTRL1_ING_BUF | ++ QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK | + QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | + QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | + QCA8K_PORT_HOL_CTRL1_WRED_EN, +@@ -1269,8 +1264,8 @@ qca8k_setup(struct dsa_switch *ds) + mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) | + QCA8K_GLOBAL_FC_GOL_XOFF_THRES(496); + qca8k_rmw(priv, QCA8K_REG_GLOBAL_FC_THRESH, +- QCA8K_GLOBAL_FC_GOL_XON_THRES_S | +- QCA8K_GLOBAL_FC_GOL_XOFF_THRES_S, ++ QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK | ++ QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK, + mask); + } + +@@ -1935,11 +1930,11 @@ qca8k_port_vlan_filtering(struct dsa_swi + + if (vlan_filtering) { + ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_VLAN_MODE, ++ QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, + QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE); + } else { + ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_VLAN_MODE, ++ QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, + QCA8K_PORT_LOOKUP_VLAN_MODE_NONE); + } + +@@ -1963,10 +1958,9 @@ qca8k_port_vlan_add(struct dsa_switch *d + } + + if (pvid) { +- int shift = 16 * (port % 2); +- + ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port), +- 0xfff << shift, vlan->vid << shift); ++ QCA8K_EGREES_VLAN_PORT_MASK(port), ++ QCA8K_EGREES_VLAN_PORT(port, vlan->vid)); + if (ret) + return ret; + +@@ -2060,7 +2054,7 @@ static int qca8k_read_switch_id(struct q + if (ret < 0) + return -ENODEV; + +- id = QCA8K_MASK_CTRL_DEVICE_ID(val & QCA8K_MASK_CTRL_DEVICE_ID_MASK); ++ id = QCA8K_MASK_CTRL_DEVICE_ID(val); + if (id != data->id) { + dev_err(priv->dev, "Switch id detected %x but expected %x", id, data->id); + return -ENODEV; +@@ -2069,7 +2063,7 @@ static int qca8k_read_switch_id(struct q + priv->switch_id = id; + + /* Save revision to communicate to the internal PHY driver */ +- priv->switch_revision = (val & QCA8K_MASK_CTRL_REV_ID_MASK); ++ priv->switch_revision = QCA8K_MASK_CTRL_REV_ID(val); + + return 0; + } +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -30,9 +30,9 @@ + /* Global control registers */ + #define QCA8K_REG_MASK_CTRL 0x000 + #define QCA8K_MASK_CTRL_REV_ID_MASK GENMASK(7, 0) +-#define QCA8K_MASK_CTRL_REV_ID(x) ((x) >> 0) ++#define QCA8K_MASK_CTRL_REV_ID(x) FIELD_GET(QCA8K_MASK_CTRL_REV_ID_MASK, x) + #define QCA8K_MASK_CTRL_DEVICE_ID_MASK GENMASK(15, 8) +-#define QCA8K_MASK_CTRL_DEVICE_ID(x) ((x) >> 8) ++#define QCA8K_MASK_CTRL_DEVICE_ID(x) FIELD_GET(QCA8K_MASK_CTRL_DEVICE_ID_MASK, x) + #define QCA8K_REG_PORT0_PAD_CTRL 0x004 + #define QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN BIT(31) + #define QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE BIT(19) +@@ -41,12 +41,11 @@ + #define QCA8K_REG_PORT6_PAD_CTRL 0x00c + #define QCA8K_PORT_PAD_RGMII_EN BIT(26) + #define QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK GENMASK(23, 22) +-#define QCA8K_PORT_PAD_RGMII_TX_DELAY(x) ((x) << 22) ++#define QCA8K_PORT_PAD_RGMII_TX_DELAY(x) FIELD_PREP(QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK, x) + #define QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK GENMASK(21, 20) +-#define QCA8K_PORT_PAD_RGMII_RX_DELAY(x) ((x) << 20) ++#define QCA8K_PORT_PAD_RGMII_RX_DELAY(x) FIELD_PREP(QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK, x) + #define QCA8K_PORT_PAD_RGMII_TX_DELAY_EN BIT(25) + #define QCA8K_PORT_PAD_RGMII_RX_DELAY_EN BIT(24) +-#define QCA8K_MAX_DELAY 3 + #define QCA8K_PORT_PAD_SGMII_EN BIT(7) + #define QCA8K_REG_PWS 0x010 + #define QCA8K_PWS_POWER_ON_SEL BIT(31) +@@ -68,10 +67,12 @@ + #define QCA8K_MDIO_MASTER_READ BIT(27) + #define QCA8K_MDIO_MASTER_WRITE 0 + #define QCA8K_MDIO_MASTER_SUP_PRE BIT(26) +-#define QCA8K_MDIO_MASTER_PHY_ADDR(x) ((x) << 21) +-#define QCA8K_MDIO_MASTER_REG_ADDR(x) ((x) << 16) +-#define QCA8K_MDIO_MASTER_DATA(x) (x) ++#define QCA8K_MDIO_MASTER_PHY_ADDR_MASK GENMASK(25, 21) ++#define QCA8K_MDIO_MASTER_PHY_ADDR(x) FIELD_PREP(QCA8K_MDIO_MASTER_PHY_ADDR_MASK, x) ++#define QCA8K_MDIO_MASTER_REG_ADDR_MASK GENMASK(20, 16) ++#define QCA8K_MDIO_MASTER_REG_ADDR(x) FIELD_PREP(QCA8K_MDIO_MASTER_REG_ADDR_MASK, x) + #define QCA8K_MDIO_MASTER_DATA_MASK GENMASK(15, 0) ++#define QCA8K_MDIO_MASTER_DATA(x) FIELD_PREP(QCA8K_MDIO_MASTER_DATA_MASK, x) + #define QCA8K_MDIO_MASTER_MAX_PORTS 5 + #define QCA8K_MDIO_MASTER_MAX_REG 32 + #define QCA8K_GOL_MAC_ADDR0 0x60 +@@ -93,9 +94,7 @@ + #define QCA8K_PORT_STATUS_FLOW_AUTO BIT(12) + #define QCA8K_REG_PORT_HDR_CTRL(_i) (0x9c + (_i * 4)) + #define QCA8K_PORT_HDR_CTRL_RX_MASK GENMASK(3, 2) +-#define QCA8K_PORT_HDR_CTRL_RX_S 2 + #define QCA8K_PORT_HDR_CTRL_TX_MASK GENMASK(1, 0) +-#define QCA8K_PORT_HDR_CTRL_TX_S 0 + #define QCA8K_PORT_HDR_CTRL_ALL 2 + #define QCA8K_PORT_HDR_CTRL_MGMT 1 + #define QCA8K_PORT_HDR_CTRL_NONE 0 +@@ -105,10 +104,11 @@ + #define QCA8K_SGMII_EN_TX BIT(3) + #define QCA8K_SGMII_EN_SD BIT(4) + #define QCA8K_SGMII_CLK125M_DELAY BIT(7) +-#define QCA8K_SGMII_MODE_CTRL_MASK (BIT(22) | BIT(23)) +-#define QCA8K_SGMII_MODE_CTRL_BASEX (0 << 22) +-#define QCA8K_SGMII_MODE_CTRL_PHY (1 << 22) +-#define QCA8K_SGMII_MODE_CTRL_MAC (2 << 22) ++#define QCA8K_SGMII_MODE_CTRL_MASK GENMASK(23, 22) ++#define QCA8K_SGMII_MODE_CTRL(x) FIELD_PREP(QCA8K_SGMII_MODE_CTRL_MASK, x) ++#define QCA8K_SGMII_MODE_CTRL_BASEX QCA8K_SGMII_MODE_CTRL(0x0) ++#define QCA8K_SGMII_MODE_CTRL_PHY QCA8K_SGMII_MODE_CTRL(0x1) ++#define QCA8K_SGMII_MODE_CTRL_MAC QCA8K_SGMII_MODE_CTRL(0x2) + + /* MAC_PWR_SEL registers */ + #define QCA8K_REG_MAC_PWR_SEL 0x0e4 +@@ -121,100 +121,115 @@ + + /* ACL registers */ + #define QCA8K_REG_PORT_VLAN_CTRL0(_i) (0x420 + (_i * 8)) +-#define QCA8K_PORT_VLAN_CVID(x) (x << 16) +-#define QCA8K_PORT_VLAN_SVID(x) x ++#define QCA8K_PORT_VLAN_CVID_MASK GENMASK(27, 16) ++#define QCA8K_PORT_VLAN_CVID(x) FIELD_PREP(QCA8K_PORT_VLAN_CVID_MASK, x) ++#define QCA8K_PORT_VLAN_SVID_MASK GENMASK(11, 0) ++#define QCA8K_PORT_VLAN_SVID(x) FIELD_PREP(QCA8K_PORT_VLAN_SVID_MASK, x) + #define QCA8K_REG_PORT_VLAN_CTRL1(_i) (0x424 + (_i * 8)) + #define QCA8K_REG_IPV4_PRI_BASE_ADDR 0x470 + #define QCA8K_REG_IPV4_PRI_ADDR_MASK 0x474 + + /* Lookup registers */ + #define QCA8K_REG_ATU_DATA0 0x600 +-#define QCA8K_ATU_ADDR2_S 24 +-#define QCA8K_ATU_ADDR3_S 16 +-#define QCA8K_ATU_ADDR4_S 8 ++#define QCA8K_ATU_ADDR2_MASK GENMASK(31, 24) ++#define QCA8K_ATU_ADDR3_MASK GENMASK(23, 16) ++#define QCA8K_ATU_ADDR4_MASK GENMASK(15, 8) ++#define QCA8K_ATU_ADDR5_MASK GENMASK(7, 0) + #define QCA8K_REG_ATU_DATA1 0x604 +-#define QCA8K_ATU_PORT_M 0x7f +-#define QCA8K_ATU_PORT_S 16 +-#define QCA8K_ATU_ADDR0_S 8 ++#define QCA8K_ATU_PORT_MASK GENMASK(22, 16) ++#define QCA8K_ATU_ADDR0_MASK GENMASK(15, 8) ++#define QCA8K_ATU_ADDR1_MASK GENMASK(7, 0) + #define QCA8K_REG_ATU_DATA2 0x608 +-#define QCA8K_ATU_VID_M 0xfff +-#define QCA8K_ATU_VID_S 8 +-#define QCA8K_ATU_STATUS_M 0xf ++#define QCA8K_ATU_VID_MASK GENMASK(19, 8) ++#define QCA8K_ATU_STATUS_MASK GENMASK(3, 0) + #define QCA8K_ATU_STATUS_STATIC 0xf + #define QCA8K_REG_ATU_FUNC 0x60c + #define QCA8K_ATU_FUNC_BUSY BIT(31) + #define QCA8K_ATU_FUNC_PORT_EN BIT(14) + #define QCA8K_ATU_FUNC_MULTI_EN BIT(13) + #define QCA8K_ATU_FUNC_FULL BIT(12) +-#define QCA8K_ATU_FUNC_PORT_M 0xf +-#define QCA8K_ATU_FUNC_PORT_S 8 ++#define QCA8K_ATU_FUNC_PORT_MASK GENMASK(11, 8) + #define QCA8K_REG_VTU_FUNC0 0x610 + #define QCA8K_VTU_FUNC0_VALID BIT(20) + #define QCA8K_VTU_FUNC0_IVL_EN BIT(19) +-#define QCA8K_VTU_FUNC0_EG_MODE_S(_i) (4 + (_i) * 2) +-#define QCA8K_VTU_FUNC0_EG_MODE_MASK 3 +-#define QCA8K_VTU_FUNC0_EG_MODE_UNMOD 0 +-#define QCA8K_VTU_FUNC0_EG_MODE_UNTAG 1 +-#define QCA8K_VTU_FUNC0_EG_MODE_TAG 2 +-#define QCA8K_VTU_FUNC0_EG_MODE_NOT 3 ++/* QCA8K_VTU_FUNC0_EG_MODE_MASK GENMASK(17, 4) ++ * It does contain VLAN_MODE for each port [5:4] for port0, ++ * [7:6] for port1 ... [17:16] for port6. Use virtual port ++ * define to handle this. ++ */ ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i) (4 + (_i) * 2) ++#define QCA8K_VTU_FUNC0_EG_MODE_MASK GENMASK(1, 0) ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(_i) (GENMASK(1, 0) << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) ++#define QCA8K_VTU_FUNC0_EG_MODE_UNMOD FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x0) ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_UNMOD(_i) (QCA8K_VTU_FUNC0_EG_MODE_UNMOD << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) ++#define QCA8K_VTU_FUNC0_EG_MODE_UNTAG FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x1) ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(_i) (QCA8K_VTU_FUNC0_EG_MODE_UNTAG << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) ++#define QCA8K_VTU_FUNC0_EG_MODE_TAG FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x2) ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(_i) (QCA8K_VTU_FUNC0_EG_MODE_TAG << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) ++#define QCA8K_VTU_FUNC0_EG_MODE_NOT FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x3) ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(_i) (QCA8K_VTU_FUNC0_EG_MODE_NOT << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) + #define QCA8K_REG_VTU_FUNC1 0x614 + #define QCA8K_VTU_FUNC1_BUSY BIT(31) +-#define QCA8K_VTU_FUNC1_VID_S 16 ++#define QCA8K_VTU_FUNC1_VID_MASK GENMASK(27, 16) + #define QCA8K_VTU_FUNC1_FULL BIT(4) + #define QCA8K_REG_GLOBAL_FW_CTRL0 0x620 + #define QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN BIT(10) + #define QCA8K_REG_GLOBAL_FW_CTRL1 0x624 +-#define QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_S 24 +-#define QCA8K_GLOBAL_FW_CTRL1_BC_DP_S 16 +-#define QCA8K_GLOBAL_FW_CTRL1_MC_DP_S 8 +-#define QCA8K_GLOBAL_FW_CTRL1_UC_DP_S 0 ++#define QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK GENMASK(30, 24) ++#define QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK GENMASK(22, 16) ++#define QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK GENMASK(14, 8) ++#define QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK GENMASK(6, 0) + #define QCA8K_PORT_LOOKUP_CTRL(_i) (0x660 + (_i) * 0xc) + #define QCA8K_PORT_LOOKUP_MEMBER GENMASK(6, 0) +-#define QCA8K_PORT_LOOKUP_VLAN_MODE GENMASK(9, 8) +-#define QCA8K_PORT_LOOKUP_VLAN_MODE_NONE (0 << 8) +-#define QCA8K_PORT_LOOKUP_VLAN_MODE_FALLBACK (1 << 8) +-#define QCA8K_PORT_LOOKUP_VLAN_MODE_CHECK (2 << 8) +-#define QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE (3 << 8) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE_MASK GENMASK(9, 8) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE(x) FIELD_PREP(QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, x) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE_NONE QCA8K_PORT_LOOKUP_VLAN_MODE(0x0) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE_FALLBACK QCA8K_PORT_LOOKUP_VLAN_MODE(0x1) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE_CHECK QCA8K_PORT_LOOKUP_VLAN_MODE(0x2) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE QCA8K_PORT_LOOKUP_VLAN_MODE(0x3) + #define QCA8K_PORT_LOOKUP_STATE_MASK GENMASK(18, 16) +-#define QCA8K_PORT_LOOKUP_STATE_DISABLED (0 << 16) +-#define QCA8K_PORT_LOOKUP_STATE_BLOCKING (1 << 16) +-#define QCA8K_PORT_LOOKUP_STATE_LISTENING (2 << 16) +-#define QCA8K_PORT_LOOKUP_STATE_LEARNING (3 << 16) +-#define QCA8K_PORT_LOOKUP_STATE_FORWARD (4 << 16) +-#define QCA8K_PORT_LOOKUP_STATE GENMASK(18, 16) ++#define QCA8K_PORT_LOOKUP_STATE(x) FIELD_PREP(QCA8K_PORT_LOOKUP_STATE_MASK, x) ++#define QCA8K_PORT_LOOKUP_STATE_DISABLED QCA8K_PORT_LOOKUP_STATE(0x0) ++#define QCA8K_PORT_LOOKUP_STATE_BLOCKING QCA8K_PORT_LOOKUP_STATE(0x1) ++#define QCA8K_PORT_LOOKUP_STATE_LISTENING QCA8K_PORT_LOOKUP_STATE(0x2) ++#define QCA8K_PORT_LOOKUP_STATE_LEARNING QCA8K_PORT_LOOKUP_STATE(0x3) ++#define QCA8K_PORT_LOOKUP_STATE_FORWARD QCA8K_PORT_LOOKUP_STATE(0x4) + #define QCA8K_PORT_LOOKUP_LEARN BIT(20) + + #define QCA8K_REG_GLOBAL_FC_THRESH 0x800 +-#define QCA8K_GLOBAL_FC_GOL_XON_THRES(x) ((x) << 16) +-#define QCA8K_GLOBAL_FC_GOL_XON_THRES_S GENMASK(24, 16) +-#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES(x) ((x) << 0) +-#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES_S GENMASK(8, 0) ++#define QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK GENMASK(24, 16) ++#define QCA8K_GLOBAL_FC_GOL_XON_THRES(x) FIELD_PREP(QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK, x) ++#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK GENMASK(8, 0) ++#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES(x) FIELD_PREP(QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK, x) + + #define QCA8K_REG_PORT_HOL_CTRL0(_i) (0x970 + (_i) * 0x8) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF GENMASK(3, 0) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI0(x) ((x) << 0) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI1_BUF GENMASK(7, 4) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI1(x) ((x) << 4) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI2_BUF GENMASK(11, 8) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI2(x) ((x) << 8) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI3_BUF GENMASK(15, 12) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI3(x) ((x) << 12) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI4_BUF GENMASK(19, 16) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI4(x) ((x) << 16) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI5_BUF GENMASK(23, 20) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI5(x) ((x) << 20) +-#define QCA8K_PORT_HOL_CTRL0_EG_PORT_BUF GENMASK(29, 24) +-#define QCA8K_PORT_HOL_CTRL0_EG_PORT(x) ((x) << 24) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF_MASK GENMASK(3, 0) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI0(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI1_BUF_MASK GENMASK(7, 4) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI1(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI1_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI2_BUF_MASK GENMASK(11, 8) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI2(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI2_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI3_BUF_MASK GENMASK(15, 12) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI3(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI3_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI4_BUF_MASK GENMASK(19, 16) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI4(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI4_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI5_BUF_MASK GENMASK(23, 20) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI5(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI5_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PORT_BUF_MASK GENMASK(29, 24) ++#define QCA8K_PORT_HOL_CTRL0_EG_PORT(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PORT_BUF_MASK, x) + + #define QCA8K_REG_PORT_HOL_CTRL1(_i) (0x974 + (_i) * 0x8) +-#define QCA8K_PORT_HOL_CTRL1_ING_BUF GENMASK(3, 0) +-#define QCA8K_PORT_HOL_CTRL1_ING(x) ((x) << 0) ++#define QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK GENMASK(3, 0) ++#define QCA8K_PORT_HOL_CTRL1_ING(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK, x) + #define QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN BIT(6) + #define QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN BIT(7) + #define QCA8K_PORT_HOL_CTRL1_WRED_EN BIT(8) + #define QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN BIT(16) + + /* Pkt edit registers */ ++#define QCA8K_EGREES_VLAN_PORT_SHIFT(_i) (16 * ((_i) % 2)) ++#define QCA8K_EGREES_VLAN_PORT_MASK(_i) (GENMASK(11, 0) << QCA8K_EGREES_VLAN_PORT_SHIFT(_i)) ++#define QCA8K_EGREES_VLAN_PORT(_i, x) ((x) << QCA8K_EGREES_VLAN_PORT_SHIFT(_i)) + #define QCA8K_EGRESS_VLAN(x) (0x0c70 + (4 * (x / 2))) + + /* L3 registers */ diff --git a/target/linux/generic/backport-5.10/755-net-next-net-dsa-qca8k-remove-extra-mutex_init-in-qca8k_setup.patch b/target/linux/generic/backport-5.15/755-v5.17-net-next-net-dsa-qca8k-remove-extra-mutex_init-in-qca8k_setup.patch similarity index 100% rename from target/linux/generic/backport-5.10/755-net-next-net-dsa-qca8k-remove-extra-mutex_init-in-qca8k_setup.patch rename to target/linux/generic/backport-5.15/755-v5.17-net-next-net-dsa-qca8k-remove-extra-mutex_init-in-qca8k_setup.patch diff --git a/target/linux/generic/backport-5.15/756-v5.17-net-next-net-dsa-qca8k-move-regmap-init-in-probe-and-set-it.patch b/target/linux/generic/backport-5.15/756-v5.17-net-next-net-dsa-qca8k-move-regmap-init-in-probe-and-set-it.patch new file mode 100644 index 0000000000..44d938c53e --- /dev/null +++ b/target/linux/generic/backport-5.15/756-v5.17-net-next-net-dsa-qca8k-move-regmap-init-in-probe-and-set-it.patch @@ -0,0 +1,46 @@ +From 36b8af12f424e7a7f60a935c60a0fd4aa0822378 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Mon, 22 Nov 2021 16:23:43 +0100 +Subject: net: dsa: qca8k: move regmap init in probe and set it mandatory + +In preparation for regmap conversion, move regmap init in the probe +function and make it mandatory as any read/write/rmw operation will be +converted to regmap API. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -1086,12 +1086,6 @@ qca8k_setup(struct dsa_switch *ds) + if (ret) + return ret; + +- /* Start by setting up the register mapping */ +- priv->regmap = devm_regmap_init(ds->dev, NULL, priv, +- &qca8k_regmap_config); +- if (IS_ERR(priv->regmap)) +- dev_warn(priv->dev, "regmap initialization failed"); +- + ret = qca8k_setup_mdio_bus(priv); + if (ret) + return ret; +@@ -2096,6 +2090,14 @@ qca8k_sw_probe(struct mdio_device *mdiod + gpiod_set_value_cansleep(priv->reset_gpio, 0); + } + ++ /* Start by setting up the register mapping */ ++ priv->regmap = devm_regmap_init(&mdiodev->dev, NULL, priv, ++ &qca8k_regmap_config); ++ if (IS_ERR(priv->regmap)) { ++ dev_err(priv->dev, "regmap initialization failed"); ++ return PTR_ERR(priv->regmap); ++ } ++ + /* Check the detected switch id */ + ret = qca8k_read_switch_id(priv); + if (ret) diff --git a/target/linux/generic/backport-5.10/757-net-next-net-dsa-qca8k-initial-conversion-to-regmap-heper.patch b/target/linux/generic/backport-5.15/757-v5.17-net-next-net-dsa-qca8k-initial-conversion-to-regmap-heper.patch similarity index 100% rename from target/linux/generic/backport-5.10/757-net-next-net-dsa-qca8k-initial-conversion-to-regmap-heper.patch rename to target/linux/generic/backport-5.15/757-v5.17-net-next-net-dsa-qca8k-initial-conversion-to-regmap-heper.patch diff --git a/target/linux/generic/backport-5.15/758-v5.17-net-next-net-dsa-qca8k-add-additional-MIB-counter-and-.patch b/target/linux/generic/backport-5.15/758-v5.17-net-next-net-dsa-qca8k-add-additional-MIB-counter-and-.patch new file mode 100644 index 0000000000..c8c050933b --- /dev/null +++ b/target/linux/generic/backport-5.15/758-v5.17-net-next-net-dsa-qca8k-add-additional-MIB-counter-and-.patch @@ -0,0 +1,120 @@ +From c126f118b330ccf0db0dda4a4bd6c729865a205f Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Mon, 22 Nov 2021 16:23:45 +0100 +Subject: net: dsa: qca8k: add additional MIB counter and make it dynamic + +We are currently missing 2 additionals MIB counter present in QCA833x +switch. +QC832x switch have 39 MIB counter and QCA833X have 41 MIB counter. +Add the additional MIB counter and rework the MIB function to print the +correct supported counter from the match_data struct. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 23 ++++++++++++++++++++--- + drivers/net/dsa/qca8k.h | 4 ++++ + 2 files changed, 24 insertions(+), 3 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -70,6 +70,8 @@ static const struct qca8k_mib_desc ar832 + MIB_DESC(1, 0x9c, "TxExcDefer"), + MIB_DESC(1, 0xa0, "TxDefer"), + MIB_DESC(1, 0xa4, "TxLateCol"), ++ MIB_DESC(1, 0xa8, "RXUnicast"), ++ MIB_DESC(1, 0xac, "TXUnicast"), + }; + + /* The 32bit switch registers are accessed indirectly. To achieve this we need +@@ -1605,12 +1607,16 @@ qca8k_phylink_mac_link_up(struct dsa_swi + static void + qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data) + { ++ const struct qca8k_match_data *match_data; ++ struct qca8k_priv *priv = ds->priv; + int i; + + if (stringset != ETH_SS_STATS) + return; + +- for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) ++ match_data = of_device_get_match_data(priv->dev); ++ ++ for (i = 0; i < match_data->mib_count; i++) + strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, + ETH_GSTRING_LEN); + } +@@ -1620,12 +1626,15 @@ qca8k_get_ethtool_stats(struct dsa_switc + uint64_t *data) + { + struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ const struct qca8k_match_data *match_data; + const struct qca8k_mib_desc *mib; + u32 reg, i, val; + u32 hi = 0; + int ret; + +- for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) { ++ match_data = of_device_get_match_data(priv->dev); ++ ++ for (i = 0; i < match_data->mib_count; i++) { + mib = &ar8327_mib[i]; + reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; + +@@ -1648,10 +1657,15 @@ qca8k_get_ethtool_stats(struct dsa_switc + static int + qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset) + { ++ const struct qca8k_match_data *match_data; ++ struct qca8k_priv *priv = ds->priv; ++ + if (sset != ETH_SS_STATS) + return 0; + +- return ARRAY_SIZE(ar8327_mib); ++ match_data = of_device_get_match_data(priv->dev); ++ ++ return match_data->mib_count; + } + + static int +@@ -2173,14 +2187,17 @@ static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, + static const struct qca8k_match_data qca8327 = { + .id = QCA8K_ID_QCA8327, + .reduced_package = true, ++ .mib_count = QCA8K_QCA832X_MIB_COUNT, + }; + + static const struct qca8k_match_data qca8328 = { + .id = QCA8K_ID_QCA8327, ++ .mib_count = QCA8K_QCA832X_MIB_COUNT, + }; + + static const struct qca8k_match_data qca833x = { + .id = QCA8K_ID_QCA8337, ++ .mib_count = QCA8K_QCA833X_MIB_COUNT, + }; + + static const struct of_device_id qca8k_of_match[] = { +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -21,6 +21,9 @@ + #define PHY_ID_QCA8337 0x004dd036 + #define QCA8K_ID_QCA8337 0x13 + ++#define QCA8K_QCA832X_MIB_COUNT 39 ++#define QCA8K_QCA833X_MIB_COUNT 41 ++ + #define QCA8K_BUSY_WAIT_TIMEOUT 2000 + + #define QCA8K_NUM_FDB_RECORDS 2048 +@@ -279,6 +282,7 @@ struct ar8xxx_port_status { + struct qca8k_match_data { + u8 id; + bool reduced_package; ++ u8 mib_count; + }; + + enum { diff --git a/target/linux/generic/backport-5.15/759-v5.17-net-next-net-dsa-qca8k-add-support-for-port-fast-aging.patch b/target/linux/generic/backport-5.15/759-v5.17-net-next-net-dsa-qca8k-add-support-for-port-fast-aging.patch new file mode 100644 index 0000000000..8ad7ab472d --- /dev/null +++ b/target/linux/generic/backport-5.15/759-v5.17-net-next-net-dsa-qca8k-add-support-for-port-fast-aging.patch @@ -0,0 +1,53 @@ +From 4592538bfb0d5d3c3c8a1d7071724d081412ac91 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Mon, 22 Nov 2021 16:23:46 +0100 +Subject: net: dsa: qca8k: add support for port fast aging + +The switch supports fast aging by flushing any rule in the ARL +table for a specific port. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 11 +++++++++++ + drivers/net/dsa/qca8k.h | 1 + + 2 files changed, 12 insertions(+) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -1790,6 +1790,16 @@ qca8k_port_bridge_leave(struct dsa_switc + QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port)); + } + ++static void ++qca8k_port_fast_age(struct dsa_switch *ds, int port) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_access(priv, QCA8K_FDB_FLUSH_PORT, port); ++ mutex_unlock(&priv->reg_mutex); ++} ++ + static int + qca8k_port_enable(struct dsa_switch *ds, int port, + struct phy_device *phy) +@@ -2017,6 +2027,7 @@ static const struct dsa_switch_ops qca8k + .port_stp_state_set = qca8k_port_stp_state_set, + .port_bridge_join = qca8k_port_bridge_join, + .port_bridge_leave = qca8k_port_bridge_leave, ++ .port_fast_age = qca8k_port_fast_age, + .port_fdb_add = qca8k_port_fdb_add, + .port_fdb_del = qca8k_port_fdb_del, + .port_fdb_dump = qca8k_port_fdb_dump, +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -262,6 +262,7 @@ enum qca8k_fdb_cmd { + QCA8K_FDB_FLUSH = 1, + QCA8K_FDB_LOAD = 2, + QCA8K_FDB_PURGE = 3, ++ QCA8K_FDB_FLUSH_PORT = 5, + QCA8K_FDB_NEXT = 6, + QCA8K_FDB_SEARCH = 7, + }; diff --git a/target/linux/generic/backport-5.15/760-v5.17-net-next-net-dsa-qca8k-add-set_ageing_time-support.patch b/target/linux/generic/backport-5.15/760-v5.17-net-next-net-dsa-qca8k-add-set_ageing_time-support.patch new file mode 100644 index 0000000000..659e482405 --- /dev/null +++ b/target/linux/generic/backport-5.15/760-v5.17-net-next-net-dsa-qca8k-add-set_ageing_time-support.patch @@ -0,0 +1,78 @@ +From 6a3bdc5209f45d2af83aa92433ab6e5cf2297aa4 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Mon, 22 Nov 2021 16:23:47 +0100 +Subject: net: dsa: qca8k: add set_ageing_time support + +qca8k support setting ageing time in step of 7s. Add support for it and +set the max value accepted of 7645m. +Documentation talks about support for 10000m but that values doesn't +make sense as the value doesn't match the max value in the reg. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 25 +++++++++++++++++++++++++ + drivers/net/dsa/qca8k.h | 3 +++ + 2 files changed, 28 insertions(+) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -1261,6 +1261,10 @@ qca8k_setup(struct dsa_switch *ds) + /* We don't have interrupts for link changes, so we need to poll */ + ds->pcs_poll = true; + ++ /* Set min a max ageing value supported */ ++ ds->ageing_time_min = 7000; ++ ds->ageing_time_max = 458745000; ++ + return 0; + } + +@@ -1801,6 +1805,26 @@ qca8k_port_fast_age(struct dsa_switch *d + } + + static int ++qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ unsigned int secs = msecs / 1000; ++ u32 val; ++ ++ /* AGE_TIME reg is set in 7s step */ ++ val = secs / 7; ++ ++ /* Handle case with 0 as val to NOT disable ++ * learning ++ */ ++ if (!val) ++ val = 1; ++ ++ return regmap_update_bits(priv->regmap, QCA8K_REG_ATU_CTRL, QCA8K_ATU_AGE_TIME_MASK, ++ QCA8K_ATU_AGE_TIME(val)); ++} ++ ++static int + qca8k_port_enable(struct dsa_switch *ds, int port, + struct phy_device *phy) + { +@@ -2018,6 +2042,7 @@ static const struct dsa_switch_ops qca8k + .get_strings = qca8k_get_strings, + .get_ethtool_stats = qca8k_get_ethtool_stats, + .get_sset_count = qca8k_get_sset_count, ++ .set_ageing_time = qca8k_set_ageing_time, + .get_mac_eee = qca8k_get_mac_eee, + .set_mac_eee = qca8k_set_mac_eee, + .port_enable = qca8k_port_enable, +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -175,6 +175,9 @@ + #define QCA8K_VTU_FUNC1_BUSY BIT(31) + #define QCA8K_VTU_FUNC1_VID_MASK GENMASK(27, 16) + #define QCA8K_VTU_FUNC1_FULL BIT(4) ++#define QCA8K_REG_ATU_CTRL 0x618 ++#define QCA8K_ATU_AGE_TIME_MASK GENMASK(15, 0) ++#define QCA8K_ATU_AGE_TIME(x) FIELD_PREP(QCA8K_ATU_AGE_TIME_MASK, (x)) + #define QCA8K_REG_GLOBAL_FW_CTRL0 0x620 + #define QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN BIT(10) + #define QCA8K_REG_GLOBAL_FW_CTRL1 0x624 diff --git a/target/linux/generic/backport-5.15/761-v5.17-net-next-net-dsa-qca8k-add-support-for-mdb_add-del.patch b/target/linux/generic/backport-5.15/761-v5.17-net-next-net-dsa-qca8k-add-support-for-mdb_add-del.patch new file mode 100644 index 0000000000..8b97939ecb --- /dev/null +++ b/target/linux/generic/backport-5.15/761-v5.17-net-next-net-dsa-qca8k-add-support-for-mdb_add-del.patch @@ -0,0 +1,142 @@ +From ba8f870dfa635113ce6e8095a5eb1835ecde2e9e Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Mon, 22 Nov 2021 16:23:48 +0100 +Subject: net: dsa: qca8k: add support for mdb_add/del + +Add support for mdb add/del function. The ARL table is used to insert +the rule. The rule will be searched, deleted and reinserted with the +port mask updated. The function will check if the rule has to be updated +or insert directly with no deletion of the old rule. +If every port is removed from the port mask, the rule is removed. +The rule is set STATIC in the ARL table (aka it doesn't age) to not be +flushed by fast age function. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 99 insertions(+) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -436,6 +436,81 @@ qca8k_fdb_flush(struct qca8k_priv *priv) + } + + static int ++qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask, ++ const u8 *mac, u16 vid) ++{ ++ struct qca8k_fdb fdb = { 0 }; ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ++ qca8k_fdb_write(priv, vid, 0, mac, 0); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); ++ if (ret < 0) ++ goto exit; ++ ++ ret = qca8k_fdb_read(priv, &fdb); ++ if (ret < 0) ++ goto exit; ++ ++ /* Rule exist. Delete first */ ++ if (!fdb.aging) { ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); ++ if (ret) ++ goto exit; ++ } ++ ++ /* Add port to fdb portmask */ ++ fdb.port_mask |= port_mask; ++ ++ qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++static int ++qca8k_fdb_search_and_del(struct qca8k_priv *priv, u8 port_mask, ++ const u8 *mac, u16 vid) ++{ ++ struct qca8k_fdb fdb = { 0 }; ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ++ qca8k_fdb_write(priv, vid, 0, mac, 0); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); ++ if (ret < 0) ++ goto exit; ++ ++ /* Rule doesn't exist. Why delete? */ ++ if (!fdb.aging) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); ++ if (ret) ++ goto exit; ++ ++ /* Only port in the rule is this port. Don't re insert */ ++ if (fdb.port_mask == port_mask) ++ goto exit; ++ ++ /* Remove port from port mask */ ++ fdb.port_mask &= ~port_mask; ++ ++ qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++static int + qca8k_vlan_access(struct qca8k_priv *priv, enum qca8k_vlan_cmd cmd, u16 vid) + { + u32 reg; +@@ -1949,6 +2024,28 @@ qca8k_port_fdb_dump(struct dsa_switch *d + } + + static int ++qca8k_port_mdb_add(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ const u8 *addr = mdb->addr; ++ u16 vid = mdb->vid; ++ ++ return qca8k_fdb_search_and_insert(priv, BIT(port), addr, vid); ++} ++ ++static int ++qca8k_port_mdb_del(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ const u8 *addr = mdb->addr; ++ u16 vid = mdb->vid; ++ ++ return qca8k_fdb_search_and_del(priv, BIT(port), addr, vid); ++} ++ ++static int + qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, + struct netlink_ext_ack *extack) + { +@@ -2056,6 +2153,8 @@ static const struct dsa_switch_ops qca8k + .port_fdb_add = qca8k_port_fdb_add, + .port_fdb_del = qca8k_port_fdb_del, + .port_fdb_dump = qca8k_port_fdb_dump, ++ .port_mdb_add = qca8k_port_mdb_add, ++ .port_mdb_del = qca8k_port_mdb_del, + .port_vlan_filtering = qca8k_port_vlan_filtering, + .port_vlan_add = qca8k_port_vlan_add, + .port_vlan_del = qca8k_port_vlan_del, diff --git a/target/linux/generic/backport-5.15/762-v5.17-net-next-net-dsa-qca8k-add-support-for-mirror-mode.patch b/target/linux/generic/backport-5.15/762-v5.17-net-next-net-dsa-qca8k-add-support-for-mirror-mode.patch new file mode 100644 index 0000000000..dc5a22935f --- /dev/null +++ b/target/linux/generic/backport-5.15/762-v5.17-net-next-net-dsa-qca8k-add-support-for-mirror-mode.patch @@ -0,0 +1,155 @@ +From 2c1bdbc7e7560d7de754cad277d968d56bb1899e Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Tue, 23 Nov 2021 03:59:10 +0100 +Subject: net: dsa: qca8k: add support for mirror mode + +The switch supports mirror mode. Only one port can set as mirror port and +every other port can set to both ingress and egress mode. The mirror +port is disabled and reverted to normal operation once every port is +removed from sending packet to it. + +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ + drivers/net/dsa/qca8k.h | 4 +++ + 2 files changed, 99 insertions(+) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -2046,6 +2046,99 @@ qca8k_port_mdb_del(struct dsa_switch *ds + } + + static int ++qca8k_port_mirror_add(struct dsa_switch *ds, int port, ++ struct dsa_mall_mirror_tc_entry *mirror, ++ bool ingress) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int monitor_port, ret; ++ u32 reg, val; ++ ++ /* Check for existent entry */ ++ if ((ingress ? priv->mirror_rx : priv->mirror_tx) & BIT(port)) ++ return -EEXIST; ++ ++ ret = regmap_read(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, &val); ++ if (ret) ++ return ret; ++ ++ /* QCA83xx can have only one port set to mirror mode. ++ * Check that the correct port is requested and return error otherwise. ++ * When no mirror port is set, the values is set to 0xF ++ */ ++ monitor_port = FIELD_GET(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (monitor_port != 0xF && monitor_port != mirror->to_local_port) ++ return -EEXIST; ++ ++ /* Set the monitor port */ ++ val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, ++ mirror->to_local_port); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, ++ QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (ret) ++ return ret; ++ ++ if (ingress) { ++ reg = QCA8K_PORT_LOOKUP_CTRL(port); ++ val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; ++ } else { ++ reg = QCA8K_REG_PORT_HOL_CTRL1(port); ++ val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; ++ } ++ ++ ret = regmap_update_bits(priv->regmap, reg, val, val); ++ if (ret) ++ return ret; ++ ++ /* Track mirror port for tx and rx to decide when the ++ * mirror port has to be disabled. ++ */ ++ if (ingress) ++ priv->mirror_rx |= BIT(port); ++ else ++ priv->mirror_tx |= BIT(port); ++ ++ return 0; ++} ++ ++static void ++qca8k_port_mirror_del(struct dsa_switch *ds, int port, ++ struct dsa_mall_mirror_tc_entry *mirror) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ u32 reg, val; ++ int ret; ++ ++ if (mirror->ingress) { ++ reg = QCA8K_PORT_LOOKUP_CTRL(port); ++ val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; ++ } else { ++ reg = QCA8K_REG_PORT_HOL_CTRL1(port); ++ val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; ++ } ++ ++ ret = regmap_clear_bits(priv->regmap, reg, val); ++ if (ret) ++ goto err; ++ ++ if (mirror->ingress) ++ priv->mirror_rx &= ~BIT(port); ++ else ++ priv->mirror_tx &= ~BIT(port); ++ ++ /* No port set to send packet to mirror port. Disable mirror port */ ++ if (!priv->mirror_rx && !priv->mirror_tx) { ++ val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, 0xF); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, ++ QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (ret) ++ goto err; ++ } ++err: ++ dev_err(priv->dev, "Failed to del mirror port from %d", port); ++} ++ ++static int + qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, + struct netlink_ext_ack *extack) + { +@@ -2155,6 +2248,8 @@ static const struct dsa_switch_ops qca8k + .port_fdb_dump = qca8k_port_fdb_dump, + .port_mdb_add = qca8k_port_mdb_add, + .port_mdb_del = qca8k_port_mdb_del, ++ .port_mirror_add = qca8k_port_mirror_add, ++ .port_mirror_del = qca8k_port_mirror_del, + .port_vlan_filtering = qca8k_port_vlan_filtering, + .port_vlan_add = qca8k_port_vlan_add, + .port_vlan_del = qca8k_port_vlan_del, +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -180,6 +180,7 @@ + #define QCA8K_ATU_AGE_TIME(x) FIELD_PREP(QCA8K_ATU_AGE_TIME_MASK, (x)) + #define QCA8K_REG_GLOBAL_FW_CTRL0 0x620 + #define QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN BIT(10) ++#define QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM GENMASK(7, 4) + #define QCA8K_REG_GLOBAL_FW_CTRL1 0x624 + #define QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK GENMASK(30, 24) + #define QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK GENMASK(22, 16) +@@ -201,6 +202,7 @@ + #define QCA8K_PORT_LOOKUP_STATE_LEARNING QCA8K_PORT_LOOKUP_STATE(0x3) + #define QCA8K_PORT_LOOKUP_STATE_FORWARD QCA8K_PORT_LOOKUP_STATE(0x4) + #define QCA8K_PORT_LOOKUP_LEARN BIT(20) ++#define QCA8K_PORT_LOOKUP_ING_MIRROR_EN BIT(25) + + #define QCA8K_REG_GLOBAL_FC_THRESH 0x800 + #define QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK GENMASK(24, 16) +@@ -305,6 +307,8 @@ struct qca8k_ports_config { + struct qca8k_priv { + u8 switch_id; + u8 switch_revision; ++ u8 mirror_rx; ++ u8 mirror_tx; + bool legacy_phy_port_mapping; + struct qca8k_ports_config ports_config; + struct regmap *regmap; diff --git a/target/linux/generic/backport-5.15/763-v5.17-net-next-net-dsa-qca8k-add-LAG-support.patch b/target/linux/generic/backport-5.15/763-v5.17-net-next-net-dsa-qca8k-add-LAG-support.patch new file mode 100644 index 0000000000..b53f1288d5 --- /dev/null +++ b/target/linux/generic/backport-5.15/763-v5.17-net-next-net-dsa-qca8k-add-LAG-support.patch @@ -0,0 +1,288 @@ +From def975307c01191b6f0170048c3724b0ed3348af Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Tue, 23 Nov 2021 03:59:11 +0100 +Subject: net: dsa: qca8k: add LAG support + +Add LAG support to this switch. In Documentation this is described as +trunk mode. A max of 4 LAGs are supported and each can support up to 4 +port. The current tx mode supported is Hash mode with both L2 and L2+3 +mode. +When no port are present in the trunk, the trunk is disabled in the +switch. +When a port is disconnected, the traffic is redirected to the other +available port. +The hash mode is global and each LAG require to have the same hash mode +set. To change the hash mode when multiple LAG are configured, it's +required to remove each LAG and set the desired hash mode to the last. +An error is printed when it's asked to set a not supported hadh mode. + +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 177 ++++++++++++++++++++++++++++++++++++++++++++++++ + drivers/net/dsa/qca8k.h | 33 +++++++++ + 2 files changed, 210 insertions(+) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -1340,6 +1340,9 @@ qca8k_setup(struct dsa_switch *ds) + ds->ageing_time_min = 7000; + ds->ageing_time_max = 458745000; + ++ /* Set max number of LAGs supported */ ++ ds->num_lag_ids = QCA8K_NUM_LAGS; ++ + return 0; + } + +@@ -2226,6 +2229,178 @@ qca8k_get_tag_protocol(struct dsa_switch + return DSA_TAG_PROTO_QCA; + } + ++static bool ++qca8k_lag_can_offload(struct dsa_switch *ds, ++ struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ struct dsa_port *dp; ++ int id, members = 0; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ if (id < 0 || id >= ds->num_lag_ids) ++ return false; ++ ++ dsa_lag_foreach_port(dp, ds->dst, lag) ++ /* Includes the port joining the LAG */ ++ members++; ++ ++ if (members > QCA8K_NUM_PORTS_FOR_LAG) ++ return false; ++ ++ if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) ++ return false; ++ ++ if (info->hash_type != NETDEV_LAG_HASH_L2 || ++ info->hash_type != NETDEV_LAG_HASH_L23) ++ return false; ++ ++ return true; ++} ++ ++static int ++qca8k_lag_setup_hash(struct dsa_switch *ds, ++ struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ bool unique_lag = true; ++ int i, id; ++ u32 hash; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ ++ switch (info->hash_type) { ++ case NETDEV_LAG_HASH_L23: ++ hash |= QCA8K_TRUNK_HASH_SIP_EN; ++ hash |= QCA8K_TRUNK_HASH_DIP_EN; ++ fallthrough; ++ case NETDEV_LAG_HASH_L2: ++ hash |= QCA8K_TRUNK_HASH_SA_EN; ++ hash |= QCA8K_TRUNK_HASH_DA_EN; ++ break; ++ default: /* We should NEVER reach this */ ++ return -EOPNOTSUPP; ++ } ++ ++ /* Check if we are the unique configured LAG */ ++ dsa_lags_foreach_id(i, ds->dst) ++ if (i != id && dsa_lag_dev(ds->dst, i)) { ++ unique_lag = false; ++ break; ++ } ++ ++ /* Hash Mode is global. Make sure the same Hash Mode ++ * is set to all the 4 possible lag. ++ * If we are the unique LAG we can set whatever hash ++ * mode we want. ++ * To change hash mode it's needed to remove all LAG ++ * and change the mode with the latest. ++ */ ++ if (unique_lag) { ++ priv->lag_hash_mode = hash; ++ } else if (priv->lag_hash_mode != hash) { ++ netdev_err(lag, "Error: Mismateched Hash Mode across different lag is not supported\n"); ++ return -EOPNOTSUPP; ++ } ++ ++ return regmap_update_bits(priv->regmap, QCA8K_TRUNK_HASH_EN_CTRL, ++ QCA8K_TRUNK_HASH_MASK, hash); ++} ++ ++static int ++qca8k_lag_refresh_portmap(struct dsa_switch *ds, int port, ++ struct net_device *lag, bool delete) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret, id, i; ++ u32 val; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ ++ /* Read current port member */ ++ ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, &val); ++ if (ret) ++ return ret; ++ ++ /* Shift val to the correct trunk */ ++ val >>= QCA8K_REG_GOL_TRUNK_SHIFT(id); ++ val &= QCA8K_REG_GOL_TRUNK_MEMBER_MASK; ++ if (delete) ++ val &= ~BIT(port); ++ else ++ val |= BIT(port); ++ ++ /* Update port member. With empty portmap disable trunk */ ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, ++ QCA8K_REG_GOL_TRUNK_MEMBER(id) | ++ QCA8K_REG_GOL_TRUNK_EN(id), ++ !val << QCA8K_REG_GOL_TRUNK_SHIFT(id) | ++ val << QCA8K_REG_GOL_TRUNK_SHIFT(id)); ++ ++ /* Search empty member if adding or port on deleting */ ++ for (i = 0; i < QCA8K_NUM_PORTS_FOR_LAG; i++) { ++ ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), &val); ++ if (ret) ++ return ret; ++ ++ val >>= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i); ++ val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_MASK; ++ ++ if (delete) { ++ /* If port flagged to be disabled assume this member is ++ * empty ++ */ ++ if (val != QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) ++ continue; ++ ++ val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK; ++ if (val != port) ++ continue; ++ } else { ++ /* If port flagged to be enabled assume this member is ++ * already set ++ */ ++ if (val == QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) ++ continue; ++ } ++ ++ /* We have found the member to add/remove */ ++ break; ++ } ++ ++ /* Set port in the correct port mask or disable port if in delete mode */ ++ return regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), ++ QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN(id, i) | ++ QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT(id, i), ++ !delete << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i) | ++ port << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i)); ++} ++ ++static int ++qca8k_port_lag_join(struct dsa_switch *ds, int port, ++ struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ int ret; ++ ++ if (!qca8k_lag_can_offload(ds, lag, info)) ++ return -EOPNOTSUPP; ++ ++ ret = qca8k_lag_setup_hash(ds, lag, info); ++ if (ret) ++ return ret; ++ ++ return qca8k_lag_refresh_portmap(ds, port, lag, false); ++} ++ ++static int ++qca8k_port_lag_leave(struct dsa_switch *ds, int port, ++ struct net_device *lag) ++{ ++ return qca8k_lag_refresh_portmap(ds, port, lag, true); ++} ++ + static const struct dsa_switch_ops qca8k_switch_ops = { + .get_tag_protocol = qca8k_get_tag_protocol, + .setup = qca8k_setup, +@@ -2259,6 +2434,8 @@ static const struct dsa_switch_ops qca8k + .phylink_mac_link_down = qca8k_phylink_mac_link_down, + .phylink_mac_link_up = qca8k_phylink_mac_link_up, + .get_phy_flags = qca8k_get_phy_flags, ++ .port_lag_join = qca8k_port_lag_join, ++ .port_lag_leave = qca8k_port_lag_leave, + }; + + static int qca8k_read_switch_id(struct qca8k_priv *priv) +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -15,6 +15,8 @@ + #define QCA8K_NUM_PORTS 7 + #define QCA8K_NUM_CPU_PORTS 2 + #define QCA8K_MAX_MTU 9000 ++#define QCA8K_NUM_LAGS 4 ++#define QCA8K_NUM_PORTS_FOR_LAG 4 + + #define PHY_ID_QCA8327 0x004dd034 + #define QCA8K_ID_QCA8327 0x12 +@@ -122,6 +124,14 @@ + #define QCA8K_REG_EEE_CTRL 0x100 + #define QCA8K_REG_EEE_CTRL_LPI_EN(_i) ((_i + 1) * 2) + ++/* TRUNK_HASH_EN registers */ ++#define QCA8K_TRUNK_HASH_EN_CTRL 0x270 ++#define QCA8K_TRUNK_HASH_SIP_EN BIT(3) ++#define QCA8K_TRUNK_HASH_DIP_EN BIT(2) ++#define QCA8K_TRUNK_HASH_SA_EN BIT(1) ++#define QCA8K_TRUNK_HASH_DA_EN BIT(0) ++#define QCA8K_TRUNK_HASH_MASK GENMASK(3, 0) ++ + /* ACL registers */ + #define QCA8K_REG_PORT_VLAN_CTRL0(_i) (0x420 + (_i * 8)) + #define QCA8K_PORT_VLAN_CVID_MASK GENMASK(27, 16) +@@ -204,6 +214,28 @@ + #define QCA8K_PORT_LOOKUP_LEARN BIT(20) + #define QCA8K_PORT_LOOKUP_ING_MIRROR_EN BIT(25) + ++#define QCA8K_REG_GOL_TRUNK_CTRL0 0x700 ++/* 4 max trunk first ++ * first 6 bit for member bitmap ++ * 7th bit is to enable trunk port ++ */ ++#define QCA8K_REG_GOL_TRUNK_SHIFT(_i) ((_i) * 8) ++#define QCA8K_REG_GOL_TRUNK_EN_MASK BIT(7) ++#define QCA8K_REG_GOL_TRUNK_EN(_i) (QCA8K_REG_GOL_TRUNK_EN_MASK << QCA8K_REG_GOL_TRUNK_SHIFT(_i)) ++#define QCA8K_REG_GOL_TRUNK_MEMBER_MASK GENMASK(6, 0) ++#define QCA8K_REG_GOL_TRUNK_MEMBER(_i) (QCA8K_REG_GOL_TRUNK_MEMBER_MASK << QCA8K_REG_GOL_TRUNK_SHIFT(_i)) ++/* 0x704 for TRUNK 0-1 --- 0x708 for TRUNK 2-3 */ ++#define QCA8K_REG_GOL_TRUNK_CTRL(_i) (0x704 + (((_i) / 2) * 4)) ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_MASK GENMASK(3, 0) ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK BIT(3) ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK GENMASK(2, 0) ++#define QCA8K_REG_GOL_TRUNK_ID_SHIFT(_i) (((_i) / 2) * 16) ++#define QCA8K_REG_GOL_MEM_ID_SHIFT(_i) ((_i) * 4) ++/* Complex shift: FIRST shift for port THEN shift for trunk */ ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(_i, _j) (QCA8K_REG_GOL_MEM_ID_SHIFT(_j) + QCA8K_REG_GOL_TRUNK_ID_SHIFT(_i)) ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN(_i, _j) (QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(_i, _j)) ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT(_i, _j) (QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(_i, _j)) ++ + #define QCA8K_REG_GLOBAL_FC_THRESH 0x800 + #define QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK GENMASK(24, 16) + #define QCA8K_GLOBAL_FC_GOL_XON_THRES(x) FIELD_PREP(QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK, x) +@@ -309,6 +341,7 @@ struct qca8k_priv { + u8 switch_revision; + u8 mirror_rx; + u8 mirror_tx; ++ u8 lag_hash_mode; + bool legacy_phy_port_mapping; + struct qca8k_ports_config ports_config; + struct regmap *regmap; diff --git a/target/linux/generic/backport-5.15/764-v5.17-net-next-net-dsa-qca8k-fix-warning-in-LAG-feature.patch b/target/linux/generic/backport-5.15/764-v5.17-net-next-net-dsa-qca8k-fix-warning-in-LAG-feature.patch new file mode 100644 index 0000000000..7d811be11c --- /dev/null +++ b/target/linux/generic/backport-5.15/764-v5.17-net-next-net-dsa-qca8k-fix-warning-in-LAG-feature.patch @@ -0,0 +1,40 @@ +From 0898ca67b86e14207d4feb3f3fea8b87cec5aab1 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Tue, 23 Nov 2021 16:44:46 +0100 +Subject: net: dsa: qca8k: fix warning in LAG feature + +Fix warning reported by bot. +Make sure hash is init to 0 and fix wrong logic for hash_type in +qca8k_lag_can_offload. + +Reported-by: kernel test robot +Fixes: def975307c01 ("net: dsa: qca8k: add LAG support") +Signed-off-by: Ansuel Smith +Reviewed-by: Florian Fainelli +Link: https://lore.kernel.org/r/20211123154446.31019-1-ansuelsmth@gmail.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca8k.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -2251,7 +2251,7 @@ qca8k_lag_can_offload(struct dsa_switch + if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) + return false; + +- if (info->hash_type != NETDEV_LAG_HASH_L2 || ++ if (info->hash_type != NETDEV_LAG_HASH_L2 && + info->hash_type != NETDEV_LAG_HASH_L23) + return false; + +@@ -2265,8 +2265,8 @@ qca8k_lag_setup_hash(struct dsa_switch * + { + struct qca8k_priv *priv = ds->priv; + bool unique_lag = true; ++ u32 hash = 0; + int i, id; +- u32 hash; + + id = dsa_lag_id(ds->dst, lag); + diff --git a/target/linux/generic/backport-5.15/765-v5.17-01-net-next-net-dsa-reorder-PHY-initialization-with-MTU-setup-in.patch b/target/linux/generic/backport-5.15/765-v5.17-01-net-next-net-dsa-reorder-PHY-initialization-with-MTU-setup-in.patch new file mode 100644 index 0000000000..77cf63b809 --- /dev/null +++ b/target/linux/generic/backport-5.15/765-v5.17-01-net-next-net-dsa-reorder-PHY-initialization-with-MTU-setup-in.patch @@ -0,0 +1,52 @@ +From 904e112ad431492b34f235f59738e8312802bbf9 Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Thu, 6 Jan 2022 01:11:12 +0200 +Subject: [PATCH 1/6] net: dsa: reorder PHY initialization with MTU setup in + slave.c + +In dsa_slave_create() there are 2 sections that take rtnl_lock(): +MTU change and netdev registration. They are separated by PHY +initialization. + +There isn't any strict ordering requirement except for the fact that +netdev registration should be last. Therefore, we can perform the MTU +change a bit later, after the PHY setup. A future change will then be +able to merge the two rtnl_lock sections into one. + +Signed-off-by: Vladimir Oltean +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + net/dsa/slave.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +--- a/net/dsa/slave.c ++++ b/net/dsa/slave.c +@@ -1977,13 +1977,6 @@ int dsa_slave_create(struct dsa_port *po + port->slave = slave_dev; + dsa_slave_setup_tagger(slave_dev); + +- rtnl_lock(); +- ret = dsa_slave_change_mtu(slave_dev, ETH_DATA_LEN); +- rtnl_unlock(); +- if (ret && ret != -EOPNOTSUPP) +- dev_warn(ds->dev, "nonfatal error %d setting MTU to %d on port %d\n", +- ret, ETH_DATA_LEN, port->index); +- + netif_carrier_off(slave_dev); + + ret = dsa_slave_phy_setup(slave_dev); +@@ -1995,6 +1988,13 @@ int dsa_slave_create(struct dsa_port *po + } + + rtnl_lock(); ++ ret = dsa_slave_change_mtu(slave_dev, ETH_DATA_LEN); ++ rtnl_unlock(); ++ if (ret && ret != -EOPNOTSUPP) ++ dev_warn(ds->dev, "nonfatal error %d setting MTU to %d on port %d\n", ++ ret, ETH_DATA_LEN, port->index); ++ ++ rtnl_lock(); + + ret = register_netdevice(slave_dev); + if (ret) { diff --git a/target/linux/generic/backport-5.15/765-v5.17-02-net-next-net-dsa-merge-rtnl_lock-sections-in-dsa_slave_create.patch b/target/linux/generic/backport-5.15/765-v5.17-02-net-next-net-dsa-merge-rtnl_lock-sections-in-dsa_slave_create.patch new file mode 100644 index 0000000000..50aa5d8f0d --- /dev/null +++ b/target/linux/generic/backport-5.15/765-v5.17-02-net-next-net-dsa-merge-rtnl_lock-sections-in-dsa_slave_create.patch @@ -0,0 +1,34 @@ +From e31dbd3b6aba585231cd84a87adeb22e7c6a8c19 Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Thu, 6 Jan 2022 01:11:13 +0200 +Subject: [PATCH 2/6] net: dsa: merge rtnl_lock sections in dsa_slave_create + +Currently dsa_slave_create() has two sequences of rtnl_lock/rtnl_unlock +in a row. Remove the rtnl_unlock() and rtnl_lock() in between, such that +the operation can execute slighly faster. + +Signed-off-by: Vladimir Oltean +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + net/dsa/slave.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/net/dsa/slave.c ++++ b/net/dsa/slave.c +@@ -1988,14 +1988,12 @@ int dsa_slave_create(struct dsa_port *po + } + + rtnl_lock(); ++ + ret = dsa_slave_change_mtu(slave_dev, ETH_DATA_LEN); +- rtnl_unlock(); + if (ret && ret != -EOPNOTSUPP) + dev_warn(ds->dev, "nonfatal error %d setting MTU to %d on port %d\n", + ret, ETH_DATA_LEN, port->index); + +- rtnl_lock(); +- + ret = register_netdevice(slave_dev); + if (ret) { + netdev_err(master, "error %d registering interface %s\n", diff --git a/target/linux/generic/backport-5.15/765-v5.17-03-net-next-net-dsa-stop-updating-master-MTU-from-master.c.patch b/target/linux/generic/backport-5.15/765-v5.17-03-net-next-net-dsa-stop-updating-master-MTU-from-master.c.patch new file mode 100644 index 0000000000..6c7aad6928 --- /dev/null +++ b/target/linux/generic/backport-5.15/765-v5.17-03-net-next-net-dsa-stop-updating-master-MTU-from-master.c.patch @@ -0,0 +1,91 @@ +From a1ff94c2973c43bc1e2677ac63ebb15b1d1ff846 Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Thu, 6 Jan 2022 01:11:14 +0200 +Subject: [PATCH 3/6] net: dsa: stop updating master MTU from master.c + +At present there are two paths for changing the MTU of the DSA master. + +The first is: + +dsa_tree_setup +-> dsa_tree_setup_ports + -> dsa_port_setup + -> dsa_slave_create + -> dsa_slave_change_mtu + -> dev_set_mtu(master) + +The second is: + +dsa_tree_setup +-> dsa_tree_setup_master + -> dsa_master_setup + -> dev_set_mtu(dev) + +So the dev_set_mtu() call from dsa_master_setup() has been effectively +superseded by the dsa_slave_change_mtu(slave_dev, ETH_DATA_LEN) that is +done from dsa_slave_create() for each user port. The later function also +updates the master MTU according to the largest user port MTU from the +tree. Therefore, updating the master MTU through a separate code path +isn't needed. + +Signed-off-by: Vladimir Oltean +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + net/dsa/master.c | 25 +------------------------ + 1 file changed, 1 insertion(+), 24 deletions(-) + +--- a/net/dsa/master.c ++++ b/net/dsa/master.c +@@ -329,28 +329,13 @@ static const struct attribute_group dsa_ + .attrs = dsa_slave_attrs, + }; + +-static void dsa_master_reset_mtu(struct net_device *dev) +-{ +- int err; +- +- rtnl_lock(); +- err = dev_set_mtu(dev, ETH_DATA_LEN); +- if (err) +- netdev_dbg(dev, +- "Unable to reset MTU to exclude DSA overheads\n"); +- rtnl_unlock(); +-} +- + static struct lock_class_key dsa_master_addr_list_lock_key; + + int dsa_master_setup(struct net_device *dev, struct dsa_port *cpu_dp) + { +- const struct dsa_device_ops *tag_ops = cpu_dp->tag_ops; + struct dsa_switch *ds = cpu_dp->ds; + struct device_link *consumer_link; +- int mtu, ret; +- +- mtu = ETH_DATA_LEN + dsa_tag_protocol_overhead(tag_ops); ++ int ret; + + /* The DSA master must use SET_NETDEV_DEV for this to work. */ + consumer_link = device_link_add(ds->dev, dev->dev.parent, +@@ -360,13 +345,6 @@ int dsa_master_setup(struct net_device * + "Failed to create a device link to DSA switch %s\n", + dev_name(ds->dev)); + +- rtnl_lock(); +- ret = dev_set_mtu(dev, mtu); +- rtnl_unlock(); +- if (ret) +- netdev_warn(dev, "error %d setting MTU to %d to include DSA overhead\n", +- ret, mtu); +- + /* If we use a tagging format that doesn't have an ethertype + * field, make sure that all packets from this point on get + * sent to the tag format's receive function. +@@ -404,7 +382,6 @@ void dsa_master_teardown(struct net_devi + sysfs_remove_group(&dev->dev.kobj, &dsa_group); + dsa_netdev_ops_set(dev, NULL); + dsa_master_ethtool_teardown(dev); +- dsa_master_reset_mtu(dev); + dsa_master_set_promiscuity(dev, -1); + + dev->dsa_ptr = NULL; diff --git a/target/linux/generic/backport-5.15/765-v5.17-04-net-next-net-dsa-hold-rtnl_mutex-when-calling-dsa_master_-set.patch b/target/linux/generic/backport-5.15/765-v5.17-04-net-next-net-dsa-hold-rtnl_mutex-when-calling-dsa_master_-set.patch new file mode 100644 index 0000000000..e331226fc4 --- /dev/null +++ b/target/linux/generic/backport-5.15/765-v5.17-04-net-next-net-dsa-hold-rtnl_mutex-when-calling-dsa_master_-set.patch @@ -0,0 +1,78 @@ +From c146f9bc195a9dc3ad7fd000a14540e7c9df952d Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Thu, 6 Jan 2022 01:11:15 +0200 +Subject: [PATCH 4/6] net: dsa: hold rtnl_mutex when calling + dsa_master_{setup,teardown} + +DSA needs to simulate master tracking events when a binding is first +with a DSA master established and torn down, in order to give drivers +the simplifying guarantee that ->master_state_change calls are made +only when the master's readiness state to pass traffic changes. +master_state_change() provide a operational bool that DSA driver can use +to understand if DSA master is operational or not. +To avoid races, we need to block the reception of +NETDEV_UP/NETDEV_CHANGE/NETDEV_GOING_DOWN events in the netdev notifier +chain while we are changing the master's dev->dsa_ptr (this changes what +netdev_uses_dsa(dev) reports). + +The dsa_master_setup() and dsa_master_teardown() functions optionally +require the rtnl_mutex to be held, if the tagger needs the master to be +promiscuous, these functions call dev_set_promiscuity(). Move the +rtnl_lock() from that function and make it top-level. + +Signed-off-by: Vladimir Oltean +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + net/dsa/dsa2.c | 8 ++++++++ + net/dsa/master.c | 4 ++-- + 2 files changed, 10 insertions(+), 2 deletions(-) + +--- a/net/dsa/dsa2.c ++++ b/net/dsa/dsa2.c +@@ -1034,6 +1034,8 @@ static int dsa_tree_setup_master(struct + struct dsa_port *dp; + int err; + ++ rtnl_lock(); ++ + list_for_each_entry(dp, &dst->ports, list) { + if (dsa_port_is_cpu(dp)) { + err = dsa_master_setup(dp->master, dp); +@@ -1042,6 +1044,8 @@ static int dsa_tree_setup_master(struct + } + } + ++ rtnl_unlock(); ++ + return 0; + } + +@@ -1049,9 +1053,13 @@ static void dsa_tree_teardown_master(str + { + struct dsa_port *dp; + ++ rtnl_lock(); ++ + list_for_each_entry(dp, &dst->ports, list) + if (dsa_port_is_cpu(dp)) + dsa_master_teardown(dp->master); ++ ++ rtnl_unlock(); + } + + static int dsa_tree_setup_lags(struct dsa_switch_tree *dst) +--- a/net/dsa/master.c ++++ b/net/dsa/master.c +@@ -266,9 +266,9 @@ static void dsa_master_set_promiscuity(s + if (!ops->promisc_on_master) + return; + +- rtnl_lock(); ++ ASSERT_RTNL(); ++ + dev_set_promiscuity(dev, inc); +- rtnl_unlock(); + } + + static ssize_t tagging_show(struct device *d, struct device_attribute *attr, diff --git a/target/linux/generic/backport-5.15/765-v5.17-05-net-next-net-dsa-first-set-up-shared-ports-then-non-shared-po.patch b/target/linux/generic/backport-5.15/765-v5.17-05-net-next-net-dsa-first-set-up-shared-ports-then-non-shared-po.patch new file mode 100644 index 0000000000..e6472c61da --- /dev/null +++ b/target/linux/generic/backport-5.15/765-v5.17-05-net-next-net-dsa-first-set-up-shared-ports-then-non-shared-po.patch @@ -0,0 +1,118 @@ +From 1e3f407f3cacc5dcfe27166c412ed9bc263d82bf Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Thu, 6 Jan 2022 01:11:16 +0200 +Subject: [PATCH 5/6] net: dsa: first set up shared ports, then non-shared + ports + +After commit a57d8c217aad ("net: dsa: flush switchdev workqueue before +tearing down CPU/DSA ports"), the port setup and teardown procedure +became asymmetric. + +The fact of the matter is that user ports need the shared ports to be up +before they can be used for CPU-initiated termination. And since we +register net devices for the user ports, those won't be functional until +we also call the setup for the shared (CPU, DSA) ports. But we may do +that later, depending on the port numbering scheme of the hardware we +are dealing with. + +It just makes sense that all shared ports are brought up before any user +port is. I can't pinpoint any issue due to the current behavior, but +let's change it nonetheless, for consistency's sake. + +Signed-off-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + net/dsa/dsa2.c | 50 +++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 37 insertions(+), 13 deletions(-) + +--- a/net/dsa/dsa2.c ++++ b/net/dsa/dsa2.c +@@ -999,23 +999,28 @@ static void dsa_tree_teardown_switches(s + dsa_switch_teardown(dp->ds); + } + +-static int dsa_tree_setup_switches(struct dsa_switch_tree *dst) ++/* Bring shared ports up first, then non-shared ports */ ++static int dsa_tree_setup_ports(struct dsa_switch_tree *dst) + { + struct dsa_port *dp; +- int err; ++ int err = 0; + + list_for_each_entry(dp, &dst->ports, list) { +- err = dsa_switch_setup(dp->ds); +- if (err) +- goto teardown; ++ if (dsa_port_is_dsa(dp) || dsa_port_is_cpu(dp)) { ++ err = dsa_port_setup(dp); ++ if (err) ++ goto teardown; ++ } + } + + list_for_each_entry(dp, &dst->ports, list) { +- err = dsa_port_setup(dp); +- if (err) { +- err = dsa_port_reinit_as_unused(dp); +- if (err) +- goto teardown; ++ if (dsa_port_is_user(dp) || dsa_port_is_unused(dp)) { ++ err = dsa_port_setup(dp); ++ if (err) { ++ err = dsa_port_reinit_as_unused(dp); ++ if (err) ++ goto teardown; ++ } + } + } + +@@ -1024,7 +1029,21 @@ static int dsa_tree_setup_switches(struc + teardown: + dsa_tree_teardown_ports(dst); + +- dsa_tree_teardown_switches(dst); ++ return err; ++} ++ ++static int dsa_tree_setup_switches(struct dsa_switch_tree *dst) ++{ ++ struct dsa_port *dp; ++ int err = 0; ++ ++ list_for_each_entry(dp, &dst->ports, list) { ++ err = dsa_switch_setup(dp->ds); ++ if (err) { ++ dsa_tree_teardown_switches(dst); ++ break; ++ } ++ } + + return err; + } +@@ -1111,10 +1130,14 @@ static int dsa_tree_setup(struct dsa_swi + if (err) + goto teardown_cpu_ports; + +- err = dsa_tree_setup_master(dst); ++ err = dsa_tree_setup_ports(dst); + if (err) + goto teardown_switches; + ++ err = dsa_tree_setup_master(dst); ++ if (err) ++ goto teardown_ports; ++ + err = dsa_tree_setup_lags(dst); + if (err) + goto teardown_master; +@@ -1127,8 +1150,9 @@ static int dsa_tree_setup(struct dsa_swi + + teardown_master: + dsa_tree_teardown_master(dst); +-teardown_switches: ++teardown_ports: + dsa_tree_teardown_ports(dst); ++teardown_switches: + dsa_tree_teardown_switches(dst); + teardown_cpu_ports: + dsa_tree_teardown_cpu_ports(dst); diff --git a/target/linux/generic/backport-5.15/765-v5.17-06-net-next-net-dsa-setup-master-before-ports.patch b/target/linux/generic/backport-5.15/765-v5.17-06-net-next-net-dsa-setup-master-before-ports.patch new file mode 100644 index 0000000000..93cad0c98a --- /dev/null +++ b/target/linux/generic/backport-5.15/765-v5.17-06-net-next-net-dsa-setup-master-before-ports.patch @@ -0,0 +1,115 @@ +From 11fd667dac315ea3f2469961f6d2869271a46cae Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Thu, 6 Jan 2022 01:11:17 +0200 +Subject: [PATCH 6/6] net: dsa: setup master before ports + +It is said that as soon as a network interface is registered, all its +resources should have already been prepared, so that it is available for +sending and receiving traffic. One of the resources needed by a DSA +slave interface is the master. + +dsa_tree_setup +-> dsa_tree_setup_ports + -> dsa_port_setup + -> dsa_slave_create + -> register_netdevice +-> dsa_tree_setup_master + -> dsa_master_setup + -> sets up master->dsa_ptr, which enables reception + +Therefore, there is a short period of time after register_netdevice() +during which the master isn't prepared to pass traffic to the DSA layer +(master->dsa_ptr is checked by eth_type_trans). Same thing during +unregistration, there is a time frame in which packets might be missed. + +Note that this change opens us to another race: dsa_master_find_slave() +will get invoked potentially earlier than the slave creation, and later +than the slave deletion. Since dp->slave starts off as a NULL pointer, +the earlier calls aren't a problem, but the later calls are. To avoid +use-after-free, we should zeroize dp->slave before calling +dsa_slave_destroy(). + +In practice I cannot really test real life improvements brought by this +change, since in my systems, netdevice creation races with PHY autoneg +which takes a few seconds to complete, and that masks quite a few races. +Effects might be noticeable in a setup with fixed links all the way to +an external system. + +Signed-off-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + net/dsa/dsa2.c | 23 +++++++++++++---------- + 1 file changed, 13 insertions(+), 10 deletions(-) + +--- a/net/dsa/dsa2.c ++++ b/net/dsa/dsa2.c +@@ -545,6 +545,7 @@ static void dsa_port_teardown(struct dsa + struct devlink_port *dlp = &dp->devlink_port; + struct dsa_switch *ds = dp->ds; + struct dsa_mac_addr *a, *tmp; ++ struct net_device *slave; + + if (!dp->setup) + return; +@@ -566,9 +567,11 @@ static void dsa_port_teardown(struct dsa + dsa_port_link_unregister_of(dp); + break; + case DSA_PORT_TYPE_USER: +- if (dp->slave) { +- dsa_slave_destroy(dp->slave); ++ slave = dp->slave; ++ ++ if (slave) { + dp->slave = NULL; ++ dsa_slave_destroy(slave); + } + break; + } +@@ -1130,17 +1133,17 @@ static int dsa_tree_setup(struct dsa_swi + if (err) + goto teardown_cpu_ports; + +- err = dsa_tree_setup_ports(dst); ++ err = dsa_tree_setup_master(dst); + if (err) + goto teardown_switches; + +- err = dsa_tree_setup_master(dst); ++ err = dsa_tree_setup_ports(dst); + if (err) +- goto teardown_ports; ++ goto teardown_master; + + err = dsa_tree_setup_lags(dst); + if (err) +- goto teardown_master; ++ goto teardown_ports; + + dst->setup = true; + +@@ -1148,10 +1151,10 @@ static int dsa_tree_setup(struct dsa_swi + + return 0; + +-teardown_master: +- dsa_tree_teardown_master(dst); + teardown_ports: + dsa_tree_teardown_ports(dst); ++teardown_master: ++ dsa_tree_teardown_master(dst); + teardown_switches: + dsa_tree_teardown_switches(dst); + teardown_cpu_ports: +@@ -1169,10 +1172,10 @@ static void dsa_tree_teardown(struct dsa + + dsa_tree_teardown_lags(dst); + +- dsa_tree_teardown_master(dst); +- + dsa_tree_teardown_ports(dst); + ++ dsa_tree_teardown_master(dst); ++ + dsa_tree_teardown_switches(dst); + + dsa_tree_teardown_cpu_ports(dst); diff --git a/target/linux/generic/backport-5.15/766-v5.18-01-net-dsa-provide-switch-operations-for-tracking-the-m.patch b/target/linux/generic/backport-5.15/766-v5.18-01-net-dsa-provide-switch-operations-for-tracking-the-m.patch new file mode 100644 index 0000000000..bffdcb2881 --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-01-net-dsa-provide-switch-operations-for-tracking-the-m.patch @@ -0,0 +1,254 @@ +From 295ab96f478d0fa56393e85406f19a867e26ce22 Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Wed, 2 Feb 2022 01:03:20 +0100 +Subject: [PATCH 01/16] net: dsa: provide switch operations for tracking the + master state + +Certain drivers may need to send management traffic to the switch for +things like register access, FDB dump, etc, to accelerate what their +slow bus (SPI, I2C, MDIO) can already do. + +Ethernet is faster (especially in bulk transactions) but is also more +unreliable, since the user may decide to bring the DSA master down (or +not bring it up), therefore severing the link between the host and the +attached switch. + +Drivers needing Ethernet-based register access already should have +fallback logic to the slow bus if the Ethernet method fails, but that +fallback may be based on a timeout, and the I/O to the switch may slow +down to a halt if the master is down, because every Ethernet packet will +have to time out. The driver also doesn't have the option to turn off +Ethernet-based I/O momentarily, because it wouldn't know when to turn it +back on. + +Which is where this change comes in. By tracking NETDEV_CHANGE, +NETDEV_UP and NETDEV_GOING_DOWN events on the DSA master, we should know +the exact interval of time during which this interface is reliably +available for traffic. Provide this information to switches so they can +use it as they wish. + +An helper is added dsa_port_master_is_operational() to check if a master +port is operational. + +Signed-off-by: Vladimir Oltean +Signed-off-by: Ansuel Smith +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + include/net/dsa.h | 17 +++++++++++++++++ + net/dsa/dsa2.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + net/dsa/dsa_priv.h | 13 +++++++++++++ + net/dsa/slave.c | 32 ++++++++++++++++++++++++++++++++ + net/dsa/switch.c | 15 +++++++++++++++ + 5 files changed, 123 insertions(+) + +--- a/include/net/dsa.h ++++ b/include/net/dsa.h +@@ -291,6 +291,10 @@ struct dsa_port { + struct list_head mdbs; + + bool setup; ++ /* Master state bits, valid only on CPU ports */ ++ u8 master_admin_up:1; ++ u8 master_oper_up:1; ++ + }; + + /* TODO: ideally DSA ports would have a single dp->link_dp member, +@@ -456,6 +460,12 @@ static inline bool dsa_port_is_unused(st + return dp->type == DSA_PORT_TYPE_UNUSED; + } + ++static inline bool dsa_port_master_is_operational(struct dsa_port *dp) ++{ ++ return dsa_port_is_cpu(dp) && dp->master_admin_up && ++ dp->master_oper_up; ++} ++ + static inline bool dsa_is_unused_port(struct dsa_switch *ds, int p) + { + return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_UNUSED; +@@ -949,6 +959,13 @@ struct dsa_switch_ops { + int (*tag_8021q_vlan_add)(struct dsa_switch *ds, int port, u16 vid, + u16 flags); + int (*tag_8021q_vlan_del)(struct dsa_switch *ds, int port, u16 vid); ++ ++ /* ++ * DSA master tracking operations ++ */ ++ void (*master_state_change)(struct dsa_switch *ds, ++ const struct net_device *master, ++ bool operational); + }; + + #define DSA_DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes) \ +--- a/net/dsa/dsa2.c ++++ b/net/dsa/dsa2.c +@@ -1275,6 +1275,52 @@ out_unlock: + return err; + } + ++static void dsa_tree_master_state_change(struct dsa_switch_tree *dst, ++ struct net_device *master) ++{ ++ struct dsa_notifier_master_state_info info; ++ struct dsa_port *cpu_dp = master->dsa_ptr; ++ ++ info.master = master; ++ info.operational = dsa_port_master_is_operational(cpu_dp); ++ ++ dsa_tree_notify(dst, DSA_NOTIFIER_MASTER_STATE_CHANGE, &info); ++} ++ ++void dsa_tree_master_admin_state_change(struct dsa_switch_tree *dst, ++ struct net_device *master, ++ bool up) ++{ ++ struct dsa_port *cpu_dp = master->dsa_ptr; ++ bool notify = false; ++ ++ if ((dsa_port_master_is_operational(cpu_dp)) != ++ (up && cpu_dp->master_oper_up)) ++ notify = true; ++ ++ cpu_dp->master_admin_up = up; ++ ++ if (notify) ++ dsa_tree_master_state_change(dst, master); ++} ++ ++void dsa_tree_master_oper_state_change(struct dsa_switch_tree *dst, ++ struct net_device *master, ++ bool up) ++{ ++ struct dsa_port *cpu_dp = master->dsa_ptr; ++ bool notify = false; ++ ++ if ((dsa_port_master_is_operational(cpu_dp)) != ++ (cpu_dp->master_admin_up && up)) ++ notify = true; ++ ++ cpu_dp->master_oper_up = up; ++ ++ if (notify) ++ dsa_tree_master_state_change(dst, master); ++} ++ + static struct dsa_port *dsa_port_touch(struct dsa_switch *ds, int index) + { + struct dsa_switch_tree *dst = ds->dst; +--- a/net/dsa/dsa_priv.h ++++ b/net/dsa/dsa_priv.h +@@ -45,6 +45,7 @@ enum { + DSA_NOTIFIER_MRP_DEL_RING_ROLE, + DSA_NOTIFIER_TAG_8021Q_VLAN_ADD, + DSA_NOTIFIER_TAG_8021Q_VLAN_DEL, ++ DSA_NOTIFIER_MASTER_STATE_CHANGE, + }; + + /* DSA_NOTIFIER_AGEING_TIME */ +@@ -127,6 +128,12 @@ struct dsa_notifier_tag_8021q_vlan_info + u16 vid; + }; + ++/* DSA_NOTIFIER_MASTER_STATE_CHANGE */ ++struct dsa_notifier_master_state_info { ++ const struct net_device *master; ++ bool operational; ++}; ++ + struct dsa_switchdev_event_work { + struct dsa_switch *ds; + int port; +@@ -549,6 +556,12 @@ int dsa_tree_change_tag_proto(struct dsa + struct net_device *master, + const struct dsa_device_ops *tag_ops, + const struct dsa_device_ops *old_tag_ops); ++void dsa_tree_master_admin_state_change(struct dsa_switch_tree *dst, ++ struct net_device *master, ++ bool up); ++void dsa_tree_master_oper_state_change(struct dsa_switch_tree *dst, ++ struct net_device *master, ++ bool up); + int dsa_bridge_num_get(const struct net_device *bridge_dev, int max); + void dsa_bridge_num_put(const struct net_device *bridge_dev, int bridge_num); + +--- a/net/dsa/slave.c ++++ b/net/dsa/slave.c +@@ -2311,6 +2311,36 @@ static int dsa_slave_netdevice_event(str + err = dsa_port_lag_change(dp, info->lower_state_info); + return notifier_from_errno(err); + } ++ case NETDEV_CHANGE: ++ case NETDEV_UP: { ++ /* Track state of master port. ++ * DSA driver may require the master port (and indirectly ++ * the tagger) to be available for some special operation. ++ */ ++ if (netdev_uses_dsa(dev)) { ++ struct dsa_port *cpu_dp = dev->dsa_ptr; ++ struct dsa_switch_tree *dst = cpu_dp->ds->dst; ++ ++ /* Track when the master port is UP */ ++ dsa_tree_master_oper_state_change(dst, dev, ++ netif_oper_up(dev)); ++ ++ /* Track when the master port is ready and can accept ++ * packet. ++ * NETDEV_UP event is not enough to flag a port as ready. ++ * We also have to wait for linkwatch_do_dev to dev_activate ++ * and emit a NETDEV_CHANGE event. ++ * We check if a master port is ready by checking if the dev ++ * have a qdisc assigned and is not noop. ++ */ ++ dsa_tree_master_admin_state_change(dst, dev, ++ !qdisc_tx_is_noop(dev)); ++ ++ return NOTIFY_OK; ++ } ++ ++ return NOTIFY_DONE; ++ } + case NETDEV_GOING_DOWN: { + struct dsa_port *dp, *cpu_dp; + struct dsa_switch_tree *dst; +@@ -2322,6 +2352,8 @@ static int dsa_slave_netdevice_event(str + cpu_dp = dev->dsa_ptr; + dst = cpu_dp->ds->dst; + ++ dsa_tree_master_admin_state_change(dst, dev, false); ++ + list_for_each_entry(dp, &dst->ports, list) { + if (!dsa_is_user_port(dp->ds, dp->index)) + continue; +--- a/net/dsa/switch.c ++++ b/net/dsa/switch.c +@@ -722,6 +722,18 @@ dsa_switch_mrp_del_ring_role(struct dsa_ + return 0; + } + ++static int ++dsa_switch_master_state_change(struct dsa_switch *ds, ++ struct dsa_notifier_master_state_info *info) ++{ ++ if (!ds->ops->master_state_change) ++ return 0; ++ ++ ds->ops->master_state_change(ds, info->master, info->operational); ++ ++ return 0; ++} ++ + static int dsa_switch_event(struct notifier_block *nb, + unsigned long event, void *info) + { +@@ -813,6 +825,9 @@ static int dsa_switch_event(struct notif + case DSA_NOTIFIER_TAG_8021Q_VLAN_DEL: + err = dsa_switch_tag_8021q_vlan_del(ds, info); + break; ++ case DSA_NOTIFIER_MASTER_STATE_CHANGE: ++ err = dsa_switch_master_state_change(ds, info); ++ break; + default: + err = -EOPNOTSUPP; + break; diff --git a/target/linux/generic/backport-5.15/766-v5.18-02-net-dsa-replay-master-state-events-in-dsa_tree_-setu.patch b/target/linux/generic/backport-5.15/766-v5.18-02-net-dsa-replay-master-state-events-in-dsa_tree_-setu.patch new file mode 100644 index 0000000000..6478d580c0 --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-02-net-dsa-replay-master-state-events-in-dsa_tree_-setu.patch @@ -0,0 +1,89 @@ +From e83d56537859849f2223b90749e554831b1f3c27 Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Wed, 2 Feb 2022 01:03:21 +0100 +Subject: [PATCH 02/16] net: dsa: replay master state events in + dsa_tree_{setup,teardown}_master + +In order for switch driver to be able to make simple and reliable use of +the master tracking operations, they must also be notified of the +initial state of the DSA master, not just of the changes. This is +because they might enable certain features only during the time when +they know that the DSA master is up and running. + +Therefore, this change explicitly checks the state of the DSA master +under the same rtnl_mutex as we were holding during the +dsa_master_setup() and dsa_master_teardown() call. The idea being that +if the DSA master became operational in between the moment in which it +became a DSA master (dsa_master_setup set dev->dsa_ptr) and the moment +when we checked for the master being up, there is a chance that we +would emit a ->master_state_change() call with no actual state change. +We need to avoid that by serializing the concurrent netdevice event with +us. If the netdevice event started before, we force it to finish before +we begin, because we take rtnl_lock before making netdev_uses_dsa() +return true. So we also handle that early event and do nothing on it. +Similarly, if the dev_open() attempt is concurrent with us, it will +attempt to take the rtnl_mutex, but we're holding it. We'll see that +the master flag IFF_UP isn't set, then when we release the rtnl_mutex +we'll process the NETDEV_UP notifier. + +Signed-off-by: Vladimir Oltean +Signed-off-by: Ansuel Smith +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + net/dsa/dsa2.c | 28 ++++++++++++++++++++++++---- + 1 file changed, 24 insertions(+), 4 deletions(-) + +--- a/net/dsa/dsa2.c ++++ b/net/dsa/dsa2.c +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + + #include "dsa_priv.h" + +@@ -1060,9 +1061,18 @@ static int dsa_tree_setup_master(struct + + list_for_each_entry(dp, &dst->ports, list) { + if (dsa_port_is_cpu(dp)) { +- err = dsa_master_setup(dp->master, dp); ++ struct net_device *master = dp->master; ++ bool admin_up = (master->flags & IFF_UP) && ++ !qdisc_tx_is_noop(master); ++ ++ err = dsa_master_setup(master, dp); + if (err) + return err; ++ ++ /* Replay master state event */ ++ dsa_tree_master_admin_state_change(dst, master, admin_up); ++ dsa_tree_master_oper_state_change(dst, master, ++ netif_oper_up(master)); + } + } + +@@ -1077,9 +1087,19 @@ static void dsa_tree_teardown_master(str + + rtnl_lock(); + +- list_for_each_entry(dp, &dst->ports, list) +- if (dsa_port_is_cpu(dp)) +- dsa_master_teardown(dp->master); ++ list_for_each_entry(dp, &dst->ports, list) { ++ if (dsa_port_is_cpu(dp)) { ++ struct net_device *master = dp->master; ++ ++ /* Synthesizing an "admin down" state is sufficient for ++ * the switches to get a notification if the master is ++ * currently up and running. ++ */ ++ dsa_tree_master_admin_state_change(dst, master, false); ++ ++ dsa_master_teardown(master); ++ } ++ } + + rtnl_unlock(); + } diff --git a/target/linux/generic/backport-5.15/766-v5.18-03-net-dsa-tag_qca-convert-to-FIELD-macro.patch b/target/linux/generic/backport-5.15/766-v5.18-03-net-dsa-tag_qca-convert-to-FIELD-macro.patch new file mode 100644 index 0000000000..82c94b385b --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-03-net-dsa-tag_qca-convert-to-FIELD-macro.patch @@ -0,0 +1,86 @@ +From 6b0458299297ca4ab6fb295800e29a4e501d50c1 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:22 +0100 +Subject: [PATCH 03/16] net: dsa: tag_qca: convert to FIELD macro + +Convert driver to FIELD macro to drop redundant define. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + net/dsa/tag_qca.c | 34 +++++++++++++++------------------- + 1 file changed, 15 insertions(+), 19 deletions(-) + +--- a/net/dsa/tag_qca.c ++++ b/net/dsa/tag_qca.c +@@ -4,29 +4,24 @@ + */ + + #include ++#include + + #include "dsa_priv.h" + + #define QCA_HDR_LEN 2 + #define QCA_HDR_VERSION 0x2 + +-#define QCA_HDR_RECV_VERSION_MASK GENMASK(15, 14) +-#define QCA_HDR_RECV_VERSION_S 14 +-#define QCA_HDR_RECV_PRIORITY_MASK GENMASK(13, 11) +-#define QCA_HDR_RECV_PRIORITY_S 11 +-#define QCA_HDR_RECV_TYPE_MASK GENMASK(10, 6) +-#define QCA_HDR_RECV_TYPE_S 6 ++#define QCA_HDR_RECV_VERSION GENMASK(15, 14) ++#define QCA_HDR_RECV_PRIORITY GENMASK(13, 11) ++#define QCA_HDR_RECV_TYPE GENMASK(10, 6) + #define QCA_HDR_RECV_FRAME_IS_TAGGED BIT(3) +-#define QCA_HDR_RECV_SOURCE_PORT_MASK GENMASK(2, 0) ++#define QCA_HDR_RECV_SOURCE_PORT GENMASK(2, 0) + +-#define QCA_HDR_XMIT_VERSION_MASK GENMASK(15, 14) +-#define QCA_HDR_XMIT_VERSION_S 14 +-#define QCA_HDR_XMIT_PRIORITY_MASK GENMASK(13, 11) +-#define QCA_HDR_XMIT_PRIORITY_S 11 +-#define QCA_HDR_XMIT_CONTROL_MASK GENMASK(10, 8) +-#define QCA_HDR_XMIT_CONTROL_S 8 ++#define QCA_HDR_XMIT_VERSION GENMASK(15, 14) ++#define QCA_HDR_XMIT_PRIORITY GENMASK(13, 11) ++#define QCA_HDR_XMIT_CONTROL GENMASK(10, 8) + #define QCA_HDR_XMIT_FROM_CPU BIT(7) +-#define QCA_HDR_XMIT_DP_BIT_MASK GENMASK(6, 0) ++#define QCA_HDR_XMIT_DP_BIT GENMASK(6, 0) + + static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev) + { +@@ -40,8 +35,9 @@ static struct sk_buff *qca_tag_xmit(stru + phdr = dsa_etype_header_pos_tx(skb); + + /* Set the version field, and set destination port information */ +- hdr = QCA_HDR_VERSION << QCA_HDR_XMIT_VERSION_S | +- QCA_HDR_XMIT_FROM_CPU | BIT(dp->index); ++ hdr = FIELD_PREP(QCA_HDR_XMIT_VERSION, QCA_HDR_VERSION); ++ hdr |= QCA_HDR_XMIT_FROM_CPU; ++ hdr |= FIELD_PREP(QCA_HDR_XMIT_DP_BIT, BIT(dp->index)); + + *phdr = htons(hdr); + +@@ -62,7 +58,7 @@ static struct sk_buff *qca_tag_rcv(struc + hdr = ntohs(*phdr); + + /* Make sure the version is correct */ +- ver = (hdr & QCA_HDR_RECV_VERSION_MASK) >> QCA_HDR_RECV_VERSION_S; ++ ver = FIELD_GET(QCA_HDR_RECV_VERSION, hdr); + if (unlikely(ver != QCA_HDR_VERSION)) + return NULL; + +@@ -71,7 +67,7 @@ static struct sk_buff *qca_tag_rcv(struc + dsa_strip_etype_header(skb, QCA_HDR_LEN); + + /* Get source port information */ +- port = (hdr & QCA_HDR_RECV_SOURCE_PORT_MASK); ++ port = FIELD_GET(QCA_HDR_RECV_SOURCE_PORT, hdr); + + skb->dev = dsa_master_find_slave(dev, 0, port); + if (!skb->dev) diff --git a/target/linux/generic/backport-5.15/766-v5.18-04-net-dsa-tag_qca-move-define-to-include-linux-dsa.patch b/target/linux/generic/backport-5.15/766-v5.18-04-net-dsa-tag_qca-move-define-to-include-linux-dsa.patch new file mode 100644 index 0000000000..c1e74ceeeb --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-04-net-dsa-tag_qca-move-define-to-include-linux-dsa.patch @@ -0,0 +1,71 @@ +From 3ec762fb13c7e7273800b94c80db1c2cc37590d1 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:23 +0100 +Subject: [PATCH 04/16] net: dsa: tag_qca: move define to include linux/dsa + +Move tag_qca define to include dir linux/dsa as the qca8k require access +to the tagger define to support in-band mdio read/write using ethernet +packet. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + include/linux/dsa/tag_qca.h | 21 +++++++++++++++++++++ + net/dsa/tag_qca.c | 16 +--------------- + 2 files changed, 22 insertions(+), 15 deletions(-) + create mode 100644 include/linux/dsa/tag_qca.h + +--- /dev/null ++++ b/include/linux/dsa/tag_qca.h +@@ -0,0 +1,21 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++ ++#ifndef __TAG_QCA_H ++#define __TAG_QCA_H ++ ++#define QCA_HDR_LEN 2 ++#define QCA_HDR_VERSION 0x2 ++ ++#define QCA_HDR_RECV_VERSION GENMASK(15, 14) ++#define QCA_HDR_RECV_PRIORITY GENMASK(13, 11) ++#define QCA_HDR_RECV_TYPE GENMASK(10, 6) ++#define QCA_HDR_RECV_FRAME_IS_TAGGED BIT(3) ++#define QCA_HDR_RECV_SOURCE_PORT GENMASK(2, 0) ++ ++#define QCA_HDR_XMIT_VERSION GENMASK(15, 14) ++#define QCA_HDR_XMIT_PRIORITY GENMASK(13, 11) ++#define QCA_HDR_XMIT_CONTROL GENMASK(10, 8) ++#define QCA_HDR_XMIT_FROM_CPU BIT(7) ++#define QCA_HDR_XMIT_DP_BIT GENMASK(6, 0) ++ ++#endif /* __TAG_QCA_H */ +--- a/net/dsa/tag_qca.c ++++ b/net/dsa/tag_qca.c +@@ -5,24 +5,10 @@ + + #include + #include ++#include + + #include "dsa_priv.h" + +-#define QCA_HDR_LEN 2 +-#define QCA_HDR_VERSION 0x2 +- +-#define QCA_HDR_RECV_VERSION GENMASK(15, 14) +-#define QCA_HDR_RECV_PRIORITY GENMASK(13, 11) +-#define QCA_HDR_RECV_TYPE GENMASK(10, 6) +-#define QCA_HDR_RECV_FRAME_IS_TAGGED BIT(3) +-#define QCA_HDR_RECV_SOURCE_PORT GENMASK(2, 0) +- +-#define QCA_HDR_XMIT_VERSION GENMASK(15, 14) +-#define QCA_HDR_XMIT_PRIORITY GENMASK(13, 11) +-#define QCA_HDR_XMIT_CONTROL GENMASK(10, 8) +-#define QCA_HDR_XMIT_FROM_CPU BIT(7) +-#define QCA_HDR_XMIT_DP_BIT GENMASK(6, 0) +- + static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct dsa_port *dp = dsa_slave_to_port(dev); diff --git a/target/linux/generic/backport-5.15/766-v5.18-05-net-dsa-tag_qca-enable-promisc_on_master-flag.patch b/target/linux/generic/backport-5.15/766-v5.18-05-net-dsa-tag_qca-enable-promisc_on_master-flag.patch new file mode 100644 index 0000000000..9394a0dabb --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-05-net-dsa-tag_qca-enable-promisc_on_master-flag.patch @@ -0,0 +1,27 @@ +From 101c04c3463b87061e6a3d4f72c1bc57670685a6 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:24 +0100 +Subject: [PATCH 05/16] net: dsa: tag_qca: enable promisc_on_master flag + +Ethernet MDIO packets are non-standard and DSA master expects the first +6 octets to be the MAC DA. To address these kind of packet, enable +promisc_on_master flag for the tagger. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + net/dsa/tag_qca.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/net/dsa/tag_qca.c ++++ b/net/dsa/tag_qca.c +@@ -68,6 +68,7 @@ static const struct dsa_device_ops qca_n + .xmit = qca_tag_xmit, + .rcv = qca_tag_rcv, + .needed_headroom = QCA_HDR_LEN, ++ .promisc_on_master = true, + }; + + MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/backport-5.15/766-v5.18-06-net-dsa-tag_qca-add-define-for-handling-mgmt-Etherne.patch b/target/linux/generic/backport-5.15/766-v5.18-06-net-dsa-tag_qca-add-define-for-handling-mgmt-Etherne.patch new file mode 100644 index 0000000000..459454e03b --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-06-net-dsa-tag_qca-add-define-for-handling-mgmt-Etherne.patch @@ -0,0 +1,110 @@ +From c2ee8181fddb293d296477f60b3eb4fa3ce4e1a6 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:25 +0100 +Subject: [PATCH 06/16] net: dsa: tag_qca: add define for handling mgmt + Ethernet packet + +Add all the required define to prepare support for mgmt read/write in +Ethernet packet. Any packet of this type has to be dropped as the only +use of these special packet is receive ack for an mgmt write request or +receive data for an mgmt read request. +A struct is used that emulates the Ethernet header but is used for a +different purpose. + +Signed-off-by: Ansuel Smith +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + include/linux/dsa/tag_qca.h | 44 +++++++++++++++++++++++++++++++++++++ + net/dsa/tag_qca.c | 15 ++++++++++--- + 2 files changed, 56 insertions(+), 3 deletions(-) + +--- a/include/linux/dsa/tag_qca.h ++++ b/include/linux/dsa/tag_qca.h +@@ -12,10 +12,54 @@ + #define QCA_HDR_RECV_FRAME_IS_TAGGED BIT(3) + #define QCA_HDR_RECV_SOURCE_PORT GENMASK(2, 0) + ++/* Packet type for recv */ ++#define QCA_HDR_RECV_TYPE_NORMAL 0x0 ++#define QCA_HDR_RECV_TYPE_MIB 0x1 ++#define QCA_HDR_RECV_TYPE_RW_REG_ACK 0x2 ++ + #define QCA_HDR_XMIT_VERSION GENMASK(15, 14) + #define QCA_HDR_XMIT_PRIORITY GENMASK(13, 11) + #define QCA_HDR_XMIT_CONTROL GENMASK(10, 8) + #define QCA_HDR_XMIT_FROM_CPU BIT(7) + #define QCA_HDR_XMIT_DP_BIT GENMASK(6, 0) + ++/* Packet type for xmit */ ++#define QCA_HDR_XMIT_TYPE_NORMAL 0x0 ++#define QCA_HDR_XMIT_TYPE_RW_REG 0x1 ++ ++/* Check code for a valid mgmt packet. Switch will ignore the packet ++ * with this wrong. ++ */ ++#define QCA_HDR_MGMT_CHECK_CODE_VAL 0x5 ++ ++/* Specific define for in-band MDIO read/write with Ethernet packet */ ++#define QCA_HDR_MGMT_SEQ_LEN 4 /* 4 byte for the seq */ ++#define QCA_HDR_MGMT_COMMAND_LEN 4 /* 4 byte for the command */ ++#define QCA_HDR_MGMT_DATA1_LEN 4 /* First 4 byte for the mdio data */ ++#define QCA_HDR_MGMT_HEADER_LEN (QCA_HDR_MGMT_SEQ_LEN + \ ++ QCA_HDR_MGMT_COMMAND_LEN + \ ++ QCA_HDR_MGMT_DATA1_LEN) ++ ++#define QCA_HDR_MGMT_DATA2_LEN 12 /* Other 12 byte for the mdio data */ ++#define QCA_HDR_MGMT_PADDING_LEN 34 /* Padding to reach the min Ethernet packet */ ++ ++#define QCA_HDR_MGMT_PKT_LEN (QCA_HDR_MGMT_HEADER_LEN + \ ++ QCA_HDR_LEN + \ ++ QCA_HDR_MGMT_DATA2_LEN + \ ++ QCA_HDR_MGMT_PADDING_LEN) ++ ++#define QCA_HDR_MGMT_SEQ_NUM GENMASK(31, 0) /* 63, 32 */ ++#define QCA_HDR_MGMT_CHECK_CODE GENMASK(31, 29) /* 31, 29 */ ++#define QCA_HDR_MGMT_CMD BIT(28) /* 28 */ ++#define QCA_HDR_MGMT_LENGTH GENMASK(23, 20) /* 23, 20 */ ++#define QCA_HDR_MGMT_ADDR GENMASK(18, 0) /* 18, 0 */ ++ ++/* Special struct emulating a Ethernet header */ ++struct qca_mgmt_ethhdr { ++ u32 command; /* command bit 31:0 */ ++ u32 seq; /* seq 63:32 */ ++ u32 mdio_data; /* first 4byte mdio */ ++ __be16 hdr; /* qca hdr */ ++} __packed; ++ + #endif /* __TAG_QCA_H */ +--- a/net/dsa/tag_qca.c ++++ b/net/dsa/tag_qca.c +@@ -32,10 +32,12 @@ static struct sk_buff *qca_tag_xmit(stru + + static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev) + { +- u8 ver; +- u16 hdr; +- int port; ++ u8 ver, pk_type; + __be16 *phdr; ++ int port; ++ u16 hdr; ++ ++ BUILD_BUG_ON(sizeof(struct qca_mgmt_ethhdr) != QCA_HDR_MGMT_HEADER_LEN + QCA_HDR_LEN); + + if (unlikely(!pskb_may_pull(skb, QCA_HDR_LEN))) + return NULL; +@@ -48,6 +50,13 @@ static struct sk_buff *qca_tag_rcv(struc + if (unlikely(ver != QCA_HDR_VERSION)) + return NULL; + ++ /* Get pk type */ ++ pk_type = FIELD_GET(QCA_HDR_RECV_TYPE, hdr); ++ ++ /* Ethernet MDIO read/write packet */ ++ if (pk_type == QCA_HDR_RECV_TYPE_RW_REG_ACK) ++ return NULL; ++ + /* Remove QCA tag and recalculate checksum */ + skb_pull_rcsum(skb, QCA_HDR_LEN); + dsa_strip_etype_header(skb, QCA_HDR_LEN); diff --git a/target/linux/generic/backport-5.15/766-v5.18-07-net-dsa-tag_qca-add-define-for-handling-MIB-packet.patch b/target/linux/generic/backport-5.15/766-v5.18-07-net-dsa-tag_qca-add-define-for-handling-MIB-packet.patch new file mode 100644 index 0000000000..7e5dc65730 --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-07-net-dsa-tag_qca-add-define-for-handling-MIB-packet.patch @@ -0,0 +1,45 @@ +From 18be654a4345f7d937b4bfbad74bea8093e3a93c Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:26 +0100 +Subject: [PATCH 07/16] net: dsa: tag_qca: add define for handling MIB packet + +Add struct to correctly parse a mib Ethernet packet. + +Signed-off-by: Ansuel Smith +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + include/linux/dsa/tag_qca.h | 10 ++++++++++ + net/dsa/tag_qca.c | 4 ++++ + 2 files changed, 14 insertions(+) + +--- a/include/linux/dsa/tag_qca.h ++++ b/include/linux/dsa/tag_qca.h +@@ -62,4 +62,14 @@ struct qca_mgmt_ethhdr { + __be16 hdr; /* qca hdr */ + } __packed; + ++enum mdio_cmd { ++ MDIO_WRITE = 0x0, ++ MDIO_READ ++}; ++ ++struct mib_ethhdr { ++ u32 data[3]; /* first 3 mib counter */ ++ __be16 hdr; /* qca hdr */ ++} __packed; ++ + #endif /* __TAG_QCA_H */ +--- a/net/dsa/tag_qca.c ++++ b/net/dsa/tag_qca.c +@@ -57,6 +57,10 @@ static struct sk_buff *qca_tag_rcv(struc + if (pk_type == QCA_HDR_RECV_TYPE_RW_REG_ACK) + return NULL; + ++ /* Ethernet MIB counter packet */ ++ if (pk_type == QCA_HDR_RECV_TYPE_MIB) ++ return NULL; ++ + /* Remove QCA tag and recalculate checksum */ + skb_pull_rcsum(skb, QCA_HDR_LEN); + dsa_strip_etype_header(skb, QCA_HDR_LEN); diff --git a/target/linux/generic/backport-5.15/766-v5.18-08-net-dsa-tag_qca-add-support-for-handling-mgmt-and-MI.patch b/target/linux/generic/backport-5.15/766-v5.18-08-net-dsa-tag_qca-add-support-for-handling-mgmt-and-MI.patch new file mode 100644 index 0000000000..ad25da30e6 --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-08-net-dsa-tag_qca-add-support-for-handling-mgmt-and-MI.patch @@ -0,0 +1,116 @@ +From 31eb6b4386ad91930417e3f5c8157a4b5e31cbd5 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:27 +0100 +Subject: [PATCH 08/16] net: dsa: tag_qca: add support for handling mgmt and + MIB Ethernet packet + +Add connect/disconnect helper to assign private struct to the DSA switch. +Add support for Ethernet mgmt and MIB if the DSA driver provide an handler +to correctly parse and elaborate the data. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + include/linux/dsa/tag_qca.h | 7 +++++++ + net/dsa/tag_qca.c | 39 ++++++++++++++++++++++++++++++++++--- + 2 files changed, 43 insertions(+), 3 deletions(-) + +--- a/include/linux/dsa/tag_qca.h ++++ b/include/linux/dsa/tag_qca.h +@@ -72,4 +72,11 @@ struct mib_ethhdr { + __be16 hdr; /* qca hdr */ + } __packed; + ++struct qca_tagger_data { ++ void (*rw_reg_ack_handler)(struct dsa_switch *ds, ++ struct sk_buff *skb); ++ void (*mib_autocast_handler)(struct dsa_switch *ds, ++ struct sk_buff *skb); ++}; ++ + #endif /* __TAG_QCA_H */ +--- a/net/dsa/tag_qca.c ++++ b/net/dsa/tag_qca.c +@@ -5,6 +5,7 @@ + + #include + #include ++#include + #include + + #include "dsa_priv.h" +@@ -32,6 +33,9 @@ static struct sk_buff *qca_tag_xmit(stru + + static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev) + { ++ struct qca_tagger_data *tagger_data; ++ struct dsa_port *dp = dev->dsa_ptr; ++ struct dsa_switch *ds = dp->ds; + u8 ver, pk_type; + __be16 *phdr; + int port; +@@ -39,6 +43,8 @@ static struct sk_buff *qca_tag_rcv(struc + + BUILD_BUG_ON(sizeof(struct qca_mgmt_ethhdr) != QCA_HDR_MGMT_HEADER_LEN + QCA_HDR_LEN); + ++ tagger_data = ds->tagger_data; ++ + if (unlikely(!pskb_may_pull(skb, QCA_HDR_LEN))) + return NULL; + +@@ -53,13 +59,19 @@ static struct sk_buff *qca_tag_rcv(struc + /* Get pk type */ + pk_type = FIELD_GET(QCA_HDR_RECV_TYPE, hdr); + +- /* Ethernet MDIO read/write packet */ +- if (pk_type == QCA_HDR_RECV_TYPE_RW_REG_ACK) ++ /* Ethernet mgmt read/write packet */ ++ if (pk_type == QCA_HDR_RECV_TYPE_RW_REG_ACK) { ++ if (likely(tagger_data->rw_reg_ack_handler)) ++ tagger_data->rw_reg_ack_handler(ds, skb); + return NULL; ++ } + + /* Ethernet MIB counter packet */ +- if (pk_type == QCA_HDR_RECV_TYPE_MIB) ++ if (pk_type == QCA_HDR_RECV_TYPE_MIB) { ++ if (likely(tagger_data->mib_autocast_handler)) ++ tagger_data->mib_autocast_handler(ds, skb); + return NULL; ++ } + + /* Remove QCA tag and recalculate checksum */ + skb_pull_rcsum(skb, QCA_HDR_LEN); +@@ -75,9 +87,30 @@ static struct sk_buff *qca_tag_rcv(struc + return skb; + } + ++static int qca_tag_connect(struct dsa_switch *ds) ++{ ++ struct qca_tagger_data *tagger_data; ++ ++ tagger_data = kzalloc(sizeof(*tagger_data), GFP_KERNEL); ++ if (!tagger_data) ++ return -ENOMEM; ++ ++ ds->tagger_data = tagger_data; ++ ++ return 0; ++} ++ ++static void qca_tag_disconnect(struct dsa_switch *ds) ++{ ++ kfree(ds->tagger_data); ++ ds->tagger_data = NULL; ++} ++ + static const struct dsa_device_ops qca_netdev_ops = { + .name = "qca", + .proto = DSA_TAG_PROTO_QCA, ++ .connect = qca_tag_connect, ++ .disconnect = qca_tag_disconnect, + .xmit = qca_tag_xmit, + .rcv = qca_tag_rcv, + .needed_headroom = QCA_HDR_LEN, diff --git a/target/linux/generic/backport-5.15/766-v5.18-09-net-dsa-qca8k-add-tracking-state-of-master-port.patch b/target/linux/generic/backport-5.15/766-v5.18-09-net-dsa-qca8k-add-tracking-state-of-master-port.patch new file mode 100644 index 0000000000..eb21cc3912 --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-09-net-dsa-qca8k-add-tracking-state-of-master-port.patch @@ -0,0 +1,67 @@ +From cddbec19466a1dfb4d45ddd507d9f09f991d54ae Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:28 +0100 +Subject: [PATCH 09/16] net: dsa: qca8k: add tracking state of master port + +MDIO/MIB Ethernet require the master port and the tagger availabale to +correctly work. Use the new api master_state_change to track when master +is operational or not and set a bool in qca8k_priv. +We cache the first cached master available and we check if other cpu +port are operational when the cached one goes down. +This cached master will later be used by mdio read/write and mib request to +correctly use the working function. + +qca8k implementation for MDIO/MIB Ethernet is bad. CPU port0 is the only +one that answers with the ack packet or sends MIB Ethernet packets. For +this reason the master_state_change ignore CPU port6 and only checks +CPU port0 if it's operational and enables this mode. + +Signed-off-by: Ansuel Smith +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 15 +++++++++++++++ + drivers/net/dsa/qca8k.h | 1 + + 2 files changed, 16 insertions(+) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -2401,6 +2401,20 @@ qca8k_port_lag_leave(struct dsa_switch * + return qca8k_lag_refresh_portmap(ds, port, lag, true); + } + ++static void ++qca8k_master_change(struct dsa_switch *ds, const struct net_device *master, ++ bool operational) ++{ ++ struct dsa_port *dp = master->dsa_ptr; ++ struct qca8k_priv *priv = ds->priv; ++ ++ /* Ethernet MIB/MDIO is only supported for CPU port 0 */ ++ if (dp->index != 0) ++ return; ++ ++ priv->mgmt_master = operational ? (struct net_device *)master : NULL; ++} ++ + static const struct dsa_switch_ops qca8k_switch_ops = { + .get_tag_protocol = qca8k_get_tag_protocol, + .setup = qca8k_setup, +@@ -2436,6 +2450,7 @@ static const struct dsa_switch_ops qca8k + .get_phy_flags = qca8k_get_phy_flags, + .port_lag_join = qca8k_port_lag_join, + .port_lag_leave = qca8k_port_lag_leave, ++ .master_state_change = qca8k_master_change, + }; + + static int qca8k_read_switch_id(struct qca8k_priv *priv) +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -353,6 +353,7 @@ struct qca8k_priv { + struct dsa_switch_ops ops; + struct gpio_desc *reset_gpio; + unsigned int port_mtu[QCA8K_NUM_PORTS]; ++ struct net_device *mgmt_master; /* Track if mdio/mib Ethernet is available */ + }; + + struct qca8k_mib_desc { diff --git a/target/linux/generic/backport-5.15/766-v5.18-10-net-dsa-qca8k-add-support-for-mgmt-read-write-in-Eth.patch b/target/linux/generic/backport-5.15/766-v5.18-10-net-dsa-qca8k-add-support-for-mgmt-read-write-in-Eth.patch new file mode 100644 index 0000000000..07c5ba4621 --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-10-net-dsa-qca8k-add-support-for-mgmt-read-write-in-Eth.patch @@ -0,0 +1,363 @@ +From 5950c7c0a68c915b336c70f79388626e2d576ab7 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:29 +0100 +Subject: [PATCH 10/16] net: dsa: qca8k: add support for mgmt read/write in + Ethernet packet + +Add qca8k side support for mgmt read/write in Ethernet packet. +qca8k supports some specially crafted Ethernet packet that can be used +for mgmt read/write instead of the legacy method uart/internal mdio. +This add support for the qca8k side to craft the packet and enqueue it. +Each port and the qca8k_priv have a special struct to put data in it. +The completion API is used to wait for the packet to be received back +with the requested data. + +The various steps are: +1. Craft the special packet with the qca hdr set to mgmt read/write + mode. +2. Set the lock in the dedicated mgmt struct. +3. Increment the seq number and set it in the mgmt pkt +4. Reinit the completion. +5. Enqueue the packet. +6. Wait the packet to be received. +7. Use the data set by the tagger to complete the mdio operation. + +If the completion timeouts or the ack value is not true, the legacy +mdio way is used. + +It has to be considered that in the initial setup mdio is still used and +mdio is still used until DSA is ready to accept and tag packet. + +tag_proto_connect() is used to fill the required handler for the tagger +to correctly parse and elaborate the special Ethernet mdio packet. + +Locking is added to qca8k_master_change() to make sure no mgmt Ethernet +are in progress. + +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 225 ++++++++++++++++++++++++++++++++++++++++ + drivers/net/dsa/qca8k.h | 13 +++ + 2 files changed, 238 insertions(+) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + + #include "qca8k.h" + +@@ -170,6 +171,194 @@ qca8k_rmw(struct qca8k_priv *priv, u32 r + return regmap_update_bits(priv->regmap, reg, mask, write_val); + } + ++static void qca8k_rw_reg_ack_handler(struct dsa_switch *ds, struct sk_buff *skb) ++{ ++ struct qca8k_mgmt_eth_data *mgmt_eth_data; ++ struct qca8k_priv *priv = ds->priv; ++ struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ u8 len, cmd; ++ ++ mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb_mac_header(skb); ++ mgmt_eth_data = &priv->mgmt_eth_data; ++ ++ cmd = FIELD_GET(QCA_HDR_MGMT_CMD, mgmt_ethhdr->command); ++ len = FIELD_GET(QCA_HDR_MGMT_LENGTH, mgmt_ethhdr->command); ++ ++ /* Make sure the seq match the requested packet */ ++ if (mgmt_ethhdr->seq == mgmt_eth_data->seq) ++ mgmt_eth_data->ack = true; ++ ++ if (cmd == MDIO_READ) { ++ mgmt_eth_data->data[0] = mgmt_ethhdr->mdio_data; ++ ++ /* Get the rest of the 12 byte of data */ ++ if (len > QCA_HDR_MGMT_DATA1_LEN) ++ memcpy(mgmt_eth_data->data + 1, skb->data, ++ QCA_HDR_MGMT_DATA2_LEN); ++ } ++ ++ complete(&mgmt_eth_data->rw_done); ++} ++ ++static struct sk_buff *qca8k_alloc_mdio_header(enum mdio_cmd cmd, u32 reg, u32 *val, ++ int priority) ++{ ++ struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ struct sk_buff *skb; ++ u16 hdr; ++ ++ skb = dev_alloc_skb(QCA_HDR_MGMT_PKT_LEN); ++ if (!skb) ++ return NULL; ++ ++ skb_reset_mac_header(skb); ++ skb_set_network_header(skb, skb->len); ++ ++ mgmt_ethhdr = skb_push(skb, QCA_HDR_MGMT_HEADER_LEN + QCA_HDR_LEN); ++ ++ hdr = FIELD_PREP(QCA_HDR_XMIT_VERSION, QCA_HDR_VERSION); ++ hdr |= FIELD_PREP(QCA_HDR_XMIT_PRIORITY, priority); ++ hdr |= QCA_HDR_XMIT_FROM_CPU; ++ hdr |= FIELD_PREP(QCA_HDR_XMIT_DP_BIT, BIT(0)); ++ hdr |= FIELD_PREP(QCA_HDR_XMIT_CONTROL, QCA_HDR_XMIT_TYPE_RW_REG); ++ ++ mgmt_ethhdr->command = FIELD_PREP(QCA_HDR_MGMT_ADDR, reg); ++ mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_LENGTH, 4); ++ mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CMD, cmd); ++ mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CHECK_CODE, ++ QCA_HDR_MGMT_CHECK_CODE_VAL); ++ ++ if (cmd == MDIO_WRITE) ++ mgmt_ethhdr->mdio_data = *val; ++ ++ mgmt_ethhdr->hdr = htons(hdr); ++ ++ skb_put_zero(skb, QCA_HDR_MGMT_DATA2_LEN + QCA_HDR_MGMT_PADDING_LEN); ++ ++ return skb; ++} ++ ++static void qca8k_mdio_header_fill_seq_num(struct sk_buff *skb, u32 seq_num) ++{ ++ struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ ++ mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb->data; ++ mgmt_ethhdr->seq = FIELD_PREP(QCA_HDR_MGMT_SEQ_NUM, seq_num); ++} ++ ++static int qca8k_read_eth(struct qca8k_priv *priv, u32 reg, u32 *val) ++{ ++ struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; ++ struct sk_buff *skb; ++ bool ack; ++ int ret; ++ ++ skb = qca8k_alloc_mdio_header(MDIO_READ, reg, NULL, ++ QCA8K_ETHERNET_MDIO_PRIORITY); ++ if (!skb) ++ return -ENOMEM; ++ ++ mutex_lock(&mgmt_eth_data->mutex); ++ ++ /* Check mgmt_master if is operational */ ++ if (!priv->mgmt_master) { ++ kfree_skb(skb); ++ mutex_unlock(&mgmt_eth_data->mutex); ++ return -EINVAL; ++ } ++ ++ skb->dev = priv->mgmt_master; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the mdio pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); ++ ++ *val = mgmt_eth_data->data[0]; ++ ack = mgmt_eth_data->ack; ++ ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ++ if (ret <= 0) ++ return -ETIMEDOUT; ++ ++ if (!ack) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int qca8k_write_eth(struct qca8k_priv *priv, u32 reg, u32 val) ++{ ++ struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; ++ struct sk_buff *skb; ++ bool ack; ++ int ret; ++ ++ skb = qca8k_alloc_mdio_header(MDIO_WRITE, reg, &val, ++ QCA8K_ETHERNET_MDIO_PRIORITY); ++ if (!skb) ++ return -ENOMEM; ++ ++ mutex_lock(&mgmt_eth_data->mutex); ++ ++ /* Check mgmt_master if is operational */ ++ if (!priv->mgmt_master) { ++ kfree_skb(skb); ++ mutex_unlock(&mgmt_eth_data->mutex); ++ return -EINVAL; ++ } ++ ++ skb->dev = priv->mgmt_master; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the mdio pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); ++ ++ ack = mgmt_eth_data->ack; ++ ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ++ if (ret <= 0) ++ return -ETIMEDOUT; ++ ++ if (!ack) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int ++qca8k_regmap_update_bits_eth(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) ++{ ++ u32 val = 0; ++ int ret; ++ ++ ret = qca8k_read_eth(priv, reg, &val); ++ if (ret) ++ return ret; ++ ++ val &= ~mask; ++ val |= write_val; ++ ++ return qca8k_write_eth(priv, reg, val); ++} ++ + static int + qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) + { +@@ -178,6 +367,9 @@ qca8k_regmap_read(void *ctx, uint32_t re + u16 r1, r2, page; + int ret; + ++ if (!qca8k_read_eth(priv, reg, val)) ++ return 0; ++ + qca8k_split_addr(reg, &r1, &r2, &page); + + mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +@@ -201,6 +393,9 @@ qca8k_regmap_write(void *ctx, uint32_t r + u16 r1, r2, page; + int ret; + ++ if (!qca8k_write_eth(priv, reg, val)) ++ return 0; ++ + qca8k_split_addr(reg, &r1, &r2, &page); + + mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +@@ -225,6 +420,9 @@ qca8k_regmap_update_bits(void *ctx, uint + u32 val; + int ret; + ++ if (!qca8k_regmap_update_bits_eth(priv, reg, mask, write_val)) ++ return 0; ++ + qca8k_split_addr(reg, &r1, &r2, &page); + + mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +@@ -2412,7 +2610,30 @@ qca8k_master_change(struct dsa_switch *d + if (dp->index != 0) + return; + ++ mutex_lock(&priv->mgmt_eth_data.mutex); ++ + priv->mgmt_master = operational ? (struct net_device *)master : NULL; ++ ++ mutex_unlock(&priv->mgmt_eth_data.mutex); ++} ++ ++static int qca8k_connect_tag_protocol(struct dsa_switch *ds, ++ enum dsa_tag_protocol proto) ++{ ++ struct qca_tagger_data *tagger_data; ++ ++ switch (proto) { ++ case DSA_TAG_PROTO_QCA: ++ tagger_data = ds->tagger_data; ++ ++ tagger_data->rw_reg_ack_handler = qca8k_rw_reg_ack_handler; ++ ++ break; ++ default: ++ return -EOPNOTSUPP; ++ } ++ ++ return 0; + } + + static const struct dsa_switch_ops qca8k_switch_ops = { +@@ -2451,6 +2672,7 @@ static const struct dsa_switch_ops qca8k + .port_lag_join = qca8k_port_lag_join, + .port_lag_leave = qca8k_port_lag_leave, + .master_state_change = qca8k_master_change, ++ .connect_tag_protocol = qca8k_connect_tag_protocol, + }; + + static int qca8k_read_switch_id(struct qca8k_priv *priv) +@@ -2530,6 +2752,9 @@ qca8k_sw_probe(struct mdio_device *mdiod + if (!priv->ds) + return -ENOMEM; + ++ mutex_init(&priv->mgmt_eth_data.mutex); ++ init_completion(&priv->mgmt_eth_data.rw_done); ++ + priv->ds->dev = &mdiodev->dev; + priv->ds->num_ports = QCA8K_NUM_PORTS; + priv->ds->priv = priv; +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -11,6 +11,10 @@ + #include + #include + #include ++#include ++ ++#define QCA8K_ETHERNET_MDIO_PRIORITY 7 ++#define QCA8K_ETHERNET_TIMEOUT 100 + + #define QCA8K_NUM_PORTS 7 + #define QCA8K_NUM_CPU_PORTS 2 +@@ -328,6 +332,14 @@ enum { + QCA8K_CPU_PORT6, + }; + ++struct qca8k_mgmt_eth_data { ++ struct completion rw_done; ++ struct mutex mutex; /* Enforce one mdio read/write at time */ ++ bool ack; ++ u32 seq; ++ u32 data[4]; ++}; ++ + struct qca8k_ports_config { + bool sgmii_rx_clk_falling_edge; + bool sgmii_tx_clk_falling_edge; +@@ -354,6 +366,7 @@ struct qca8k_priv { + struct gpio_desc *reset_gpio; + unsigned int port_mtu[QCA8K_NUM_PORTS]; + struct net_device *mgmt_master; /* Track if mdio/mib Ethernet is available */ ++ struct qca8k_mgmt_eth_data mgmt_eth_data; + }; + + struct qca8k_mib_desc { diff --git a/target/linux/generic/backport-5.15/766-v5.18-11-net-dsa-qca8k-add-support-for-mib-autocast-in-Ethern.patch b/target/linux/generic/backport-5.15/766-v5.18-11-net-dsa-qca8k-add-support-for-mib-autocast-in-Ethern.patch new file mode 100644 index 0000000000..0dcf279433 --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-11-net-dsa-qca8k-add-support-for-mib-autocast-in-Ethern.patch @@ -0,0 +1,226 @@ +From 5c957c7ca78cce5e4b96866722b0115bd758d945 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:30 +0100 +Subject: [PATCH 11/16] net: dsa: qca8k: add support for mib autocast in + Ethernet packet + +The switch can autocast MIB counter using Ethernet packet. +Add support for this and provide a handler for the tagger. +The switch will send packet with MIB counter for each port, the switch +will use completion API to wait for the correct packet to be received +and will complete the task only when each packet is received. +Although the handler will drop all the other packet, we still have to +consume each MIB packet to complete the request. This is done to prevent +mixed data with concurrent ethtool request. + +connect_tag_protocol() is used to add the handler to the tag_qca tagger, +master_state_change() use the MIB lock to make sure no MIB Ethernet is +in progress. + +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 106 +++++++++++++++++++++++++++++++++++++++- + drivers/net/dsa/qca8k.h | 17 ++++++- + 2 files changed, 121 insertions(+), 2 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -830,7 +830,10 @@ qca8k_mib_init(struct qca8k_priv *priv) + int ret; + + mutex_lock(&priv->reg_mutex); +- ret = regmap_set_bits(priv->regmap, QCA8K_REG_MIB, QCA8K_MIB_FLUSH | QCA8K_MIB_BUSY); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, ++ QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, ++ FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_FLUSH) | ++ QCA8K_MIB_BUSY); + if (ret) + goto exit; + +@@ -1901,6 +1904,97 @@ qca8k_get_strings(struct dsa_switch *ds, + ETH_GSTRING_LEN); + } + ++static void qca8k_mib_autocast_handler(struct dsa_switch *ds, struct sk_buff *skb) ++{ ++ const struct qca8k_match_data *match_data; ++ struct qca8k_mib_eth_data *mib_eth_data; ++ struct qca8k_priv *priv = ds->priv; ++ const struct qca8k_mib_desc *mib; ++ struct mib_ethhdr *mib_ethhdr; ++ int i, mib_len, offset = 0; ++ u64 *data; ++ u8 port; ++ ++ mib_ethhdr = (struct mib_ethhdr *)skb_mac_header(skb); ++ mib_eth_data = &priv->mib_eth_data; ++ ++ /* The switch autocast every port. Ignore other packet and ++ * parse only the requested one. ++ */ ++ port = FIELD_GET(QCA_HDR_RECV_SOURCE_PORT, ntohs(mib_ethhdr->hdr)); ++ if (port != mib_eth_data->req_port) ++ goto exit; ++ ++ match_data = device_get_match_data(priv->dev); ++ data = mib_eth_data->data; ++ ++ for (i = 0; i < match_data->mib_count; i++) { ++ mib = &ar8327_mib[i]; ++ ++ /* First 3 mib are present in the skb head */ ++ if (i < 3) { ++ data[i] = mib_ethhdr->data[i]; ++ continue; ++ } ++ ++ mib_len = sizeof(uint32_t); ++ ++ /* Some mib are 64 bit wide */ ++ if (mib->size == 2) ++ mib_len = sizeof(uint64_t); ++ ++ /* Copy the mib value from packet to the */ ++ memcpy(data + i, skb->data + offset, mib_len); ++ ++ /* Set the offset for the next mib */ ++ offset += mib_len; ++ } ++ ++exit: ++ /* Complete on receiving all the mib packet */ ++ if (refcount_dec_and_test(&mib_eth_data->port_parsed)) ++ complete(&mib_eth_data->rw_done); ++} ++ ++static int ++qca8k_get_ethtool_stats_eth(struct dsa_switch *ds, int port, u64 *data) ++{ ++ struct dsa_port *dp = dsa_to_port(ds, port); ++ struct qca8k_mib_eth_data *mib_eth_data; ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ mib_eth_data = &priv->mib_eth_data; ++ ++ mutex_lock(&mib_eth_data->mutex); ++ ++ reinit_completion(&mib_eth_data->rw_done); ++ ++ mib_eth_data->req_port = dp->index; ++ mib_eth_data->data = data; ++ refcount_set(&mib_eth_data->port_parsed, QCA8K_NUM_PORTS); ++ ++ mutex_lock(&priv->reg_mutex); ++ ++ /* Send mib autocast request */ ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, ++ QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, ++ FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_CAST) | ++ QCA8K_MIB_BUSY); ++ ++ mutex_unlock(&priv->reg_mutex); ++ ++ if (ret) ++ goto exit; ++ ++ ret = wait_for_completion_timeout(&mib_eth_data->rw_done, QCA8K_ETHERNET_TIMEOUT); ++ ++exit: ++ mutex_unlock(&mib_eth_data->mutex); ++ ++ return ret; ++} ++ + static void + qca8k_get_ethtool_stats(struct dsa_switch *ds, int port, + uint64_t *data) +@@ -1912,6 +2006,10 @@ qca8k_get_ethtool_stats(struct dsa_switc + u32 hi = 0; + int ret; + ++ if (priv->mgmt_master && ++ qca8k_get_ethtool_stats_eth(ds, port, data) > 0) ++ return; ++ + match_data = of_device_get_match_data(priv->dev); + + for (i = 0; i < match_data->mib_count; i++) { +@@ -2611,9 +2709,11 @@ qca8k_master_change(struct dsa_switch *d + return; + + mutex_lock(&priv->mgmt_eth_data.mutex); ++ mutex_lock(&priv->mib_eth_data.mutex); + + priv->mgmt_master = operational ? (struct net_device *)master : NULL; + ++ mutex_unlock(&priv->mib_eth_data.mutex); + mutex_unlock(&priv->mgmt_eth_data.mutex); + } + +@@ -2627,6 +2727,7 @@ static int qca8k_connect_tag_protocol(st + tagger_data = ds->tagger_data; + + tagger_data->rw_reg_ack_handler = qca8k_rw_reg_ack_handler; ++ tagger_data->mib_autocast_handler = qca8k_mib_autocast_handler; + + break; + default: +@@ -2755,6 +2856,9 @@ qca8k_sw_probe(struct mdio_device *mdiod + mutex_init(&priv->mgmt_eth_data.mutex); + init_completion(&priv->mgmt_eth_data.rw_done); + ++ mutex_init(&priv->mib_eth_data.mutex); ++ init_completion(&priv->mib_eth_data.rw_done); ++ + priv->ds->dev = &mdiodev->dev; + priv->ds->num_ports = QCA8K_NUM_PORTS; + priv->ds->priv = priv; +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -67,7 +67,7 @@ + #define QCA8K_REG_MODULE_EN 0x030 + #define QCA8K_MODULE_EN_MIB BIT(0) + #define QCA8K_REG_MIB 0x034 +-#define QCA8K_MIB_FLUSH BIT(24) ++#define QCA8K_MIB_FUNC GENMASK(26, 24) + #define QCA8K_MIB_CPU_KEEP BIT(20) + #define QCA8K_MIB_BUSY BIT(17) + #define QCA8K_MDIO_MASTER_CTRL 0x3c +@@ -317,6 +317,12 @@ enum qca8k_vlan_cmd { + QCA8K_VLAN_READ = 6, + }; + ++enum qca8k_mid_cmd { ++ QCA8K_MIB_FLUSH = 1, ++ QCA8K_MIB_FLUSH_PORT = 2, ++ QCA8K_MIB_CAST = 3, ++}; ++ + struct ar8xxx_port_status { + int enabled; + }; +@@ -340,6 +346,14 @@ struct qca8k_mgmt_eth_data { + u32 data[4]; + }; + ++struct qca8k_mib_eth_data { ++ struct completion rw_done; ++ struct mutex mutex; /* Process one command at time */ ++ refcount_t port_parsed; /* Counter to track parsed port */ ++ u8 req_port; ++ u64 *data; /* pointer to ethtool data */ ++}; ++ + struct qca8k_ports_config { + bool sgmii_rx_clk_falling_edge; + bool sgmii_tx_clk_falling_edge; +@@ -367,6 +381,7 @@ struct qca8k_priv { + unsigned int port_mtu[QCA8K_NUM_PORTS]; + struct net_device *mgmt_master; /* Track if mdio/mib Ethernet is available */ + struct qca8k_mgmt_eth_data mgmt_eth_data; ++ struct qca8k_mib_eth_data mib_eth_data; + }; + + struct qca8k_mib_desc { diff --git a/target/linux/generic/backport-5.15/766-v5.18-12-net-dsa-qca8k-add-support-for-phy-read-write-with-mg.patch b/target/linux/generic/backport-5.15/766-v5.18-12-net-dsa-qca8k-add-support-for-phy-read-write-with-mg.patch new file mode 100644 index 0000000000..f5899eb590 --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-12-net-dsa-qca8k-add-support-for-phy-read-write-with-mg.patch @@ -0,0 +1,287 @@ +From 2cd5485663847d468dc207b3ff85fb1fab44d97f Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:31 +0100 +Subject: [PATCH 12/16] net: dsa: qca8k: add support for phy read/write with + mgmt Ethernet + +Use mgmt Ethernet also for phy read/write if availabale. Use a different +seq number to make sure we receive the correct packet. +On any error, we fallback to the legacy mdio read/write. + +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 216 ++++++++++++++++++++++++++++++++++++++++ + drivers/net/dsa/qca8k.h | 1 + + 2 files changed, 217 insertions(+) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -867,6 +867,199 @@ qca8k_port_set_status(struct qca8k_priv + regmap_clear_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); + } + ++static int ++qca8k_phy_eth_busy_wait(struct qca8k_mgmt_eth_data *mgmt_eth_data, ++ struct sk_buff *read_skb, u32 *val) ++{ ++ struct sk_buff *skb = skb_copy(read_skb, GFP_KERNEL); ++ bool ack; ++ int ret; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the copy pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ ack = mgmt_eth_data->ack; ++ ++ if (ret <= 0) ++ return -ETIMEDOUT; ++ ++ if (!ack) ++ return -EINVAL; ++ ++ *val = mgmt_eth_data->data[0]; ++ ++ return 0; ++} ++ ++static int ++qca8k_phy_eth_command(struct qca8k_priv *priv, bool read, int phy, ++ int regnum, u16 data) ++{ ++ struct sk_buff *write_skb, *clear_skb, *read_skb; ++ struct qca8k_mgmt_eth_data *mgmt_eth_data; ++ u32 write_val, clear_val = 0, val; ++ struct net_device *mgmt_master; ++ int ret, ret1; ++ bool ack; ++ ++ if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) ++ return -EINVAL; ++ ++ mgmt_eth_data = &priv->mgmt_eth_data; ++ ++ write_val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | ++ QCA8K_MDIO_MASTER_PHY_ADDR(phy) | ++ QCA8K_MDIO_MASTER_REG_ADDR(regnum); ++ ++ if (read) { ++ write_val |= QCA8K_MDIO_MASTER_READ; ++ } else { ++ write_val |= QCA8K_MDIO_MASTER_WRITE; ++ write_val |= QCA8K_MDIO_MASTER_DATA(data); ++ } ++ ++ /* Prealloc all the needed skb before the lock */ ++ write_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, ++ &write_val, QCA8K_ETHERNET_PHY_PRIORITY); ++ if (!write_skb) ++ return -ENOMEM; ++ ++ clear_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, ++ &clear_val, QCA8K_ETHERNET_PHY_PRIORITY); ++ if (!write_skb) { ++ ret = -ENOMEM; ++ goto err_clear_skb; ++ } ++ ++ read_skb = qca8k_alloc_mdio_header(MDIO_READ, QCA8K_MDIO_MASTER_CTRL, ++ &clear_val, QCA8K_ETHERNET_PHY_PRIORITY); ++ if (!write_skb) { ++ ret = -ENOMEM; ++ goto err_read_skb; ++ } ++ ++ /* Actually start the request: ++ * 1. Send mdio master packet ++ * 2. Busy Wait for mdio master command ++ * 3. Get the data if we are reading ++ * 4. Reset the mdio master (even with error) ++ */ ++ mutex_lock(&mgmt_eth_data->mutex); ++ ++ /* Check if mgmt_master is operational */ ++ mgmt_master = priv->mgmt_master; ++ if (!mgmt_master) { ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ret = -EINVAL; ++ goto err_mgmt_master; ++ } ++ ++ read_skb->dev = mgmt_master; ++ clear_skb->dev = mgmt_master; ++ write_skb->dev = mgmt_master; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the write pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(write_skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(write_skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ ack = mgmt_eth_data->ack; ++ ++ if (ret <= 0) { ++ ret = -ETIMEDOUT; ++ kfree_skb(read_skb); ++ goto exit; ++ } ++ ++ if (!ack) { ++ ret = -EINVAL; ++ kfree_skb(read_skb); ++ goto exit; ++ } ++ ++ ret = read_poll_timeout(qca8k_phy_eth_busy_wait, ret1, ++ !(val & QCA8K_MDIO_MASTER_BUSY), 0, ++ QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, ++ mgmt_eth_data, read_skb, &val); ++ ++ if (ret < 0 && ret1 < 0) { ++ ret = ret1; ++ goto exit; ++ } ++ ++ if (read) { ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the read pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(read_skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(read_skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ ack = mgmt_eth_data->ack; ++ ++ if (ret <= 0) { ++ ret = -ETIMEDOUT; ++ goto exit; ++ } ++ ++ if (!ack) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ ret = mgmt_eth_data->data[0] & QCA8K_MDIO_MASTER_DATA_MASK; ++ } else { ++ kfree_skb(read_skb); ++ } ++exit: ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the clear pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(clear_skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(clear_skb); ++ ++ wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ++ return ret; ++ ++ /* Error handling before lock */ ++err_mgmt_master: ++ kfree_skb(read_skb); ++err_read_skb: ++ kfree_skb(clear_skb); ++err_clear_skb: ++ kfree_skb(write_skb); ++ ++ return ret; ++} ++ + static u32 + qca8k_port_to_phy(int port) + { +@@ -989,6 +1182,12 @@ qca8k_internal_mdio_write(struct mii_bus + { + struct qca8k_priv *priv = slave_bus->priv; + struct mii_bus *bus = priv->bus; ++ int ret; ++ ++ /* Use mdio Ethernet when available, fallback to legacy one on error */ ++ ret = qca8k_phy_eth_command(priv, false, phy, regnum, data); ++ if (!ret) ++ return 0; + + return qca8k_mdio_write(bus, phy, regnum, data); + } +@@ -998,6 +1197,12 @@ qca8k_internal_mdio_read(struct mii_bus + { + struct qca8k_priv *priv = slave_bus->priv; + struct mii_bus *bus = priv->bus; ++ int ret; ++ ++ /* Use mdio Ethernet when available, fallback to legacy one on error */ ++ ret = qca8k_phy_eth_command(priv, true, phy, regnum, 0); ++ if (ret >= 0) ++ return ret; + + return qca8k_mdio_read(bus, phy, regnum); + } +@@ -1006,6 +1211,7 @@ static int + qca8k_phy_write(struct dsa_switch *ds, int port, int regnum, u16 data) + { + struct qca8k_priv *priv = ds->priv; ++ int ret; + + /* Check if the legacy mapping should be used and the + * port is not correctly mapped to the right PHY in the +@@ -1014,6 +1220,11 @@ qca8k_phy_write(struct dsa_switch *ds, i + if (priv->legacy_phy_port_mapping) + port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; + ++ /* Use mdio Ethernet when available, fallback to legacy one on error */ ++ ret = qca8k_phy_eth_command(priv, false, port, regnum, 0); ++ if (!ret) ++ return ret; ++ + return qca8k_mdio_write(priv->bus, port, regnum, data); + } + +@@ -1030,6 +1241,11 @@ qca8k_phy_read(struct dsa_switch *ds, in + if (priv->legacy_phy_port_mapping) + port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; + ++ /* Use mdio Ethernet when available, fallback to legacy one on error */ ++ ret = qca8k_phy_eth_command(priv, true, port, regnum, 0); ++ if (ret >= 0) ++ return ret; ++ + ret = qca8k_mdio_read(priv->bus, port, regnum); + + if (ret < 0) +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -14,6 +14,7 @@ + #include + + #define QCA8K_ETHERNET_MDIO_PRIORITY 7 ++#define QCA8K_ETHERNET_PHY_PRIORITY 6 + #define QCA8K_ETHERNET_TIMEOUT 100 + + #define QCA8K_NUM_PORTS 7 diff --git a/target/linux/generic/backport-5.15/766-v5.18-13-net-dsa-qca8k-move-page-cache-to-driver-priv.patch b/target/linux/generic/backport-5.15/766-v5.18-13-net-dsa-qca8k-move-page-cache-to-driver-priv.patch new file mode 100644 index 0000000000..4ac0bc32fd --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-13-net-dsa-qca8k-move-page-cache-to-driver-priv.patch @@ -0,0 +1,208 @@ +From 4264350acb75430d5021a1d7de56a33faf69a097 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:32 +0100 +Subject: [PATCH 13/16] net: dsa: qca8k: move page cache to driver priv + +There can be multiple qca8k switch on the same system. Move the static +qca8k_current_page to qca8k_priv and make it specific for each switch. + +Signed-off-by: Ansuel Smith +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 42 ++++++++++++++++++++--------------------- + drivers/net/dsa/qca8k.h | 9 +++++++++ + 2 files changed, 29 insertions(+), 22 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -75,12 +75,6 @@ static const struct qca8k_mib_desc ar832 + MIB_DESC(1, 0xac, "TXUnicast"), + }; + +-/* The 32bit switch registers are accessed indirectly. To achieve this we need +- * to set the page of the register. Track the last page that was set to reduce +- * mdio writes +- */ +-static u16 qca8k_current_page = 0xffff; +- + static void + qca8k_split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) + { +@@ -134,11 +128,13 @@ qca8k_mii_write32(struct mii_bus *bus, i + } + + static int +-qca8k_set_page(struct mii_bus *bus, u16 page) ++qca8k_set_page(struct qca8k_priv *priv, u16 page) + { ++ u16 *cached_page = &priv->mdio_cache.page; ++ struct mii_bus *bus = priv->bus; + int ret; + +- if (page == qca8k_current_page) ++ if (page == *cached_page) + return 0; + + ret = bus->write(bus, 0x18, 0, page); +@@ -148,7 +144,7 @@ qca8k_set_page(struct mii_bus *bus, u16 + return ret; + } + +- qca8k_current_page = page; ++ *cached_page = page; + usleep_range(1000, 2000); + return 0; + } +@@ -374,7 +370,7 @@ qca8k_regmap_read(void *ctx, uint32_t re + + mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); + +- ret = qca8k_set_page(bus, page); ++ ret = qca8k_set_page(priv, page); + if (ret < 0) + goto exit; + +@@ -400,7 +396,7 @@ qca8k_regmap_write(void *ctx, uint32_t r + + mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); + +- ret = qca8k_set_page(bus, page); ++ ret = qca8k_set_page(priv, page); + if (ret < 0) + goto exit; + +@@ -427,7 +423,7 @@ qca8k_regmap_update_bits(void *ctx, uint + + mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); + +- ret = qca8k_set_page(bus, page); ++ ret = qca8k_set_page(priv, page); + if (ret < 0) + goto exit; + +@@ -1098,8 +1094,9 @@ qca8k_mdio_busy_wait(struct mii_bus *bus + } + + static int +-qca8k_mdio_write(struct mii_bus *bus, int phy, int regnum, u16 data) ++qca8k_mdio_write(struct qca8k_priv *priv, int phy, int regnum, u16 data) + { ++ struct mii_bus *bus = priv->bus; + u16 r1, r2, page; + u32 val; + int ret; +@@ -1116,7 +1113,7 @@ qca8k_mdio_write(struct mii_bus *bus, in + + mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); + +- ret = qca8k_set_page(bus, page); ++ ret = qca8k_set_page(priv, page); + if (ret) + goto exit; + +@@ -1135,8 +1132,9 @@ exit: + } + + static int +-qca8k_mdio_read(struct mii_bus *bus, int phy, int regnum) ++qca8k_mdio_read(struct qca8k_priv *priv, int phy, int regnum) + { ++ struct mii_bus *bus = priv->bus; + u16 r1, r2, page; + u32 val; + int ret; +@@ -1152,7 +1150,7 @@ qca8k_mdio_read(struct mii_bus *bus, int + + mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); + +- ret = qca8k_set_page(bus, page); ++ ret = qca8k_set_page(priv, page); + if (ret) + goto exit; + +@@ -1181,7 +1179,6 @@ static int + qca8k_internal_mdio_write(struct mii_bus *slave_bus, int phy, int regnum, u16 data) + { + struct qca8k_priv *priv = slave_bus->priv; +- struct mii_bus *bus = priv->bus; + int ret; + + /* Use mdio Ethernet when available, fallback to legacy one on error */ +@@ -1189,14 +1186,13 @@ qca8k_internal_mdio_write(struct mii_bus + if (!ret) + return 0; + +- return qca8k_mdio_write(bus, phy, regnum, data); ++ return qca8k_mdio_write(priv, phy, regnum, data); + } + + static int + qca8k_internal_mdio_read(struct mii_bus *slave_bus, int phy, int regnum) + { + struct qca8k_priv *priv = slave_bus->priv; +- struct mii_bus *bus = priv->bus; + int ret; + + /* Use mdio Ethernet when available, fallback to legacy one on error */ +@@ -1204,7 +1200,7 @@ qca8k_internal_mdio_read(struct mii_bus + if (ret >= 0) + return ret; + +- return qca8k_mdio_read(bus, phy, regnum); ++ return qca8k_mdio_read(priv, phy, regnum); + } + + static int +@@ -1225,7 +1221,7 @@ qca8k_phy_write(struct dsa_switch *ds, i + if (!ret) + return ret; + +- return qca8k_mdio_write(priv->bus, port, regnum, data); ++ return qca8k_mdio_write(priv, port, regnum, data); + } + + static int +@@ -1246,7 +1242,7 @@ qca8k_phy_read(struct dsa_switch *ds, in + if (ret >= 0) + return ret; + +- ret = qca8k_mdio_read(priv->bus, port, regnum); ++ ret = qca8k_mdio_read(priv, port, regnum); + + if (ret < 0) + return 0xffff; +@@ -3060,6 +3056,8 @@ qca8k_sw_probe(struct mdio_device *mdiod + return PTR_ERR(priv->regmap); + } + ++ priv->mdio_cache.page = 0xffff; ++ + /* Check the detected switch id */ + ret = qca8k_read_switch_id(priv); + if (ret) +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -363,6 +363,14 @@ struct qca8k_ports_config { + u8 rgmii_tx_delay[QCA8K_NUM_CPU_PORTS]; /* 0: CPU port0, 1: CPU port6 */ + }; + ++struct qca8k_mdio_cache { ++/* The 32bit switch registers are accessed indirectly. To achieve this we need ++ * to set the page of the register. Track the last page that was set to reduce ++ * mdio writes ++ */ ++ u16 page; ++}; ++ + struct qca8k_priv { + u8 switch_id; + u8 switch_revision; +@@ -383,6 +391,7 @@ struct qca8k_priv { + struct net_device *mgmt_master; /* Track if mdio/mib Ethernet is available */ + struct qca8k_mgmt_eth_data mgmt_eth_data; + struct qca8k_mib_eth_data mib_eth_data; ++ struct qca8k_mdio_cache mdio_cache; + }; + + struct qca8k_mib_desc { diff --git a/target/linux/generic/backport-5.15/766-v5.18-14-net-dsa-qca8k-cache-lo-and-hi-for-mdio-write.patch b/target/linux/generic/backport-5.15/766-v5.18-14-net-dsa-qca8k-cache-lo-and-hi-for-mdio-write.patch new file mode 100644 index 0000000000..e2cb2721ce --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-14-net-dsa-qca8k-cache-lo-and-hi-for-mdio-write.patch @@ -0,0 +1,164 @@ +From 2481d206fae7884cd07014fd1318e63af35e99eb Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:33 +0100 +Subject: [PATCH 14/16] net: dsa: qca8k: cache lo and hi for mdio write + +From Documentation, we can cache lo and hi the same way we do with the +page. This massively reduce the mdio write as 3/4 of the time as we only +require to write the lo or hi part for a mdio write. + +Signed-off-by: Ansuel Smith +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 61 +++++++++++++++++++++++++++++++++-------- + drivers/net/dsa/qca8k.h | 5 ++++ + 2 files changed, 54 insertions(+), 12 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -89,6 +89,44 @@ qca8k_split_addr(u32 regaddr, u16 *r1, u + } + + static int ++qca8k_set_lo(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 lo) ++{ ++ u16 *cached_lo = &priv->mdio_cache.lo; ++ struct mii_bus *bus = priv->bus; ++ int ret; ++ ++ if (lo == *cached_lo) ++ return 0; ++ ++ ret = bus->write(bus, phy_id, regnum, lo); ++ if (ret < 0) ++ dev_err_ratelimited(&bus->dev, ++ "failed to write qca8k 32bit lo register\n"); ++ ++ *cached_lo = lo; ++ return 0; ++} ++ ++static int ++qca8k_set_hi(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 hi) ++{ ++ u16 *cached_hi = &priv->mdio_cache.hi; ++ struct mii_bus *bus = priv->bus; ++ int ret; ++ ++ if (hi == *cached_hi) ++ return 0; ++ ++ ret = bus->write(bus, phy_id, regnum, hi); ++ if (ret < 0) ++ dev_err_ratelimited(&bus->dev, ++ "failed to write qca8k 32bit hi register\n"); ++ ++ *cached_hi = hi; ++ return 0; ++} ++ ++static int + qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) + { + int ret; +@@ -111,7 +149,7 @@ qca8k_mii_read32(struct mii_bus *bus, in + } + + static void +-qca8k_mii_write32(struct mii_bus *bus, int phy_id, u32 regnum, u32 val) ++qca8k_mii_write32(struct qca8k_priv *priv, int phy_id, u32 regnum, u32 val) + { + u16 lo, hi; + int ret; +@@ -119,12 +157,9 @@ qca8k_mii_write32(struct mii_bus *bus, i + lo = val & 0xffff; + hi = (u16)(val >> 16); + +- ret = bus->write(bus, phy_id, regnum, lo); ++ ret = qca8k_set_lo(priv, phy_id, regnum, lo); + if (ret >= 0) +- ret = bus->write(bus, phy_id, regnum + 1, hi); +- if (ret < 0) +- dev_err_ratelimited(&bus->dev, +- "failed to write qca8k 32bit register\n"); ++ ret = qca8k_set_hi(priv, phy_id, regnum + 1, hi); + } + + static int +@@ -400,7 +435,7 @@ qca8k_regmap_write(void *ctx, uint32_t r + if (ret < 0) + goto exit; + +- qca8k_mii_write32(bus, 0x10 | r2, r1, val); ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); + + exit: + mutex_unlock(&bus->mdio_lock); +@@ -433,7 +468,7 @@ qca8k_regmap_update_bits(void *ctx, uint + + val &= ~mask; + val |= write_val; +- qca8k_mii_write32(bus, 0x10 | r2, r1, val); ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); + + exit: + mutex_unlock(&bus->mdio_lock); +@@ -1117,14 +1152,14 @@ qca8k_mdio_write(struct qca8k_priv *priv + if (ret) + goto exit; + +- qca8k_mii_write32(bus, 0x10 | r2, r1, val); ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); + + ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, + QCA8K_MDIO_MASTER_BUSY); + + exit: + /* even if the busy_wait timeouts try to clear the MASTER_EN */ +- qca8k_mii_write32(bus, 0x10 | r2, r1, 0); ++ qca8k_mii_write32(priv, 0x10 | r2, r1, 0); + + mutex_unlock(&bus->mdio_lock); + +@@ -1154,7 +1189,7 @@ qca8k_mdio_read(struct qca8k_priv *priv, + if (ret) + goto exit; + +- qca8k_mii_write32(bus, 0x10 | r2, r1, val); ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); + + ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, + QCA8K_MDIO_MASTER_BUSY); +@@ -1165,7 +1200,7 @@ qca8k_mdio_read(struct qca8k_priv *priv, + + exit: + /* even if the busy_wait timeouts try to clear the MASTER_EN */ +- qca8k_mii_write32(bus, 0x10 | r2, r1, 0); ++ qca8k_mii_write32(priv, 0x10 | r2, r1, 0); + + mutex_unlock(&bus->mdio_lock); + +@@ -3057,6 +3092,8 @@ qca8k_sw_probe(struct mdio_device *mdiod + } + + priv->mdio_cache.page = 0xffff; ++ priv->mdio_cache.lo = 0xffff; ++ priv->mdio_cache.hi = 0xffff; + + /* Check the detected switch id */ + ret = qca8k_read_switch_id(priv); +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -369,6 +369,11 @@ struct qca8k_mdio_cache { + * mdio writes + */ + u16 page; ++/* lo and hi can also be cached and from Documentation we can skip one ++ * extra mdio write if lo or hi is didn't change. ++ */ ++ u16 lo; ++ u16 hi; + }; + + struct qca8k_priv { diff --git a/target/linux/generic/backport-5.15/766-v5.18-15-net-dsa-qca8k-add-support-for-larger-read-write-size.patch b/target/linux/generic/backport-5.15/766-v5.18-15-net-dsa-qca8k-add-support-for-larger-read-write-size.patch new file mode 100644 index 0000000000..5acd13dbad --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-15-net-dsa-qca8k-add-support-for-larger-read-write-size.patch @@ -0,0 +1,206 @@ +From 90386223f44e2a751d7e9e9ac8f78ea33358a891 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:34 +0100 +Subject: [PATCH 15/16] net: dsa: qca8k: add support for larger read/write size + with mgmt Ethernet + +mgmt Ethernet packet can read/write up to 16byte at times. The len reg +is limited to 15 (0xf). The switch actually sends and accepts data in 4 +different steps of len values. +Len steps: +- 0: nothing +- 1-4: first 4 byte +- 5-6: first 12 byte +- 7-15: all 16 byte + +In the alloc skb function we check if the len is 16 and we fix it to a +len of 15. It the read/write function interest to extract the real asked +data. The tagger handler will always copy the fully 16byte with a READ +command. This is useful for some big regs like the fdb reg that are +more than 4byte of data. This permits to introduce a bulk function that +will send and request the entire entry in one go. +Write function is changed and it does now require to pass the pointer to +val to also handle array val. + +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 61 +++++++++++++++++++++++++++-------------- + 1 file changed, 41 insertions(+), 20 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -222,7 +222,9 @@ static void qca8k_rw_reg_ack_handler(str + if (cmd == MDIO_READ) { + mgmt_eth_data->data[0] = mgmt_ethhdr->mdio_data; + +- /* Get the rest of the 12 byte of data */ ++ /* Get the rest of the 12 byte of data. ++ * The read/write function will extract the requested data. ++ */ + if (len > QCA_HDR_MGMT_DATA1_LEN) + memcpy(mgmt_eth_data->data + 1, skb->data, + QCA_HDR_MGMT_DATA2_LEN); +@@ -232,16 +234,30 @@ static void qca8k_rw_reg_ack_handler(str + } + + static struct sk_buff *qca8k_alloc_mdio_header(enum mdio_cmd cmd, u32 reg, u32 *val, +- int priority) ++ int priority, unsigned int len) + { + struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ unsigned int real_len; + struct sk_buff *skb; ++ u32 *data2; + u16 hdr; + + skb = dev_alloc_skb(QCA_HDR_MGMT_PKT_LEN); + if (!skb) + return NULL; + ++ /* Max value for len reg is 15 (0xf) but the switch actually return 16 byte ++ * Actually for some reason the steps are: ++ * 0: nothing ++ * 1-4: first 4 byte ++ * 5-6: first 12 byte ++ * 7-15: all 16 byte ++ */ ++ if (len == 16) ++ real_len = 15; ++ else ++ real_len = len; ++ + skb_reset_mac_header(skb); + skb_set_network_header(skb, skb->len); + +@@ -254,7 +270,7 @@ static struct sk_buff *qca8k_alloc_mdio_ + hdr |= FIELD_PREP(QCA_HDR_XMIT_CONTROL, QCA_HDR_XMIT_TYPE_RW_REG); + + mgmt_ethhdr->command = FIELD_PREP(QCA_HDR_MGMT_ADDR, reg); +- mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_LENGTH, 4); ++ mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_LENGTH, real_len); + mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CMD, cmd); + mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CHECK_CODE, + QCA_HDR_MGMT_CHECK_CODE_VAL); +@@ -264,7 +280,9 @@ static struct sk_buff *qca8k_alloc_mdio_ + + mgmt_ethhdr->hdr = htons(hdr); + +- skb_put_zero(skb, QCA_HDR_MGMT_DATA2_LEN + QCA_HDR_MGMT_PADDING_LEN); ++ data2 = skb_put_zero(skb, QCA_HDR_MGMT_DATA2_LEN + QCA_HDR_MGMT_PADDING_LEN); ++ if (cmd == MDIO_WRITE && len > QCA_HDR_MGMT_DATA1_LEN) ++ memcpy(data2, val + 1, len - QCA_HDR_MGMT_DATA1_LEN); + + return skb; + } +@@ -277,7 +295,7 @@ static void qca8k_mdio_header_fill_seq_n + mgmt_ethhdr->seq = FIELD_PREP(QCA_HDR_MGMT_SEQ_NUM, seq_num); + } + +-static int qca8k_read_eth(struct qca8k_priv *priv, u32 reg, u32 *val) ++static int qca8k_read_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) + { + struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; + struct sk_buff *skb; +@@ -285,7 +303,7 @@ static int qca8k_read_eth(struct qca8k_p + int ret; + + skb = qca8k_alloc_mdio_header(MDIO_READ, reg, NULL, +- QCA8K_ETHERNET_MDIO_PRIORITY); ++ QCA8K_ETHERNET_MDIO_PRIORITY, len); + if (!skb) + return -ENOMEM; + +@@ -313,6 +331,9 @@ static int qca8k_read_eth(struct qca8k_p + msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); + + *val = mgmt_eth_data->data[0]; ++ if (len > QCA_HDR_MGMT_DATA1_LEN) ++ memcpy(val + 1, mgmt_eth_data->data + 1, len - QCA_HDR_MGMT_DATA1_LEN); ++ + ack = mgmt_eth_data->ack; + + mutex_unlock(&mgmt_eth_data->mutex); +@@ -326,15 +347,15 @@ static int qca8k_read_eth(struct qca8k_p + return 0; + } + +-static int qca8k_write_eth(struct qca8k_priv *priv, u32 reg, u32 val) ++static int qca8k_write_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) + { + struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; + struct sk_buff *skb; + bool ack; + int ret; + +- skb = qca8k_alloc_mdio_header(MDIO_WRITE, reg, &val, +- QCA8K_ETHERNET_MDIO_PRIORITY); ++ skb = qca8k_alloc_mdio_header(MDIO_WRITE, reg, val, ++ QCA8K_ETHERNET_MDIO_PRIORITY, len); + if (!skb) + return -ENOMEM; + +@@ -380,14 +401,14 @@ qca8k_regmap_update_bits_eth(struct qca8 + u32 val = 0; + int ret; + +- ret = qca8k_read_eth(priv, reg, &val); ++ ret = qca8k_read_eth(priv, reg, &val, sizeof(val)); + if (ret) + return ret; + + val &= ~mask; + val |= write_val; + +- return qca8k_write_eth(priv, reg, val); ++ return qca8k_write_eth(priv, reg, &val, sizeof(val)); + } + + static int +@@ -398,7 +419,7 @@ qca8k_regmap_read(void *ctx, uint32_t re + u16 r1, r2, page; + int ret; + +- if (!qca8k_read_eth(priv, reg, val)) ++ if (!qca8k_read_eth(priv, reg, val, sizeof(val))) + return 0; + + qca8k_split_addr(reg, &r1, &r2, &page); +@@ -424,7 +445,7 @@ qca8k_regmap_write(void *ctx, uint32_t r + u16 r1, r2, page; + int ret; + +- if (!qca8k_write_eth(priv, reg, val)) ++ if (!qca8k_write_eth(priv, reg, &val, sizeof(val))) + return 0; + + qca8k_split_addr(reg, &r1, &r2, &page); +@@ -959,21 +980,21 @@ qca8k_phy_eth_command(struct qca8k_priv + } + + /* Prealloc all the needed skb before the lock */ +- write_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, +- &write_val, QCA8K_ETHERNET_PHY_PRIORITY); ++ write_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &write_val, ++ QCA8K_ETHERNET_PHY_PRIORITY, sizeof(write_val)); + if (!write_skb) + return -ENOMEM; + +- clear_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, +- &clear_val, QCA8K_ETHERNET_PHY_PRIORITY); ++ clear_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &clear_val, ++ QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); + if (!write_skb) { + ret = -ENOMEM; + goto err_clear_skb; + } + +- read_skb = qca8k_alloc_mdio_header(MDIO_READ, QCA8K_MDIO_MASTER_CTRL, +- &clear_val, QCA8K_ETHERNET_PHY_PRIORITY); +- if (!write_skb) { ++ read_skb = qca8k_alloc_mdio_header(MDIO_READ, QCA8K_MDIO_MASTER_CTRL, &clear_val, ++ QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); ++ if (!read_skb) { + ret = -ENOMEM; + goto err_read_skb; + } diff --git a/target/linux/generic/backport-5.15/766-v5.18-16-net-dsa-qca8k-introduce-qca8k_bulk_read-write-functi.patch b/target/linux/generic/backport-5.15/766-v5.18-16-net-dsa-qca8k-introduce-qca8k_bulk_read-write-functi.patch new file mode 100644 index 0000000000..f26c6b91ac --- /dev/null +++ b/target/linux/generic/backport-5.15/766-v5.18-16-net-dsa-qca8k-introduce-qca8k_bulk_read-write-functi.patch @@ -0,0 +1,104 @@ +From 4f3701fc599820568ba4395070d34e4248800fc0 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Wed, 2 Feb 2022 01:03:35 +0100 +Subject: [PATCH 16/16] net: dsa: qca8k: introduce qca8k_bulk_read/write + function + +Introduce qca8k_bulk_read/write() function to use mgmt Ethernet way to +read/write packet in bulk. Make use of this new function in the fdb +function and while at it reduce the reg for fdb_read from 4 to 3 as the +max bit for the ARL(fdb) table is 83 bits. + +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 55 ++++++++++++++++++++++++++++++++--------- + 1 file changed, 43 insertions(+), 12 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -412,6 +412,43 @@ qca8k_regmap_update_bits_eth(struct qca8 + } + + static int ++qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ int i, count = len / sizeof(u32), ret; ++ ++ if (priv->mgmt_master && !qca8k_read_eth(priv, reg, val, len)) ++ return 0; ++ ++ for (i = 0; i < count; i++) { ++ ret = regmap_read(priv->regmap, reg + (i * 4), val + i); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ int i, count = len / sizeof(u32), ret; ++ u32 tmp; ++ ++ if (priv->mgmt_master && !qca8k_write_eth(priv, reg, val, len)) ++ return 0; ++ ++ for (i = 0; i < count; i++) { ++ tmp = val[i]; ++ ++ ret = regmap_write(priv->regmap, reg + (i * 4), tmp); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static int + qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) + { + struct qca8k_priv *priv = (struct qca8k_priv *)ctx; +@@ -546,17 +583,13 @@ qca8k_busy_wait(struct qca8k_priv *priv, + static int + qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb) + { +- u32 reg[4], val; +- int i, ret; ++ u32 reg[3]; ++ int ret; + + /* load the ARL table into an array */ +- for (i = 0; i < 4; i++) { +- ret = qca8k_read(priv, QCA8K_REG_ATU_DATA0 + (i * 4), &val); +- if (ret < 0) +- return ret; +- +- reg[i] = val; +- } ++ ret = qca8k_bulk_read(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); ++ if (ret) ++ return ret; + + /* vid - 83:72 */ + fdb->vid = FIELD_GET(QCA8K_ATU_VID_MASK, reg[2]); +@@ -580,7 +613,6 @@ qca8k_fdb_write(struct qca8k_priv *priv, + u8 aging) + { + u32 reg[3] = { 0 }; +- int i; + + /* vid - 83:72 */ + reg[2] = FIELD_PREP(QCA8K_ATU_VID_MASK, vid); +@@ -597,8 +629,7 @@ qca8k_fdb_write(struct qca8k_priv *priv, + reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR5_MASK, mac[5]); + + /* load the array into the ARL table */ +- for (i = 0; i < 3; i++) +- qca8k_write(priv, QCA8K_REG_ATU_DATA0 + (i * 4), reg[i]); ++ qca8k_bulk_write(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); + } + + static int diff --git a/target/linux/generic/backport-5.15/767-v5.18-net-dsa-qca8k-check-correct-variable-in-qca8k_phy_et.patch b/target/linux/generic/backport-5.15/767-v5.18-net-dsa-qca8k-check-correct-variable-in-qca8k_phy_et.patch new file mode 100644 index 0000000000..34607c223c --- /dev/null +++ b/target/linux/generic/backport-5.15/767-v5.18-net-dsa-qca8k-check-correct-variable-in-qca8k_phy_et.patch @@ -0,0 +1,28 @@ +From c3664d913dc115cab4a5fdb5634df4887048000e Mon Sep 17 00:00:00 2001 +From: Dan Carpenter +Date: Fri, 4 Feb 2022 13:03:36 +0300 +Subject: [PATCH 1/1] net: dsa: qca8k: check correct variable in + qca8k_phy_eth_command() + +This is a copy and paste bug. It was supposed to check "clear_skb" +instead of "write_skb". + +Fixes: 2cd548566384 ("net: dsa: qca8k: add support for phy read/write with mgmt Ethernet") +Signed-off-by: Dan Carpenter +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -1018,7 +1018,7 @@ qca8k_phy_eth_command(struct qca8k_priv + + clear_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &clear_val, + QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); +- if (!write_skb) { ++ if (!clear_skb) { + ret = -ENOMEM; + goto err_clear_skb; + } diff --git a/target/linux/generic/backport-5.15/768-v5.18-net-dsa-qca8k-fix-noderef.cocci-warnings.patch b/target/linux/generic/backport-5.15/768-v5.18-net-dsa-qca8k-fix-noderef.cocci-warnings.patch new file mode 100644 index 0000000000..d8cf266309 --- /dev/null +++ b/target/linux/generic/backport-5.15/768-v5.18-net-dsa-qca8k-fix-noderef.cocci-warnings.patch @@ -0,0 +1,34 @@ +From 4f5e483b8c7a644733db941a1ae00173baa7b463 Mon Sep 17 00:00:00 2001 +From: kernel test robot +Date: Thu, 10 Feb 2022 06:13:04 +0800 +Subject: [PATCH 1/1] net: dsa: qca8k: fix noderef.cocci warnings + +drivers/net/dsa/qca8k.c:422:37-43: ERROR: application of sizeof to pointer + + sizeof when applied to a pointer typed expression gives the size of + the pointer + +Generated by: scripts/coccinelle/misc/noderef.cocci + +Fixes: 90386223f44e ("net: dsa: qca8k: add support for larger read/write size with mgmt Ethernet") +CC: Ansuel Smith +Reported-by: kernel test robot +Signed-off-by: kernel test robot +Reviewed-by: Florian Fainelli +Link: https://lore.kernel.org/r/20220209221304.GA17529@d2214a582157 +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca8k.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -456,7 +456,7 @@ qca8k_regmap_read(void *ctx, uint32_t re + u16 r1, r2, page; + int ret; + +- if (!qca8k_read_eth(priv, reg, val, sizeof(val))) ++ if (!qca8k_read_eth(priv, reg, val, sizeof(*val))) + return 0; + + qca8k_split_addr(reg, &r1, &r2, &page); diff --git a/target/linux/generic/backport-5.15/769-v5.19-01-net-dsa-qca8k-drop-MTU-tracking-from-qca8k_priv.patch b/target/linux/generic/backport-5.15/769-v5.19-01-net-dsa-qca8k-drop-MTU-tracking-from-qca8k_priv.patch new file mode 100644 index 0000000000..57df4c126e --- /dev/null +++ b/target/linux/generic/backport-5.15/769-v5.19-01-net-dsa-qca8k-drop-MTU-tracking-from-qca8k_priv.patch @@ -0,0 +1,79 @@ +From 69fd055957a02309ffdc23d887a01988b6e5bab1 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sat, 16 Apr 2022 01:30:12 +0200 +Subject: [PATCH 1/6] net: dsa: qca8k: drop MTU tracking from qca8k_priv + +DSA set the CPU port based on the largest MTU of all the slave ports. +Based on this we can drop the MTU array from qca8k_priv and set the +port_change_mtu logic on DSA changing MTU of the CPU port as the switch +have a global MTU settingfor each port. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 26 +++++++++----------------- + drivers/net/dsa/qca8k.h | 1 - + 2 files changed, 9 insertions(+), 18 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -1803,16 +1803,6 @@ qca8k_setup(struct dsa_switch *ds) + QCA8K_PORT_HOL_CTRL1_WRED_EN, + mask); + } +- +- /* Set initial MTU for every port. +- * We have only have a general MTU setting. So track +- * every port and set the max across all port. +- * Set per port MTU to 1500 as the MTU change function +- * will add the overhead and if its set to 1518 then it +- * will apply the overhead again and we will end up with +- * MTU of 1536 instead of 1518 +- */ +- priv->port_mtu[i] = ETH_DATA_LEN; + } + + /* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */ +@@ -2525,13 +2515,16 @@ static int + qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu) + { + struct qca8k_priv *priv = ds->priv; +- int ret, i, mtu = 0; +- +- priv->port_mtu[port] = new_mtu; ++ int ret; + +- for (i = 0; i < QCA8K_NUM_PORTS; i++) +- if (priv->port_mtu[i] > mtu) +- mtu = priv->port_mtu[i]; ++ /* We have only have a general MTU setting. ++ * DSA always set the CPU port's MTU to the largest MTU of the slave ++ * ports. ++ * Setting MTU just for the CPU port is sufficient to correctly set a ++ * value for every port. ++ */ ++ if (!dsa_is_cpu_port(ds, port)) ++ return 0; + + /* To change the MAX_FRAME_SIZE the cpu ports must be off or + * the switch panics. +@@ -2545,7 +2538,7 @@ qca8k_port_change_mtu(struct dsa_switch + qca8k_port_set_status(priv, 6, 0); + + /* Include L2 header / FCS length */ +- ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, mtu + ETH_HLEN + ETH_FCS_LEN); ++ ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ETH_HLEN + ETH_FCS_LEN); + + if (priv->port_sts[0].enabled) + qca8k_port_set_status(priv, 0, 1); +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -392,7 +392,6 @@ struct qca8k_priv { + struct device *dev; + struct dsa_switch_ops ops; + struct gpio_desc *reset_gpio; +- unsigned int port_mtu[QCA8K_NUM_PORTS]; + struct net_device *mgmt_master; /* Track if mdio/mib Ethernet is available */ + struct qca8k_mgmt_eth_data mgmt_eth_data; + struct qca8k_mib_eth_data mib_eth_data; diff --git a/target/linux/generic/backport-5.15/769-v5.19-02-net-dsa-qca8k-drop-port_sts-from-qca8k_priv.patch b/target/linux/generic/backport-5.15/769-v5.19-02-net-dsa-qca8k-drop-port_sts-from-qca8k_priv.patch new file mode 100644 index 0000000000..3cacd7e4fd --- /dev/null +++ b/target/linux/generic/backport-5.15/769-v5.19-02-net-dsa-qca8k-drop-port_sts-from-qca8k_priv.patch @@ -0,0 +1,116 @@ +From 2b8fd87af7f156942971789abac8ee2bb60c03bc Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sat, 16 Apr 2022 01:30:13 +0200 +Subject: [PATCH 2/6] net: dsa: qca8k: drop port_sts from qca8k_priv + +Port_sts is a thing of the past for this driver. It was something +present on the initial implementation of this driver and parts of the +original struct were dropped over time. Using an array of int to store if +a port is enabled or not to handle PM operation seems overkill. Switch +and use a simple u8 to store the port status where each bit correspond +to a port. (bit is set port is enabled, bit is not set, port is disabled) +Also add some comments to better describe why we need to track port +status. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 15 +++++++++------ + drivers/net/dsa/qca8k.h | 9 ++++----- + 2 files changed, 13 insertions(+), 11 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -2494,7 +2494,7 @@ qca8k_port_enable(struct dsa_switch *ds, + struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; + + qca8k_port_set_status(priv, port, 1); +- priv->port_sts[port].enabled = 1; ++ priv->port_enabled_map |= BIT(port); + + if (dsa_is_user_port(ds, port)) + phy_support_asym_pause(phy); +@@ -2508,7 +2508,7 @@ qca8k_port_disable(struct dsa_switch *ds + struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; + + qca8k_port_set_status(priv, port, 0); +- priv->port_sts[port].enabled = 0; ++ priv->port_enabled_map &= ~BIT(port); + } + + static int +@@ -2531,19 +2531,19 @@ qca8k_port_change_mtu(struct dsa_switch + * Turn off both cpu ports before applying the new value to prevent + * this. + */ +- if (priv->port_sts[0].enabled) ++ if (priv->port_enabled_map & BIT(0)) + qca8k_port_set_status(priv, 0, 0); + +- if (priv->port_sts[6].enabled) ++ if (priv->port_enabled_map & BIT(6)) + qca8k_port_set_status(priv, 6, 0); + + /* Include L2 header / FCS length */ + ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ETH_HLEN + ETH_FCS_LEN); + +- if (priv->port_sts[0].enabled) ++ if (priv->port_enabled_map & BIT(0)) + qca8k_port_set_status(priv, 0, 1); + +- if (priv->port_sts[6].enabled) ++ if (priv->port_enabled_map & BIT(6)) + qca8k_port_set_status(priv, 6, 1); + + return ret; +@@ -3199,13 +3199,16 @@ static void qca8k_sw_shutdown(struct mdi + static void + qca8k_set_pm(struct qca8k_priv *priv, int enable) + { +- int i; ++ int port; + +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- if (!priv->port_sts[i].enabled) ++ for (port = 0; port < QCA8K_NUM_PORTS; port++) { ++ /* Do not enable on resume if the port was ++ * disabled before. ++ */ ++ if (!(priv->port_enabled_map & BIT(port))) + continue; + +- qca8k_port_set_status(priv, i, enable); ++ qca8k_port_set_status(priv, port, enable); + } + } + +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -324,10 +324,6 @@ enum qca8k_mid_cmd { + QCA8K_MIB_CAST = 3, + }; + +-struct ar8xxx_port_status { +- int enabled; +-}; +- + struct qca8k_match_data { + u8 id; + bool reduced_package; +@@ -382,11 +378,14 @@ struct qca8k_priv { + u8 mirror_rx; + u8 mirror_tx; + u8 lag_hash_mode; ++ /* Each bit correspond to a port. This switch can support a max of 7 port. ++ * Bit 1: port enabled. Bit 0: port disabled. ++ */ ++ u8 port_enabled_map; + bool legacy_phy_port_mapping; + struct qca8k_ports_config ports_config; + struct regmap *regmap; + struct mii_bus *bus; +- struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS]; + struct dsa_switch *ds; + struct mutex reg_mutex; + struct device *dev; diff --git a/target/linux/generic/backport-5.15/769-v5.19-03-net-dsa-qca8k-rework-and-simplify-mdiobus-logic.patch b/target/linux/generic/backport-5.15/769-v5.19-03-net-dsa-qca8k-rework-and-simplify-mdiobus-logic.patch new file mode 100644 index 0000000000..12c3221077 --- /dev/null +++ b/target/linux/generic/backport-5.15/769-v5.19-03-net-dsa-qca8k-rework-and-simplify-mdiobus-logic.patch @@ -0,0 +1,173 @@ +From 8255212e4130bd2dc1463286a3dddb74797bbdc1 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sat, 16 Apr 2022 01:30:14 +0200 +Subject: [PATCH 3/6] net: dsa: qca8k: rework and simplify mdiobus logic + +In an attempt to reduce qca8k_priv space, rework and simplify mdiobus +logic. +We now declare a mdiobus instead of relying on DSA phy_read/write even +if a mdio node is not present. This is all to make the qca8k ops static +and not switch specific. With a legacy implementation where port doesn't +have a phy map declared in the dts with a mdio node, we declare a +'qca8k-legacy' mdiobus. The conversion logic is used as legacy read and +write ops are used instead of the internal one. +Also drop the legacy_phy_port_mapping as we now declare mdiobus with ops +that already address the workaround. + +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 95 +++++++++++++---------------------------- + drivers/net/dsa/qca8k.h | 1 - + 2 files changed, 29 insertions(+), 67 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -1291,83 +1291,63 @@ qca8k_internal_mdio_read(struct mii_bus + } + + static int +-qca8k_phy_write(struct dsa_switch *ds, int port, int regnum, u16 data) ++qca8k_legacy_mdio_write(struct mii_bus *slave_bus, int port, int regnum, u16 data) + { +- struct qca8k_priv *priv = ds->priv; +- int ret; ++ port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; + +- /* Check if the legacy mapping should be used and the +- * port is not correctly mapped to the right PHY in the +- * devicetree +- */ +- if (priv->legacy_phy_port_mapping) +- port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; +- +- /* Use mdio Ethernet when available, fallback to legacy one on error */ +- ret = qca8k_phy_eth_command(priv, false, port, regnum, 0); +- if (!ret) +- return ret; +- +- return qca8k_mdio_write(priv, port, regnum, data); ++ return qca8k_internal_mdio_write(slave_bus, port, regnum, data); + } + + static int +-qca8k_phy_read(struct dsa_switch *ds, int port, int regnum) ++qca8k_legacy_mdio_read(struct mii_bus *slave_bus, int port, int regnum) + { +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- /* Check if the legacy mapping should be used and the +- * port is not correctly mapped to the right PHY in the +- * devicetree +- */ +- if (priv->legacy_phy_port_mapping) +- port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; +- +- /* Use mdio Ethernet when available, fallback to legacy one on error */ +- ret = qca8k_phy_eth_command(priv, true, port, regnum, 0); +- if (ret >= 0) +- return ret; +- +- ret = qca8k_mdio_read(priv, port, regnum); +- +- if (ret < 0) +- return 0xffff; ++ port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; + +- return ret; ++ return qca8k_internal_mdio_read(slave_bus, port, regnum); + } + + static int +-qca8k_mdio_register(struct qca8k_priv *priv, struct device_node *mdio) ++qca8k_mdio_register(struct qca8k_priv *priv) + { + struct dsa_switch *ds = priv->ds; ++ struct device_node *mdio; + struct mii_bus *bus; + + bus = devm_mdiobus_alloc(ds->dev); +- + if (!bus) + return -ENOMEM; + + bus->priv = (void *)priv; +- bus->name = "qca8k slave mii"; +- bus->read = qca8k_internal_mdio_read; +- bus->write = qca8k_internal_mdio_write; +- snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d", +- ds->index); +- + bus->parent = ds->dev; + bus->phy_mask = ~ds->phys_mii_mask; +- + ds->slave_mii_bus = bus; + +- return devm_of_mdiobus_register(priv->dev, bus, mdio); ++ /* Check if the devicetree declare the port:phy mapping */ ++ mdio = of_get_child_by_name(priv->dev->of_node, "mdio"); ++ if (of_device_is_available(mdio)) { ++ snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d", ds->index); ++ bus->name = "qca8k slave mii"; ++ bus->read = qca8k_internal_mdio_read; ++ bus->write = qca8k_internal_mdio_write; ++ return devm_of_mdiobus_register(priv->dev, bus, mdio); ++ } ++ ++ /* If a mapping can't be found the legacy mapping is used, ++ * using the qca8k_port_to_phy function ++ */ ++ snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d.%d", ++ ds->dst->index, ds->index); ++ bus->name = "qca8k-legacy slave mii"; ++ bus->read = qca8k_legacy_mdio_read; ++ bus->write = qca8k_legacy_mdio_write; ++ return devm_mdiobus_register(priv->dev, bus); + } + + static int + qca8k_setup_mdio_bus(struct qca8k_priv *priv) + { + u32 internal_mdio_mask = 0, external_mdio_mask = 0, reg; +- struct device_node *ports, *port, *mdio; ++ struct device_node *ports, *port; + phy_interface_t mode; + int err; + +@@ -1429,24 +1409,7 @@ qca8k_setup_mdio_bus(struct qca8k_priv * + QCA8K_MDIO_MASTER_EN); + } + +- /* Check if the devicetree declare the port:phy mapping */ +- mdio = of_get_child_by_name(priv->dev->of_node, "mdio"); +- if (of_device_is_available(mdio)) { +- err = qca8k_mdio_register(priv, mdio); +- if (err) +- of_node_put(mdio); +- +- return err; +- } +- +- /* If a mapping can't be found the legacy mapping is used, +- * using the qca8k_port_to_phy function +- */ +- priv->legacy_phy_port_mapping = true; +- priv->ops.phy_read = qca8k_phy_read; +- priv->ops.phy_write = qca8k_phy_write; +- +- return 0; ++ return qca8k_mdio_register(priv); + } + + static int +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -382,7 +382,6 @@ struct qca8k_priv { + * Bit 1: port enabled. Bit 0: port disabled. + */ + u8 port_enabled_map; +- bool legacy_phy_port_mapping; + struct qca8k_ports_config ports_config; + struct regmap *regmap; + struct mii_bus *bus; diff --git a/target/linux/generic/backport-5.15/769-v5.19-04-net-dsa-qca8k-drop-dsa_switch_ops-from-qca8k_priv.patch b/target/linux/generic/backport-5.15/769-v5.19-04-net-dsa-qca8k-drop-dsa_switch_ops-from-qca8k_priv.patch new file mode 100644 index 0000000000..8641000abb --- /dev/null +++ b/target/linux/generic/backport-5.15/769-v5.19-04-net-dsa-qca8k-drop-dsa_switch_ops-from-qca8k_priv.patch @@ -0,0 +1,39 @@ +From 2349b83a2486c55b9dd225326f0172a84a43c5e4 Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sat, 16 Apr 2022 01:30:15 +0200 +Subject: [PATCH 4/6] net: dsa: qca8k: drop dsa_switch_ops from qca8k_priv + +Now that dsa_switch_ops is not switch specific anymore, we can drop it +from qca8k_priv and use the static ops directly for the dsa_switch +pointer. + +Signed-off-by: Ansuel Smith +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 3 +-- + drivers/net/dsa/qca8k.h | 1 - + 2 files changed, 1 insertion(+), 3 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -3121,8 +3121,7 @@ qca8k_sw_probe(struct mdio_device *mdiod + priv->ds->dev = &mdiodev->dev; + priv->ds->num_ports = QCA8K_NUM_PORTS; + priv->ds->priv = priv; +- priv->ops = qca8k_switch_ops; +- priv->ds->ops = &priv->ops; ++ priv->ds->ops = &qca8k_switch_ops; + mutex_init(&priv->reg_mutex); + dev_set_drvdata(&mdiodev->dev, priv); + +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -388,7 +388,6 @@ struct qca8k_priv { + struct dsa_switch *ds; + struct mutex reg_mutex; + struct device *dev; +- struct dsa_switch_ops ops; + struct gpio_desc *reset_gpio; + struct net_device *mgmt_master; /* Track if mdio/mib Ethernet is available */ + struct qca8k_mgmt_eth_data mgmt_eth_data; diff --git a/target/linux/generic/backport-5.15/769-v5.19-05-net-dsa-qca8k-correctly-handle-mdio-read-error.patch b/target/linux/generic/backport-5.15/769-v5.19-05-net-dsa-qca8k-correctly-handle-mdio-read-error.patch new file mode 100644 index 0000000000..b14b22091b --- /dev/null +++ b/target/linux/generic/backport-5.15/769-v5.19-05-net-dsa-qca8k-correctly-handle-mdio-read-error.patch @@ -0,0 +1,33 @@ +From 6cfc03b602200c5cbbd8d906fd905547814e83df Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sat, 16 Apr 2022 01:30:16 +0200 +Subject: [PATCH 5/6] net: dsa: qca8k: correctly handle mdio read error + +Restore original way to handle mdio read error by returning 0xffff. +This was wrongly changed when the internal_mdio_read was introduced, +now that both legacy and internal use the same function, make sure that +they behave the same way. + +Fixes: ce062a0adbfe ("net: dsa: qca8k: fix kernel panic with legacy mdio mapping") +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -1287,7 +1287,12 @@ qca8k_internal_mdio_read(struct mii_bus + if (ret >= 0) + return ret; + +- return qca8k_mdio_read(priv, phy, regnum); ++ ret = qca8k_mdio_read(priv, phy, regnum); ++ ++ if (ret < 0) ++ return 0xffff; ++ ++ return ret; + } + + static int diff --git a/target/linux/generic/backport-5.15/769-v5.19-06-net-dsa-qca8k-unify-bus-id-naming-with-legacy-and-OF.patch b/target/linux/generic/backport-5.15/769-v5.19-06-net-dsa-qca8k-unify-bus-id-naming-with-legacy-and-OF.patch new file mode 100644 index 0000000000..094686f11b --- /dev/null +++ b/target/linux/generic/backport-5.15/769-v5.19-06-net-dsa-qca8k-unify-bus-id-naming-with-legacy-and-OF.patch @@ -0,0 +1,44 @@ +From 8d1af50842bf2774f4edc57054206e909117469b Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Sat, 16 Apr 2022 01:30:17 +0200 +Subject: [PATCH 6/6] net: dsa: qca8k: unify bus id naming with legacy and OF + mdio bus + +Add support for multiple switch with OF mdio bus declaration. +Unify the bus id naming and use the same logic for both legacy and OF +mdio bus. + +Signed-off-by: Ansuel Smith +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca8k.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -1323,6 +1323,8 @@ qca8k_mdio_register(struct qca8k_priv *p + return -ENOMEM; + + bus->priv = (void *)priv; ++ snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d.%d", ++ ds->dst->index, ds->index); + bus->parent = ds->dev; + bus->phy_mask = ~ds->phys_mii_mask; + ds->slave_mii_bus = bus; +@@ -1330,7 +1332,6 @@ qca8k_mdio_register(struct qca8k_priv *p + /* Check if the devicetree declare the port:phy mapping */ + mdio = of_get_child_by_name(priv->dev->of_node, "mdio"); + if (of_device_is_available(mdio)) { +- snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d", ds->index); + bus->name = "qca8k slave mii"; + bus->read = qca8k_internal_mdio_read; + bus->write = qca8k_internal_mdio_write; +@@ -1340,8 +1341,6 @@ qca8k_mdio_register(struct qca8k_priv *p + /* If a mapping can't be found the legacy mapping is used, + * using the qca8k_port_to_phy function + */ +- snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d.%d", +- ds->dst->index, ds->index); + bus->name = "qca8k-legacy slave mii"; + bus->read = qca8k_legacy_mdio_read; + bus->write = qca8k_legacy_mdio_write; diff --git a/target/linux/generic/backport-5.15/770-v6.0-net-dsa-qca8k-move-driver-to-qca-dir.patch b/target/linux/generic/backport-5.15/770-v6.0-net-dsa-qca8k-move-driver-to-qca-dir.patch new file mode 100644 index 0000000000..1534113f1d --- /dev/null +++ b/target/linux/generic/backport-5.15/770-v6.0-net-dsa-qca8k-move-driver-to-qca-dir.patch @@ -0,0 +1,7389 @@ +From 4bbaf764e1e1786eb937fdb62172f656f512e116 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 13 Jul 2022 22:53:50 +0200 +Subject: [PATCH 1/1] net: dsa: qca8k: move driver to qca dir + +Move qca8k driver to qca dir in preparation for code split and +introduction of ipq4019 switch based on qca8k. + +Signed-off-by: Christian Marangi +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/dsa/Kconfig | 8 -------- + drivers/net/dsa/Makefile | 1 - + drivers/net/dsa/qca/Kconfig | 8 ++++++++ + drivers/net/dsa/qca/Makefile | 1 + + drivers/net/dsa/{ => qca}/qca8k.c | 0 + drivers/net/dsa/{ => qca}/qca8k.h | 0 + 6 files changed, 9 insertions(+), 9 deletions(-) + rename drivers/net/dsa/{ => qca}/qca8k.c (100%) + rename drivers/net/dsa/{ => qca}/qca8k.h (100%) + +--- a/drivers/net/dsa/Kconfig ++++ b/drivers/net/dsa/Kconfig +@@ -60,14 +60,6 @@ source "drivers/net/dsa/sja1105/Kconfig" + + source "drivers/net/dsa/xrs700x/Kconfig" + +-config NET_DSA_QCA8K +- tristate "Qualcomm Atheros QCA8K Ethernet switch family support" +- select NET_DSA_TAG_QCA +- select REGMAP +- help +- This enables support for the Qualcomm Atheros QCA8K Ethernet +- switch chips. +- + config NET_DSA_REALTEK_SMI + tristate "Realtek SMI Ethernet switch family support" + select NET_DSA_TAG_RTL4_A +--- a/drivers/net/dsa/Makefile ++++ b/drivers/net/dsa/Makefile +@@ -8,7 +8,6 @@ endif + obj-$(CONFIG_NET_DSA_LANTIQ_GSWIP) += lantiq_gswip.o + obj-$(CONFIG_NET_DSA_MT7530) += mt7530.o + obj-$(CONFIG_NET_DSA_MV88E6060) += mv88e6060.o +-obj-$(CONFIG_NET_DSA_QCA8K) += qca8k.o + obj-$(CONFIG_NET_DSA_REALTEK_SMI) += realtek-smi.o + realtek-smi-objs := realtek-smi-core.o rtl8366.o rtl8366rb.o + obj-$(CONFIG_NET_DSA_SMSC_LAN9303) += lan9303-core.o +--- a/drivers/net/dsa/qca/Kconfig ++++ b/drivers/net/dsa/qca/Kconfig +@@ -7,3 +7,11 @@ config NET_DSA_AR9331 + help + This enables support for the Qualcomm Atheros AR9331 built-in Ethernet + switch. ++ ++config NET_DSA_QCA8K ++ tristate "Qualcomm Atheros QCA8K Ethernet switch family support" ++ select NET_DSA_TAG_QCA ++ select REGMAP ++ help ++ This enables support for the Qualcomm Atheros QCA8K Ethernet ++ switch chips. +--- a/drivers/net/dsa/qca/Makefile ++++ b/drivers/net/dsa/qca/Makefile +@@ -1,2 +1,3 @@ + # SPDX-License-Identifier: GPL-2.0-only + obj-$(CONFIG_NET_DSA_AR9331) += ar9331.o ++obj-$(CONFIG_NET_DSA_QCA8K) += qca8k.o +--- /dev/null ++++ b/drivers/net/dsa/qca/qca8k.c +@@ -0,0 +1,3243 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2009 Felix Fietkau ++ * Copyright (C) 2011-2012 Gabor Juhos ++ * Copyright (c) 2015, 2019, The Linux Foundation. All rights reserved. ++ * Copyright (c) 2016 John Crispin ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "qca8k.h" ++ ++#define MIB_DESC(_s, _o, _n) \ ++ { \ ++ .size = (_s), \ ++ .offset = (_o), \ ++ .name = (_n), \ ++ } ++ ++static const struct qca8k_mib_desc ar8327_mib[] = { ++ MIB_DESC(1, 0x00, "RxBroad"), ++ MIB_DESC(1, 0x04, "RxPause"), ++ MIB_DESC(1, 0x08, "RxMulti"), ++ MIB_DESC(1, 0x0c, "RxFcsErr"), ++ MIB_DESC(1, 0x10, "RxAlignErr"), ++ MIB_DESC(1, 0x14, "RxRunt"), ++ MIB_DESC(1, 0x18, "RxFragment"), ++ MIB_DESC(1, 0x1c, "Rx64Byte"), ++ MIB_DESC(1, 0x20, "Rx128Byte"), ++ MIB_DESC(1, 0x24, "Rx256Byte"), ++ MIB_DESC(1, 0x28, "Rx512Byte"), ++ MIB_DESC(1, 0x2c, "Rx1024Byte"), ++ MIB_DESC(1, 0x30, "Rx1518Byte"), ++ MIB_DESC(1, 0x34, "RxMaxByte"), ++ MIB_DESC(1, 0x38, "RxTooLong"), ++ MIB_DESC(2, 0x3c, "RxGoodByte"), ++ MIB_DESC(2, 0x44, "RxBadByte"), ++ MIB_DESC(1, 0x4c, "RxOverFlow"), ++ MIB_DESC(1, 0x50, "Filtered"), ++ MIB_DESC(1, 0x54, "TxBroad"), ++ MIB_DESC(1, 0x58, "TxPause"), ++ MIB_DESC(1, 0x5c, "TxMulti"), ++ MIB_DESC(1, 0x60, "TxUnderRun"), ++ MIB_DESC(1, 0x64, "Tx64Byte"), ++ MIB_DESC(1, 0x68, "Tx128Byte"), ++ MIB_DESC(1, 0x6c, "Tx256Byte"), ++ MIB_DESC(1, 0x70, "Tx512Byte"), ++ MIB_DESC(1, 0x74, "Tx1024Byte"), ++ MIB_DESC(1, 0x78, "Tx1518Byte"), ++ MIB_DESC(1, 0x7c, "TxMaxByte"), ++ MIB_DESC(1, 0x80, "TxOverSize"), ++ MIB_DESC(2, 0x84, "TxByte"), ++ MIB_DESC(1, 0x8c, "TxCollision"), ++ MIB_DESC(1, 0x90, "TxAbortCol"), ++ MIB_DESC(1, 0x94, "TxMultiCol"), ++ MIB_DESC(1, 0x98, "TxSingleCol"), ++ MIB_DESC(1, 0x9c, "TxExcDefer"), ++ MIB_DESC(1, 0xa0, "TxDefer"), ++ MIB_DESC(1, 0xa4, "TxLateCol"), ++ MIB_DESC(1, 0xa8, "RXUnicast"), ++ MIB_DESC(1, 0xac, "TXUnicast"), ++}; ++ ++static void ++qca8k_split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) ++{ ++ regaddr >>= 1; ++ *r1 = regaddr & 0x1e; ++ ++ regaddr >>= 5; ++ *r2 = regaddr & 0x7; ++ ++ regaddr >>= 3; ++ *page = regaddr & 0x3ff; ++} ++ ++static int ++qca8k_set_lo(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 lo) ++{ ++ u16 *cached_lo = &priv->mdio_cache.lo; ++ struct mii_bus *bus = priv->bus; ++ int ret; ++ ++ if (lo == *cached_lo) ++ return 0; ++ ++ ret = bus->write(bus, phy_id, regnum, lo); ++ if (ret < 0) ++ dev_err_ratelimited(&bus->dev, ++ "failed to write qca8k 32bit lo register\n"); ++ ++ *cached_lo = lo; ++ return 0; ++} ++ ++static int ++qca8k_set_hi(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 hi) ++{ ++ u16 *cached_hi = &priv->mdio_cache.hi; ++ struct mii_bus *bus = priv->bus; ++ int ret; ++ ++ if (hi == *cached_hi) ++ return 0; ++ ++ ret = bus->write(bus, phy_id, regnum, hi); ++ if (ret < 0) ++ dev_err_ratelimited(&bus->dev, ++ "failed to write qca8k 32bit hi register\n"); ++ ++ *cached_hi = hi; ++ return 0; ++} ++ ++static int ++qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) ++{ ++ int ret; ++ ++ ret = bus->read(bus, phy_id, regnum); ++ if (ret >= 0) { ++ *val = ret; ++ ret = bus->read(bus, phy_id, regnum + 1); ++ *val |= ret << 16; ++ } ++ ++ if (ret < 0) { ++ dev_err_ratelimited(&bus->dev, ++ "failed to read qca8k 32bit register\n"); ++ *val = 0; ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static void ++qca8k_mii_write32(struct qca8k_priv *priv, int phy_id, u32 regnum, u32 val) ++{ ++ u16 lo, hi; ++ int ret; ++ ++ lo = val & 0xffff; ++ hi = (u16)(val >> 16); ++ ++ ret = qca8k_set_lo(priv, phy_id, regnum, lo); ++ if (ret >= 0) ++ ret = qca8k_set_hi(priv, phy_id, regnum + 1, hi); ++} ++ ++static int ++qca8k_set_page(struct qca8k_priv *priv, u16 page) ++{ ++ u16 *cached_page = &priv->mdio_cache.page; ++ struct mii_bus *bus = priv->bus; ++ int ret; ++ ++ if (page == *cached_page) ++ return 0; ++ ++ ret = bus->write(bus, 0x18, 0, page); ++ if (ret < 0) { ++ dev_err_ratelimited(&bus->dev, ++ "failed to set qca8k page\n"); ++ return ret; ++ } ++ ++ *cached_page = page; ++ usleep_range(1000, 2000); ++ return 0; ++} ++ ++static int ++qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val) ++{ ++ return regmap_read(priv->regmap, reg, val); ++} ++ ++static int ++qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val) ++{ ++ return regmap_write(priv->regmap, reg, val); ++} ++ ++static int ++qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) ++{ ++ return regmap_update_bits(priv->regmap, reg, mask, write_val); ++} ++ ++static void qca8k_rw_reg_ack_handler(struct dsa_switch *ds, struct sk_buff *skb) ++{ ++ struct qca8k_mgmt_eth_data *mgmt_eth_data; ++ struct qca8k_priv *priv = ds->priv; ++ struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ u8 len, cmd; ++ ++ mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb_mac_header(skb); ++ mgmt_eth_data = &priv->mgmt_eth_data; ++ ++ cmd = FIELD_GET(QCA_HDR_MGMT_CMD, mgmt_ethhdr->command); ++ len = FIELD_GET(QCA_HDR_MGMT_LENGTH, mgmt_ethhdr->command); ++ ++ /* Make sure the seq match the requested packet */ ++ if (mgmt_ethhdr->seq == mgmt_eth_data->seq) ++ mgmt_eth_data->ack = true; ++ ++ if (cmd == MDIO_READ) { ++ mgmt_eth_data->data[0] = mgmt_ethhdr->mdio_data; ++ ++ /* Get the rest of the 12 byte of data. ++ * The read/write function will extract the requested data. ++ */ ++ if (len > QCA_HDR_MGMT_DATA1_LEN) ++ memcpy(mgmt_eth_data->data + 1, skb->data, ++ QCA_HDR_MGMT_DATA2_LEN); ++ } ++ ++ complete(&mgmt_eth_data->rw_done); ++} ++ ++static struct sk_buff *qca8k_alloc_mdio_header(enum mdio_cmd cmd, u32 reg, u32 *val, ++ int priority, unsigned int len) ++{ ++ struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ unsigned int real_len; ++ struct sk_buff *skb; ++ u32 *data2; ++ u16 hdr; ++ ++ skb = dev_alloc_skb(QCA_HDR_MGMT_PKT_LEN); ++ if (!skb) ++ return NULL; ++ ++ /* Max value for len reg is 15 (0xf) but the switch actually return 16 byte ++ * Actually for some reason the steps are: ++ * 0: nothing ++ * 1-4: first 4 byte ++ * 5-6: first 12 byte ++ * 7-15: all 16 byte ++ */ ++ if (len == 16) ++ real_len = 15; ++ else ++ real_len = len; ++ ++ skb_reset_mac_header(skb); ++ skb_set_network_header(skb, skb->len); ++ ++ mgmt_ethhdr = skb_push(skb, QCA_HDR_MGMT_HEADER_LEN + QCA_HDR_LEN); ++ ++ hdr = FIELD_PREP(QCA_HDR_XMIT_VERSION, QCA_HDR_VERSION); ++ hdr |= FIELD_PREP(QCA_HDR_XMIT_PRIORITY, priority); ++ hdr |= QCA_HDR_XMIT_FROM_CPU; ++ hdr |= FIELD_PREP(QCA_HDR_XMIT_DP_BIT, BIT(0)); ++ hdr |= FIELD_PREP(QCA_HDR_XMIT_CONTROL, QCA_HDR_XMIT_TYPE_RW_REG); ++ ++ mgmt_ethhdr->command = FIELD_PREP(QCA_HDR_MGMT_ADDR, reg); ++ mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_LENGTH, real_len); ++ mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CMD, cmd); ++ mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CHECK_CODE, ++ QCA_HDR_MGMT_CHECK_CODE_VAL); ++ ++ if (cmd == MDIO_WRITE) ++ mgmt_ethhdr->mdio_data = *val; ++ ++ mgmt_ethhdr->hdr = htons(hdr); ++ ++ data2 = skb_put_zero(skb, QCA_HDR_MGMT_DATA2_LEN + QCA_HDR_MGMT_PADDING_LEN); ++ if (cmd == MDIO_WRITE && len > QCA_HDR_MGMT_DATA1_LEN) ++ memcpy(data2, val + 1, len - QCA_HDR_MGMT_DATA1_LEN); ++ ++ return skb; ++} ++ ++static void qca8k_mdio_header_fill_seq_num(struct sk_buff *skb, u32 seq_num) ++{ ++ struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ ++ mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb->data; ++ mgmt_ethhdr->seq = FIELD_PREP(QCA_HDR_MGMT_SEQ_NUM, seq_num); ++} ++ ++static int qca8k_read_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; ++ struct sk_buff *skb; ++ bool ack; ++ int ret; ++ ++ skb = qca8k_alloc_mdio_header(MDIO_READ, reg, NULL, ++ QCA8K_ETHERNET_MDIO_PRIORITY, len); ++ if (!skb) ++ return -ENOMEM; ++ ++ mutex_lock(&mgmt_eth_data->mutex); ++ ++ /* Check mgmt_master if is operational */ ++ if (!priv->mgmt_master) { ++ kfree_skb(skb); ++ mutex_unlock(&mgmt_eth_data->mutex); ++ return -EINVAL; ++ } ++ ++ skb->dev = priv->mgmt_master; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the mdio pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); ++ ++ *val = mgmt_eth_data->data[0]; ++ if (len > QCA_HDR_MGMT_DATA1_LEN) ++ memcpy(val + 1, mgmt_eth_data->data + 1, len - QCA_HDR_MGMT_DATA1_LEN); ++ ++ ack = mgmt_eth_data->ack; ++ ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ++ if (ret <= 0) ++ return -ETIMEDOUT; ++ ++ if (!ack) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int qca8k_write_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; ++ struct sk_buff *skb; ++ bool ack; ++ int ret; ++ ++ skb = qca8k_alloc_mdio_header(MDIO_WRITE, reg, val, ++ QCA8K_ETHERNET_MDIO_PRIORITY, len); ++ if (!skb) ++ return -ENOMEM; ++ ++ mutex_lock(&mgmt_eth_data->mutex); ++ ++ /* Check mgmt_master if is operational */ ++ if (!priv->mgmt_master) { ++ kfree_skb(skb); ++ mutex_unlock(&mgmt_eth_data->mutex); ++ return -EINVAL; ++ } ++ ++ skb->dev = priv->mgmt_master; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the mdio pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); ++ ++ ack = mgmt_eth_data->ack; ++ ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ++ if (ret <= 0) ++ return -ETIMEDOUT; ++ ++ if (!ack) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int ++qca8k_regmap_update_bits_eth(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) ++{ ++ u32 val = 0; ++ int ret; ++ ++ ret = qca8k_read_eth(priv, reg, &val, sizeof(val)); ++ if (ret) ++ return ret; ++ ++ val &= ~mask; ++ val |= write_val; ++ ++ return qca8k_write_eth(priv, reg, &val, sizeof(val)); ++} ++ ++static int ++qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ int i, count = len / sizeof(u32), ret; ++ ++ if (priv->mgmt_master && !qca8k_read_eth(priv, reg, val, len)) ++ return 0; ++ ++ for (i = 0; i < count; i++) { ++ ret = regmap_read(priv->regmap, reg + (i * 4), val + i); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ int i, count = len / sizeof(u32), ret; ++ u32 tmp; ++ ++ if (priv->mgmt_master && !qca8k_write_eth(priv, reg, val, len)) ++ return 0; ++ ++ for (i = 0; i < count; i++) { ++ tmp = val[i]; ++ ++ ret = regmap_write(priv->regmap, reg + (i * 4), tmp); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ctx; ++ struct mii_bus *bus = priv->bus; ++ u16 r1, r2, page; ++ int ret; ++ ++ if (!qca8k_read_eth(priv, reg, val, sizeof(*val))) ++ return 0; ++ ++ qca8k_split_addr(reg, &r1, &r2, &page); ++ ++ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ ++ ret = qca8k_set_page(priv, page); ++ if (ret < 0) ++ goto exit; ++ ++ ret = qca8k_mii_read32(bus, 0x10 | r2, r1, val); ++ ++exit: ++ mutex_unlock(&bus->mdio_lock); ++ return ret; ++} ++ ++static int ++qca8k_regmap_write(void *ctx, uint32_t reg, uint32_t val) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ctx; ++ struct mii_bus *bus = priv->bus; ++ u16 r1, r2, page; ++ int ret; ++ ++ if (!qca8k_write_eth(priv, reg, &val, sizeof(val))) ++ return 0; ++ ++ qca8k_split_addr(reg, &r1, &r2, &page); ++ ++ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ ++ ret = qca8k_set_page(priv, page); ++ if (ret < 0) ++ goto exit; ++ ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ ++exit: ++ mutex_unlock(&bus->mdio_lock); ++ return ret; ++} ++ ++static int ++qca8k_regmap_update_bits(void *ctx, uint32_t reg, uint32_t mask, uint32_t write_val) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ctx; ++ struct mii_bus *bus = priv->bus; ++ u16 r1, r2, page; ++ u32 val; ++ int ret; ++ ++ if (!qca8k_regmap_update_bits_eth(priv, reg, mask, write_val)) ++ return 0; ++ ++ qca8k_split_addr(reg, &r1, &r2, &page); ++ ++ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ ++ ret = qca8k_set_page(priv, page); ++ if (ret < 0) ++ goto exit; ++ ++ ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); ++ if (ret < 0) ++ goto exit; ++ ++ val &= ~mask; ++ val |= write_val; ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ ++exit: ++ mutex_unlock(&bus->mdio_lock); ++ ++ return ret; ++} ++ ++static const struct regmap_range qca8k_readable_ranges[] = { ++ regmap_reg_range(0x0000, 0x00e4), /* Global control */ ++ regmap_reg_range(0x0100, 0x0168), /* EEE control */ ++ regmap_reg_range(0x0200, 0x0270), /* Parser control */ ++ regmap_reg_range(0x0400, 0x0454), /* ACL */ ++ regmap_reg_range(0x0600, 0x0718), /* Lookup */ ++ regmap_reg_range(0x0800, 0x0b70), /* QM */ ++ regmap_reg_range(0x0c00, 0x0c80), /* PKT */ ++ regmap_reg_range(0x0e00, 0x0e98), /* L3 */ ++ regmap_reg_range(0x1000, 0x10ac), /* MIB - Port0 */ ++ regmap_reg_range(0x1100, 0x11ac), /* MIB - Port1 */ ++ regmap_reg_range(0x1200, 0x12ac), /* MIB - Port2 */ ++ regmap_reg_range(0x1300, 0x13ac), /* MIB - Port3 */ ++ regmap_reg_range(0x1400, 0x14ac), /* MIB - Port4 */ ++ regmap_reg_range(0x1500, 0x15ac), /* MIB - Port5 */ ++ regmap_reg_range(0x1600, 0x16ac), /* MIB - Port6 */ ++ ++}; ++ ++static const struct regmap_access_table qca8k_readable_table = { ++ .yes_ranges = qca8k_readable_ranges, ++ .n_yes_ranges = ARRAY_SIZE(qca8k_readable_ranges), ++}; ++ ++static struct regmap_config qca8k_regmap_config = { ++ .reg_bits = 16, ++ .val_bits = 32, ++ .reg_stride = 4, ++ .max_register = 0x16ac, /* end MIB - Port6 range */ ++ .reg_read = qca8k_regmap_read, ++ .reg_write = qca8k_regmap_write, ++ .reg_update_bits = qca8k_regmap_update_bits, ++ .rd_table = &qca8k_readable_table, ++ .disable_locking = true, /* Locking is handled by qca8k read/write */ ++ .cache_type = REGCACHE_NONE, /* Explicitly disable CACHE */ ++}; ++ ++static int ++qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) ++{ ++ u32 val; ++ ++ return regmap_read_poll_timeout(priv->regmap, reg, val, !(val & mask), 0, ++ QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC); ++} ++ ++static int ++qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb) ++{ ++ u32 reg[3]; ++ int ret; ++ ++ /* load the ARL table into an array */ ++ ret = qca8k_bulk_read(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); ++ if (ret) ++ return ret; ++ ++ /* vid - 83:72 */ ++ fdb->vid = FIELD_GET(QCA8K_ATU_VID_MASK, reg[2]); ++ /* aging - 67:64 */ ++ fdb->aging = FIELD_GET(QCA8K_ATU_STATUS_MASK, reg[2]); ++ /* portmask - 54:48 */ ++ fdb->port_mask = FIELD_GET(QCA8K_ATU_PORT_MASK, reg[1]); ++ /* mac - 47:0 */ ++ fdb->mac[0] = FIELD_GET(QCA8K_ATU_ADDR0_MASK, reg[1]); ++ fdb->mac[1] = FIELD_GET(QCA8K_ATU_ADDR1_MASK, reg[1]); ++ fdb->mac[2] = FIELD_GET(QCA8K_ATU_ADDR2_MASK, reg[0]); ++ fdb->mac[3] = FIELD_GET(QCA8K_ATU_ADDR3_MASK, reg[0]); ++ fdb->mac[4] = FIELD_GET(QCA8K_ATU_ADDR4_MASK, reg[0]); ++ fdb->mac[5] = FIELD_GET(QCA8K_ATU_ADDR5_MASK, reg[0]); ++ ++ return 0; ++} ++ ++static void ++qca8k_fdb_write(struct qca8k_priv *priv, u16 vid, u8 port_mask, const u8 *mac, ++ u8 aging) ++{ ++ u32 reg[3] = { 0 }; ++ ++ /* vid - 83:72 */ ++ reg[2] = FIELD_PREP(QCA8K_ATU_VID_MASK, vid); ++ /* aging - 67:64 */ ++ reg[2] |= FIELD_PREP(QCA8K_ATU_STATUS_MASK, aging); ++ /* portmask - 54:48 */ ++ reg[1] = FIELD_PREP(QCA8K_ATU_PORT_MASK, port_mask); ++ /* mac - 47:0 */ ++ reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR0_MASK, mac[0]); ++ reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR1_MASK, mac[1]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR2_MASK, mac[2]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR3_MASK, mac[3]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR4_MASK, mac[4]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR5_MASK, mac[5]); ++ ++ /* load the array into the ARL table */ ++ qca8k_bulk_write(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); ++} ++ ++static int ++qca8k_fdb_access(struct qca8k_priv *priv, enum qca8k_fdb_cmd cmd, int port) ++{ ++ u32 reg; ++ int ret; ++ ++ /* Set the command and FDB index */ ++ reg = QCA8K_ATU_FUNC_BUSY; ++ reg |= cmd; ++ if (port >= 0) { ++ reg |= QCA8K_ATU_FUNC_PORT_EN; ++ reg |= FIELD_PREP(QCA8K_ATU_FUNC_PORT_MASK, port); ++ } ++ ++ /* Write the function register triggering the table access */ ++ ret = qca8k_write(priv, QCA8K_REG_ATU_FUNC, reg); ++ if (ret) ++ return ret; ++ ++ /* wait for completion */ ++ ret = qca8k_busy_wait(priv, QCA8K_REG_ATU_FUNC, QCA8K_ATU_FUNC_BUSY); ++ if (ret) ++ return ret; ++ ++ /* Check for table full violation when adding an entry */ ++ if (cmd == QCA8K_FDB_LOAD) { ++ ret = qca8k_read(priv, QCA8K_REG_ATU_FUNC, ®); ++ if (ret < 0) ++ return ret; ++ if (reg & QCA8K_ATU_FUNC_FULL) ++ return -1; ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_fdb_next(struct qca8k_priv *priv, struct qca8k_fdb *fdb, int port) ++{ ++ int ret; ++ ++ qca8k_fdb_write(priv, fdb->vid, fdb->port_mask, fdb->mac, fdb->aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_NEXT, port); ++ if (ret < 0) ++ return ret; ++ ++ return qca8k_fdb_read(priv, fdb); ++} ++ ++static int ++qca8k_fdb_add(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, ++ u16 vid, u8 aging) ++{ ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_write(priv, vid, port_mask, mac, aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ ++static int ++qca8k_fdb_del(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, u16 vid) ++{ ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_write(priv, vid, port_mask, mac, 0); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ ++static void ++qca8k_fdb_flush(struct qca8k_priv *priv) ++{ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_access(priv, QCA8K_FDB_FLUSH, -1); ++ mutex_unlock(&priv->reg_mutex); ++} ++ ++static int ++qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask, ++ const u8 *mac, u16 vid) ++{ ++ struct qca8k_fdb fdb = { 0 }; ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ++ qca8k_fdb_write(priv, vid, 0, mac, 0); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); ++ if (ret < 0) ++ goto exit; ++ ++ ret = qca8k_fdb_read(priv, &fdb); ++ if (ret < 0) ++ goto exit; ++ ++ /* Rule exist. Delete first */ ++ if (!fdb.aging) { ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); ++ if (ret) ++ goto exit; ++ } ++ ++ /* Add port to fdb portmask */ ++ fdb.port_mask |= port_mask; ++ ++ qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++static int ++qca8k_fdb_search_and_del(struct qca8k_priv *priv, u8 port_mask, ++ const u8 *mac, u16 vid) ++{ ++ struct qca8k_fdb fdb = { 0 }; ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ++ qca8k_fdb_write(priv, vid, 0, mac, 0); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); ++ if (ret < 0) ++ goto exit; ++ ++ /* Rule doesn't exist. Why delete? */ ++ if (!fdb.aging) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); ++ if (ret) ++ goto exit; ++ ++ /* Only port in the rule is this port. Don't re insert */ ++ if (fdb.port_mask == port_mask) ++ goto exit; ++ ++ /* Remove port from port mask */ ++ fdb.port_mask &= ~port_mask; ++ ++ qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++static int ++qca8k_vlan_access(struct qca8k_priv *priv, enum qca8k_vlan_cmd cmd, u16 vid) ++{ ++ u32 reg; ++ int ret; ++ ++ /* Set the command and VLAN index */ ++ reg = QCA8K_VTU_FUNC1_BUSY; ++ reg |= cmd; ++ reg |= FIELD_PREP(QCA8K_VTU_FUNC1_VID_MASK, vid); ++ ++ /* Write the function register triggering the table access */ ++ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC1, reg); ++ if (ret) ++ return ret; ++ ++ /* wait for completion */ ++ ret = qca8k_busy_wait(priv, QCA8K_REG_VTU_FUNC1, QCA8K_VTU_FUNC1_BUSY); ++ if (ret) ++ return ret; ++ ++ /* Check for table full violation when adding an entry */ ++ if (cmd == QCA8K_VLAN_LOAD) { ++ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC1, ®); ++ if (ret < 0) ++ return ret; ++ if (reg & QCA8K_VTU_FUNC1_FULL) ++ return -ENOMEM; ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_vlan_add(struct qca8k_priv *priv, u8 port, u16 vid, bool untagged) ++{ ++ u32 reg; ++ int ret; ++ ++ /* ++ We do the right thing with VLAN 0 and treat it as untagged while ++ preserving the tag on egress. ++ */ ++ if (vid == 0) ++ return 0; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); ++ if (ret < 0) ++ goto out; ++ ++ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); ++ if (ret < 0) ++ goto out; ++ reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; ++ reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); ++ if (untagged) ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(port); ++ else ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(port); ++ ++ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); ++ if (ret) ++ goto out; ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); ++ ++out: ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ ++static int ++qca8k_vlan_del(struct qca8k_priv *priv, u8 port, u16 vid) ++{ ++ u32 reg, mask; ++ int ret, i; ++ bool del; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); ++ if (ret < 0) ++ goto out; ++ ++ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); ++ if (ret < 0) ++ goto out; ++ reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(port); ++ ++ /* Check if we're the last member to be removed */ ++ del = true; ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ mask = QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(i); ++ ++ if ((reg & mask) != mask) { ++ del = false; ++ break; ++ } ++ } ++ ++ if (del) { ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_PURGE, vid); ++ } else { ++ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); ++ if (ret) ++ goto out; ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); ++ } ++ ++out: ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ ++static int ++qca8k_mib_init(struct qca8k_priv *priv) ++{ ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, ++ QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, ++ FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_FLUSH) | ++ QCA8K_MIB_BUSY); ++ if (ret) ++ goto exit; ++ ++ ret = qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY); ++ if (ret) ++ goto exit; ++ ++ ret = regmap_set_bits(priv->regmap, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP); ++ if (ret) ++ goto exit; ++ ++ ret = qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++static void ++qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable) ++{ ++ u32 mask = QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; ++ ++ /* Port 0 and 6 have no internal PHY */ ++ if (port > 0 && port < 6) ++ mask |= QCA8K_PORT_STATUS_LINK_AUTO; ++ ++ if (enable) ++ regmap_set_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); ++ else ++ regmap_clear_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); ++} ++ ++static int ++qca8k_phy_eth_busy_wait(struct qca8k_mgmt_eth_data *mgmt_eth_data, ++ struct sk_buff *read_skb, u32 *val) ++{ ++ struct sk_buff *skb = skb_copy(read_skb, GFP_KERNEL); ++ bool ack; ++ int ret; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the copy pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ ack = mgmt_eth_data->ack; ++ ++ if (ret <= 0) ++ return -ETIMEDOUT; ++ ++ if (!ack) ++ return -EINVAL; ++ ++ *val = mgmt_eth_data->data[0]; ++ ++ return 0; ++} ++ ++static int ++qca8k_phy_eth_command(struct qca8k_priv *priv, bool read, int phy, ++ int regnum, u16 data) ++{ ++ struct sk_buff *write_skb, *clear_skb, *read_skb; ++ struct qca8k_mgmt_eth_data *mgmt_eth_data; ++ u32 write_val, clear_val = 0, val; ++ struct net_device *mgmt_master; ++ int ret, ret1; ++ bool ack; ++ ++ if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) ++ return -EINVAL; ++ ++ mgmt_eth_data = &priv->mgmt_eth_data; ++ ++ write_val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | ++ QCA8K_MDIO_MASTER_PHY_ADDR(phy) | ++ QCA8K_MDIO_MASTER_REG_ADDR(regnum); ++ ++ if (read) { ++ write_val |= QCA8K_MDIO_MASTER_READ; ++ } else { ++ write_val |= QCA8K_MDIO_MASTER_WRITE; ++ write_val |= QCA8K_MDIO_MASTER_DATA(data); ++ } ++ ++ /* Prealloc all the needed skb before the lock */ ++ write_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &write_val, ++ QCA8K_ETHERNET_PHY_PRIORITY, sizeof(write_val)); ++ if (!write_skb) ++ return -ENOMEM; ++ ++ clear_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &clear_val, ++ QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); ++ if (!clear_skb) { ++ ret = -ENOMEM; ++ goto err_clear_skb; ++ } ++ ++ read_skb = qca8k_alloc_mdio_header(MDIO_READ, QCA8K_MDIO_MASTER_CTRL, &clear_val, ++ QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); ++ if (!read_skb) { ++ ret = -ENOMEM; ++ goto err_read_skb; ++ } ++ ++ /* Actually start the request: ++ * 1. Send mdio master packet ++ * 2. Busy Wait for mdio master command ++ * 3. Get the data if we are reading ++ * 4. Reset the mdio master (even with error) ++ */ ++ mutex_lock(&mgmt_eth_data->mutex); ++ ++ /* Check if mgmt_master is operational */ ++ mgmt_master = priv->mgmt_master; ++ if (!mgmt_master) { ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ret = -EINVAL; ++ goto err_mgmt_master; ++ } ++ ++ read_skb->dev = mgmt_master; ++ clear_skb->dev = mgmt_master; ++ write_skb->dev = mgmt_master; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the write pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(write_skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(write_skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ ack = mgmt_eth_data->ack; ++ ++ if (ret <= 0) { ++ ret = -ETIMEDOUT; ++ kfree_skb(read_skb); ++ goto exit; ++ } ++ ++ if (!ack) { ++ ret = -EINVAL; ++ kfree_skb(read_skb); ++ goto exit; ++ } ++ ++ ret = read_poll_timeout(qca8k_phy_eth_busy_wait, ret1, ++ !(val & QCA8K_MDIO_MASTER_BUSY), 0, ++ QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, ++ mgmt_eth_data, read_skb, &val); ++ ++ if (ret < 0 && ret1 < 0) { ++ ret = ret1; ++ goto exit; ++ } ++ ++ if (read) { ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the read pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(read_skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(read_skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ ack = mgmt_eth_data->ack; ++ ++ if (ret <= 0) { ++ ret = -ETIMEDOUT; ++ goto exit; ++ } ++ ++ if (!ack) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ ret = mgmt_eth_data->data[0] & QCA8K_MDIO_MASTER_DATA_MASK; ++ } else { ++ kfree_skb(read_skb); ++ } ++exit: ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the clear pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(clear_skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(clear_skb); ++ ++ wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ++ return ret; ++ ++ /* Error handling before lock */ ++err_mgmt_master: ++ kfree_skb(read_skb); ++err_read_skb: ++ kfree_skb(clear_skb); ++err_clear_skb: ++ kfree_skb(write_skb); ++ ++ return ret; ++} ++ ++static u32 ++qca8k_port_to_phy(int port) ++{ ++ /* From Andrew Lunn: ++ * Port 0 has no internal phy. ++ * Port 1 has an internal PHY at MDIO address 0. ++ * Port 2 has an internal PHY at MDIO address 1. ++ * ... ++ * Port 5 has an internal PHY at MDIO address 4. ++ * Port 6 has no internal PHY. ++ */ ++ ++ return port - 1; ++} ++ ++static int ++qca8k_mdio_busy_wait(struct mii_bus *bus, u32 reg, u32 mask) ++{ ++ u16 r1, r2, page; ++ u32 val; ++ int ret, ret1; ++ ++ qca8k_split_addr(reg, &r1, &r2, &page); ++ ++ ret = read_poll_timeout(qca8k_mii_read32, ret1, !(val & mask), 0, ++ QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, ++ bus, 0x10 | r2, r1, &val); ++ ++ /* Check if qca8k_read has failed for a different reason ++ * before returnting -ETIMEDOUT ++ */ ++ if (ret < 0 && ret1 < 0) ++ return ret1; ++ ++ return ret; ++} ++ ++static int ++qca8k_mdio_write(struct qca8k_priv *priv, int phy, int regnum, u16 data) ++{ ++ struct mii_bus *bus = priv->bus; ++ u16 r1, r2, page; ++ u32 val; ++ int ret; ++ ++ if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) ++ return -EINVAL; ++ ++ val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | ++ QCA8K_MDIO_MASTER_WRITE | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | ++ QCA8K_MDIO_MASTER_REG_ADDR(regnum) | ++ QCA8K_MDIO_MASTER_DATA(data); ++ ++ qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); ++ ++ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ ++ ret = qca8k_set_page(priv, page); ++ if (ret) ++ goto exit; ++ ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ ++ ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, ++ QCA8K_MDIO_MASTER_BUSY); ++ ++exit: ++ /* even if the busy_wait timeouts try to clear the MASTER_EN */ ++ qca8k_mii_write32(priv, 0x10 | r2, r1, 0); ++ ++ mutex_unlock(&bus->mdio_lock); ++ ++ return ret; ++} ++ ++static int ++qca8k_mdio_read(struct qca8k_priv *priv, int phy, int regnum) ++{ ++ struct mii_bus *bus = priv->bus; ++ u16 r1, r2, page; ++ u32 val; ++ int ret; ++ ++ if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) ++ return -EINVAL; ++ ++ val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | ++ QCA8K_MDIO_MASTER_READ | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | ++ QCA8K_MDIO_MASTER_REG_ADDR(regnum); ++ ++ qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); ++ ++ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ ++ ret = qca8k_set_page(priv, page); ++ if (ret) ++ goto exit; ++ ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ ++ ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, ++ QCA8K_MDIO_MASTER_BUSY); ++ if (ret) ++ goto exit; ++ ++ ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); ++ ++exit: ++ /* even if the busy_wait timeouts try to clear the MASTER_EN */ ++ qca8k_mii_write32(priv, 0x10 | r2, r1, 0); ++ ++ mutex_unlock(&bus->mdio_lock); ++ ++ if (ret >= 0) ++ ret = val & QCA8K_MDIO_MASTER_DATA_MASK; ++ ++ return ret; ++} ++ ++static int ++qca8k_internal_mdio_write(struct mii_bus *slave_bus, int phy, int regnum, u16 data) ++{ ++ struct qca8k_priv *priv = slave_bus->priv; ++ int ret; ++ ++ /* Use mdio Ethernet when available, fallback to legacy one on error */ ++ ret = qca8k_phy_eth_command(priv, false, phy, regnum, data); ++ if (!ret) ++ return 0; ++ ++ return qca8k_mdio_write(priv, phy, regnum, data); ++} ++ ++static int ++qca8k_internal_mdio_read(struct mii_bus *slave_bus, int phy, int regnum) ++{ ++ struct qca8k_priv *priv = slave_bus->priv; ++ int ret; ++ ++ /* Use mdio Ethernet when available, fallback to legacy one on error */ ++ ret = qca8k_phy_eth_command(priv, true, phy, regnum, 0); ++ if (ret >= 0) ++ return ret; ++ ++ ret = qca8k_mdio_read(priv, phy, regnum); ++ ++ if (ret < 0) ++ return 0xffff; ++ ++ return ret; ++} ++ ++static int ++qca8k_legacy_mdio_write(struct mii_bus *slave_bus, int port, int regnum, u16 data) ++{ ++ port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; ++ ++ return qca8k_internal_mdio_write(slave_bus, port, regnum, data); ++} ++ ++static int ++qca8k_legacy_mdio_read(struct mii_bus *slave_bus, int port, int regnum) ++{ ++ port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; ++ ++ return qca8k_internal_mdio_read(slave_bus, port, regnum); ++} ++ ++static int ++qca8k_mdio_register(struct qca8k_priv *priv) ++{ ++ struct dsa_switch *ds = priv->ds; ++ struct device_node *mdio; ++ struct mii_bus *bus; ++ ++ bus = devm_mdiobus_alloc(ds->dev); ++ if (!bus) ++ return -ENOMEM; ++ ++ bus->priv = (void *)priv; ++ snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d.%d", ++ ds->dst->index, ds->index); ++ bus->parent = ds->dev; ++ bus->phy_mask = ~ds->phys_mii_mask; ++ ds->slave_mii_bus = bus; ++ ++ /* Check if the devicetree declare the port:phy mapping */ ++ mdio = of_get_child_by_name(priv->dev->of_node, "mdio"); ++ if (of_device_is_available(mdio)) { ++ bus->name = "qca8k slave mii"; ++ bus->read = qca8k_internal_mdio_read; ++ bus->write = qca8k_internal_mdio_write; ++ return devm_of_mdiobus_register(priv->dev, bus, mdio); ++ } ++ ++ /* If a mapping can't be found the legacy mapping is used, ++ * using the qca8k_port_to_phy function ++ */ ++ bus->name = "qca8k-legacy slave mii"; ++ bus->read = qca8k_legacy_mdio_read; ++ bus->write = qca8k_legacy_mdio_write; ++ return devm_mdiobus_register(priv->dev, bus); ++} ++ ++static int ++qca8k_setup_mdio_bus(struct qca8k_priv *priv) ++{ ++ u32 internal_mdio_mask = 0, external_mdio_mask = 0, reg; ++ struct device_node *ports, *port; ++ phy_interface_t mode; ++ int err; ++ ++ ports = of_get_child_by_name(priv->dev->of_node, "ports"); ++ if (!ports) ++ ports = of_get_child_by_name(priv->dev->of_node, "ethernet-ports"); ++ ++ if (!ports) ++ return -EINVAL; ++ ++ for_each_available_child_of_node(ports, port) { ++ err = of_property_read_u32(port, "reg", ®); ++ if (err) { ++ of_node_put(port); ++ of_node_put(ports); ++ return err; ++ } ++ ++ if (!dsa_is_user_port(priv->ds, reg)) ++ continue; ++ ++ of_get_phy_mode(port, &mode); ++ ++ if (of_property_read_bool(port, "phy-handle") && ++ mode != PHY_INTERFACE_MODE_INTERNAL) ++ external_mdio_mask |= BIT(reg); ++ else ++ internal_mdio_mask |= BIT(reg); ++ } ++ ++ of_node_put(ports); ++ if (!external_mdio_mask && !internal_mdio_mask) { ++ dev_err(priv->dev, "no PHYs are defined.\n"); ++ return -EINVAL; ++ } ++ ++ /* The QCA8K_MDIO_MASTER_EN Bit, which grants access to PHYs through ++ * the MDIO_MASTER register also _disconnects_ the external MDC ++ * passthrough to the internal PHYs. It's not possible to use both ++ * configurations at the same time! ++ * ++ * Because this came up during the review process: ++ * If the external mdio-bus driver is capable magically disabling ++ * the QCA8K_MDIO_MASTER_EN and mutex/spin-locking out the qca8k's ++ * accessors for the time being, it would be possible to pull this ++ * off. ++ */ ++ if (!!external_mdio_mask && !!internal_mdio_mask) { ++ dev_err(priv->dev, "either internal or external mdio bus configuration is supported.\n"); ++ return -EINVAL; ++ } ++ ++ if (external_mdio_mask) { ++ /* Make sure to disable the internal mdio bus in cases ++ * a dt-overlay and driver reload changed the configuration ++ */ ++ ++ return regmap_clear_bits(priv->regmap, QCA8K_MDIO_MASTER_CTRL, ++ QCA8K_MDIO_MASTER_EN); ++ } ++ ++ return qca8k_mdio_register(priv); ++} ++ ++static int ++qca8k_setup_mac_pwr_sel(struct qca8k_priv *priv) ++{ ++ u32 mask = 0; ++ int ret = 0; ++ ++ /* SoC specific settings for ipq8064. ++ * If more device require this consider adding ++ * a dedicated binding. ++ */ ++ if (of_machine_is_compatible("qcom,ipq8064")) ++ mask |= QCA8K_MAC_PWR_RGMII0_1_8V; ++ ++ /* SoC specific settings for ipq8065 */ ++ if (of_machine_is_compatible("qcom,ipq8065")) ++ mask |= QCA8K_MAC_PWR_RGMII1_1_8V; ++ ++ if (mask) { ++ ret = qca8k_rmw(priv, QCA8K_REG_MAC_PWR_SEL, ++ QCA8K_MAC_PWR_RGMII0_1_8V | ++ QCA8K_MAC_PWR_RGMII1_1_8V, ++ mask); ++ } ++ ++ return ret; ++} ++ ++static int qca8k_find_cpu_port(struct dsa_switch *ds) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ /* Find the connected cpu port. Valid port are 0 or 6 */ ++ if (dsa_is_cpu_port(ds, 0)) ++ return 0; ++ ++ dev_dbg(priv->dev, "port 0 is not the CPU port. Checking port 6"); ++ ++ if (dsa_is_cpu_port(ds, 6)) ++ return 6; ++ ++ return -EINVAL; ++} ++ ++static int ++qca8k_setup_of_pws_reg(struct qca8k_priv *priv) ++{ ++ struct device_node *node = priv->dev->of_node; ++ const struct qca8k_match_data *data; ++ u32 val = 0; ++ int ret; ++ ++ /* QCA8327 require to set to the correct mode. ++ * His bigger brother QCA8328 have the 172 pin layout. ++ * Should be applied by default but we set this just to make sure. ++ */ ++ if (priv->switch_id == QCA8K_ID_QCA8327) { ++ data = of_device_get_match_data(priv->dev); ++ ++ /* Set the correct package of 148 pin for QCA8327 */ ++ if (data->reduced_package) ++ val |= QCA8327_PWS_PACKAGE148_EN; ++ ++ ret = qca8k_rmw(priv, QCA8K_REG_PWS, QCA8327_PWS_PACKAGE148_EN, ++ val); ++ if (ret) ++ return ret; ++ } ++ ++ if (of_property_read_bool(node, "qca,ignore-power-on-sel")) ++ val |= QCA8K_PWS_POWER_ON_SEL; ++ ++ if (of_property_read_bool(node, "qca,led-open-drain")) { ++ if (!(val & QCA8K_PWS_POWER_ON_SEL)) { ++ dev_err(priv->dev, "qca,led-open-drain require qca,ignore-power-on-sel to be set."); ++ return -EINVAL; ++ } ++ ++ val |= QCA8K_PWS_LED_OPEN_EN_CSR; ++ } ++ ++ return qca8k_rmw(priv, QCA8K_REG_PWS, ++ QCA8K_PWS_LED_OPEN_EN_CSR | QCA8K_PWS_POWER_ON_SEL, ++ val); ++} ++ ++static int ++qca8k_parse_port_config(struct qca8k_priv *priv) ++{ ++ int port, cpu_port_index = -1, ret; ++ struct device_node *port_dn; ++ phy_interface_t mode; ++ struct dsa_port *dp; ++ u32 delay; ++ ++ /* We have 2 CPU port. Check them */ ++ for (port = 0; port < QCA8K_NUM_PORTS; port++) { ++ /* Skip every other port */ ++ if (port != 0 && port != 6) ++ continue; ++ ++ dp = dsa_to_port(priv->ds, port); ++ port_dn = dp->dn; ++ cpu_port_index++; ++ ++ if (!of_device_is_available(port_dn)) ++ continue; ++ ++ ret = of_get_phy_mode(port_dn, &mode); ++ if (ret) ++ continue; ++ ++ switch (mode) { ++ case PHY_INTERFACE_MODE_RGMII: ++ case PHY_INTERFACE_MODE_RGMII_ID: ++ case PHY_INTERFACE_MODE_RGMII_TXID: ++ case PHY_INTERFACE_MODE_RGMII_RXID: ++ case PHY_INTERFACE_MODE_SGMII: ++ delay = 0; ++ ++ if (!of_property_read_u32(port_dn, "tx-internal-delay-ps", &delay)) ++ /* Switch regs accept value in ns, convert ps to ns */ ++ delay = delay / 1000; ++ else if (mode == PHY_INTERFACE_MODE_RGMII_ID || ++ mode == PHY_INTERFACE_MODE_RGMII_TXID) ++ delay = 1; ++ ++ if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK, delay)) { ++ dev_err(priv->dev, "rgmii tx delay is limited to a max value of 3ns, setting to the max value"); ++ delay = 3; ++ } ++ ++ priv->ports_config.rgmii_tx_delay[cpu_port_index] = delay; ++ ++ delay = 0; ++ ++ if (!of_property_read_u32(port_dn, "rx-internal-delay-ps", &delay)) ++ /* Switch regs accept value in ns, convert ps to ns */ ++ delay = delay / 1000; ++ else if (mode == PHY_INTERFACE_MODE_RGMII_ID || ++ mode == PHY_INTERFACE_MODE_RGMII_RXID) ++ delay = 2; ++ ++ if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK, delay)) { ++ dev_err(priv->dev, "rgmii rx delay is limited to a max value of 3ns, setting to the max value"); ++ delay = 3; ++ } ++ ++ priv->ports_config.rgmii_rx_delay[cpu_port_index] = delay; ++ ++ /* Skip sgmii parsing for rgmii* mode */ ++ if (mode == PHY_INTERFACE_MODE_RGMII || ++ mode == PHY_INTERFACE_MODE_RGMII_ID || ++ mode == PHY_INTERFACE_MODE_RGMII_TXID || ++ mode == PHY_INTERFACE_MODE_RGMII_RXID) ++ break; ++ ++ if (of_property_read_bool(port_dn, "qca,sgmii-txclk-falling-edge")) ++ priv->ports_config.sgmii_tx_clk_falling_edge = true; ++ ++ if (of_property_read_bool(port_dn, "qca,sgmii-rxclk-falling-edge")) ++ priv->ports_config.sgmii_rx_clk_falling_edge = true; ++ ++ if (of_property_read_bool(port_dn, "qca,sgmii-enable-pll")) { ++ priv->ports_config.sgmii_enable_pll = true; ++ ++ if (priv->switch_id == QCA8K_ID_QCA8327) { ++ dev_err(priv->dev, "SGMII PLL should NOT be enabled for qca8327. Aborting enabling"); ++ priv->ports_config.sgmii_enable_pll = false; ++ } ++ ++ if (priv->switch_revision < 2) ++ dev_warn(priv->dev, "SGMII PLL should NOT be enabled for qca8337 with revision 2 or more."); ++ } ++ ++ break; ++ default: ++ continue; ++ } ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_setup(struct dsa_switch *ds) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ int cpu_port, ret, i; ++ u32 mask; ++ ++ cpu_port = qca8k_find_cpu_port(ds); ++ if (cpu_port < 0) { ++ dev_err(priv->dev, "No cpu port configured in both cpu port0 and port6"); ++ return cpu_port; ++ } ++ ++ /* Parse CPU port config to be later used in phy_link mac_config */ ++ ret = qca8k_parse_port_config(priv); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_setup_mdio_bus(priv); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_setup_of_pws_reg(priv); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_setup_mac_pwr_sel(priv); ++ if (ret) ++ return ret; ++ ++ /* Make sure MAC06 is disabled */ ++ ret = regmap_clear_bits(priv->regmap, QCA8K_REG_PORT0_PAD_CTRL, ++ QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN); ++ if (ret) { ++ dev_err(priv->dev, "failed disabling MAC06 exchange"); ++ return ret; ++ } ++ ++ /* Enable CPU Port */ ++ ret = regmap_set_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, ++ QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN); ++ if (ret) { ++ dev_err(priv->dev, "failed enabling CPU port"); ++ return ret; ++ } ++ ++ /* Enable MIB counters */ ++ ret = qca8k_mib_init(priv); ++ if (ret) ++ dev_warn(priv->dev, "mib init failed"); ++ ++ /* Initial setup of all ports */ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ /* Disable forwarding by default on all ports */ ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), ++ QCA8K_PORT_LOOKUP_MEMBER, 0); ++ if (ret) ++ return ret; ++ ++ /* Enable QCA header mode on all cpu ports */ ++ if (dsa_is_cpu_port(ds, i)) { ++ ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(i), ++ FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) | ++ FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL)); ++ if (ret) { ++ dev_err(priv->dev, "failed enabling QCA header mode"); ++ return ret; ++ } ++ } ++ ++ /* Disable MAC by default on all user ports */ ++ if (dsa_is_user_port(ds, i)) ++ qca8k_port_set_status(priv, i, 0); ++ } ++ ++ /* Forward all unknown frames to CPU port for Linux processing ++ * Notice that in multi-cpu config only one port should be set ++ * for igmp, unknown, multicast and broadcast packet ++ */ ++ ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1, ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK, BIT(cpu_port)) | ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK, BIT(cpu_port)) | ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK, BIT(cpu_port)) | ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK, BIT(cpu_port))); ++ if (ret) ++ return ret; ++ ++ /* Setup connection between CPU port & user ports ++ * Configure specific switch configuration for ports ++ */ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ /* CPU port gets connected to all user ports of the switch */ ++ if (dsa_is_cpu_port(ds, i)) { ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), ++ QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds)); ++ if (ret) ++ return ret; ++ } ++ ++ /* Individual user ports get connected to CPU port only */ ++ if (dsa_is_user_port(ds, i)) { ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), ++ QCA8K_PORT_LOOKUP_MEMBER, ++ BIT(cpu_port)); ++ if (ret) ++ return ret; ++ ++ /* Enable ARP Auto-learning by default */ ++ ret = regmap_set_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(i), ++ QCA8K_PORT_LOOKUP_LEARN); ++ if (ret) ++ return ret; ++ ++ /* For port based vlans to work we need to set the ++ * default egress vid ++ */ ++ ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i), ++ QCA8K_EGREES_VLAN_PORT_MASK(i), ++ QCA8K_EGREES_VLAN_PORT(i, QCA8K_PORT_VID_DEF)); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i), ++ QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) | ++ QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF)); ++ if (ret) ++ return ret; ++ } ++ ++ /* The port 5 of the qca8337 have some problem in flood condition. The ++ * original legacy driver had some specific buffer and priority settings ++ * for the different port suggested by the QCA switch team. Add this ++ * missing settings to improve switch stability under load condition. ++ * This problem is limited to qca8337 and other qca8k switch are not affected. ++ */ ++ if (priv->switch_id == QCA8K_ID_QCA8337) { ++ switch (i) { ++ /* The 2 CPU port and port 5 requires some different ++ * priority than any other ports. ++ */ ++ case 0: ++ case 5: ++ case 6: ++ mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x4) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x4) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI4(0x6) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI5(0x8) | ++ QCA8K_PORT_HOL_CTRL0_EG_PORT(0x1e); ++ break; ++ default: ++ mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x6) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x8) | ++ QCA8K_PORT_HOL_CTRL0_EG_PORT(0x19); ++ } ++ qca8k_write(priv, QCA8K_REG_PORT_HOL_CTRL0(i), mask); ++ ++ mask = QCA8K_PORT_HOL_CTRL1_ING(0x6) | ++ QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | ++ QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | ++ QCA8K_PORT_HOL_CTRL1_WRED_EN; ++ qca8k_rmw(priv, QCA8K_REG_PORT_HOL_CTRL1(i), ++ QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK | ++ QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | ++ QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | ++ QCA8K_PORT_HOL_CTRL1_WRED_EN, ++ mask); ++ } ++ } ++ ++ /* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */ ++ if (priv->switch_id == QCA8K_ID_QCA8327) { ++ mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) | ++ QCA8K_GLOBAL_FC_GOL_XOFF_THRES(496); ++ qca8k_rmw(priv, QCA8K_REG_GLOBAL_FC_THRESH, ++ QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK | ++ QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK, ++ mask); ++ } ++ ++ /* Setup our port MTUs to match power on defaults */ ++ ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, ETH_FRAME_LEN + ETH_FCS_LEN); ++ if (ret) ++ dev_warn(priv->dev, "failed setting MTU settings"); ++ ++ /* Flush the FDB table */ ++ qca8k_fdb_flush(priv); ++ ++ /* We don't have interrupts for link changes, so we need to poll */ ++ ds->pcs_poll = true; ++ ++ /* Set min a max ageing value supported */ ++ ds->ageing_time_min = 7000; ++ ds->ageing_time_max = 458745000; ++ ++ /* Set max number of LAGs supported */ ++ ds->num_lag_ids = QCA8K_NUM_LAGS; ++ ++ return 0; ++} ++ ++static void ++qca8k_mac_config_setup_internal_delay(struct qca8k_priv *priv, int cpu_port_index, ++ u32 reg) ++{ ++ u32 delay, val = 0; ++ int ret; ++ ++ /* Delay can be declared in 3 different way. ++ * Mode to rgmii and internal-delay standard binding defined ++ * rgmii-id or rgmii-tx/rx phy mode set. ++ * The parse logic set a delay different than 0 only when one ++ * of the 3 different way is used. In all other case delay is ++ * not enabled. With ID or TX/RXID delay is enabled and set ++ * to the default and recommended value. ++ */ ++ if (priv->ports_config.rgmii_tx_delay[cpu_port_index]) { ++ delay = priv->ports_config.rgmii_tx_delay[cpu_port_index]; ++ ++ val |= QCA8K_PORT_PAD_RGMII_TX_DELAY(delay) | ++ QCA8K_PORT_PAD_RGMII_TX_DELAY_EN; ++ } ++ ++ if (priv->ports_config.rgmii_rx_delay[cpu_port_index]) { ++ delay = priv->ports_config.rgmii_rx_delay[cpu_port_index]; ++ ++ val |= QCA8K_PORT_PAD_RGMII_RX_DELAY(delay) | ++ QCA8K_PORT_PAD_RGMII_RX_DELAY_EN; ++ } ++ ++ /* Set RGMII delay based on the selected values */ ++ ret = qca8k_rmw(priv, reg, ++ QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK | ++ QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK | ++ QCA8K_PORT_PAD_RGMII_TX_DELAY_EN | ++ QCA8K_PORT_PAD_RGMII_RX_DELAY_EN, ++ val); ++ if (ret) ++ dev_err(priv->dev, "Failed to set internal delay for CPU port%d", ++ cpu_port_index == QCA8K_CPU_PORT0 ? 0 : 6); ++} ++ ++static void ++qca8k_phylink_mac_config(struct dsa_switch *ds, int port, unsigned int mode, ++ const struct phylink_link_state *state) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int cpu_port_index, ret; ++ u32 reg, val; ++ ++ switch (port) { ++ case 0: /* 1st CPU port */ ++ if (state->interface != PHY_INTERFACE_MODE_RGMII && ++ state->interface != PHY_INTERFACE_MODE_RGMII_ID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && ++ state->interface != PHY_INTERFACE_MODE_SGMII) ++ return; ++ ++ reg = QCA8K_REG_PORT0_PAD_CTRL; ++ cpu_port_index = QCA8K_CPU_PORT0; ++ break; ++ case 1: ++ case 2: ++ case 3: ++ case 4: ++ case 5: ++ /* Internal PHY, nothing to do */ ++ return; ++ case 6: /* 2nd CPU port / external PHY */ ++ if (state->interface != PHY_INTERFACE_MODE_RGMII && ++ state->interface != PHY_INTERFACE_MODE_RGMII_ID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && ++ state->interface != PHY_INTERFACE_MODE_SGMII && ++ state->interface != PHY_INTERFACE_MODE_1000BASEX) ++ return; ++ ++ reg = QCA8K_REG_PORT6_PAD_CTRL; ++ cpu_port_index = QCA8K_CPU_PORT6; ++ break; ++ default: ++ dev_err(ds->dev, "%s: unsupported port: %i\n", __func__, port); ++ return; ++ } ++ ++ if (port != 6 && phylink_autoneg_inband(mode)) { ++ dev_err(ds->dev, "%s: in-band negotiation unsupported\n", ++ __func__); ++ return; ++ } ++ ++ switch (state->interface) { ++ case PHY_INTERFACE_MODE_RGMII: ++ case PHY_INTERFACE_MODE_RGMII_ID: ++ case PHY_INTERFACE_MODE_RGMII_TXID: ++ case PHY_INTERFACE_MODE_RGMII_RXID: ++ qca8k_write(priv, reg, QCA8K_PORT_PAD_RGMII_EN); ++ ++ /* Configure rgmii delay */ ++ qca8k_mac_config_setup_internal_delay(priv, cpu_port_index, reg); ++ ++ /* QCA8337 requires to set rgmii rx delay for all ports. ++ * This is enabled through PORT5_PAD_CTRL for all ports, ++ * rather than individual port registers. ++ */ ++ if (priv->switch_id == QCA8K_ID_QCA8337) ++ qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, ++ QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); ++ break; ++ case PHY_INTERFACE_MODE_SGMII: ++ case PHY_INTERFACE_MODE_1000BASEX: ++ /* Enable SGMII on the port */ ++ qca8k_write(priv, reg, QCA8K_PORT_PAD_SGMII_EN); ++ ++ /* Enable/disable SerDes auto-negotiation as necessary */ ++ ret = qca8k_read(priv, QCA8K_REG_PWS, &val); ++ if (ret) ++ return; ++ if (phylink_autoneg_inband(mode)) ++ val &= ~QCA8K_PWS_SERDES_AEN_DIS; ++ else ++ val |= QCA8K_PWS_SERDES_AEN_DIS; ++ qca8k_write(priv, QCA8K_REG_PWS, val); ++ ++ /* Configure the SGMII parameters */ ++ ret = qca8k_read(priv, QCA8K_REG_SGMII_CTRL, &val); ++ if (ret) ++ return; ++ ++ val |= QCA8K_SGMII_EN_SD; ++ ++ if (priv->ports_config.sgmii_enable_pll) ++ val |= QCA8K_SGMII_EN_PLL | QCA8K_SGMII_EN_RX | ++ QCA8K_SGMII_EN_TX; ++ ++ if (dsa_is_cpu_port(ds, port)) { ++ /* CPU port, we're talking to the CPU MAC, be a PHY */ ++ val &= ~QCA8K_SGMII_MODE_CTRL_MASK; ++ val |= QCA8K_SGMII_MODE_CTRL_PHY; ++ } else if (state->interface == PHY_INTERFACE_MODE_SGMII) { ++ val &= ~QCA8K_SGMII_MODE_CTRL_MASK; ++ val |= QCA8K_SGMII_MODE_CTRL_MAC; ++ } else if (state->interface == PHY_INTERFACE_MODE_1000BASEX) { ++ val &= ~QCA8K_SGMII_MODE_CTRL_MASK; ++ val |= QCA8K_SGMII_MODE_CTRL_BASEX; ++ } ++ ++ qca8k_write(priv, QCA8K_REG_SGMII_CTRL, val); ++ ++ /* From original code is reported port instability as SGMII also ++ * require delay set. Apply advised values here or take them from DT. ++ */ ++ if (state->interface == PHY_INTERFACE_MODE_SGMII) ++ qca8k_mac_config_setup_internal_delay(priv, cpu_port_index, reg); ++ ++ /* For qca8327/qca8328/qca8334/qca8338 sgmii is unique and ++ * falling edge is set writing in the PORT0 PAD reg ++ */ ++ if (priv->switch_id == QCA8K_ID_QCA8327 || ++ priv->switch_id == QCA8K_ID_QCA8337) ++ reg = QCA8K_REG_PORT0_PAD_CTRL; ++ ++ val = 0; ++ ++ /* SGMII Clock phase configuration */ ++ if (priv->ports_config.sgmii_rx_clk_falling_edge) ++ val |= QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE; ++ ++ if (priv->ports_config.sgmii_tx_clk_falling_edge) ++ val |= QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE; ++ ++ if (val) ++ ret = qca8k_rmw(priv, reg, ++ QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE | ++ QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE, ++ val); ++ ++ break; ++ default: ++ dev_err(ds->dev, "xMII mode %s not supported for port %d\n", ++ phy_modes(state->interface), port); ++ return; ++ } ++} ++ ++static void ++qca8k_phylink_validate(struct dsa_switch *ds, int port, ++ unsigned long *supported, ++ struct phylink_link_state *state) ++{ ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; ++ ++ switch (port) { ++ case 0: /* 1st CPU port */ ++ if (state->interface != PHY_INTERFACE_MODE_NA && ++ state->interface != PHY_INTERFACE_MODE_RGMII && ++ state->interface != PHY_INTERFACE_MODE_RGMII_ID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && ++ state->interface != PHY_INTERFACE_MODE_SGMII) ++ goto unsupported; ++ break; ++ case 1: ++ case 2: ++ case 3: ++ case 4: ++ case 5: ++ /* Internal PHY */ ++ if (state->interface != PHY_INTERFACE_MODE_NA && ++ state->interface != PHY_INTERFACE_MODE_GMII && ++ state->interface != PHY_INTERFACE_MODE_INTERNAL) ++ goto unsupported; ++ break; ++ case 6: /* 2nd CPU port / external PHY */ ++ if (state->interface != PHY_INTERFACE_MODE_NA && ++ state->interface != PHY_INTERFACE_MODE_RGMII && ++ state->interface != PHY_INTERFACE_MODE_RGMII_ID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && ++ state->interface != PHY_INTERFACE_MODE_SGMII && ++ state->interface != PHY_INTERFACE_MODE_1000BASEX) ++ goto unsupported; ++ break; ++ default: ++unsupported: ++ linkmode_zero(supported); ++ return; ++ } ++ ++ phylink_set_port_modes(mask); ++ phylink_set(mask, Autoneg); ++ ++ phylink_set(mask, 1000baseT_Full); ++ phylink_set(mask, 10baseT_Half); ++ phylink_set(mask, 10baseT_Full); ++ phylink_set(mask, 100baseT_Half); ++ phylink_set(mask, 100baseT_Full); ++ ++ if (state->interface == PHY_INTERFACE_MODE_1000BASEX) ++ phylink_set(mask, 1000baseX_Full); ++ ++ phylink_set(mask, Pause); ++ phylink_set(mask, Asym_Pause); ++ ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); ++} ++ ++static int ++qca8k_phylink_mac_link_state(struct dsa_switch *ds, int port, ++ struct phylink_link_state *state) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ u32 reg; ++ int ret; ++ ++ ret = qca8k_read(priv, QCA8K_REG_PORT_STATUS(port), ®); ++ if (ret < 0) ++ return ret; ++ ++ state->link = !!(reg & QCA8K_PORT_STATUS_LINK_UP); ++ state->an_complete = state->link; ++ state->an_enabled = !!(reg & QCA8K_PORT_STATUS_LINK_AUTO); ++ state->duplex = (reg & QCA8K_PORT_STATUS_DUPLEX) ? DUPLEX_FULL : ++ DUPLEX_HALF; ++ ++ switch (reg & QCA8K_PORT_STATUS_SPEED) { ++ case QCA8K_PORT_STATUS_SPEED_10: ++ state->speed = SPEED_10; ++ break; ++ case QCA8K_PORT_STATUS_SPEED_100: ++ state->speed = SPEED_100; ++ break; ++ case QCA8K_PORT_STATUS_SPEED_1000: ++ state->speed = SPEED_1000; ++ break; ++ default: ++ state->speed = SPEED_UNKNOWN; ++ break; ++ } ++ ++ state->pause = MLO_PAUSE_NONE; ++ if (reg & QCA8K_PORT_STATUS_RXFLOW) ++ state->pause |= MLO_PAUSE_RX; ++ if (reg & QCA8K_PORT_STATUS_TXFLOW) ++ state->pause |= MLO_PAUSE_TX; ++ ++ return 1; ++} ++ ++static void ++qca8k_phylink_mac_link_down(struct dsa_switch *ds, int port, unsigned int mode, ++ phy_interface_t interface) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ qca8k_port_set_status(priv, port, 0); ++} ++ ++static void ++qca8k_phylink_mac_link_up(struct dsa_switch *ds, int port, unsigned int mode, ++ phy_interface_t interface, struct phy_device *phydev, ++ int speed, int duplex, bool tx_pause, bool rx_pause) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ u32 reg; ++ ++ if (phylink_autoneg_inband(mode)) { ++ reg = QCA8K_PORT_STATUS_LINK_AUTO; ++ } else { ++ switch (speed) { ++ case SPEED_10: ++ reg = QCA8K_PORT_STATUS_SPEED_10; ++ break; ++ case SPEED_100: ++ reg = QCA8K_PORT_STATUS_SPEED_100; ++ break; ++ case SPEED_1000: ++ reg = QCA8K_PORT_STATUS_SPEED_1000; ++ break; ++ default: ++ reg = QCA8K_PORT_STATUS_LINK_AUTO; ++ break; ++ } ++ ++ if (duplex == DUPLEX_FULL) ++ reg |= QCA8K_PORT_STATUS_DUPLEX; ++ ++ if (rx_pause || dsa_is_cpu_port(ds, port)) ++ reg |= QCA8K_PORT_STATUS_RXFLOW; ++ ++ if (tx_pause || dsa_is_cpu_port(ds, port)) ++ reg |= QCA8K_PORT_STATUS_TXFLOW; ++ } ++ ++ reg |= QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; ++ ++ qca8k_write(priv, QCA8K_REG_PORT_STATUS(port), reg); ++} ++ ++static void ++qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data) ++{ ++ const struct qca8k_match_data *match_data; ++ struct qca8k_priv *priv = ds->priv; ++ int i; ++ ++ if (stringset != ETH_SS_STATS) ++ return; ++ ++ match_data = of_device_get_match_data(priv->dev); ++ ++ for (i = 0; i < match_data->mib_count; i++) ++ strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, ++ ETH_GSTRING_LEN); ++} ++ ++static void qca8k_mib_autocast_handler(struct dsa_switch *ds, struct sk_buff *skb) ++{ ++ const struct qca8k_match_data *match_data; ++ struct qca8k_mib_eth_data *mib_eth_data; ++ struct qca8k_priv *priv = ds->priv; ++ const struct qca8k_mib_desc *mib; ++ struct mib_ethhdr *mib_ethhdr; ++ int i, mib_len, offset = 0; ++ u64 *data; ++ u8 port; ++ ++ mib_ethhdr = (struct mib_ethhdr *)skb_mac_header(skb); ++ mib_eth_data = &priv->mib_eth_data; ++ ++ /* The switch autocast every port. Ignore other packet and ++ * parse only the requested one. ++ */ ++ port = FIELD_GET(QCA_HDR_RECV_SOURCE_PORT, ntohs(mib_ethhdr->hdr)); ++ if (port != mib_eth_data->req_port) ++ goto exit; ++ ++ match_data = device_get_match_data(priv->dev); ++ data = mib_eth_data->data; ++ ++ for (i = 0; i < match_data->mib_count; i++) { ++ mib = &ar8327_mib[i]; ++ ++ /* First 3 mib are present in the skb head */ ++ if (i < 3) { ++ data[i] = mib_ethhdr->data[i]; ++ continue; ++ } ++ ++ mib_len = sizeof(uint32_t); ++ ++ /* Some mib are 64 bit wide */ ++ if (mib->size == 2) ++ mib_len = sizeof(uint64_t); ++ ++ /* Copy the mib value from packet to the */ ++ memcpy(data + i, skb->data + offset, mib_len); ++ ++ /* Set the offset for the next mib */ ++ offset += mib_len; ++ } ++ ++exit: ++ /* Complete on receiving all the mib packet */ ++ if (refcount_dec_and_test(&mib_eth_data->port_parsed)) ++ complete(&mib_eth_data->rw_done); ++} ++ ++static int ++qca8k_get_ethtool_stats_eth(struct dsa_switch *ds, int port, u64 *data) ++{ ++ struct dsa_port *dp = dsa_to_port(ds, port); ++ struct qca8k_mib_eth_data *mib_eth_data; ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ mib_eth_data = &priv->mib_eth_data; ++ ++ mutex_lock(&mib_eth_data->mutex); ++ ++ reinit_completion(&mib_eth_data->rw_done); ++ ++ mib_eth_data->req_port = dp->index; ++ mib_eth_data->data = data; ++ refcount_set(&mib_eth_data->port_parsed, QCA8K_NUM_PORTS); ++ ++ mutex_lock(&priv->reg_mutex); ++ ++ /* Send mib autocast request */ ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, ++ QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, ++ FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_CAST) | ++ QCA8K_MIB_BUSY); ++ ++ mutex_unlock(&priv->reg_mutex); ++ ++ if (ret) ++ goto exit; ++ ++ ret = wait_for_completion_timeout(&mib_eth_data->rw_done, QCA8K_ETHERNET_TIMEOUT); ++ ++exit: ++ mutex_unlock(&mib_eth_data->mutex); ++ ++ return ret; ++} ++ ++static void ++qca8k_get_ethtool_stats(struct dsa_switch *ds, int port, ++ uint64_t *data) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ const struct qca8k_match_data *match_data; ++ const struct qca8k_mib_desc *mib; ++ u32 reg, i, val; ++ u32 hi = 0; ++ int ret; ++ ++ if (priv->mgmt_master && ++ qca8k_get_ethtool_stats_eth(ds, port, data) > 0) ++ return; ++ ++ match_data = of_device_get_match_data(priv->dev); ++ ++ for (i = 0; i < match_data->mib_count; i++) { ++ mib = &ar8327_mib[i]; ++ reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; ++ ++ ret = qca8k_read(priv, reg, &val); ++ if (ret < 0) ++ continue; ++ ++ if (mib->size == 2) { ++ ret = qca8k_read(priv, reg + 4, &hi); ++ if (ret < 0) ++ continue; ++ } ++ ++ data[i] = val; ++ if (mib->size == 2) ++ data[i] |= (u64)hi << 32; ++ } ++} ++ ++static int ++qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset) ++{ ++ const struct qca8k_match_data *match_data; ++ struct qca8k_priv *priv = ds->priv; ++ ++ if (sset != ETH_SS_STATS) ++ return 0; ++ ++ match_data = of_device_get_match_data(priv->dev); ++ ++ return match_data->mib_count; ++} ++ ++static int ++qca8k_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *eee) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ u32 lpi_en = QCA8K_REG_EEE_CTRL_LPI_EN(port); ++ u32 reg; ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = qca8k_read(priv, QCA8K_REG_EEE_CTRL, ®); ++ if (ret < 0) ++ goto exit; ++ ++ if (eee->eee_enabled) ++ reg |= lpi_en; ++ else ++ reg &= ~lpi_en; ++ ret = qca8k_write(priv, QCA8K_REG_EEE_CTRL, reg); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++static int ++qca8k_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e) ++{ ++ /* Nothing to do on the port's MAC */ ++ return 0; ++} ++ ++static void ++qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ u32 stp_state; ++ ++ switch (state) { ++ case BR_STATE_DISABLED: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_DISABLED; ++ break; ++ case BR_STATE_BLOCKING: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_BLOCKING; ++ break; ++ case BR_STATE_LISTENING: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_LISTENING; ++ break; ++ case BR_STATE_LEARNING: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_LEARNING; ++ break; ++ case BR_STATE_FORWARDING: ++ default: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_FORWARD; ++ break; ++ } ++ ++ qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_STATE_MASK, stp_state); ++} ++ ++static int ++qca8k_port_bridge_join(struct dsa_switch *ds, int port, struct net_device *br) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ int port_mask, cpu_port; ++ int i, ret; ++ ++ cpu_port = dsa_to_port(ds, port)->cpu_dp->index; ++ port_mask = BIT(cpu_port); ++ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ if (dsa_is_cpu_port(ds, i)) ++ continue; ++ if (dsa_to_port(ds, i)->bridge_dev != br) ++ continue; ++ /* Add this port to the portvlan mask of the other ports ++ * in the bridge ++ */ ++ ret = regmap_set_bits(priv->regmap, ++ QCA8K_PORT_LOOKUP_CTRL(i), ++ BIT(port)); ++ if (ret) ++ return ret; ++ if (i != port) ++ port_mask |= BIT(i); ++ } ++ ++ /* Add all other ports to this ports portvlan mask */ ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_MEMBER, port_mask); ++ ++ return ret; ++} ++ ++static void ++qca8k_port_bridge_leave(struct dsa_switch *ds, int port, struct net_device *br) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ int cpu_port, i; ++ ++ cpu_port = dsa_to_port(ds, port)->cpu_dp->index; ++ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ if (dsa_is_cpu_port(ds, i)) ++ continue; ++ if (dsa_to_port(ds, i)->bridge_dev != br) ++ continue; ++ /* Remove this port to the portvlan mask of the other ports ++ * in the bridge ++ */ ++ regmap_clear_bits(priv->regmap, ++ QCA8K_PORT_LOOKUP_CTRL(i), ++ BIT(port)); ++ } ++ ++ /* Set the cpu port to be the only one in the portvlan mask of ++ * this port ++ */ ++ qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port)); ++} ++ ++static void ++qca8k_port_fast_age(struct dsa_switch *ds, int port) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_access(priv, QCA8K_FDB_FLUSH_PORT, port); ++ mutex_unlock(&priv->reg_mutex); ++} ++ ++static int ++qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ unsigned int secs = msecs / 1000; ++ u32 val; ++ ++ /* AGE_TIME reg is set in 7s step */ ++ val = secs / 7; ++ ++ /* Handle case with 0 as val to NOT disable ++ * learning ++ */ ++ if (!val) ++ val = 1; ++ ++ return regmap_update_bits(priv->regmap, QCA8K_REG_ATU_CTRL, QCA8K_ATU_AGE_TIME_MASK, ++ QCA8K_ATU_AGE_TIME(val)); ++} ++ ++static int ++qca8k_port_enable(struct dsa_switch *ds, int port, ++ struct phy_device *phy) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ ++ qca8k_port_set_status(priv, port, 1); ++ priv->port_enabled_map |= BIT(port); ++ ++ if (dsa_is_user_port(ds, port)) ++ phy_support_asym_pause(phy); ++ ++ return 0; ++} ++ ++static void ++qca8k_port_disable(struct dsa_switch *ds, int port) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ ++ qca8k_port_set_status(priv, port, 0); ++ priv->port_enabled_map &= ~BIT(port); ++} ++ ++static int ++qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ /* We have only have a general MTU setting. ++ * DSA always set the CPU port's MTU to the largest MTU of the slave ++ * ports. ++ * Setting MTU just for the CPU port is sufficient to correctly set a ++ * value for every port. ++ */ ++ if (!dsa_is_cpu_port(ds, port)) ++ return 0; ++ ++ /* To change the MAX_FRAME_SIZE the cpu ports must be off or ++ * the switch panics. ++ * Turn off both cpu ports before applying the new value to prevent ++ * this. ++ */ ++ if (priv->port_enabled_map & BIT(0)) ++ qca8k_port_set_status(priv, 0, 0); ++ ++ if (priv->port_enabled_map & BIT(6)) ++ qca8k_port_set_status(priv, 6, 0); ++ ++ /* Include L2 header / FCS length */ ++ ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ETH_HLEN + ETH_FCS_LEN); ++ ++ if (priv->port_enabled_map & BIT(0)) ++ qca8k_port_set_status(priv, 0, 1); ++ ++ if (priv->port_enabled_map & BIT(6)) ++ qca8k_port_set_status(priv, 6, 1); ++ ++ return ret; ++} ++ ++static int ++qca8k_port_max_mtu(struct dsa_switch *ds, int port) ++{ ++ return QCA8K_MAX_MTU; ++} ++ ++static int ++qca8k_port_fdb_insert(struct qca8k_priv *priv, const u8 *addr, ++ u16 port_mask, u16 vid) ++{ ++ /* Set the vid to the port vlan id if no vid is set */ ++ if (!vid) ++ vid = QCA8K_PORT_VID_DEF; ++ ++ return qca8k_fdb_add(priv, addr, port_mask, vid, ++ QCA8K_ATU_STATUS_STATIC); ++} ++ ++static int ++qca8k_port_fdb_add(struct dsa_switch *ds, int port, ++ const unsigned char *addr, u16 vid) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ u16 port_mask = BIT(port); ++ ++ return qca8k_port_fdb_insert(priv, addr, port_mask, vid); ++} ++ ++static int ++qca8k_port_fdb_del(struct dsa_switch *ds, int port, ++ const unsigned char *addr, u16 vid) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ u16 port_mask = BIT(port); ++ ++ if (!vid) ++ vid = QCA8K_PORT_VID_DEF; ++ ++ return qca8k_fdb_del(priv, addr, port_mask, vid); ++} ++ ++static int ++qca8k_port_fdb_dump(struct dsa_switch *ds, int port, ++ dsa_fdb_dump_cb_t *cb, void *data) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ struct qca8k_fdb _fdb = { 0 }; ++ int cnt = QCA8K_NUM_FDB_RECORDS; ++ bool is_static; ++ int ret = 0; ++ ++ mutex_lock(&priv->reg_mutex); ++ while (cnt-- && !qca8k_fdb_next(priv, &_fdb, port)) { ++ if (!_fdb.aging) ++ break; ++ is_static = (_fdb.aging == QCA8K_ATU_STATUS_STATIC); ++ ret = cb(_fdb.mac, _fdb.vid, is_static, data); ++ if (ret) ++ break; ++ } ++ mutex_unlock(&priv->reg_mutex); ++ ++ return 0; ++} ++ ++static int ++qca8k_port_mdb_add(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ const u8 *addr = mdb->addr; ++ u16 vid = mdb->vid; ++ ++ return qca8k_fdb_search_and_insert(priv, BIT(port), addr, vid); ++} ++ ++static int ++qca8k_port_mdb_del(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ const u8 *addr = mdb->addr; ++ u16 vid = mdb->vid; ++ ++ return qca8k_fdb_search_and_del(priv, BIT(port), addr, vid); ++} ++ ++static int ++qca8k_port_mirror_add(struct dsa_switch *ds, int port, ++ struct dsa_mall_mirror_tc_entry *mirror, ++ bool ingress) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int monitor_port, ret; ++ u32 reg, val; ++ ++ /* Check for existent entry */ ++ if ((ingress ? priv->mirror_rx : priv->mirror_tx) & BIT(port)) ++ return -EEXIST; ++ ++ ret = regmap_read(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, &val); ++ if (ret) ++ return ret; ++ ++ /* QCA83xx can have only one port set to mirror mode. ++ * Check that the correct port is requested and return error otherwise. ++ * When no mirror port is set, the values is set to 0xF ++ */ ++ monitor_port = FIELD_GET(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (monitor_port != 0xF && monitor_port != mirror->to_local_port) ++ return -EEXIST; ++ ++ /* Set the monitor port */ ++ val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, ++ mirror->to_local_port); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, ++ QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (ret) ++ return ret; ++ ++ if (ingress) { ++ reg = QCA8K_PORT_LOOKUP_CTRL(port); ++ val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; ++ } else { ++ reg = QCA8K_REG_PORT_HOL_CTRL1(port); ++ val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; ++ } ++ ++ ret = regmap_update_bits(priv->regmap, reg, val, val); ++ if (ret) ++ return ret; ++ ++ /* Track mirror port for tx and rx to decide when the ++ * mirror port has to be disabled. ++ */ ++ if (ingress) ++ priv->mirror_rx |= BIT(port); ++ else ++ priv->mirror_tx |= BIT(port); ++ ++ return 0; ++} ++ ++static void ++qca8k_port_mirror_del(struct dsa_switch *ds, int port, ++ struct dsa_mall_mirror_tc_entry *mirror) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ u32 reg, val; ++ int ret; ++ ++ if (mirror->ingress) { ++ reg = QCA8K_PORT_LOOKUP_CTRL(port); ++ val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; ++ } else { ++ reg = QCA8K_REG_PORT_HOL_CTRL1(port); ++ val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; ++ } ++ ++ ret = regmap_clear_bits(priv->regmap, reg, val); ++ if (ret) ++ goto err; ++ ++ if (mirror->ingress) ++ priv->mirror_rx &= ~BIT(port); ++ else ++ priv->mirror_tx &= ~BIT(port); ++ ++ /* No port set to send packet to mirror port. Disable mirror port */ ++ if (!priv->mirror_rx && !priv->mirror_tx) { ++ val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, 0xF); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, ++ QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (ret) ++ goto err; ++ } ++err: ++ dev_err(priv->dev, "Failed to del mirror port from %d", port); ++} ++ ++static int ++qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, ++ struct netlink_ext_ack *extack) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ if (vlan_filtering) { ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, ++ QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE); ++ } else { ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, ++ QCA8K_PORT_LOOKUP_VLAN_MODE_NONE); ++ } ++ ++ return ret; ++} ++ ++static int ++qca8k_port_vlan_add(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_vlan *vlan, ++ struct netlink_ext_ack *extack) ++{ ++ bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; ++ bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID; ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ ret = qca8k_vlan_add(priv, port, vlan->vid, untagged); ++ if (ret) { ++ dev_err(priv->dev, "Failed to add VLAN to port %d (%d)", port, ret); ++ return ret; ++ } ++ ++ if (pvid) { ++ ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port), ++ QCA8K_EGREES_VLAN_PORT_MASK(port), ++ QCA8K_EGREES_VLAN_PORT(port, vlan->vid)); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port), ++ QCA8K_PORT_VLAN_CVID(vlan->vid) | ++ QCA8K_PORT_VLAN_SVID(vlan->vid)); ++ } ++ ++ return ret; ++} ++ ++static int ++qca8k_port_vlan_del(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_vlan *vlan) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ ret = qca8k_vlan_del(priv, port, vlan->vid); ++ if (ret) ++ dev_err(priv->dev, "Failed to delete VLAN from port %d (%d)", port, ret); ++ ++ return ret; ++} ++ ++static u32 qca8k_get_phy_flags(struct dsa_switch *ds, int port) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ /* Communicate to the phy internal driver the switch revision. ++ * Based on the switch revision different values needs to be ++ * set to the dbg and mmd reg on the phy. ++ * The first 2 bit are used to communicate the switch revision ++ * to the phy driver. ++ */ ++ if (port > 0 && port < 6) ++ return priv->switch_revision; ++ ++ return 0; ++} ++ ++static enum dsa_tag_protocol ++qca8k_get_tag_protocol(struct dsa_switch *ds, int port, ++ enum dsa_tag_protocol mp) ++{ ++ return DSA_TAG_PROTO_QCA; ++} ++ ++static bool ++qca8k_lag_can_offload(struct dsa_switch *ds, ++ struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ struct dsa_port *dp; ++ int id, members = 0; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ if (id < 0 || id >= ds->num_lag_ids) ++ return false; ++ ++ dsa_lag_foreach_port(dp, ds->dst, lag) ++ /* Includes the port joining the LAG */ ++ members++; ++ ++ if (members > QCA8K_NUM_PORTS_FOR_LAG) ++ return false; ++ ++ if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) ++ return false; ++ ++ if (info->hash_type != NETDEV_LAG_HASH_L2 && ++ info->hash_type != NETDEV_LAG_HASH_L23) ++ return false; ++ ++ return true; ++} ++ ++static int ++qca8k_lag_setup_hash(struct dsa_switch *ds, ++ struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ bool unique_lag = true; ++ u32 hash = 0; ++ int i, id; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ ++ switch (info->hash_type) { ++ case NETDEV_LAG_HASH_L23: ++ hash |= QCA8K_TRUNK_HASH_SIP_EN; ++ hash |= QCA8K_TRUNK_HASH_DIP_EN; ++ fallthrough; ++ case NETDEV_LAG_HASH_L2: ++ hash |= QCA8K_TRUNK_HASH_SA_EN; ++ hash |= QCA8K_TRUNK_HASH_DA_EN; ++ break; ++ default: /* We should NEVER reach this */ ++ return -EOPNOTSUPP; ++ } ++ ++ /* Check if we are the unique configured LAG */ ++ dsa_lags_foreach_id(i, ds->dst) ++ if (i != id && dsa_lag_dev(ds->dst, i)) { ++ unique_lag = false; ++ break; ++ } ++ ++ /* Hash Mode is global. Make sure the same Hash Mode ++ * is set to all the 4 possible lag. ++ * If we are the unique LAG we can set whatever hash ++ * mode we want. ++ * To change hash mode it's needed to remove all LAG ++ * and change the mode with the latest. ++ */ ++ if (unique_lag) { ++ priv->lag_hash_mode = hash; ++ } else if (priv->lag_hash_mode != hash) { ++ netdev_err(lag, "Error: Mismateched Hash Mode across different lag is not supported\n"); ++ return -EOPNOTSUPP; ++ } ++ ++ return regmap_update_bits(priv->regmap, QCA8K_TRUNK_HASH_EN_CTRL, ++ QCA8K_TRUNK_HASH_MASK, hash); ++} ++ ++static int ++qca8k_lag_refresh_portmap(struct dsa_switch *ds, int port, ++ struct net_device *lag, bool delete) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret, id, i; ++ u32 val; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ ++ /* Read current port member */ ++ ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, &val); ++ if (ret) ++ return ret; ++ ++ /* Shift val to the correct trunk */ ++ val >>= QCA8K_REG_GOL_TRUNK_SHIFT(id); ++ val &= QCA8K_REG_GOL_TRUNK_MEMBER_MASK; ++ if (delete) ++ val &= ~BIT(port); ++ else ++ val |= BIT(port); ++ ++ /* Update port member. With empty portmap disable trunk */ ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, ++ QCA8K_REG_GOL_TRUNK_MEMBER(id) | ++ QCA8K_REG_GOL_TRUNK_EN(id), ++ !val << QCA8K_REG_GOL_TRUNK_SHIFT(id) | ++ val << QCA8K_REG_GOL_TRUNK_SHIFT(id)); ++ ++ /* Search empty member if adding or port on deleting */ ++ for (i = 0; i < QCA8K_NUM_PORTS_FOR_LAG; i++) { ++ ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), &val); ++ if (ret) ++ return ret; ++ ++ val >>= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i); ++ val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_MASK; ++ ++ if (delete) { ++ /* If port flagged to be disabled assume this member is ++ * empty ++ */ ++ if (val != QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) ++ continue; ++ ++ val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK; ++ if (val != port) ++ continue; ++ } else { ++ /* If port flagged to be enabled assume this member is ++ * already set ++ */ ++ if (val == QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) ++ continue; ++ } ++ ++ /* We have found the member to add/remove */ ++ break; ++ } ++ ++ /* Set port in the correct port mask or disable port if in delete mode */ ++ return regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), ++ QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN(id, i) | ++ QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT(id, i), ++ !delete << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i) | ++ port << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i)); ++} ++ ++static int ++qca8k_port_lag_join(struct dsa_switch *ds, int port, ++ struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ int ret; ++ ++ if (!qca8k_lag_can_offload(ds, lag, info)) ++ return -EOPNOTSUPP; ++ ++ ret = qca8k_lag_setup_hash(ds, lag, info); ++ if (ret) ++ return ret; ++ ++ return qca8k_lag_refresh_portmap(ds, port, lag, false); ++} ++ ++static int ++qca8k_port_lag_leave(struct dsa_switch *ds, int port, ++ struct net_device *lag) ++{ ++ return qca8k_lag_refresh_portmap(ds, port, lag, true); ++} ++ ++static void ++qca8k_master_change(struct dsa_switch *ds, const struct net_device *master, ++ bool operational) ++{ ++ struct dsa_port *dp = master->dsa_ptr; ++ struct qca8k_priv *priv = ds->priv; ++ ++ /* Ethernet MIB/MDIO is only supported for CPU port 0 */ ++ if (dp->index != 0) ++ return; ++ ++ mutex_lock(&priv->mgmt_eth_data.mutex); ++ mutex_lock(&priv->mib_eth_data.mutex); ++ ++ priv->mgmt_master = operational ? (struct net_device *)master : NULL; ++ ++ mutex_unlock(&priv->mib_eth_data.mutex); ++ mutex_unlock(&priv->mgmt_eth_data.mutex); ++} ++ ++static int qca8k_connect_tag_protocol(struct dsa_switch *ds, ++ enum dsa_tag_protocol proto) ++{ ++ struct qca_tagger_data *tagger_data; ++ ++ switch (proto) { ++ case DSA_TAG_PROTO_QCA: ++ tagger_data = ds->tagger_data; ++ ++ tagger_data->rw_reg_ack_handler = qca8k_rw_reg_ack_handler; ++ tagger_data->mib_autocast_handler = qca8k_mib_autocast_handler; ++ ++ break; ++ default: ++ return -EOPNOTSUPP; ++ } ++ ++ return 0; ++} ++ ++static const struct dsa_switch_ops qca8k_switch_ops = { ++ .get_tag_protocol = qca8k_get_tag_protocol, ++ .setup = qca8k_setup, ++ .get_strings = qca8k_get_strings, ++ .get_ethtool_stats = qca8k_get_ethtool_stats, ++ .get_sset_count = qca8k_get_sset_count, ++ .set_ageing_time = qca8k_set_ageing_time, ++ .get_mac_eee = qca8k_get_mac_eee, ++ .set_mac_eee = qca8k_set_mac_eee, ++ .port_enable = qca8k_port_enable, ++ .port_disable = qca8k_port_disable, ++ .port_change_mtu = qca8k_port_change_mtu, ++ .port_max_mtu = qca8k_port_max_mtu, ++ .port_stp_state_set = qca8k_port_stp_state_set, ++ .port_bridge_join = qca8k_port_bridge_join, ++ .port_bridge_leave = qca8k_port_bridge_leave, ++ .port_fast_age = qca8k_port_fast_age, ++ .port_fdb_add = qca8k_port_fdb_add, ++ .port_fdb_del = qca8k_port_fdb_del, ++ .port_fdb_dump = qca8k_port_fdb_dump, ++ .port_mdb_add = qca8k_port_mdb_add, ++ .port_mdb_del = qca8k_port_mdb_del, ++ .port_mirror_add = qca8k_port_mirror_add, ++ .port_mirror_del = qca8k_port_mirror_del, ++ .port_vlan_filtering = qca8k_port_vlan_filtering, ++ .port_vlan_add = qca8k_port_vlan_add, ++ .port_vlan_del = qca8k_port_vlan_del, ++ .phylink_validate = qca8k_phylink_validate, ++ .phylink_mac_link_state = qca8k_phylink_mac_link_state, ++ .phylink_mac_config = qca8k_phylink_mac_config, ++ .phylink_mac_link_down = qca8k_phylink_mac_link_down, ++ .phylink_mac_link_up = qca8k_phylink_mac_link_up, ++ .get_phy_flags = qca8k_get_phy_flags, ++ .port_lag_join = qca8k_port_lag_join, ++ .port_lag_leave = qca8k_port_lag_leave, ++ .master_state_change = qca8k_master_change, ++ .connect_tag_protocol = qca8k_connect_tag_protocol, ++}; ++ ++static int qca8k_read_switch_id(struct qca8k_priv *priv) ++{ ++ const struct qca8k_match_data *data; ++ u32 val; ++ u8 id; ++ int ret; ++ ++ /* get the switches ID from the compatible */ ++ data = of_device_get_match_data(priv->dev); ++ if (!data) ++ return -ENODEV; ++ ++ ret = qca8k_read(priv, QCA8K_REG_MASK_CTRL, &val); ++ if (ret < 0) ++ return -ENODEV; ++ ++ id = QCA8K_MASK_CTRL_DEVICE_ID(val); ++ if (id != data->id) { ++ dev_err(priv->dev, "Switch id detected %x but expected %x", id, data->id); ++ return -ENODEV; ++ } ++ ++ priv->switch_id = id; ++ ++ /* Save revision to communicate to the internal PHY driver */ ++ priv->switch_revision = QCA8K_MASK_CTRL_REV_ID(val); ++ ++ return 0; ++} ++ ++static int ++qca8k_sw_probe(struct mdio_device *mdiodev) ++{ ++ struct qca8k_priv *priv; ++ int ret; ++ ++ /* allocate the private data struct so that we can probe the switches ++ * ID register ++ */ ++ priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ priv->bus = mdiodev->bus; ++ priv->dev = &mdiodev->dev; ++ ++ priv->reset_gpio = devm_gpiod_get_optional(priv->dev, "reset", ++ GPIOD_ASIS); ++ if (IS_ERR(priv->reset_gpio)) ++ return PTR_ERR(priv->reset_gpio); ++ ++ if (priv->reset_gpio) { ++ gpiod_set_value_cansleep(priv->reset_gpio, 1); ++ /* The active low duration must be greater than 10 ms ++ * and checkpatch.pl wants 20 ms. ++ */ ++ msleep(20); ++ gpiod_set_value_cansleep(priv->reset_gpio, 0); ++ } ++ ++ /* Start by setting up the register mapping */ ++ priv->regmap = devm_regmap_init(&mdiodev->dev, NULL, priv, ++ &qca8k_regmap_config); ++ if (IS_ERR(priv->regmap)) { ++ dev_err(priv->dev, "regmap initialization failed"); ++ return PTR_ERR(priv->regmap); ++ } ++ ++ priv->mdio_cache.page = 0xffff; ++ priv->mdio_cache.lo = 0xffff; ++ priv->mdio_cache.hi = 0xffff; ++ ++ /* Check the detected switch id */ ++ ret = qca8k_read_switch_id(priv); ++ if (ret) ++ return ret; ++ ++ priv->ds = devm_kzalloc(&mdiodev->dev, sizeof(*priv->ds), GFP_KERNEL); ++ if (!priv->ds) ++ return -ENOMEM; ++ ++ mutex_init(&priv->mgmt_eth_data.mutex); ++ init_completion(&priv->mgmt_eth_data.rw_done); ++ ++ mutex_init(&priv->mib_eth_data.mutex); ++ init_completion(&priv->mib_eth_data.rw_done); ++ ++ priv->ds->dev = &mdiodev->dev; ++ priv->ds->num_ports = QCA8K_NUM_PORTS; ++ priv->ds->priv = priv; ++ priv->ds->ops = &qca8k_switch_ops; ++ mutex_init(&priv->reg_mutex); ++ dev_set_drvdata(&mdiodev->dev, priv); ++ ++ return dsa_register_switch(priv->ds); ++} ++ ++static void ++qca8k_sw_remove(struct mdio_device *mdiodev) ++{ ++ struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev); ++ int i; ++ ++ if (!priv) ++ return; ++ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) ++ qca8k_port_set_status(priv, i, 0); ++ ++ dsa_unregister_switch(priv->ds); ++ ++ dev_set_drvdata(&mdiodev->dev, NULL); ++} ++ ++static void qca8k_sw_shutdown(struct mdio_device *mdiodev) ++{ ++ struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev); ++ ++ if (!priv) ++ return; ++ ++ dsa_switch_shutdown(priv->ds); ++ ++ dev_set_drvdata(&mdiodev->dev, NULL); ++} ++ ++#ifdef CONFIG_PM_SLEEP ++static void ++qca8k_set_pm(struct qca8k_priv *priv, int enable) ++{ ++ int port; ++ ++ for (port = 0; port < QCA8K_NUM_PORTS; port++) { ++ /* Do not enable on resume if the port was ++ * disabled before. ++ */ ++ if (!(priv->port_enabled_map & BIT(port))) ++ continue; ++ ++ qca8k_port_set_status(priv, port, enable); ++ } ++} ++ ++static int qca8k_suspend(struct device *dev) ++{ ++ struct qca8k_priv *priv = dev_get_drvdata(dev); ++ ++ qca8k_set_pm(priv, 0); ++ ++ return dsa_switch_suspend(priv->ds); ++} ++ ++static int qca8k_resume(struct device *dev) ++{ ++ struct qca8k_priv *priv = dev_get_drvdata(dev); ++ ++ qca8k_set_pm(priv, 1); ++ ++ return dsa_switch_resume(priv->ds); ++} ++#endif /* CONFIG_PM_SLEEP */ ++ ++static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, ++ qca8k_suspend, qca8k_resume); ++ ++static const struct qca8k_match_data qca8327 = { ++ .id = QCA8K_ID_QCA8327, ++ .reduced_package = true, ++ .mib_count = QCA8K_QCA832X_MIB_COUNT, ++}; ++ ++static const struct qca8k_match_data qca8328 = { ++ .id = QCA8K_ID_QCA8327, ++ .mib_count = QCA8K_QCA832X_MIB_COUNT, ++}; ++ ++static const struct qca8k_match_data qca833x = { ++ .id = QCA8K_ID_QCA8337, ++ .mib_count = QCA8K_QCA833X_MIB_COUNT, ++}; ++ ++static const struct of_device_id qca8k_of_match[] = { ++ { .compatible = "qca,qca8327", .data = &qca8327 }, ++ { .compatible = "qca,qca8328", .data = &qca8328 }, ++ { .compatible = "qca,qca8334", .data = &qca833x }, ++ { .compatible = "qca,qca8337", .data = &qca833x }, ++ { /* sentinel */ }, ++}; ++ ++static struct mdio_driver qca8kmdio_driver = { ++ .probe = qca8k_sw_probe, ++ .remove = qca8k_sw_remove, ++ .shutdown = qca8k_sw_shutdown, ++ .mdiodrv.driver = { ++ .name = "qca8k", ++ .of_match_table = qca8k_of_match, ++ .pm = &qca8k_pm_ops, ++ }, ++}; ++ ++mdio_module_driver(qca8kmdio_driver); ++ ++MODULE_AUTHOR("Mathieu Olivari, John Crispin "); ++MODULE_DESCRIPTION("Driver for QCA8K ethernet switch family"); ++MODULE_LICENSE("GPL v2"); ++MODULE_ALIAS("platform:qca8k"); +--- /dev/null ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -0,0 +1,411 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++/* ++ * Copyright (C) 2009 Felix Fietkau ++ * Copyright (C) 2011-2012 Gabor Juhos ++ * Copyright (c) 2015, The Linux Foundation. All rights reserved. ++ */ ++ ++#ifndef __QCA8K_H ++#define __QCA8K_H ++ ++#include ++#include ++#include ++#include ++ ++#define QCA8K_ETHERNET_MDIO_PRIORITY 7 ++#define QCA8K_ETHERNET_PHY_PRIORITY 6 ++#define QCA8K_ETHERNET_TIMEOUT 100 ++ ++#define QCA8K_NUM_PORTS 7 ++#define QCA8K_NUM_CPU_PORTS 2 ++#define QCA8K_MAX_MTU 9000 ++#define QCA8K_NUM_LAGS 4 ++#define QCA8K_NUM_PORTS_FOR_LAG 4 ++ ++#define PHY_ID_QCA8327 0x004dd034 ++#define QCA8K_ID_QCA8327 0x12 ++#define PHY_ID_QCA8337 0x004dd036 ++#define QCA8K_ID_QCA8337 0x13 ++ ++#define QCA8K_QCA832X_MIB_COUNT 39 ++#define QCA8K_QCA833X_MIB_COUNT 41 ++ ++#define QCA8K_BUSY_WAIT_TIMEOUT 2000 ++ ++#define QCA8K_NUM_FDB_RECORDS 2048 ++ ++#define QCA8K_PORT_VID_DEF 1 ++ ++/* Global control registers */ ++#define QCA8K_REG_MASK_CTRL 0x000 ++#define QCA8K_MASK_CTRL_REV_ID_MASK GENMASK(7, 0) ++#define QCA8K_MASK_CTRL_REV_ID(x) FIELD_GET(QCA8K_MASK_CTRL_REV_ID_MASK, x) ++#define QCA8K_MASK_CTRL_DEVICE_ID_MASK GENMASK(15, 8) ++#define QCA8K_MASK_CTRL_DEVICE_ID(x) FIELD_GET(QCA8K_MASK_CTRL_DEVICE_ID_MASK, x) ++#define QCA8K_REG_PORT0_PAD_CTRL 0x004 ++#define QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN BIT(31) ++#define QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE BIT(19) ++#define QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE BIT(18) ++#define QCA8K_REG_PORT5_PAD_CTRL 0x008 ++#define QCA8K_REG_PORT6_PAD_CTRL 0x00c ++#define QCA8K_PORT_PAD_RGMII_EN BIT(26) ++#define QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK GENMASK(23, 22) ++#define QCA8K_PORT_PAD_RGMII_TX_DELAY(x) FIELD_PREP(QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK, x) ++#define QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK GENMASK(21, 20) ++#define QCA8K_PORT_PAD_RGMII_RX_DELAY(x) FIELD_PREP(QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK, x) ++#define QCA8K_PORT_PAD_RGMII_TX_DELAY_EN BIT(25) ++#define QCA8K_PORT_PAD_RGMII_RX_DELAY_EN BIT(24) ++#define QCA8K_PORT_PAD_SGMII_EN BIT(7) ++#define QCA8K_REG_PWS 0x010 ++#define QCA8K_PWS_POWER_ON_SEL BIT(31) ++/* This reg is only valid for QCA832x and toggle the package ++ * type from 176 pin (by default) to 148 pin used on QCA8327 ++ */ ++#define QCA8327_PWS_PACKAGE148_EN BIT(30) ++#define QCA8K_PWS_LED_OPEN_EN_CSR BIT(24) ++#define QCA8K_PWS_SERDES_AEN_DIS BIT(7) ++#define QCA8K_REG_MODULE_EN 0x030 ++#define QCA8K_MODULE_EN_MIB BIT(0) ++#define QCA8K_REG_MIB 0x034 ++#define QCA8K_MIB_FUNC GENMASK(26, 24) ++#define QCA8K_MIB_CPU_KEEP BIT(20) ++#define QCA8K_MIB_BUSY BIT(17) ++#define QCA8K_MDIO_MASTER_CTRL 0x3c ++#define QCA8K_MDIO_MASTER_BUSY BIT(31) ++#define QCA8K_MDIO_MASTER_EN BIT(30) ++#define QCA8K_MDIO_MASTER_READ BIT(27) ++#define QCA8K_MDIO_MASTER_WRITE 0 ++#define QCA8K_MDIO_MASTER_SUP_PRE BIT(26) ++#define QCA8K_MDIO_MASTER_PHY_ADDR_MASK GENMASK(25, 21) ++#define QCA8K_MDIO_MASTER_PHY_ADDR(x) FIELD_PREP(QCA8K_MDIO_MASTER_PHY_ADDR_MASK, x) ++#define QCA8K_MDIO_MASTER_REG_ADDR_MASK GENMASK(20, 16) ++#define QCA8K_MDIO_MASTER_REG_ADDR(x) FIELD_PREP(QCA8K_MDIO_MASTER_REG_ADDR_MASK, x) ++#define QCA8K_MDIO_MASTER_DATA_MASK GENMASK(15, 0) ++#define QCA8K_MDIO_MASTER_DATA(x) FIELD_PREP(QCA8K_MDIO_MASTER_DATA_MASK, x) ++#define QCA8K_MDIO_MASTER_MAX_PORTS 5 ++#define QCA8K_MDIO_MASTER_MAX_REG 32 ++#define QCA8K_GOL_MAC_ADDR0 0x60 ++#define QCA8K_GOL_MAC_ADDR1 0x64 ++#define QCA8K_MAX_FRAME_SIZE 0x78 ++#define QCA8K_REG_PORT_STATUS(_i) (0x07c + (_i) * 4) ++#define QCA8K_PORT_STATUS_SPEED GENMASK(1, 0) ++#define QCA8K_PORT_STATUS_SPEED_10 0 ++#define QCA8K_PORT_STATUS_SPEED_100 0x1 ++#define QCA8K_PORT_STATUS_SPEED_1000 0x2 ++#define QCA8K_PORT_STATUS_TXMAC BIT(2) ++#define QCA8K_PORT_STATUS_RXMAC BIT(3) ++#define QCA8K_PORT_STATUS_TXFLOW BIT(4) ++#define QCA8K_PORT_STATUS_RXFLOW BIT(5) ++#define QCA8K_PORT_STATUS_DUPLEX BIT(6) ++#define QCA8K_PORT_STATUS_LINK_UP BIT(8) ++#define QCA8K_PORT_STATUS_LINK_AUTO BIT(9) ++#define QCA8K_PORT_STATUS_LINK_PAUSE BIT(10) ++#define QCA8K_PORT_STATUS_FLOW_AUTO BIT(12) ++#define QCA8K_REG_PORT_HDR_CTRL(_i) (0x9c + (_i * 4)) ++#define QCA8K_PORT_HDR_CTRL_RX_MASK GENMASK(3, 2) ++#define QCA8K_PORT_HDR_CTRL_TX_MASK GENMASK(1, 0) ++#define QCA8K_PORT_HDR_CTRL_ALL 2 ++#define QCA8K_PORT_HDR_CTRL_MGMT 1 ++#define QCA8K_PORT_HDR_CTRL_NONE 0 ++#define QCA8K_REG_SGMII_CTRL 0x0e0 ++#define QCA8K_SGMII_EN_PLL BIT(1) ++#define QCA8K_SGMII_EN_RX BIT(2) ++#define QCA8K_SGMII_EN_TX BIT(3) ++#define QCA8K_SGMII_EN_SD BIT(4) ++#define QCA8K_SGMII_CLK125M_DELAY BIT(7) ++#define QCA8K_SGMII_MODE_CTRL_MASK GENMASK(23, 22) ++#define QCA8K_SGMII_MODE_CTRL(x) FIELD_PREP(QCA8K_SGMII_MODE_CTRL_MASK, x) ++#define QCA8K_SGMII_MODE_CTRL_BASEX QCA8K_SGMII_MODE_CTRL(0x0) ++#define QCA8K_SGMII_MODE_CTRL_PHY QCA8K_SGMII_MODE_CTRL(0x1) ++#define QCA8K_SGMII_MODE_CTRL_MAC QCA8K_SGMII_MODE_CTRL(0x2) ++ ++/* MAC_PWR_SEL registers */ ++#define QCA8K_REG_MAC_PWR_SEL 0x0e4 ++#define QCA8K_MAC_PWR_RGMII1_1_8V BIT(18) ++#define QCA8K_MAC_PWR_RGMII0_1_8V BIT(19) ++ ++/* EEE control registers */ ++#define QCA8K_REG_EEE_CTRL 0x100 ++#define QCA8K_REG_EEE_CTRL_LPI_EN(_i) ((_i + 1) * 2) ++ ++/* TRUNK_HASH_EN registers */ ++#define QCA8K_TRUNK_HASH_EN_CTRL 0x270 ++#define QCA8K_TRUNK_HASH_SIP_EN BIT(3) ++#define QCA8K_TRUNK_HASH_DIP_EN BIT(2) ++#define QCA8K_TRUNK_HASH_SA_EN BIT(1) ++#define QCA8K_TRUNK_HASH_DA_EN BIT(0) ++#define QCA8K_TRUNK_HASH_MASK GENMASK(3, 0) ++ ++/* ACL registers */ ++#define QCA8K_REG_PORT_VLAN_CTRL0(_i) (0x420 + (_i * 8)) ++#define QCA8K_PORT_VLAN_CVID_MASK GENMASK(27, 16) ++#define QCA8K_PORT_VLAN_CVID(x) FIELD_PREP(QCA8K_PORT_VLAN_CVID_MASK, x) ++#define QCA8K_PORT_VLAN_SVID_MASK GENMASK(11, 0) ++#define QCA8K_PORT_VLAN_SVID(x) FIELD_PREP(QCA8K_PORT_VLAN_SVID_MASK, x) ++#define QCA8K_REG_PORT_VLAN_CTRL1(_i) (0x424 + (_i * 8)) ++#define QCA8K_REG_IPV4_PRI_BASE_ADDR 0x470 ++#define QCA8K_REG_IPV4_PRI_ADDR_MASK 0x474 ++ ++/* Lookup registers */ ++#define QCA8K_REG_ATU_DATA0 0x600 ++#define QCA8K_ATU_ADDR2_MASK GENMASK(31, 24) ++#define QCA8K_ATU_ADDR3_MASK GENMASK(23, 16) ++#define QCA8K_ATU_ADDR4_MASK GENMASK(15, 8) ++#define QCA8K_ATU_ADDR5_MASK GENMASK(7, 0) ++#define QCA8K_REG_ATU_DATA1 0x604 ++#define QCA8K_ATU_PORT_MASK GENMASK(22, 16) ++#define QCA8K_ATU_ADDR0_MASK GENMASK(15, 8) ++#define QCA8K_ATU_ADDR1_MASK GENMASK(7, 0) ++#define QCA8K_REG_ATU_DATA2 0x608 ++#define QCA8K_ATU_VID_MASK GENMASK(19, 8) ++#define QCA8K_ATU_STATUS_MASK GENMASK(3, 0) ++#define QCA8K_ATU_STATUS_STATIC 0xf ++#define QCA8K_REG_ATU_FUNC 0x60c ++#define QCA8K_ATU_FUNC_BUSY BIT(31) ++#define QCA8K_ATU_FUNC_PORT_EN BIT(14) ++#define QCA8K_ATU_FUNC_MULTI_EN BIT(13) ++#define QCA8K_ATU_FUNC_FULL BIT(12) ++#define QCA8K_ATU_FUNC_PORT_MASK GENMASK(11, 8) ++#define QCA8K_REG_VTU_FUNC0 0x610 ++#define QCA8K_VTU_FUNC0_VALID BIT(20) ++#define QCA8K_VTU_FUNC0_IVL_EN BIT(19) ++/* QCA8K_VTU_FUNC0_EG_MODE_MASK GENMASK(17, 4) ++ * It does contain VLAN_MODE for each port [5:4] for port0, ++ * [7:6] for port1 ... [17:16] for port6. Use virtual port ++ * define to handle this. ++ */ ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i) (4 + (_i) * 2) ++#define QCA8K_VTU_FUNC0_EG_MODE_MASK GENMASK(1, 0) ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(_i) (GENMASK(1, 0) << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) ++#define QCA8K_VTU_FUNC0_EG_MODE_UNMOD FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x0) ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_UNMOD(_i) (QCA8K_VTU_FUNC0_EG_MODE_UNMOD << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) ++#define QCA8K_VTU_FUNC0_EG_MODE_UNTAG FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x1) ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(_i) (QCA8K_VTU_FUNC0_EG_MODE_UNTAG << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) ++#define QCA8K_VTU_FUNC0_EG_MODE_TAG FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x2) ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(_i) (QCA8K_VTU_FUNC0_EG_MODE_TAG << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) ++#define QCA8K_VTU_FUNC0_EG_MODE_NOT FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x3) ++#define QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(_i) (QCA8K_VTU_FUNC0_EG_MODE_NOT << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) ++#define QCA8K_REG_VTU_FUNC1 0x614 ++#define QCA8K_VTU_FUNC1_BUSY BIT(31) ++#define QCA8K_VTU_FUNC1_VID_MASK GENMASK(27, 16) ++#define QCA8K_VTU_FUNC1_FULL BIT(4) ++#define QCA8K_REG_ATU_CTRL 0x618 ++#define QCA8K_ATU_AGE_TIME_MASK GENMASK(15, 0) ++#define QCA8K_ATU_AGE_TIME(x) FIELD_PREP(QCA8K_ATU_AGE_TIME_MASK, (x)) ++#define QCA8K_REG_GLOBAL_FW_CTRL0 0x620 ++#define QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN BIT(10) ++#define QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM GENMASK(7, 4) ++#define QCA8K_REG_GLOBAL_FW_CTRL1 0x624 ++#define QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK GENMASK(30, 24) ++#define QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK GENMASK(22, 16) ++#define QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK GENMASK(14, 8) ++#define QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK GENMASK(6, 0) ++#define QCA8K_PORT_LOOKUP_CTRL(_i) (0x660 + (_i) * 0xc) ++#define QCA8K_PORT_LOOKUP_MEMBER GENMASK(6, 0) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE_MASK GENMASK(9, 8) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE(x) FIELD_PREP(QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, x) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE_NONE QCA8K_PORT_LOOKUP_VLAN_MODE(0x0) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE_FALLBACK QCA8K_PORT_LOOKUP_VLAN_MODE(0x1) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE_CHECK QCA8K_PORT_LOOKUP_VLAN_MODE(0x2) ++#define QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE QCA8K_PORT_LOOKUP_VLAN_MODE(0x3) ++#define QCA8K_PORT_LOOKUP_STATE_MASK GENMASK(18, 16) ++#define QCA8K_PORT_LOOKUP_STATE(x) FIELD_PREP(QCA8K_PORT_LOOKUP_STATE_MASK, x) ++#define QCA8K_PORT_LOOKUP_STATE_DISABLED QCA8K_PORT_LOOKUP_STATE(0x0) ++#define QCA8K_PORT_LOOKUP_STATE_BLOCKING QCA8K_PORT_LOOKUP_STATE(0x1) ++#define QCA8K_PORT_LOOKUP_STATE_LISTENING QCA8K_PORT_LOOKUP_STATE(0x2) ++#define QCA8K_PORT_LOOKUP_STATE_LEARNING QCA8K_PORT_LOOKUP_STATE(0x3) ++#define QCA8K_PORT_LOOKUP_STATE_FORWARD QCA8K_PORT_LOOKUP_STATE(0x4) ++#define QCA8K_PORT_LOOKUP_LEARN BIT(20) ++#define QCA8K_PORT_LOOKUP_ING_MIRROR_EN BIT(25) ++ ++#define QCA8K_REG_GOL_TRUNK_CTRL0 0x700 ++/* 4 max trunk first ++ * first 6 bit for member bitmap ++ * 7th bit is to enable trunk port ++ */ ++#define QCA8K_REG_GOL_TRUNK_SHIFT(_i) ((_i) * 8) ++#define QCA8K_REG_GOL_TRUNK_EN_MASK BIT(7) ++#define QCA8K_REG_GOL_TRUNK_EN(_i) (QCA8K_REG_GOL_TRUNK_EN_MASK << QCA8K_REG_GOL_TRUNK_SHIFT(_i)) ++#define QCA8K_REG_GOL_TRUNK_MEMBER_MASK GENMASK(6, 0) ++#define QCA8K_REG_GOL_TRUNK_MEMBER(_i) (QCA8K_REG_GOL_TRUNK_MEMBER_MASK << QCA8K_REG_GOL_TRUNK_SHIFT(_i)) ++/* 0x704 for TRUNK 0-1 --- 0x708 for TRUNK 2-3 */ ++#define QCA8K_REG_GOL_TRUNK_CTRL(_i) (0x704 + (((_i) / 2) * 4)) ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_MASK GENMASK(3, 0) ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK BIT(3) ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK GENMASK(2, 0) ++#define QCA8K_REG_GOL_TRUNK_ID_SHIFT(_i) (((_i) / 2) * 16) ++#define QCA8K_REG_GOL_MEM_ID_SHIFT(_i) ((_i) * 4) ++/* Complex shift: FIRST shift for port THEN shift for trunk */ ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(_i, _j) (QCA8K_REG_GOL_MEM_ID_SHIFT(_j) + QCA8K_REG_GOL_TRUNK_ID_SHIFT(_i)) ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN(_i, _j) (QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(_i, _j)) ++#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT(_i, _j) (QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(_i, _j)) ++ ++#define QCA8K_REG_GLOBAL_FC_THRESH 0x800 ++#define QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK GENMASK(24, 16) ++#define QCA8K_GLOBAL_FC_GOL_XON_THRES(x) FIELD_PREP(QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK, x) ++#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK GENMASK(8, 0) ++#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES(x) FIELD_PREP(QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK, x) ++ ++#define QCA8K_REG_PORT_HOL_CTRL0(_i) (0x970 + (_i) * 0x8) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF_MASK GENMASK(3, 0) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI0(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI1_BUF_MASK GENMASK(7, 4) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI1(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI1_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI2_BUF_MASK GENMASK(11, 8) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI2(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI2_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI3_BUF_MASK GENMASK(15, 12) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI3(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI3_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI4_BUF_MASK GENMASK(19, 16) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI4(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI4_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI5_BUF_MASK GENMASK(23, 20) ++#define QCA8K_PORT_HOL_CTRL0_EG_PRI5(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI5_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL0_EG_PORT_BUF_MASK GENMASK(29, 24) ++#define QCA8K_PORT_HOL_CTRL0_EG_PORT(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PORT_BUF_MASK, x) ++ ++#define QCA8K_REG_PORT_HOL_CTRL1(_i) (0x974 + (_i) * 0x8) ++#define QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK GENMASK(3, 0) ++#define QCA8K_PORT_HOL_CTRL1_ING(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK, x) ++#define QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN BIT(6) ++#define QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN BIT(7) ++#define QCA8K_PORT_HOL_CTRL1_WRED_EN BIT(8) ++#define QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN BIT(16) ++ ++/* Pkt edit registers */ ++#define QCA8K_EGREES_VLAN_PORT_SHIFT(_i) (16 * ((_i) % 2)) ++#define QCA8K_EGREES_VLAN_PORT_MASK(_i) (GENMASK(11, 0) << QCA8K_EGREES_VLAN_PORT_SHIFT(_i)) ++#define QCA8K_EGREES_VLAN_PORT(_i, x) ((x) << QCA8K_EGREES_VLAN_PORT_SHIFT(_i)) ++#define QCA8K_EGRESS_VLAN(x) (0x0c70 + (4 * (x / 2))) ++ ++/* L3 registers */ ++#define QCA8K_HROUTER_CONTROL 0xe00 ++#define QCA8K_HROUTER_CONTROL_GLB_LOCKTIME_M GENMASK(17, 16) ++#define QCA8K_HROUTER_CONTROL_GLB_LOCKTIME_S 16 ++#define QCA8K_HROUTER_CONTROL_ARP_AGE_MODE 1 ++#define QCA8K_HROUTER_PBASED_CONTROL1 0xe08 ++#define QCA8K_HROUTER_PBASED_CONTROL2 0xe0c ++#define QCA8K_HNAT_CONTROL 0xe38 ++ ++/* MIB registers */ ++#define QCA8K_PORT_MIB_COUNTER(_i) (0x1000 + (_i) * 0x100) ++ ++/* QCA specific MII registers */ ++#define MII_ATH_MMD_ADDR 0x0d ++#define MII_ATH_MMD_DATA 0x0e ++ ++enum { ++ QCA8K_PORT_SPEED_10M = 0, ++ QCA8K_PORT_SPEED_100M = 1, ++ QCA8K_PORT_SPEED_1000M = 2, ++ QCA8K_PORT_SPEED_ERR = 3, ++}; ++ ++enum qca8k_fdb_cmd { ++ QCA8K_FDB_FLUSH = 1, ++ QCA8K_FDB_LOAD = 2, ++ QCA8K_FDB_PURGE = 3, ++ QCA8K_FDB_FLUSH_PORT = 5, ++ QCA8K_FDB_NEXT = 6, ++ QCA8K_FDB_SEARCH = 7, ++}; ++ ++enum qca8k_vlan_cmd { ++ QCA8K_VLAN_FLUSH = 1, ++ QCA8K_VLAN_LOAD = 2, ++ QCA8K_VLAN_PURGE = 3, ++ QCA8K_VLAN_REMOVE_PORT = 4, ++ QCA8K_VLAN_NEXT = 5, ++ QCA8K_VLAN_READ = 6, ++}; ++ ++enum qca8k_mid_cmd { ++ QCA8K_MIB_FLUSH = 1, ++ QCA8K_MIB_FLUSH_PORT = 2, ++ QCA8K_MIB_CAST = 3, ++}; ++ ++struct qca8k_match_data { ++ u8 id; ++ bool reduced_package; ++ u8 mib_count; ++}; ++ ++enum { ++ QCA8K_CPU_PORT0, ++ QCA8K_CPU_PORT6, ++}; ++ ++struct qca8k_mgmt_eth_data { ++ struct completion rw_done; ++ struct mutex mutex; /* Enforce one mdio read/write at time */ ++ bool ack; ++ u32 seq; ++ u32 data[4]; ++}; ++ ++struct qca8k_mib_eth_data { ++ struct completion rw_done; ++ struct mutex mutex; /* Process one command at time */ ++ refcount_t port_parsed; /* Counter to track parsed port */ ++ u8 req_port; ++ u64 *data; /* pointer to ethtool data */ ++}; ++ ++struct qca8k_ports_config { ++ bool sgmii_rx_clk_falling_edge; ++ bool sgmii_tx_clk_falling_edge; ++ bool sgmii_enable_pll; ++ u8 rgmii_rx_delay[QCA8K_NUM_CPU_PORTS]; /* 0: CPU port0, 1: CPU port6 */ ++ u8 rgmii_tx_delay[QCA8K_NUM_CPU_PORTS]; /* 0: CPU port0, 1: CPU port6 */ ++}; ++ ++struct qca8k_mdio_cache { ++/* The 32bit switch registers are accessed indirectly. To achieve this we need ++ * to set the page of the register. Track the last page that was set to reduce ++ * mdio writes ++ */ ++ u16 page; ++/* lo and hi can also be cached and from Documentation we can skip one ++ * extra mdio write if lo or hi is didn't change. ++ */ ++ u16 lo; ++ u16 hi; ++}; ++ ++struct qca8k_priv { ++ u8 switch_id; ++ u8 switch_revision; ++ u8 mirror_rx; ++ u8 mirror_tx; ++ u8 lag_hash_mode; ++ /* Each bit correspond to a port. This switch can support a max of 7 port. ++ * Bit 1: port enabled. Bit 0: port disabled. ++ */ ++ u8 port_enabled_map; ++ struct qca8k_ports_config ports_config; ++ struct regmap *regmap; ++ struct mii_bus *bus; ++ struct dsa_switch *ds; ++ struct mutex reg_mutex; ++ struct device *dev; ++ struct gpio_desc *reset_gpio; ++ struct net_device *mgmt_master; /* Track if mdio/mib Ethernet is available */ ++ struct qca8k_mgmt_eth_data mgmt_eth_data; ++ struct qca8k_mib_eth_data mib_eth_data; ++ struct qca8k_mdio_cache mdio_cache; ++}; ++ ++struct qca8k_mib_desc { ++ unsigned int size; ++ unsigned int offset; ++ const char *name; ++}; ++ ++struct qca8k_fdb { ++ u16 vid; ++ u8 port_mask; ++ u8 aging; ++ u8 mac[6]; ++}; ++ ++#endif /* __QCA8K_H */ +--- a/drivers/net/dsa/qca8k.c ++++ /dev/null +@@ -1,3243 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0 +-/* +- * Copyright (C) 2009 Felix Fietkau +- * Copyright (C) 2011-2012 Gabor Juhos +- * Copyright (c) 2015, 2019, The Linux Foundation. All rights reserved. +- * Copyright (c) 2016 John Crispin +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include "qca8k.h" +- +-#define MIB_DESC(_s, _o, _n) \ +- { \ +- .size = (_s), \ +- .offset = (_o), \ +- .name = (_n), \ +- } +- +-static const struct qca8k_mib_desc ar8327_mib[] = { +- MIB_DESC(1, 0x00, "RxBroad"), +- MIB_DESC(1, 0x04, "RxPause"), +- MIB_DESC(1, 0x08, "RxMulti"), +- MIB_DESC(1, 0x0c, "RxFcsErr"), +- MIB_DESC(1, 0x10, "RxAlignErr"), +- MIB_DESC(1, 0x14, "RxRunt"), +- MIB_DESC(1, 0x18, "RxFragment"), +- MIB_DESC(1, 0x1c, "Rx64Byte"), +- MIB_DESC(1, 0x20, "Rx128Byte"), +- MIB_DESC(1, 0x24, "Rx256Byte"), +- MIB_DESC(1, 0x28, "Rx512Byte"), +- MIB_DESC(1, 0x2c, "Rx1024Byte"), +- MIB_DESC(1, 0x30, "Rx1518Byte"), +- MIB_DESC(1, 0x34, "RxMaxByte"), +- MIB_DESC(1, 0x38, "RxTooLong"), +- MIB_DESC(2, 0x3c, "RxGoodByte"), +- MIB_DESC(2, 0x44, "RxBadByte"), +- MIB_DESC(1, 0x4c, "RxOverFlow"), +- MIB_DESC(1, 0x50, "Filtered"), +- MIB_DESC(1, 0x54, "TxBroad"), +- MIB_DESC(1, 0x58, "TxPause"), +- MIB_DESC(1, 0x5c, "TxMulti"), +- MIB_DESC(1, 0x60, "TxUnderRun"), +- MIB_DESC(1, 0x64, "Tx64Byte"), +- MIB_DESC(1, 0x68, "Tx128Byte"), +- MIB_DESC(1, 0x6c, "Tx256Byte"), +- MIB_DESC(1, 0x70, "Tx512Byte"), +- MIB_DESC(1, 0x74, "Tx1024Byte"), +- MIB_DESC(1, 0x78, "Tx1518Byte"), +- MIB_DESC(1, 0x7c, "TxMaxByte"), +- MIB_DESC(1, 0x80, "TxOverSize"), +- MIB_DESC(2, 0x84, "TxByte"), +- MIB_DESC(1, 0x8c, "TxCollision"), +- MIB_DESC(1, 0x90, "TxAbortCol"), +- MIB_DESC(1, 0x94, "TxMultiCol"), +- MIB_DESC(1, 0x98, "TxSingleCol"), +- MIB_DESC(1, 0x9c, "TxExcDefer"), +- MIB_DESC(1, 0xa0, "TxDefer"), +- MIB_DESC(1, 0xa4, "TxLateCol"), +- MIB_DESC(1, 0xa8, "RXUnicast"), +- MIB_DESC(1, 0xac, "TXUnicast"), +-}; +- +-static void +-qca8k_split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) +-{ +- regaddr >>= 1; +- *r1 = regaddr & 0x1e; +- +- regaddr >>= 5; +- *r2 = regaddr & 0x7; +- +- regaddr >>= 3; +- *page = regaddr & 0x3ff; +-} +- +-static int +-qca8k_set_lo(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 lo) +-{ +- u16 *cached_lo = &priv->mdio_cache.lo; +- struct mii_bus *bus = priv->bus; +- int ret; +- +- if (lo == *cached_lo) +- return 0; +- +- ret = bus->write(bus, phy_id, regnum, lo); +- if (ret < 0) +- dev_err_ratelimited(&bus->dev, +- "failed to write qca8k 32bit lo register\n"); +- +- *cached_lo = lo; +- return 0; +-} +- +-static int +-qca8k_set_hi(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 hi) +-{ +- u16 *cached_hi = &priv->mdio_cache.hi; +- struct mii_bus *bus = priv->bus; +- int ret; +- +- if (hi == *cached_hi) +- return 0; +- +- ret = bus->write(bus, phy_id, regnum, hi); +- if (ret < 0) +- dev_err_ratelimited(&bus->dev, +- "failed to write qca8k 32bit hi register\n"); +- +- *cached_hi = hi; +- return 0; +-} +- +-static int +-qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) +-{ +- int ret; +- +- ret = bus->read(bus, phy_id, regnum); +- if (ret >= 0) { +- *val = ret; +- ret = bus->read(bus, phy_id, regnum + 1); +- *val |= ret << 16; +- } +- +- if (ret < 0) { +- dev_err_ratelimited(&bus->dev, +- "failed to read qca8k 32bit register\n"); +- *val = 0; +- return ret; +- } +- +- return 0; +-} +- +-static void +-qca8k_mii_write32(struct qca8k_priv *priv, int phy_id, u32 regnum, u32 val) +-{ +- u16 lo, hi; +- int ret; +- +- lo = val & 0xffff; +- hi = (u16)(val >> 16); +- +- ret = qca8k_set_lo(priv, phy_id, regnum, lo); +- if (ret >= 0) +- ret = qca8k_set_hi(priv, phy_id, regnum + 1, hi); +-} +- +-static int +-qca8k_set_page(struct qca8k_priv *priv, u16 page) +-{ +- u16 *cached_page = &priv->mdio_cache.page; +- struct mii_bus *bus = priv->bus; +- int ret; +- +- if (page == *cached_page) +- return 0; +- +- ret = bus->write(bus, 0x18, 0, page); +- if (ret < 0) { +- dev_err_ratelimited(&bus->dev, +- "failed to set qca8k page\n"); +- return ret; +- } +- +- *cached_page = page; +- usleep_range(1000, 2000); +- return 0; +-} +- +-static int +-qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val) +-{ +- return regmap_read(priv->regmap, reg, val); +-} +- +-static int +-qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val) +-{ +- return regmap_write(priv->regmap, reg, val); +-} +- +-static int +-qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) +-{ +- return regmap_update_bits(priv->regmap, reg, mask, write_val); +-} +- +-static void qca8k_rw_reg_ack_handler(struct dsa_switch *ds, struct sk_buff *skb) +-{ +- struct qca8k_mgmt_eth_data *mgmt_eth_data; +- struct qca8k_priv *priv = ds->priv; +- struct qca_mgmt_ethhdr *mgmt_ethhdr; +- u8 len, cmd; +- +- mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb_mac_header(skb); +- mgmt_eth_data = &priv->mgmt_eth_data; +- +- cmd = FIELD_GET(QCA_HDR_MGMT_CMD, mgmt_ethhdr->command); +- len = FIELD_GET(QCA_HDR_MGMT_LENGTH, mgmt_ethhdr->command); +- +- /* Make sure the seq match the requested packet */ +- if (mgmt_ethhdr->seq == mgmt_eth_data->seq) +- mgmt_eth_data->ack = true; +- +- if (cmd == MDIO_READ) { +- mgmt_eth_data->data[0] = mgmt_ethhdr->mdio_data; +- +- /* Get the rest of the 12 byte of data. +- * The read/write function will extract the requested data. +- */ +- if (len > QCA_HDR_MGMT_DATA1_LEN) +- memcpy(mgmt_eth_data->data + 1, skb->data, +- QCA_HDR_MGMT_DATA2_LEN); +- } +- +- complete(&mgmt_eth_data->rw_done); +-} +- +-static struct sk_buff *qca8k_alloc_mdio_header(enum mdio_cmd cmd, u32 reg, u32 *val, +- int priority, unsigned int len) +-{ +- struct qca_mgmt_ethhdr *mgmt_ethhdr; +- unsigned int real_len; +- struct sk_buff *skb; +- u32 *data2; +- u16 hdr; +- +- skb = dev_alloc_skb(QCA_HDR_MGMT_PKT_LEN); +- if (!skb) +- return NULL; +- +- /* Max value for len reg is 15 (0xf) but the switch actually return 16 byte +- * Actually for some reason the steps are: +- * 0: nothing +- * 1-4: first 4 byte +- * 5-6: first 12 byte +- * 7-15: all 16 byte +- */ +- if (len == 16) +- real_len = 15; +- else +- real_len = len; +- +- skb_reset_mac_header(skb); +- skb_set_network_header(skb, skb->len); +- +- mgmt_ethhdr = skb_push(skb, QCA_HDR_MGMT_HEADER_LEN + QCA_HDR_LEN); +- +- hdr = FIELD_PREP(QCA_HDR_XMIT_VERSION, QCA_HDR_VERSION); +- hdr |= FIELD_PREP(QCA_HDR_XMIT_PRIORITY, priority); +- hdr |= QCA_HDR_XMIT_FROM_CPU; +- hdr |= FIELD_PREP(QCA_HDR_XMIT_DP_BIT, BIT(0)); +- hdr |= FIELD_PREP(QCA_HDR_XMIT_CONTROL, QCA_HDR_XMIT_TYPE_RW_REG); +- +- mgmt_ethhdr->command = FIELD_PREP(QCA_HDR_MGMT_ADDR, reg); +- mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_LENGTH, real_len); +- mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CMD, cmd); +- mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CHECK_CODE, +- QCA_HDR_MGMT_CHECK_CODE_VAL); +- +- if (cmd == MDIO_WRITE) +- mgmt_ethhdr->mdio_data = *val; +- +- mgmt_ethhdr->hdr = htons(hdr); +- +- data2 = skb_put_zero(skb, QCA_HDR_MGMT_DATA2_LEN + QCA_HDR_MGMT_PADDING_LEN); +- if (cmd == MDIO_WRITE && len > QCA_HDR_MGMT_DATA1_LEN) +- memcpy(data2, val + 1, len - QCA_HDR_MGMT_DATA1_LEN); +- +- return skb; +-} +- +-static void qca8k_mdio_header_fill_seq_num(struct sk_buff *skb, u32 seq_num) +-{ +- struct qca_mgmt_ethhdr *mgmt_ethhdr; +- +- mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb->data; +- mgmt_ethhdr->seq = FIELD_PREP(QCA_HDR_MGMT_SEQ_NUM, seq_num); +-} +- +-static int qca8k_read_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) +-{ +- struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; +- struct sk_buff *skb; +- bool ack; +- int ret; +- +- skb = qca8k_alloc_mdio_header(MDIO_READ, reg, NULL, +- QCA8K_ETHERNET_MDIO_PRIORITY, len); +- if (!skb) +- return -ENOMEM; +- +- mutex_lock(&mgmt_eth_data->mutex); +- +- /* Check mgmt_master if is operational */ +- if (!priv->mgmt_master) { +- kfree_skb(skb); +- mutex_unlock(&mgmt_eth_data->mutex); +- return -EINVAL; +- } +- +- skb->dev = priv->mgmt_master; +- +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the mdio pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(skb); +- +- ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); +- +- *val = mgmt_eth_data->data[0]; +- if (len > QCA_HDR_MGMT_DATA1_LEN) +- memcpy(val + 1, mgmt_eth_data->data + 1, len - QCA_HDR_MGMT_DATA1_LEN); +- +- ack = mgmt_eth_data->ack; +- +- mutex_unlock(&mgmt_eth_data->mutex); +- +- if (ret <= 0) +- return -ETIMEDOUT; +- +- if (!ack) +- return -EINVAL; +- +- return 0; +-} +- +-static int qca8k_write_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) +-{ +- struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; +- struct sk_buff *skb; +- bool ack; +- int ret; +- +- skb = qca8k_alloc_mdio_header(MDIO_WRITE, reg, val, +- QCA8K_ETHERNET_MDIO_PRIORITY, len); +- if (!skb) +- return -ENOMEM; +- +- mutex_lock(&mgmt_eth_data->mutex); +- +- /* Check mgmt_master if is operational */ +- if (!priv->mgmt_master) { +- kfree_skb(skb); +- mutex_unlock(&mgmt_eth_data->mutex); +- return -EINVAL; +- } +- +- skb->dev = priv->mgmt_master; +- +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the mdio pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(skb); +- +- ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); +- +- ack = mgmt_eth_data->ack; +- +- mutex_unlock(&mgmt_eth_data->mutex); +- +- if (ret <= 0) +- return -ETIMEDOUT; +- +- if (!ack) +- return -EINVAL; +- +- return 0; +-} +- +-static int +-qca8k_regmap_update_bits_eth(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) +-{ +- u32 val = 0; +- int ret; +- +- ret = qca8k_read_eth(priv, reg, &val, sizeof(val)); +- if (ret) +- return ret; +- +- val &= ~mask; +- val |= write_val; +- +- return qca8k_write_eth(priv, reg, &val, sizeof(val)); +-} +- +-static int +-qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len) +-{ +- int i, count = len / sizeof(u32), ret; +- +- if (priv->mgmt_master && !qca8k_read_eth(priv, reg, val, len)) +- return 0; +- +- for (i = 0; i < count; i++) { +- ret = regmap_read(priv->regmap, reg + (i * 4), val + i); +- if (ret < 0) +- return ret; +- } +- +- return 0; +-} +- +-static int +-qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len) +-{ +- int i, count = len / sizeof(u32), ret; +- u32 tmp; +- +- if (priv->mgmt_master && !qca8k_write_eth(priv, reg, val, len)) +- return 0; +- +- for (i = 0; i < count; i++) { +- tmp = val[i]; +- +- ret = regmap_write(priv->regmap, reg + (i * 4), tmp); +- if (ret < 0) +- return ret; +- } +- +- return 0; +-} +- +-static int +-qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ctx; +- struct mii_bus *bus = priv->bus; +- u16 r1, r2, page; +- int ret; +- +- if (!qca8k_read_eth(priv, reg, val, sizeof(*val))) +- return 0; +- +- qca8k_split_addr(reg, &r1, &r2, &page); +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +- +- ret = qca8k_set_page(priv, page); +- if (ret < 0) +- goto exit; +- +- ret = qca8k_mii_read32(bus, 0x10 | r2, r1, val); +- +-exit: +- mutex_unlock(&bus->mdio_lock); +- return ret; +-} +- +-static int +-qca8k_regmap_write(void *ctx, uint32_t reg, uint32_t val) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ctx; +- struct mii_bus *bus = priv->bus; +- u16 r1, r2, page; +- int ret; +- +- if (!qca8k_write_eth(priv, reg, &val, sizeof(val))) +- return 0; +- +- qca8k_split_addr(reg, &r1, &r2, &page); +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +- +- ret = qca8k_set_page(priv, page); +- if (ret < 0) +- goto exit; +- +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); +- +-exit: +- mutex_unlock(&bus->mdio_lock); +- return ret; +-} +- +-static int +-qca8k_regmap_update_bits(void *ctx, uint32_t reg, uint32_t mask, uint32_t write_val) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ctx; +- struct mii_bus *bus = priv->bus; +- u16 r1, r2, page; +- u32 val; +- int ret; +- +- if (!qca8k_regmap_update_bits_eth(priv, reg, mask, write_val)) +- return 0; +- +- qca8k_split_addr(reg, &r1, &r2, &page); +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +- +- ret = qca8k_set_page(priv, page); +- if (ret < 0) +- goto exit; +- +- ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); +- if (ret < 0) +- goto exit; +- +- val &= ~mask; +- val |= write_val; +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); +- +-exit: +- mutex_unlock(&bus->mdio_lock); +- +- return ret; +-} +- +-static const struct regmap_range qca8k_readable_ranges[] = { +- regmap_reg_range(0x0000, 0x00e4), /* Global control */ +- regmap_reg_range(0x0100, 0x0168), /* EEE control */ +- regmap_reg_range(0x0200, 0x0270), /* Parser control */ +- regmap_reg_range(0x0400, 0x0454), /* ACL */ +- regmap_reg_range(0x0600, 0x0718), /* Lookup */ +- regmap_reg_range(0x0800, 0x0b70), /* QM */ +- regmap_reg_range(0x0c00, 0x0c80), /* PKT */ +- regmap_reg_range(0x0e00, 0x0e98), /* L3 */ +- regmap_reg_range(0x1000, 0x10ac), /* MIB - Port0 */ +- regmap_reg_range(0x1100, 0x11ac), /* MIB - Port1 */ +- regmap_reg_range(0x1200, 0x12ac), /* MIB - Port2 */ +- regmap_reg_range(0x1300, 0x13ac), /* MIB - Port3 */ +- regmap_reg_range(0x1400, 0x14ac), /* MIB - Port4 */ +- regmap_reg_range(0x1500, 0x15ac), /* MIB - Port5 */ +- regmap_reg_range(0x1600, 0x16ac), /* MIB - Port6 */ +- +-}; +- +-static const struct regmap_access_table qca8k_readable_table = { +- .yes_ranges = qca8k_readable_ranges, +- .n_yes_ranges = ARRAY_SIZE(qca8k_readable_ranges), +-}; +- +-static struct regmap_config qca8k_regmap_config = { +- .reg_bits = 16, +- .val_bits = 32, +- .reg_stride = 4, +- .max_register = 0x16ac, /* end MIB - Port6 range */ +- .reg_read = qca8k_regmap_read, +- .reg_write = qca8k_regmap_write, +- .reg_update_bits = qca8k_regmap_update_bits, +- .rd_table = &qca8k_readable_table, +- .disable_locking = true, /* Locking is handled by qca8k read/write */ +- .cache_type = REGCACHE_NONE, /* Explicitly disable CACHE */ +-}; +- +-static int +-qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) +-{ +- u32 val; +- +- return regmap_read_poll_timeout(priv->regmap, reg, val, !(val & mask), 0, +- QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC); +-} +- +-static int +-qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb) +-{ +- u32 reg[3]; +- int ret; +- +- /* load the ARL table into an array */ +- ret = qca8k_bulk_read(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); +- if (ret) +- return ret; +- +- /* vid - 83:72 */ +- fdb->vid = FIELD_GET(QCA8K_ATU_VID_MASK, reg[2]); +- /* aging - 67:64 */ +- fdb->aging = FIELD_GET(QCA8K_ATU_STATUS_MASK, reg[2]); +- /* portmask - 54:48 */ +- fdb->port_mask = FIELD_GET(QCA8K_ATU_PORT_MASK, reg[1]); +- /* mac - 47:0 */ +- fdb->mac[0] = FIELD_GET(QCA8K_ATU_ADDR0_MASK, reg[1]); +- fdb->mac[1] = FIELD_GET(QCA8K_ATU_ADDR1_MASK, reg[1]); +- fdb->mac[2] = FIELD_GET(QCA8K_ATU_ADDR2_MASK, reg[0]); +- fdb->mac[3] = FIELD_GET(QCA8K_ATU_ADDR3_MASK, reg[0]); +- fdb->mac[4] = FIELD_GET(QCA8K_ATU_ADDR4_MASK, reg[0]); +- fdb->mac[5] = FIELD_GET(QCA8K_ATU_ADDR5_MASK, reg[0]); +- +- return 0; +-} +- +-static void +-qca8k_fdb_write(struct qca8k_priv *priv, u16 vid, u8 port_mask, const u8 *mac, +- u8 aging) +-{ +- u32 reg[3] = { 0 }; +- +- /* vid - 83:72 */ +- reg[2] = FIELD_PREP(QCA8K_ATU_VID_MASK, vid); +- /* aging - 67:64 */ +- reg[2] |= FIELD_PREP(QCA8K_ATU_STATUS_MASK, aging); +- /* portmask - 54:48 */ +- reg[1] = FIELD_PREP(QCA8K_ATU_PORT_MASK, port_mask); +- /* mac - 47:0 */ +- reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR0_MASK, mac[0]); +- reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR1_MASK, mac[1]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR2_MASK, mac[2]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR3_MASK, mac[3]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR4_MASK, mac[4]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR5_MASK, mac[5]); +- +- /* load the array into the ARL table */ +- qca8k_bulk_write(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); +-} +- +-static int +-qca8k_fdb_access(struct qca8k_priv *priv, enum qca8k_fdb_cmd cmd, int port) +-{ +- u32 reg; +- int ret; +- +- /* Set the command and FDB index */ +- reg = QCA8K_ATU_FUNC_BUSY; +- reg |= cmd; +- if (port >= 0) { +- reg |= QCA8K_ATU_FUNC_PORT_EN; +- reg |= FIELD_PREP(QCA8K_ATU_FUNC_PORT_MASK, port); +- } +- +- /* Write the function register triggering the table access */ +- ret = qca8k_write(priv, QCA8K_REG_ATU_FUNC, reg); +- if (ret) +- return ret; +- +- /* wait for completion */ +- ret = qca8k_busy_wait(priv, QCA8K_REG_ATU_FUNC, QCA8K_ATU_FUNC_BUSY); +- if (ret) +- return ret; +- +- /* Check for table full violation when adding an entry */ +- if (cmd == QCA8K_FDB_LOAD) { +- ret = qca8k_read(priv, QCA8K_REG_ATU_FUNC, ®); +- if (ret < 0) +- return ret; +- if (reg & QCA8K_ATU_FUNC_FULL) +- return -1; +- } +- +- return 0; +-} +- +-static int +-qca8k_fdb_next(struct qca8k_priv *priv, struct qca8k_fdb *fdb, int port) +-{ +- int ret; +- +- qca8k_fdb_write(priv, fdb->vid, fdb->port_mask, fdb->mac, fdb->aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_NEXT, port); +- if (ret < 0) +- return ret; +- +- return qca8k_fdb_read(priv, fdb); +-} +- +-static int +-qca8k_fdb_add(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, +- u16 vid, u8 aging) +-{ +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_write(priv, vid, port_mask, mac, aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static int +-qca8k_fdb_del(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, u16 vid) +-{ +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_write(priv, vid, port_mask, mac, 0); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static void +-qca8k_fdb_flush(struct qca8k_priv *priv) +-{ +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_access(priv, QCA8K_FDB_FLUSH, -1); +- mutex_unlock(&priv->reg_mutex); +-} +- +-static int +-qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask, +- const u8 *mac, u16 vid) +-{ +- struct qca8k_fdb fdb = { 0 }; +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- +- qca8k_fdb_write(priv, vid, 0, mac, 0); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); +- if (ret < 0) +- goto exit; +- +- ret = qca8k_fdb_read(priv, &fdb); +- if (ret < 0) +- goto exit; +- +- /* Rule exist. Delete first */ +- if (!fdb.aging) { +- ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); +- if (ret) +- goto exit; +- } +- +- /* Add port to fdb portmask */ +- fdb.port_mask |= port_mask; +- +- qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- +-static int +-qca8k_fdb_search_and_del(struct qca8k_priv *priv, u8 port_mask, +- const u8 *mac, u16 vid) +-{ +- struct qca8k_fdb fdb = { 0 }; +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- +- qca8k_fdb_write(priv, vid, 0, mac, 0); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); +- if (ret < 0) +- goto exit; +- +- /* Rule doesn't exist. Why delete? */ +- if (!fdb.aging) { +- ret = -EINVAL; +- goto exit; +- } +- +- ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); +- if (ret) +- goto exit; +- +- /* Only port in the rule is this port. Don't re insert */ +- if (fdb.port_mask == port_mask) +- goto exit; +- +- /* Remove port from port mask */ +- fdb.port_mask &= ~port_mask; +- +- qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- +-static int +-qca8k_vlan_access(struct qca8k_priv *priv, enum qca8k_vlan_cmd cmd, u16 vid) +-{ +- u32 reg; +- int ret; +- +- /* Set the command and VLAN index */ +- reg = QCA8K_VTU_FUNC1_BUSY; +- reg |= cmd; +- reg |= FIELD_PREP(QCA8K_VTU_FUNC1_VID_MASK, vid); +- +- /* Write the function register triggering the table access */ +- ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC1, reg); +- if (ret) +- return ret; +- +- /* wait for completion */ +- ret = qca8k_busy_wait(priv, QCA8K_REG_VTU_FUNC1, QCA8K_VTU_FUNC1_BUSY); +- if (ret) +- return ret; +- +- /* Check for table full violation when adding an entry */ +- if (cmd == QCA8K_VLAN_LOAD) { +- ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC1, ®); +- if (ret < 0) +- return ret; +- if (reg & QCA8K_VTU_FUNC1_FULL) +- return -ENOMEM; +- } +- +- return 0; +-} +- +-static int +-qca8k_vlan_add(struct qca8k_priv *priv, u8 port, u16 vid, bool untagged) +-{ +- u32 reg; +- int ret; +- +- /* +- We do the right thing with VLAN 0 and treat it as untagged while +- preserving the tag on egress. +- */ +- if (vid == 0) +- return 0; +- +- mutex_lock(&priv->reg_mutex); +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); +- if (ret < 0) +- goto out; +- +- ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); +- if (ret < 0) +- goto out; +- reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; +- reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); +- if (untagged) +- reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(port); +- else +- reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(port); +- +- ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); +- if (ret) +- goto out; +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); +- +-out: +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static int +-qca8k_vlan_del(struct qca8k_priv *priv, u8 port, u16 vid) +-{ +- u32 reg, mask; +- int ret, i; +- bool del; +- +- mutex_lock(&priv->reg_mutex); +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); +- if (ret < 0) +- goto out; +- +- ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); +- if (ret < 0) +- goto out; +- reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); +- reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(port); +- +- /* Check if we're the last member to be removed */ +- del = true; +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- mask = QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(i); +- +- if ((reg & mask) != mask) { +- del = false; +- break; +- } +- } +- +- if (del) { +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_PURGE, vid); +- } else { +- ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); +- if (ret) +- goto out; +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); +- } +- +-out: +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static int +-qca8k_mib_init(struct qca8k_priv *priv) +-{ +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, +- QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, +- FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_FLUSH) | +- QCA8K_MIB_BUSY); +- if (ret) +- goto exit; +- +- ret = qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY); +- if (ret) +- goto exit; +- +- ret = regmap_set_bits(priv->regmap, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP); +- if (ret) +- goto exit; +- +- ret = qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- +-static void +-qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable) +-{ +- u32 mask = QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; +- +- /* Port 0 and 6 have no internal PHY */ +- if (port > 0 && port < 6) +- mask |= QCA8K_PORT_STATUS_LINK_AUTO; +- +- if (enable) +- regmap_set_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); +- else +- regmap_clear_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); +-} +- +-static int +-qca8k_phy_eth_busy_wait(struct qca8k_mgmt_eth_data *mgmt_eth_data, +- struct sk_buff *read_skb, u32 *val) +-{ +- struct sk_buff *skb = skb_copy(read_skb, GFP_KERNEL); +- bool ack; +- int ret; +- +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the copy pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(skb); +- +- ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- QCA8K_ETHERNET_TIMEOUT); +- +- ack = mgmt_eth_data->ack; +- +- if (ret <= 0) +- return -ETIMEDOUT; +- +- if (!ack) +- return -EINVAL; +- +- *val = mgmt_eth_data->data[0]; +- +- return 0; +-} +- +-static int +-qca8k_phy_eth_command(struct qca8k_priv *priv, bool read, int phy, +- int regnum, u16 data) +-{ +- struct sk_buff *write_skb, *clear_skb, *read_skb; +- struct qca8k_mgmt_eth_data *mgmt_eth_data; +- u32 write_val, clear_val = 0, val; +- struct net_device *mgmt_master; +- int ret, ret1; +- bool ack; +- +- if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) +- return -EINVAL; +- +- mgmt_eth_data = &priv->mgmt_eth_data; +- +- write_val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | +- QCA8K_MDIO_MASTER_PHY_ADDR(phy) | +- QCA8K_MDIO_MASTER_REG_ADDR(regnum); +- +- if (read) { +- write_val |= QCA8K_MDIO_MASTER_READ; +- } else { +- write_val |= QCA8K_MDIO_MASTER_WRITE; +- write_val |= QCA8K_MDIO_MASTER_DATA(data); +- } +- +- /* Prealloc all the needed skb before the lock */ +- write_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &write_val, +- QCA8K_ETHERNET_PHY_PRIORITY, sizeof(write_val)); +- if (!write_skb) +- return -ENOMEM; +- +- clear_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &clear_val, +- QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); +- if (!clear_skb) { +- ret = -ENOMEM; +- goto err_clear_skb; +- } +- +- read_skb = qca8k_alloc_mdio_header(MDIO_READ, QCA8K_MDIO_MASTER_CTRL, &clear_val, +- QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); +- if (!read_skb) { +- ret = -ENOMEM; +- goto err_read_skb; +- } +- +- /* Actually start the request: +- * 1. Send mdio master packet +- * 2. Busy Wait for mdio master command +- * 3. Get the data if we are reading +- * 4. Reset the mdio master (even with error) +- */ +- mutex_lock(&mgmt_eth_data->mutex); +- +- /* Check if mgmt_master is operational */ +- mgmt_master = priv->mgmt_master; +- if (!mgmt_master) { +- mutex_unlock(&mgmt_eth_data->mutex); +- ret = -EINVAL; +- goto err_mgmt_master; +- } +- +- read_skb->dev = mgmt_master; +- clear_skb->dev = mgmt_master; +- write_skb->dev = mgmt_master; +- +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the write pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(write_skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(write_skb); +- +- ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- QCA8K_ETHERNET_TIMEOUT); +- +- ack = mgmt_eth_data->ack; +- +- if (ret <= 0) { +- ret = -ETIMEDOUT; +- kfree_skb(read_skb); +- goto exit; +- } +- +- if (!ack) { +- ret = -EINVAL; +- kfree_skb(read_skb); +- goto exit; +- } +- +- ret = read_poll_timeout(qca8k_phy_eth_busy_wait, ret1, +- !(val & QCA8K_MDIO_MASTER_BUSY), 0, +- QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, +- mgmt_eth_data, read_skb, &val); +- +- if (ret < 0 && ret1 < 0) { +- ret = ret1; +- goto exit; +- } +- +- if (read) { +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the read pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(read_skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(read_skb); +- +- ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- QCA8K_ETHERNET_TIMEOUT); +- +- ack = mgmt_eth_data->ack; +- +- if (ret <= 0) { +- ret = -ETIMEDOUT; +- goto exit; +- } +- +- if (!ack) { +- ret = -EINVAL; +- goto exit; +- } +- +- ret = mgmt_eth_data->data[0] & QCA8K_MDIO_MASTER_DATA_MASK; +- } else { +- kfree_skb(read_skb); +- } +-exit: +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the clear pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(clear_skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(clear_skb); +- +- wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- QCA8K_ETHERNET_TIMEOUT); +- +- mutex_unlock(&mgmt_eth_data->mutex); +- +- return ret; +- +- /* Error handling before lock */ +-err_mgmt_master: +- kfree_skb(read_skb); +-err_read_skb: +- kfree_skb(clear_skb); +-err_clear_skb: +- kfree_skb(write_skb); +- +- return ret; +-} +- +-static u32 +-qca8k_port_to_phy(int port) +-{ +- /* From Andrew Lunn: +- * Port 0 has no internal phy. +- * Port 1 has an internal PHY at MDIO address 0. +- * Port 2 has an internal PHY at MDIO address 1. +- * ... +- * Port 5 has an internal PHY at MDIO address 4. +- * Port 6 has no internal PHY. +- */ +- +- return port - 1; +-} +- +-static int +-qca8k_mdio_busy_wait(struct mii_bus *bus, u32 reg, u32 mask) +-{ +- u16 r1, r2, page; +- u32 val; +- int ret, ret1; +- +- qca8k_split_addr(reg, &r1, &r2, &page); +- +- ret = read_poll_timeout(qca8k_mii_read32, ret1, !(val & mask), 0, +- QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, +- bus, 0x10 | r2, r1, &val); +- +- /* Check if qca8k_read has failed for a different reason +- * before returnting -ETIMEDOUT +- */ +- if (ret < 0 && ret1 < 0) +- return ret1; +- +- return ret; +-} +- +-static int +-qca8k_mdio_write(struct qca8k_priv *priv, int phy, int regnum, u16 data) +-{ +- struct mii_bus *bus = priv->bus; +- u16 r1, r2, page; +- u32 val; +- int ret; +- +- if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) +- return -EINVAL; +- +- val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | +- QCA8K_MDIO_MASTER_WRITE | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | +- QCA8K_MDIO_MASTER_REG_ADDR(regnum) | +- QCA8K_MDIO_MASTER_DATA(data); +- +- qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +- +- ret = qca8k_set_page(priv, page); +- if (ret) +- goto exit; +- +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); +- +- ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, +- QCA8K_MDIO_MASTER_BUSY); +- +-exit: +- /* even if the busy_wait timeouts try to clear the MASTER_EN */ +- qca8k_mii_write32(priv, 0x10 | r2, r1, 0); +- +- mutex_unlock(&bus->mdio_lock); +- +- return ret; +-} +- +-static int +-qca8k_mdio_read(struct qca8k_priv *priv, int phy, int regnum) +-{ +- struct mii_bus *bus = priv->bus; +- u16 r1, r2, page; +- u32 val; +- int ret; +- +- if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) +- return -EINVAL; +- +- val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | +- QCA8K_MDIO_MASTER_READ | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | +- QCA8K_MDIO_MASTER_REG_ADDR(regnum); +- +- qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +- +- ret = qca8k_set_page(priv, page); +- if (ret) +- goto exit; +- +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); +- +- ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, +- QCA8K_MDIO_MASTER_BUSY); +- if (ret) +- goto exit; +- +- ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); +- +-exit: +- /* even if the busy_wait timeouts try to clear the MASTER_EN */ +- qca8k_mii_write32(priv, 0x10 | r2, r1, 0); +- +- mutex_unlock(&bus->mdio_lock); +- +- if (ret >= 0) +- ret = val & QCA8K_MDIO_MASTER_DATA_MASK; +- +- return ret; +-} +- +-static int +-qca8k_internal_mdio_write(struct mii_bus *slave_bus, int phy, int regnum, u16 data) +-{ +- struct qca8k_priv *priv = slave_bus->priv; +- int ret; +- +- /* Use mdio Ethernet when available, fallback to legacy one on error */ +- ret = qca8k_phy_eth_command(priv, false, phy, regnum, data); +- if (!ret) +- return 0; +- +- return qca8k_mdio_write(priv, phy, regnum, data); +-} +- +-static int +-qca8k_internal_mdio_read(struct mii_bus *slave_bus, int phy, int regnum) +-{ +- struct qca8k_priv *priv = slave_bus->priv; +- int ret; +- +- /* Use mdio Ethernet when available, fallback to legacy one on error */ +- ret = qca8k_phy_eth_command(priv, true, phy, regnum, 0); +- if (ret >= 0) +- return ret; +- +- ret = qca8k_mdio_read(priv, phy, regnum); +- +- if (ret < 0) +- return 0xffff; +- +- return ret; +-} +- +-static int +-qca8k_legacy_mdio_write(struct mii_bus *slave_bus, int port, int regnum, u16 data) +-{ +- port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; +- +- return qca8k_internal_mdio_write(slave_bus, port, regnum, data); +-} +- +-static int +-qca8k_legacy_mdio_read(struct mii_bus *slave_bus, int port, int regnum) +-{ +- port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; +- +- return qca8k_internal_mdio_read(slave_bus, port, regnum); +-} +- +-static int +-qca8k_mdio_register(struct qca8k_priv *priv) +-{ +- struct dsa_switch *ds = priv->ds; +- struct device_node *mdio; +- struct mii_bus *bus; +- +- bus = devm_mdiobus_alloc(ds->dev); +- if (!bus) +- return -ENOMEM; +- +- bus->priv = (void *)priv; +- snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d.%d", +- ds->dst->index, ds->index); +- bus->parent = ds->dev; +- bus->phy_mask = ~ds->phys_mii_mask; +- ds->slave_mii_bus = bus; +- +- /* Check if the devicetree declare the port:phy mapping */ +- mdio = of_get_child_by_name(priv->dev->of_node, "mdio"); +- if (of_device_is_available(mdio)) { +- bus->name = "qca8k slave mii"; +- bus->read = qca8k_internal_mdio_read; +- bus->write = qca8k_internal_mdio_write; +- return devm_of_mdiobus_register(priv->dev, bus, mdio); +- } +- +- /* If a mapping can't be found the legacy mapping is used, +- * using the qca8k_port_to_phy function +- */ +- bus->name = "qca8k-legacy slave mii"; +- bus->read = qca8k_legacy_mdio_read; +- bus->write = qca8k_legacy_mdio_write; +- return devm_mdiobus_register(priv->dev, bus); +-} +- +-static int +-qca8k_setup_mdio_bus(struct qca8k_priv *priv) +-{ +- u32 internal_mdio_mask = 0, external_mdio_mask = 0, reg; +- struct device_node *ports, *port; +- phy_interface_t mode; +- int err; +- +- ports = of_get_child_by_name(priv->dev->of_node, "ports"); +- if (!ports) +- ports = of_get_child_by_name(priv->dev->of_node, "ethernet-ports"); +- +- if (!ports) +- return -EINVAL; +- +- for_each_available_child_of_node(ports, port) { +- err = of_property_read_u32(port, "reg", ®); +- if (err) { +- of_node_put(port); +- of_node_put(ports); +- return err; +- } +- +- if (!dsa_is_user_port(priv->ds, reg)) +- continue; +- +- of_get_phy_mode(port, &mode); +- +- if (of_property_read_bool(port, "phy-handle") && +- mode != PHY_INTERFACE_MODE_INTERNAL) +- external_mdio_mask |= BIT(reg); +- else +- internal_mdio_mask |= BIT(reg); +- } +- +- of_node_put(ports); +- if (!external_mdio_mask && !internal_mdio_mask) { +- dev_err(priv->dev, "no PHYs are defined.\n"); +- return -EINVAL; +- } +- +- /* The QCA8K_MDIO_MASTER_EN Bit, which grants access to PHYs through +- * the MDIO_MASTER register also _disconnects_ the external MDC +- * passthrough to the internal PHYs. It's not possible to use both +- * configurations at the same time! +- * +- * Because this came up during the review process: +- * If the external mdio-bus driver is capable magically disabling +- * the QCA8K_MDIO_MASTER_EN and mutex/spin-locking out the qca8k's +- * accessors for the time being, it would be possible to pull this +- * off. +- */ +- if (!!external_mdio_mask && !!internal_mdio_mask) { +- dev_err(priv->dev, "either internal or external mdio bus configuration is supported.\n"); +- return -EINVAL; +- } +- +- if (external_mdio_mask) { +- /* Make sure to disable the internal mdio bus in cases +- * a dt-overlay and driver reload changed the configuration +- */ +- +- return regmap_clear_bits(priv->regmap, QCA8K_MDIO_MASTER_CTRL, +- QCA8K_MDIO_MASTER_EN); +- } +- +- return qca8k_mdio_register(priv); +-} +- +-static int +-qca8k_setup_mac_pwr_sel(struct qca8k_priv *priv) +-{ +- u32 mask = 0; +- int ret = 0; +- +- /* SoC specific settings for ipq8064. +- * If more device require this consider adding +- * a dedicated binding. +- */ +- if (of_machine_is_compatible("qcom,ipq8064")) +- mask |= QCA8K_MAC_PWR_RGMII0_1_8V; +- +- /* SoC specific settings for ipq8065 */ +- if (of_machine_is_compatible("qcom,ipq8065")) +- mask |= QCA8K_MAC_PWR_RGMII1_1_8V; +- +- if (mask) { +- ret = qca8k_rmw(priv, QCA8K_REG_MAC_PWR_SEL, +- QCA8K_MAC_PWR_RGMII0_1_8V | +- QCA8K_MAC_PWR_RGMII1_1_8V, +- mask); +- } +- +- return ret; +-} +- +-static int qca8k_find_cpu_port(struct dsa_switch *ds) +-{ +- struct qca8k_priv *priv = ds->priv; +- +- /* Find the connected cpu port. Valid port are 0 or 6 */ +- if (dsa_is_cpu_port(ds, 0)) +- return 0; +- +- dev_dbg(priv->dev, "port 0 is not the CPU port. Checking port 6"); +- +- if (dsa_is_cpu_port(ds, 6)) +- return 6; +- +- return -EINVAL; +-} +- +-static int +-qca8k_setup_of_pws_reg(struct qca8k_priv *priv) +-{ +- struct device_node *node = priv->dev->of_node; +- const struct qca8k_match_data *data; +- u32 val = 0; +- int ret; +- +- /* QCA8327 require to set to the correct mode. +- * His bigger brother QCA8328 have the 172 pin layout. +- * Should be applied by default but we set this just to make sure. +- */ +- if (priv->switch_id == QCA8K_ID_QCA8327) { +- data = of_device_get_match_data(priv->dev); +- +- /* Set the correct package of 148 pin for QCA8327 */ +- if (data->reduced_package) +- val |= QCA8327_PWS_PACKAGE148_EN; +- +- ret = qca8k_rmw(priv, QCA8K_REG_PWS, QCA8327_PWS_PACKAGE148_EN, +- val); +- if (ret) +- return ret; +- } +- +- if (of_property_read_bool(node, "qca,ignore-power-on-sel")) +- val |= QCA8K_PWS_POWER_ON_SEL; +- +- if (of_property_read_bool(node, "qca,led-open-drain")) { +- if (!(val & QCA8K_PWS_POWER_ON_SEL)) { +- dev_err(priv->dev, "qca,led-open-drain require qca,ignore-power-on-sel to be set."); +- return -EINVAL; +- } +- +- val |= QCA8K_PWS_LED_OPEN_EN_CSR; +- } +- +- return qca8k_rmw(priv, QCA8K_REG_PWS, +- QCA8K_PWS_LED_OPEN_EN_CSR | QCA8K_PWS_POWER_ON_SEL, +- val); +-} +- +-static int +-qca8k_parse_port_config(struct qca8k_priv *priv) +-{ +- int port, cpu_port_index = -1, ret; +- struct device_node *port_dn; +- phy_interface_t mode; +- struct dsa_port *dp; +- u32 delay; +- +- /* We have 2 CPU port. Check them */ +- for (port = 0; port < QCA8K_NUM_PORTS; port++) { +- /* Skip every other port */ +- if (port != 0 && port != 6) +- continue; +- +- dp = dsa_to_port(priv->ds, port); +- port_dn = dp->dn; +- cpu_port_index++; +- +- if (!of_device_is_available(port_dn)) +- continue; +- +- ret = of_get_phy_mode(port_dn, &mode); +- if (ret) +- continue; +- +- switch (mode) { +- case PHY_INTERFACE_MODE_RGMII: +- case PHY_INTERFACE_MODE_RGMII_ID: +- case PHY_INTERFACE_MODE_RGMII_TXID: +- case PHY_INTERFACE_MODE_RGMII_RXID: +- case PHY_INTERFACE_MODE_SGMII: +- delay = 0; +- +- if (!of_property_read_u32(port_dn, "tx-internal-delay-ps", &delay)) +- /* Switch regs accept value in ns, convert ps to ns */ +- delay = delay / 1000; +- else if (mode == PHY_INTERFACE_MODE_RGMII_ID || +- mode == PHY_INTERFACE_MODE_RGMII_TXID) +- delay = 1; +- +- if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK, delay)) { +- dev_err(priv->dev, "rgmii tx delay is limited to a max value of 3ns, setting to the max value"); +- delay = 3; +- } +- +- priv->ports_config.rgmii_tx_delay[cpu_port_index] = delay; +- +- delay = 0; +- +- if (!of_property_read_u32(port_dn, "rx-internal-delay-ps", &delay)) +- /* Switch regs accept value in ns, convert ps to ns */ +- delay = delay / 1000; +- else if (mode == PHY_INTERFACE_MODE_RGMII_ID || +- mode == PHY_INTERFACE_MODE_RGMII_RXID) +- delay = 2; +- +- if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK, delay)) { +- dev_err(priv->dev, "rgmii rx delay is limited to a max value of 3ns, setting to the max value"); +- delay = 3; +- } +- +- priv->ports_config.rgmii_rx_delay[cpu_port_index] = delay; +- +- /* Skip sgmii parsing for rgmii* mode */ +- if (mode == PHY_INTERFACE_MODE_RGMII || +- mode == PHY_INTERFACE_MODE_RGMII_ID || +- mode == PHY_INTERFACE_MODE_RGMII_TXID || +- mode == PHY_INTERFACE_MODE_RGMII_RXID) +- break; +- +- if (of_property_read_bool(port_dn, "qca,sgmii-txclk-falling-edge")) +- priv->ports_config.sgmii_tx_clk_falling_edge = true; +- +- if (of_property_read_bool(port_dn, "qca,sgmii-rxclk-falling-edge")) +- priv->ports_config.sgmii_rx_clk_falling_edge = true; +- +- if (of_property_read_bool(port_dn, "qca,sgmii-enable-pll")) { +- priv->ports_config.sgmii_enable_pll = true; +- +- if (priv->switch_id == QCA8K_ID_QCA8327) { +- dev_err(priv->dev, "SGMII PLL should NOT be enabled for qca8327. Aborting enabling"); +- priv->ports_config.sgmii_enable_pll = false; +- } +- +- if (priv->switch_revision < 2) +- dev_warn(priv->dev, "SGMII PLL should NOT be enabled for qca8337 with revision 2 or more."); +- } +- +- break; +- default: +- continue; +- } +- } +- +- return 0; +-} +- +-static int +-qca8k_setup(struct dsa_switch *ds) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- int cpu_port, ret, i; +- u32 mask; +- +- cpu_port = qca8k_find_cpu_port(ds); +- if (cpu_port < 0) { +- dev_err(priv->dev, "No cpu port configured in both cpu port0 and port6"); +- return cpu_port; +- } +- +- /* Parse CPU port config to be later used in phy_link mac_config */ +- ret = qca8k_parse_port_config(priv); +- if (ret) +- return ret; +- +- ret = qca8k_setup_mdio_bus(priv); +- if (ret) +- return ret; +- +- ret = qca8k_setup_of_pws_reg(priv); +- if (ret) +- return ret; +- +- ret = qca8k_setup_mac_pwr_sel(priv); +- if (ret) +- return ret; +- +- /* Make sure MAC06 is disabled */ +- ret = regmap_clear_bits(priv->regmap, QCA8K_REG_PORT0_PAD_CTRL, +- QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN); +- if (ret) { +- dev_err(priv->dev, "failed disabling MAC06 exchange"); +- return ret; +- } +- +- /* Enable CPU Port */ +- ret = regmap_set_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, +- QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN); +- if (ret) { +- dev_err(priv->dev, "failed enabling CPU port"); +- return ret; +- } +- +- /* Enable MIB counters */ +- ret = qca8k_mib_init(priv); +- if (ret) +- dev_warn(priv->dev, "mib init failed"); +- +- /* Initial setup of all ports */ +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- /* Disable forwarding by default on all ports */ +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), +- QCA8K_PORT_LOOKUP_MEMBER, 0); +- if (ret) +- return ret; +- +- /* Enable QCA header mode on all cpu ports */ +- if (dsa_is_cpu_port(ds, i)) { +- ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(i), +- FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) | +- FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL)); +- if (ret) { +- dev_err(priv->dev, "failed enabling QCA header mode"); +- return ret; +- } +- } +- +- /* Disable MAC by default on all user ports */ +- if (dsa_is_user_port(ds, i)) +- qca8k_port_set_status(priv, i, 0); +- } +- +- /* Forward all unknown frames to CPU port for Linux processing +- * Notice that in multi-cpu config only one port should be set +- * for igmp, unknown, multicast and broadcast packet +- */ +- ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1, +- FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK, BIT(cpu_port)) | +- FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK, BIT(cpu_port)) | +- FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK, BIT(cpu_port)) | +- FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK, BIT(cpu_port))); +- if (ret) +- return ret; +- +- /* Setup connection between CPU port & user ports +- * Configure specific switch configuration for ports +- */ +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- /* CPU port gets connected to all user ports of the switch */ +- if (dsa_is_cpu_port(ds, i)) { +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), +- QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds)); +- if (ret) +- return ret; +- } +- +- /* Individual user ports get connected to CPU port only */ +- if (dsa_is_user_port(ds, i)) { +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), +- QCA8K_PORT_LOOKUP_MEMBER, +- BIT(cpu_port)); +- if (ret) +- return ret; +- +- /* Enable ARP Auto-learning by default */ +- ret = regmap_set_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(i), +- QCA8K_PORT_LOOKUP_LEARN); +- if (ret) +- return ret; +- +- /* For port based vlans to work we need to set the +- * default egress vid +- */ +- ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i), +- QCA8K_EGREES_VLAN_PORT_MASK(i), +- QCA8K_EGREES_VLAN_PORT(i, QCA8K_PORT_VID_DEF)); +- if (ret) +- return ret; +- +- ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i), +- QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) | +- QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF)); +- if (ret) +- return ret; +- } +- +- /* The port 5 of the qca8337 have some problem in flood condition. The +- * original legacy driver had some specific buffer and priority settings +- * for the different port suggested by the QCA switch team. Add this +- * missing settings to improve switch stability under load condition. +- * This problem is limited to qca8337 and other qca8k switch are not affected. +- */ +- if (priv->switch_id == QCA8K_ID_QCA8337) { +- switch (i) { +- /* The 2 CPU port and port 5 requires some different +- * priority than any other ports. +- */ +- case 0: +- case 5: +- case 6: +- mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x4) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x4) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI4(0x6) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI5(0x8) | +- QCA8K_PORT_HOL_CTRL0_EG_PORT(0x1e); +- break; +- default: +- mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x6) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x8) | +- QCA8K_PORT_HOL_CTRL0_EG_PORT(0x19); +- } +- qca8k_write(priv, QCA8K_REG_PORT_HOL_CTRL0(i), mask); +- +- mask = QCA8K_PORT_HOL_CTRL1_ING(0x6) | +- QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | +- QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | +- QCA8K_PORT_HOL_CTRL1_WRED_EN; +- qca8k_rmw(priv, QCA8K_REG_PORT_HOL_CTRL1(i), +- QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK | +- QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | +- QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | +- QCA8K_PORT_HOL_CTRL1_WRED_EN, +- mask); +- } +- } +- +- /* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */ +- if (priv->switch_id == QCA8K_ID_QCA8327) { +- mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) | +- QCA8K_GLOBAL_FC_GOL_XOFF_THRES(496); +- qca8k_rmw(priv, QCA8K_REG_GLOBAL_FC_THRESH, +- QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK | +- QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK, +- mask); +- } +- +- /* Setup our port MTUs to match power on defaults */ +- ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, ETH_FRAME_LEN + ETH_FCS_LEN); +- if (ret) +- dev_warn(priv->dev, "failed setting MTU settings"); +- +- /* Flush the FDB table */ +- qca8k_fdb_flush(priv); +- +- /* We don't have interrupts for link changes, so we need to poll */ +- ds->pcs_poll = true; +- +- /* Set min a max ageing value supported */ +- ds->ageing_time_min = 7000; +- ds->ageing_time_max = 458745000; +- +- /* Set max number of LAGs supported */ +- ds->num_lag_ids = QCA8K_NUM_LAGS; +- +- return 0; +-} +- +-static void +-qca8k_mac_config_setup_internal_delay(struct qca8k_priv *priv, int cpu_port_index, +- u32 reg) +-{ +- u32 delay, val = 0; +- int ret; +- +- /* Delay can be declared in 3 different way. +- * Mode to rgmii and internal-delay standard binding defined +- * rgmii-id or rgmii-tx/rx phy mode set. +- * The parse logic set a delay different than 0 only when one +- * of the 3 different way is used. In all other case delay is +- * not enabled. With ID or TX/RXID delay is enabled and set +- * to the default and recommended value. +- */ +- if (priv->ports_config.rgmii_tx_delay[cpu_port_index]) { +- delay = priv->ports_config.rgmii_tx_delay[cpu_port_index]; +- +- val |= QCA8K_PORT_PAD_RGMII_TX_DELAY(delay) | +- QCA8K_PORT_PAD_RGMII_TX_DELAY_EN; +- } +- +- if (priv->ports_config.rgmii_rx_delay[cpu_port_index]) { +- delay = priv->ports_config.rgmii_rx_delay[cpu_port_index]; +- +- val |= QCA8K_PORT_PAD_RGMII_RX_DELAY(delay) | +- QCA8K_PORT_PAD_RGMII_RX_DELAY_EN; +- } +- +- /* Set RGMII delay based on the selected values */ +- ret = qca8k_rmw(priv, reg, +- QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK | +- QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK | +- QCA8K_PORT_PAD_RGMII_TX_DELAY_EN | +- QCA8K_PORT_PAD_RGMII_RX_DELAY_EN, +- val); +- if (ret) +- dev_err(priv->dev, "Failed to set internal delay for CPU port%d", +- cpu_port_index == QCA8K_CPU_PORT0 ? 0 : 6); +-} +- +-static void +-qca8k_phylink_mac_config(struct dsa_switch *ds, int port, unsigned int mode, +- const struct phylink_link_state *state) +-{ +- struct qca8k_priv *priv = ds->priv; +- int cpu_port_index, ret; +- u32 reg, val; +- +- switch (port) { +- case 0: /* 1st CPU port */ +- if (state->interface != PHY_INTERFACE_MODE_RGMII && +- state->interface != PHY_INTERFACE_MODE_RGMII_ID && +- state->interface != PHY_INTERFACE_MODE_RGMII_TXID && +- state->interface != PHY_INTERFACE_MODE_RGMII_RXID && +- state->interface != PHY_INTERFACE_MODE_SGMII) +- return; +- +- reg = QCA8K_REG_PORT0_PAD_CTRL; +- cpu_port_index = QCA8K_CPU_PORT0; +- break; +- case 1: +- case 2: +- case 3: +- case 4: +- case 5: +- /* Internal PHY, nothing to do */ +- return; +- case 6: /* 2nd CPU port / external PHY */ +- if (state->interface != PHY_INTERFACE_MODE_RGMII && +- state->interface != PHY_INTERFACE_MODE_RGMII_ID && +- state->interface != PHY_INTERFACE_MODE_RGMII_TXID && +- state->interface != PHY_INTERFACE_MODE_RGMII_RXID && +- state->interface != PHY_INTERFACE_MODE_SGMII && +- state->interface != PHY_INTERFACE_MODE_1000BASEX) +- return; +- +- reg = QCA8K_REG_PORT6_PAD_CTRL; +- cpu_port_index = QCA8K_CPU_PORT6; +- break; +- default: +- dev_err(ds->dev, "%s: unsupported port: %i\n", __func__, port); +- return; +- } +- +- if (port != 6 && phylink_autoneg_inband(mode)) { +- dev_err(ds->dev, "%s: in-band negotiation unsupported\n", +- __func__); +- return; +- } +- +- switch (state->interface) { +- case PHY_INTERFACE_MODE_RGMII: +- case PHY_INTERFACE_MODE_RGMII_ID: +- case PHY_INTERFACE_MODE_RGMII_TXID: +- case PHY_INTERFACE_MODE_RGMII_RXID: +- qca8k_write(priv, reg, QCA8K_PORT_PAD_RGMII_EN); +- +- /* Configure rgmii delay */ +- qca8k_mac_config_setup_internal_delay(priv, cpu_port_index, reg); +- +- /* QCA8337 requires to set rgmii rx delay for all ports. +- * This is enabled through PORT5_PAD_CTRL for all ports, +- * rather than individual port registers. +- */ +- if (priv->switch_id == QCA8K_ID_QCA8337) +- qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, +- QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); +- break; +- case PHY_INTERFACE_MODE_SGMII: +- case PHY_INTERFACE_MODE_1000BASEX: +- /* Enable SGMII on the port */ +- qca8k_write(priv, reg, QCA8K_PORT_PAD_SGMII_EN); +- +- /* Enable/disable SerDes auto-negotiation as necessary */ +- ret = qca8k_read(priv, QCA8K_REG_PWS, &val); +- if (ret) +- return; +- if (phylink_autoneg_inband(mode)) +- val &= ~QCA8K_PWS_SERDES_AEN_DIS; +- else +- val |= QCA8K_PWS_SERDES_AEN_DIS; +- qca8k_write(priv, QCA8K_REG_PWS, val); +- +- /* Configure the SGMII parameters */ +- ret = qca8k_read(priv, QCA8K_REG_SGMII_CTRL, &val); +- if (ret) +- return; +- +- val |= QCA8K_SGMII_EN_SD; +- +- if (priv->ports_config.sgmii_enable_pll) +- val |= QCA8K_SGMII_EN_PLL | QCA8K_SGMII_EN_RX | +- QCA8K_SGMII_EN_TX; +- +- if (dsa_is_cpu_port(ds, port)) { +- /* CPU port, we're talking to the CPU MAC, be a PHY */ +- val &= ~QCA8K_SGMII_MODE_CTRL_MASK; +- val |= QCA8K_SGMII_MODE_CTRL_PHY; +- } else if (state->interface == PHY_INTERFACE_MODE_SGMII) { +- val &= ~QCA8K_SGMII_MODE_CTRL_MASK; +- val |= QCA8K_SGMII_MODE_CTRL_MAC; +- } else if (state->interface == PHY_INTERFACE_MODE_1000BASEX) { +- val &= ~QCA8K_SGMII_MODE_CTRL_MASK; +- val |= QCA8K_SGMII_MODE_CTRL_BASEX; +- } +- +- qca8k_write(priv, QCA8K_REG_SGMII_CTRL, val); +- +- /* From original code is reported port instability as SGMII also +- * require delay set. Apply advised values here or take them from DT. +- */ +- if (state->interface == PHY_INTERFACE_MODE_SGMII) +- qca8k_mac_config_setup_internal_delay(priv, cpu_port_index, reg); +- +- /* For qca8327/qca8328/qca8334/qca8338 sgmii is unique and +- * falling edge is set writing in the PORT0 PAD reg +- */ +- if (priv->switch_id == QCA8K_ID_QCA8327 || +- priv->switch_id == QCA8K_ID_QCA8337) +- reg = QCA8K_REG_PORT0_PAD_CTRL; +- +- val = 0; +- +- /* SGMII Clock phase configuration */ +- if (priv->ports_config.sgmii_rx_clk_falling_edge) +- val |= QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE; +- +- if (priv->ports_config.sgmii_tx_clk_falling_edge) +- val |= QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE; +- +- if (val) +- ret = qca8k_rmw(priv, reg, +- QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE | +- QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE, +- val); +- +- break; +- default: +- dev_err(ds->dev, "xMII mode %s not supported for port %d\n", +- phy_modes(state->interface), port); +- return; +- } +-} +- +-static void +-qca8k_phylink_validate(struct dsa_switch *ds, int port, +- unsigned long *supported, +- struct phylink_link_state *state) +-{ +- __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; +- +- switch (port) { +- case 0: /* 1st CPU port */ +- if (state->interface != PHY_INTERFACE_MODE_NA && +- state->interface != PHY_INTERFACE_MODE_RGMII && +- state->interface != PHY_INTERFACE_MODE_RGMII_ID && +- state->interface != PHY_INTERFACE_MODE_RGMII_TXID && +- state->interface != PHY_INTERFACE_MODE_RGMII_RXID && +- state->interface != PHY_INTERFACE_MODE_SGMII) +- goto unsupported; +- break; +- case 1: +- case 2: +- case 3: +- case 4: +- case 5: +- /* Internal PHY */ +- if (state->interface != PHY_INTERFACE_MODE_NA && +- state->interface != PHY_INTERFACE_MODE_GMII && +- state->interface != PHY_INTERFACE_MODE_INTERNAL) +- goto unsupported; +- break; +- case 6: /* 2nd CPU port / external PHY */ +- if (state->interface != PHY_INTERFACE_MODE_NA && +- state->interface != PHY_INTERFACE_MODE_RGMII && +- state->interface != PHY_INTERFACE_MODE_RGMII_ID && +- state->interface != PHY_INTERFACE_MODE_RGMII_TXID && +- state->interface != PHY_INTERFACE_MODE_RGMII_RXID && +- state->interface != PHY_INTERFACE_MODE_SGMII && +- state->interface != PHY_INTERFACE_MODE_1000BASEX) +- goto unsupported; +- break; +- default: +-unsupported: +- linkmode_zero(supported); +- return; +- } +- +- phylink_set_port_modes(mask); +- phylink_set(mask, Autoneg); +- +- phylink_set(mask, 1000baseT_Full); +- phylink_set(mask, 10baseT_Half); +- phylink_set(mask, 10baseT_Full); +- phylink_set(mask, 100baseT_Half); +- phylink_set(mask, 100baseT_Full); +- +- if (state->interface == PHY_INTERFACE_MODE_1000BASEX) +- phylink_set(mask, 1000baseX_Full); +- +- phylink_set(mask, Pause); +- phylink_set(mask, Asym_Pause); +- +- linkmode_and(supported, supported, mask); +- linkmode_and(state->advertising, state->advertising, mask); +-} +- +-static int +-qca8k_phylink_mac_link_state(struct dsa_switch *ds, int port, +- struct phylink_link_state *state) +-{ +- struct qca8k_priv *priv = ds->priv; +- u32 reg; +- int ret; +- +- ret = qca8k_read(priv, QCA8K_REG_PORT_STATUS(port), ®); +- if (ret < 0) +- return ret; +- +- state->link = !!(reg & QCA8K_PORT_STATUS_LINK_UP); +- state->an_complete = state->link; +- state->an_enabled = !!(reg & QCA8K_PORT_STATUS_LINK_AUTO); +- state->duplex = (reg & QCA8K_PORT_STATUS_DUPLEX) ? DUPLEX_FULL : +- DUPLEX_HALF; +- +- switch (reg & QCA8K_PORT_STATUS_SPEED) { +- case QCA8K_PORT_STATUS_SPEED_10: +- state->speed = SPEED_10; +- break; +- case QCA8K_PORT_STATUS_SPEED_100: +- state->speed = SPEED_100; +- break; +- case QCA8K_PORT_STATUS_SPEED_1000: +- state->speed = SPEED_1000; +- break; +- default: +- state->speed = SPEED_UNKNOWN; +- break; +- } +- +- state->pause = MLO_PAUSE_NONE; +- if (reg & QCA8K_PORT_STATUS_RXFLOW) +- state->pause |= MLO_PAUSE_RX; +- if (reg & QCA8K_PORT_STATUS_TXFLOW) +- state->pause |= MLO_PAUSE_TX; +- +- return 1; +-} +- +-static void +-qca8k_phylink_mac_link_down(struct dsa_switch *ds, int port, unsigned int mode, +- phy_interface_t interface) +-{ +- struct qca8k_priv *priv = ds->priv; +- +- qca8k_port_set_status(priv, port, 0); +-} +- +-static void +-qca8k_phylink_mac_link_up(struct dsa_switch *ds, int port, unsigned int mode, +- phy_interface_t interface, struct phy_device *phydev, +- int speed, int duplex, bool tx_pause, bool rx_pause) +-{ +- struct qca8k_priv *priv = ds->priv; +- u32 reg; +- +- if (phylink_autoneg_inband(mode)) { +- reg = QCA8K_PORT_STATUS_LINK_AUTO; +- } else { +- switch (speed) { +- case SPEED_10: +- reg = QCA8K_PORT_STATUS_SPEED_10; +- break; +- case SPEED_100: +- reg = QCA8K_PORT_STATUS_SPEED_100; +- break; +- case SPEED_1000: +- reg = QCA8K_PORT_STATUS_SPEED_1000; +- break; +- default: +- reg = QCA8K_PORT_STATUS_LINK_AUTO; +- break; +- } +- +- if (duplex == DUPLEX_FULL) +- reg |= QCA8K_PORT_STATUS_DUPLEX; +- +- if (rx_pause || dsa_is_cpu_port(ds, port)) +- reg |= QCA8K_PORT_STATUS_RXFLOW; +- +- if (tx_pause || dsa_is_cpu_port(ds, port)) +- reg |= QCA8K_PORT_STATUS_TXFLOW; +- } +- +- reg |= QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; +- +- qca8k_write(priv, QCA8K_REG_PORT_STATUS(port), reg); +-} +- +-static void +-qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data) +-{ +- const struct qca8k_match_data *match_data; +- struct qca8k_priv *priv = ds->priv; +- int i; +- +- if (stringset != ETH_SS_STATS) +- return; +- +- match_data = of_device_get_match_data(priv->dev); +- +- for (i = 0; i < match_data->mib_count; i++) +- strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, +- ETH_GSTRING_LEN); +-} +- +-static void qca8k_mib_autocast_handler(struct dsa_switch *ds, struct sk_buff *skb) +-{ +- const struct qca8k_match_data *match_data; +- struct qca8k_mib_eth_data *mib_eth_data; +- struct qca8k_priv *priv = ds->priv; +- const struct qca8k_mib_desc *mib; +- struct mib_ethhdr *mib_ethhdr; +- int i, mib_len, offset = 0; +- u64 *data; +- u8 port; +- +- mib_ethhdr = (struct mib_ethhdr *)skb_mac_header(skb); +- mib_eth_data = &priv->mib_eth_data; +- +- /* The switch autocast every port. Ignore other packet and +- * parse only the requested one. +- */ +- port = FIELD_GET(QCA_HDR_RECV_SOURCE_PORT, ntohs(mib_ethhdr->hdr)); +- if (port != mib_eth_data->req_port) +- goto exit; +- +- match_data = device_get_match_data(priv->dev); +- data = mib_eth_data->data; +- +- for (i = 0; i < match_data->mib_count; i++) { +- mib = &ar8327_mib[i]; +- +- /* First 3 mib are present in the skb head */ +- if (i < 3) { +- data[i] = mib_ethhdr->data[i]; +- continue; +- } +- +- mib_len = sizeof(uint32_t); +- +- /* Some mib are 64 bit wide */ +- if (mib->size == 2) +- mib_len = sizeof(uint64_t); +- +- /* Copy the mib value from packet to the */ +- memcpy(data + i, skb->data + offset, mib_len); +- +- /* Set the offset for the next mib */ +- offset += mib_len; +- } +- +-exit: +- /* Complete on receiving all the mib packet */ +- if (refcount_dec_and_test(&mib_eth_data->port_parsed)) +- complete(&mib_eth_data->rw_done); +-} +- +-static int +-qca8k_get_ethtool_stats_eth(struct dsa_switch *ds, int port, u64 *data) +-{ +- struct dsa_port *dp = dsa_to_port(ds, port); +- struct qca8k_mib_eth_data *mib_eth_data; +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- mib_eth_data = &priv->mib_eth_data; +- +- mutex_lock(&mib_eth_data->mutex); +- +- reinit_completion(&mib_eth_data->rw_done); +- +- mib_eth_data->req_port = dp->index; +- mib_eth_data->data = data; +- refcount_set(&mib_eth_data->port_parsed, QCA8K_NUM_PORTS); +- +- mutex_lock(&priv->reg_mutex); +- +- /* Send mib autocast request */ +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, +- QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, +- FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_CAST) | +- QCA8K_MIB_BUSY); +- +- mutex_unlock(&priv->reg_mutex); +- +- if (ret) +- goto exit; +- +- ret = wait_for_completion_timeout(&mib_eth_data->rw_done, QCA8K_ETHERNET_TIMEOUT); +- +-exit: +- mutex_unlock(&mib_eth_data->mutex); +- +- return ret; +-} +- +-static void +-qca8k_get_ethtool_stats(struct dsa_switch *ds, int port, +- uint64_t *data) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- const struct qca8k_match_data *match_data; +- const struct qca8k_mib_desc *mib; +- u32 reg, i, val; +- u32 hi = 0; +- int ret; +- +- if (priv->mgmt_master && +- qca8k_get_ethtool_stats_eth(ds, port, data) > 0) +- return; +- +- match_data = of_device_get_match_data(priv->dev); +- +- for (i = 0; i < match_data->mib_count; i++) { +- mib = &ar8327_mib[i]; +- reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; +- +- ret = qca8k_read(priv, reg, &val); +- if (ret < 0) +- continue; +- +- if (mib->size == 2) { +- ret = qca8k_read(priv, reg + 4, &hi); +- if (ret < 0) +- continue; +- } +- +- data[i] = val; +- if (mib->size == 2) +- data[i] |= (u64)hi << 32; +- } +-} +- +-static int +-qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset) +-{ +- const struct qca8k_match_data *match_data; +- struct qca8k_priv *priv = ds->priv; +- +- if (sset != ETH_SS_STATS) +- return 0; +- +- match_data = of_device_get_match_data(priv->dev); +- +- return match_data->mib_count; +-} +- +-static int +-qca8k_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *eee) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u32 lpi_en = QCA8K_REG_EEE_CTRL_LPI_EN(port); +- u32 reg; +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- ret = qca8k_read(priv, QCA8K_REG_EEE_CTRL, ®); +- if (ret < 0) +- goto exit; +- +- if (eee->eee_enabled) +- reg |= lpi_en; +- else +- reg &= ~lpi_en; +- ret = qca8k_write(priv, QCA8K_REG_EEE_CTRL, reg); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- +-static int +-qca8k_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e) +-{ +- /* Nothing to do on the port's MAC */ +- return 0; +-} +- +-static void +-qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u32 stp_state; +- +- switch (state) { +- case BR_STATE_DISABLED: +- stp_state = QCA8K_PORT_LOOKUP_STATE_DISABLED; +- break; +- case BR_STATE_BLOCKING: +- stp_state = QCA8K_PORT_LOOKUP_STATE_BLOCKING; +- break; +- case BR_STATE_LISTENING: +- stp_state = QCA8K_PORT_LOOKUP_STATE_LISTENING; +- break; +- case BR_STATE_LEARNING: +- stp_state = QCA8K_PORT_LOOKUP_STATE_LEARNING; +- break; +- case BR_STATE_FORWARDING: +- default: +- stp_state = QCA8K_PORT_LOOKUP_STATE_FORWARD; +- break; +- } +- +- qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_STATE_MASK, stp_state); +-} +- +-static int +-qca8k_port_bridge_join(struct dsa_switch *ds, int port, struct net_device *br) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- int port_mask, cpu_port; +- int i, ret; +- +- cpu_port = dsa_to_port(ds, port)->cpu_dp->index; +- port_mask = BIT(cpu_port); +- +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- if (dsa_is_cpu_port(ds, i)) +- continue; +- if (dsa_to_port(ds, i)->bridge_dev != br) +- continue; +- /* Add this port to the portvlan mask of the other ports +- * in the bridge +- */ +- ret = regmap_set_bits(priv->regmap, +- QCA8K_PORT_LOOKUP_CTRL(i), +- BIT(port)); +- if (ret) +- return ret; +- if (i != port) +- port_mask |= BIT(i); +- } +- +- /* Add all other ports to this ports portvlan mask */ +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_MEMBER, port_mask); +- +- return ret; +-} +- +-static void +-qca8k_port_bridge_leave(struct dsa_switch *ds, int port, struct net_device *br) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- int cpu_port, i; +- +- cpu_port = dsa_to_port(ds, port)->cpu_dp->index; +- +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- if (dsa_is_cpu_port(ds, i)) +- continue; +- if (dsa_to_port(ds, i)->bridge_dev != br) +- continue; +- /* Remove this port to the portvlan mask of the other ports +- * in the bridge +- */ +- regmap_clear_bits(priv->regmap, +- QCA8K_PORT_LOOKUP_CTRL(i), +- BIT(port)); +- } +- +- /* Set the cpu port to be the only one in the portvlan mask of +- * this port +- */ +- qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port)); +-} +- +-static void +-qca8k_port_fast_age(struct dsa_switch *ds, int port) +-{ +- struct qca8k_priv *priv = ds->priv; +- +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_access(priv, QCA8K_FDB_FLUSH_PORT, port); +- mutex_unlock(&priv->reg_mutex); +-} +- +-static int +-qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs) +-{ +- struct qca8k_priv *priv = ds->priv; +- unsigned int secs = msecs / 1000; +- u32 val; +- +- /* AGE_TIME reg is set in 7s step */ +- val = secs / 7; +- +- /* Handle case with 0 as val to NOT disable +- * learning +- */ +- if (!val) +- val = 1; +- +- return regmap_update_bits(priv->regmap, QCA8K_REG_ATU_CTRL, QCA8K_ATU_AGE_TIME_MASK, +- QCA8K_ATU_AGE_TIME(val)); +-} +- +-static int +-qca8k_port_enable(struct dsa_switch *ds, int port, +- struct phy_device *phy) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- +- qca8k_port_set_status(priv, port, 1); +- priv->port_enabled_map |= BIT(port); +- +- if (dsa_is_user_port(ds, port)) +- phy_support_asym_pause(phy); +- +- return 0; +-} +- +-static void +-qca8k_port_disable(struct dsa_switch *ds, int port) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- +- qca8k_port_set_status(priv, port, 0); +- priv->port_enabled_map &= ~BIT(port); +-} +- +-static int +-qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- /* We have only have a general MTU setting. +- * DSA always set the CPU port's MTU to the largest MTU of the slave +- * ports. +- * Setting MTU just for the CPU port is sufficient to correctly set a +- * value for every port. +- */ +- if (!dsa_is_cpu_port(ds, port)) +- return 0; +- +- /* To change the MAX_FRAME_SIZE the cpu ports must be off or +- * the switch panics. +- * Turn off both cpu ports before applying the new value to prevent +- * this. +- */ +- if (priv->port_enabled_map & BIT(0)) +- qca8k_port_set_status(priv, 0, 0); +- +- if (priv->port_enabled_map & BIT(6)) +- qca8k_port_set_status(priv, 6, 0); +- +- /* Include L2 header / FCS length */ +- ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ETH_HLEN + ETH_FCS_LEN); +- +- if (priv->port_enabled_map & BIT(0)) +- qca8k_port_set_status(priv, 0, 1); +- +- if (priv->port_enabled_map & BIT(6)) +- qca8k_port_set_status(priv, 6, 1); +- +- return ret; +-} +- +-static int +-qca8k_port_max_mtu(struct dsa_switch *ds, int port) +-{ +- return QCA8K_MAX_MTU; +-} +- +-static int +-qca8k_port_fdb_insert(struct qca8k_priv *priv, const u8 *addr, +- u16 port_mask, u16 vid) +-{ +- /* Set the vid to the port vlan id if no vid is set */ +- if (!vid) +- vid = QCA8K_PORT_VID_DEF; +- +- return qca8k_fdb_add(priv, addr, port_mask, vid, +- QCA8K_ATU_STATUS_STATIC); +-} +- +-static int +-qca8k_port_fdb_add(struct dsa_switch *ds, int port, +- const unsigned char *addr, u16 vid) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u16 port_mask = BIT(port); +- +- return qca8k_port_fdb_insert(priv, addr, port_mask, vid); +-} +- +-static int +-qca8k_port_fdb_del(struct dsa_switch *ds, int port, +- const unsigned char *addr, u16 vid) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u16 port_mask = BIT(port); +- +- if (!vid) +- vid = QCA8K_PORT_VID_DEF; +- +- return qca8k_fdb_del(priv, addr, port_mask, vid); +-} +- +-static int +-qca8k_port_fdb_dump(struct dsa_switch *ds, int port, +- dsa_fdb_dump_cb_t *cb, void *data) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- struct qca8k_fdb _fdb = { 0 }; +- int cnt = QCA8K_NUM_FDB_RECORDS; +- bool is_static; +- int ret = 0; +- +- mutex_lock(&priv->reg_mutex); +- while (cnt-- && !qca8k_fdb_next(priv, &_fdb, port)) { +- if (!_fdb.aging) +- break; +- is_static = (_fdb.aging == QCA8K_ATU_STATUS_STATIC); +- ret = cb(_fdb.mac, _fdb.vid, is_static, data); +- if (ret) +- break; +- } +- mutex_unlock(&priv->reg_mutex); +- +- return 0; +-} +- +-static int +-qca8k_port_mdb_add(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_mdb *mdb) +-{ +- struct qca8k_priv *priv = ds->priv; +- const u8 *addr = mdb->addr; +- u16 vid = mdb->vid; +- +- return qca8k_fdb_search_and_insert(priv, BIT(port), addr, vid); +-} +- +-static int +-qca8k_port_mdb_del(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_mdb *mdb) +-{ +- struct qca8k_priv *priv = ds->priv; +- const u8 *addr = mdb->addr; +- u16 vid = mdb->vid; +- +- return qca8k_fdb_search_and_del(priv, BIT(port), addr, vid); +-} +- +-static int +-qca8k_port_mirror_add(struct dsa_switch *ds, int port, +- struct dsa_mall_mirror_tc_entry *mirror, +- bool ingress) +-{ +- struct qca8k_priv *priv = ds->priv; +- int monitor_port, ret; +- u32 reg, val; +- +- /* Check for existent entry */ +- if ((ingress ? priv->mirror_rx : priv->mirror_tx) & BIT(port)) +- return -EEXIST; +- +- ret = regmap_read(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, &val); +- if (ret) +- return ret; +- +- /* QCA83xx can have only one port set to mirror mode. +- * Check that the correct port is requested and return error otherwise. +- * When no mirror port is set, the values is set to 0xF +- */ +- monitor_port = FIELD_GET(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); +- if (monitor_port != 0xF && monitor_port != mirror->to_local_port) +- return -EEXIST; +- +- /* Set the monitor port */ +- val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, +- mirror->to_local_port); +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, +- QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); +- if (ret) +- return ret; +- +- if (ingress) { +- reg = QCA8K_PORT_LOOKUP_CTRL(port); +- val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; +- } else { +- reg = QCA8K_REG_PORT_HOL_CTRL1(port); +- val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; +- } +- +- ret = regmap_update_bits(priv->regmap, reg, val, val); +- if (ret) +- return ret; +- +- /* Track mirror port for tx and rx to decide when the +- * mirror port has to be disabled. +- */ +- if (ingress) +- priv->mirror_rx |= BIT(port); +- else +- priv->mirror_tx |= BIT(port); +- +- return 0; +-} +- +-static void +-qca8k_port_mirror_del(struct dsa_switch *ds, int port, +- struct dsa_mall_mirror_tc_entry *mirror) +-{ +- struct qca8k_priv *priv = ds->priv; +- u32 reg, val; +- int ret; +- +- if (mirror->ingress) { +- reg = QCA8K_PORT_LOOKUP_CTRL(port); +- val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; +- } else { +- reg = QCA8K_REG_PORT_HOL_CTRL1(port); +- val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; +- } +- +- ret = regmap_clear_bits(priv->regmap, reg, val); +- if (ret) +- goto err; +- +- if (mirror->ingress) +- priv->mirror_rx &= ~BIT(port); +- else +- priv->mirror_tx &= ~BIT(port); +- +- /* No port set to send packet to mirror port. Disable mirror port */ +- if (!priv->mirror_rx && !priv->mirror_tx) { +- val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, 0xF); +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, +- QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); +- if (ret) +- goto err; +- } +-err: +- dev_err(priv->dev, "Failed to del mirror port from %d", port); +-} +- +-static int +-qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, +- struct netlink_ext_ack *extack) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- if (vlan_filtering) { +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, +- QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE); +- } else { +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, +- QCA8K_PORT_LOOKUP_VLAN_MODE_NONE); +- } +- +- return ret; +-} +- +-static int +-qca8k_port_vlan_add(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_vlan *vlan, +- struct netlink_ext_ack *extack) +-{ +- bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; +- bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID; +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- ret = qca8k_vlan_add(priv, port, vlan->vid, untagged); +- if (ret) { +- dev_err(priv->dev, "Failed to add VLAN to port %d (%d)", port, ret); +- return ret; +- } +- +- if (pvid) { +- ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port), +- QCA8K_EGREES_VLAN_PORT_MASK(port), +- QCA8K_EGREES_VLAN_PORT(port, vlan->vid)); +- if (ret) +- return ret; +- +- ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port), +- QCA8K_PORT_VLAN_CVID(vlan->vid) | +- QCA8K_PORT_VLAN_SVID(vlan->vid)); +- } +- +- return ret; +-} +- +-static int +-qca8k_port_vlan_del(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_vlan *vlan) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- ret = qca8k_vlan_del(priv, port, vlan->vid); +- if (ret) +- dev_err(priv->dev, "Failed to delete VLAN from port %d (%d)", port, ret); +- +- return ret; +-} +- +-static u32 qca8k_get_phy_flags(struct dsa_switch *ds, int port) +-{ +- struct qca8k_priv *priv = ds->priv; +- +- /* Communicate to the phy internal driver the switch revision. +- * Based on the switch revision different values needs to be +- * set to the dbg and mmd reg on the phy. +- * The first 2 bit are used to communicate the switch revision +- * to the phy driver. +- */ +- if (port > 0 && port < 6) +- return priv->switch_revision; +- +- return 0; +-} +- +-static enum dsa_tag_protocol +-qca8k_get_tag_protocol(struct dsa_switch *ds, int port, +- enum dsa_tag_protocol mp) +-{ +- return DSA_TAG_PROTO_QCA; +-} +- +-static bool +-qca8k_lag_can_offload(struct dsa_switch *ds, +- struct net_device *lag, +- struct netdev_lag_upper_info *info) +-{ +- struct dsa_port *dp; +- int id, members = 0; +- +- id = dsa_lag_id(ds->dst, lag); +- if (id < 0 || id >= ds->num_lag_ids) +- return false; +- +- dsa_lag_foreach_port(dp, ds->dst, lag) +- /* Includes the port joining the LAG */ +- members++; +- +- if (members > QCA8K_NUM_PORTS_FOR_LAG) +- return false; +- +- if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) +- return false; +- +- if (info->hash_type != NETDEV_LAG_HASH_L2 && +- info->hash_type != NETDEV_LAG_HASH_L23) +- return false; +- +- return true; +-} +- +-static int +-qca8k_lag_setup_hash(struct dsa_switch *ds, +- struct net_device *lag, +- struct netdev_lag_upper_info *info) +-{ +- struct qca8k_priv *priv = ds->priv; +- bool unique_lag = true; +- u32 hash = 0; +- int i, id; +- +- id = dsa_lag_id(ds->dst, lag); +- +- switch (info->hash_type) { +- case NETDEV_LAG_HASH_L23: +- hash |= QCA8K_TRUNK_HASH_SIP_EN; +- hash |= QCA8K_TRUNK_HASH_DIP_EN; +- fallthrough; +- case NETDEV_LAG_HASH_L2: +- hash |= QCA8K_TRUNK_HASH_SA_EN; +- hash |= QCA8K_TRUNK_HASH_DA_EN; +- break; +- default: /* We should NEVER reach this */ +- return -EOPNOTSUPP; +- } +- +- /* Check if we are the unique configured LAG */ +- dsa_lags_foreach_id(i, ds->dst) +- if (i != id && dsa_lag_dev(ds->dst, i)) { +- unique_lag = false; +- break; +- } +- +- /* Hash Mode is global. Make sure the same Hash Mode +- * is set to all the 4 possible lag. +- * If we are the unique LAG we can set whatever hash +- * mode we want. +- * To change hash mode it's needed to remove all LAG +- * and change the mode with the latest. +- */ +- if (unique_lag) { +- priv->lag_hash_mode = hash; +- } else if (priv->lag_hash_mode != hash) { +- netdev_err(lag, "Error: Mismateched Hash Mode across different lag is not supported\n"); +- return -EOPNOTSUPP; +- } +- +- return regmap_update_bits(priv->regmap, QCA8K_TRUNK_HASH_EN_CTRL, +- QCA8K_TRUNK_HASH_MASK, hash); +-} +- +-static int +-qca8k_lag_refresh_portmap(struct dsa_switch *ds, int port, +- struct net_device *lag, bool delete) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret, id, i; +- u32 val; +- +- id = dsa_lag_id(ds->dst, lag); +- +- /* Read current port member */ +- ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, &val); +- if (ret) +- return ret; +- +- /* Shift val to the correct trunk */ +- val >>= QCA8K_REG_GOL_TRUNK_SHIFT(id); +- val &= QCA8K_REG_GOL_TRUNK_MEMBER_MASK; +- if (delete) +- val &= ~BIT(port); +- else +- val |= BIT(port); +- +- /* Update port member. With empty portmap disable trunk */ +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, +- QCA8K_REG_GOL_TRUNK_MEMBER(id) | +- QCA8K_REG_GOL_TRUNK_EN(id), +- !val << QCA8K_REG_GOL_TRUNK_SHIFT(id) | +- val << QCA8K_REG_GOL_TRUNK_SHIFT(id)); +- +- /* Search empty member if adding or port on deleting */ +- for (i = 0; i < QCA8K_NUM_PORTS_FOR_LAG; i++) { +- ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), &val); +- if (ret) +- return ret; +- +- val >>= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i); +- val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_MASK; +- +- if (delete) { +- /* If port flagged to be disabled assume this member is +- * empty +- */ +- if (val != QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) +- continue; +- +- val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK; +- if (val != port) +- continue; +- } else { +- /* If port flagged to be enabled assume this member is +- * already set +- */ +- if (val == QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) +- continue; +- } +- +- /* We have found the member to add/remove */ +- break; +- } +- +- /* Set port in the correct port mask or disable port if in delete mode */ +- return regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), +- QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN(id, i) | +- QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT(id, i), +- !delete << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i) | +- port << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i)); +-} +- +-static int +-qca8k_port_lag_join(struct dsa_switch *ds, int port, +- struct net_device *lag, +- struct netdev_lag_upper_info *info) +-{ +- int ret; +- +- if (!qca8k_lag_can_offload(ds, lag, info)) +- return -EOPNOTSUPP; +- +- ret = qca8k_lag_setup_hash(ds, lag, info); +- if (ret) +- return ret; +- +- return qca8k_lag_refresh_portmap(ds, port, lag, false); +-} +- +-static int +-qca8k_port_lag_leave(struct dsa_switch *ds, int port, +- struct net_device *lag) +-{ +- return qca8k_lag_refresh_portmap(ds, port, lag, true); +-} +- +-static void +-qca8k_master_change(struct dsa_switch *ds, const struct net_device *master, +- bool operational) +-{ +- struct dsa_port *dp = master->dsa_ptr; +- struct qca8k_priv *priv = ds->priv; +- +- /* Ethernet MIB/MDIO is only supported for CPU port 0 */ +- if (dp->index != 0) +- return; +- +- mutex_lock(&priv->mgmt_eth_data.mutex); +- mutex_lock(&priv->mib_eth_data.mutex); +- +- priv->mgmt_master = operational ? (struct net_device *)master : NULL; +- +- mutex_unlock(&priv->mib_eth_data.mutex); +- mutex_unlock(&priv->mgmt_eth_data.mutex); +-} +- +-static int qca8k_connect_tag_protocol(struct dsa_switch *ds, +- enum dsa_tag_protocol proto) +-{ +- struct qca_tagger_data *tagger_data; +- +- switch (proto) { +- case DSA_TAG_PROTO_QCA: +- tagger_data = ds->tagger_data; +- +- tagger_data->rw_reg_ack_handler = qca8k_rw_reg_ack_handler; +- tagger_data->mib_autocast_handler = qca8k_mib_autocast_handler; +- +- break; +- default: +- return -EOPNOTSUPP; +- } +- +- return 0; +-} +- +-static const struct dsa_switch_ops qca8k_switch_ops = { +- .get_tag_protocol = qca8k_get_tag_protocol, +- .setup = qca8k_setup, +- .get_strings = qca8k_get_strings, +- .get_ethtool_stats = qca8k_get_ethtool_stats, +- .get_sset_count = qca8k_get_sset_count, +- .set_ageing_time = qca8k_set_ageing_time, +- .get_mac_eee = qca8k_get_mac_eee, +- .set_mac_eee = qca8k_set_mac_eee, +- .port_enable = qca8k_port_enable, +- .port_disable = qca8k_port_disable, +- .port_change_mtu = qca8k_port_change_mtu, +- .port_max_mtu = qca8k_port_max_mtu, +- .port_stp_state_set = qca8k_port_stp_state_set, +- .port_bridge_join = qca8k_port_bridge_join, +- .port_bridge_leave = qca8k_port_bridge_leave, +- .port_fast_age = qca8k_port_fast_age, +- .port_fdb_add = qca8k_port_fdb_add, +- .port_fdb_del = qca8k_port_fdb_del, +- .port_fdb_dump = qca8k_port_fdb_dump, +- .port_mdb_add = qca8k_port_mdb_add, +- .port_mdb_del = qca8k_port_mdb_del, +- .port_mirror_add = qca8k_port_mirror_add, +- .port_mirror_del = qca8k_port_mirror_del, +- .port_vlan_filtering = qca8k_port_vlan_filtering, +- .port_vlan_add = qca8k_port_vlan_add, +- .port_vlan_del = qca8k_port_vlan_del, +- .phylink_validate = qca8k_phylink_validate, +- .phylink_mac_link_state = qca8k_phylink_mac_link_state, +- .phylink_mac_config = qca8k_phylink_mac_config, +- .phylink_mac_link_down = qca8k_phylink_mac_link_down, +- .phylink_mac_link_up = qca8k_phylink_mac_link_up, +- .get_phy_flags = qca8k_get_phy_flags, +- .port_lag_join = qca8k_port_lag_join, +- .port_lag_leave = qca8k_port_lag_leave, +- .master_state_change = qca8k_master_change, +- .connect_tag_protocol = qca8k_connect_tag_protocol, +-}; +- +-static int qca8k_read_switch_id(struct qca8k_priv *priv) +-{ +- const struct qca8k_match_data *data; +- u32 val; +- u8 id; +- int ret; +- +- /* get the switches ID from the compatible */ +- data = of_device_get_match_data(priv->dev); +- if (!data) +- return -ENODEV; +- +- ret = qca8k_read(priv, QCA8K_REG_MASK_CTRL, &val); +- if (ret < 0) +- return -ENODEV; +- +- id = QCA8K_MASK_CTRL_DEVICE_ID(val); +- if (id != data->id) { +- dev_err(priv->dev, "Switch id detected %x but expected %x", id, data->id); +- return -ENODEV; +- } +- +- priv->switch_id = id; +- +- /* Save revision to communicate to the internal PHY driver */ +- priv->switch_revision = QCA8K_MASK_CTRL_REV_ID(val); +- +- return 0; +-} +- +-static int +-qca8k_sw_probe(struct mdio_device *mdiodev) +-{ +- struct qca8k_priv *priv; +- int ret; +- +- /* allocate the private data struct so that we can probe the switches +- * ID register +- */ +- priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL); +- if (!priv) +- return -ENOMEM; +- +- priv->bus = mdiodev->bus; +- priv->dev = &mdiodev->dev; +- +- priv->reset_gpio = devm_gpiod_get_optional(priv->dev, "reset", +- GPIOD_ASIS); +- if (IS_ERR(priv->reset_gpio)) +- return PTR_ERR(priv->reset_gpio); +- +- if (priv->reset_gpio) { +- gpiod_set_value_cansleep(priv->reset_gpio, 1); +- /* The active low duration must be greater than 10 ms +- * and checkpatch.pl wants 20 ms. +- */ +- msleep(20); +- gpiod_set_value_cansleep(priv->reset_gpio, 0); +- } +- +- /* Start by setting up the register mapping */ +- priv->regmap = devm_regmap_init(&mdiodev->dev, NULL, priv, +- &qca8k_regmap_config); +- if (IS_ERR(priv->regmap)) { +- dev_err(priv->dev, "regmap initialization failed"); +- return PTR_ERR(priv->regmap); +- } +- +- priv->mdio_cache.page = 0xffff; +- priv->mdio_cache.lo = 0xffff; +- priv->mdio_cache.hi = 0xffff; +- +- /* Check the detected switch id */ +- ret = qca8k_read_switch_id(priv); +- if (ret) +- return ret; +- +- priv->ds = devm_kzalloc(&mdiodev->dev, sizeof(*priv->ds), GFP_KERNEL); +- if (!priv->ds) +- return -ENOMEM; +- +- mutex_init(&priv->mgmt_eth_data.mutex); +- init_completion(&priv->mgmt_eth_data.rw_done); +- +- mutex_init(&priv->mib_eth_data.mutex); +- init_completion(&priv->mib_eth_data.rw_done); +- +- priv->ds->dev = &mdiodev->dev; +- priv->ds->num_ports = QCA8K_NUM_PORTS; +- priv->ds->priv = priv; +- priv->ds->ops = &qca8k_switch_ops; +- mutex_init(&priv->reg_mutex); +- dev_set_drvdata(&mdiodev->dev, priv); +- +- return dsa_register_switch(priv->ds); +-} +- +-static void +-qca8k_sw_remove(struct mdio_device *mdiodev) +-{ +- struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev); +- int i; +- +- if (!priv) +- return; +- +- for (i = 0; i < QCA8K_NUM_PORTS; i++) +- qca8k_port_set_status(priv, i, 0); +- +- dsa_unregister_switch(priv->ds); +- +- dev_set_drvdata(&mdiodev->dev, NULL); +-} +- +-static void qca8k_sw_shutdown(struct mdio_device *mdiodev) +-{ +- struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev); +- +- if (!priv) +- return; +- +- dsa_switch_shutdown(priv->ds); +- +- dev_set_drvdata(&mdiodev->dev, NULL); +-} +- +-#ifdef CONFIG_PM_SLEEP +-static void +-qca8k_set_pm(struct qca8k_priv *priv, int enable) +-{ +- int port; +- +- for (port = 0; port < QCA8K_NUM_PORTS; port++) { +- /* Do not enable on resume if the port was +- * disabled before. +- */ +- if (!(priv->port_enabled_map & BIT(port))) +- continue; +- +- qca8k_port_set_status(priv, port, enable); +- } +-} +- +-static int qca8k_suspend(struct device *dev) +-{ +- struct qca8k_priv *priv = dev_get_drvdata(dev); +- +- qca8k_set_pm(priv, 0); +- +- return dsa_switch_suspend(priv->ds); +-} +- +-static int qca8k_resume(struct device *dev) +-{ +- struct qca8k_priv *priv = dev_get_drvdata(dev); +- +- qca8k_set_pm(priv, 1); +- +- return dsa_switch_resume(priv->ds); +-} +-#endif /* CONFIG_PM_SLEEP */ +- +-static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, +- qca8k_suspend, qca8k_resume); +- +-static const struct qca8k_match_data qca8327 = { +- .id = QCA8K_ID_QCA8327, +- .reduced_package = true, +- .mib_count = QCA8K_QCA832X_MIB_COUNT, +-}; +- +-static const struct qca8k_match_data qca8328 = { +- .id = QCA8K_ID_QCA8327, +- .mib_count = QCA8K_QCA832X_MIB_COUNT, +-}; +- +-static const struct qca8k_match_data qca833x = { +- .id = QCA8K_ID_QCA8337, +- .mib_count = QCA8K_QCA833X_MIB_COUNT, +-}; +- +-static const struct of_device_id qca8k_of_match[] = { +- { .compatible = "qca,qca8327", .data = &qca8327 }, +- { .compatible = "qca,qca8328", .data = &qca8328 }, +- { .compatible = "qca,qca8334", .data = &qca833x }, +- { .compatible = "qca,qca8337", .data = &qca833x }, +- { /* sentinel */ }, +-}; +- +-static struct mdio_driver qca8kmdio_driver = { +- .probe = qca8k_sw_probe, +- .remove = qca8k_sw_remove, +- .shutdown = qca8k_sw_shutdown, +- .mdiodrv.driver = { +- .name = "qca8k", +- .of_match_table = qca8k_of_match, +- .pm = &qca8k_pm_ops, +- }, +-}; +- +-mdio_module_driver(qca8kmdio_driver); +- +-MODULE_AUTHOR("Mathieu Olivari, John Crispin "); +-MODULE_DESCRIPTION("Driver for QCA8K ethernet switch family"); +-MODULE_LICENSE("GPL v2"); +-MODULE_ALIAS("platform:qca8k"); +--- a/drivers/net/dsa/qca8k.h ++++ /dev/null +@@ -1,411 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0-only */ +-/* +- * Copyright (C) 2009 Felix Fietkau +- * Copyright (C) 2011-2012 Gabor Juhos +- * Copyright (c) 2015, The Linux Foundation. All rights reserved. +- */ +- +-#ifndef __QCA8K_H +-#define __QCA8K_H +- +-#include +-#include +-#include +-#include +- +-#define QCA8K_ETHERNET_MDIO_PRIORITY 7 +-#define QCA8K_ETHERNET_PHY_PRIORITY 6 +-#define QCA8K_ETHERNET_TIMEOUT 100 +- +-#define QCA8K_NUM_PORTS 7 +-#define QCA8K_NUM_CPU_PORTS 2 +-#define QCA8K_MAX_MTU 9000 +-#define QCA8K_NUM_LAGS 4 +-#define QCA8K_NUM_PORTS_FOR_LAG 4 +- +-#define PHY_ID_QCA8327 0x004dd034 +-#define QCA8K_ID_QCA8327 0x12 +-#define PHY_ID_QCA8337 0x004dd036 +-#define QCA8K_ID_QCA8337 0x13 +- +-#define QCA8K_QCA832X_MIB_COUNT 39 +-#define QCA8K_QCA833X_MIB_COUNT 41 +- +-#define QCA8K_BUSY_WAIT_TIMEOUT 2000 +- +-#define QCA8K_NUM_FDB_RECORDS 2048 +- +-#define QCA8K_PORT_VID_DEF 1 +- +-/* Global control registers */ +-#define QCA8K_REG_MASK_CTRL 0x000 +-#define QCA8K_MASK_CTRL_REV_ID_MASK GENMASK(7, 0) +-#define QCA8K_MASK_CTRL_REV_ID(x) FIELD_GET(QCA8K_MASK_CTRL_REV_ID_MASK, x) +-#define QCA8K_MASK_CTRL_DEVICE_ID_MASK GENMASK(15, 8) +-#define QCA8K_MASK_CTRL_DEVICE_ID(x) FIELD_GET(QCA8K_MASK_CTRL_DEVICE_ID_MASK, x) +-#define QCA8K_REG_PORT0_PAD_CTRL 0x004 +-#define QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN BIT(31) +-#define QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE BIT(19) +-#define QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE BIT(18) +-#define QCA8K_REG_PORT5_PAD_CTRL 0x008 +-#define QCA8K_REG_PORT6_PAD_CTRL 0x00c +-#define QCA8K_PORT_PAD_RGMII_EN BIT(26) +-#define QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK GENMASK(23, 22) +-#define QCA8K_PORT_PAD_RGMII_TX_DELAY(x) FIELD_PREP(QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK, x) +-#define QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK GENMASK(21, 20) +-#define QCA8K_PORT_PAD_RGMII_RX_DELAY(x) FIELD_PREP(QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK, x) +-#define QCA8K_PORT_PAD_RGMII_TX_DELAY_EN BIT(25) +-#define QCA8K_PORT_PAD_RGMII_RX_DELAY_EN BIT(24) +-#define QCA8K_PORT_PAD_SGMII_EN BIT(7) +-#define QCA8K_REG_PWS 0x010 +-#define QCA8K_PWS_POWER_ON_SEL BIT(31) +-/* This reg is only valid for QCA832x and toggle the package +- * type from 176 pin (by default) to 148 pin used on QCA8327 +- */ +-#define QCA8327_PWS_PACKAGE148_EN BIT(30) +-#define QCA8K_PWS_LED_OPEN_EN_CSR BIT(24) +-#define QCA8K_PWS_SERDES_AEN_DIS BIT(7) +-#define QCA8K_REG_MODULE_EN 0x030 +-#define QCA8K_MODULE_EN_MIB BIT(0) +-#define QCA8K_REG_MIB 0x034 +-#define QCA8K_MIB_FUNC GENMASK(26, 24) +-#define QCA8K_MIB_CPU_KEEP BIT(20) +-#define QCA8K_MIB_BUSY BIT(17) +-#define QCA8K_MDIO_MASTER_CTRL 0x3c +-#define QCA8K_MDIO_MASTER_BUSY BIT(31) +-#define QCA8K_MDIO_MASTER_EN BIT(30) +-#define QCA8K_MDIO_MASTER_READ BIT(27) +-#define QCA8K_MDIO_MASTER_WRITE 0 +-#define QCA8K_MDIO_MASTER_SUP_PRE BIT(26) +-#define QCA8K_MDIO_MASTER_PHY_ADDR_MASK GENMASK(25, 21) +-#define QCA8K_MDIO_MASTER_PHY_ADDR(x) FIELD_PREP(QCA8K_MDIO_MASTER_PHY_ADDR_MASK, x) +-#define QCA8K_MDIO_MASTER_REG_ADDR_MASK GENMASK(20, 16) +-#define QCA8K_MDIO_MASTER_REG_ADDR(x) FIELD_PREP(QCA8K_MDIO_MASTER_REG_ADDR_MASK, x) +-#define QCA8K_MDIO_MASTER_DATA_MASK GENMASK(15, 0) +-#define QCA8K_MDIO_MASTER_DATA(x) FIELD_PREP(QCA8K_MDIO_MASTER_DATA_MASK, x) +-#define QCA8K_MDIO_MASTER_MAX_PORTS 5 +-#define QCA8K_MDIO_MASTER_MAX_REG 32 +-#define QCA8K_GOL_MAC_ADDR0 0x60 +-#define QCA8K_GOL_MAC_ADDR1 0x64 +-#define QCA8K_MAX_FRAME_SIZE 0x78 +-#define QCA8K_REG_PORT_STATUS(_i) (0x07c + (_i) * 4) +-#define QCA8K_PORT_STATUS_SPEED GENMASK(1, 0) +-#define QCA8K_PORT_STATUS_SPEED_10 0 +-#define QCA8K_PORT_STATUS_SPEED_100 0x1 +-#define QCA8K_PORT_STATUS_SPEED_1000 0x2 +-#define QCA8K_PORT_STATUS_TXMAC BIT(2) +-#define QCA8K_PORT_STATUS_RXMAC BIT(3) +-#define QCA8K_PORT_STATUS_TXFLOW BIT(4) +-#define QCA8K_PORT_STATUS_RXFLOW BIT(5) +-#define QCA8K_PORT_STATUS_DUPLEX BIT(6) +-#define QCA8K_PORT_STATUS_LINK_UP BIT(8) +-#define QCA8K_PORT_STATUS_LINK_AUTO BIT(9) +-#define QCA8K_PORT_STATUS_LINK_PAUSE BIT(10) +-#define QCA8K_PORT_STATUS_FLOW_AUTO BIT(12) +-#define QCA8K_REG_PORT_HDR_CTRL(_i) (0x9c + (_i * 4)) +-#define QCA8K_PORT_HDR_CTRL_RX_MASK GENMASK(3, 2) +-#define QCA8K_PORT_HDR_CTRL_TX_MASK GENMASK(1, 0) +-#define QCA8K_PORT_HDR_CTRL_ALL 2 +-#define QCA8K_PORT_HDR_CTRL_MGMT 1 +-#define QCA8K_PORT_HDR_CTRL_NONE 0 +-#define QCA8K_REG_SGMII_CTRL 0x0e0 +-#define QCA8K_SGMII_EN_PLL BIT(1) +-#define QCA8K_SGMII_EN_RX BIT(2) +-#define QCA8K_SGMII_EN_TX BIT(3) +-#define QCA8K_SGMII_EN_SD BIT(4) +-#define QCA8K_SGMII_CLK125M_DELAY BIT(7) +-#define QCA8K_SGMII_MODE_CTRL_MASK GENMASK(23, 22) +-#define QCA8K_SGMII_MODE_CTRL(x) FIELD_PREP(QCA8K_SGMII_MODE_CTRL_MASK, x) +-#define QCA8K_SGMII_MODE_CTRL_BASEX QCA8K_SGMII_MODE_CTRL(0x0) +-#define QCA8K_SGMII_MODE_CTRL_PHY QCA8K_SGMII_MODE_CTRL(0x1) +-#define QCA8K_SGMII_MODE_CTRL_MAC QCA8K_SGMII_MODE_CTRL(0x2) +- +-/* MAC_PWR_SEL registers */ +-#define QCA8K_REG_MAC_PWR_SEL 0x0e4 +-#define QCA8K_MAC_PWR_RGMII1_1_8V BIT(18) +-#define QCA8K_MAC_PWR_RGMII0_1_8V BIT(19) +- +-/* EEE control registers */ +-#define QCA8K_REG_EEE_CTRL 0x100 +-#define QCA8K_REG_EEE_CTRL_LPI_EN(_i) ((_i + 1) * 2) +- +-/* TRUNK_HASH_EN registers */ +-#define QCA8K_TRUNK_HASH_EN_CTRL 0x270 +-#define QCA8K_TRUNK_HASH_SIP_EN BIT(3) +-#define QCA8K_TRUNK_HASH_DIP_EN BIT(2) +-#define QCA8K_TRUNK_HASH_SA_EN BIT(1) +-#define QCA8K_TRUNK_HASH_DA_EN BIT(0) +-#define QCA8K_TRUNK_HASH_MASK GENMASK(3, 0) +- +-/* ACL registers */ +-#define QCA8K_REG_PORT_VLAN_CTRL0(_i) (0x420 + (_i * 8)) +-#define QCA8K_PORT_VLAN_CVID_MASK GENMASK(27, 16) +-#define QCA8K_PORT_VLAN_CVID(x) FIELD_PREP(QCA8K_PORT_VLAN_CVID_MASK, x) +-#define QCA8K_PORT_VLAN_SVID_MASK GENMASK(11, 0) +-#define QCA8K_PORT_VLAN_SVID(x) FIELD_PREP(QCA8K_PORT_VLAN_SVID_MASK, x) +-#define QCA8K_REG_PORT_VLAN_CTRL1(_i) (0x424 + (_i * 8)) +-#define QCA8K_REG_IPV4_PRI_BASE_ADDR 0x470 +-#define QCA8K_REG_IPV4_PRI_ADDR_MASK 0x474 +- +-/* Lookup registers */ +-#define QCA8K_REG_ATU_DATA0 0x600 +-#define QCA8K_ATU_ADDR2_MASK GENMASK(31, 24) +-#define QCA8K_ATU_ADDR3_MASK GENMASK(23, 16) +-#define QCA8K_ATU_ADDR4_MASK GENMASK(15, 8) +-#define QCA8K_ATU_ADDR5_MASK GENMASK(7, 0) +-#define QCA8K_REG_ATU_DATA1 0x604 +-#define QCA8K_ATU_PORT_MASK GENMASK(22, 16) +-#define QCA8K_ATU_ADDR0_MASK GENMASK(15, 8) +-#define QCA8K_ATU_ADDR1_MASK GENMASK(7, 0) +-#define QCA8K_REG_ATU_DATA2 0x608 +-#define QCA8K_ATU_VID_MASK GENMASK(19, 8) +-#define QCA8K_ATU_STATUS_MASK GENMASK(3, 0) +-#define QCA8K_ATU_STATUS_STATIC 0xf +-#define QCA8K_REG_ATU_FUNC 0x60c +-#define QCA8K_ATU_FUNC_BUSY BIT(31) +-#define QCA8K_ATU_FUNC_PORT_EN BIT(14) +-#define QCA8K_ATU_FUNC_MULTI_EN BIT(13) +-#define QCA8K_ATU_FUNC_FULL BIT(12) +-#define QCA8K_ATU_FUNC_PORT_MASK GENMASK(11, 8) +-#define QCA8K_REG_VTU_FUNC0 0x610 +-#define QCA8K_VTU_FUNC0_VALID BIT(20) +-#define QCA8K_VTU_FUNC0_IVL_EN BIT(19) +-/* QCA8K_VTU_FUNC0_EG_MODE_MASK GENMASK(17, 4) +- * It does contain VLAN_MODE for each port [5:4] for port0, +- * [7:6] for port1 ... [17:16] for port6. Use virtual port +- * define to handle this. +- */ +-#define QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i) (4 + (_i) * 2) +-#define QCA8K_VTU_FUNC0_EG_MODE_MASK GENMASK(1, 0) +-#define QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(_i) (GENMASK(1, 0) << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) +-#define QCA8K_VTU_FUNC0_EG_MODE_UNMOD FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x0) +-#define QCA8K_VTU_FUNC0_EG_MODE_PORT_UNMOD(_i) (QCA8K_VTU_FUNC0_EG_MODE_UNMOD << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) +-#define QCA8K_VTU_FUNC0_EG_MODE_UNTAG FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x1) +-#define QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(_i) (QCA8K_VTU_FUNC0_EG_MODE_UNTAG << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) +-#define QCA8K_VTU_FUNC0_EG_MODE_TAG FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x2) +-#define QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(_i) (QCA8K_VTU_FUNC0_EG_MODE_TAG << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) +-#define QCA8K_VTU_FUNC0_EG_MODE_NOT FIELD_PREP(QCA8K_VTU_FUNC0_EG_MODE_MASK, 0x3) +-#define QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(_i) (QCA8K_VTU_FUNC0_EG_MODE_NOT << QCA8K_VTU_FUNC0_EG_MODE_PORT_SHIFT(_i)) +-#define QCA8K_REG_VTU_FUNC1 0x614 +-#define QCA8K_VTU_FUNC1_BUSY BIT(31) +-#define QCA8K_VTU_FUNC1_VID_MASK GENMASK(27, 16) +-#define QCA8K_VTU_FUNC1_FULL BIT(4) +-#define QCA8K_REG_ATU_CTRL 0x618 +-#define QCA8K_ATU_AGE_TIME_MASK GENMASK(15, 0) +-#define QCA8K_ATU_AGE_TIME(x) FIELD_PREP(QCA8K_ATU_AGE_TIME_MASK, (x)) +-#define QCA8K_REG_GLOBAL_FW_CTRL0 0x620 +-#define QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN BIT(10) +-#define QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM GENMASK(7, 4) +-#define QCA8K_REG_GLOBAL_FW_CTRL1 0x624 +-#define QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK GENMASK(30, 24) +-#define QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK GENMASK(22, 16) +-#define QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK GENMASK(14, 8) +-#define QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK GENMASK(6, 0) +-#define QCA8K_PORT_LOOKUP_CTRL(_i) (0x660 + (_i) * 0xc) +-#define QCA8K_PORT_LOOKUP_MEMBER GENMASK(6, 0) +-#define QCA8K_PORT_LOOKUP_VLAN_MODE_MASK GENMASK(9, 8) +-#define QCA8K_PORT_LOOKUP_VLAN_MODE(x) FIELD_PREP(QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, x) +-#define QCA8K_PORT_LOOKUP_VLAN_MODE_NONE QCA8K_PORT_LOOKUP_VLAN_MODE(0x0) +-#define QCA8K_PORT_LOOKUP_VLAN_MODE_FALLBACK QCA8K_PORT_LOOKUP_VLAN_MODE(0x1) +-#define QCA8K_PORT_LOOKUP_VLAN_MODE_CHECK QCA8K_PORT_LOOKUP_VLAN_MODE(0x2) +-#define QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE QCA8K_PORT_LOOKUP_VLAN_MODE(0x3) +-#define QCA8K_PORT_LOOKUP_STATE_MASK GENMASK(18, 16) +-#define QCA8K_PORT_LOOKUP_STATE(x) FIELD_PREP(QCA8K_PORT_LOOKUP_STATE_MASK, x) +-#define QCA8K_PORT_LOOKUP_STATE_DISABLED QCA8K_PORT_LOOKUP_STATE(0x0) +-#define QCA8K_PORT_LOOKUP_STATE_BLOCKING QCA8K_PORT_LOOKUP_STATE(0x1) +-#define QCA8K_PORT_LOOKUP_STATE_LISTENING QCA8K_PORT_LOOKUP_STATE(0x2) +-#define QCA8K_PORT_LOOKUP_STATE_LEARNING QCA8K_PORT_LOOKUP_STATE(0x3) +-#define QCA8K_PORT_LOOKUP_STATE_FORWARD QCA8K_PORT_LOOKUP_STATE(0x4) +-#define QCA8K_PORT_LOOKUP_LEARN BIT(20) +-#define QCA8K_PORT_LOOKUP_ING_MIRROR_EN BIT(25) +- +-#define QCA8K_REG_GOL_TRUNK_CTRL0 0x700 +-/* 4 max trunk first +- * first 6 bit for member bitmap +- * 7th bit is to enable trunk port +- */ +-#define QCA8K_REG_GOL_TRUNK_SHIFT(_i) ((_i) * 8) +-#define QCA8K_REG_GOL_TRUNK_EN_MASK BIT(7) +-#define QCA8K_REG_GOL_TRUNK_EN(_i) (QCA8K_REG_GOL_TRUNK_EN_MASK << QCA8K_REG_GOL_TRUNK_SHIFT(_i)) +-#define QCA8K_REG_GOL_TRUNK_MEMBER_MASK GENMASK(6, 0) +-#define QCA8K_REG_GOL_TRUNK_MEMBER(_i) (QCA8K_REG_GOL_TRUNK_MEMBER_MASK << QCA8K_REG_GOL_TRUNK_SHIFT(_i)) +-/* 0x704 for TRUNK 0-1 --- 0x708 for TRUNK 2-3 */ +-#define QCA8K_REG_GOL_TRUNK_CTRL(_i) (0x704 + (((_i) / 2) * 4)) +-#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_MASK GENMASK(3, 0) +-#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK BIT(3) +-#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK GENMASK(2, 0) +-#define QCA8K_REG_GOL_TRUNK_ID_SHIFT(_i) (((_i) / 2) * 16) +-#define QCA8K_REG_GOL_MEM_ID_SHIFT(_i) ((_i) * 4) +-/* Complex shift: FIRST shift for port THEN shift for trunk */ +-#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(_i, _j) (QCA8K_REG_GOL_MEM_ID_SHIFT(_j) + QCA8K_REG_GOL_TRUNK_ID_SHIFT(_i)) +-#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN(_i, _j) (QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(_i, _j)) +-#define QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT(_i, _j) (QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(_i, _j)) +- +-#define QCA8K_REG_GLOBAL_FC_THRESH 0x800 +-#define QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK GENMASK(24, 16) +-#define QCA8K_GLOBAL_FC_GOL_XON_THRES(x) FIELD_PREP(QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK, x) +-#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK GENMASK(8, 0) +-#define QCA8K_GLOBAL_FC_GOL_XOFF_THRES(x) FIELD_PREP(QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK, x) +- +-#define QCA8K_REG_PORT_HOL_CTRL0(_i) (0x970 + (_i) * 0x8) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF_MASK GENMASK(3, 0) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI0(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI0_BUF_MASK, x) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI1_BUF_MASK GENMASK(7, 4) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI1(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI1_BUF_MASK, x) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI2_BUF_MASK GENMASK(11, 8) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI2(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI2_BUF_MASK, x) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI3_BUF_MASK GENMASK(15, 12) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI3(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI3_BUF_MASK, x) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI4_BUF_MASK GENMASK(19, 16) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI4(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI4_BUF_MASK, x) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI5_BUF_MASK GENMASK(23, 20) +-#define QCA8K_PORT_HOL_CTRL0_EG_PRI5(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PRI5_BUF_MASK, x) +-#define QCA8K_PORT_HOL_CTRL0_EG_PORT_BUF_MASK GENMASK(29, 24) +-#define QCA8K_PORT_HOL_CTRL0_EG_PORT(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL0_EG_PORT_BUF_MASK, x) +- +-#define QCA8K_REG_PORT_HOL_CTRL1(_i) (0x974 + (_i) * 0x8) +-#define QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK GENMASK(3, 0) +-#define QCA8K_PORT_HOL_CTRL1_ING(x) FIELD_PREP(QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK, x) +-#define QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN BIT(6) +-#define QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN BIT(7) +-#define QCA8K_PORT_HOL_CTRL1_WRED_EN BIT(8) +-#define QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN BIT(16) +- +-/* Pkt edit registers */ +-#define QCA8K_EGREES_VLAN_PORT_SHIFT(_i) (16 * ((_i) % 2)) +-#define QCA8K_EGREES_VLAN_PORT_MASK(_i) (GENMASK(11, 0) << QCA8K_EGREES_VLAN_PORT_SHIFT(_i)) +-#define QCA8K_EGREES_VLAN_PORT(_i, x) ((x) << QCA8K_EGREES_VLAN_PORT_SHIFT(_i)) +-#define QCA8K_EGRESS_VLAN(x) (0x0c70 + (4 * (x / 2))) +- +-/* L3 registers */ +-#define QCA8K_HROUTER_CONTROL 0xe00 +-#define QCA8K_HROUTER_CONTROL_GLB_LOCKTIME_M GENMASK(17, 16) +-#define QCA8K_HROUTER_CONTROL_GLB_LOCKTIME_S 16 +-#define QCA8K_HROUTER_CONTROL_ARP_AGE_MODE 1 +-#define QCA8K_HROUTER_PBASED_CONTROL1 0xe08 +-#define QCA8K_HROUTER_PBASED_CONTROL2 0xe0c +-#define QCA8K_HNAT_CONTROL 0xe38 +- +-/* MIB registers */ +-#define QCA8K_PORT_MIB_COUNTER(_i) (0x1000 + (_i) * 0x100) +- +-/* QCA specific MII registers */ +-#define MII_ATH_MMD_ADDR 0x0d +-#define MII_ATH_MMD_DATA 0x0e +- +-enum { +- QCA8K_PORT_SPEED_10M = 0, +- QCA8K_PORT_SPEED_100M = 1, +- QCA8K_PORT_SPEED_1000M = 2, +- QCA8K_PORT_SPEED_ERR = 3, +-}; +- +-enum qca8k_fdb_cmd { +- QCA8K_FDB_FLUSH = 1, +- QCA8K_FDB_LOAD = 2, +- QCA8K_FDB_PURGE = 3, +- QCA8K_FDB_FLUSH_PORT = 5, +- QCA8K_FDB_NEXT = 6, +- QCA8K_FDB_SEARCH = 7, +-}; +- +-enum qca8k_vlan_cmd { +- QCA8K_VLAN_FLUSH = 1, +- QCA8K_VLAN_LOAD = 2, +- QCA8K_VLAN_PURGE = 3, +- QCA8K_VLAN_REMOVE_PORT = 4, +- QCA8K_VLAN_NEXT = 5, +- QCA8K_VLAN_READ = 6, +-}; +- +-enum qca8k_mid_cmd { +- QCA8K_MIB_FLUSH = 1, +- QCA8K_MIB_FLUSH_PORT = 2, +- QCA8K_MIB_CAST = 3, +-}; +- +-struct qca8k_match_data { +- u8 id; +- bool reduced_package; +- u8 mib_count; +-}; +- +-enum { +- QCA8K_CPU_PORT0, +- QCA8K_CPU_PORT6, +-}; +- +-struct qca8k_mgmt_eth_data { +- struct completion rw_done; +- struct mutex mutex; /* Enforce one mdio read/write at time */ +- bool ack; +- u32 seq; +- u32 data[4]; +-}; +- +-struct qca8k_mib_eth_data { +- struct completion rw_done; +- struct mutex mutex; /* Process one command at time */ +- refcount_t port_parsed; /* Counter to track parsed port */ +- u8 req_port; +- u64 *data; /* pointer to ethtool data */ +-}; +- +-struct qca8k_ports_config { +- bool sgmii_rx_clk_falling_edge; +- bool sgmii_tx_clk_falling_edge; +- bool sgmii_enable_pll; +- u8 rgmii_rx_delay[QCA8K_NUM_CPU_PORTS]; /* 0: CPU port0, 1: CPU port6 */ +- u8 rgmii_tx_delay[QCA8K_NUM_CPU_PORTS]; /* 0: CPU port0, 1: CPU port6 */ +-}; +- +-struct qca8k_mdio_cache { +-/* The 32bit switch registers are accessed indirectly. To achieve this we need +- * to set the page of the register. Track the last page that was set to reduce +- * mdio writes +- */ +- u16 page; +-/* lo and hi can also be cached and from Documentation we can skip one +- * extra mdio write if lo or hi is didn't change. +- */ +- u16 lo; +- u16 hi; +-}; +- +-struct qca8k_priv { +- u8 switch_id; +- u8 switch_revision; +- u8 mirror_rx; +- u8 mirror_tx; +- u8 lag_hash_mode; +- /* Each bit correspond to a port. This switch can support a max of 7 port. +- * Bit 1: port enabled. Bit 0: port disabled. +- */ +- u8 port_enabled_map; +- struct qca8k_ports_config ports_config; +- struct regmap *regmap; +- struct mii_bus *bus; +- struct dsa_switch *ds; +- struct mutex reg_mutex; +- struct device *dev; +- struct gpio_desc *reset_gpio; +- struct net_device *mgmt_master; /* Track if mdio/mib Ethernet is available */ +- struct qca8k_mgmt_eth_data mgmt_eth_data; +- struct qca8k_mib_eth_data mib_eth_data; +- struct qca8k_mdio_cache mdio_cache; +-}; +- +-struct qca8k_mib_desc { +- unsigned int size; +- unsigned int offset; +- const char *name; +-}; +- +-struct qca8k_fdb { +- u16 vid; +- u8 port_mask; +- u8 aging; +- u8 mac[6]; +-}; +- +-#endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-01-net-dsa-qca8k-cache-match-data-to-speed-up-access.patch b/target/linux/generic/backport-5.15/771-v6.0-01-net-dsa-qca8k-cache-match-data-to-speed-up-access.patch new file mode 100644 index 0000000000..77fe64632f --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-01-net-dsa-qca8k-cache-match-data-to-speed-up-access.patch @@ -0,0 +1,157 @@ +From 3bb0844e7bcd0fb0bcfab6202b5edd349ef5250a Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:10 +0200 +Subject: [PATCH 01/14] net: dsa: qca8k: cache match data to speed up access + +Using of_device_get_match_data is expensive. Cache match data to speed +up access and rework user of match data to use the new cached value. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k.c | 35 +++++++++++------------------------ + drivers/net/dsa/qca/qca8k.h | 1 + + 2 files changed, 12 insertions(+), 24 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k.c ++++ b/drivers/net/dsa/qca/qca8k.c +@@ -1462,8 +1462,8 @@ static int qca8k_find_cpu_port(struct ds + static int + qca8k_setup_of_pws_reg(struct qca8k_priv *priv) + { ++ const struct qca8k_match_data *data = priv->info; + struct device_node *node = priv->dev->of_node; +- const struct qca8k_match_data *data; + u32 val = 0; + int ret; + +@@ -1472,8 +1472,6 @@ qca8k_setup_of_pws_reg(struct qca8k_priv + * Should be applied by default but we set this just to make sure. + */ + if (priv->switch_id == QCA8K_ID_QCA8327) { +- data = of_device_get_match_data(priv->dev); +- + /* Set the correct package of 148 pin for QCA8327 */ + if (data->reduced_package) + val |= QCA8327_PWS_PACKAGE148_EN; +@@ -2146,23 +2144,19 @@ qca8k_phylink_mac_link_up(struct dsa_swi + static void + qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data) + { +- const struct qca8k_match_data *match_data; + struct qca8k_priv *priv = ds->priv; + int i; + + if (stringset != ETH_SS_STATS) + return; + +- match_data = of_device_get_match_data(priv->dev); +- +- for (i = 0; i < match_data->mib_count; i++) ++ for (i = 0; i < priv->info->mib_count; i++) + strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, + ETH_GSTRING_LEN); + } + + static void qca8k_mib_autocast_handler(struct dsa_switch *ds, struct sk_buff *skb) + { +- const struct qca8k_match_data *match_data; + struct qca8k_mib_eth_data *mib_eth_data; + struct qca8k_priv *priv = ds->priv; + const struct qca8k_mib_desc *mib; +@@ -2181,10 +2175,9 @@ static void qca8k_mib_autocast_handler(s + if (port != mib_eth_data->req_port) + goto exit; + +- match_data = device_get_match_data(priv->dev); + data = mib_eth_data->data; + +- for (i = 0; i < match_data->mib_count; i++) { ++ for (i = 0; i < priv->info->mib_count; i++) { + mib = &ar8327_mib[i]; + + /* First 3 mib are present in the skb head */ +@@ -2256,7 +2249,6 @@ qca8k_get_ethtool_stats(struct dsa_switc + uint64_t *data) + { + struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- const struct qca8k_match_data *match_data; + const struct qca8k_mib_desc *mib; + u32 reg, i, val; + u32 hi = 0; +@@ -2266,9 +2258,7 @@ qca8k_get_ethtool_stats(struct dsa_switc + qca8k_get_ethtool_stats_eth(ds, port, data) > 0) + return; + +- match_data = of_device_get_match_data(priv->dev); +- +- for (i = 0; i < match_data->mib_count; i++) { ++ for (i = 0; i < priv->info->mib_count; i++) { + mib = &ar8327_mib[i]; + reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; + +@@ -2291,15 +2281,12 @@ qca8k_get_ethtool_stats(struct dsa_switc + static int + qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset) + { +- const struct qca8k_match_data *match_data; + struct qca8k_priv *priv = ds->priv; + + if (sset != ETH_SS_STATS) + return 0; + +- match_data = of_device_get_match_data(priv->dev); +- +- return match_data->mib_count; ++ return priv->info->mib_count; + } + + static int +@@ -3037,14 +3024,11 @@ static const struct dsa_switch_ops qca8k + + static int qca8k_read_switch_id(struct qca8k_priv *priv) + { +- const struct qca8k_match_data *data; + u32 val; + u8 id; + int ret; + +- /* get the switches ID from the compatible */ +- data = of_device_get_match_data(priv->dev); +- if (!data) ++ if (!priv->info) + return -ENODEV; + + ret = qca8k_read(priv, QCA8K_REG_MASK_CTRL, &val); +@@ -3052,8 +3036,10 @@ static int qca8k_read_switch_id(struct q + return -ENODEV; + + id = QCA8K_MASK_CTRL_DEVICE_ID(val); +- if (id != data->id) { +- dev_err(priv->dev, "Switch id detected %x but expected %x", id, data->id); ++ if (id != priv->info->id) { ++ dev_err(priv->dev, ++ "Switch id detected %x but expected %x", ++ id, priv->info->id); + return -ENODEV; + } + +@@ -3078,6 +3064,7 @@ qca8k_sw_probe(struct mdio_device *mdiod + if (!priv) + return -ENOMEM; + ++ priv->info = of_device_get_match_data(priv->dev); + priv->bus = mdiodev->bus; + priv->dev = &mdiodev->dev; + +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -393,6 +393,7 @@ struct qca8k_priv { + struct qca8k_mgmt_eth_data mgmt_eth_data; + struct qca8k_mib_eth_data mib_eth_data; + struct qca8k_mdio_cache mdio_cache; ++ const struct qca8k_match_data *info; + }; + + struct qca8k_mib_desc { diff --git a/target/linux/generic/backport-5.15/771-v6.0-02-net-dsa-qca8k-make-mib-autocast-feature-optional.patch b/target/linux/generic/backport-5.15/771-v6.0-02-net-dsa-qca8k-make-mib-autocast-feature-optional.patch new file mode 100644 index 0000000000..5b2dce4c55 --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-02-net-dsa-qca8k-make-mib-autocast-feature-optional.patch @@ -0,0 +1,77 @@ +From 533c64bca62a8654f00698bc893f639013e38c7b Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:11 +0200 +Subject: [PATCH 02/14] net: dsa: qca8k: make mib autocast feature optional + +Some switch may not support mib autocast feature and require the legacy +way of reading the regs directly. +Make the mib autocast feature optional and permit to declare support for +it using match_data struct in a dedicated qca8k_info_ops struct. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k.c | 11 +++++++++-- + drivers/net/dsa/qca/qca8k.h | 5 +++++ + 2 files changed, 14 insertions(+), 2 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k.c ++++ b/drivers/net/dsa/qca/qca8k.c +@@ -2254,8 +2254,8 @@ qca8k_get_ethtool_stats(struct dsa_switc + u32 hi = 0; + int ret; + +- if (priv->mgmt_master && +- qca8k_get_ethtool_stats_eth(ds, port, data) > 0) ++ if (priv->mgmt_master && priv->info->ops->autocast_mib && ++ priv->info->ops->autocast_mib(ds, port, data) > 0) + return; + + for (i = 0; i < priv->info->mib_count; i++) { +@@ -3187,20 +3187,27 @@ static int qca8k_resume(struct device *d + static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, + qca8k_suspend, qca8k_resume); + ++static const struct qca8k_info_ops qca8xxx_ops = { ++ .autocast_mib = qca8k_get_ethtool_stats_eth, ++}; ++ + static const struct qca8k_match_data qca8327 = { + .id = QCA8K_ID_QCA8327, + .reduced_package = true, + .mib_count = QCA8K_QCA832X_MIB_COUNT, ++ .ops = &qca8xxx_ops, + }; + + static const struct qca8k_match_data qca8328 = { + .id = QCA8K_ID_QCA8327, + .mib_count = QCA8K_QCA832X_MIB_COUNT, ++ .ops = &qca8xxx_ops, + }; + + static const struct qca8k_match_data qca833x = { + .id = QCA8K_ID_QCA8337, + .mib_count = QCA8K_QCA833X_MIB_COUNT, ++ .ops = &qca8xxx_ops, + }; + + static const struct of_device_id qca8k_of_match[] = { +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -324,10 +324,15 @@ enum qca8k_mid_cmd { + QCA8K_MIB_CAST = 3, + }; + ++struct qca8k_info_ops { ++ int (*autocast_mib)(struct dsa_switch *ds, int port, u64 *data); ++}; ++ + struct qca8k_match_data { + u8 id; + bool reduced_package; + u8 mib_count; ++ const struct qca8k_info_ops *ops; + }; + + enum { diff --git a/target/linux/generic/backport-5.15/771-v6.0-03-net-dsa-qca8k-move-mib-struct-to-common-code.patch b/target/linux/generic/backport-5.15/771-v6.0-03-net-dsa-qca8k-move-mib-struct-to-common-code.patch new file mode 100644 index 0000000000..afa466693a --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-03-net-dsa-qca8k-move-mib-struct-to-common-code.patch @@ -0,0 +1,6532 @@ +From 027152b830434e3632ad5dd678cc5d4740358dbb Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:12 +0200 +Subject: [PATCH 03/14] net: dsa: qca8k: move mib struct to common code + +The same MIB struct is used by drivers based on qca8k family switch. Move +it to common code to make it accessible also by other drivers. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/Makefile | 1 + + drivers/net/dsa/qca/{qca8k.c => qca8k-8xxx.c} | 51 --------------- + drivers/net/dsa/qca/qca8k-common.c | 63 +++++++++++++++++++ + drivers/net/dsa/qca/qca8k.h | 3 + + 4 files changed, 67 insertions(+), 51 deletions(-) + rename drivers/net/dsa/qca/{qca8k.c => qca8k-8xxx.c} (98%) + create mode 100644 drivers/net/dsa/qca/qca8k-common.c + +--- a/drivers/net/dsa/qca/Makefile ++++ b/drivers/net/dsa/qca/Makefile +@@ -1,3 +1,4 @@ + # SPDX-License-Identifier: GPL-2.0-only + obj-$(CONFIG_NET_DSA_AR9331) += ar9331.o + obj-$(CONFIG_NET_DSA_QCA8K) += qca8k.o ++qca8k-y += qca8k-common.o qca8k-8xxx.o +--- a/drivers/net/dsa/qca/qca8k.c ++++ /dev/null +@@ -1,3237 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0 +-/* +- * Copyright (C) 2009 Felix Fietkau +- * Copyright (C) 2011-2012 Gabor Juhos +- * Copyright (c) 2015, 2019, The Linux Foundation. All rights reserved. +- * Copyright (c) 2016 John Crispin +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include "qca8k.h" +- +-#define MIB_DESC(_s, _o, _n) \ +- { \ +- .size = (_s), \ +- .offset = (_o), \ +- .name = (_n), \ +- } +- +-static const struct qca8k_mib_desc ar8327_mib[] = { +- MIB_DESC(1, 0x00, "RxBroad"), +- MIB_DESC(1, 0x04, "RxPause"), +- MIB_DESC(1, 0x08, "RxMulti"), +- MIB_DESC(1, 0x0c, "RxFcsErr"), +- MIB_DESC(1, 0x10, "RxAlignErr"), +- MIB_DESC(1, 0x14, "RxRunt"), +- MIB_DESC(1, 0x18, "RxFragment"), +- MIB_DESC(1, 0x1c, "Rx64Byte"), +- MIB_DESC(1, 0x20, "Rx128Byte"), +- MIB_DESC(1, 0x24, "Rx256Byte"), +- MIB_DESC(1, 0x28, "Rx512Byte"), +- MIB_DESC(1, 0x2c, "Rx1024Byte"), +- MIB_DESC(1, 0x30, "Rx1518Byte"), +- MIB_DESC(1, 0x34, "RxMaxByte"), +- MIB_DESC(1, 0x38, "RxTooLong"), +- MIB_DESC(2, 0x3c, "RxGoodByte"), +- MIB_DESC(2, 0x44, "RxBadByte"), +- MIB_DESC(1, 0x4c, "RxOverFlow"), +- MIB_DESC(1, 0x50, "Filtered"), +- MIB_DESC(1, 0x54, "TxBroad"), +- MIB_DESC(1, 0x58, "TxPause"), +- MIB_DESC(1, 0x5c, "TxMulti"), +- MIB_DESC(1, 0x60, "TxUnderRun"), +- MIB_DESC(1, 0x64, "Tx64Byte"), +- MIB_DESC(1, 0x68, "Tx128Byte"), +- MIB_DESC(1, 0x6c, "Tx256Byte"), +- MIB_DESC(1, 0x70, "Tx512Byte"), +- MIB_DESC(1, 0x74, "Tx1024Byte"), +- MIB_DESC(1, 0x78, "Tx1518Byte"), +- MIB_DESC(1, 0x7c, "TxMaxByte"), +- MIB_DESC(1, 0x80, "TxOverSize"), +- MIB_DESC(2, 0x84, "TxByte"), +- MIB_DESC(1, 0x8c, "TxCollision"), +- MIB_DESC(1, 0x90, "TxAbortCol"), +- MIB_DESC(1, 0x94, "TxMultiCol"), +- MIB_DESC(1, 0x98, "TxSingleCol"), +- MIB_DESC(1, 0x9c, "TxExcDefer"), +- MIB_DESC(1, 0xa0, "TxDefer"), +- MIB_DESC(1, 0xa4, "TxLateCol"), +- MIB_DESC(1, 0xa8, "RXUnicast"), +- MIB_DESC(1, 0xac, "TXUnicast"), +-}; +- +-static void +-qca8k_split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) +-{ +- regaddr >>= 1; +- *r1 = regaddr & 0x1e; +- +- regaddr >>= 5; +- *r2 = regaddr & 0x7; +- +- regaddr >>= 3; +- *page = regaddr & 0x3ff; +-} +- +-static int +-qca8k_set_lo(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 lo) +-{ +- u16 *cached_lo = &priv->mdio_cache.lo; +- struct mii_bus *bus = priv->bus; +- int ret; +- +- if (lo == *cached_lo) +- return 0; +- +- ret = bus->write(bus, phy_id, regnum, lo); +- if (ret < 0) +- dev_err_ratelimited(&bus->dev, +- "failed to write qca8k 32bit lo register\n"); +- +- *cached_lo = lo; +- return 0; +-} +- +-static int +-qca8k_set_hi(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 hi) +-{ +- u16 *cached_hi = &priv->mdio_cache.hi; +- struct mii_bus *bus = priv->bus; +- int ret; +- +- if (hi == *cached_hi) +- return 0; +- +- ret = bus->write(bus, phy_id, regnum, hi); +- if (ret < 0) +- dev_err_ratelimited(&bus->dev, +- "failed to write qca8k 32bit hi register\n"); +- +- *cached_hi = hi; +- return 0; +-} +- +-static int +-qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) +-{ +- int ret; +- +- ret = bus->read(bus, phy_id, regnum); +- if (ret >= 0) { +- *val = ret; +- ret = bus->read(bus, phy_id, regnum + 1); +- *val |= ret << 16; +- } +- +- if (ret < 0) { +- dev_err_ratelimited(&bus->dev, +- "failed to read qca8k 32bit register\n"); +- *val = 0; +- return ret; +- } +- +- return 0; +-} +- +-static void +-qca8k_mii_write32(struct qca8k_priv *priv, int phy_id, u32 regnum, u32 val) +-{ +- u16 lo, hi; +- int ret; +- +- lo = val & 0xffff; +- hi = (u16)(val >> 16); +- +- ret = qca8k_set_lo(priv, phy_id, regnum, lo); +- if (ret >= 0) +- ret = qca8k_set_hi(priv, phy_id, regnum + 1, hi); +-} +- +-static int +-qca8k_set_page(struct qca8k_priv *priv, u16 page) +-{ +- u16 *cached_page = &priv->mdio_cache.page; +- struct mii_bus *bus = priv->bus; +- int ret; +- +- if (page == *cached_page) +- return 0; +- +- ret = bus->write(bus, 0x18, 0, page); +- if (ret < 0) { +- dev_err_ratelimited(&bus->dev, +- "failed to set qca8k page\n"); +- return ret; +- } +- +- *cached_page = page; +- usleep_range(1000, 2000); +- return 0; +-} +- +-static int +-qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val) +-{ +- return regmap_read(priv->regmap, reg, val); +-} +- +-static int +-qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val) +-{ +- return regmap_write(priv->regmap, reg, val); +-} +- +-static int +-qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) +-{ +- return regmap_update_bits(priv->regmap, reg, mask, write_val); +-} +- +-static void qca8k_rw_reg_ack_handler(struct dsa_switch *ds, struct sk_buff *skb) +-{ +- struct qca8k_mgmt_eth_data *mgmt_eth_data; +- struct qca8k_priv *priv = ds->priv; +- struct qca_mgmt_ethhdr *mgmt_ethhdr; +- u8 len, cmd; +- +- mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb_mac_header(skb); +- mgmt_eth_data = &priv->mgmt_eth_data; +- +- cmd = FIELD_GET(QCA_HDR_MGMT_CMD, mgmt_ethhdr->command); +- len = FIELD_GET(QCA_HDR_MGMT_LENGTH, mgmt_ethhdr->command); +- +- /* Make sure the seq match the requested packet */ +- if (mgmt_ethhdr->seq == mgmt_eth_data->seq) +- mgmt_eth_data->ack = true; +- +- if (cmd == MDIO_READ) { +- mgmt_eth_data->data[0] = mgmt_ethhdr->mdio_data; +- +- /* Get the rest of the 12 byte of data. +- * The read/write function will extract the requested data. +- */ +- if (len > QCA_HDR_MGMT_DATA1_LEN) +- memcpy(mgmt_eth_data->data + 1, skb->data, +- QCA_HDR_MGMT_DATA2_LEN); +- } +- +- complete(&mgmt_eth_data->rw_done); +-} +- +-static struct sk_buff *qca8k_alloc_mdio_header(enum mdio_cmd cmd, u32 reg, u32 *val, +- int priority, unsigned int len) +-{ +- struct qca_mgmt_ethhdr *mgmt_ethhdr; +- unsigned int real_len; +- struct sk_buff *skb; +- u32 *data2; +- u16 hdr; +- +- skb = dev_alloc_skb(QCA_HDR_MGMT_PKT_LEN); +- if (!skb) +- return NULL; +- +- /* Max value for len reg is 15 (0xf) but the switch actually return 16 byte +- * Actually for some reason the steps are: +- * 0: nothing +- * 1-4: first 4 byte +- * 5-6: first 12 byte +- * 7-15: all 16 byte +- */ +- if (len == 16) +- real_len = 15; +- else +- real_len = len; +- +- skb_reset_mac_header(skb); +- skb_set_network_header(skb, skb->len); +- +- mgmt_ethhdr = skb_push(skb, QCA_HDR_MGMT_HEADER_LEN + QCA_HDR_LEN); +- +- hdr = FIELD_PREP(QCA_HDR_XMIT_VERSION, QCA_HDR_VERSION); +- hdr |= FIELD_PREP(QCA_HDR_XMIT_PRIORITY, priority); +- hdr |= QCA_HDR_XMIT_FROM_CPU; +- hdr |= FIELD_PREP(QCA_HDR_XMIT_DP_BIT, BIT(0)); +- hdr |= FIELD_PREP(QCA_HDR_XMIT_CONTROL, QCA_HDR_XMIT_TYPE_RW_REG); +- +- mgmt_ethhdr->command = FIELD_PREP(QCA_HDR_MGMT_ADDR, reg); +- mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_LENGTH, real_len); +- mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CMD, cmd); +- mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CHECK_CODE, +- QCA_HDR_MGMT_CHECK_CODE_VAL); +- +- if (cmd == MDIO_WRITE) +- mgmt_ethhdr->mdio_data = *val; +- +- mgmt_ethhdr->hdr = htons(hdr); +- +- data2 = skb_put_zero(skb, QCA_HDR_MGMT_DATA2_LEN + QCA_HDR_MGMT_PADDING_LEN); +- if (cmd == MDIO_WRITE && len > QCA_HDR_MGMT_DATA1_LEN) +- memcpy(data2, val + 1, len - QCA_HDR_MGMT_DATA1_LEN); +- +- return skb; +-} +- +-static void qca8k_mdio_header_fill_seq_num(struct sk_buff *skb, u32 seq_num) +-{ +- struct qca_mgmt_ethhdr *mgmt_ethhdr; +- +- mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb->data; +- mgmt_ethhdr->seq = FIELD_PREP(QCA_HDR_MGMT_SEQ_NUM, seq_num); +-} +- +-static int qca8k_read_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) +-{ +- struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; +- struct sk_buff *skb; +- bool ack; +- int ret; +- +- skb = qca8k_alloc_mdio_header(MDIO_READ, reg, NULL, +- QCA8K_ETHERNET_MDIO_PRIORITY, len); +- if (!skb) +- return -ENOMEM; +- +- mutex_lock(&mgmt_eth_data->mutex); +- +- /* Check mgmt_master if is operational */ +- if (!priv->mgmt_master) { +- kfree_skb(skb); +- mutex_unlock(&mgmt_eth_data->mutex); +- return -EINVAL; +- } +- +- skb->dev = priv->mgmt_master; +- +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the mdio pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(skb); +- +- ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); +- +- *val = mgmt_eth_data->data[0]; +- if (len > QCA_HDR_MGMT_DATA1_LEN) +- memcpy(val + 1, mgmt_eth_data->data + 1, len - QCA_HDR_MGMT_DATA1_LEN); +- +- ack = mgmt_eth_data->ack; +- +- mutex_unlock(&mgmt_eth_data->mutex); +- +- if (ret <= 0) +- return -ETIMEDOUT; +- +- if (!ack) +- return -EINVAL; +- +- return 0; +-} +- +-static int qca8k_write_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) +-{ +- struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; +- struct sk_buff *skb; +- bool ack; +- int ret; +- +- skb = qca8k_alloc_mdio_header(MDIO_WRITE, reg, val, +- QCA8K_ETHERNET_MDIO_PRIORITY, len); +- if (!skb) +- return -ENOMEM; +- +- mutex_lock(&mgmt_eth_data->mutex); +- +- /* Check mgmt_master if is operational */ +- if (!priv->mgmt_master) { +- kfree_skb(skb); +- mutex_unlock(&mgmt_eth_data->mutex); +- return -EINVAL; +- } +- +- skb->dev = priv->mgmt_master; +- +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the mdio pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(skb); +- +- ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); +- +- ack = mgmt_eth_data->ack; +- +- mutex_unlock(&mgmt_eth_data->mutex); +- +- if (ret <= 0) +- return -ETIMEDOUT; +- +- if (!ack) +- return -EINVAL; +- +- return 0; +-} +- +-static int +-qca8k_regmap_update_bits_eth(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) +-{ +- u32 val = 0; +- int ret; +- +- ret = qca8k_read_eth(priv, reg, &val, sizeof(val)); +- if (ret) +- return ret; +- +- val &= ~mask; +- val |= write_val; +- +- return qca8k_write_eth(priv, reg, &val, sizeof(val)); +-} +- +-static int +-qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len) +-{ +- int i, count = len / sizeof(u32), ret; +- +- if (priv->mgmt_master && !qca8k_read_eth(priv, reg, val, len)) +- return 0; +- +- for (i = 0; i < count; i++) { +- ret = regmap_read(priv->regmap, reg + (i * 4), val + i); +- if (ret < 0) +- return ret; +- } +- +- return 0; +-} +- +-static int +-qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len) +-{ +- int i, count = len / sizeof(u32), ret; +- u32 tmp; +- +- if (priv->mgmt_master && !qca8k_write_eth(priv, reg, val, len)) +- return 0; +- +- for (i = 0; i < count; i++) { +- tmp = val[i]; +- +- ret = regmap_write(priv->regmap, reg + (i * 4), tmp); +- if (ret < 0) +- return ret; +- } +- +- return 0; +-} +- +-static int +-qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ctx; +- struct mii_bus *bus = priv->bus; +- u16 r1, r2, page; +- int ret; +- +- if (!qca8k_read_eth(priv, reg, val, sizeof(*val))) +- return 0; +- +- qca8k_split_addr(reg, &r1, &r2, &page); +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +- +- ret = qca8k_set_page(priv, page); +- if (ret < 0) +- goto exit; +- +- ret = qca8k_mii_read32(bus, 0x10 | r2, r1, val); +- +-exit: +- mutex_unlock(&bus->mdio_lock); +- return ret; +-} +- +-static int +-qca8k_regmap_write(void *ctx, uint32_t reg, uint32_t val) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ctx; +- struct mii_bus *bus = priv->bus; +- u16 r1, r2, page; +- int ret; +- +- if (!qca8k_write_eth(priv, reg, &val, sizeof(val))) +- return 0; +- +- qca8k_split_addr(reg, &r1, &r2, &page); +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +- +- ret = qca8k_set_page(priv, page); +- if (ret < 0) +- goto exit; +- +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); +- +-exit: +- mutex_unlock(&bus->mdio_lock); +- return ret; +-} +- +-static int +-qca8k_regmap_update_bits(void *ctx, uint32_t reg, uint32_t mask, uint32_t write_val) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ctx; +- struct mii_bus *bus = priv->bus; +- u16 r1, r2, page; +- u32 val; +- int ret; +- +- if (!qca8k_regmap_update_bits_eth(priv, reg, mask, write_val)) +- return 0; +- +- qca8k_split_addr(reg, &r1, &r2, &page); +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +- +- ret = qca8k_set_page(priv, page); +- if (ret < 0) +- goto exit; +- +- ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); +- if (ret < 0) +- goto exit; +- +- val &= ~mask; +- val |= write_val; +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); +- +-exit: +- mutex_unlock(&bus->mdio_lock); +- +- return ret; +-} +- +-static const struct regmap_range qca8k_readable_ranges[] = { +- regmap_reg_range(0x0000, 0x00e4), /* Global control */ +- regmap_reg_range(0x0100, 0x0168), /* EEE control */ +- regmap_reg_range(0x0200, 0x0270), /* Parser control */ +- regmap_reg_range(0x0400, 0x0454), /* ACL */ +- regmap_reg_range(0x0600, 0x0718), /* Lookup */ +- regmap_reg_range(0x0800, 0x0b70), /* QM */ +- regmap_reg_range(0x0c00, 0x0c80), /* PKT */ +- regmap_reg_range(0x0e00, 0x0e98), /* L3 */ +- regmap_reg_range(0x1000, 0x10ac), /* MIB - Port0 */ +- regmap_reg_range(0x1100, 0x11ac), /* MIB - Port1 */ +- regmap_reg_range(0x1200, 0x12ac), /* MIB - Port2 */ +- regmap_reg_range(0x1300, 0x13ac), /* MIB - Port3 */ +- regmap_reg_range(0x1400, 0x14ac), /* MIB - Port4 */ +- regmap_reg_range(0x1500, 0x15ac), /* MIB - Port5 */ +- regmap_reg_range(0x1600, 0x16ac), /* MIB - Port6 */ +- +-}; +- +-static const struct regmap_access_table qca8k_readable_table = { +- .yes_ranges = qca8k_readable_ranges, +- .n_yes_ranges = ARRAY_SIZE(qca8k_readable_ranges), +-}; +- +-static struct regmap_config qca8k_regmap_config = { +- .reg_bits = 16, +- .val_bits = 32, +- .reg_stride = 4, +- .max_register = 0x16ac, /* end MIB - Port6 range */ +- .reg_read = qca8k_regmap_read, +- .reg_write = qca8k_regmap_write, +- .reg_update_bits = qca8k_regmap_update_bits, +- .rd_table = &qca8k_readable_table, +- .disable_locking = true, /* Locking is handled by qca8k read/write */ +- .cache_type = REGCACHE_NONE, /* Explicitly disable CACHE */ +-}; +- +-static int +-qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) +-{ +- u32 val; +- +- return regmap_read_poll_timeout(priv->regmap, reg, val, !(val & mask), 0, +- QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC); +-} +- +-static int +-qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb) +-{ +- u32 reg[3]; +- int ret; +- +- /* load the ARL table into an array */ +- ret = qca8k_bulk_read(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); +- if (ret) +- return ret; +- +- /* vid - 83:72 */ +- fdb->vid = FIELD_GET(QCA8K_ATU_VID_MASK, reg[2]); +- /* aging - 67:64 */ +- fdb->aging = FIELD_GET(QCA8K_ATU_STATUS_MASK, reg[2]); +- /* portmask - 54:48 */ +- fdb->port_mask = FIELD_GET(QCA8K_ATU_PORT_MASK, reg[1]); +- /* mac - 47:0 */ +- fdb->mac[0] = FIELD_GET(QCA8K_ATU_ADDR0_MASK, reg[1]); +- fdb->mac[1] = FIELD_GET(QCA8K_ATU_ADDR1_MASK, reg[1]); +- fdb->mac[2] = FIELD_GET(QCA8K_ATU_ADDR2_MASK, reg[0]); +- fdb->mac[3] = FIELD_GET(QCA8K_ATU_ADDR3_MASK, reg[0]); +- fdb->mac[4] = FIELD_GET(QCA8K_ATU_ADDR4_MASK, reg[0]); +- fdb->mac[5] = FIELD_GET(QCA8K_ATU_ADDR5_MASK, reg[0]); +- +- return 0; +-} +- +-static void +-qca8k_fdb_write(struct qca8k_priv *priv, u16 vid, u8 port_mask, const u8 *mac, +- u8 aging) +-{ +- u32 reg[3] = { 0 }; +- +- /* vid - 83:72 */ +- reg[2] = FIELD_PREP(QCA8K_ATU_VID_MASK, vid); +- /* aging - 67:64 */ +- reg[2] |= FIELD_PREP(QCA8K_ATU_STATUS_MASK, aging); +- /* portmask - 54:48 */ +- reg[1] = FIELD_PREP(QCA8K_ATU_PORT_MASK, port_mask); +- /* mac - 47:0 */ +- reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR0_MASK, mac[0]); +- reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR1_MASK, mac[1]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR2_MASK, mac[2]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR3_MASK, mac[3]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR4_MASK, mac[4]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR5_MASK, mac[5]); +- +- /* load the array into the ARL table */ +- qca8k_bulk_write(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); +-} +- +-static int +-qca8k_fdb_access(struct qca8k_priv *priv, enum qca8k_fdb_cmd cmd, int port) +-{ +- u32 reg; +- int ret; +- +- /* Set the command and FDB index */ +- reg = QCA8K_ATU_FUNC_BUSY; +- reg |= cmd; +- if (port >= 0) { +- reg |= QCA8K_ATU_FUNC_PORT_EN; +- reg |= FIELD_PREP(QCA8K_ATU_FUNC_PORT_MASK, port); +- } +- +- /* Write the function register triggering the table access */ +- ret = qca8k_write(priv, QCA8K_REG_ATU_FUNC, reg); +- if (ret) +- return ret; +- +- /* wait for completion */ +- ret = qca8k_busy_wait(priv, QCA8K_REG_ATU_FUNC, QCA8K_ATU_FUNC_BUSY); +- if (ret) +- return ret; +- +- /* Check for table full violation when adding an entry */ +- if (cmd == QCA8K_FDB_LOAD) { +- ret = qca8k_read(priv, QCA8K_REG_ATU_FUNC, ®); +- if (ret < 0) +- return ret; +- if (reg & QCA8K_ATU_FUNC_FULL) +- return -1; +- } +- +- return 0; +-} +- +-static int +-qca8k_fdb_next(struct qca8k_priv *priv, struct qca8k_fdb *fdb, int port) +-{ +- int ret; +- +- qca8k_fdb_write(priv, fdb->vid, fdb->port_mask, fdb->mac, fdb->aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_NEXT, port); +- if (ret < 0) +- return ret; +- +- return qca8k_fdb_read(priv, fdb); +-} +- +-static int +-qca8k_fdb_add(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, +- u16 vid, u8 aging) +-{ +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_write(priv, vid, port_mask, mac, aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static int +-qca8k_fdb_del(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, u16 vid) +-{ +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_write(priv, vid, port_mask, mac, 0); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static void +-qca8k_fdb_flush(struct qca8k_priv *priv) +-{ +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_access(priv, QCA8K_FDB_FLUSH, -1); +- mutex_unlock(&priv->reg_mutex); +-} +- +-static int +-qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask, +- const u8 *mac, u16 vid) +-{ +- struct qca8k_fdb fdb = { 0 }; +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- +- qca8k_fdb_write(priv, vid, 0, mac, 0); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); +- if (ret < 0) +- goto exit; +- +- ret = qca8k_fdb_read(priv, &fdb); +- if (ret < 0) +- goto exit; +- +- /* Rule exist. Delete first */ +- if (!fdb.aging) { +- ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); +- if (ret) +- goto exit; +- } +- +- /* Add port to fdb portmask */ +- fdb.port_mask |= port_mask; +- +- qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- +-static int +-qca8k_fdb_search_and_del(struct qca8k_priv *priv, u8 port_mask, +- const u8 *mac, u16 vid) +-{ +- struct qca8k_fdb fdb = { 0 }; +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- +- qca8k_fdb_write(priv, vid, 0, mac, 0); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); +- if (ret < 0) +- goto exit; +- +- /* Rule doesn't exist. Why delete? */ +- if (!fdb.aging) { +- ret = -EINVAL; +- goto exit; +- } +- +- ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); +- if (ret) +- goto exit; +- +- /* Only port in the rule is this port. Don't re insert */ +- if (fdb.port_mask == port_mask) +- goto exit; +- +- /* Remove port from port mask */ +- fdb.port_mask &= ~port_mask; +- +- qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- +-static int +-qca8k_vlan_access(struct qca8k_priv *priv, enum qca8k_vlan_cmd cmd, u16 vid) +-{ +- u32 reg; +- int ret; +- +- /* Set the command and VLAN index */ +- reg = QCA8K_VTU_FUNC1_BUSY; +- reg |= cmd; +- reg |= FIELD_PREP(QCA8K_VTU_FUNC1_VID_MASK, vid); +- +- /* Write the function register triggering the table access */ +- ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC1, reg); +- if (ret) +- return ret; +- +- /* wait for completion */ +- ret = qca8k_busy_wait(priv, QCA8K_REG_VTU_FUNC1, QCA8K_VTU_FUNC1_BUSY); +- if (ret) +- return ret; +- +- /* Check for table full violation when adding an entry */ +- if (cmd == QCA8K_VLAN_LOAD) { +- ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC1, ®); +- if (ret < 0) +- return ret; +- if (reg & QCA8K_VTU_FUNC1_FULL) +- return -ENOMEM; +- } +- +- return 0; +-} +- +-static int +-qca8k_vlan_add(struct qca8k_priv *priv, u8 port, u16 vid, bool untagged) +-{ +- u32 reg; +- int ret; +- +- /* +- We do the right thing with VLAN 0 and treat it as untagged while +- preserving the tag on egress. +- */ +- if (vid == 0) +- return 0; +- +- mutex_lock(&priv->reg_mutex); +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); +- if (ret < 0) +- goto out; +- +- ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); +- if (ret < 0) +- goto out; +- reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; +- reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); +- if (untagged) +- reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(port); +- else +- reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(port); +- +- ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); +- if (ret) +- goto out; +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); +- +-out: +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static int +-qca8k_vlan_del(struct qca8k_priv *priv, u8 port, u16 vid) +-{ +- u32 reg, mask; +- int ret, i; +- bool del; +- +- mutex_lock(&priv->reg_mutex); +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); +- if (ret < 0) +- goto out; +- +- ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); +- if (ret < 0) +- goto out; +- reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); +- reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(port); +- +- /* Check if we're the last member to be removed */ +- del = true; +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- mask = QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(i); +- +- if ((reg & mask) != mask) { +- del = false; +- break; +- } +- } +- +- if (del) { +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_PURGE, vid); +- } else { +- ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); +- if (ret) +- goto out; +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); +- } +- +-out: +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static int +-qca8k_mib_init(struct qca8k_priv *priv) +-{ +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, +- QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, +- FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_FLUSH) | +- QCA8K_MIB_BUSY); +- if (ret) +- goto exit; +- +- ret = qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY); +- if (ret) +- goto exit; +- +- ret = regmap_set_bits(priv->regmap, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP); +- if (ret) +- goto exit; +- +- ret = qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- +-static void +-qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable) +-{ +- u32 mask = QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; +- +- /* Port 0 and 6 have no internal PHY */ +- if (port > 0 && port < 6) +- mask |= QCA8K_PORT_STATUS_LINK_AUTO; +- +- if (enable) +- regmap_set_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); +- else +- regmap_clear_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); +-} +- +-static int +-qca8k_phy_eth_busy_wait(struct qca8k_mgmt_eth_data *mgmt_eth_data, +- struct sk_buff *read_skb, u32 *val) +-{ +- struct sk_buff *skb = skb_copy(read_skb, GFP_KERNEL); +- bool ack; +- int ret; +- +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the copy pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(skb); +- +- ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- QCA8K_ETHERNET_TIMEOUT); +- +- ack = mgmt_eth_data->ack; +- +- if (ret <= 0) +- return -ETIMEDOUT; +- +- if (!ack) +- return -EINVAL; +- +- *val = mgmt_eth_data->data[0]; +- +- return 0; +-} +- +-static int +-qca8k_phy_eth_command(struct qca8k_priv *priv, bool read, int phy, +- int regnum, u16 data) +-{ +- struct sk_buff *write_skb, *clear_skb, *read_skb; +- struct qca8k_mgmt_eth_data *mgmt_eth_data; +- u32 write_val, clear_val = 0, val; +- struct net_device *mgmt_master; +- int ret, ret1; +- bool ack; +- +- if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) +- return -EINVAL; +- +- mgmt_eth_data = &priv->mgmt_eth_data; +- +- write_val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | +- QCA8K_MDIO_MASTER_PHY_ADDR(phy) | +- QCA8K_MDIO_MASTER_REG_ADDR(regnum); +- +- if (read) { +- write_val |= QCA8K_MDIO_MASTER_READ; +- } else { +- write_val |= QCA8K_MDIO_MASTER_WRITE; +- write_val |= QCA8K_MDIO_MASTER_DATA(data); +- } +- +- /* Prealloc all the needed skb before the lock */ +- write_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &write_val, +- QCA8K_ETHERNET_PHY_PRIORITY, sizeof(write_val)); +- if (!write_skb) +- return -ENOMEM; +- +- clear_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &clear_val, +- QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); +- if (!clear_skb) { +- ret = -ENOMEM; +- goto err_clear_skb; +- } +- +- read_skb = qca8k_alloc_mdio_header(MDIO_READ, QCA8K_MDIO_MASTER_CTRL, &clear_val, +- QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); +- if (!read_skb) { +- ret = -ENOMEM; +- goto err_read_skb; +- } +- +- /* Actually start the request: +- * 1. Send mdio master packet +- * 2. Busy Wait for mdio master command +- * 3. Get the data if we are reading +- * 4. Reset the mdio master (even with error) +- */ +- mutex_lock(&mgmt_eth_data->mutex); +- +- /* Check if mgmt_master is operational */ +- mgmt_master = priv->mgmt_master; +- if (!mgmt_master) { +- mutex_unlock(&mgmt_eth_data->mutex); +- ret = -EINVAL; +- goto err_mgmt_master; +- } +- +- read_skb->dev = mgmt_master; +- clear_skb->dev = mgmt_master; +- write_skb->dev = mgmt_master; +- +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the write pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(write_skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(write_skb); +- +- ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- QCA8K_ETHERNET_TIMEOUT); +- +- ack = mgmt_eth_data->ack; +- +- if (ret <= 0) { +- ret = -ETIMEDOUT; +- kfree_skb(read_skb); +- goto exit; +- } +- +- if (!ack) { +- ret = -EINVAL; +- kfree_skb(read_skb); +- goto exit; +- } +- +- ret = read_poll_timeout(qca8k_phy_eth_busy_wait, ret1, +- !(val & QCA8K_MDIO_MASTER_BUSY), 0, +- QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, +- mgmt_eth_data, read_skb, &val); +- +- if (ret < 0 && ret1 < 0) { +- ret = ret1; +- goto exit; +- } +- +- if (read) { +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the read pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(read_skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(read_skb); +- +- ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- QCA8K_ETHERNET_TIMEOUT); +- +- ack = mgmt_eth_data->ack; +- +- if (ret <= 0) { +- ret = -ETIMEDOUT; +- goto exit; +- } +- +- if (!ack) { +- ret = -EINVAL; +- goto exit; +- } +- +- ret = mgmt_eth_data->data[0] & QCA8K_MDIO_MASTER_DATA_MASK; +- } else { +- kfree_skb(read_skb); +- } +-exit: +- reinit_completion(&mgmt_eth_data->rw_done); +- +- /* Increment seq_num and set it in the clear pkt */ +- mgmt_eth_data->seq++; +- qca8k_mdio_header_fill_seq_num(clear_skb, mgmt_eth_data->seq); +- mgmt_eth_data->ack = false; +- +- dev_queue_xmit(clear_skb); +- +- wait_for_completion_timeout(&mgmt_eth_data->rw_done, +- QCA8K_ETHERNET_TIMEOUT); +- +- mutex_unlock(&mgmt_eth_data->mutex); +- +- return ret; +- +- /* Error handling before lock */ +-err_mgmt_master: +- kfree_skb(read_skb); +-err_read_skb: +- kfree_skb(clear_skb); +-err_clear_skb: +- kfree_skb(write_skb); +- +- return ret; +-} +- +-static u32 +-qca8k_port_to_phy(int port) +-{ +- /* From Andrew Lunn: +- * Port 0 has no internal phy. +- * Port 1 has an internal PHY at MDIO address 0. +- * Port 2 has an internal PHY at MDIO address 1. +- * ... +- * Port 5 has an internal PHY at MDIO address 4. +- * Port 6 has no internal PHY. +- */ +- +- return port - 1; +-} +- +-static int +-qca8k_mdio_busy_wait(struct mii_bus *bus, u32 reg, u32 mask) +-{ +- u16 r1, r2, page; +- u32 val; +- int ret, ret1; +- +- qca8k_split_addr(reg, &r1, &r2, &page); +- +- ret = read_poll_timeout(qca8k_mii_read32, ret1, !(val & mask), 0, +- QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, +- bus, 0x10 | r2, r1, &val); +- +- /* Check if qca8k_read has failed for a different reason +- * before returnting -ETIMEDOUT +- */ +- if (ret < 0 && ret1 < 0) +- return ret1; +- +- return ret; +-} +- +-static int +-qca8k_mdio_write(struct qca8k_priv *priv, int phy, int regnum, u16 data) +-{ +- struct mii_bus *bus = priv->bus; +- u16 r1, r2, page; +- u32 val; +- int ret; +- +- if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) +- return -EINVAL; +- +- val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | +- QCA8K_MDIO_MASTER_WRITE | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | +- QCA8K_MDIO_MASTER_REG_ADDR(regnum) | +- QCA8K_MDIO_MASTER_DATA(data); +- +- qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +- +- ret = qca8k_set_page(priv, page); +- if (ret) +- goto exit; +- +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); +- +- ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, +- QCA8K_MDIO_MASTER_BUSY); +- +-exit: +- /* even if the busy_wait timeouts try to clear the MASTER_EN */ +- qca8k_mii_write32(priv, 0x10 | r2, r1, 0); +- +- mutex_unlock(&bus->mdio_lock); +- +- return ret; +-} +- +-static int +-qca8k_mdio_read(struct qca8k_priv *priv, int phy, int regnum) +-{ +- struct mii_bus *bus = priv->bus; +- u16 r1, r2, page; +- u32 val; +- int ret; +- +- if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) +- return -EINVAL; +- +- val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | +- QCA8K_MDIO_MASTER_READ | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | +- QCA8K_MDIO_MASTER_REG_ADDR(regnum); +- +- qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); +- +- ret = qca8k_set_page(priv, page); +- if (ret) +- goto exit; +- +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); +- +- ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, +- QCA8K_MDIO_MASTER_BUSY); +- if (ret) +- goto exit; +- +- ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); +- +-exit: +- /* even if the busy_wait timeouts try to clear the MASTER_EN */ +- qca8k_mii_write32(priv, 0x10 | r2, r1, 0); +- +- mutex_unlock(&bus->mdio_lock); +- +- if (ret >= 0) +- ret = val & QCA8K_MDIO_MASTER_DATA_MASK; +- +- return ret; +-} +- +-static int +-qca8k_internal_mdio_write(struct mii_bus *slave_bus, int phy, int regnum, u16 data) +-{ +- struct qca8k_priv *priv = slave_bus->priv; +- int ret; +- +- /* Use mdio Ethernet when available, fallback to legacy one on error */ +- ret = qca8k_phy_eth_command(priv, false, phy, regnum, data); +- if (!ret) +- return 0; +- +- return qca8k_mdio_write(priv, phy, regnum, data); +-} +- +-static int +-qca8k_internal_mdio_read(struct mii_bus *slave_bus, int phy, int regnum) +-{ +- struct qca8k_priv *priv = slave_bus->priv; +- int ret; +- +- /* Use mdio Ethernet when available, fallback to legacy one on error */ +- ret = qca8k_phy_eth_command(priv, true, phy, regnum, 0); +- if (ret >= 0) +- return ret; +- +- ret = qca8k_mdio_read(priv, phy, regnum); +- +- if (ret < 0) +- return 0xffff; +- +- return ret; +-} +- +-static int +-qca8k_legacy_mdio_write(struct mii_bus *slave_bus, int port, int regnum, u16 data) +-{ +- port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; +- +- return qca8k_internal_mdio_write(slave_bus, port, regnum, data); +-} +- +-static int +-qca8k_legacy_mdio_read(struct mii_bus *slave_bus, int port, int regnum) +-{ +- port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; +- +- return qca8k_internal_mdio_read(slave_bus, port, regnum); +-} +- +-static int +-qca8k_mdio_register(struct qca8k_priv *priv) +-{ +- struct dsa_switch *ds = priv->ds; +- struct device_node *mdio; +- struct mii_bus *bus; +- +- bus = devm_mdiobus_alloc(ds->dev); +- if (!bus) +- return -ENOMEM; +- +- bus->priv = (void *)priv; +- snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d.%d", +- ds->dst->index, ds->index); +- bus->parent = ds->dev; +- bus->phy_mask = ~ds->phys_mii_mask; +- ds->slave_mii_bus = bus; +- +- /* Check if the devicetree declare the port:phy mapping */ +- mdio = of_get_child_by_name(priv->dev->of_node, "mdio"); +- if (of_device_is_available(mdio)) { +- bus->name = "qca8k slave mii"; +- bus->read = qca8k_internal_mdio_read; +- bus->write = qca8k_internal_mdio_write; +- return devm_of_mdiobus_register(priv->dev, bus, mdio); +- } +- +- /* If a mapping can't be found the legacy mapping is used, +- * using the qca8k_port_to_phy function +- */ +- bus->name = "qca8k-legacy slave mii"; +- bus->read = qca8k_legacy_mdio_read; +- bus->write = qca8k_legacy_mdio_write; +- return devm_mdiobus_register(priv->dev, bus); +-} +- +-static int +-qca8k_setup_mdio_bus(struct qca8k_priv *priv) +-{ +- u32 internal_mdio_mask = 0, external_mdio_mask = 0, reg; +- struct device_node *ports, *port; +- phy_interface_t mode; +- int err; +- +- ports = of_get_child_by_name(priv->dev->of_node, "ports"); +- if (!ports) +- ports = of_get_child_by_name(priv->dev->of_node, "ethernet-ports"); +- +- if (!ports) +- return -EINVAL; +- +- for_each_available_child_of_node(ports, port) { +- err = of_property_read_u32(port, "reg", ®); +- if (err) { +- of_node_put(port); +- of_node_put(ports); +- return err; +- } +- +- if (!dsa_is_user_port(priv->ds, reg)) +- continue; +- +- of_get_phy_mode(port, &mode); +- +- if (of_property_read_bool(port, "phy-handle") && +- mode != PHY_INTERFACE_MODE_INTERNAL) +- external_mdio_mask |= BIT(reg); +- else +- internal_mdio_mask |= BIT(reg); +- } +- +- of_node_put(ports); +- if (!external_mdio_mask && !internal_mdio_mask) { +- dev_err(priv->dev, "no PHYs are defined.\n"); +- return -EINVAL; +- } +- +- /* The QCA8K_MDIO_MASTER_EN Bit, which grants access to PHYs through +- * the MDIO_MASTER register also _disconnects_ the external MDC +- * passthrough to the internal PHYs. It's not possible to use both +- * configurations at the same time! +- * +- * Because this came up during the review process: +- * If the external mdio-bus driver is capable magically disabling +- * the QCA8K_MDIO_MASTER_EN and mutex/spin-locking out the qca8k's +- * accessors for the time being, it would be possible to pull this +- * off. +- */ +- if (!!external_mdio_mask && !!internal_mdio_mask) { +- dev_err(priv->dev, "either internal or external mdio bus configuration is supported.\n"); +- return -EINVAL; +- } +- +- if (external_mdio_mask) { +- /* Make sure to disable the internal mdio bus in cases +- * a dt-overlay and driver reload changed the configuration +- */ +- +- return regmap_clear_bits(priv->regmap, QCA8K_MDIO_MASTER_CTRL, +- QCA8K_MDIO_MASTER_EN); +- } +- +- return qca8k_mdio_register(priv); +-} +- +-static int +-qca8k_setup_mac_pwr_sel(struct qca8k_priv *priv) +-{ +- u32 mask = 0; +- int ret = 0; +- +- /* SoC specific settings for ipq8064. +- * If more device require this consider adding +- * a dedicated binding. +- */ +- if (of_machine_is_compatible("qcom,ipq8064")) +- mask |= QCA8K_MAC_PWR_RGMII0_1_8V; +- +- /* SoC specific settings for ipq8065 */ +- if (of_machine_is_compatible("qcom,ipq8065")) +- mask |= QCA8K_MAC_PWR_RGMII1_1_8V; +- +- if (mask) { +- ret = qca8k_rmw(priv, QCA8K_REG_MAC_PWR_SEL, +- QCA8K_MAC_PWR_RGMII0_1_8V | +- QCA8K_MAC_PWR_RGMII1_1_8V, +- mask); +- } +- +- return ret; +-} +- +-static int qca8k_find_cpu_port(struct dsa_switch *ds) +-{ +- struct qca8k_priv *priv = ds->priv; +- +- /* Find the connected cpu port. Valid port are 0 or 6 */ +- if (dsa_is_cpu_port(ds, 0)) +- return 0; +- +- dev_dbg(priv->dev, "port 0 is not the CPU port. Checking port 6"); +- +- if (dsa_is_cpu_port(ds, 6)) +- return 6; +- +- return -EINVAL; +-} +- +-static int +-qca8k_setup_of_pws_reg(struct qca8k_priv *priv) +-{ +- const struct qca8k_match_data *data = priv->info; +- struct device_node *node = priv->dev->of_node; +- u32 val = 0; +- int ret; +- +- /* QCA8327 require to set to the correct mode. +- * His bigger brother QCA8328 have the 172 pin layout. +- * Should be applied by default but we set this just to make sure. +- */ +- if (priv->switch_id == QCA8K_ID_QCA8327) { +- /* Set the correct package of 148 pin for QCA8327 */ +- if (data->reduced_package) +- val |= QCA8327_PWS_PACKAGE148_EN; +- +- ret = qca8k_rmw(priv, QCA8K_REG_PWS, QCA8327_PWS_PACKAGE148_EN, +- val); +- if (ret) +- return ret; +- } +- +- if (of_property_read_bool(node, "qca,ignore-power-on-sel")) +- val |= QCA8K_PWS_POWER_ON_SEL; +- +- if (of_property_read_bool(node, "qca,led-open-drain")) { +- if (!(val & QCA8K_PWS_POWER_ON_SEL)) { +- dev_err(priv->dev, "qca,led-open-drain require qca,ignore-power-on-sel to be set."); +- return -EINVAL; +- } +- +- val |= QCA8K_PWS_LED_OPEN_EN_CSR; +- } +- +- return qca8k_rmw(priv, QCA8K_REG_PWS, +- QCA8K_PWS_LED_OPEN_EN_CSR | QCA8K_PWS_POWER_ON_SEL, +- val); +-} +- +-static int +-qca8k_parse_port_config(struct qca8k_priv *priv) +-{ +- int port, cpu_port_index = -1, ret; +- struct device_node *port_dn; +- phy_interface_t mode; +- struct dsa_port *dp; +- u32 delay; +- +- /* We have 2 CPU port. Check them */ +- for (port = 0; port < QCA8K_NUM_PORTS; port++) { +- /* Skip every other port */ +- if (port != 0 && port != 6) +- continue; +- +- dp = dsa_to_port(priv->ds, port); +- port_dn = dp->dn; +- cpu_port_index++; +- +- if (!of_device_is_available(port_dn)) +- continue; +- +- ret = of_get_phy_mode(port_dn, &mode); +- if (ret) +- continue; +- +- switch (mode) { +- case PHY_INTERFACE_MODE_RGMII: +- case PHY_INTERFACE_MODE_RGMII_ID: +- case PHY_INTERFACE_MODE_RGMII_TXID: +- case PHY_INTERFACE_MODE_RGMII_RXID: +- case PHY_INTERFACE_MODE_SGMII: +- delay = 0; +- +- if (!of_property_read_u32(port_dn, "tx-internal-delay-ps", &delay)) +- /* Switch regs accept value in ns, convert ps to ns */ +- delay = delay / 1000; +- else if (mode == PHY_INTERFACE_MODE_RGMII_ID || +- mode == PHY_INTERFACE_MODE_RGMII_TXID) +- delay = 1; +- +- if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK, delay)) { +- dev_err(priv->dev, "rgmii tx delay is limited to a max value of 3ns, setting to the max value"); +- delay = 3; +- } +- +- priv->ports_config.rgmii_tx_delay[cpu_port_index] = delay; +- +- delay = 0; +- +- if (!of_property_read_u32(port_dn, "rx-internal-delay-ps", &delay)) +- /* Switch regs accept value in ns, convert ps to ns */ +- delay = delay / 1000; +- else if (mode == PHY_INTERFACE_MODE_RGMII_ID || +- mode == PHY_INTERFACE_MODE_RGMII_RXID) +- delay = 2; +- +- if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK, delay)) { +- dev_err(priv->dev, "rgmii rx delay is limited to a max value of 3ns, setting to the max value"); +- delay = 3; +- } +- +- priv->ports_config.rgmii_rx_delay[cpu_port_index] = delay; +- +- /* Skip sgmii parsing for rgmii* mode */ +- if (mode == PHY_INTERFACE_MODE_RGMII || +- mode == PHY_INTERFACE_MODE_RGMII_ID || +- mode == PHY_INTERFACE_MODE_RGMII_TXID || +- mode == PHY_INTERFACE_MODE_RGMII_RXID) +- break; +- +- if (of_property_read_bool(port_dn, "qca,sgmii-txclk-falling-edge")) +- priv->ports_config.sgmii_tx_clk_falling_edge = true; +- +- if (of_property_read_bool(port_dn, "qca,sgmii-rxclk-falling-edge")) +- priv->ports_config.sgmii_rx_clk_falling_edge = true; +- +- if (of_property_read_bool(port_dn, "qca,sgmii-enable-pll")) { +- priv->ports_config.sgmii_enable_pll = true; +- +- if (priv->switch_id == QCA8K_ID_QCA8327) { +- dev_err(priv->dev, "SGMII PLL should NOT be enabled for qca8327. Aborting enabling"); +- priv->ports_config.sgmii_enable_pll = false; +- } +- +- if (priv->switch_revision < 2) +- dev_warn(priv->dev, "SGMII PLL should NOT be enabled for qca8337 with revision 2 or more."); +- } +- +- break; +- default: +- continue; +- } +- } +- +- return 0; +-} +- +-static int +-qca8k_setup(struct dsa_switch *ds) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- int cpu_port, ret, i; +- u32 mask; +- +- cpu_port = qca8k_find_cpu_port(ds); +- if (cpu_port < 0) { +- dev_err(priv->dev, "No cpu port configured in both cpu port0 and port6"); +- return cpu_port; +- } +- +- /* Parse CPU port config to be later used in phy_link mac_config */ +- ret = qca8k_parse_port_config(priv); +- if (ret) +- return ret; +- +- ret = qca8k_setup_mdio_bus(priv); +- if (ret) +- return ret; +- +- ret = qca8k_setup_of_pws_reg(priv); +- if (ret) +- return ret; +- +- ret = qca8k_setup_mac_pwr_sel(priv); +- if (ret) +- return ret; +- +- /* Make sure MAC06 is disabled */ +- ret = regmap_clear_bits(priv->regmap, QCA8K_REG_PORT0_PAD_CTRL, +- QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN); +- if (ret) { +- dev_err(priv->dev, "failed disabling MAC06 exchange"); +- return ret; +- } +- +- /* Enable CPU Port */ +- ret = regmap_set_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, +- QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN); +- if (ret) { +- dev_err(priv->dev, "failed enabling CPU port"); +- return ret; +- } +- +- /* Enable MIB counters */ +- ret = qca8k_mib_init(priv); +- if (ret) +- dev_warn(priv->dev, "mib init failed"); +- +- /* Initial setup of all ports */ +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- /* Disable forwarding by default on all ports */ +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), +- QCA8K_PORT_LOOKUP_MEMBER, 0); +- if (ret) +- return ret; +- +- /* Enable QCA header mode on all cpu ports */ +- if (dsa_is_cpu_port(ds, i)) { +- ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(i), +- FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) | +- FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL)); +- if (ret) { +- dev_err(priv->dev, "failed enabling QCA header mode"); +- return ret; +- } +- } +- +- /* Disable MAC by default on all user ports */ +- if (dsa_is_user_port(ds, i)) +- qca8k_port_set_status(priv, i, 0); +- } +- +- /* Forward all unknown frames to CPU port for Linux processing +- * Notice that in multi-cpu config only one port should be set +- * for igmp, unknown, multicast and broadcast packet +- */ +- ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1, +- FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK, BIT(cpu_port)) | +- FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK, BIT(cpu_port)) | +- FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK, BIT(cpu_port)) | +- FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK, BIT(cpu_port))); +- if (ret) +- return ret; +- +- /* Setup connection between CPU port & user ports +- * Configure specific switch configuration for ports +- */ +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- /* CPU port gets connected to all user ports of the switch */ +- if (dsa_is_cpu_port(ds, i)) { +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), +- QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds)); +- if (ret) +- return ret; +- } +- +- /* Individual user ports get connected to CPU port only */ +- if (dsa_is_user_port(ds, i)) { +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), +- QCA8K_PORT_LOOKUP_MEMBER, +- BIT(cpu_port)); +- if (ret) +- return ret; +- +- /* Enable ARP Auto-learning by default */ +- ret = regmap_set_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(i), +- QCA8K_PORT_LOOKUP_LEARN); +- if (ret) +- return ret; +- +- /* For port based vlans to work we need to set the +- * default egress vid +- */ +- ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i), +- QCA8K_EGREES_VLAN_PORT_MASK(i), +- QCA8K_EGREES_VLAN_PORT(i, QCA8K_PORT_VID_DEF)); +- if (ret) +- return ret; +- +- ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i), +- QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) | +- QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF)); +- if (ret) +- return ret; +- } +- +- /* The port 5 of the qca8337 have some problem in flood condition. The +- * original legacy driver had some specific buffer and priority settings +- * for the different port suggested by the QCA switch team. Add this +- * missing settings to improve switch stability under load condition. +- * This problem is limited to qca8337 and other qca8k switch are not affected. +- */ +- if (priv->switch_id == QCA8K_ID_QCA8337) { +- switch (i) { +- /* The 2 CPU port and port 5 requires some different +- * priority than any other ports. +- */ +- case 0: +- case 5: +- case 6: +- mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x4) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x4) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI4(0x6) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI5(0x8) | +- QCA8K_PORT_HOL_CTRL0_EG_PORT(0x1e); +- break; +- default: +- mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x6) | +- QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x8) | +- QCA8K_PORT_HOL_CTRL0_EG_PORT(0x19); +- } +- qca8k_write(priv, QCA8K_REG_PORT_HOL_CTRL0(i), mask); +- +- mask = QCA8K_PORT_HOL_CTRL1_ING(0x6) | +- QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | +- QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | +- QCA8K_PORT_HOL_CTRL1_WRED_EN; +- qca8k_rmw(priv, QCA8K_REG_PORT_HOL_CTRL1(i), +- QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK | +- QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | +- QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | +- QCA8K_PORT_HOL_CTRL1_WRED_EN, +- mask); +- } +- } +- +- /* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */ +- if (priv->switch_id == QCA8K_ID_QCA8327) { +- mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) | +- QCA8K_GLOBAL_FC_GOL_XOFF_THRES(496); +- qca8k_rmw(priv, QCA8K_REG_GLOBAL_FC_THRESH, +- QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK | +- QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK, +- mask); +- } +- +- /* Setup our port MTUs to match power on defaults */ +- ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, ETH_FRAME_LEN + ETH_FCS_LEN); +- if (ret) +- dev_warn(priv->dev, "failed setting MTU settings"); +- +- /* Flush the FDB table */ +- qca8k_fdb_flush(priv); +- +- /* We don't have interrupts for link changes, so we need to poll */ +- ds->pcs_poll = true; +- +- /* Set min a max ageing value supported */ +- ds->ageing_time_min = 7000; +- ds->ageing_time_max = 458745000; +- +- /* Set max number of LAGs supported */ +- ds->num_lag_ids = QCA8K_NUM_LAGS; +- +- return 0; +-} +- +-static void +-qca8k_mac_config_setup_internal_delay(struct qca8k_priv *priv, int cpu_port_index, +- u32 reg) +-{ +- u32 delay, val = 0; +- int ret; +- +- /* Delay can be declared in 3 different way. +- * Mode to rgmii and internal-delay standard binding defined +- * rgmii-id or rgmii-tx/rx phy mode set. +- * The parse logic set a delay different than 0 only when one +- * of the 3 different way is used. In all other case delay is +- * not enabled. With ID or TX/RXID delay is enabled and set +- * to the default and recommended value. +- */ +- if (priv->ports_config.rgmii_tx_delay[cpu_port_index]) { +- delay = priv->ports_config.rgmii_tx_delay[cpu_port_index]; +- +- val |= QCA8K_PORT_PAD_RGMII_TX_DELAY(delay) | +- QCA8K_PORT_PAD_RGMII_TX_DELAY_EN; +- } +- +- if (priv->ports_config.rgmii_rx_delay[cpu_port_index]) { +- delay = priv->ports_config.rgmii_rx_delay[cpu_port_index]; +- +- val |= QCA8K_PORT_PAD_RGMII_RX_DELAY(delay) | +- QCA8K_PORT_PAD_RGMII_RX_DELAY_EN; +- } +- +- /* Set RGMII delay based on the selected values */ +- ret = qca8k_rmw(priv, reg, +- QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK | +- QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK | +- QCA8K_PORT_PAD_RGMII_TX_DELAY_EN | +- QCA8K_PORT_PAD_RGMII_RX_DELAY_EN, +- val); +- if (ret) +- dev_err(priv->dev, "Failed to set internal delay for CPU port%d", +- cpu_port_index == QCA8K_CPU_PORT0 ? 0 : 6); +-} +- +-static void +-qca8k_phylink_mac_config(struct dsa_switch *ds, int port, unsigned int mode, +- const struct phylink_link_state *state) +-{ +- struct qca8k_priv *priv = ds->priv; +- int cpu_port_index, ret; +- u32 reg, val; +- +- switch (port) { +- case 0: /* 1st CPU port */ +- if (state->interface != PHY_INTERFACE_MODE_RGMII && +- state->interface != PHY_INTERFACE_MODE_RGMII_ID && +- state->interface != PHY_INTERFACE_MODE_RGMII_TXID && +- state->interface != PHY_INTERFACE_MODE_RGMII_RXID && +- state->interface != PHY_INTERFACE_MODE_SGMII) +- return; +- +- reg = QCA8K_REG_PORT0_PAD_CTRL; +- cpu_port_index = QCA8K_CPU_PORT0; +- break; +- case 1: +- case 2: +- case 3: +- case 4: +- case 5: +- /* Internal PHY, nothing to do */ +- return; +- case 6: /* 2nd CPU port / external PHY */ +- if (state->interface != PHY_INTERFACE_MODE_RGMII && +- state->interface != PHY_INTERFACE_MODE_RGMII_ID && +- state->interface != PHY_INTERFACE_MODE_RGMII_TXID && +- state->interface != PHY_INTERFACE_MODE_RGMII_RXID && +- state->interface != PHY_INTERFACE_MODE_SGMII && +- state->interface != PHY_INTERFACE_MODE_1000BASEX) +- return; +- +- reg = QCA8K_REG_PORT6_PAD_CTRL; +- cpu_port_index = QCA8K_CPU_PORT6; +- break; +- default: +- dev_err(ds->dev, "%s: unsupported port: %i\n", __func__, port); +- return; +- } +- +- if (port != 6 && phylink_autoneg_inband(mode)) { +- dev_err(ds->dev, "%s: in-band negotiation unsupported\n", +- __func__); +- return; +- } +- +- switch (state->interface) { +- case PHY_INTERFACE_MODE_RGMII: +- case PHY_INTERFACE_MODE_RGMII_ID: +- case PHY_INTERFACE_MODE_RGMII_TXID: +- case PHY_INTERFACE_MODE_RGMII_RXID: +- qca8k_write(priv, reg, QCA8K_PORT_PAD_RGMII_EN); +- +- /* Configure rgmii delay */ +- qca8k_mac_config_setup_internal_delay(priv, cpu_port_index, reg); +- +- /* QCA8337 requires to set rgmii rx delay for all ports. +- * This is enabled through PORT5_PAD_CTRL for all ports, +- * rather than individual port registers. +- */ +- if (priv->switch_id == QCA8K_ID_QCA8337) +- qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, +- QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); +- break; +- case PHY_INTERFACE_MODE_SGMII: +- case PHY_INTERFACE_MODE_1000BASEX: +- /* Enable SGMII on the port */ +- qca8k_write(priv, reg, QCA8K_PORT_PAD_SGMII_EN); +- +- /* Enable/disable SerDes auto-negotiation as necessary */ +- ret = qca8k_read(priv, QCA8K_REG_PWS, &val); +- if (ret) +- return; +- if (phylink_autoneg_inband(mode)) +- val &= ~QCA8K_PWS_SERDES_AEN_DIS; +- else +- val |= QCA8K_PWS_SERDES_AEN_DIS; +- qca8k_write(priv, QCA8K_REG_PWS, val); +- +- /* Configure the SGMII parameters */ +- ret = qca8k_read(priv, QCA8K_REG_SGMII_CTRL, &val); +- if (ret) +- return; +- +- val |= QCA8K_SGMII_EN_SD; +- +- if (priv->ports_config.sgmii_enable_pll) +- val |= QCA8K_SGMII_EN_PLL | QCA8K_SGMII_EN_RX | +- QCA8K_SGMII_EN_TX; +- +- if (dsa_is_cpu_port(ds, port)) { +- /* CPU port, we're talking to the CPU MAC, be a PHY */ +- val &= ~QCA8K_SGMII_MODE_CTRL_MASK; +- val |= QCA8K_SGMII_MODE_CTRL_PHY; +- } else if (state->interface == PHY_INTERFACE_MODE_SGMII) { +- val &= ~QCA8K_SGMII_MODE_CTRL_MASK; +- val |= QCA8K_SGMII_MODE_CTRL_MAC; +- } else if (state->interface == PHY_INTERFACE_MODE_1000BASEX) { +- val &= ~QCA8K_SGMII_MODE_CTRL_MASK; +- val |= QCA8K_SGMII_MODE_CTRL_BASEX; +- } +- +- qca8k_write(priv, QCA8K_REG_SGMII_CTRL, val); +- +- /* From original code is reported port instability as SGMII also +- * require delay set. Apply advised values here or take them from DT. +- */ +- if (state->interface == PHY_INTERFACE_MODE_SGMII) +- qca8k_mac_config_setup_internal_delay(priv, cpu_port_index, reg); +- +- /* For qca8327/qca8328/qca8334/qca8338 sgmii is unique and +- * falling edge is set writing in the PORT0 PAD reg +- */ +- if (priv->switch_id == QCA8K_ID_QCA8327 || +- priv->switch_id == QCA8K_ID_QCA8337) +- reg = QCA8K_REG_PORT0_PAD_CTRL; +- +- val = 0; +- +- /* SGMII Clock phase configuration */ +- if (priv->ports_config.sgmii_rx_clk_falling_edge) +- val |= QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE; +- +- if (priv->ports_config.sgmii_tx_clk_falling_edge) +- val |= QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE; +- +- if (val) +- ret = qca8k_rmw(priv, reg, +- QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE | +- QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE, +- val); +- +- break; +- default: +- dev_err(ds->dev, "xMII mode %s not supported for port %d\n", +- phy_modes(state->interface), port); +- return; +- } +-} +- +-static void +-qca8k_phylink_validate(struct dsa_switch *ds, int port, +- unsigned long *supported, +- struct phylink_link_state *state) +-{ +- __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; +- +- switch (port) { +- case 0: /* 1st CPU port */ +- if (state->interface != PHY_INTERFACE_MODE_NA && +- state->interface != PHY_INTERFACE_MODE_RGMII && +- state->interface != PHY_INTERFACE_MODE_RGMII_ID && +- state->interface != PHY_INTERFACE_MODE_RGMII_TXID && +- state->interface != PHY_INTERFACE_MODE_RGMII_RXID && +- state->interface != PHY_INTERFACE_MODE_SGMII) +- goto unsupported; +- break; +- case 1: +- case 2: +- case 3: +- case 4: +- case 5: +- /* Internal PHY */ +- if (state->interface != PHY_INTERFACE_MODE_NA && +- state->interface != PHY_INTERFACE_MODE_GMII && +- state->interface != PHY_INTERFACE_MODE_INTERNAL) +- goto unsupported; +- break; +- case 6: /* 2nd CPU port / external PHY */ +- if (state->interface != PHY_INTERFACE_MODE_NA && +- state->interface != PHY_INTERFACE_MODE_RGMII && +- state->interface != PHY_INTERFACE_MODE_RGMII_ID && +- state->interface != PHY_INTERFACE_MODE_RGMII_TXID && +- state->interface != PHY_INTERFACE_MODE_RGMII_RXID && +- state->interface != PHY_INTERFACE_MODE_SGMII && +- state->interface != PHY_INTERFACE_MODE_1000BASEX) +- goto unsupported; +- break; +- default: +-unsupported: +- linkmode_zero(supported); +- return; +- } +- +- phylink_set_port_modes(mask); +- phylink_set(mask, Autoneg); +- +- phylink_set(mask, 1000baseT_Full); +- phylink_set(mask, 10baseT_Half); +- phylink_set(mask, 10baseT_Full); +- phylink_set(mask, 100baseT_Half); +- phylink_set(mask, 100baseT_Full); +- +- if (state->interface == PHY_INTERFACE_MODE_1000BASEX) +- phylink_set(mask, 1000baseX_Full); +- +- phylink_set(mask, Pause); +- phylink_set(mask, Asym_Pause); +- +- linkmode_and(supported, supported, mask); +- linkmode_and(state->advertising, state->advertising, mask); +-} +- +-static int +-qca8k_phylink_mac_link_state(struct dsa_switch *ds, int port, +- struct phylink_link_state *state) +-{ +- struct qca8k_priv *priv = ds->priv; +- u32 reg; +- int ret; +- +- ret = qca8k_read(priv, QCA8K_REG_PORT_STATUS(port), ®); +- if (ret < 0) +- return ret; +- +- state->link = !!(reg & QCA8K_PORT_STATUS_LINK_UP); +- state->an_complete = state->link; +- state->an_enabled = !!(reg & QCA8K_PORT_STATUS_LINK_AUTO); +- state->duplex = (reg & QCA8K_PORT_STATUS_DUPLEX) ? DUPLEX_FULL : +- DUPLEX_HALF; +- +- switch (reg & QCA8K_PORT_STATUS_SPEED) { +- case QCA8K_PORT_STATUS_SPEED_10: +- state->speed = SPEED_10; +- break; +- case QCA8K_PORT_STATUS_SPEED_100: +- state->speed = SPEED_100; +- break; +- case QCA8K_PORT_STATUS_SPEED_1000: +- state->speed = SPEED_1000; +- break; +- default: +- state->speed = SPEED_UNKNOWN; +- break; +- } +- +- state->pause = MLO_PAUSE_NONE; +- if (reg & QCA8K_PORT_STATUS_RXFLOW) +- state->pause |= MLO_PAUSE_RX; +- if (reg & QCA8K_PORT_STATUS_TXFLOW) +- state->pause |= MLO_PAUSE_TX; +- +- return 1; +-} +- +-static void +-qca8k_phylink_mac_link_down(struct dsa_switch *ds, int port, unsigned int mode, +- phy_interface_t interface) +-{ +- struct qca8k_priv *priv = ds->priv; +- +- qca8k_port_set_status(priv, port, 0); +-} +- +-static void +-qca8k_phylink_mac_link_up(struct dsa_switch *ds, int port, unsigned int mode, +- phy_interface_t interface, struct phy_device *phydev, +- int speed, int duplex, bool tx_pause, bool rx_pause) +-{ +- struct qca8k_priv *priv = ds->priv; +- u32 reg; +- +- if (phylink_autoneg_inband(mode)) { +- reg = QCA8K_PORT_STATUS_LINK_AUTO; +- } else { +- switch (speed) { +- case SPEED_10: +- reg = QCA8K_PORT_STATUS_SPEED_10; +- break; +- case SPEED_100: +- reg = QCA8K_PORT_STATUS_SPEED_100; +- break; +- case SPEED_1000: +- reg = QCA8K_PORT_STATUS_SPEED_1000; +- break; +- default: +- reg = QCA8K_PORT_STATUS_LINK_AUTO; +- break; +- } +- +- if (duplex == DUPLEX_FULL) +- reg |= QCA8K_PORT_STATUS_DUPLEX; +- +- if (rx_pause || dsa_is_cpu_port(ds, port)) +- reg |= QCA8K_PORT_STATUS_RXFLOW; +- +- if (tx_pause || dsa_is_cpu_port(ds, port)) +- reg |= QCA8K_PORT_STATUS_TXFLOW; +- } +- +- reg |= QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; +- +- qca8k_write(priv, QCA8K_REG_PORT_STATUS(port), reg); +-} +- +-static void +-qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data) +-{ +- struct qca8k_priv *priv = ds->priv; +- int i; +- +- if (stringset != ETH_SS_STATS) +- return; +- +- for (i = 0; i < priv->info->mib_count; i++) +- strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, +- ETH_GSTRING_LEN); +-} +- +-static void qca8k_mib_autocast_handler(struct dsa_switch *ds, struct sk_buff *skb) +-{ +- struct qca8k_mib_eth_data *mib_eth_data; +- struct qca8k_priv *priv = ds->priv; +- const struct qca8k_mib_desc *mib; +- struct mib_ethhdr *mib_ethhdr; +- int i, mib_len, offset = 0; +- u64 *data; +- u8 port; +- +- mib_ethhdr = (struct mib_ethhdr *)skb_mac_header(skb); +- mib_eth_data = &priv->mib_eth_data; +- +- /* The switch autocast every port. Ignore other packet and +- * parse only the requested one. +- */ +- port = FIELD_GET(QCA_HDR_RECV_SOURCE_PORT, ntohs(mib_ethhdr->hdr)); +- if (port != mib_eth_data->req_port) +- goto exit; +- +- data = mib_eth_data->data; +- +- for (i = 0; i < priv->info->mib_count; i++) { +- mib = &ar8327_mib[i]; +- +- /* First 3 mib are present in the skb head */ +- if (i < 3) { +- data[i] = mib_ethhdr->data[i]; +- continue; +- } +- +- mib_len = sizeof(uint32_t); +- +- /* Some mib are 64 bit wide */ +- if (mib->size == 2) +- mib_len = sizeof(uint64_t); +- +- /* Copy the mib value from packet to the */ +- memcpy(data + i, skb->data + offset, mib_len); +- +- /* Set the offset for the next mib */ +- offset += mib_len; +- } +- +-exit: +- /* Complete on receiving all the mib packet */ +- if (refcount_dec_and_test(&mib_eth_data->port_parsed)) +- complete(&mib_eth_data->rw_done); +-} +- +-static int +-qca8k_get_ethtool_stats_eth(struct dsa_switch *ds, int port, u64 *data) +-{ +- struct dsa_port *dp = dsa_to_port(ds, port); +- struct qca8k_mib_eth_data *mib_eth_data; +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- mib_eth_data = &priv->mib_eth_data; +- +- mutex_lock(&mib_eth_data->mutex); +- +- reinit_completion(&mib_eth_data->rw_done); +- +- mib_eth_data->req_port = dp->index; +- mib_eth_data->data = data; +- refcount_set(&mib_eth_data->port_parsed, QCA8K_NUM_PORTS); +- +- mutex_lock(&priv->reg_mutex); +- +- /* Send mib autocast request */ +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, +- QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, +- FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_CAST) | +- QCA8K_MIB_BUSY); +- +- mutex_unlock(&priv->reg_mutex); +- +- if (ret) +- goto exit; +- +- ret = wait_for_completion_timeout(&mib_eth_data->rw_done, QCA8K_ETHERNET_TIMEOUT); +- +-exit: +- mutex_unlock(&mib_eth_data->mutex); +- +- return ret; +-} +- +-static void +-qca8k_get_ethtool_stats(struct dsa_switch *ds, int port, +- uint64_t *data) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- const struct qca8k_mib_desc *mib; +- u32 reg, i, val; +- u32 hi = 0; +- int ret; +- +- if (priv->mgmt_master && priv->info->ops->autocast_mib && +- priv->info->ops->autocast_mib(ds, port, data) > 0) +- return; +- +- for (i = 0; i < priv->info->mib_count; i++) { +- mib = &ar8327_mib[i]; +- reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; +- +- ret = qca8k_read(priv, reg, &val); +- if (ret < 0) +- continue; +- +- if (mib->size == 2) { +- ret = qca8k_read(priv, reg + 4, &hi); +- if (ret < 0) +- continue; +- } +- +- data[i] = val; +- if (mib->size == 2) +- data[i] |= (u64)hi << 32; +- } +-} +- +-static int +-qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset) +-{ +- struct qca8k_priv *priv = ds->priv; +- +- if (sset != ETH_SS_STATS) +- return 0; +- +- return priv->info->mib_count; +-} +- +-static int +-qca8k_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *eee) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u32 lpi_en = QCA8K_REG_EEE_CTRL_LPI_EN(port); +- u32 reg; +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- ret = qca8k_read(priv, QCA8K_REG_EEE_CTRL, ®); +- if (ret < 0) +- goto exit; +- +- if (eee->eee_enabled) +- reg |= lpi_en; +- else +- reg &= ~lpi_en; +- ret = qca8k_write(priv, QCA8K_REG_EEE_CTRL, reg); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- +-static int +-qca8k_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e) +-{ +- /* Nothing to do on the port's MAC */ +- return 0; +-} +- +-static void +-qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u32 stp_state; +- +- switch (state) { +- case BR_STATE_DISABLED: +- stp_state = QCA8K_PORT_LOOKUP_STATE_DISABLED; +- break; +- case BR_STATE_BLOCKING: +- stp_state = QCA8K_PORT_LOOKUP_STATE_BLOCKING; +- break; +- case BR_STATE_LISTENING: +- stp_state = QCA8K_PORT_LOOKUP_STATE_LISTENING; +- break; +- case BR_STATE_LEARNING: +- stp_state = QCA8K_PORT_LOOKUP_STATE_LEARNING; +- break; +- case BR_STATE_FORWARDING: +- default: +- stp_state = QCA8K_PORT_LOOKUP_STATE_FORWARD; +- break; +- } +- +- qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_STATE_MASK, stp_state); +-} +- +-static int +-qca8k_port_bridge_join(struct dsa_switch *ds, int port, struct net_device *br) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- int port_mask, cpu_port; +- int i, ret; +- +- cpu_port = dsa_to_port(ds, port)->cpu_dp->index; +- port_mask = BIT(cpu_port); +- +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- if (dsa_is_cpu_port(ds, i)) +- continue; +- if (dsa_to_port(ds, i)->bridge_dev != br) +- continue; +- /* Add this port to the portvlan mask of the other ports +- * in the bridge +- */ +- ret = regmap_set_bits(priv->regmap, +- QCA8K_PORT_LOOKUP_CTRL(i), +- BIT(port)); +- if (ret) +- return ret; +- if (i != port) +- port_mask |= BIT(i); +- } +- +- /* Add all other ports to this ports portvlan mask */ +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_MEMBER, port_mask); +- +- return ret; +-} +- +-static void +-qca8k_port_bridge_leave(struct dsa_switch *ds, int port, struct net_device *br) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- int cpu_port, i; +- +- cpu_port = dsa_to_port(ds, port)->cpu_dp->index; +- +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- if (dsa_is_cpu_port(ds, i)) +- continue; +- if (dsa_to_port(ds, i)->bridge_dev != br) +- continue; +- /* Remove this port to the portvlan mask of the other ports +- * in the bridge +- */ +- regmap_clear_bits(priv->regmap, +- QCA8K_PORT_LOOKUP_CTRL(i), +- BIT(port)); +- } +- +- /* Set the cpu port to be the only one in the portvlan mask of +- * this port +- */ +- qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port)); +-} +- +-static void +-qca8k_port_fast_age(struct dsa_switch *ds, int port) +-{ +- struct qca8k_priv *priv = ds->priv; +- +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_access(priv, QCA8K_FDB_FLUSH_PORT, port); +- mutex_unlock(&priv->reg_mutex); +-} +- +-static int +-qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs) +-{ +- struct qca8k_priv *priv = ds->priv; +- unsigned int secs = msecs / 1000; +- u32 val; +- +- /* AGE_TIME reg is set in 7s step */ +- val = secs / 7; +- +- /* Handle case with 0 as val to NOT disable +- * learning +- */ +- if (!val) +- val = 1; +- +- return regmap_update_bits(priv->regmap, QCA8K_REG_ATU_CTRL, QCA8K_ATU_AGE_TIME_MASK, +- QCA8K_ATU_AGE_TIME(val)); +-} +- +-static int +-qca8k_port_enable(struct dsa_switch *ds, int port, +- struct phy_device *phy) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- +- qca8k_port_set_status(priv, port, 1); +- priv->port_enabled_map |= BIT(port); +- +- if (dsa_is_user_port(ds, port)) +- phy_support_asym_pause(phy); +- +- return 0; +-} +- +-static void +-qca8k_port_disable(struct dsa_switch *ds, int port) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- +- qca8k_port_set_status(priv, port, 0); +- priv->port_enabled_map &= ~BIT(port); +-} +- +-static int +-qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- /* We have only have a general MTU setting. +- * DSA always set the CPU port's MTU to the largest MTU of the slave +- * ports. +- * Setting MTU just for the CPU port is sufficient to correctly set a +- * value for every port. +- */ +- if (!dsa_is_cpu_port(ds, port)) +- return 0; +- +- /* To change the MAX_FRAME_SIZE the cpu ports must be off or +- * the switch panics. +- * Turn off both cpu ports before applying the new value to prevent +- * this. +- */ +- if (priv->port_enabled_map & BIT(0)) +- qca8k_port_set_status(priv, 0, 0); +- +- if (priv->port_enabled_map & BIT(6)) +- qca8k_port_set_status(priv, 6, 0); +- +- /* Include L2 header / FCS length */ +- ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ETH_HLEN + ETH_FCS_LEN); +- +- if (priv->port_enabled_map & BIT(0)) +- qca8k_port_set_status(priv, 0, 1); +- +- if (priv->port_enabled_map & BIT(6)) +- qca8k_port_set_status(priv, 6, 1); +- +- return ret; +-} +- +-static int +-qca8k_port_max_mtu(struct dsa_switch *ds, int port) +-{ +- return QCA8K_MAX_MTU; +-} +- +-static int +-qca8k_port_fdb_insert(struct qca8k_priv *priv, const u8 *addr, +- u16 port_mask, u16 vid) +-{ +- /* Set the vid to the port vlan id if no vid is set */ +- if (!vid) +- vid = QCA8K_PORT_VID_DEF; +- +- return qca8k_fdb_add(priv, addr, port_mask, vid, +- QCA8K_ATU_STATUS_STATIC); +-} +- +-static int +-qca8k_port_fdb_add(struct dsa_switch *ds, int port, +- const unsigned char *addr, u16 vid) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u16 port_mask = BIT(port); +- +- return qca8k_port_fdb_insert(priv, addr, port_mask, vid); +-} +- +-static int +-qca8k_port_fdb_del(struct dsa_switch *ds, int port, +- const unsigned char *addr, u16 vid) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u16 port_mask = BIT(port); +- +- if (!vid) +- vid = QCA8K_PORT_VID_DEF; +- +- return qca8k_fdb_del(priv, addr, port_mask, vid); +-} +- +-static int +-qca8k_port_fdb_dump(struct dsa_switch *ds, int port, +- dsa_fdb_dump_cb_t *cb, void *data) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- struct qca8k_fdb _fdb = { 0 }; +- int cnt = QCA8K_NUM_FDB_RECORDS; +- bool is_static; +- int ret = 0; +- +- mutex_lock(&priv->reg_mutex); +- while (cnt-- && !qca8k_fdb_next(priv, &_fdb, port)) { +- if (!_fdb.aging) +- break; +- is_static = (_fdb.aging == QCA8K_ATU_STATUS_STATIC); +- ret = cb(_fdb.mac, _fdb.vid, is_static, data); +- if (ret) +- break; +- } +- mutex_unlock(&priv->reg_mutex); +- +- return 0; +-} +- +-static int +-qca8k_port_mdb_add(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_mdb *mdb) +-{ +- struct qca8k_priv *priv = ds->priv; +- const u8 *addr = mdb->addr; +- u16 vid = mdb->vid; +- +- return qca8k_fdb_search_and_insert(priv, BIT(port), addr, vid); +-} +- +-static int +-qca8k_port_mdb_del(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_mdb *mdb) +-{ +- struct qca8k_priv *priv = ds->priv; +- const u8 *addr = mdb->addr; +- u16 vid = mdb->vid; +- +- return qca8k_fdb_search_and_del(priv, BIT(port), addr, vid); +-} +- +-static int +-qca8k_port_mirror_add(struct dsa_switch *ds, int port, +- struct dsa_mall_mirror_tc_entry *mirror, +- bool ingress) +-{ +- struct qca8k_priv *priv = ds->priv; +- int monitor_port, ret; +- u32 reg, val; +- +- /* Check for existent entry */ +- if ((ingress ? priv->mirror_rx : priv->mirror_tx) & BIT(port)) +- return -EEXIST; +- +- ret = regmap_read(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, &val); +- if (ret) +- return ret; +- +- /* QCA83xx can have only one port set to mirror mode. +- * Check that the correct port is requested and return error otherwise. +- * When no mirror port is set, the values is set to 0xF +- */ +- monitor_port = FIELD_GET(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); +- if (monitor_port != 0xF && monitor_port != mirror->to_local_port) +- return -EEXIST; +- +- /* Set the monitor port */ +- val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, +- mirror->to_local_port); +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, +- QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); +- if (ret) +- return ret; +- +- if (ingress) { +- reg = QCA8K_PORT_LOOKUP_CTRL(port); +- val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; +- } else { +- reg = QCA8K_REG_PORT_HOL_CTRL1(port); +- val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; +- } +- +- ret = regmap_update_bits(priv->regmap, reg, val, val); +- if (ret) +- return ret; +- +- /* Track mirror port for tx and rx to decide when the +- * mirror port has to be disabled. +- */ +- if (ingress) +- priv->mirror_rx |= BIT(port); +- else +- priv->mirror_tx |= BIT(port); +- +- return 0; +-} +- +-static void +-qca8k_port_mirror_del(struct dsa_switch *ds, int port, +- struct dsa_mall_mirror_tc_entry *mirror) +-{ +- struct qca8k_priv *priv = ds->priv; +- u32 reg, val; +- int ret; +- +- if (mirror->ingress) { +- reg = QCA8K_PORT_LOOKUP_CTRL(port); +- val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; +- } else { +- reg = QCA8K_REG_PORT_HOL_CTRL1(port); +- val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; +- } +- +- ret = regmap_clear_bits(priv->regmap, reg, val); +- if (ret) +- goto err; +- +- if (mirror->ingress) +- priv->mirror_rx &= ~BIT(port); +- else +- priv->mirror_tx &= ~BIT(port); +- +- /* No port set to send packet to mirror port. Disable mirror port */ +- if (!priv->mirror_rx && !priv->mirror_tx) { +- val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, 0xF); +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, +- QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); +- if (ret) +- goto err; +- } +-err: +- dev_err(priv->dev, "Failed to del mirror port from %d", port); +-} +- +-static int +-qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, +- struct netlink_ext_ack *extack) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- if (vlan_filtering) { +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, +- QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE); +- } else { +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, +- QCA8K_PORT_LOOKUP_VLAN_MODE_NONE); +- } +- +- return ret; +-} +- +-static int +-qca8k_port_vlan_add(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_vlan *vlan, +- struct netlink_ext_ack *extack) +-{ +- bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; +- bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID; +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- ret = qca8k_vlan_add(priv, port, vlan->vid, untagged); +- if (ret) { +- dev_err(priv->dev, "Failed to add VLAN to port %d (%d)", port, ret); +- return ret; +- } +- +- if (pvid) { +- ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port), +- QCA8K_EGREES_VLAN_PORT_MASK(port), +- QCA8K_EGREES_VLAN_PORT(port, vlan->vid)); +- if (ret) +- return ret; +- +- ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port), +- QCA8K_PORT_VLAN_CVID(vlan->vid) | +- QCA8K_PORT_VLAN_SVID(vlan->vid)); +- } +- +- return ret; +-} +- +-static int +-qca8k_port_vlan_del(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_vlan *vlan) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- ret = qca8k_vlan_del(priv, port, vlan->vid); +- if (ret) +- dev_err(priv->dev, "Failed to delete VLAN from port %d (%d)", port, ret); +- +- return ret; +-} +- +-static u32 qca8k_get_phy_flags(struct dsa_switch *ds, int port) +-{ +- struct qca8k_priv *priv = ds->priv; +- +- /* Communicate to the phy internal driver the switch revision. +- * Based on the switch revision different values needs to be +- * set to the dbg and mmd reg on the phy. +- * The first 2 bit are used to communicate the switch revision +- * to the phy driver. +- */ +- if (port > 0 && port < 6) +- return priv->switch_revision; +- +- return 0; +-} +- +-static enum dsa_tag_protocol +-qca8k_get_tag_protocol(struct dsa_switch *ds, int port, +- enum dsa_tag_protocol mp) +-{ +- return DSA_TAG_PROTO_QCA; +-} +- +-static bool +-qca8k_lag_can_offload(struct dsa_switch *ds, +- struct net_device *lag, +- struct netdev_lag_upper_info *info) +-{ +- struct dsa_port *dp; +- int id, members = 0; +- +- id = dsa_lag_id(ds->dst, lag); +- if (id < 0 || id >= ds->num_lag_ids) +- return false; +- +- dsa_lag_foreach_port(dp, ds->dst, lag) +- /* Includes the port joining the LAG */ +- members++; +- +- if (members > QCA8K_NUM_PORTS_FOR_LAG) +- return false; +- +- if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) +- return false; +- +- if (info->hash_type != NETDEV_LAG_HASH_L2 && +- info->hash_type != NETDEV_LAG_HASH_L23) +- return false; +- +- return true; +-} +- +-static int +-qca8k_lag_setup_hash(struct dsa_switch *ds, +- struct net_device *lag, +- struct netdev_lag_upper_info *info) +-{ +- struct qca8k_priv *priv = ds->priv; +- bool unique_lag = true; +- u32 hash = 0; +- int i, id; +- +- id = dsa_lag_id(ds->dst, lag); +- +- switch (info->hash_type) { +- case NETDEV_LAG_HASH_L23: +- hash |= QCA8K_TRUNK_HASH_SIP_EN; +- hash |= QCA8K_TRUNK_HASH_DIP_EN; +- fallthrough; +- case NETDEV_LAG_HASH_L2: +- hash |= QCA8K_TRUNK_HASH_SA_EN; +- hash |= QCA8K_TRUNK_HASH_DA_EN; +- break; +- default: /* We should NEVER reach this */ +- return -EOPNOTSUPP; +- } +- +- /* Check if we are the unique configured LAG */ +- dsa_lags_foreach_id(i, ds->dst) +- if (i != id && dsa_lag_dev(ds->dst, i)) { +- unique_lag = false; +- break; +- } +- +- /* Hash Mode is global. Make sure the same Hash Mode +- * is set to all the 4 possible lag. +- * If we are the unique LAG we can set whatever hash +- * mode we want. +- * To change hash mode it's needed to remove all LAG +- * and change the mode with the latest. +- */ +- if (unique_lag) { +- priv->lag_hash_mode = hash; +- } else if (priv->lag_hash_mode != hash) { +- netdev_err(lag, "Error: Mismateched Hash Mode across different lag is not supported\n"); +- return -EOPNOTSUPP; +- } +- +- return regmap_update_bits(priv->regmap, QCA8K_TRUNK_HASH_EN_CTRL, +- QCA8K_TRUNK_HASH_MASK, hash); +-} +- +-static int +-qca8k_lag_refresh_portmap(struct dsa_switch *ds, int port, +- struct net_device *lag, bool delete) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret, id, i; +- u32 val; +- +- id = dsa_lag_id(ds->dst, lag); +- +- /* Read current port member */ +- ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, &val); +- if (ret) +- return ret; +- +- /* Shift val to the correct trunk */ +- val >>= QCA8K_REG_GOL_TRUNK_SHIFT(id); +- val &= QCA8K_REG_GOL_TRUNK_MEMBER_MASK; +- if (delete) +- val &= ~BIT(port); +- else +- val |= BIT(port); +- +- /* Update port member. With empty portmap disable trunk */ +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, +- QCA8K_REG_GOL_TRUNK_MEMBER(id) | +- QCA8K_REG_GOL_TRUNK_EN(id), +- !val << QCA8K_REG_GOL_TRUNK_SHIFT(id) | +- val << QCA8K_REG_GOL_TRUNK_SHIFT(id)); +- +- /* Search empty member if adding or port on deleting */ +- for (i = 0; i < QCA8K_NUM_PORTS_FOR_LAG; i++) { +- ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), &val); +- if (ret) +- return ret; +- +- val >>= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i); +- val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_MASK; +- +- if (delete) { +- /* If port flagged to be disabled assume this member is +- * empty +- */ +- if (val != QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) +- continue; +- +- val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK; +- if (val != port) +- continue; +- } else { +- /* If port flagged to be enabled assume this member is +- * already set +- */ +- if (val == QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) +- continue; +- } +- +- /* We have found the member to add/remove */ +- break; +- } +- +- /* Set port in the correct port mask or disable port if in delete mode */ +- return regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), +- QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN(id, i) | +- QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT(id, i), +- !delete << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i) | +- port << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i)); +-} +- +-static int +-qca8k_port_lag_join(struct dsa_switch *ds, int port, +- struct net_device *lag, +- struct netdev_lag_upper_info *info) +-{ +- int ret; +- +- if (!qca8k_lag_can_offload(ds, lag, info)) +- return -EOPNOTSUPP; +- +- ret = qca8k_lag_setup_hash(ds, lag, info); +- if (ret) +- return ret; +- +- return qca8k_lag_refresh_portmap(ds, port, lag, false); +-} +- +-static int +-qca8k_port_lag_leave(struct dsa_switch *ds, int port, +- struct net_device *lag) +-{ +- return qca8k_lag_refresh_portmap(ds, port, lag, true); +-} +- +-static void +-qca8k_master_change(struct dsa_switch *ds, const struct net_device *master, +- bool operational) +-{ +- struct dsa_port *dp = master->dsa_ptr; +- struct qca8k_priv *priv = ds->priv; +- +- /* Ethernet MIB/MDIO is only supported for CPU port 0 */ +- if (dp->index != 0) +- return; +- +- mutex_lock(&priv->mgmt_eth_data.mutex); +- mutex_lock(&priv->mib_eth_data.mutex); +- +- priv->mgmt_master = operational ? (struct net_device *)master : NULL; +- +- mutex_unlock(&priv->mib_eth_data.mutex); +- mutex_unlock(&priv->mgmt_eth_data.mutex); +-} +- +-static int qca8k_connect_tag_protocol(struct dsa_switch *ds, +- enum dsa_tag_protocol proto) +-{ +- struct qca_tagger_data *tagger_data; +- +- switch (proto) { +- case DSA_TAG_PROTO_QCA: +- tagger_data = ds->tagger_data; +- +- tagger_data->rw_reg_ack_handler = qca8k_rw_reg_ack_handler; +- tagger_data->mib_autocast_handler = qca8k_mib_autocast_handler; +- +- break; +- default: +- return -EOPNOTSUPP; +- } +- +- return 0; +-} +- +-static const struct dsa_switch_ops qca8k_switch_ops = { +- .get_tag_protocol = qca8k_get_tag_protocol, +- .setup = qca8k_setup, +- .get_strings = qca8k_get_strings, +- .get_ethtool_stats = qca8k_get_ethtool_stats, +- .get_sset_count = qca8k_get_sset_count, +- .set_ageing_time = qca8k_set_ageing_time, +- .get_mac_eee = qca8k_get_mac_eee, +- .set_mac_eee = qca8k_set_mac_eee, +- .port_enable = qca8k_port_enable, +- .port_disable = qca8k_port_disable, +- .port_change_mtu = qca8k_port_change_mtu, +- .port_max_mtu = qca8k_port_max_mtu, +- .port_stp_state_set = qca8k_port_stp_state_set, +- .port_bridge_join = qca8k_port_bridge_join, +- .port_bridge_leave = qca8k_port_bridge_leave, +- .port_fast_age = qca8k_port_fast_age, +- .port_fdb_add = qca8k_port_fdb_add, +- .port_fdb_del = qca8k_port_fdb_del, +- .port_fdb_dump = qca8k_port_fdb_dump, +- .port_mdb_add = qca8k_port_mdb_add, +- .port_mdb_del = qca8k_port_mdb_del, +- .port_mirror_add = qca8k_port_mirror_add, +- .port_mirror_del = qca8k_port_mirror_del, +- .port_vlan_filtering = qca8k_port_vlan_filtering, +- .port_vlan_add = qca8k_port_vlan_add, +- .port_vlan_del = qca8k_port_vlan_del, +- .phylink_validate = qca8k_phylink_validate, +- .phylink_mac_link_state = qca8k_phylink_mac_link_state, +- .phylink_mac_config = qca8k_phylink_mac_config, +- .phylink_mac_link_down = qca8k_phylink_mac_link_down, +- .phylink_mac_link_up = qca8k_phylink_mac_link_up, +- .get_phy_flags = qca8k_get_phy_flags, +- .port_lag_join = qca8k_port_lag_join, +- .port_lag_leave = qca8k_port_lag_leave, +- .master_state_change = qca8k_master_change, +- .connect_tag_protocol = qca8k_connect_tag_protocol, +-}; +- +-static int qca8k_read_switch_id(struct qca8k_priv *priv) +-{ +- u32 val; +- u8 id; +- int ret; +- +- if (!priv->info) +- return -ENODEV; +- +- ret = qca8k_read(priv, QCA8K_REG_MASK_CTRL, &val); +- if (ret < 0) +- return -ENODEV; +- +- id = QCA8K_MASK_CTRL_DEVICE_ID(val); +- if (id != priv->info->id) { +- dev_err(priv->dev, +- "Switch id detected %x but expected %x", +- id, priv->info->id); +- return -ENODEV; +- } +- +- priv->switch_id = id; +- +- /* Save revision to communicate to the internal PHY driver */ +- priv->switch_revision = QCA8K_MASK_CTRL_REV_ID(val); +- +- return 0; +-} +- +-static int +-qca8k_sw_probe(struct mdio_device *mdiodev) +-{ +- struct qca8k_priv *priv; +- int ret; +- +- /* allocate the private data struct so that we can probe the switches +- * ID register +- */ +- priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL); +- if (!priv) +- return -ENOMEM; +- +- priv->info = of_device_get_match_data(priv->dev); +- priv->bus = mdiodev->bus; +- priv->dev = &mdiodev->dev; +- +- priv->reset_gpio = devm_gpiod_get_optional(priv->dev, "reset", +- GPIOD_ASIS); +- if (IS_ERR(priv->reset_gpio)) +- return PTR_ERR(priv->reset_gpio); +- +- if (priv->reset_gpio) { +- gpiod_set_value_cansleep(priv->reset_gpio, 1); +- /* The active low duration must be greater than 10 ms +- * and checkpatch.pl wants 20 ms. +- */ +- msleep(20); +- gpiod_set_value_cansleep(priv->reset_gpio, 0); +- } +- +- /* Start by setting up the register mapping */ +- priv->regmap = devm_regmap_init(&mdiodev->dev, NULL, priv, +- &qca8k_regmap_config); +- if (IS_ERR(priv->regmap)) { +- dev_err(priv->dev, "regmap initialization failed"); +- return PTR_ERR(priv->regmap); +- } +- +- priv->mdio_cache.page = 0xffff; +- priv->mdio_cache.lo = 0xffff; +- priv->mdio_cache.hi = 0xffff; +- +- /* Check the detected switch id */ +- ret = qca8k_read_switch_id(priv); +- if (ret) +- return ret; +- +- priv->ds = devm_kzalloc(&mdiodev->dev, sizeof(*priv->ds), GFP_KERNEL); +- if (!priv->ds) +- return -ENOMEM; +- +- mutex_init(&priv->mgmt_eth_data.mutex); +- init_completion(&priv->mgmt_eth_data.rw_done); +- +- mutex_init(&priv->mib_eth_data.mutex); +- init_completion(&priv->mib_eth_data.rw_done); +- +- priv->ds->dev = &mdiodev->dev; +- priv->ds->num_ports = QCA8K_NUM_PORTS; +- priv->ds->priv = priv; +- priv->ds->ops = &qca8k_switch_ops; +- mutex_init(&priv->reg_mutex); +- dev_set_drvdata(&mdiodev->dev, priv); +- +- return dsa_register_switch(priv->ds); +-} +- +-static void +-qca8k_sw_remove(struct mdio_device *mdiodev) +-{ +- struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev); +- int i; +- +- if (!priv) +- return; +- +- for (i = 0; i < QCA8K_NUM_PORTS; i++) +- qca8k_port_set_status(priv, i, 0); +- +- dsa_unregister_switch(priv->ds); +- +- dev_set_drvdata(&mdiodev->dev, NULL); +-} +- +-static void qca8k_sw_shutdown(struct mdio_device *mdiodev) +-{ +- struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev); +- +- if (!priv) +- return; +- +- dsa_switch_shutdown(priv->ds); +- +- dev_set_drvdata(&mdiodev->dev, NULL); +-} +- +-#ifdef CONFIG_PM_SLEEP +-static void +-qca8k_set_pm(struct qca8k_priv *priv, int enable) +-{ +- int port; +- +- for (port = 0; port < QCA8K_NUM_PORTS; port++) { +- /* Do not enable on resume if the port was +- * disabled before. +- */ +- if (!(priv->port_enabled_map & BIT(port))) +- continue; +- +- qca8k_port_set_status(priv, port, enable); +- } +-} +- +-static int qca8k_suspend(struct device *dev) +-{ +- struct qca8k_priv *priv = dev_get_drvdata(dev); +- +- qca8k_set_pm(priv, 0); +- +- return dsa_switch_suspend(priv->ds); +-} +- +-static int qca8k_resume(struct device *dev) +-{ +- struct qca8k_priv *priv = dev_get_drvdata(dev); +- +- qca8k_set_pm(priv, 1); +- +- return dsa_switch_resume(priv->ds); +-} +-#endif /* CONFIG_PM_SLEEP */ +- +-static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, +- qca8k_suspend, qca8k_resume); +- +-static const struct qca8k_info_ops qca8xxx_ops = { +- .autocast_mib = qca8k_get_ethtool_stats_eth, +-}; +- +-static const struct qca8k_match_data qca8327 = { +- .id = QCA8K_ID_QCA8327, +- .reduced_package = true, +- .mib_count = QCA8K_QCA832X_MIB_COUNT, +- .ops = &qca8xxx_ops, +-}; +- +-static const struct qca8k_match_data qca8328 = { +- .id = QCA8K_ID_QCA8327, +- .mib_count = QCA8K_QCA832X_MIB_COUNT, +- .ops = &qca8xxx_ops, +-}; +- +-static const struct qca8k_match_data qca833x = { +- .id = QCA8K_ID_QCA8337, +- .mib_count = QCA8K_QCA833X_MIB_COUNT, +- .ops = &qca8xxx_ops, +-}; +- +-static const struct of_device_id qca8k_of_match[] = { +- { .compatible = "qca,qca8327", .data = &qca8327 }, +- { .compatible = "qca,qca8328", .data = &qca8328 }, +- { .compatible = "qca,qca8334", .data = &qca833x }, +- { .compatible = "qca,qca8337", .data = &qca833x }, +- { /* sentinel */ }, +-}; +- +-static struct mdio_driver qca8kmdio_driver = { +- .probe = qca8k_sw_probe, +- .remove = qca8k_sw_remove, +- .shutdown = qca8k_sw_shutdown, +- .mdiodrv.driver = { +- .name = "qca8k", +- .of_match_table = qca8k_of_match, +- .pm = &qca8k_pm_ops, +- }, +-}; +- +-mdio_module_driver(qca8kmdio_driver); +- +-MODULE_AUTHOR("Mathieu Olivari, John Crispin "); +-MODULE_DESCRIPTION("Driver for QCA8K ethernet switch family"); +-MODULE_LICENSE("GPL v2"); +-MODULE_ALIAS("platform:qca8k"); +--- /dev/null ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -0,0 +1,3186 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2009 Felix Fietkau ++ * Copyright (C) 2011-2012 Gabor Juhos ++ * Copyright (c) 2015, 2019, The Linux Foundation. All rights reserved. ++ * Copyright (c) 2016 John Crispin ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "qca8k.h" ++ ++static void ++qca8k_split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) ++{ ++ regaddr >>= 1; ++ *r1 = regaddr & 0x1e; ++ ++ regaddr >>= 5; ++ *r2 = regaddr & 0x7; ++ ++ regaddr >>= 3; ++ *page = regaddr & 0x3ff; ++} ++ ++static int ++qca8k_set_lo(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 lo) ++{ ++ u16 *cached_lo = &priv->mdio_cache.lo; ++ struct mii_bus *bus = priv->bus; ++ int ret; ++ ++ if (lo == *cached_lo) ++ return 0; ++ ++ ret = bus->write(bus, phy_id, regnum, lo); ++ if (ret < 0) ++ dev_err_ratelimited(&bus->dev, ++ "failed to write qca8k 32bit lo register\n"); ++ ++ *cached_lo = lo; ++ return 0; ++} ++ ++static int ++qca8k_set_hi(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 hi) ++{ ++ u16 *cached_hi = &priv->mdio_cache.hi; ++ struct mii_bus *bus = priv->bus; ++ int ret; ++ ++ if (hi == *cached_hi) ++ return 0; ++ ++ ret = bus->write(bus, phy_id, regnum, hi); ++ if (ret < 0) ++ dev_err_ratelimited(&bus->dev, ++ "failed to write qca8k 32bit hi register\n"); ++ ++ *cached_hi = hi; ++ return 0; ++} ++ ++static int ++qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) ++{ ++ int ret; ++ ++ ret = bus->read(bus, phy_id, regnum); ++ if (ret >= 0) { ++ *val = ret; ++ ret = bus->read(bus, phy_id, regnum + 1); ++ *val |= ret << 16; ++ } ++ ++ if (ret < 0) { ++ dev_err_ratelimited(&bus->dev, ++ "failed to read qca8k 32bit register\n"); ++ *val = 0; ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static void ++qca8k_mii_write32(struct qca8k_priv *priv, int phy_id, u32 regnum, u32 val) ++{ ++ u16 lo, hi; ++ int ret; ++ ++ lo = val & 0xffff; ++ hi = (u16)(val >> 16); ++ ++ ret = qca8k_set_lo(priv, phy_id, regnum, lo); ++ if (ret >= 0) ++ ret = qca8k_set_hi(priv, phy_id, regnum + 1, hi); ++} ++ ++static int ++qca8k_set_page(struct qca8k_priv *priv, u16 page) ++{ ++ u16 *cached_page = &priv->mdio_cache.page; ++ struct mii_bus *bus = priv->bus; ++ int ret; ++ ++ if (page == *cached_page) ++ return 0; ++ ++ ret = bus->write(bus, 0x18, 0, page); ++ if (ret < 0) { ++ dev_err_ratelimited(&bus->dev, ++ "failed to set qca8k page\n"); ++ return ret; ++ } ++ ++ *cached_page = page; ++ usleep_range(1000, 2000); ++ return 0; ++} ++ ++static int ++qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val) ++{ ++ return regmap_read(priv->regmap, reg, val); ++} ++ ++static int ++qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val) ++{ ++ return regmap_write(priv->regmap, reg, val); ++} ++ ++static int ++qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) ++{ ++ return regmap_update_bits(priv->regmap, reg, mask, write_val); ++} ++ ++static void qca8k_rw_reg_ack_handler(struct dsa_switch *ds, struct sk_buff *skb) ++{ ++ struct qca8k_mgmt_eth_data *mgmt_eth_data; ++ struct qca8k_priv *priv = ds->priv; ++ struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ u8 len, cmd; ++ ++ mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb_mac_header(skb); ++ mgmt_eth_data = &priv->mgmt_eth_data; ++ ++ cmd = FIELD_GET(QCA_HDR_MGMT_CMD, mgmt_ethhdr->command); ++ len = FIELD_GET(QCA_HDR_MGMT_LENGTH, mgmt_ethhdr->command); ++ ++ /* Make sure the seq match the requested packet */ ++ if (mgmt_ethhdr->seq == mgmt_eth_data->seq) ++ mgmt_eth_data->ack = true; ++ ++ if (cmd == MDIO_READ) { ++ mgmt_eth_data->data[0] = mgmt_ethhdr->mdio_data; ++ ++ /* Get the rest of the 12 byte of data. ++ * The read/write function will extract the requested data. ++ */ ++ if (len > QCA_HDR_MGMT_DATA1_LEN) ++ memcpy(mgmt_eth_data->data + 1, skb->data, ++ QCA_HDR_MGMT_DATA2_LEN); ++ } ++ ++ complete(&mgmt_eth_data->rw_done); ++} ++ ++static struct sk_buff *qca8k_alloc_mdio_header(enum mdio_cmd cmd, u32 reg, u32 *val, ++ int priority, unsigned int len) ++{ ++ struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ unsigned int real_len; ++ struct sk_buff *skb; ++ u32 *data2; ++ u16 hdr; ++ ++ skb = dev_alloc_skb(QCA_HDR_MGMT_PKT_LEN); ++ if (!skb) ++ return NULL; ++ ++ /* Max value for len reg is 15 (0xf) but the switch actually return 16 byte ++ * Actually for some reason the steps are: ++ * 0: nothing ++ * 1-4: first 4 byte ++ * 5-6: first 12 byte ++ * 7-15: all 16 byte ++ */ ++ if (len == 16) ++ real_len = 15; ++ else ++ real_len = len; ++ ++ skb_reset_mac_header(skb); ++ skb_set_network_header(skb, skb->len); ++ ++ mgmt_ethhdr = skb_push(skb, QCA_HDR_MGMT_HEADER_LEN + QCA_HDR_LEN); ++ ++ hdr = FIELD_PREP(QCA_HDR_XMIT_VERSION, QCA_HDR_VERSION); ++ hdr |= FIELD_PREP(QCA_HDR_XMIT_PRIORITY, priority); ++ hdr |= QCA_HDR_XMIT_FROM_CPU; ++ hdr |= FIELD_PREP(QCA_HDR_XMIT_DP_BIT, BIT(0)); ++ hdr |= FIELD_PREP(QCA_HDR_XMIT_CONTROL, QCA_HDR_XMIT_TYPE_RW_REG); ++ ++ mgmt_ethhdr->command = FIELD_PREP(QCA_HDR_MGMT_ADDR, reg); ++ mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_LENGTH, real_len); ++ mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CMD, cmd); ++ mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CHECK_CODE, ++ QCA_HDR_MGMT_CHECK_CODE_VAL); ++ ++ if (cmd == MDIO_WRITE) ++ mgmt_ethhdr->mdio_data = *val; ++ ++ mgmt_ethhdr->hdr = htons(hdr); ++ ++ data2 = skb_put_zero(skb, QCA_HDR_MGMT_DATA2_LEN + QCA_HDR_MGMT_PADDING_LEN); ++ if (cmd == MDIO_WRITE && len > QCA_HDR_MGMT_DATA1_LEN) ++ memcpy(data2, val + 1, len - QCA_HDR_MGMT_DATA1_LEN); ++ ++ return skb; ++} ++ ++static void qca8k_mdio_header_fill_seq_num(struct sk_buff *skb, u32 seq_num) ++{ ++ struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ ++ mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb->data; ++ mgmt_ethhdr->seq = FIELD_PREP(QCA_HDR_MGMT_SEQ_NUM, seq_num); ++} ++ ++static int qca8k_read_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; ++ struct sk_buff *skb; ++ bool ack; ++ int ret; ++ ++ skb = qca8k_alloc_mdio_header(MDIO_READ, reg, NULL, ++ QCA8K_ETHERNET_MDIO_PRIORITY, len); ++ if (!skb) ++ return -ENOMEM; ++ ++ mutex_lock(&mgmt_eth_data->mutex); ++ ++ /* Check mgmt_master if is operational */ ++ if (!priv->mgmt_master) { ++ kfree_skb(skb); ++ mutex_unlock(&mgmt_eth_data->mutex); ++ return -EINVAL; ++ } ++ ++ skb->dev = priv->mgmt_master; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the mdio pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); ++ ++ *val = mgmt_eth_data->data[0]; ++ if (len > QCA_HDR_MGMT_DATA1_LEN) ++ memcpy(val + 1, mgmt_eth_data->data + 1, len - QCA_HDR_MGMT_DATA1_LEN); ++ ++ ack = mgmt_eth_data->ack; ++ ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ++ if (ret <= 0) ++ return -ETIMEDOUT; ++ ++ if (!ack) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int qca8k_write_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; ++ struct sk_buff *skb; ++ bool ack; ++ int ret; ++ ++ skb = qca8k_alloc_mdio_header(MDIO_WRITE, reg, val, ++ QCA8K_ETHERNET_MDIO_PRIORITY, len); ++ if (!skb) ++ return -ENOMEM; ++ ++ mutex_lock(&mgmt_eth_data->mutex); ++ ++ /* Check mgmt_master if is operational */ ++ if (!priv->mgmt_master) { ++ kfree_skb(skb); ++ mutex_unlock(&mgmt_eth_data->mutex); ++ return -EINVAL; ++ } ++ ++ skb->dev = priv->mgmt_master; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the mdio pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); ++ ++ ack = mgmt_eth_data->ack; ++ ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ++ if (ret <= 0) ++ return -ETIMEDOUT; ++ ++ if (!ack) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int ++qca8k_regmap_update_bits_eth(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) ++{ ++ u32 val = 0; ++ int ret; ++ ++ ret = qca8k_read_eth(priv, reg, &val, sizeof(val)); ++ if (ret) ++ return ret; ++ ++ val &= ~mask; ++ val |= write_val; ++ ++ return qca8k_write_eth(priv, reg, &val, sizeof(val)); ++} ++ ++static int ++qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ int i, count = len / sizeof(u32), ret; ++ ++ if (priv->mgmt_master && !qca8k_read_eth(priv, reg, val, len)) ++ return 0; ++ ++ for (i = 0; i < count; i++) { ++ ret = regmap_read(priv->regmap, reg + (i * 4), val + i); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ int i, count = len / sizeof(u32), ret; ++ u32 tmp; ++ ++ if (priv->mgmt_master && !qca8k_write_eth(priv, reg, val, len)) ++ return 0; ++ ++ for (i = 0; i < count; i++) { ++ tmp = val[i]; ++ ++ ret = regmap_write(priv->regmap, reg + (i * 4), tmp); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ctx; ++ struct mii_bus *bus = priv->bus; ++ u16 r1, r2, page; ++ int ret; ++ ++ if (!qca8k_read_eth(priv, reg, val, sizeof(*val))) ++ return 0; ++ ++ qca8k_split_addr(reg, &r1, &r2, &page); ++ ++ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ ++ ret = qca8k_set_page(priv, page); ++ if (ret < 0) ++ goto exit; ++ ++ ret = qca8k_mii_read32(bus, 0x10 | r2, r1, val); ++ ++exit: ++ mutex_unlock(&bus->mdio_lock); ++ return ret; ++} ++ ++static int ++qca8k_regmap_write(void *ctx, uint32_t reg, uint32_t val) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ctx; ++ struct mii_bus *bus = priv->bus; ++ u16 r1, r2, page; ++ int ret; ++ ++ if (!qca8k_write_eth(priv, reg, &val, sizeof(val))) ++ return 0; ++ ++ qca8k_split_addr(reg, &r1, &r2, &page); ++ ++ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ ++ ret = qca8k_set_page(priv, page); ++ if (ret < 0) ++ goto exit; ++ ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ ++exit: ++ mutex_unlock(&bus->mdio_lock); ++ return ret; ++} ++ ++static int ++qca8k_regmap_update_bits(void *ctx, uint32_t reg, uint32_t mask, uint32_t write_val) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ctx; ++ struct mii_bus *bus = priv->bus; ++ u16 r1, r2, page; ++ u32 val; ++ int ret; ++ ++ if (!qca8k_regmap_update_bits_eth(priv, reg, mask, write_val)) ++ return 0; ++ ++ qca8k_split_addr(reg, &r1, &r2, &page); ++ ++ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ ++ ret = qca8k_set_page(priv, page); ++ if (ret < 0) ++ goto exit; ++ ++ ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); ++ if (ret < 0) ++ goto exit; ++ ++ val &= ~mask; ++ val |= write_val; ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ ++exit: ++ mutex_unlock(&bus->mdio_lock); ++ ++ return ret; ++} ++ ++static const struct regmap_range qca8k_readable_ranges[] = { ++ regmap_reg_range(0x0000, 0x00e4), /* Global control */ ++ regmap_reg_range(0x0100, 0x0168), /* EEE control */ ++ regmap_reg_range(0x0200, 0x0270), /* Parser control */ ++ regmap_reg_range(0x0400, 0x0454), /* ACL */ ++ regmap_reg_range(0x0600, 0x0718), /* Lookup */ ++ regmap_reg_range(0x0800, 0x0b70), /* QM */ ++ regmap_reg_range(0x0c00, 0x0c80), /* PKT */ ++ regmap_reg_range(0x0e00, 0x0e98), /* L3 */ ++ regmap_reg_range(0x1000, 0x10ac), /* MIB - Port0 */ ++ regmap_reg_range(0x1100, 0x11ac), /* MIB - Port1 */ ++ regmap_reg_range(0x1200, 0x12ac), /* MIB - Port2 */ ++ regmap_reg_range(0x1300, 0x13ac), /* MIB - Port3 */ ++ regmap_reg_range(0x1400, 0x14ac), /* MIB - Port4 */ ++ regmap_reg_range(0x1500, 0x15ac), /* MIB - Port5 */ ++ regmap_reg_range(0x1600, 0x16ac), /* MIB - Port6 */ ++ ++}; ++ ++static const struct regmap_access_table qca8k_readable_table = { ++ .yes_ranges = qca8k_readable_ranges, ++ .n_yes_ranges = ARRAY_SIZE(qca8k_readable_ranges), ++}; ++ ++static struct regmap_config qca8k_regmap_config = { ++ .reg_bits = 16, ++ .val_bits = 32, ++ .reg_stride = 4, ++ .max_register = 0x16ac, /* end MIB - Port6 range */ ++ .reg_read = qca8k_regmap_read, ++ .reg_write = qca8k_regmap_write, ++ .reg_update_bits = qca8k_regmap_update_bits, ++ .rd_table = &qca8k_readable_table, ++ .disable_locking = true, /* Locking is handled by qca8k read/write */ ++ .cache_type = REGCACHE_NONE, /* Explicitly disable CACHE */ ++}; ++ ++static int ++qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) ++{ ++ u32 val; ++ ++ return regmap_read_poll_timeout(priv->regmap, reg, val, !(val & mask), 0, ++ QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC); ++} ++ ++static int ++qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb) ++{ ++ u32 reg[3]; ++ int ret; ++ ++ /* load the ARL table into an array */ ++ ret = qca8k_bulk_read(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); ++ if (ret) ++ return ret; ++ ++ /* vid - 83:72 */ ++ fdb->vid = FIELD_GET(QCA8K_ATU_VID_MASK, reg[2]); ++ /* aging - 67:64 */ ++ fdb->aging = FIELD_GET(QCA8K_ATU_STATUS_MASK, reg[2]); ++ /* portmask - 54:48 */ ++ fdb->port_mask = FIELD_GET(QCA8K_ATU_PORT_MASK, reg[1]); ++ /* mac - 47:0 */ ++ fdb->mac[0] = FIELD_GET(QCA8K_ATU_ADDR0_MASK, reg[1]); ++ fdb->mac[1] = FIELD_GET(QCA8K_ATU_ADDR1_MASK, reg[1]); ++ fdb->mac[2] = FIELD_GET(QCA8K_ATU_ADDR2_MASK, reg[0]); ++ fdb->mac[3] = FIELD_GET(QCA8K_ATU_ADDR3_MASK, reg[0]); ++ fdb->mac[4] = FIELD_GET(QCA8K_ATU_ADDR4_MASK, reg[0]); ++ fdb->mac[5] = FIELD_GET(QCA8K_ATU_ADDR5_MASK, reg[0]); ++ ++ return 0; ++} ++ ++static void ++qca8k_fdb_write(struct qca8k_priv *priv, u16 vid, u8 port_mask, const u8 *mac, ++ u8 aging) ++{ ++ u32 reg[3] = { 0 }; ++ ++ /* vid - 83:72 */ ++ reg[2] = FIELD_PREP(QCA8K_ATU_VID_MASK, vid); ++ /* aging - 67:64 */ ++ reg[2] |= FIELD_PREP(QCA8K_ATU_STATUS_MASK, aging); ++ /* portmask - 54:48 */ ++ reg[1] = FIELD_PREP(QCA8K_ATU_PORT_MASK, port_mask); ++ /* mac - 47:0 */ ++ reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR0_MASK, mac[0]); ++ reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR1_MASK, mac[1]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR2_MASK, mac[2]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR3_MASK, mac[3]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR4_MASK, mac[4]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR5_MASK, mac[5]); ++ ++ /* load the array into the ARL table */ ++ qca8k_bulk_write(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); ++} ++ ++static int ++qca8k_fdb_access(struct qca8k_priv *priv, enum qca8k_fdb_cmd cmd, int port) ++{ ++ u32 reg; ++ int ret; ++ ++ /* Set the command and FDB index */ ++ reg = QCA8K_ATU_FUNC_BUSY; ++ reg |= cmd; ++ if (port >= 0) { ++ reg |= QCA8K_ATU_FUNC_PORT_EN; ++ reg |= FIELD_PREP(QCA8K_ATU_FUNC_PORT_MASK, port); ++ } ++ ++ /* Write the function register triggering the table access */ ++ ret = qca8k_write(priv, QCA8K_REG_ATU_FUNC, reg); ++ if (ret) ++ return ret; ++ ++ /* wait for completion */ ++ ret = qca8k_busy_wait(priv, QCA8K_REG_ATU_FUNC, QCA8K_ATU_FUNC_BUSY); ++ if (ret) ++ return ret; ++ ++ /* Check for table full violation when adding an entry */ ++ if (cmd == QCA8K_FDB_LOAD) { ++ ret = qca8k_read(priv, QCA8K_REG_ATU_FUNC, ®); ++ if (ret < 0) ++ return ret; ++ if (reg & QCA8K_ATU_FUNC_FULL) ++ return -1; ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_fdb_next(struct qca8k_priv *priv, struct qca8k_fdb *fdb, int port) ++{ ++ int ret; ++ ++ qca8k_fdb_write(priv, fdb->vid, fdb->port_mask, fdb->mac, fdb->aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_NEXT, port); ++ if (ret < 0) ++ return ret; ++ ++ return qca8k_fdb_read(priv, fdb); ++} ++ ++static int ++qca8k_fdb_add(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, ++ u16 vid, u8 aging) ++{ ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_write(priv, vid, port_mask, mac, aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ ++static int ++qca8k_fdb_del(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, u16 vid) ++{ ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_write(priv, vid, port_mask, mac, 0); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ ++static void ++qca8k_fdb_flush(struct qca8k_priv *priv) ++{ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_access(priv, QCA8K_FDB_FLUSH, -1); ++ mutex_unlock(&priv->reg_mutex); ++} ++ ++static int ++qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask, ++ const u8 *mac, u16 vid) ++{ ++ struct qca8k_fdb fdb = { 0 }; ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ++ qca8k_fdb_write(priv, vid, 0, mac, 0); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); ++ if (ret < 0) ++ goto exit; ++ ++ ret = qca8k_fdb_read(priv, &fdb); ++ if (ret < 0) ++ goto exit; ++ ++ /* Rule exist. Delete first */ ++ if (!fdb.aging) { ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); ++ if (ret) ++ goto exit; ++ } ++ ++ /* Add port to fdb portmask */ ++ fdb.port_mask |= port_mask; ++ ++ qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++static int ++qca8k_fdb_search_and_del(struct qca8k_priv *priv, u8 port_mask, ++ const u8 *mac, u16 vid) ++{ ++ struct qca8k_fdb fdb = { 0 }; ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ++ qca8k_fdb_write(priv, vid, 0, mac, 0); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); ++ if (ret < 0) ++ goto exit; ++ ++ /* Rule doesn't exist. Why delete? */ ++ if (!fdb.aging) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); ++ if (ret) ++ goto exit; ++ ++ /* Only port in the rule is this port. Don't re insert */ ++ if (fdb.port_mask == port_mask) ++ goto exit; ++ ++ /* Remove port from port mask */ ++ fdb.port_mask &= ~port_mask; ++ ++ qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++static int ++qca8k_vlan_access(struct qca8k_priv *priv, enum qca8k_vlan_cmd cmd, u16 vid) ++{ ++ u32 reg; ++ int ret; ++ ++ /* Set the command and VLAN index */ ++ reg = QCA8K_VTU_FUNC1_BUSY; ++ reg |= cmd; ++ reg |= FIELD_PREP(QCA8K_VTU_FUNC1_VID_MASK, vid); ++ ++ /* Write the function register triggering the table access */ ++ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC1, reg); ++ if (ret) ++ return ret; ++ ++ /* wait for completion */ ++ ret = qca8k_busy_wait(priv, QCA8K_REG_VTU_FUNC1, QCA8K_VTU_FUNC1_BUSY); ++ if (ret) ++ return ret; ++ ++ /* Check for table full violation when adding an entry */ ++ if (cmd == QCA8K_VLAN_LOAD) { ++ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC1, ®); ++ if (ret < 0) ++ return ret; ++ if (reg & QCA8K_VTU_FUNC1_FULL) ++ return -ENOMEM; ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_vlan_add(struct qca8k_priv *priv, u8 port, u16 vid, bool untagged) ++{ ++ u32 reg; ++ int ret; ++ ++ /* ++ We do the right thing with VLAN 0 and treat it as untagged while ++ preserving the tag on egress. ++ */ ++ if (vid == 0) ++ return 0; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); ++ if (ret < 0) ++ goto out; ++ ++ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); ++ if (ret < 0) ++ goto out; ++ reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; ++ reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); ++ if (untagged) ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(port); ++ else ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(port); ++ ++ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); ++ if (ret) ++ goto out; ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); ++ ++out: ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ ++static int ++qca8k_vlan_del(struct qca8k_priv *priv, u8 port, u16 vid) ++{ ++ u32 reg, mask; ++ int ret, i; ++ bool del; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); ++ if (ret < 0) ++ goto out; ++ ++ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); ++ if (ret < 0) ++ goto out; ++ reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(port); ++ ++ /* Check if we're the last member to be removed */ ++ del = true; ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ mask = QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(i); ++ ++ if ((reg & mask) != mask) { ++ del = false; ++ break; ++ } ++ } ++ ++ if (del) { ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_PURGE, vid); ++ } else { ++ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); ++ if (ret) ++ goto out; ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); ++ } ++ ++out: ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ ++static int ++qca8k_mib_init(struct qca8k_priv *priv) ++{ ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, ++ QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, ++ FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_FLUSH) | ++ QCA8K_MIB_BUSY); ++ if (ret) ++ goto exit; ++ ++ ret = qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY); ++ if (ret) ++ goto exit; ++ ++ ret = regmap_set_bits(priv->regmap, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP); ++ if (ret) ++ goto exit; ++ ++ ret = qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++static void ++qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable) ++{ ++ u32 mask = QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; ++ ++ /* Port 0 and 6 have no internal PHY */ ++ if (port > 0 && port < 6) ++ mask |= QCA8K_PORT_STATUS_LINK_AUTO; ++ ++ if (enable) ++ regmap_set_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); ++ else ++ regmap_clear_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); ++} ++ ++static int ++qca8k_phy_eth_busy_wait(struct qca8k_mgmt_eth_data *mgmt_eth_data, ++ struct sk_buff *read_skb, u32 *val) ++{ ++ struct sk_buff *skb = skb_copy(read_skb, GFP_KERNEL); ++ bool ack; ++ int ret; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the copy pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ ack = mgmt_eth_data->ack; ++ ++ if (ret <= 0) ++ return -ETIMEDOUT; ++ ++ if (!ack) ++ return -EINVAL; ++ ++ *val = mgmt_eth_data->data[0]; ++ ++ return 0; ++} ++ ++static int ++qca8k_phy_eth_command(struct qca8k_priv *priv, bool read, int phy, ++ int regnum, u16 data) ++{ ++ struct sk_buff *write_skb, *clear_skb, *read_skb; ++ struct qca8k_mgmt_eth_data *mgmt_eth_data; ++ u32 write_val, clear_val = 0, val; ++ struct net_device *mgmt_master; ++ int ret, ret1; ++ bool ack; ++ ++ if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) ++ return -EINVAL; ++ ++ mgmt_eth_data = &priv->mgmt_eth_data; ++ ++ write_val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | ++ QCA8K_MDIO_MASTER_PHY_ADDR(phy) | ++ QCA8K_MDIO_MASTER_REG_ADDR(regnum); ++ ++ if (read) { ++ write_val |= QCA8K_MDIO_MASTER_READ; ++ } else { ++ write_val |= QCA8K_MDIO_MASTER_WRITE; ++ write_val |= QCA8K_MDIO_MASTER_DATA(data); ++ } ++ ++ /* Prealloc all the needed skb before the lock */ ++ write_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &write_val, ++ QCA8K_ETHERNET_PHY_PRIORITY, sizeof(write_val)); ++ if (!write_skb) ++ return -ENOMEM; ++ ++ clear_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &clear_val, ++ QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); ++ if (!clear_skb) { ++ ret = -ENOMEM; ++ goto err_clear_skb; ++ } ++ ++ read_skb = qca8k_alloc_mdio_header(MDIO_READ, QCA8K_MDIO_MASTER_CTRL, &clear_val, ++ QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); ++ if (!read_skb) { ++ ret = -ENOMEM; ++ goto err_read_skb; ++ } ++ ++ /* Actually start the request: ++ * 1. Send mdio master packet ++ * 2. Busy Wait for mdio master command ++ * 3. Get the data if we are reading ++ * 4. Reset the mdio master (even with error) ++ */ ++ mutex_lock(&mgmt_eth_data->mutex); ++ ++ /* Check if mgmt_master is operational */ ++ mgmt_master = priv->mgmt_master; ++ if (!mgmt_master) { ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ret = -EINVAL; ++ goto err_mgmt_master; ++ } ++ ++ read_skb->dev = mgmt_master; ++ clear_skb->dev = mgmt_master; ++ write_skb->dev = mgmt_master; ++ ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the write pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(write_skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(write_skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ ack = mgmt_eth_data->ack; ++ ++ if (ret <= 0) { ++ ret = -ETIMEDOUT; ++ kfree_skb(read_skb); ++ goto exit; ++ } ++ ++ if (!ack) { ++ ret = -EINVAL; ++ kfree_skb(read_skb); ++ goto exit; ++ } ++ ++ ret = read_poll_timeout(qca8k_phy_eth_busy_wait, ret1, ++ !(val & QCA8K_MDIO_MASTER_BUSY), 0, ++ QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, ++ mgmt_eth_data, read_skb, &val); ++ ++ if (ret < 0 && ret1 < 0) { ++ ret = ret1; ++ goto exit; ++ } ++ ++ if (read) { ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the read pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(read_skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(read_skb); ++ ++ ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ ack = mgmt_eth_data->ack; ++ ++ if (ret <= 0) { ++ ret = -ETIMEDOUT; ++ goto exit; ++ } ++ ++ if (!ack) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ ret = mgmt_eth_data->data[0] & QCA8K_MDIO_MASTER_DATA_MASK; ++ } else { ++ kfree_skb(read_skb); ++ } ++exit: ++ reinit_completion(&mgmt_eth_data->rw_done); ++ ++ /* Increment seq_num and set it in the clear pkt */ ++ mgmt_eth_data->seq++; ++ qca8k_mdio_header_fill_seq_num(clear_skb, mgmt_eth_data->seq); ++ mgmt_eth_data->ack = false; ++ ++ dev_queue_xmit(clear_skb); ++ ++ wait_for_completion_timeout(&mgmt_eth_data->rw_done, ++ QCA8K_ETHERNET_TIMEOUT); ++ ++ mutex_unlock(&mgmt_eth_data->mutex); ++ ++ return ret; ++ ++ /* Error handling before lock */ ++err_mgmt_master: ++ kfree_skb(read_skb); ++err_read_skb: ++ kfree_skb(clear_skb); ++err_clear_skb: ++ kfree_skb(write_skb); ++ ++ return ret; ++} ++ ++static u32 ++qca8k_port_to_phy(int port) ++{ ++ /* From Andrew Lunn: ++ * Port 0 has no internal phy. ++ * Port 1 has an internal PHY at MDIO address 0. ++ * Port 2 has an internal PHY at MDIO address 1. ++ * ... ++ * Port 5 has an internal PHY at MDIO address 4. ++ * Port 6 has no internal PHY. ++ */ ++ ++ return port - 1; ++} ++ ++static int ++qca8k_mdio_busy_wait(struct mii_bus *bus, u32 reg, u32 mask) ++{ ++ u16 r1, r2, page; ++ u32 val; ++ int ret, ret1; ++ ++ qca8k_split_addr(reg, &r1, &r2, &page); ++ ++ ret = read_poll_timeout(qca8k_mii_read32, ret1, !(val & mask), 0, ++ QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, ++ bus, 0x10 | r2, r1, &val); ++ ++ /* Check if qca8k_read has failed for a different reason ++ * before returnting -ETIMEDOUT ++ */ ++ if (ret < 0 && ret1 < 0) ++ return ret1; ++ ++ return ret; ++} ++ ++static int ++qca8k_mdio_write(struct qca8k_priv *priv, int phy, int regnum, u16 data) ++{ ++ struct mii_bus *bus = priv->bus; ++ u16 r1, r2, page; ++ u32 val; ++ int ret; ++ ++ if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) ++ return -EINVAL; ++ ++ val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | ++ QCA8K_MDIO_MASTER_WRITE | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | ++ QCA8K_MDIO_MASTER_REG_ADDR(regnum) | ++ QCA8K_MDIO_MASTER_DATA(data); ++ ++ qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); ++ ++ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ ++ ret = qca8k_set_page(priv, page); ++ if (ret) ++ goto exit; ++ ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ ++ ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, ++ QCA8K_MDIO_MASTER_BUSY); ++ ++exit: ++ /* even if the busy_wait timeouts try to clear the MASTER_EN */ ++ qca8k_mii_write32(priv, 0x10 | r2, r1, 0); ++ ++ mutex_unlock(&bus->mdio_lock); ++ ++ return ret; ++} ++ ++static int ++qca8k_mdio_read(struct qca8k_priv *priv, int phy, int regnum) ++{ ++ struct mii_bus *bus = priv->bus; ++ u16 r1, r2, page; ++ u32 val; ++ int ret; ++ ++ if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) ++ return -EINVAL; ++ ++ val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | ++ QCA8K_MDIO_MASTER_READ | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | ++ QCA8K_MDIO_MASTER_REG_ADDR(regnum); ++ ++ qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); ++ ++ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ ++ ret = qca8k_set_page(priv, page); ++ if (ret) ++ goto exit; ++ ++ qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ ++ ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, ++ QCA8K_MDIO_MASTER_BUSY); ++ if (ret) ++ goto exit; ++ ++ ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); ++ ++exit: ++ /* even if the busy_wait timeouts try to clear the MASTER_EN */ ++ qca8k_mii_write32(priv, 0x10 | r2, r1, 0); ++ ++ mutex_unlock(&bus->mdio_lock); ++ ++ if (ret >= 0) ++ ret = val & QCA8K_MDIO_MASTER_DATA_MASK; ++ ++ return ret; ++} ++ ++static int ++qca8k_internal_mdio_write(struct mii_bus *slave_bus, int phy, int regnum, u16 data) ++{ ++ struct qca8k_priv *priv = slave_bus->priv; ++ int ret; ++ ++ /* Use mdio Ethernet when available, fallback to legacy one on error */ ++ ret = qca8k_phy_eth_command(priv, false, phy, regnum, data); ++ if (!ret) ++ return 0; ++ ++ return qca8k_mdio_write(priv, phy, regnum, data); ++} ++ ++static int ++qca8k_internal_mdio_read(struct mii_bus *slave_bus, int phy, int regnum) ++{ ++ struct qca8k_priv *priv = slave_bus->priv; ++ int ret; ++ ++ /* Use mdio Ethernet when available, fallback to legacy one on error */ ++ ret = qca8k_phy_eth_command(priv, true, phy, regnum, 0); ++ if (ret >= 0) ++ return ret; ++ ++ ret = qca8k_mdio_read(priv, phy, regnum); ++ ++ if (ret < 0) ++ return 0xffff; ++ ++ return ret; ++} ++ ++static int ++qca8k_legacy_mdio_write(struct mii_bus *slave_bus, int port, int regnum, u16 data) ++{ ++ port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; ++ ++ return qca8k_internal_mdio_write(slave_bus, port, regnum, data); ++} ++ ++static int ++qca8k_legacy_mdio_read(struct mii_bus *slave_bus, int port, int regnum) ++{ ++ port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; ++ ++ return qca8k_internal_mdio_read(slave_bus, port, regnum); ++} ++ ++static int ++qca8k_mdio_register(struct qca8k_priv *priv) ++{ ++ struct dsa_switch *ds = priv->ds; ++ struct device_node *mdio; ++ struct mii_bus *bus; ++ ++ bus = devm_mdiobus_alloc(ds->dev); ++ if (!bus) ++ return -ENOMEM; ++ ++ bus->priv = (void *)priv; ++ snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d.%d", ++ ds->dst->index, ds->index); ++ bus->parent = ds->dev; ++ bus->phy_mask = ~ds->phys_mii_mask; ++ ds->slave_mii_bus = bus; ++ ++ /* Check if the devicetree declare the port:phy mapping */ ++ mdio = of_get_child_by_name(priv->dev->of_node, "mdio"); ++ if (of_device_is_available(mdio)) { ++ bus->name = "qca8k slave mii"; ++ bus->read = qca8k_internal_mdio_read; ++ bus->write = qca8k_internal_mdio_write; ++ return devm_of_mdiobus_register(priv->dev, bus, mdio); ++ } ++ ++ /* If a mapping can't be found the legacy mapping is used, ++ * using the qca8k_port_to_phy function ++ */ ++ bus->name = "qca8k-legacy slave mii"; ++ bus->read = qca8k_legacy_mdio_read; ++ bus->write = qca8k_legacy_mdio_write; ++ return devm_mdiobus_register(priv->dev, bus); ++} ++ ++static int ++qca8k_setup_mdio_bus(struct qca8k_priv *priv) ++{ ++ u32 internal_mdio_mask = 0, external_mdio_mask = 0, reg; ++ struct device_node *ports, *port; ++ phy_interface_t mode; ++ int err; ++ ++ ports = of_get_child_by_name(priv->dev->of_node, "ports"); ++ if (!ports) ++ ports = of_get_child_by_name(priv->dev->of_node, "ethernet-ports"); ++ ++ if (!ports) ++ return -EINVAL; ++ ++ for_each_available_child_of_node(ports, port) { ++ err = of_property_read_u32(port, "reg", ®); ++ if (err) { ++ of_node_put(port); ++ of_node_put(ports); ++ return err; ++ } ++ ++ if (!dsa_is_user_port(priv->ds, reg)) ++ continue; ++ ++ of_get_phy_mode(port, &mode); ++ ++ if (of_property_read_bool(port, "phy-handle") && ++ mode != PHY_INTERFACE_MODE_INTERNAL) ++ external_mdio_mask |= BIT(reg); ++ else ++ internal_mdio_mask |= BIT(reg); ++ } ++ ++ of_node_put(ports); ++ if (!external_mdio_mask && !internal_mdio_mask) { ++ dev_err(priv->dev, "no PHYs are defined.\n"); ++ return -EINVAL; ++ } ++ ++ /* The QCA8K_MDIO_MASTER_EN Bit, which grants access to PHYs through ++ * the MDIO_MASTER register also _disconnects_ the external MDC ++ * passthrough to the internal PHYs. It's not possible to use both ++ * configurations at the same time! ++ * ++ * Because this came up during the review process: ++ * If the external mdio-bus driver is capable magically disabling ++ * the QCA8K_MDIO_MASTER_EN and mutex/spin-locking out the qca8k's ++ * accessors for the time being, it would be possible to pull this ++ * off. ++ */ ++ if (!!external_mdio_mask && !!internal_mdio_mask) { ++ dev_err(priv->dev, "either internal or external mdio bus configuration is supported.\n"); ++ return -EINVAL; ++ } ++ ++ if (external_mdio_mask) { ++ /* Make sure to disable the internal mdio bus in cases ++ * a dt-overlay and driver reload changed the configuration ++ */ ++ ++ return regmap_clear_bits(priv->regmap, QCA8K_MDIO_MASTER_CTRL, ++ QCA8K_MDIO_MASTER_EN); ++ } ++ ++ return qca8k_mdio_register(priv); ++} ++ ++static int ++qca8k_setup_mac_pwr_sel(struct qca8k_priv *priv) ++{ ++ u32 mask = 0; ++ int ret = 0; ++ ++ /* SoC specific settings for ipq8064. ++ * If more device require this consider adding ++ * a dedicated binding. ++ */ ++ if (of_machine_is_compatible("qcom,ipq8064")) ++ mask |= QCA8K_MAC_PWR_RGMII0_1_8V; ++ ++ /* SoC specific settings for ipq8065 */ ++ if (of_machine_is_compatible("qcom,ipq8065")) ++ mask |= QCA8K_MAC_PWR_RGMII1_1_8V; ++ ++ if (mask) { ++ ret = qca8k_rmw(priv, QCA8K_REG_MAC_PWR_SEL, ++ QCA8K_MAC_PWR_RGMII0_1_8V | ++ QCA8K_MAC_PWR_RGMII1_1_8V, ++ mask); ++ } ++ ++ return ret; ++} ++ ++static int qca8k_find_cpu_port(struct dsa_switch *ds) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ /* Find the connected cpu port. Valid port are 0 or 6 */ ++ if (dsa_is_cpu_port(ds, 0)) ++ return 0; ++ ++ dev_dbg(priv->dev, "port 0 is not the CPU port. Checking port 6"); ++ ++ if (dsa_is_cpu_port(ds, 6)) ++ return 6; ++ ++ return -EINVAL; ++} ++ ++static int ++qca8k_setup_of_pws_reg(struct qca8k_priv *priv) ++{ ++ const struct qca8k_match_data *data = priv->info; ++ struct device_node *node = priv->dev->of_node; ++ u32 val = 0; ++ int ret; ++ ++ /* QCA8327 require to set to the correct mode. ++ * His bigger brother QCA8328 have the 172 pin layout. ++ * Should be applied by default but we set this just to make sure. ++ */ ++ if (priv->switch_id == QCA8K_ID_QCA8327) { ++ /* Set the correct package of 148 pin for QCA8327 */ ++ if (data->reduced_package) ++ val |= QCA8327_PWS_PACKAGE148_EN; ++ ++ ret = qca8k_rmw(priv, QCA8K_REG_PWS, QCA8327_PWS_PACKAGE148_EN, ++ val); ++ if (ret) ++ return ret; ++ } ++ ++ if (of_property_read_bool(node, "qca,ignore-power-on-sel")) ++ val |= QCA8K_PWS_POWER_ON_SEL; ++ ++ if (of_property_read_bool(node, "qca,led-open-drain")) { ++ if (!(val & QCA8K_PWS_POWER_ON_SEL)) { ++ dev_err(priv->dev, "qca,led-open-drain require qca,ignore-power-on-sel to be set."); ++ return -EINVAL; ++ } ++ ++ val |= QCA8K_PWS_LED_OPEN_EN_CSR; ++ } ++ ++ return qca8k_rmw(priv, QCA8K_REG_PWS, ++ QCA8K_PWS_LED_OPEN_EN_CSR | QCA8K_PWS_POWER_ON_SEL, ++ val); ++} ++ ++static int ++qca8k_parse_port_config(struct qca8k_priv *priv) ++{ ++ int port, cpu_port_index = -1, ret; ++ struct device_node *port_dn; ++ phy_interface_t mode; ++ struct dsa_port *dp; ++ u32 delay; ++ ++ /* We have 2 CPU port. Check them */ ++ for (port = 0; port < QCA8K_NUM_PORTS; port++) { ++ /* Skip every other port */ ++ if (port != 0 && port != 6) ++ continue; ++ ++ dp = dsa_to_port(priv->ds, port); ++ port_dn = dp->dn; ++ cpu_port_index++; ++ ++ if (!of_device_is_available(port_dn)) ++ continue; ++ ++ ret = of_get_phy_mode(port_dn, &mode); ++ if (ret) ++ continue; ++ ++ switch (mode) { ++ case PHY_INTERFACE_MODE_RGMII: ++ case PHY_INTERFACE_MODE_RGMII_ID: ++ case PHY_INTERFACE_MODE_RGMII_TXID: ++ case PHY_INTERFACE_MODE_RGMII_RXID: ++ case PHY_INTERFACE_MODE_SGMII: ++ delay = 0; ++ ++ if (!of_property_read_u32(port_dn, "tx-internal-delay-ps", &delay)) ++ /* Switch regs accept value in ns, convert ps to ns */ ++ delay = delay / 1000; ++ else if (mode == PHY_INTERFACE_MODE_RGMII_ID || ++ mode == PHY_INTERFACE_MODE_RGMII_TXID) ++ delay = 1; ++ ++ if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK, delay)) { ++ dev_err(priv->dev, "rgmii tx delay is limited to a max value of 3ns, setting to the max value"); ++ delay = 3; ++ } ++ ++ priv->ports_config.rgmii_tx_delay[cpu_port_index] = delay; ++ ++ delay = 0; ++ ++ if (!of_property_read_u32(port_dn, "rx-internal-delay-ps", &delay)) ++ /* Switch regs accept value in ns, convert ps to ns */ ++ delay = delay / 1000; ++ else if (mode == PHY_INTERFACE_MODE_RGMII_ID || ++ mode == PHY_INTERFACE_MODE_RGMII_RXID) ++ delay = 2; ++ ++ if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK, delay)) { ++ dev_err(priv->dev, "rgmii rx delay is limited to a max value of 3ns, setting to the max value"); ++ delay = 3; ++ } ++ ++ priv->ports_config.rgmii_rx_delay[cpu_port_index] = delay; ++ ++ /* Skip sgmii parsing for rgmii* mode */ ++ if (mode == PHY_INTERFACE_MODE_RGMII || ++ mode == PHY_INTERFACE_MODE_RGMII_ID || ++ mode == PHY_INTERFACE_MODE_RGMII_TXID || ++ mode == PHY_INTERFACE_MODE_RGMII_RXID) ++ break; ++ ++ if (of_property_read_bool(port_dn, "qca,sgmii-txclk-falling-edge")) ++ priv->ports_config.sgmii_tx_clk_falling_edge = true; ++ ++ if (of_property_read_bool(port_dn, "qca,sgmii-rxclk-falling-edge")) ++ priv->ports_config.sgmii_rx_clk_falling_edge = true; ++ ++ if (of_property_read_bool(port_dn, "qca,sgmii-enable-pll")) { ++ priv->ports_config.sgmii_enable_pll = true; ++ ++ if (priv->switch_id == QCA8K_ID_QCA8327) { ++ dev_err(priv->dev, "SGMII PLL should NOT be enabled for qca8327. Aborting enabling"); ++ priv->ports_config.sgmii_enable_pll = false; ++ } ++ ++ if (priv->switch_revision < 2) ++ dev_warn(priv->dev, "SGMII PLL should NOT be enabled for qca8337 with revision 2 or more."); ++ } ++ ++ break; ++ default: ++ continue; ++ } ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_setup(struct dsa_switch *ds) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ int cpu_port, ret, i; ++ u32 mask; ++ ++ cpu_port = qca8k_find_cpu_port(ds); ++ if (cpu_port < 0) { ++ dev_err(priv->dev, "No cpu port configured in both cpu port0 and port6"); ++ return cpu_port; ++ } ++ ++ /* Parse CPU port config to be later used in phy_link mac_config */ ++ ret = qca8k_parse_port_config(priv); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_setup_mdio_bus(priv); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_setup_of_pws_reg(priv); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_setup_mac_pwr_sel(priv); ++ if (ret) ++ return ret; ++ ++ /* Make sure MAC06 is disabled */ ++ ret = regmap_clear_bits(priv->regmap, QCA8K_REG_PORT0_PAD_CTRL, ++ QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN); ++ if (ret) { ++ dev_err(priv->dev, "failed disabling MAC06 exchange"); ++ return ret; ++ } ++ ++ /* Enable CPU Port */ ++ ret = regmap_set_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, ++ QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN); ++ if (ret) { ++ dev_err(priv->dev, "failed enabling CPU port"); ++ return ret; ++ } ++ ++ /* Enable MIB counters */ ++ ret = qca8k_mib_init(priv); ++ if (ret) ++ dev_warn(priv->dev, "mib init failed"); ++ ++ /* Initial setup of all ports */ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ /* Disable forwarding by default on all ports */ ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), ++ QCA8K_PORT_LOOKUP_MEMBER, 0); ++ if (ret) ++ return ret; ++ ++ /* Enable QCA header mode on all cpu ports */ ++ if (dsa_is_cpu_port(ds, i)) { ++ ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(i), ++ FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) | ++ FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL)); ++ if (ret) { ++ dev_err(priv->dev, "failed enabling QCA header mode"); ++ return ret; ++ } ++ } ++ ++ /* Disable MAC by default on all user ports */ ++ if (dsa_is_user_port(ds, i)) ++ qca8k_port_set_status(priv, i, 0); ++ } ++ ++ /* Forward all unknown frames to CPU port for Linux processing ++ * Notice that in multi-cpu config only one port should be set ++ * for igmp, unknown, multicast and broadcast packet ++ */ ++ ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1, ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK, BIT(cpu_port)) | ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK, BIT(cpu_port)) | ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK, BIT(cpu_port)) | ++ FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK, BIT(cpu_port))); ++ if (ret) ++ return ret; ++ ++ /* Setup connection between CPU port & user ports ++ * Configure specific switch configuration for ports ++ */ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ /* CPU port gets connected to all user ports of the switch */ ++ if (dsa_is_cpu_port(ds, i)) { ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), ++ QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds)); ++ if (ret) ++ return ret; ++ } ++ ++ /* Individual user ports get connected to CPU port only */ ++ if (dsa_is_user_port(ds, i)) { ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), ++ QCA8K_PORT_LOOKUP_MEMBER, ++ BIT(cpu_port)); ++ if (ret) ++ return ret; ++ ++ /* Enable ARP Auto-learning by default */ ++ ret = regmap_set_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(i), ++ QCA8K_PORT_LOOKUP_LEARN); ++ if (ret) ++ return ret; ++ ++ /* For port based vlans to work we need to set the ++ * default egress vid ++ */ ++ ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i), ++ QCA8K_EGREES_VLAN_PORT_MASK(i), ++ QCA8K_EGREES_VLAN_PORT(i, QCA8K_PORT_VID_DEF)); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i), ++ QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) | ++ QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF)); ++ if (ret) ++ return ret; ++ } ++ ++ /* The port 5 of the qca8337 have some problem in flood condition. The ++ * original legacy driver had some specific buffer and priority settings ++ * for the different port suggested by the QCA switch team. Add this ++ * missing settings to improve switch stability under load condition. ++ * This problem is limited to qca8337 and other qca8k switch are not affected. ++ */ ++ if (priv->switch_id == QCA8K_ID_QCA8337) { ++ switch (i) { ++ /* The 2 CPU port and port 5 requires some different ++ * priority than any other ports. ++ */ ++ case 0: ++ case 5: ++ case 6: ++ mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x4) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x4) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI4(0x6) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI5(0x8) | ++ QCA8K_PORT_HOL_CTRL0_EG_PORT(0x1e); ++ break; ++ default: ++ mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x6) | ++ QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x8) | ++ QCA8K_PORT_HOL_CTRL0_EG_PORT(0x19); ++ } ++ qca8k_write(priv, QCA8K_REG_PORT_HOL_CTRL0(i), mask); ++ ++ mask = QCA8K_PORT_HOL_CTRL1_ING(0x6) | ++ QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | ++ QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | ++ QCA8K_PORT_HOL_CTRL1_WRED_EN; ++ qca8k_rmw(priv, QCA8K_REG_PORT_HOL_CTRL1(i), ++ QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK | ++ QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | ++ QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | ++ QCA8K_PORT_HOL_CTRL1_WRED_EN, ++ mask); ++ } ++ } ++ ++ /* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */ ++ if (priv->switch_id == QCA8K_ID_QCA8327) { ++ mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) | ++ QCA8K_GLOBAL_FC_GOL_XOFF_THRES(496); ++ qca8k_rmw(priv, QCA8K_REG_GLOBAL_FC_THRESH, ++ QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK | ++ QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK, ++ mask); ++ } ++ ++ /* Setup our port MTUs to match power on defaults */ ++ ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, ETH_FRAME_LEN + ETH_FCS_LEN); ++ if (ret) ++ dev_warn(priv->dev, "failed setting MTU settings"); ++ ++ /* Flush the FDB table */ ++ qca8k_fdb_flush(priv); ++ ++ /* We don't have interrupts for link changes, so we need to poll */ ++ ds->pcs_poll = true; ++ ++ /* Set min a max ageing value supported */ ++ ds->ageing_time_min = 7000; ++ ds->ageing_time_max = 458745000; ++ ++ /* Set max number of LAGs supported */ ++ ds->num_lag_ids = QCA8K_NUM_LAGS; ++ ++ return 0; ++} ++ ++static void ++qca8k_mac_config_setup_internal_delay(struct qca8k_priv *priv, int cpu_port_index, ++ u32 reg) ++{ ++ u32 delay, val = 0; ++ int ret; ++ ++ /* Delay can be declared in 3 different way. ++ * Mode to rgmii and internal-delay standard binding defined ++ * rgmii-id or rgmii-tx/rx phy mode set. ++ * The parse logic set a delay different than 0 only when one ++ * of the 3 different way is used. In all other case delay is ++ * not enabled. With ID or TX/RXID delay is enabled and set ++ * to the default and recommended value. ++ */ ++ if (priv->ports_config.rgmii_tx_delay[cpu_port_index]) { ++ delay = priv->ports_config.rgmii_tx_delay[cpu_port_index]; ++ ++ val |= QCA8K_PORT_PAD_RGMII_TX_DELAY(delay) | ++ QCA8K_PORT_PAD_RGMII_TX_DELAY_EN; ++ } ++ ++ if (priv->ports_config.rgmii_rx_delay[cpu_port_index]) { ++ delay = priv->ports_config.rgmii_rx_delay[cpu_port_index]; ++ ++ val |= QCA8K_PORT_PAD_RGMII_RX_DELAY(delay) | ++ QCA8K_PORT_PAD_RGMII_RX_DELAY_EN; ++ } ++ ++ /* Set RGMII delay based on the selected values */ ++ ret = qca8k_rmw(priv, reg, ++ QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK | ++ QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK | ++ QCA8K_PORT_PAD_RGMII_TX_DELAY_EN | ++ QCA8K_PORT_PAD_RGMII_RX_DELAY_EN, ++ val); ++ if (ret) ++ dev_err(priv->dev, "Failed to set internal delay for CPU port%d", ++ cpu_port_index == QCA8K_CPU_PORT0 ? 0 : 6); ++} ++ ++static void ++qca8k_phylink_mac_config(struct dsa_switch *ds, int port, unsigned int mode, ++ const struct phylink_link_state *state) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int cpu_port_index, ret; ++ u32 reg, val; ++ ++ switch (port) { ++ case 0: /* 1st CPU port */ ++ if (state->interface != PHY_INTERFACE_MODE_RGMII && ++ state->interface != PHY_INTERFACE_MODE_RGMII_ID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && ++ state->interface != PHY_INTERFACE_MODE_SGMII) ++ return; ++ ++ reg = QCA8K_REG_PORT0_PAD_CTRL; ++ cpu_port_index = QCA8K_CPU_PORT0; ++ break; ++ case 1: ++ case 2: ++ case 3: ++ case 4: ++ case 5: ++ /* Internal PHY, nothing to do */ ++ return; ++ case 6: /* 2nd CPU port / external PHY */ ++ if (state->interface != PHY_INTERFACE_MODE_RGMII && ++ state->interface != PHY_INTERFACE_MODE_RGMII_ID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && ++ state->interface != PHY_INTERFACE_MODE_SGMII && ++ state->interface != PHY_INTERFACE_MODE_1000BASEX) ++ return; ++ ++ reg = QCA8K_REG_PORT6_PAD_CTRL; ++ cpu_port_index = QCA8K_CPU_PORT6; ++ break; ++ default: ++ dev_err(ds->dev, "%s: unsupported port: %i\n", __func__, port); ++ return; ++ } ++ ++ if (port != 6 && phylink_autoneg_inband(mode)) { ++ dev_err(ds->dev, "%s: in-band negotiation unsupported\n", ++ __func__); ++ return; ++ } ++ ++ switch (state->interface) { ++ case PHY_INTERFACE_MODE_RGMII: ++ case PHY_INTERFACE_MODE_RGMII_ID: ++ case PHY_INTERFACE_MODE_RGMII_TXID: ++ case PHY_INTERFACE_MODE_RGMII_RXID: ++ qca8k_write(priv, reg, QCA8K_PORT_PAD_RGMII_EN); ++ ++ /* Configure rgmii delay */ ++ qca8k_mac_config_setup_internal_delay(priv, cpu_port_index, reg); ++ ++ /* QCA8337 requires to set rgmii rx delay for all ports. ++ * This is enabled through PORT5_PAD_CTRL for all ports, ++ * rather than individual port registers. ++ */ ++ if (priv->switch_id == QCA8K_ID_QCA8337) ++ qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, ++ QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); ++ break; ++ case PHY_INTERFACE_MODE_SGMII: ++ case PHY_INTERFACE_MODE_1000BASEX: ++ /* Enable SGMII on the port */ ++ qca8k_write(priv, reg, QCA8K_PORT_PAD_SGMII_EN); ++ ++ /* Enable/disable SerDes auto-negotiation as necessary */ ++ ret = qca8k_read(priv, QCA8K_REG_PWS, &val); ++ if (ret) ++ return; ++ if (phylink_autoneg_inband(mode)) ++ val &= ~QCA8K_PWS_SERDES_AEN_DIS; ++ else ++ val |= QCA8K_PWS_SERDES_AEN_DIS; ++ qca8k_write(priv, QCA8K_REG_PWS, val); ++ ++ /* Configure the SGMII parameters */ ++ ret = qca8k_read(priv, QCA8K_REG_SGMII_CTRL, &val); ++ if (ret) ++ return; ++ ++ val |= QCA8K_SGMII_EN_SD; ++ ++ if (priv->ports_config.sgmii_enable_pll) ++ val |= QCA8K_SGMII_EN_PLL | QCA8K_SGMII_EN_RX | ++ QCA8K_SGMII_EN_TX; ++ ++ if (dsa_is_cpu_port(ds, port)) { ++ /* CPU port, we're talking to the CPU MAC, be a PHY */ ++ val &= ~QCA8K_SGMII_MODE_CTRL_MASK; ++ val |= QCA8K_SGMII_MODE_CTRL_PHY; ++ } else if (state->interface == PHY_INTERFACE_MODE_SGMII) { ++ val &= ~QCA8K_SGMII_MODE_CTRL_MASK; ++ val |= QCA8K_SGMII_MODE_CTRL_MAC; ++ } else if (state->interface == PHY_INTERFACE_MODE_1000BASEX) { ++ val &= ~QCA8K_SGMII_MODE_CTRL_MASK; ++ val |= QCA8K_SGMII_MODE_CTRL_BASEX; ++ } ++ ++ qca8k_write(priv, QCA8K_REG_SGMII_CTRL, val); ++ ++ /* From original code is reported port instability as SGMII also ++ * require delay set. Apply advised values here or take them from DT. ++ */ ++ if (state->interface == PHY_INTERFACE_MODE_SGMII) ++ qca8k_mac_config_setup_internal_delay(priv, cpu_port_index, reg); ++ ++ /* For qca8327/qca8328/qca8334/qca8338 sgmii is unique and ++ * falling edge is set writing in the PORT0 PAD reg ++ */ ++ if (priv->switch_id == QCA8K_ID_QCA8327 || ++ priv->switch_id == QCA8K_ID_QCA8337) ++ reg = QCA8K_REG_PORT0_PAD_CTRL; ++ ++ val = 0; ++ ++ /* SGMII Clock phase configuration */ ++ if (priv->ports_config.sgmii_rx_clk_falling_edge) ++ val |= QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE; ++ ++ if (priv->ports_config.sgmii_tx_clk_falling_edge) ++ val |= QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE; ++ ++ if (val) ++ ret = qca8k_rmw(priv, reg, ++ QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE | ++ QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE, ++ val); ++ ++ break; ++ default: ++ dev_err(ds->dev, "xMII mode %s not supported for port %d\n", ++ phy_modes(state->interface), port); ++ return; ++ } ++} ++ ++static void ++qca8k_phylink_validate(struct dsa_switch *ds, int port, ++ unsigned long *supported, ++ struct phylink_link_state *state) ++{ ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; ++ ++ switch (port) { ++ case 0: /* 1st CPU port */ ++ if (state->interface != PHY_INTERFACE_MODE_NA && ++ state->interface != PHY_INTERFACE_MODE_RGMII && ++ state->interface != PHY_INTERFACE_MODE_RGMII_ID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && ++ state->interface != PHY_INTERFACE_MODE_SGMII) ++ goto unsupported; ++ break; ++ case 1: ++ case 2: ++ case 3: ++ case 4: ++ case 5: ++ /* Internal PHY */ ++ if (state->interface != PHY_INTERFACE_MODE_NA && ++ state->interface != PHY_INTERFACE_MODE_GMII && ++ state->interface != PHY_INTERFACE_MODE_INTERNAL) ++ goto unsupported; ++ break; ++ case 6: /* 2nd CPU port / external PHY */ ++ if (state->interface != PHY_INTERFACE_MODE_NA && ++ state->interface != PHY_INTERFACE_MODE_RGMII && ++ state->interface != PHY_INTERFACE_MODE_RGMII_ID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_TXID && ++ state->interface != PHY_INTERFACE_MODE_RGMII_RXID && ++ state->interface != PHY_INTERFACE_MODE_SGMII && ++ state->interface != PHY_INTERFACE_MODE_1000BASEX) ++ goto unsupported; ++ break; ++ default: ++unsupported: ++ linkmode_zero(supported); ++ return; ++ } ++ ++ phylink_set_port_modes(mask); ++ phylink_set(mask, Autoneg); ++ ++ phylink_set(mask, 1000baseT_Full); ++ phylink_set(mask, 10baseT_Half); ++ phylink_set(mask, 10baseT_Full); ++ phylink_set(mask, 100baseT_Half); ++ phylink_set(mask, 100baseT_Full); ++ ++ if (state->interface == PHY_INTERFACE_MODE_1000BASEX) ++ phylink_set(mask, 1000baseX_Full); ++ ++ phylink_set(mask, Pause); ++ phylink_set(mask, Asym_Pause); ++ ++ linkmode_and(supported, supported, mask); ++ linkmode_and(state->advertising, state->advertising, mask); ++} ++ ++static int ++qca8k_phylink_mac_link_state(struct dsa_switch *ds, int port, ++ struct phylink_link_state *state) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ u32 reg; ++ int ret; ++ ++ ret = qca8k_read(priv, QCA8K_REG_PORT_STATUS(port), ®); ++ if (ret < 0) ++ return ret; ++ ++ state->link = !!(reg & QCA8K_PORT_STATUS_LINK_UP); ++ state->an_complete = state->link; ++ state->an_enabled = !!(reg & QCA8K_PORT_STATUS_LINK_AUTO); ++ state->duplex = (reg & QCA8K_PORT_STATUS_DUPLEX) ? DUPLEX_FULL : ++ DUPLEX_HALF; ++ ++ switch (reg & QCA8K_PORT_STATUS_SPEED) { ++ case QCA8K_PORT_STATUS_SPEED_10: ++ state->speed = SPEED_10; ++ break; ++ case QCA8K_PORT_STATUS_SPEED_100: ++ state->speed = SPEED_100; ++ break; ++ case QCA8K_PORT_STATUS_SPEED_1000: ++ state->speed = SPEED_1000; ++ break; ++ default: ++ state->speed = SPEED_UNKNOWN; ++ break; ++ } ++ ++ state->pause = MLO_PAUSE_NONE; ++ if (reg & QCA8K_PORT_STATUS_RXFLOW) ++ state->pause |= MLO_PAUSE_RX; ++ if (reg & QCA8K_PORT_STATUS_TXFLOW) ++ state->pause |= MLO_PAUSE_TX; ++ ++ return 1; ++} ++ ++static void ++qca8k_phylink_mac_link_down(struct dsa_switch *ds, int port, unsigned int mode, ++ phy_interface_t interface) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ qca8k_port_set_status(priv, port, 0); ++} ++ ++static void ++qca8k_phylink_mac_link_up(struct dsa_switch *ds, int port, unsigned int mode, ++ phy_interface_t interface, struct phy_device *phydev, ++ int speed, int duplex, bool tx_pause, bool rx_pause) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ u32 reg; ++ ++ if (phylink_autoneg_inband(mode)) { ++ reg = QCA8K_PORT_STATUS_LINK_AUTO; ++ } else { ++ switch (speed) { ++ case SPEED_10: ++ reg = QCA8K_PORT_STATUS_SPEED_10; ++ break; ++ case SPEED_100: ++ reg = QCA8K_PORT_STATUS_SPEED_100; ++ break; ++ case SPEED_1000: ++ reg = QCA8K_PORT_STATUS_SPEED_1000; ++ break; ++ default: ++ reg = QCA8K_PORT_STATUS_LINK_AUTO; ++ break; ++ } ++ ++ if (duplex == DUPLEX_FULL) ++ reg |= QCA8K_PORT_STATUS_DUPLEX; ++ ++ if (rx_pause || dsa_is_cpu_port(ds, port)) ++ reg |= QCA8K_PORT_STATUS_RXFLOW; ++ ++ if (tx_pause || dsa_is_cpu_port(ds, port)) ++ reg |= QCA8K_PORT_STATUS_TXFLOW; ++ } ++ ++ reg |= QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; ++ ++ qca8k_write(priv, QCA8K_REG_PORT_STATUS(port), reg); ++} ++ ++static void ++qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int i; ++ ++ if (stringset != ETH_SS_STATS) ++ return; ++ ++ for (i = 0; i < priv->info->mib_count; i++) ++ strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, ++ ETH_GSTRING_LEN); ++} ++ ++static void qca8k_mib_autocast_handler(struct dsa_switch *ds, struct sk_buff *skb) ++{ ++ struct qca8k_mib_eth_data *mib_eth_data; ++ struct qca8k_priv *priv = ds->priv; ++ const struct qca8k_mib_desc *mib; ++ struct mib_ethhdr *mib_ethhdr; ++ int i, mib_len, offset = 0; ++ u64 *data; ++ u8 port; ++ ++ mib_ethhdr = (struct mib_ethhdr *)skb_mac_header(skb); ++ mib_eth_data = &priv->mib_eth_data; ++ ++ /* The switch autocast every port. Ignore other packet and ++ * parse only the requested one. ++ */ ++ port = FIELD_GET(QCA_HDR_RECV_SOURCE_PORT, ntohs(mib_ethhdr->hdr)); ++ if (port != mib_eth_data->req_port) ++ goto exit; ++ ++ data = mib_eth_data->data; ++ ++ for (i = 0; i < priv->info->mib_count; i++) { ++ mib = &ar8327_mib[i]; ++ ++ /* First 3 mib are present in the skb head */ ++ if (i < 3) { ++ data[i] = mib_ethhdr->data[i]; ++ continue; ++ } ++ ++ mib_len = sizeof(uint32_t); ++ ++ /* Some mib are 64 bit wide */ ++ if (mib->size == 2) ++ mib_len = sizeof(uint64_t); ++ ++ /* Copy the mib value from packet to the */ ++ memcpy(data + i, skb->data + offset, mib_len); ++ ++ /* Set the offset for the next mib */ ++ offset += mib_len; ++ } ++ ++exit: ++ /* Complete on receiving all the mib packet */ ++ if (refcount_dec_and_test(&mib_eth_data->port_parsed)) ++ complete(&mib_eth_data->rw_done); ++} ++ ++static int ++qca8k_get_ethtool_stats_eth(struct dsa_switch *ds, int port, u64 *data) ++{ ++ struct dsa_port *dp = dsa_to_port(ds, port); ++ struct qca8k_mib_eth_data *mib_eth_data; ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ mib_eth_data = &priv->mib_eth_data; ++ ++ mutex_lock(&mib_eth_data->mutex); ++ ++ reinit_completion(&mib_eth_data->rw_done); ++ ++ mib_eth_data->req_port = dp->index; ++ mib_eth_data->data = data; ++ refcount_set(&mib_eth_data->port_parsed, QCA8K_NUM_PORTS); ++ ++ mutex_lock(&priv->reg_mutex); ++ ++ /* Send mib autocast request */ ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, ++ QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, ++ FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_CAST) | ++ QCA8K_MIB_BUSY); ++ ++ mutex_unlock(&priv->reg_mutex); ++ ++ if (ret) ++ goto exit; ++ ++ ret = wait_for_completion_timeout(&mib_eth_data->rw_done, QCA8K_ETHERNET_TIMEOUT); ++ ++exit: ++ mutex_unlock(&mib_eth_data->mutex); ++ ++ return ret; ++} ++ ++static void ++qca8k_get_ethtool_stats(struct dsa_switch *ds, int port, ++ uint64_t *data) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ const struct qca8k_mib_desc *mib; ++ u32 reg, i, val; ++ u32 hi = 0; ++ int ret; ++ ++ if (priv->mgmt_master && priv->info->ops->autocast_mib && ++ priv->info->ops->autocast_mib(ds, port, data) > 0) ++ return; ++ ++ for (i = 0; i < priv->info->mib_count; i++) { ++ mib = &ar8327_mib[i]; ++ reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; ++ ++ ret = qca8k_read(priv, reg, &val); ++ if (ret < 0) ++ continue; ++ ++ if (mib->size == 2) { ++ ret = qca8k_read(priv, reg + 4, &hi); ++ if (ret < 0) ++ continue; ++ } ++ ++ data[i] = val; ++ if (mib->size == 2) ++ data[i] |= (u64)hi << 32; ++ } ++} ++ ++static int ++qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ if (sset != ETH_SS_STATS) ++ return 0; ++ ++ return priv->info->mib_count; ++} ++ ++static int ++qca8k_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *eee) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ u32 lpi_en = QCA8K_REG_EEE_CTRL_LPI_EN(port); ++ u32 reg; ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = qca8k_read(priv, QCA8K_REG_EEE_CTRL, ®); ++ if (ret < 0) ++ goto exit; ++ ++ if (eee->eee_enabled) ++ reg |= lpi_en; ++ else ++ reg &= ~lpi_en; ++ ret = qca8k_write(priv, QCA8K_REG_EEE_CTRL, reg); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++static int ++qca8k_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e) ++{ ++ /* Nothing to do on the port's MAC */ ++ return 0; ++} ++ ++static void ++qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ u32 stp_state; ++ ++ switch (state) { ++ case BR_STATE_DISABLED: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_DISABLED; ++ break; ++ case BR_STATE_BLOCKING: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_BLOCKING; ++ break; ++ case BR_STATE_LISTENING: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_LISTENING; ++ break; ++ case BR_STATE_LEARNING: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_LEARNING; ++ break; ++ case BR_STATE_FORWARDING: ++ default: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_FORWARD; ++ break; ++ } ++ ++ qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_STATE_MASK, stp_state); ++} ++ ++static int ++qca8k_port_bridge_join(struct dsa_switch *ds, int port, struct net_device *br) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ int port_mask, cpu_port; ++ int i, ret; ++ ++ cpu_port = dsa_to_port(ds, port)->cpu_dp->index; ++ port_mask = BIT(cpu_port); ++ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ if (dsa_is_cpu_port(ds, i)) ++ continue; ++ if (dsa_to_port(ds, i)->bridge_dev != br) ++ continue; ++ /* Add this port to the portvlan mask of the other ports ++ * in the bridge ++ */ ++ ret = regmap_set_bits(priv->regmap, ++ QCA8K_PORT_LOOKUP_CTRL(i), ++ BIT(port)); ++ if (ret) ++ return ret; ++ if (i != port) ++ port_mask |= BIT(i); ++ } ++ ++ /* Add all other ports to this ports portvlan mask */ ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_MEMBER, port_mask); ++ ++ return ret; ++} ++ ++static void ++qca8k_port_bridge_leave(struct dsa_switch *ds, int port, struct net_device *br) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ int cpu_port, i; ++ ++ cpu_port = dsa_to_port(ds, port)->cpu_dp->index; ++ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ if (dsa_is_cpu_port(ds, i)) ++ continue; ++ if (dsa_to_port(ds, i)->bridge_dev != br) ++ continue; ++ /* Remove this port to the portvlan mask of the other ports ++ * in the bridge ++ */ ++ regmap_clear_bits(priv->regmap, ++ QCA8K_PORT_LOOKUP_CTRL(i), ++ BIT(port)); ++ } ++ ++ /* Set the cpu port to be the only one in the portvlan mask of ++ * this port ++ */ ++ qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port)); ++} ++ ++static void ++qca8k_port_fast_age(struct dsa_switch *ds, int port) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_access(priv, QCA8K_FDB_FLUSH_PORT, port); ++ mutex_unlock(&priv->reg_mutex); ++} ++ ++static int ++qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ unsigned int secs = msecs / 1000; ++ u32 val; ++ ++ /* AGE_TIME reg is set in 7s step */ ++ val = secs / 7; ++ ++ /* Handle case with 0 as val to NOT disable ++ * learning ++ */ ++ if (!val) ++ val = 1; ++ ++ return regmap_update_bits(priv->regmap, QCA8K_REG_ATU_CTRL, QCA8K_ATU_AGE_TIME_MASK, ++ QCA8K_ATU_AGE_TIME(val)); ++} ++ ++static int ++qca8k_port_enable(struct dsa_switch *ds, int port, ++ struct phy_device *phy) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ ++ qca8k_port_set_status(priv, port, 1); ++ priv->port_enabled_map |= BIT(port); ++ ++ if (dsa_is_user_port(ds, port)) ++ phy_support_asym_pause(phy); ++ ++ return 0; ++} ++ ++static void ++qca8k_port_disable(struct dsa_switch *ds, int port) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ ++ qca8k_port_set_status(priv, port, 0); ++ priv->port_enabled_map &= ~BIT(port); ++} ++ ++static int ++qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ /* We have only have a general MTU setting. ++ * DSA always set the CPU port's MTU to the largest MTU of the slave ++ * ports. ++ * Setting MTU just for the CPU port is sufficient to correctly set a ++ * value for every port. ++ */ ++ if (!dsa_is_cpu_port(ds, port)) ++ return 0; ++ ++ /* To change the MAX_FRAME_SIZE the cpu ports must be off or ++ * the switch panics. ++ * Turn off both cpu ports before applying the new value to prevent ++ * this. ++ */ ++ if (priv->port_enabled_map & BIT(0)) ++ qca8k_port_set_status(priv, 0, 0); ++ ++ if (priv->port_enabled_map & BIT(6)) ++ qca8k_port_set_status(priv, 6, 0); ++ ++ /* Include L2 header / FCS length */ ++ ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ETH_HLEN + ETH_FCS_LEN); ++ ++ if (priv->port_enabled_map & BIT(0)) ++ qca8k_port_set_status(priv, 0, 1); ++ ++ if (priv->port_enabled_map & BIT(6)) ++ qca8k_port_set_status(priv, 6, 1); ++ ++ return ret; ++} ++ ++static int ++qca8k_port_max_mtu(struct dsa_switch *ds, int port) ++{ ++ return QCA8K_MAX_MTU; ++} ++ ++static int ++qca8k_port_fdb_insert(struct qca8k_priv *priv, const u8 *addr, ++ u16 port_mask, u16 vid) ++{ ++ /* Set the vid to the port vlan id if no vid is set */ ++ if (!vid) ++ vid = QCA8K_PORT_VID_DEF; ++ ++ return qca8k_fdb_add(priv, addr, port_mask, vid, ++ QCA8K_ATU_STATUS_STATIC); ++} ++ ++static int ++qca8k_port_fdb_add(struct dsa_switch *ds, int port, ++ const unsigned char *addr, u16 vid) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ u16 port_mask = BIT(port); ++ ++ return qca8k_port_fdb_insert(priv, addr, port_mask, vid); ++} ++ ++static int ++qca8k_port_fdb_del(struct dsa_switch *ds, int port, ++ const unsigned char *addr, u16 vid) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ u16 port_mask = BIT(port); ++ ++ if (!vid) ++ vid = QCA8K_PORT_VID_DEF; ++ ++ return qca8k_fdb_del(priv, addr, port_mask, vid); ++} ++ ++static int ++qca8k_port_fdb_dump(struct dsa_switch *ds, int port, ++ dsa_fdb_dump_cb_t *cb, void *data) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ struct qca8k_fdb _fdb = { 0 }; ++ int cnt = QCA8K_NUM_FDB_RECORDS; ++ bool is_static; ++ int ret = 0; ++ ++ mutex_lock(&priv->reg_mutex); ++ while (cnt-- && !qca8k_fdb_next(priv, &_fdb, port)) { ++ if (!_fdb.aging) ++ break; ++ is_static = (_fdb.aging == QCA8K_ATU_STATUS_STATIC); ++ ret = cb(_fdb.mac, _fdb.vid, is_static, data); ++ if (ret) ++ break; ++ } ++ mutex_unlock(&priv->reg_mutex); ++ ++ return 0; ++} ++ ++static int ++qca8k_port_mdb_add(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ const u8 *addr = mdb->addr; ++ u16 vid = mdb->vid; ++ ++ return qca8k_fdb_search_and_insert(priv, BIT(port), addr, vid); ++} ++ ++static int ++qca8k_port_mdb_del(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ const u8 *addr = mdb->addr; ++ u16 vid = mdb->vid; ++ ++ return qca8k_fdb_search_and_del(priv, BIT(port), addr, vid); ++} ++ ++static int ++qca8k_port_mirror_add(struct dsa_switch *ds, int port, ++ struct dsa_mall_mirror_tc_entry *mirror, ++ bool ingress) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int monitor_port, ret; ++ u32 reg, val; ++ ++ /* Check for existent entry */ ++ if ((ingress ? priv->mirror_rx : priv->mirror_tx) & BIT(port)) ++ return -EEXIST; ++ ++ ret = regmap_read(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, &val); ++ if (ret) ++ return ret; ++ ++ /* QCA83xx can have only one port set to mirror mode. ++ * Check that the correct port is requested and return error otherwise. ++ * When no mirror port is set, the values is set to 0xF ++ */ ++ monitor_port = FIELD_GET(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (monitor_port != 0xF && monitor_port != mirror->to_local_port) ++ return -EEXIST; ++ ++ /* Set the monitor port */ ++ val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, ++ mirror->to_local_port); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, ++ QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (ret) ++ return ret; ++ ++ if (ingress) { ++ reg = QCA8K_PORT_LOOKUP_CTRL(port); ++ val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; ++ } else { ++ reg = QCA8K_REG_PORT_HOL_CTRL1(port); ++ val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; ++ } ++ ++ ret = regmap_update_bits(priv->regmap, reg, val, val); ++ if (ret) ++ return ret; ++ ++ /* Track mirror port for tx and rx to decide when the ++ * mirror port has to be disabled. ++ */ ++ if (ingress) ++ priv->mirror_rx |= BIT(port); ++ else ++ priv->mirror_tx |= BIT(port); ++ ++ return 0; ++} ++ ++static void ++qca8k_port_mirror_del(struct dsa_switch *ds, int port, ++ struct dsa_mall_mirror_tc_entry *mirror) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ u32 reg, val; ++ int ret; ++ ++ if (mirror->ingress) { ++ reg = QCA8K_PORT_LOOKUP_CTRL(port); ++ val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; ++ } else { ++ reg = QCA8K_REG_PORT_HOL_CTRL1(port); ++ val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; ++ } ++ ++ ret = regmap_clear_bits(priv->regmap, reg, val); ++ if (ret) ++ goto err; ++ ++ if (mirror->ingress) ++ priv->mirror_rx &= ~BIT(port); ++ else ++ priv->mirror_tx &= ~BIT(port); ++ ++ /* No port set to send packet to mirror port. Disable mirror port */ ++ if (!priv->mirror_rx && !priv->mirror_tx) { ++ val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, 0xF); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, ++ QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (ret) ++ goto err; ++ } ++err: ++ dev_err(priv->dev, "Failed to del mirror port from %d", port); ++} ++ ++static int ++qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, ++ struct netlink_ext_ack *extack) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ if (vlan_filtering) { ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, ++ QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE); ++ } else { ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, ++ QCA8K_PORT_LOOKUP_VLAN_MODE_NONE); ++ } ++ ++ return ret; ++} ++ ++static int ++qca8k_port_vlan_add(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_vlan *vlan, ++ struct netlink_ext_ack *extack) ++{ ++ bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; ++ bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID; ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ ret = qca8k_vlan_add(priv, port, vlan->vid, untagged); ++ if (ret) { ++ dev_err(priv->dev, "Failed to add VLAN to port %d (%d)", port, ret); ++ return ret; ++ } ++ ++ if (pvid) { ++ ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port), ++ QCA8K_EGREES_VLAN_PORT_MASK(port), ++ QCA8K_EGREES_VLAN_PORT(port, vlan->vid)); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port), ++ QCA8K_PORT_VLAN_CVID(vlan->vid) | ++ QCA8K_PORT_VLAN_SVID(vlan->vid)); ++ } ++ ++ return ret; ++} ++ ++static int ++qca8k_port_vlan_del(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_vlan *vlan) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ ret = qca8k_vlan_del(priv, port, vlan->vid); ++ if (ret) ++ dev_err(priv->dev, "Failed to delete VLAN from port %d (%d)", port, ret); ++ ++ return ret; ++} ++ ++static u32 qca8k_get_phy_flags(struct dsa_switch *ds, int port) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ /* Communicate to the phy internal driver the switch revision. ++ * Based on the switch revision different values needs to be ++ * set to the dbg and mmd reg on the phy. ++ * The first 2 bit are used to communicate the switch revision ++ * to the phy driver. ++ */ ++ if (port > 0 && port < 6) ++ return priv->switch_revision; ++ ++ return 0; ++} ++ ++static enum dsa_tag_protocol ++qca8k_get_tag_protocol(struct dsa_switch *ds, int port, ++ enum dsa_tag_protocol mp) ++{ ++ return DSA_TAG_PROTO_QCA; ++} ++ ++static bool ++qca8k_lag_can_offload(struct dsa_switch *ds, ++ struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ struct dsa_port *dp; ++ int id, members = 0; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ if (id < 0 || id >= ds->num_lag_ids) ++ return false; ++ ++ dsa_lag_foreach_port(dp, ds->dst, lag) ++ /* Includes the port joining the LAG */ ++ members++; ++ ++ if (members > QCA8K_NUM_PORTS_FOR_LAG) ++ return false; ++ ++ if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) ++ return false; ++ ++ if (info->hash_type != NETDEV_LAG_HASH_L2 && ++ info->hash_type != NETDEV_LAG_HASH_L23) ++ return false; ++ ++ return true; ++} ++ ++static int ++qca8k_lag_setup_hash(struct dsa_switch *ds, ++ struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ bool unique_lag = true; ++ u32 hash = 0; ++ int i, id; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ ++ switch (info->hash_type) { ++ case NETDEV_LAG_HASH_L23: ++ hash |= QCA8K_TRUNK_HASH_SIP_EN; ++ hash |= QCA8K_TRUNK_HASH_DIP_EN; ++ fallthrough; ++ case NETDEV_LAG_HASH_L2: ++ hash |= QCA8K_TRUNK_HASH_SA_EN; ++ hash |= QCA8K_TRUNK_HASH_DA_EN; ++ break; ++ default: /* We should NEVER reach this */ ++ return -EOPNOTSUPP; ++ } ++ ++ /* Check if we are the unique configured LAG */ ++ dsa_lags_foreach_id(i, ds->dst) ++ if (i != id && dsa_lag_dev(ds->dst, i)) { ++ unique_lag = false; ++ break; ++ } ++ ++ /* Hash Mode is global. Make sure the same Hash Mode ++ * is set to all the 4 possible lag. ++ * If we are the unique LAG we can set whatever hash ++ * mode we want. ++ * To change hash mode it's needed to remove all LAG ++ * and change the mode with the latest. ++ */ ++ if (unique_lag) { ++ priv->lag_hash_mode = hash; ++ } else if (priv->lag_hash_mode != hash) { ++ netdev_err(lag, "Error: Mismateched Hash Mode across different lag is not supported\n"); ++ return -EOPNOTSUPP; ++ } ++ ++ return regmap_update_bits(priv->regmap, QCA8K_TRUNK_HASH_EN_CTRL, ++ QCA8K_TRUNK_HASH_MASK, hash); ++} ++ ++static int ++qca8k_lag_refresh_portmap(struct dsa_switch *ds, int port, ++ struct net_device *lag, bool delete) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret, id, i; ++ u32 val; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ ++ /* Read current port member */ ++ ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, &val); ++ if (ret) ++ return ret; ++ ++ /* Shift val to the correct trunk */ ++ val >>= QCA8K_REG_GOL_TRUNK_SHIFT(id); ++ val &= QCA8K_REG_GOL_TRUNK_MEMBER_MASK; ++ if (delete) ++ val &= ~BIT(port); ++ else ++ val |= BIT(port); ++ ++ /* Update port member. With empty portmap disable trunk */ ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, ++ QCA8K_REG_GOL_TRUNK_MEMBER(id) | ++ QCA8K_REG_GOL_TRUNK_EN(id), ++ !val << QCA8K_REG_GOL_TRUNK_SHIFT(id) | ++ val << QCA8K_REG_GOL_TRUNK_SHIFT(id)); ++ ++ /* Search empty member if adding or port on deleting */ ++ for (i = 0; i < QCA8K_NUM_PORTS_FOR_LAG; i++) { ++ ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), &val); ++ if (ret) ++ return ret; ++ ++ val >>= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i); ++ val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_MASK; ++ ++ if (delete) { ++ /* If port flagged to be disabled assume this member is ++ * empty ++ */ ++ if (val != QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) ++ continue; ++ ++ val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK; ++ if (val != port) ++ continue; ++ } else { ++ /* If port flagged to be enabled assume this member is ++ * already set ++ */ ++ if (val == QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) ++ continue; ++ } ++ ++ /* We have found the member to add/remove */ ++ break; ++ } ++ ++ /* Set port in the correct port mask or disable port if in delete mode */ ++ return regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), ++ QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN(id, i) | ++ QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT(id, i), ++ !delete << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i) | ++ port << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i)); ++} ++ ++static int ++qca8k_port_lag_join(struct dsa_switch *ds, int port, ++ struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ int ret; ++ ++ if (!qca8k_lag_can_offload(ds, lag, info)) ++ return -EOPNOTSUPP; ++ ++ ret = qca8k_lag_setup_hash(ds, lag, info); ++ if (ret) ++ return ret; ++ ++ return qca8k_lag_refresh_portmap(ds, port, lag, false); ++} ++ ++static int ++qca8k_port_lag_leave(struct dsa_switch *ds, int port, ++ struct net_device *lag) ++{ ++ return qca8k_lag_refresh_portmap(ds, port, lag, true); ++} ++ ++static void ++qca8k_master_change(struct dsa_switch *ds, const struct net_device *master, ++ bool operational) ++{ ++ struct dsa_port *dp = master->dsa_ptr; ++ struct qca8k_priv *priv = ds->priv; ++ ++ /* Ethernet MIB/MDIO is only supported for CPU port 0 */ ++ if (dp->index != 0) ++ return; ++ ++ mutex_lock(&priv->mgmt_eth_data.mutex); ++ mutex_lock(&priv->mib_eth_data.mutex); ++ ++ priv->mgmt_master = operational ? (struct net_device *)master : NULL; ++ ++ mutex_unlock(&priv->mib_eth_data.mutex); ++ mutex_unlock(&priv->mgmt_eth_data.mutex); ++} ++ ++static int qca8k_connect_tag_protocol(struct dsa_switch *ds, ++ enum dsa_tag_protocol proto) ++{ ++ struct qca_tagger_data *tagger_data; ++ ++ switch (proto) { ++ case DSA_TAG_PROTO_QCA: ++ tagger_data = ds->tagger_data; ++ ++ tagger_data->rw_reg_ack_handler = qca8k_rw_reg_ack_handler; ++ tagger_data->mib_autocast_handler = qca8k_mib_autocast_handler; ++ ++ break; ++ default: ++ return -EOPNOTSUPP; ++ } ++ ++ return 0; ++} ++ ++static const struct dsa_switch_ops qca8k_switch_ops = { ++ .get_tag_protocol = qca8k_get_tag_protocol, ++ .setup = qca8k_setup, ++ .get_strings = qca8k_get_strings, ++ .get_ethtool_stats = qca8k_get_ethtool_stats, ++ .get_sset_count = qca8k_get_sset_count, ++ .set_ageing_time = qca8k_set_ageing_time, ++ .get_mac_eee = qca8k_get_mac_eee, ++ .set_mac_eee = qca8k_set_mac_eee, ++ .port_enable = qca8k_port_enable, ++ .port_disable = qca8k_port_disable, ++ .port_change_mtu = qca8k_port_change_mtu, ++ .port_max_mtu = qca8k_port_max_mtu, ++ .port_stp_state_set = qca8k_port_stp_state_set, ++ .port_bridge_join = qca8k_port_bridge_join, ++ .port_bridge_leave = qca8k_port_bridge_leave, ++ .port_fast_age = qca8k_port_fast_age, ++ .port_fdb_add = qca8k_port_fdb_add, ++ .port_fdb_del = qca8k_port_fdb_del, ++ .port_fdb_dump = qca8k_port_fdb_dump, ++ .port_mdb_add = qca8k_port_mdb_add, ++ .port_mdb_del = qca8k_port_mdb_del, ++ .port_mirror_add = qca8k_port_mirror_add, ++ .port_mirror_del = qca8k_port_mirror_del, ++ .port_vlan_filtering = qca8k_port_vlan_filtering, ++ .port_vlan_add = qca8k_port_vlan_add, ++ .port_vlan_del = qca8k_port_vlan_del, ++ .phylink_validate = qca8k_phylink_validate, ++ .phylink_mac_link_state = qca8k_phylink_mac_link_state, ++ .phylink_mac_config = qca8k_phylink_mac_config, ++ .phylink_mac_link_down = qca8k_phylink_mac_link_down, ++ .phylink_mac_link_up = qca8k_phylink_mac_link_up, ++ .get_phy_flags = qca8k_get_phy_flags, ++ .port_lag_join = qca8k_port_lag_join, ++ .port_lag_leave = qca8k_port_lag_leave, ++ .master_state_change = qca8k_master_change, ++ .connect_tag_protocol = qca8k_connect_tag_protocol, ++}; ++ ++static int qca8k_read_switch_id(struct qca8k_priv *priv) ++{ ++ u32 val; ++ u8 id; ++ int ret; ++ ++ if (!priv->info) ++ return -ENODEV; ++ ++ ret = qca8k_read(priv, QCA8K_REG_MASK_CTRL, &val); ++ if (ret < 0) ++ return -ENODEV; ++ ++ id = QCA8K_MASK_CTRL_DEVICE_ID(val); ++ if (id != priv->info->id) { ++ dev_err(priv->dev, ++ "Switch id detected %x but expected %x", ++ id, priv->info->id); ++ return -ENODEV; ++ } ++ ++ priv->switch_id = id; ++ ++ /* Save revision to communicate to the internal PHY driver */ ++ priv->switch_revision = QCA8K_MASK_CTRL_REV_ID(val); ++ ++ return 0; ++} ++ ++static int ++qca8k_sw_probe(struct mdio_device *mdiodev) ++{ ++ struct qca8k_priv *priv; ++ int ret; ++ ++ /* allocate the private data struct so that we can probe the switches ++ * ID register ++ */ ++ priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ priv->info = of_device_get_match_data(priv->dev); ++ priv->bus = mdiodev->bus; ++ priv->dev = &mdiodev->dev; ++ ++ priv->reset_gpio = devm_gpiod_get_optional(priv->dev, "reset", ++ GPIOD_ASIS); ++ if (IS_ERR(priv->reset_gpio)) ++ return PTR_ERR(priv->reset_gpio); ++ ++ if (priv->reset_gpio) { ++ gpiod_set_value_cansleep(priv->reset_gpio, 1); ++ /* The active low duration must be greater than 10 ms ++ * and checkpatch.pl wants 20 ms. ++ */ ++ msleep(20); ++ gpiod_set_value_cansleep(priv->reset_gpio, 0); ++ } ++ ++ /* Start by setting up the register mapping */ ++ priv->regmap = devm_regmap_init(&mdiodev->dev, NULL, priv, ++ &qca8k_regmap_config); ++ if (IS_ERR(priv->regmap)) { ++ dev_err(priv->dev, "regmap initialization failed"); ++ return PTR_ERR(priv->regmap); ++ } ++ ++ priv->mdio_cache.page = 0xffff; ++ priv->mdio_cache.lo = 0xffff; ++ priv->mdio_cache.hi = 0xffff; ++ ++ /* Check the detected switch id */ ++ ret = qca8k_read_switch_id(priv); ++ if (ret) ++ return ret; ++ ++ priv->ds = devm_kzalloc(&mdiodev->dev, sizeof(*priv->ds), GFP_KERNEL); ++ if (!priv->ds) ++ return -ENOMEM; ++ ++ mutex_init(&priv->mgmt_eth_data.mutex); ++ init_completion(&priv->mgmt_eth_data.rw_done); ++ ++ mutex_init(&priv->mib_eth_data.mutex); ++ init_completion(&priv->mib_eth_data.rw_done); ++ ++ priv->ds->dev = &mdiodev->dev; ++ priv->ds->num_ports = QCA8K_NUM_PORTS; ++ priv->ds->priv = priv; ++ priv->ds->ops = &qca8k_switch_ops; ++ mutex_init(&priv->reg_mutex); ++ dev_set_drvdata(&mdiodev->dev, priv); ++ ++ return dsa_register_switch(priv->ds); ++} ++ ++static void ++qca8k_sw_remove(struct mdio_device *mdiodev) ++{ ++ struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev); ++ int i; ++ ++ if (!priv) ++ return; ++ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) ++ qca8k_port_set_status(priv, i, 0); ++ ++ dsa_unregister_switch(priv->ds); ++ ++ dev_set_drvdata(&mdiodev->dev, NULL); ++} ++ ++static void qca8k_sw_shutdown(struct mdio_device *mdiodev) ++{ ++ struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev); ++ ++ if (!priv) ++ return; ++ ++ dsa_switch_shutdown(priv->ds); ++ ++ dev_set_drvdata(&mdiodev->dev, NULL); ++} ++ ++#ifdef CONFIG_PM_SLEEP ++static void ++qca8k_set_pm(struct qca8k_priv *priv, int enable) ++{ ++ int port; ++ ++ for (port = 0; port < QCA8K_NUM_PORTS; port++) { ++ /* Do not enable on resume if the port was ++ * disabled before. ++ */ ++ if (!(priv->port_enabled_map & BIT(port))) ++ continue; ++ ++ qca8k_port_set_status(priv, port, enable); ++ } ++} ++ ++static int qca8k_suspend(struct device *dev) ++{ ++ struct qca8k_priv *priv = dev_get_drvdata(dev); ++ ++ qca8k_set_pm(priv, 0); ++ ++ return dsa_switch_suspend(priv->ds); ++} ++ ++static int qca8k_resume(struct device *dev) ++{ ++ struct qca8k_priv *priv = dev_get_drvdata(dev); ++ ++ qca8k_set_pm(priv, 1); ++ ++ return dsa_switch_resume(priv->ds); ++} ++#endif /* CONFIG_PM_SLEEP */ ++ ++static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, ++ qca8k_suspend, qca8k_resume); ++ ++static const struct qca8k_info_ops qca8xxx_ops = { ++ .autocast_mib = qca8k_get_ethtool_stats_eth, ++}; ++ ++static const struct qca8k_match_data qca8327 = { ++ .id = QCA8K_ID_QCA8327, ++ .reduced_package = true, ++ .mib_count = QCA8K_QCA832X_MIB_COUNT, ++ .ops = &qca8xxx_ops, ++}; ++ ++static const struct qca8k_match_data qca8328 = { ++ .id = QCA8K_ID_QCA8327, ++ .mib_count = QCA8K_QCA832X_MIB_COUNT, ++ .ops = &qca8xxx_ops, ++}; ++ ++static const struct qca8k_match_data qca833x = { ++ .id = QCA8K_ID_QCA8337, ++ .mib_count = QCA8K_QCA833X_MIB_COUNT, ++ .ops = &qca8xxx_ops, ++}; ++ ++static const struct of_device_id qca8k_of_match[] = { ++ { .compatible = "qca,qca8327", .data = &qca8327 }, ++ { .compatible = "qca,qca8328", .data = &qca8328 }, ++ { .compatible = "qca,qca8334", .data = &qca833x }, ++ { .compatible = "qca,qca8337", .data = &qca833x }, ++ { /* sentinel */ }, ++}; ++ ++static struct mdio_driver qca8kmdio_driver = { ++ .probe = qca8k_sw_probe, ++ .remove = qca8k_sw_remove, ++ .shutdown = qca8k_sw_shutdown, ++ .mdiodrv.driver = { ++ .name = "qca8k", ++ .of_match_table = qca8k_of_match, ++ .pm = &qca8k_pm_ops, ++ }, ++}; ++ ++mdio_module_driver(qca8kmdio_driver); ++ ++MODULE_AUTHOR("Mathieu Olivari, John Crispin "); ++MODULE_DESCRIPTION("Driver for QCA8K ethernet switch family"); ++MODULE_LICENSE("GPL v2"); ++MODULE_ALIAS("platform:qca8k"); +--- /dev/null ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -0,0 +1,63 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2009 Felix Fietkau ++ * Copyright (C) 2011-2012 Gabor Juhos ++ * Copyright (c) 2015, 2019, The Linux Foundation. All rights reserved. ++ * Copyright (c) 2016 John Crispin ++ */ ++ ++#include ++#include ++ ++#include "qca8k.h" ++ ++#define MIB_DESC(_s, _o, _n) \ ++ { \ ++ .size = (_s), \ ++ .offset = (_o), \ ++ .name = (_n), \ ++ } ++ ++const struct qca8k_mib_desc ar8327_mib[] = { ++ MIB_DESC(1, 0x00, "RxBroad"), ++ MIB_DESC(1, 0x04, "RxPause"), ++ MIB_DESC(1, 0x08, "RxMulti"), ++ MIB_DESC(1, 0x0c, "RxFcsErr"), ++ MIB_DESC(1, 0x10, "RxAlignErr"), ++ MIB_DESC(1, 0x14, "RxRunt"), ++ MIB_DESC(1, 0x18, "RxFragment"), ++ MIB_DESC(1, 0x1c, "Rx64Byte"), ++ MIB_DESC(1, 0x20, "Rx128Byte"), ++ MIB_DESC(1, 0x24, "Rx256Byte"), ++ MIB_DESC(1, 0x28, "Rx512Byte"), ++ MIB_DESC(1, 0x2c, "Rx1024Byte"), ++ MIB_DESC(1, 0x30, "Rx1518Byte"), ++ MIB_DESC(1, 0x34, "RxMaxByte"), ++ MIB_DESC(1, 0x38, "RxTooLong"), ++ MIB_DESC(2, 0x3c, "RxGoodByte"), ++ MIB_DESC(2, 0x44, "RxBadByte"), ++ MIB_DESC(1, 0x4c, "RxOverFlow"), ++ MIB_DESC(1, 0x50, "Filtered"), ++ MIB_DESC(1, 0x54, "TxBroad"), ++ MIB_DESC(1, 0x58, "TxPause"), ++ MIB_DESC(1, 0x5c, "TxMulti"), ++ MIB_DESC(1, 0x60, "TxUnderRun"), ++ MIB_DESC(1, 0x64, "Tx64Byte"), ++ MIB_DESC(1, 0x68, "Tx128Byte"), ++ MIB_DESC(1, 0x6c, "Tx256Byte"), ++ MIB_DESC(1, 0x70, "Tx512Byte"), ++ MIB_DESC(1, 0x74, "Tx1024Byte"), ++ MIB_DESC(1, 0x78, "Tx1518Byte"), ++ MIB_DESC(1, 0x7c, "TxMaxByte"), ++ MIB_DESC(1, 0x80, "TxOverSize"), ++ MIB_DESC(2, 0x84, "TxByte"), ++ MIB_DESC(1, 0x8c, "TxCollision"), ++ MIB_DESC(1, 0x90, "TxAbortCol"), ++ MIB_DESC(1, 0x94, "TxMultiCol"), ++ MIB_DESC(1, 0x98, "TxSingleCol"), ++ MIB_DESC(1, 0x9c, "TxExcDefer"), ++ MIB_DESC(1, 0xa0, "TxDefer"), ++ MIB_DESC(1, 0xa4, "TxLateCol"), ++ MIB_DESC(1, 0xa8, "RXUnicast"), ++ MIB_DESC(1, 0xac, "TXUnicast"), ++}; +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -414,4 +414,7 @@ struct qca8k_fdb { + u8 mac[6]; + }; + ++/* Common setup function */ ++extern const struct qca8k_mib_desc ar8327_mib[]; ++ + #endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-04-net-dsa-qca8k-move-qca8k-read-write-rmw-and-reg-tabl.patch b/target/linux/generic/backport-5.15/771-v6.0-04-net-dsa-qca8k-move-qca8k-read-write-rmw-and-reg-tabl.patch new file mode 100644 index 0000000000..012ab85474 --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-04-net-dsa-qca8k-move-qca8k-read-write-rmw-and-reg-tabl.patch @@ -0,0 +1,135 @@ +From d5f901eab2e9dfed1095995dfc98f231f4fd2971 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:13 +0200 +Subject: [PATCH 04/14] net: dsa: qca8k: move qca8k read/write/rmw and reg + table to common code + +The same reg table and read/write/rmw function are used by drivers +based on qca8k family switch. +Move them to common code to make it accessible also by other drivers. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 42 ------------------------------ + drivers/net/dsa/qca/qca8k-common.c | 38 +++++++++++++++++++++++++++ + drivers/net/dsa/qca/qca8k.h | 6 +++++ + 3 files changed, 44 insertions(+), 42 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -133,24 +133,6 @@ qca8k_set_page(struct qca8k_priv *priv, + return 0; + } + +-static int +-qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val) +-{ +- return regmap_read(priv->regmap, reg, val); +-} +- +-static int +-qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val) +-{ +- return regmap_write(priv->regmap, reg, val); +-} +- +-static int +-qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) +-{ +- return regmap_update_bits(priv->regmap, reg, mask, write_val); +-} +- + static void qca8k_rw_reg_ack_handler(struct dsa_switch *ds, struct sk_buff *skb) + { + struct qca8k_mgmt_eth_data *mgmt_eth_data; +@@ -483,30 +465,6 @@ exit: + return ret; + } + +-static const struct regmap_range qca8k_readable_ranges[] = { +- regmap_reg_range(0x0000, 0x00e4), /* Global control */ +- regmap_reg_range(0x0100, 0x0168), /* EEE control */ +- regmap_reg_range(0x0200, 0x0270), /* Parser control */ +- regmap_reg_range(0x0400, 0x0454), /* ACL */ +- regmap_reg_range(0x0600, 0x0718), /* Lookup */ +- regmap_reg_range(0x0800, 0x0b70), /* QM */ +- regmap_reg_range(0x0c00, 0x0c80), /* PKT */ +- regmap_reg_range(0x0e00, 0x0e98), /* L3 */ +- regmap_reg_range(0x1000, 0x10ac), /* MIB - Port0 */ +- regmap_reg_range(0x1100, 0x11ac), /* MIB - Port1 */ +- regmap_reg_range(0x1200, 0x12ac), /* MIB - Port2 */ +- regmap_reg_range(0x1300, 0x13ac), /* MIB - Port3 */ +- regmap_reg_range(0x1400, 0x14ac), /* MIB - Port4 */ +- regmap_reg_range(0x1500, 0x15ac), /* MIB - Port5 */ +- regmap_reg_range(0x1600, 0x16ac), /* MIB - Port6 */ +- +-}; +- +-static const struct regmap_access_table qca8k_readable_table = { +- .yes_ranges = qca8k_readable_ranges, +- .n_yes_ranges = ARRAY_SIZE(qca8k_readable_ranges), +-}; +- + static struct regmap_config qca8k_regmap_config = { + .reg_bits = 16, + .val_bits = 32, +--- a/drivers/net/dsa/qca/qca8k-common.c ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -61,3 +61,41 @@ const struct qca8k_mib_desc ar8327_mib[] + MIB_DESC(1, 0xa8, "RXUnicast"), + MIB_DESC(1, 0xac, "TXUnicast"), + }; ++ ++int qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val) ++{ ++ return regmap_read(priv->regmap, reg, val); ++} ++ ++int qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val) ++{ ++ return regmap_write(priv->regmap, reg, val); ++} ++ ++int qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) ++{ ++ return regmap_update_bits(priv->regmap, reg, mask, write_val); ++} ++ ++static const struct regmap_range qca8k_readable_ranges[] = { ++ regmap_reg_range(0x0000, 0x00e4), /* Global control */ ++ regmap_reg_range(0x0100, 0x0168), /* EEE control */ ++ regmap_reg_range(0x0200, 0x0270), /* Parser control */ ++ regmap_reg_range(0x0400, 0x0454), /* ACL */ ++ regmap_reg_range(0x0600, 0x0718), /* Lookup */ ++ regmap_reg_range(0x0800, 0x0b70), /* QM */ ++ regmap_reg_range(0x0c00, 0x0c80), /* PKT */ ++ regmap_reg_range(0x0e00, 0x0e98), /* L3 */ ++ regmap_reg_range(0x1000, 0x10ac), /* MIB - Port0 */ ++ regmap_reg_range(0x1100, 0x11ac), /* MIB - Port1 */ ++ regmap_reg_range(0x1200, 0x12ac), /* MIB - Port2 */ ++ regmap_reg_range(0x1300, 0x13ac), /* MIB - Port3 */ ++ regmap_reg_range(0x1400, 0x14ac), /* MIB - Port4 */ ++ regmap_reg_range(0x1500, 0x15ac), /* MIB - Port5 */ ++ regmap_reg_range(0x1600, 0x16ac), /* MIB - Port6 */ ++}; ++ ++const struct regmap_access_table qca8k_readable_table = { ++ .yes_ranges = qca8k_readable_ranges, ++ .n_yes_ranges = ARRAY_SIZE(qca8k_readable_ranges), ++}; +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -416,5 +416,11 @@ struct qca8k_fdb { + + /* Common setup function */ + extern const struct qca8k_mib_desc ar8327_mib[]; ++extern const struct regmap_access_table qca8k_readable_table; ++ ++/* Common read/write/rmw function */ ++int qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val); ++int qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val); ++int qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val); + + #endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-05-net-dsa-qca8k-move-qca8k-bulk-read-write-helper-to-c.patch b/target/linux/generic/backport-5.15/771-v6.0-05-net-dsa-qca8k-move-qca8k-bulk-read-write-helper-to-c.patch new file mode 100644 index 0000000000..0ed7ed41fb --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-05-net-dsa-qca8k-move-qca8k-bulk-read-write-helper-to-c.patch @@ -0,0 +1,145 @@ +From 910746444313dc463396cd63024cdf54ef04ef39 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:14 +0200 +Subject: [PATCH 05/14] net: dsa: qca8k: move qca8k bulk read/write helper to + common code + +The same ATU function are used by drivers based on qca8k family switch. +Move the bulk read/write helper to common code to declare these shared +ATU functions in common code. +These helper will be dropped when regmap correctly support bulk +read/write. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 39 ++---------------------------- + drivers/net/dsa/qca/qca8k-common.c | 39 ++++++++++++++++++++++++++++++ + drivers/net/dsa/qca/qca8k.h | 8 ++++++ + 3 files changed, 49 insertions(+), 37 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -343,43 +343,6 @@ qca8k_regmap_update_bits_eth(struct qca8 + } + + static int +-qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len) +-{ +- int i, count = len / sizeof(u32), ret; +- +- if (priv->mgmt_master && !qca8k_read_eth(priv, reg, val, len)) +- return 0; +- +- for (i = 0; i < count; i++) { +- ret = regmap_read(priv->regmap, reg + (i * 4), val + i); +- if (ret < 0) +- return ret; +- } +- +- return 0; +-} +- +-static int +-qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len) +-{ +- int i, count = len / sizeof(u32), ret; +- u32 tmp; +- +- if (priv->mgmt_master && !qca8k_write_eth(priv, reg, val, len)) +- return 0; +- +- for (i = 0; i < count; i++) { +- tmp = val[i]; +- +- ret = regmap_write(priv->regmap, reg + (i * 4), tmp); +- if (ret < 0) +- return ret; +- } +- +- return 0; +-} +- +-static int + qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) + { + struct qca8k_priv *priv = (struct qca8k_priv *)ctx; +@@ -3096,6 +3059,8 @@ static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, + + static const struct qca8k_info_ops qca8xxx_ops = { + .autocast_mib = qca8k_get_ethtool_stats_eth, ++ .read_eth = qca8k_read_eth, ++ .write_eth = qca8k_write_eth, + }; + + static const struct qca8k_match_data qca8327 = { +--- a/drivers/net/dsa/qca/qca8k-common.c ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -99,3 +99,42 @@ const struct regmap_access_table qca8k_r + .yes_ranges = qca8k_readable_ranges, + .n_yes_ranges = ARRAY_SIZE(qca8k_readable_ranges), + }; ++ ++/* TODO: remove these extra ops when we can support regmap bulk read/write */ ++int qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ int i, count = len / sizeof(u32), ret; ++ ++ if (priv->mgmt_master && priv->info->ops->read_eth && ++ !priv->info->ops->read_eth(priv, reg, val, len)) ++ return 0; ++ ++ for (i = 0; i < count; i++) { ++ ret = regmap_read(priv->regmap, reg + (i * 4), val + i); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ ++/* TODO: remove these extra ops when we can support regmap bulk read/write */ ++int qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++{ ++ int i, count = len / sizeof(u32), ret; ++ u32 tmp; ++ ++ if (priv->mgmt_master && priv->info->ops->write_eth && ++ !priv->info->ops->write_eth(priv, reg, val, len)) ++ return 0; ++ ++ for (i = 0; i < count; i++) { ++ tmp = val[i]; ++ ++ ret = regmap_write(priv->regmap, reg + (i * 4), tmp); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -324,8 +324,13 @@ enum qca8k_mid_cmd { + QCA8K_MIB_CAST = 3, + }; + ++struct qca8k_priv; ++ + struct qca8k_info_ops { + int (*autocast_mib)(struct dsa_switch *ds, int port, u64 *data); ++ /* TODO: remove these extra ops when we can support regmap bulk read/write */ ++ int (*read_eth)(struct qca8k_priv *priv, u32 reg, u32 *val, int len); ++ int (*write_eth)(struct qca8k_priv *priv, u32 reg, u32 *val, int len); + }; + + struct qca8k_match_data { +@@ -423,4 +428,7 @@ int qca8k_read(struct qca8k_priv *priv, + int qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val); + int qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val); + ++int qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len); ++int qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len); ++ + #endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-06-net-dsa-qca8k-move-mib-init-function-to-common-code.patch b/target/linux/generic/backport-5.15/771-v6.0-06-net-dsa-qca8k-move-mib-init-function-to-common-code.patch new file mode 100644 index 0000000000..a39a55b89b --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-06-net-dsa-qca8k-move-mib-init-function-to-common-code.patch @@ -0,0 +1,137 @@ +From fce1ec0c4e2d03d9c62ffc615a42bdba78eb4c14 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:15 +0200 +Subject: [PATCH 06/14] net: dsa: qca8k: move mib init function to common code + +The same mib function is used by drivers based on qca8k family switch. +Move it to common code to make it accessible also by other drivers. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 37 ------------------------------ + drivers/net/dsa/qca/qca8k-common.c | 35 ++++++++++++++++++++++++++++ + drivers/net/dsa/qca/qca8k.h | 4 ++++ + 3 files changed, 39 insertions(+), 37 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -442,15 +442,6 @@ static struct regmap_config qca8k_regmap + }; + + static int +-qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) +-{ +- u32 val; +- +- return regmap_read_poll_timeout(priv->regmap, reg, val, !(val & mask), 0, +- QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC); +-} +- +-static int + qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb) + { + u32 reg[3]; +@@ -777,34 +768,6 @@ out: + return ret; + } + +-static int +-qca8k_mib_init(struct qca8k_priv *priv) +-{ +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, +- QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, +- FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_FLUSH) | +- QCA8K_MIB_BUSY); +- if (ret) +- goto exit; +- +- ret = qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY); +- if (ret) +- goto exit; +- +- ret = regmap_set_bits(priv->regmap, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP); +- if (ret) +- goto exit; +- +- ret = qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- + static void + qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable) + { +--- a/drivers/net/dsa/qca/qca8k-common.c ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -7,6 +7,7 @@ + */ + + #include ++#include + #include + + #include "qca8k.h" +@@ -138,3 +139,38 @@ int qca8k_bulk_write(struct qca8k_priv * + + return 0; + } ++ ++int qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) ++{ ++ u32 val; ++ ++ return regmap_read_poll_timeout(priv->regmap, reg, val, !(val & mask), 0, ++ QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC); ++} ++ ++int qca8k_mib_init(struct qca8k_priv *priv) ++{ ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, ++ QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, ++ FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_FLUSH) | ++ QCA8K_MIB_BUSY); ++ if (ret) ++ goto exit; ++ ++ ret = qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY); ++ if (ret) ++ goto exit; ++ ++ ret = regmap_set_bits(priv->regmap, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP); ++ if (ret) ++ goto exit; ++ ++ ret = qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -422,6 +422,7 @@ struct qca8k_fdb { + /* Common setup function */ + extern const struct qca8k_mib_desc ar8327_mib[]; + extern const struct regmap_access_table qca8k_readable_table; ++int qca8k_mib_init(struct qca8k_priv *priv); + + /* Common read/write/rmw function */ + int qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val); +@@ -431,4 +432,7 @@ int qca8k_rmw(struct qca8k_priv *priv, u + int qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len); + int qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len); + ++/* Common ops function */ ++int qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask); ++ + #endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-07-net-dsa-qca8k-move-port-set-status-eee-ethtool-stats.patch b/target/linux/generic/backport-5.15/771-v6.0-07-net-dsa-qca8k-move-port-set-status-eee-ethtool-stats.patch new file mode 100644 index 0000000000..6fd1c66b0a --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-07-net-dsa-qca8k-move-port-set-status-eee-ethtool-stats.patch @@ -0,0 +1,281 @@ +From 472fcea160f27a5d9b7526093d9d8d89ba0b6137 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:16 +0200 +Subject: [PATCH 07/14] net: dsa: qca8k: move port set status/eee/ethtool stats + function to common code + +The same logic to disable/enable port, set eee and get ethtool stats is +used by drivers based on qca8k family switch. +Move it to common code to make it accessible also by other drivers. +While at it also drop unnecessary qca8k_priv cast for void pointers. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 105 ----------------------------- + drivers/net/dsa/qca/qca8k-common.c | 102 ++++++++++++++++++++++++++++ + drivers/net/dsa/qca/qca8k.h | 11 +++ + 3 files changed, 113 insertions(+), 105 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -768,21 +768,6 @@ out: + return ret; + } + +-static void +-qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable) +-{ +- u32 mask = QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; +- +- /* Port 0 and 6 have no internal PHY */ +- if (port > 0 && port < 6) +- mask |= QCA8K_PORT_STATUS_LINK_AUTO; +- +- if (enable) +- regmap_set_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); +- else +- regmap_clear_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); +-} +- + static int + qca8k_phy_eth_busy_wait(struct qca8k_mgmt_eth_data *mgmt_eth_data, + struct sk_buff *read_skb, u32 *val) +@@ -1974,20 +1959,6 @@ qca8k_phylink_mac_link_up(struct dsa_swi + qca8k_write(priv, QCA8K_REG_PORT_STATUS(port), reg); + } + +-static void +-qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data) +-{ +- struct qca8k_priv *priv = ds->priv; +- int i; +- +- if (stringset != ETH_SS_STATS) +- return; +- +- for (i = 0; i < priv->info->mib_count; i++) +- strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, +- ETH_GSTRING_LEN); +-} +- + static void qca8k_mib_autocast_handler(struct dsa_switch *ds, struct sk_buff *skb) + { + struct qca8k_mib_eth_data *mib_eth_data; +@@ -2078,82 +2049,6 @@ exit: + } + + static void +-qca8k_get_ethtool_stats(struct dsa_switch *ds, int port, +- uint64_t *data) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- const struct qca8k_mib_desc *mib; +- u32 reg, i, val; +- u32 hi = 0; +- int ret; +- +- if (priv->mgmt_master && priv->info->ops->autocast_mib && +- priv->info->ops->autocast_mib(ds, port, data) > 0) +- return; +- +- for (i = 0; i < priv->info->mib_count; i++) { +- mib = &ar8327_mib[i]; +- reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; +- +- ret = qca8k_read(priv, reg, &val); +- if (ret < 0) +- continue; +- +- if (mib->size == 2) { +- ret = qca8k_read(priv, reg + 4, &hi); +- if (ret < 0) +- continue; +- } +- +- data[i] = val; +- if (mib->size == 2) +- data[i] |= (u64)hi << 32; +- } +-} +- +-static int +-qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset) +-{ +- struct qca8k_priv *priv = ds->priv; +- +- if (sset != ETH_SS_STATS) +- return 0; +- +- return priv->info->mib_count; +-} +- +-static int +-qca8k_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *eee) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u32 lpi_en = QCA8K_REG_EEE_CTRL_LPI_EN(port); +- u32 reg; +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- ret = qca8k_read(priv, QCA8K_REG_EEE_CTRL, ®); +- if (ret < 0) +- goto exit; +- +- if (eee->eee_enabled) +- reg |= lpi_en; +- else +- reg &= ~lpi_en; +- ret = qca8k_write(priv, QCA8K_REG_EEE_CTRL, reg); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- +-static int +-qca8k_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e) +-{ +- /* Nothing to do on the port's MAC */ +- return 0; +-} +- +-static void + qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state) + { + struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +--- a/drivers/net/dsa/qca/qca8k-common.c ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -174,3 +174,105 @@ exit: + mutex_unlock(&priv->reg_mutex); + return ret; + } ++ ++void qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable) ++{ ++ u32 mask = QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; ++ ++ /* Port 0 and 6 have no internal PHY */ ++ if (port > 0 && port < 6) ++ mask |= QCA8K_PORT_STATUS_LINK_AUTO; ++ ++ if (enable) ++ regmap_set_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); ++ else ++ regmap_clear_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); ++} ++ ++void qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, ++ uint8_t *data) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int i; ++ ++ if (stringset != ETH_SS_STATS) ++ return; ++ ++ for (i = 0; i < priv->info->mib_count; i++) ++ strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, ++ ETH_GSTRING_LEN); ++} ++ ++void qca8k_get_ethtool_stats(struct dsa_switch *ds, int port, ++ uint64_t *data) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ const struct qca8k_mib_desc *mib; ++ u32 reg, i, val; ++ u32 hi = 0; ++ int ret; ++ ++ if (priv->mgmt_master && priv->info->ops->autocast_mib && ++ priv->info->ops->autocast_mib(ds, port, data) > 0) ++ return; ++ ++ for (i = 0; i < priv->info->mib_count; i++) { ++ mib = &ar8327_mib[i]; ++ reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; ++ ++ ret = qca8k_read(priv, reg, &val); ++ if (ret < 0) ++ continue; ++ ++ if (mib->size == 2) { ++ ret = qca8k_read(priv, reg + 4, &hi); ++ if (ret < 0) ++ continue; ++ } ++ ++ data[i] = val; ++ if (mib->size == 2) ++ data[i] |= (u64)hi << 32; ++ } ++} ++ ++int qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ if (sset != ETH_SS_STATS) ++ return 0; ++ ++ return priv->info->mib_count; ++} ++ ++int qca8k_set_mac_eee(struct dsa_switch *ds, int port, ++ struct ethtool_eee *eee) ++{ ++ u32 lpi_en = QCA8K_REG_EEE_CTRL_LPI_EN(port); ++ struct qca8k_priv *priv = ds->priv; ++ u32 reg; ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = qca8k_read(priv, QCA8K_REG_EEE_CTRL, ®); ++ if (ret < 0) ++ goto exit; ++ ++ if (eee->eee_enabled) ++ reg |= lpi_en; ++ else ++ reg &= ~lpi_en; ++ ret = qca8k_write(priv, QCA8K_REG_EEE_CTRL, reg); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++int qca8k_get_mac_eee(struct dsa_switch *ds, int port, ++ struct ethtool_eee *e) ++{ ++ /* Nothing to do on the port's MAC */ ++ return 0; ++} +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -423,6 +423,7 @@ struct qca8k_fdb { + extern const struct qca8k_mib_desc ar8327_mib[]; + extern const struct regmap_access_table qca8k_readable_table; + int qca8k_mib_init(struct qca8k_priv *priv); ++void qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable); + + /* Common read/write/rmw function */ + int qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val); +@@ -435,4 +436,14 @@ int qca8k_bulk_write(struct qca8k_priv * + /* Common ops function */ + int qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask); + ++/* Common ethtool stats function */ ++void qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data); ++void qca8k_get_ethtool_stats(struct dsa_switch *ds, int port, ++ uint64_t *data); ++int qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset); ++ ++/* Common eee function */ ++int qca8k_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *eee); ++int qca8k_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e); ++ + #endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-08-net-dsa-qca8k-move-bridge-functions-to-common-code.patch b/target/linux/generic/backport-5.15/771-v6.0-08-net-dsa-qca8k-move-bridge-functions-to-common-code.patch new file mode 100644 index 0000000000..3ca682d72c --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-08-net-dsa-qca8k-move-bridge-functions-to-common-code.patch @@ -0,0 +1,237 @@ +From fd3cae2f3ac190d06e48f43739237e02f9dc51ff Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:17 +0200 +Subject: [PATCH 08/14] net: dsa: qca8k: move bridge functions to common code + +The same bridge functions are used by drivers based on qca8k family +switch. Move them to common code to make them accessible also by other +drivers. +While at it also drop unnecessary qca8k_priv cast for void pointers. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 93 ------------------------------ + drivers/net/dsa/qca/qca8k-common.c | 93 ++++++++++++++++++++++++++++++ + drivers/net/dsa/qca/qca8k.h | 9 +++ + 3 files changed, 102 insertions(+), 93 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -2049,97 +2049,6 @@ exit: + } + + static void +-qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u32 stp_state; +- +- switch (state) { +- case BR_STATE_DISABLED: +- stp_state = QCA8K_PORT_LOOKUP_STATE_DISABLED; +- break; +- case BR_STATE_BLOCKING: +- stp_state = QCA8K_PORT_LOOKUP_STATE_BLOCKING; +- break; +- case BR_STATE_LISTENING: +- stp_state = QCA8K_PORT_LOOKUP_STATE_LISTENING; +- break; +- case BR_STATE_LEARNING: +- stp_state = QCA8K_PORT_LOOKUP_STATE_LEARNING; +- break; +- case BR_STATE_FORWARDING: +- default: +- stp_state = QCA8K_PORT_LOOKUP_STATE_FORWARD; +- break; +- } +- +- qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_STATE_MASK, stp_state); +-} +- +-static int +-qca8k_port_bridge_join(struct dsa_switch *ds, int port, struct net_device *br) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- int port_mask, cpu_port; +- int i, ret; +- +- cpu_port = dsa_to_port(ds, port)->cpu_dp->index; +- port_mask = BIT(cpu_port); +- +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- if (dsa_is_cpu_port(ds, i)) +- continue; +- if (dsa_to_port(ds, i)->bridge_dev != br) +- continue; +- /* Add this port to the portvlan mask of the other ports +- * in the bridge +- */ +- ret = regmap_set_bits(priv->regmap, +- QCA8K_PORT_LOOKUP_CTRL(i), +- BIT(port)); +- if (ret) +- return ret; +- if (i != port) +- port_mask |= BIT(i); +- } +- +- /* Add all other ports to this ports portvlan mask */ +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_MEMBER, port_mask); +- +- return ret; +-} +- +-static void +-qca8k_port_bridge_leave(struct dsa_switch *ds, int port, struct net_device *br) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- int cpu_port, i; +- +- cpu_port = dsa_to_port(ds, port)->cpu_dp->index; +- +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- if (dsa_is_cpu_port(ds, i)) +- continue; +- if (dsa_to_port(ds, i)->bridge_dev != br) +- continue; +- /* Remove this port to the portvlan mask of the other ports +- * in the bridge +- */ +- regmap_clear_bits(priv->regmap, +- QCA8K_PORT_LOOKUP_CTRL(i), +- BIT(port)); +- } +- +- /* Set the cpu port to be the only one in the portvlan mask of +- * this port +- */ +- qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port)); +-} +- +-static void + qca8k_port_fast_age(struct dsa_switch *ds, int port) + { + struct qca8k_priv *priv = ds->priv; +--- a/drivers/net/dsa/qca/qca8k-common.c ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + + #include "qca8k.h" + +@@ -276,3 +277,93 @@ int qca8k_get_mac_eee(struct dsa_switch + /* Nothing to do on the port's MAC */ + return 0; + } ++ ++void qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ u32 stp_state; ++ ++ switch (state) { ++ case BR_STATE_DISABLED: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_DISABLED; ++ break; ++ case BR_STATE_BLOCKING: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_BLOCKING; ++ break; ++ case BR_STATE_LISTENING: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_LISTENING; ++ break; ++ case BR_STATE_LEARNING: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_LEARNING; ++ break; ++ case BR_STATE_FORWARDING: ++ default: ++ stp_state = QCA8K_PORT_LOOKUP_STATE_FORWARD; ++ break; ++ } ++ ++ qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_STATE_MASK, stp_state); ++} ++ ++int qca8k_port_bridge_join(struct dsa_switch *ds, int port, ++ struct net_device *br) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int port_mask, cpu_port; ++ int i, ret; ++ ++ cpu_port = dsa_to_port(ds, port)->cpu_dp->index; ++ port_mask = BIT(cpu_port); ++ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ if (dsa_is_cpu_port(ds, i)) ++ continue; ++ if (dsa_to_port(ds, i)->bridge_dev != br) ++ continue; ++ /* Add this port to the portvlan mask of the other ports ++ * in the bridge ++ */ ++ ret = regmap_set_bits(priv->regmap, ++ QCA8K_PORT_LOOKUP_CTRL(i), ++ BIT(port)); ++ if (ret) ++ return ret; ++ if (i != port) ++ port_mask |= BIT(i); ++ } ++ ++ /* Add all other ports to this ports portvlan mask */ ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_MEMBER, port_mask); ++ ++ return ret; ++} ++ ++void qca8k_port_bridge_leave(struct dsa_switch *ds, int port, ++ struct net_device *br) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int cpu_port, i; ++ ++ cpu_port = dsa_to_port(ds, port)->cpu_dp->index; ++ ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ if (dsa_is_cpu_port(ds, i)) ++ continue; ++ if (dsa_to_port(ds, i)->bridge_dev != br) ++ continue; ++ /* Remove this port to the portvlan mask of the other ports ++ * in the bridge ++ */ ++ regmap_clear_bits(priv->regmap, ++ QCA8K_PORT_LOOKUP_CTRL(i), ++ BIT(port)); ++ } ++ ++ /* Set the cpu port to be the only one in the portvlan mask of ++ * this port ++ */ ++ qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port)); ++} +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -446,4 +446,11 @@ int qca8k_get_sset_count(struct dsa_swit + int qca8k_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *eee); + int qca8k_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e); + ++/* Common bridge function */ ++void qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state); ++int qca8k_port_bridge_join(struct dsa_switch *ds, int port, ++ struct net_device *br); ++void qca8k_port_bridge_leave(struct dsa_switch *ds, int port, ++ struct net_device *br); ++ + #endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-09-net-dsa-qca8k-move-set-age-MTU-port-enable-disable-f.patch b/target/linux/generic/backport-5.15/771-v6.0-09-net-dsa-qca8k-move-set-age-MTU-port-enable-disable-f.patch new file mode 100644 index 0000000000..e3414408d6 --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-09-net-dsa-qca8k-move-set-age-MTU-port-enable-disable-f.patch @@ -0,0 +1,227 @@ +From b3a302b171f73425b41de8d3357fae3fa7057322 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:18 +0200 +Subject: [PATCH 09/14] net: dsa: qca8k: move set age/MTU/port enable/disable + functions to common code + +The same set age, MTU and port enable/disable function are used by +driver based on qca8k family switch. +Move them to common code to make them accessible also by other drivers. +While at it also drop unnecessary qca8k_priv cast for void pointers. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 88 ------------------------------ + drivers/net/dsa/qca/qca8k-common.c | 85 +++++++++++++++++++++++++++++ + drivers/net/dsa/qca/qca8k.h | 12 ++++ + 3 files changed, 97 insertions(+), 88 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -2059,94 +2059,6 @@ qca8k_port_fast_age(struct dsa_switch *d + } + + static int +-qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs) +-{ +- struct qca8k_priv *priv = ds->priv; +- unsigned int secs = msecs / 1000; +- u32 val; +- +- /* AGE_TIME reg is set in 7s step */ +- val = secs / 7; +- +- /* Handle case with 0 as val to NOT disable +- * learning +- */ +- if (!val) +- val = 1; +- +- return regmap_update_bits(priv->regmap, QCA8K_REG_ATU_CTRL, QCA8K_ATU_AGE_TIME_MASK, +- QCA8K_ATU_AGE_TIME(val)); +-} +- +-static int +-qca8k_port_enable(struct dsa_switch *ds, int port, +- struct phy_device *phy) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- +- qca8k_port_set_status(priv, port, 1); +- priv->port_enabled_map |= BIT(port); +- +- if (dsa_is_user_port(ds, port)) +- phy_support_asym_pause(phy); +- +- return 0; +-} +- +-static void +-qca8k_port_disable(struct dsa_switch *ds, int port) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- +- qca8k_port_set_status(priv, port, 0); +- priv->port_enabled_map &= ~BIT(port); +-} +- +-static int +-qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- /* We have only have a general MTU setting. +- * DSA always set the CPU port's MTU to the largest MTU of the slave +- * ports. +- * Setting MTU just for the CPU port is sufficient to correctly set a +- * value for every port. +- */ +- if (!dsa_is_cpu_port(ds, port)) +- return 0; +- +- /* To change the MAX_FRAME_SIZE the cpu ports must be off or +- * the switch panics. +- * Turn off both cpu ports before applying the new value to prevent +- * this. +- */ +- if (priv->port_enabled_map & BIT(0)) +- qca8k_port_set_status(priv, 0, 0); +- +- if (priv->port_enabled_map & BIT(6)) +- qca8k_port_set_status(priv, 6, 0); +- +- /* Include L2 header / FCS length */ +- ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ETH_HLEN + ETH_FCS_LEN); +- +- if (priv->port_enabled_map & BIT(0)) +- qca8k_port_set_status(priv, 0, 1); +- +- if (priv->port_enabled_map & BIT(6)) +- qca8k_port_set_status(priv, 6, 1); +- +- return ret; +-} +- +-static int +-qca8k_port_max_mtu(struct dsa_switch *ds, int port) +-{ +- return QCA8K_MAX_MTU; +-} +- +-static int + qca8k_port_fdb_insert(struct qca8k_priv *priv, const u8 *addr, + u16 port_mask, u16 vid) + { +--- a/drivers/net/dsa/qca/qca8k-common.c ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -367,3 +367,88 @@ void qca8k_port_bridge_leave(struct dsa_ + qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), + QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port)); + } ++ ++int qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ unsigned int secs = msecs / 1000; ++ u32 val; ++ ++ /* AGE_TIME reg is set in 7s step */ ++ val = secs / 7; ++ ++ /* Handle case with 0 as val to NOT disable ++ * learning ++ */ ++ if (!val) ++ val = 1; ++ ++ return regmap_update_bits(priv->regmap, QCA8K_REG_ATU_CTRL, ++ QCA8K_ATU_AGE_TIME_MASK, ++ QCA8K_ATU_AGE_TIME(val)); ++} ++ ++int qca8k_port_enable(struct dsa_switch *ds, int port, ++ struct phy_device *phy) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ qca8k_port_set_status(priv, port, 1); ++ priv->port_enabled_map |= BIT(port); ++ ++ if (dsa_is_user_port(ds, port)) ++ phy_support_asym_pause(phy); ++ ++ return 0; ++} ++ ++void qca8k_port_disable(struct dsa_switch *ds, int port) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ qca8k_port_set_status(priv, port, 0); ++ priv->port_enabled_map &= ~BIT(port); ++} ++ ++int qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ /* We have only have a general MTU setting. ++ * DSA always set the CPU port's MTU to the largest MTU of the slave ++ * ports. ++ * Setting MTU just for the CPU port is sufficient to correctly set a ++ * value for every port. ++ */ ++ if (!dsa_is_cpu_port(ds, port)) ++ return 0; ++ ++ /* To change the MAX_FRAME_SIZE the cpu ports must be off or ++ * the switch panics. ++ * Turn off both cpu ports before applying the new value to prevent ++ * this. ++ */ ++ if (priv->port_enabled_map & BIT(0)) ++ qca8k_port_set_status(priv, 0, 0); ++ ++ if (priv->port_enabled_map & BIT(6)) ++ qca8k_port_set_status(priv, 6, 0); ++ ++ /* Include L2 header / FCS length */ ++ ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ++ ETH_HLEN + ETH_FCS_LEN); ++ ++ if (priv->port_enabled_map & BIT(0)) ++ qca8k_port_set_status(priv, 0, 1); ++ ++ if (priv->port_enabled_map & BIT(6)) ++ qca8k_port_set_status(priv, 6, 1); ++ ++ return ret; ++} ++ ++int qca8k_port_max_mtu(struct dsa_switch *ds, int port) ++{ ++ return QCA8K_MAX_MTU; ++} +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -453,4 +453,16 @@ int qca8k_port_bridge_join(struct dsa_sw + void qca8k_port_bridge_leave(struct dsa_switch *ds, int port, + struct net_device *br); + ++/* Common port enable/disable function */ ++int qca8k_port_enable(struct dsa_switch *ds, int port, ++ struct phy_device *phy); ++void qca8k_port_disable(struct dsa_switch *ds, int port); ++ ++/* Common MTU function */ ++int qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu); ++int qca8k_port_max_mtu(struct dsa_switch *ds, int port); ++ ++/* Common fast age function */ ++int qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs); ++ + #endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-10-net-dsa-qca8k-move-port-FDB-MDB-function-to-common-c.patch b/target/linux/generic/backport-5.15/771-v6.0-10-net-dsa-qca8k-move-port-FDB-MDB-function-to-common-c.patch new file mode 100644 index 0000000000..96468ae74e --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-10-net-dsa-qca8k-move-port-FDB-MDB-function-to-common-c.patch @@ -0,0 +1,704 @@ +From 2e5bd96eea86a246b4de3bf756f7a11b43e6187d Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:19 +0200 +Subject: [PATCH 10/14] net: dsa: qca8k: move port FDB/MDB function to common + code + +The same port FDB/MDB function are used by drivers based on qca8k family +switch. Move them to common code to make them accessible also by other +drivers. +Also drop bulk read/write functions and make them static + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 306 ----------------------------- + drivers/net/dsa/qca/qca8k-common.c | 297 +++++++++++++++++++++++++++- + drivers/net/dsa/qca/qca8k.h | 25 ++- + 3 files changed, 317 insertions(+), 311 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -442,217 +442,6 @@ static struct regmap_config qca8k_regmap + }; + + static int +-qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb) +-{ +- u32 reg[3]; +- int ret; +- +- /* load the ARL table into an array */ +- ret = qca8k_bulk_read(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); +- if (ret) +- return ret; +- +- /* vid - 83:72 */ +- fdb->vid = FIELD_GET(QCA8K_ATU_VID_MASK, reg[2]); +- /* aging - 67:64 */ +- fdb->aging = FIELD_GET(QCA8K_ATU_STATUS_MASK, reg[2]); +- /* portmask - 54:48 */ +- fdb->port_mask = FIELD_GET(QCA8K_ATU_PORT_MASK, reg[1]); +- /* mac - 47:0 */ +- fdb->mac[0] = FIELD_GET(QCA8K_ATU_ADDR0_MASK, reg[1]); +- fdb->mac[1] = FIELD_GET(QCA8K_ATU_ADDR1_MASK, reg[1]); +- fdb->mac[2] = FIELD_GET(QCA8K_ATU_ADDR2_MASK, reg[0]); +- fdb->mac[3] = FIELD_GET(QCA8K_ATU_ADDR3_MASK, reg[0]); +- fdb->mac[4] = FIELD_GET(QCA8K_ATU_ADDR4_MASK, reg[0]); +- fdb->mac[5] = FIELD_GET(QCA8K_ATU_ADDR5_MASK, reg[0]); +- +- return 0; +-} +- +-static void +-qca8k_fdb_write(struct qca8k_priv *priv, u16 vid, u8 port_mask, const u8 *mac, +- u8 aging) +-{ +- u32 reg[3] = { 0 }; +- +- /* vid - 83:72 */ +- reg[2] = FIELD_PREP(QCA8K_ATU_VID_MASK, vid); +- /* aging - 67:64 */ +- reg[2] |= FIELD_PREP(QCA8K_ATU_STATUS_MASK, aging); +- /* portmask - 54:48 */ +- reg[1] = FIELD_PREP(QCA8K_ATU_PORT_MASK, port_mask); +- /* mac - 47:0 */ +- reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR0_MASK, mac[0]); +- reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR1_MASK, mac[1]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR2_MASK, mac[2]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR3_MASK, mac[3]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR4_MASK, mac[4]); +- reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR5_MASK, mac[5]); +- +- /* load the array into the ARL table */ +- qca8k_bulk_write(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); +-} +- +-static int +-qca8k_fdb_access(struct qca8k_priv *priv, enum qca8k_fdb_cmd cmd, int port) +-{ +- u32 reg; +- int ret; +- +- /* Set the command and FDB index */ +- reg = QCA8K_ATU_FUNC_BUSY; +- reg |= cmd; +- if (port >= 0) { +- reg |= QCA8K_ATU_FUNC_PORT_EN; +- reg |= FIELD_PREP(QCA8K_ATU_FUNC_PORT_MASK, port); +- } +- +- /* Write the function register triggering the table access */ +- ret = qca8k_write(priv, QCA8K_REG_ATU_FUNC, reg); +- if (ret) +- return ret; +- +- /* wait for completion */ +- ret = qca8k_busy_wait(priv, QCA8K_REG_ATU_FUNC, QCA8K_ATU_FUNC_BUSY); +- if (ret) +- return ret; +- +- /* Check for table full violation when adding an entry */ +- if (cmd == QCA8K_FDB_LOAD) { +- ret = qca8k_read(priv, QCA8K_REG_ATU_FUNC, ®); +- if (ret < 0) +- return ret; +- if (reg & QCA8K_ATU_FUNC_FULL) +- return -1; +- } +- +- return 0; +-} +- +-static int +-qca8k_fdb_next(struct qca8k_priv *priv, struct qca8k_fdb *fdb, int port) +-{ +- int ret; +- +- qca8k_fdb_write(priv, fdb->vid, fdb->port_mask, fdb->mac, fdb->aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_NEXT, port); +- if (ret < 0) +- return ret; +- +- return qca8k_fdb_read(priv, fdb); +-} +- +-static int +-qca8k_fdb_add(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, +- u16 vid, u8 aging) +-{ +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_write(priv, vid, port_mask, mac, aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static int +-qca8k_fdb_del(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, u16 vid) +-{ +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_write(priv, vid, port_mask, mac, 0); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static void +-qca8k_fdb_flush(struct qca8k_priv *priv) +-{ +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_access(priv, QCA8K_FDB_FLUSH, -1); +- mutex_unlock(&priv->reg_mutex); +-} +- +-static int +-qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask, +- const u8 *mac, u16 vid) +-{ +- struct qca8k_fdb fdb = { 0 }; +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- +- qca8k_fdb_write(priv, vid, 0, mac, 0); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); +- if (ret < 0) +- goto exit; +- +- ret = qca8k_fdb_read(priv, &fdb); +- if (ret < 0) +- goto exit; +- +- /* Rule exist. Delete first */ +- if (!fdb.aging) { +- ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); +- if (ret) +- goto exit; +- } +- +- /* Add port to fdb portmask */ +- fdb.port_mask |= port_mask; +- +- qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- +-static int +-qca8k_fdb_search_and_del(struct qca8k_priv *priv, u8 port_mask, +- const u8 *mac, u16 vid) +-{ +- struct qca8k_fdb fdb = { 0 }; +- int ret; +- +- mutex_lock(&priv->reg_mutex); +- +- qca8k_fdb_write(priv, vid, 0, mac, 0); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); +- if (ret < 0) +- goto exit; +- +- /* Rule doesn't exist. Why delete? */ +- if (!fdb.aging) { +- ret = -EINVAL; +- goto exit; +- } +- +- ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); +- if (ret) +- goto exit; +- +- /* Only port in the rule is this port. Don't re insert */ +- if (fdb.port_mask == port_mask) +- goto exit; +- +- /* Remove port from port mask */ +- fdb.port_mask &= ~port_mask; +- +- qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); +- ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); +- +-exit: +- mutex_unlock(&priv->reg_mutex); +- return ret; +-} +- +-static int + qca8k_vlan_access(struct qca8k_priv *priv, enum qca8k_vlan_cmd cmd, u16 vid) + { + u32 reg; +@@ -2048,97 +1837,6 @@ exit: + return ret; + } + +-static void +-qca8k_port_fast_age(struct dsa_switch *ds, int port) +-{ +- struct qca8k_priv *priv = ds->priv; +- +- mutex_lock(&priv->reg_mutex); +- qca8k_fdb_access(priv, QCA8K_FDB_FLUSH_PORT, port); +- mutex_unlock(&priv->reg_mutex); +-} +- +-static int +-qca8k_port_fdb_insert(struct qca8k_priv *priv, const u8 *addr, +- u16 port_mask, u16 vid) +-{ +- /* Set the vid to the port vlan id if no vid is set */ +- if (!vid) +- vid = QCA8K_PORT_VID_DEF; +- +- return qca8k_fdb_add(priv, addr, port_mask, vid, +- QCA8K_ATU_STATUS_STATIC); +-} +- +-static int +-qca8k_port_fdb_add(struct dsa_switch *ds, int port, +- const unsigned char *addr, u16 vid) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u16 port_mask = BIT(port); +- +- return qca8k_port_fdb_insert(priv, addr, port_mask, vid); +-} +- +-static int +-qca8k_port_fdb_del(struct dsa_switch *ds, int port, +- const unsigned char *addr, u16 vid) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- u16 port_mask = BIT(port); +- +- if (!vid) +- vid = QCA8K_PORT_VID_DEF; +- +- return qca8k_fdb_del(priv, addr, port_mask, vid); +-} +- +-static int +-qca8k_port_fdb_dump(struct dsa_switch *ds, int port, +- dsa_fdb_dump_cb_t *cb, void *data) +-{ +- struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; +- struct qca8k_fdb _fdb = { 0 }; +- int cnt = QCA8K_NUM_FDB_RECORDS; +- bool is_static; +- int ret = 0; +- +- mutex_lock(&priv->reg_mutex); +- while (cnt-- && !qca8k_fdb_next(priv, &_fdb, port)) { +- if (!_fdb.aging) +- break; +- is_static = (_fdb.aging == QCA8K_ATU_STATUS_STATIC); +- ret = cb(_fdb.mac, _fdb.vid, is_static, data); +- if (ret) +- break; +- } +- mutex_unlock(&priv->reg_mutex); +- +- return 0; +-} +- +-static int +-qca8k_port_mdb_add(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_mdb *mdb) +-{ +- struct qca8k_priv *priv = ds->priv; +- const u8 *addr = mdb->addr; +- u16 vid = mdb->vid; +- +- return qca8k_fdb_search_and_insert(priv, BIT(port), addr, vid); +-} +- +-static int +-qca8k_port_mdb_del(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_mdb *mdb) +-{ +- struct qca8k_priv *priv = ds->priv; +- const u8 *addr = mdb->addr; +- u16 vid = mdb->vid; +- +- return qca8k_fdb_search_and_del(priv, BIT(port), addr, vid); +-} +- + static int + qca8k_port_mirror_add(struct dsa_switch *ds, int port, + struct dsa_mall_mirror_tc_entry *mirror, +--- a/drivers/net/dsa/qca/qca8k-common.c ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -103,7 +103,7 @@ const struct regmap_access_table qca8k_r + }; + + /* TODO: remove these extra ops when we can support regmap bulk read/write */ +-int qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++static int qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len) + { + int i, count = len / sizeof(u32), ret; + +@@ -121,7 +121,7 @@ int qca8k_bulk_read(struct qca8k_priv *p + } + + /* TODO: remove these extra ops when we can support regmap bulk read/write */ +-int qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len) ++static int qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len) + { + int i, count = len / sizeof(u32), ret; + u32 tmp; +@@ -149,6 +149,211 @@ int qca8k_busy_wait(struct qca8k_priv *p + QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC); + } + ++static int qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb) ++{ ++ u32 reg[3]; ++ int ret; ++ ++ /* load the ARL table into an array */ ++ ret = qca8k_bulk_read(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); ++ if (ret) ++ return ret; ++ ++ /* vid - 83:72 */ ++ fdb->vid = FIELD_GET(QCA8K_ATU_VID_MASK, reg[2]); ++ /* aging - 67:64 */ ++ fdb->aging = FIELD_GET(QCA8K_ATU_STATUS_MASK, reg[2]); ++ /* portmask - 54:48 */ ++ fdb->port_mask = FIELD_GET(QCA8K_ATU_PORT_MASK, reg[1]); ++ /* mac - 47:0 */ ++ fdb->mac[0] = FIELD_GET(QCA8K_ATU_ADDR0_MASK, reg[1]); ++ fdb->mac[1] = FIELD_GET(QCA8K_ATU_ADDR1_MASK, reg[1]); ++ fdb->mac[2] = FIELD_GET(QCA8K_ATU_ADDR2_MASK, reg[0]); ++ fdb->mac[3] = FIELD_GET(QCA8K_ATU_ADDR3_MASK, reg[0]); ++ fdb->mac[4] = FIELD_GET(QCA8K_ATU_ADDR4_MASK, reg[0]); ++ fdb->mac[5] = FIELD_GET(QCA8K_ATU_ADDR5_MASK, reg[0]); ++ ++ return 0; ++} ++ ++static void qca8k_fdb_write(struct qca8k_priv *priv, u16 vid, u8 port_mask, ++ const u8 *mac, u8 aging) ++{ ++ u32 reg[3] = { 0 }; ++ ++ /* vid - 83:72 */ ++ reg[2] = FIELD_PREP(QCA8K_ATU_VID_MASK, vid); ++ /* aging - 67:64 */ ++ reg[2] |= FIELD_PREP(QCA8K_ATU_STATUS_MASK, aging); ++ /* portmask - 54:48 */ ++ reg[1] = FIELD_PREP(QCA8K_ATU_PORT_MASK, port_mask); ++ /* mac - 47:0 */ ++ reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR0_MASK, mac[0]); ++ reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR1_MASK, mac[1]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR2_MASK, mac[2]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR3_MASK, mac[3]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR4_MASK, mac[4]); ++ reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR5_MASK, mac[5]); ++ ++ /* load the array into the ARL table */ ++ qca8k_bulk_write(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); ++} ++ ++static int qca8k_fdb_access(struct qca8k_priv *priv, enum qca8k_fdb_cmd cmd, ++ int port) ++{ ++ u32 reg; ++ int ret; ++ ++ /* Set the command and FDB index */ ++ reg = QCA8K_ATU_FUNC_BUSY; ++ reg |= cmd; ++ if (port >= 0) { ++ reg |= QCA8K_ATU_FUNC_PORT_EN; ++ reg |= FIELD_PREP(QCA8K_ATU_FUNC_PORT_MASK, port); ++ } ++ ++ /* Write the function register triggering the table access */ ++ ret = qca8k_write(priv, QCA8K_REG_ATU_FUNC, reg); ++ if (ret) ++ return ret; ++ ++ /* wait for completion */ ++ ret = qca8k_busy_wait(priv, QCA8K_REG_ATU_FUNC, QCA8K_ATU_FUNC_BUSY); ++ if (ret) ++ return ret; ++ ++ /* Check for table full violation when adding an entry */ ++ if (cmd == QCA8K_FDB_LOAD) { ++ ret = qca8k_read(priv, QCA8K_REG_ATU_FUNC, ®); ++ if (ret < 0) ++ return ret; ++ if (reg & QCA8K_ATU_FUNC_FULL) ++ return -1; ++ } ++ ++ return 0; ++} ++ ++static int qca8k_fdb_next(struct qca8k_priv *priv, struct qca8k_fdb *fdb, ++ int port) ++{ ++ int ret; ++ ++ qca8k_fdb_write(priv, fdb->vid, fdb->port_mask, fdb->mac, fdb->aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_NEXT, port); ++ if (ret < 0) ++ return ret; ++ ++ return qca8k_fdb_read(priv, fdb); ++} ++ ++static int qca8k_fdb_add(struct qca8k_priv *priv, const u8 *mac, ++ u16 port_mask, u16 vid, u8 aging) ++{ ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_write(priv, vid, port_mask, mac, aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ ++static int qca8k_fdb_del(struct qca8k_priv *priv, const u8 *mac, ++ u16 port_mask, u16 vid) ++{ ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_write(priv, vid, port_mask, mac, 0); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ ++void qca8k_fdb_flush(struct qca8k_priv *priv) ++{ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_access(priv, QCA8K_FDB_FLUSH, -1); ++ mutex_unlock(&priv->reg_mutex); ++} ++ ++static int qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask, ++ const u8 *mac, u16 vid) ++{ ++ struct qca8k_fdb fdb = { 0 }; ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ++ qca8k_fdb_write(priv, vid, 0, mac, 0); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); ++ if (ret < 0) ++ goto exit; ++ ++ ret = qca8k_fdb_read(priv, &fdb); ++ if (ret < 0) ++ goto exit; ++ ++ /* Rule exist. Delete first */ ++ if (!fdb.aging) { ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); ++ if (ret) ++ goto exit; ++ } ++ ++ /* Add port to fdb portmask */ ++ fdb.port_mask |= port_mask; ++ ++ qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ ++static int qca8k_fdb_search_and_del(struct qca8k_priv *priv, u8 port_mask, ++ const u8 *mac, u16 vid) ++{ ++ struct qca8k_fdb fdb = { 0 }; ++ int ret; ++ ++ mutex_lock(&priv->reg_mutex); ++ ++ qca8k_fdb_write(priv, vid, 0, mac, 0); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); ++ if (ret < 0) ++ goto exit; ++ ++ /* Rule doesn't exist. Why delete? */ ++ if (!fdb.aging) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); ++ if (ret) ++ goto exit; ++ ++ /* Only port in the rule is this port. Don't re insert */ ++ if (fdb.port_mask == port_mask) ++ goto exit; ++ ++ /* Remove port from port mask */ ++ fdb.port_mask &= ~port_mask; ++ ++ qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); ++ ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); ++ ++exit: ++ mutex_unlock(&priv->reg_mutex); ++ return ret; ++} ++ + int qca8k_mib_init(struct qca8k_priv *priv) + { + int ret; +@@ -368,6 +573,15 @@ void qca8k_port_bridge_leave(struct dsa_ + QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port)); + } + ++void qca8k_port_fast_age(struct dsa_switch *ds, int port) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ ++ mutex_lock(&priv->reg_mutex); ++ qca8k_fdb_access(priv, QCA8K_FDB_FLUSH_PORT, port); ++ mutex_unlock(&priv->reg_mutex); ++} ++ + int qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs) + { + struct qca8k_priv *priv = ds->priv; +@@ -452,3 +666,78 @@ int qca8k_port_max_mtu(struct dsa_switch + { + return QCA8K_MAX_MTU; + } ++ ++int qca8k_port_fdb_insert(struct qca8k_priv *priv, const u8 *addr, ++ u16 port_mask, u16 vid) ++{ ++ /* Set the vid to the port vlan id if no vid is set */ ++ if (!vid) ++ vid = QCA8K_PORT_VID_DEF; ++ ++ return qca8k_fdb_add(priv, addr, port_mask, vid, ++ QCA8K_ATU_STATUS_STATIC); ++} ++ ++int qca8k_port_fdb_add(struct dsa_switch *ds, int port, ++ const unsigned char *addr, u16 vid) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ u16 port_mask = BIT(port); ++ ++ return qca8k_port_fdb_insert(priv, addr, port_mask, vid); ++} ++ ++int qca8k_port_fdb_del(struct dsa_switch *ds, int port, ++ const unsigned char *addr, u16 vid) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ u16 port_mask = BIT(port); ++ ++ if (!vid) ++ vid = QCA8K_PORT_VID_DEF; ++ ++ return qca8k_fdb_del(priv, addr, port_mask, vid); ++} ++ ++int qca8k_port_fdb_dump(struct dsa_switch *ds, int port, ++ dsa_fdb_dump_cb_t *cb, void *data) ++{ ++ struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; ++ struct qca8k_fdb _fdb = { 0 }; ++ int cnt = QCA8K_NUM_FDB_RECORDS; ++ bool is_static; ++ int ret = 0; ++ ++ mutex_lock(&priv->reg_mutex); ++ while (cnt-- && !qca8k_fdb_next(priv, &_fdb, port)) { ++ if (!_fdb.aging) ++ break; ++ is_static = (_fdb.aging == QCA8K_ATU_STATUS_STATIC); ++ ret = cb(_fdb.mac, _fdb.vid, is_static, data); ++ if (ret) ++ break; ++ } ++ mutex_unlock(&priv->reg_mutex); ++ ++ return 0; ++} ++ ++int qca8k_port_mdb_add(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ const u8 *addr = mdb->addr; ++ u16 vid = mdb->vid; ++ ++ return qca8k_fdb_search_and_insert(priv, BIT(port), addr, vid); ++} ++ ++int qca8k_port_mdb_del(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ const u8 *addr = mdb->addr; ++ u16 vid = mdb->vid; ++ ++ return qca8k_fdb_search_and_del(priv, BIT(port), addr, vid); ++} +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -430,11 +430,9 @@ int qca8k_read(struct qca8k_priv *priv, + int qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val); + int qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val); + +-int qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len); +-int qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len); +- + /* Common ops function */ + int qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask); ++void qca8k_fdb_flush(struct qca8k_priv *priv); + + /* Common ethtool stats function */ + void qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data); +@@ -463,6 +461,23 @@ int qca8k_port_change_mtu(struct dsa_swi + int qca8k_port_max_mtu(struct dsa_switch *ds, int port); + + /* Common fast age function */ ++void qca8k_port_fast_age(struct dsa_switch *ds, int port); + int qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs); + ++/* Common FDB function */ ++int qca8k_port_fdb_insert(struct qca8k_priv *priv, const u8 *addr, ++ u16 port_mask, u16 vid); ++int qca8k_port_fdb_add(struct dsa_switch *ds, int port, ++ const unsigned char *addr, u16 vid); ++int qca8k_port_fdb_del(struct dsa_switch *ds, int port, ++ const unsigned char *addr, u16 vid); ++int qca8k_port_fdb_dump(struct dsa_switch *ds, int port, ++ dsa_fdb_dump_cb_t *cb, void *data); ++ ++/* Common MDB function */ ++int qca8k_port_mdb_add(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb); ++int qca8k_port_mdb_del(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb); ++ + #endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-11-net-dsa-qca8k-move-port-mirror-functions-to-common-c.patch b/target/linux/generic/backport-5.15/771-v6.0-11-net-dsa-qca8k-move-port-mirror-functions-to-common-c.patch new file mode 100644 index 0000000000..c1336d4a92 --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-11-net-dsa-qca8k-move-port-mirror-functions-to-common-c.patch @@ -0,0 +1,232 @@ +From 742d37a84d3f7bb60d9b2d9ada9ad4e599f65ebf Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:20 +0200 +Subject: [PATCH 11/14] net: dsa: qca8k: move port mirror functions to common + code + +The same port mirror functions are used by drivers based on qca8k family +switch. Move them to common code to make them accessible also by other +drivers. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 93 ------------------------------ + drivers/net/dsa/qca/qca8k-common.c | 91 +++++++++++++++++++++++++++++ + drivers/net/dsa/qca/qca8k.h | 7 +++ + 3 files changed, 98 insertions(+), 93 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -1838,99 +1838,6 @@ exit: + } + + static int +-qca8k_port_mirror_add(struct dsa_switch *ds, int port, +- struct dsa_mall_mirror_tc_entry *mirror, +- bool ingress) +-{ +- struct qca8k_priv *priv = ds->priv; +- int monitor_port, ret; +- u32 reg, val; +- +- /* Check for existent entry */ +- if ((ingress ? priv->mirror_rx : priv->mirror_tx) & BIT(port)) +- return -EEXIST; +- +- ret = regmap_read(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, &val); +- if (ret) +- return ret; +- +- /* QCA83xx can have only one port set to mirror mode. +- * Check that the correct port is requested and return error otherwise. +- * When no mirror port is set, the values is set to 0xF +- */ +- monitor_port = FIELD_GET(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); +- if (monitor_port != 0xF && monitor_port != mirror->to_local_port) +- return -EEXIST; +- +- /* Set the monitor port */ +- val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, +- mirror->to_local_port); +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, +- QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); +- if (ret) +- return ret; +- +- if (ingress) { +- reg = QCA8K_PORT_LOOKUP_CTRL(port); +- val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; +- } else { +- reg = QCA8K_REG_PORT_HOL_CTRL1(port); +- val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; +- } +- +- ret = regmap_update_bits(priv->regmap, reg, val, val); +- if (ret) +- return ret; +- +- /* Track mirror port for tx and rx to decide when the +- * mirror port has to be disabled. +- */ +- if (ingress) +- priv->mirror_rx |= BIT(port); +- else +- priv->mirror_tx |= BIT(port); +- +- return 0; +-} +- +-static void +-qca8k_port_mirror_del(struct dsa_switch *ds, int port, +- struct dsa_mall_mirror_tc_entry *mirror) +-{ +- struct qca8k_priv *priv = ds->priv; +- u32 reg, val; +- int ret; +- +- if (mirror->ingress) { +- reg = QCA8K_PORT_LOOKUP_CTRL(port); +- val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; +- } else { +- reg = QCA8K_REG_PORT_HOL_CTRL1(port); +- val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; +- } +- +- ret = regmap_clear_bits(priv->regmap, reg, val); +- if (ret) +- goto err; +- +- if (mirror->ingress) +- priv->mirror_rx &= ~BIT(port); +- else +- priv->mirror_tx &= ~BIT(port); +- +- /* No port set to send packet to mirror port. Disable mirror port */ +- if (!priv->mirror_rx && !priv->mirror_tx) { +- val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, 0xF); +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, +- QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); +- if (ret) +- goto err; +- } +-err: +- dev_err(priv->dev, "Failed to del mirror port from %d", port); +-} +- +-static int + qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, + struct netlink_ext_ack *extack) + { +--- a/drivers/net/dsa/qca/qca8k-common.c ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -741,3 +741,94 @@ int qca8k_port_mdb_del(struct dsa_switch + + return qca8k_fdb_search_and_del(priv, BIT(port), addr, vid); + } ++ ++int qca8k_port_mirror_add(struct dsa_switch *ds, int port, ++ struct dsa_mall_mirror_tc_entry *mirror, ++ bool ingress) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int monitor_port, ret; ++ u32 reg, val; ++ ++ /* Check for existent entry */ ++ if ((ingress ? priv->mirror_rx : priv->mirror_tx) & BIT(port)) ++ return -EEXIST; ++ ++ ret = regmap_read(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, &val); ++ if (ret) ++ return ret; ++ ++ /* QCA83xx can have only one port set to mirror mode. ++ * Check that the correct port is requested and return error otherwise. ++ * When no mirror port is set, the values is set to 0xF ++ */ ++ monitor_port = FIELD_GET(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (monitor_port != 0xF && monitor_port != mirror->to_local_port) ++ return -EEXIST; ++ ++ /* Set the monitor port */ ++ val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, ++ mirror->to_local_port); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, ++ QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (ret) ++ return ret; ++ ++ if (ingress) { ++ reg = QCA8K_PORT_LOOKUP_CTRL(port); ++ val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; ++ } else { ++ reg = QCA8K_REG_PORT_HOL_CTRL1(port); ++ val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; ++ } ++ ++ ret = regmap_update_bits(priv->regmap, reg, val, val); ++ if (ret) ++ return ret; ++ ++ /* Track mirror port for tx and rx to decide when the ++ * mirror port has to be disabled. ++ */ ++ if (ingress) ++ priv->mirror_rx |= BIT(port); ++ else ++ priv->mirror_tx |= BIT(port); ++ ++ return 0; ++} ++ ++void qca8k_port_mirror_del(struct dsa_switch *ds, int port, ++ struct dsa_mall_mirror_tc_entry *mirror) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ u32 reg, val; ++ int ret; ++ ++ if (mirror->ingress) { ++ reg = QCA8K_PORT_LOOKUP_CTRL(port); ++ val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; ++ } else { ++ reg = QCA8K_REG_PORT_HOL_CTRL1(port); ++ val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; ++ } ++ ++ ret = regmap_clear_bits(priv->regmap, reg, val); ++ if (ret) ++ goto err; ++ ++ if (mirror->ingress) ++ priv->mirror_rx &= ~BIT(port); ++ else ++ priv->mirror_tx &= ~BIT(port); ++ ++ /* No port set to send packet to mirror port. Disable mirror port */ ++ if (!priv->mirror_rx && !priv->mirror_tx) { ++ val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, 0xF); ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, ++ QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); ++ if (ret) ++ goto err; ++ } ++err: ++ dev_err(priv->dev, "Failed to del mirror port from %d", port); ++} +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -480,4 +480,11 @@ int qca8k_port_mdb_add(struct dsa_switch + int qca8k_port_mdb_del(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb); + ++/* Common port mirror function */ ++int qca8k_port_mirror_add(struct dsa_switch *ds, int port, ++ struct dsa_mall_mirror_tc_entry *mirror, ++ bool ingress); ++void qca8k_port_mirror_del(struct dsa_switch *ds, int port, ++ struct dsa_mall_mirror_tc_entry *mirror); ++ + #endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-12-net-dsa-qca8k-move-port-VLAN-functions-to-common-cod.patch b/target/linux/generic/backport-5.15/771-v6.0-12-net-dsa-qca8k-move-port-VLAN-functions-to-common-cod.patch new file mode 100644 index 0000000000..898010f950 --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-12-net-dsa-qca8k-move-port-VLAN-functions-to-common-cod.patch @@ -0,0 +1,448 @@ +From c5290f636624b98e76a82bd63ffec0a8a9daa620 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:21 +0200 +Subject: [PATCH 12/14] net: dsa: qca8k: move port VLAN functions to common + code + +The same port VLAN functions are used by drivers based on qca8k family +switch. Move them to common code to make them accessible also by other +drivers. +Also drop exposing busy_wait and make it static. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 182 ----------------------------- + drivers/net/dsa/qca/qca8k-common.c | 179 +++++++++++++++++++++++++++- + drivers/net/dsa/qca/qca8k.h | 10 +- + 3 files changed, 187 insertions(+), 184 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -15,7 +15,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -442,122 +441,6 @@ static struct regmap_config qca8k_regmap + }; + + static int +-qca8k_vlan_access(struct qca8k_priv *priv, enum qca8k_vlan_cmd cmd, u16 vid) +-{ +- u32 reg; +- int ret; +- +- /* Set the command and VLAN index */ +- reg = QCA8K_VTU_FUNC1_BUSY; +- reg |= cmd; +- reg |= FIELD_PREP(QCA8K_VTU_FUNC1_VID_MASK, vid); +- +- /* Write the function register triggering the table access */ +- ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC1, reg); +- if (ret) +- return ret; +- +- /* wait for completion */ +- ret = qca8k_busy_wait(priv, QCA8K_REG_VTU_FUNC1, QCA8K_VTU_FUNC1_BUSY); +- if (ret) +- return ret; +- +- /* Check for table full violation when adding an entry */ +- if (cmd == QCA8K_VLAN_LOAD) { +- ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC1, ®); +- if (ret < 0) +- return ret; +- if (reg & QCA8K_VTU_FUNC1_FULL) +- return -ENOMEM; +- } +- +- return 0; +-} +- +-static int +-qca8k_vlan_add(struct qca8k_priv *priv, u8 port, u16 vid, bool untagged) +-{ +- u32 reg; +- int ret; +- +- /* +- We do the right thing with VLAN 0 and treat it as untagged while +- preserving the tag on egress. +- */ +- if (vid == 0) +- return 0; +- +- mutex_lock(&priv->reg_mutex); +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); +- if (ret < 0) +- goto out; +- +- ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); +- if (ret < 0) +- goto out; +- reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; +- reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); +- if (untagged) +- reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(port); +- else +- reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(port); +- +- ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); +- if (ret) +- goto out; +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); +- +-out: +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static int +-qca8k_vlan_del(struct qca8k_priv *priv, u8 port, u16 vid) +-{ +- u32 reg, mask; +- int ret, i; +- bool del; +- +- mutex_lock(&priv->reg_mutex); +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); +- if (ret < 0) +- goto out; +- +- ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); +- if (ret < 0) +- goto out; +- reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); +- reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(port); +- +- /* Check if we're the last member to be removed */ +- del = true; +- for (i = 0; i < QCA8K_NUM_PORTS; i++) { +- mask = QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(i); +- +- if ((reg & mask) != mask) { +- del = false; +- break; +- } +- } +- +- if (del) { +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_PURGE, vid); +- } else { +- ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); +- if (ret) +- goto out; +- ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); +- } +- +-out: +- mutex_unlock(&priv->reg_mutex); +- +- return ret; +-} +- +-static int + qca8k_phy_eth_busy_wait(struct qca8k_mgmt_eth_data *mgmt_eth_data, + struct sk_buff *read_skb, u32 *val) + { +@@ -1836,71 +1719,6 @@ exit: + + return ret; + } +- +-static int +-qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, +- struct netlink_ext_ack *extack) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- if (vlan_filtering) { +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, +- QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE); +- } else { +- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), +- QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, +- QCA8K_PORT_LOOKUP_VLAN_MODE_NONE); +- } +- +- return ret; +-} +- +-static int +-qca8k_port_vlan_add(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_vlan *vlan, +- struct netlink_ext_ack *extack) +-{ +- bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; +- bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID; +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- ret = qca8k_vlan_add(priv, port, vlan->vid, untagged); +- if (ret) { +- dev_err(priv->dev, "Failed to add VLAN to port %d (%d)", port, ret); +- return ret; +- } +- +- if (pvid) { +- ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port), +- QCA8K_EGREES_VLAN_PORT_MASK(port), +- QCA8K_EGREES_VLAN_PORT(port, vlan->vid)); +- if (ret) +- return ret; +- +- ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port), +- QCA8K_PORT_VLAN_CVID(vlan->vid) | +- QCA8K_PORT_VLAN_SVID(vlan->vid)); +- } +- +- return ret; +-} +- +-static int +-qca8k_port_vlan_del(struct dsa_switch *ds, int port, +- const struct switchdev_obj_port_vlan *vlan) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret; +- +- ret = qca8k_vlan_del(priv, port, vlan->vid); +- if (ret) +- dev_err(priv->dev, "Failed to delete VLAN from port %d (%d)", port, ret); +- +- return ret; +-} + + static u32 qca8k_get_phy_flags(struct dsa_switch *ds, int port) + { +--- a/drivers/net/dsa/qca/qca8k-common.c ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -141,7 +141,7 @@ static int qca8k_bulk_write(struct qca8k + return 0; + } + +-int qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) ++static int qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) + { + u32 val; + +@@ -354,6 +354,120 @@ exit: + return ret; + } + ++static int qca8k_vlan_access(struct qca8k_priv *priv, ++ enum qca8k_vlan_cmd cmd, u16 vid) ++{ ++ u32 reg; ++ int ret; ++ ++ /* Set the command and VLAN index */ ++ reg = QCA8K_VTU_FUNC1_BUSY; ++ reg |= cmd; ++ reg |= FIELD_PREP(QCA8K_VTU_FUNC1_VID_MASK, vid); ++ ++ /* Write the function register triggering the table access */ ++ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC1, reg); ++ if (ret) ++ return ret; ++ ++ /* wait for completion */ ++ ret = qca8k_busy_wait(priv, QCA8K_REG_VTU_FUNC1, QCA8K_VTU_FUNC1_BUSY); ++ if (ret) ++ return ret; ++ ++ /* Check for table full violation when adding an entry */ ++ if (cmd == QCA8K_VLAN_LOAD) { ++ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC1, ®); ++ if (ret < 0) ++ return ret; ++ if (reg & QCA8K_VTU_FUNC1_FULL) ++ return -ENOMEM; ++ } ++ ++ return 0; ++} ++ ++static int qca8k_vlan_add(struct qca8k_priv *priv, u8 port, u16 vid, ++ bool untagged) ++{ ++ u32 reg; ++ int ret; ++ ++ /* We do the right thing with VLAN 0 and treat it as untagged while ++ * preserving the tag on egress. ++ */ ++ if (vid == 0) ++ return 0; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); ++ if (ret < 0) ++ goto out; ++ ++ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); ++ if (ret < 0) ++ goto out; ++ reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; ++ reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); ++ if (untagged) ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(port); ++ else ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(port); ++ ++ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); ++ if (ret) ++ goto out; ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); ++ ++out: ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ ++static int qca8k_vlan_del(struct qca8k_priv *priv, u8 port, u16 vid) ++{ ++ u32 reg, mask; ++ int ret, i; ++ bool del; ++ ++ mutex_lock(&priv->reg_mutex); ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); ++ if (ret < 0) ++ goto out; ++ ++ ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); ++ if (ret < 0) ++ goto out; ++ reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); ++ reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(port); ++ ++ /* Check if we're the last member to be removed */ ++ del = true; ++ for (i = 0; i < QCA8K_NUM_PORTS; i++) { ++ mask = QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(i); ++ ++ if ((reg & mask) != mask) { ++ del = false; ++ break; ++ } ++ } ++ ++ if (del) { ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_PURGE, vid); ++ } else { ++ ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); ++ if (ret) ++ goto out; ++ ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); ++ } ++ ++out: ++ mutex_unlock(&priv->reg_mutex); ++ ++ return ret; ++} ++ + int qca8k_mib_init(struct qca8k_priv *priv) + { + int ret; +@@ -832,3 +946,66 @@ void qca8k_port_mirror_del(struct dsa_sw + err: + dev_err(priv->dev, "Failed to del mirror port from %d", port); + } ++ ++int qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, ++ bool vlan_filtering, ++ struct netlink_ext_ack *extack) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ if (vlan_filtering) { ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, ++ QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE); ++ } else { ++ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), ++ QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, ++ QCA8K_PORT_LOOKUP_VLAN_MODE_NONE); ++ } ++ ++ return ret; ++} ++ ++int qca8k_port_vlan_add(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_vlan *vlan, ++ struct netlink_ext_ack *extack) ++{ ++ bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; ++ bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID; ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ ret = qca8k_vlan_add(priv, port, vlan->vid, untagged); ++ if (ret) { ++ dev_err(priv->dev, "Failed to add VLAN to port %d (%d)", port, ret); ++ return ret; ++ } ++ ++ if (pvid) { ++ ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port), ++ QCA8K_EGREES_VLAN_PORT_MASK(port), ++ QCA8K_EGREES_VLAN_PORT(port, vlan->vid)); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port), ++ QCA8K_PORT_VLAN_CVID(vlan->vid) | ++ QCA8K_PORT_VLAN_SVID(vlan->vid)); ++ } ++ ++ return ret; ++} ++ ++int qca8k_port_vlan_del(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_vlan *vlan) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret; ++ ++ ret = qca8k_vlan_del(priv, port, vlan->vid); ++ if (ret) ++ dev_err(priv->dev, "Failed to delete VLAN from port %d (%d)", port, ret); ++ ++ return ret; ++} +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -431,7 +431,6 @@ int qca8k_write(struct qca8k_priv *priv, + int qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val); + + /* Common ops function */ +-int qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask); + void qca8k_fdb_flush(struct qca8k_priv *priv); + + /* Common ethtool stats function */ +@@ -487,4 +486,13 @@ int qca8k_port_mirror_add(struct dsa_swi + void qca8k_port_mirror_del(struct dsa_switch *ds, int port, + struct dsa_mall_mirror_tc_entry *mirror); + ++/* Common port VLAN function */ ++int qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, ++ struct netlink_ext_ack *extack); ++int qca8k_port_vlan_add(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_vlan *vlan, ++ struct netlink_ext_ack *extack); ++int qca8k_port_vlan_del(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_vlan *vlan); ++ + #endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-13-net-dsa-qca8k-move-port-LAG-functions-to-common-code.patch b/target/linux/generic/backport-5.15/771-v6.0-13-net-dsa-qca8k-move-port-LAG-functions-to-common-code.patch new file mode 100644 index 0000000000..1802b17eaa --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-13-net-dsa-qca8k-move-port-LAG-functions-to-common-code.patch @@ -0,0 +1,384 @@ +From e9bbf019af44b204b71ef8edf224002550aab641 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:22 +0200 +Subject: [PATCH 13/14] net: dsa: qca8k: move port LAG functions to common code + +The same port LAG functions are used by drivers based on qca8k family +switch. Move them to common code to make them accessible also by other +drivers. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 168 ----------------------------- + drivers/net/dsa/qca/qca8k-common.c | 165 ++++++++++++++++++++++++++++ + drivers/net/dsa/qca/qca8k.h | 6 ++ + 3 files changed, 171 insertions(+), 168 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -1743,178 +1743,6 @@ qca8k_get_tag_protocol(struct dsa_switch + return DSA_TAG_PROTO_QCA; + } + +-static bool +-qca8k_lag_can_offload(struct dsa_switch *ds, +- struct net_device *lag, +- struct netdev_lag_upper_info *info) +-{ +- struct dsa_port *dp; +- int id, members = 0; +- +- id = dsa_lag_id(ds->dst, lag); +- if (id < 0 || id >= ds->num_lag_ids) +- return false; +- +- dsa_lag_foreach_port(dp, ds->dst, lag) +- /* Includes the port joining the LAG */ +- members++; +- +- if (members > QCA8K_NUM_PORTS_FOR_LAG) +- return false; +- +- if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) +- return false; +- +- if (info->hash_type != NETDEV_LAG_HASH_L2 && +- info->hash_type != NETDEV_LAG_HASH_L23) +- return false; +- +- return true; +-} +- +-static int +-qca8k_lag_setup_hash(struct dsa_switch *ds, +- struct net_device *lag, +- struct netdev_lag_upper_info *info) +-{ +- struct qca8k_priv *priv = ds->priv; +- bool unique_lag = true; +- u32 hash = 0; +- int i, id; +- +- id = dsa_lag_id(ds->dst, lag); +- +- switch (info->hash_type) { +- case NETDEV_LAG_HASH_L23: +- hash |= QCA8K_TRUNK_HASH_SIP_EN; +- hash |= QCA8K_TRUNK_HASH_DIP_EN; +- fallthrough; +- case NETDEV_LAG_HASH_L2: +- hash |= QCA8K_TRUNK_HASH_SA_EN; +- hash |= QCA8K_TRUNK_HASH_DA_EN; +- break; +- default: /* We should NEVER reach this */ +- return -EOPNOTSUPP; +- } +- +- /* Check if we are the unique configured LAG */ +- dsa_lags_foreach_id(i, ds->dst) +- if (i != id && dsa_lag_dev(ds->dst, i)) { +- unique_lag = false; +- break; +- } +- +- /* Hash Mode is global. Make sure the same Hash Mode +- * is set to all the 4 possible lag. +- * If we are the unique LAG we can set whatever hash +- * mode we want. +- * To change hash mode it's needed to remove all LAG +- * and change the mode with the latest. +- */ +- if (unique_lag) { +- priv->lag_hash_mode = hash; +- } else if (priv->lag_hash_mode != hash) { +- netdev_err(lag, "Error: Mismateched Hash Mode across different lag is not supported\n"); +- return -EOPNOTSUPP; +- } +- +- return regmap_update_bits(priv->regmap, QCA8K_TRUNK_HASH_EN_CTRL, +- QCA8K_TRUNK_HASH_MASK, hash); +-} +- +-static int +-qca8k_lag_refresh_portmap(struct dsa_switch *ds, int port, +- struct net_device *lag, bool delete) +-{ +- struct qca8k_priv *priv = ds->priv; +- int ret, id, i; +- u32 val; +- +- id = dsa_lag_id(ds->dst, lag); +- +- /* Read current port member */ +- ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, &val); +- if (ret) +- return ret; +- +- /* Shift val to the correct trunk */ +- val >>= QCA8K_REG_GOL_TRUNK_SHIFT(id); +- val &= QCA8K_REG_GOL_TRUNK_MEMBER_MASK; +- if (delete) +- val &= ~BIT(port); +- else +- val |= BIT(port); +- +- /* Update port member. With empty portmap disable trunk */ +- ret = regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, +- QCA8K_REG_GOL_TRUNK_MEMBER(id) | +- QCA8K_REG_GOL_TRUNK_EN(id), +- !val << QCA8K_REG_GOL_TRUNK_SHIFT(id) | +- val << QCA8K_REG_GOL_TRUNK_SHIFT(id)); +- +- /* Search empty member if adding or port on deleting */ +- for (i = 0; i < QCA8K_NUM_PORTS_FOR_LAG; i++) { +- ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), &val); +- if (ret) +- return ret; +- +- val >>= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i); +- val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_MASK; +- +- if (delete) { +- /* If port flagged to be disabled assume this member is +- * empty +- */ +- if (val != QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) +- continue; +- +- val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK; +- if (val != port) +- continue; +- } else { +- /* If port flagged to be enabled assume this member is +- * already set +- */ +- if (val == QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) +- continue; +- } +- +- /* We have found the member to add/remove */ +- break; +- } +- +- /* Set port in the correct port mask or disable port if in delete mode */ +- return regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), +- QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN(id, i) | +- QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT(id, i), +- !delete << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i) | +- port << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i)); +-} +- +-static int +-qca8k_port_lag_join(struct dsa_switch *ds, int port, +- struct net_device *lag, +- struct netdev_lag_upper_info *info) +-{ +- int ret; +- +- if (!qca8k_lag_can_offload(ds, lag, info)) +- return -EOPNOTSUPP; +- +- ret = qca8k_lag_setup_hash(ds, lag, info); +- if (ret) +- return ret; +- +- return qca8k_lag_refresh_portmap(ds, port, lag, false); +-} +- +-static int +-qca8k_port_lag_leave(struct dsa_switch *ds, int port, +- struct net_device *lag) +-{ +- return qca8k_lag_refresh_portmap(ds, port, lag, true); +-} +- + static void + qca8k_master_change(struct dsa_switch *ds, const struct net_device *master, + bool operational) +--- a/drivers/net/dsa/qca/qca8k-common.c ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -1009,3 +1009,169 @@ int qca8k_port_vlan_del(struct dsa_switc + + return ret; + } ++ ++static bool qca8k_lag_can_offload(struct dsa_switch *ds, ++ struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ struct dsa_port *dp; ++ int id, members = 0; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ if (id < 0 || id >= ds->num_lag_ids) ++ return false; ++ ++ dsa_lag_foreach_port(dp, ds->dst, lag) ++ /* Includes the port joining the LAG */ ++ members++; ++ ++ if (members > QCA8K_NUM_PORTS_FOR_LAG) ++ return false; ++ ++ if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) ++ return false; ++ ++ if (info->hash_type != NETDEV_LAG_HASH_L2 && ++ info->hash_type != NETDEV_LAG_HASH_L23) ++ return false; ++ ++ return true; ++} ++ ++static int qca8k_lag_setup_hash(struct dsa_switch *ds, ++ struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ bool unique_lag = true; ++ u32 hash = 0; ++ int i, id; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ ++ switch (info->hash_type) { ++ case NETDEV_LAG_HASH_L23: ++ hash |= QCA8K_TRUNK_HASH_SIP_EN; ++ hash |= QCA8K_TRUNK_HASH_DIP_EN; ++ fallthrough; ++ case NETDEV_LAG_HASH_L2: ++ hash |= QCA8K_TRUNK_HASH_SA_EN; ++ hash |= QCA8K_TRUNK_HASH_DA_EN; ++ break; ++ default: /* We should NEVER reach this */ ++ return -EOPNOTSUPP; ++ } ++ ++ /* Check if we are the unique configured LAG */ ++ dsa_lags_foreach_id(i, ds->dst) ++ if (i != id && dsa_lag_dev(ds->dst, i)) { ++ unique_lag = false; ++ break; ++ } ++ ++ /* Hash Mode is global. Make sure the same Hash Mode ++ * is set to all the 4 possible lag. ++ * If we are the unique LAG we can set whatever hash ++ * mode we want. ++ * To change hash mode it's needed to remove all LAG ++ * and change the mode with the latest. ++ */ ++ if (unique_lag) { ++ priv->lag_hash_mode = hash; ++ } else if (priv->lag_hash_mode != hash) { ++ netdev_err(lag, "Error: Mismatched Hash Mode across different lag is not supported\n"); ++ return -EOPNOTSUPP; ++ } ++ ++ return regmap_update_bits(priv->regmap, QCA8K_TRUNK_HASH_EN_CTRL, ++ QCA8K_TRUNK_HASH_MASK, hash); ++} ++ ++static int qca8k_lag_refresh_portmap(struct dsa_switch *ds, int port, ++ struct net_device *lag, bool delete) ++{ ++ struct qca8k_priv *priv = ds->priv; ++ int ret, id, i; ++ u32 val; ++ ++ id = dsa_lag_id(ds->dst, lag); ++ ++ /* Read current port member */ ++ ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, &val); ++ if (ret) ++ return ret; ++ ++ /* Shift val to the correct trunk */ ++ val >>= QCA8K_REG_GOL_TRUNK_SHIFT(id); ++ val &= QCA8K_REG_GOL_TRUNK_MEMBER_MASK; ++ if (delete) ++ val &= ~BIT(port); ++ else ++ val |= BIT(port); ++ ++ /* Update port member. With empty portmap disable trunk */ ++ ret = regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, ++ QCA8K_REG_GOL_TRUNK_MEMBER(id) | ++ QCA8K_REG_GOL_TRUNK_EN(id), ++ !val << QCA8K_REG_GOL_TRUNK_SHIFT(id) | ++ val << QCA8K_REG_GOL_TRUNK_SHIFT(id)); ++ ++ /* Search empty member if adding or port on deleting */ ++ for (i = 0; i < QCA8K_NUM_PORTS_FOR_LAG; i++) { ++ ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), &val); ++ if (ret) ++ return ret; ++ ++ val >>= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i); ++ val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_MASK; ++ ++ if (delete) { ++ /* If port flagged to be disabled assume this member is ++ * empty ++ */ ++ if (val != QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) ++ continue; ++ ++ val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK; ++ if (val != port) ++ continue; ++ } else { ++ /* If port flagged to be enabled assume this member is ++ * already set ++ */ ++ if (val == QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) ++ continue; ++ } ++ ++ /* We have found the member to add/remove */ ++ break; ++ } ++ ++ /* Set port in the correct port mask or disable port if in delete mode */ ++ return regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), ++ QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN(id, i) | ++ QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT(id, i), ++ !delete << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i) | ++ port << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i)); ++} ++ ++int qca8k_port_lag_join(struct dsa_switch *ds, int port, struct net_device *lag, ++ struct netdev_lag_upper_info *info) ++{ ++ int ret; ++ ++ if (!qca8k_lag_can_offload(ds, lag, info)) ++ return -EOPNOTSUPP; ++ ++ ret = qca8k_lag_setup_hash(ds, lag, info); ++ if (ret) ++ return ret; ++ ++ return qca8k_lag_refresh_portmap(ds, port, lag, false); ++} ++ ++int qca8k_port_lag_leave(struct dsa_switch *ds, int port, ++ struct net_device *lag) ++{ ++ return qca8k_lag_refresh_portmap(ds, port, lag, true); ++} +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -495,4 +495,10 @@ int qca8k_port_vlan_add(struct dsa_switc + int qca8k_port_vlan_del(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_vlan *vlan); + ++/* Common port LAG function */ ++int qca8k_port_lag_join(struct dsa_switch *ds, int port, struct net_device *lag, ++ struct netdev_lag_upper_info *info); ++int qca8k_port_lag_leave(struct dsa_switch *ds, int port, ++ struct net_device *lag); ++ + #endif /* __QCA8K_H */ diff --git a/target/linux/generic/backport-5.15/771-v6.0-14-net-dsa-qca8k-move-read_switch_id-function-to-common.patch b/target/linux/generic/backport-5.15/771-v6.0-14-net-dsa-qca8k-move-read_switch_id-function-to-common.patch new file mode 100644 index 0000000000..d6ec8b77e0 --- /dev/null +++ b/target/linux/generic/backport-5.15/771-v6.0-14-net-dsa-qca8k-move-read_switch_id-function-to-common.patch @@ -0,0 +1,102 @@ +From 9d1bcb1f293f1391302a109c9819c3705c804700 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 27 Jul 2022 13:35:23 +0200 +Subject: [PATCH 14/14] net: dsa: qca8k: move read_switch_id function to common + code + +The same function to read the switch id is used by drivers based on +qca8k family switch. Move them to common code to make them accessible +also by other drivers. + +Signed-off-by: Christian Marangi +Reviewed-by: Vladimir Oltean +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 29 ----------------------------- + drivers/net/dsa/qca/qca8k-common.c | 29 +++++++++++++++++++++++++++++ + drivers/net/dsa/qca/qca8k.h | 1 + + 3 files changed, 30 insertions(+), 29 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -1822,35 +1822,6 @@ static const struct dsa_switch_ops qca8k + .connect_tag_protocol = qca8k_connect_tag_protocol, + }; + +-static int qca8k_read_switch_id(struct qca8k_priv *priv) +-{ +- u32 val; +- u8 id; +- int ret; +- +- if (!priv->info) +- return -ENODEV; +- +- ret = qca8k_read(priv, QCA8K_REG_MASK_CTRL, &val); +- if (ret < 0) +- return -ENODEV; +- +- id = QCA8K_MASK_CTRL_DEVICE_ID(val); +- if (id != priv->info->id) { +- dev_err(priv->dev, +- "Switch id detected %x but expected %x", +- id, priv->info->id); +- return -ENODEV; +- } +- +- priv->switch_id = id; +- +- /* Save revision to communicate to the internal PHY driver */ +- priv->switch_revision = QCA8K_MASK_CTRL_REV_ID(val); +- +- return 0; +-} +- + static int + qca8k_sw_probe(struct mdio_device *mdiodev) + { +--- a/drivers/net/dsa/qca/qca8k-common.c ++++ b/drivers/net/dsa/qca/qca8k-common.c +@@ -1175,3 +1175,32 @@ int qca8k_port_lag_leave(struct dsa_swit + { + return qca8k_lag_refresh_portmap(ds, port, lag, true); + } ++ ++int qca8k_read_switch_id(struct qca8k_priv *priv) ++{ ++ u32 val; ++ u8 id; ++ int ret; ++ ++ if (!priv->info) ++ return -ENODEV; ++ ++ ret = qca8k_read(priv, QCA8K_REG_MASK_CTRL, &val); ++ if (ret < 0) ++ return -ENODEV; ++ ++ id = QCA8K_MASK_CTRL_DEVICE_ID(val); ++ if (id != priv->info->id) { ++ dev_err(priv->dev, ++ "Switch id detected %x but expected %x", ++ id, priv->info->id); ++ return -ENODEV; ++ } ++ ++ priv->switch_id = id; ++ ++ /* Save revision to communicate to the internal PHY driver */ ++ priv->switch_revision = QCA8K_MASK_CTRL_REV_ID(val); ++ ++ return 0; ++} +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -424,6 +424,7 @@ extern const struct qca8k_mib_desc ar832 + extern const struct regmap_access_table qca8k_readable_table; + int qca8k_mib_init(struct qca8k_priv *priv); + void qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable); ++int qca8k_read_switch_id(struct qca8k_priv *priv); + + /* Common read/write/rmw function */ + int qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val); diff --git a/target/linux/generic/backport-5.15/772-v6.0-net-dsa-qca8k-fix-NULL-pointer-dereference-for-of_de.patch b/target/linux/generic/backport-5.15/772-v6.0-net-dsa-qca8k-fix-NULL-pointer-dereference-for-of_de.patch new file mode 100644 index 0000000000..0cca2788f6 --- /dev/null +++ b/target/linux/generic/backport-5.15/772-v6.0-net-dsa-qca8k-fix-NULL-pointer-dereference-for-of_de.patch @@ -0,0 +1,29 @@ +From 057bcf15db8e625276ddf02b2b7c668a3cb43f81 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Sun, 4 Sep 2022 23:46:24 +0200 +Subject: [net PATCH] net: dsa: qca8k: fix NULL pointer dereference for + of_device_get_match_data + +of_device_get_match_data is called on priv->dev before priv->dev is +actually set. Move of_device_get_match_data after priv->dev is correctly +set to fix this kernel panic. + +Fixes: 3bb0844e7bcd ("net: dsa: qca8k: cache match data to speed up access") +Signed-off-by: Christian Marangi +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -1835,9 +1835,9 @@ qca8k_sw_probe(struct mdio_device *mdiod + if (!priv) + return -ENOMEM; + +- priv->info = of_device_get_match_data(priv->dev); + priv->bus = mdiodev->bus; + priv->dev = &mdiodev->dev; ++ priv->info = of_device_get_match_data(priv->dev); + + priv->reset_gpio = devm_gpiod_get_optional(priv->dev, "reset", + GPIOD_ASIS); diff --git a/target/linux/generic/backport-5.15/773-v5.18-1-net-dsa-Move-VLAN-filtering-syncing-out-of-dsa_switc.patch b/target/linux/generic/backport-5.15/773-v5.18-1-net-dsa-Move-VLAN-filtering-syncing-out-of-dsa_switc.patch new file mode 100644 index 0000000000..44093eab95 --- /dev/null +++ b/target/linux/generic/backport-5.15/773-v5.18-1-net-dsa-Move-VLAN-filtering-syncing-out-of-dsa_switc.patch @@ -0,0 +1,77 @@ +From 381a730182f1d174e1950cd4e63e885b1c302051 Mon Sep 17 00:00:00 2001 +From: Tobias Waldekranz +Date: Mon, 24 Jan 2022 22:09:43 +0100 +Subject: net: dsa: Move VLAN filtering syncing out of dsa_switch_bridge_leave + +Most of dsa_switch_bridge_leave was, in fact, dealing with the syncing +of VLAN filtering for switches on which that is a global +setting. Separate the two phases to prepare for the cross-chip related +bugfix in the following commit. + +Signed-off-by: Tobias Waldekranz +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + net/dsa/switch.c | 38 +++++++++++++++++++++++++------------- + 1 file changed, 25 insertions(+), 13 deletions(-) + +--- a/net/dsa/switch.c ++++ b/net/dsa/switch.c +@@ -113,25 +113,14 @@ static int dsa_switch_bridge_join(struct + return dsa_tag_8021q_bridge_join(ds, info); + } + +-static int dsa_switch_bridge_leave(struct dsa_switch *ds, +- struct dsa_notifier_bridge_info *info) ++static int dsa_switch_sync_vlan_filtering(struct dsa_switch *ds, ++ struct dsa_notifier_bridge_info *info) + { +- struct dsa_switch_tree *dst = ds->dst; + struct netlink_ext_ack extack = {0}; + bool change_vlan_filtering = false; + bool vlan_filtering; + int err, port; + +- if (dst->index == info->tree_index && ds->index == info->sw_index && +- ds->ops->port_bridge_leave) +- ds->ops->port_bridge_leave(ds, info->port, info->br); +- +- if ((dst->index != info->tree_index || ds->index != info->sw_index) && +- ds->ops->crosschip_bridge_leave) +- ds->ops->crosschip_bridge_leave(ds, info->tree_index, +- info->sw_index, info->port, +- info->br); +- + if (ds->needs_standalone_vlan_filtering && !br_vlan_enabled(info->br)) { + change_vlan_filtering = true; + vlan_filtering = true; +@@ -172,6 +161,29 @@ static int dsa_switch_bridge_leave(struc + return err; + } + ++ return 0; ++} ++ ++static int dsa_switch_bridge_leave(struct dsa_switch *ds, ++ struct dsa_notifier_bridge_info *info) ++{ ++ struct dsa_switch_tree *dst = ds->dst; ++ int err; ++ ++ if (dst->index == info->tree_index && ds->index == info->sw_index && ++ ds->ops->port_bridge_leave) ++ ds->ops->port_bridge_leave(ds, info->port, info->br); ++ ++ if ((dst->index != info->tree_index || ds->index != info->sw_index) && ++ ds->ops->crosschip_bridge_leave) ++ ds->ops->crosschip_bridge_leave(ds, info->tree_index, ++ info->sw_index, info->port, ++ info->br); ++ ++ err = dsa_switch_sync_vlan_filtering(ds, info); ++ if (err) ++ return err; ++ + return dsa_tag_8021q_bridge_leave(ds, info); + } + diff --git a/target/linux/generic/backport-5.15/773-v5.18-2-net-dsa-Avoid-cross-chip-syncing-of-VLAN-filtering.patch b/target/linux/generic/backport-5.15/773-v5.18-2-net-dsa-Avoid-cross-chip-syncing-of-VLAN-filtering.patch new file mode 100644 index 0000000000..cdddbcf14e --- /dev/null +++ b/target/linux/generic/backport-5.15/773-v5.18-2-net-dsa-Avoid-cross-chip-syncing-of-VLAN-filtering.patch @@ -0,0 +1,52 @@ +From 108dc8741c203e9d6ce4e973367f1bac20c7192b Mon Sep 17 00:00:00 2001 +From: Tobias Waldekranz +Date: Mon, 24 Jan 2022 22:09:44 +0100 +Subject: net: dsa: Avoid cross-chip syncing of VLAN filtering + +Changes to VLAN filtering are not applicable to cross-chip +notifications. + +On a system like this: + +.-----. .-----. .-----. +| sw1 +---+ sw2 +---+ sw3 | +'-1-2-' '-1-2-' '-1-2-' + +Before this change, upon sw1p1 leaving a bridge, a call to +dsa_port_vlan_filtering would also be made to sw2p1 and sw3p1. + +In this scenario: + +.---------. .-----. .-----. +| sw1 +---+ sw2 +---+ sw3 | +'-1-2-3-4-' '-1-2-' '-1-2-' + +When sw1p4 would leave a bridge, dsa_port_vlan_filtering would be +called for sw2 and sw3 with a non-existing port - leading to array +out-of-bounds accesses and crashes on mv88e6xxx. + +Fixes: d371b7c92d19 ("net: dsa: Unset vlan_filtering when ports leave the bridge") +Signed-off-by: Tobias Waldekranz +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + net/dsa/switch.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +--- a/net/dsa/switch.c ++++ b/net/dsa/switch.c +@@ -180,9 +180,11 @@ static int dsa_switch_bridge_leave(struc + info->sw_index, info->port, + info->br); + +- err = dsa_switch_sync_vlan_filtering(ds, info); +- if (err) +- return err; ++ if (ds->dst->index == info->tree_index && ds->index == info->sw_index) { ++ err = dsa_switch_sync_vlan_filtering(ds, info); ++ if (err) ++ return err; ++ } + + return dsa_tag_8021q_bridge_leave(ds, info); + } diff --git a/target/linux/generic/backport-5.15/774-v5.16-01-net-dsa-rtl8366rb-Support-bridge-offloading.patch b/target/linux/generic/backport-5.15/774-v5.16-01-net-dsa-rtl8366rb-Support-bridge-offloading.patch new file mode 100644 index 0000000000..78570c5e6e --- /dev/null +++ b/target/linux/generic/backport-5.15/774-v5.16-01-net-dsa-rtl8366rb-Support-bridge-offloading.patch @@ -0,0 +1,141 @@ +From c9111895fd38dadf125e07be627778a9950d8d77 Mon Sep 17 00:00:00 2001 +From: DENG Qingfang +Date: Sun, 26 Sep 2021 00:59:24 +0200 +Subject: [PATCH 01/11] net: dsa: rtl8366rb: Support bridge offloading +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Use port isolation registers to configure bridge offloading. + +Tested on the D-Link DIR-685, switching between ports and +sniffing ports to make sure no packets leak. + +Cc: Vladimir Oltean +Cc: Mauri Sandberg +Reviewed-by: Vladimir Oltean +Reviewed-by: Alvin Å ipraga +Reviewed-by: Florian Fainelli +Signed-off-by: DENG Qingfang +Signed-off-by: Linus Walleij +Signed-off-by: David S. Miller +--- + drivers/net/dsa/rtl8366rb.c | 86 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 86 insertions(+) + +--- a/drivers/net/dsa/rtl8366rb.c ++++ b/drivers/net/dsa/rtl8366rb.c +@@ -300,6 +300,13 @@ + #define RTL8366RB_INTERRUPT_STATUS_REG 0x0442 + #define RTL8366RB_NUM_INTERRUPT 14 /* 0..13 */ + ++/* Port isolation registers */ ++#define RTL8366RB_PORT_ISO_BASE 0x0F08 ++#define RTL8366RB_PORT_ISO(pnum) (RTL8366RB_PORT_ISO_BASE + (pnum)) ++#define RTL8366RB_PORT_ISO_EN BIT(0) ++#define RTL8366RB_PORT_ISO_PORTS_MASK GENMASK(7, 1) ++#define RTL8366RB_PORT_ISO_PORTS(pmask) ((pmask) << 1) ++ + /* bits 0..5 enable force when cleared */ + #define RTL8366RB_MAC_FORCE_CTRL_REG 0x0F11 + +@@ -835,6 +842,21 @@ static int rtl8366rb_setup(struct dsa_sw + if (ret) + return ret; + ++ /* Isolate all user ports so they can only send packets to itself and the CPU port */ ++ for (i = 0; i < RTL8366RB_PORT_NUM_CPU; i++) { ++ ret = regmap_write(smi->map, RTL8366RB_PORT_ISO(i), ++ RTL8366RB_PORT_ISO_PORTS(BIT(RTL8366RB_PORT_NUM_CPU)) | ++ RTL8366RB_PORT_ISO_EN); ++ if (ret) ++ return ret; ++ } ++ /* CPU port can send packets to all ports */ ++ ret = regmap_write(smi->map, RTL8366RB_PORT_ISO(RTL8366RB_PORT_NUM_CPU), ++ RTL8366RB_PORT_ISO_PORTS(dsa_user_ports(ds)) | ++ RTL8366RB_PORT_ISO_EN); ++ if (ret) ++ return ret; ++ + /* Set up the "green ethernet" feature */ + ret = rtl8366rb_jam_table(rtl8366rb_green_jam, + ARRAY_SIZE(rtl8366rb_green_jam), smi, false); +@@ -1127,6 +1149,68 @@ rtl8366rb_port_disable(struct dsa_switch + rb8366rb_set_port_led(smi, port, false); + } + ++static int ++rtl8366rb_port_bridge_join(struct dsa_switch *ds, int port, ++ struct net_device *bridge) ++{ ++ struct realtek_smi *smi = ds->priv; ++ unsigned int port_bitmap = 0; ++ int ret, i; ++ ++ /* Loop over all other ports than the current one */ ++ for (i = 0; i < RTL8366RB_PORT_NUM_CPU; i++) { ++ /* Current port handled last */ ++ if (i == port) ++ continue; ++ /* Not on this bridge */ ++ if (dsa_to_port(ds, i)->bridge_dev != bridge) ++ continue; ++ /* Join this port to each other port on the bridge */ ++ ret = regmap_update_bits(smi->map, RTL8366RB_PORT_ISO(i), ++ RTL8366RB_PORT_ISO_PORTS(BIT(port)), ++ RTL8366RB_PORT_ISO_PORTS(BIT(port))); ++ if (ret) ++ dev_err(smi->dev, "failed to join port %d\n", port); ++ ++ port_bitmap |= BIT(i); ++ } ++ ++ /* Set the bits for the ports we can access */ ++ return regmap_update_bits(smi->map, RTL8366RB_PORT_ISO(port), ++ RTL8366RB_PORT_ISO_PORTS(port_bitmap), ++ RTL8366RB_PORT_ISO_PORTS(port_bitmap)); ++} ++ ++static void ++rtl8366rb_port_bridge_leave(struct dsa_switch *ds, int port, ++ struct net_device *bridge) ++{ ++ struct realtek_smi *smi = ds->priv; ++ unsigned int port_bitmap = 0; ++ int ret, i; ++ ++ /* Loop over all other ports than this one */ ++ for (i = 0; i < RTL8366RB_PORT_NUM_CPU; i++) { ++ /* Current port handled last */ ++ if (i == port) ++ continue; ++ /* Not on this bridge */ ++ if (dsa_to_port(ds, i)->bridge_dev != bridge) ++ continue; ++ /* Remove this port from any other port on the bridge */ ++ ret = regmap_update_bits(smi->map, RTL8366RB_PORT_ISO(i), ++ RTL8366RB_PORT_ISO_PORTS(BIT(port)), 0); ++ if (ret) ++ dev_err(smi->dev, "failed to leave port %d\n", port); ++ ++ port_bitmap |= BIT(i); ++ } ++ ++ /* Clear the bits for the ports we can not access, leave ourselves */ ++ regmap_update_bits(smi->map, RTL8366RB_PORT_ISO(port), ++ RTL8366RB_PORT_ISO_PORTS(port_bitmap), 0); ++} ++ + static int rtl8366rb_change_mtu(struct dsa_switch *ds, int port, int new_mtu) + { + struct realtek_smi *smi = ds->priv; +@@ -1510,6 +1594,8 @@ static const struct dsa_switch_ops rtl83 + .get_strings = rtl8366_get_strings, + .get_ethtool_stats = rtl8366_get_ethtool_stats, + .get_sset_count = rtl8366_get_sset_count, ++ .port_bridge_join = rtl8366rb_port_bridge_join, ++ .port_bridge_leave = rtl8366rb_port_bridge_leave, + .port_vlan_filtering = rtl8366_vlan_filtering, + .port_vlan_add = rtl8366_vlan_add, + .port_vlan_del = rtl8366_vlan_del, diff --git a/target/linux/generic/backport-5.15/774-v5.16-02-net-dsa-rtl8366-Drop-custom-VLAN-set-up.patch b/target/linux/generic/backport-5.15/774-v5.16-02-net-dsa-rtl8366-Drop-custom-VLAN-set-up.patch new file mode 100644 index 0000000000..e61349a32c --- /dev/null +++ b/target/linux/generic/backport-5.15/774-v5.16-02-net-dsa-rtl8366-Drop-custom-VLAN-set-up.patch @@ -0,0 +1,118 @@ +From 96cf10a8e7297065459473c081a6fb6432a22312 Mon Sep 17 00:00:00 2001 +From: Linus Walleij +Date: Sun, 26 Sep 2021 00:59:25 +0200 +Subject: [PATCH 02/11] net: dsa: rtl8366: Drop custom VLAN set-up +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This hacky default VLAN setup was done in order to direct +packets to the right ports and provide port isolation, both +which we now support properly using custom tags and proper +bridge port isolation. + +We can drop the custom VLAN code and leave all VLAN handling +alone, as users expect things to be. We can also drop +ds->configure_vlan_while_not_filtering = false; and let +the core deal with any VLANs it wants. + +Cc: Mauri Sandberg +Cc: DENG Qingfang +Reviewed-by: Vladimir Oltean +Reviewed-by: Alvin Å ipraga +Reviewed-by: Florian Fainelli +Signed-off-by: Linus Walleij +Signed-off-by: David S. Miller +--- + drivers/net/dsa/realtek-smi-core.h | 1 - + drivers/net/dsa/rtl8366.c | 48 ------------------------------ + drivers/net/dsa/rtl8366rb.c | 4 +-- + 3 files changed, 1 insertion(+), 52 deletions(-) + +--- a/drivers/net/dsa/realtek-smi-core.h ++++ b/drivers/net/dsa/realtek-smi-core.h +@@ -129,7 +129,6 @@ int rtl8366_set_pvid(struct realtek_smi + int rtl8366_enable_vlan4k(struct realtek_smi *smi, bool enable); + int rtl8366_enable_vlan(struct realtek_smi *smi, bool enable); + int rtl8366_reset_vlan(struct realtek_smi *smi); +-int rtl8366_init_vlan(struct realtek_smi *smi); + int rtl8366_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, + struct netlink_ext_ack *extack); + int rtl8366_vlan_add(struct dsa_switch *ds, int port, +--- a/drivers/net/dsa/rtl8366.c ++++ b/drivers/net/dsa/rtl8366.c +@@ -292,54 +292,6 @@ int rtl8366_reset_vlan(struct realtek_sm + } + EXPORT_SYMBOL_GPL(rtl8366_reset_vlan); + +-int rtl8366_init_vlan(struct realtek_smi *smi) +-{ +- int port; +- int ret; +- +- ret = rtl8366_reset_vlan(smi); +- if (ret) +- return ret; +- +- /* Loop over the available ports, for each port, associate +- * it with the VLAN (port+1) +- */ +- for (port = 0; port < smi->num_ports; port++) { +- u32 mask; +- +- if (port == smi->cpu_port) +- /* For the CPU port, make all ports members of this +- * VLAN. +- */ +- mask = GENMASK((int)smi->num_ports - 1, 0); +- else +- /* For all other ports, enable itself plus the +- * CPU port. +- */ +- mask = BIT(port) | BIT(smi->cpu_port); +- +- /* For each port, set the port as member of VLAN (port+1) +- * and untagged, except for the CPU port: the CPU port (5) is +- * member of VLAN 6 and so are ALL the other ports as well. +- * Use filter 0 (no filter). +- */ +- dev_info(smi->dev, "VLAN%d port mask for port %d, %08x\n", +- (port + 1), port, mask); +- ret = rtl8366_set_vlan(smi, (port + 1), mask, mask, 0); +- if (ret) +- return ret; +- +- dev_info(smi->dev, "VLAN%d port %d, PVID set to %d\n", +- (port + 1), port, (port + 1)); +- ret = rtl8366_set_pvid(smi, port, (port + 1)); +- if (ret) +- return ret; +- } +- +- return rtl8366_enable_vlan(smi, true); +-} +-EXPORT_SYMBOL_GPL(rtl8366_init_vlan); +- + int rtl8366_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, + struct netlink_ext_ack *extack) + { +--- a/drivers/net/dsa/rtl8366rb.c ++++ b/drivers/net/dsa/rtl8366rb.c +@@ -985,7 +985,7 @@ static int rtl8366rb_setup(struct dsa_sw + return ret; + } + +- ret = rtl8366_init_vlan(smi); ++ ret = rtl8366_reset_vlan(smi); + if (ret) + return ret; + +@@ -999,8 +999,6 @@ static int rtl8366rb_setup(struct dsa_sw + return -ENODEV; + } + +- ds->configure_vlan_while_not_filtering = false; +- + return 0; + } + diff --git a/target/linux/generic/backport-5.15/774-v5.16-03-net-dsa-rtl8366rb-Rewrite-weird-VLAN-filering-enable.patch b/target/linux/generic/backport-5.15/774-v5.16-03-net-dsa-rtl8366rb-Rewrite-weird-VLAN-filering-enable.patch new file mode 100644 index 0000000000..2b19752399 --- /dev/null +++ b/target/linux/generic/backport-5.15/774-v5.16-03-net-dsa-rtl8366rb-Rewrite-weird-VLAN-filering-enable.patch @@ -0,0 +1,270 @@ +From 7028f54b620f8df344b18e46e4a78e266091ab45 Mon Sep 17 00:00:00 2001 +From: Linus Walleij +Date: Sun, 26 Sep 2021 00:59:26 +0200 +Subject: [PATCH 03/11] net: dsa: rtl8366rb: Rewrite weird VLAN filering + enablement +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +While we were defining one VLAN per port for isolating the ports +the port_vlan_filtering() callback was implemented to enable a +VLAN on the port + 1. This function makes no sense, not only is +it incomplete as it only enables the VLAN, it doesn't do what +the callback is supposed to do, which is to selectively enable +and disable filtering on a certain port. + +Implement the correct callback: we have two registers dealing +with filtering on the RTL9366RB, so we implement an ASIC-specific +callback and implement filering using the register bit that makes +the switch drop frames if the port is not in the VLAN member set. + +The DSA documentation Documentation/networking/switchdev.rst states: + + When the bridge has VLAN filtering enabled and a PVID is not + configured on the ingress port, untagged and 802.1p tagged + packets must be dropped. When the bridge has VLAN filtering + enabled and a PVID exists on the ingress port, untagged and + priority-tagged packets must be accepted and forwarded according + to the bridge's port membership of the PVID VLAN. When the + bridge has VLAN filtering disabled, the presence/lack of a + PVID should not influence the packet forwarding decision. + +To comply with this, we add two arrays of bool in the RTL8366RB +state that keeps track of if filtering and PVID is enabled or +not for each port. We then add code such that whenever filtering +or PVID changes, we update the filter according to the +specification. + +Cc: Vladimir Oltean +Cc: Mauri Sandberg +Cc: Alvin Å ipraga +Cc: Florian Fainelli +Cc: DENG Qingfang +Signed-off-by: Linus Walleij +Signed-off-by: David S. Miller +--- + drivers/net/dsa/realtek-smi-core.h | 2 - + drivers/net/dsa/rtl8366.c | 35 ---------- + drivers/net/dsa/rtl8366rb.c | 102 +++++++++++++++++++++++++++-- + 3 files changed, 95 insertions(+), 44 deletions(-) + +--- a/drivers/net/dsa/realtek-smi-core.h ++++ b/drivers/net/dsa/realtek-smi-core.h +@@ -129,8 +129,6 @@ int rtl8366_set_pvid(struct realtek_smi + int rtl8366_enable_vlan4k(struct realtek_smi *smi, bool enable); + int rtl8366_enable_vlan(struct realtek_smi *smi, bool enable); + int rtl8366_reset_vlan(struct realtek_smi *smi); +-int rtl8366_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, +- struct netlink_ext_ack *extack); + int rtl8366_vlan_add(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_vlan *vlan, + struct netlink_ext_ack *extack); +--- a/drivers/net/dsa/rtl8366.c ++++ b/drivers/net/dsa/rtl8366.c +@@ -292,41 +292,6 @@ int rtl8366_reset_vlan(struct realtek_sm + } + EXPORT_SYMBOL_GPL(rtl8366_reset_vlan); + +-int rtl8366_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, +- struct netlink_ext_ack *extack) +-{ +- struct realtek_smi *smi = ds->priv; +- struct rtl8366_vlan_4k vlan4k; +- int ret; +- +- /* Use VLAN nr port + 1 since VLAN0 is not valid */ +- if (!smi->ops->is_vlan_valid(smi, port + 1)) +- return -EINVAL; +- +- dev_info(smi->dev, "%s filtering on port %d\n", +- vlan_filtering ? "enable" : "disable", +- port); +- +- /* TODO: +- * The hardware support filter ID (FID) 0..7, I have no clue how to +- * support this in the driver when the callback only says on/off. +- */ +- ret = smi->ops->get_vlan_4k(smi, port + 1, &vlan4k); +- if (ret) +- return ret; +- +- /* Just set the filter to FID 1 for now then */ +- ret = rtl8366_set_vlan(smi, port + 1, +- vlan4k.member, +- vlan4k.untag, +- 1); +- if (ret) +- return ret; +- +- return 0; +-} +-EXPORT_SYMBOL_GPL(rtl8366_vlan_filtering); +- + int rtl8366_vlan_add(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_vlan *vlan, + struct netlink_ext_ack *extack) +--- a/drivers/net/dsa/rtl8366rb.c ++++ b/drivers/net/dsa/rtl8366rb.c +@@ -143,6 +143,21 @@ + #define RTL8366RB_PHY_NO_OFFSET 9 + #define RTL8366RB_PHY_NO_MASK (0x1f << 9) + ++/* VLAN Ingress Control Register 1, one bit per port. ++ * bit 0 .. 5 will make the switch drop ingress frames without ++ * VID such as untagged or priority-tagged frames for respective ++ * port. ++ * bit 6 .. 11 will make the switch drop ingress frames carrying ++ * a C-tag with VID != 0 for respective port. ++ */ ++#define RTL8366RB_VLAN_INGRESS_CTRL1_REG 0x037E ++#define RTL8366RB_VLAN_INGRESS_CTRL1_DROP(port) (BIT((port)) | BIT((port) + 6)) ++ ++/* VLAN Ingress Control Register 2, one bit per port. ++ * bit0 .. bit5 will make the switch drop all ingress frames with ++ * a VLAN classification that does not include the port is in its ++ * member set. ++ */ + #define RTL8366RB_VLAN_INGRESS_CTRL2_REG 0x037f + + /* LED control registers */ +@@ -321,9 +336,13 @@ + /** + * struct rtl8366rb - RTL8366RB-specific data + * @max_mtu: per-port max MTU setting ++ * @pvid_enabled: if PVID is set for respective port ++ * @vlan_filtering: if VLAN filtering is enabled for respective port + */ + struct rtl8366rb { + unsigned int max_mtu[RTL8366RB_NUM_PORTS]; ++ bool pvid_enabled[RTL8366RB_NUM_PORTS]; ++ bool vlan_filtering[RTL8366RB_NUM_PORTS]; + }; + + static struct rtl8366_mib_counter rtl8366rb_mib_counters[] = { +@@ -933,11 +952,13 @@ static int rtl8366rb_setup(struct dsa_sw + if (ret) + return ret; + +- /* Discard VLAN tagged packets if the port is not a member of +- * the VLAN with which the packets is associated. +- */ ++ /* Accept all packets by default, we enable filtering on-demand */ ++ ret = regmap_write(smi->map, RTL8366RB_VLAN_INGRESS_CTRL1_REG, ++ 0); ++ if (ret) ++ return ret; + ret = regmap_write(smi->map, RTL8366RB_VLAN_INGRESS_CTRL2_REG, +- RTL8366RB_PORT_ALL); ++ 0); + if (ret) + return ret; + +@@ -1209,6 +1230,53 @@ rtl8366rb_port_bridge_leave(struct dsa_s + RTL8366RB_PORT_ISO_PORTS(port_bitmap), 0); + } + ++/** ++ * rtl8366rb_drop_untagged() - make the switch drop untagged and C-tagged frames ++ * @smi: SMI state container ++ * @port: the port to drop untagged and C-tagged frames on ++ * @drop: whether to drop or pass untagged and C-tagged frames ++ */ ++static int rtl8366rb_drop_untagged(struct realtek_smi *smi, int port, bool drop) ++{ ++ return regmap_update_bits(smi->map, RTL8366RB_VLAN_INGRESS_CTRL1_REG, ++ RTL8366RB_VLAN_INGRESS_CTRL1_DROP(port), ++ drop ? RTL8366RB_VLAN_INGRESS_CTRL1_DROP(port) : 0); ++} ++ ++static int rtl8366rb_vlan_filtering(struct dsa_switch *ds, int port, ++ bool vlan_filtering, ++ struct netlink_ext_ack *extack) ++{ ++ struct realtek_smi *smi = ds->priv; ++ struct rtl8366rb *rb; ++ int ret; ++ ++ rb = smi->chip_data; ++ ++ dev_dbg(smi->dev, "port %d: %s VLAN filtering\n", port, ++ vlan_filtering ? "enable" : "disable"); ++ ++ /* If the port is not in the member set, the frame will be dropped */ ++ ret = regmap_update_bits(smi->map, RTL8366RB_VLAN_INGRESS_CTRL2_REG, ++ BIT(port), vlan_filtering ? BIT(port) : 0); ++ if (ret) ++ return ret; ++ ++ /* Keep track if filtering is enabled on each port */ ++ rb->vlan_filtering[port] = vlan_filtering; ++ ++ /* If VLAN filtering is enabled and PVID is also enabled, we must ++ * not drop any untagged or C-tagged frames. If we turn off VLAN ++ * filtering on a port, we need ti accept any frames. ++ */ ++ if (vlan_filtering) ++ ret = rtl8366rb_drop_untagged(smi, port, !rb->pvid_enabled[port]); ++ else ++ ret = rtl8366rb_drop_untagged(smi, port, false); ++ ++ return ret; ++} ++ + static int rtl8366rb_change_mtu(struct dsa_switch *ds, int port, int new_mtu) + { + struct realtek_smi *smi = ds->priv; +@@ -1420,14 +1488,34 @@ static int rtl8366rb_get_mc_index(struct + + static int rtl8366rb_set_mc_index(struct realtek_smi *smi, int port, int index) + { ++ struct rtl8366rb *rb; ++ bool pvid_enabled; ++ int ret; ++ ++ rb = smi->chip_data; ++ pvid_enabled = !!index; ++ + if (port >= smi->num_ports || index >= RTL8366RB_NUM_VLANS) + return -EINVAL; + +- return regmap_update_bits(smi->map, RTL8366RB_PORT_VLAN_CTRL_REG(port), ++ ret = regmap_update_bits(smi->map, RTL8366RB_PORT_VLAN_CTRL_REG(port), + RTL8366RB_PORT_VLAN_CTRL_MASK << + RTL8366RB_PORT_VLAN_CTRL_SHIFT(port), + (index & RTL8366RB_PORT_VLAN_CTRL_MASK) << + RTL8366RB_PORT_VLAN_CTRL_SHIFT(port)); ++ if (ret) ++ return ret; ++ ++ rb->pvid_enabled[port] = pvid_enabled; ++ ++ /* If VLAN filtering is enabled and PVID is also enabled, we must ++ * not drop any untagged or C-tagged frames. Make sure to update the ++ * filtering setting. ++ */ ++ if (rb->vlan_filtering[port]) ++ ret = rtl8366rb_drop_untagged(smi, port, !pvid_enabled); ++ ++ return ret; + } + + static bool rtl8366rb_is_vlan_valid(struct realtek_smi *smi, unsigned int vlan) +@@ -1437,7 +1525,7 @@ static bool rtl8366rb_is_vlan_valid(stru + if (smi->vlan4k_enabled) + max = RTL8366RB_NUM_VIDS - 1; + +- if (vlan == 0 || vlan > max) ++ if (vlan > max) + return false; + + return true; +@@ -1594,7 +1682,7 @@ static const struct dsa_switch_ops rtl83 + .get_sset_count = rtl8366_get_sset_count, + .port_bridge_join = rtl8366rb_port_bridge_join, + .port_bridge_leave = rtl8366rb_port_bridge_leave, +- .port_vlan_filtering = rtl8366_vlan_filtering, ++ .port_vlan_filtering = rtl8366rb_vlan_filtering, + .port_vlan_add = rtl8366_vlan_add, + .port_vlan_del = rtl8366_vlan_del, + .port_enable = rtl8366rb_port_enable, diff --git a/target/linux/generic/backport-5.15/774-v5.16-06-net-dsa-rtl8366-Drop-and-depromote-pointless-prints.patch b/target/linux/generic/backport-5.15/774-v5.16-06-net-dsa-rtl8366-Drop-and-depromote-pointless-prints.patch new file mode 100644 index 0000000000..b56032c366 --- /dev/null +++ b/target/linux/generic/backport-5.15/774-v5.16-06-net-dsa-rtl8366-Drop-and-depromote-pointless-prints.patch @@ -0,0 +1,51 @@ +From ddb59a5dc42714999c335dab4bf256125ba3120c Mon Sep 17 00:00:00 2001 +From: Linus Walleij +Date: Sun, 26 Sep 2021 00:59:29 +0200 +Subject: [PATCH 06/11] net: dsa: rtl8366: Drop and depromote pointless prints +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We don't need a message for every VLAN association, dbg +is fine. The message about adding the DSA or CPU +port to a VLAN is directly misleading, this is perfectly +fine. + +Cc: Vladimir Oltean +Cc: Mauri Sandberg +Cc: DENG Qingfang +Reviewed-by: Alvin Å ipraga +Reviewed-by: Florian Fainelli +Signed-off-by: Linus Walleij +Signed-off-by: David S. Miller +--- + drivers/net/dsa/rtl8366.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +--- a/drivers/net/dsa/rtl8366.c ++++ b/drivers/net/dsa/rtl8366.c +@@ -318,12 +318,9 @@ int rtl8366_vlan_add(struct dsa_switch * + return ret; + } + +- dev_info(smi->dev, "add VLAN %d on port %d, %s, %s\n", +- vlan->vid, port, untagged ? "untagged" : "tagged", +- pvid ? " PVID" : "no PVID"); +- +- if (dsa_is_dsa_port(ds, port) || dsa_is_cpu_port(ds, port)) +- dev_err(smi->dev, "port is DSA or CPU port\n"); ++ dev_dbg(smi->dev, "add VLAN %d on port %d, %s, %s\n", ++ vlan->vid, port, untagged ? "untagged" : "tagged", ++ pvid ? "PVID" : "no PVID"); + + member |= BIT(port); + +@@ -356,7 +353,7 @@ int rtl8366_vlan_del(struct dsa_switch * + struct realtek_smi *smi = ds->priv; + int ret, i; + +- dev_info(smi->dev, "del VLAN %04x on port %d\n", vlan->vid, port); ++ dev_dbg(smi->dev, "del VLAN %d on port %d\n", vlan->vid, port); + + for (i = 0; i < smi->num_vlan_mc; i++) { + struct rtl8366_vlan_mc vlanmc; diff --git a/target/linux/generic/backport-5.15/774-v5.16-07-net-dsa-rtl8366rb-Use-core-filtering-tracking.patch b/target/linux/generic/backport-5.15/774-v5.16-07-net-dsa-rtl8366rb-Use-core-filtering-tracking.patch new file mode 100644 index 0000000000..8cd1df97f2 --- /dev/null +++ b/target/linux/generic/backport-5.15/774-v5.16-07-net-dsa-rtl8366rb-Use-core-filtering-tracking.patch @@ -0,0 +1,61 @@ +From 5c9b66f3c8a3f72fa2a58e89a57c6d7afd550bf0 Mon Sep 17 00:00:00 2001 +From: Linus Walleij +Date: Wed, 29 Sep 2021 13:23:22 +0200 +Subject: [PATCH 07/11] net: dsa: rtl8366rb: Use core filtering tracking +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We added a state variable to track whether a certain port +was VLAN filtering or not, but we can just inquire the DSA +core about this. + +Cc: Vladimir Oltean +Cc: Mauri Sandberg +Cc: DENG Qingfang +Cc: Alvin Å ipraga +Cc: Reviewed-by: Florian Fainelli +Signed-off-by: Linus Walleij +Signed-off-by: David S. Miller +--- + drivers/net/dsa/rtl8366rb.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +--- a/drivers/net/dsa/rtl8366rb.c ++++ b/drivers/net/dsa/rtl8366rb.c +@@ -337,12 +337,10 @@ + * struct rtl8366rb - RTL8366RB-specific data + * @max_mtu: per-port max MTU setting + * @pvid_enabled: if PVID is set for respective port +- * @vlan_filtering: if VLAN filtering is enabled for respective port + */ + struct rtl8366rb { + unsigned int max_mtu[RTL8366RB_NUM_PORTS]; + bool pvid_enabled[RTL8366RB_NUM_PORTS]; +- bool vlan_filtering[RTL8366RB_NUM_PORTS]; + }; + + static struct rtl8366_mib_counter rtl8366rb_mib_counters[] = { +@@ -1262,12 +1260,9 @@ static int rtl8366rb_vlan_filtering(stru + if (ret) + return ret; + +- /* Keep track if filtering is enabled on each port */ +- rb->vlan_filtering[port] = vlan_filtering; +- + /* If VLAN filtering is enabled and PVID is also enabled, we must + * not drop any untagged or C-tagged frames. If we turn off VLAN +- * filtering on a port, we need ti accept any frames. ++ * filtering on a port, we need to accept any frames. + */ + if (vlan_filtering) + ret = rtl8366rb_drop_untagged(smi, port, !rb->pvid_enabled[port]); +@@ -1512,7 +1507,7 @@ static int rtl8366rb_set_mc_index(struct + * not drop any untagged or C-tagged frames. Make sure to update the + * filtering setting. + */ +- if (rb->vlan_filtering[port]) ++ if (dsa_port_is_vlan_filtering(dsa_to_port(smi->ds, port))) + ret = rtl8366rb_drop_untagged(smi, port, !pvid_enabled); + + return ret; diff --git a/target/linux/generic/backport-5.15/774-v5.16-08-net-dsa-rtl8366rb-Support-disabling-learning.patch b/target/linux/generic/backport-5.15/774-v5.16-08-net-dsa-rtl8366rb-Support-disabling-learning.patch new file mode 100644 index 0000000000..8306eb5aef --- /dev/null +++ b/target/linux/generic/backport-5.15/774-v5.16-08-net-dsa-rtl8366rb-Support-disabling-learning.patch @@ -0,0 +1,115 @@ +From 831a3d26bea0d14f8563eecf96def660a74a3000 Mon Sep 17 00:00:00 2001 +From: Linus Walleij +Date: Tue, 5 Oct 2021 21:47:02 +0200 +Subject: [PATCH 08/11] net: dsa: rtl8366rb: Support disabling learning +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The RTL8366RB hardware supports disabling learning per-port +so let's make use of this feature. Rename some unfortunately +named registers in the process. + +Suggested-by: Vladimir Oltean +Cc: Alvin Å ipraga +Cc: Mauri Sandberg +Cc: Florian Fainelli +Cc: DENG Qingfang +Reviewed-by: Vladimir Oltean +Signed-off-by: Linus Walleij +Signed-off-by: David S. Miller +--- + drivers/net/dsa/rtl8366rb.c | 50 ++++++++++++++++++++++++++++++++----- + 1 file changed, 44 insertions(+), 6 deletions(-) + +--- a/drivers/net/dsa/rtl8366rb.c ++++ b/drivers/net/dsa/rtl8366rb.c +@@ -14,6 +14,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -42,9 +43,12 @@ + /* Port Enable Control register */ + #define RTL8366RB_PECR 0x0001 + +-/* Switch Security Control registers */ +-#define RTL8366RB_SSCR0 0x0002 +-#define RTL8366RB_SSCR1 0x0003 ++/* Switch per-port learning disablement register */ ++#define RTL8366RB_PORT_LEARNDIS_CTRL 0x0002 ++ ++/* Security control, actually aging register */ ++#define RTL8366RB_SECURITY_CTRL 0x0003 ++ + #define RTL8366RB_SSCR2 0x0004 + #define RTL8366RB_SSCR2_DROP_UNKNOWN_DA BIT(0) + +@@ -927,13 +931,14 @@ static int rtl8366rb_setup(struct dsa_sw + /* layer 2 size, see rtl8366rb_change_mtu() */ + rb->max_mtu[i] = 1532; + +- /* Enable learning for all ports */ +- ret = regmap_write(smi->map, RTL8366RB_SSCR0, 0); ++ /* Disable learning for all ports */ ++ ret = regmap_write(smi->map, RTL8366RB_PORT_LEARNDIS_CTRL, ++ RTL8366RB_PORT_ALL); + if (ret) + return ret; + + /* Enable auto ageing for all ports */ +- ret = regmap_write(smi->map, RTL8366RB_SSCR1, 0); ++ ret = regmap_write(smi->map, RTL8366RB_SECURITY_CTRL, 0); + if (ret) + return ret; + +@@ -1272,6 +1277,37 @@ static int rtl8366rb_vlan_filtering(stru + return ret; + } + ++static int ++rtl8366rb_port_pre_bridge_flags(struct dsa_switch *ds, int port, ++ struct switchdev_brport_flags flags, ++ struct netlink_ext_ack *extack) ++{ ++ /* We support enabling/disabling learning */ ++ if (flags.mask & ~(BR_LEARNING)) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int ++rtl8366rb_port_bridge_flags(struct dsa_switch *ds, int port, ++ struct switchdev_brport_flags flags, ++ struct netlink_ext_ack *extack) ++{ ++ struct realtek_smi *smi = ds->priv; ++ int ret; ++ ++ if (flags.mask & BR_LEARNING) { ++ ret = regmap_update_bits(smi->map, RTL8366RB_PORT_LEARNDIS_CTRL, ++ BIT(port), ++ (flags.val & BR_LEARNING) ? 0 : BIT(port)); ++ if (ret) ++ return ret; ++ } ++ ++ return 0; ++} ++ + static int rtl8366rb_change_mtu(struct dsa_switch *ds, int port, int new_mtu) + { + struct realtek_smi *smi = ds->priv; +@@ -1682,6 +1718,8 @@ static const struct dsa_switch_ops rtl83 + .port_vlan_del = rtl8366_vlan_del, + .port_enable = rtl8366rb_port_enable, + .port_disable = rtl8366rb_port_disable, ++ .port_pre_bridge_flags = rtl8366rb_port_pre_bridge_flags, ++ .port_bridge_flags = rtl8366rb_port_bridge_flags, + .port_change_mtu = rtl8366rb_change_mtu, + .port_max_mtu = rtl8366rb_max_mtu, + }; diff --git a/target/linux/generic/backport-5.15/774-v5.16-09-net-dsa-rtl8366rb-Support-fast-aging.patch b/target/linux/generic/backport-5.15/774-v5.16-09-net-dsa-rtl8366rb-Support-fast-aging.patch new file mode 100644 index 0000000000..a74108e23d --- /dev/null +++ b/target/linux/generic/backport-5.15/774-v5.16-09-net-dsa-rtl8366rb-Support-fast-aging.patch @@ -0,0 +1,57 @@ +From 8eb13420eb9ab4a4e2ebd612bf5dc9dba0039236 Mon Sep 17 00:00:00 2001 +From: Linus Walleij +Date: Tue, 5 Oct 2021 21:47:03 +0200 +Subject: [PATCH 09/11] net: dsa: rtl8366rb: Support fast aging +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This implements fast aging per-port using the special "security" +register, which will flush any learned L2 LUT entries on a port. + +The vendor API just enabled setting and clearing this bit, so +we set it to age out any entries on the port and then we clear +it again. + +Suggested-by: Vladimir Oltean +Cc: Mauri Sandberg +Cc: DENG Qingfang +Cc: Florian Fainelli +Reviewed-by: Alvin Å ipraga +Signed-off-by: Linus Walleij +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + drivers/net/dsa/rtl8366rb.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +--- a/drivers/net/dsa/rtl8366rb.c ++++ b/drivers/net/dsa/rtl8366rb.c +@@ -1308,6 +1308,19 @@ rtl8366rb_port_bridge_flags(struct dsa_s + return 0; + } + ++static void ++rtl8366rb_port_fast_age(struct dsa_switch *ds, int port) ++{ ++ struct realtek_smi *smi = ds->priv; ++ ++ /* This will age out any learned L2 entries */ ++ regmap_update_bits(smi->map, RTL8366RB_SECURITY_CTRL, ++ BIT(port), BIT(port)); ++ /* Restore the normal state of things */ ++ regmap_update_bits(smi->map, RTL8366RB_SECURITY_CTRL, ++ BIT(port), 0); ++} ++ + static int rtl8366rb_change_mtu(struct dsa_switch *ds, int port, int new_mtu) + { + struct realtek_smi *smi = ds->priv; +@@ -1720,6 +1733,7 @@ static const struct dsa_switch_ops rtl83 + .port_disable = rtl8366rb_port_disable, + .port_pre_bridge_flags = rtl8366rb_port_pre_bridge_flags, + .port_bridge_flags = rtl8366rb_port_bridge_flags, ++ .port_fast_age = rtl8366rb_port_fast_age, + .port_change_mtu = rtl8366rb_change_mtu, + .port_max_mtu = rtl8366rb_max_mtu, + }; diff --git a/target/linux/generic/backport-5.15/774-v5.16-10-net-dsa-rtl8366rb-Support-setting-STP-state.patch b/target/linux/generic/backport-5.15/774-v5.16-10-net-dsa-rtl8366rb-Support-setting-STP-state.patch new file mode 100644 index 0000000000..d9ca176461 --- /dev/null +++ b/target/linux/generic/backport-5.15/774-v5.16-10-net-dsa-rtl8366rb-Support-setting-STP-state.patch @@ -0,0 +1,107 @@ +From 90c855471a89d3e05ecf5b6464bd04abf2c83b70 Mon Sep 17 00:00:00 2001 +From: Linus Walleij +Date: Tue, 5 Oct 2021 21:47:04 +0200 +Subject: [PATCH 10/11] net: dsa: rtl8366rb: Support setting STP state +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This adds support for setting the STP state to the RTL8366RB +DSA switch. This rids the following message from the kernel on +e.g. libreCMC: + +DSA: failed to set STP state 3 (-95) + +Since the RTL8366RB has one STP state register per FID with +two bit per port in each, we simply loop over all the FIDs +and set the state on all of them. + +Cc: Vladimir Oltean +Cc: Alvin Å ipraga +Cc: Mauri Sandberg +Cc: DENG Qingfang +Signed-off-by: Linus Walleij +Reviewed-by: Vladimir Oltean +Signed-off-by: David S. Miller +--- + drivers/net/dsa/rtl8366rb.c | 48 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 48 insertions(+) + +--- a/drivers/net/dsa/rtl8366rb.c ++++ b/drivers/net/dsa/rtl8366rb.c +@@ -110,6 +110,18 @@ + + #define RTL8366RB_POWER_SAVING_REG 0x0021 + ++/* Spanning tree status (STP) control, two bits per port per FID */ ++#define RTL8366RB_STP_STATE_BASE 0x0050 /* 0x0050..0x0057 */ ++#define RTL8366RB_STP_STATE_DISABLED 0x0 ++#define RTL8366RB_STP_STATE_BLOCKING 0x1 ++#define RTL8366RB_STP_STATE_LEARNING 0x2 ++#define RTL8366RB_STP_STATE_FORWARDING 0x3 ++#define RTL8366RB_STP_MASK GENMASK(1, 0) ++#define RTL8366RB_STP_STATE(port, state) \ ++ ((state) << ((port) * 2)) ++#define RTL8366RB_STP_STATE_MASK(port) \ ++ RTL8366RB_STP_STATE((port), RTL8366RB_STP_MASK) ++ + /* CPU port control reg */ + #define RTL8368RB_CPU_CTRL_REG 0x0061 + #define RTL8368RB_CPU_PORTS_MSK 0x00FF +@@ -234,6 +246,7 @@ + #define RTL8366RB_NUM_LEDGROUPS 4 + #define RTL8366RB_NUM_VIDS 4096 + #define RTL8366RB_PRIORITYMAX 7 ++#define RTL8366RB_NUM_FIDS 8 + #define RTL8366RB_FIDMAX 7 + + #define RTL8366RB_PORT_1 BIT(0) /* In userspace port 0 */ +@@ -1309,6 +1322,40 @@ rtl8366rb_port_bridge_flags(struct dsa_s + } + + static void ++rtl8366rb_port_stp_state_set(struct dsa_switch *ds, int port, u8 state) ++{ ++ struct realtek_smi *smi = ds->priv; ++ u32 val; ++ int i; ++ ++ switch (state) { ++ case BR_STATE_DISABLED: ++ val = RTL8366RB_STP_STATE_DISABLED; ++ break; ++ case BR_STATE_BLOCKING: ++ case BR_STATE_LISTENING: ++ val = RTL8366RB_STP_STATE_BLOCKING; ++ break; ++ case BR_STATE_LEARNING: ++ val = RTL8366RB_STP_STATE_LEARNING; ++ break; ++ case BR_STATE_FORWARDING: ++ val = RTL8366RB_STP_STATE_FORWARDING; ++ break; ++ default: ++ dev_err(smi->dev, "unknown bridge state requested\n"); ++ return; ++ }; ++ ++ /* Set the same status for the port on all the FIDs */ ++ for (i = 0; i < RTL8366RB_NUM_FIDS; i++) { ++ regmap_update_bits(smi->map, RTL8366RB_STP_STATE_BASE + i, ++ RTL8366RB_STP_STATE_MASK(port), ++ RTL8366RB_STP_STATE(port, val)); ++ } ++} ++ ++static void + rtl8366rb_port_fast_age(struct dsa_switch *ds, int port) + { + struct realtek_smi *smi = ds->priv; +@@ -1733,6 +1780,7 @@ static const struct dsa_switch_ops rtl83 + .port_disable = rtl8366rb_port_disable, + .port_pre_bridge_flags = rtl8366rb_port_pre_bridge_flags, + .port_bridge_flags = rtl8366rb_port_bridge_flags, ++ .port_stp_state_set = rtl8366rb_port_stp_state_set, + .port_fast_age = rtl8366rb_port_fast_age, + .port_change_mtu = rtl8366rb_change_mtu, + .port_max_mtu = rtl8366rb_max_mtu, diff --git a/target/linux/generic/backport-5.15/775-v6.0-01-net-ethernet-stmicro-stmmac-move-queue-reset-to-dedi.patch b/target/linux/generic/backport-5.15/775-v6.0-01-net-ethernet-stmicro-stmmac-move-queue-reset-to-dedi.patch new file mode 100644 index 0000000000..3c10819b68 --- /dev/null +++ b/target/linux/generic/backport-5.15/775-v6.0-01-net-ethernet-stmicro-stmmac-move-queue-reset-to-dedi.patch @@ -0,0 +1,142 @@ +From f9ec5723c3dbfcede9c7b0dcdf85e401ce16316c Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Sat, 23 Jul 2022 16:29:29 +0200 +Subject: [PATCH 1/5] net: ethernet: stmicro: stmmac: move queue reset to + dedicated functions + +Move queue reset to dedicated functions. This aside from a simple +cleanup is also required to allocate a dma conf without resetting the tx +queue while the device is temporarily detached as now the reset is not +part of the dma init function and can be done later in the code flow. + +Signed-off-by: Christian Marangi +Signed-off-by: Jakub Kicinski +--- + .../net/ethernet/stmicro/stmmac/stmmac_main.c | 59 ++++++++++--------- + 1 file changed, 31 insertions(+), 28 deletions(-) + +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -130,6 +130,9 @@ static irqreturn_t stmmac_mac_interrupt( + static irqreturn_t stmmac_safety_interrupt(int irq, void *dev_id); + static irqreturn_t stmmac_msi_intr_tx(int irq, void *data); + static irqreturn_t stmmac_msi_intr_rx(int irq, void *data); ++static void stmmac_reset_rx_queue(struct stmmac_priv *priv, u32 queue); ++static void stmmac_reset_tx_queue(struct stmmac_priv *priv, u32 queue); ++static void stmmac_reset_queues_param(struct stmmac_priv *priv); + static void stmmac_tx_timer_arm(struct stmmac_priv *priv, u32 queue); + static void stmmac_flush_tx_descriptors(struct stmmac_priv *priv, int queue); + +@@ -1713,9 +1716,6 @@ static int __init_dma_rx_desc_rings(stru + return -ENOMEM; + } + +- rx_q->cur_rx = 0; +- rx_q->dirty_rx = 0; +- + /* Setup the chained descriptor addresses */ + if (priv->mode == STMMAC_CHAIN_MODE) { + if (priv->extend_desc) +@@ -1821,12 +1821,6 @@ static int __init_dma_tx_desc_rings(stru + tx_q->tx_skbuff[i] = NULL; + } + +- tx_q->dirty_tx = 0; +- tx_q->cur_tx = 0; +- tx_q->mss = 0; +- +- netdev_tx_reset_queue(netdev_get_tx_queue(priv->dev, queue)); +- + return 0; + } + +@@ -2695,10 +2689,7 @@ static void stmmac_tx_err(struct stmmac_ + stmmac_stop_tx_dma(priv, chan); + dma_free_tx_skbufs(priv, chan); + stmmac_clear_tx_descriptors(priv, chan); +- tx_q->dirty_tx = 0; +- tx_q->cur_tx = 0; +- tx_q->mss = 0; +- netdev_tx_reset_queue(netdev_get_tx_queue(priv->dev, chan)); ++ stmmac_reset_tx_queue(priv, chan); + stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, + tx_q->dma_tx_phy, chan); + stmmac_start_tx_dma(priv, chan); +@@ -3782,6 +3773,8 @@ static int stmmac_open(struct net_device + } + } + ++ stmmac_reset_queues_param(priv); ++ + ret = stmmac_hw_setup(dev, true); + if (ret < 0) { + netdev_err(priv->dev, "%s: Hw setup failed\n", __func__); +@@ -6429,6 +6422,7 @@ void stmmac_enable_rx_queue(struct stmma + return; + } + ++ stmmac_reset_rx_queue(priv, queue); + stmmac_clear_rx_descriptors(priv, queue); + + stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, +@@ -6490,6 +6484,7 @@ void stmmac_enable_tx_queue(struct stmma + return; + } + ++ stmmac_reset_tx_queue(priv, queue); + stmmac_clear_tx_descriptors(priv, queue); + + stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, +@@ -7414,6 +7409,25 @@ int stmmac_suspend(struct device *dev) + } + EXPORT_SYMBOL_GPL(stmmac_suspend); + ++static void stmmac_reset_rx_queue(struct stmmac_priv *priv, u32 queue) ++{ ++ struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ ++ rx_q->cur_rx = 0; ++ rx_q->dirty_rx = 0; ++} ++ ++static void stmmac_reset_tx_queue(struct stmmac_priv *priv, u32 queue) ++{ ++ struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ ++ tx_q->cur_tx = 0; ++ tx_q->dirty_tx = 0; ++ tx_q->mss = 0; ++ ++ netdev_tx_reset_queue(netdev_get_tx_queue(priv->dev, queue)); ++} ++ + /** + * stmmac_reset_queues_param - reset queue parameters + * @priv: device pointer +@@ -7424,22 +7438,11 @@ static void stmmac_reset_queues_param(st + u32 tx_cnt = priv->plat->tx_queues_to_use; + u32 queue; + +- for (queue = 0; queue < rx_cnt; queue++) { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ for (queue = 0; queue < rx_cnt; queue++) ++ stmmac_reset_rx_queue(priv, queue); + +- rx_q->cur_rx = 0; +- rx_q->dirty_rx = 0; +- } +- +- for (queue = 0; queue < tx_cnt; queue++) { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; +- +- tx_q->cur_tx = 0; +- tx_q->dirty_tx = 0; +- tx_q->mss = 0; +- +- netdev_tx_reset_queue(netdev_get_tx_queue(priv->dev, queue)); +- } ++ for (queue = 0; queue < tx_cnt; queue++) ++ stmmac_reset_tx_queue(priv, queue); + } + + /** diff --git a/target/linux/generic/backport-5.15/775-v6.0-02-net-ethernet-stmicro-stmmac-first-disable-all-queues.patch b/target/linux/generic/backport-5.15/775-v6.0-02-net-ethernet-stmicro-stmmac-first-disable-all-queues.patch new file mode 100644 index 0000000000..6e115834eb --- /dev/null +++ b/target/linux/generic/backport-5.15/775-v6.0-02-net-ethernet-stmicro-stmmac-first-disable-all-queues.patch @@ -0,0 +1,37 @@ +From 7028471edb646bfc532fec0973e50e784cdcb7c6 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Sat, 23 Jul 2022 16:29:30 +0200 +Subject: [PATCH 2/5] net: ethernet: stmicro: stmmac: first disable all queues + and disconnect in release + +Disable all queues and disconnect before tx_disable in stmmac_release to +prevent a corner case where packet may be still queued at the same time +tx_disable is called resulting in kernel panic if some packet still has +to be processed. + +Signed-off-by: Christian Marangi +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -3834,8 +3834,6 @@ static int stmmac_release(struct net_dev + struct stmmac_priv *priv = netdev_priv(dev); + u32 chan; + +- netif_tx_disable(dev); +- + if (device_may_wakeup(priv->device)) + phylink_speed_down(priv->phylink, false); + /* Stop and disconnect the PHY */ +@@ -3847,6 +3845,8 @@ static int stmmac_release(struct net_dev + for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) + hrtimer_cancel(&priv->tx_queue[chan].txtimer); + ++ netif_tx_disable(dev); ++ + /* Free the IRQ lines */ + stmmac_free_irq(dev, REQ_IRQ_ERR_ALL, 0); + diff --git a/target/linux/generic/backport-5.15/775-v6.0-03-net-ethernet-stmicro-stmmac-move-dma-conf-to-dedicat.patch b/target/linux/generic/backport-5.15/775-v6.0-03-net-ethernet-stmicro-stmmac-move-dma-conf-to-dedicat.patch new file mode 100644 index 0000000000..99518b11a0 --- /dev/null +++ b/target/linux/generic/backport-5.15/775-v6.0-03-net-ethernet-stmicro-stmmac-move-dma-conf-to-dedicat.patch @@ -0,0 +1,1289 @@ +From 8531c80800c10e8ef7952022326c2f983e1314bf Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Sat, 23 Jul 2022 16:29:31 +0200 +Subject: [PATCH 3/5] net: ethernet: stmicro: stmmac: move dma conf to + dedicated struct + +Move dma buf conf to dedicated struct. This in preparation for code +rework that will permit to allocate separate dma_conf without affecting +the priv struct. + +Signed-off-by: Christian Marangi +Signed-off-by: Jakub Kicinski +--- + .../net/ethernet/stmicro/stmmac/chain_mode.c | 6 +- + .../net/ethernet/stmicro/stmmac/ring_mode.c | 4 +- + drivers/net/ethernet/stmicro/stmmac/stmmac.h | 21 +- + .../ethernet/stmicro/stmmac/stmmac_ethtool.c | 4 +- + .../net/ethernet/stmicro/stmmac/stmmac_main.c | 286 +++++++++--------- + .../stmicro/stmmac/stmmac_selftests.c | 8 +- + .../net/ethernet/stmicro/stmmac/stmmac_tc.c | 6 +- + 7 files changed, 172 insertions(+), 163 deletions(-) + +--- a/drivers/net/ethernet/stmicro/stmmac/chain_mode.c ++++ b/drivers/net/ethernet/stmicro/stmmac/chain_mode.c +@@ -46,7 +46,7 @@ static int jumbo_frm(void *p, struct sk_ + + while (len != 0) { + tx_q->tx_skbuff[entry] = NULL; +- entry = STMMAC_GET_ENTRY(entry, priv->dma_tx_size); ++ entry = STMMAC_GET_ENTRY(entry, priv->dma_conf.dma_tx_size); + desc = tx_q->dma_tx + entry; + + if (len > bmax) { +@@ -137,7 +137,7 @@ static void refill_desc3(void *priv_ptr, + */ + p->des3 = cpu_to_le32((unsigned int)(rx_q->dma_rx_phy + + (((rx_q->dirty_rx) + 1) % +- priv->dma_rx_size) * ++ priv->dma_conf.dma_rx_size) * + sizeof(struct dma_desc))); + } + +@@ -155,7 +155,7 @@ static void clean_desc3(void *priv_ptr, + */ + p->des3 = cpu_to_le32((unsigned int)((tx_q->dma_tx_phy + + ((tx_q->dirty_tx + 1) % +- priv->dma_tx_size)) ++ priv->dma_conf.dma_tx_size)) + * sizeof(struct dma_desc))); + } + +--- a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c ++++ b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c +@@ -51,7 +51,7 @@ static int jumbo_frm(void *p, struct sk_ + stmmac_prepare_tx_desc(priv, desc, 1, bmax, csum, + STMMAC_RING_MODE, 0, false, skb->len); + tx_q->tx_skbuff[entry] = NULL; +- entry = STMMAC_GET_ENTRY(entry, priv->dma_tx_size); ++ entry = STMMAC_GET_ENTRY(entry, priv->dma_conf.dma_tx_size); + + if (priv->extend_desc) + desc = (struct dma_desc *)(tx_q->dma_etx + entry); +@@ -107,7 +107,7 @@ static void refill_desc3(void *priv_ptr, + struct stmmac_priv *priv = rx_q->priv_data; + + /* Fill DES3 in case of RING mode */ +- if (priv->dma_buf_sz == BUF_SIZE_16KiB) ++ if (priv->dma_conf.dma_buf_sz == BUF_SIZE_16KiB) + p->des3 = cpu_to_le32(le32_to_cpu(p->des2) + BUF_SIZE_8KiB); + } + +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h +@@ -185,6 +185,18 @@ struct stmmac_rfs_entry { + int tc; + }; + ++struct stmmac_dma_conf { ++ unsigned int dma_buf_sz; ++ ++ /* RX Queue */ ++ struct stmmac_rx_queue rx_queue[MTL_MAX_RX_QUEUES]; ++ unsigned int dma_rx_size; ++ ++ /* TX Queue */ ++ struct stmmac_tx_queue tx_queue[MTL_MAX_TX_QUEUES]; ++ unsigned int dma_tx_size; ++}; ++ + struct stmmac_priv { + /* Frequently used values are kept adjacent for cache effect */ + u32 tx_coal_frames[MTL_MAX_TX_QUEUES]; +@@ -199,7 +211,6 @@ struct stmmac_priv { + int sph_cap; + u32 sarc_type; + +- unsigned int dma_buf_sz; + unsigned int rx_copybreak; + u32 rx_riwt[MTL_MAX_TX_QUEUES]; + int hwts_rx_en; +@@ -211,13 +222,7 @@ struct stmmac_priv { + int (*hwif_quirks)(struct stmmac_priv *priv); + struct mutex lock; + +- /* RX Queue */ +- struct stmmac_rx_queue rx_queue[MTL_MAX_RX_QUEUES]; +- unsigned int dma_rx_size; +- +- /* TX Queue */ +- struct stmmac_tx_queue tx_queue[MTL_MAX_TX_QUEUES]; +- unsigned int dma_tx_size; ++ struct stmmac_dma_conf dma_conf; + + /* Generic channel for NAPI */ + struct stmmac_channel channel[STMMAC_CH_MAX]; +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +@@ -484,8 +484,8 @@ static void stmmac_get_ringparam(struct + + ring->rx_max_pending = DMA_MAX_RX_SIZE; + ring->tx_max_pending = DMA_MAX_TX_SIZE; +- ring->rx_pending = priv->dma_rx_size; +- ring->tx_pending = priv->dma_tx_size; ++ ring->rx_pending = priv->dma_conf.dma_rx_size; ++ ring->tx_pending = priv->dma_conf.dma_tx_size; + } + + static int stmmac_set_ringparam(struct net_device *netdev, +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -74,8 +74,8 @@ static int phyaddr = -1; + module_param(phyaddr, int, 0444); + MODULE_PARM_DESC(phyaddr, "Physical device address"); + +-#define STMMAC_TX_THRESH(x) ((x)->dma_tx_size / 4) +-#define STMMAC_RX_THRESH(x) ((x)->dma_rx_size / 4) ++#define STMMAC_TX_THRESH(x) ((x)->dma_conf.dma_tx_size / 4) ++#define STMMAC_RX_THRESH(x) ((x)->dma_conf.dma_rx_size / 4) + + /* Limit to make sure XDP TX and slow path can coexist */ + #define STMMAC_XSK_TX_BUDGET_MAX 256 +@@ -232,7 +232,7 @@ static void stmmac_disable_all_queues(st + + /* synchronize_rcu() needed for pending XDP buffers to drain */ + for (queue = 0; queue < rx_queues_cnt; queue++) { +- rx_q = &priv->rx_queue[queue]; ++ rx_q = &priv->dma_conf.rx_queue[queue]; + if (rx_q->xsk_pool) { + synchronize_rcu(); + break; +@@ -358,13 +358,13 @@ static void print_pkt(unsigned char *buf + + static inline u32 stmmac_tx_avail(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + u32 avail; + + if (tx_q->dirty_tx > tx_q->cur_tx) + avail = tx_q->dirty_tx - tx_q->cur_tx - 1; + else +- avail = priv->dma_tx_size - tx_q->cur_tx + tx_q->dirty_tx - 1; ++ avail = priv->dma_conf.dma_tx_size - tx_q->cur_tx + tx_q->dirty_tx - 1; + + return avail; + } +@@ -376,13 +376,13 @@ static inline u32 stmmac_tx_avail(struct + */ + static inline u32 stmmac_rx_dirty(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + u32 dirty; + + if (rx_q->dirty_rx <= rx_q->cur_rx) + dirty = rx_q->cur_rx - rx_q->dirty_rx; + else +- dirty = priv->dma_rx_size - rx_q->dirty_rx + rx_q->cur_rx; ++ dirty = priv->dma_conf.dma_rx_size - rx_q->dirty_rx + rx_q->cur_rx; + + return dirty; + } +@@ -410,7 +410,7 @@ static int stmmac_enable_eee_mode(struct + + /* check if all TX queues have the work finished */ + for (queue = 0; queue < tx_cnt; queue++) { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + + if (tx_q->dirty_tx != tx_q->cur_tx) + return -EBUSY; /* still unfinished work */ +@@ -1310,7 +1310,7 @@ static void stmmac_display_rx_rings(stru + + /* Display RX rings */ + for (queue = 0; queue < rx_cnt; queue++) { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + + pr_info("\tRX Queue %u rings\n", queue); + +@@ -1323,7 +1323,7 @@ static void stmmac_display_rx_rings(stru + } + + /* Display RX ring */ +- stmmac_display_ring(priv, head_rx, priv->dma_rx_size, true, ++ stmmac_display_ring(priv, head_rx, priv->dma_conf.dma_rx_size, true, + rx_q->dma_rx_phy, desc_size); + } + } +@@ -1337,7 +1337,7 @@ static void stmmac_display_tx_rings(stru + + /* Display TX rings */ + for (queue = 0; queue < tx_cnt; queue++) { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + + pr_info("\tTX Queue %d rings\n", queue); + +@@ -1352,7 +1352,7 @@ static void stmmac_display_tx_rings(stru + desc_size = sizeof(struct dma_desc); + } + +- stmmac_display_ring(priv, head_tx, priv->dma_tx_size, false, ++ stmmac_display_ring(priv, head_tx, priv->dma_conf.dma_tx_size, false, + tx_q->dma_tx_phy, desc_size); + } + } +@@ -1393,21 +1393,21 @@ static int stmmac_set_bfsize(int mtu, in + */ + static void stmmac_clear_rx_descriptors(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + int i; + + /* Clear the RX descriptors */ +- for (i = 0; i < priv->dma_rx_size; i++) ++ for (i = 0; i < priv->dma_conf.dma_rx_size; i++) + if (priv->extend_desc) + stmmac_init_rx_desc(priv, &rx_q->dma_erx[i].basic, + priv->use_riwt, priv->mode, +- (i == priv->dma_rx_size - 1), +- priv->dma_buf_sz); ++ (i == priv->dma_conf.dma_rx_size - 1), ++ priv->dma_conf.dma_buf_sz); + else + stmmac_init_rx_desc(priv, &rx_q->dma_rx[i], + priv->use_riwt, priv->mode, +- (i == priv->dma_rx_size - 1), +- priv->dma_buf_sz); ++ (i == priv->dma_conf.dma_rx_size - 1), ++ priv->dma_conf.dma_buf_sz); + } + + /** +@@ -1419,12 +1419,12 @@ static void stmmac_clear_rx_descriptors( + */ + static void stmmac_clear_tx_descriptors(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + int i; + + /* Clear the TX descriptors */ +- for (i = 0; i < priv->dma_tx_size; i++) { +- int last = (i == (priv->dma_tx_size - 1)); ++ for (i = 0; i < priv->dma_conf.dma_tx_size; i++) { ++ int last = (i == (priv->dma_conf.dma_tx_size - 1)); + struct dma_desc *p; + + if (priv->extend_desc) +@@ -1472,7 +1472,7 @@ static void stmmac_clear_descriptors(str + static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p, + int i, gfp_t flags, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i]; + + if (!buf->page) { +@@ -1497,7 +1497,7 @@ static int stmmac_init_rx_buffers(struct + buf->addr = page_pool_get_dma_addr(buf->page) + buf->page_offset; + + stmmac_set_desc_addr(priv, p, buf->addr); +- if (priv->dma_buf_sz == BUF_SIZE_16KiB) ++ if (priv->dma_conf.dma_buf_sz == BUF_SIZE_16KiB) + stmmac_init_desc3(priv, p); + + return 0; +@@ -1511,7 +1511,7 @@ static int stmmac_init_rx_buffers(struct + */ + static void stmmac_free_rx_buffer(struct stmmac_priv *priv, u32 queue, int i) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i]; + + if (buf->page) +@@ -1531,7 +1531,7 @@ static void stmmac_free_rx_buffer(struct + */ + static void stmmac_free_tx_buffer(struct stmmac_priv *priv, u32 queue, int i) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + + if (tx_q->tx_skbuff_dma[i].buf && + tx_q->tx_skbuff_dma[i].buf_type != STMMAC_TXBUF_T_XDP_TX) { +@@ -1576,17 +1576,17 @@ static void dma_free_rx_skbufs(struct st + { + int i; + +- for (i = 0; i < priv->dma_rx_size; i++) ++ for (i = 0; i < priv->dma_conf.dma_rx_size; i++) + stmmac_free_rx_buffer(priv, queue, i); + } + + static int stmmac_alloc_rx_buffers(struct stmmac_priv *priv, u32 queue, + gfp_t flags) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + int i; + +- for (i = 0; i < priv->dma_rx_size; i++) { ++ for (i = 0; i < priv->dma_conf.dma_rx_size; i++) { + struct dma_desc *p; + int ret; + +@@ -1613,10 +1613,10 @@ static int stmmac_alloc_rx_buffers(struc + */ + static void dma_free_rx_xskbufs(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + int i; + +- for (i = 0; i < priv->dma_rx_size; i++) { ++ for (i = 0; i < priv->dma_conf.dma_rx_size; i++) { + struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i]; + + if (!buf->xdp) +@@ -1629,10 +1629,10 @@ static void dma_free_rx_xskbufs(struct s + + static int stmmac_alloc_rx_buffers_zc(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + int i; + +- for (i = 0; i < priv->dma_rx_size; i++) { ++ for (i = 0; i < priv->dma_conf.dma_rx_size; i++) { + struct stmmac_rx_buffer *buf; + dma_addr_t dma_addr; + struct dma_desc *p; +@@ -1675,7 +1675,7 @@ static struct xsk_buff_pool *stmmac_get_ + */ + static int __init_dma_rx_desc_rings(struct stmmac_priv *priv, u32 queue, gfp_t flags) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + int ret; + + netif_dbg(priv, probe, priv->dev, +@@ -1721,11 +1721,11 @@ static int __init_dma_rx_desc_rings(stru + if (priv->extend_desc) + stmmac_mode_init(priv, rx_q->dma_erx, + rx_q->dma_rx_phy, +- priv->dma_rx_size, 1); ++ priv->dma_conf.dma_rx_size, 1); + else + stmmac_mode_init(priv, rx_q->dma_rx, + rx_q->dma_rx_phy, +- priv->dma_rx_size, 0); ++ priv->dma_conf.dma_rx_size, 0); + } + + return 0; +@@ -1752,7 +1752,7 @@ static int init_dma_rx_desc_rings(struct + + err_init_rx_buffers: + while (queue >= 0) { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + + if (rx_q->xsk_pool) + dma_free_rx_xskbufs(priv, queue); +@@ -1781,7 +1781,7 @@ err_init_rx_buffers: + */ + static int __init_dma_tx_desc_rings(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + int i; + + netif_dbg(priv, probe, priv->dev, +@@ -1793,16 +1793,16 @@ static int __init_dma_tx_desc_rings(stru + if (priv->extend_desc) + stmmac_mode_init(priv, tx_q->dma_etx, + tx_q->dma_tx_phy, +- priv->dma_tx_size, 1); ++ priv->dma_conf.dma_tx_size, 1); + else if (!(tx_q->tbs & STMMAC_TBS_AVAIL)) + stmmac_mode_init(priv, tx_q->dma_tx, + tx_q->dma_tx_phy, +- priv->dma_tx_size, 0); ++ priv->dma_conf.dma_tx_size, 0); + } + + tx_q->xsk_pool = stmmac_get_xsk_pool(priv, queue); + +- for (i = 0; i < priv->dma_tx_size; i++) { ++ for (i = 0; i < priv->dma_conf.dma_tx_size; i++) { + struct dma_desc *p; + + if (priv->extend_desc) +@@ -1872,12 +1872,12 @@ static int init_dma_desc_rings(struct ne + */ + static void dma_free_tx_skbufs(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + int i; + + tx_q->xsk_frames_done = 0; + +- for (i = 0; i < priv->dma_tx_size; i++) ++ for (i = 0; i < priv->dma_conf.dma_tx_size; i++) + stmmac_free_tx_buffer(priv, queue, i); + + if (tx_q->xsk_pool && tx_q->xsk_frames_done) { +@@ -1907,7 +1907,7 @@ static void stmmac_free_tx_skbufs(struct + */ + static void __free_dma_rx_desc_resources(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + + /* Release the DMA RX socket buffers */ + if (rx_q->xsk_pool) +@@ -1920,11 +1920,11 @@ static void __free_dma_rx_desc_resources + + /* Free DMA regions of consistent memory previously allocated */ + if (!priv->extend_desc) +- dma_free_coherent(priv->device, priv->dma_rx_size * ++ dma_free_coherent(priv->device, priv->dma_conf.dma_rx_size * + sizeof(struct dma_desc), + rx_q->dma_rx, rx_q->dma_rx_phy); + else +- dma_free_coherent(priv->device, priv->dma_rx_size * ++ dma_free_coherent(priv->device, priv->dma_conf.dma_rx_size * + sizeof(struct dma_extended_desc), + rx_q->dma_erx, rx_q->dma_rx_phy); + +@@ -1953,7 +1953,7 @@ static void free_dma_rx_desc_resources(s + */ + static void __free_dma_tx_desc_resources(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + size_t size; + void *addr; + +@@ -1971,7 +1971,7 @@ static void __free_dma_tx_desc_resources + addr = tx_q->dma_tx; + } + +- size *= priv->dma_tx_size; ++ size *= priv->dma_conf.dma_tx_size; + + dma_free_coherent(priv->device, size, addr, tx_q->dma_tx_phy); + +@@ -2000,7 +2000,7 @@ static void free_dma_tx_desc_resources(s + */ + static int __alloc_dma_rx_desc_resources(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + struct stmmac_channel *ch = &priv->channel[queue]; + bool xdp_prog = stmmac_xdp_is_enabled(priv); + struct page_pool_params pp_params = { 0 }; +@@ -2012,8 +2012,8 @@ static int __alloc_dma_rx_desc_resources + rx_q->priv_data = priv; + + pp_params.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV; +- pp_params.pool_size = priv->dma_rx_size; +- num_pages = DIV_ROUND_UP(priv->dma_buf_sz, PAGE_SIZE); ++ pp_params.pool_size = priv->dma_conf.dma_rx_size; ++ num_pages = DIV_ROUND_UP(priv->dma_conf.dma_buf_sz, PAGE_SIZE); + pp_params.order = ilog2(num_pages); + pp_params.nid = dev_to_node(priv->device); + pp_params.dev = priv->device; +@@ -2028,7 +2028,7 @@ static int __alloc_dma_rx_desc_resources + return ret; + } + +- rx_q->buf_pool = kcalloc(priv->dma_rx_size, ++ rx_q->buf_pool = kcalloc(priv->dma_conf.dma_rx_size, + sizeof(*rx_q->buf_pool), + GFP_KERNEL); + if (!rx_q->buf_pool) +@@ -2036,7 +2036,7 @@ static int __alloc_dma_rx_desc_resources + + if (priv->extend_desc) { + rx_q->dma_erx = dma_alloc_coherent(priv->device, +- priv->dma_rx_size * ++ priv->dma_conf.dma_rx_size * + sizeof(struct dma_extended_desc), + &rx_q->dma_rx_phy, + GFP_KERNEL); +@@ -2045,7 +2045,7 @@ static int __alloc_dma_rx_desc_resources + + } else { + rx_q->dma_rx = dma_alloc_coherent(priv->device, +- priv->dma_rx_size * ++ priv->dma_conf.dma_rx_size * + sizeof(struct dma_desc), + &rx_q->dma_rx_phy, + GFP_KERNEL); +@@ -2102,20 +2102,20 @@ err_dma: + */ + static int __alloc_dma_tx_desc_resources(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + size_t size; + void *addr; + + tx_q->queue_index = queue; + tx_q->priv_data = priv; + +- tx_q->tx_skbuff_dma = kcalloc(priv->dma_tx_size, ++ tx_q->tx_skbuff_dma = kcalloc(priv->dma_conf.dma_tx_size, + sizeof(*tx_q->tx_skbuff_dma), + GFP_KERNEL); + if (!tx_q->tx_skbuff_dma) + return -ENOMEM; + +- tx_q->tx_skbuff = kcalloc(priv->dma_tx_size, ++ tx_q->tx_skbuff = kcalloc(priv->dma_conf.dma_tx_size, + sizeof(struct sk_buff *), + GFP_KERNEL); + if (!tx_q->tx_skbuff) +@@ -2128,7 +2128,7 @@ static int __alloc_dma_tx_desc_resources + else + size = sizeof(struct dma_desc); + +- size *= priv->dma_tx_size; ++ size *= priv->dma_conf.dma_tx_size; + + addr = dma_alloc_coherent(priv->device, size, + &tx_q->dma_tx_phy, GFP_KERNEL); +@@ -2372,7 +2372,7 @@ static void stmmac_dma_operation_mode(st + + /* configure all channels */ + for (chan = 0; chan < rx_channels_count; chan++) { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[chan]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[chan]; + u32 buf_size; + + qmode = priv->plat->rx_queues_cfg[chan].mode_to_use; +@@ -2387,7 +2387,7 @@ static void stmmac_dma_operation_mode(st + chan); + } else { + stmmac_set_dma_bfsize(priv, priv->ioaddr, +- priv->dma_buf_sz, ++ priv->dma_conf.dma_buf_sz, + chan); + } + } +@@ -2403,7 +2403,7 @@ static void stmmac_dma_operation_mode(st + static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget) + { + struct netdev_queue *nq = netdev_get_tx_queue(priv->dev, queue); +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + struct xsk_buff_pool *pool = tx_q->xsk_pool; + unsigned int entry = tx_q->cur_tx; + struct dma_desc *tx_desc = NULL; +@@ -2478,7 +2478,7 @@ static bool stmmac_xdp_xmit_zc(struct st + + stmmac_enable_dma_transmission(priv, priv->ioaddr); + +- tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx, priv->dma_tx_size); ++ tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx, priv->dma_conf.dma_tx_size); + entry = tx_q->cur_tx; + } + +@@ -2504,7 +2504,7 @@ static bool stmmac_xdp_xmit_zc(struct st + */ + static int stmmac_tx_clean(struct stmmac_priv *priv, int budget, u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + unsigned int bytes_compl = 0, pkts_compl = 0; + unsigned int entry, xmits = 0, count = 0; + +@@ -2517,7 +2517,7 @@ static int stmmac_tx_clean(struct stmmac + entry = tx_q->dirty_tx; + + /* Try to clean all TX complete frame in 1 shot */ +- while ((entry != tx_q->cur_tx) && count < priv->dma_tx_size) { ++ while ((entry != tx_q->cur_tx) && count < priv->dma_conf.dma_tx_size) { + struct xdp_frame *xdpf; + struct sk_buff *skb; + struct dma_desc *p; +@@ -2617,7 +2617,7 @@ static int stmmac_tx_clean(struct stmmac + + stmmac_release_tx_desc(priv, p, priv->mode); + +- entry = STMMAC_GET_ENTRY(entry, priv->dma_tx_size); ++ entry = STMMAC_GET_ENTRY(entry, priv->dma_conf.dma_tx_size); + } + tx_q->dirty_tx = entry; + +@@ -2682,7 +2682,7 @@ static int stmmac_tx_clean(struct stmmac + */ + static void stmmac_tx_err(struct stmmac_priv *priv, u32 chan) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[chan]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[chan]; + + netif_tx_stop_queue(netdev_get_tx_queue(priv->dev, chan)); + +@@ -2749,8 +2749,8 @@ static int stmmac_napi_check(struct stmm + { + int status = stmmac_dma_interrupt_status(priv, priv->ioaddr, + &priv->xstats, chan, dir); +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[chan]; +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[chan]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[chan]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[chan]; + struct stmmac_channel *ch = &priv->channel[chan]; + struct napi_struct *rx_napi; + struct napi_struct *tx_napi; +@@ -2926,7 +2926,7 @@ static int stmmac_init_dma_engine(struct + + /* DMA RX Channel Configuration */ + for (chan = 0; chan < rx_channels_count; chan++) { +- rx_q = &priv->rx_queue[chan]; ++ rx_q = &priv->dma_conf.rx_queue[chan]; + + stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, + rx_q->dma_rx_phy, chan); +@@ -2940,7 +2940,7 @@ static int stmmac_init_dma_engine(struct + + /* DMA TX Channel Configuration */ + for (chan = 0; chan < tx_channels_count; chan++) { +- tx_q = &priv->tx_queue[chan]; ++ tx_q = &priv->dma_conf.tx_queue[chan]; + + stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, + tx_q->dma_tx_phy, chan); +@@ -2955,7 +2955,7 @@ static int stmmac_init_dma_engine(struct + + static void stmmac_tx_timer_arm(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + + hrtimer_start(&tx_q->txtimer, + STMMAC_COAL_TIMER(priv->tx_coal_timer[queue]), +@@ -3005,7 +3005,7 @@ static void stmmac_init_coalesce(struct + u32 chan; + + for (chan = 0; chan < tx_channel_count; chan++) { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[chan]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[chan]; + + priv->tx_coal_frames[chan] = STMMAC_TX_FRAMES; + priv->tx_coal_timer[chan] = STMMAC_COAL_TX_TIMER; +@@ -3027,12 +3027,12 @@ static void stmmac_set_rings_length(stru + /* set TX ring length */ + for (chan = 0; chan < tx_channels_count; chan++) + stmmac_set_tx_ring_len(priv, priv->ioaddr, +- (priv->dma_tx_size - 1), chan); ++ (priv->dma_conf.dma_tx_size - 1), chan); + + /* set RX ring length */ + for (chan = 0; chan < rx_channels_count; chan++) + stmmac_set_rx_ring_len(priv, priv->ioaddr, +- (priv->dma_rx_size - 1), chan); ++ (priv->dma_conf.dma_rx_size - 1), chan); + } + + /** +@@ -3367,7 +3367,7 @@ static int stmmac_hw_setup(struct net_de + /* Enable TSO */ + if (priv->tso) { + for (chan = 0; chan < tx_cnt; chan++) { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[chan]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[chan]; + + /* TSO and TBS cannot co-exist */ + if (tx_q->tbs & STMMAC_TBS_AVAIL) +@@ -3389,7 +3389,7 @@ static int stmmac_hw_setup(struct net_de + + /* TBS */ + for (chan = 0; chan < tx_cnt; chan++) { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[chan]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[chan]; + int enable = tx_q->tbs & STMMAC_TBS_AVAIL; + + stmmac_enable_tbs(priv, priv->ioaddr, enable, chan); +@@ -3433,7 +3433,7 @@ static void stmmac_free_irq(struct net_d + for (j = irq_idx - 1; j >= 0; j--) { + if (priv->tx_irq[j] > 0) { + irq_set_affinity_hint(priv->tx_irq[j], NULL); +- free_irq(priv->tx_irq[j], &priv->tx_queue[j]); ++ free_irq(priv->tx_irq[j], &priv->dma_conf.tx_queue[j]); + } + } + irq_idx = priv->plat->rx_queues_to_use; +@@ -3442,7 +3442,7 @@ static void stmmac_free_irq(struct net_d + for (j = irq_idx - 1; j >= 0; j--) { + if (priv->rx_irq[j] > 0) { + irq_set_affinity_hint(priv->rx_irq[j], NULL); +- free_irq(priv->rx_irq[j], &priv->rx_queue[j]); ++ free_irq(priv->rx_irq[j], &priv->dma_conf.rx_queue[j]); + } + } + +@@ -3575,7 +3575,7 @@ static int stmmac_request_irq_multi_msi( + sprintf(int_name, "%s:%s-%d", dev->name, "rx", i); + ret = request_irq(priv->rx_irq[i], + stmmac_msi_intr_rx, +- 0, int_name, &priv->rx_queue[i]); ++ 0, int_name, &priv->dma_conf.rx_queue[i]); + if (unlikely(ret < 0)) { + netdev_err(priv->dev, + "%s: alloc rx-%d MSI %d (error: %d)\n", +@@ -3598,7 +3598,7 @@ static int stmmac_request_irq_multi_msi( + sprintf(int_name, "%s:%s-%d", dev->name, "tx", i); + ret = request_irq(priv->tx_irq[i], + stmmac_msi_intr_tx, +- 0, int_name, &priv->tx_queue[i]); ++ 0, int_name, &priv->dma_conf.tx_queue[i]); + if (unlikely(ret < 0)) { + netdev_err(priv->dev, + "%s: alloc tx-%d MSI %d (error: %d)\n", +@@ -3729,21 +3729,21 @@ static int stmmac_open(struct net_device + bfsize = 0; + + if (bfsize < BUF_SIZE_16KiB) +- bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz); ++ bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_conf.dma_buf_sz); + +- priv->dma_buf_sz = bfsize; ++ priv->dma_conf.dma_buf_sz = bfsize; + buf_sz = bfsize; + + priv->rx_copybreak = STMMAC_RX_COPYBREAK; + +- if (!priv->dma_tx_size) +- priv->dma_tx_size = DMA_DEFAULT_TX_SIZE; +- if (!priv->dma_rx_size) +- priv->dma_rx_size = DMA_DEFAULT_RX_SIZE; ++ if (!priv->dma_conf.dma_tx_size) ++ priv->dma_conf.dma_tx_size = DMA_DEFAULT_TX_SIZE; ++ if (!priv->dma_conf.dma_rx_size) ++ priv->dma_conf.dma_rx_size = DMA_DEFAULT_RX_SIZE; + + /* Earlier check for TBS */ + for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[chan]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[chan]; + int tbs_en = priv->plat->tx_queues_cfg[chan].tbs_en; + + /* Setup per-TXQ tbs flag before TX descriptor alloc */ +@@ -3801,7 +3801,7 @@ irq_error: + phylink_stop(priv->phylink); + + for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) +- hrtimer_cancel(&priv->tx_queue[chan].txtimer); ++ hrtimer_cancel(&priv->dma_conf.tx_queue[chan].txtimer); + + stmmac_hw_teardown(dev); + init_error: +@@ -3843,7 +3843,7 @@ static int stmmac_release(struct net_dev + stmmac_disable_all_queues(priv); + + for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) +- hrtimer_cancel(&priv->tx_queue[chan].txtimer); ++ hrtimer_cancel(&priv->dma_conf.tx_queue[chan].txtimer); + + netif_tx_disable(dev); + +@@ -3907,7 +3907,7 @@ static bool stmmac_vlan_insert(struct st + return false; + + stmmac_set_tx_owner(priv, p); +- tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx, priv->dma_tx_size); ++ tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx, priv->dma_conf.dma_tx_size); + return true; + } + +@@ -3925,7 +3925,7 @@ static bool stmmac_vlan_insert(struct st + static void stmmac_tso_allocator(struct stmmac_priv *priv, dma_addr_t des, + int total_len, bool last_segment, u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + struct dma_desc *desc; + u32 buff_size; + int tmp_len; +@@ -3936,7 +3936,7 @@ static void stmmac_tso_allocator(struct + dma_addr_t curr_addr; + + tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx, +- priv->dma_tx_size); ++ priv->dma_conf.dma_tx_size); + WARN_ON(tx_q->tx_skbuff[tx_q->cur_tx]); + + if (tx_q->tbs & STMMAC_TBS_AVAIL) +@@ -3964,7 +3964,7 @@ static void stmmac_tso_allocator(struct + + static void stmmac_flush_tx_descriptors(struct stmmac_priv *priv, int queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + int desc_size; + + if (likely(priv->extend_desc)) +@@ -4026,7 +4026,7 @@ static netdev_tx_t stmmac_tso_xmit(struc + dma_addr_t des; + int i; + +- tx_q = &priv->tx_queue[queue]; ++ tx_q = &priv->dma_conf.tx_queue[queue]; + first_tx = tx_q->cur_tx; + + /* Compute header lengths */ +@@ -4066,7 +4066,7 @@ static netdev_tx_t stmmac_tso_xmit(struc + stmmac_set_mss(priv, mss_desc, mss); + tx_q->mss = mss; + tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx, +- priv->dma_tx_size); ++ priv->dma_conf.dma_tx_size); + WARN_ON(tx_q->tx_skbuff[tx_q->cur_tx]); + } + +@@ -4178,7 +4178,7 @@ static netdev_tx_t stmmac_tso_xmit(struc + * ndo_start_xmit will fill this descriptor the next time it's + * called and stmmac_tx_clean may clean up to this descriptor. + */ +- tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx, priv->dma_tx_size); ++ tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx, priv->dma_conf.dma_tx_size); + + if (unlikely(stmmac_tx_avail(priv, queue) <= (MAX_SKB_FRAGS + 1))) { + netif_dbg(priv, hw, priv->dev, "%s: stop transmitted packets\n", +@@ -4266,7 +4266,7 @@ static netdev_tx_t stmmac_xmit(struct sk + int entry, first_tx; + dma_addr_t des; + +- tx_q = &priv->tx_queue[queue]; ++ tx_q = &priv->dma_conf.tx_queue[queue]; + first_tx = tx_q->cur_tx; + + if (priv->tx_path_in_lpi_mode && priv->eee_sw_timer_en) +@@ -4329,7 +4329,7 @@ static netdev_tx_t stmmac_xmit(struct sk + int len = skb_frag_size(frag); + bool last_segment = (i == (nfrags - 1)); + +- entry = STMMAC_GET_ENTRY(entry, priv->dma_tx_size); ++ entry = STMMAC_GET_ENTRY(entry, priv->dma_conf.dma_tx_size); + WARN_ON(tx_q->tx_skbuff[entry]); + + if (likely(priv->extend_desc)) +@@ -4400,7 +4400,7 @@ static netdev_tx_t stmmac_xmit(struct sk + * ndo_start_xmit will fill this descriptor the next time it's + * called and stmmac_tx_clean may clean up to this descriptor. + */ +- entry = STMMAC_GET_ENTRY(entry, priv->dma_tx_size); ++ entry = STMMAC_GET_ENTRY(entry, priv->dma_conf.dma_tx_size); + tx_q->cur_tx = entry; + + if (netif_msg_pktdata(priv)) { +@@ -4512,7 +4512,7 @@ static void stmmac_rx_vlan(struct net_de + */ + static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + int dirty = stmmac_rx_dirty(priv, queue); + unsigned int entry = rx_q->dirty_rx; + +@@ -4562,7 +4562,7 @@ static inline void stmmac_rx_refill(stru + dma_wmb(); + stmmac_set_rx_owner(priv, p, use_rx_wd); + +- entry = STMMAC_GET_ENTRY(entry, priv->dma_rx_size); ++ entry = STMMAC_GET_ENTRY(entry, priv->dma_conf.dma_rx_size); + } + rx_q->dirty_rx = entry; + rx_q->rx_tail_addr = rx_q->dma_rx_phy + +@@ -4590,12 +4590,12 @@ static unsigned int stmmac_rx_buf1_len(s + + /* First descriptor, not last descriptor and not split header */ + if (status & rx_not_ls) +- return priv->dma_buf_sz; ++ return priv->dma_conf.dma_buf_sz; + + plen = stmmac_get_rx_frame_len(priv, p, coe); + + /* First descriptor and last descriptor and not split header */ +- return min_t(unsigned int, priv->dma_buf_sz, plen); ++ return min_t(unsigned int, priv->dma_conf.dma_buf_sz, plen); + } + + static unsigned int stmmac_rx_buf2_len(struct stmmac_priv *priv, +@@ -4611,7 +4611,7 @@ static unsigned int stmmac_rx_buf2_len(s + + /* Not last descriptor */ + if (status & rx_not_ls) +- return priv->dma_buf_sz; ++ return priv->dma_conf.dma_buf_sz; + + plen = stmmac_get_rx_frame_len(priv, p, coe); + +@@ -4622,7 +4622,7 @@ static unsigned int stmmac_rx_buf2_len(s + static int stmmac_xdp_xmit_xdpf(struct stmmac_priv *priv, int queue, + struct xdp_frame *xdpf, bool dma_map) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + unsigned int entry = tx_q->cur_tx; + struct dma_desc *tx_desc; + dma_addr_t dma_addr; +@@ -4685,7 +4685,7 @@ static int stmmac_xdp_xmit_xdpf(struct s + + stmmac_enable_dma_transmission(priv, priv->ioaddr); + +- entry = STMMAC_GET_ENTRY(entry, priv->dma_tx_size); ++ entry = STMMAC_GET_ENTRY(entry, priv->dma_conf.dma_tx_size); + tx_q->cur_tx = entry; + + return STMMAC_XDP_TX; +@@ -4859,7 +4859,7 @@ static void stmmac_dispatch_skb_zc(struc + + static bool stmmac_rx_refill_zc(struct stmmac_priv *priv, u32 queue, u32 budget) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + unsigned int entry = rx_q->dirty_rx; + struct dma_desc *rx_desc = NULL; + bool ret = true; +@@ -4902,7 +4902,7 @@ static bool stmmac_rx_refill_zc(struct s + dma_wmb(); + stmmac_set_rx_owner(priv, rx_desc, use_rx_wd); + +- entry = STMMAC_GET_ENTRY(entry, priv->dma_rx_size); ++ entry = STMMAC_GET_ENTRY(entry, priv->dma_conf.dma_rx_size); + } + + if (rx_desc) { +@@ -4917,7 +4917,7 @@ static bool stmmac_rx_refill_zc(struct s + + static int stmmac_rx_zc(struct stmmac_priv *priv, int limit, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + unsigned int count = 0, error = 0, len = 0; + int dirty = stmmac_rx_dirty(priv, queue); + unsigned int next_entry = rx_q->cur_rx; +@@ -4939,7 +4939,7 @@ static int stmmac_rx_zc(struct stmmac_pr + desc_size = sizeof(struct dma_desc); + } + +- stmmac_display_ring(priv, rx_head, priv->dma_rx_size, true, ++ stmmac_display_ring(priv, rx_head, priv->dma_conf.dma_rx_size, true, + rx_q->dma_rx_phy, desc_size); + } + while (count < limit) { +@@ -4986,7 +4986,7 @@ read_again: + + /* Prefetch the next RX descriptor */ + rx_q->cur_rx = STMMAC_GET_ENTRY(rx_q->cur_rx, +- priv->dma_rx_size); ++ priv->dma_conf.dma_rx_size); + next_entry = rx_q->cur_rx; + + if (priv->extend_desc) +@@ -5107,7 +5107,7 @@ read_again: + */ + static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + struct stmmac_channel *ch = &priv->channel[queue]; + unsigned int count = 0, error = 0, len = 0; + int status = 0, coe = priv->hw->rx_csum; +@@ -5120,7 +5120,7 @@ static int stmmac_rx(struct stmmac_priv + int buf_sz; + + dma_dir = page_pool_get_dma_dir(rx_q->page_pool); +- buf_sz = DIV_ROUND_UP(priv->dma_buf_sz, PAGE_SIZE) * PAGE_SIZE; ++ buf_sz = DIV_ROUND_UP(priv->dma_conf.dma_buf_sz, PAGE_SIZE) * PAGE_SIZE; + + if (netif_msg_rx_status(priv)) { + void *rx_head; +@@ -5134,7 +5134,7 @@ static int stmmac_rx(struct stmmac_priv + desc_size = sizeof(struct dma_desc); + } + +- stmmac_display_ring(priv, rx_head, priv->dma_rx_size, true, ++ stmmac_display_ring(priv, rx_head, priv->dma_conf.dma_rx_size, true, + rx_q->dma_rx_phy, desc_size); + } + while (count < limit) { +@@ -5178,7 +5178,7 @@ read_again: + break; + + rx_q->cur_rx = STMMAC_GET_ENTRY(rx_q->cur_rx, +- priv->dma_rx_size); ++ priv->dma_conf.dma_rx_size); + next_entry = rx_q->cur_rx; + + if (priv->extend_desc) +@@ -5312,7 +5312,7 @@ read_again: + buf1_len, dma_dir); + skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, + buf->page, buf->page_offset, buf1_len, +- priv->dma_buf_sz); ++ priv->dma_conf.dma_buf_sz); + + /* Data payload appended into SKB */ + page_pool_release_page(rx_q->page_pool, buf->page); +@@ -5324,7 +5324,7 @@ read_again: + buf2_len, dma_dir); + skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, + buf->sec_page, 0, buf2_len, +- priv->dma_buf_sz); ++ priv->dma_conf.dma_buf_sz); + + /* Data payload appended into SKB */ + page_pool_release_page(rx_q->page_pool, buf->sec_page); +@@ -5767,11 +5767,13 @@ static irqreturn_t stmmac_safety_interru + static irqreturn_t stmmac_msi_intr_tx(int irq, void *data) + { + struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)data; ++ struct stmmac_dma_conf *dma_conf; + int chan = tx_q->queue_index; + struct stmmac_priv *priv; + int status; + +- priv = container_of(tx_q, struct stmmac_priv, tx_queue[chan]); ++ dma_conf = container_of(tx_q, struct stmmac_dma_conf, tx_queue[chan]); ++ priv = container_of(dma_conf, struct stmmac_priv, dma_conf); + + if (unlikely(!data)) { + netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__); +@@ -5811,10 +5813,12 @@ static irqreturn_t stmmac_msi_intr_tx(in + static irqreturn_t stmmac_msi_intr_rx(int irq, void *data) + { + struct stmmac_rx_queue *rx_q = (struct stmmac_rx_queue *)data; ++ struct stmmac_dma_conf *dma_conf; + int chan = rx_q->queue_index; + struct stmmac_priv *priv; + +- priv = container_of(rx_q, struct stmmac_priv, rx_queue[chan]); ++ dma_conf = container_of(rx_q, struct stmmac_dma_conf, rx_queue[chan]); ++ priv = container_of(dma_conf, struct stmmac_priv, dma_conf); + + if (unlikely(!data)) { + netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__); +@@ -5845,10 +5849,10 @@ static void stmmac_poll_controller(struc + + if (priv->plat->multi_msi_en) { + for (i = 0; i < priv->plat->rx_queues_to_use; i++) +- stmmac_msi_intr_rx(0, &priv->rx_queue[i]); ++ stmmac_msi_intr_rx(0, &priv->dma_conf.rx_queue[i]); + + for (i = 0; i < priv->plat->tx_queues_to_use; i++) +- stmmac_msi_intr_tx(0, &priv->tx_queue[i]); ++ stmmac_msi_intr_tx(0, &priv->dma_conf.tx_queue[i]); + } else { + disable_irq(dev->irq); + stmmac_interrupt(dev->irq, dev); +@@ -6029,34 +6033,34 @@ static int stmmac_rings_status_show(stru + return 0; + + for (queue = 0; queue < rx_count; queue++) { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + + seq_printf(seq, "RX Queue %d:\n", queue); + + if (priv->extend_desc) { + seq_printf(seq, "Extended descriptor ring:\n"); + sysfs_display_ring((void *)rx_q->dma_erx, +- priv->dma_rx_size, 1, seq, rx_q->dma_rx_phy); ++ priv->dma_conf.dma_rx_size, 1, seq, rx_q->dma_rx_phy); + } else { + seq_printf(seq, "Descriptor ring:\n"); + sysfs_display_ring((void *)rx_q->dma_rx, +- priv->dma_rx_size, 0, seq, rx_q->dma_rx_phy); ++ priv->dma_conf.dma_rx_size, 0, seq, rx_q->dma_rx_phy); + } + } + + for (queue = 0; queue < tx_count; queue++) { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + + seq_printf(seq, "TX Queue %d:\n", queue); + + if (priv->extend_desc) { + seq_printf(seq, "Extended descriptor ring:\n"); + sysfs_display_ring((void *)tx_q->dma_etx, +- priv->dma_tx_size, 1, seq, tx_q->dma_tx_phy); ++ priv->dma_conf.dma_tx_size, 1, seq, tx_q->dma_tx_phy); + } else if (!(tx_q->tbs & STMMAC_TBS_AVAIL)) { + seq_printf(seq, "Descriptor ring:\n"); + sysfs_display_ring((void *)tx_q->dma_tx, +- priv->dma_tx_size, 0, seq, tx_q->dma_tx_phy); ++ priv->dma_conf.dma_tx_size, 0, seq, tx_q->dma_tx_phy); + } + } + +@@ -6403,7 +6407,7 @@ void stmmac_disable_rx_queue(struct stmm + + void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + struct stmmac_channel *ch = &priv->channel[queue]; + unsigned long flags; + u32 buf_size; +@@ -6440,7 +6444,7 @@ void stmmac_enable_rx_queue(struct stmma + rx_q->queue_index); + } else { + stmmac_set_dma_bfsize(priv, priv->ioaddr, +- priv->dma_buf_sz, ++ priv->dma_conf.dma_buf_sz, + rx_q->queue_index); + } + +@@ -6466,7 +6470,7 @@ void stmmac_disable_tx_queue(struct stmm + + void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + struct stmmac_channel *ch = &priv->channel[queue]; + unsigned long flags; + int ret; +@@ -6516,7 +6520,7 @@ void stmmac_xdp_release(struct net_devic + stmmac_disable_all_queues(priv); + + for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) +- hrtimer_cancel(&priv->tx_queue[chan].txtimer); ++ hrtimer_cancel(&priv->dma_conf.tx_queue[chan].txtimer); + + /* Free the IRQ lines */ + stmmac_free_irq(dev, REQ_IRQ_ERR_ALL, 0); +@@ -6575,7 +6579,7 @@ int stmmac_xdp_open(struct net_device *d + + /* DMA RX Channel Configuration */ + for (chan = 0; chan < rx_cnt; chan++) { +- rx_q = &priv->rx_queue[chan]; ++ rx_q = &priv->dma_conf.rx_queue[chan]; + + stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, + rx_q->dma_rx_phy, chan); +@@ -6593,7 +6597,7 @@ int stmmac_xdp_open(struct net_device *d + rx_q->queue_index); + } else { + stmmac_set_dma_bfsize(priv, priv->ioaddr, +- priv->dma_buf_sz, ++ priv->dma_conf.dma_buf_sz, + rx_q->queue_index); + } + +@@ -6602,7 +6606,7 @@ int stmmac_xdp_open(struct net_device *d + + /* DMA TX Channel Configuration */ + for (chan = 0; chan < tx_cnt; chan++) { +- tx_q = &priv->tx_queue[chan]; ++ tx_q = &priv->dma_conf.tx_queue[chan]; + + stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, + tx_q->dma_tx_phy, chan); +@@ -6635,7 +6639,7 @@ int stmmac_xdp_open(struct net_device *d + + irq_error: + for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) +- hrtimer_cancel(&priv->tx_queue[chan].txtimer); ++ hrtimer_cancel(&priv->dma_conf.tx_queue[chan].txtimer); + + stmmac_hw_teardown(dev); + init_error: +@@ -6662,8 +6666,8 @@ int stmmac_xsk_wakeup(struct net_device + queue >= priv->plat->tx_queues_to_use) + return -EINVAL; + +- rx_q = &priv->rx_queue[queue]; +- tx_q = &priv->tx_queue[queue]; ++ rx_q = &priv->dma_conf.rx_queue[queue]; ++ tx_q = &priv->dma_conf.tx_queue[queue]; + ch = &priv->channel[queue]; + + if (!rx_q->xsk_pool && !tx_q->xsk_pool) +@@ -6923,8 +6927,8 @@ int stmmac_reinit_ringparam(struct net_d + if (netif_running(dev)) + stmmac_release(dev); + +- priv->dma_rx_size = rx_size; +- priv->dma_tx_size = tx_size; ++ priv->dma_conf.dma_rx_size = rx_size; ++ priv->dma_conf.dma_tx_size = tx_size; + + if (netif_running(dev)) + ret = stmmac_open(dev); +@@ -7359,7 +7363,7 @@ int stmmac_suspend(struct device *dev) + stmmac_disable_all_queues(priv); + + for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) +- hrtimer_cancel(&priv->tx_queue[chan].txtimer); ++ hrtimer_cancel(&priv->dma_conf.tx_queue[chan].txtimer); + + if (priv->eee_enabled) { + priv->tx_path_in_lpi_mode = false; +@@ -7411,7 +7415,7 @@ EXPORT_SYMBOL_GPL(stmmac_suspend); + + static void stmmac_reset_rx_queue(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + + rx_q->cur_rx = 0; + rx_q->dirty_rx = 0; +@@ -7419,7 +7423,7 @@ static void stmmac_reset_rx_queue(struct + + static void stmmac_reset_tx_queue(struct stmmac_priv *priv, u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; + + tx_q->cur_tx = 0; + tx_q->dirty_tx = 0; +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c +@@ -795,8 +795,8 @@ static int stmmac_test_flowctrl(struct s + struct stmmac_channel *ch = &priv->channel[i]; + u32 tail; + +- tail = priv->rx_queue[i].dma_rx_phy + +- (priv->dma_rx_size * sizeof(struct dma_desc)); ++ tail = priv->dma_conf.rx_queue[i].dma_rx_phy + ++ (priv->dma_conf.dma_rx_size * sizeof(struct dma_desc)); + + stmmac_set_rx_tail_ptr(priv, priv->ioaddr, tail, i); + stmmac_start_rx(priv, priv->ioaddr, i); +@@ -1684,7 +1684,7 @@ cleanup: + static int __stmmac_test_jumbo(struct stmmac_priv *priv, u16 queue) + { + struct stmmac_packet_attrs attr = { }; +- int size = priv->dma_buf_sz; ++ int size = priv->dma_conf.dma_buf_sz; + + attr.dst = priv->dev->dev_addr; + attr.max_size = size - ETH_FCS_LEN; +@@ -1767,7 +1767,7 @@ static int stmmac_test_tbs(struct stmmac + + /* Find first TBS enabled Queue, if any */ + for (i = 0; i < priv->plat->tx_queues_to_use; i++) +- if (priv->tx_queue[i].tbs & STMMAC_TBS_AVAIL) ++ if (priv->dma_conf.tx_queue[i].tbs & STMMAC_TBS_AVAIL) + break; + + if (i >= priv->plat->tx_queues_to_use) +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c +@@ -971,13 +971,13 @@ static int tc_setup_etf(struct stmmac_pr + return -EOPNOTSUPP; + if (qopt->queue >= priv->plat->tx_queues_to_use) + return -EINVAL; +- if (!(priv->tx_queue[qopt->queue].tbs & STMMAC_TBS_AVAIL)) ++ if (!(priv->dma_conf.tx_queue[qopt->queue].tbs & STMMAC_TBS_AVAIL)) + return -EINVAL; + + if (qopt->enable) +- priv->tx_queue[qopt->queue].tbs |= STMMAC_TBS_EN; ++ priv->dma_conf.tx_queue[qopt->queue].tbs |= STMMAC_TBS_EN; + else +- priv->tx_queue[qopt->queue].tbs &= ~STMMAC_TBS_EN; ++ priv->dma_conf.tx_queue[qopt->queue].tbs &= ~STMMAC_TBS_EN; + + netdev_info(priv->dev, "%s ETF for Queue %d\n", + qopt->enable ? "enabled" : "disabled", qopt->queue); diff --git a/target/linux/generic/backport-5.15/775-v6.0-04-net-ethernet-stmicro-stmmac-generate-stmmac-dma-conf.patch b/target/linux/generic/backport-5.15/775-v6.0-04-net-ethernet-stmicro-stmmac-generate-stmmac-dma-conf.patch new file mode 100644 index 0000000000..7336456c0c --- /dev/null +++ b/target/linux/generic/backport-5.15/775-v6.0-04-net-ethernet-stmicro-stmmac-generate-stmmac-dma-conf.patch @@ -0,0 +1,1161 @@ +From ba39b344e9240a4a5fd4ab8178200b85cd1809da Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Sat, 23 Jul 2022 16:29:32 +0200 +Subject: [PATCH 4/5] net: ethernet: stmicro: stmmac: generate stmmac dma conf + before open + +Rework the driver to generate the stmmac dma_conf before stmmac_open. +This permits a function to first check if it's possible to allocate a +new dma_config and then pass it directly to __stmmac_open and "open" the +interface with the new configuration. + +Signed-off-by: Christian Marangi +Signed-off-by: Jakub Kicinski +--- + .../net/ethernet/stmicro/stmmac/stmmac_main.c | 462 +++++++++++------- + 1 file changed, 289 insertions(+), 173 deletions(-) + +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -1301,7 +1301,8 @@ static int stmmac_phy_setup(struct stmma + return 0; + } + +-static void stmmac_display_rx_rings(struct stmmac_priv *priv) ++static void stmmac_display_rx_rings(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf) + { + u32 rx_cnt = priv->plat->rx_queues_to_use; + unsigned int desc_size; +@@ -1310,7 +1311,7 @@ static void stmmac_display_rx_rings(stru + + /* Display RX rings */ + for (queue = 0; queue < rx_cnt; queue++) { +- struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; + + pr_info("\tRX Queue %u rings\n", queue); + +@@ -1323,12 +1324,13 @@ static void stmmac_display_rx_rings(stru + } + + /* Display RX ring */ +- stmmac_display_ring(priv, head_rx, priv->dma_conf.dma_rx_size, true, ++ stmmac_display_ring(priv, head_rx, dma_conf->dma_rx_size, true, + rx_q->dma_rx_phy, desc_size); + } + } + +-static void stmmac_display_tx_rings(struct stmmac_priv *priv) ++static void stmmac_display_tx_rings(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf) + { + u32 tx_cnt = priv->plat->tx_queues_to_use; + unsigned int desc_size; +@@ -1337,7 +1339,7 @@ static void stmmac_display_tx_rings(stru + + /* Display TX rings */ + for (queue = 0; queue < tx_cnt; queue++) { +- struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &dma_conf->tx_queue[queue]; + + pr_info("\tTX Queue %d rings\n", queue); + +@@ -1352,18 +1354,19 @@ static void stmmac_display_tx_rings(stru + desc_size = sizeof(struct dma_desc); + } + +- stmmac_display_ring(priv, head_tx, priv->dma_conf.dma_tx_size, false, ++ stmmac_display_ring(priv, head_tx, dma_conf->dma_tx_size, false, + tx_q->dma_tx_phy, desc_size); + } + } + +-static void stmmac_display_rings(struct stmmac_priv *priv) ++static void stmmac_display_rings(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf) + { + /* Display RX ring */ +- stmmac_display_rx_rings(priv); ++ stmmac_display_rx_rings(priv, dma_conf); + + /* Display TX ring */ +- stmmac_display_tx_rings(priv); ++ stmmac_display_tx_rings(priv, dma_conf); + } + + static int stmmac_set_bfsize(int mtu, int bufsize) +@@ -1387,44 +1390,50 @@ static int stmmac_set_bfsize(int mtu, in + /** + * stmmac_clear_rx_descriptors - clear RX descriptors + * @priv: driver private structure ++ * @dma_conf: structure to take the dma data + * @queue: RX queue index + * Description: this function is called to clear the RX descriptors + * in case of both basic and extended descriptors are used. + */ +-static void stmmac_clear_rx_descriptors(struct stmmac_priv *priv, u32 queue) ++static void stmmac_clear_rx_descriptors(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; + int i; + + /* Clear the RX descriptors */ +- for (i = 0; i < priv->dma_conf.dma_rx_size; i++) ++ for (i = 0; i < dma_conf->dma_rx_size; i++) + if (priv->extend_desc) + stmmac_init_rx_desc(priv, &rx_q->dma_erx[i].basic, + priv->use_riwt, priv->mode, +- (i == priv->dma_conf.dma_rx_size - 1), +- priv->dma_conf.dma_buf_sz); ++ (i == dma_conf->dma_rx_size - 1), ++ dma_conf->dma_buf_sz); + else + stmmac_init_rx_desc(priv, &rx_q->dma_rx[i], + priv->use_riwt, priv->mode, +- (i == priv->dma_conf.dma_rx_size - 1), +- priv->dma_conf.dma_buf_sz); ++ (i == dma_conf->dma_rx_size - 1), ++ dma_conf->dma_buf_sz); + } + + /** + * stmmac_clear_tx_descriptors - clear tx descriptors + * @priv: driver private structure ++ * @dma_conf: structure to take the dma data + * @queue: TX queue index. + * Description: this function is called to clear the TX descriptors + * in case of both basic and extended descriptors are used. + */ +-static void stmmac_clear_tx_descriptors(struct stmmac_priv *priv, u32 queue) ++static void stmmac_clear_tx_descriptors(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &dma_conf->tx_queue[queue]; + int i; + + /* Clear the TX descriptors */ +- for (i = 0; i < priv->dma_conf.dma_tx_size; i++) { +- int last = (i == (priv->dma_conf.dma_tx_size - 1)); ++ for (i = 0; i < dma_conf->dma_tx_size; i++) { ++ int last = (i == (dma_conf->dma_tx_size - 1)); + struct dma_desc *p; + + if (priv->extend_desc) +@@ -1441,10 +1450,12 @@ static void stmmac_clear_tx_descriptors( + /** + * stmmac_clear_descriptors - clear descriptors + * @priv: driver private structure ++ * @dma_conf: structure to take the dma data + * Description: this function is called to clear the TX and RX descriptors + * in case of both basic and extended descriptors are used. + */ +-static void stmmac_clear_descriptors(struct stmmac_priv *priv) ++static void stmmac_clear_descriptors(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf) + { + u32 rx_queue_cnt = priv->plat->rx_queues_to_use; + u32 tx_queue_cnt = priv->plat->tx_queues_to_use; +@@ -1452,16 +1463,17 @@ static void stmmac_clear_descriptors(str + + /* Clear the RX descriptors */ + for (queue = 0; queue < rx_queue_cnt; queue++) +- stmmac_clear_rx_descriptors(priv, queue); ++ stmmac_clear_rx_descriptors(priv, dma_conf, queue); + + /* Clear the TX descriptors */ + for (queue = 0; queue < tx_queue_cnt; queue++) +- stmmac_clear_tx_descriptors(priv, queue); ++ stmmac_clear_tx_descriptors(priv, dma_conf, queue); + } + + /** + * stmmac_init_rx_buffers - init the RX descriptor buffer. + * @priv: driver private structure ++ * @dma_conf: structure to take the dma data + * @p: descriptor pointer + * @i: descriptor index + * @flags: gfp flag +@@ -1469,10 +1481,12 @@ static void stmmac_clear_descriptors(str + * Description: this function is called to allocate a receive buffer, perform + * the DMA mapping and init the descriptor. + */ +-static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p, ++static int stmmac_init_rx_buffers(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ struct dma_desc *p, + int i, gfp_t flags, u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; + struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i]; + + if (!buf->page) { +@@ -1497,7 +1511,7 @@ static int stmmac_init_rx_buffers(struct + buf->addr = page_pool_get_dma_addr(buf->page) + buf->page_offset; + + stmmac_set_desc_addr(priv, p, buf->addr); +- if (priv->dma_conf.dma_buf_sz == BUF_SIZE_16KiB) ++ if (dma_conf->dma_buf_sz == BUF_SIZE_16KiB) + stmmac_init_desc3(priv, p); + + return 0; +@@ -1506,12 +1520,13 @@ static int stmmac_init_rx_buffers(struct + /** + * stmmac_free_rx_buffer - free RX dma buffers + * @priv: private structure +- * @queue: RX queue index ++ * @rx_q: RX queue + * @i: buffer index. + */ +-static void stmmac_free_rx_buffer(struct stmmac_priv *priv, u32 queue, int i) ++static void stmmac_free_rx_buffer(struct stmmac_priv *priv, ++ struct stmmac_rx_queue *rx_q, ++ int i) + { +- struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; + struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i]; + + if (buf->page) +@@ -1526,12 +1541,15 @@ static void stmmac_free_rx_buffer(struct + /** + * stmmac_free_tx_buffer - free RX dma buffers + * @priv: private structure ++ * @dma_conf: structure to take the dma data + * @queue: RX queue index + * @i: buffer index. + */ +-static void stmmac_free_tx_buffer(struct stmmac_priv *priv, u32 queue, int i) ++static void stmmac_free_tx_buffer(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue, int i) + { +- struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &dma_conf->tx_queue[queue]; + + if (tx_q->tx_skbuff_dma[i].buf && + tx_q->tx_skbuff_dma[i].buf_type != STMMAC_TXBUF_T_XDP_TX) { +@@ -1570,23 +1588,28 @@ static void stmmac_free_tx_buffer(struct + /** + * dma_free_rx_skbufs - free RX dma buffers + * @priv: private structure ++ * @dma_conf: structure to take the dma data + * @queue: RX queue index + */ +-static void dma_free_rx_skbufs(struct stmmac_priv *priv, u32 queue) ++static void dma_free_rx_skbufs(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue) + { ++ struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; + int i; + +- for (i = 0; i < priv->dma_conf.dma_rx_size; i++) +- stmmac_free_rx_buffer(priv, queue, i); ++ for (i = 0; i < dma_conf->dma_rx_size; i++) ++ stmmac_free_rx_buffer(priv, rx_q, i); + } + +-static int stmmac_alloc_rx_buffers(struct stmmac_priv *priv, u32 queue, +- gfp_t flags) ++static int stmmac_alloc_rx_buffers(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue, gfp_t flags) + { +- struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; + int i; + +- for (i = 0; i < priv->dma_conf.dma_rx_size; i++) { ++ for (i = 0; i < dma_conf->dma_rx_size; i++) { + struct dma_desc *p; + int ret; + +@@ -1595,7 +1618,7 @@ static int stmmac_alloc_rx_buffers(struc + else + p = rx_q->dma_rx + i; + +- ret = stmmac_init_rx_buffers(priv, p, i, flags, ++ ret = stmmac_init_rx_buffers(priv, dma_conf, p, i, flags, + queue); + if (ret) + return ret; +@@ -1609,14 +1632,17 @@ static int stmmac_alloc_rx_buffers(struc + /** + * dma_free_rx_xskbufs - free RX dma buffers from XSK pool + * @priv: private structure ++ * @dma_conf: structure to take the dma data + * @queue: RX queue index + */ +-static void dma_free_rx_xskbufs(struct stmmac_priv *priv, u32 queue) ++static void dma_free_rx_xskbufs(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; + int i; + +- for (i = 0; i < priv->dma_conf.dma_rx_size; i++) { ++ for (i = 0; i < dma_conf->dma_rx_size; i++) { + struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i]; + + if (!buf->xdp) +@@ -1627,12 +1653,14 @@ static void dma_free_rx_xskbufs(struct s + } + } + +-static int stmmac_alloc_rx_buffers_zc(struct stmmac_priv *priv, u32 queue) ++static int stmmac_alloc_rx_buffers_zc(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; + int i; + +- for (i = 0; i < priv->dma_conf.dma_rx_size; i++) { ++ for (i = 0; i < dma_conf->dma_rx_size; i++) { + struct stmmac_rx_buffer *buf; + dma_addr_t dma_addr; + struct dma_desc *p; +@@ -1667,22 +1695,25 @@ static struct xsk_buff_pool *stmmac_get_ + /** + * __init_dma_rx_desc_rings - init the RX descriptor ring (per queue) + * @priv: driver private structure ++ * @dma_conf: structure to take the dma data + * @queue: RX queue index + * @flags: gfp flag. + * Description: this function initializes the DMA RX descriptors + * and allocates the socket buffers. It supports the chained and ring + * modes. + */ +-static int __init_dma_rx_desc_rings(struct stmmac_priv *priv, u32 queue, gfp_t flags) ++static int __init_dma_rx_desc_rings(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue, gfp_t flags) + { +- struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; + int ret; + + netif_dbg(priv, probe, priv->dev, + "(%s) dma_rx_phy=0x%08x\n", __func__, + (u32)rx_q->dma_rx_phy); + +- stmmac_clear_rx_descriptors(priv, queue); ++ stmmac_clear_rx_descriptors(priv, dma_conf, queue); + + xdp_rxq_info_unreg_mem_model(&rx_q->xdp_rxq); + +@@ -1709,9 +1740,9 @@ static int __init_dma_rx_desc_rings(stru + /* RX XDP ZC buffer pool may not be populated, e.g. + * xdpsock TX-only. + */ +- stmmac_alloc_rx_buffers_zc(priv, queue); ++ stmmac_alloc_rx_buffers_zc(priv, dma_conf, queue); + } else { +- ret = stmmac_alloc_rx_buffers(priv, queue, flags); ++ ret = stmmac_alloc_rx_buffers(priv, dma_conf, queue, flags); + if (ret < 0) + return -ENOMEM; + } +@@ -1721,17 +1752,19 @@ static int __init_dma_rx_desc_rings(stru + if (priv->extend_desc) + stmmac_mode_init(priv, rx_q->dma_erx, + rx_q->dma_rx_phy, +- priv->dma_conf.dma_rx_size, 1); ++ dma_conf->dma_rx_size, 1); + else + stmmac_mode_init(priv, rx_q->dma_rx, + rx_q->dma_rx_phy, +- priv->dma_conf.dma_rx_size, 0); ++ dma_conf->dma_rx_size, 0); + } + + return 0; + } + +-static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags) ++static int init_dma_rx_desc_rings(struct net_device *dev, ++ struct stmmac_dma_conf *dma_conf, ++ gfp_t flags) + { + struct stmmac_priv *priv = netdev_priv(dev); + u32 rx_count = priv->plat->rx_queues_to_use; +@@ -1743,7 +1776,7 @@ static int init_dma_rx_desc_rings(struct + "SKB addresses:\nskb\t\tskb data\tdma data\n"); + + for (queue = 0; queue < rx_count; queue++) { +- ret = __init_dma_rx_desc_rings(priv, queue, flags); ++ ret = __init_dma_rx_desc_rings(priv, dma_conf, queue, flags); + if (ret) + goto err_init_rx_buffers; + } +@@ -1752,12 +1785,12 @@ static int init_dma_rx_desc_rings(struct + + err_init_rx_buffers: + while (queue >= 0) { +- struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; + + if (rx_q->xsk_pool) +- dma_free_rx_xskbufs(priv, queue); ++ dma_free_rx_xskbufs(priv, dma_conf, queue); + else +- dma_free_rx_skbufs(priv, queue); ++ dma_free_rx_skbufs(priv, dma_conf, queue); + + rx_q->buf_alloc_num = 0; + rx_q->xsk_pool = NULL; +@@ -1774,14 +1807,17 @@ err_init_rx_buffers: + /** + * __init_dma_tx_desc_rings - init the TX descriptor ring (per queue) + * @priv: driver private structure +- * @queue : TX queue index ++ * @dma_conf: structure to take the dma data ++ * @queue: TX queue index + * Description: this function initializes the DMA TX descriptors + * and allocates the socket buffers. It supports the chained and ring + * modes. + */ +-static int __init_dma_tx_desc_rings(struct stmmac_priv *priv, u32 queue) ++static int __init_dma_tx_desc_rings(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &dma_conf->tx_queue[queue]; + int i; + + netif_dbg(priv, probe, priv->dev, +@@ -1793,16 +1829,16 @@ static int __init_dma_tx_desc_rings(stru + if (priv->extend_desc) + stmmac_mode_init(priv, tx_q->dma_etx, + tx_q->dma_tx_phy, +- priv->dma_conf.dma_tx_size, 1); ++ dma_conf->dma_tx_size, 1); + else if (!(tx_q->tbs & STMMAC_TBS_AVAIL)) + stmmac_mode_init(priv, tx_q->dma_tx, + tx_q->dma_tx_phy, +- priv->dma_conf.dma_tx_size, 0); ++ dma_conf->dma_tx_size, 0); + } + + tx_q->xsk_pool = stmmac_get_xsk_pool(priv, queue); + +- for (i = 0; i < priv->dma_conf.dma_tx_size; i++) { ++ for (i = 0; i < dma_conf->dma_tx_size; i++) { + struct dma_desc *p; + + if (priv->extend_desc) +@@ -1824,7 +1860,8 @@ static int __init_dma_tx_desc_rings(stru + return 0; + } + +-static int init_dma_tx_desc_rings(struct net_device *dev) ++static int init_dma_tx_desc_rings(struct net_device *dev, ++ struct stmmac_dma_conf *dma_conf) + { + struct stmmac_priv *priv = netdev_priv(dev); + u32 tx_queue_cnt; +@@ -1833,7 +1870,7 @@ static int init_dma_tx_desc_rings(struct + tx_queue_cnt = priv->plat->tx_queues_to_use; + + for (queue = 0; queue < tx_queue_cnt; queue++) +- __init_dma_tx_desc_rings(priv, queue); ++ __init_dma_tx_desc_rings(priv, dma_conf, queue); + + return 0; + } +@@ -1841,26 +1878,29 @@ static int init_dma_tx_desc_rings(struct + /** + * init_dma_desc_rings - init the RX/TX descriptor rings + * @dev: net device structure ++ * @dma_conf: structure to take the dma data + * @flags: gfp flag. + * Description: this function initializes the DMA RX/TX descriptors + * and allocates the socket buffers. It supports the chained and ring + * modes. + */ +-static int init_dma_desc_rings(struct net_device *dev, gfp_t flags) ++static int init_dma_desc_rings(struct net_device *dev, ++ struct stmmac_dma_conf *dma_conf, ++ gfp_t flags) + { + struct stmmac_priv *priv = netdev_priv(dev); + int ret; + +- ret = init_dma_rx_desc_rings(dev, flags); ++ ret = init_dma_rx_desc_rings(dev, dma_conf, flags); + if (ret) + return ret; + +- ret = init_dma_tx_desc_rings(dev); ++ ret = init_dma_tx_desc_rings(dev, dma_conf); + +- stmmac_clear_descriptors(priv); ++ stmmac_clear_descriptors(priv, dma_conf); + + if (netif_msg_hw(priv)) +- stmmac_display_rings(priv); ++ stmmac_display_rings(priv, dma_conf); + + return ret; + } +@@ -1868,17 +1908,20 @@ static int init_dma_desc_rings(struct ne + /** + * dma_free_tx_skbufs - free TX dma buffers + * @priv: private structure ++ * @dma_conf: structure to take the dma data + * @queue: TX queue index + */ +-static void dma_free_tx_skbufs(struct stmmac_priv *priv, u32 queue) ++static void dma_free_tx_skbufs(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &dma_conf->tx_queue[queue]; + int i; + + tx_q->xsk_frames_done = 0; + +- for (i = 0; i < priv->dma_conf.dma_tx_size; i++) +- stmmac_free_tx_buffer(priv, queue, i); ++ for (i = 0; i < dma_conf->dma_tx_size; i++) ++ stmmac_free_tx_buffer(priv, dma_conf, queue, i); + + if (tx_q->xsk_pool && tx_q->xsk_frames_done) { + xsk_tx_completed(tx_q->xsk_pool, tx_q->xsk_frames_done); +@@ -1897,34 +1940,37 @@ static void stmmac_free_tx_skbufs(struct + u32 queue; + + for (queue = 0; queue < tx_queue_cnt; queue++) +- dma_free_tx_skbufs(priv, queue); ++ dma_free_tx_skbufs(priv, &priv->dma_conf, queue); + } + + /** + * __free_dma_rx_desc_resources - free RX dma desc resources (per queue) + * @priv: private structure ++ * @dma_conf: structure to take the dma data + * @queue: RX queue index + */ +-static void __free_dma_rx_desc_resources(struct stmmac_priv *priv, u32 queue) ++static void __free_dma_rx_desc_resources(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; + + /* Release the DMA RX socket buffers */ + if (rx_q->xsk_pool) +- dma_free_rx_xskbufs(priv, queue); ++ dma_free_rx_xskbufs(priv, dma_conf, queue); + else +- dma_free_rx_skbufs(priv, queue); ++ dma_free_rx_skbufs(priv, dma_conf, queue); + + rx_q->buf_alloc_num = 0; + rx_q->xsk_pool = NULL; + + /* Free DMA regions of consistent memory previously allocated */ + if (!priv->extend_desc) +- dma_free_coherent(priv->device, priv->dma_conf.dma_rx_size * ++ dma_free_coherent(priv->device, dma_conf->dma_rx_size * + sizeof(struct dma_desc), + rx_q->dma_rx, rx_q->dma_rx_phy); + else +- dma_free_coherent(priv->device, priv->dma_conf.dma_rx_size * ++ dma_free_coherent(priv->device, dma_conf->dma_rx_size * + sizeof(struct dma_extended_desc), + rx_q->dma_erx, rx_q->dma_rx_phy); + +@@ -1936,29 +1982,33 @@ static void __free_dma_rx_desc_resources + page_pool_destroy(rx_q->page_pool); + } + +-static void free_dma_rx_desc_resources(struct stmmac_priv *priv) ++static void free_dma_rx_desc_resources(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf) + { + u32 rx_count = priv->plat->rx_queues_to_use; + u32 queue; + + /* Free RX queue resources */ + for (queue = 0; queue < rx_count; queue++) +- __free_dma_rx_desc_resources(priv, queue); ++ __free_dma_rx_desc_resources(priv, dma_conf, queue); + } + + /** + * __free_dma_tx_desc_resources - free TX dma desc resources (per queue) + * @priv: private structure ++ * @dma_conf: structure to take the dma data + * @queue: TX queue index + */ +-static void __free_dma_tx_desc_resources(struct stmmac_priv *priv, u32 queue) ++static void __free_dma_tx_desc_resources(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &dma_conf->tx_queue[queue]; + size_t size; + void *addr; + + /* Release the DMA TX socket buffers */ +- dma_free_tx_skbufs(priv, queue); ++ dma_free_tx_skbufs(priv, dma_conf, queue); + + if (priv->extend_desc) { + size = sizeof(struct dma_extended_desc); +@@ -1971,7 +2021,7 @@ static void __free_dma_tx_desc_resources + addr = tx_q->dma_tx; + } + +- size *= priv->dma_conf.dma_tx_size; ++ size *= dma_conf->dma_tx_size; + + dma_free_coherent(priv->device, size, addr, tx_q->dma_tx_phy); + +@@ -1979,28 +2029,32 @@ static void __free_dma_tx_desc_resources + kfree(tx_q->tx_skbuff); + } + +-static void free_dma_tx_desc_resources(struct stmmac_priv *priv) ++static void free_dma_tx_desc_resources(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf) + { + u32 tx_count = priv->plat->tx_queues_to_use; + u32 queue; + + /* Free TX queue resources */ + for (queue = 0; queue < tx_count; queue++) +- __free_dma_tx_desc_resources(priv, queue); ++ __free_dma_tx_desc_resources(priv, dma_conf, queue); + } + + /** + * __alloc_dma_rx_desc_resources - alloc RX resources (per queue). + * @priv: private structure ++ * @dma_conf: structure to take the dma data + * @queue: RX queue index + * Description: according to which descriptor can be used (extend or basic) + * this function allocates the resources for TX and RX paths. In case of + * reception, for example, it pre-allocated the RX socket buffer in order to + * allow zero-copy mechanism. + */ +-static int __alloc_dma_rx_desc_resources(struct stmmac_priv *priv, u32 queue) ++static int __alloc_dma_rx_desc_resources(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue) + { +- struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; ++ struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; + struct stmmac_channel *ch = &priv->channel[queue]; + bool xdp_prog = stmmac_xdp_is_enabled(priv); + struct page_pool_params pp_params = { 0 }; +@@ -2012,8 +2066,8 @@ static int __alloc_dma_rx_desc_resources + rx_q->priv_data = priv; + + pp_params.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV; +- pp_params.pool_size = priv->dma_conf.dma_rx_size; +- num_pages = DIV_ROUND_UP(priv->dma_conf.dma_buf_sz, PAGE_SIZE); ++ pp_params.pool_size = dma_conf->dma_rx_size; ++ num_pages = DIV_ROUND_UP(dma_conf->dma_buf_sz, PAGE_SIZE); + pp_params.order = ilog2(num_pages); + pp_params.nid = dev_to_node(priv->device); + pp_params.dev = priv->device; +@@ -2028,7 +2082,7 @@ static int __alloc_dma_rx_desc_resources + return ret; + } + +- rx_q->buf_pool = kcalloc(priv->dma_conf.dma_rx_size, ++ rx_q->buf_pool = kcalloc(dma_conf->dma_rx_size, + sizeof(*rx_q->buf_pool), + GFP_KERNEL); + if (!rx_q->buf_pool) +@@ -2036,7 +2090,7 @@ static int __alloc_dma_rx_desc_resources + + if (priv->extend_desc) { + rx_q->dma_erx = dma_alloc_coherent(priv->device, +- priv->dma_conf.dma_rx_size * ++ dma_conf->dma_rx_size * + sizeof(struct dma_extended_desc), + &rx_q->dma_rx_phy, + GFP_KERNEL); +@@ -2045,7 +2099,7 @@ static int __alloc_dma_rx_desc_resources + + } else { + rx_q->dma_rx = dma_alloc_coherent(priv->device, +- priv->dma_conf.dma_rx_size * ++ dma_conf->dma_rx_size * + sizeof(struct dma_desc), + &rx_q->dma_rx_phy, + GFP_KERNEL); +@@ -2070,7 +2124,8 @@ static int __alloc_dma_rx_desc_resources + return 0; + } + +-static int alloc_dma_rx_desc_resources(struct stmmac_priv *priv) ++static int alloc_dma_rx_desc_resources(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf) + { + u32 rx_count = priv->plat->rx_queues_to_use; + u32 queue; +@@ -2078,7 +2133,7 @@ static int alloc_dma_rx_desc_resources(s + + /* RX queues buffers and DMA */ + for (queue = 0; queue < rx_count; queue++) { +- ret = __alloc_dma_rx_desc_resources(priv, queue); ++ ret = __alloc_dma_rx_desc_resources(priv, dma_conf, queue); + if (ret) + goto err_dma; + } +@@ -2086,7 +2141,7 @@ static int alloc_dma_rx_desc_resources(s + return 0; + + err_dma: +- free_dma_rx_desc_resources(priv); ++ free_dma_rx_desc_resources(priv, dma_conf); + + return ret; + } +@@ -2094,28 +2149,31 @@ err_dma: + /** + * __alloc_dma_tx_desc_resources - alloc TX resources (per queue). + * @priv: private structure ++ * @dma_conf: structure to take the dma data + * @queue: TX queue index + * Description: according to which descriptor can be used (extend or basic) + * this function allocates the resources for TX and RX paths. In case of + * reception, for example, it pre-allocated the RX socket buffer in order to + * allow zero-copy mechanism. + */ +-static int __alloc_dma_tx_desc_resources(struct stmmac_priv *priv, u32 queue) ++static int __alloc_dma_tx_desc_resources(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf, ++ u32 queue) + { +- struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; ++ struct stmmac_tx_queue *tx_q = &dma_conf->tx_queue[queue]; + size_t size; + void *addr; + + tx_q->queue_index = queue; + tx_q->priv_data = priv; + +- tx_q->tx_skbuff_dma = kcalloc(priv->dma_conf.dma_tx_size, ++ tx_q->tx_skbuff_dma = kcalloc(dma_conf->dma_tx_size, + sizeof(*tx_q->tx_skbuff_dma), + GFP_KERNEL); + if (!tx_q->tx_skbuff_dma) + return -ENOMEM; + +- tx_q->tx_skbuff = kcalloc(priv->dma_conf.dma_tx_size, ++ tx_q->tx_skbuff = kcalloc(dma_conf->dma_tx_size, + sizeof(struct sk_buff *), + GFP_KERNEL); + if (!tx_q->tx_skbuff) +@@ -2128,7 +2186,7 @@ static int __alloc_dma_tx_desc_resources + else + size = sizeof(struct dma_desc); + +- size *= priv->dma_conf.dma_tx_size; ++ size *= dma_conf->dma_tx_size; + + addr = dma_alloc_coherent(priv->device, size, + &tx_q->dma_tx_phy, GFP_KERNEL); +@@ -2145,7 +2203,8 @@ static int __alloc_dma_tx_desc_resources + return 0; + } + +-static int alloc_dma_tx_desc_resources(struct stmmac_priv *priv) ++static int alloc_dma_tx_desc_resources(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf) + { + u32 tx_count = priv->plat->tx_queues_to_use; + u32 queue; +@@ -2153,7 +2212,7 @@ static int alloc_dma_tx_desc_resources(s + + /* TX queues buffers and DMA */ + for (queue = 0; queue < tx_count; queue++) { +- ret = __alloc_dma_tx_desc_resources(priv, queue); ++ ret = __alloc_dma_tx_desc_resources(priv, dma_conf, queue); + if (ret) + goto err_dma; + } +@@ -2161,27 +2220,29 @@ static int alloc_dma_tx_desc_resources(s + return 0; + + err_dma: +- free_dma_tx_desc_resources(priv); ++ free_dma_tx_desc_resources(priv, dma_conf); + return ret; + } + + /** + * alloc_dma_desc_resources - alloc TX/RX resources. + * @priv: private structure ++ * @dma_conf: structure to take the dma data + * Description: according to which descriptor can be used (extend or basic) + * this function allocates the resources for TX and RX paths. In case of + * reception, for example, it pre-allocated the RX socket buffer in order to + * allow zero-copy mechanism. + */ +-static int alloc_dma_desc_resources(struct stmmac_priv *priv) ++static int alloc_dma_desc_resources(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf) + { + /* RX Allocation */ +- int ret = alloc_dma_rx_desc_resources(priv); ++ int ret = alloc_dma_rx_desc_resources(priv, dma_conf); + + if (ret) + return ret; + +- ret = alloc_dma_tx_desc_resources(priv); ++ ret = alloc_dma_tx_desc_resources(priv, dma_conf); + + return ret; + } +@@ -2189,16 +2250,18 @@ static int alloc_dma_desc_resources(stru + /** + * free_dma_desc_resources - free dma desc resources + * @priv: private structure ++ * @dma_conf: structure to take the dma data + */ +-static void free_dma_desc_resources(struct stmmac_priv *priv) ++static void free_dma_desc_resources(struct stmmac_priv *priv, ++ struct stmmac_dma_conf *dma_conf) + { + /* Release the DMA TX socket buffers */ +- free_dma_tx_desc_resources(priv); ++ free_dma_tx_desc_resources(priv, dma_conf); + + /* Release the DMA RX socket buffers later + * to ensure all pending XDP_TX buffers are returned. + */ +- free_dma_rx_desc_resources(priv); ++ free_dma_rx_desc_resources(priv, dma_conf); + } + + /** +@@ -2687,8 +2750,8 @@ static void stmmac_tx_err(struct stmmac_ + netif_tx_stop_queue(netdev_get_tx_queue(priv->dev, chan)); + + stmmac_stop_tx_dma(priv, chan); +- dma_free_tx_skbufs(priv, chan); +- stmmac_clear_tx_descriptors(priv, chan); ++ dma_free_tx_skbufs(priv, &priv->dma_conf, chan); ++ stmmac_clear_tx_descriptors(priv, &priv->dma_conf, chan); + stmmac_reset_tx_queue(priv, chan); + stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, + tx_q->dma_tx_phy, chan); +@@ -3685,19 +3748,93 @@ static int stmmac_request_irq(struct net + } + + /** +- * stmmac_open - open entry point of the driver ++ * stmmac_setup_dma_desc - Generate a dma_conf and allocate DMA queue ++ * @priv: driver private structure ++ * @mtu: MTU to setup the dma queue and buf with ++ * Description: Allocate and generate a dma_conf based on the provided MTU. ++ * Allocate the Tx/Rx DMA queue and init them. ++ * Return value: ++ * the dma_conf allocated struct on success and an appropriate ERR_PTR on failure. ++ */ ++static struct stmmac_dma_conf * ++stmmac_setup_dma_desc(struct stmmac_priv *priv, unsigned int mtu) ++{ ++ struct stmmac_dma_conf *dma_conf; ++ int chan, bfsize, ret; ++ ++ dma_conf = kzalloc(sizeof(*dma_conf), GFP_KERNEL); ++ if (!dma_conf) { ++ netdev_err(priv->dev, "%s: DMA conf allocation failed\n", ++ __func__); ++ return ERR_PTR(-ENOMEM); ++ } ++ ++ bfsize = stmmac_set_16kib_bfsize(priv, mtu); ++ if (bfsize < 0) ++ bfsize = 0; ++ ++ if (bfsize < BUF_SIZE_16KiB) ++ bfsize = stmmac_set_bfsize(mtu, 0); ++ ++ dma_conf->dma_buf_sz = bfsize; ++ /* Chose the tx/rx size from the already defined one in the ++ * priv struct. (if defined) ++ */ ++ dma_conf->dma_tx_size = priv->dma_conf.dma_tx_size; ++ dma_conf->dma_rx_size = priv->dma_conf.dma_rx_size; ++ ++ if (!dma_conf->dma_tx_size) ++ dma_conf->dma_tx_size = DMA_DEFAULT_TX_SIZE; ++ if (!dma_conf->dma_rx_size) ++ dma_conf->dma_rx_size = DMA_DEFAULT_RX_SIZE; ++ ++ /* Earlier check for TBS */ ++ for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) { ++ struct stmmac_tx_queue *tx_q = &dma_conf->tx_queue[chan]; ++ int tbs_en = priv->plat->tx_queues_cfg[chan].tbs_en; ++ ++ /* Setup per-TXQ tbs flag before TX descriptor alloc */ ++ tx_q->tbs |= tbs_en ? STMMAC_TBS_AVAIL : 0; ++ } ++ ++ ret = alloc_dma_desc_resources(priv, dma_conf); ++ if (ret < 0) { ++ netdev_err(priv->dev, "%s: DMA descriptors allocation failed\n", ++ __func__); ++ goto alloc_error; ++ } ++ ++ ret = init_dma_desc_rings(priv->dev, dma_conf, GFP_KERNEL); ++ if (ret < 0) { ++ netdev_err(priv->dev, "%s: DMA descriptors initialization failed\n", ++ __func__); ++ goto init_error; ++ } ++ ++ return dma_conf; ++ ++init_error: ++ free_dma_desc_resources(priv, dma_conf); ++alloc_error: ++ kfree(dma_conf); ++ return ERR_PTR(ret); ++} ++ ++/** ++ * __stmmac_open - open entry point of the driver + * @dev : pointer to the device structure. ++ * @dma_conf : structure to take the dma data + * Description: + * This function is the open entry point of the driver. + * Return value: + * 0 on success and an appropriate (-)ve integer as defined in errno.h + * file on failure. + */ +-static int stmmac_open(struct net_device *dev) ++static int __stmmac_open(struct net_device *dev, ++ struct stmmac_dma_conf *dma_conf) + { + struct stmmac_priv *priv = netdev_priv(dev); + int mode = priv->plat->phy_interface; +- int bfsize = 0; + u32 chan; + int ret; + +@@ -3724,45 +3861,10 @@ static int stmmac_open(struct net_device + memset(&priv->xstats, 0, sizeof(struct stmmac_extra_stats)); + priv->xstats.threshold = tc; + +- bfsize = stmmac_set_16kib_bfsize(priv, dev->mtu); +- if (bfsize < 0) +- bfsize = 0; +- +- if (bfsize < BUF_SIZE_16KiB) +- bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_conf.dma_buf_sz); +- +- priv->dma_conf.dma_buf_sz = bfsize; +- buf_sz = bfsize; +- + priv->rx_copybreak = STMMAC_RX_COPYBREAK; + +- if (!priv->dma_conf.dma_tx_size) +- priv->dma_conf.dma_tx_size = DMA_DEFAULT_TX_SIZE; +- if (!priv->dma_conf.dma_rx_size) +- priv->dma_conf.dma_rx_size = DMA_DEFAULT_RX_SIZE; +- +- /* Earlier check for TBS */ +- for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) { +- struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[chan]; +- int tbs_en = priv->plat->tx_queues_cfg[chan].tbs_en; +- +- /* Setup per-TXQ tbs flag before TX descriptor alloc */ +- tx_q->tbs |= tbs_en ? STMMAC_TBS_AVAIL : 0; +- } +- +- ret = alloc_dma_desc_resources(priv); +- if (ret < 0) { +- netdev_err(priv->dev, "%s: DMA descriptors allocation failed\n", +- __func__); +- goto dma_desc_error; +- } +- +- ret = init_dma_desc_rings(dev, GFP_KERNEL); +- if (ret < 0) { +- netdev_err(priv->dev, "%s: DMA descriptors initialization failed\n", +- __func__); +- goto init_error; +- } ++ buf_sz = dma_conf->dma_buf_sz; ++ memcpy(&priv->dma_conf, dma_conf, sizeof(*dma_conf)); + + if (priv->plat->serdes_powerup) { + ret = priv->plat->serdes_powerup(dev, priv->plat->bsp_priv); +@@ -3805,14 +3907,28 @@ irq_error: + + stmmac_hw_teardown(dev); + init_error: +- free_dma_desc_resources(priv); +-dma_desc_error: ++ free_dma_desc_resources(priv, &priv->dma_conf); + phylink_disconnect_phy(priv->phylink); + init_phy_error: + pm_runtime_put(priv->device); + return ret; + } + ++static int stmmac_open(struct net_device *dev) ++{ ++ struct stmmac_priv *priv = netdev_priv(dev); ++ struct stmmac_dma_conf *dma_conf; ++ int ret; ++ ++ dma_conf = stmmac_setup_dma_desc(priv, dev->mtu); ++ if (IS_ERR(dma_conf)) ++ return PTR_ERR(dma_conf); ++ ++ ret = __stmmac_open(dev, dma_conf); ++ kfree(dma_conf); ++ return ret; ++} ++ + static void stmmac_fpe_stop_wq(struct stmmac_priv *priv) + { + set_bit(__FPE_REMOVING, &priv->fpe_task_state); +@@ -3859,7 +3975,7 @@ static int stmmac_release(struct net_dev + stmmac_stop_all_dma(priv); + + /* Release and free the Rx/Tx resources */ +- free_dma_desc_resources(priv); ++ free_dma_desc_resources(priv, &priv->dma_conf); + + /* Disable the MAC Rx/Tx */ + stmmac_mac_set(priv, priv->ioaddr, false); +@@ -6402,7 +6518,7 @@ void stmmac_disable_rx_queue(struct stmm + spin_unlock_irqrestore(&ch->lock, flags); + + stmmac_stop_rx_dma(priv, queue); +- __free_dma_rx_desc_resources(priv, queue); ++ __free_dma_rx_desc_resources(priv, &priv->dma_conf, queue); + } + + void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue) +@@ -6413,21 +6529,21 @@ void stmmac_enable_rx_queue(struct stmma + u32 buf_size; + int ret; + +- ret = __alloc_dma_rx_desc_resources(priv, queue); ++ ret = __alloc_dma_rx_desc_resources(priv, &priv->dma_conf, queue); + if (ret) { + netdev_err(priv->dev, "Failed to alloc RX desc.\n"); + return; + } + +- ret = __init_dma_rx_desc_rings(priv, queue, GFP_KERNEL); ++ ret = __init_dma_rx_desc_rings(priv, &priv->dma_conf, queue, GFP_KERNEL); + if (ret) { +- __free_dma_rx_desc_resources(priv, queue); ++ __free_dma_rx_desc_resources(priv, &priv->dma_conf, queue); + netdev_err(priv->dev, "Failed to init RX desc.\n"); + return; + } + + stmmac_reset_rx_queue(priv, queue); +- stmmac_clear_rx_descriptors(priv, queue); ++ stmmac_clear_rx_descriptors(priv, &priv->dma_conf, queue); + + stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, + rx_q->dma_rx_phy, rx_q->queue_index); +@@ -6465,7 +6581,7 @@ void stmmac_disable_tx_queue(struct stmm + spin_unlock_irqrestore(&ch->lock, flags); + + stmmac_stop_tx_dma(priv, queue); +- __free_dma_tx_desc_resources(priv, queue); ++ __free_dma_tx_desc_resources(priv, &priv->dma_conf, queue); + } + + void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue) +@@ -6475,21 +6591,21 @@ void stmmac_enable_tx_queue(struct stmma + unsigned long flags; + int ret; + +- ret = __alloc_dma_tx_desc_resources(priv, queue); ++ ret = __alloc_dma_tx_desc_resources(priv, &priv->dma_conf, queue); + if (ret) { + netdev_err(priv->dev, "Failed to alloc TX desc.\n"); + return; + } + +- ret = __init_dma_tx_desc_rings(priv, queue); ++ ret = __init_dma_tx_desc_rings(priv, &priv->dma_conf, queue); + if (ret) { +- __free_dma_tx_desc_resources(priv, queue); ++ __free_dma_tx_desc_resources(priv, &priv->dma_conf, queue); + netdev_err(priv->dev, "Failed to init TX desc.\n"); + return; + } + + stmmac_reset_tx_queue(priv, queue); +- stmmac_clear_tx_descriptors(priv, queue); ++ stmmac_clear_tx_descriptors(priv, &priv->dma_conf, queue); + + stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, + tx_q->dma_tx_phy, tx_q->queue_index); +@@ -6529,7 +6645,7 @@ void stmmac_xdp_release(struct net_devic + stmmac_stop_all_dma(priv); + + /* Release and free the Rx/Tx resources */ +- free_dma_desc_resources(priv); ++ free_dma_desc_resources(priv, &priv->dma_conf); + + /* Disable the MAC Rx/Tx */ + stmmac_mac_set(priv, priv->ioaddr, false); +@@ -6554,14 +6670,14 @@ int stmmac_xdp_open(struct net_device *d + u32 chan; + int ret; + +- ret = alloc_dma_desc_resources(priv); ++ ret = alloc_dma_desc_resources(priv, &priv->dma_conf); + if (ret < 0) { + netdev_err(dev, "%s: DMA descriptors allocation failed\n", + __func__); + goto dma_desc_error; + } + +- ret = init_dma_desc_rings(dev, GFP_KERNEL); ++ ret = init_dma_desc_rings(dev, &priv->dma_conf, GFP_KERNEL); + if (ret < 0) { + netdev_err(dev, "%s: DMA descriptors initialization failed\n", + __func__); +@@ -6643,7 +6759,7 @@ irq_error: + + stmmac_hw_teardown(dev); + init_error: +- free_dma_desc_resources(priv); ++ free_dma_desc_resources(priv, &priv->dma_conf); + dma_desc_error: + return ret; + } +@@ -7506,7 +7622,7 @@ int stmmac_resume(struct device *dev) + stmmac_reset_queues_param(priv); + + stmmac_free_tx_skbufs(priv); +- stmmac_clear_descriptors(priv); ++ stmmac_clear_descriptors(priv, &priv->dma_conf); + + stmmac_hw_setup(ndev, false); + stmmac_init_coalesce(priv); diff --git a/target/linux/generic/backport-5.15/775-v6.0-05-net-ethernet-stmicro-stmmac-permit-MTU-change-with-i.patch b/target/linux/generic/backport-5.15/775-v6.0-05-net-ethernet-stmicro-stmmac-permit-MTU-change-with-i.patch new file mode 100644 index 0000000000..6ebb527726 --- /dev/null +++ b/target/linux/generic/backport-5.15/775-v6.0-05-net-ethernet-stmicro-stmmac-permit-MTU-change-with-i.patch @@ -0,0 +1,73 @@ +From 3470079687448abac42deb62774253be1d6bdef3 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Sat, 23 Jul 2022 16:29:33 +0200 +Subject: [PATCH 5/5] net: ethernet: stmicro: stmmac: permit MTU change with + interface up + +Remove the limitation where the interface needs to be down to change +MTU by releasing and opening the stmmac driver to set the new MTU. +Also call the set_filter function to correctly init the port. +This permits to remove the EBUSY error while the ethernet port is +running permitting a correct MTU change if for example a DSA request +a MTU change for a switch CPU port. + +Signed-off-by: Christian Marangi +Signed-off-by: Jakub Kicinski +--- + .../net/ethernet/stmicro/stmmac/stmmac_main.c | 30 +++++++++++++++---- + 1 file changed, 24 insertions(+), 6 deletions(-) + +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -5624,18 +5624,15 @@ static int stmmac_change_mtu(struct net_ + { + struct stmmac_priv *priv = netdev_priv(dev); + int txfifosz = priv->plat->tx_fifo_size; ++ struct stmmac_dma_conf *dma_conf; + const int mtu = new_mtu; ++ int ret; + + if (txfifosz == 0) + txfifosz = priv->dma_cap.tx_fifo_size; + + txfifosz /= priv->plat->tx_queues_to_use; + +- if (netif_running(dev)) { +- netdev_err(priv->dev, "must be stopped to change its MTU\n"); +- return -EBUSY; +- } +- + if (stmmac_xdp_is_enabled(priv) && new_mtu > ETH_DATA_LEN) { + netdev_dbg(priv->dev, "Jumbo frames not supported for XDP\n"); + return -EINVAL; +@@ -5647,8 +5644,29 @@ static int stmmac_change_mtu(struct net_ + if ((txfifosz < new_mtu) || (new_mtu > BUF_SIZE_16KiB)) + return -EINVAL; + +- dev->mtu = mtu; ++ if (netif_running(dev)) { ++ netdev_dbg(priv->dev, "restarting interface to change its MTU\n"); ++ /* Try to allocate the new DMA conf with the new mtu */ ++ dma_conf = stmmac_setup_dma_desc(priv, mtu); ++ if (IS_ERR(dma_conf)) { ++ netdev_err(priv->dev, "failed allocating new dma conf for new MTU %d\n", ++ mtu); ++ return PTR_ERR(dma_conf); ++ } ++ ++ stmmac_release(dev); ++ ++ ret = __stmmac_open(dev, dma_conf); ++ kfree(dma_conf); ++ if (ret) { ++ netdev_err(priv->dev, "failed reopening the interface after MTU change\n"); ++ return ret; ++ } ++ ++ stmmac_set_rx_mode(dev); ++ } + ++ dev->mtu = mtu; + netdev_update_features(dev); + + return 0; diff --git a/target/linux/generic/backport-5.15/776-v6.1-01-net-dsa-qca8k-fix-inband-mgmt-for-big-endian-systems.patch b/target/linux/generic/backport-5.15/776-v6.1-01-net-dsa-qca8k-fix-inband-mgmt-for-big-endian-systems.patch new file mode 100644 index 0000000000..4f0d95f456 --- /dev/null +++ b/target/linux/generic/backport-5.15/776-v6.1-01-net-dsa-qca8k-fix-inband-mgmt-for-big-endian-systems.patch @@ -0,0 +1,156 @@ +From a2550d3ce53c68f54042bc5e468c4d07491ffe0e Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 12 Oct 2022 19:18:36 +0200 +Subject: [PATCH 1/2] net: dsa: qca8k: fix inband mgmt for big-endian systems + +The header and the data of the skb for the inband mgmt requires +to be in little-endian. This is problematic for big-endian system +as the mgmt header is written in the cpu byte order. + +Fix this by converting each value for the mgmt header and data to +little-endian, and convert to cpu byte order the mgmt header and +data sent by the switch. + +Fixes: 5950c7c0a68c ("net: dsa: qca8k: add support for mgmt read/write in Ethernet packet") +Tested-by: Pawel Dembicki +Tested-by: Lech Perczak +Signed-off-by: Christian Marangi +Reviewed-by: Lech Perczak +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 63 ++++++++++++++++++++++++-------- + include/linux/dsa/tag_qca.h | 6 +-- + 2 files changed, 50 insertions(+), 19 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -137,27 +137,42 @@ static void qca8k_rw_reg_ack_handler(str + struct qca8k_mgmt_eth_data *mgmt_eth_data; + struct qca8k_priv *priv = ds->priv; + struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ u32 command; + u8 len, cmd; ++ int i; + + mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb_mac_header(skb); + mgmt_eth_data = &priv->mgmt_eth_data; + +- cmd = FIELD_GET(QCA_HDR_MGMT_CMD, mgmt_ethhdr->command); +- len = FIELD_GET(QCA_HDR_MGMT_LENGTH, mgmt_ethhdr->command); ++ command = get_unaligned_le32(&mgmt_ethhdr->command); ++ cmd = FIELD_GET(QCA_HDR_MGMT_CMD, command); ++ len = FIELD_GET(QCA_HDR_MGMT_LENGTH, command); + + /* Make sure the seq match the requested packet */ +- if (mgmt_ethhdr->seq == mgmt_eth_data->seq) ++ if (get_unaligned_le32(&mgmt_ethhdr->seq) == mgmt_eth_data->seq) + mgmt_eth_data->ack = true; + + if (cmd == MDIO_READ) { +- mgmt_eth_data->data[0] = mgmt_ethhdr->mdio_data; ++ u32 *val = mgmt_eth_data->data; ++ ++ *val = get_unaligned_le32(&mgmt_ethhdr->mdio_data); + + /* Get the rest of the 12 byte of data. + * The read/write function will extract the requested data. + */ +- if (len > QCA_HDR_MGMT_DATA1_LEN) +- memcpy(mgmt_eth_data->data + 1, skb->data, +- QCA_HDR_MGMT_DATA2_LEN); ++ if (len > QCA_HDR_MGMT_DATA1_LEN) { ++ __le32 *data2 = (__le32 *)skb->data; ++ int data_len = min_t(int, QCA_HDR_MGMT_DATA2_LEN, ++ len - QCA_HDR_MGMT_DATA1_LEN); ++ ++ val++; ++ ++ for (i = sizeof(u32); i <= data_len; i += sizeof(u32)) { ++ *val = get_unaligned_le32(data2); ++ val++; ++ data2++; ++ } ++ } + } + + complete(&mgmt_eth_data->rw_done); +@@ -169,8 +184,10 @@ static struct sk_buff *qca8k_alloc_mdio_ + struct qca_mgmt_ethhdr *mgmt_ethhdr; + unsigned int real_len; + struct sk_buff *skb; +- u32 *data2; ++ __le32 *data2; ++ u32 command; + u16 hdr; ++ int i; + + skb = dev_alloc_skb(QCA_HDR_MGMT_PKT_LEN); + if (!skb) +@@ -199,20 +216,32 @@ static struct sk_buff *qca8k_alloc_mdio_ + hdr |= FIELD_PREP(QCA_HDR_XMIT_DP_BIT, BIT(0)); + hdr |= FIELD_PREP(QCA_HDR_XMIT_CONTROL, QCA_HDR_XMIT_TYPE_RW_REG); + +- mgmt_ethhdr->command = FIELD_PREP(QCA_HDR_MGMT_ADDR, reg); +- mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_LENGTH, real_len); +- mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CMD, cmd); +- mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CHECK_CODE, ++ command = FIELD_PREP(QCA_HDR_MGMT_ADDR, reg); ++ command |= FIELD_PREP(QCA_HDR_MGMT_LENGTH, real_len); ++ command |= FIELD_PREP(QCA_HDR_MGMT_CMD, cmd); ++ command |= FIELD_PREP(QCA_HDR_MGMT_CHECK_CODE, + QCA_HDR_MGMT_CHECK_CODE_VAL); + ++ put_unaligned_le32(command, &mgmt_ethhdr->command); ++ + if (cmd == MDIO_WRITE) +- mgmt_ethhdr->mdio_data = *val; ++ put_unaligned_le32(*val, &mgmt_ethhdr->mdio_data); + + mgmt_ethhdr->hdr = htons(hdr); + + data2 = skb_put_zero(skb, QCA_HDR_MGMT_DATA2_LEN + QCA_HDR_MGMT_PADDING_LEN); +- if (cmd == MDIO_WRITE && len > QCA_HDR_MGMT_DATA1_LEN) +- memcpy(data2, val + 1, len - QCA_HDR_MGMT_DATA1_LEN); ++ if (cmd == MDIO_WRITE && len > QCA_HDR_MGMT_DATA1_LEN) { ++ int data_len = min_t(int, QCA_HDR_MGMT_DATA2_LEN, ++ len - QCA_HDR_MGMT_DATA1_LEN); ++ ++ val++; ++ ++ for (i = sizeof(u32); i <= data_len; i += sizeof(u32)) { ++ put_unaligned_le32(*val, data2); ++ data2++; ++ val++; ++ } ++ } + + return skb; + } +@@ -220,9 +249,11 @@ static struct sk_buff *qca8k_alloc_mdio_ + static void qca8k_mdio_header_fill_seq_num(struct sk_buff *skb, u32 seq_num) + { + struct qca_mgmt_ethhdr *mgmt_ethhdr; ++ u32 seq; + ++ seq = FIELD_PREP(QCA_HDR_MGMT_SEQ_NUM, seq_num); + mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb->data; +- mgmt_ethhdr->seq = FIELD_PREP(QCA_HDR_MGMT_SEQ_NUM, seq_num); ++ put_unaligned_le32(seq, &mgmt_ethhdr->seq); + } + + static int qca8k_read_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) +--- a/include/linux/dsa/tag_qca.h ++++ b/include/linux/dsa/tag_qca.h +@@ -56,9 +56,9 @@ + + /* Special struct emulating a Ethernet header */ + struct qca_mgmt_ethhdr { +- u32 command; /* command bit 31:0 */ +- u32 seq; /* seq 63:32 */ +- u32 mdio_data; /* first 4byte mdio */ ++ __le32 command; /* command bit 31:0 */ ++ __le32 seq; /* seq 63:32 */ ++ __le32 mdio_data; /* first 4byte mdio */ + __be16 hdr; /* qca hdr */ + } __packed; + diff --git a/target/linux/generic/backport-5.15/776-v6.1-02-net-dsa-qca8k-fix-ethtool-autocast-mib-for-big-endia.patch b/target/linux/generic/backport-5.15/776-v6.1-02-net-dsa-qca8k-fix-ethtool-autocast-mib-for-big-endia.patch new file mode 100644 index 0000000000..d13014bf93 --- /dev/null +++ b/target/linux/generic/backport-5.15/776-v6.1-02-net-dsa-qca8k-fix-ethtool-autocast-mib-for-big-endia.patch @@ -0,0 +1,81 @@ +From 0d4636f7d72df3179b20a2d32b647881917a5e2a Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 12 Oct 2022 19:18:37 +0200 +Subject: [PATCH 2/2] net: dsa: qca8k: fix ethtool autocast mib for big-endian + systems + +The switch sends autocast mib in little-endian. This is problematic for +big-endian system as the values needs to be converted. + +Fix this by converting each mib value to cpu byte order. + +Fixes: 5c957c7ca78c ("net: dsa: qca8k: add support for mib autocast in Ethernet packet") +Tested-by: Pawel Dembicki +Tested-by: Lech Perczak +Signed-off-by: Christian Marangi +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 20 ++++++++------------ + include/linux/dsa/tag_qca.h | 2 +- + 2 files changed, 9 insertions(+), 13 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -1668,9 +1668,9 @@ static void qca8k_mib_autocast_handler(s + struct qca8k_priv *priv = ds->priv; + const struct qca8k_mib_desc *mib; + struct mib_ethhdr *mib_ethhdr; +- int i, mib_len, offset = 0; +- u64 *data; ++ __le32 *data2; + u8 port; ++ int i; + + mib_ethhdr = (struct mib_ethhdr *)skb_mac_header(skb); + mib_eth_data = &priv->mib_eth_data; +@@ -1682,28 +1682,24 @@ static void qca8k_mib_autocast_handler(s + if (port != mib_eth_data->req_port) + goto exit; + +- data = mib_eth_data->data; ++ data2 = (__le32 *)skb->data; + + for (i = 0; i < priv->info->mib_count; i++) { + mib = &ar8327_mib[i]; + + /* First 3 mib are present in the skb head */ + if (i < 3) { +- data[i] = mib_ethhdr->data[i]; ++ mib_eth_data->data[i] = get_unaligned_le32(mib_ethhdr->data + i); + continue; + } + +- mib_len = sizeof(uint32_t); +- + /* Some mib are 64 bit wide */ + if (mib->size == 2) +- mib_len = sizeof(uint64_t); +- +- /* Copy the mib value from packet to the */ +- memcpy(data + i, skb->data + offset, mib_len); ++ mib_eth_data->data[i] = get_unaligned_le64((__le64 *)data2); ++ else ++ mib_eth_data->data[i] = get_unaligned_le32(data2); + +- /* Set the offset for the next mib */ +- offset += mib_len; ++ data2 += mib->size; + } + + exit: +--- a/include/linux/dsa/tag_qca.h ++++ b/include/linux/dsa/tag_qca.h +@@ -68,7 +68,7 @@ enum mdio_cmd { + }; + + struct mib_ethhdr { +- u32 data[3]; /* first 3 mib counter */ ++ __le32 data[3]; /* first 3 mib counter */ + __be16 hdr; /* qca hdr */ + } __packed; + diff --git a/target/linux/generic/backport-5.15/777-v6.2-01-net-dsa-qca8k-fix-wrong-length-value-for-mgmt-eth-pa.patch b/target/linux/generic/backport-5.15/777-v6.2-01-net-dsa-qca8k-fix-wrong-length-value-for-mgmt-eth-pa.patch new file mode 100644 index 0000000000..b61e7ede49 --- /dev/null +++ b/target/linux/generic/backport-5.15/777-v6.2-01-net-dsa-qca8k-fix-wrong-length-value-for-mgmt-eth-pa.patch @@ -0,0 +1,102 @@ +From 9807ae69746196ee4bbffe7d22d22ab2b61c6ed0 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Thu, 29 Dec 2022 17:33:32 +0100 +Subject: [PATCH 1/5] net: dsa: qca8k: fix wrong length value for mgmt eth + packet + +The assumption that Documentation was right about how this value work was +wrong. It was discovered that the length value of the mgmt header is in +step of word size. + +As an example to process 4 byte of data the correct length to set is 2. +To process 8 byte 4, 12 byte 6, 16 byte 8... + +Odd values will always return the next size on the ack packet. +(length of 3 (6 byte) will always return 8 bytes of data) + +This means that a value of 15 (0xf) actually means reading/writing 32 bytes +of data instead of 16 bytes. This behaviour is totally absent and not +documented in the switch Documentation. + +In fact from Documentation the max value that mgmt eth can process is +16 byte of data while in reality it can process 32 bytes at once. + +To handle this we always round up the length after deviding it for word +size. We check if the result is odd and we round another time to align +to what the switch will provide in the ack packet. +The workaround for the length limit of 15 is still needed as the length +reg max value is 0xf(15) + +Reported-by: Ronald Wahl +Tested-by: Ronald Wahl +Fixes: 90386223f44e ("net: dsa: qca8k: add support for larger read/write size with mgmt Ethernet") +Signed-off-by: Christian Marangi +Cc: stable@vger.kernel.org # v5.18+ +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 45 +++++++++++++++++++++++++------- + 1 file changed, 35 insertions(+), 10 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -146,7 +146,16 @@ static void qca8k_rw_reg_ack_handler(str + + command = get_unaligned_le32(&mgmt_ethhdr->command); + cmd = FIELD_GET(QCA_HDR_MGMT_CMD, command); ++ + len = FIELD_GET(QCA_HDR_MGMT_LENGTH, command); ++ /* Special case for len of 15 as this is the max value for len and needs to ++ * be increased before converting it from word to dword. ++ */ ++ if (len == 15) ++ len++; ++ ++ /* We can ignore odd value, we always round up them in the alloc function. */ ++ len *= sizeof(u16); + + /* Make sure the seq match the requested packet */ + if (get_unaligned_le32(&mgmt_ethhdr->seq) == mgmt_eth_data->seq) +@@ -193,17 +202,33 @@ static struct sk_buff *qca8k_alloc_mdio_ + if (!skb) + return NULL; + +- /* Max value for len reg is 15 (0xf) but the switch actually return 16 byte +- * Actually for some reason the steps are: +- * 0: nothing +- * 1-4: first 4 byte +- * 5-6: first 12 byte +- * 7-15: all 16 byte ++ /* Hdr mgmt length value is in step of word size. ++ * As an example to process 4 byte of data the correct length to set is 2. ++ * To process 8 byte 4, 12 byte 6, 16 byte 8... ++ * ++ * Odd values will always return the next size on the ack packet. ++ * (length of 3 (6 byte) will always return 8 bytes of data) ++ * ++ * This means that a value of 15 (0xf) actually means reading/writing 32 bytes ++ * of data. ++ * ++ * To correctly calculate the length we devide the requested len by word and ++ * round up. ++ * On the ack function we can skip the odd check as we already handle the ++ * case here. + */ +- if (len == 16) +- real_len = 15; +- else +- real_len = len; ++ real_len = DIV_ROUND_UP(len, sizeof(u16)); ++ ++ /* We check if the result len is odd and we round up another time to ++ * the next size. (length of 3 will be increased to 4 as switch will always ++ * return 8 bytes) ++ */ ++ if (real_len % sizeof(u16) != 0) ++ real_len++; ++ ++ /* Max reg value is 0xf(15) but switch will always return the next size (32 byte) */ ++ if (real_len == 16) ++ real_len--; + + skb_reset_mac_header(skb); + skb_set_network_header(skb, skb->len); diff --git a/target/linux/generic/backport-5.15/777-v6.2-02-net-dsa-tag_qca-fix-wrong-MGMT_DATA2-size.patch b/target/linux/generic/backport-5.15/777-v6.2-02-net-dsa-tag_qca-fix-wrong-MGMT_DATA2-size.patch new file mode 100644 index 0000000000..55ecb1eb42 --- /dev/null +++ b/target/linux/generic/backport-5.15/777-v6.2-02-net-dsa-tag_qca-fix-wrong-MGMT_DATA2-size.patch @@ -0,0 +1,34 @@ +From d9dba91be71f03cc75bcf39fc0d5d99ff33f1ae0 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Thu, 29 Dec 2022 17:33:33 +0100 +Subject: [PATCH 2/5] net: dsa: tag_qca: fix wrong MGMT_DATA2 size + +It was discovered that MGMT_DATA2 can contain up to 28 bytes of data +instead of the 12 bytes written in the Documentation by accounting the +limit of 16 bytes declared in Documentation subtracting the first 4 byte +in the packet header. + +Update the define with the real world value. + +Tested-by: Ronald Wahl +Fixes: c2ee8181fddb ("net: dsa: tag_qca: add define for handling mgmt Ethernet packet") +Signed-off-by: Christian Marangi +Cc: stable@vger.kernel.org # v5.18+ +Signed-off-by: David S. Miller +--- + include/linux/dsa/tag_qca.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/include/linux/dsa/tag_qca.h ++++ b/include/linux/dsa/tag_qca.h +@@ -40,8 +40,8 @@ + QCA_HDR_MGMT_COMMAND_LEN + \ + QCA_HDR_MGMT_DATA1_LEN) + +-#define QCA_HDR_MGMT_DATA2_LEN 12 /* Other 12 byte for the mdio data */ +-#define QCA_HDR_MGMT_PADDING_LEN 34 /* Padding to reach the min Ethernet packet */ ++#define QCA_HDR_MGMT_DATA2_LEN 28 /* Other 28 byte for the mdio data */ ++#define QCA_HDR_MGMT_PADDING_LEN 18 /* Padding to reach the min Ethernet packet */ + + #define QCA_HDR_MGMT_PKT_LEN (QCA_HDR_MGMT_HEADER_LEN + \ + QCA_HDR_LEN + \ diff --git a/target/linux/generic/backport-5.15/777-v6.2-03-Revert-net-dsa-qca8k-cache-lo-and-hi-for-mdio-write.patch b/target/linux/generic/backport-5.15/777-v6.2-03-Revert-net-dsa-qca8k-cache-lo-and-hi-for-mdio-write.patch new file mode 100644 index 0000000000..c8e22fd1b8 --- /dev/null +++ b/target/linux/generic/backport-5.15/777-v6.2-03-Revert-net-dsa-qca8k-cache-lo-and-hi-for-mdio-write.patch @@ -0,0 +1,172 @@ +From 03cb9e6d0b32b768e3d9d473c5c4ca1100877664 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Thu, 29 Dec 2022 17:33:34 +0100 +Subject: [PATCH 3/5] Revert "net: dsa: qca8k: cache lo and hi for mdio write" + +This reverts commit 2481d206fae7884cd07014fd1318e63af35e99eb. + +The Documentation is very confusing about the topic. +The cache logic for hi and lo is wrong and actually miss some regs to be +actually written. + +What the Documentation actually intended was that it's possible to skip +writing hi OR lo if half of the reg is not needed to be written or read. + +Revert the change in favor of a better and correct implementation. + +Reported-by: Ronald Wahl +Signed-off-by: Christian Marangi +Cc: stable@vger.kernel.org # v5.18+ +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 61 +++++++------------------------- + drivers/net/dsa/qca/qca8k.h | 5 --- + 2 files changed, 12 insertions(+), 54 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -37,44 +37,6 @@ qca8k_split_addr(u32 regaddr, u16 *r1, u + } + + static int +-qca8k_set_lo(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 lo) +-{ +- u16 *cached_lo = &priv->mdio_cache.lo; +- struct mii_bus *bus = priv->bus; +- int ret; +- +- if (lo == *cached_lo) +- return 0; +- +- ret = bus->write(bus, phy_id, regnum, lo); +- if (ret < 0) +- dev_err_ratelimited(&bus->dev, +- "failed to write qca8k 32bit lo register\n"); +- +- *cached_lo = lo; +- return 0; +-} +- +-static int +-qca8k_set_hi(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 hi) +-{ +- u16 *cached_hi = &priv->mdio_cache.hi; +- struct mii_bus *bus = priv->bus; +- int ret; +- +- if (hi == *cached_hi) +- return 0; +- +- ret = bus->write(bus, phy_id, regnum, hi); +- if (ret < 0) +- dev_err_ratelimited(&bus->dev, +- "failed to write qca8k 32bit hi register\n"); +- +- *cached_hi = hi; +- return 0; +-} +- +-static int + qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) + { + int ret; +@@ -97,7 +59,7 @@ qca8k_mii_read32(struct mii_bus *bus, in + } + + static void +-qca8k_mii_write32(struct qca8k_priv *priv, int phy_id, u32 regnum, u32 val) ++qca8k_mii_write32(struct mii_bus *bus, int phy_id, u32 regnum, u32 val) + { + u16 lo, hi; + int ret; +@@ -105,9 +67,12 @@ qca8k_mii_write32(struct qca8k_priv *pri + lo = val & 0xffff; + hi = (u16)(val >> 16); + +- ret = qca8k_set_lo(priv, phy_id, regnum, lo); ++ ret = bus->write(bus, phy_id, regnum, lo); + if (ret >= 0) +- ret = qca8k_set_hi(priv, phy_id, regnum + 1, hi); ++ ret = bus->write(bus, phy_id, regnum + 1, hi); ++ if (ret < 0) ++ dev_err_ratelimited(&bus->dev, ++ "failed to write qca8k 32bit register\n"); + } + + static int +@@ -442,7 +407,7 @@ qca8k_regmap_write(void *ctx, uint32_t r + if (ret < 0) + goto exit; + +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ qca8k_mii_write32(bus, 0x10 | r2, r1, val); + + exit: + mutex_unlock(&bus->mdio_lock); +@@ -475,7 +440,7 @@ qca8k_regmap_update_bits(void *ctx, uint + + val &= ~mask; + val |= write_val; +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ qca8k_mii_write32(bus, 0x10 | r2, r1, val); + + exit: + mutex_unlock(&bus->mdio_lock); +@@ -750,14 +715,14 @@ qca8k_mdio_write(struct qca8k_priv *priv + if (ret) + goto exit; + +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ qca8k_mii_write32(bus, 0x10 | r2, r1, val); + + ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, + QCA8K_MDIO_MASTER_BUSY); + + exit: + /* even if the busy_wait timeouts try to clear the MASTER_EN */ +- qca8k_mii_write32(priv, 0x10 | r2, r1, 0); ++ qca8k_mii_write32(bus, 0x10 | r2, r1, 0); + + mutex_unlock(&bus->mdio_lock); + +@@ -787,7 +752,7 @@ qca8k_mdio_read(struct qca8k_priv *priv, + if (ret) + goto exit; + +- qca8k_mii_write32(priv, 0x10 | r2, r1, val); ++ qca8k_mii_write32(bus, 0x10 | r2, r1, val); + + ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, + QCA8K_MDIO_MASTER_BUSY); +@@ -798,7 +763,7 @@ qca8k_mdio_read(struct qca8k_priv *priv, + + exit: + /* even if the busy_wait timeouts try to clear the MASTER_EN */ +- qca8k_mii_write32(priv, 0x10 | r2, r1, 0); ++ qca8k_mii_write32(bus, 0x10 | r2, r1, 0); + + mutex_unlock(&bus->mdio_lock); + +@@ -1914,8 +1879,6 @@ qca8k_sw_probe(struct mdio_device *mdiod + } + + priv->mdio_cache.page = 0xffff; +- priv->mdio_cache.lo = 0xffff; +- priv->mdio_cache.hi = 0xffff; + + /* Check the detected switch id */ + ret = qca8k_read_switch_id(priv); +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -375,11 +375,6 @@ struct qca8k_mdio_cache { + * mdio writes + */ + u16 page; +-/* lo and hi can also be cached and from Documentation we can skip one +- * extra mdio write if lo or hi is didn't change. +- */ +- u16 lo; +- u16 hi; + }; + + struct qca8k_priv { diff --git a/target/linux/generic/backport-5.15/777-v6.2-04-net-dsa-qca8k-introduce-single-mii-read-write-lo-hi.patch b/target/linux/generic/backport-5.15/777-v6.2-04-net-dsa-qca8k-introduce-single-mii-read-write-lo-hi.patch new file mode 100644 index 0000000000..c0320ad6f9 --- /dev/null +++ b/target/linux/generic/backport-5.15/777-v6.2-04-net-dsa-qca8k-introduce-single-mii-read-write-lo-hi.patch @@ -0,0 +1,150 @@ +From cfbd6de588ef659c198083205dc954a6d3ed2aec Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Thu, 29 Dec 2022 17:33:35 +0100 +Subject: [PATCH 4/5] net: dsa: qca8k: introduce single mii read/write lo/hi + +It may be useful to read/write just the lo or hi half of a reg. + +This is especially useful for phy poll with the use of mdio master. +The mdio master reg is composed by the first 16 bit related to setup and +the other half with the returned data or data to write. + +Refactor the mii function to permit single mii read/write of lo or hi +half of the reg. + +Tested-by: Ronald Wahl +Signed-off-by: Christian Marangi +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 106 ++++++++++++++++++++++++------- + 1 file changed, 84 insertions(+), 22 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -37,42 +37,104 @@ qca8k_split_addr(u32 regaddr, u16 *r1, u + } + + static int +-qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) ++qca8k_mii_write_lo(struct mii_bus *bus, int phy_id, u32 regnum, u32 val) + { + int ret; ++ u16 lo; + +- ret = bus->read(bus, phy_id, regnum); +- if (ret >= 0) { +- *val = ret; +- ret = bus->read(bus, phy_id, regnum + 1); +- *val |= ret << 16; +- } ++ lo = val & 0xffff; ++ ret = bus->write(bus, phy_id, regnum, lo); ++ if (ret < 0) ++ dev_err_ratelimited(&bus->dev, ++ "failed to write qca8k 32bit lo register\n"); ++ ++ return ret; ++} + +- if (ret < 0) { ++static int ++qca8k_mii_write_hi(struct mii_bus *bus, int phy_id, u32 regnum, u32 val) ++{ ++ int ret; ++ u16 hi; ++ ++ hi = (u16)(val >> 16); ++ ret = bus->write(bus, phy_id, regnum, hi); ++ if (ret < 0) + dev_err_ratelimited(&bus->dev, +- "failed to read qca8k 32bit register\n"); +- *val = 0; +- return ret; +- } ++ "failed to write qca8k 32bit hi register\n"); + ++ return ret; ++} ++ ++static int ++qca8k_mii_read_lo(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) ++{ ++ int ret; ++ ++ ret = bus->read(bus, phy_id, regnum); ++ if (ret < 0) ++ goto err; ++ ++ *val = ret & 0xffff; + return 0; ++ ++err: ++ dev_err_ratelimited(&bus->dev, ++ "failed to read qca8k 32bit lo register\n"); ++ *val = 0; ++ ++ return ret; + } + +-static void +-qca8k_mii_write32(struct mii_bus *bus, int phy_id, u32 regnum, u32 val) ++static int ++qca8k_mii_read_hi(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) + { +- u16 lo, hi; + int ret; + +- lo = val & 0xffff; +- hi = (u16)(val >> 16); ++ ret = bus->read(bus, phy_id, regnum); ++ if (ret < 0) ++ goto err; + +- ret = bus->write(bus, phy_id, regnum, lo); +- if (ret >= 0) +- ret = bus->write(bus, phy_id, regnum + 1, hi); ++ *val = ret << 16; ++ return 0; ++ ++err: ++ dev_err_ratelimited(&bus->dev, ++ "failed to read qca8k 32bit hi register\n"); ++ *val = 0; ++ ++ return ret; ++} ++ ++static int ++qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) ++{ ++ u32 hi, lo; ++ int ret; ++ ++ *val = 0; ++ ++ ret = qca8k_mii_read_lo(bus, phy_id, regnum, &lo); + if (ret < 0) +- dev_err_ratelimited(&bus->dev, +- "failed to write qca8k 32bit register\n"); ++ goto err; ++ ++ ret = qca8k_mii_read_hi(bus, phy_id, regnum + 1, &hi); ++ if (ret < 0) ++ goto err; ++ ++ *val = lo | hi; ++ ++err: ++ return ret; ++} ++ ++static void ++qca8k_mii_write32(struct mii_bus *bus, int phy_id, u32 regnum, u32 val) ++{ ++ if (qca8k_mii_write_lo(bus, phy_id, regnum, val) < 0) ++ return; ++ ++ qca8k_mii_write_hi(bus, phy_id, regnum + 1, val); + } + + static int diff --git a/target/linux/generic/backport-5.15/777-v6.2-05-net-dsa-qca8k-improve-mdio-master-read-write-by-usin.patch b/target/linux/generic/backport-5.15/777-v6.2-05-net-dsa-qca8k-improve-mdio-master-read-write-by-usin.patch new file mode 100644 index 0000000000..4cbb66cf35 --- /dev/null +++ b/target/linux/generic/backport-5.15/777-v6.2-05-net-dsa-qca8k-improve-mdio-master-read-write-by-usin.patch @@ -0,0 +1,73 @@ +From a4165830ca237f2b3318faf62562bce8ce12a389 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Thu, 29 Dec 2022 17:33:36 +0100 +Subject: [PATCH 5/5] net: dsa: qca8k: improve mdio master read/write by using + single lo/hi + +Improve mdio master read/write by using singe mii read/write lo/hi. + +In a read and write we need to poll the mdio master regs in a busy loop +to check for a specific bit present in the upper half of the reg. We can +ignore the other half since it won't contain useful data. This will save +an additional useless read for each read and write operation. + +In a read operation the returned data is present in the mdio master reg +lower half. We can ignore the other half since it won't contain useful +data. This will save an additional useless read for each read operation. + +In a read operation it's needed to just set the hi half of the mdio +master reg as the lo half will be replaced by the result. This will save +an additional useless write for each read operation. + +Tested-by: Ronald Wahl +Signed-off-by: Christian Marangi +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -740,9 +740,9 @@ qca8k_mdio_busy_wait(struct mii_bus *bus + + qca8k_split_addr(reg, &r1, &r2, &page); + +- ret = read_poll_timeout(qca8k_mii_read32, ret1, !(val & mask), 0, ++ ret = read_poll_timeout(qca8k_mii_read_hi, ret1, !(val & mask), 0, + QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, +- bus, 0x10 | r2, r1, &val); ++ bus, 0x10 | r2, r1 + 1, &val); + + /* Check if qca8k_read has failed for a different reason + * before returnting -ETIMEDOUT +@@ -784,7 +784,7 @@ qca8k_mdio_write(struct qca8k_priv *priv + + exit: + /* even if the busy_wait timeouts try to clear the MASTER_EN */ +- qca8k_mii_write32(bus, 0x10 | r2, r1, 0); ++ qca8k_mii_write_hi(bus, 0x10 | r2, r1 + 1, 0); + + mutex_unlock(&bus->mdio_lock); + +@@ -814,18 +814,18 @@ qca8k_mdio_read(struct qca8k_priv *priv, + if (ret) + goto exit; + +- qca8k_mii_write32(bus, 0x10 | r2, r1, val); ++ qca8k_mii_write_hi(bus, 0x10 | r2, r1 + 1, val); + + ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, + QCA8K_MDIO_MASTER_BUSY); + if (ret) + goto exit; + +- ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); ++ ret = qca8k_mii_read_lo(bus, 0x10 | r2, r1, &val); + + exit: + /* even if the busy_wait timeouts try to clear the MASTER_EN */ +- qca8k_mii_write32(bus, 0x10 | r2, r1, 0); ++ qca8k_mii_write_hi(bus, 0x10 | r2, r1 + 1, 0); + + mutex_unlock(&bus->mdio_lock); + diff --git a/target/linux/generic/backport-5.15/778-v5.18-01-net-phy-at803x-add-fiber-support.patch b/target/linux/generic/backport-5.15/778-v5.18-01-net-phy-at803x-add-fiber-support.patch new file mode 100644 index 0000000000..7cb21ed00d --- /dev/null +++ b/target/linux/generic/backport-5.15/778-v5.18-01-net-phy-at803x-add-fiber-support.patch @@ -0,0 +1,193 @@ +From 3265f421887847db9ae2c01a00645e33608556d8 Mon Sep 17 00:00:00 2001 +From: Robert Hancock +Date: Tue, 25 Jan 2022 10:54:09 -0600 +Subject: [PATCH] net: phy: at803x: add fiber support + +Previously this driver always forced the copper page to be selected, +however for AR8031 in 100Base-FX or 1000Base-X modes, the fiber page +needs to be selected. Set the appropriate mode based on the hardware +mode_cfg strap selection. + +Enable the appropriate interrupt bits to detect fiber-side link up +or down events. + +Update config_aneg and read_status methods to use the appropriate +Clause 37 calls when fiber mode is in use. + +Signed-off-by: Robert Hancock +Signed-off-by: David S. Miller +--- + drivers/net/phy/at803x.c | 76 +++++++++++++++++++++++++++++++++++----- + 1 file changed, 67 insertions(+), 9 deletions(-) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -48,6 +48,8 @@ + #define AT803X_INTR_ENABLE_PAGE_RECEIVED BIT(12) + #define AT803X_INTR_ENABLE_LINK_FAIL BIT(11) + #define AT803X_INTR_ENABLE_LINK_SUCCESS BIT(10) ++#define AT803X_INTR_ENABLE_LINK_FAIL_BX BIT(8) ++#define AT803X_INTR_ENABLE_LINK_SUCCESS_BX BIT(7) + #define AT803X_INTR_ENABLE_WIRESPEED_DOWNGRADE BIT(5) + #define AT803X_INTR_ENABLE_POLARITY_CHANGED BIT(1) + #define AT803X_INTR_ENABLE_WOL BIT(0) +@@ -82,6 +84,17 @@ + + #define AT803X_MODE_CFG_MASK 0x0F + #define AT803X_MODE_CFG_SGMII 0x01 ++#define AT803X_MODE_CFG_BASET_RGMII 0x00 ++#define AT803X_MODE_CFG_BASET_SGMII 0x01 ++#define AT803X_MODE_CFG_BX1000_RGMII_50OHM 0x02 ++#define AT803X_MODE_CFG_BX1000_RGMII_75OHM 0x03 ++#define AT803X_MODE_CFG_BX1000_CONV_50OHM 0x04 ++#define AT803X_MODE_CFG_BX1000_CONV_75OHM 0x05 ++#define AT803X_MODE_CFG_FX100_RGMII_50OHM 0x06 ++#define AT803X_MODE_CFG_FX100_CONV_50OHM 0x07 ++#define AT803X_MODE_CFG_RGMII_AUTO_MDET 0x0B ++#define AT803X_MODE_CFG_FX100_RGMII_75OHM 0x0E ++#define AT803X_MODE_CFG_FX100_CONV_75OHM 0x0F + + #define AT803X_PSSR 0x11 /*PHY-Specific Status Register*/ + #define AT803X_PSSR_MR_AN_COMPLETE 0x0200 +@@ -199,6 +212,8 @@ struct at803x_priv { + u16 clk_25m_mask; + u8 smarteee_lpi_tw_1g; + u8 smarteee_lpi_tw_100m; ++ bool is_fiber; ++ bool is_1000basex; + struct regulator_dev *vddio_rdev; + struct regulator_dev *vddh_rdev; + struct regulator *vddio; +@@ -674,7 +689,33 @@ static int at803x_probe(struct phy_devic + return ret; + } + ++ if (phydev->drv->phy_id == ATH8031_PHY_ID) { ++ int ccr = phy_read(phydev, AT803X_REG_CHIP_CONFIG); ++ int mode_cfg; ++ ++ if (ccr < 0) ++ goto err; ++ mode_cfg = ccr & AT803X_MODE_CFG_MASK; ++ ++ switch (mode_cfg) { ++ case AT803X_MODE_CFG_BX1000_RGMII_50OHM: ++ case AT803X_MODE_CFG_BX1000_RGMII_75OHM: ++ priv->is_1000basex = true; ++ fallthrough; ++ case AT803X_MODE_CFG_FX100_RGMII_50OHM: ++ case AT803X_MODE_CFG_FX100_RGMII_75OHM: ++ priv->is_fiber = true; ++ break; ++ } ++ } ++ + return 0; ++ ++err: ++ if (priv->vddio) ++ regulator_disable(priv->vddio); ++ ++ return ret; + } + + static void at803x_remove(struct phy_device *phydev) +@@ -687,6 +728,7 @@ static void at803x_remove(struct phy_dev + + static int at803x_get_features(struct phy_device *phydev) + { ++ struct at803x_priv *priv = phydev->priv; + int err; + + err = genphy_read_abilities(phydev); +@@ -704,12 +746,13 @@ static int at803x_get_features(struct ph + * As a result of that, ESTATUS_1000_XFULL is set + * to 1 even when operating in copper TP mode. + * +- * Remove this mode from the supported link modes, +- * as this driver currently only supports copper +- * operation. ++ * Remove this mode from the supported link modes ++ * when not operating in 1000BaseX mode. + */ +- linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, +- phydev->supported); ++ if (!priv->is_1000basex) ++ linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, ++ phydev->supported); ++ + return 0; + } + +@@ -773,15 +816,18 @@ static int at8031_pll_config(struct phy_ + + static int at803x_config_init(struct phy_device *phydev) + { ++ struct at803x_priv *priv = phydev->priv; + int ret; + + if (phydev->drv->phy_id == ATH8031_PHY_ID) { + /* Some bootloaders leave the fiber page selected. +- * Switch to the copper page, as otherwise we read +- * the PHY capabilities from the fiber side. ++ * Switch to the appropriate page (fiber or copper), as otherwise we ++ * read the PHY capabilities from the wrong page. + */ + phy_lock_mdio_bus(phydev); +- ret = at803x_write_page(phydev, AT803X_PAGE_COPPER); ++ ret = at803x_write_page(phydev, ++ priv->is_fiber ? AT803X_PAGE_FIBER : ++ AT803X_PAGE_COPPER); + phy_unlock_mdio_bus(phydev); + if (ret) + return ret; +@@ -840,6 +886,7 @@ static int at803x_ack_interrupt(struct p + + static int at803x_config_intr(struct phy_device *phydev) + { ++ struct at803x_priv *priv = phydev->priv; + int err; + int value; + +@@ -856,6 +903,10 @@ static int at803x_config_intr(struct phy + value |= AT803X_INTR_ENABLE_DUPLEX_CHANGED; + value |= AT803X_INTR_ENABLE_LINK_FAIL; + value |= AT803X_INTR_ENABLE_LINK_SUCCESS; ++ if (priv->is_fiber) { ++ value |= AT803X_INTR_ENABLE_LINK_FAIL_BX; ++ value |= AT803X_INTR_ENABLE_LINK_SUCCESS_BX; ++ } + + err = phy_write(phydev, AT803X_INTR_ENABLE, value); + } else { +@@ -923,8 +974,12 @@ static void at803x_link_change_notify(st + + static int at803x_read_status(struct phy_device *phydev) + { ++ struct at803x_priv *priv = phydev->priv; + int ss, err, old_link = phydev->link; + ++ if (priv->is_1000basex) ++ return genphy_c37_read_status(phydev); ++ + /* Update the link, but return if there was an error */ + err = genphy_update_link(phydev); + if (err) +@@ -1023,6 +1078,7 @@ static int at803x_config_mdix(struct phy + + static int at803x_config_aneg(struct phy_device *phydev) + { ++ struct at803x_priv *priv = phydev->priv; + int ret; + + ret = at803x_config_mdix(phydev, phydev->mdix_ctrl); +@@ -1039,6 +1095,9 @@ static int at803x_config_aneg(struct phy + return ret; + } + ++ if (priv->is_1000basex) ++ return genphy_c37_config_aneg(phydev); ++ + return genphy_config_aneg(phydev); + } + diff --git a/target/linux/generic/backport-5.15/778-v5.18-02-net-phy-at803x-support-downstream-SFP-cage.patch b/target/linux/generic/backport-5.15/778-v5.18-02-net-phy-at803x-support-downstream-SFP-cage.patch new file mode 100644 index 0000000000..8393cb32e8 --- /dev/null +++ b/target/linux/generic/backport-5.15/778-v5.18-02-net-phy-at803x-support-downstream-SFP-cage.patch @@ -0,0 +1,95 @@ +From dc4d5fcc5d365c9f70ea3f5c09bdf70e988fad50 Mon Sep 17 00:00:00 2001 +From: Robert Hancock +Date: Tue, 25 Jan 2022 10:54:10 -0600 +Subject: [PATCH] net: phy: at803x: Support downstream SFP cage + +Add support for downstream SFP cages for AR8031 and AR8033. This is +primarily intended for fiber modules or direct-attach cables, however +copper modules which work in 1000Base-X mode may also function. Such +modules are allowed with a warning. + +Signed-off-by: Robert Hancock +Signed-off-by: David S. Miller +--- + drivers/net/phy/at803x.c | 56 ++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 56 insertions(+) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -19,6 +19,8 @@ + #include + #include + #include ++#include ++#include + #include + + #define AT803X_SPECIFIC_FUNCTION_CONTROL 0x10 +@@ -555,6 +557,55 @@ static int at8031_register_regulators(st + return 0; + } + ++static int at803x_sfp_insert(void *upstream, const struct sfp_eeprom_id *id) ++{ ++ struct phy_device *phydev = upstream; ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_support); ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(sfp_support); ++ phy_interface_t iface; ++ ++ linkmode_zero(phy_support); ++ phylink_set(phy_support, 1000baseX_Full); ++ phylink_set(phy_support, 1000baseT_Full); ++ phylink_set(phy_support, Autoneg); ++ phylink_set(phy_support, Pause); ++ phylink_set(phy_support, Asym_Pause); ++ ++ linkmode_zero(sfp_support); ++ sfp_parse_support(phydev->sfp_bus, id, sfp_support); ++ /* Some modules support 10G modes as well as others we support. ++ * Mask out non-supported modes so the correct interface is picked. ++ */ ++ linkmode_and(sfp_support, phy_support, sfp_support); ++ ++ if (linkmode_empty(sfp_support)) { ++ dev_err(&phydev->mdio.dev, "incompatible SFP module inserted\n"); ++ return -EINVAL; ++ } ++ ++ iface = sfp_select_interface(phydev->sfp_bus, sfp_support); ++ ++ /* Only 1000Base-X is supported by AR8031/8033 as the downstream SerDes ++ * interface for use with SFP modules. ++ * However, some copper modules detected as having a preferred SGMII ++ * interface do default to and function in 1000Base-X mode, so just ++ * print a warning and allow such modules, as they may have some chance ++ * of working. ++ */ ++ if (iface == PHY_INTERFACE_MODE_SGMII) ++ dev_warn(&phydev->mdio.dev, "module may not function if 1000Base-X not supported\n"); ++ else if (iface != PHY_INTERFACE_MODE_1000BASEX) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static const struct sfp_upstream_ops at803x_sfp_ops = { ++ .attach = phy_sfp_attach, ++ .detach = phy_sfp_detach, ++ .module_insert = at803x_sfp_insert, ++}; ++ + static int at803x_parse_dt(struct phy_device *phydev) + { + struct device_node *node = phydev->mdio.dev.of_node; +@@ -662,6 +713,11 @@ static int at803x_parse_dt(struct phy_de + phydev_err(phydev, "failed to get VDDIO regulator\n"); + return PTR_ERR(priv->vddio); + } ++ ++ /* Only AR8031/8033 support 1000Base-X for SFP modules */ ++ ret = phy_sfp_probe(phydev, &at803x_sfp_ops); ++ if (ret < 0) ++ return ret; + } + + return 0; diff --git a/target/linux/generic/backport-5.15/778-v5.18-03-net-phy-at803x-fix-NULL-pointer-dereference-on-AR9331-PHY.patch b/target/linux/generic/backport-5.15/778-v5.18-03-net-phy-at803x-fix-NULL-pointer-dereference-on-AR9331-PHY.patch new file mode 100644 index 0000000000..53d6325c49 --- /dev/null +++ b/target/linux/generic/backport-5.15/778-v5.18-03-net-phy-at803x-fix-NULL-pointer-dereference-on-AR9331-PHY.patch @@ -0,0 +1,56 @@ +From 9926de7315be3d606cc011a305ad9adb9e8e14c9 Mon Sep 17 00:00:00 2001 +From: Oleksij Rempel +Date: Sat, 18 Jun 2022 14:23:33 +0200 +Subject: [PATCH] net: phy: at803x: fix NULL pointer dereference on AR9331 PHY + +Latest kernel will explode on the PHY interrupt config, since it depends +now on allocated priv. So, run probe to allocate priv to fix it. + + ar9331_switch ethernet.1:10 lan0 (uninitialized): PHY [!ahb!ethernet@1a000000!mdio!switch@10:00] driver [Qualcomm Atheros AR9331 built-in PHY] (irq=13) + CPU 0 Unable to handle kernel paging request at virtual address 0000000a, epc == 8050e8a8, ra == 80504b34 + ... + Call Trace: + [<8050e8a8>] at803x_config_intr+0x5c/0xd0 + [<80504b34>] phy_request_interrupt+0xa8/0xd0 + [<8050289c>] phylink_bringup_phy+0x2d8/0x3ac + [<80502b68>] phylink_fwnode_phy_connect+0x118/0x130 + [<8074d8ec>] dsa_slave_create+0x270/0x420 + [<80743b04>] dsa_port_setup+0x12c/0x148 + [<8074580c>] dsa_register_switch+0xaf0/0xcc0 + [<80511344>] ar9331_sw_probe+0x370/0x388 + [<8050cb78>] mdio_probe+0x44/0x70 + [<804df300>] really_probe+0x200/0x424 + [<804df7b4>] __driver_probe_device+0x290/0x298 + [<804df810>] driver_probe_device+0x54/0xe4 + [<804dfd50>] __device_attach_driver+0xe4/0x130 + [<804dcb00>] bus_for_each_drv+0xb4/0xd8 + [<804dfac4>] __device_attach+0x104/0x1a4 + [<804ddd24>] bus_probe_device+0x48/0xc4 + [<804deb44>] deferred_probe_work_func+0xf0/0x10c + [<800a0ffc>] process_one_work+0x314/0x4d4 + [<800a17fc>] worker_thread+0x2a4/0x354 + [<800a9a54>] kthread+0x134/0x13c + [<8006306c>] ret_from_kernel_thread+0x14/0x1c + +Same Issue would affect some other PHYs (QCA8081, QCA9561), so fix it +too. + +Fixes: 3265f4218878 ("net: phy: at803x: add fiber support") +Signed-off-by: Oleksij Rempel +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/at803x.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -1592,6 +1592,8 @@ static struct phy_driver at803x_driver[] + /* ATHEROS AR9331 */ + PHY_ID_MATCH_EXACT(ATH9331_PHY_ID), + .name = "Qualcomm Atheros AR9331 built-in PHY", ++ .probe = at803x_probe, ++ .remove = at803x_remove, + .suspend = at803x_suspend, + .resume = at803x_resume, + .flags = PHY_POLL_CABLE_TEST, diff --git a/target/linux/generic/backport-5.15/778-v5.18-04-net-phy-at803x-fix-error-return-code-in-at803x_probe.patch b/target/linux/generic/backport-5.15/778-v5.18-04-net-phy-at803x-fix-error-return-code-in-at803x_probe.patch new file mode 100644 index 0000000000..cdae5b4ca4 --- /dev/null +++ b/target/linux/generic/backport-5.15/778-v5.18-04-net-phy-at803x-fix-error-return-code-in-at803x_probe.patch @@ -0,0 +1,31 @@ +From 1f0dd412e34e177621769866bef347f0b22364df Mon Sep 17 00:00:00 2001 +From: Wei Yongjun +Date: Fri, 18 Nov 2022 10:36:35 +0000 +Subject: [PATCH] net: phy: at803x: fix error return code in at803x_probe() + +Fix to return a negative error code from the ccr read error handling +case instead of 0, as done elsewhere in this function. + +Fixes: 3265f4218878 ("net: phy: at803x: add fiber support") +Signed-off-by: Wei Yongjun +Reviewed-by: Andrew Lunn +Link: https://lore.kernel.org/r/20221118103635.254256-1-weiyongjun@huaweicloud.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/at803x.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/net/phy/at803x.c ++++ b/drivers/net/phy/at803x.c +@@ -749,8 +749,10 @@ static int at803x_probe(struct phy_devic + int ccr = phy_read(phydev, AT803X_REG_CHIP_CONFIG); + int mode_cfg; + +- if (ccr < 0) ++ if (ccr < 0) { ++ ret = ccr; + goto err; ++ } + mode_cfg = ccr & AT803X_MODE_CFG_MASK; + + switch (mode_cfg) { diff --git a/target/linux/generic/backport-5.15/780-v5.16-bus-mhi-pci_generic-Introduce-Sierra-EM919X-support.patch b/target/linux/generic/backport-5.15/780-v5.16-bus-mhi-pci_generic-Introduce-Sierra-EM919X-support.patch new file mode 100644 index 0000000000..44f0864e9a --- /dev/null +++ b/target/linux/generic/backport-5.15/780-v5.16-bus-mhi-pci_generic-Introduce-Sierra-EM919X-support.patch @@ -0,0 +1,80 @@ +From 789d3eeb2367f92193a0882f7cdab03f0f9d6930 Mon Sep 17 00:00:00 2001 +From: Thomas Perrot +Date: Thu, 16 Dec 2021 13:42:27 +0530 +Subject: [PATCH] bus: mhi: pci_generic: Introduce Sierra EM919X support + +Add support for EM919X modems, this modem series is based on SDX55 +qcom chip. + +It is mandatory to use the same ring for control+data and diag events. + +Link: https://lore.kernel.org/r/20211123081541.648426-1-thomas.perrot@bootlin.com +Tested-by: Aleksander Morgado +Reviewed-by: Manivannan Sadhasivam +Signed-off-by: Thomas Perrot +Signed-off-by: Manivannan Sadhasivam +Link: https://lore.kernel.org/r/20211216081227.237749-11-manivannan.sadhasivam@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/bus/mhi/host/pci_generic.c | 43 +++++++++++++++++++++++++++++++++++ + 1 file changed, 43 insertions(+) + +--- a/drivers/bus/mhi/host/pci_generic.c ++++ b/drivers/bus/mhi/host/pci_generic.c +@@ -406,6 +406,46 @@ static const struct mhi_pci_dev_info mhi + .mru_default = 32768, + }; + ++static const struct mhi_channel_config mhi_sierra_em919x_channels[] = { ++ MHI_CHANNEL_CONFIG_UL_SBL(2, "SAHARA", 32, 0), ++ MHI_CHANNEL_CONFIG_DL_SBL(3, "SAHARA", 256, 0), ++ MHI_CHANNEL_CONFIG_UL(4, "DIAG", 32, 0), ++ MHI_CHANNEL_CONFIG_DL(5, "DIAG", 32, 0), ++ MHI_CHANNEL_CONFIG_UL(12, "MBIM", 128, 0), ++ MHI_CHANNEL_CONFIG_DL(13, "MBIM", 128, 0), ++ MHI_CHANNEL_CONFIG_UL(14, "QMI", 32, 0), ++ MHI_CHANNEL_CONFIG_DL(15, "QMI", 32, 0), ++ MHI_CHANNEL_CONFIG_UL(32, "DUN", 32, 0), ++ MHI_CHANNEL_CONFIG_DL(33, "DUN", 32, 0), ++ MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0", 512, 1), ++ MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0", 512, 2), ++}; ++ ++static struct mhi_event_config modem_sierra_em919x_mhi_events[] = { ++ /* first ring is control+data and DIAG ring */ ++ MHI_EVENT_CONFIG_CTRL(0, 2048), ++ /* Hardware channels request dedicated hardware event rings */ ++ MHI_EVENT_CONFIG_HW_DATA(1, 2048, 100), ++ MHI_EVENT_CONFIG_HW_DATA(2, 2048, 101) ++}; ++ ++static const struct mhi_controller_config modem_sierra_em919x_config = { ++ .max_channels = 128, ++ .timeout_ms = 24000, ++ .num_channels = ARRAY_SIZE(mhi_sierra_em919x_channels), ++ .ch_cfg = mhi_sierra_em919x_channels, ++ .num_events = ARRAY_SIZE(modem_sierra_em919x_mhi_events), ++ .event_cfg = modem_sierra_em919x_mhi_events, ++}; ++ ++static const struct mhi_pci_dev_info mhi_sierra_em919x_info = { ++ .name = "sierra-em919x", ++ .config = &modem_sierra_em919x_config, ++ .bar_num = MHI_PCI_DEFAULT_BAR_NUM, ++ .dma_data_width = 32, ++ .sideband_wake = false, ++}; ++ + static const struct mhi_channel_config mhi_telit_fn980_hw_v1_channels[] = { + MHI_CHANNEL_CONFIG_UL(14, "QMI", 32, 0), + MHI_CHANNEL_CONFIG_DL(15, "QMI", 32, 0), +@@ -480,6 +520,9 @@ static const struct mhi_pci_dev_info mhi + }; + + static const struct pci_device_id mhi_pci_id_table[] = { ++ /* EM919x (sdx55), use the same vid:pid as qcom-sdx55m */ ++ { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0306, 0x18d7, 0x0200), ++ .driver_data = (kernel_ulong_t) &mhi_sierra_em919x_info }, + /* Telit FN980 hardware revision v1 */ + { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0306, 0x1C5D, 0x2000), + .driver_data = (kernel_ulong_t) &mhi_telit_fn980_hw_v1_info }, diff --git a/target/linux/generic/backport-5.15/781-v6.1-bus-mhi-host-always-print-detected-modem-name.patch b/target/linux/generic/backport-5.15/781-v6.1-bus-mhi-host-always-print-detected-modem-name.patch new file mode 100644 index 0000000000..3c71a27b79 --- /dev/null +++ b/target/linux/generic/backport-5.15/781-v6.1-bus-mhi-host-always-print-detected-modem-name.patch @@ -0,0 +1,37 @@ +From f369e9ad52ec9361827e21a631b7198c9fca438e Mon Sep 17 00:00:00 2001 +From: Koen Vandeputte +Date: Wed, 31 Aug 2022 12:03:49 +0200 +Subject: [PATCH] bus: mhi: host: always print detected modem name + +This harmless print provides a very easy way of knowing +if the modem is detected properly during probing. + +Promote it to an informational print so no hassle is required +enabling kernel debugging info to obtain it. + +The rationale here is that: +On a lot of low-storage embedded devices, extensive kernel +debugging info is not always present as this would +increase it's size to much causing partition size issues. + +Signed-off-by: Koen Vandeputte +Reviewed-by: Manivannan Sadhasivam +Reviewed-by: Loic Poulain +Link: https://lore.kernel.org/r/20220831100349.1488762-1-koen.vandeputte@citymesh.com +[mani: added missing review tags] +Signed-off-by: Manivannan Sadhasivam +--- + drivers/bus/mhi/host/pci_generic.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/bus/mhi/host/pci_generic.c ++++ b/drivers/bus/mhi/host/pci_generic.c +@@ -806,7 +806,7 @@ static int mhi_pci_probe(struct pci_dev + struct mhi_controller *mhi_cntrl; + int err; + +- dev_dbg(&pdev->dev, "MHI PCI device found: %s\n", info->name); ++ dev_info(&pdev->dev, "MHI PCI device found: %s\n", info->name); + + /* mhi_pdev.mhi_cntrl must be zero-initialized */ + mhi_pdev = devm_kzalloc(&pdev->dev, sizeof(*mhi_pdev), GFP_KERNEL); diff --git a/target/linux/generic/backport-5.15/782-v6.1-net-dsa-mt7530-add-support-for-in-band-link-status.patch b/target/linux/generic/backport-5.15/782-v6.1-net-dsa-mt7530-add-support-for-in-band-link-status.patch new file mode 100644 index 0000000000..8d55ffb8b6 --- /dev/null +++ b/target/linux/generic/backport-5.15/782-v6.1-net-dsa-mt7530-add-support-for-in-band-link-status.patch @@ -0,0 +1,130 @@ +From e19de30d20809af3221ef8a2648b8a8a52e02d90 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Wed, 21 Sep 2022 01:23:14 +0100 +Subject: [PATCH 1/1] net: dsa: mt7530: add support for in-band link status + +Read link status from SGMII PCS for in-band managed 2500Base-X and +1000Base-X connection on a MAC port of the MT7531. This is needed to +get the SFP cage working which is connected to SGMII interface of +port 5 of the MT7531 switch IC on the Bananapi BPi-R3 board. +While at it also handle an_complete for both the autoneg and the +non-autoneg codepath. + +Signed-off-by: Daniel Golle +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mt7530.c | 50 +++++++++++++++++++++++++++++----------- + drivers/net/dsa/mt7530.h | 1 + + 2 files changed, 38 insertions(+), 13 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2746,9 +2746,6 @@ mt7531_mac_config(struct dsa_switch *ds, + case PHY_INTERFACE_MODE_NA: + case PHY_INTERFACE_MODE_1000BASEX: + case PHY_INTERFACE_MODE_2500BASEX: +- if (phylink_autoneg_inband(mode)) +- return -EINVAL; +- + return mt7531_sgmii_setup_mode_force(priv, port, interface); + default: + return -EINVAL; +@@ -2824,13 +2821,6 @@ unsupported: + return; + } + +- if (phylink_autoneg_inband(mode) && +- state->interface != PHY_INTERFACE_MODE_SGMII) { +- dev_err(ds->dev, "%s: in-band negotiation unsupported\n", +- __func__); +- return; +- } +- + mcr_cur = mt7530_read(priv, MT7530_PMCR_P(port)); + mcr_new = mcr_cur; + mcr_new &= ~PMCR_LINK_SETTINGS_MASK; +@@ -2967,6 +2957,9 @@ static void mt753x_phylink_get_caps(stru + config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | + MAC_10 | MAC_100 | MAC_1000FD; + ++ if ((priv->id == ID_MT7531) && mt753x_is_mac_port(port)) ++ config->mac_capabilities |= MAC_2500FD; ++ + /* This driver does not make use of the speed, duplex, pause or the + * advertisement in its mac_config, so it is safe to mark this driver + * as non-legacy. +@@ -3032,6 +3025,7 @@ mt7531_sgmii_pcs_get_state_an(struct mt7 + + status = mt7530_read(priv, MT7531_PCS_CONTROL_1(port)); + state->link = !!(status & MT7531_SGMII_LINK_STATUS); ++ state->an_complete = !!(status & MT7531_SGMII_AN_COMPLETE); + if (state->interface == PHY_INTERFACE_MODE_SGMII && + (status & MT7531_SGMII_AN_ENABLE)) { + val = mt7530_read(priv, MT7531_PCS_SPEED_ABILITY(port)); +@@ -3062,16 +3056,44 @@ mt7531_sgmii_pcs_get_state_an(struct mt7 + return 0; + } + ++static void ++mt7531_sgmii_pcs_get_state_inband(struct mt7530_priv *priv, int port, ++ struct phylink_link_state *state) ++{ ++ unsigned int val; ++ ++ val = mt7530_read(priv, MT7531_PCS_CONTROL_1(port)); ++ state->link = !!(val & MT7531_SGMII_LINK_STATUS); ++ if (!state->link) ++ return; ++ ++ state->an_complete = state->link; ++ ++ if (state->interface == PHY_INTERFACE_MODE_2500BASEX) ++ state->speed = SPEED_2500; ++ else ++ state->speed = SPEED_1000; ++ ++ state->duplex = DUPLEX_FULL; ++ state->pause = MLO_PAUSE_NONE; ++} ++ + static void mt7531_pcs_get_state(struct phylink_pcs *pcs, + struct phylink_link_state *state) + { + struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv; + int port = pcs_to_mt753x_pcs(pcs)->port; + +- if (state->interface == PHY_INTERFACE_MODE_SGMII) ++ if (state->interface == PHY_INTERFACE_MODE_SGMII) { + mt7531_sgmii_pcs_get_state_an(priv, port, state); +- else +- state->link = false; ++ return; ++ } else if ((state->interface == PHY_INTERFACE_MODE_1000BASEX) || ++ (state->interface == PHY_INTERFACE_MODE_2500BASEX)) { ++ mt7531_sgmii_pcs_get_state_inband(priv, port, state); ++ return; ++ } ++ ++ state->link = false; + } + + static int mt753x_pcs_config(struct phylink_pcs *pcs, unsigned int mode, +@@ -3112,6 +3134,8 @@ mt753x_setup(struct dsa_switch *ds) + priv->pcs[i].pcs.ops = priv->info->pcs_ops; + priv->pcs[i].priv = priv; + priv->pcs[i].port = i; ++ if (mt753x_is_mac_port(i)) ++ priv->pcs[i].pcs.poll = 1; + } + + ret = priv->info->sw_setup(ds); +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -373,6 +373,7 @@ enum mt7530_vlan_port_acc_frm { + #define MT7531_SGMII_LINK_STATUS BIT(18) + #define MT7531_SGMII_AN_ENABLE BIT(12) + #define MT7531_SGMII_AN_RESTART BIT(9) ++#define MT7531_SGMII_AN_COMPLETE BIT(21) + + /* Register for SGMII PCS_SPPED_ABILITY */ + #define MT7531_PCS_SPEED_ABILITY(p) MT7531_SGMII_REG(p, 0x08) diff --git a/target/linux/generic/backport-5.15/783-v6.1-net-sfp-re-implement-soft-state-polling-setup.patch b/target/linux/generic/backport-5.15/783-v6.1-net-sfp-re-implement-soft-state-polling-setup.patch new file mode 100644 index 0000000000..77cd336d36 --- /dev/null +++ b/target/linux/generic/backport-5.15/783-v6.1-net-sfp-re-implement-soft-state-polling-setup.patch @@ -0,0 +1,98 @@ +From 8475c4b70b040f9d8cbc308100f2c4d865f810b3 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 13 Sep 2022 20:06:27 +0100 +Subject: [PATCH 1/1] net: sfp: re-implement soft state polling setup + +Re-implement the decision making for soft state polling. Instead of +generating the soft state mask in sfp_soft_start_poll() by looking at +which GPIOs are available, record their availability in +sfp_sm_mod_probe() in sfp->state_hw_mask. + +This will then allow us to clear bits in sfp->state_hw_mask in module +specific quirks when the hardware signals should not be used, thereby +allowing us to switch to using the software state polling. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/sfp.c | 38 ++++++++++++++++++++++++++------------ + 1 file changed, 26 insertions(+), 12 deletions(-) + +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -240,6 +240,7 @@ struct sfp { + bool need_poll; + + struct mutex st_mutex; /* Protects state */ ++ unsigned int state_hw_mask; + unsigned int state_soft_mask; + unsigned int state; + struct delayed_work poll; +@@ -505,17 +506,18 @@ static void sfp_soft_set_state(struct sf + static void sfp_soft_start_poll(struct sfp *sfp) + { + const struct sfp_eeprom_id *id = &sfp->id; ++ unsigned int mask = 0; + + sfp->state_soft_mask = 0; +- if (id->ext.enhopts & SFP_ENHOPTS_SOFT_TX_DISABLE && +- !sfp->gpio[GPIO_TX_DISABLE]) +- sfp->state_soft_mask |= SFP_F_TX_DISABLE; +- if (id->ext.enhopts & SFP_ENHOPTS_SOFT_TX_FAULT && +- !sfp->gpio[GPIO_TX_FAULT]) +- sfp->state_soft_mask |= SFP_F_TX_FAULT; +- if (id->ext.enhopts & SFP_ENHOPTS_SOFT_RX_LOS && +- !sfp->gpio[GPIO_LOS]) +- sfp->state_soft_mask |= SFP_F_LOS; ++ if (id->ext.enhopts & SFP_ENHOPTS_SOFT_TX_DISABLE) ++ mask |= SFP_F_TX_DISABLE; ++ if (id->ext.enhopts & SFP_ENHOPTS_SOFT_TX_FAULT) ++ mask |= SFP_F_TX_FAULT; ++ if (id->ext.enhopts & SFP_ENHOPTS_SOFT_RX_LOS) ++ mask |= SFP_F_LOS; ++ ++ // Poll the soft state for hardware pins we want to ignore ++ sfp->state_soft_mask = ~sfp->state_hw_mask & mask; + + if (sfp->state_soft_mask & (SFP_F_LOS | SFP_F_TX_FAULT) && + !sfp->need_poll) +@@ -529,10 +531,11 @@ static void sfp_soft_stop_poll(struct sf + + static unsigned int sfp_get_state(struct sfp *sfp) + { +- unsigned int state = sfp->get_state(sfp); ++ unsigned int soft = sfp->state_soft_mask & (SFP_F_LOS | SFP_F_TX_FAULT); ++ unsigned int state; + +- if (state & SFP_F_PRESENT && +- sfp->state_soft_mask & (SFP_F_LOS | SFP_F_TX_FAULT)) ++ state = sfp->get_state(sfp) & sfp->state_hw_mask; ++ if (state & SFP_F_PRESENT && soft) + state |= sfp_soft_get_state(sfp); + + return state; +@@ -1942,6 +1945,15 @@ static int sfp_sm_mod_probe(struct sfp * + if (ret < 0) + return ret; + ++ /* Initialise state bits to use from hardware */ ++ sfp->state_hw_mask = SFP_F_PRESENT; ++ if (sfp->gpio[GPIO_TX_DISABLE]) ++ sfp->state_hw_mask |= SFP_F_TX_DISABLE; ++ if (sfp->gpio[GPIO_TX_FAULT]) ++ sfp->state_hw_mask |= SFP_F_TX_FAULT; ++ if (sfp->gpio[GPIO_LOS]) ++ sfp->state_hw_mask |= SFP_F_LOS; ++ + if (!memcmp(id.base.vendor_name, "ALCATELLUCENT ", 16) && + !memcmp(id.base.vendor_pn, "3FE46541AA ", 16)) + sfp->module_t_start_up = T_START_UP_BAD_GPON; +@@ -2568,6 +2580,8 @@ static int sfp_probe(struct platform_dev + return PTR_ERR(sfp->gpio[i]); + } + ++ sfp->state_hw_mask = SFP_F_PRESENT; ++ + sfp->get_state = sfp_gpio_get_state; + sfp->set_state = sfp_gpio_set_state; + diff --git a/target/linux/generic/backport-5.15/784-v6.1-net-sfp-move-quirk-handling-into-sfp.c.patch b/target/linux/generic/backport-5.15/784-v6.1-net-sfp-move-quirk-handling-into-sfp.c.patch new file mode 100644 index 0000000000..02fa28c5af --- /dev/null +++ b/target/linux/generic/backport-5.15/784-v6.1-net-sfp-move-quirk-handling-into-sfp.c.patch @@ -0,0 +1,291 @@ +From 23571c7b96437483d28a990c906cc81f5f66374e Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 13 Sep 2022 20:06:32 +0100 +Subject: [PATCH 1/1] net: sfp: move quirk handling into sfp.c + +We need to handle more quirks than just those which affect the link +modes of the module. Move the quirk lookup into sfp.c, and pass the +quirk to sfp-bus.c + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/sfp-bus.c | 98 ++------------------------------------- + drivers/net/phy/sfp.c | 94 ++++++++++++++++++++++++++++++++++++- + drivers/net/phy/sfp.h | 9 +++- + 3 files changed, 104 insertions(+), 97 deletions(-) + +--- a/drivers/net/phy/sfp-bus.c ++++ b/drivers/net/phy/sfp-bus.c +@@ -10,12 +10,6 @@ + + #include "sfp.h" + +-struct sfp_quirk { +- const char *vendor; +- const char *part; +- void (*modes)(const struct sfp_eeprom_id *id, unsigned long *modes); +-}; +- + /** + * struct sfp_bus - internal representation of a sfp bus + */ +@@ -38,93 +32,6 @@ struct sfp_bus { + bool started; + }; + +-static void sfp_quirk_2500basex(const struct sfp_eeprom_id *id, +- unsigned long *modes) +-{ +- phylink_set(modes, 2500baseX_Full); +-} +- +-static void sfp_quirk_ubnt_uf_instant(const struct sfp_eeprom_id *id, +- unsigned long *modes) +-{ +- /* Ubiquiti U-Fiber Instant module claims that support all transceiver +- * types including 10G Ethernet which is not truth. So clear all claimed +- * modes and set only one mode which module supports: 1000baseX_Full. +- */ +- phylink_zero(modes); +- phylink_set(modes, 1000baseX_Full); +-} +- +-static const struct sfp_quirk sfp_quirks[] = { +- { +- // Alcatel Lucent G-010S-P can operate at 2500base-X, but +- // incorrectly report 2500MBd NRZ in their EEPROM +- .vendor = "ALCATELLUCENT", +- .part = "G010SP", +- .modes = sfp_quirk_2500basex, +- }, { +- // Alcatel Lucent G-010S-A can operate at 2500base-X, but +- // report 3.2GBd NRZ in their EEPROM +- .vendor = "ALCATELLUCENT", +- .part = "3FE46541AA", +- .modes = sfp_quirk_2500basex, +- }, { +- // Huawei MA5671A can operate at 2500base-X, but report 1.2GBd +- // NRZ in their EEPROM +- .vendor = "HUAWEI", +- .part = "MA5671A", +- .modes = sfp_quirk_2500basex, +- }, { +- // Lantech 8330-262D-E can operate at 2500base-X, but +- // incorrectly report 2500MBd NRZ in their EEPROM +- .vendor = "Lantech", +- .part = "8330-262D-E", +- .modes = sfp_quirk_2500basex, +- }, { +- .vendor = "UBNT", +- .part = "UF-INSTANT", +- .modes = sfp_quirk_ubnt_uf_instant, +- }, +-}; +- +-static size_t sfp_strlen(const char *str, size_t maxlen) +-{ +- size_t size, i; +- +- /* Trailing characters should be filled with space chars */ +- for (i = 0, size = 0; i < maxlen; i++) +- if (str[i] != ' ') +- size = i + 1; +- +- return size; +-} +- +-static bool sfp_match(const char *qs, const char *str, size_t len) +-{ +- if (!qs) +- return true; +- if (strlen(qs) != len) +- return false; +- return !strncmp(qs, str, len); +-} +- +-static const struct sfp_quirk *sfp_lookup_quirk(const struct sfp_eeprom_id *id) +-{ +- const struct sfp_quirk *q; +- unsigned int i; +- size_t vs, ps; +- +- vs = sfp_strlen(id->base.vendor_name, ARRAY_SIZE(id->base.vendor_name)); +- ps = sfp_strlen(id->base.vendor_pn, ARRAY_SIZE(id->base.vendor_pn)); +- +- for (i = 0, q = sfp_quirks; i < ARRAY_SIZE(sfp_quirks); i++, q++) +- if (sfp_match(q->vendor, id->base.vendor_name, vs) && +- sfp_match(q->part, id->base.vendor_pn, ps)) +- return q; +- +- return NULL; +-} +- + /** + * sfp_parse_port() - Parse the EEPROM base ID, setting the port type + * @bus: a pointer to the &struct sfp_bus structure for the sfp module +@@ -786,12 +693,13 @@ void sfp_link_down(struct sfp_bus *bus) + } + EXPORT_SYMBOL_GPL(sfp_link_down); + +-int sfp_module_insert(struct sfp_bus *bus, const struct sfp_eeprom_id *id) ++int sfp_module_insert(struct sfp_bus *bus, const struct sfp_eeprom_id *id, ++ const struct sfp_quirk *quirk) + { + const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus); + int ret = 0; + +- bus->sfp_quirk = sfp_lookup_quirk(id); ++ bus->sfp_quirk = quirk; + + if (ops && ops->module_insert) + ret = ops->module_insert(bus->upstream, id); +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -259,6 +259,8 @@ struct sfp { + unsigned int module_t_start_up; + bool tx_fault_ignore; + ++ const struct sfp_quirk *quirk; ++ + #if IS_ENABLED(CONFIG_HWMON) + struct sfp_diag diag; + struct delayed_work hwmon_probe; +@@ -315,6 +317,93 @@ static const struct of_device_id sfp_of_ + }; + MODULE_DEVICE_TABLE(of, sfp_of_match); + ++static void sfp_quirk_2500basex(const struct sfp_eeprom_id *id, ++ unsigned long *modes) ++{ ++ linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseX_Full_BIT, modes); ++} ++ ++static void sfp_quirk_ubnt_uf_instant(const struct sfp_eeprom_id *id, ++ unsigned long *modes) ++{ ++ /* Ubiquiti U-Fiber Instant module claims that support all transceiver ++ * types including 10G Ethernet which is not truth. So clear all claimed ++ * modes and set only one mode which module supports: 1000baseX_Full. ++ */ ++ linkmode_zero(modes); ++ linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, modes); ++} ++ ++static const struct sfp_quirk sfp_quirks[] = { ++ { ++ // Alcatel Lucent G-010S-P can operate at 2500base-X, but ++ // incorrectly report 2500MBd NRZ in their EEPROM ++ .vendor = "ALCATELLUCENT", ++ .part = "G010SP", ++ .modes = sfp_quirk_2500basex, ++ }, { ++ // Alcatel Lucent G-010S-A can operate at 2500base-X, but ++ // report 3.2GBd NRZ in their EEPROM ++ .vendor = "ALCATELLUCENT", ++ .part = "3FE46541AA", ++ .modes = sfp_quirk_2500basex, ++ }, { ++ // Huawei MA5671A can operate at 2500base-X, but report 1.2GBd ++ // NRZ in their EEPROM ++ .vendor = "HUAWEI", ++ .part = "MA5671A", ++ .modes = sfp_quirk_2500basex, ++ }, { ++ // Lantech 8330-262D-E can operate at 2500base-X, but ++ // incorrectly report 2500MBd NRZ in their EEPROM ++ .vendor = "Lantech", ++ .part = "8330-262D-E", ++ .modes = sfp_quirk_2500basex, ++ }, { ++ .vendor = "UBNT", ++ .part = "UF-INSTANT", ++ .modes = sfp_quirk_ubnt_uf_instant, ++ }, ++}; ++ ++static size_t sfp_strlen(const char *str, size_t maxlen) ++{ ++ size_t size, i; ++ ++ /* Trailing characters should be filled with space chars */ ++ for (i = 0, size = 0; i < maxlen; i++) ++ if (str[i] != ' ') ++ size = i + 1; ++ ++ return size; ++} ++ ++static bool sfp_match(const char *qs, const char *str, size_t len) ++{ ++ if (!qs) ++ return true; ++ if (strlen(qs) != len) ++ return false; ++ return !strncmp(qs, str, len); ++} ++ ++static const struct sfp_quirk *sfp_lookup_quirk(const struct sfp_eeprom_id *id) ++{ ++ const struct sfp_quirk *q; ++ unsigned int i; ++ size_t vs, ps; ++ ++ vs = sfp_strlen(id->base.vendor_name, ARRAY_SIZE(id->base.vendor_name)); ++ ps = sfp_strlen(id->base.vendor_pn, ARRAY_SIZE(id->base.vendor_pn)); ++ ++ for (i = 0, q = sfp_quirks; i < ARRAY_SIZE(sfp_quirks); i++, q++) ++ if (sfp_match(q->vendor, id->base.vendor_name, vs) && ++ sfp_match(q->part, id->base.vendor_pn, ps)) ++ return q; ++ ++ return NULL; ++} ++ + static unsigned long poll_jiffies; + + static unsigned int sfp_gpio_get_state(struct sfp *sfp) +@@ -1966,6 +2055,8 @@ static int sfp_sm_mod_probe(struct sfp * + else + sfp->tx_fault_ignore = false; + ++ sfp->quirk = sfp_lookup_quirk(&id); ++ + return 0; + } + +@@ -2077,7 +2168,8 @@ static void sfp_sm_module(struct sfp *sf + break; + + /* Report the module insertion to the upstream device */ +- err = sfp_module_insert(sfp->sfp_bus, &sfp->id); ++ err = sfp_module_insert(sfp->sfp_bus, &sfp->id, ++ sfp->quirk); + if (err < 0) { + sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0); + break; +--- a/drivers/net/phy/sfp.h ++++ b/drivers/net/phy/sfp.h +@@ -6,6 +6,12 @@ + + struct sfp; + ++struct sfp_quirk { ++ const char *vendor; ++ const char *part; ++ void (*modes)(const struct sfp_eeprom_id *id, unsigned long *modes); ++}; ++ + struct sfp_socket_ops { + void (*attach)(struct sfp *sfp); + void (*detach)(struct sfp *sfp); +@@ -23,7 +29,8 @@ int sfp_add_phy(struct sfp_bus *bus, str + void sfp_remove_phy(struct sfp_bus *bus); + void sfp_link_up(struct sfp_bus *bus); + void sfp_link_down(struct sfp_bus *bus); +-int sfp_module_insert(struct sfp_bus *bus, const struct sfp_eeprom_id *id); ++int sfp_module_insert(struct sfp_bus *bus, const struct sfp_eeprom_id *id, ++ const struct sfp_quirk *quirk); + void sfp_module_remove(struct sfp_bus *bus); + int sfp_module_start(struct sfp_bus *bus); + void sfp_module_stop(struct sfp_bus *bus); diff --git a/target/linux/generic/backport-5.15/785-v6.1-net-sfp-move-Alcatel-Lucent-3FE46541AA-fixup.patch b/target/linux/generic/backport-5.15/785-v6.1-net-sfp-move-Alcatel-Lucent-3FE46541AA-fixup.patch new file mode 100644 index 0000000000..b076676cff --- /dev/null +++ b/target/linux/generic/backport-5.15/785-v6.1-net-sfp-move-Alcatel-Lucent-3FE46541AA-fixup.patch @@ -0,0 +1,69 @@ +From 275416754e9a262c97a1ad6f806a4bc6e0464aa2 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 13 Sep 2022 20:06:37 +0100 +Subject: [PATCH 1/1] net: sfp: move Alcatel Lucent 3FE46541AA fixup + +Add a new fixup mechanism to the SFP quirks, and use it for this +module. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/sfp.c | 14 +++++++++----- + drivers/net/phy/sfp.h | 1 + + 2 files changed, 10 insertions(+), 5 deletions(-) + +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -317,6 +317,11 @@ static const struct of_device_id sfp_of_ + }; + MODULE_DEVICE_TABLE(of, sfp_of_match); + ++static void sfp_fixup_long_startup(struct sfp *sfp) ++{ ++ sfp->module_t_start_up = T_START_UP_BAD_GPON; ++} ++ + static void sfp_quirk_2500basex(const struct sfp_eeprom_id *id, + unsigned long *modes) + { +@@ -347,6 +352,7 @@ static const struct sfp_quirk sfp_quirks + .vendor = "ALCATELLUCENT", + .part = "3FE46541AA", + .modes = sfp_quirk_2500basex, ++ .fixup = sfp_fixup_long_startup, + }, { + // Huawei MA5671A can operate at 2500base-X, but report 1.2GBd + // NRZ in their EEPROM +@@ -2043,11 +2049,7 @@ static int sfp_sm_mod_probe(struct sfp * + if (sfp->gpio[GPIO_LOS]) + sfp->state_hw_mask |= SFP_F_LOS; + +- if (!memcmp(id.base.vendor_name, "ALCATELLUCENT ", 16) && +- !memcmp(id.base.vendor_pn, "3FE46541AA ", 16)) +- sfp->module_t_start_up = T_START_UP_BAD_GPON; +- else +- sfp->module_t_start_up = T_START_UP; ++ sfp->module_t_start_up = T_START_UP; + + if (!memcmp(id.base.vendor_name, "HUAWEI ", 16) && + !memcmp(id.base.vendor_pn, "MA5671A ", 16)) +@@ -2056,6 +2058,8 @@ static int sfp_sm_mod_probe(struct sfp * + sfp->tx_fault_ignore = false; + + sfp->quirk = sfp_lookup_quirk(&id); ++ if (sfp->quirk && sfp->quirk->fixup) ++ sfp->quirk->fixup(sfp); + + return 0; + } +--- a/drivers/net/phy/sfp.h ++++ b/drivers/net/phy/sfp.h +@@ -10,6 +10,7 @@ struct sfp_quirk { + const char *vendor; + const char *part; + void (*modes)(const struct sfp_eeprom_id *id, unsigned long *modes); ++ void (*fixup)(struct sfp *sfp); + }; + + struct sfp_socket_ops { diff --git a/target/linux/generic/backport-5.15/786-v6.1-net-sfp-move-Huawei-MA5671A-fixup.patch b/target/linux/generic/backport-5.15/786-v6.1-net-sfp-move-Huawei-MA5671A-fixup.patch new file mode 100644 index 0000000000..7f856e5b5b --- /dev/null +++ b/target/linux/generic/backport-5.15/786-v6.1-net-sfp-move-Huawei-MA5671A-fixup.patch @@ -0,0 +1,48 @@ +From 5029be761161374a3624aa7b4670174c35449bf5 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 13 Sep 2022 20:06:42 +0100 +Subject: [PATCH 1/1] net: sfp: move Huawei MA5671A fixup + +Move this module over to the new fixup mechanism. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/sfp.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -322,6 +322,11 @@ static void sfp_fixup_long_startup(struc + sfp->module_t_start_up = T_START_UP_BAD_GPON; + } + ++static void sfp_fixup_ignore_tx_fault(struct sfp *sfp) ++{ ++ sfp->tx_fault_ignore = true; ++} ++ + static void sfp_quirk_2500basex(const struct sfp_eeprom_id *id, + unsigned long *modes) + { +@@ -359,6 +364,7 @@ static const struct sfp_quirk sfp_quirks + .vendor = "HUAWEI", + .part = "MA5671A", + .modes = sfp_quirk_2500basex, ++ .fixup = sfp_fixup_ignore_tx_fault, + }, { + // Lantech 8330-262D-E can operate at 2500base-X, but + // incorrectly report 2500MBd NRZ in their EEPROM +@@ -2051,11 +2057,7 @@ static int sfp_sm_mod_probe(struct sfp * + + sfp->module_t_start_up = T_START_UP; + +- if (!memcmp(id.base.vendor_name, "HUAWEI ", 16) && +- !memcmp(id.base.vendor_pn, "MA5671A ", 16)) +- sfp->tx_fault_ignore = true; +- else +- sfp->tx_fault_ignore = false; ++ sfp->tx_fault_ignore = false; + + sfp->quirk = sfp_lookup_quirk(&id); + if (sfp->quirk && sfp->quirk->fixup) diff --git a/target/linux/generic/backport-5.15/787-v6.1-net-sfp-add-support-for-HALNy-GPON-SFP.patch b/target/linux/generic/backport-5.15/787-v6.1-net-sfp-add-support-for-HALNy-GPON-SFP.patch new file mode 100644 index 0000000000..81108e19c1 --- /dev/null +++ b/target/linux/generic/backport-5.15/787-v6.1-net-sfp-add-support-for-HALNy-GPON-SFP.patch @@ -0,0 +1,79 @@ +From 73472c830eae5fce2107f7f086f1e6827d215caf Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Tue, 13 Sep 2022 20:06:48 +0100 +Subject: [PATCH 1/1] net: sfp: add support for HALNy GPON SFP + +Add a quirk for the HALNy HL-GSFP module, which appears to have an +inverted RX_LOS signal, and maybe uses TX_FAULT as a serial port +transmit pin. Rather than use these hardware signals, switch to +using software polling for these status signals. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/sfp-bus.c | 2 +- + drivers/net/phy/sfp.c | 21 ++++++++++++++++++--- + 2 files changed, 19 insertions(+), 4 deletions(-) + +--- a/drivers/net/phy/sfp-bus.c ++++ b/drivers/net/phy/sfp-bus.c +@@ -283,7 +283,7 @@ void sfp_parse_support(struct sfp_bus *b + phylink_set(modes, 2500baseX_Full); + } + +- if (bus->sfp_quirk) ++ if (bus->sfp_quirk && bus->sfp_quirk->modes) + bus->sfp_quirk->modes(id, modes); + + linkmode_or(support, support, modes); +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -327,6 +327,15 @@ static void sfp_fixup_ignore_tx_fault(st + sfp->tx_fault_ignore = true; + } + ++static void sfp_fixup_halny_gsfp(struct sfp *sfp) ++{ ++ /* Ignore the TX_FAULT and LOS signals on this module. ++ * these are possibly used for other purposes on this ++ * module, e.g. a serial port. ++ */ ++ sfp->state_hw_mask &= ~(SFP_F_TX_FAULT | SFP_F_LOS); ++} ++ + static void sfp_quirk_2500basex(const struct sfp_eeprom_id *id, + unsigned long *modes) + { +@@ -359,6 +368,10 @@ static const struct sfp_quirk sfp_quirks + .modes = sfp_quirk_2500basex, + .fixup = sfp_fixup_long_startup, + }, { ++ .vendor = "HALNy", ++ .part = "HL-GSFP", ++ .fixup = sfp_fixup_halny_gsfp, ++ }, { + // Huawei MA5671A can operate at 2500base-X, but report 1.2GBd + // NRZ in their EEPROM + .vendor = "HUAWEI", +@@ -375,16 +388,18 @@ static const struct sfp_quirk sfp_quirks + .vendor = "UBNT", + .part = "UF-INSTANT", + .modes = sfp_quirk_ubnt_uf_instant, +- }, ++ } + }; + + static size_t sfp_strlen(const char *str, size_t maxlen) + { + size_t size, i; + +- /* Trailing characters should be filled with space chars */ ++ /* Trailing characters should be filled with space chars, but ++ * some manufacturers can't read SFF-8472 and use NUL. ++ */ + for (i = 0, size = 0; i < maxlen; i++) +- if (str[i] != ' ') ++ if (str[i] != ' ' && str[i] != '\0') + size = i + 1; + + return size; diff --git a/target/linux/generic/backport-5.15/788-v6.3-net-dsa-mt7530-use-external-PCS-driver.patch b/target/linux/generic/backport-5.15/788-v6.3-net-dsa-mt7530-use-external-PCS-driver.patch new file mode 100644 index 0000000000..2642cd4faf --- /dev/null +++ b/target/linux/generic/backport-5.15/788-v6.3-net-dsa-mt7530-use-external-PCS-driver.patch @@ -0,0 +1,514 @@ +From patchwork Thu Mar 9 10:57:44 2023 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +X-Patchwork-Submitter: Daniel Golle +X-Patchwork-Id: 13167235 +X-Patchwork-Delegate: kuba@kernel.org +Return-Path: +Date: Thu, 9 Mar 2023 10:57:44 +0000 +From: Daniel Golle +To: netdev@vger.kernel.org, linux-mediatek@lists.infradead.org, + linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, + Russell King , + Heiner Kallweit , + Lorenzo Bianconi , + Mark Lee , + John Crispin , Felix Fietkau , + AngeloGioacchino Del Regno + , + Matthias Brugger , + DENG Qingfang , + Landen Chao , + Sean Wang , + Paolo Abeni , + Jakub Kicinski , + Eric Dumazet , + "David S. Miller" , + Vladimir Oltean , + Florian Fainelli , + Andrew Lunn , + Vladimir Oltean +Cc: =?iso-8859-1?q?Bj=F8rn?= Mork , + Frank Wunderlich , + Alexander Couzens +Subject: [PATCH net-next v13 11/16] net: dsa: mt7530: use external PCS driver +Message-ID: + <2ac2ee40d3b0e705461b50613fda6a7edfdbc4b3.1678357225.git.daniel@makrotopia.org> +References: +MIME-Version: 1.0 +Content-Disposition: inline +In-Reply-To: +Precedence: bulk +List-ID: +X-Mailing-List: netdev@vger.kernel.org +X-Patchwork-Delegate: kuba@kernel.org + +Implement regmap access wrappers, for now only to be used by the +pcs-mtk driver. +Make use of external PCS driver and drop the reduntant implementation +in mt7530.c. +As a nice side effect the SGMII registers can now also more easily be +inspected for debugging via /sys/kernel/debug/regmap. + +Reviewed-by: Russell King (Oracle) +Tested-by: Bjørn Mork +Signed-off-by: Daniel Golle +Tested-by: Frank Wunderlich +--- + drivers/net/dsa/Kconfig | 1 + + drivers/net/dsa/mt7530.c | 277 ++++++++++----------------------------- + drivers/net/dsa/mt7530.h | 47 +------ + 3 files changed, 71 insertions(+), 254 deletions(-) + +--- a/drivers/net/dsa/Kconfig ++++ b/drivers/net/dsa/Kconfig +@@ -37,6 +37,7 @@ config NET_DSA_MT7530 + tristate "MediaTek MT753x and MT7621 Ethernet switch support" + select NET_DSA_TAG_MTK + select MEDIATEK_GE_PHY ++ select PCS_MTK_LYNXI + help + This enables support for the MediaTek MT7530, MT7531, and MT7621 + Ethernet switch chips. +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -2598,128 +2599,11 @@ static int mt7531_rgmii_setup(struct mt7 + return 0; + } + +-static void mt7531_pcs_link_up(struct phylink_pcs *pcs, unsigned int mode, +- phy_interface_t interface, int speed, int duplex) +-{ +- struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv; +- int port = pcs_to_mt753x_pcs(pcs)->port; +- unsigned int val; +- +- /* For adjusting speed and duplex of SGMII force mode. */ +- if (interface != PHY_INTERFACE_MODE_SGMII || +- phylink_autoneg_inband(mode)) +- return; +- +- /* SGMII force mode setting */ +- val = mt7530_read(priv, MT7531_SGMII_MODE(port)); +- val &= ~MT7531_SGMII_IF_MODE_MASK; +- +- switch (speed) { +- case SPEED_10: +- val |= MT7531_SGMII_FORCE_SPEED_10; +- break; +- case SPEED_100: +- val |= MT7531_SGMII_FORCE_SPEED_100; +- break; +- case SPEED_1000: +- val |= MT7531_SGMII_FORCE_SPEED_1000; +- break; +- } +- +- /* MT7531 SGMII 1G force mode can only work in full duplex mode, +- * no matter MT7531_SGMII_FORCE_HALF_DUPLEX is set or not. +- * +- * The speed check is unnecessary as the MAC capabilities apply +- * this restriction. --rmk +- */ +- if ((speed == SPEED_10 || speed == SPEED_100) && +- duplex != DUPLEX_FULL) +- val |= MT7531_SGMII_FORCE_HALF_DUPLEX; +- +- mt7530_write(priv, MT7531_SGMII_MODE(port), val); +-} +- + static bool mt753x_is_mac_port(u32 port) + { + return (port == 5 || port == 6); + } + +-static int mt7531_sgmii_setup_mode_force(struct mt7530_priv *priv, u32 port, +- phy_interface_t interface) +-{ +- u32 val; +- +- if (!mt753x_is_mac_port(port)) +- return -EINVAL; +- +- mt7530_set(priv, MT7531_QPHY_PWR_STATE_CTRL(port), +- MT7531_SGMII_PHYA_PWD); +- +- val = mt7530_read(priv, MT7531_PHYA_CTRL_SIGNAL3(port)); +- val &= ~MT7531_RG_TPHY_SPEED_MASK; +- /* Setup 2.5 times faster clock for 2.5Gbps data speeds with 10B/8B +- * encoding. +- */ +- val |= (interface == PHY_INTERFACE_MODE_2500BASEX) ? +- MT7531_RG_TPHY_SPEED_3_125G : MT7531_RG_TPHY_SPEED_1_25G; +- mt7530_write(priv, MT7531_PHYA_CTRL_SIGNAL3(port), val); +- +- mt7530_clear(priv, MT7531_PCS_CONTROL_1(port), MT7531_SGMII_AN_ENABLE); +- +- /* MT7531 SGMII 1G and 2.5G force mode can only work in full duplex +- * mode, no matter MT7531_SGMII_FORCE_HALF_DUPLEX is set or not. +- */ +- mt7530_rmw(priv, MT7531_SGMII_MODE(port), +- MT7531_SGMII_IF_MODE_MASK | MT7531_SGMII_REMOTE_FAULT_DIS, +- MT7531_SGMII_FORCE_SPEED_1000); +- +- mt7530_write(priv, MT7531_QPHY_PWR_STATE_CTRL(port), 0); +- +- return 0; +-} +- +-static int mt7531_sgmii_setup_mode_an(struct mt7530_priv *priv, int port, +- phy_interface_t interface) +-{ +- if (!mt753x_is_mac_port(port)) +- return -EINVAL; +- +- mt7530_set(priv, MT7531_QPHY_PWR_STATE_CTRL(port), +- MT7531_SGMII_PHYA_PWD); +- +- mt7530_rmw(priv, MT7531_PHYA_CTRL_SIGNAL3(port), +- MT7531_RG_TPHY_SPEED_MASK, MT7531_RG_TPHY_SPEED_1_25G); +- +- mt7530_set(priv, MT7531_SGMII_MODE(port), +- MT7531_SGMII_REMOTE_FAULT_DIS | +- MT7531_SGMII_SPEED_DUPLEX_AN); +- +- mt7530_rmw(priv, MT7531_PCS_SPEED_ABILITY(port), +- MT7531_SGMII_TX_CONFIG_MASK, 1); +- +- mt7530_set(priv, MT7531_PCS_CONTROL_1(port), MT7531_SGMII_AN_ENABLE); +- +- mt7530_set(priv, MT7531_PCS_CONTROL_1(port), MT7531_SGMII_AN_RESTART); +- +- mt7530_write(priv, MT7531_QPHY_PWR_STATE_CTRL(port), 0); +- +- return 0; +-} +- +-static void mt7531_pcs_an_restart(struct phylink_pcs *pcs) +-{ +- struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv; +- int port = pcs_to_mt753x_pcs(pcs)->port; +- u32 val; +- +- /* Only restart AN when AN is enabled */ +- val = mt7530_read(priv, MT7531_PCS_CONTROL_1(port)); +- if (val & MT7531_SGMII_AN_ENABLE) { +- val |= MT7531_SGMII_AN_RESTART; +- mt7530_write(priv, MT7531_PCS_CONTROL_1(port), val); +- } +-} +- + static int + mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode, + phy_interface_t interface) +@@ -2742,11 +2626,11 @@ mt7531_mac_config(struct dsa_switch *ds, + phydev = dp->slave->phydev; + return mt7531_rgmii_setup(priv, port, interface, phydev); + case PHY_INTERFACE_MODE_SGMII: +- return mt7531_sgmii_setup_mode_an(priv, port, interface); + case PHY_INTERFACE_MODE_NA: + case PHY_INTERFACE_MODE_1000BASEX: + case PHY_INTERFACE_MODE_2500BASEX: +- return mt7531_sgmii_setup_mode_force(priv, port, interface); ++ /* handled in SGMII PCS driver */ ++ return 0; + default: + return -EINVAL; + } +@@ -2771,11 +2655,11 @@ mt753x_phylink_mac_select_pcs(struct dsa + + switch (interface) { + case PHY_INTERFACE_MODE_TRGMII: ++ return &priv->pcs[port].pcs; + case PHY_INTERFACE_MODE_SGMII: + case PHY_INTERFACE_MODE_1000BASEX: + case PHY_INTERFACE_MODE_2500BASEX: +- return &priv->pcs[port].pcs; +- ++ return priv->ports[port].sgmii_pcs; + default: + return NULL; + } +@@ -3016,86 +2900,6 @@ static void mt7530_pcs_get_state(struct + state->pause |= MLO_PAUSE_TX; + } + +-static int +-mt7531_sgmii_pcs_get_state_an(struct mt7530_priv *priv, int port, +- struct phylink_link_state *state) +-{ +- u32 status, val; +- u16 config_reg; +- +- status = mt7530_read(priv, MT7531_PCS_CONTROL_1(port)); +- state->link = !!(status & MT7531_SGMII_LINK_STATUS); +- state->an_complete = !!(status & MT7531_SGMII_AN_COMPLETE); +- if (state->interface == PHY_INTERFACE_MODE_SGMII && +- (status & MT7531_SGMII_AN_ENABLE)) { +- val = mt7530_read(priv, MT7531_PCS_SPEED_ABILITY(port)); +- config_reg = val >> 16; +- +- switch (config_reg & LPA_SGMII_SPD_MASK) { +- case LPA_SGMII_1000: +- state->speed = SPEED_1000; +- break; +- case LPA_SGMII_100: +- state->speed = SPEED_100; +- break; +- case LPA_SGMII_10: +- state->speed = SPEED_10; +- break; +- default: +- dev_err(priv->dev, "invalid sgmii PHY speed\n"); +- state->link = false; +- return -EINVAL; +- } +- +- if (config_reg & LPA_SGMII_FULL_DUPLEX) +- state->duplex = DUPLEX_FULL; +- else +- state->duplex = DUPLEX_HALF; +- } +- +- return 0; +-} +- +-static void +-mt7531_sgmii_pcs_get_state_inband(struct mt7530_priv *priv, int port, +- struct phylink_link_state *state) +-{ +- unsigned int val; +- +- val = mt7530_read(priv, MT7531_PCS_CONTROL_1(port)); +- state->link = !!(val & MT7531_SGMII_LINK_STATUS); +- if (!state->link) +- return; +- +- state->an_complete = state->link; +- +- if (state->interface == PHY_INTERFACE_MODE_2500BASEX) +- state->speed = SPEED_2500; +- else +- state->speed = SPEED_1000; +- +- state->duplex = DUPLEX_FULL; +- state->pause = MLO_PAUSE_NONE; +-} +- +-static void mt7531_pcs_get_state(struct phylink_pcs *pcs, +- struct phylink_link_state *state) +-{ +- struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv; +- int port = pcs_to_mt753x_pcs(pcs)->port; +- +- if (state->interface == PHY_INTERFACE_MODE_SGMII) { +- mt7531_sgmii_pcs_get_state_an(priv, port, state); +- return; +- } else if ((state->interface == PHY_INTERFACE_MODE_1000BASEX) || +- (state->interface == PHY_INTERFACE_MODE_2500BASEX)) { +- mt7531_sgmii_pcs_get_state_inband(priv, port, state); +- return; +- } +- +- state->link = false; +-} +- + static int mt753x_pcs_config(struct phylink_pcs *pcs, unsigned int mode, + phy_interface_t interface, + const unsigned long *advertising, +@@ -3115,18 +2919,57 @@ static const struct phylink_pcs_ops mt75 + .pcs_an_restart = mt7530_pcs_an_restart, + }; + +-static const struct phylink_pcs_ops mt7531_pcs_ops = { +- .pcs_validate = mt753x_pcs_validate, +- .pcs_get_state = mt7531_pcs_get_state, +- .pcs_config = mt753x_pcs_config, +- .pcs_an_restart = mt7531_pcs_an_restart, +- .pcs_link_up = mt7531_pcs_link_up, ++static int mt7530_regmap_read(void *context, unsigned int reg, unsigned int *val) ++{ ++ struct mt7530_priv *priv = context; ++ ++ *val = mt7530_read(priv, reg); ++ return 0; ++}; ++ ++static int mt7530_regmap_write(void *context, unsigned int reg, unsigned int val) ++{ ++ struct mt7530_priv *priv = context; ++ ++ mt7530_write(priv, reg, val); ++ return 0; ++}; ++ ++static int mt7530_regmap_update_bits(void *context, unsigned int reg, ++ unsigned int mask, unsigned int val) ++{ ++ struct mt7530_priv *priv = context; ++ ++ mt7530_rmw(priv, reg, mask, val); ++ return 0; ++}; ++ ++static const struct regmap_bus mt7531_regmap_bus = { ++ .reg_write = mt7530_regmap_write, ++ .reg_read = mt7530_regmap_read, ++ .reg_update_bits = mt7530_regmap_update_bits, ++}; ++ ++#define MT7531_PCS_REGMAP_CONFIG(_name, _reg_base) \ ++ { \ ++ .name = _name, \ ++ .reg_bits = 16, \ ++ .val_bits = 32, \ ++ .reg_stride = 4, \ ++ .reg_base = _reg_base, \ ++ .max_register = 0x17c, \ ++ } ++ ++static const struct regmap_config mt7531_pcs_config[] = { ++ MT7531_PCS_REGMAP_CONFIG("port5", MT7531_SGMII_REG_BASE(5)), ++ MT7531_PCS_REGMAP_CONFIG("port6", MT7531_SGMII_REG_BASE(6)), + }; + + static int + mt753x_setup(struct dsa_switch *ds) + { + struct mt7530_priv *priv = ds->priv; ++ struct regmap *regmap; + int i, ret; + + /* Initialise the PCS devices */ +@@ -3134,8 +2977,6 @@ mt753x_setup(struct dsa_switch *ds) + priv->pcs[i].pcs.ops = priv->info->pcs_ops; + priv->pcs[i].priv = priv; + priv->pcs[i].port = i; +- if (mt753x_is_mac_port(i)) +- priv->pcs[i].pcs.poll = 1; + } + + ret = priv->info->sw_setup(ds); +@@ -3150,6 +2991,16 @@ mt753x_setup(struct dsa_switch *ds) + if (ret && priv->irq) + mt7530_free_irq_common(priv); + ++ if (priv->id == ID_MT7531) ++ for (i = 0; i < 2; i++) { ++ regmap = devm_regmap_init(ds->dev, ++ &mt7531_regmap_bus, priv, ++ &mt7531_pcs_config[i]); ++ priv->ports[5 + i].sgmii_pcs = ++ mtk_pcs_lynxi_create(ds->dev, regmap, ++ MT7531_PHYA_CTRL_SIGNAL3, 0); ++ } ++ + return ret; + } + +@@ -3241,7 +3092,7 @@ static const struct mt753x_info mt753x_t + }, + [ID_MT7531] = { + .id = ID_MT7531, +- .pcs_ops = &mt7531_pcs_ops, ++ .pcs_ops = &mt7530_pcs_ops, + .sw_setup = mt7531_setup, + .phy_read = mt7531_ind_phy_read, + .phy_write = mt7531_ind_phy_write, +@@ -3349,7 +3200,7 @@ static void + mt7530_remove(struct mdio_device *mdiodev) + { + struct mt7530_priv *priv = dev_get_drvdata(&mdiodev->dev); +- int ret = 0; ++ int ret = 0, i; + + if (!priv) + return; +@@ -3368,6 +3219,10 @@ mt7530_remove(struct mdio_device *mdiode + mt7530_free_irq(priv); + + dsa_unregister_switch(priv->ds); ++ ++ for (i = 0; i < 2; ++i) ++ mtk_pcs_lynxi_destroy(priv->ports[5 + i].sgmii_pcs); ++ + mutex_destroy(&priv->reg_mutex); + + dev_set_drvdata(&mdiodev->dev, NULL); +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -364,47 +364,8 @@ enum mt7530_vlan_port_acc_frm { + CCR_TX_OCT_CNT_BAD) + + /* MT7531 SGMII register group */ +-#define MT7531_SGMII_REG_BASE 0x5000 +-#define MT7531_SGMII_REG(p, r) (MT7531_SGMII_REG_BASE + \ +- ((p) - 5) * 0x1000 + (r)) +- +-/* Register forSGMII PCS_CONTROL_1 */ +-#define MT7531_PCS_CONTROL_1(p) MT7531_SGMII_REG(p, 0x00) +-#define MT7531_SGMII_LINK_STATUS BIT(18) +-#define MT7531_SGMII_AN_ENABLE BIT(12) +-#define MT7531_SGMII_AN_RESTART BIT(9) +-#define MT7531_SGMII_AN_COMPLETE BIT(21) +- +-/* Register for SGMII PCS_SPPED_ABILITY */ +-#define MT7531_PCS_SPEED_ABILITY(p) MT7531_SGMII_REG(p, 0x08) +-#define MT7531_SGMII_TX_CONFIG_MASK GENMASK(15, 0) +-#define MT7531_SGMII_TX_CONFIG BIT(0) +- +-/* Register for SGMII_MODE */ +-#define MT7531_SGMII_MODE(p) MT7531_SGMII_REG(p, 0x20) +-#define MT7531_SGMII_REMOTE_FAULT_DIS BIT(8) +-#define MT7531_SGMII_IF_MODE_MASK GENMASK(5, 1) +-#define MT7531_SGMII_FORCE_DUPLEX BIT(4) +-#define MT7531_SGMII_FORCE_SPEED_MASK GENMASK(3, 2) +-#define MT7531_SGMII_FORCE_SPEED_1000 BIT(3) +-#define MT7531_SGMII_FORCE_SPEED_100 BIT(2) +-#define MT7531_SGMII_FORCE_SPEED_10 0 +-#define MT7531_SGMII_SPEED_DUPLEX_AN BIT(1) +- +-enum mt7531_sgmii_force_duplex { +- MT7531_SGMII_FORCE_FULL_DUPLEX = 0, +- MT7531_SGMII_FORCE_HALF_DUPLEX = 0x10, +-}; +- +-/* Fields of QPHY_PWR_STATE_CTRL */ +-#define MT7531_QPHY_PWR_STATE_CTRL(p) MT7531_SGMII_REG(p, 0xe8) +-#define MT7531_SGMII_PHYA_PWD BIT(4) +- +-/* Values of SGMII SPEED */ +-#define MT7531_PHYA_CTRL_SIGNAL3(p) MT7531_SGMII_REG(p, 0x128) +-#define MT7531_RG_TPHY_SPEED_MASK (BIT(2) | BIT(3)) +-#define MT7531_RG_TPHY_SPEED_1_25G 0x0 +-#define MT7531_RG_TPHY_SPEED_3_125G BIT(2) ++#define MT7531_SGMII_REG_BASE(p) (0x5000 + ((p) - 5) * 0x1000) ++#define MT7531_PHYA_CTRL_SIGNAL3 0x128 + + /* Register for system reset */ + #define MT7530_SYS_CTRL 0x7000 +@@ -703,13 +664,13 @@ struct mt7530_fdb { + * @pm: The matrix used to show all connections with the port. + * @pvid: The VLAN specified is to be considered a PVID at ingress. Any + * untagged frames will be assigned to the related VLAN. +- * @vlan_filtering: The flags indicating whether the port that can recognize +- * VLAN-tagged frames. ++ * @sgmii_pcs: Pointer to PCS instance for SerDes ports + */ + struct mt7530_port { + bool enable; + u32 pm; + u16 pvid; ++ struct phylink_pcs *sgmii_pcs; + }; + + /* Port 5 interface select definitions */ diff --git a/target/linux/generic/backport-5.15/789-v6.3-net-sfp-add-quirk-enabling-2500Base-x-for-HG-MXPD-48.patch b/target/linux/generic/backport-5.15/789-v6.3-net-sfp-add-quirk-enabling-2500Base-x-for-HG-MXPD-48.patch new file mode 100644 index 0000000000..413c73f547 --- /dev/null +++ b/target/linux/generic/backport-5.15/789-v6.3-net-sfp-add-quirk-enabling-2500Base-x-for-HG-MXPD-48.patch @@ -0,0 +1,37 @@ +From ad651d68cee75e9ac20002254c4e5d09ee67a84b Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sun, 2 Apr 2023 12:44:37 +0100 +Subject: [PATCH] net: sfp: add quirk enabling 2500Base-x for HG MXPD-483II + +The HG MXPD-483II 1310nm SFP module is meant to operate with 2500Base-X, +however, in their EEPROM they incorrectly specify: + Transceiver type : Ethernet: 1000BASE-LX + ... + BR, Nominal : 2600MBd + +Use sfp_quirk_2500basex for this module to allow 2500Base-X mode anyway. + +https://forum.banana-pi.org/t/bpi-r3-sfp-module-compatibility/14573/60 + +Reported-by: chowtom +Tested-by: chowtom +Signed-off-by: Daniel Golle +Reviewed-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/phy/sfp.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -372,6 +372,10 @@ static const struct sfp_quirk sfp_quirks + .part = "HL-GSFP", + .fixup = sfp_fixup_halny_gsfp, + }, { ++ .vendor = "HG GENUINE", ++ .part = "MXPD-483II", ++ .modes = sfp_quirk_2500basex, ++ }, { + // Huawei MA5671A can operate at 2500base-X, but report 1.2GBd + // NRZ in their EEPROM + .vendor = "HUAWEI", diff --git a/target/linux/generic/backport-5.15/790-v6.0-net-mii-add-mii_bmcr_encode_fixed.patch b/target/linux/generic/backport-5.15/790-v6.0-net-mii-add-mii_bmcr_encode_fixed.patch new file mode 100644 index 0000000000..87d7ff6154 --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.0-net-mii-add-mii_bmcr_encode_fixed.patch @@ -0,0 +1,55 @@ +From bdb6cfe7512f7a214815a3092f0be50963dcacbc Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Sat, 18 Jun 2022 11:28:32 +0100 +Subject: [PATCH] net: mii: add mii_bmcr_encode_fixed() + +Add a function to encode a fixed speed/duplex to a BMCR value. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + include/linux/mii.h | 35 +++++++++++++++++++++++++++++++++++ + 1 file changed, 35 insertions(+) + +--- a/include/linux/mii.h ++++ b/include/linux/mii.h +@@ -595,4 +595,39 @@ static inline u8 mii_resolve_flowctrl_fd + return cap; + } + ++/** ++ * mii_bmcr_encode_fixed - encode fixed speed/duplex settings to a BMCR value ++ * @speed: a SPEED_* value ++ * @duplex: a DUPLEX_* value ++ * ++ * Encode the speed and duplex to a BMCR value. 2500, 1000, 100 and 10 Mbps are ++ * supported. 2500Mbps is encoded to 1000Mbps. Other speeds are encoded as 10 ++ * Mbps. Unknown duplex values are encoded to half-duplex. ++ */ ++static inline u16 mii_bmcr_encode_fixed(int speed, int duplex) ++{ ++ u16 bmcr; ++ ++ switch (speed) { ++ case SPEED_2500: ++ case SPEED_1000: ++ bmcr = BMCR_SPEED1000; ++ break; ++ ++ case SPEED_100: ++ bmcr = BMCR_SPEED100; ++ break; ++ ++ case SPEED_10: ++ default: ++ bmcr = BMCR_SPEED10; ++ break; ++ } ++ ++ if (duplex == DUPLEX_FULL) ++ bmcr |= BMCR_FULLDPLX; ++ ++ return bmcr; ++} ++ + #endif /* __LINUX_MII_H__ */ diff --git a/target/linux/generic/backport-5.15/790-v6.4-0001-net-dsa-mt7530-make-some-noise-if-register-read-fail.patch b/target/linux/generic/backport-5.15/790-v6.4-0001-net-dsa-mt7530-make-some-noise-if-register-read-fail.patch new file mode 100644 index 0000000000..ffbdde5a57 --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0001-net-dsa-mt7530-make-some-noise-if-register-read-fail.patch @@ -0,0 +1,32 @@ +From b6f56cddb5f57a0b8da0ce582232a2f1933558c6 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:17:19 +0100 +Subject: [PATCH 04/16] net: dsa: mt7530: make some noise if register read + fails + +Simply returning the negative error value instead of the read value +doesn't seem like a good idea. Return 0 instead and add WARN_ON_ONCE(1) +so this kind of error will not go unnoticed. + +Suggested-by: Andrew Lunn +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mt7530.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -224,9 +224,10 @@ mt7530_mii_read(struct mt7530_priv *priv + /* MT7530 uses 31 as the pseudo port */ + ret = bus->write(bus, 0x1f, 0x1f, page); + if (ret < 0) { ++ WARN_ON_ONCE(1); + dev_err(&bus->dev, + "failed to read mt7530 register\n"); +- return ret; ++ return 0; + } + + lo = bus->read(bus, 0x1f, r); diff --git a/target/linux/generic/backport-5.15/790-v6.4-0002-net-dsa-mt7530-refactor-SGMII-PCS-creation.patch b/target/linux/generic/backport-5.15/790-v6.4-0002-net-dsa-mt7530-refactor-SGMII-PCS-creation.patch new file mode 100644 index 0000000000..983423aaff --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0002-net-dsa-mt7530-refactor-SGMII-PCS-creation.patch @@ -0,0 +1,111 @@ +From 9ecc00164dc2300dfcd40afe549a8ee951dfea9f Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:17:30 +0100 +Subject: [PATCH 05/16] net: dsa: mt7530: refactor SGMII PCS creation + +Instead of macro templates use a dedidated function and allocated +regmap_config when creating the regmaps for the pcs-mtk-lynxi +instances. +This is in preparation to switching to use unlocked regmap accessors +and have regmap's locking API handle locking for us. + +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mt7530.c | 74 +++++++++++++++++++++++++++------------- + 1 file changed, 50 insertions(+), 24 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2951,26 +2951,56 @@ static const struct regmap_bus mt7531_re + .reg_update_bits = mt7530_regmap_update_bits, + }; + +-#define MT7531_PCS_REGMAP_CONFIG(_name, _reg_base) \ +- { \ +- .name = _name, \ +- .reg_bits = 16, \ +- .val_bits = 32, \ +- .reg_stride = 4, \ +- .reg_base = _reg_base, \ +- .max_register = 0x17c, \ ++static int ++mt7531_create_sgmii(struct mt7530_priv *priv) ++{ ++ struct regmap_config *mt7531_pcs_config[2]; ++ struct phylink_pcs *pcs; ++ struct regmap *regmap; ++ int i, ret = 0; ++ ++ for (i = 0; i < 2; i++) { ++ mt7531_pcs_config[i] = devm_kzalloc(priv->dev, ++ sizeof(struct regmap_config), ++ GFP_KERNEL); ++ if (!mt7531_pcs_config[i]) { ++ ret = -ENOMEM; ++ break; ++ } ++ ++ mt7531_pcs_config[i]->name = i ? "port6" : "port5"; ++ mt7531_pcs_config[i]->reg_bits = 16; ++ mt7531_pcs_config[i]->val_bits = 32; ++ mt7531_pcs_config[i]->reg_stride = 4; ++ mt7531_pcs_config[i]->reg_base = MT7531_SGMII_REG_BASE(5 + i); ++ mt7531_pcs_config[i]->max_register = 0x17c; ++ ++ regmap = devm_regmap_init(priv->dev, ++ &mt7531_regmap_bus, priv, ++ mt7531_pcs_config[i]); ++ if (IS_ERR(regmap)) { ++ ret = PTR_ERR(regmap); ++ break; ++ } ++ pcs = mtk_pcs_lynxi_create(priv->dev, regmap, ++ MT7531_PHYA_CTRL_SIGNAL3, 0); ++ if (!pcs) { ++ ret = -ENXIO; ++ break; ++ } ++ priv->ports[5 + i].sgmii_pcs = pcs; + } + +-static const struct regmap_config mt7531_pcs_config[] = { +- MT7531_PCS_REGMAP_CONFIG("port5", MT7531_SGMII_REG_BASE(5)), +- MT7531_PCS_REGMAP_CONFIG("port6", MT7531_SGMII_REG_BASE(6)), +-}; ++ if (ret && i) ++ mtk_pcs_lynxi_destroy(priv->ports[5].sgmii_pcs); ++ ++ return ret; ++} + + static int + mt753x_setup(struct dsa_switch *ds) + { + struct mt7530_priv *priv = ds->priv; +- struct regmap *regmap; + int i, ret; + + /* Initialise the PCS devices */ +@@ -2992,15 +3022,11 @@ mt753x_setup(struct dsa_switch *ds) + if (ret && priv->irq) + mt7530_free_irq_common(priv); + +- if (priv->id == ID_MT7531) +- for (i = 0; i < 2; i++) { +- regmap = devm_regmap_init(ds->dev, +- &mt7531_regmap_bus, priv, +- &mt7531_pcs_config[i]); +- priv->ports[5 + i].sgmii_pcs = +- mtk_pcs_lynxi_create(ds->dev, regmap, +- MT7531_PHYA_CTRL_SIGNAL3, 0); +- } ++ if (priv->id == ID_MT7531) { ++ ret = mt7531_create_sgmii(priv); ++ if (ret && priv->irq) ++ mt7530_free_irq_common(priv); ++ } + + return ret; + } diff --git a/target/linux/generic/backport-5.15/790-v6.4-0003-net-dsa-mt7530-use-unlocked-regmap-accessors.patch b/target/linux/generic/backport-5.15/790-v6.4-0003-net-dsa-mt7530-use-unlocked-regmap-accessors.patch new file mode 100644 index 0000000000..9d8f67ba95 --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0003-net-dsa-mt7530-use-unlocked-regmap-accessors.patch @@ -0,0 +1,74 @@ +From 1bd099c49f65ed923b9f19b8c4b3cd1ff0024091 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:17:40 +0100 +Subject: [PATCH 06/16] net: dsa: mt7530: use unlocked regmap accessors + +Instead of wrapping the locked register accessor functions, use the +unlocked variants and add locking wrapper functions to let regmap +handle the locking. + +This is a preparation towards being able to always use regmap to +access switch registers instead of open-coded accessor functions. + +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mt7530.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2924,7 +2924,7 @@ static int mt7530_regmap_read(void *cont + { + struct mt7530_priv *priv = context; + +- *val = mt7530_read(priv, reg); ++ *val = mt7530_mii_read(priv, reg); + return 0; + }; + +@@ -2932,23 +2932,25 @@ static int mt7530_regmap_write(void *con + { + struct mt7530_priv *priv = context; + +- mt7530_write(priv, reg, val); ++ mt7530_mii_write(priv, reg, val); + return 0; + }; + +-static int mt7530_regmap_update_bits(void *context, unsigned int reg, +- unsigned int mask, unsigned int val) ++static void ++mt7530_mdio_regmap_lock(void *mdio_lock) + { +- struct mt7530_priv *priv = context; ++ mutex_lock_nested(mdio_lock, MDIO_MUTEX_NESTED); ++} + +- mt7530_rmw(priv, reg, mask, val); +- return 0; +-}; ++static void ++mt7530_mdio_regmap_unlock(void *mdio_lock) ++{ ++ mutex_unlock(mdio_lock); ++} + + static const struct regmap_bus mt7531_regmap_bus = { + .reg_write = mt7530_regmap_write, + .reg_read = mt7530_regmap_read, +- .reg_update_bits = mt7530_regmap_update_bits, + }; + + static int +@@ -2974,6 +2976,9 @@ mt7531_create_sgmii(struct mt7530_priv * + mt7531_pcs_config[i]->reg_stride = 4; + mt7531_pcs_config[i]->reg_base = MT7531_SGMII_REG_BASE(5 + i); + mt7531_pcs_config[i]->max_register = 0x17c; ++ mt7531_pcs_config[i]->lock = mt7530_mdio_regmap_lock; ++ mt7531_pcs_config[i]->unlock = mt7530_mdio_regmap_unlock; ++ mt7531_pcs_config[i]->lock_arg = &priv->bus->mdio_lock; + + regmap = devm_regmap_init(priv->dev, + &mt7531_regmap_bus, priv, diff --git a/target/linux/generic/backport-5.15/790-v6.4-0004-net-dsa-mt7530-use-regmap-to-access-switch-register-.patch b/target/linux/generic/backport-5.15/790-v6.4-0004-net-dsa-mt7530-use-regmap-to-access-switch-register-.patch new file mode 100644 index 0000000000..bd1d5c98a7 --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0004-net-dsa-mt7530-use-regmap-to-access-switch-register-.patch @@ -0,0 +1,224 @@ +From a08c045580e060a6886bbb656c50ae20b0c780b5 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:17:52 +0100 +Subject: [PATCH 07/16] net: dsa: mt7530: use regmap to access switch register + space + +Use regmap API to access the switch register space. + +Signed-off-by: Daniel Golle +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mt7530.c | 99 ++++++++++++++++++++++++---------------- + drivers/net/dsa/mt7530.h | 2 + + 2 files changed, 62 insertions(+), 39 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -183,9 +183,9 @@ core_clear(struct mt7530_priv *priv, u32 + } + + static int +-mt7530_mii_write(struct mt7530_priv *priv, u32 reg, u32 val) ++mt7530_regmap_write(void *context, unsigned int reg, unsigned int val) + { +- struct mii_bus *bus = priv->bus; ++ struct mii_bus *bus = context; + u16 page, r, lo, hi; + int ret; + +@@ -197,24 +197,34 @@ mt7530_mii_write(struct mt7530_priv *pri + /* MT7530 uses 31 as the pseudo port */ + ret = bus->write(bus, 0x1f, 0x1f, page); + if (ret < 0) +- goto err; ++ return ret; + + ret = bus->write(bus, 0x1f, r, lo); + if (ret < 0) +- goto err; ++ return ret; + + ret = bus->write(bus, 0x1f, 0x10, hi); +-err: ++ return ret; ++} ++ ++static int ++mt7530_mii_write(struct mt7530_priv *priv, u32 reg, u32 val) ++{ ++ int ret; ++ ++ ret = regmap_write(priv->regmap, reg, val); ++ + if (ret < 0) +- dev_err(&bus->dev, ++ dev_err(priv->dev, + "failed to write mt7530 register\n"); ++ + return ret; + } + +-static u32 +-mt7530_mii_read(struct mt7530_priv *priv, u32 reg) ++static int ++mt7530_regmap_read(void *context, unsigned int reg, unsigned int *val) + { +- struct mii_bus *bus = priv->bus; ++ struct mii_bus *bus = context; + u16 page, r, lo, hi; + int ret; + +@@ -223,17 +233,32 @@ mt7530_mii_read(struct mt7530_priv *priv + + /* MT7530 uses 31 as the pseudo port */ + ret = bus->write(bus, 0x1f, 0x1f, page); +- if (ret < 0) { ++ if (ret < 0) ++ return ret; ++ ++ lo = bus->read(bus, 0x1f, r); ++ hi = bus->read(bus, 0x1f, 0x10); ++ ++ *val = (hi << 16) | (lo & 0xffff); ++ ++ return 0; ++} ++ ++static u32 ++mt7530_mii_read(struct mt7530_priv *priv, u32 reg) ++{ ++ int ret; ++ u32 val; ++ ++ ret = regmap_read(priv->regmap, reg, &val); ++ if (ret) { + WARN_ON_ONCE(1); +- dev_err(&bus->dev, ++ dev_err(priv->dev, + "failed to read mt7530 register\n"); + return 0; + } + +- lo = bus->read(bus, 0x1f, r); +- hi = bus->read(bus, 0x1f, 0x10); +- +- return (hi << 16) | (lo & 0xffff); ++ return val; + } + + static void +@@ -283,14 +308,10 @@ mt7530_rmw(struct mt7530_priv *priv, u32 + u32 mask, u32 set) + { + struct mii_bus *bus = priv->bus; +- u32 val; + + mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); + +- val = mt7530_mii_read(priv, reg); +- val &= ~mask; +- val |= set; +- mt7530_mii_write(priv, reg, val); ++ regmap_update_bits(priv->regmap, reg, mask, set); + + mutex_unlock(&bus->mdio_lock); + } +@@ -298,7 +319,7 @@ mt7530_rmw(struct mt7530_priv *priv, u32 + static void + mt7530_set(struct mt7530_priv *priv, u32 reg, u32 val) + { +- mt7530_rmw(priv, reg, 0, val); ++ mt7530_rmw(priv, reg, val, val); + } + + static void +@@ -2920,22 +2941,6 @@ static const struct phylink_pcs_ops mt75 + .pcs_an_restart = mt7530_pcs_an_restart, + }; + +-static int mt7530_regmap_read(void *context, unsigned int reg, unsigned int *val) +-{ +- struct mt7530_priv *priv = context; +- +- *val = mt7530_mii_read(priv, reg); +- return 0; +-}; +- +-static int mt7530_regmap_write(void *context, unsigned int reg, unsigned int val) +-{ +- struct mt7530_priv *priv = context; +- +- mt7530_mii_write(priv, reg, val); +- return 0; +-}; +- + static void + mt7530_mdio_regmap_lock(void *mdio_lock) + { +@@ -2948,7 +2953,7 @@ mt7530_mdio_regmap_unlock(void *mdio_loc + mutex_unlock(mdio_lock); + } + +-static const struct regmap_bus mt7531_regmap_bus = { ++static const struct regmap_bus mt7530_regmap_bus = { + .reg_write = mt7530_regmap_write, + .reg_read = mt7530_regmap_read, + }; +@@ -2981,7 +2986,7 @@ mt7531_create_sgmii(struct mt7530_priv * + mt7531_pcs_config[i]->lock_arg = &priv->bus->mdio_lock; + + regmap = devm_regmap_init(priv->dev, +- &mt7531_regmap_bus, priv, ++ &mt7530_regmap_bus, priv->bus, + mt7531_pcs_config[i]); + if (IS_ERR(regmap)) { + ret = PTR_ERR(regmap); +@@ -3146,6 +3151,7 @@ MODULE_DEVICE_TABLE(of, mt7530_of_match) + static int + mt7530_probe(struct mdio_device *mdiodev) + { ++ static struct regmap_config *regmap_config; + struct mt7530_priv *priv; + struct device_node *dn; + +@@ -3225,6 +3231,21 @@ mt7530_probe(struct mdio_device *mdiodev + mutex_init(&priv->reg_mutex); + dev_set_drvdata(&mdiodev->dev, priv); + ++ regmap_config = devm_kzalloc(&mdiodev->dev, sizeof(*regmap_config), ++ GFP_KERNEL); ++ if (!regmap_config) ++ return -ENOMEM; ++ ++ regmap_config->reg_bits = 16; ++ regmap_config->val_bits = 32; ++ regmap_config->reg_stride = 4; ++ regmap_config->max_register = MT7530_CREV; ++ regmap_config->disable_locking = true; ++ priv->regmap = devm_regmap_init(priv->dev, &mt7530_regmap_bus, ++ priv->bus, regmap_config); ++ if (IS_ERR(priv->regmap)) ++ return PTR_ERR(priv->regmap); ++ + return dsa_register_switch(priv->ds); + } + +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -747,6 +747,7 @@ struct mt753x_info { + * @dev: The device pointer + * @ds: The pointer to the dsa core structure + * @bus: The bus used for the device and built-in PHY ++ * @regmap: The regmap instance representing all switch registers + * @rstc: The pointer to reset control used by MCM + * @core_pwr: The power supplied into the core + * @io_pwr: The power supplied into the I/O +@@ -767,6 +768,7 @@ struct mt7530_priv { + struct device *dev; + struct dsa_switch *ds; + struct mii_bus *bus; ++ struct regmap *regmap; + struct reset_control *rstc; + struct regulator *core_pwr; + struct regulator *io_pwr; diff --git a/target/linux/generic/backport-5.15/790-v6.4-0005-net-dsa-mt7530-move-SGMII-PCS-creation-to-mt7530_pro.patch b/target/linux/generic/backport-5.15/790-v6.4-0005-net-dsa-mt7530-move-SGMII-PCS-creation-to-mt7530_pro.patch new file mode 100644 index 0000000000..8c11bc3733 --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0005-net-dsa-mt7530-move-SGMII-PCS-creation-to-mt7530_pro.patch @@ -0,0 +1,54 @@ +From 6de2852297737171ba96b91e89bf302ca1fda869 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:18:04 +0100 +Subject: [PATCH 08/16] net: dsa: mt7530: move SGMII PCS creation to + mt7530_probe function + +Move creating the SGMII PCS from mt753x_setup() to the more appropriate +mt7530_probe() function. +This is done also in preparation of moving all functions related to +MDIO-connected MT753x switches to a separate module. + +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mt7530.c | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -3032,12 +3032,6 @@ mt753x_setup(struct dsa_switch *ds) + if (ret && priv->irq) + mt7530_free_irq_common(priv); + +- if (priv->id == ID_MT7531) { +- ret = mt7531_create_sgmii(priv); +- if (ret && priv->irq) +- mt7530_free_irq_common(priv); +- } +- + return ret; + } + +@@ -3154,6 +3148,7 @@ mt7530_probe(struct mdio_device *mdiodev + static struct regmap_config *regmap_config; + struct mt7530_priv *priv; + struct device_node *dn; ++ int ret; + + dn = mdiodev->dev.of_node; + +@@ -3246,6 +3241,12 @@ mt7530_probe(struct mdio_device *mdiodev + if (IS_ERR(priv->regmap)) + return PTR_ERR(priv->regmap); + ++ if (priv->id == ID_MT7531) { ++ ret = mt7531_create_sgmii(priv); ++ if (ret) ++ return ret; ++ } ++ + return dsa_register_switch(priv->ds); + } + diff --git a/target/linux/generic/backport-5.15/790-v6.4-0006-net-dsa-mt7530-introduce-mutex-helpers.patch b/target/linux/generic/backport-5.15/790-v6.4-0006-net-dsa-mt7530-introduce-mutex-helpers.patch new file mode 100644 index 0000000000..4d75c55647 --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0006-net-dsa-mt7530-introduce-mutex-helpers.patch @@ -0,0 +1,273 @@ +From 1557c679f71c82a994eae0baadbaeb62b71e15bf Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:18:16 +0100 +Subject: [PATCH 09/16] net: dsa: mt7530: introduce mutex helpers + +As the MDIO bus lock only needs to be involved if actually operating +on an MDIO-connected switch we will need to skip locking for built-in +switches which are accessed via MMIO. +Create helper functions which simplify that upcoming change. + +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mt7530.c | 73 ++++++++++++++++++++-------------------- + 1 file changed, 36 insertions(+), 37 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -143,31 +143,40 @@ err: + } + + static void +-core_write(struct mt7530_priv *priv, u32 reg, u32 val) ++mt7530_mutex_lock(struct mt7530_priv *priv) + { +- struct mii_bus *bus = priv->bus; ++ mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); ++} + +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++static void ++mt7530_mutex_unlock(struct mt7530_priv *priv) ++{ ++ mutex_unlock(&priv->bus->mdio_lock); ++} ++ ++static void ++core_write(struct mt7530_priv *priv, u32 reg, u32 val) ++{ ++ mt7530_mutex_lock(priv); + + core_write_mmd_indirect(priv, reg, MDIO_MMD_VEND2, val); + +- mutex_unlock(&bus->mdio_lock); ++ mt7530_mutex_unlock(priv); + } + + static void + core_rmw(struct mt7530_priv *priv, u32 reg, u32 mask, u32 set) + { +- struct mii_bus *bus = priv->bus; + u32 val; + +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ mt7530_mutex_lock(priv); + + val = core_read_mmd_indirect(priv, reg, MDIO_MMD_VEND2); + val &= ~mask; + val |= set; + core_write_mmd_indirect(priv, reg, MDIO_MMD_VEND2, val); + +- mutex_unlock(&bus->mdio_lock); ++ mt7530_mutex_unlock(priv); + } + + static void +@@ -264,13 +273,11 @@ mt7530_mii_read(struct mt7530_priv *priv + static void + mt7530_write(struct mt7530_priv *priv, u32 reg, u32 val) + { +- struct mii_bus *bus = priv->bus; +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ mt7530_mutex_lock(priv); + + mt7530_mii_write(priv, reg, val); + +- mutex_unlock(&bus->mdio_lock); ++ mt7530_mutex_unlock(priv); + } + + static u32 +@@ -282,14 +289,13 @@ _mt7530_unlocked_read(struct mt7530_dumm + static u32 + _mt7530_read(struct mt7530_dummy_poll *p) + { +- struct mii_bus *bus = p->priv->bus; + u32 val; + +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ mt7530_mutex_lock(p->priv); + + val = mt7530_mii_read(p->priv, p->reg); + +- mutex_unlock(&bus->mdio_lock); ++ mt7530_mutex_unlock(p->priv); + + return val; + } +@@ -307,13 +313,11 @@ static void + mt7530_rmw(struct mt7530_priv *priv, u32 reg, + u32 mask, u32 set) + { +- struct mii_bus *bus = priv->bus; +- +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ mt7530_mutex_lock(priv); + + regmap_update_bits(priv->regmap, reg, mask, set); + +- mutex_unlock(&bus->mdio_lock); ++ mt7530_mutex_unlock(priv); + } + + static void +@@ -645,14 +649,13 @@ static int + mt7531_ind_c45_phy_read(struct mt7530_priv *priv, int port, int devad, + int regnum) + { +- struct mii_bus *bus = priv->bus; + struct mt7530_dummy_poll p; + u32 reg, val; + int ret; + + INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC); + +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ mt7530_mutex_lock(priv); + + ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val, + !(val & MT7531_PHY_ACS_ST), 20, 100000); +@@ -685,7 +688,7 @@ mt7531_ind_c45_phy_read(struct mt7530_pr + + ret = val & MT7531_MDIO_RW_DATA_MASK; + out: +- mutex_unlock(&bus->mdio_lock); ++ mt7530_mutex_unlock(priv); + + return ret; + } +@@ -694,14 +697,13 @@ static int + mt7531_ind_c45_phy_write(struct mt7530_priv *priv, int port, int devad, + int regnum, u32 data) + { +- struct mii_bus *bus = priv->bus; + struct mt7530_dummy_poll p; + u32 val, reg; + int ret; + + INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC); + +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ mt7530_mutex_lock(priv); + + ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val, + !(val & MT7531_PHY_ACS_ST), 20, 100000); +@@ -733,7 +735,7 @@ mt7531_ind_c45_phy_write(struct mt7530_p + } + + out: +- mutex_unlock(&bus->mdio_lock); ++ mt7530_mutex_unlock(priv); + + return ret; + } +@@ -741,14 +743,13 @@ out: + static int + mt7531_ind_c22_phy_read(struct mt7530_priv *priv, int port, int regnum) + { +- struct mii_bus *bus = priv->bus; + struct mt7530_dummy_poll p; + int ret; + u32 val; + + INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC); + +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ mt7530_mutex_lock(priv); + + ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val, + !(val & MT7531_PHY_ACS_ST), 20, 100000); +@@ -771,7 +772,7 @@ mt7531_ind_c22_phy_read(struct mt7530_pr + + ret = val & MT7531_MDIO_RW_DATA_MASK; + out: +- mutex_unlock(&bus->mdio_lock); ++ mt7530_mutex_unlock(priv); + + return ret; + } +@@ -780,14 +781,13 @@ static int + mt7531_ind_c22_phy_write(struct mt7530_priv *priv, int port, int regnum, + u16 data) + { +- struct mii_bus *bus = priv->bus; + struct mt7530_dummy_poll p; + int ret; + u32 reg; + + INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC); + +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ mt7530_mutex_lock(priv); + + ret = readx_poll_timeout(_mt7530_unlocked_read, &p, reg, + !(reg & MT7531_PHY_ACS_ST), 20, 100000); +@@ -809,7 +809,7 @@ mt7531_ind_c22_phy_write(struct mt7530_p + } + + out: +- mutex_unlock(&bus->mdio_lock); ++ mt7530_mutex_unlock(priv); + + return ret; + } +@@ -1117,7 +1117,6 @@ static int + mt7530_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu) + { + struct mt7530_priv *priv = ds->priv; +- struct mii_bus *bus = priv->bus; + int length; + u32 val; + +@@ -1128,7 +1127,7 @@ mt7530_port_change_mtu(struct dsa_switch + if (!dsa_is_cpu_port(ds, port)) + return 0; + +- mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); ++ mt7530_mutex_lock(priv); + + val = mt7530_mii_read(priv, MT7530_GMACCR); + val &= ~MAX_RX_PKT_LEN_MASK; +@@ -1149,7 +1148,7 @@ mt7530_port_change_mtu(struct dsa_switch + + mt7530_mii_write(priv, MT7530_GMACCR, val); + +- mutex_unlock(&bus->mdio_lock); ++ mt7530_mutex_unlock(priv); + + return 0; + } +@@ -1945,10 +1944,10 @@ mt7530_irq_thread_fn(int irq, void *dev_ + u32 val; + int p; + +- mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); ++ mt7530_mutex_lock(priv); + val = mt7530_mii_read(priv, MT7530_SYS_INT_STS); + mt7530_mii_write(priv, MT7530_SYS_INT_STS, val); +- mutex_unlock(&priv->bus->mdio_lock); ++ mt7530_mutex_unlock(priv); + + for (p = 0; p < MT7530_NUM_PHYS; p++) { + if (BIT(p) & val) { +@@ -1984,7 +1983,7 @@ mt7530_irq_bus_lock(struct irq_data *d) + { + struct mt7530_priv *priv = irq_data_get_irq_chip_data(d); + +- mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); ++ mt7530_mutex_lock(priv); + } + + static void +@@ -1993,7 +1992,7 @@ mt7530_irq_bus_sync_unlock(struct irq_da + struct mt7530_priv *priv = irq_data_get_irq_chip_data(d); + + mt7530_mii_write(priv, MT7530_SYS_INT_EN, priv->irq_enable); +- mutex_unlock(&priv->bus->mdio_lock); ++ mt7530_mutex_unlock(priv); + } + + static struct irq_chip mt7530_irq_chip = { diff --git a/target/linux/generic/backport-5.15/790-v6.4-0007-net-dsa-mt7530-move-p5_intf_modes-function-to-mt7530.patch b/target/linux/generic/backport-5.15/790-v6.4-0007-net-dsa-mt7530-move-p5_intf_modes-function-to-mt7530.patch new file mode 100644 index 0000000000..bd7ca33f6e --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0007-net-dsa-mt7530-move-p5_intf_modes-function-to-mt7530.patch @@ -0,0 +1,75 @@ +From 25d15dee34a1a40d5fd71636a205e3211f09fd1d Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:18:28 +0100 +Subject: [PATCH 10/16] net: dsa: mt7530: move p5_intf_modes() function to + mt7530.c + +In preparation of splitting mt7530.c into a driver for MDIO-connected +as well as MDIO-accessed built-in switches on one hand and MMIO-accessed +built-in switches move the p5_inft_modes() function from mt7530.h to +mt7530.c. The function is only needed there and will trigger a compiler +warning about a defined but unused function otherwise when including +mt7530.h in the to-be-introduced bus-specific drivers. + +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mt7530.c | 18 ++++++++++++++++++ + drivers/net/dsa/mt7530.h | 18 ------------------ + 2 files changed, 18 insertions(+), 18 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -950,6 +950,24 @@ mt7530_set_ageing_time(struct dsa_switch + return 0; + } + ++static const char *p5_intf_modes(unsigned int p5_interface) ++{ ++ switch (p5_interface) { ++ case P5_DISABLED: ++ return "DISABLED"; ++ case P5_INTF_SEL_PHY_P0: ++ return "PHY P0"; ++ case P5_INTF_SEL_PHY_P4: ++ return "PHY P4"; ++ case P5_INTF_SEL_GMAC5: ++ return "GMAC5"; ++ case P5_INTF_SEL_GMAC5_SGMII: ++ return "GMAC5_SGMII"; ++ default: ++ return "unknown"; ++ } ++} ++ + static void mt7530_setup_port5(struct dsa_switch *ds, phy_interface_t interface) + { + struct mt7530_priv *priv = ds->priv; +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -682,24 +682,6 @@ enum p5_interface_select { + P5_INTF_SEL_GMAC5_SGMII, + }; + +-static const char *p5_intf_modes(unsigned int p5_interface) +-{ +- switch (p5_interface) { +- case P5_DISABLED: +- return "DISABLED"; +- case P5_INTF_SEL_PHY_P0: +- return "PHY P0"; +- case P5_INTF_SEL_PHY_P4: +- return "PHY P4"; +- case P5_INTF_SEL_GMAC5: +- return "GMAC5"; +- case P5_INTF_SEL_GMAC5_SGMII: +- return "GMAC5_SGMII"; +- default: +- return "unknown"; +- } +-} +- + struct mt7530_priv; + + struct mt753x_pcs { diff --git a/target/linux/generic/backport-5.15/790-v6.4-0008-net-dsa-mt7530-introduce-mt7530_probe_common-helper-.patch b/target/linux/generic/backport-5.15/790-v6.4-0008-net-dsa-mt7530-introduce-mt7530_probe_common-helper-.patch new file mode 100644 index 0000000000..00dd91bbc9 --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0008-net-dsa-mt7530-introduce-mt7530_probe_common-helper-.patch @@ -0,0 +1,155 @@ +From 37c9c0d8d0b2e24f8c9af72ecd4edd31537284d3 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:18:39 +0100 +Subject: [PATCH 11/16] net: dsa: mt7530: introduce mt7530_probe_common helper + function + +Move commonly used parts from mt7530_probe into new mt7530_probe_common +helper function which will be used by both, mt7530_probe and the +to-be-introduced mt7988_probe. + +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mt7530.c | 98 ++++++++++++++++++++++------------------ + 1 file changed, 54 insertions(+), 44 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -3160,44 +3160,21 @@ static const struct of_device_id mt7530_ + MODULE_DEVICE_TABLE(of, mt7530_of_match); + + static int +-mt7530_probe(struct mdio_device *mdiodev) ++mt7530_probe_common(struct mt7530_priv *priv) + { +- static struct regmap_config *regmap_config; +- struct mt7530_priv *priv; +- struct device_node *dn; +- int ret; ++ struct device *dev = priv->dev; + +- dn = mdiodev->dev.of_node; +- +- priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL); +- if (!priv) +- return -ENOMEM; +- +- priv->ds = devm_kzalloc(&mdiodev->dev, sizeof(*priv->ds), GFP_KERNEL); ++ priv->ds = devm_kzalloc(dev, sizeof(*priv->ds), GFP_KERNEL); + if (!priv->ds) + return -ENOMEM; + +- priv->ds->dev = &mdiodev->dev; ++ priv->ds->dev = dev; + priv->ds->num_ports = MT7530_NUM_PORTS; + +- /* Use medatek,mcm property to distinguish hardware type that would +- * casues a little bit differences on power-on sequence. +- */ +- priv->mcm = of_property_read_bool(dn, "mediatek,mcm"); +- if (priv->mcm) { +- dev_info(&mdiodev->dev, "MT7530 adapts as multi-chip module\n"); +- +- priv->rstc = devm_reset_control_get(&mdiodev->dev, "mcm"); +- if (IS_ERR(priv->rstc)) { +- dev_err(&mdiodev->dev, "Couldn't get our reset line\n"); +- return PTR_ERR(priv->rstc); +- } +- } +- + /* Get the hardware identifier from the devicetree node. + * We will need it for some of the clock and regulator setup. + */ +- priv->info = of_device_get_match_data(&mdiodev->dev); ++ priv->info = of_device_get_match_data(dev); + if (!priv->info) + return -EINVAL; + +@@ -3211,23 +3188,53 @@ mt7530_probe(struct mdio_device *mdiodev + return -EINVAL; + + priv->id = priv->info->id; ++ priv->dev = dev; ++ priv->ds->priv = priv; ++ priv->ds->ops = &mt7530_switch_ops; ++ mutex_init(&priv->reg_mutex); ++ dev_set_drvdata(dev, priv); + +- if (priv->id == ID_MT7530) { +- priv->core_pwr = devm_regulator_get(&mdiodev->dev, "core"); +- if (IS_ERR(priv->core_pwr)) +- return PTR_ERR(priv->core_pwr); ++ return 0; ++} + +- priv->io_pwr = devm_regulator_get(&mdiodev->dev, "io"); +- if (IS_ERR(priv->io_pwr)) +- return PTR_ERR(priv->io_pwr); +- } ++static int ++mt7530_probe(struct mdio_device *mdiodev) ++{ ++ static struct regmap_config *regmap_config; ++ struct mt7530_priv *priv; ++ struct device_node *dn; ++ int ret; ++ ++ dn = mdiodev->dev.of_node; ++ ++ priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; + +- /* Not MCM that indicates switch works as the remote standalone ++ priv->bus = mdiodev->bus; ++ priv->dev = &mdiodev->dev; ++ ++ ret = mt7530_probe_common(priv); ++ if (ret) ++ return ret; ++ ++ /* Use medatek,mcm property to distinguish hardware type that would ++ * cause a little bit differences on power-on sequence. ++ * Not MCM that indicates switch works as the remote standalone + * integrated circuit so the GPIO pin would be used to complete + * the reset, otherwise memory-mapped register accessing used + * through syscon provides in the case of MCM. + */ +- if (!priv->mcm) { ++ priv->mcm = of_property_read_bool(dn, "mediatek,mcm"); ++ if (priv->mcm) { ++ dev_info(&mdiodev->dev, "MT7530 adapts as multi-chip module\n"); ++ ++ priv->rstc = devm_reset_control_get(&mdiodev->dev, "mcm"); ++ if (IS_ERR(priv->rstc)) { ++ dev_err(&mdiodev->dev, "Couldn't get our reset line\n"); ++ return PTR_ERR(priv->rstc); ++ } ++ } else { + priv->reset = devm_gpiod_get_optional(&mdiodev->dev, "reset", + GPIOD_OUT_LOW); + if (IS_ERR(priv->reset)) { +@@ -3236,12 +3243,15 @@ mt7530_probe(struct mdio_device *mdiodev + } + } + +- priv->bus = mdiodev->bus; +- priv->dev = &mdiodev->dev; +- priv->ds->priv = priv; +- priv->ds->ops = &mt7530_switch_ops; +- mutex_init(&priv->reg_mutex); +- dev_set_drvdata(&mdiodev->dev, priv); ++ if (priv->id == ID_MT7530) { ++ priv->core_pwr = devm_regulator_get(&mdiodev->dev, "core"); ++ if (IS_ERR(priv->core_pwr)) ++ return PTR_ERR(priv->core_pwr); ++ ++ priv->io_pwr = devm_regulator_get(&mdiodev->dev, "io"); ++ if (IS_ERR(priv->io_pwr)) ++ return PTR_ERR(priv->io_pwr); ++ } + + regmap_config = devm_kzalloc(&mdiodev->dev, sizeof(*regmap_config), + GFP_KERNEL); diff --git a/target/linux/generic/backport-5.15/790-v6.4-0009-net-dsa-mt7530-introduce-mt7530_remove_common-helper.patch b/target/linux/generic/backport-5.15/790-v6.4-0009-net-dsa-mt7530-introduce-mt7530_remove_common-helper.patch new file mode 100644 index 0000000000..be73b67c94 --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0009-net-dsa-mt7530-introduce-mt7530_remove_common-helper.patch @@ -0,0 +1,55 @@ +From 720d736351761574af02ed093658ab60de60576c Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:18:50 +0100 +Subject: [PATCH 12/16] net: dsa: mt7530: introduce mt7530_remove_common helper + function + +Move commonly used parts from mt7530_remove into new +mt7530_remove_common helper function which will be used by both, +mt7530_remove and the to-be-introduced mt7988_remove. + +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mt7530.c | 18 ++++++++++++------ + 1 file changed, 12 insertions(+), 6 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -3278,6 +3278,17 @@ mt7530_probe(struct mdio_device *mdiodev + } + + static void ++mt7530_remove_common(struct mt7530_priv *priv) ++{ ++ if (priv->irq) ++ mt7530_free_irq(priv); ++ ++ dsa_unregister_switch(priv->ds); ++ ++ mutex_destroy(&priv->reg_mutex); ++} ++ ++static void + mt7530_remove(struct mdio_device *mdiodev) + { + struct mt7530_priv *priv = dev_get_drvdata(&mdiodev->dev); +@@ -3296,16 +3307,11 @@ mt7530_remove(struct mdio_device *mdiode + dev_err(priv->dev, "Failed to disable io pwr: %d\n", + ret); + +- if (priv->irq) +- mt7530_free_irq(priv); +- +- dsa_unregister_switch(priv->ds); ++ mt7530_remove_common(priv); + + for (i = 0; i < 2; ++i) + mtk_pcs_lynxi_destroy(priv->ports[5 + i].sgmii_pcs); + +- mutex_destroy(&priv->reg_mutex); +- + dev_set_drvdata(&mdiodev->dev, NULL); + } + diff --git a/target/linux/generic/backport-5.15/790-v6.4-0011-net-dsa-mt7530-introduce-separate-MDIO-driver.patch b/target/linux/generic/backport-5.15/790-v6.4-0011-net-dsa-mt7530-introduce-separate-MDIO-driver.patch new file mode 100644 index 0000000000..2cebac1f8c --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0011-net-dsa-mt7530-introduce-separate-MDIO-driver.patch @@ -0,0 +1,692 @@ +From cb675afcddbbeb2bfa6596e3bc236bc026cd425f Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:19:13 +0100 +Subject: [PATCH 14/16] net: dsa: mt7530: introduce separate MDIO driver + +Split MT7530 switch driver into a common part and a part specific +for MDIO connected switches and multi-chip modules. +Move MDIO-specific functions to newly introduced mt7530-mdio.c while +keeping the common parts in mt7530.c. +Introduce new Kconfig symbol CONFIG_NET_DSA_MT7530_MDIO which is +implied by CONFIG_NET_DSA_MT7530. + +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + MAINTAINERS | 1 + + drivers/net/dsa/Kconfig | 15 +- + drivers/net/dsa/Makefile | 1 + + drivers/net/dsa/mt7530-mdio.c | 271 ++++++++++++++++++++++++++++++++++ + drivers/net/dsa/mt7530.c | 264 +-------------------------------- + drivers/net/dsa/mt7530.h | 6 + + 6 files changed, 300 insertions(+), 258 deletions(-) + create mode 100644 drivers/net/dsa/mt7530-mdio.c + +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -11895,6 +11895,7 @@ M: Landen Chao + L: netdev@vger.kernel.org + S: Maintained ++F: drivers/net/dsa/mt7530-mdio.c + F: drivers/net/dsa/mt7530.* + F: net/dsa/tag_mtk.c + +--- a/drivers/net/dsa/Kconfig ++++ b/drivers/net/dsa/Kconfig +@@ -37,10 +37,22 @@ config NET_DSA_MT7530 + tristate "MediaTek MT753x and MT7621 Ethernet switch support" + select NET_DSA_TAG_MTK + select MEDIATEK_GE_PHY ++ imply NET_DSA_MT7530_MDIO ++ help ++ This enables support for the MediaTek MT7530 and MT7531 Ethernet ++ switch chips. Multi-chip module MT7530 in MT7621AT, MT7621DAT, ++ MT7621ST and MT7623AI SoCs, and built-in switch in MT7988 SoC are ++ supported as well. ++ ++config NET_DSA_MT7530_MDIO ++ tristate "MediaTek MT7530 MDIO interface driver" ++ depends on NET_DSA_MT7530 + select PCS_MTK_LYNXI + help +- This enables support for the MediaTek MT7530, MT7531, and MT7621 +- Ethernet switch chips. ++ This enables support for the MediaTek MT7530 and MT7531 switch ++ chips which are connected via MDIO, as well as multi-chip ++ module MT7530 which can be found in the MT7621AT, MT7621DAT, ++ MT7621ST and MT7623AI SoCs. + + config NET_DSA_MV88E6060 + tristate "Marvell 88E6060 ethernet switch chip support" +--- a/drivers/net/dsa/Makefile ++++ b/drivers/net/dsa/Makefile +@@ -7,6 +7,7 @@ obj-$(CONFIG_FIXED_PHY) += dsa_loop_bdi + endif + obj-$(CONFIG_NET_DSA_LANTIQ_GSWIP) += lantiq_gswip.o + obj-$(CONFIG_NET_DSA_MT7530) += mt7530.o ++obj-$(CONFIG_NET_DSA_MT7530_MDIO) += mt7530-mdio.o + obj-$(CONFIG_NET_DSA_MV88E6060) += mv88e6060.o + obj-$(CONFIG_NET_DSA_REALTEK_SMI) += realtek-smi.o + realtek-smi-objs := realtek-smi-core.o rtl8366.o rtl8366rb.o +--- /dev/null ++++ b/drivers/net/dsa/mt7530-mdio.c +@@ -0,0 +1,271 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "mt7530.h" ++ ++static int ++mt7530_regmap_write(void *context, unsigned int reg, unsigned int val) ++{ ++ struct mii_bus *bus = context; ++ u16 page, r, lo, hi; ++ int ret; ++ ++ page = (reg >> 6) & 0x3ff; ++ r = (reg >> 2) & 0xf; ++ lo = val & 0xffff; ++ hi = val >> 16; ++ ++ /* MT7530 uses 31 as the pseudo port */ ++ ret = bus->write(bus, 0x1f, 0x1f, page); ++ if (ret < 0) ++ return ret; ++ ++ ret = bus->write(bus, 0x1f, r, lo); ++ if (ret < 0) ++ return ret; ++ ++ ret = bus->write(bus, 0x1f, 0x10, hi); ++ return ret; ++} ++ ++static int ++mt7530_regmap_read(void *context, unsigned int reg, unsigned int *val) ++{ ++ struct mii_bus *bus = context; ++ u16 page, r, lo, hi; ++ int ret; ++ ++ page = (reg >> 6) & 0x3ff; ++ r = (reg >> 2) & 0xf; ++ ++ /* MT7530 uses 31 as the pseudo port */ ++ ret = bus->write(bus, 0x1f, 0x1f, page); ++ if (ret < 0) ++ return ret; ++ ++ lo = bus->read(bus, 0x1f, r); ++ hi = bus->read(bus, 0x1f, 0x10); ++ ++ *val = (hi << 16) | (lo & 0xffff); ++ ++ return 0; ++} ++ ++static void ++mt7530_mdio_regmap_lock(void *mdio_lock) ++{ ++ mutex_lock_nested(mdio_lock, MDIO_MUTEX_NESTED); ++} ++ ++static void ++mt7530_mdio_regmap_unlock(void *mdio_lock) ++{ ++ mutex_unlock(mdio_lock); ++} ++ ++static const struct regmap_bus mt7530_regmap_bus = { ++ .reg_write = mt7530_regmap_write, ++ .reg_read = mt7530_regmap_read, ++}; ++ ++static int ++mt7531_create_sgmii(struct mt7530_priv *priv) ++{ ++ struct regmap_config *mt7531_pcs_config[2]; ++ struct phylink_pcs *pcs; ++ struct regmap *regmap; ++ int i, ret = 0; ++ ++ for (i = 0; i < 2; i++) { ++ mt7531_pcs_config[i] = devm_kzalloc(priv->dev, ++ sizeof(struct regmap_config), ++ GFP_KERNEL); ++ if (!mt7531_pcs_config[i]) { ++ ret = -ENOMEM; ++ break; ++ } ++ ++ mt7531_pcs_config[i]->name = i ? "port6" : "port5"; ++ mt7531_pcs_config[i]->reg_bits = 16; ++ mt7531_pcs_config[i]->val_bits = 32; ++ mt7531_pcs_config[i]->reg_stride = 4; ++ mt7531_pcs_config[i]->reg_base = MT7531_SGMII_REG_BASE(5 + i); ++ mt7531_pcs_config[i]->max_register = 0x17c; ++ mt7531_pcs_config[i]->lock = mt7530_mdio_regmap_lock; ++ mt7531_pcs_config[i]->unlock = mt7530_mdio_regmap_unlock; ++ mt7531_pcs_config[i]->lock_arg = &priv->bus->mdio_lock; ++ ++ regmap = devm_regmap_init(priv->dev, ++ &mt7530_regmap_bus, priv->bus, ++ mt7531_pcs_config[i]); ++ if (IS_ERR(regmap)) { ++ ret = PTR_ERR(regmap); ++ break; ++ } ++ pcs = mtk_pcs_lynxi_create(priv->dev, regmap, ++ MT7531_PHYA_CTRL_SIGNAL3, 0); ++ if (!pcs) { ++ ret = -ENXIO; ++ break; ++ } ++ priv->ports[5 + i].sgmii_pcs = pcs; ++ } ++ ++ if (ret && i) ++ mtk_pcs_lynxi_destroy(priv->ports[5].sgmii_pcs); ++ ++ return ret; ++} ++ ++static const struct of_device_id mt7530_of_match[] = { ++ { .compatible = "mediatek,mt7621", .data = &mt753x_table[ID_MT7621], }, ++ { .compatible = "mediatek,mt7530", .data = &mt753x_table[ID_MT7530], }, ++ { .compatible = "mediatek,mt7531", .data = &mt753x_table[ID_MT7531], }, ++ { /* sentinel */ }, ++}; ++MODULE_DEVICE_TABLE(of, mt7530_of_match); ++ ++static int ++mt7530_probe(struct mdio_device *mdiodev) ++{ ++ static struct regmap_config *regmap_config; ++ struct mt7530_priv *priv; ++ struct device_node *dn; ++ int ret; ++ ++ dn = mdiodev->dev.of_node; ++ ++ priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ priv->bus = mdiodev->bus; ++ priv->dev = &mdiodev->dev; ++ ++ ret = mt7530_probe_common(priv); ++ if (ret) ++ return ret; ++ ++ /* Use medatek,mcm property to distinguish hardware type that would ++ * cause a little bit differences on power-on sequence. ++ * Not MCM that indicates switch works as the remote standalone ++ * integrated circuit so the GPIO pin would be used to complete ++ * the reset, otherwise memory-mapped register accessing used ++ * through syscon provides in the case of MCM. ++ */ ++ priv->mcm = of_property_read_bool(dn, "mediatek,mcm"); ++ if (priv->mcm) { ++ dev_info(&mdiodev->dev, "MT7530 adapts as multi-chip module\n"); ++ ++ priv->rstc = devm_reset_control_get(&mdiodev->dev, "mcm"); ++ if (IS_ERR(priv->rstc)) { ++ dev_err(&mdiodev->dev, "Couldn't get our reset line\n"); ++ return PTR_ERR(priv->rstc); ++ } ++ } else { ++ priv->reset = devm_gpiod_get_optional(&mdiodev->dev, "reset", ++ GPIOD_OUT_LOW); ++ if (IS_ERR(priv->reset)) { ++ dev_err(&mdiodev->dev, "Couldn't get our reset line\n"); ++ return PTR_ERR(priv->reset); ++ } ++ } ++ ++ if (priv->id == ID_MT7530) { ++ priv->core_pwr = devm_regulator_get(&mdiodev->dev, "core"); ++ if (IS_ERR(priv->core_pwr)) ++ return PTR_ERR(priv->core_pwr); ++ ++ priv->io_pwr = devm_regulator_get(&mdiodev->dev, "io"); ++ if (IS_ERR(priv->io_pwr)) ++ return PTR_ERR(priv->io_pwr); ++ } ++ ++ regmap_config = devm_kzalloc(&mdiodev->dev, sizeof(*regmap_config), ++ GFP_KERNEL); ++ if (!regmap_config) ++ return -ENOMEM; ++ ++ regmap_config->reg_bits = 16; ++ regmap_config->val_bits = 32; ++ regmap_config->reg_stride = 4; ++ regmap_config->max_register = MT7530_CREV; ++ regmap_config->disable_locking = true; ++ priv->regmap = devm_regmap_init(priv->dev, &mt7530_regmap_bus, ++ priv->bus, regmap_config); ++ if (IS_ERR(priv->regmap)) ++ return PTR_ERR(priv->regmap); ++ ++ if (priv->id == ID_MT7531) { ++ ret = mt7531_create_sgmii(priv); ++ if (ret) ++ return ret; ++ } ++ ++ return dsa_register_switch(priv->ds); ++} ++ ++static void ++mt7530_remove(struct mdio_device *mdiodev) ++{ ++ struct mt7530_priv *priv = dev_get_drvdata(&mdiodev->dev); ++ int ret = 0, i; ++ ++ if (!priv) ++ return; ++ ++ ret = regulator_disable(priv->core_pwr); ++ if (ret < 0) ++ dev_err(priv->dev, ++ "Failed to disable core power: %d\n", ret); ++ ++ ret = regulator_disable(priv->io_pwr); ++ if (ret < 0) ++ dev_err(priv->dev, "Failed to disable io pwr: %d\n", ++ ret); ++ ++ mt7530_remove_common(priv); ++ ++ for (i = 0; i < 2; ++i) ++ mtk_pcs_lynxi_destroy(priv->ports[5 + i].sgmii_pcs); ++} ++ ++static void mt7530_shutdown(struct mdio_device *mdiodev) ++{ ++ struct mt7530_priv *priv = dev_get_drvdata(&mdiodev->dev); ++ ++ if (!priv) ++ return; ++ ++ dsa_switch_shutdown(priv->ds); ++ ++ dev_set_drvdata(&mdiodev->dev, NULL); ++} ++ ++static struct mdio_driver mt7530_mdio_driver = { ++ .probe = mt7530_probe, ++ .remove = mt7530_remove, ++ .shutdown = mt7530_shutdown, ++ .mdiodrv.driver = { ++ .name = "mt7530-mdio", ++ .of_match_table = mt7530_of_match, ++ }, ++}; ++ ++mdio_module_driver(mt7530_mdio_driver); ++ ++MODULE_AUTHOR("Sean Wang "); ++MODULE_DESCRIPTION("Driver for Mediatek MT7530 Switch (MDIO)"); ++MODULE_LICENSE("GPL"); +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -14,7 +14,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -192,31 +191,6 @@ core_clear(struct mt7530_priv *priv, u32 + } + + static int +-mt7530_regmap_write(void *context, unsigned int reg, unsigned int val) +-{ +- struct mii_bus *bus = context; +- u16 page, r, lo, hi; +- int ret; +- +- page = (reg >> 6) & 0x3ff; +- r = (reg >> 2) & 0xf; +- lo = val & 0xffff; +- hi = val >> 16; +- +- /* MT7530 uses 31 as the pseudo port */ +- ret = bus->write(bus, 0x1f, 0x1f, page); +- if (ret < 0) +- return ret; +- +- ret = bus->write(bus, 0x1f, r, lo); +- if (ret < 0) +- return ret; +- +- ret = bus->write(bus, 0x1f, 0x10, hi); +- return ret; +-} +- +-static int + mt7530_mii_write(struct mt7530_priv *priv, u32 reg, u32 val) + { + int ret; +@@ -230,29 +204,6 @@ mt7530_mii_write(struct mt7530_priv *pri + return ret; + } + +-static int +-mt7530_regmap_read(void *context, unsigned int reg, unsigned int *val) +-{ +- struct mii_bus *bus = context; +- u16 page, r, lo, hi; +- int ret; +- +- page = (reg >> 6) & 0x3ff; +- r = (reg >> 2) & 0xf; +- +- /* MT7530 uses 31 as the pseudo port */ +- ret = bus->write(bus, 0x1f, 0x1f, page); +- if (ret < 0) +- return ret; +- +- lo = bus->read(bus, 0x1f, r); +- hi = bus->read(bus, 0x1f, 0x10); +- +- *val = (hi << 16) | (lo & 0xffff); +- +- return 0; +-} +- + static u32 + mt7530_mii_read(struct mt7530_priv *priv, u32 reg) + { +@@ -2958,72 +2909,6 @@ static const struct phylink_pcs_ops mt75 + .pcs_an_restart = mt7530_pcs_an_restart, + }; + +-static void +-mt7530_mdio_regmap_lock(void *mdio_lock) +-{ +- mutex_lock_nested(mdio_lock, MDIO_MUTEX_NESTED); +-} +- +-static void +-mt7530_mdio_regmap_unlock(void *mdio_lock) +-{ +- mutex_unlock(mdio_lock); +-} +- +-static const struct regmap_bus mt7530_regmap_bus = { +- .reg_write = mt7530_regmap_write, +- .reg_read = mt7530_regmap_read, +-}; +- +-static int +-mt7531_create_sgmii(struct mt7530_priv *priv) +-{ +- struct regmap_config *mt7531_pcs_config[2]; +- struct phylink_pcs *pcs; +- struct regmap *regmap; +- int i, ret = 0; +- +- for (i = 0; i < 2; i++) { +- mt7531_pcs_config[i] = devm_kzalloc(priv->dev, +- sizeof(struct regmap_config), +- GFP_KERNEL); +- if (!mt7531_pcs_config[i]) { +- ret = -ENOMEM; +- break; +- } +- +- mt7531_pcs_config[i]->name = i ? "port6" : "port5"; +- mt7531_pcs_config[i]->reg_bits = 16; +- mt7531_pcs_config[i]->val_bits = 32; +- mt7531_pcs_config[i]->reg_stride = 4; +- mt7531_pcs_config[i]->reg_base = MT7531_SGMII_REG_BASE(5 + i); +- mt7531_pcs_config[i]->max_register = 0x17c; +- mt7531_pcs_config[i]->lock = mt7530_mdio_regmap_lock; +- mt7531_pcs_config[i]->unlock = mt7530_mdio_regmap_unlock; +- mt7531_pcs_config[i]->lock_arg = &priv->bus->mdio_lock; +- +- regmap = devm_regmap_init(priv->dev, +- &mt7530_regmap_bus, priv->bus, +- mt7531_pcs_config[i]); +- if (IS_ERR(regmap)) { +- ret = PTR_ERR(regmap); +- break; +- } +- pcs = mtk_pcs_lynxi_create(priv->dev, regmap, +- MT7531_PHYA_CTRL_SIGNAL3, 0); +- if (!pcs) { +- ret = -ENXIO; +- break; +- } +- priv->ports[5 + i].sgmii_pcs = pcs; +- } +- +- if (ret && i) +- mtk_pcs_lynxi_destroy(priv->ports[5].sgmii_pcs); +- +- return ret; +-} +- + static int + mt753x_setup(struct dsa_switch *ds) + { +@@ -3082,7 +2967,7 @@ static int mt753x_set_mac_eee(struct dsa + return 0; + } + +-static const struct dsa_switch_ops mt7530_switch_ops = { ++const struct dsa_switch_ops mt7530_switch_ops = { + .get_tag_protocol = mtk_get_tag_protocol, + .setup = mt753x_setup, + .get_strings = mt7530_get_strings, +@@ -3116,8 +3001,9 @@ static const struct dsa_switch_ops mt753 + .get_mac_eee = mt753x_get_mac_eee, + .set_mac_eee = mt753x_set_mac_eee, + }; ++EXPORT_SYMBOL_GPL(mt7530_switch_ops); + +-static const struct mt753x_info mt753x_table[] = { ++const struct mt753x_info mt753x_table[] = { + [ID_MT7621] = { + .id = ID_MT7621, + .pcs_ops = &mt7530_pcs_ops, +@@ -3150,16 +3036,9 @@ static const struct mt753x_info mt753x_t + .mac_port_config = mt7531_mac_config, + }, + }; ++EXPORT_SYMBOL_GPL(mt753x_table); + +-static const struct of_device_id mt7530_of_match[] = { +- { .compatible = "mediatek,mt7621", .data = &mt753x_table[ID_MT7621], }, +- { .compatible = "mediatek,mt7530", .data = &mt753x_table[ID_MT7530], }, +- { .compatible = "mediatek,mt7531", .data = &mt753x_table[ID_MT7531], }, +- { /* sentinel */ }, +-}; +-MODULE_DEVICE_TABLE(of, mt7530_of_match); +- +-static int ++int + mt7530_probe_common(struct mt7530_priv *priv) + { + struct device *dev = priv->dev; +@@ -3196,88 +3075,9 @@ mt7530_probe_common(struct mt7530_priv * + + return 0; + } ++EXPORT_SYMBOL_GPL(mt7530_probe_common); + +-static int +-mt7530_probe(struct mdio_device *mdiodev) +-{ +- static struct regmap_config *regmap_config; +- struct mt7530_priv *priv; +- struct device_node *dn; +- int ret; +- +- dn = mdiodev->dev.of_node; +- +- priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL); +- if (!priv) +- return -ENOMEM; +- +- priv->bus = mdiodev->bus; +- priv->dev = &mdiodev->dev; +- +- ret = mt7530_probe_common(priv); +- if (ret) +- return ret; +- +- /* Use medatek,mcm property to distinguish hardware type that would +- * cause a little bit differences on power-on sequence. +- * Not MCM that indicates switch works as the remote standalone +- * integrated circuit so the GPIO pin would be used to complete +- * the reset, otherwise memory-mapped register accessing used +- * through syscon provides in the case of MCM. +- */ +- priv->mcm = of_property_read_bool(dn, "mediatek,mcm"); +- if (priv->mcm) { +- dev_info(&mdiodev->dev, "MT7530 adapts as multi-chip module\n"); +- +- priv->rstc = devm_reset_control_get(&mdiodev->dev, "mcm"); +- if (IS_ERR(priv->rstc)) { +- dev_err(&mdiodev->dev, "Couldn't get our reset line\n"); +- return PTR_ERR(priv->rstc); +- } +- } else { +- priv->reset = devm_gpiod_get_optional(&mdiodev->dev, "reset", +- GPIOD_OUT_LOW); +- if (IS_ERR(priv->reset)) { +- dev_err(&mdiodev->dev, "Couldn't get our reset line\n"); +- return PTR_ERR(priv->reset); +- } +- } +- +- if (priv->id == ID_MT7530) { +- priv->core_pwr = devm_regulator_get(&mdiodev->dev, "core"); +- if (IS_ERR(priv->core_pwr)) +- return PTR_ERR(priv->core_pwr); +- +- priv->io_pwr = devm_regulator_get(&mdiodev->dev, "io"); +- if (IS_ERR(priv->io_pwr)) +- return PTR_ERR(priv->io_pwr); +- } +- +- regmap_config = devm_kzalloc(&mdiodev->dev, sizeof(*regmap_config), +- GFP_KERNEL); +- if (!regmap_config) +- return -ENOMEM; +- +- regmap_config->reg_bits = 16; +- regmap_config->val_bits = 32; +- regmap_config->reg_stride = 4; +- regmap_config->max_register = MT7530_CREV; +- regmap_config->disable_locking = true; +- priv->regmap = devm_regmap_init(priv->dev, &mt7530_regmap_bus, +- priv->bus, regmap_config); +- if (IS_ERR(priv->regmap)) +- return PTR_ERR(priv->regmap); +- +- if (priv->id == ID_MT7531) { +- ret = mt7531_create_sgmii(priv); +- if (ret) +- return ret; +- } +- +- return dsa_register_switch(priv->ds); +-} +- +-static void ++void + mt7530_remove_common(struct mt7530_priv *priv) + { + if (priv->irq) +@@ -3288,57 +3088,6 @@ mt7530_remove_common(struct mt7530_priv + mutex_destroy(&priv->reg_mutex); + } + +-static void +-mt7530_remove(struct mdio_device *mdiodev) +-{ +- struct mt7530_priv *priv = dev_get_drvdata(&mdiodev->dev); +- int ret = 0, i; +- +- if (!priv) +- return; +- +- ret = regulator_disable(priv->core_pwr); +- if (ret < 0) +- dev_err(priv->dev, +- "Failed to disable core power: %d\n", ret); +- +- ret = regulator_disable(priv->io_pwr); +- if (ret < 0) +- dev_err(priv->dev, "Failed to disable io pwr: %d\n", +- ret); +- +- mt7530_remove_common(priv); +- +- for (i = 0; i < 2; ++i) +- mtk_pcs_lynxi_destroy(priv->ports[5 + i].sgmii_pcs); +- +- dev_set_drvdata(&mdiodev->dev, NULL); +-} +- +-static void mt7530_shutdown(struct mdio_device *mdiodev) +-{ +- struct mt7530_priv *priv = dev_get_drvdata(&mdiodev->dev); +- +- if (!priv) +- return; +- +- dsa_switch_shutdown(priv->ds); +- +- dev_set_drvdata(&mdiodev->dev, NULL); +-} +- +-static struct mdio_driver mt7530_mdio_driver = { +- .probe = mt7530_probe, +- .remove = mt7530_remove, +- .shutdown = mt7530_shutdown, +- .mdiodrv.driver = { +- .name = "mt7530", +- .of_match_table = mt7530_of_match, +- }, +-}; +- +-mdio_module_driver(mt7530_mdio_driver); +- + MODULE_AUTHOR("Sean Wang "); + MODULE_DESCRIPTION("Driver for Mediatek MT7530 Switch"); + MODULE_LICENSE("GPL"); +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -807,4 +807,10 @@ static inline void INIT_MT7530_DUMMY_POL + p->reg = reg; + } + ++int mt7530_probe_common(struct mt7530_priv *priv); ++void mt7530_remove_common(struct mt7530_priv *priv); ++ ++extern const struct dsa_switch_ops mt7530_switch_ops; ++extern const struct mt753x_info mt753x_table[]; ++ + #endif /* __MT7530_H */ diff --git a/target/linux/generic/backport-5.15/790-v6.4-0012-net-dsa-mt7530-skip-locking-if-MDIO-bus-isn-t-presen.patch b/target/linux/generic/backport-5.15/790-v6.4-0012-net-dsa-mt7530-skip-locking-if-MDIO-bus-isn-t-presen.patch new file mode 100644 index 0000000000..95b7cc6afe --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0012-net-dsa-mt7530-skip-locking-if-MDIO-bus-isn-t-presen.patch @@ -0,0 +1,47 @@ +From 54d4147a121cec5004a673a58572da346e4458f8 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:19:28 +0100 +Subject: [PATCH 15/16] net: dsa: mt7530: skip locking if MDIO bus isn't + present + +As MT7530 and MT7531 internally use 32-bit wide registers, each access +to any register of the switch requires several operations on the MDIO +bus. Hence if there is congruent access, e.g. due to PCS or PHY +polling, this can mess up and interfere with another ongoing register +access sequence. + +However, the MDIO bus mutex is only relevant for MDIO-connected +switches. Prepare switches which have there registers directly mapped +into the SoCs register space via MMIO which do not require such +locking. There we can simply use regmap's default locking mechanism. + +Hence guard mutex operations to only be performed in case of MDIO +connected switches. + +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mt7530.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -144,13 +144,15 @@ err: + static void + mt7530_mutex_lock(struct mt7530_priv *priv) + { +- mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); ++ if (priv->bus) ++ mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); + } + + static void + mt7530_mutex_unlock(struct mt7530_priv *priv) + { +- mutex_unlock(&priv->bus->mdio_lock); ++ if (priv->bus) ++ mutex_unlock(&priv->bus->mdio_lock); + } + + static void diff --git a/target/linux/generic/backport-5.15/790-v6.4-0013-net-dsa-mt7530-introduce-driver-for-MT7988-built-in-.patch b/target/linux/generic/backport-5.15/790-v6.4-0013-net-dsa-mt7530-introduce-driver-for-MT7988-built-in-.patch new file mode 100644 index 0000000000..889a13e014 --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0013-net-dsa-mt7530-introduce-driver-for-MT7988-built-in-.patch @@ -0,0 +1,421 @@ +From 110c18bfed41421edd677935dd33be5e6507ba92 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 02:19:40 +0100 +Subject: [PATCH 16/16] net: dsa: mt7530: introduce driver for MT7988 built-in + switch + +Add driver for the built-in Gigabit Ethernet switch which can be found +in the MediaTek MT7988 SoC. + +The switch shares most of its design with MT7530 and MT7531, but has +it's registers mapped into the SoCs register space rather than being +connected externally or internally via MDIO. + +Introduce a new platform driver to support that. + +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + MAINTAINERS | 2 + + drivers/net/dsa/Kconfig | 12 +++ + drivers/net/dsa/Makefile | 1 + + drivers/net/dsa/mt7530-mmio.c | 101 +++++++++++++++++++++++++ + drivers/net/dsa/mt7530.c | 137 +++++++++++++++++++++++++++++++++- + drivers/net/dsa/mt7530.h | 12 +-- + 6 files changed, 255 insertions(+), 10 deletions(-) + create mode 100644 drivers/net/dsa/mt7530-mmio.c + +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -11893,9 +11893,11 @@ MEDIATEK SWITCH DRIVER + M: Sean Wang + M: Landen Chao + M: DENG Qingfang ++M: Daniel Golle + L: netdev@vger.kernel.org + S: Maintained + F: drivers/net/dsa/mt7530-mdio.c ++F: drivers/net/dsa/mt7530-mmio.c + F: drivers/net/dsa/mt7530.* + F: net/dsa/tag_mtk.c + +--- a/drivers/net/dsa/Kconfig ++++ b/drivers/net/dsa/Kconfig +@@ -38,6 +38,7 @@ config NET_DSA_MT7530 + select NET_DSA_TAG_MTK + select MEDIATEK_GE_PHY + imply NET_DSA_MT7530_MDIO ++ imply NET_DSA_MT7530_MMIO + help + This enables support for the MediaTek MT7530 and MT7531 Ethernet + switch chips. Multi-chip module MT7530 in MT7621AT, MT7621DAT, +@@ -54,6 +55,17 @@ config NET_DSA_MT7530_MDIO + module MT7530 which can be found in the MT7621AT, MT7621DAT, + MT7621ST and MT7623AI SoCs. + ++config NET_DSA_MT7530_MMIO ++ tristate "MediaTek MT7530 MMIO interface driver" ++ depends on NET_DSA_MT7530 ++ depends on HAS_IOMEM ++ help ++ This enables support for the built-in Ethernet switch found ++ in the MediaTek MT7988 SoC. ++ The switch is a similar design as MT7531, but the switch registers ++ are directly mapped into the SoCs register space rather than being ++ accessible via MDIO. ++ + config NET_DSA_MV88E6060 + tristate "Marvell 88E6060 ethernet switch chip support" + select NET_DSA_TAG_TRAILER +--- a/drivers/net/dsa/Makefile ++++ b/drivers/net/dsa/Makefile +@@ -8,6 +8,7 @@ endif + obj-$(CONFIG_NET_DSA_LANTIQ_GSWIP) += lantiq_gswip.o + obj-$(CONFIG_NET_DSA_MT7530) += mt7530.o + obj-$(CONFIG_NET_DSA_MT7530_MDIO) += mt7530-mdio.o ++obj-$(CONFIG_NET_DSA_MT7530_MMIO) += mt7530-mmio.o + obj-$(CONFIG_NET_DSA_MV88E6060) += mv88e6060.o + obj-$(CONFIG_NET_DSA_REALTEK_SMI) += realtek-smi.o + realtek-smi-objs := realtek-smi-core.o rtl8366.o rtl8366rb.o +--- /dev/null ++++ b/drivers/net/dsa/mt7530-mmio.c +@@ -0,0 +1,101 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "mt7530.h" ++ ++static const struct of_device_id mt7988_of_match[] = { ++ { .compatible = "mediatek,mt7988-switch", .data = &mt753x_table[ID_MT7988], }, ++ { /* sentinel */ }, ++}; ++MODULE_DEVICE_TABLE(of, mt7988_of_match); ++ ++static int ++mt7988_probe(struct platform_device *pdev) ++{ ++ static struct regmap_config *sw_regmap_config; ++ struct mt7530_priv *priv; ++ void __iomem *base_addr; ++ int ret; ++ ++ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ priv->bus = NULL; ++ priv->dev = &pdev->dev; ++ ++ ret = mt7530_probe_common(priv); ++ if (ret) ++ return ret; ++ ++ priv->rstc = devm_reset_control_get(&pdev->dev, NULL); ++ if (IS_ERR(priv->rstc)) { ++ dev_err(&pdev->dev, "Couldn't get our reset line\n"); ++ return PTR_ERR(priv->rstc); ++ } ++ ++ base_addr = devm_platform_ioremap_resource(pdev, 0); ++ if (IS_ERR(base_addr)) { ++ dev_err(&pdev->dev, "cannot request I/O memory space\n"); ++ return -ENXIO; ++ } ++ ++ sw_regmap_config = devm_kzalloc(&pdev->dev, sizeof(*sw_regmap_config), GFP_KERNEL); ++ if (!sw_regmap_config) ++ return -ENOMEM; ++ ++ sw_regmap_config->name = "switch"; ++ sw_regmap_config->reg_bits = 16; ++ sw_regmap_config->val_bits = 32; ++ sw_regmap_config->reg_stride = 4; ++ sw_regmap_config->max_register = MT7530_CREV; ++ priv->regmap = devm_regmap_init_mmio(&pdev->dev, base_addr, sw_regmap_config); ++ if (IS_ERR(priv->regmap)) ++ return PTR_ERR(priv->regmap); ++ ++ return dsa_register_switch(priv->ds); ++} ++ ++static int ++mt7988_remove(struct platform_device *pdev) ++{ ++ struct mt7530_priv *priv = platform_get_drvdata(pdev); ++ ++ if (priv) ++ mt7530_remove_common(priv); ++ ++ return 0; ++} ++ ++static void mt7988_shutdown(struct platform_device *pdev) ++{ ++ struct mt7530_priv *priv = platform_get_drvdata(pdev); ++ ++ if (!priv) ++ return; ++ ++ dsa_switch_shutdown(priv->ds); ++ ++ dev_set_drvdata(&pdev->dev, NULL); ++} ++ ++static struct platform_driver mt7988_platform_driver = { ++ .probe = mt7988_probe, ++ .remove = mt7988_remove, ++ .shutdown = mt7988_shutdown, ++ .driver = { ++ .name = "mt7530-mmio", ++ .of_match_table = mt7988_of_match, ++ }, ++}; ++module_platform_driver(mt7988_platform_driver); ++ ++MODULE_AUTHOR("Daniel Golle "); ++MODULE_DESCRIPTION("Driver for Mediatek MT7530 Switch (MMIO)"); ++MODULE_LICENSE("GPL"); +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -1992,6 +1992,47 @@ static const struct irq_domain_ops mt753 + }; + + static void ++mt7988_irq_mask(struct irq_data *d) ++{ ++ struct mt7530_priv *priv = irq_data_get_irq_chip_data(d); ++ ++ priv->irq_enable &= ~BIT(d->hwirq); ++ mt7530_mii_write(priv, MT7530_SYS_INT_EN, priv->irq_enable); ++} ++ ++static void ++mt7988_irq_unmask(struct irq_data *d) ++{ ++ struct mt7530_priv *priv = irq_data_get_irq_chip_data(d); ++ ++ priv->irq_enable |= BIT(d->hwirq); ++ mt7530_mii_write(priv, MT7530_SYS_INT_EN, priv->irq_enable); ++} ++ ++static struct irq_chip mt7988_irq_chip = { ++ .name = KBUILD_MODNAME, ++ .irq_mask = mt7988_irq_mask, ++ .irq_unmask = mt7988_irq_unmask, ++}; ++ ++static int ++mt7988_irq_map(struct irq_domain *domain, unsigned int irq, ++ irq_hw_number_t hwirq) ++{ ++ irq_set_chip_data(irq, domain->host_data); ++ irq_set_chip_and_handler(irq, &mt7988_irq_chip, handle_simple_irq); ++ irq_set_nested_thread(irq, true); ++ irq_set_noprobe(irq); ++ ++ return 0; ++} ++ ++static const struct irq_domain_ops mt7988_irq_domain_ops = { ++ .map = mt7988_irq_map, ++ .xlate = irq_domain_xlate_onecell, ++}; ++ ++static void + mt7530_setup_mdio_irq(struct mt7530_priv *priv) + { + struct dsa_switch *ds = priv->ds; +@@ -2025,8 +2066,15 @@ mt7530_setup_irq(struct mt7530_priv *pri + return priv->irq ? : -EINVAL; + } + +- priv->irq_domain = irq_domain_add_linear(np, MT7530_NUM_PHYS, +- &mt7530_irq_domain_ops, priv); ++ if (priv->id == ID_MT7988) ++ priv->irq_domain = irq_domain_add_linear(np, MT7530_NUM_PHYS, ++ &mt7988_irq_domain_ops, ++ priv); ++ else ++ priv->irq_domain = irq_domain_add_linear(np, MT7530_NUM_PHYS, ++ &mt7530_irq_domain_ops, ++ priv); ++ + if (!priv->irq_domain) { + dev_err(dev, "failed to create IRQ domain\n"); + return -ENOMEM; +@@ -2521,6 +2569,25 @@ static void mt7531_mac_port_get_caps(str + } + } + ++static void mt7988_mac_port_get_caps(struct dsa_switch *ds, int port, ++ struct phylink_config *config) ++{ ++ phy_interface_zero(config->supported_interfaces); ++ ++ switch (port) { ++ case 0 ... 4: /* Internal phy */ ++ __set_bit(PHY_INTERFACE_MODE_INTERNAL, ++ config->supported_interfaces); ++ break; ++ ++ case 6: ++ __set_bit(PHY_INTERFACE_MODE_INTERNAL, ++ config->supported_interfaces); ++ config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | ++ MAC_10000FD; ++ } ++} ++ + static int + mt753x_pad_setup(struct dsa_switch *ds, const struct phylink_link_state *state) + { +@@ -2597,6 +2664,17 @@ static bool mt753x_is_mac_port(u32 port) + } + + static int ++mt7988_mac_config(struct dsa_switch *ds, int port, unsigned int mode, ++ phy_interface_t interface) ++{ ++ if (dsa_is_cpu_port(ds, port) && ++ interface == PHY_INTERFACE_MODE_INTERNAL) ++ return 0; ++ ++ return -EINVAL; ++} ++ ++static int + mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode, + phy_interface_t interface) + { +@@ -2666,7 +2744,8 @@ mt753x_phylink_mac_config(struct dsa_swi + + switch (port) { + case 0 ... 4: /* Internal phy */ +- if (state->interface != PHY_INTERFACE_MODE_GMII) ++ if (state->interface != PHY_INTERFACE_MODE_GMII && ++ state->interface != PHY_INTERFACE_MODE_INTERNAL) + goto unsupported; + break; + case 5: /* 2nd cpu port with phy of port 0 or 4 / external phy */ +@@ -2744,7 +2823,8 @@ static void mt753x_phylink_mac_link_up(s + /* MT753x MAC works in 1G full duplex mode for all up-clocked + * variants. + */ +- if (interface == PHY_INTERFACE_MODE_TRGMII || ++ if (interface == PHY_INTERFACE_MODE_INTERNAL || ++ interface == PHY_INTERFACE_MODE_TRGMII || + (phy_interface_mode_is_8023z(interface))) { + speed = SPEED_1000; + duplex = DUPLEX_FULL; +@@ -2824,6 +2904,21 @@ mt7531_cpu_port_config(struct dsa_switch + return 0; + } + ++static int ++mt7988_cpu_port_config(struct dsa_switch *ds, int port) ++{ ++ struct mt7530_priv *priv = ds->priv; ++ ++ mt7530_write(priv, MT7530_PMCR_P(port), ++ PMCR_CPU_PORT_SETTING(priv->id)); ++ ++ mt753x_phylink_mac_link_up(ds, port, MLO_AN_FIXED, ++ PHY_INTERFACE_MODE_INTERNAL, NULL, ++ SPEED_10000, DUPLEX_FULL, true, true); ++ ++ return 0; ++} ++ + static void mt753x_phylink_get_caps(struct dsa_switch *ds, int port, + struct phylink_config *config) + { +@@ -2969,6 +3064,27 @@ static int mt753x_set_mac_eee(struct dsa + return 0; + } + ++static int mt7988_pad_setup(struct dsa_switch *ds, phy_interface_t interface) ++{ ++ return 0; ++} ++ ++static int mt7988_setup(struct dsa_switch *ds) ++{ ++ struct mt7530_priv *priv = ds->priv; ++ ++ /* Reset the switch */ ++ reset_control_assert(priv->rstc); ++ usleep_range(20, 50); ++ reset_control_deassert(priv->rstc); ++ usleep_range(20, 50); ++ ++ /* Reset the switch PHYs */ ++ mt7530_write(priv, MT7530_SYS_CTRL, SYS_CTRL_PHY_RST); ++ ++ return mt7531_setup_common(ds); ++} ++ + const struct dsa_switch_ops mt7530_switch_ops = { + .get_tag_protocol = mtk_get_tag_protocol, + .setup = mt753x_setup, +@@ -3037,6 +3153,17 @@ const struct mt753x_info mt753x_table[] + .mac_port_get_caps = mt7531_mac_port_get_caps, + .mac_port_config = mt7531_mac_config, + }, ++ [ID_MT7988] = { ++ .id = ID_MT7988, ++ .pcs_ops = &mt7530_pcs_ops, ++ .sw_setup = mt7988_setup, ++ .phy_read = mt7531_ind_phy_read, ++ .phy_write = mt7531_ind_phy_write, ++ .pad_setup = mt7988_pad_setup, ++ .cpu_port_config = mt7988_cpu_port_config, ++ .mac_port_get_caps = mt7988_mac_port_get_caps, ++ .mac_port_config = mt7988_mac_config, ++ }, + }; + EXPORT_SYMBOL_GPL(mt753x_table); + +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -18,6 +18,7 @@ enum mt753x_id { + ID_MT7530 = 0, + ID_MT7621 = 1, + ID_MT7531 = 2, ++ ID_MT7988 = 3, + }; + + #define NUM_TRGMII_CTRL 5 +@@ -54,11 +55,11 @@ enum mt753x_id { + #define MT7531_MIRROR_PORT_SET(x) (((x) & MIRROR_MASK) << 16) + #define MT7531_CPU_PMAP_MASK GENMASK(7, 0) + +-#define MT753X_MIRROR_REG(id) (((id) == ID_MT7531) ? \ ++#define MT753X_MIRROR_REG(id) ((((id) == ID_MT7531) || ((id) == ID_MT7988)) ? \ + MT7531_CFC : MT7530_MFC) +-#define MT753X_MIRROR_EN(id) (((id) == ID_MT7531) ? \ ++#define MT753X_MIRROR_EN(id) ((((id) == ID_MT7531) || ((id) == ID_MT7988)) ? \ + MT7531_MIRROR_EN : MIRROR_EN) +-#define MT753X_MIRROR_MASK(id) (((id) == ID_MT7531) ? \ ++#define MT753X_MIRROR_MASK(id) ((((id) == ID_MT7531) || ((id) == ID_MT7988)) ? \ + MT7531_MIRROR_MASK : MIRROR_MASK) + + /* Registers for BPDU and PAE frame control*/ +@@ -295,9 +296,8 @@ enum mt7530_vlan_port_acc_frm { + MT7531_FORCE_DPX | \ + MT7531_FORCE_RX_FC | \ + MT7531_FORCE_TX_FC) +-#define PMCR_FORCE_MODE_ID(id) (((id) == ID_MT7531) ? \ +- MT7531_FORCE_MODE : \ +- PMCR_FORCE_MODE) ++#define PMCR_FORCE_MODE_ID(id) ((((id) == ID_MT7531) || ((id) == ID_MT7988)) ? \ ++ MT7531_FORCE_MODE : PMCR_FORCE_MODE) + #define PMCR_LINK_SETTINGS_MASK (PMCR_TX_EN | PMCR_FORCE_SPEED_1000 | \ + PMCR_RX_EN | PMCR_FORCE_SPEED_100 | \ + PMCR_TX_FC_EN | PMCR_RX_FC_EN | \ diff --git a/target/linux/generic/backport-5.15/790-v6.4-0014-net-dsa-mt7530-fix-support-for-MT7531BE.patch b/target/linux/generic/backport-5.15/790-v6.4-0014-net-dsa-mt7530-fix-support-for-MT7531BE.patch new file mode 100644 index 0000000000..40e1816726 --- /dev/null +++ b/target/linux/generic/backport-5.15/790-v6.4-0014-net-dsa-mt7530-fix-support-for-MT7531BE.patch @@ -0,0 +1,118 @@ +From 91daa4f62ce878b6e1ac5908aceb83550332447f Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sun, 16 Apr 2023 13:08:14 +0100 +Subject: [PATCH] net: dsa: mt7530: fix support for MT7531BE +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +There are two variants of the MT7531 switch IC which got different +features (and pins) regarding port 5: + * MT7531AE: SGMII/1000Base-X/2500Base-X SerDes PCS + * MT7531BE: RGMII + +Moving the creation of the SerDes PCS from mt753x_setup to mt7530_probe +with commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS creation +to mt7530_probe function") works fine for MT7531AE which got two +instances of mtk-pcs-lynxi, however, MT7531BE requires mt7531_pll_setup +to setup clocks before the single PCS on port 6 (usually used as CPU +port) starts to work and hence the PCS creation failed on MT7531BE. + +Fix this by introducing a pointer to mt7531_create_sgmii function in +struct mt7530_priv and call it again at the end of mt753x_setup like it +was before commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS +creation to mt7530_probe function"). + +Fixes: 6de285229773 ("net: dsa: mt7530: move SGMII PCS creation to mt7530_probe function") +Signed-off-by: Daniel Golle +Acked-by: Arınç ÜNAL +Link: https://lore.kernel.org/r/ZDvlLhhqheobUvOK@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/dsa/mt7530-mdio.c | 16 ++++++++-------- + drivers/net/dsa/mt7530.c | 6 ++++++ + drivers/net/dsa/mt7530.h | 4 ++-- + 3 files changed, 16 insertions(+), 10 deletions(-) + +--- a/drivers/net/dsa/mt7530-mdio.c ++++ b/drivers/net/dsa/mt7530-mdio.c +@@ -81,14 +81,17 @@ static const struct regmap_bus mt7530_re + }; + + static int +-mt7531_create_sgmii(struct mt7530_priv *priv) ++mt7531_create_sgmii(struct mt7530_priv *priv, bool dual_sgmii) + { +- struct regmap_config *mt7531_pcs_config[2]; ++ struct regmap_config *mt7531_pcs_config[2] = {}; + struct phylink_pcs *pcs; + struct regmap *regmap; + int i, ret = 0; + +- for (i = 0; i < 2; i++) { ++ /* MT7531AE has two SGMII units for port 5 and port 6 ++ * MT7531BE has only one SGMII unit for port 6 ++ */ ++ for (i = dual_sgmii ? 0 : 1; i < 2; i++) { + mt7531_pcs_config[i] = devm_kzalloc(priv->dev, + sizeof(struct regmap_config), + GFP_KERNEL); +@@ -208,11 +211,8 @@ mt7530_probe(struct mdio_device *mdiodev + if (IS_ERR(priv->regmap)) + return PTR_ERR(priv->regmap); + +- if (priv->id == ID_MT7531) { +- ret = mt7531_create_sgmii(priv); +- if (ret) +- return ret; +- } ++ if (priv->id == ID_MT7531) ++ priv->create_sgmii = mt7531_create_sgmii; + + return dsa_register_switch(priv->ds); + } +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -3031,6 +3031,12 @@ mt753x_setup(struct dsa_switch *ds) + if (ret && priv->irq) + mt7530_free_irq_common(priv); + ++ if (priv->create_sgmii) { ++ ret = priv->create_sgmii(priv, mt7531_dual_sgmii_supported(priv)); ++ if (ret && priv->irq) ++ mt7530_free_irq(priv); ++ } ++ + return ret; + } + +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -741,10 +741,10 @@ struct mt753x_info { + * registers + * @p6_interface Holding the current port 6 interface + * @p5_intf_sel: Holding the current port 5 interface select +- * + * @irq: IRQ number of the switch + * @irq_domain: IRQ domain of the switch irq_chip + * @irq_enable: IRQ enable bits, synced to SYS_INT_EN ++ * @create_sgmii: Pointer to function creating SGMII PCS instance(s) + */ + struct mt7530_priv { + struct device *dev; +@@ -763,7 +763,6 @@ struct mt7530_priv { + unsigned int p5_intf_sel; + u8 mirror_rx; + u8 mirror_tx; +- + struct mt7530_port ports[MT7530_NUM_PORTS]; + struct mt753x_pcs pcs[MT7530_NUM_PORTS]; + /* protect among processes for registers access*/ +@@ -771,6 +770,7 @@ struct mt7530_priv { + int irq; + struct irq_domain *irq_domain; + u32 irq_enable; ++ int (*create_sgmii)(struct mt7530_priv *priv, bool dual_sgmii); + }; + + struct mt7530_hw_vlan_entry { diff --git a/target/linux/generic/backport-5.15/791-v6.2-01-net-phy-Add-driver-for-Motorcomm-yt8521-gigabit-ethernet.patch b/target/linux/generic/backport-5.15/791-v6.2-01-net-phy-Add-driver-for-Motorcomm-yt8521-gigabit-ethernet.patch new file mode 100644 index 0000000000..7eb097f86d --- /dev/null +++ b/target/linux/generic/backport-5.15/791-v6.2-01-net-phy-Add-driver-for-Motorcomm-yt8521-gigabit-ethernet.patch @@ -0,0 +1,1724 @@ +From 70479a40954cf353e87a486997a3477108c75aa9 Mon Sep 17 00:00:00 2001 +From: Frank +Date: Fri, 28 Oct 2022 17:26:21 +0800 +Subject: [PATCH] net: phy: Add driver for Motorcomm yt8521 gigabit ethernet + phy + +Add a driver for the motorcomm yt8521 gigabit ethernet phy. We have verified + the driver on StarFive VisionFive development board, which is developed by + Shanghai StarFive Technology Co., Ltd.. On the board, yt8521 gigabit ethernet + phy works in utp mode, RGMII interface, supports 1000M/100M/10M speeds, and + wol(magic package). + +Signed-off-by: Frank +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + MAINTAINERS | 1 + + drivers/net/phy/Kconfig | 2 +- + drivers/net/phy/motorcomm.c | 1635 ++++++++++++++++++++++++++++++++++- + 3 files changed, 1635 insertions(+), 3 deletions(-) + +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -12694,6 +12694,7 @@ F: include/uapi/linux/meye.h + + MOTORCOMM PHY DRIVER + M: Peter Geis ++M: Frank + L: netdev@vger.kernel.org + S: Maintained + F: drivers/net/phy/motorcomm.c +--- a/drivers/net/phy/Kconfig ++++ b/drivers/net/phy/Kconfig +@@ -245,7 +245,7 @@ config MOTORCOMM_PHY + tristate "Motorcomm PHYs" + help + Enables support for Motorcomm network PHYs. +- Currently supports the YT8511 gigabit PHY. ++ Currently supports the YT8511, YT8521 Gigabit Ethernet PHYs. + + config NATIONAL_PHY + tristate "National Semiconductor PHYs" +--- a/drivers/net/phy/motorcomm.c ++++ b/drivers/net/phy/motorcomm.c +@@ -1,15 +1,106 @@ + // SPDX-License-Identifier: GPL-2.0+ + /* +- * Driver for Motorcomm PHYs ++ * Motorcomm 8511/8521 PHY driver. + * + * Author: Peter Geis ++ * Author: Frank + */ + ++#include + #include + #include + #include + + #define PHY_ID_YT8511 0x0000010a ++#define PHY_ID_YT8521 0x0000011A ++ ++/* YT8521 Register Overview ++ * UTP Register space | FIBER Register space ++ * ------------------------------------------------------------ ++ * | UTP MII | FIBER MII | ++ * | UTP MMD | | ++ * | UTP Extended | FIBER Extended | ++ * ------------------------------------------------------------ ++ * | Common Extended | ++ * ------------------------------------------------------------ ++ */ ++ ++/* 0x10 ~ 0x15 , 0x1E and 0x1F are common MII registers of yt phy */ ++ ++/* Specific Function Control Register */ ++#define YTPHY_SPECIFIC_FUNCTION_CONTROL_REG 0x10 ++ ++/* 2b00 Manual MDI configuration ++ * 2b01 Manual MDIX configuration ++ * 2b10 Reserved ++ * 2b11 Enable automatic crossover for all modes *default* ++ */ ++#define YTPHY_SFCR_MDI_CROSSOVER_MODE_MASK (BIT(6) | BIT(5)) ++#define YTPHY_SFCR_CROSSOVER_EN BIT(3) ++#define YTPHY_SFCR_SQE_TEST_EN BIT(2) ++#define YTPHY_SFCR_POLARITY_REVERSAL_EN BIT(1) ++#define YTPHY_SFCR_JABBER_DIS BIT(0) ++ ++/* Specific Status Register */ ++#define YTPHY_SPECIFIC_STATUS_REG 0x11 ++#define YTPHY_SSR_SPEED_MODE_OFFSET 14 ++ ++#define YTPHY_SSR_SPEED_MODE_MASK (BIT(15) | BIT(14)) ++#define YTPHY_SSR_SPEED_10M 0x0 ++#define YTPHY_SSR_SPEED_100M 0x1 ++#define YTPHY_SSR_SPEED_1000M 0x2 ++#define YTPHY_SSR_DUPLEX_OFFSET 13 ++#define YTPHY_SSR_DUPLEX BIT(13) ++#define YTPHY_SSR_PAGE_RECEIVED BIT(12) ++#define YTPHY_SSR_SPEED_DUPLEX_RESOLVED BIT(11) ++#define YTPHY_SSR_LINK BIT(10) ++#define YTPHY_SSR_MDIX_CROSSOVER BIT(6) ++#define YTPHY_SSR_DOWNGRADE BIT(5) ++#define YTPHY_SSR_TRANSMIT_PAUSE BIT(3) ++#define YTPHY_SSR_RECEIVE_PAUSE BIT(2) ++#define YTPHY_SSR_POLARITY BIT(1) ++#define YTPHY_SSR_JABBER BIT(0) ++ ++/* Interrupt enable Register */ ++#define YTPHY_INTERRUPT_ENABLE_REG 0x12 ++#define YTPHY_IER_WOL BIT(6) ++ ++/* Interrupt Status Register */ ++#define YTPHY_INTERRUPT_STATUS_REG 0x13 ++#define YTPHY_ISR_AUTONEG_ERR BIT(15) ++#define YTPHY_ISR_SPEED_CHANGED BIT(14) ++#define YTPHY_ISR_DUPLEX_CHANGED BIT(13) ++#define YTPHY_ISR_PAGE_RECEIVED BIT(12) ++#define YTPHY_ISR_LINK_FAILED BIT(11) ++#define YTPHY_ISR_LINK_SUCCESSED BIT(10) ++#define YTPHY_ISR_WOL BIT(6) ++#define YTPHY_ISR_WIRESPEED_DOWNGRADE BIT(5) ++#define YTPHY_ISR_SERDES_LINK_FAILED BIT(3) ++#define YTPHY_ISR_SERDES_LINK_SUCCESSED BIT(2) ++#define YTPHY_ISR_POLARITY_CHANGED BIT(1) ++#define YTPHY_ISR_JABBER_HAPPENED BIT(0) ++ ++/* Speed Auto Downgrade Control Register */ ++#define YTPHY_SPEED_AUTO_DOWNGRADE_CONTROL_REG 0x14 ++#define YTPHY_SADCR_SPEED_DOWNGRADE_EN BIT(5) ++ ++/* If these bits are set to 3, the PHY attempts five times ( 3(set value) + ++ * additional 2) before downgrading, default 0x3 ++ */ ++#define YTPHY_SADCR_SPEED_RETRY_LIMIT (0x3 << 2) ++ ++/* Rx Error Counter Register */ ++#define YTPHY_RX_ERROR_COUNTER_REG 0x15 ++ ++/* Extended Register's Address Offset Register */ ++#define YTPHY_PAGE_SELECT 0x1E ++ ++/* Extended Register's Data Register */ ++#define YTPHY_PAGE_DATA 0x1F ++ ++/* FIBER Auto-Negotiation link partner ability */ ++#define YTPHY_FLPA_PAUSE (0x3 << 7) ++#define YTPHY_FLPA_ASYM_PAUSE (0x2 << 7) + + #define YT8511_PAGE_SELECT 0x1e + #define YT8511_PAGE 0x1f +@@ -38,6 +129,352 @@ + #define YT8511_DELAY_FE_TX_EN (0xf << 12) + #define YT8511_DELAY_FE_TX_DIS (0x2 << 12) + ++/* Extended register is different from MMD Register and MII Register. ++ * We can use ytphy_read_ext/ytphy_write_ext/ytphy_modify_ext function to ++ * operate extended register. ++ * Extended Register start ++ */ ++ ++/* Phy gmii clock gating Register */ ++#define YT8521_CLOCK_GATING_REG 0xC ++#define YT8521_CGR_RX_CLK_EN BIT(12) ++ ++#define YT8521_EXTREG_SLEEP_CONTROL1_REG 0x27 ++#define YT8521_ESC1R_SLEEP_SW BIT(15) ++#define YT8521_ESC1R_PLLON_SLP BIT(14) ++ ++/* Phy fiber Link timer cfg2 Register */ ++#define YT8521_LINK_TIMER_CFG2_REG 0xA5 ++#define YT8521_LTCR_EN_AUTOSEN BIT(15) ++ ++/* 0xA000, 0xA001, 0xA003 ,and 0xA006 ~ 0xA00A are common ext registers ++ * of yt8521 phy. There is no need to switch reg space when operating these ++ * registers. ++ */ ++ ++#define YT8521_REG_SPACE_SELECT_REG 0xA000 ++#define YT8521_RSSR_SPACE_MASK BIT(1) ++#define YT8521_RSSR_FIBER_SPACE (0x1 << 1) ++#define YT8521_RSSR_UTP_SPACE (0x0 << 1) ++#define YT8521_RSSR_TO_BE_ARBITRATED (0xFF) ++ ++#define YT8521_CHIP_CONFIG_REG 0xA001 ++#define YT8521_CCR_SW_RST BIT(15) ++ ++#define YT8521_CCR_MODE_SEL_MASK (BIT(2) | BIT(1) | BIT(0)) ++#define YT8521_CCR_MODE_UTP_TO_RGMII 0 ++#define YT8521_CCR_MODE_FIBER_TO_RGMII 1 ++#define YT8521_CCR_MODE_UTP_FIBER_TO_RGMII 2 ++#define YT8521_CCR_MODE_UTP_TO_SGMII 3 ++#define YT8521_CCR_MODE_SGPHY_TO_RGMAC 4 ++#define YT8521_CCR_MODE_SGMAC_TO_RGPHY 5 ++#define YT8521_CCR_MODE_UTP_TO_FIBER_AUTO 6 ++#define YT8521_CCR_MODE_UTP_TO_FIBER_FORCE 7 ++ ++/* 3 phy polling modes,poll mode combines utp and fiber mode*/ ++#define YT8521_MODE_FIBER 0x1 ++#define YT8521_MODE_UTP 0x2 ++#define YT8521_MODE_POLL 0x3 ++ ++#define YT8521_RGMII_CONFIG1_REG 0xA003 ++ ++/* TX Gig-E Delay is bits 3:0, default 0x1 ++ * TX Fast-E Delay is bits 7:4, default 0xf ++ * RX Delay is bits 13:10, default 0x0 ++ * Delay = 150ps * N ++ * On = 2250ps, off = 0ps ++ */ ++#define YT8521_RC1R_RX_DELAY_MASK (0xF << 10) ++#define YT8521_RC1R_RX_DELAY_EN (0xF << 10) ++#define YT8521_RC1R_RX_DELAY_DIS (0x0 << 10) ++#define YT8521_RC1R_FE_TX_DELAY_MASK (0xF << 4) ++#define YT8521_RC1R_FE_TX_DELAY_EN (0xF << 4) ++#define YT8521_RC1R_FE_TX_DELAY_DIS (0x0 << 4) ++#define YT8521_RC1R_GE_TX_DELAY_MASK (0xF << 0) ++#define YT8521_RC1R_GE_TX_DELAY_EN (0xF << 0) ++#define YT8521_RC1R_GE_TX_DELAY_DIS (0x0 << 0) ++ ++#define YTPHY_MISC_CONFIG_REG 0xA006 ++#define YTPHY_MCR_FIBER_SPEED_MASK BIT(0) ++#define YTPHY_MCR_FIBER_1000BX (0x1 << 0) ++#define YTPHY_MCR_FIBER_100FX (0x0 << 0) ++ ++/* WOL MAC ADDR: MACADDR2(highest), MACADDR1(middle), MACADDR0(lowest) */ ++#define YTPHY_WOL_MACADDR2_REG 0xA007 ++#define YTPHY_WOL_MACADDR1_REG 0xA008 ++#define YTPHY_WOL_MACADDR0_REG 0xA009 ++ ++#define YTPHY_WOL_CONFIG_REG 0xA00A ++#define YTPHY_WCR_INTR_SEL BIT(6) ++#define YTPHY_WCR_ENABLE BIT(3) ++ ++/* 2b00 84ms ++ * 2b01 168ms *default* ++ * 2b10 336ms ++ * 2b11 672ms ++ */ ++#define YTPHY_WCR_PULSE_WIDTH_MASK (BIT(2) | BIT(1)) ++#define YTPHY_WCR_PULSE_WIDTH_672MS (BIT(2) | BIT(1)) ++ ++/* 1b0 Interrupt and WOL events is level triggered and active LOW *default* ++ * 1b1 Interrupt and WOL events is pulse triggered and active LOW ++ */ ++#define YTPHY_WCR_TYPE_PULSE BIT(0) ++ ++/* Extended Register end */ ++ ++struct yt8521_priv { ++ /* combo_advertising is used for case of YT8521 in combo mode, ++ * this means that yt8521 may work in utp or fiber mode which depends ++ * on which media is connected (YT8521_RSSR_TO_BE_ARBITRATED). ++ */ ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(combo_advertising); ++ ++ /* YT8521_MODE_FIBER / YT8521_MODE_UTP / YT8521_MODE_POLL*/ ++ u8 polling_mode; ++ u8 strap_mode; /* 8 working modes */ ++ /* current reg page of yt8521 phy: ++ * YT8521_RSSR_UTP_SPACE ++ * YT8521_RSSR_FIBER_SPACE ++ * YT8521_RSSR_TO_BE_ARBITRATED ++ */ ++ u8 reg_page; ++}; ++ ++/** ++ * ytphy_read_ext() - read a PHY's extended register ++ * @phydev: a pointer to a &struct phy_device ++ * @regnum: register number to read ++ * ++ * NOTE:The caller must have taken the MDIO bus lock. ++ * ++ * returns the value of regnum reg or negative error code ++ */ ++static int ytphy_read_ext(struct phy_device *phydev, u16 regnum) ++{ ++ int ret; ++ ++ ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum); ++ if (ret < 0) ++ return ret; ++ ++ return __phy_read(phydev, YTPHY_PAGE_DATA); ++} ++ ++/** ++ * ytphy_read_ext_with_lock() - read a PHY's extended register ++ * @phydev: a pointer to a &struct phy_device ++ * @regnum: register number to read ++ * ++ * returns the value of regnum reg or negative error code ++ */ ++static int ytphy_read_ext_with_lock(struct phy_device *phydev, u16 regnum) ++{ ++ int ret; ++ ++ phy_lock_mdio_bus(phydev); ++ ret = ytphy_read_ext(phydev, regnum); ++ phy_unlock_mdio_bus(phydev); ++ ++ return ret; ++} ++ ++/** ++ * ytphy_write_ext() - write a PHY's extended register ++ * @phydev: a pointer to a &struct phy_device ++ * @regnum: register number to write ++ * @val: value to write to @regnum ++ * ++ * NOTE:The caller must have taken the MDIO bus lock. ++ * ++ * returns 0 or negative error code ++ */ ++static int ytphy_write_ext(struct phy_device *phydev, u16 regnum, u16 val) ++{ ++ int ret; ++ ++ ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum); ++ if (ret < 0) ++ return ret; ++ ++ return __phy_write(phydev, YTPHY_PAGE_DATA, val); ++} ++ ++/** ++ * ytphy_write_ext_with_lock() - write a PHY's extended register ++ * @phydev: a pointer to a &struct phy_device ++ * @regnum: register number to write ++ * @val: value to write to @regnum ++ * ++ * returns 0 or negative error code ++ */ ++static int ytphy_write_ext_with_lock(struct phy_device *phydev, u16 regnum, ++ u16 val) ++{ ++ int ret; ++ ++ phy_lock_mdio_bus(phydev); ++ ret = ytphy_write_ext(phydev, regnum, val); ++ phy_unlock_mdio_bus(phydev); ++ ++ return ret; ++} ++ ++/** ++ * ytphy_modify_ext() - bits modify a PHY's extended register ++ * @phydev: a pointer to a &struct phy_device ++ * @regnum: register number to write ++ * @mask: bit mask of bits to clear ++ * @set: bit mask of bits to set ++ * ++ * NOTE: Convenience function which allows a PHY's extended register to be ++ * modified as new register value = (old register value & ~mask) | set. ++ * The caller must have taken the MDIO bus lock. ++ * ++ * returns 0 or negative error code ++ */ ++static int ytphy_modify_ext(struct phy_device *phydev, u16 regnum, u16 mask, ++ u16 set) ++{ ++ int ret; ++ ++ ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum); ++ if (ret < 0) ++ return ret; ++ ++ return __phy_modify(phydev, YTPHY_PAGE_DATA, mask, set); ++} ++ ++/** ++ * ytphy_modify_ext_with_lock() - bits modify a PHY's extended register ++ * @phydev: a pointer to a &struct phy_device ++ * @regnum: register number to write ++ * @mask: bit mask of bits to clear ++ * @set: bit mask of bits to set ++ * ++ * NOTE: Convenience function which allows a PHY's extended register to be ++ * modified as new register value = (old register value & ~mask) | set. ++ * ++ * returns 0 or negative error code ++ */ ++static int ytphy_modify_ext_with_lock(struct phy_device *phydev, u16 regnum, ++ u16 mask, u16 set) ++{ ++ int ret; ++ ++ phy_lock_mdio_bus(phydev); ++ ret = ytphy_modify_ext(phydev, regnum, mask, set); ++ phy_unlock_mdio_bus(phydev); ++ ++ return ret; ++} ++ ++/** ++ * ytphy_get_wol() - report whether wake-on-lan is enabled ++ * @phydev: a pointer to a &struct phy_device ++ * @wol: a pointer to a &struct ethtool_wolinfo ++ * ++ * NOTE: YTPHY_WOL_CONFIG_REG is common ext reg. ++ */ ++static void ytphy_get_wol(struct phy_device *phydev, ++ struct ethtool_wolinfo *wol) ++{ ++ int wol_config; ++ ++ wol->supported = WAKE_MAGIC; ++ wol->wolopts = 0; ++ ++ wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG); ++ if (wol_config < 0) ++ return; ++ ++ if (wol_config & YTPHY_WCR_ENABLE) ++ wol->wolopts |= WAKE_MAGIC; ++} ++ ++/** ++ * ytphy_set_wol() - turn wake-on-lan on or off ++ * @phydev: a pointer to a &struct phy_device ++ * @wol: a pointer to a &struct ethtool_wolinfo ++ * ++ * NOTE: YTPHY_WOL_CONFIG_REG, YTPHY_WOL_MACADDR2_REG, YTPHY_WOL_MACADDR1_REG ++ * and YTPHY_WOL_MACADDR0_REG are common ext reg. The ++ * YTPHY_INTERRUPT_ENABLE_REG of UTP is special, fiber also use this register. ++ * ++ * returns 0 or negative errno code ++ */ ++static int ytphy_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) ++{ ++ struct net_device *p_attached_dev; ++ const u16 mac_addr_reg[] = { ++ YTPHY_WOL_MACADDR2_REG, ++ YTPHY_WOL_MACADDR1_REG, ++ YTPHY_WOL_MACADDR0_REG, ++ }; ++ const u8 *mac_addr; ++ int old_page; ++ int ret = 0; ++ u16 mask; ++ u16 val; ++ u8 i; ++ ++ if (wol->wolopts & WAKE_MAGIC) { ++ p_attached_dev = phydev->attached_dev; ++ if (!p_attached_dev) ++ return -ENODEV; ++ ++ mac_addr = (const u8 *)p_attached_dev->dev_addr; ++ if (!is_valid_ether_addr(mac_addr)) ++ return -EINVAL; ++ ++ /* lock mdio bus then switch to utp reg space */ ++ old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE); ++ if (old_page < 0) ++ goto err_restore_page; ++ ++ /* Store the device address for the magic packet */ ++ for (i = 0; i < 3; i++) { ++ ret = ytphy_write_ext(phydev, mac_addr_reg[i], ++ ((mac_addr[i * 2] << 8)) | ++ (mac_addr[i * 2 + 1])); ++ if (ret < 0) ++ goto err_restore_page; ++ } ++ ++ /* Enable WOL feature */ ++ mask = YTPHY_WCR_PULSE_WIDTH_MASK | YTPHY_WCR_INTR_SEL; ++ val = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL; ++ val |= YTPHY_WCR_TYPE_PULSE | YTPHY_WCR_PULSE_WIDTH_672MS; ++ ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, val); ++ if (ret < 0) ++ goto err_restore_page; ++ ++ /* Enable WOL interrupt */ ++ ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 0, ++ YTPHY_IER_WOL); ++ if (ret < 0) ++ goto err_restore_page; ++ ++ } else { ++ old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE); ++ if (old_page < 0) ++ goto err_restore_page; ++ ++ /* Disable WOL feature */ ++ mask = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL; ++ ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, 0); ++ ++ /* Disable WOL interrupt */ ++ ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, ++ YTPHY_IER_WOL, 0); ++ if (ret < 0) ++ goto err_restore_page; ++ } ++ ++err_restore_page: ++ return phy_restore_page(phydev, old_page, ret); ++} ++ + static int yt8511_read_page(struct phy_device *phydev) + { + return __phy_read(phydev, YT8511_PAGE_SELECT); +@@ -111,6 +548,1181 @@ err_restore_page: + return phy_restore_page(phydev, oldpage, ret); + } + ++/** ++ * yt8521_read_page() - read reg page ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * returns current reg space of yt8521 (YT8521_RSSR_FIBER_SPACE/ ++ * YT8521_RSSR_UTP_SPACE) or negative errno code ++ */ ++static int yt8521_read_page(struct phy_device *phydev) ++{ ++ int old_page; ++ ++ old_page = ytphy_read_ext(phydev, YT8521_REG_SPACE_SELECT_REG); ++ if (old_page < 0) ++ return old_page; ++ ++ if ((old_page & YT8521_RSSR_SPACE_MASK) == YT8521_RSSR_FIBER_SPACE) ++ return YT8521_RSSR_FIBER_SPACE; ++ ++ return YT8521_RSSR_UTP_SPACE; ++}; ++ ++/** ++ * yt8521_write_page() - write reg page ++ * @phydev: a pointer to a &struct phy_device ++ * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to write. ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_write_page(struct phy_device *phydev, int page) ++{ ++ int mask = YT8521_RSSR_SPACE_MASK; ++ int set; ++ ++ if ((page & YT8521_RSSR_SPACE_MASK) == YT8521_RSSR_FIBER_SPACE) ++ set = YT8521_RSSR_FIBER_SPACE; ++ else ++ set = YT8521_RSSR_UTP_SPACE; ++ ++ return ytphy_modify_ext(phydev, YT8521_REG_SPACE_SELECT_REG, mask, set); ++}; ++ ++/** ++ * yt8521_probe() - read chip config then set suitable polling_mode ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_probe(struct phy_device *phydev) ++{ ++ struct device *dev = &phydev->mdio.dev; ++ struct yt8521_priv *priv; ++ int chip_config; ++ int ret; ++ ++ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ phydev->priv = priv; ++ ++ chip_config = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG); ++ if (chip_config < 0) ++ return chip_config; ++ ++ priv->strap_mode = chip_config & YT8521_CCR_MODE_SEL_MASK; ++ switch (priv->strap_mode) { ++ case YT8521_CCR_MODE_FIBER_TO_RGMII: ++ case YT8521_CCR_MODE_SGPHY_TO_RGMAC: ++ case YT8521_CCR_MODE_SGMAC_TO_RGPHY: ++ priv->polling_mode = YT8521_MODE_FIBER; ++ priv->reg_page = YT8521_RSSR_FIBER_SPACE; ++ phydev->port = PORT_FIBRE; ++ break; ++ case YT8521_CCR_MODE_UTP_FIBER_TO_RGMII: ++ case YT8521_CCR_MODE_UTP_TO_FIBER_AUTO: ++ case YT8521_CCR_MODE_UTP_TO_FIBER_FORCE: ++ priv->polling_mode = YT8521_MODE_POLL; ++ priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED; ++ phydev->port = PORT_NONE; ++ break; ++ case YT8521_CCR_MODE_UTP_TO_SGMII: ++ case YT8521_CCR_MODE_UTP_TO_RGMII: ++ priv->polling_mode = YT8521_MODE_UTP; ++ priv->reg_page = YT8521_RSSR_UTP_SPACE; ++ phydev->port = PORT_TP; ++ break; ++ } ++ /* set default reg space */ ++ if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { ++ ret = ytphy_write_ext_with_lock(phydev, ++ YT8521_REG_SPACE_SELECT_REG, ++ priv->reg_page); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ ++/** ++ * ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * NOTE:The caller must have taken the MDIO bus lock. ++ * ++ * returns 0 or negative errno code ++ */ ++static int ytphy_utp_read_lpa(struct phy_device *phydev) ++{ ++ int lpa, lpagb; ++ ++ if (phydev->autoneg == AUTONEG_ENABLE) { ++ if (!phydev->autoneg_complete) { ++ mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, ++ 0); ++ mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0); ++ return 0; ++ } ++ ++ if (phydev->is_gigabit_capable) { ++ lpagb = __phy_read(phydev, MII_STAT1000); ++ if (lpagb < 0) ++ return lpagb; ++ ++ if (lpagb & LPA_1000MSFAIL) { ++ int adv = __phy_read(phydev, MII_CTRL1000); ++ ++ if (adv < 0) ++ return adv; ++ ++ if (adv & CTL1000_ENABLE_MASTER) ++ phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n"); ++ else ++ phydev_err(phydev, "Master/Slave resolution failed\n"); ++ return -ENOLINK; ++ } ++ ++ mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, ++ lpagb); ++ } ++ ++ lpa = __phy_read(phydev, MII_LPA); ++ if (lpa < 0) ++ return lpa; ++ ++ mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa); ++ } else { ++ linkmode_zero(phydev->lp_advertising); ++ } ++ ++ return 0; ++} ++ ++/** ++ * yt8521_adjust_status() - update speed and duplex to phydev. when in fiber ++ * mode, adjust speed and duplex. ++ * @phydev: a pointer to a &struct phy_device ++ * @status: yt8521 status read from YTPHY_SPECIFIC_STATUS_REG ++ * @is_utp: false(yt8521 work in fiber mode) or true(yt8521 work in utp mode) ++ * ++ * NOTE:The caller must have taken the MDIO bus lock. ++ * ++ * returns 0 ++ */ ++static int yt8521_adjust_status(struct phy_device *phydev, int status, ++ bool is_utp) ++{ ++ int speed_mode, duplex; ++ int speed; ++ int err; ++ int lpa; ++ ++ if (is_utp) ++ duplex = (status & YTPHY_SSR_DUPLEX) >> YTPHY_SSR_DUPLEX_OFFSET; ++ else ++ duplex = DUPLEX_FULL; /* for fiber, it always DUPLEX_FULL */ ++ ++ speed_mode = (status & YTPHY_SSR_SPEED_MODE_MASK) >> ++ YTPHY_SSR_SPEED_MODE_OFFSET; ++ ++ switch (speed_mode) { ++ case YTPHY_SSR_SPEED_10M: ++ if (is_utp) ++ speed = SPEED_10; ++ else ++ /* for fiber, it will never run here, default to ++ * SPEED_UNKNOWN ++ */ ++ speed = SPEED_UNKNOWN; ++ break; ++ case YTPHY_SSR_SPEED_100M: ++ speed = SPEED_100; ++ break; ++ case YTPHY_SSR_SPEED_1000M: ++ speed = SPEED_1000; ++ break; ++ default: ++ speed = SPEED_UNKNOWN; ++ break; ++ } ++ ++ phydev->speed = speed; ++ phydev->duplex = duplex; ++ ++ if (is_utp) { ++ err = ytphy_utp_read_lpa(phydev); ++ if (err < 0) ++ return err; ++ ++ phy_resolve_aneg_pause(phydev); ++ } else { ++ lpa = __phy_read(phydev, MII_LPA); ++ if (lpa < 0) ++ return lpa; ++ ++ /* only support 1000baseX Full */ ++ linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, ++ phydev->lp_advertising, lpa & LPA_1000XFULL); ++ ++ if (!(lpa & YTPHY_FLPA_PAUSE)) { ++ phydev->pause = 0; ++ phydev->asym_pause = 0; ++ } else if ((lpa & YTPHY_FLPA_ASYM_PAUSE)) { ++ phydev->pause = 1; ++ phydev->asym_pause = 1; ++ } else { ++ phydev->pause = 1; ++ phydev->asym_pause = 0; ++ } ++ } ++ ++ return 0; ++} ++ ++/** ++ * yt8521_read_status_paged() - determines the speed and duplex of one page ++ * @phydev: a pointer to a &struct phy_device ++ * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to ++ * operate. ++ * ++ * returns 1 (utp or fiber link),0 (no link) or negative errno code ++ */ ++static int yt8521_read_status_paged(struct phy_device *phydev, int page) ++{ ++ int fiber_latch_val; ++ int fiber_curr_val; ++ int old_page; ++ int ret = 0; ++ int status; ++ int link; ++ ++ linkmode_zero(phydev->lp_advertising); ++ phydev->duplex = DUPLEX_UNKNOWN; ++ phydev->speed = SPEED_UNKNOWN; ++ phydev->asym_pause = 0; ++ phydev->pause = 0; ++ ++ /* YT8521 has two reg space (utp/fiber) for linkup with utp/fiber ++ * respectively. but for utp/fiber combo mode, reg space should be ++ * arbitrated based on media priority. by default, utp takes ++ * priority. reg space should be properly set before read ++ * YTPHY_SPECIFIC_STATUS_REG. ++ */ ++ ++ page &= YT8521_RSSR_SPACE_MASK; ++ old_page = phy_select_page(phydev, page); ++ if (old_page < 0) ++ goto err_restore_page; ++ ++ /* Read YTPHY_SPECIFIC_STATUS_REG, which indicates the speed and duplex ++ * of the PHY is actually using. ++ */ ++ ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG); ++ if (ret < 0) ++ goto err_restore_page; ++ ++ status = ret; ++ link = !!(status & YTPHY_SSR_LINK); ++ ++ /* When PHY is in fiber mode, speed transferred from 1000Mbps to ++ * 100Mbps,there is not link down from YTPHY_SPECIFIC_STATUS_REG, so ++ * we need check MII_BMSR to identify such case. ++ */ ++ if (page == YT8521_RSSR_FIBER_SPACE) { ++ ret = __phy_read(phydev, MII_BMSR); ++ if (ret < 0) ++ goto err_restore_page; ++ ++ fiber_latch_val = ret; ++ ret = __phy_read(phydev, MII_BMSR); ++ if (ret < 0) ++ goto err_restore_page; ++ ++ fiber_curr_val = ret; ++ if (link && fiber_latch_val != fiber_curr_val) { ++ link = 0; ++ phydev_info(phydev, ++ "%s, fiber link down detect, latch = %04x, curr = %04x\n", ++ __func__, fiber_latch_val, fiber_curr_val); ++ } ++ } else { ++ /* Read autonegotiation status */ ++ ret = __phy_read(phydev, MII_BMSR); ++ if (ret < 0) ++ goto err_restore_page; ++ ++ phydev->autoneg_complete = ret & BMSR_ANEGCOMPLETE ? 1 : 0; ++ } ++ ++ if (link) { ++ if (page == YT8521_RSSR_UTP_SPACE) ++ yt8521_adjust_status(phydev, status, true); ++ else ++ yt8521_adjust_status(phydev, status, false); ++ } ++ return phy_restore_page(phydev, old_page, link); ++ ++err_restore_page: ++ return phy_restore_page(phydev, old_page, ret); ++} ++ ++/** ++ * yt8521_read_status() - determines the negotiated speed and duplex ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_read_status(struct phy_device *phydev) ++{ ++ struct yt8521_priv *priv = phydev->priv; ++ int link_fiber = 0; ++ int link_utp; ++ int link; ++ int ret; ++ ++ if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { ++ link = yt8521_read_status_paged(phydev, priv->reg_page); ++ if (link < 0) ++ return link; ++ } else { ++ /* when page is YT8521_RSSR_TO_BE_ARBITRATED, arbitration is ++ * needed. by default, utp is higher priority. ++ */ ++ ++ link_utp = yt8521_read_status_paged(phydev, ++ YT8521_RSSR_UTP_SPACE); ++ if (link_utp < 0) ++ return link_utp; ++ ++ if (!link_utp) { ++ link_fiber = yt8521_read_status_paged(phydev, ++ YT8521_RSSR_FIBER_SPACE); ++ if (link_fiber < 0) ++ return link_fiber; ++ } ++ ++ link = link_utp || link_fiber; ++ } ++ ++ if (link) { ++ if (phydev->link == 0) { ++ /* arbitrate reg space based on linkup media type. */ ++ if (priv->polling_mode == YT8521_MODE_POLL && ++ priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) { ++ if (link_fiber) ++ priv->reg_page = ++ YT8521_RSSR_FIBER_SPACE; ++ else ++ priv->reg_page = YT8521_RSSR_UTP_SPACE; ++ ++ ret = ytphy_write_ext_with_lock(phydev, ++ YT8521_REG_SPACE_SELECT_REG, ++ priv->reg_page); ++ if (ret < 0) ++ return ret; ++ ++ phydev->port = link_fiber ? PORT_FIBRE : PORT_TP; ++ ++ phydev_info(phydev, "%s, link up, media: %s\n", ++ __func__, ++ (phydev->port == PORT_TP) ? ++ "UTP" : "Fiber"); ++ } ++ } ++ phydev->link = 1; ++ } else { ++ if (phydev->link == 1) { ++ phydev_info(phydev, "%s, link down, media: %s\n", ++ __func__, (phydev->port == PORT_TP) ? ++ "UTP" : "Fiber"); ++ ++ /* When in YT8521_MODE_POLL mode, need prepare for next ++ * arbitration. ++ */ ++ if (priv->polling_mode == YT8521_MODE_POLL) { ++ priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED; ++ phydev->port = PORT_NONE; ++ } ++ } ++ ++ phydev->link = 0; ++ } ++ ++ return 0; ++} ++ ++/** ++ * yt8521_modify_bmcr_paged - bits modify a PHY's BMCR register of one page ++ * @phydev: the phy_device struct ++ * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to operate ++ * @mask: bit mask of bits to clear ++ * @set: bit mask of bits to set ++ * ++ * NOTE: Convenience function which allows a PHY's BMCR register to be ++ * modified as new register value = (old register value & ~mask) | set. ++ * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space ++ * has MII_BMCR. poll mode combines utp and faber,so need do both. ++ * If it is reset, it will wait for completion. ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_modify_bmcr_paged(struct phy_device *phydev, int page, ++ u16 mask, u16 set) ++{ ++ int max_cnt = 500; /* the max wait time of reset ~ 500 ms */ ++ int old_page; ++ int ret = 0; ++ ++ old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK); ++ if (old_page < 0) ++ goto err_restore_page; ++ ++ ret = __phy_modify(phydev, MII_BMCR, mask, set); ++ if (ret < 0) ++ goto err_restore_page; ++ ++ /* If it is reset, need to wait for the reset to complete */ ++ if (set == BMCR_RESET) { ++ while (max_cnt--) { ++ usleep_range(1000, 1100); ++ ret = __phy_read(phydev, MII_BMCR); ++ if (ret < 0) ++ goto err_restore_page; ++ ++ if (!(ret & BMCR_RESET)) ++ return phy_restore_page(phydev, old_page, 0); ++ } ++ } ++ ++err_restore_page: ++ return phy_restore_page(phydev, old_page, ret); ++} ++ ++/** ++ * yt8521_modify_utp_fiber_bmcr - bits modify a PHY's BMCR register ++ * @phydev: the phy_device struct ++ * @mask: bit mask of bits to clear ++ * @set: bit mask of bits to set ++ * ++ * NOTE: Convenience function which allows a PHY's BMCR register to be ++ * modified as new register value = (old register value & ~mask) | set. ++ * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space ++ * has MII_BMCR. poll mode combines utp and faber,so need do both. ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_modify_utp_fiber_bmcr(struct phy_device *phydev, u16 mask, ++ u16 set) ++{ ++ struct yt8521_priv *priv = phydev->priv; ++ int ret; ++ ++ if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { ++ ret = yt8521_modify_bmcr_paged(phydev, priv->reg_page, mask, ++ set); ++ if (ret < 0) ++ return ret; ++ } else { ++ ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE, ++ mask, set); ++ if (ret < 0) ++ return ret; ++ ++ ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE, ++ mask, set); ++ if (ret < 0) ++ return ret; ++ } ++ return 0; ++} ++ ++/** ++ * yt8521_soft_reset() - called to issue a PHY software reset ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_soft_reset(struct phy_device *phydev) ++{ ++ return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_RESET); ++} ++ ++/** ++ * yt8521_suspend() - suspend the hardware ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_suspend(struct phy_device *phydev) ++{ ++ int wol_config; ++ ++ /* YTPHY_WOL_CONFIG_REG is common ext reg */ ++ wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG); ++ if (wol_config < 0) ++ return wol_config; ++ ++ /* if wol enable, do nothing */ ++ if (wol_config & YTPHY_WCR_ENABLE) ++ return 0; ++ ++ return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN); ++} ++ ++/** ++ * yt8521_resume() - resume the hardware ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_resume(struct phy_device *phydev) ++{ ++ int ret; ++ int wol_config; ++ ++ /* disable auto sleep */ ++ ret = ytphy_modify_ext_with_lock(phydev, ++ YT8521_EXTREG_SLEEP_CONTROL1_REG, ++ YT8521_ESC1R_SLEEP_SW, 0); ++ if (ret < 0) ++ return ret; ++ ++ wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG); ++ if (wol_config < 0) ++ return wol_config; ++ ++ /* if wol enable, do nothing */ ++ if (wol_config & YTPHY_WCR_ENABLE) ++ return 0; ++ ++ return yt8521_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0); ++} ++ ++/** ++ * yt8521_config_init() - called to initialize the PHY ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_config_init(struct phy_device *phydev) ++{ ++ int old_page; ++ int ret = 0; ++ u16 val; ++ ++ old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE); ++ if (old_page < 0) ++ goto err_restore_page; ++ ++ switch (phydev->interface) { ++ case PHY_INTERFACE_MODE_RGMII: ++ val = YT8521_RC1R_GE_TX_DELAY_DIS | YT8521_RC1R_GE_TX_DELAY_DIS; ++ val |= YT8521_RC1R_RX_DELAY_DIS; ++ break; ++ case PHY_INTERFACE_MODE_RGMII_RXID: ++ val = YT8521_RC1R_GE_TX_DELAY_DIS | YT8521_RC1R_GE_TX_DELAY_DIS; ++ val |= YT8521_RC1R_RX_DELAY_EN; ++ break; ++ case PHY_INTERFACE_MODE_RGMII_TXID: ++ val = YT8521_RC1R_GE_TX_DELAY_EN | YT8521_RC1R_GE_TX_DELAY_EN; ++ val |= YT8521_RC1R_RX_DELAY_DIS; ++ break; ++ case PHY_INTERFACE_MODE_RGMII_ID: ++ val = YT8521_RC1R_GE_TX_DELAY_EN | YT8521_RC1R_GE_TX_DELAY_EN; ++ val |= YT8521_RC1R_RX_DELAY_EN; ++ break; ++ case PHY_INTERFACE_MODE_SGMII: ++ break; ++ default: /* do not support other modes */ ++ ret = -EOPNOTSUPP; ++ goto err_restore_page; ++ } ++ ++ /* set rgmii delay mode */ ++ if (phydev->interface != PHY_INTERFACE_MODE_SGMII) { ++ ret = ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, ++ (YT8521_RC1R_RX_DELAY_MASK | ++ YT8521_RC1R_FE_TX_DELAY_MASK | ++ YT8521_RC1R_GE_TX_DELAY_MASK), ++ val); ++ if (ret < 0) ++ goto err_restore_page; ++ } ++ ++ /* disable auto sleep */ ++ ret = ytphy_modify_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1_REG, ++ YT8521_ESC1R_SLEEP_SW, 0); ++ if (ret < 0) ++ goto err_restore_page; ++ ++ /* enable RXC clock when no wire plug */ ++ ret = ytphy_modify_ext(phydev, YT8521_CLOCK_GATING_REG, ++ YT8521_CGR_RX_CLK_EN, 0); ++ if (ret < 0) ++ goto err_restore_page; ++ ++err_restore_page: ++ return phy_restore_page(phydev, old_page, ret); ++} ++ ++/** ++ * yt8521_prepare_fiber_features() - A small helper function that setup ++ * fiber's features. ++ * @phydev: a pointer to a &struct phy_device ++ * @dst: a pointer to store fiber's features ++ */ ++static void yt8521_prepare_fiber_features(struct phy_device *phydev, ++ unsigned long *dst) ++{ ++ linkmode_set_bit(ETHTOOL_LINK_MODE_100baseFX_Full_BIT, dst); ++ linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, dst); ++ linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, dst); ++ linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, dst); ++} ++ ++/** ++ * yt8521_fiber_setup_forced - configures/forces speed from @phydev ++ * @phydev: target phy_device struct ++ * ++ * NOTE:The caller must have taken the MDIO bus lock. ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_fiber_setup_forced(struct phy_device *phydev) ++{ ++ u16 val; ++ int ret; ++ ++ if (phydev->speed == SPEED_1000) ++ val = YTPHY_MCR_FIBER_1000BX; ++ else if (phydev->speed == SPEED_100) ++ val = YTPHY_MCR_FIBER_100FX; ++ else ++ return -EINVAL; ++ ++ ret = __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0); ++ if (ret < 0) ++ return ret; ++ ++ /* disable Fiber auto sensing */ ++ ret = ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG, ++ YT8521_LTCR_EN_AUTOSEN, 0); ++ if (ret < 0) ++ return ret; ++ ++ ret = ytphy_modify_ext(phydev, YTPHY_MISC_CONFIG_REG, ++ YTPHY_MCR_FIBER_SPEED_MASK, val); ++ if (ret < 0) ++ return ret; ++ ++ return ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG, ++ YT8521_CCR_SW_RST, 0); ++} ++ ++/** ++ * ytphy_check_and_restart_aneg - Enable and restart auto-negotiation ++ * @phydev: target phy_device struct ++ * @restart: whether aneg restart is requested ++ * ++ * NOTE:The caller must have taken the MDIO bus lock. ++ * ++ * returns 0 or negative errno code ++ */ ++static int ytphy_check_and_restart_aneg(struct phy_device *phydev, bool restart) ++{ ++ int ret; ++ ++ if (!restart) { ++ /* Advertisement hasn't changed, but maybe aneg was never on to ++ * begin with? Or maybe phy was isolated? ++ */ ++ ret = __phy_read(phydev, MII_BMCR); ++ if (ret < 0) ++ return ret; ++ ++ if (!(ret & BMCR_ANENABLE) || (ret & BMCR_ISOLATE)) ++ restart = true; ++ } ++ /* Enable and Restart Autonegotiation ++ * Don't isolate the PHY if we're negotiating ++ */ ++ if (restart) ++ return __phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, ++ BMCR_ANENABLE | BMCR_ANRESTART); ++ ++ return 0; ++} ++ ++/** ++ * yt8521_fiber_config_aneg - restart auto-negotiation or write ++ * YTPHY_MISC_CONFIG_REG. ++ * @phydev: target phy_device struct ++ * ++ * NOTE:The caller must have taken the MDIO bus lock. ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_fiber_config_aneg(struct phy_device *phydev) ++{ ++ int err, changed = 0; ++ int bmcr; ++ u16 adv; ++ ++ if (phydev->autoneg != AUTONEG_ENABLE) ++ return yt8521_fiber_setup_forced(phydev); ++ ++ /* enable Fiber auto sensing */ ++ err = ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG, ++ 0, YT8521_LTCR_EN_AUTOSEN); ++ if (err < 0) ++ return err; ++ ++ err = ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG, ++ YT8521_CCR_SW_RST, 0); ++ if (err < 0) ++ return err; ++ ++ bmcr = __phy_read(phydev, MII_BMCR); ++ if (bmcr < 0) ++ return bmcr; ++ ++ /* When it is coming from fiber forced mode, add bmcr power down ++ * and power up to let aneg work fine. ++ */ ++ if (!(bmcr & BMCR_ANENABLE)) { ++ __phy_modify(phydev, MII_BMCR, 0, BMCR_PDOWN); ++ usleep_range(1000, 1100); ++ __phy_modify(phydev, MII_BMCR, BMCR_PDOWN, 0); ++ } ++ ++ adv = linkmode_adv_to_mii_adv_x(phydev->advertising, ++ ETHTOOL_LINK_MODE_1000baseX_Full_BIT); ++ ++ /* Setup fiber advertisement */ ++ err = __phy_modify_changed(phydev, MII_ADVERTISE, ++ ADVERTISE_1000XHALF | ADVERTISE_1000XFULL | ++ ADVERTISE_1000XPAUSE | ++ ADVERTISE_1000XPSE_ASYM, ++ adv); ++ if (err < 0) ++ return err; ++ ++ if (err > 0) ++ changed = 1; ++ ++ return ytphy_check_and_restart_aneg(phydev, changed); ++} ++ ++/** ++ * ytphy_setup_master_slave ++ * @phydev: target phy_device struct ++ * ++ * NOTE: The caller must have taken the MDIO bus lock. ++ * ++ * returns 0 or negative errno code ++ */ ++static int ytphy_setup_master_slave(struct phy_device *phydev) ++{ ++ u16 ctl = 0; ++ ++ if (!phydev->is_gigabit_capable) ++ return 0; ++ ++ switch (phydev->master_slave_set) { ++ case MASTER_SLAVE_CFG_MASTER_PREFERRED: ++ ctl |= CTL1000_PREFER_MASTER; ++ break; ++ case MASTER_SLAVE_CFG_SLAVE_PREFERRED: ++ break; ++ case MASTER_SLAVE_CFG_MASTER_FORCE: ++ ctl |= CTL1000_AS_MASTER; ++ fallthrough; ++ case MASTER_SLAVE_CFG_SLAVE_FORCE: ++ ctl |= CTL1000_ENABLE_MASTER; ++ break; ++ case MASTER_SLAVE_CFG_UNKNOWN: ++ case MASTER_SLAVE_CFG_UNSUPPORTED: ++ return 0; ++ default: ++ phydev_warn(phydev, "Unsupported Master/Slave mode\n"); ++ return -EOPNOTSUPP; ++ } ++ ++ return __phy_modify_changed(phydev, MII_CTRL1000, ++ (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER | ++ CTL1000_PREFER_MASTER), ctl); ++} ++ ++/** ++ * ytphy_utp_config_advert - sanitize and advertise auto-negotiation parameters ++ * @phydev: target phy_device struct ++ * ++ * NOTE: Writes MII_ADVERTISE with the appropriate values, ++ * after sanitizing the values to make sure we only advertise ++ * what is supported. Returns < 0 on error, 0 if the PHY's advertisement ++ * hasn't changed, and > 0 if it has changed. ++ * The caller must have taken the MDIO bus lock. ++ * ++ * returns 0 or negative errno code ++ */ ++static int ytphy_utp_config_advert(struct phy_device *phydev) ++{ ++ int err, bmsr, changed = 0; ++ u32 adv; ++ ++ /* Only allow advertising what this PHY supports */ ++ linkmode_and(phydev->advertising, phydev->advertising, ++ phydev->supported); ++ ++ adv = linkmode_adv_to_mii_adv_t(phydev->advertising); ++ ++ /* Setup standard advertisement */ ++ err = __phy_modify_changed(phydev, MII_ADVERTISE, ++ ADVERTISE_ALL | ADVERTISE_100BASE4 | ++ ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM, ++ adv); ++ if (err < 0) ++ return err; ++ if (err > 0) ++ changed = 1; ++ ++ bmsr = __phy_read(phydev, MII_BMSR); ++ if (bmsr < 0) ++ return bmsr; ++ ++ /* Per 802.3-2008, Section 22.2.4.2.16 Extended status all ++ * 1000Mbits/sec capable PHYs shall have the BMSR_ESTATEN bit set to a ++ * logical 1. ++ */ ++ if (!(bmsr & BMSR_ESTATEN)) ++ return changed; ++ ++ adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); ++ ++ err = __phy_modify_changed(phydev, MII_CTRL1000, ++ ADVERTISE_1000FULL | ADVERTISE_1000HALF, ++ adv); ++ if (err < 0) ++ return err; ++ if (err > 0) ++ changed = 1; ++ ++ return changed; ++} ++ ++/** ++ * ytphy_utp_config_aneg - restart auto-negotiation or write BMCR ++ * @phydev: target phy_device struct ++ * @changed: whether autoneg is requested ++ * ++ * NOTE: If auto-negotiation is enabled, we configure the ++ * advertising, and then restart auto-negotiation. If it is not ++ * enabled, then we write the BMCR. ++ * The caller must have taken the MDIO bus lock. ++ * ++ * returns 0 or negative errno code ++ */ ++static int ytphy_utp_config_aneg(struct phy_device *phydev, bool changed) ++{ ++ int err; ++ u16 ctl; ++ ++ err = ytphy_setup_master_slave(phydev); ++ if (err < 0) ++ return err; ++ else if (err) ++ changed = true; ++ ++ if (phydev->autoneg != AUTONEG_ENABLE) { ++ /* configures/forces speed/duplex from @phydev */ ++ ++ ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); ++ ++ return __phy_modify(phydev, MII_BMCR, ~(BMCR_LOOPBACK | ++ BMCR_ISOLATE | BMCR_PDOWN), ctl); ++ } ++ ++ err = ytphy_utp_config_advert(phydev); ++ if (err < 0) /* error */ ++ return err; ++ else if (err) ++ changed = true; ++ ++ return ytphy_check_and_restart_aneg(phydev, changed); ++} ++ ++/** ++ * yt8521_config_aneg_paged() - switch reg space then call genphy_config_aneg ++ * of one page ++ * @phydev: a pointer to a &struct phy_device ++ * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to ++ * operate. ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_config_aneg_paged(struct phy_device *phydev, int page) ++{ ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(fiber_supported); ++ struct yt8521_priv *priv = phydev->priv; ++ int old_page; ++ int ret = 0; ++ ++ page &= YT8521_RSSR_SPACE_MASK; ++ ++ old_page = phy_select_page(phydev, page); ++ if (old_page < 0) ++ goto err_restore_page; ++ ++ /* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED, ++ * phydev->advertising should be updated. ++ */ ++ if (priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) { ++ linkmode_zero(fiber_supported); ++ yt8521_prepare_fiber_features(phydev, fiber_supported); ++ ++ /* prepare fiber_supported, then setup advertising. */ ++ if (page == YT8521_RSSR_FIBER_SPACE) { ++ linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, ++ fiber_supported); ++ linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, ++ fiber_supported); ++ linkmode_and(phydev->advertising, ++ priv->combo_advertising, fiber_supported); ++ } else { ++ /* ETHTOOL_LINK_MODE_Autoneg_BIT is also used in utp */ ++ linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, ++ fiber_supported); ++ linkmode_andnot(phydev->advertising, ++ priv->combo_advertising, ++ fiber_supported); ++ } ++ } ++ ++ if (page == YT8521_RSSR_FIBER_SPACE) ++ ret = yt8521_fiber_config_aneg(phydev); ++ else ++ ret = ytphy_utp_config_aneg(phydev, false); ++ ++err_restore_page: ++ return phy_restore_page(phydev, old_page, ret); ++} ++ ++/** ++ * yt8521_config_aneg() - change reg space then call yt8521_config_aneg_paged ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_config_aneg(struct phy_device *phydev) ++{ ++ struct yt8521_priv *priv = phydev->priv; ++ int ret; ++ ++ if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { ++ ret = yt8521_config_aneg_paged(phydev, priv->reg_page); ++ if (ret < 0) ++ return ret; ++ } else { ++ /* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED, ++ * phydev->advertising need to be saved at first run. ++ * Because it contains the advertising which supported by both ++ * mac and yt8521(utp and fiber). ++ */ ++ if (linkmode_empty(priv->combo_advertising)) { ++ linkmode_copy(priv->combo_advertising, ++ phydev->advertising); ++ } ++ ++ ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_UTP_SPACE); ++ if (ret < 0) ++ return ret; ++ ++ ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_FIBER_SPACE); ++ if (ret < 0) ++ return ret; ++ ++ /* we don't known which will be link, so restore ++ * phydev->advertising as default value. ++ */ ++ linkmode_copy(phydev->advertising, priv->combo_advertising); ++ } ++ return 0; ++} ++ ++/** ++ * yt8521_aneg_done_paged() - determines the auto negotiation result of one ++ * page. ++ * @phydev: a pointer to a &struct phy_device ++ * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to ++ * operate. ++ * ++ * returns 0(no link)or 1(fiber or utp link) or negative errno code ++ */ ++static int yt8521_aneg_done_paged(struct phy_device *phydev, int page) ++{ ++ int old_page; ++ int ret = 0; ++ int link; ++ ++ old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK); ++ if (old_page < 0) ++ goto err_restore_page; ++ ++ ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG); ++ if (ret < 0) ++ goto err_restore_page; ++ ++ link = !!(ret & YTPHY_SSR_LINK); ++ ret = link; ++ ++err_restore_page: ++ return phy_restore_page(phydev, old_page, ret); ++} ++ ++/** ++ * yt8521_aneg_done() - determines the auto negotiation result ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * returns 0(no link)or 1(fiber or utp link) or negative errno code ++ */ ++static int yt8521_aneg_done(struct phy_device *phydev) ++{ ++ struct yt8521_priv *priv = phydev->priv; ++ int link_fiber = 0; ++ int link_utp; ++ int link; ++ ++ if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { ++ link = yt8521_aneg_done_paged(phydev, priv->reg_page); ++ } else { ++ link_utp = yt8521_aneg_done_paged(phydev, ++ YT8521_RSSR_UTP_SPACE); ++ if (link_utp < 0) ++ return link_utp; ++ ++ if (!link_utp) { ++ link_fiber = yt8521_aneg_done_paged(phydev, ++ YT8521_RSSR_FIBER_SPACE); ++ if (link_fiber < 0) ++ return link_fiber; ++ } ++ link = link_fiber || link_utp; ++ phydev_info(phydev, "%s, link_fiber: %d, link_utp: %d\n", ++ __func__, link_fiber, link_utp); ++ } ++ ++ return link; ++} ++ ++/** ++ * ytphy_utp_read_abilities - read PHY abilities from Clause 22 registers ++ * @phydev: target phy_device struct ++ * ++ * NOTE: Reads the PHY's abilities and populates ++ * phydev->supported accordingly. ++ * The caller must have taken the MDIO bus lock. ++ * ++ * returns 0 or negative errno code ++ */ ++static int ytphy_utp_read_abilities(struct phy_device *phydev) ++{ ++ int val; ++ ++ linkmode_set_bit_array(phy_basic_ports_array, ++ ARRAY_SIZE(phy_basic_ports_array), ++ phydev->supported); ++ ++ val = __phy_read(phydev, MII_BMSR); ++ if (val < 0) ++ return val; ++ ++ linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported, ++ val & BMSR_ANEGCAPABLE); ++ ++ linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported, ++ val & BMSR_100FULL); ++ linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported, ++ val & BMSR_100HALF); ++ linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported, ++ val & BMSR_10FULL); ++ linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported, ++ val & BMSR_10HALF); ++ ++ if (val & BMSR_ESTATEN) { ++ val = __phy_read(phydev, MII_ESTATUS); ++ if (val < 0) ++ return val; ++ ++ linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, ++ phydev->supported, val & ESTATUS_1000_TFULL); ++ linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, ++ phydev->supported, val & ESTATUS_1000_THALF); ++ linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, ++ phydev->supported, val & ESTATUS_1000_XFULL); ++ } ++ ++ return 0; ++} ++ ++/** ++ * yt8521_get_features_paged() - read supported link modes for one page ++ * @phydev: a pointer to a &struct phy_device ++ * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to ++ * operate. ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_get_features_paged(struct phy_device *phydev, int page) ++{ ++ int old_page; ++ int ret = 0; ++ ++ page &= YT8521_RSSR_SPACE_MASK; ++ old_page = phy_select_page(phydev, page); ++ if (old_page < 0) ++ goto err_restore_page; ++ ++ if (page == YT8521_RSSR_FIBER_SPACE) { ++ linkmode_zero(phydev->supported); ++ yt8521_prepare_fiber_features(phydev, phydev->supported); ++ } else { ++ ret = ytphy_utp_read_abilities(phydev); ++ if (ret < 0) ++ goto err_restore_page; ++ } ++ ++err_restore_page: ++ return phy_restore_page(phydev, old_page, ret); ++} ++ ++/** ++ * yt8521_get_features - switch reg space then call yt8521_get_features_paged ++ * @phydev: target phy_device struct ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8521_get_features(struct phy_device *phydev) ++{ ++ struct yt8521_priv *priv = phydev->priv; ++ int ret; ++ ++ if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { ++ ret = yt8521_get_features_paged(phydev, priv->reg_page); ++ } else { ++ ret = yt8521_get_features_paged(phydev, ++ YT8521_RSSR_UTP_SPACE); ++ if (ret < 0) ++ return ret; ++ ++ /* add fiber's features to phydev->supported */ ++ yt8521_prepare_fiber_features(phydev, phydev->supported); ++ } ++ return ret; ++} ++ + static struct phy_driver motorcomm_phy_drvs[] = { + { + PHY_ID_MATCH_EXACT(PHY_ID_YT8511), +@@ -121,16 +1733,35 @@ static struct phy_driver motorcomm_phy_d + .read_page = yt8511_read_page, + .write_page = yt8511_write_page, + }, ++ { ++ PHY_ID_MATCH_EXACT(PHY_ID_YT8521), ++ .name = "YT8521 Gigabit Ethernet", ++ .get_features = yt8521_get_features, ++ .probe = yt8521_probe, ++ .read_page = yt8521_read_page, ++ .write_page = yt8521_write_page, ++ .get_wol = ytphy_get_wol, ++ .set_wol = ytphy_set_wol, ++ .config_aneg = yt8521_config_aneg, ++ .aneg_done = yt8521_aneg_done, ++ .config_init = yt8521_config_init, ++ .read_status = yt8521_read_status, ++ .soft_reset = yt8521_soft_reset, ++ .suspend = yt8521_suspend, ++ .resume = yt8521_resume, ++ }, + }; + + module_phy_driver(motorcomm_phy_drvs); + +-MODULE_DESCRIPTION("Motorcomm PHY driver"); ++MODULE_DESCRIPTION("Motorcomm 8511/8521 PHY driver"); + MODULE_AUTHOR("Peter Geis"); ++MODULE_AUTHOR("Frank"); + MODULE_LICENSE("GPL"); + + static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = { + { PHY_ID_MATCH_EXACT(PHY_ID_YT8511) }, ++ { PHY_ID_MATCH_EXACT(PHY_ID_YT8521) }, + { /* sentinal */ } + }; + diff --git a/target/linux/generic/backport-5.15/791-v6.2-02-net-phy-fix-yt8521-duplicated-argument-to-or.patch b/target/linux/generic/backport-5.15/791-v6.2-02-net-phy-fix-yt8521-duplicated-argument-to-or.patch new file mode 100644 index 0000000000..cce71c8d84 --- /dev/null +++ b/target/linux/generic/backport-5.15/791-v6.2-02-net-phy-fix-yt8521-duplicated-argument-to-or.patch @@ -0,0 +1,49 @@ +From 4e0243e7128c9b25ea2739136076a95d6adaba5e Mon Sep 17 00:00:00 2001 +From: Frank +Date: Fri, 4 Nov 2022 16:44:41 +0800 +Subject: [PATCH] net: phy: fix yt8521 duplicated argument to & or | + +cocci warnings: (new ones prefixed by >>) +>> drivers/net/phy/motorcomm.c:1122:8-35: duplicated argument to & or | + drivers/net/phy/motorcomm.c:1126:8-35: duplicated argument to & or | + drivers/net/phy/motorcomm.c:1130:8-34: duplicated argument to & or | + drivers/net/phy/motorcomm.c:1134:8-34: duplicated argument to & or | + + The second YT8521_RC1R_GE_TX_DELAY_xx should be YT8521_RC1R_FE_TX_DELAY_xx. + +Fixes: 70479a40954c ("net: phy: Add driver for Motorcomm yt8521 gigabit ethernet phy") +Reported-by: kernel test robot +Reported-by: Julia Lawall +Signed-off-by: Frank +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/motorcomm.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/net/phy/motorcomm.c ++++ b/drivers/net/phy/motorcomm.c +@@ -1119,19 +1119,19 @@ static int yt8521_config_init(struct phy + + switch (phydev->interface) { + case PHY_INTERFACE_MODE_RGMII: +- val = YT8521_RC1R_GE_TX_DELAY_DIS | YT8521_RC1R_GE_TX_DELAY_DIS; ++ val = YT8521_RC1R_GE_TX_DELAY_DIS | YT8521_RC1R_FE_TX_DELAY_DIS; + val |= YT8521_RC1R_RX_DELAY_DIS; + break; + case PHY_INTERFACE_MODE_RGMII_RXID: +- val = YT8521_RC1R_GE_TX_DELAY_DIS | YT8521_RC1R_GE_TX_DELAY_DIS; ++ val = YT8521_RC1R_GE_TX_DELAY_DIS | YT8521_RC1R_FE_TX_DELAY_DIS; + val |= YT8521_RC1R_RX_DELAY_EN; + break; + case PHY_INTERFACE_MODE_RGMII_TXID: +- val = YT8521_RC1R_GE_TX_DELAY_EN | YT8521_RC1R_GE_TX_DELAY_EN; ++ val = YT8521_RC1R_GE_TX_DELAY_EN | YT8521_RC1R_FE_TX_DELAY_EN; + val |= YT8521_RC1R_RX_DELAY_DIS; + break; + case PHY_INTERFACE_MODE_RGMII_ID: +- val = YT8521_RC1R_GE_TX_DELAY_EN | YT8521_RC1R_GE_TX_DELAY_EN; ++ val = YT8521_RC1R_GE_TX_DELAY_EN | YT8521_RC1R_FE_TX_DELAY_EN; + val |= YT8521_RC1R_RX_DELAY_EN; + break; + case PHY_INTERFACE_MODE_SGMII: diff --git a/target/linux/generic/backport-5.15/791-v6.2-03-net-phy-add-Motorcomm-YT8531S-phy-id.patch b/target/linux/generic/backport-5.15/791-v6.2-03-net-phy-add-Motorcomm-YT8531S-phy-id.patch new file mode 100644 index 0000000000..da60c63905 --- /dev/null +++ b/target/linux/generic/backport-5.15/791-v6.2-03-net-phy-add-Motorcomm-YT8531S-phy-id.patch @@ -0,0 +1,140 @@ +From 813abcd98fb1b2cccf850cdfa092a4bfc50b2363 Mon Sep 17 00:00:00 2001 +From: Frank +Date: Tue, 22 Nov 2022 16:42:32 +0800 +Subject: [PATCH] net: phy: add Motorcomm YT8531S phy id. + +We added patch for motorcomm.c to support YT8531S. This patch has +been tested on AM335x platform which has one YT8531S interface +card and passed all test cases. +The tested cases indluding: YT8531S UTP function with support of +10M/100M/1000M; YT8531S Fiber function with support of 100M/1000M; +and YT8531S Combo function that supports auto detection of media type. + +Since most functions of YT8531S are similar to YT8521 and we reuse some +codes for YT8521 in the patch file. + +Signed-off-by: Frank +Signed-off-by: David S. Miller +--- + drivers/net/phy/Kconfig | 2 +- + drivers/net/phy/motorcomm.c | 52 +++++++++++++++++++++++++++++++++---- + 2 files changed, 48 insertions(+), 6 deletions(-) + +--- a/drivers/net/phy/Kconfig ++++ b/drivers/net/phy/Kconfig +@@ -245,7 +245,7 @@ config MOTORCOMM_PHY + tristate "Motorcomm PHYs" + help + Enables support for Motorcomm network PHYs. +- Currently supports the YT8511, YT8521 Gigabit Ethernet PHYs. ++ Currently supports the YT8511, YT8521, YT8531S Gigabit Ethernet PHYs. + + config NATIONAL_PHY + tristate "National Semiconductor PHYs" +--- a/drivers/net/phy/motorcomm.c ++++ b/drivers/net/phy/motorcomm.c +@@ -1,6 +1,6 @@ + // SPDX-License-Identifier: GPL-2.0+ + /* +- * Motorcomm 8511/8521 PHY driver. ++ * Motorcomm 8511/8521/8531S PHY driver. + * + * Author: Peter Geis + * Author: Frank +@@ -12,9 +12,10 @@ + #include + + #define PHY_ID_YT8511 0x0000010a +-#define PHY_ID_YT8521 0x0000011A ++#define PHY_ID_YT8521 0x0000011A ++#define PHY_ID_YT8531S 0x4F51E91A + +-/* YT8521 Register Overview ++/* YT8521/YT8531S Register Overview + * UTP Register space | FIBER Register space + * ------------------------------------------------------------ + * | UTP MII | FIBER MII | +@@ -147,7 +148,7 @@ + #define YT8521_LINK_TIMER_CFG2_REG 0xA5 + #define YT8521_LTCR_EN_AUTOSEN BIT(15) + +-/* 0xA000, 0xA001, 0xA003 ,and 0xA006 ~ 0xA00A are common ext registers ++/* 0xA000, 0xA001, 0xA003, 0xA006 ~ 0xA00A and 0xA012 are common ext registers + * of yt8521 phy. There is no need to switch reg space when operating these + * registers. + */ +@@ -221,6 +222,9 @@ + */ + #define YTPHY_WCR_TYPE_PULSE BIT(0) + ++#define YT8531S_SYNCE_CFG_REG 0xA012 ++#define YT8531S_SCR_SYNCE_ENABLE BIT(6) ++ + /* Extended Register end */ + + struct yt8521_priv { +@@ -648,6 +652,26 @@ static int yt8521_probe(struct phy_devic + } + + /** ++ * yt8531s_probe() - read chip config then set suitable polling_mode ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * returns 0 or negative errno code ++ */ ++static int yt8531s_probe(struct phy_device *phydev) ++{ ++ int ret; ++ ++ /* Disable SyncE clock output by default */ ++ ret = ytphy_modify_ext_with_lock(phydev, YT8531S_SYNCE_CFG_REG, ++ YT8531S_SCR_SYNCE_ENABLE, 0); ++ if (ret < 0) ++ return ret; ++ ++ /* same as yt8521_probe */ ++ return yt8521_probe(phydev); ++} ++ ++/** + * ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp + * @phydev: a pointer to a &struct phy_device + * +@@ -1750,11 +1774,28 @@ static struct phy_driver motorcomm_phy_d + .suspend = yt8521_suspend, + .resume = yt8521_resume, + }, ++ { ++ PHY_ID_MATCH_EXACT(PHY_ID_YT8531S), ++ .name = "YT8531S Gigabit Ethernet", ++ .get_features = yt8521_get_features, ++ .probe = yt8531s_probe, ++ .read_page = yt8521_read_page, ++ .write_page = yt8521_write_page, ++ .get_wol = ytphy_get_wol, ++ .set_wol = ytphy_set_wol, ++ .config_aneg = yt8521_config_aneg, ++ .aneg_done = yt8521_aneg_done, ++ .config_init = yt8521_config_init, ++ .read_status = yt8521_read_status, ++ .soft_reset = yt8521_soft_reset, ++ .suspend = yt8521_suspend, ++ .resume = yt8521_resume, ++ }, + }; + + module_phy_driver(motorcomm_phy_drvs); + +-MODULE_DESCRIPTION("Motorcomm 8511/8521 PHY driver"); ++MODULE_DESCRIPTION("Motorcomm 8511/8521/8531S PHY driver"); + MODULE_AUTHOR("Peter Geis"); + MODULE_AUTHOR("Frank"); + MODULE_LICENSE("GPL"); +@@ -1762,6 +1803,7 @@ MODULE_LICENSE("GPL"); + static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = { + { PHY_ID_MATCH_EXACT(PHY_ID_YT8511) }, + { PHY_ID_MATCH_EXACT(PHY_ID_YT8521) }, ++ { PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) }, + { /* sentinal */ } + }; + diff --git a/target/linux/generic/backport-5.15/791-v6.3-04-net-phy-fix-the-spelling-problem-of-Sentinel.patch b/target/linux/generic/backport-5.15/791-v6.3-04-net-phy-fix-the-spelling-problem-of-Sentinel.patch new file mode 100644 index 0000000000..94fc32aadb --- /dev/null +++ b/target/linux/generic/backport-5.15/791-v6.3-04-net-phy-fix-the-spelling-problem-of-Sentinel.patch @@ -0,0 +1,26 @@ +From 4104a713204d62aca482eebb0c6226d82a0721eb Mon Sep 17 00:00:00 2001 +From: Frank Sae +Date: Sat, 28 Jan 2023 14:35:57 +0800 +Subject: [PATCH] net: phy: fix the spelling problem of Sentinel + +CHECK: 'sentinal' may be misspelled - perhaps 'sentinel'? + +Signed-off-by: Frank Sae +Reviewed-by: Andrew Lunn +Link: https://lore.kernel.org/r/20230128063558.5850-1-Frank.Sae@motor-comm.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/motorcomm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/phy/motorcomm.c ++++ b/drivers/net/phy/motorcomm.c +@@ -1804,7 +1804,7 @@ static const struct mdio_device_id __may + { PHY_ID_MATCH_EXACT(PHY_ID_YT8511) }, + { PHY_ID_MATCH_EXACT(PHY_ID_YT8521) }, + { PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) }, +- { /* sentinal */ } ++ { /* sentinel */ } + }; + + MODULE_DEVICE_TABLE(mdio, motorcomm_tbl); diff --git a/target/linux/generic/backport-5.15/791-v6.3-05-net-phy-motorcomm-change-the-phy-id-of-yt8521-and-yt8531s.patch b/target/linux/generic/backport-5.15/791-v6.3-05-net-phy-motorcomm-change-the-phy-id-of-yt8521-and-yt8531s.patch new file mode 100644 index 0000000000..076fa82d26 --- /dev/null +++ b/target/linux/generic/backport-5.15/791-v6.3-05-net-phy-motorcomm-change-the-phy-id-of-yt8521-and-yt8531s.patch @@ -0,0 +1,29 @@ +From 3c1dc22162d673d595855d24f95200ed2643f88f Mon Sep 17 00:00:00 2001 +From: Frank Sae +Date: Sat, 28 Jan 2023 14:35:58 +0800 +Subject: [PATCH] net: phy: motorcomm: change the phy id of yt8521 and yt8531s + to lowercase + +The phy id is usually defined in lower case. + +Signed-off-by: Frank Sae +Reviewed-by: Andrew Lunn +Link: https://lore.kernel.org/r/20230128063558.5850-2-Frank.Sae@motor-comm.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/motorcomm.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/net/phy/motorcomm.c ++++ b/drivers/net/phy/motorcomm.c +@@ -12,8 +12,8 @@ + #include + + #define PHY_ID_YT8511 0x0000010a +-#define PHY_ID_YT8521 0x0000011A +-#define PHY_ID_YT8531S 0x4F51E91A ++#define PHY_ID_YT8521 0x0000011a ++#define PHY_ID_YT8531S 0x4f51e91a + + /* YT8521/YT8531S Register Overview + * UTP Register space | FIBER Register space diff --git a/target/linux/generic/backport-5.15/791-v6.3-06-net-phy-Add-BIT-macro-for-Motorcomm-yt8521-yt8531-gigabit.patch b/target/linux/generic/backport-5.15/791-v6.3-06-net-phy-Add-BIT-macro-for-Motorcomm-yt8521-yt8531-gigabit.patch new file mode 100644 index 0000000000..ba9a6ab4cc --- /dev/null +++ b/target/linux/generic/backport-5.15/791-v6.3-06-net-phy-Add-BIT-macro-for-Motorcomm-yt8521-yt8531-gigabit.patch @@ -0,0 +1,107 @@ +From 4869a146cd60fc8115230f0a45e15e534c531922 Mon Sep 17 00:00:00 2001 +From: Frank Sae +Date: Thu, 2 Feb 2023 11:00:34 +0800 +Subject: [PATCH] net: phy: Add BIT macro for Motorcomm yt8521/yt8531 gigabit + ethernet phy + +Add BIT macro for Motorcomm yt8521/yt8531 gigabit ethernet phy. + This is a preparatory patch. Add BIT macro for 0xA012 reg, and + supplement for 0xA001 and 0xA003 reg. These will be used to support dts. + +Signed-off-by: Frank Sae +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/motorcomm.c | 55 ++++++++++++++++++++++++++++++++++--- + 1 file changed, 51 insertions(+), 4 deletions(-) + +--- a/drivers/net/phy/motorcomm.c ++++ b/drivers/net/phy/motorcomm.c +@@ -161,6 +161,11 @@ + + #define YT8521_CHIP_CONFIG_REG 0xA001 + #define YT8521_CCR_SW_RST BIT(15) ++/* 1b0 disable 1.9ns rxc clock delay *default* ++ * 1b1 enable 1.9ns rxc clock delay ++ */ ++#define YT8521_CCR_RXC_DLY_EN BIT(8) ++#define YT8521_CCR_RXC_DLY_1_900_NS 1900 + + #define YT8521_CCR_MODE_SEL_MASK (BIT(2) | BIT(1) | BIT(0)) + #define YT8521_CCR_MODE_UTP_TO_RGMII 0 +@@ -178,22 +183,41 @@ + #define YT8521_MODE_POLL 0x3 + + #define YT8521_RGMII_CONFIG1_REG 0xA003 +- ++/* 1b0 use original tx_clk_rgmii *default* ++ * 1b1 use inverted tx_clk_rgmii. ++ */ ++#define YT8521_RC1R_TX_CLK_SEL_INVERTED BIT(14) + /* TX Gig-E Delay is bits 3:0, default 0x1 + * TX Fast-E Delay is bits 7:4, default 0xf + * RX Delay is bits 13:10, default 0x0 + * Delay = 150ps * N + * On = 2250ps, off = 0ps + */ +-#define YT8521_RC1R_RX_DELAY_MASK (0xF << 10) ++#define YT8521_RC1R_RX_DELAY_MASK GENMASK(13, 10) + #define YT8521_RC1R_RX_DELAY_EN (0xF << 10) + #define YT8521_RC1R_RX_DELAY_DIS (0x0 << 10) +-#define YT8521_RC1R_FE_TX_DELAY_MASK (0xF << 4) ++#define YT8521_RC1R_FE_TX_DELAY_MASK GENMASK(7, 4) + #define YT8521_RC1R_FE_TX_DELAY_EN (0xF << 4) + #define YT8521_RC1R_FE_TX_DELAY_DIS (0x0 << 4) +-#define YT8521_RC1R_GE_TX_DELAY_MASK (0xF << 0) ++#define YT8521_RC1R_GE_TX_DELAY_MASK GENMASK(3, 0) + #define YT8521_RC1R_GE_TX_DELAY_EN (0xF << 0) + #define YT8521_RC1R_GE_TX_DELAY_DIS (0x0 << 0) ++#define YT8521_RC1R_RGMII_0_000_NS 0 ++#define YT8521_RC1R_RGMII_0_150_NS 1 ++#define YT8521_RC1R_RGMII_0_300_NS 2 ++#define YT8521_RC1R_RGMII_0_450_NS 3 ++#define YT8521_RC1R_RGMII_0_600_NS 4 ++#define YT8521_RC1R_RGMII_0_750_NS 5 ++#define YT8521_RC1R_RGMII_0_900_NS 6 ++#define YT8521_RC1R_RGMII_1_050_NS 7 ++#define YT8521_RC1R_RGMII_1_200_NS 8 ++#define YT8521_RC1R_RGMII_1_350_NS 9 ++#define YT8521_RC1R_RGMII_1_500_NS 10 ++#define YT8521_RC1R_RGMII_1_650_NS 11 ++#define YT8521_RC1R_RGMII_1_800_NS 12 ++#define YT8521_RC1R_RGMII_1_950_NS 13 ++#define YT8521_RC1R_RGMII_2_100_NS 14 ++#define YT8521_RC1R_RGMII_2_250_NS 15 + + #define YTPHY_MISC_CONFIG_REG 0xA006 + #define YTPHY_MCR_FIBER_SPEED_MASK BIT(0) +@@ -222,6 +246,29 @@ + */ + #define YTPHY_WCR_TYPE_PULSE BIT(0) + ++#define YTPHY_SYNCE_CFG_REG 0xA012 ++#define YT8521_SCR_SYNCE_ENABLE BIT(5) ++/* 1b0 output 25m clock ++ * 1b1 output 125m clock *default* ++ */ ++#define YT8521_SCR_CLK_FRE_SEL_125M BIT(3) ++#define YT8521_SCR_CLK_SRC_MASK GENMASK(2, 1) ++#define YT8521_SCR_CLK_SRC_PLL_125M 0 ++#define YT8521_SCR_CLK_SRC_UTP_RX 1 ++#define YT8521_SCR_CLK_SRC_SDS_RX 2 ++#define YT8521_SCR_CLK_SRC_REF_25M 3 ++#define YT8531_SCR_SYNCE_ENABLE BIT(6) ++/* 1b0 output 25m clock *default* ++ * 1b1 output 125m clock ++ */ ++#define YT8531_SCR_CLK_FRE_SEL_125M BIT(4) ++#define YT8531_SCR_CLK_SRC_MASK GENMASK(3, 1) ++#define YT8531_SCR_CLK_SRC_PLL_125M 0 ++#define YT8531_SCR_CLK_SRC_UTP_RX 1 ++#define YT8531_SCR_CLK_SRC_SDS_RX 2 ++#define YT8531_SCR_CLK_SRC_CLOCK_FROM_DIGITAL 3 ++#define YT8531_SCR_CLK_SRC_REF_25M 4 ++#define YT8531_SCR_CLK_SRC_SSC_25M 5 + #define YT8531S_SYNCE_CFG_REG 0xA012 + #define YT8531S_SCR_SYNCE_ENABLE BIT(6) + diff --git a/target/linux/generic/backport-5.15/791-v6.3-07-net-phy-Add-dts-support-for-Motorcomm-yt8521-gigabit.patch b/target/linux/generic/backport-5.15/791-v6.3-07-net-phy-Add-dts-support-for-Motorcomm-yt8521-gigabit.patch new file mode 100644 index 0000000000..6d89fae84c --- /dev/null +++ b/target/linux/generic/backport-5.15/791-v6.3-07-net-phy-Add-dts-support-for-Motorcomm-yt8521-gigabit.patch @@ -0,0 +1,343 @@ +From a6e68f0f8769f79c67cdcfb6302feecd36197dec Mon Sep 17 00:00:00 2001 +From: Frank Sae +Date: Thu, 2 Feb 2023 11:00:35 +0800 +Subject: [PATCH] net: phy: Add dts support for Motorcomm yt8521 gigabit + ethernet phy + +Add dts support for Motorcomm yt8521 gigabit ethernet phy. + Add ytphy_rgmii_clk_delay_config function to support dst config for + the delay of rgmii clk. This funciont is common for yt8521, yt8531s + and yt8531. + This patch has been verified on AM335x platform. + +Signed-off-by: Frank Sae +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/motorcomm.c | 253 ++++++++++++++++++++++++++++-------- + 1 file changed, 199 insertions(+), 54 deletions(-) + +--- a/drivers/net/phy/motorcomm.c ++++ b/drivers/net/phy/motorcomm.c +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + + #define PHY_ID_YT8511 0x0000010a + #define PHY_ID_YT8521 0x0000011a +@@ -187,21 +188,9 @@ + * 1b1 use inverted tx_clk_rgmii. + */ + #define YT8521_RC1R_TX_CLK_SEL_INVERTED BIT(14) +-/* TX Gig-E Delay is bits 3:0, default 0x1 +- * TX Fast-E Delay is bits 7:4, default 0xf +- * RX Delay is bits 13:10, default 0x0 +- * Delay = 150ps * N +- * On = 2250ps, off = 0ps +- */ + #define YT8521_RC1R_RX_DELAY_MASK GENMASK(13, 10) +-#define YT8521_RC1R_RX_DELAY_EN (0xF << 10) +-#define YT8521_RC1R_RX_DELAY_DIS (0x0 << 10) + #define YT8521_RC1R_FE_TX_DELAY_MASK GENMASK(7, 4) +-#define YT8521_RC1R_FE_TX_DELAY_EN (0xF << 4) +-#define YT8521_RC1R_FE_TX_DELAY_DIS (0x0 << 4) + #define YT8521_RC1R_GE_TX_DELAY_MASK GENMASK(3, 0) +-#define YT8521_RC1R_GE_TX_DELAY_EN (0xF << 0) +-#define YT8521_RC1R_GE_TX_DELAY_DIS (0x0 << 0) + #define YT8521_RC1R_RGMII_0_000_NS 0 + #define YT8521_RC1R_RGMII_0_150_NS 1 + #define YT8521_RC1R_RGMII_0_300_NS 2 +@@ -274,6 +263,10 @@ + + /* Extended Register end */ + ++#define YTPHY_DTS_OUTPUT_CLK_DIS 0 ++#define YTPHY_DTS_OUTPUT_CLK_25M 25000000 ++#define YTPHY_DTS_OUTPUT_CLK_125M 125000000 ++ + struct yt8521_priv { + /* combo_advertising is used for case of YT8521 in combo mode, + * this means that yt8521 may work in utp or fiber mode which depends +@@ -641,6 +634,142 @@ static int yt8521_write_page(struct phy_ + }; + + /** ++ * struct ytphy_cfg_reg_map - map a config value to a register value ++ * @cfg: value in device configuration ++ * @reg: value in the register ++ */ ++struct ytphy_cfg_reg_map { ++ u32 cfg; ++ u32 reg; ++}; ++ ++static const struct ytphy_cfg_reg_map ytphy_rgmii_delays[] = { ++ /* for tx delay / rx delay with YT8521_CCR_RXC_DLY_EN is not set. */ ++ { 0, YT8521_RC1R_RGMII_0_000_NS }, ++ { 150, YT8521_RC1R_RGMII_0_150_NS }, ++ { 300, YT8521_RC1R_RGMII_0_300_NS }, ++ { 450, YT8521_RC1R_RGMII_0_450_NS }, ++ { 600, YT8521_RC1R_RGMII_0_600_NS }, ++ { 750, YT8521_RC1R_RGMII_0_750_NS }, ++ { 900, YT8521_RC1R_RGMII_0_900_NS }, ++ { 1050, YT8521_RC1R_RGMII_1_050_NS }, ++ { 1200, YT8521_RC1R_RGMII_1_200_NS }, ++ { 1350, YT8521_RC1R_RGMII_1_350_NS }, ++ { 1500, YT8521_RC1R_RGMII_1_500_NS }, ++ { 1650, YT8521_RC1R_RGMII_1_650_NS }, ++ { 1800, YT8521_RC1R_RGMII_1_800_NS }, ++ { 1950, YT8521_RC1R_RGMII_1_950_NS }, /* default tx/rx delay */ ++ { 2100, YT8521_RC1R_RGMII_2_100_NS }, ++ { 2250, YT8521_RC1R_RGMII_2_250_NS }, ++ ++ /* only for rx delay with YT8521_CCR_RXC_DLY_EN is set. */ ++ { 0 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_000_NS }, ++ { 150 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_150_NS }, ++ { 300 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_300_NS }, ++ { 450 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_450_NS }, ++ { 600 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_600_NS }, ++ { 750 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_750_NS }, ++ { 900 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_900_NS }, ++ { 1050 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_050_NS }, ++ { 1200 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_200_NS }, ++ { 1350 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_350_NS }, ++ { 1500 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_500_NS }, ++ { 1650 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_650_NS }, ++ { 1800 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_800_NS }, ++ { 1950 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_950_NS }, ++ { 2100 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_2_100_NS }, ++ { 2250 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_2_250_NS } ++}; ++ ++static u32 ytphy_get_delay_reg_value(struct phy_device *phydev, ++ const char *prop_name, ++ const struct ytphy_cfg_reg_map *tbl, ++ int tb_size, ++ u16 *rxc_dly_en, ++ u32 dflt) ++{ ++ struct device_node *node = phydev->mdio.dev.of_node; ++ int tb_size_half = tb_size / 2; ++ u32 val; ++ int i; ++ ++ if (of_property_read_u32(node, prop_name, &val)) ++ goto err_dts_val; ++ ++ /* when rxc_dly_en is NULL, it is get the delay for tx, only half of ++ * tb_size is valid. ++ */ ++ if (!rxc_dly_en) ++ tb_size = tb_size_half; ++ ++ for (i = 0; i < tb_size; i++) { ++ if (tbl[i].cfg == val) { ++ if (rxc_dly_en && i < tb_size_half) ++ *rxc_dly_en = 0; ++ return tbl[i].reg; ++ } ++ } ++ ++ phydev_warn(phydev, "Unsupported value %d for %s using default (%u)\n", ++ val, prop_name, dflt); ++ ++err_dts_val: ++ /* when rxc_dly_en is not NULL, it is get the delay for rx. ++ * The rx default in dts and ytphy_rgmii_clk_delay_config is 1950 ps, ++ * so YT8521_CCR_RXC_DLY_EN should not be set. ++ */ ++ if (rxc_dly_en) ++ *rxc_dly_en = 0; ++ ++ return dflt; ++} ++ ++static int ytphy_rgmii_clk_delay_config(struct phy_device *phydev) ++{ ++ int tb_size = ARRAY_SIZE(ytphy_rgmii_delays); ++ u16 rxc_dly_en = YT8521_CCR_RXC_DLY_EN; ++ u32 rx_reg, tx_reg; ++ u16 mask, val = 0; ++ int ret; ++ ++ rx_reg = ytphy_get_delay_reg_value(phydev, "rx-internal-delay-ps", ++ ytphy_rgmii_delays, tb_size, ++ &rxc_dly_en, ++ YT8521_RC1R_RGMII_1_950_NS); ++ tx_reg = ytphy_get_delay_reg_value(phydev, "tx-internal-delay-ps", ++ ytphy_rgmii_delays, tb_size, NULL, ++ YT8521_RC1R_RGMII_1_950_NS); ++ ++ switch (phydev->interface) { ++ case PHY_INTERFACE_MODE_RGMII: ++ rxc_dly_en = 0; ++ break; ++ case PHY_INTERFACE_MODE_RGMII_RXID: ++ val |= FIELD_PREP(YT8521_RC1R_RX_DELAY_MASK, rx_reg); ++ break; ++ case PHY_INTERFACE_MODE_RGMII_TXID: ++ rxc_dly_en = 0; ++ val |= FIELD_PREP(YT8521_RC1R_GE_TX_DELAY_MASK, tx_reg); ++ break; ++ case PHY_INTERFACE_MODE_RGMII_ID: ++ val |= FIELD_PREP(YT8521_RC1R_RX_DELAY_MASK, rx_reg) | ++ FIELD_PREP(YT8521_RC1R_GE_TX_DELAY_MASK, tx_reg); ++ break; ++ default: /* do not support other modes */ ++ return -EOPNOTSUPP; ++ } ++ ++ ret = ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG, ++ YT8521_CCR_RXC_DLY_EN, rxc_dly_en); ++ if (ret < 0) ++ return ret; ++ ++ /* Generally, it is not necessary to adjust YT8521_RC1R_FE_TX_DELAY */ ++ mask = YT8521_RC1R_RX_DELAY_MASK | YT8521_RC1R_GE_TX_DELAY_MASK; ++ return ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, mask, val); ++} ++ ++/** + * yt8521_probe() - read chip config then set suitable polling_mode + * @phydev: a pointer to a &struct phy_device + * +@@ -648,9 +777,12 @@ static int yt8521_write_page(struct phy_ + */ + static int yt8521_probe(struct phy_device *phydev) + { ++ struct device_node *node = phydev->mdio.dev.of_node; + struct device *dev = &phydev->mdio.dev; + struct yt8521_priv *priv; + int chip_config; ++ u16 mask, val; ++ u32 freq; + int ret; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); +@@ -695,7 +827,45 @@ static int yt8521_probe(struct phy_devic + return ret; + } + +- return 0; ++ if (of_property_read_u32(node, "motorcomm,clk-out-frequency-hz", &freq)) ++ freq = YTPHY_DTS_OUTPUT_CLK_DIS; ++ ++ if (phydev->drv->phy_id == PHY_ID_YT8521) { ++ switch (freq) { ++ case YTPHY_DTS_OUTPUT_CLK_DIS: ++ mask = YT8521_SCR_SYNCE_ENABLE; ++ val = 0; ++ break; ++ case YTPHY_DTS_OUTPUT_CLK_25M: ++ mask = YT8521_SCR_SYNCE_ENABLE | ++ YT8521_SCR_CLK_SRC_MASK | ++ YT8521_SCR_CLK_FRE_SEL_125M; ++ val = YT8521_SCR_SYNCE_ENABLE | ++ FIELD_PREP(YT8521_SCR_CLK_SRC_MASK, ++ YT8521_SCR_CLK_SRC_REF_25M); ++ break; ++ case YTPHY_DTS_OUTPUT_CLK_125M: ++ mask = YT8521_SCR_SYNCE_ENABLE | ++ YT8521_SCR_CLK_SRC_MASK | ++ YT8521_SCR_CLK_FRE_SEL_125M; ++ val = YT8521_SCR_SYNCE_ENABLE | ++ YT8521_SCR_CLK_FRE_SEL_125M | ++ FIELD_PREP(YT8521_SCR_CLK_SRC_MASK, ++ YT8521_SCR_CLK_SRC_PLL_125M); ++ break; ++ default: ++ phydev_warn(phydev, "Freq err:%u\n", freq); ++ return -EINVAL; ++ } ++ } else if (phydev->drv->phy_id == PHY_ID_YT8531S) { ++ return 0; ++ } else { ++ phydev_warn(phydev, "PHY id err\n"); ++ return -EINVAL; ++ } ++ ++ return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask, ++ val); + } + + /** +@@ -1180,61 +1350,36 @@ static int yt8521_resume(struct phy_devi + */ + static int yt8521_config_init(struct phy_device *phydev) + { ++ struct device_node *node = phydev->mdio.dev.of_node; + int old_page; + int ret = 0; +- u16 val; + + old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE); + if (old_page < 0) + goto err_restore_page; + +- switch (phydev->interface) { +- case PHY_INTERFACE_MODE_RGMII: +- val = YT8521_RC1R_GE_TX_DELAY_DIS | YT8521_RC1R_FE_TX_DELAY_DIS; +- val |= YT8521_RC1R_RX_DELAY_DIS; +- break; +- case PHY_INTERFACE_MODE_RGMII_RXID: +- val = YT8521_RC1R_GE_TX_DELAY_DIS | YT8521_RC1R_FE_TX_DELAY_DIS; +- val |= YT8521_RC1R_RX_DELAY_EN; +- break; +- case PHY_INTERFACE_MODE_RGMII_TXID: +- val = YT8521_RC1R_GE_TX_DELAY_EN | YT8521_RC1R_FE_TX_DELAY_EN; +- val |= YT8521_RC1R_RX_DELAY_DIS; +- break; +- case PHY_INTERFACE_MODE_RGMII_ID: +- val = YT8521_RC1R_GE_TX_DELAY_EN | YT8521_RC1R_FE_TX_DELAY_EN; +- val |= YT8521_RC1R_RX_DELAY_EN; +- break; +- case PHY_INTERFACE_MODE_SGMII: +- break; +- default: /* do not support other modes */ +- ret = -EOPNOTSUPP; +- goto err_restore_page; +- } +- + /* set rgmii delay mode */ + if (phydev->interface != PHY_INTERFACE_MODE_SGMII) { +- ret = ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, +- (YT8521_RC1R_RX_DELAY_MASK | +- YT8521_RC1R_FE_TX_DELAY_MASK | +- YT8521_RC1R_GE_TX_DELAY_MASK), +- val); ++ ret = ytphy_rgmii_clk_delay_config(phydev); + if (ret < 0) + goto err_restore_page; + } + +- /* disable auto sleep */ +- ret = ytphy_modify_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1_REG, +- YT8521_ESC1R_SLEEP_SW, 0); +- if (ret < 0) +- goto err_restore_page; +- +- /* enable RXC clock when no wire plug */ +- ret = ytphy_modify_ext(phydev, YT8521_CLOCK_GATING_REG, +- YT8521_CGR_RX_CLK_EN, 0); +- if (ret < 0) +- goto err_restore_page; ++ if (of_property_read_bool(node, "motorcomm,auto-sleep-disabled")) { ++ /* disable auto sleep */ ++ ret = ytphy_modify_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1_REG, ++ YT8521_ESC1R_SLEEP_SW, 0); ++ if (ret < 0) ++ goto err_restore_page; ++ } + ++ if (of_property_read_bool(node, "motorcomm,keep-pll-enabled")) { ++ /* enable RXC clock when no wire plug */ ++ ret = ytphy_modify_ext(phydev, YT8521_CLOCK_GATING_REG, ++ YT8521_CGR_RX_CLK_EN, 0); ++ if (ret < 0) ++ goto err_restore_page; ++ } + err_restore_page: + return phy_restore_page(phydev, old_page, ret); + } diff --git a/target/linux/generic/backport-5.15/791-v6.3-08-net-phy-Add-dts-support-for-Motorcomm-yt8531s-gigabit.patch b/target/linux/generic/backport-5.15/791-v6.3-08-net-phy-Add-dts-support-for-Motorcomm-yt8531s-gigabit.patch new file mode 100644 index 0000000000..86fc04695c --- /dev/null +++ b/target/linux/generic/backport-5.15/791-v6.3-08-net-phy-Add-dts-support-for-Motorcomm-yt8531s-gigabit.patch @@ -0,0 +1,100 @@ +From 36152f87dda4af221b16258751451d9cd3d0fb0b Mon Sep 17 00:00:00 2001 +From: Frank Sae +Date: Thu, 2 Feb 2023 11:00:36 +0800 +Subject: [PATCH] net: phy: Add dts support for Motorcomm yt8531s gigabit + ethernet phy + +Add dts support for Motorcomm yt8531s gigabit ethernet phy. + Change yt8521_probe to support clk config of yt8531s. Becase + yt8521_probe does the things which yt8531s is needed, so + removed yt8531s function. + This patch has been verified on AM335x platform with yt8531s board. + +Signed-off-by: Frank Sae +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/motorcomm.c | 51 ++++++++++++++++++++----------------- + 1 file changed, 27 insertions(+), 24 deletions(-) + +--- a/drivers/net/phy/motorcomm.c ++++ b/drivers/net/phy/motorcomm.c +@@ -258,8 +258,6 @@ + #define YT8531_SCR_CLK_SRC_CLOCK_FROM_DIGITAL 3 + #define YT8531_SCR_CLK_SRC_REF_25M 4 + #define YT8531_SCR_CLK_SRC_SSC_25M 5 +-#define YT8531S_SYNCE_CFG_REG 0xA012 +-#define YT8531S_SCR_SYNCE_ENABLE BIT(6) + + /* Extended Register end */ + +@@ -858,7 +856,32 @@ static int yt8521_probe(struct phy_devic + return -EINVAL; + } + } else if (phydev->drv->phy_id == PHY_ID_YT8531S) { +- return 0; ++ switch (freq) { ++ case YTPHY_DTS_OUTPUT_CLK_DIS: ++ mask = YT8531_SCR_SYNCE_ENABLE; ++ val = 0; ++ break; ++ case YTPHY_DTS_OUTPUT_CLK_25M: ++ mask = YT8531_SCR_SYNCE_ENABLE | ++ YT8531_SCR_CLK_SRC_MASK | ++ YT8531_SCR_CLK_FRE_SEL_125M; ++ val = YT8531_SCR_SYNCE_ENABLE | ++ FIELD_PREP(YT8531_SCR_CLK_SRC_MASK, ++ YT8531_SCR_CLK_SRC_REF_25M); ++ break; ++ case YTPHY_DTS_OUTPUT_CLK_125M: ++ mask = YT8531_SCR_SYNCE_ENABLE | ++ YT8531_SCR_CLK_SRC_MASK | ++ YT8531_SCR_CLK_FRE_SEL_125M; ++ val = YT8531_SCR_SYNCE_ENABLE | ++ YT8531_SCR_CLK_FRE_SEL_125M | ++ FIELD_PREP(YT8531_SCR_CLK_SRC_MASK, ++ YT8531_SCR_CLK_SRC_PLL_125M); ++ break; ++ default: ++ phydev_warn(phydev, "Freq err:%u\n", freq); ++ return -EINVAL; ++ } + } else { + phydev_warn(phydev, "PHY id err\n"); + return -EINVAL; +@@ -869,26 +892,6 @@ static int yt8521_probe(struct phy_devic + } + + /** +- * yt8531s_probe() - read chip config then set suitable polling_mode +- * @phydev: a pointer to a &struct phy_device +- * +- * returns 0 or negative errno code +- */ +-static int yt8531s_probe(struct phy_device *phydev) +-{ +- int ret; +- +- /* Disable SyncE clock output by default */ +- ret = ytphy_modify_ext_with_lock(phydev, YT8531S_SYNCE_CFG_REG, +- YT8531S_SCR_SYNCE_ENABLE, 0); +- if (ret < 0) +- return ret; +- +- /* same as yt8521_probe */ +- return yt8521_probe(phydev); +-} +- +-/** + * ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp + * @phydev: a pointer to a &struct phy_device + * +@@ -1970,7 +1973,7 @@ static struct phy_driver motorcomm_phy_d + PHY_ID_MATCH_EXACT(PHY_ID_YT8531S), + .name = "YT8531S Gigabit Ethernet", + .get_features = yt8521_get_features, +- .probe = yt8531s_probe, ++ .probe = yt8521_probe, + .read_page = yt8521_read_page, + .write_page = yt8521_write_page, + .get_wol = ytphy_get_wol, diff --git a/target/linux/generic/backport-5.15/791-v6.3-09-net-phy-Add-driver-for-Motorcomm-yt8531-gigabit-ethernet.patch b/target/linux/generic/backport-5.15/791-v6.3-09-net-phy-Add-driver-for-Motorcomm-yt8531-gigabit-ethernet.patch new file mode 100644 index 0000000000..9dce5a8add --- /dev/null +++ b/target/linux/generic/backport-5.15/791-v6.3-09-net-phy-Add-driver-for-Motorcomm-yt8531-gigabit-ethernet.patch @@ -0,0 +1,302 @@ +From 4ac94f728a588e7096dd5010cd7141a309ea7805 Mon Sep 17 00:00:00 2001 +From: Frank Sae +Date: Thu, 2 Feb 2023 11:00:37 +0800 +Subject: [PATCH] net: phy: Add driver for Motorcomm yt8531 gigabit ethernet + phy + +Add a driver for the motorcomm yt8531 gigabit ethernet phy. We have + verified the driver on AM335x platform with yt8531 board. On the + board, yt8531 gigabit ethernet phy works in utp mode, RGMII + interface, supports 1000M/100M/10M speeds, and wol(magic package). + +Signed-off-by: Frank Sae +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/Kconfig | 2 +- + drivers/net/phy/motorcomm.c | 208 +++++++++++++++++++++++++++++++++++- + 2 files changed, 207 insertions(+), 3 deletions(-) + +--- a/drivers/net/phy/Kconfig ++++ b/drivers/net/phy/Kconfig +@@ -245,7 +245,7 @@ config MOTORCOMM_PHY + tristate "Motorcomm PHYs" + help + Enables support for Motorcomm network PHYs. +- Currently supports the YT8511, YT8521, YT8531S Gigabit Ethernet PHYs. ++ Currently supports YT85xx Gigabit Ethernet PHYs. + + config NATIONAL_PHY + tristate "National Semiconductor PHYs" +--- a/drivers/net/phy/motorcomm.c ++++ b/drivers/net/phy/motorcomm.c +@@ -1,6 +1,6 @@ + // SPDX-License-Identifier: GPL-2.0+ + /* +- * Motorcomm 8511/8521/8531S PHY driver. ++ * Motorcomm 8511/8521/8531/8531S PHY driver. + * + * Author: Peter Geis + * Author: Frank +@@ -14,6 +14,7 @@ + + #define PHY_ID_YT8511 0x0000010a + #define PHY_ID_YT8521 0x0000011a ++#define PHY_ID_YT8531 0x4f51e91b + #define PHY_ID_YT8531S 0x4f51e91a + + /* YT8521/YT8531S Register Overview +@@ -517,6 +518,61 @@ err_restore_page: + return phy_restore_page(phydev, old_page, ret); + } + ++static int yt8531_set_wol(struct phy_device *phydev, ++ struct ethtool_wolinfo *wol) ++{ ++ const u16 mac_addr_reg[] = { ++ YTPHY_WOL_MACADDR2_REG, ++ YTPHY_WOL_MACADDR1_REG, ++ YTPHY_WOL_MACADDR0_REG, ++ }; ++ const u8 *mac_addr; ++ u16 mask, val; ++ int ret; ++ u8 i; ++ ++ if (wol->wolopts & WAKE_MAGIC) { ++ mac_addr = phydev->attached_dev->dev_addr; ++ ++ /* Store the device address for the magic packet */ ++ for (i = 0; i < 3; i++) { ++ ret = ytphy_write_ext_with_lock(phydev, mac_addr_reg[i], ++ ((mac_addr[i * 2] << 8)) | ++ (mac_addr[i * 2 + 1])); ++ if (ret < 0) ++ return ret; ++ } ++ ++ /* Enable WOL feature */ ++ mask = YTPHY_WCR_PULSE_WIDTH_MASK | YTPHY_WCR_INTR_SEL; ++ val = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL; ++ val |= YTPHY_WCR_TYPE_PULSE | YTPHY_WCR_PULSE_WIDTH_672MS; ++ ret = ytphy_modify_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG, ++ mask, val); ++ if (ret < 0) ++ return ret; ++ ++ /* Enable WOL interrupt */ ++ ret = phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 0, ++ YTPHY_IER_WOL); ++ if (ret < 0) ++ return ret; ++ } else { ++ /* Disable WOL feature */ ++ mask = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL; ++ ret = ytphy_modify_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG, ++ mask, 0); ++ ++ /* Disable WOL interrupt */ ++ ret = phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, ++ YTPHY_IER_WOL, 0); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ + static int yt8511_read_page(struct phy_device *phydev) + { + return __phy_read(phydev, YT8511_PAGE_SELECT); +@@ -767,6 +823,17 @@ static int ytphy_rgmii_clk_delay_config( + return ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, mask, val); + } + ++static int ytphy_rgmii_clk_delay_config_with_lock(struct phy_device *phydev) ++{ ++ int ret; ++ ++ phy_lock_mdio_bus(phydev); ++ ret = ytphy_rgmii_clk_delay_config(phydev); ++ phy_unlock_mdio_bus(phydev); ++ ++ return ret; ++} ++ + /** + * yt8521_probe() - read chip config then set suitable polling_mode + * @phydev: a pointer to a &struct phy_device +@@ -891,6 +958,43 @@ static int yt8521_probe(struct phy_devic + val); + } + ++static int yt8531_probe(struct phy_device *phydev) ++{ ++ struct device_node *node = phydev->mdio.dev.of_node; ++ u16 mask, val; ++ u32 freq; ++ ++ if (of_property_read_u32(node, "motorcomm,clk-out-frequency-hz", &freq)) ++ freq = YTPHY_DTS_OUTPUT_CLK_DIS; ++ ++ switch (freq) { ++ case YTPHY_DTS_OUTPUT_CLK_DIS: ++ mask = YT8531_SCR_SYNCE_ENABLE; ++ val = 0; ++ break; ++ case YTPHY_DTS_OUTPUT_CLK_25M: ++ mask = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_SRC_MASK | ++ YT8531_SCR_CLK_FRE_SEL_125M; ++ val = YT8531_SCR_SYNCE_ENABLE | ++ FIELD_PREP(YT8531_SCR_CLK_SRC_MASK, ++ YT8531_SCR_CLK_SRC_REF_25M); ++ break; ++ case YTPHY_DTS_OUTPUT_CLK_125M: ++ mask = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_SRC_MASK | ++ YT8531_SCR_CLK_FRE_SEL_125M; ++ val = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_FRE_SEL_125M | ++ FIELD_PREP(YT8531_SCR_CLK_SRC_MASK, ++ YT8531_SCR_CLK_SRC_PLL_125M); ++ break; ++ default: ++ phydev_warn(phydev, "Freq err:%u\n", freq); ++ return -EINVAL; ++ } ++ ++ return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask, ++ val); ++} ++ + /** + * ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp + * @phydev: a pointer to a &struct phy_device +@@ -1387,6 +1491,94 @@ err_restore_page: + return phy_restore_page(phydev, old_page, ret); + } + ++static int yt8531_config_init(struct phy_device *phydev) ++{ ++ struct device_node *node = phydev->mdio.dev.of_node; ++ int ret; ++ ++ ret = ytphy_rgmii_clk_delay_config_with_lock(phydev); ++ if (ret < 0) ++ return ret; ++ ++ if (of_property_read_bool(node, "motorcomm,auto-sleep-disabled")) { ++ /* disable auto sleep */ ++ ret = ytphy_modify_ext_with_lock(phydev, ++ YT8521_EXTREG_SLEEP_CONTROL1_REG, ++ YT8521_ESC1R_SLEEP_SW, 0); ++ if (ret < 0) ++ return ret; ++ } ++ ++ if (of_property_read_bool(node, "motorcomm,keep-pll-enabled")) { ++ /* enable RXC clock when no wire plug */ ++ ret = ytphy_modify_ext_with_lock(phydev, ++ YT8521_CLOCK_GATING_REG, ++ YT8521_CGR_RX_CLK_EN, 0); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ ++/** ++ * yt8531_link_change_notify() - Adjust the tx clock direction according to ++ * the current speed and dts config. ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * NOTE: This function is only used to adapt to VF2 with JH7110 SoC. Please ++ * keep "motorcomm,tx-clk-adj-enabled" not exist in dts when the soc is not ++ * JH7110. ++ */ ++static void yt8531_link_change_notify(struct phy_device *phydev) ++{ ++ struct device_node *node = phydev->mdio.dev.of_node; ++ bool tx_clk_adj_enabled = false; ++ bool tx_clk_1000_inverted; ++ bool tx_clk_100_inverted; ++ bool tx_clk_10_inverted; ++ u16 val = 0; ++ int ret; ++ ++ if (of_property_read_bool(node, "motorcomm,tx-clk-adj-enabled")) ++ tx_clk_adj_enabled = true; ++ ++ if (!tx_clk_adj_enabled) ++ return; ++ ++ if (of_property_read_bool(node, "motorcomm,tx-clk-10-inverted")) ++ tx_clk_10_inverted = true; ++ if (of_property_read_bool(node, "motorcomm,tx-clk-100-inverted")) ++ tx_clk_100_inverted = true; ++ if (of_property_read_bool(node, "motorcomm,tx-clk-1000-inverted")) ++ tx_clk_1000_inverted = true; ++ ++ if (phydev->speed < 0) ++ return; ++ ++ switch (phydev->speed) { ++ case SPEED_1000: ++ if (tx_clk_1000_inverted) ++ val = YT8521_RC1R_TX_CLK_SEL_INVERTED; ++ break; ++ case SPEED_100: ++ if (tx_clk_100_inverted) ++ val = YT8521_RC1R_TX_CLK_SEL_INVERTED; ++ break; ++ case SPEED_10: ++ if (tx_clk_10_inverted) ++ val = YT8521_RC1R_TX_CLK_SEL_INVERTED; ++ break; ++ default: ++ return; ++ } ++ ++ ret = ytphy_modify_ext_with_lock(phydev, YT8521_RGMII_CONFIG1_REG, ++ YT8521_RC1R_TX_CLK_SEL_INVERTED, val); ++ if (ret < 0) ++ phydev_warn(phydev, "Modify TX_CLK_SEL err:%d\n", ret); ++} ++ + /** + * yt8521_prepare_fiber_features() - A small helper function that setup + * fiber's features. +@@ -1970,6 +2162,17 @@ static struct phy_driver motorcomm_phy_d + .resume = yt8521_resume, + }, + { ++ PHY_ID_MATCH_EXACT(PHY_ID_YT8531), ++ .name = "YT8531 Gigabit Ethernet", ++ .probe = yt8531_probe, ++ .config_init = yt8531_config_init, ++ .suspend = genphy_suspend, ++ .resume = genphy_resume, ++ .get_wol = ytphy_get_wol, ++ .set_wol = yt8531_set_wol, ++ .link_change_notify = yt8531_link_change_notify, ++ }, ++ { + PHY_ID_MATCH_EXACT(PHY_ID_YT8531S), + .name = "YT8531S Gigabit Ethernet", + .get_features = yt8521_get_features, +@@ -1990,7 +2193,7 @@ static struct phy_driver motorcomm_phy_d + + module_phy_driver(motorcomm_phy_drvs); + +-MODULE_DESCRIPTION("Motorcomm 8511/8521/8531S PHY driver"); ++MODULE_DESCRIPTION("Motorcomm 8511/8521/8531/8531S PHY driver"); + MODULE_AUTHOR("Peter Geis"); + MODULE_AUTHOR("Frank"); + MODULE_LICENSE("GPL"); +@@ -1998,6 +2201,7 @@ MODULE_LICENSE("GPL"); + static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = { + { PHY_ID_MATCH_EXACT(PHY_ID_YT8511) }, + { PHY_ID_MATCH_EXACT(PHY_ID_YT8521) }, ++ { PHY_ID_MATCH_EXACT(PHY_ID_YT8531) }, + { PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) }, + { /* sentinel */ } + }; diff --git a/target/linux/generic/backport-5.15/791-v6.3-10-net-phy-motorcomm-uninitialized-variables-in.patch b/target/linux/generic/backport-5.15/791-v6.3-10-net-phy-motorcomm-uninitialized-variables-in.patch new file mode 100644 index 0000000000..29ae86dbbc --- /dev/null +++ b/target/linux/generic/backport-5.15/791-v6.3-10-net-phy-motorcomm-uninitialized-variables-in.patch @@ -0,0 +1,34 @@ +From 9753613f7399601f9bae6ee81e9d4274246c98ab Mon Sep 17 00:00:00 2001 +From: Dan Carpenter +Date: Wed, 15 Feb 2023 07:21:47 +0300 +Subject: [PATCH] net: phy: motorcomm: uninitialized variables in + yt8531_link_change_notify() + +These booleans are never set to false, but are just used without being +initialized. + +Fixes: 4ac94f728a58 ("net: phy: Add driver for Motorcomm yt8531 gigabit ethernet phy") +Signed-off-by: Dan Carpenter +Reviewed-by: Frank Sae +Link: https://lore.kernel.org/r/Y+xd2yJet2ImHLoQ@kili +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/motorcomm.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/net/phy/motorcomm.c ++++ b/drivers/net/phy/motorcomm.c +@@ -1533,10 +1533,10 @@ static int yt8531_config_init(struct phy + static void yt8531_link_change_notify(struct phy_device *phydev) + { + struct device_node *node = phydev->mdio.dev.of_node; ++ bool tx_clk_1000_inverted = false; ++ bool tx_clk_100_inverted = false; ++ bool tx_clk_10_inverted = false; + bool tx_clk_adj_enabled = false; +- bool tx_clk_1000_inverted; +- bool tx_clk_100_inverted; +- bool tx_clk_10_inverted; + u16 val = 0; + int ret; + diff --git a/target/linux/generic/backport-5.15/792-01-v6.0-net-phylink-disable-PCS-polling-over-major-configura.patch b/target/linux/generic/backport-5.15/792-01-v6.0-net-phylink-disable-PCS-polling-over-major-configura.patch new file mode 100644 index 0000000000..cda77e3e2d --- /dev/null +++ b/target/linux/generic/backport-5.15/792-01-v6.0-net-phylink-disable-PCS-polling-over-major-configura.patch @@ -0,0 +1,81 @@ +From bfac8c490d605bea03b1f1927582b6f396462164 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 27 Jun 2022 12:44:43 +0100 +Subject: [PATCH] net: phylink: disable PCS polling over major configuration + +While we are performing a major configuration, there is no point having +the PCS polling timer running. Stop it before we begin preparing for +the configuration change, and restart it only once we've successfully +completed the change. + +Reviewed-by: Andrew Lunn +Signed-off-by: Russell King (Oracle) +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/phylink.c | 30 ++++++++++++++++++++---------- + 1 file changed, 20 insertions(+), 10 deletions(-) + +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -756,6 +756,18 @@ static void phylink_resolve_flow(struct + } + } + ++static void phylink_pcs_poll_stop(struct phylink *pl) ++{ ++ if (pl->cfg_link_an_mode == MLO_AN_INBAND) ++ del_timer(&pl->link_poll); ++} ++ ++static void phylink_pcs_poll_start(struct phylink *pl) ++{ ++ if (pl->pcs->poll && pl->cfg_link_an_mode == MLO_AN_INBAND) ++ mod_timer(&pl->link_poll, jiffies + HZ); ++} ++ + static void phylink_mac_config(struct phylink *pl, + const struct phylink_link_state *state) + { +@@ -787,6 +799,7 @@ static void phylink_major_config(struct + const struct phylink_link_state *state) + { + struct phylink_pcs *pcs = NULL; ++ bool pcs_changed = false; + int err; + + phylink_dbg(pl, "major config %s\n", phy_modes(state->interface)); +@@ -799,8 +812,12 @@ static void phylink_major_config(struct + pcs); + return; + } ++ ++ pcs_changed = pcs && pl->pcs != pcs; + } + ++ phylink_pcs_poll_stop(pl); ++ + if (pl->mac_ops->mac_prepare) { + err = pl->mac_ops->mac_prepare(pl->config, pl->cur_link_an_mode, + state->interface); +@@ -814,8 +831,10 @@ static void phylink_major_config(struct + /* If we have a new PCS, switch to the new PCS after preparing the MAC + * for the change. + */ +- if (pcs) +- phylink_set_pcs(pl, pcs); ++ if (pcs_changed) { ++ pl->pcs = pcs; ++ pl->pcs_ops = pcs->ops; ++ } + + phylink_mac_config(pl, state); + +@@ -841,6 +860,8 @@ static void phylink_major_config(struct + phylink_err(pl, "mac_finish failed: %pe\n", + ERR_PTR(err)); + } ++ ++ phylink_pcs_poll_start(pl); + } + + /* diff --git a/target/linux/generic/backport-5.15/792-02-v6.0-net-phylink-fix-NULL-pl-pcs-dereference-during-phyli.patch b/target/linux/generic/backport-5.15/792-02-v6.0-net-phylink-fix-NULL-pl-pcs-dereference-during-phyli.patch new file mode 100644 index 0000000000..f1f359bad7 --- /dev/null +++ b/target/linux/generic/backport-5.15/792-02-v6.0-net-phylink-fix-NULL-pl-pcs-dereference-during-phyli.patch @@ -0,0 +1,38 @@ +From b7d78b46d5e8dc77c656c13885d31e931923b915 Mon Sep 17 00:00:00 2001 +From: Vladimir Oltean +Date: Wed, 29 Jun 2022 22:33:58 +0300 +Subject: [PATCH] net: phylink: fix NULL pl->pcs dereference during + phylink_pcs_poll_start + +The current link mode of the phylink instance may not require an +attached PCS. However, phylink_major_config() unconditionally +dereferences this potentially NULL pointer when restarting the link poll +timer, which will panic the kernel. + +Fix the problem by checking whether a PCS exists in phylink_pcs_poll_start(), +otherwise do nothing. The code prior to the blamed patch also only +looked at pcs->poll within an "if (pcs)" block. + +Fixes: bfac8c490d60 ("net: phylink: disable PCS polling over major configuration") +Signed-off-by: Vladimir Oltean +Reviewed-by: Russell King (Oracle) +Tested-by: Gerhard Engleder +Tested-by: Michael Walle # on kontron-kbox-a-230-ls +Tested-by: Nicolas Ferre # on sam9x60ek +Link: https://lore.kernel.org/r/20220629193358.4007923-1-vladimir.oltean@nxp.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/phylink.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -764,7 +764,7 @@ static void phylink_pcs_poll_stop(struct + + static void phylink_pcs_poll_start(struct phylink *pl) + { +- if (pl->pcs->poll && pl->cfg_link_an_mode == MLO_AN_INBAND) ++ if (pl->pcs && pl->pcs->poll && pl->cfg_link_an_mode == MLO_AN_INBAND) + mod_timer(&pl->link_poll, jiffies + HZ); + } + diff --git a/target/linux/generic/backport-5.15/792-03-v6.6-net-phylink-add-pcs_enable-pcs_disable-methods.patch b/target/linux/generic/backport-5.15/792-03-v6.6-net-phylink-add-pcs_enable-pcs_disable-methods.patch new file mode 100644 index 0000000000..c8176c90f5 --- /dev/null +++ b/target/linux/generic/backport-5.15/792-03-v6.6-net-phylink-add-pcs_enable-pcs_disable-methods.patch @@ -0,0 +1,172 @@ +From 90ef0a7b0622c62758b2638604927867775479ea Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 13 Jul 2023 09:42:07 +0100 +Subject: [PATCH] net: phylink: add pcs_enable()/pcs_disable() methods + +Add phylink PCS enable/disable callbacks that will allow us to place +IEEE 802.3 register compliant PCS in power-down mode while not being +used. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: David S. Miller +--- + drivers/net/phy/phylink.c | 48 +++++++++++++++++++++++++++++++-------- + include/linux/phylink.h | 16 +++++++++++++ + 2 files changed, 55 insertions(+), 9 deletions(-) + +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -34,6 +34,10 @@ enum { + PHYLINK_DISABLE_STOPPED, + PHYLINK_DISABLE_LINK, + PHYLINK_DISABLE_MAC_WOL, ++ ++ PCS_STATE_DOWN = 0, ++ PCS_STATE_STARTING, ++ PCS_STATE_STARTED, + }; + + /** +@@ -72,6 +76,7 @@ struct phylink { + struct mutex state_mutex; + struct phylink_link_state phy_state; + struct work_struct resolve; ++ unsigned int pcs_state; + + bool mac_link_dropped; + bool using_mac_select_pcs; +@@ -795,6 +800,22 @@ static void phylink_mac_pcs_an_restart(s + } + } + ++static void phylink_pcs_disable(struct phylink_pcs *pcs) ++{ ++ if (pcs && pcs->ops->pcs_disable) ++ pcs->ops->pcs_disable(pcs); ++} ++ ++static int phylink_pcs_enable(struct phylink_pcs *pcs) ++{ ++ int err = 0; ++ ++ if (pcs && pcs->ops->pcs_enable) ++ err = pcs->ops->pcs_enable(pcs); ++ ++ return err; ++} ++ + static void phylink_major_config(struct phylink *pl, bool restart, + const struct phylink_link_state *state) + { +@@ -832,12 +853,16 @@ static void phylink_major_config(struct + * for the change. + */ + if (pcs_changed) { ++ phylink_pcs_disable(pl->pcs); + pl->pcs = pcs; + pl->pcs_ops = pcs->ops; + } + + phylink_mac_config(pl, state); + ++ if (pl->pcs_state == PCS_STATE_STARTING || pcs_changed) ++ phylink_pcs_enable(pl->pcs); ++ + if (pl->pcs_ops) { + err = pl->pcs_ops->pcs_config(pl->pcs, pl->cur_link_an_mode, + state->interface, +@@ -1261,6 +1286,7 @@ struct phylink *phylink_create(struct ph + pl->link_config.speed = SPEED_UNKNOWN; + pl->link_config.duplex = DUPLEX_UNKNOWN; + pl->link_config.an_enabled = true; ++ pl->pcs_state = PCS_STATE_DOWN; + pl->mac_ops = mac_ops; + __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); + timer_setup(&pl->link_poll, phylink_fixed_poll, 0); +@@ -1652,6 +1678,8 @@ void phylink_start(struct phylink *pl) + if (pl->netdev) + netif_carrier_off(pl->netdev); + ++ pl->pcs_state = PCS_STATE_STARTING; ++ + /* Apply the link configuration to the MAC when starting. This allows + * a fixed-link to start with the correct parameters, and also + * ensures that we set the appropriate advertisement for Serdes links. +@@ -1662,6 +1690,8 @@ void phylink_start(struct phylink *pl) + */ + phylink_mac_initial_config(pl, true); + ++ pl->pcs_state = PCS_STATE_STARTED; ++ + clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); + phylink_run_resolve(pl); + +@@ -1681,16 +1711,9 @@ void phylink_start(struct phylink *pl) + poll = true; + } + +- switch (pl->cfg_link_an_mode) { +- case MLO_AN_FIXED: ++ if (pl->cfg_link_an_mode == MLO_AN_FIXED) + poll |= pl->config->poll_fixed_state; +- break; +- case MLO_AN_INBAND: +- poll |= pl->config->pcs_poll; +- if (pl->pcs) +- poll |= pl->pcs->poll; +- break; +- } ++ + if (poll) + mod_timer(&pl->link_poll, jiffies + HZ); + if (pl->phydev) +@@ -1727,6 +1750,10 @@ void phylink_stop(struct phylink *pl) + } + + phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED); ++ ++ pl->pcs_state = PCS_STATE_DOWN; ++ ++ phylink_pcs_disable(pl->pcs); + } + EXPORT_SYMBOL_GPL(phylink_stop); + +--- a/include/linux/phylink.h ++++ b/include/linux/phylink.h +@@ -419,6 +419,8 @@ struct phylink_pcs { + /** + * struct phylink_pcs_ops - MAC PCS operations structure. + * @pcs_validate: validate the link configuration. ++ * @pcs_enable: enable the PCS. ++ * @pcs_disable: disable the PCS. + * @pcs_get_state: read the current MAC PCS link state from the hardware. + * @pcs_config: configure the MAC PCS for the selected mode and state. + * @pcs_an_restart: restart 802.3z BaseX autonegotiation. +@@ -428,6 +430,8 @@ struct phylink_pcs { + struct phylink_pcs_ops { + int (*pcs_validate)(struct phylink_pcs *pcs, unsigned long *supported, + const struct phylink_link_state *state); ++ int (*pcs_enable)(struct phylink_pcs *pcs); ++ void (*pcs_disable)(struct phylink_pcs *pcs); + void (*pcs_get_state)(struct phylink_pcs *pcs, + struct phylink_link_state *state); + int (*pcs_config)(struct phylink_pcs *pcs, unsigned int mode, +@@ -458,6 +462,18 @@ int pcs_validate(struct phylink_pcs *pcs + const struct phylink_link_state *state); + + /** ++ * pcs_enable() - enable the PCS. ++ * @pcs: a pointer to a &struct phylink_pcs. ++ */ ++int pcs_enable(struct phylink_pcs *pcs); ++ ++/** ++ * pcs_disable() - disable the PCS. ++ * @pcs: a pointer to a &struct phylink_pcs. ++ */ ++void pcs_disable(struct phylink_pcs *pcs); ++ ++/** + * pcs_get_state() - Read the current inband link state from the hardware + * @pcs: a pointer to a &struct phylink_pcs. + * @state: a pointer to a &struct phylink_link_state. diff --git a/target/linux/generic/backport-5.15/792-v5.16-net-dpaa2-mac-add-support-for-more-10G-modes.patch b/target/linux/generic/backport-5.15/792-v5.16-net-dpaa2-mac-add-support-for-more-10G-modes.patch new file mode 100644 index 0000000000..0bd96f1f4f --- /dev/null +++ b/target/linux/generic/backport-5.15/792-v5.16-net-dpaa2-mac-add-support-for-more-10G-modes.patch @@ -0,0 +1,34 @@ +From c314138bd045e050432158ab021160de3ba51c5e Mon Sep 17 00:00:00 2001 +From: Russell King +Date: Thu, 30 Jan 2020 22:42:38 +0000 +Subject: [PATCH 2/4] net: dpaa2-mac: add support for more 10G modes + +Phylink documentation says: + * Note that the PHY may be able to transform from one connection + * technology to another, so, eg, don't clear 1000BaseX just + * because the MAC is unable to BaseX mode. This is more about + * clearing unsupported speeds and duplex settings. The port modes + * should not be cleared; phylink_set_port_modes() will help with this. + +So add the missing 10G modes. + +Signed-off-by: Russell King +--- + drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c ++++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c +@@ -140,6 +140,12 @@ static void dpaa2_mac_validate(struct ph + case PHY_INTERFACE_MODE_10GBASER: + case PHY_INTERFACE_MODE_USXGMII: + phylink_set(mask, 10000baseT_Full); ++ phylink_set(mask, 10000baseKR_Full); ++ phylink_set(mask, 10000baseCR_Full); ++ phylink_set(mask, 10000baseSR_Full); ++ phylink_set(mask, 10000baseLR_Full); ++ phylink_set(mask, 10000baseLRM_Full); ++ phylink_set(mask, 10000baseER_Full); + if (state->interface == PHY_INTERFACE_MODE_10GBASER) + break; + phylink_set(mask, 5000baseT_Full); diff --git a/target/linux/generic/backport-5.15/793-v6.6-net-pcs-lynxi-implement-pcs_disable-op.patch b/target/linux/generic/backport-5.15/793-v6.6-net-pcs-lynxi-implement-pcs_disable-op.patch new file mode 100644 index 0000000000..eb9b4b7c09 --- /dev/null +++ b/target/linux/generic/backport-5.15/793-v6.6-net-pcs-lynxi-implement-pcs_disable-op.patch @@ -0,0 +1,44 @@ +From e4ccdfb78a47132f2d215658aab8902fc457c4b4 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Fri, 18 Aug 2023 04:07:46 +0100 +Subject: [PATCH 082/125] net: pcs: lynxi: implement pcs_disable op + +When switching from 10GBase-R/5GBase-R/USXGMII to one of the interface +modes provided by mtk-pcs-lynxi we need to make sure to always perform +a full configuration of the PHYA. + +Implement pcs_disable op which resets the stored interface mode to +PHY_INTERFACE_MODE_NA to trigger a full reconfiguration once the LynxI +PCS driver had previously been deselected in favor of another PCS +driver such as the to-be-added driver for the USXGMII PCS found in +MT7988. + +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/f23d1a60d2c9d2fb72e32dcb0eaa5f7e867a3d68.1692327891.git.daniel@makrotopia.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/pcs/pcs-mtk-lynxi.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/drivers/net/pcs/pcs-mtk-lynxi.c ++++ b/drivers/net/pcs/pcs-mtk-lynxi.c +@@ -241,11 +241,19 @@ static void mtk_pcs_lynxi_link_up(struct + } + } + ++static void mtk_pcs_lynxi_disable(struct phylink_pcs *pcs) ++{ ++ struct mtk_pcs_lynxi *mpcs = pcs_to_mtk_pcs_lynxi(pcs); ++ ++ mpcs->interface = PHY_INTERFACE_MODE_NA; ++} ++ + static const struct phylink_pcs_ops mtk_pcs_lynxi_ops = { + .pcs_get_state = mtk_pcs_lynxi_get_state, + .pcs_config = mtk_pcs_lynxi_config, + .pcs_an_restart = mtk_pcs_lynxi_restart_an, + .pcs_link_up = mtk_pcs_lynxi_link_up, ++ .pcs_disable = mtk_pcs_lynxi_disable, + }; + + struct phylink_pcs *mtk_pcs_lynxi_create(struct device *dev, diff --git a/target/linux/generic/backport-5.15/794-v6.2-net-core-Allow-live-renaming-when-an-interface-is-up.patch b/target/linux/generic/backport-5.15/794-v6.2-net-core-Allow-live-renaming-when-an-interface-is-up.patch new file mode 100644 index 0000000000..582e1ce2ef --- /dev/null +++ b/target/linux/generic/backport-5.15/794-v6.2-net-core-Allow-live-renaming-when-an-interface-is-up.patch @@ -0,0 +1,136 @@ +From: Andy Ren +Date: Mon, 7 Nov 2022 09:42:42 -0800 +Subject: [PATCH] net/core: Allow live renaming when an interface is up + +Allow a network interface to be renamed when the interface +is up. + +As described in the netconsole documentation [1], when netconsole is +used as a built-in, it will bring up the specified interface as soon as +possible. As a result, user space will not be able to rename the +interface since the kernel disallows renaming of interfaces that are +administratively up unless the 'IFF_LIVE_RENAME_OK' private flag was set +by the kernel. + +The original solution [2] to this problem was to add a new parameter to +the netconsole configuration parameters that allows renaming of +the interface used by netconsole while it is administratively up. +However, during the discussion that followed, it became apparent that we +have no reason to keep the current restriction and instead we should +allow user space to rename interfaces regardless of their administrative +state: + +1. The restriction was put in place over 20 years ago when renaming was +only possible via IOCTL and before rtnetlink started notifying user +space about such changes like it does today. + +2. The 'IFF_LIVE_RENAME_OK' flag was added over 3 years ago in version +5.2 and no regressions were reported. + +3. In-kernel listeners to 'NETDEV_CHANGENAME' do not seem to care about +the administrative state of interface. + +Therefore, allow user space to rename running interfaces by removing the +restriction and the associated 'IFF_LIVE_RENAME_OK' flag. Help in +possible triage by emitting a message to the kernel log that an +interface was renamed while UP. + +[1] https://www.kernel.org/doc/Documentation/networking/netconsole.rst +[2] https://lore.kernel.org/netdev/20221102002420.2613004-1-andy.ren@getcruise.com/ + +Signed-off-by: Andy Ren +Reviewed-by: Ido Schimmel +Reviewed-by: David Ahern +Signed-off-by: David S. Miller +--- + +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -1642,7 +1642,6 @@ struct net_device_ops { + * @IFF_FAILOVER: device is a failover master device + * @IFF_FAILOVER_SLAVE: device is lower dev of a failover master device + * @IFF_L3MDEV_RX_HANDLER: only invoke the rx handler of L3 master device +- * @IFF_LIVE_RENAME_OK: rename is allowed while device is up and running + * @IFF_TX_SKB_NO_LINEAR: device/driver is capable of xmitting frames with + * skb_headlen(skb) == 0 (data starts from frag0) + */ +@@ -1677,7 +1676,7 @@ enum netdev_priv_flags { + IFF_FAILOVER = 1<<27, + IFF_FAILOVER_SLAVE = 1<<28, + IFF_L3MDEV_RX_HANDLER = 1<<29, +- IFF_LIVE_RENAME_OK = 1<<30, ++ /* was IFF_LIVE_RENAME_OK */ + IFF_TX_SKB_NO_LINEAR = BIT_ULL(31), + }; + +@@ -1711,7 +1710,6 @@ enum netdev_priv_flags { + #define IFF_FAILOVER IFF_FAILOVER + #define IFF_FAILOVER_SLAVE IFF_FAILOVER_SLAVE + #define IFF_L3MDEV_RX_HANDLER IFF_L3MDEV_RX_HANDLER +-#define IFF_LIVE_RENAME_OK IFF_LIVE_RENAME_OK + #define IFF_TX_SKB_NO_LINEAR IFF_TX_SKB_NO_LINEAR + + /* Specifies the type of the struct net_device::ml_priv pointer */ +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -1242,22 +1242,6 @@ int dev_change_name(struct net_device *d + + net = dev_net(dev); + +- /* Some auto-enslaved devices e.g. failover slaves are +- * special, as userspace might rename the device after +- * the interface had been brought up and running since +- * the point kernel initiated auto-enslavement. Allow +- * live name change even when these slave devices are +- * up and running. +- * +- * Typically, users of these auto-enslaving devices +- * don't actually care about slave name change, as +- * they are supposed to operate on master interface +- * directly. +- */ +- if (dev->flags & IFF_UP && +- likely(!(dev->priv_flags & IFF_LIVE_RENAME_OK))) +- return -EBUSY; +- + down_write(&devnet_rename_sem); + + if (strncmp(newname, dev->name, IFNAMSIZ) == 0) { +@@ -1274,7 +1258,8 @@ int dev_change_name(struct net_device *d + } + + if (oldname[0] && !strchr(oldname, '%')) +- netdev_info(dev, "renamed from %s\n", oldname); ++ netdev_info(dev, "renamed from %s%s\n", oldname, ++ dev->flags & IFF_UP ? " (while UP)" : ""); + + old_assign_type = dev->name_assign_type; + dev->name_assign_type = NET_NAME_RENAMED; +--- a/net/core/failover.c ++++ b/net/core/failover.c +@@ -80,14 +80,14 @@ static int failover_slave_register(struc + goto err_upper_link; + } + +- slave_dev->priv_flags |= (IFF_FAILOVER_SLAVE | IFF_LIVE_RENAME_OK); ++ slave_dev->priv_flags |= IFF_FAILOVER_SLAVE; + + if (fops && fops->slave_register && + !fops->slave_register(slave_dev, failover_dev)) + return NOTIFY_OK; + + netdev_upper_dev_unlink(slave_dev, failover_dev); +- slave_dev->priv_flags &= ~(IFF_FAILOVER_SLAVE | IFF_LIVE_RENAME_OK); ++ slave_dev->priv_flags &= ~IFF_FAILOVER_SLAVE; + err_upper_link: + netdev_rx_handler_unregister(slave_dev); + done: +@@ -121,7 +121,7 @@ int failover_slave_unregister(struct net + + netdev_rx_handler_unregister(slave_dev); + netdev_upper_dev_unlink(slave_dev, failover_dev); +- slave_dev->priv_flags &= ~(IFF_FAILOVER_SLAVE | IFF_LIVE_RENAME_OK); ++ slave_dev->priv_flags &= ~IFF_FAILOVER_SLAVE; + + if (fops && fops->slave_unregister && + !fops->slave_unregister(slave_dev, failover_dev)) diff --git a/target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch b/target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch new file mode 100644 index 0000000000..a2168aaba5 --- /dev/null +++ b/target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch @@ -0,0 +1,68 @@ +From 16b1c4e01c89ba07367461e0bc4cb84993c2d027 Mon Sep 17 00:00:00 2001 +From: Jacky Chou +Date: Mon, 15 Nov 2021 11:49:41 +0800 +Subject: [PATCH] net: usb: ax88179_178a: add TSO feature + +On low-effciency embedded platforms, transmission performance is poor +due to on Bulk-out with single packet. +Adding TSO feature improves the transmission performance and reduces +the number of interrupt caused by Bulk-out complete. + +Reference to module, net: usb: aqc111. + +Signed-off-by: Jacky Chou +Signed-off-by: David S. Miller +--- + drivers/net/usb/ax88179_178a.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +--- a/drivers/net/usb/ax88179_178a.c ++++ b/drivers/net/usb/ax88179_178a.c +@@ -1377,11 +1377,12 @@ static int ax88179_bind(struct usbnet *d + dev->mii.phy_id = 0x03; + dev->mii.supports_gmii = 1; + +- dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | +- NETIF_F_RXCSUM; ++ dev->net->features |= NETIF_F_SG | NETIF_F_IP_CSUM | ++ NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM | NETIF_F_TSO; + +- dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | +- NETIF_F_RXCSUM; ++ dev->net->hw_features |= dev->net->features; ++ ++ netif_set_gso_max_size(dev->net, 16384); + + /* Enable checksum offload */ + *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP | +@@ -1587,17 +1588,19 @@ ax88179_tx_fixup(struct usbnet *dev, str + { + u32 tx_hdr1, tx_hdr2; + int frame_size = dev->maxpacket; +- int mss = skb_shinfo(skb)->gso_size; + int headroom; + void *ptr; + + tx_hdr1 = skb->len; +- tx_hdr2 = mss; ++ tx_hdr2 = skb_shinfo(skb)->gso_size; /* Set TSO mss */ + if (((skb->len + 8) % frame_size) == 0) + tx_hdr2 |= 0x80008000; /* Enable padding */ + + headroom = skb_headroom(skb) - 8; + ++ if ((dev->net->features & NETIF_F_SG) && skb_linearize(skb)) ++ return NULL; ++ + if ((skb_header_cloned(skb) || headroom < 0) && + pskb_expand_head(skb, headroom < 0 ? 8 : 0, 0, GFP_ATOMIC)) { + dev_kfree_skb_any(skb); +@@ -1608,6 +1611,8 @@ ax88179_tx_fixup(struct usbnet *dev, str + put_unaligned_le32(tx_hdr1, ptr); + put_unaligned_le32(tx_hdr2, ptr + 4); + ++ usbnet_set_skb_tx_stats(skb, (skb_shinfo(skb)->gso_segs ?: 1), 0); ++ + return skb; + } + diff --git a/target/linux/generic/backport-5.15/798-net-next-net-sfp-add-quirk-for-Fiberstone-GPON-ONU-34-20BI.patch b/target/linux/generic/backport-5.15/798-net-next-net-sfp-add-quirk-for-Fiberstone-GPON-ONU-34-20BI.patch new file mode 100644 index 0000000000..d6015a5658 --- /dev/null +++ b/target/linux/generic/backport-5.15/798-net-next-net-sfp-add-quirk-for-Fiberstone-GPON-ONU-34-20BI.patch @@ -0,0 +1,34 @@ +From d387e34fec407f881fdf165b5d7ec128ebff362f Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Tue, 19 Sep 2023 14:47:20 +0200 +Subject: [PATCH] net: sfp: add quirk for Fiberstone GPON-ONU-34-20BI + +Fiberstone GPON-ONU-34-20B can operate at 2500base-X, but report 1.2GBd +NRZ in their EEPROM. + +The module also require the ignore tx fault fixup similar to Huawei MA5671A +as it gets disabled on error messages with serial redirection enabled. + +Signed-off-by: Christian Marangi +Link: https://lore.kernel.org/r/20230919124720.8210-1-ansuelsmth@gmail.com +Signed-off-by: Paolo Abeni +--- + drivers/net/phy/sfp.c | 5 +++++ + 1 file changed, 5 insertions(+) + +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -368,6 +368,13 @@ static const struct sfp_quirk sfp_quirks + .modes = sfp_quirk_2500basex, + .fixup = sfp_fixup_long_startup, + }, { ++ // Fiberstore GPON-ONU-34-20BI can operate at 2500base-X, but report 1.2GBd ++ // NRZ in their EEPROM ++ .vendor = "FS", ++ .part = "GPON-ONU-34-20BI", ++ .modes = sfp_quirk_2500basex, ++ .fixup = sfp_fixup_ignore_tx_fault, ++ }, { + .vendor = "HALNy", + .part = "HL-GSFP", + .fixup = sfp_fixup_halny_gsfp, diff --git a/target/linux/generic/backport-5.10/845-v6.0-0001-dt-bindings-leds-add-Broadcom-s-BCM63138-controller.patch b/target/linux/generic/backport-5.15/800-v6.0-0001-dt-bindings-leds-add-Broadcom-s-BCM63138-controller.patch similarity index 100% rename from target/linux/generic/backport-5.10/845-v6.0-0001-dt-bindings-leds-add-Broadcom-s-BCM63138-controller.patch rename to target/linux/generic/backport-5.15/800-v6.0-0001-dt-bindings-leds-add-Broadcom-s-BCM63138-controller.patch diff --git a/target/linux/generic/backport-5.15/800-v6.0-0002-leds-bcm63138-add-support-for-BCM63138-controller.patch b/target/linux/generic/backport-5.15/800-v6.0-0002-leds-bcm63138-add-support-for-BCM63138-controller.patch new file mode 100644 index 0000000000..376584574f --- /dev/null +++ b/target/linux/generic/backport-5.15/800-v6.0-0002-leds-bcm63138-add-support-for-BCM63138-controller.patch @@ -0,0 +1,356 @@ +From a0ba692072d89075d0a75c7ad9df31f2c1ee9a1c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Mon, 27 Dec 2021 15:59:05 +0100 +Subject: [PATCH] leds: bcm63138: add support for BCM63138 controller +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It's a new controller first introduced in BCM63138 SoC. Later it was +also used in BCM4908, some BCM68xx and some BCM63xxx SoCs. + +Signed-off-by: Rafał Miłecki +Reviewed-by: Florian Fainelli +Signed-off-by: Pavel Machek +--- + drivers/leds/blink/Kconfig | 12 ++ + drivers/leds/blink/Makefile | 1 + + drivers/leds/blink/leds-bcm63138.c | 308 +++++++++++++++++++++++++++++ + 3 files changed, 321 insertions(+) + create mode 100644 drivers/leds/blink/leds-bcm63138.c + +--- a/drivers/leds/blink/Kconfig ++++ b/drivers/leds/blink/Kconfig +@@ -1,3 +1,15 @@ ++config LEDS_BCM63138 ++ tristate "LED Support for Broadcom BCM63138 SoC" ++ depends on LEDS_CLASS ++ depends on ARCH_BCM4908 || ARCH_BCM_5301X || BCM63XX || COMPILE_TEST ++ depends on HAS_IOMEM ++ depends on OF ++ default ARCH_BCM4908 ++ help ++ This option enables support for LED controller that is part of ++ BCM63138 SoC. The same hardware block is known to be also used ++ in BCM4908, BCM6848, BCM6858, BCM63148, BCM63381 and BCM68360. ++ + config LEDS_LGM + tristate "LED support for LGM SoC series" + depends on X86 || COMPILE_TEST +--- a/drivers/leds/blink/Makefile ++++ b/drivers/leds/blink/Makefile +@@ -1,2 +1,3 @@ + # SPDX-License-Identifier: GPL-2.0 ++obj-$(CONFIG_LEDS_BCM63138) += leds-bcm63138.o + obj-$(CONFIG_LEDS_LGM) += leds-lgm-sso.o +--- /dev/null ++++ b/drivers/leds/blink/leds-bcm63138.c +@@ -0,0 +1,308 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * Copyright (C) 2021 Rafał Miłecki ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define BCM63138_MAX_LEDS 32 ++#define BCM63138_MAX_BRIGHTNESS 9 ++ ++#define BCM63138_LED_BITS 4 /* how many bits control a single LED */ ++#define BCM63138_LED_MASK ((1 << BCM63138_LED_BITS) - 1) /* 0xf */ ++#define BCM63138_LEDS_PER_REG (32 / BCM63138_LED_BITS) /* 8 */ ++ ++#define BCM63138_GLB_CTRL 0x00 ++#define BCM63138_GLB_CTRL_SERIAL_LED_DATA_PPOL 0x00000002 ++#define BCM63138_GLB_CTRL_SERIAL_LED_EN_POL 0x00000008 ++#define BCM63138_MASK 0x04 ++#define BCM63138_HW_LED_EN 0x08 ++#define BCM63138_SERIAL_LED_SHIFT_SEL 0x0c ++#define BCM63138_FLASH_RATE_CTRL1 0x10 ++#define BCM63138_FLASH_RATE_CTRL2 0x14 ++#define BCM63138_FLASH_RATE_CTRL3 0x18 ++#define BCM63138_FLASH_RATE_CTRL4 0x1c ++#define BCM63138_BRIGHT_CTRL1 0x20 ++#define BCM63138_BRIGHT_CTRL2 0x24 ++#define BCM63138_BRIGHT_CTRL3 0x28 ++#define BCM63138_BRIGHT_CTRL4 0x2c ++#define BCM63138_POWER_LED_CFG 0x30 ++#define BCM63138_HW_POLARITY 0xb4 ++#define BCM63138_SW_DATA 0xb8 ++#define BCM63138_SW_POLARITY 0xbc ++#define BCM63138_PARALLEL_LED_POLARITY 0xc0 ++#define BCM63138_SERIAL_LED_POLARITY 0xc4 ++#define BCM63138_HW_LED_STATUS 0xc8 ++#define BCM63138_FLASH_CTRL_STATUS 0xcc ++#define BCM63138_FLASH_BRT_CTRL 0xd0 ++#define BCM63138_FLASH_P_LED_OUT_STATUS 0xd4 ++#define BCM63138_FLASH_S_LED_OUT_STATUS 0xd8 ++ ++struct bcm63138_leds { ++ struct device *dev; ++ void __iomem *base; ++ spinlock_t lock; ++}; ++ ++struct bcm63138_led { ++ struct bcm63138_leds *leds; ++ struct led_classdev cdev; ++ u32 pin; ++ bool active_low; ++}; ++ ++/* ++ * I/O access ++ */ ++ ++static void bcm63138_leds_write(struct bcm63138_leds *leds, unsigned int reg, ++ u32 data) ++{ ++ writel(data, leds->base + reg); ++} ++ ++static unsigned long bcm63138_leds_read(struct bcm63138_leds *leds, ++ unsigned int reg) ++{ ++ return readl(leds->base + reg); ++} ++ ++static void bcm63138_leds_update_bits(struct bcm63138_leds *leds, ++ unsigned int reg, u32 mask, u32 val) ++{ ++ WARN_ON(val & ~mask); ++ ++ bcm63138_leds_write(leds, reg, (bcm63138_leds_read(leds, reg) & ~mask) | (val & mask)); ++} ++ ++/* ++ * Helpers ++ */ ++ ++static void bcm63138_leds_set_flash_rate(struct bcm63138_leds *leds, ++ struct bcm63138_led *led, ++ u8 value) ++{ ++ int reg_offset = (led->pin >> fls((BCM63138_LEDS_PER_REG - 1))) * 4; ++ int shift = (led->pin & (BCM63138_LEDS_PER_REG - 1)) * BCM63138_LED_BITS; ++ ++ bcm63138_leds_update_bits(leds, BCM63138_FLASH_RATE_CTRL1 + reg_offset, ++ BCM63138_LED_MASK << shift, value << shift); ++} ++ ++static void bcm63138_leds_set_bright(struct bcm63138_leds *leds, ++ struct bcm63138_led *led, ++ u8 value) ++{ ++ int reg_offset = (led->pin >> fls((BCM63138_LEDS_PER_REG - 1))) * 4; ++ int shift = (led->pin & (BCM63138_LEDS_PER_REG - 1)) * BCM63138_LED_BITS; ++ ++ bcm63138_leds_update_bits(leds, BCM63138_BRIGHT_CTRL1 + reg_offset, ++ BCM63138_LED_MASK << shift, value << shift); ++} ++ ++static void bcm63138_leds_enable_led(struct bcm63138_leds *leds, ++ struct bcm63138_led *led, ++ enum led_brightness value) ++{ ++ u32 bit = BIT(led->pin); ++ ++ bcm63138_leds_update_bits(leds, BCM63138_SW_DATA, bit, ++ value == LED_OFF ? 0 : bit); ++} ++ ++/* ++ * API callbacks ++ */ ++ ++static void bcm63138_leds_brightness_set(struct led_classdev *led_cdev, ++ enum led_brightness value) ++{ ++ struct bcm63138_led *led = container_of(led_cdev, struct bcm63138_led, cdev); ++ struct bcm63138_leds *leds = led->leds; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&leds->lock, flags); ++ ++ bcm63138_leds_enable_led(leds, led, value); ++ if (!value) ++ bcm63138_leds_set_flash_rate(leds, led, 0); ++ else ++ bcm63138_leds_set_bright(leds, led, value); ++ ++ spin_unlock_irqrestore(&leds->lock, flags); ++} ++ ++static int bcm63138_leds_blink_set(struct led_classdev *led_cdev, ++ unsigned long *delay_on, ++ unsigned long *delay_off) ++{ ++ struct bcm63138_led *led = container_of(led_cdev, struct bcm63138_led, cdev); ++ struct bcm63138_leds *leds = led->leds; ++ unsigned long flags; ++ u8 value; ++ ++ if (!*delay_on && !*delay_off) { ++ *delay_on = 640; ++ *delay_off = 640; ++ } ++ ++ if (*delay_on != *delay_off) { ++ dev_dbg(led_cdev->dev, "Blinking at unequal delays is not supported\n"); ++ return -EINVAL; ++ } ++ ++ switch (*delay_on) { ++ case 1152 ... 1408: /* 1280 ms ± 10% */ ++ value = 0x7; ++ break; ++ case 576 ... 704: /* 640 ms ± 10% */ ++ value = 0x6; ++ break; ++ case 288 ... 352: /* 320 ms ± 10% */ ++ value = 0x5; ++ break; ++ case 126 ... 154: /* 140 ms ± 10% */ ++ value = 0x4; ++ break; ++ case 59 ... 72: /* 65 ms ± 10% */ ++ value = 0x3; ++ break; ++ default: ++ dev_dbg(led_cdev->dev, "Blinking delay value %lu is unsupported\n", ++ *delay_on); ++ return -EINVAL; ++ } ++ ++ spin_lock_irqsave(&leds->lock, flags); ++ ++ bcm63138_leds_enable_led(leds, led, BCM63138_MAX_BRIGHTNESS); ++ bcm63138_leds_set_flash_rate(leds, led, value); ++ ++ spin_unlock_irqrestore(&leds->lock, flags); ++ ++ return 0; ++} ++ ++/* ++ * LED driver ++ */ ++ ++static void bcm63138_leds_create_led(struct bcm63138_leds *leds, ++ struct device_node *np) ++{ ++ struct led_init_data init_data = { ++ .fwnode = of_fwnode_handle(np), ++ }; ++ struct device *dev = leds->dev; ++ struct bcm63138_led *led; ++ struct pinctrl *pinctrl; ++ u32 bit; ++ int err; ++ ++ led = devm_kzalloc(dev, sizeof(*led), GFP_KERNEL); ++ if (!led) { ++ dev_err(dev, "Failed to alloc LED\n"); ++ return; ++ } ++ ++ led->leds = leds; ++ ++ if (of_property_read_u32(np, "reg", &led->pin)) { ++ dev_err(dev, "Missing \"reg\" property in %pOF\n", np); ++ goto err_free; ++ } ++ ++ if (led->pin >= BCM63138_MAX_LEDS) { ++ dev_err(dev, "Invalid \"reg\" value %d\n", led->pin); ++ goto err_free; ++ } ++ ++ led->active_low = of_property_read_bool(np, "active-low"); ++ ++ led->cdev.max_brightness = BCM63138_MAX_BRIGHTNESS; ++ led->cdev.brightness_set = bcm63138_leds_brightness_set; ++ led->cdev.blink_set = bcm63138_leds_blink_set; ++ ++ err = devm_led_classdev_register_ext(dev, &led->cdev, &init_data); ++ if (err) { ++ dev_err(dev, "Failed to register LED %pOF: %d\n", np, err); ++ goto err_free; ++ } ++ ++ pinctrl = devm_pinctrl_get_select_default(led->cdev.dev); ++ if (IS_ERR(pinctrl) && PTR_ERR(pinctrl) != -ENODEV) { ++ dev_warn(led->cdev.dev, "Failed to select %pOF pinctrl: %ld\n", ++ np, PTR_ERR(pinctrl)); ++ } ++ ++ bit = BIT(led->pin); ++ bcm63138_leds_update_bits(leds, BCM63138_PARALLEL_LED_POLARITY, bit, ++ led->active_low ? 0 : bit); ++ bcm63138_leds_update_bits(leds, BCM63138_HW_LED_EN, bit, 0); ++ bcm63138_leds_set_flash_rate(leds, led, 0); ++ bcm63138_leds_enable_led(leds, led, led->cdev.brightness); ++ ++ return; ++ ++err_free: ++ devm_kfree(dev, led); ++} ++ ++static int bcm63138_leds_probe(struct platform_device *pdev) ++{ ++ struct device_node *np = dev_of_node(&pdev->dev); ++ struct device *dev = &pdev->dev; ++ struct bcm63138_leds *leds; ++ struct device_node *child; ++ ++ leds = devm_kzalloc(dev, sizeof(*leds), GFP_KERNEL); ++ if (!leds) ++ return -ENOMEM; ++ ++ leds->dev = dev; ++ ++ leds->base = devm_platform_ioremap_resource(pdev, 0); ++ if (IS_ERR(leds->base)) ++ return PTR_ERR(leds->base); ++ ++ spin_lock_init(&leds->lock); ++ ++ bcm63138_leds_write(leds, BCM63138_GLB_CTRL, ++ BCM63138_GLB_CTRL_SERIAL_LED_DATA_PPOL | ++ BCM63138_GLB_CTRL_SERIAL_LED_EN_POL); ++ bcm63138_leds_write(leds, BCM63138_HW_LED_EN, 0); ++ bcm63138_leds_write(leds, BCM63138_SERIAL_LED_POLARITY, 0); ++ bcm63138_leds_write(leds, BCM63138_PARALLEL_LED_POLARITY, 0); ++ ++ for_each_available_child_of_node(np, child) { ++ bcm63138_leds_create_led(leds, child); ++ } ++ ++ return 0; ++} ++ ++static const struct of_device_id bcm63138_leds_of_match_table[] = { ++ { .compatible = "brcm,bcm63138-leds", }, ++ { }, ++}; ++ ++static struct platform_driver bcm63138_leds_driver = { ++ .probe = bcm63138_leds_probe, ++ .driver = { ++ .name = "leds-bcm63xxx", ++ .of_match_table = bcm63138_leds_of_match_table, ++ }, ++}; ++ ++module_platform_driver(bcm63138_leds_driver); ++ ++MODULE_AUTHOR("Rafał Miłecki"); ++MODULE_LICENSE("GPL"); ++MODULE_DEVICE_TABLE(of, bcm63138_leds_of_match_table); diff --git a/target/linux/generic/backport-5.10/846-v6.0-0001-dt-bindings-leds-leds-bcm63138-unify-full-stops-in-d.patch b/target/linux/generic/backport-5.15/801-v6.0-0001-dt-bindings-leds-leds-bcm63138-unify-full-stops-in-d.patch similarity index 100% rename from target/linux/generic/backport-5.10/846-v6.0-0001-dt-bindings-leds-leds-bcm63138-unify-full-stops-in-d.patch rename to target/linux/generic/backport-5.15/801-v6.0-0001-dt-bindings-leds-leds-bcm63138-unify-full-stops-in-d.patch diff --git a/target/linux/generic/backport-5.15/801-v6.0-0002-leds-add-help-info-about-BCM63138-module-name.patch b/target/linux/generic/backport-5.15/801-v6.0-0002-leds-add-help-info-about-BCM63138-module-name.patch new file mode 100644 index 0000000000..5430b1f084 --- /dev/null +++ b/target/linux/generic/backport-5.15/801-v6.0-0002-leds-add-help-info-about-BCM63138-module-name.patch @@ -0,0 +1,28 @@ +From bcc607cdbb1f931111196699426f0cb83bfb296a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Sun, 17 Jul 2022 14:42:47 +0200 +Subject: [PATCH] leds: add help info about BCM63138 module name +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It's what we do for all other LEDs drivers. + +Reported-by: Pavel Machek +Signed-off-by: Rafał Miłecki +Signed-off-by: Pavel Machek +--- + drivers/leds/blink/Kconfig | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/leds/blink/Kconfig ++++ b/drivers/leds/blink/Kconfig +@@ -10,6 +10,8 @@ config LEDS_BCM63138 + BCM63138 SoC. The same hardware block is known to be also used + in BCM4908, BCM6848, BCM6858, BCM63148, BCM63381 and BCM68360. + ++ If compiled as module it will be called leds-bcm63138. ++ + config LEDS_LGM + tristate "LED support for LGM SoC series" + depends on X86 || COMPILE_TEST diff --git a/target/linux/generic/backport-5.10/846-v6.0-0003-leds-leds-bcm63138-get-rid-of-LED_OFF.patch b/target/linux/generic/backport-5.15/801-v6.0-0003-leds-leds-bcm63138-get-rid-of-LED_OFF.patch similarity index 100% rename from target/linux/generic/backport-5.10/846-v6.0-0003-leds-leds-bcm63138-get-rid-of-LED_OFF.patch rename to target/linux/generic/backport-5.15/801-v6.0-0003-leds-leds-bcm63138-get-rid-of-LED_OFF.patch diff --git a/target/linux/generic/backport-5.15/802-v5.16-0001-nvmem-core-rework-nvmem-cell-instance-creation.patch b/target/linux/generic/backport-5.15/802-v5.16-0001-nvmem-core-rework-nvmem-cell-instance-creation.patch new file mode 100644 index 0000000000..ebab8c7c73 --- /dev/null +++ b/target/linux/generic/backport-5.15/802-v5.16-0001-nvmem-core-rework-nvmem-cell-instance-creation.patch @@ -0,0 +1,456 @@ +From 7ae6478b304bc004c3139b422665b0e23b57f05c Mon Sep 17 00:00:00 2001 +From: Srinivas Kandagatla +Date: Wed, 13 Oct 2021 14:19:55 +0100 +Subject: [PATCH] nvmem: core: rework nvmem cell instance creation + +In the existing design, we do not create a instance per nvmem cell consumer +but we directly refer cell from nvmem cell list that are added to provider. + +However this design has some limitations when consumers want to assign name +or connection id the nvmem cell instance, ex: via "nvmem-cell-names" or +id in nvmem_cell_get(id). + +Having a name associated with nvmem cell consumer instance will help +provider drivers in performing post processing of nvmem cell data if required +before data is seen by the consumers. This is pretty normal with some vendors +storing nvmem cells like mac-address in a vendor specific data layouts that +are not directly usable by the consumer drivers. + +With this patch nvmem cell will be created dynamically during nvmem_cell_get +and destroyed in nvmem_cell_put, allowing consumers to associate name with +nvmem cell consumer instance. + +With this patch a new struct nvmem_cell_entry replaces struct nvmem_cell +for storing nvmem cell information within the core. +This patch does not change nvmem-consumer interface based on nvmem_cell. + +Tested-by: Joakim Zhang +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20211013131957.30271-2-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 165 +++++++++++++++++++++++++++---------------- + 1 file changed, 105 insertions(+), 60 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -45,8 +45,7 @@ struct nvmem_device { + #define to_nvmem_device(d) container_of(d, struct nvmem_device, dev) + + #define FLAG_COMPAT BIT(0) +- +-struct nvmem_cell { ++struct nvmem_cell_entry { + const char *name; + int offset; + int bytes; +@@ -57,6 +56,11 @@ struct nvmem_cell { + struct list_head node; + }; + ++struct nvmem_cell { ++ struct nvmem_cell_entry *entry; ++ const char *id; ++}; ++ + static DEFINE_MUTEX(nvmem_mutex); + static DEFINE_IDA(nvmem_ida); + +@@ -424,7 +428,7 @@ static struct bus_type nvmem_bus_type = + .name = "nvmem", + }; + +-static void nvmem_cell_drop(struct nvmem_cell *cell) ++static void nvmem_cell_entry_drop(struct nvmem_cell_entry *cell) + { + blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell); + mutex_lock(&nvmem_mutex); +@@ -437,13 +441,13 @@ static void nvmem_cell_drop(struct nvmem + + static void nvmem_device_remove_all_cells(const struct nvmem_device *nvmem) + { +- struct nvmem_cell *cell, *p; ++ struct nvmem_cell_entry *cell, *p; + + list_for_each_entry_safe(cell, p, &nvmem->cells, node) +- nvmem_cell_drop(cell); ++ nvmem_cell_entry_drop(cell); + } + +-static void nvmem_cell_add(struct nvmem_cell *cell) ++static void nvmem_cell_entry_add(struct nvmem_cell_entry *cell) + { + mutex_lock(&nvmem_mutex); + list_add_tail(&cell->node, &cell->nvmem->cells); +@@ -451,9 +455,9 @@ static void nvmem_cell_add(struct nvmem_ + blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_ADD, cell); + } + +-static int nvmem_cell_info_to_nvmem_cell_nodup(struct nvmem_device *nvmem, +- const struct nvmem_cell_info *info, +- struct nvmem_cell *cell) ++static int nvmem_cell_info_to_nvmem_cell_entry_nodup(struct nvmem_device *nvmem, ++ const struct nvmem_cell_info *info, ++ struct nvmem_cell_entry *cell) + { + cell->nvmem = nvmem; + cell->offset = info->offset; +@@ -477,13 +481,13 @@ static int nvmem_cell_info_to_nvmem_cell + return 0; + } + +-static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem, +- const struct nvmem_cell_info *info, +- struct nvmem_cell *cell) ++static int nvmem_cell_info_to_nvmem_cell_entry(struct nvmem_device *nvmem, ++ const struct nvmem_cell_info *info, ++ struct nvmem_cell_entry *cell) + { + int err; + +- err = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, cell); ++ err = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, cell); + if (err) + return err; + +@@ -507,7 +511,7 @@ static int nvmem_add_cells(struct nvmem_ + const struct nvmem_cell_info *info, + int ncells) + { +- struct nvmem_cell **cells; ++ struct nvmem_cell_entry **cells; + int i, rval; + + cells = kcalloc(ncells, sizeof(*cells), GFP_KERNEL); +@@ -521,13 +525,13 @@ static int nvmem_add_cells(struct nvmem_ + goto err; + } + +- rval = nvmem_cell_info_to_nvmem_cell(nvmem, &info[i], cells[i]); ++ rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, &info[i], cells[i]); + if (rval) { + kfree(cells[i]); + goto err; + } + +- nvmem_cell_add(cells[i]); ++ nvmem_cell_entry_add(cells[i]); + } + + /* remove tmp array */ +@@ -536,7 +540,7 @@ static int nvmem_add_cells(struct nvmem_ + return 0; + err: + while (i--) +- nvmem_cell_drop(cells[i]); ++ nvmem_cell_entry_drop(cells[i]); + + kfree(cells); + +@@ -573,7 +577,7 @@ static int nvmem_add_cells_from_table(st + { + const struct nvmem_cell_info *info; + struct nvmem_cell_table *table; +- struct nvmem_cell *cell; ++ struct nvmem_cell_entry *cell; + int rval = 0, i; + + mutex_lock(&nvmem_cell_mutex); +@@ -588,15 +592,13 @@ static int nvmem_add_cells_from_table(st + goto out; + } + +- rval = nvmem_cell_info_to_nvmem_cell(nvmem, +- info, +- cell); ++ rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, info, cell); + if (rval) { + kfree(cell); + goto out; + } + +- nvmem_cell_add(cell); ++ nvmem_cell_entry_add(cell); + } + } + } +@@ -606,10 +608,10 @@ out: + return rval; + } + +-static struct nvmem_cell * +-nvmem_find_cell_by_name(struct nvmem_device *nvmem, const char *cell_id) ++static struct nvmem_cell_entry * ++nvmem_find_cell_entry_by_name(struct nvmem_device *nvmem, const char *cell_id) + { +- struct nvmem_cell *iter, *cell = NULL; ++ struct nvmem_cell_entry *iter, *cell = NULL; + + mutex_lock(&nvmem_mutex); + list_for_each_entry(iter, &nvmem->cells, node) { +@@ -680,7 +682,7 @@ static int nvmem_add_cells_from_of(struc + { + struct device_node *parent, *child; + struct device *dev = &nvmem->dev; +- struct nvmem_cell *cell; ++ struct nvmem_cell_entry *cell; + const __be32 *addr; + int len; + +@@ -729,7 +731,7 @@ static int nvmem_add_cells_from_of(struc + } + + cell->np = of_node_get(child); +- nvmem_cell_add(cell); ++ nvmem_cell_entry_add(cell); + } + + return 0; +@@ -1142,9 +1144,33 @@ struct nvmem_device *devm_nvmem_device_g + } + EXPORT_SYMBOL_GPL(devm_nvmem_device_get); + ++static struct nvmem_cell *nvmem_create_cell(struct nvmem_cell_entry *entry, const char *id) ++{ ++ struct nvmem_cell *cell; ++ const char *name = NULL; ++ ++ cell = kzalloc(sizeof(*cell), GFP_KERNEL); ++ if (!cell) ++ return ERR_PTR(-ENOMEM); ++ ++ if (id) { ++ name = kstrdup_const(id, GFP_KERNEL); ++ if (!name) { ++ kfree(cell); ++ return ERR_PTR(-ENOMEM); ++ } ++ } ++ ++ cell->id = name; ++ cell->entry = entry; ++ ++ return cell; ++} ++ + static struct nvmem_cell * + nvmem_cell_get_from_lookup(struct device *dev, const char *con_id) + { ++ struct nvmem_cell_entry *cell_entry; + struct nvmem_cell *cell = ERR_PTR(-ENOENT); + struct nvmem_cell_lookup *lookup; + struct nvmem_device *nvmem; +@@ -1169,11 +1195,15 @@ nvmem_cell_get_from_lookup(struct device + break; + } + +- cell = nvmem_find_cell_by_name(nvmem, +- lookup->cell_name); +- if (!cell) { ++ cell_entry = nvmem_find_cell_entry_by_name(nvmem, ++ lookup->cell_name); ++ if (!cell_entry) { + __nvmem_device_put(nvmem); + cell = ERR_PTR(-ENOENT); ++ } else { ++ cell = nvmem_create_cell(cell_entry, con_id); ++ if (IS_ERR(cell)) ++ __nvmem_device_put(nvmem); + } + break; + } +@@ -1184,10 +1214,10 @@ nvmem_cell_get_from_lookup(struct device + } + + #if IS_ENABLED(CONFIG_OF) +-static struct nvmem_cell * +-nvmem_find_cell_by_node(struct nvmem_device *nvmem, struct device_node *np) ++static struct nvmem_cell_entry * ++nvmem_find_cell_entry_by_node(struct nvmem_device *nvmem, struct device_node *np) + { +- struct nvmem_cell *iter, *cell = NULL; ++ struct nvmem_cell_entry *iter, *cell = NULL; + + mutex_lock(&nvmem_mutex); + list_for_each_entry(iter, &nvmem->cells, node) { +@@ -1217,6 +1247,7 @@ struct nvmem_cell *of_nvmem_cell_get(str + { + struct device_node *cell_np, *nvmem_np; + struct nvmem_device *nvmem; ++ struct nvmem_cell_entry *cell_entry; + struct nvmem_cell *cell; + int index = 0; + +@@ -1237,12 +1268,16 @@ struct nvmem_cell *of_nvmem_cell_get(str + if (IS_ERR(nvmem)) + return ERR_CAST(nvmem); + +- cell = nvmem_find_cell_by_node(nvmem, cell_np); +- if (!cell) { ++ cell_entry = nvmem_find_cell_entry_by_node(nvmem, cell_np); ++ if (!cell_entry) { + __nvmem_device_put(nvmem); + return ERR_PTR(-ENOENT); + } + ++ cell = nvmem_create_cell(cell_entry, id); ++ if (IS_ERR(cell)) ++ __nvmem_device_put(nvmem); ++ + return cell; + } + EXPORT_SYMBOL_GPL(of_nvmem_cell_get); +@@ -1348,13 +1383,17 @@ EXPORT_SYMBOL(devm_nvmem_cell_put); + */ + void nvmem_cell_put(struct nvmem_cell *cell) + { +- struct nvmem_device *nvmem = cell->nvmem; ++ struct nvmem_device *nvmem = cell->entry->nvmem; ++ ++ if (cell->id) ++ kfree_const(cell->id); + ++ kfree(cell); + __nvmem_device_put(nvmem); + } + EXPORT_SYMBOL_GPL(nvmem_cell_put); + +-static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf) ++static void nvmem_shift_read_buffer_in_place(struct nvmem_cell_entry *cell, void *buf) + { + u8 *p, *b; + int i, extra, bit_offset = cell->bit_offset; +@@ -1388,8 +1427,8 @@ static void nvmem_shift_read_buffer_in_p + } + + static int __nvmem_cell_read(struct nvmem_device *nvmem, +- struct nvmem_cell *cell, +- void *buf, size_t *len) ++ struct nvmem_cell_entry *cell, ++ void *buf, size_t *len, const char *id) + { + int rc; + +@@ -1420,18 +1459,18 @@ static int __nvmem_cell_read(struct nvme + */ + void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len) + { +- struct nvmem_device *nvmem = cell->nvmem; ++ struct nvmem_device *nvmem = cell->entry->nvmem; + u8 *buf; + int rc; + + if (!nvmem) + return ERR_PTR(-EINVAL); + +- buf = kzalloc(cell->bytes, GFP_KERNEL); ++ buf = kzalloc(cell->entry->bytes, GFP_KERNEL); + if (!buf) + return ERR_PTR(-ENOMEM); + +- rc = __nvmem_cell_read(nvmem, cell, buf, len); ++ rc = __nvmem_cell_read(nvmem, cell->entry, buf, len, cell->id); + if (rc) { + kfree(buf); + return ERR_PTR(rc); +@@ -1441,7 +1480,7 @@ void *nvmem_cell_read(struct nvmem_cell + } + EXPORT_SYMBOL_GPL(nvmem_cell_read); + +-static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell, ++static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell_entry *cell, + u8 *_buf, int len) + { + struct nvmem_device *nvmem = cell->nvmem; +@@ -1494,16 +1533,7 @@ err: + return ERR_PTR(rc); + } + +-/** +- * nvmem_cell_write() - Write to a given nvmem cell +- * +- * @cell: nvmem cell to be written. +- * @buf: Buffer to be written. +- * @len: length of buffer to be written to nvmem cell. +- * +- * Return: length of bytes written or negative on failure. +- */ +-int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len) ++static int __nvmem_cell_entry_write(struct nvmem_cell_entry *cell, void *buf, size_t len) + { + struct nvmem_device *nvmem = cell->nvmem; + int rc; +@@ -1529,6 +1559,21 @@ int nvmem_cell_write(struct nvmem_cell * + + return len; + } ++ ++/** ++ * nvmem_cell_write() - Write to a given nvmem cell ++ * ++ * @cell: nvmem cell to be written. ++ * @buf: Buffer to be written. ++ * @len: length of buffer to be written to nvmem cell. ++ * ++ * Return: length of bytes written or negative on failure. ++ */ ++int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len) ++{ ++ return __nvmem_cell_entry_write(cell->entry, buf, len); ++} ++ + EXPORT_SYMBOL_GPL(nvmem_cell_write); + + static int nvmem_cell_read_common(struct device *dev, const char *cell_id, +@@ -1631,7 +1676,7 @@ static const void *nvmem_cell_read_varia + if (IS_ERR(cell)) + return cell; + +- nbits = cell->nbits; ++ nbits = cell->entry->nbits; + buf = nvmem_cell_read(cell, len); + nvmem_cell_put(cell); + if (IS_ERR(buf)) +@@ -1727,18 +1772,18 @@ EXPORT_SYMBOL_GPL(nvmem_cell_read_variab + ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem, + struct nvmem_cell_info *info, void *buf) + { +- struct nvmem_cell cell; ++ struct nvmem_cell_entry cell; + int rc; + ssize_t len; + + if (!nvmem) + return -EINVAL; + +- rc = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, &cell); ++ rc = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, &cell); + if (rc) + return rc; + +- rc = __nvmem_cell_read(nvmem, &cell, buf, &len); ++ rc = __nvmem_cell_read(nvmem, &cell, buf, &len, NULL); + if (rc) + return rc; + +@@ -1758,17 +1803,17 @@ EXPORT_SYMBOL_GPL(nvmem_device_cell_read + int nvmem_device_cell_write(struct nvmem_device *nvmem, + struct nvmem_cell_info *info, void *buf) + { +- struct nvmem_cell cell; ++ struct nvmem_cell_entry cell; + int rc; + + if (!nvmem) + return -EINVAL; + +- rc = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, &cell); ++ rc = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, &cell); + if (rc) + return rc; + +- return nvmem_cell_write(&cell, buf, cell.bytes); ++ return __nvmem_cell_entry_write(&cell, buf, cell.bytes); + } + EXPORT_SYMBOL_GPL(nvmem_device_cell_write); + diff --git a/target/linux/generic/backport-5.15/802-v5.16-0002-nvmem-core-add-nvmem-cell-post-processing-callback.patch b/target/linux/generic/backport-5.15/802-v5.16-0002-nvmem-core-add-nvmem-cell-post-processing-callback.patch new file mode 100644 index 0000000000..df264add24 --- /dev/null +++ b/target/linux/generic/backport-5.15/802-v5.16-0002-nvmem-core-add-nvmem-cell-post-processing-callback.patch @@ -0,0 +1,82 @@ +From 5008062f1c3f5af3acf86164aa6fcc77b0c7bdce Mon Sep 17 00:00:00 2001 +From: Srinivas Kandagatla +Date: Wed, 13 Oct 2021 14:19:56 +0100 +Subject: [PATCH] nvmem: core: add nvmem cell post processing callback + +Some NVMEM providers have certain nvmem cells encoded, which requires +post processing before actually using it. + +For example mac-address is stored in either in ascii or delimited or reverse-order. + +Having a post-process callback hook to provider drivers would enable them to +do this vendor specific post processing before nvmem consumers see it. + +Tested-by: Joakim Zhang +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20211013131957.30271-3-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 9 +++++++++ + include/linux/nvmem-provider.h | 5 +++++ + 2 files changed, 14 insertions(+) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -38,6 +38,7 @@ struct nvmem_device { + unsigned int nkeepout; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; ++ nvmem_cell_post_process_t cell_post_process; + struct gpio_desc *wp_gpio; + void *priv; + }; +@@ -799,6 +800,7 @@ struct nvmem_device *nvmem_register(cons + nvmem->type = config->type; + nvmem->reg_read = config->reg_read; + nvmem->reg_write = config->reg_write; ++ nvmem->cell_post_process = config->cell_post_process; + nvmem->keepout = config->keepout; + nvmem->nkeepout = config->nkeepout; + if (config->of_node) +@@ -1441,6 +1443,13 @@ static int __nvmem_cell_read(struct nvme + if (cell->bit_offset || cell->nbits) + nvmem_shift_read_buffer_in_place(cell, buf); + ++ if (nvmem->cell_post_process) { ++ rc = nvmem->cell_post_process(nvmem->priv, id, ++ cell->offset, buf, cell->bytes); ++ if (rc) ++ return rc; ++ } ++ + if (len) + *len = cell->bytes; + +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -19,6 +19,9 @@ typedef int (*nvmem_reg_read_t)(void *pr + void *val, size_t bytes); + typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset, + void *val, size_t bytes); ++/* used for vendor specific post processing of cell data */ ++typedef int (*nvmem_cell_post_process_t)(void *priv, const char *id, unsigned int offset, ++ void *buf, size_t bytes); + + enum nvmem_type { + NVMEM_TYPE_UNKNOWN = 0, +@@ -62,6 +65,7 @@ struct nvmem_keepout { + * @no_of_node: Device should not use the parent's of_node even if it's !NULL. + * @reg_read: Callback to read data. + * @reg_write: Callback to write data. ++ * @cell_post_process: Callback for vendor specific post processing of cell data + * @size: Device size. + * @word_size: Minimum read/write access granularity. + * @stride: Minimum read/write access stride. +@@ -92,6 +96,7 @@ struct nvmem_config { + bool no_of_node; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; ++ nvmem_cell_post_process_t cell_post_process; + int size; + int word_size; + int stride; diff --git a/target/linux/generic/backport-5.15/802-v5.16-0003-nvmem-imx-ocotp-add-support-for-post-processing.patch b/target/linux/generic/backport-5.15/802-v5.16-0003-nvmem-imx-ocotp-add-support-for-post-processing.patch new file mode 100644 index 0000000000..ee19228270 --- /dev/null +++ b/target/linux/generic/backport-5.15/802-v5.16-0003-nvmem-imx-ocotp-add-support-for-post-processing.patch @@ -0,0 +1,92 @@ +From d0221a780cbc99fec6c27a98dba2828dc5735c00 Mon Sep 17 00:00:00 2001 +From: Srinivas Kandagatla +Date: Wed, 13 Oct 2021 14:19:57 +0100 +Subject: [PATCH] nvmem: imx-ocotp: add support for post processing + +Add .cell_post_process callback for imx-ocotp to deal with MAC address, +since MAC address need to be reversed byte for some i.MX SoCs. + +Tested-by: Joakim Zhang +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20211013131957.30271-4-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/imx-ocotp.c | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +--- a/drivers/nvmem/imx-ocotp.c ++++ b/drivers/nvmem/imx-ocotp.c +@@ -97,6 +97,7 @@ struct ocotp_params { + unsigned int bank_address_words; + void (*set_timing)(struct ocotp_priv *priv); + struct ocotp_ctrl_reg ctrl; ++ bool reverse_mac_address; + }; + + static int imx_ocotp_wait_for_busy(struct ocotp_priv *priv, u32 flags) +@@ -221,6 +222,25 @@ read_end: + return ret; + } + ++static int imx_ocotp_cell_pp(void *context, const char *id, unsigned int offset, ++ void *data, size_t bytes) ++{ ++ struct ocotp_priv *priv = context; ++ ++ /* Deal with some post processing of nvmem cell data */ ++ if (id && !strcmp(id, "mac-address")) { ++ if (priv->params->reverse_mac_address) { ++ u8 *buf = data; ++ int i; ++ ++ for (i = 0; i < bytes/2; i++) ++ swap(buf[i], buf[bytes - i - 1]); ++ } ++ } ++ ++ return 0; ++} ++ + static void imx_ocotp_set_imx6_timing(struct ocotp_priv *priv) + { + unsigned long clk_rate; +@@ -468,6 +488,7 @@ static struct nvmem_config imx_ocotp_nvm + .stride = 1, + .reg_read = imx_ocotp_read, + .reg_write = imx_ocotp_write, ++ .cell_post_process = imx_ocotp_cell_pp, + }; + + static const struct ocotp_params imx6q_params = { +@@ -530,6 +551,7 @@ static const struct ocotp_params imx8mq_ + .bank_address_words = 0, + .set_timing = imx_ocotp_set_imx6_timing, + .ctrl = IMX_OCOTP_BM_CTRL_DEFAULT, ++ .reverse_mac_address = true, + }; + + static const struct ocotp_params imx8mm_params = { +@@ -537,6 +559,7 @@ static const struct ocotp_params imx8mm_ + .bank_address_words = 0, + .set_timing = imx_ocotp_set_imx6_timing, + .ctrl = IMX_OCOTP_BM_CTRL_DEFAULT, ++ .reverse_mac_address = true, + }; + + static const struct ocotp_params imx8mn_params = { +@@ -544,6 +567,7 @@ static const struct ocotp_params imx8mn_ + .bank_address_words = 0, + .set_timing = imx_ocotp_set_imx6_timing, + .ctrl = IMX_OCOTP_BM_CTRL_DEFAULT, ++ .reverse_mac_address = true, + }; + + static const struct ocotp_params imx8mp_params = { +@@ -551,6 +575,7 @@ static const struct ocotp_params imx8mp_ + .bank_address_words = 0, + .set_timing = imx_ocotp_set_imx6_timing, + .ctrl = IMX_OCOTP_BM_CTRL_8MP, ++ .reverse_mac_address = true, + }; + + static const struct of_device_id imx_ocotp_dt_ids[] = { diff --git a/target/linux/generic/backport-5.15/803-v5.17-0002-nvmem-mtk-efuse-support-minimum-one-byte-access-stri.patch b/target/linux/generic/backport-5.15/803-v5.17-0002-nvmem-mtk-efuse-support-minimum-one-byte-access-stri.patch new file mode 100644 index 0000000000..785bfe53f5 --- /dev/null +++ b/target/linux/generic/backport-5.15/803-v5.17-0002-nvmem-mtk-efuse-support-minimum-one-byte-access-stri.patch @@ -0,0 +1,47 @@ +From 98e2c4efae214fb7086cac9117616eb6ea11475d Mon Sep 17 00:00:00 2001 +From: Chunfeng Yun +Date: Thu, 9 Dec 2021 17:42:34 +0000 +Subject: [PATCH] nvmem: mtk-efuse: support minimum one byte access stride and + granularity + +In order to support nvmem bits property, should support minimum 1 byte +read stride and minimum 1 byte read granularity at the same time. + +Signed-off-by: Chunfeng Yun +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20211209174235.14049-4-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/mtk-efuse.c | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +--- a/drivers/nvmem/mtk-efuse.c ++++ b/drivers/nvmem/mtk-efuse.c +@@ -19,11 +19,12 @@ static int mtk_reg_read(void *context, + unsigned int reg, void *_val, size_t bytes) + { + struct mtk_efuse_priv *priv = context; +- u32 *val = _val; +- int i = 0, words = bytes / 4; ++ void __iomem *addr = priv->base + reg; ++ u8 *val = _val; ++ int i; + +- while (words--) +- *val++ = readl(priv->base + reg + (i++ * 4)); ++ for (i = 0; i < bytes; i++, val++) ++ *val = readb(addr + i); + + return 0; + } +@@ -45,8 +46,8 @@ static int mtk_efuse_probe(struct platfo + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + +- econfig.stride = 4; +- econfig.word_size = 4; ++ econfig.stride = 1; ++ econfig.word_size = 1; + econfig.reg_read = mtk_reg_read; + econfig.size = resource_size(res); + econfig.priv = priv; diff --git a/target/linux/generic/backport-5.15/804-v5.18-0001-nvmem-core-Remove-unused-devm_nvmem_unregister.patch b/target/linux/generic/backport-5.15/804-v5.18-0001-nvmem-core-Remove-unused-devm_nvmem_unregister.patch new file mode 100644 index 0000000000..ca5357c8d9 --- /dev/null +++ b/target/linux/generic/backport-5.15/804-v5.18-0001-nvmem-core-Remove-unused-devm_nvmem_unregister.patch @@ -0,0 +1,72 @@ +From 190fae468592bc2f0efc8b928920f8f712b5831e Mon Sep 17 00:00:00 2001 +From: Andy Shevchenko +Date: Sun, 20 Feb 2022 15:15:15 +0000 +Subject: [PATCH] nvmem: core: Remove unused devm_nvmem_unregister() + +There are no users and seems no will come of the devm_nvmem_unregister(). +Remove the function and remove the unused devm_nvmem_match() along with it. + +Signed-off-by: Andy Shevchenko +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220220151527.17216-2-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 22 ---------------------- + include/linux/nvmem-provider.h | 8 -------- + 2 files changed, 30 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -943,28 +943,6 @@ struct nvmem_device *devm_nvmem_register + } + EXPORT_SYMBOL_GPL(devm_nvmem_register); + +-static int devm_nvmem_match(struct device *dev, void *res, void *data) +-{ +- struct nvmem_device **r = res; +- +- return *r == data; +-} +- +-/** +- * devm_nvmem_unregister() - Unregister previously registered managed nvmem +- * device. +- * +- * @dev: Device that uses the nvmem device. +- * @nvmem: Pointer to previously registered nvmem device. +- * +- * Return: Will be negative on error or zero on success. +- */ +-int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem) +-{ +- return devres_release(dev, devm_nvmem_release, devm_nvmem_match, nvmem); +-} +-EXPORT_SYMBOL(devm_nvmem_unregister); +- + static struct nvmem_device *__nvmem_device_get(void *data, + int (*match)(struct device *dev, const void *data)) + { +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -133,8 +133,6 @@ void nvmem_unregister(struct nvmem_devic + struct nvmem_device *devm_nvmem_register(struct device *dev, + const struct nvmem_config *cfg); + +-int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem); +- + void nvmem_add_cell_table(struct nvmem_cell_table *table); + void nvmem_del_cell_table(struct nvmem_cell_table *table); + +@@ -153,12 +151,6 @@ devm_nvmem_register(struct device *dev, + return nvmem_register(c); + } + +-static inline int +-devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem) +-{ +- return -EOPNOTSUPP; +-} +- + static inline void nvmem_add_cell_table(struct nvmem_cell_table *table) {} + static inline void nvmem_del_cell_table(struct nvmem_cell_table *table) {} + diff --git a/target/linux/generic/backport-5.15/804-v5.18-0002-nvmem-core-Use-devm_add_action_or_reset.patch b/target/linux/generic/backport-5.15/804-v5.18-0002-nvmem-core-Use-devm_add_action_or_reset.patch new file mode 100644 index 0000000000..b71a0a365b --- /dev/null +++ b/target/linux/generic/backport-5.15/804-v5.18-0002-nvmem-core-Use-devm_add_action_or_reset.patch @@ -0,0 +1,58 @@ +From 5825b2c6762611e67ccaf3ccf64485365a120f0b Mon Sep 17 00:00:00 2001 +From: Andy Shevchenko +Date: Sun, 20 Feb 2022 15:15:16 +0000 +Subject: [PATCH] nvmem: core: Use devm_add_action_or_reset() + +Slightly simplify the devm_nvmem_register() by using the +devm_add_action_or_reset(). + +Signed-off-by: Andy Shevchenko +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220220151527.17216-3-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 22 +++++++++------------- + 1 file changed, 9 insertions(+), 13 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -905,9 +905,9 @@ void nvmem_unregister(struct nvmem_devic + } + EXPORT_SYMBOL_GPL(nvmem_unregister); + +-static void devm_nvmem_release(struct device *dev, void *res) ++static void devm_nvmem_unregister(void *nvmem) + { +- nvmem_unregister(*(struct nvmem_device **)res); ++ nvmem_unregister(nvmem); + } + + /** +@@ -924,20 +924,16 @@ static void devm_nvmem_release(struct de + struct nvmem_device *devm_nvmem_register(struct device *dev, + const struct nvmem_config *config) + { +- struct nvmem_device **ptr, *nvmem; +- +- ptr = devres_alloc(devm_nvmem_release, sizeof(*ptr), GFP_KERNEL); +- if (!ptr) +- return ERR_PTR(-ENOMEM); ++ struct nvmem_device *nvmem; ++ int ret; + + nvmem = nvmem_register(config); ++ if (IS_ERR(nvmem)) ++ return nvmem; + +- if (!IS_ERR(nvmem)) { +- *ptr = nvmem; +- devres_add(dev, ptr); +- } else { +- devres_free(ptr); +- } ++ ret = devm_add_action_or_reset(dev, devm_nvmem_unregister, nvmem); ++ if (ret) ++ return ERR_PTR(ret); + + return nvmem; + } diff --git a/target/linux/generic/backport-5.15/804-v5.18-0003-nvmem-core-Check-input-parameter-for-NULL-in-nvmem_u.patch b/target/linux/generic/backport-5.15/804-v5.18-0003-nvmem-core-Check-input-parameter-for-NULL-in-nvmem_u.patch new file mode 100644 index 0000000000..4f471f2667 --- /dev/null +++ b/target/linux/generic/backport-5.15/804-v5.18-0003-nvmem-core-Check-input-parameter-for-NULL-in-nvmem_u.patch @@ -0,0 +1,30 @@ +From 8c751e0d9a5264376935a84429a2d468c8877d99 Mon Sep 17 00:00:00 2001 +From: Andy Shevchenko +Date: Sun, 20 Feb 2022 15:15:17 +0000 +Subject: [PATCH] nvmem: core: Check input parameter for NULL in + nvmem_unregister() + +nvmem_unregister() frees resources and standard pattern is to allow +caller to not care if it's NULL or not. This will reduce burden on +the callers to perform this check. + +Signed-off-by: Andy Shevchenko +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220220151527.17216-4-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -901,7 +901,8 @@ static void nvmem_device_release(struct + */ + void nvmem_unregister(struct nvmem_device *nvmem) + { +- kref_put(&nvmem->refcnt, nvmem_device_release); ++ if (nvmem) ++ kref_put(&nvmem->refcnt, nvmem_device_release); + } + EXPORT_SYMBOL_GPL(nvmem_unregister); + diff --git a/target/linux/generic/backport-5.15/804-v5.18-0004-nvmem-qfprom-fix-kerneldoc-warning.patch b/target/linux/generic/backport-5.15/804-v5.18-0004-nvmem-qfprom-fix-kerneldoc-warning.patch new file mode 100644 index 0000000000..c98f8e9d54 --- /dev/null +++ b/target/linux/generic/backport-5.15/804-v5.18-0004-nvmem-qfprom-fix-kerneldoc-warning.patch @@ -0,0 +1,29 @@ +From 05196facc052385960028ac634447ecf6c764ec3 Mon Sep 17 00:00:00 2001 +From: Srinivas Kandagatla +Date: Sun, 20 Feb 2022 15:15:18 +0000 +Subject: [PATCH] nvmem: qfprom: fix kerneldoc warning + +This patch fixes below kernel doc warning, +warning: expecting prototype for qfprom_efuse_reg_write(). +Prototype was for qfprom_reg_write() instead + +No code changes. + +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220220151527.17216-5-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/qfprom.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/qfprom.c ++++ b/drivers/nvmem/qfprom.c +@@ -244,7 +244,7 @@ err_clk_prepared: + } + + /** +- * qfprom_efuse_reg_write() - Write to fuses. ++ * qfprom_reg_write() - Write to fuses. + * @context: Our driver data. + * @reg: The offset to write at. + * @_val: Pointer to data to write. diff --git a/target/linux/generic/backport-5.15/804-v5.18-0005-nvmem-sunxi_sid-Add-support-for-D1-variant.patch b/target/linux/generic/backport-5.15/804-v5.18-0005-nvmem-sunxi_sid-Add-support-for-D1-variant.patch new file mode 100644 index 0000000000..6aad6af080 --- /dev/null +++ b/target/linux/generic/backport-5.15/804-v5.18-0005-nvmem-sunxi_sid-Add-support-for-D1-variant.patch @@ -0,0 +1,38 @@ +From 07ae4fde9efada7878e1383d6ccc7da70315ca23 Mon Sep 17 00:00:00 2001 +From: Samuel Holland +Date: Sun, 20 Feb 2022 15:15:20 +0000 +Subject: [PATCH] nvmem: sunxi_sid: Add support for D1 variant + +D1 has a smaller eFuse block than some other recent SoCs, and it no +longer requires a workaround to read the eFuse data. + +Signed-off-by: Samuel Holland +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220220151527.17216-7-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/sunxi_sid.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/nvmem/sunxi_sid.c ++++ b/drivers/nvmem/sunxi_sid.c +@@ -184,6 +184,11 @@ static const struct sunxi_sid_cfg sun8i_ + .need_register_readout = true, + }; + ++static const struct sunxi_sid_cfg sun20i_d1_cfg = { ++ .value_offset = 0x200, ++ .size = 0x100, ++}; ++ + static const struct sunxi_sid_cfg sun50i_a64_cfg = { + .value_offset = 0x200, + .size = 0x100, +@@ -200,6 +205,7 @@ static const struct of_device_id sunxi_s + { .compatible = "allwinner,sun7i-a20-sid", .data = &sun7i_a20_cfg }, + { .compatible = "allwinner,sun8i-a83t-sid", .data = &sun50i_a64_cfg }, + { .compatible = "allwinner,sun8i-h3-sid", .data = &sun8i_h3_cfg }, ++ { .compatible = "allwinner,sun20i-d1-sid", .data = &sun20i_d1_cfg }, + { .compatible = "allwinner,sun50i-a64-sid", .data = &sun50i_a64_cfg }, + { .compatible = "allwinner,sun50i-h5-sid", .data = &sun50i_a64_cfg }, + { .compatible = "allwinner,sun50i-h6-sid", .data = &sun50i_h6_cfg }, diff --git a/target/linux/generic/backport-5.15/804-v5.18-0006-nvmem-meson-mx-efuse-replace-unnecessary-devm_kstrdu.patch b/target/linux/generic/backport-5.15/804-v5.18-0006-nvmem-meson-mx-efuse-replace-unnecessary-devm_kstrdu.patch new file mode 100644 index 0000000000..a73b42c5de --- /dev/null +++ b/target/linux/generic/backport-5.15/804-v5.18-0006-nvmem-meson-mx-efuse-replace-unnecessary-devm_kstrdu.patch @@ -0,0 +1,28 @@ +From 4dc8d89faed9bb05f116fa1794fc955b14910386 Mon Sep 17 00:00:00 2001 +From: Xiaoke Wang +Date: Sun, 20 Feb 2022 15:15:21 +0000 +Subject: [PATCH] nvmem: meson-mx-efuse: replace unnecessary devm_kstrdup() + +Replace unnecessary devm_kstrdup() so to avoid redundant memory allocation. + +Suggested-by: Martin Blumenstingl +Signed-off-by: Xiaoke Wang +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220220151527.17216-8-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/meson-mx-efuse.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/nvmem/meson-mx-efuse.c ++++ b/drivers/nvmem/meson-mx-efuse.c +@@ -209,8 +209,7 @@ static int meson_mx_efuse_probe(struct p + if (IS_ERR(efuse->base)) + return PTR_ERR(efuse->base); + +- efuse->config.name = devm_kstrdup(&pdev->dev, drvdata->name, +- GFP_KERNEL); ++ efuse->config.name = drvdata->name; + efuse->config.owner = THIS_MODULE; + efuse->config.dev = &pdev->dev; + efuse->config.priv = efuse; diff --git a/target/linux/generic/backport-5.15/804-v5.18-0007-nvmem-add-driver-for-Layerscape-SFP-Security-Fuse-Pr.patch b/target/linux/generic/backport-5.15/804-v5.18-0007-nvmem-add-driver-for-Layerscape-SFP-Security-Fuse-Pr.patch new file mode 100644 index 0000000000..6afb68b3f9 --- /dev/null +++ b/target/linux/generic/backport-5.15/804-v5.18-0007-nvmem-add-driver-for-Layerscape-SFP-Security-Fuse-Pr.patch @@ -0,0 +1,139 @@ +From f78451012b9e159afdba31c3eb69f223a9f42adc Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Sun, 20 Feb 2022 15:15:23 +0000 +Subject: [PATCH] nvmem: add driver for Layerscape SFP (Security Fuse + Processor) + +Add support for the Security Fuse Processor found on Layerscape SoCs. +This driver implements basic read access. + +Signed-off-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220220151527.17216-10-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 12 +++++ + drivers/nvmem/Makefile | 2 + + drivers/nvmem/layerscape-sfp.c | 89 ++++++++++++++++++++++++++++++++++ + 3 files changed, 103 insertions(+) + create mode 100644 drivers/nvmem/layerscape-sfp.c + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -300,4 +300,16 @@ config NVMEM_BRCM_NVRAM + This driver provides support for Broadcom's NVRAM that can be accessed + using I/O mapping. + ++config NVMEM_LAYERSCAPE_SFP ++ tristate "Layerscape SFP (Security Fuse Processor) support" ++ depends on ARCH_LAYERSCAPE || COMPILE_TEST ++ depends on HAS_IOMEM ++ help ++ This driver provides support to read the eFuses on Freescale ++ Layerscape SoC's. For example, the vendor provides a per part ++ unique ID there. ++ ++ This driver can also be built as a module. If so, the module ++ will be called layerscape-sfp. ++ + endif +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -61,3 +61,5 @@ obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem. + nvmem-rmem-y := rmem.o + obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o + nvmem_brcm_nvram-y := brcm_nvram.o ++obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o ++nvmem-layerscape-sfp-y := layerscape-sfp.o +--- /dev/null ++++ b/drivers/nvmem/layerscape-sfp.c +@@ -0,0 +1,89 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * Layerscape SFP driver ++ * ++ * Copyright (c) 2022 Michael Walle ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define LAYERSCAPE_SFP_OTP_OFFSET 0x0200 ++ ++struct layerscape_sfp_priv { ++ void __iomem *base; ++}; ++ ++struct layerscape_sfp_data { ++ int size; ++}; ++ ++static int layerscape_sfp_read(void *context, unsigned int offset, void *val, ++ size_t bytes) ++{ ++ struct layerscape_sfp_priv *priv = context; ++ ++ memcpy_fromio(val, priv->base + LAYERSCAPE_SFP_OTP_OFFSET + offset, ++ bytes); ++ ++ return 0; ++} ++ ++static struct nvmem_config layerscape_sfp_nvmem_config = { ++ .name = "fsl-sfp", ++ .reg_read = layerscape_sfp_read, ++}; ++ ++static int layerscape_sfp_probe(struct platform_device *pdev) ++{ ++ const struct layerscape_sfp_data *data; ++ struct layerscape_sfp_priv *priv; ++ struct nvmem_device *nvmem; ++ ++ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ priv->base = devm_platform_ioremap_resource(pdev, 0); ++ if (IS_ERR(priv->base)) ++ return PTR_ERR(priv->base); ++ ++ data = device_get_match_data(&pdev->dev); ++ ++ layerscape_sfp_nvmem_config.size = data->size; ++ layerscape_sfp_nvmem_config.dev = &pdev->dev; ++ layerscape_sfp_nvmem_config.priv = priv; ++ ++ nvmem = devm_nvmem_register(&pdev->dev, &layerscape_sfp_nvmem_config); ++ ++ return PTR_ERR_OR_ZERO(nvmem); ++} ++ ++static const struct layerscape_sfp_data ls1028a_data = { ++ .size = 0x88, ++}; ++ ++static const struct of_device_id layerscape_sfp_dt_ids[] = { ++ { .compatible = "fsl,ls1028a-sfp", .data = &ls1028a_data }, ++ {}, ++}; ++MODULE_DEVICE_TABLE(of, layerscape_sfp_dt_ids); ++ ++static struct platform_driver layerscape_sfp_driver = { ++ .probe = layerscape_sfp_probe, ++ .driver = { ++ .name = "layerscape_sfp", ++ .of_match_table = layerscape_sfp_dt_ids, ++ }, ++}; ++module_platform_driver(layerscape_sfp_driver); ++ ++MODULE_AUTHOR("Michael Walle "); ++MODULE_DESCRIPTION("Layerscape Security Fuse Processor driver"); ++MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/backport-5.15/804-v5.18-0008-nvmem-qfprom-Increase-fuse-blow-timeout-to-prevent-w.patch b/target/linux/generic/backport-5.15/804-v5.18-0008-nvmem-qfprom-Increase-fuse-blow-timeout-to-prevent-w.patch new file mode 100644 index 0000000000..74bd4a7eb6 --- /dev/null +++ b/target/linux/generic/backport-5.15/804-v5.18-0008-nvmem-qfprom-Increase-fuse-blow-timeout-to-prevent-w.patch @@ -0,0 +1,32 @@ +From bc5c75e0a5a9400f81a987cc720100ac475fa4d8 Mon Sep 17 00:00:00 2001 +From: Knox Chiou +Date: Wed, 23 Feb 2022 22:35:00 +0000 +Subject: [PATCH] nvmem: qfprom: Increase fuse blow timeout to prevent write + fail + +sc7180 blow fuses got slightly chances to hit qfprom_reg_write timeout. +Current timeout is simply too low. Since blowing fuses is a +very rare operation, so the risk associated with overestimating this +number is low. +Increase fuse blow timeout from 1ms to 10ms. + +Reviewed-by: Douglas Anderson +Signed-off-by: Knox Chiou +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220223223502.29454-2-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/qfprom.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/qfprom.c ++++ b/drivers/nvmem/qfprom.c +@@ -22,7 +22,7 @@ + + /* Amount of time required to hold charge to blow fuse in micro-seconds */ + #define QFPROM_FUSE_BLOW_POLL_US 100 +-#define QFPROM_FUSE_BLOW_TIMEOUT_US 1000 ++#define QFPROM_FUSE_BLOW_TIMEOUT_US 10000 + + #define QFPROM_BLOW_STATUS_OFFSET 0x048 + #define QFPROM_BLOW_STATUS_BUSY 0x1 diff --git a/target/linux/generic/backport-5.15/804-v5.18-0009-nvmem-Add-driver-for-OCOTP-in-Sunplus-SP7021.patch b/target/linux/generic/backport-5.15/804-v5.18-0009-nvmem-Add-driver-for-OCOTP-in-Sunplus-SP7021.patch new file mode 100644 index 0000000000..79fd479054 --- /dev/null +++ b/target/linux/generic/backport-5.15/804-v5.18-0009-nvmem-Add-driver-for-OCOTP-in-Sunplus-SP7021.patch @@ -0,0 +1,291 @@ +From 8747ec2e9762ed9ae53b3a590938f454b6a1abdf Mon Sep 17 00:00:00 2001 +From: Vincent Shih +Date: Wed, 23 Feb 2022 22:35:01 +0000 +Subject: [PATCH] nvmem: Add driver for OCOTP in Sunplus SP7021 + +Add driver for OCOTP in Sunplus SP7021 + +Signed-off-by: Vincent Shih +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220223223502.29454-3-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + MAINTAINERS | 5 + + drivers/nvmem/Kconfig | 12 ++ + drivers/nvmem/Makefile | 2 + + drivers/nvmem/sunplus-ocotp.c | 228 ++++++++++++++++++++++++++++++++++ + 4 files changed, 247 insertions(+) + create mode 100644 drivers/nvmem/sunplus-ocotp.c + +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -17959,6 +17959,11 @@ L: netdev@vger.kernel.org + S: Maintained + F: drivers/net/ethernet/dlink/sundance.c + ++SUNPLUS OCOTP DRIVER ++M: Vincent Shih ++S: Maintained ++F: drivers/nvmem/sunplus-ocotp.c ++ + SUPERH + M: Yoshinori Sato + M: Rich Felker +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -312,4 +312,16 @@ config NVMEM_LAYERSCAPE_SFP + This driver can also be built as a module. If so, the module + will be called layerscape-sfp. + ++config NVMEM_SUNPLUS_OCOTP ++ tristate "Sunplus SoC OTP support" ++ depends on SOC_SP7021 || COMPILE_TEST ++ depends on HAS_IOMEM ++ help ++ This is a driver for the On-chip OTP controller (OCOTP) available ++ on Sunplus SoCs. It provides access to 128 bytes of one-time ++ programmable eFuse. ++ ++ This driver can also be built as a module. If so, the module ++ will be called nvmem-sunplus-ocotp. ++ + endif +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -63,3 +63,5 @@ obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_ + nvmem_brcm_nvram-y := brcm_nvram.o + obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o + nvmem-layerscape-sfp-y := layerscape-sfp.o ++obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o ++nvmem_sunplus_ocotp-y := sunplus-ocotp.o +--- /dev/null ++++ b/drivers/nvmem/sunplus-ocotp.c +@@ -0,0 +1,228 @@ ++// SPDX-License-Identifier: GPL-2.0 ++ ++/* ++ * The OCOTP driver for Sunplus SP7021 ++ * ++ * Copyright (C) 2019 Sunplus Technology Inc., All rights reserved. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* ++ * OTP memory ++ * Each bank contains 4 words (32 bits). ++ * Bank 0 starts at offset 0 from the base. ++ */ ++ ++#define OTP_WORDS_PER_BANK 4 ++#define OTP_WORD_SIZE sizeof(u32) ++#define OTP_BIT_ADDR_OF_BANK (8 * OTP_WORD_SIZE * OTP_WORDS_PER_BANK) ++#define QAC628_OTP_NUM_BANKS 8 ++#define QAC628_OTP_SIZE (QAC628_OTP_NUM_BANKS * OTP_WORDS_PER_BANK * OTP_WORD_SIZE) ++#define OTP_READ_TIMEOUT_US 200000 ++ ++/* HB_GPIO */ ++#define ADDRESS_8_DATA 0x20 ++ ++/* OTP_RX */ ++#define OTP_CONTROL_2 0x48 ++#define OTP_RD_PERIOD GENMASK(15, 8) ++#define OTP_RD_PERIOD_MASK ~GENMASK(15, 8) ++#define CPU_CLOCK FIELD_PREP(OTP_RD_PERIOD, 30) ++#define SEL_BAK_KEY2 BIT(5) ++#define SEL_BAK_KEY2_MASK ~BIT(5) ++#define SW_TRIM_EN BIT(4) ++#define SW_TRIM_EN_MASK ~BIT(4) ++#define SEL_BAK_KEY BIT(3) ++#define SEL_BAK_KEY_MASK ~BIT(3) ++#define OTP_READ BIT(2) ++#define OTP_LOAD_SECURE_DATA BIT(1) ++#define OTP_LOAD_SECURE_DATA_MASK ~BIT(1) ++#define OTP_DO_CRC BIT(0) ++#define OTP_DO_CRC_MASK ~BIT(0) ++#define OTP_STATUS 0x4c ++#define OTP_READ_DONE BIT(4) ++#define OTP_READ_DONE_MASK ~BIT(4) ++#define OTP_LOAD_SECURE_DONE_MASK ~BIT(2) ++#define OTP_READ_ADDRESS 0x50 ++ ++enum base_type { ++ HB_GPIO, ++ OTPRX, ++ BASEMAX, ++}; ++ ++struct sp_ocotp_priv { ++ struct device *dev; ++ void __iomem *base[BASEMAX]; ++ struct clk *clk; ++}; ++ ++struct sp_ocotp_data { ++ int size; ++}; ++ ++const struct sp_ocotp_data sp_otp_v0 = { ++ .size = QAC628_OTP_SIZE, ++}; ++ ++static int sp_otp_read_real(struct sp_ocotp_priv *otp, int addr, char *value) ++{ ++ unsigned int addr_data; ++ unsigned int byte_shift; ++ unsigned int status; ++ int ret; ++ ++ addr_data = addr % (OTP_WORD_SIZE * OTP_WORDS_PER_BANK); ++ addr_data = addr_data / OTP_WORD_SIZE; ++ ++ byte_shift = addr % (OTP_WORD_SIZE * OTP_WORDS_PER_BANK); ++ byte_shift = byte_shift % OTP_WORD_SIZE; ++ ++ addr = addr / (OTP_WORD_SIZE * OTP_WORDS_PER_BANK); ++ addr = addr * OTP_BIT_ADDR_OF_BANK; ++ ++ writel(readl(otp->base[OTPRX] + OTP_STATUS) & OTP_READ_DONE_MASK & ++ OTP_LOAD_SECURE_DONE_MASK, otp->base[OTPRX] + OTP_STATUS); ++ writel(addr, otp->base[OTPRX] + OTP_READ_ADDRESS); ++ writel(readl(otp->base[OTPRX] + OTP_CONTROL_2) | OTP_READ, ++ otp->base[OTPRX] + OTP_CONTROL_2); ++ writel(readl(otp->base[OTPRX] + OTP_CONTROL_2) & SEL_BAK_KEY2_MASK & SW_TRIM_EN_MASK ++ & SEL_BAK_KEY_MASK & OTP_LOAD_SECURE_DATA_MASK & OTP_DO_CRC_MASK, ++ otp->base[OTPRX] + OTP_CONTROL_2); ++ writel((readl(otp->base[OTPRX] + OTP_CONTROL_2) & OTP_RD_PERIOD_MASK) | CPU_CLOCK, ++ otp->base[OTPRX] + OTP_CONTROL_2); ++ ++ ret = readl_poll_timeout(otp->base[OTPRX] + OTP_STATUS, status, ++ status & OTP_READ_DONE, 10, OTP_READ_TIMEOUT_US); ++ ++ if (ret < 0) ++ return ret; ++ ++ *value = (readl(otp->base[HB_GPIO] + ADDRESS_8_DATA + addr_data * OTP_WORD_SIZE) ++ >> (8 * byte_shift)) & 0xff; ++ ++ return ret; ++} ++ ++static int sp_ocotp_read(void *priv, unsigned int offset, void *value, size_t bytes) ++{ ++ struct sp_ocotp_priv *otp = priv; ++ unsigned int addr; ++ char *buf = value; ++ char val[4]; ++ int ret; ++ ++ ret = clk_enable(otp->clk); ++ if (ret) ++ return ret; ++ ++ *buf = 0; ++ for (addr = offset; addr < (offset + bytes); addr++) { ++ ret = sp_otp_read_real(otp, addr, val); ++ if (ret < 0) { ++ dev_err(otp->dev, "OTP read fail:%d at %d", ret, addr); ++ goto disable_clk; ++ } ++ ++ *buf++ = *val; ++ } ++ ++disable_clk: ++ clk_disable(otp->clk); ++ ++ return ret; ++} ++ ++static struct nvmem_config sp_ocotp_nvmem_config = { ++ .name = "sp-ocotp", ++ .read_only = true, ++ .word_size = 1, ++ .size = QAC628_OTP_SIZE, ++ .stride = 1, ++ .reg_read = sp_ocotp_read, ++ .owner = THIS_MODULE, ++}; ++ ++static int sp_ocotp_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct nvmem_device *nvmem; ++ struct sp_ocotp_priv *otp; ++ struct resource *res; ++ int ret; ++ ++ otp = devm_kzalloc(dev, sizeof(*otp), GFP_KERNEL); ++ if (!otp) ++ return -ENOMEM; ++ ++ otp->dev = dev; ++ ++ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hb_gpio"); ++ otp->base[HB_GPIO] = devm_ioremap_resource(dev, res); ++ if (IS_ERR(otp->base[HB_GPIO])) ++ return PTR_ERR(otp->base[HB_GPIO]); ++ ++ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "otprx"); ++ otp->base[OTPRX] = devm_ioremap_resource(dev, res); ++ if (IS_ERR(otp->base[OTPRX])) ++ return PTR_ERR(otp->base[OTPRX]); ++ ++ otp->clk = devm_clk_get(&pdev->dev, NULL); ++ if (IS_ERR(otp->clk)) ++ return dev_err_probe(&pdev->dev, PTR_ERR(otp->clk), ++ "devm_clk_get fail\n"); ++ ++ ret = clk_prepare(otp->clk); ++ if (ret < 0) { ++ dev_err(dev, "failed to prepare clk: %d\n", ret); ++ return ret; ++ } ++ ++ sp_ocotp_nvmem_config.priv = otp; ++ sp_ocotp_nvmem_config.dev = dev; ++ ++ nvmem = devm_nvmem_register(dev, &sp_ocotp_nvmem_config); ++ if (IS_ERR(nvmem)) ++ return dev_err_probe(&pdev->dev, PTR_ERR(nvmem), ++ "register nvmem device fail\n"); ++ ++ platform_set_drvdata(pdev, nvmem); ++ ++ dev_dbg(dev, "banks:%d x wpb:%d x wsize:%d = %d", ++ (int)QAC628_OTP_NUM_BANKS, (int)OTP_WORDS_PER_BANK, ++ (int)OTP_WORD_SIZE, (int)QAC628_OTP_SIZE); ++ ++ dev_info(dev, "by Sunplus (C) 2020"); ++ ++ return 0; ++} ++ ++static const struct of_device_id sp_ocotp_dt_ids[] = { ++ { .compatible = "sunplus,sp7021-ocotp", .data = &sp_otp_v0 }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, sp_ocotp_dt_ids); ++ ++static struct platform_driver sp_otp_driver = { ++ .probe = sp_ocotp_probe, ++ .driver = { ++ .name = "sunplus,sp7021-ocotp", ++ .of_match_table = sp_ocotp_dt_ids, ++ } ++}; ++module_platform_driver(sp_otp_driver); ++ ++MODULE_AUTHOR("Vincent Shih "); ++MODULE_DESCRIPTION("Sunplus On-Chip OTP driver"); ++MODULE_LICENSE("GPL"); ++ diff --git a/target/linux/generic/backport-5.15/804-v5.18-0010-nvmem-brcm_nvram-parse-NVRAM-content-into-NVMEM-cell.patch b/target/linux/generic/backport-5.15/804-v5.18-0010-nvmem-brcm_nvram-parse-NVRAM-content-into-NVMEM-cell.patch new file mode 100644 index 0000000000..99781b3a7b --- /dev/null +++ b/target/linux/generic/backport-5.15/804-v5.18-0010-nvmem-brcm_nvram-parse-NVRAM-content-into-NVMEM-cell.patch @@ -0,0 +1,146 @@ +From 6e977eaa8280e957b87904b536661550f2a6b3e8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Fri, 25 Feb 2022 17:58:20 +0000 +Subject: [PATCH] nvmem: brcm_nvram: parse NVRAM content into NVMEM cells +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +NVRAM consist of header and NUL separated key-value pairs. Parse it and +create NVMEM cell for every key-value entry. + +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220225175822.8293-3-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/brcm_nvram.c | 90 ++++++++++++++++++++++++++++++++++++++ + 1 file changed, 90 insertions(+) + +--- a/drivers/nvmem/brcm_nvram.c ++++ b/drivers/nvmem/brcm_nvram.c +@@ -6,12 +6,26 @@ + #include + #include + #include ++#include + #include + #include ++#include ++ ++#define NVRAM_MAGIC "FLSH" + + struct brcm_nvram { + struct device *dev; + void __iomem *base; ++ struct nvmem_cell_info *cells; ++ int ncells; ++}; ++ ++struct brcm_nvram_header { ++ char magic[4]; ++ __le32 len; ++ __le32 crc_ver_init; /* 0:7 crc, 8:15 ver, 16:31 sdram_init */ ++ __le32 config_refresh; /* 0:15 sdram_config, 16:31 sdram_refresh */ ++ __le32 config_ncdl; /* ncdl values for memc */ + }; + + static int brcm_nvram_read(void *context, unsigned int offset, void *val, +@@ -26,6 +40,75 @@ static int brcm_nvram_read(void *context + return 0; + } + ++static int brcm_nvram_add_cells(struct brcm_nvram *priv, uint8_t *data, ++ size_t len) ++{ ++ struct device *dev = priv->dev; ++ char *var, *value, *eq; ++ int idx; ++ ++ priv->ncells = 0; ++ for (var = data + sizeof(struct brcm_nvram_header); ++ var < (char *)data + len && *var; ++ var += strlen(var) + 1) { ++ priv->ncells++; ++ } ++ ++ priv->cells = devm_kcalloc(dev, priv->ncells, sizeof(*priv->cells), GFP_KERNEL); ++ if (!priv->cells) ++ return -ENOMEM; ++ ++ for (var = data + sizeof(struct brcm_nvram_header), idx = 0; ++ var < (char *)data + len && *var; ++ var = value + strlen(value) + 1, idx++) { ++ eq = strchr(var, '='); ++ if (!eq) ++ break; ++ *eq = '\0'; ++ value = eq + 1; ++ ++ priv->cells[idx].name = devm_kstrdup(dev, var, GFP_KERNEL); ++ if (!priv->cells[idx].name) ++ return -ENOMEM; ++ priv->cells[idx].offset = value - (char *)data; ++ priv->cells[idx].bytes = strlen(value); ++ } ++ ++ return 0; ++} ++ ++static int brcm_nvram_parse(struct brcm_nvram *priv) ++{ ++ struct device *dev = priv->dev; ++ struct brcm_nvram_header header; ++ uint8_t *data; ++ size_t len; ++ int err; ++ ++ memcpy_fromio(&header, priv->base, sizeof(header)); ++ ++ if (memcmp(header.magic, NVRAM_MAGIC, 4)) { ++ dev_err(dev, "Invalid NVRAM magic\n"); ++ return -EINVAL; ++ } ++ ++ len = le32_to_cpu(header.len); ++ ++ data = kcalloc(1, len, GFP_KERNEL); ++ memcpy_fromio(data, priv->base, len); ++ data[len - 1] = '\0'; ++ ++ err = brcm_nvram_add_cells(priv, data, len); ++ if (err) { ++ dev_err(dev, "Failed to add cells: %d\n", err); ++ return err; ++ } ++ ++ kfree(data); ++ ++ return 0; ++} ++ + static int brcm_nvram_probe(struct platform_device *pdev) + { + struct nvmem_config config = { +@@ -35,6 +118,7 @@ static int brcm_nvram_probe(struct platf + struct device *dev = &pdev->dev; + struct resource *res; + struct brcm_nvram *priv; ++ int err; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) +@@ -46,7 +130,13 @@ static int brcm_nvram_probe(struct platf + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + ++ err = brcm_nvram_parse(priv); ++ if (err) ++ return err; ++ + config.dev = dev; ++ config.cells = priv->cells; ++ config.ncells = priv->ncells; + config.priv = priv; + config.size = resource_size(res); + diff --git a/target/linux/generic/backport-5.15/805-v5.19-0001-nvmem-bcm-ocotp-mark-ACPI-device-ID-table-as-maybe-u.patch b/target/linux/generic/backport-5.15/805-v5.19-0001-nvmem-bcm-ocotp-mark-ACPI-device-ID-table-as-maybe-u.patch new file mode 100644 index 0000000000..ef3107db94 --- /dev/null +++ b/target/linux/generic/backport-5.15/805-v5.19-0001-nvmem-bcm-ocotp-mark-ACPI-device-ID-table-as-maybe-u.patch @@ -0,0 +1,32 @@ +From 6bd0ffeaa389866089e9573b2298ae58d6359b75 Mon Sep 17 00:00:00 2001 +From: Krzysztof Kozlowski +Date: Mon, 21 Mar 2022 12:03:24 +0100 +Subject: [PATCH] nvmem: bcm-ocotp: mark ACPI device ID table as maybe unused +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +"bcm_otpc_acpi_ids" is used with ACPI_PTR, so a build with !CONFIG_ACPI +has a warning: + + drivers/nvmem/bcm-ocotp.c:247:36: error: + ‘bcm_otpc_acpi_ids’ defined but not used [-Werror=unused-const-variable=] + +Signed-off-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20220321110326.44652-1-krzk@kernel.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/bcm-ocotp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/bcm-ocotp.c ++++ b/drivers/nvmem/bcm-ocotp.c +@@ -244,7 +244,7 @@ static const struct of_device_id bcm_otp + }; + MODULE_DEVICE_TABLE(of, bcm_otpc_dt_ids); + +-static const struct acpi_device_id bcm_otpc_acpi_ids[] = { ++static const struct acpi_device_id bcm_otpc_acpi_ids[] __maybe_unused = { + { .id = "BRCM0700", .driver_data = (kernel_ulong_t)&otp_map }, + { .id = "BRCM0701", .driver_data = (kernel_ulong_t)&otp_map_v2 }, + { /* sentinel */ } diff --git a/target/linux/generic/backport-5.15/805-v5.19-0002-nvmem-sunplus-ocotp-staticize-sp_otp_v0.patch b/target/linux/generic/backport-5.15/805-v5.19-0002-nvmem-sunplus-ocotp-staticize-sp_otp_v0.patch new file mode 100644 index 0000000000..a84d2316f0 --- /dev/null +++ b/target/linux/generic/backport-5.15/805-v5.19-0002-nvmem-sunplus-ocotp-staticize-sp_otp_v0.patch @@ -0,0 +1,30 @@ +From 1066f8156351fcd997125257cea47cf805ba4f6d Mon Sep 17 00:00:00 2001 +From: Krzysztof Kozlowski +Date: Mon, 21 Mar 2022 12:03:25 +0100 +Subject: [PATCH] nvmem: sunplus-ocotp: staticize sp_otp_v0 + +The "sp_otp_v0" file scope variable is not used outside, so make it +static to fix warning: + + drivers/nvmem/sunplus-ocotp.c:74:29: sparse: + sparse: symbol 'sp_otp_v0' was not declared. Should it be static? + +Reported-by: kernel test robot +Signed-off-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20220321110326.44652-2-krzk@kernel.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/sunplus-ocotp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/sunplus-ocotp.c ++++ b/drivers/nvmem/sunplus-ocotp.c +@@ -71,7 +71,7 @@ struct sp_ocotp_data { + int size; + }; + +-const struct sp_ocotp_data sp_otp_v0 = { ++static const struct sp_ocotp_data sp_otp_v0 = { + .size = QAC628_OTP_SIZE, + }; + diff --git a/target/linux/generic/backport-5.15/805-v5.19-0003-nvmem-sunplus-ocotp-drop-useless-probe-confirmation.patch b/target/linux/generic/backport-5.15/805-v5.19-0003-nvmem-sunplus-ocotp-drop-useless-probe-confirmation.patch new file mode 100644 index 0000000000..886ebc12a9 --- /dev/null +++ b/target/linux/generic/backport-5.15/805-v5.19-0003-nvmem-sunplus-ocotp-drop-useless-probe-confirmation.patch @@ -0,0 +1,27 @@ +From 874dfbcf219ccc42a2cbd187d087c7db82c3024b Mon Sep 17 00:00:00 2001 +From: Krzysztof Kozlowski +Date: Mon, 21 Mar 2022 12:03:26 +0100 +Subject: [PATCH] nvmem: sunplus-ocotp: drop useless probe confirmation + +Printing probe success is discouraged, because we can use tracing for +this purpose. Remove useless print message after Sunplus OCOTP driver +probe. + +Signed-off-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20220321110326.44652-3-krzk@kernel.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/sunplus-ocotp.c | 2 -- + 1 file changed, 2 deletions(-) + +--- a/drivers/nvmem/sunplus-ocotp.c ++++ b/drivers/nvmem/sunplus-ocotp.c +@@ -202,8 +202,6 @@ static int sp_ocotp_probe(struct platfor + (int)QAC628_OTP_NUM_BANKS, (int)OTP_WORDS_PER_BANK, + (int)OTP_WORD_SIZE, (int)QAC628_OTP_SIZE); + +- dev_info(dev, "by Sunplus (C) 2020"); +- + return 0; + } + diff --git a/target/linux/generic/backport-5.15/805-v5.19-0004-nvmem-core-support-passing-DT-node-in-cell-info.patch b/target/linux/generic/backport-5.15/805-v5.19-0004-nvmem-core-support-passing-DT-node-in-cell-info.patch new file mode 100644 index 0000000000..3b1e76147a --- /dev/null +++ b/target/linux/generic/backport-5.15/805-v5.19-0004-nvmem-core-support-passing-DT-node-in-cell-info.patch @@ -0,0 +1,41 @@ +From dbc2f62061c6bfba0aee93161ee3194dcee84bd0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Fri, 29 Apr 2022 17:26:46 +0100 +Subject: [PATCH] nvmem: core: support passing DT node in cell info +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Some hardware may have NVMEM cells described in Device Tree using +individual nodes. Let drivers pass such nodes to the NVMEM subsystem so +they can be later used by NVMEM consumers. + +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220429162701.2222-2-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 1 + + include/linux/nvmem-consumer.h | 1 + + 2 files changed, 2 insertions(+) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -467,6 +467,7 @@ static int nvmem_cell_info_to_nvmem_cell + + cell->bit_offset = info->bit_offset; + cell->nbits = info->nbits; ++ cell->np = info->np; + + if (cell->nbits) + cell->bytes = DIV_ROUND_UP(cell->nbits + cell->bit_offset, +--- a/include/linux/nvmem-consumer.h ++++ b/include/linux/nvmem-consumer.h +@@ -25,6 +25,7 @@ struct nvmem_cell_info { + unsigned int bytes; + unsigned int bit_offset; + unsigned int nbits; ++ struct device_node *np; + }; + + /** diff --git a/target/linux/generic/backport-5.15/805-v5.19-0005-nvmem-brcm_nvram-find-Device-Tree-nodes-for-NVMEM-ce.patch b/target/linux/generic/backport-5.15/805-v5.19-0005-nvmem-brcm_nvram-find-Device-Tree-nodes-for-NVMEM-ce.patch new file mode 100644 index 0000000000..a9eacd9419 --- /dev/null +++ b/target/linux/generic/backport-5.15/805-v5.19-0005-nvmem-brcm_nvram-find-Device-Tree-nodes-for-NVMEM-ce.patch @@ -0,0 +1,38 @@ +From 207775f7e17b8fd0426a2ac4a5b81e4e1d71849e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Fri, 29 Apr 2022 17:26:47 +0100 +Subject: [PATCH] nvmem: brcm_nvram: find Device Tree nodes for NVMEM cells +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +DT binding for Broadcom's NVRAM supports specifying NVMEM cells as NVMEM +device (provider) subnodes. Look for such subnodes when collecing NVMEM +cells. This allows NVMEM consumers to use NVRAM variables. + +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220429162701.2222-3-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/brcm_nvram.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/nvmem/brcm_nvram.c ++++ b/drivers/nvmem/brcm_nvram.c +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -72,6 +73,7 @@ static int brcm_nvram_add_cells(struct b + return -ENOMEM; + priv->cells[idx].offset = value - (char *)data; + priv->cells[idx].bytes = strlen(value); ++ priv->cells[idx].np = of_get_child_by_name(dev->of_node, priv->cells[idx].name); + } + + return 0; diff --git a/target/linux/generic/backport-5.15/805-v5.19-0006-nvmem-Add-Apple-eFuse-driver.patch b/target/linux/generic/backport-5.15/805-v5.19-0006-nvmem-Add-Apple-eFuse-driver.patch new file mode 100644 index 0000000000..ebeb6f5ad3 --- /dev/null +++ b/target/linux/generic/backport-5.15/805-v5.19-0006-nvmem-Add-Apple-eFuse-driver.patch @@ -0,0 +1,130 @@ +From b6b7ef932ae838209254f016ecf8862d716a5ced Mon Sep 17 00:00:00 2001 +From: Sven Peter +Date: Fri, 29 Apr 2022 17:26:50 +0100 +Subject: [PATCH] nvmem: Add Apple eFuse driver + +Apple SoCs contain eFuses used to store factory-programmed data such +as calibration values for the PCIe or the Type-C PHY. They are organized +as 32bit values exposed as MMIO. + +Signed-off-by: Sven Peter +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220429162701.2222-6-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 12 ++++++ + drivers/nvmem/Makefile | 2 + + drivers/nvmem/apple-efuses.c | 80 ++++++++++++++++++++++++++++++++++++ + 3 files changed, 94 insertions(+) + create mode 100644 drivers/nvmem/apple-efuses.c + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -324,4 +324,16 @@ config NVMEM_SUNPLUS_OCOTP + This driver can also be built as a module. If so, the module + will be called nvmem-sunplus-ocotp. + ++config NVMEM_APPLE_EFUSES ++ tristate "Apple eFuse support" ++ depends on ARCH_APPLE || COMPILE_TEST ++ default ARCH_APPLE ++ help ++ Say y here to enable support for reading eFuses on Apple SoCs ++ such as the M1. These are e.g. used to store factory programmed ++ calibration data required for the PCIe or the USB-C PHY. ++ ++ This driver can also be built as a module. If so, the module will ++ be called nvmem-apple-efuses. ++ + endif +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -65,3 +65,5 @@ obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nv + nvmem-layerscape-sfp-y := layerscape-sfp.o + obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o + nvmem_sunplus_ocotp-y := sunplus-ocotp.o ++obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o ++nvmem-apple-efuses-y := apple-efuses.o +--- /dev/null ++++ b/drivers/nvmem/apple-efuses.c +@@ -0,0 +1,80 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * Apple SoC eFuse driver ++ * ++ * Copyright (C) The Asahi Linux Contributors ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++struct apple_efuses_priv { ++ void __iomem *fuses; ++}; ++ ++static int apple_efuses_read(void *context, unsigned int offset, void *val, ++ size_t bytes) ++{ ++ struct apple_efuses_priv *priv = context; ++ u32 *dst = val; ++ ++ while (bytes >= sizeof(u32)) { ++ *dst++ = readl_relaxed(priv->fuses + offset); ++ bytes -= sizeof(u32); ++ offset += sizeof(u32); ++ } ++ ++ return 0; ++} ++ ++static int apple_efuses_probe(struct platform_device *pdev) ++{ ++ struct apple_efuses_priv *priv; ++ struct resource *res; ++ struct nvmem_config config = { ++ .dev = &pdev->dev, ++ .read_only = true, ++ .reg_read = apple_efuses_read, ++ .stride = sizeof(u32), ++ .word_size = sizeof(u32), ++ .name = "apple_efuses_nvmem", ++ .id = NVMEM_DEVID_AUTO, ++ .root_only = true, ++ }; ++ ++ priv = devm_kzalloc(config.dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ priv->fuses = devm_platform_get_and_ioremap_resource(pdev, 0, &res); ++ if (IS_ERR(priv->fuses)) ++ return PTR_ERR(priv->fuses); ++ ++ config.priv = priv; ++ config.size = resource_size(res); ++ ++ return PTR_ERR_OR_ZERO(devm_nvmem_register(config.dev, &config)); ++} ++ ++static const struct of_device_id apple_efuses_of_match[] = { ++ { .compatible = "apple,efuses", }, ++ {} ++}; ++ ++MODULE_DEVICE_TABLE(of, apple_efuses_of_match); ++ ++static struct platform_driver apple_efuses_driver = { ++ .driver = { ++ .name = "apple_efuses", ++ .of_match_table = apple_efuses_of_match, ++ }, ++ .probe = apple_efuses_probe, ++}; ++ ++module_platform_driver(apple_efuses_driver); ++ ++MODULE_AUTHOR("Sven Peter "); ++MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/backport-5.15/805-v5.19-0007-nvmem-qfprom-using-pm_runtime_resume_and_get-instead.patch b/target/linux/generic/backport-5.15/805-v5.19-0007-nvmem-qfprom-using-pm_runtime_resume_and_get-instead.patch new file mode 100644 index 0000000000..cd51d97006 --- /dev/null +++ b/target/linux/generic/backport-5.15/805-v5.19-0007-nvmem-qfprom-using-pm_runtime_resume_and_get-instead.patch @@ -0,0 +1,31 @@ +From 517f6e2641a2802dce5a5aa0d18c7d37a35678d2 Mon Sep 17 00:00:00 2001 +From: Minghao Chi +Date: Fri, 29 Apr 2022 17:26:54 +0100 +Subject: [PATCH] nvmem: qfprom: using pm_runtime_resume_and_get instead of + pm_runtime_get_sync + +Using pm_runtime_resume_and_get is more appropriate +for simplifing code + +Reported-by: Zeal Robot +Signed-off-by: Minghao Chi +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220429162701.2222-10-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/qfprom.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/nvmem/qfprom.c ++++ b/drivers/nvmem/qfprom.c +@@ -217,9 +217,8 @@ static int qfprom_enable_fuse_blowing(co + goto err_clk_rate_set; + } + +- ret = pm_runtime_get_sync(priv->dev); ++ ret = pm_runtime_resume_and_get(priv->dev); + if (ret < 0) { +- pm_runtime_put_noidle(priv->dev); + dev_err(priv->dev, "Failed to enable power-domain\n"); + goto err_reg_enable; + } diff --git a/target/linux/generic/backport-5.15/805-v5.19-0008-nvmem-sfp-Use-regmap.patch b/target/linux/generic/backport-5.15/805-v5.19-0008-nvmem-sfp-Use-regmap.patch new file mode 100644 index 0000000000..e187238ca3 --- /dev/null +++ b/target/linux/generic/backport-5.15/805-v5.19-0008-nvmem-sfp-Use-regmap.patch @@ -0,0 +1,109 @@ +From 943eadbdb11314b41eacbcc484dfb7f93e271ff4 Mon Sep 17 00:00:00 2001 +From: Sean Anderson +Date: Fri, 29 Apr 2022 17:27:00 +0100 +Subject: [PATCH] nvmem: sfp: Use regmap + +This converts the SFP driver to use regmap. This will allow easily +supporting devices with different endians. We disallow byte-level +access, as regmap_bulk_read doesn't support it (and it's unclear what +the correct result would be when we have an endianness difference). + +Signed-off-by: Sean Anderson +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220429162701.2222-16-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 1 + + drivers/nvmem/layerscape-sfp.c | 30 ++++++++++++++++++++++-------- + 2 files changed, 23 insertions(+), 8 deletions(-) + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -304,6 +304,7 @@ config NVMEM_LAYERSCAPE_SFP + tristate "Layerscape SFP (Security Fuse Processor) support" + depends on ARCH_LAYERSCAPE || COMPILE_TEST + depends on HAS_IOMEM ++ select REGMAP_MMIO + help + This driver provides support to read the eFuses on Freescale + Layerscape SoC's. For example, the vendor provides a per part +--- a/drivers/nvmem/layerscape-sfp.c ++++ b/drivers/nvmem/layerscape-sfp.c +@@ -13,15 +13,17 @@ + #include + #include + #include ++#include + + #define LAYERSCAPE_SFP_OTP_OFFSET 0x0200 + + struct layerscape_sfp_priv { +- void __iomem *base; ++ struct regmap *regmap; + }; + + struct layerscape_sfp_data { + int size; ++ enum regmap_endian endian; + }; + + static int layerscape_sfp_read(void *context, unsigned int offset, void *val, +@@ -29,15 +31,16 @@ static int layerscape_sfp_read(void *con + { + struct layerscape_sfp_priv *priv = context; + +- memcpy_fromio(val, priv->base + LAYERSCAPE_SFP_OTP_OFFSET + offset, +- bytes); +- +- return 0; ++ return regmap_bulk_read(priv->regmap, ++ LAYERSCAPE_SFP_OTP_OFFSET + offset, val, ++ bytes / 4); + } + + static struct nvmem_config layerscape_sfp_nvmem_config = { + .name = "fsl-sfp", + .reg_read = layerscape_sfp_read, ++ .word_size = 4, ++ .stride = 4, + }; + + static int layerscape_sfp_probe(struct platform_device *pdev) +@@ -45,16 +48,26 @@ static int layerscape_sfp_probe(struct p + const struct layerscape_sfp_data *data; + struct layerscape_sfp_priv *priv; + struct nvmem_device *nvmem; ++ struct regmap_config config = { 0 }; ++ void __iomem *base; + + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + +- priv->base = devm_platform_ioremap_resource(pdev, 0); +- if (IS_ERR(priv->base)) +- return PTR_ERR(priv->base); ++ base = devm_platform_ioremap_resource(pdev, 0); ++ if (IS_ERR(base)) ++ return PTR_ERR(base); + + data = device_get_match_data(&pdev->dev); ++ config.reg_bits = 32; ++ config.reg_stride = 4; ++ config.val_bits = 32; ++ config.val_format_endian = data->endian; ++ config.max_register = LAYERSCAPE_SFP_OTP_OFFSET + data->size - 4; ++ priv->regmap = devm_regmap_init_mmio(&pdev->dev, base, &config); ++ if (IS_ERR(priv->regmap)) ++ return PTR_ERR(priv->regmap); + + layerscape_sfp_nvmem_config.size = data->size; + layerscape_sfp_nvmem_config.dev = &pdev->dev; +@@ -67,6 +80,7 @@ static int layerscape_sfp_probe(struct p + + static const struct layerscape_sfp_data ls1028a_data = { + .size = 0x88, ++ .endian = REGMAP_ENDIAN_LITTLE, + }; + + static const struct of_device_id layerscape_sfp_dt_ids[] = { diff --git a/target/linux/generic/backport-5.15/805-v5.19-0009-nvmem-sfp-Add-support-for-TA-2.1-devices.patch b/target/linux/generic/backport-5.15/805-v5.19-0009-nvmem-sfp-Add-support-for-TA-2.1-devices.patch new file mode 100644 index 0000000000..ee00098618 --- /dev/null +++ b/target/linux/generic/backport-5.15/805-v5.19-0009-nvmem-sfp-Add-support-for-TA-2.1-devices.patch @@ -0,0 +1,38 @@ +From 33a1c6618677fe33f8e84cb7bedc45abbce89a50 Mon Sep 17 00:00:00 2001 +From: Sean Anderson +Date: Fri, 29 Apr 2022 17:27:01 +0100 +Subject: [PATCH] nvmem: sfp: Add support for TA 2.1 devices + +This adds support for Trust Architecture (TA) 2.1 devices to the SFP driver. +There are few differences between TA 2.1 and TA 3.0, especially for +read-only support, so just re-use the existing data. + +Signed-off-by: Sean Anderson +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220429162701.2222-17-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/layerscape-sfp.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/nvmem/layerscape-sfp.c ++++ b/drivers/nvmem/layerscape-sfp.c +@@ -78,12 +78,18 @@ static int layerscape_sfp_probe(struct p + return PTR_ERR_OR_ZERO(nvmem); + } + ++static const struct layerscape_sfp_data ls1021a_data = { ++ .size = 0x88, ++ .endian = REGMAP_ENDIAN_BIG, ++}; ++ + static const struct layerscape_sfp_data ls1028a_data = { + .size = 0x88, + .endian = REGMAP_ENDIAN_LITTLE, + }; + + static const struct of_device_id layerscape_sfp_dt_ids[] = { ++ { .compatible = "fsl,ls1021a-sfp", .data = &ls1021a_data }, + { .compatible = "fsl,ls1028a-sfp", .data = &ls1028a_data }, + {}, + }; diff --git a/target/linux/generic/backport-5.15/806-v6.0-0001-nvmem-microchip-otpc-add-support.patch b/target/linux/generic/backport-5.15/806-v6.0-0001-nvmem-microchip-otpc-add-support.patch new file mode 100644 index 0000000000..24beeda0d2 --- /dev/null +++ b/target/linux/generic/backport-5.15/806-v6.0-0001-nvmem-microchip-otpc-add-support.patch @@ -0,0 +1,389 @@ +From 98830350d3fc824c1ff5c338140fe20f041a5916 Mon Sep 17 00:00:00 2001 +From: Claudiu Beznea +Date: Wed, 6 Jul 2022 11:06:22 +0100 +Subject: [PATCH] nvmem: microchip-otpc: add support + +Add support for Microchip OTP controller available on SAMA7G5. The OTPC +controls the access to a non-volatile memory. The memory behind OTPC is +organized into packets, packets are composed by a fixed length header +(4 bytes long) and a variable length payload (payload length is available +in the header). When software request the data at an offset in memory +the OTPC will return (via header + data registers) the whole packet that +has a word at that offset. For the OTP memory layout like below: + +offset OTP Memory layout + + . . + . ... . + . . +0x0E +-----------+ <--- packet X + | header X | +0x12 +-----------+ + | payload X | +0x16 | | + | | +0x1A | | + +-----------+ + . . + . ... . + . . + +if user requests data at address 0x16 the data started at 0x0E will be +returned by controller. User will be able to fetch the whole packet +starting at 0x0E (or parts of the packet) via proper registers. The same +packet will be returned if software request the data at offset 0x0E or +0x12 or 0x1A. + +The OTP will be populated by Microchip with at least 2 packets first one +being boot configuration packet and the 2nd one being temperature +calibration packet. The packet order will be preserved b/w different chip +revisions but the packet sizes may change. + +For the above reasons and to keep the same software able to work on all +chip variants the read function of the driver is working with a packet +id instead of an offset in OTP memory. + +Signed-off-by: Claudiu Beznea +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220706100627.6534-3-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + MAINTAINERS | 8 + + drivers/nvmem/Kconfig | 7 + + drivers/nvmem/Makefile | 2 + + drivers/nvmem/microchip-otpc.c | 288 +++++++++++++++++++++++++++++++++ + 4 files changed, 305 insertions(+) + create mode 100644 drivers/nvmem/microchip-otpc.c + +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -12358,6 +12358,14 @@ S: Supported + F: Documentation/devicetree/bindings/mtd/atmel-nand.txt + F: drivers/mtd/nand/raw/atmel/* + ++MICROCHIP OTPC DRIVER ++M: Claudiu Beznea ++L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) ++S: Supported ++F: Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml ++F: drivers/nvmem/microchip-otpc.c ++F: dt-bindings/nvmem/microchip,sama7g5-otpc.h ++ + MICROCHIP PWM DRIVER + M: Claudiu Beznea + L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -107,6 +107,13 @@ config MTK_EFUSE + This driver can also be built as a module. If so, the module + will be called efuse-mtk. + ++config MICROCHIP_OTPC ++ tristate "Microchip OTPC support" ++ depends on ARCH_AT91 || COMPILE_TEST ++ help ++ This driver enable the OTP controller available on Microchip SAMA7G5 ++ SoCs. It controlls the access to the OTP memory connected to it. ++ + config NVMEM_NINTENDO_OTP + tristate "Nintendo Wii and Wii U OTP Support" + depends on WII || COMPILE_TEST +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -67,3 +67,5 @@ obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvm + nvmem_sunplus_ocotp-y := sunplus-ocotp.o + obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o + nvmem-apple-efuses-y := apple-efuses.o ++obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o ++nvmem-microchip-otpc-y := microchip-otpc.o +--- /dev/null ++++ b/drivers/nvmem/microchip-otpc.c +@@ -0,0 +1,288 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * OTP Memory controller ++ * ++ * Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries ++ * ++ * Author: Claudiu Beznea ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define MCHP_OTPC_CR (0x0) ++#define MCHP_OTPC_CR_READ BIT(6) ++#define MCHP_OTPC_MR (0x4) ++#define MCHP_OTPC_MR_ADDR GENMASK(31, 16) ++#define MCHP_OTPC_AR (0x8) ++#define MCHP_OTPC_SR (0xc) ++#define MCHP_OTPC_SR_READ BIT(6) ++#define MCHP_OTPC_HR (0x20) ++#define MCHP_OTPC_HR_SIZE GENMASK(15, 8) ++#define MCHP_OTPC_DR (0x24) ++ ++#define MCHP_OTPC_NAME "mchp-otpc" ++#define MCHP_OTPC_SIZE (11 * 1024) ++ ++/** ++ * struct mchp_otpc - OTPC private data structure ++ * @base: base address ++ * @dev: struct device pointer ++ * @packets: list of packets in OTP memory ++ * @npackets: number of packets in OTP memory ++ */ ++struct mchp_otpc { ++ void __iomem *base; ++ struct device *dev; ++ struct list_head packets; ++ u32 npackets; ++}; ++ ++/** ++ * struct mchp_otpc_packet - OTPC packet data structure ++ * @list: list head ++ * @id: packet ID ++ * @offset: packet offset (in words) in OTP memory ++ */ ++struct mchp_otpc_packet { ++ struct list_head list; ++ u32 id; ++ u32 offset; ++}; ++ ++static struct mchp_otpc_packet *mchp_otpc_id_to_packet(struct mchp_otpc *otpc, ++ u32 id) ++{ ++ struct mchp_otpc_packet *packet; ++ ++ if (id >= otpc->npackets) ++ return NULL; ++ ++ list_for_each_entry(packet, &otpc->packets, list) { ++ if (packet->id == id) ++ return packet; ++ } ++ ++ return NULL; ++} ++ ++static int mchp_otpc_prepare_read(struct mchp_otpc *otpc, ++ unsigned int offset) ++{ ++ u32 tmp; ++ ++ /* Set address. */ ++ tmp = readl_relaxed(otpc->base + MCHP_OTPC_MR); ++ tmp &= ~MCHP_OTPC_MR_ADDR; ++ tmp |= FIELD_PREP(MCHP_OTPC_MR_ADDR, offset); ++ writel_relaxed(tmp, otpc->base + MCHP_OTPC_MR); ++ ++ /* Set read. */ ++ tmp = readl_relaxed(otpc->base + MCHP_OTPC_CR); ++ tmp |= MCHP_OTPC_CR_READ; ++ writel_relaxed(tmp, otpc->base + MCHP_OTPC_CR); ++ ++ /* Wait for packet to be transferred into temporary buffers. */ ++ return read_poll_timeout(readl_relaxed, tmp, !(tmp & MCHP_OTPC_SR_READ), ++ 10000, 2000, false, otpc->base + MCHP_OTPC_SR); ++} ++ ++/* ++ * OTPC memory is organized into packets. Each packets contains a header and ++ * a payload. Header is 4 bytes long and contains the size of the payload. ++ * Payload size varies. The memory footprint is something as follows: ++ * ++ * Memory offset Memory footprint Packet ID ++ * ------------- ---------------- --------- ++ * ++ * 0x0 +------------+ <-- packet 0 ++ * | header 0 | ++ * 0x4 +------------+ ++ * | payload 0 | ++ * . . ++ * . ... . ++ * . . ++ * offset1 +------------+ <-- packet 1 ++ * | header 1 | ++ * offset1 + 0x4 +------------+ ++ * | payload 1 | ++ * . . ++ * . ... . ++ * . . ++ * offset2 +------------+ <-- packet 2 ++ * . . ++ * . ... . ++ * . . ++ * offsetN +------------+ <-- packet N ++ * | header N | ++ * offsetN + 0x4 +------------+ ++ * | payload N | ++ * . . ++ * . ... . ++ * . . ++ * +------------+ ++ * ++ * where offset1, offset2, offsetN depends on the size of payload 0, payload 1, ++ * payload N-1. ++ * ++ * The access to memory is done on a per packet basis: the control registers ++ * need to be updated with an offset address (within a packet range) and the ++ * data registers will be update by controller with information contained by ++ * that packet. E.g. if control registers are updated with any address within ++ * the range [offset1, offset2) the data registers are updated by controller ++ * with packet 1. Header data is accessible though MCHP_OTPC_HR register. ++ * Payload data is accessible though MCHP_OTPC_DR and MCHP_OTPC_AR registers. ++ * There is no direct mapping b/w the offset requested by software and the ++ * offset returned by hardware. ++ * ++ * For this, the read function will return the first requested bytes in the ++ * packet. The user will have to be aware of the memory footprint before doing ++ * the read request. ++ */ ++static int mchp_otpc_read(void *priv, unsigned int off, void *val, ++ size_t bytes) ++{ ++ struct mchp_otpc *otpc = priv; ++ struct mchp_otpc_packet *packet; ++ u32 *buf = val; ++ u32 offset; ++ size_t len = 0; ++ int ret, payload_size; ++ ++ /* ++ * We reach this point with off being multiple of stride = 4 to ++ * be able to cross the subsystem. Inside the driver we use continuous ++ * unsigned integer numbers for packet id, thus devide off by 4 ++ * before passing it to mchp_otpc_id_to_packet(). ++ */ ++ packet = mchp_otpc_id_to_packet(otpc, off / 4); ++ if (!packet) ++ return -EINVAL; ++ offset = packet->offset; ++ ++ while (len < bytes) { ++ ret = mchp_otpc_prepare_read(otpc, offset); ++ if (ret) ++ return ret; ++ ++ /* Read and save header content. */ ++ *buf++ = readl_relaxed(otpc->base + MCHP_OTPC_HR); ++ len += sizeof(*buf); ++ offset++; ++ if (len >= bytes) ++ break; ++ ++ /* Read and save payload content. */ ++ payload_size = FIELD_GET(MCHP_OTPC_HR_SIZE, *(buf - 1)); ++ writel_relaxed(0UL, otpc->base + MCHP_OTPC_AR); ++ do { ++ *buf++ = readl_relaxed(otpc->base + MCHP_OTPC_DR); ++ len += sizeof(*buf); ++ offset++; ++ payload_size--; ++ } while (payload_size >= 0 && len < bytes); ++ } ++ ++ return 0; ++} ++ ++static int mchp_otpc_init_packets_list(struct mchp_otpc *otpc, u32 *size) ++{ ++ struct mchp_otpc_packet *packet; ++ u32 word, word_pos = 0, id = 0, npackets = 0, payload_size; ++ int ret; ++ ++ INIT_LIST_HEAD(&otpc->packets); ++ *size = 0; ++ ++ while (*size < MCHP_OTPC_SIZE) { ++ ret = mchp_otpc_prepare_read(otpc, word_pos); ++ if (ret) ++ return ret; ++ ++ word = readl_relaxed(otpc->base + MCHP_OTPC_HR); ++ payload_size = FIELD_GET(MCHP_OTPC_HR_SIZE, word); ++ if (!payload_size) ++ break; ++ ++ packet = devm_kzalloc(otpc->dev, sizeof(*packet), GFP_KERNEL); ++ if (!packet) ++ return -ENOMEM; ++ ++ packet->id = id++; ++ packet->offset = word_pos; ++ INIT_LIST_HEAD(&packet->list); ++ list_add_tail(&packet->list, &otpc->packets); ++ ++ /* Count size by adding header and paload sizes. */ ++ *size += 4 * (payload_size + 1); ++ /* Next word: this packet (header, payload) position + 1. */ ++ word_pos += payload_size + 2; ++ ++ npackets++; ++ } ++ ++ otpc->npackets = npackets; ++ ++ return 0; ++} ++ ++static struct nvmem_config mchp_nvmem_config = { ++ .name = MCHP_OTPC_NAME, ++ .type = NVMEM_TYPE_OTP, ++ .read_only = true, ++ .word_size = 4, ++ .stride = 4, ++ .reg_read = mchp_otpc_read, ++}; ++ ++static int mchp_otpc_probe(struct platform_device *pdev) ++{ ++ struct nvmem_device *nvmem; ++ struct mchp_otpc *otpc; ++ u32 size; ++ int ret; ++ ++ otpc = devm_kzalloc(&pdev->dev, sizeof(*otpc), GFP_KERNEL); ++ if (!otpc) ++ return -ENOMEM; ++ ++ otpc->base = devm_platform_ioremap_resource(pdev, 0); ++ if (IS_ERR(otpc->base)) ++ return PTR_ERR(otpc->base); ++ ++ otpc->dev = &pdev->dev; ++ ret = mchp_otpc_init_packets_list(otpc, &size); ++ if (ret) ++ return ret; ++ ++ mchp_nvmem_config.dev = otpc->dev; ++ mchp_nvmem_config.size = size; ++ mchp_nvmem_config.priv = otpc; ++ nvmem = devm_nvmem_register(&pdev->dev, &mchp_nvmem_config); ++ ++ return PTR_ERR_OR_ZERO(nvmem); ++} ++ ++static const struct of_device_id __maybe_unused mchp_otpc_ids[] = { ++ { .compatible = "microchip,sama7g5-otpc", }, ++ { }, ++}; ++MODULE_DEVICE_TABLE(of, mchp_otpc_ids); ++ ++static struct platform_driver mchp_otpc_driver = { ++ .probe = mchp_otpc_probe, ++ .driver = { ++ .name = MCHP_OTPC_NAME, ++ .of_match_table = of_match_ptr(mchp_otpc_ids), ++ }, ++}; ++module_platform_driver(mchp_otpc_driver); ++ ++MODULE_AUTHOR("Claudiu Beznea "); ++MODULE_DESCRIPTION("Microchip SAMA7G5 OTPC driver"); ++MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/backport-5.15/806-v6.0-0002-nvmem-mtk-efuse-Simplify-with-devm_platform_get_and_.patch b/target/linux/generic/backport-5.15/806-v6.0-0002-nvmem-mtk-efuse-Simplify-with-devm_platform_get_and_.patch new file mode 100644 index 0000000000..6a4126b9de --- /dev/null +++ b/target/linux/generic/backport-5.15/806-v6.0-0002-nvmem-mtk-efuse-Simplify-with-devm_platform_get_and_.patch @@ -0,0 +1,32 @@ +From f5c97da8037b18d1256a58459fa96ed68e50fb41 Mon Sep 17 00:00:00 2001 +From: AngeloGioacchino Del Regno +Date: Wed, 6 Jul 2022 11:06:27 +0100 +Subject: [PATCH] nvmem: mtk-efuse: Simplify with + devm_platform_get_and_ioremap_resource() + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +No functional changes. + +Signed-off-by: AngeloGioacchino Del Regno +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220706100627.6534-8-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/mtk-efuse.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/nvmem/mtk-efuse.c ++++ b/drivers/nvmem/mtk-efuse.c +@@ -41,8 +41,7 @@ static int mtk_efuse_probe(struct platfo + if (!priv) + return -ENOMEM; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- priv->base = devm_ioremap_resource(dev, res); ++ priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + diff --git a/target/linux/generic/backport-5.15/807-v6.1-0002-nvmem-add-driver-handling-U-Boot-environment-variabl.patch b/target/linux/generic/backport-5.15/807-v6.1-0002-nvmem-add-driver-handling-U-Boot-environment-variabl.patch new file mode 100644 index 0000000000..9138807bc9 --- /dev/null +++ b/target/linux/generic/backport-5.15/807-v6.1-0002-nvmem-add-driver-handling-U-Boot-environment-variabl.patch @@ -0,0 +1,286 @@ +From d5542923f200f95bddf524f36fd495f78aa28e3c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Fri, 16 Sep 2022 13:20:48 +0100 +Subject: [PATCH] nvmem: add driver handling U-Boot environment variables +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +U-Boot stores its setup as environment variables. It's a list of +key-value pairs stored on flash device with a custom header. + +This commit adds an NVMEM driver that: +1. Provides NVMEM access to environment vars binary data +2. Extracts variables as NVMEM cells + +Current Linux's NVMEM sysfs API allows reading whole NVMEM data block. +It can be used by user-space tools for reading U-Boot env vars block +without the hassle of finding its location. Parsing will still need to +be re-done there. + +Kernel-parsed NVMEM cells can be read however by Linux drivers. This may +be useful for Ethernet drivers for reading device MAC address which is +often stored as U-Boot env variable. + +Reviewed-by: Ahmad Fatoum +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220916122100.170016-2-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + MAINTAINERS | 1 + + drivers/nvmem/Kconfig | 13 +++ + drivers/nvmem/Makefile | 2 + + drivers/nvmem/u-boot-env.c | 218 +++++++++++++++++++++++++++++++++++++ + 4 files changed, 234 insertions(+) + create mode 100644 drivers/nvmem/u-boot-env.c + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -344,4 +344,17 @@ config NVMEM_APPLE_EFUSES + This driver can also be built as a module. If so, the module will + be called nvmem-apple-efuses. + ++config NVMEM_U_BOOT_ENV ++ tristate "U-Boot environment variables support" ++ depends on OF && MTD ++ select CRC32 ++ help ++ U-Boot stores its setup as environment variables. This driver adds ++ support for verifying & exporting such data. It also exposes variables ++ as NVMEM cells so they can be referenced by other drivers. ++ ++ Currently this drivers works only with env variables on top of MTD. ++ ++ If compiled as module it will be called nvmem_u-boot-env. ++ + endif +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -69,3 +69,5 @@ obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvme + nvmem-apple-efuses-y := apple-efuses.o + obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o + nvmem-microchip-otpc-y := microchip-otpc.o ++obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o ++nvmem_u-boot-env-y := u-boot-env.o +--- /dev/null ++++ b/drivers/nvmem/u-boot-env.c +@@ -0,0 +1,218 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * Copyright (C) 2022 Rafał Miłecki ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++enum u_boot_env_format { ++ U_BOOT_FORMAT_SINGLE, ++ U_BOOT_FORMAT_REDUNDANT, ++}; ++ ++struct u_boot_env { ++ struct device *dev; ++ enum u_boot_env_format format; ++ ++ struct mtd_info *mtd; ++ ++ /* Cells */ ++ struct nvmem_cell_info *cells; ++ int ncells; ++}; ++ ++struct u_boot_env_image_single { ++ __le32 crc32; ++ uint8_t data[]; ++} __packed; ++ ++struct u_boot_env_image_redundant { ++ __le32 crc32; ++ u8 mark; ++ uint8_t data[]; ++} __packed; ++ ++static int u_boot_env_read(void *context, unsigned int offset, void *val, ++ size_t bytes) ++{ ++ struct u_boot_env *priv = context; ++ struct device *dev = priv->dev; ++ size_t bytes_read; ++ int err; ++ ++ err = mtd_read(priv->mtd, offset, bytes, &bytes_read, val); ++ if (err && !mtd_is_bitflip(err)) { ++ dev_err(dev, "Failed to read from mtd: %d\n", err); ++ return err; ++ } ++ ++ if (bytes_read != bytes) { ++ dev_err(dev, "Failed to read %zu bytes\n", bytes); ++ return -EIO; ++ } ++ ++ return 0; ++} ++ ++static int u_boot_env_add_cells(struct u_boot_env *priv, uint8_t *buf, ++ size_t data_offset, size_t data_len) ++{ ++ struct device *dev = priv->dev; ++ char *data = buf + data_offset; ++ char *var, *value, *eq; ++ int idx; ++ ++ priv->ncells = 0; ++ for (var = data; var < data + data_len && *var; var += strlen(var) + 1) ++ priv->ncells++; ++ ++ priv->cells = devm_kcalloc(dev, priv->ncells, sizeof(*priv->cells), GFP_KERNEL); ++ if (!priv->cells) ++ return -ENOMEM; ++ ++ for (var = data, idx = 0; ++ var < data + data_len && *var; ++ var = value + strlen(value) + 1, idx++) { ++ eq = strchr(var, '='); ++ if (!eq) ++ break; ++ *eq = '\0'; ++ value = eq + 1; ++ ++ priv->cells[idx].name = devm_kstrdup(dev, var, GFP_KERNEL); ++ if (!priv->cells[idx].name) ++ return -ENOMEM; ++ priv->cells[idx].offset = data_offset + value - data; ++ priv->cells[idx].bytes = strlen(value); ++ } ++ ++ if (WARN_ON(idx != priv->ncells)) ++ priv->ncells = idx; ++ ++ return 0; ++} ++ ++static int u_boot_env_parse(struct u_boot_env *priv) ++{ ++ struct device *dev = priv->dev; ++ size_t crc32_data_offset; ++ size_t crc32_data_len; ++ size_t crc32_offset; ++ size_t data_offset; ++ size_t data_len; ++ uint32_t crc32; ++ uint32_t calc; ++ size_t bytes; ++ uint8_t *buf; ++ int err; ++ ++ buf = kcalloc(1, priv->mtd->size, GFP_KERNEL); ++ if (!buf) { ++ err = -ENOMEM; ++ goto err_out; ++ } ++ ++ err = mtd_read(priv->mtd, 0, priv->mtd->size, &bytes, buf); ++ if ((err && !mtd_is_bitflip(err)) || bytes != priv->mtd->size) { ++ dev_err(dev, "Failed to read from mtd: %d\n", err); ++ goto err_kfree; ++ } ++ ++ switch (priv->format) { ++ case U_BOOT_FORMAT_SINGLE: ++ crc32_offset = offsetof(struct u_boot_env_image_single, crc32); ++ crc32_data_offset = offsetof(struct u_boot_env_image_single, data); ++ data_offset = offsetof(struct u_boot_env_image_single, data); ++ break; ++ case U_BOOT_FORMAT_REDUNDANT: ++ crc32_offset = offsetof(struct u_boot_env_image_redundant, crc32); ++ crc32_data_offset = offsetof(struct u_boot_env_image_redundant, mark); ++ data_offset = offsetof(struct u_boot_env_image_redundant, data); ++ break; ++ } ++ crc32 = le32_to_cpu(*(uint32_t *)(buf + crc32_offset)); ++ crc32_data_len = priv->mtd->size - crc32_data_offset; ++ data_len = priv->mtd->size - data_offset; ++ ++ calc = crc32(~0, buf + crc32_data_offset, crc32_data_len) ^ ~0L; ++ if (calc != crc32) { ++ dev_err(dev, "Invalid calculated CRC32: 0x%08x (expected: 0x%08x)\n", calc, crc32); ++ err = -EINVAL; ++ goto err_kfree; ++ } ++ ++ buf[priv->mtd->size - 1] = '\0'; ++ err = u_boot_env_add_cells(priv, buf, data_offset, data_len); ++ if (err) ++ dev_err(dev, "Failed to add cells: %d\n", err); ++ ++err_kfree: ++ kfree(buf); ++err_out: ++ return err; ++} ++ ++static int u_boot_env_probe(struct platform_device *pdev) ++{ ++ struct nvmem_config config = { ++ .name = "u-boot-env", ++ .reg_read = u_boot_env_read, ++ }; ++ struct device *dev = &pdev->dev; ++ struct device_node *np = dev->of_node; ++ struct u_boot_env *priv; ++ int err; ++ ++ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ priv->dev = dev; ++ ++ priv->format = (uintptr_t)of_device_get_match_data(dev); ++ ++ priv->mtd = of_get_mtd_device_by_node(np); ++ if (IS_ERR(priv->mtd)) { ++ dev_err_probe(dev, PTR_ERR(priv->mtd), "Failed to get %pOF MTD\n", np); ++ return PTR_ERR(priv->mtd); ++ } ++ ++ err = u_boot_env_parse(priv); ++ if (err) ++ return err; ++ ++ config.dev = dev; ++ config.cells = priv->cells; ++ config.ncells = priv->ncells; ++ config.priv = priv; ++ config.size = priv->mtd->size; ++ ++ return PTR_ERR_OR_ZERO(devm_nvmem_register(dev, &config)); ++} ++ ++static const struct of_device_id u_boot_env_of_match_table[] = { ++ { .compatible = "u-boot,env", .data = (void *)U_BOOT_FORMAT_SINGLE, }, ++ { .compatible = "u-boot,env-redundant-bool", .data = (void *)U_BOOT_FORMAT_REDUNDANT, }, ++ { .compatible = "u-boot,env-redundant-count", .data = (void *)U_BOOT_FORMAT_REDUNDANT, }, ++ {}, ++}; ++ ++static struct platform_driver u_boot_env_driver = { ++ .probe = u_boot_env_probe, ++ .driver = { ++ .name = "u_boot_env", ++ .of_match_table = u_boot_env_of_match_table, ++ }, ++}; ++module_platform_driver(u_boot_env_driver); ++ ++MODULE_AUTHOR("Rafał Miłecki"); ++MODULE_LICENSE("GPL"); ++MODULE_DEVICE_TABLE(of, u_boot_env_of_match_table); diff --git a/target/linux/generic/backport-5.15/807-v6.1-0004-nvmem-brcm_nvram-Use-kzalloc-for-allocating-only-one.patch b/target/linux/generic/backport-5.15/807-v6.1-0004-nvmem-brcm_nvram-Use-kzalloc-for-allocating-only-one.patch new file mode 100644 index 0000000000..48ad63fab5 --- /dev/null +++ b/target/linux/generic/backport-5.15/807-v6.1-0004-nvmem-brcm_nvram-Use-kzalloc-for-allocating-only-one.patch @@ -0,0 +1,29 @@ +From d3524bb5b9a0c567b853a0024526afe87dde01ed Mon Sep 17 00:00:00 2001 +From: Kenneth Lee +Date: Fri, 16 Sep 2022 13:20:52 +0100 +Subject: [PATCH] nvmem: brcm_nvram: Use kzalloc for allocating only one + element + +Use kzalloc(...) rather than kcalloc(1, ...) because the number of +elements we are specifying in this case is 1, so kzalloc would +accomplish the same thing and we can simplify. + +Signed-off-by: Kenneth Lee +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220916122100.170016-6-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/brcm_nvram.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/brcm_nvram.c ++++ b/drivers/nvmem/brcm_nvram.c +@@ -96,7 +96,7 @@ static int brcm_nvram_parse(struct brcm_ + + len = le32_to_cpu(header.len); + +- data = kcalloc(1, len, GFP_KERNEL); ++ data = kzalloc(len, GFP_KERNEL); + memcpy_fromio(data, priv->base, len); + data[len - 1] = '\0'; + diff --git a/target/linux/generic/backport-5.15/807-v6.1-0005-nvmem-prefix-all-symbols-with-NVMEM_.patch b/target/linux/generic/backport-5.15/807-v6.1-0005-nvmem-prefix-all-symbols-with-NVMEM_.patch new file mode 100644 index 0000000000..4410fc4d61 --- /dev/null +++ b/target/linux/generic/backport-5.15/807-v6.1-0005-nvmem-prefix-all-symbols-with-NVMEM_.patch @@ -0,0 +1,281 @@ +From 28fc7c986f01fdcfd28af648be2597624cac0e27 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Fri, 16 Sep 2022 13:20:54 +0100 +Subject: [PATCH] nvmem: prefix all symbols with NVMEM_ +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This unifies all NVMEM symbols. They follow one style now. + +Reviewed-by: Matthias Brugger +Acked-by: Arnd Bergmann +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220916122100.170016-8-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + arch/arm/configs/multi_v7_defconfig | 6 +++--- + arch/arm/configs/qcom_defconfig | 2 +- + arch/arm64/configs/defconfig | 10 +++++----- + arch/mips/configs/ci20_defconfig | 2 +- + drivers/cpufreq/Kconfig.arm | 2 +- + drivers/nvmem/Kconfig | 24 ++++++++++++------------ + drivers/nvmem/Makefile | 24 ++++++++++++------------ + drivers/soc/mediatek/Kconfig | 2 +- + drivers/thermal/qcom/Kconfig | 2 +- + 9 files changed, 37 insertions(+), 37 deletions(-) + +--- a/arch/arm/configs/multi_v7_defconfig ++++ b/arch/arm/configs/multi_v7_defconfig +@@ -1124,10 +1124,10 @@ CONFIG_TI_PIPE3=y + CONFIG_TWL4030_USB=m + CONFIG_RAS=y + CONFIG_NVMEM_IMX_OCOTP=y +-CONFIG_ROCKCHIP_EFUSE=m ++CONFIG_NVMEM_ROCKCHIP_EFUSE=m + CONFIG_NVMEM_SUNXI_SID=y + CONFIG_NVMEM_VF610_OCOTP=y +-CONFIG_MESON_MX_EFUSE=m ++CONFIG_NVMEM_MESON_MX_EFUSE=m + CONFIG_NVMEM_RMEM=m + CONFIG_FSI=m + CONFIG_FSI_MASTER_GPIO=m +--- a/arch/arm/configs/qcom_defconfig ++++ b/arch/arm/configs/qcom_defconfig +@@ -274,7 +274,7 @@ CONFIG_PHY_QCOM_USB_HS=y + CONFIG_PHY_QCOM_USB_HSIC=y + CONFIG_PHY_QCOM_QMP=y + CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2=y +-CONFIG_QCOM_QFPROM=y ++CONFIG_NVMEM_QCOM_QFPROM=y + CONFIG_INTERCONNECT=y + CONFIG_INTERCONNECT_QCOM=y + CONFIG_INTERCONNECT_QCOM_MSM8974=m +--- a/arch/arm64/configs/defconfig ++++ b/arch/arm64/configs/defconfig +@@ -1135,11 +1135,11 @@ CONFIG_QCOM_L3_PMU=y + CONFIG_NVMEM_IMX_OCOTP=y + CONFIG_NVMEM_IMX_OCOTP_SCU=y + CONFIG_QCOM_QFPROM=y +-CONFIG_MTK_EFUSE=y +-CONFIG_ROCKCHIP_EFUSE=y ++CONFIG_NVMEM_MTK_EFUSE=y ++CONFIG_NVMEM_ROCKCHIP_EFUSE=y + CONFIG_NVMEM_SUNXI_SID=y +-CONFIG_UNIPHIER_EFUSE=y +-CONFIG_MESON_EFUSE=m ++CONFIG_NVMEM_UNIPHIER_EFUSE=y ++CONFIG_NVMEM_MESON_EFUSE=m + CONFIG_NVMEM_RMEM=m + CONFIG_FPGA=y + CONFIG_FPGA_MGR_STRATIX10_SOC=m +--- a/arch/mips/configs/ci20_defconfig ++++ b/arch/mips/configs/ci20_defconfig +@@ -137,7 +137,7 @@ CONFIG_MEMORY=y + CONFIG_JZ4780_NEMC=y + CONFIG_PWM=y + CONFIG_PWM_JZ4740=m +-CONFIG_JZ4780_EFUSE=y ++CONFIG_NVMEM_JZ4780_EFUSE=y + CONFIG_JZ4770_PHY=y + CONFIG_EXT4_FS=y + # CONFIG_DNOTIFY is not set +--- a/drivers/cpufreq/Kconfig.arm ++++ b/drivers/cpufreq/Kconfig.arm +@@ -153,7 +153,7 @@ config ARM_OMAP2PLUS_CPUFREQ + config ARM_QCOM_CPUFREQ_NVMEM + tristate "Qualcomm nvmem based CPUFreq" + depends on ARCH_QCOM +- depends on QCOM_QFPROM ++ depends on NVMEM_QCOM_QFPROM + depends on QCOM_SMEM + select PM_OPP + help +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -52,7 +52,7 @@ config NVMEM_IMX_OCOTP_SCU + This is a driver for the SCU On-Chip OTP Controller (OCOTP) + available on i.MX8 SoCs. + +-config JZ4780_EFUSE ++config NVMEM_JZ4780_EFUSE + tristate "JZ4780 EFUSE Memory Support" + depends on MACH_INGENIC || COMPILE_TEST + depends on HAS_IOMEM +@@ -96,7 +96,7 @@ config NVMEM_MXS_OCOTP + This driver can also be built as a module. If so, the module + will be called nvmem-mxs-ocotp. + +-config MTK_EFUSE ++config NVMEM_MTK_EFUSE + tristate "Mediatek SoCs EFUSE support" + depends on ARCH_MEDIATEK || COMPILE_TEST + depends on HAS_IOMEM +@@ -107,7 +107,7 @@ config MTK_EFUSE + This driver can also be built as a module. If so, the module + will be called efuse-mtk. + +-config MICROCHIP_OTPC ++config NVMEM_MICROCHIP_OTPC + tristate "Microchip OTPC support" + depends on ARCH_AT91 || COMPILE_TEST + help +@@ -126,7 +126,7 @@ config NVMEM_NINTENDO_OTP + This driver can also be built as a module. If so, the module + will be called nvmem-nintendo-otp. + +-config QCOM_QFPROM ++config NVMEM_QCOM_QFPROM + tristate "QCOM QFPROM Support" + depends on ARCH_QCOM || COMPILE_TEST + depends on HAS_IOMEM +@@ -145,7 +145,7 @@ config NVMEM_SPMI_SDAM + Qualcomm Technologies, Inc. PMICs. It provides the clients + an interface to read/write to the SDAM module's shared memory. + +-config ROCKCHIP_EFUSE ++config NVMEM_ROCKCHIP_EFUSE + tristate "Rockchip eFuse Support" + depends on ARCH_ROCKCHIP || COMPILE_TEST + depends on HAS_IOMEM +@@ -156,7 +156,7 @@ config ROCKCHIP_EFUSE + This driver can also be built as a module. If so, the module + will be called nvmem_rockchip_efuse. + +-config ROCKCHIP_OTP ++config NVMEM_ROCKCHIP_OTP + tristate "Rockchip OTP controller support" + depends on ARCH_ROCKCHIP || COMPILE_TEST + depends on HAS_IOMEM +@@ -199,7 +199,7 @@ config NVMEM_SUNXI_SID + This driver can also be built as a module. If so, the module + will be called nvmem_sunxi_sid. + +-config UNIPHIER_EFUSE ++config NVMEM_UNIPHIER_EFUSE + tristate "UniPhier SoCs eFuse support" + depends on ARCH_UNIPHIER || COMPILE_TEST + depends on HAS_IOMEM +@@ -221,7 +221,7 @@ config NVMEM_VF610_OCOTP + This driver can also be build as a module. If so, the module will + be called nvmem-vf610-ocotp. + +-config MESON_EFUSE ++config NVMEM_MESON_EFUSE + tristate "Amlogic Meson GX eFuse Support" + depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM + help +@@ -231,7 +231,7 @@ config MESON_EFUSE + This driver can also be built as a module. If so, the module + will be called nvmem_meson_efuse. + +-config MESON_MX_EFUSE ++config NVMEM_MESON_MX_EFUSE + tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support" + depends on ARCH_MESON || COMPILE_TEST + help +@@ -251,13 +251,13 @@ config NVMEM_SNVS_LPGPR + This driver can also be built as a module. If so, the module + will be called nvmem-snvs-lpgpr. + +-config RAVE_SP_EEPROM ++config NVMEM_RAVE_SP_EEPROM + tristate "Rave SP EEPROM Support" + depends on RAVE_SP_CORE + help + Say y here to enable Rave SP EEPROM support. + +-config SC27XX_EFUSE ++config NVMEM_SC27XX_EFUSE + tristate "Spreadtrum SC27XX eFuse Support" + depends on MFD_SC27XX_PMIC || COMPILE_TEST + depends on HAS_IOMEM +@@ -278,7 +278,7 @@ config NVMEM_ZYNQMP + + If sure, say yes. If unsure, say no. + +-config SPRD_EFUSE ++config NVMEM_SPRD_EFUSE + tristate "Spreadtrum SoC eFuse Support" + depends on ARCH_SPRD || COMPILE_TEST + depends on HAS_IOMEM +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -15,7 +15,7 @@ obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-i + nvmem-imx-ocotp-y := imx-ocotp.o + obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvmem-imx-ocotp-scu.o + nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o +-obj-$(CONFIG_JZ4780_EFUSE) += nvmem_jz4780_efuse.o ++obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o + nvmem_jz4780_efuse-y := jz4780-efuse.o + obj-$(CONFIG_NVMEM_LPC18XX_EEPROM) += nvmem_lpc18xx_eeprom.o + nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o +@@ -25,37 +25,37 @@ obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-m + nvmem-mxs-ocotp-y := mxs-ocotp.o + obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o + nvmem-nintendo-otp-y := nintendo-otp.o +-obj-$(CONFIG_MTK_EFUSE) += nvmem_mtk-efuse.o ++obj-$(CONFIG_NVMEM_MTK_EFUSE) += nvmem_mtk-efuse.o + nvmem_mtk-efuse-y := mtk-efuse.o +-obj-$(CONFIG_QCOM_QFPROM) += nvmem_qfprom.o ++obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o + nvmem_qfprom-y := qfprom.o + obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o + nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o +-obj-$(CONFIG_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o ++obj-$(CONFIG_NVMEM_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o + nvmem_rockchip_efuse-y := rockchip-efuse.o +-obj-$(CONFIG_ROCKCHIP_OTP) += nvmem-rockchip-otp.o ++obj-$(CONFIG_NVMEM_ROCKCHIP_OTP) += nvmem-rockchip-otp.o + nvmem-rockchip-otp-y := rockchip-otp.o + obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o + nvmem_stm32_romem-y := stm32-romem.o + obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o + nvmem_sunxi_sid-y := sunxi_sid.o +-obj-$(CONFIG_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o ++obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o + nvmem-uniphier-efuse-y := uniphier-efuse.o + obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o + nvmem-vf610-ocotp-y := vf610-ocotp.o +-obj-$(CONFIG_MESON_EFUSE) += nvmem_meson_efuse.o ++obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o + nvmem_meson_efuse-y := meson-efuse.o +-obj-$(CONFIG_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o ++obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o + nvmem_meson_mx_efuse-y := meson-mx-efuse.o + obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o + nvmem_snvs_lpgpr-y := snvs_lpgpr.o +-obj-$(CONFIG_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o ++obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o + nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o +-obj-$(CONFIG_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o ++obj-$(CONFIG_NVMEM_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o + nvmem-sc27xx-efuse-y := sc27xx-efuse.o + obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o + nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o +-obj-$(CONFIG_SPRD_EFUSE) += nvmem_sprd_efuse.o ++obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o + nvmem_sprd_efuse-y := sprd-efuse.o + obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o + nvmem-rmem-y := rmem.o +@@ -67,7 +67,7 @@ obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvm + nvmem_sunplus_ocotp-y := sunplus-ocotp.o + obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o + nvmem-apple-efuses-y := apple-efuses.o +-obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o ++obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o + nvmem-microchip-otpc-y := microchip-otpc.o + obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o + nvmem_u-boot-env-y := u-boot-env.o +--- a/drivers/thermal/qcom/Kconfig ++++ b/drivers/thermal/qcom/Kconfig +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0-only + config QCOM_TSENS + tristate "Qualcomm TSENS Temperature Alarm" +- depends on QCOM_QFPROM ++ depends on NVMEM_QCOM_QFPROM + depends on ARCH_QCOM || COMPILE_TEST + help + This enables the thermal sysfs driver for the TSENS device. It shows diff --git a/target/linux/generic/backport-5.15/807-v6.1-0006-nvmem-sort-config-symbols-alphabetically.patch b/target/linux/generic/backport-5.15/807-v6.1-0006-nvmem-sort-config-symbols-alphabetically.patch new file mode 100644 index 0000000000..4e45524bff --- /dev/null +++ b/target/linux/generic/backport-5.15/807-v6.1-0006-nvmem-sort-config-symbols-alphabetically.patch @@ -0,0 +1,535 @@ +From a06d9e5a63b7c2f622c908cd9600ce735e70f7c6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Fri, 16 Sep 2022 13:20:55 +0100 +Subject: [PATCH] nvmem: sort config symbols alphabetically +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +1. Match what most subsystems do +2. Simplify maintenance a bit +3. Reduce amount of conflicts for new drivers patches + +While at it unify indent level in Makefile. + +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220916122100.170016-9-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 300 +++++++++++++++++++++-------------------- + drivers/nvmem/Makefile | 114 ++++++++-------- + 2 files changed, 208 insertions(+), 206 deletions(-) + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -21,6 +21,40 @@ config NVMEM_SYSFS + This interface is mostly used by userspace applications to + read/write directly into nvmem. + ++# Devices ++ ++config NVMEM_APPLE_EFUSES ++ tristate "Apple eFuse support" ++ depends on ARCH_APPLE || COMPILE_TEST ++ default ARCH_APPLE ++ help ++ Say y here to enable support for reading eFuses on Apple SoCs ++ such as the M1. These are e.g. used to store factory programmed ++ calibration data required for the PCIe or the USB-C PHY. ++ ++ This driver can also be built as a module. If so, the module will ++ be called nvmem-apple-efuses. ++ ++config NVMEM_BCM_OCOTP ++ tristate "Broadcom On-Chip OTP Controller support" ++ depends on ARCH_BCM_IPROC || COMPILE_TEST ++ depends on HAS_IOMEM ++ default ARCH_BCM_IPROC ++ help ++ Say y here to enable read/write access to the Broadcom OTP ++ controller. ++ ++ This driver can also be built as a module. If so, the module ++ will be called nvmem-bcm-ocotp. ++ ++config NVMEM_BRCM_NVRAM ++ tristate "Broadcom's NVRAM support" ++ depends on ARCH_BCM_5301X || COMPILE_TEST ++ depends on HAS_IOMEM ++ help ++ This driver provides support for Broadcom's NVRAM that can be accessed ++ using I/O mapping. ++ + config NVMEM_IMX_IIM + tristate "i.MX IC Identification Module support" + depends on ARCH_MXC || COMPILE_TEST +@@ -64,6 +98,19 @@ config NVMEM_JZ4780_EFUSE + To compile this driver as a module, choose M here: the module + will be called nvmem_jz4780_efuse. + ++config NVMEM_LAYERSCAPE_SFP ++ tristate "Layerscape SFP (Security Fuse Processor) support" ++ depends on ARCH_LAYERSCAPE || COMPILE_TEST ++ depends on HAS_IOMEM ++ select REGMAP_MMIO ++ help ++ This driver provides support to read the eFuses on Freescale ++ Layerscape SoC's. For example, the vendor provides a per part ++ unique ID there. ++ ++ This driver can also be built as a module. If so, the module ++ will be called layerscape-sfp. ++ + config NVMEM_LPC18XX_EEPROM + tristate "NXP LPC18XX EEPROM Memory Support" + depends on ARCH_LPC18XX || COMPILE_TEST +@@ -84,17 +131,32 @@ config NVMEM_LPC18XX_OTP + To compile this driver as a module, choose M here: the module + will be called nvmem_lpc18xx_otp. + +-config NVMEM_MXS_OCOTP +- tristate "Freescale MXS On-Chip OTP Memory Support" +- depends on ARCH_MXS || COMPILE_TEST +- depends on HAS_IOMEM ++config NVMEM_MESON_EFUSE ++ tristate "Amlogic Meson GX eFuse Support" ++ depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM + help +- If you say Y here, you will get readonly access to the +- One Time Programmable memory pages that are stored +- on the Freescale i.MX23/i.MX28 processor. ++ This is a driver to retrieve specific values from the eFuse found on ++ the Amlogic Meson GX SoCs. + + This driver can also be built as a module. If so, the module +- will be called nvmem-mxs-ocotp. ++ will be called nvmem_meson_efuse. ++ ++config NVMEM_MESON_MX_EFUSE ++ tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support" ++ depends on ARCH_MESON || COMPILE_TEST ++ help ++ This is a driver to retrieve specific values from the eFuse found on ++ the Amlogic Meson6, Meson8 and Meson8b SoCs. ++ ++ This driver can also be built as a module. If so, the module ++ will be called nvmem_meson_mx_efuse. ++ ++config NVMEM_MICROCHIP_OTPC ++ tristate "Microchip OTPC support" ++ depends on ARCH_AT91 || COMPILE_TEST ++ help ++ This driver enable the OTP controller available on Microchip SAMA7G5 ++ SoCs. It controlls the access to the OTP memory connected to it. + + config NVMEM_MTK_EFUSE + tristate "Mediatek SoCs EFUSE support" +@@ -107,12 +169,17 @@ config NVMEM_MTK_EFUSE + This driver can also be built as a module. If so, the module + will be called efuse-mtk. + +-config NVMEM_MICROCHIP_OTPC +- tristate "Microchip OTPC support" +- depends on ARCH_AT91 || COMPILE_TEST ++config NVMEM_MXS_OCOTP ++ tristate "Freescale MXS On-Chip OTP Memory Support" ++ depends on ARCH_MXS || COMPILE_TEST ++ depends on HAS_IOMEM + help +- This driver enable the OTP controller available on Microchip SAMA7G5 +- SoCs. It controlls the access to the OTP memory connected to it. ++ If you say Y here, you will get readonly access to the ++ One Time Programmable memory pages that are stored ++ on the Freescale i.MX23/i.MX28 processor. ++ ++ This driver can also be built as a module. If so, the module ++ will be called nvmem-mxs-ocotp. + + config NVMEM_NINTENDO_OTP + tristate "Nintendo Wii and Wii U OTP Support" +@@ -137,13 +204,21 @@ config NVMEM_QCOM_QFPROM + This driver can also be built as a module. If so, the module + will be called nvmem_qfprom. + +-config NVMEM_SPMI_SDAM +- tristate "SPMI SDAM Support" +- depends on SPMI ++config NVMEM_RAVE_SP_EEPROM ++ tristate "Rave SP EEPROM Support" ++ depends on RAVE_SP_CORE + help +- This driver supports the Shared Direct Access Memory Module on +- Qualcomm Technologies, Inc. PMICs. It provides the clients +- an interface to read/write to the SDAM module's shared memory. ++ Say y here to enable Rave SP EEPROM support. ++ ++config NVMEM_RMEM ++ tristate "Reserved Memory Based Driver Support" ++ depends on HAS_IOMEM ++ help ++ This driver maps reserved memory into an nvmem device. It might be ++ useful to expose information left by firmware in memory. ++ ++ This driver can also be built as a module. If so, the module ++ will be called nvmem-rmem. + + config NVMEM_ROCKCHIP_EFUSE + tristate "Rockchip eFuse Support" +@@ -167,79 +242,16 @@ config NVMEM_ROCKCHIP_OTP + This driver can also be built as a module. If so, the module + will be called nvmem_rockchip_otp. + +-config NVMEM_BCM_OCOTP +- tristate "Broadcom On-Chip OTP Controller support" +- depends on ARCH_BCM_IPROC || COMPILE_TEST +- depends on HAS_IOMEM +- default ARCH_BCM_IPROC +- help +- Say y here to enable read/write access to the Broadcom OTP +- controller. +- +- This driver can also be built as a module. If so, the module +- will be called nvmem-bcm-ocotp. +- +-config NVMEM_STM32_ROMEM +- tristate "STMicroelectronics STM32 factory-programmed memory support" +- depends on ARCH_STM32 || COMPILE_TEST +- help +- Say y here to enable read-only access for STMicroelectronics STM32 +- factory-programmed memory area. +- +- This driver can also be built as a module. If so, the module +- will be called nvmem-stm32-romem. +- +-config NVMEM_SUNXI_SID +- tristate "Allwinner SoCs SID support" +- depends on ARCH_SUNXI +- help +- This is a driver for the 'security ID' available on various Allwinner +- devices. +- +- This driver can also be built as a module. If so, the module +- will be called nvmem_sunxi_sid. +- +-config NVMEM_UNIPHIER_EFUSE +- tristate "UniPhier SoCs eFuse support" +- depends on ARCH_UNIPHIER || COMPILE_TEST +- depends on HAS_IOMEM +- help +- This is a simple driver to dump specified values of UniPhier SoC +- from eFuse. +- +- This driver can also be built as a module. If so, the module +- will be called nvmem-uniphier-efuse. +- +-config NVMEM_VF610_OCOTP +- tristate "VF610 SoC OCOTP support" +- depends on SOC_VF610 || COMPILE_TEST ++config NVMEM_SC27XX_EFUSE ++ tristate "Spreadtrum SC27XX eFuse Support" ++ depends on MFD_SC27XX_PMIC || COMPILE_TEST + depends on HAS_IOMEM + help +- This is a driver for the 'OCOTP' peripheral available on Vybrid +- devices like VF5xx and VF6xx. +- +- This driver can also be build as a module. If so, the module will +- be called nvmem-vf610-ocotp. +- +-config NVMEM_MESON_EFUSE +- tristate "Amlogic Meson GX eFuse Support" +- depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM +- help +- This is a driver to retrieve specific values from the eFuse found on +- the Amlogic Meson GX SoCs. +- +- This driver can also be built as a module. If so, the module +- will be called nvmem_meson_efuse. +- +-config NVMEM_MESON_MX_EFUSE +- tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support" +- depends on ARCH_MESON || COMPILE_TEST +- help +- This is a driver to retrieve specific values from the eFuse found on +- the Amlogic Meson6, Meson8 and Meson8b SoCs. ++ This is a simple driver to dump specified values of Spreadtrum ++ SC27XX PMICs from eFuse. + + This driver can also be built as a module. If so, the module +- will be called nvmem_meson_mx_efuse. ++ will be called nvmem-sc27xx-efuse. + + config NVMEM_SNVS_LPGPR + tristate "Support for Low Power General Purpose Register" +@@ -251,32 +263,13 @@ config NVMEM_SNVS_LPGPR + This driver can also be built as a module. If so, the module + will be called nvmem-snvs-lpgpr. + +-config NVMEM_RAVE_SP_EEPROM +- tristate "Rave SP EEPROM Support" +- depends on RAVE_SP_CORE +- help +- Say y here to enable Rave SP EEPROM support. +- +-config NVMEM_SC27XX_EFUSE +- tristate "Spreadtrum SC27XX eFuse Support" +- depends on MFD_SC27XX_PMIC || COMPILE_TEST +- depends on HAS_IOMEM +- help +- This is a simple driver to dump specified values of Spreadtrum +- SC27XX PMICs from eFuse. +- +- This driver can also be built as a module. If so, the module +- will be called nvmem-sc27xx-efuse. +- +-config NVMEM_ZYNQMP +- bool "Xilinx ZYNQMP SoC nvmem firmware support" +- depends on ARCH_ZYNQMP ++config NVMEM_SPMI_SDAM ++ tristate "SPMI SDAM Support" ++ depends on SPMI + help +- This is a driver to access hardware related data like +- soc revision, IDCODE... etc by using the firmware +- interface. +- +- If sure, say yes. If unsure, say no. ++ This driver supports the Shared Direct Access Memory Module on ++ Qualcomm Technologies, Inc. PMICs. It provides the clients ++ an interface to read/write to the SDAM module's shared memory. + + config NVMEM_SPRD_EFUSE + tristate "Spreadtrum SoC eFuse Support" +@@ -289,36 +282,15 @@ config NVMEM_SPRD_EFUSE + This driver can also be built as a module. If so, the module + will be called nvmem-sprd-efuse. + +-config NVMEM_RMEM +- tristate "Reserved Memory Based Driver Support" +- depends on HAS_IOMEM +- help +- This driver maps reserved memory into an nvmem device. It might be +- useful to expose information left by firmware in memory. +- +- This driver can also be built as a module. If so, the module +- will be called nvmem-rmem. +- +-config NVMEM_BRCM_NVRAM +- tristate "Broadcom's NVRAM support" +- depends on ARCH_BCM_5301X || COMPILE_TEST +- depends on HAS_IOMEM +- help +- This driver provides support for Broadcom's NVRAM that can be accessed +- using I/O mapping. +- +-config NVMEM_LAYERSCAPE_SFP +- tristate "Layerscape SFP (Security Fuse Processor) support" +- depends on ARCH_LAYERSCAPE || COMPILE_TEST +- depends on HAS_IOMEM +- select REGMAP_MMIO ++config NVMEM_STM32_ROMEM ++ tristate "STMicroelectronics STM32 factory-programmed memory support" ++ depends on ARCH_STM32 || COMPILE_TEST + help +- This driver provides support to read the eFuses on Freescale +- Layerscape SoC's. For example, the vendor provides a per part +- unique ID there. ++ Say y here to enable read-only access for STMicroelectronics STM32 ++ factory-programmed memory area. + + This driver can also be built as a module. If so, the module +- will be called layerscape-sfp. ++ will be called nvmem-stm32-romem. + + config NVMEM_SUNPLUS_OCOTP + tristate "Sunplus SoC OTP support" +@@ -332,17 +304,15 @@ config NVMEM_SUNPLUS_OCOTP + This driver can also be built as a module. If so, the module + will be called nvmem-sunplus-ocotp. + +-config NVMEM_APPLE_EFUSES +- tristate "Apple eFuse support" +- depends on ARCH_APPLE || COMPILE_TEST +- default ARCH_APPLE ++config NVMEM_SUNXI_SID ++ tristate "Allwinner SoCs SID support" ++ depends on ARCH_SUNXI + help +- Say y here to enable support for reading eFuses on Apple SoCs +- such as the M1. These are e.g. used to store factory programmed +- calibration data required for the PCIe or the USB-C PHY. ++ This is a driver for the 'security ID' available on various Allwinner ++ devices. + +- This driver can also be built as a module. If so, the module will +- be called nvmem-apple-efuses. ++ This driver can also be built as a module. If so, the module ++ will be called nvmem_sunxi_sid. + + config NVMEM_U_BOOT_ENV + tristate "U-Boot environment variables support" +@@ -357,4 +327,36 @@ config NVMEM_U_BOOT_ENV + + If compiled as module it will be called nvmem_u-boot-env. + ++config NVMEM_UNIPHIER_EFUSE ++ tristate "UniPhier SoCs eFuse support" ++ depends on ARCH_UNIPHIER || COMPILE_TEST ++ depends on HAS_IOMEM ++ help ++ This is a simple driver to dump specified values of UniPhier SoC ++ from eFuse. ++ ++ This driver can also be built as a module. If so, the module ++ will be called nvmem-uniphier-efuse. ++ ++config NVMEM_VF610_OCOTP ++ tristate "VF610 SoC OCOTP support" ++ depends on SOC_VF610 || COMPILE_TEST ++ depends on HAS_IOMEM ++ help ++ This is a driver for the 'OCOTP' peripheral available on Vybrid ++ devices like VF5xx and VF6xx. ++ ++ This driver can also be build as a module. If so, the module will ++ be called nvmem-vf610-ocotp. ++ ++config NVMEM_ZYNQMP ++ bool "Xilinx ZYNQMP SoC nvmem firmware support" ++ depends on ARCH_ZYNQMP ++ help ++ This is a driver to access hardware related data like ++ soc revision, IDCODE... etc by using the firmware ++ interface. ++ ++ If sure, say yes. If unsure, say no. ++ + endif +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -7,67 +7,67 @@ obj-$(CONFIG_NVMEM) += nvmem_core.o + nvmem_core-y := core.o + + # Devices +-obj-$(CONFIG_NVMEM_BCM_OCOTP) += nvmem-bcm-ocotp.o +-nvmem-bcm-ocotp-y := bcm-ocotp.o +-obj-$(CONFIG_NVMEM_IMX_IIM) += nvmem-imx-iim.o +-nvmem-imx-iim-y := imx-iim.o +-obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-imx-ocotp.o +-nvmem-imx-ocotp-y := imx-ocotp.o ++obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o ++nvmem-apple-efuses-y := apple-efuses.o ++obj-$(CONFIG_NVMEM_BCM_OCOTP) += nvmem-bcm-ocotp.o ++nvmem-bcm-ocotp-y := bcm-ocotp.o ++obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o ++nvmem_brcm_nvram-y := brcm_nvram.o ++obj-$(CONFIG_NVMEM_IMX_IIM) += nvmem-imx-iim.o ++nvmem-imx-iim-y := imx-iim.o ++obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-imx-ocotp.o ++nvmem-imx-ocotp-y := imx-ocotp.o + obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvmem-imx-ocotp-scu.o +-nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o +-obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o +-nvmem_jz4780_efuse-y := jz4780-efuse.o ++nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o ++obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o ++nvmem_jz4780_efuse-y := jz4780-efuse.o ++obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o ++nvmem-layerscape-sfp-y := layerscape-sfp.o + obj-$(CONFIG_NVMEM_LPC18XX_EEPROM) += nvmem_lpc18xx_eeprom.o +-nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o +-obj-$(CONFIG_NVMEM_LPC18XX_OTP) += nvmem_lpc18xx_otp.o +-nvmem_lpc18xx_otp-y := lpc18xx_otp.o +-obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-mxs-ocotp.o +-nvmem-mxs-ocotp-y := mxs-ocotp.o +-obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o +-nvmem-nintendo-otp-y := nintendo-otp.o ++nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o ++obj-$(CONFIG_NVMEM_LPC18XX_OTP) += nvmem_lpc18xx_otp.o ++nvmem_lpc18xx_otp-y := lpc18xx_otp.o ++obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o ++nvmem_meson_efuse-y := meson-efuse.o ++obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o ++nvmem_meson_mx_efuse-y := meson-mx-efuse.o ++obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o ++nvmem-microchip-otpc-y := microchip-otpc.o + obj-$(CONFIG_NVMEM_MTK_EFUSE) += nvmem_mtk-efuse.o +-nvmem_mtk-efuse-y := mtk-efuse.o +-obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o +-nvmem_qfprom-y := qfprom.o +-obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o +-nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o ++nvmem_mtk-efuse-y := mtk-efuse.o ++obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-mxs-ocotp.o ++nvmem-mxs-ocotp-y := mxs-ocotp.o ++obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o ++nvmem-nintendo-otp-y := nintendo-otp.o ++obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o ++nvmem_qfprom-y := qfprom.o ++obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o ++nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o ++obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o ++nvmem-rmem-y := rmem.o + obj-$(CONFIG_NVMEM_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o +-nvmem_rockchip_efuse-y := rockchip-efuse.o ++nvmem_rockchip_efuse-y := rockchip-efuse.o + obj-$(CONFIG_NVMEM_ROCKCHIP_OTP) += nvmem-rockchip-otp.o +-nvmem-rockchip-otp-y := rockchip-otp.o +-obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o +-nvmem_stm32_romem-y := stm32-romem.o +-obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o +-nvmem_sunxi_sid-y := sunxi_sid.o +-obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o +-nvmem-uniphier-efuse-y := uniphier-efuse.o +-obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o +-nvmem-vf610-ocotp-y := vf610-ocotp.o +-obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o +-nvmem_meson_efuse-y := meson-efuse.o +-obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o +-nvmem_meson_mx_efuse-y := meson-mx-efuse.o +-obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o +-nvmem_snvs_lpgpr-y := snvs_lpgpr.o +-obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o +-nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o ++nvmem-rockchip-otp-y := rockchip-otp.o + obj-$(CONFIG_NVMEM_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o +-nvmem-sc27xx-efuse-y := sc27xx-efuse.o +-obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o +-nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o +-obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o +-nvmem_sprd_efuse-y := sprd-efuse.o +-obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o +-nvmem-rmem-y := rmem.o +-obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o +-nvmem_brcm_nvram-y := brcm_nvram.o +-obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o +-nvmem-layerscape-sfp-y := layerscape-sfp.o ++nvmem-sc27xx-efuse-y := sc27xx-efuse.o ++obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o ++nvmem_snvs_lpgpr-y := snvs_lpgpr.o ++obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o ++nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o ++obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o ++nvmem_sprd_efuse-y := sprd-efuse.o ++obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o ++nvmem_stm32_romem-y := stm32-romem.o + obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o +-nvmem_sunplus_ocotp-y := sunplus-ocotp.o +-obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o +-nvmem-apple-efuses-y := apple-efuses.o +-obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o +-nvmem-microchip-otpc-y := microchip-otpc.o +-obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o +-nvmem_u-boot-env-y := u-boot-env.o ++nvmem_sunplus_ocotp-y := sunplus-ocotp.o ++obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o ++nvmem_sunxi_sid-y := sunxi_sid.o ++obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o ++nvmem_u-boot-env-y := u-boot-env.o ++obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o ++nvmem-uniphier-efuse-y := uniphier-efuse.o ++obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o ++nvmem-vf610-ocotp-y := vf610-ocotp.o ++obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o ++nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o diff --git a/target/linux/generic/backport-5.15/807-v6.1-0007-nvmem-u-boot-env-find-Device-Tree-nodes-for-NVMEM-ce.patch b/target/linux/generic/backport-5.15/807-v6.1-0007-nvmem-u-boot-env-find-Device-Tree-nodes-for-NVMEM-ce.patch new file mode 100644 index 0000000000..e0a082adc4 --- /dev/null +++ b/target/linux/generic/backport-5.15/807-v6.1-0007-nvmem-u-boot-env-find-Device-Tree-nodes-for-NVMEM-ce.patch @@ -0,0 +1,31 @@ +From d4d432670f7dee0a5432fcffcfc8699b25181ace Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Fri, 16 Sep 2022 13:20:57 +0100 +Subject: [PATCH] nvmem: u-boot-env: find Device Tree nodes for NVMEM cells +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +DT binding allows specifying NVMEM cells as NVMEM device (provider) +subnodes. Looks for such subnodes when building NVMEM cells. + +This allows NVMEM consumers to use U-Boot environment variables. + +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220916122100.170016-11-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/u-boot-env.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/nvmem/u-boot-env.c ++++ b/drivers/nvmem/u-boot-env.c +@@ -92,6 +92,7 @@ static int u_boot_env_add_cells(struct u + return -ENOMEM; + priv->cells[idx].offset = data_offset + value - data; + priv->cells[idx].bytes = strlen(value); ++ priv->cells[idx].np = of_get_child_by_name(dev->of_node, priv->cells[idx].name); + } + + if (WARN_ON(idx != priv->ncells)) diff --git a/target/linux/generic/backport-5.15/807-v6.1-0008-nvmem-lan9662-otp-add-support.patch b/target/linux/generic/backport-5.15/807-v6.1-0008-nvmem-lan9662-otp-add-support.patch new file mode 100644 index 0000000000..945c6128ff --- /dev/null +++ b/target/linux/generic/backport-5.15/807-v6.1-0008-nvmem-lan9662-otp-add-support.patch @@ -0,0 +1,274 @@ +From 9e8f208ad5229ddda97cd4a83ecf89c735d99592 Mon Sep 17 00:00:00 2001 +From: Horatiu Vultur +Date: Fri, 16 Sep 2022 13:20:59 +0100 +Subject: [PATCH] nvmem: lan9662-otp: add support + +Add support for OTP controller available on LAN9662. The OTPC controls +the access to a non-volatile memory. The size of the memory is 8KB. +The OTPC can access the memory based on an offset. +Implement both the read and the write functionality. + +Signed-off-by: Horatiu Vultur +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220916122100.170016-13-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 8 ++ + drivers/nvmem/Makefile | 2 + + drivers/nvmem/lan9662-otpc.c | 222 +++++++++++++++++++++++++++++++++++ + 3 files changed, 232 insertions(+) + create mode 100644 drivers/nvmem/lan9662-otpc.c + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -98,6 +98,14 @@ config NVMEM_JZ4780_EFUSE + To compile this driver as a module, choose M here: the module + will be called nvmem_jz4780_efuse. + ++config NVMEM_LAN9662_OTPC ++ tristate "Microchip LAN9662 OTP controller support" ++ depends on SOC_LAN966 || COMPILE_TEST ++ depends on HAS_IOMEM ++ help ++ This driver enables the OTP controller available on Microchip LAN9662 ++ SoCs. It controls the access to the OTP memory connected to it. ++ + config NVMEM_LAYERSCAPE_SFP + tristate "Layerscape SFP (Security Fuse Processor) support" + depends on ARCH_LAYERSCAPE || COMPILE_TEST +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -21,6 +21,8 @@ obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvm + nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o + obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o + nvmem_jz4780_efuse-y := jz4780-efuse.o ++obj-$(CONFIG_NVMEM_LAN9662_OTPC) += nvmem-lan9662-otpc.o ++nvmem-lan9662-otpc-y := lan9662-otpc.o + obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o + nvmem-layerscape-sfp-y := layerscape-sfp.o + obj-$(CONFIG_NVMEM_LPC18XX_EEPROM) += nvmem_lpc18xx_eeprom.o +--- /dev/null ++++ b/drivers/nvmem/lan9662-otpc.c +@@ -0,0 +1,222 @@ ++// SPDX-License-Identifier: GPL-2.0 ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define OTP_OTP_PWR_DN(t) (t + 0x00) ++#define OTP_OTP_PWR_DN_OTP_PWRDN_N BIT(0) ++#define OTP_OTP_ADDR_HI(t) (t + 0x04) ++#define OTP_OTP_ADDR_LO(t) (t + 0x08) ++#define OTP_OTP_PRGM_DATA(t) (t + 0x10) ++#define OTP_OTP_PRGM_MODE(t) (t + 0x14) ++#define OTP_OTP_PRGM_MODE_OTP_PGM_MODE_BYTE BIT(0) ++#define OTP_OTP_RD_DATA(t) (t + 0x18) ++#define OTP_OTP_FUNC_CMD(t) (t + 0x20) ++#define OTP_OTP_FUNC_CMD_OTP_PROGRAM BIT(1) ++#define OTP_OTP_FUNC_CMD_OTP_READ BIT(0) ++#define OTP_OTP_CMD_GO(t) (t + 0x28) ++#define OTP_OTP_CMD_GO_OTP_GO BIT(0) ++#define OTP_OTP_PASS_FAIL(t) (t + 0x2c) ++#define OTP_OTP_PASS_FAIL_OTP_READ_PROHIBITED BIT(3) ++#define OTP_OTP_PASS_FAIL_OTP_WRITE_PROHIBITED BIT(2) ++#define OTP_OTP_PASS_FAIL_OTP_FAIL BIT(0) ++#define OTP_OTP_STATUS(t) (t + 0x30) ++#define OTP_OTP_STATUS_OTP_CPUMPEN BIT(1) ++#define OTP_OTP_STATUS_OTP_BUSY BIT(0) ++ ++#define OTP_MEM_SIZE 8192 ++#define OTP_SLEEP_US 10 ++#define OTP_TIMEOUT_US 500000 ++ ++struct lan9662_otp { ++ struct device *dev; ++ void __iomem *base; ++}; ++ ++static bool lan9662_otp_wait_flag_clear(void __iomem *reg, u32 flag) ++{ ++ u32 val; ++ ++ return readl_poll_timeout(reg, val, !(val & flag), ++ OTP_SLEEP_US, OTP_TIMEOUT_US); ++} ++ ++static int lan9662_otp_power(struct lan9662_otp *otp, bool up) ++{ ++ void __iomem *pwrdn = OTP_OTP_PWR_DN(otp->base); ++ ++ if (up) { ++ writel(readl(pwrdn) & ~OTP_OTP_PWR_DN_OTP_PWRDN_N, pwrdn); ++ if (lan9662_otp_wait_flag_clear(OTP_OTP_STATUS(otp->base), ++ OTP_OTP_STATUS_OTP_CPUMPEN)) ++ return -ETIMEDOUT; ++ } else { ++ writel(readl(pwrdn) | OTP_OTP_PWR_DN_OTP_PWRDN_N, pwrdn); ++ } ++ ++ return 0; ++} ++ ++static int lan9662_otp_execute(struct lan9662_otp *otp) ++{ ++ if (lan9662_otp_wait_flag_clear(OTP_OTP_CMD_GO(otp->base), ++ OTP_OTP_CMD_GO_OTP_GO)) ++ return -ETIMEDOUT; ++ ++ if (lan9662_otp_wait_flag_clear(OTP_OTP_STATUS(otp->base), ++ OTP_OTP_STATUS_OTP_BUSY)) ++ return -ETIMEDOUT; ++ ++ return 0; ++} ++ ++static void lan9662_otp_set_address(struct lan9662_otp *otp, u32 offset) ++{ ++ writel(0xff & (offset >> 8), OTP_OTP_ADDR_HI(otp->base)); ++ writel(0xff & offset, OTP_OTP_ADDR_LO(otp->base)); ++} ++ ++static int lan9662_otp_read_byte(struct lan9662_otp *otp, u32 offset, u8 *dst) ++{ ++ u32 pass; ++ int rc; ++ ++ lan9662_otp_set_address(otp, offset); ++ writel(OTP_OTP_FUNC_CMD_OTP_READ, OTP_OTP_FUNC_CMD(otp->base)); ++ writel(OTP_OTP_CMD_GO_OTP_GO, OTP_OTP_CMD_GO(otp->base)); ++ rc = lan9662_otp_execute(otp); ++ if (!rc) { ++ pass = readl(OTP_OTP_PASS_FAIL(otp->base)); ++ if (pass & OTP_OTP_PASS_FAIL_OTP_READ_PROHIBITED) ++ return -EACCES; ++ *dst = (u8) readl(OTP_OTP_RD_DATA(otp->base)); ++ } ++ return rc; ++} ++ ++static int lan9662_otp_write_byte(struct lan9662_otp *otp, u32 offset, u8 data) ++{ ++ u32 pass; ++ int rc; ++ ++ lan9662_otp_set_address(otp, offset); ++ writel(OTP_OTP_PRGM_MODE_OTP_PGM_MODE_BYTE, OTP_OTP_PRGM_MODE(otp->base)); ++ writel(data, OTP_OTP_PRGM_DATA(otp->base)); ++ writel(OTP_OTP_FUNC_CMD_OTP_PROGRAM, OTP_OTP_FUNC_CMD(otp->base)); ++ writel(OTP_OTP_CMD_GO_OTP_GO, OTP_OTP_CMD_GO(otp->base)); ++ ++ rc = lan9662_otp_execute(otp); ++ if (!rc) { ++ pass = readl(OTP_OTP_PASS_FAIL(otp->base)); ++ if (pass & OTP_OTP_PASS_FAIL_OTP_WRITE_PROHIBITED) ++ return -EACCES; ++ if (pass & OTP_OTP_PASS_FAIL_OTP_FAIL) ++ return -EIO; ++ } ++ return rc; ++} ++ ++static int lan9662_otp_read(void *context, unsigned int offset, ++ void *_val, size_t bytes) ++{ ++ struct lan9662_otp *otp = context; ++ u8 *val = _val; ++ uint8_t data; ++ int i, rc = 0; ++ ++ lan9662_otp_power(otp, true); ++ for (i = 0; i < bytes; i++) { ++ rc = lan9662_otp_read_byte(otp, offset + i, &data); ++ if (rc < 0) ++ break; ++ *val++ = data; ++ } ++ lan9662_otp_power(otp, false); ++ ++ return rc; ++} ++ ++static int lan9662_otp_write(void *context, unsigned int offset, ++ void *_val, size_t bytes) ++{ ++ struct lan9662_otp *otp = context; ++ u8 *val = _val; ++ u8 data, newdata; ++ int i, rc = 0; ++ ++ lan9662_otp_power(otp, true); ++ for (i = 0; i < bytes; i++) { ++ /* Skip zero bytes */ ++ if (val[i]) { ++ rc = lan9662_otp_read_byte(otp, offset + i, &data); ++ if (rc < 0) ++ break; ++ ++ newdata = data | val[i]; ++ if (newdata == data) ++ continue; ++ ++ rc = lan9662_otp_write_byte(otp, offset + i, ++ newdata); ++ if (rc < 0) ++ break; ++ } ++ } ++ lan9662_otp_power(otp, false); ++ ++ return rc; ++} ++ ++static struct nvmem_config otp_config = { ++ .name = "lan9662-otp", ++ .stride = 1, ++ .word_size = 1, ++ .reg_read = lan9662_otp_read, ++ .reg_write = lan9662_otp_write, ++ .size = OTP_MEM_SIZE, ++}; ++ ++static int lan9662_otp_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct nvmem_device *nvmem; ++ struct lan9662_otp *otp; ++ ++ otp = devm_kzalloc(&pdev->dev, sizeof(*otp), GFP_KERNEL); ++ if (!otp) ++ return -ENOMEM; ++ ++ otp->dev = dev; ++ otp->base = devm_platform_ioremap_resource(pdev, 0); ++ if (IS_ERR(otp->base)) ++ return PTR_ERR(otp->base); ++ ++ otp_config.priv = otp; ++ otp_config.dev = dev; ++ ++ nvmem = devm_nvmem_register(dev, &otp_config); ++ ++ return PTR_ERR_OR_ZERO(nvmem); ++} ++ ++static const struct of_device_id lan9662_otp_match[] = { ++ { .compatible = "microchip,lan9662-otp", }, ++ { }, ++}; ++MODULE_DEVICE_TABLE(of, lan9662_otp_match); ++ ++static struct platform_driver lan9662_otp_driver = { ++ .probe = lan9662_otp_probe, ++ .driver = { ++ .name = "lan9662-otp", ++ .of_match_table = lan9662_otp_match, ++ }, ++}; ++module_platform_driver(lan9662_otp_driver); ++ ++MODULE_AUTHOR("Horatiu Vultur "); ++MODULE_DESCRIPTION("lan9662 OTP driver"); ++MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/backport-5.15/807-v6.1-0009-nvmem-u-boot-env-fix-crc32-casting-type.patch b/target/linux/generic/backport-5.15/807-v6.1-0009-nvmem-u-boot-env-fix-crc32-casting-type.patch new file mode 100644 index 0000000000..633a668a96 --- /dev/null +++ b/target/linux/generic/backport-5.15/807-v6.1-0009-nvmem-u-boot-env-fix-crc32-casting-type.patch @@ -0,0 +1,32 @@ +From 3717ca3e0cc8683f93b41d3f06ca79631eb58715 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Fri, 16 Sep 2022 13:21:00 +0100 +Subject: [PATCH] nvmem: u-boot-env: fix crc32 casting type +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This fixes: +drivers/nvmem/u-boot-env.c:141:17: sparse: sparse: cast to restricted __le32 + +Fixes: d5542923f200 ("nvmem: add driver handling U-Boot environment variables") +Reported-by: kernel test robot +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220916122100.170016-14-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/u-boot-env.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/u-boot-env.c ++++ b/drivers/nvmem/u-boot-env.c +@@ -139,7 +139,7 @@ static int u_boot_env_parse(struct u_boo + data_offset = offsetof(struct u_boot_env_image_redundant, data); + break; + } +- crc32 = le32_to_cpu(*(uint32_t *)(buf + crc32_offset)); ++ crc32 = le32_to_cpu(*(__le32 *)(buf + crc32_offset)); + crc32_data_len = priv->mtd->size - crc32_data_offset; + data_len = priv->mtd->size - data_offset; + diff --git a/target/linux/generic/backport-5.15/807-v6.1-0010-nvmem-lan9662-otp-Fix-compatible-string.patch b/target/linux/generic/backport-5.15/807-v6.1-0010-nvmem-lan9662-otp-Fix-compatible-string.patch new file mode 100644 index 0000000000..b663a1328d --- /dev/null +++ b/target/linux/generic/backport-5.15/807-v6.1-0010-nvmem-lan9662-otp-Fix-compatible-string.patch @@ -0,0 +1,34 @@ +From 1aeb122d214b92474c86fde00a03d6e2d69381b5 Mon Sep 17 00:00:00 2001 +From: Horatiu Vultur +Date: Wed, 28 Sep 2022 21:51:12 +0200 +Subject: [PATCH] nvmem: lan9662-otp: Fix compatible string + +The device tree bindings for lan9662-otp expects the compatible string +to be one of following compatible strings: +microchip,lan9662-otpc +microchip,lan9668-otpc + +The problem is that the lan9662-otp driver contains the +microchip,lan9662-otp compatible string instead of +microchip,lan9662-otpc. +Fix this by updating the compatible string in the driver. + +Fixes: 9e8f208ad5229d ("nvmem: lan9662-otp: add support") +Signed-off-by: Horatiu Vultur +Link: https://lore.kernel.org/r/20220928195112.630351-1-horatiu.vultur@microchip.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/lan9662-otpc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/lan9662-otpc.c ++++ b/drivers/nvmem/lan9662-otpc.c +@@ -203,7 +203,7 @@ static int lan9662_otp_probe(struct plat + } + + static const struct of_device_id lan9662_otp_match[] = { +- { .compatible = "microchip,lan9662-otp", }, ++ { .compatible = "microchip,lan9662-otpc", }, + { }, + }; + MODULE_DEVICE_TABLE(of, lan9662_otp_match); diff --git a/target/linux/generic/backport-5.15/807-v6.1-0011-nvmem-u-boot-env-fix-crc32_data_offset-on-redundant-.patch b/target/linux/generic/backport-5.15/807-v6.1-0011-nvmem-u-boot-env-fix-crc32_data_offset-on-redundant-.patch new file mode 100644 index 0000000000..967e891dbd --- /dev/null +++ b/target/linux/generic/backport-5.15/807-v6.1-0011-nvmem-u-boot-env-fix-crc32_data_offset-on-redundant-.patch @@ -0,0 +1,59 @@ +From ee424f7d3960152f5f862bbb6943e59828dc7917 Mon Sep 17 00:00:00 2001 +From: Christian Lamparter +Date: Fri, 4 Nov 2022 17:52:03 +0100 +Subject: [PATCH] nvmem: u-boot-env: fix crc32_data_offset on redundant + u-boot-env + +The Western Digital MyBook Live (PowerPC 464/APM82181) +has a set of redundant u-boot-env. Loading up the driver +the following error: + +| u_boot_env: Invalid calculated CRC32: 0x4f8f2c86 (expected: 0x98b14514) +| u_boot_env: probe of partition@1e000 failed with error -22 + +Looking up the userspace libubootenv utilities source [0], +it looks like the "mark" or "flag" is not part of the +crc32 sum... which is unfortunate :( + +|static int libuboot_load(struct uboot_ctx *ctx) +|{ +|[...] +| if (ctx->redundant) { +| [...] +| offsetdata = offsetof(struct uboot_env_redund, data); +| [...] //-----^^ +| } +| usable_envsize = ctx->size - offsetdata; +| buf[0] = malloc(bufsize); +|[...] +| for (i = 0; i < copies; i++) { +| data = (uint8_t *)(buf[i] + offsetdata); +| uint32_t crc; +| +| ret = devread(ctx, i, buf[i]); +| [...] +| crc = *(uint32_t *)(buf[i] + offsetcrc); +| dev->crc = crc32(0, (uint8_t *)data, usable_envsize); +| + +[0] https://github.com/sbabic/libubootenv/blob/master/src/uboot_env.c#L951 + +Fixes: d5542923f200 ("nvmem: add driver handling U-Boot environment variables") +Signed-off-by: Christian Lamparter +Link: https://lore.kernel.org/r/70a16eae113e08db2390b76e174f4837caa135c3.1667580636.git.chunkeey@gmail.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/u-boot-env.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/u-boot-env.c ++++ b/drivers/nvmem/u-boot-env.c +@@ -135,7 +135,7 @@ static int u_boot_env_parse(struct u_boo + break; + case U_BOOT_FORMAT_REDUNDANT: + crc32_offset = offsetof(struct u_boot_env_image_redundant, crc32); +- crc32_data_offset = offsetof(struct u_boot_env_image_redundant, mark); ++ crc32_data_offset = offsetof(struct u_boot_env_image_redundant, data); + data_offset = offsetof(struct u_boot_env_image_redundant, data); + break; + } diff --git a/target/linux/generic/backport-5.15/807-v6.1-0013-nvmem-lan9662-otp-Change-return-type-of-lan9662_otp_.patch b/target/linux/generic/backport-5.15/807-v6.1-0013-nvmem-lan9662-otp-Change-return-type-of-lan9662_otp_.patch new file mode 100644 index 0000000000..0c842f0793 --- /dev/null +++ b/target/linux/generic/backport-5.15/807-v6.1-0013-nvmem-lan9662-otp-Change-return-type-of-lan9662_otp_.patch @@ -0,0 +1,35 @@ +From 022b68f271de0e53024e6d5e96fee8e76d25eb95 Mon Sep 17 00:00:00 2001 +From: Horatiu Vultur +Date: Fri, 18 Nov 2022 06:38:40 +0000 +Subject: [PATCH] nvmem: lan9662-otp: Change return type of + lan9662_otp_wait_flag_clear() + +The blamed commit introduced the following smatch warning in the +function lan9662_otp_wait_flag_clear: +drivers/nvmem/lan9662-otpc.c:43 lan9662_otp_wait_flag_clear() warn: signedness bug returning '(-110)' + +Fix this by changing the return type of the function +lan9662_otp_wait_flag_clear() to be int instead of bool. + +Fixes: 9e8f208ad5229d ("nvmem: lan9662-otp: add support") +Reported-by: kernel test robot +Reported-by: Dan Carpenter +Signed-off-by: Horatiu Vultur +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20221118063840.6357-5-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/lan9662-otpc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/lan9662-otpc.c ++++ b/drivers/nvmem/lan9662-otpc.c +@@ -36,7 +36,7 @@ struct lan9662_otp { + void __iomem *base; + }; + +-static bool lan9662_otp_wait_flag_clear(void __iomem *reg, u32 flag) ++static int lan9662_otp_wait_flag_clear(void __iomem *reg, u32 flag) + { + u32 val; + diff --git a/target/linux/generic/backport-5.15/808-v6.2-0001-nvmem-stm32-move-STM32MP15_BSEC_NUM_LOWER-in-config.patch b/target/linux/generic/backport-5.15/808-v6.2-0001-nvmem-stm32-move-STM32MP15_BSEC_NUM_LOWER-in-config.patch new file mode 100644 index 0000000000..33759632eb --- /dev/null +++ b/target/linux/generic/backport-5.15/808-v6.2-0001-nvmem-stm32-move-STM32MP15_BSEC_NUM_LOWER-in-config.patch @@ -0,0 +1,82 @@ +From fbfc4ca465a1f8d81bf2d67d95bf7fc67c3cf0c2 Mon Sep 17 00:00:00 2001 +From: Patrick Delaunay +Date: Fri, 18 Nov 2022 06:39:20 +0000 +Subject: [PATCH] nvmem: stm32: move STM32MP15_BSEC_NUM_LOWER in config + +Support STM32MP15_BSEC_NUM_LOWER in stm32 romem config to prepare +the next SoC in STM32MP family. + +Signed-off-by: Patrick Delaunay +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20221118063932.6418-2-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/stm32-romem.c | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +--- a/drivers/nvmem/stm32-romem.c ++++ b/drivers/nvmem/stm32-romem.c +@@ -22,16 +22,15 @@ + /* shadow registers offest */ + #define STM32MP15_BSEC_DATA0 0x200 + +-/* 32 (x 32-bits) lower shadow registers */ +-#define STM32MP15_BSEC_NUM_LOWER 32 +- + struct stm32_romem_cfg { + int size; ++ u8 lower; + }; + + struct stm32_romem_priv { + void __iomem *base; + struct nvmem_config cfg; ++ u8 lower; + }; + + static int stm32_romem_read(void *context, unsigned int offset, void *buf, +@@ -85,7 +84,7 @@ static int stm32_bsec_read(void *context + for (i = roffset; (i < roffset + rbytes); i += 4) { + u32 otp = i >> 2; + +- if (otp < STM32MP15_BSEC_NUM_LOWER) { ++ if (otp < priv->lower) { + /* read lower data from shadow registers */ + val = readl_relaxed( + priv->base + STM32MP15_BSEC_DATA0 + i); +@@ -159,6 +158,8 @@ static int stm32_romem_probe(struct plat + priv->cfg.priv = priv; + priv->cfg.owner = THIS_MODULE; + ++ priv->lower = 0; ++ + cfg = (const struct stm32_romem_cfg *) + of_match_device(dev->driver->of_match_table, dev)->data; + if (!cfg) { +@@ -167,6 +168,7 @@ static int stm32_romem_probe(struct plat + priv->cfg.reg_read = stm32_romem_read; + } else { + priv->cfg.size = cfg->size; ++ priv->lower = cfg->lower; + priv->cfg.reg_read = stm32_bsec_read; + priv->cfg.reg_write = stm32_bsec_write; + } +@@ -174,8 +176,17 @@ static int stm32_romem_probe(struct plat + return PTR_ERR_OR_ZERO(devm_nvmem_register(dev, &priv->cfg)); + } + ++/* ++ * STM32MP15 BSEC OTP regions: 4096 OTP bits (with 3072 effective bits) ++ * => 96 x 32-bits data words ++ * - Lower: 1K bits, 2:1 redundancy, incremental bit programming ++ * => 32 (x 32-bits) lower shadow registers = words 0 to 31 ++ * - Upper: 2K bits, ECC protection, word programming only ++ * => 64 (x 32-bits) = words 32 to 95 ++ */ + static const struct stm32_romem_cfg stm32mp15_bsec_cfg = { +- .size = 384, /* 96 x 32-bits data words */ ++ .size = 384, ++ .lower = 32, + }; + + static const struct of_device_id stm32_romem_of_match[] = { diff --git a/target/linux/generic/backport-5.15/808-v6.2-0002-nvmem-stm32-add-warning-when-upper-OTPs-are-updated.patch b/target/linux/generic/backport-5.15/808-v6.2-0002-nvmem-stm32-add-warning-when-upper-OTPs-are-updated.patch new file mode 100644 index 0000000000..5791df2606 --- /dev/null +++ b/target/linux/generic/backport-5.15/808-v6.2-0002-nvmem-stm32-add-warning-when-upper-OTPs-are-updated.patch @@ -0,0 +1,34 @@ +From d61784e6410f3df2028e6eb91b06ffed37a660e0 Mon Sep 17 00:00:00 2001 +From: Patrick Delaunay +Date: Fri, 18 Nov 2022 06:39:21 +0000 +Subject: [PATCH] nvmem: stm32: add warning when upper OTPs are updated + +As the upper OTPs are ECC protected, they support only one 32 bits word +programming. +For a second modification of this word, these ECC become invalid and +this OTP will be no more accessible, the shadowed value is invalid. + +This patch adds a warning to indicate an upper OTP update, because this +operation is dangerous as OTP is not locked by the driver after the first +update to avoid a second update. + +Signed-off-by: Patrick Delaunay +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20221118063932.6418-3-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/stm32-romem.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/nvmem/stm32-romem.c ++++ b/drivers/nvmem/stm32-romem.c +@@ -132,6 +132,9 @@ static int stm32_bsec_write(void *contex + } + } + ++ if (offset + bytes >= priv->lower * 4) ++ dev_warn(dev, "Update of upper OTPs with ECC protection (word programming, only once)\n"); ++ + return 0; + } + diff --git a/target/linux/generic/backport-5.15/808-v6.2-0003-nvmem-stm32-add-nvmem-type-attribute.patch b/target/linux/generic/backport-5.15/808-v6.2-0003-nvmem-stm32-add-nvmem-type-attribute.patch new file mode 100644 index 0000000000..b83ad69c6b --- /dev/null +++ b/target/linux/generic/backport-5.15/808-v6.2-0003-nvmem-stm32-add-nvmem-type-attribute.patch @@ -0,0 +1,26 @@ +From a3816a7d7c097c1da46aad5f5d1e229b607dce04 Mon Sep 17 00:00:00 2001 +From: Patrick Delaunay +Date: Fri, 18 Nov 2022 06:39:22 +0000 +Subject: [PATCH] nvmem: stm32: add nvmem type attribute + +Inform NVMEM framework of type attribute for stm32-romem as NVMEM_TYPE_OTP +so userspace is able to know how the data is stored in BSEC. + +Signed-off-by: Patrick Delaunay +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20221118063932.6418-4-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/stm32-romem.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/nvmem/stm32-romem.c ++++ b/drivers/nvmem/stm32-romem.c +@@ -160,6 +160,7 @@ static int stm32_romem_probe(struct plat + priv->cfg.dev = dev; + priv->cfg.priv = priv; + priv->cfg.owner = THIS_MODULE; ++ priv->cfg.type = NVMEM_TYPE_OTP; + + priv->lower = 0; + diff --git a/target/linux/generic/backport-5.15/808-v6.2-0004-nvmem-stm32-fix-spelling-typo-in-comment.patch b/target/linux/generic/backport-5.15/808-v6.2-0004-nvmem-stm32-fix-spelling-typo-in-comment.patch new file mode 100644 index 0000000000..52ba1e65b5 --- /dev/null +++ b/target/linux/generic/backport-5.15/808-v6.2-0004-nvmem-stm32-fix-spelling-typo-in-comment.patch @@ -0,0 +1,27 @@ +From 06aac0e11960a7ddccc1888326b5906d017e0f24 Mon Sep 17 00:00:00 2001 +From: Jiangshan Yi +Date: Fri, 18 Nov 2022 06:39:24 +0000 +Subject: [PATCH] nvmem: stm32: fix spelling typo in comment + +Fix spelling typo in comment. + +Reported-by: k2ci +Signed-off-by: Jiangshan Yi +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20221118063932.6418-6-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/stm32-romem.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/stm32-romem.c ++++ b/drivers/nvmem/stm32-romem.c +@@ -19,7 +19,7 @@ + #define STM32_SMC_WRITE_SHADOW 0x03 + #define STM32_SMC_READ_OTP 0x04 + +-/* shadow registers offest */ ++/* shadow registers offset */ + #define STM32MP15_BSEC_DATA0 0x200 + + struct stm32_romem_cfg { diff --git a/target/linux/generic/backport-5.15/808-v6.2-0005-nvmem-Kconfig-Fix-spelling-mistake-controlls-control.patch b/target/linux/generic/backport-5.15/808-v6.2-0005-nvmem-Kconfig-Fix-spelling-mistake-controlls-control.patch new file mode 100644 index 0000000000..8f024f4c1a --- /dev/null +++ b/target/linux/generic/backport-5.15/808-v6.2-0005-nvmem-Kconfig-Fix-spelling-mistake-controlls-control.patch @@ -0,0 +1,27 @@ +From fb817c4ef63e8cfb6e77ae4a2875ae854c80708f Mon Sep 17 00:00:00 2001 +From: Colin Ian King +Date: Fri, 18 Nov 2022 06:39:26 +0000 +Subject: [PATCH] nvmem: Kconfig: Fix spelling mistake "controlls" -> + "controls" + +There is a spelling mistake in a Kconfig description. Fix it. + +Signed-off-by: Colin Ian King +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20221118063932.6418-8-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -164,7 +164,7 @@ config NVMEM_MICROCHIP_OTPC + depends on ARCH_AT91 || COMPILE_TEST + help + This driver enable the OTP controller available on Microchip SAMA7G5 +- SoCs. It controlls the access to the OTP memory connected to it. ++ SoCs. It controls the access to the OTP memory connected to it. + + config NVMEM_MTK_EFUSE + tristate "Mediatek SoCs EFUSE support" diff --git a/target/linux/generic/backport-5.15/808-v6.2-0006-nvmem-u-boot-env-add-Broadcom-format-support.patch b/target/linux/generic/backport-5.15/808-v6.2-0006-nvmem-u-boot-env-add-Broadcom-format-support.patch new file mode 100644 index 0000000000..861386ad31 --- /dev/null +++ b/target/linux/generic/backport-5.15/808-v6.2-0006-nvmem-u-boot-env-add-Broadcom-format-support.patch @@ -0,0 +1,67 @@ +From ada84d07af6097b2addd18262668ce6cb9e15206 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Fri, 18 Nov 2022 06:39:27 +0000 +Subject: [PATCH] nvmem: u-boot-env: add Broadcom format support +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Broadcom uses U-Boot for a lot of their bcmbca familiy chipsets. They +decided to store U-Boot environment data inside U-Boot partition and to +use a custom header (with "uEnv" magic and env data length). + +Add support for Broadcom's specific binding and their custom format. + +Ref: 6b0584c19d87 ("dt-bindings: nvmem: u-boot,env: add Broadcom's variant binding") +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20221118063932.6418-9-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/u-boot-env.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +--- a/drivers/nvmem/u-boot-env.c ++++ b/drivers/nvmem/u-boot-env.c +@@ -16,6 +16,7 @@ + enum u_boot_env_format { + U_BOOT_FORMAT_SINGLE, + U_BOOT_FORMAT_REDUNDANT, ++ U_BOOT_FORMAT_BROADCOM, + }; + + struct u_boot_env { +@@ -40,6 +41,13 @@ struct u_boot_env_image_redundant { + uint8_t data[]; + } __packed; + ++struct u_boot_env_image_broadcom { ++ __le32 magic; ++ __le32 len; ++ __le32 crc32; ++ uint8_t data[0]; ++} __packed; ++ + static int u_boot_env_read(void *context, unsigned int offset, void *val, + size_t bytes) + { +@@ -138,6 +146,11 @@ static int u_boot_env_parse(struct u_boo + crc32_data_offset = offsetof(struct u_boot_env_image_redundant, data); + data_offset = offsetof(struct u_boot_env_image_redundant, data); + break; ++ case U_BOOT_FORMAT_BROADCOM: ++ crc32_offset = offsetof(struct u_boot_env_image_broadcom, crc32); ++ crc32_data_offset = offsetof(struct u_boot_env_image_broadcom, data); ++ data_offset = offsetof(struct u_boot_env_image_broadcom, data); ++ break; + } + crc32 = le32_to_cpu(*(__le32 *)(buf + crc32_offset)); + crc32_data_len = priv->mtd->size - crc32_data_offset; +@@ -202,6 +215,7 @@ static const struct of_device_id u_boot_ + { .compatible = "u-boot,env", .data = (void *)U_BOOT_FORMAT_SINGLE, }, + { .compatible = "u-boot,env-redundant-bool", .data = (void *)U_BOOT_FORMAT_REDUNDANT, }, + { .compatible = "u-boot,env-redundant-count", .data = (void *)U_BOOT_FORMAT_REDUNDANT, }, ++ { .compatible = "brcm,env", .data = (void *)U_BOOT_FORMAT_BROADCOM, }, + {}, + }; + diff --git a/target/linux/generic/backport-5.15/808-v6.2-0007-nvmem-brcm_nvram-Add-check-for-kzalloc.patch b/target/linux/generic/backport-5.15/808-v6.2-0007-nvmem-brcm_nvram-Add-check-for-kzalloc.patch new file mode 100644 index 0000000000..14108b5927 --- /dev/null +++ b/target/linux/generic/backport-5.15/808-v6.2-0007-nvmem-brcm_nvram-Add-check-for-kzalloc.patch @@ -0,0 +1,30 @@ +From b0576ade3aaf24b376ea1a4406ae138e2a22b0c0 Mon Sep 17 00:00:00 2001 +From: Jiasheng Jiang +Date: Fri, 27 Jan 2023 10:40:06 +0000 +Subject: [PATCH] nvmem: brcm_nvram: Add check for kzalloc + +Add the check for the return value of kzalloc in order to avoid +NULL pointer dereference. + +Fixes: 6e977eaa8280 ("nvmem: brcm_nvram: parse NVRAM content into NVMEM cells") +Cc: stable@vger.kernel.org +Signed-off-by: Jiasheng Jiang +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230127104015.23839-2-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/brcm_nvram.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/nvmem/brcm_nvram.c ++++ b/drivers/nvmem/brcm_nvram.c +@@ -97,6 +97,9 @@ static int brcm_nvram_parse(struct brcm_ + len = le32_to_cpu(header.len); + + data = kzalloc(len, GFP_KERNEL); ++ if (!data) ++ return -ENOMEM; ++ + memcpy_fromio(data, priv->base, len); + data[len - 1] = '\0'; + diff --git a/target/linux/generic/backport-5.15/808-v6.2-0008-nvmem-sunxi_sid-Always-use-32-bit-MMIO-reads.patch b/target/linux/generic/backport-5.15/808-v6.2-0008-nvmem-sunxi_sid-Always-use-32-bit-MMIO-reads.patch new file mode 100644 index 0000000000..632b01cb2a --- /dev/null +++ b/target/linux/generic/backport-5.15/808-v6.2-0008-nvmem-sunxi_sid-Always-use-32-bit-MMIO-reads.patch @@ -0,0 +1,55 @@ +From c151d5ed8e8fe0474bd61dce7f2076ca5916c683 Mon Sep 17 00:00:00 2001 +From: Samuel Holland +Date: Fri, 27 Jan 2023 10:40:07 +0000 +Subject: [PATCH] nvmem: sunxi_sid: Always use 32-bit MMIO reads + +The SID SRAM on at least some SoCs (A64 and D1) returns different values +when read with bus cycles narrower than 32 bits. This is not immediately +obvious, because memcpy_fromio() uses word-size accesses as long as +enough data is being copied. + +The vendor driver always uses 32-bit MMIO reads, so do the same here. +This is faster than the register-based method, which is currently used +as a workaround on A64. And it fixes the values returned on D1, where +the SRAM method was being used. + +The special case for the last word is needed to maintain .word_size == 1 +for sysfs ABI compatibility, as noted previously in commit de2a3eaea552 +("nvmem: sunxi_sid: Optimize register read-out method"). + +Fixes: 07ae4fde9efa ("nvmem: sunxi_sid: Add support for D1 variant") +Cc: stable@vger.kernel.org +Tested-by: Heiko Stuebner +Signed-off-by: Samuel Holland +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230127104015.23839-3-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/sunxi_sid.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +--- a/drivers/nvmem/sunxi_sid.c ++++ b/drivers/nvmem/sunxi_sid.c +@@ -41,8 +41,21 @@ static int sunxi_sid_read(void *context, + void *val, size_t bytes) + { + struct sunxi_sid *sid = context; ++ u32 word; + +- memcpy_fromio(val, sid->base + sid->value_offset + offset, bytes); ++ /* .stride = 4 so offset is guaranteed to be aligned */ ++ __ioread32_copy(val, sid->base + sid->value_offset + offset, bytes / 4); ++ ++ val += round_down(bytes, 4); ++ offset += round_down(bytes, 4); ++ bytes = bytes % 4; ++ ++ if (!bytes) ++ return 0; ++ ++ /* Handle any trailing bytes */ ++ word = readl_relaxed(sid->base + sid->value_offset + offset); ++ memcpy(val, &word, bytes); + + return 0; + } diff --git a/target/linux/generic/backport-5.15/808-v6.2-0013-nvmem-core-fix-device-node-refcounting.patch b/target/linux/generic/backport-5.15/808-v6.2-0013-nvmem-core-fix-device-node-refcounting.patch new file mode 100644 index 0000000000..a229c303ad --- /dev/null +++ b/target/linux/generic/backport-5.15/808-v6.2-0013-nvmem-core-fix-device-node-refcounting.patch @@ -0,0 +1,48 @@ +From edcf2fb660526b5ed29f93bd17328a2b4835c8b2 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Fri, 27 Jan 2023 10:40:12 +0000 +Subject: [PATCH] nvmem: core: fix device node refcounting + +In of_nvmem_cell_get(), of_get_next_parent() is used on cell_np. This +will decrement the refcount on cell_np, but cell_np is still used later +in the code. Use of_get_parent() instead and of_node_put() in the +appropriate places. + +Fixes: 69aba7948cbe ("nvmem: Add a simple NVMEM framework for consumers") +Fixes: 7ae6478b304b ("nvmem: core: rework nvmem cell instance creation") +Cc: stable@vger.kernel.org +Signed-off-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230127104015.23839-8-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -1237,16 +1237,21 @@ struct nvmem_cell *of_nvmem_cell_get(str + if (!cell_np) + return ERR_PTR(-ENOENT); + +- nvmem_np = of_get_next_parent(cell_np); +- if (!nvmem_np) ++ nvmem_np = of_get_parent(cell_np); ++ if (!nvmem_np) { ++ of_node_put(cell_np); + return ERR_PTR(-EINVAL); ++ } + + nvmem = __nvmem_device_get(nvmem_np, device_match_of_node); + of_node_put(nvmem_np); +- if (IS_ERR(nvmem)) ++ if (IS_ERR(nvmem)) { ++ of_node_put(cell_np); + return ERR_CAST(nvmem); ++ } + + cell_entry = nvmem_find_cell_entry_by_node(nvmem, cell_np); ++ of_node_put(cell_np); + if (!cell_entry) { + __nvmem_device_put(nvmem); + return ERR_PTR(-ENOENT); diff --git a/target/linux/generic/backport-5.15/809-v6.3-0001-nvmem-core-remove-spurious-white-space.patch b/target/linux/generic/backport-5.15/809-v6.3-0001-nvmem-core-remove-spurious-white-space.patch new file mode 100644 index 0000000000..01400fd490 --- /dev/null +++ b/target/linux/generic/backport-5.15/809-v6.3-0001-nvmem-core-remove-spurious-white-space.patch @@ -0,0 +1,26 @@ +From 2e8dc541ae207349b51c65391be625ffe1f86e0c Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 6 Feb 2023 13:43:41 +0000 +Subject: [PATCH] nvmem: core: remove spurious white space + +Remove a spurious white space in for the ida_alloc() call. + +Signed-off-by: Russell King (Oracle) +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-8-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -764,7 +764,7 @@ struct nvmem_device *nvmem_register(cons + if (!nvmem) + return ERR_PTR(-ENOMEM); + +- rval = ida_alloc(&nvmem_ida, GFP_KERNEL); ++ rval = ida_alloc(&nvmem_ida, GFP_KERNEL); + if (rval < 0) { + kfree(nvmem); + return ERR_PTR(rval); diff --git a/target/linux/generic/backport-5.15/809-v6.3-0002-nvmem-core-add-an-index-parameter-to-the-cell.patch b/target/linux/generic/backport-5.15/809-v6.3-0002-nvmem-core-add-an-index-parameter-to-the-cell.patch new file mode 100644 index 0000000000..454d3bf0ed --- /dev/null +++ b/target/linux/generic/backport-5.15/809-v6.3-0002-nvmem-core-add-an-index-parameter-to-the-cell.patch @@ -0,0 +1,180 @@ +From 5d8e6e6c10a3d37486d263b16ddc15991a7e4a88 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Mon, 6 Feb 2023 13:43:46 +0000 +Subject: [PATCH] nvmem: core: add an index parameter to the cell + +Sometimes a cell can represend multiple values. For example, a base +ethernet address stored in the NVMEM can be expanded into multiple +discreet ones by adding an offset. + +For this use case, introduce an index parameter which is then used to +distiguish between values. This parameter will then be passed to the +post process hook which can then use it to create different values +during reading. + +At the moment, there is only support for the device tree path. You can +add the index to the phandle, e.g. + + &net { + nvmem-cells = <&base_mac_address 2>; + nvmem-cell-names = "mac-address"; + }; + + &nvmem_provider { + base_mac_address: base-mac-address@0 { + #nvmem-cell-cells = <1>; + reg = <0 6>; + }; + }; + +Signed-off-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-13-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 37 ++++++++++++++++++++++++---------- + drivers/nvmem/imx-ocotp.c | 4 ++-- + include/linux/nvmem-provider.h | 4 ++-- + 3 files changed, 30 insertions(+), 15 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -60,6 +60,7 @@ struct nvmem_cell_entry { + struct nvmem_cell { + struct nvmem_cell_entry *entry; + const char *id; ++ int index; + }; + + static DEFINE_MUTEX(nvmem_mutex); +@@ -1122,7 +1123,8 @@ struct nvmem_device *devm_nvmem_device_g + } + EXPORT_SYMBOL_GPL(devm_nvmem_device_get); + +-static struct nvmem_cell *nvmem_create_cell(struct nvmem_cell_entry *entry, const char *id) ++static struct nvmem_cell *nvmem_create_cell(struct nvmem_cell_entry *entry, ++ const char *id, int index) + { + struct nvmem_cell *cell; + const char *name = NULL; +@@ -1141,6 +1143,7 @@ static struct nvmem_cell *nvmem_create_c + + cell->id = name; + cell->entry = entry; ++ cell->index = index; + + return cell; + } +@@ -1179,7 +1182,7 @@ nvmem_cell_get_from_lookup(struct device + __nvmem_device_put(nvmem); + cell = ERR_PTR(-ENOENT); + } else { +- cell = nvmem_create_cell(cell_entry, con_id); ++ cell = nvmem_create_cell(cell_entry, con_id, 0); + if (IS_ERR(cell)) + __nvmem_device_put(nvmem); + } +@@ -1227,15 +1230,27 @@ struct nvmem_cell *of_nvmem_cell_get(str + struct nvmem_device *nvmem; + struct nvmem_cell_entry *cell_entry; + struct nvmem_cell *cell; ++ struct of_phandle_args cell_spec; + int index = 0; ++ int cell_index = 0; ++ int ret; + + /* if cell name exists, find index to the name */ + if (id) + index = of_property_match_string(np, "nvmem-cell-names", id); + +- cell_np = of_parse_phandle(np, "nvmem-cells", index); +- if (!cell_np) +- return ERR_PTR(-ENOENT); ++ ret = of_parse_phandle_with_optional_args(np, "nvmem-cells", ++ "#nvmem-cell-cells", ++ index, &cell_spec); ++ if (ret) ++ return ERR_PTR(ret); ++ ++ if (cell_spec.args_count > 1) ++ return ERR_PTR(-EINVAL); ++ ++ cell_np = cell_spec.np; ++ if (cell_spec.args_count) ++ cell_index = cell_spec.args[0]; + + nvmem_np = of_get_parent(cell_np); + if (!nvmem_np) { +@@ -1257,7 +1272,7 @@ struct nvmem_cell *of_nvmem_cell_get(str + return ERR_PTR(-ENOENT); + } + +- cell = nvmem_create_cell(cell_entry, id); ++ cell = nvmem_create_cell(cell_entry, id, cell_index); + if (IS_ERR(cell)) + __nvmem_device_put(nvmem); + +@@ -1410,8 +1425,8 @@ static void nvmem_shift_read_buffer_in_p + } + + static int __nvmem_cell_read(struct nvmem_device *nvmem, +- struct nvmem_cell_entry *cell, +- void *buf, size_t *len, const char *id) ++ struct nvmem_cell_entry *cell, ++ void *buf, size_t *len, const char *id, int index) + { + int rc; + +@@ -1425,7 +1440,7 @@ static int __nvmem_cell_read(struct nvme + nvmem_shift_read_buffer_in_place(cell, buf); + + if (nvmem->cell_post_process) { +- rc = nvmem->cell_post_process(nvmem->priv, id, ++ rc = nvmem->cell_post_process(nvmem->priv, id, index, + cell->offset, buf, cell->bytes); + if (rc) + return rc; +@@ -1460,7 +1475,7 @@ void *nvmem_cell_read(struct nvmem_cell + if (!buf) + return ERR_PTR(-ENOMEM); + +- rc = __nvmem_cell_read(nvmem, cell->entry, buf, len, cell->id); ++ rc = __nvmem_cell_read(nvmem, cell->entry, buf, len, cell->id, cell->index); + if (rc) { + kfree(buf); + return ERR_PTR(rc); +@@ -1773,7 +1788,7 @@ ssize_t nvmem_device_cell_read(struct nv + if (rc) + return rc; + +- rc = __nvmem_cell_read(nvmem, &cell, buf, &len, NULL); ++ rc = __nvmem_cell_read(nvmem, &cell, buf, &len, NULL, 0); + if (rc) + return rc; + +--- a/drivers/nvmem/imx-ocotp.c ++++ b/drivers/nvmem/imx-ocotp.c +@@ -222,8 +222,8 @@ read_end: + return ret; + } + +-static int imx_ocotp_cell_pp(void *context, const char *id, unsigned int offset, +- void *data, size_t bytes) ++static int imx_ocotp_cell_pp(void *context, const char *id, int index, ++ unsigned int offset, void *data, size_t bytes) + { + struct ocotp_priv *priv = context; + +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -20,8 +20,8 @@ typedef int (*nvmem_reg_read_t)(void *pr + typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset, + void *val, size_t bytes); + /* used for vendor specific post processing of cell data */ +-typedef int (*nvmem_cell_post_process_t)(void *priv, const char *id, unsigned int offset, +- void *buf, size_t bytes); ++typedef int (*nvmem_cell_post_process_t)(void *priv, const char *id, int index, ++ unsigned int offset, void *buf, size_t bytes); + + enum nvmem_type { + NVMEM_TYPE_UNKNOWN = 0, diff --git a/target/linux/generic/backport-5.15/809-v6.3-0003-nvmem-core-move-struct-nvmem_cell_info-to-nvmem-prov.patch b/target/linux/generic/backport-5.15/809-v6.3-0003-nvmem-core-move-struct-nvmem_cell_info-to-nvmem-prov.patch new file mode 100644 index 0000000000..f3829b3e17 --- /dev/null +++ b/target/linux/generic/backport-5.15/809-v6.3-0003-nvmem-core-move-struct-nvmem_cell_info-to-nvmem-prov.patch @@ -0,0 +1,78 @@ +From fbd03d27776c6121a483921601418e3c8f0ff37e Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Mon, 6 Feb 2023 13:43:47 +0000 +Subject: [PATCH] nvmem: core: move struct nvmem_cell_info to nvmem-provider.h + +struct nvmem_cell_info is used to describe a cell. Thus this should +really be in the nvmem-provider's header. There are two (unused) nvmem +access methods which use the nvmem_cell_info to describe the cell to be +accesses. One can argue, that they will create a cell before accessing, +thus they are both a provider and a consumer. + +struct nvmem_cell_info will get used more and more by nvmem-providers, +don't force them to also include the consumer header, although they are +not. + +Signed-off-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-14-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + include/linux/nvmem-consumer.h | 10 +--------- + include/linux/nvmem-provider.h | 19 ++++++++++++++++++- + 2 files changed, 19 insertions(+), 10 deletions(-) + +--- a/include/linux/nvmem-consumer.h ++++ b/include/linux/nvmem-consumer.h +@@ -18,15 +18,7 @@ struct device_node; + /* consumer cookie */ + struct nvmem_cell; + struct nvmem_device; +- +-struct nvmem_cell_info { +- const char *name; +- unsigned int offset; +- unsigned int bytes; +- unsigned int bit_offset; +- unsigned int nbits; +- struct device_node *np; +-}; ++struct nvmem_cell_info; + + /** + * struct nvmem_cell_lookup - cell lookup entry +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -14,7 +14,6 @@ + #include + + struct nvmem_device; +-struct nvmem_cell_info; + typedef int (*nvmem_reg_read_t)(void *priv, unsigned int offset, + void *val, size_t bytes); + typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset, +@@ -48,6 +47,24 @@ struct nvmem_keepout { + }; + + /** ++ * struct nvmem_cell_info - NVMEM cell description ++ * @name: Name. ++ * @offset: Offset within the NVMEM device. ++ * @bytes: Length of the cell. ++ * @bit_offset: Bit offset if cell is smaller than a byte. ++ * @nbits: Number of bits. ++ * @np: Optional device_node pointer. ++ */ ++struct nvmem_cell_info { ++ const char *name; ++ unsigned int offset; ++ unsigned int bytes; ++ unsigned int bit_offset; ++ unsigned int nbits; ++ struct device_node *np; ++}; ++ ++/** + * struct nvmem_config - NVMEM device configuration + * + * @dev: Parent device. diff --git a/target/linux/generic/backport-5.15/809-v6.3-0004-nvmem-core-drop-the-removal-of-the-cells-in-nvmem_ad.patch b/target/linux/generic/backport-5.15/809-v6.3-0004-nvmem-core-drop-the-removal-of-the-cells-in-nvmem_ad.patch new file mode 100644 index 0000000000..8f996eab34 --- /dev/null +++ b/target/linux/generic/backport-5.15/809-v6.3-0004-nvmem-core-drop-the-removal-of-the-cells-in-nvmem_ad.patch @@ -0,0 +1,65 @@ +From cc5bdd323dde6494623f3ffe3a5b887fa21cd375 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Mon, 6 Feb 2023 13:43:48 +0000 +Subject: [PATCH] nvmem: core: drop the removal of the cells in + nvmem_add_cells() + +If nvmem_add_cells() fails, the whole nvmem_register() will fail +and the cells will then be removed anyway. This is a preparation +to introduce a nvmem_add_one_cell() which can then be used by +nvmem_add_cells(). + +This is then the same to what nvmem_add_cells_from_table() and +nvmem_add_cells_from_of() do. + +Signed-off-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-15-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 14 ++++---------- + 1 file changed, 4 insertions(+), 10 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -515,7 +515,7 @@ static int nvmem_add_cells(struct nvmem_ + int ncells) + { + struct nvmem_cell_entry **cells; +- int i, rval; ++ int i, rval = 0; + + cells = kcalloc(ncells, sizeof(*cells), GFP_KERNEL); + if (!cells) +@@ -525,28 +525,22 @@ static int nvmem_add_cells(struct nvmem_ + cells[i] = kzalloc(sizeof(**cells), GFP_KERNEL); + if (!cells[i]) { + rval = -ENOMEM; +- goto err; ++ goto out; + } + + rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, &info[i], cells[i]); + if (rval) { + kfree(cells[i]); +- goto err; ++ goto out; + } + + nvmem_cell_entry_add(cells[i]); + } + ++out: + /* remove tmp array */ + kfree(cells); + +- return 0; +-err: +- while (i--) +- nvmem_cell_entry_drop(cells[i]); +- +- kfree(cells); +- + return rval; + } + diff --git a/target/linux/generic/backport-5.15/809-v6.3-0005-nvmem-core-add-nvmem_add_one_cell.patch b/target/linux/generic/backport-5.15/809-v6.3-0005-nvmem-core-add-nvmem_add_one_cell.patch new file mode 100644 index 0000000000..711ce229b2 --- /dev/null +++ b/target/linux/generic/backport-5.15/809-v6.3-0005-nvmem-core-add-nvmem_add_one_cell.patch @@ -0,0 +1,122 @@ +From 2ded6830d376d5e7bf43d59f7f7fdf1a59abc676 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Mon, 6 Feb 2023 13:43:49 +0000 +Subject: [PATCH] nvmem: core: add nvmem_add_one_cell() + +Add a new function to add exactly one cell. This will be used by the +nvmem layout drivers to add custom cells. In contrast to the +nvmem_add_cells(), this has the advantage that we don't have to assemble +a list of cells on runtime. + +Signed-off-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-16-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 59 ++++++++++++++++++++-------------- + include/linux/nvmem-provider.h | 8 +++++ + 2 files changed, 43 insertions(+), 24 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -502,6 +502,36 @@ static int nvmem_cell_info_to_nvmem_cell + } + + /** ++ * nvmem_add_one_cell() - Add one cell information to an nvmem device ++ * ++ * @nvmem: nvmem device to add cells to. ++ * @info: nvmem cell info to add to the device ++ * ++ * Return: 0 or negative error code on failure. ++ */ ++int nvmem_add_one_cell(struct nvmem_device *nvmem, ++ const struct nvmem_cell_info *info) ++{ ++ struct nvmem_cell_entry *cell; ++ int rval; ++ ++ cell = kzalloc(sizeof(*cell), GFP_KERNEL); ++ if (!cell) ++ return -ENOMEM; ++ ++ rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, info, cell); ++ if (rval) { ++ kfree(cell); ++ return rval; ++ } ++ ++ nvmem_cell_entry_add(cell); ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(nvmem_add_one_cell); ++ ++/** + * nvmem_add_cells() - Add cell information to an nvmem device + * + * @nvmem: nvmem device to add cells to. +@@ -514,34 +544,15 @@ static int nvmem_add_cells(struct nvmem_ + const struct nvmem_cell_info *info, + int ncells) + { +- struct nvmem_cell_entry **cells; +- int i, rval = 0; +- +- cells = kcalloc(ncells, sizeof(*cells), GFP_KERNEL); +- if (!cells) +- return -ENOMEM; ++ int i, rval; + + for (i = 0; i < ncells; i++) { +- cells[i] = kzalloc(sizeof(**cells), GFP_KERNEL); +- if (!cells[i]) { +- rval = -ENOMEM; +- goto out; +- } +- +- rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, &info[i], cells[i]); +- if (rval) { +- kfree(cells[i]); +- goto out; +- } +- +- nvmem_cell_entry_add(cells[i]); ++ rval = nvmem_add_one_cell(nvmem, &info[i]); ++ if (rval) ++ return rval; + } + +-out: +- /* remove tmp array */ +- kfree(cells); +- +- return rval; ++ return 0; + } + + /** +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -153,6 +153,9 @@ struct nvmem_device *devm_nvmem_register + void nvmem_add_cell_table(struct nvmem_cell_table *table); + void nvmem_del_cell_table(struct nvmem_cell_table *table); + ++int nvmem_add_one_cell(struct nvmem_device *nvmem, ++ const struct nvmem_cell_info *info); ++ + #else + + static inline struct nvmem_device *nvmem_register(const struct nvmem_config *c) +@@ -170,6 +173,11 @@ devm_nvmem_register(struct device *dev, + + static inline void nvmem_add_cell_table(struct nvmem_cell_table *table) {} + static inline void nvmem_del_cell_table(struct nvmem_cell_table *table) {} ++static inline int nvmem_add_one_cell(struct nvmem_device *nvmem, ++ const struct nvmem_cell_info *info) ++{ ++ return -EOPNOTSUPP; ++} + + #endif /* CONFIG_NVMEM */ + #endif /* ifndef _LINUX_NVMEM_PROVIDER_H */ diff --git a/target/linux/generic/backport-5.15/809-v6.3-0006-nvmem-core-use-nvmem_add_one_cell-in-nvmem_add_cells.patch b/target/linux/generic/backport-5.15/809-v6.3-0006-nvmem-core-use-nvmem_add_one_cell-in-nvmem_add_cells.patch new file mode 100644 index 0000000000..e1791e5c83 --- /dev/null +++ b/target/linux/generic/backport-5.15/809-v6.3-0006-nvmem-core-use-nvmem_add_one_cell-in-nvmem_add_cells.patch @@ -0,0 +1,93 @@ +From 50014d659617dc58780a5d31ceb76c82779a9d8b Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Mon, 6 Feb 2023 13:43:50 +0000 +Subject: [PATCH] nvmem: core: use nvmem_add_one_cell() in + nvmem_add_cells_from_of() + +Convert nvmem_add_cells_from_of() to use the new nvmem_add_one_cell(). +This will remove duplicate code and it will make it possible to add a +hook to a nvmem layout in between, which can change fields before the +cell is finally added. + +Signed-off-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-17-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 45 ++++++++++++++------------------------------ + 1 file changed, 14 insertions(+), 31 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -688,15 +688,14 @@ static int nvmem_validate_keepouts(struc + + static int nvmem_add_cells_from_of(struct nvmem_device *nvmem) + { +- struct device_node *parent, *child; + struct device *dev = &nvmem->dev; +- struct nvmem_cell_entry *cell; ++ struct device_node *child; + const __be32 *addr; +- int len; ++ int len, ret; + +- parent = dev->of_node; ++ for_each_child_of_node(dev->of_node, child) { ++ struct nvmem_cell_info info = {0}; + +- for_each_child_of_node(parent, child) { + addr = of_get_property(child, "reg", &len); + if (!addr) + continue; +@@ -706,40 +705,24 @@ static int nvmem_add_cells_from_of(struc + return -EINVAL; + } + +- cell = kzalloc(sizeof(*cell), GFP_KERNEL); +- if (!cell) { +- of_node_put(child); +- return -ENOMEM; +- } +- +- cell->nvmem = nvmem; +- cell->offset = be32_to_cpup(addr++); +- cell->bytes = be32_to_cpup(addr); +- cell->name = kasprintf(GFP_KERNEL, "%pOFn", child); ++ info.offset = be32_to_cpup(addr++); ++ info.bytes = be32_to_cpup(addr); ++ info.name = kasprintf(GFP_KERNEL, "%pOFn", child); + + addr = of_get_property(child, "bits", &len); + if (addr && len == (2 * sizeof(u32))) { +- cell->bit_offset = be32_to_cpup(addr++); +- cell->nbits = be32_to_cpup(addr); ++ info.bit_offset = be32_to_cpup(addr++); ++ info.nbits = be32_to_cpup(addr); + } + +- if (cell->nbits) +- cell->bytes = DIV_ROUND_UP( +- cell->nbits + cell->bit_offset, +- BITS_PER_BYTE); +- +- if (!IS_ALIGNED(cell->offset, nvmem->stride)) { +- dev_err(dev, "cell %s unaligned to nvmem stride %d\n", +- cell->name, nvmem->stride); +- /* Cells already added will be freed later. */ +- kfree_const(cell->name); +- kfree(cell); ++ info.np = of_node_get(child); ++ ++ ret = nvmem_add_one_cell(nvmem, &info); ++ kfree(info.name); ++ if (ret) { + of_node_put(child); +- return -EINVAL; ++ return ret; + } +- +- cell->np = of_node_get(child); +- nvmem_cell_entry_add(cell); + } + + return 0; diff --git a/target/linux/generic/backport-5.15/809-v6.3-0007-nvmem-stm32-add-OP-TEE-support-for-STM32MP13x.patch b/target/linux/generic/backport-5.15/809-v6.3-0007-nvmem-stm32-add-OP-TEE-support-for-STM32MP13x.patch new file mode 100644 index 0000000000..172a78b76a --- /dev/null +++ b/target/linux/generic/backport-5.15/809-v6.3-0007-nvmem-stm32-add-OP-TEE-support-for-STM32MP13x.patch @@ -0,0 +1,562 @@ +From 6a0bc3522e746025e2d9a63ab2cb5d7062c2d39c Mon Sep 17 00:00:00 2001 +From: Patrick Delaunay +Date: Mon, 6 Feb 2023 13:43:51 +0000 +Subject: [PATCH] nvmem: stm32: add OP-TEE support for STM32MP13x + +For boot with OP-TEE on STM32MP13, the communication with the secure +world no more use STMicroelectronics SMC but communication with the +STM32MP BSEC TA, for data access (read/write) or lock operation: +- all the request are sent to OP-TEE trusted application, +- for upper OTP with ECC protection and with word programming only + each OTP are permanently locked when programmed to avoid ECC error + on the second write operation + +Signed-off-by: Patrick Delaunay +Reviewed-by: Etienne Carriere +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-18-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 11 + + drivers/nvmem/Makefile | 1 + + drivers/nvmem/stm32-bsec-optee-ta.c | 298 ++++++++++++++++++++++++++++ + drivers/nvmem/stm32-bsec-optee-ta.h | 80 ++++++++ + drivers/nvmem/stm32-romem.c | 54 ++++- + 5 files changed, 441 insertions(+), 3 deletions(-) + create mode 100644 drivers/nvmem/stm32-bsec-optee-ta.c + create mode 100644 drivers/nvmem/stm32-bsec-optee-ta.h + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -290,9 +290,20 @@ config NVMEM_SPRD_EFUSE + This driver can also be built as a module. If so, the module + will be called nvmem-sprd-efuse. + ++config NVMEM_STM32_BSEC_OPTEE_TA ++ bool "STM32MP BSEC OP-TEE TA support for nvmem-stm32-romem driver" ++ depends on OPTEE ++ help ++ Say y here to enable the accesses to STM32MP SoC OTPs by the OP-TEE ++ trusted application STM32MP BSEC. ++ ++ This library is a used by stm32-romem driver or included in the module ++ called nvmem-stm32-romem. ++ + config NVMEM_STM32_ROMEM + tristate "STMicroelectronics STM32 factory-programmed memory support" + depends on ARCH_STM32 || COMPILE_TEST ++ imply NVMEM_STM32_BSEC_OPTEE_TA + help + Say y here to enable read-only access for STMicroelectronics STM32 + factory-programmed memory area. +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -61,6 +61,7 @@ obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem + nvmem_sprd_efuse-y := sprd-efuse.o + obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o + nvmem_stm32_romem-y := stm32-romem.o ++nvmem_stm32_romem-$(CONFIG_NVMEM_STM32_BSEC_OPTEE_TA) += stm32-bsec-optee-ta.o + obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o + nvmem_sunplus_ocotp-y := sunplus-ocotp.o + obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o +--- /dev/null ++++ b/drivers/nvmem/stm32-bsec-optee-ta.c +@@ -0,0 +1,298 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++/* ++ * OP-TEE STM32MP BSEC PTA interface, used by STM32 ROMEM driver ++ * ++ * Copyright (C) 2022, STMicroelectronics - All Rights Reserved ++ */ ++ ++#include ++ ++#include "stm32-bsec-optee-ta.h" ++ ++/* ++ * Read OTP memory ++ * ++ * [in] value[0].a OTP start offset in byte ++ * [in] value[0].b Access type (0:shadow, 1:fuse, 2:lock) ++ * [out] memref[1].buffer Output buffer to store read values ++ * [out] memref[1].size Size of OTP to be read ++ * ++ * Return codes: ++ * TEE_SUCCESS - Invoke command success ++ * TEE_ERROR_BAD_PARAMETERS - Incorrect input param ++ * TEE_ERROR_ACCESS_DENIED - OTP not accessible by caller ++ */ ++#define PTA_BSEC_READ_MEM 0x0 ++ ++/* ++ * Write OTP memory ++ * ++ * [in] value[0].a OTP start offset in byte ++ * [in] value[0].b Access type (0:shadow, 1:fuse, 2:lock) ++ * [in] memref[1].buffer Input buffer to read values ++ * [in] memref[1].size Size of OTP to be written ++ * ++ * Return codes: ++ * TEE_SUCCESS - Invoke command success ++ * TEE_ERROR_BAD_PARAMETERS - Incorrect input param ++ * TEE_ERROR_ACCESS_DENIED - OTP not accessible by caller ++ */ ++#define PTA_BSEC_WRITE_MEM 0x1 ++ ++/* value of PTA_BSEC access type = value[in] b */ ++#define SHADOW_ACCESS 0 ++#define FUSE_ACCESS 1 ++#define LOCK_ACCESS 2 ++ ++/* Bitfield definition for LOCK status */ ++#define LOCK_PERM BIT(30) ++ ++/* OP-TEE STM32MP BSEC TA UUID */ ++static const uuid_t stm32mp_bsec_ta_uuid = ++ UUID_INIT(0x94cf71ad, 0x80e6, 0x40b5, ++ 0xa7, 0xc6, 0x3d, 0xc5, 0x01, 0xeb, 0x28, 0x03); ++ ++/* ++ * Check whether this driver supports the BSEC TA in the TEE instance ++ * represented by the params (ver/data) to this function. ++ */ ++static int stm32_bsec_optee_ta_match(struct tee_ioctl_version_data *ver, ++ const void *data) ++{ ++ /* Currently this driver only supports GP compliant, OP-TEE based TA */ ++ if ((ver->impl_id == TEE_IMPL_ID_OPTEE) && ++ (ver->gen_caps & TEE_GEN_CAP_GP)) ++ return 1; ++ else ++ return 0; ++} ++ ++/* Open a session to OP-TEE for STM32MP BSEC TA */ ++static int stm32_bsec_ta_open_session(struct tee_context *ctx, u32 *id) ++{ ++ struct tee_ioctl_open_session_arg sess_arg; ++ int rc; ++ ++ memset(&sess_arg, 0, sizeof(sess_arg)); ++ export_uuid(sess_arg.uuid, &stm32mp_bsec_ta_uuid); ++ sess_arg.clnt_login = TEE_IOCTL_LOGIN_REE_KERNEL; ++ sess_arg.num_params = 0; ++ ++ rc = tee_client_open_session(ctx, &sess_arg, NULL); ++ if ((rc < 0) || (sess_arg.ret != 0)) { ++ pr_err("%s: tee_client_open_session failed err:%#x, ret:%#x\n", ++ __func__, sess_arg.ret, rc); ++ if (!rc) ++ rc = -EINVAL; ++ } else { ++ *id = sess_arg.session; ++ } ++ ++ return rc; ++} ++ ++/* close a session to OP-TEE for STM32MP BSEC TA */ ++static void stm32_bsec_ta_close_session(void *ctx, u32 id) ++{ ++ tee_client_close_session(ctx, id); ++} ++ ++/* stm32_bsec_optee_ta_open() - initialize the STM32MP BSEC TA */ ++int stm32_bsec_optee_ta_open(struct tee_context **ctx) ++{ ++ struct tee_context *tee_ctx; ++ u32 session_id; ++ int rc; ++ ++ /* Open context with TEE driver */ ++ tee_ctx = tee_client_open_context(NULL, stm32_bsec_optee_ta_match, NULL, NULL); ++ if (IS_ERR(tee_ctx)) { ++ rc = PTR_ERR(tee_ctx); ++ if (rc == -ENOENT) ++ return -EPROBE_DEFER; ++ pr_err("%s: tee_client_open_context failed (%d)\n", __func__, rc); ++ ++ return rc; ++ } ++ ++ /* Check STM32MP BSEC TA presence */ ++ rc = stm32_bsec_ta_open_session(tee_ctx, &session_id); ++ if (rc) { ++ tee_client_close_context(tee_ctx); ++ return rc; ++ } ++ ++ stm32_bsec_ta_close_session(tee_ctx, session_id); ++ ++ *ctx = tee_ctx; ++ ++ return 0; ++} ++ ++/* stm32_bsec_optee_ta_open() - release the PTA STM32MP BSEC TA */ ++void stm32_bsec_optee_ta_close(void *ctx) ++{ ++ tee_client_close_context(ctx); ++} ++ ++/* stm32_bsec_optee_ta_read() - nvmem read access using PTA client driver */ ++int stm32_bsec_optee_ta_read(struct tee_context *ctx, unsigned int offset, ++ void *buf, size_t bytes) ++{ ++ struct tee_shm *shm; ++ struct tee_ioctl_invoke_arg arg; ++ struct tee_param param[2]; ++ u8 *shm_buf; ++ u32 start, num_bytes; ++ int ret; ++ u32 session_id; ++ ++ ret = stm32_bsec_ta_open_session(ctx, &session_id); ++ if (ret) ++ return ret; ++ ++ memset(&arg, 0, sizeof(arg)); ++ memset(¶m, 0, sizeof(param)); ++ ++ arg.func = PTA_BSEC_READ_MEM; ++ arg.session = session_id; ++ arg.num_params = 2; ++ ++ /* align access on 32bits */ ++ start = ALIGN_DOWN(offset, 4); ++ num_bytes = round_up(offset + bytes - start, 4); ++ param[0].attr = TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INPUT; ++ param[0].u.value.a = start; ++ param[0].u.value.b = SHADOW_ACCESS; ++ ++ shm = tee_shm_alloc_kernel_buf(ctx, num_bytes); ++ if (IS_ERR(shm)) { ++ ret = PTR_ERR(shm); ++ goto out_tee_session; ++ } ++ ++ param[1].attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT; ++ param[1].u.memref.shm = shm; ++ param[1].u.memref.size = num_bytes; ++ ++ ret = tee_client_invoke_func(ctx, &arg, param); ++ if (ret < 0 || arg.ret != 0) { ++ pr_err("TA_BSEC invoke failed TEE err:%#x, ret:%#x\n", ++ arg.ret, ret); ++ if (!ret) ++ ret = -EIO; ++ } ++ if (!ret) { ++ shm_buf = tee_shm_get_va(shm, 0); ++ if (IS_ERR(shm_buf)) { ++ ret = PTR_ERR(shm_buf); ++ pr_err("tee_shm_get_va failed for transmit (%d)\n", ret); ++ } else { ++ /* read data from 32 bits aligned buffer */ ++ memcpy(buf, &shm_buf[offset % 4], bytes); ++ } ++ } ++ ++ tee_shm_free(shm); ++ ++out_tee_session: ++ stm32_bsec_ta_close_session(ctx, session_id); ++ ++ return ret; ++} ++ ++/* stm32_bsec_optee_ta_write() - nvmem write access using PTA client driver */ ++int stm32_bsec_optee_ta_write(struct tee_context *ctx, unsigned int lower, ++ unsigned int offset, void *buf, size_t bytes) ++{ struct tee_shm *shm; ++ struct tee_ioctl_invoke_arg arg; ++ struct tee_param param[2]; ++ u8 *shm_buf; ++ int ret; ++ u32 session_id; ++ ++ ret = stm32_bsec_ta_open_session(ctx, &session_id); ++ if (ret) ++ return ret; ++ ++ /* Allow only writing complete 32-bits aligned words */ ++ if ((bytes % 4) || (offset % 4)) ++ return -EINVAL; ++ ++ memset(&arg, 0, sizeof(arg)); ++ memset(¶m, 0, sizeof(param)); ++ ++ arg.func = PTA_BSEC_WRITE_MEM; ++ arg.session = session_id; ++ arg.num_params = 2; ++ ++ param[0].attr = TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INPUT; ++ param[0].u.value.a = offset; ++ param[0].u.value.b = FUSE_ACCESS; ++ ++ shm = tee_shm_alloc_kernel_buf(ctx, bytes); ++ if (IS_ERR(shm)) { ++ ret = PTR_ERR(shm); ++ goto out_tee_session; ++ } ++ ++ param[1].attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT; ++ param[1].u.memref.shm = shm; ++ param[1].u.memref.size = bytes; ++ ++ shm_buf = tee_shm_get_va(shm, 0); ++ if (IS_ERR(shm_buf)) { ++ ret = PTR_ERR(shm_buf); ++ pr_err("tee_shm_get_va failed for transmit (%d)\n", ret); ++ tee_shm_free(shm); ++ ++ goto out_tee_session; ++ } ++ ++ memcpy(shm_buf, buf, bytes); ++ ++ ret = tee_client_invoke_func(ctx, &arg, param); ++ if (ret < 0 || arg.ret != 0) { ++ pr_err("TA_BSEC invoke failed TEE err:%#x, ret:%#x\n", arg.ret, ret); ++ if (!ret) ++ ret = -EIO; ++ } ++ pr_debug("Write OTPs %d to %zu, ret=%d\n", offset / 4, (offset + bytes) / 4, ret); ++ ++ /* Lock the upper OTPs with ECC protection, word programming only */ ++ if (!ret && ((offset + bytes) >= (lower * 4))) { ++ u32 start, nb_lock; ++ u32 *lock = (u32 *)shm_buf; ++ int i; ++ ++ /* ++ * don't lock the lower OTPs, no ECC protection and incremental ++ * bit programming, a second write is allowed ++ */ ++ start = max_t(u32, offset, lower * 4); ++ nb_lock = (offset + bytes - start) / 4; ++ ++ param[0].u.value.a = start; ++ param[0].u.value.b = LOCK_ACCESS; ++ param[1].u.memref.size = nb_lock * 4; ++ ++ for (i = 0; i < nb_lock; i++) ++ lock[i] = LOCK_PERM; ++ ++ ret = tee_client_invoke_func(ctx, &arg, param); ++ if (ret < 0 || arg.ret != 0) { ++ pr_err("TA_BSEC invoke failed TEE err:%#x, ret:%#x\n", arg.ret, ret); ++ if (!ret) ++ ret = -EIO; ++ } ++ pr_debug("Lock upper OTPs %d to %d, ret=%d\n", ++ start / 4, start / 4 + nb_lock, ret); ++ } ++ ++ tee_shm_free(shm); ++ ++out_tee_session: ++ stm32_bsec_ta_close_session(ctx, session_id); ++ ++ return ret; ++} +--- /dev/null ++++ b/drivers/nvmem/stm32-bsec-optee-ta.h +@@ -0,0 +1,80 @@ ++/* SPDX-License-Identifier: GPL-2.0-or-later */ ++/* ++ * OP-TEE STM32MP BSEC PTA interface, used by STM32 ROMEM driver ++ * ++ * Copyright (C) 2022, STMicroelectronics - All Rights Reserved ++ */ ++ ++#if IS_ENABLED(CONFIG_NVMEM_STM32_BSEC_OPTEE_TA) ++/** ++ * stm32_bsec_optee_ta_open() - initialize the STM32 BSEC TA ++ * @ctx: the OP-TEE context on success ++ * ++ * Return: ++ * On success, 0. On failure, -errno. ++ */ ++int stm32_bsec_optee_ta_open(struct tee_context **ctx); ++ ++/** ++ * stm32_bsec_optee_ta_close() - release the STM32 BSEC TA ++ * @ctx: the OP-TEE context ++ * ++ * This function used to clean the OP-TEE resources initialized in ++ * stm32_bsec_optee_ta_open(); it can be used as callback to ++ * devm_add_action_or_reset() ++ */ ++void stm32_bsec_optee_ta_close(void *ctx); ++ ++/** ++ * stm32_bsec_optee_ta_read() - nvmem read access using TA client driver ++ * @ctx: the OP-TEE context provided by stm32_bsec_optee_ta_open ++ * @offset: nvmem offset ++ * @buf: buffer to fill with nvem values ++ * @bytes: number of bytes to read ++ * ++ * Return: ++ * On success, 0. On failure, -errno. ++ */ ++int stm32_bsec_optee_ta_read(struct tee_context *ctx, unsigned int offset, ++ void *buf, size_t bytes); ++ ++/** ++ * stm32_bsec_optee_ta_write() - nvmem write access using TA client driver ++ * @ctx: the OP-TEE context provided by stm32_bsec_optee_ta_open ++ * @lower: number of lower OTP, not protected by ECC ++ * @offset: nvmem offset ++ * @buf: buffer with nvem values ++ * @bytes: number of bytes to write ++ * ++ * Return: ++ * On success, 0. On failure, -errno. ++ */ ++int stm32_bsec_optee_ta_write(struct tee_context *ctx, unsigned int lower, ++ unsigned int offset, void *buf, size_t bytes); ++ ++#else ++ ++static inline int stm32_bsec_optee_ta_open(struct tee_context **ctx) ++{ ++ return -EOPNOTSUPP; ++} ++ ++static inline void stm32_bsec_optee_ta_close(void *ctx) ++{ ++} ++ ++static inline int stm32_bsec_optee_ta_read(struct tee_context *ctx, ++ unsigned int offset, void *buf, ++ size_t bytes) ++{ ++ return -EOPNOTSUPP; ++} ++ ++static inline int stm32_bsec_optee_ta_write(struct tee_context *ctx, ++ unsigned int lower, ++ unsigned int offset, void *buf, ++ size_t bytes) ++{ ++ return -EOPNOTSUPP; ++} ++#endif /* CONFIG_NVMEM_STM32_BSEC_OPTEE_TA */ +--- a/drivers/nvmem/stm32-romem.c ++++ b/drivers/nvmem/stm32-romem.c +@@ -11,6 +11,9 @@ + #include + #include + #include ++#include ++ ++#include "stm32-bsec-optee-ta.h" + + /* BSEC secure service access from non-secure */ + #define STM32_SMC_BSEC 0x82001003 +@@ -25,12 +28,14 @@ + struct stm32_romem_cfg { + int size; + u8 lower; ++ bool ta; + }; + + struct stm32_romem_priv { + void __iomem *base; + struct nvmem_config cfg; + u8 lower; ++ struct tee_context *ctx; + }; + + static int stm32_romem_read(void *context, unsigned int offset, void *buf, +@@ -138,12 +143,29 @@ static int stm32_bsec_write(void *contex + return 0; + } + ++static int stm32_bsec_pta_read(void *context, unsigned int offset, void *buf, ++ size_t bytes) ++{ ++ struct stm32_romem_priv *priv = context; ++ ++ return stm32_bsec_optee_ta_read(priv->ctx, offset, buf, bytes); ++} ++ ++static int stm32_bsec_pta_write(void *context, unsigned int offset, void *buf, ++ size_t bytes) ++{ ++ struct stm32_romem_priv *priv = context; ++ ++ return stm32_bsec_optee_ta_write(priv->ctx, priv->lower, offset, buf, bytes); ++} ++ + static int stm32_romem_probe(struct platform_device *pdev) + { + const struct stm32_romem_cfg *cfg; + struct device *dev = &pdev->dev; + struct stm32_romem_priv *priv; + struct resource *res; ++ int rc; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) +@@ -173,15 +195,31 @@ static int stm32_romem_probe(struct plat + } else { + priv->cfg.size = cfg->size; + priv->lower = cfg->lower; +- priv->cfg.reg_read = stm32_bsec_read; +- priv->cfg.reg_write = stm32_bsec_write; ++ if (cfg->ta) { ++ rc = stm32_bsec_optee_ta_open(&priv->ctx); ++ /* wait for OP-TEE client driver to be up and ready */ ++ if (rc) ++ return rc; ++ } ++ if (priv->ctx) { ++ rc = devm_add_action_or_reset(dev, stm32_bsec_optee_ta_close, priv->ctx); ++ if (rc) { ++ dev_err(dev, "devm_add_action_or_reset() failed (%d)\n", rc); ++ return rc; ++ } ++ priv->cfg.reg_read = stm32_bsec_pta_read; ++ priv->cfg.reg_write = stm32_bsec_pta_write; ++ } else { ++ priv->cfg.reg_read = stm32_bsec_read; ++ priv->cfg.reg_write = stm32_bsec_write; ++ } + } + + return PTR_ERR_OR_ZERO(devm_nvmem_register(dev, &priv->cfg)); + } + + /* +- * STM32MP15 BSEC OTP regions: 4096 OTP bits (with 3072 effective bits) ++ * STM32MP15/13 BSEC OTP regions: 4096 OTP bits (with 3072 effective bits) + * => 96 x 32-bits data words + * - Lower: 1K bits, 2:1 redundancy, incremental bit programming + * => 32 (x 32-bits) lower shadow registers = words 0 to 31 +@@ -191,6 +229,13 @@ static int stm32_romem_probe(struct plat + static const struct stm32_romem_cfg stm32mp15_bsec_cfg = { + .size = 384, + .lower = 32, ++ .ta = false, ++}; ++ ++static const struct stm32_romem_cfg stm32mp13_bsec_cfg = { ++ .size = 384, ++ .lower = 32, ++ .ta = true, + }; + + static const struct of_device_id stm32_romem_of_match[] = { +@@ -198,7 +243,10 @@ static const struct of_device_id stm32_r + .compatible = "st,stm32mp15-bsec", + .data = (void *)&stm32mp15_bsec_cfg, + }, { ++ .compatible = "st,stm32mp13-bsec", ++ .data = (void *)&stm32mp13_bsec_cfg, + }, ++ { /* sentinel */ }, + }; + MODULE_DEVICE_TABLE(of, stm32_romem_of_match); + diff --git a/target/linux/generic/backport-5.15/809-v6.3-0008-nvmem-stm32-detect-bsec-pta-presence-for-STM32MP15x.patch b/target/linux/generic/backport-5.15/809-v6.3-0008-nvmem-stm32-detect-bsec-pta-presence-for-STM32MP15x.patch new file mode 100644 index 0000000000..cea8e93858 --- /dev/null +++ b/target/linux/generic/backport-5.15/809-v6.3-0008-nvmem-stm32-detect-bsec-pta-presence-for-STM32MP15x.patch @@ -0,0 +1,85 @@ +From df2f34ef1d924125ffaf29dfdaf7cdbd3183c321 Mon Sep 17 00:00:00 2001 +From: Patrick Delaunay +Date: Mon, 6 Feb 2023 13:43:52 +0000 +Subject: [PATCH] nvmem: stm32: detect bsec pta presence for STM32MP15x + +On STM32MP15x SoC, the SMC backend is optional when OP-TEE is used; +the PTA BSEC should be used as it is done on STM32MP13x platform, +but the BSEC SMC can be also used: it is a legacy mode in OP-TEE, +not recommended but used in previous OP-TEE firmware. + +The presence of OP-TEE is dynamically detected in STM32MP15x device tree +and the supported NVMEM backend is dynamically detected: +- PTA with stm32_bsec_pta_find +- SMC with stm32_bsec_check + +With OP-TEE but without PTA and SMC detection, the probe is deferred for +STM32MP15x devices. + +On STM32MP13x platform, only the PTA is supported with cfg->ta = true +and this detection is skipped. + +Signed-off-by: Patrick Delaunay +Reviewed-by: Etienne Carriere +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-19-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/stm32-romem.c | 38 +++++++++++++++++++++++++++++++++---- + 1 file changed, 34 insertions(+), 4 deletions(-) + +--- a/drivers/nvmem/stm32-romem.c ++++ b/drivers/nvmem/stm32-romem.c +@@ -159,6 +159,31 @@ static int stm32_bsec_pta_write(void *co + return stm32_bsec_optee_ta_write(priv->ctx, priv->lower, offset, buf, bytes); + } + ++static bool stm32_bsec_smc_check(void) ++{ ++ u32 val; ++ int ret; ++ ++ /* check that the OP-TEE support the BSEC SMC (legacy mode) */ ++ ret = stm32_bsec_smc(STM32_SMC_READ_SHADOW, 0, 0, &val); ++ ++ return !ret; ++} ++ ++static bool optee_presence_check(void) ++{ ++ struct device_node *np; ++ bool tee_detected = false; ++ ++ /* check that the OP-TEE node is present and available. */ ++ np = of_find_compatible_node(NULL, NULL, "linaro,optee-tz"); ++ if (np && of_device_is_available(np)) ++ tee_detected = true; ++ of_node_put(np); ++ ++ return tee_detected; ++} ++ + static int stm32_romem_probe(struct platform_device *pdev) + { + const struct stm32_romem_cfg *cfg; +@@ -195,11 +220,16 @@ static int stm32_romem_probe(struct plat + } else { + priv->cfg.size = cfg->size; + priv->lower = cfg->lower; +- if (cfg->ta) { ++ if (cfg->ta || optee_presence_check()) { + rc = stm32_bsec_optee_ta_open(&priv->ctx); +- /* wait for OP-TEE client driver to be up and ready */ +- if (rc) +- return rc; ++ if (rc) { ++ /* wait for OP-TEE client driver to be up and ready */ ++ if (rc == -EPROBE_DEFER) ++ return -EPROBE_DEFER; ++ /* BSEC PTA is required or SMC not supported */ ++ if (cfg->ta || !stm32_bsec_smc_check()) ++ return rc; ++ } + } + if (priv->ctx) { + rc = devm_add_action_or_reset(dev, stm32_bsec_optee_ta_close, priv->ctx); diff --git a/target/linux/generic/backport-5.15/809-v6.3-0009-nvmem-rave-sp-eeprm-fix-kernel-doc-bad-line-warning.patch b/target/linux/generic/backport-5.15/809-v6.3-0009-nvmem-rave-sp-eeprm-fix-kernel-doc-bad-line-warning.patch new file mode 100644 index 0000000000..9d6275a737 --- /dev/null +++ b/target/linux/generic/backport-5.15/809-v6.3-0009-nvmem-rave-sp-eeprm-fix-kernel-doc-bad-line-warning.patch @@ -0,0 +1,32 @@ +From 3e5ac22aa564026e99defc3a8e02082521a5b231 Mon Sep 17 00:00:00 2001 +From: Randy Dunlap +Date: Mon, 6 Feb 2023 13:43:53 +0000 +Subject: [PATCH] nvmem: rave-sp-eeprm: fix kernel-doc bad line warning + +Convert an empty line to " *" to avoid a kernel-doc warning: + +drivers/nvmem/rave-sp-eeprom.c:48: warning: bad line: + +Signed-off-by: Randy Dunlap +Cc: Srinivas Kandagatla +Cc: Andrey Vostrikov +Cc: Nikita Yushchenko +Cc: Andrey Smirnov +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-20-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/rave-sp-eeprom.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/rave-sp-eeprom.c ++++ b/drivers/nvmem/rave-sp-eeprom.c +@@ -45,7 +45,7 @@ enum rave_sp_eeprom_header_size { + * @type: Access type (see enum rave_sp_eeprom_access_type) + * @success: Success flag (Success = 1, Failure = 0) + * @data: Read data +- ++ * + * Note this structure corresponds to RSP_*_EEPROM payload from RAVE + * SP ICD + */ diff --git a/target/linux/generic/backport-5.15/809-v6.3-0010-nvmem-qcom-spmi-sdam-register-at-device-init-time.patch b/target/linux/generic/backport-5.15/809-v6.3-0010-nvmem-qcom-spmi-sdam-register-at-device-init-time.patch new file mode 100644 index 0000000000..1ab9e609d3 --- /dev/null +++ b/target/linux/generic/backport-5.15/809-v6.3-0010-nvmem-qcom-spmi-sdam-register-at-device-init-time.patch @@ -0,0 +1,43 @@ +From eb7dda20f42a9137e9ee53d5ed3b743d49338cb5 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Feb 2023 13:43:54 +0000 +Subject: [PATCH] nvmem: qcom-spmi-sdam: register at device init time + +There are currently no in-tree users of the Qualcomm SDAM nvmem driver +and there is generally no point in registering a driver that can be +built as a module at subsys init time. + +Register the driver at the normal device init time instead and let +driver core sort out the probe order. + +Signed-off-by: Johan Hovold +Reviewed-by: Bjorn Andersson +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-21-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/qcom-spmi-sdam.c | 13 +------------ + 1 file changed, 1 insertion(+), 12 deletions(-) + +--- a/drivers/nvmem/qcom-spmi-sdam.c ++++ b/drivers/nvmem/qcom-spmi-sdam.c +@@ -175,18 +175,7 @@ static struct platform_driver sdam_drive + }, + .probe = sdam_probe, + }; +- +-static int __init sdam_init(void) +-{ +- return platform_driver_register(&sdam_driver); +-} +-subsys_initcall(sdam_init); +- +-static void __exit sdam_exit(void) +-{ +- return platform_driver_unregister(&sdam_driver); +-} +-module_exit(sdam_exit); ++module_platform_driver(sdam_driver); + + MODULE_DESCRIPTION("QCOM SPMI SDAM driver"); + MODULE_LICENSE("GPL v2"); diff --git a/target/linux/generic/backport-5.15/809-v6.3-0011-nvmem-stm32-fix-OPTEE-dependency.patch b/target/linux/generic/backport-5.15/809-v6.3-0011-nvmem-stm32-fix-OPTEE-dependency.patch new file mode 100644 index 0000000000..dcf704c6ff --- /dev/null +++ b/target/linux/generic/backport-5.15/809-v6.3-0011-nvmem-stm32-fix-OPTEE-dependency.patch @@ -0,0 +1,46 @@ +From 1dc7e37bb0ec1c997fac82031332a38c7610352f Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Mon, 6 Feb 2023 13:43:56 +0000 +Subject: [PATCH] nvmem: stm32: fix OPTEE dependency + +The stm32 nvmem driver fails to link as built-in when OPTEE +is a loadable module: + +aarch64-linux-ld: drivers/nvmem/stm32-bsec-optee-ta.o: in function `stm32_bsec: +stm32-bsec-optee-ta.c:(.text+0xc8): undefined reference to `tee_client_open_session' +aarch64-linux-ld: drivers/nvmem/stm32-bsec-optee-ta.o: in function `stm32_bsec: +stm32-bsec-optee-ta.c:(.text+0x1fc): undefined reference to `tee_client_open_context' + +Change the CONFIG_NVMEM_STM32_ROMEM definition so it can only +be built-in if OPTEE is either built-in or disabled, and +make NVMEM_STM32_BSEC_OPTEE_TA a hidden symbol instead. + +Signed-off-by: Arnd Bergmann +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-23-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -291,8 +291,7 @@ config NVMEM_SPRD_EFUSE + will be called nvmem-sprd-efuse. + + config NVMEM_STM32_BSEC_OPTEE_TA +- bool "STM32MP BSEC OP-TEE TA support for nvmem-stm32-romem driver" +- depends on OPTEE ++ def_bool NVMEM_STM32_ROMEM && OPTEE + help + Say y here to enable the accesses to STM32MP SoC OTPs by the OP-TEE + trusted application STM32MP BSEC. +@@ -303,7 +302,7 @@ config NVMEM_STM32_BSEC_OPTEE_TA + config NVMEM_STM32_ROMEM + tristate "STMicroelectronics STM32 factory-programmed memory support" + depends on ARCH_STM32 || COMPILE_TEST +- imply NVMEM_STM32_BSEC_OPTEE_TA ++ depends on OPTEE || !OPTEE + help + Say y here to enable read-only access for STMicroelectronics STM32 + factory-programmed memory area. diff --git a/target/linux/generic/backport-5.15/810-v5.17-net-qmi_wwan-add-ZTE-MF286D-modem-19d2-1485.patch b/target/linux/generic/backport-5.15/810-v5.17-net-qmi_wwan-add-ZTE-MF286D-modem-19d2-1485.patch new file mode 100644 index 0000000000..dbd734e9cf --- /dev/null +++ b/target/linux/generic/backport-5.15/810-v5.17-net-qmi_wwan-add-ZTE-MF286D-modem-19d2-1485.patch @@ -0,0 +1,59 @@ +From 078c6a1cbd4cd7496048786beec2e312577bebbf Mon Sep 17 00:00:00 2001 +From: Pawel Dembicki +Date: Tue, 11 Jan 2022 23:11:32 +0100 +Subject: [PATCH 1/1] net: qmi_wwan: add ZTE MF286D modem 19d2:1485 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Modem from ZTE MF286D is an Qualcomm MDM9250 based 3G/4G modem. + +T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 3 Spd=5000 MxCh= 0 +D: Ver= 3.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 1 +P: Vendor=19d2 ProdID=1485 Rev=52.87 +S: Manufacturer=ZTE,Incorporated +S: Product=ZTE Technologies MSM +S: SerialNumber=MF286DZTED000000 +C:* #Ifs= 7 Cfg#= 1 Atr=80 MxPwr=896mA +A: FirstIf#= 0 IfCount= 2 Cls=02(comm.) Sub=06 Prot=00 +I:* If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=ff Driver=rndis_host +E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl=32ms +I:* If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host +E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms +I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option +E: Ad=83(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms +I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option +E: Ad=85(I) Atr=03(Int.) MxPS= 10 Ivl=32ms +E: Ad=84(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=03(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms +I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option +E: Ad=87(I) Atr=03(Int.) MxPS= 10 Ivl=32ms +E: Ad=86(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=04(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms +I:* If#= 5 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan +E: Ad=88(I) Atr=03(Int.) MxPS= 8 Ivl=32ms +E: Ad=8e(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=0f(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms +I:* If#= 6 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=usbfs +E: Ad=05(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=89(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms + +Signed-off-by: Pawel Dembicki +Acked-by: Bjørn Mork +Signed-off-by: David S. Miller +--- + drivers/net/usb/qmi_wwan.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -1317,6 +1317,7 @@ static const struct usb_device_id produc + {QMI_FIXED_INTF(0x19d2, 0x1426, 2)}, /* ZTE MF91 */ + {QMI_FIXED_INTF(0x19d2, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */ + {QMI_FIXED_INTF(0x19d2, 0x1432, 3)}, /* ZTE ME3620 */ ++ {QMI_FIXED_INTF(0x19d2, 0x1485, 5)}, /* ZTE MF286D */ + {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */ + {QMI_FIXED_INTF(0x2001, 0x7e16, 3)}, /* D-Link DWM-221 */ + {QMI_FIXED_INTF(0x2001, 0x7e19, 4)}, /* D-Link DWM-221 B1 */ diff --git a/target/linux/generic/backport-5.15/811-v6.4-0001-nvmem-xilinx-zynqmp-make-modular.patch b/target/linux/generic/backport-5.15/811-v6.4-0001-nvmem-xilinx-zynqmp-make-modular.patch new file mode 100644 index 0000000000..8328e87c0a --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0001-nvmem-xilinx-zynqmp-make-modular.patch @@ -0,0 +1,35 @@ +From bcd1fe07def0f070eb5f31594620aaee6f81d31a Mon Sep 17 00:00:00 2001 +From: Nick Alcock +Date: Tue, 4 Apr 2023 18:21:11 +0100 +Subject: [PATCH] nvmem: xilinx: zynqmp: make modular + +This driver has a MODULE_LICENSE but is not tristate so cannot be +built as a module, unlike all its peers: make it modular to match. + +Signed-off-by: Nick Alcock +Suggested-by: Michal Simek +Cc: Luis Chamberlain +Cc: linux-modules@vger.kernel.org +Cc: linux-kernel@vger.kernel.org +Cc: Hitomi Hasegawa +Cc: Srinivas Kandagatla +Cc: Michal Simek +Cc: linux-arm-kernel@lists.infradead.org +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-4-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -368,7 +368,7 @@ config NVMEM_VF610_OCOTP + be called nvmem-vf610-ocotp. + + config NVMEM_ZYNQMP +- bool "Xilinx ZYNQMP SoC nvmem firmware support" ++ tristate "Xilinx ZYNQMP SoC nvmem firmware support" + depends on ARCH_ZYNQMP + help + This is a driver to access hardware related data like diff --git a/target/linux/generic/backport-5.15/811-v6.4-0002-nvmem-core-introduce-NVMEM-layouts.patch b/target/linux/generic/backport-5.15/811-v6.4-0002-nvmem-core-introduce-NVMEM-layouts.patch new file mode 100644 index 0000000000..23518d21f7 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0002-nvmem-core-introduce-NVMEM-layouts.patch @@ -0,0 +1,387 @@ +From 266570f496b90dea8fda893c2cf7c28d63ae2bd9 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Tue, 4 Apr 2023 18:21:21 +0100 +Subject: [PATCH] nvmem: core: introduce NVMEM layouts + +NVMEM layouts are used to generate NVMEM cells during runtime. Think of +an EEPROM with a well-defined conent. For now, the content can be +described by a device tree or a board file. But this only works if the +offsets and lengths are static and don't change. One could also argue +that putting the layout of the EEPROM in the device tree is the wrong +place. Instead, the device tree should just have a specific compatible +string. + +Right now there are two use cases: + (1) The NVMEM cell needs special processing. E.g. if it only specifies + a base MAC address offset and you need to add an offset, or it + needs to parse a MAC from ASCII format or some proprietary format. + (Post processing of cells is added in a later commit). + (2) u-boot environment parsing. The cells don't have a particular + offset but it needs parsing the content to determine the offsets + and length. + +Co-developed-by: Miquel Raynal +Signed-off-by: Miquel Raynal +Signed-off-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-14-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + Documentation/driver-api/nvmem.rst | 15 ++++ + drivers/nvmem/Kconfig | 4 + + drivers/nvmem/Makefile | 1 + + drivers/nvmem/core.c | 120 +++++++++++++++++++++++++++++ + drivers/nvmem/layouts/Kconfig | 5 ++ + drivers/nvmem/layouts/Makefile | 4 + + include/linux/nvmem-consumer.h | 7 ++ + include/linux/nvmem-provider.h | 51 ++++++++++++ + 8 files changed, 207 insertions(+) + create mode 100644 drivers/nvmem/layouts/Kconfig + create mode 100644 drivers/nvmem/layouts/Makefile + +--- a/Documentation/driver-api/nvmem.rst ++++ b/Documentation/driver-api/nvmem.rst +@@ -189,3 +189,18 @@ ex:: + ===================== + + See Documentation/devicetree/bindings/nvmem/nvmem.txt ++ ++8. NVMEM layouts ++================ ++ ++NVMEM layouts are yet another mechanism to create cells. With the device ++tree binding it is possible to specify simple cells by using an offset ++and a length. Sometimes, the cells doesn't have a static offset, but ++the content is still well defined, e.g. tag-length-values. In this case, ++the NVMEM device content has to be first parsed and the cells need to ++be added accordingly. Layouts let you read the content of the NVMEM device ++and let you add cells dynamically. ++ ++Another use case for layouts is the post processing of cells. With layouts, ++it is possible to associate a custom post processing hook to a cell. It ++even possible to add this hook to cells not created by the layout itself. +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -21,6 +21,10 @@ config NVMEM_SYSFS + This interface is mostly used by userspace applications to + read/write directly into nvmem. + ++# Layouts ++ ++source "drivers/nvmem/layouts/Kconfig" ++ + # Devices + + config NVMEM_APPLE_EFUSES +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -5,6 +5,7 @@ + + obj-$(CONFIG_NVMEM) += nvmem_core.o + nvmem_core-y := core.o ++obj-y += layouts/ + + # Devices + obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -40,6 +40,7 @@ struct nvmem_device { + nvmem_reg_write_t reg_write; + nvmem_cell_post_process_t cell_post_process; + struct gpio_desc *wp_gpio; ++ struct nvmem_layout *layout; + void *priv; + }; + +@@ -74,6 +75,9 @@ static LIST_HEAD(nvmem_lookup_list); + + static BLOCKING_NOTIFIER_HEAD(nvmem_notifier); + ++static DEFINE_SPINLOCK(nvmem_layout_lock); ++static LIST_HEAD(nvmem_layouts); ++ + static int __nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset, + void *val, size_t bytes) + { +@@ -728,6 +732,101 @@ static int nvmem_add_cells_from_of(struc + return 0; + } + ++int __nvmem_layout_register(struct nvmem_layout *layout, struct module *owner) ++{ ++ layout->owner = owner; ++ ++ spin_lock(&nvmem_layout_lock); ++ list_add(&layout->node, &nvmem_layouts); ++ spin_unlock(&nvmem_layout_lock); ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(__nvmem_layout_register); ++ ++void nvmem_layout_unregister(struct nvmem_layout *layout) ++{ ++ spin_lock(&nvmem_layout_lock); ++ list_del(&layout->node); ++ spin_unlock(&nvmem_layout_lock); ++} ++EXPORT_SYMBOL_GPL(nvmem_layout_unregister); ++ ++static struct nvmem_layout *nvmem_layout_get(struct nvmem_device *nvmem) ++{ ++ struct device_node *layout_np, *np = nvmem->dev.of_node; ++ struct nvmem_layout *l, *layout = NULL; ++ ++ layout_np = of_get_child_by_name(np, "nvmem-layout"); ++ if (!layout_np) ++ return NULL; ++ ++ spin_lock(&nvmem_layout_lock); ++ ++ list_for_each_entry(l, &nvmem_layouts, node) { ++ if (of_match_node(l->of_match_table, layout_np)) { ++ if (try_module_get(l->owner)) ++ layout = l; ++ ++ break; ++ } ++ } ++ ++ spin_unlock(&nvmem_layout_lock); ++ of_node_put(layout_np); ++ ++ return layout; ++} ++ ++static void nvmem_layout_put(struct nvmem_layout *layout) ++{ ++ if (layout) ++ module_put(layout->owner); ++} ++ ++static int nvmem_add_cells_from_layout(struct nvmem_device *nvmem) ++{ ++ struct nvmem_layout *layout = nvmem->layout; ++ int ret; ++ ++ if (layout && layout->add_cells) { ++ ret = layout->add_cells(&nvmem->dev, nvmem, layout); ++ if (ret) ++ return ret; ++ } ++ ++ return 0; ++} ++ ++#if IS_ENABLED(CONFIG_OF) ++/** ++ * of_nvmem_layout_get_container() - Get OF node to layout container. ++ * ++ * @nvmem: nvmem device. ++ * ++ * Return: a node pointer with refcount incremented or NULL if no ++ * container exists. Use of_node_put() on it when done. ++ */ ++struct device_node *of_nvmem_layout_get_container(struct nvmem_device *nvmem) ++{ ++ return of_get_child_by_name(nvmem->dev.of_node, "nvmem-layout"); ++} ++EXPORT_SYMBOL_GPL(of_nvmem_layout_get_container); ++#endif ++ ++const void *nvmem_layout_get_match_data(struct nvmem_device *nvmem, ++ struct nvmem_layout *layout) ++{ ++ struct device_node __maybe_unused *layout_np; ++ const struct of_device_id *match; ++ ++ layout_np = of_nvmem_layout_get_container(nvmem); ++ match = of_match_node(layout->of_match_table, layout_np); ++ ++ return match ? match->data : NULL; ++} ++EXPORT_SYMBOL_GPL(nvmem_layout_get_match_data); ++ + /** + * nvmem_register() - Register a nvmem device for given nvmem_config. + * Also creates a binary entry in /sys/bus/nvmem/devices/dev-name/nvmem +@@ -834,6 +933,12 @@ struct nvmem_device *nvmem_register(cons + goto err_put_device; + } + ++ /* ++ * If the driver supplied a layout by config->layout, the module ++ * pointer will be NULL and nvmem_layout_put() will be a noop. ++ */ ++ nvmem->layout = config->layout ?: nvmem_layout_get(nvmem); ++ + if (config->cells) { + rval = nvmem_add_cells(nvmem, config->cells, config->ncells); + if (rval) +@@ -854,12 +959,17 @@ struct nvmem_device *nvmem_register(cons + if (rval) + goto err_remove_cells; + ++ rval = nvmem_add_cells_from_layout(nvmem); ++ if (rval) ++ goto err_remove_cells; ++ + blocking_notifier_call_chain(&nvmem_notifier, NVMEM_ADD, nvmem); + + return nvmem; + + err_remove_cells: + nvmem_device_remove_all_cells(nvmem); ++ nvmem_layout_put(nvmem->layout); + if (config->compat) + nvmem_sysfs_remove_compat(nvmem, config); + err_put_device: +@@ -881,6 +991,7 @@ static void nvmem_device_release(struct + device_remove_bin_file(nvmem->base_dev, &nvmem->eeprom); + + nvmem_device_remove_all_cells(nvmem); ++ nvmem_layout_put(nvmem->layout); + device_unregister(&nvmem->dev); + } + +@@ -1246,6 +1357,15 @@ struct nvmem_cell *of_nvmem_cell_get(str + return ERR_PTR(-EINVAL); + } + ++ /* nvmem layouts produce cells within the nvmem-layout container */ ++ if (of_node_name_eq(nvmem_np, "nvmem-layout")) { ++ nvmem_np = of_get_next_parent(nvmem_np); ++ if (!nvmem_np) { ++ of_node_put(cell_np); ++ return ERR_PTR(-EINVAL); ++ } ++ } ++ + nvmem = __nvmem_device_get(nvmem_np, device_match_of_node); + of_node_put(nvmem_np); + if (IS_ERR(nvmem)) { +--- /dev/null ++++ b/drivers/nvmem/layouts/Kconfig +@@ -0,0 +1,5 @@ ++# SPDX-License-Identifier: GPL-2.0 ++ ++menu "Layout Types" ++ ++endmenu +--- /dev/null ++++ b/drivers/nvmem/layouts/Makefile +@@ -0,0 +1,4 @@ ++# SPDX-License-Identifier: GPL-2.0 ++# ++# Makefile for nvmem layouts. ++# +--- a/include/linux/nvmem-consumer.h ++++ b/include/linux/nvmem-consumer.h +@@ -239,6 +239,7 @@ struct nvmem_cell *of_nvmem_cell_get(str + const char *id); + struct nvmem_device *of_nvmem_device_get(struct device_node *np, + const char *name); ++struct device_node *of_nvmem_layout_get_container(struct nvmem_device *nvmem); + #else + static inline struct nvmem_cell *of_nvmem_cell_get(struct device_node *np, + const char *id) +@@ -251,6 +252,12 @@ static inline struct nvmem_device *of_nv + { + return ERR_PTR(-EOPNOTSUPP); + } ++ ++static inline struct device_node * ++of_nvmem_layout_get_container(struct nvmem_device *nvmem) ++{ ++ return ERR_PTR(-EOPNOTSUPP); ++} + #endif /* CONFIG_NVMEM && CONFIG_OF */ + + #endif /* ifndef _LINUX_NVMEM_CONSUMER_H */ +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -88,6 +88,7 @@ struct nvmem_cell_info { + * @stride: Minimum read/write access stride. + * @priv: User context passed to read/write callbacks. + * @ignore_wp: Write Protect pin is managed by the provider. ++ * @layout: Fixed layout associated with this nvmem device. + * + * Note: A default "nvmem" name will be assigned to the device if + * no name is specified in its configuration. In such case "" is +@@ -109,6 +110,7 @@ struct nvmem_config { + bool read_only; + bool root_only; + bool ignore_wp; ++ struct nvmem_layout *layout; + struct device_node *of_node; + bool no_of_node; + nvmem_reg_read_t reg_read; +@@ -142,6 +144,33 @@ struct nvmem_cell_table { + struct list_head node; + }; + ++/** ++ * struct nvmem_layout - NVMEM layout definitions ++ * ++ * @name: Layout name. ++ * @of_match_table: Open firmware match table. ++ * @add_cells: Will be called if a nvmem device is found which ++ * has this layout. The function will add layout ++ * specific cells with nvmem_add_one_cell(). ++ * @owner: Pointer to struct module. ++ * @node: List node. ++ * ++ * A nvmem device can hold a well defined structure which can just be ++ * evaluated during runtime. For example a TLV list, or a list of "name=val" ++ * pairs. A nvmem layout can parse the nvmem device and add appropriate ++ * cells. ++ */ ++struct nvmem_layout { ++ const char *name; ++ const struct of_device_id *of_match_table; ++ int (*add_cells)(struct device *dev, struct nvmem_device *nvmem, ++ struct nvmem_layout *layout); ++ ++ /* private */ ++ struct module *owner; ++ struct list_head node; ++}; ++ + #if IS_ENABLED(CONFIG_NVMEM) + + struct nvmem_device *nvmem_register(const struct nvmem_config *cfg); +@@ -156,6 +185,14 @@ void nvmem_del_cell_table(struct nvmem_c + int nvmem_add_one_cell(struct nvmem_device *nvmem, + const struct nvmem_cell_info *info); + ++int __nvmem_layout_register(struct nvmem_layout *layout, struct module *owner); ++#define nvmem_layout_register(layout) \ ++ __nvmem_layout_register(layout, THIS_MODULE) ++void nvmem_layout_unregister(struct nvmem_layout *layout); ++ ++const void *nvmem_layout_get_match_data(struct nvmem_device *nvmem, ++ struct nvmem_layout *layout); ++ + #else + + static inline struct nvmem_device *nvmem_register(const struct nvmem_config *c) +@@ -179,5 +216,19 @@ static inline int nvmem_add_one_cell(str + return -EOPNOTSUPP; + } + ++static inline int nvmem_layout_register(struct nvmem_layout *layout) ++{ ++ return -EOPNOTSUPP; ++} ++ ++static inline void nvmem_layout_unregister(struct nvmem_layout *layout) {} ++ ++static inline const void * ++nvmem_layout_get_match_data(struct nvmem_device *nvmem, ++ struct nvmem_layout *layout) ++{ ++ return NULL; ++} ++ + #endif /* CONFIG_NVMEM */ + #endif /* ifndef _LINUX_NVMEM_PROVIDER_H */ diff --git a/target/linux/generic/backport-5.15/811-v6.4-0003-nvmem-core-handle-the-absence-of-expected-layouts.patch b/target/linux/generic/backport-5.15/811-v6.4-0003-nvmem-core-handle-the-absence-of-expected-layouts.patch new file mode 100644 index 0000000000..6fa7b6382d --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0003-nvmem-core-handle-the-absence-of-expected-layouts.patch @@ -0,0 +1,61 @@ +From 6468a6f45148fb5e95c86b4efebf63f9abcd2137 Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 4 Apr 2023 18:21:22 +0100 +Subject: [PATCH] nvmem: core: handle the absence of expected layouts + +Make nvmem_layout_get() return -EPROBE_DEFER while the expected layout +is not available. This condition cannot be triggered today as nvmem +layout drivers are initialed as part of an early init call, but soon +these drivers will be converted into modules and be initialized with a +standard priority, so the unavailability of the drivers might become a +reality that must be taken care of. + +Let's anticipate this by telling the caller the layout might not yet be +available. A probe deferral is requested in this case. + +Please note this does not affect any nvmem device not using layouts, +because an early check against the "nvmem-layout" container presence +will return NULL in this case. + +Signed-off-by: Miquel Raynal +Tested-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-15-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -755,7 +755,7 @@ EXPORT_SYMBOL_GPL(nvmem_layout_unregiste + static struct nvmem_layout *nvmem_layout_get(struct nvmem_device *nvmem) + { + struct device_node *layout_np, *np = nvmem->dev.of_node; +- struct nvmem_layout *l, *layout = NULL; ++ struct nvmem_layout *l, *layout = ERR_PTR(-EPROBE_DEFER); + + layout_np = of_get_child_by_name(np, "nvmem-layout"); + if (!layout_np) +@@ -938,6 +938,13 @@ struct nvmem_device *nvmem_register(cons + * pointer will be NULL and nvmem_layout_put() will be a noop. + */ + nvmem->layout = config->layout ?: nvmem_layout_get(nvmem); ++ if (IS_ERR(nvmem->layout)) { ++ rval = PTR_ERR(nvmem->layout); ++ nvmem->layout = NULL; ++ ++ if (rval == -EPROBE_DEFER) ++ goto err_teardown_compat; ++ } + + if (config->cells) { + rval = nvmem_add_cells(nvmem, config->cells, config->ncells); +@@ -970,6 +977,7 @@ struct nvmem_device *nvmem_register(cons + err_remove_cells: + nvmem_device_remove_all_cells(nvmem); + nvmem_layout_put(nvmem->layout); ++err_teardown_compat: + if (config->compat) + nvmem_sysfs_remove_compat(nvmem, config); + err_put_device: diff --git a/target/linux/generic/backport-5.15/811-v6.4-0004-nvmem-core-request-layout-modules-loading.patch b/target/linux/generic/backport-5.15/811-v6.4-0004-nvmem-core-request-layout-modules-loading.patch new file mode 100644 index 0000000000..b9341666f9 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0004-nvmem-core-request-layout-modules-loading.patch @@ -0,0 +1,52 @@ +From b1c37bec1ccfe5ccab72bc0ddc0dfa45c43e2de2 Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 4 Apr 2023 18:21:23 +0100 +Subject: [PATCH] nvmem: core: request layout modules loading + +When a storage device like an eeprom or an mtd device probes, it +registers an nvmem device if the nvmem subsystem has been enabled (bool +symbol). During nvmem registration, if the device is using layouts to +expose dynamic nvmem cells, the core will first try to get a reference +over the layout driver callbacks. In practice there is not relationship +that can be described between the storage driver and the nvmem +layout. So there is no way we can enforce both drivers will be built-in +or both will be modules. If the storage device driver is built-in but +the layout is built as a module, instead of badly failing with an +endless probe deferral loop, lets just make a modprobe call in case the +driver was made available in an initramfs with +of_device_node_request_module(), and offer a fully functional system to +the user. + +Signed-off-by: Miquel Raynal +Tested-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-16-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + #include + + struct nvmem_device { +@@ -761,6 +762,13 @@ static struct nvmem_layout *nvmem_layout + if (!layout_np) + return NULL; + ++ /* ++ * In case the nvmem device was built-in while the layout was built as a ++ * module, we shall manually request the layout driver loading otherwise ++ * we'll never have any match. ++ */ ++ of_request_module(layout_np); ++ + spin_lock(&nvmem_layout_lock); + + list_for_each_entry(l, &nvmem_layouts, node) { diff --git a/target/linux/generic/backport-5.15/811-v6.4-0005-nvmem-core-add-per-cell-post-processing.patch b/target/linux/generic/backport-5.15/811-v6.4-0005-nvmem-core-add-per-cell-post-processing.patch new file mode 100644 index 0000000000..53628cd4e4 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0005-nvmem-core-add-per-cell-post-processing.patch @@ -0,0 +1,86 @@ +From 345ec382cd4b736c36e01f155d08c913b225b736 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Tue, 4 Apr 2023 18:21:24 +0100 +Subject: [PATCH] nvmem: core: add per-cell post processing + +Instead of relying on the name the consumer is using for the cell, like +it is done for the nvmem .cell_post_process configuration parameter, +provide a per-cell post processing hook. This can then be populated by +the NVMEM provider (or the NVMEM layout) when adding the cell. + +Signed-off-by: Michael Walle +Signed-off-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-17-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 17 +++++++++++++++++ + include/linux/nvmem-provider.h | 3 +++ + 2 files changed, 20 insertions(+) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -54,6 +54,7 @@ struct nvmem_cell_entry { + int bytes; + int bit_offset; + int nbits; ++ nvmem_cell_post_process_t read_post_process; + struct device_node *np; + struct nvmem_device *nvmem; + struct list_head node; +@@ -470,6 +471,7 @@ static int nvmem_cell_info_to_nvmem_cell + cell->offset = info->offset; + cell->bytes = info->bytes; + cell->name = info->name; ++ cell->read_post_process = info->read_post_process; + + cell->bit_offset = info->bit_offset; + cell->nbits = info->nbits; +@@ -1563,6 +1565,13 @@ static int __nvmem_cell_read(struct nvme + if (cell->bit_offset || cell->nbits) + nvmem_shift_read_buffer_in_place(cell, buf); + ++ if (cell->read_post_process) { ++ rc = cell->read_post_process(nvmem->priv, id, index, ++ cell->offset, buf, cell->bytes); ++ if (rc) ++ return rc; ++ } ++ + if (nvmem->cell_post_process) { + rc = nvmem->cell_post_process(nvmem->priv, id, index, + cell->offset, buf, cell->bytes); +@@ -1671,6 +1680,14 @@ static int __nvmem_cell_entry_write(stru + (cell->bit_offset == 0 && len != cell->bytes)) + return -EINVAL; + ++ /* ++ * Any cells which have a read_post_process hook are read-only because ++ * we cannot reverse the operation and it might affect other cells, ++ * too. ++ */ ++ if (cell->read_post_process) ++ return -EINVAL; ++ + if (cell->bit_offset || cell->nbits) { + buf = nvmem_cell_prepare_write_buffer(cell, buf, len); + if (IS_ERR(buf)) +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -54,6 +54,8 @@ struct nvmem_keepout { + * @bit_offset: Bit offset if cell is smaller than a byte. + * @nbits: Number of bits. + * @np: Optional device_node pointer. ++ * @read_post_process: Callback for optional post processing of cell data ++ * on reads. + */ + struct nvmem_cell_info { + const char *name; +@@ -62,6 +64,7 @@ struct nvmem_cell_info { + unsigned int bit_offset; + unsigned int nbits; + struct device_node *np; ++ nvmem_cell_post_process_t read_post_process; + }; + + /** diff --git a/target/linux/generic/backport-5.15/811-v6.4-0006-nvmem-core-allow-to-modify-a-cell-before-adding-it.patch b/target/linux/generic/backport-5.15/811-v6.4-0006-nvmem-core-allow-to-modify-a-cell-before-adding-it.patch new file mode 100644 index 0000000000..32990148c8 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0006-nvmem-core-allow-to-modify-a-cell-before-adding-it.patch @@ -0,0 +1,59 @@ +From de12c9691501ccba41a154c223869f82be4c12fd Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Tue, 4 Apr 2023 18:21:25 +0100 +Subject: [PATCH] nvmem: core: allow to modify a cell before adding it + +Provide a way to modify a cell before it will get added. This is useful +to attach a custom post processing hook via a layout. + +Signed-off-by: Michael Walle +Signed-off-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-18-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 4 ++++ + include/linux/nvmem-provider.h | 5 +++++ + 2 files changed, 9 insertions(+) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -695,6 +695,7 @@ static int nvmem_validate_keepouts(struc + + static int nvmem_add_cells_from_of(struct nvmem_device *nvmem) + { ++ struct nvmem_layout *layout = nvmem->layout; + struct device *dev = &nvmem->dev; + struct device_node *child; + const __be32 *addr; +@@ -724,6 +725,9 @@ static int nvmem_add_cells_from_of(struc + + info.np = of_node_get(child); + ++ if (layout && layout->fixup_cell_info) ++ layout->fixup_cell_info(nvmem, layout, &info); ++ + ret = nvmem_add_one_cell(nvmem, &info); + kfree(info.name); + if (ret) { +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -155,6 +155,8 @@ struct nvmem_cell_table { + * @add_cells: Will be called if a nvmem device is found which + * has this layout. The function will add layout + * specific cells with nvmem_add_one_cell(). ++ * @fixup_cell_info: Will be called before a cell is added. Can be ++ * used to modify the nvmem_cell_info. + * @owner: Pointer to struct module. + * @node: List node. + * +@@ -168,6 +170,9 @@ struct nvmem_layout { + const struct of_device_id *of_match_table; + int (*add_cells)(struct device *dev, struct nvmem_device *nvmem, + struct nvmem_layout *layout); ++ void (*fixup_cell_info)(struct nvmem_device *nvmem, ++ struct nvmem_layout *layout, ++ struct nvmem_cell_info *cell); + + /* private */ + struct module *owner; diff --git a/target/linux/generic/backport-5.15/811-v6.4-0007-nvmem-imx-ocotp-replace-global-post-processing-with-.patch b/target/linux/generic/backport-5.15/811-v6.4-0007-nvmem-imx-ocotp-replace-global-post-processing-with-.patch new file mode 100644 index 0000000000..2a5fa618ea --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0007-nvmem-imx-ocotp-replace-global-post-processing-with-.patch @@ -0,0 +1,81 @@ +From 6c56a82d7895a213a43182a5d01a21a906a79847 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Tue, 4 Apr 2023 18:21:26 +0100 +Subject: [PATCH] nvmem: imx-ocotp: replace global post processing with layouts + +In preparation of retiring the global post processing hook change this +driver to use layouts. The layout will be supplied during registration +and will be used to add the post processing hook to all added cells. + +Signed-off-by: Michael Walle +Tested-by: Michael Walle # on kontron-pitx-imx8m +Signed-off-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-19-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/imx-ocotp.c | 30 +++++++++++++++++++----------- + 1 file changed, 19 insertions(+), 11 deletions(-) + +--- a/drivers/nvmem/imx-ocotp.c ++++ b/drivers/nvmem/imx-ocotp.c +@@ -225,18 +225,13 @@ read_end: + static int imx_ocotp_cell_pp(void *context, const char *id, int index, + unsigned int offset, void *data, size_t bytes) + { +- struct ocotp_priv *priv = context; ++ u8 *buf = data; ++ int i; + + /* Deal with some post processing of nvmem cell data */ +- if (id && !strcmp(id, "mac-address")) { +- if (priv->params->reverse_mac_address) { +- u8 *buf = data; +- int i; +- +- for (i = 0; i < bytes/2; i++) +- swap(buf[i], buf[bytes - i - 1]); +- } +- } ++ if (id && !strcmp(id, "mac-address")) ++ for (i = 0; i < bytes / 2; i++) ++ swap(buf[i], buf[bytes - i - 1]); + + return 0; + } +@@ -488,7 +483,6 @@ static struct nvmem_config imx_ocotp_nvm + .stride = 1, + .reg_read = imx_ocotp_read, + .reg_write = imx_ocotp_write, +- .cell_post_process = imx_ocotp_cell_pp, + }; + + static const struct ocotp_params imx6q_params = { +@@ -595,6 +589,17 @@ static const struct of_device_id imx_oco + }; + MODULE_DEVICE_TABLE(of, imx_ocotp_dt_ids); + ++static void imx_ocotp_fixup_cell_info(struct nvmem_device *nvmem, ++ struct nvmem_layout *layout, ++ struct nvmem_cell_info *cell) ++{ ++ cell->read_post_process = imx_ocotp_cell_pp; ++} ++ ++struct nvmem_layout imx_ocotp_layout = { ++ .fixup_cell_info = imx_ocotp_fixup_cell_info, ++}; ++ + static int imx_ocotp_probe(struct platform_device *pdev) + { + struct device *dev = &pdev->dev; +@@ -619,6 +624,9 @@ static int imx_ocotp_probe(struct platfo + imx_ocotp_nvmem_config.size = 4 * priv->params->nregs; + imx_ocotp_nvmem_config.dev = dev; + imx_ocotp_nvmem_config.priv = priv; ++ if (priv->params->reverse_mac_address) ++ imx_ocotp_nvmem_config.layout = &imx_ocotp_layout; ++ + priv->config = &imx_ocotp_nvmem_config; + + clk_prepare_enable(priv->clk); diff --git a/target/linux/generic/backport-5.15/811-v6.4-0008-nvmem-cell-drop-global-cell_post_process.patch b/target/linux/generic/backport-5.15/811-v6.4-0008-nvmem-cell-drop-global-cell_post_process.patch new file mode 100644 index 0000000000..eac202b882 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0008-nvmem-cell-drop-global-cell_post_process.patch @@ -0,0 +1,68 @@ +From 011e40a166fdaa65fb9946b7cd91efec85b70dbb Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Tue, 4 Apr 2023 18:21:27 +0100 +Subject: [PATCH] nvmem: cell: drop global cell_post_process + +There are no users anymore for the global cell_post_process callback +anymore. New users should use proper nvmem layouts. + +Signed-off-by: Michael Walle +Signed-off-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-20-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 9 --------- + include/linux/nvmem-provider.h | 2 -- + 2 files changed, 11 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -39,7 +39,6 @@ struct nvmem_device { + unsigned int nkeepout; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; +- nvmem_cell_post_process_t cell_post_process; + struct gpio_desc *wp_gpio; + struct nvmem_layout *layout; + void *priv; +@@ -903,7 +902,6 @@ struct nvmem_device *nvmem_register(cons + nvmem->type = config->type; + nvmem->reg_read = config->reg_read; + nvmem->reg_write = config->reg_write; +- nvmem->cell_post_process = config->cell_post_process; + nvmem->keepout = config->keepout; + nvmem->nkeepout = config->nkeepout; + if (config->of_node) +@@ -1575,13 +1573,6 @@ static int __nvmem_cell_read(struct nvme + if (rc) + return rc; + } +- +- if (nvmem->cell_post_process) { +- rc = nvmem->cell_post_process(nvmem->priv, id, index, +- cell->offset, buf, cell->bytes); +- if (rc) +- return rc; +- } + + if (len) + *len = cell->bytes; +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -85,7 +85,6 @@ struct nvmem_cell_info { + * @no_of_node: Device should not use the parent's of_node even if it's !NULL. + * @reg_read: Callback to read data. + * @reg_write: Callback to write data. +- * @cell_post_process: Callback for vendor specific post processing of cell data + * @size: Device size. + * @word_size: Minimum read/write access granularity. + * @stride: Minimum read/write access stride. +@@ -118,7 +117,6 @@ struct nvmem_config { + bool no_of_node; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; +- nvmem_cell_post_process_t cell_post_process; + int size; + int word_size; + int stride; diff --git a/target/linux/generic/backport-5.15/811-v6.4-0009-nvmem-core-provide-own-priv-pointer-in-post-process-.patch b/target/linux/generic/backport-5.15/811-v6.4-0009-nvmem-core-provide-own-priv-pointer-in-post-process-.patch new file mode 100644 index 0000000000..46b30a2ed9 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0009-nvmem-core-provide-own-priv-pointer-in-post-process-.patch @@ -0,0 +1,76 @@ +From 8a134fd9f9323f4c39ec27055b3d3723cfb5c1e9 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Tue, 4 Apr 2023 18:21:28 +0100 +Subject: [PATCH] nvmem: core: provide own priv pointer in post process + callback + +It doesn't make any more sense to have a opaque pointer set up by the +nvmem device. Usually, the layout isn't associated with a particular +nvmem device. Instead, let the caller who set the post process callback +provide the priv pointer. + +Signed-off-by: Michael Walle +Signed-off-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-21-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 4 +++- + include/linux/nvmem-provider.h | 5 ++++- + 2 files changed, 7 insertions(+), 2 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -54,6 +54,7 @@ struct nvmem_cell_entry { + int bit_offset; + int nbits; + nvmem_cell_post_process_t read_post_process; ++ void *priv; + struct device_node *np; + struct nvmem_device *nvmem; + struct list_head node; +@@ -471,6 +472,7 @@ static int nvmem_cell_info_to_nvmem_cell + cell->bytes = info->bytes; + cell->name = info->name; + cell->read_post_process = info->read_post_process; ++ cell->priv = info->priv; + + cell->bit_offset = info->bit_offset; + cell->nbits = info->nbits; +@@ -1568,7 +1570,7 @@ static int __nvmem_cell_read(struct nvme + nvmem_shift_read_buffer_in_place(cell, buf); + + if (cell->read_post_process) { +- rc = cell->read_post_process(nvmem->priv, id, index, ++ rc = cell->read_post_process(cell->priv, id, index, + cell->offset, buf, cell->bytes); + if (rc) + return rc; +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -20,7 +20,8 @@ typedef int (*nvmem_reg_write_t)(void *p + void *val, size_t bytes); + /* used for vendor specific post processing of cell data */ + typedef int (*nvmem_cell_post_process_t)(void *priv, const char *id, int index, +- unsigned int offset, void *buf, size_t bytes); ++ unsigned int offset, void *buf, ++ size_t bytes); + + enum nvmem_type { + NVMEM_TYPE_UNKNOWN = 0, +@@ -56,6 +57,7 @@ struct nvmem_keepout { + * @np: Optional device_node pointer. + * @read_post_process: Callback for optional post processing of cell data + * on reads. ++ * @priv: Opaque data passed to the read_post_process hook. + */ + struct nvmem_cell_info { + const char *name; +@@ -65,6 +67,7 @@ struct nvmem_cell_info { + unsigned int nbits; + struct device_node *np; + nvmem_cell_post_process_t read_post_process; ++ void *priv; + }; + + /** diff --git a/target/linux/generic/backport-5.15/811-v6.4-0010-nvmem-layouts-sl28vpd-Add-new-layout-driver.patch b/target/linux/generic/backport-5.15/811-v6.4-0010-nvmem-layouts-sl28vpd-Add-new-layout-driver.patch new file mode 100644 index 0000000000..7d97658b60 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0010-nvmem-layouts-sl28vpd-Add-new-layout-driver.patch @@ -0,0 +1,215 @@ +From d9fae023fe86069750092fc1c2f3a73e2fb18512 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Tue, 4 Apr 2023 18:21:29 +0100 +Subject: [PATCH] nvmem: layouts: sl28vpd: Add new layout driver + +This layout applies to the VPD of the Kontron sl28 boards. The VPD only +contains a base MAC address. Therefore, we have to add an individual +offset to it. This is done by taking the second argument of the nvmem +phandle into account. Also this let us checking the VPD version and the +checksum. + +Signed-off-by: Michael Walle +Signed-off-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-22-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/layouts/Kconfig | 9 ++ + drivers/nvmem/layouts/Makefile | 2 + + drivers/nvmem/layouts/sl28vpd.c | 165 ++++++++++++++++++++++++++++++++ + 3 files changed, 176 insertions(+) + create mode 100644 drivers/nvmem/layouts/sl28vpd.c + +--- a/drivers/nvmem/layouts/Kconfig ++++ b/drivers/nvmem/layouts/Kconfig +@@ -2,4 +2,13 @@ + + menu "Layout Types" + ++config NVMEM_LAYOUT_SL28_VPD ++ tristate "Kontron sl28 VPD layout support" ++ select CRC8 ++ help ++ Say Y here if you want to support the VPD layout of the Kontron ++ SMARC-sAL28 boards. ++ ++ If unsure, say N. ++ + endmenu +--- a/drivers/nvmem/layouts/Makefile ++++ b/drivers/nvmem/layouts/Makefile +@@ -2,3 +2,5 @@ + # + # Makefile for nvmem layouts. + # ++ ++obj-$(CONFIG_NVMEM_LAYOUT_SL28_VPD) += sl28vpd.o +--- /dev/null ++++ b/drivers/nvmem/layouts/sl28vpd.c +@@ -0,0 +1,165 @@ ++// SPDX-License-Identifier: GPL-2.0 ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define SL28VPD_MAGIC 'V' ++ ++struct sl28vpd_header { ++ u8 magic; ++ u8 version; ++} __packed; ++ ++struct sl28vpd_v1 { ++ struct sl28vpd_header header; ++ char serial_number[15]; ++ u8 base_mac_address[ETH_ALEN]; ++ u8 crc8; ++} __packed; ++ ++static int sl28vpd_mac_address_pp(void *priv, const char *id, int index, ++ unsigned int offset, void *buf, ++ size_t bytes) ++{ ++ if (bytes != ETH_ALEN) ++ return -EINVAL; ++ ++ if (index < 0) ++ return -EINVAL; ++ ++ if (!is_valid_ether_addr(buf)) ++ return -EINVAL; ++ ++ eth_addr_add(buf, index); ++ ++ return 0; ++} ++ ++static const struct nvmem_cell_info sl28vpd_v1_entries[] = { ++ { ++ .name = "serial-number", ++ .offset = offsetof(struct sl28vpd_v1, serial_number), ++ .bytes = sizeof_field(struct sl28vpd_v1, serial_number), ++ }, ++ { ++ .name = "base-mac-address", ++ .offset = offsetof(struct sl28vpd_v1, base_mac_address), ++ .bytes = sizeof_field(struct sl28vpd_v1, base_mac_address), ++ .read_post_process = sl28vpd_mac_address_pp, ++ }, ++}; ++ ++static int sl28vpd_v1_check_crc(struct device *dev, struct nvmem_device *nvmem) ++{ ++ struct sl28vpd_v1 data_v1; ++ u8 table[CRC8_TABLE_SIZE]; ++ int ret; ++ u8 crc; ++ ++ crc8_populate_msb(table, 0x07); ++ ++ ret = nvmem_device_read(nvmem, 0, sizeof(data_v1), &data_v1); ++ if (ret < 0) ++ return ret; ++ else if (ret != sizeof(data_v1)) ++ return -EIO; ++ ++ crc = crc8(table, (void *)&data_v1, sizeof(data_v1) - 1, 0); ++ ++ if (crc != data_v1.crc8) { ++ dev_err(dev, ++ "Checksum is invalid (got %02x, expected %02x).\n", ++ crc, data_v1.crc8); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static int sl28vpd_add_cells(struct device *dev, struct nvmem_device *nvmem, ++ struct nvmem_layout *layout) ++{ ++ const struct nvmem_cell_info *pinfo; ++ struct nvmem_cell_info info = {0}; ++ struct device_node *layout_np; ++ struct sl28vpd_header hdr; ++ int ret, i; ++ ++ /* check header */ ++ ret = nvmem_device_read(nvmem, 0, sizeof(hdr), &hdr); ++ if (ret < 0) ++ return ret; ++ else if (ret != sizeof(hdr)) ++ return -EIO; ++ ++ if (hdr.magic != SL28VPD_MAGIC) { ++ dev_err(dev, "Invalid magic value (%02x)\n", hdr.magic); ++ return -EINVAL; ++ } ++ ++ if (hdr.version != 1) { ++ dev_err(dev, "Version %d is unsupported.\n", hdr.version); ++ return -EINVAL; ++ } ++ ++ ret = sl28vpd_v1_check_crc(dev, nvmem); ++ if (ret) ++ return ret; ++ ++ layout_np = of_nvmem_layout_get_container(nvmem); ++ if (!layout_np) ++ return -ENOENT; ++ ++ for (i = 0; i < ARRAY_SIZE(sl28vpd_v1_entries); i++) { ++ pinfo = &sl28vpd_v1_entries[i]; ++ ++ info.name = pinfo->name; ++ info.offset = pinfo->offset; ++ info.bytes = pinfo->bytes; ++ info.read_post_process = pinfo->read_post_process; ++ info.np = of_get_child_by_name(layout_np, pinfo->name); ++ ++ ret = nvmem_add_one_cell(nvmem, &info); ++ if (ret) { ++ of_node_put(layout_np); ++ return ret; ++ } ++ } ++ ++ of_node_put(layout_np); ++ ++ return 0; ++} ++ ++static const struct of_device_id sl28vpd_of_match_table[] = { ++ { .compatible = "kontron,sl28-vpd" }, ++ {}, ++}; ++MODULE_DEVICE_TABLE(of, sl28vpd_of_match_table); ++ ++struct nvmem_layout sl28vpd_layout = { ++ .name = "sl28-vpd", ++ .of_match_table = sl28vpd_of_match_table, ++ .add_cells = sl28vpd_add_cells, ++}; ++ ++static int __init sl28vpd_init(void) ++{ ++ return nvmem_layout_register(&sl28vpd_layout); ++} ++ ++static void __exit sl28vpd_exit(void) ++{ ++ nvmem_layout_unregister(&sl28vpd_layout); ++} ++ ++module_init(sl28vpd_init); ++module_exit(sl28vpd_exit); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Michael Walle "); ++MODULE_DESCRIPTION("NVMEM layout driver for the VPD of Kontron sl28 boards"); diff --git a/target/linux/generic/backport-5.15/811-v6.4-0011-nvmem-layouts-onie-tlv-Add-new-layout-driver.patch b/target/linux/generic/backport-5.15/811-v6.4-0011-nvmem-layouts-onie-tlv-Add-new-layout-driver.patch new file mode 100644 index 0000000000..ca8b4bc069 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0011-nvmem-layouts-onie-tlv-Add-new-layout-driver.patch @@ -0,0 +1,306 @@ +From d3c0d12f6474216bf386101e2449cc73e5c5b61d Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 4 Apr 2023 18:21:31 +0100 +Subject: [PATCH] nvmem: layouts: onie-tlv: Add new layout driver + +This layout applies on top of any non volatile storage device containing +an ONIE table factory flashed. This table follows the tlv +(type-length-value) organization described in the link below. We cannot +afford using regular parsers because the content of these tables is +manufacturer specific and must be dynamically discovered. + +Link: https://opencomputeproject.github.io/onie/design-spec/hw_requirements.html +Signed-off-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-24-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/layouts/Kconfig | 9 ++ + drivers/nvmem/layouts/Makefile | 1 + + drivers/nvmem/layouts/onie-tlv.c | 257 +++++++++++++++++++++++++++++++ + 3 files changed, 267 insertions(+) + create mode 100644 drivers/nvmem/layouts/onie-tlv.c + +--- a/drivers/nvmem/layouts/Kconfig ++++ b/drivers/nvmem/layouts/Kconfig +@@ -11,4 +11,13 @@ config NVMEM_LAYOUT_SL28_VPD + + If unsure, say N. + ++config NVMEM_LAYOUT_ONIE_TLV ++ tristate "ONIE tlv support" ++ select CRC32 ++ help ++ Say Y here if you want to support the Open Compute Project ONIE ++ Type-Length-Value standard table. ++ ++ If unsure, say N. ++ + endmenu +--- a/drivers/nvmem/layouts/Makefile ++++ b/drivers/nvmem/layouts/Makefile +@@ -4,3 +4,4 @@ + # + + obj-$(CONFIG_NVMEM_LAYOUT_SL28_VPD) += sl28vpd.o ++obj-$(CONFIG_NVMEM_LAYOUT_ONIE_TLV) += onie-tlv.o +--- /dev/null ++++ b/drivers/nvmem/layouts/onie-tlv.c +@@ -0,0 +1,257 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * ONIE tlv NVMEM cells provider ++ * ++ * Copyright (C) 2022 Open Compute Group ONIE ++ * Author: Miquel Raynal ++ * Based on the nvmem driver written by: Vadym Kochan ++ * Inspired by the first layout written by: Rafał Miłecki ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define ONIE_TLV_MAX_LEN 2048 ++#define ONIE_TLV_CRC_FIELD_SZ 6 ++#define ONIE_TLV_CRC_SZ 4 ++#define ONIE_TLV_HDR_ID "TlvInfo" ++ ++struct onie_tlv_hdr { ++ u8 id[8]; ++ u8 version; ++ __be16 data_len; ++} __packed; ++ ++struct onie_tlv { ++ u8 type; ++ u8 len; ++} __packed; ++ ++static const char *onie_tlv_cell_name(u8 type) ++{ ++ switch (type) { ++ case 0x21: ++ return "product-name"; ++ case 0x22: ++ return "part-number"; ++ case 0x23: ++ return "serial-number"; ++ case 0x24: ++ return "mac-address"; ++ case 0x25: ++ return "manufacture-date"; ++ case 0x26: ++ return "device-version"; ++ case 0x27: ++ return "label-revision"; ++ case 0x28: ++ return "platform-name"; ++ case 0x29: ++ return "onie-version"; ++ case 0x2A: ++ return "num-macs"; ++ case 0x2B: ++ return "manufacturer"; ++ case 0x2C: ++ return "country-code"; ++ case 0x2D: ++ return "vendor"; ++ case 0x2E: ++ return "diag-version"; ++ case 0x2F: ++ return "service-tag"; ++ case 0xFD: ++ return "vendor-extension"; ++ case 0xFE: ++ return "crc32"; ++ default: ++ break; ++ } ++ ++ return NULL; ++} ++ ++static int onie_tlv_mac_read_cb(void *priv, const char *id, int index, ++ unsigned int offset, void *buf, ++ size_t bytes) ++{ ++ eth_addr_add(buf, index); ++ ++ return 0; ++} ++ ++static nvmem_cell_post_process_t onie_tlv_read_cb(u8 type, u8 *buf) ++{ ++ switch (type) { ++ case 0x24: ++ return &onie_tlv_mac_read_cb; ++ default: ++ break; ++ } ++ ++ return NULL; ++} ++ ++static int onie_tlv_add_cells(struct device *dev, struct nvmem_device *nvmem, ++ size_t data_len, u8 *data) ++{ ++ struct nvmem_cell_info cell = {}; ++ struct device_node *layout; ++ struct onie_tlv tlv; ++ unsigned int hdr_len = sizeof(struct onie_tlv_hdr); ++ unsigned int offset = 0; ++ int ret; ++ ++ layout = of_nvmem_layout_get_container(nvmem); ++ if (!layout) ++ return -ENOENT; ++ ++ while (offset < data_len) { ++ memcpy(&tlv, data + offset, sizeof(tlv)); ++ if (offset + tlv.len >= data_len) { ++ dev_err(dev, "Out of bounds field (0x%x bytes at 0x%x)\n", ++ tlv.len, hdr_len + offset); ++ break; ++ } ++ ++ cell.name = onie_tlv_cell_name(tlv.type); ++ if (!cell.name) ++ continue; ++ ++ cell.offset = hdr_len + offset + sizeof(tlv.type) + sizeof(tlv.len); ++ cell.bytes = tlv.len; ++ cell.np = of_get_child_by_name(layout, cell.name); ++ cell.read_post_process = onie_tlv_read_cb(tlv.type, data + offset + sizeof(tlv)); ++ ++ ret = nvmem_add_one_cell(nvmem, &cell); ++ if (ret) { ++ of_node_put(layout); ++ return ret; ++ } ++ ++ offset += sizeof(tlv) + tlv.len; ++ } ++ ++ of_node_put(layout); ++ ++ return 0; ++} ++ ++static bool onie_tlv_hdr_is_valid(struct device *dev, struct onie_tlv_hdr *hdr) ++{ ++ if (memcmp(hdr->id, ONIE_TLV_HDR_ID, sizeof(hdr->id))) { ++ dev_err(dev, "Invalid header\n"); ++ return false; ++ } ++ ++ if (hdr->version != 0x1) { ++ dev_err(dev, "Invalid version number\n"); ++ return false; ++ } ++ ++ return true; ++} ++ ++static bool onie_tlv_crc_is_valid(struct device *dev, size_t table_len, u8 *table) ++{ ++ struct onie_tlv crc_hdr; ++ u32 read_crc, calc_crc; ++ __be32 crc_be; ++ ++ memcpy(&crc_hdr, table + table_len - ONIE_TLV_CRC_FIELD_SZ, sizeof(crc_hdr)); ++ if (crc_hdr.type != 0xfe || crc_hdr.len != ONIE_TLV_CRC_SZ) { ++ dev_err(dev, "Invalid CRC field\n"); ++ return false; ++ } ++ ++ /* The table contains a JAMCRC, which is XOR'ed compared to the original ++ * CRC32 implementation as known in the Ethernet world. ++ */ ++ memcpy(&crc_be, table + table_len - ONIE_TLV_CRC_SZ, ONIE_TLV_CRC_SZ); ++ read_crc = be32_to_cpu(crc_be); ++ calc_crc = crc32(~0, table, table_len - ONIE_TLV_CRC_SZ) ^ 0xFFFFFFFF; ++ if (read_crc != calc_crc) { ++ dev_err(dev, "Invalid CRC read: 0x%08x, expected: 0x%08x\n", ++ read_crc, calc_crc); ++ return false; ++ } ++ ++ return true; ++} ++ ++static int onie_tlv_parse_table(struct device *dev, struct nvmem_device *nvmem, ++ struct nvmem_layout *layout) ++{ ++ struct onie_tlv_hdr hdr; ++ size_t table_len, data_len, hdr_len; ++ u8 *table, *data; ++ int ret; ++ ++ ret = nvmem_device_read(nvmem, 0, sizeof(hdr), &hdr); ++ if (ret < 0) ++ return ret; ++ ++ if (!onie_tlv_hdr_is_valid(dev, &hdr)) { ++ dev_err(dev, "Invalid ONIE TLV header\n"); ++ return -EINVAL; ++ } ++ ++ hdr_len = sizeof(hdr.id) + sizeof(hdr.version) + sizeof(hdr.data_len); ++ data_len = be16_to_cpu(hdr.data_len); ++ table_len = hdr_len + data_len; ++ if (table_len > ONIE_TLV_MAX_LEN) { ++ dev_err(dev, "Invalid ONIE TLV data length\n"); ++ return -EINVAL; ++ } ++ ++ table = devm_kmalloc(dev, table_len, GFP_KERNEL); ++ if (!table) ++ return -ENOMEM; ++ ++ ret = nvmem_device_read(nvmem, 0, table_len, table); ++ if (ret != table_len) ++ return ret; ++ ++ if (!onie_tlv_crc_is_valid(dev, table_len, table)) ++ return -EINVAL; ++ ++ data = table + hdr_len; ++ ret = onie_tlv_add_cells(dev, nvmem, data_len, data); ++ if (ret) ++ return ret; ++ ++ return 0; ++} ++ ++static const struct of_device_id onie_tlv_of_match_table[] = { ++ { .compatible = "onie,tlv-layout", }, ++ {}, ++}; ++MODULE_DEVICE_TABLE(of, onie_tlv_of_match_table); ++ ++static struct nvmem_layout onie_tlv_layout = { ++ .name = "ONIE tlv layout", ++ .of_match_table = onie_tlv_of_match_table, ++ .add_cells = onie_tlv_parse_table, ++}; ++ ++static int __init onie_tlv_init(void) ++{ ++ return nvmem_layout_register(&onie_tlv_layout); ++} ++ ++static void __exit onie_tlv_exit(void) ++{ ++ nvmem_layout_unregister(&onie_tlv_layout); ++} ++ ++module_init(onie_tlv_init); ++module_exit(onie_tlv_exit); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Miquel Raynal "); ++MODULE_DESCRIPTION("NVMEM layout driver for Onie TLV table parsing"); ++MODULE_ALIAS("NVMEM layout driver for Onie TLV table parsing"); diff --git a/target/linux/generic/backport-5.15/811-v6.4-0012-nvmem-stm32-romem-mark-OF-related-data-as-maybe-unus.patch b/target/linux/generic/backport-5.15/811-v6.4-0012-nvmem-stm32-romem-mark-OF-related-data-as-maybe-unus.patch new file mode 100644 index 0000000000..94a0911d73 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0012-nvmem-stm32-romem-mark-OF-related-data-as-maybe-unus.patch @@ -0,0 +1,32 @@ +From a4fb434ef96ace5af758ca2c52c3a3f8f3abc87c Mon Sep 17 00:00:00 2001 +From: Krzysztof Kozlowski +Date: Tue, 4 Apr 2023 18:21:34 +0100 +Subject: [PATCH] nvmem: stm32-romem: mark OF related data as maybe unused +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The driver can be compile tested with !CONFIG_OF making certain data +unused: + + drivers/nvmem/stm32-romem.c:271:34: error: ‘stm32_romem_of_match’ defined but not used [-Werror=unused-const-variable=] + +Signed-off-by: Krzysztof Kozlowski +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-27-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/stm32-romem.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/stm32-romem.c ++++ b/drivers/nvmem/stm32-romem.c +@@ -268,7 +268,7 @@ static const struct stm32_romem_cfg stm3 + .ta = true, + }; + +-static const struct of_device_id stm32_romem_of_match[] = { ++static const struct of_device_id stm32_romem_of_match[] __maybe_unused = { + { .compatible = "st,stm32f4-otp", }, { + .compatible = "st,stm32mp15-bsec", + .data = (void *)&stm32mp15_bsec_cfg, diff --git a/target/linux/generic/backport-5.15/811-v6.4-0013-nvmem-mtk-efuse-Support-postprocessing-for-GPU-speed.patch b/target/linux/generic/backport-5.15/811-v6.4-0013-nvmem-mtk-efuse-Support-postprocessing-for-GPU-speed.patch new file mode 100644 index 0000000000..abda402bdd --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0013-nvmem-mtk-efuse-Support-postprocessing-for-GPU-speed.patch @@ -0,0 +1,120 @@ +From de6e05097f7db066afb0ad4c88b730949f7b7749 Mon Sep 17 00:00:00 2001 +From: AngeloGioacchino Del Regno +Date: Tue, 4 Apr 2023 18:21:35 +0100 +Subject: [PATCH] nvmem: mtk-efuse: Support postprocessing for GPU speed + binning data + +On some MediaTek SoCs GPU speed binning data is available for read +in the SoC's eFuse array but it has a format that is incompatible +with what the OPP API expects, as we read a number from 0 to 7 but +opp-supported-hw is expecting a bitmask to enable an OPP entry: +being what we read limited to 0-7, it's straightforward to simply +convert the value to BIT(value) as a post-processing action. + +So, introduce post-processing support and enable it by evaluating +the newly introduced platform data's `uses_post_processing` member, +currently enabled only for MT8186. + +Signed-off-by: AngeloGioacchino Del Regno +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-28-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/mtk-efuse.c | 53 +++++++++++++++++++++++++++++++++++++-- + 1 file changed, 51 insertions(+), 2 deletions(-) + +--- a/drivers/nvmem/mtk-efuse.c ++++ b/drivers/nvmem/mtk-efuse.c +@@ -10,6 +10,11 @@ + #include + #include + #include ++#include ++ ++struct mtk_efuse_pdata { ++ bool uses_post_processing; ++}; + + struct mtk_efuse_priv { + void __iomem *base; +@@ -29,6 +34,37 @@ static int mtk_reg_read(void *context, + return 0; + } + ++static int mtk_efuse_gpu_speedbin_pp(void *context, const char *id, int index, ++ unsigned int offset, void *data, size_t bytes) ++{ ++ u8 *val = data; ++ ++ if (val[0] < 8) ++ val[0] = BIT(val[0]); ++ ++ return 0; ++} ++ ++static void mtk_efuse_fixup_cell_info(struct nvmem_device *nvmem, ++ struct nvmem_layout *layout, ++ struct nvmem_cell_info *cell) ++{ ++ size_t sz = strlen(cell->name); ++ ++ /* ++ * On some SoCs, the GPU speedbin is not read as bitmask but as ++ * a number with range [0-7] (max 3 bits): post process to use ++ * it in OPP tables to describe supported-hw. ++ */ ++ if (cell->nbits <= 3 && ++ strncmp(cell->name, "gpu-speedbin", min(sz, strlen("gpu-speedbin"))) == 0) ++ cell->read_post_process = mtk_efuse_gpu_speedbin_pp; ++} ++ ++static struct nvmem_layout mtk_efuse_layout = { ++ .fixup_cell_info = mtk_efuse_fixup_cell_info, ++}; ++ + static int mtk_efuse_probe(struct platform_device *pdev) + { + struct device *dev = &pdev->dev; +@@ -36,6 +72,7 @@ static int mtk_efuse_probe(struct platfo + struct nvmem_device *nvmem; + struct nvmem_config econfig = {}; + struct mtk_efuse_priv *priv; ++ const struct mtk_efuse_pdata *pdata; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) +@@ -45,20 +82,32 @@ static int mtk_efuse_probe(struct platfo + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + ++ pdata = device_get_match_data(dev); + econfig.stride = 1; + econfig.word_size = 1; + econfig.reg_read = mtk_reg_read; + econfig.size = resource_size(res); + econfig.priv = priv; + econfig.dev = dev; ++ if (pdata->uses_post_processing) ++ econfig.layout = &mtk_efuse_layout; + nvmem = devm_nvmem_register(dev, &econfig); + + return PTR_ERR_OR_ZERO(nvmem); + } + ++static const struct mtk_efuse_pdata mtk_mt8186_efuse_pdata = { ++ .uses_post_processing = true, ++}; ++ ++static const struct mtk_efuse_pdata mtk_efuse_pdata = { ++ .uses_post_processing = false, ++}; ++ + static const struct of_device_id mtk_efuse_of_match[] = { +- { .compatible = "mediatek,mt8173-efuse",}, +- { .compatible = "mediatek,efuse",}, ++ { .compatible = "mediatek,mt8173-efuse", .data = &mtk_efuse_pdata }, ++ { .compatible = "mediatek,mt8186-efuse", .data = &mtk_mt8186_efuse_pdata }, ++ { .compatible = "mediatek,efuse", .data = &mtk_efuse_pdata }, + {/* sentinel */}, + }; + MODULE_DEVICE_TABLE(of, mtk_efuse_of_match); diff --git a/target/linux/generic/backport-5.15/811-v6.4-0014-nvmem-bcm-ocotp-Use-devm_platform_ioremap_resource.patch b/target/linux/generic/backport-5.15/811-v6.4-0014-nvmem-bcm-ocotp-Use-devm_platform_ioremap_resource.patch new file mode 100644 index 0000000000..a0874f73d1 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0014-nvmem-bcm-ocotp-Use-devm_platform_ioremap_resource.patch @@ -0,0 +1,39 @@ +From 1dc552fa33cf98af3e784dbc0500da93cae3b24a Mon Sep 17 00:00:00 2001 +From: Yang Li +Date: Tue, 4 Apr 2023 18:21:38 +0100 +Subject: [PATCH] nvmem: bcm-ocotp: Use devm_platform_ioremap_resource() + +According to commit 7945f929f1a7 ("drivers: provide +devm_platform_ioremap_resource()"), convert platform_get_resource(), +devm_ioremap_resource() to a single call to use +devm_platform_ioremap_resource(), as this is exactly what this function +does. + +Signed-off-by: Yang Li +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-31-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/bcm-ocotp.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/drivers/nvmem/bcm-ocotp.c ++++ b/drivers/nvmem/bcm-ocotp.c +@@ -254,7 +254,6 @@ MODULE_DEVICE_TABLE(acpi, bcm_otpc_acpi_ + static int bcm_otpc_probe(struct platform_device *pdev) + { + struct device *dev = &pdev->dev; +- struct resource *res; + struct otpc_priv *priv; + struct nvmem_device *nvmem; + int err; +@@ -269,8 +268,7 @@ static int bcm_otpc_probe(struct platfor + return -ENODEV; + + /* Get OTP base address register. */ +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- priv->base = devm_ioremap_resource(dev, res); ++ priv->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(priv->base)) { + dev_err(dev, "unable to map I/O memory\n"); + return PTR_ERR(priv->base); diff --git a/target/linux/generic/backport-5.15/811-v6.4-0015-nvmem-nintendo-otp-Use-devm_platform_ioremap_resourc.patch b/target/linux/generic/backport-5.15/811-v6.4-0015-nvmem-nintendo-otp-Use-devm_platform_ioremap_resourc.patch new file mode 100644 index 0000000000..890dacd08d --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0015-nvmem-nintendo-otp-Use-devm_platform_ioremap_resourc.patch @@ -0,0 +1,39 @@ +From 649409990d2e93fac657be7c6960c28a2c601d65 Mon Sep 17 00:00:00 2001 +From: Yang Li +Date: Tue, 4 Apr 2023 18:21:39 +0100 +Subject: [PATCH] nvmem: nintendo-otp: Use devm_platform_ioremap_resource() + +According to commit 7945f929f1a7 ("drivers: provide +devm_platform_ioremap_resource()"), convert platform_get_resource(), +devm_ioremap_resource() to a single call to use +devm_platform_ioremap_resource(), as this is exactly what this function +does. + +Signed-off-by: Yang Li +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-32-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/nintendo-otp.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/drivers/nvmem/nintendo-otp.c ++++ b/drivers/nvmem/nintendo-otp.c +@@ -76,7 +76,6 @@ static int nintendo_otp_probe(struct pla + struct device *dev = &pdev->dev; + const struct of_device_id *of_id = + of_match_device(nintendo_otp_of_table, dev); +- struct resource *res; + struct nvmem_device *nvmem; + struct nintendo_otp_priv *priv; + +@@ -92,8 +91,7 @@ static int nintendo_otp_probe(struct pla + if (!priv) + return -ENOMEM; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- priv->regs = devm_ioremap_resource(dev, res); ++ priv->regs = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(priv->regs)) + return PTR_ERR(priv->regs); + diff --git a/target/linux/generic/backport-5.15/811-v6.4-0016-nvmem-vf610-ocotp-Use-devm_platform_get_and_ioremap_.patch b/target/linux/generic/backport-5.15/811-v6.4-0016-nvmem-vf610-ocotp-Use-devm_platform_get_and_ioremap_.patch new file mode 100644 index 0000000000..3f5d3c1ad4 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0016-nvmem-vf610-ocotp-Use-devm_platform_get_and_ioremap_.patch @@ -0,0 +1,32 @@ +From c2367aa60d5e34d48582362c6de34b4131d92be7 Mon Sep 17 00:00:00 2001 +From: Yang Li +Date: Tue, 4 Apr 2023 18:21:40 +0100 +Subject: [PATCH] nvmem: vf610-ocotp: Use + devm_platform_get_and_ioremap_resource() + +According to commit 890cc39a8799 ("drivers: provide +devm_platform_get_and_ioremap_resource()"), convert +platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yang Li +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-33-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/vf610-ocotp.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/nvmem/vf610-ocotp.c ++++ b/drivers/nvmem/vf610-ocotp.c +@@ -219,8 +219,7 @@ static int vf610_ocotp_probe(struct plat + if (!ocotp_dev) + return -ENOMEM; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- ocotp_dev->base = devm_ioremap_resource(dev, res); ++ ocotp_dev->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(ocotp_dev->base)) + return PTR_ERR(ocotp_dev->base); + diff --git a/target/linux/generic/backport-5.15/811-v6.4-0017-nvmem-core-support-specifying-both-cell-raw-data-pos.patch b/target/linux/generic/backport-5.15/811-v6.4-0017-nvmem-core-support-specifying-both-cell-raw-data-pos.patch new file mode 100644 index 0000000000..eeb407e9bb --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0017-nvmem-core-support-specifying-both-cell-raw-data-pos.patch @@ -0,0 +1,115 @@ +From 55d4980ce55b6bb4be66877de4dbec513911b988 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 4 Apr 2023 18:21:42 +0100 +Subject: [PATCH] nvmem: core: support specifying both: cell raw data & post + read lengths +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Callback .read_post_process() is designed to modify raw cell content +before providing it to the consumer. So far we were dealing with +modifications that didn't affect cell size (length). In some cases +however cell content needs to be reformatted and resized. + +It's required e.g. to provide properly formatted MAC address in case +it's stored in a non-binary format (e.g. using ASCII). + +There were few discussions how to optimally handle that. Following +possible solutions were considered: +1. Allow .read_post_process() to realloc (resize) content buffer +2. Allow .read_post_process() to adjust (decrease) just buffer length +3. Register NVMEM cells using post-read sizes + +The preferred solution was the last one. The problem is that simply +adjusting "bytes" in NVMEM providers would result in core code NOT +passing whole raw data to .read_post_process() callbacks. It means +callback functions couldn't do their job without somehow manually +reading original cell content on their own. + +This patch deals with that by registering NVMEM cells with both lengths: +raw content one and post read one. It allows: +1. Core code to read whole raw cell content +2. Callbacks to return content they want + +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-35-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 11 +++++++---- + include/linux/nvmem-provider.h | 2 ++ + 2 files changed, 9 insertions(+), 4 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -50,6 +50,7 @@ struct nvmem_device { + struct nvmem_cell_entry { + const char *name; + int offset; ++ size_t raw_len; + int bytes; + int bit_offset; + int nbits; +@@ -469,6 +470,7 @@ static int nvmem_cell_info_to_nvmem_cell + { + cell->nvmem = nvmem; + cell->offset = info->offset; ++ cell->raw_len = info->raw_len ?: info->bytes; + cell->bytes = info->bytes; + cell->name = info->name; + cell->read_post_process = info->read_post_process; +@@ -1560,7 +1562,7 @@ static int __nvmem_cell_read(struct nvme + { + int rc; + +- rc = nvmem_reg_read(nvmem, cell->offset, buf, cell->bytes); ++ rc = nvmem_reg_read(nvmem, cell->offset, buf, cell->raw_len); + + if (rc) + return rc; +@@ -1571,7 +1573,7 @@ static int __nvmem_cell_read(struct nvme + + if (cell->read_post_process) { + rc = cell->read_post_process(cell->priv, id, index, +- cell->offset, buf, cell->bytes); ++ cell->offset, buf, cell->raw_len); + if (rc) + return rc; + } +@@ -1594,14 +1596,15 @@ static int __nvmem_cell_read(struct nvme + */ + void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len) + { +- struct nvmem_device *nvmem = cell->entry->nvmem; ++ struct nvmem_cell_entry *entry = cell->entry; ++ struct nvmem_device *nvmem = entry->nvmem; + u8 *buf; + int rc; + + if (!nvmem) + return ERR_PTR(-EINVAL); + +- buf = kzalloc(cell->entry->bytes, GFP_KERNEL); ++ buf = kzalloc(max_t(size_t, entry->raw_len, entry->bytes), GFP_KERNEL); + if (!buf) + return ERR_PTR(-ENOMEM); + +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -51,6 +51,7 @@ struct nvmem_keepout { + * struct nvmem_cell_info - NVMEM cell description + * @name: Name. + * @offset: Offset within the NVMEM device. ++ * @raw_len: Length of raw data (without post processing). + * @bytes: Length of the cell. + * @bit_offset: Bit offset if cell is smaller than a byte. + * @nbits: Number of bits. +@@ -62,6 +63,7 @@ struct nvmem_keepout { + struct nvmem_cell_info { + const char *name; + unsigned int offset; ++ size_t raw_len; + unsigned int bytes; + unsigned int bit_offset; + unsigned int nbits; diff --git a/target/linux/generic/backport-5.15/811-v6.4-0018-nvmem-u-boot-env-post-process-ethaddr-env-variable.patch b/target/linux/generic/backport-5.15/811-v6.4-0018-nvmem-u-boot-env-post-process-ethaddr-env-variable.patch new file mode 100644 index 0000000000..adde0ffc4b --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0018-nvmem-u-boot-env-post-process-ethaddr-env-variable.patch @@ -0,0 +1,81 @@ +From c49f1a8af6bcf6d18576bca898f8083ca4b129e1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 4 Apr 2023 18:21:43 +0100 +Subject: [PATCH] nvmem: u-boot-env: post-process "ethaddr" env variable +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +U-Boot environment variables are stored in ASCII format so "ethaddr" +requires parsing into binary to make it work with Ethernet interfaces. + +This includes support for indexes to support #nvmem-cell-cells = <1>. + +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-36-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 1 + + drivers/nvmem/u-boot-env.c | 26 ++++++++++++++++++++++++++ + 2 files changed, 27 insertions(+) + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -340,6 +340,7 @@ config NVMEM_U_BOOT_ENV + tristate "U-Boot environment variables support" + depends on OF && MTD + select CRC32 ++ select GENERIC_NET_UTILS + help + U-Boot stores its setup as environment variables. This driver adds + support for verifying & exporting such data. It also exposes variables +--- a/drivers/nvmem/u-boot-env.c ++++ b/drivers/nvmem/u-boot-env.c +@@ -4,6 +4,8 @@ + */ + + #include ++#include ++#include + #include + #include + #include +@@ -70,6 +72,25 @@ static int u_boot_env_read(void *context + return 0; + } + ++static int u_boot_env_read_post_process_ethaddr(void *context, const char *id, int index, ++ unsigned int offset, void *buf, size_t bytes) ++{ ++ u8 mac[ETH_ALEN]; ++ ++ if (bytes != 3 * ETH_ALEN - 1) ++ return -EINVAL; ++ ++ if (!mac_pton(buf, mac)) ++ return -EINVAL; ++ ++ if (index) ++ eth_addr_add(mac, index); ++ ++ ether_addr_copy(buf, mac); ++ ++ return 0; ++} ++ + static int u_boot_env_add_cells(struct u_boot_env *priv, uint8_t *buf, + size_t data_offset, size_t data_len) + { +@@ -101,6 +122,11 @@ static int u_boot_env_add_cells(struct u + priv->cells[idx].offset = data_offset + value - data; + priv->cells[idx].bytes = strlen(value); + priv->cells[idx].np = of_get_child_by_name(dev->of_node, priv->cells[idx].name); ++ if (!strcmp(var, "ethaddr")) { ++ priv->cells[idx].raw_len = strlen(value); ++ priv->cells[idx].bytes = ETH_ALEN; ++ priv->cells[idx].read_post_process = u_boot_env_read_post_process_ethaddr; ++ } + } + + if (WARN_ON(idx != priv->ncells)) diff --git a/target/linux/generic/backport-5.15/811-v6.4-0019-nvmem-Add-macro-to-register-nvmem-layout-drivers.patch b/target/linux/generic/backport-5.15/811-v6.4-0019-nvmem-Add-macro-to-register-nvmem-layout-drivers.patch new file mode 100644 index 0000000000..7c6fe22b5f --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0019-nvmem-Add-macro-to-register-nvmem-layout-drivers.patch @@ -0,0 +1,42 @@ +From 814c978f02db17f16e6aa2efa2a929372f06da09 Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 4 Apr 2023 18:21:44 +0100 +Subject: [PATCH] nvmem: Add macro to register nvmem layout drivers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Provide a module_nvmem_layout_driver() macro at the end of the +nvmem-provider.h header to reduce the boilerplate when registering nvmem +layout drivers. + +Suggested-by: Srinivas Kandagatla +Signed-off-by: Miquel Raynal +Acked-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-37-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + include/linux/nvmem-provider.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -9,6 +9,7 @@ + #ifndef _LINUX_NVMEM_PROVIDER_H + #define _LINUX_NVMEM_PROVIDER_H + ++#include + #include + #include + #include +@@ -242,4 +243,9 @@ nvmem_layout_get_match_data(struct nvmem + } + + #endif /* CONFIG_NVMEM */ ++ ++#define module_nvmem_layout_driver(__layout_driver) \ ++ module_driver(__layout_driver, nvmem_layout_register, \ ++ nvmem_layout_unregister) ++ + #endif /* ifndef _LINUX_NVMEM_PROVIDER_H */ diff --git a/target/linux/generic/backport-5.15/811-v6.4-0020-nvmem-layouts-sl28vpd-Use-module_nvmem_layout_driver.patch b/target/linux/generic/backport-5.15/811-v6.4-0020-nvmem-layouts-sl28vpd-Use-module_nvmem_layout_driver.patch new file mode 100644 index 0000000000..06646dd68b --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0020-nvmem-layouts-sl28vpd-Use-module_nvmem_layout_driver.patch @@ -0,0 +1,39 @@ +From 0abdf99fe0c86252ba274703425f8d543d7e7f0d Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 4 Apr 2023 18:21:45 +0100 +Subject: [PATCH] nvmem: layouts: sl28vpd: Use module_nvmem_layout_driver() + +Stop open-coding the module init/exit functions. Use the +module_nvmem_layout_driver() instead. + +Signed-off-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-38-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/layouts/sl28vpd.c | 14 +------------- + 1 file changed, 1 insertion(+), 13 deletions(-) + +--- a/drivers/nvmem/layouts/sl28vpd.c ++++ b/drivers/nvmem/layouts/sl28vpd.c +@@ -146,19 +146,7 @@ struct nvmem_layout sl28vpd_layout = { + .of_match_table = sl28vpd_of_match_table, + .add_cells = sl28vpd_add_cells, + }; +- +-static int __init sl28vpd_init(void) +-{ +- return nvmem_layout_register(&sl28vpd_layout); +-} +- +-static void __exit sl28vpd_exit(void) +-{ +- nvmem_layout_unregister(&sl28vpd_layout); +-} +- +-module_init(sl28vpd_init); +-module_exit(sl28vpd_exit); ++module_nvmem_layout_driver(sl28vpd_layout); + + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("Michael Walle "); diff --git a/target/linux/generic/backport-5.15/811-v6.4-0021-nvmem-layouts-onie-tlv-Use-module_nvmem_layout_drive.patch b/target/linux/generic/backport-5.15/811-v6.4-0021-nvmem-layouts-onie-tlv-Use-module_nvmem_layout_drive.patch new file mode 100644 index 0000000000..826f4378c2 --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0021-nvmem-layouts-onie-tlv-Use-module_nvmem_layout_drive.patch @@ -0,0 +1,39 @@ +From d119eb38faab61125aaa4f63c74eef61585cf34c Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 4 Apr 2023 18:21:46 +0100 +Subject: [PATCH] nvmem: layouts: onie-tlv: Use module_nvmem_layout_driver() + +Stop open-coding the module init/exit functions. Use the +module_nvmem_layout_driver() instead. + +Signed-off-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-39-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/layouts/onie-tlv.c | 14 +------------- + 1 file changed, 1 insertion(+), 13 deletions(-) + +--- a/drivers/nvmem/layouts/onie-tlv.c ++++ b/drivers/nvmem/layouts/onie-tlv.c +@@ -237,19 +237,7 @@ static struct nvmem_layout onie_tlv_layo + .of_match_table = onie_tlv_of_match_table, + .add_cells = onie_tlv_parse_table, + }; +- +-static int __init onie_tlv_init(void) +-{ +- return nvmem_layout_register(&onie_tlv_layout); +-} +- +-static void __exit onie_tlv_exit(void) +-{ +- nvmem_layout_unregister(&onie_tlv_layout); +-} +- +-module_init(onie_tlv_init); +-module_exit(onie_tlv_exit); ++module_nvmem_layout_driver(onie_tlv_layout); + + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("Miquel Raynal "); diff --git a/target/linux/generic/backport-5.15/811-v6.4-0022-nvmem-layouts-onie-tlv-Drop-wrong-module-alias.patch b/target/linux/generic/backport-5.15/811-v6.4-0022-nvmem-layouts-onie-tlv-Drop-wrong-module-alias.patch new file mode 100644 index 0000000000..f20db85ceb --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0022-nvmem-layouts-onie-tlv-Drop-wrong-module-alias.patch @@ -0,0 +1,24 @@ +From 6b13e4b6a9a45028ac730e550380077df1845912 Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 4 Apr 2023 18:21:47 +0100 +Subject: [PATCH] nvmem: layouts: onie-tlv: Drop wrong module alias + +The MODULE_ALIAS macro is misused here as it carries the +description. There is currently no relevant alias to provide so let's +just drop it. + +Signed-off-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-40-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/layouts/onie-tlv.c | 1 - + 1 file changed, 1 deletion(-) + +--- a/drivers/nvmem/layouts/onie-tlv.c ++++ b/drivers/nvmem/layouts/onie-tlv.c +@@ -242,4 +242,3 @@ module_nvmem_layout_driver(onie_tlv_layo + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("Miquel Raynal "); + MODULE_DESCRIPTION("NVMEM layout driver for Onie TLV table parsing"); +-MODULE_ALIAS("NVMEM layout driver for Onie TLV table parsing"); diff --git a/target/linux/generic/backport-5.15/811-v6.4-0023-nvmem-layouts-sl28vpd-set-varaiable-sl28vpd_layout-s.patch b/target/linux/generic/backport-5.15/811-v6.4-0023-nvmem-layouts-sl28vpd-set-varaiable-sl28vpd_layout-s.patch new file mode 100644 index 0000000000..5cf847b57a --- /dev/null +++ b/target/linux/generic/backport-5.15/811-v6.4-0023-nvmem-layouts-sl28vpd-set-varaiable-sl28vpd_layout-s.patch @@ -0,0 +1,31 @@ +From a8642cd11635a35a5f1dc31857887900d6610778 Mon Sep 17 00:00:00 2001 +From: Tom Rix +Date: Tue, 4 Apr 2023 18:21:48 +0100 +Subject: [PATCH] nvmem: layouts: sl28vpd: set varaiable sl28vpd_layout + storage-class-specifier to static + +smatch reports +drivers/nvmem/layouts/sl28vpd.c:144:21: warning: symbol + 'sl28vpd_layout' was not declared. Should it be static? + +This variable is only used in one file so it should be static. + +Signed-off-by: Tom Rix +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-41-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/layouts/sl28vpd.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/layouts/sl28vpd.c ++++ b/drivers/nvmem/layouts/sl28vpd.c +@@ -141,7 +141,7 @@ static const struct of_device_id sl28vpd + }; + MODULE_DEVICE_TABLE(of, sl28vpd_of_match_table); + +-struct nvmem_layout sl28vpd_layout = { ++static struct nvmem_layout sl28vpd_layout = { + .name = "sl28-vpd", + .of_match_table = sl28vpd_of_match_table, + .add_cells = sl28vpd_add_cells, diff --git a/target/linux/generic/backport-5.15/812-v6.2-firmware-nvram-bcm47xx-support-init-from-IO-memory.patch b/target/linux/generic/backport-5.15/812-v6.2-firmware-nvram-bcm47xx-support-init-from-IO-memory.patch new file mode 100644 index 0000000000..0fb56b8dee --- /dev/null +++ b/target/linux/generic/backport-5.15/812-v6.2-firmware-nvram-bcm47xx-support-init-from-IO-memory.patch @@ -0,0 +1,100 @@ +From a5be5ce0e25439fae3cd42e3d775979547926812 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 3 Nov 2022 09:25:29 +0100 +Subject: [PATCH] firmware/nvram: bcm47xx: support init from IO memory +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Provide NVMEM content to the NVRAM driver from a simple +memory resource. This is necessary to use NVRAM in a memory- +mapped flash device. Patch taken from libreCMCs development +tree. + +This patch makes it possible to use memory-mapped NVRAM +on the D-Link DWL-8610AP and the D-Link DIR-890L. + +Cc: Hauke Mehrtens +Cc: linux-mips@vger.kernel.org +Cc: Florian Fainelli +Cc: bcm-kernel-feedback-list@broadcom.com +Cc: Thomas Bogendoerfer +Signed-off-by: Rafał Miłecki +[Added an export for modules potentially using the init symbol] +Signed-off-by: Linus Walleij +Link: https://lore.kernel.org/r/20221103082529.359084-1-linus.walleij@linaro.org +Signed-off-by: Florian Fainelli +--- + drivers/firmware/broadcom/bcm47xx_nvram.c | 18 ++++++++++++++++++ + drivers/nvmem/brcm_nvram.c | 3 +++ + include/linux/bcm47xx_nvram.h | 6 ++++++ + 3 files changed, 27 insertions(+) + +--- a/drivers/firmware/broadcom/bcm47xx_nvram.c ++++ b/drivers/firmware/broadcom/bcm47xx_nvram.c +@@ -110,6 +110,24 @@ found: + return 0; + } + ++int bcm47xx_nvram_init_from_iomem(void __iomem *nvram_start, size_t res_size) ++{ ++ if (nvram_len) { ++ pr_warn("nvram already initialized\n"); ++ return -EEXIST; ++ } ++ ++ if (!bcm47xx_nvram_is_valid(nvram_start)) { ++ pr_err("No valid NVRAM found\n"); ++ return -ENOENT; ++ } ++ ++ bcm47xx_nvram_copy(nvram_start, res_size); ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(bcm47xx_nvram_init_from_iomem); ++ + /* + * On bcm47xx we need access to the NVRAM very early, so we can't use mtd + * subsystem to access flash. We can't even use platform device / driver to +--- a/drivers/nvmem/brcm_nvram.c ++++ b/drivers/nvmem/brcm_nvram.c +@@ -3,6 +3,7 @@ + * Copyright (C) 2021 Rafał Miłecki + */ + ++#include + #include + #include + #include +@@ -139,6 +140,8 @@ static int brcm_nvram_probe(struct platf + if (err) + return err; + ++ bcm47xx_nvram_init_from_iomem(priv->base, resource_size(res)); ++ + config.dev = dev; + config.cells = priv->cells; + config.ncells = priv->ncells; +--- a/include/linux/bcm47xx_nvram.h ++++ b/include/linux/bcm47xx_nvram.h +@@ -11,6 +11,7 @@ + #include + + #ifdef CONFIG_BCM47XX_NVRAM ++int bcm47xx_nvram_init_from_iomem(void __iomem *nvram_start, size_t res_size); + int bcm47xx_nvram_init_from_mem(u32 base, u32 lim); + int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len); + int bcm47xx_nvram_gpio_pin(const char *name); +@@ -20,6 +21,11 @@ static inline void bcm47xx_nvram_release + vfree(nvram); + }; + #else ++static inline int bcm47xx_nvram_init_from_iomem(void __iomem *nvram_start, ++ size_t res_size) ++{ ++ return -ENOTSUPP; ++} + static inline int bcm47xx_nvram_init_from_mem(u32 base, u32 lim) + { + return -ENOTSUPP; diff --git a/target/linux/generic/backport-5.15/813-v6.5-0001-nvmem-imx-ocotp-set-varaiable-imx_ocotp_layout-stora.patch b/target/linux/generic/backport-5.15/813-v6.5-0001-nvmem-imx-ocotp-set-varaiable-imx_ocotp_layout-stora.patch new file mode 100644 index 0000000000..38cfccd5ef --- /dev/null +++ b/target/linux/generic/backport-5.15/813-v6.5-0001-nvmem-imx-ocotp-set-varaiable-imx_ocotp_layout-stora.patch @@ -0,0 +1,31 @@ +From eebc6573ad940b62a87776db3917e912b4f52d78 Mon Sep 17 00:00:00 2001 +From: Tom Rix +Date: Sun, 11 Jun 2023 15:03:05 +0100 +Subject: [PATCH] nvmem: imx-ocotp: set varaiable imx_ocotp_layout + storage-class-specifier to static + +smatch reports +drivers/nvmem/imx-ocotp.c:599:21: warning: symbol + 'imx_ocotp_layout' was not declared. Should it be static? + +This variable is only used in one file so should be static. + +Signed-off-by: Tom Rix +Signed-off-by: Srinivas Kandagatla +Message-ID: <20230611140330.154222-2-srinivas.kandagatla@linaro.org> +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/imx-ocotp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/imx-ocotp.c ++++ b/drivers/nvmem/imx-ocotp.c +@@ -596,7 +596,7 @@ static void imx_ocotp_fixup_cell_info(st + cell->read_post_process = imx_ocotp_cell_pp; + } + +-struct nvmem_layout imx_ocotp_layout = { ++static struct nvmem_layout imx_ocotp_layout = { + .fixup_cell_info = imx_ocotp_fixup_cell_info, + }; + diff --git a/target/linux/generic/backport-5.15/813-v6.5-0002-nvmem-imx-ocotp-Reverse-MAC-addresses-on-all-i.MX-de.patch b/target/linux/generic/backport-5.15/813-v6.5-0002-nvmem-imx-ocotp-Reverse-MAC-addresses-on-all-i.MX-de.patch new file mode 100644 index 0000000000..7523e5ebf6 --- /dev/null +++ b/target/linux/generic/backport-5.15/813-v6.5-0002-nvmem-imx-ocotp-Reverse-MAC-addresses-on-all-i.MX-de.patch @@ -0,0 +1,71 @@ +From 8a00fc606312c68b98add8fe8e6f7a013ce29e78 Mon Sep 17 00:00:00 2001 +From: Alexander Stein +Date: Sun, 11 Jun 2023 15:03:06 +0100 +Subject: [PATCH] nvmem: imx-ocotp: Reverse MAC addresses on all i.MX derivates + +Not just i.MX8M, but all i.MX6/7 (and subtypes) need to reverse the +MAC address read from fuses. Exceptions are i.MX6SLL and i.MX7ULP which +do not support ethernet at all. + +Fixes: d0221a780cbc ("nvmem: imx-ocotp: add support for post processing") +Signed-off-by: Alexander Stein +Tested-by: Richard Leitner # imx6q +Signed-off-by: Srinivas Kandagatla +Message-ID: <20230611140330.154222-3-srinivas.kandagatla@linaro.org> +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/imx-ocotp.c | 8 +------- + 1 file changed, 1 insertion(+), 7 deletions(-) + +--- a/drivers/nvmem/imx-ocotp.c ++++ b/drivers/nvmem/imx-ocotp.c +@@ -97,7 +97,6 @@ struct ocotp_params { + unsigned int bank_address_words; + void (*set_timing)(struct ocotp_priv *priv); + struct ocotp_ctrl_reg ctrl; +- bool reverse_mac_address; + }; + + static int imx_ocotp_wait_for_busy(struct ocotp_priv *priv, u32 flags) +@@ -545,7 +544,6 @@ static const struct ocotp_params imx8mq_ + .bank_address_words = 0, + .set_timing = imx_ocotp_set_imx6_timing, + .ctrl = IMX_OCOTP_BM_CTRL_DEFAULT, +- .reverse_mac_address = true, + }; + + static const struct ocotp_params imx8mm_params = { +@@ -553,7 +551,6 @@ static const struct ocotp_params imx8mm_ + .bank_address_words = 0, + .set_timing = imx_ocotp_set_imx6_timing, + .ctrl = IMX_OCOTP_BM_CTRL_DEFAULT, +- .reverse_mac_address = true, + }; + + static const struct ocotp_params imx8mn_params = { +@@ -561,7 +558,6 @@ static const struct ocotp_params imx8mn_ + .bank_address_words = 0, + .set_timing = imx_ocotp_set_imx6_timing, + .ctrl = IMX_OCOTP_BM_CTRL_DEFAULT, +- .reverse_mac_address = true, + }; + + static const struct ocotp_params imx8mp_params = { +@@ -569,7 +565,6 @@ static const struct ocotp_params imx8mp_ + .bank_address_words = 0, + .set_timing = imx_ocotp_set_imx6_timing, + .ctrl = IMX_OCOTP_BM_CTRL_8MP, +- .reverse_mac_address = true, + }; + + static const struct of_device_id imx_ocotp_dt_ids[] = { +@@ -624,8 +619,7 @@ static int imx_ocotp_probe(struct platfo + imx_ocotp_nvmem_config.size = 4 * priv->params->nregs; + imx_ocotp_nvmem_config.dev = dev; + imx_ocotp_nvmem_config.priv = priv; +- if (priv->params->reverse_mac_address) +- imx_ocotp_nvmem_config.layout = &imx_ocotp_layout; ++ imx_ocotp_nvmem_config.layout = &imx_ocotp_layout; + + priv->config = &imx_ocotp_nvmem_config; + diff --git a/target/linux/generic/backport-5.15/813-v6.5-0003-nvmem-brcm_nvram-add-.read_post_process-for-MACs.patch b/target/linux/generic/backport-5.15/813-v6.5-0003-nvmem-brcm_nvram-add-.read_post_process-for-MACs.patch new file mode 100644 index 0000000000..fb4d346a95 --- /dev/null +++ b/target/linux/generic/backport-5.15/813-v6.5-0003-nvmem-brcm_nvram-add-.read_post_process-for-MACs.patch @@ -0,0 +1,81 @@ +From 73bcd133c910bff3b6d3b3834d0d14be9444e90a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Sun, 11 Jun 2023 15:03:08 +0100 +Subject: [PATCH] nvmem: brcm_nvram: add .read_post_process() for MACs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +1. Parse ASCII MAC format into byte based +2. Calculate relative addresses based on index argument + +Signed-off-by: Rafał Miłecki +Signed-off-by: Srinivas Kandagatla +Message-ID: <20230611140330.154222-5-srinivas.kandagatla@linaro.org> +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 1 + + drivers/nvmem/brcm_nvram.c | 28 ++++++++++++++++++++++++++++ + 2 files changed, 29 insertions(+) + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -55,6 +55,7 @@ config NVMEM_BRCM_NVRAM + tristate "Broadcom's NVRAM support" + depends on ARCH_BCM_5301X || COMPILE_TEST + depends on HAS_IOMEM ++ select GENERIC_NET_UTILS + help + This driver provides support for Broadcom's NVRAM that can be accessed + using I/O mapping. +--- a/drivers/nvmem/brcm_nvram.c ++++ b/drivers/nvmem/brcm_nvram.c +@@ -4,6 +4,8 @@ + */ + + #include ++#include ++#include + #include + #include + #include +@@ -42,6 +44,25 @@ static int brcm_nvram_read(void *context + return 0; + } + ++static int brcm_nvram_read_post_process_macaddr(void *context, const char *id, int index, ++ unsigned int offset, void *buf, size_t bytes) ++{ ++ u8 mac[ETH_ALEN]; ++ ++ if (bytes != 3 * ETH_ALEN - 1) ++ return -EINVAL; ++ ++ if (!mac_pton(buf, mac)) ++ return -EINVAL; ++ ++ if (index) ++ eth_addr_add(mac, index); ++ ++ ether_addr_copy(buf, mac); ++ ++ return 0; ++} ++ + static int brcm_nvram_add_cells(struct brcm_nvram *priv, uint8_t *data, + size_t len) + { +@@ -75,6 +96,13 @@ static int brcm_nvram_add_cells(struct b + priv->cells[idx].offset = value - (char *)data; + priv->cells[idx].bytes = strlen(value); + priv->cells[idx].np = of_get_child_by_name(dev->of_node, priv->cells[idx].name); ++ if (!strcmp(var, "et0macaddr") || ++ !strcmp(var, "et1macaddr") || ++ !strcmp(var, "et2macaddr")) { ++ priv->cells[idx].raw_len = strlen(value); ++ priv->cells[idx].bytes = ETH_ALEN; ++ priv->cells[idx].read_post_process = brcm_nvram_read_post_process_macaddr; ++ } + } + + return 0; diff --git a/target/linux/generic/backport-5.15/813-v6.5-0004-nvmem-rockchip-otp-Add-clks-and-reg_read-to-rockchip.patch b/target/linux/generic/backport-5.15/813-v6.5-0004-nvmem-rockchip-otp-Add-clks-and-reg_read-to-rockchip.patch new file mode 100644 index 0000000000..3b6e6e57f5 --- /dev/null +++ b/target/linux/generic/backport-5.15/813-v6.5-0004-nvmem-rockchip-otp-Add-clks-and-reg_read-to-rockchip.patch @@ -0,0 +1,166 @@ +From 8dc61364164e79e44c07fa2ac0a7b6939f00d5db Mon Sep 17 00:00:00 2001 +From: Cristian Ciocaltea +Date: Sun, 11 Jun 2023 15:03:13 +0100 +Subject: [PATCH] nvmem: rockchip-otp: Add clks and reg_read to rockchip_data + +In preparation to support new Rockchip OTP memory devices with different +clock configurations and register layout, extend rockchip_data struct +with the related members: clks, num_clks, reg_read. + +Additionally, to avoid managing redundant driver data, drop num_clks +member from rockchip_otp struct and update all references to point to +the equivalent member in rockchip_data. + +Signed-off-by: Cristian Ciocaltea +Tested-by: Vincent Legoll +Reviewed-by: Heiko Stuebner +Signed-off-by: Srinivas Kandagatla +Message-ID: <20230611140330.154222-10-srinivas.kandagatla@linaro.org> +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/rockchip-otp.c | 79 ++++++++++++++++++++++-------------- + 1 file changed, 49 insertions(+), 30 deletions(-) + +--- a/drivers/nvmem/rockchip-otp.c ++++ b/drivers/nvmem/rockchip-otp.c +@@ -54,21 +54,19 @@ + + #define OTPC_TIMEOUT 10000 + ++struct rockchip_data { ++ int size; ++ const char * const *clks; ++ int num_clks; ++ nvmem_reg_read_t reg_read; ++}; ++ + struct rockchip_otp { + struct device *dev; + void __iomem *base; +- struct clk_bulk_data *clks; +- int num_clks; ++ struct clk_bulk_data *clks; + struct reset_control *rst; +-}; +- +-/* list of required clocks */ +-static const char * const rockchip_otp_clocks[] = { +- "otp", "apb_pclk", "phy", +-}; +- +-struct rockchip_data { +- int size; ++ const struct rockchip_data *data; + }; + + static int rockchip_otp_reset(struct rockchip_otp *otp) +@@ -132,29 +130,23 @@ static int rockchip_otp_ecc_enable(struc + return ret; + } + +-static int rockchip_otp_read(void *context, unsigned int offset, +- void *val, size_t bytes) ++static int px30_otp_read(void *context, unsigned int offset, ++ void *val, size_t bytes) + { + struct rockchip_otp *otp = context; + u8 *buf = val; +- int ret = 0; +- +- ret = clk_bulk_prepare_enable(otp->num_clks, otp->clks); +- if (ret < 0) { +- dev_err(otp->dev, "failed to prepare/enable clks\n"); +- return ret; +- } ++ int ret; + + ret = rockchip_otp_reset(otp); + if (ret) { + dev_err(otp->dev, "failed to reset otp phy\n"); +- goto disable_clks; ++ return ret; + } + + ret = rockchip_otp_ecc_enable(otp, false); + if (ret < 0) { + dev_err(otp->dev, "rockchip_otp_ecc_enable err\n"); +- goto disable_clks; ++ return ret; + } + + writel(OTPC_USE_USER | OTPC_USE_USER_MASK, otp->base + OTPC_USER_CTRL); +@@ -174,8 +166,28 @@ static int rockchip_otp_read(void *conte + + read_end: + writel(0x0 | OTPC_USE_USER_MASK, otp->base + OTPC_USER_CTRL); +-disable_clks: +- clk_bulk_disable_unprepare(otp->num_clks, otp->clks); ++ ++ return ret; ++} ++ ++static int rockchip_otp_read(void *context, unsigned int offset, ++ void *val, size_t bytes) ++{ ++ struct rockchip_otp *otp = context; ++ int ret; ++ ++ if (!otp->data || !otp->data->reg_read) ++ return -EINVAL; ++ ++ ret = clk_bulk_prepare_enable(otp->data->num_clks, otp->clks); ++ if (ret < 0) { ++ dev_err(otp->dev, "failed to prepare/enable clks\n"); ++ return ret; ++ } ++ ++ ret = otp->data->reg_read(context, offset, val, bytes); ++ ++ clk_bulk_disable_unprepare(otp->data->num_clks, otp->clks); + + return ret; + } +@@ -189,8 +201,15 @@ static struct nvmem_config otp_config = + .reg_read = rockchip_otp_read, + }; + ++static const char * const px30_otp_clocks[] = { ++ "otp", "apb_pclk", "phy", ++}; ++ + static const struct rockchip_data px30_data = { + .size = 0x40, ++ .clks = px30_otp_clocks, ++ .num_clks = ARRAY_SIZE(px30_otp_clocks), ++ .reg_read = px30_otp_read, + }; + + static const struct of_device_id rockchip_otp_match[] = { +@@ -225,21 +244,21 @@ static int rockchip_otp_probe(struct pla + if (!otp) + return -ENOMEM; + ++ otp->data = data; + otp->dev = dev; + otp->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(otp->base)) + return PTR_ERR(otp->base); + +- otp->num_clks = ARRAY_SIZE(rockchip_otp_clocks); +- otp->clks = devm_kcalloc(dev, otp->num_clks, +- sizeof(*otp->clks), GFP_KERNEL); ++ otp->clks = devm_kcalloc(dev, data->num_clks, sizeof(*otp->clks), ++ GFP_KERNEL); + if (!otp->clks) + return -ENOMEM; + +- for (i = 0; i < otp->num_clks; ++i) +- otp->clks[i].id = rockchip_otp_clocks[i]; ++ for (i = 0; i < data->num_clks; ++i) ++ otp->clks[i].id = data->clks[i]; + +- ret = devm_clk_bulk_get(dev, otp->num_clks, otp->clks); ++ ret = devm_clk_bulk_get(dev, data->num_clks, otp->clks); + if (ret) + return ret; + diff --git a/target/linux/generic/backport-5.15/813-v6.5-0005-nvmem-rockchip-otp-Generalize-rockchip_otp_wait_stat.patch b/target/linux/generic/backport-5.15/813-v6.5-0005-nvmem-rockchip-otp-Generalize-rockchip_otp_wait_stat.patch new file mode 100644 index 0000000000..b5b66cfc5a --- /dev/null +++ b/target/linux/generic/backport-5.15/813-v6.5-0005-nvmem-rockchip-otp-Generalize-rockchip_otp_wait_stat.patch @@ -0,0 +1,62 @@ +From 30fd21cfb1e64ef20035559a8246f5fbf682c40e Mon Sep 17 00:00:00 2001 +From: Cristian Ciocaltea +Date: Sun, 11 Jun 2023 15:03:14 +0100 +Subject: [PATCH] nvmem: rockchip-otp: Generalize rockchip_otp_wait_status() + +In preparation to support additional Rockchip OTP memory devices with +different register layout, generalize rockchip_otp_wait_status() to +accept a new parameter for specifying the offset of the status register. + +Signed-off-by: Cristian Ciocaltea +Tested-by: Vincent Legoll +Reviewed-by: Heiko Stuebner +Signed-off-by: Srinivas Kandagatla +Message-ID: <20230611140330.154222-11-srinivas.kandagatla@linaro.org> +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/rockchip-otp.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +--- a/drivers/nvmem/rockchip-otp.c ++++ b/drivers/nvmem/rockchip-otp.c +@@ -90,18 +90,19 @@ static int rockchip_otp_reset(struct roc + return 0; + } + +-static int rockchip_otp_wait_status(struct rockchip_otp *otp, u32 flag) ++static int rockchip_otp_wait_status(struct rockchip_otp *otp, ++ unsigned int reg, u32 flag) + { + u32 status = 0; + int ret; + +- ret = readl_poll_timeout_atomic(otp->base + OTPC_INT_STATUS, status, ++ ret = readl_poll_timeout_atomic(otp->base + reg, status, + (status & flag), 1, OTPC_TIMEOUT); + if (ret) + return ret; + + /* clean int status */ +- writel(flag, otp->base + OTPC_INT_STATUS); ++ writel(flag, otp->base + reg); + + return 0; + } +@@ -123,7 +124,7 @@ static int rockchip_otp_ecc_enable(struc + + writel(SBPI_ENABLE_MASK | SBPI_ENABLE, otp->base + OTPC_SBPI_CTRL); + +- ret = rockchip_otp_wait_status(otp, OTPC_SBPI_DONE); ++ ret = rockchip_otp_wait_status(otp, OTPC_INT_STATUS, OTPC_SBPI_DONE); + if (ret < 0) + dev_err(otp->dev, "timeout during ecc_enable\n"); + +@@ -156,7 +157,7 @@ static int px30_otp_read(void *context, + otp->base + OTPC_USER_ADDR); + writel(OTPC_USER_FSM_ENABLE | OTPC_USER_FSM_ENABLE_MASK, + otp->base + OTPC_USER_ENABLE); +- ret = rockchip_otp_wait_status(otp, OTPC_USER_DONE); ++ ret = rockchip_otp_wait_status(otp, OTPC_INT_STATUS, OTPC_USER_DONE); + if (ret < 0) { + dev_err(otp->dev, "timeout during read setup\n"); + goto read_end; diff --git a/target/linux/generic/backport-5.15/813-v6.5-0006-nvmem-rockchip-otp-Use-devm_reset_control_array_get_.patch b/target/linux/generic/backport-5.15/813-v6.5-0006-nvmem-rockchip-otp-Use-devm_reset_control_array_get_.patch new file mode 100644 index 0000000000..3a17479d95 --- /dev/null +++ b/target/linux/generic/backport-5.15/813-v6.5-0006-nvmem-rockchip-otp-Use-devm_reset_control_array_get_.patch @@ -0,0 +1,31 @@ +From d325c9dd2b6e94040ca722ddcadcd6af358dd2be Mon Sep 17 00:00:00 2001 +From: Cristian Ciocaltea +Date: Sun, 11 Jun 2023 15:03:15 +0100 +Subject: [PATCH] nvmem: rockchip-otp: Use + devm_reset_control_array_get_exclusive() + +In preparation to support new Rockchip OTP memory devices having +specific reset configurations, switch devm_reset_control_get() to +devm_reset_control_array_get_exclusive(). + +Signed-off-by: Cristian Ciocaltea +Tested-by: Vincent Legoll +Reviewed-by: Heiko Stuebner +Signed-off-by: Srinivas Kandagatla +Message-ID: <20230611140330.154222-12-srinivas.kandagatla@linaro.org> +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/rockchip-otp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/rockchip-otp.c ++++ b/drivers/nvmem/rockchip-otp.c +@@ -263,7 +263,7 @@ static int rockchip_otp_probe(struct pla + if (ret) + return ret; + +- otp->rst = devm_reset_control_get(dev, "phy"); ++ otp->rst = devm_reset_control_array_get_exclusive(dev); + if (IS_ERR(otp->rst)) + return PTR_ERR(otp->rst); + diff --git a/target/linux/generic/backport-5.15/813-v6.5-0007-nvmem-rockchip-otp-Improve-probe-error-handling.patch b/target/linux/generic/backport-5.15/813-v6.5-0007-nvmem-rockchip-otp-Improve-probe-error-handling.patch new file mode 100644 index 0000000000..37cb927b10 --- /dev/null +++ b/target/linux/generic/backport-5.15/813-v6.5-0007-nvmem-rockchip-otp-Improve-probe-error-handling.patch @@ -0,0 +1,71 @@ +From 912517345b867a69542dc9f5c2cc3e9d8beaccf5 Mon Sep 17 00:00:00 2001 +From: Cristian Ciocaltea +Date: Sun, 11 Jun 2023 15:03:16 +0100 +Subject: [PATCH] nvmem: rockchip-otp: Improve probe error handling + +Enhance error handling in the probe function by making use of +dev_err_probe(), which ensures the error code is always printed, in +addition to the specified error message. + +Signed-off-by: Cristian Ciocaltea +Tested-by: Vincent Legoll +Reviewed-by: Heiko Stuebner +Signed-off-by: Srinivas Kandagatla +Message-ID: <20230611140330.154222-13-srinivas.kandagatla@linaro.org> +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/rockchip-otp.c | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +--- a/drivers/nvmem/rockchip-otp.c ++++ b/drivers/nvmem/rockchip-otp.c +@@ -235,10 +235,8 @@ static int rockchip_otp_probe(struct pla + int ret, i; + + data = of_device_get_match_data(dev); +- if (!data) { +- dev_err(dev, "failed to get match data\n"); +- return -EINVAL; +- } ++ if (!data) ++ return dev_err_probe(dev, -EINVAL, "failed to get match data\n"); + + otp = devm_kzalloc(&pdev->dev, sizeof(struct rockchip_otp), + GFP_KERNEL); +@@ -249,7 +247,8 @@ static int rockchip_otp_probe(struct pla + otp->dev = dev; + otp->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(otp->base)) +- return PTR_ERR(otp->base); ++ return dev_err_probe(dev, PTR_ERR(otp->base), ++ "failed to ioremap resource\n"); + + otp->clks = devm_kcalloc(dev, data->num_clks, sizeof(*otp->clks), + GFP_KERNEL); +@@ -261,18 +260,22 @@ static int rockchip_otp_probe(struct pla + + ret = devm_clk_bulk_get(dev, data->num_clks, otp->clks); + if (ret) +- return ret; ++ return dev_err_probe(dev, ret, "failed to get clocks\n"); + + otp->rst = devm_reset_control_array_get_exclusive(dev); + if (IS_ERR(otp->rst)) +- return PTR_ERR(otp->rst); ++ return dev_err_probe(dev, PTR_ERR(otp->rst), ++ "failed to get resets\n"); + + otp_config.size = data->size; + otp_config.priv = otp; + otp_config.dev = dev; +- nvmem = devm_nvmem_register(dev, &otp_config); + +- return PTR_ERR_OR_ZERO(nvmem); ++ nvmem = devm_nvmem_register(dev, &otp_config); ++ if (IS_ERR(nvmem)) ++ return dev_err_probe(dev, PTR_ERR(nvmem), ++ "failed to register nvmem device\n"); ++ return 0; + } + + static struct platform_driver rockchip_otp_driver = { diff --git a/target/linux/generic/backport-5.15/813-v6.5-0008-nvmem-rockchip-otp-Add-support-for-RK3588.patch b/target/linux/generic/backport-5.15/813-v6.5-0008-nvmem-rockchip-otp-Add-support-for-RK3588.patch new file mode 100644 index 0000000000..c1e2231c9e --- /dev/null +++ b/target/linux/generic/backport-5.15/813-v6.5-0008-nvmem-rockchip-otp-Add-support-for-RK3588.patch @@ -0,0 +1,129 @@ +From 8ab099fafbbc8c9607c399d21a774784a6cb8b45 Mon Sep 17 00:00:00 2001 +From: Cristian Ciocaltea +Date: Sun, 11 Jun 2023 15:03:17 +0100 +Subject: [PATCH] nvmem: rockchip-otp: Add support for RK3588 + +Add support for the OTP memory device found on the Rockchip RK3588 SoC. + +While here, remove the unnecessary 'void *' casts in the OF device ID +table. + +Co-developed-by: Finley Xiao +Signed-off-by: Finley Xiao +Signed-off-by: Cristian Ciocaltea +Tested-by: Vincent Legoll +Reviewed-by: Heiko Stuebner +Signed-off-by: Srinivas Kandagatla +Message-ID: <20230611140330.154222-14-srinivas.kandagatla@linaro.org> +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/rockchip-otp.c | 78 +++++++++++++++++++++++++++++++++++- + 1 file changed, 76 insertions(+), 2 deletions(-) + +--- a/drivers/nvmem/rockchip-otp.c ++++ b/drivers/nvmem/rockchip-otp.c +@@ -54,6 +54,19 @@ + + #define OTPC_TIMEOUT 10000 + ++/* RK3588 Register */ ++#define RK3588_OTPC_AUTO_CTRL 0x04 ++#define RK3588_OTPC_AUTO_EN 0x08 ++#define RK3588_OTPC_INT_ST 0x84 ++#define RK3588_OTPC_DOUT0 0x20 ++#define RK3588_NO_SECURE_OFFSET 0x300 ++#define RK3588_NBYTES 4 ++#define RK3588_BURST_NUM 1 ++#define RK3588_BURST_SHIFT 8 ++#define RK3588_ADDR_SHIFT 16 ++#define RK3588_AUTO_EN BIT(0) ++#define RK3588_RD_DONE BIT(1) ++ + struct rockchip_data { + int size; + const char * const *clks; +@@ -171,6 +184,52 @@ read_end: + return ret; + } + ++static int rk3588_otp_read(void *context, unsigned int offset, ++ void *val, size_t bytes) ++{ ++ struct rockchip_otp *otp = context; ++ unsigned int addr_start, addr_end, addr_len; ++ int ret, i = 0; ++ u32 data; ++ u8 *buf; ++ ++ addr_start = round_down(offset, RK3588_NBYTES) / RK3588_NBYTES; ++ addr_end = round_up(offset + bytes, RK3588_NBYTES) / RK3588_NBYTES; ++ addr_len = addr_end - addr_start; ++ addr_start += RK3588_NO_SECURE_OFFSET; ++ ++ buf = kzalloc(array_size(addr_len, RK3588_NBYTES), GFP_KERNEL); ++ if (!buf) ++ return -ENOMEM; ++ ++ while (addr_len--) { ++ writel((addr_start << RK3588_ADDR_SHIFT) | ++ (RK3588_BURST_NUM << RK3588_BURST_SHIFT), ++ otp->base + RK3588_OTPC_AUTO_CTRL); ++ writel(RK3588_AUTO_EN, otp->base + RK3588_OTPC_AUTO_EN); ++ ++ ret = rockchip_otp_wait_status(otp, RK3588_OTPC_INT_ST, ++ RK3588_RD_DONE); ++ if (ret < 0) { ++ dev_err(otp->dev, "timeout during read setup\n"); ++ goto read_end; ++ } ++ ++ data = readl(otp->base + RK3588_OTPC_DOUT0); ++ memcpy(&buf[i], &data, RK3588_NBYTES); ++ ++ i += RK3588_NBYTES; ++ addr_start++; ++ } ++ ++ memcpy(val, buf + offset % RK3588_NBYTES, bytes); ++ ++read_end: ++ kfree(buf); ++ ++ return ret; ++} ++ + static int rockchip_otp_read(void *context, unsigned int offset, + void *val, size_t bytes) + { +@@ -213,14 +272,29 @@ static const struct rockchip_data px30_d + .reg_read = px30_otp_read, + }; + ++static const char * const rk3588_otp_clocks[] = { ++ "otp", "apb_pclk", "phy", "arb", ++}; ++ ++static const struct rockchip_data rk3588_data = { ++ .size = 0x400, ++ .clks = rk3588_otp_clocks, ++ .num_clks = ARRAY_SIZE(rk3588_otp_clocks), ++ .reg_read = rk3588_otp_read, ++}; ++ + static const struct of_device_id rockchip_otp_match[] = { + { + .compatible = "rockchip,px30-otp", +- .data = (void *)&px30_data, ++ .data = &px30_data, + }, + { + .compatible = "rockchip,rk3308-otp", +- .data = (void *)&px30_data, ++ .data = &px30_data, ++ }, ++ { ++ .compatible = "rockchip,rk3588-otp", ++ .data = &rk3588_data, + }, + { /* sentinel */ }, + }; diff --git a/target/linux/generic/backport-5.15/813-v6.5-0009-nvmem-zynqmp-Switch-xilinx.com-emails-to-amd.com.patch b/target/linux/generic/backport-5.15/813-v6.5-0009-nvmem-zynqmp-Switch-xilinx.com-emails-to-amd.com.patch new file mode 100644 index 0000000000..220e3e9a05 --- /dev/null +++ b/target/linux/generic/backport-5.15/813-v6.5-0009-nvmem-zynqmp-Switch-xilinx.com-emails-to-amd.com.patch @@ -0,0 +1,26 @@ +From 9734408969e978a1c0d5d752be63dd638288e374 Mon Sep 17 00:00:00 2001 +From: Michal Simek +Date: Sun, 11 Jun 2023 15:03:23 +0100 +Subject: [PATCH] nvmem: zynqmp: Switch @xilinx.com emails to @amd.com + +@xilinx.com is still working but better to switch to new amd.com after +AMD/Xilinx acquisition. + +Signed-off-by: Michal Simek +Signed-off-by: Srinivas Kandagatla +Message-ID: <20230611140330.154222-20-srinivas.kandagatla@linaro.org> +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/zynqmp_nvmem.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/zynqmp_nvmem.c ++++ b/drivers/nvmem/zynqmp_nvmem.c +@@ -76,6 +76,6 @@ static struct platform_driver zynqmp_nvm + + module_platform_driver(zynqmp_nvmem_driver); + +-MODULE_AUTHOR("Michal Simek , Nava kishore Manne "); ++MODULE_AUTHOR("Michal Simek , Nava kishore Manne "); + MODULE_DESCRIPTION("ZynqMP NVMEM driver"); + MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/backport-5.15/813-v6.5-0010-nvmem-imx-support-i.MX93-OCOTP.patch b/target/linux/generic/backport-5.15/813-v6.5-0010-nvmem-imx-support-i.MX93-OCOTP.patch new file mode 100644 index 0000000000..f8e6be4241 --- /dev/null +++ b/target/linux/generic/backport-5.15/813-v6.5-0010-nvmem-imx-support-i.MX93-OCOTP.patch @@ -0,0 +1,230 @@ +From 22e9e6fcfb5042cb6d6c7874c459b034800092f1 Mon Sep 17 00:00:00 2001 +From: Peng Fan +Date: Sun, 11 Jun 2023 15:03:25 +0100 +Subject: [PATCH] nvmem: imx: support i.MX93 OCOTP + +Add i.MX93 OCOTP support. i.MX93 OCOTP has two parts: Fuse shadow +block(fsb) and fuse managed by ELE. The FSB part could be directly +accessed with MMIO, the ELE could only be accessed with ELE API. + +Currently the ELE API is not ready, so NULL function callback is used, +but it was tested with downstream ELE API. + +Signed-off-by: Peng Fan +Signed-off-by: Srinivas Kandagatla +Message-ID: <20230611140330.154222-22-srinivas.kandagatla@linaro.org> +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/Kconfig | 9 ++ + drivers/nvmem/Makefile | 2 + + drivers/nvmem/imx-ocotp-ele.c | 175 ++++++++++++++++++++++++++++++++++ + 3 files changed, 186 insertions(+) + create mode 100644 drivers/nvmem/imx-ocotp-ele.c + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -83,6 +83,15 @@ config NVMEM_IMX_OCOTP + This driver can also be built as a module. If so, the module + will be called nvmem-imx-ocotp. + ++config NVMEM_IMX_OCOTP_ELE ++ tristate "i.MX On-Chip OTP Controller support" ++ depends on ARCH_MXC || COMPILE_TEST ++ depends on HAS_IOMEM ++ depends on OF ++ help ++ This is a driver for the On-Chip OTP Controller (OCOTP) ++ available on i.MX SoCs which has ELE. ++ + config NVMEM_IMX_OCOTP_SCU + tristate "i.MX8 SCU On-Chip OTP Controller support" + depends on IMX_SCU +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -18,6 +18,8 @@ obj-$(CONFIG_NVMEM_IMX_IIM) += nvmem-im + nvmem-imx-iim-y := imx-iim.o + obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-imx-ocotp.o + nvmem-imx-ocotp-y := imx-ocotp.o ++obj-$(CONFIG_NVMEM_IMX_OCOTP_ELE) += nvmem-imx-ocotp-ele.o ++nvmem-imx-ocotp-ele-y := imx-ocotp-ele.o + obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvmem-imx-ocotp-scu.o + nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o + obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o +--- /dev/null ++++ b/drivers/nvmem/imx-ocotp-ele.c +@@ -0,0 +1,175 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * i.MX9 OCOTP fusebox driver ++ * ++ * Copyright 2023 NXP ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++enum fuse_type { ++ FUSE_FSB = 1, ++ FUSE_ELE = 2, ++ FUSE_INVALID = -1 ++}; ++ ++struct ocotp_map_entry { ++ u32 start; /* start word */ ++ u32 num; /* num words */ ++ enum fuse_type type; ++}; ++ ++struct ocotp_devtype_data { ++ u32 reg_off; ++ char *name; ++ u32 size; ++ u32 num_entry; ++ u32 flag; ++ nvmem_reg_read_t reg_read; ++ struct ocotp_map_entry entry[]; ++}; ++ ++struct imx_ocotp_priv { ++ struct device *dev; ++ void __iomem *base; ++ struct nvmem_config config; ++ struct mutex lock; ++ const struct ocotp_devtype_data *data; ++}; ++ ++static enum fuse_type imx_ocotp_fuse_type(void *context, u32 index) ++{ ++ struct imx_ocotp_priv *priv = context; ++ const struct ocotp_devtype_data *data = priv->data; ++ u32 start, end; ++ int i; ++ ++ for (i = 0; i < data->num_entry; i++) { ++ start = data->entry[i].start; ++ end = data->entry[i].start + data->entry[i].num; ++ ++ if (index >= start && index < end) ++ return data->entry[i].type; ++ } ++ ++ return FUSE_INVALID; ++} ++ ++static int imx_ocotp_reg_read(void *context, unsigned int offset, void *val, size_t bytes) ++{ ++ struct imx_ocotp_priv *priv = context; ++ void __iomem *reg = priv->base + priv->data->reg_off; ++ u32 count, index, num_bytes; ++ enum fuse_type type; ++ u32 *buf; ++ void *p; ++ int i; ++ ++ index = offset; ++ num_bytes = round_up(bytes, 4); ++ count = num_bytes >> 2; ++ ++ if (count > ((priv->data->size >> 2) - index)) ++ count = (priv->data->size >> 2) - index; ++ ++ p = kzalloc(num_bytes, GFP_KERNEL); ++ if (!p) ++ return -ENOMEM; ++ ++ mutex_lock(&priv->lock); ++ ++ buf = p; ++ ++ for (i = index; i < (index + count); i++) { ++ type = imx_ocotp_fuse_type(context, i); ++ if (type == FUSE_INVALID || type == FUSE_ELE) { ++ *buf++ = 0; ++ continue; ++ } ++ ++ *buf++ = readl_relaxed(reg + (i << 2)); ++ } ++ ++ memcpy(val, (u8 *)p, bytes); ++ ++ mutex_unlock(&priv->lock); ++ ++ kfree(p); ++ ++ return 0; ++}; ++ ++static int imx_ele_ocotp_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct imx_ocotp_priv *priv; ++ struct nvmem_device *nvmem; ++ ++ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ priv->data = of_device_get_match_data(dev); ++ ++ priv->base = devm_platform_ioremap_resource(pdev, 0); ++ if (IS_ERR(priv->base)) ++ return PTR_ERR(priv->base); ++ ++ priv->config.dev = dev; ++ priv->config.name = "ELE-OCOTP"; ++ priv->config.id = NVMEM_DEVID_AUTO; ++ priv->config.owner = THIS_MODULE; ++ priv->config.size = priv->data->size; ++ priv->config.reg_read = priv->data->reg_read; ++ priv->config.word_size = 4; ++ priv->config.stride = 1; ++ priv->config.priv = priv; ++ priv->config.read_only = true; ++ mutex_init(&priv->lock); ++ ++ nvmem = devm_nvmem_register(dev, &priv->config); ++ if (IS_ERR(nvmem)) ++ return PTR_ERR(nvmem); ++ ++ return 0; ++} ++ ++static const struct ocotp_devtype_data imx93_ocotp_data = { ++ .reg_off = 0x8000, ++ .reg_read = imx_ocotp_reg_read, ++ .size = 2048, ++ .num_entry = 6, ++ .entry = { ++ { 0, 52, FUSE_FSB }, ++ { 63, 1, FUSE_ELE}, ++ { 128, 16, FUSE_ELE }, ++ { 182, 1, FUSE_ELE }, ++ { 188, 1, FUSE_ELE }, ++ { 312, 200, FUSE_FSB } ++ }, ++}; ++ ++static const struct of_device_id imx_ele_ocotp_dt_ids[] = { ++ { .compatible = "fsl,imx93-ocotp", .data = &imx93_ocotp_data, }, ++ {}, ++}; ++MODULE_DEVICE_TABLE(of, imx_ele_ocotp_dt_ids); ++ ++static struct platform_driver imx_ele_ocotp_driver = { ++ .driver = { ++ .name = "imx_ele_ocotp", ++ .of_match_table = imx_ele_ocotp_dt_ids, ++ }, ++ .probe = imx_ele_ocotp_probe, ++}; ++module_platform_driver(imx_ele_ocotp_driver); ++ ++MODULE_DESCRIPTION("i.MX OCOTP/ELE driver"); ++MODULE_AUTHOR("Peng Fan "); ++MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/backport-5.15/813-v6.5-0011-nvmem-core-add-support-for-fixed-cells-layout.patch b/target/linux/generic/backport-5.15/813-v6.5-0011-nvmem-core-add-support-for-fixed-cells-layout.patch new file mode 100644 index 0000000000..59b2f9fa2c --- /dev/null +++ b/target/linux/generic/backport-5.15/813-v6.5-0011-nvmem-core-add-support-for-fixed-cells-layout.patch @@ -0,0 +1,96 @@ +From 27f699e578b1a72df89dfa3bc42e093a01dc8d10 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Sun, 11 Jun 2023 15:03:29 +0100 +Subject: [PATCH] nvmem: core: add support for fixed cells *layout* +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This adds support for the "fixed-layout" NVMEM layout binding. It allows +defining NVMEM cells in a layout DT node named "nvmem-layout". + +While NVMEM subsystem supports layout drivers it has been discussed that +"fixed-layout" may actually be supperted internally. It's because: +1. It's a very basic layout +2. It allows sharing code with legacy syntax parsing +3. It's safer for soc_device_match() due to -EPROBE_DEFER +4. This will make the syntax transition easier + +Signed-off-by: Rafał Miłecki +Reviewed-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +Message-ID: <20230611140330.154222-26-srinivas.kandagatla@linaro.org> +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/core.c | 32 +++++++++++++++++++++++++++++--- + 1 file changed, 29 insertions(+), 3 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -696,7 +696,7 @@ static int nvmem_validate_keepouts(struc + return 0; + } + +-static int nvmem_add_cells_from_of(struct nvmem_device *nvmem) ++static int nvmem_add_cells_from_dt(struct nvmem_device *nvmem, struct device_node *np) + { + struct nvmem_layout *layout = nvmem->layout; + struct device *dev = &nvmem->dev; +@@ -704,7 +704,7 @@ static int nvmem_add_cells_from_of(struc + const __be32 *addr; + int len, ret; + +- for_each_child_of_node(dev->of_node, child) { ++ for_each_child_of_node(np, child) { + struct nvmem_cell_info info = {0}; + + addr = of_get_property(child, "reg", &len); +@@ -742,6 +742,28 @@ static int nvmem_add_cells_from_of(struc + return 0; + } + ++static int nvmem_add_cells_from_legacy_of(struct nvmem_device *nvmem) ++{ ++ return nvmem_add_cells_from_dt(nvmem, nvmem->dev.of_node); ++} ++ ++static int nvmem_add_cells_from_fixed_layout(struct nvmem_device *nvmem) ++{ ++ struct device_node *layout_np; ++ int err = 0; ++ ++ layout_np = of_nvmem_layout_get_container(nvmem); ++ if (!layout_np) ++ return 0; ++ ++ if (of_device_is_compatible(layout_np, "fixed-layout")) ++ err = nvmem_add_cells_from_dt(nvmem, layout_np); ++ ++ of_node_put(layout_np); ++ ++ return err; ++} ++ + int __nvmem_layout_register(struct nvmem_layout *layout, struct module *owner) + { + layout->owner = owner; +@@ -972,7 +994,7 @@ struct nvmem_device *nvmem_register(cons + if (rval) + goto err_remove_cells; + +- rval = nvmem_add_cells_from_of(nvmem); ++ rval = nvmem_add_cells_from_legacy_of(nvmem); + if (rval) + goto err_remove_cells; + +@@ -982,6 +1004,10 @@ struct nvmem_device *nvmem_register(cons + if (rval) + goto err_remove_cells; + ++ rval = nvmem_add_cells_from_fixed_layout(nvmem); ++ if (rval) ++ goto err_remove_cells; ++ + rval = nvmem_add_cells_from_layout(nvmem); + if (rval) + goto err_remove_cells; diff --git a/target/linux/generic/backport-5.15/814-v6.3-leds-Move-led_init_default_state_get-to-the-global-h.patch b/target/linux/generic/backport-5.15/814-v6.3-leds-Move-led_init_default_state_get-to-the-global-h.patch new file mode 100644 index 0000000000..592111fb95 --- /dev/null +++ b/target/linux/generic/backport-5.15/814-v6.3-leds-Move-led_init_default_state_get-to-the-global-h.patch @@ -0,0 +1,39 @@ +From 156a5bb89ca6f3edd2be0bfd0de15e575442927e Mon Sep 17 00:00:00 2001 +From: Andy Shevchenko +Date: Tue, 3 Jan 2023 15:12:47 +0200 +Subject: [PATCH] leds: Move led_init_default_state_get() to the global header + +There are users inside and outside LED framework that have implemented +a local copy of led_init_default_state_get(). In order to deduplicate +that, as the first step move the declaration from LED header to the +global one. + +Signed-off-by: Andy Shevchenko +Signed-off-by: Lee Jones +Link: https://lore.kernel.org/r/20230103131256.33894-3-andriy.shevchenko@linux.intel.com +--- + drivers/leds/leds.h | 1 - + include/linux/leds.h | 2 ++ + 2 files changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/leds/leds.h ++++ b/drivers/leds/leds.h +@@ -27,7 +27,6 @@ ssize_t led_trigger_read(struct file *fi + ssize_t led_trigger_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, char *buf, + loff_t pos, size_t count); +-enum led_default_state led_init_default_state_get(struct fwnode_handle *fwnode); + + extern struct rw_semaphore leds_list_lock; + extern struct list_head leds_list; +--- a/include/linux/leds.h ++++ b/include/linux/leds.h +@@ -63,6 +63,8 @@ struct led_init_data { + bool devname_mandatory; + }; + ++enum led_default_state led_init_default_state_get(struct fwnode_handle *fwnode); ++ + struct led_hw_trigger_type { + int dummy; + }; diff --git a/target/linux/generic/backport-5.15/815-v6.4-01-net-dsa-qca8k-move-qca8k_port_to_phy-to-header.patch b/target/linux/generic/backport-5.15/815-v6.4-01-net-dsa-qca8k-move-qca8k_port_to_phy-to-header.patch new file mode 100644 index 0000000000..dcdca90442 --- /dev/null +++ b/target/linux/generic/backport-5.15/815-v6.4-01-net-dsa-qca8k-move-qca8k_port_to_phy-to-header.patch @@ -0,0 +1,67 @@ +From 3e8b4d6277fd19d98c817576954dd6a4ff3caa2b Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 17 Apr 2023 17:17:23 +0200 +Subject: [PATCH 1/9] net: dsa: qca8k: move qca8k_port_to_phy() to header + +Move qca8k_port_to_phy() to qca8k header as it's useful for future +reference in Switch LEDs module since the same logic is applied to get +the right index of the switch port. +Make it inline as it's simple function that just decrease the port. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Reviewed-by: Michal Kubiak +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca/qca8k-8xxx.c | 15 --------------- + drivers/net/dsa/qca/qca8k.h | 14 ++++++++++++++ + 2 files changed, 14 insertions(+), 15 deletions(-) + +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -716,21 +716,6 @@ err_clear_skb: + return ret; + } + +-static u32 +-qca8k_port_to_phy(int port) +-{ +- /* From Andrew Lunn: +- * Port 0 has no internal phy. +- * Port 1 has an internal PHY at MDIO address 0. +- * Port 2 has an internal PHY at MDIO address 1. +- * ... +- * Port 5 has an internal PHY at MDIO address 4. +- * Port 6 has no internal PHY. +- */ +- +- return port - 1; +-} +- + static int + qca8k_mdio_busy_wait(struct mii_bus *bus, u32 reg, u32 mask) + { +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -414,6 +414,20 @@ struct qca8k_fdb { + u8 mac[6]; + }; + ++static inline u32 qca8k_port_to_phy(int port) ++{ ++ /* From Andrew Lunn: ++ * Port 0 has no internal phy. ++ * Port 1 has an internal PHY at MDIO address 0. ++ * Port 2 has an internal PHY at MDIO address 1. ++ * ... ++ * Port 5 has an internal PHY at MDIO address 4. ++ * Port 6 has no internal PHY. ++ */ ++ ++ return port - 1; ++} ++ + /* Common setup function */ + extern const struct qca8k_mib_desc ar8327_mib[]; + extern const struct regmap_access_table qca8k_readable_table; diff --git a/target/linux/generic/backport-5.15/815-v6.4-02-net-dsa-qca8k-add-LEDs-basic-support.patch b/target/linux/generic/backport-5.15/815-v6.4-02-net-dsa-qca8k-add-LEDs-basic-support.patch new file mode 100644 index 0000000000..baf4c2e4ba --- /dev/null +++ b/target/linux/generic/backport-5.15/815-v6.4-02-net-dsa-qca8k-add-LEDs-basic-support.patch @@ -0,0 +1,435 @@ +From 1e264f9d2918b5737023c44a23ae04def1095210 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 17 Apr 2023 17:17:24 +0200 +Subject: [PATCH 2/9] net: dsa: qca8k: add LEDs basic support + +Add LEDs basic support for qca8k Switch Family by adding basic +brightness_set() support. + +Since these LEDs refelect port status, the default label is set to +":port". DT binding should describe the color and function of the +LEDs using standard LEDs api. +Each LED always have the device name as prefix. The device name is +composed from the mii bus id and the PHY addr resulting in example +names like: +- qca8k-0.0:00:amber:lan +- qca8k-0.0:00:white:lan +- qca8k-0.0:01:amber:lan +- qca8k-0.0:01:white:lan + +These LEDs supports only blocking variant of the brightness_set() +function since they can sleep during access of the switch leds to set +the brightness. + +While at it add to the qca8k header file each mode defined by the Switch +Documentation for future use. + +Signed-off-by: Christian Marangi +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca/Kconfig | 8 ++ + drivers/net/dsa/qca/Makefile | 3 + + drivers/net/dsa/qca/qca8k-8xxx.c | 5 + + drivers/net/dsa/qca/qca8k-leds.c | 239 +++++++++++++++++++++++++++++++ + drivers/net/dsa/qca/qca8k.h | 60 ++++++++ + drivers/net/dsa/qca/qca8k_leds.h | 16 +++ + 6 files changed, 331 insertions(+) + create mode 100644 drivers/net/dsa/qca/qca8k-leds.c + create mode 100644 drivers/net/dsa/qca/qca8k_leds.h + +--- a/drivers/net/dsa/qca/Kconfig ++++ b/drivers/net/dsa/qca/Kconfig +@@ -15,3 +15,11 @@ config NET_DSA_QCA8K + help + This enables support for the Qualcomm Atheros QCA8K Ethernet + switch chips. ++ ++config NET_DSA_QCA8K_LEDS_SUPPORT ++ bool "Qualcomm Atheros QCA8K Ethernet switch family LEDs support" ++ depends on NET_DSA_QCA8K ++ depends on LEDS_CLASS ++ help ++ This enabled support for LEDs present on the Qualcomm Atheros ++ QCA8K Ethernet switch chips. +--- a/drivers/net/dsa/qca/Makefile ++++ b/drivers/net/dsa/qca/Makefile +@@ -2,3 +2,6 @@ + obj-$(CONFIG_NET_DSA_AR9331) += ar9331.o + obj-$(CONFIG_NET_DSA_QCA8K) += qca8k.o + qca8k-y += qca8k-common.o qca8k-8xxx.o ++ifdef CONFIG_NET_DSA_QCA8K_LEDS_SUPPORT ++qca8k-y += qca8k-leds.o ++endif +--- a/drivers/net/dsa/qca/qca8k-8xxx.c ++++ b/drivers/net/dsa/qca/qca8k-8xxx.c +@@ -22,6 +22,7 @@ + #include + + #include "qca8k.h" ++#include "qca8k_leds.h" + + static void + qca8k_split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) +@@ -1185,6 +1186,10 @@ qca8k_setup(struct dsa_switch *ds) + if (ret) + return ret; + ++ ret = qca8k_setup_led_ctrl(priv); ++ if (ret) ++ return ret; ++ + /* Make sure MAC06 is disabled */ + ret = regmap_clear_bits(priv->regmap, QCA8K_REG_PORT0_PAD_CTRL, + QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN); +--- /dev/null ++++ b/drivers/net/dsa/qca/qca8k-leds.c +@@ -0,0 +1,239 @@ ++// SPDX-License-Identifier: GPL-2.0 ++#include ++#include ++ ++#include "qca8k.h" ++#include "qca8k_leds.h" ++ ++static int ++qca8k_get_enable_led_reg(int port_num, int led_num, struct qca8k_led_pattern_en *reg_info) ++{ ++ switch (port_num) { ++ case 0: ++ reg_info->reg = QCA8K_LED_CTRL_REG(led_num); ++ reg_info->shift = QCA8K_LED_PHY0123_CONTROL_RULE_SHIFT; ++ break; ++ case 1: ++ case 2: ++ case 3: ++ /* Port 123 are controlled on a different reg */ ++ reg_info->reg = QCA8K_LED_CTRL3_REG; ++ reg_info->shift = QCA8K_LED_PHY123_PATTERN_EN_SHIFT(port_num, led_num); ++ break; ++ case 4: ++ reg_info->reg = QCA8K_LED_CTRL_REG(led_num); ++ reg_info->shift = QCA8K_LED_PHY4_CONTROL_RULE_SHIFT; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static int ++qca8k_led_brightness_set(struct qca8k_led *led, ++ enum led_brightness brightness) ++{ ++ struct qca8k_led_pattern_en reg_info; ++ struct qca8k_priv *priv = led->priv; ++ u32 mask, val; ++ ++ qca8k_get_enable_led_reg(led->port_num, led->led_num, ®_info); ++ ++ val = QCA8K_LED_ALWAYS_OFF; ++ if (brightness) ++ val = QCA8K_LED_ALWAYS_ON; ++ ++ /* HW regs to control brightness is special and port 1-2-3 ++ * are placed in a different reg. ++ * ++ * To control port 0 brightness: ++ * - the 2 bit (15, 14) of: ++ * - QCA8K_LED_CTRL0_REG for led1 ++ * - QCA8K_LED_CTRL1_REG for led2 ++ * - QCA8K_LED_CTRL2_REG for led3 ++ * ++ * To control port 4: ++ * - the 2 bit (31, 30) of: ++ * - QCA8K_LED_CTRL0_REG for led1 ++ * - QCA8K_LED_CTRL1_REG for led2 ++ * - QCA8K_LED_CTRL2_REG for led3 ++ * ++ * To control port 1: ++ * - the 2 bit at (9, 8) of QCA8K_LED_CTRL3_REG are used for led1 ++ * - the 2 bit at (11, 10) of QCA8K_LED_CTRL3_REG are used for led2 ++ * - the 2 bit at (13, 12) of QCA8K_LED_CTRL3_REG are used for led3 ++ * ++ * To control port 2: ++ * - the 2 bit at (15, 14) of QCA8K_LED_CTRL3_REG are used for led1 ++ * - the 2 bit at (17, 16) of QCA8K_LED_CTRL3_REG are used for led2 ++ * - the 2 bit at (19, 18) of QCA8K_LED_CTRL3_REG are used for led3 ++ * ++ * To control port 3: ++ * - the 2 bit at (21, 20) of QCA8K_LED_CTRL3_REG are used for led1 ++ * - the 2 bit at (23, 22) of QCA8K_LED_CTRL3_REG are used for led2 ++ * - the 2 bit at (25, 24) of QCA8K_LED_CTRL3_REG are used for led3 ++ * ++ * To abstract this and have less code, we use the port and led numm ++ * to calculate the shift and the correct reg due to this problem of ++ * not having a 1:1 map of LED with the regs. ++ */ ++ if (led->port_num == 0 || led->port_num == 4) { ++ mask = QCA8K_LED_PATTERN_EN_MASK; ++ val <<= QCA8K_LED_PATTERN_EN_SHIFT; ++ } else { ++ mask = QCA8K_LED_PHY123_PATTERN_EN_MASK; ++ } ++ ++ return regmap_update_bits(priv->regmap, reg_info.reg, ++ mask << reg_info.shift, ++ val << reg_info.shift); ++} ++ ++static int ++qca8k_cled_brightness_set_blocking(struct led_classdev *ldev, ++ enum led_brightness brightness) ++{ ++ struct qca8k_led *led = container_of(ldev, struct qca8k_led, cdev); ++ ++ return qca8k_led_brightness_set(led, brightness); ++} ++ ++static enum led_brightness ++qca8k_led_brightness_get(struct qca8k_led *led) ++{ ++ struct qca8k_led_pattern_en reg_info; ++ struct qca8k_priv *priv = led->priv; ++ u32 val; ++ int ret; ++ ++ qca8k_get_enable_led_reg(led->port_num, led->led_num, ®_info); ++ ++ ret = regmap_read(priv->regmap, reg_info.reg, &val); ++ if (ret) ++ return 0; ++ ++ val >>= reg_info.shift; ++ ++ if (led->port_num == 0 || led->port_num == 4) { ++ val &= QCA8K_LED_PATTERN_EN_MASK; ++ val >>= QCA8K_LED_PATTERN_EN_SHIFT; ++ } else { ++ val &= QCA8K_LED_PHY123_PATTERN_EN_MASK; ++ } ++ ++ /* Assume brightness ON only when the LED is set to always ON */ ++ return val == QCA8K_LED_ALWAYS_ON; ++} ++ ++static int ++qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int port_num) ++{ ++ struct fwnode_handle *led = NULL, *leds = NULL; ++ struct led_init_data init_data = { }; ++ struct dsa_switch *ds = priv->ds; ++ enum led_default_state state; ++ struct qca8k_led *port_led; ++ int led_num, led_index; ++ int ret; ++ ++ leds = fwnode_get_named_child_node(port, "leds"); ++ if (!leds) { ++ dev_dbg(priv->dev, "No Leds node specified in device tree for port %d!\n", ++ port_num); ++ return 0; ++ } ++ ++ fwnode_for_each_child_node(leds, led) { ++ /* Reg represent the led number of the port. ++ * Each port can have at most 3 leds attached ++ * Commonly: ++ * 1. is gigabit led ++ * 2. is mbit led ++ * 3. additional status led ++ */ ++ if (fwnode_property_read_u32(led, "reg", &led_num)) ++ continue; ++ ++ if (led_num >= QCA8K_LED_PORT_COUNT) { ++ dev_warn(priv->dev, "Invalid LED reg %d defined for port %d", ++ led_num, port_num); ++ continue; ++ } ++ ++ led_index = QCA8K_LED_PORT_INDEX(port_num, led_num); ++ ++ port_led = &priv->ports_led[led_index]; ++ port_led->port_num = port_num; ++ port_led->led_num = led_num; ++ port_led->priv = priv; ++ ++ state = led_init_default_state_get(led); ++ switch (state) { ++ case LEDS_DEFSTATE_ON: ++ port_led->cdev.brightness = 1; ++ qca8k_led_brightness_set(port_led, 1); ++ break; ++ case LEDS_DEFSTATE_KEEP: ++ port_led->cdev.brightness = ++ qca8k_led_brightness_get(port_led); ++ break; ++ default: ++ port_led->cdev.brightness = 0; ++ qca8k_led_brightness_set(port_led, 0); ++ } ++ ++ port_led->cdev.max_brightness = 1; ++ port_led->cdev.brightness_set_blocking = qca8k_cled_brightness_set_blocking; ++ init_data.default_label = ":port"; ++ init_data.fwnode = led; ++ init_data.devname_mandatory = true; ++ init_data.devicename = kasprintf(GFP_KERNEL, "%s:0%d", ds->slave_mii_bus->id, ++ port_num); ++ if (!init_data.devicename) ++ return -ENOMEM; ++ ++ ret = devm_led_classdev_register_ext(priv->dev, &port_led->cdev, &init_data); ++ if (ret) ++ dev_warn(priv->dev, "Failed to init LED %d for port %d", led_num, port_num); ++ ++ kfree(init_data.devicename); ++ } ++ ++ return 0; ++} ++ ++int ++qca8k_setup_led_ctrl(struct qca8k_priv *priv) ++{ ++ struct fwnode_handle *ports, *port; ++ int port_num; ++ int ret; ++ ++ ports = device_get_named_child_node(priv->dev, "ports"); ++ if (!ports) { ++ dev_info(priv->dev, "No ports node specified in device tree!"); ++ return 0; ++ } ++ ++ fwnode_for_each_child_node(ports, port) { ++ if (fwnode_property_read_u32(port, "reg", &port_num)) ++ continue; ++ ++ /* Skip checking for CPU port 0 and CPU port 6 as not supported */ ++ if (port_num == 0 || port_num == 6) ++ continue; ++ ++ /* Each port can have at most 3 different leds attached. ++ * Switch port starts from 0 to 6, but port 0 and 6 are CPU ++ * port. The port index needs to be decreased by one to identify ++ * the correct port for LED setup. ++ */ ++ ret = qca8k_parse_port_leds(priv, port, qca8k_port_to_phy(port_num)); ++ if (ret) ++ return ret; ++ } ++ ++ return 0; ++} +--- a/drivers/net/dsa/qca/qca8k.h ++++ b/drivers/net/dsa/qca/qca8k.h +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + #include + + #define QCA8K_ETHERNET_MDIO_PRIORITY 7 +@@ -85,6 +86,51 @@ + #define QCA8K_MDIO_MASTER_DATA(x) FIELD_PREP(QCA8K_MDIO_MASTER_DATA_MASK, x) + #define QCA8K_MDIO_MASTER_MAX_PORTS 5 + #define QCA8K_MDIO_MASTER_MAX_REG 32 ++ ++/* LED control register */ ++#define QCA8K_LED_PORT_COUNT 3 ++#define QCA8K_LED_COUNT ((QCA8K_NUM_PORTS - QCA8K_NUM_CPU_PORTS) * QCA8K_LED_PORT_COUNT) ++#define QCA8K_LED_RULE_COUNT 6 ++#define QCA8K_LED_RULE_MAX 11 ++#define QCA8K_LED_PORT_INDEX(_phy, _led) (((_phy) * QCA8K_LED_PORT_COUNT) + (_led)) ++ ++#define QCA8K_LED_PHY123_PATTERN_EN_SHIFT(_phy, _led) ((((_phy) - 1) * 6) + 8 + (2 * (_led))) ++#define QCA8K_LED_PHY123_PATTERN_EN_MASK GENMASK(1, 0) ++ ++#define QCA8K_LED_PHY0123_CONTROL_RULE_SHIFT 0 ++#define QCA8K_LED_PHY4_CONTROL_RULE_SHIFT 16 ++ ++#define QCA8K_LED_CTRL_REG(_i) (0x050 + (_i) * 4) ++#define QCA8K_LED_CTRL0_REG 0x50 ++#define QCA8K_LED_CTRL1_REG 0x54 ++#define QCA8K_LED_CTRL2_REG 0x58 ++#define QCA8K_LED_CTRL3_REG 0x5C ++#define QCA8K_LED_CTRL_SHIFT(_i) (((_i) % 2) * 16) ++#define QCA8K_LED_CTRL_MASK GENMASK(15, 0) ++#define QCA8K_LED_RULE_MASK GENMASK(13, 0) ++#define QCA8K_LED_BLINK_FREQ_MASK GENMASK(1, 0) ++#define QCA8K_LED_BLINK_FREQ_SHITF 0 ++#define QCA8K_LED_BLINK_2HZ 0 ++#define QCA8K_LED_BLINK_4HZ 1 ++#define QCA8K_LED_BLINK_8HZ 2 ++#define QCA8K_LED_BLINK_AUTO 3 ++#define QCA8K_LED_LINKUP_OVER_MASK BIT(2) ++#define QCA8K_LED_TX_BLINK_MASK BIT(4) ++#define QCA8K_LED_RX_BLINK_MASK BIT(5) ++#define QCA8K_LED_COL_BLINK_MASK BIT(7) ++#define QCA8K_LED_LINK_10M_EN_MASK BIT(8) ++#define QCA8K_LED_LINK_100M_EN_MASK BIT(9) ++#define QCA8K_LED_LINK_1000M_EN_MASK BIT(10) ++#define QCA8K_LED_POWER_ON_LIGHT_MASK BIT(11) ++#define QCA8K_LED_HALF_DUPLEX_MASK BIT(12) ++#define QCA8K_LED_FULL_DUPLEX_MASK BIT(13) ++#define QCA8K_LED_PATTERN_EN_MASK GENMASK(15, 14) ++#define QCA8K_LED_PATTERN_EN_SHIFT 14 ++#define QCA8K_LED_ALWAYS_OFF 0 ++#define QCA8K_LED_ALWAYS_BLINK_4HZ 1 ++#define QCA8K_LED_ALWAYS_ON 2 ++#define QCA8K_LED_RULE_CONTROLLED 3 ++ + #define QCA8K_GOL_MAC_ADDR0 0x60 + #define QCA8K_GOL_MAC_ADDR1 0x64 + #define QCA8K_MAX_FRAME_SIZE 0x78 +@@ -377,6 +423,19 @@ struct qca8k_mdio_cache { + u16 page; + }; + ++struct qca8k_led_pattern_en { ++ u32 reg; ++ u8 shift; ++}; ++ ++struct qca8k_led { ++ u8 port_num; ++ u8 led_num; ++ u16 old_rule; ++ struct qca8k_priv *priv; ++ struct led_classdev cdev; ++}; ++ + struct qca8k_priv { + u8 switch_id; + u8 switch_revision; +@@ -399,6 +458,7 @@ struct qca8k_priv { + struct qca8k_mib_eth_data mib_eth_data; + struct qca8k_mdio_cache mdio_cache; + const struct qca8k_match_data *info; ++ struct qca8k_led ports_led[QCA8K_LED_COUNT]; + }; + + struct qca8k_mib_desc { +--- /dev/null ++++ b/drivers/net/dsa/qca/qca8k_leds.h +@@ -0,0 +1,16 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#ifndef __QCA8K_LEDS_H ++#define __QCA8K_LEDS_H ++ ++/* Leds Support function */ ++#ifdef CONFIG_NET_DSA_QCA8K_LEDS_SUPPORT ++int qca8k_setup_led_ctrl(struct qca8k_priv *priv); ++#else ++static inline int qca8k_setup_led_ctrl(struct qca8k_priv *priv) ++{ ++ return 0; ++} ++#endif ++ ++#endif /* __QCA8K_LEDS_H */ diff --git a/target/linux/generic/backport-5.15/815-v6.4-03-net-dsa-qca8k-add-LEDs-blink_set-support.patch b/target/linux/generic/backport-5.15/815-v6.4-03-net-dsa-qca8k-add-LEDs-blink_set-support.patch new file mode 100644 index 0000000000..231c4156df --- /dev/null +++ b/target/linux/generic/backport-5.15/815-v6.4-03-net-dsa-qca8k-add-LEDs-blink_set-support.patch @@ -0,0 +1,74 @@ +From 91acadcc6e599dfc62717abcdad58a459cfb1684 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 17 Apr 2023 17:17:25 +0200 +Subject: [PATCH 3/9] net: dsa: qca8k: add LEDs blink_set() support + +Add LEDs blink_set() support to qca8k Switch Family. +These LEDs support hw accellerated blinking at a fixed rate +of 4Hz. + +Reject any other value since not supported by the LEDs switch. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Acked-by: Pavel Machek +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca/qca8k-leds.c | 38 ++++++++++++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +--- a/drivers/net/dsa/qca/qca8k-leds.c ++++ b/drivers/net/dsa/qca/qca8k-leds.c +@@ -128,6 +128,43 @@ qca8k_led_brightness_get(struct qca8k_le + } + + static int ++qca8k_cled_blink_set(struct led_classdev *ldev, ++ unsigned long *delay_on, ++ unsigned long *delay_off) ++{ ++ struct qca8k_led *led = container_of(ldev, struct qca8k_led, cdev); ++ u32 mask, val = QCA8K_LED_ALWAYS_BLINK_4HZ; ++ struct qca8k_led_pattern_en reg_info; ++ struct qca8k_priv *priv = led->priv; ++ ++ if (*delay_on == 0 && *delay_off == 0) { ++ *delay_on = 125; ++ *delay_off = 125; ++ } ++ ++ if (*delay_on != 125 || *delay_off != 125) { ++ /* The hardware only supports blinking at 4Hz. Fall back ++ * to software implementation in other cases. ++ */ ++ return -EINVAL; ++ } ++ ++ qca8k_get_enable_led_reg(led->port_num, led->led_num, ®_info); ++ ++ if (led->port_num == 0 || led->port_num == 4) { ++ mask = QCA8K_LED_PATTERN_EN_MASK; ++ val <<= QCA8K_LED_PATTERN_EN_SHIFT; ++ } else { ++ mask = QCA8K_LED_PHY123_PATTERN_EN_MASK; ++ } ++ ++ regmap_update_bits(priv->regmap, reg_info.reg, mask << reg_info.shift, ++ val << reg_info.shift); ++ ++ return 0; ++} ++ ++static int + qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int port_num) + { + struct fwnode_handle *led = NULL, *leds = NULL; +@@ -186,6 +223,7 @@ qca8k_parse_port_leds(struct qca8k_priv + + port_led->cdev.max_brightness = 1; + port_led->cdev.brightness_set_blocking = qca8k_cled_brightness_set_blocking; ++ port_led->cdev.blink_set = qca8k_cled_blink_set; + init_data.default_label = ":port"; + init_data.fwnode = led; + init_data.devname_mandatory = true; diff --git a/target/linux/generic/backport-5.15/815-v6.4-04-leds-Provide-stubs-for-when-CLASS_LED-NEW_LEDS-are-d.patch b/target/linux/generic/backport-5.15/815-v6.4-04-leds-Provide-stubs-for-when-CLASS_LED-NEW_LEDS-are-d.patch new file mode 100644 index 0000000000..bc905b4468 --- /dev/null +++ b/target/linux/generic/backport-5.15/815-v6.4-04-leds-Provide-stubs-for-when-CLASS_LED-NEW_LEDS-are-d.patch @@ -0,0 +1,59 @@ +From e5029edd53937a29801ef507cee12e657ff31ea9 Mon Sep 17 00:00:00 2001 +From: Andrew Lunn +Date: Mon, 17 Apr 2023 17:17:26 +0200 +Subject: [PATCH 4/9] leds: Provide stubs for when CLASS_LED & NEW_LEDS are + disabled + +Provide stubs for devm_led_classdev_register_ext() and +led_init_default_state_get() so that LED drivers embedded within other +drivers such as PHYs and Ethernet switches still build when LEDS_CLASS +or NEW_LEDS are disabled. This also helps with Kconfig dependencies, +which are somewhat hairy for phylib and mdio and only get worse when +adding a dependency on LED_CLASS. + +Signed-off-by: Andrew Lunn +Signed-off-by: Christian Marangi +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + include/linux/leds.h | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +--- a/include/linux/leds.h ++++ b/include/linux/leds.h +@@ -63,7 +63,15 @@ struct led_init_data { + bool devname_mandatory; + }; + ++#if IS_ENABLED(CONFIG_NEW_LEDS) + enum led_default_state led_init_default_state_get(struct fwnode_handle *fwnode); ++#else ++static inline enum led_default_state ++led_init_default_state_get(struct fwnode_handle *fwnode) ++{ ++ return LEDS_DEFSTATE_OFF; ++} ++#endif + + struct led_hw_trigger_type { + int dummy; +@@ -198,9 +206,19 @@ static inline int led_classdev_register( + return led_classdev_register_ext(parent, led_cdev, NULL); + } + ++#if IS_ENABLED(CONFIG_LEDS_CLASS) + int devm_led_classdev_register_ext(struct device *parent, + struct led_classdev *led_cdev, + struct led_init_data *init_data); ++#else ++static inline int ++devm_led_classdev_register_ext(struct device *parent, ++ struct led_classdev *led_cdev, ++ struct led_init_data *init_data) ++{ ++ return 0; ++} ++#endif + + static inline int devm_led_classdev_register(struct device *parent, + struct led_classdev *led_cdev) diff --git a/target/linux/generic/backport-5.15/815-v6.4-05-net-phy-Add-a-binding-for-PHY-LEDs.patch b/target/linux/generic/backport-5.15/815-v6.4-05-net-phy-Add-a-binding-for-PHY-LEDs.patch new file mode 100644 index 0000000000..3e60f91a2a --- /dev/null +++ b/target/linux/generic/backport-5.15/815-v6.4-05-net-phy-Add-a-binding-for-PHY-LEDs.patch @@ -0,0 +1,191 @@ +From 01e5b728e9e43ae444e0369695a5f72209906464 Mon Sep 17 00:00:00 2001 +From: Andrew Lunn +Date: Mon, 17 Apr 2023 17:17:27 +0200 +Subject: [PATCH 5/9] net: phy: Add a binding for PHY LEDs + +Define common binding parsing for all PHY drivers with LEDs using +phylib. Parse the DT as part of the phy_probe and add LEDs to the +linux LED class infrastructure. For the moment, provide a dummy +brightness function, which will later be replaced with a call into the +PHY driver. This allows testing since the LED core might otherwise +reject an LED whose brightness cannot be set. + +Add a dependency on LED_CLASS. It either needs to be built in, or not +enabled, since a modular build can result in linker errors. + +Signed-off-by: Andrew Lunn +Signed-off-by: Christian Marangi +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/phy/Kconfig | 1 + + drivers/net/phy/phy_device.c | 76 ++++++++++++++++++++++++++++++++++++ + include/linux/phy.h | 16 ++++++++ + 3 files changed, 93 insertions(+) + +--- a/drivers/net/phy/Kconfig ++++ b/drivers/net/phy/Kconfig +@@ -18,6 +18,7 @@ menuconfig PHYLIB + depends on NETDEVICES + select MDIO_DEVICE + select MDIO_DEVRES ++ depends on LEDS_CLASS || LEDS_CLASS=n + help + Ethernet controllers are usually attached to PHY + devices. This option provides infrastructure for +--- a/drivers/net/phy/phy_device.c ++++ b/drivers/net/phy/phy_device.c +@@ -19,10 +19,12 @@ + #include + #include + #include ++#include + #include + #include + #include + #include ++#include + #include + #include + #include +@@ -641,6 +643,7 @@ struct phy_device *phy_device_create(str + device_initialize(&mdiodev->dev); + + dev->state = PHY_DOWN; ++ INIT_LIST_HEAD(&dev->leds); + + mutex_init(&dev->lock); + INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine); +@@ -2942,6 +2945,74 @@ static bool phy_drv_supports_irq(struct + return phydrv->config_intr && phydrv->handle_interrupt; + } + ++/* Dummy implementation until calls into PHY driver are added */ ++static int phy_led_set_brightness(struct led_classdev *led_cdev, ++ enum led_brightness value) ++{ ++ return 0; ++} ++ ++static int of_phy_led(struct phy_device *phydev, ++ struct device_node *led) ++{ ++ struct device *dev = &phydev->mdio.dev; ++ struct led_init_data init_data = {}; ++ struct led_classdev *cdev; ++ struct phy_led *phyled; ++ int err; ++ ++ phyled = devm_kzalloc(dev, sizeof(*phyled), GFP_KERNEL); ++ if (!phyled) ++ return -ENOMEM; ++ ++ cdev = &phyled->led_cdev; ++ ++ err = of_property_read_u8(led, "reg", &phyled->index); ++ if (err) ++ return err; ++ ++ cdev->brightness_set_blocking = phy_led_set_brightness; ++ cdev->max_brightness = 1; ++ init_data.devicename = dev_name(&phydev->mdio.dev); ++ init_data.fwnode = of_fwnode_handle(led); ++ init_data.devname_mandatory = true; ++ ++ err = devm_led_classdev_register_ext(dev, cdev, &init_data); ++ if (err) ++ return err; ++ ++ list_add(&phyled->list, &phydev->leds); ++ ++ return 0; ++} ++ ++static int of_phy_leds(struct phy_device *phydev) ++{ ++ struct device_node *node = phydev->mdio.dev.of_node; ++ struct device_node *leds, *led; ++ int err; ++ ++ if (!IS_ENABLED(CONFIG_OF_MDIO)) ++ return 0; ++ ++ if (!node) ++ return 0; ++ ++ leds = of_get_child_by_name(node, "leds"); ++ if (!leds) ++ return 0; ++ ++ for_each_available_child_of_node(leds, led) { ++ err = of_phy_led(phydev, led); ++ if (err) { ++ of_node_put(led); ++ return err; ++ } ++ } ++ ++ return 0; ++} ++ + /** + * fwnode_mdio_find_device - Given a fwnode, find the mdio_device + * @fwnode: pointer to the mdio_device's fwnode +@@ -3120,6 +3191,11 @@ static int phy_probe(struct device *dev) + /* Set the state to READY by default */ + phydev->state = PHY_READY; + ++ /* Get the LEDs from the device tree, and instantiate standard ++ * LEDs for them. ++ */ ++ err = of_phy_leds(phydev); ++ + out: + /* Re-assert the reset signal on error */ + if (err) +--- a/include/linux/phy.h ++++ b/include/linux/phy.h +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -582,6 +583,7 @@ struct macsec_ops; + * @phy_num_led_triggers: Number of triggers in @phy_led_triggers + * @led_link_trigger: LED trigger for link up/down + * @last_triggered: last LED trigger for link speed ++ * @leds: list of PHY LED structures + * @master_slave_set: User requested master/slave configuration + * @master_slave_get: Current master/slave advertisement + * @master_slave_state: Current master/slave configuration +@@ -668,6 +670,7 @@ struct phy_device { + + struct phy_led_trigger *led_link_trigger; + #endif ++ struct list_head leds; + + /* + * Interrupt number for this PHY +@@ -739,6 +742,19 @@ struct phy_tdr_config { + #define PHY_PAIR_ALL -1 + + /** ++ * struct phy_led: An LED driven by the PHY ++ * ++ * @list: List of LEDs ++ * @led_cdev: Standard LED class structure ++ * @index: Number of the LED ++ */ ++struct phy_led { ++ struct list_head list; ++ struct led_classdev led_cdev; ++ u8 index; ++}; ++ ++/** + * struct phy_driver - Driver structure for a particular PHY type + * + * @mdiodrv: Data common to all MDIO devices diff --git a/target/linux/generic/backport-5.15/815-v6.4-06-net-phy-phy_device-Call-into-the-PHY-driver-to-set-L.patch b/target/linux/generic/backport-5.15/815-v6.4-06-net-phy-phy_device-Call-into-the-PHY-driver-to-set-L.patch new file mode 100644 index 0000000000..f990557cc7 --- /dev/null +++ b/target/linux/generic/backport-5.15/815-v6.4-06-net-phy-phy_device-Call-into-the-PHY-driver-to-set-L.patch @@ -0,0 +1,97 @@ +From 684818189b04b095b34964ed4a3ea5249a840eab Mon Sep 17 00:00:00 2001 +From: Andrew Lunn +Date: Mon, 17 Apr 2023 17:17:28 +0200 +Subject: [PATCH 6/9] net: phy: phy_device: Call into the PHY driver to set LED + brightness + +Linux LEDs can be software controlled via the brightness file in /sys. +LED drivers need to implement a brightness_set function which the core +will call. Implement an intermediary in phy_device, which will call +into the phy driver if it implements the necessary function. + +Signed-off-by: Andrew Lunn +Signed-off-by: Christian Marangi +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/phy/phy_device.c | 15 ++++++++++++--- + include/linux/phy.h | 13 +++++++++++++ + 2 files changed, 25 insertions(+), 3 deletions(-) + +--- a/drivers/net/phy/phy_device.c ++++ b/drivers/net/phy/phy_device.c +@@ -2945,11 +2945,18 @@ static bool phy_drv_supports_irq(struct + return phydrv->config_intr && phydrv->handle_interrupt; + } + +-/* Dummy implementation until calls into PHY driver are added */ + static int phy_led_set_brightness(struct led_classdev *led_cdev, + enum led_brightness value) + { +- return 0; ++ struct phy_led *phyled = to_phy_led(led_cdev); ++ struct phy_device *phydev = phyled->phydev; ++ int err; ++ ++ mutex_lock(&phydev->lock); ++ err = phydev->drv->led_brightness_set(phydev, phyled->index, value); ++ mutex_unlock(&phydev->lock); ++ ++ return err; + } + + static int of_phy_led(struct phy_device *phydev, +@@ -2966,12 +2973,14 @@ static int of_phy_led(struct phy_device + return -ENOMEM; + + cdev = &phyled->led_cdev; ++ phyled->phydev = phydev; + + err = of_property_read_u8(led, "reg", &phyled->index); + if (err) + return err; + +- cdev->brightness_set_blocking = phy_led_set_brightness; ++ if (phydev->drv->led_brightness_set) ++ cdev->brightness_set_blocking = phy_led_set_brightness; + cdev->max_brightness = 1; + init_data.devicename = dev_name(&phydev->mdio.dev); + init_data.fwnode = of_fwnode_handle(led); +--- a/include/linux/phy.h ++++ b/include/linux/phy.h +@@ -745,15 +745,19 @@ struct phy_tdr_config { + * struct phy_led: An LED driven by the PHY + * + * @list: List of LEDs ++ * @phydev: PHY this LED is attached to + * @led_cdev: Standard LED class structure + * @index: Number of the LED + */ + struct phy_led { + struct list_head list; ++ struct phy_device *phydev; + struct led_classdev led_cdev; + u8 index; + }; + ++#define to_phy_led(d) container_of(d, struct phy_led, led_cdev) ++ + /** + * struct phy_driver - Driver structure for a particular PHY type + * +@@ -953,6 +957,15 @@ struct phy_driver { + int (*get_sqi)(struct phy_device *dev); + /** @get_sqi_max: Get the maximum signal quality indication */ + int (*get_sqi_max)(struct phy_device *dev); ++ ++ /** ++ * @led_brightness_set: Set a PHY LED brightness. Index ++ * indicates which of the PHYs led should be set. Value ++ * follows the standard LED class meaning, e.g. LED_OFF, ++ * LED_HALF, LED_FULL. ++ */ ++ int (*led_brightness_set)(struct phy_device *dev, ++ u8 index, enum led_brightness value); + }; + #define to_phy_driver(d) container_of(to_mdio_common_driver(d), \ + struct phy_driver, mdiodrv) diff --git a/target/linux/generic/backport-5.15/815-v6.4-07-net-phy-marvell-Add-software-control-of-the-LEDs.patch b/target/linux/generic/backport-5.15/815-v6.4-07-net-phy-marvell-Add-software-control-of-the-LEDs.patch new file mode 100644 index 0000000000..053288ceca --- /dev/null +++ b/target/linux/generic/backport-5.15/815-v6.4-07-net-phy-marvell-Add-software-control-of-the-LEDs.patch @@ -0,0 +1,112 @@ +From 2d3960e58ef7c83fe1dbf952f056b9e906cb6df8 Mon Sep 17 00:00:00 2001 +From: Andrew Lunn +Date: Mon, 17 Apr 2023 17:17:29 +0200 +Subject: [PATCH 7/9] net: phy: marvell: Add software control of the LEDs + +Add a brightness function, so the LEDs can be controlled from +software using the standard Linux LED infrastructure. + +Signed-off-by: Andrew Lunn +Signed-off-by: Christian Marangi +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/phy/marvell.c | 45 ++++++++++++++++++++++++++++++++++----- + 1 file changed, 40 insertions(+), 5 deletions(-) + +--- a/drivers/net/phy/marvell.c ++++ b/drivers/net/phy/marvell.c +@@ -144,11 +144,13 @@ + /* WOL Event Interrupt Enable */ + #define MII_88E1318S_PHY_CSIER_WOL_EIE BIT(7) + +-/* LED Timer Control Register */ +-#define MII_88E1318S_PHY_LED_TCR 0x12 +-#define MII_88E1318S_PHY_LED_TCR_FORCE_INT BIT(15) +-#define MII_88E1318S_PHY_LED_TCR_INTn_ENABLE BIT(7) +-#define MII_88E1318S_PHY_LED_TCR_INT_ACTIVE_LOW BIT(11) ++#define MII_88E1318S_PHY_LED_FUNC 0x10 ++#define MII_88E1318S_PHY_LED_FUNC_OFF (0x8) ++#define MII_88E1318S_PHY_LED_FUNC_ON (0x9) ++#define MII_88E1318S_PHY_LED_TCR 0x12 ++#define MII_88E1318S_PHY_LED_TCR_FORCE_INT BIT(15) ++#define MII_88E1318S_PHY_LED_TCR_INTn_ENABLE BIT(7) ++#define MII_88E1318S_PHY_LED_TCR_INT_ACTIVE_LOW BIT(11) + + /* Magic Packet MAC address registers */ + #define MII_88E1318S_PHY_MAGIC_PACKET_WORD2 0x17 +@@ -2793,6 +2795,34 @@ static int marvell_hwmon_probe(struct ph + } + #endif + ++static int m88e1318_led_brightness_set(struct phy_device *phydev, ++ u8 index, enum led_brightness value) ++{ ++ int reg; ++ ++ reg = phy_read_paged(phydev, MII_MARVELL_LED_PAGE, ++ MII_88E1318S_PHY_LED_FUNC); ++ if (reg < 0) ++ return reg; ++ ++ switch (index) { ++ case 0: ++ case 1: ++ case 2: ++ reg &= ~(0xf << (4 * index)); ++ if (value == LED_OFF) ++ reg |= MII_88E1318S_PHY_LED_FUNC_OFF << (4 * index); ++ else ++ reg |= MII_88E1318S_PHY_LED_FUNC_ON << (4 * index); ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ return phy_write_paged(phydev, MII_MARVELL_LED_PAGE, ++ MII_88E1318S_PHY_LED_FUNC, reg); ++} ++ + static int marvell_probe(struct phy_device *phydev) + { + struct marvell_priv *priv; +@@ -3041,6 +3071,7 @@ static struct phy_driver marvell_drivers + .get_sset_count = marvell_get_sset_count, + .get_strings = marvell_get_strings, + .get_stats = marvell_get_stats, ++ .led_brightness_set = m88e1318_led_brightness_set, + }, + { + .phy_id = MARVELL_PHY_ID_88E1145, +@@ -3147,6 +3178,7 @@ static struct phy_driver marvell_drivers + .cable_test_start = marvell_vct7_cable_test_start, + .cable_test_tdr_start = marvell_vct5_cable_test_tdr_start, + .cable_test_get_status = marvell_vct7_cable_test_get_status, ++ .led_brightness_set = m88e1318_led_brightness_set, + }, + { + .phy_id = MARVELL_PHY_ID_88E1540, +@@ -3173,6 +3205,7 @@ static struct phy_driver marvell_drivers + .cable_test_start = marvell_vct7_cable_test_start, + .cable_test_tdr_start = marvell_vct5_cable_test_tdr_start, + .cable_test_get_status = marvell_vct7_cable_test_get_status, ++ .led_brightness_set = m88e1318_led_brightness_set, + }, + { + .phy_id = MARVELL_PHY_ID_88E1545, +@@ -3199,6 +3232,7 @@ static struct phy_driver marvell_drivers + .cable_test_start = marvell_vct7_cable_test_start, + .cable_test_tdr_start = marvell_vct5_cable_test_tdr_start, + .cable_test_get_status = marvell_vct7_cable_test_get_status, ++ .led_brightness_set = m88e1318_led_brightness_set, + }, + { + .phy_id = MARVELL_PHY_ID_88E3016, +@@ -3340,6 +3374,7 @@ static struct phy_driver marvell_drivers + .get_stats = marvell_get_stats, + .get_tunable = m88e1540_get_tunable, + .set_tunable = m88e1540_set_tunable, ++ .led_brightness_set = m88e1318_led_brightness_set, + }, + }; + diff --git a/target/linux/generic/backport-5.15/815-v6.4-08-net-phy-phy_device-Call-into-the-PHY-driver-to-set-L.patch b/target/linux/generic/backport-5.15/815-v6.4-08-net-phy-phy_device-Call-into-the-PHY-driver-to-set-L.patch new file mode 100644 index 0000000000..4814688de4 --- /dev/null +++ b/target/linux/generic/backport-5.15/815-v6.4-08-net-phy-phy_device-Call-into-the-PHY-driver-to-set-L.patch @@ -0,0 +1,73 @@ +From 4e901018432e38eab35d2a352661ce4727795be1 Mon Sep 17 00:00:00 2001 +From: Andrew Lunn +Date: Mon, 17 Apr 2023 17:17:30 +0200 +Subject: [PATCH 8/9] net: phy: phy_device: Call into the PHY driver to set LED + blinking + +Linux LEDs can be requested to perform hardware accelerated +blinking. Pass this to the PHY driver, if it implements the op. + +Signed-off-by: Andrew Lunn +Signed-off-by: Christian Marangi +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/phy/phy_device.c | 18 ++++++++++++++++++ + include/linux/phy.h | 12 ++++++++++++ + 2 files changed, 30 insertions(+) + +--- a/drivers/net/phy/phy_device.c ++++ b/drivers/net/phy/phy_device.c +@@ -2959,6 +2959,22 @@ static int phy_led_set_brightness(struct + return err; + } + ++static int phy_led_blink_set(struct led_classdev *led_cdev, ++ unsigned long *delay_on, ++ unsigned long *delay_off) ++{ ++ struct phy_led *phyled = to_phy_led(led_cdev); ++ struct phy_device *phydev = phyled->phydev; ++ int err; ++ ++ mutex_lock(&phydev->lock); ++ err = phydev->drv->led_blink_set(phydev, phyled->index, ++ delay_on, delay_off); ++ mutex_unlock(&phydev->lock); ++ ++ return err; ++} ++ + static int of_phy_led(struct phy_device *phydev, + struct device_node *led) + { +@@ -2981,6 +2997,8 @@ static int of_phy_led(struct phy_device + + if (phydev->drv->led_brightness_set) + cdev->brightness_set_blocking = phy_led_set_brightness; ++ if (phydev->drv->led_blink_set) ++ cdev->blink_set = phy_led_blink_set; + cdev->max_brightness = 1; + init_data.devicename = dev_name(&phydev->mdio.dev); + init_data.fwnode = of_fwnode_handle(led); +--- a/include/linux/phy.h ++++ b/include/linux/phy.h +@@ -966,6 +966,18 @@ struct phy_driver { + */ + int (*led_brightness_set)(struct phy_device *dev, + u8 index, enum led_brightness value); ++ ++ /** ++ * @led_blink_set: Set a PHY LED brightness. Index indicates ++ * which of the PHYs led should be configured to blink. Delays ++ * are in milliseconds and if both are zero then a sensible ++ * default should be chosen. The call should adjust the ++ * timings in that case and if it can't match the values ++ * specified exactly. ++ */ ++ int (*led_blink_set)(struct phy_device *dev, u8 index, ++ unsigned long *delay_on, ++ unsigned long *delay_off); + }; + #define to_phy_driver(d) container_of(to_mdio_common_driver(d), \ + struct phy_driver, mdiodrv) diff --git a/target/linux/generic/backport-5.15/815-v6.4-09-net-phy-marvell-Implement-led_blink_set.patch b/target/linux/generic/backport-5.15/815-v6.4-09-net-phy-marvell-Implement-led_blink_set.patch new file mode 100644 index 0000000000..0f258c6b92 --- /dev/null +++ b/target/linux/generic/backport-5.15/815-v6.4-09-net-phy-marvell-Implement-led_blink_set.patch @@ -0,0 +1,104 @@ +From ea9e86485decb2ac1750005bd96c166c9b780406 Mon Sep 17 00:00:00 2001 +From: Andrew Lunn +Date: Mon, 17 Apr 2023 17:17:31 +0200 +Subject: [PATCH 9/9] net: phy: marvell: Implement led_blink_set() + +The Marvell PHY can blink the LEDs, simple on/off. All LEDs blink at +the same rate, and the reset default is 84ms per blink, which is +around 12Hz. + +Signed-off-by: Andrew Lunn +Signed-off-by: Christian Marangi +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/phy/marvell.c | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +--- a/drivers/net/phy/marvell.c ++++ b/drivers/net/phy/marvell.c +@@ -147,6 +147,8 @@ + #define MII_88E1318S_PHY_LED_FUNC 0x10 + #define MII_88E1318S_PHY_LED_FUNC_OFF (0x8) + #define MII_88E1318S_PHY_LED_FUNC_ON (0x9) ++#define MII_88E1318S_PHY_LED_FUNC_HI_Z (0xa) ++#define MII_88E1318S_PHY_LED_FUNC_BLINK (0xb) + #define MII_88E1318S_PHY_LED_TCR 0x12 + #define MII_88E1318S_PHY_LED_TCR_FORCE_INT BIT(15) + #define MII_88E1318S_PHY_LED_TCR_INTn_ENABLE BIT(7) +@@ -2823,6 +2825,35 @@ static int m88e1318_led_brightness_set(s + MII_88E1318S_PHY_LED_FUNC, reg); + } + ++static int m88e1318_led_blink_set(struct phy_device *phydev, u8 index, ++ unsigned long *delay_on, ++ unsigned long *delay_off) ++{ ++ int reg; ++ ++ reg = phy_read_paged(phydev, MII_MARVELL_LED_PAGE, ++ MII_88E1318S_PHY_LED_FUNC); ++ if (reg < 0) ++ return reg; ++ ++ switch (index) { ++ case 0: ++ case 1: ++ case 2: ++ reg &= ~(0xf << (4 * index)); ++ reg |= MII_88E1318S_PHY_LED_FUNC_BLINK << (4 * index); ++ /* Reset default is 84ms */ ++ *delay_on = 84 / 2; ++ *delay_off = 84 / 2; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ return phy_write_paged(phydev, MII_MARVELL_LED_PAGE, ++ MII_88E1318S_PHY_LED_FUNC, reg); ++} ++ + static int marvell_probe(struct phy_device *phydev) + { + struct marvell_priv *priv; +@@ -3072,6 +3103,7 @@ static struct phy_driver marvell_drivers + .get_strings = marvell_get_strings, + .get_stats = marvell_get_stats, + .led_brightness_set = m88e1318_led_brightness_set, ++ .led_blink_set = m88e1318_led_blink_set, + }, + { + .phy_id = MARVELL_PHY_ID_88E1145, +@@ -3179,6 +3211,7 @@ static struct phy_driver marvell_drivers + .cable_test_tdr_start = marvell_vct5_cable_test_tdr_start, + .cable_test_get_status = marvell_vct7_cable_test_get_status, + .led_brightness_set = m88e1318_led_brightness_set, ++ .led_blink_set = m88e1318_led_blink_set, + }, + { + .phy_id = MARVELL_PHY_ID_88E1540, +@@ -3206,6 +3239,7 @@ static struct phy_driver marvell_drivers + .cable_test_tdr_start = marvell_vct5_cable_test_tdr_start, + .cable_test_get_status = marvell_vct7_cable_test_get_status, + .led_brightness_set = m88e1318_led_brightness_set, ++ .led_blink_set = m88e1318_led_blink_set, + }, + { + .phy_id = MARVELL_PHY_ID_88E1545, +@@ -3233,6 +3267,7 @@ static struct phy_driver marvell_drivers + .cable_test_tdr_start = marvell_vct5_cable_test_tdr_start, + .cable_test_get_status = marvell_vct7_cable_test_get_status, + .led_brightness_set = m88e1318_led_brightness_set, ++ .led_blink_set = m88e1318_led_blink_set, + }, + { + .phy_id = MARVELL_PHY_ID_88E3016, +@@ -3375,6 +3410,7 @@ static struct phy_driver marvell_drivers + .get_tunable = m88e1540_get_tunable, + .set_tunable = m88e1540_set_tunable, + .led_brightness_set = m88e1318_led_brightness_set, ++ .led_blink_set = m88e1318_led_blink_set, + }, + }; + diff --git a/target/linux/generic/backport-5.15/816-v6.4-net-phy-marvell-Fix-inconsistent-indenting-in-led_bl.patch b/target/linux/generic/backport-5.15/816-v6.4-net-phy-marvell-Fix-inconsistent-indenting-in-led_bl.patch new file mode 100644 index 0000000000..c5b611a125 --- /dev/null +++ b/target/linux/generic/backport-5.15/816-v6.4-net-phy-marvell-Fix-inconsistent-indenting-in-led_bl.patch @@ -0,0 +1,38 @@ +From 4774ad841bef97cc51df90195338c5b2573dd4cb Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Sun, 23 Apr 2023 19:28:00 +0200 +Subject: [PATCH] net: phy: marvell: Fix inconsistent indenting in + led_blink_set + +Fix inconsistent indeinting in m88e1318_led_blink_set reported by kernel +test robot, probably done by the presence of an if condition dropped in +later revision of the same code. + +Reported-by: kernel test robot +Link: https://lore.kernel.org/oe-kbuild-all/202304240007.0VEX8QYG-lkp@intel.com/ +Fixes: ea9e86485dec ("net: phy: marvell: Implement led_blink_set()") +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Link: https://lore.kernel.org/r/20230423172800.3470-1-ansuelsmth@gmail.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/marvell.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/net/phy/marvell.c ++++ b/drivers/net/phy/marvell.c +@@ -2841,10 +2841,10 @@ static int m88e1318_led_blink_set(struct + case 1: + case 2: + reg &= ~(0xf << (4 * index)); +- reg |= MII_88E1318S_PHY_LED_FUNC_BLINK << (4 * index); +- /* Reset default is 84ms */ +- *delay_on = 84 / 2; +- *delay_off = 84 / 2; ++ reg |= MII_88E1318S_PHY_LED_FUNC_BLINK << (4 * index); ++ /* Reset default is 84ms */ ++ *delay_on = 84 / 2; ++ *delay_off = 84 / 2; + break; + default: + return -EINVAL; diff --git a/target/linux/generic/backport-5.15/817-v6.5-02-leds-trigger-netdev-Drop-NETDEV_LED_MODE_LINKUP-from.patch b/target/linux/generic/backport-5.15/817-v6.5-02-leds-trigger-netdev-Drop-NETDEV_LED_MODE_LINKUP-from.patch new file mode 100644 index 0000000000..3170c26058 --- /dev/null +++ b/target/linux/generic/backport-5.15/817-v6.5-02-leds-trigger-netdev-Drop-NETDEV_LED_MODE_LINKUP-from.patch @@ -0,0 +1,87 @@ +From e2f24cb1b5daf9a4f6f3ba574c1fa74aab9807a4 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 19 Apr 2023 23:07:40 +0200 +Subject: [PATCH 2/5] leds: trigger: netdev: Drop NETDEV_LED_MODE_LINKUP from + mode + +Putting NETDEV_LED_MODE_LINKUP in the same list of the netdev trigger +modes is wrong as it's used to set the link state of the device and not +to set a blink mode as it's done by NETDEV_LED_LINK, NETDEV_LED_TX and +NETDEV_LED_RX. It's also wrong to put this state in the same bitmap of the +netdev trigger mode and should be external to it. + +Drop NETDEV_LED_MODE_LINKUP from mode list and convert to a simple bool +that will be true or false based on the carrier link. No functional +change intended. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: Lee Jones +Link: https://lore.kernel.org/r/20230419210743.3594-3-ansuelsmth@gmail.com +--- + drivers/leds/trigger/ledtrig-netdev.c | 19 ++++++++----------- + 1 file changed, 8 insertions(+), 11 deletions(-) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -50,10 +50,10 @@ struct led_netdev_data { + unsigned int last_activity; + + unsigned long mode; ++ bool carrier_link_up; + #define NETDEV_LED_LINK 0 + #define NETDEV_LED_TX 1 + #define NETDEV_LED_RX 2 +-#define NETDEV_LED_MODE_LINKUP 3 + }; + + enum netdev_led_attr { +@@ -73,9 +73,9 @@ static void set_baseline_state(struct le + if (!led_cdev->blink_brightness) + led_cdev->blink_brightness = led_cdev->max_brightness; + +- if (!test_bit(NETDEV_LED_MODE_LINKUP, &trigger_data->mode)) ++ if (!trigger_data->carrier_link_up) { + led_set_brightness(led_cdev, LED_OFF); +- else { ++ } else { + if (test_bit(NETDEV_LED_LINK, &trigger_data->mode)) + led_set_brightness(led_cdev, + led_cdev->blink_brightness); +@@ -131,10 +131,9 @@ static ssize_t device_name_store(struct + trigger_data->net_dev = + dev_get_by_name(&init_net, trigger_data->device_name); + +- clear_bit(NETDEV_LED_MODE_LINKUP, &trigger_data->mode); ++ trigger_data->carrier_link_up = false; + if (trigger_data->net_dev != NULL) +- if (netif_carrier_ok(trigger_data->net_dev)) +- set_bit(NETDEV_LED_MODE_LINKUP, &trigger_data->mode); ++ trigger_data->carrier_link_up = netif_carrier_ok(trigger_data->net_dev); + + trigger_data->last_activity = 0; + +@@ -315,11 +314,10 @@ static int netdev_trig_notify(struct not + + spin_lock_bh(&trigger_data->lock); + +- clear_bit(NETDEV_LED_MODE_LINKUP, &trigger_data->mode); ++ trigger_data->carrier_link_up = false; + switch (evt) { + case NETDEV_CHANGENAME: +- if (netif_carrier_ok(dev)) +- set_bit(NETDEV_LED_MODE_LINKUP, &trigger_data->mode); ++ trigger_data->carrier_link_up = netif_carrier_ok(dev); + fallthrough; + case NETDEV_REGISTER: + if (trigger_data->net_dev) +@@ -333,8 +331,7 @@ static int netdev_trig_notify(struct not + break; + case NETDEV_UP: + case NETDEV_CHANGE: +- if (netif_carrier_ok(dev)) +- set_bit(NETDEV_LED_MODE_LINKUP, &trigger_data->mode); ++ trigger_data->carrier_link_up = netif_carrier_ok(dev); + break; + } + diff --git a/target/linux/generic/backport-5.15/817-v6.5-03-leds-trigger-netdev-Rename-add-namespace-to-netdev-t.patch b/target/linux/generic/backport-5.15/817-v6.5-03-leds-trigger-netdev-Rename-add-namespace-to-netdev-t.patch new file mode 100644 index 0000000000..19cc1d7c9e --- /dev/null +++ b/target/linux/generic/backport-5.15/817-v6.5-03-leds-trigger-netdev-Rename-add-namespace-to-netdev-t.patch @@ -0,0 +1,149 @@ +From bdec9cb83936e0ac4cb87fed5b49fad0175f7dec Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 19 Apr 2023 23:07:41 +0200 +Subject: [PATCH 3/5] leds: trigger: netdev: Rename add namespace to netdev + trigger enum modes + +Rename NETDEV trigger enum modes to a more symbolic name and add a +namespace to them. + +Also add __TRIGGER_NETDEV_MAX to identify the max modes of the netdev +trigger. + +This is a cleanup to drop the define and no behaviour change are +intended. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: Lee Jones +Link: https://lore.kernel.org/r/20230419210743.3594-4-ansuelsmth@gmail.com +--- + drivers/leds/trigger/ledtrig-netdev.c | 58 ++++++++++++--------------- + 1 file changed, 25 insertions(+), 33 deletions(-) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -51,15 +51,15 @@ struct led_netdev_data { + + unsigned long mode; + bool carrier_link_up; +-#define NETDEV_LED_LINK 0 +-#define NETDEV_LED_TX 1 +-#define NETDEV_LED_RX 2 + }; + +-enum netdev_led_attr { +- NETDEV_ATTR_LINK, +- NETDEV_ATTR_TX, +- NETDEV_ATTR_RX ++enum led_trigger_netdev_modes { ++ TRIGGER_NETDEV_LINK = 0, ++ TRIGGER_NETDEV_TX, ++ TRIGGER_NETDEV_RX, ++ ++ /* Keep last */ ++ __TRIGGER_NETDEV_MAX, + }; + + static void set_baseline_state(struct led_netdev_data *trigger_data) +@@ -76,7 +76,7 @@ static void set_baseline_state(struct le + if (!trigger_data->carrier_link_up) { + led_set_brightness(led_cdev, LED_OFF); + } else { +- if (test_bit(NETDEV_LED_LINK, &trigger_data->mode)) ++ if (test_bit(TRIGGER_NETDEV_LINK, &trigger_data->mode)) + led_set_brightness(led_cdev, + led_cdev->blink_brightness); + else +@@ -85,8 +85,8 @@ static void set_baseline_state(struct le + /* If we are looking for RX/TX start periodically + * checking stats + */ +- if (test_bit(NETDEV_LED_TX, &trigger_data->mode) || +- test_bit(NETDEV_LED_RX, &trigger_data->mode)) ++ if (test_bit(TRIGGER_NETDEV_TX, &trigger_data->mode) || ++ test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode)) + schedule_delayed_work(&trigger_data->work, 0); + } + } +@@ -146,20 +146,16 @@ static ssize_t device_name_store(struct + static DEVICE_ATTR_RW(device_name); + + static ssize_t netdev_led_attr_show(struct device *dev, char *buf, +- enum netdev_led_attr attr) ++ enum led_trigger_netdev_modes attr) + { + struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev); + int bit; + + switch (attr) { +- case NETDEV_ATTR_LINK: +- bit = NETDEV_LED_LINK; +- break; +- case NETDEV_ATTR_TX: +- bit = NETDEV_LED_TX; +- break; +- case NETDEV_ATTR_RX: +- bit = NETDEV_LED_RX; ++ case TRIGGER_NETDEV_LINK: ++ case TRIGGER_NETDEV_TX: ++ case TRIGGER_NETDEV_RX: ++ bit = attr; + break; + default: + return -EINVAL; +@@ -169,7 +165,7 @@ static ssize_t netdev_led_attr_show(stru + } + + static ssize_t netdev_led_attr_store(struct device *dev, const char *buf, +- size_t size, enum netdev_led_attr attr) ++ size_t size, enum led_trigger_netdev_modes attr) + { + struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev); + unsigned long state; +@@ -181,14 +177,10 @@ static ssize_t netdev_led_attr_store(str + return ret; + + switch (attr) { +- case NETDEV_ATTR_LINK: +- bit = NETDEV_LED_LINK; +- break; +- case NETDEV_ATTR_TX: +- bit = NETDEV_LED_TX; +- break; +- case NETDEV_ATTR_RX: +- bit = NETDEV_LED_RX; ++ case TRIGGER_NETDEV_LINK: ++ case TRIGGER_NETDEV_TX: ++ case TRIGGER_NETDEV_RX: ++ bit = attr; + break; + default: + return -EINVAL; +@@ -360,21 +352,21 @@ static void netdev_trig_work(struct work + } + + /* If we are not looking for RX/TX then return */ +- if (!test_bit(NETDEV_LED_TX, &trigger_data->mode) && +- !test_bit(NETDEV_LED_RX, &trigger_data->mode)) ++ if (!test_bit(TRIGGER_NETDEV_TX, &trigger_data->mode) && ++ !test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode)) + return; + + dev_stats = dev_get_stats(trigger_data->net_dev, &temp); + new_activity = +- (test_bit(NETDEV_LED_TX, &trigger_data->mode) ? ++ (test_bit(TRIGGER_NETDEV_TX, &trigger_data->mode) ? + dev_stats->tx_packets : 0) + +- (test_bit(NETDEV_LED_RX, &trigger_data->mode) ? ++ (test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode) ? + dev_stats->rx_packets : 0); + + if (trigger_data->last_activity != new_activity) { + led_stop_software_blink(trigger_data->led_cdev); + +- invert = test_bit(NETDEV_LED_LINK, &trigger_data->mode); ++ invert = test_bit(TRIGGER_NETDEV_LINK, &trigger_data->mode); + interval = jiffies_to_msecs( + atomic_read(&trigger_data->interval)); + /* base state is ON (link present) */ diff --git a/target/linux/generic/backport-5.15/817-v6.5-04-leds-trigger-netdev-Convert-device-attr-to-macro.patch b/target/linux/generic/backport-5.15/817-v6.5-04-leds-trigger-netdev-Convert-device-attr-to-macro.patch new file mode 100644 index 0000000000..3b45951f57 --- /dev/null +++ b/target/linux/generic/backport-5.15/817-v6.5-04-leds-trigger-netdev-Convert-device-attr-to-macro.patch @@ -0,0 +1,82 @@ +From 164b67d53476a9d114be85c885bd31f783835be4 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 19 Apr 2023 23:07:42 +0200 +Subject: [PATCH 4/5] leds: trigger: netdev: Convert device attr to macro + +Convert link tx and rx device attr to a common macro to reduce common +code and in preparation for additional attr. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: Lee Jones +Link: https://lore.kernel.org/r/20230419210743.3594-5-ansuelsmth@gmail.com +--- + drivers/leds/trigger/ledtrig-netdev.c | 57 ++++++++------------------- + 1 file changed, 16 insertions(+), 41 deletions(-) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -198,47 +198,22 @@ static ssize_t netdev_led_attr_store(str + return size; + } + +-static ssize_t link_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- return netdev_led_attr_show(dev, buf, NETDEV_ATTR_LINK); +-} +- +-static ssize_t link_store(struct device *dev, +- struct device_attribute *attr, const char *buf, size_t size) +-{ +- return netdev_led_attr_store(dev, buf, size, NETDEV_ATTR_LINK); +-} +- +-static DEVICE_ATTR_RW(link); +- +-static ssize_t tx_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- return netdev_led_attr_show(dev, buf, NETDEV_ATTR_TX); +-} +- +-static ssize_t tx_store(struct device *dev, +- struct device_attribute *attr, const char *buf, size_t size) +-{ +- return netdev_led_attr_store(dev, buf, size, NETDEV_ATTR_TX); +-} +- +-static DEVICE_ATTR_RW(tx); +- +-static ssize_t rx_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- return netdev_led_attr_show(dev, buf, NETDEV_ATTR_RX); +-} +- +-static ssize_t rx_store(struct device *dev, +- struct device_attribute *attr, const char *buf, size_t size) +-{ +- return netdev_led_attr_store(dev, buf, size, NETDEV_ATTR_RX); +-} +- +-static DEVICE_ATTR_RW(rx); ++#define DEFINE_NETDEV_TRIGGER(trigger_name, trigger) \ ++ static ssize_t trigger_name##_show(struct device *dev, \ ++ struct device_attribute *attr, char *buf) \ ++ { \ ++ return netdev_led_attr_show(dev, buf, trigger); \ ++ } \ ++ static ssize_t trigger_name##_store(struct device *dev, \ ++ struct device_attribute *attr, const char *buf, size_t size) \ ++ { \ ++ return netdev_led_attr_store(dev, buf, size, trigger); \ ++ } \ ++ static DEVICE_ATTR_RW(trigger_name) ++ ++DEFINE_NETDEV_TRIGGER(link, TRIGGER_NETDEV_LINK); ++DEFINE_NETDEV_TRIGGER(tx, TRIGGER_NETDEV_TX); ++DEFINE_NETDEV_TRIGGER(rx, TRIGGER_NETDEV_RX); + + static ssize_t interval_show(struct device *dev, + struct device_attribute *attr, char *buf) diff --git a/target/linux/generic/backport-5.15/817-v6.5-05-leds-trigger-netdev-Use-mutex-instead-of-spinlocks.patch b/target/linux/generic/backport-5.15/817-v6.5-05-leds-trigger-netdev-Use-mutex-instead-of-spinlocks.patch new file mode 100644 index 0000000000..180bee9612 --- /dev/null +++ b/target/linux/generic/backport-5.15/817-v6.5-05-leds-trigger-netdev-Use-mutex-instead-of-spinlocks.patch @@ -0,0 +1,106 @@ +From d1b9e1391ab2dc80e9db87fe8b2de015c651e4c9 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Wed, 19 Apr 2023 23:07:43 +0200 +Subject: [PATCH 5/5] leds: trigger: netdev: Use mutex instead of spinlocks + +Some LEDs may require to sleep while doing some operation like setting +brightness and other cleanup. + +For this reason, using a spinlock will cause a sleep under spinlock +warning. + +It should be safe to convert this to a sleepable lock since: +- sysfs read/write can sleep +- netdev_trig_work is a work queue and can sleep +- netdev _trig_notify can sleep + +The spinlock was used when brightness didn't support sleeping, but this +changed and now it supported with brightness_set_blocking(). + +Convert to mutex lock to permit sleeping using brightness_set_blocking(). + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: Lee Jones +Link: https://lore.kernel.org/r/20230419210743.3594-6-ansuelsmth@gmail.com +--- + drivers/leds/trigger/ledtrig-netdev.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -20,7 +20,7 @@ + #include + #include + #include +-#include ++#include + #include + #include "../leds.h" + +@@ -37,7 +37,7 @@ + */ + + struct led_netdev_data { +- spinlock_t lock; ++ struct mutex lock; + + struct delayed_work work; + struct notifier_block notifier; +@@ -97,9 +97,9 @@ static ssize_t device_name_show(struct d + struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev); + ssize_t len; + +- spin_lock_bh(&trigger_data->lock); ++ mutex_lock(&trigger_data->lock); + len = sprintf(buf, "%s\n", trigger_data->device_name); +- spin_unlock_bh(&trigger_data->lock); ++ mutex_unlock(&trigger_data->lock); + + return len; + } +@@ -115,7 +115,7 @@ static ssize_t device_name_store(struct + + cancel_delayed_work_sync(&trigger_data->work); + +- spin_lock_bh(&trigger_data->lock); ++ mutex_lock(&trigger_data->lock); + + if (trigger_data->net_dev) { + dev_put(trigger_data->net_dev); +@@ -138,7 +138,7 @@ static ssize_t device_name_store(struct + trigger_data->last_activity = 0; + + set_baseline_state(trigger_data); +- spin_unlock_bh(&trigger_data->lock); ++ mutex_unlock(&trigger_data->lock); + + return size; + } +@@ -279,7 +279,7 @@ static int netdev_trig_notify(struct not + + cancel_delayed_work_sync(&trigger_data->work); + +- spin_lock_bh(&trigger_data->lock); ++ mutex_lock(&trigger_data->lock); + + trigger_data->carrier_link_up = false; + switch (evt) { +@@ -304,7 +304,7 @@ static int netdev_trig_notify(struct not + + set_baseline_state(trigger_data); + +- spin_unlock_bh(&trigger_data->lock); ++ mutex_unlock(&trigger_data->lock); + + return NOTIFY_DONE; + } +@@ -365,7 +365,7 @@ static int netdev_trig_activate(struct l + if (!trigger_data) + return -ENOMEM; + +- spin_lock_init(&trigger_data->lock); ++ mutex_init(&trigger_data->lock); + + trigger_data->notifier.notifier_call = netdev_trig_notify; + trigger_data->notifier.priority = 10; diff --git a/target/linux/generic/backport-5.15/818-v6.5-01-leds-add-APIs-for-LEDs-hw-control.patch b/target/linux/generic/backport-5.15/818-v6.5-01-leds-add-APIs-for-LEDs-hw-control.patch new file mode 100644 index 0000000000..ac18611733 --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-01-leds-add-APIs-for-LEDs-hw-control.patch @@ -0,0 +1,74 @@ +From ed554d3f945179c5b159bddfad7be34b403fe11a Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 29 May 2023 18:32:31 +0200 +Subject: [PATCH 01/13] leds: add APIs for LEDs hw control + +Add an option to permit LED driver to declare support for a specific +trigger to use hw control and setup the LED to blink based on specific +provided modes. + +Add APIs for LEDs hw control. These functions will be used to activate +hardware control where a LED will use the provided flags, from an +unique defined supported trigger, to setup the LED to be driven by +hardware. + +Add hw_control_is_supported() to ask the LED driver if the requested +mode by the trigger are supported and the LED can be setup to follow +the requested modes. + +Deactivate hardware blink control by setting brightness to LED_OFF via +the brightness_set() callback. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + include/linux/leds.h | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +--- a/include/linux/leds.h ++++ b/include/linux/leds.h +@@ -164,6 +164,43 @@ struct led_classdev { + + /* LEDs that have private triggers have this set */ + struct led_hw_trigger_type *trigger_type; ++ ++ /* Unique trigger name supported by LED set in hw control mode */ ++ const char *hw_control_trigger; ++ /* ++ * Check if the LED driver supports the requested mode provided by the ++ * defined supported trigger to setup the LED to hw control mode. ++ * ++ * Return 0 on success. Return -EOPNOTSUPP when the passed flags are not ++ * supported and software fallback needs to be used. ++ * Return a negative error number on any other case for check fail due ++ * to various reason like device not ready or timeouts. ++ */ ++ int (*hw_control_is_supported)(struct led_classdev *led_cdev, ++ unsigned long flags); ++ /* ++ * Activate hardware control, LED driver will use the provided flags ++ * from the supported trigger and setup the LED to be driven by hardware ++ * following the requested mode from the trigger flags. ++ * Deactivate hardware blink control by setting brightness to LED_OFF via ++ * the brightness_set() callback. ++ * ++ * Return 0 on success, a negative error number on flags apply fail. ++ */ ++ int (*hw_control_set)(struct led_classdev *led_cdev, ++ unsigned long flags); ++ /* ++ * Get from the LED driver the current mode that the LED is set in hw ++ * control mode and put them in flags. ++ * Trigger can use this to get the initial state of a LED already set in ++ * hardware blink control. ++ * ++ * Return 0 on success, a negative error number on failing parsing the ++ * initial mode. Error from this function is NOT FATAL as the device ++ * may be in a not supported initial state by the attached LED trigger. ++ */ ++ int (*hw_control_get)(struct led_classdev *led_cdev, ++ unsigned long *flags); + #endif + + #ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED diff --git a/target/linux/generic/backport-5.15/818-v6.5-02-leds-add-API-to-get-attached-device-for-LED-hw-contr.patch b/target/linux/generic/backport-5.15/818-v6.5-02-leds-add-API-to-get-attached-device-for-LED-hw-contr.patch new file mode 100644 index 0000000000..1a221727a0 --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-02-leds-add-API-to-get-attached-device-for-LED-hw-contr.patch @@ -0,0 +1,37 @@ +From 052c38eb17e866c5b4cd43924e7a5e20167b55c0 Mon Sep 17 00:00:00 2001 +From: Andrew Lunn +Date: Mon, 29 May 2023 18:32:32 +0200 +Subject: [PATCH 02/13] leds: add API to get attached device for LED hw control + +Some specific LED triggers blink the LED based on events from a device +or subsystem. +For example, an LED could be blinked to indicate a network device is +receiving packets, or a disk is reading blocks. To correctly enable and +request the hw control of the LED, the trigger has to check if the +network interface or block device configured via a /sys/class/led file +match the one the LED driver provide for hw control for. + +Provide an API call to get the device which the LED blinks for. + +Signed-off-by: Andrew Lunn +Signed-off-by: Christian Marangi +Signed-off-by: David S. Miller +--- + include/linux/leds.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/include/linux/leds.h ++++ b/include/linux/leds.h +@@ -201,6 +201,12 @@ struct led_classdev { + */ + int (*hw_control_get)(struct led_classdev *led_cdev, + unsigned long *flags); ++ /* ++ * Get the device this LED blinks in response to. ++ * e.g. for a PHY LED, it is the network device. If the LED is ++ * not yet associated to a device, return NULL. ++ */ ++ struct device *(*hw_control_get_device)(struct led_classdev *led_cdev); + #endif + + #ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED diff --git a/target/linux/generic/backport-5.15/818-v6.5-03-Documentation-leds-leds-class-Document-new-Hardware-.patch b/target/linux/generic/backport-5.15/818-v6.5-03-Documentation-leds-leds-class-Document-new-Hardware-.patch new file mode 100644 index 0000000000..af9fb7fdc3 --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-03-Documentation-leds-leds-class-Document-new-Hardware-.patch @@ -0,0 +1,113 @@ +From 8aa2fd7b66980ecd2e45e95af61cf7eafede1211 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 29 May 2023 18:32:33 +0200 +Subject: [PATCH 03/13] Documentation: leds: leds-class: Document new Hardware + driven LEDs APIs + +Document new Hardware driven LEDs APIs. + +Some LEDs can be programmed to be driven by hardware. This is not +limited to blink but also to turn off or on autonomously. +To support this feature, a LED needs to implement various additional +ops and needs to declare specific support for the supported triggers. + +Add documentation for each required value and API to make hw control +possible and implementable by both LEDs and triggers. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + Documentation/leds/leds-class.rst | 81 +++++++++++++++++++++++++++++++ + 1 file changed, 81 insertions(+) + +--- a/Documentation/leds/leds-class.rst ++++ b/Documentation/leds/leds-class.rst +@@ -169,6 +169,87 @@ Setting the brightness to zero with brig + should completely turn off the LED and cancel the previously programmed + hardware blinking function, if any. + ++Hardware driven LEDs ++==================== ++ ++Some LEDs can be programmed to be driven by hardware. This is not ++limited to blink but also to turn off or on autonomously. ++To support this feature, a LED needs to implement various additional ++ops and needs to declare specific support for the supported triggers. ++ ++With hw control we refer to the LED driven by hardware. ++ ++LED driver must define the following value to support hw control: ++ ++ - hw_control_trigger: ++ unique trigger name supported by the LED in hw control ++ mode. ++ ++LED driver must implement the following API to support hw control: ++ - hw_control_is_supported: ++ check if the flags passed by the supported trigger can ++ be parsed and activate hw control on the LED. ++ ++ Return 0 if the passed flags mask is supported and ++ can be set with hw_control_set(). ++ ++ If the passed flags mask is not supported -EOPNOTSUPP ++ must be returned, the LED trigger will use software ++ fallback in this case. ++ ++ Return a negative error in case of any other error like ++ device not ready or timeouts. ++ ++ - hw_control_set: ++ activate hw control. LED driver will use the provided ++ flags passed from the supported trigger, parse them to ++ a set of mode and setup the LED to be driven by hardware ++ following the requested modes. ++ ++ Set LED_OFF via the brightness_set to deactivate hw control. ++ ++ Return 0 on success, a negative error number on failing to ++ apply flags. ++ ++ - hw_control_get: ++ get active modes from a LED already in hw control, parse ++ them and set in flags the current active flags for the ++ supported trigger. ++ ++ Return 0 on success, a negative error number on failing ++ parsing the initial mode. ++ Error from this function is NOT FATAL as the device may ++ be in a not supported initial state by the attached LED ++ trigger. ++ ++ - hw_control_get_device: ++ return the device associated with the LED driver in ++ hw control. A trigger might use this to match the ++ returned device from this function with a configured ++ device for the trigger as the source for blinking ++ events and correctly enable hw control. ++ (example a netdev trigger configured to blink for a ++ particular dev match the returned dev from get_device ++ to set hw control) ++ ++ Returns a pointer to a struct device or NULL if nothing ++ is currently attached. ++ ++LED driver can activate additional modes by default to workaround the ++impossibility of supporting each different mode on the supported trigger. ++Examples are hardcoding the blink speed to a set interval, enable special ++feature like bypassing blink if some requirements are not met. ++ ++A trigger should first check if the hw control API are supported by the LED ++driver and check if the trigger is supported to verify if hw control is possible, ++use hw_control_is_supported to check if the flags are supported and only at ++the end use hw_control_set to activate hw control. ++ ++A trigger can use hw_control_get to check if a LED is already in hw control ++and init their flags. ++ ++When the LED is in hw control, no software blink is possible and doing so ++will effectively disable hw control. + + Known Issues + ============ diff --git a/target/linux/generic/backport-5.15/818-v6.5-04-leds-trigger-netdev-refactor-code-setting-device-nam.patch b/target/linux/generic/backport-5.15/818-v6.5-04-leds-trigger-netdev-refactor-code-setting-device-nam.patch new file mode 100644 index 0000000000..3c804c0b41 --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-04-leds-trigger-netdev-refactor-code-setting-device-nam.patch @@ -0,0 +1,69 @@ +From 28a6a2ef18ad840a390d519840c303b03040961c Mon Sep 17 00:00:00 2001 +From: Andrew Lunn +Date: Mon, 29 May 2023 18:32:34 +0200 +Subject: [PATCH 04/13] leds: trigger: netdev: refactor code setting device + name + +Move the code into a helper, ready for it to be called at +other times. No intended behaviour change. + +Signed-off-by: Andrew Lunn +Signed-off-by: Christian Marangi +Signed-off-by: David S. Miller +--- + drivers/leds/trigger/ledtrig-netdev.c | 29 ++++++++++++++++++--------- + 1 file changed, 20 insertions(+), 9 deletions(-) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -104,15 +104,9 @@ static ssize_t device_name_show(struct d + return len; + } + +-static ssize_t device_name_store(struct device *dev, +- struct device_attribute *attr, const char *buf, +- size_t size) ++static int set_device_name(struct led_netdev_data *trigger_data, ++ const char *name, size_t size) + { +- struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev); +- +- if (size >= IFNAMSIZ) +- return -EINVAL; +- + cancel_delayed_work_sync(&trigger_data->work); + + mutex_lock(&trigger_data->lock); +@@ -122,7 +116,7 @@ static ssize_t device_name_store(struct + trigger_data->net_dev = NULL; + } + +- memcpy(trigger_data->device_name, buf, size); ++ memcpy(trigger_data->device_name, name, size); + trigger_data->device_name[size] = 0; + if (size > 0 && trigger_data->device_name[size - 1] == '\n') + trigger_data->device_name[size - 1] = 0; +@@ -140,6 +134,23 @@ static ssize_t device_name_store(struct + set_baseline_state(trigger_data); + mutex_unlock(&trigger_data->lock); + ++ return 0; ++} ++ ++static ssize_t device_name_store(struct device *dev, ++ struct device_attribute *attr, const char *buf, ++ size_t size) ++{ ++ struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev); ++ int ret; ++ ++ if (size >= IFNAMSIZ) ++ return -EINVAL; ++ ++ ret = set_device_name(trigger_data, buf, size); ++ ++ if (ret < 0) ++ return ret; + return size; + } + diff --git a/target/linux/generic/backport-5.15/818-v6.5-05-leds-trigger-netdev-introduce-check-for-possible-hw-.patch b/target/linux/generic/backport-5.15/818-v6.5-05-leds-trigger-netdev-introduce-check-for-possible-hw-.patch new file mode 100644 index 0000000000..284b519482 --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-05-leds-trigger-netdev-introduce-check-for-possible-hw-.patch @@ -0,0 +1,54 @@ +From 4fd1b6d47a7a38e81fdc6f8be2ccd4216b3f93db Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 29 May 2023 18:32:35 +0200 +Subject: [PATCH 05/13] leds: trigger: netdev: introduce check for possible hw + control + +Introduce function to check if the requested mode can use hw control in +preparation for hw control support. Currently everything is handled in +software so can_hw_control will always return false. + +Add knob with the new value hw_control in trigger_data struct to +set hw control possible. Useful for future implementation to implement +in set_baseline_state() the required function to set the requested mode +using LEDs hw control ops and in other function to reject set if hw +control is currently active. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/leds/trigger/ledtrig-netdev.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -51,6 +51,7 @@ struct led_netdev_data { + + unsigned long mode; + bool carrier_link_up; ++ bool hw_control; + }; + + enum led_trigger_netdev_modes { +@@ -91,6 +92,11 @@ static void set_baseline_state(struct le + } + } + ++static bool can_hw_control(struct led_netdev_data *trigger_data) ++{ ++ return false; ++} ++ + static ssize_t device_name_show(struct device *dev, + struct device_attribute *attr, char *buf) + { +@@ -204,6 +210,8 @@ static ssize_t netdev_led_attr_store(str + else + clear_bit(bit, &trigger_data->mode); + ++ trigger_data->hw_control = can_hw_control(trigger_data); ++ + set_baseline_state(trigger_data); + + return size; diff --git a/target/linux/generic/backport-5.15/818-v6.5-06-leds-trigger-netdev-add-basic-check-for-hw-control-s.patch b/target/linux/generic/backport-5.15/818-v6.5-06-leds-trigger-netdev-add-basic-check-for-hw-control-s.patch new file mode 100644 index 0000000000..09759bc623 --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-06-leds-trigger-netdev-add-basic-check-for-hw-control-s.patch @@ -0,0 +1,42 @@ +From 6352f25f9fadba59d5df2ba7139495759ccc81d5 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 29 May 2023 18:32:36 +0200 +Subject: [PATCH 06/13] leds: trigger: netdev: add basic check for hw control + support + +Add basic check for hw control support. Check if the required API are +defined and check if the defined trigger supported in hw control for the +LED driver match netdev. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/leds/trigger/ledtrig-netdev.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -92,8 +92,22 @@ static void set_baseline_state(struct le + } + } + ++static bool supports_hw_control(struct led_classdev *led_cdev) ++{ ++ if (!led_cdev->hw_control_get || !led_cdev->hw_control_set || ++ !led_cdev->hw_control_is_supported) ++ return false; ++ ++ return !strcmp(led_cdev->hw_control_trigger, led_cdev->trigger->name); ++} ++ + static bool can_hw_control(struct led_netdev_data *trigger_data) + { ++ struct led_classdev *led_cdev = trigger_data->led_cdev; ++ ++ if (!supports_hw_control(led_cdev)) ++ return false; ++ + return false; + } + diff --git a/target/linux/generic/backport-5.15/818-v6.5-07-leds-trigger-netdev-reject-interval-store-for-hw_con.patch b/target/linux/generic/backport-5.15/818-v6.5-07-leds-trigger-netdev-reject-interval-store-for-hw_con.patch new file mode 100644 index 0000000000..6634906800 --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-07-leds-trigger-netdev-reject-interval-store-for-hw_con.patch @@ -0,0 +1,28 @@ +From c84c80c7388f887b10dafd70fc55bc6c5fe9fa5a Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 29 May 2023 18:32:37 +0200 +Subject: [PATCH 07/13] leds: trigger: netdev: reject interval store for + hw_control + +Reject interval store with hw_control enabled. It's are currently not +supported and MUST be set to the default value with hw control enabled. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/leds/trigger/ledtrig-netdev.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -265,6 +265,9 @@ static ssize_t interval_store(struct dev + unsigned long value; + int ret; + ++ if (trigger_data->hw_control) ++ return -EINVAL; ++ + ret = kstrtoul(buf, 0, &value); + if (ret) + return ret; diff --git a/target/linux/generic/backport-5.15/818-v6.5-08-leds-trigger-netdev-add-support-for-LED-hw-control.patch b/target/linux/generic/backport-5.15/818-v6.5-08-leds-trigger-netdev-add-support-for-LED-hw-control.patch new file mode 100644 index 0000000000..52faa4809b --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-08-leds-trigger-netdev-add-support-for-LED-hw-control.patch @@ -0,0 +1,107 @@ +From 7c145a34ba6e380616af93262fcab9fc7261d851 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 29 May 2023 18:32:38 +0200 +Subject: [PATCH 08/13] leds: trigger: netdev: add support for LED hw control + +Add support for LED hw control for the netdev trigger. + +The trigger on calling set_baseline_state to configure a new mode, will +do various check to verify if hw control can be used for the requested +mode in can_hw_control() function. + +It will first check if the LED driver supports hw control for the netdev +trigger, then will use hw_control_is_supported() and finally will call +hw_control_set() to apply the requested mode. + +To use such mode, interval MUST be set to the default value and net_dev +MUST be set. If one of these 2 value are not valid, hw control will +never be used and normal software fallback is used. + +The default interval value is moved to a define to make sure they are +always synced. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/leds/trigger/ledtrig-netdev.c | 43 +++++++++++++++++++++++++-- + 1 file changed, 41 insertions(+), 2 deletions(-) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -24,6 +24,8 @@ + #include + #include "../leds.h" + ++#define NETDEV_LED_DEFAULT_INTERVAL 50 ++ + /* + * Configurable sysfs attributes: + * +@@ -68,6 +70,13 @@ static void set_baseline_state(struct le + int current_brightness; + struct led_classdev *led_cdev = trigger_data->led_cdev; + ++ /* Already validated, hw control is possible with the requested mode */ ++ if (trigger_data->hw_control) { ++ led_cdev->hw_control_set(led_cdev, trigger_data->mode); ++ ++ return; ++ } ++ + current_brightness = led_cdev->brightness; + if (current_brightness) + led_cdev->blink_brightness = current_brightness; +@@ -103,12 +112,42 @@ static bool supports_hw_control(struct l + + static bool can_hw_control(struct led_netdev_data *trigger_data) + { ++ unsigned long default_interval = msecs_to_jiffies(NETDEV_LED_DEFAULT_INTERVAL); ++ unsigned int interval = atomic_read(&trigger_data->interval); + struct led_classdev *led_cdev = trigger_data->led_cdev; ++ int ret; + + if (!supports_hw_control(led_cdev)) + return false; + +- return false; ++ /* ++ * Interval must be set to the default ++ * value. Any different value is rejected if in hw ++ * control. ++ */ ++ if (interval != default_interval) ++ return false; ++ ++ /* ++ * net_dev must be set with hw control, otherwise no ++ * blinking can be happening and there is nothing to ++ * offloaded. ++ */ ++ if (!trigger_data->net_dev) ++ return false; ++ ++ /* Check if the requested mode is supported */ ++ ret = led_cdev->hw_control_is_supported(led_cdev, trigger_data->mode); ++ /* Fall back to software blinking if not supported */ ++ if (ret == -EOPNOTSUPP) ++ return false; ++ if (ret) { ++ dev_warn(led_cdev->dev, ++ "Current mode check failed with error %d\n", ret); ++ return false; ++ } ++ ++ return true; + } + + static ssize_t device_name_show(struct device *dev, +@@ -413,7 +452,7 @@ static int netdev_trig_activate(struct l + trigger_data->device_name[0] = 0; + + trigger_data->mode = 0; +- atomic_set(&trigger_data->interval, msecs_to_jiffies(50)); ++ atomic_set(&trigger_data->interval, msecs_to_jiffies(NETDEV_LED_DEFAULT_INTERVAL)); + trigger_data->last_activity = 0; + + led_set_trigger_data(led_cdev, trigger_data); diff --git a/target/linux/generic/backport-5.15/818-v6.5-09-leds-trigger-netdev-validate-configured-netdev.patch b/target/linux/generic/backport-5.15/818-v6.5-09-leds-trigger-netdev-validate-configured-netdev.patch new file mode 100644 index 0000000000..c129ffa4f5 --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-09-leds-trigger-netdev-validate-configured-netdev.patch @@ -0,0 +1,58 @@ +From 33ec0b53befff2c0a7f3aa19ff08556d60585d6b Mon Sep 17 00:00:00 2001 +From: Andrew Lunn +Date: Mon, 29 May 2023 18:32:39 +0200 +Subject: [PATCH 09/13] leds: trigger: netdev: validate configured netdev + +The netdev which the LED should blink for is configurable in +/sys/class/led/foo/device_name. Ensure when offloading that the +configured netdev is the same as the netdev the LED is associated +with. If it is not, only perform software blinking. + +Signed-off-by: Andrew Lunn +Signed-off-by: Christian Marangi +Signed-off-by: David S. Miller +--- + drivers/leds/trigger/ledtrig-netdev.c | 24 ++++++++++++++++++++++-- + 1 file changed, 22 insertions(+), 2 deletions(-) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -110,6 +110,24 @@ static bool supports_hw_control(struct l + return !strcmp(led_cdev->hw_control_trigger, led_cdev->trigger->name); + } + ++/* ++ * Validate the configured netdev is the same as the one associated with ++ * the LED driver in hw control. ++ */ ++static bool validate_net_dev(struct led_classdev *led_cdev, ++ struct net_device *net_dev) ++{ ++ struct device *dev = led_cdev->hw_control_get_device(led_cdev); ++ struct net_device *ndev; ++ ++ if (!dev) ++ return false; ++ ++ ndev = to_net_dev(dev); ++ ++ return ndev == net_dev; ++} ++ + static bool can_hw_control(struct led_netdev_data *trigger_data) + { + unsigned long default_interval = msecs_to_jiffies(NETDEV_LED_DEFAULT_INTERVAL); +@@ -131,9 +149,11 @@ static bool can_hw_control(struct led_ne + /* + * net_dev must be set with hw control, otherwise no + * blinking can be happening and there is nothing to +- * offloaded. ++ * offloaded. Additionally, for hw control to be ++ * valid, the configured netdev must be the same as ++ * netdev associated to the LED. + */ +- if (!trigger_data->net_dev) ++ if (!validate_net_dev(led_cdev, trigger_data->net_dev)) + return false; + + /* Check if the requested mode is supported */ diff --git a/target/linux/generic/backport-5.15/818-v6.5-10-leds-trigger-netdev-init-mode-if-hw-control-already-.patch b/target/linux/generic/backport-5.15/818-v6.5-10-leds-trigger-netdev-init-mode-if-hw-control-already-.patch new file mode 100644 index 0000000000..e20594c99a --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-10-leds-trigger-netdev-init-mode-if-hw-control-already-.patch @@ -0,0 +1,53 @@ +From 0316cc5629d15880dd3f097d221c55ca648bcd61 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 29 May 2023 18:32:40 +0200 +Subject: [PATCH 10/13] leds: trigger: netdev: init mode if hw control already + active + +On netdev trigger activation, hw control may be already active by +default. If this is the case and a device is actually provided by +hw_control_get_device(), init the already active mode and set the +bool to hw_control bool to true to reflect the already set mode in the +trigger_data. + +Co-developed-by: Andrew Lunn +Signed-off-by: Andrew Lunn +Signed-off-by: Christian Marangi +Signed-off-by: David S. Miller +--- + drivers/leds/trigger/ledtrig-netdev.c | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -454,6 +454,8 @@ static void netdev_trig_work(struct work + static int netdev_trig_activate(struct led_classdev *led_cdev) + { + struct led_netdev_data *trigger_data; ++ unsigned long mode; ++ struct device *dev; + int rc; + + trigger_data = kzalloc(sizeof(struct led_netdev_data), GFP_KERNEL); +@@ -475,6 +477,21 @@ static int netdev_trig_activate(struct l + atomic_set(&trigger_data->interval, msecs_to_jiffies(NETDEV_LED_DEFAULT_INTERVAL)); + trigger_data->last_activity = 0; + ++ /* Check if hw control is active by default on the LED. ++ * Init already enabled mode in hw control. ++ */ ++ if (supports_hw_control(led_cdev) && ++ !led_cdev->hw_control_get(led_cdev, &mode)) { ++ dev = led_cdev->hw_control_get_device(led_cdev); ++ if (dev) { ++ const char *name = dev_name(dev); ++ ++ set_device_name(trigger_data, name, strlen(name)); ++ trigger_data->hw_control = true; ++ trigger_data->mode = mode; ++ } ++ } ++ + led_set_trigger_data(led_cdev, trigger_data); + + rc = register_netdevice_notifier(&trigger_data->notifier); diff --git a/target/linux/generic/backport-5.15/818-v6.5-11-leds-trigger-netdev-expose-netdev-trigger-modes-in-l.patch b/target/linux/generic/backport-5.15/818-v6.5-11-leds-trigger-netdev-expose-netdev-trigger-modes-in-l.patch new file mode 100644 index 0000000000..70aed850d1 --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-11-leds-trigger-netdev-expose-netdev-trigger-modes-in-l.patch @@ -0,0 +1,54 @@ +From 947acacab5ea151291b861cdfbde16ff5cf1b08c Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 29 May 2023 18:32:41 +0200 +Subject: [PATCH 11/13] leds: trigger: netdev: expose netdev trigger modes in + linux include + +Expose netdev trigger modes to make them accessible by LED driver that +will support netdev trigger for hw control. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/leds/trigger/ledtrig-netdev.c | 9 --------- + include/linux/leds.h | 10 ++++++++++ + 2 files changed, 10 insertions(+), 9 deletions(-) + +--- a/drivers/leds/trigger/ledtrig-netdev.c ++++ b/drivers/leds/trigger/ledtrig-netdev.c +@@ -56,15 +56,6 @@ struct led_netdev_data { + bool hw_control; + }; + +-enum led_trigger_netdev_modes { +- TRIGGER_NETDEV_LINK = 0, +- TRIGGER_NETDEV_TX, +- TRIGGER_NETDEV_RX, +- +- /* Keep last */ +- __TRIGGER_NETDEV_MAX, +-}; +- + static void set_baseline_state(struct led_netdev_data *trigger_data) + { + int current_brightness; +--- a/include/linux/leds.h ++++ b/include/linux/leds.h +@@ -527,6 +527,16 @@ static inline void *led_get_trigger_data + + #endif /* CONFIG_LEDS_TRIGGERS */ + ++/* Trigger specific enum */ ++enum led_trigger_netdev_modes { ++ TRIGGER_NETDEV_LINK = 0, ++ TRIGGER_NETDEV_TX, ++ TRIGGER_NETDEV_RX, ++ ++ /* Keep last */ ++ __TRIGGER_NETDEV_MAX, ++}; ++ + /* Trigger specific functions */ + #ifdef CONFIG_LEDS_TRIGGER_DISK + void ledtrig_disk_activity(bool write); diff --git a/target/linux/generic/backport-5.15/818-v6.5-12-net-dsa-qca8k-implement-hw_control-ops.patch b/target/linux/generic/backport-5.15/818-v6.5-12-net-dsa-qca8k-implement-hw_control-ops.patch new file mode 100644 index 0000000000..ad76d89b7b --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-12-net-dsa-qca8k-implement-hw_control-ops.patch @@ -0,0 +1,200 @@ +From e0256648c831af13cbfe4a1787327fcec01c2807 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Mon, 29 May 2023 18:32:42 +0200 +Subject: [PATCH 12/13] net: dsa: qca8k: implement hw_control ops + +Implement hw_control ops to drive Switch LEDs based on hardware events. + +Netdev trigger is the declared supported trigger for hw control +operation and supports the following mode: +- tx +- rx + +When hw_control_set is called, LEDs are set to follow the requested +mode. +Each LEDs will blink at 4Hz by default. + +Signed-off-by: Christian Marangi +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca/qca8k-leds.c | 154 +++++++++++++++++++++++++++++++ + 1 file changed, 154 insertions(+) + +--- a/drivers/net/dsa/qca/qca8k-leds.c ++++ b/drivers/net/dsa/qca/qca8k-leds.c +@@ -32,6 +32,43 @@ qca8k_get_enable_led_reg(int port_num, i + } + + static int ++qca8k_get_control_led_reg(int port_num, int led_num, struct qca8k_led_pattern_en *reg_info) ++{ ++ reg_info->reg = QCA8K_LED_CTRL_REG(led_num); ++ ++ /* 6 total control rule: ++ * 3 control rules for phy0-3 that applies to all their leds ++ * 3 control rules for phy4 ++ */ ++ if (port_num == 4) ++ reg_info->shift = QCA8K_LED_PHY4_CONTROL_RULE_SHIFT; ++ else ++ reg_info->shift = QCA8K_LED_PHY0123_CONTROL_RULE_SHIFT; ++ ++ return 0; ++} ++ ++static int ++qca8k_parse_netdev(unsigned long rules, u32 *offload_trigger) ++{ ++ /* Parsing specific to netdev trigger */ ++ if (test_bit(TRIGGER_NETDEV_TX, &rules)) ++ *offload_trigger |= QCA8K_LED_TX_BLINK_MASK; ++ if (test_bit(TRIGGER_NETDEV_RX, &rules)) ++ *offload_trigger |= QCA8K_LED_RX_BLINK_MASK; ++ ++ if (rules && !*offload_trigger) ++ return -EOPNOTSUPP; ++ ++ /* Enable some default rule by default to the requested mode: ++ * - Blink at 4Hz by default ++ */ ++ *offload_trigger |= QCA8K_LED_BLINK_4HZ; ++ ++ return 0; ++} ++ ++static int + qca8k_led_brightness_set(struct qca8k_led *led, + enum led_brightness brightness) + { +@@ -165,6 +202,119 @@ qca8k_cled_blink_set(struct led_classdev + } + + static int ++qca8k_cled_trigger_offload(struct led_classdev *ldev, bool enable) ++{ ++ struct qca8k_led *led = container_of(ldev, struct qca8k_led, cdev); ++ ++ struct qca8k_led_pattern_en reg_info; ++ struct qca8k_priv *priv = led->priv; ++ u32 mask, val = QCA8K_LED_ALWAYS_OFF; ++ ++ qca8k_get_enable_led_reg(led->port_num, led->led_num, ®_info); ++ ++ if (enable) ++ val = QCA8K_LED_RULE_CONTROLLED; ++ ++ if (led->port_num == 0 || led->port_num == 4) { ++ mask = QCA8K_LED_PATTERN_EN_MASK; ++ val <<= QCA8K_LED_PATTERN_EN_SHIFT; ++ } else { ++ mask = QCA8K_LED_PHY123_PATTERN_EN_MASK; ++ } ++ ++ return regmap_update_bits(priv->regmap, reg_info.reg, mask << reg_info.shift, ++ val << reg_info.shift); ++} ++ ++static bool ++qca8k_cled_hw_control_status(struct led_classdev *ldev) ++{ ++ struct qca8k_led *led = container_of(ldev, struct qca8k_led, cdev); ++ ++ struct qca8k_led_pattern_en reg_info; ++ struct qca8k_priv *priv = led->priv; ++ u32 val; ++ ++ qca8k_get_enable_led_reg(led->port_num, led->led_num, ®_info); ++ ++ regmap_read(priv->regmap, reg_info.reg, &val); ++ ++ val >>= reg_info.shift; ++ ++ if (led->port_num == 0 || led->port_num == 4) { ++ val &= QCA8K_LED_PATTERN_EN_MASK; ++ val >>= QCA8K_LED_PATTERN_EN_SHIFT; ++ } else { ++ val &= QCA8K_LED_PHY123_PATTERN_EN_MASK; ++ } ++ ++ return val == QCA8K_LED_RULE_CONTROLLED; ++} ++ ++static int ++qca8k_cled_hw_control_is_supported(struct led_classdev *ldev, unsigned long rules) ++{ ++ u32 offload_trigger = 0; ++ ++ return qca8k_parse_netdev(rules, &offload_trigger); ++} ++ ++static int ++qca8k_cled_hw_control_set(struct led_classdev *ldev, unsigned long rules) ++{ ++ struct qca8k_led *led = container_of(ldev, struct qca8k_led, cdev); ++ struct qca8k_led_pattern_en reg_info; ++ struct qca8k_priv *priv = led->priv; ++ u32 offload_trigger = 0; ++ int ret; ++ ++ ret = qca8k_parse_netdev(rules, &offload_trigger); ++ if (ret) ++ return ret; ++ ++ ret = qca8k_cled_trigger_offload(ldev, true); ++ if (ret) ++ return ret; ++ ++ qca8k_get_control_led_reg(led->port_num, led->led_num, ®_info); ++ ++ return regmap_update_bits(priv->regmap, reg_info.reg, ++ QCA8K_LED_RULE_MASK << reg_info.shift, ++ offload_trigger << reg_info.shift); ++} ++ ++static int ++qca8k_cled_hw_control_get(struct led_classdev *ldev, unsigned long *rules) ++{ ++ struct qca8k_led *led = container_of(ldev, struct qca8k_led, cdev); ++ struct qca8k_led_pattern_en reg_info; ++ struct qca8k_priv *priv = led->priv; ++ u32 val; ++ int ret; ++ ++ /* With hw control not active return err */ ++ if (!qca8k_cled_hw_control_status(ldev)) ++ return -EINVAL; ++ ++ qca8k_get_control_led_reg(led->port_num, led->led_num, ®_info); ++ ++ ret = regmap_read(priv->regmap, reg_info.reg, &val); ++ if (ret) ++ return ret; ++ ++ val >>= reg_info.shift; ++ val &= QCA8K_LED_RULE_MASK; ++ ++ /* Parsing specific to netdev trigger */ ++ if (val & QCA8K_LED_TX_BLINK_MASK) ++ set_bit(TRIGGER_NETDEV_TX, rules); ++ if (val & QCA8K_LED_RX_BLINK_MASK) ++ set_bit(TRIGGER_NETDEV_RX, rules); ++ ++ return 0; ++} ++ ++static int + qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int port_num) + { + struct fwnode_handle *led = NULL, *leds = NULL; +@@ -224,6 +374,10 @@ qca8k_parse_port_leds(struct qca8k_priv + port_led->cdev.max_brightness = 1; + port_led->cdev.brightness_set_blocking = qca8k_cled_brightness_set_blocking; + port_led->cdev.blink_set = qca8k_cled_blink_set; ++ port_led->cdev.hw_control_is_supported = qca8k_cled_hw_control_is_supported; ++ port_led->cdev.hw_control_set = qca8k_cled_hw_control_set; ++ port_led->cdev.hw_control_get = qca8k_cled_hw_control_get; ++ port_led->cdev.hw_control_trigger = "netdev"; + init_data.default_label = ":port"; + init_data.fwnode = led; + init_data.devname_mandatory = true; diff --git a/target/linux/generic/backport-5.15/818-v6.5-13-net-dsa-qca8k-add-op-to-get-ports-netdev.patch b/target/linux/generic/backport-5.15/818-v6.5-13-net-dsa-qca8k-add-op-to-get-ports-netdev.patch new file mode 100644 index 0000000000..feb6b9e1e4 --- /dev/null +++ b/target/linux/generic/backport-5.15/818-v6.5-13-net-dsa-qca8k-add-op-to-get-ports-netdev.patch @@ -0,0 +1,70 @@ +From 4f53c27f772e27e4cf4e5507d6f4d5980002cb6a Mon Sep 17 00:00:00 2001 +From: Andrew Lunn +Date: Mon, 29 May 2023 18:32:43 +0200 +Subject: [PATCH 13/13] net: dsa: qca8k: add op to get ports netdev + +In order that the LED trigger can blink the switch MAC ports LED, it +needs to know the netdev associated to the port. Add the callback to +return the struct device of the netdev. + +Add an helper function qca8k_phy_to_port() to convert the phy back to +dsa_port index, as we reference LED port based on the internal PHY +index and needs to be converted back. + +Signed-off-by: Andrew Lunn +Signed-off-by: Christian Marangi +Signed-off-by: David S. Miller +--- + drivers/net/dsa/qca/qca8k-leds.c | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +--- a/drivers/net/dsa/qca/qca8k-leds.c ++++ b/drivers/net/dsa/qca/qca8k-leds.c +@@ -5,6 +5,18 @@ + #include "qca8k.h" + #include "qca8k_leds.h" + ++static u32 qca8k_phy_to_port(int phy) ++{ ++ /* Internal PHY 0 has port at index 1. ++ * Internal PHY 1 has port at index 2. ++ * Internal PHY 2 has port at index 3. ++ * Internal PHY 3 has port at index 4. ++ * Internal PHY 4 has port at index 5. ++ */ ++ ++ return phy + 1; ++} ++ + static int + qca8k_get_enable_led_reg(int port_num, int led_num, struct qca8k_led_pattern_en *reg_info) + { +@@ -314,6 +326,20 @@ qca8k_cled_hw_control_get(struct led_cla + return 0; + } + ++static struct device *qca8k_cled_hw_control_get_device(struct led_classdev *ldev) ++{ ++ struct qca8k_led *led = container_of(ldev, struct qca8k_led, cdev); ++ struct qca8k_priv *priv = led->priv; ++ struct dsa_port *dp; ++ ++ dp = dsa_to_port(priv->ds, qca8k_phy_to_port(led->port_num)); ++ if (!dp) ++ return NULL; ++ if (dp->slave) ++ return &dp->slave->dev; ++ return NULL; ++} ++ + static int + qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int port_num) + { +@@ -377,6 +403,7 @@ qca8k_parse_port_leds(struct qca8k_priv + port_led->cdev.hw_control_is_supported = qca8k_cled_hw_control_is_supported; + port_led->cdev.hw_control_set = qca8k_cled_hw_control_set; + port_led->cdev.hw_control_get = qca8k_cled_hw_control_get; ++ port_led->cdev.hw_control_get_device = qca8k_cled_hw_control_get_device; + port_led->cdev.hw_control_trigger = "netdev"; + init_data.default_label = ":port"; + init_data.fwnode = led; diff --git a/target/linux/generic/backport-5.15/819-v6.6-0001-nvmem-sunxi_sid-Convert-to-devm_platform_ioremap_res.patch b/target/linux/generic/backport-5.15/819-v6.6-0001-nvmem-sunxi_sid-Convert-to-devm_platform_ioremap_res.patch new file mode 100644 index 0000000000..bf7a816bb2 --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0001-nvmem-sunxi_sid-Convert-to-devm_platform_ioremap_res.patch @@ -0,0 +1,36 @@ +From 9ccfcbeb8f32ff89e99b36cb9cdebaa0d1b44ed1 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 23 Aug 2023 14:27:24 +0100 +Subject: [PATCH] nvmem: sunxi_sid: Convert to devm_platform_ioremap_resource() + +Use devm_platform_ioremap_resource() to simplify code. + +Signed-off-by: Yangtao Li +Acked-by: Jernej Skrabec +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230823132744.350618-3-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/sunxi_sid.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/drivers/nvmem/sunxi_sid.c ++++ b/drivers/nvmem/sunxi_sid.c +@@ -125,7 +125,6 @@ static int sun8i_sid_read_by_reg(void *c + static int sunxi_sid_probe(struct platform_device *pdev) + { + struct device *dev = &pdev->dev; +- struct resource *res; + struct nvmem_config *nvmem_cfg; + struct nvmem_device *nvmem; + struct sunxi_sid *sid; +@@ -142,8 +141,7 @@ static int sunxi_sid_probe(struct platfo + return -EINVAL; + sid->value_offset = cfg->value_offset; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- sid->base = devm_ioremap_resource(dev, res); ++ sid->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(sid->base)) + return PTR_ERR(sid->base); + diff --git a/target/linux/generic/backport-5.15/819-v6.6-0002-nvmem-brcm_nvram-Use-devm_platform_get_and_ioremap_r.patch b/target/linux/generic/backport-5.15/819-v6.6-0002-nvmem-brcm_nvram-Use-devm_platform_get_and_ioremap_r.patch new file mode 100644 index 0000000000..f142d735de --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0002-nvmem-brcm_nvram-Use-devm_platform_get_and_ioremap_r.patch @@ -0,0 +1,30 @@ +From cfadd0e7d9225566f320bc4dc716682be910be6c Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 23 Aug 2023 14:27:25 +0100 +Subject: [PATCH] nvmem: brcm_nvram: Use + devm_platform_get_and_ioremap_resource() + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230823132744.350618-4-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/brcm_nvram.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/nvmem/brcm_nvram.c ++++ b/drivers/nvmem/brcm_nvram.c +@@ -159,8 +159,7 @@ static int brcm_nvram_probe(struct platf + return -ENOMEM; + priv->dev = dev; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- priv->base = devm_ioremap_resource(dev, res); ++ priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + diff --git a/target/linux/generic/backport-5.15/819-v6.6-0003-nvmem-lpc18xx_otp-Convert-to-devm_platform_ioremap_r.patch b/target/linux/generic/backport-5.15/819-v6.6-0003-nvmem-lpc18xx_otp-Convert-to-devm_platform_ioremap_r.patch new file mode 100644 index 0000000000..0395bbf8bc --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0003-nvmem-lpc18xx_otp-Convert-to-devm_platform_ioremap_r.patch @@ -0,0 +1,34 @@ +From 0b49178e2b6b4aac3c7fa3ce8d8c02208a13b988 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 23 Aug 2023 14:27:26 +0100 +Subject: [PATCH] nvmem: lpc18xx_otp: Convert to + devm_platform_ioremap_resource() + +Use devm_platform_ioremap_resource() to simplify code. + +Signed-off-by: Yangtao Li +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230823132744.350618-5-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/lpc18xx_otp.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/drivers/nvmem/lpc18xx_otp.c ++++ b/drivers/nvmem/lpc18xx_otp.c +@@ -68,14 +68,12 @@ static int lpc18xx_otp_probe(struct plat + { + struct nvmem_device *nvmem; + struct lpc18xx_otp *otp; +- struct resource *res; + + otp = devm_kzalloc(&pdev->dev, sizeof(*otp), GFP_KERNEL); + if (!otp) + return -ENOMEM; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- otp->base = devm_ioremap_resource(&pdev->dev, res); ++ otp->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(otp->base)) + return PTR_ERR(otp->base); + diff --git a/target/linux/generic/backport-5.15/819-v6.6-0004-nvmem-meson-mx-efuse-Convert-to-devm_platform_iorema.patch b/target/linux/generic/backport-5.15/819-v6.6-0004-nvmem-meson-mx-efuse-Convert-to-devm_platform_iorema.patch new file mode 100644 index 0000000000..da077eb4b7 --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0004-nvmem-meson-mx-efuse-Convert-to-devm_platform_iorema.patch @@ -0,0 +1,36 @@ +From 0a223a097709b99a0ba738d6be5b4f52c04ffb64 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 23 Aug 2023 14:27:27 +0100 +Subject: [PATCH] nvmem: meson-mx-efuse: Convert to + devm_platform_ioremap_resource() + +Use devm_platform_ioremap_resource() to simplify code. + +Signed-off-by: Yangtao Li +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230823132744.350618-6-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/meson-mx-efuse.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/drivers/nvmem/meson-mx-efuse.c ++++ b/drivers/nvmem/meson-mx-efuse.c +@@ -194,7 +194,6 @@ static int meson_mx_efuse_probe(struct p + { + const struct meson_mx_efuse_platform_data *drvdata; + struct meson_mx_efuse *efuse; +- struct resource *res; + + drvdata = of_device_get_match_data(&pdev->dev); + if (!drvdata) +@@ -204,8 +203,7 @@ static int meson_mx_efuse_probe(struct p + if (!efuse) + return -ENOMEM; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- efuse->base = devm_ioremap_resource(&pdev->dev, res); ++ efuse->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(efuse->base)) + return PTR_ERR(efuse->base); + diff --git a/target/linux/generic/backport-5.15/819-v6.6-0005-nvmem-rockchip-efuse-Use-devm_platform_get_and_iorem.patch b/target/linux/generic/backport-5.15/819-v6.6-0005-nvmem-rockchip-efuse-Use-devm_platform_get_and_iorem.patch new file mode 100644 index 0000000000..dc144ddfbd --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0005-nvmem-rockchip-efuse-Use-devm_platform_get_and_iorem.patch @@ -0,0 +1,31 @@ +From 94904db28db49ac8fbb2a273d25156db26a3a985 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 23 Aug 2023 14:27:28 +0100 +Subject: [PATCH] nvmem: rockchip-efuse: Use + devm_platform_get_and_ioremap_resource() + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Reviewed-by: Heiko Stuebner +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230823132744.350618-7-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/rockchip-efuse.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/nvmem/rockchip-efuse.c ++++ b/drivers/nvmem/rockchip-efuse.c +@@ -267,8 +267,7 @@ static int rockchip_efuse_probe(struct p + if (!efuse) + return -ENOMEM; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- efuse->base = devm_ioremap_resource(dev, res); ++ efuse->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(efuse->base)) + return PTR_ERR(efuse->base); + diff --git a/target/linux/generic/backport-5.15/819-v6.6-0006-nvmem-stm32-romem-Use-devm_platform_get_and_ioremap_.patch b/target/linux/generic/backport-5.15/819-v6.6-0006-nvmem-stm32-romem-Use-devm_platform_get_and_ioremap_.patch new file mode 100644 index 0000000000..99e20939cc --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0006-nvmem-stm32-romem-Use-devm_platform_get_and_ioremap_.patch @@ -0,0 +1,30 @@ +From 0a4a8c0d238fec1fa4b85591524ef42ad261cb97 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 23 Aug 2023 14:27:29 +0100 +Subject: [PATCH] nvmem: stm32-romem: Use + devm_platform_get_and_ioremap_resource() + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230823132744.350618-8-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/stm32-romem.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/nvmem/stm32-romem.c ++++ b/drivers/nvmem/stm32-romem.c +@@ -196,8 +196,7 @@ static int stm32_romem_probe(struct plat + if (!priv) + return -ENOMEM; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- priv->base = devm_ioremap_resource(dev, res); ++ priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + diff --git a/target/linux/generic/backport-5.15/819-v6.6-0007-nvmem-qfprom-do-some-cleanup.patch b/target/linux/generic/backport-5.15/819-v6.6-0007-nvmem-qfprom-do-some-cleanup.patch new file mode 100644 index 0000000000..6d93752e27 --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0007-nvmem-qfprom-do-some-cleanup.patch @@ -0,0 +1,59 @@ +From 0bc0d6dc2a9a05ae6729b4622f09782d9f230815 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 23 Aug 2023 14:27:30 +0100 +Subject: [PATCH] nvmem: qfprom: do some cleanup + +Use devm_platform_ioremap_resource() and +devm_platform_get_and_ioremap_resource() to simplify code. +BTW convert to use dev_err_probe() instead of open it. + +Signed-off-by: Yangtao Li +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230823132744.350618-9-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/qfprom.c | 17 +++++------------ + 1 file changed, 5 insertions(+), 12 deletions(-) + +--- a/drivers/nvmem/qfprom.c ++++ b/drivers/nvmem/qfprom.c +@@ -374,8 +374,7 @@ static int qfprom_probe(struct platform_ + return -ENOMEM; + + /* The corrected section is always provided */ +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- priv->qfpcorrected = devm_ioremap_resource(dev, res); ++ priv->qfpcorrected = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(priv->qfpcorrected)) + return PTR_ERR(priv->qfpcorrected); + +@@ -402,12 +401,10 @@ static int qfprom_probe(struct platform_ + priv->qfpraw = devm_ioremap_resource(dev, res); + if (IS_ERR(priv->qfpraw)) + return PTR_ERR(priv->qfpraw); +- res = platform_get_resource(pdev, IORESOURCE_MEM, 2); +- priv->qfpconf = devm_ioremap_resource(dev, res); ++ priv->qfpconf = devm_platform_ioremap_resource(pdev, 2); + if (IS_ERR(priv->qfpconf)) + return PTR_ERR(priv->qfpconf); +- res = platform_get_resource(pdev, IORESOURCE_MEM, 3); +- priv->qfpsecurity = devm_ioremap_resource(dev, res); ++ priv->qfpsecurity = devm_platform_ioremap_resource(pdev, 3); + if (IS_ERR(priv->qfpsecurity)) + return PTR_ERR(priv->qfpsecurity); + +@@ -427,12 +424,8 @@ static int qfprom_probe(struct platform_ + return PTR_ERR(priv->vcc); + + priv->secclk = devm_clk_get(dev, "core"); +- if (IS_ERR(priv->secclk)) { +- ret = PTR_ERR(priv->secclk); +- if (ret != -EPROBE_DEFER) +- dev_err(dev, "Error getting clock: %d\n", ret); +- return ret; +- } ++ if (IS_ERR(priv->secclk)) ++ return dev_err_probe(dev, PTR_ERR(priv->secclk), "Error getting clock\n"); + + /* Only enable writing if we have SoC data. */ + if (priv->soc_data) diff --git a/target/linux/generic/backport-5.15/819-v6.6-0008-nvmem-uniphier-Use-devm_platform_get_and_ioremap_res.patch b/target/linux/generic/backport-5.15/819-v6.6-0008-nvmem-uniphier-Use-devm_platform_get_and_ioremap_res.patch new file mode 100644 index 0000000000..3e328a4c99 --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0008-nvmem-uniphier-Use-devm_platform_get_and_ioremap_res.patch @@ -0,0 +1,29 @@ +From 6ac41c556e22a0d7d267c9b9d48681d73af4b368 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 23 Aug 2023 14:27:31 +0100 +Subject: [PATCH] nvmem: uniphier: Use devm_platform_get_and_ioremap_resource() + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230823132744.350618-10-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/uniphier-efuse.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/nvmem/uniphier-efuse.c ++++ b/drivers/nvmem/uniphier-efuse.c +@@ -41,8 +41,7 @@ static int uniphier_efuse_probe(struct p + if (!priv) + return -ENOMEM; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- priv->base = devm_ioremap_resource(dev, res); ++ priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + diff --git a/target/linux/generic/backport-5.15/819-v6.6-0009-nvmem-add-new-NXP-QorIQ-eFuse-driver.patch b/target/linux/generic/backport-5.15/819-v6.6-0009-nvmem-add-new-NXP-QorIQ-eFuse-driver.patch new file mode 100644 index 0000000000..acbe18e270 --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0009-nvmem-add-new-NXP-QorIQ-eFuse-driver.patch @@ -0,0 +1,133 @@ +From c8efcf7a86ebf2ff48584d270b3070a7075bc345 Mon Sep 17 00:00:00 2001 +From: Richard Alpe +Date: Mon, 10 Apr 2023 10:20:51 +0200 +Subject: [PATCH] nvmem: add new NXP QorIQ eFuse driver +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add SFP (Security Fuse Processor) read support for NXP (Freescale) +QorIQ series SOC's. + +This patch adds support for the T1023 SOC using the SFP offset from +the existing T1023 device tree. In theory this should also work for +T1024, T1014 and T1013 which uses the same SFP base offset. + +Signed-off-by: Richard Alpe +Reviewed-by: Niklas Söderlund +Signed-off-by: Srinivas Kandagatla +--- + drivers/nvmem/Kconfig | 12 ++++++ + drivers/nvmem/Makefile | 2 + + drivers/nvmem/qoriq-efuse.c | 78 +++++++++++++++++++++++++++++++++++++ + 3 files changed, 92 insertions(+) + create mode 100644 drivers/nvmem/qoriq-efuse.c + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -392,4 +392,16 @@ config NVMEM_ZYNQMP + + If sure, say yes. If unsure, say no. + ++config NVMEM_QORIQ_EFUSE ++ tristate "NXP QorIQ eFuse support" ++ depends on PPC_85xx || COMPILE_TEST ++ depends on HAS_IOMEM ++ help ++ This driver provides read support for the eFuses (SFP) on NXP QorIQ ++ series SoC's. This includes secure boot settings, the globally unique ++ NXP ID 'FUIDR' and the OEM unique ID 'OUIDR'. ++ ++ This driver can also be built as a module. If so, the module ++ will be called nvmem_qoriq_efuse. ++ + endif +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -77,3 +77,5 @@ obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvme + nvmem-vf610-ocotp-y := vf610-ocotp.o + obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o + nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o ++obj-$(CONFIG_NVMEM_QORIQ_EFUSE) += nvmem-qoriq-efuse.o ++nvmem-qoriq-efuse-y := qoriq-efuse.o +--- /dev/null ++++ b/drivers/nvmem/qoriq-efuse.c +@@ -0,0 +1,78 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2023 Westermo Network Technologies AB ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++struct qoriq_efuse_priv { ++ void __iomem *base; ++}; ++ ++static int qoriq_efuse_read(void *context, unsigned int offset, void *val, ++ size_t bytes) ++{ ++ struct qoriq_efuse_priv *priv = context; ++ ++ /* .stride = 4 so offset is guaranteed to be aligned */ ++ __ioread32_copy(val, priv->base + offset, bytes / 4); ++ ++ /* Ignore trailing bytes (there shouldn't be any) */ ++ ++ return 0; ++} ++ ++static int qoriq_efuse_probe(struct platform_device *pdev) ++{ ++ struct nvmem_config config = { ++ .dev = &pdev->dev, ++ .read_only = true, ++ .reg_read = qoriq_efuse_read, ++ .stride = sizeof(u32), ++ .word_size = sizeof(u32), ++ .name = "qoriq_efuse_read", ++ .id = NVMEM_DEVID_AUTO, ++ .root_only = true, ++ }; ++ struct qoriq_efuse_priv *priv; ++ struct nvmem_device *nvmem; ++ struct resource *res; ++ ++ priv = devm_kzalloc(config.dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); ++ if (IS_ERR(priv->base)) ++ return PTR_ERR(priv->base); ++ ++ config.size = resource_size(res); ++ config.priv = priv; ++ nvmem = devm_nvmem_register(config.dev, &config); ++ ++ return PTR_ERR_OR_ZERO(nvmem); ++} ++ ++static const struct of_device_id qoriq_efuse_of_match[] = { ++ { .compatible = "fsl,t1023-sfp", }, ++ {/* sentinel */}, ++}; ++MODULE_DEVICE_TABLE(of, qoriq_efuse_of_match); ++ ++static struct platform_driver qoriq_efuse_driver = { ++ .probe = qoriq_efuse_probe, ++ .driver = { ++ .name = "qoriq-efuse", ++ .of_match_table = qoriq_efuse_of_match, ++ }, ++}; ++module_platform_driver(qoriq_efuse_driver); ++ ++MODULE_AUTHOR("Richard Alpe "); ++MODULE_DESCRIPTION("NXP QorIQ Security Fuse Processor (SFP) Reader"); ++MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/backport-5.15/819-v6.6-0011-nvmem-Kconfig-Fix-typo-drive-driver.patch b/target/linux/generic/backport-5.15/819-v6.6-0011-nvmem-Kconfig-Fix-typo-drive-driver.patch new file mode 100644 index 0000000000..67f30e34a2 --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0011-nvmem-Kconfig-Fix-typo-drive-driver.patch @@ -0,0 +1,37 @@ +From 9d53d595f688c9837e88a919229cc61a165c7b9e Mon Sep 17 00:00:00 2001 +From: Diederik de Haas +Date: Mon, 24 Jul 2023 13:36:22 +0200 +Subject: [PATCH] nvmem: Kconfig: Fix typo "drive" -> "driver" + +Fix typo where "driver" was meant instead of "drive". +While at it, also capitalize "OTP". + +Signed-off-by: Diederik de Haas +Reviewed-by: Heiko Stuebner +Signed-off-by: Srinivas Kandagatla +--- + drivers/nvmem/Kconfig | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -247,7 +247,7 @@ config NVMEM_ROCKCHIP_EFUSE + depends on ARCH_ROCKCHIP || COMPILE_TEST + depends on HAS_IOMEM + help +- This is a simple drive to dump specified values of Rockchip SoC ++ This is a simple driver to dump specified values of Rockchip SoC + from eFuse, such as cpu-leakage. + + This driver can also be built as a module. If so, the module +@@ -258,8 +258,8 @@ config NVMEM_ROCKCHIP_OTP + depends on ARCH_ROCKCHIP || COMPILE_TEST + depends on HAS_IOMEM + help +- This is a simple drive to dump specified values of Rockchip SoC +- from otp, such as cpu-leakage. ++ This is a simple driver to dump specified values of Rockchip SoC ++ from OTP, such as cpu-leakage. + + This driver can also be built as a module. If so, the module + will be called nvmem_rockchip_otp. diff --git a/target/linux/generic/backport-5.15/819-v6.6-0012-nvmem-sec-qfprom-Add-Qualcomm-secure-QFPROM-support.patch b/target/linux/generic/backport-5.15/819-v6.6-0012-nvmem-sec-qfprom-Add-Qualcomm-secure-QFPROM-support.patch new file mode 100644 index 0000000000..d24a624ddf --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0012-nvmem-sec-qfprom-Add-Qualcomm-secure-QFPROM-support.patch @@ -0,0 +1,152 @@ +From 0a9ec38c47c1ca4528aa058e2b9ea61901a7e632 Mon Sep 17 00:00:00 2001 +From: Komal Bajaj +Date: Tue, 1 Aug 2023 12:10:25 +0530 +Subject: [PATCH] nvmem: sec-qfprom: Add Qualcomm secure QFPROM support + +For some of the Qualcomm SoC's, it is possible that +some of the fuse regions or entire qfprom region is +protected from non-secure access. In such situations, +the OS will have to use secure calls to read the region. +With that motivation, add secure qfprom driver. + +Signed-off-by: Komal Bajaj +Signed-off-by: Srinivas Kandagatla +--- + drivers/nvmem/Kconfig | 13 ++++++ + drivers/nvmem/Makefile | 2 + + drivers/nvmem/sec-qfprom.c | 96 ++++++++++++++++++++++++++++++++++++++ + 3 files changed, 111 insertions(+) + create mode 100644 drivers/nvmem/sec-qfprom.c + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -226,6 +226,19 @@ config NVMEM_QCOM_QFPROM + This driver can also be built as a module. If so, the module + will be called nvmem_qfprom. + ++config NVMEM_QCOM_SEC_QFPROM ++ tristate "QCOM SECURE QFPROM Support" ++ depends on ARCH_QCOM || COMPILE_TEST ++ depends on HAS_IOMEM ++ depends on OF ++ select QCOM_SCM ++ help ++ Say y here to enable secure QFPROM support. The secure QFPROM provides access ++ functions for QFPROM data to rest of the drivers via nvmem interface. ++ ++ This driver can also be built as a module. If so, the module will be called ++ nvmem_sec_qfprom. ++ + config NVMEM_RAVE_SP_EEPROM + tristate "Rave SP EEPROM Support" + depends on RAVE_SP_CORE +--- a/drivers/nvmem/Makefile ++++ b/drivers/nvmem/Makefile +@@ -46,6 +46,8 @@ obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvme + nvmem-nintendo-otp-y := nintendo-otp.o + obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o + nvmem_qfprom-y := qfprom.o ++obj-$(CONFIG_NVMEM_QCOM_SEC_QFPROM) += nvmem_sec_qfprom.o ++nvmem_sec_qfprom-y := sec-qfprom.o + obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o + nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o + obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o +--- /dev/null ++++ b/drivers/nvmem/sec-qfprom.c +@@ -0,0 +1,96 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++/** ++ * struct sec_qfprom - structure holding secure qfprom attributes ++ * ++ * @base: starting physical address for secure qfprom corrected address space. ++ * @dev: qfprom device structure. ++ */ ++struct sec_qfprom { ++ phys_addr_t base; ++ struct device *dev; ++}; ++ ++static int sec_qfprom_reg_read(void *context, unsigned int reg, void *_val, size_t bytes) ++{ ++ struct sec_qfprom *priv = context; ++ unsigned int i; ++ u8 *val = _val; ++ u32 read_val; ++ u8 *tmp; ++ ++ for (i = 0; i < bytes; i++, reg++) { ++ if (i == 0 || reg % 4 == 0) { ++ if (qcom_scm_io_readl(priv->base + (reg & ~3), &read_val)) { ++ dev_err(priv->dev, "Couldn't access fuse register\n"); ++ return -EINVAL; ++ } ++ tmp = (u8 *)&read_val; ++ } ++ ++ val[i] = tmp[reg & 3]; ++ } ++ ++ return 0; ++} ++ ++static int sec_qfprom_probe(struct platform_device *pdev) ++{ ++ struct nvmem_config econfig = { ++ .name = "sec-qfprom", ++ .stride = 1, ++ .word_size = 1, ++ .id = NVMEM_DEVID_AUTO, ++ .reg_read = sec_qfprom_reg_read, ++ }; ++ struct device *dev = &pdev->dev; ++ struct nvmem_device *nvmem; ++ struct sec_qfprom *priv; ++ struct resource *res; ++ ++ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) ++ return -EINVAL; ++ ++ priv->base = res->start; ++ ++ econfig.size = resource_size(res); ++ econfig.dev = dev; ++ econfig.priv = priv; ++ ++ priv->dev = dev; ++ ++ nvmem = devm_nvmem_register(dev, &econfig); ++ ++ return PTR_ERR_OR_ZERO(nvmem); ++} ++ ++static const struct of_device_id sec_qfprom_of_match[] = { ++ { .compatible = "qcom,sec-qfprom" }, ++ {/* sentinel */}, ++}; ++MODULE_DEVICE_TABLE(of, sec_qfprom_of_match); ++ ++static struct platform_driver qfprom_driver = { ++ .probe = sec_qfprom_probe, ++ .driver = { ++ .name = "qcom_sec_qfprom", ++ .of_match_table = sec_qfprom_of_match, ++ }, ++}; ++module_platform_driver(qfprom_driver); ++MODULE_DESCRIPTION("Qualcomm Secure QFPROM driver"); ++MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/backport-5.15/819-v6.6-0013-nvmem-u-boot-env-Replace-zero-length-array-with-DECL.patch b/target/linux/generic/backport-5.15/819-v6.6-0013-nvmem-u-boot-env-Replace-zero-length-array-with-DECL.patch new file mode 100644 index 0000000000..dab8ec2c24 --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0013-nvmem-u-boot-env-Replace-zero-length-array-with-DECL.patch @@ -0,0 +1,30 @@ +From c32f2186acc9abb4d766361255d7ddf07d15eeb2 Mon Sep 17 00:00:00 2001 +From: Atul Raut +Date: Sun, 30 Jul 2023 15:39:15 -0700 +Subject: [PATCH] nvmem: u-boot-env:: Replace zero-length array with + DECLARE_FLEX_ARRAY() helper + +We are moving toward replacing zero-length arrays with C99 flexible-array +members since they are deprecated. Therefore, the new DECLARE_FLEX_ARRAY() +helper macro should be used to replace the zero-length array declaration. + +This fixes warnings such as: +./drivers/nvmem/u-boot-env.c:50:9-13: WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays) + +Signed-off-by: Atul Raut +Signed-off-by: Srinivas Kandagatla +--- + drivers/nvmem/u-boot-env.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/u-boot-env.c ++++ b/drivers/nvmem/u-boot-env.c +@@ -47,7 +47,7 @@ struct u_boot_env_image_broadcom { + __le32 magic; + __le32 len; + __le32 crc32; +- uint8_t data[0]; ++ DECLARE_FLEX_ARRAY(uint8_t, data); + } __packed; + + static int u_boot_env_read(void *context, unsigned int offset, void *val, diff --git a/target/linux/generic/backport-5.15/819-v6.6-0014-nvmem-core-Create-all-cells-before-adding-the-nvmem-.patch b/target/linux/generic/backport-5.15/819-v6.6-0014-nvmem-core-Create-all-cells-before-adding-the-nvmem-.patch new file mode 100644 index 0000000000..f9532f39c3 --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0014-nvmem-core-Create-all-cells-before-adding-the-nvmem-.patch @@ -0,0 +1,40 @@ +From 104af6a5b199eb4dc7970d1304aef38ac5a6ed54 Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 8 Aug 2023 08:29:26 +0200 +Subject: [PATCH] nvmem: core: Create all cells before adding the nvmem device + +Let's pack all the cells creation in one place, so they are all created +before we add the nvmem device. + +Signed-off-by: Miquel Raynal +Reviewed-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +--- + drivers/nvmem/core.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -998,17 +998,17 @@ struct nvmem_device *nvmem_register(cons + if (rval) + goto err_remove_cells; + +- dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name); +- +- rval = device_add(&nvmem->dev); ++ rval = nvmem_add_cells_from_fixed_layout(nvmem); + if (rval) + goto err_remove_cells; + +- rval = nvmem_add_cells_from_fixed_layout(nvmem); ++ rval = nvmem_add_cells_from_layout(nvmem); + if (rval) + goto err_remove_cells; + +- rval = nvmem_add_cells_from_layout(nvmem); ++ dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name); ++ ++ rval = device_add(&nvmem->dev); + if (rval) + goto err_remove_cells; + diff --git a/target/linux/generic/backport-5.15/819-v6.6-0015-nvmem-core-Return-NULL-when-no-nvmem-layout-is-found.patch b/target/linux/generic/backport-5.15/819-v6.6-0015-nvmem-core-Return-NULL-when-no-nvmem-layout-is-found.patch new file mode 100644 index 0000000000..8f64d0c28b --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0015-nvmem-core-Return-NULL-when-no-nvmem-layout-is-found.patch @@ -0,0 +1,35 @@ +From 6c7f48ea2e663b679aa8e60d8d8e1e6306a644f9 Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 8 Aug 2023 08:29:27 +0200 +Subject: [PATCH] nvmem: core: Return NULL when no nvmem layout is found + +Currently, of_nvmem_layout_get_container() returns NULL on error, or an +error pointer if either CONFIG_NVMEM or CONFIG_OF is turned off. We +should likely avoid this kind of mix for two reasons: to clarify the +intend and anyway fix the !CONFIG_OF which will likely always if we use +this helper somewhere else. Let's just return NULL when no layout is +found, we don't need an error value here. + +Link: https://staticthinking.wordpress.com/2022/08/01/mixing-error-pointers-and-null/ +Fixes: 266570f496b9 ("nvmem: core: introduce NVMEM layouts") +Reported-by: kernel test robot +Reported-by: Dan Carpenter +Closes: https://lore.kernel.org/r/202308030002.DnSFOrMB-lkp@intel.com/ +Signed-off-by: Miquel Raynal +Reviewed-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +--- + include/linux/nvmem-consumer.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/include/linux/nvmem-consumer.h ++++ b/include/linux/nvmem-consumer.h +@@ -256,7 +256,7 @@ static inline struct nvmem_device *of_nv + static inline struct device_node * + of_nvmem_layout_get_container(struct nvmem_device *nvmem) + { +- return ERR_PTR(-EOPNOTSUPP); ++ return NULL; + } + #endif /* CONFIG_NVMEM && CONFIG_OF */ + diff --git a/target/linux/generic/backport-5.15/819-v6.6-0016-nvmem-core-Do-not-open-code-existing-functions.patch b/target/linux/generic/backport-5.15/819-v6.6-0016-nvmem-core-Do-not-open-code-existing-functions.patch new file mode 100644 index 0000000000..28d8bba194 --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0016-nvmem-core-Do-not-open-code-existing-functions.patch @@ -0,0 +1,29 @@ +From b8257f61b4ddac6d7d0e19a5a4e8b07afb3b4ed3 Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 8 Aug 2023 08:29:28 +0200 +Subject: [PATCH] nvmem: core: Do not open-code existing functions + +Use of_nvmem_layout_get_container() instead of hardcoding it. + +Signed-off-by: Miquel Raynal +Reviewed-by: Michael Walle +Signed-off-by: Srinivas Kandagatla +--- + drivers/nvmem/core.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -786,10 +786,10 @@ EXPORT_SYMBOL_GPL(nvmem_layout_unregiste + + static struct nvmem_layout *nvmem_layout_get(struct nvmem_device *nvmem) + { +- struct device_node *layout_np, *np = nvmem->dev.of_node; ++ struct device_node *layout_np; + struct nvmem_layout *l, *layout = ERR_PTR(-EPROBE_DEFER); + +- layout_np = of_get_child_by_name(np, "nvmem-layout"); ++ layout_np = of_nvmem_layout_get_container(nvmem); + if (!layout_np) + return NULL; + diff --git a/target/linux/generic/backport-5.15/819-v6.6-0017-nvmem-core-Notify-when-a-new-layout-is-registered.patch b/target/linux/generic/backport-5.15/819-v6.6-0017-nvmem-core-Notify-when-a-new-layout-is-registered.patch new file mode 100644 index 0000000000..b62a0e18da --- /dev/null +++ b/target/linux/generic/backport-5.15/819-v6.6-0017-nvmem-core-Notify-when-a-new-layout-is-registered.patch @@ -0,0 +1,44 @@ +From 0991afbe4b1805e7f0113ef10d7c5f0698a739e4 Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 8 Aug 2023 08:29:29 +0200 +Subject: [PATCH] nvmem: core: Notify when a new layout is registered + +Tell listeners a new layout was introduced and is now available. + +Signed-off-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +--- + drivers/nvmem/core.c | 4 ++++ + include/linux/nvmem-consumer.h | 2 ++ + 2 files changed, 6 insertions(+) + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -772,12 +772,16 @@ int __nvmem_layout_register(struct nvmem + list_add(&layout->node, &nvmem_layouts); + spin_unlock(&nvmem_layout_lock); + ++ blocking_notifier_call_chain(&nvmem_notifier, NVMEM_LAYOUT_ADD, layout); ++ + return 0; + } + EXPORT_SYMBOL_GPL(__nvmem_layout_register); + + void nvmem_layout_unregister(struct nvmem_layout *layout) + { ++ blocking_notifier_call_chain(&nvmem_notifier, NVMEM_LAYOUT_REMOVE, layout); ++ + spin_lock(&nvmem_layout_lock); + list_del(&layout->node); + spin_unlock(&nvmem_layout_lock); +--- a/include/linux/nvmem-consumer.h ++++ b/include/linux/nvmem-consumer.h +@@ -43,6 +43,8 @@ enum { + NVMEM_REMOVE, + NVMEM_CELL_ADD, + NVMEM_CELL_REMOVE, ++ NVMEM_LAYOUT_ADD, ++ NVMEM_LAYOUT_REMOVE, + }; + + #if IS_ENABLED(CONFIG_NVMEM) diff --git a/target/linux/generic/backport-5.15/820-v6.7-0001-nvmem-qfprom-Mark-core-clk-as-optional.patch b/target/linux/generic/backport-5.15/820-v6.7-0001-nvmem-qfprom-Mark-core-clk-as-optional.patch new file mode 100644 index 0000000000..66d4028140 --- /dev/null +++ b/target/linux/generic/backport-5.15/820-v6.7-0001-nvmem-qfprom-Mark-core-clk-as-optional.patch @@ -0,0 +1,37 @@ +From 16724d6ea40a2c9315f5a0d81005dfa4d7a6da24 Mon Sep 17 00:00:00 2001 +From: Luca Weiss +Date: Fri, 20 Oct 2023 11:55:40 +0100 +Subject: [PATCH] nvmem: qfprom: Mark core clk as optional + +On some platforms like sc7280 on non-ChromeOS devices the core clock +cannot be touched by Linux so we cannot provide it. Mark it as optional +as accessing qfprom for reading works without it but we still prohibit +writing if we cannot provide the clock. + +Signed-off-by: Luca Weiss +Reviewed-by: Douglas Anderson +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20231020105545.216052-2-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/qfprom.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/nvmem/qfprom.c ++++ b/drivers/nvmem/qfprom.c +@@ -423,12 +423,12 @@ static int qfprom_probe(struct platform_ + if (IS_ERR(priv->vcc)) + return PTR_ERR(priv->vcc); + +- priv->secclk = devm_clk_get(dev, "core"); ++ priv->secclk = devm_clk_get_optional(dev, "core"); + if (IS_ERR(priv->secclk)) + return dev_err_probe(dev, PTR_ERR(priv->secclk), "Error getting clock\n"); + +- /* Only enable writing if we have SoC data. */ +- if (priv->soc_data) ++ /* Only enable writing if we have SoC data and a valid clock */ ++ if (priv->soc_data && priv->secclk) + econfig.reg_write = qfprom_reg_write; + } + diff --git a/target/linux/generic/backport-5.15/820-v6.7-0002-nvmem-add-explicit-config-option-to-read-old-syntax-.patch b/target/linux/generic/backport-5.15/820-v6.7-0002-nvmem-add-explicit-config-option-to-read-old-syntax-.patch new file mode 100644 index 0000000000..d207ea4872 --- /dev/null +++ b/target/linux/generic/backport-5.15/820-v6.7-0002-nvmem-add-explicit-config-option-to-read-old-syntax-.patch @@ -0,0 +1,330 @@ +From 2cc3b37f5b6df8189d55d0e812d9658ce256dfec Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Fri, 20 Oct 2023 11:55:41 +0100 +Subject: [PATCH] nvmem: add explicit config option to read old syntax fixed OF + cells +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Binding for fixed NVMEM cells defined directly as NVMEM device subnodes +has been deprecated. It has been replaced by the "fixed-layout" NVMEM +layout binding. + +New syntax is meant to be clearer and should help avoiding imprecise +bindings. + +NVMEM subsystem already supports the new binding. It should be a good +idea to limit support for old syntax to existing drivers that actually +support & use it (we can't break backward compatibility!). That way we +additionally encourage new bindings & drivers to ignore deprecated +binding. + +It wasn't clear (to me) if rtc and w1 code actually uses old syntax +fixed cells. I enabled them to don't risk any breakage. + +Signed-off-by: Rafał Miłecki +[for meson-{efuse,mx-efuse}.c] +Acked-by: Martin Blumenstingl +[for mtk-efuse.c, nvmem/core.c, nvmem-provider.h] +Reviewed-by: AngeloGioacchino Del Regno +[MT8192, MT8195 Chromebooks] +Tested-by: AngeloGioacchino Del Regno +[for microchip-otpc.c] +Reviewed-by: Claudiu Beznea +[SAMA7G5-EK] +Tested-by: Claudiu Beznea +Acked-by: Jernej Skrabec +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20231020105545.216052-3-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/mtd/mtdcore.c | 2 ++ + drivers/nvmem/apple-efuses.c | 1 + + drivers/nvmem/core.c | 8 +++++--- + drivers/nvmem/imx-ocotp-scu.c | 1 + + drivers/nvmem/imx-ocotp.c | 1 + + drivers/nvmem/meson-efuse.c | 1 + + drivers/nvmem/meson-mx-efuse.c | 1 + + drivers/nvmem/microchip-otpc.c | 1 + + drivers/nvmem/mtk-efuse.c | 1 + + drivers/nvmem/qcom-spmi-sdam.c | 1 + + drivers/nvmem/qfprom.c | 1 + + drivers/nvmem/rave-sp-eeprom.c | 1 + + drivers/nvmem/rockchip-efuse.c | 1 + + drivers/nvmem/sc27xx-efuse.c | 1 + + drivers/nvmem/sec-qfprom.c | 1 + + drivers/nvmem/sprd-efuse.c | 1 + + drivers/nvmem/stm32-romem.c | 1 + + drivers/nvmem/sunplus-ocotp.c | 1 + + drivers/nvmem/sunxi_sid.c | 1 + + drivers/nvmem/uniphier-efuse.c | 1 + + drivers/nvmem/zynqmp_nvmem.c | 1 + + drivers/rtc/nvmem.c | 1 + + drivers/w1/slaves/w1_ds250x.c | 1 + + include/linux/nvmem-provider.h | 2 ++ + 24 files changed, 30 insertions(+), 3 deletions(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -541,6 +541,7 @@ static int mtd_nvmem_add(struct mtd_info + config.dev = &mtd->dev; + config.name = dev_name(&mtd->dev); + config.owner = THIS_MODULE; ++ config.add_legacy_fixed_of_cells = of_device_is_compatible(node, "nvmem-cells"); + config.reg_read = mtd_nvmem_reg_read; + config.size = mtd->size; + config.word_size = 1; +@@ -898,6 +899,7 @@ static struct nvmem_device *mtd_otp_nvme + config.name = compatible; + config.id = NVMEM_DEVID_AUTO; + config.owner = THIS_MODULE; ++ config.add_legacy_fixed_of_cells = true; + config.type = NVMEM_TYPE_OTP; + config.root_only = true; + config.ignore_wp = true; +--- a/drivers/nvmem/apple-efuses.c ++++ b/drivers/nvmem/apple-efuses.c +@@ -36,6 +36,7 @@ static int apple_efuses_probe(struct pla + struct resource *res; + struct nvmem_config config = { + .dev = &pdev->dev, ++ .add_legacy_fixed_of_cells = true, + .read_only = true, + .reg_read = apple_efuses_read, + .stride = sizeof(u32), +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -998,9 +998,11 @@ struct nvmem_device *nvmem_register(cons + if (rval) + goto err_remove_cells; + +- rval = nvmem_add_cells_from_legacy_of(nvmem); +- if (rval) +- goto err_remove_cells; ++ if (config->add_legacy_fixed_of_cells) { ++ rval = nvmem_add_cells_from_legacy_of(nvmem); ++ if (rval) ++ goto err_remove_cells; ++ } + + rval = nvmem_add_cells_from_fixed_layout(nvmem); + if (rval) +--- a/drivers/nvmem/imx-ocotp-scu.c ++++ b/drivers/nvmem/imx-ocotp-scu.c +@@ -220,6 +220,7 @@ static int imx_scu_ocotp_write(void *con + + static struct nvmem_config imx_scu_ocotp_nvmem_config = { + .name = "imx-scu-ocotp", ++ .add_legacy_fixed_of_cells = true, + .read_only = false, + .word_size = 4, + .stride = 1, +--- a/drivers/nvmem/imx-ocotp.c ++++ b/drivers/nvmem/imx-ocotp.c +@@ -616,6 +616,7 @@ static int imx_ocotp_probe(struct platfo + return PTR_ERR(priv->clk); + + priv->params = of_device_get_match_data(&pdev->dev); ++ imx_ocotp_nvmem_config.add_legacy_fixed_of_cells = true; + imx_ocotp_nvmem_config.size = 4 * priv->params->nregs; + imx_ocotp_nvmem_config.dev = dev; + imx_ocotp_nvmem_config.priv = priv; +--- a/drivers/nvmem/meson-efuse.c ++++ b/drivers/nvmem/meson-efuse.c +@@ -93,6 +93,7 @@ static int meson_efuse_probe(struct plat + + econfig->dev = dev; + econfig->name = dev_name(dev); ++ econfig->add_legacy_fixed_of_cells = true; + econfig->stride = 1; + econfig->word_size = 1; + econfig->reg_read = meson_efuse_read; +--- a/drivers/nvmem/meson-mx-efuse.c ++++ b/drivers/nvmem/meson-mx-efuse.c +@@ -211,6 +211,7 @@ static int meson_mx_efuse_probe(struct p + efuse->config.owner = THIS_MODULE; + efuse->config.dev = &pdev->dev; + efuse->config.priv = efuse; ++ efuse->config.add_legacy_fixed_of_cells = true; + efuse->config.stride = drvdata->word_size; + efuse->config.word_size = drvdata->word_size; + efuse->config.size = SZ_512; +--- a/drivers/nvmem/microchip-otpc.c ++++ b/drivers/nvmem/microchip-otpc.c +@@ -261,6 +261,7 @@ static int mchp_otpc_probe(struct platfo + return ret; + + mchp_nvmem_config.dev = otpc->dev; ++ mchp_nvmem_config.add_legacy_fixed_of_cells = true; + mchp_nvmem_config.size = size; + mchp_nvmem_config.priv = otpc; + nvmem = devm_nvmem_register(&pdev->dev, &mchp_nvmem_config); +--- a/drivers/nvmem/mtk-efuse.c ++++ b/drivers/nvmem/mtk-efuse.c +@@ -83,6 +83,7 @@ static int mtk_efuse_probe(struct platfo + return PTR_ERR(priv->base); + + pdata = device_get_match_data(dev); ++ econfig.add_legacy_fixed_of_cells = true; + econfig.stride = 1; + econfig.word_size = 1; + econfig.reg_read = mtk_reg_read; +--- a/drivers/nvmem/qcom-spmi-sdam.c ++++ b/drivers/nvmem/qcom-spmi-sdam.c +@@ -142,6 +142,7 @@ static int sdam_probe(struct platform_de + sdam->sdam_config.name = "spmi_sdam"; + sdam->sdam_config.id = NVMEM_DEVID_AUTO; + sdam->sdam_config.owner = THIS_MODULE; ++ sdam->sdam_config.add_legacy_fixed_of_cells = true; + sdam->sdam_config.stride = 1; + sdam->sdam_config.word_size = 1; + sdam->sdam_config.reg_read = sdam_read; +--- a/drivers/nvmem/qfprom.c ++++ b/drivers/nvmem/qfprom.c +@@ -357,6 +357,7 @@ static int qfprom_probe(struct platform_ + { + struct nvmem_config econfig = { + .name = "qfprom", ++ .add_legacy_fixed_of_cells = true, + .stride = 1, + .word_size = 1, + .id = NVMEM_DEVID_AUTO, +--- a/drivers/nvmem/rave-sp-eeprom.c ++++ b/drivers/nvmem/rave-sp-eeprom.c +@@ -328,6 +328,7 @@ static int rave_sp_eeprom_probe(struct p + of_property_read_string(np, "zii,eeprom-name", &config.name); + config.priv = eeprom; + config.dev = dev; ++ config.add_legacy_fixed_of_cells = true; + config.size = size; + config.reg_read = rave_sp_eeprom_reg_read; + config.reg_write = rave_sp_eeprom_reg_write; +--- a/drivers/nvmem/rockchip-efuse.c ++++ b/drivers/nvmem/rockchip-efuse.c +@@ -205,6 +205,7 @@ static int rockchip_rk3399_efuse_read(vo + + static struct nvmem_config econfig = { + .name = "rockchip-efuse", ++ .add_legacy_fixed_of_cells = true, + .stride = 1, + .word_size = 1, + .read_only = true, +--- a/drivers/nvmem/sc27xx-efuse.c ++++ b/drivers/nvmem/sc27xx-efuse.c +@@ -248,6 +248,7 @@ static int sc27xx_efuse_probe(struct pla + econfig.reg_read = sc27xx_efuse_read; + econfig.priv = efuse; + econfig.dev = &pdev->dev; ++ econfig.add_legacy_fixed_of_cells = true; + nvmem = devm_nvmem_register(&pdev->dev, &econfig); + if (IS_ERR(nvmem)) { + dev_err(&pdev->dev, "failed to register nvmem config\n"); +--- a/drivers/nvmem/sec-qfprom.c ++++ b/drivers/nvmem/sec-qfprom.c +@@ -47,6 +47,7 @@ static int sec_qfprom_probe(struct platf + { + struct nvmem_config econfig = { + .name = "sec-qfprom", ++ .add_legacy_fixed_of_cells = true, + .stride = 1, + .word_size = 1, + .id = NVMEM_DEVID_AUTO, +--- a/drivers/nvmem/sprd-efuse.c ++++ b/drivers/nvmem/sprd-efuse.c +@@ -408,6 +408,7 @@ static int sprd_efuse_probe(struct platf + econfig.read_only = false; + econfig.name = "sprd-efuse"; + econfig.size = efuse->data->blk_nums * SPRD_EFUSE_BLOCK_WIDTH; ++ econfig.add_legacy_fixed_of_cells = true; + econfig.reg_read = sprd_efuse_read; + econfig.reg_write = sprd_efuse_write; + econfig.priv = efuse; +--- a/drivers/nvmem/stm32-romem.c ++++ b/drivers/nvmem/stm32-romem.c +@@ -207,6 +207,7 @@ static int stm32_romem_probe(struct plat + priv->cfg.priv = priv; + priv->cfg.owner = THIS_MODULE; + priv->cfg.type = NVMEM_TYPE_OTP; ++ priv->cfg.add_legacy_fixed_of_cells = true; + + priv->lower = 0; + +--- a/drivers/nvmem/sunplus-ocotp.c ++++ b/drivers/nvmem/sunplus-ocotp.c +@@ -145,6 +145,7 @@ disable_clk: + + static struct nvmem_config sp_ocotp_nvmem_config = { + .name = "sp-ocotp", ++ .add_legacy_fixed_of_cells = true, + .read_only = true, + .word_size = 1, + .size = QAC628_OTP_SIZE, +--- a/drivers/nvmem/sunxi_sid.c ++++ b/drivers/nvmem/sunxi_sid.c +@@ -154,6 +154,7 @@ static int sunxi_sid_probe(struct platfo + nvmem_cfg->dev = dev; + nvmem_cfg->name = "sunxi-sid"; + nvmem_cfg->type = NVMEM_TYPE_OTP; ++ nvmem_cfg->add_legacy_fixed_of_cells = true; + nvmem_cfg->read_only = true; + nvmem_cfg->size = cfg->size; + nvmem_cfg->word_size = 1; +--- a/drivers/nvmem/uniphier-efuse.c ++++ b/drivers/nvmem/uniphier-efuse.c +@@ -52,6 +52,7 @@ static int uniphier_efuse_probe(struct p + econfig.size = resource_size(res); + econfig.priv = priv; + econfig.dev = dev; ++ econfig.add_legacy_fixed_of_cells = true; + nvmem = devm_nvmem_register(dev, &econfig); + + return PTR_ERR_OR_ZERO(nvmem); +--- a/drivers/nvmem/zynqmp_nvmem.c ++++ b/drivers/nvmem/zynqmp_nvmem.c +@@ -58,6 +58,7 @@ static int zynqmp_nvmem_probe(struct pla + + priv->dev = dev; + econfig.dev = dev; ++ econfig.add_legacy_fixed_of_cells = true; + econfig.reg_read = zynqmp_nvmem_read; + econfig.priv = priv; + +--- a/drivers/rtc/nvmem.c ++++ b/drivers/rtc/nvmem.c +@@ -21,6 +21,7 @@ int devm_rtc_nvmem_register(struct rtc_d + + nvmem_config->dev = dev; + nvmem_config->owner = rtc->owner; ++ nvmem_config->add_legacy_fixed_of_cells = true; + nvmem = devm_nvmem_register(dev, nvmem_config); + if (IS_ERR(nvmem)) + dev_err(dev, "failed to register nvmem device for RTC\n"); +--- a/drivers/w1/slaves/w1_ds250x.c ++++ b/drivers/w1/slaves/w1_ds250x.c +@@ -168,6 +168,7 @@ static int w1_eprom_add_slave(struct w1_ + struct nvmem_device *nvmem; + struct nvmem_config nvmem_cfg = { + .dev = &sl->dev, ++ .add_legacy_fixed_of_cells = true, + .reg_read = w1_nvmem_read, + .type = NVMEM_TYPE_OTP, + .read_only = true, +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -82,6 +82,7 @@ struct nvmem_cell_info { + * @owner: Pointer to exporter module. Used for refcounting. + * @cells: Optional array of pre-defined NVMEM cells. + * @ncells: Number of elements in cells. ++ * @add_legacy_fixed_of_cells: Read fixed NVMEM cells from old OF syntax. + * @keepout: Optional array of keepout ranges (sorted ascending by start). + * @nkeepout: Number of elements in the keepout array. + * @type: Type of the nvmem storage +@@ -112,6 +113,7 @@ struct nvmem_config { + struct module *owner; + const struct nvmem_cell_info *cells; + int ncells; ++ bool add_legacy_fixed_of_cells; + const struct nvmem_keepout *keepout; + unsigned int nkeepout; + enum nvmem_type type; diff --git a/target/linux/generic/backport-5.15/820-v6.7-0003-nvmem-Use-device_get_match_data.patch b/target/linux/generic/backport-5.15/820-v6.7-0003-nvmem-Use-device_get_match_data.patch new file mode 100644 index 0000000000..84c0293982 --- /dev/null +++ b/target/linux/generic/backport-5.15/820-v6.7-0003-nvmem-Use-device_get_match_data.patch @@ -0,0 +1,77 @@ +From 0720219f4d34a88a9badb4de70cfad7585687d48 Mon Sep 17 00:00:00 2001 +From: Rob Herring +Date: Fri, 20 Oct 2023 11:55:45 +0100 +Subject: [PATCH] nvmem: Use device_get_match_data() + +Use preferred device_get_match_data() instead of of_match_device() to +get the driver match data. With this, adjust the includes to explicitly +include the correct headers. + +Signed-off-by: Rob Herring +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20231020105545.216052-7-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/nvmem/mxs-ocotp.c | 10 ++++------ + drivers/nvmem/stm32-romem.c | 7 ++++--- + 2 files changed, 8 insertions(+), 9 deletions(-) + +--- a/drivers/nvmem/mxs-ocotp.c ++++ b/drivers/nvmem/mxs-ocotp.c +@@ -13,8 +13,9 @@ + #include + #include + #include +-#include ++#include + #include ++#include + #include + #include + +@@ -140,11 +141,10 @@ static int mxs_ocotp_probe(struct platfo + struct device *dev = &pdev->dev; + const struct mxs_data *data; + struct mxs_ocotp *otp; +- const struct of_device_id *match; + int ret; + +- match = of_match_device(dev->driver->of_match_table, dev); +- if (!match || !match->data) ++ data = device_get_match_data(dev); ++ if (!data) + return -EINVAL; + + otp = devm_kzalloc(dev, sizeof(*otp), GFP_KERNEL); +@@ -169,8 +169,6 @@ static int mxs_ocotp_probe(struct platfo + if (ret) + return ret; + +- data = match->data; +- + ocotp_config.size = data->size; + ocotp_config.priv = otp; + ocotp_config.dev = dev; +--- a/drivers/nvmem/stm32-romem.c ++++ b/drivers/nvmem/stm32-romem.c +@@ -10,7 +10,9 @@ + #include + #include + #include +-#include ++#include ++#include ++#include + #include + + #include "stm32-bsec-optee-ta.h" +@@ -211,8 +213,7 @@ static int stm32_romem_probe(struct plat + + priv->lower = 0; + +- cfg = (const struct stm32_romem_cfg *) +- of_match_device(dev->driver->of_match_table, dev)->data; ++ cfg = device_get_match_data(dev); + if (!cfg) { + priv->cfg.read_only = true; + priv->cfg.size = resource_size(res); diff --git a/target/linux/generic/backport-5.15/820-v6.7-0004-Revert-nvmem-add-new-config-option.patch b/target/linux/generic/backport-5.15/820-v6.7-0004-Revert-nvmem-add-new-config-option.patch new file mode 100644 index 0000000000..b23a23ef3a --- /dev/null +++ b/target/linux/generic/backport-5.15/820-v6.7-0004-Revert-nvmem-add-new-config-option.patch @@ -0,0 +1,77 @@ +From f4cf4e5db331a5ce69e3f0b21d322cac0f4e4b5d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Mon, 23 Oct 2023 12:27:59 +0200 +Subject: [PATCH] Revert "nvmem: add new config option" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit 517f14d9cf3533d5ab4fded195ab6f80a92e378f. + +Config option "no_of_node" is no longer needed since adding a more +explicit and targeted option "add_legacy_fixed_of_cells". + +That "no_of_node" config option was needed *earlier* to help mtd's case. + +DT nodes of MTD partitions (that are also NVMEM devices) may contain +subnodes. Those SHOULD NOT be treated as NVMEM fixed cells. + +To prevent NVMEM core code from parsing subnodes a "no_of_node" option +was added (and set to true in mtd) to make for_each_child_of_node() in +NVMEM a no-op. That was a bit hacky because it was messing with +"of_node" pointer to achieve some side-effect. + +With the introduction of "add_legacy_fixed_of_cells" config option +things got more explicit. MTD subsystem simply tells NVMEM when to look +for fixed cells and there is no need to hack "of_node" pointer anymore. + +Signed-off-by: Rafał Miłecki +Reviewed-by: Miquel Raynal +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20231023102759.31529-1-zajec5@gmail.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/mtd/mtdcore.c | 1 - + drivers/nvmem/core.c | 2 +- + include/linux/nvmem-provider.h | 2 -- + 3 files changed, 1 insertion(+), 4 deletions(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -549,7 +549,6 @@ static int mtd_nvmem_add(struct mtd_info + config.read_only = true; + config.root_only = true; + config.ignore_wp = true; +- config.no_of_node = !of_device_is_compatible(node, "nvmem-cells"); + config.priv = mtd; + + mtd->nvmem = nvmem_register(&config); +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -936,7 +936,7 @@ struct nvmem_device *nvmem_register(cons + nvmem->nkeepout = config->nkeepout; + if (config->of_node) + nvmem->dev.of_node = config->of_node; +- else if (!config->no_of_node) ++ else + nvmem->dev.of_node = config->dev->of_node; + + switch (config->id) { +--- a/include/linux/nvmem-provider.h ++++ b/include/linux/nvmem-provider.h +@@ -89,7 +89,6 @@ struct nvmem_cell_info { + * @read_only: Device is read-only. + * @root_only: Device is accessibly to root only. + * @of_node: If given, this will be used instead of the parent's of_node. +- * @no_of_node: Device should not use the parent's of_node even if it's !NULL. + * @reg_read: Callback to read data. + * @reg_write: Callback to write data. + * @size: Device size. +@@ -122,7 +121,6 @@ struct nvmem_config { + bool ignore_wp; + struct nvmem_layout *layout; + struct device_node *of_node; +- bool no_of_node; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + int size; diff --git a/target/linux/generic/backport-5.15/821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch b/target/linux/generic/backport-5.15/821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch new file mode 100644 index 0000000000..0d56c74f98 --- /dev/null +++ b/target/linux/generic/backport-5.15/821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch @@ -0,0 +1,51 @@ +From 5cb03751455c299b1bf10cb48631bf359cfb11b5 Mon Sep 17 00:00:00 2001 +From: "mark-yw.chen" +Date: Wed, 1 Sep 2021 11:32:25 +0800 +Subject: [PATCH 1/5] Bluetooth: btusb: Support public address configuration + for MediaTek Chip. + +The MediaTek chip support vendor specific HCI command(0xfc1a) to +change the public address. Add hdev->set_bdaddr handler for MediaTek +Chip. After doing a power cycle or MediaTek Bluetooth reset, BD_ADDR +will bring back the original one. + +Signed-off-by: mark-yw.chen +Signed-off-by: Marcel Holtmann +--- + drivers/bluetooth/btusb.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -2287,6 +2287,23 @@ struct btmtk_section_map { + }; + } __packed; + ++static int btusb_set_bdaddr_mtk(struct hci_dev *hdev, const bdaddr_t *bdaddr) ++{ ++ struct sk_buff *skb; ++ long ret; ++ ++ skb = __hci_cmd_sync(hdev, 0xfc1a, sizeof(bdaddr), bdaddr, HCI_INIT_TIMEOUT); ++ if (IS_ERR(skb)) { ++ ret = PTR_ERR(skb); ++ bt_dev_err(hdev, "changing Mediatek device address failed (%ld)", ++ ret); ++ return ret; ++ } ++ kfree_skb(skb); ++ ++ return 0; ++} ++ + static void btusb_mtk_wmt_recv(struct urb *urb) + { + struct hci_dev *hdev = urb->context; +@@ -3940,6 +3957,7 @@ static int btusb_probe(struct usb_interf + hdev->shutdown = btusb_mtk_shutdown; + hdev->manufacturer = 70; + hdev->cmd_timeout = btusb_mtk_cmd_timeout; ++ hdev->set_bdaddr = btusb_set_bdaddr_mtk; + set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks); + data->recv_acl = btusb_recv_acl_mtk; + } diff --git a/target/linux/generic/backport-5.15/822-v5.17-Bluetooth-btusb-Fix-application-of-sizeof-to-pointer.patch b/target/linux/generic/backport-5.15/822-v5.17-Bluetooth-btusb-Fix-application-of-sizeof-to-pointer.patch new file mode 100644 index 0000000000..d72866eabf --- /dev/null +++ b/target/linux/generic/backport-5.15/822-v5.17-Bluetooth-btusb-Fix-application-of-sizeof-to-pointer.patch @@ -0,0 +1,29 @@ +From af774a731f7b4c2a90a8476cd44045ba8d1263ba Mon Sep 17 00:00:00 2001 +From: David Yang +Date: Wed, 13 Oct 2021 08:56:33 +0800 +Subject: [PATCH 2/5] Bluetooth: btusb: Fix application of sizeof to pointer + +The coccinelle check report: +"./drivers/bluetooth/btusb.c:2239:36-42: +ERROR: application of sizeof to pointer". +Using the real size to fix it. + +Fixes: 5a87679ffd443 ("Bluetooth: btusb: Support public address configuration for MediaTek Chip.") +Reported-by: Zeal Robot +Signed-off-by: David Yang +Signed-off-by: Marcel Holtmann +--- + drivers/bluetooth/btusb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -2292,7 +2292,7 @@ static int btusb_set_bdaddr_mtk(struct h + struct sk_buff *skb; + long ret; + +- skb = __hci_cmd_sync(hdev, 0xfc1a, sizeof(bdaddr), bdaddr, HCI_INIT_TIMEOUT); ++ skb = __hci_cmd_sync(hdev, 0xfc1a, 6, bdaddr, HCI_INIT_TIMEOUT); + if (IS_ERR(skb)) { + ret = PTR_ERR(skb); + bt_dev_err(hdev, "changing Mediatek device address failed (%ld)", diff --git a/target/linux/generic/backport-5.15/823-v5.18-Bluetooth-btusb-Add-a-new-PID-VID-13d3-3567-for-MT79.patch b/target/linux/generic/backport-5.15/823-v5.18-Bluetooth-btusb-Add-a-new-PID-VID-13d3-3567-for-MT79.patch new file mode 100644 index 0000000000..ebb6cc4717 --- /dev/null +++ b/target/linux/generic/backport-5.15/823-v5.18-Bluetooth-btusb-Add-a-new-PID-VID-13d3-3567-for-MT79.patch @@ -0,0 +1,70 @@ +From e57186fc02cedff191c469a26cce615371e41740 Mon Sep 17 00:00:00 2001 +From: Yake Yang +Date: Wed, 23 Feb 2022 07:55:59 +0800 +Subject: [PATCH 3/5] Bluetooth: btusb: Add a new PID/VID 13d3/3567 for MT7921 + +Add VID 13D3 & PID 3567 for MediaTek MT7921 USB Bluetooth chip. + +The information in /sys/kernel/debug/usb/devices about the Bluetooth +device is listed as the below. + +T: Bus=05 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 0 +D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 +P: Vendor=13d3 ProdID=3567 Rev= 1.00 +S: Manufacturer=MediaTek Inc. +S: Product=Wireless_Device +S: SerialNumber=000000000 +C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA +A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 +I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us +E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms +I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms +I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms +I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms +I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms +I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms +I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms +I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms +I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us +I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us + +Co-developed-by: Sean Wang +Signed-off-by: Sean Wang +Signed-off-by: Yake Yang +Signed-off-by: Marcel Holtmann +--- + drivers/bluetooth/btusb.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -476,6 +476,9 @@ static const struct usb_device_id blackl + { USB_DEVICE(0x13d3, 0x3564), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, ++ { USB_DEVICE(0x13d3, 0x3567), .driver_info = BTUSB_MEDIATEK | ++ BTUSB_WIDEBAND_SPEECH | ++ BTUSB_VALID_LE_STATES }, + { USB_DEVICE(0x0489, 0xe0cd), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, diff --git a/target/linux/generic/backport-5.15/824-v5.19-Bluetooth-btusb-Add-a-new-PID-VID-0489-e0c8-for-MT79.patch b/target/linux/generic/backport-5.15/824-v5.19-Bluetooth-btusb-Add-a-new-PID-VID-0489-e0c8-for-MT79.patch new file mode 100644 index 0000000000..a8c7ca003a --- /dev/null +++ b/target/linux/generic/backport-5.15/824-v5.19-Bluetooth-btusb-Add-a-new-PID-VID-0489-e0c8-for-MT79.patch @@ -0,0 +1,68 @@ +From e507366cd1e8e1d4eebe537c08fd142cf0b617fa Mon Sep 17 00:00:00 2001 +From: Sean Wang +Date: Thu, 28 Apr 2022 02:38:39 +0800 +Subject: [PATCH 4/5] Bluetooth: btusb: Add a new PID/VID 0489/e0c8 for MT7921 + +Add VID 0489 & PID e0c8 for MediaTek MT7921 USB Bluetooth chip. + +The information in /sys/kernel/debug/usb/devices about the Bluetooth +device is listed as the below. + +T: Bus=01 Lev=01 Prnt=01 Port=13 Cnt=03 Dev#= 4 Spd=480 MxCh= 0 +D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 +P: Vendor=0489 ProdID=e0c8 Rev= 1.00 +S: Manufacturer=MediaTek Inc. +S: Product=Wireless_Device +S: SerialNumber=000000000 +C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA +A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 +I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us +E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms +I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms +I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms +I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms +I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms +I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms +I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms +I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms +I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us +I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us + +Signed-off-by: Sean Wang +Signed-off-by: Marcel Holtmann +--- + drivers/bluetooth/btusb.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -467,6 +467,9 @@ static const struct usb_device_id blackl + BTUSB_VALID_LE_STATES }, + + /* Additional MediaTek MT7921 Bluetooth devices */ ++ { USB_DEVICE(0x0489, 0xe0c8), .driver_info = BTUSB_MEDIATEK | ++ BTUSB_WIDEBAND_SPEECH | ++ BTUSB_VALID_LE_STATES }, + { USB_DEVICE(0x04ca, 0x3802), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, diff --git a/target/linux/generic/backport-5.15/825-v6.1-Bluetooth-btusb-Add-a-new-VID-PID-0e8d-0608-for-MT79.patch b/target/linux/generic/backport-5.15/825-v6.1-Bluetooth-btusb-Add-a-new-VID-PID-0e8d-0608-for-MT79.patch new file mode 100644 index 0000000000..b46e6926d1 --- /dev/null +++ b/target/linux/generic/backport-5.15/825-v6.1-Bluetooth-btusb-Add-a-new-VID-PID-0e8d-0608-for-MT79.patch @@ -0,0 +1,66 @@ +From be55622ce673f9692cc15d26d77a050cda42a3d3 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Fri, 9 Sep 2022 21:00:30 +0100 +Subject: [PATCH 1/1] Bluetooth: btusb: Add a new VID/PID 0e8d/0608 for MT7921 + +Add a new PID/VID 0e8d/0608 for MT7921K chip found on AMD RZ608 module. + +From /sys/kernel/debug/usb/devices: +T: Bus=01 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#= 3 Spd=480 MxCh= 0 +D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 +P: Vendor=0e8d ProdID=0608 Rev= 1.00 +S: Manufacturer=MediaTek Inc. +S: Product=Wireless_Device +S: SerialNumber=000000000 +C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA +A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 +I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us +E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms +I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms +I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms +I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms +I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms +I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms +I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms +I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms +I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us +I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us + +Signed-off-by: Daniel Golle +Signed-off-by: Luiz Augusto von Dentz +--- + drivers/bluetooth/btusb.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -485,6 +485,9 @@ static const struct usb_device_id blackl + { USB_DEVICE(0x0489, 0xe0cd), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, ++ { USB_DEVICE(0x0e8d, 0x0608), .driver_info = BTUSB_MEDIATEK | ++ BTUSB_WIDEBAND_SPEECH | ++ BTUSB_VALID_LE_STATES }, + + /* MediaTek MT7922A Bluetooth devices */ + { USB_DEVICE(0x0489, 0xe0d8), .driver_info = BTUSB_MEDIATEK | diff --git a/target/linux/generic/backport-5.15/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch b/target/linux/generic/backport-5.15/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch new file mode 100644 index 0000000000..b00cf57419 --- /dev/null +++ b/target/linux/generic/backport-5.15/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch @@ -0,0 +1,359 @@ +From 66a8f7f04979f4ad739085f01d99c8caf620b4f5 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Tue, 18 Jan 2022 18:35:02 +0100 +Subject: [PATCH] of: base: make small of_parse_phandle() variants static + inline + +Make all the smaller variants of the of_parse_phandle() static inline. +This also let us remove the empty function stubs if CONFIG_OF is not +defined. + +Suggested-by: Rob Herring +Signed-off-by: Michael Walle +[robh: move index < 0 check into __of_parse_phandle_with_args] +Signed-off-by: Rob Herring +Link: https://lore.kernel.org/r/20220118173504.2867523-2-michael@walle.cc +--- + drivers/of/base.c | 131 +++------------------------------------ + include/linux/of.h | 148 ++++++++++++++++++++++++++++++++++++--------- + 2 files changed, 129 insertions(+), 150 deletions(-) + +--- a/drivers/of/base.c ++++ b/drivers/of/base.c +@@ -1371,15 +1371,18 @@ int of_phandle_iterator_args(struct of_p + return count; + } + +-static int __of_parse_phandle_with_args(const struct device_node *np, +- const char *list_name, +- const char *cells_name, +- int cell_count, int index, +- struct of_phandle_args *out_args) ++int __of_parse_phandle_with_args(const struct device_node *np, ++ const char *list_name, ++ const char *cells_name, ++ int cell_count, int index, ++ struct of_phandle_args *out_args) + { + struct of_phandle_iterator it; + int rc, cur_index = 0; + ++ if (index < 0) ++ return -EINVAL; ++ + /* Loop over the phandles until all the requested entry is found */ + of_for_each_phandle(&it, rc, np, list_name, cells_name, cell_count) { + /* +@@ -1422,82 +1425,7 @@ static int __of_parse_phandle_with_args( + of_node_put(it.node); + return rc; + } +- +-/** +- * of_parse_phandle - Resolve a phandle property to a device_node pointer +- * @np: Pointer to device node holding phandle property +- * @phandle_name: Name of property holding a phandle value +- * @index: For properties holding a table of phandles, this is the index into +- * the table +- * +- * Return: The device_node pointer with refcount incremented. Use +- * of_node_put() on it when done. +- */ +-struct device_node *of_parse_phandle(const struct device_node *np, +- const char *phandle_name, int index) +-{ +- struct of_phandle_args args; +- +- if (index < 0) +- return NULL; +- +- if (__of_parse_phandle_with_args(np, phandle_name, NULL, 0, +- index, &args)) +- return NULL; +- +- return args.np; +-} +-EXPORT_SYMBOL(of_parse_phandle); +- +-/** +- * of_parse_phandle_with_args() - Find a node pointed by phandle in a list +- * @np: pointer to a device tree node containing a list +- * @list_name: property name that contains a list +- * @cells_name: property name that specifies phandles' arguments count +- * @index: index of a phandle to parse out +- * @out_args: optional pointer to output arguments structure (will be filled) +- * +- * This function is useful to parse lists of phandles and their arguments. +- * Returns 0 on success and fills out_args, on error returns appropriate +- * errno value. +- * +- * Caller is responsible to call of_node_put() on the returned out_args->np +- * pointer. +- * +- * Example:: +- * +- * phandle1: node1 { +- * #list-cells = <2>; +- * }; +- * +- * phandle2: node2 { +- * #list-cells = <1>; +- * }; +- * +- * node3 { +- * list = <&phandle1 1 2 &phandle2 3>; +- * }; +- * +- * To get a device_node of the ``node2`` node you may call this: +- * of_parse_phandle_with_args(node3, "list", "#list-cells", 1, &args); +- */ +-int of_parse_phandle_with_args(const struct device_node *np, const char *list_name, +- const char *cells_name, int index, +- struct of_phandle_args *out_args) +-{ +- int cell_count = -1; +- +- if (index < 0) +- return -EINVAL; +- +- /* If cells_name is NULL we assume a cell count of 0 */ +- if (!cells_name) +- cell_count = 0; +- +- return __of_parse_phandle_with_args(np, list_name, cells_name, +- cell_count, index, out_args); +-} +-EXPORT_SYMBOL(of_parse_phandle_with_args); ++EXPORT_SYMBOL(__of_parse_phandle_with_args); + + /** + * of_parse_phandle_with_args_map() - Find a node pointed by phandle in a list and remap it +@@ -1684,47 +1612,6 @@ free: + EXPORT_SYMBOL(of_parse_phandle_with_args_map); + + /** +- * of_parse_phandle_with_fixed_args() - Find a node pointed by phandle in a list +- * @np: pointer to a device tree node containing a list +- * @list_name: property name that contains a list +- * @cell_count: number of argument cells following the phandle +- * @index: index of a phandle to parse out +- * @out_args: optional pointer to output arguments structure (will be filled) +- * +- * This function is useful to parse lists of phandles and their arguments. +- * Returns 0 on success and fills out_args, on error returns appropriate +- * errno value. +- * +- * Caller is responsible to call of_node_put() on the returned out_args->np +- * pointer. +- * +- * Example:: +- * +- * phandle1: node1 { +- * }; +- * +- * phandle2: node2 { +- * }; +- * +- * node3 { +- * list = <&phandle1 0 2 &phandle2 2 3>; +- * }; +- * +- * To get a device_node of the ``node2`` node you may call this: +- * of_parse_phandle_with_fixed_args(node3, "list", 2, 1, &args); +- */ +-int of_parse_phandle_with_fixed_args(const struct device_node *np, +- const char *list_name, int cell_count, +- int index, struct of_phandle_args *out_args) +-{ +- if (index < 0) +- return -EINVAL; +- return __of_parse_phandle_with_args(np, list_name, NULL, cell_count, +- index, out_args); +-} +-EXPORT_SYMBOL(of_parse_phandle_with_fixed_args); +- +-/** + * of_count_phandle_with_args() - Find the number of phandles references in a property + * @np: pointer to a device tree node containing a list + * @list_name: property name that contains a list +--- a/include/linux/of.h ++++ b/include/linux/of.h +@@ -363,18 +363,12 @@ extern const struct of_device_id *of_mat + const struct of_device_id *matches, const struct device_node *node); + extern int of_modalias_node(struct device_node *node, char *modalias, int len); + extern void of_print_phandle_args(const char *msg, const struct of_phandle_args *args); +-extern struct device_node *of_parse_phandle(const struct device_node *np, +- const char *phandle_name, +- int index); +-extern int of_parse_phandle_with_args(const struct device_node *np, +- const char *list_name, const char *cells_name, int index, +- struct of_phandle_args *out_args); ++extern int __of_parse_phandle_with_args(const struct device_node *np, ++ const char *list_name, const char *cells_name, int cell_count, ++ int index, struct of_phandle_args *out_args); + extern int of_parse_phandle_with_args_map(const struct device_node *np, + const char *list_name, const char *stem_name, int index, + struct of_phandle_args *out_args); +-extern int of_parse_phandle_with_fixed_args(const struct device_node *np, +- const char *list_name, int cells_count, int index, +- struct of_phandle_args *out_args); + extern int of_count_phandle_with_args(const struct device_node *np, + const char *list_name, const char *cells_name); + +@@ -864,18 +858,12 @@ static inline int of_property_read_strin + return -ENOSYS; + } + +-static inline struct device_node *of_parse_phandle(const struct device_node *np, +- const char *phandle_name, +- int index) +-{ +- return NULL; +-} +- +-static inline int of_parse_phandle_with_args(const struct device_node *np, +- const char *list_name, +- const char *cells_name, +- int index, +- struct of_phandle_args *out_args) ++static inline int __of_parse_phandle_with_args(const struct device_node *np, ++ const char *list_name, ++ const char *cells_name, ++ int cell_count, ++ int index, ++ struct of_phandle_args *out_args) + { + return -ENOSYS; + } +@@ -889,13 +877,6 @@ static inline int of_parse_phandle_with_ + return -ENOSYS; + } + +-static inline int of_parse_phandle_with_fixed_args(const struct device_node *np, +- const char *list_name, int cells_count, int index, +- struct of_phandle_args *out_args) +-{ +- return -ENOSYS; +-} +- + static inline int of_count_phandle_with_args(const struct device_node *np, + const char *list_name, + const char *cells_name) +@@ -1077,6 +1058,117 @@ static inline bool of_node_is_type(const + } + + /** ++ * of_parse_phandle - Resolve a phandle property to a device_node pointer ++ * @np: Pointer to device node holding phandle property ++ * @phandle_name: Name of property holding a phandle value ++ * @index: For properties holding a table of phandles, this is the index into ++ * the table ++ * ++ * Return: The device_node pointer with refcount incremented. Use ++ * of_node_put() on it when done. ++ */ ++static inline struct device_node *of_parse_phandle(const struct device_node *np, ++ const char *phandle_name, ++ int index) ++{ ++ struct of_phandle_args args; ++ ++ if (__of_parse_phandle_with_args(np, phandle_name, NULL, 0, ++ index, &args)) ++ return NULL; ++ ++ return args.np; ++} ++ ++/** ++ * of_parse_phandle_with_args() - Find a node pointed by phandle in a list ++ * @np: pointer to a device tree node containing a list ++ * @list_name: property name that contains a list ++ * @cells_name: property name that specifies phandles' arguments count ++ * @index: index of a phandle to parse out ++ * @out_args: optional pointer to output arguments structure (will be filled) ++ * ++ * This function is useful to parse lists of phandles and their arguments. ++ * Returns 0 on success and fills out_args, on error returns appropriate ++ * errno value. ++ * ++ * Caller is responsible to call of_node_put() on the returned out_args->np ++ * pointer. ++ * ++ * Example:: ++ * ++ * phandle1: node1 { ++ * #list-cells = <2>; ++ * }; ++ * ++ * phandle2: node2 { ++ * #list-cells = <1>; ++ * }; ++ * ++ * node3 { ++ * list = <&phandle1 1 2 &phandle2 3>; ++ * }; ++ * ++ * To get a device_node of the ``node2`` node you may call this: ++ * of_parse_phandle_with_args(node3, "list", "#list-cells", 1, &args); ++ */ ++static inline int of_parse_phandle_with_args(const struct device_node *np, ++ const char *list_name, ++ const char *cells_name, ++ int index, ++ struct of_phandle_args *out_args) ++{ ++ int cell_count = -1; ++ ++ /* If cells_name is NULL we assume a cell count of 0 */ ++ if (!cells_name) ++ cell_count = 0; ++ ++ return __of_parse_phandle_with_args(np, list_name, cells_name, ++ cell_count, index, out_args); ++} ++ ++/** ++ * of_parse_phandle_with_fixed_args() - Find a node pointed by phandle in a list ++ * @np: pointer to a device tree node containing a list ++ * @list_name: property name that contains a list ++ * @cell_count: number of argument cells following the phandle ++ * @index: index of a phandle to parse out ++ * @out_args: optional pointer to output arguments structure (will be filled) ++ * ++ * This function is useful to parse lists of phandles and their arguments. ++ * Returns 0 on success and fills out_args, on error returns appropriate ++ * errno value. ++ * ++ * Caller is responsible to call of_node_put() on the returned out_args->np ++ * pointer. ++ * ++ * Example:: ++ * ++ * phandle1: node1 { ++ * }; ++ * ++ * phandle2: node2 { ++ * }; ++ * ++ * node3 { ++ * list = <&phandle1 0 2 &phandle2 2 3>; ++ * }; ++ * ++ * To get a device_node of the ``node2`` node you may call this: ++ * of_parse_phandle_with_fixed_args(node3, "list", 2, 1, &args); ++ */ ++static inline int of_parse_phandle_with_fixed_args(const struct device_node *np, ++ const char *list_name, ++ int cell_count, ++ int index, ++ struct of_phandle_args *out_args) ++{ ++ return __of_parse_phandle_with_args(np, list_name, NULL, cell_count, ++ index, out_args); ++} ++ ++/** + * of_property_count_u8_elems - Count the number of u8 elements in a property + * + * @np: device node from which the property value is to be read. diff --git a/target/linux/generic/backport-5.15/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch b/target/linux/generic/backport-5.15/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch new file mode 100644 index 0000000000..2b2a60e096 --- /dev/null +++ b/target/linux/generic/backport-5.15/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch @@ -0,0 +1,58 @@ +From c5d264d4b527c96ae8903376a4b195df47b05203 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Mon, 6 Feb 2023 13:43:43 +0000 +Subject: [PATCH] of: base: add of_parse_phandle_with_optional_args() + +Add a new variant of the of_parse_phandle_with_args() which treats the +cells name as optional. If it's missing, it is assumed that the phandle +has no arguments. + +Up until now, a nvmem node didn't have any arguments, so all the device +trees haven't any '#*-cells' property. But there is a need for an +additional argument for the phandle, for which we need a '#*-cells' +property. Therefore, we need to support nvmem nodes with and without +this property. + +Signed-off-by: Michael Walle +Reviewed-by: Rob Herring +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-10-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + include/linux/of.h | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +--- a/include/linux/of.h ++++ b/include/linux/of.h +@@ -1169,6 +1169,31 @@ static inline int of_parse_phandle_with_ + } + + /** ++ * of_parse_phandle_with_optional_args() - Find a node pointed by phandle in a list ++ * @np: pointer to a device tree node containing a list ++ * @list_name: property name that contains a list ++ * @cells_name: property name that specifies phandles' arguments count ++ * @index: index of a phandle to parse out ++ * @out_args: optional pointer to output arguments structure (will be filled) ++ * ++ * Same as of_parse_phandle_with_args() except that if the cells_name property ++ * is not found, cell_count of 0 is assumed. ++ * ++ * This is used to useful, if you have a phandle which didn't have arguments ++ * before and thus doesn't have a '#*-cells' property but is now migrated to ++ * having arguments while retaining backwards compatibility. ++ */ ++static inline int of_parse_phandle_with_optional_args(const struct device_node *np, ++ const char *list_name, ++ const char *cells_name, ++ int index, ++ struct of_phandle_args *out_args) ++{ ++ return __of_parse_phandle_with_args(np, list_name, cells_name, ++ 0, index, out_args); ++} ++ ++/** + * of_property_count_u8_elems - Count the number of u8 elements in a property + * + * @np: device node from which the property value is to be read. diff --git a/target/linux/generic/backport-5.15/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch b/target/linux/generic/backport-5.15/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch new file mode 100644 index 0000000000..39d9fae723 --- /dev/null +++ b/target/linux/generic/backport-5.15/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch @@ -0,0 +1,34 @@ +From ff24fed10ba414d19579e26e60b126fad2f2bb07 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Mon, 6 Feb 2023 13:43:44 +0000 +Subject: [PATCH] of: property: make #.*-cells optional for simple props + +Sometimes, future bindings for phandles will get additional arguments. +Thus the target node of the phandle will need a new #.*-cells property. +To be backwards compatible, this needs to be optional. + +Prepare the DEFINE_SIMPLE_PROPS() to handle the cells name as optional. + +Signed-off-by: Michael Walle +Tested-by: Miquel Raynal +Reviewed-by: Rob Herring +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-11-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/of/property.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/of/property.c ++++ b/drivers/of/property.c +@@ -1173,8 +1173,8 @@ static struct device_node *parse_prop_ce + if (strcmp(prop_name, list_name)) + return NULL; + +- if (of_parse_phandle_with_args(np, list_name, cells_name, index, +- &sup_args)) ++ if (__of_parse_phandle_with_args(np, list_name, cells_name, 0, index, ++ &sup_args)) + return NULL; + + return sup_args.np; diff --git a/target/linux/generic/backport-5.15/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch b/target/linux/generic/backport-5.15/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch new file mode 100644 index 0000000000..774e793ca5 --- /dev/null +++ b/target/linux/generic/backport-5.15/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch @@ -0,0 +1,30 @@ +From e2d8172043d2e50df19fcd59c11e5593de8188d7 Mon Sep 17 00:00:00 2001 +From: Michael Walle +Date: Mon, 6 Feb 2023 13:43:45 +0000 +Subject: [PATCH] of: property: add #nvmem-cell-cells property + +Bindings describe the new '#nvmem-cell-cells' property. Now that the +arguments count property is optional, we just add this property to the +nvmem-cells. + +Signed-off-by: Michael Walle +Tested-by: Miquel Raynal +Reviewed-by: Rob Herring +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230206134356.839737-12-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/of/property.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/of/property.c ++++ b/drivers/of/property.c +@@ -1276,7 +1276,7 @@ DEFINE_SIMPLE_PROP(dmas, "dmas", "#dma-c + DEFINE_SIMPLE_PROP(power_domains, "power-domains", "#power-domain-cells") + DEFINE_SIMPLE_PROP(hwlocks, "hwlocks", "#hwlock-cells") + DEFINE_SIMPLE_PROP(extcon, "extcon", NULL) +-DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", NULL) ++DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", "#nvmem-cell-cells") + DEFINE_SIMPLE_PROP(phys, "phys", "#phy-cells") + DEFINE_SIMPLE_PROP(wakeup_parent, "wakeup-parent", NULL) + DEFINE_SIMPLE_PROP(pinctrl0, "pinctrl-0", NULL) diff --git a/target/linux/generic/backport-5.15/827-v6.3-0004-of-device-Ignore-modalias-of-reused-nodes.patch b/target/linux/generic/backport-5.15/827-v6.3-0004-of-device-Ignore-modalias-of-reused-nodes.patch new file mode 100644 index 0000000000..37eefc4570 --- /dev/null +++ b/target/linux/generic/backport-5.15/827-v6.3-0004-of-device-Ignore-modalias-of-reused-nodes.patch @@ -0,0 +1,37 @@ +From 553bd29700145e1849698985e9800f14e967da49 Mon Sep 17 00:00:00 2001 +From: Alexander Stein +Date: Tue, 7 Feb 2023 12:05:29 +0100 +Subject: [PATCH] of: device: Ignore modalias of reused nodes + +If of_node is reused, do not use that node's modalias. This will hide +the name of the actual device. This is rather prominent in USB glue +drivers creating a platform device for the host controller. + +Signed-off-by: Alexander Stein +Reviewed-by: Rob Herring +Link: https://lore.kernel.org/r/20230207110531.1060252-2-alexander.stein@ew.tq-group.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/of/device.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/of/device.c ++++ b/drivers/of/device.c +@@ -249,7 +249,7 @@ static ssize_t of_device_get_modalias(st + ssize_t csize; + ssize_t tsize; + +- if ((!dev) || (!dev->of_node)) ++ if ((!dev) || (!dev->of_node) || dev->of_node_reused) + return -ENODEV; + + /* Name & Type */ +@@ -372,7 +372,7 @@ int of_device_uevent_modalias(struct dev + { + int sl; + +- if ((!dev) || (!dev->of_node)) ++ if ((!dev) || (!dev->of_node) || dev->of_node_reused) + return -ENODEV; + + /* Devicetree modalias is tricky, we add it in 2 steps */ diff --git a/target/linux/generic/backport-5.15/827-v6.3-0005-of-device-Do-not-ignore-error-code-in-of_device_ueve.patch b/target/linux/generic/backport-5.15/827-v6.3-0005-of-device-Do-not-ignore-error-code-in-of_device_ueve.patch new file mode 100644 index 0000000000..dd5820e94a --- /dev/null +++ b/target/linux/generic/backport-5.15/827-v6.3-0005-of-device-Do-not-ignore-error-code-in-of_device_ueve.patch @@ -0,0 +1,29 @@ +From 2295bed9bebe8d1eef276194fed5b5fbe89c5363 Mon Sep 17 00:00:00 2001 +From: Alexander Stein +Date: Tue, 7 Feb 2023 12:05:30 +0100 +Subject: [PATCH] of: device: Do not ignore error code in + of_device_uevent_modalias + +of_device_get_modalias might return an error code, propagate that one. +Otherwise the negative, signed integer is propagated to unsigned integer +for the comparison resulting in a huge 'sl' size. + +Signed-off-by: Alexander Stein +Reviewed-by: Rob Herring +Link: https://lore.kernel.org/r/20230207110531.1060252-3-alexander.stein@ew.tq-group.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/of/device.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/of/device.c ++++ b/drivers/of/device.c +@@ -381,6 +381,8 @@ int of_device_uevent_modalias(struct dev + + sl = of_device_get_modalias(dev, &env->buf[env->buflen-1], + sizeof(env->buf) - env->buflen); ++ if (sl < 0) ++ return sl; + if (sl >= (sizeof(env->buf) - env->buflen)) + return -ENOMEM; + env->buflen += sl; diff --git a/target/linux/generic/backport-5.15/828-v6.4-0002-of-Update-of_device_get_modalias.patch b/target/linux/generic/backport-5.15/828-v6.4-0002-of-Update-of_device_get_modalias.patch new file mode 100644 index 0000000000..4713cc71b1 --- /dev/null +++ b/target/linux/generic/backport-5.15/828-v6.4-0002-of-Update-of_device_get_modalias.patch @@ -0,0 +1,103 @@ +From 5c3d15e127ebfc0754cd18def7124633b6d46672 Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 4 Apr 2023 18:21:15 +0100 +Subject: [PATCH] of: Update of_device_get_modalias() + +This function only needs a "struct device_node" to work, but for +convenience the author (and only user) of this helper did use a "struct +device" and put it in device.c. + +Let's convert this helper to take a "struct device node" instead. This +change asks for two additional changes: renaming it "of_modalias()" +to fit the current naming, and moving it outside of device.c which will +be done in a follow-up commit. + +Signed-off-by: Miquel Raynal +Reviewed-by: Rob Herring +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-8-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/of/device.c | 29 +++++++++++++++++------------ + 1 file changed, 17 insertions(+), 12 deletions(-) + +--- a/drivers/of/device.c ++++ b/drivers/of/device.c +@@ -241,7 +241,7 @@ const void *of_device_get_match_data(con + } + EXPORT_SYMBOL(of_device_get_match_data); + +-static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len) ++static ssize_t of_modalias(const struct device_node *np, char *str, ssize_t len) + { + const char *compat; + char *c; +@@ -249,19 +249,16 @@ static ssize_t of_device_get_modalias(st + ssize_t csize; + ssize_t tsize; + +- if ((!dev) || (!dev->of_node) || dev->of_node_reused) +- return -ENODEV; +- + /* Name & Type */ + /* %p eats all alphanum characters, so %c must be used here */ +- csize = snprintf(str, len, "of:N%pOFn%c%s", dev->of_node, 'T', +- of_node_get_device_type(dev->of_node)); ++ csize = snprintf(str, len, "of:N%pOFn%c%s", np, 'T', ++ of_node_get_device_type(np)); + tsize = csize; + len -= csize; + if (str) + str += csize; + +- of_property_for_each_string(dev->of_node, "compatible", p, compat) { ++ of_property_for_each_string(np, "compatible", p, compat) { + csize = strlen(compat) + 1; + tsize += csize; + if (csize > len) +@@ -286,7 +283,10 @@ int of_device_request_module(struct devi + ssize_t size; + int ret; + +- size = of_device_get_modalias(dev, NULL, 0); ++ if (!dev || !dev->of_node) ++ return -ENODEV; ++ ++ size = of_modalias(dev->of_node, NULL, 0); + if (size < 0) + return size; + +@@ -297,7 +297,7 @@ int of_device_request_module(struct devi + if (!str) + return -ENOMEM; + +- of_device_get_modalias(dev, str, size); ++ of_modalias(dev->of_node, str, size); + str[size - 1] = '\0'; + ret = request_module(str); + kfree(str); +@@ -314,7 +314,12 @@ EXPORT_SYMBOL_GPL(of_device_request_modu + */ + ssize_t of_device_modalias(struct device *dev, char *str, ssize_t len) + { +- ssize_t sl = of_device_get_modalias(dev, str, len - 2); ++ ssize_t sl; ++ ++ if (!dev || !dev->of_node || dev->of_node_reused) ++ return -ENODEV; ++ ++ sl = of_modalias(dev->of_node, str, len - 2); + if (sl < 0) + return sl; + if (sl > len - 2) +@@ -379,8 +384,8 @@ int of_device_uevent_modalias(struct dev + if (add_uevent_var(env, "MODALIAS=")) + return -ENOMEM; + +- sl = of_device_get_modalias(dev, &env->buf[env->buflen-1], +- sizeof(env->buf) - env->buflen); ++ sl = of_modalias(dev->of_node, &env->buf[env->buflen-1], ++ sizeof(env->buf) - env->buflen); + if (sl < 0) + return sl; + if (sl >= (sizeof(env->buf) - env->buflen)) diff --git a/target/linux/generic/backport-5.15/828-v6.4-0003-of-Rename-of_modalias_node.patch b/target/linux/generic/backport-5.15/828-v6.4-0003-of-Rename-of_modalias_node.patch new file mode 100644 index 0000000000..6c20521701 --- /dev/null +++ b/target/linux/generic/backport-5.15/828-v6.4-0003-of-Rename-of_modalias_node.patch @@ -0,0 +1,173 @@ +From 673aa1ed1c9b6710bf24e3f0957d85e2f46c77db Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 4 Apr 2023 18:21:16 +0100 +Subject: [PATCH] of: Rename of_modalias_node() + +This helper does not produce a real modalias, but tries to get the +"product" compatible part of the "vendor,product" compatibles only. It +is far from creating a purely useful modalias string and does not seem +to be used like that directly anyway, so let's try to give this helper a +more meaningful name before moving there a real modalias helper (already +existing under of/device.c). + +Also update the various documentations to refer to the strings as +"aliases" rather than "modaliases" which has a real meaning in the Linux +kernel. + +There is no functional change. + +Cc: Rafael J. Wysocki +Cc: Len Brown +Cc: Maarten Lankhorst +Cc: Maxime Ripard +Cc: Thomas Zimmermann +Cc: Sebastian Reichel +Cc: Wolfram Sang +Cc: Mark Brown +Signed-off-by: Miquel Raynal +Reviewed-by: Rob Herring +Acked-by: Mark Brown +Signed-off-by: Srinivas Kandagatla +Acked-by: Sebastian Reichel +Link: https://lore.kernel.org/r/20230404172148.82422-9-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/acpi/bus.c | 7 ++++--- + drivers/gpu/drm/drm_mipi_dsi.c | 2 +- + drivers/hsi/hsi_core.c | 2 +- + drivers/i2c/busses/i2c-powermac.c | 2 +- + drivers/i2c/i2c-core-of.c | 2 +- + drivers/of/base.c | 18 +++++++++++------- + drivers/spi/spi.c | 4 ++-- + include/linux/of.h | 3 ++- + 8 files changed, 23 insertions(+), 17 deletions(-) + +--- a/drivers/acpi/bus.c ++++ b/drivers/acpi/bus.c +@@ -785,9 +785,10 @@ static bool acpi_of_modalias(struct acpi + * @modalias: Pointer to buffer that modalias value will be copied into + * @len: Length of modalias buffer + * +- * This is a counterpart of of_modalias_node() for struct acpi_device objects. +- * If there is a compatible string for @adev, it will be copied to @modalias +- * with the vendor prefix stripped; otherwise, @default_id will be used. ++ * This is a counterpart of of_alias_from_compatible() for struct acpi_device ++ * objects. If there is a compatible string for @adev, it will be copied to ++ * @modalias with the vendor prefix stripped; otherwise, @default_id will be ++ * used. + */ + void acpi_set_modalias(struct acpi_device *adev, const char *default_id, + char *modalias, size_t len) +--- a/drivers/gpu/drm/drm_mipi_dsi.c ++++ b/drivers/gpu/drm/drm_mipi_dsi.c +@@ -160,7 +160,7 @@ of_mipi_dsi_device_add(struct mipi_dsi_h + int ret; + u32 reg; + +- if (of_modalias_node(node, info.type, sizeof(info.type)) < 0) { ++ if (of_alias_from_compatible(node, info.type, sizeof(info.type)) < 0) { + drm_err(host, "modalias failure on %pOF\n", node); + return ERR_PTR(-EINVAL); + } +--- a/drivers/hsi/hsi_core.c ++++ b/drivers/hsi/hsi_core.c +@@ -207,7 +207,7 @@ static void hsi_add_client_from_dt(struc + if (!cl) + return; + +- err = of_modalias_node(client, name, sizeof(name)); ++ err = of_alias_from_compatible(client, name, sizeof(name)); + if (err) + goto err; + +--- a/drivers/i2c/busses/i2c-powermac.c ++++ b/drivers/i2c/busses/i2c-powermac.c +@@ -284,7 +284,7 @@ static bool i2c_powermac_get_type(struct + */ + + /* First try proper modalias */ +- if (of_modalias_node(node, tmp, sizeof(tmp)) >= 0) { ++ if (of_alias_from_compatible(node, tmp, sizeof(tmp)) >= 0) { + snprintf(type, type_size, "MAC,%s", tmp); + return true; + } +--- a/drivers/i2c/i2c-core-of.c ++++ b/drivers/i2c/i2c-core-of.c +@@ -27,7 +27,7 @@ int of_i2c_get_board_info(struct device + + memset(info, 0, sizeof(*info)); + +- if (of_modalias_node(node, info->type, sizeof(info->type)) < 0) { ++ if (of_alias_from_compatible(node, info->type, sizeof(info->type)) < 0) { + dev_err(dev, "of_i2c: modalias failure on %pOF\n", node); + return -EINVAL; + } +--- a/drivers/of/base.c ++++ b/drivers/of/base.c +@@ -1159,19 +1159,23 @@ struct device_node *of_find_matching_nod + EXPORT_SYMBOL(of_find_matching_node_and_match); + + /** +- * of_modalias_node - Lookup appropriate modalias for a device node ++ * of_alias_from_compatible - Lookup appropriate alias for a device node ++ * depending on compatible + * @node: pointer to a device tree node +- * @modalias: Pointer to buffer that modalias value will be copied into +- * @len: Length of modalias value ++ * @alias: Pointer to buffer that alias value will be copied into ++ * @len: Length of alias value + * + * Based on the value of the compatible property, this routine will attempt +- * to choose an appropriate modalias value for a particular device tree node. ++ * to choose an appropriate alias value for a particular device tree node. + * It does this by stripping the manufacturer prefix (as delimited by a ',') + * from the first entry in the compatible list property. + * ++ * Note: The matching on just the "product" side of the compatible is a relic ++ * from I2C and SPI. Please do not add any new user. ++ * + * Return: This routine returns 0 on success, <0 on failure. + */ +-int of_modalias_node(struct device_node *node, char *modalias, int len) ++int of_alias_from_compatible(const struct device_node *node, char *alias, int len) + { + const char *compatible, *p; + int cplen; +@@ -1180,10 +1184,10 @@ int of_modalias_node(struct device_node + if (!compatible || strlen(compatible) > cplen) + return -ENODEV; + p = strchr(compatible, ','); +- strlcpy(modalias, p ? p + 1 : compatible, len); ++ strlcpy(alias, p ? p + 1 : compatible, len); + return 0; + } +-EXPORT_SYMBOL_GPL(of_modalias_node); ++EXPORT_SYMBOL_GPL(of_alias_from_compatible); + + /** + * of_find_node_by_phandle - Find a node given a phandle +--- a/drivers/spi/spi.c ++++ b/drivers/spi/spi.c +@@ -2128,8 +2128,8 @@ of_register_spi_device(struct spi_contro + } + + /* Select device driver */ +- rc = of_modalias_node(nc, spi->modalias, +- sizeof(spi->modalias)); ++ rc = of_alias_from_compatible(nc, spi->modalias, ++ sizeof(spi->modalias)); + if (rc < 0) { + dev_err(&ctlr->dev, "cannot find modalias for %pOF\n", nc); + goto err_out; +--- a/include/linux/of.h ++++ b/include/linux/of.h +@@ -361,7 +361,8 @@ extern int of_n_addr_cells(struct device + extern int of_n_size_cells(struct device_node *np); + extern const struct of_device_id *of_match_node( + const struct of_device_id *matches, const struct device_node *node); +-extern int of_modalias_node(struct device_node *node, char *modalias, int len); ++extern int of_alias_from_compatible(const struct device_node *node, char *alias, ++ int len); + extern void of_print_phandle_args(const char *msg, const struct of_phandle_args *args); + extern int __of_parse_phandle_with_args(const struct device_node *np, + const char *list_name, const char *cells_name, int cell_count, diff --git a/target/linux/generic/backport-5.15/828-v6.4-0004-of-Move-of_modalias-to-module.c.patch b/target/linux/generic/backport-5.15/828-v6.4-0004-of-Move-of_modalias-to-module.c.patch new file mode 100644 index 0000000000..a70c6f2eec --- /dev/null +++ b/target/linux/generic/backport-5.15/828-v6.4-0004-of-Move-of_modalias-to-module.c.patch @@ -0,0 +1,160 @@ +From bd7a7ed774afd1a4174df34227626c95573be517 Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 4 Apr 2023 18:21:17 +0100 +Subject: [PATCH] of: Move of_modalias() to module.c + +Create a specific .c file for OF related module handling. +Move of_modalias() inside as a first step. + +The helper is exposed through of.h even though it is only used by core +files because the users from device.c will soon be split into an OF-only +helper in module.c as well as a device-oriented inline helper in +of_device.h. Putting this helper in of_private.h would require to +include of_private.h from of_device.h, which is not acceptable. + +Suggested-by: Rob Herring +Signed-off-by: Miquel Raynal +Reviewed-by: Rob Herring +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-10-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/of/Makefile | 2 +- + drivers/of/device.c | 37 ------------------------------------- + drivers/of/module.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ + include/linux/of.h | 9 +++++++++ + 4 files changed, 54 insertions(+), 38 deletions(-) + create mode 100644 drivers/of/module.c + +--- a/drivers/of/Makefile ++++ b/drivers/of/Makefile +@@ -1,5 +1,5 @@ + # SPDX-License-Identifier: GPL-2.0 +-obj-y = base.o device.o platform.o property.o ++obj-y = base.o device.o module.o platform.o property.o + obj-$(CONFIG_OF_KOBJ) += kobj.o + obj-$(CONFIG_OF_DYNAMIC) += dynamic.o + obj-$(CONFIG_OF_FLATTREE) += fdt.o +--- a/drivers/of/device.c ++++ b/drivers/of/device.c +@@ -1,5 +1,4 @@ + // SPDX-License-Identifier: GPL-2.0 +-#include + #include + #include + #include +@@ -241,42 +240,6 @@ const void *of_device_get_match_data(con + } + EXPORT_SYMBOL(of_device_get_match_data); + +-static ssize_t of_modalias(const struct device_node *np, char *str, ssize_t len) +-{ +- const char *compat; +- char *c; +- struct property *p; +- ssize_t csize; +- ssize_t tsize; +- +- /* Name & Type */ +- /* %p eats all alphanum characters, so %c must be used here */ +- csize = snprintf(str, len, "of:N%pOFn%c%s", np, 'T', +- of_node_get_device_type(np)); +- tsize = csize; +- len -= csize; +- if (str) +- str += csize; +- +- of_property_for_each_string(np, "compatible", p, compat) { +- csize = strlen(compat) + 1; +- tsize += csize; +- if (csize > len) +- continue; +- +- csize = snprintf(str, len, "C%s", compat); +- for (c = str; c; ) { +- c = strchr(c, ' '); +- if (c) +- *c++ = '_'; +- } +- len -= csize; +- str += csize; +- } +- +- return tsize; +-} +- + int of_device_request_module(struct device *dev) + { + char *str; +--- /dev/null ++++ b/drivers/of/module.c +@@ -0,0 +1,44 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Linux kernel module helpers. ++ */ ++ ++#include ++#include ++#include ++ ++ssize_t of_modalias(const struct device_node *np, char *str, ssize_t len) ++{ ++ const char *compat; ++ char *c; ++ struct property *p; ++ ssize_t csize; ++ ssize_t tsize; ++ ++ /* Name & Type */ ++ /* %p eats all alphanum characters, so %c must be used here */ ++ csize = snprintf(str, len, "of:N%pOFn%c%s", np, 'T', ++ of_node_get_device_type(np)); ++ tsize = csize; ++ len -= csize; ++ if (str) ++ str += csize; ++ ++ of_property_for_each_string(np, "compatible", p, compat) { ++ csize = strlen(compat) + 1; ++ tsize += csize; ++ if (csize > len) ++ continue; ++ ++ csize = snprintf(str, len, "C%s", compat); ++ for (c = str; c; ) { ++ c = strchr(c, ' '); ++ if (c) ++ *c++ = '_'; ++ } ++ len -= csize; ++ str += csize; ++ } ++ ++ return tsize; ++} +--- a/include/linux/of.h ++++ b/include/linux/of.h +@@ -373,6 +373,9 @@ extern int of_parse_phandle_with_args_ma + extern int of_count_phandle_with_args(const struct device_node *np, + const char *list_name, const char *cells_name); + ++/* module functions */ ++extern ssize_t of_modalias(const struct device_node *np, char *str, ssize_t len); ++ + /* phandle iterator functions */ + extern int of_phandle_iterator_init(struct of_phandle_iterator *it, + const struct device_node *np, +@@ -885,6 +888,12 @@ static inline int of_count_phandle_with_ + return -ENOSYS; + } + ++static inline ssize_t of_modalias(const struct device_node *np, char *str, ++ ssize_t len) ++{ ++ return -ENODEV; ++} ++ + static inline int of_phandle_iterator_init(struct of_phandle_iterator *it, + const struct device_node *np, + const char *list_name, diff --git a/target/linux/generic/backport-5.15/828-v6.4-0005-of-Move-the-request-module-helper-logic-to-module.c.patch b/target/linux/generic/backport-5.15/828-v6.4-0005-of-Move-the-request-module-helper-logic-to-module.c.patch new file mode 100644 index 0000000000..06bc24ca6e --- /dev/null +++ b/target/linux/generic/backport-5.15/828-v6.4-0005-of-Move-the-request-module-helper-logic-to-module.c.patch @@ -0,0 +1,131 @@ +From e6506f06d5e82765666902ccf9e9162f3e31d518 Mon Sep 17 00:00:00 2001 +From: Miquel Raynal +Date: Tue, 4 Apr 2023 18:21:18 +0100 +Subject: [PATCH] of: Move the request module helper logic to module.c + +Depending on device.c for pure OF handling is considered +backwards. Let's extract the content of of_device_request_module() to +have the real logic under module.c. + +The next step will be to convert users of of_device_request_module() to +use the new helper. + +Signed-off-by: Miquel Raynal +Reviewed-by: Rob Herring +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20230404172148.82422-11-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/of/device.c | 25 ++----------------------- + drivers/of/module.c | 30 ++++++++++++++++++++++++++++++ + include/linux/of.h | 6 ++++++ + 3 files changed, 38 insertions(+), 23 deletions(-) + +--- a/drivers/of/device.c ++++ b/drivers/of/device.c +@@ -8,7 +8,6 @@ + #include /* for bus_dma_region */ + #include + #include +-#include + #include + #include + #include +@@ -242,30 +241,10 @@ EXPORT_SYMBOL(of_device_get_match_data); + + int of_device_request_module(struct device *dev) + { +- char *str; +- ssize_t size; +- int ret; +- +- if (!dev || !dev->of_node) ++ if (!dev) + return -ENODEV; + +- size = of_modalias(dev->of_node, NULL, 0); +- if (size < 0) +- return size; +- +- /* Reserve an additional byte for the trailing '\0' */ +- size++; +- +- str = kmalloc(size, GFP_KERNEL); +- if (!str) +- return -ENOMEM; +- +- of_modalias(dev->of_node, str, size); +- str[size - 1] = '\0'; +- ret = request_module(str); +- kfree(str); +- +- return ret; ++ return of_request_module(dev->of_node); + } + EXPORT_SYMBOL_GPL(of_device_request_module); + +--- a/drivers/of/module.c ++++ b/drivers/of/module.c +@@ -4,6 +4,7 @@ + */ + + #include ++#include + #include + #include + +@@ -42,3 +43,32 @@ ssize_t of_modalias(const struct device_ + + return tsize; + } ++ ++int of_request_module(const struct device_node *np) ++{ ++ char *str; ++ ssize_t size; ++ int ret; ++ ++ if (!np) ++ return -ENODEV; ++ ++ size = of_modalias(np, NULL, 0); ++ if (size < 0) ++ return size; ++ ++ /* Reserve an additional byte for the trailing '\0' */ ++ size++; ++ ++ str = kmalloc(size, GFP_KERNEL); ++ if (!str) ++ return -ENOMEM; ++ ++ of_modalias(np, str, size); ++ str[size - 1] = '\0'; ++ ret = request_module(str); ++ kfree(str); ++ ++ return ret; ++} ++EXPORT_SYMBOL_GPL(of_request_module); +--- a/include/linux/of.h ++++ b/include/linux/of.h +@@ -375,6 +375,7 @@ extern int of_count_phandle_with_args(co + + /* module functions */ + extern ssize_t of_modalias(const struct device_node *np, char *str, ssize_t len); ++extern int of_request_module(const struct device_node *np); + + /* phandle iterator functions */ + extern int of_phandle_iterator_init(struct of_phandle_iterator *it, +@@ -893,6 +894,11 @@ static inline ssize_t of_modalias(const + { + return -ENODEV; + } ++ ++static inline int of_request_module(const struct device_node *np) ++{ ++ return -ENODEV; ++} + + static inline int of_phandle_iterator_init(struct of_phandle_iterator *it, + const struct device_node *np, diff --git a/target/linux/generic/backport-5.15/860-v5.17-MIPS-ath79-drop-_machine_restart-again.patch b/target/linux/generic/backport-5.15/860-v5.17-MIPS-ath79-drop-_machine_restart-again.patch new file mode 100644 index 0000000000..e9d692b651 --- /dev/null +++ b/target/linux/generic/backport-5.15/860-v5.17-MIPS-ath79-drop-_machine_restart-again.patch @@ -0,0 +1,49 @@ +From d3115128bdafb62628ab41861a4f06f6d02ac320 Mon Sep 17 00:00:00 2001 +From: Lech Perczak +Date: Mon, 10 Jan 2022 23:48:44 +0100 +Subject: MIPS: ath79: drop _machine_restart again + +Commit 81424d0ad0d4 ("MIPS: ath79: Use the reset controller to restart +OF machines") removed setup of _machine_restart on OF machines to use +reset handler in reset controller driver. +While removing remnants of non-OF machines in commit 3a77e0d75eed +("MIPS: ath79: drop machfiles"), this was introduced again, making it +impossible to use additional restart handlers registered through device +tree. Drop setting _machine_restart altogether, and ath79_restart +function, which is no longer used after this. + +Fixes: 3a77e0d75eed ("MIPS: ath79: drop machfiles") +Cc: John Crispin +Cc: Florian Fainelli +Signed-off-by: Lech Perczak +Signed-off-by: Thomas Bogendoerfer +--- + arch/mips/ath79/setup.c | 10 ---------- + 1 file changed, 10 deletions(-) + +--- a/arch/mips/ath79/setup.c ++++ b/arch/mips/ath79/setup.c +@@ -34,15 +34,6 @@ + + static char ath79_sys_type[ATH79_SYS_TYPE_LEN]; + +-static void ath79_restart(char *command) +-{ +- local_irq_disable(); +- ath79_device_reset_set(AR71XX_RESET_FULL_CHIP); +- for (;;) +- if (cpu_wait) +- cpu_wait(); +-} +- + static void ath79_halt(void) + { + while (1) +@@ -234,7 +225,6 @@ void __init plat_mem_setup(void) + + detect_memory_region(0, ATH79_MEM_SIZE_MIN, ATH79_MEM_SIZE_MAX); + +- _machine_restart = ath79_restart; + _machine_halt = ath79_halt; + pm_power_off = ath79_halt; + } diff --git a/target/linux/generic/backport-5.10/870-hwmon-next-hwmon-lm70-Add-ti-tmp125-support.patch b/target/linux/generic/backport-5.15/870-v5.18-hwmon-lm70-Add-ti-tmp125-support.patch similarity index 100% rename from target/linux/generic/backport-5.10/870-hwmon-next-hwmon-lm70-Add-ti-tmp125-support.patch rename to target/linux/generic/backport-5.15/870-v5.18-hwmon-lm70-Add-ti-tmp125-support.patch diff --git a/target/linux/generic/backport-5.15/880-v5.19-cdc_ether-export-usbnet_cdc_zte_rx_fixup.patch b/target/linux/generic/backport-5.15/880-v5.19-cdc_ether-export-usbnet_cdc_zte_rx_fixup.patch new file mode 100644 index 0000000000..39fdb32773 --- /dev/null +++ b/target/linux/generic/backport-5.15/880-v5.19-cdc_ether-export-usbnet_cdc_zte_rx_fixup.patch @@ -0,0 +1,58 @@ +From a79a5613e1907e1bf09bb6ba6fd5ff43b66c1afe Mon Sep 17 00:00:00 2001 +From: Lech Perczak +Date: Fri, 1 Apr 2022 22:03:55 +0200 +Subject: [PATCH 1/3] cdc_ether: export usbnet_cdc_zte_rx_fixup +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Commit bfe9b9d2df66 ("cdc_ether: Improve ZTE MF823/831/910 handling") +introduces a workaround for certain ZTE modems reporting invalid MAC +addresses over CDC-ECM. +The same issue was present on their RNDIS interface,which was fixed in +commit a5a18bdf7453 ("rndis_host: Set valid random MAC on buggy devices"). + +However, internal modem of ZTE MF286R router, on its RNDIS interface, also +exhibits a second issue fixed already in CDC-ECM, of the device not +respecting configured random MAC address. In order to share the fixup for +this with rndis_host driver, export the workaround function, which will +be re-used in the following commit in rndis_host. + +Cc: Kristian Evensen +Cc: Bjørn Mork +Cc: Oliver Neukum +Signed-off-by: Lech Perczak +--- + drivers/net/usb/cdc_ether.c | 3 ++- + include/linux/usb/usbnet.h | 1 + + 2 files changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/net/usb/cdc_ether.c ++++ b/drivers/net/usb/cdc_ether.c +@@ -479,7 +479,7 @@ static int usbnet_cdc_zte_bind(struct us + * device MAC address has been updated). Always set MAC address to that of the + * device. + */ +-static int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb) ++int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb) + { + if (skb->len < ETH_HLEN || !(skb->data[0] & 0x02)) + return 1; +@@ -489,6 +489,7 @@ static int usbnet_cdc_zte_rx_fixup(struc + + return 1; + } ++EXPORT_SYMBOL_GPL(usbnet_cdc_zte_rx_fixup); + + /* Ensure correct link state + * +--- a/include/linux/usb/usbnet.h ++++ b/include/linux/usb/usbnet.h +@@ -214,6 +214,7 @@ extern int usbnet_ether_cdc_bind(struct + extern int usbnet_cdc_bind(struct usbnet *, struct usb_interface *); + extern void usbnet_cdc_unbind(struct usbnet *, struct usb_interface *); + extern void usbnet_cdc_status(struct usbnet *, struct urb *); ++extern int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb); + + /* CDC and RNDIS support the same host-chosen packet filters for IN transfers */ + #define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \ diff --git a/target/linux/generic/backport-5.15/881-v5.19-rndis_host-enable-the-bogus-MAC-fixup-for-ZTE-device.patch b/target/linux/generic/backport-5.15/881-v5.19-rndis_host-enable-the-bogus-MAC-fixup-for-ZTE-device.patch new file mode 100644 index 0000000000..71a6df8102 --- /dev/null +++ b/target/linux/generic/backport-5.15/881-v5.19-rndis_host-enable-the-bogus-MAC-fixup-for-ZTE-device.patch @@ -0,0 +1,118 @@ +From aa8aff10e969aca0cb64f5e54ff7489355582667 Mon Sep 17 00:00:00 2001 +From: Lech Perczak +Date: Fri, 1 Apr 2022 22:04:01 +0200 +Subject: [PATCH 2/3] rndis_host: enable the bogus MAC fixup for ZTE devices + from cdc_ether +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Certain ZTE modems, namely: MF823. MF831, MF910, built-in modem from +MF286R, expose both CDC-ECM and RNDIS network interfaces. +They have a trait of ignoring the locally-administered MAC address +configured on the interface both in CDC-ECM and RNDIS part, +and this leads to dropping of incoming traffic by the host. +However, the workaround was only present in CDC-ECM, and MF286R +explicitly requires it in RNDIS mode. + +Re-use the workaround in rndis_host as well, to fix operation of MF286R +module, some versions of which expose only the RNDIS interface. Do so by +introducing new flag, RNDIS_DRIVER_DATA_DST_MAC_FIXUP, and testing for it +in rndis_rx_fixup. This is required, as RNDIS uses frame batching, and all +of the packets inside the batch need the fixup. This might introduce a +performance penalty, because test is done for every returned Ethernet +frame. + +Apply the workaround to both "flavors" of RNDIS interfaces, as older ZTE +modems, like MF823 found in the wild, report the USB_CLASS_COMM class +interfaces, while MF286R reports USB_CLASS_WIRELESS_CONTROLLER. + +Suggested-by: Bjørn Mork +Cc: Kristian Evensen +Cc: Oliver Neukum +Signed-off-by: Lech Perczak +--- + drivers/net/usb/rndis_host.c | 32 ++++++++++++++++++++++++++++++++ + include/linux/usb/rndis_host.h | 1 + + 2 files changed, 33 insertions(+) + +--- a/drivers/net/usb/rndis_host.c ++++ b/drivers/net/usb/rndis_host.c +@@ -486,10 +486,14 @@ EXPORT_SYMBOL_GPL(rndis_unbind); + */ + int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb) + { ++ bool dst_mac_fixup; ++ + /* This check is no longer done by usbnet */ + if (skb->len < dev->net->hard_header_len) + return 0; + ++ dst_mac_fixup = !!(dev->driver_info->data & RNDIS_DRIVER_DATA_DST_MAC_FIXUP); ++ + /* peripheral may have batched packets to us... */ + while (likely(skb->len)) { + struct rndis_data_hdr *hdr = (void *)skb->data; +@@ -524,10 +528,17 @@ int rndis_rx_fixup(struct usbnet *dev, s + break; + skb_pull(skb, msg_len - sizeof *hdr); + skb_trim(skb2, data_len); ++ ++ if (unlikely(dst_mac_fixup)) ++ usbnet_cdc_zte_rx_fixup(dev, skb2); ++ + usbnet_skb_return(dev, skb2); + } + + /* caller will usbnet_skb_return the remaining packet */ ++ if (unlikely(dst_mac_fixup)) ++ usbnet_cdc_zte_rx_fixup(dev, skb); ++ + return 1; + } + EXPORT_SYMBOL_GPL(rndis_rx_fixup); +@@ -601,6 +612,17 @@ static const struct driver_info rndis_po + .tx_fixup = rndis_tx_fixup, + }; + ++static const struct driver_info zte_rndis_info = { ++ .description = "ZTE RNDIS device", ++ .flags = FLAG_ETHER | FLAG_POINTTOPOINT | FLAG_FRAMING_RN | FLAG_NO_SETINT, ++ .data = RNDIS_DRIVER_DATA_DST_MAC_FIXUP, ++ .bind = rndis_bind, ++ .unbind = rndis_unbind, ++ .status = rndis_status, ++ .rx_fixup = rndis_rx_fixup, ++ .tx_fixup = rndis_tx_fixup, ++}; ++ + /*-------------------------------------------------------------------------*/ + + static const struct usb_device_id products [] = { +@@ -615,6 +637,16 @@ static const struct usb_device_id produc + USB_CLASS_COMM, 2 /* ACM */, 0x0ff), + .driver_info = (unsigned long)&rndis_info, + }, { ++ /* ZTE WWAN modules */ ++ USB_VENDOR_AND_INTERFACE_INFO(0x19d2, ++ USB_CLASS_WIRELESS_CONTROLLER, 1, 3), ++ .driver_info = (unsigned long)&zte_rndis_info, ++}, { ++ /* ZTE WWAN modules, ACM flavour */ ++ USB_VENDOR_AND_INTERFACE_INFO(0x19d2, ++ USB_CLASS_COMM, 2 /* ACM */, 0x0ff), ++ .driver_info = (unsigned long)&zte_rndis_info, ++}, { + /* RNDIS is MSFT's un-official variant of CDC ACM */ + USB_INTERFACE_INFO(USB_CLASS_COMM, 2 /* ACM */, 0x0ff), + .driver_info = (unsigned long) &rndis_info, +--- a/include/linux/usb/rndis_host.h ++++ b/include/linux/usb/rndis_host.h +@@ -197,6 +197,7 @@ struct rndis_keepalive_c { /* IN (option + + /* Flags for driver_info::data */ + #define RNDIS_DRIVER_DATA_POLL_STATUS 1 /* poll status before control */ ++#define RNDIS_DRIVER_DATA_DST_MAC_FIXUP 2 /* device ignores configured MAC address */ + + extern void rndis_status(struct usbnet *dev, struct urb *urb); + extern int diff --git a/target/linux/generic/backport-5.15/882-v5.19-rndis_host-limit-scope-of-bogus-MAC-address-detectio.patch b/target/linux/generic/backport-5.15/882-v5.19-rndis_host-limit-scope-of-bogus-MAC-address-detectio.patch new file mode 100644 index 0000000000..bdd812cc90 --- /dev/null +++ b/target/linux/generic/backport-5.15/882-v5.19-rndis_host-limit-scope-of-bogus-MAC-address-detectio.patch @@ -0,0 +1,63 @@ +From 9bfb4bcda7ba32d73ea322ea56a8ebe32e9247f6 Mon Sep 17 00:00:00 2001 +From: Lech Perczak +Date: Sat, 2 Apr 2022 02:19:57 +0200 +Subject: [PATCH 3/3] rndis_host: limit scope of bogus MAC address detection to + ZTE devices +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Reporting of bogus MAC addresses and ignoring configuration of new +destination address wasn't observed outside of a range of ZTE devices, +among which this seems to be the common bug. Align rndis_host driver +with implementation found in cdc_ether, which also limits this workaround +to ZTE devices. + +Suggested-by: Bjørn Mork +Cc: Kristian Evensen +Cc: Oliver Neukum +Signed-off-by: Lech Perczak +--- + drivers/net/usb/rndis_host.c | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +--- a/drivers/net/usb/rndis_host.c ++++ b/drivers/net/usb/rndis_host.c +@@ -419,10 +419,7 @@ generic_rndis_bind(struct usbnet *dev, s + goto halt_fail_and_release; + } + +- if (bp[0] & 0x02) +- eth_hw_addr_random(net); +- else +- ether_addr_copy(net->dev_addr, bp); ++ ether_addr_copy(net->dev_addr, bp); + + /* set a nonzero filter to enable data transfers */ + memset(u.set, 0, sizeof *u.set); +@@ -464,6 +461,16 @@ static int rndis_bind(struct usbnet *dev + return generic_rndis_bind(dev, intf, FLAG_RNDIS_PHYM_NOT_WIRELESS); + } + ++static int zte_rndis_bind(struct usbnet *dev, struct usb_interface *intf) ++{ ++ int status = rndis_bind(dev, intf); ++ ++ if (!status && (dev->net->dev_addr[0] & 0x02)) ++ eth_hw_addr_random(dev->net); ++ ++ return status; ++} ++ + void rndis_unbind(struct usbnet *dev, struct usb_interface *intf) + { + struct rndis_halt *halt; +@@ -616,7 +623,7 @@ static const struct driver_info zte_rndi + .description = "ZTE RNDIS device", + .flags = FLAG_ETHER | FLAG_POINTTOPOINT | FLAG_FRAMING_RN | FLAG_NO_SETINT, + .data = RNDIS_DRIVER_DATA_DST_MAC_FIXUP, +- .bind = rndis_bind, ++ .bind = zte_rndis_bind, + .unbind = rndis_unbind, + .status = rndis_status, + .rx_fixup = rndis_rx_fixup, diff --git a/target/linux/generic/backport-5.15/890-v6.2-mtd-spinand-winbond-fix-flash-detection.patch b/target/linux/generic/backport-5.15/890-v6.2-mtd-spinand-winbond-fix-flash-detection.patch new file mode 100644 index 0000000000..38fbc3a3d7 --- /dev/null +++ b/target/linux/generic/backport-5.15/890-v6.2-mtd-spinand-winbond-fix-flash-detection.patch @@ -0,0 +1,40 @@ +From dbf70fc204d2fbb0d8ad8f42038a60846502efda Mon Sep 17 00:00:00 2001 +From: Mikhail Kshevetskiy +Date: Mon, 10 Oct 2022 13:51:09 +0300 +Subject: [PATCH] mtd: spinand: winbond: fix flash identification + +Winbond uses 3 bytes to identify flash: vendor_id, dev_id_0, dev_id_1, +but current driver uses only first 2 bytes of it for devices +identification. As result Winbond W25N02KV flash (id_bytes: EF, AA, 22) +is identified as W25N01GV (id_bytes: EF, AA, 21). + +Fix this by adding missed identification bytes. + +Signed-off-by: Mikhail Kshevetskiy +Reviewed-by: Frieder Schrempf +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20221010105110.446674-1-mikhail.kshevetskiy@iopsys.eu +--- + drivers/mtd/nand/spi/winbond.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/mtd/nand/spi/winbond.c ++++ b/drivers/mtd/nand/spi/winbond.c +@@ -76,7 +76,7 @@ static int w25m02gv_select_target(struct + + static const struct spinand_info winbond_spinand_table[] = { + SPINAND_INFO("W25M02GV", +- SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xab), ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xab, 0x21), + NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 2), + NAND_ECCREQ(1, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, +@@ -86,7 +86,7 @@ static const struct spinand_info winbond + SPINAND_ECCINFO(&w25m02gv_ooblayout, NULL), + SPINAND_SELECT_TARGET(w25m02gv_select_target)), + SPINAND_INFO("W25N01GV", +- SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xaa), ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xaa, 0x21), + NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(1, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, diff --git a/target/linux/generic/backport-5.15/891-v6.2-mtd-spinand-winbond-add-W25N02KV.patch b/target/linux/generic/backport-5.15/891-v6.2-mtd-spinand-winbond-add-W25N02KV.patch new file mode 100644 index 0000000000..d75a1acc57 --- /dev/null +++ b/target/linux/generic/backport-5.15/891-v6.2-mtd-spinand-winbond-add-W25N02KV.patch @@ -0,0 +1,106 @@ +From 6154c7a583483d7b69f53bea868efdc369edd563 Mon Sep 17 00:00:00 2001 +From: Mikhail Kshevetskiy +Date: Mon, 10 Oct 2022 13:51:10 +0300 +Subject: [PATCH] mtd: spinand: winbond: add Winbond W25N02KV flash support + +Add support of Winbond W25N02KV flash + +Signed-off-by: Mikhail Kshevetskiy +Reviewed-by: Frieder Schrempf +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20221010105110.446674-2-mikhail.kshevetskiy@iopsys.eu +--- + drivers/mtd/nand/spi/winbond.c | 75 ++++++++++++++++++++++++++++++++++ + 1 file changed, 75 insertions(+) + +--- a/drivers/mtd/nand/spi/winbond.c ++++ b/drivers/mtd/nand/spi/winbond.c +@@ -74,6 +74,72 @@ static int w25m02gv_select_target(struct + return spi_mem_exec_op(spinand->spimem, &op); + } + ++static int w25n02kv_ooblayout_ecc(struct mtd_info *mtd, int section, ++ struct mtd_oob_region *region) ++{ ++ if (section > 3) ++ return -ERANGE; ++ ++ region->offset = 64 + (16 * section); ++ region->length = 13; ++ ++ return 0; ++} ++ ++static int w25n02kv_ooblayout_free(struct mtd_info *mtd, int section, ++ struct mtd_oob_region *region) ++{ ++ if (section > 3) ++ return -ERANGE; ++ ++ region->offset = (16 * section) + 2; ++ region->length = 14; ++ ++ return 0; ++} ++ ++static const struct mtd_ooblayout_ops w25n02kv_ooblayout = { ++ .ecc = w25n02kv_ooblayout_ecc, ++ .free = w25n02kv_ooblayout_free, ++}; ++ ++static int w25n02kv_ecc_get_status(struct spinand_device *spinand, ++ u8 status) ++{ ++ struct nand_device *nand = spinand_to_nand(spinand); ++ u8 mbf = 0; ++ struct spi_mem_op op = SPINAND_GET_FEATURE_OP(0x30, &mbf); ++ ++ switch (status & STATUS_ECC_MASK) { ++ case STATUS_ECC_NO_BITFLIPS: ++ return 0; ++ ++ case STATUS_ECC_UNCOR_ERROR: ++ return -EBADMSG; ++ ++ case STATUS_ECC_HAS_BITFLIPS: ++ /* ++ * Let's try to retrieve the real maximum number of bitflips ++ * in order to avoid forcing the wear-leveling layer to move ++ * data around if it's not necessary. ++ */ ++ if (spi_mem_exec_op(spinand->spimem, &op)) ++ return nanddev_get_ecc_conf(nand)->strength; ++ ++ mbf >>= 4; ++ ++ if (WARN_ON(mbf > nanddev_get_ecc_conf(nand)->strength || !mbf)) ++ return nanddev_get_ecc_conf(nand)->strength; ++ ++ return mbf; ++ ++ default: ++ break; ++ } ++ ++ return -EINVAL; ++} ++ + static const struct spinand_info winbond_spinand_table[] = { + SPINAND_INFO("W25M02GV", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xab, 0x21), +@@ -94,6 +160,15 @@ static const struct spinand_info winbond + &update_cache_variants), + 0, + SPINAND_ECCINFO(&w25m02gv_ooblayout, NULL)), ++ SPINAND_INFO("W25N02KV", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xaa, 0x22), ++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, ++ &write_cache_variants, ++ &update_cache_variants), ++ 0, ++ SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)), + }; + + static int winbond_spinand_init(struct spinand_device *spinand) diff --git a/target/linux/generic/backport-5.15/892-v6.5-mtd-spinand-winbond-Fix-ecc_get_status.patch b/target/linux/generic/backport-5.15/892-v6.5-mtd-spinand-winbond-Fix-ecc_get_status.patch new file mode 100644 index 0000000000..2f408f5a30 --- /dev/null +++ b/target/linux/generic/backport-5.15/892-v6.5-mtd-spinand-winbond-Fix-ecc_get_status.patch @@ -0,0 +1,49 @@ +From f5a05060670a4d8d6523afc7963eb559c2e3615f Mon Sep 17 00:00:00 2001 +From: Olivier Maignial +Date: Fri, 23 Jun 2023 17:33:37 +0200 +Subject: [PATCH] mtd: spinand: winbond: Fix ecc_get_status + +Reading ECC status is failing. + +w25n02kv_ecc_get_status() is using on-stack buffer for +SPINAND_GET_FEATURE_OP() output. It is not suitable for +DMA needs of spi-mem. + +Fix this by using the spi-mem operations dedicated buffer +spinand->scratchbuf. + +See +spinand->scratchbuf: +https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/mtd/spinand.h?h=v6.3#n418 +spi_mem_check_op(): +https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/spi/spi-mem.c?h=v6.3#n199 + +Fixes: 6154c7a58348 ("mtd: spinand: winbond: add Winbond W25N02KV flash support") +Cc: stable@vger.kernel.org +Signed-off-by: Olivier Maignial +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/DB4P250MB1032EDB9E36B764A33769039FE23A@DB4P250MB1032.EURP250.PROD.OUTLOOK.COM +--- + drivers/mtd/nand/spi/winbond.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/mtd/nand/spi/winbond.c ++++ b/drivers/mtd/nand/spi/winbond.c +@@ -108,7 +108,7 @@ static int w25n02kv_ecc_get_status(struc + { + struct nand_device *nand = spinand_to_nand(spinand); + u8 mbf = 0; +- struct spi_mem_op op = SPINAND_GET_FEATURE_OP(0x30, &mbf); ++ struct spi_mem_op op = SPINAND_GET_FEATURE_OP(0x30, spinand->scratchbuf); + + switch (status & STATUS_ECC_MASK) { + case STATUS_ECC_NO_BITFLIPS: +@@ -126,7 +126,7 @@ static int w25n02kv_ecc_get_status(struc + if (spi_mem_exec_op(spinand->spimem, &op)) + return nanddev_get_ecc_conf(nand)->strength; + +- mbf >>= 4; ++ mbf = *(spinand->scratchbuf) >> 4; + + if (WARN_ON(mbf > nanddev_get_ecc_conf(nand)->strength || !mbf)) + return nanddev_get_ecc_conf(nand)->strength; diff --git a/target/linux/generic/config-5.10 b/target/linux/generic/config-5.10 deleted file mode 100644 index efc0861f1c..0000000000 --- a/target/linux/generic/config-5.10 +++ /dev/null @@ -1,7181 +0,0 @@ -# CONFIG_104_QUAD_8 is not set -CONFIG_32BIT=y -CONFIG_64BIT_TIME=y -# CONFIG_6LOWPAN is not set -# CONFIG_6LOWPAN_DEBUGFS is not set -# CONFIG_6PACK is not set -# CONFIG_8139CP is not set -# CONFIG_8139TOO is not set -# CONFIG_9P_FS is not set -# CONFIG_AB3100_CORE is not set -# CONFIG_AB8500_CORE is not set -# CONFIG_ABP060MG is not set -# CONFIG_ABX500_CORE is not set -# CONFIG_ACCESSIBILITY is not set -# CONFIG_ACENIC is not set -# CONFIG_ACERHDF is not set -# CONFIG_ACER_WIRELESS is not set -# CONFIG_ACORN_PARTITION is not set -# CONFIG_ACPI_ALS is not set -# CONFIG_ACPI_APEI is not set -# CONFIG_ACPI_BUTTON is not set -# CONFIG_ACPI_CONFIGFS is not set -# CONFIG_ACPI_CUSTOM_METHOD is not set -# CONFIG_ACPI_EXTLOG is not set -# CONFIG_ACPI_HED is not set -# CONFIG_ACPI_NFIT is not set -# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set -# CONFIG_ACPI_TABLE_UPGRADE is not set -# CONFIG_ACPI_VIDEO is not set -# CONFIG_AD2S1200 is not set -# CONFIG_AD2S1210 is not set -# CONFIG_AD2S90 is not set -# CONFIG_AD5064 is not set -# CONFIG_AD525X_DPOT is not set -# CONFIG_AD5272 is not set -# CONFIG_AD5360 is not set -# CONFIG_AD5380 is not set -# CONFIG_AD5421 is not set -# CONFIG_AD5446 is not set -# CONFIG_AD5449 is not set -# CONFIG_AD5504 is not set -# CONFIG_AD5592R is not set -# CONFIG_AD5593R is not set -# CONFIG_AD5624R_SPI is not set -# CONFIG_AD5686 is not set -# CONFIG_AD5686_SPI is not set -# CONFIG_AD5696_I2C is not set -# CONFIG_AD5755 is not set -# CONFIG_AD5758 is not set -# CONFIG_AD5761 is not set -# CONFIG_AD5764 is not set -# CONFIG_AD5770R is not set -# CONFIG_AD5791 is not set -# CONFIG_AD5933 is not set -# CONFIG_AD7091R5 is not set -# CONFIG_AD7124 is not set -# CONFIG_AD7150 is not set -# CONFIG_AD7152 is not set -# CONFIG_AD7192 is not set -# CONFIG_AD7266 is not set -# CONFIG_AD7280 is not set -# CONFIG_AD7291 is not set -# CONFIG_AD7292 is not set -# CONFIG_AD7298 is not set -# CONFIG_AD7303 is not set -# CONFIG_AD7476 is not set -# CONFIG_AD7606 is not set -# CONFIG_AD7606_IFACE_PARALLEL is not set -# CONFIG_AD7606_IFACE_SPI is not set -# CONFIG_AD7746 is not set -# CONFIG_AD7766 is not set -# CONFIG_AD7768_1 is not set -# CONFIG_AD7780 is not set -# CONFIG_AD7791 is not set -# CONFIG_AD7793 is not set -# CONFIG_AD7816 is not set -# CONFIG_AD7887 is not set -# CONFIG_AD7923 is not set -# CONFIG_AD7949 is not set -# CONFIG_AD799X is not set -# CONFIG_AD8366 is not set -# CONFIG_AD8801 is not set -# CONFIG_AD9467 is not set -# CONFIG_AD9523 is not set -# CONFIG_AD9832 is not set -# CONFIG_AD9834 is not set -# CONFIG_ADAPTEC_STARFIRE is not set -# CONFIG_ADE7854 is not set -# CONFIG_ADF4350 is not set -# CONFIG_ADF4371 is not set -# CONFIG_ADFS_FS is not set -# CONFIG_ADIN_PHY is not set -# CONFIG_ADIS16080 is not set -# CONFIG_ADIS16130 is not set -# CONFIG_ADIS16136 is not set -# CONFIG_ADIS16201 is not set -# CONFIG_ADIS16203 is not set -# CONFIG_ADIS16209 is not set -# CONFIG_ADIS16240 is not set -# CONFIG_ADIS16260 is not set -# CONFIG_ADIS16400 is not set -# CONFIG_ADIS16460 is not set -# CONFIG_ADIS16475 is not set -# CONFIG_ADIS16480 is not set -# CONFIG_ADI_AXI_ADC is not set -# CONFIG_ADJD_S311 is not set -# CONFIG_ADM6996_PHY is not set -# CONFIG_ADM8211 is not set -# CONFIG_ADT7316 is not set -# CONFIG_ADUX1020 is not set -CONFIG_ADVISE_SYSCALLS=y -# CONFIG_ADXL345_I2C is not set -# CONFIG_ADXL345_SPI is not set -# CONFIG_ADXL372_I2C is not set -# CONFIG_ADXL372_SPI is not set -# CONFIG_ADXRS290 is not set -# CONFIG_ADXRS450 is not set -CONFIG_AEABI=y -# CONFIG_AFE4403 is not set -# CONFIG_AFE4404 is not set -# CONFIG_AFFS_FS is not set -# CONFIG_AFS_DEBUG_CURSOR is not set -# CONFIG_AFS_FS is not set -# CONFIG_AF_KCM is not set -# CONFIG_AF_RXRPC is not set -# CONFIG_AF_RXRPC_INJECT_LOSS is not set -# CONFIG_AF_RXRPC_IPV6 is not set -# CONFIG_AGP is not set -# CONFIG_AHCI_CEVA is not set -# CONFIG_AHCI_IMX is not set -# CONFIG_AHCI_MVEBU is not set -# CONFIG_AHCI_QORIQ is not set -# CONFIG_AHCI_XGENE is not set -CONFIG_AIO=y -# CONFIG_AIRO is not set -# CONFIG_AIRO_CS is not set -# CONFIG_AIX_PARTITION is not set -# CONFIG_AK09911 is not set -# CONFIG_AK8974 is not set -# CONFIG_AK8975 is not set -# CONFIG_AL3010 is not set -# CONFIG_AL3320A is not set -# CONFIG_ALIM7101_WDT is not set -CONFIG_ALLOW_DEV_COREDUMP=y -# CONFIG_ALTERA_MBOX is not set -# CONFIG_ALTERA_MSGDMA is not set -# CONFIG_ALTERA_STAPL is not set -# CONFIG_ALTERA_TSE is not set -# CONFIG_ALX is not set -# CONFIG_AL_FIC is not set -# CONFIG_AM2315 is not set -# CONFIG_AM335X_PHY_USB is not set -# CONFIG_AMBA_PL08X is not set -# CONFIG_AMD8111_ETH is not set -# CONFIG_AMD_MEM_ENCRYPT is not set -# CONFIG_AMD_PHY is not set -# CONFIG_AMD_XGBE is not set -# CONFIG_AMD_XGBE_HAVE_ECC is not set -# CONFIG_AMIGA_PARTITION is not set -# CONFIG_AMILO_RFKILL is not set -# CONFIG_ANDROID is not set -CONFIG_ANON_INODES=y -# CONFIG_APDS9300 is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_APDS9960 is not set -# CONFIG_APM8018X is not set -# CONFIG_APM_EMULATION is not set -# CONFIG_APPLE_GMUX is not set -# CONFIG_APPLE_MFI_FASTCHARGE is not set -# CONFIG_APPLE_PROPERTIES is not set -# CONFIG_APPLICOM is not set -# CONFIG_AQTION is not set -# CONFIG_AQUANTIA_PHY is not set -# CONFIG_AR5523 is not set -# CONFIG_AR7 is not set -# CONFIG_AR8216_PHY is not set -# CONFIG_AR8216_PHY_LEDS is not set -# CONFIG_ARCH_ACTIONS is not set -# CONFIG_ARCH_AGILEX is not set -# CONFIG_ARCH_ALPINE is not set -# CONFIG_ARCH_ARTPEC is not set -# CONFIG_ARCH_ASPEED is not set -# CONFIG_ARCH_AT91 is not set -# CONFIG_ARCH_AXXIA is not set -# CONFIG_ARCH_BCM is not set -# CONFIG_ARCH_BCM2835 is not set -# CONFIG_ARCH_BCM_21664 is not set -# CONFIG_ARCH_BCM_23550 is not set -# CONFIG_ARCH_BCM_281XX is not set -# CONFIG_ARCH_BCM_5301X is not set -# CONFIG_ARCH_BCM_53573 is not set -# CONFIG_ARCH_BCM_63XX is not set -# CONFIG_ARCH_BCM_CYGNUS is not set -# CONFIG_ARCH_BCM_IPROC is not set -# CONFIG_ARCH_BCM_NSP is not set -# CONFIG_ARCH_BERLIN is not set -CONFIG_ARCH_BINFMT_ELF_STATE=y -# CONFIG_ARCH_BITMAIN is not set -# CONFIG_ARCH_BRCMSTB is not set -# CONFIG_ARCH_CLPS711X is not set -# CONFIG_ARCH_CNS3XXX is not set -# CONFIG_ARCH_DAVINCI is not set -# CONFIG_ARCH_DIGICOLOR is not set -# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set -# CONFIG_ARCH_DOVE is not set -# CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_EP93XX is not set -# CONFIG_ARCH_EXYNOS is not set -CONFIG_ARCH_FLATMEM_ENABLE=y -# CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_GEMINI is not set -# CONFIG_ARCH_HI3xxx is not set -# CONFIG_ARCH_HIGHBANK is not set -# CONFIG_ARCH_HISI is not set -# CONFIG_ARCH_INTEGRATOR is not set -# CONFIG_ARCH_IOP13XX is not set -# CONFIG_ARCH_IOP32X is not set -# CONFIG_ARCH_IOP33X is not set -# CONFIG_ARCH_IXP4XX is not set -# CONFIG_ARCH_K3 is not set -# CONFIG_ARCH_KEEMBAY is not set -# CONFIG_ARCH_KEYSTONE is not set -# CONFIG_ARCH_KS8695 is not set -# CONFIG_ARCH_LAYERSCAPE is not set -# CONFIG_ARCH_LG1K is not set -# CONFIG_ARCH_LPC32XX is not set -# CONFIG_ARCH_MEDIATEK is not set -# CONFIG_ARCH_MESON is not set -# CONFIG_ARCH_MILBEAUT is not set -CONFIG_ARCH_MMAP_RND_BITS=8 -CONFIG_ARCH_MMAP_RND_BITS_MAX=16 -CONFIG_ARCH_MMAP_RND_BITS_MIN=8 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 -# CONFIG_ARCH_MMP is not set -# CONFIG_ARCH_MSTARV7 is not set -# CONFIG_ARCH_MULTIPLATFORM is not set -# CONFIG_ARCH_MULTI_V6 is not set -# CONFIG_ARCH_MULTI_V7 is not set -# CONFIG_ARCH_MV78XX0 is not set -# CONFIG_ARCH_MVEBU is not set -# CONFIG_ARCH_MXC is not set -# CONFIG_ARCH_MXS is not set -# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set -# CONFIG_ARCH_NETX is not set -# CONFIG_ARCH_NOMADIK is not set -# CONFIG_ARCH_NPCM is not set -# CONFIG_ARCH_NSPIRE is not set -# CONFIG_ARCH_OMAP is not set -# CONFIG_ARCH_OMAP1 is not set -# CONFIG_ARCH_OMAP2 is not set -# CONFIG_ARCH_OMAP2PLUS is not set -# CONFIG_ARCH_OMAP3 is not set -# CONFIG_ARCH_OMAP4 is not set -# CONFIG_ARCH_ORION5X is not set -# CONFIG_ARCH_OXNAS is not set -# CONFIG_ARCH_PICOXCELL is not set -# CONFIG_ARCH_PRIMA2 is not set -# CONFIG_ARCH_PXA is not set -# CONFIG_ARCH_QCOM is not set -# CONFIG_ARCH_RANDOM is not set -# CONFIG_ARCH_RDA is not set -# CONFIG_ARCH_REALTEK is not set -# CONFIG_ARCH_REALVIEW is not set -# CONFIG_ARCH_RENESAS is not set -# CONFIG_ARCH_ROCKCHIP is not set -# CONFIG_ARCH_RPC is not set -# CONFIG_ARCH_S32 is not set -# CONFIG_ARCH_S3C24XX is not set -# CONFIG_ARCH_S3C64XX is not set -# CONFIG_ARCH_S5PV210 is not set -# CONFIG_ARCH_SA1100 is not set -# CONFIG_ARCH_SEATTLE is not set -# CONFIG_ARCH_SHMOBILE is not set -# CONFIG_ARCH_SIRF is not set -# CONFIG_ARCH_SOCFPGA is not set -# CONFIG_ARCH_SPARX5 is not set -# CONFIG_ARCH_SPRD is not set -# CONFIG_ARCH_STI is not set -# CONFIG_ARCH_STM32 is not set -# CONFIG_ARCH_STRATIX10 is not set -# CONFIG_ARCH_SUNXI is not set -# CONFIG_ARCH_SYNQUACER is not set -# CONFIG_ARCH_TANGO is not set -# CONFIG_ARCH_TEGRA is not set -# CONFIG_ARCH_THUNDER is not set -# CONFIG_ARCH_THUNDER2 is not set -# CONFIG_ARCH_U300 is not set -# CONFIG_ARCH_U8500 is not set -# CONFIG_ARCH_UNIPHIER is not set -# CONFIG_ARCH_VERSATILE is not set -# CONFIG_ARCH_VEXPRESS is not set -# CONFIG_ARCH_VIRT is not set -# CONFIG_ARCH_VISCONTI is not set -# CONFIG_ARCH_VT8500 is not set -# CONFIG_ARCH_VULCAN is not set -# CONFIG_ARCH_W90X900 is not set -# CONFIG_ARCH_WANTS_THP_SWAP is not set -# CONFIG_ARCH_WM8505 is not set -# CONFIG_ARCH_WM8750 is not set -# CONFIG_ARCH_WM8850 is not set -# CONFIG_ARCH_XGENE is not set -# CONFIG_ARCH_ZX is not set -# CONFIG_ARCH_ZYNQ is not set -# CONFIG_ARCH_ZYNQMP is not set -# CONFIG_ARCNET is not set -# CONFIG_ARC_EMAC is not set -# CONFIG_ARC_IRQ_NO_AUTOSAVE is not set -# CONFIG_ARM64_16K_PAGES is not set -# CONFIG_ARM64_64K_PAGES is not set -# CONFIG_ARM64_AMU_EXTN is not set -# CONFIG_ARM64_BTI is not set -# CONFIG_ARM64_CRYPTO is not set -# CONFIG_ARM64_E0PD is not set -# CONFIG_ARM64_ERRATUM_1024718 is not set -# CONFIG_ARM64_ERRATUM_1165522 is not set -# CONFIG_ARM64_ERRATUM_1286807 is not set -# CONFIG_ARM64_ERRATUM_1319367 is not set -# CONFIG_ARM64_ERRATUM_1418040 is not set -# CONFIG_ARM64_ERRATUM_1463225 is not set -# CONFIG_ARM64_ERRATUM_1508412 is not set -# CONFIG_ARM64_ERRATUM_1530923 is not set -# CONFIG_ARM64_ERRATUM_1542419 is not set -# CONFIG_ARM64_ERRATUM_1742098 is not set -# CONFIG_ARM64_ERRATUM_819472 is not set -# CONFIG_ARM64_ERRATUM_824069 is not set -# CONFIG_ARM64_ERRATUM_826319 is not set -# CONFIG_ARM64_ERRATUM_827319 is not set -# CONFIG_ARM64_ERRATUM_832075 is not set -# CONFIG_ARM64_ERRATUM_834220 is not set -# CONFIG_ARM64_ERRATUM_843419 is not set -# CONFIG_ARM64_ERRATUM_845719 is not set -# CONFIG_ARM64_ERRATUM_858921 is not set -# CONFIG_ARM64_HW_AFDBM is not set -# CONFIG_ARM64_LSE_ATOMICS is not set -# CONFIG_ARM64_MODULE_PLTS is not set -# CONFIG_ARM64_MTE is not set -# CONFIG_ARM64_PAN is not set -# CONFIG_ARM64_PMEM is not set -# CONFIG_ARM64_PSEUDO_NMI is not set -# CONFIG_ARM64_PTDUMP_DEBUGFS is not set -# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set -# CONFIG_ARM64_RAS_EXTN is not set -# CONFIG_ARM64_RELOC_TEST is not set -CONFIG_ARM64_SW_TTBR0_PAN=y -# CONFIG_ARM64_TLB_RANGE is not set -# CONFIG_ARM64_UAO is not set -# CONFIG_ARM64_USE_LSE_ATOMICS is not set -# CONFIG_ARM64_VA_BITS_48 is not set -# CONFIG_ARM64_VHE is not set -# CONFIG_ARM_APPENDED_DTB is not set -# CONFIG_ARM_ARCH_TIMER is not set -# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set -# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set -# CONFIG_ARM_CCI is not set -# CONFIG_ARM_CCI400_PMU is not set -# CONFIG_ARM_CCI5xx_PMU is not set -# CONFIG_ARM_CCI_PMU is not set -# CONFIG_ARM_CCN is not set -# CONFIG_ARM_CMN is not set -# CONFIG_ARM_CPUIDLE is not set -CONFIG_ARM_CPU_TOPOLOGY=y -# CONFIG_ARM_CRYPTO is not set -CONFIG_ARM_DMA_MEM_BUFFERABLE=y -# CONFIG_ARM_DSU_PMU is not set -# CONFIG_ARM_ERRATA_326103 is not set -# CONFIG_ARM_ERRATA_364296 is not set -# CONFIG_ARM_ERRATA_411920 is not set -# CONFIG_ARM_ERRATA_430973 is not set -# CONFIG_ARM_ERRATA_458693 is not set -# CONFIG_ARM_ERRATA_460075 is not set -# CONFIG_ARM_ERRATA_643719 is not set -# CONFIG_ARM_ERRATA_720789 is not set -# CONFIG_ARM_ERRATA_742230 is not set -# CONFIG_ARM_ERRATA_742231 is not set -# CONFIG_ARM_ERRATA_743622 is not set -# CONFIG_ARM_ERRATA_751472 is not set -# CONFIG_ARM_ERRATA_754322 is not set -# CONFIG_ARM_ERRATA_754327 is not set -# CONFIG_ARM_ERRATA_764369 is not set -# CONFIG_ARM_ERRATA_773022 is not set -# CONFIG_ARM_ERRATA_775420 is not set -# CONFIG_ARM_ERRATA_798181 is not set -# CONFIG_ARM_ERRATA_814220 is not set -# CONFIG_ARM_ERRATA_818325_852422 is not set -# CONFIG_ARM_ERRATA_821420 is not set -# CONFIG_ARM_ERRATA_825619 is not set -# CONFIG_ARM_ERRATA_852421 is not set -# CONFIG_ARM_ERRATA_852423 is not set -# CONFIG_ARM_ERRATA_857271 is not set -# CONFIG_ARM_ERRATA_857272 is not set -CONFIG_ARM_GIC_MAX_NR=1 -# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set -# CONFIG_ARM_KPROBES_TEST is not set -# CONFIG_ARM_LPAE is not set -# CONFIG_ARM_MHU is not set -# CONFIG_ARM_MODULE_PLTS is not set -# CONFIG_ARM_PATCH_PHYS_VIRT is not set -# CONFIG_ARM_PSCI is not set -# CONFIG_ARM_PSCI_CHECKER is not set -# CONFIG_ARM_PSCI_CPUIDLE is not set -# CONFIG_ARM_PTDUMP_DEBUGFS is not set -# CONFIG_ARM_SBSA_WATCHDOG is not set -# CONFIG_ARM_SCMI_PROTOCOL is not set -# CONFIG_ARM_SCPI_PROTOCOL is not set -# CONFIG_ARM_SDE_INTERFACE is not set -# CONFIG_ARM_SMCCC_SOC_ID is not set -# CONFIG_ARM_SMC_WATCHDOG is not set -# CONFIG_ARM_SP805_WATCHDOG is not set -# CONFIG_ARM_SPE_PMU is not set -# CONFIG_ARM_THUMBEE is not set -# CONFIG_ARM_TIMER_SP804 is not set -# CONFIG_ARM_UNWIND is not set -# CONFIG_ARM_VIRT_EXT is not set -# CONFIG_AS3935 is not set -# CONFIG_AS73211 is not set -# CONFIG_ASM9260_TIMER is not set -# CONFIG_ASN1 is not set -# CONFIG_ASUS_LAPTOP is not set -# CONFIG_ASUS_WIRELESS is not set -# CONFIG_ASYMMETRIC_KEY_TYPE is not set -# CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE is not set -# CONFIG_ASYMMETRIC_TPM_KEY_SUBTYPE is not set -# CONFIG_ASYNC_RAID6_TEST is not set -# CONFIG_ASYNC_TX_DMA is not set -# CONFIG_AT76C50X_USB is not set -# CONFIG_AT803X_PHY is not set -# CONFIG_AT91_SAMA5D2_ADC is not set -# CONFIG_ATA is not set -# CONFIG_ATAGS is not set -CONFIG_ATAGS_PROC=y -# CONFIG_ATALK is not set -# CONFIG_ATARI_PARTITION is not set -# CONFIG_ATA_ACPI is not set -CONFIG_ATA_BMDMA=y -# CONFIG_ATA_FORCE is not set -# CONFIG_ATA_GENERIC is not set -# CONFIG_ATA_LEDS is not set -# CONFIG_ATA_NONSTANDARD is not set -# CONFIG_ATA_OVER_ETH is not set -# CONFIG_ATA_PIIX is not set -CONFIG_ATA_SFF=y -# CONFIG_ATA_VERBOSE_ERROR is not set -# CONFIG_ATH10K is not set -# CONFIG_ATH25 is not set -# CONFIG_ATH5K is not set -# CONFIG_ATH6KL is not set -# CONFIG_ATH79 is not set -# CONFIG_ATH9K is not set -# CONFIG_ATH9K_HTC is not set -# CONFIG_ATH_DEBUG is not set -# CONFIG_ATL1 is not set -# CONFIG_ATL1C is not set -# CONFIG_ATL1E is not set -# CONFIG_ATL2 is not set -# CONFIG_ATLAS_EZO_SENSOR is not set -# CONFIG_ATLAS_PH_SENSOR is not set -# CONFIG_ATM is not set -# CONFIG_ATMEL is not set -# CONFIG_ATMEL_PIT is not set -# CONFIG_ATMEL_SSC is not set -# CONFIG_ATM_AMBASSADOR is not set -# CONFIG_ATM_BR2684 is not set -CONFIG_ATM_BR2684_IPFILTER=y -# CONFIG_ATM_CLIP is not set -CONFIG_ATM_CLIP_NO_ICMP=y -# CONFIG_ATM_DRIVERS is not set -# CONFIG_ATM_DUMMY is not set -# CONFIG_ATM_ENI is not set -# CONFIG_ATM_FIRESTREAM is not set -# CONFIG_ATM_FORE200E is not set -# CONFIG_ATM_HE is not set -# CONFIG_ATM_HORIZON is not set -# CONFIG_ATM_IA is not set -# CONFIG_ATM_IDT77252 is not set -# CONFIG_ATM_LANAI is not set -# CONFIG_ATM_LANE is not set -# CONFIG_ATM_MPOA is not set -# CONFIG_ATM_NICSTAR is not set -# CONFIG_ATM_SOLOS is not set -# CONFIG_ATM_TCP is not set -# CONFIG_ATM_ZATM is not set -# CONFIG_ATOMIC64_SELFTEST is not set -# CONFIG_ATP is not set -# CONFIG_AUDIT is not set -# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set -# CONFIG_AURORA_NB8800 is not set -# CONFIG_AUTOFS4_FS is not set -# CONFIG_AUTOFS_FS is not set -# CONFIG_AUTO_ZRELADDR is not set -# CONFIG_AUXDISPLAY is not set -# CONFIG_AX25 is not set -# CONFIG_AX25_DAMA_SLAVE is not set -# CONFIG_AX88796 is not set -# CONFIG_AX88796B_PHY is not set -# CONFIG_AXP20X_ADC is not set -# CONFIG_AXP20X_POWER is not set -# CONFIG_AXP288_ADC is not set -# CONFIG_AXP288_FUEL_GAUGE is not set -# CONFIG_B43 is not set -# CONFIG_B43LEGACY is not set -# CONFIG_B44 is not set -# CONFIG_B53 is not set -# CONFIG_B53_MDIO_DRIVER is not set -# CONFIG_B53_MMAP_DRIVER is not set -# CONFIG_B53_SERDES is not set -# CONFIG_B53_SPI_DRIVER is not set -# CONFIG_B53_SRAB_DRIVER is not set -# CONFIG_BACKLIGHT_ADP8860 is not set -# CONFIG_BACKLIGHT_ADP8870 is not set -# CONFIG_BACKLIGHT_APPLE is not set -# CONFIG_BACKLIGHT_ARCXCNN is not set -# CONFIG_BACKLIGHT_BD6107 is not set -# CONFIG_BACKLIGHT_CLASS_DEVICE is not set -# CONFIG_BACKLIGHT_GENERIC is not set -# CONFIG_BACKLIGHT_GPIO is not set -# CONFIG_BACKLIGHT_KTD253 is not set -# CONFIG_BACKLIGHT_LCD_SUPPORT is not set -# CONFIG_BACKLIGHT_LED is not set -# CONFIG_BACKLIGHT_LM3630A is not set -# CONFIG_BACKLIGHT_LM3639 is not set -# CONFIG_BACKLIGHT_LP855X is not set -# CONFIG_BACKLIGHT_LV5207LP is not set -# CONFIG_BACKLIGHT_PANDORA is not set -# CONFIG_BACKLIGHT_PM8941_WLED is not set -# CONFIG_BACKLIGHT_PWM is not set -# CONFIG_BACKLIGHT_QCOM_WLED is not set -# CONFIG_BACKLIGHT_RPI is not set -# CONFIG_BACKLIGHT_SAHARA is not set -# CONFIG_BACKTRACE_SELF_TEST is not set -# CONFIG_BAREUDP is not set -CONFIG_BASE_FULL=y -CONFIG_BASE_SMALL=0 -# CONFIG_BATMAN_ADV is not set -# CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_BQ27XXX_HDQ is not set -# CONFIG_BATTERY_CW2015 is not set -# CONFIG_BATTERY_DS2760 is not set -# CONFIG_BATTERY_DS2780 is not set -# CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_BATTERY_GOLDFISH is not set -# CONFIG_BATTERY_LEGO_EV3 is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set -# CONFIG_BATTERY_MAX1721X is not set -# CONFIG_BATTERY_RT5033 is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_BAYCOM_EPP is not set -# CONFIG_BAYCOM_PAR is not set -# CONFIG_BAYCOM_SER_FDX is not set -# CONFIG_BAYCOM_SER_HDX is not set -# CONFIG_BCACHE is not set -# CONFIG_BCM47XX is not set -# CONFIG_BCM54140_PHY is not set -# CONFIG_BCM63XX is not set -# CONFIG_BCM63XX_PHY is not set -# CONFIG_BCM7038_WDT is not set -# CONFIG_BCM7XXX_PHY is not set -# CONFIG_BCM84881_PHY is not set -# CONFIG_BCM87XX_PHY is not set -# CONFIG_BCMA is not set -# CONFIG_BCMA_DRIVER_GPIO is not set -CONFIG_BCMA_POSSIBLE=y -# CONFIG_BCMGENET is not set -# CONFIG_BCM_IPROC_ADC is not set -# CONFIG_BCM_KONA_USB2_PHY is not set -# CONFIG_BCM_SBA_RAID is not set -# CONFIG_BDI_SWITCH is not set -# CONFIG_BE2ISCSI is not set -# CONFIG_BE2NET is not set -# CONFIG_BEFS_FS is not set -# CONFIG_BFS_FS is not set -# CONFIG_BGMAC is not set -# CONFIG_BH1750 is not set -# CONFIG_BH1780 is not set -# CONFIG_BIG_KEYS is not set -# CONFIG_BIG_LITTLE is not set -# CONFIG_BINARY_PRINTF is not set -# CONFIG_BINFMT_AOUT is not set -CONFIG_BINFMT_ELF=y -# CONFIG_BINFMT_ELF_FDPIC is not set -# CONFIG_BINFMT_FLAT is not set -# CONFIG_BINFMT_MISC is not set -CONFIG_BINFMT_SCRIPT=y -CONFIG_BITREVERSE=y -# CONFIG_BLK_CGROUP_IOCOST is not set -# CONFIG_BLK_CGROUP_IOLATENCY is not set -# CONFIG_BLK_CMDLINE_PARSER is not set -# CONFIG_BLK_DEBUG_FS is not set -CONFIG_BLK_DEV=y -# CONFIG_BLK_DEV_3W_XXXX_RAID is not set -# CONFIG_BLK_DEV_4DRIVES is not set -# CONFIG_BLK_DEV_AEC62XX is not set -# CONFIG_BLK_DEV_ALI14XX is not set -# CONFIG_BLK_DEV_ALI15X3 is not set -# CONFIG_BLK_DEV_AMD74XX is not set -# CONFIG_BLK_DEV_ATIIXP is not set -# CONFIG_BLK_DEV_BSG is not set -# CONFIG_BLK_DEV_BSGLIB is not set -# CONFIG_BLK_DEV_CMD640 is not set -# CONFIG_BLK_DEV_CMD64X is not set -# CONFIG_BLK_DEV_COW_COMMON is not set -# CONFIG_BLK_DEV_CRYPTOLOOP is not set -# CONFIG_BLK_DEV_CS5520 is not set -# CONFIG_BLK_DEV_CS5530 is not set -# CONFIG_BLK_DEV_CS5535 is not set -# CONFIG_BLK_DEV_CS5536 is not set -# CONFIG_BLK_DEV_CY82C693 is not set -# CONFIG_BLK_DEV_DAC960 is not set -# CONFIG_BLK_DEV_DELKIN is not set -# CONFIG_BLK_DEV_DRBD is not set -# CONFIG_BLK_DEV_DTC2278 is not set -# CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_GENERIC is not set -# CONFIG_BLK_DEV_HPT366 is not set -# CONFIG_BLK_DEV_HT6560B is not set -# CONFIG_BLK_DEV_IDEACPI is not set -# CONFIG_BLK_DEV_IDECD is not set -# CONFIG_BLK_DEV_IDECS is not set -# CONFIG_BLK_DEV_IDEPCI is not set -# CONFIG_BLK_DEV_IDEPNP is not set -# CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDE_AU1XXX is not set -# CONFIG_BLK_DEV_IDE_SATA is not set -CONFIG_BLK_DEV_INITRD=y -# CONFIG_BLK_DEV_INTEGRITY is not set -# CONFIG_BLK_DEV_IO_TRACE is not set -# CONFIG_BLK_DEV_IT8172 is not set -# CONFIG_BLK_DEV_IT8213 is not set -# CONFIG_BLK_DEV_IT821X is not set -# CONFIG_BLK_DEV_JMICRON is not set -# CONFIG_BLK_DEV_LOOP is not set -CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_NS87415 is not set -# CONFIG_BLK_DEV_NULL_BLK is not set -# CONFIG_BLK_DEV_NVME is not set -# CONFIG_BLK_DEV_OFFBOARD is not set -# CONFIG_BLK_DEV_OPTI621 is not set -# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_PDC202XX_NEW is not set -# CONFIG_BLK_DEV_PDC202XX_OLD is not set -# CONFIG_BLK_DEV_PIIX is not set -# CONFIG_BLK_DEV_PLATFORM is not set -# CONFIG_BLK_DEV_PMEM is not set -# CONFIG_BLK_DEV_QD65XX is not set -# CONFIG_BLK_DEV_RAM is not set -# CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set -# CONFIG_BLK_DEV_RZ1000 is not set -# CONFIG_BLK_DEV_SC1200 is not set -# CONFIG_BLK_DEV_SD is not set -# CONFIG_BLK_DEV_SIIMAGE is not set -# CONFIG_BLK_DEV_SIS5513 is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SL82C105 is not set -# CONFIG_BLK_DEV_SLC90E66 is not set -# CONFIG_BLK_DEV_SR is not set -# CONFIG_BLK_DEV_SVWKS is not set -# CONFIG_BLK_DEV_SX8 is not set -# CONFIG_BLK_DEV_TC86C001 is not set -# CONFIG_BLK_DEV_THROTTLING is not set -# CONFIG_BLK_DEV_TRIFLEX is not set -# CONFIG_BLK_DEV_TRM290 is not set -# CONFIG_BLK_DEV_UMC8672 is not set -# CONFIG_BLK_DEV_UMEM is not set -# CONFIG_BLK_DEV_VIA82CXXX is not set -# CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_INLINE_ENCRYPTION is not set -# CONFIG_BLK_SED_OPAL is not set -# CONFIG_BLK_WBT is not set -CONFIG_BLOCK=y -# CONFIG_BMA180 is not set -# CONFIG_BMA220 is not set -# CONFIG_BMA400 is not set -# CONFIG_BMC150_ACCEL is not set -# CONFIG_BMC150_MAGN is not set -# CONFIG_BMC150_MAGN_I2C is not set -# CONFIG_BMC150_MAGN_SPI is not set -# CONFIG_BME680 is not set -# CONFIG_BMG160 is not set -# CONFIG_BMI160_I2C is not set -# CONFIG_BMI160_SPI is not set -# CONFIG_BMIPS_GENERIC is not set -# CONFIG_BMP280 is not set -# CONFIG_BNA is not set -# CONFIG_BNX2 is not set -# CONFIG_BNX2X is not set -# CONFIG_BNX2X_SRIOV is not set -# CONFIG_BNXT is not set -# CONFIG_BONDING is not set -# CONFIG_BOOKE_WDT is not set -CONFIG_BOOKE_WDT_DEFAULT_TIMEOUT=3 -# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -# CONFIG_BOOTTIME_TRACING is not set -# CONFIG_BOOT_CONFIG is not set -# CONFIG_BOOT_PRINTK_DELAY is not set -CONFIG_BOOT_RAW=y -# CONFIG_BOUNCE is not set -CONFIG_BPF=y -# CONFIG_BPFILTER is not set -CONFIG_BPF_JIT=y -# CONFIG_BPF_JIT_ALWAYS_ON is not set -CONFIG_BPF_JIT_DEFAULT_ON=y -# CONFIG_BPF_PRELOAD is not set -# CONFIG_BPF_STREAM_PARSER is not set -CONFIG_BPF_SYSCALL=y -CONFIG_BPF_UNPRIV_DEFAULT_OFF=y -# CONFIG_BPQETHER is not set -CONFIG_BQL=y -CONFIG_BRANCH_PROFILE_NONE=y -# CONFIG_BRCMFMAC is not set -# CONFIG_BRCMSMAC is not set -# CONFIG_BRCMSTB_GISB_ARB is not set -CONFIG_BRIDGE=y -# CONFIG_BRIDGE_EBT_802_3 is not set -# CONFIG_BRIDGE_EBT_AMONG is not set -# CONFIG_BRIDGE_EBT_ARP is not set -# CONFIG_BRIDGE_EBT_ARPREPLY is not set -# CONFIG_BRIDGE_EBT_BROUTE is not set -# CONFIG_BRIDGE_EBT_DNAT is not set -# CONFIG_BRIDGE_EBT_IP is not set -# CONFIG_BRIDGE_EBT_IP6 is not set -# CONFIG_BRIDGE_EBT_LIMIT is not set -# CONFIG_BRIDGE_EBT_LOG is not set -# CONFIG_BRIDGE_EBT_MARK is not set -# CONFIG_BRIDGE_EBT_MARK_T is not set -# CONFIG_BRIDGE_EBT_NFLOG is not set -# CONFIG_BRIDGE_EBT_PKTTYPE is not set -# CONFIG_BRIDGE_EBT_REDIRECT is not set -# CONFIG_BRIDGE_EBT_SNAT is not set -# CONFIG_BRIDGE_EBT_STP is not set -# CONFIG_BRIDGE_EBT_T_FILTER is not set -# CONFIG_BRIDGE_EBT_T_NAT is not set -# CONFIG_BRIDGE_EBT_VLAN is not set -CONFIG_BRIDGE_IGMP_SNOOPING=y -# CONFIG_BRIDGE_MRP is not set -# CONFIG_BRIDGE_NETFILTER is not set -# CONFIG_BRIDGE_NF_EBTABLES is not set -CONFIG_BRIDGE_VLAN_FILTERING=y -# CONFIG_BROADCOM_PHY is not set -CONFIG_BROKEN_ON_SMP=y -# CONFIG_BSD_DISKLABEL is not set -# CONFIG_BSD_PROCESS_ACCT is not set -# CONFIG_BSD_PROCESS_ACCT_V3 is not set -# CONFIG_BT is not set -# CONFIG_BTRFS_ASSERT is not set -# CONFIG_BTRFS_DEBUG is not set -# CONFIG_BTRFS_FS is not set -# CONFIG_BTRFS_FS_POSIX_ACL is not set -# CONFIG_BTRFS_FS_REF_VERIFY is not set -# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set -# CONFIG_BT_ATH3K is not set -# CONFIG_BT_BNEP is not set -CONFIG_BT_BNEP_MC_FILTER=y -CONFIG_BT_BNEP_PROTO_FILTER=y -# CONFIG_BT_BREDR is not set -# CONFIG_BT_CMTP is not set -# CONFIG_BT_FEATURE_DEBUG is not set -# CONFIG_BT_HCIBCM203X is not set -# CONFIG_BT_HCIBFUSB is not set -# CONFIG_BT_HCIBLUECARD is not set -# CONFIG_BT_HCIBPA10X is not set -# CONFIG_BT_HCIBT3C is not set -# CONFIG_BT_HCIBTSDIO is not set -# CONFIG_BT_HCIBTUSB is not set -# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set -# CONFIG_BT_HCIBTUSB_MTK is not set -# CONFIG_BT_HCIBTUSB_RTL is not set -# CONFIG_BT_HCIDTL1 is not set -# CONFIG_BT_HCIUART is not set -# CONFIG_BT_HCIUART_3WIRE is not set -# CONFIG_BT_HCIUART_AG6XX is not set -# CONFIG_BT_HCIUART_ATH3K is not set -CONFIG_BT_HCIUART_BCSP=y -CONFIG_BT_HCIUART_H4=y -# CONFIG_BT_HCIUART_LL is not set -# CONFIG_BT_HCIUART_MRVL is not set -# CONFIG_BT_HCIUART_QCA is not set -# CONFIG_BT_HCIUART_RTL is not set -# CONFIG_BT_HCIVHCI is not set -# CONFIG_BT_HIDP is not set -# CONFIG_BT_HS is not set -# CONFIG_BT_LE is not set -# CONFIG_BT_LEDS is not set -# CONFIG_BT_MRVL is not set -# CONFIG_BT_MSFTEXT is not set -# CONFIG_BT_MTKSDIO is not set -# CONFIG_BT_MTKUART is not set -# CONFIG_BT_RFCOMM is not set -CONFIG_BT_RFCOMM_TTY=y -# CONFIG_BT_SELFTEST is not set -CONFIG_BUG=y -# CONFIG_BUG_ON_DATA_CORRUPTION is not set -CONFIG_BUILDTIME_EXTABLE_SORT=y -CONFIG_BUILDTIME_TABLE_SORT=y -# CONFIG_BUILD_BIN2C is not set -CONFIG_BUILD_SALT="" -# CONFIG_C2PORT is not set -CONFIG_CACHE_L2X0_PMU=y -# CONFIG_CADENCE_WATCHDOG is not set -# CONFIG_CAIF is not set -# CONFIG_CAN is not set -# CONFIG_CAN_BCM is not set -# CONFIG_CAN_DEBUG_DEVICES is not set -# CONFIG_CAN_DEV is not set -# CONFIG_CAN_GS_USB is not set -# CONFIG_CAN_GW is not set -# CONFIG_CAN_HI311X is not set -# CONFIG_CAN_IFI_CANFD is not set -# CONFIG_CAN_ISOTP is not set -# CONFIG_CAN_J1939 is not set -# CONFIG_CAN_KVASER_PCIEFD is not set -# CONFIG_CAN_MCBA_USB is not set -# CONFIG_CAN_MCP251XFD is not set -# CONFIG_CAN_M_CAN is not set -# CONFIG_CAN_PEAK_PCIEFD is not set -# CONFIG_CAN_RAW is not set -# CONFIG_CAN_RCAR is not set -# CONFIG_CAN_RCAR_CANFD is not set -# CONFIG_CAN_SLCAN is not set -# CONFIG_CAN_SUN4I is not set -# CONFIG_CAN_UCAN is not set -# CONFIG_CAN_VCAN is not set -# CONFIG_CAN_VXCAN is not set -# CONFIG_CAPI_AVM is not set -# CONFIG_CAPI_EICON is not set -# CONFIG_CAPI_TRACE is not set -CONFIG_CARDBUS=y -# CONFIG_CARDMAN_4000 is not set -# CONFIG_CARDMAN_4040 is not set -# CONFIG_CARL9170 is not set -# CONFIG_CASSINI is not set -# CONFIG_CAVIUM_CPT is not set -# CONFIG_CAVIUM_ERRATUM_22375 is not set -# CONFIG_CAVIUM_ERRATUM_23144 is not set -# CONFIG_CAVIUM_ERRATUM_23154 is not set -# CONFIG_CAVIUM_ERRATUM_27456 is not set -# CONFIG_CAVIUM_ERRATUM_30115 is not set -# CONFIG_CAVIUM_OCTEON_SOC is not set -# CONFIG_CAVIUM_PTP is not set -# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set -# CONFIG_CB710_CORE is not set -# CONFIG_CC10001_ADC is not set -# CONFIG_CCS811 is not set -CONFIG_CC_CAN_LINK=y -CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -# CONFIG_CDROM_PKTCDVD is not set -# CONFIG_CEPH_FS is not set -# CONFIG_CEPH_LIB is not set -# CONFIG_CFG80211 is not set -# CONFIG_CFG80211_CERTIFICATION_ONUS is not set -# CONFIG_CGROUPS is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_CHARGER_BD99954 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_BQ24190 is not set -# CONFIG_CHARGER_BQ24257 is not set -# CONFIG_CHARGER_BQ24735 is not set -# CONFIG_CHARGER_BQ2515X is not set -# CONFIG_CHARGER_BQ25890 is not set -# CONFIG_CHARGER_BQ25980 is not set -# CONFIG_CHARGER_DETECTOR_MAX14656 is not set -# CONFIG_CHARGER_GPIO is not set -# CONFIG_CHARGER_ISP1704 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_LT3651 is not set -# CONFIG_CHARGER_LTC3651 is not set -# CONFIG_CHARGER_MANAGER is not set -# CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_RT9455 is not set -# CONFIG_CHARGER_SBS is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_CHARGER_TWL4030 is not set -# CONFIG_CHARGER_UCS1002 is not set -# CONFIG_CHASH_SELFTEST is not set -# CONFIG_CHASH_STATS is not set -# CONFIG_CHECKPOINT_RESTORE is not set -# CONFIG_CHELSIO_T1 is not set -# CONFIG_CHELSIO_T3 is not set -# CONFIG_CHELSIO_T4 is not set -# CONFIG_CHELSIO_T4VF is not set -# CONFIG_CHROME_PLATFORMS is not set -# CONFIG_CHR_DEV_OSST is not set -# CONFIG_CHR_DEV_SCH is not set -# CONFIG_CHR_DEV_SG is not set -# CONFIG_CHR_DEV_ST is not set -# CONFIG_CICADA_PHY is not set -# CONFIG_CIFS is not set -# CONFIG_CIFS_ACL is not set -CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y -# CONFIG_CIFS_DEBUG is not set -# CONFIG_CIFS_DEBUG2 is not set -# CONFIG_CIFS_FSCACHE is not set -# CONFIG_CIFS_NFSD_EXPORT is not set -CONFIG_CIFS_POSIX=y -# CONFIG_CIFS_SMB2 is not set -# CONFIG_CIFS_STATS is not set -# CONFIG_CIFS_STATS2 is not set -# CONFIG_CIFS_WEAK_PW_HASH is not set -CONFIG_CIFS_XATTR=y -# CONFIG_CIO_DAC is not set -# CONFIG_CLEANCACHE is not set -# CONFIG_CLKSRC_VERSATILE is not set -# CONFIG_CLK_HSDK is not set -# CONFIG_CLK_QORIQ is not set -# CONFIG_CLOCK_THERMAL is not set -CONFIG_CLS_U32_MARK=y -# CONFIG_CLS_U32_PERF is not set -# CONFIG_CM32181 is not set -# CONFIG_CM3232 is not set -# CONFIG_CM3323 is not set -# CONFIG_CM3605 is not set -# CONFIG_CM36651 is not set -# CONFIG_CMA is not set -CONFIG_CMDLINE="" -# CONFIG_CMDLINE_BOOL is not set -# CONFIG_CMDLINE_EXTEND is not set -# CONFIG_CMDLINE_FORCE is not set -# CONFIG_CMDLINE_FROM_BOOTLOADER is not set -# CONFIG_CMDLINE_PARTITION is not set -# CONFIG_CNIC is not set -# CONFIG_CODA_FS is not set -# CONFIG_CODE_PATCHING_SELFTEST is not set -# CONFIG_COMEDI is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CDCE925 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set -# CONFIG_COMMON_CLK_FIXED_MMIO is not set -# CONFIG_COMMON_CLK_IPROC is not set -# CONFIG_COMMON_CLK_MAX9485 is not set -# CONFIG_COMMON_CLK_MT6765 is not set -# CONFIG_COMMON_CLK_MT8167 is not set -# CONFIG_COMMON_CLK_MT8167_AUDSYS is not set -# CONFIG_COMMON_CLK_MT8167_IMGSYS is not set -# CONFIG_COMMON_CLK_MT8167_MFGCFG is not set -# CONFIG_COMMON_CLK_MT8167_MMSYS is not set -# CONFIG_COMMON_CLK_MT8167_VDECSYS is not set -# CONFIG_COMMON_CLK_NXP is not set -# CONFIG_COMMON_CLK_PIC32 is not set -# CONFIG_COMMON_CLK_PWM is not set -# CONFIG_COMMON_CLK_PXA is not set -# CONFIG_COMMON_CLK_QCOM is not set -# CONFIG_COMMON_CLK_SI514 is not set -# CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_SI570 is not set -# CONFIG_COMMON_CLK_VC5 is not set -# CONFIG_COMMON_CLK_XGENE is not set -# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set -CONFIG_COMPACTION=y -# CONFIG_COMPAL_LAPTOP is not set -# CONFIG_COMPAT is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_COMPILE_TEST is not set -# CONFIG_CONFIGFS_FS is not set -# CONFIG_CONNECTOR is not set -CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 -CONFIG_CONSOLE_LOGLEVEL_QUIET=4 -CONFIG_CONSTRUCTORS=y -# CONFIG_CONTEXT_SWITCH_TRACER is not set -# CONFIG_COPS is not set -# CONFIG_CORDIC is not set -# CONFIG_COREDUMP is not set -# CONFIG_CORESIGHT is not set -# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set -# CONFIG_CORTINA_PHY is not set -# CONFIG_COUNTER is not set -# CONFIG_CPA_DEBUG is not set -# CONFIG_CPU_BIG_ENDIAN is not set -# CONFIG_CPU_BPREDICT_DISABLE is not set -# CONFIG_CPU_DCACHE_DISABLE is not set -# CONFIG_CPU_FREQ is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set -# CONFIG_CPU_FREQ_STAT_DETAILS is not set -# CONFIG_CPU_FREQ_THERMAL is not set -# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set -# CONFIG_CPU_ICACHE_DISABLE is not set -# CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set -# CONFIG_CPU_IDLE is not set -# CONFIG_CPU_IDLE_GOV_LADDER is not set -# CONFIG_CPU_IDLE_GOV_MENU is not set -# CONFIG_CPU_IDLE_GOV_TEO is not set -# CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set -# CONFIG_CPU_ISOLATION is not set -CONFIG_CPU_LITTLE_ENDIAN=y -# CONFIG_CPU_NO_EFFICIENT_FFS is not set -CONFIG_CPU_SW_DOMAIN_PAN=y -# CONFIG_CPU_THERMAL is not set -# CONFIG_CRAMFS is not set -CONFIG_CRAMFS_BLOCKDEV=y -# CONFIG_CRAMFS_MTD is not set -# CONFIG_CRASH_DUMP is not set -# CONFIG_CRC16 is not set -CONFIG_CRC32=y -# CONFIG_CRC32_BIT is not set -CONFIG_CRC32_SARWATE=y -# CONFIG_CRC32_SELFTEST is not set -# CONFIG_CRC32_SLICEBY4 is not set -# CONFIG_CRC32_SLICEBY8 is not set -# CONFIG_CRC4 is not set -# CONFIG_CRC64 is not set -# CONFIG_CRC7 is not set -# CONFIG_CRC8 is not set -# CONFIG_CRC_CCITT is not set -# CONFIG_CRC_ITU_T is not set -# CONFIG_CRC_T10DIF is not set -CONFIG_CROSS_COMPILE="" -# CONFIG_CROSS_MEMORY_ATTACH is not set -CONFIG_CRYPTO=y -# CONFIG_CRYPTO_842 is not set -CONFIG_CRYPTO_ACOMP2=y -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_AEAD=y -CONFIG_CRYPTO_AEAD2=y -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128L is not set -# CONFIG_CRYPTO_AEGIS128L_AESNI_SSE2 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_AEGIS256 is not set -# CONFIG_CRYPTO_AEGIS256_AESNI_SSE2 is not set -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_586 is not set -# CONFIG_CRYPTO_AES_ARM is not set -# CONFIG_CRYPTO_AES_ARM64 is not set -# CONFIG_CRYPTO_AES_ARM64_BS is not set -# CONFIG_CRYPTO_AES_ARM64_CE is not set -# CONFIG_CRYPTO_AES_ARM64_CE_BLK is not set -# CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set -# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set -# CONFIG_CRYPTO_AES_ARM_BS is not set -# CONFIG_CRYPTO_AES_ARM_CE is not set -# CONFIG_CRYPTO_AES_NI_INTEL is not set -# CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_AKCIPHER=y -CONFIG_CRYPTO_AKCIPHER2=y -CONFIG_CRYPTO_ALGAPI=y -CONFIG_CRYPTO_ALGAPI2=y -# CONFIG_CRYPTO_ANSI_CPRNG is not set -# CONFIG_CRYPTO_ANUBIS is not set -# CONFIG_CRYPTO_ARC4 is not set -# CONFIG_CRYPTO_AUTHENC is not set -# CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_ARM is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CBC is not set -CONFIG_CRYPTO_CCM=y -# CONFIG_CRYPTO_CFB is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_CHACHA20_NEON is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_CHACHA_MIPS is not set -# CONFIG_CRYPTO_CMAC is not set -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32C is not set -# CONFIG_CRYPTO_CRC32C_INTEL is not set -# CONFIG_CRYPTO_CRC32_ARM_CE is not set -# CONFIG_CRYPTO_CRCT10DIF is not set -# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set -# CONFIG_CRYPTO_CRCT10DIF_ARM_CE is not set -# CONFIG_CRYPTO_CRYPTD is not set -CONFIG_CRYPTO_CTR=y -# CONFIG_CRYPTO_CTS is not set -# CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_NEON is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set -# CONFIG_CRYPTO_DEFLATE is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set -# CONFIG_CRYPTO_DEV_ATMEL_AES is not set -# CONFIG_CRYPTO_DEV_ATMEL_AUTHENC is not set -# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set -# CONFIG_CRYPTO_DEV_ATMEL_SHA is not set -# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set -# CONFIG_CRYPTO_DEV_ATMEL_TDES is not set -# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set -# CONFIG_CRYPTO_DEV_CCP is not set -# CONFIG_CRYPTO_DEV_CCP_DEBUGFS is not set -# CONFIG_CRYPTO_DEV_CCREE is not set -# CONFIG_CRYPTO_DEV_FSL_CAAM is not set -# CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC is not set -# CONFIG_CRYPTO_DEV_HIFN_795X is not set -# CONFIG_CRYPTO_DEV_HISI_SEC is not set -# CONFIG_CRYPTO_DEV_HISI_ZIP is not set -# CONFIG_CRYPTO_DEV_IMGTEC_HASH is not set -# CONFIG_CRYPTO_DEV_MARVELL_CESA is not set -# CONFIG_CRYPTO_DEV_MEDIATEK is not set -# CONFIG_CRYPTO_DEV_MV_CESA is not set -# CONFIG_CRYPTO_DEV_MXC_SCC is not set -# CONFIG_CRYPTO_DEV_MXS_DCP is not set -# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set -# CONFIG_CRYPTO_DEV_OCTEONTX_CPT is not set -# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set -# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set -# CONFIG_CRYPTO_DEV_QAT_C62X is not set -# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set -# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set -# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set -# CONFIG_CRYPTO_DEV_QCE is not set -# CONFIG_CRYPTO_DEV_S5P is not set -# CONFIG_CRYPTO_DEV_SAFEXCEL is not set -# CONFIG_CRYPTO_DEV_SAHARA is not set -# CONFIG_CRYPTO_DEV_SP_PSP is not set -# CONFIG_CRYPTO_DEV_TALITOS is not set -# CONFIG_CRYPTO_DEV_VIRTIO is not set -# CONFIG_CRYPTO_DH is not set -# CONFIG_CRYPTO_DRBG_CTR is not set -# CONFIG_CRYPTO_DRBG_HASH is not set -# CONFIG_CRYPTO_DRBG_MENU is not set -# CONFIG_CRYPTO_ECB is not set -# CONFIG_CRYPTO_ECDH is not set -# CONFIG_CRYPTO_ECHAINIV is not set -# CONFIG_CRYPTO_ECRDSA is not set -# CONFIG_CRYPTO_ESSIV is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_FIPS is not set -CONFIG_CRYPTO_GCM=y -CONFIG_CRYPTO_GF128MUL=y -CONFIG_CRYPTO_GHASH=y -# CONFIG_CRYPTO_GHASH_ARM64_CE is not set -# CONFIG_CRYPTO_GHASH_ARM_CE is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set -CONFIG_CRYPTO_HASH=y -CONFIG_CRYPTO_HASH2=y -# CONFIG_CRYPTO_HMAC is not set -# CONFIG_CRYPTO_HW is not set -# CONFIG_CRYPTO_JITTERENTROPY is not set -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_KHAZAD is not set -CONFIG_CRYPTO_KPP=y -CONFIG_CRYPTO_KPP2=y -CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=y -# CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -# CONFIG_CRYPTO_LIB_POLY1305 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_LZ4 is not set -# CONFIG_CRYPTO_LZ4HC is not set -# CONFIG_CRYPTO_LZO is not set -CONFIG_CRYPTO_MANAGER=y -CONFIG_CRYPTO_MANAGER2=y -CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y -# CONFIG_CRYPTO_MCRYPTD is not set -# CONFIG_CRYPTO_MD4 is not set -# CONFIG_CRYPTO_MD5 is not set -# CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_MORUS1280 is not set -# CONFIG_CRYPTO_MORUS1280_AVX2 is not set -# CONFIG_CRYPTO_MORUS1280_SSE2 is not set -# CONFIG_CRYPTO_MORUS640 is not set -# CONFIG_CRYPTO_MORUS640_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_NEON is not set -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_NULL2=y -# CONFIG_CRYPTO_OFB is not set -# CONFIG_CRYPTO_PCBC is not set -# CONFIG_CRYPTO_PCOMP is not set -# CONFIG_CRYPTO_PCOMP2 is not set -CONFIG_CRYPTO_PCRYPT=y -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_ARM is not set -# CONFIG_CRYPTO_POLY1305_MIPS is not set -# CONFIG_CRYPTO_POLY1305_NEON is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set -# CONFIG_CRYPTO_RMD128 is not set -# CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set -# CONFIG_CRYPTO_RNG is not set -# CONFIG_CRYPTO_RSA is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_SALSA20_586 is not set -# CONFIG_CRYPTO_SEED is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SHA1 is not set -# CONFIG_CRYPTO_SHA1_ARM is not set -# CONFIG_CRYPTO_SHA1_ARM64_CE is not set -# CONFIG_CRYPTO_SHA1_ARM_CE is not set -# CONFIG_CRYPTO_SHA1_ARM_NEON is not set -# CONFIG_CRYPTO_SHA256 is not set -# CONFIG_CRYPTO_SHA256_ARM is not set -# CONFIG_CRYPTO_SHA256_ARM64 is not set -# CONFIG_CRYPTO_SHA2_ARM64_CE is not set -# CONFIG_CRYPTO_SHA2_ARM_CE is not set -# CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SHA3_ARM64 is not set -# CONFIG_CRYPTO_SHA512 is not set -# CONFIG_CRYPTO_SHA512_ARM is not set -# CONFIG_CRYPTO_SHA512_ARM64 is not set -# CONFIG_CRYPTO_SHA512_ARM64_CE is not set -# CONFIG_CRYPTO_SIMD is not set -CONFIG_CRYPTO_SKCIPHER=y -CONFIG_CRYPTO_SKCIPHER2=y -# CONFIG_CRYPTO_SM2 is not set -# CONFIG_CRYPTO_SM3 is not set -# CONFIG_CRYPTO_SM3_ARM64_CE is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_SM4_ARM64_CE is not set -# CONFIG_CRYPTO_SPECK is not set -# CONFIG_CRYPTO_STATS is not set -# CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TEA is not set -# CONFIG_CRYPTO_TEST is not set -# CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_586 is not set -# CONFIG_CRYPTO_TWOFISH_COMMON is not set -# CONFIG_CRYPTO_USER is not set -# CONFIG_CRYPTO_USER_API_AEAD is not set -# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set -# CONFIG_CRYPTO_USER_API_HASH is not set -# CONFIG_CRYPTO_USER_API_RNG is not set -# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set -# CONFIG_CRYPTO_USER_API_SKCIPHER is not set -# CONFIG_CRYPTO_VMAC is not set -# CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_XTS is not set -# CONFIG_CRYPTO_XXHASH is not set -# CONFIG_CRYPTO_ZLIB is not set -# CONFIG_CRYPTO_ZSTD is not set -# CONFIG_CS5535_MFGPT is not set -# CONFIG_CS89x0 is not set -# CONFIG_CSD_LOCK_WAIT_DEBUG is not set -# CONFIG_CUSE is not set -# CONFIG_CW1200 is not set -# CONFIG_CXD2880_SPI_DRV is not set -# CONFIG_CXL_AFU_DRIVER_OPS is not set -# CONFIG_CXL_BASE is not set -# CONFIG_CXL_EEH is not set -# CONFIG_CXL_KERNEL_API is not set -# CONFIG_CXL_LIB is not set -# CONFIG_CYPRESS_FIRMWARE is not set -# CONFIG_DA280 is not set -# CONFIG_DA311 is not set -# CONFIG_DAVICOM_PHY is not set -# CONFIG_DAX is not set -# CONFIG_DCB is not set -# CONFIG_DDR is not set -# CONFIG_DEBUG_ALIGN_RODATA is not set -# CONFIG_DEBUG_ATOMIC_SLEEP is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -# CONFIG_DEBUG_BUGVERBOSE is not set -# CONFIG_DEBUG_CREDENTIALS is not set -# CONFIG_DEBUG_DEVRES is not set -# CONFIG_DEBUG_DRIVER is not set -# CONFIG_DEBUG_EFI is not set -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set -CONFIG_DEBUG_FS=y -CONFIG_DEBUG_FS_ALLOW_ALL=y -# CONFIG_DEBUG_FS_ALLOW_NONE is not set -# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set -# CONFIG_DEBUG_GPIO is not set -# CONFIG_DEBUG_HIGHMEM is not set -# CONFIG_DEBUG_ICEDCC is not set -# CONFIG_DEBUG_INFO is not set -# CONFIG_DEBUG_INFO_BTF is not set -# CONFIG_DEBUG_INFO_COMPRESSED is not set -# CONFIG_DEBUG_INFO_DWARF4 is not set -CONFIG_DEBUG_INFO_REDUCED=y -# CONFIG_DEBUG_INFO_SPLIT is not set -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_KMEMLEAK is not set -# CONFIG_DEBUG_KOBJECT is not set -# CONFIG_DEBUG_KOBJECT_RELEASE is not set -# CONFIG_DEBUG_LIST is not set -# CONFIG_DEBUG_LL is not set -# CONFIG_DEBUG_LL_UART_8250 is not set -# CONFIG_DEBUG_LL_UART_PL01X is not set -# CONFIG_DEBUG_LOCKDEP is not set -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set -# CONFIG_DEBUG_MEMORY_INIT is not set -# CONFIG_DEBUG_MISC is not set -# CONFIG_DEBUG_MUTEXES is not set -# CONFIG_DEBUG_NOTIFIERS is not set -# CONFIG_DEBUG_NX_TEST is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_DEBUG_PAGEALLOC is not set -# CONFIG_DEBUG_PAGE_REF is not set -# CONFIG_DEBUG_PERF_USE_VMALLOC is not set -# CONFIG_DEBUG_PER_CPU_MAPS is not set -# CONFIG_DEBUG_PINCTRL is not set -# CONFIG_DEBUG_PI_LIST is not set -# CONFIG_DEBUG_PLIST is not set -# CONFIG_DEBUG_PREEMPT is not set -# CONFIG_DEBUG_RODATA_TEST is not set -# CONFIG_DEBUG_RSEQ is not set -# CONFIG_DEBUG_RT_MUTEXES is not set -# CONFIG_DEBUG_RWSEMS is not set -# CONFIG_DEBUG_SECTION_MISMATCH is not set -# CONFIG_DEBUG_SEMIHOSTING is not set -# CONFIG_DEBUG_SG is not set -# CONFIG_DEBUG_SHIRQ is not set -# CONFIG_DEBUG_SLAB is not set -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_DEBUG_STACKOVERFLOW is not set -# CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set -# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set -# CONFIG_DEBUG_TIMEKEEPING is not set -# CONFIG_DEBUG_UART_8250_PALMCHIP is not set -# CONFIG_DEBUG_UART_8250_WORD is not set -# CONFIG_DEBUG_UART_BCM63XX is not set -# CONFIG_DEBUG_UART_FLOW_CONTROL is not set -# CONFIG_DEBUG_USER is not set -# CONFIG_DEBUG_VIRTUAL is not set -# CONFIG_DEBUG_VM is not set -# CONFIG_DEBUG_VM_PGTABLE is not set -# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set -# CONFIG_DEBUG_WX is not set -# CONFIG_DEBUG_ZBOOT is not set -# CONFIG_DECNET is not set -# CONFIG_DEFAULT_CODEL is not set -CONFIG_DEFAULT_CUBIC=y -CONFIG_DEFAULT_DEADLINE=y -# CONFIG_DEFAULT_FQ is not set -CONFIG_DEFAULT_FQ_CODEL=y -# CONFIG_DEFAULT_FQ_PIE is not set -CONFIG_DEFAULT_HOSTNAME="(none)" -CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 -CONFIG_DEFAULT_INIT="" -CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 -CONFIG_DEFAULT_NET_SCH="fq_codel" -# CONFIG_DEFAULT_NOOP is not set -# CONFIG_DEFAULT_PFIFO_FAST is not set -# CONFIG_DEFAULT_RENO is not set -CONFIG_DEFAULT_SECURITY="" -CONFIG_DEFAULT_SECURITY_DAC=y -# CONFIG_DEFAULT_SECURITY_SELINUX is not set -# CONFIG_DEFAULT_SFQ is not set -CONFIG_DEFAULT_TCP_CONG="cubic" -CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set -# CONFIG_DELL_LAPTOP is not set -# CONFIG_DELL_RBTN is not set -# CONFIG_DELL_SMBIOS is not set -# CONFIG_DELL_SMO8800 is not set -# CONFIG_DEPRECATED_PARAM_STRUCT is not set -# CONFIG_DETECT_HUNG_TASK is not set -# CONFIG_DEVKMEM is not set -# CONFIG_DEVMEM is not set -CONFIG_DEVPORT=y -# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set -# CONFIG_DEVTMPFS is not set -# CONFIG_DEVTMPFS_MOUNT is not set -# CONFIG_DEV_DAX is not set -# CONFIG_DGAP is not set -# CONFIG_DGNC is not set -# CONFIG_DHT11 is not set -# CONFIG_DISCONTIGMEM_MANUAL is not set -# CONFIG_DISPLAY_CONNECTOR_ANALOG_TV is not set -# CONFIG_DISPLAY_CONNECTOR_DVI is not set -# CONFIG_DISPLAY_CONNECTOR_HDMI is not set -# CONFIG_DISPLAY_ENCODER_TFP410 is not set -# CONFIG_DISPLAY_ENCODER_TPD12S015 is not set -# CONFIG_DISPLAY_PANEL_DPI is not set -# CONFIG_DISPLAY_PANEL_LGPHILIPS_LB035Q02 is not set -# CONFIG_DISPLAY_PANEL_TPO_TD028TTEC1 is not set -# CONFIG_DISPLAY_PANEL_TPO_TD043MTEA1 is not set -# CONFIG_DL2K is not set -# CONFIG_DLHL60D is not set -# CONFIG_DLM is not set -# CONFIG_DM9000 is not set -# CONFIG_DMABUF_HEAPS is not set -# CONFIG_DMABUF_MOVE_NOTIFY is not set -# CONFIG_DMABUF_SELFTESTS is not set -# CONFIG_DMADEVICES is not set -# CONFIG_DMADEVICES_DEBUG is not set -# CONFIG_DMARD06 is not set -# CONFIG_DMARD09 is not set -# CONFIG_DMARD10 is not set -# CONFIG_DMASCC is not set -# CONFIG_DMATEST is not set -# CONFIG_DMA_API_DEBUG is not set -CONFIG_DMA_COHERENT_POOL=y -CONFIG_DMA_DECLARE_COHERENT=y -# CONFIG_DMA_ENGINE is not set -# CONFIG_DMA_FENCE_TRACE is not set -# CONFIG_DMA_JZ4780 is not set -CONFIG_DMA_NONCOHERENT_MMAP=y -# CONFIG_DMA_NOOP_OPS is not set -# CONFIG_DMA_PERNUMA_CMA is not set -# CONFIG_DMA_SHARED_BUFFER is not set -# CONFIG_DMA_VIRT_OPS is not set -# CONFIG_DM_CACHE is not set -# CONFIG_DM_CLONE is not set -# CONFIG_DM_DEBUG is not set -# CONFIG_DM_DELAY is not set -# CONFIG_DM_DUST is not set -# CONFIG_DM_EBS is not set -# CONFIG_DM_ERA is not set -# CONFIG_DM_FLAKEY is not set -# CONFIG_DM_INTEGRITY is not set -# CONFIG_DM_LOG_USERSPACE is not set -# CONFIG_DM_LOG_WRITES is not set -# CONFIG_DM_MQ_DEFAULT is not set -# CONFIG_DM_MULTIPATH is not set -# CONFIG_DM_RAID is not set -# CONFIG_DM_SWITCH is not set -# CONFIG_DM_THIN_PROVISIONING is not set -# CONFIG_DM_UEVENT is not set -# CONFIG_DM_UNSTRIPED is not set -# CONFIG_DM_VERITY is not set -# CONFIG_DM_WRITECACHE is not set -# CONFIG_DM_ZERO is not set -# CONFIG_DNET is not set -# CONFIG_DNOTIFY is not set -# CONFIG_DNS_RESOLVER is not set -CONFIG_DOUBLEFAULT=y -# CONFIG_DP83822_PHY is not set -# CONFIG_DP83848_PHY is not set -# CONFIG_DP83867_PHY is not set -# CONFIG_DP83869_PHY is not set -# CONFIG_DP83TC811_PHY is not set -# CONFIG_DPOT_DAC is not set -# CONFIG_DPS310 is not set -CONFIG_DQL=y -# CONFIG_DRAGONRISE_FF is not set -# CONFIG_DRM is not set -# CONFIG_DRM_AMDGPU is not set -# CONFIG_DRM_AMDGPU_CIK is not set -# CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set -# CONFIG_DRM_AMDGPU_SI is not set -# CONFIG_DRM_AMDGPU_USERPTR is not set -# CONFIG_DRM_AMD_ACP is not set -# CONFIG_DRM_AMD_DC_DCN2_0 is not set -# CONFIG_DRM_AMD_DC_DCN3_0 is not set -# CONFIG_DRM_AMD_DC_HDCP is not set -# CONFIG_DRM_AMD_DC_SI is not set -# CONFIG_DRM_ANALOGIX_ANX6345 is not set -# CONFIG_DRM_ANALOGIX_ANX78XX is not set -# CONFIG_DRM_ARCPGU is not set -# CONFIG_DRM_ARMADA is not set -# CONFIG_DRM_AST is not set -# CONFIG_DRM_BOCHS is not set -# CONFIG_DRM_CDNS_DSI is not set -# CONFIG_DRM_CDNS_MHDP8546 is not set -# CONFIG_DRM_CHRONTEL_CH7033 is not set -# CONFIG_DRM_CIRRUS_QEMU is not set -# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set -# CONFIG_DRM_DEBUG_MM is not set -# CONFIG_DRM_DEBUG_SELFTEST is not set -# CONFIG_DRM_DISPLAY_CONNECTOR is not set -# CONFIG_DRM_DP_AUX_CHARDEV is not set -# CONFIG_DRM_DP_CEC is not set -# CONFIG_DRM_DUMB_VGA_DAC is not set -# CONFIG_DRM_DW_HDMI_CEC is not set -# CONFIG_DRM_ETNAVIV is not set -# CONFIG_DRM_EXYNOS is not set -# CONFIG_DRM_FBDEV_EMULATION is not set -# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set -# CONFIG_DRM_FSL_DCU is not set -# CONFIG_DRM_GM12U320 is not set -# CONFIG_DRM_GMA500 is not set -# CONFIG_DRM_HDLCD is not set -# CONFIG_DRM_HISI_HIBMC is not set -# CONFIG_DRM_HISI_KIRIN is not set -# CONFIG_DRM_I2C_ADV7511 is not set -# CONFIG_DRM_I2C_CH7006 is not set -# CONFIG_DRM_I2C_NXP_TDA9950 is not set -# CONFIG_DRM_I2C_NXP_TDA998X is not set -# CONFIG_DRM_I2C_SIL164 is not set -# CONFIG_DRM_I915 is not set -# CONFIG_DRM_KOMEDA is not set -# CONFIG_DRM_LEGACY is not set -# CONFIG_DRM_LIB_RANDOM is not set -# CONFIG_DRM_LIMA is not set -# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set -# CONFIG_DRM_LONTIUM_LT9611 is not set -# CONFIG_DRM_LVDS_CODEC is not set -# CONFIG_DRM_LVDS_ENCODER is not set -# CONFIG_DRM_MALI_DISPLAY is not set -# CONFIG_DRM_MCDE is not set -# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set -# CONFIG_DRM_MGAG200 is not set -# CONFIG_DRM_MXSFB is not set -# CONFIG_DRM_NOUVEAU is not set -# CONFIG_DRM_NWL_MIPI_DSI is not set -# CONFIG_DRM_NXP_PTN3460 is not set -# CONFIG_DRM_OMAP is not set -# CONFIG_DRM_PANEL_ARM_VERSATILE is not set -# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set -# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set -# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set -# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set -# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set -# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set -# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set -# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set -# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set -# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set -# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set -# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set -# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set -# CONFIG_DRM_PANEL_LG_LB035Q02 is not set -# CONFIG_DRM_PANEL_LG_LG4573 is not set -# CONFIG_DRM_PANEL_LVDS is not set -# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set -# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set -# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set -# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set -# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set -# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set -# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set -# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set -# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set -# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set -# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set -# CONFIG_DRM_PANEL_ROCKTECH_JH057N00900 is not set -# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set -# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set -# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set -# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set -# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set -# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set -# CONFIG_DRM_PANEL_SIMPLE is not set -# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set -# CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set -# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set -# CONFIG_DRM_PANEL_SONY_ACX424AKP is not set -# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set -# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set -# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set -# CONFIG_DRM_PANEL_TPO_TPG110 is not set -# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set -# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set -# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set -# CONFIG_DRM_PANFROST is not set -# CONFIG_DRM_PARADE_PS8622 is not set -# CONFIG_DRM_PARADE_PS8640 is not set -# CONFIG_DRM_PL111 is not set -# CONFIG_DRM_QXL is not set -# CONFIG_DRM_RADEON is not set -# CONFIG_DRM_RADEON_USERPTR is not set -# CONFIG_DRM_RCAR_DW_HDMI is not set -# CONFIG_DRM_RCAR_LVDS is not set -# CONFIG_DRM_SII902X is not set -# CONFIG_DRM_SII9234 is not set -# CONFIG_DRM_SIL_SII8620 is not set -# CONFIG_DRM_SIMPLE_BRIDGE is not set -# CONFIG_DRM_STI is not set -# CONFIG_DRM_STM is not set -# CONFIG_DRM_SUN4I is not set -# CONFIG_DRM_THINE_THC63LVD1024 is not set -# CONFIG_DRM_TIDSS is not set -# CONFIG_DRM_TILCDC is not set -# CONFIG_DRM_TINYDRM is not set -# CONFIG_DRM_TI_SN65DSI86 is not set -# CONFIG_DRM_TI_TFP410 is not set -# CONFIG_DRM_TI_TPD12S015 is not set -# CONFIG_DRM_TOSHIBA_TC358762 is not set -# CONFIG_DRM_TOSHIBA_TC358764 is not set -# CONFIG_DRM_TOSHIBA_TC358767 is not set -# CONFIG_DRM_TOSHIBA_TC358768 is not set -# CONFIG_DRM_TOSHIBA_TC358775 is not set -# CONFIG_DRM_TVE200 is not set -# CONFIG_DRM_UDL is not set -# CONFIG_DRM_VBOXVIDEO is not set -# CONFIG_DRM_VC4_HDMI_CEC is not set -# CONFIG_DRM_VGEM is not set -# CONFIG_DRM_VIRTIO_GPU is not set -# CONFIG_DRM_VKMS is not set -# CONFIG_DRM_VMWGFX is not set -# CONFIG_DRM_XEN is not set -# CONFIG_DS1682 is not set -# CONFIG_DS1803 is not set -# CONFIG_DS4424 is not set -# CONFIG_DST_CACHE is not set -# CONFIG_DTLK is not set -# CONFIG_DUMMY is not set -CONFIG_DUMMY_CONSOLE_COLUMNS=80 -CONFIG_DUMMY_CONSOLE_ROWS=25 -# CONFIG_DUMMY_IRQ is not set -# CONFIG_DVB_A8293 is not set -# CONFIG_DVB_AF9013 is not set -# CONFIG_DVB_AF9033 is not set -# CONFIG_DVB_AS102 is not set -# CONFIG_DVB_ASCOT2E is not set -# CONFIG_DVB_ATBM8830 is not set -# CONFIG_DVB_AU8522_DTV is not set -# CONFIG_DVB_AU8522_V4L is not set -# CONFIG_DVB_B2C2_FLEXCOP_USB is not set -# CONFIG_DVB_BCM3510 is not set -# CONFIG_DVB_CORE is not set -# CONFIG_DVB_CX22700 is not set -# CONFIG_DVB_CX22702 is not set -# CONFIG_DVB_CX24110 is not set -# CONFIG_DVB_CX24116 is not set -# CONFIG_DVB_CX24117 is not set -# CONFIG_DVB_CX24120 is not set -# CONFIG_DVB_CX24123 is not set -# CONFIG_DVB_CXD2099 is not set -# CONFIG_DVB_CXD2820R is not set -# CONFIG_DVB_CXD2841ER is not set -# CONFIG_DVB_CXD2880 is not set -# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set -# CONFIG_DVB_DIB3000MB is not set -# CONFIG_DVB_DIB3000MC is not set -# CONFIG_DVB_DIB7000M is not set -# CONFIG_DVB_DIB7000P is not set -# CONFIG_DVB_DIB8000 is not set -# CONFIG_DVB_DIB9000 is not set -# CONFIG_DVB_DRX39XYJ is not set -# CONFIG_DVB_DRXD is not set -# CONFIG_DVB_DRXK is not set -# CONFIG_DVB_DS3000 is not set -# CONFIG_DVB_DUMMY_FE is not set -# CONFIG_DVB_DYNAMIC_MINORS is not set -# CONFIG_DVB_EC100 is not set -# CONFIG_DVB_FIREDTV is not set -# CONFIG_DVB_HELENE is not set -# CONFIG_DVB_HORUS3A is not set -# CONFIG_DVB_ISL6405 is not set -# CONFIG_DVB_ISL6421 is not set -# CONFIG_DVB_ISL6423 is not set -# CONFIG_DVB_IX2505V is not set -# CONFIG_DVB_L64781 is not set -# CONFIG_DVB_LG2160 is not set -# CONFIG_DVB_LGDT3305 is not set -# CONFIG_DVB_LGDT3306A is not set -# CONFIG_DVB_LGDT330X is not set -# CONFIG_DVB_LGS8GL5 is not set -# CONFIG_DVB_LGS8GXX is not set -# CONFIG_DVB_LNBH25 is not set -# CONFIG_DVB_LNBH29 is not set -# CONFIG_DVB_LNBP21 is not set -# CONFIG_DVB_LNBP22 is not set -# CONFIG_DVB_M88DS3103 is not set -# CONFIG_DVB_M88RS2000 is not set -CONFIG_DVB_MAX_ADAPTERS=16 -# CONFIG_DVB_MB86A16 is not set -# CONFIG_DVB_MB86A20S is not set -# CONFIG_DVB_MMAP is not set -# CONFIG_DVB_MN88443X is not set -# CONFIG_DVB_MN88472 is not set -# CONFIG_DVB_MN88473 is not set -# CONFIG_DVB_MT312 is not set -# CONFIG_DVB_MT352 is not set -# CONFIG_DVB_MXL5XX is not set -# CONFIG_DVB_NET is not set -# CONFIG_DVB_NXT200X is not set -# CONFIG_DVB_NXT6000 is not set -# CONFIG_DVB_OR51132 is not set -# CONFIG_DVB_OR51211 is not set -# CONFIG_DVB_PLATFORM_DRIVERS is not set -# CONFIG_DVB_PLL is not set -# CONFIG_DVB_RTL2830 is not set -# CONFIG_DVB_RTL2832 is not set -# CONFIG_DVB_RTL2832_SDR is not set -# CONFIG_DVB_S5H1409 is not set -# CONFIG_DVB_S5H1411 is not set -# CONFIG_DVB_S5H1420 is not set -# CONFIG_DVB_S5H1432 is not set -# CONFIG_DVB_S921 is not set -# CONFIG_DVB_SI2165 is not set -# CONFIG_DVB_SI2168 is not set -# CONFIG_DVB_SI21XX is not set -# CONFIG_DVB_SP2 is not set -# CONFIG_DVB_SP8870 is not set -# CONFIG_DVB_SP887X is not set -# CONFIG_DVB_STB0899 is not set -# CONFIG_DVB_STB6000 is not set -# CONFIG_DVB_STB6100 is not set -# CONFIG_DVB_STV0288 is not set -# CONFIG_DVB_STV0297 is not set -# CONFIG_DVB_STV0299 is not set -# CONFIG_DVB_STV0367 is not set -# CONFIG_DVB_STV0900 is not set -# CONFIG_DVB_STV090x is not set -# CONFIG_DVB_STV0910 is not set -# CONFIG_DVB_STV6110 is not set -# CONFIG_DVB_STV6110x is not set -# CONFIG_DVB_STV6111 is not set -# CONFIG_DVB_TC90522 is not set -# CONFIG_DVB_TDA10021 is not set -# CONFIG_DVB_TDA10023 is not set -# CONFIG_DVB_TDA10048 is not set -# CONFIG_DVB_TDA1004X is not set -# CONFIG_DVB_TDA10071 is not set -# CONFIG_DVB_TDA10086 is not set -# CONFIG_DVB_TDA18271C2DD is not set -# CONFIG_DVB_TDA665x is not set -# CONFIG_DVB_TDA8083 is not set -# CONFIG_DVB_TDA8261 is not set -# CONFIG_DVB_TDA826X is not set -# CONFIG_DVB_TEST_DRIVERS is not set -# CONFIG_DVB_TS2020 is not set -# CONFIG_DVB_TTUSB_BUDGET is not set -# CONFIG_DVB_TTUSB_DEC is not set -# CONFIG_DVB_TUA6100 is not set -# CONFIG_DVB_TUNER_CX24113 is not set -# CONFIG_DVB_TUNER_DIB0070 is not set -# CONFIG_DVB_TUNER_DIB0090 is not set -# CONFIG_DVB_TUNER_ITD1000 is not set -# CONFIG_DVB_ULE_DEBUG is not set -# CONFIG_DVB_USB_V2 is not set -# CONFIG_DVB_VES1820 is not set -# CONFIG_DVB_VES1X93 is not set -# CONFIG_DVB_ZD1301_DEMOD is not set -# CONFIG_DVB_ZL10036 is not set -# CONFIG_DVB_ZL10039 is not set -# CONFIG_DVB_ZL10353 is not set -# CONFIG_DWC_XLGMAC is not set -# CONFIG_DWMAC_DWC_QOS_ETH is not set -# CONFIG_DWMAC_INTEL_PLAT is not set -# CONFIG_DWMAC_IPQ806X is not set -# CONFIG_DWMAC_LPC18XX is not set -# CONFIG_DWMAC_MESON is not set -# CONFIG_DWMAC_ROCKCHIP is not set -# CONFIG_DWMAC_SOCFPGA is not set -# CONFIG_DWMAC_STI is not set -# CONFIG_DW_AXI_DMAC is not set -# CONFIG_DW_DMAC is not set -# CONFIG_DW_DMAC_PCI is not set -# CONFIG_DW_EDMA is not set -# CONFIG_DW_EDMA_PCIE is not set -# CONFIG_DW_WATCHDOG is not set -# CONFIG_DYNAMIC_DEBUG is not set -CONFIG_DYNAMIC_DEBUG_CORE=y -# CONFIG_E100 is not set -# CONFIG_E1000 is not set -# CONFIG_E1000E is not set -# CONFIG_E1000E_HWTS is not set -# CONFIG_EARLY_PRINTK_8250 is not set -# CONFIG_EARLY_PRINTK_USB_XDBC is not set -# CONFIG_EBC_C384_WDT is not set -# CONFIG_ECHO is not set -# CONFIG_ECRYPT_FS is not set -# CONFIG_EDAC is not set -# CONFIG_EEEPC_LAPTOP is not set -# CONFIG_EEPROM_93CX6 is not set -# CONFIG_EEPROM_93XX46 is not set -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_AT25 is not set -# CONFIG_EEPROM_DIGSY_MTC_CFG is not set -# CONFIG_EEPROM_EE1004 is not set -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set -# CONFIG_EFI is not set -CONFIG_EFI_PARTITION=y -# CONFIG_EFI_VARS_PSTORE is not set -# CONFIG_EFS_FS is not set -CONFIG_ELFCORE=y -# CONFIG_ELF_CORE is not set -# CONFIG_EMAC_ROCKCHIP is not set -CONFIG_EMBEDDED=y -# CONFIG_EM_TIMER_STI is not set -# CONFIG_ENABLE_MUST_CHECK is not set -CONFIG_ENABLE_WARN_DEPRECATED=y -# CONFIG_ENA_ETHERNET is not set -# CONFIG_ENC28J60 is not set -# CONFIG_ENCLOSURE_SERVICES is not set -# CONFIG_ENCRYPTED_KEYS is not set -# CONFIG_ENCX24J600 is not set -# CONFIG_ENERGY_MODEL is not set -# CONFIG_ENIC is not set -# CONFIG_ENVELOPE_DETECTOR is not set -# CONFIG_EPAPR_PARAVIRT is not set -# CONFIG_EPIC100 is not set -CONFIG_EPOLL=y -# CONFIG_EQUALIZER is not set -# CONFIG_EROFS_FS is not set -# CONFIG_ET131X is not set -CONFIG_ETHERNET=y -# CONFIG_ETHOC is not set -CONFIG_ETHTOOL_NETLINK=y -CONFIG_EVENTFD=y -# CONFIG_EVM is not set -# CONFIG_EXFAT_FS is not set -CONFIG_EXPERT=y -CONFIG_EXPORTFS=y -# CONFIG_EXPORTFS_BLOCK_OPS is not set -# CONFIG_EXT2_FS is not set -CONFIG_EXT2_FS_XATTR=y -# CONFIG_EXT3_FS is not set -# CONFIG_EXT4_DEBUG is not set -# CONFIG_EXT4_ENCRYPTION is not set -# CONFIG_EXT4_FS is not set -# CONFIG_EXT4_FS_POSIX_ACL is not set -# CONFIG_EXT4_FS_SECURITY is not set -CONFIG_EXT4_USE_FOR_EXT2=y -# CONFIG_EXTCON is not set -# CONFIG_EXTCON_ADC_JACK is not set -# CONFIG_EXTCON_ARIZONA is not set -# CONFIG_EXTCON_AXP288 is not set -# CONFIG_EXTCON_FSA9480 is not set -# CONFIG_EXTCON_GPIO is not set -# CONFIG_EXTCON_INTEL_INT3496 is not set -# CONFIG_EXTCON_MAX3355 is not set -# CONFIG_EXTCON_PTN5150 is not set -# CONFIG_EXTCON_QCOM_SPMI_MISC is not set -# CONFIG_EXTCON_RT8973A is not set -# CONFIG_EXTCON_SM5502 is not set -# CONFIG_EXTCON_USB_GPIO is not set -CONFIG_EXTRA_FIRMWARE="" -CONFIG_EXTRA_TARGETS="" -# CONFIG_EXYNOS_ADC is not set -# CONFIG_EXYNOS_VIDEO is not set -# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set -# CONFIG_EZX_PCAP is not set -# CONFIG_F2FS_CHECK_FS is not set -# CONFIG_F2FS_FAULT_INJECTION is not set -# CONFIG_F2FS_FS is not set -# CONFIG_F2FS_FS_COMPRESSION is not set -# CONFIG_F2FS_FS_ENCRYPTION is not set -# CONFIG_F2FS_FS_POSIX_ACL is not set -# CONFIG_F2FS_FS_SECURITY is not set -CONFIG_F2FS_FS_XATTR=y -# CONFIG_F2FS_IO_TRACE is not set -CONFIG_F2FS_STAT_FS=y -# CONFIG_FAILOVER is not set -# CONFIG_FAIR_GROUP_SCHED is not set -# CONFIG_FANOTIFY is not set -# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set -CONFIG_FAT_DEFAULT_CODEPAGE=437 -CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -# CONFIG_FAT_DEFAULT_UTF8 is not set -# CONFIG_FAT_FS is not set -# CONFIG_FAULT_INJECTION is not set -# CONFIG_FB is not set -# CONFIG_FB_3DFX is not set -# CONFIG_FB_ARC is not set -# CONFIG_FB_ARK is not set -# CONFIG_FB_ARMCLCD is not set -# CONFIG_FB_ASILIANT is not set -# CONFIG_FB_ATY is not set -# CONFIG_FB_ATY128 is not set -# CONFIG_FB_AUO_K190X is not set -# CONFIG_FB_BACKLIGHT is not set -# CONFIG_FB_BIG_ENDIAN is not set -# CONFIG_FB_BOOT_VESA_SUPPORT is not set -# CONFIG_FB_BOTH_ENDIAN is not set -# CONFIG_FB_BROADSHEET is not set -# CONFIG_FB_CARMINE is not set -# CONFIG_FB_CFB_COPYAREA is not set -# CONFIG_FB_CFB_FILLRECT is not set -# CONFIG_FB_CFB_IMAGEBLIT is not set -# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_CYBER2000 is not set -# CONFIG_FB_DA8XX is not set -# CONFIG_FB_DDC is not set -# CONFIG_FB_FLEX is not set -# CONFIG_FB_FOREIGN_ENDIAN is not set -# CONFIG_FB_FSL_DIU is not set -# CONFIG_FB_GEODE is not set -# CONFIG_FB_GOLDFISH is not set -# CONFIG_FB_HGA is not set -# CONFIG_FB_I740 is not set -# CONFIG_FB_IBM_GXT4500 is not set -# CONFIG_FB_IMSTT is not set -# CONFIG_FB_IMX is not set -# CONFIG_FB_KYRO is not set -# CONFIG_FB_LE80578 is not set -# CONFIG_FB_LITTLE_ENDIAN is not set -# CONFIG_FB_MACMODES is not set -# CONFIG_FB_MATROX is not set -# CONFIG_FB_MB862XX is not set -# CONFIG_FB_METRONOME is not set -# CONFIG_FB_MODE_HELPERS is not set -# CONFIG_FB_MXS is not set -# CONFIG_FB_N411 is not set -# CONFIG_FB_NEOMAGIC is not set -CONFIG_FB_NOTIFY=y -# CONFIG_FB_NVIDIA is not set -# CONFIG_FB_OF is not set -# CONFIG_FB_OMAP2 is not set -# CONFIG_FB_OPENCORES is not set -# CONFIG_FB_PM2 is not set -# CONFIG_FB_PM3 is not set -# CONFIG_FB_PS3 is not set -# CONFIG_FB_PXA is not set -# CONFIG_FB_RADEON is not set -# CONFIG_FB_RIVA is not set -# CONFIG_FB_S1D13XXX is not set -# CONFIG_FB_S3 is not set -# CONFIG_FB_SAVAGE is not set -# CONFIG_FB_SIMPLE is not set -# CONFIG_FB_SIS is not set -# CONFIG_FB_SM712 is not set -# CONFIG_FB_SM750 is not set -# CONFIG_FB_SMSCUFX is not set -# CONFIG_FB_SSD1307 is not set -# CONFIG_FB_SVGALIB is not set -# CONFIG_FB_SYS_COPYAREA is not set -# CONFIG_FB_SYS_FILLRECT is not set -# CONFIG_FB_SYS_FOPS is not set -# CONFIG_FB_SYS_IMAGEBLIT is not set -# CONFIG_FB_TFT is not set -# CONFIG_FB_TFT_AGM1264K_FL is not set -# CONFIG_FB_TFT_BD663474 is not set -# CONFIG_FB_TFT_FBTFT_DEVICE is not set -# CONFIG_FB_TFT_HX8340BN is not set -# CONFIG_FB_TFT_HX8347D is not set -# CONFIG_FB_TFT_HX8353D is not set -# CONFIG_FB_TFT_HX8357D is not set -# CONFIG_FB_TFT_ILI9163 is not set -# CONFIG_FB_TFT_ILI9320 is not set -# CONFIG_FB_TFT_ILI9325 is not set -# CONFIG_FB_TFT_ILI9340 is not set -# CONFIG_FB_TFT_ILI9341 is not set -# CONFIG_FB_TFT_ILI9481 is not set -# CONFIG_FB_TFT_ILI9486 is not set -# CONFIG_FB_TFT_PCD8544 is not set -# CONFIG_FB_TFT_RA8875 is not set -# CONFIG_FB_TFT_S6D02A1 is not set -# CONFIG_FB_TFT_S6D1121 is not set -# CONFIG_FB_TFT_SEPS525 is not set -# CONFIG_FB_TFT_SH1106 is not set -# CONFIG_FB_TFT_SSD1289 is not set -# CONFIG_FB_TFT_SSD1305 is not set -# CONFIG_FB_TFT_SSD1306 is not set -# CONFIG_FB_TFT_SSD1325 is not set -# CONFIG_FB_TFT_SSD1331 is not set -# CONFIG_FB_TFT_SSD1351 is not set -# CONFIG_FB_TFT_ST7735R is not set -# CONFIG_FB_TFT_ST7789V is not set -# CONFIG_FB_TFT_TINYLCD is not set -# CONFIG_FB_TFT_TLS8204 is not set -# CONFIG_FB_TFT_UC1611 is not set -# CONFIG_FB_TFT_UC1701 is not set -# CONFIG_FB_TFT_UPD161704 is not set -# CONFIG_FB_TFT_WATTEROTT is not set -# CONFIG_FB_TILEBLITTING is not set -# CONFIG_FB_TMIO is not set -# CONFIG_FB_TRIDENT is not set -# CONFIG_FB_UDL is not set -# CONFIG_FB_UVESA is not set -# CONFIG_FB_VGA16 is not set -# CONFIG_FB_VIA is not set -# CONFIG_FB_VIRTUAL is not set -# CONFIG_FB_VOODOO1 is not set -# CONFIG_FB_VT8623 is not set -# CONFIG_FB_XGI is not set -# CONFIG_FCOE is not set -# CONFIG_FCOE_FNIC is not set -# CONFIG_FDDI is not set -# CONFIG_FEALNX is not set -# CONFIG_FENCE_TRACE is not set -# CONFIG_FHANDLE is not set -CONFIG_FIB_RULES=y -# CONFIG_FIELDBUS_DEV is not set -CONFIG_FILE_LOCKING=y -# CONFIG_FIND_BIT_BENCHMARK is not set -# CONFIG_FIREWIRE is not set -# CONFIG_FIREWIRE_NOSY is not set -# CONFIG_FIREWIRE_SERIAL is not set -# CONFIG_FIRMWARE_EDID is not set -# CONFIG_FIRMWARE_IN_KERNEL is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_FIT_PARTITION is not set -# CONFIG_FIXED_PHY is not set -CONFIG_FLATMEM=y -CONFIG_FLATMEM_MANUAL=y -CONFIG_FLAT_NODE_MEM_MAP=y -# CONFIG_FM10K is not set -# CONFIG_FMC is not set -# CONFIG_FONTS is not set -# CONFIG_FONT_6x8 is not set -# CONFIG_FONT_TER16x32 is not set -# CONFIG_FORCEDETH is not set -CONFIG_FORCE_MAX_ZONEORDER=11 -CONFIG_FORTIFY_SOURCE=y -# CONFIG_FPGA is not set -# CONFIG_FRAMEBUFFER_CONSOLE is not set -# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set -# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set -# CONFIG_FRAME_POINTER is not set -CONFIG_FRAME_WARN=1024 -# CONFIG_FREEZER is not set -# CONFIG_FRONTSWAP is not set -# CONFIG_FSCACHE is not set -# CONFIG_FSI is not set -# CONFIG_FSL_EDMA is not set -# CONFIG_FSL_ENETC is not set -# CONFIG_FSL_ENETC_MDIO is not set -# CONFIG_FSL_ENETC_VF is not set -# CONFIG_FSL_ERRATUM_A008585 is not set -# CONFIG_FSL_MC_BUS is not set -# CONFIG_FSL_PQ_MDIO is not set -# CONFIG_FSL_QDMA is not set -# CONFIG_FSL_RCPM is not set -# CONFIG_FSL_XGMAC_MDIO is not set -CONFIG_FSNOTIFY=y -# CONFIG_FS_DAX is not set -# CONFIG_FS_ENCRYPTION is not set -# CONFIG_FS_POSIX_ACL is not set -# CONFIG_FS_VERITY is not set -# CONFIG_FTGMAC100 is not set -# CONFIG_FTL is not set -# CONFIG_FTMAC100 is not set -# CONFIG_FTRACE is not set -# CONFIG_FTRACE_STARTUP_TEST is not set -# CONFIG_FTR_FIXUP_SELFTEST is not set -# CONFIG_FTWDT010_WATCHDOG is not set -# CONFIG_FUJITSU_ERRATUM_010001 is not set -# CONFIG_FUJITSU_ES is not set -# CONFIG_FUJITSU_LAPTOP is not set -# CONFIG_FUJITSU_TABLET is not set -# CONFIG_FUNCTION_TRACER is not set -# CONFIG_FUSE_FS is not set -# CONFIG_FUSION is not set -# CONFIG_FUSION_FC is not set -# CONFIG_FUSION_SAS is not set -# CONFIG_FUSION_SPI is not set -CONFIG_FUTEX=y -CONFIG_FUTEX_PI=y -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_FW_LOADER=y -# CONFIG_FW_LOADER_COMPRESS is not set -CONFIG_FW_LOADER_USER_HELPER=y -CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y -# CONFIG_FXAS21002C is not set -# CONFIG_FXOS8700_I2C is not set -# CONFIG_FXOS8700_SPI is not set -CONFIG_GACT_PROB=y -# CONFIG_GADGET_UAC1 is not set -# CONFIG_GAMEPORT is not set -# CONFIG_GATEWORKS_GW16083 is not set -# CONFIG_GCC_PLUGINS is not set -# CONFIG_GCOV is not set -# CONFIG_GCOV_KERNEL is not set -# CONFIG_GDB_SCRIPTS is not set -# CONFIG_GEMINI_ETHERNET is not set -# CONFIG_GENERIC_ADC_BATTERY is not set -# CONFIG_GENERIC_ADC_THERMAL is not set -CONFIG_GENERIC_CALIBRATE_DELAY=y -# CONFIG_GENERIC_CPU_DEVICES is not set -CONFIG_GENERIC_HWEIGHT=y -# CONFIG_GENERIC_IRQ_DEBUGFS is not set -CONFIG_GENERIC_IRQ_IPI=y -CONFIG_GENERIC_IRQ_PROBE=y -CONFIG_GENERIC_NET_UTILS=y -# CONFIG_GENERIC_PHY is not set -CONFIG_GENERIC_PTDUMP=y -CONFIG_GENERIC_VDSO_TIME_NS=y -# CONFIG_GENEVE is not set -# CONFIG_GENWQE is not set -# CONFIG_GFS2_FS is not set -# CONFIG_GIGASET_CAPI is not set -# CONFIG_GIGASET_DEBUG is not set -# CONFIG_GIGASET_DUMMYLL is not set -# CONFIG_GLOB_SELFTEST is not set -# CONFIG_GNSS is not set -# CONFIG_GOLDFISH is not set -# CONFIG_GOOGLE_FIRMWARE is not set -# CONFIG_GP2AP002 is not set -# CONFIG_GP2AP020A00F is not set -# CONFIG_GPD_POCKET_FAN is not set -# CONFIG_GPIOLIB is not set -CONFIG_GPIOLIB_FASTPATH_LIMIT=512 -# CONFIG_GPIO_104_DIO_48E is not set -# CONFIG_GPIO_104_IDIO_16 is not set -# CONFIG_GPIO_104_IDI_48 is not set -# CONFIG_GPIO_74X164 is not set -# CONFIG_GPIO_74XX_MMIO is not set -# CONFIG_GPIO_ADNP is not set -# CONFIG_GPIO_ADP5588 is not set -# CONFIG_GPIO_AGGREGATOR is not set -# CONFIG_GPIO_ALTERA is not set -# CONFIG_GPIO_AMD8111 is not set -# CONFIG_GPIO_AMDPT is not set -# CONFIG_GPIO_AMD_FCH is not set -# CONFIG_GPIO_BCM_KONA is not set -# CONFIG_GPIO_BT8XX is not set -# CONFIG_GPIO_CADENCE is not set -# CONFIG_GPIO_CASCADE is not set -# CONFIG_GPIO_CDEV is not set -# CONFIG_GPIO_CDEV_V1 is not set -# CONFIG_GPIO_CS5535 is not set -# CONFIG_GPIO_DWAPB is not set -# CONFIG_GPIO_EM is not set -# CONFIG_GPIO_EXAR is not set -# CONFIG_GPIO_F7188X is not set -# CONFIG_GPIO_FTGPIO010 is not set -# CONFIG_GPIO_GENERIC_PLATFORM is not set -# CONFIG_GPIO_GPIO_MM is not set -# CONFIG_GPIO_GRGPIO is not set -# CONFIG_GPIO_GW_PLD is not set -# CONFIG_GPIO_HLWD is not set -# CONFIG_GPIO_ICH is not set -# CONFIG_GPIO_IT87 is not set -# CONFIG_GPIO_LOGICVC is not set -# CONFIG_GPIO_LYNXPOINT is not set -# CONFIG_GPIO_MAX3191X is not set -# CONFIG_GPIO_MAX7300 is not set -# CONFIG_GPIO_MAX7301 is not set -# CONFIG_GPIO_MAX732X is not set -# CONFIG_GPIO_MB86S7X is not set -# CONFIG_GPIO_MC33880 is not set -# CONFIG_GPIO_MCP23S08 is not set -# CONFIG_GPIO_ML_IOH is not set -# CONFIG_GPIO_MOCKUP is not set -# CONFIG_GPIO_MPC8XXX is not set -# CONFIG_GPIO_PCA953X is not set -# CONFIG_GPIO_PCA953X_IRQ is not set -# CONFIG_GPIO_PCA9570 is not set -# CONFIG_GPIO_PCF857X is not set -# CONFIG_GPIO_PCH is not set -# CONFIG_GPIO_PCIE_IDIO_24 is not set -# CONFIG_GPIO_PCI_IDIO_16 is not set -# CONFIG_GPIO_PISOSR is not set -# CONFIG_GPIO_PL061 is not set -# CONFIG_GPIO_RCAR is not set -# CONFIG_GPIO_RDC321X is not set -# CONFIG_GPIO_SAMA5D2_PIOBU is not set -# CONFIG_GPIO_SCH is not set -# CONFIG_GPIO_SCH311X is not set -# CONFIG_GPIO_SIFIVE is not set -# CONFIG_GPIO_SX150X is not set -# CONFIG_GPIO_SYSCON is not set -CONFIG_GPIO_SYSFS=y -# CONFIG_GPIO_TPIC2810 is not set -# CONFIG_GPIO_TS4900 is not set -# CONFIG_GPIO_TS5500 is not set -# CONFIG_GPIO_VX855 is not set -# CONFIG_GPIO_WATCHDOG is not set -# CONFIG_GPIO_WINBOND is not set -# CONFIG_GPIO_WS16C48 is not set -# CONFIG_GPIO_XGENE is not set -# CONFIG_GPIO_XILINX is not set -# CONFIG_GPIO_XRA1403 is not set -# CONFIG_GPIO_ZEVIO is not set -# CONFIG_GPIO_ZX is not set -# CONFIG_GREENASIA_FF is not set -# CONFIG_GREYBUS is not set -# CONFIG_GS_FPGABOOT is not set -# CONFIG_GTP is not set -# CONFIG_GUP_BENCHMARK is not set -# CONFIG_GVE is not set -# CONFIG_HABANA_AI is not set -# CONFIG_HAMACHI is not set -# CONFIG_HAMRADIO is not set -# CONFIG_HAPPYMEAL is not set -CONFIG_HARDENED_USERCOPY=y -# CONFIG_HARDENED_USERCOPY_FALLBACK is not set -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set -CONFIG_HARDEN_EL2_VECTORS=y -# CONFIG_HARDLOCKUP_DETECTOR is not set -# CONFIG_HAVE_ARM_ARCH_TIMER is not set -# CONFIG_HCALL_STATS is not set -# CONFIG_HDC100X is not set -# CONFIG_HDC2010 is not set -# CONFIG_HDLC is not set -# CONFIG_HDLC_CISCO is not set -# CONFIG_HDLC_FR is not set -# CONFIG_HDLC_PPP is not set -# CONFIG_HDLC_RAW is not set -# CONFIG_HDLC_RAW_ETH is not set -# CONFIG_HDMI_LPE_AUDIO is not set -# CONFIG_HDQ_MASTER_OMAP is not set -# CONFIG_HEADERS_CHECK is not set -# CONFIG_HEADERS_INSTALL is not set -# CONFIG_HEADER_TEST is not set -# CONFIG_HERMES is not set -# CONFIG_HFSPLUS_FS is not set -# CONFIG_HFSPLUS_FS_POSIX_ACL is not set -# CONFIG_HFS_FS is not set -# CONFIG_HFS_FS_POSIX_ACL is not set -# CONFIG_HI8435 is not set -# CONFIG_HIBERNATION is not set -# CONFIG_HID is not set -# CONFIG_HIDRAW is not set -# CONFIG_HID_A4TECH is not set -# CONFIG_HID_ACCUTOUCH is not set -# CONFIG_HID_ACRUX is not set -# CONFIG_HID_ACRUX_FF is not set -# CONFIG_HID_ALPS is not set -# CONFIG_HID_APPLE is not set -# CONFIG_HID_APPLEIR is not set -# CONFIG_HID_ASUS is not set -# CONFIG_HID_AUREAL is not set -# CONFIG_HID_BATTERY_STRENGTH is not set -# CONFIG_HID_BELKIN is not set -# CONFIG_HID_BETOP_FF is not set -# CONFIG_HID_BIGBEN_FF is not set -# CONFIG_HID_CHERRY is not set -# CONFIG_HID_CHICONY is not set -# CONFIG_HID_CMEDIA is not set -# CONFIG_HID_CORSAIR is not set -# CONFIG_HID_COUGAR is not set -# CONFIG_HID_CP2112 is not set -# CONFIG_HID_CREATIVE_SB0540 is not set -# CONFIG_HID_CYPRESS is not set -# CONFIG_HID_DRAGONRISE is not set -# CONFIG_HID_ELAN is not set -# CONFIG_HID_ELECOM is not set -# CONFIG_HID_ELO is not set -# CONFIG_HID_EMS_FF is not set -# CONFIG_HID_EZKEY is not set -# CONFIG_HID_GEMBIRD is not set -# CONFIG_HID_GENERIC is not set -# CONFIG_HID_GFRM is not set -# CONFIG_HID_GLORIOUS is not set -# CONFIG_HID_GOOGLE_HAMMER is not set -# CONFIG_HID_GREENASIA is not set -# CONFIG_HID_GT683R is not set -# CONFIG_HID_GYRATION is not set -# CONFIG_HID_HOLTEK is not set -# CONFIG_HID_ICADE is not set -# CONFIG_HID_ITE is not set -# CONFIG_HID_JABRA is not set -# CONFIG_HID_KENSINGTON is not set -# CONFIG_HID_KEYTOUCH is not set -# CONFIG_HID_KYE is not set -# CONFIG_HID_LCPOWER is not set -# CONFIG_HID_LED is not set -# CONFIG_HID_LENOVO is not set -# CONFIG_HID_LOGITECH is not set -# CONFIG_HID_LOGITECH_DJ is not set -# CONFIG_HID_LOGITECH_HIDPP is not set -# CONFIG_HID_MACALLY is not set -# CONFIG_HID_MAGICMOUSE is not set -# CONFIG_HID_MALTRON is not set -# CONFIG_HID_MAYFLASH is not set -# CONFIG_HID_MCP2221 is not set -# CONFIG_HID_MICROSOFT is not set -# CONFIG_HID_MONTEREY is not set -# CONFIG_HID_MULTITOUCH is not set -# CONFIG_HID_NTI is not set -# CONFIG_HID_NTRIG is not set -# CONFIG_HID_ORTEK is not set -# CONFIG_HID_PANTHERLORD is not set -# CONFIG_HID_PENMOUNT is not set -# CONFIG_HID_PETALYNX is not set -# CONFIG_HID_PICOLCD is not set -# CONFIG_HID_PID is not set -# CONFIG_HID_PLANTRONICS is not set -# CONFIG_HID_PRIMAX is not set -# CONFIG_HID_PRODIKEYS is not set -# CONFIG_HID_REDRAGON is not set -# CONFIG_HID_RETRODE is not set -# CONFIG_HID_RMI is not set -# CONFIG_HID_ROCCAT is not set -# CONFIG_HID_SAITEK is not set -# CONFIG_HID_SAMSUNG is not set -# CONFIG_HID_SENSOR_HUB is not set -# CONFIG_HID_SMARTJOYPLUS is not set -# CONFIG_HID_SONY is not set -# CONFIG_HID_SPEEDLINK is not set -# CONFIG_HID_STEAM is not set -# CONFIG_HID_STEELSERIES is not set -# CONFIG_HID_SUNPLUS is not set -# CONFIG_HID_THINGM is not set -# CONFIG_HID_THRUSTMASTER is not set -# CONFIG_HID_TIVO is not set -# CONFIG_HID_TOPSEED is not set -# CONFIG_HID_TWINHAN is not set -# CONFIG_HID_U2FZERO is not set -# CONFIG_HID_UCLOGIC is not set -# CONFIG_HID_UDRAW_PS3 is not set -# CONFIG_HID_VIEWSONIC is not set -# CONFIG_HID_VIVALDI is not set -# CONFIG_HID_WACOM is not set -# CONFIG_HID_WALTOP is not set -# CONFIG_HID_WIIMOTE is not set -# CONFIG_HID_XINMO is not set -# CONFIG_HID_ZEROPLUS is not set -# CONFIG_HID_ZYDACRON is not set -# CONFIG_HIGHMEM is not set -CONFIG_HIGH_RES_TIMERS=y -# CONFIG_HINIC is not set -# CONFIG_HIP04_ETH is not set -# CONFIG_HIPPI is not set -# CONFIG_HISILICON_ERRATUM_161010101 is not set -# CONFIG_HISILICON_ERRATUM_161600802 is not set -# CONFIG_HISI_DMA is not set -# CONFIG_HISI_FEMAC is not set -# CONFIG_HISI_HIKEY_USB is not set -# CONFIG_HIX5HD2_GMAC is not set -# CONFIG_HMC425 is not set -# CONFIG_HMC6352 is not set -# CONFIG_HNS is not set -# CONFIG_HNS3 is not set -# CONFIG_HNS_DSAF is not set -# CONFIG_HNS_ENET is not set -# CONFIG_HOSTAP is not set -# CONFIG_HOSTAP_CS is not set -# CONFIG_HOSTAP_PCI is not set -# CONFIG_HOSTAP_PLX is not set -# CONFIG_HOTPLUG_CPU is not set -# CONFIG_HOTPLUG_PCI is not set -# CONFIG_HP03 is not set -# CONFIG_HP100 is not set -# CONFIG_HP206C is not set -CONFIG_HPET_MMAP_DEFAULT=y -# CONFIG_HPFS_FS is not set -# CONFIG_HP_ILO is not set -# CONFIG_HP_WIRELESS is not set -# CONFIG_HSA_AMD is not set -# CONFIG_HSI is not set -# CONFIG_HSR is not set -# CONFIG_HTC_EGPIO is not set -# CONFIG_HTC_I2CPLD is not set -# CONFIG_HTC_PASIC3 is not set -# CONFIG_HTS221 is not set -# CONFIG_HTU21 is not set -# CONFIG_HUGETLBFS is not set -# CONFIG_HUGETLB_PAGE is not set -# CONFIG_HVC_DCC is not set -# CONFIG_HVC_UDBG is not set -# CONFIG_HWLAT_TRACER is not set -# CONFIG_HWMON is not set -# CONFIG_HWMON_DEBUG_CHIP is not set -# CONFIG_HWMON_VID is not set -# CONFIG_HWSPINLOCK is not set -# CONFIG_HWSPINLOCK_OMAP is not set -CONFIG_HW_PERF_EVENTS=y -# CONFIG_HW_RANDOM is not set -# CONFIG_HW_RANDOM_AMD is not set -# CONFIG_HW_RANDOM_ATMEL is not set -# CONFIG_HW_RANDOM_BA431 is not set -# CONFIG_HW_RANDOM_CAVIUM is not set -# CONFIG_HW_RANDOM_CCTRNG is not set -# CONFIG_HW_RANDOM_EXYNOS is not set -# CONFIG_HW_RANDOM_GEODE is not set -# CONFIG_HW_RANDOM_INTEL is not set -# CONFIG_HW_RANDOM_IPROC_RNG200 is not set -# CONFIG_HW_RANDOM_MTK is not set -# CONFIG_HW_RANDOM_OMAP is not set -# CONFIG_HW_RANDOM_OMAP3_ROM is not set -# CONFIG_HW_RANDOM_PPC4XX is not set -# CONFIG_HW_RANDOM_TIMERIOMEM is not set -CONFIG_HW_RANDOM_TPM=y -# CONFIG_HW_RANDOM_VIA is not set -# CONFIG_HW_RANDOM_VIRTIO is not set -# CONFIG_HW_RANDOM_XIPHERA is not set -# CONFIG_HX711 is not set -# CONFIG_HYPERV is not set -# CONFIG_HYPERV_TSCPAGE is not set -# CONFIG_HYSDN is not set -CONFIG_HZ=100 -CONFIG_HZ_100=y -# CONFIG_HZ_1000 is not set -# CONFIG_HZ_1024 is not set -# CONFIG_HZ_128 is not set -# CONFIG_HZ_200 is not set -# CONFIG_HZ_24 is not set -# CONFIG_HZ_250 is not set -# CONFIG_HZ_256 is not set -# CONFIG_HZ_300 is not set -# CONFIG_HZ_48 is not set -# CONFIG_HZ_500 is not set -# CONFIG_HZ_PERIODIC is not set -# CONFIG_I2C is not set -# CONFIG_I2C_ALGOBIT is not set -# CONFIG_I2C_ALGOPCA is not set -# CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set -# CONFIG_I2C_AU1550 is not set -# CONFIG_I2C_BCM2835 is not set -# CONFIG_I2C_BCM_IPROC is not set -# CONFIG_I2C_CADENCE is not set -# CONFIG_I2C_CBUS_GPIO is not set -# CONFIG_I2C_CHARDEV is not set -# CONFIG_I2C_COMPAT is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEMUX_PINCTRL is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_SLAVE is not set -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_EG20T is not set -# CONFIG_I2C_ELEKTOR is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_GPIO is not set -# CONFIG_I2C_GPIO_FAULT_INJECTOR is not set -# CONFIG_I2C_HELPER_AUTO is not set -# CONFIG_I2C_HID is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_IBM_IIC is not set -# CONFIG_I2C_IMG is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_ISMT is not set -# CONFIG_I2C_JZ4780 is not set -# CONFIG_I2C_MLXCPLD is not set -# CONFIG_I2C_MPC is not set -# CONFIG_I2C_MT65XX is not set -# CONFIG_I2C_MUX is not set -# CONFIG_I2C_MUX_GPIO is not set -# CONFIG_I2C_MUX_GPMUX is not set -# CONFIG_I2C_MUX_LTC4306 is not set -# CONFIG_I2C_MUX_MLXCPLD is not set -# CONFIG_I2C_MUX_PCA9541 is not set -# CONFIG_I2C_MUX_PCA954x is not set -# CONFIG_I2C_MUX_PINCTRL is not set -# CONFIG_I2C_MUX_REG is not set -# CONFIG_I2C_MV64XXX is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_NOMADIK is not set -# CONFIG_I2C_NVIDIA_GPU is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_OCTEON is not set -# CONFIG_I2C_PARPORT is not set -# CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_PCA_ISA is not set -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_PXA_PCI is not set -# CONFIG_I2C_PXA_SLAVE is not set -# CONFIG_I2C_RCAR is not set -# CONFIG_I2C_RK3X is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_S3C2410 is not set -# CONFIG_I2C_SCMI is not set -# CONFIG_I2C_SH_MOBILE is not set -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_SLAVE is not set -# CONFIG_I2C_SLAVE_EEPROM is not set -# CONFIG_I2C_SMBUS is not set -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_THUNDERX is not set -# CONFIG_I2C_TINY_USB is not set -# CONFIG_I2C_VERSATILE is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set -# CONFIG_I2C_XILINX is not set -# CONFIG_I3C is not set -# CONFIG_I40E is not set -# CONFIG_I40EVF is not set -# CONFIG_I6300ESB_WDT is not set -# CONFIG_I82092 is not set -# CONFIG_I82365 is not set -# CONFIG_IAQCORE is not set -# CONFIG_IBM_ASM is not set -# CONFIG_IBM_EMAC_DEBUG is not set -# CONFIG_IBM_EMAC_EMAC4 is not set -# CONFIG_IBM_EMAC_MAL_CLR_ICINTSTAT is not set -# CONFIG_IBM_EMAC_MAL_COMMON_ERR is not set -# CONFIG_IBM_EMAC_NO_FLOW_CTRL is not set -# CONFIG_IBM_EMAC_RGMII is not set -# CONFIG_IBM_EMAC_TAH is not set -# CONFIG_IBM_EMAC_ZMII is not set -# CONFIG_ICE is not set -# CONFIG_ICP10100 is not set -# CONFIG_ICPLUS_PHY is not set -# CONFIG_ICS932S401 is not set -# CONFIG_IDE is not set -# CONFIG_IDEAPAD_LAPTOP is not set -# CONFIG_IDE_GD is not set -# CONFIG_IDE_PROC_FS is not set -# CONFIG_IDE_TASK_IOCTL is not set -# CONFIG_IDLE_PAGE_TRACKING is not set -# CONFIG_IEEE802154 is not set -# CONFIG_IEEE802154_ADF7242 is not set -# CONFIG_IEEE802154_ATUSB is not set -# CONFIG_IEEE802154_CA8210 is not set -# CONFIG_IEEE802154_HWSIM is not set -# CONFIG_IEEE802154_MCR20A is not set -# CONFIG_IFB is not set -# CONFIG_IGB is not set -# CONFIG_IGBVF is not set -# CONFIG_IGC is not set -# CONFIG_IIO is not set -# CONFIG_IIO_BUFFER is not set -# CONFIG_IIO_BUFFER_CB is not set -# CONFIG_IIO_BUFFER_DMA is not set -# CONFIG_IIO_BUFFER_DMAENGINE is not set -# CONFIG_IIO_BUFFER_HDC2010 is not set -# CONFIG_IIO_BUFFER_HW_CONSUMER is not set -# CONFIG_IIO_CONFIGFS is not set -CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 -# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set -# CONFIG_IIO_INTERRUPT_TRIGGER is not set -# CONFIG_IIO_MUX is not set -# CONFIG_IIO_PERIODIC_RTC_TRIGGER is not set -# CONFIG_IIO_RESCALE is not set -# CONFIG_IIO_SIMPLE_DUMMY is not set -# CONFIG_IIO_SSP_SENSORHUB is not set -# CONFIG_IIO_ST_ACCEL_3AXIS is not set -# CONFIG_IIO_ST_GYRO_3AXIS is not set -# CONFIG_IIO_ST_LSM6DSX is not set -# CONFIG_IIO_ST_MAGN_3AXIS is not set -# CONFIG_IIO_ST_PRESS is not set -# CONFIG_IIO_SW_DEVICE is not set -# CONFIG_IIO_SW_TRIGGER is not set -# CONFIG_IIO_SYSFS_TRIGGER is not set -# CONFIG_IIO_TRIGGER is not set -# CONFIG_IIO_TRIGGERED_EVENT is not set -# CONFIG_IKCONFIG is not set -# CONFIG_IKCONFIG_PROC is not set -# CONFIG_IKHEADERS is not set -# CONFIG_IMA is not set -# CONFIG_IMAGE_CMDLINE_HACK is not set -# CONFIG_IMGPDC_WDT is not set -# CONFIG_IMG_MDC_DMA is not set -# CONFIG_IMX7D_ADC is not set -# CONFIG_IMX_IPUV3_CORE is not set -# CONFIG_IMX_THERMAL is not set -# CONFIG_INA2XX_ADC is not set -# CONFIG_INDIRECT_PIO is not set -CONFIG_INET=y -CONFIG_INET_TABLE_PERTURB_ORDER=16 -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_ESPINTCP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET_AH is not set -# CONFIG_INET_DIAG is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_ESPINTCP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_LRO is not set -# CONFIG_INET_TCP_DIAG is not set -# CONFIG_INET_TUNNEL is not set -# CONFIG_INET_UDP_DIAG is not set -# CONFIG_INET_XFRM_TUNNEL is not set -# CONFIG_INFINIBAND is not set -# CONFIG_INFTL is not set -# CONFIG_INGENIC_ADC is not set -# CONFIG_INGENIC_CGU_JZ4725B is not set -# CONFIG_INGENIC_CGU_JZ4740 is not set -# CONFIG_INGENIC_CGU_JZ4770 is not set -# CONFIG_INGENIC_CGU_JZ4780 is not set -# CONFIG_INGENIC_CGU_X1000 is not set -# CONFIG_INGENIC_CGU_X1830 is not set -# CONFIG_INGENIC_OST is not set -# CONFIG_INGENIC_SYSOST is not set -# CONFIG_INGENIC_TCU_CLK is not set -# CONFIG_INGENIC_TCU_IRQ is not set -# CONFIG_INGENIC_TIMER is not set -CONFIG_INIT_ENV_ARG_LIMIT=32 -# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set -# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set -CONFIG_INIT_STACK_NONE=y -CONFIG_INOTIFY_USER=y -# CONFIG_INPUT is not set -# CONFIG_INPUT_AD714X is not set -# CONFIG_INPUT_ADXL34X is not set -# CONFIG_INPUT_APANEL is not set -# CONFIG_INPUT_ATI_REMOTE2 is not set -# CONFIG_INPUT_ATLAS_BTNS is not set -# CONFIG_INPUT_ATMEL_CAPTOUCH is not set -# CONFIG_INPUT_AXP20X_PEK is not set -# CONFIG_INPUT_BMA150 is not set -# CONFIG_INPUT_CM109 is not set -# CONFIG_INPUT_CMA3000 is not set -# CONFIG_INPUT_DRV260X_HAPTICS is not set -# CONFIG_INPUT_DRV2665_HAPTICS is not set -# CONFIG_INPUT_DRV2667_HAPTICS is not set -# CONFIG_INPUT_E3X0_BUTTON is not set -# CONFIG_INPUT_EVBUG is not set -# CONFIG_INPUT_EVDEV is not set -# CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_GP2A is not set -# CONFIG_INPUT_GPIO_BEEPER is not set -# CONFIG_INPUT_GPIO_DECODER is not set -# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set -# CONFIG_INPUT_GPIO_TILT_POLLED is not set -# CONFIG_INPUT_GPIO_VIBRA is not set -# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set -# CONFIG_INPUT_IMS_PCU is not set -# CONFIG_INPUT_IQS269A is not set -# CONFIG_INPUT_JOYDEV is not set -# CONFIG_INPUT_JOYSTICK is not set -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_KEYSPAN_REMOTE is not set -# CONFIG_INPUT_KXTJ9 is not set -# CONFIG_INPUT_LEDS is not set -# CONFIG_INPUT_MATRIXKMAP is not set -# CONFIG_INPUT_MAX8997_HAPTIC is not set -CONFIG_INPUT_MISC=y -# CONFIG_INPUT_MMA8450 is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_INPUT_MOUSEDEV is not set -# CONFIG_INPUT_MPU3050 is not set -# CONFIG_INPUT_MSM_VIBRATOR is not set -# CONFIG_INPUT_PALMAS_PWRBUTTON is not set -# CONFIG_INPUT_PCF8574 is not set -# CONFIG_INPUT_PCSPKR is not set -# CONFIG_INPUT_POLLDEV is not set -# CONFIG_INPUT_POWERMATE is not set -# CONFIG_INPUT_PWM_BEEPER is not set -# CONFIG_INPUT_PWM_VIBRA is not set -# CONFIG_INPUT_REGULATOR_HAPTIC is not set -# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set -# CONFIG_INPUT_SPARSEKMAP is not set -# CONFIG_INPUT_TABLET is not set -# CONFIG_INPUT_TOUCHSCREEN is not set -# CONFIG_INPUT_TPS65218_PWRBUTTON is not set -# CONFIG_INPUT_TWL4030_PWRBUTTON is not set -# CONFIG_INPUT_TWL4030_VIBRA is not set -# CONFIG_INPUT_TWL6040_VIBRA is not set -# CONFIG_INPUT_UINPUT is not set -# CONFIG_INPUT_WISTRON_BTNS is not set -# CONFIG_INPUT_YEALINK is not set -# CONFIG_INT340X_THERMAL is not set -# CONFIG_INTEGRITY is not set -# CONFIG_INTEGRITY_AUDIT is not set -# CONFIG_INTEGRITY_SIGNATURE is not set -# CONFIG_INTEL_ATOMISP2_LED is not set -# CONFIG_INTEL_ATOMISP2_PM is not set -# CONFIG_INTEL_CHT_INT33FE is not set -# CONFIG_INTEL_HID_EVENT is not set -# CONFIG_INTEL_IDLE is not set -# CONFIG_INTEL_IDMA64 is not set -# CONFIG_INTEL_INT0002_VGPIO is not set -# CONFIG_INTEL_IOATDMA is not set -# CONFIG_INTEL_ISH_HID is not set -# CONFIG_INTEL_MEI is not set -# CONFIG_INTEL_MEI_ME is not set -# CONFIG_INTEL_MEI_TXE is not set -# CONFIG_INTEL_MIC_CARD is not set -# CONFIG_INTEL_MIC_HOST is not set -# CONFIG_INTEL_MID_PTI is not set -# CONFIG_INTEL_OAKTRAIL is not set -# CONFIG_INTEL_PMC_CORE is not set -# CONFIG_INTEL_PUNIT_IPC is not set -# CONFIG_INTEL_RST is not set -# CONFIG_INTEL_SMARTCONNECT is not set -# CONFIG_INTEL_SOC_PMIC is not set -# CONFIG_INTEL_SOC_PMIC_CHTDC_TI is not set -# CONFIG_INTEL_SOC_PMIC_CHTWC is not set -# CONFIG_INTEL_TH is not set -# CONFIG_INTEL_VBTN is not set -# CONFIG_INTEL_XWAY_PHY is not set -# CONFIG_INTERCONNECT is not set -# CONFIG_INTERVAL_TREE_TEST is not set -# CONFIG_INV_ICM42600_I2C is not set -# CONFIG_INV_ICM42600_SPI is not set -# CONFIG_INV_MPU6050_I2C is not set -# CONFIG_INV_MPU6050_IIO is not set -# CONFIG_INV_MPU6050_SPI is not set -# CONFIG_IOMMU_SUPPORT is not set -# CONFIG_IONIC is not set -# CONFIG_IOSCHED_BFQ is not set -CONFIG_IO_STRICT_DEVMEM=y -# CONFIG_IO_URING is not set -CONFIG_IO_WQ=y -# CONFIG_IP17XX_PHY is not set -# CONFIG_IP6_NF_FILTER is not set -# CONFIG_IP6_NF_IPTABLES is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_MATCH_AH is not set -# CONFIG_IP6_NF_MATCH_EUI64 is not set -# CONFIG_IP6_NF_MATCH_FRAG is not set -# CONFIG_IP6_NF_MATCH_HL is not set -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -# CONFIG_IP6_NF_MATCH_MH is not set -# CONFIG_IP6_NF_MATCH_OPTS is not set -# CONFIG_IP6_NF_MATCH_RPFILTER is not set -# CONFIG_IP6_NF_MATCH_RT is not set -# CONFIG_IP6_NF_MATCH_SRH is not set -# CONFIG_IP6_NF_NAT is not set -# CONFIG_IP6_NF_RAW is not set -# CONFIG_IP6_NF_SECURITY is not set -# CONFIG_IP6_NF_TARGET_HL is not set -# CONFIG_IP6_NF_TARGET_MASQUERADE is not set -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_TARGET_SYNPROXY is not set -# CONFIG_IPACK_BUS is not set -# CONFIG_IPC_NS is not set -# CONFIG_IPMB_DEVICE_INTERFACE is not set -# CONFIG_IPMI_HANDLER is not set -# CONFIG_IPV6 is not set -# CONFIG_IPV6_FOU is not set -# CONFIG_IPV6_FOU_TUNNEL is not set -# CONFIG_IPV6_ILA is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_IPV6_MROUTE is not set -# CONFIG_IPV6_MROUTE_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_ROUTE_INFO is not set -# CONFIG_IPV6_RPL_LWTUNNEL is not set -# CONFIG_IPV6_SEG6_HMAC is not set -# CONFIG_IPV6_SEG6_LWTUNNEL is not set -# CONFIG_IPV6_SIT is not set -# CONFIG_IPV6_SIT_6RD is not set -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_VTI is not set -# CONFIG_IPVLAN is not set -# CONFIG_IPVTAP is not set -# CONFIG_IPW2100 is not set -# CONFIG_IPW2100_DEBUG is not set -CONFIG_IPW2100_MONITOR=y -# CONFIG_IPW2200 is not set -# CONFIG_IPW2200_DEBUG is not set -CONFIG_IPW2200_MONITOR=y -# CONFIG_IPW2200_PROMISCUOUS is not set -# CONFIG_IPW2200_QOS is not set -# CONFIG_IPW2200_RADIOTAP is not set -# CONFIG_IPWIRELESS is not set -# CONFIG_IPX is not set -CONFIG_IP_ADVANCED_ROUTER=y -# CONFIG_IP_DCCP is not set -# CONFIG_IP_FIB_TRIE_STATS is not set -# CONFIG_IP_MROUTE is not set -CONFIG_IP_MROUTE_MULTIPLE_TABLES=y -CONFIG_IP_MULTICAST=y -CONFIG_IP_MULTIPLE_TABLES=y -# CONFIG_IP_NF_ARPFILTER is not set -# CONFIG_IP_NF_ARPTABLES is not set -# CONFIG_IP_NF_ARP_MANGLE is not set -# CONFIG_IP_NF_FILTER is not set -# CONFIG_IP_NF_IPTABLES is not set -# CONFIG_IP_NF_MANGLE is not set -# CONFIG_IP_NF_MATCH_AH is not set -# CONFIG_IP_NF_MATCH_ECN is not set -# CONFIG_IP_NF_MATCH_RPFILTER is not set -# CONFIG_IP_NF_MATCH_TTL is not set -# CONFIG_IP_NF_RAW is not set -# CONFIG_IP_NF_SECURITY is not set -# CONFIG_IP_NF_TARGET_CLUSTERIP is not set -# CONFIG_IP_NF_TARGET_ECN is not set -# CONFIG_IP_NF_TARGET_MASQUERADE is not set -# CONFIG_IP_NF_TARGET_NETMAP is not set -# CONFIG_IP_NF_TARGET_REDIRECT is not set -# CONFIG_IP_NF_TARGET_REJECT is not set -# CONFIG_IP_NF_TARGET_SYNPROXY is not set -# CONFIG_IP_NF_TARGET_TTL is not set -# CONFIG_IP_PIMSM_V1 is not set -# CONFIG_IP_PIMSM_V2 is not set -# CONFIG_IP_PNP is not set -CONFIG_IP_ROUTE_MULTIPATH=y -CONFIG_IP_ROUTE_VERBOSE=y -# CONFIG_IP_SCTP is not set -# CONFIG_IP_SET is not set -# CONFIG_IP_SET_HASH_IPMAC is not set -# CONFIG_IP_VS is not set -# CONFIG_IP_VS_MH is not set -CONFIG_IP_VS_MH_TAB_INDEX=10 -# CONFIG_IRDA is not set -# CONFIG_IRQSOFF_TRACER is not set -# CONFIG_IRQ_ALL_CPUS is not set -# CONFIG_IRQ_DOMAIN_DEBUG is not set -# CONFIG_IRQ_POLL is not set -# CONFIG_IRQ_TIME_ACCOUNTING is not set -# CONFIG_IR_GPIO_CIR is not set -# CONFIG_IR_HIX5HD2 is not set -# CONFIG_IR_IGORPLUGUSB is not set -# CONFIG_IR_IGUANA is not set -# CONFIG_IR_IMG is not set -# CONFIG_IR_IMON is not set -# CONFIG_IR_IMON_RAW is not set -# CONFIG_IR_JVC_DECODER is not set -# CONFIG_IR_LIRC_CODEC is not set -# CONFIG_IR_MCEUSB is not set -# CONFIG_IR_NEC_DECODER is not set -# CONFIG_IR_RC5_DECODER is not set -# CONFIG_IR_RC6_DECODER is not set -# CONFIG_IR_REDRAT3 is not set -# CONFIG_IR_SONY_DECODER is not set -# CONFIG_IR_STREAMZAP is not set -# CONFIG_IR_TTUSBIR is not set -# CONFIG_ISA_BUS is not set -# CONFIG_ISA_BUS_API is not set -# CONFIG_ISCSI_BOOT_SYSFS is not set -# CONFIG_ISCSI_TCP is not set -CONFIG_ISDN=y -# CONFIG_ISDN_AUDIO is not set -# CONFIG_ISDN_CAPI is not set -# CONFIG_ISDN_CAPI_CAPIDRV is not set -# CONFIG_ISDN_DIVERSION is not set -# CONFIG_ISDN_DRV_ACT2000 is not set -# CONFIG_ISDN_DRV_GIGASET is not set -# CONFIG_ISDN_DRV_HISAX is not set -# CONFIG_ISDN_DRV_ICN is not set -# CONFIG_ISDN_DRV_LOOP is not set -# CONFIG_ISDN_DRV_PCBIT is not set -# CONFIG_ISDN_DRV_SC is not set -# CONFIG_ISDN_I4L is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_ISL29125 is not set -# CONFIG_ISL29501 is not set -# CONFIG_ISO9660_FS is not set -# CONFIG_ISS4xx is not set -# CONFIG_ITG3200 is not set -# CONFIG_IWL3945 is not set -# CONFIG_IWLWIFI is not set -# CONFIG_IXGB is not set -# CONFIG_IXGBE is not set -# CONFIG_IXGBEVF is not set -# CONFIG_JAILHOUSE_GUEST is not set -# CONFIG_JBD2_DEBUG is not set -# CONFIG_JFFS2_CMODE_FAVOURLZO is not set -# CONFIG_JFFS2_CMODE_NONE is not set -CONFIG_JFFS2_CMODE_PRIORITY=y -# CONFIG_JFFS2_CMODE_SIZE is not set -CONFIG_JFFS2_COMPRESSION_OPTIONS=y -CONFIG_JFFS2_FS=y -CONFIG_JFFS2_FS_DEBUG=0 -# CONFIG_JFFS2_FS_POSIX_ACL is not set -# CONFIG_JFFS2_FS_SECURITY is not set -# CONFIG_JFFS2_FS_WBUF_VERIFY is not set -CONFIG_JFFS2_FS_WRITEBUFFER=y -CONFIG_JFFS2_FS_XATTR=y -CONFIG_JFFS2_LZMA=y -# CONFIG_JFFS2_LZO is not set -CONFIG_JFFS2_RTIME=y -# CONFIG_JFFS2_RUBIN is not set -CONFIG_JFFS2_SUMMARY=y -# CONFIG_JFFS2_ZLIB is not set -# CONFIG_JFS_DEBUG is not set -# CONFIG_JFS_FS is not set -# CONFIG_JFS_POSIX_ACL is not set -# CONFIG_JFS_SECURITY is not set -# CONFIG_JFS_STATISTICS is not set -# CONFIG_JME is not set -CONFIG_JOLIET=y -# CONFIG_JSA1212 is not set -# CONFIG_JUMP_LABEL is not set -# CONFIG_JZ4740_WDT is not set -# CONFIG_JZ4770_PHY is not set -# CONFIG_KALLSYMS is not set -# CONFIG_KALLSYMS_ABSOLUTE_PERCPU is not set -# CONFIG_KALLSYMS_ALL is not set -CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_KALLSYMS_UNCOMPRESSED is not set -# CONFIG_KARMA_PARTITION is not set -# CONFIG_KASAN is not set -CONFIG_KASAN_STACK=1 -# CONFIG_KCMP is not set -# CONFIG_KCOV is not set -# CONFIG_KCSAN is not set -# CONFIG_KERNEL_BZIP2 is not set -# CONFIG_KERNEL_CAT is not set -# CONFIG_KERNEL_GZIP is not set -# CONFIG_KERNEL_LZ4 is not set -# CONFIG_KERNEL_LZMA is not set -# CONFIG_KERNEL_LZO is not set -CONFIG_KERNEL_MODE_NEON=y -CONFIG_KERNEL_XZ=y -# CONFIG_KERNEL_ZSTD is not set -CONFIG_KERNFS=y -# CONFIG_KEXEC is not set -# CONFIG_KEXEC_FILE is not set -# CONFIG_KEXEC_SIG is not set -# CONFIG_KEYBOARD_ADC is not set -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set -# CONFIG_KEYBOARD_APPLESPI is not set -# CONFIG_KEYBOARD_ATKBD is not set -# CONFIG_KEYBOARD_BCM is not set -# CONFIG_KEYBOARD_CAP11XX is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set -# CONFIG_KEYBOARD_GPIO is not set -# CONFIG_KEYBOARD_GPIO_POLLED is not set -# CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_LM8323 is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MATRIX is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set -# CONFIG_KEYBOARD_NEWTON is not set -# CONFIG_KEYBOARD_OMAP4 is not set -# CONFIG_KEYBOARD_OPENCORES is not set -# CONFIG_KEYBOARD_PXA27x is not set -# CONFIG_KEYBOARD_QT1050 is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_SAMSUNG is not set -# CONFIG_KEYBOARD_SH_KEYSC is not set -# CONFIG_KEYBOARD_SNVS_PWRKEY is not set -# CONFIG_KEYBOARD_STMPE is not set -# CONFIG_KEYBOARD_STOWAWAY is not set -# CONFIG_KEYBOARD_SUNKBD is not set -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_TEGRA is not set -# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set -# CONFIG_KEYBOARD_TWL4030 is not set -# CONFIG_KEYBOARD_XTKBD is not set -# CONFIG_KEYS is not set -# CONFIG_KEYS_REQUEST_CACHE is not set -# CONFIG_KEY_DH_OPERATIONS is not set -# CONFIG_KGDB is not set -# CONFIG_KMEMCHECK is not set -# CONFIG_KMX61 is not set -# CONFIG_KPC2000 is not set -# CONFIG_KPROBES is not set -# CONFIG_KPROBES_SANITY_TEST is not set -# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set -# CONFIG_KPROBE_EVENT_GEN_TEST is not set -# CONFIG_KS7010 is not set -# CONFIG_KS8842 is not set -# CONFIG_KS8851 is not set -# CONFIG_KS8851_MLL is not set -# CONFIG_KSM is not set -# CONFIG_KSZ884X_PCI is not set -# CONFIG_KUNIT is not set -CONFIG_KUSER_HELPERS=y -# CONFIG_KVM_AMD is not set -# CONFIG_KVM_AMD_SEV is not set -# CONFIG_KVM_GUEST is not set -# CONFIG_KVM_INTEL is not set -# CONFIG_KVM_WERROR is not set -# CONFIG_KXCJK1013 is not set -# CONFIG_KXSD9 is not set -# CONFIG_L2TP is not set -# CONFIG_L2TP_ETH is not set -# CONFIG_L2TP_IP is not set -# CONFIG_L2TP_V3 is not set -# CONFIG_LAN743X is not set -# CONFIG_LANMEDIA is not set -# CONFIG_LANTIQ is not set -# CONFIG_LAPB is not set -# CONFIG_LASAT is not set -# CONFIG_LATENCYTOP is not set -# CONFIG_LATTICE_ECP3_CONFIG is not set -CONFIG_LBDAF=y -# CONFIG_LCD_AMS369FG06 is not set -# CONFIG_LCD_CLASS_DEVICE is not set -# CONFIG_LCD_HX8357 is not set -# CONFIG_LCD_ILI922X is not set -# CONFIG_LCD_ILI9320 is not set -# CONFIG_LCD_L4F00242T03 is not set -# CONFIG_LCD_LD9040 is not set -# CONFIG_LCD_LMS283GF05 is not set -# CONFIG_LCD_LMS501KF03 is not set -# CONFIG_LCD_LTV350QV is not set -# CONFIG_LCD_OTM3225A is not set -# CONFIG_LCD_S6E63M0 is not set -# CONFIG_LCD_TDO24M is not set -# CONFIG_LCD_VGG2432A4 is not set -CONFIG_LDISC_AUTOLOAD=y -# CONFIG_LDM_PARTITION is not set -CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y -# CONFIG_LEDS_AN30259A is not set -# CONFIG_LEDS_APU is not set -# CONFIG_LEDS_AW2013 is not set -# CONFIG_LEDS_BCM6328 is not set -# CONFIG_LEDS_BCM6358 is not set -# CONFIG_LEDS_BD2802 is not set -# CONFIG_LEDS_BLINKM is not set -CONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y -CONFIG_LEDS_CLASS=y -# CONFIG_LEDS_CLASS_FLASH is not set -CONFIG_LEDS_CLASS_MULTICOLOR=y -# CONFIG_LEDS_CR0014114 is not set -# CONFIG_LEDS_DAC124S085 is not set -# CONFIG_LEDS_EL15203000 is not set -# CONFIG_LEDS_GPIO is not set -# CONFIG_LEDS_INTEL_SS4200 is not set -# CONFIG_LEDS_IS31FL319X is not set -# CONFIG_LEDS_IS31FL32XX is not set -# CONFIG_LEDS_LM3530 is not set -# CONFIG_LEDS_LM3532 is not set -# CONFIG_LEDS_LM355x is not set -# CONFIG_LEDS_LM3642 is not set -# CONFIG_LEDS_LM3692X is not set -# CONFIG_LEDS_LP3944 is not set -# CONFIG_LEDS_LP3952 is not set -# CONFIG_LEDS_LP50XX is not set -# CONFIG_LEDS_LP5521 is not set -# CONFIG_LEDS_LP5523 is not set -# CONFIG_LEDS_LP5562 is not set -# CONFIG_LEDS_LP55XX_COMMON is not set -# CONFIG_LEDS_LP8501 is not set -# CONFIG_LEDS_LP8860 is not set -# CONFIG_LEDS_LT3593 is not set -# CONFIG_LEDS_MLXCPLD is not set -# CONFIG_LEDS_MLXREG is not set -# CONFIG_LEDS_NIC78BX is not set -# CONFIG_LEDS_NS2 is not set -# CONFIG_LEDS_OT200 is not set -# CONFIG_LEDS_PCA9532 is not set -# CONFIG_LEDS_PCA955X is not set -# CONFIG_LEDS_PCA963X is not set -# CONFIG_LEDS_PWM is not set -# CONFIG_LEDS_REGULATOR is not set -# CONFIG_LEDS_SPI_BYTE is not set -# CONFIG_LEDS_SYSCON is not set -# CONFIG_LEDS_TCA6507 is not set -# CONFIG_LEDS_TI_LMU_COMMON is not set -# CONFIG_LEDS_TLC591XX is not set -CONFIG_LEDS_TRIGGERS=y -# CONFIG_LEDS_TRIGGER_ACTIVITY is not set -# CONFIG_LEDS_TRIGGER_AUDIO is not set -# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set -# CONFIG_LEDS_TRIGGER_CAMERA is not set -# CONFIG_LEDS_TRIGGER_CPU is not set -CONFIG_LEDS_TRIGGER_DEFAULT_ON=y -# CONFIG_LEDS_TRIGGER_DISK is not set -# CONFIG_LEDS_TRIGGER_GPIO is not set -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -# CONFIG_LEDS_TRIGGER_MTD is not set -CONFIG_LEDS_TRIGGER_NETDEV=y -# CONFIG_LEDS_TRIGGER_ONESHOT is not set -# CONFIG_LEDS_TRIGGER_PANIC is not set -# CONFIG_LEDS_TRIGGER_PATTERN is not set -CONFIG_LEDS_TRIGGER_TIMER=y -# CONFIG_LEDS_TRIGGER_TRANSIENT is not set -# CONFIG_LEDS_TURRIS_OMNIA is not set -# CONFIG_LEDS_UBNT_LEDBAR is not set -# CONFIG_LEDS_USER is not set -# CONFIG_LED_TRIGGER_PHY is not set -# CONFIG_LEGACY_PTYS is not set -# CONFIG_LGUEST is not set -# CONFIG_LIB80211 is not set -# CONFIG_LIB80211_CRYPT_CCMP is not set -# CONFIG_LIB80211_CRYPT_TKIP is not set -# CONFIG_LIB80211_CRYPT_WEP is not set -# CONFIG_LIB80211_DEBUG is not set -# CONFIG_LIBCRC32C is not set -# CONFIG_LIBERTAS is not set -# CONFIG_LIBERTAS_THINFIRM is not set -# CONFIG_LIBERTAS_USB is not set -# CONFIG_LIBFC is not set -# CONFIG_LIBFCOE is not set -# CONFIG_LIBIPW_DEBUG is not set -# CONFIG_LIBNVDIMM is not set -CONFIG_LIB_MEMNEQ=y -# CONFIG_LIDAR_LITE_V2 is not set -CONFIG_LINEAR_RANGES=y -# CONFIG_LIQUIDIO is not set -# CONFIG_LIQUIDIO_VF is not set -# CONFIG_LIS3L02DQ is not set -# CONFIG_LKDTM is not set -CONFIG_LLC=y -# CONFIG_LLC2 is not set -# CONFIG_LMP91000 is not set -# CONFIG_LNET is not set -CONFIG_LOCALVERSION="" -# CONFIG_LOCALVERSION_AUTO is not set -# CONFIG_LOCKD is not set -CONFIG_LOCKDEP_SUPPORT=y -CONFIG_LOCKD_V4=y -# CONFIG_LOCKUP_DETECTOR is not set -# CONFIG_LOCK_EVENT_COUNTS is not set -# CONFIG_LOCK_STAT is not set -# CONFIG_LOCK_TORTURE_TEST is not set -# CONFIG_LOGFS is not set -# CONFIG_LOGIG940_FF is not set -# CONFIG_LOGIRUMBLEPAD2_FF is not set -# CONFIG_LOGITECH_FF is not set -# CONFIG_LOGIWHEELS_FF is not set -# CONFIG_LOGO is not set -CONFIG_LOG_BUF_SHIFT=17 -CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 -# CONFIG_LOONGSON_MC146818 is not set -# CONFIG_LPC_ICH is not set -# CONFIG_LPC_SCH is not set -# CONFIG_LP_CONSOLE is not set -# CONFIG_LSI_ET1011C_PHY is not set -CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity" -CONFIG_LSM_MMAP_MIN_ADDR=65536 -# CONFIG_LTC1660 is not set -# CONFIG_LTC2471 is not set -# CONFIG_LTC2485 is not set -# CONFIG_LTC2496 is not set -# CONFIG_LTC2497 is not set -# CONFIG_LTC2632 is not set -# CONFIG_LTC2983 is not set -# CONFIG_LTE_GDM724X is not set -# CONFIG_LTPC is not set -# CONFIG_LTR501 is not set -# CONFIG_LUSTRE_FS is not set -# CONFIG_LV0104CS is not set -# CONFIG_LWTUNNEL is not set -# CONFIG_LXT_PHY is not set -# CONFIG_LZ4HC_COMPRESS is not set -# CONFIG_LZ4_COMPRESS is not set -# CONFIG_LZ4_DECOMPRESS is not set -CONFIG_LZMA_COMPRESS=y -CONFIG_LZMA_DECOMPRESS=y -# CONFIG_LZO_COMPRESS is not set -# CONFIG_LZO_DECOMPRESS is not set -# CONFIG_M62332 is not set -# CONFIG_MAC80211 is not set -# CONFIG_MAC80211_MESSAGE_TRACING is not set -CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 -# CONFIG_MACB is not set -# CONFIG_MACB_USE_HWSTAMP is not set -# CONFIG_MACH_ASM9260 is not set -# CONFIG_MACH_DECSTATION is not set -# CONFIG_MACH_INGENIC is not set -# CONFIG_MACH_INGENIC_SOC is not set -# CONFIG_MACH_JAZZ is not set -# CONFIG_MACH_JZ4740 is not set -# CONFIG_MACH_LOONGSON2EF is not set -# CONFIG_MACH_LOONGSON32 is not set -# CONFIG_MACH_LOONGSON64 is not set -# CONFIG_MACH_PIC32 is not set -# CONFIG_MACH_PISTACHIO is not set -# CONFIG_MACH_TX39XX is not set -# CONFIG_MACH_TX49XX is not set -# CONFIG_MACH_VR41XX is not set -# CONFIG_MACH_XILFPGA is not set -# CONFIG_MACINTOSH_DRIVERS is not set -# CONFIG_MACSEC is not set -# CONFIG_MACVLAN is not set -# CONFIG_MACVTAP is not set -# CONFIG_MAC_EMUMOUSEBTN is not set -# CONFIG_MAC_PARTITION is not set -# CONFIG_MAG3110 is not set -# CONFIG_MAGIC_SYSRQ is not set -CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 -# CONFIG_MAGIC_SYSRQ_SERIAL is not set -CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" -# CONFIG_MAILBOX is not set -# CONFIG_MANAGER_SBS is not set -# CONFIG_MANDATORY_FILE_LOCKING is not set -# CONFIG_MANGLE_BOOTARGS is not set -# CONFIG_MARVELL_10G_PHY is not set -# CONFIG_MARVELL_PHY is not set -# CONFIG_MAX1027 is not set -# CONFIG_MAX11100 is not set -# CONFIG_MAX1118 is not set -# CONFIG_MAX1241 is not set -# CONFIG_MAX1363 is not set -# CONFIG_MAX30100 is not set -# CONFIG_MAX30102 is not set -# CONFIG_MAX31856 is not set -# CONFIG_MAX44000 is not set -# CONFIG_MAX44009 is not set -# CONFIG_MAX517 is not set -# CONFIG_MAX5432 is not set -# CONFIG_MAX5481 is not set -# CONFIG_MAX5487 is not set -# CONFIG_MAX5821 is not set -# CONFIG_MAX63XX_WATCHDOG is not set -# CONFIG_MAX9611 is not set -# CONFIG_MAXIM_THERMOCOUPLE is not set -CONFIG_MAY_USE_DEVLINK=y -# CONFIG_MB1232 is not set -# CONFIG_MC3230 is not set -# CONFIG_MCB is not set -# CONFIG_MCP320X is not set -# CONFIG_MCP3422 is not set -# CONFIG_MCP3911 is not set -# CONFIG_MCP4018 is not set -# CONFIG_MCP41010 is not set -# CONFIG_MCP4131 is not set -# CONFIG_MCP4531 is not set -# CONFIG_MCP4725 is not set -# CONFIG_MCP4922 is not set -# CONFIG_MCPM is not set -# CONFIG_MD is not set -# CONFIG_MDIO_BCM_UNIMAC is not set -# CONFIG_MDIO_BITBANG is not set -# CONFIG_MDIO_BUS_MUX_GPIO is not set -# CONFIG_MDIO_BUS_MUX_MMIOREG is not set -# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set -# CONFIG_MDIO_DEVICE is not set -# CONFIG_MDIO_DEVRES is not set -# CONFIG_MDIO_HISI_FEMAC is not set -# CONFIG_MDIO_IPQ4019 is not set -# CONFIG_MDIO_IPQ8064 is not set -# CONFIG_MDIO_MSCC_MIIM is not set -# CONFIG_MDIO_MVUSB is not set -# CONFIG_MDIO_OCTEON is not set -# CONFIG_MDIO_THUNDER is not set -# CONFIG_MDIO_XPCS is not set -# CONFIG_MD_FAULTY is not set -# CONFIG_MEDIATEK_GE_PHY is not set -# CONFIG_MEDIATEK_MT6577_AUXADC is not set -# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set -# CONFIG_MEDIA_ATTACH is not set -# CONFIG_MEDIA_CAMERA_SUPPORT is not set -# CONFIG_MEDIA_CEC_SUPPORT is not set -# CONFIG_MEDIA_CONTROLLER is not set -# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set -# CONFIG_MEDIA_PCI_SUPPORT is not set -# CONFIG_MEDIA_PLATFORM_SUPPORT is not set -# CONFIG_MEDIA_RADIO_SUPPORT is not set -# CONFIG_MEDIA_RC_SUPPORT is not set -# CONFIG_MEDIA_SDR_SUPPORT is not set -# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set -# CONFIG_MEDIA_SUPPORT is not set -# CONFIG_MEDIA_SUPPORT_FILTER is not set -# CONFIG_MEDIA_TEST_SUPPORT is not set -# CONFIG_MEDIA_TUNER_E4000 is not set -# CONFIG_MEDIA_TUNER_FC0011 is not set -# CONFIG_MEDIA_TUNER_FC0012 is not set -# CONFIG_MEDIA_TUNER_FC0013 is not set -# CONFIG_MEDIA_TUNER_FC2580 is not set -# CONFIG_MEDIA_TUNER_IT913X is not set -# CONFIG_MEDIA_TUNER_M88RS6000T is not set -# CONFIG_MEDIA_TUNER_MAX2165 is not set -# CONFIG_MEDIA_TUNER_MC44S803 is not set -# CONFIG_MEDIA_TUNER_MSI001 is not set -# CONFIG_MEDIA_TUNER_MT2060 is not set -# CONFIG_MEDIA_TUNER_MT2063 is not set -# CONFIG_MEDIA_TUNER_MT20XX is not set -# CONFIG_MEDIA_TUNER_MT2131 is not set -# CONFIG_MEDIA_TUNER_MT2266 is not set -# CONFIG_MEDIA_TUNER_MXL301RF is not set -# CONFIG_MEDIA_TUNER_MXL5005S is not set -# CONFIG_MEDIA_TUNER_MXL5007T is not set -# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set -# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set -# CONFIG_MEDIA_TUNER_QT1010 is not set -# CONFIG_MEDIA_TUNER_R820T is not set -# CONFIG_MEDIA_TUNER_SI2157 is not set -# CONFIG_MEDIA_TUNER_SIMPLE is not set -# CONFIG_MEDIA_TUNER_TDA18212 is not set -# CONFIG_MEDIA_TUNER_TDA18218 is not set -# CONFIG_MEDIA_TUNER_TDA18250 is not set -# CONFIG_MEDIA_TUNER_TDA18271 is not set -# CONFIG_MEDIA_TUNER_TDA827X is not set -# CONFIG_MEDIA_TUNER_TDA8290 is not set -# CONFIG_MEDIA_TUNER_TDA9887 is not set -# CONFIG_MEDIA_TUNER_TEA5761 is not set -# CONFIG_MEDIA_TUNER_TEA5767 is not set -# CONFIG_MEDIA_TUNER_TUA9001 is not set -# CONFIG_MEDIA_TUNER_XC2028 is not set -# CONFIG_MEDIA_TUNER_XC4000 is not set -# CONFIG_MEDIA_TUNER_XC5000 is not set -# CONFIG_MEDIA_USB_SUPPORT is not set -# CONFIG_MEGARAID_LEGACY is not set -# CONFIG_MEGARAID_NEWGEN is not set -# CONFIG_MEGARAID_SAS is not set -# CONFIG_MELLANOX_PLATFORM is not set -CONFIG_MEMBARRIER=y -# CONFIG_MEMORY is not set -# CONFIG_MEMORY_FAILURE is not set -# CONFIG_MEMORY_HOTPLUG is not set -# CONFIG_MEMSTICK is not set -# CONFIG_MEMTEST is not set -# CONFIG_MEN_A21_WDT is not set -# CONFIG_MESON_SM is not set -CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_AAT2870_CORE is not set -# CONFIG_MFD_AC100 is not set -# CONFIG_MFD_ACT8945A is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_ARIZONA_SPI is not set -# CONFIG_MFD_AS3711 is not set -# CONFIG_MFD_AS3722 is not set -# CONFIG_MFD_ASIC3 is not set -# CONFIG_MFD_ATMEL_FLEXCOM is not set -# CONFIG_MFD_ATMEL_HLCDC is not set -# CONFIG_MFD_AXP20X is not set -# CONFIG_MFD_AXP20X_I2C is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_CORE is not set -# CONFIG_MFD_CPCAP is not set -# CONFIG_MFD_CROS_EC is not set -# CONFIG_MFD_CS5535 is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9052_SPI is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set -# CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_EXYNOS_LPASS is not set -# CONFIG_MFD_GATEWORKS_GSC is not set -# CONFIG_MFD_HI6421_PMIC is not set -# CONFIG_MFD_INTEL_M10_BMC is not set -# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set -# CONFIG_MFD_IQS62X is not set -# CONFIG_MFD_JANZ_CMODIO is not set -# CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_LM3533 is not set -# CONFIG_MFD_LOCHNAGAR is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_MADERA is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77620 is not set -# CONFIG_MFD_MAX77650 is not set -# CONFIG_MFD_MAX77686 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MC13XXX is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_MC13XXX_SPI is not set -# CONFIG_MFD_MENF21BMC is not set -# CONFIG_MFD_MP2629 is not set -# CONFIG_MFD_MT6360 is not set -# CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_OMAP_USB_HOST is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_MFD_PCF50633 is not set -# CONFIG_MFD_PM8921_CORE is not set -# CONFIG_MFD_PM8XXX is not set -# CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_RK808 is not set -# CONFIG_MFD_RN5T618 is not set -# CONFIG_MFD_ROHM_BD70528 is not set -# CONFIG_MFD_ROHM_BD71828 is not set -# CONFIG_MFD_ROHM_BD718XX is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RTSX_PCI is not set -# CONFIG_MFD_RTSX_USB is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_MFD_SL28CPLD is not set -# CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SMSC is not set -# CONFIG_MFD_STMFX is not set -# CONFIG_MFD_STMPE is not set -# CONFIG_MFD_STPMIC1 is not set -# CONFIG_MFD_SYSCON is not set -# CONFIG_MFD_T7L66XB is not set -# CONFIG_MFD_TC3589X is not set -# CONFIG_MFD_TC6387XB is not set -# CONFIG_MFD_TC6393XB is not set -# CONFIG_MFD_TIMBERDALE is not set -# CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TI_LP87565 is not set -# CONFIG_MFD_TMIO is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TPS65217 is not set -# CONFIG_MFD_TPS65218 is not set -# CONFIG_MFD_TPS6586X is not set -# CONFIG_MFD_TPS65910 is not set -# CONFIG_MFD_TPS65912 is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS65912_SPI is not set -# CONFIG_MFD_TPS68470 is not set -# CONFIG_MFD_TPS80031 is not set -# CONFIG_MFD_TQMX86 is not set -# CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_VX855 is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_WM831X is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM831X_SPI is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM8994 is not set -# CONFIG_MG_DISK is not set -# CONFIG_MHI_BUS is not set -# CONFIG_MICREL_KS8995MA is not set -# CONFIG_MICREL_PHY is not set -# CONFIG_MICROCHIP_KSZ is not set -# CONFIG_MICROCHIP_PHY is not set -# CONFIG_MICROCHIP_PIT64B is not set -# CONFIG_MICROCHIP_T1_PHY is not set -# CONFIG_MICROSEMI_PHY is not set -# CONFIG_MIGRATION is not set -CONFIG_HARDEN_BRANCH_HISTORY=y -CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y -CONFIG_MII=y -# CONFIG_MIKROTIK is not set -# CONFIG_MIKROTIK_RB532 is not set -# CONFIG_MINIX_FS is not set -# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set -# CONFIG_MINIX_SUBPARTITION is not set -# CONFIG_MIPS_ALCHEMY is not set -# CONFIG_MIPS_CDMM is not set -# CONFIG_MIPS_COBALT is not set -# CONFIG_MIPS_FPU_EMULATOR is not set -# CONFIG_MIPS_FP_SUPPORT is not set -# CONFIG_MIPS_GENERIC is not set -# CONFIG_MIPS_GENERIC_KERNEL is not set -# CONFIG_MIPS_MALTA is not set -# CONFIG_MIPS_O32_FP64_SUPPORT is not set -# CONFIG_MIPS_PARAVIRT is not set -# CONFIG_MIPS_PLATFORM_DEVICES is not set -# CONFIG_MIPS_SEAD3 is not set -# CONFIG_MISC_ALCOR_PCI is not set -CONFIG_MISC_FILESYSTEMS=y -# CONFIG_MISC_RTSX_PCI is not set -# CONFIG_MISC_RTSX_USB is not set -# CONFIG_MISDN is not set -# CONFIG_MISDN_AVMFRITZ is not set -# CONFIG_MISDN_HFCPCI is not set -# CONFIG_MISDN_HFCUSB is not set -# CONFIG_MISDN_INFINEON is not set -# CONFIG_MISDN_NETJET is not set -# CONFIG_MISDN_SPEEDFAX is not set -# CONFIG_MISDN_W6692 is not set -# CONFIG_MKISS is not set -# CONFIG_MLX4_CORE is not set -# CONFIG_MLX4_EN is not set -# CONFIG_MLX5_CORE is not set -# CONFIG_MLX90614 is not set -# CONFIG_MLX90632 is not set -# CONFIG_MLXFW is not set -# CONFIG_MLXSW_CORE is not set -# CONFIG_MLX_CPLD_PLATFORM is not set -# CONFIG_MLX_PLATFORM is not set -# CONFIG_MMA7455_I2C is not set -# CONFIG_MMA7455_SPI is not set -# CONFIG_MMA7660 is not set -# CONFIG_MMA8452 is not set -# CONFIG_MMA9551 is not set -# CONFIG_MMA9553 is not set -# CONFIG_MMC is not set -# CONFIG_MMC35240 is not set -# CONFIG_MMC_ARMMMCI is not set -# CONFIG_MMC_AU1X is not set -# CONFIG_MMC_BLOCK is not set -CONFIG_MMC_BLOCK_MINORS=8 -# CONFIG_MMC_CAVIUM_THUNDERX is not set -# CONFIG_MMC_CB710 is not set -# CONFIG_MMC_CQHCI is not set -# CONFIG_MMC_DEBUG is not set -# CONFIG_MMC_DW is not set -# CONFIG_MMC_HSQ is not set -# CONFIG_MMC_JZ4740 is not set -# CONFIG_MMC_MTK is not set -# CONFIG_MMC_MVSDIO is not set -# CONFIG_MMC_S3C is not set -# CONFIG_MMC_SDHCI is not set -# CONFIG_MMC_SDHCI_ACPI is not set -# CONFIG_MMC_SDHCI_AM654 is not set -# CONFIG_MMC_SDHCI_BCM_KONA is not set -# CONFIG_MMC_SDHCI_CADENCE is not set -# CONFIG_MMC_SDHCI_F_SDH30 is not set -# CONFIG_MMC_SDHCI_IPROC is not set -# CONFIG_MMC_SDHCI_MILBEAUT is not set -# CONFIG_MMC_SDHCI_MSM is not set -# CONFIG_MMC_SDHCI_OF_ARASAN is not set -# CONFIG_MMC_SDHCI_OF_ASPEED is not set -# CONFIG_MMC_SDHCI_OF_AT91 is not set -# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set -# CONFIG_MMC_SDHCI_OF_ESDHC is not set -# CONFIG_MMC_SDHCI_OF_HLWD is not set -# CONFIG_MMC_SDHCI_OMAP is not set -# CONFIG_MMC_SDHCI_PXAV2 is not set -# CONFIG_MMC_SDHCI_PXAV3 is not set -# CONFIG_MMC_SDHCI_S3C is not set -# CONFIG_MMC_SDHCI_XENON is not set -# CONFIG_MMC_SDRICOH_CS is not set -# CONFIG_MMC_SPI is not set -# CONFIG_MMC_STM32_SDMMC is not set -# CONFIG_MMC_TEST is not set -# CONFIG_MMC_TIFM_SD is not set -# CONFIG_MMC_TOSHIBA_PCI is not set -# CONFIG_MMC_USDHI6ROL0 is not set -# CONFIG_MMC_USHC is not set -# CONFIG_MMC_VIA_SDMMC is not set -# CONFIG_MMC_VUB300 is not set -# CONFIG_MMIOTRACE is not set -CONFIG_MMU=y -CONFIG_MMU_GATHER_RCU_TABLE_FREE=y -CONFIG_MMU_GATHER_TABLE_FREE=y -CONFIG_MODULES=y -# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_MODULE_COMPRESS is not set -# CONFIG_MODULE_FORCE_LOAD is not set -# CONFIG_MODULE_FORCE_UNLOAD is not set -# CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_SRCVERSION_ALL is not set -CONFIG_MODULE_STRIPPED=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_MODVERSIONS is not set -# CONFIG_MOST is not set -# CONFIG_MOUSE_APPLETOUCH is not set -# CONFIG_MOUSE_ELAN_I2C is not set -# CONFIG_MOUSE_GPIO is not set -# CONFIG_MOUSE_INPORT is not set -# CONFIG_MOUSE_LOGIBM is not set -# CONFIG_MOUSE_PC110PAD is not set -# CONFIG_MOUSE_PS2_FOCALTECH is not set -# CONFIG_MOUSE_PS2_SENTELIC is not set -# CONFIG_MOUSE_SYNAPTICS_I2C is not set -# CONFIG_MOUSE_SYNAPTICS_USB is not set -# CONFIG_MOXTET is not set -# CONFIG_MPL115 is not set -# CONFIG_MPL115_I2C is not set -# CONFIG_MPL115_SPI is not set -# CONFIG_MPL3115 is not set -# CONFIG_MPLS is not set -# CONFIG_MPLS_IPTUNNEL is not set -# CONFIG_MPLS_ROUTING is not set -# CONFIG_MPTCP is not set -# CONFIG_MPU3050_I2C is not set -# CONFIG_MQ_IOSCHED_DEADLINE is not set -# CONFIG_MQ_IOSCHED_KYBER is not set -# CONFIG_MS5611 is not set -# CONFIG_MS5637 is not set -# CONFIG_MSCC_OCELOT_SWITCH is not set -# CONFIG_MSDOS_FS is not set -CONFIG_MSDOS_PARTITION=y -# CONFIG_MSI_BITMAP_SELFTEST is not set -# CONFIG_MSI_LAPTOP is not set -# CONFIG_MST_IRQ is not set -CONFIG_MTD=y -# CONFIG_MTD_ABSENT is not set -# CONFIG_MTD_AFS_PARTS is not set -# CONFIG_MTD_AR7_PARTS is not set -CONFIG_MTD_BLKDEVS=y -CONFIG_MTD_BLOCK=y -# CONFIG_MTD_BLOCK2MTD is not set -CONFIG_MTD_CFI=y -# CONFIG_MTD_CFI_ADV_OPTIONS is not set -CONFIG_MTD_CFI_AMDSTD=y -# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -CONFIG_MTD_CFI_I1=y -CONFIG_MTD_CFI_I2=y -# CONFIG_MTD_CFI_I4 is not set -# CONFIG_MTD_CFI_I8 is not set -CONFIG_MTD_CFI_INTELEXT=y -# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -CONFIG_MTD_CFI_NOSWAP=y -# CONFIG_MTD_CFI_STAA is not set -CONFIG_MTD_CFI_UTIL=y -# CONFIG_MTD_CMDLINE_PARTS is not set -CONFIG_MTD_COMPLEX_MAPPINGS=y -# CONFIG_MTD_DATAFLASH is not set -# CONFIG_MTD_DOCG3 is not set -CONFIG_MTD_GEN_PROBE=y -# CONFIG_MTD_GPIO_ADDR is not set -# CONFIG_MTD_HYPERBUS is not set -# CONFIG_MTD_IMPA7 is not set -# CONFIG_MTD_INTEL_VR_NOR is not set -# CONFIG_MTD_JEDECPROBE is not set -# CONFIG_MTD_LATCH_ADDR is not set -# CONFIG_MTD_LPDDR is not set -# CONFIG_MTD_LPDDR2_NVM is not set -# CONFIG_MTD_M25P80 is not set -CONFIG_MTD_MAP_BANK_WIDTH_1=y -# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -CONFIG_MTD_MAP_BANK_WIDTH_2=y -# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -CONFIG_MTD_MAP_BANK_WIDTH_4=y -# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -# CONFIG_MTD_MCHP23K256 is not set -# CONFIG_MTD_MT81xx_NOR is not set -# CONFIG_MTD_MTDRAM is not set -# CONFIG_MTD_MYLOADER_PARTS is not set -# CONFIG_MTD_NAND is not set -# CONFIG_MTD_NAND_AMS_DELTA is not set -# CONFIG_MTD_NAND_AR934X is not set -# CONFIG_MTD_NAND_AR934X_HW_ECC is not set -# CONFIG_MTD_NAND_ARASAN is not set -# CONFIG_MTD_NAND_ATMEL is not set -# CONFIG_MTD_NAND_AU1550 is not set -# CONFIG_MTD_NAND_BCH is not set -# CONFIG_MTD_NAND_BF5XX is not set -# CONFIG_MTD_NAND_BRCMNAND is not set -# CONFIG_MTD_NAND_CADENCE is not set -# CONFIG_MTD_NAND_CAFE is not set -# CONFIG_MTD_NAND_CM_X270 is not set -# CONFIG_MTD_NAND_CS553X is not set -# CONFIG_MTD_NAND_DAVINCI is not set -# CONFIG_MTD_NAND_DENALI is not set -# CONFIG_MTD_NAND_DENALI_DT is not set -# CONFIG_MTD_NAND_DENALI_PCI is not set -CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR=0xff108018 -# CONFIG_MTD_NAND_DISKONCHIP is not set -# CONFIG_MTD_NAND_DOCG4 is not set -# CONFIG_MTD_NAND_ECC is not set -# CONFIG_MTD_NAND_ECC_BCH is not set -# CONFIG_MTD_NAND_ECC_SMC is not set -# CONFIG_MTD_NAND_ECC_SW_BCH is not set -# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set -# CONFIG_MTD_NAND_FSL_ELBC is not set -# CONFIG_MTD_NAND_FSL_IFC is not set -# CONFIG_MTD_NAND_FSL_UPM is not set -# CONFIG_MTD_NAND_FSMC is not set -# CONFIG_MTD_NAND_GPIO is not set -# CONFIG_MTD_NAND_GPMI_NAND is not set -# CONFIG_MTD_NAND_HISI504 is not set -CONFIG_MTD_NAND_IDS=y -# CONFIG_MTD_NAND_JZ4740 is not set -# CONFIG_MTD_NAND_MPC5121_NFC is not set -# CONFIG_MTD_NAND_MTK is not set -# CONFIG_MTD_NAND_MTK_BMT is not set -# CONFIG_MTD_NAND_MXC is not set -# CONFIG_MTD_NAND_MXIC is not set -# CONFIG_MTD_NAND_NANDSIM is not set -# CONFIG_MTD_NAND_NDFC is not set -# CONFIG_MTD_NAND_NUC900 is not set -# CONFIG_MTD_NAND_OMAP2 is not set -# CONFIG_MTD_NAND_OMAP_BCH_BUILD is not set -# CONFIG_MTD_NAND_ORION is not set -# CONFIG_MTD_NAND_PASEMI is not set -# CONFIG_MTD_NAND_PLATFORM is not set -# CONFIG_MTD_NAND_PXA3xx is not set -# CONFIG_MTD_NAND_RB4XX is not set -# CONFIG_MTD_NAND_RB750 is not set -# CONFIG_MTD_NAND_RB91X is not set -# CONFIG_MTD_NAND_RICOH is not set -# CONFIG_MTD_NAND_S3C2410 is not set -# CONFIG_MTD_NAND_SHARPSL is not set -# CONFIG_MTD_NAND_SH_FLCTL is not set -# CONFIG_MTD_NAND_SOCRATES is not set -# CONFIG_MTD_NAND_TMIO is not set -# CONFIG_MTD_NAND_TXX9NDFMC is not set -CONFIG_MTD_OF_PARTS=y -# CONFIG_MTD_ONENAND is not set -# CONFIG_MTD_OOPS is not set -# CONFIG_MTD_OTP is not set -# CONFIG_MTD_PARSER_TRX is not set -# CONFIG_MTD_PARTITIONED_MASTER is not set -# CONFIG_MTD_PCI is not set -# CONFIG_MTD_PCMCIA is not set -# CONFIG_MTD_PHRAM is not set -# CONFIG_MTD_PHYSMAP is not set -# CONFIG_MTD_PHYSMAP_COMPAT is not set -# CONFIG_MTD_PHYSMAP_GEMINI is not set -# CONFIG_MTD_PHYSMAP_GPIO_ADDR is not set -# CONFIG_MTD_PHYSMAP_IXP4XX is not set -CONFIG_MTD_PHYSMAP_OF=y -# CONFIG_MTD_PHYSMAP_OF_GEMINI is not set -# CONFIG_MTD_PHYSMAP_OF_VERSATILE is not set -# CONFIG_MTD_PHYSMAP_VERSATILE is not set -# CONFIG_MTD_PLATRAM is not set -# CONFIG_MTD_PMC551 is not set -# CONFIG_MTD_RAM is not set -# CONFIG_MTD_RAW_NAND is not set -CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 -# CONFIG_MTD_REDBOOT_PARTS is not set -# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set -# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set -# CONFIG_MTD_ROM is not set -CONFIG_MTD_ROOTFS_ROOT_DEV=y -# CONFIG_MTD_ROUTERBOOT_PARTS is not set -# CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_SM_COMMON is not set -# CONFIG_MTD_SPINAND_MT29F is not set -# CONFIG_MTD_SPI_NAND is not set -# CONFIG_MTD_SPI_NOR is not set -# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set -CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=4096 -# CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE is not set -CONFIG_MTD_SPLIT=y -# CONFIG_MTD_SPLIT_BCM63XX_FW is not set -# CONFIG_MTD_SPLIT_BCM_WFI_FW is not set -# CONFIG_MTD_SPLIT_BRNIMAGE_FW is not set -# CONFIG_MTD_SPLIT_ELF_FW is not set -# CONFIG_MTD_SPLIT_EVA_FW is not set -# CONFIG_MTD_SPLIT_FIRMWARE is not set -CONFIG_MTD_SPLIT_FIRMWARE_NAME="firmware" -# CONFIG_MTD_SPLIT_FIT_FW is not set -# CONFIG_MTD_SPLIT_JIMAGE_FW is not set -# CONFIG_MTD_SPLIT_LZMA_FW is not set -# CONFIG_MTD_SPLIT_MINOR_FW is not set -# CONFIG_MTD_SPLIT_SEAMA_FW is not set -CONFIG_MTD_SPLIT_SQUASHFS_ROOT=y -CONFIG_MTD_SPLIT_SUPPORT=y -# CONFIG_MTD_SPLIT_TPLINK_FW is not set -# CONFIG_MTD_SPLIT_TRX_FW is not set -# CONFIG_MTD_SPLIT_UIMAGE_FW is not set -# CONFIG_MTD_SPLIT_WRGG_FW is not set -# CONFIG_MTD_SST25L is not set -# CONFIG_MTD_SWAP is not set -# CONFIG_MTD_TESTS is not set -# CONFIG_MTD_UBI is not set -# CONFIG_MTD_UBI_FASTMAP is not set -# CONFIG_MTD_UBI_GLUEBI is not set -# CONFIG_MTD_UIMAGE_SPLIT is not set -# CONFIG_MTD_VIRT_CONCAT is not set -# CONFIG_MTK_MMC is not set -# CONFIG_MTK_MMSYS is not set -# CONFIG_MTK_THERMAL is not set -# CONFIG_MULTIPLEXER is not set -CONFIG_MULTIUSER=y -# CONFIG_MUTEX_SPIN_ON_OWNER is not set -# CONFIG_MUX_ADG792A is not set -# CONFIG_MUX_ADGS1408 is not set -# CONFIG_MUX_GPIO is not set -# CONFIG_MUX_MMIO is not set -# CONFIG_MV643XX_ETH is not set -# CONFIG_MVMDIO is not set -# CONFIG_MVNETA_BM is not set -# CONFIG_MVSW61XX_PHY is not set -# CONFIG_MV_XOR_V2 is not set -# CONFIG_MWAVE is not set -# CONFIG_MWL8K is not set -# CONFIG_MXC4005 is not set -# CONFIG_MXC6255 is not set -# CONFIG_MYRI10GE is not set -# CONFIG_NAMESPACES is not set -# CONFIG_NATIONAL_PHY is not set -# CONFIG_NATSEMI is not set -# CONFIG_NAU7802 is not set -# CONFIG_NBPFAXI_DMA is not set -# CONFIG_NCP_FS is not set -# CONFIG_NE2000 is not set -# CONFIG_NE2K_PCI is not set -# CONFIG_NEC_MARKEINS is not set -CONFIG_NET=y -# CONFIG_NETCONSOLE is not set -CONFIG_NETDEVICES=y -# CONFIG_NETDEVSIM is not set -# CONFIG_NETFILTER is not set -# CONFIG_NETFILTER_ADVANCED is not set -# CONFIG_NETFILTER_DEBUG is not set -# CONFIG_NETFILTER_INGRESS is not set -# CONFIG_NETFILTER_NETLINK is not set -# CONFIG_NETFILTER_NETLINK_ACCT is not set -# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set -# CONFIG_NETFILTER_NETLINK_LOG is not set -# CONFIG_NETFILTER_NETLINK_OSF is not set -# CONFIG_NETFILTER_NETLINK_QUEUE is not set -# CONFIG_NETFILTER_XTABLES is not set -# CONFIG_NETFILTER_XT_CONNMARK is not set -# CONFIG_NETFILTER_XT_MARK is not set -# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set -# CONFIG_NETFILTER_XT_MATCH_BPF is not set -# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set -# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set -# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set -# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set -# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set -# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set -# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set -# CONFIG_NETFILTER_XT_MATCH_CPU is not set -# CONFIG_NETFILTER_XT_MATCH_DCCP is not set -# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set -# CONFIG_NETFILTER_XT_MATCH_DSCP is not set -# CONFIG_NETFILTER_XT_MATCH_ECN is not set -# CONFIG_NETFILTER_XT_MATCH_ESP is not set -# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_HELPER is not set -# CONFIG_NETFILTER_XT_MATCH_HL is not set -# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set -# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set -# CONFIG_NETFILTER_XT_MATCH_L2TP is not set -# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set -# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_MAC is not set -# CONFIG_NETFILTER_XT_MATCH_MARK is not set -# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set -# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set -# CONFIG_NETFILTER_XT_MATCH_OSF is not set -# CONFIG_NETFILTER_XT_MATCH_OWNER is not set -# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set -# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set -# CONFIG_NETFILTER_XT_MATCH_POLICY is not set -# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set -# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set -# CONFIG_NETFILTER_XT_MATCH_REALM is not set -# CONFIG_NETFILTER_XT_MATCH_RECENT is not set -# CONFIG_NETFILTER_XT_MATCH_SCTP is not set -# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set -# CONFIG_NETFILTER_XT_MATCH_STATE is not set -# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set -# CONFIG_NETFILTER_XT_MATCH_STRING is not set -# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set -# CONFIG_NETFILTER_XT_MATCH_TIME is not set -# CONFIG_NETFILTER_XT_MATCH_U32 is not set -# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set -# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set -# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set -# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set -# CONFIG_NETFILTER_XT_TARGET_CT is not set -# CONFIG_NETFILTER_XT_TARGET_DSCP is not set -# CONFIG_NETFILTER_XT_TARGET_HL is not set -# CONFIG_NETFILTER_XT_TARGET_HMARK is not set -# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set -# CONFIG_NETFILTER_XT_TARGET_LED is not set -# CONFIG_NETFILTER_XT_TARGET_LOG is not set -# CONFIG_NETFILTER_XT_TARGET_MARK is not set -# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set -# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set -# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set -# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set -# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set -# CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set -# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set -# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set -# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set -# CONFIG_NETFILTER_XT_TARGET_TEE is not set -# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set -# CONFIG_NETFILTER_XT_TARGET_TRACE is not set -# CONFIG_NETLABEL is not set -# CONFIG_NETLINK_DIAG is not set -# CONFIG_NETLINK_MMAP is not set -# CONFIG_NETPOLL is not set -# CONFIG_NETROM is not set -CONFIG_NETWORK_FILESYSTEMS=y -# CONFIG_NETWORK_PHY_TIMESTAMPING is not set -# CONFIG_NETWORK_SECMARK is not set -# CONFIG_NETXEN_NIC is not set -# CONFIG_NET_9P is not set -# CONFIG_NET_ACT_BPF is not set -# CONFIG_NET_ACT_CSUM is not set -# CONFIG_NET_ACT_CT is not set -# CONFIG_NET_ACT_GACT is not set -# CONFIG_NET_ACT_GATE is not set -# CONFIG_NET_ACT_IFE is not set -# CONFIG_NET_ACT_IPT is not set -# CONFIG_NET_ACT_MIRRED is not set -# CONFIG_NET_ACT_MPLS is not set -# CONFIG_NET_ACT_NAT is not set -# CONFIG_NET_ACT_PEDIT is not set -# CONFIG_NET_ACT_POLICE is not set -# CONFIG_NET_ACT_SAMPLE is not set -# CONFIG_NET_ACT_SIMP is not set -# CONFIG_NET_ACT_SKBEDIT is not set -# CONFIG_NET_ACT_SKBMOD is not set -# CONFIG_NET_ACT_TUNNEL_KEY is not set -# CONFIG_NET_ACT_VLAN is not set -CONFIG_NET_CADENCE=y -# CONFIG_NET_CALXEDA_XGMAC is not set -CONFIG_NET_CLS=y -# CONFIG_NET_CLS_ACT is not set -# CONFIG_NET_CLS_BASIC is not set -# CONFIG_NET_CLS_BPF is not set -# CONFIG_NET_CLS_FLOW is not set -# CONFIG_NET_CLS_FLOWER is not set -# CONFIG_NET_CLS_FW is not set -CONFIG_NET_CLS_IND=y -# CONFIG_NET_CLS_MATCHALL is not set -# CONFIG_NET_CLS_ROUTE4 is not set -# CONFIG_NET_CLS_RSVP is not set -# CONFIG_NET_CLS_RSVP6 is not set -# CONFIG_NET_CLS_TCINDEX is not set -# CONFIG_NET_CLS_U32 is not set -CONFIG_NET_CORE=y -# CONFIG_NET_DEVLINK is not set -# CONFIG_NET_DROP_MONITOR is not set -# CONFIG_NET_DSA is not set -# CONFIG_NET_DSA_AR9331 is not set -# CONFIG_NET_DSA_BCM_SF2 is not set -# CONFIG_NET_DSA_LANTIQ_GSWIP is not set -# CONFIG_NET_DSA_LEGACY is not set -# CONFIG_NET_DSA_LOOP is not set -# CONFIG_NET_DSA_MICROCHIP_KSZ8795 is not set -# CONFIG_NET_DSA_MICROCHIP_KSZ9477 is not set -# CONFIG_NET_DSA_MSCC_FELIX is not set -# CONFIG_NET_DSA_MSCC_SEVILLE is not set -# CONFIG_NET_DSA_MT7530 is not set -# CONFIG_NET_DSA_MV88E6060 is not set -# CONFIG_NET_DSA_MV88E6123_61_65 is not set -# CONFIG_NET_DSA_MV88E6131 is not set -# CONFIG_NET_DSA_MV88E6171 is not set -# CONFIG_NET_DSA_MV88E6352 is not set -# CONFIG_NET_DSA_MV88E6XXX is not set -# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set -# CONFIG_NET_DSA_MV88E6XXX_PTP is not set -# CONFIG_NET_DSA_QCA8K is not set -# CONFIG_NET_DSA_REALTEK_SMI is not set -# CONFIG_NET_DSA_SJA1105 is not set -# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set -# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set -# CONFIG_NET_DSA_TAG_8021Q is not set -# CONFIG_NET_DSA_TAG_AR9331 is not set -# CONFIG_NET_DSA_TAG_BRCM is not set -# CONFIG_NET_DSA_TAG_BRCM_LEGACY is not set -# CONFIG_NET_DSA_TAG_BRCM_PREPEND is not set -# CONFIG_NET_DSA_TAG_DSA is not set -# CONFIG_NET_DSA_TAG_EDSA is not set -# CONFIG_NET_DSA_TAG_GSWIP is not set -# CONFIG_NET_DSA_TAG_KSZ is not set -# CONFIG_NET_DSA_TAG_LAN9303 is not set -# CONFIG_NET_DSA_TAG_MTK is not set -# CONFIG_NET_DSA_TAG_OCELOT is not set -# CONFIG_NET_DSA_TAG_QCA is not set -# CONFIG_NET_DSA_TAG_RTL4_A is not set -# CONFIG_NET_DSA_TAG_SJA1105 is not set -# CONFIG_NET_DSA_TAG_TRAILER is not set -# CONFIG_NET_DSA_VITESSE_VSC73XX is not set -# CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set -# CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set -# CONFIG_NET_EMATCH is not set -# CONFIG_NET_EMATCH_CANID is not set -# CONFIG_NET_EMATCH_CMP is not set -# CONFIG_NET_EMATCH_IPT is not set -# CONFIG_NET_EMATCH_META is not set -# CONFIG_NET_EMATCH_NBYTE is not set -CONFIG_NET_EMATCH_STACK=32 -# CONFIG_NET_EMATCH_TEXT is not set -# CONFIG_NET_EMATCH_U32 is not set -# CONFIG_NET_FAILOVER is not set -# CONFIG_NET_FC is not set -# CONFIG_NET_FOU is not set -# CONFIG_NET_FOU_IP_TUNNELS is not set -# CONFIG_NET_IFE is not set -# CONFIG_NET_IPGRE is not set -CONFIG_NET_IPGRE_BROADCAST=y -# CONFIG_NET_IPGRE_DEMUX is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPVTI is not set -# CONFIG_NET_IP_TUNNEL is not set -# CONFIG_NET_KEY is not set -# CONFIG_NET_KEY_MIGRATE is not set -# CONFIG_NET_L3_MASTER_DEV is not set -# CONFIG_NET_MEDIATEK_STAR_EMAC is not set -# CONFIG_NET_MPLS_GSO is not set -# CONFIG_NET_NCSI is not set -# CONFIG_NET_NSH is not set -# CONFIG_NET_PACKET_ENGINE is not set -# CONFIG_NET_PKTGEN is not set -# CONFIG_NET_POLL_CONTROLLER is not set -# CONFIG_NET_PTP_CLASSIFY is not set -CONFIG_NET_RX_BUSY_POLL=y -# CONFIG_NET_SB1000 is not set -CONFIG_NET_SCHED=y -# CONFIG_NET_SCH_ATM is not set -# CONFIG_NET_SCH_CAKE is not set -# CONFIG_NET_SCH_CBQ is not set -# CONFIG_NET_SCH_CBS is not set -# CONFIG_NET_SCH_CHOKE is not set -# CONFIG_NET_SCH_CODEL is not set -CONFIG_NET_SCH_DEFAULT=y -# CONFIG_NET_SCH_DRR is not set -# CONFIG_NET_SCH_DSMARK is not set -# CONFIG_NET_SCH_ETF is not set -# CONFIG_NET_SCH_ETS is not set -CONFIG_NET_SCH_FIFO=y -# CONFIG_NET_SCH_FQ is not set -CONFIG_NET_SCH_FQ_CODEL=y -# CONFIG_NET_SCH_FQ_PIE is not set -# CONFIG_NET_SCH_GRED is not set -# CONFIG_NET_SCH_HFSC is not set -# CONFIG_NET_SCH_HHF is not set -# CONFIG_NET_SCH_HTB is not set -# CONFIG_NET_SCH_INGRESS is not set -# CONFIG_NET_SCH_MQPRIO is not set -# CONFIG_NET_SCH_MULTIQ is not set -# CONFIG_NET_SCH_NETEM is not set -# CONFIG_NET_SCH_PIE is not set -# CONFIG_NET_SCH_PLUG is not set -# CONFIG_NET_SCH_PRIO is not set -# CONFIG_NET_SCH_QFQ is not set -# CONFIG_NET_SCH_RED is not set -# CONFIG_NET_SCH_SFB is not set -# CONFIG_NET_SCH_SFQ is not set -# CONFIG_NET_SCH_SKBPRIO is not set -# CONFIG_NET_SCH_TAPRIO is not set -# CONFIG_NET_SCH_TBF is not set -# CONFIG_NET_SCH_TEQL is not set -# CONFIG_NET_SCTPPROBE is not set -# CONFIG_NET_SWITCHDEV is not set -# CONFIG_NET_TCPPROBE is not set -# CONFIG_NET_TC_SKB_EXT is not set -# CONFIG_NET_TEAM is not set -# CONFIG_NET_TULIP is not set -# CONFIG_NET_UDP_TUNNEL is not set -CONFIG_NET_VENDOR_3COM=y -CONFIG_NET_VENDOR_8390=y -CONFIG_NET_VENDOR_ADAPTEC=y -CONFIG_NET_VENDOR_AGERE=y -CONFIG_NET_VENDOR_ALACRITECH=y -CONFIG_NET_VENDOR_ALTEON=y -CONFIG_NET_VENDOR_AMAZON=y -CONFIG_NET_VENDOR_AMD=y -CONFIG_NET_VENDOR_AQUANTIA=y -CONFIG_NET_VENDOR_ARC=y -CONFIG_NET_VENDOR_ATHEROS=y -CONFIG_NET_VENDOR_AURORA=y -CONFIG_NET_VENDOR_BROADCOM=y -CONFIG_NET_VENDOR_BROCADE=y -CONFIG_NET_VENDOR_CADENCE=y -CONFIG_NET_VENDOR_CAVIUM=y -CONFIG_NET_VENDOR_CHELSIO=y -CONFIG_NET_VENDOR_CIRRUS=y -CONFIG_NET_VENDOR_CISCO=y -CONFIG_NET_VENDOR_CORTINA=y -CONFIG_NET_VENDOR_DEC=y -CONFIG_NET_VENDOR_DLINK=y -CONFIG_NET_VENDOR_EMULEX=y -CONFIG_NET_VENDOR_EXAR=y -CONFIG_NET_VENDOR_EZCHIP=y -CONFIG_NET_VENDOR_FARADAY=y -CONFIG_NET_VENDOR_FREESCALE=y -CONFIG_NET_VENDOR_FUJITSU=y -CONFIG_NET_VENDOR_GOOGLE=y -CONFIG_NET_VENDOR_HISILICON=y -CONFIG_NET_VENDOR_HP=y -CONFIG_NET_VENDOR_HUAWEI=y -CONFIG_NET_VENDOR_I825XX=y -CONFIG_NET_VENDOR_IBM=y -CONFIG_NET_VENDOR_INTEL=y -CONFIG_NET_VENDOR_MARVELL=y -CONFIG_NET_VENDOR_MELLANOX=y -CONFIG_NET_VENDOR_MICREL=y -CONFIG_NET_VENDOR_MICROCHIP=y -CONFIG_NET_VENDOR_MICROSEMI=y -CONFIG_NET_VENDOR_MYRI=y -CONFIG_NET_VENDOR_NATSEMI=y -CONFIG_NET_VENDOR_NETERION=y -CONFIG_NET_VENDOR_NETRONOME=y -CONFIG_NET_VENDOR_NI=y -CONFIG_NET_VENDOR_NVIDIA=y -CONFIG_NET_VENDOR_OKI=y -CONFIG_NET_VENDOR_PACKET_ENGINES=y -CONFIG_NET_VENDOR_PENSANDO=y -CONFIG_NET_VENDOR_QLOGIC=y -CONFIG_NET_VENDOR_QUALCOMM=y -CONFIG_NET_VENDOR_RDC=y -CONFIG_NET_VENDOR_REALTEK=y -CONFIG_NET_VENDOR_RENESAS=y -CONFIG_NET_VENDOR_ROCKER=y -CONFIG_NET_VENDOR_SAMSUNG=y -CONFIG_NET_VENDOR_SEEQ=y -CONFIG_NET_VENDOR_SILAN=y -CONFIG_NET_VENDOR_SIS=y -CONFIG_NET_VENDOR_SMSC=y -CONFIG_NET_VENDOR_SOCIONEXT=y -CONFIG_NET_VENDOR_SOLARFLARE=y -CONFIG_NET_VENDOR_STMICRO=y -CONFIG_NET_VENDOR_SUN=y -CONFIG_NET_VENDOR_SYNOPSYS=y -CONFIG_NET_VENDOR_TEHUTI=y -CONFIG_NET_VENDOR_TI=y -CONFIG_NET_VENDOR_TOSHIBA=y -CONFIG_NET_VENDOR_VIA=y -CONFIG_NET_VENDOR_WIZNET=y -CONFIG_NET_VENDOR_XILINX=y -CONFIG_NET_VENDOR_XIRCOM=y -# CONFIG_NET_VRF is not set -# CONFIG_NET_XGENE is not set -CONFIG_NEW_LEDS=y -# CONFIG_NFC is not set -# CONFIG_NFP is not set -# CONFIG_NFSD is not set -# CONFIG_NFSD_V2_ACL is not set -CONFIG_NFSD_V3=y -# CONFIG_NFSD_V3_ACL is not set -# CONFIG_NFSD_V4 is not set -# CONFIG_NFS_ACL_SUPPORT is not set -CONFIG_NFS_COMMON=y -# CONFIG_NFS_DISABLE_UDP_SUPPORT is not set -# CONFIG_NFS_FS is not set -# CONFIG_NFS_FSCACHE is not set -# CONFIG_NFS_SWAP is not set -# CONFIG_NFS_V2 is not set -CONFIG_NFS_V3=y -# CONFIG_NFS_V3_ACL is not set -# CONFIG_NFS_V4 is not set -# CONFIG_NFS_V4_1 is not set -# CONFIG_NFTL is not set -# CONFIG_NFT_BRIDGE_META is not set -# CONFIG_NFT_BRIDGE_REJECT is not set -# CONFIG_NFT_CONNLIMIT is not set -# CONFIG_NFT_DUP_IPV4 is not set -# CONFIG_NFT_DUP_IPV6 is not set -# CONFIG_NFT_FIB_IPV4 is not set -# CONFIG_NFT_FIB_IPV6 is not set -# CONFIG_NFT_FIB_NETDEV is not set -# CONFIG_NFT_FLOW_OFFLOAD is not set -# CONFIG_NFT_OBJREF is not set -# CONFIG_NFT_OSF is not set -# CONFIG_NFT_RT is not set -# CONFIG_NFT_SET_BITMAP is not set -# CONFIG_NFT_SOCKET is not set -# CONFIG_NFT_SYNPROXY is not set -# CONFIG_NFT_TPROXY is not set -# CONFIG_NFT_TUNNEL is not set -# CONFIG_NFT_XFRM is not set -# CONFIG_NF_CONNTRACK is not set -# CONFIG_NF_CONNTRACK_AMANDA is not set -# CONFIG_NF_CONNTRACK_BRIDGE is not set -# CONFIG_NF_CONNTRACK_EVENTS is not set -# CONFIG_NF_CONNTRACK_FTP is not set -# CONFIG_NF_CONNTRACK_H323 is not set -# CONFIG_NF_CONNTRACK_IRC is not set -# CONFIG_NF_CONNTRACK_LABELS is not set -# CONFIG_NF_CONNTRACK_MARK is not set -# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set -# CONFIG_NF_CONNTRACK_PPTP is not set -CONFIG_NF_CONNTRACK_PROCFS=y -# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set -# CONFIG_NF_CONNTRACK_SANE is not set -# CONFIG_NF_CONNTRACK_SECMARK is not set -# CONFIG_NF_CONNTRACK_SIP is not set -# CONFIG_NF_CONNTRACK_SNMP is not set -# CONFIG_NF_CONNTRACK_TFTP is not set -# CONFIG_NF_CONNTRACK_TIMEOUT is not set -# CONFIG_NF_CONNTRACK_TIMESTAMP is not set -# CONFIG_NF_CONNTRACK_ZONES is not set -# CONFIG_NF_CT_NETLINK is not set -# CONFIG_NF_CT_NETLINK_HELPER is not set -# CONFIG_NF_CT_NETLINK_TIMEOUT is not set -# CONFIG_NF_CT_PROTO_DCCP is not set -# CONFIG_NF_CT_PROTO_GRE is not set -# CONFIG_NF_CT_PROTO_SCTP is not set -# CONFIG_NF_CT_PROTO_UDPLITE is not set -# CONFIG_NF_DEFRAG_IPV4 is not set -# CONFIG_NF_DUP_IPV4 is not set -# CONFIG_NF_DUP_IPV6 is not set -# CONFIG_NF_FLOW_TABLE is not set -# CONFIG_NF_LOG_ARP is not set -# CONFIG_NF_LOG_BRIDGE is not set -# CONFIG_NF_LOG_IPV4 is not set -# CONFIG_NF_LOG_NETDEV is not set -# CONFIG_NF_NAT is not set -# CONFIG_NF_NAT_AMANDA is not set -# CONFIG_NF_NAT_FTP is not set -# CONFIG_NF_NAT_H323 is not set -# CONFIG_NF_NAT_IRC is not set -# CONFIG_NF_NAT_NEEDED is not set -# CONFIG_NF_NAT_PPTP is not set -# CONFIG_NF_NAT_PROTO_GRE is not set -# CONFIG_NF_NAT_SIP is not set -# CONFIG_NF_NAT_SNMP_BASIC is not set -# CONFIG_NF_NAT_TFTP is not set -# CONFIG_NF_REJECT_IPV4 is not set -# CONFIG_NF_REJECT_IPV6 is not set -# CONFIG_NF_SOCKET_IPV4 is not set -# CONFIG_NF_SOCKET_IPV6 is not set -# CONFIG_NF_TABLES is not set -CONFIG_NF_TABLES_ARP=y -CONFIG_NF_TABLES_BRIDGE=y -CONFIG_NF_TABLES_INET=y -CONFIG_NF_TABLES_IPV4=y -CONFIG_NF_TABLES_IPV6=y -CONFIG_NF_TABLES_NETDEV=y -# CONFIG_NF_TABLES_SET is not set -# CONFIG_NF_TPROXY_IPV4 is not set -# CONFIG_NF_TPROXY_IPV6 is not set -# CONFIG_NI65 is not set -# CONFIG_NI903X_WDT is not set -# CONFIG_NIC7018_WDT is not set -# CONFIG_NILFS2_FS is not set -# CONFIG_NIU is not set -# CONFIG_NI_XGE_MANAGEMENT_ENET is not set -CONFIG_NLATTR=y -# CONFIG_NLMON is not set -# CONFIG_NLM_XLP_BOARD is not set -# CONFIG_NLM_XLR_BOARD is not set -# CONFIG_NLS is not set -# CONFIG_NLS_ASCII is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set -# CONFIG_NLS_CODEPAGE_437 is not set -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_950 is not set -CONFIG_NLS_DEFAULT="iso8859-1" -# CONFIG_NLS_ISO8859_1 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_MAC_CELTIC is not set -# CONFIG_NLS_MAC_CENTEURO is not set -# CONFIG_NLS_MAC_CROATIAN is not set -# CONFIG_NLS_MAC_CYRILLIC is not set -# CONFIG_NLS_MAC_GAELIC is not set -# CONFIG_NLS_MAC_GREEK is not set -# CONFIG_NLS_MAC_ICELAND is not set -# CONFIG_NLS_MAC_INUIT is not set -# CONFIG_NLS_MAC_ROMAN is not set -# CONFIG_NLS_MAC_ROMANIAN is not set -# CONFIG_NLS_MAC_TURKISH is not set -# CONFIG_NLS_UTF8 is not set -CONFIG_NMI_LOG_BUF_SHIFT=13 -# CONFIG_NOA1305 is not set -# CONFIG_NOP_USB_XCEIV is not set -# CONFIG_NORTEL_HERMES is not set -# CONFIG_NOTIFIER_ERROR_INJECTION is not set -# CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT is not set -# CONFIG_NOZOMI is not set -# CONFIG_NO_BOOTMEM is not set -# CONFIG_NO_HZ is not set -# CONFIG_NO_HZ_FULL is not set -# CONFIG_NO_HZ_IDLE is not set -# CONFIG_NS83820 is not set -# CONFIG_NTB is not set -# CONFIG_NTFS_DEBUG is not set -# CONFIG_NTFS_FS is not set -# CONFIG_NTFS_RW is not set -# CONFIG_NTP_PPS is not set -# CONFIG_NULL_TTY is not set -# CONFIG_NUMA is not set -# CONFIG_NVM is not set -# CONFIG_NVMEM is not set -# CONFIG_NVMEM_BCM_OCOTP is not set -# CONFIG_NVMEM_IMX_OCOTP is not set -# CONFIG_NVMEM_REBOOT_MODE is not set -# CONFIG_NVMEM_SYSFS is not set -# CONFIG_NVMEM_U_BOOT_ENV is not set -# CONFIG_NVME_FC is not set -# CONFIG_NVME_TARGET is not set -# CONFIG_NVME_TCP is not set -# CONFIG_NVRAM is not set -# CONFIG_NV_TCO is not set -# CONFIG_NXP_STB220 is not set -# CONFIG_NXP_STB225 is not set -# CONFIG_NXP_TJA11XX_PHY is not set -# CONFIG_N_GSM is not set -# CONFIG_OABI_COMPAT is not set -# CONFIG_OBS600 is not set -# CONFIG_OCFS2_FS is not set -# CONFIG_OCTEONTX2_AF is not set -# CONFIG_OCTEONTX2_PF is not set -# CONFIG_OF_OVERLAY is not set -CONFIG_OF_RESERVED_MEM=y -# CONFIG_OF_UNITTEST is not set -# CONFIG_OID_REGISTRY is not set -# CONFIG_OMAP2_DSS_DEBUG is not set -# CONFIG_OMAP2_DSS_DEBUGFS is not set -# CONFIG_OMAP2_DSS_SDI is not set -# CONFIG_OMAP_OCP2SCP is not set -# CONFIG_OMAP_USB2 is not set -# CONFIG_OMFS_FS is not set -# CONFIG_OPENVSWITCH is not set -# CONFIG_OPROFILE is not set -# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set -# CONFIG_OPT3001 is not set -CONFIG_OPTIMIZE_INLINING=y -# CONFIG_ORANGEFS_FS is not set -# CONFIG_ORION_WATCHDOG is not set -# CONFIG_OSF_PARTITION is not set -CONFIG_OVERLAY_FS=y -# CONFIG_OVERLAY_FS_INDEX is not set -# CONFIG_OVERLAY_FS_METACOPY is not set -CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y -# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set -CONFIG_OVERLAY_FS_XINO_AUTO=y -# CONFIG_OWL_LOADER is not set -# CONFIG_P54_COMMON is not set -# CONFIG_PA12203001 is not set -CONFIG_PACKET=y -# CONFIG_PACKET_DIAG is not set -# CONFIG_PACKING is not set -# CONFIG_PAGE_EXTENSION is not set -# CONFIG_PAGE_OWNER is not set -# CONFIG_PAGE_POISONING is not set -# CONFIG_PAGE_REPORTING is not set -# CONFIG_PAGE_SIZE_16KB is not set -# CONFIG_PAGE_SIZE_32KB is not set -CONFIG_PAGE_SIZE_4KB=y -# CONFIG_PAGE_SIZE_64KB is not set -# CONFIG_PAGE_SIZE_8KB is not set -# CONFIG_PALMAS_GPADC is not set -# CONFIG_PANASONIC_LAPTOP is not set -# CONFIG_PANEL is not set -CONFIG_PANIC_ON_OOPS=y -CONFIG_PANIC_ON_OOPS_VALUE=1 -CONFIG_PANIC_TIMEOUT=1 -# CONFIG_PANTHERLORD_FF is not set -# CONFIG_PARAVIRT is not set -# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set -# CONFIG_PARPORT is not set -# CONFIG_PARPORT_1284 is not set -# CONFIG_PARPORT_AX88796 is not set -# CONFIG_PARPORT_GSC is not set -# CONFIG_PARPORT_PC is not set -CONFIG_PARTITION_ADVANCED=y -# CONFIG_PATA_ALI is not set -# CONFIG_PATA_AMD is not set -# CONFIG_PATA_ARASAN_CF is not set -# CONFIG_PATA_ARTOP is not set -# CONFIG_PATA_ATIIXP is not set -# CONFIG_PATA_ATP867X is not set -# CONFIG_PATA_CMD640_PCI is not set -# CONFIG_PATA_CMD64X is not set -# CONFIG_PATA_CS5520 is not set -# CONFIG_PATA_CS5530 is not set -# CONFIG_PATA_CS5535 is not set -# CONFIG_PATA_CS5536 is not set -# CONFIG_PATA_CYPRESS is not set -# CONFIG_PATA_EFAR is not set -# CONFIG_PATA_HPT366 is not set -# CONFIG_PATA_HPT37X is not set -# CONFIG_PATA_HPT3X2N is not set -# CONFIG_PATA_HPT3X3 is not set -# CONFIG_PATA_IMX is not set -# CONFIG_PATA_ISAPNP is not set -# CONFIG_PATA_IT8213 is not set -# CONFIG_PATA_IT821X is not set -# CONFIG_PATA_JMICRON is not set -# CONFIG_PATA_LEGACY is not set -# CONFIG_PATA_MARVELL is not set -# CONFIG_PATA_MPIIX is not set -# CONFIG_PATA_NETCELL is not set -# CONFIG_PATA_NINJA32 is not set -# CONFIG_PATA_NS87410 is not set -# CONFIG_PATA_NS87415 is not set -# CONFIG_PATA_OCTEON_CF is not set -# CONFIG_PATA_OF_PLATFORM is not set -# CONFIG_PATA_OLDPIIX is not set -# CONFIG_PATA_OPTI is not set -# CONFIG_PATA_OPTIDMA is not set -# CONFIG_PATA_PCMCIA is not set -# CONFIG_PATA_PDC2027X is not set -# CONFIG_PATA_PDC_OLD is not set -# CONFIG_PATA_PLATFORM is not set -# CONFIG_PATA_QDI is not set -# CONFIG_PATA_RADISYS is not set -# CONFIG_PATA_RDC is not set -# CONFIG_PATA_RZ1000 is not set -# CONFIG_PATA_SC1200 is not set -# CONFIG_PATA_SCH is not set -# CONFIG_PATA_SERVERWORKS is not set -# CONFIG_PATA_SIL680 is not set -# CONFIG_PATA_SIS is not set -# CONFIG_PATA_TOSHIBA is not set -# CONFIG_PATA_TRIFLEX is not set -# CONFIG_PATA_VIA is not set -# CONFIG_PATA_WINBOND is not set -# CONFIG_PATA_WINBOND_VLB is not set -# CONFIG_PC104 is not set -# CONFIG_PC300TOO is not set -# CONFIG_PCCARD is not set -# CONFIG_PCH_DMA is not set -# CONFIG_PCH_GBE is not set -# CONFIG_PCH_PHUB is not set -# CONFIG_PCI is not set -# CONFIG_PCI200SYN is not set -# CONFIG_PCIEAER is not set -# CONFIG_PCIEAER_INJECT is not set -# CONFIG_PCIEASPM is not set -# CONFIG_PCIEPORTBUS is not set -# CONFIG_PCIE_AL is not set -# CONFIG_PCIE_ALTERA is not set -# CONFIG_PCIE_ARMADA_8K is not set -CONFIG_PCIE_BUS_DEFAULT=y -# CONFIG_PCIE_BUS_PEER2PEER is not set -# CONFIG_PCIE_BUS_PERFORMANCE is not set -# CONFIG_PCIE_BUS_SAFE is not set -# CONFIG_PCIE_BUS_TUNE_OFF is not set -# CONFIG_PCIE_BW is not set -# CONFIG_PCIE_CADENCE_HOST is not set -# CONFIG_PCIE_CADENCE_PLAT_HOST is not set -# CONFIG_PCIE_DPC is not set -# CONFIG_PCIE_DW_PLAT is not set -# CONFIG_PCIE_DW_PLAT_HOST is not set -# CONFIG_PCIE_ECRC is not set -# CONFIG_PCIE_IPROC is not set -# CONFIG_PCIE_KIRIN is not set -# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set -# CONFIG_PCIE_PTM is not set -# CONFIG_PCIE_XILINX is not set -# CONFIG_PCIPCWATCHDOG is not set -# CONFIG_PCI_ATMEL is not set -# CONFIG_PCI_CNB20LE_QUIRK is not set -# CONFIG_PCI_DEBUG is not set -# CONFIG_PCI_DISABLE_COMMON_QUIRKS is not set -# CONFIG_PCI_ENDPOINT is not set -# CONFIG_PCI_ENDPOINT_TEST is not set -# CONFIG_PCI_FTPCI100 is not set -# CONFIG_PCI_HERMES is not set -# CONFIG_PCI_HISI is not set -# CONFIG_PCI_HOST_GENERIC is not set -# CONFIG_PCI_HOST_THUNDER_ECAM is not set -# CONFIG_PCI_HOST_THUNDER_PEM is not set -# CONFIG_PCI_IOV is not set -# CONFIG_PCI_J721E_HOST is not set -# CONFIG_PCI_LAYERSCAPE is not set -# CONFIG_PCI_MESON is not set -# CONFIG_PCI_MSI is not set -# CONFIG_PCI_PASID is not set -# CONFIG_PCI_PF_STUB is not set -# CONFIG_PCI_PRI is not set -CONFIG_PCI_QUIRKS=y -# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set -# CONFIG_PCI_STUB is not set -# CONFIG_PCI_SW_SWITCHTEC is not set -CONFIG_PCI_SYSCALL=y -# CONFIG_PCI_V3_SEMI is not set -# CONFIG_PCI_XGENE is not set -# CONFIG_PCMCIA is not set -# CONFIG_PCMCIA_3C574 is not set -# CONFIG_PCMCIA_3C589 is not set -# CONFIG_PCMCIA_AHA152X is not set -# CONFIG_PCMCIA_ATMEL is not set -# CONFIG_PCMCIA_AXNET is not set -# CONFIG_PCMCIA_DEBUG is not set -# CONFIG_PCMCIA_FDOMAIN is not set -# CONFIG_PCMCIA_FMVJ18X is not set -# CONFIG_PCMCIA_HERMES is not set -# CONFIG_PCMCIA_LOAD_CIS is not set -# CONFIG_PCMCIA_NINJA_SCSI is not set -# CONFIG_PCMCIA_NMCLAN is not set -# CONFIG_PCMCIA_PCNET is not set -# CONFIG_PCMCIA_QLOGIC is not set -# CONFIG_PCMCIA_RAYCS is not set -# CONFIG_PCMCIA_SMC91C92 is not set -# CONFIG_PCMCIA_SPECTRUM is not set -# CONFIG_PCMCIA_SYM53C500 is not set -# CONFIG_PCMCIA_WL3501 is not set -# CONFIG_PCMCIA_XIRC2PS is not set -# CONFIG_PCMCIA_XIRCOM is not set -# CONFIG_PCNET32 is not set -# CONFIG_PCSPKR_PLATFORM is not set -# CONFIG_PCS_XPCS is not set -# CONFIG_PD6729 is not set -# CONFIG_PDA_POWER is not set -# CONFIG_PDC_ADMA is not set -# CONFIG_PERCPU_STATS is not set -# CONFIG_PERCPU_TEST is not set -# CONFIG_PERF_EVENTS is not set -# CONFIG_PERF_EVENTS_AMD_POWER is not set -# CONFIG_PERSISTENT_KEYRINGS is not set -# CONFIG_PHANTOM is not set -# CONFIG_PHONET is not set -# CONFIG_PHYLIB is not set -# CONFIG_PHYS_ADDR_T_64BIT is not set -# CONFIG_PHY_CADENCE_DP is not set -# CONFIG_PHY_CADENCE_DPHY is not set -# CONFIG_PHY_CADENCE_SALVO is not set -# CONFIG_PHY_CADENCE_SIERRA is not set -# CONFIG_PHY_CADENCE_TORRENT is not set -# CONFIG_PHY_CPCAP_USB is not set -# CONFIG_PHY_EXYNOS_DP_VIDEO is not set -# CONFIG_PHY_EXYNOS_MIPI_VIDEO is not set -# CONFIG_PHY_FSL_IMX8MQ_USB is not set -# CONFIG_PHY_INTEL_KEEMBAY_EMMC is not set -# CONFIG_PHY_MAPPHONE_MDM6600 is not set -# CONFIG_PHY_MIXEL_MIPI_DPHY is not set -# CONFIG_PHY_MTK_HDMI is not set -# CONFIG_PHY_OCELOT_SERDES is not set -# CONFIG_PHY_PXA_28NM_HSIC is not set -# CONFIG_PHY_PXA_28NM_USB2 is not set -# CONFIG_PHY_QCOM_DWC3 is not set -# CONFIG_PHY_QCOM_USB_HS is not set -# CONFIG_PHY_QCOM_USB_HSIC is not set -# CONFIG_PHY_SAMSUNG_USB2 is not set -# CONFIG_PHY_TUSB1210 is not set -# CONFIG_PHY_XGENE is not set -# CONFIG_PI433 is not set -# CONFIG_PID_IN_CONTEXTIDR is not set -# CONFIG_PID_NS is not set -CONFIG_PINCONF=y -# CONFIG_PINCTRL is not set -# CONFIG_PINCTRL_AMD is not set -# CONFIG_PINCTRL_AXP209 is not set -# CONFIG_PINCTRL_CEDARFORK is not set -# CONFIG_PINCTRL_EXYNOS is not set -# CONFIG_PINCTRL_EXYNOS5440 is not set -# CONFIG_PINCTRL_ICELAKE is not set -# CONFIG_PINCTRL_INGENIC is not set -# CONFIG_PINCTRL_MCP23S08 is not set -# CONFIG_PINCTRL_MSM8X74 is not set -# CONFIG_PINCTRL_MT6779 is not set -# CONFIG_PINCTRL_MT8167 is not set -# CONFIG_PINCTRL_MT8192 is not set -# CONFIG_PINCTRL_MTK_V2 is not set -# CONFIG_PINCTRL_OCELOT is not set -CONFIG_PINCTRL_SINGLE=y -# CONFIG_PINCTRL_STMFX is not set -# CONFIG_PINCTRL_SX150X is not set -# CONFIG_PING is not set -CONFIG_PINMUX=y -# CONFIG_PKCS7_MESSAGE_PARSER is not set -# CONFIG_PL310_ERRATA_588369 is not set -# CONFIG_PL310_ERRATA_727915 is not set -# CONFIG_PL310_ERRATA_753970 is not set -# CONFIG_PL310_ERRATA_769419 is not set -# CONFIG_PL320_MBOX is not set -# CONFIG_PL330_DMA is not set -# CONFIG_PLATFORM_MHU is not set -# CONFIG_PLAT_SPEAR is not set -# CONFIG_PLIP is not set -# CONFIG_PLX_DMA is not set -# CONFIG_PLX_HERMES is not set -# CONFIG_PM is not set -# CONFIG_PMBUS is not set -# CONFIG_PMC_MSP is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_PMS7003 is not set -# CONFIG_PM_AUTOSLEEP is not set -# CONFIG_PM_DEBUG is not set -# CONFIG_PM_DEVFREQ is not set -# CONFIG_PM_WAKELOCKS is not set -# CONFIG_POSIX_MQUEUE is not set -CONFIG_POSIX_TIMERS=y -# CONFIG_POWERCAP is not set -# CONFIG_POWER_AVS is not set -# CONFIG_POWER_RESET is not set -# CONFIG_POWER_RESET_BRCMKONA is not set -# CONFIG_POWER_RESET_BRCMSTB is not set -# CONFIG_POWER_RESET_GPIO is not set -# CONFIG_POWER_RESET_GPIO_RESTART is not set -# CONFIG_POWER_RESET_LINKSTATION is not set -# CONFIG_POWER_RESET_LTC2952 is not set -# CONFIG_POWER_RESET_PIIX4_POWEROFF is not set -# CONFIG_POWER_RESET_QNAP is not set -# CONFIG_POWER_RESET_RESTART is not set -# CONFIG_POWER_RESET_SYSCON is not set -# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set -# CONFIG_POWER_RESET_VERSATILE is not set -# CONFIG_POWER_RESET_XGENE is not set -# CONFIG_POWER_SUPPLY is not set -# CONFIG_POWER_SUPPLY_DEBUG is not set -# CONFIG_POWER_SUPPLY_HWMON is not set -# CONFIG_PPC4xx_GPIO is not set -# CONFIG_PPC_16K_PAGES is not set -# CONFIG_PPC_256K_PAGES is not set -CONFIG_PPC_4K_PAGES=y -# CONFIG_PPC_64K_PAGES is not set -# CONFIG_PPC_DISABLE_WERROR is not set -# CONFIG_PPC_EMULATED_STATS is not set -# CONFIG_PPC_EPAPR_HV_BYTECHAN is not set -# CONFIG_PPC_QUEUED_SPINLOCKS is not set -# CONFIG_PPP is not set -# CONFIG_PPPOATM is not set -# CONFIG_PPPOE is not set -# CONFIG_PPPOL2TP is not set -# CONFIG_PPP_ASYNC is not set -# CONFIG_PPP_BSDCOMP is not set -# CONFIG_PPP_DEFLATE is not set -CONFIG_PPP_FILTER=y -# CONFIG_PPP_MPPE is not set -CONFIG_PPP_MULTILINK=y -# CONFIG_PPP_SYNC_TTY is not set -# CONFIG_PPS is not set -# CONFIG_PPS_CLIENT_GPIO is not set -# CONFIG_PPS_CLIENT_KTIMER is not set -# CONFIG_PPS_CLIENT_LDISC is not set -# CONFIG_PPS_CLIENT_PARPORT is not set -# CONFIG_PPS_DEBUG is not set -# CONFIG_PPTP is not set -# CONFIG_PREEMPT is not set -# CONFIG_PREEMPTIRQ_DELAY_TEST is not set -# CONFIG_PREEMPTIRQ_EVENTS is not set -CONFIG_PREEMPT_NONE=y -# CONFIG_PREEMPT_TRACER is not set -# CONFIG_PREEMPT_VOLUNTARY is not set -# CONFIG_PRESTERA is not set -CONFIG_PREVENT_FIRMWARE_BUILD=y -# CONFIG_PRIME_NUMBERS is not set -CONFIG_PRINTK=y -# CONFIG_PRINTK_CALLER is not set -CONFIG_PRINTK_NMI=y -CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 -# CONFIG_PRINTK_TIME is not set -CONFIG_PRINT_STACK_DEPTH=64 -# CONFIG_PRISM2_USB is not set -# CONFIG_PRISM54 is not set -# CONFIG_PROC_CHILDREN is not set -CONFIG_PROC_FS=y -# CONFIG_PROC_KCORE is not set -# CONFIG_PROC_PAGE_MONITOR is not set -# CONFIG_PROC_STRIPPED is not set -CONFIG_PROC_SYSCTL=y -# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set -# CONFIG_PROFILE_ALL_BRANCHES is not set -# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set -# CONFIG_PROFILING is not set -# CONFIG_PROVE_LOCKING is not set -# CONFIG_PROVE_RAW_LOCK_NESTING is not set -# CONFIG_PROVE_RCU is not set -# CONFIG_PROVE_RCU_LIST is not set -# CONFIG_PROVE_RCU_REPEATEDLY is not set -# CONFIG_PSAMPLE is not set -# CONFIG_PSB6970_PHY is not set -# CONFIG_PSI is not set -# CONFIG_PSTORE is not set -# CONFIG_PSTORE_842_COMPRESS is not set -# CONFIG_PSTORE_COMPRESS is not set -# CONFIG_PSTORE_COMPRESS_DEFAULT is not set -# CONFIG_PSTORE_CONSOLE is not set -# CONFIG_PSTORE_DEFLATE_COMPRESS is not set -# CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT is not set -# CONFIG_PSTORE_LZ4HC_COMPRESS is not set -# CONFIG_PSTORE_LZ4_COMPRESS is not set -# CONFIG_PSTORE_LZO_COMPRESS is not set -# CONFIG_PSTORE_PMSG is not set -# CONFIG_PSTORE_RAM is not set -# CONFIG_PSTORE_ZSTD_COMPRESS is not set -# CONFIG_PTDUMP_DEBUGFS is not set -# CONFIG_PTP_1588_CLOCK is not set -# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set -# CONFIG_PTP_1588_CLOCK_IDTCM is not set -# CONFIG_PTP_1588_CLOCK_IXP46X is not set -# CONFIG_PTP_1588_CLOCK_KVM is not set -# CONFIG_PTP_1588_CLOCK_PCH is not set -# CONFIG_PTP_1588_CLOCK_VMW is not set -# CONFIG_PUBLIC_KEY_ALGO_RSA is not set -# CONFIG_PVPANIC is not set -# CONFIG_PWM is not set -# CONFIG_PWM_DEBUG is not set -# CONFIG_PWM_FSL_FTM is not set -# CONFIG_PWM_JZ4740 is not set -# CONFIG_PWM_PCA9685 is not set -CONFIG_PWRSEQ_EMMC=y -# CONFIG_PWRSEQ_SD8787 is not set -CONFIG_PWRSEQ_SIMPLE=y -# CONFIG_QCA7000 is not set -# CONFIG_QCA7000_SPI is not set -# CONFIG_QCA7000_UART is not set -# CONFIG_QCOM_EMAC is not set -# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set -# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set -# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set -# CONFIG_QCOM_HIDMA is not set -# CONFIG_QCOM_HIDMA_MGMT is not set -# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set -# CONFIG_QCOM_SPMI_ADC5 is not set -# CONFIG_QCOM_SPMI_IADC is not set -# CONFIG_QCOM_SPMI_TEMP_ALARM is not set -# CONFIG_QCOM_SPMI_VADC is not set -# CONFIG_QED is not set -# CONFIG_QLA3XXX is not set -# CONFIG_QLCNIC is not set -# CONFIG_QLGE is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX6FS_FS is not set -# CONFIG_QORIQ_CPUFREQ is not set -# CONFIG_QORIQ_THERMAL is not set -# CONFIG_QRTR is not set -# CONFIG_QSEMI_PHY is not set -# CONFIG_QUEUED_LOCK_STAT is not set -# CONFIG_QUICC_ENGINE is not set -# CONFIG_QUOTA is not set -# CONFIG_QUOTACTL is not set -# CONFIG_QUOTA_DEBUG is not set -# CONFIG_R3964 is not set -# CONFIG_R6040 is not set -# CONFIG_R8169 is not set -# CONFIG_R8188EU is not set -# CONFIG_R8712U is not set -# CONFIG_R8723AU is not set -# CONFIG_RADIO_ADAPTERS is not set -# CONFIG_RADIO_AZTECH is not set -# CONFIG_RADIO_CADET is not set -# CONFIG_RADIO_GEMTEK is not set -# CONFIG_RADIO_MAXIRADIO is not set -# CONFIG_RADIO_RTRACK is not set -# CONFIG_RADIO_RTRACK2 is not set -# CONFIG_RADIO_SF16FMI is not set -# CONFIG_RADIO_SF16FMR2 is not set -# CONFIG_RADIO_TERRATEC is not set -# CONFIG_RADIO_TRUST is not set -# CONFIG_RADIO_TYPHOON is not set -# CONFIG_RADIO_ZOLTRIX is not set -# CONFIG_RAID6_PQ_BENCHMARK is not set -# CONFIG_RAID_ATTRS is not set -# CONFIG_RALINK is not set -# CONFIG_RANDOM32_SELFTEST is not set -# CONFIG_RANDOMIZE_BASE is not set -# CONFIG_RANDOM_TRUST_BOOTLOADER is not set -# CONFIG_RANDOM_TRUST_CPU is not set -# CONFIG_RAPIDIO is not set -# CONFIG_RAS is not set -# CONFIG_RAW_DRIVER is not set -# CONFIG_RBTREE_TEST is not set -# CONFIG_RCU_BOOST is not set -CONFIG_RCU_CPU_STALL_TIMEOUT=21 -# CONFIG_RCU_EQS_DEBUG is not set -# CONFIG_RCU_EXPEDITE_BOOT is not set -# CONFIG_RCU_EXPERT is not set -CONFIG_RCU_KTHREAD_PRIO=0 -CONFIG_RCU_NEED_SEGCBLIST=y -# CONFIG_RCU_PERF_TEST is not set -# CONFIG_RCU_REF_SCALE_TEST is not set -# CONFIG_RCU_SCALE_TEST is not set -CONFIG_RCU_STALL_COMMON=y -# CONFIG_RCU_STRICT_GRACE_PERIOD is not set -# CONFIG_RCU_TORTURE_TEST is not set -CONFIG_RCU_TORTURE_TEST_SLOW_INIT_DELAY=3 -# CONFIG_RCU_TRACE is not set -# CONFIG_RC_ATI_REMOTE is not set -# CONFIG_RC_CORE is not set -# CONFIG_RC_DECODERS is not set -# CONFIG_RC_LOOPBACK is not set -# CONFIG_RC_MAP is not set -# CONFIG_RDS is not set -# CONFIG_RD_BZIP2 is not set -# CONFIG_RD_GZIP is not set -# CONFIG_RD_LZ4 is not set -# CONFIG_RD_LZMA is not set -# CONFIG_RD_LZO is not set -# CONFIG_RD_XZ is not set -# CONFIG_RD_ZSTD is not set -# CONFIG_READABLE_ASM is not set -# CONFIG_READ_ONLY_THP_FOR_FS is not set -# CONFIG_REALTEK_PHY is not set -# CONFIG_REDWOOD is not set -# CONFIG_REED_SOLOMON is not set -# CONFIG_REED_SOLOMON_DEC8 is not set -# CONFIG_REED_SOLOMON_ENC8 is not set -# CONFIG_REED_SOLOMON_TEST is not set -# CONFIG_REGMAP is not set -# CONFIG_REGMAP_I2C is not set -# CONFIG_REGMAP_MMIO is not set -# CONFIG_REGMAP_SPI is not set -# CONFIG_REGULATOR is not set -# CONFIG_REGULATOR_88PG86X is not set -# CONFIG_REGULATOR_ACT8865 is not set -# CONFIG_REGULATOR_AD5398 is not set -# CONFIG_REGULATOR_ANATOP is not set -# CONFIG_REGULATOR_DA9210 is not set -# CONFIG_REGULATOR_DA9211 is not set -# CONFIG_REGULATOR_DEBUG is not set -# CONFIG_REGULATOR_FAN53555 is not set -# CONFIG_REGULATOR_FAN53880 is not set -# CONFIG_REGULATOR_FIXED_VOLTAGE is not set -# CONFIG_REGULATOR_GPIO is not set -# CONFIG_REGULATOR_ISL6271A is not set -# CONFIG_REGULATOR_ISL9305 is not set -# CONFIG_REGULATOR_LP3971 is not set -# CONFIG_REGULATOR_LP3972 is not set -# CONFIG_REGULATOR_LP872X is not set -# CONFIG_REGULATOR_LP8755 is not set -# CONFIG_REGULATOR_LTC3589 is not set -# CONFIG_REGULATOR_LTC3676 is not set -# CONFIG_REGULATOR_MAX1586 is not set -# CONFIG_REGULATOR_MAX77620 is not set -# CONFIG_REGULATOR_MAX77826 is not set -# CONFIG_REGULATOR_MAX8649 is not set -# CONFIG_REGULATOR_MAX8660 is not set -# CONFIG_REGULATOR_MAX8952 is not set -# CONFIG_REGULATOR_MAX8973 is not set -# CONFIG_REGULATOR_MCP16502 is not set -# CONFIG_REGULATOR_MP5416 is not set -# CONFIG_REGULATOR_MP8859 is not set -# CONFIG_REGULATOR_MP886X is not set -# CONFIG_REGULATOR_MPQ7920 is not set -# CONFIG_REGULATOR_MT6311 is not set -# CONFIG_REGULATOR_PCA9450 is not set -# CONFIG_REGULATOR_PFUZE100 is not set -# CONFIG_REGULATOR_PV88060 is not set -# CONFIG_REGULATOR_PV88080 is not set -# CONFIG_REGULATOR_PV88090 is not set -# CONFIG_REGULATOR_PWM is not set -# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set -# CONFIG_REGULATOR_RT4801 is not set -# CONFIG_REGULATOR_RTMV20 is not set -# CONFIG_REGULATOR_SLG51000 is not set -# CONFIG_REGULATOR_SY8106A is not set -# CONFIG_REGULATOR_SY8824X is not set -# CONFIG_REGULATOR_SY8827N is not set -# CONFIG_REGULATOR_TI_ABB is not set -# CONFIG_REGULATOR_TPS51632 is not set -# CONFIG_REGULATOR_TPS62360 is not set -# CONFIG_REGULATOR_TPS65023 is not set -# CONFIG_REGULATOR_TPS6507X is not set -# CONFIG_REGULATOR_TPS65132 is not set -# CONFIG_REGULATOR_TPS6524X is not set -# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set -# CONFIG_REGULATOR_VCTRL is not set -# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set -# CONFIG_REISERFS_CHECK is not set -# CONFIG_REISERFS_FS is not set -# CONFIG_REISERFS_FS_POSIX_ACL is not set -# CONFIG_REISERFS_FS_SECURITY is not set -CONFIG_REISERFS_FS_XATTR=y -# CONFIG_REISERFS_PROC_INFO is not set -# CONFIG_RELAY is not set -# CONFIG_RELOCATABLE is not set -# CONFIG_REMOTEPROC is not set -# CONFIG_RENESAS_PHY is not set -# CONFIG_RESET_ATH79 is not set -# CONFIG_RESET_BERLIN is not set -# CONFIG_RESET_BRCMSTB_RESCAL is not set -# CONFIG_RESET_CONTROLLER is not set -# CONFIG_RESET_IMX7 is not set -# CONFIG_RESET_INTEL_GW is not set -# CONFIG_RESET_LANTIQ is not set -# CONFIG_RESET_LPC18XX is not set -# CONFIG_RESET_MESON is not set -# CONFIG_RESET_PISTACHIO is not set -# CONFIG_RESET_SOCFPGA is not set -# CONFIG_RESET_STM32 is not set -# CONFIG_RESET_SUNXI is not set -# CONFIG_RESET_TEGRA_BPMP is not set -# CONFIG_RESET_TI_SYSCON is not set -# CONFIG_RESET_ZYNQ is not set -# CONFIG_RFD77402 is not set -# CONFIG_RFD_FTL is not set -CONFIG_RFKILL=y -# CONFIG_RFKILL_FULL is not set -# CONFIG_RFKILL_GPIO is not set -# CONFIG_RFKILL_INPUT is not set -# CONFIG_RFKILL_LEDS is not set -# CONFIG_RFKILL_REGULATOR is not set -# CONFIG_RING_BUFFER_BENCHMARK is not set -# CONFIG_RING_BUFFER_STARTUP_TEST is not set -# CONFIG_RMI4_CORE is not set -# CONFIG_RMNET is not set -# CONFIG_ROCKCHIP_PHY is not set -# CONFIG_ROCKER is not set -# CONFIG_ROMFS_FS is not set -# CONFIG_ROSE is not set -# CONFIG_RPCSEC_GSS_KRB5 is not set -# CONFIG_RPMSG_QCOM_GLINK_RPM is not set -# CONFIG_RPMSG_VIRTIO is not set -# CONFIG_RPR0521 is not set -# CONFIG_RSEQ is not set -# CONFIG_RT2X00 is not set -# CONFIG_RTC_CLASS is not set -# CONFIG_RTC_DEBUG is not set -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABEOZ9 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_ARMADA38X is not set -# CONFIG_RTC_DRV_AU1XXX is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_BQ4802 is not set -# CONFIG_RTC_DRV_CADENCE is not set -CONFIG_RTC_DRV_CMOS=y -# CONFIG_RTC_DRV_DS1286 is not set -# CONFIG_RTC_DRV_DS1302 is not set -# CONFIG_RTC_DRV_DS1305 is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1307_CENTURY is not set -# CONFIG_RTC_DRV_DS1307_HWMON is not set -# CONFIG_RTC_DRV_DS1343 is not set -# CONFIG_RTC_DRV_DS1347 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1390 is not set -# CONFIG_RTC_DRV_DS1511 is not set -# CONFIG_RTC_DRV_DS1553 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_DS1685_FAMILY is not set -# CONFIG_RTC_DRV_DS1742 is not set -# CONFIG_RTC_DRV_DS2404 is not set -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_DS3234 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_EP93XX is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_FTRTC010 is not set -# CONFIG_RTC_DRV_GENERIC is not set -# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set -# CONFIG_RTC_DRV_HYM8563 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_ISL12026 is not set -# CONFIG_RTC_DRV_ISL12057 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_JZ4740 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_M41T93 is not set -# CONFIG_RTC_DRV_M41T94 is not set -# CONFIG_RTC_DRV_M48T35 is not set -# CONFIG_RTC_DRV_M48T59 is not set -# CONFIG_RTC_DRV_M48T86 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_MAX6902 is not set -# CONFIG_RTC_DRV_MAX6916 is not set -# CONFIG_RTC_DRV_MCP795 is not set -# CONFIG_RTC_DRV_MOXART is not set -# CONFIG_RTC_DRV_MPC5121 is not set -# CONFIG_RTC_DRV_MSM6242 is not set -# CONFIG_RTC_DRV_MT2712 is not set -# CONFIG_RTC_DRV_OMAP is not set -# CONFIG_RTC_DRV_PCF2123 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_PL030 is not set -# CONFIG_RTC_DRV_PL031 is not set -# CONFIG_RTC_DRV_PS3 is not set -# CONFIG_RTC_DRV_PT7C4338 is not set -# CONFIG_RTC_DRV_R7301 is not set -# CONFIG_RTC_DRV_R9701 is not set -# CONFIG_RTC_DRV_RP5C01 is not set -# CONFIG_RTC_DRV_RS5C348 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_RTC7301 is not set -# CONFIG_RTC_DRV_RV3028 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set -# CONFIG_RTC_DRV_RV3032 is not set -# CONFIG_RTC_DRV_RV8803 is not set -# CONFIG_RTC_DRV_RX4581 is not set -# CONFIG_RTC_DRV_RX6110 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_SD3078 is not set -# CONFIG_RTC_DRV_SNVS is not set -# CONFIG_RTC_DRV_STK17TA8 is not set -# CONFIG_RTC_DRV_SUN6I is not set -# CONFIG_RTC_DRV_TEST is not set -# CONFIG_RTC_DRV_V3020 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_XGENE is not set -# CONFIG_RTC_DRV_ZYNQMP is not set -CONFIG_RTC_HCTOSYS=y -CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -CONFIG_RTC_INTF_DEV=y -# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -CONFIG_RTC_INTF_PROC=y -CONFIG_RTC_INTF_SYSFS=y -CONFIG_RTC_LIB=y -# CONFIG_RTC_NVMEM is not set -CONFIG_RTC_SYSTOHC=y -CONFIG_RTC_SYSTOHC_DEVICE="rtc0" -# CONFIG_RTL8180 is not set -# CONFIG_RTL8187 is not set -# CONFIG_RTL8192E is not set -# CONFIG_RTL8192U is not set -# CONFIG_RTL8306_PHY is not set -# CONFIG_RTL8366RB_PHY is not set -# CONFIG_RTL8366S_PHY is not set -# CONFIG_RTL8366_SMI is not set -# CONFIG_RTL8366_SMI_DEBUG_FS is not set -# CONFIG_RTL8367B_PHY is not set -# CONFIG_RTL8367_PHY is not set -# CONFIG_RTLLIB is not set -# CONFIG_RTL_CARDS is not set -# CONFIG_RTS5208 is not set -CONFIG_RT_MUTEXES=y -# CONFIG_RUNTIME_DEBUG is not set -CONFIG_RUNTIME_TESTING_MENU=y -CONFIG_RWSEM_GENERIC_SPINLOCK=y -CONFIG_RXKAD=y -# CONFIG_S2IO is not set -# CONFIG_SAMPLES is not set -# CONFIG_SAMSUNG_LAPTOP is not set -# CONFIG_SATA_ACARD_AHCI is not set -# CONFIG_SATA_AHCI is not set -# CONFIG_SATA_AHCI_PLATFORM is not set -# CONFIG_SATA_DWC is not set -# CONFIG_SATA_FSL is not set -# CONFIG_SATA_HIGHBANK is not set -# CONFIG_SATA_HOST is not set -# CONFIG_SATA_INIC162X is not set -CONFIG_SATA_MOBILE_LPM_POLICY=0 -# CONFIG_SATA_MV is not set -# CONFIG_SATA_NV is not set -# CONFIG_SATA_PMP is not set -# CONFIG_SATA_PROMISE is not set -# CONFIG_SATA_QSTOR is not set -# CONFIG_SATA_RCAR is not set -# CONFIG_SATA_SIL is not set -# CONFIG_SATA_SIL24 is not set -# CONFIG_SATA_SIS is not set -# CONFIG_SATA_SVW is not set -# CONFIG_SATA_SX4 is not set -# CONFIG_SATA_ULI is not set -# CONFIG_SATA_VIA is not set -# CONFIG_SATA_VITESSE is not set -# CONFIG_SBC_FITPC2_WATCHDOG is not set -CONFIG_SBITMAP=y -# CONFIG_SC92031 is not set -# CONFIG_SCA3000 is not set -# CONFIG_SCACHE_DEBUGFS is not set -# CONFIG_SCC is not set -# CONFIG_SCD30_CORE is not set -# CONFIG_SCF_TORTURE_TEST is not set -# CONFIG_SCHEDSTATS is not set -# CONFIG_SCHED_AUTOGROUP is not set -# CONFIG_SCHED_DEBUG is not set -CONFIG_SCHED_HRTICK=y -# CONFIG_SCHED_MC is not set -CONFIG_SCHED_OMIT_FRAME_POINTER=y -# CONFIG_SCHED_SMT is not set -# CONFIG_SCHED_STACK_END_CHECK is not set -# CONFIG_SCHED_TRACER is not set -# CONFIG_SCR24X is not set -# CONFIG_SCSI is not set -# CONFIG_SCSI_3W_9XXX is not set -# CONFIG_SCSI_3W_SAS is not set -# CONFIG_SCSI_7000FASST is not set -# CONFIG_SCSI_AACRAID is not set -# CONFIG_SCSI_ACARD is not set -# CONFIG_SCSI_ADVANSYS is not set -# CONFIG_SCSI_AHA152X is not set -# CONFIG_SCSI_AHA1542 is not set -# CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_AIC7XXX is not set -# CONFIG_SCSI_AIC94XX is not set -# CONFIG_SCSI_AM53C974 is not set -# CONFIG_SCSI_ARCMSR is not set -# CONFIG_SCSI_BFA_FC is not set -# CONFIG_SCSI_BNX2X_FCOE is not set -# CONFIG_SCSI_BNX2_ISCSI is not set -# CONFIG_SCSI_BUSLOGIC is not set -# CONFIG_SCSI_CHELSIO_FCOE is not set -# CONFIG_SCSI_CONSTANTS is not set -# CONFIG_SCSI_CXGB3_ISCSI is not set -# CONFIG_SCSI_CXGB4_ISCSI is not set -# CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_DEBUG is not set -# CONFIG_SCSI_DH is not set -CONFIG_SCSI_DMA=y -# CONFIG_SCSI_DMX3191D is not set -# CONFIG_SCSI_DPT_I2O is not set -# CONFIG_SCSI_DTC3280 is not set -# CONFIG_SCSI_EATA is not set -# CONFIG_SCSI_ESAS2R is not set -# CONFIG_SCSI_FC_ATTRS is not set -# CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_FUTURE_DOMAIN is not set -# CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_GENERIC_NCR5380 is not set -# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set -# CONFIG_SCSI_HISI_SAS is not set -# CONFIG_SCSI_HPSA is not set -# CONFIG_SCSI_HPTIOP is not set -# CONFIG_SCSI_IN2000 is not set -# CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_INITIO is not set -# CONFIG_SCSI_IPR is not set -# CONFIG_SCSI_IPS is not set -# CONFIG_SCSI_ISCI is not set -# CONFIG_SCSI_ISCSI_ATTRS is not set -# CONFIG_SCSI_LOGGING is not set -CONFIG_SCSI_LOWLEVEL=y -# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set -# CONFIG_SCSI_LPFC is not set -CONFIG_SCSI_MOD=y -# CONFIG_SCSI_MPT2SAS is not set -# CONFIG_SCSI_MPT3SAS is not set -# CONFIG_SCSI_MQ_DEFAULT is not set -# CONFIG_SCSI_MVSAS is not set -# CONFIG_SCSI_MVSAS_DEBUG is not set -# CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_MYRB is not set -# CONFIG_SCSI_MYRS is not set -# CONFIG_SCSI_NCR53C406A is not set -# CONFIG_SCSI_NETLINK is not set -# CONFIG_SCSI_NSP32 is not set -# CONFIG_SCSI_OSD_INITIATOR is not set -# CONFIG_SCSI_PAS16 is not set -# CONFIG_SCSI_PM8001 is not set -# CONFIG_SCSI_PMCRAID is not set -CONFIG_SCSI_PROC_FS=y -# CONFIG_SCSI_QLA_FC is not set -# CONFIG_SCSI_QLA_ISCSI is not set -# CONFIG_SCSI_QLOGIC_1280 is not set -# CONFIG_SCSI_QLOGIC_FAS is not set -# CONFIG_SCSI_SAS_ATTRS is not set -# CONFIG_SCSI_SAS_LIBSAS is not set -# CONFIG_SCSI_SCAN_ASYNC is not set -# CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_SNIC is not set -# CONFIG_SCSI_SPI_ATTRS is not set -# CONFIG_SCSI_SRP_ATTRS is not set -# CONFIG_SCSI_STEX is not set -# CONFIG_SCSI_SYM53C416 is not set -# CONFIG_SCSI_SYM53C8XX_2 is not set -# CONFIG_SCSI_T128 is not set -# CONFIG_SCSI_U14_34F is not set -# CONFIG_SCSI_UFSHCD is not set -# CONFIG_SCSI_ULTRASTOR is not set -# CONFIG_SCSI_VIRTIO is not set -# CONFIG_SCSI_WD719X is not set -# CONFIG_SCx200_ACB is not set -# CONFIG_SDIO_UART is not set -# CONFIG_SDR_MAX2175 is not set -# CONFIG_SDR_PLATFORM_DRIVERS is not set -# CONFIG_SD_ADC_MODULATOR is not set -# CONFIG_SECCOMP is not set -CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_SECURITY is not set -# CONFIG_SECURITYFS is not set -# CONFIG_SECURITY_APPARMOR is not set -CONFIG_SECURITY_DMESG_RESTRICT=y -# CONFIG_SECURITY_LOADPIN is not set -# CONFIG_SECURITY_LOCKDOWN_LSM is not set -# CONFIG_SECURITY_NETWORK_XFRM is not set -# CONFIG_SECURITY_PATH is not set -# CONFIG_SECURITY_SAFESETID is not set -# CONFIG_SECURITY_SELINUX_AVC_STATS is not set -# CONFIG_SECURITY_SELINUX_BOOTPARAM is not set -CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 -# CONFIG_SECURITY_SELINUX_DEVELOP is not set -# CONFIG_SECURITY_SELINUX_DISABLE is not set -# CONFIG_SECURITY_SMACK is not set -# CONFIG_SECURITY_TOMOYO is not set -# CONFIG_SECURITY_YAMA is not set -CONFIG_SELECT_MEMORY_MODEL=y -# CONFIG_SENSIRION_SGP30 is not set -# CONFIG_SENSORS_ABITUGURU is not set -# CONFIG_SENSORS_ABITUGURU3 is not set -# CONFIG_SENSORS_ACPI_POWER is not set -# CONFIG_SENSORS_AD7314 is not set -# CONFIG_SENSORS_AD7414 is not set -# CONFIG_SENSORS_AD7418 is not set -# CONFIG_SENSORS_ADC128D818 is not set -# CONFIG_SENSORS_ADCXX is not set -# CONFIG_SENSORS_ADM1021 is not set -# CONFIG_SENSORS_ADM1025 is not set -# CONFIG_SENSORS_ADM1026 is not set -# CONFIG_SENSORS_ADM1029 is not set -# CONFIG_SENSORS_ADM1031 is not set -# CONFIG_SENSORS_ADM1177 is not set -# CONFIG_SENSORS_ADM1266 is not set -# CONFIG_SENSORS_ADM1275 is not set -# CONFIG_SENSORS_ADM9240 is not set -# CONFIG_SENSORS_ADS1015 is not set -# CONFIG_SENSORS_ADS7828 is not set -# CONFIG_SENSORS_ADS7871 is not set -# CONFIG_SENSORS_ADT7310 is not set -# CONFIG_SENSORS_ADT7410 is not set -# CONFIG_SENSORS_ADT7411 is not set -# CONFIG_SENSORS_ADT7462 is not set -# CONFIG_SENSORS_ADT7470 is not set -# CONFIG_SENSORS_ADT7475 is not set -# CONFIG_SENSORS_AMC6821 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_SENSORS_APPLESMC is not set -# CONFIG_SENSORS_AS370 is not set -# CONFIG_SENSORS_ASB100 is not set -# CONFIG_SENSORS_ASC7621 is not set -# CONFIG_SENSORS_ASPEED is not set -# CONFIG_SENSORS_ATK0110 is not set -# CONFIG_SENSORS_ATXP1 is not set -# CONFIG_SENSORS_AXI_FAN_CONTROL is not set -# CONFIG_SENSORS_BEL_PFE is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_BH1780 is not set -# CONFIG_SENSORS_CORETEMP is not set -# CONFIG_SENSORS_CORSAIR_CPRO is not set -# CONFIG_SENSORS_DELL_SMM is not set -# CONFIG_SENSORS_DME1737 is not set -# CONFIG_SENSORS_DRIVETEMP is not set -# CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_DS620 is not set -# CONFIG_SENSORS_EMC1403 is not set -# CONFIG_SENSORS_EMC2103 is not set -# CONFIG_SENSORS_EMC6W201 is not set -# CONFIG_SENSORS_F71805F is not set -# CONFIG_SENSORS_F71882FG is not set -# CONFIG_SENSORS_F75375S is not set -# CONFIG_SENSORS_FAM15H_POWER is not set -# CONFIG_SENSORS_FSCHMD is not set -# CONFIG_SENSORS_FTSTEUTATES is not set -# CONFIG_SENSORS_G760A is not set -# CONFIG_SENSORS_G762 is not set -# CONFIG_SENSORS_GL518SM is not set -# CONFIG_SENSORS_GL520SM is not set -# CONFIG_SENSORS_GPIO_FAN is not set -# CONFIG_SENSORS_GSC is not set -# CONFIG_SENSORS_HDAPS is not set -# CONFIG_SENSORS_HIH6130 is not set -# CONFIG_SENSORS_HMC5843 is not set -# CONFIG_SENSORS_HMC5843_I2C is not set -# CONFIG_SENSORS_HMC5843_SPI is not set -# CONFIG_SENSORS_HTU21 is not set -# CONFIG_SENSORS_I5500 is not set -# CONFIG_SENSORS_I5K_AMB is not set -# CONFIG_SENSORS_IBM_CFFPS is not set -# CONFIG_SENSORS_IIO_HWMON is not set -# CONFIG_SENSORS_INA209 is not set -# CONFIG_SENSORS_INA2XX is not set -# CONFIG_SENSORS_INA3221 is not set -# CONFIG_SENSORS_INSPUR_IPSPS is not set -# CONFIG_SENSORS_IR35221 is not set -# CONFIG_SENSORS_IR38064 is not set -# CONFIG_SENSORS_IRPS5401 is not set -# CONFIG_SENSORS_ISL29018 is not set -# CONFIG_SENSORS_ISL29028 is not set -# CONFIG_SENSORS_ISL68137 is not set -# CONFIG_SENSORS_IT87 is not set -# CONFIG_SENSORS_JC42 is not set -# CONFIG_SENSORS_K10TEMP is not set -# CONFIG_SENSORS_K8TEMP is not set -# CONFIG_SENSORS_LINEAGE is not set -# CONFIG_SENSORS_LIS3LV02D is not set -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_SENSORS_LIS3_SPI is not set -# CONFIG_SENSORS_LM25066 is not set -# CONFIG_SENSORS_LM63 is not set -# CONFIG_SENSORS_LM70 is not set -# CONFIG_SENSORS_LM73 is not set -# CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM77 is not set -# CONFIG_SENSORS_LM78 is not set -# CONFIG_SENSORS_LM80 is not set -# CONFIG_SENSORS_LM83 is not set -# CONFIG_SENSORS_LM85 is not set -# CONFIG_SENSORS_LM87 is not set -# CONFIG_SENSORS_LM90 is not set -# CONFIG_SENSORS_LM92 is not set -# CONFIG_SENSORS_LM93 is not set -# CONFIG_SENSORS_LM95234 is not set -# CONFIG_SENSORS_LM95241 is not set -# CONFIG_SENSORS_LM95245 is not set -# CONFIG_SENSORS_LTC2945 is not set -# CONFIG_SENSORS_LTC2947_I2C is not set -# CONFIG_SENSORS_LTC2947_SPI is not set -# CONFIG_SENSORS_LTC2978 is not set -# CONFIG_SENSORS_LTC2990 is not set -# CONFIG_SENSORS_LTC3815 is not set -# CONFIG_SENSORS_LTC4151 is not set -# CONFIG_SENSORS_LTC4215 is not set -# CONFIG_SENSORS_LTC4222 is not set -# CONFIG_SENSORS_LTC4245 is not set -# CONFIG_SENSORS_LTC4260 is not set -# CONFIG_SENSORS_LTC4261 is not set -# CONFIG_SENSORS_LTQ_CPUTEMP is not set -# CONFIG_SENSORS_MAX1111 is not set -# CONFIG_SENSORS_MAX16064 is not set -# CONFIG_SENSORS_MAX16065 is not set -# CONFIG_SENSORS_MAX1619 is not set -# CONFIG_SENSORS_MAX16601 is not set -# CONFIG_SENSORS_MAX1668 is not set -# CONFIG_SENSORS_MAX197 is not set -# CONFIG_SENSORS_MAX20730 is not set -# CONFIG_SENSORS_MAX20751 is not set -# CONFIG_SENSORS_MAX31722 is not set -# CONFIG_SENSORS_MAX31730 is not set -# CONFIG_SENSORS_MAX31785 is not set -# CONFIG_SENSORS_MAX31790 is not set -# CONFIG_SENSORS_MAX34440 is not set -# CONFIG_SENSORS_MAX6621 is not set -# CONFIG_SENSORS_MAX6639 is not set -# CONFIG_SENSORS_MAX6642 is not set -# CONFIG_SENSORS_MAX6650 is not set -# CONFIG_SENSORS_MAX6697 is not set -# CONFIG_SENSORS_MAX8688 is not set -# CONFIG_SENSORS_MCP3021 is not set -# CONFIG_SENSORS_MP2975 is not set -# CONFIG_SENSORS_MR75203 is not set -# CONFIG_SENSORS_NCT6683 is not set -# CONFIG_SENSORS_NCT6775 is not set -# CONFIG_SENSORS_NCT7802 is not set -# CONFIG_SENSORS_NCT7904 is not set -# CONFIG_SENSORS_NPCM7XX is not set -# CONFIG_SENSORS_NSA320 is not set -# CONFIG_SENSORS_NTC_THERMISTOR is not set -# CONFIG_SENSORS_OCC_P8_I2C is not set -# CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_PC87427 is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_SENSORS_PMBUS is not set -# CONFIG_SENSORS_POWR1220 is not set -# CONFIG_SENSORS_PWM_FAN is not set -# CONFIG_SENSORS_PXE1610 is not set -# CONFIG_SENSORS_RM3100_I2C is not set -# CONFIG_SENSORS_RM3100_SPI is not set -# CONFIG_SENSORS_SCH5627 is not set -# CONFIG_SENSORS_SCH5636 is not set -# CONFIG_SENSORS_SCH56XX_COMMON is not set -# CONFIG_SENSORS_SHT15 is not set -# CONFIG_SENSORS_SHT21 is not set -# CONFIG_SENSORS_SHT3x is not set -# CONFIG_SENSORS_SHTC1 is not set -# CONFIG_SENSORS_SIS5595 is not set -# CONFIG_SENSORS_SMM665 is not set -# CONFIG_SENSORS_SMSC47B397 is not set -# CONFIG_SENSORS_SMSC47M1 is not set -# CONFIG_SENSORS_SMSC47M192 is not set -# CONFIG_SENSORS_STTS751 is not set -# CONFIG_SENSORS_TC654 is not set -# CONFIG_SENSORS_TC74 is not set -# CONFIG_SENSORS_THMC50 is not set -# CONFIG_SENSORS_TMP102 is not set -# CONFIG_SENSORS_TMP103 is not set -# CONFIG_SENSORS_TMP108 is not set -# CONFIG_SENSORS_TMP401 is not set -# CONFIG_SENSORS_TMP421 is not set -# CONFIG_SENSORS_TMP513 is not set -# CONFIG_SENSORS_TPS40422 is not set -# CONFIG_SENSORS_TPS53679 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_TSL2563 is not set -# CONFIG_SENSORS_UCD9000 is not set -# CONFIG_SENSORS_UCD9200 is not set -# CONFIG_SENSORS_VEXPRESS is not set -# CONFIG_SENSORS_VIA686A is not set -# CONFIG_SENSORS_VIA_CPUTEMP is not set -# CONFIG_SENSORS_VT1211 is not set -# CONFIG_SENSORS_VT8231 is not set -# CONFIG_SENSORS_W83627EHF is not set -# CONFIG_SENSORS_W83627HF is not set -# CONFIG_SENSORS_W83773G is not set -# CONFIG_SENSORS_W83781D is not set -# CONFIG_SENSORS_W83791D is not set -# CONFIG_SENSORS_W83792D is not set -# CONFIG_SENSORS_W83793 is not set -# CONFIG_SENSORS_W83795 is not set -# CONFIG_SENSORS_W83L785TS is not set -# CONFIG_SENSORS_W83L786NG is not set -# CONFIG_SENSORS_XDPE122 is not set -# CONFIG_SENSORS_XGENE is not set -# CONFIG_SENSORS_ZL6100 is not set -CONFIG_SERIAL_8250=y -CONFIG_SERIAL_8250_16550A_VARIANTS=y -# CONFIG_SERIAL_8250_ACCENT is not set -# CONFIG_SERIAL_8250_ASPEED_VUART is not set -# CONFIG_SERIAL_8250_BOCA is not set -CONFIG_SERIAL_8250_CONSOLE=y -# CONFIG_SERIAL_8250_CS is not set -# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set -# CONFIG_SERIAL_8250_DETECT_IRQ is not set -CONFIG_SERIAL_8250_DMA=y -# CONFIG_SERIAL_8250_DW is not set -# CONFIG_SERIAL_8250_EM is not set -# CONFIG_SERIAL_8250_EXAR is not set -# CONFIG_SERIAL_8250_EXAR_ST16C554 is not set -# CONFIG_SERIAL_8250_EXTENDED is not set -# CONFIG_SERIAL_8250_FINTEK is not set -# CONFIG_SERIAL_8250_FOURPORT is not set -# CONFIG_SERIAL_8250_HUB6 is not set -# CONFIG_SERIAL_8250_INGENIC is not set -# CONFIG_SERIAL_8250_LPSS is not set -# CONFIG_SERIAL_8250_MANY_PORTS is not set -# CONFIG_SERIAL_8250_MID is not set -# CONFIG_SERIAL_8250_MOXA is not set -CONFIG_SERIAL_8250_NR_UARTS=2 -# CONFIG_SERIAL_8250_PCI is not set -# CONFIG_SERIAL_8250_RSA is not set -# CONFIG_SERIAL_8250_RT288X is not set -CONFIG_SERIAL_8250_RUNTIME_UARTS=2 -# CONFIG_SERIAL_ALTERA_JTAGUART is not set -# CONFIG_SERIAL_ALTERA_UART is not set -# CONFIG_SERIAL_AMBA_PL010 is not set -# CONFIG_SERIAL_AMBA_PL011 is not set -# CONFIG_SERIAL_ARC is not set -# CONFIG_SERIAL_BCM63XX is not set -# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -# CONFIG_SERIAL_DEV_BUS is not set -CONFIG_SERIAL_EARLYCON=y -# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set -# CONFIG_SERIAL_FSL_LINFLEXUART is not set -# CONFIG_SERIAL_FSL_LPUART is not set -# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set -# CONFIG_SERIAL_IFX6X60 is not set -# CONFIG_SERIAL_JSM is not set -# CONFIG_SERIAL_MAX3100 is not set -# CONFIG_SERIAL_MAX310X is not set -# CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_SERIAL_OF_PLATFORM is not set -# CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set -# CONFIG_SERIAL_PCH_UART is not set -# CONFIG_SERIAL_RP2 is not set -# CONFIG_SERIAL_SC16IS7XX is not set -# CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SH_SCI is not set -# CONFIG_SERIAL_SIFIVE is not set -# CONFIG_SERIAL_SPRD is not set -# CONFIG_SERIAL_STM32 is not set -# CONFIG_SERIAL_ST_ASC is not set -# CONFIG_SERIAL_TIMBERDALE is not set -# CONFIG_SERIAL_UARTLITE is not set -# CONFIG_SERIAL_XILINX_PS_UART is not set -# CONFIG_SERIO is not set -# CONFIG_SERIO_ALTERA_PS2 is not set -# CONFIG_SERIO_AMBAKMI is not set -# CONFIG_SERIO_APBPS2 is not set -# CONFIG_SERIO_ARC_PS2 is not set -# CONFIG_SERIO_CT82C710 is not set -# CONFIG_SERIO_GPIO_PS2 is not set -# CONFIG_SERIO_I8042 is not set -# CONFIG_SERIO_LIBPS2 is not set -# CONFIG_SERIO_PARKBD is not set -# CONFIG_SERIO_PCIPS2 is not set -# CONFIG_SERIO_PS2MULT is not set -# CONFIG_SERIO_RAW is not set -# CONFIG_SERIO_SERPORT is not set -# CONFIG_SERIO_SUN4I_PS2 is not set -# CONFIG_SFC is not set -# CONFIG_SFC_FALCON is not set -# CONFIG_SFI is not set -# CONFIG_SFP is not set -# CONFIG_SF_PDMA is not set -# CONFIG_SGETMASK_SYSCALL is not set -# CONFIG_SGI_IOC4 is not set -# CONFIG_SGI_IP22 is not set -# CONFIG_SGI_IP27 is not set -# CONFIG_SGI_IP28 is not set -# CONFIG_SGI_IP30 is not set -# CONFIG_SGI_IP32 is not set -# CONFIG_SGI_MFD_IOC3 is not set -# CONFIG_SGI_PARTITION is not set -# CONFIG_SG_POOL is not set -# CONFIG_SG_SPLIT is not set -CONFIG_SHMEM=y -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -# CONFIG_SH_ETH is not set -# CONFIG_SH_TIMER_CMT is not set -# CONFIG_SH_TIMER_MTU2 is not set -# CONFIG_SH_TIMER_TMU is not set -# CONFIG_SI1133 is not set -# CONFIG_SI1145 is not set -# CONFIG_SI7005 is not set -# CONFIG_SI7020 is not set -# CONFIG_SIBYTE_BIGSUR is not set -# CONFIG_SIBYTE_CARMEL is not set -# CONFIG_SIBYTE_CRHINE is not set -# CONFIG_SIBYTE_CRHONE is not set -# CONFIG_SIBYTE_LITTLESUR is not set -# CONFIG_SIBYTE_RHONE is not set -# CONFIG_SIBYTE_SENTOSA is not set -# CONFIG_SIBYTE_SWARM is not set -CONFIG_SIGNALFD=y -# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set -# CONFIG_SIMPLE_GPIO is not set -# CONFIG_SIMPLE_PM_BUS is not set -# CONFIG_SIOX is not set -# CONFIG_SIS190 is not set -# CONFIG_SIS900 is not set -# CONFIG_SKGE is not set -# CONFIG_SKY2 is not set -# CONFIG_SKY2_DEBUG is not set -# CONFIG_SLAB is not set -CONFIG_SLABINFO=y -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SLAB_FREELIST_RANDOM is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLHC is not set -# CONFIG_SLICOSS is not set -# CONFIG_SLIMBUS is not set -# CONFIG_SLIP is not set -# CONFIG_SLOB is not set -CONFIG_SLUB=y -CONFIG_SLUB_CPU_PARTIAL=y -# CONFIG_SLUB_DEBUG is not set -# CONFIG_SLUB_DEBUG_ON is not set -# CONFIG_SLUB_MEMCG_SYSFS_ON is not set -# CONFIG_SLUB_STATS is not set -# CONFIG_SMARTJOYPLUS_FF is not set -# CONFIG_SMC911X is not set -# CONFIG_SMC9194 is not set -# CONFIG_SMC91X is not set -# CONFIG_SMP is not set -# CONFIG_SMSC911X is not set -# CONFIG_SMSC9420 is not set -# CONFIG_SMSC_PHY is not set -# CONFIG_SMS_SDIO_DRV is not set -# CONFIG_SMS_USB_DRV is not set -# CONFIG_SM_FTL is not set -# CONFIG_SND is not set -# CONFIG_SND_AC97_POWER_SAVE is not set -# CONFIG_SND_AD1816A is not set -# CONFIG_SND_AD1848 is not set -# CONFIG_SND_AD1889 is not set -# CONFIG_SND_ADLIB is not set -# CONFIG_SND_ALI5451 is not set -# CONFIG_SND_ALOOP is not set -# CONFIG_SND_ALS100 is not set -# CONFIG_SND_ALS300 is not set -# CONFIG_SND_ALS4000 is not set -# CONFIG_SND_ARM is not set -# CONFIG_SND_ASIHPI is not set -# CONFIG_SND_ATIIXP is not set -# CONFIG_SND_ATIIXP_MODEM is not set -# CONFIG_SND_ATMEL_AC97C is not set -# CONFIG_SND_ATMEL_SOC is not set -# CONFIG_SND_AU8810 is not set -# CONFIG_SND_AU8820 is not set -# CONFIG_SND_AU8830 is not set -# CONFIG_SND_AUDIO_GRAPH_CARD is not set -# CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set -# CONFIG_SND_AW2 is not set -# CONFIG_SND_AZT2320 is not set -# CONFIG_SND_AZT3328 is not set -# CONFIG_SND_BCD2000 is not set -# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set -# CONFIG_SND_BT87X is not set -# CONFIG_SND_CA0106 is not set -# CONFIG_SND_CMI8330 is not set -# CONFIG_SND_CMIPCI is not set -# CONFIG_SND_CS4231 is not set -# CONFIG_SND_CS4236 is not set -# CONFIG_SND_CS4281 is not set -# CONFIG_SND_CS46XX is not set -# CONFIG_SND_CS5530 is not set -# CONFIG_SND_CS5535AUDIO is not set -# CONFIG_SND_CTXFI is not set -# CONFIG_SND_DARLA20 is not set -# CONFIG_SND_DARLA24 is not set -# CONFIG_SND_DEBUG is not set -# CONFIG_SND_DESIGNWARE_I2S is not set -CONFIG_SND_DRIVERS=y -# CONFIG_SND_DUMMY is not set -# CONFIG_SND_DYNAMIC_MINORS is not set -# CONFIG_SND_ECHO3G is not set -# CONFIG_SND_EDMA_SOC is not set -# CONFIG_SND_EMU10K1 is not set -# CONFIG_SND_EMU10K1X is not set -# CONFIG_SND_EMU10K1_SEQ is not set -# CONFIG_SND_ENS1370 is not set -# CONFIG_SND_ENS1371 is not set -# CONFIG_SND_ES1688 is not set -# CONFIG_SND_ES18XX is not set -# CONFIG_SND_ES1938 is not set -# CONFIG_SND_ES1968 is not set -# CONFIG_SND_FIREWIRE is not set -# CONFIG_SND_FM801 is not set -# CONFIG_SND_GINA20 is not set -# CONFIG_SND_GINA24 is not set -# CONFIG_SND_GUSCLASSIC is not set -# CONFIG_SND_GUSEXTREME is not set -# CONFIG_SND_GUSMAX is not set -# CONFIG_SND_HDA_INTEL is not set -# CONFIG_SND_HDA_INTEL_DETECT_DMIC is not set -# CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM is not set -CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 -CONFIG_SND_HDA_PREALLOC_SIZE=64 -# CONFIG_SND_HDSP is not set -# CONFIG_SND_HDSPM is not set -# CONFIG_SND_HRTIMER is not set -# CONFIG_SND_HWDEP is not set -# CONFIG_SND_I2S_HI6210_I2S is not set -# CONFIG_SND_ICE1712 is not set -# CONFIG_SND_ICE1724 is not set -# CONFIG_SND_INDIGO is not set -# CONFIG_SND_INDIGODJ is not set -# CONFIG_SND_INDIGODJX is not set -# CONFIG_SND_INDIGOIO is not set -# CONFIG_SND_INDIGOIOX is not set -# CONFIG_SND_INTEL8X0 is not set -# CONFIG_SND_INTEL8X0M is not set -# CONFIG_SND_INTERWAVE is not set -# CONFIG_SND_INTERWAVE_STB is not set -# CONFIG_SND_ISA is not set -# CONFIG_SND_JZ4740_SOC_I2S is not set -# CONFIG_SND_KIRKWOOD_SOC is not set -# CONFIG_SND_KORG1212 is not set -# CONFIG_SND_LAYLA20 is not set -# CONFIG_SND_LAYLA24 is not set -# CONFIG_SND_LOLA is not set -# CONFIG_SND_LX6464ES is not set -# CONFIG_SND_MAESTRO3 is not set -CONFIG_SND_MAX_CARDS=16 -# CONFIG_SND_MIA is not set -# CONFIG_SND_MIPS is not set -# CONFIG_SND_MIRO is not set -# CONFIG_SND_MIXART is not set -# CONFIG_SND_MIXER_OSS is not set -# CONFIG_SND_MONA is not set -# CONFIG_SND_MPC52xx_SOC_EFIKA is not set -# CONFIG_SND_MPU401 is not set -# CONFIG_SND_MTPAV is not set -# CONFIG_SND_MTS64 is not set -# CONFIG_SND_MXS_SOC is not set -# CONFIG_SND_NM256 is not set -# CONFIG_SND_OPL3SA2 is not set -# CONFIG_SND_OPL3_LIB_SEQ is not set -# CONFIG_SND_OPL4_LIB_SEQ is not set -# CONFIG_SND_OPTI92X_AD1848 is not set -# CONFIG_SND_OPTI92X_CS4231 is not set -# CONFIG_SND_OPTI93X is not set -CONFIG_SND_OSSEMUL=y -# CONFIG_SND_OXYGEN is not set -CONFIG_SND_PCI=y -# CONFIG_SND_PCM is not set -# CONFIG_SND_PCMCIA is not set -# CONFIG_SND_PCM_OSS is not set -CONFIG_SND_PCM_OSS_PLUGINS=y -# CONFIG_SND_PCM_TIMER is not set -# CONFIG_SND_PCM_XRUN_DEBUG is not set -# CONFIG_SND_PCXHR is not set -# CONFIG_SND_PDAUDIOCF is not set -# CONFIG_SND_PORTMAN2X4 is not set -# CONFIG_SND_POWERPC_SOC is not set -# CONFIG_SND_PPC is not set -CONFIG_SND_PROC_FS=y -# CONFIG_SND_RAWMIDI is not set -# CONFIG_SND_RAWMIDI_SEQ is not set -# CONFIG_SND_RIPTIDE is not set -# CONFIG_SND_RME32 is not set -# CONFIG_SND_RME96 is not set -# CONFIG_SND_RME9652 is not set -# CONFIG_SND_RTCTIMER is not set -# CONFIG_SND_SB16 is not set -# CONFIG_SND_SB8 is not set -# CONFIG_SND_SBAWE is not set -# CONFIG_SND_SBAWE_SEQ is not set -# CONFIG_SND_SE6X is not set -# CONFIG_SND_SEQUENCER is not set -# CONFIG_SND_SERIAL_U16550 is not set -# CONFIG_SND_SIMPLE_CARD is not set -# CONFIG_SND_SIMPLE_SCU_CARD is not set -# CONFIG_SND_SIS7019 is not set -# CONFIG_SND_SOC is not set -# CONFIG_SND_SOC_AC97_CODEC is not set -# CONFIG_SND_SOC_ADAU1701 is not set -# CONFIG_SND_SOC_ADAU1761_I2C is not set -# CONFIG_SND_SOC_ADAU1761_SPI is not set -# CONFIG_SND_SOC_ADAU7002 is not set -# CONFIG_SND_SOC_ADAU7118_HW is not set -# CONFIG_SND_SOC_ADAU7118_I2C is not set -# CONFIG_SND_SOC_AK4104 is not set -# CONFIG_SND_SOC_AK4118 is not set -# CONFIG_SND_SOC_AK4458 is not set -# CONFIG_SND_SOC_AK4554 is not set -# CONFIG_SND_SOC_AK4613 is not set -# CONFIG_SND_SOC_AK4642 is not set -# CONFIG_SND_SOC_AK5386 is not set -# CONFIG_SND_SOC_AK5558 is not set -# CONFIG_SND_SOC_ALC5623 is not set -# CONFIG_SND_SOC_AMD_ACP is not set -# CONFIG_SND_SOC_AMD_ACP3x is not set -# CONFIG_SND_SOC_AMD_RENOIR is not set -# CONFIG_SND_SOC_AU1XAUDIO is not set -# CONFIG_SND_SOC_AU1XPSC is not set -# CONFIG_SND_SOC_BD28623 is not set -# CONFIG_SND_SOC_BT_SCO is not set -# CONFIG_SND_SOC_CS35L32 is not set -# CONFIG_SND_SOC_CS35L33 is not set -# CONFIG_SND_SOC_CS35L34 is not set -# CONFIG_SND_SOC_CS35L35 is not set -# CONFIG_SND_SOC_CS35L36 is not set -# CONFIG_SND_SOC_CS4234 is not set -# CONFIG_SND_SOC_CS4265 is not set -# CONFIG_SND_SOC_CS4270 is not set -# CONFIG_SND_SOC_CS4271 is not set -# CONFIG_SND_SOC_CS4271_I2C is not set -# CONFIG_SND_SOC_CS4271_SPI is not set -# CONFIG_SND_SOC_CS42L42 is not set -# CONFIG_SND_SOC_CS42L51_I2C is not set -# CONFIG_SND_SOC_CS42L52 is not set -# CONFIG_SND_SOC_CS42L56 is not set -# CONFIG_SND_SOC_CS42L73 is not set -# CONFIG_SND_SOC_CS42XX8_I2C is not set -# CONFIG_SND_SOC_CS43130 is not set -# CONFIG_SND_SOC_CS4341 is not set -# CONFIG_SND_SOC_CS4349 is not set -# CONFIG_SND_SOC_CS53L30 is not set -# CONFIG_SND_SOC_CX2072X is not set -# CONFIG_SND_SOC_DA7213 is not set -# CONFIG_SND_SOC_DIO2125 is not set -# CONFIG_SND_SOC_DMIC is not set -# CONFIG_SND_SOC_ES7134 is not set -# CONFIG_SND_SOC_ES7241 is not set -# CONFIG_SND_SOC_ES8316 is not set -# CONFIG_SND_SOC_ES8328 is not set -# CONFIG_SND_SOC_ES8328_I2C is not set -# CONFIG_SND_SOC_ES8328_SPI is not set -# CONFIG_SND_SOC_EUKREA_TLV320 is not set -# CONFIG_SND_SOC_FSL_ASOC_CARD is not set -# CONFIG_SND_SOC_FSL_ASRC is not set -# CONFIG_SND_SOC_FSL_AUDMIX is not set -# CONFIG_SND_SOC_FSL_ESAI is not set -# CONFIG_SND_SOC_FSL_MICFIL is not set -# CONFIG_SND_SOC_FSL_SAI is not set -# CONFIG_SND_SOC_FSL_SPDIF is not set -# CONFIG_SND_SOC_FSL_SSI is not set -# CONFIG_SND_SOC_GTM601 is not set -# CONFIG_SND_SOC_ICS43432 is not set -# CONFIG_SND_SOC_IMG is not set -# CONFIG_SND_SOC_IMX_AUDMIX is not set -# CONFIG_SND_SOC_IMX_AUDMUX is not set -# CONFIG_SND_SOC_IMX_ES8328 is not set -# CONFIG_SND_SOC_IMX_SPDIF is not set -# CONFIG_SND_SOC_IMX_WM8962 is not set -# CONFIG_SND_SOC_INNO_RK3036 is not set -# CONFIG_SND_SOC_INTEL_APL is not set -# CONFIG_SND_SOC_INTEL_BAYTRAIL is not set -# CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH is not set -# CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH is not set -# CONFIG_SND_SOC_INTEL_BXT_RT298_MACH is not set -# CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH is not set -# CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH is not set -# CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH is not set -# CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH is not set -# CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH is not set -# CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH is not set -# CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH is not set -# CONFIG_SND_SOC_INTEL_CATPT is not set -# CONFIG_SND_SOC_INTEL_CFL is not set -# CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH is not set -# CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH is not set -# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH is not set -# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH is not set -# CONFIG_SND_SOC_INTEL_CML_H is not set -# CONFIG_SND_SOC_INTEL_CML_LP is not set -# CONFIG_SND_SOC_INTEL_CNL is not set -# CONFIG_SND_SOC_INTEL_GLK is not set -# CONFIG_SND_SOC_INTEL_HASWELL is not set -# CONFIG_SND_SOC_INTEL_KBL is not set -# CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH is not set -# CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH is not set -# CONFIG_SND_SOC_INTEL_KEEMBAY is not set -# CONFIG_SND_SOC_INTEL_SKL is not set -# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH is not set -# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH is not set -# CONFIG_SND_SOC_INTEL_SKL_RT286_MACH is not set -# CONFIG_SND_SOC_INTEL_SKYLAKE is not set -# CONFIG_SND_SOC_INTEL_SST is not set -CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y -# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set -# CONFIG_SND_SOC_JZ4725B_CODEC is not set -# CONFIG_SND_SOC_JZ4740_CODEC is not set -# CONFIG_SND_SOC_JZ4770_CODEC is not set -# CONFIG_SND_SOC_MA120X0P is not set -# CONFIG_SND_SOC_MAX9759 is not set -# CONFIG_SND_SOC_MAX98088 is not set -# CONFIG_SND_SOC_MAX98357A is not set -# CONFIG_SND_SOC_MAX98373 is not set -# CONFIG_SND_SOC_MAX98373_I2C is not set -# CONFIG_SND_SOC_MAX98390 is not set -# CONFIG_SND_SOC_MAX98504 is not set -# CONFIG_SND_SOC_MAX9860 is not set -# CONFIG_SND_SOC_MAX9867 is not set -# CONFIG_SND_SOC_MAX98927 is not set -# CONFIG_SND_SOC_MEDIATEK is not set -# CONFIG_SND_SOC_MPC5200_AC97 is not set -# CONFIG_SND_SOC_MPC5200_I2S is not set -# CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set -# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set -# CONFIG_SND_SOC_MT2701 is not set -# CONFIG_SND_SOC_MT6351 is not set -# CONFIG_SND_SOC_MT6358 is not set -# CONFIG_SND_SOC_MT6660 is not set -# CONFIG_SND_SOC_MT6797 is not set -# CONFIG_SND_SOC_MT8173 is not set -# CONFIG_SND_SOC_MT8183 is not set -# CONFIG_SND_SOC_MTK_BTCVSD is not set -# CONFIG_SND_SOC_NAU8540 is not set -# CONFIG_SND_SOC_NAU8810 is not set -# CONFIG_SND_SOC_NAU8822 is not set -# CONFIG_SND_SOC_NAU8824 is not set -# CONFIG_SND_SOC_PCM1681 is not set -# CONFIG_SND_SOC_PCM1789_I2C is not set -# CONFIG_SND_SOC_PCM1792A is not set -# CONFIG_SND_SOC_PCM179X_I2C is not set -# CONFIG_SND_SOC_PCM179X_SPI is not set -# CONFIG_SND_SOC_PCM186X_I2C is not set -# CONFIG_SND_SOC_PCM186X_SPI is not set -# CONFIG_SND_SOC_PCM3060_I2C is not set -# CONFIG_SND_SOC_PCM3060_SPI is not set -# CONFIG_SND_SOC_PCM3168A_I2C is not set -# CONFIG_SND_SOC_PCM3168A_SPI is not set -# CONFIG_SND_SOC_PCM512x_I2C is not set -# CONFIG_SND_SOC_PCM512x_SPI is not set -# CONFIG_SND_SOC_QCOM is not set -# CONFIG_SND_SOC_RK3328 is not set -# CONFIG_SND_SOC_RT5616 is not set -# CONFIG_SND_SOC_RT5631 is not set -# CONFIG_SND_SOC_RT5677_SPI is not set -# CONFIG_SND_SOC_SGTL5000 is not set -# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set -# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set -# CONFIG_SND_SOC_SOF_TOPLEVEL is not set -# CONFIG_SND_SOC_SPDIF is not set -# CONFIG_SND_SOC_SSM2305 is not set -# CONFIG_SND_SOC_SSM2602_I2C is not set -# CONFIG_SND_SOC_SSM2602_SPI is not set -# CONFIG_SND_SOC_SSM4567 is not set -# CONFIG_SND_SOC_STA32X is not set -# CONFIG_SND_SOC_STA350 is not set -# CONFIG_SND_SOC_STI_SAS is not set -# CONFIG_SND_SOC_TAS2552 is not set -# CONFIG_SND_SOC_TAS2562 is not set -# CONFIG_SND_SOC_TAS2764 is not set -# CONFIG_SND_SOC_TAS2770 is not set -# CONFIG_SND_SOC_TAS5086 is not set -# CONFIG_SND_SOC_TAS571X is not set -# CONFIG_SND_SOC_TAS5720 is not set -# CONFIG_SND_SOC_TAS6424 is not set -# CONFIG_SND_SOC_TDA7419 is not set -# CONFIG_SND_SOC_TFA9879 is not set -# CONFIG_SND_SOC_TLV320ADCX140 is not set -# CONFIG_SND_SOC_TLV320AIC23_I2C is not set -# CONFIG_SND_SOC_TLV320AIC23_SPI is not set -# CONFIG_SND_SOC_TLV320AIC31XX is not set -# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set -# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set -# CONFIG_SND_SOC_TLV320AIC3X is not set -# CONFIG_SND_SOC_TPA6130A2 is not set -# CONFIG_SND_SOC_TS3A227E is not set -# CONFIG_SND_SOC_TSCS42XX is not set -# CONFIG_SND_SOC_TSCS454 is not set -# CONFIG_SND_SOC_UDA1334 is not set -# CONFIG_SND_SOC_WM8510 is not set -# CONFIG_SND_SOC_WM8523 is not set -# CONFIG_SND_SOC_WM8524 is not set -# CONFIG_SND_SOC_WM8580 is not set -# CONFIG_SND_SOC_WM8711 is not set -# CONFIG_SND_SOC_WM8728 is not set -# CONFIG_SND_SOC_WM8731 is not set -# CONFIG_SND_SOC_WM8737 is not set -# CONFIG_SND_SOC_WM8741 is not set -# CONFIG_SND_SOC_WM8750 is not set -# CONFIG_SND_SOC_WM8753 is not set -# CONFIG_SND_SOC_WM8770 is not set -# CONFIG_SND_SOC_WM8776 is not set -# CONFIG_SND_SOC_WM8782 is not set -# CONFIG_SND_SOC_WM8804_I2C is not set -# CONFIG_SND_SOC_WM8804_SPI is not set -# CONFIG_SND_SOC_WM8903 is not set -# CONFIG_SND_SOC_WM8904 is not set -# CONFIG_SND_SOC_WM8960 is not set -# CONFIG_SND_SOC_WM8962 is not set -# CONFIG_SND_SOC_WM8974 is not set -# CONFIG_SND_SOC_WM8978 is not set -# CONFIG_SND_SOC_WM8985 is not set -# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set -# CONFIG_SND_SOC_XILINX_I2S is not set -# CONFIG_SND_SOC_XILINX_SPDIF is not set -# CONFIG_SND_SOC_XTFPGA_I2S is not set -# CONFIG_SND_SOC_ZL38060 is not set -# CONFIG_SND_SOC_ZX_AUD96P22 is not set -# CONFIG_SND_SONICVIBES is not set -# CONFIG_SND_SPI is not set -# CONFIG_SND_SSCAPE is not set -# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI is not set -# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI is not set -# CONFIG_SND_SUN4I_CODEC is not set -# CONFIG_SND_SUPPORT_OLD_API is not set -# CONFIG_SND_TIMER is not set -# CONFIG_SND_TRIDENT is not set -CONFIG_SND_USB=y -# CONFIG_SND_USB_6FIRE is not set -# CONFIG_SND_USB_AUDIO is not set -# CONFIG_SND_USB_CAIAQ is not set -# CONFIG_SND_USB_HIFACE is not set -# CONFIG_SND_USB_POD is not set -# CONFIG_SND_USB_PODHD is not set -# CONFIG_SND_USB_TONEPORT is not set -# CONFIG_SND_USB_UA101 is not set -# CONFIG_SND_USB_US122L is not set -# CONFIG_SND_USB_USX2Y is not set -# CONFIG_SND_USB_VARIAX is not set -# CONFIG_SND_VERBOSE_PRINTK is not set -CONFIG_SND_VERBOSE_PROCFS=y -# CONFIG_SND_VIA82XX is not set -# CONFIG_SND_VIA82XX_MODEM is not set -# CONFIG_SND_VIRTUOSO is not set -# CONFIG_SND_VX222 is not set -# CONFIG_SND_VXPOCKET is not set -# CONFIG_SND_WAVEFRONT is not set -CONFIG_SND_X86=y -# CONFIG_SND_XEN_FRONTEND is not set -# CONFIG_SND_YMFPCI is not set -# CONFIG_SNI_RM is not set -# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set -# CONFIG_SOCK_CGROUP_DATA is not set -# CONFIG_SOC_AM33XX is not set -# CONFIG_SOC_AM43XX is not set -# CONFIG_SOC_BRCMSTB is not set -# CONFIG_SOC_CAMERA is not set -# CONFIG_SOC_DRA7XX is not set -# CONFIG_SOC_HAS_OMAP2_SDRC is not set -# CONFIG_SOC_OMAP5 is not set -# CONFIG_SOC_TI is not set -# CONFIG_SOFTLOCKUP_DETECTOR is not set -# CONFIG_SOFT_WATCHDOG is not set -# CONFIG_SOLARIS_X86_PARTITION is not set -# CONFIG_SONYPI is not set -# CONFIG_SONY_LAPTOP is not set -# CONFIG_SOUND is not set -# CONFIG_SOUNDWIRE is not set -# CONFIG_SOUND_OSS_CORE is not set -# CONFIG_SOUND_OSS_CORE_PRECLAIM is not set -# CONFIG_SOUND_PRIME is not set -# CONFIG_SP5100_TCO is not set -# CONFIG_SPARSEMEM_MANUAL is not set -# CONFIG_SPARSEMEM_STATIC is not set -# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set -# CONFIG_SPARSE_IRQ is not set -# CONFIG_SPARSE_RCU_POINTER is not set -# CONFIG_SPEAKUP is not set -# CONFIG_SPI is not set -# CONFIG_SPINLOCK_TEST is not set -# CONFIG_SPI_ALTERA is not set -# CONFIG_SPI_AMD is not set -# CONFIG_SPI_AU1550 is not set -# CONFIG_SPI_AXI_SPI_ENGINE is not set -# CONFIG_SPI_BCM2835 is not set -# CONFIG_SPI_BCM_QSPI is not set -# CONFIG_SPI_BITBANG is not set -# CONFIG_SPI_BUTTERFLY is not set -# CONFIG_SPI_CADENCE is not set -# CONFIG_SPI_CADENCE_QUADSPI is not set -# CONFIG_SPI_DEBUG is not set -# CONFIG_SPI_DESIGNWARE is not set -# CONFIG_SPI_FSL_DSPI is not set -# CONFIG_SPI_FSL_ESPI is not set -# CONFIG_SPI_FSL_SPI is not set -# CONFIG_SPI_GPIO is not set -# CONFIG_SPI_GPIO_OLD is not set -# CONFIG_SPI_IMG_SPFI is not set -# CONFIG_SPI_LANTIQ_SSC is not set -# CONFIG_SPI_LM70_LLP is not set -# CONFIG_SPI_LOOPBACK_TEST is not set -# CONFIG_SPI_MASTER is not set -# CONFIG_SPI_MEM is not set -# CONFIG_SPI_MPC52xx is not set -# CONFIG_SPI_MPC52xx_PSC is not set -# CONFIG_SPI_MTK_QUADSPI is not set -# CONFIG_SPI_MUX is not set -# CONFIG_SPI_MXIC is not set -# CONFIG_SPI_NXP_FLEXSPI is not set -# CONFIG_SPI_OCTEON is not set -# CONFIG_SPI_OC_TINY is not set -# CONFIG_SPI_ORION is not set -# CONFIG_SPI_PL022 is not set -# CONFIG_SPI_PPC4xx is not set -# CONFIG_SPI_PXA2XX is not set -# CONFIG_SPI_PXA2XX_PCI is not set -# CONFIG_SPI_QCOM_QSPI is not set -# CONFIG_SPI_ROCKCHIP is not set -# CONFIG_SPI_S3C64XX is not set -# CONFIG_SPI_SC18IS602 is not set -# CONFIG_SPI_SIFIVE is not set -# CONFIG_SPI_SLAVE is not set -# CONFIG_SPI_SPIDEV is not set -# CONFIG_SPI_THUNDERX is not set -# CONFIG_SPI_TI_QSPI is not set -# CONFIG_SPI_TLE62X0 is not set -# CONFIG_SPI_TOPCLIFF_PCH is not set -# CONFIG_SPI_XCOMM is not set -# CONFIG_SPI_XILINX is not set -# CONFIG_SPI_XWAY is not set -# CONFIG_SPI_ZYNQMP_GQSPI is not set -CONFIG_SPLIT_PTLOCK_CPUS=4 -# CONFIG_SPMI is not set -# CONFIG_SPS30 is not set -CONFIG_SQUASHFS=y -# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set -# CONFIG_SQUASHFS_DECOMP_MULTI is not set -CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y -# CONFIG_SQUASHFS_DECOMP_SINGLE is not set -CONFIG_SQUASHFS_EMBEDDED=y -# CONFIG_SQUASHFS_FILE_CACHE is not set -CONFIG_SQUASHFS_FILE_DIRECT=y -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 -# CONFIG_SQUASHFS_LZ4 is not set -# CONFIG_SQUASHFS_LZO is not set -# CONFIG_SQUASHFS_XATTR is not set -CONFIG_SQUASHFS_XZ=y -# CONFIG_SQUASHFS_ZLIB is not set -# CONFIG_SQUASHFS_ZSTD is not set -# CONFIG_SRAM is not set -# CONFIG_SRF04 is not set -# CONFIG_SRF08 is not set -# CONFIG_SSB is not set -# CONFIG_SSB_DEBUG is not set -# CONFIG_SSB_DRIVER_GPIO is not set -# CONFIG_SSB_HOST_SOC is not set -# CONFIG_SSB_PCMCIAHOST is not set -CONFIG_SSB_POSSIBLE=y -# CONFIG_SSB_SDIOHOST is not set -# CONFIG_SSB_SILENT is not set -# CONFIG_SSFDC is not set -# CONFIG_STACKPROTECTOR is not set -# CONFIG_STACKPROTECTOR_STRONG is not set -# CONFIG_STACKTRACE is not set -CONFIG_STACKTRACE_SUPPORT=y -# CONFIG_STACK_TRACER is not set -# CONFIG_STACK_VALIDATION is not set -CONFIG_STAGING=y -# CONFIG_STAGING_BOARD is not set -# CONFIG_STAGING_GASKET_FRAMEWORK is not set -# CONFIG_STAGING_MEDIA is not set -CONFIG_STANDALONE=y -# CONFIG_STATIC_KEYS_SELFTEST is not set -# CONFIG_STATIC_USERMODEHELPER is not set -CONFIG_STDBINUTILS=y -# CONFIG_STE10XP is not set -# CONFIG_STE_MODEM_RPROC is not set -# CONFIG_STK3310 is not set -# CONFIG_STK8312 is not set -# CONFIG_STK8BA50 is not set -# CONFIG_STM is not set -# CONFIG_STMMAC_ETH is not set -# CONFIG_STMMAC_PCI is not set -# CONFIG_STMMAC_PLATFORM is not set -# CONFIG_STM_DUMMY is not set -# CONFIG_STM_SOURCE_CONSOLE is not set -CONFIG_STP=y -# CONFIG_STREAM_PARSER is not set -# CONFIG_STRICT_DEVMEM is not set -CONFIG_STRICT_KERNEL_RWX=y -CONFIG_STRICT_MODULE_RWX=y -# CONFIG_STRING_SELFTEST is not set -CONFIG_STRIP_ASM_SYMS=y -# CONFIG_STX104 is not set -# CONFIG_ST_UVIS25 is not set -# CONFIG_SUN4I_GPADC is not set -# CONFIG_SUN50I_DE2_BUS is not set -# CONFIG_SUN50I_ERRATUM_UNKNOWN1 is not set -# CONFIG_SUNDANCE is not set -# CONFIG_SUNGEM is not set -# CONFIG_SUNRPC is not set -# CONFIG_SUNRPC_DEBUG is not set -CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES=y -# CONFIG_SUNRPC_GSS is not set -# CONFIG_SUNXI_SRAM is not set -# CONFIG_SUN_PARTITION is not set -# CONFIG_SURFACE_3_BUTTON is not set -# CONFIG_SUSPEND is not set -# CONFIG_SUSPEND_SKIP_SYNC is not set -CONFIG_SWAP=y -# CONFIG_SWCONFIG is not set -# CONFIG_SWCONFIG_B53 is not set -# CONFIG_SWCONFIG_B53_MDIO_DRIVER is not set -# CONFIG_SWCONFIG_B53_MMAP_DRIVER is not set -# CONFIG_SWCONFIG_B53_SPI_DRIVER is not set -# CONFIG_SWCONFIG_B53_SRAB_DRIVER is not set -# CONFIG_SWCONFIG_LEDS is not set -# CONFIG_SW_SYNC is not set -# CONFIG_SX9310 is not set -# CONFIG_SX9500 is not set -# CONFIG_SXGBE_ETH is not set -CONFIG_SYMBOLIC_ERRNAME=y -# CONFIG_SYNCLINK_CS is not set -# CONFIG_SYNC_FILE is not set -# CONFIG_SYNOPSYS_DWC_ETH_QOS is not set -# CONFIG_SYNTH_EVENTS is not set -CONFIG_SYN_COOKIES=y -# CONFIG_SYSCON_REBOOT_MODE is not set -CONFIG_SYSCTL=y -# CONFIG_SYSCTL_SYSCALL is not set -CONFIG_SYSFS=y -# CONFIG_SYSFS_DEPRECATED is not set -# CONFIG_SYSFS_DEPRECATED_V2 is not set -# CONFIG_SYSFS_SYSCALL is not set -# CONFIG_SYSTEMPORT is not set -# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set -# CONFIG_SYSTEM_DATA_VERIFICATION is not set -# CONFIG_SYSTEM_TRUSTED_KEYRING is not set -CONFIG_SYSTEM_TRUSTED_KEYS="" -# CONFIG_SYSV68_PARTITION is not set -CONFIG_SYSVIPC=y -CONFIG_SYSVIPC_SYSCTL=y -# CONFIG_SYSV_FS is not set -# CONFIG_SYS_HYPERVISOR is not set -# CONFIG_T5403 is not set -# CONFIG_TARGET_CORE is not set -# CONFIG_TASKSTATS is not set -# CONFIG_TASKS_RCU is not set -# CONFIG_TASK_XACCT is not set -# CONFIG_TC35815 is not set -# CONFIG_TCG_ATMEL is not set -# CONFIG_TCG_CRB is not set -# CONFIG_TCG_FTPM_TEE is not set -# CONFIG_TCG_INFINEON is not set -# CONFIG_TCG_NSC is not set -# CONFIG_TCG_ST33_I2C is not set -# CONFIG_TCG_TIS is not set -# CONFIG_TCG_TIS_I2C_ATMEL is not set -# CONFIG_TCG_TIS_I2C_INFINEON is not set -# CONFIG_TCG_TIS_I2C_NUVOTON is not set -# CONFIG_TCG_TIS_SPI is not set -# CONFIG_TCG_TIS_ST33ZP24_I2C is not set -# CONFIG_TCG_TIS_ST33ZP24_SPI is not set -# CONFIG_TCG_TPM is not set -# CONFIG_TCG_VTPM_PROXY is not set -# CONFIG_TCG_XEN is not set -# CONFIG_TCIC is not set -CONFIG_TCP_CONG_ADVANCED=y -# CONFIG_TCP_CONG_BBR is not set -# CONFIG_TCP_CONG_BIC is not set -# CONFIG_TCP_CONG_CDG is not set -CONFIG_TCP_CONG_CUBIC=y -# CONFIG_TCP_CONG_DCTCP is not set -# CONFIG_TCP_CONG_HSTCP is not set -# CONFIG_TCP_CONG_HTCP is not set -# CONFIG_TCP_CONG_HYBLA is not set -# CONFIG_TCP_CONG_ILLINOIS is not set -# CONFIG_TCP_CONG_LP is not set -# CONFIG_TCP_CONG_NV is not set -# CONFIG_TCP_CONG_SCALABLE is not set -# CONFIG_TCP_CONG_VEGAS is not set -# CONFIG_TCP_CONG_VENO is not set -# CONFIG_TCP_CONG_WESTWOOD is not set -# CONFIG_TCP_CONG_YEAH is not set -# CONFIG_TCP_MD5SIG is not set -# CONFIG_TCS3414 is not set -# CONFIG_TCS3472 is not set -# CONFIG_TEE is not set -# CONFIG_TEGRA_AHB is not set -# CONFIG_TEGRA_HOST1X is not set -# CONFIG_TEHUTI is not set -# CONFIG_TERANETICS_PHY is not set -# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set -# CONFIG_TEST_BITFIELD is not set -# CONFIG_TEST_BITMAP is not set -# CONFIG_TEST_BITOPS is not set -# CONFIG_TEST_BLACKHOLE_DEV is not set -# CONFIG_TEST_BPF is not set -# CONFIG_TEST_FIRMWARE is not set -# CONFIG_TEST_FREE_PAGES is not set -# CONFIG_TEST_HASH is not set -# CONFIG_TEST_HEXDUMP is not set -# CONFIG_TEST_IDA is not set -# CONFIG_TEST_KASAN_MODULE is not set -# CONFIG_TEST_KMOD is not set -# CONFIG_TEST_KSTRTOX is not set -# CONFIG_TEST_LIST_SORT is not set -# CONFIG_TEST_LKM is not set -# CONFIG_TEST_LOCKUP is not set -# CONFIG_TEST_MEMCAT_P is not set -# CONFIG_TEST_MEMINIT is not set -# CONFIG_TEST_MIN_HEAP is not set -# CONFIG_TEST_OVERFLOW is not set -# CONFIG_TEST_POWER is not set -# CONFIG_TEST_PRINTF is not set -# CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_SORT is not set -# CONFIG_TEST_STACKINIT is not set -# CONFIG_TEST_STATIC_KEYS is not set -# CONFIG_TEST_STRING_HELPERS is not set -# CONFIG_TEST_STRSCPY is not set -# CONFIG_TEST_SYSCTL is not set -# CONFIG_TEST_UBSAN is not set -# CONFIG_TEST_UDELAY is not set -# CONFIG_TEST_USER_COPY is not set -# CONFIG_TEST_UUID is not set -# CONFIG_TEST_VMALLOC is not set -# CONFIG_TEST_XARRAY is not set -CONFIG_TEXTSEARCH=y -# CONFIG_TEXTSEARCH_BM is not set -# CONFIG_TEXTSEARCH_FSM is not set -# CONFIG_TEXTSEARCH_KMP is not set -# CONFIG_THERMAL is not set -# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set -# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set -# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set -# CONFIG_THERMAL_EMULATION is not set -# CONFIG_THERMAL_GOV_BANG_BANG is not set -# CONFIG_THERMAL_GOV_FAIR_SHARE is not set -# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set -# CONFIG_THERMAL_GOV_USER_SPACE is not set -# CONFIG_THERMAL_HWMON is not set -# CONFIG_THERMAL_MMIO is not set -# CONFIG_THERMAL_NETLINK is not set -# CONFIG_THERMAL_STATISTICS is not set -# CONFIG_THERMAL_WRITABLE_TRIPS is not set -# CONFIG_THINKPAD_ACPI is not set -CONFIG_THIN_ARCHIVES=y -# CONFIG_THRUSTMASTER_FF is not set -# CONFIG_THUMB2_KERNEL is not set -# CONFIG_THUNDERBOLT is not set -# CONFIG_THUNDER_NIC_BGX is not set -# CONFIG_THUNDER_NIC_PF is not set -# CONFIG_THUNDER_NIC_RGX is not set -# CONFIG_THUNDER_NIC_VF is not set -# CONFIG_TICK_CPU_ACCOUNTING is not set -CONFIG_TICK_ONESHOT=y -# CONFIG_TIFM_CORE is not set -# CONFIG_TIGON3 is not set -# CONFIG_TIMB_DMA is not set -CONFIG_TIMERFD=y -# CONFIG_TIMER_STATS is not set -# CONFIG_TIME_NS is not set -# CONFIG_TINYDRM_HX8357D is not set -# CONFIG_TINYDRM_ILI9225 is not set -# CONFIG_TINYDRM_ILI9341 is not set -# CONFIG_TINYDRM_ILI9486 is not set -# CONFIG_TINYDRM_MI0283QT is not set -# CONFIG_TINYDRM_REPAPER is not set -# CONFIG_TINYDRM_ST7586 is not set -# CONFIG_TINYDRM_ST7735R is not set -CONFIG_TINY_RCU=y -# CONFIG_TIPC is not set -# CONFIG_TI_ADC081C is not set -# CONFIG_TI_ADC0832 is not set -# CONFIG_TI_ADC084S021 is not set -# CONFIG_TI_ADC108S102 is not set -# CONFIG_TI_ADC12138 is not set -# CONFIG_TI_ADC128S052 is not set -# CONFIG_TI_ADC161S626 is not set -# CONFIG_TI_ADS1015 is not set -# CONFIG_TI_ADS124S08 is not set -# CONFIG_TI_ADS7950 is not set -# CONFIG_TI_ADS8344 is not set -# CONFIG_TI_ADS8688 is not set -# CONFIG_TI_AM335X_ADC is not set -# CONFIG_TI_CPSW is not set -# CONFIG_TI_CPSW_ALE is not set -# CONFIG_TI_CPSW_PHY_SEL is not set -# CONFIG_TI_CPTS is not set -# CONFIG_TI_DAC082S085 is not set -# CONFIG_TI_DAC5571 is not set -# CONFIG_TI_DAC7311 is not set -# CONFIG_TI_DAC7512 is not set -# CONFIG_TI_DAC7612 is not set -# CONFIG_TI_DAVINCI_CPDMA is not set -# CONFIG_TI_DAVINCI_MDIO is not set -# CONFIG_TI_ST is not set -# CONFIG_TI_SYSCON_RESET is not set -# CONFIG_TI_TLC4541 is not set -# CONFIG_TLAN is not set -# CONFIG_TLS is not set -# CONFIG_TMD_HERMES is not set -# CONFIG_TMP006 is not set -# CONFIG_TMP007 is not set -CONFIG_TMPFS=y -# CONFIG_TMPFS_INODE64 is not set -# CONFIG_TMPFS_POSIX_ACL is not set -CONFIG_TMPFS_XATTR=y -# CONFIG_TOPSTAR_LAPTOP is not set -# CONFIG_TORTURE_TEST is not set -# CONFIG_TOSHIBA_HAPS is not set -# CONFIG_TOUCHSCREEN_88PM860X is not set -# CONFIG_TOUCHSCREEN_AD7877 is not set -# CONFIG_TOUCHSCREEN_AD7879 is not set -# CONFIG_TOUCHSCREEN_AD7879_I2C is not set -# CONFIG_TOUCHSCREEN_AD7879_SPI is not set -# CONFIG_TOUCHSCREEN_ADC is not set -# CONFIG_TOUCHSCREEN_ADS7846 is not set -# CONFIG_TOUCHSCREEN_AR1021_I2C is not set -# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set -# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set -# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set -# CONFIG_TOUCHSCREEN_BU21013 is not set -# CONFIG_TOUCHSCREEN_BU21029 is not set -# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set -# CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set -# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set -# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set -# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set -# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set -# CONFIG_TOUCHSCREEN_CYTTSP4_I2C is not set -# CONFIG_TOUCHSCREEN_CYTTSP4_SPI is not set -# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set -# CONFIG_TOUCHSCREEN_CYTTSP_I2C is not set -# CONFIG_TOUCHSCREEN_CYTTSP_SPI is not set -# CONFIG_TOUCHSCREEN_DA9034 is not set -# CONFIG_TOUCHSCREEN_DA9052 is not set -# CONFIG_TOUCHSCREEN_DYNAPRO is not set -# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set -# CONFIG_TOUCHSCREEN_EETI is not set -# CONFIG_TOUCHSCREEN_EGALAX is not set -# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set -# CONFIG_TOUCHSCREEN_EKTF2127 is not set -# CONFIG_TOUCHSCREEN_ELAN is not set -# CONFIG_TOUCHSCREEN_ELO is not set -# CONFIG_TOUCHSCREEN_EXC3000 is not set -# CONFIG_TOUCHSCREEN_FUJITSU is not set -# CONFIG_TOUCHSCREEN_GOODIX is not set -# CONFIG_TOUCHSCREEN_GUNZE is not set -# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set -# CONFIG_TOUCHSCREEN_HIDEEP is not set -# CONFIG_TOUCHSCREEN_HP600 is not set -# CONFIG_TOUCHSCREEN_HP7XX is not set -# CONFIG_TOUCHSCREEN_HTCPEN is not set -# CONFIG_TOUCHSCREEN_ILI210X is not set -# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set -# CONFIG_TOUCHSCREEN_INEXIO is not set -# CONFIG_TOUCHSCREEN_IPAQ_MICRO is not set -# CONFIG_TOUCHSCREEN_IPROC is not set -# CONFIG_TOUCHSCREEN_IQS5XX is not set -# CONFIG_TOUCHSCREEN_LPC32XX is not set -# CONFIG_TOUCHSCREEN_MAX11801 is not set -# CONFIG_TOUCHSCREEN_MC13783 is not set -# CONFIG_TOUCHSCREEN_MCS5000 is not set -# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set -# CONFIG_TOUCHSCREEN_MIGOR is not set -# CONFIG_TOUCHSCREEN_MK712 is not set -# CONFIG_TOUCHSCREEN_MMS114 is not set -# CONFIG_TOUCHSCREEN_MTOUCH is not set -# CONFIG_TOUCHSCREEN_MX25 is not set -# CONFIG_TOUCHSCREEN_MXS_LRADC is not set -# CONFIG_TOUCHSCREEN_PCAP is not set -# CONFIG_TOUCHSCREEN_PENMOUNT is not set -# CONFIG_TOUCHSCREEN_PIXCIR is not set -# CONFIG_TOUCHSCREEN_PROPERTIES is not set -# CONFIG_TOUCHSCREEN_RASPBERRYPI_FW is not set -# CONFIG_TOUCHSCREEN_RM_TS is not set -# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set -# CONFIG_TOUCHSCREEN_RPI_FT5406 is not set -# CONFIG_TOUCHSCREEN_S3C2410 is not set -# CONFIG_TOUCHSCREEN_S6SY761 is not set -# CONFIG_TOUCHSCREEN_SILEAD is not set -# CONFIG_TOUCHSCREEN_SIS_I2C is not set -# CONFIG_TOUCHSCREEN_ST1232 is not set -# CONFIG_TOUCHSCREEN_STMFTS is not set -# CONFIG_TOUCHSCREEN_STMPE is not set -# CONFIG_TOUCHSCREEN_SUN4I is not set -# CONFIG_TOUCHSCREEN_SUR40 is not set -# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set -# CONFIG_TOUCHSCREEN_SX8654 is not set -# CONFIG_TOUCHSCREEN_TI_AM335X_TSC is not set -# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set -# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set -# CONFIG_TOUCHSCREEN_TOUCHWIN is not set -# CONFIG_TOUCHSCREEN_TPS6507X is not set -# CONFIG_TOUCHSCREEN_TS4800 is not set -# CONFIG_TOUCHSCREEN_TSC2004 is not set -# CONFIG_TOUCHSCREEN_TSC2005 is not set -# CONFIG_TOUCHSCREEN_TSC2007 is not set -# CONFIG_TOUCHSCREEN_TSC2007_IIO is not set -# CONFIG_TOUCHSCREEN_TSC200X_CORE is not set -# CONFIG_TOUCHSCREEN_TSC_SERIO is not set -# CONFIG_TOUCHSCREEN_UCB1400 is not set -# CONFIG_TOUCHSCREEN_USB_3M is not set -# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set -# CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set -# CONFIG_TOUCHSCREEN_USB_E2I is not set -# CONFIG_TOUCHSCREEN_USB_EASYTOUCH is not set -# CONFIG_TOUCHSCREEN_USB_EGALAX is not set -# CONFIG_TOUCHSCREEN_USB_ELO is not set -# CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set -# CONFIG_TOUCHSCREEN_USB_ETURBO is not set -# CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set -# CONFIG_TOUCHSCREEN_USB_GOTOP is not set -# CONFIG_TOUCHSCREEN_USB_GUNZE is not set -# CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set -# CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set -# CONFIG_TOUCHSCREEN_USB_ITM is not set -# CONFIG_TOUCHSCREEN_USB_JASTEC is not set -# CONFIG_TOUCHSCREEN_USB_NEXIO is not set -# CONFIG_TOUCHSCREEN_USB_PANJIT is not set -# CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set -# CONFIG_TOUCHSCREEN_W90X900 is not set -# CONFIG_TOUCHSCREEN_WACOM_I2C is not set -# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set -# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set -# CONFIG_TOUCHSCREEN_WM831X is not set -# CONFIG_TOUCHSCREEN_WM9705 is not set -# CONFIG_TOUCHSCREEN_WM9712 is not set -# CONFIG_TOUCHSCREEN_WM9713 is not set -# CONFIG_TOUCHSCREEN_WM97XX is not set -# CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE is not set -# CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE is not set -# CONFIG_TOUCHSCREEN_ZET6223 is not set -# CONFIG_TOUCHSCREEN_ZFORCE is not set -# CONFIG_TOUCHSCREEN_ZINITIX is not set -# CONFIG_TPL0102 is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS65010 is not set -# CONFIG_TPS6507X is not set -# CONFIG_TRACEPOINT_BENCHMARK is not set -# CONFIG_TRACER_SNAPSHOT is not set -# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set -# CONFIG_TRACE_BRANCH_PROFILING is not set -# CONFIG_TRACE_EVAL_MAP_FILE is not set -# CONFIG_TRACE_EVENT_INJECT is not set -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -# CONFIG_TRACE_SINK is not set -# CONFIG_TRACING_EVENTS_GPIO is not set -CONFIG_TRACING_SUPPORT=y -CONFIG_TRAD_SIGNALS=y -# CONFIG_TRANSPARENT_HUGEPAGE is not set -# CONFIG_TREE_RCU is not set -# CONFIG_TREE_RCU_TRACE is not set -# CONFIG_TRIM_UNUSED_KSYMS is not set -# CONFIG_TRUSTED_FOUNDATIONS is not set -# CONFIG_TRUSTED_KEYS is not set -# CONFIG_TSL2583 is not set -# CONFIG_TSL2772 is not set -# CONFIG_TSL2x7x is not set -# CONFIG_TSL4531 is not set -# CONFIG_TSYS01 is not set -# CONFIG_TSYS02D is not set -# CONFIG_TTPCI_EEPROM is not set -CONFIG_TTY=y -# CONFIG_TTY_PRINTK is not set -# CONFIG_TUN is not set -# CONFIG_TUN_VNET_CROSS_LE is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL4030_MADC is not set -# CONFIG_TWL6030_GPADC is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_TYPEC is not set -# CONFIG_TYPEC_TCPM is not set -# CONFIG_TYPEC_UCSI is not set -# CONFIG_TYPHOON is not set -# CONFIG_UACCESS_WITH_MEMCPY is not set -# CONFIG_UBIFS_ATIME_SUPPORT is not set -# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set -# CONFIG_UBIFS_FS_AUTHENTICATION is not set -# CONFIG_UBIFS_FS_ENCRYPTION is not set -CONFIG_UBIFS_FS_LZO=y -# CONFIG_UBIFS_FS_SECURITY is not set -CONFIG_UBIFS_FS_XATTR=y -CONFIG_UBIFS_FS_ZLIB=y -CONFIG_UBIFS_FS_ZSTD=y -# CONFIG_UBSAN is not set -CONFIG_UBSAN_ALIGNMENT=y -# CONFIG_UBSAN_MISC is not set -# CONFIG_UCB1400_CORE is not set -# CONFIG_UCSI is not set -# CONFIG_UDF_FS is not set -# CONFIG_UDMABUF is not set -CONFIG_UEVENT_HELPER=y -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -# CONFIG_UFS_FS is not set -# CONFIG_UHID is not set -CONFIG_UID16=y -# CONFIG_UIO is not set -# CONFIG_ULTRA is not set -# CONFIG_ULTRIX_PARTITION is not set -# CONFIG_UNICODE is not set -# CONFIG_UNISYSSPAR is not set -# CONFIG_UNISYS_VISORBUS is not set -CONFIG_UNIX=y -CONFIG_UNIX98_PTYS=y -# CONFIG_UNIXWARE_DISKLABEL is not set -# CONFIG_UNIX_DIAG is not set -CONFIG_UNIX_SCM=y -# CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_UNWINDER_FRAME_POINTER is not set -# CONFIG_UPROBES is not set -# CONFIG_UPROBE_EVENTS is not set -# CONFIG_US5182D is not set -# CONFIG_USB is not set -# CONFIG_USB4 is not set -# CONFIG_USBIP_CORE is not set -CONFIG_USBIP_VHCI_HC_PORTS=8 -CONFIG_USBIP_VHCI_NR_HCS=1 -# CONFIG_USBIP_VUDC is not set -# CONFIG_USBPCWATCHDOG is not set -# CONFIG_USB_ACM is not set -# CONFIG_USB_ADUTUX is not set -# CONFIG_USB_AIRSPY is not set -CONFIG_USB_ALI_M5632=y -# CONFIG_USB_AMD5536UDC is not set -CONFIG_USB_AN2720=y -# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set -# CONFIG_USB_APPLEDISPLAY is not set -CONFIG_USB_ARCH_HAS_HCD=y -CONFIG_USB_ARMLINUX=y -# CONFIG_USB_ATM is not set -CONFIG_USB_AUTOSUSPEND_DELAY=2 -# CONFIG_USB_BDC_UDC is not set -CONFIG_USB_BELKIN=y -# CONFIG_USB_C67X00_HCD is not set -# CONFIG_USB_CATC is not set -# CONFIG_USB_CDC_COMPOSITE is not set -# CONFIG_USB_CDNS3 is not set -# CONFIG_USB_CHAOSKEY is not set -# CONFIG_USB_CHIPIDEA is not set -# CONFIG_USB_CHIPIDEA_GENERIC is not set -# CONFIG_USB_CHIPIDEA_IMX is not set -# CONFIG_USB_CHIPIDEA_MSM is not set -# CONFIG_USB_CHIPIDEA_PCI is not set -# CONFIG_USB_CHIPIDEA_TEGRA is not set -# CONFIG_USB_CONFIGFS is not set -# CONFIG_USB_CONN_GPIO is not set -# CONFIG_USB_CXACRU is not set -# CONFIG_USB_CYPRESS_CY7C63 is not set -# CONFIG_USB_CYTHERM is not set -CONFIG_USB_DEFAULT_PERSIST=y -# CONFIG_USB_DSBR is not set -# CONFIG_USB_DUMMY_HCD is not set -# CONFIG_USB_DWC2 is not set -# CONFIG_USB_DWC2_DEBUG is not set -# CONFIG_USB_DWC2_DUAL_ROLE is not set -# CONFIG_USB_DWC2_HOST is not set -# CONFIG_USB_DWC2_PERIPHERAL is not set -# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set -# CONFIG_USB_DWC3 is not set -# CONFIG_USB_DWC3_EXYNOS is not set -# CONFIG_USB_DWC3_HAPS is not set -# CONFIG_USB_DWC3_KEYSTONE is not set -# CONFIG_USB_DWC3_OF_SIMPLE is not set -# CONFIG_USB_DWC3_PCI is not set -# CONFIG_USB_DWC3_QCOM is not set -# CONFIG_USB_DWC3_ULPI is not set -# CONFIG_USB_DYNAMIC_MINORS is not set -# CONFIG_USB_EG20T is not set -# CONFIG_USB_EHCI_ATH79 is not set -# CONFIG_USB_EHCI_FSL is not set -# CONFIG_USB_EHCI_HCD is not set -# CONFIG_USB_EHCI_HCD_AT91 is not set -# CONFIG_USB_EHCI_HCD_OMAP is not set -# CONFIG_USB_EHCI_HCD_PPC_OF is not set -# CONFIG_USB_EHCI_MSM is not set -# CONFIG_USB_EHCI_MV is not set -CONFIG_USB_EHCI_ROOT_HUB_TT=y -CONFIG_USB_EHCI_TT_NEWSCHED=y -# CONFIG_USB_EHSET_TEST_FIXTURE is not set -# CONFIG_USB_EMI26 is not set -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EPSON2888 is not set -# CONFIG_USB_ETH is not set -# CONFIG_USB_EZUSB_FX2 is not set -# CONFIG_USB_FEW_INIT_RETRIES is not set -# CONFIG_USB_FOTG210_HCD is not set -# CONFIG_USB_FOTG210_UDC is not set -# CONFIG_USB_FSL_USB2 is not set -# CONFIG_USB_FTDI_ELAN is not set -# CONFIG_USB_FUNCTIONFS is not set -# CONFIG_USB_FUSB300 is not set -# CONFIG_USB_GADGET is not set -# CONFIG_USB_GADGETFS is not set -# CONFIG_USB_GADGET_DEBUG is not set -# CONFIG_USB_GADGET_DEBUG_FILES is not set -# CONFIG_USB_GADGET_DEBUG_FS is not set -CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 -CONFIG_USB_GADGET_VBUS_DRAW=2 -# CONFIG_USB_GADGET_XILINX is not set -# CONFIG_USB_GL860 is not set -# CONFIG_USB_GOKU is not set -# CONFIG_USB_GPIO_VBUS is not set -# CONFIG_USB_GR_UDC is not set -# CONFIG_USB_GSPCA is not set -# CONFIG_USB_GSPCA_BENQ is not set -# CONFIG_USB_GSPCA_CONEX is not set -# CONFIG_USB_GSPCA_CPIA1 is not set -# CONFIG_USB_GSPCA_DTCS033 is not set -# CONFIG_USB_GSPCA_ETOMS is not set -# CONFIG_USB_GSPCA_FINEPIX is not set -# CONFIG_USB_GSPCA_JEILINJ is not set -# CONFIG_USB_GSPCA_JL2005BCD is not set -# CONFIG_USB_GSPCA_KINECT is not set -# CONFIG_USB_GSPCA_KONICA is not set -# CONFIG_USB_GSPCA_MARS is not set -# CONFIG_USB_GSPCA_MR97310A is not set -# CONFIG_USB_GSPCA_NW80X is not set -# CONFIG_USB_GSPCA_OV519 is not set -# CONFIG_USB_GSPCA_OV534 is not set -# CONFIG_USB_GSPCA_OV534_9 is not set -# CONFIG_USB_GSPCA_PAC207 is not set -# CONFIG_USB_GSPCA_PAC7302 is not set -# CONFIG_USB_GSPCA_PAC7311 is not set -# CONFIG_USB_GSPCA_SE401 is not set -# CONFIG_USB_GSPCA_SN9C2028 is not set -# CONFIG_USB_GSPCA_SN9C20X is not set -# CONFIG_USB_GSPCA_SONIXB is not set -# CONFIG_USB_GSPCA_SONIXJ is not set -# CONFIG_USB_GSPCA_SPCA1528 is not set -# CONFIG_USB_GSPCA_SPCA500 is not set -# CONFIG_USB_GSPCA_SPCA501 is not set -# CONFIG_USB_GSPCA_SPCA505 is not set -# CONFIG_USB_GSPCA_SPCA506 is not set -# CONFIG_USB_GSPCA_SPCA508 is not set -# CONFIG_USB_GSPCA_SPCA561 is not set -# CONFIG_USB_GSPCA_SQ905 is not set -# CONFIG_USB_GSPCA_SQ905C is not set -# CONFIG_USB_GSPCA_SQ930X is not set -# CONFIG_USB_GSPCA_STK014 is not set -# CONFIG_USB_GSPCA_STK1135 is not set -# CONFIG_USB_GSPCA_STV0680 is not set -# CONFIG_USB_GSPCA_SUNPLUS is not set -# CONFIG_USB_GSPCA_T613 is not set -# CONFIG_USB_GSPCA_TOPRO is not set -# CONFIG_USB_GSPCA_TOUPTEK is not set -# CONFIG_USB_GSPCA_TV8532 is not set -# CONFIG_USB_GSPCA_VC032X is not set -# CONFIG_USB_GSPCA_VICAM is not set -# CONFIG_USB_GSPCA_XIRLINK_CIT is not set -# CONFIG_USB_GSPCA_ZC3XX is not set -# CONFIG_USB_G_ACM_MS is not set -# CONFIG_USB_G_DBGP is not set -# CONFIG_USB_G_HID is not set -# CONFIG_USB_G_MULTI is not set -# CONFIG_USB_G_NCM is not set -# CONFIG_USB_G_NOKIA is not set -# CONFIG_USB_G_PRINTER is not set -# CONFIG_USB_G_SERIAL is not set -# CONFIG_USB_G_WEBCAM is not set -# CONFIG_USB_HACKRF is not set -# CONFIG_USB_HCD_TEST_MODE is not set -# CONFIG_USB_HID is not set -# CONFIG_USB_HIDDEV is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set -# CONFIG_USB_HSO is not set -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HWA_HCD is not set -# CONFIG_USB_IDMOUSE is not set -# CONFIG_USB_IMX21_HCD is not set -# CONFIG_USB_IOWARRIOR is not set -# CONFIG_USB_IPHETH is not set -# CONFIG_USB_ISIGHTFW is not set -# CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_ISP1301 is not set -# CONFIG_USB_ISP1362_HCD is not set -# CONFIG_USB_ISP1760 is not set -# CONFIG_USB_ISP1760_HCD is not set -# CONFIG_USB_KAWETH is not set -# CONFIG_USB_KBD is not set -# CONFIG_USB_KC2190 is not set -# CONFIG_USB_LAN78XX is not set -# CONFIG_USB_LCD is not set -# CONFIG_USB_LD is not set -# CONFIG_USB_LED is not set -# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set -# CONFIG_USB_LED_TRIG is not set -# CONFIG_USB_LEGOTOWER is not set -# CONFIG_USB_LGM_PHY is not set -# CONFIG_USB_LINK_LAYER_TEST is not set -# CONFIG_USB_M5602 is not set -# CONFIG_USB_M66592 is not set -# CONFIG_USB_MASS_STORAGE is not set -# CONFIG_USB_MAX3420_UDC is not set -# CONFIG_USB_MAX3421_HCD is not set -# CONFIG_USB_MDC800 is not set -# CONFIG_USB_MICROTEK is not set -# CONFIG_USB_MIDI_GADGET is not set -# CONFIG_USB_MON is not set -# CONFIG_USB_MOUSE is not set -# CONFIG_USB_MSI2500 is not set -# CONFIG_USB_MSM_OTG is not set -# CONFIG_USB_MTU3 is not set -# CONFIG_USB_MUSB_HDRC is not set -# CONFIG_USB_MV_U3D is not set -# CONFIG_USB_MV_UDC is not set -# CONFIG_USB_MXS_PHY is not set -# CONFIG_USB_NET2272 is not set -# CONFIG_USB_NET2280 is not set -# CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_NET_AX88179_178A is not set -# CONFIG_USB_NET_AX8817X is not set -# CONFIG_USB_NET_CDCETHER is not set -# CONFIG_USB_NET_CDC_EEM is not set -# CONFIG_USB_NET_CDC_MBIM is not set -# CONFIG_USB_NET_CDC_NCM is not set -# CONFIG_USB_NET_CDC_SUBSET is not set -# CONFIG_USB_NET_CH9200 is not set -# CONFIG_USB_NET_CX82310_ETH is not set -# CONFIG_USB_NET_DM9601 is not set -# CONFIG_USB_NET_DRIVERS is not set -# CONFIG_USB_NET_GL620A is not set -# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set -# CONFIG_USB_NET_INT51X1 is not set -# CONFIG_USB_NET_KALMIA is not set -# CONFIG_USB_NET_MCS7830 is not set -# CONFIG_USB_NET_NET1080 is not set -# CONFIG_USB_NET_PLUSB is not set -# CONFIG_USB_NET_QMI_WWAN is not set -# CONFIG_USB_NET_RNDIS_HOST is not set -# CONFIG_USB_NET_RNDIS_WLAN is not set -# CONFIG_USB_NET_SMSC75XX is not set -# CONFIG_USB_NET_SMSC95XX is not set -# CONFIG_USB_NET_SR9700 is not set -# CONFIG_USB_NET_SR9800 is not set -# CONFIG_USB_NET_ZAURUS is not set -# CONFIG_USB_OHCI_HCD is not set -# CONFIG_USB_OHCI_HCD_PCI is not set -# CONFIG_USB_OHCI_HCD_PPC_OF is not set -# CONFIG_USB_OHCI_HCD_PPC_OF_BE is not set -# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set -# CONFIG_USB_OHCI_HCD_SSB is not set -CONFIG_USB_OHCI_LITTLE_ENDIAN=y -# CONFIG_USB_OTG is not set -# CONFIG_USB_OTG_BLACKLIST_HUB is not set -# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set -# CONFIG_USB_OTG_FSM is not set -# CONFIG_USB_OTG_PRODUCTLIST is not set -# CONFIG_USB_OTG_WHITELIST is not set -# CONFIG_USB_OXU210HP_HCD is not set -# CONFIG_USB_PCI is not set -# CONFIG_USB_PEGASUS is not set -# CONFIG_USB_PHY is not set -# CONFIG_USB_PRINTER is not set -# CONFIG_USB_PWC_INPUT_EVDEV is not set -# CONFIG_USB_PXA27X is not set -# CONFIG_USB_R8A66597 is not set -# CONFIG_USB_R8A66597_HCD is not set -# CONFIG_USB_RAW_GADGET is not set -# CONFIG_USB_RCAR_PHY is not set -# CONFIG_USB_RENESAS_USBHS is not set -# CONFIG_USB_RIO500 is not set -# CONFIG_USB_ROLES_INTEL_XHCI is not set -# CONFIG_USB_ROLE_SWITCH is not set -# CONFIG_USB_RTL8150 is not set -# CONFIG_USB_RTL8152 is not set -# CONFIG_USB_S2255 is not set -# CONFIG_USB_SERIAL is not set -# CONFIG_USB_SERIAL_AIRCABLE is not set -# CONFIG_USB_SERIAL_ARK3116 is not set -# CONFIG_USB_SERIAL_BELKIN is not set -# CONFIG_USB_SERIAL_CH341 is not set -# CONFIG_USB_SERIAL_CP210X is not set -# CONFIG_USB_SERIAL_CYBERJACK is not set -# CONFIG_USB_SERIAL_CYPRESS_M8 is not set -# CONFIG_USB_SERIAL_DEBUG is not set -# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set -# CONFIG_USB_SERIAL_EDGEPORT is not set -# CONFIG_USB_SERIAL_EDGEPORT_TI is not set -# CONFIG_USB_SERIAL_EMPEG is not set -# CONFIG_USB_SERIAL_F81232 is not set -# CONFIG_USB_SERIAL_F8153X is not set -# CONFIG_USB_SERIAL_FTDI_SIO is not set -# CONFIG_USB_SERIAL_GARMIN is not set -CONFIG_USB_SERIAL_GENERIC=y -# CONFIG_USB_SERIAL_IPAQ is not set -# CONFIG_USB_SERIAL_IPW is not set -# CONFIG_USB_SERIAL_IR is not set -# CONFIG_USB_SERIAL_IUU is not set -# CONFIG_USB_SERIAL_KEYSPAN is not set -CONFIG_USB_SERIAL_KEYSPAN_MPR=y -# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set -CONFIG_USB_SERIAL_KEYSPAN_USA18X=y -CONFIG_USB_SERIAL_KEYSPAN_USA19=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y -CONFIG_USB_SERIAL_KEYSPAN_USA19W=y -CONFIG_USB_SERIAL_KEYSPAN_USA28=y -CONFIG_USB_SERIAL_KEYSPAN_USA28X=y -CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y -CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y -CONFIG_USB_SERIAL_KEYSPAN_USA49W=y -CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y -# CONFIG_USB_SERIAL_KLSI is not set -# CONFIG_USB_SERIAL_KOBIL_SCT is not set -# CONFIG_USB_SERIAL_MCT_U232 is not set -# CONFIG_USB_SERIAL_METRO is not set -# CONFIG_USB_SERIAL_MOS7715_PARPORT is not set -# CONFIG_USB_SERIAL_MOS7720 is not set -# CONFIG_USB_SERIAL_MOS7840 is not set -# CONFIG_USB_SERIAL_MXUPORT is not set -# CONFIG_USB_SERIAL_NAVMAN is not set -# CONFIG_USB_SERIAL_OMNINET is not set -# CONFIG_USB_SERIAL_OPTICON is not set -# CONFIG_USB_SERIAL_OPTION is not set -# CONFIG_USB_SERIAL_OTI6858 is not set -# CONFIG_USB_SERIAL_PL2303 is not set -# CONFIG_USB_SERIAL_QCAUX is not set -# CONFIG_USB_SERIAL_QT2 is not set -# CONFIG_USB_SERIAL_QUALCOMM is not set -# CONFIG_USB_SERIAL_SAFE is not set -CONFIG_USB_SERIAL_SAFE_PADDED=y -# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set -# CONFIG_USB_SERIAL_SIMPLE is not set -# CONFIG_USB_SERIAL_SPCP8X5 is not set -# CONFIG_USB_SERIAL_SSU100 is not set -# CONFIG_USB_SERIAL_SYMBOL is not set -# CONFIG_USB_SERIAL_TI is not set -# CONFIG_USB_SERIAL_UPD78F0730 is not set -# CONFIG_USB_SERIAL_VISOR is not set -# CONFIG_USB_SERIAL_WHITEHEAT is not set -# CONFIG_USB_SERIAL_WISHBONE is not set -# CONFIG_USB_SERIAL_XIRCOM is not set -# CONFIG_USB_SERIAL_XSENS_MT is not set -# CONFIG_USB_SEVSEG is not set -# CONFIG_USB_SIERRA_NET is not set -# CONFIG_USB_SISUSBVGA is not set -# CONFIG_USB_SL811_HCD is not set -# CONFIG_USB_SNP_UDC_PLAT is not set -# CONFIG_USB_SPEEDTOUCH is not set -# CONFIG_USB_STKWEBCAM is not set -# CONFIG_USB_STORAGE is not set -# CONFIG_USB_STORAGE_ALAUDA is not set -# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set -# CONFIG_USB_STORAGE_DATAFAB is not set -# CONFIG_USB_STORAGE_DEBUG is not set -# CONFIG_USB_STORAGE_ENE_UB6250 is not set -# CONFIG_USB_STORAGE_FREECOM is not set -# CONFIG_USB_STORAGE_ISD200 is not set -# CONFIG_USB_STORAGE_JUMPSHOT is not set -# CONFIG_USB_STORAGE_KARMA is not set -# CONFIG_USB_STORAGE_ONETOUCH is not set -# CONFIG_USB_STORAGE_REALTEK is not set -# CONFIG_USB_STORAGE_SDDR09 is not set -# CONFIG_USB_STORAGE_SDDR55 is not set -# CONFIG_USB_STORAGE_USBAT is not set -# CONFIG_USB_STV06XX is not set -# CONFIG_USB_SUPPORT is not set -# CONFIG_USB_SWITCH_FSA9480 is not set -# CONFIG_USB_TEST is not set -# CONFIG_USB_TMC is not set -# CONFIG_USB_TRANCEVIBRATOR is not set -# CONFIG_USB_UAS is not set -# CONFIG_USB_UEAGLEATM is not set -# CONFIG_USB_ULPI is not set -# CONFIG_USB_ULPI_BUS is not set -# CONFIG_USB_USBNET is not set -# CONFIG_USB_USS720 is not set -# CONFIG_USB_VIDEO_CLASS is not set -CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y -# CONFIG_USB_VL600 is not set -# CONFIG_USB_WDM is not set -# CONFIG_USB_WHCI_HCD is not set -# CONFIG_USB_WUSB is not set -# CONFIG_USB_WUSB_CBAF is not set -# CONFIG_USB_XHCI_DBGCAP is not set -# CONFIG_USB_XHCI_HCD is not set -# CONFIG_USB_XHCI_MVEBU is not set -# CONFIG_USB_XHCI_PCI_RENESAS is not set -# CONFIG_USB_XUSBATM is not set -# CONFIG_USB_YUREX is not set -# CONFIG_USB_ZD1201 is not set -# CONFIG_USB_ZERO is not set -# CONFIG_USB_ZR364XX is not set -# CONFIG_USELIB is not set -# CONFIG_USERFAULTFD is not set -# CONFIG_USERIO is not set -# CONFIG_USE_OF is not set -# CONFIG_UTS_NS is not set -# CONFIG_UWB is not set -# CONFIG_U_SERIAL_CONSOLE is not set -# CONFIG_V4L_MEM2MEM_DRIVERS is not set -# CONFIG_V4L_PLATFORM_DRIVERS is not set -# CONFIG_V4L_TEST_DRIVERS is not set -# CONFIG_VALIDATE_FS_PARSER is not set -# CONFIG_VBOXGUEST is not set -# CONFIG_VCNL3020 is not set -# CONFIG_VCNL4000 is not set -# CONFIG_VCNL4035 is not set -# CONFIG_VDPA is not set -CONFIG_VDSO=y -# CONFIG_VEML6030 is not set -# CONFIG_VEML6070 is not set -# CONFIG_VETH is not set -# CONFIG_VEXPRESS_CONFIG is not set -# CONFIG_VF610_ADC is not set -# CONFIG_VF610_DAC is not set -# CONFIG_VFAT_FS is not set -# CONFIG_VFIO is not set -# CONFIG_VGASTATE is not set -# CONFIG_VGA_ARB is not set -# CONFIG_VGA_SWITCHEROO is not set -# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set -CONFIG_VHOST_MENU=y -# CONFIG_VHOST_NET is not set -# CONFIG_VHOST_VSOCK is not set -# CONFIG_VIA_RHINE is not set -# CONFIG_VIA_VELOCITY is not set -# CONFIG_VIDEO_AD5820 is not set -# CONFIG_VIDEO_AD9389B is not set -# CONFIG_VIDEO_ADP1653 is not set -# CONFIG_VIDEO_ADV7170 is not set -# CONFIG_VIDEO_ADV7175 is not set -# CONFIG_VIDEO_ADV7180 is not set -# CONFIG_VIDEO_ADV7183 is not set -# CONFIG_VIDEO_ADV7343 is not set -# CONFIG_VIDEO_ADV7393 is not set -# CONFIG_VIDEO_ADV748X is not set -# CONFIG_VIDEO_ADV7511 is not set -# CONFIG_VIDEO_ADV7604 is not set -# CONFIG_VIDEO_ADV7842 is not set -# CONFIG_VIDEO_ADV_DEBUG is not set -# CONFIG_VIDEO_AK7375 is not set -# CONFIG_VIDEO_AK881X is not set -# CONFIG_VIDEO_AM437X_VPFE is not set -# CONFIG_VIDEO_ASPEED is not set -# CONFIG_VIDEO_ATMEL_ISC is not set -# CONFIG_VIDEO_ATMEL_ISI is not set -# CONFIG_VIDEO_AU0828 is not set -# CONFIG_VIDEO_BT819 is not set -# CONFIG_VIDEO_BT848 is not set -# CONFIG_VIDEO_BT856 is not set -# CONFIG_VIDEO_BT866 is not set -# CONFIG_VIDEO_CADENCE is not set -# CONFIG_VIDEO_CAFE_CCIC is not set -# CONFIG_VIDEO_CS3308 is not set -# CONFIG_VIDEO_CS5345 is not set -# CONFIG_VIDEO_CS53L32A is not set -# CONFIG_VIDEO_CX231XX is not set -# CONFIG_VIDEO_CX2341X is not set -# CONFIG_VIDEO_CX25840 is not set -# CONFIG_VIDEO_CX88 is not set -# CONFIG_VIDEO_DEV is not set -# CONFIG_VIDEO_DM6446_CCDC is not set -# CONFIG_VIDEO_DT3155 is not set -# CONFIG_VIDEO_DW9714 is not set -# CONFIG_VIDEO_DW9768 is not set -# CONFIG_VIDEO_DW9807_VCM is not set -# CONFIG_VIDEO_EM28XX is not set -# CONFIG_VIDEO_ET8EK8 is not set -# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set -# CONFIG_VIDEO_GO7007 is not set -# CONFIG_VIDEO_GS1662 is not set -# CONFIG_VIDEO_HDPVR is not set -# CONFIG_VIDEO_HEXIUM_GEMINI is not set -# CONFIG_VIDEO_HEXIUM_ORION is not set -# CONFIG_VIDEO_HI556 is not set -# CONFIG_VIDEO_I2C is not set -# CONFIG_VIDEO_IMX214 is not set -# CONFIG_VIDEO_IMX219 is not set -# CONFIG_VIDEO_IMX258 is not set -# CONFIG_VIDEO_IMX274 is not set -# CONFIG_VIDEO_IMX290 is not set -# CONFIG_VIDEO_IMX319 is not set -# CONFIG_VIDEO_IMX355 is not set -# CONFIG_VIDEO_IMX477 is not set -# CONFIG_VIDEO_IRS1125 is not set -# CONFIG_VIDEO_IR_I2C is not set -# CONFIG_VIDEO_IVTV is not set -# CONFIG_VIDEO_KS0127 is not set -# CONFIG_VIDEO_LM3560 is not set -# CONFIG_VIDEO_LM3646 is not set -# CONFIG_VIDEO_M52790 is not set -# CONFIG_VIDEO_M5MOLS is not set -# CONFIG_VIDEO_MAX9286 is not set -# CONFIG_VIDEO_ML86V7667 is not set -# CONFIG_VIDEO_MSP3400 is not set -# CONFIG_VIDEO_MT9M001 is not set -# CONFIG_VIDEO_MT9M032 is not set -# CONFIG_VIDEO_MT9M111 is not set -# CONFIG_VIDEO_MT9P031 is not set -# CONFIG_VIDEO_MT9T001 is not set -# CONFIG_VIDEO_MT9T112 is not set -# CONFIG_VIDEO_MT9V011 is not set -# CONFIG_VIDEO_MT9V032 is not set -# CONFIG_VIDEO_MT9V111 is not set -# CONFIG_VIDEO_MUX is not set -# CONFIG_VIDEO_MXB is not set -# CONFIG_VIDEO_NOON010PC30 is not set -# CONFIG_VIDEO_OMAP2_VOUT is not set -# CONFIG_VIDEO_OV13858 is not set -# CONFIG_VIDEO_OV2640 is not set -# CONFIG_VIDEO_OV2659 is not set -# CONFIG_VIDEO_OV2680 is not set -# CONFIG_VIDEO_OV2685 is not set -# CONFIG_VIDEO_OV2740 is not set -# CONFIG_VIDEO_OV5640 is not set -# CONFIG_VIDEO_OV5645 is not set -# CONFIG_VIDEO_OV5647 is not set -# CONFIG_VIDEO_OV5670 is not set -# CONFIG_VIDEO_OV5675 is not set -# CONFIG_VIDEO_OV5695 is not set -# CONFIG_VIDEO_OV6650 is not set -# CONFIG_VIDEO_OV7251 is not set -# CONFIG_VIDEO_OV7640 is not set -# CONFIG_VIDEO_OV7670 is not set -# CONFIG_VIDEO_OV772X is not set -# CONFIG_VIDEO_OV7740 is not set -# CONFIG_VIDEO_OV8856 is not set -# CONFIG_VIDEO_OV9281 is not set -# CONFIG_VIDEO_OV9640 is not set -# CONFIG_VIDEO_OV9650 is not set -# CONFIG_VIDEO_PVRUSB2 is not set -# CONFIG_VIDEO_RDACM20 is not set -# CONFIG_VIDEO_RJ54N1 is not set -# CONFIG_VIDEO_S5C73M3 is not set -# CONFIG_VIDEO_S5K4ECGX is not set -# CONFIG_VIDEO_S5K5BAF is not set -# CONFIG_VIDEO_S5K6A3 is not set -# CONFIG_VIDEO_S5K6AA is not set -# CONFIG_VIDEO_SAA6588 is not set -# CONFIG_VIDEO_SAA6752HS is not set -# CONFIG_VIDEO_SAA7110 is not set -# CONFIG_VIDEO_SAA711X is not set -# CONFIG_VIDEO_SAA7127 is not set -# CONFIG_VIDEO_SAA7134 is not set -# CONFIG_VIDEO_SAA717X is not set -# CONFIG_VIDEO_SAA7185 is not set -# CONFIG_VIDEO_SH_MOBILE_CEU is not set -# CONFIG_VIDEO_SMIAPP is not set -# CONFIG_VIDEO_SONY_BTF_MPX is not set -# CONFIG_VIDEO_SR030PC30 is not set -# CONFIG_VIDEO_STK1160_COMMON is not set -# CONFIG_VIDEO_ST_MIPID02 is not set -# CONFIG_VIDEO_TC358743 is not set -# CONFIG_VIDEO_TDA1997X is not set -# CONFIG_VIDEO_TDA7432 is not set -# CONFIG_VIDEO_TDA9840 is not set -# CONFIG_VIDEO_TEA6415C is not set -# CONFIG_VIDEO_TEA6420 is not set -# CONFIG_VIDEO_THS7303 is not set -# CONFIG_VIDEO_THS8200 is not set -# CONFIG_VIDEO_TIMBERDALE is not set -# CONFIG_VIDEO_TLV320AIC23B is not set -# CONFIG_VIDEO_TM6000 is not set -# CONFIG_VIDEO_TVAUDIO is not set -# CONFIG_VIDEO_TVP514X is not set -# CONFIG_VIDEO_TVP5150 is not set -# CONFIG_VIDEO_TVP7002 is not set -# CONFIG_VIDEO_TW2804 is not set -# CONFIG_VIDEO_TW9903 is not set -# CONFIG_VIDEO_TW9906 is not set -# CONFIG_VIDEO_TW9910 is not set -# CONFIG_VIDEO_UDA1342 is not set -# CONFIG_VIDEO_UPD64031A is not set -# CONFIG_VIDEO_UPD64083 is not set -# CONFIG_VIDEO_USBTV is not set -# CONFIG_VIDEO_USBVISION is not set -# CONFIG_VIDEO_V4L2 is not set -# CONFIG_VIDEO_VP27SMPX is not set -# CONFIG_VIDEO_VPX3220 is not set -# CONFIG_VIDEO_VS6624 is not set -# CONFIG_VIDEO_WM8739 is not set -# CONFIG_VIDEO_WM8775 is not set -# CONFIG_VIDEO_XILINX is not set -# CONFIG_VIDEO_ZORAN is not set -# CONFIG_VIRTIO_BALLOON is not set -# CONFIG_VIRTIO_BLK_SCSI is not set -# CONFIG_VIRTIO_CONSOLE is not set -# CONFIG_VIRTIO_FS is not set -# CONFIG_VIRTIO_INPUT is not set -CONFIG_VIRTIO_MENU=y -# CONFIG_VIRTIO_MMIO is not set -# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set -# CONFIG_VIRTIO_PCI is not set -# CONFIG_VIRTUALIZATION is not set -# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set -# CONFIG_VIRT_DRIVERS is not set -CONFIG_VIRT_TO_BUS=y -# CONFIG_VITESSE_PHY is not set -# CONFIG_VL53L0X_I2C is not set -# CONFIG_VL6180 is not set -CONFIG_VLAN_8021Q=y -# CONFIG_VLAN_8021Q_GVRP is not set -# CONFIG_VLAN_8021Q_MVRP is not set -# CONFIG_VME_BUS is not set -# CONFIG_VMSPLIT_1G is not set -# CONFIG_VMSPLIT_2G is not set -# CONFIG_VMSPLIT_2G_OPT is not set -CONFIG_VMSPLIT_3G=y -# CONFIG_VMSPLIT_3G_OPT is not set -# CONFIG_VMWARE_PVSCSI is not set -# CONFIG_VMXNET3 is not set -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_VOP_BUS is not set -# CONFIG_VORTEX is not set -# CONFIG_VSOCKETS is not set -# CONFIG_VSOCKETS_DIAG is not set -# CONFIG_VT is not set -# CONFIG_VT6655 is not set -# CONFIG_VT6656 is not set -# CONFIG_VXFS_FS is not set -# CONFIG_VXGE is not set -# CONFIG_VXLAN is not set -# CONFIG_VZ89X is not set -# CONFIG_W1 is not set -# CONFIG_W1_CON is not set -# CONFIG_W1_MASTER_DS1WM is not set -# CONFIG_W1_MASTER_DS2482 is not set -# CONFIG_W1_MASTER_DS2490 is not set -# CONFIG_W1_MASTER_GPIO is not set -# CONFIG_W1_MASTER_MATROX is not set -# CONFIG_W1_MASTER_SGI is not set -# CONFIG_W1_SLAVE_DS2405 is not set -# CONFIG_W1_SLAVE_DS2406 is not set -# CONFIG_W1_SLAVE_DS2408 is not set -# CONFIG_W1_SLAVE_DS2413 is not set -# CONFIG_W1_SLAVE_DS2423 is not set -# CONFIG_W1_SLAVE_DS2430 is not set -# CONFIG_W1_SLAVE_DS2431 is not set -# CONFIG_W1_SLAVE_DS2433 is not set -# CONFIG_W1_SLAVE_DS2438 is not set -# CONFIG_W1_SLAVE_DS250X is not set -# CONFIG_W1_SLAVE_DS2780 is not set -# CONFIG_W1_SLAVE_DS2781 is not set -# CONFIG_W1_SLAVE_DS2805 is not set -# CONFIG_W1_SLAVE_DS28E04 is not set -# CONFIG_W1_SLAVE_DS28E17 is not set -# CONFIG_W1_SLAVE_SMEM is not set -# CONFIG_W1_SLAVE_THERM is not set -# CONFIG_W83627HF_WDT is not set -# CONFIG_W83877F_WDT is not set -# CONFIG_W83977F_WDT is not set -# CONFIG_WAN is not set -# CONFIG_WANXL is not set -# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set -CONFIG_WATCHDOG=y -# CONFIG_WATCHDOG_CORE is not set -CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y -# CONFIG_WATCHDOG_NOWAYOUT is not set -CONFIG_WATCHDOG_OPEN_TIMEOUT=0 -# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set -# CONFIG_WATCHDOG_SYSFS is not set -# CONFIG_WATCH_QUEUE is not set -# CONFIG_WD80x3 is not set -# CONFIG_WDAT_WDT is not set -# CONFIG_WDTPCI is not set -CONFIG_WEXT_CORE=y -CONFIG_WEXT_PRIV=y -CONFIG_WEXT_PROC=y -CONFIG_WEXT_SPY=y -CONFIG_WILINK_PLATFORM_DATA=y -# CONFIG_WIMAX is not set -# CONFIG_WIREGUARD is not set -CONFIG_WIRELESS=y -CONFIG_WIRELESS_EXT=y -# CONFIG_WIRELESS_WDS is not set -# CONFIG_WIZNET_W5100 is not set -# CONFIG_WIZNET_W5300 is not set -# CONFIG_WL1251 is not set -# CONFIG_WL12XX is not set -# CONFIG_WL18XX is not set -CONFIG_WLAN=y -# CONFIG_WLAN_VENDOR_ADMTEK is not set -# CONFIG_WLAN_VENDOR_ATH is not set -# CONFIG_WLAN_VENDOR_ATMEL is not set -# CONFIG_WLAN_VENDOR_BROADCOM is not set -# CONFIG_WLAN_VENDOR_CISCO is not set -# CONFIG_WLAN_VENDOR_INTEL is not set -# CONFIG_WLAN_VENDOR_INTERSIL is not set -# CONFIG_WLAN_VENDOR_MARVELL is not set -# CONFIG_WLAN_VENDOR_MEDIATEK is not set -# CONFIG_WLAN_VENDOR_MICROCHIP is not set -# CONFIG_WLAN_VENDOR_QUANTENNA is not set -# CONFIG_WLAN_VENDOR_RALINK is not set -# CONFIG_WLAN_VENDOR_REALTEK is not set -# CONFIG_WLAN_VENDOR_RSI is not set -# CONFIG_WLAN_VENDOR_ST is not set -# CONFIG_WLAN_VENDOR_TI is not set -# CONFIG_WLAN_VENDOR_ZYDAS is not set -# CONFIG_WLCORE is not set -CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y -# CONFIG_WQ_WATCHDOG is not set -# CONFIG_WW_MUTEX_SELFTEST is not set -# CONFIG_X25 is not set -# CONFIG_X509_CERTIFICATE_PARSER is not set -# CONFIG_X86_PKG_TEMP_THERMAL is not set -CONFIG_X86_SYSFB=y -# CONFIG_XDP_SOCKETS is not set -# CONFIG_XEN is not set -# CONFIG_XEN_GRANT_DMA_ALLOC is not set -# CONFIG_XEN_PVCALLS_FRONTEND is not set -CONFIG_XEN_SCRUB_PAGES_DEFAULT=y -CONFIG_XFRM=y -# CONFIG_XFRM_INTERFACE is not set -# CONFIG_XFRM_IPCOMP is not set -# CONFIG_XFRM_MIGRATE is not set -# CONFIG_XFRM_STATISTICS is not set -# CONFIG_XFRM_SUB_POLICY is not set -# CONFIG_XFRM_USER is not set -# CONFIG_XFS_DEBUG is not set -# CONFIG_XFS_FS is not set -# CONFIG_XFS_ONLINE_SCRUB is not set -# CONFIG_XFS_POSIX_ACL is not set -# CONFIG_XFS_QUOTA is not set -# CONFIG_XFS_RT is not set -# CONFIG_XFS_SUPPORT_V4 is not set -# CONFIG_XFS_WARN is not set -# CONFIG_XILINX_AXI_EMAC is not set -# CONFIG_XILINX_DMA is not set -# CONFIG_XILINX_EMACLITE is not set -# CONFIG_XILINX_GMII2RGMII is not set -# CONFIG_XILINX_LL_TEMAC is not set -# CONFIG_XILINX_SDFEC is not set -# CONFIG_XILINX_VCU is not set -# CONFIG_XILINX_WATCHDOG is not set -# CONFIG_XILINX_XADC is not set -# CONFIG_XILINX_ZYNQMP_DMA is not set -# CONFIG_XILINX_ZYNQMP_DPDMA is not set -# CONFIG_XILLYBUS is not set -# CONFIG_XIL_AXIS_FIFO is not set -# CONFIG_XIP_KERNEL is not set -# CONFIG_XMON is not set -CONFIG_XZ_DEC=y -# CONFIG_XZ_DEC_ARM is not set -# CONFIG_XZ_DEC_ARMTHUMB is not set -# CONFIG_XZ_DEC_BCJ is not set -# CONFIG_XZ_DEC_IA64 is not set -# CONFIG_XZ_DEC_POWERPC is not set -# CONFIG_XZ_DEC_SPARC is not set -# CONFIG_XZ_DEC_TEST is not set -# CONFIG_XZ_DEC_X86 is not set -# CONFIG_YAM is not set -# CONFIG_YELLOWFIN is not set -# CONFIG_YENTA is not set -# CONFIG_YENTA_O2 is not set -# CONFIG_YENTA_RICOH is not set -# CONFIG_YENTA_TI is not set -# CONFIG_YENTA_TOSHIBA is not set -# CONFIG_ZBUD is not set -# CONFIG_ZD1211RW is not set -# CONFIG_ZD1211RW_DEBUG is not set -# CONFIG_ZEROPLUS_FF is not set -# CONFIG_ZIIRAVE_WATCHDOG is not set -# CONFIG_ZISOFS is not set -# CONFIG_ZLIB_DEFLATE is not set -# CONFIG_ZLIB_INFLATE is not set -CONFIG_ZONE_DMA=y -# CONFIG_ZOPT2201 is not set -# CONFIG_ZPA2326 is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZRAM is not set -# CONFIG_ZRAM_MEMORY_TRACKING is not set -# CONFIG_ZSMALLOC is not set -# CONFIG_ZX_TDM is not set diff --git a/target/linux/generic/config-5.15 b/target/linux/generic/config-5.15 new file mode 100644 index 0000000000..214a1e6ecd --- /dev/null +++ b/target/linux/generic/config-5.15 @@ -0,0 +1,7599 @@ +# CONFIG_104_QUAD_8 is not set +CONFIG_32BIT=y +CONFIG_64BIT_TIME=y +# CONFIG_6LOWPAN is not set +# CONFIG_6LOWPAN_DEBUGFS is not set +# CONFIG_6PACK is not set +# CONFIG_8139CP is not set +# CONFIG_8139TOO is not set +# CONFIG_9P_FS is not set +# CONFIG_AB3100_CORE is not set +# CONFIG_AB8500_CORE is not set +# CONFIG_ABP060MG is not set +# CONFIG_ABX500_CORE is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_ACENIC is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_ACORN_PARTITION is not set +# CONFIG_ACPI_ALS is not set +# CONFIG_ACPI_APEI is not set +# CONFIG_ACPI_APEI_PCIEAER is not set +# CONFIG_ACPI_BUTTON is not set +# CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_CUSTOM_METHOD is not set +# CONFIG_ACPI_EXTLOG is not set +# CONFIG_ACPI_HED is not set +# CONFIG_ACPI_NFIT is not set +# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set +# CONFIG_ACPI_TABLE_UPGRADE is not set +# CONFIG_ACPI_VIDEO is not set +# CONFIG_AD2S1200 is not set +# CONFIG_AD2S1210 is not set +# CONFIG_AD2S90 is not set +# CONFIG_AD5064 is not set +# CONFIG_AD5110 is not set +# CONFIG_AD525X_DPOT is not set +# CONFIG_AD5272 is not set +# CONFIG_AD5360 is not set +# CONFIG_AD5380 is not set +# CONFIG_AD5421 is not set +# CONFIG_AD5446 is not set +# CONFIG_AD5449 is not set +# CONFIG_AD5504 is not set +# CONFIG_AD5592R is not set +# CONFIG_AD5593R is not set +# CONFIG_AD5624R_SPI is not set +# CONFIG_AD5686 is not set +# CONFIG_AD5686_SPI is not set +# CONFIG_AD5696_I2C is not set +# CONFIG_AD5755 is not set +# CONFIG_AD5758 is not set +# CONFIG_AD5761 is not set +# CONFIG_AD5764 is not set +# CONFIG_AD5766 is not set +# CONFIG_AD5770R is not set +# CONFIG_AD5791 is not set +# CONFIG_AD5933 is not set +# CONFIG_AD7091R5 is not set +# CONFIG_AD7124 is not set +# CONFIG_AD7150 is not set +# CONFIG_AD7152 is not set +# CONFIG_AD7192 is not set +# CONFIG_AD7266 is not set +# CONFIG_AD7280 is not set +# CONFIG_AD7291 is not set +# CONFIG_AD7292 is not set +# CONFIG_AD7298 is not set +# CONFIG_AD7303 is not set +# CONFIG_AD7476 is not set +# CONFIG_AD7606 is not set +# CONFIG_AD7606_IFACE_PARALLEL is not set +# CONFIG_AD7606_IFACE_SPI is not set +# CONFIG_AD7746 is not set +# CONFIG_AD7766 is not set +# CONFIG_AD7768_1 is not set +# CONFIG_AD7780 is not set +# CONFIG_AD7791 is not set +# CONFIG_AD7793 is not set +# CONFIG_AD7816 is not set +# CONFIG_AD7887 is not set +# CONFIG_AD7923 is not set +# CONFIG_AD7949 is not set +# CONFIG_AD799X is not set +# CONFIG_AD8366 is not set +# CONFIG_AD8801 is not set +# CONFIG_AD9467 is not set +# CONFIG_AD9523 is not set +# CONFIG_AD9832 is not set +# CONFIG_AD9834 is not set +# CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_ADE7854 is not set +# CONFIG_ADF4350 is not set +# CONFIG_ADF4371 is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADIN_PHY is not set +# CONFIG_ADIS16080 is not set +# CONFIG_ADIS16130 is not set +# CONFIG_ADIS16136 is not set +# CONFIG_ADIS16201 is not set +# CONFIG_ADIS16203 is not set +# CONFIG_ADIS16209 is not set +# CONFIG_ADIS16240 is not set +# CONFIG_ADIS16260 is not set +# CONFIG_ADIS16400 is not set +# CONFIG_ADIS16460 is not set +# CONFIG_ADIS16475 is not set +# CONFIG_ADIS16480 is not set +# CONFIG_ADI_AXI_ADC is not set +# CONFIG_ADJD_S311 is not set +# CONFIG_ADM6996_PHY is not set +# CONFIG_ADM8211 is not set +# CONFIG_ADT7316 is not set +# CONFIG_ADUX1020 is not set +CONFIG_ADVISE_SYSCALLS=y +# CONFIG_ADXL345_I2C is not set +# CONFIG_ADXL345_SPI is not set +# CONFIG_ADXL372_I2C is not set +# CONFIG_ADXL372_SPI is not set +# CONFIG_ADXRS290 is not set +# CONFIG_ADXRS450 is not set +CONFIG_AEABI=y +# CONFIG_AFE4403 is not set +# CONFIG_AFE4404 is not set +# CONFIG_AFFS_FS is not set +# CONFIG_AFS_DEBUG_CURSOR is not set +# CONFIG_AFS_FS is not set +# CONFIG_AF_KCM is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_RXRPC_INJECT_LOSS is not set +# CONFIG_AF_RXRPC_IPV6 is not set +CONFIG_AF_UNIX_OOB=y +# CONFIG_AGP is not set +# CONFIG_AHCI_BRCM is not set +# CONFIG_AHCI_CEVA is not set +# CONFIG_AHCI_IMX is not set +# CONFIG_AHCI_MVEBU is not set +# CONFIG_AHCI_QORIQ is not set +# CONFIG_AHCI_XGENE is not set +CONFIG_AIO=y +# CONFIG_AIRO is not set +# CONFIG_AIRO_CS is not set +# CONFIG_AIX_PARTITION is not set +# CONFIG_AK09911 is not set +# CONFIG_AK8974 is not set +# CONFIG_AK8975 is not set +# CONFIG_AL3010 is not set +# CONFIG_AL3320A is not set +# CONFIG_ALIM7101_WDT is not set +CONFIG_ALLOW_DEV_COREDUMP=y +# CONFIG_ALTERA_MBOX is not set +# CONFIG_ALTERA_MSGDMA is not set +# CONFIG_ALTERA_STAPL is not set +# CONFIG_ALTERA_TSE is not set +# CONFIG_ALX is not set +# CONFIG_AL_FIC is not set +# CONFIG_AM2315 is not set +# CONFIG_AM335X_PHY_USB is not set +# CONFIG_AMBA_PL08X is not set +# CONFIG_AMD8111_ETH is not set +# CONFIG_AMD_MEM_ENCRYPT is not set +# CONFIG_AMD_PHY is not set +# CONFIG_AMD_XGBE is not set +# CONFIG_AMD_XGBE_HAVE_ECC is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_AMILO_RFKILL is not set +# CONFIG_ANDROID is not set +CONFIG_ANON_INODES=y +# CONFIG_APDS9300 is not set +# CONFIG_APDS9802ALS is not set +# CONFIG_APDS9960 is not set +# CONFIG_APM8018X is not set +# CONFIG_APM_EMULATION is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_APPLE_MFI_FASTCHARGE is not set +# CONFIG_APPLE_PROPERTIES is not set +# CONFIG_APPLICOM is not set +# CONFIG_AQTION is not set +# CONFIG_AQUANTIA_PHY is not set +# CONFIG_AR5523 is not set +# CONFIG_AR7 is not set +# CONFIG_AR8216_PHY is not set +# CONFIG_AR8216_PHY_LEDS is not set +# CONFIG_ARCH_ACTIONS is not set +# CONFIG_ARCH_AGILEX is not set +# CONFIG_ARCH_ALPINE is not set +# CONFIG_ARCH_APPLE is not set +# CONFIG_ARCH_ARTPEC is not set +# CONFIG_ARCH_ASPEED is not set +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_AXXIA is not set +# CONFIG_ARCH_BCM is not set +# CONFIG_ARCH_BCM2835 is not set +# CONFIG_ARCH_BCM4908 is not set +# CONFIG_ARCH_BCM_21664 is not set +# CONFIG_ARCH_BCM_23550 is not set +# CONFIG_ARCH_BCM_281XX is not set +# CONFIG_ARCH_BCM_5301X is not set +# CONFIG_ARCH_BCM_53573 is not set +# CONFIG_ARCH_BCM_63XX is not set +# CONFIG_ARCH_BCM_CYGNUS is not set +# CONFIG_ARCH_BCM_IPROC is not set +# CONFIG_ARCH_BCM_NSP is not set +# CONFIG_ARCH_BERLIN is not set +CONFIG_ARCH_BINFMT_ELF_STATE=y +# CONFIG_ARCH_BITMAIN is not set +# CONFIG_ARCH_BRCMSTB is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CNS3XXX is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_DIGICOLOR is not set +# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set +# CONFIG_ARCH_DOVE is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_EXYNOS is not set +CONFIG_ARCH_FLATMEM_ENABLE=y +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_GEMINI is not set +# CONFIG_ARCH_HI3xxx is not set +# CONFIG_ARCH_HIGHBANK is not set +# CONFIG_ARCH_HISI is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_INTEL_SOCFPGA is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_K3 is not set +# CONFIG_ARCH_KEEMBAY is not set +# CONFIG_ARCH_KEYSTONE is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_LAYERSCAPE is not set +# CONFIG_ARCH_LG1K is not set +# CONFIG_ARCH_LPC32XX is not set +# CONFIG_ARCH_MEDIATEK is not set +# CONFIG_ARCH_MESON is not set +# CONFIG_ARCH_MILBEAUT is not set +CONFIG_ARCH_MMAP_RND_BITS=8 +CONFIG_ARCH_MMAP_RND_BITS_MAX=16 +CONFIG_ARCH_MMAP_RND_BITS_MIN=8 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 +# CONFIG_ARCH_MMP is not set +# CONFIG_ARCH_MSTARV7 is not set +# CONFIG_ARCH_MULTIPLATFORM is not set +# CONFIG_ARCH_MULTI_V6 is not set +# CONFIG_ARCH_MULTI_V7 is not set +# CONFIG_ARCH_MV78XX0 is not set +# CONFIG_ARCH_MVEBU is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_MXS is not set +# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_NOMADIK is not set +# CONFIG_ARCH_NPCM is not set +# CONFIG_ARCH_NSPIRE is not set +# CONFIG_ARCH_OMAP is not set +# CONFIG_ARCH_OMAP1 is not set +# CONFIG_ARCH_OMAP2 is not set +# CONFIG_ARCH_OMAP2PLUS is not set +# CONFIG_ARCH_OMAP3 is not set +# CONFIG_ARCH_OMAP4 is not set +# CONFIG_ARCH_ORION5X is not set +# CONFIG_ARCH_OXNAS is not set +# CONFIG_ARCH_PICOXCELL is not set +# CONFIG_ARCH_PRIMA2 is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_QCOM is not set +# CONFIG_ARCH_RANDOM is not set +# CONFIG_ARCH_RDA is not set +# CONFIG_ARCH_REALTEK is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_RENESAS is not set +# CONFIG_ARCH_ROCKCHIP is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_S32 is not set +# CONFIG_ARCH_S3C24XX is not set +# CONFIG_ARCH_S3C64XX is not set +# CONFIG_ARCH_S5PV210 is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_SEATTLE is not set +# CONFIG_ARCH_SHMOBILE is not set +# CONFIG_ARCH_SIRF is not set +# CONFIG_ARCH_SOCFPGA is not set +# CONFIG_ARCH_SPARX5 is not set +# CONFIG_ARCH_SPRD is not set +# CONFIG_ARCH_STI is not set +# CONFIG_ARCH_STM32 is not set +# CONFIG_ARCH_STRATIX10 is not set +# CONFIG_ARCH_SUNXI is not set +# CONFIG_ARCH_SYNQUACER is not set +# CONFIG_ARCH_TANGO is not set +# CONFIG_ARCH_TEGRA is not set +# CONFIG_ARCH_THUNDER is not set +# CONFIG_ARCH_THUNDER2 is not set +# CONFIG_ARCH_U300 is not set +# CONFIG_ARCH_U8500 is not set +# CONFIG_ARCH_UNIPHIER is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_VEXPRESS is not set +# CONFIG_ARCH_VIRT is not set +# CONFIG_ARCH_VISCONTI is not set +# CONFIG_ARCH_VT8500 is not set +# CONFIG_ARCH_VULCAN is not set +# CONFIG_ARCH_W90X900 is not set +# CONFIG_ARCH_WANTS_THP_SWAP is not set +# CONFIG_ARCH_WM8505 is not set +# CONFIG_ARCH_WM8750 is not set +# CONFIG_ARCH_WM8850 is not set +# CONFIG_ARCH_XGENE is not set +# CONFIG_ARCH_ZX is not set +# CONFIG_ARCH_ZYNQ is not set +# CONFIG_ARCH_ZYNQMP is not set +# CONFIG_ARCNET is not set +# CONFIG_ARC_EMAC is not set +# CONFIG_ARC_IRQ_NO_AUTOSAVE is not set +# CONFIG_ARM64_16K_PAGES is not set +# CONFIG_ARM64_64K_PAGES is not set +# CONFIG_ARM64_AMU_EXTN is not set +# CONFIG_ARM64_BTI is not set +# CONFIG_ARM64_CRYPTO is not set +# CONFIG_ARM64_E0PD is not set +# CONFIG_ARM64_ERRATUM_1024718 is not set +# CONFIG_ARM64_ERRATUM_1165522 is not set +# CONFIG_ARM64_ERRATUM_1286807 is not set +# CONFIG_ARM64_ERRATUM_1319367 is not set +# CONFIG_ARM64_ERRATUM_1418040 is not set +# CONFIG_ARM64_ERRATUM_1463225 is not set +# CONFIG_ARM64_ERRATUM_1508412 is not set +# CONFIG_ARM64_ERRATUM_1530923 is not set +# CONFIG_ARM64_ERRATUM_1542419 is not set +# CONFIG_ARM64_ERRATUM_1742098 is not set +# CONFIG_ARM64_ERRATUM_2253138 is not set +# CONFIG_ARM64_ERRATUM_2224489 is not set +# CONFIG_ARM64_ERRATUM_2054223 is not set +# CONFIG_ARM64_ERRATUM_2067961 is not set +# CONFIG_ARM64_ERRATUM_2441007 is not set +# CONFIG_ARM64_ERRATUM_2441009 is not set +# CONFIG_ARM64_ERRATUM_819472 is not set +# CONFIG_ARM64_ERRATUM_824069 is not set +# CONFIG_ARM64_ERRATUM_826319 is not set +# CONFIG_ARM64_ERRATUM_827319 is not set +# CONFIG_ARM64_ERRATUM_832075 is not set +# CONFIG_ARM64_ERRATUM_834220 is not set +# CONFIG_ARM64_ERRATUM_843419 is not set +# CONFIG_ARM64_ERRATUM_845719 is not set +# CONFIG_ARM64_ERRATUM_858921 is not set +# CONFIG_ARM64_HW_AFDBM is not set +# CONFIG_ARM64_LSE_ATOMICS is not set +CONFIG_ARM64_MODULE_PLTS=y +# CONFIG_ARM64_MTE is not set +# CONFIG_ARM64_PAN is not set +# CONFIG_ARM64_PMEM is not set +# CONFIG_ARM64_PSEUDO_NMI is not set +# CONFIG_ARM64_PTDUMP_DEBUGFS is not set +# CONFIG_ARM64_PTR_AUTH is not set +# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set +# CONFIG_ARM64_RAS_EXTN is not set +# CONFIG_ARM64_RELOC_TEST is not set +# CONFIG_ARM64_SVE is not set +CONFIG_ARM64_SW_TTBR0_PAN=y +# CONFIG_ARM64_TLB_RANGE is not set +# CONFIG_ARM64_UAO is not set +# CONFIG_ARM64_USE_LSE_ATOMICS is not set +# CONFIG_ARM64_VA_BITS_48 is not set +# CONFIG_ARM64_VHE is not set +# CONFIG_ARM_APPENDED_DTB is not set +# CONFIG_ARM_ARCH_TIMER is not set +# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set +# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set +# CONFIG_ARM_CCI is not set +# CONFIG_ARM_CCI400_PMU is not set +# CONFIG_ARM_CCI5xx_PMU is not set +# CONFIG_ARM_CCI_PMU is not set +# CONFIG_ARM_CCN is not set +# CONFIG_ARM_CMN is not set +# CONFIG_ARM_CPUIDLE is not set +CONFIG_ARM_CPU_TOPOLOGY=y +# CONFIG_ARM_CRYPTO is not set +CONFIG_ARM_DMA_MEM_BUFFERABLE=y +# CONFIG_ARM_DSU_PMU is not set +# CONFIG_ARM_ERRATA_326103 is not set +# CONFIG_ARM_ERRATA_364296 is not set +# CONFIG_ARM_ERRATA_411920 is not set +# CONFIG_ARM_ERRATA_430973 is not set +# CONFIG_ARM_ERRATA_458693 is not set +# CONFIG_ARM_ERRATA_460075 is not set +# CONFIG_ARM_ERRATA_643719 is not set +# CONFIG_ARM_ERRATA_720789 is not set +# CONFIG_ARM_ERRATA_742230 is not set +# CONFIG_ARM_ERRATA_742231 is not set +# CONFIG_ARM_ERRATA_743622 is not set +# CONFIG_ARM_ERRATA_751472 is not set +# CONFIG_ARM_ERRATA_754322 is not set +# CONFIG_ARM_ERRATA_754327 is not set +# CONFIG_ARM_ERRATA_764369 is not set +# CONFIG_ARM_ERRATA_773022 is not set +# CONFIG_ARM_ERRATA_775420 is not set +# CONFIG_ARM_ERRATA_798181 is not set +# CONFIG_ARM_ERRATA_814220 is not set +# CONFIG_ARM_ERRATA_818325_852422 is not set +# CONFIG_ARM_ERRATA_821420 is not set +# CONFIG_ARM_ERRATA_825619 is not set +# CONFIG_ARM_ERRATA_852421 is not set +# CONFIG_ARM_ERRATA_852423 is not set +# CONFIG_ARM_ERRATA_857271 is not set +# CONFIG_ARM_ERRATA_857272 is not set +# CONFIG_ARM_FFA_TRANSPORT is not set +CONFIG_ARM_GIC_MAX_NR=1 +# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set +# CONFIG_ARM_KPROBES_TEST is not set +# CONFIG_ARM_LPAE is not set +# CONFIG_ARM_MEDIATEK_CPUFREQ_HW is not set +# CONFIG_ARM_MHU is not set +CONFIG_ARM_MODULE_PLTS=y +# CONFIG_ARM_PATCH_PHYS_VIRT is not set +# CONFIG_ARM_PSCI is not set +# CONFIG_ARM_PSCI_CHECKER is not set +# CONFIG_ARM_PSCI_CPUIDLE is not set +# CONFIG_ARM_PTDUMP_DEBUGFS is not set +# CONFIG_ARM_SBSA_WATCHDOG is not set +# CONFIG_ARM_SCMI_PROTOCOL is not set +# CONFIG_ARM_SCPI_PROTOCOL is not set +# CONFIG_ARM_SDE_INTERFACE is not set +# CONFIG_ARM_SMCCC_SOC_ID is not set +# CONFIG_ARM_SMC_WATCHDOG is not set +# CONFIG_ARM_SP805_WATCHDOG is not set +# CONFIG_ARM_SPE_PMU is not set +# CONFIG_ARM_THUMBEE is not set +# CONFIG_ARM_TIMER_SP804 is not set +# CONFIG_ARM_UNWIND is not set +# CONFIG_ARM_VIRT_EXT is not set +# CONFIG_AS3935 is not set +# CONFIG_AS73211 is not set +# CONFIG_ASM9260_TIMER is not set +# CONFIG_ASN1 is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_ASYMMETRIC_KEY_TYPE is not set +# CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE is not set +# CONFIG_ASYNC_RAID6_TEST is not set +# CONFIG_ASYNC_TX_DMA is not set +# CONFIG_AT76C50X_USB is not set +# CONFIG_AT803X_PHY is not set +# CONFIG_AT91_SAMA5D2_ADC is not set +# CONFIG_ATA is not set +# CONFIG_ATAGS is not set +CONFIG_ATAGS_PROC=y +# CONFIG_ATALK is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_ATA_ACPI is not set +CONFIG_ATA_BMDMA=y +# CONFIG_ATA_FORCE is not set +# CONFIG_ATA_GENERIC is not set +# CONFIG_ATA_LEDS is not set +# CONFIG_ATA_NONSTANDARD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_ATA_PIIX is not set +CONFIG_ATA_SFF=y +# CONFIG_ATA_VERBOSE_ERROR is not set +# CONFIG_ATH10K is not set +# CONFIG_ATH25 is not set +# CONFIG_ATH5K is not set +# CONFIG_ATH6KL is not set +# CONFIG_ATH79 is not set +# CONFIG_ATH9K is not set +# CONFIG_ATH9K_HTC is not set +# CONFIG_ATH_DEBUG is not set +# CONFIG_ATL1 is not set +# CONFIG_ATL1C is not set +# CONFIG_ATL1E is not set +# CONFIG_ATL2 is not set +# CONFIG_ATLAS_EZO_SENSOR is not set +# CONFIG_ATLAS_PH_SENSOR is not set +# CONFIG_ATM is not set +# CONFIG_ATMEL is not set +# CONFIG_ATMEL_PIT is not set +# CONFIG_ATMEL_SSC is not set +# CONFIG_ATM_AMBASSADOR is not set +# CONFIG_ATM_BR2684 is not set +CONFIG_ATM_BR2684_IPFILTER=y +# CONFIG_ATM_CLIP is not set +CONFIG_ATM_CLIP_NO_ICMP=y +# CONFIG_ATM_DRIVERS is not set +# CONFIG_ATM_DUMMY is not set +# CONFIG_ATM_ENI is not set +# CONFIG_ATM_FIRESTREAM is not set +# CONFIG_ATM_FORE200E is not set +# CONFIG_ATM_HE is not set +# CONFIG_ATM_HORIZON is not set +# CONFIG_ATM_IA is not set +# CONFIG_ATM_IDT77252 is not set +# CONFIG_ATM_LANAI is not set +# CONFIG_ATM_LANE is not set +# CONFIG_ATM_MPOA is not set +# CONFIG_ATM_NICSTAR is not set +# CONFIG_ATM_SOLOS is not set +# CONFIG_ATM_TCP is not set +# CONFIG_ATM_ZATM is not set +# CONFIG_ATOMIC64_SELFTEST is not set +# CONFIG_ATP is not set +# CONFIG_AUDIT is not set +# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set +# CONFIG_AURORA_NB8800 is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTO_ZRELADDR is not set +# CONFIG_AUXDISPLAY is not set +# CONFIG_AX25 is not set +# CONFIG_AX25_DAMA_SLAVE is not set +# CONFIG_AX88796 is not set +# CONFIG_AX88796B_PHY is not set +# CONFIG_AXP20X_ADC is not set +# CONFIG_AXP20X_POWER is not set +# CONFIG_AXP288_ADC is not set +# CONFIG_AXP288_FUEL_GAUGE is not set +# CONFIG_B43 is not set +# CONFIG_B43LEGACY is not set +# CONFIG_B44 is not set +# CONFIG_B53 is not set +# CONFIG_B53_MDIO_DRIVER is not set +# CONFIG_B53_MMAP_DRIVER is not set +# CONFIG_B53_SERDES is not set +# CONFIG_B53_SPI_DRIVER is not set +# CONFIG_B53_SRAB_DRIVER is not set +# CONFIG_BACKLIGHT_ADP8860 is not set +# CONFIG_BACKLIGHT_ADP8870 is not set +# CONFIG_BACKLIGHT_APPLE is not set +# CONFIG_BACKLIGHT_ARCXCNN is not set +# CONFIG_BACKLIGHT_BD6107 is not set +# CONFIG_BACKLIGHT_CLASS_DEVICE is not set +# CONFIG_BACKLIGHT_GENERIC is not set +# CONFIG_BACKLIGHT_GPIO is not set +# CONFIG_BACKLIGHT_KTD253 is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set +# CONFIG_BACKLIGHT_LED is not set +# CONFIG_BACKLIGHT_LM3630A is not set +# CONFIG_BACKLIGHT_LM3639 is not set +# CONFIG_BACKLIGHT_LP855X is not set +# CONFIG_BACKLIGHT_LV5207LP is not set +# CONFIG_BACKLIGHT_PANDORA is not set +# CONFIG_BACKLIGHT_PM8941_WLED is not set +# CONFIG_BACKLIGHT_PWM is not set +# CONFIG_BACKLIGHT_QCOM_WLED is not set +# CONFIG_BACKLIGHT_RPI is not set +# CONFIG_BACKLIGHT_SAHARA is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_BAREUDP is not set +CONFIG_BASE_FULL=y +CONFIG_BASE_SMALL=0 +# CONFIG_BATMAN_ADV is not set +# CONFIG_BATTERY_BQ27XXX is not set +# CONFIG_BATTERY_BQ27XXX_HDQ is not set +# CONFIG_BATTERY_CW2015 is not set +# CONFIG_BATTERY_DS2760 is not set +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_LEGO_EV3 is not set +# CONFIG_BATTERY_MAX17040 is not set +# CONFIG_BATTERY_MAX17042 is not set +# CONFIG_BATTERY_MAX1721X is not set +# CONFIG_BATTERY_RT5033 is not set +# CONFIG_BATTERY_SBS is not set +# CONFIG_BAYCOM_EPP is not set +# CONFIG_BAYCOM_PAR is not set +# CONFIG_BAYCOM_SER_FDX is not set +# CONFIG_BAYCOM_SER_HDX is not set +# CONFIG_BCACHE is not set +# CONFIG_BCM47XX is not set +# CONFIG_BCM54140_PHY is not set +# CONFIG_BCM63XX is not set +# CONFIG_BCM63XX_PHY is not set +# CONFIG_BCM7038_WDT is not set +# CONFIG_BCM7XXX_PHY is not set +# CONFIG_BCM84881_PHY is not set +# CONFIG_BCM87XX_PHY is not set +# CONFIG_BCMA is not set +# CONFIG_BCMA_DRIVER_GPIO is not set +CONFIG_BCMA_POSSIBLE=y +# CONFIG_BCMGENET is not set +# CONFIG_BCM_IPROC_ADC is not set +# CONFIG_BCM_KONA_USB2_PHY is not set +# CONFIG_BCM_SBA_RAID is not set +# CONFIG_BCM_VK is not set +# CONFIG_BDI_SWITCH is not set +# CONFIG_BE2ISCSI is not set +# CONFIG_BE2NET is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_BGMAC is not set +# CONFIG_BH1750 is not set +# CONFIG_BH1780 is not set +# CONFIG_BIG_KEYS is not set +# CONFIG_BIG_LITTLE is not set +CONFIG_BINARY_PRINTF=y +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_ELF_FDPIC is not set +# CONFIG_BINFMT_FLAT is not set +# CONFIG_BINFMT_MISC is not set +CONFIG_BINFMT_SCRIPT=y +CONFIG_BITREVERSE=y +# CONFIG_BLK_CGROUP_IOCOST is not set +# CONFIG_BLK_CGROUP_IOLATENCY is not set +# CONFIG_BLK_CGROUP_IOPRIO is not set +# CONFIG_BLK_CMDLINE_PARSER is not set +# CONFIG_BLK_DEBUG_FS is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_BLK_DEV_4DRIVES is not set +# CONFIG_BLK_DEV_AEC62XX is not set +# CONFIG_BLK_DEV_ALI14XX is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +# CONFIG_BLK_DEV_ATIIXP is not set +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_BSGLIB is not set +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_CMD64X is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_CS5535 is not set +# CONFIG_BLK_DEV_CS5536 is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_DELKIN is not set +# CONFIG_BLK_DEV_DM is not set +# CONFIG_BLK_DEV_DRBD is not set +# CONFIG_BLK_DEV_DTC2278 is not set +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_GENERIC is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_BLK_DEV_HT6560B is not set +# CONFIG_BLK_DEV_IDEACPI is not set +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDECS is not set +# CONFIG_BLK_DEV_IDEPCI is not set +# CONFIG_BLK_DEV_IDEPNP is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDE_AU1XXX is not set +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_BLK_DEV_INITRD=y +# CONFIG_BLK_DEV_INTEGRITY is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_BLK_DEV_IT8172 is not set +# CONFIG_BLK_DEV_IT8213 is not set +# CONFIG_BLK_DEV_IT821X is not set +# CONFIG_BLK_DEV_JMICRON is not set +# CONFIG_BLK_DEV_LOOP is not set +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +# CONFIG_BLK_DEV_MD is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_NULL_BLK is not set +# CONFIG_BLK_DEV_NVME is not set +# CONFIG_BLK_DEV_OFFBOARD is not set +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set +# CONFIG_BLK_DEV_PDC202XX_NEW is not set +# CONFIG_BLK_DEV_PDC202XX_OLD is not set +# CONFIG_BLK_DEV_PIIX is not set +# CONFIG_BLK_DEV_PLATFORM is not set +# CONFIG_BLK_DEV_PMEM is not set +# CONFIG_BLK_DEV_QD65XX is not set +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_BLK_DEV_RBD is not set +# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_RZ1000 is not set +# CONFIG_BLK_DEV_SC1200 is not set +# CONFIG_BLK_DEV_SD is not set +# CONFIG_BLK_DEV_SIIMAGE is not set +# CONFIG_BLK_DEV_SIS5513 is not set +# CONFIG_BLK_DEV_SKD is not set +# CONFIG_BLK_DEV_SL82C105 is not set +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_BLK_DEV_SVWKS is not set +# CONFIG_BLK_DEV_SX8 is not set +# CONFIG_BLK_DEV_TC86C001 is not set +# CONFIG_BLK_DEV_THROTTLING is not set +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_UMC8672 is not set +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_VIA82CXXX is not set +# CONFIG_BLK_DEV_ZONED is not set +# CONFIG_BLK_INLINE_ENCRYPTION is not set +# CONFIG_BLK_SED_OPAL is not set +# CONFIG_BLK_WBT is not set +CONFIG_BLOCK=y +# CONFIG_BMA180 is not set +# CONFIG_BMA220 is not set +# CONFIG_BMA400 is not set +# CONFIG_BMC150_ACCEL is not set +# CONFIG_BMC150_MAGN is not set +# CONFIG_BMC150_MAGN_I2C is not set +# CONFIG_BMC150_MAGN_SPI is not set +# CONFIG_BME680 is not set +# CONFIG_BMG160 is not set +# CONFIG_BMI088_ACCEL is not set +# CONFIG_BMI160_I2C is not set +# CONFIG_BMI160_SPI is not set +# CONFIG_BMIPS_GENERIC is not set +# CONFIG_BMP280 is not set +# CONFIG_BNA is not set +# CONFIG_BNX2 is not set +# CONFIG_BNX2X is not set +# CONFIG_BNX2X_SRIOV is not set +# CONFIG_BNXT is not set +# CONFIG_BONDING is not set +# CONFIG_BOOKE_WDT is not set +CONFIG_BOOKE_WDT_DEFAULT_TIMEOUT=3 +# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set +# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +# CONFIG_BOOTTIME_TRACING is not set +# CONFIG_BOOT_CONFIG is not set +# CONFIG_BOOT_PRINTK_DELAY is not set +CONFIG_BOOT_RAW=y +# CONFIG_BOUNCE is not set +CONFIG_BPF=y +# CONFIG_BPFILTER is not set +CONFIG_BPF_JIT=y +# CONFIG_BPF_JIT_ALWAYS_ON is not set +CONFIG_BPF_JIT_DEFAULT_ON=y +# CONFIG_BPF_PRELOAD is not set +# CONFIG_BPF_STREAM_PARSER is not set +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_UNPRIV_DEFAULT_OFF=y +# CONFIG_BPQETHER is not set +CONFIG_BQL=y +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_BRCMFMAC is not set +# CONFIG_BRCMSMAC is not set +# CONFIG_BRCMSTB_GISB_ARB is not set +CONFIG_BRIDGE=y +# CONFIG_BRIDGE_CFM is not set +# CONFIG_BRIDGE_EBT_802_3 is not set +# CONFIG_BRIDGE_EBT_AMONG is not set +# CONFIG_BRIDGE_EBT_ARP is not set +# CONFIG_BRIDGE_EBT_ARPREPLY is not set +# CONFIG_BRIDGE_EBT_BROUTE is not set +# CONFIG_BRIDGE_EBT_DNAT is not set +# CONFIG_BRIDGE_EBT_IP is not set +# CONFIG_BRIDGE_EBT_IP6 is not set +# CONFIG_BRIDGE_EBT_LIMIT is not set +# CONFIG_BRIDGE_EBT_LOG is not set +# CONFIG_BRIDGE_EBT_MARK is not set +# CONFIG_BRIDGE_EBT_MARK_T is not set +# CONFIG_BRIDGE_EBT_NFLOG is not set +# CONFIG_BRIDGE_EBT_PKTTYPE is not set +# CONFIG_BRIDGE_EBT_REDIRECT is not set +# CONFIG_BRIDGE_EBT_SNAT is not set +# CONFIG_BRIDGE_EBT_STP is not set +# CONFIG_BRIDGE_EBT_T_FILTER is not set +# CONFIG_BRIDGE_EBT_T_NAT is not set +# CONFIG_BRIDGE_EBT_VLAN is not set +CONFIG_BRIDGE_IGMP_SNOOPING=y +# CONFIG_BRIDGE_MRP is not set +# CONFIG_BRIDGE_NETFILTER is not set +# CONFIG_BRIDGE_NF_EBTABLES is not set +CONFIG_BRIDGE_VLAN_FILTERING=y +# CONFIG_BROADCOM_PHY is not set +CONFIG_BROKEN_ON_SMP=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +# CONFIG_BT is not set +# CONFIG_BTRFS_ASSERT is not set +# CONFIG_BTRFS_DEBUG is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_BTRFS_FS_POSIX_ACL is not set +# CONFIG_BTRFS_FS_REF_VERIFY is not set +# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set +# CONFIG_BT_AOSPEXT is not set +# CONFIG_BT_ATH3K is not set +# CONFIG_BT_BNEP is not set +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +# CONFIG_BT_BREDR is not set +# CONFIG_BT_CMTP is not set +# CONFIG_BT_FEATURE_DEBUG is not set +# CONFIG_BT_HCIBCM203X is not set +# CONFIG_BT_HCIBFUSB is not set +# CONFIG_BT_HCIBLUECARD is not set +# CONFIG_BT_HCIBPA10X is not set +# CONFIG_BT_HCIBT3C is not set +# CONFIG_BT_HCIBTSDIO is not set +# CONFIG_BT_HCIBTUSB is not set +# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set +# CONFIG_BT_HCIBTUSB_MTK is not set +# CONFIG_BT_HCIBTUSB_RTL is not set +# CONFIG_BT_HCIDTL1 is not set +# CONFIG_BT_HCIUART is not set +# CONFIG_BT_HCIUART_3WIRE is not set +# CONFIG_BT_HCIUART_AG6XX is not set +# CONFIG_BT_HCIUART_ATH3K is not set +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_H4=y +# CONFIG_BT_HCIUART_LL is not set +# CONFIG_BT_HCIUART_MRVL is not set +# CONFIG_BT_HCIUART_QCA is not set +# CONFIG_BT_HCIUART_RTL is not set +# CONFIG_BT_HCIVHCI is not set +# CONFIG_BT_HIDP is not set +# CONFIG_BT_HS is not set +# CONFIG_BT_LE is not set +# CONFIG_BT_LEDS is not set +# CONFIG_BT_MRVL is not set +# CONFIG_BT_MSFTEXT is not set +# CONFIG_BT_MTKSDIO is not set +# CONFIG_BT_MTKUART is not set +# CONFIG_BT_RFCOMM is not set +CONFIG_BT_RFCOMM_TTY=y +# CONFIG_BT_SELFTEST is not set +# CONFIG_BT_VIRTIO is not set +CONFIG_BUG=y +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +CONFIG_BUILDTIME_EXTABLE_SORT=y +CONFIG_BUILDTIME_TABLE_SORT=y +# CONFIG_BUILD_BIN2C is not set +CONFIG_BUILD_SALT="" +# CONFIG_C2PORT is not set +CONFIG_CACHE_L2X0_PMU=y +# CONFIG_CADENCE_WATCHDOG is not set +# CONFIG_CAIF is not set +# CONFIG_CAN is not set +# CONFIG_CAN_BCM is not set +# CONFIG_CAN_DEBUG_DEVICES is not set +# CONFIG_CAN_DEV is not set +# CONFIG_CAN_ETAS_ES58X is not set +# CONFIG_CAN_GS_USB is not set +# CONFIG_CAN_GW is not set +# CONFIG_CAN_HI311X is not set +# CONFIG_CAN_IFI_CANFD is not set +# CONFIG_CAN_ISOTP is not set +# CONFIG_CAN_J1939 is not set +# CONFIG_CAN_KVASER_PCIEFD is not set +# CONFIG_CAN_MCBA_USB is not set +# CONFIG_CAN_MCP251XFD is not set +# CONFIG_CAN_M_CAN is not set +# CONFIG_CAN_PEAK_PCIEFD is not set +# CONFIG_CAN_RAW is not set +# CONFIG_CAN_RCAR is not set +# CONFIG_CAN_RCAR_CANFD is not set +# CONFIG_CAN_SLCAN is not set +# CONFIG_CAN_SUN4I is not set +# CONFIG_CAN_UCAN is not set +# CONFIG_CAN_VCAN is not set +# CONFIG_CAN_VXCAN is not set +# CONFIG_CAPI_AVM is not set +# CONFIG_CAPI_EICON is not set +# CONFIG_CAPI_TRACE is not set +CONFIG_CARDBUS=y +# CONFIG_CARDMAN_4000 is not set +# CONFIG_CARDMAN_4040 is not set +# CONFIG_CARL9170 is not set +# CONFIG_CASSINI is not set +# CONFIG_CAVIUM_CPT is not set +# CONFIG_CAVIUM_ERRATUM_22375 is not set +# CONFIG_CAVIUM_ERRATUM_23144 is not set +# CONFIG_CAVIUM_ERRATUM_23154 is not set +# CONFIG_CAVIUM_ERRATUM_27456 is not set +# CONFIG_CAVIUM_ERRATUM_30115 is not set +# CONFIG_CAVIUM_OCTEON_SOC is not set +# CONFIG_CAVIUM_PTP is not set +# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set +# CONFIG_CB710_CORE is not set +# CONFIG_CC10001_ADC is not set +# CONFIG_CCS811 is not set +CONFIG_CC_CAN_LINK=y +CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_CEPH_FS is not set +# CONFIG_CEPH_LIB is not set +# CONFIG_CFG80211 is not set +# CONFIG_CFG80211_CERTIFICATION_ONUS is not set +# CONFIG_CGROUPS is not set +# CONFIG_CGROUP_MISC is not set +# CONFIG_CHARGER_ADP5061 is not set +# CONFIG_CHARGER_BD99954 is not set +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_BQ24190 is not set +# CONFIG_CHARGER_BQ24257 is not set +# CONFIG_CHARGER_BQ24735 is not set +# CONFIG_CHARGER_BQ2515X is not set +# CONFIG_CHARGER_BQ256XX is not set +# CONFIG_CHARGER_BQ25890 is not set +# CONFIG_CHARGER_BQ25980 is not set +# CONFIG_CHARGER_DETECTOR_MAX14656 is not set +# CONFIG_CHARGER_GPIO is not set +# CONFIG_CHARGER_ISP1704 is not set +# CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_LT3651 is not set +# CONFIG_CHARGER_LTC3651 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_MANAGER is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_QCOM_SMBB is not set +# CONFIG_CHARGER_RT9455 is not set +# CONFIG_CHARGER_SBS is not set +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_CHARGER_TWL4030 is not set +# CONFIG_CHARGER_UCS1002 is not set +# CONFIG_CHASH_SELFTEST is not set +# CONFIG_CHASH_STATS is not set +# CONFIG_CHECKPOINT_RESTORE is not set +# CONFIG_CHELSIO_T1 is not set +# CONFIG_CHELSIO_T3 is not set +# CONFIG_CHELSIO_T4 is not set +# CONFIG_CHELSIO_T4VF is not set +# CONFIG_CHROME_PLATFORMS is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_CIFS is not set +# CONFIG_CIFS_ACL is not set +CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y +# CONFIG_CIFS_DEBUG is not set +# CONFIG_CIFS_DEBUG2 is not set +# CONFIG_CIFS_FSCACHE is not set +# CONFIG_CIFS_NFSD_EXPORT is not set +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_SMB2 is not set +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_STATS2 is not set +# CONFIG_CIFS_SWN_UPCALL is not set +# CONFIG_CIFS_WEAK_PW_HASH is not set +CONFIG_CIFS_XATTR=y +# CONFIG_CIO_DAC is not set +# CONFIG_CLEANCACHE is not set +# CONFIG_CLKSRC_PISTACHIO is not set +# CONFIG_CLKSRC_VERSATILE is not set +# CONFIG_CLK_GFM_LPASS_SM8250 is not set +# CONFIG_CLK_HSDK is not set +# CONFIG_CLK_QORIQ is not set +# CONFIG_CLK_SP810 is not set +# CONFIG_CLOCK_THERMAL is not set +CONFIG_CLS_U32_MARK=y +# CONFIG_CLS_U32_PERF is not set +# CONFIG_CM32181 is not set +# CONFIG_CM3232 is not set +# CONFIG_CM3323 is not set +# CONFIG_CM3605 is not set +# CONFIG_CM36651 is not set +# CONFIG_CMA is not set +CONFIG_CMDLINE="" +# CONFIG_CMDLINE_BOOL is not set +# CONFIG_CMDLINE_EXTEND is not set +# CONFIG_CMDLINE_FORCE is not set +# CONFIG_CMDLINE_FROM_BOOTLOADER is not set +# CONFIG_CMDLINE_PARTITION is not set +# CONFIG_CNIC is not set +# CONFIG_CODA_FS is not set +# CONFIG_CODE_PATCHING_SELFTEST is not set +# CONFIG_COMEDI is not set +# CONFIG_COMMON_CLK_AXI_CLKGEN is not set +# CONFIG_COMMON_CLK_BOSTON is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CDCE925 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_COMMON_CLK_FIXED_MMIO is not set +# CONFIG_COMMON_CLK_IPROC is not set +# CONFIG_COMMON_CLK_MAX9485 is not set +# CONFIG_COMMON_CLK_MT6765 is not set +# CONFIG_COMMON_CLK_MT8167 is not set +# CONFIG_COMMON_CLK_MT8167_AUDSYS is not set +# CONFIG_COMMON_CLK_MT8167_IMGSYS is not set +# CONFIG_COMMON_CLK_MT8167_MFGCFG is not set +# CONFIG_COMMON_CLK_MT8167_MMSYS is not set +# CONFIG_COMMON_CLK_MT8167_VDECSYS is not set +# CONFIG_COMMON_CLK_MT8192 is not set +# CONFIG_COMMON_CLK_NXP is not set +# CONFIG_COMMON_CLK_PIC32 is not set +# CONFIG_COMMON_CLK_PISTACHIO is not set +# CONFIG_COMMON_CLK_PWM is not set +# CONFIG_COMMON_CLK_PXA is not set +# CONFIG_COMMON_CLK_QCOM is not set +# CONFIG_COMMON_CLK_SI514 is not set +# CONFIG_COMMON_CLK_SI5341 is not set +# CONFIG_COMMON_CLK_SI5351 is not set +# CONFIG_COMMON_CLK_SI544 is not set +# CONFIG_COMMON_CLK_SI570 is not set +# CONFIG_COMMON_CLK_VC5 is not set +# CONFIG_COMMON_CLK_XGENE is not set +# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set +CONFIG_COMPACTION=y +# CONFIG_COMPAL_LAPTOP is not set +# CONFIG_COMPAT is not set +# CONFIG_COMPAT_BRK is not set +# CONFIG_COMPILE_TEST is not set +# CONFIG_CONFIGFS_FS is not set +# CONFIG_CONNECTOR is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_CONSTRUCTORS=y +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_COPS is not set +# CONFIG_CORDIC is not set +# CONFIG_COREDUMP is not set +# CONFIG_CORESIGHT is not set +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +# CONFIG_CORTINA_PHY is not set +# CONFIG_COUNTER is not set +# CONFIG_CPA_DEBUG is not set +# CONFIG_CPU_BIG_ENDIAN is not set +# CONFIG_CPU_BPREDICT_DISABLE is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_CPU_FREQ is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set +# CONFIG_CPU_FREQ_STAT_DETAILS is not set +# CONFIG_CPU_FREQ_THERMAL is not set +# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set +# CONFIG_CPU_IDLE is not set +# CONFIG_CPU_IDLE_GOV_LADDER is not set +# CONFIG_CPU_IDLE_GOV_MENU is not set +# CONFIG_CPU_IDLE_GOV_TEO is not set +# CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set +# CONFIG_CPU_ISOLATION is not set +# CONFIG_CPU_LITTLE_ENDIAN is not set +# CONFIG_CPU_NO_EFFICIENT_FFS is not set +CONFIG_CPU_SW_DOMAIN_PAN=y +# CONFIG_CPU_THERMAL is not set +# CONFIG_CRAMFS is not set +CONFIG_CRAMFS_BLOCKDEV=y +# CONFIG_CRAMFS_MTD is not set +# CONFIG_CRASH_DUMP is not set +# CONFIG_CRC16 is not set +CONFIG_CRC32=y +# CONFIG_CRC32_BIT is not set +CONFIG_CRC32_SARWATE=y +# CONFIG_CRC32_SELFTEST is not set +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SLICEBY8 is not set +# CONFIG_CRC4 is not set +# CONFIG_CRC64 is not set +# CONFIG_CRC7 is not set +# CONFIG_CRC8 is not set +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC_ITU_T is not set +# CONFIG_CRC_T10DIF is not set +CONFIG_CROSS_COMPILE="" +# CONFIG_CROSS_MEMORY_ATTACH is not set +CONFIG_CRYPTO=y +# CONFIG_CRYPTO_842 is not set +CONFIG_CRYPTO_ACOMP2=y +# CONFIG_CRYPTO_ADIANTUM is not set +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_AEGIS128L is not set +# CONFIG_CRYPTO_AEGIS128L_AESNI_SSE2 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_AEGIS256 is not set +# CONFIG_CRYPTO_AEGIS256_AESNI_SSE2 is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_586 is not set +# CONFIG_CRYPTO_AES_ARM is not set +# CONFIG_CRYPTO_AES_ARM64 is not set +# CONFIG_CRYPTO_AES_ARM64_BS is not set +# CONFIG_CRYPTO_AES_ARM64_CE is not set +# CONFIG_CRYPTO_AES_ARM64_CE_BLK is not set +# CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set +# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set +# CONFIG_CRYPTO_AES_ARM_BS is not set +# CONFIG_CRYPTO_AES_ARM_CE is not set +# CONFIG_CRYPTO_AES_NI_INTEL is not set +# CONFIG_CRYPTO_AES_TI is not set +CONFIG_CRYPTO_AKCIPHER=y +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +# CONFIG_CRYPTO_ANSI_CPRNG is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARC4 is not set +# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_BLAKE2B is not set +# CONFIG_CRYPTO_BLAKE2B_NEON is not set +# CONFIG_CRYPTO_BLAKE2S is not set +# CONFIG_CRYPTO_BLAKE2S_ARM is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_CBC is not set +CONFIG_CRYPTO_CCM=y +# CONFIG_CRYPTO_CFB is not set +# CONFIG_CRYPTO_CHACHA20 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CHACHA20_NEON is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_CHACHA_MIPS is not set +# CONFIG_CRYPTO_CMAC is not set +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRC32C is not set +# CONFIG_CRYPTO_CRC32C_INTEL is not set +# CONFIG_CRYPTO_CRC32_ARM_CE is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set +# CONFIG_CRYPTO_CRCT10DIF_ARM_CE is not set +# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_CTR=y +# CONFIG_CRYPTO_CTS is not set +# CONFIG_CRYPTO_CURVE25519 is not set +# CONFIG_CRYPTO_CURVE25519_NEON is not set +# CONFIG_CRYPTO_CURVE25519_X86 is not set +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set +# CONFIG_CRYPTO_DEV_ATMEL_AES is not set +# CONFIG_CRYPTO_DEV_ATMEL_AUTHENC is not set +# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set +# CONFIG_CRYPTO_DEV_ATMEL_SHA is not set +# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set +# CONFIG_CRYPTO_DEV_ATMEL_TDES is not set +# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set +# CONFIG_CRYPTO_DEV_CCP is not set +# CONFIG_CRYPTO_DEV_CCP_DEBUGFS is not set +# CONFIG_CRYPTO_DEV_CCREE is not set +# CONFIG_CRYPTO_DEV_FSL_CAAM is not set +# CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC is not set +# CONFIG_CRYPTO_DEV_HIFN_795X is not set +# CONFIG_CRYPTO_DEV_HISI_SEC is not set +# CONFIG_CRYPTO_DEV_HISI_ZIP is not set +# CONFIG_CRYPTO_DEV_IMGTEC_HASH is not set +# CONFIG_CRYPTO_DEV_MARVELL_CESA is not set +# CONFIG_CRYPTO_DEV_MEDIATEK is not set +# CONFIG_CRYPTO_DEV_MV_CESA is not set +# CONFIG_CRYPTO_DEV_MXC_SCC is not set +# CONFIG_CRYPTO_DEV_MXS_DCP is not set +# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set +# CONFIG_CRYPTO_DEV_OCTEONTX_CPT is not set +# CONFIG_CRYPTO_DEV_QAT_4XXX is not set +# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set +# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set +# CONFIG_CRYPTO_DEV_QAT_C62X is not set +# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set +# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set +# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set +# CONFIG_CRYPTO_DEV_QCE is not set +# CONFIG_CRYPTO_DEV_S5P is not set +# CONFIG_CRYPTO_DEV_SAFEXCEL is not set +# CONFIG_CRYPTO_DEV_SAHARA is not set +# CONFIG_CRYPTO_DEV_SP_PSP is not set +# CONFIG_CRYPTO_DEV_TALITOS is not set +# CONFIG_CRYPTO_DEV_VIRTIO is not set +# CONFIG_CRYPTO_DH is not set +# CONFIG_CRYPTO_DRBG_CTR is not set +# CONFIG_CRYPTO_DRBG_HASH is not set +# CONFIG_CRYPTO_DRBG_MENU is not set +# CONFIG_CRYPTO_ECB is not set +# CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set +# CONFIG_CRYPTO_ECHAINIV is not set +# CONFIG_CRYPTO_ECRDSA is not set +# CONFIG_CRYPTO_ESSIV is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_FIPS is not set +CONFIG_CRYPTO_GCM=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_GHASH=y +# CONFIG_CRYPTO_GHASH_ARM64_CE is not set +# CONFIG_CRYPTO_GHASH_ARM_CE is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +# CONFIG_CRYPTO_HMAC is not set +# CONFIG_CRYPTO_HW is not set +# CONFIG_CRYPTO_JITTERENTROPY is not set +# CONFIG_CRYPTO_KEYWRAP is not set +# CONFIG_CRYPTO_KHAZAD is not set +CONFIG_CRYPTO_KPP=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=y +# CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC is not set +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +# CONFIG_CRYPTO_LIB_POLY1305 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_LZ4 is not set +# CONFIG_CRYPTO_LZ4HC is not set +# CONFIG_CRYPTO_LZO is not set +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +# CONFIG_CRYPTO_MCRYPTD is not set +# CONFIG_CRYPTO_MD4 is not set +# CONFIG_CRYPTO_MD5 is not set +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_MORUS1280 is not set +# CONFIG_CRYPTO_MORUS1280_AVX2 is not set +# CONFIG_CRYPTO_MORUS1280_SSE2 is not set +# CONFIG_CRYPTO_MORUS640 is not set +# CONFIG_CRYPTO_MORUS640_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_NEON is not set +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_NULL2=y +# CONFIG_CRYPTO_OFB is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_PCOMP is not set +# CONFIG_CRYPTO_PCOMP2 is not set +CONFIG_CRYPTO_PCRYPT=y +# CONFIG_CRYPTO_POLY1305 is not set +# CONFIG_CRYPTO_POLY1305_ARM is not set +# CONFIG_CRYPTO_POLY1305_MIPS is not set +# CONFIG_CRYPTO_POLY1305_NEON is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RNG is not set +# CONFIG_CRYPTO_RSA is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SHA1 is not set +# CONFIG_CRYPTO_SHA1_ARM is not set +# CONFIG_CRYPTO_SHA1_ARM64_CE is not set +# CONFIG_CRYPTO_SHA1_ARM_CE is not set +# CONFIG_CRYPTO_SHA1_ARM_NEON is not set +# CONFIG_CRYPTO_SHA256 is not set +# CONFIG_CRYPTO_SHA256_ARM is not set +# CONFIG_CRYPTO_SHA256_ARM64 is not set +# CONFIG_CRYPTO_SHA2_ARM64_CE is not set +# CONFIG_CRYPTO_SHA2_ARM_CE is not set +# CONFIG_CRYPTO_SHA3 is not set +# CONFIG_CRYPTO_SHA3_ARM64 is not set +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_SHA512_ARM is not set +# CONFIG_CRYPTO_SHA512_ARM64 is not set +# CONFIG_CRYPTO_SHA512_ARM64_CE is not set +# CONFIG_CRYPTO_SIMD is not set +CONFIG_CRYPTO_SKCIPHER=y +CONFIG_CRYPTO_SKCIPHER2=y +# CONFIG_CRYPTO_SM2 is not set +# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_ARM64_CE is not set +# CONFIG_CRYPTO_SM4 is not set +# CONFIG_CRYPTO_SM4_ARM64_CE is not set +# CONFIG_CRYPTO_SPECK is not set +# CONFIG_CRYPTO_STATS is not set +# CONFIG_CRYPTO_STREEBOG is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TEST is not set +# CONFIG_CRYPTO_TWOFISH is not set +# CONFIG_CRYPTO_TWOFISH_586 is not set +# CONFIG_CRYPTO_TWOFISH_COMMON is not set +# CONFIG_CRYPTO_USER is not set +# CONFIG_CRYPTO_USER_API_AEAD is not set +# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set +# CONFIG_CRYPTO_USER_API_HASH is not set +# CONFIG_CRYPTO_USER_API_RNG is not set +# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set +# CONFIG_CRYPTO_USER_API_SKCIPHER is not set +# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XTS is not set +# CONFIG_CRYPTO_XXHASH is not set +# CONFIG_CRYPTO_ZLIB is not set +# CONFIG_CRYPTO_ZSTD is not set +# CONFIG_CS5535_MFGPT is not set +# CONFIG_CS89x0 is not set +# CONFIG_CS89x0_PLATFORM is not set +# CONFIG_CSD_LOCK_WAIT_DEBUG is not set +# CONFIG_CUSE is not set +# CONFIG_CW1200 is not set +# CONFIG_CXD2880_SPI_DRV is not set +# CONFIG_CXL_AFU_DRIVER_OPS is not set +# CONFIG_CXL_BASE is not set +# CONFIG_CXL_BUS is not set +# CONFIG_CXL_EEH is not set +# CONFIG_CXL_KERNEL_API is not set +# CONFIG_CXL_LIB is not set +# CONFIG_CYPRESS_FIRMWARE is not set +# CONFIG_DA280 is not set +# CONFIG_DA311 is not set +# CONFIG_DAMON is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_DAX is not set +# CONFIG_DCB is not set +# CONFIG_DDR is not set +# CONFIG_DEBUG_ALIGN_RODATA is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +# CONFIG_DEBUG_CREDENTIALS is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_EFI is not set +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ALLOW_ALL=y +# CONFIG_DEBUG_FS_ALLOW_NONE is not set +# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set +# CONFIG_DEBUG_GPIO is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_ICEDCC is not set +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_INFO_BTF is not set +# CONFIG_DEBUG_INFO_COMPRESSED is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set +CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y +# CONFIG_DEBUG_INFO_REDUCED is not set +# CONFIG_DEBUG_INFO_SPLIT is not set +# CONFIG_DEBUG_IRQFLAGS is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_KMAP_LOCAL is not set +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_DEBUG_KOBJECT is not set +# CONFIG_DEBUG_KOBJECT_RELEASE is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_LL is not set +# CONFIG_DEBUG_LL_UART_8250 is not set +# CONFIG_DEBUG_LL_UART_PL01X is not set +# CONFIG_DEBUG_LOCKDEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_MISC is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_DEBUG_NX_TEST is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_DEBUG_PAGE_REF is not set +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +# CONFIG_DEBUG_PER_CPU_MAPS is not set +# CONFIG_DEBUG_PINCTRL is not set +# CONFIG_DEBUG_PI_LIST is not set +# CONFIG_DEBUG_PLIST is not set +# CONFIG_DEBUG_PREEMPT is not set +# CONFIG_DEBUG_RODATA_TEST is not set +# CONFIG_DEBUG_RSEQ is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +# CONFIG_DEBUG_SEMIHOSTING is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_SHIRQ is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_STACKOVERFLOW is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +# CONFIG_DEBUG_TIMEKEEPING is not set +# CONFIG_DEBUG_UART_8250_PALMCHIP is not set +# CONFIG_DEBUG_UART_8250_WORD is not set +# CONFIG_DEBUG_UART_BCM63XX is not set +# CONFIG_DEBUG_UART_FLOW_CONTROL is not set +# CONFIG_DEBUG_USER is not set +# CONFIG_DEBUG_VIRTUAL is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_VM_PGFLAGS is not set +# CONFIG_DEBUG_VM_PGTABLE is not set +# CONFIG_DEBUG_VM_RB is not set +# CONFIG_DEBUG_VM_VMACACHE is not set +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_WX is not set +# CONFIG_DEBUG_ZBOOT is not set +# CONFIG_DECNET is not set +# CONFIG_DEFAULT_CODEL is not set +CONFIG_DEFAULT_CUBIC=y +CONFIG_DEFAULT_DEADLINE=y +# CONFIG_DEFAULT_FQ is not set +CONFIG_DEFAULT_FQ_CODEL=y +# CONFIG_DEFAULT_FQ_PIE is not set +CONFIG_DEFAULT_HOSTNAME="(none)" +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 +CONFIG_DEFAULT_INIT="" +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 +CONFIG_DEFAULT_NET_SCH="fq_codel" +# CONFIG_DEFAULT_NOOP is not set +# CONFIG_DEFAULT_PFIFO_FAST is not set +# CONFIG_DEFAULT_RENO is not set +CONFIG_DEFAULT_SECURITY="" +CONFIG_DEFAULT_SECURITY_DAC=y +# CONFIG_DEFAULT_SECURITY_SELINUX is not set +# CONFIG_DEFAULT_SFQ is not set +CONFIG_DEFAULT_TCP_CONG="cubic" +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" +# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set +# CONFIG_DELL_LAPTOP is not set +# CONFIG_DELL_RBTN is not set +# CONFIG_DELL_SMBIOS is not set +# CONFIG_DELL_SMO8800 is not set +# CONFIG_DEPRECATED_PARAM_STRUCT is not set +# CONFIG_DETECT_HUNG_TASK is not set +# CONFIG_DEVKMEM is not set +# CONFIG_DEVMEM is not set +CONFIG_DEVPORT=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set +# CONFIG_DEVTMPFS is not set +# CONFIG_DEVTMPFS_MOUNT is not set +# CONFIG_DEV_DAX is not set +# CONFIG_DGAP is not set +# CONFIG_DGNC is not set +# CONFIG_DHT11 is not set +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_DISPLAY_CONNECTOR_ANALOG_TV is not set +# CONFIG_DISPLAY_CONNECTOR_DVI is not set +# CONFIG_DISPLAY_CONNECTOR_HDMI is not set +# CONFIG_DISPLAY_ENCODER_TFP410 is not set +# CONFIG_DISPLAY_ENCODER_TPD12S015 is not set +# CONFIG_DISPLAY_PANEL_DPI is not set +# CONFIG_DISPLAY_PANEL_LGPHILIPS_LB035Q02 is not set +# CONFIG_DISPLAY_PANEL_TPO_TD028TTEC1 is not set +# CONFIG_DISPLAY_PANEL_TPO_TD043MTEA1 is not set +# CONFIG_DL2K is not set +# CONFIG_DLHL60D is not set +# CONFIG_DLM is not set +# CONFIG_DM9000 is not set +# CONFIG_DMABUF_DEBUG is not set +# CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_SELFTESTS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set +# CONFIG_DMADEVICES is not set +# CONFIG_DMADEVICES_DEBUG is not set +# CONFIG_DMARD06 is not set +# CONFIG_DMARD09 is not set +# CONFIG_DMARD10 is not set +# CONFIG_DMASCC is not set +# CONFIG_DMATEST is not set +# CONFIG_DMA_API_DEBUG is not set +CONFIG_DMA_COHERENT_POOL=y +CONFIG_DMA_DECLARE_COHERENT=y +# CONFIG_DMA_ENGINE is not set +# CONFIG_DMA_FENCE_TRACE is not set +# CONFIG_DMA_JZ4780 is not set +# CONFIG_DMA_MAP_BENCHMARK is not set +CONFIG_DMA_NONCOHERENT_MMAP=y +# CONFIG_DMA_NOOP_OPS is not set +# CONFIG_DMA_PERNUMA_CMA is not set +# CONFIG_DMA_RESTRICTED_POOL is not set +# CONFIG_DMA_SHARED_BUFFER is not set +# CONFIG_DMA_VIRT_OPS is not set +# CONFIG_DM_CACHE is not set +# CONFIG_DM_CLONE is not set +# CONFIG_DM_DEBUG is not set +# CONFIG_DM_DELAY is not set +# CONFIG_DM_DUST is not set +# CONFIG_DM_EBS is not set +# CONFIG_DM_ERA is not set +# CONFIG_DM_FLAKEY is not set +# CONFIG_DM_INTEGRITY is not set +# CONFIG_DM_LOG_USERSPACE is not set +# CONFIG_DM_LOG_WRITES is not set +# CONFIG_DM_MQ_DEFAULT is not set +# CONFIG_DM_MULTIPATH is not set +# CONFIG_DM_RAID is not set +# CONFIG_DM_SWITCH is not set +# CONFIG_DM_THIN_PROVISIONING is not set +# CONFIG_DM_UEVENT is not set +# CONFIG_DM_UNSTRIPED is not set +# CONFIG_DM_VERITY is not set +# CONFIG_DM_WRITECACHE is not set +# CONFIG_DM_ZERO is not set +# CONFIG_DNET is not set +# CONFIG_DNOTIFY is not set +# CONFIG_DNS_RESOLVER is not set +CONFIG_DOUBLEFAULT=y +# CONFIG_DP83640_PHY is not set +# CONFIG_DP83822_PHY is not set +# CONFIG_DP83848_PHY is not set +# CONFIG_DP83867_PHY is not set +# CONFIG_DP83869_PHY is not set +# CONFIG_DP83TC811_PHY is not set +# CONFIG_DPOT_DAC is not set +# CONFIG_DPS310 is not set +CONFIG_DQL=y +# CONFIG_DRAGONRISE_FF is not set +# CONFIG_DRM is not set +# CONFIG_DRM_AMDGPU is not set +# CONFIG_DRM_AMDGPU_CIK is not set +# CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set +# CONFIG_DRM_AMDGPU_SI is not set +# CONFIG_DRM_AMDGPU_USERPTR is not set +# CONFIG_DRM_AMD_ACP is not set +# CONFIG_DRM_AMD_DC_DCN2_0 is not set +# CONFIG_DRM_AMD_DC_DCN3_0 is not set +# CONFIG_DRM_AMD_DC_HDCP is not set +# CONFIG_DRM_AMD_DC_SI is not set +# CONFIG_DRM_AMD_SECURE_DISPLAY is not set +# CONFIG_DRM_ANALOGIX_ANX6345 is not set +# CONFIG_DRM_ANALOGIX_ANX7625 is not set +# CONFIG_DRM_ANALOGIX_ANX78XX is not set +# CONFIG_DRM_ARCPGU is not set +# CONFIG_DRM_ARMADA is not set +# CONFIG_DRM_AST is not set +# CONFIG_DRM_ATMEL_HLCDC is not set +# CONFIG_DRM_BOCHS is not set +# CONFIG_DRM_CDNS_DSI is not set +# CONFIG_DRM_CDNS_MHDP8546 is not set +# CONFIG_DRM_CHIPONE_ICN6211 is not set +# CONFIG_DRM_CHRONTEL_CH7033 is not set +# CONFIG_DRM_CIRRUS_QEMU is not set +# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +# CONFIG_DRM_DEBUG_MM is not set +# CONFIG_DRM_DEBUG_SELFTEST is not set +# CONFIG_DRM_DISPLAY_CONNECTOR is not set +# CONFIG_DRM_DP_AUX_CHARDEV is not set +# CONFIG_DRM_DP_CEC is not set +# CONFIG_DRM_DUMB_VGA_DAC is not set +# CONFIG_DRM_DW_HDMI_CEC is not set +# CONFIG_DRM_ETNAVIV is not set +# CONFIG_DRM_EXYNOS is not set +# CONFIG_DRM_FBDEV_EMULATION is not set +# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set +# CONFIG_DRM_FSL_DCU is not set +# CONFIG_DRM_GM12U320 is not set +# CONFIG_DRM_GMA500 is not set +# CONFIG_DRM_GUD is not set +# CONFIG_DRM_HDLCD is not set +# CONFIG_DRM_HISI_HIBMC is not set +# CONFIG_DRM_HISI_KIRIN is not set +# CONFIG_DRM_I2C_ADV7511 is not set +# CONFIG_DRM_I2C_CH7006 is not set +# CONFIG_DRM_I2C_NXP_TDA9950 is not set +# CONFIG_DRM_I2C_NXP_TDA998X is not set +# CONFIG_DRM_I2C_SIL164 is not set +# CONFIG_DRM_I915 is not set +# CONFIG_DRM_ITE_IT66121 is not set +# CONFIG_DRM_KOMEDA is not set +# CONFIG_DRM_LEGACY is not set +# CONFIG_DRM_LIB_RANDOM is not set +# CONFIG_DRM_LIMA is not set +# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set +# CONFIG_DRM_LONTIUM_LT8912B is not set +# CONFIG_DRM_LONTIUM_LT9611 is not set +# CONFIG_DRM_LONTIUM_LT9611UXC is not set +# CONFIG_DRM_LVDS_CODEC is not set +# CONFIG_DRM_LVDS_ENCODER is not set +# CONFIG_DRM_MALI_DISPLAY is not set +# CONFIG_DRM_MCDE is not set +# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set +# CONFIG_DRM_MGAG200 is not set +# CONFIG_DRM_MXSFB is not set +# CONFIG_DRM_NOUVEAU is not set +# CONFIG_DRM_NWL_MIPI_DSI is not set +# CONFIG_DRM_NXP_PTN3460 is not set +# CONFIG_DRM_OMAP is not set +# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set +# CONFIG_DRM_PANEL_ARM_VERSATILE is not set +# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set +# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set +# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set +# CONFIG_DRM_PANEL_DSI_CM is not set +# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set +# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set +# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set +# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9806E is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set +# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set +# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set +# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set +# CONFIG_DRM_PANEL_KHADAS_TS050 is not set +# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set +# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set +# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set +# CONFIG_DRM_PANEL_LG_LB035Q02 is not set +# CONFIG_DRM_PANEL_LG_LG4573 is not set +# CONFIG_DRM_PANEL_LVDS is not set +# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set +# CONFIG_DRM_PANEL_MIPI_DBI is not set +# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set +# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set +# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set +# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set +# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set +# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set +# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set +# CONFIG_DRM_PANEL_ROCKTECH_JH057N00900 is not set +# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set +# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set +# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set +# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set +# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set +# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set +# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set +# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set +# CONFIG_DRM_PANEL_SIMPLE is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set +# CONFIG_DRM_PANEL_SONY_ACX424AKP is not set +# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set +# CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set +# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set +# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set +# CONFIG_DRM_PANEL_TPO_TPG110 is not set +# CONFIG_DRM_PANEL_TPO_Y17P is not set +# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set +# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set +# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set +# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set +# CONFIG_DRM_PANFROST is not set +# CONFIG_DRM_PARADE_PS8622 is not set +# CONFIG_DRM_PARADE_PS8640 is not set +# CONFIG_DRM_PL111 is not set +# CONFIG_DRM_QXL is not set +# CONFIG_DRM_RADEON is not set +# CONFIG_DRM_RADEON_USERPTR is not set +# CONFIG_DRM_RCAR_DW_HDMI is not set +# CONFIG_DRM_RCAR_LVDS is not set +# CONFIG_DRM_RCAR_USE_LVDS is not set +# CONFIG_DRM_ROCKCHIP is not set +# CONFIG_DRM_SII902X is not set +# CONFIG_DRM_SII9234 is not set +# CONFIG_DRM_SIL_SII8620 is not set +# CONFIG_DRM_SIMPLEDRM is not set +# CONFIG_DRM_SIMPLE_BRIDGE is not set +# CONFIG_DRM_STI is not set +# CONFIG_DRM_STM is not set +# CONFIG_DRM_SUN4I is not set +# CONFIG_DRM_THINE_THC63LVD1024 is not set +# CONFIG_DRM_TIDSS is not set +# CONFIG_DRM_TILCDC is not set +# CONFIG_DRM_TINYDRM is not set +# CONFIG_DRM_TI_SN65DSI83 is not set +# CONFIG_DRM_TI_SN65DSI86 is not set +# CONFIG_DRM_TI_TFP410 is not set +# CONFIG_DRM_TI_TPD12S015 is not set +# CONFIG_DRM_TOSHIBA_TC358762 is not set +# CONFIG_DRM_TOSHIBA_TC358764 is not set +# CONFIG_DRM_TOSHIBA_TC358767 is not set +# CONFIG_DRM_TOSHIBA_TC358768 is not set +# CONFIG_DRM_TOSHIBA_TC358775 is not set +# CONFIG_DRM_TVE200 is not set +# CONFIG_DRM_UDL is not set +# CONFIG_DRM_VBOXVIDEO is not set +# CONFIG_DRM_VC4_HDMI_CEC is not set +# CONFIG_DRM_VGEM is not set +# CONFIG_DRM_VIRTIO_GPU is not set +# CONFIG_DRM_VKMS is not set +# CONFIG_DRM_VMWGFX is not set +# CONFIG_DRM_XEN is not set +# CONFIG_DRM_XEN_FRONTEND is not set +# CONFIG_DS1682 is not set +# CONFIG_DS1803 is not set +# CONFIG_DS4424 is not set +# CONFIG_DST_CACHE is not set +# CONFIG_DTLK is not set +# CONFIG_DUMMY is not set +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 +# CONFIG_DUMMY_IRQ is not set +# CONFIG_DVB_A8293 is not set +# CONFIG_DVB_AF9013 is not set +# CONFIG_DVB_AF9033 is not set +# CONFIG_DVB_AS102 is not set +# CONFIG_DVB_ASCOT2E is not set +# CONFIG_DVB_ATBM8830 is not set +# CONFIG_DVB_AU8522_DTV is not set +# CONFIG_DVB_AU8522_V4L is not set +# CONFIG_DVB_B2C2_FLEXCOP_USB is not set +# CONFIG_DVB_BCM3510 is not set +# CONFIG_DVB_CORE is not set +# CONFIG_DVB_CX22700 is not set +# CONFIG_DVB_CX22702 is not set +# CONFIG_DVB_CX24110 is not set +# CONFIG_DVB_CX24116 is not set +# CONFIG_DVB_CX24117 is not set +# CONFIG_DVB_CX24120 is not set +# CONFIG_DVB_CX24123 is not set +# CONFIG_DVB_CXD2099 is not set +# CONFIG_DVB_CXD2820R is not set +# CONFIG_DVB_CXD2841ER is not set +# CONFIG_DVB_CXD2880 is not set +# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set +# CONFIG_DVB_DIB3000MB is not set +# CONFIG_DVB_DIB3000MC is not set +# CONFIG_DVB_DIB7000M is not set +# CONFIG_DVB_DIB7000P is not set +# CONFIG_DVB_DIB8000 is not set +# CONFIG_DVB_DIB9000 is not set +# CONFIG_DVB_DRX39XYJ is not set +# CONFIG_DVB_DRXD is not set +# CONFIG_DVB_DRXK is not set +# CONFIG_DVB_DS3000 is not set +# CONFIG_DVB_DUMMY_FE is not set +# CONFIG_DVB_DYNAMIC_MINORS is not set +# CONFIG_DVB_EC100 is not set +# CONFIG_DVB_FIREDTV is not set +# CONFIG_DVB_HELENE is not set +# CONFIG_DVB_HORUS3A is not set +# CONFIG_DVB_ISL6405 is not set +# CONFIG_DVB_ISL6421 is not set +# CONFIG_DVB_ISL6423 is not set +# CONFIG_DVB_IX2505V is not set +# CONFIG_DVB_L64781 is not set +# CONFIG_DVB_LG2160 is not set +# CONFIG_DVB_LGDT3305 is not set +# CONFIG_DVB_LGDT3306A is not set +# CONFIG_DVB_LGDT330X is not set +# CONFIG_DVB_LGS8GL5 is not set +# CONFIG_DVB_LGS8GXX is not set +# CONFIG_DVB_LNBH25 is not set +# CONFIG_DVB_LNBH29 is not set +# CONFIG_DVB_LNBP21 is not set +# CONFIG_DVB_LNBP22 is not set +# CONFIG_DVB_M88DS3103 is not set +# CONFIG_DVB_M88RS2000 is not set +CONFIG_DVB_MAX_ADAPTERS=16 +# CONFIG_DVB_MB86A16 is not set +# CONFIG_DVB_MB86A20S is not set +# CONFIG_DVB_MMAP is not set +# CONFIG_DVB_MN88443X is not set +# CONFIG_DVB_MN88472 is not set +# CONFIG_DVB_MN88473 is not set +# CONFIG_DVB_MT312 is not set +# CONFIG_DVB_MT352 is not set +# CONFIG_DVB_MXL5XX is not set +# CONFIG_DVB_MXL692 is not set +# CONFIG_DVB_NET is not set +# CONFIG_DVB_NXT200X is not set +# CONFIG_DVB_NXT6000 is not set +# CONFIG_DVB_OR51132 is not set +# CONFIG_DVB_OR51211 is not set +# CONFIG_DVB_PLATFORM_DRIVERS is not set +# CONFIG_DVB_PLL is not set +# CONFIG_DVB_RTL2830 is not set +# CONFIG_DVB_RTL2832 is not set +# CONFIG_DVB_RTL2832_SDR is not set +# CONFIG_DVB_S5H1409 is not set +# CONFIG_DVB_S5H1411 is not set +# CONFIG_DVB_S5H1420 is not set +# CONFIG_DVB_S5H1432 is not set +# CONFIG_DVB_S921 is not set +# CONFIG_DVB_SI2165 is not set +# CONFIG_DVB_SI2168 is not set +# CONFIG_DVB_SI21XX is not set +# CONFIG_DVB_SP2 is not set +# CONFIG_DVB_SP8870 is not set +# CONFIG_DVB_SP887X is not set +# CONFIG_DVB_STB0899 is not set +# CONFIG_DVB_STB6000 is not set +# CONFIG_DVB_STB6100 is not set +# CONFIG_DVB_STV0288 is not set +# CONFIG_DVB_STV0297 is not set +# CONFIG_DVB_STV0299 is not set +# CONFIG_DVB_STV0367 is not set +# CONFIG_DVB_STV0900 is not set +# CONFIG_DVB_STV090x is not set +# CONFIG_DVB_STV0910 is not set +# CONFIG_DVB_STV6110 is not set +# CONFIG_DVB_STV6110x is not set +# CONFIG_DVB_STV6111 is not set +# CONFIG_DVB_TC90522 is not set +# CONFIG_DVB_TDA10021 is not set +# CONFIG_DVB_TDA10023 is not set +# CONFIG_DVB_TDA10048 is not set +# CONFIG_DVB_TDA1004X is not set +# CONFIG_DVB_TDA10071 is not set +# CONFIG_DVB_TDA10086 is not set +# CONFIG_DVB_TDA18271C2DD is not set +# CONFIG_DVB_TDA665x is not set +# CONFIG_DVB_TDA8083 is not set +# CONFIG_DVB_TDA8261 is not set +# CONFIG_DVB_TDA826X is not set +# CONFIG_DVB_TEST_DRIVERS is not set +# CONFIG_DVB_TS2020 is not set +# CONFIG_DVB_TTUSB_BUDGET is not set +# CONFIG_DVB_TTUSB_DEC is not set +# CONFIG_DVB_TUA6100 is not set +# CONFIG_DVB_TUNER_CX24113 is not set +# CONFIG_DVB_TUNER_DIB0070 is not set +# CONFIG_DVB_TUNER_DIB0090 is not set +# CONFIG_DVB_TUNER_ITD1000 is not set +# CONFIG_DVB_ULE_DEBUG is not set +# CONFIG_DVB_USB is not set +# CONFIG_DVB_USB_V2 is not set +# CONFIG_DVB_VES1820 is not set +# CONFIG_DVB_VES1X93 is not set +# CONFIG_DVB_ZD1301_DEMOD is not set +# CONFIG_DVB_ZL10036 is not set +# CONFIG_DVB_ZL10039 is not set +# CONFIG_DVB_ZL10353 is not set +# CONFIG_DWC_XLGMAC is not set +# CONFIG_DWMAC_DWC_QOS_ETH is not set +# CONFIG_DWMAC_INTEL_PLAT is not set +# CONFIG_DWMAC_IPQ806X is not set +# CONFIG_DWMAC_LOONGSON is not set +# CONFIG_DWMAC_LPC18XX is not set +# CONFIG_DWMAC_MESON is not set +# CONFIG_DWMAC_ROCKCHIP is not set +# CONFIG_DWMAC_SOCFPGA is not set +# CONFIG_DWMAC_STI is not set +# CONFIG_DW_AXI_DMAC is not set +# CONFIG_DW_DMAC is not set +# CONFIG_DW_DMAC_PCI is not set +# CONFIG_DW_EDMA is not set +# CONFIG_DW_EDMA_PCIE is not set +# CONFIG_DW_WATCHDOG is not set +# CONFIG_DW_XDATA_PCIE is not set +# CONFIG_DYNAMIC_DEBUG is not set +# CONFIG_DYNAMIC_DEBUG_CORE is not set +# CONFIG_E100 is not set +# CONFIG_E1000 is not set +# CONFIG_E1000E is not set +# CONFIG_E1000E_HWTS is not set +# CONFIG_EARLY_PRINTK_8250 is not set +# CONFIG_EARLY_PRINTK_USB_XDBC is not set +# CONFIG_EBC_C384_WDT is not set +# CONFIG_ECHO is not set +# CONFIG_ECRYPT_FS is not set +# CONFIG_EDAC is not set +# CONFIG_EEEPC_LAPTOP is not set +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_EEPROM_93XX46 is not set +# CONFIG_EEPROM_AT24 is not set +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_DIGSY_MTC_CFG is not set +# CONFIG_EEPROM_EE1004 is not set +# CONFIG_EEPROM_IDT_89HPESX is not set +# CONFIG_EEPROM_LEGACY is not set +# CONFIG_EEPROM_MAX6875 is not set +# CONFIG_EFI is not set +CONFIG_EFI_PARTITION=y +# CONFIG_EFI_VARS_PSTORE is not set +# CONFIG_EFS_FS is not set +CONFIG_ELFCORE=y +# CONFIG_ELF_CORE is not set +# CONFIG_EMAC_ROCKCHIP is not set +CONFIG_EMBEDDED=y +# CONFIG_EM_TIMER_STI is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +# CONFIG_ENA_ETHERNET is not set +# CONFIG_ENC28J60 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_ENCRYPTED_KEYS is not set +# CONFIG_ENCX24J600 is not set +# CONFIG_ENERGY_MODEL is not set +# CONFIG_ENIC is not set +# CONFIG_ENVELOPE_DETECTOR is not set +# CONFIG_EPAPR_PARAVIRT is not set +# CONFIG_EPIC100 is not set +CONFIG_EPOLL=y +# CONFIG_EQUALIZER is not set +# CONFIG_EROFS_FS is not set +# CONFIG_ET131X is not set +CONFIG_ETHERNET=y +# CONFIG_ETHOC is not set +CONFIG_ETHTOOL_NETLINK=y +CONFIG_EVENTFD=y +# CONFIG_EVM is not set +# CONFIG_EXFAT_FS is not set +CONFIG_EXPERT=y +CONFIG_EXPORTFS=y +# CONFIG_EXPORTFS_BLOCK_OPS is not set +# CONFIG_EXT2_FS is not set +CONFIG_EXT2_FS_XATTR=y +# CONFIG_EXT3_FS is not set +# CONFIG_EXT4_DEBUG is not set +# CONFIG_EXT4_ENCRYPTION is not set +# CONFIG_EXT4_FS is not set +# CONFIG_EXT4_FS_POSIX_ACL is not set +# CONFIG_EXT4_FS_SECURITY is not set +CONFIG_EXT4_USE_FOR_EXT2=y +# CONFIG_EXTCON is not set +# CONFIG_EXTCON_ADC_JACK is not set +# CONFIG_EXTCON_ARIZONA is not set +# CONFIG_EXTCON_AXP288 is not set +# CONFIG_EXTCON_FSA9480 is not set +# CONFIG_EXTCON_GPIO is not set +# CONFIG_EXTCON_INTEL_INT3496 is not set +# CONFIG_EXTCON_MAX3355 is not set +# CONFIG_EXTCON_PTN5150 is not set +# CONFIG_EXTCON_QCOM_SPMI_MISC is not set +# CONFIG_EXTCON_RT8973A is not set +# CONFIG_EXTCON_SM5502 is not set +# CONFIG_EXTCON_USBC_TUSB320 is not set +# CONFIG_EXTCON_USB_GPIO is not set +CONFIG_EXTRA_FIRMWARE="" +CONFIG_EXTRA_TARGETS="" +# CONFIG_EXYNOS_ADC is not set +# CONFIG_EXYNOS_VIDEO is not set +# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set +# CONFIG_EZX_PCAP is not set +# CONFIG_F2FS_CHECK_FS is not set +# CONFIG_F2FS_FAULT_INJECTION is not set +# CONFIG_F2FS_FS is not set +# CONFIG_F2FS_FS_COMPRESSION is not set +# CONFIG_F2FS_FS_ENCRYPTION is not set +# CONFIG_F2FS_FS_POSIX_ACL is not set +# CONFIG_F2FS_FS_SECURITY is not set +CONFIG_F2FS_FS_XATTR=y +# CONFIG_F2FS_IOSTAT is not set +# CONFIG_F2FS_IO_TRACE is not set +CONFIG_F2FS_STAT_FS=y +# CONFIG_FAILOVER is not set +# CONFIG_FAIR_GROUP_SCHED is not set +# CONFIG_FANOTIFY is not set +# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_FAT_DEFAULT_UTF8 is not set +# CONFIG_FAT_FS is not set +# CONFIG_FAULT_INJECTION is not set +# CONFIG_FB is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_ARC is not set +# CONFIG_FB_ARK is not set +# CONFIG_FB_ARMCLCD is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_ATMEL is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_AUO_K190X is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_BIG_ENDIAN is not set +# CONFIG_FB_BOOT_VESA_SUPPORT is not set +# CONFIG_FB_BOTH_ENDIAN is not set +# CONFIG_FB_BROADSHEET is not set +# CONFIG_FB_CARMINE is not set +# CONFIG_FB_CFB_COPYAREA is not set +# CONFIG_FB_CFB_FILLRECT is not set +# CONFIG_FB_CFB_IMAGEBLIT is not set +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_DA8XX is not set +# CONFIG_FB_DDC is not set +# CONFIG_FB_FLEX is not set +# CONFIG_FB_FOREIGN_ENDIAN is not set +# CONFIG_FB_FSL_DIU is not set +# CONFIG_FB_GEODE is not set +# CONFIG_FB_GOLDFISH is not set +# CONFIG_FB_HGA is not set +# CONFIG_FB_I740 is not set +# CONFIG_FB_IBM_GXT4500 is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_IMX is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_LE80578 is not set +# CONFIG_FB_LITTLE_ENDIAN is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_MXS is not set +# CONFIG_FB_N411 is not set +# CONFIG_FB_NEOMAGIC is not set +CONFIG_FB_NOTIFY=y +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_OF is not set +# CONFIG_FB_OMAP2 is not set +# CONFIG_FB_OPENCORES is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_PM3 is not set +# CONFIG_FB_PS3 is not set +# CONFIG_FB_PXA is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_S3 is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIMPLE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_SM712 is not set +# CONFIG_FB_SM750 is not set +# CONFIG_FB_SMSCUFX is not set +# CONFIG_FB_SSD1307 is not set +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_SYS_COPYAREA is not set +# CONFIG_FB_SYS_FILLRECT is not set +# CONFIG_FB_SYS_FOPS is not set +# CONFIG_FB_SYS_IMAGEBLIT is not set +# CONFIG_FB_TFT is not set +# CONFIG_FB_TFT_AGM1264K_FL is not set +# CONFIG_FB_TFT_BD663474 is not set +# CONFIG_FB_TFT_FBTFT_DEVICE is not set +# CONFIG_FB_TFT_HX8340BN is not set +# CONFIG_FB_TFT_HX8347D is not set +# CONFIG_FB_TFT_HX8353D is not set +# CONFIG_FB_TFT_HX8357D is not set +# CONFIG_FB_TFT_ILI9163 is not set +# CONFIG_FB_TFT_ILI9320 is not set +# CONFIG_FB_TFT_ILI9325 is not set +# CONFIG_FB_TFT_ILI9340 is not set +# CONFIG_FB_TFT_ILI9341 is not set +# CONFIG_FB_TFT_ILI9481 is not set +# CONFIG_FB_TFT_ILI9486 is not set +# CONFIG_FB_TFT_PCD8544 is not set +# CONFIG_FB_TFT_RA8875 is not set +# CONFIG_FB_TFT_S6D02A1 is not set +# CONFIG_FB_TFT_S6D1121 is not set +# CONFIG_FB_TFT_SEPS525 is not set +# CONFIG_FB_TFT_SH1106 is not set +# CONFIG_FB_TFT_SSD1289 is not set +# CONFIG_FB_TFT_SSD1305 is not set +# CONFIG_FB_TFT_SSD1306 is not set +# CONFIG_FB_TFT_SSD1325 is not set +# CONFIG_FB_TFT_SSD1331 is not set +# CONFIG_FB_TFT_SSD1351 is not set +# CONFIG_FB_TFT_ST7735R is not set +# CONFIG_FB_TFT_ST7789V is not set +# CONFIG_FB_TFT_TINYLCD is not set +# CONFIG_FB_TFT_TLS8204 is not set +# CONFIG_FB_TFT_UC1611 is not set +# CONFIG_FB_TFT_UC1701 is not set +# CONFIG_FB_TFT_UPD161704 is not set +# CONFIG_FB_TFT_WATTEROTT is not set +# CONFIG_FB_TILEBLITTING is not set +# CONFIG_FB_TMIO is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_UVESA is not set +# CONFIG_FB_VGA16 is not set +# CONFIG_FB_VIA is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_VT8623 is not set +# CONFIG_FB_XGI is not set +# CONFIG_FCOE is not set +# CONFIG_FCOE_FNIC is not set +# CONFIG_FDDI is not set +# CONFIG_FEALNX is not set +# CONFIG_FENCE_TRACE is not set +# CONFIG_FHANDLE is not set +CONFIG_FIB_RULES=y +# CONFIG_FIELDBUS_DEV is not set +CONFIG_FILE_LOCKING=y +# CONFIG_FIND_BIT_BENCHMARK is not set +# CONFIG_FIREWIRE is not set +# CONFIG_FIREWIRE_NOSY is not set +# CONFIG_FIREWIRE_SERIAL is not set +# CONFIG_FIRMWARE_EDID is not set +# CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_FIT_PARTITION is not set +# CONFIG_FIXED_PHY is not set +CONFIG_FLATMEM=y +CONFIG_FLATMEM_MANUAL=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_FM10K is not set +# CONFIG_FMC is not set +# CONFIG_FONTS is not set +# CONFIG_FONT_6x8 is not set +# CONFIG_FONT_TER16x32 is not set +# CONFIG_FORCEDETH is not set +CONFIG_FORCE_MAX_ZONEORDER=11 +CONFIG_FORTIFY_SOURCE=y +# CONFIG_FPGA is not set +# CONFIG_FRAMEBUFFER_CONSOLE is not set +# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set +# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set +# CONFIG_FRAME_POINTER is not set +# CONFIG_FREEZER is not set +# CONFIG_FRONTSWAP is not set +# CONFIG_FSCACHE is not set +# CONFIG_FSI is not set +# CONFIG_FSL_EDMA is not set +# CONFIG_FSL_ENETC is not set +# CONFIG_FSL_ENETC_IERB is not set +# CONFIG_FSL_ENETC_MDIO is not set +# CONFIG_FSL_ENETC_VF is not set +# CONFIG_FSL_ERRATUM_A008585 is not set +# CONFIG_FSL_MC_BUS is not set +# CONFIG_FSL_PQ_MDIO is not set +# CONFIG_FSL_QDMA is not set +# CONFIG_FSL_RCPM is not set +# CONFIG_FSL_XGMAC_MDIO is not set +CONFIG_FSNOTIFY=y +# CONFIG_FS_DAX is not set +# CONFIG_FS_ENCRYPTION is not set +# CONFIG_FS_POSIX_ACL is not set +# CONFIG_FS_VERITY is not set +# CONFIG_FTGMAC100 is not set +# CONFIG_FTL is not set +# CONFIG_FTMAC100 is not set +# CONFIG_FTRACE is not set +# CONFIG_FTRACE_RECORD_RECURSION is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_FTR_FIXUP_SELFTEST is not set +# CONFIG_FTWDT010_WATCHDOG is not set +# CONFIG_FUJITSU_ERRATUM_010001 is not set +# CONFIG_FUJITSU_ES is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_FUNCTION_ERROR_INJECTION is not set +# CONFIG_FUNCTION_TRACER is not set +# CONFIG_FUSE_FS is not set +# CONFIG_FUSION is not set +# CONFIG_FUSION_FC is not set +# CONFIG_FUSION_SAS is not set +# CONFIG_FUSION_SPI is not set +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_FW_LOADER=y +# CONFIG_FW_LOADER_COMPRESS is not set +CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +# CONFIG_FXAS21002C is not set +# CONFIG_FXLS8962AF_I2C is not set +# CONFIG_FXLS8962AF_SPI is not set +# CONFIG_FXOS8700_I2C is not set +# CONFIG_FXOS8700_SPI is not set +CONFIG_GACT_PROB=y +# CONFIG_GADGET_UAC1 is not set +# CONFIG_GAMEPORT is not set +# CONFIG_GATEWORKS_GW16083 is not set +# CONFIG_GCC_PLUGINS is not set +# CONFIG_GCOV is not set +# CONFIG_GCOV_KERNEL is not set +# CONFIG_GDB_SCRIPTS is not set +# CONFIG_GEMINI_ETHERNET is not set +# CONFIG_GENERIC_ADC_BATTERY is not set +# CONFIG_GENERIC_ADC_THERMAL is not set +CONFIG_GENERIC_CALIBRATE_DELAY=y +# CONFIG_GENERIC_CPU_DEVICES is not set +CONFIG_GENERIC_HWEIGHT=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +CONFIG_GENERIC_IRQ_IPI=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_NET_UTILS=y +# CONFIG_GENERIC_PHY is not set +CONFIG_GENERIC_PTDUMP=y +CONFIG_GENERIC_VDSO_TIME_NS=y +# CONFIG_GENEVE is not set +# CONFIG_GENWQE is not set +# CONFIG_GFS2_FS is not set +# CONFIG_GIGASET_CAPI is not set +# CONFIG_GIGASET_DEBUG is not set +# CONFIG_GIGASET_DUMMYLL is not set +# CONFIG_GLOB_SELFTEST is not set +# CONFIG_GNSS is not set +# CONFIG_GOLDFISH is not set +# CONFIG_GOOGLE_FIRMWARE is not set +# CONFIG_GOOGLE_FRAMEBUFFER_COREBOOT is not set +# CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY is not set +# CONFIG_GOOGLE_SMI is not set +# CONFIG_GP2AP002 is not set +# CONFIG_GP2AP020A00F is not set +# CONFIG_GPD_POCKET_FAN is not set +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_FASTPATH_LIMIT=512 +# CONFIG_GPIO_104_DIO_48E is not set +# CONFIG_GPIO_104_IDIO_16 is not set +# CONFIG_GPIO_104_IDI_48 is not set +# CONFIG_GPIO_74X164 is not set +# CONFIG_GPIO_74XX_MMIO is not set +# CONFIG_GPIO_ADNP is not set +# CONFIG_GPIO_ADP5588 is not set +# CONFIG_GPIO_AGGREGATOR is not set +# CONFIG_GPIO_ALTERA is not set +# CONFIG_GPIO_AMD8111 is not set +# CONFIG_GPIO_AMDPT is not set +# CONFIG_GPIO_AMD_FCH is not set +# CONFIG_GPIO_BCM_KONA is not set +# CONFIG_GPIO_BT8XX is not set +# CONFIG_GPIO_CADENCE is not set +# CONFIG_GPIO_CASCADE is not set +# CONFIG_GPIO_CDEV is not set +# CONFIG_GPIO_CDEV_V1 is not set +# CONFIG_GPIO_CS5535 is not set +# CONFIG_GPIO_DWAPB is not set +# CONFIG_GPIO_EM is not set +# CONFIG_GPIO_EXAR is not set +# CONFIG_GPIO_F7188X is not set +# CONFIG_GPIO_FTGPIO010 is not set +# CONFIG_GPIO_GENERIC_PLATFORM is not set +# CONFIG_GPIO_GPIO_MM is not set +# CONFIG_GPIO_GRGPIO is not set +# CONFIG_GPIO_GW_PLD is not set +# CONFIG_GPIO_HLWD is not set +# CONFIG_GPIO_ICH is not set +# CONFIG_GPIO_IT87 is not set +# CONFIG_GPIO_LOGICVC is not set +# CONFIG_GPIO_LYNXPOINT is not set +# CONFIG_GPIO_MAX3191X is not set +# CONFIG_GPIO_MAX7300 is not set +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_MB86S7X is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_ML_IOH is not set +# CONFIG_GPIO_MOCKUP is not set +# CONFIG_GPIO_MPC8XXX is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCA953X_IRQ is not set +# CONFIG_GPIO_PCA9570 is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_PCH is not set +# CONFIG_GPIO_PCIE_IDIO_24 is not set +# CONFIG_GPIO_PCI_IDIO_16 is not set +# CONFIG_GPIO_PISOSR is not set +# CONFIG_GPIO_PL061 is not set +# CONFIG_GPIO_PWM is not set +# CONFIG_GPIO_RCAR is not set +# CONFIG_GPIO_RDC321X is not set +# CONFIG_GPIO_SAMA5D2_PIOBU is not set +# CONFIG_GPIO_SCH is not set +# CONFIG_GPIO_SCH311X is not set +# CONFIG_GPIO_SIFIVE is not set +# CONFIG_GPIO_SX150X is not set +# CONFIG_GPIO_SYSCON is not set +CONFIG_GPIO_SYSFS=y +# CONFIG_GPIO_TPIC2810 is not set +# CONFIG_GPIO_TS4900 is not set +# CONFIG_GPIO_TS5500 is not set +# CONFIG_GPIO_VIRTIO is not set +# CONFIG_GPIO_VX855 is not set +# CONFIG_GPIO_WATCHDOG is not set +# CONFIG_GPIO_WINBOND is not set +# CONFIG_GPIO_WS16C48 is not set +# CONFIG_GPIO_XGENE is not set +# CONFIG_GPIO_XILINX is not set +# CONFIG_GPIO_XRA1403 is not set +# CONFIG_GPIO_ZEVIO is not set +# CONFIG_GPIO_ZX is not set +# CONFIG_GREENASIA_FF is not set +# CONFIG_GREYBUS is not set +# CONFIG_GS_FPGABOOT is not set +# CONFIG_GTP is not set +# CONFIG_GUP_BENCHMARK is not set +# CONFIG_GUP_TEST is not set +# CONFIG_GVE is not set +# CONFIG_HABANA_AI is not set +# CONFIG_HAMACHI is not set +# CONFIG_HAMRADIO is not set +# CONFIG_HAPPYMEAL is not set +CONFIG_HARDENED_USERCOPY=y +# CONFIG_HARDENED_USERCOPY_FALLBACK is not set +# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set +CONFIG_HARDEN_BRANCH_HISTORY=y +CONFIG_HARDEN_EL2_VECTORS=y +# CONFIG_HARDLOCKUP_DETECTOR is not set +# CONFIG_HAVE_ARM_ARCH_TIMER is not set +# CONFIG_HCALL_STATS is not set +# CONFIG_HDC100X is not set +# CONFIG_HDC2010 is not set +# CONFIG_HDLC is not set +# CONFIG_HDLC_CISCO is not set +# CONFIG_HDLC_FR is not set +# CONFIG_HDLC_PPP is not set +# CONFIG_HDLC_RAW is not set +# CONFIG_HDLC_RAW_ETH is not set +# CONFIG_HDMI_LPE_AUDIO is not set +# CONFIG_HDQ_MASTER_OMAP is not set +# CONFIG_HEADERS_CHECK is not set +# CONFIG_HEADERS_INSTALL is not set +# CONFIG_HEADER_TEST is not set +# CONFIG_HERMES is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_HFSPLUS_FS_POSIX_ACL is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFS_FS_POSIX_ACL is not set +# CONFIG_HI6421V600_IRQ is not set +# CONFIG_HI8435 is not set +# CONFIG_HIBERNATION is not set +# CONFIG_HID is not set +# CONFIG_HIDRAW is not set +# CONFIG_HID_A4TECH is not set +# CONFIG_HID_ACCUTOUCH is not set +# CONFIG_HID_ACRUX is not set +# CONFIG_HID_ACRUX_FF is not set +# CONFIG_HID_ALPS is not set +# CONFIG_HID_APPLE is not set +# CONFIG_HID_APPLEIR is not set +# CONFIG_HID_ASUS is not set +# CONFIG_HID_AUREAL is not set +# CONFIG_HID_BATTERY_STRENGTH is not set +# CONFIG_HID_BELKIN is not set +# CONFIG_HID_BETOP_FF is not set +# CONFIG_HID_BIGBEN_FF is not set +# CONFIG_HID_CHERRY is not set +# CONFIG_HID_CHICONY is not set +# CONFIG_HID_CMEDIA is not set +# CONFIG_HID_CORSAIR is not set +# CONFIG_HID_COUGAR is not set +# CONFIG_HID_CP2112 is not set +# CONFIG_HID_CREATIVE_SB0540 is not set +# CONFIG_HID_CYPRESS is not set +# CONFIG_HID_DRAGONRISE is not set +# CONFIG_HID_ELAN is not set +# CONFIG_HID_ELECOM is not set +# CONFIG_HID_ELO is not set +# CONFIG_HID_EMS_FF is not set +# CONFIG_HID_EZKEY is not set +# CONFIG_HID_FT260 is not set +# CONFIG_HID_GEMBIRD is not set +# CONFIG_HID_GENERIC is not set +# CONFIG_HID_GFRM is not set +# CONFIG_HID_GLORIOUS is not set +# CONFIG_HID_GOOGLE_HAMMER is not set +# CONFIG_HID_GREENASIA is not set +# CONFIG_HID_GT683R is not set +# CONFIG_HID_GYRATION is not set +# CONFIG_HID_HOLTEK is not set +# CONFIG_HID_ICADE is not set +# CONFIG_HID_ITE is not set +# CONFIG_HID_JABRA is not set +# CONFIG_HID_KENSINGTON is not set +# CONFIG_HID_KEYTOUCH is not set +# CONFIG_HID_KYE is not set +# CONFIG_HID_LCPOWER is not set +# CONFIG_HID_LED is not set +# CONFIG_HID_LENOVO is not set +# CONFIG_HID_LOGITECH is not set +# CONFIG_HID_LOGITECH_DJ is not set +# CONFIG_HID_LOGITECH_HIDPP is not set +# CONFIG_HID_MACALLY is not set +# CONFIG_HID_MAGICMOUSE is not set +# CONFIG_HID_MALTRON is not set +# CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MCP2221 is not set +# CONFIG_HID_MICROSOFT is not set +# CONFIG_HID_MONTEREY is not set +# CONFIG_HID_MULTITOUCH is not set +# CONFIG_HID_NTI is not set +# CONFIG_HID_NTRIG is not set +# CONFIG_HID_ORTEK is not set +# CONFIG_HID_PANTHERLORD is not set +# CONFIG_HID_PENMOUNT is not set +# CONFIG_HID_PETALYNX is not set +# CONFIG_HID_PICOLCD is not set +# CONFIG_HID_PID is not set +# CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PLAYSTATION is not set +# CONFIG_HID_PRIMAX is not set +# CONFIG_HID_PRODIKEYS is not set +# CONFIG_HID_REDRAGON is not set +# CONFIG_HID_RETRODE is not set +# CONFIG_HID_RMI is not set +# CONFIG_HID_ROCCAT is not set +# CONFIG_HID_SAITEK is not set +# CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SENSOR_HUB is not set +# CONFIG_HID_SMARTJOYPLUS is not set +# CONFIG_HID_SONY is not set +# CONFIG_HID_SPEEDLINK is not set +# CONFIG_HID_STEAM is not set +# CONFIG_HID_STEELSERIES is not set +# CONFIG_HID_SUNPLUS is not set +# CONFIG_HID_THINGM is not set +# CONFIG_HID_THRUSTMASTER is not set +# CONFIG_HID_TIVO is not set +# CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TWINHAN is not set +# CONFIG_HID_U2FZERO is not set +# CONFIG_HID_UCLOGIC is not set +# CONFIG_HID_UDRAW_PS3 is not set +# CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VIVALDI is not set +# CONFIG_HID_WACOM is not set +# CONFIG_HID_WALTOP is not set +# CONFIG_HID_WIIMOTE is not set +# CONFIG_HID_XINMO is not set +# CONFIG_HID_ZEROPLUS is not set +# CONFIG_HID_ZYDACRON is not set +# CONFIG_HIGHMEM is not set +CONFIG_HIGH_RES_TIMERS=y +# CONFIG_HINIC is not set +# CONFIG_HIP04_ETH is not set +# CONFIG_HIPPI is not set +# CONFIG_HISILICON_ERRATUM_161010101 is not set +# CONFIG_HISILICON_ERRATUM_161600802 is not set +# CONFIG_HISI_DMA is not set +# CONFIG_HISI_FEMAC is not set +# CONFIG_HISI_HIKEY_USB is not set +# CONFIG_HIST_TRIGGERS_DEBUG is not set +# CONFIG_HIX5HD2_GMAC is not set +# CONFIG_HMC425 is not set +# CONFIG_HMC6352 is not set +# CONFIG_HNS is not set +# CONFIG_HNS3 is not set +# CONFIG_HNS_DSAF is not set +# CONFIG_HNS_ENET is not set +# CONFIG_HOSTAP is not set +# CONFIG_HOSTAP_CS is not set +# CONFIG_HOSTAP_PCI is not set +# CONFIG_HOSTAP_PLX is not set +# CONFIG_HOTPLUG_CPU is not set +# CONFIG_HOTPLUG_PCI is not set +# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set +# CONFIG_HOTPLUG_PCI_COMPAQ is not set +# CONFIG_HOTPLUG_PCI_CPCI is not set +# CONFIG_HOTPLUG_PCI_IBM is not set +# CONFIG_HOTPLUG_PCI_SHPC is not set +# CONFIG_HP03 is not set +# CONFIG_HP100 is not set +# CONFIG_HP206C is not set +CONFIG_HPET_MMAP_DEFAULT=y +# CONFIG_HPFS_FS is not set +# CONFIG_HP_ILO is not set +# CONFIG_HP_WIRELESS is not set +# CONFIG_HSA_AMD is not set +# CONFIG_HSI is not set +# CONFIG_HSR is not set +# CONFIG_HTC_EGPIO is not set +# CONFIG_HTC_I2CPLD is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_HTS221 is not set +# CONFIG_HTU21 is not set +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +# CONFIG_HVC_DCC is not set +# CONFIG_HVC_UDBG is not set +# CONFIG_HWLAT_TRACER is not set +# CONFIG_HWMON is not set +# CONFIG_HWMON_DEBUG_CHIP is not set +# CONFIG_HWMON_VID is not set +# CONFIG_HWSPINLOCK is not set +# CONFIG_HWSPINLOCK_OMAP is not set +CONFIG_HW_PERF_EVENTS=y +# CONFIG_HW_RANDOM is not set +# CONFIG_HW_RANDOM_AMD is not set +# CONFIG_HW_RANDOM_ARM_SMCCC_TRNG is not set +# CONFIG_HW_RANDOM_ATMEL is not set +# CONFIG_HW_RANDOM_BA431 is not set +# CONFIG_HW_RANDOM_BCM2835 is not set +# CONFIG_HW_RANDOM_CAVIUM is not set +# CONFIG_HW_RANDOM_CCTRNG is not set +# CONFIG_HW_RANDOM_EXYNOS is not set +# CONFIG_HW_RANDOM_GEODE is not set +# CONFIG_HW_RANDOM_INTEL is not set +# CONFIG_HW_RANDOM_IPROC_RNG200 is not set +# CONFIG_HW_RANDOM_MTK is not set +# CONFIG_HW_RANDOM_OMAP is not set +# CONFIG_HW_RANDOM_OMAP3_ROM is not set +# CONFIG_HW_RANDOM_PPC4XX is not set +# CONFIG_HW_RANDOM_TIMERIOMEM is not set +CONFIG_HW_RANDOM_TPM=y +# CONFIG_HW_RANDOM_VIA is not set +# CONFIG_HW_RANDOM_VIRTIO is not set +# CONFIG_HW_RANDOM_XIPHERA is not set +# CONFIG_HX711 is not set +# CONFIG_HYPERV is not set +# CONFIG_HYPERV_TSCPAGE is not set +# CONFIG_HYSDN is not set +CONFIG_HZ=100 +CONFIG_HZ_100=y +# CONFIG_HZ_1000 is not set +# CONFIG_HZ_1024 is not set +# CONFIG_HZ_128 is not set +# CONFIG_HZ_200 is not set +# CONFIG_HZ_24 is not set +# CONFIG_HZ_250 is not set +# CONFIG_HZ_256 is not set +# CONFIG_HZ_300 is not set +# CONFIG_HZ_48 is not set +# CONFIG_HZ_500 is not set +# CONFIG_HZ_PERIODIC is not set +# CONFIG_I2C is not set +# CONFIG_I2C_ALGOBIT is not set +# CONFIG_I2C_ALGOPCA is not set +# CONFIG_I2C_ALGOPCF is not set +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set +# CONFIG_I2C_AU1550 is not set +# CONFIG_I2C_BCM2835 is not set +# CONFIG_I2C_BCM_IPROC is not set +# CONFIG_I2C_BRCMSTB is not set +# CONFIG_I2C_CADENCE is not set +# CONFIG_I2C_CBUS_GPIO is not set +# CONFIG_I2C_CHARDEV is not set +# CONFIG_I2C_COMPAT is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEMUX_PINCTRL is not set +# CONFIG_I2C_DESIGNWARE_PCI is not set +# CONFIG_I2C_DESIGNWARE_PLATFORM is not set +# CONFIG_I2C_DESIGNWARE_SLAVE is not set +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_EG20T is not set +# CONFIG_I2C_ELEKTOR is not set +# CONFIG_I2C_EMEV2 is not set +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_GPIO_FAULT_INJECTOR is not set +# CONFIG_I2C_HELPER_AUTO is not set +# CONFIG_I2C_HID is not set +# CONFIG_I2C_HID_OF is not set +# CONFIG_I2C_HID_OF_GOODIX is not set +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_IBM_IIC is not set +# CONFIG_I2C_IMG is not set +# CONFIG_I2C_ISCH is not set +# CONFIG_I2C_ISMT is not set +# CONFIG_I2C_JZ4780 is not set +# CONFIG_I2C_MLXCPLD is not set +# CONFIG_I2C_MPC is not set +# CONFIG_I2C_MT65XX is not set +# CONFIG_I2C_MUX is not set +# CONFIG_I2C_MUX_GPIO is not set +# CONFIG_I2C_MUX_GPMUX is not set +# CONFIG_I2C_MUX_LTC4306 is not set +# CONFIG_I2C_MUX_MLXCPLD is not set +# CONFIG_I2C_MUX_PCA9541 is not set +# CONFIG_I2C_MUX_PCA954x is not set +# CONFIG_I2C_MUX_PINCTRL is not set +# CONFIG_I2C_MUX_REG is not set +# CONFIG_I2C_MV64XXX is not set +# CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_NOMADIK is not set +# CONFIG_I2C_NVIDIA_GPU is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_OCTEON is not set +# CONFIG_I2C_PARPORT is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_PCA_ISA is not set +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_PXA_PCI is not set +# CONFIG_I2C_PXA_SLAVE is not set +# CONFIG_I2C_RCAR is not set +# CONFIG_I2C_RK3X is not set +# CONFIG_I2C_ROBOTFUZZ_OSIF is not set +# CONFIG_I2C_S3C2410 is not set +# CONFIG_I2C_SCMI is not set +# CONFIG_I2C_SH_MOBILE is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +# CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_SLAVE is not set +# CONFIG_I2C_SLAVE_EEPROM is not set +# CONFIG_I2C_SMBUS is not set +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_THUNDERX is not set +# CONFIG_I2C_TINY_USB is not set +# CONFIG_I2C_VERSATILE is not set +# CONFIG_I2C_VIA is not set +# CONFIG_I2C_VIAPRO is not set +# CONFIG_I2C_VIRTIO is not set +# CONFIG_I2C_XILINX is not set +# CONFIG_I3C is not set +# CONFIG_I40E is not set +# CONFIG_I40EVF is not set +# CONFIG_I6300ESB_WDT is not set +# CONFIG_I82092 is not set +# CONFIG_I82365 is not set +# CONFIG_IAQCORE is not set +# CONFIG_IBM_ASM is not set +# CONFIG_IBM_EMAC_DEBUG is not set +# CONFIG_IBM_EMAC_EMAC4 is not set +# CONFIG_IBM_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_EMAC_MAL_COMMON_ERR is not set +# CONFIG_IBM_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_EMAC_RGMII is not set +# CONFIG_IBM_EMAC_TAH is not set +# CONFIG_IBM_EMAC_ZMII is not set +# CONFIG_ICE is not set +# CONFIG_ICP10100 is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ICST is not set +# CONFIG_IDE is not set +# CONFIG_IDEAPAD_LAPTOP is not set +# CONFIG_IDE_GD is not set +# CONFIG_IDE_PROC_FS is not set +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDLE_PAGE_TRACKING is not set +# CONFIG_IEEE802154 is not set +# CONFIG_IEEE802154_ADF7242 is not set +# CONFIG_IEEE802154_ATUSB is not set +# CONFIG_IEEE802154_CA8210 is not set +# CONFIG_IEEE802154_HWSIM is not set +# CONFIG_IEEE802154_MCR20A is not set +# CONFIG_IFB is not set +# CONFIG_IGB is not set +# CONFIG_IGBVF is not set +# CONFIG_IGC is not set +# CONFIG_IIO is not set +# CONFIG_IIO_BUFFER is not set +# CONFIG_IIO_BUFFER_CB is not set +# CONFIG_IIO_BUFFER_DMA is not set +# CONFIG_IIO_BUFFER_DMAENGINE is not set +# CONFIG_IIO_BUFFER_HDC2010 is not set +# CONFIG_IIO_BUFFER_HW_CONSUMER is not set +# CONFIG_IIO_CONFIGFS is not set +CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 +# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set +# CONFIG_IIO_INTERRUPT_TRIGGER is not set +# CONFIG_IIO_MUX is not set +# CONFIG_IIO_PERIODIC_RTC_TRIGGER is not set +# CONFIG_IIO_RESCALE is not set +# CONFIG_IIO_SIMPLE_DUMMY is not set +# CONFIG_IIO_SSP_SENSORHUB is not set +# CONFIG_IIO_ST_ACCEL_3AXIS is not set +# CONFIG_IIO_ST_GYRO_3AXIS is not set +# CONFIG_IIO_ST_LSM6DSX is not set +# CONFIG_IIO_ST_LSM9DS0 is not set +# CONFIG_IIO_ST_MAGN_3AXIS is not set +# CONFIG_IIO_ST_PRESS is not set +# CONFIG_IIO_SW_DEVICE is not set +# CONFIG_IIO_SW_TRIGGER is not set +# CONFIG_IIO_SYSFS_TRIGGER is not set +# CONFIG_IIO_TRIGGER is not set +# CONFIG_IIO_TRIGGERED_EVENT is not set +# CONFIG_IKCONFIG is not set +# CONFIG_IKCONFIG_PROC is not set +# CONFIG_IKHEADERS is not set +# CONFIG_IMA is not set +# CONFIG_IMGPDC_WDT is not set +# CONFIG_IMG_MDC_DMA is not set +# CONFIG_IMX7D_ADC is not set +# CONFIG_IMX_IPUV3_CORE is not set +# CONFIG_IMX_THERMAL is not set +# CONFIG_INA2XX_ADC is not set +# CONFIG_INDIRECT_PIO is not set +CONFIG_INET=y +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_ESPINTCP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_INET6_TUNNEL is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_DIAG is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_ESPINTCP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_LRO is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 +# CONFIG_INET_TCP_DIAG is not set +# CONFIG_INET_TUNNEL is not set +# CONFIG_INET_UDP_DIAG is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INFINIBAND is not set +# CONFIG_INFTL is not set +# CONFIG_INGENIC_ADC is not set +# CONFIG_INGENIC_CGU_JZ4725B is not set +# CONFIG_INGENIC_CGU_JZ4740 is not set +# CONFIG_INGENIC_CGU_JZ4760 is not set +# CONFIG_INGENIC_CGU_JZ4770 is not set +# CONFIG_INGENIC_CGU_JZ4780 is not set +# CONFIG_INGENIC_CGU_X1000 is not set +# CONFIG_INGENIC_CGU_X1830 is not set +# CONFIG_INGENIC_OST is not set +# CONFIG_INGENIC_SYSOST is not set +# CONFIG_INGENIC_TCU_CLK is not set +# CONFIG_INGENIC_TCU_IRQ is not set +# CONFIG_INGENIC_TIMER is not set +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +# CONFIG_INIT_STACK_ALL_PATTERN is not set +# CONFIG_INIT_STACK_ALL_ZERO is not set +CONFIG_INIT_STACK_NONE=y +CONFIG_INOTIFY_USER=y +# CONFIG_INPUT is not set +# CONFIG_INPUT_AD714X is not set +# CONFIG_INPUT_ADXL34X is not set +# CONFIG_INPUT_APANEL is not set +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_ATLAS_BTNS is not set +# CONFIG_INPUT_ATMEL_CAPTOUCH is not set +# CONFIG_INPUT_AXP20X_PEK is not set +# CONFIG_INPUT_BMA150 is not set +# CONFIG_INPUT_CM109 is not set +# CONFIG_INPUT_CMA3000 is not set +# CONFIG_INPUT_DA7280_HAPTICS is not set +# CONFIG_INPUT_DRV260X_HAPTICS is not set +# CONFIG_INPUT_DRV2665_HAPTICS is not set +# CONFIG_INPUT_DRV2667_HAPTICS is not set +# CONFIG_INPUT_E3X0_BUTTON is not set +# CONFIG_INPUT_EVBUG is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_GP2A is not set +# CONFIG_INPUT_GPIO_BEEPER is not set +# CONFIG_INPUT_GPIO_DECODER is not set +# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +# CONFIG_INPUT_GPIO_TILT_POLLED is not set +# CONFIG_INPUT_GPIO_VIBRA is not set +# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set +# CONFIG_INPUT_IMS_PCU is not set +# CONFIG_INPUT_IQS269A is not set +# CONFIG_INPUT_IQS626A is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_KXTJ9 is not set +# CONFIG_INPUT_LEDS is not set +# CONFIG_INPUT_MATRIXKMAP is not set +# CONFIG_INPUT_MAX8997_HAPTIC is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_MMA8450 is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_MPU3050 is not set +# CONFIG_INPUT_MSM_VIBRATOR is not set +# CONFIG_INPUT_PALMAS_PWRBUTTON is not set +# CONFIG_INPUT_PCF8574 is not set +# CONFIG_INPUT_PCSPKR is not set +# CONFIG_INPUT_PM8941_PWRKEY is not set +# CONFIG_INPUT_PM8XXX_VIBRATOR is not set +# CONFIG_INPUT_POLLDEV is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_PWM_BEEPER is not set +# CONFIG_INPUT_PWM_VIBRA is not set +# CONFIG_INPUT_REGULATOR_HAPTIC is not set +# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set +# CONFIG_INPUT_SPARSEKMAP is not set +# CONFIG_INPUT_TABLET is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_TPS65218_PWRBUTTON is not set +# CONFIG_INPUT_TWL4030_PWRBUTTON is not set +# CONFIG_INPUT_TWL4030_VIBRA is not set +# CONFIG_INPUT_TWL6040_VIBRA is not set +# CONFIG_INPUT_UINPUT is not set +# CONFIG_INPUT_WISTRON_BTNS is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INT340X_THERMAL is not set +# CONFIG_INTEGRITY is not set +# CONFIG_INTEGRITY_AUDIT is not set +# CONFIG_INTEGRITY_SIGNATURE is not set +# CONFIG_INTEL_ATOMISP2_LED is not set +# CONFIG_INTEL_ATOMISP2_PM is not set +# CONFIG_INTEL_CHT_INT33FE is not set +# CONFIG_INTEL_HID_EVENT is not set +# CONFIG_INTEL_IDLE is not set +# CONFIG_INTEL_IDMA64 is not set +# CONFIG_INTEL_IDXD is not set +# CONFIG_INTEL_IDXD_COMPAT is not set +# CONFIG_INTEL_INT0002_VGPIO is not set +# CONFIG_INTEL_IOATDMA is not set +# CONFIG_INTEL_ISH_HID is not set +# CONFIG_INTEL_MEI is not set +# CONFIG_INTEL_MEI_ME is not set +# CONFIG_INTEL_MEI_TXE is not set +# CONFIG_INTEL_MIC_CARD is not set +# CONFIG_INTEL_MIC_HOST is not set +# CONFIG_INTEL_MID_PTI is not set +# CONFIG_INTEL_OAKTRAIL is not set +# CONFIG_INTEL_PMC_CORE is not set +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_SOC_PMIC is not set +# CONFIG_INTEL_SOC_PMIC_CHTDC_TI is not set +# CONFIG_INTEL_SOC_PMIC_CHTWC is not set +# CONFIG_INTEL_TH is not set +# CONFIG_INTEL_VBTN is not set +# CONFIG_INTEL_XWAY_PHY is not set +# CONFIG_INTERCONNECT is not set +# CONFIG_INTERVAL_TREE_TEST is not set +# CONFIG_INV_ICM42600_I2C is not set +# CONFIG_INV_ICM42600_SPI is not set +# CONFIG_INV_MPU6050_I2C is not set +# CONFIG_INV_MPU6050_IIO is not set +# CONFIG_INV_MPU6050_SPI is not set +# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +# CONFIG_IOMMU_SUPPORT is not set +# CONFIG_IONIC is not set +# CONFIG_IOSCHED_BFQ is not set +# CONFIG_IOSM is not set +CONFIG_IO_STRICT_DEVMEM=y +# CONFIG_IO_URING is not set +CONFIG_IO_WQ=y +# CONFIG_IP17XX_PHY is not set +# CONFIG_IP6_NF_FILTER is not set +# CONFIG_IP6_NF_IPTABLES is not set +# CONFIG_IP6_NF_MANGLE is not set +# CONFIG_IP6_NF_MATCH_AH is not set +# CONFIG_IP6_NF_MATCH_EUI64 is not set +# CONFIG_IP6_NF_MATCH_FRAG is not set +# CONFIG_IP6_NF_MATCH_HL is not set +# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set +# CONFIG_IP6_NF_MATCH_MH is not set +# CONFIG_IP6_NF_MATCH_OPTS is not set +# CONFIG_IP6_NF_MATCH_RPFILTER is not set +# CONFIG_IP6_NF_MATCH_RT is not set +# CONFIG_IP6_NF_MATCH_SRH is not set +# CONFIG_IP6_NF_NAT is not set +# CONFIG_IP6_NF_RAW is not set +# CONFIG_IP6_NF_SECURITY is not set +# CONFIG_IP6_NF_TARGET_HL is not set +# CONFIG_IP6_NF_TARGET_MASQUERADE is not set +# CONFIG_IP6_NF_TARGET_REJECT is not set +# CONFIG_IP6_NF_TARGET_SYNPROXY is not set +# CONFIG_IPACK_BUS is not set +# CONFIG_IPC_NS is not set +# CONFIG_IPMB_DEVICE_INTERFACE is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_IPV6 is not set +# CONFIG_IPV6_FOU is not set +# CONFIG_IPV6_FOU_TUNNEL is not set +# CONFIG_IPV6_ILA is not set +# CONFIG_IPV6_IOAM6_LWTUNNEL is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6_MROUTE_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +CONFIG_IPV6_NDISC_NODETYPE=y +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_ROUTE_INFO is not set +# CONFIG_IPV6_RPL_LWTUNNEL is not set +# CONFIG_IPV6_SEG6_HMAC is not set +# CONFIG_IPV6_SEG6_LWTUNNEL is not set +# CONFIG_IPV6_SIT is not set +# CONFIG_IPV6_SIT_6RD is not set +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_VTI is not set +# CONFIG_IPVLAN is not set +# CONFIG_IPVTAP is not set +# CONFIG_IPW2100 is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2100_MONITOR=y +# CONFIG_IPW2200 is not set +# CONFIG_IPW2200_DEBUG is not set +CONFIG_IPW2200_MONITOR=y +# CONFIG_IPW2200_PROMISCUOUS is not set +# CONFIG_IPW2200_QOS is not set +# CONFIG_IPW2200_RADIOTAP is not set +# CONFIG_IPWIRELESS is not set +# CONFIG_IPX is not set +CONFIG_IP_ADVANCED_ROUTER=y +# CONFIG_IP_DCCP is not set +# CONFIG_IP_FIB_TRIE_STATS is not set +# CONFIG_IP_MROUTE is not set +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_MULTIPLE_TABLES=y +# CONFIG_IP_NF_ARPFILTER is not set +# CONFIG_IP_NF_ARPTABLES is not set +# CONFIG_IP_NF_ARP_MANGLE is not set +# CONFIG_IP_NF_FILTER is not set +# CONFIG_IP_NF_IPTABLES is not set +# CONFIG_IP_NF_MANGLE is not set +# CONFIG_IP_NF_MATCH_AH is not set +# CONFIG_IP_NF_MATCH_ECN is not set +# CONFIG_IP_NF_MATCH_RPFILTER is not set +# CONFIG_IP_NF_MATCH_TTL is not set +# CONFIG_IP_NF_RAW is not set +# CONFIG_IP_NF_SECURITY is not set +# CONFIG_IP_NF_TARGET_CLUSTERIP is not set +# CONFIG_IP_NF_TARGET_ECN is not set +# CONFIG_IP_NF_TARGET_MASQUERADE is not set +# CONFIG_IP_NF_TARGET_NETMAP is not set +# CONFIG_IP_NF_TARGET_REDIRECT is not set +# CONFIG_IP_NF_TARGET_REJECT is not set +# CONFIG_IP_NF_TARGET_SYNPROXY is not set +# CONFIG_IP_NF_TARGET_TTL is not set +# CONFIG_IP_PIMSM_V1 is not set +# CONFIG_IP_PIMSM_V2 is not set +# CONFIG_IP_PNP is not set +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_SCTP is not set +# CONFIG_IP_SET is not set +# CONFIG_IP_SET_HASH_IPMAC is not set +# CONFIG_IP_VS is not set +# CONFIG_IP_VS_MH is not set +CONFIG_IP_VS_MH_TAB_INDEX=10 +# CONFIG_IP_VS_TWOS is not set +# CONFIG_IRDA is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_IRQ_ALL_CPUS is not set +# CONFIG_IRQ_DOMAIN_DEBUG is not set +# CONFIG_IRQ_POLL is not set +# CONFIG_IRQ_TIME_ACCOUNTING is not set +# CONFIG_IR_GPIO_CIR is not set +# CONFIG_IR_HIX5HD2 is not set +# CONFIG_IR_IGORPLUGUSB is not set +# CONFIG_IR_IGUANA is not set +# CONFIG_IR_IMG is not set +# CONFIG_IR_IMON is not set +# CONFIG_IR_IMON_RAW is not set +# CONFIG_IR_JVC_DECODER is not set +# CONFIG_IR_LIRC_CODEC is not set +# CONFIG_IR_MCEUSB is not set +# CONFIG_IR_NEC_DECODER is not set +# CONFIG_IR_RC5_DECODER is not set +# CONFIG_IR_RC6_DECODER is not set +# CONFIG_IR_REDRAT3 is not set +# CONFIG_IR_SERIAL is not set +# CONFIG_IR_SIR is not set +# CONFIG_IR_SONY_DECODER is not set +# CONFIG_IR_STREAMZAP is not set +# CONFIG_IR_TOY is not set +# CONFIG_IR_TTUSBIR is not set +# CONFIG_ISA_BUS is not set +# CONFIG_ISA_BUS_API is not set +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_ISCSI_TCP is not set +CONFIG_ISDN=y +# CONFIG_ISDN_AUDIO is not set +# CONFIG_ISDN_CAPI is not set +# CONFIG_ISDN_CAPI_CAPIDRV is not set +# CONFIG_ISDN_DIVERSION is not set +# CONFIG_ISDN_DRV_ACT2000 is not set +# CONFIG_ISDN_DRV_GIGASET is not set +# CONFIG_ISDN_DRV_HISAX is not set +# CONFIG_ISDN_DRV_ICN is not set +# CONFIG_ISDN_DRV_LOOP is not set +# CONFIG_ISDN_DRV_PCBIT is not set +# CONFIG_ISDN_DRV_SC is not set +# CONFIG_ISDN_I4L is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_ISL29125 is not set +# CONFIG_ISL29501 is not set +# CONFIG_ISO9660_FS is not set +# CONFIG_ISS4xx is not set +# CONFIG_ITG3200 is not set +# CONFIG_IWL3945 is not set +# CONFIG_IWLWIFI is not set +# CONFIG_IXGB is not set +# CONFIG_IXGBE is not set +# CONFIG_IXGBEVF is not set +# CONFIG_JAILHOUSE_GUEST is not set +# CONFIG_JBD2_DEBUG is not set +# CONFIG_JFFS2_CMODE_FAVOURLZO is not set +# CONFIG_JFFS2_CMODE_NONE is not set +CONFIG_JFFS2_CMODE_PRIORITY=y +# CONFIG_JFFS2_CMODE_SIZE is not set +CONFIG_JFFS2_COMPRESSION_OPTIONS=y +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_FS_POSIX_ACL is not set +# CONFIG_JFFS2_FS_SECURITY is not set +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +CONFIG_JFFS2_FS_WRITEBUFFER=y +CONFIG_JFFS2_FS_XATTR=y +CONFIG_JFFS2_LZMA=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_JFFS2_SUMMARY=y +# CONFIG_JFFS2_ZLIB is not set +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_FS is not set +# CONFIG_JFS_POSIX_ACL is not set +# CONFIG_JFS_SECURITY is not set +# CONFIG_JFS_STATISTICS is not set +# CONFIG_JME is not set +CONFIG_JOLIET=y +# CONFIG_JSA1212 is not set +# CONFIG_JUMP_LABEL is not set +# CONFIG_JZ4740_WDT is not set +# CONFIG_JZ4770_PHY is not set +# CONFIG_KALLSYMS is not set +# CONFIG_KALLSYMS_ABSOLUTE_PERCPU is not set +# CONFIG_KALLSYMS_ALL is not set +CONFIG_KALLSYMS_BASE_RELATIVE=y +# CONFIG_KALLSYMS_UNCOMPRESSED is not set +# CONFIG_KARMA_PARTITION is not set +# CONFIG_KASAN is not set +# CONFIG_KASAN_MODULE_TEST is not set +CONFIG_KASAN_STACK=y +# CONFIG_KCMP is not set +# CONFIG_KCOV is not set +CONFIG_KCOV_IRQ_AREA_SIZE=0x40000 +# CONFIG_KCSAN is not set +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_CAT is not set +# CONFIG_KERNEL_GZIP is not set +# CONFIG_KERNEL_LZ4 is not set +# CONFIG_KERNEL_LZMA is not set +# CONFIG_KERNEL_LZO is not set +CONFIG_KERNEL_MODE_NEON=y +CONFIG_KERNEL_XZ=y +# CONFIG_KERNEL_ZSTD is not set +CONFIG_KERNFS=y +# CONFIG_KEXEC is not set +# CONFIG_KEXEC_FILE is not set +# CONFIG_KEXEC_SIG is not set +# CONFIG_KEYBOARD_ADC is not set +# CONFIG_KEYBOARD_ADP5588 is not set +# CONFIG_KEYBOARD_ADP5589 is not set +# CONFIG_KEYBOARD_APPLESPI is not set +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_BCM is not set +# CONFIG_KEYBOARD_CAP11XX is not set +# CONFIG_KEYBOARD_DLINK_DIR685 is not set +# CONFIG_KEYBOARD_GPIO is not set +# CONFIG_KEYBOARD_GPIO_POLLED is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_LM8323 is not set +# CONFIG_KEYBOARD_LM8333 is not set +# CONFIG_KEYBOARD_MATRIX is not set +# CONFIG_KEYBOARD_MAX7359 is not set +# CONFIG_KEYBOARD_MCS is not set +# CONFIG_KEYBOARD_MPR121 is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OMAP4 is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_PXA27x is not set +# CONFIG_KEYBOARD_QT1050 is not set +# CONFIG_KEYBOARD_QT1070 is not set +# CONFIG_KEYBOARD_QT2160 is not set +# CONFIG_KEYBOARD_SAMSUNG is not set +# CONFIG_KEYBOARD_SH_KEYSC is not set +# CONFIG_KEYBOARD_SNVS_PWRKEY is not set +# CONFIG_KEYBOARD_STMPE is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_TCA6416 is not set +# CONFIG_KEYBOARD_TCA8418 is not set +# CONFIG_KEYBOARD_TEGRA is not set +# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set +# CONFIG_KEYBOARD_TWL4030 is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYS is not set +# CONFIG_KEYS_REQUEST_CACHE is not set +# CONFIG_KEY_DH_OPERATIONS is not set +# CONFIG_KFENCE is not set +# CONFIG_KGDB is not set +# CONFIG_KMEMCHECK is not set +# CONFIG_KMX61 is not set +# CONFIG_KPC2000 is not set +# CONFIG_KPROBES is not set +# CONFIG_KPROBES_SANITY_TEST is not set +# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set +# CONFIG_KPROBE_EVENT_GEN_TEST is not set +# CONFIG_KS7010 is not set +# CONFIG_KS8842 is not set +# CONFIG_KS8851 is not set +# CONFIG_KS8851_MLL is not set +# CONFIG_KSM is not set +# CONFIG_KSZ884X_PCI is not set +# CONFIG_KUNIT is not set +CONFIG_KUSER_HELPERS=y +# CONFIG_KVM_AMD is not set +# CONFIG_KVM_AMD_SEV is not set +# CONFIG_KVM_GUEST is not set +# CONFIG_KVM_INTEL is not set +# CONFIG_KVM_WERROR is not set +# CONFIG_KVM_XEN is not set +# CONFIG_KXCJK1013 is not set +# CONFIG_KXSD9 is not set +# CONFIG_L2TP is not set +# CONFIG_L2TP_ETH is not set +# CONFIG_L2TP_IP is not set +# CONFIG_L2TP_V3 is not set +# CONFIG_LAN743X is not set +# CONFIG_LANMEDIA is not set +# CONFIG_LANTIQ is not set +# CONFIG_LAPB is not set +# CONFIG_LASAT is not set +# CONFIG_LATENCYTOP is not set +# CONFIG_LATTICE_ECP3_CONFIG is not set +CONFIG_LBDAF=y +# CONFIG_LCD_AMS369FG06 is not set +# CONFIG_LCD_CLASS_DEVICE is not set +# CONFIG_LCD_HX8357 is not set +# CONFIG_LCD_ILI922X is not set +# CONFIG_LCD_ILI9320 is not set +# CONFIG_LCD_L4F00242T03 is not set +# CONFIG_LCD_LD9040 is not set +# CONFIG_LCD_LMS283GF05 is not set +# CONFIG_LCD_LMS501KF03 is not set +# CONFIG_LCD_LTV350QV is not set +# CONFIG_LCD_OTM3225A is not set +# CONFIG_LCD_S6E63M0 is not set +# CONFIG_LCD_TDO24M is not set +# CONFIG_LCD_VGG2432A4 is not set +CONFIG_LDISC_AUTOLOAD=y +# CONFIG_LDM_PARTITION is not set +CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y +# CONFIG_LD_HEAD_STUB_CATCH is not set +# CONFIG_LEDS_AN30259A is not set +# CONFIG_LEDS_APU is not set +# CONFIG_LEDS_AW2013 is not set +# CONFIG_LEDS_BCM6328 is not set +# CONFIG_LEDS_BCM6358 is not set +# CONFIG_LEDS_BD2802 is not set +# CONFIG_LEDS_BLINKM is not set +CONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y +CONFIG_LEDS_CLASS=y +# CONFIG_LEDS_CLASS_FLASH is not set +CONFIG_LEDS_CLASS_MULTICOLOR=y +# CONFIG_LEDS_CR0014114 is not set +# CONFIG_LEDS_DAC124S085 is not set +# CONFIG_LEDS_EL15203000 is not set +# CONFIG_LEDS_GPIO is not set +# CONFIG_LEDS_INTEL_SS4200 is not set +# CONFIG_LEDS_IS31FL319X is not set +# CONFIG_LEDS_IS31FL32XX is not set +# CONFIG_LEDS_LM3530 is not set +# CONFIG_LEDS_LM3532 is not set +# CONFIG_LEDS_LM355x is not set +# CONFIG_LEDS_LM3642 is not set +# CONFIG_LEDS_LM3692X is not set +# CONFIG_LEDS_LP3944 is not set +# CONFIG_LEDS_LP3952 is not set +# CONFIG_LEDS_LP50XX is not set +# CONFIG_LEDS_LP5521 is not set +# CONFIG_LEDS_LP5523 is not set +# CONFIG_LEDS_LP5562 is not set +# CONFIG_LEDS_LP55XX_COMMON is not set +# CONFIG_LEDS_LP8501 is not set +# CONFIG_LEDS_LP8860 is not set +# CONFIG_LEDS_LT3593 is not set +# CONFIG_LEDS_MLXCPLD is not set +# CONFIG_LEDS_MLXREG is not set +# CONFIG_LEDS_NIC78BX is not set +# CONFIG_LEDS_NS2 is not set +# CONFIG_LEDS_OT200 is not set +# CONFIG_LEDS_PCA9532 is not set +# CONFIG_LEDS_PCA955X is not set +# CONFIG_LEDS_PCA963X is not set +# CONFIG_LEDS_PWM is not set +# CONFIG_LEDS_REGULATOR is not set +# CONFIG_LEDS_SPI_BYTE is not set +# CONFIG_LEDS_SYSCON is not set +# CONFIG_LEDS_TCA6507 is not set +# CONFIG_LEDS_TI_LMU_COMMON is not set +# CONFIG_LEDS_TLC591XX is not set +CONFIG_LEDS_TRIGGERS=y +# CONFIG_LEDS_TRIGGER_ACTIVITY is not set +# CONFIG_LEDS_TRIGGER_AUDIO is not set +# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set +# CONFIG_LEDS_TRIGGER_CAMERA is not set +# CONFIG_LEDS_TRIGGER_CPU is not set +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y +# CONFIG_LEDS_TRIGGER_DISK is not set +# CONFIG_LEDS_TRIGGER_GPIO is not set +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +# CONFIG_LEDS_TRIGGER_MTD is not set +CONFIG_LEDS_TRIGGER_NETDEV=y +# CONFIG_LEDS_TRIGGER_ONESHOT is not set +# CONFIG_LEDS_TRIGGER_PANIC is not set +# CONFIG_LEDS_TRIGGER_PATTERN is not set +CONFIG_LEDS_TRIGGER_TIMER=y +# CONFIG_LEDS_TRIGGER_TRANSIENT is not set +# CONFIG_LEDS_TRIGGER_TTY is not set +# CONFIG_LEDS_TURRIS_OMNIA is not set +# CONFIG_LEDS_USER is not set +# CONFIG_LED_TRIGGER_PHY is not set +# CONFIG_LEGACY_PTYS is not set +# CONFIG_LGUEST is not set +# CONFIG_LIB80211 is not set +# CONFIG_LIB80211_CRYPT_CCMP is not set +# CONFIG_LIB80211_CRYPT_TKIP is not set +# CONFIG_LIB80211_CRYPT_WEP is not set +# CONFIG_LIB80211_DEBUG is not set +# CONFIG_LIBCRC32C is not set +# CONFIG_LIBERTAS is not set +# CONFIG_LIBERTAS_THINFIRM is not set +# CONFIG_LIBERTAS_USB is not set +# CONFIG_LIBFC is not set +# CONFIG_LIBFCOE is not set +# CONFIG_LIBIPW_DEBUG is not set +# CONFIG_LIBNVDIMM is not set +CONFIG_LIB_MEMNEQ=y +# CONFIG_LIDAR_LITE_V2 is not set +CONFIG_LINEAR_RANGES=y +# CONFIG_LIQUIDIO is not set +# CONFIG_LIQUIDIO_VF is not set +# CONFIG_LIRC is not set +# CONFIG_LIS3L02DQ is not set +# CONFIG_LITEX_LITEETH is not set +# CONFIG_LITEX_SOC_CONTROLLER is not set +# CONFIG_LIVEPATCH is not set +# CONFIG_LKDTM is not set +CONFIG_LLC=y +# CONFIG_LLC2 is not set +# CONFIG_LMK04832 is not set +# CONFIG_LMP91000 is not set +# CONFIG_LNET is not set +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +# CONFIG_LOCKD is not set +CONFIG_LOCKDEP_BITS=15 +CONFIG_LOCKDEP_CHAINS_BITS=16 +CONFIG_LOCKDEP_CIRCULAR_QUEUE_BITS=12 +CONFIG_LOCKDEP_STACK_TRACE_BITS=19 +CONFIG_LOCKDEP_STACK_TRACE_HASH_BITS=14 +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_LOCKD_V4=y +# CONFIG_LOCKUP_DETECTOR is not set +# CONFIG_LOCK_EVENT_COUNTS is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_LOCK_TORTURE_TEST is not set +# CONFIG_LOGFS is not set +# CONFIG_LOGIG940_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIWHEELS_FF is not set +# CONFIG_LOGO is not set +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +# CONFIG_LOONGSON_MC146818 is not set +# CONFIG_LPC_ICH is not set +# CONFIG_LPC_SCH is not set +# CONFIG_LP_CONSOLE is not set +CONFIG_LRU_GEN=y +CONFIG_LRU_GEN_ENABLED=y +# CONFIG_LRU_GEN_STATS is not set +# CONFIG_LSI_ET1011C_PHY is not set +CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity" +CONFIG_LSM_MMAP_MIN_ADDR=65536 +# CONFIG_LTC1660 is not set +# CONFIG_LTC2471 is not set +# CONFIG_LTC2485 is not set +# CONFIG_LTC2496 is not set +# CONFIG_LTC2497 is not set +# CONFIG_LTC2632 is not set +# CONFIG_LTC2983 is not set +# CONFIG_LTE_GDM724X is not set +CONFIG_LTO_NONE=y +# CONFIG_LTPC is not set +# CONFIG_LTR501 is not set +# CONFIG_LUSTRE_FS is not set +# CONFIG_LV0104CS is not set +# CONFIG_LWTUNNEL is not set +# CONFIG_LXT_PHY is not set +# CONFIG_LZ4HC_COMPRESS is not set +# CONFIG_LZ4_COMPRESS is not set +# CONFIG_LZ4_DECOMPRESS is not set +CONFIG_LZMA_COMPRESS=y +CONFIG_LZMA_DECOMPRESS=y +# CONFIG_LZO_COMPRESS is not set +# CONFIG_LZO_DECOMPRESS is not set +# CONFIG_M62332 is not set +# CONFIG_MAC80211 is not set +# CONFIG_MAC80211_MESSAGE_TRACING is not set +CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 +# CONFIG_MACB is not set +# CONFIG_MACH_ASM9260 is not set +# CONFIG_MACH_DECSTATION is not set +# CONFIG_MACH_INGENIC is not set +# CONFIG_MACH_INGENIC_SOC is not set +# CONFIG_MACH_JAZZ is not set +# CONFIG_MACH_JZ4740 is not set +# CONFIG_MACH_LOONGSON2EF is not set +# CONFIG_MACH_LOONGSON32 is not set +# CONFIG_MACH_LOONGSON64 is not set +# CONFIG_MACH_NINTENDO64 is not set +# CONFIG_MACH_PIC32 is not set +# CONFIG_MACH_PISTACHIO is not set +# CONFIG_MACH_REALTEK_RTL is not set +# CONFIG_MACH_TX39XX is not set +# CONFIG_MACH_TX49XX is not set +# CONFIG_MACH_VR41XX is not set +# CONFIG_MACH_XILFPGA is not set +# CONFIG_MACINTOSH_DRIVERS is not set +# CONFIG_MACSEC is not set +# CONFIG_MACVLAN is not set +# CONFIG_MACVTAP is not set +# CONFIG_MAC_EMUMOUSEBTN is not set +# CONFIG_MAC_PARTITION is not set +# CONFIG_MAG3110 is not set +# CONFIG_MAGIC_SYSRQ is not set +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 +# CONFIG_MAGIC_SYSRQ_SERIAL is not set +CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" +# CONFIG_MAILBOX is not set +# CONFIG_MANAGER_SBS is not set +# CONFIG_MANDATORY_FILE_LOCKING is not set +# CONFIG_MANGLE_BOOTARGS is not set +# CONFIG_MARVELL_10G_PHY is not set +# CONFIG_MARVELL_88X2222_PHY is not set +# CONFIG_MARVELL_PHY is not set +# CONFIG_MAX1027 is not set +# CONFIG_MAX11100 is not set +# CONFIG_MAX1118 is not set +# CONFIG_MAX1241 is not set +# CONFIG_MAX1363 is not set +# CONFIG_MAX30100 is not set +# CONFIG_MAX30102 is not set +# CONFIG_MAX31856 is not set +# CONFIG_MAX44000 is not set +# CONFIG_MAX44009 is not set +# CONFIG_MAX517 is not set +# CONFIG_MAX5432 is not set +# CONFIG_MAX5481 is not set +# CONFIG_MAX5487 is not set +# CONFIG_MAX5821 is not set +# CONFIG_MAX63XX_WATCHDOG is not set +# CONFIG_MAX9611 is not set +# CONFIG_MAXIM_THERMOCOUPLE is not set +# CONFIG_MAXLINEAR_GPHY is not set +CONFIG_MAY_USE_DEVLINK=y +# CONFIG_MB1232 is not set +# CONFIG_MC3230 is not set +# CONFIG_MCB is not set +# CONFIG_MCP320X is not set +# CONFIG_MCP3422 is not set +# CONFIG_MCP3911 is not set +# CONFIG_MCP4018 is not set +# CONFIG_MCP41010 is not set +# CONFIG_MCP4131 is not set +# CONFIG_MCP4531 is not set +# CONFIG_MCP4725 is not set +# CONFIG_MCP4922 is not set +# CONFIG_MCPM is not set +# CONFIG_MCTP is not set +# CONFIG_MD is not set +# CONFIG_MDIO_BCM_UNIMAC is not set +# CONFIG_MDIO_BITBANG is not set +# CONFIG_MDIO_BUS_MUX_GPIO is not set +# CONFIG_MDIO_BUS_MUX_MMIOREG is not set +# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set +# CONFIG_MDIO_DEVICE is not set +# CONFIG_MDIO_DEVRES is not set +# CONFIG_MDIO_HISI_FEMAC is not set +# CONFIG_MDIO_IPQ4019 is not set +# CONFIG_MDIO_IPQ8064 is not set +# CONFIG_MDIO_MSCC_MIIM is not set +# CONFIG_MDIO_MVUSB is not set +# CONFIG_MDIO_OCTEON is not set +# CONFIG_MDIO_THUNDER is not set +# CONFIG_MDIO_XPCS is not set +# CONFIG_MDM_GCC_9607 is not set +# CONFIG_MD_FAULTY is not set +# CONFIG_MEDIATEK_GE_PHY is not set +# CONFIG_MEDIATEK_MT6577_AUXADC is not set +# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set +# CONFIG_MEDIA_ATTACH is not set +# CONFIG_MEDIA_CAMERA_SUPPORT is not set +# CONFIG_MEDIA_CEC_SUPPORT is not set +# CONFIG_MEDIA_CONTROLLER is not set +# CONFIG_MEDIA_CONTROLLER_DVB is not set +# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set +# CONFIG_MEDIA_PCI_SUPPORT is not set +# CONFIG_MEDIA_PLATFORM_SUPPORT is not set +# CONFIG_MEDIA_RADIO_SUPPORT is not set +# CONFIG_MEDIA_RC_SUPPORT is not set +# CONFIG_MEDIA_SDR_SUPPORT is not set +# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set +# CONFIG_MEDIA_SUPPORT is not set +# CONFIG_MEDIA_SUPPORT_FILTER is not set +# CONFIG_MEDIA_TEST_SUPPORT is not set +# CONFIG_MEDIA_TUNER_E4000 is not set +# CONFIG_MEDIA_TUNER_FC0011 is not set +# CONFIG_MEDIA_TUNER_FC0012 is not set +# CONFIG_MEDIA_TUNER_FC0013 is not set +# CONFIG_MEDIA_TUNER_FC2580 is not set +# CONFIG_MEDIA_TUNER_IT913X is not set +# CONFIG_MEDIA_TUNER_M88RS6000T is not set +# CONFIG_MEDIA_TUNER_MAX2165 is not set +# CONFIG_MEDIA_TUNER_MC44S803 is not set +# CONFIG_MEDIA_TUNER_MSI001 is not set +# CONFIG_MEDIA_TUNER_MT2060 is not set +# CONFIG_MEDIA_TUNER_MT2063 is not set +# CONFIG_MEDIA_TUNER_MT20XX is not set +# CONFIG_MEDIA_TUNER_MT2131 is not set +# CONFIG_MEDIA_TUNER_MT2266 is not set +# CONFIG_MEDIA_TUNER_MXL301RF is not set +# CONFIG_MEDIA_TUNER_MXL5005S is not set +# CONFIG_MEDIA_TUNER_MXL5007T is not set +# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set +# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set +# CONFIG_MEDIA_TUNER_QT1010 is not set +# CONFIG_MEDIA_TUNER_R820T is not set +# CONFIG_MEDIA_TUNER_SI2157 is not set +# CONFIG_MEDIA_TUNER_SIMPLE is not set +# CONFIG_MEDIA_TUNER_TDA18212 is not set +# CONFIG_MEDIA_TUNER_TDA18218 is not set +# CONFIG_MEDIA_TUNER_TDA18250 is not set +# CONFIG_MEDIA_TUNER_TDA18271 is not set +# CONFIG_MEDIA_TUNER_TDA827X is not set +# CONFIG_MEDIA_TUNER_TDA8290 is not set +# CONFIG_MEDIA_TUNER_TDA9887 is not set +# CONFIG_MEDIA_TUNER_TEA5761 is not set +# CONFIG_MEDIA_TUNER_TEA5767 is not set +# CONFIG_MEDIA_TUNER_TUA9001 is not set +# CONFIG_MEDIA_TUNER_XC2028 is not set +# CONFIG_MEDIA_TUNER_XC4000 is not set +# CONFIG_MEDIA_TUNER_XC5000 is not set +# CONFIG_MEDIA_USB_SUPPORT is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_MELLANOX_PLATFORM is not set +CONFIG_MEMBARRIER=y +# CONFIG_MEMORY is not set +# CONFIG_MEMORY_FAILURE is not set +# CONFIG_MEMORY_HOTPLUG is not set +# CONFIG_MEMSTICK is not set +# CONFIG_MEMTEST is not set +# CONFIG_MEN_A21_WDT is not set +# CONFIG_MESON_SM is not set +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_AAT2870_CORE is not set +# CONFIG_MFD_AC100 is not set +# CONFIG_MFD_ACT8945A is not set +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_AS3711 is not set +# CONFIG_MFD_AS3722 is not set +# CONFIG_MFD_ASIC3 is not set +# CONFIG_MFD_ATC260X_I2C is not set +# CONFIG_MFD_ATMEL_FLEXCOM is not set +# CONFIG_MFD_ATMEL_HLCDC is not set +# CONFIG_MFD_AXP20X is not set +# CONFIG_MFD_AXP20X_I2C is not set +# CONFIG_MFD_BCM590XX is not set +# CONFIG_MFD_BD9571MWV is not set +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_CPCAP is not set +# CONFIG_MFD_CROS_EC is not set +# CONFIG_MFD_CS5535 is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_DA9062 is not set +# CONFIG_MFD_DA9063 is not set +# CONFIG_MFD_DA9150 is not set +# CONFIG_MFD_DLN2 is not set +# CONFIG_MFD_EXYNOS_LPASS is not set +# CONFIG_MFD_GATEWORKS_GSC is not set +# CONFIG_MFD_HI6421_PMIC is not set +# CONFIG_MFD_INTEL_M10_BMC is not set +# CONFIG_MFD_INTEL_PMT is not set +# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set +# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_JANZ_CMODIO is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_LOCHNAGAR is not set +# CONFIG_MFD_LP3943 is not set +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_MADERA is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77620 is not set +# CONFIG_MFD_MAX77650 is not set +# CONFIG_MFD_MAX77686 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX77843 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_MFD_MC13XXX is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MENF21BMC is not set +# CONFIG_MFD_MP2629 is not set +# CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_NTXEC is not set +# CONFIG_MFD_OMAP_USB_HOST is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_PM8921_CORE is not set +# CONFIG_MFD_PM8XXX is not set +# CONFIG_MFD_QCOM_PM8008 is not set +# CONFIG_MFD_RC5T583 is not set +# CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_RK808 is not set +# CONFIG_MFD_RN5T618 is not set +# CONFIG_MFD_ROHM_BD70528 is not set +# CONFIG_MFD_ROHM_BD71828 is not set +# CONFIG_MFD_ROHM_BD718XX is not set +# CONFIG_MFD_ROHM_BD957XMUF is not set +# CONFIG_MFD_RSMU_I2C is not set +# CONFIG_MFD_RSMU_SPI is not set +# CONFIG_MFD_RT4831 is not set +# CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RTSX_PCI is not set +# CONFIG_MFD_RTSX_USB is not set +# CONFIG_MFD_SEC_CORE is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SKY81452 is not set +# CONFIG_MFD_SL28CPLD is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SMSC is not set +# CONFIG_MFD_STMFX is not set +# CONFIG_MFD_STMPE is not set +# CONFIG_MFD_STPMIC1 is not set +# CONFIG_MFD_SYSCON is not set +# CONFIG_MFD_T7L66XB is not set +# CONFIG_MFD_TC3589X is not set +# CONFIG_MFD_TC6387XB is not set +# CONFIG_MFD_TC6393XB is not set +# CONFIG_MFD_TIMBERDALE is not set +# CONFIG_MFD_TI_AM335X_TSCADC is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_MFD_TI_LP873X is not set +# CONFIG_MFD_TI_LP87565 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_TPS65086 is not set +# CONFIG_MFD_TPS65090 is not set +# CONFIG_MFD_TPS65217 is not set +# CONFIG_MFD_TPS65218 is not set +# CONFIG_MFD_TPS6586X is not set +# CONFIG_MFD_TPS65910 is not set +# CONFIG_MFD_TPS65912 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_TPS68470 is not set +# CONFIG_MFD_TPS80031 is not set +# CONFIG_MFD_TQMX86 is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_VX855 is not set +# CONFIG_MFD_WL1273_CORE is not set +# CONFIG_MFD_WM831X is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM8994 is not set +# CONFIG_MG_DISK is not set +# CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_DEBUG is not set +# CONFIG_MHI_BUS_PCI_GENERIC is not set +# CONFIG_MHI_NET is not set +# CONFIG_MHI_WWAN_CTRL is not set +# CONFIG_MHI_WWAN_MBIM is not set +# CONFIG_MICREL_KS8995MA is not set +# CONFIG_MICREL_PHY is not set +# CONFIG_MICROCHIP_KSZ is not set +# CONFIG_MICROCHIP_PHY is not set +# CONFIG_MICROCHIP_PIT64B is not set +# CONFIG_MICROCHIP_T1_PHY is not set +# CONFIG_MICROSEMI_PHY is not set +# CONFIG_MIGRATION is not set +CONFIG_MII=y +# CONFIG_MIKROTIK is not set +# CONFIG_MIKROTIK_RB532 is not set +# CONFIG_MINIX_FS is not set +# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_MIPS32_N32 is not set +# CONFIG_MIPS32_O32 is not set +# CONFIG_MIPS_ALCHEMY is not set +# CONFIG_MIPS_CDMM is not set +# CONFIG_MIPS_CMDLINE_DTB_EXTEND is not set +# CONFIG_MIPS_CMDLINE_FROM_DTB is not set +# CONFIG_MIPS_CMP is not set +# CONFIG_MIPS_COBALT is not set +# CONFIG_MIPS_CPS is not set +# CONFIG_MIPS_ELF_APPENDED_DTB is not set +# CONFIG_MIPS_FPU_EMULATOR is not set +# CONFIG_MIPS_FP_SUPPORT is not set +# CONFIG_MIPS_GENERIC is not set +# CONFIG_MIPS_GENERIC_KERNEL is not set +# CONFIG_MIPS_MALTA is not set +# CONFIG_MIPS_O32_FP64_SUPPORT is not set +# CONFIG_MIPS_PARAVIRT is not set +# CONFIG_MIPS_PLATFORM_DEVICES is not set +# CONFIG_MIPS_RAW_APPENDED_DTB is not set +# CONFIG_MIPS_SEAD3 is not set +# CONFIG_MIPS_VA_BITS_48 is not set +# CONFIG_MIPS_VPE_LOADER is not set +# CONFIG_MISC_ALCOR_PCI is not set +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_MISC_RTSX_PCI is not set +# CONFIG_MISC_RTSX_USB is not set +# CONFIG_MISDN is not set +# CONFIG_MISDN_AVMFRITZ is not set +# CONFIG_MISDN_HFCPCI is not set +# CONFIG_MISDN_HFCUSB is not set +# CONFIG_MISDN_INFINEON is not set +# CONFIG_MISDN_NETJET is not set +# CONFIG_MISDN_SPEEDFAX is not set +# CONFIG_MISDN_W6692 is not set +CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y +# CONFIG_MKISS is not set +# CONFIG_MLX4_CORE is not set +# CONFIG_MLX4_EN is not set +# CONFIG_MLX5_CORE is not set +# CONFIG_MLX5_SF is not set +# CONFIG_MLX5_VFIO_PCI is not set +# CONFIG_MLX90614 is not set +# CONFIG_MLX90632 is not set +# CONFIG_MLXFW is not set +# CONFIG_MLXSW_CORE is not set +# CONFIG_MLX_CPLD_PLATFORM is not set +# CONFIG_MLX_PLATFORM is not set +# CONFIG_MMA7455_I2C is not set +# CONFIG_MMA7455_SPI is not set +# CONFIG_MMA7660 is not set +# CONFIG_MMA8452 is not set +# CONFIG_MMA9551 is not set +# CONFIG_MMA9553 is not set +# CONFIG_MMC is not set +# CONFIG_MMC35240 is not set +# CONFIG_MMC_ARMMMCI is not set +# CONFIG_MMC_AU1X is not set +# CONFIG_MMC_BLOCK is not set +CONFIG_MMC_BLOCK_MINORS=8 +# CONFIG_MMC_CAVIUM_THUNDERX is not set +# CONFIG_MMC_CB710 is not set +# CONFIG_MMC_CQHCI is not set +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_DW is not set +# CONFIG_MMC_HSQ is not set +# CONFIG_MMC_JZ4740 is not set +# CONFIG_MMC_MTK is not set +# CONFIG_MMC_MVSDIO is not set +# CONFIG_MMC_S3C is not set +# CONFIG_MMC_SDHCI is not set +# CONFIG_MMC_SDHCI_ACPI is not set +# CONFIG_MMC_SDHCI_AM654 is not set +# CONFIG_MMC_SDHCI_BCM_KONA is not set +# CONFIG_MMC_SDHCI_BRCMSTB is not set +# CONFIG_MMC_SDHCI_CADENCE is not set +# CONFIG_MMC_SDHCI_F_SDH30 is not set +# CONFIG_MMC_SDHCI_IPROC is not set +# CONFIG_MMC_SDHCI_MILBEAUT is not set +# CONFIG_MMC_SDHCI_MSM is not set +# CONFIG_MMC_SDHCI_OF_ARASAN is not set +# CONFIG_MMC_SDHCI_OF_ASPEED is not set +# CONFIG_MMC_SDHCI_OF_AT91 is not set +# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set +# CONFIG_MMC_SDHCI_OF_ESDHC is not set +# CONFIG_MMC_SDHCI_OF_HLWD is not set +# CONFIG_MMC_SDHCI_OMAP is not set +# CONFIG_MMC_SDHCI_PXAV2 is not set +# CONFIG_MMC_SDHCI_PXAV3 is not set +# CONFIG_MMC_SDHCI_S3C is not set +# CONFIG_MMC_SDHCI_XENON is not set +# CONFIG_MMC_SDRICOH_CS is not set +# CONFIG_MMC_SPI is not set +# CONFIG_MMC_STM32_SDMMC is not set +# CONFIG_MMC_TEST is not set +# CONFIG_MMC_TIFM_SD is not set +# CONFIG_MMC_TOSHIBA_PCI is not set +# CONFIG_MMC_USDHI6ROL0 is not set +# CONFIG_MMC_USHC is not set +# CONFIG_MMC_VIA_SDMMC is not set +# CONFIG_MMC_VUB300 is not set +# CONFIG_MMIOTRACE is not set +CONFIG_MMU=y +CONFIG_MMU_GATHER_RCU_TABLE_FREE=y +CONFIG_MMU_GATHER_TABLE_FREE=y +CONFIG_MODPROBE_PATH="/sbin/modprobe" +CONFIG_MODULES=y +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +# CONFIG_MODULE_COMPRESS is not set +# CONFIG_MODULE_COMPRESS_GZIP is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set +# CONFIG_MODULE_FORCE_LOAD is not set +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODULE_SIG is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_MODULE_STRIPPED=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MOST is not set +# CONFIG_MOTORCOMM_PHY is not set +# CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_ELAN_I2C is not set +# CONFIG_MOUSE_GPIO is not set +# CONFIG_MOUSE_INPORT is not set +# CONFIG_MOUSE_LOGIBM is not set +# CONFIG_MOUSE_PC110PAD is not set +# CONFIG_MOUSE_PS2_FOCALTECH is not set +# CONFIG_MOUSE_PS2_SENTELIC is not set +# CONFIG_MOUSE_SYNAPTICS_I2C is not set +# CONFIG_MOUSE_SYNAPTICS_USB is not set +# CONFIG_MOXTET is not set +# CONFIG_MPL115 is not set +# CONFIG_MPL115_I2C is not set +# CONFIG_MPL115_SPI is not set +# CONFIG_MPL3115 is not set +# CONFIG_MPLS is not set +# CONFIG_MPLS_IPTUNNEL is not set +# CONFIG_MPLS_ROUTING is not set +# CONFIG_MPTCP is not set +# CONFIG_MPU3050_I2C is not set +# CONFIG_MQ_IOSCHED_DEADLINE is not set +# CONFIG_MQ_IOSCHED_KYBER is not set +# CONFIG_MS5611 is not set +# CONFIG_MS5637 is not set +# CONFIG_MSCC_OCELOT_SWITCH is not set +# CONFIG_MSDOS_FS is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_MSI_BITMAP_SELFTEST is not set +# CONFIG_MSI_LAPTOP is not set +# CONFIG_MSM_GCC_8953 is not set +# CONFIG_MSM_MMCC_8994 is not set +# CONFIG_MST_IRQ is not set +CONFIG_MTD=y +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_AR7_PARTS is not set +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# CONFIG_MTD_BLOCK2MTD is not set +CONFIG_MTD_CFI=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_CFI_AMDSTD=y +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set +CONFIG_MTD_CFI_NOSWAP=y +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=y +# CONFIG_MTD_CMDLINE_PARTS is not set +CONFIG_MTD_COMPLEX_MAPPINGS=y +# CONFIG_MTD_DATAFLASH is not set +# CONFIG_MTD_DOCG3 is not set +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_GPIO_ADDR is not set +# CONFIG_MTD_HYPERBUS is not set +# CONFIG_MTD_IMPA7 is not set +# CONFIG_MTD_INTEL_VR_NOR is not set +# CONFIG_MTD_JEDECPROBE is not set +# CONFIG_MTD_LATCH_ADDR is not set +# CONFIG_MTD_LPDDR is not set +# CONFIG_MTD_LPDDR2_NVM is not set +# CONFIG_MTD_M25P80 is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +CONFIG_MTD_MAP_BANK_WIDTH_2=y +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MCHP23K256 is not set +# CONFIG_MTD_MCHP48L640 is not set +# CONFIG_MTD_MT81xx_NOR is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_MYLOADER_PARTS is not set +# CONFIG_MTD_NAND is not set +# CONFIG_MTD_NAND_AMS_DELTA is not set +# CONFIG_MTD_NAND_AR934X is not set +# CONFIG_MTD_NAND_AR934X_HW_ECC is not set +# CONFIG_MTD_NAND_ARASAN is not set +# CONFIG_MTD_NAND_ATMEL is not set +# CONFIG_MTD_NAND_AU1550 is not set +# CONFIG_MTD_NAND_BCH is not set +# CONFIG_MTD_NAND_BF5XX is not set +# CONFIG_MTD_NAND_BRCMNAND is not set +# CONFIG_MTD_NAND_CADENCE is not set +# CONFIG_MTD_NAND_CAFE is not set +# CONFIG_MTD_NAND_CM_X270 is not set +# CONFIG_MTD_NAND_CS553X is not set +# CONFIG_MTD_NAND_DAVINCI is not set +# CONFIG_MTD_NAND_DENALI is not set +# CONFIG_MTD_NAND_DENALI_DT is not set +# CONFIG_MTD_NAND_DENALI_PCI is not set +CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR=0xff108018 +# CONFIG_MTD_NAND_DISKONCHIP is not set +# CONFIG_MTD_NAND_DOCG4 is not set +# CONFIG_MTD_NAND_ECC is not set +# CONFIG_MTD_NAND_ECC_BCH is not set +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_ECC_SW_BCH is not set +# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set +# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set +# CONFIG_MTD_NAND_FSL_ELBC is not set +# CONFIG_MTD_NAND_FSL_IFC is not set +# CONFIG_MTD_NAND_FSL_UPM is not set +# CONFIG_MTD_NAND_FSMC is not set +# CONFIG_MTD_NAND_GPIO is not set +# CONFIG_MTD_NAND_GPMI_NAND is not set +# CONFIG_MTD_NAND_HISI504 is not set +CONFIG_MTD_NAND_IDS=y +# CONFIG_MTD_NAND_INTEL_LGM is not set +# CONFIG_MTD_NAND_JZ4740 is not set +# CONFIG_MTD_NAND_MPC5121_NFC is not set +# CONFIG_MTD_NAND_MTK is not set +# CONFIG_MTD_NAND_MTK_BMT is not set +# CONFIG_MTD_NAND_MXC is not set +# CONFIG_MTD_NAND_MXIC is not set +# CONFIG_MTD_NAND_NANDSIM is not set +# CONFIG_MTD_NAND_NDFC is not set +# CONFIG_MTD_NAND_NUC900 is not set +# CONFIG_MTD_NAND_OMAP2 is not set +# CONFIG_MTD_NAND_OMAP_BCH_BUILD is not set +# CONFIG_MTD_NAND_ORION is not set +# CONFIG_MTD_NAND_PASEMI is not set +# CONFIG_MTD_NAND_PLATFORM is not set +# CONFIG_MTD_NAND_PXA3xx is not set +# CONFIG_MTD_NAND_RB4XX is not set +# CONFIG_MTD_NAND_RB750 is not set +# CONFIG_MTD_NAND_RB91X is not set +# CONFIG_MTD_NAND_RICOH is not set +# CONFIG_MTD_NAND_S3C2410 is not set +# CONFIG_MTD_NAND_SHARPSL is not set +# CONFIG_MTD_NAND_SH_FLCTL is not set +# CONFIG_MTD_NAND_SOCRATES is not set +# CONFIG_MTD_NAND_TMIO is not set +# CONFIG_MTD_NAND_TXX9NDFMC is not set +CONFIG_MTD_OF_PARTS=y +# CONFIG_MTD_ONENAND is not set +# CONFIG_MTD_OOPS is not set +# CONFIG_MTD_OTP is not set +# CONFIG_MTD_PARSER_TRX is not set +# CONFIG_MTD_PARTITIONED_MASTER is not set +# CONFIG_MTD_PCI is not set +# CONFIG_MTD_PCMCIA is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_PHYSMAP_COMPAT is not set +# CONFIG_MTD_PHYSMAP_GEMINI is not set +# CONFIG_MTD_PHYSMAP_GPIO_ADDR is not set +# CONFIG_MTD_PHYSMAP_IXP4XX is not set +CONFIG_MTD_PHYSMAP_OF=y +# CONFIG_MTD_PHYSMAP_OF_GEMINI is not set +# CONFIG_MTD_PHYSMAP_OF_VERSATILE is not set +# CONFIG_MTD_PHYSMAP_VERSATILE is not set +# CONFIG_MTD_PLATRAM is not set +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_RAW_NAND is not set +CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_ROM is not set +CONFIG_MTD_ROOTFS_ROOT_DEV=y +# CONFIG_MTD_ROUTERBOOT_PARTS is not set +# CONFIG_MTD_SERCOMM_PARTS is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_SM_COMMON is not set +# CONFIG_MTD_SPINAND_MT29F is not set +# CONFIG_MTD_SPI_NAND is not set +# CONFIG_MTD_SPI_NOR is not set +# CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set +CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y +# CONFIG_MTD_SPI_NOR_SWP_KEEP is not set +# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set +# CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE is not set +CONFIG_MTD_SPLIT=y +# CONFIG_MTD_SPLIT_BCM63XX_FW is not set +# CONFIG_MTD_SPLIT_BCM_WFI_FW is not set +# CONFIG_MTD_SPLIT_BRNIMAGE_FW is not set +# CONFIG_MTD_SPLIT_ELF_FW is not set +# CONFIG_MTD_SPLIT_EVA_FW is not set +# CONFIG_MTD_SPLIT_FIRMWARE is not set +CONFIG_MTD_SPLIT_FIRMWARE_NAME="firmware" +# CONFIG_MTD_SPLIT_FIT_FW is not set +# CONFIG_MTD_SPLIT_H3C_VFS is not set +# CONFIG_MTD_SPLIT_JIMAGE_FW is not set +# CONFIG_MTD_SPLIT_LZMA_FW is not set +# CONFIG_MTD_SPLIT_MINOR_FW is not set +# CONFIG_MTD_SPLIT_SEAMA_FW is not set +CONFIG_MTD_SPLIT_SQUASHFS_ROOT=y +CONFIG_MTD_SPLIT_SUPPORT=y +# CONFIG_MTD_SPLIT_TPLINK_FW is not set +# CONFIG_MTD_SPLIT_TRX_FW is not set +# CONFIG_MTD_SPLIT_UIMAGE_FW is not set +# CONFIG_MTD_SPLIT_WRGG_FW is not set +# CONFIG_MTD_SST25L is not set +# CONFIG_MTD_SWAP is not set +# CONFIG_MTD_TESTS is not set +# CONFIG_MTD_UBI is not set +# CONFIG_MTD_UBI_FASTMAP is not set +# CONFIG_MTD_UBI_GLUEBI is not set +# CONFIG_MTD_UIMAGE_SPLIT is not set +# CONFIG_MTD_VIRT_CONCAT is not set +# CONFIG_MTK_DEVAPC is not set +# CONFIG_MTK_MMC is not set +# CONFIG_MTK_MMSYS is not set +# CONFIG_MTK_THERMAL is not set +# CONFIG_MULTIPLEXER is not set +CONFIG_MULTIUSER=y +# CONFIG_MUTEX_SPIN_ON_OWNER is not set +# CONFIG_MUX_ADG792A is not set +# CONFIG_MUX_ADGS1408 is not set +# CONFIG_MUX_GPIO is not set +# CONFIG_MUX_MMIO is not set +# CONFIG_MV643XX_ETH is not set +# CONFIG_MVMDIO is not set +# CONFIG_MVNETA_BM is not set +# CONFIG_MVSW61XX_PHY is not set +# CONFIG_MV_XOR_V2 is not set +# CONFIG_MWAVE is not set +# CONFIG_MWL8K is not set +# CONFIG_MXC4005 is not set +# CONFIG_MXC6255 is not set +# CONFIG_MYRI10GE is not set +# CONFIG_NAMESPACES is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_NATSEMI is not set +# CONFIG_NAU7802 is not set +# CONFIG_NBPFAXI_DMA is not set +# CONFIG_NCP_FS is not set +# CONFIG_NE2000 is not set +# CONFIG_NE2K_PCI is not set +# CONFIG_NEC_MARKEINS is not set +CONFIG_NET=y +# CONFIG_NETCONSOLE is not set +CONFIG_NETDEVICES=y +# CONFIG_NETDEVSIM is not set +# CONFIG_NETFILTER is not set +# CONFIG_NETFILTER_ADVANCED is not set +# CONFIG_NETFILTER_DEBUG is not set +# CONFIG_NETFILTER_INGRESS is not set +# CONFIG_NETFILTER_NETLINK is not set +# CONFIG_NETFILTER_NETLINK_ACCT is not set +# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set +# CONFIG_NETFILTER_NETLINK_HOOK is not set +# CONFIG_NETFILTER_NETLINK_LOG is not set +# CONFIG_NETFILTER_NETLINK_OSF is not set +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +# CONFIG_NETFILTER_XTABLES is not set +# CONFIG_NETFILTER_XTABLES_COMPAT is not set +# CONFIG_NETFILTER_XT_CONNMARK is not set +# CONFIG_NETFILTER_XT_MARK is not set +# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set +# CONFIG_NETFILTER_XT_MATCH_BPF is not set +# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set +# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set +# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set +# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set +# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set +# CONFIG_NETFILTER_XT_MATCH_CPU is not set +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set +# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set +# CONFIG_NETFILTER_XT_MATCH_ECN is not set +# CONFIG_NETFILTER_XT_MATCH_ESP is not set +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_HELPER is not set +# CONFIG_NETFILTER_XT_MATCH_HL is not set +# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set +# CONFIG_NETFILTER_XT_MATCH_L2TP is not set +# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set +# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_MAC is not set +# CONFIG_NETFILTER_XT_MATCH_MARK is not set +# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set +# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set +# CONFIG_NETFILTER_XT_MATCH_OSF is not set +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set +# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set +# CONFIG_NETFILTER_XT_MATCH_POLICY is not set +# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set +# CONFIG_NETFILTER_XT_MATCH_REALM is not set +# CONFIG_NETFILTER_XT_MATCH_RECENT is not set +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set +# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set +# CONFIG_NETFILTER_XT_MATCH_STATE is not set +# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set +# CONFIG_NETFILTER_XT_MATCH_STRING is not set +# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set +# CONFIG_NETFILTER_XT_MATCH_TIME is not set +# CONFIG_NETFILTER_XT_MATCH_U32 is not set +# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set +# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set +# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set +# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set +# CONFIG_NETFILTER_XT_TARGET_CT is not set +# CONFIG_NETFILTER_XT_TARGET_DSCP is not set +# CONFIG_NETFILTER_XT_TARGET_HL is not set +# CONFIG_NETFILTER_XT_TARGET_HMARK is not set +# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set +# CONFIG_NETFILTER_XT_TARGET_LED is not set +# CONFIG_NETFILTER_XT_TARGET_LOG is not set +# CONFIG_NETFILTER_XT_TARGET_MARK is not set +# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set +# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set +# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set +# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set +# CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set +# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set +# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set +# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set +# CONFIG_NETFILTER_XT_TARGET_TEE is not set +# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set +# CONFIG_NETFILTER_XT_TARGET_TRACE is not set +# CONFIG_NETLABEL is not set +# CONFIG_NETLINK_DIAG is not set +# CONFIG_NETLINK_MMAP is not set +# CONFIG_NETPOLL is not set +# CONFIG_NETROM is not set +CONFIG_NETWORK_FILESYSTEMS=y +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETXEN_NIC is not set +# CONFIG_NET_9P is not set +# CONFIG_NET_ACT_BPF is not set +# CONFIG_NET_ACT_CSUM is not set +# CONFIG_NET_ACT_CT is not set +# CONFIG_NET_ACT_GACT is not set +# CONFIG_NET_ACT_GATE is not set +# CONFIG_NET_ACT_IFE is not set +# CONFIG_NET_ACT_IPT is not set +# CONFIG_NET_ACT_MIRRED is not set +# CONFIG_NET_ACT_MPLS is not set +# CONFIG_NET_ACT_NAT is not set +# CONFIG_NET_ACT_PEDIT is not set +# CONFIG_NET_ACT_POLICE is not set +# CONFIG_NET_ACT_SAMPLE is not set +# CONFIG_NET_ACT_SIMP is not set +# CONFIG_NET_ACT_SKBEDIT is not set +# CONFIG_NET_ACT_SKBMOD is not set +# CONFIG_NET_ACT_TUNNEL_KEY is not set +# CONFIG_NET_ACT_VLAN is not set +CONFIG_NET_CADENCE=y +# CONFIG_NET_CALXEDA_XGMAC is not set +CONFIG_NET_CLS=y +# CONFIG_NET_CLS_ACT is not set +# CONFIG_NET_CLS_BASIC is not set +# CONFIG_NET_CLS_BPF is not set +# CONFIG_NET_CLS_FLOW is not set +# CONFIG_NET_CLS_FLOWER is not set +# CONFIG_NET_CLS_FW is not set +CONFIG_NET_CLS_IND=y +# CONFIG_NET_CLS_MATCHALL is not set +# CONFIG_NET_CLS_ROUTE4 is not set +# CONFIG_NET_CLS_RSVP is not set +# CONFIG_NET_CLS_RSVP6 is not set +# CONFIG_NET_CLS_U32 is not set +CONFIG_NET_CORE=y +# CONFIG_NET_DEVLINK is not set +# CONFIG_NET_DROP_MONITOR is not set +# CONFIG_NET_DSA is not set +# CONFIG_NET_DSA_AR9331 is not set +# CONFIG_NET_DSA_BCM_SF2 is not set +# CONFIG_NET_DSA_LANTIQ_GSWIP is not set +# CONFIG_NET_DSA_LEGACY is not set +# CONFIG_NET_DSA_LOOP is not set +# CONFIG_NET_DSA_MICROCHIP_KSZ8795 is not set +# CONFIG_NET_DSA_MICROCHIP_KSZ9477 is not set +# CONFIG_NET_DSA_MSCC_FELIX is not set +# CONFIG_NET_DSA_MSCC_SEVILLE is not set +# CONFIG_NET_DSA_MT7530 is not set +# CONFIG_NET_DSA_MV88E6060 is not set +# CONFIG_NET_DSA_MV88E6123_61_65 is not set +# CONFIG_NET_DSA_MV88E6131 is not set +# CONFIG_NET_DSA_MV88E6171 is not set +# CONFIG_NET_DSA_MV88E6352 is not set +# CONFIG_NET_DSA_MV88E6XXX is not set +# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set +# CONFIG_NET_DSA_MV88E6XXX_PTP is not set +# CONFIG_NET_DSA_QCA8K is not set +# CONFIG_NET_DSA_QCA8K_LEDS_SUPPORT is not set +# CONFIG_NET_DSA_REALTEK_SMI is not set +# CONFIG_NET_DSA_SJA1105 is not set +# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set +# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set +# CONFIG_NET_DSA_TAG_8021Q is not set +# CONFIG_NET_DSA_TAG_AR9331 is not set +# CONFIG_NET_DSA_TAG_BRCM is not set +# CONFIG_NET_DSA_TAG_BRCM_LEGACY is not set +# CONFIG_NET_DSA_TAG_BRCM_PREPEND is not set +# CONFIG_NET_DSA_TAG_DSA is not set +# CONFIG_NET_DSA_TAG_EDSA is not set +# CONFIG_NET_DSA_TAG_GSWIP is not set +# CONFIG_NET_DSA_TAG_HELLCREEK is not set +# CONFIG_NET_DSA_TAG_KSZ is not set +# CONFIG_NET_DSA_TAG_LAN9303 is not set +# CONFIG_NET_DSA_TAG_MTK is not set +# CONFIG_NET_DSA_TAG_OCELOT is not set +# CONFIG_NET_DSA_TAG_OCELOT_8021Q is not set +# CONFIG_NET_DSA_TAG_QCA is not set +# CONFIG_NET_DSA_TAG_RTL4_A is not set +# CONFIG_NET_DSA_TAG_SJA1105 is not set +# CONFIG_NET_DSA_TAG_TRAILER is not set +# CONFIG_NET_DSA_TAG_XRS700X is not set +# CONFIG_NET_DSA_VITESSE_VSC73XX is not set +# CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set +# CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set +# CONFIG_NET_DSA_XRS700X_I2C is not set +# CONFIG_NET_DSA_XRS700X_MDIO is not set +# CONFIG_NET_EMATCH is not set +# CONFIG_NET_EMATCH_CANID is not set +# CONFIG_NET_EMATCH_CMP is not set +# CONFIG_NET_EMATCH_IPT is not set +# CONFIG_NET_EMATCH_META is not set +# CONFIG_NET_EMATCH_NBYTE is not set +CONFIG_NET_EMATCH_STACK=32 +# CONFIG_NET_EMATCH_TEXT is not set +# CONFIG_NET_EMATCH_U32 is not set +# CONFIG_NET_FAILOVER is not set +# CONFIG_NET_FC is not set +# CONFIG_NET_FOU is not set +# CONFIG_NET_FOU_IP_TUNNELS is not set +# CONFIG_NET_IFE is not set +# CONFIG_NET_IPGRE is not set +CONFIG_NET_IPGRE_BROADCAST=y +# CONFIG_NET_IPGRE_DEMUX is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPVTI is not set +# CONFIG_NET_IP_TUNNEL is not set +# CONFIG_NET_KEY is not set +# CONFIG_NET_KEY_MIGRATE is not set +# CONFIG_NET_L3_MASTER_DEV is not set +# CONFIG_NET_MEDIATEK_STAR_EMAC is not set +# CONFIG_NET_MPLS_GSO is not set +# CONFIG_NET_NCSI is not set +# CONFIG_NET_NSH is not set +# CONFIG_NET_PACKET_ENGINE is not set +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_NET_PTP_CLASSIFY is not set +CONFIG_NET_RX_BUSY_POLL=y +# CONFIG_NET_SB1000 is not set +CONFIG_NET_SCHED=y +# CONFIG_NET_SCH_ATM is not set +# CONFIG_NET_SCH_CAKE is not set +# CONFIG_NET_SCH_CBQ is not set +# CONFIG_NET_SCH_CBS is not set +# CONFIG_NET_SCH_CHOKE is not set +# CONFIG_NET_SCH_CODEL is not set +CONFIG_NET_SCH_DEFAULT=y +# CONFIG_NET_SCH_DRR is not set +# CONFIG_NET_SCH_DSMARK is not set +# CONFIG_NET_SCH_ETF is not set +# CONFIG_NET_SCH_ETS is not set +CONFIG_NET_SCH_FIFO=y +# CONFIG_NET_SCH_FQ is not set +CONFIG_NET_SCH_FQ_CODEL=y +# CONFIG_NET_SCH_FQ_PIE is not set +# CONFIG_NET_SCH_GRED is not set +# CONFIG_NET_SCH_HFSC is not set +# CONFIG_NET_SCH_HHF is not set +# CONFIG_NET_SCH_HTB is not set +# CONFIG_NET_SCH_INGRESS is not set +# CONFIG_NET_SCH_MQPRIO is not set +# CONFIG_NET_SCH_MULTIQ is not set +# CONFIG_NET_SCH_NETEM is not set +# CONFIG_NET_SCH_PIE is not set +# CONFIG_NET_SCH_PLUG is not set +# CONFIG_NET_SCH_PRIO is not set +# CONFIG_NET_SCH_QFQ is not set +# CONFIG_NET_SCH_RED is not set +# CONFIG_NET_SCH_SFB is not set +# CONFIG_NET_SCH_SFQ is not set +# CONFIG_NET_SCH_SKBPRIO is not set +# CONFIG_NET_SCH_TAPRIO is not set +# CONFIG_NET_SCH_TBF is not set +# CONFIG_NET_SCH_TEQL is not set +# CONFIG_NET_SCTPPROBE is not set +# CONFIG_NET_SELFTESTS is not set +CONFIG_NET_SOCK_MSG=y +# CONFIG_NET_SWITCHDEV is not set +# CONFIG_NET_TCPPROBE is not set +# CONFIG_NET_TC_SKB_EXT is not set +# CONFIG_NET_TEAM is not set +# CONFIG_NET_TULIP is not set +# CONFIG_NET_UDP_TUNNEL is not set +CONFIG_NET_VENDOR_3COM=y +CONFIG_NET_VENDOR_8390=y +CONFIG_NET_VENDOR_ADAPTEC=y +CONFIG_NET_VENDOR_AGERE=y +CONFIG_NET_VENDOR_ALACRITECH=y +CONFIG_NET_VENDOR_ALTEON=y +CONFIG_NET_VENDOR_AMAZON=y +CONFIG_NET_VENDOR_AMD=y +CONFIG_NET_VENDOR_AQUANTIA=y +CONFIG_NET_VENDOR_ARC=y +CONFIG_NET_VENDOR_ATHEROS=y +CONFIG_NET_VENDOR_AURORA=y +CONFIG_NET_VENDOR_BROADCOM=y +CONFIG_NET_VENDOR_BROCADE=y +CONFIG_NET_VENDOR_CADENCE=y +CONFIG_NET_VENDOR_CAVIUM=y +CONFIG_NET_VENDOR_CHELSIO=y +CONFIG_NET_VENDOR_CIRRUS=y +CONFIG_NET_VENDOR_CISCO=y +CONFIG_NET_VENDOR_CORTINA=y +CONFIG_NET_VENDOR_DEC=y +CONFIG_NET_VENDOR_DLINK=y +CONFIG_NET_VENDOR_EMULEX=y +CONFIG_NET_VENDOR_EXAR=y +CONFIG_NET_VENDOR_EZCHIP=y +CONFIG_NET_VENDOR_FARADAY=y +CONFIG_NET_VENDOR_FREESCALE=y +CONFIG_NET_VENDOR_FUJITSU=y +CONFIG_NET_VENDOR_GOOGLE=y +CONFIG_NET_VENDOR_HISILICON=y +CONFIG_NET_VENDOR_HP=y +CONFIG_NET_VENDOR_HUAWEI=y +CONFIG_NET_VENDOR_I825XX=y +CONFIG_NET_VENDOR_IBM=y +CONFIG_NET_VENDOR_INTEL=y +# CONFIG_NET_VENDOR_LITEX is not set +CONFIG_NET_VENDOR_MARVELL=y +CONFIG_NET_VENDOR_MELLANOX=y +CONFIG_NET_VENDOR_MICREL=y +CONFIG_NET_VENDOR_MICROCHIP=y +CONFIG_NET_VENDOR_MICROSEMI=y +# CONFIG_NET_VENDOR_MICROSOFT is not set +CONFIG_NET_VENDOR_MYRI=y +CONFIG_NET_VENDOR_NATSEMI=y +CONFIG_NET_VENDOR_NETERION=y +CONFIG_NET_VENDOR_NETRONOME=y +CONFIG_NET_VENDOR_NI=y +CONFIG_NET_VENDOR_NVIDIA=y +CONFIG_NET_VENDOR_OKI=y +CONFIG_NET_VENDOR_PACKET_ENGINES=y +CONFIG_NET_VENDOR_PENSANDO=y +CONFIG_NET_VENDOR_QLOGIC=y +CONFIG_NET_VENDOR_QUALCOMM=y +CONFIG_NET_VENDOR_RDC=y +CONFIG_NET_VENDOR_REALTEK=y +CONFIG_NET_VENDOR_RENESAS=y +CONFIG_NET_VENDOR_ROCKER=y +CONFIG_NET_VENDOR_SAMSUNG=y +CONFIG_NET_VENDOR_SEEQ=y +CONFIG_NET_VENDOR_SILAN=y +CONFIG_NET_VENDOR_SIS=y +CONFIG_NET_VENDOR_SMSC=y +CONFIG_NET_VENDOR_SOCIONEXT=y +CONFIG_NET_VENDOR_SOLARFLARE=y +CONFIG_NET_VENDOR_STMICRO=y +CONFIG_NET_VENDOR_SUN=y +CONFIG_NET_VENDOR_SYNOPSYS=y +CONFIG_NET_VENDOR_TEHUTI=y +CONFIG_NET_VENDOR_TI=y +CONFIG_NET_VENDOR_TOSHIBA=y +CONFIG_NET_VENDOR_VIA=y +CONFIG_NET_VENDOR_WIZNET=y +CONFIG_NET_VENDOR_XILINX=y +CONFIG_NET_VENDOR_XIRCOM=y +# CONFIG_NET_VRF is not set +# CONFIG_NET_XGENE is not set +CONFIG_NEW_LEDS=y +# CONFIG_NFC is not set +# CONFIG_NFP is not set +# CONFIG_NFSD is not set +# CONFIG_NFSD_V2_ACL is not set +CONFIG_NFSD_V3=y +# CONFIG_NFSD_V3_ACL is not set +# CONFIG_NFSD_V4 is not set +# CONFIG_NFS_ACL_SUPPORT is not set +CONFIG_NFS_COMMON=y +# CONFIG_NFS_DISABLE_UDP_SUPPORT is not set +# CONFIG_NFS_FS is not set +# CONFIG_NFS_FSCACHE is not set +# CONFIG_NFS_SWAP is not set +# CONFIG_NFS_V2 is not set +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +# CONFIG_NFS_V4 is not set +# CONFIG_NFS_V4_1 is not set +# CONFIG_NFTL is not set +# CONFIG_NFT_BRIDGE_META is not set +# CONFIG_NFT_BRIDGE_REJECT is not set +# CONFIG_NFT_CONNLIMIT is not set +# CONFIG_NFT_DUP_IPV4 is not set +# CONFIG_NFT_DUP_IPV6 is not set +# CONFIG_NFT_FIB_IPV4 is not set +# CONFIG_NFT_FIB_IPV6 is not set +# CONFIG_NFT_FIB_NETDEV is not set +# CONFIG_NFT_FLOW_OFFLOAD is not set +# CONFIG_NFT_OBJREF is not set +# CONFIG_NFT_OSF is not set +# CONFIG_NFT_REJECT_NETDEV is not set +# CONFIG_NFT_RT is not set +# CONFIG_NFT_SET_BITMAP is not set +# CONFIG_NFT_SOCKET is not set +# CONFIG_NFT_SYNPROXY is not set +# CONFIG_NFT_TPROXY is not set +# CONFIG_NFT_TUNNEL is not set +# CONFIG_NFT_XFRM is not set +# CONFIG_NF_CONNTRACK is not set +# CONFIG_NF_CONNTRACK_AMANDA is not set +# CONFIG_NF_CONNTRACK_BRIDGE is not set +# CONFIG_NF_CONNTRACK_EVENTS is not set +# CONFIG_NF_CONNTRACK_FTP is not set +# CONFIG_NF_CONNTRACK_H323 is not set +# CONFIG_NF_CONNTRACK_IRC is not set +# CONFIG_NF_CONNTRACK_LABELS is not set +# CONFIG_NF_CONNTRACK_MARK is not set +# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set +# CONFIG_NF_CONNTRACK_PPTP is not set +CONFIG_NF_CONNTRACK_PROCFS=y +# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set +# CONFIG_NF_CONNTRACK_SANE is not set +# CONFIG_NF_CONNTRACK_SECMARK is not set +# CONFIG_NF_CONNTRACK_SIP is not set +# CONFIG_NF_CONNTRACK_SNMP is not set +# CONFIG_NF_CONNTRACK_TFTP is not set +# CONFIG_NF_CONNTRACK_TIMEOUT is not set +# CONFIG_NF_CONNTRACK_TIMESTAMP is not set +# CONFIG_NF_CONNTRACK_ZONES is not set +# CONFIG_NF_CT_NETLINK is not set +# CONFIG_NF_CT_NETLINK_HELPER is not set +# CONFIG_NF_CT_NETLINK_TIMEOUT is not set +# CONFIG_NF_CT_PROTO_DCCP is not set +# CONFIG_NF_CT_PROTO_GRE is not set +# CONFIG_NF_CT_PROTO_SCTP is not set +# CONFIG_NF_CT_PROTO_UDPLITE is not set +# CONFIG_NF_DEFRAG_IPV4 is not set +# CONFIG_NF_DUP_IPV4 is not set +# CONFIG_NF_DUP_IPV6 is not set +# CONFIG_NF_FLOW_TABLE is not set +# CONFIG_NF_LOG_ARP is not set +# CONFIG_NF_LOG_BRIDGE is not set +# CONFIG_NF_LOG_IPV4 is not set +# CONFIG_NF_LOG_NETDEV is not set +# CONFIG_NF_LOG_SYSLOG is not set +# CONFIG_NF_NAT is not set +# CONFIG_NF_NAT_AMANDA is not set +# CONFIG_NF_NAT_FTP is not set +# CONFIG_NF_NAT_H323 is not set +# CONFIG_NF_NAT_IRC is not set +# CONFIG_NF_NAT_NEEDED is not set +# CONFIG_NF_NAT_PPTP is not set +# CONFIG_NF_NAT_PROTO_GRE is not set +# CONFIG_NF_NAT_SIP is not set +# CONFIG_NF_NAT_SNMP_BASIC is not set +# CONFIG_NF_NAT_TFTP is not set +# CONFIG_NF_REJECT_IPV4 is not set +# CONFIG_NF_REJECT_IPV6 is not set +# CONFIG_NF_SOCKET_IPV4 is not set +# CONFIG_NF_SOCKET_IPV6 is not set +# CONFIG_NF_TABLES is not set +CONFIG_NF_TABLES_ARP=y +CONFIG_NF_TABLES_BRIDGE=y +CONFIG_NF_TABLES_INET=y +CONFIG_NF_TABLES_IPV4=y +CONFIG_NF_TABLES_IPV6=y +CONFIG_NF_TABLES_NETDEV=y +# CONFIG_NF_TABLES_SET is not set +# CONFIG_NF_TPROXY_IPV4 is not set +# CONFIG_NF_TPROXY_IPV6 is not set +# CONFIG_NI65 is not set +# CONFIG_NI903X_WDT is not set +# CONFIG_NIC7018_WDT is not set +# CONFIG_NILFS2_FS is not set +# CONFIG_NIU is not set +# CONFIG_NI_XGE_MANAGEMENT_ENET is not set +CONFIG_NLATTR=y +# CONFIG_NLMON is not set +# CONFIG_NLM_XLP_BOARD is not set +# CONFIG_NLM_XLR_BOARD is not set +# CONFIG_NLS is not set +# CONFIG_NLS_ASCII is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +# CONFIG_NLS_UTF8 is not set +CONFIG_NMI_LOG_BUF_SHIFT=13 +# CONFIG_NOA1305 is not set +# CONFIG_NOP_USB_XCEIV is not set +# CONFIG_NORTEL_HERMES is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +# CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT is not set +# CONFIG_NOZOMI is not set +# CONFIG_NO_BOOTMEM is not set +# CONFIG_NO_HZ is not set +# CONFIG_NO_HZ_FULL is not set +# CONFIG_NO_HZ_IDLE is not set +# CONFIG_NS83820 is not set +# CONFIG_NTB is not set +# CONFIG_NTFS3_64BIT_CLUSTER is not set +# CONFIG_NTFS3_FS is not set +# CONFIG_NTFS3_FS_POSIX_ACL is not set +# CONFIG_NTFS3_LZX_XPRESS is not set +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_NTP_PPS is not set +# CONFIG_NULL_TTY is not set +# CONFIG_NUMA is not set +# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set +# CONFIG_NVM is not set +# CONFIG_NVMEM is not set +# CONFIG_NVMEM_BCM_OCOTP is not set +# CONFIG_NVMEM_IMX_OCOTP is not set +# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set +# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set +# CONFIG_NVMEM_REBOOT_MODE is not set +# CONFIG_NVMEM_RMEM is not set +# CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_U_BOOT_ENV is not set +# CONFIG_NVME_FC is not set +# CONFIG_NVME_TARGET is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVRAM is not set +# CONFIG_NV_TCO is not set +# CONFIG_NXP_C45_TJA11XX_PHY is not set +# CONFIG_NXP_STB220 is not set +# CONFIG_NXP_STB225 is not set +# CONFIG_NXP_TJA11XX_PHY is not set +# CONFIG_N_GSM is not set +# CONFIG_OABI_COMPAT is not set +# CONFIG_OBS600 is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_OCTEONTX2_AF is not set +# CONFIG_OCTEONTX2_PF is not set +# CONFIG_OF_OVERLAY is not set +CONFIG_OF_RESERVED_MEM=y +# CONFIG_OF_UNITTEST is not set +# CONFIG_OID_REGISTRY is not set +# CONFIG_OMAP2_DSS_DEBUG is not set +# CONFIG_OMAP2_DSS_DEBUGFS is not set +# CONFIG_OMAP2_DSS_SDI is not set +# CONFIG_OMAP_OCP2SCP is not set +# CONFIG_OMAP_USB2 is not set +# CONFIG_OMFS_FS is not set +# CONFIG_OPENVSWITCH is not set +# CONFIG_OPROFILE is not set +# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set +# CONFIG_OPT3001 is not set +CONFIG_OPTIMIZE_INLINING=y +# CONFIG_ORANGEFS_FS is not set +# CONFIG_ORION_WATCHDOG is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_OSNOISE_TRACER is not set +CONFIG_OVERLAY_FS=y +# CONFIG_OVERLAY_FS_INDEX is not set +# CONFIG_OVERLAY_FS_METACOPY is not set +CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y +# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set +CONFIG_OVERLAY_FS_XINO_AUTO=y +# CONFIG_OWL_LOADER is not set +# CONFIG_P54_COMMON is not set +# CONFIG_PA12203001 is not set +CONFIG_PACKET=y +# CONFIG_PACKET_DIAG is not set +# CONFIG_PACKING is not set +# CONFIG_PAGE_EXTENSION is not set +# CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_PAGE_POOL is not set +# CONFIG_PAGE_POOL_STATS is not set +# CONFIG_PAGE_REPORTING is not set +# CONFIG_PAGE_SIZE_16KB is not set +# CONFIG_PAGE_SIZE_32KB is not set +CONFIG_PAGE_SIZE_4KB=y +# CONFIG_PAGE_SIZE_64KB is not set +# CONFIG_PAGE_SIZE_8KB is not set +# CONFIG_PALMAS_GPADC is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_PANEL is not set +CONFIG_PANIC_ON_OOPS=y +CONFIG_PANIC_ON_OOPS_VALUE=1 +CONFIG_PANIC_TIMEOUT=1 +# CONFIG_PANTHERLORD_FF is not set +# CONFIG_PARAVIRT is not set +# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set +# CONFIG_PARPORT is not set +# CONFIG_PARPORT_1284 is not set +# CONFIG_PARPORT_AX88796 is not set +# CONFIG_PARPORT_GSC is not set +# CONFIG_PARPORT_PC is not set +CONFIG_PARTITION_ADVANCED=y +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARASAN_CF is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_ATP867X is not set +# CONFIG_PATA_CMD640_PCI is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CS5520 is not set +# CONFIG_PATA_CS5530 is not set +# CONFIG_PATA_CS5535 is not set +# CONFIG_PATA_CS5536 is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IMX is not set +# CONFIG_PATA_ISAPNP is not set +# CONFIG_PATA_IT8213 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_LEGACY is not set +# CONFIG_PATA_MARVELL is not set +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NINJA32 is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_NS87415 is not set +# CONFIG_PATA_OCTEON_CF is not set +# CONFIG_PATA_OF_PLATFORM is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_OPTI is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PCMCIA is not set +# CONFIG_PATA_PDC2027X is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_PLATFORM is not set +# CONFIG_PATA_QDI is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RDC is not set +# CONFIG_PATA_RZ1000 is not set +# CONFIG_PATA_SC1200 is not set +# CONFIG_PATA_SCH is not set +# CONFIG_PATA_SERVERWORKS is not set +# CONFIG_PATA_SIL680 is not set +# CONFIG_PATA_SIS is not set +# CONFIG_PATA_TOSHIBA is not set +# CONFIG_PATA_TRIFLEX is not set +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set +# CONFIG_PATA_WINBOND_VLB is not set +# CONFIG_PC104 is not set +# CONFIG_PC300TOO is not set +# CONFIG_PCCARD is not set +# CONFIG_PCH_DMA is not set +# CONFIG_PCH_GBE is not set +# CONFIG_PCH_PHUB is not set +# CONFIG_PCI is not set +# CONFIG_PCI200SYN is not set +# CONFIG_PCIEAER is not set +# CONFIG_PCIEAER_INJECT is not set +# CONFIG_PCIEASPM is not set +# CONFIG_PCIEPORTBUS is not set +# CONFIG_PCIE_AL is not set +# CONFIG_PCIE_ALTERA is not set +# CONFIG_PCIE_ARMADA_8K is not set +CONFIG_PCIE_BUS_DEFAULT=y +# CONFIG_PCIE_BUS_PEER2PEER is not set +# CONFIG_PCIE_BUS_PERFORMANCE is not set +# CONFIG_PCIE_BUS_SAFE is not set +# CONFIG_PCIE_BUS_TUNE_OFF is not set +# CONFIG_PCIE_BW is not set +# CONFIG_PCIE_CADENCE_HOST is not set +# CONFIG_PCIE_CADENCE_PLAT_HOST is not set +# CONFIG_PCIE_DPC is not set +# CONFIG_PCIE_DW_PLAT is not set +# CONFIG_PCIE_DW_PLAT_HOST is not set +# CONFIG_PCIE_ECRC is not set +# CONFIG_PCIE_IPROC is not set +# CONFIG_PCIE_KIRIN is not set +# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set +# CONFIG_PCIE_MEDIATEK_GEN3 is not set +# CONFIG_PCIE_MICROCHIP_HOST is not set +# CONFIG_PCIE_PTM is not set +# CONFIG_PCIE_XILINX is not set +# CONFIG_PCIPCWATCHDOG is not set +# CONFIG_PCI_ATMEL is not set +# CONFIG_PCI_CNB20LE_QUIRK is not set +# CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_DISABLE_COMMON_QUIRKS is not set +# CONFIG_PCI_ENDPOINT is not set +# CONFIG_PCI_ENDPOINT_TEST is not set +# CONFIG_PCI_FTPCI100 is not set +# CONFIG_PCI_HERMES is not set +# CONFIG_PCI_HISI is not set +# CONFIG_PCI_HOST_GENERIC is not set +# CONFIG_PCI_HOST_THUNDER_ECAM is not set +# CONFIG_PCI_HOST_THUNDER_PEM is not set +# CONFIG_PCI_IOV is not set +# CONFIG_PCI_J721E_HOST is not set +# CONFIG_PCI_LAYERSCAPE is not set +# CONFIG_PCI_MESON is not set +# CONFIG_PCI_MSI is not set +# CONFIG_PCI_PASID is not set +# CONFIG_PCI_PF_STUB is not set +# CONFIG_PCI_PRI is not set +CONFIG_PCI_QUIRKS=y +# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set +# CONFIG_PCI_STUB is not set +# CONFIG_PCI_SW_SWITCHTEC is not set +CONFIG_PCI_SYSCALL=y +# CONFIG_PCI_V3_SEMI is not set +# CONFIG_PCI_XGENE is not set +# CONFIG_PCMCIA is not set +# CONFIG_PCMCIA_3C574 is not set +# CONFIG_PCMCIA_3C589 is not set +# CONFIG_PCMCIA_AHA152X is not set +# CONFIG_PCMCIA_ATMEL is not set +# CONFIG_PCMCIA_AXNET is not set +# CONFIG_PCMCIA_DEBUG is not set +# CONFIG_PCMCIA_FDOMAIN is not set +# CONFIG_PCMCIA_FMVJ18X is not set +# CONFIG_PCMCIA_HERMES is not set +# CONFIG_PCMCIA_LOAD_CIS is not set +# CONFIG_PCMCIA_NINJA_SCSI is not set +# CONFIG_PCMCIA_NMCLAN is not set +# CONFIG_PCMCIA_PCNET is not set +# CONFIG_PCMCIA_QLOGIC is not set +# CONFIG_PCMCIA_RAYCS is not set +# CONFIG_PCMCIA_SMC91C92 is not set +# CONFIG_PCMCIA_SPECTRUM is not set +# CONFIG_PCMCIA_SYM53C500 is not set +# CONFIG_PCMCIA_WL3501 is not set +# CONFIG_PCMCIA_XIRC2PS is not set +# CONFIG_PCMCIA_XIRCOM is not set +# CONFIG_PCNET32 is not set +# CONFIG_PCPU_DEV_REFCNT is not set +# CONFIG_PCSPKR_PLATFORM is not set +# CONFIG_PCS_XPCS is not set +# CONFIG_PD6729 is not set +# CONFIG_PDA_POWER is not set +# CONFIG_PDC_ADMA is not set +# CONFIG_PERCPU_STATS is not set +# CONFIG_PERCPU_TEST is not set +# CONFIG_PERF_EVENTS is not set +# CONFIG_PERF_EVENTS_AMD_POWER is not set +# CONFIG_PERSISTENT_KEYRINGS is not set +# CONFIG_PHANTOM is not set +# CONFIG_PHONET is not set +# CONFIG_PHYLIB is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set +# CONFIG_PHY_CADENCE_DP is not set +# CONFIG_PHY_CADENCE_DPHY is not set +# CONFIG_PHY_CADENCE_SALVO is not set +# CONFIG_PHY_CADENCE_SIERRA is not set +# CONFIG_PHY_CADENCE_TORRENT is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set +# CONFIG_PHY_CPCAP_USB is not set +# CONFIG_PHY_EXYNOS_DP_VIDEO is not set +# CONFIG_PHY_EXYNOS_MIPI_VIDEO is not set +# CONFIG_PHY_FSL_IMX8MQ_USB is not set +# CONFIG_PHY_INGENIC_USB is not set +# CONFIG_PHY_INTEL_KEEMBAY_EMMC is not set +# CONFIG_PHY_MAPPHONE_MDM6600 is not set +# CONFIG_PHY_MIXEL_MIPI_DPHY is not set +# CONFIG_PHY_MTK_HDMI is not set +# CONFIG_PHY_MTK_MIPI_DSI is not set +# CONFIG_PHY_MVEBU_CP110_UTMI is not set +# CONFIG_PHY_OCELOT_SERDES is not set +# CONFIG_PHY_PISTACHIO_USB is not set +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_QCOM_DWC3 is not set +# CONFIG_PHY_QCOM_USB_HS is not set +# CONFIG_PHY_QCOM_USB_HSIC is not set +# CONFIG_PHY_SAMSUNG_USB2 is not set +# CONFIG_PHY_TUSB1210 is not set +# CONFIG_PHY_XGENE is not set +# CONFIG_PI433 is not set +# CONFIG_PID_IN_CONTEXTIDR is not set +# CONFIG_PID_NS is not set +CONFIG_PINCONF=y +# CONFIG_PINCTRL is not set +# CONFIG_PINCTRL_AMD is not set +# CONFIG_PINCTRL_AXP209 is not set +# CONFIG_PINCTRL_CEDARFORK is not set +# CONFIG_PINCTRL_EXYNOS is not set +# CONFIG_PINCTRL_EXYNOS5440 is not set +# CONFIG_PINCTRL_ICELAKE is not set +# CONFIG_PINCTRL_INGENIC is not set +# CONFIG_PINCTRL_LPASS_LPI is not set +# CONFIG_PINCTRL_MCP23S08 is not set +# CONFIG_PINCTRL_MDM9607 is not set +# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set +# CONFIG_PINCTRL_MSM8953 is not set +# CONFIG_PINCTRL_MSM8X74 is not set +# CONFIG_PINCTRL_MT6779 is not set +# CONFIG_PINCTRL_MT8167 is not set +# CONFIG_PINCTRL_MT8192 is not set +# CONFIG_PINCTRL_MT8195 is not set +# CONFIG_PINCTRL_MT8365 is not set +# CONFIG_PINCTRL_MTK_V2 is not set +# CONFIG_PINCTRL_OCELOT is not set +# CONFIG_PINCTRL_PISTACHIO is not set +# CONFIG_PINCTRL_SC7280 is not set +# CONFIG_PINCTRL_SC8180X is not set +# CONFIG_PINCTRL_SDX55 is not set +CONFIG_PINCTRL_SINGLE=y +# CONFIG_PINCTRL_SM6115 is not set +# CONFIG_PINCTRL_SM6125 is not set +# CONFIG_PINCTRL_SM8350 is not set +# CONFIG_PINCTRL_STMFX is not set +# CONFIG_PINCTRL_SX150X is not set +# CONFIG_PING is not set +CONFIG_PINMUX=y +# CONFIG_PKCS7_MESSAGE_PARSER is not set +# CONFIG_PL310_ERRATA_588369 is not set +# CONFIG_PL310_ERRATA_727915 is not set +# CONFIG_PL310_ERRATA_753970 is not set +# CONFIG_PL310_ERRATA_769419 is not set +# CONFIG_PL320_MBOX is not set +# CONFIG_PL330_DMA is not set +# CONFIG_PLATFORM_MHU is not set +# CONFIG_PLAT_SPEAR is not set +# CONFIG_PLIP is not set +# CONFIG_PLX_DMA is not set +# CONFIG_PLX_HERMES is not set +# CONFIG_PM is not set +# CONFIG_PMBUS is not set +# CONFIG_PMC_MSP is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_PMS7003 is not set +# CONFIG_PM_AUTOSLEEP is not set +# CONFIG_PM_DEBUG is not set +# CONFIG_PM_DEVFREQ is not set +# CONFIG_PM_WAKELOCKS is not set +# CONFIG_POSIX_MQUEUE is not set +CONFIG_POSIX_TIMERS=y +# CONFIG_POWERCAP is not set +# CONFIG_POWER_AVS is not set +# CONFIG_POWER_RESET is not set +# CONFIG_POWER_RESET_BRCMKONA is not set +# CONFIG_POWER_RESET_BRCMSTB is not set +# CONFIG_POWER_RESET_GPIO is not set +# CONFIG_POWER_RESET_GPIO_RESTART is not set +# CONFIG_POWER_RESET_LINKSTATION is not set +# CONFIG_POWER_RESET_LTC2952 is not set +# CONFIG_POWER_RESET_PIIX4_POWEROFF is not set +# CONFIG_POWER_RESET_QNAP is not set +# CONFIG_POWER_RESET_REGULATOR is not set +# CONFIG_POWER_RESET_RESTART is not set +# CONFIG_POWER_RESET_SYSCON is not set +# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set +# CONFIG_POWER_RESET_VERSATILE is not set +# CONFIG_POWER_RESET_XGENE is not set +# CONFIG_POWER_SUPPLY is not set +# CONFIG_POWER_SUPPLY_DEBUG is not set +# CONFIG_POWER_SUPPLY_HWMON is not set +# CONFIG_PPC4xx_GPIO is not set +# CONFIG_PPC_16K_PAGES is not set +# CONFIG_PPC_256K_PAGES is not set +CONFIG_PPC_4K_PAGES=y +# CONFIG_PPC_64K_PAGES is not set +# CONFIG_PPC_DISABLE_WERROR is not set +# CONFIG_PPC_EMULATED_STATS is not set +# CONFIG_PPC_EPAPR_HV_BYTECHAN is not set +# CONFIG_PPC_QUEUED_SPINLOCKS is not set +# CONFIG_PPP is not set +# CONFIG_PPPOATM is not set +# CONFIG_PPPOE is not set +# CONFIG_PPPOL2TP is not set +# CONFIG_PPP_ASYNC is not set +# CONFIG_PPP_BSDCOMP is not set +# CONFIG_PPP_DEFLATE is not set +CONFIG_PPP_FILTER=y +# CONFIG_PPP_MPPE is not set +CONFIG_PPP_MULTILINK=y +# CONFIG_PPP_SYNC_TTY is not set +# CONFIG_PPS is not set +# CONFIG_PPS_CLIENT_GPIO is not set +# CONFIG_PPS_CLIENT_KTIMER is not set +# CONFIG_PPS_CLIENT_LDISC is not set +# CONFIG_PPS_CLIENT_PARPORT is not set +# CONFIG_PPS_DEBUG is not set +# CONFIG_PPTP is not set +# CONFIG_PREEMPT is not set +# CONFIG_PREEMPTIRQ_DELAY_TEST is not set +# CONFIG_PREEMPTIRQ_EVENTS is not set +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_TRACER is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +# CONFIG_PRESTERA is not set +CONFIG_PREVENT_FIRMWARE_BUILD=y +# CONFIG_PRIME_NUMBERS is not set +CONFIG_PRINTK=y +# CONFIG_PRINTK_CALLER is not set +# CONFIG_PRINTK_INDEX is not set +CONFIG_PRINTK_NMI=y +CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +# CONFIG_PRINTK_TIME is not set +CONFIG_PRINT_STACK_DEPTH=64 +# CONFIG_PRISM2_USB is not set +# CONFIG_PRISM54 is not set +# CONFIG_PROC_CHILDREN is not set +CONFIG_PROC_FS=y +# CONFIG_PROC_KCORE is not set +# CONFIG_PROC_PAGE_MONITOR is not set +# CONFIG_PROC_STRIPPED is not set +CONFIG_PROC_SYSCTL=y +# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set +# CONFIG_PROFILE_ALL_BRANCHES is not set +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +# CONFIG_PROFILING is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_PROVE_RAW_LOCK_NESTING is not set +# CONFIG_PROVE_RCU is not set +# CONFIG_PROVE_RCU_LIST is not set +# CONFIG_PROVE_RCU_REPEATEDLY is not set +# CONFIG_PSAMPLE is not set +# CONFIG_PSB6970_PHY is not set +# CONFIG_PSI is not set +# CONFIG_PSTORE is not set +# CONFIG_PSTORE_842_COMPRESS is not set +# CONFIG_PSTORE_BLK is not set +# CONFIG_PSTORE_COMPRESS is not set +# CONFIG_PSTORE_CONSOLE is not set +CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 +# CONFIG_PSTORE_DEFLATE_COMPRESS is not set +# CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT is not set +# CONFIG_PSTORE_FTRACE is not set +# CONFIG_PSTORE_LZ4HC_COMPRESS is not set +# CONFIG_PSTORE_LZ4_COMPRESS is not set +# CONFIG_PSTORE_LZO_COMPRESS is not set +# CONFIG_PSTORE_PMSG is not set +# CONFIG_PSTORE_RAM is not set +# CONFIG_PSTORE_ZSTD_COMPRESS is not set +# CONFIG_PTDUMP_DEBUGFS is not set +# CONFIG_PTP_1588_CLOCK is not set +# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set +# CONFIG_PTP_1588_CLOCK_IDTCM is not set +# CONFIG_PTP_1588_CLOCK_IXP46X is not set +# CONFIG_PTP_1588_CLOCK_KVM is not set +# CONFIG_PTP_1588_CLOCK_OCP is not set +# CONFIG_PTP_1588_CLOCK_PCH is not set +# CONFIG_PTP_1588_CLOCK_VMW is not set +# CONFIG_PUBLIC_KEY_ALGO_RSA is not set +# CONFIG_PVPANIC is not set +# CONFIG_PWM is not set +# CONFIG_PWM_ATMEL_TCB is not set +# CONFIG_PWM_DEBUG is not set +# CONFIG_PWM_DWC is not set +# CONFIG_PWM_FSL_FTM is not set +# CONFIG_PWM_IMG is not set +# CONFIG_PWM_JZ4740 is not set +# CONFIG_PWM_MEDIATEK is not set +# CONFIG_PWM_PCA9685 is not set +# CONFIG_PWM_RASPBERRYPI_POE is not set +CONFIG_PWRSEQ_EMMC=y +# CONFIG_PWRSEQ_SD8787 is not set +CONFIG_PWRSEQ_SIMPLE=y +# CONFIG_QCA7000 is not set +# CONFIG_QCA7000_SPI is not set +# CONFIG_QCA7000_UART is not set +# CONFIG_QCOM_A7PLL is not set +# CONFIG_QCOM_EMAC is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set +# CONFIG_QCOM_GPI_DMA is not set +# CONFIG_QCOM_HIDMA is not set +# CONFIG_QCOM_HIDMA_MGMT is not set +# CONFIG_QCOM_LMH is not set +# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set +# CONFIG_QCOM_SPMI_ADC5 is not set +# CONFIG_QCOM_SPMI_ADC_TM5 is not set +# CONFIG_QCOM_SPMI_IADC is not set +# CONFIG_QCOM_SPMI_TEMP_ALARM is not set +# CONFIG_QCOM_SPMI_VADC is not set +# CONFIG_QED is not set +# CONFIG_QFMT_V1 is not set +# CONFIG_QLA3XXX is not set +# CONFIG_QLCNIC is not set +# CONFIG_QLGE is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX6FS_FS is not set +# CONFIG_QORIQ_CPUFREQ is not set +# CONFIG_QORIQ_THERMAL is not set +# CONFIG_QRTR is not set +# CONFIG_QRTR_MHI is not set +# CONFIG_QRTR_TUN is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_QUEUED_LOCK_STAT is not set +# CONFIG_QUICC_ENGINE is not set +# CONFIG_QUOTA is not set +# CONFIG_QUOTACTL is not set +# CONFIG_QUOTA_DEBUG is not set +# CONFIG_QUOTA_NETLINK_INTERFACE is not set +# CONFIG_R3964 is not set +# CONFIG_R6040 is not set +# CONFIG_R8169 is not set +# CONFIG_R8188EU is not set +# CONFIG_R8712U is not set +# CONFIG_R8723AU is not set +# CONFIG_RADIO_ADAPTERS is not set +# CONFIG_RADIO_AZTECH is not set +# CONFIG_RADIO_CADET is not set +# CONFIG_RADIO_GEMTEK is not set +# CONFIG_RADIO_MAXIRADIO is not set +# CONFIG_RADIO_RTRACK is not set +# CONFIG_RADIO_RTRACK2 is not set +# CONFIG_RADIO_SF16FMI is not set +# CONFIG_RADIO_SF16FMR2 is not set +# CONFIG_RADIO_TERRATEC is not set +# CONFIG_RADIO_TRUST is not set +# CONFIG_RADIO_TYPHOON is not set +# CONFIG_RADIO_ZOLTRIX is not set +# CONFIG_RAID6_PQ_BENCHMARK is not set +# CONFIG_RAID_ATTRS is not set +# CONFIG_RALINK is not set +# CONFIG_RANDOM32_SELFTEST is not set +# CONFIG_RANDOMIZE_BASE is not set +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set +CONFIG_RANDOM_TRUST_BOOTLOADER=y +CONFIG_RANDOM_TRUST_CPU=y +# CONFIG_RAPIDIO is not set +# CONFIG_RAS is not set +# CONFIG_RBTREE_TEST is not set +# CONFIG_RCU_BOOST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +# CONFIG_RCU_EQS_DEBUG is not set +# CONFIG_RCU_EXPEDITE_BOOT is not set +# CONFIG_RCU_EXPERT is not set +CONFIG_RCU_KTHREAD_PRIO=0 +CONFIG_RCU_NEED_SEGCBLIST=y +# CONFIG_RCU_PERF_TEST is not set +# CONFIG_RCU_REF_SCALE_TEST is not set +# CONFIG_RCU_SCALE_TEST is not set +CONFIG_RCU_STALL_COMMON=y +# CONFIG_RCU_STRICT_GRACE_PERIOD is not set +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_RCU_TORTURE_TEST_SLOW_INIT_DELAY=3 +# CONFIG_RCU_TRACE is not set +# CONFIG_RC_ATI_REMOTE is not set +# CONFIG_RC_CORE is not set +# CONFIG_RC_DECODERS is not set +# CONFIG_RC_LOOPBACK is not set +# CONFIG_RC_MAP is not set +# CONFIG_RC_XBOX_DVD is not set +# CONFIG_RDS is not set +# CONFIG_RD_BZIP2 is not set +# CONFIG_RD_GZIP is not set +# CONFIG_RD_LZ4 is not set +# CONFIG_RD_LZMA is not set +# CONFIG_RD_LZO is not set +# CONFIG_RD_XZ is not set +# CONFIG_RD_ZSTD is not set +# CONFIG_READABLE_ASM is not set +# CONFIG_READ_ONLY_THP_FOR_FS is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_REDWOOD is not set +# CONFIG_REED_SOLOMON is not set +# CONFIG_REED_SOLOMON_DEC8 is not set +# CONFIG_REED_SOLOMON_ENC8 is not set +# CONFIG_REED_SOLOMON_TEST is not set +# CONFIG_REGMAP is not set +# CONFIG_REGMAP_I2C is not set +# CONFIG_REGMAP_MMIO is not set +# CONFIG_REGMAP_SPI is not set +# CONFIG_REGULATOR is not set +# CONFIG_REGULATOR_88PG86X is not set +# CONFIG_REGULATOR_ACT8865 is not set +# CONFIG_REGULATOR_AD5398 is not set +# CONFIG_REGULATOR_ANATOP is not set +# CONFIG_REGULATOR_DA9121 is not set +# CONFIG_REGULATOR_DA9210 is not set +# CONFIG_REGULATOR_DA9211 is not set +# CONFIG_REGULATOR_DEBUG is not set +# CONFIG_REGULATOR_FAN53555 is not set +# CONFIG_REGULATOR_FAN53880 is not set +# CONFIG_REGULATOR_FIXED_VOLTAGE is not set +# CONFIG_REGULATOR_GPIO is not set +# CONFIG_REGULATOR_ISL6271A is not set +# CONFIG_REGULATOR_ISL9305 is not set +# CONFIG_REGULATOR_LP3971 is not set +# CONFIG_REGULATOR_LP3972 is not set +# CONFIG_REGULATOR_LP872X is not set +# CONFIG_REGULATOR_LP8755 is not set +# CONFIG_REGULATOR_LTC3589 is not set +# CONFIG_REGULATOR_LTC3676 is not set +# CONFIG_REGULATOR_MAX1586 is not set +# CONFIG_REGULATOR_MAX77620 is not set +# CONFIG_REGULATOR_MAX77826 is not set +# CONFIG_REGULATOR_MAX8649 is not set +# CONFIG_REGULATOR_MAX8660 is not set +# CONFIG_REGULATOR_MAX8893 is not set +# CONFIG_REGULATOR_MAX8952 is not set +# CONFIG_REGULATOR_MAX8973 is not set +# CONFIG_REGULATOR_MCP16502 is not set +# CONFIG_REGULATOR_MP5416 is not set +# CONFIG_REGULATOR_MP8859 is not set +# CONFIG_REGULATOR_MP886X is not set +# CONFIG_REGULATOR_MPQ7920 is not set +# CONFIG_REGULATOR_MT6311 is not set +# CONFIG_REGULATOR_MT6315 is not set +# CONFIG_REGULATOR_MT6359 is not set +# CONFIG_REGULATOR_PCA9450 is not set +# CONFIG_REGULATOR_PF8X00 is not set +# CONFIG_REGULATOR_PFUZE100 is not set +# CONFIG_REGULATOR_PV88060 is not set +# CONFIG_REGULATOR_PV88080 is not set +# CONFIG_REGULATOR_PV88090 is not set +# CONFIG_REGULATOR_PWM is not set +# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set +# CONFIG_REGULATOR_RT4801 is not set +# CONFIG_REGULATOR_RT6160 is not set +# CONFIG_REGULATOR_RT6245 is not set +# CONFIG_REGULATOR_RTMV20 is not set +# CONFIG_REGULATOR_RTQ2134 is not set +# CONFIG_REGULATOR_RTQ6752 is not set +# CONFIG_REGULATOR_SLG51000 is not set +# CONFIG_REGULATOR_SY8106A is not set +# CONFIG_REGULATOR_SY8824X is not set +# CONFIG_REGULATOR_SY8827N is not set +# CONFIG_REGULATOR_TI_ABB is not set +# CONFIG_REGULATOR_TPS51632 is not set +# CONFIG_REGULATOR_TPS62360 is not set +# CONFIG_REGULATOR_TPS65023 is not set +# CONFIG_REGULATOR_TPS6507X is not set +# CONFIG_REGULATOR_TPS65132 is not set +# CONFIG_REGULATOR_TPS6524X is not set +# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set +# CONFIG_REGULATOR_VCTRL is not set +# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_FS_POSIX_ACL is not set +# CONFIG_REISERFS_FS_SECURITY is not set +CONFIG_REISERFS_FS_XATTR=y +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_RELAY is not set +# CONFIG_RELOCATABLE is not set +# CONFIG_REMOTEPROC is not set +# CONFIG_RENESAS_PHY is not set +# CONFIG_RESET_ATH79 is not set +# CONFIG_RESET_BERLIN is not set +# CONFIG_RESET_BRCMSTB_RESCAL is not set +# CONFIG_RESET_CONTROLLER is not set +# CONFIG_RESET_IMX7 is not set +# CONFIG_RESET_INTEL_GW is not set +# CONFIG_RESET_LANTIQ is not set +# CONFIG_RESET_LPC18XX is not set +# CONFIG_RESET_MESON is not set +# CONFIG_RESET_PISTACHIO is not set +# CONFIG_RESET_SOCFPGA is not set +# CONFIG_RESET_STM32 is not set +# CONFIG_RESET_SUNXI is not set +# CONFIG_RESET_TEGRA_BPMP is not set +# CONFIG_RESET_TI_SYSCON is not set +# CONFIG_RESET_ZYNQ is not set +# CONFIG_RFD77402 is not set +# CONFIG_RFD_FTL is not set +CONFIG_RFKILL=y +# CONFIG_RFKILL_FULL is not set +# CONFIG_RFKILL_GPIO is not set +# CONFIG_RFKILL_INPUT is not set +# CONFIG_RFKILL_LEDS is not set +# CONFIG_RFKILL_REGULATOR is not set +# CONFIG_RING_BUFFER_BENCHMARK is not set +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set +# CONFIG_RMI4_CORE is not set +# CONFIG_RMNET is not set +# CONFIG_ROCKCHIP_PHY is not set +# CONFIG_ROCKER is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_ROSE is not set +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPMSG_QCOM_GLINK_RPM is not set +# CONFIG_RPMSG_VIRTIO is not set +# CONFIG_RPMSG_WWAN_CTRL is not set +# CONFIG_RPR0521 is not set +# CONFIG_RSEQ is not set +# CONFIG_RT2X00 is not set +# CONFIG_RTC_CLASS is not set +# CONFIG_RTC_DEBUG is not set +# CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABEOZ9 is not set +# CONFIG_RTC_DRV_ABX80X is not set +# CONFIG_RTC_DRV_ARMADA38X is not set +# CONFIG_RTC_DRV_AU1XXX is not set +# CONFIG_RTC_DRV_BQ32K is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_CADENCE is not set +CONFIG_RTC_DRV_CMOS=y +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1302 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1307_CENTURY is not set +# CONFIG_RTC_DRV_DS1307_HWMON is not set +# CONFIG_RTC_DRV_DS1343 is not set +# CONFIG_RTC_DRV_DS1347 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_DS1685_FAMILY is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_DS2404 is not set +# CONFIG_RTC_DRV_DS3232 is not set +# CONFIG_RTC_DRV_DS3234 is not set +# CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_EP93XX is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_FTRTC010 is not set +# CONFIG_RTC_DRV_GENERIC is not set +# CONFIG_RTC_DRV_GOLDFISH is not set +# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set +# CONFIG_RTC_DRV_HYM8563 is not set +# CONFIG_RTC_DRV_ISL12022 is not set +# CONFIG_RTC_DRV_ISL12026 is not set +# CONFIG_RTC_DRV_ISL12057 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_JZ4740 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_M41T93 is not set +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_MAX6916 is not set +# CONFIG_RTC_DRV_MAX77686 is not set +# CONFIG_RTC_DRV_MCP795 is not set +# CONFIG_RTC_DRV_MOXART is not set +# CONFIG_RTC_DRV_MPC5121 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_MT2712 is not set +# CONFIG_RTC_DRV_OMAP is not set +# CONFIG_RTC_DRV_PCF2123 is not set +# CONFIG_RTC_DRV_PCF2127 is not set +# CONFIG_RTC_DRV_PCF85063 is not set +# CONFIG_RTC_DRV_PCF8523 is not set +# CONFIG_RTC_DRV_PCF85363 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_PL030 is not set +# CONFIG_RTC_DRV_PL031 is not set +# CONFIG_RTC_DRV_PS3 is not set +# CONFIG_RTC_DRV_PT7C4338 is not set +# CONFIG_RTC_DRV_R7301 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_RTC7301 is not set +# CONFIG_RTC_DRV_RV3028 is not set +# CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RV3032 is not set +# CONFIG_RTC_DRV_RV8803 is not set +# CONFIG_RTC_DRV_RX4581 is not set +# CONFIG_RTC_DRV_RX6110 is not set +# CONFIG_RTC_DRV_RX8010 is not set +# CONFIG_RTC_DRV_RX8025 is not set +# CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_SD3078 is not set +# CONFIG_RTC_DRV_SNVS is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_SUN6I is not set +# CONFIG_RTC_DRV_TEGRA is not set +# CONFIG_RTC_DRV_TEST is not set +# CONFIG_RTC_DRV_V3020 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_XGENE is not set +# CONFIG_RTC_DRV_ZYNQMP is not set +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_LIB=y +# CONFIG_RTC_NVMEM is not set +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_SYSTOHC_DEVICE="rtc0" +# CONFIG_RTL8180 is not set +# CONFIG_RTL8187 is not set +# CONFIG_RTL8192E is not set +# CONFIG_RTL8192U is not set +# CONFIG_RTL8306_PHY is not set +# CONFIG_RTL8366RB_PHY is not set +# CONFIG_RTL8366S_PHY is not set +# CONFIG_RTL8366_SMI is not set +# CONFIG_RTL8366_SMI_DEBUG_FS is not set +# CONFIG_RTL8367B_PHY is not set +# CONFIG_RTL8367_PHY is not set +# CONFIG_RTLLIB is not set +# CONFIG_RTL_CARDS is not set +# CONFIG_RTS5208 is not set +CONFIG_RT_MUTEXES=y +# CONFIG_RUNTIME_DEBUG is not set +CONFIG_RUNTIME_TESTING_MENU=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_RXKAD=y +# CONFIG_S2IO is not set +# CONFIG_SAMPLES is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SATA_ACARD_AHCI is not set +# CONFIG_SATA_AHCI is not set +# CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_SATA_DWC is not set +# CONFIG_SATA_FSL is not set +# CONFIG_SATA_HIGHBANK is not set +# CONFIG_SATA_HOST is not set +# CONFIG_SATA_INIC162X is not set +CONFIG_SATA_MOBILE_LPM_POLICY=0 +# CONFIG_SATA_MV is not set +# CONFIG_SATA_NV is not set +# CONFIG_SATA_PMP is not set +# CONFIG_SATA_PROMISE is not set +# CONFIG_SATA_QSTOR is not set +# CONFIG_SATA_RCAR is not set +# CONFIG_SATA_SIL is not set +# CONFIG_SATA_SIL24 is not set +# CONFIG_SATA_SIS is not set +# CONFIG_SATA_SVW is not set +# CONFIG_SATA_SX4 is not set +# CONFIG_SATA_ULI is not set +# CONFIG_SATA_VIA is not set +# CONFIG_SATA_VITESSE is not set +# CONFIG_SBC_FITPC2_WATCHDOG is not set +CONFIG_SBITMAP=y +# CONFIG_SC92031 is not set +# CONFIG_SCA3000 is not set +# CONFIG_SCA3300 is not set +# CONFIG_SCACHE_DEBUGFS is not set +# CONFIG_SCC is not set +# CONFIG_SCD30_CORE is not set +# CONFIG_SCF_TORTURE_TEST is not set +# CONFIG_SCHEDSTATS is not set +# CONFIG_SCHED_AUTOGROUP is not set +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHED_HRTICK=y +# CONFIG_SCHED_MC is not set +CONFIG_SCHED_OMIT_FRAME_POINTER=y +# CONFIG_SCHED_SMT is not set +CONFIG_SCHED_STACK_END_CHECK=y +# CONFIG_SCHED_TRACER is not set +# CONFIG_SCR24X is not set +# CONFIG_SCSI is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_3W_SAS is not set +# CONFIG_SCSI_7000FASST is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_AHA152X is not set +# CONFIG_SCSI_AHA1542 is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_SCSI_BFA_FC is not set +# CONFIG_SCSI_BNX2X_FCOE is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_CHELSIO_FCOE is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_CXGB4_ISCSI is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_DH is not set +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_DTC3280 is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_ESAS2R is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_FDOMAIN_PCI is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_GDTH is not set +# CONFIG_SCSI_GENERIC_NCR5380 is not set +# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set +# CONFIG_SCSI_HISI_SAS is not set +# CONFIG_SCSI_HPSA is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_IN2000 is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_ISCI is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_LOGGING is not set +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set +# CONFIG_SCSI_LPFC is not set +CONFIG_SCSI_MOD=y +# CONFIG_SCSI_MPI3MR is not set +# CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPT3SAS is not set +# CONFIG_SCSI_MQ_DEFAULT is not set +# CONFIG_SCSI_MVSAS is not set +# CONFIG_SCSI_MVSAS_DEBUG is not set +# CONFIG_SCSI_MVUMI is not set +# CONFIG_SCSI_MYRB is not set +# CONFIG_SCSI_MYRS is not set +# CONFIG_SCSI_NCR53C406A is not set +# CONFIG_SCSI_NETLINK is not set +# CONFIG_SCSI_NSP32 is not set +# CONFIG_SCSI_OSD_INITIATOR is not set +# CONFIG_SCSI_PAS16 is not set +# CONFIG_SCSI_PM8001 is not set +# CONFIG_SCSI_PMCRAID is not set +CONFIG_SCSI_PROC_FS=y +# CONFIG_SCSI_QLA_FC is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLOGIC_FAS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +# CONFIG_SCSI_SMARTPQI is not set +# CONFIG_SCSI_SNIC is not set +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C416 is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_T128 is not set +# CONFIG_SCSI_U14_34F is not set +# CONFIG_SCSI_UFSHCD is not set +# CONFIG_SCSI_ULTRASTOR is not set +# CONFIG_SCSI_VIRTIO is not set +# CONFIG_SCSI_WD719X is not set +# CONFIG_SC_CAMCC_7180 is not set +# CONFIG_SC_DISPCC_7280 is not set +# CONFIG_SC_GCC_7280 is not set +# CONFIG_SC_GCC_8180X is not set +# CONFIG_SC_GPUCC_7280 is not set +# CONFIG_SC_VIDEOCC_7280 is not set +# CONFIG_SCx200_ACB is not set +# CONFIG_SDIO_UART is not set +# CONFIG_SDM_GPUCC_660 is not set +# CONFIG_SDM_MMCC_660 is not set +# CONFIG_SDR_MAX2175 is not set +# CONFIG_SDR_PLATFORM_DRIVERS is not set +# CONFIG_SDX_GCC_55 is not set +# CONFIG_SD_ADC_MODULATOR is not set +# CONFIG_SECCOMP is not set +# CONFIG_SECCOMP_CACHE_DEBUG is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_APPARMOR is not set +CONFIG_SECURITY_DMESG_RESTRICT=y +# CONFIG_SECURITY_LANDLOCK is not set +# CONFIG_SECURITY_LOADPIN is not set +# CONFIG_SECURITY_LOCKDOWN_LSM is not set +# CONFIG_SECURITY_NETWORK_XFRM is not set +# CONFIG_SECURITY_PATH is not set +# CONFIG_SECURITY_SAFESETID is not set +# CONFIG_SECURITY_SELINUX_AVC_STATS is not set +# CONFIG_SECURITY_SELINUX_BOOTPARAM is not set +CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 +# CONFIG_SECURITY_SELINUX_DEVELOP is not set +# CONFIG_SECURITY_SELINUX_DISABLE is not set +# CONFIG_SECURITY_SMACK is not set +# CONFIG_SECURITY_TOMOYO is not set +# CONFIG_SECURITY_YAMA is not set +CONFIG_SELECT_MEMORY_MODEL=y +# CONFIG_SENSIRION_SGP30 is not set +# CONFIG_SENSIRION_SGP40 is not set +# CONFIG_SENSORS_ABITUGURU is not set +# CONFIG_SENSORS_ABITUGURU3 is not set +# CONFIG_SENSORS_ACPI_POWER is not set +# CONFIG_SENSORS_AD7314 is not set +# CONFIG_SENSORS_AD7414 is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADC128D818 is not set +# CONFIG_SENSORS_ADCXX is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1029 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM1177 is not set +# CONFIG_SENSORS_ADM1266 is not set +# CONFIG_SENSORS_ADM1275 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ADS1015 is not set +# CONFIG_SENSORS_ADS7828 is not set +# CONFIG_SENSORS_ADS7871 is not set +# CONFIG_SENSORS_ADT7310 is not set +# CONFIG_SENSORS_ADT7410 is not set +# CONFIG_SENSORS_ADT7411 is not set +# CONFIG_SENSORS_ADT7462 is not set +# CONFIG_SENSORS_ADT7470 is not set +# CONFIG_SENSORS_ADT7475 is not set +# CONFIG_SENSORS_AHT10 is not set +# CONFIG_SENSORS_AMC6821 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_SENSORS_APPLESMC is not set +# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set +# CONFIG_SENSORS_AS370 is not set +# CONFIG_SENSORS_ASB100 is not set +# CONFIG_SENSORS_ASC7621 is not set +# CONFIG_SENSORS_ASPEED is not set +# CONFIG_SENSORS_ATK0110 is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_AXI_FAN_CONTROL is not set +# CONFIG_SENSORS_BEL_PFE is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_BH1780 is not set +# CONFIG_SENSORS_BPA_RS600 is not set +# CONFIG_SENSORS_CORETEMP is not set +# CONFIG_SENSORS_CORSAIR_CPRO is not set +# CONFIG_SENSORS_CORSAIR_PSU is not set +# CONFIG_SENSORS_DELL_SMM is not set +# CONFIG_SENSORS_DME1737 is not set +# CONFIG_SENSORS_DPS920AB is not set +# CONFIG_SENSORS_DRIVETEMP is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_DS620 is not set +# CONFIG_SENSORS_EMC1403 is not set +# CONFIG_SENSORS_EMC2103 is not set +# CONFIG_SENSORS_EMC2305 is not set +# CONFIG_SENSORS_EMC6W201 is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_FAM15H_POWER is not set +# CONFIG_SENSORS_FSCHMD is not set +# CONFIG_SENSORS_FSP_3Y is not set +# CONFIG_SENSORS_FTSTEUTATES is not set +# CONFIG_SENSORS_G760A is not set +# CONFIG_SENSORS_G762 is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_GPIO_FAN is not set +# CONFIG_SENSORS_GSC is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_SENSORS_HIH6130 is not set +# CONFIG_SENSORS_HMC5843 is not set +# CONFIG_SENSORS_HMC5843_I2C is not set +# CONFIG_SENSORS_HMC5843_SPI is not set +# CONFIG_SENSORS_HTU21 is not set +# CONFIG_SENSORS_I5500 is not set +# CONFIG_SENSORS_I5K_AMB is not set +# CONFIG_SENSORS_IBM_CFFPS is not set +# CONFIG_SENSORS_IIO_HWMON is not set +# CONFIG_SENSORS_INA209 is not set +# CONFIG_SENSORS_INA2XX is not set +# CONFIG_SENSORS_INA3221 is not set +# CONFIG_SENSORS_INSPUR_IPSPS is not set +# CONFIG_SENSORS_IR35221 is not set +# CONFIG_SENSORS_IR36021 is not set +# CONFIG_SENSORS_IR38064 is not set +# CONFIG_SENSORS_IRPS5401 is not set +# CONFIG_SENSORS_ISL29018 is not set +# CONFIG_SENSORS_ISL29028 is not set +# CONFIG_SENSORS_ISL68137 is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_JC42 is not set +# CONFIG_SENSORS_K10TEMP is not set +# CONFIG_SENSORS_K8TEMP is not set +# CONFIG_SENSORS_LINEAGE is not set +# CONFIG_SENSORS_LIS3LV02D is not set +# CONFIG_SENSORS_LIS3_I2C is not set +# CONFIG_SENSORS_LIS3_SPI is not set +# CONFIG_SENSORS_LM25066 is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM70 is not set +# CONFIG_SENSORS_LM73 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_LM95234 is not set +# CONFIG_SENSORS_LM95241 is not set +# CONFIG_SENSORS_LM95245 is not set +# CONFIG_SENSORS_LTC2945 is not set +# CONFIG_SENSORS_LTC2947_I2C is not set +# CONFIG_SENSORS_LTC2947_SPI is not set +# CONFIG_SENSORS_LTC2978 is not set +# CONFIG_SENSORS_LTC2990 is not set +# CONFIG_SENSORS_LTC2992 is not set +# CONFIG_SENSORS_LTC3815 is not set +# CONFIG_SENSORS_LTC4151 is not set +# CONFIG_SENSORS_LTC4215 is not set +# CONFIG_SENSORS_LTC4222 is not set +# CONFIG_SENSORS_LTC4245 is not set +# CONFIG_SENSORS_LTC4260 is not set +# CONFIG_SENSORS_LTC4261 is not set +# CONFIG_SENSORS_LTQ_CPUTEMP is not set +# CONFIG_SENSORS_MAX1111 is not set +# CONFIG_SENSORS_MAX127 is not set +# CONFIG_SENSORS_MAX15301 is not set +# CONFIG_SENSORS_MAX16064 is not set +# CONFIG_SENSORS_MAX16065 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_MAX16601 is not set +# CONFIG_SENSORS_MAX1668 is not set +# CONFIG_SENSORS_MAX197 is not set +# CONFIG_SENSORS_MAX20730 is not set +# CONFIG_SENSORS_MAX20751 is not set +# CONFIG_SENSORS_MAX31722 is not set +# CONFIG_SENSORS_MAX31730 is not set +# CONFIG_SENSORS_MAX31785 is not set +# CONFIG_SENSORS_MAX31790 is not set +# CONFIG_SENSORS_MAX34440 is not set +# CONFIG_SENSORS_MAX6621 is not set +# CONFIG_SENSORS_MAX6639 is not set +# CONFIG_SENSORS_MAX6642 is not set +# CONFIG_SENSORS_MAX6650 is not set +# CONFIG_SENSORS_MAX6697 is not set +# CONFIG_SENSORS_MAX8688 is not set +# CONFIG_SENSORS_MCP3021 is not set +# CONFIG_SENSORS_MP2888 is not set +# CONFIG_SENSORS_MP2975 is not set +# CONFIG_SENSORS_MR75203 is not set +# CONFIG_SENSORS_NCT6683 is not set +# CONFIG_SENSORS_NCT6775 is not set +# CONFIG_SENSORS_NCT7802 is not set +# CONFIG_SENSORS_NCT7904 is not set +# CONFIG_SENSORS_NPCM7XX is not set +# CONFIG_SENSORS_NSA320 is not set +# CONFIG_SENSORS_NTC_THERMISTOR is not set +# CONFIG_SENSORS_NZXT_KRAKEN2 is not set +# CONFIG_SENSORS_OCC_P8_I2C is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_SENSORS_PIM4328 is not set +# CONFIG_SENSORS_PM6764TR is not set +# CONFIG_SENSORS_PMBUS is not set +# CONFIG_SENSORS_POWR1220 is not set +# CONFIG_SENSORS_PWM_FAN is not set +# CONFIG_SENSORS_PXE1610 is not set +# CONFIG_SENSORS_Q54SJ108A2 is not set +# CONFIG_SENSORS_RM3100_I2C is not set +# CONFIG_SENSORS_RM3100_SPI is not set +# CONFIG_SENSORS_SBRMI is not set +# CONFIG_SENSORS_SBTSI is not set +# CONFIG_SENSORS_SCH5627 is not set +# CONFIG_SENSORS_SCH5636 is not set +# CONFIG_SENSORS_SCH56XX_COMMON is not set +# CONFIG_SENSORS_SHT15 is not set +# CONFIG_SENSORS_SHT21 is not set +# CONFIG_SENSORS_SHT3x is not set +# CONFIG_SENSORS_SHT4x is not set +# CONFIG_SENSORS_SHTC1 is not set +# CONFIG_SENSORS_SIS5595 is not set +# CONFIG_SENSORS_SMM665 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_STPDDC60 is not set +# CONFIG_SENSORS_STTS751 is not set +# CONFIG_SENSORS_TC654 is not set +# CONFIG_SENSORS_TC74 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_TMP102 is not set +# CONFIG_SENSORS_TMP103 is not set +# CONFIG_SENSORS_TMP108 is not set +# CONFIG_SENSORS_TMP401 is not set +# CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TMP513 is not set +# CONFIG_SENSORS_TPS23861 is not set +# CONFIG_SENSORS_TPS40422 is not set +# CONFIG_SENSORS_TPS53679 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_TSL2563 is not set +# CONFIG_SENSORS_UCD9000 is not set +# CONFIG_SENSORS_UCD9200 is not set +# CONFIG_SENSORS_VEXPRESS is not set +# CONFIG_SENSORS_VIA686A is not set +# CONFIG_SENSORS_VIA_CPUTEMP is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_VT8231 is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83773G is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83795 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_XDPE122 is not set +# CONFIG_SENSORS_XGENE is not set +# CONFIG_SENSORS_ZL6100 is not set +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_16550A_VARIANTS=y +# CONFIG_SERIAL_8250_ACCENT is not set +# CONFIG_SERIAL_8250_ASPEED_VUART is not set +# CONFIG_SERIAL_8250_BOCA is not set +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_CS is not set +# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_DMA=y +# CONFIG_SERIAL_8250_DW is not set +# CONFIG_SERIAL_8250_EM is not set +# CONFIG_SERIAL_8250_EXAR is not set +# CONFIG_SERIAL_8250_EXAR_ST16C554 is not set +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_FINTEK is not set +# CONFIG_SERIAL_8250_FOURPORT is not set +# CONFIG_SERIAL_8250_HUB6 is not set +# CONFIG_SERIAL_8250_INGENIC is not set +# CONFIG_SERIAL_8250_LPSS is not set +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_MOXA is not set +CONFIG_SERIAL_8250_NR_UARTS=2 +# CONFIG_SERIAL_8250_PCI is not set +# CONFIG_SERIAL_8250_RSA is not set +# CONFIG_SERIAL_8250_RT288X is not set +CONFIG_SERIAL_8250_RUNTIME_UARTS=2 +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_AMBA_PL010 is not set +# CONFIG_SERIAL_AMBA_PL011 is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_SERIAL_BCM63XX is not set +# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_DEV_BUS is not set +CONFIG_SERIAL_EARLYCON=y +# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set +# CONFIG_SERIAL_FSL_LPUART is not set +# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set +# CONFIG_SERIAL_IFX6X60 is not set +# CONFIG_SERIAL_JSM is not set +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_SERIAL_OF_PLATFORM is not set +# CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set +# CONFIG_SERIAL_PCH_UART is not set +# CONFIG_SERIAL_RP2 is not set +# CONFIG_SERIAL_SC16IS7XX is not set +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_SH_SCI is not set +# CONFIG_SERIAL_SIFIVE is not set +# CONFIG_SERIAL_SPRD is not set +# CONFIG_SERIAL_STM32 is not set +# CONFIG_SERIAL_ST_ASC is not set +# CONFIG_SERIAL_TIMBERDALE is not set +# CONFIG_SERIAL_UARTLITE is not set +# CONFIG_SERIAL_XILINX_PS_UART is not set +# CONFIG_SERIO is not set +# CONFIG_SERIO_ALTERA_PS2 is not set +# CONFIG_SERIO_AMBAKMI is not set +# CONFIG_SERIO_APBPS2 is not set +# CONFIG_SERIO_ARC_PS2 is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_GPIO_PS2 is not set +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_LIBPS2 is not set +# CONFIG_SERIO_PARKBD is not set +# CONFIG_SERIO_PCIPS2 is not set +# CONFIG_SERIO_PS2MULT is not set +# CONFIG_SERIO_RAW is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_SUN4I_PS2 is not set +# CONFIG_SFC is not set +# CONFIG_SFC_FALCON is not set +# CONFIG_SFI is not set +# CONFIG_SFP is not set +# CONFIG_SF_PDMA is not set +# CONFIG_SGETMASK_SYSCALL is not set +# CONFIG_SGI_IOC4 is not set +# CONFIG_SGI_IP22 is not set +# CONFIG_SGI_IP27 is not set +# CONFIG_SGI_IP28 is not set +# CONFIG_SGI_IP30 is not set +# CONFIG_SGI_IP32 is not set +# CONFIG_SGI_MFD_IOC3 is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_SG_POOL is not set +# CONFIG_SG_SPLIT is not set +CONFIG_SHMEM=y +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_SH_ETH is not set +# CONFIG_SH_TIMER_CMT is not set +# CONFIG_SH_TIMER_MTU2 is not set +# CONFIG_SH_TIMER_TMU is not set +# CONFIG_SI1133 is not set +# CONFIG_SI1145 is not set +# CONFIG_SI7005 is not set +# CONFIG_SI7020 is not set +# CONFIG_SIBYTE_BIGSUR is not set +# CONFIG_SIBYTE_CARMEL is not set +# CONFIG_SIBYTE_CRHINE is not set +# CONFIG_SIBYTE_CRHONE is not set +# CONFIG_SIBYTE_LITTLESUR is not set +# CONFIG_SIBYTE_RHONE is not set +# CONFIG_SIBYTE_SENTOSA is not set +# CONFIG_SIBYTE_SWARM is not set +CONFIG_SIGNALFD=y +# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set +# CONFIG_SIMPLE_GPIO is not set +# CONFIG_SIMPLE_PM_BUS is not set +# CONFIG_SIOX is not set +# CONFIG_SIS190 is not set +# CONFIG_SIS900 is not set +# CONFIG_SKGE is not set +# CONFIG_SKY2 is not set +# CONFIG_SKY2_DEBUG is not set +# CONFIG_SLAB is not set +CONFIG_SLABINFO=y +CONFIG_SLAB_FREELIST_HARDENED=y +CONFIG_SLAB_FREELIST_RANDOM=y +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLHC is not set +# CONFIG_SLICOSS is not set +# CONFIG_SLIMBUS is not set +# CONFIG_SLIP is not set +# CONFIG_SLOB is not set +CONFIG_SLUB=y +CONFIG_SLUB_CPU_PARTIAL=y +# CONFIG_SLUB_DEBUG is not set +# CONFIG_SLUB_DEBUG_ON is not set +# CONFIG_SLUB_MEMCG_SYSFS_ON is not set +# CONFIG_SLUB_STATS is not set +# CONFIG_SMARTJOYPLUS_FF is not set +# CONFIG_SMB_SERVER is not set +# CONFIG_SMC911X is not set +# CONFIG_SMC9194 is not set +# CONFIG_SMC91X is not set +# CONFIG_SMP is not set +# CONFIG_SMSC911X is not set +# CONFIG_SMSC9420 is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_SMS_SDIO_DRV is not set +# CONFIG_SMS_USB_DRV is not set +# CONFIG_SM_CAMCC_8250 is not set +# CONFIG_SM_FTL is not set +# CONFIG_SM_GCC_6115 is not set +# CONFIG_SM_GCC_6125 is not set +# CONFIG_SM_GCC_6350 is not set +# CONFIG_SM_GCC_8350 is not set +# CONFIG_SND is not set +# CONFIG_SND_AC97_POWER_SAVE is not set +# CONFIG_SND_AD1816A is not set +# CONFIG_SND_AD1848 is not set +# CONFIG_SND_AD1889 is not set +# CONFIG_SND_ADLIB is not set +# CONFIG_SND_ALI5451 is not set +# CONFIG_SND_ALOOP is not set +# CONFIG_SND_ALS100 is not set +# CONFIG_SND_ALS300 is not set +# CONFIG_SND_ALS4000 is not set +# CONFIG_SND_ARM is not set +# CONFIG_SND_ASIHPI is not set +# CONFIG_SND_ATIIXP is not set +# CONFIG_SND_ATIIXP_MODEM is not set +# CONFIG_SND_ATMEL_AC97C is not set +# CONFIG_SND_ATMEL_SOC is not set +# CONFIG_SND_AU8810 is not set +# CONFIG_SND_AU8820 is not set +# CONFIG_SND_AU8830 is not set +# CONFIG_SND_AUDIO_GRAPH_CARD is not set +# CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set +# CONFIG_SND_AW2 is not set +# CONFIG_SND_AZT2320 is not set +# CONFIG_SND_AZT3328 is not set +# CONFIG_SND_BCD2000 is not set +# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set +# CONFIG_SND_BT87X is not set +# CONFIG_SND_CA0106 is not set +# CONFIG_SND_CMI8330 is not set +# CONFIG_SND_CMIPCI is not set +# CONFIG_SND_CS4231 is not set +# CONFIG_SND_CS4236 is not set +# CONFIG_SND_CS4281 is not set +# CONFIG_SND_CS46XX is not set +# CONFIG_SND_CS5530 is not set +# CONFIG_SND_CS5535AUDIO is not set +# CONFIG_SND_CTXFI is not set +# CONFIG_SND_DARLA20 is not set +# CONFIG_SND_DARLA24 is not set +# CONFIG_SND_DEBUG is not set +# CONFIG_SND_DESIGNWARE_I2S is not set +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_DYNAMIC_MINORS is not set +# CONFIG_SND_ECHO3G is not set +# CONFIG_SND_EDMA_SOC is not set +# CONFIG_SND_EMU10K1 is not set +# CONFIG_SND_EMU10K1X is not set +# CONFIG_SND_EMU10K1_SEQ is not set +# CONFIG_SND_ENS1370 is not set +# CONFIG_SND_ENS1371 is not set +# CONFIG_SND_ES1688 is not set +# CONFIG_SND_ES18XX is not set +# CONFIG_SND_ES1938 is not set +# CONFIG_SND_ES1968 is not set +# CONFIG_SND_FIREWIRE is not set +# CONFIG_SND_FM801 is not set +# CONFIG_SND_GINA20 is not set +# CONFIG_SND_GINA24 is not set +# CONFIG_SND_GUSCLASSIC is not set +# CONFIG_SND_GUSEXTREME is not set +# CONFIG_SND_GUSMAX is not set +# CONFIG_SND_HDA_CODEC_CS8409 is not set +# CONFIG_SND_HDA_INTEL is not set +# CONFIG_SND_HDA_INTEL_DETECT_DMIC is not set +# CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM is not set +CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 +CONFIG_SND_HDA_PREALLOC_SIZE=64 +# CONFIG_SND_HDSP is not set +# CONFIG_SND_HDSPM is not set +# CONFIG_SND_HRTIMER is not set +# CONFIG_SND_HWDEP is not set +# CONFIG_SND_I2S_HI6210_I2S is not set +# CONFIG_SND_ICE1712 is not set +# CONFIG_SND_ICE1724 is not set +# CONFIG_SND_INDIGO is not set +# CONFIG_SND_INDIGODJ is not set +# CONFIG_SND_INDIGODJX is not set +# CONFIG_SND_INDIGOIO is not set +# CONFIG_SND_INDIGOIOX is not set +# CONFIG_SND_INTEL8X0 is not set +# CONFIG_SND_INTEL8X0M is not set +# CONFIG_SND_INTERWAVE is not set +# CONFIG_SND_INTERWAVE_STB is not set +# CONFIG_SND_ISA is not set +# CONFIG_SND_JZ4740_SOC_I2S is not set +# CONFIG_SND_KIRKWOOD_SOC is not set +# CONFIG_SND_KORG1212 is not set +# CONFIG_SND_LAYLA20 is not set +# CONFIG_SND_LAYLA24 is not set +# CONFIG_SND_LOLA is not set +# CONFIG_SND_LX6464ES is not set +# CONFIG_SND_MAESTRO3 is not set +CONFIG_SND_MAX_CARDS=16 +# CONFIG_SND_MIA is not set +# CONFIG_SND_MIPS is not set +# CONFIG_SND_MIRO is not set +# CONFIG_SND_MIXART is not set +# CONFIG_SND_MIXER_OSS is not set +# CONFIG_SND_MONA is not set +# CONFIG_SND_MPC52xx_SOC_EFIKA is not set +# CONFIG_SND_MPU401 is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_MTS64 is not set +# CONFIG_SND_MXS_SOC is not set +# CONFIG_SND_NM256 is not set +# CONFIG_SND_OPL3SA2 is not set +# CONFIG_SND_OPL3_LIB_SEQ is not set +# CONFIG_SND_OPL4_LIB_SEQ is not set +# CONFIG_SND_OPTI92X_AD1848 is not set +# CONFIG_SND_OPTI92X_CS4231 is not set +# CONFIG_SND_OPTI93X is not set +CONFIG_SND_OSSEMUL=y +# CONFIG_SND_OXYGEN is not set +CONFIG_SND_PCI=y +# CONFIG_SND_PCM is not set +# CONFIG_SND_PCMCIA is not set +# CONFIG_SND_PCM_OSS is not set +CONFIG_SND_PCM_OSS_PLUGINS=y +# CONFIG_SND_PCM_TIMER is not set +# CONFIG_SND_PCM_XRUN_DEBUG is not set +# CONFIG_SND_PCXHR is not set +# CONFIG_SND_PDAUDIOCF is not set +# CONFIG_SND_PORTMAN2X4 is not set +# CONFIG_SND_POWERPC_SOC is not set +# CONFIG_SND_PPC is not set +CONFIG_SND_PROC_FS=y +# CONFIG_SND_RAWMIDI is not set +# CONFIG_SND_RAWMIDI_SEQ is not set +# CONFIG_SND_RIPTIDE is not set +# CONFIG_SND_RME32 is not set +# CONFIG_SND_RME96 is not set +# CONFIG_SND_RME9652 is not set +# CONFIG_SND_RTCTIMER is not set +# CONFIG_SND_SB16 is not set +# CONFIG_SND_SB8 is not set +# CONFIG_SND_SBAWE is not set +# CONFIG_SND_SBAWE_SEQ is not set +# CONFIG_SND_SE6X is not set +# CONFIG_SND_SEQUENCER is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_SIMPLE_CARD is not set +# CONFIG_SND_SIMPLE_SCU_CARD is not set +# CONFIG_SND_SIS7019 is not set +# CONFIG_SND_SOC is not set +# CONFIG_SND_SOC_AC97_CODEC is not set +# CONFIG_SND_SOC_AD193X_I2C is not set +# CONFIG_SND_SOC_AD193X_SPI is not set +# CONFIG_SND_SOC_ADAU1372_I2C is not set +# CONFIG_SND_SOC_ADAU1372_SPI is not set +# CONFIG_SND_SOC_ADAU1701 is not set +# CONFIG_SND_SOC_ADAU1761_I2C is not set +# CONFIG_SND_SOC_ADAU1761_SPI is not set +# CONFIG_SND_SOC_ADAU7002 is not set +# CONFIG_SND_SOC_ADAU7118_HW is not set +# CONFIG_SND_SOC_ADAU7118_I2C is not set +# CONFIG_SND_SOC_ADI is not set +# CONFIG_SND_SOC_AK4104 is not set +# CONFIG_SND_SOC_AK4118 is not set +# CONFIG_SND_SOC_AK4458 is not set +# CONFIG_SND_SOC_AK4554 is not set +# CONFIG_SND_SOC_AK4613 is not set +# CONFIG_SND_SOC_AK4642 is not set +# CONFIG_SND_SOC_AK5386 is not set +# CONFIG_SND_SOC_AK5558 is not set +# CONFIG_SND_SOC_ALC5623 is not set +# CONFIG_SND_SOC_AMD_ACP is not set +# CONFIG_SND_SOC_AMD_ACP3x is not set +# CONFIG_SND_SOC_AMD_ACP5x is not set +# CONFIG_SND_SOC_AMD_RENOIR is not set +# CONFIG_SND_SOC_AU1XAUDIO is not set +# CONFIG_SND_SOC_AU1XPSC is not set +# CONFIG_SND_SOC_BD28623 is not set +# CONFIG_SND_SOC_BT_SCO is not set +# CONFIG_SND_SOC_CS35L32 is not set +# CONFIG_SND_SOC_CS35L33 is not set +# CONFIG_SND_SOC_CS35L34 is not set +# CONFIG_SND_SOC_CS35L35 is not set +# CONFIG_SND_SOC_CS35L36 is not set +# CONFIG_SND_SOC_CS4234 is not set +# CONFIG_SND_SOC_CS4265 is not set +# CONFIG_SND_SOC_CS4270 is not set +# CONFIG_SND_SOC_CS4271 is not set +# CONFIG_SND_SOC_CS4271_I2C is not set +# CONFIG_SND_SOC_CS4271_SPI is not set +# CONFIG_SND_SOC_CS42L42 is not set +# CONFIG_SND_SOC_CS42L51_I2C is not set +# CONFIG_SND_SOC_CS42L52 is not set +# CONFIG_SND_SOC_CS42L56 is not set +# CONFIG_SND_SOC_CS42L73 is not set +# CONFIG_SND_SOC_CS42XX8_I2C is not set +# CONFIG_SND_SOC_CS43130 is not set +# CONFIG_SND_SOC_CS4341 is not set +# CONFIG_SND_SOC_CS4349 is not set +# CONFIG_SND_SOC_CS53L30 is not set +# CONFIG_SND_SOC_CX2072X is not set +# CONFIG_SND_SOC_DA7213 is not set +# CONFIG_SND_SOC_DIO2125 is not set +# CONFIG_SND_SOC_DMIC is not set +# CONFIG_SND_SOC_ES7134 is not set +# CONFIG_SND_SOC_ES7241 is not set +# CONFIG_SND_SOC_ES8316 is not set +# CONFIG_SND_SOC_ES8328 is not set +# CONFIG_SND_SOC_ES8328_I2C is not set +# CONFIG_SND_SOC_ES8328_SPI is not set +# CONFIG_SND_SOC_EUKREA_TLV320 is not set +# CONFIG_SND_SOC_FSL_ASOC_CARD is not set +# CONFIG_SND_SOC_FSL_ASRC is not set +# CONFIG_SND_SOC_FSL_AUD2HTX is not set +# CONFIG_SND_SOC_FSL_AUDMIX is not set +# CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_FSL_MICFIL is not set +# CONFIG_SND_SOC_FSL_RPMSG is not set +# CONFIG_SND_SOC_FSL_SAI is not set +# CONFIG_SND_SOC_FSL_SPDIF is not set +# CONFIG_SND_SOC_FSL_SSI is not set +# CONFIG_SND_SOC_FSL_XCVR is not set +# CONFIG_SND_SOC_GTM601 is not set +# CONFIG_SND_SOC_ICS43432 is not set +# CONFIG_SND_SOC_IMG is not set +# CONFIG_SND_SOC_IMX_AUDMIX is not set +# CONFIG_SND_SOC_IMX_AUDMUX is not set +# CONFIG_SND_SOC_IMX_CARD is not set +# CONFIG_SND_SOC_IMX_ES8328 is not set +# CONFIG_SND_SOC_IMX_HDMI is not set +# CONFIG_SND_SOC_IMX_RPMSG is not set +# CONFIG_SND_SOC_IMX_SPDIF is not set +# CONFIG_SND_SOC_IMX_WM8962 is not set +# CONFIG_SND_SOC_INNO_RK3036 is not set +# CONFIG_SND_SOC_INTEL_APL is not set +# CONFIG_SND_SOC_INTEL_BAYTRAIL is not set +# CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH is not set +# CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH is not set +# CONFIG_SND_SOC_INTEL_BXT_RT298_MACH is not set +# CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH is not set +# CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH is not set +# CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH is not set +# CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH is not set +# CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH is not set +# CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH is not set +# CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH is not set +# CONFIG_SND_SOC_INTEL_CATPT is not set +# CONFIG_SND_SOC_INTEL_CFL is not set +# CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH is not set +# CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH is not set +# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH is not set +# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH is not set +# CONFIG_SND_SOC_INTEL_CML_H is not set +# CONFIG_SND_SOC_INTEL_CML_LP is not set +# CONFIG_SND_SOC_INTEL_CNL is not set +# CONFIG_SND_SOC_INTEL_GLK is not set +# CONFIG_SND_SOC_INTEL_HASWELL is not set +# CONFIG_SND_SOC_INTEL_KBL is not set +# CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH is not set +# CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH is not set +# CONFIG_SND_SOC_INTEL_KEEMBAY is not set +# CONFIG_SND_SOC_INTEL_SKL is not set +# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH is not set +# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH is not set +# CONFIG_SND_SOC_INTEL_SKL_RT286_MACH is not set +# CONFIG_SND_SOC_INTEL_SKYLAKE is not set +# CONFIG_SND_SOC_INTEL_SST is not set +CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y +# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set +# CONFIG_SND_SOC_JZ4725B_CODEC is not set +# CONFIG_SND_SOC_JZ4740_CODEC is not set +# CONFIG_SND_SOC_JZ4770_CODEC is not set +# CONFIG_SND_SOC_LPASS_RX_MACRO is not set +# CONFIG_SND_SOC_LPASS_TX_MACRO is not set +# CONFIG_SND_SOC_LPASS_VA_MACRO is not set +# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set +# CONFIG_SND_SOC_MA120X0P is not set +# CONFIG_SND_SOC_MAX9759 is not set +# CONFIG_SND_SOC_MAX98088 is not set +# CONFIG_SND_SOC_MAX98357A is not set +# CONFIG_SND_SOC_MAX98373 is not set +# CONFIG_SND_SOC_MAX98373_I2C is not set +# CONFIG_SND_SOC_MAX98390 is not set +# CONFIG_SND_SOC_MAX98504 is not set +# CONFIG_SND_SOC_MAX9860 is not set +# CONFIG_SND_SOC_MAX9867 is not set +# CONFIG_SND_SOC_MAX98927 is not set +# CONFIG_SND_SOC_MEDIATEK is not set +# CONFIG_SND_SOC_MPC5200_AC97 is not set +# CONFIG_SND_SOC_MPC5200_I2S is not set +# CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set +# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set +# CONFIG_SND_SOC_MT2701 is not set +# CONFIG_SND_SOC_MT6351 is not set +# CONFIG_SND_SOC_MT6358 is not set +# CONFIG_SND_SOC_MT6359 is not set +# CONFIG_SND_SOC_MT6359_ACCDET is not set +# CONFIG_SND_SOC_MT6660 is not set +# CONFIG_SND_SOC_MT6797 is not set +# CONFIG_SND_SOC_MT8173 is not set +# CONFIG_SND_SOC_MT8183 is not set +# CONFIG_SND_SOC_MT8192 is not set +# CONFIG_SND_SOC_MT8195 is not set +# CONFIG_SND_SOC_MTK_BTCVSD is not set +# CONFIG_SND_SOC_NAU8315 is not set +# CONFIG_SND_SOC_NAU8540 is not set +# CONFIG_SND_SOC_NAU8810 is not set +# CONFIG_SND_SOC_NAU8822 is not set +# CONFIG_SND_SOC_NAU8824 is not set +# CONFIG_SND_SOC_PCM1681 is not set +# CONFIG_SND_SOC_PCM1789_I2C is not set +# CONFIG_SND_SOC_PCM1792A is not set +# CONFIG_SND_SOC_PCM179X_I2C is not set +# CONFIG_SND_SOC_PCM179X_SPI is not set +# CONFIG_SND_SOC_PCM186X_I2C is not set +# CONFIG_SND_SOC_PCM186X_SPI is not set +# CONFIG_SND_SOC_PCM3060_I2C is not set +# CONFIG_SND_SOC_PCM3060_SPI is not set +# CONFIG_SND_SOC_PCM3168A_I2C is not set +# CONFIG_SND_SOC_PCM3168A_SPI is not set +# CONFIG_SND_SOC_PCM5102A is not set +# CONFIG_SND_SOC_PCM512x_I2C is not set +# CONFIG_SND_SOC_PCM512x_SPI is not set +# CONFIG_SND_SOC_QCOM is not set +# CONFIG_SND_SOC_RK3328 is not set +# CONFIG_SND_SOC_RK817 is not set +# CONFIG_SND_SOC_ROCKCHIP is not set +# CONFIG_SND_SOC_RT5616 is not set +# CONFIG_SND_SOC_RT5631 is not set +# CONFIG_SND_SOC_RT5640 is not set +# CONFIG_SND_SOC_RT5659 is not set +# CONFIG_SND_SOC_RT5677_SPI is not set +# CONFIG_SND_SOC_SGTL5000 is not set +# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set +# CONFIG_SND_SOC_SIMPLE_MUX is not set +# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set +# CONFIG_SND_SOC_SOF_TOPLEVEL is not set +# CONFIG_SND_SOC_SPDIF is not set +# CONFIG_SND_SOC_SSM2305 is not set +# CONFIG_SND_SOC_SSM2518 is not set +# CONFIG_SND_SOC_SSM2602_I2C is not set +# CONFIG_SND_SOC_SSM2602_SPI is not set +# CONFIG_SND_SOC_SSM4567 is not set +# CONFIG_SND_SOC_STA32X is not set +# CONFIG_SND_SOC_STA350 is not set +# CONFIG_SND_SOC_STI_SAS is not set +# CONFIG_SND_SOC_TAS2552 is not set +# CONFIG_SND_SOC_TAS2562 is not set +# CONFIG_SND_SOC_TAS2764 is not set +# CONFIG_SND_SOC_TAS2770 is not set +# CONFIG_SND_SOC_TAS5086 is not set +# CONFIG_SND_SOC_TAS571X is not set +# CONFIG_SND_SOC_TAS5720 is not set +# CONFIG_SND_SOC_TAS6424 is not set +# CONFIG_SND_SOC_TDA7419 is not set +# CONFIG_SND_SOC_TFA9879 is not set +# CONFIG_SND_SOC_TFA989X is not set +# CONFIG_SND_SOC_TLV320ADCX140 is not set +# CONFIG_SND_SOC_TLV320AIC23_I2C is not set +# CONFIG_SND_SOC_TLV320AIC23_SPI is not set +# CONFIG_SND_SOC_TLV320AIC31XX is not set +# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set +# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set +# CONFIG_SND_SOC_TLV320AIC3X is not set +# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set +# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set +# CONFIG_SND_SOC_TPA6130A2 is not set +# CONFIG_SND_SOC_TS3A227E is not set +# CONFIG_SND_SOC_TSCS42XX is not set +# CONFIG_SND_SOC_TSCS454 is not set +# CONFIG_SND_SOC_UDA1334 is not set +# CONFIG_SND_SOC_WM8510 is not set +# CONFIG_SND_SOC_WM8523 is not set +# CONFIG_SND_SOC_WM8524 is not set +# CONFIG_SND_SOC_WM8580 is not set +# CONFIG_SND_SOC_WM8711 is not set +# CONFIG_SND_SOC_WM8728 is not set +# CONFIG_SND_SOC_WM8731 is not set +# CONFIG_SND_SOC_WM8737 is not set +# CONFIG_SND_SOC_WM8741 is not set +# CONFIG_SND_SOC_WM8750 is not set +# CONFIG_SND_SOC_WM8753 is not set +# CONFIG_SND_SOC_WM8770 is not set +# CONFIG_SND_SOC_WM8776 is not set +# CONFIG_SND_SOC_WM8782 is not set +# CONFIG_SND_SOC_WM8804_I2C is not set +# CONFIG_SND_SOC_WM8804_SPI is not set +# CONFIG_SND_SOC_WM8903 is not set +# CONFIG_SND_SOC_WM8904 is not set +# CONFIG_SND_SOC_WM8960 is not set +# CONFIG_SND_SOC_WM8962 is not set +# CONFIG_SND_SOC_WM8974 is not set +# CONFIG_SND_SOC_WM8978 is not set +# CONFIG_SND_SOC_WM8985 is not set +# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set +# CONFIG_SND_SOC_XILINX_I2S is not set +# CONFIG_SND_SOC_XILINX_SPDIF is not set +# CONFIG_SND_SOC_XTFPGA_I2S is not set +# CONFIG_SND_SOC_ZL38060 is not set +# CONFIG_SND_SOC_ZX_AUD96P22 is not set +# CONFIG_SND_SONICVIBES is not set +# CONFIG_SND_SPI is not set +# CONFIG_SND_SSCAPE is not set +# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI is not set +# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI is not set +# CONFIG_SND_SUN4I_CODEC is not set +# CONFIG_SND_SUPPORT_OLD_API is not set +# CONFIG_SND_TIMER is not set +# CONFIG_SND_TRIDENT is not set +CONFIG_SND_USB=y +# CONFIG_SND_USB_6FIRE is not set +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_USB_HIFACE is not set +# CONFIG_SND_USB_POD is not set +# CONFIG_SND_USB_PODHD is not set +# CONFIG_SND_USB_TONEPORT is not set +# CONFIG_SND_USB_UA101 is not set +# CONFIG_SND_USB_US122L is not set +# CONFIG_SND_USB_USX2Y is not set +# CONFIG_SND_USB_VARIAX is not set +# CONFIG_SND_VERBOSE_PRINTK is not set +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VIA82XX is not set +# CONFIG_SND_VIA82XX_MODEM is not set +# CONFIG_SND_VIRTIO is not set +# CONFIG_SND_VIRTUOSO is not set +# CONFIG_SND_VX222 is not set +# CONFIG_SND_VXPOCKET is not set +# CONFIG_SND_WAVEFRONT is not set +CONFIG_SND_X86=y +# CONFIG_SND_XEN_FRONTEND is not set +# CONFIG_SND_YMFPCI is not set +# CONFIG_SNI_RM is not set +# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set +# CONFIG_SOCK_CGROUP_DATA is not set +# CONFIG_SOC_AM33XX is not set +# CONFIG_SOC_AM43XX is not set +# CONFIG_SOC_BRCMSTB is not set +# CONFIG_SOC_CAMERA is not set +# CONFIG_SOC_DRA7XX is not set +# CONFIG_SOC_HAS_OMAP2_SDRC is not set +# CONFIG_SOC_OMAP5 is not set +# CONFIG_SOC_TI is not set +# CONFIG_SOFTLOCKUP_DETECTOR is not set +# CONFIG_SOFT_WATCHDOG is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_SONYPI is not set +# CONFIG_SONY_LAPTOP is not set +# CONFIG_SOUND is not set +# CONFIG_SOUNDWIRE is not set +# CONFIG_SOUND_OSS_CORE is not set +# CONFIG_SOUND_OSS_CORE_PRECLAIM is not set +# CONFIG_SOUND_PRIME is not set +# CONFIG_SP5100_TCO is not set +# CONFIG_SPARSEMEM_MANUAL is not set +# CONFIG_SPARSEMEM_STATIC is not set +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set +# CONFIG_SPARSE_IRQ is not set +# CONFIG_SPARSE_RCU_POINTER is not set +# CONFIG_SPEAKUP is not set +# CONFIG_SPI is not set +# CONFIG_SPINLOCK_TEST is not set +# CONFIG_SPI_ALTERA is not set +# CONFIG_SPI_AMD is not set +# CONFIG_SPI_AU1550 is not set +# CONFIG_SPI_AXI_SPI_ENGINE is not set +# CONFIG_SPI_BCM2835 is not set +# CONFIG_SPI_BCM_QSPI is not set +# CONFIG_SPI_BITBANG is not set +# CONFIG_SPI_BUTTERFLY is not set +# CONFIG_SPI_CADENCE is not set +# CONFIG_SPI_CADENCE_QUADSPI is not set +# CONFIG_SPI_DEBUG is not set +# CONFIG_SPI_DESIGNWARE is not set +# CONFIG_SPI_FSL_DSPI is not set +# CONFIG_SPI_FSL_ESPI is not set +# CONFIG_SPI_FSL_SPI is not set +# CONFIG_SPI_GPIO is not set +# CONFIG_SPI_GPIO_OLD is not set +# CONFIG_SPI_IMG_SPFI is not set +# CONFIG_SPI_LANTIQ_SSC is not set +# CONFIG_SPI_LM70_LLP is not set +# CONFIG_SPI_LOOPBACK_TEST is not set +# CONFIG_SPI_MASTER is not set +# CONFIG_SPI_MEM is not set +# CONFIG_SPI_MPC52xx is not set +# CONFIG_SPI_MPC52xx_PSC is not set +# CONFIG_SPI_MTK_QUADSPI is not set +# CONFIG_SPI_MUX is not set +# CONFIG_SPI_MXIC is not set +# CONFIG_SPI_NXP_FLEXSPI is not set +# CONFIG_SPI_OCTEON is not set +# CONFIG_SPI_OC_TINY is not set +# CONFIG_SPI_ORION is not set +# CONFIG_SPI_PL022 is not set +# CONFIG_SPI_PPC4xx is not set +# CONFIG_SPI_PXA2XX is not set +# CONFIG_SPI_PXA2XX_PCI is not set +# CONFIG_SPI_QCOM_QSPI is not set +# CONFIG_SPI_ROCKCHIP is not set +# CONFIG_SPI_S3C64XX is not set +# CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_SIFIVE is not set +# CONFIG_SPI_SLAVE is not set +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_THUNDERX is not set +# CONFIG_SPI_TI_QSPI is not set +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_SPI_TOPCLIFF_PCH is not set +# CONFIG_SPI_XCOMM is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_XWAY is not set +# CONFIG_SPI_ZYNQMP_GQSPI is not set +CONFIG_SPLIT_PTLOCK_CPUS=4 +# CONFIG_SPMI is not set +# CONFIG_SPS30 is not set +# CONFIG_SPS30_I2C is not set +# CONFIG_SPS30_SERIAL is not set +CONFIG_SQUASHFS=y +# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set +# CONFIG_SQUASHFS_DECOMP_MULTI is not set +CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y +# CONFIG_SQUASHFS_DECOMP_SINGLE is not set +CONFIG_SQUASHFS_EMBEDDED=y +# CONFIG_SQUASHFS_FILE_CACHE is not set +CONFIG_SQUASHFS_FILE_DIRECT=y +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_SQUASHFS_LZ4 is not set +# CONFIG_SQUASHFS_LZO is not set +# CONFIG_SQUASHFS_XATTR is not set +CONFIG_SQUASHFS_XZ=y +# CONFIG_SQUASHFS_ZLIB is not set +# CONFIG_SQUASHFS_ZSTD is not set +# CONFIG_SRAM is not set +# CONFIG_SRF04 is not set +# CONFIG_SRF08 is not set +# CONFIG_SSB is not set +# CONFIG_SSB_DEBUG is not set +# CONFIG_SSB_DRIVER_GPIO is not set +# CONFIG_SSB_HOST_SOC is not set +# CONFIG_SSB_PCMCIAHOST is not set +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB_SDIOHOST is not set +# CONFIG_SSB_SILENT is not set +# CONFIG_SSFDC is not set +# CONFIG_STACKPROTECTOR is not set +# CONFIG_STACKPROTECTOR_STRONG is not set +# CONFIG_STACKTRACE is not set +# CONFIG_STACKTRACE_BUILD_ID is not set +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_STACK_HASH_ORDER=20 +# CONFIG_STACK_TRACER is not set +# CONFIG_STACK_VALIDATION is not set +CONFIG_STAGING=y +# CONFIG_STAGING_BOARD is not set +# CONFIG_STAGING_GASKET_FRAMEWORK is not set +# CONFIG_STAGING_MEDIA is not set +CONFIG_STANDALONE=y +# CONFIG_STATIC_KEYS_SELFTEST is not set +# CONFIG_STATIC_USERMODEHELPER is not set +CONFIG_STDBINUTILS=y +# CONFIG_STE10XP is not set +# CONFIG_STE_MODEM_RPROC is not set +# CONFIG_STK3310 is not set +# CONFIG_STK8312 is not set +# CONFIG_STK8BA50 is not set +# CONFIG_STM is not set +# CONFIG_STMMAC_ETH is not set +# CONFIG_STMMAC_PCI is not set +# CONFIG_STMMAC_PLATFORM is not set +# CONFIG_STMMAC_SELFTESTS is not set +# CONFIG_STM_DUMMY is not set +# CONFIG_STM_SOURCE_CONSOLE is not set +CONFIG_STP=y +# CONFIG_STREAM_PARSER is not set +# CONFIG_STRICT_DEVMEM is not set +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_STRICT_MODULE_RWX=y +# CONFIG_STRING_SELFTEST is not set +CONFIG_STRIP_ASM_SYMS=y +# CONFIG_STX104 is not set +# CONFIG_ST_UVIS25 is not set +# CONFIG_SUN4I_GPADC is not set +# CONFIG_SUN50I_DE2_BUS is not set +# CONFIG_SUN50I_ERRATUM_UNKNOWN1 is not set +# CONFIG_SUNDANCE is not set +# CONFIG_SUNGEM is not set +# CONFIG_SUNRPC is not set +# CONFIG_SUNRPC_DEBUG is not set +CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES=y +# CONFIG_SUNRPC_GSS is not set +# CONFIG_SUNXI_SRAM is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_SURFACE_3_BUTTON is not set +# CONFIG_SUSPEND is not set +# CONFIG_SUSPEND_SKIP_SYNC is not set +CONFIG_SWAP=y +# CONFIG_SWCONFIG is not set +# CONFIG_SWCONFIG_B53 is not set +# CONFIG_SWCONFIG_B53_MDIO_DRIVER is not set +# CONFIG_SWCONFIG_B53_MMAP_DRIVER is not set +# CONFIG_SWCONFIG_B53_SPI_DRIVER is not set +# CONFIG_SWCONFIG_B53_SRAB_DRIVER is not set +# CONFIG_SWCONFIG_LEDS is not set +# CONFIG_SW_SYNC is not set +# CONFIG_SX9310 is not set +# CONFIG_SX9500 is not set +# CONFIG_SXGBE_ETH is not set +CONFIG_SYMBOLIC_ERRNAME=y +# CONFIG_SYNCLINK_CS is not set +# CONFIG_SYNC_FILE is not set +# CONFIG_SYNOPSYS_DWC_ETH_QOS is not set +# CONFIG_SYNTH_EVENTS is not set +# CONFIG_SYNTH_EVENT_GEN_TEST is not set +CONFIG_SYN_COOKIES=y +# CONFIG_SYSCON_REBOOT_MODE is not set +CONFIG_SYSCTL=y +# CONFIG_SYSCTL_SYSCALL is not set +CONFIG_SYSFS=y +# CONFIG_SYSFS_DEPRECATED is not set +# CONFIG_SYSFS_DEPRECATED_V2 is not set +# CONFIG_SYSFS_SYSCALL is not set +# CONFIG_SYSTEMPORT is not set +# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set +# CONFIG_SYSTEM_DATA_VERIFICATION is not set +# CONFIG_SYSTEM_TRUSTED_KEYRING is not set +CONFIG_SYSTEM_TRUSTED_KEYS="" +# CONFIG_SYSV68_PARTITION is not set +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_SYSV_FS is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_T5403 is not set +# CONFIG_TARGET_CORE is not set +# CONFIG_TASKSTATS is not set +# CONFIG_TASKS_RCU is not set +# CONFIG_TASK_XACCT is not set +# CONFIG_TC35815 is not set +# CONFIG_TCG_ATMEL is not set +# CONFIG_TCG_CRB is not set +# CONFIG_TCG_FTPM_TEE is not set +# CONFIG_TCG_INFINEON is not set +# CONFIG_TCG_NSC is not set +# CONFIG_TCG_ST33_I2C is not set +# CONFIG_TCG_TIS is not set +# CONFIG_TCG_TIS_I2C_ATMEL is not set +# CONFIG_TCG_TIS_I2C_CR50 is not set +# CONFIG_TCG_TIS_I2C_INFINEON is not set +# CONFIG_TCG_TIS_I2C_NUVOTON is not set +# CONFIG_TCG_TIS_SPI is not set +# CONFIG_TCG_TIS_ST33ZP24_I2C is not set +# CONFIG_TCG_TIS_ST33ZP24_SPI is not set +# CONFIG_TCG_TPM is not set +# CONFIG_TCG_VTPM_PROXY is not set +# CONFIG_TCG_XEN is not set +# CONFIG_TCIC is not set +CONFIG_TCP_CONG_ADVANCED=y +# CONFIG_TCP_CONG_BBR is not set +# CONFIG_TCP_CONG_BIC is not set +# CONFIG_TCP_CONG_CDG is not set +CONFIG_TCP_CONG_CUBIC=y +# CONFIG_TCP_CONG_DCTCP is not set +# CONFIG_TCP_CONG_HSTCP is not set +# CONFIG_TCP_CONG_HTCP is not set +# CONFIG_TCP_CONG_HYBLA is not set +# CONFIG_TCP_CONG_ILLINOIS is not set +# CONFIG_TCP_CONG_LP is not set +# CONFIG_TCP_CONG_NV is not set +# CONFIG_TCP_CONG_SCALABLE is not set +# CONFIG_TCP_CONG_VEGAS is not set +# CONFIG_TCP_CONG_VENO is not set +# CONFIG_TCP_CONG_WESTWOOD is not set +# CONFIG_TCP_CONG_YEAH is not set +# CONFIG_TCP_MD5SIG is not set +# CONFIG_TCS3414 is not set +# CONFIG_TCS3472 is not set +# CONFIG_TEE is not set +# CONFIG_TEGRA_AHB is not set +# CONFIG_TEGRA_HOST1X is not set +# CONFIG_TEHUTI is not set +# CONFIG_TERANETICS_PHY is not set +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +# CONFIG_TEST_BITFIELD is not set +# CONFIG_TEST_BITMAP is not set +# CONFIG_TEST_BITOPS is not set +# CONFIG_TEST_BLACKHOLE_DEV is not set +# CONFIG_TEST_BPF is not set +# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set +# CONFIG_TEST_DEBUG_VIRTUAL is not set +# CONFIG_TEST_DIV64 is not set +# CONFIG_TEST_FIRMWARE is not set +# CONFIG_TEST_FREE_PAGES is not set +# CONFIG_TEST_HASH is not set +# CONFIG_TEST_HEXDUMP is not set +# CONFIG_TEST_IDA is not set +# CONFIG_TEST_KASAN_MODULE is not set +# CONFIG_TEST_KMOD is not set +# CONFIG_TEST_KSTRTOX is not set +# CONFIG_TEST_LIST_SORT is not set +# CONFIG_TEST_LKM is not set +# CONFIG_TEST_LOCKUP is not set +# CONFIG_TEST_MEMCAT_P is not set +# CONFIG_TEST_MEMINIT is not set +# CONFIG_TEST_MIN_HEAP is not set +# CONFIG_TEST_OVERFLOW is not set +# CONFIG_TEST_POWER is not set +# CONFIG_TEST_PRINTF is not set +# CONFIG_TEST_RHASHTABLE is not set +# CONFIG_TEST_SCANF is not set +# CONFIG_TEST_SORT is not set +# CONFIG_TEST_STACKINIT is not set +# CONFIG_TEST_STATIC_KEYS is not set +# CONFIG_TEST_STRING_HELPERS is not set +# CONFIG_TEST_STRSCPY is not set +# CONFIG_TEST_SYSCTL is not set +# CONFIG_TEST_UBSAN is not set +# CONFIG_TEST_UDELAY is not set +# CONFIG_TEST_USER_COPY is not set +# CONFIG_TEST_UUID is not set +# CONFIG_TEST_VMALLOC is not set +# CONFIG_TEST_XARRAY is not set +CONFIG_TEXTSEARCH=y +# CONFIG_TEXTSEARCH_BM is not set +# CONFIG_TEXTSEARCH_FSM is not set +# CONFIG_TEXTSEARCH_KMP is not set +# CONFIG_THERMAL is not set +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +# CONFIG_THERMAL_EMULATION is not set +# CONFIG_THERMAL_GOV_BANG_BANG is not set +# CONFIG_THERMAL_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set +# CONFIG_THERMAL_GOV_USER_SPACE is not set +# CONFIG_THERMAL_HWMON is not set +# CONFIG_THERMAL_MMIO is not set +# CONFIG_THERMAL_NETLINK is not set +# CONFIG_THERMAL_STATISTICS is not set +# CONFIG_THERMAL_WRITABLE_TRIPS is not set +# CONFIG_THINKPAD_ACPI is not set +CONFIG_THIN_ARCHIVES=y +# CONFIG_THRUSTMASTER_FF is not set +# CONFIG_THUMB2_KERNEL is not set +# CONFIG_THUNDERBOLT is not set +# CONFIG_THUNDER_NIC_BGX is not set +# CONFIG_THUNDER_NIC_PF is not set +# CONFIG_THUNDER_NIC_RGX is not set +# CONFIG_THUNDER_NIC_VF is not set +# CONFIG_TICK_CPU_ACCOUNTING is not set +CONFIG_TICK_ONESHOT=y +# CONFIG_TIFM_CORE is not set +# CONFIG_TIGON3 is not set +# CONFIG_TIMB_DMA is not set +CONFIG_TIMERFD=y +# CONFIG_TIMERLAT_TRACER is not set +# CONFIG_TIMER_STATS is not set +# CONFIG_TIME_NS is not set +# CONFIG_TINYDRM_HX8357D is not set +# CONFIG_TINYDRM_ILI9225 is not set +# CONFIG_TINYDRM_ILI9341 is not set +# CONFIG_TINYDRM_ILI9486 is not set +# CONFIG_TINYDRM_MI0283QT is not set +# CONFIG_TINYDRM_REPAPER is not set +# CONFIG_TINYDRM_ST7586 is not set +# CONFIG_TINYDRM_ST7735R is not set +CONFIG_TINY_RCU=y +# CONFIG_TIPC is not set +# CONFIG_TI_ADC081C is not set +# CONFIG_TI_ADC0832 is not set +# CONFIG_TI_ADC084S021 is not set +# CONFIG_TI_ADC108S102 is not set +# CONFIG_TI_ADC12138 is not set +# CONFIG_TI_ADC128S052 is not set +# CONFIG_TI_ADC161S626 is not set +# CONFIG_TI_ADS1015 is not set +# CONFIG_TI_ADS124S08 is not set +# CONFIG_TI_ADS131E08 is not set +# CONFIG_TI_ADS7950 is not set +# CONFIG_TI_ADS8344 is not set +# CONFIG_TI_ADS8688 is not set +# CONFIG_TI_AM335X_ADC is not set +# CONFIG_TI_CPSW is not set +# CONFIG_TI_CPSW_ALE is not set +# CONFIG_TI_CPSW_PHY_SEL is not set +# CONFIG_TI_CPTS is not set +# CONFIG_TI_DAC082S085 is not set +# CONFIG_TI_DAC5571 is not set +# CONFIG_TI_DAC7311 is not set +# CONFIG_TI_DAC7512 is not set +# CONFIG_TI_DAC7612 is not set +# CONFIG_TI_DAVINCI_CPDMA is not set +# CONFIG_TI_DAVINCI_MDIO is not set +# CONFIG_TI_ST is not set +# CONFIG_TI_SYSCON_RESET is not set +# CONFIG_TI_TLC4541 is not set +# CONFIG_TI_TSC2046 is not set +# CONFIG_TLAN is not set +# CONFIG_TLS is not set +# CONFIG_TLS_DEVICE is not set +# CONFIG_TLS_TOE is not set +# CONFIG_TMD_HERMES is not set +# CONFIG_TMP006 is not set +# CONFIG_TMP007 is not set +# CONFIG_TMP117 is not set +CONFIG_TMPFS=y +# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS_POSIX_ACL is not set +CONFIG_TMPFS_XATTR=y +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_TORTURE_TEST is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_TOUCHSCREEN_88PM860X is not set +# CONFIG_TOUCHSCREEN_AD7877 is not set +# CONFIG_TOUCHSCREEN_AD7879 is not set +# CONFIG_TOUCHSCREEN_AD7879_I2C is not set +# CONFIG_TOUCHSCREEN_AD7879_SPI is not set +# CONFIG_TOUCHSCREEN_ADC is not set +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_AR1021_I2C is not set +# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set +# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set +# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set +# CONFIG_TOUCHSCREEN_BU21013 is not set +# CONFIG_TOUCHSCREEN_BU21029 is not set +# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set +# CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set +# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set +# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set +# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set +# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set +# CONFIG_TOUCHSCREEN_CYTTSP4_I2C is not set +# CONFIG_TOUCHSCREEN_CYTTSP4_SPI is not set +# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set +# CONFIG_TOUCHSCREEN_CYTTSP_I2C is not set +# CONFIG_TOUCHSCREEN_CYTTSP_SPI is not set +# CONFIG_TOUCHSCREEN_DA9034 is not set +# CONFIG_TOUCHSCREEN_DA9052 is not set +# CONFIG_TOUCHSCREEN_DYNAPRO is not set +# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set +# CONFIG_TOUCHSCREEN_EETI is not set +# CONFIG_TOUCHSCREEN_EGALAX is not set +# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set +# CONFIG_TOUCHSCREEN_EKTF2127 is not set +# CONFIG_TOUCHSCREEN_ELAN is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_EXC3000 is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GOODIX is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set +# CONFIG_TOUCHSCREEN_HIDEEP is not set +# CONFIG_TOUCHSCREEN_HP600 is not set +# CONFIG_TOUCHSCREEN_HP7XX is not set +# CONFIG_TOUCHSCREEN_HTCPEN is not set +# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set +# CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_ILITEK is not set +# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_IPAQ_MICRO is not set +# CONFIG_TOUCHSCREEN_IPROC is not set +# CONFIG_TOUCHSCREEN_IQS5XX is not set +# CONFIG_TOUCHSCREEN_LPC32XX is not set +# CONFIG_TOUCHSCREEN_MAX11801 is not set +# CONFIG_TOUCHSCREEN_MC13783 is not set +# CONFIG_TOUCHSCREEN_MCS5000 is not set +# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set +# CONFIG_TOUCHSCREEN_MIGOR is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_MMS114 is not set +# CONFIG_TOUCHSCREEN_MSG2638 is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_MX25 is not set +# CONFIG_TOUCHSCREEN_MXS_LRADC is not set +# CONFIG_TOUCHSCREEN_PCAP is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_PIXCIR is not set +# CONFIG_TOUCHSCREEN_PROPERTIES is not set +# CONFIG_TOUCHSCREEN_RASPBERRYPI_FW is not set +# CONFIG_TOUCHSCREEN_RM_TS is not set +# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set +# CONFIG_TOUCHSCREEN_RPI_FT5406 is not set +# CONFIG_TOUCHSCREEN_S3C2410 is not set +# CONFIG_TOUCHSCREEN_S6SY761 is not set +# CONFIG_TOUCHSCREEN_SILEAD is not set +# CONFIG_TOUCHSCREEN_SIS_I2C is not set +# CONFIG_TOUCHSCREEN_ST1232 is not set +# CONFIG_TOUCHSCREEN_STMFTS is not set +# CONFIG_TOUCHSCREEN_STMPE is not set +# CONFIG_TOUCHSCREEN_SUN4I is not set +# CONFIG_TOUCHSCREEN_SUR40 is not set +# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set +# CONFIG_TOUCHSCREEN_SX8654 is not set +# CONFIG_TOUCHSCREEN_TI_AM335X_TSC is not set +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_TPS6507X is not set +# CONFIG_TOUCHSCREEN_TS4800 is not set +# CONFIG_TOUCHSCREEN_TSC2004 is not set +# CONFIG_TOUCHSCREEN_TSC2005 is not set +# CONFIG_TOUCHSCREEN_TSC2007 is not set +# CONFIG_TOUCHSCREEN_TSC2007_IIO is not set +# CONFIG_TOUCHSCREEN_TSC200X_CORE is not set +# CONFIG_TOUCHSCREEN_TSC_SERIO is not set +# CONFIG_TOUCHSCREEN_UCB1400 is not set +# CONFIG_TOUCHSCREEN_USB_3M is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set +# CONFIG_TOUCHSCREEN_USB_E2I is not set +# CONFIG_TOUCHSCREEN_USB_EASYTOUCH is not set +# CONFIG_TOUCHSCREEN_USB_EGALAX is not set +# CONFIG_TOUCHSCREEN_USB_ELO is not set +# CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set +# CONFIG_TOUCHSCREEN_USB_ETURBO is not set +# CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set +# CONFIG_TOUCHSCREEN_USB_GOTOP is not set +# CONFIG_TOUCHSCREEN_USB_GUNZE is not set +# CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set +# CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set +# CONFIG_TOUCHSCREEN_USB_ITM is not set +# CONFIG_TOUCHSCREEN_USB_JASTEC is not set +# CONFIG_TOUCHSCREEN_USB_NEXIO is not set +# CONFIG_TOUCHSCREEN_USB_PANJIT is not set +# CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set +# CONFIG_TOUCHSCREEN_W90X900 is not set +# CONFIG_TOUCHSCREEN_WACOM_I2C is not set +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set +# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set +# CONFIG_TOUCHSCREEN_WM831X is not set +# CONFIG_TOUCHSCREEN_WM9705 is not set +# CONFIG_TOUCHSCREEN_WM9712 is not set +# CONFIG_TOUCHSCREEN_WM9713 is not set +# CONFIG_TOUCHSCREEN_WM97XX is not set +# CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE is not set +# CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE is not set +# CONFIG_TOUCHSCREEN_ZET6223 is not set +# CONFIG_TOUCHSCREEN_ZFORCE is not set +# CONFIG_TOUCHSCREEN_ZINITIX is not set +# CONFIG_TPL0102 is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS65010 is not set +# CONFIG_TPS6507X is not set +# CONFIG_TRACEPOINT_BENCHMARK is not set +# CONFIG_TRACER_SNAPSHOT is not set +# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set +# CONFIG_TRACE_BRANCH_PROFILING is not set +# CONFIG_TRACE_EVAL_MAP_FILE is not set +# CONFIG_TRACE_EVENT_INJECT is not set +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +# CONFIG_TRACE_SINK is not set +# CONFIG_TRACING_EVENTS_GPIO is not set +CONFIG_TRACING_SUPPORT=y +CONFIG_TRAD_SIGNALS=y +# CONFIG_TRANSPARENT_HUGEPAGE is not set +# CONFIG_TREE_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_TRIM_UNUSED_KSYMS is not set +# CONFIG_TRUSTED_FOUNDATIONS is not set +# CONFIG_TRUSTED_KEYS is not set +# CONFIG_TSL2583 is not set +# CONFIG_TSL2591 is not set +# CONFIG_TSL2772 is not set +# CONFIG_TSL2x7x is not set +# CONFIG_TSL4531 is not set +# CONFIG_TSYS01 is not set +# CONFIG_TSYS02D is not set +# CONFIG_TTPCI_EEPROM is not set +CONFIG_TTY=y +# CONFIG_TTY_PRINTK is not set +# CONFIG_TUN is not set +# CONFIG_TUN_VNET_CROSS_LE is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL4030_MADC is not set +# CONFIG_TWL6030_GPADC is not set +# CONFIG_TWL6040_CORE is not set +# CONFIG_TYPEC is not set +# CONFIG_TYPEC_TCPM is not set +# CONFIG_TYPEC_UCSI is not set +# CONFIG_TYPHOON is not set +# CONFIG_UACCESS_WITH_MEMCPY is not set +# CONFIG_UBIFS_ATIME_SUPPORT is not set +# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set +# CONFIG_UBIFS_FS_AUTHENTICATION is not set +# CONFIG_UBIFS_FS_ENCRYPTION is not set +CONFIG_UBIFS_FS_LZO=y +# CONFIG_UBIFS_FS_SECURITY is not set +CONFIG_UBIFS_FS_XATTR=y +CONFIG_UBIFS_FS_ZLIB=y +CONFIG_UBIFS_FS_ZSTD=y +# CONFIG_UBSAN is not set +CONFIG_UBSAN_ALIGNMENT=y +CONFIG_UBSAN_BOOL=y +# CONFIG_UBSAN_DIV_ZERO is not set +CONFIG_UBSAN_ENUM=y +# CONFIG_UBSAN_MISC is not set +CONFIG_UBSAN_SHIFT=y +# CONFIG_UBSAN_UNREACHABLE is not set +# CONFIG_UCB1400_CORE is not set +# CONFIG_UCSI is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDMABUF is not set +CONFIG_UEVENT_HELPER=y +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +# CONFIG_UFS_FS is not set +# CONFIG_UHID is not set +CONFIG_UID16=y +# CONFIG_UIO is not set +# CONFIG_ULTRA is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_UNICODE is not set +# CONFIG_UNISYSSPAR is not set +# CONFIG_UNISYS_VISORBUS is not set +CONFIG_UNIX=y +CONFIG_UNIX98_PTYS=y +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_UNIX_DIAG is not set +CONFIG_UNIX_SCM=y +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_UNWINDER_FRAME_POINTER is not set +# CONFIG_UPROBES is not set +# CONFIG_UPROBE_EVENTS is not set +# CONFIG_US5182D is not set +# CONFIG_USB is not set +# CONFIG_USB4 is not set +# CONFIG_USBIP_CORE is not set +CONFIG_USBIP_VHCI_HC_PORTS=8 +CONFIG_USBIP_VHCI_NR_HCS=1 +# CONFIG_USBIP_VUDC is not set +# CONFIG_USBPCWATCHDOG is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_AIRSPY is not set +CONFIG_USB_ALI_M5632=y +# CONFIG_USB_AMD5536UDC is not set +CONFIG_USB_AN2720=y +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set +# CONFIG_USB_APPLEDISPLAY is not set +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARMLINUX=y +# CONFIG_USB_ATM is not set +# CONFIG_USB_AUDIO is not set +CONFIG_USB_AUTOSUSPEND_DELAY=2 +# CONFIG_USB_BDC_UDC is not set +CONFIG_USB_BELKIN=y +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDC_COMPOSITE is not set +# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set +# CONFIG_USB_CHAOSKEY is not set +# CONFIG_USB_CHIPIDEA is not set +# CONFIG_USB_CHIPIDEA_GENERIC is not set +# CONFIG_USB_CHIPIDEA_IMX is not set +# CONFIG_USB_CHIPIDEA_MSM is not set +# CONFIG_USB_CHIPIDEA_PCI is not set +# CONFIG_USB_CHIPIDEA_TEGRA is not set +# CONFIG_USB_CONFIGFS is not set +# CONFIG_USB_CONN_GPIO is not set +# CONFIG_USB_CXACRU is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_DSBR is not set +# CONFIG_USB_DUMMY_HCD is not set +# CONFIG_USB_DWC2 is not set +# CONFIG_USB_DWC2_DEBUG is not set +# CONFIG_USB_DWC2_DUAL_ROLE is not set +# CONFIG_USB_DWC2_HOST is not set +# CONFIG_USB_DWC2_PERIPHERAL is not set +# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set +# CONFIG_USB_DWC3 is not set +# CONFIG_USB_DWC3_EXYNOS is not set +# CONFIG_USB_DWC3_HAPS is not set +# CONFIG_USB_DWC3_KEYSTONE is not set +# CONFIG_USB_DWC3_OF_SIMPLE is not set +# CONFIG_USB_DWC3_PCI is not set +# CONFIG_USB_DWC3_QCOM is not set +# CONFIG_USB_DWC3_ULPI is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_EG20T is not set +# CONFIG_USB_EHCI_ATH79 is not set +# CONFIG_USB_EHCI_FSL is not set +# CONFIG_USB_EHCI_HCD is not set +# CONFIG_USB_EHCI_HCD_AT91 is not set +# CONFIG_USB_EHCI_HCD_OMAP is not set +# CONFIG_USB_EHCI_HCD_PPC_OF is not set +# CONFIG_USB_EHCI_MSM is not set +# CONFIG_USB_EHCI_MV is not set +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_ETH is not set +# CONFIG_USB_EZUSB_FX2 is not set +# CONFIG_USB_FEW_INIT_RETRIES is not set +# CONFIG_USB_FOTG210_HCD is not set +# CONFIG_USB_FOTG210_UDC is not set +# CONFIG_USB_FSL_USB2 is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_FUNCTIONFS is not set +# CONFIG_USB_FUSB300 is not set +# CONFIG_USB_GADGET is not set +# CONFIG_USB_GADGETFS is not set +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +# CONFIG_USB_GADGET_DEBUG_FS is not set +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 +CONFIG_USB_GADGET_VBUS_DRAW=2 +# CONFIG_USB_GADGET_XILINX is not set +# CONFIG_USB_GL860 is not set +# CONFIG_USB_GOKU is not set +# CONFIG_USB_GPIO_VBUS is not set +# CONFIG_USB_GR_UDC is not set +# CONFIG_USB_GSPCA is not set +# CONFIG_USB_GSPCA_BENQ is not set +# CONFIG_USB_GSPCA_CONEX is not set +# CONFIG_USB_GSPCA_CPIA1 is not set +# CONFIG_USB_GSPCA_DTCS033 is not set +# CONFIG_USB_GSPCA_ETOMS is not set +# CONFIG_USB_GSPCA_FINEPIX is not set +# CONFIG_USB_GSPCA_JEILINJ is not set +# CONFIG_USB_GSPCA_JL2005BCD is not set +# CONFIG_USB_GSPCA_KINECT is not set +# CONFIG_USB_GSPCA_KONICA is not set +# CONFIG_USB_GSPCA_MARS is not set +# CONFIG_USB_GSPCA_MR97310A is not set +# CONFIG_USB_GSPCA_NW80X is not set +# CONFIG_USB_GSPCA_OV519 is not set +# CONFIG_USB_GSPCA_OV534 is not set +# CONFIG_USB_GSPCA_OV534_9 is not set +# CONFIG_USB_GSPCA_PAC207 is not set +# CONFIG_USB_GSPCA_PAC7302 is not set +# CONFIG_USB_GSPCA_PAC7311 is not set +# CONFIG_USB_GSPCA_SE401 is not set +# CONFIG_USB_GSPCA_SN9C2028 is not set +# CONFIG_USB_GSPCA_SN9C20X is not set +# CONFIG_USB_GSPCA_SONIXB is not set +# CONFIG_USB_GSPCA_SONIXJ is not set +# CONFIG_USB_GSPCA_SPCA1528 is not set +# CONFIG_USB_GSPCA_SPCA500 is not set +# CONFIG_USB_GSPCA_SPCA501 is not set +# CONFIG_USB_GSPCA_SPCA505 is not set +# CONFIG_USB_GSPCA_SPCA506 is not set +# CONFIG_USB_GSPCA_SPCA508 is not set +# CONFIG_USB_GSPCA_SPCA561 is not set +# CONFIG_USB_GSPCA_SQ905 is not set +# CONFIG_USB_GSPCA_SQ905C is not set +# CONFIG_USB_GSPCA_SQ930X is not set +# CONFIG_USB_GSPCA_STK014 is not set +# CONFIG_USB_GSPCA_STK1135 is not set +# CONFIG_USB_GSPCA_STV0680 is not set +# CONFIG_USB_GSPCA_SUNPLUS is not set +# CONFIG_USB_GSPCA_T613 is not set +# CONFIG_USB_GSPCA_TOPRO is not set +# CONFIG_USB_GSPCA_TOUPTEK is not set +# CONFIG_USB_GSPCA_TV8532 is not set +# CONFIG_USB_GSPCA_VC032X is not set +# CONFIG_USB_GSPCA_VICAM is not set +# CONFIG_USB_GSPCA_XIRLINK_CIT is not set +# CONFIG_USB_GSPCA_ZC3XX is not set +# CONFIG_USB_G_ACM_MS is not set +# CONFIG_USB_G_DBGP is not set +# CONFIG_USB_G_HID is not set +# CONFIG_USB_G_MULTI is not set +# CONFIG_USB_G_NCM is not set +# CONFIG_USB_G_NOKIA is not set +# CONFIG_USB_G_PRINTER is not set +# CONFIG_USB_G_SERIAL is not set +# CONFIG_USB_G_WEBCAM is not set +# CONFIG_USB_HACKRF is not set +# CONFIG_USB_HCD_TEST_MODE is not set +# CONFIG_USB_HID is not set +# CONFIG_USB_HIDDEV is not set +# CONFIG_USB_HSIC_USB3503 is not set +# CONFIG_USB_HSIC_USB4604 is not set +# CONFIG_USB_HSO is not set +# CONFIG_USB_HUB_USB251XB is not set +# CONFIG_USB_HWA_HCD is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_IMX21_HCD is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_ISP1301 is not set +# CONFIG_USB_ISP1362_HCD is not set +# CONFIG_USB_ISP1760 is not set +# CONFIG_USB_ISP1760_HCD is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_KBD is not set +# CONFIG_USB_KC2190 is not set +# CONFIG_USB_LAN78XX is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +# CONFIG_USB_LED_TRIG is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LGM_PHY is not set +# CONFIG_USB_LINK_LAYER_TEST is not set +# CONFIG_USB_M5602 is not set +# CONFIG_USB_M66592 is not set +# CONFIG_USB_MASS_STORAGE is not set +# CONFIG_USB_MAX3420_UDC is not set +# CONFIG_USB_MAX3421_HCD is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_MON is not set +# CONFIG_USB_MOUSE is not set +# CONFIG_USB_MSI2500 is not set +# CONFIG_USB_MSM_OTG is not set +# CONFIG_USB_MTU3 is not set +# CONFIG_USB_MUSB_GADGET is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_MUSB_HOST is not set +# CONFIG_USB_MV_U3D is not set +# CONFIG_USB_MV_UDC is not set +# CONFIG_USB_MXS_PHY is not set +# CONFIG_USB_NET2272 is not set +# CONFIG_USB_NET2280 is not set +# CONFIG_USB_NET_AQC111 is not set +# CONFIG_USB_NET_AX88179_178A is not set +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_CDCETHER is not set +# CONFIG_USB_NET_CDC_EEM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_CDC_NCM is not set +# CONFIG_USB_NET_CDC_SUBSET is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_DRIVERS is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +# CONFIG_USB_NET_RNDIS_WLAN is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_OHCI_HCD is not set +# CONFIG_USB_OHCI_HCD_PCI is not set +# CONFIG_USB_OHCI_HCD_PPC_OF is not set +# CONFIG_USB_OHCI_HCD_PPC_OF_BE is not set +# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set +# CONFIG_USB_OHCI_HCD_SSB is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_OTG is not set +# CONFIG_USB_OTG_BLACKLIST_HUB is not set +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set +# CONFIG_USB_OTG_FSM is not set +# CONFIG_USB_OTG_PRODUCTLIST is not set +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_PCI is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_PHY is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_PWC_INPUT_EVDEV is not set +# CONFIG_USB_PXA27X is not set +# CONFIG_USB_R8A66597 is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_RAW_GADGET is not set +# CONFIG_USB_RCAR_PHY is not set +# CONFIG_USB_RENESAS_USBHS is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_ROLES_INTEL_XHCI is not set +# CONFIG_USB_ROLE_SWITCH is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_RTL8153_ECM is not set +# CONFIG_USB_S2255 is not set +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_AIRCABLE is not set +# CONFIG_USB_SERIAL_ARK3116 is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_CH341 is not set +# CONFIG_USB_SERIAL_CP210X is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_CYPRESS_M8 is not set +# CONFIG_USB_SERIAL_DEBUG is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT_TI is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_F81232 is not set +# CONFIG_USB_SERIAL_F8153X is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_GARMIN is not set +CONFIG_USB_SERIAL_GENERIC=y +# CONFIG_USB_SERIAL_IPAQ is not set +# CONFIG_USB_SERIAL_IPW is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_IUU is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +CONFIG_USB_SERIAL_KEYSPAN_MPR=y +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y +CONFIG_USB_SERIAL_KEYSPAN_USA19=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y +CONFIG_USB_SERIAL_KEYSPAN_USA28=y +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y +# CONFIG_USB_SERIAL_KLSI is not set +# CONFIG_USB_SERIAL_KOBIL_SCT is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_METRO is not set +# CONFIG_USB_SERIAL_MOS7715_PARPORT is not set +# CONFIG_USB_SERIAL_MOS7720 is not set +# CONFIG_USB_SERIAL_MOS7840 is not set +# CONFIG_USB_SERIAL_MXUPORT is not set +# CONFIG_USB_SERIAL_NAVMAN is not set +# CONFIG_USB_SERIAL_OMNINET is not set +# CONFIG_USB_SERIAL_OPTICON is not set +# CONFIG_USB_SERIAL_OPTION is not set +# CONFIG_USB_SERIAL_OTI6858 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_QCAUX is not set +# CONFIG_USB_SERIAL_QT2 is not set +# CONFIG_USB_SERIAL_QUALCOMM is not set +# CONFIG_USB_SERIAL_SAFE is not set +CONFIG_USB_SERIAL_SAFE_PADDED=y +# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set +# CONFIG_USB_SERIAL_SIMPLE is not set +# CONFIG_USB_SERIAL_SPCP8X5 is not set +# CONFIG_USB_SERIAL_SSU100 is not set +# CONFIG_USB_SERIAL_SYMBOL is not set +# CONFIG_USB_SERIAL_TI is not set +# CONFIG_USB_SERIAL_UPD78F0730 is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_WISHBONE is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_XR is not set +# CONFIG_USB_SERIAL_XSENS_MT is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_SNP_UDC_PLAT is not set +# CONFIG_USB_SPEEDTOUCH is not set +# CONFIG_USB_STKWEBCAM is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_ENE_UB6250 is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_REALTEK is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STV06XX is not set +# CONFIG_USB_SUPPORT is not set +# CONFIG_USB_SWITCH_FSA9480 is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_TMC is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_UAS is not set +# CONFIG_USB_UEAGLEATM is not set +# CONFIG_USB_ULPI is not set +# CONFIG_USB_ULPI_BUS is not set +# CONFIG_USB_USBNET is not set +# CONFIG_USB_USS720 is not set +# CONFIG_USB_VIDEO_CLASS is not set +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y +# CONFIG_USB_VL600 is not set +# CONFIG_USB_WDM is not set +# CONFIG_USB_WHCI_HCD is not set +# CONFIG_USB_WUSB is not set +# CONFIG_USB_WUSB_CBAF is not set +# CONFIG_USB_XHCI_DBGCAP is not set +# CONFIG_USB_XHCI_HCD is not set +# CONFIG_USB_XHCI_MVEBU is not set +# CONFIG_USB_XHCI_PCI_RENESAS is not set +# CONFIG_USB_XUSBATM is not set +# CONFIG_USB_YUREX is not set +# CONFIG_USB_ZD1201 is not set +# CONFIG_USB_ZERO is not set +# CONFIG_USB_ZR364XX is not set +# CONFIG_USELIB is not set +# CONFIG_USERFAULTFD is not set +# CONFIG_USERIO is not set +# CONFIG_USE_OF is not set +# CONFIG_UTS_NS is not set +# CONFIG_UWB is not set +# CONFIG_U_SERIAL_CONSOLE is not set +# CONFIG_V4L_MEM2MEM_DRIVERS is not set +# CONFIG_V4L_PLATFORM_DRIVERS is not set +# CONFIG_V4L_TEST_DRIVERS is not set +# CONFIG_VALIDATE_FS_PARSER is not set +# CONFIG_VBOXGUEST is not set +# CONFIG_VCNL3020 is not set +# CONFIG_VCNL4000 is not set +# CONFIG_VCNL4035 is not set +# CONFIG_VDPA is not set +CONFIG_VDSO=y +# CONFIG_VEML6030 is not set +# CONFIG_VEML6070 is not set +# CONFIG_VETH is not set +# CONFIG_VEXPRESS_CONFIG is not set +# CONFIG_VF610_ADC is not set +# CONFIG_VF610_DAC is not set +# CONFIG_VFAT_FS is not set +# CONFIG_VFIO is not set +# CONFIG_VFIO_FSL_MC is not set +# CONFIG_VFIO_PLATFORM is not set +# CONFIG_VGASTATE is not set +# CONFIG_VGA_ARB is not set +# CONFIG_VGA_CONSOLE is not set +# CONFIG_VGA_SWITCHEROO is not set +# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set +CONFIG_VHOST_MENU=y +# CONFIG_VHOST_NET is not set +# CONFIG_VHOST_VSOCK is not set +# CONFIG_VIA_RHINE is not set +# CONFIG_VIA_VELOCITY is not set +# CONFIG_VIDEO_AD5398 is not set +# CONFIG_VIDEO_AD5820 is not set +# CONFIG_VIDEO_AD9389B is not set +# CONFIG_VIDEO_ADP1653 is not set +# CONFIG_VIDEO_ADV7170 is not set +# CONFIG_VIDEO_ADV7175 is not set +# CONFIG_VIDEO_ADV7180 is not set +# CONFIG_VIDEO_ADV7183 is not set +# CONFIG_VIDEO_ADV7343 is not set +# CONFIG_VIDEO_ADV7393 is not set +# CONFIG_VIDEO_ADV748X is not set +# CONFIG_VIDEO_ADV7511 is not set +# CONFIG_VIDEO_ADV7604 is not set +# CONFIG_VIDEO_ADV7842 is not set +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_AK7375 is not set +# CONFIG_VIDEO_AK881X is not set +# CONFIG_VIDEO_AM437X_VPFE is not set +# CONFIG_VIDEO_ASPEED is not set +# CONFIG_VIDEO_ATMEL_ISC is not set +# CONFIG_VIDEO_ATMEL_ISI is not set +# CONFIG_VIDEO_AU0828 is not set +# CONFIG_VIDEO_BT819 is not set +# CONFIG_VIDEO_BT848 is not set +# CONFIG_VIDEO_BT856 is not set +# CONFIG_VIDEO_BT866 is not set +# CONFIG_VIDEO_CADENCE is not set +# CONFIG_VIDEO_CAFE_CCIC is not set +# CONFIG_VIDEO_CCS is not set +# CONFIG_VIDEO_CODA is not set +# CONFIG_VIDEO_CS3308 is not set +# CONFIG_VIDEO_CS5345 is not set +# CONFIG_VIDEO_CS53L32A is not set +# CONFIG_VIDEO_CX231XX is not set +# CONFIG_VIDEO_CX2341X is not set +# CONFIG_VIDEO_CX25840 is not set +# CONFIG_VIDEO_CX88 is not set +# CONFIG_VIDEO_DEV is not set +# CONFIG_VIDEO_DM6446_CCDC is not set +# CONFIG_VIDEO_DT3155 is not set +# CONFIG_VIDEO_DW9714 is not set +# CONFIG_VIDEO_DW9768 is not set +# CONFIG_VIDEO_DW9807_VCM is not set +# CONFIG_VIDEO_EM28XX is not set +# CONFIG_VIDEO_ET8EK8 is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +# CONFIG_VIDEO_GO7007 is not set +# CONFIG_VIDEO_GS1662 is not set +# CONFIG_VIDEO_HDPVR is not set +# CONFIG_VIDEO_HEXIUM_GEMINI is not set +# CONFIG_VIDEO_HEXIUM_ORION is not set +# CONFIG_VIDEO_HI556 is not set +# CONFIG_VIDEO_I2C is not set +# CONFIG_VIDEO_IMX208 is not set +# CONFIG_VIDEO_IMX214 is not set +# CONFIG_VIDEO_IMX219 is not set +# CONFIG_VIDEO_IMX258 is not set +# CONFIG_VIDEO_IMX274 is not set +# CONFIG_VIDEO_IMX290 is not set +# CONFIG_VIDEO_IMX319 is not set +# CONFIG_VIDEO_IMX334 is not set +# CONFIG_VIDEO_IMX335 is not set +# CONFIG_VIDEO_IMX355 is not set +# CONFIG_VIDEO_IMX412 is not set +# CONFIG_VIDEO_IMX477 is not set +# CONFIG_VIDEO_IMX8_JPEG is not set +# CONFIG_VIDEO_IMX_PXP is not set +# CONFIG_VIDEO_IRS1125 is not set +# CONFIG_VIDEO_IR_I2C is not set +# CONFIG_VIDEO_IVTV is not set +# CONFIG_VIDEO_KS0127 is not set +# CONFIG_VIDEO_LM3560 is not set +# CONFIG_VIDEO_LM3646 is not set +# CONFIG_VIDEO_M52790 is not set +# CONFIG_VIDEO_M5MOLS is not set +# CONFIG_VIDEO_MAX9286 is not set +# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set +# CONFIG_VIDEO_ML86V7667 is not set +# CONFIG_VIDEO_MSP3400 is not set +# CONFIG_VIDEO_MT9M001 is not set +# CONFIG_VIDEO_MT9M032 is not set +# CONFIG_VIDEO_MT9M111 is not set +# CONFIG_VIDEO_MT9P031 is not set +# CONFIG_VIDEO_MT9T001 is not set +# CONFIG_VIDEO_MT9T112 is not set +# CONFIG_VIDEO_MT9V011 is not set +# CONFIG_VIDEO_MT9V032 is not set +# CONFIG_VIDEO_MT9V111 is not set +# CONFIG_VIDEO_MUX is not set +# CONFIG_VIDEO_MXB is not set +# CONFIG_VIDEO_NOON010PC30 is not set +# CONFIG_VIDEO_OMAP2_VOUT is not set +# CONFIG_VIDEO_OV02A10 is not set +# CONFIG_VIDEO_OV13858 is not set +# CONFIG_VIDEO_OV2311 is not set +# CONFIG_VIDEO_OV2640 is not set +# CONFIG_VIDEO_OV2659 is not set +# CONFIG_VIDEO_OV2680 is not set +# CONFIG_VIDEO_OV2685 is not set +# CONFIG_VIDEO_OV2740 is not set +# CONFIG_VIDEO_OV5640 is not set +# CONFIG_VIDEO_OV5645 is not set +# CONFIG_VIDEO_OV5647 is not set +# CONFIG_VIDEO_OV5648 is not set +# CONFIG_VIDEO_OV5670 is not set +# CONFIG_VIDEO_OV5675 is not set +# CONFIG_VIDEO_OV5695 is not set +# CONFIG_VIDEO_OV6650 is not set +# CONFIG_VIDEO_OV7251 is not set +# CONFIG_VIDEO_OV7640 is not set +# CONFIG_VIDEO_OV7670 is not set +# CONFIG_VIDEO_OV772X is not set +# CONFIG_VIDEO_OV7740 is not set +# CONFIG_VIDEO_OV8856 is not set +# CONFIG_VIDEO_OV8865 is not set +# CONFIG_VIDEO_OV9281 is not set +# CONFIG_VIDEO_OV9282 is not set +# CONFIG_VIDEO_OV9640 is not set +# CONFIG_VIDEO_OV9650 is not set +# CONFIG_VIDEO_OV9734 is not set +# CONFIG_VIDEO_PVRUSB2 is not set +# CONFIG_VIDEO_RDACM20 is not set +# CONFIG_VIDEO_RDACM21 is not set +# CONFIG_VIDEO_RJ54N1 is not set +# CONFIG_VIDEO_ROCKCHIP_ISP1 is not set +# CONFIG_VIDEO_S5C73M3 is not set +# CONFIG_VIDEO_S5K4ECGX is not set +# CONFIG_VIDEO_S5K5BAF is not set +# CONFIG_VIDEO_S5K6A3 is not set +# CONFIG_VIDEO_S5K6AA is not set +# CONFIG_VIDEO_SAA6588 is not set +# CONFIG_VIDEO_SAA6752HS is not set +# CONFIG_VIDEO_SAA7110 is not set +# CONFIG_VIDEO_SAA711X is not set +# CONFIG_VIDEO_SAA7127 is not set +# CONFIG_VIDEO_SAA7134 is not set +# CONFIG_VIDEO_SAA717X is not set +# CONFIG_VIDEO_SAA7185 is not set +# CONFIG_VIDEO_SH_MOBILE_CEU is not set +# CONFIG_VIDEO_SMIAPP is not set +# CONFIG_VIDEO_SONY_BTF_MPX is not set +# CONFIG_VIDEO_SR030PC30 is not set +# CONFIG_VIDEO_STK1160_COMMON is not set +# CONFIG_VIDEO_ST_MIPID02 is not set +# CONFIG_VIDEO_TC358743 is not set +# CONFIG_VIDEO_TDA1997X is not set +# CONFIG_VIDEO_TDA7432 is not set +# CONFIG_VIDEO_TDA9840 is not set +# CONFIG_VIDEO_TEA6415C is not set +# CONFIG_VIDEO_TEA6420 is not set +# CONFIG_VIDEO_THS7303 is not set +# CONFIG_VIDEO_THS8200 is not set +# CONFIG_VIDEO_TIMBERDALE is not set +# CONFIG_VIDEO_TLV320AIC23B is not set +# CONFIG_VIDEO_TM6000 is not set +# CONFIG_VIDEO_TVAUDIO is not set +# CONFIG_VIDEO_TVP514X is not set +# CONFIG_VIDEO_TVP5150 is not set +# CONFIG_VIDEO_TVP7002 is not set +# CONFIG_VIDEO_TW2804 is not set +# CONFIG_VIDEO_TW9903 is not set +# CONFIG_VIDEO_TW9906 is not set +# CONFIG_VIDEO_TW9910 is not set +# CONFIG_VIDEO_UDA1342 is not set +# CONFIG_VIDEO_UPD64031A is not set +# CONFIG_VIDEO_UPD64083 is not set +# CONFIG_VIDEO_USBTV is not set +# CONFIG_VIDEO_USBVISION is not set +# CONFIG_VIDEO_V4L2 is not set +# CONFIG_VIDEO_VP27SMPX is not set +# CONFIG_VIDEO_VPX3220 is not set +# CONFIG_VIDEO_VS6624 is not set +# CONFIG_VIDEO_WM8739 is not set +# CONFIG_VIDEO_WM8775 is not set +# CONFIG_VIDEO_XILINX is not set +# CONFIG_VIDEO_ZORAN is not set +# CONFIG_VIRTIO_BALLOON is not set +# CONFIG_VIRTIO_BLK_SCSI is not set +# CONFIG_VIRTIO_CONSOLE is not set +# CONFIG_VIRTIO_FS is not set +# CONFIG_VIRTIO_INPUT is not set +# CONFIG_VIRTIO_IOMMU is not set +CONFIG_VIRTIO_MENU=y +# CONFIG_VIRTIO_MMIO is not set +# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set +# CONFIG_VIRTIO_PCI is not set +# CONFIG_VIRTUALIZATION is not set +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +# CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRT_TO_BUS=y +# CONFIG_VITESSE_PHY is not set +# CONFIG_VL53L0X_I2C is not set +# CONFIG_VL6180 is not set +CONFIG_VLAN_8021Q=y +# CONFIG_VLAN_8021Q_GVRP is not set +# CONFIG_VLAN_8021Q_MVRP is not set +# CONFIG_VME_BUS is not set +# CONFIG_VMLINUX_MAP is not set +# CONFIG_VMSPLIT_1G is not set +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_2G_OPT is not set +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_3G_OPT is not set +# CONFIG_VMWARE_PVSCSI is not set +# CONFIG_VMXNET3 is not set +# CONFIG_VM_EVENT_COUNTERS is not set +# CONFIG_VOP_BUS is not set +# CONFIG_VORTEX is not set +# CONFIG_VSOCKETS is not set +# CONFIG_VSOCKETS_DIAG is not set +# CONFIG_VT is not set +# CONFIG_VT6655 is not set +# CONFIG_VT6656 is not set +# CONFIG_VXFS_FS is not set +# CONFIG_VXGE is not set +# CONFIG_VXLAN is not set +# CONFIG_VZ89X is not set +# CONFIG_W1 is not set +# CONFIG_W1_CON is not set +# CONFIG_W1_MASTER_DS1WM is not set +# CONFIG_W1_MASTER_DS2482 is not set +# CONFIG_W1_MASTER_DS2490 is not set +# CONFIG_W1_MASTER_GPIO is not set +# CONFIG_W1_MASTER_MATROX is not set +# CONFIG_W1_MASTER_SGI is not set +# CONFIG_W1_SLAVE_DS2405 is not set +# CONFIG_W1_SLAVE_DS2406 is not set +# CONFIG_W1_SLAVE_DS2408 is not set +# CONFIG_W1_SLAVE_DS2413 is not set +# CONFIG_W1_SLAVE_DS2423 is not set +# CONFIG_W1_SLAVE_DS2430 is not set +# CONFIG_W1_SLAVE_DS2431 is not set +# CONFIG_W1_SLAVE_DS2433 is not set +# CONFIG_W1_SLAVE_DS2438 is not set +# CONFIG_W1_SLAVE_DS250X is not set +# CONFIG_W1_SLAVE_DS2780 is not set +# CONFIG_W1_SLAVE_DS2781 is not set +# CONFIG_W1_SLAVE_DS2805 is not set +# CONFIG_W1_SLAVE_DS28E04 is not set +# CONFIG_W1_SLAVE_DS28E17 is not set +# CONFIG_W1_SLAVE_SMEM is not set +# CONFIG_W1_SLAVE_THERM is not set +# CONFIG_W83627HF_WDT is not set +# CONFIG_W83877F_WDT is not set +# CONFIG_W83977F_WDT is not set +# CONFIG_WAN is not set +# CONFIG_WANXL is not set +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_CORE is not set +CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y +# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set +# CONFIG_WATCHDOG_NOWAYOUT is not set +CONFIG_WATCHDOG_OPEN_TIMEOUT=0 +# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set +# CONFIG_WATCHDOG_SYSFS is not set +# CONFIG_WATCH_QUEUE is not set +# CONFIG_WD80x3 is not set +# CONFIG_WDAT_WDT is not set +# CONFIG_WDTPCI is not set +CONFIG_WERROR=y +# CONFIG_WEXT_CORE is not set +# CONFIG_WEXT_PRIV is not set +# CONFIG_WEXT_PROC is not set +# CONFIG_WEXT_SPY is not set +CONFIG_WILINK_PLATFORM_DATA=y +# CONFIG_WIMAX is not set +# CONFIG_WIREGUARD is not set +CONFIG_WIRELESS=y +# CONFIG_WIRELESS_EXT is not set +# CONFIG_WIRELESS_WDS is not set +# CONFIG_WIZNET_W5100 is not set +# CONFIG_WIZNET_W5300 is not set +# CONFIG_WL1251 is not set +# CONFIG_WL12XX is not set +# CONFIG_WL18XX is not set +CONFIG_WLAN=y +# CONFIG_WLAN_VENDOR_ADMTEK is not set +# CONFIG_WLAN_VENDOR_ATH is not set +# CONFIG_WLAN_VENDOR_ATMEL is not set +# CONFIG_WLAN_VENDOR_BROADCOM is not set +# CONFIG_WLAN_VENDOR_CISCO is not set +# CONFIG_WLAN_VENDOR_INTEL is not set +# CONFIG_WLAN_VENDOR_INTERSIL is not set +# CONFIG_WLAN_VENDOR_MARVELL is not set +# CONFIG_WLAN_VENDOR_MEDIATEK is not set +# CONFIG_WLAN_VENDOR_MICROCHIP is not set +# CONFIG_WLAN_VENDOR_QUANTENNA is not set +# CONFIG_WLAN_VENDOR_RALINK is not set +# CONFIG_WLAN_VENDOR_REALTEK is not set +# CONFIG_WLAN_VENDOR_RSI is not set +# CONFIG_WLAN_VENDOR_ST is not set +# CONFIG_WLAN_VENDOR_TI is not set +# CONFIG_WLAN_VENDOR_ZYDAS is not set +# CONFIG_WLCORE is not set +CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y +# CONFIG_WQ_WATCHDOG is not set +# CONFIG_WWAN is not set +# CONFIG_WWAN_HWSIM is not set +# CONFIG_WW_MUTEX_SELFTEST is not set +# CONFIG_X25 is not set +# CONFIG_X509_CERTIFICATE_PARSER is not set +# CONFIG_X86_PKG_TEMP_THERMAL is not set +CONFIG_X86_SYSFB=y +# CONFIG_XDP_SOCKETS is not set +# CONFIG_XEN is not set +# CONFIG_XEN_GRANT_DMA_ALLOC is not set +# CONFIG_XEN_PVCALLS_FRONTEND is not set +CONFIG_XEN_SCRUB_PAGES_DEFAULT=y +CONFIG_XFRM=y +# CONFIG_XFRM_INTERFACE is not set +# CONFIG_XFRM_IPCOMP is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_USER is not set +# CONFIG_XFS_DEBUG is not set +# CONFIG_XFS_FS is not set +# CONFIG_XFS_ONLINE_SCRUB is not set +# CONFIG_XFS_POSIX_ACL is not set +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_RT is not set +# CONFIG_XFS_SUPPORT_V4 is not set +# CONFIG_XFS_WARN is not set +# CONFIG_XILINX_AXI_EMAC is not set +# CONFIG_XILINX_DMA is not set +# CONFIG_XILINX_EMACLITE is not set +# CONFIG_XILINX_GMII2RGMII is not set +# CONFIG_XILINX_LL_TEMAC is not set +# CONFIG_XILINX_SDFEC is not set +# CONFIG_XILINX_VCU is not set +# CONFIG_XILINX_WATCHDOG is not set +# CONFIG_XILINX_XADC is not set +# CONFIG_XILINX_ZYNQMP_DMA is not set +# CONFIG_XILINX_ZYNQMP_DPDMA is not set +# CONFIG_XILLYBUS is not set +# CONFIG_XILLYUSB is not set +# CONFIG_XIL_AXIS_FIFO is not set +# CONFIG_XIP_KERNEL is not set +# CONFIG_XMON is not set +CONFIG_XZ_DEC=y +# CONFIG_XZ_DEC_ARM is not set +# CONFIG_XZ_DEC_ARMTHUMB is not set +# CONFIG_XZ_DEC_BCJ is not set +# CONFIG_XZ_DEC_IA64 is not set +# CONFIG_XZ_DEC_POWERPC is not set +# CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_TEST is not set +# CONFIG_XZ_DEC_X86 is not set +# CONFIG_YAM is not set +# CONFIG_YAMAHA_YAS530 is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_YENTA is not set +# CONFIG_YENTA_O2 is not set +# CONFIG_YENTA_RICOH is not set +# CONFIG_YENTA_TI is not set +# CONFIG_YENTA_TOSHIBA is not set +# CONFIG_ZBUD is not set +# CONFIG_ZD1211RW is not set +# CONFIG_ZD1211RW_DEBUG is not set +# CONFIG_ZEROPLUS_FF is not set +# CONFIG_ZERO_CALL_USED_REGS is not set +# CONFIG_ZIIRAVE_WATCHDOG is not set +# CONFIG_ZISOFS is not set +# CONFIG_ZLIB_DEFLATE is not set +# CONFIG_ZLIB_INFLATE is not set +CONFIG_ZONE_DMA=y +# CONFIG_ZOPT2201 is not set +# CONFIG_ZPA2326 is not set +# CONFIG_ZPOOL is not set +# CONFIG_ZRAM is not set +# CONFIG_ZRAM_DEF_COMP_842 is not set +# CONFIG_ZRAM_DEF_COMP_LZ4 is not set +# CONFIG_ZRAM_DEF_COMP_LZ4HC is not set +# CONFIG_ZRAM_DEF_COMP_LZO is not set +# CONFIG_ZRAM_DEF_COMP_LZORLE is not set +# CONFIG_ZRAM_DEF_COMP_ZSTD is not set +# CONFIG_ZRAM_MEMORY_TRACKING is not set +# CONFIG_ZSMALLOC is not set +# CONFIG_ZX_TDM is not set diff --git a/target/linux/generic/config-filter b/target/linux/generic/config-filter index 201b68dddf..e7eda471d0 100644 --- a/target/linux/generic/config-filter +++ b/target/linux/generic/config-filter @@ -5,11 +5,13 @@ # CONFIG_CC_(CAN|HAS|IS|VERSION)_.* is not set CONFIG_CLANG_VERSION=.* # CONFIG_GCC_VERSION is not set +CONFIG_FRAME_WARN=.* # CONFIG_HAVE_(?!(ARCH_TIMER|TCM|SMP)).* is not set # CONFIG_INLINE_.* is not set # CONFIG_LD_.* is not set CONFIG_LLD_VERSION=.* CONFIG_PAHOLE_VERSION=.* +CONFIG_PAHOLE_HAS_SPLIT_BTF=.* CONFIG_PLUGIN_HOSTCC=".*" # CONFIG_SET_FS is not set # CONFIG_TASKS_.* is not set diff --git a/target/linux/generic/files/block/partitions/fit.c b/target/linux/generic/files/block/partitions/fit.c index 75516af493..91b25e0581 100644 --- a/target/linux/generic/files/block/partitions/fit.c +++ b/target/linux/generic/files/block/partitions/fit.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "check.h" @@ -72,7 +73,8 @@ int parse_fit_partitions(struct parsed_partitions *state, u64 fit_start_sector, u64 sectors, int *slot, int add_remain) { - struct address_space *mapping = state->bdev->bd_inode->i_mapping; + struct block_device *bdev = state->disk->part0; + struct address_space *mapping = bdev->bd_inode->i_mapping; struct page *page; void *fit, *init_fit; struct partition_meta_info *info; @@ -82,13 +84,13 @@ int parse_fit_partitions(struct parsed_partitions *state, u64 fit_start_sector, const u32 *image_offset_be, *image_len_be, *image_pos_be; int ret = 1, node, images, config; const char *image_name, *image_type, *image_description, *config_default, - *config_description, *config_loadables; + *config_description, *config_loadables, *bootconf_c; int image_name_len, image_type_len, image_description_len, config_default_len, - config_description_len, config_loadables_len; + config_description_len, config_loadables_len, bootconf_len; sector_t start_sect, nr_sects; size_t label_min; struct device_node *np = NULL; - const char *bootconf; + char *bootconf = NULL, *bootconf_term; const char *loadable; const char *select_rootfs = NULL; bool found; @@ -116,7 +118,7 @@ int parse_fit_partitions(struct parsed_partitions *state, u64 fit_start_sector, return 0; } - dsectors = get_capacity(state->bdev->bd_disk); + dsectors = get_capacity(bdev->bd_disk); if (sectors) dsectors = (dsectors>sectors)?sectors:dsectors; @@ -141,10 +143,17 @@ int parse_fit_partitions(struct parsed_partitions *state, u64 fit_start_sector, return -ENOMEM; np = of_find_node_by_path("/chosen"); - if (np) - bootconf = of_get_property(np, "bootconf", NULL); - else - bootconf = NULL; + if (np) { + bootconf_c = of_get_property(np, "u-boot,bootconf", &bootconf_len); + if (bootconf_c && bootconf_len) + bootconf = kmemdup_nul(bootconf_c, bootconf_len, GFP_KERNEL); + } + + if (bootconf) { + bootconf_term = strchr(bootconf, '#'); + if (bootconf_term) + *bootconf_term = '\0'; + } config = fdt_path_offset(fit, FIT_CONFS_PATH); if (config < 0) { @@ -283,6 +292,7 @@ int parse_fit_partitions(struct parsed_partitions *state, u64 fit_start_sector, strlcat(state->pp_buf, tmp, PAGE_SIZE); } ret_out: + kfree(bootconf); kfree(fit); return ret; } diff --git a/target/linux/generic/files/drivers/bcma/fallback-sprom.c b/target/linux/generic/files/drivers/bcma/fallback-sprom.c new file mode 100644 index 0000000000..ce93560a48 --- /dev/null +++ b/target/linux/generic/files/drivers/bcma/fallback-sprom.c @@ -0,0 +1,533 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * BCMA Fallback SPROM Driver + * + * Copyright (C) 2020 Álvaro Fernández Rojas + * Copyright (C) 2014 Jonas Gorski + * Copyright (C) 2008 Maxime Bizon + * Copyright (C) 2008 Florian Fainelli + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define BCMA_FBS_MAX_SIZE 468 + +/* SPROM Extraction */ +#define SPOFF(offset) ((offset) / sizeof(u16)) + +#define SPEX(_outvar, _offset, _mask, _shift) \ + out->_outvar = ((in[SPOFF(_offset)] & (_mask)) >> (_shift)) + +#define SPEX32(_outvar, _offset, _mask, _shift) \ + out->_outvar = ((((u32)in[SPOFF((_offset)+2)] << 16 | \ + in[SPOFF(_offset)]) & (_mask)) >> (_shift)) + +#define SPEX_ARRAY8(_field, _offset, _mask, _shift) \ + do { \ + SPEX(_field[0], _offset + 0, _mask, _shift); \ + SPEX(_field[1], _offset + 2, _mask, _shift); \ + SPEX(_field[2], _offset + 4, _mask, _shift); \ + SPEX(_field[3], _offset + 6, _mask, _shift); \ + SPEX(_field[4], _offset + 8, _mask, _shift); \ + SPEX(_field[5], _offset + 10, _mask, _shift); \ + SPEX(_field[6], _offset + 12, _mask, _shift); \ + SPEX(_field[7], _offset + 14, _mask, _shift); \ + } while (0) + +struct bcma_fbs { + struct device *dev; + struct list_head list; + struct ssb_sprom sprom; + u32 pci_bus; + u32 pci_dev; + bool devid_override; +}; + +static DEFINE_SPINLOCK(bcma_fbs_lock); +static struct list_head bcma_fbs_list = LIST_HEAD_INIT(bcma_fbs_list); + +int bcma_get_fallback_sprom(struct bcma_bus *bus, struct ssb_sprom *out) +{ + struct bcma_fbs *pos; + u32 pci_bus, pci_dev; + + if (bus->hosttype != BCMA_HOSTTYPE_PCI) + return -ENOENT; + + pci_bus = bus->host_pci->bus->number; + pci_dev = PCI_SLOT(bus->host_pci->devfn); + + list_for_each_entry(pos, &bcma_fbs_list, list) { + if (pos->pci_bus != pci_bus || + pos->pci_dev != pci_dev) + continue; + + if (pos->devid_override) + bus->host_pci->device = pos->sprom.dev_id; + + memcpy(out, &pos->sprom, sizeof(struct ssb_sprom)); + dev_info(pos->dev, "requested by [%x:%x]", + pos->pci_bus, pos->pci_dev); + + return 0; + } + + pr_err("unable to fill SPROM for [%x:%x]\n", pci_bus, pci_dev); + + return -EINVAL; +} + +static s8 sprom_extract_antgain(const u16 *in, u16 offset, u16 mask, u16 shift) +{ + u16 v; + u8 gain; + + v = in[SPOFF(offset)]; + gain = (v & mask) >> shift; + if (gain == 0xFF) { + gain = 8; /* If unset use 2dBm */ + } else { + /* Q5.2 Fractional part is stored in 0xC0 */ + gain = ((gain & 0xC0) >> 6) | ((gain & 0x3F) << 2); + } + + return (s8)gain; +} + +static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in) +{ + static const u16 pwr_info_offset[] = { + SSB_SROM8_PWR_INFO_CORE0, SSB_SROM8_PWR_INFO_CORE1, + SSB_SROM8_PWR_INFO_CORE2, SSB_SROM8_PWR_INFO_CORE3 + }; + u16 o; + int i; + + BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) != + ARRAY_SIZE(out->core_pwr_info)); + + SPEX(board_rev, SSB_SPROM8_BOARDREV, ~0, 0); + SPEX(board_type, SSB_SPROM1_SPID, ~0, 0); + + SPEX(txpid2g[0], SSB_SPROM4_TXPID2G01, SSB_SPROM4_TXPID2G0, + SSB_SPROM4_TXPID2G0_SHIFT); + SPEX(txpid2g[1], SSB_SPROM4_TXPID2G01, SSB_SPROM4_TXPID2G1, + SSB_SPROM4_TXPID2G1_SHIFT); + SPEX(txpid2g[2], SSB_SPROM4_TXPID2G23, SSB_SPROM4_TXPID2G2, + SSB_SPROM4_TXPID2G2_SHIFT); + SPEX(txpid2g[3], SSB_SPROM4_TXPID2G23, SSB_SPROM4_TXPID2G3, + SSB_SPROM4_TXPID2G3_SHIFT); + + SPEX(txpid5gl[0], SSB_SPROM4_TXPID5GL01, SSB_SPROM4_TXPID5GL0, + SSB_SPROM4_TXPID5GL0_SHIFT); + SPEX(txpid5gl[1], SSB_SPROM4_TXPID5GL01, SSB_SPROM4_TXPID5GL1, + SSB_SPROM4_TXPID5GL1_SHIFT); + SPEX(txpid5gl[2], SSB_SPROM4_TXPID5GL23, SSB_SPROM4_TXPID5GL2, + SSB_SPROM4_TXPID5GL2_SHIFT); + SPEX(txpid5gl[3], SSB_SPROM4_TXPID5GL23, SSB_SPROM4_TXPID5GL3, + SSB_SPROM4_TXPID5GL3_SHIFT); + + SPEX(txpid5g[0], SSB_SPROM4_TXPID5G01, SSB_SPROM4_TXPID5G0, + SSB_SPROM4_TXPID5G0_SHIFT); + SPEX(txpid5g[1], SSB_SPROM4_TXPID5G01, SSB_SPROM4_TXPID5G1, + SSB_SPROM4_TXPID5G1_SHIFT); + SPEX(txpid5g[2], SSB_SPROM4_TXPID5G23, SSB_SPROM4_TXPID5G2, + SSB_SPROM4_TXPID5G2_SHIFT); + SPEX(txpid5g[3], SSB_SPROM4_TXPID5G23, SSB_SPROM4_TXPID5G3, + SSB_SPROM4_TXPID5G3_SHIFT); + + SPEX(txpid5gh[0], SSB_SPROM4_TXPID5GH01, SSB_SPROM4_TXPID5GH0, + SSB_SPROM4_TXPID5GH0_SHIFT); + SPEX(txpid5gh[1], SSB_SPROM4_TXPID5GH01, SSB_SPROM4_TXPID5GH1, + SSB_SPROM4_TXPID5GH1_SHIFT); + SPEX(txpid5gh[2], SSB_SPROM4_TXPID5GH23, SSB_SPROM4_TXPID5GH2, + SSB_SPROM4_TXPID5GH2_SHIFT); + SPEX(txpid5gh[3], SSB_SPROM4_TXPID5GH23, SSB_SPROM4_TXPID5GH3, + SSB_SPROM4_TXPID5GH3_SHIFT); + + SPEX(boardflags_lo, SSB_SPROM8_BFLLO, ~0, 0); + SPEX(boardflags_hi, SSB_SPROM8_BFLHI, ~0, 0); + SPEX(boardflags2_lo, SSB_SPROM8_BFL2LO, ~0, 0); + SPEX(boardflags2_hi, SSB_SPROM8_BFL2HI, ~0, 0); + + SPEX(alpha2[0], SSB_SPROM8_CCODE, 0xff00, 8); + SPEX(alpha2[1], SSB_SPROM8_CCODE, 0x00ff, 0); + + /* Extract core's power info */ + for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) { + o = pwr_info_offset[i]; + SPEX(core_pwr_info[i].itssi_2g, o + SSB_SROM8_2G_MAXP_ITSSI, + SSB_SPROM8_2G_ITSSI, SSB_SPROM8_2G_ITSSI_SHIFT); + SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SROM8_2G_MAXP_ITSSI, + SSB_SPROM8_2G_MAXP, 0); + + SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SROM8_2G_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SROM8_2G_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SROM8_2G_PA_2, ~0, 0); + + SPEX(core_pwr_info[i].itssi_5g, o + SSB_SROM8_5G_MAXP_ITSSI, + SSB_SPROM8_5G_ITSSI, SSB_SPROM8_5G_ITSSI_SHIFT); + SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SROM8_5G_MAXP_ITSSI, + SSB_SPROM8_5G_MAXP, 0); + SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM8_5GHL_MAXP, + SSB_SPROM8_5GH_MAXP, 0); + SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM8_5GHL_MAXP, + SSB_SPROM8_5GL_MAXP, SSB_SPROM8_5GL_MAXP_SHIFT); + + SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SROM8_5GL_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SROM8_5GL_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SROM8_5GL_PA_2, ~0, 0); + SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SROM8_5G_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SROM8_5G_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SROM8_5G_PA_2, ~0, 0); + SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SROM8_5GH_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SROM8_5GH_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SROM8_5GH_PA_2, ~0, 0); + } + + SPEX(fem.ghz2.tssipos, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_TSSIPOS, + SSB_SROM8_FEM_TSSIPOS_SHIFT); + SPEX(fem.ghz2.extpa_gain, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_EXTPA_GAIN, + SSB_SROM8_FEM_EXTPA_GAIN_SHIFT); + SPEX(fem.ghz2.pdet_range, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_PDET_RANGE, + SSB_SROM8_FEM_PDET_RANGE_SHIFT); + SPEX(fem.ghz2.tr_iso, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_TR_ISO, + SSB_SROM8_FEM_TR_ISO_SHIFT); + SPEX(fem.ghz2.antswlut, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_ANTSWLUT, + SSB_SROM8_FEM_ANTSWLUT_SHIFT); + + SPEX(fem.ghz5.tssipos, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_TSSIPOS, + SSB_SROM8_FEM_TSSIPOS_SHIFT); + SPEX(fem.ghz5.extpa_gain, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_EXTPA_GAIN, + SSB_SROM8_FEM_EXTPA_GAIN_SHIFT); + SPEX(fem.ghz5.pdet_range, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_PDET_RANGE, + SSB_SROM8_FEM_PDET_RANGE_SHIFT); + SPEX(fem.ghz5.tr_iso, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_TR_ISO, + SSB_SROM8_FEM_TR_ISO_SHIFT); + SPEX(fem.ghz5.antswlut, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_ANTSWLUT, + SSB_SROM8_FEM_ANTSWLUT_SHIFT); + + SPEX(ant_available_a, SSB_SPROM8_ANTAVAIL, SSB_SPROM8_ANTAVAIL_A, + SSB_SPROM8_ANTAVAIL_A_SHIFT); + SPEX(ant_available_bg, SSB_SPROM8_ANTAVAIL, SSB_SPROM8_ANTAVAIL_BG, + SSB_SPROM8_ANTAVAIL_BG_SHIFT); + SPEX(maxpwr_bg, SSB_SPROM8_MAXP_BG, SSB_SPROM8_MAXP_BG_MASK, 0); + SPEX(itssi_bg, SSB_SPROM8_MAXP_BG, SSB_SPROM8_ITSSI_BG, + SSB_SPROM8_ITSSI_BG_SHIFT); + SPEX(maxpwr_a, SSB_SPROM8_MAXP_A, SSB_SPROM8_MAXP_A_MASK, 0); + SPEX(itssi_a, SSB_SPROM8_MAXP_A, SSB_SPROM8_ITSSI_A, + SSB_SPROM8_ITSSI_A_SHIFT); + SPEX(maxpwr_ah, SSB_SPROM8_MAXP_AHL, SSB_SPROM8_MAXP_AH_MASK, 0); + SPEX(maxpwr_al, SSB_SPROM8_MAXP_AHL, SSB_SPROM8_MAXP_AL_MASK, + SSB_SPROM8_MAXP_AL_SHIFT); + SPEX(gpio0, SSB_SPROM8_GPIOA, SSB_SPROM8_GPIOA_P0, 0); + SPEX(gpio1, SSB_SPROM8_GPIOA, SSB_SPROM8_GPIOA_P1, + SSB_SPROM8_GPIOA_P1_SHIFT); + SPEX(gpio2, SSB_SPROM8_GPIOB, SSB_SPROM8_GPIOB_P2, 0); + SPEX(gpio3, SSB_SPROM8_GPIOB, SSB_SPROM8_GPIOB_P3, + SSB_SPROM8_GPIOB_P3_SHIFT); + SPEX(tri2g, SSB_SPROM8_TRI25G, SSB_SPROM8_TRI2G, 0); + SPEX(tri5g, SSB_SPROM8_TRI25G, SSB_SPROM8_TRI5G, + SSB_SPROM8_TRI5G_SHIFT); + SPEX(tri5gl, SSB_SPROM8_TRI5GHL, SSB_SPROM8_TRI5GL, 0); + SPEX(tri5gh, SSB_SPROM8_TRI5GHL, SSB_SPROM8_TRI5GH, + SSB_SPROM8_TRI5GH_SHIFT); + SPEX(rxpo2g, SSB_SPROM8_RXPO, SSB_SPROM8_RXPO2G, + SSB_SPROM8_RXPO2G_SHIFT); + SPEX(rxpo5g, SSB_SPROM8_RXPO, SSB_SPROM8_RXPO5G, + SSB_SPROM8_RXPO5G_SHIFT); + SPEX(rssismf2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISMF2G, 0); + SPEX(rssismc2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISMC2G, + SSB_SPROM8_RSSISMC2G_SHIFT); + SPEX(rssisav2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISAV2G, + SSB_SPROM8_RSSISAV2G_SHIFT); + SPEX(bxa2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_BXA2G, + SSB_SPROM8_BXA2G_SHIFT); + SPEX(rssismf5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISMF5G, 0); + SPEX(rssismc5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISMC5G, + SSB_SPROM8_RSSISMC5G_SHIFT); + SPEX(rssisav5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISAV5G, + SSB_SPROM8_RSSISAV5G_SHIFT); + SPEX(bxa5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_BXA5G, + SSB_SPROM8_BXA5G_SHIFT); + + SPEX(pa0b0, SSB_SPROM8_PA0B0, ~0, 0); + SPEX(pa0b1, SSB_SPROM8_PA0B1, ~0, 0); + SPEX(pa0b2, SSB_SPROM8_PA0B2, ~0, 0); + SPEX(pa1b0, SSB_SPROM8_PA1B0, ~0, 0); + SPEX(pa1b1, SSB_SPROM8_PA1B1, ~0, 0); + SPEX(pa1b2, SSB_SPROM8_PA1B2, ~0, 0); + SPEX(pa1lob0, SSB_SPROM8_PA1LOB0, ~0, 0); + SPEX(pa1lob1, SSB_SPROM8_PA1LOB1, ~0, 0); + SPEX(pa1lob2, SSB_SPROM8_PA1LOB2, ~0, 0); + SPEX(pa1hib0, SSB_SPROM8_PA1HIB0, ~0, 0); + SPEX(pa1hib1, SSB_SPROM8_PA1HIB1, ~0, 0); + SPEX(pa1hib2, SSB_SPROM8_PA1HIB2, ~0, 0); + SPEX(cck2gpo, SSB_SPROM8_CCK2GPO, ~0, 0); + SPEX32(ofdm2gpo, SSB_SPROM8_OFDM2GPO, ~0, 0); + SPEX32(ofdm5glpo, SSB_SPROM8_OFDM5GLPO, ~0, 0); + SPEX32(ofdm5gpo, SSB_SPROM8_OFDM5GPO, ~0, 0); + SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, ~0, 0); + + /* Extract the antenna gain values. */ + out->antenna_gain.a0 = sprom_extract_antgain(in, + SSB_SPROM8_AGAIN01, + SSB_SPROM8_AGAIN0, + SSB_SPROM8_AGAIN0_SHIFT); + out->antenna_gain.a1 = sprom_extract_antgain(in, + SSB_SPROM8_AGAIN01, + SSB_SPROM8_AGAIN1, + SSB_SPROM8_AGAIN1_SHIFT); + out->antenna_gain.a2 = sprom_extract_antgain(in, + SSB_SPROM8_AGAIN23, + SSB_SPROM8_AGAIN2, + SSB_SPROM8_AGAIN2_SHIFT); + out->antenna_gain.a3 = sprom_extract_antgain(in, + SSB_SPROM8_AGAIN23, + SSB_SPROM8_AGAIN3, + SSB_SPROM8_AGAIN3_SHIFT); + + SPEX(leddc_on_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_ON, + SSB_SPROM8_LEDDC_ON_SHIFT); + SPEX(leddc_off_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_OFF, + SSB_SPROM8_LEDDC_OFF_SHIFT); + + SPEX(txchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_TXCHAIN, + SSB_SPROM8_TXRXC_TXCHAIN_SHIFT); + SPEX(rxchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_RXCHAIN, + SSB_SPROM8_TXRXC_RXCHAIN_SHIFT); + SPEX(antswitch, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_SWITCH, + SSB_SPROM8_TXRXC_SWITCH_SHIFT); + + SPEX(opo, SSB_SPROM8_OFDM2GPO, 0x00ff, 0); + + SPEX_ARRAY8(mcs2gpo, SSB_SPROM8_2G_MCSPO, ~0, 0); + SPEX_ARRAY8(mcs5gpo, SSB_SPROM8_5G_MCSPO, ~0, 0); + SPEX_ARRAY8(mcs5glpo, SSB_SPROM8_5GL_MCSPO, ~0, 0); + SPEX_ARRAY8(mcs5ghpo, SSB_SPROM8_5GH_MCSPO, ~0, 0); + + SPEX(rawtempsense, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_RAWTEMP, + SSB_SPROM8_RAWTS_RAWTEMP_SHIFT); + SPEX(measpower, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_MEASPOWER, + SSB_SPROM8_RAWTS_MEASPOWER_SHIFT); + SPEX(tempsense_slope, SSB_SPROM8_OPT_CORRX, + SSB_SPROM8_OPT_CORRX_TEMP_SLOPE, + SSB_SPROM8_OPT_CORRX_TEMP_SLOPE_SHIFT); + SPEX(tempcorrx, SSB_SPROM8_OPT_CORRX, SSB_SPROM8_OPT_CORRX_TEMPCORRX, + SSB_SPROM8_OPT_CORRX_TEMPCORRX_SHIFT); + SPEX(tempsense_option, SSB_SPROM8_OPT_CORRX, + SSB_SPROM8_OPT_CORRX_TEMP_OPTION, + SSB_SPROM8_OPT_CORRX_TEMP_OPTION_SHIFT); + SPEX(freqoffset_corr, SSB_SPROM8_HWIQ_IQSWP, + SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR, + SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR_SHIFT); + SPEX(iqcal_swp_dis, SSB_SPROM8_HWIQ_IQSWP, + SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP, + SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP_SHIFT); + SPEX(hw_iqcal_en, SSB_SPROM8_HWIQ_IQSWP, SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL, + SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL_SHIFT); + + SPEX(bw40po, SSB_SPROM8_BW40PO, ~0, 0); + SPEX(cddpo, SSB_SPROM8_CDDPO, ~0, 0); + SPEX(stbcpo, SSB_SPROM8_STBCPO, ~0, 0); + SPEX(bwduppo, SSB_SPROM8_BWDUPPO, ~0, 0); + + SPEX(tempthresh, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_TRESH, + SSB_SPROM8_THERMAL_TRESH_SHIFT); + SPEX(tempoffset, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_OFFSET, + SSB_SPROM8_THERMAL_OFFSET_SHIFT); + SPEX(phycal_tempdelta, SSB_SPROM8_TEMPDELTA, + SSB_SPROM8_TEMPDELTA_PHYCAL, + SSB_SPROM8_TEMPDELTA_PHYCAL_SHIFT); + SPEX(temps_period, SSB_SPROM8_TEMPDELTA, SSB_SPROM8_TEMPDELTA_PERIOD, + SSB_SPROM8_TEMPDELTA_PERIOD_SHIFT); + SPEX(temps_hysteresis, SSB_SPROM8_TEMPDELTA, + SSB_SPROM8_TEMPDELTA_HYSTERESIS, + SSB_SPROM8_TEMPDELTA_HYSTERESIS_SHIFT); +} + +static int sprom_extract(struct bcma_fbs *priv, const u16 *in, u16 size) +{ + struct ssb_sprom *out = &priv->sprom; + + memset(out, 0, sizeof(*out)); + + out->revision = in[size - 1] & 0x00FF; + if (out->revision < 8 || out->revision > 11) { + dev_warn(priv->dev, + "Unsupported SPROM revision %d detected." + " Will extract v8\n", + out->revision); + out->revision = 8; + } + + sprom_extract_r8(out, in); + + return 0; +} + +static void bcma_fbs_fixup(struct bcma_fbs *priv, u16 *sprom) +{ + struct device_node *node = priv->dev->of_node; + u32 fixups, off, val; + int i = 0; + + if (!of_get_property(node, "brcm,sprom-fixups", &fixups)) + return; + + fixups /= sizeof(u32); + + dev_info(priv->dev, "patching SPROM with %u fixups...\n", fixups >> 1); + + while (i < fixups) { + if (of_property_read_u32_index(node, "brcm,sprom-fixups", + i++, &off)) { + dev_err(priv->dev, "error reading fixup[%u] offset\n", + i - 1); + return; + } + + if (of_property_read_u32_index(node, "brcm,sprom-fixups", + i++, &val)) { + dev_err(priv->dev, "error reading fixup[%u] value\n", + i - 1); + return; + } + + dev_dbg(priv->dev, "fixup[%d]=0x%04x\n", off, val); + + sprom[off] = val; + } +} + +static bool sprom_override_devid(struct bcma_fbs *priv, struct ssb_sprom *out, + const u16 *in) +{ + SPEX(dev_id, 0x0060, 0xFFFF, 0); + return !!out->dev_id; +} + +static void bcma_fbs_set(struct bcma_fbs *priv, struct device_node *node) +{ + struct ssb_sprom *sprom = &priv->sprom; + const struct firmware *fw; + const char *sprom_name; + int err; + + if (of_property_read_string(node, "brcm,sprom", &sprom_name)) + sprom_name = NULL; + + if (sprom_name) { + err = request_firmware_direct(&fw, sprom_name, priv->dev); + if (err) + dev_err(priv->dev, "%s load error\n", sprom_name); + } else { + err = -ENOENT; + } + + if (err) { + sprom->revision = 0x02; + sprom->board_rev = 0x0017; + sprom->country_code = 0x00; + sprom->ant_available_bg = 0x03; + sprom->pa0b0 = 0x15ae; + sprom->pa0b1 = 0xfa85; + sprom->pa0b2 = 0xfe8d; + sprom->pa1b0 = 0xffff; + sprom->pa1b1 = 0xffff; + sprom->pa1b2 = 0xffff; + sprom->gpio0 = 0xff; + sprom->gpio1 = 0xff; + sprom->gpio2 = 0xff; + sprom->gpio3 = 0xff; + sprom->maxpwr_bg = 0x4c; + sprom->itssi_bg = 0x00; + sprom->boardflags_lo = 0x2848; + sprom->boardflags_hi = 0x0000; + priv->devid_override = false; + + dev_warn(priv->dev, "using basic SPROM\n"); + } else { + size_t size = min(fw->size, (size_t) BCMA_FBS_MAX_SIZE); + u16 tmp_sprom[BCMA_FBS_MAX_SIZE >> 1]; + u32 i, j; + + for (i = 0, j = 0; i < size; i += 2, j++) + tmp_sprom[j] = (fw->data[i] << 8) | fw->data[i + 1]; + + release_firmware(fw); + bcma_fbs_fixup(priv, tmp_sprom); + sprom_extract(priv, tmp_sprom, size >> 1); + + priv->devid_override = sprom_override_devid(priv, sprom, + tmp_sprom); + } +} + +static int bcma_fbs_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *node = dev->of_node; + struct bcma_fbs *priv; + unsigned long flags; + u8 mac[ETH_ALEN]; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev = dev; + + bcma_fbs_set(priv, node); + + of_property_read_u32(node, "pci-bus", &priv->pci_bus); + of_property_read_u32(node, "pci-dev", &priv->pci_dev); + + of_get_mac_address(node, mac); + if (is_valid_ether_addr(mac)) { + dev_info(dev, "mtd mac %pM\n", mac); + } else { + random_ether_addr(mac); + dev_info(dev, "random mac %pM\n", mac); + } + + memcpy(priv->sprom.il0mac, mac, ETH_ALEN); + memcpy(priv->sprom.et0mac, mac, ETH_ALEN); + memcpy(priv->sprom.et1mac, mac, ETH_ALEN); + memcpy(priv->sprom.et2mac, mac, ETH_ALEN); + + spin_lock_irqsave(&bcma_fbs_lock, flags); + list_add(&priv->list, &bcma_fbs_list); + spin_unlock_irqrestore(&bcma_fbs_lock, flags); + + dev_info(dev, "registered SPROM for [%x:%x]\n", + priv->pci_bus, priv->pci_dev); + + return 0; +} + +static const struct of_device_id bcma_fbs_of_match[] = { + { .compatible = "brcm,bcma-sprom", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, bcma_fbs_of_match); + +static struct platform_driver bcma_fbs_driver = { + .probe = bcma_fbs_probe, + .driver = { + .name = "bcma-sprom", + .of_match_table = bcma_fbs_of_match, + }, +}; + +int __init bcma_fbs_register(void) +{ + return platform_driver_register(&bcma_fbs_driver); +} diff --git a/target/linux/generic/files/drivers/leds/leds-ubnt-ledbar.c b/target/linux/generic/files/drivers/leds/leds-ubnt-ledbar.c deleted file mode 100644 index 555340c5e8..0000000000 --- a/target/linux/generic/files/drivers/leds/leds-ubnt-ledbar.c +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/** - * Driver for the Ubiquiti RGB LED controller (LEDBAR). - * This Controller is based on a Holtek HT32F52241 and connected - * via I2C. - * - * - The Controller needs an enable signal set to high when - * performing a transaction. On the U6-LR, this is located - * at Pin 18 (R6902) - * - * - The Pin is also printed when calling the "usetled" function - * contained in the ubntapp bootloader application. - */ - -#define UBNT_LEDBAR_MAX_BRIGHTNESS 0xff - -#define UBNT_LEDBAR_TRANSACTION_LENGTH 8 -#define UBNT_LEDBAR_TRANSACTION_SUCCESS (char) 0xaa - -#define UBNT_LEDBAR_TRANSACTION_BLUE_IDX 2 -#define UBNT_LEDBAR_TRANSACTION_GREEN_IDX 3 -#define UBNT_LEDBAR_TRANSACTION_RED_IDX 4 -#define UBNT_LEDBAR_TRANSACTION_LED_COUNT_IDX 6 - -struct ubnt_ledbar { - struct mutex lock; - u32 led_count; - struct i2c_client *client; - struct led_classdev led_red; - struct led_classdev led_green; - struct led_classdev led_blue; - struct gpio_desc *enable_gpio; - struct gpio_desc *reset_gpio; -}; - -static void ubnt_ledbar_perform_transaction(struct ubnt_ledbar *ledbar, - const char *transaction, int len, - char *result, int result_len) -{ - int i; - - for (i = 0; i < len; i++) - i2c_smbus_write_byte(ledbar->client, transaction[i]); - - for (i = 0; i < result_len; i++) - result[i] = i2c_smbus_read_byte(ledbar->client); -} - -static int ubnt_ledbar_apply_state(struct ubnt_ledbar *ledbar) -{ - char setup_msg[UBNT_LEDBAR_TRANSACTION_LENGTH] = {0x40, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x11}; - char led_msg[UBNT_LEDBAR_TRANSACTION_LENGTH] = {0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; - char i2c_response; - int ret = 0; - - mutex_lock(&ledbar->lock); - - led_msg[UBNT_LEDBAR_TRANSACTION_BLUE_IDX] = ledbar->led_blue.brightness; - led_msg[UBNT_LEDBAR_TRANSACTION_GREEN_IDX] = ledbar->led_green.brightness; - led_msg[UBNT_LEDBAR_TRANSACTION_RED_IDX] = ledbar->led_red.brightness; - led_msg[UBNT_LEDBAR_TRANSACTION_LED_COUNT_IDX] = ledbar->led_count; - - gpiod_set_value(ledbar->enable_gpio, 1); - - msleep(10); - - ubnt_ledbar_perform_transaction(ledbar, setup_msg, sizeof(setup_msg), &i2c_response, sizeof(i2c_response)); - if (i2c_response != UBNT_LEDBAR_TRANSACTION_SUCCESS) { - dev_err(&ledbar->client->dev, "Error initializing LED transaction: %02hhx\n", i2c_response); - ret = -EINVAL; - goto out_gpio; - } - - ubnt_ledbar_perform_transaction(ledbar, led_msg, sizeof(led_msg), &i2c_response, sizeof(i2c_response)); - if (i2c_response != UBNT_LEDBAR_TRANSACTION_SUCCESS) { - dev_err(&ledbar->client->dev, "Failed LED transaction: %02hhx\n", i2c_response); - ret = -EINVAL; - goto out_gpio; - } - - msleep(10); -out_gpio: - gpiod_set_value(ledbar->enable_gpio, 0); - - mutex_unlock(&ledbar->lock); - - return ret; -} - -static void ubnt_ledbar_reset(struct ubnt_ledbar *ledbar) -{ - static const char init_msg[16] = {0x02, 0x81, 0xfd, 0x7e, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; - char init_response[4]; - - if (!ledbar->reset_gpio) - return; - - mutex_lock(&ledbar->lock); - - gpiod_set_value(ledbar->reset_gpio, 1); - msleep(10); - gpiod_set_value(ledbar->reset_gpio, 0); - - msleep(10); - - gpiod_set_value(ledbar->enable_gpio, 1); - msleep(10); - ubnt_ledbar_perform_transaction(ledbar, init_msg, sizeof(init_msg), init_response, sizeof(init_response)); - msleep(10); - gpiod_set_value(ledbar->enable_gpio, 0); - - mutex_unlock(&ledbar->lock); -} - -#define UBNT_LEDBAR_CONTROL_RGBS(name) \ -static int ubnt_ledbar_set_##name##_brightness(struct led_classdev *led_cdev,\ - enum led_brightness value) \ -{ \ - struct ubnt_ledbar *ledbar = \ - container_of(led_cdev, struct ubnt_ledbar, led_##name); \ - int ret; \ - led_cdev->brightness = value; \ - ret = ubnt_ledbar_apply_state(ledbar); \ - return ret; \ -} - -UBNT_LEDBAR_CONTROL_RGBS(red); -UBNT_LEDBAR_CONTROL_RGBS(green); -UBNT_LEDBAR_CONTROL_RGBS(blue); - - -static int ubnt_ledbar_init_led(struct device_node *np, struct ubnt_ledbar *ledbar, - struct led_classdev *led_cdev) -{ - struct led_init_data init_data = {}; - int ret; - - if (!np) - return 0; - - init_data.fwnode = of_fwnode_handle(np); - - led_cdev->max_brightness = UBNT_LEDBAR_MAX_BRIGHTNESS; - - ret = devm_led_classdev_register_ext(&ledbar->client->dev, led_cdev, - &init_data); - if (ret) - dev_err(&ledbar->client->dev, "led register err: %d\n", ret); - - return ret; -} - - -static int ubnt_ledbar_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct device_node *np = client->dev.of_node; - struct ubnt_ledbar *ledbar; - int ret; - - ledbar = devm_kzalloc(&client->dev, sizeof(*ledbar), GFP_KERNEL); - if (!ledbar) - return -ENOMEM; - - ledbar->enable_gpio = devm_gpiod_get(&client->dev, "enable", GPIOD_OUT_LOW); - - if (IS_ERR(ledbar->enable_gpio)) { - ret = PTR_ERR(ledbar->enable_gpio); - dev_err(&client->dev, "Failed to get enable gpio: %d\n", ret); - return ret; - } - - ledbar->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", GPIOD_OUT_LOW); - - if (IS_ERR(ledbar->reset_gpio)) { - ret = PTR_ERR(ledbar->reset_gpio); - dev_err(&client->dev, "Failed to get reset gpio: %d\n", ret); - return ret; - } - - ledbar->led_count = 1; - of_property_read_u32(np, "led-count", &ledbar->led_count); - - ledbar->client = client; - - mutex_init(&ledbar->lock); - - i2c_set_clientdata(client, ledbar); - - // Reset and initialize the MCU - ubnt_ledbar_reset(ledbar); - - ledbar->led_red.brightness_set_blocking = ubnt_ledbar_set_red_brightness; - ubnt_ledbar_init_led(of_get_child_by_name(np, "red"), ledbar, &ledbar->led_red); - - ledbar->led_green.brightness_set_blocking = ubnt_ledbar_set_green_brightness; - ubnt_ledbar_init_led(of_get_child_by_name(np, "green"), ledbar, &ledbar->led_green); - - ledbar->led_blue.brightness_set_blocking = ubnt_ledbar_set_blue_brightness; - ubnt_ledbar_init_led(of_get_child_by_name(np, "blue"), ledbar, &ledbar->led_blue); - - return ubnt_ledbar_apply_state(ledbar); -} - -static int ubnt_ledbar_remove(struct i2c_client *client) -{ - struct ubnt_ledbar *ledbar = i2c_get_clientdata(client); - - mutex_destroy(&ledbar->lock); - - return 0; -} - -static const struct i2c_device_id ubnt_ledbar_id[] = { - { "ubnt-ledbar", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, ubnt_ledbar_id); - -static const struct of_device_id of_ubnt_ledbar_match[] = { - { .compatible = "ubnt,ledbar", }, - {}, -}; -MODULE_DEVICE_TABLE(of, of_ubnt_ledbar_match); - -static struct i2c_driver ubnt_ledbar_driver = { - .driver = { - .name = "ubnt-ledbar", - .of_match_table = of_ubnt_ledbar_match, - }, - .probe = ubnt_ledbar_probe, - .remove = ubnt_ledbar_remove, - .id_table = ubnt_ledbar_id, -}; -module_i2c_driver(ubnt_ledbar_driver); - -MODULE_DESCRIPTION("Ubiquiti LEDBAR driver"); -MODULE_AUTHOR("David Bauer "); -MODULE_LICENSE("GPL v2"); diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/Kconfig b/target/linux/generic/files/drivers/mtd/mtdsplit/Kconfig index 794a39f2c3..f1864d8fdb 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/Kconfig +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/Kconfig @@ -12,7 +12,6 @@ config MTD_SPLIT_SQUASHFS_ROOT bool "Squashfs based root partition parser" depends on MTD_SPLIT_SUPPORT select MTD_SPLIT - default n help This provides a parsing function which allows to detect the offset and size of the unused portion of a rootfs partition @@ -101,3 +100,8 @@ config MTD_SPLIT_ELF_FW bool "ELF loader firmware partition parser" depends on MTD_SPLIT_SUPPORT select MTD_SPLIT + +config MTD_SPLIT_H3C_VFS + bool "Parser finding rootfs appended to H3C VFS" + depends on MTD_SPLIT_SUPPORT + select MTD_SPLIT diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/Makefile b/target/linux/generic/files/drivers/mtd/mtdsplit/Makefile index 1461099b7c..a969c336aa 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/Makefile +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/Makefile @@ -15,3 +15,4 @@ obj-$(CONFIG_MTD_SPLIT_WRGG_FW) += mtdsplit_wrgg.o obj-$(CONFIG_MTD_SPLIT_MINOR_FW) += mtdsplit_minor.o obj-$(CONFIG_MTD_SPLIT_JIMAGE_FW) += mtdsplit_jimage.o obj-$(CONFIG_MTD_SPLIT_ELF_FW) += mtdsplit_elf.o +obj-$(CONFIG_MTD_SPLIT_H3C_VFS) += mtdsplit_h3c_vfs.o diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_bcm_wfi.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_bcm_wfi.c index 6f85778e38..8780d650d9 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_bcm_wfi.c +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_bcm_wfi.c @@ -31,6 +31,7 @@ #define CFERAM_NAME "cferam" #define CFERAM_NAME_LEN (sizeof(CFERAM_NAME) - 1) +#define CFERAM_NAME_MAX_LEN 32 #define KERNEL_NAME "vmlinux.lz" #define KERNEL_NAME_LEN (sizeof(KERNEL_NAME) - 1) #define LIBRECMC_NAME "1-librecmc" @@ -157,17 +158,28 @@ static int parse_bcm_wfi(struct mtd_info *master, const struct mtd_partition **pparts, uint8_t *buf, loff_t off, loff_t size, bool cfe_part) { + struct device_node *mtd_node; struct mtd_partition *parts; loff_t cfe_off, kernel_off, rootfs_off; unsigned int num_parts = BCM_WFI_PARTS, cur_part = 0; + const char *cferam_name = CFERAM_NAME; + size_t cferam_name_len; int ret; + mtd_node = mtd_get_of_node(master); + if (mtd_node) + of_property_read_string(mtd_node, "brcm,cferam", &cferam_name); + + cferam_name_len = strnlen(cferam_name, CFERAM_NAME_MAX_LEN); + if (cferam_name_len > 0) + cferam_name_len--; + if (cfe_part) { num_parts++; cfe_off = off; - ret = jffs2_find_file(master, buf, CFERAM_NAME, - CFERAM_NAME_LEN, &cfe_off, + ret = jffs2_find_file(master, buf, cferam_name, + cferam_name_len, &cfe_off, size - (cfe_off - off), NULL, NULL); if (ret) return ret; diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_fit.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_fit.c index f3d49bb888..6d8e706326 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_fit.c +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_fit.c @@ -199,6 +199,7 @@ mtdsplit_fit_parse(struct mtd_info *mtd, struct fdt_header hdr; size_t hdr_len, retlen; size_t offset; + u32 offset_start = 0; size_t fit_offset, fit_size; size_t rootfs_offset, rootfs_size; size_t data_size, img_total, max_size = 0; @@ -211,11 +212,13 @@ mtdsplit_fit_parse(struct mtd_info *mtd, if (cmdline_match && !strstr(saved_command_line, cmdline_match)) return -ENODEV; + of_property_read_u32(np, "librecmc,fit-offset", &offset_start); + hdr_len = sizeof(struct fdt_header); /* Parse the MTD device & search for the FIT image location */ for(offset = 0; offset + hdr_len <= mtd->size; offset += mtd->erasesize) { - ret = mtd_read(mtd, offset, hdr_len, &retlen, (void*) &hdr); + ret = mtd_read(mtd, offset + offset_start, hdr_len, &retlen, (void*) &hdr); if (ret) { pr_err("read error in \"%s\" at offset 0x%llx\n", mtd->name, (unsigned long long) offset); @@ -259,7 +262,7 @@ mtdsplit_fit_parse(struct mtd_info *mtd, enum mtdsplit_part_type type; /* Search for the rootfs partition after the FIT image */ - ret = mtd_find_rootfs_from(mtd, fit_offset + fit_size, mtd->size, + ret = mtd_find_rootfs_from(mtd, fit_offset + fit_size + offset_start, mtd->size, &rootfs_offset, &type); if (ret) { pr_info("no rootfs found after FIT image in \"%s\"\n", @@ -275,7 +278,7 @@ mtdsplit_fit_parse(struct mtd_info *mtd, parts[0].name = KERNEL_PART_NAME; parts[0].offset = fit_offset; - parts[0].size = mtd_rounddown_to_eb(fit_size, mtd) + mtd->erasesize; + parts[0].size = mtd_rounddown_to_eb(fit_size + offset_start, mtd) + mtd->erasesize; if (type == MTDSPLIT_PART_TYPE_UBI) parts[1].name = UBI_PART_NAME; @@ -290,7 +293,7 @@ mtdsplit_fit_parse(struct mtd_info *mtd, } else { /* Search for rootfs_data after FIT external data */ fit = kzalloc(fit_size, GFP_KERNEL); - ret = mtd_read(mtd, offset, fit_size, &retlen, fit); + ret = mtd_read(mtd, offset, fit_size + offset_start, &retlen, fit); if (ret) { pr_err("read error in \"%s\" at offset 0x%llx\n", mtd->name, (unsigned long long) offset); diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_h3c_vfs.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_h3c_vfs.c new file mode 100644 index 0000000000..5573e1368f --- /dev/null +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_h3c_vfs.c @@ -0,0 +1,170 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Some devices made by H3C use a "VFS" filesystem to store firmware images. + * This parses the start of the filesystem to read the length of the first + * file (the kernel image). It then searches for the rootfs after the end of + * the file data. This driver assumes that the filesystem was generated by + * mkh3cvfs, and only works if the filesystem matches the expected layout, + * which includes the file name of the kernel image. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "mtdsplit.h" + +#define VFS_ERASEBLOCK_SIZE 0x10000 +#define VFS_BLOCK_SIZE 0x400 +#define VFS_BLOCKS_PER_ERASEBLOCK (VFS_ERASEBLOCK_SIZE / VFS_BLOCK_SIZE) + +#define FORMAT_FLAG_OFFSET 0x0 + +#define FORMAT_FLAG (VFS_ERASEBLOCK_SIZE << 12 | VFS_BLOCK_SIZE) + +#define FILE_ENTRY_OFFSET 0x800 + +#define FILE_ENTRY_FLAGS 0x3f +#define FILE_ENTRY_PARENT_BLOCK 0 +#define FILE_ENTRY_PARENT_INDEX 0 +#define FILE_ENTRY_DATA_BLOCK 2 +#define FILE_ENTRY_NAME "librecmc-kernel.bin" + +#define NR_PARTS 2 + +struct file_entry { + uint8_t flags; + + uint8_t res0[5]; + + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t minute; + uint8_t second; + + uint8_t res1[3]; + + uint32_t length; + + uint32_t parent_block; + uint16_t parent_index; + + uint8_t res2[2]; + + uint32_t data_block; + + char name[96]; +} __attribute__ ((packed)); + +static inline size_t block_offset(int block) +{ + return VFS_ERASEBLOCK_SIZE * (block / (VFS_BLOCKS_PER_ERASEBLOCK-1)) + + VFS_BLOCK_SIZE * (1 + (block % (VFS_BLOCKS_PER_ERASEBLOCK-1))); +} + +static inline int block_count(size_t size) +{ + return (size + VFS_BLOCK_SIZE - 1) / VFS_BLOCK_SIZE; +} + +static int mtdsplit_h3c_vfs_parse(struct mtd_info *mtd, + const struct mtd_partition **pparts, + struct mtd_part_parser_data *data) +{ + struct mtd_partition *parts; + uint32_t format_flag; + struct file_entry file_entry; + size_t retlen; + int err; + size_t kernel_size; + size_t expected_offset; + size_t rootfs_offset; + + if (mtd->erasesize != VFS_ERASEBLOCK_SIZE) + return -EINVAL; + + /* Check format flag */ + err = mtd_read(mtd, FORMAT_FLAG_OFFSET, sizeof(format_flag), &retlen, + (void *) &format_flag); + if (err) + return err; + + if (retlen != sizeof(format_flag)) + return -EIO; + + if (format_flag != FORMAT_FLAG) + return -EINVAL; + + /* Check file entry */ + err = mtd_read(mtd, FILE_ENTRY_OFFSET, sizeof(file_entry), &retlen, + (void *) &file_entry); + if (err) + return err; + + if (retlen != sizeof(file_entry)) + return -EIO; + + if (file_entry.flags != FILE_ENTRY_FLAGS) + return -EINVAL; + + if (file_entry.parent_block != FILE_ENTRY_PARENT_BLOCK) + return -EINVAL; + + if (file_entry.parent_index != FILE_ENTRY_PARENT_INDEX) + return -EINVAL; + + if (file_entry.data_block != FILE_ENTRY_DATA_BLOCK) + return -EINVAL; + + if (strncmp(file_entry.name, FILE_ENTRY_NAME, sizeof(file_entry.name)) != 0) + return -EINVAL; + + /* Find rootfs offset */ + kernel_size = block_offset(file_entry.data_block + + block_count(file_entry.length) - 1) + + VFS_BLOCK_SIZE; + + expected_offset = mtd_roundup_to_eb(kernel_size, mtd); + + err = mtd_find_rootfs_from(mtd, expected_offset, mtd->size, + &rootfs_offset, NULL); + if (err) + return err; + + parts = kzalloc(NR_PARTS * sizeof(*parts), GFP_KERNEL); + if (!parts) + return -ENOMEM; + + parts[0].name = KERNEL_PART_NAME; + parts[0].offset = 0; + parts[0].size = rootfs_offset; + + parts[1].name = ROOTFS_PART_NAME; + parts[1].offset = rootfs_offset; + parts[1].size = mtd->size - rootfs_offset; + + *pparts = parts; + return NR_PARTS; +} + +static const struct of_device_id mtdsplit_h3c_vfs_of_match_table[] = { + { .compatible = "h3c,vfs-firmware" }, + {}, +}; +MODULE_DEVICE_TABLE(of, mtdsplit_h3c_vfs_of_match_table); + +static struct mtd_part_parser mtdsplit_h3c_vfs_parser = { + .owner = THIS_MODULE, + .name = "h3c-vfs", + .of_match_table = mtdsplit_h3c_vfs_of_match_table, + .parse_fn = mtdsplit_h3c_vfs_parse, + .type = MTD_PARSER_TYPE_FIRMWARE, +}; + +module_mtd_part_parser(mtdsplit_h3c_vfs_parser); diff --git a/target/linux/generic/files/drivers/mtd/nand/mtk_bmt.h b/target/linux/generic/files/drivers/mtd/nand/mtk_bmt.h index dff1f28c81..517ff7414f 100644 --- a/target/linux/generic/files/drivers/mtd/nand/mtk_bmt.h +++ b/target/linux/generic/files/drivers/mtd/nand/mtk_bmt.h @@ -95,8 +95,14 @@ bbt_nand_read(u32 page, unsigned char *dat, int dat_len, .datbuf = dat, .len = dat_len, }; - - return bmtd._read_oob(bmtd.mtd, page << bmtd.pg_shift, &ops); + int ret; + + ret = bmtd._read_oob(bmtd.mtd, page << bmtd.pg_shift, &ops); + if (ret < 0) + return ret; + if (ret) + pr_info("%s: %d bitflips\n", __func__, ret); + return 0; } static inline int bbt_nand_erase(u16 block) diff --git a/target/linux/generic/files/drivers/mtd/nand/mtk_bmt_v2.c b/target/linux/generic/files/drivers/mtd/nand/mtk_bmt_v2.c index 2770376e98..6b06948c0f 100644 --- a/target/linux/generic/files/drivers/mtd/nand/mtk_bmt_v2.c +++ b/target/linux/generic/files/drivers/mtd/nand/mtk_bmt_v2.c @@ -191,36 +191,6 @@ static u16 get_bmt_index(struct bbmt *bmt) return 0; } -static int -read_bmt(u16 block, unsigned char *dat, unsigned char *fdm, int fdm_len) -{ - u32 len = bmtd.bmt_pgs << bmtd.pg_shift; - - return bbt_nand_read(blk_pg(block), dat, len, fdm, fdm_len); -} - -static struct bbbt *scan_bmt(u16 block) -{ - u8 fdm[4]; - - if (block < bmtd.pool_lba) - return NULL; - - if (read_bmt(block, bmtd.bbt_buf, fdm, sizeof(fdm))) - return scan_bmt(block - 1); - - if (is_valid_bmt(bmtd.bbt_buf, fdm)) { - bmtd.bmt_blk_idx = get_bmt_index(bmt_tbl((struct bbbt *)bmtd.bbt_buf)); - if (bmtd.bmt_blk_idx == 0) { - pr_info("[BBT] FATAL ERR: bmt block index is wrong!\n"); - return NULL; - } - pr_info("[BBT] BMT.v2 is found at 0x%x\n", block); - return (struct bbbt *)bmtd.bbt_buf; - } else - return scan_bmt(block - 1); -} - /* Write the Burner Bad Block Table to Nand Flash * n - write BMT to bmt_tbl[n] */ @@ -472,7 +442,30 @@ static int mtk_bmt_init_v2(struct device_node *np) /* Scanning start from the first page of the last block * of whole flash */ - bmtd.bbt = scan_bmt(bmtd.total_blks - 1); + bmtd.bbt = NULL; + for (u16 block = bmtd.total_blks - 1; !bmtd.bbt && block >= bmtd.pool_lba; block--) { + u8 fdm[4]; + + if (bbt_nand_read(blk_pg(block), bmtd.bbt_buf, bufsz, fdm, sizeof(fdm))) { + /* Read failed, try the previous block */ + continue; + } + + if (!is_valid_bmt(bmtd.bbt_buf, fdm)) { + /* No valid BMT found, try the previous block */ + continue; + } + + bmtd.bmt_blk_idx = get_bmt_index(bmt_tbl((struct bbbt *)bmtd.bbt_buf)); + if (bmtd.bmt_blk_idx == 0) { + pr_info("[BBT] FATAL ERR: bmt block index is wrong!\n"); + break; + } + + pr_info("[BBT] BMT.v2 is found at 0x%x\n", block); + bmtd.bbt = (struct bbbt *)bmtd.bbt_buf; + } + if (!bmtd.bbt) { /* BMT not found */ if (bmtd.total_blks > BB_TABLE_MAX + BMT_TABLE_MAX) { diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 11cb18e4f3..5e248f856e 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -891,11 +891,7 @@ ar8216_phy_write(struct ar8xxx_priv *priv, int addr, int regnum, u16 val) static int ar8229_hw_init(struct ar8xxx_priv *priv) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 5, 0) phy_interface_t phy_if_mode; -#else - int phy_if_mode; -#endif if (priv->initialized) return 0; @@ -903,11 +899,7 @@ ar8229_hw_init(struct ar8xxx_priv *priv) ar8xxx_write(priv, AR8216_REG_CTRL, AR8216_CTRL_RESET); ar8xxx_reg_wait(priv, AR8216_REG_CTRL, AR8216_CTRL_RESET, 0, 1000); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 5, 0) of_get_phy_mode(priv->pdev->of_node, &phy_if_mode); -#else - phy_if_mode = of_get_phy_mode(priv->pdev->of_node); -#endif if (phy_if_mode == PHY_INTERFACE_MODE_GMII) { ar8xxx_write(priv, AR8229_REG_OPER_MODE0, @@ -2433,7 +2425,9 @@ static int ar8xxx_phy_config_init(struct phy_device *phydev) { struct ar8xxx_priv *priv = phydev->priv; +#ifdef CONFIG_ETHERNET_PACKET_MANGLE struct net_device *dev = phydev->attached_dev; +#endif int ret; if (WARN_ON(!priv)) @@ -2465,7 +2459,7 @@ ar8xxx_phy_config_init(struct phy_device *phydev) /* VID fixup only needed on ar8216 */ if (chip_is_ar8216(priv)) { dev->phy_ptr = priv; - dev->priv_flags |= IFF_NO_IP_ALIGN; + dev->extra_priv_flags |= IFF_NO_IP_ALIGN; dev->eth_mangle_rx = ar8216_mangle_rx; dev->eth_mangle_tx = ar8216_mangle_tx; } @@ -2700,7 +2694,7 @@ ar8xxx_phy_detach(struct phy_device *phydev) #ifdef CONFIG_ETHERNET_PACKET_MANGLE dev->phy_ptr = NULL; - dev->priv_flags &= ~IFF_NO_IP_ALIGN; + dev->extra_priv_flags &= ~IFF_NO_IP_ALIGN; dev->eth_mangle_rx = NULL; dev->eth_mangle_tx = NULL; #endif diff --git a/target/linux/generic/files/drivers/net/phy/ar8327.c b/target/linux/generic/files/drivers/net/phy/ar8327.c index dce52ce0e4..3313149559 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8327.c +++ b/target/linux/generic/files/drivers/net/phy/ar8327.c @@ -183,7 +183,7 @@ ar8327_phy_fixup(struct ar8xxx_priv *priv, int phy) case 2: ar8xxx_phy_mmd_write(priv, phy, 0x7, 0x3c, 0x0); - /* fallthrough */ + fallthrough; case 4: ar8xxx_phy_mmd_write(priv, phy, 0x3, 0x800d, 0x803f); ar8xxx_phy_dbg_write(priv, phy, 0x3d, 0x6860); diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_common.c b/target/linux/generic/files/drivers/net/phy/b53/b53_common.c index 030c5c86d6..d5f9bfc2f0 100644 --- a/target/linux/generic/files/drivers/net/phy/b53/b53_common.c +++ b/target/linux/generic/files/drivers/net/phy/b53/b53_common.c @@ -506,15 +506,9 @@ static int b53_configure_ports_of(struct b53_device *dev) if (fixed_link) { u32 spd; u8 po = GMII_PO_LINK; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 5, 0) phy_interface_t mode; -#else - int mode = of_get_phy_mode(pn); -#endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 5, 0) of_get_phy_mode(pn, &mode); -#endif if (!of_property_read_u32(fixed_link, "speed", &spd)) { switch (spd) { @@ -529,7 +523,7 @@ static int b53_configure_ports_of(struct b53_device *dev) po |= PORT_OVERRIDE_SPEED_2000M; else po |= GMII_PO_SPEED_2000M; - /* fall through */ + fallthrough; case 1000: po |= GMII_PO_SPEED_1000M; break; @@ -1617,8 +1611,8 @@ static int b53_switch_init(struct b53_device *dev) return b53_switch_reset(dev); } -struct b53_device *b53_switch_alloc(struct device *base, struct b53_io_ops *ops, - void *priv) +struct b53_device *b53_swconfig_switch_alloc(struct device *base, struct b53_io_ops *ops, + void *priv) { struct b53_device *dev; @@ -1633,9 +1627,9 @@ struct b53_device *b53_switch_alloc(struct device *base, struct b53_io_ops *ops, return dev; } -EXPORT_SYMBOL(b53_switch_alloc); +EXPORT_SYMBOL(b53_swconfig_switch_alloc); -int b53_switch_detect(struct b53_device *dev) +int b53_swconfig_switch_detect(struct b53_device *dev) { u32 id32; u16 tmp; @@ -1700,9 +1694,9 @@ int b53_switch_detect(struct b53_device *dev) return b53_read8(dev, B53_MGMT_PAGE, B53_REV_ID, &dev->core_rev); } -EXPORT_SYMBOL(b53_switch_detect); +EXPORT_SYMBOL(b53_swconfig_switch_detect); -int b53_switch_register(struct b53_device *dev) +int b53_swconfig_switch_register(struct b53_device *dev) { int ret; @@ -1712,7 +1706,7 @@ int b53_switch_register(struct b53_device *dev) dev->sw_dev.alias = dev->pdata->alias; } - if (!dev->chip_id && b53_switch_detect(dev)) + if (!dev->chip_id && b53_swconfig_switch_detect(dev)) return -EINVAL; ret = b53_switch_init(dev); @@ -1723,7 +1717,7 @@ int b53_switch_register(struct b53_device *dev) return register_switch(&dev->sw_dev, NULL); } -EXPORT_SYMBOL(b53_switch_register); +EXPORT_SYMBOL(b53_swconfig_switch_register); MODULE_AUTHOR("Jonas Gorski "); MODULE_DESCRIPTION("B53 switch library"); diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c b/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c index 6ec23a49a3..c85df1f305 100644 --- a/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c +++ b/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c @@ -280,7 +280,7 @@ static int b53_phy_probe(struct phy_device *phydev) if (phydev->mdio.addr != B53_PSEUDO_PHY && phydev->mdio.addr != 0) return -ENODEV; - dev = b53_switch_alloc(&phydev->mdio.dev, &b53_mdio_ops, phydev->mdio.bus); + dev = b53_swconfig_switch_alloc(&phydev->mdio.dev, &b53_mdio_ops, phydev->mdio.bus); if (!dev) return -ENOMEM; @@ -290,7 +290,7 @@ static int b53_phy_probe(struct phy_device *phydev) dev->pdata = NULL; mutex_init(&dev->reg_mutex); - ret = b53_switch_detect(dev); + ret = b53_swconfig_switch_detect(dev); if (ret) return ret; @@ -302,7 +302,7 @@ static int b53_phy_probe(struct phy_device *phydev) linkmode_copy(phydev->advertising, phydev->supported); - ret = b53_switch_register(dev); + ret = b53_swconfig_switch_register(dev); if (ret) { dev_err(dev->dev, "failed to register switch: %i\n", ret); return ret; diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_mmap.c b/target/linux/generic/files/drivers/net/phy/b53/b53_mmap.c index ab1895e9b5..0a21ff1de5 100644 --- a/target/linux/generic/files/drivers/net/phy/b53/b53_mmap.c +++ b/target/linux/generic/files/drivers/net/phy/b53/b53_mmap.c @@ -205,7 +205,7 @@ static int b53_mmap_probe(struct platform_device *pdev) if (!pdata) return -EINVAL; - dev = b53_switch_alloc(&pdev->dev, &b53_mmap_ops, pdata->regs); + dev = b53_swconfig_switch_alloc(&pdev->dev, &b53_mmap_ops, pdata->regs); if (!dev) return -ENOMEM; @@ -214,7 +214,7 @@ static int b53_mmap_probe(struct platform_device *pdev) platform_set_drvdata(pdev, dev); - return b53_switch_register(dev); + return b53_swconfig_switch_register(dev); } static int b53_mmap_remove(struct platform_device *pdev) diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h b/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h index 37c17aeb25..e455c755bf 100644 --- a/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h +++ b/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h @@ -183,12 +183,12 @@ static inline struct b53_device *sw_to_b53(struct switch_dev *sw) return container_of(sw, struct b53_device, sw_dev); } -struct b53_device *b53_switch_alloc(struct device *base, struct b53_io_ops *ops, - void *priv); +struct b53_device *b53_swconfig_switch_alloc(struct device *base, struct b53_io_ops *ops, + void *priv); -int b53_switch_detect(struct b53_device *dev); +int b53_swconfig_switch_detect(struct b53_device *dev); -int b53_switch_register(struct b53_device *dev); +int b53_swconfig_switch_register(struct b53_device *dev); static inline void b53_switch_remove(struct b53_device *dev) { diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_spi.c b/target/linux/generic/files/drivers/net/phy/b53/b53_spi.c index efc8f7ee89..400454df18 100644 --- a/target/linux/generic/files/drivers/net/phy/b53/b53_spi.c +++ b/target/linux/generic/files/drivers/net/phy/b53/b53_spi.c @@ -288,14 +288,14 @@ static int b53_spi_probe(struct spi_device *spi) struct b53_device *dev; int ret; - dev = b53_switch_alloc(&spi->dev, &b53_spi_ops, spi); + dev = b53_swconfig_switch_alloc(&spi->dev, &b53_spi_ops, spi); if (!dev) return -ENOMEM; if (spi->dev.platform_data) dev->pdata = spi->dev.platform_data; - ret = b53_switch_register(dev); + ret = b53_swconfig_switch_register(dev); if (ret) return ret; diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_srab.c b/target/linux/generic/files/drivers/net/phy/b53/b53_srab.c index 012daa3a51..ead5209cf0 100644 --- a/target/linux/generic/files/drivers/net/phy/b53/b53_srab.c +++ b/target/linux/generic/files/drivers/net/phy/b53/b53_srab.c @@ -342,7 +342,7 @@ static int b53_srab_probe(struct platform_device *pdev) if (!pdata) return -EINVAL; - dev = b53_switch_alloc(&pdev->dev, &b53_srab_ops, pdata->regs); + dev = b53_swconfig_switch_alloc(&pdev->dev, &b53_srab_ops, pdata->regs); if (!dev) return -ENOMEM; @@ -351,7 +351,7 @@ static int b53_srab_probe(struct platform_device *pdev) platform_set_drvdata(pdev, dev); - return b53_switch_register(dev); + return b53_swconfig_switch_register(dev); } static int b53_srab_remove(struct platform_device *pdev) diff --git a/target/linux/generic/files/drivers/net/phy/psb6970.c b/target/linux/generic/files/drivers/net/phy/psb6970.c index fb6ed0e204..2587b99913 100644 --- a/target/linux/generic/files/drivers/net/phy/psb6970.c +++ b/target/linux/generic/files/drivers/net/phy/psb6970.c @@ -60,11 +60,13 @@ struct psb6970_priv { struct mutex reg_mutex; /* all fields below are cleared on reset */ - bool vlan; - u16 vlan_id[PSB6970_MAX_VLANS]; - u8 vlan_table[PSB6970_MAX_VLANS]; - u8 vlan_tagged; - u16 pvid[PSB6970_NUM_PORTS]; + struct_group(psb6970_priv_volatile, + bool vlan; + u16 vlan_id[PSB6970_MAX_VLANS]; + u8 vlan_table[PSB6970_MAX_VLANS]; + u8 vlan_tagged; + u16 pvid[PSB6970_NUM_PORTS]; + ); }; #define to_psb6970(_dev) container_of(_dev, struct psb6970_priv, dev) @@ -272,8 +274,8 @@ static int psb6970_reset_switch(struct switch_dev *dev) mutex_lock(&priv->reg_mutex); - memset(&priv->vlan, 0, sizeof(struct psb6970_priv) - - offsetof(struct psb6970_priv, vlan)); + memset(&priv->psb6970_priv_volatile, 0, + sizeof(priv->psb6970_priv_volatile)); for (i = 0; i < PSB6970_MAX_VLANS; i++) priv->vlan_id[i] = i; @@ -307,7 +309,6 @@ static const struct switch_dev_ops psb6970_ops = { static int psb6970_config_init(struct phy_device *pdev) { struct psb6970_priv *priv; - struct net_device *dev = pdev->attached_dev; struct switch_dev *swdev; int ret; diff --git a/target/linux/generic/files/drivers/platform/mikrotik/Kconfig b/target/linux/generic/files/drivers/platform/mikrotik/Kconfig index 7499ba1e1c..1dc027815a 100644 --- a/target/linux/generic/files/drivers/platform/mikrotik/Kconfig +++ b/target/linux/generic/files/drivers/platform/mikrotik/Kconfig @@ -1,6 +1,5 @@ menuconfig MIKROTIK bool "Platform support for MikroTik RouterBoard virtual devices" - default n help Say Y here to get to see options for the MikroTik RouterBoard platform. This option alone does not add any kernel code. diff --git a/target/linux/generic/files/drivers/ssb/fallback-sprom.c b/target/linux/generic/files/drivers/ssb/fallback-sprom.c new file mode 100644 index 0000000000..26f0fd2f03 --- /dev/null +++ b/target/linux/generic/files/drivers/ssb/fallback-sprom.c @@ -0,0 +1,744 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * SSB Fallback SPROM Driver + * + * Copyright (C) 2020 Álvaro Fernández Rojas + * Copyright (C) 2014 Jonas Gorski + * Copyright (C) 2008 Maxime Bizon + * Copyright (C) 2008 Florian Fainelli + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define SSB_FBS_MAX_SIZE 440 + +/* Get the word-offset for a SSB_SPROM_XXX define. */ +#define SPOFF(offset) ((offset) / sizeof(u16)) +/* Helper to extract some _offset, which is one of the SSB_SPROM_XXX defines. */ +#define SPEX16(_outvar, _offset, _mask, _shift) \ + out->_outvar = ((in[SPOFF(_offset)] & (_mask)) >> (_shift)) +#define SPEX32(_outvar, _offset, _mask, _shift) \ + out->_outvar = ((((u32)in[SPOFF((_offset)+2)] << 16 | \ + in[SPOFF(_offset)]) & (_mask)) >> (_shift)) +#define SPEX(_outvar, _offset, _mask, _shift) \ + SPEX16(_outvar, _offset, _mask, _shift) + +#define SPEX_ARRAY8(_field, _offset, _mask, _shift) \ + do { \ + SPEX(_field[0], _offset + 0, _mask, _shift); \ + SPEX(_field[1], _offset + 2, _mask, _shift); \ + SPEX(_field[2], _offset + 4, _mask, _shift); \ + SPEX(_field[3], _offset + 6, _mask, _shift); \ + SPEX(_field[4], _offset + 8, _mask, _shift); \ + SPEX(_field[5], _offset + 10, _mask, _shift); \ + SPEX(_field[6], _offset + 12, _mask, _shift); \ + SPEX(_field[7], _offset + 14, _mask, _shift); \ + } while (0) + +struct ssb_fbs { + struct device *dev; + struct list_head list; + struct ssb_sprom sprom; + u32 pci_bus; + u32 pci_dev; + bool devid_override; +}; + +static DEFINE_SPINLOCK(ssb_fbs_lock); +static struct list_head ssb_fbs_list = LIST_HEAD_INIT(ssb_fbs_list); + +int ssb_get_fallback_sprom(struct ssb_bus *bus, struct ssb_sprom *out) +{ + struct ssb_fbs *pos; + u32 pci_bus, pci_dev; + + if (bus->bustype != SSB_BUSTYPE_PCI) + return -ENOENT; + + pci_bus = bus->host_pci->bus->number; + pci_dev = PCI_SLOT(bus->host_pci->devfn); + + list_for_each_entry(pos, &ssb_fbs_list, list) { + if (pos->pci_bus != pci_bus || + pos->pci_dev != pci_dev) + continue; + + if (pos->devid_override) + bus->host_pci->device = pos->sprom.dev_id; + + memcpy(out, &pos->sprom, sizeof(struct ssb_sprom)); + dev_info(pos->dev, "requested by [%x:%x]", + pos->pci_bus, pos->pci_dev); + + return 0; + } + + pr_err("unable to fill SPROM for [%x:%x]\n", pci_bus, pci_dev); + + return -EINVAL; +} + +static s8 sprom_extract_antgain(u8 sprom_revision, const u16 *in, u16 offset, + u16 mask, u16 shift) +{ + u16 v; + u8 gain; + + v = in[SPOFF(offset)]; + gain = (v & mask) >> shift; + if (gain == 0xFF) + gain = 2; /* If unset use 2dBm */ + if (sprom_revision == 1) { + /* Convert to Q5.2 */ + gain <<= 2; + } else { + /* Q5.2 Fractional part is stored in 0xC0 */ + gain = ((gain & 0xC0) >> 6) | ((gain & 0x3F) << 2); + } + + return (s8)gain; +} + +static void sprom_extract_r23(struct ssb_sprom *out, const u16 *in) +{ + SPEX(boardflags_hi, SSB_SPROM2_BFLHI, 0xFFFF, 0); + SPEX(opo, SSB_SPROM2_OPO, SSB_SPROM2_OPO_VALUE, 0); + SPEX(pa1lob0, SSB_SPROM2_PA1LOB0, 0xFFFF, 0); + SPEX(pa1lob1, SSB_SPROM2_PA1LOB1, 0xFFFF, 0); + SPEX(pa1lob2, SSB_SPROM2_PA1LOB2, 0xFFFF, 0); + SPEX(pa1hib0, SSB_SPROM2_PA1HIB0, 0xFFFF, 0); + SPEX(pa1hib1, SSB_SPROM2_PA1HIB1, 0xFFFF, 0); + SPEX(pa1hib2, SSB_SPROM2_PA1HIB2, 0xFFFF, 0); + SPEX(maxpwr_ah, SSB_SPROM2_MAXP_A, SSB_SPROM2_MAXP_A_HI, 0); + SPEX(maxpwr_al, SSB_SPROM2_MAXP_A, SSB_SPROM2_MAXP_A_LO, + SSB_SPROM2_MAXP_A_LO_SHIFT); +} + +static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in) +{ + SPEX(et0phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET0A, 0); + SPEX(et1phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET1A, + SSB_SPROM1_ETHPHY_ET1A_SHIFT); + SPEX(et0mdcport, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET0M, 14); + SPEX(et1mdcport, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET1M, 15); + SPEX(board_rev, SSB_SPROM1_BINF, SSB_SPROM1_BINF_BREV, 0); + SPEX(board_type, SSB_SPROM1_SPID, 0xFFFF, 0); + if (out->revision == 1) + SPEX(country_code, SSB_SPROM1_BINF, SSB_SPROM1_BINF_CCODE, + SSB_SPROM1_BINF_CCODE_SHIFT); + SPEX(ant_available_a, SSB_SPROM1_BINF, SSB_SPROM1_BINF_ANTA, + SSB_SPROM1_BINF_ANTA_SHIFT); + SPEX(ant_available_bg, SSB_SPROM1_BINF, SSB_SPROM1_BINF_ANTBG, + SSB_SPROM1_BINF_ANTBG_SHIFT); + SPEX(pa0b0, SSB_SPROM1_PA0B0, 0xFFFF, 0); + SPEX(pa0b1, SSB_SPROM1_PA0B1, 0xFFFF, 0); + SPEX(pa0b2, SSB_SPROM1_PA0B2, 0xFFFF, 0); + SPEX(pa1b0, SSB_SPROM1_PA1B0, 0xFFFF, 0); + SPEX(pa1b1, SSB_SPROM1_PA1B1, 0xFFFF, 0); + SPEX(pa1b2, SSB_SPROM1_PA1B2, 0xFFFF, 0); + SPEX(gpio0, SSB_SPROM1_GPIOA, SSB_SPROM1_GPIOA_P0, 0); + SPEX(gpio1, SSB_SPROM1_GPIOA, SSB_SPROM1_GPIOA_P1, + SSB_SPROM1_GPIOA_P1_SHIFT); + SPEX(gpio2, SSB_SPROM1_GPIOB, SSB_SPROM1_GPIOB_P2, 0); + SPEX(gpio3, SSB_SPROM1_GPIOB, SSB_SPROM1_GPIOB_P3, + SSB_SPROM1_GPIOB_P3_SHIFT); + SPEX(maxpwr_a, SSB_SPROM1_MAXPWR, SSB_SPROM1_MAXPWR_A, + SSB_SPROM1_MAXPWR_A_SHIFT); + SPEX(maxpwr_bg, SSB_SPROM1_MAXPWR, SSB_SPROM1_MAXPWR_BG, 0); + SPEX(itssi_a, SSB_SPROM1_ITSSI, SSB_SPROM1_ITSSI_A, + SSB_SPROM1_ITSSI_A_SHIFT); + SPEX(itssi_bg, SSB_SPROM1_ITSSI, SSB_SPROM1_ITSSI_BG, 0); + SPEX(boardflags_lo, SSB_SPROM1_BFLLO, 0xFFFF, 0); + + SPEX(alpha2[0], SSB_SPROM1_CCODE, 0xff00, 8); + SPEX(alpha2[1], SSB_SPROM1_CCODE, 0x00ff, 0); + + /* Extract the antenna gain values. */ + out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, + SSB_SPROM1_AGAIN, + SSB_SPROM1_AGAIN_BG, + SSB_SPROM1_AGAIN_BG_SHIFT); + out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, + SSB_SPROM1_AGAIN, + SSB_SPROM1_AGAIN_A, + SSB_SPROM1_AGAIN_A_SHIFT); + if (out->revision >= 2) + sprom_extract_r23(out, in); +} + +/* Revs 4 5 and 8 have partially shared layout */ +static void sprom_extract_r458(struct ssb_sprom *out, const u16 *in) +{ + SPEX(txpid2g[0], SSB_SPROM4_TXPID2G01, + SSB_SPROM4_TXPID2G0, SSB_SPROM4_TXPID2G0_SHIFT); + SPEX(txpid2g[1], SSB_SPROM4_TXPID2G01, + SSB_SPROM4_TXPID2G1, SSB_SPROM4_TXPID2G1_SHIFT); + SPEX(txpid2g[2], SSB_SPROM4_TXPID2G23, + SSB_SPROM4_TXPID2G2, SSB_SPROM4_TXPID2G2_SHIFT); + SPEX(txpid2g[3], SSB_SPROM4_TXPID2G23, + SSB_SPROM4_TXPID2G3, SSB_SPROM4_TXPID2G3_SHIFT); + + SPEX(txpid5gl[0], SSB_SPROM4_TXPID5GL01, + SSB_SPROM4_TXPID5GL0, SSB_SPROM4_TXPID5GL0_SHIFT); + SPEX(txpid5gl[1], SSB_SPROM4_TXPID5GL01, + SSB_SPROM4_TXPID5GL1, SSB_SPROM4_TXPID5GL1_SHIFT); + SPEX(txpid5gl[2], SSB_SPROM4_TXPID5GL23, + SSB_SPROM4_TXPID5GL2, SSB_SPROM4_TXPID5GL2_SHIFT); + SPEX(txpid5gl[3], SSB_SPROM4_TXPID5GL23, + SSB_SPROM4_TXPID5GL3, SSB_SPROM4_TXPID5GL3_SHIFT); + + SPEX(txpid5g[0], SSB_SPROM4_TXPID5G01, + SSB_SPROM4_TXPID5G0, SSB_SPROM4_TXPID5G0_SHIFT); + SPEX(txpid5g[1], SSB_SPROM4_TXPID5G01, + SSB_SPROM4_TXPID5G1, SSB_SPROM4_TXPID5G1_SHIFT); + SPEX(txpid5g[2], SSB_SPROM4_TXPID5G23, + SSB_SPROM4_TXPID5G2, SSB_SPROM4_TXPID5G2_SHIFT); + SPEX(txpid5g[3], SSB_SPROM4_TXPID5G23, + SSB_SPROM4_TXPID5G3, SSB_SPROM4_TXPID5G3_SHIFT); + + SPEX(txpid5gh[0], SSB_SPROM4_TXPID5GH01, + SSB_SPROM4_TXPID5GH0, SSB_SPROM4_TXPID5GH0_SHIFT); + SPEX(txpid5gh[1], SSB_SPROM4_TXPID5GH01, + SSB_SPROM4_TXPID5GH1, SSB_SPROM4_TXPID5GH1_SHIFT); + SPEX(txpid5gh[2], SSB_SPROM4_TXPID5GH23, + SSB_SPROM4_TXPID5GH2, SSB_SPROM4_TXPID5GH2_SHIFT); + SPEX(txpid5gh[3], SSB_SPROM4_TXPID5GH23, + SSB_SPROM4_TXPID5GH3, SSB_SPROM4_TXPID5GH3_SHIFT); +} + +static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in) +{ + static const u16 pwr_info_offset[] = { + SSB_SPROM4_PWR_INFO_CORE0, SSB_SPROM4_PWR_INFO_CORE1, + SSB_SPROM4_PWR_INFO_CORE2, SSB_SPROM4_PWR_INFO_CORE3 + }; + int i; + + BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) != + ARRAY_SIZE(out->core_pwr_info)); + + SPEX(et0phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET0A, 0); + SPEX(et1phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET1A, + SSB_SPROM4_ETHPHY_ET1A_SHIFT); + SPEX(board_rev, SSB_SPROM4_BOARDREV, 0xFFFF, 0); + SPEX(board_type, SSB_SPROM1_SPID, 0xFFFF, 0); + if (out->revision == 4) { + SPEX(alpha2[0], SSB_SPROM4_CCODE, 0xff00, 8); + SPEX(alpha2[1], SSB_SPROM4_CCODE, 0x00ff, 0); + SPEX(boardflags_lo, SSB_SPROM4_BFLLO, 0xFFFF, 0); + SPEX(boardflags_hi, SSB_SPROM4_BFLHI, 0xFFFF, 0); + SPEX(boardflags2_lo, SSB_SPROM4_BFL2LO, 0xFFFF, 0); + SPEX(boardflags2_hi, SSB_SPROM4_BFL2HI, 0xFFFF, 0); + } else { + SPEX(alpha2[0], SSB_SPROM5_CCODE, 0xff00, 8); + SPEX(alpha2[1], SSB_SPROM5_CCODE, 0x00ff, 0); + SPEX(boardflags_lo, SSB_SPROM5_BFLLO, 0xFFFF, 0); + SPEX(boardflags_hi, SSB_SPROM5_BFLHI, 0xFFFF, 0); + SPEX(boardflags2_lo, SSB_SPROM5_BFL2LO, 0xFFFF, 0); + SPEX(boardflags2_hi, SSB_SPROM5_BFL2HI, 0xFFFF, 0); + } + SPEX(ant_available_a, SSB_SPROM4_ANTAVAIL, SSB_SPROM4_ANTAVAIL_A, + SSB_SPROM4_ANTAVAIL_A_SHIFT); + SPEX(ant_available_bg, SSB_SPROM4_ANTAVAIL, SSB_SPROM4_ANTAVAIL_BG, + SSB_SPROM4_ANTAVAIL_BG_SHIFT); + SPEX(maxpwr_bg, SSB_SPROM4_MAXP_BG, SSB_SPROM4_MAXP_BG_MASK, 0); + SPEX(itssi_bg, SSB_SPROM4_MAXP_BG, SSB_SPROM4_ITSSI_BG, + SSB_SPROM4_ITSSI_BG_SHIFT); + SPEX(maxpwr_a, SSB_SPROM4_MAXP_A, SSB_SPROM4_MAXP_A_MASK, 0); + SPEX(itssi_a, SSB_SPROM4_MAXP_A, SSB_SPROM4_ITSSI_A, + SSB_SPROM4_ITSSI_A_SHIFT); + if (out->revision == 4) { + SPEX(gpio0, SSB_SPROM4_GPIOA, SSB_SPROM4_GPIOA_P0, 0); + SPEX(gpio1, SSB_SPROM4_GPIOA, SSB_SPROM4_GPIOA_P1, + SSB_SPROM4_GPIOA_P1_SHIFT); + SPEX(gpio2, SSB_SPROM4_GPIOB, SSB_SPROM4_GPIOB_P2, 0); + SPEX(gpio3, SSB_SPROM4_GPIOB, SSB_SPROM4_GPIOB_P3, + SSB_SPROM4_GPIOB_P3_SHIFT); + } else { + SPEX(gpio0, SSB_SPROM5_GPIOA, SSB_SPROM5_GPIOA_P0, 0); + SPEX(gpio1, SSB_SPROM5_GPIOA, SSB_SPROM5_GPIOA_P1, + SSB_SPROM5_GPIOA_P1_SHIFT); + SPEX(gpio2, SSB_SPROM5_GPIOB, SSB_SPROM5_GPIOB_P2, 0); + SPEX(gpio3, SSB_SPROM5_GPIOB, SSB_SPROM5_GPIOB_P3, + SSB_SPROM5_GPIOB_P3_SHIFT); + } + + /* Extract the antenna gain values. */ + out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, + SSB_SPROM4_AGAIN01, + SSB_SPROM4_AGAIN0, + SSB_SPROM4_AGAIN0_SHIFT); + out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, + SSB_SPROM4_AGAIN01, + SSB_SPROM4_AGAIN1, + SSB_SPROM4_AGAIN1_SHIFT); + out->antenna_gain.a2 = sprom_extract_antgain(out->revision, in, + SSB_SPROM4_AGAIN23, + SSB_SPROM4_AGAIN2, + SSB_SPROM4_AGAIN2_SHIFT); + out->antenna_gain.a3 = sprom_extract_antgain(out->revision, in, + SSB_SPROM4_AGAIN23, + SSB_SPROM4_AGAIN3, + SSB_SPROM4_AGAIN3_SHIFT); + + /* Extract cores power info info */ + for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) { + u16 o = pwr_info_offset[i]; + + SPEX(core_pwr_info[i].itssi_2g, o + SSB_SPROM4_2G_MAXP_ITSSI, + SSB_SPROM4_2G_ITSSI, SSB_SPROM4_2G_ITSSI_SHIFT); + SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SPROM4_2G_MAXP_ITSSI, + SSB_SPROM4_2G_MAXP, 0); + + SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SPROM4_2G_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SPROM4_2G_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SPROM4_2G_PA_2, ~0, 0); + SPEX(core_pwr_info[i].pa_2g[3], o + SSB_SPROM4_2G_PA_3, ~0, 0); + + SPEX(core_pwr_info[i].itssi_5g, o + SSB_SPROM4_5G_MAXP_ITSSI, + SSB_SPROM4_5G_ITSSI, SSB_SPROM4_5G_ITSSI_SHIFT); + SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SPROM4_5G_MAXP_ITSSI, + SSB_SPROM4_5G_MAXP, 0); + SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM4_5GHL_MAXP, + SSB_SPROM4_5GH_MAXP, 0); + SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM4_5GHL_MAXP, + SSB_SPROM4_5GL_MAXP, SSB_SPROM4_5GL_MAXP_SHIFT); + + SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SPROM4_5GL_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SPROM4_5GL_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SPROM4_5GL_PA_2, ~0, 0); + SPEX(core_pwr_info[i].pa_5gl[3], o + SSB_SPROM4_5GL_PA_3, ~0, 0); + SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SPROM4_5G_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SPROM4_5G_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SPROM4_5G_PA_2, ~0, 0); + SPEX(core_pwr_info[i].pa_5g[3], o + SSB_SPROM4_5G_PA_3, ~0, 0); + SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SPROM4_5GH_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SPROM4_5GH_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SPROM4_5GH_PA_2, ~0, 0); + SPEX(core_pwr_info[i].pa_5gh[3], o + SSB_SPROM4_5GH_PA_3, ~0, 0); + } + + sprom_extract_r458(out, in); + + /* TODO - get remaining rev 4 stuff needed */ +} + +static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in) +{ + int i; + u16 o; + static const u16 pwr_info_offset[] = { + SSB_SROM8_PWR_INFO_CORE0, SSB_SROM8_PWR_INFO_CORE1, + SSB_SROM8_PWR_INFO_CORE2, SSB_SROM8_PWR_INFO_CORE3 + }; + BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) != + ARRAY_SIZE(out->core_pwr_info)); + + SPEX(board_rev, SSB_SPROM8_BOARDREV, 0xFFFF, 0); + SPEX(board_type, SSB_SPROM1_SPID, 0xFFFF, 0); + SPEX(alpha2[0], SSB_SPROM8_CCODE, 0xff00, 8); + SPEX(alpha2[1], SSB_SPROM8_CCODE, 0x00ff, 0); + SPEX(boardflags_lo, SSB_SPROM8_BFLLO, 0xFFFF, 0); + SPEX(boardflags_hi, SSB_SPROM8_BFLHI, 0xFFFF, 0); + SPEX(boardflags2_lo, SSB_SPROM8_BFL2LO, 0xFFFF, 0); + SPEX(boardflags2_hi, SSB_SPROM8_BFL2HI, 0xFFFF, 0); + SPEX(ant_available_a, SSB_SPROM8_ANTAVAIL, SSB_SPROM8_ANTAVAIL_A, + SSB_SPROM8_ANTAVAIL_A_SHIFT); + SPEX(ant_available_bg, SSB_SPROM8_ANTAVAIL, SSB_SPROM8_ANTAVAIL_BG, + SSB_SPROM8_ANTAVAIL_BG_SHIFT); + SPEX(maxpwr_bg, SSB_SPROM8_MAXP_BG, SSB_SPROM8_MAXP_BG_MASK, 0); + SPEX(itssi_bg, SSB_SPROM8_MAXP_BG, SSB_SPROM8_ITSSI_BG, + SSB_SPROM8_ITSSI_BG_SHIFT); + SPEX(maxpwr_a, SSB_SPROM8_MAXP_A, SSB_SPROM8_MAXP_A_MASK, 0); + SPEX(itssi_a, SSB_SPROM8_MAXP_A, SSB_SPROM8_ITSSI_A, + SSB_SPROM8_ITSSI_A_SHIFT); + SPEX(maxpwr_ah, SSB_SPROM8_MAXP_AHL, SSB_SPROM8_MAXP_AH_MASK, 0); + SPEX(maxpwr_al, SSB_SPROM8_MAXP_AHL, SSB_SPROM8_MAXP_AL_MASK, + SSB_SPROM8_MAXP_AL_SHIFT); + SPEX(gpio0, SSB_SPROM8_GPIOA, SSB_SPROM8_GPIOA_P0, 0); + SPEX(gpio1, SSB_SPROM8_GPIOA, SSB_SPROM8_GPIOA_P1, + SSB_SPROM8_GPIOA_P1_SHIFT); + SPEX(gpio2, SSB_SPROM8_GPIOB, SSB_SPROM8_GPIOB_P2, 0); + SPEX(gpio3, SSB_SPROM8_GPIOB, SSB_SPROM8_GPIOB_P3, + SSB_SPROM8_GPIOB_P3_SHIFT); + SPEX(tri2g, SSB_SPROM8_TRI25G, SSB_SPROM8_TRI2G, 0); + SPEX(tri5g, SSB_SPROM8_TRI25G, SSB_SPROM8_TRI5G, + SSB_SPROM8_TRI5G_SHIFT); + SPEX(tri5gl, SSB_SPROM8_TRI5GHL, SSB_SPROM8_TRI5GL, 0); + SPEX(tri5gh, SSB_SPROM8_TRI5GHL, SSB_SPROM8_TRI5GH, + SSB_SPROM8_TRI5GH_SHIFT); + SPEX(rxpo2g, SSB_SPROM8_RXPO, SSB_SPROM8_RXPO2G, 0); + SPEX(rxpo5g, SSB_SPROM8_RXPO, SSB_SPROM8_RXPO5G, + SSB_SPROM8_RXPO5G_SHIFT); + SPEX(rssismf2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISMF2G, 0); + SPEX(rssismc2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISMC2G, + SSB_SPROM8_RSSISMC2G_SHIFT); + SPEX(rssisav2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISAV2G, + SSB_SPROM8_RSSISAV2G_SHIFT); + SPEX(bxa2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_BXA2G, + SSB_SPROM8_BXA2G_SHIFT); + SPEX(rssismf5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISMF5G, 0); + SPEX(rssismc5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISMC5G, + SSB_SPROM8_RSSISMC5G_SHIFT); + SPEX(rssisav5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISAV5G, + SSB_SPROM8_RSSISAV5G_SHIFT); + SPEX(bxa5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_BXA5G, + SSB_SPROM8_BXA5G_SHIFT); + SPEX(pa0b0, SSB_SPROM8_PA0B0, 0xFFFF, 0); + SPEX(pa0b1, SSB_SPROM8_PA0B1, 0xFFFF, 0); + SPEX(pa0b2, SSB_SPROM8_PA0B2, 0xFFFF, 0); + SPEX(pa1b0, SSB_SPROM8_PA1B0, 0xFFFF, 0); + SPEX(pa1b1, SSB_SPROM8_PA1B1, 0xFFFF, 0); + SPEX(pa1b2, SSB_SPROM8_PA1B2, 0xFFFF, 0); + SPEX(pa1lob0, SSB_SPROM8_PA1LOB0, 0xFFFF, 0); + SPEX(pa1lob1, SSB_SPROM8_PA1LOB1, 0xFFFF, 0); + SPEX(pa1lob2, SSB_SPROM8_PA1LOB2, 0xFFFF, 0); + SPEX(pa1hib0, SSB_SPROM8_PA1HIB0, 0xFFFF, 0); + SPEX(pa1hib1, SSB_SPROM8_PA1HIB1, 0xFFFF, 0); + SPEX(pa1hib2, SSB_SPROM8_PA1HIB2, 0xFFFF, 0); + SPEX(cck2gpo, SSB_SPROM8_CCK2GPO, 0xFFFF, 0); + SPEX32(ofdm2gpo, SSB_SPROM8_OFDM2GPO, 0xFFFFFFFF, 0); + SPEX32(ofdm5glpo, SSB_SPROM8_OFDM5GLPO, 0xFFFFFFFF, 0); + SPEX32(ofdm5gpo, SSB_SPROM8_OFDM5GPO, 0xFFFFFFFF, 0); + SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, 0xFFFFFFFF, 0); + + /* Extract the antenna gain values. */ + out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, + SSB_SPROM8_AGAIN01, + SSB_SPROM8_AGAIN0, + SSB_SPROM8_AGAIN0_SHIFT); + out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, + SSB_SPROM8_AGAIN01, + SSB_SPROM8_AGAIN1, + SSB_SPROM8_AGAIN1_SHIFT); + out->antenna_gain.a2 = sprom_extract_antgain(out->revision, in, + SSB_SPROM8_AGAIN23, + SSB_SPROM8_AGAIN2, + SSB_SPROM8_AGAIN2_SHIFT); + out->antenna_gain.a3 = sprom_extract_antgain(out->revision, in, + SSB_SPROM8_AGAIN23, + SSB_SPROM8_AGAIN3, + SSB_SPROM8_AGAIN3_SHIFT); + + /* Extract cores power info info */ + for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) { + o = pwr_info_offset[i]; + SPEX(core_pwr_info[i].itssi_2g, o + SSB_SROM8_2G_MAXP_ITSSI, + SSB_SPROM8_2G_ITSSI, SSB_SPROM8_2G_ITSSI_SHIFT); + SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SROM8_2G_MAXP_ITSSI, + SSB_SPROM8_2G_MAXP, 0); + + SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SROM8_2G_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SROM8_2G_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SROM8_2G_PA_2, ~0, 0); + + SPEX(core_pwr_info[i].itssi_5g, o + SSB_SROM8_5G_MAXP_ITSSI, + SSB_SPROM8_5G_ITSSI, SSB_SPROM8_5G_ITSSI_SHIFT); + SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SROM8_5G_MAXP_ITSSI, + SSB_SPROM8_5G_MAXP, 0); + SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM8_5GHL_MAXP, + SSB_SPROM8_5GH_MAXP, 0); + SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM8_5GHL_MAXP, + SSB_SPROM8_5GL_MAXP, SSB_SPROM8_5GL_MAXP_SHIFT); + + SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SROM8_5GL_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SROM8_5GL_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SROM8_5GL_PA_2, ~0, 0); + SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SROM8_5G_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SROM8_5G_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SROM8_5G_PA_2, ~0, 0); + SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SROM8_5GH_PA_0, ~0, 0); + SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SROM8_5GH_PA_1, ~0, 0); + SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SROM8_5GH_PA_2, ~0, 0); + } + + /* Extract FEM info */ + SPEX(fem.ghz2.tssipos, SSB_SPROM8_FEM2G, + SSB_SROM8_FEM_TSSIPOS, SSB_SROM8_FEM_TSSIPOS_SHIFT); + SPEX(fem.ghz2.extpa_gain, SSB_SPROM8_FEM2G, + SSB_SROM8_FEM_EXTPA_GAIN, SSB_SROM8_FEM_EXTPA_GAIN_SHIFT); + SPEX(fem.ghz2.pdet_range, SSB_SPROM8_FEM2G, + SSB_SROM8_FEM_PDET_RANGE, SSB_SROM8_FEM_PDET_RANGE_SHIFT); + SPEX(fem.ghz2.tr_iso, SSB_SPROM8_FEM2G, + SSB_SROM8_FEM_TR_ISO, SSB_SROM8_FEM_TR_ISO_SHIFT); + SPEX(fem.ghz2.antswlut, SSB_SPROM8_FEM2G, + SSB_SROM8_FEM_ANTSWLUT, SSB_SROM8_FEM_ANTSWLUT_SHIFT); + + SPEX(fem.ghz5.tssipos, SSB_SPROM8_FEM5G, + SSB_SROM8_FEM_TSSIPOS, SSB_SROM8_FEM_TSSIPOS_SHIFT); + SPEX(fem.ghz5.extpa_gain, SSB_SPROM8_FEM5G, + SSB_SROM8_FEM_EXTPA_GAIN, SSB_SROM8_FEM_EXTPA_GAIN_SHIFT); + SPEX(fem.ghz5.pdet_range, SSB_SPROM8_FEM5G, + SSB_SROM8_FEM_PDET_RANGE, SSB_SROM8_FEM_PDET_RANGE_SHIFT); + SPEX(fem.ghz5.tr_iso, SSB_SPROM8_FEM5G, + SSB_SROM8_FEM_TR_ISO, SSB_SROM8_FEM_TR_ISO_SHIFT); + SPEX(fem.ghz5.antswlut, SSB_SPROM8_FEM5G, + SSB_SROM8_FEM_ANTSWLUT, SSB_SROM8_FEM_ANTSWLUT_SHIFT); + + SPEX(leddc_on_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_ON, + SSB_SPROM8_LEDDC_ON_SHIFT); + SPEX(leddc_off_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_OFF, + SSB_SPROM8_LEDDC_OFF_SHIFT); + + SPEX(txchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_TXCHAIN, + SSB_SPROM8_TXRXC_TXCHAIN_SHIFT); + SPEX(rxchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_RXCHAIN, + SSB_SPROM8_TXRXC_RXCHAIN_SHIFT); + SPEX(antswitch, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_SWITCH, + SSB_SPROM8_TXRXC_SWITCH_SHIFT); + + SPEX(opo, SSB_SPROM8_OFDM2GPO, 0x00ff, 0); + + SPEX_ARRAY8(mcs2gpo, SSB_SPROM8_2G_MCSPO, ~0, 0); + SPEX_ARRAY8(mcs5gpo, SSB_SPROM8_5G_MCSPO, ~0, 0); + SPEX_ARRAY8(mcs5glpo, SSB_SPROM8_5GL_MCSPO, ~0, 0); + SPEX_ARRAY8(mcs5ghpo, SSB_SPROM8_5GH_MCSPO, ~0, 0); + + SPEX(rawtempsense, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_RAWTEMP, + SSB_SPROM8_RAWTS_RAWTEMP_SHIFT); + SPEX(measpower, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_MEASPOWER, + SSB_SPROM8_RAWTS_MEASPOWER_SHIFT); + SPEX(tempsense_slope, SSB_SPROM8_OPT_CORRX, + SSB_SPROM8_OPT_CORRX_TEMP_SLOPE, + SSB_SPROM8_OPT_CORRX_TEMP_SLOPE_SHIFT); + SPEX(tempcorrx, SSB_SPROM8_OPT_CORRX, SSB_SPROM8_OPT_CORRX_TEMPCORRX, + SSB_SPROM8_OPT_CORRX_TEMPCORRX_SHIFT); + SPEX(tempsense_option, SSB_SPROM8_OPT_CORRX, + SSB_SPROM8_OPT_CORRX_TEMP_OPTION, + SSB_SPROM8_OPT_CORRX_TEMP_OPTION_SHIFT); + SPEX(freqoffset_corr, SSB_SPROM8_HWIQ_IQSWP, + SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR, + SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR_SHIFT); + SPEX(iqcal_swp_dis, SSB_SPROM8_HWIQ_IQSWP, + SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP, + SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP_SHIFT); + SPEX(hw_iqcal_en, SSB_SPROM8_HWIQ_IQSWP, SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL, + SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL_SHIFT); + + SPEX(bw40po, SSB_SPROM8_BW40PO, ~0, 0); + SPEX(cddpo, SSB_SPROM8_CDDPO, ~0, 0); + SPEX(stbcpo, SSB_SPROM8_STBCPO, ~0, 0); + SPEX(bwduppo, SSB_SPROM8_BWDUPPO, ~0, 0); + + SPEX(tempthresh, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_TRESH, + SSB_SPROM8_THERMAL_TRESH_SHIFT); + SPEX(tempoffset, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_OFFSET, + SSB_SPROM8_THERMAL_OFFSET_SHIFT); + SPEX(phycal_tempdelta, SSB_SPROM8_TEMPDELTA, + SSB_SPROM8_TEMPDELTA_PHYCAL, + SSB_SPROM8_TEMPDELTA_PHYCAL_SHIFT); + SPEX(temps_period, SSB_SPROM8_TEMPDELTA, SSB_SPROM8_TEMPDELTA_PERIOD, + SSB_SPROM8_TEMPDELTA_PERIOD_SHIFT); + SPEX(temps_hysteresis, SSB_SPROM8_TEMPDELTA, + SSB_SPROM8_TEMPDELTA_HYSTERESIS, + SSB_SPROM8_TEMPDELTA_HYSTERESIS_SHIFT); + sprom_extract_r458(out, in); + + /* TODO - get remaining rev 8 stuff needed */ +} + +static int sprom_extract(struct ssb_fbs *priv, const u16 *in, u16 size) +{ + struct ssb_sprom *out = &priv->sprom; + + memset(out, 0, sizeof(*out)); + + out->revision = in[size - 1] & 0x00FF; + + switch (out->revision) { + case 1: + case 2: + case 3: + sprom_extract_r123(out, in); + break; + case 4: + case 5: + sprom_extract_r45(out, in); + break; + case 8: + sprom_extract_r8(out, in); + break; + default: + dev_warn(priv->dev, + "Unsupported SPROM revision %d detected." + " Will extract v1\n", + out->revision); + out->revision = 1; + sprom_extract_r123(out, in); + } + + if (out->boardflags_lo == 0xFFFF) + out->boardflags_lo = 0; /* per specs */ + if (out->boardflags_hi == 0xFFFF) + out->boardflags_hi = 0; /* per specs */ + + return 0; +} + +static void ssb_fbs_fixup(struct ssb_fbs *priv, u16 *sprom) +{ + struct device_node *node = priv->dev->of_node; + u32 fixups, off, val; + int i = 0; + + if (!of_get_property(node, "brcm,sprom-fixups", &fixups)) + return; + + fixups /= sizeof(u32); + + dev_info(priv->dev, "patching SPROM with %u fixups...\n", fixups >> 1); + + while (i < fixups) { + if (of_property_read_u32_index(node, "brcm,sprom-fixups", + i++, &off)) { + dev_err(priv->dev, "error reading fixup[%u] offset\n", + i - 1); + return; + } + + if (of_property_read_u32_index(node, "brcm,sprom-fixups", + i++, &val)) { + dev_err(priv->dev, "error reading fixup[%u] value\n", + i - 1); + return; + } + + dev_dbg(priv->dev, "fixup[%d]=0x%04x\n", off, val); + + sprom[off] = val; + } +} + +static bool sprom_override_devid(struct ssb_fbs *priv, struct ssb_sprom *out, + const u16 *in) +{ + SPEX(dev_id, SSB_SPROM1_PID, 0xFFFF, 0); + return !!out->dev_id; +} + +static int ssb_fbs_set(struct ssb_fbs *priv, struct device_node *node) +{ + struct ssb_sprom *sprom = &priv->sprom; + const struct firmware *fw; + const char *sprom_name; + int err; + + if (of_property_read_string(node, "brcm,sprom", &sprom_name)) + sprom_name = NULL; + + if (sprom_name) { + err = request_firmware_direct(&fw, sprom_name, priv->dev); + if (err) + dev_err(priv->dev, "%s load error\n", sprom_name); + } else { + err = -ENOENT; + } + + if (err) { + sprom->revision = 0x02; + sprom->board_rev = 0x0017; + sprom->country_code = 0x00; + sprom->ant_available_bg = 0x03; + sprom->pa0b0 = 0x15ae; + sprom->pa0b1 = 0xfa85; + sprom->pa0b2 = 0xfe8d; + sprom->pa1b0 = 0xffff; + sprom->pa1b1 = 0xffff; + sprom->pa1b2 = 0xffff; + sprom->gpio0 = 0xff; + sprom->gpio1 = 0xff; + sprom->gpio2 = 0xff; + sprom->gpio3 = 0xff; + sprom->maxpwr_bg = 0x4c; + sprom->itssi_bg = 0x00; + sprom->boardflags_lo = 0x2848; + sprom->boardflags_hi = 0x0000; + priv->devid_override = false; + + dev_warn(priv->dev, "using basic SPROM\n"); + } else { + size_t size = min(fw->size, (size_t) SSB_FBS_MAX_SIZE); + u16 tmp_sprom[SSB_FBS_MAX_SIZE >> 1]; + u32 i, j; + + for (i = 0, j = 0; i < size; i += 2, j++) + tmp_sprom[j] = (fw->data[i] << 8) | fw->data[i + 1]; + + release_firmware(fw); + ssb_fbs_fixup(priv, tmp_sprom); + sprom_extract(priv, tmp_sprom, size >> 1); + + priv->devid_override = sprom_override_devid(priv, sprom, + tmp_sprom); + } + + return 0; +} + +static int ssb_fbs_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *node = dev->of_node; + struct ssb_fbs *priv; + unsigned long flags; + u8 mac[ETH_ALEN]; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev = dev; + + ssb_fbs_set(priv, node); + + of_property_read_u32(node, "pci-bus", &priv->pci_bus); + of_property_read_u32(node, "pci-dev", &priv->pci_dev); + + of_get_mac_address(node, mac); + if (is_valid_ether_addr(mac)) { + dev_info(dev, "mtd mac %pM\n", mac); + } else { + random_ether_addr(mac); + dev_info(dev, "random mac %pM\n", mac); + } + + memcpy(priv->sprom.il0mac, mac, ETH_ALEN); + memcpy(priv->sprom.et0mac, mac, ETH_ALEN); + memcpy(priv->sprom.et1mac, mac, ETH_ALEN); + memcpy(priv->sprom.et2mac, mac, ETH_ALEN); + + spin_lock_irqsave(&ssb_fbs_lock, flags); + list_add(&priv->list, &ssb_fbs_list); + spin_unlock_irqrestore(&ssb_fbs_lock, flags); + + dev_info(dev, "registered SPROM for [%x:%x]\n", + priv->pci_bus, priv->pci_dev); + + return 0; +} + +static const struct of_device_id ssb_fbs_of_match[] = { + { .compatible = "brcm,ssb-sprom", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, ssb_fbs_of_match); + +static struct platform_driver ssb_fbs_driver = { + .probe = ssb_fbs_probe, + .driver = { + .name = "ssb-sprom", + .of_match_table = ssb_fbs_of_match, + }, +}; + +int __init ssb_fbs_register(void) +{ + return platform_driver_register(&ssb_fbs_driver); +} diff --git a/target/linux/generic/hack-5.10/204-module_strip.patch b/target/linux/generic/hack-5.10/204-module_strip.patch deleted file mode 100644 index f0eec64dcb..0000000000 --- a/target/linux/generic/hack-5.10/204-module_strip.patch +++ /dev/null @@ -1,212 +0,0 @@ -From a779a482fb9b9f8fcdf8b2519c789b4b9bb5dd05 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 16:56:48 +0200 -Subject: build: add a hack for removing non-essential module info - -Signed-off-by: Felix Fietkau ---- - include/linux/module.h | 13 ++++++++----- - include/linux/moduleparam.h | 15 ++++++++++++--- - init/Kconfig | 7 +++++++ - kernel/module.c | 5 ++++- - scripts/mod/modpost.c | 12 ++++++++++++ - 5 files changed, 43 insertions(+), 9 deletions(-) - ---- a/include/linux/module.h -+++ b/include/linux/module.h -@@ -161,6 +161,7 @@ extern void cleanup_module(void); - - /* Generic info of form tag = "info" */ - #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info) -+#define MODULE_INFO_STRIP(tag, info) __MODULE_INFO_STRIP(tag, tag, info) - - /* For userspace: you can also call me... */ - #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias) -@@ -230,12 +231,12 @@ extern void cleanup_module(void); - * Author(s), use "Name " or just "Name", for multiple - * authors use multiple MODULE_AUTHOR() statements/lines. - */ --#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author) -+#define MODULE_AUTHOR(_author) MODULE_INFO_STRIP(author, _author) - - /* What your module does. */ --#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description) -+#define MODULE_DESCRIPTION(_description) MODULE_INFO_STRIP(description, _description) - --#ifdef MODULE -+#if defined(MODULE) && !defined(CONFIG_MODULE_STRIPPED) - /* Creates an alias so file2alias.c can find device table. */ - #define MODULE_DEVICE_TABLE(type, name) \ - extern typeof(name) __mod_##type##__##name##_device_table \ -@@ -262,7 +263,9 @@ extern typeof(name) __mod_##type##__##na - */ - - #if defined(MODULE) || !defined(CONFIG_SYSFS) --#define MODULE_VERSION(_version) MODULE_INFO(version, _version) -+#define MODULE_VERSION(_version) MODULE_INFO_STRIP(version, _version) -+#elif defined(CONFIG_MODULE_STRIPPED) -+#define MODULE_VERSION(_version) __MODULE_INFO_DISABLED(version) - #else - #define MODULE_VERSION(_version) \ - MODULE_INFO(version, _version); \ -@@ -285,7 +288,7 @@ extern typeof(name) __mod_##type##__##na - /* Optional firmware file (or files) needed by the module - * format is simply firmware file name. Multiple firmware - * files require multiple MODULE_FIRMWARE() specifiers */ --#define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware) -+#define MODULE_FIRMWARE(_firmware) MODULE_INFO_STRIP(firmware, _firmware) - - #define MODULE_IMPORT_NS(ns) MODULE_INFO(import_ns, #ns) - ---- a/include/linux/moduleparam.h -+++ b/include/linux/moduleparam.h -@@ -20,6 +20,16 @@ - /* Chosen so that structs with an unsigned long line up. */ - #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long)) - -+/* This struct is here for syntactic coherency, it is not used */ -+#define __MODULE_INFO_DISABLED(name) \ -+ struct __UNIQUE_ID(name) {} -+ -+#ifdef CONFIG_MODULE_STRIPPED -+#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO_DISABLED(name) -+#else -+#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO(tag, name, info) -+#endif -+ - #define __MODULE_INFO(tag, name, info) \ - static const char __UNIQUE_ID(name)[] \ - __used __section(".modinfo") __attribute__((unused, aligned(1))) \ -@@ -31,7 +41,7 @@ static const char __UNIQUE_ID(name)[] - /* One for each parameter, describing how to use it. Some files do - multiple of these per line, so can't just use MODULE_INFO. */ - #define MODULE_PARM_DESC(_parm, desc) \ -- __MODULE_INFO(parm, _parm, #_parm ":" desc) -+ __MODULE_INFO_STRIP(parm, _parm, #_parm ":" desc) - - struct kernel_param; - ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -2364,6 +2364,13 @@ config UNUSED_KSYMS_WHITELIST - one per line. The path can be absolute, or relative to the kernel - source tree. - -+config MODULE_STRIPPED -+ bool "Reduce module size" -+ depends on MODULES -+ help -+ Remove module parameter descriptions, author info, version, aliases, -+ device tables, etc. -+ - endif # MODULES - - config MODULES_TREE_LOOKUP ---- a/kernel/module.c -+++ b/kernel/module.c -@@ -1285,6 +1285,7 @@ static struct module_attribute *modinfo_ - - static const char vermagic[] = VERMAGIC_STRING; - -+#if defined(CONFIG_MODVERSIONS) || !defined(CONFIG_MODULE_STRIPPED) - static int try_to_force_load(struct module *mod, const char *reason) - { - #ifdef CONFIG_MODULE_FORCE_LOAD -@@ -1296,6 +1297,7 @@ static int try_to_force_load(struct modu - return -ENOEXEC; - #endif - } -+#endif - - #ifdef CONFIG_MODVERSIONS - -@@ -3251,9 +3253,11 @@ static int setup_load_info(struct load_i - - static int check_modinfo(struct module *mod, struct load_info *info, int flags) - { -- const char *modmagic = get_modinfo(info, "vermagic"); - int err; - -+#ifndef CONFIG_MODULE_STRIPPED -+ const char *modmagic = get_modinfo(info, "vermagic"); -+ - if (flags & MODULE_INIT_IGNORE_VERMAGIC) - modmagic = NULL; - -@@ -3274,6 +3278,7 @@ static int check_modinfo(struct module * - mod->name); - add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK); - } -+#endif - - check_modinfo_retpoline(mod, info); - ---- a/scripts/mod/modpost.c -+++ b/scripts/mod/modpost.c -@@ -2038,7 +2038,9 @@ static void read_symbols(const char *mod - symname = remove_dot(info.strtab + sym->st_name); - - handle_symbol(mod, &info, sym, symname); -+#ifndef CONFIG_MODULE_STRIPPED - handle_moddevtable(mod, &info, sym, symname); -+#endif - } - - for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { -@@ -2251,8 +2253,10 @@ static void add_header(struct buffer *b, - buf_printf(b, "\n"); - buf_printf(b, "BUILD_SALT;\n"); - buf_printf(b, "\n"); -+#ifndef CONFIG_MODULE_STRIPPED - buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n"); - buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n"); -+#endif - buf_printf(b, "\n"); - buf_printf(b, "__visible struct module __this_module\n"); - buf_printf(b, "__section(\".gnu.linkonce.this_module\") = {\n"); -@@ -2269,8 +2273,10 @@ static void add_header(struct buffer *b, - - static void add_intree_flag(struct buffer *b, int is_intree) - { -+#ifndef CONFIG_MODULE_STRIPPED - if (is_intree) - buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n"); -+#endif - } - - /* Cannot check for assembler */ -@@ -2283,8 +2289,10 @@ static void add_retpoline(struct buffer - - static void add_staging_flag(struct buffer *b, const char *name) - { -+#ifndef CONFIG_MODULE_STRIPPED - if (strstarts(name, "drivers/staging")) - buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n"); -+#endif - } - - /** -@@ -2368,11 +2376,13 @@ static void add_depends(struct buffer *b - - static void add_srcversion(struct buffer *b, struct module *mod) - { -+#ifndef CONFIG_MODULE_STRIPPED - if (mod->srcversion[0]) { - buf_printf(b, "\n"); - buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n", - mod->srcversion); - } -+#endif - } - - static void write_buf(struct buffer *b, const char *fname) -@@ -2631,7 +2641,9 @@ int main(int argc, char **argv) - add_staging_flag(&buf, mod->name); - err |= add_versions(&buf, mod); - add_depends(&buf, mod); -+#ifndef CONFIG_MODULE_STRIPPED - add_moddevtable(&buf, mod); -+#endif - add_srcversion(&buf, mod); - - sprintf(fname, "%s.mod.c", mod->name); diff --git a/target/linux/generic/hack-5.10/205-kconfig-exit.patch b/target/linux/generic/hack-5.10/205-kconfig-exit.patch deleted file mode 100644 index c3fb7a1f99..0000000000 --- a/target/linux/generic/hack-5.10/205-kconfig-exit.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/scripts/kconfig/conf.c -+++ b/scripts/kconfig/conf.c -@@ -215,6 +215,8 @@ static int conf_sym(struct menu *menu) - break; - continue; - case 0: -+ if (!sym_has_value(sym) && !tty_stdio && getenv("FAIL_ON_UNCONFIGURED")) -+ exit(1); - newval = oldval; - break; - case '?': diff --git a/target/linux/generic/hack-5.10/212-tools_portability.patch b/target/linux/generic/hack-5.10/212-tools_portability.patch deleted file mode 100644 index 0d8eb6fb9d..0000000000 --- a/target/linux/generic/hack-5.10/212-tools_portability.patch +++ /dev/null @@ -1,110 +0,0 @@ -From 48232d3d931c95953ce2ddfe7da7bb164aef6a73 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:03:16 +0200 -Subject: fix portability of some includes files in tools/ used on the host - -Signed-off-by: Felix Fietkau ---- - tools/include/tools/be_byteshift.h | 4 ++++ - tools/include/tools/le_byteshift.h | 4 ++++ - tools/include/tools/linux_types.h | 22 ++++++++++++++++++++++ - 3 files changed, 30 insertions(+) - create mode 100644 tools/include/tools/linux_types.h - ---- a/tools/include/tools/be_byteshift.h -+++ b/tools/include/tools/be_byteshift.h -@@ -2,6 +2,10 @@ - #ifndef _TOOLS_BE_BYTESHIFT_H - #define _TOOLS_BE_BYTESHIFT_H - -+#ifndef __linux__ -+#include "linux_types.h" -+#endif -+ - #include - - static inline uint16_t __get_unaligned_be16(const uint8_t *p) ---- a/tools/include/tools/le_byteshift.h -+++ b/tools/include/tools/le_byteshift.h -@@ -2,6 +2,10 @@ - #ifndef _TOOLS_LE_BYTESHIFT_H - #define _TOOLS_LE_BYTESHIFT_H - -+#ifndef __linux__ -+#include "linux_types.h" -+#endif -+ - #include - - static inline uint16_t __get_unaligned_le16(const uint8_t *p) ---- /dev/null -+++ b/tools/include/tools/linux_types.h -@@ -0,0 +1,26 @@ -+#ifndef __LINUX_TYPES_H -+#define __LINUX_TYPES_H -+ -+#include -+ -+typedef int8_t __s8; -+typedef uint8_t __u8; -+typedef uint8_t __be8; -+typedef uint8_t __le8; -+ -+typedef int16_t __s16; -+typedef uint16_t __u16; -+typedef uint16_t __be16; -+typedef uint16_t __le16; -+ -+typedef int32_t __s32; -+typedef uint32_t __u32; -+typedef uint32_t __be32; -+typedef uint32_t __le32; -+ -+typedef int64_t __s64; -+typedef uint64_t __u64; -+typedef uint64_t __be64; -+typedef uint64_t __le64; -+ -+#endif ---- a/tools/include/linux/types.h -+++ b/tools/include/linux/types.h -@@ -7,8 +7,12 @@ - #include - - #define __SANE_USERSPACE_TYPES__ /* For PPC64, to get LL64 types */ -+#ifndef __linux__ -+#include -+#else - #include - #include -+#endif - - struct page; - struct kmem_cache; ---- a/tools/perf/pmu-events/jevents.c -+++ b/tools/perf/pmu-events/jevents.c -@@ -1,4 +1,6 @@ -+#ifdef __linux__ - #define _XOPEN_SOURCE 500 /* needed for nftw() */ -+#endif - #define _GNU_SOURCE /* needed for asprintf() */ - - /* Parse event JSON files */ -@@ -35,6 +37,7 @@ - #include - #include - #include -+#include - #include - #include - #include ---- a/tools/perf/pmu-events/json.c -+++ b/tools/perf/pmu-events/json.c -@@ -38,7 +38,6 @@ - #include - #include "jsmn.h" - #include "json.h" --#include - - - static char *mapfile(const char *fn, size_t *size) diff --git a/target/linux/generic/hack-5.10/214-spidev_h_portability.patch b/target/linux/generic/hack-5.10/214-spidev_h_portability.patch deleted file mode 100644 index 506d50ad4d..0000000000 --- a/target/linux/generic/hack-5.10/214-spidev_h_portability.patch +++ /dev/null @@ -1,24 +0,0 @@ -From be9be95ff10e16a5b4ad36f903978d0cc5747024 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:04:08 +0200 -Subject: kernel: fix linux/spi/spidev.h portability issues with musl - -Felix will try to get this define included into musl - -lede-commit: 795e7cf60de19e7a076a46874fab7bb88b43bbff -Signed-off-by: Felix Fietkau ---- - include/uapi/linux/spi/spidev.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/include/uapi/linux/spi/spidev.h -+++ b/include/uapi/linux/spi/spidev.h -@@ -121,7 +121,7 @@ struct spi_ioc_transfer { - - /* not all platforms use or _IOC_TYPECHECK() ... */ - #define SPI_MSGSIZE(N) \ -- ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \ -+ ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << 13)) \ - ? ((N)*(sizeof (struct spi_ioc_transfer))) : 0) - #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)]) - diff --git a/target/linux/generic/hack-5.10/220-arm-gc_sections.patch b/target/linux/generic/hack-5.10/220-arm-gc_sections.patch deleted file mode 100644 index 5b36c5ebae..0000000000 --- a/target/linux/generic/hack-5.10/220-arm-gc_sections.patch +++ /dev/null @@ -1,123 +0,0 @@ -From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sat, 15 Jul 2017 23:42:36 +0200 -Subject: use -ffunction-sections, -fdata-sections and --gc-sections - -In combination with kernel symbol export stripping this significantly reduces -the kernel image size. Used on both ARM and MIPS architectures. - -Signed-off-by: Felix Fietkau -Signed-off-by: Jonas Gorski -Signed-off-by: Gabor Juhos ---- ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -114,6 +114,7 @@ config ARM - select HAVE_UID16 - select HAVE_VIRT_CPU_ACCOUNTING_GEN - select IRQ_FORCED_THREADING -+ select HAVE_LD_DEAD_CODE_DATA_ELIMINATION - select MODULES_USE_ELF_REL - select NEED_DMA_MAP_STATE - select OF_EARLY_FLATTREE if OF ---- a/arch/arm/boot/compressed/Makefile -+++ b/arch/arm/boot/compressed/Makefile -@@ -100,6 +100,7 @@ $(foreach o, $(libfdt_objs) atags_to_fdt - ifdef building_out_of_srctree - $(shell rm -f $(addprefix $(obj)/, fdt_rw.c fdt_ro.c fdt_wip.c fdt.c)) - endif -+KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL)) - - targets := vmlinux vmlinux.lds piggy_data piggy.o \ - lib1funcs.o ashldi3.o bswapsdi2.o \ ---- a/arch/arm/kernel/vmlinux.lds.S -+++ b/arch/arm/kernel/vmlinux.lds.S -@@ -75,7 +75,7 @@ SECTIONS - . = ALIGN(4); - __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { - __start___ex_table = .; -- ARM_MMU_KEEP(*(__ex_table)) -+ KEEP(*(__ex_table)) - __stop___ex_table = .; - } - -@@ -100,24 +100,24 @@ SECTIONS - } - .init.arch.info : { - __arch_info_begin = .; -- *(.arch.info.init) -+ KEEP(*(.arch.info.init)) - __arch_info_end = .; - } - .init.tagtable : { - __tagtable_begin = .; -- *(.taglist.init) -+ KEEP(*(.taglist.init)) - __tagtable_end = .; - } - #ifdef CONFIG_SMP_ON_UP - .init.smpalt : { - __smpalt_begin = .; -- *(.alt.smp.init) -+ KEEP(*(.alt.smp.init)) - __smpalt_end = .; - } - #endif - .init.pv_table : { - __pv_table_begin = .; -- *(.pv_table) -+ KEEP(*(.pv_table)) - __pv_table_end = .; - } - ---- a/arch/arm/include/asm/vmlinux.lds.h -+++ b/arch/arm/include/asm/vmlinux.lds.h -@@ -42,13 +42,13 @@ - #define PROC_INFO \ - . = ALIGN(4); \ - __proc_info_begin = .; \ -- *(.proc.info.init) \ -+ KEEP(*(.proc.info.init)) \ - __proc_info_end = .; - - #define IDMAP_TEXT \ - ALIGN_FUNCTION(); \ - __idmap_text_start = .; \ -- *(.idmap.text) \ -+ KEEP(*(.idmap.text)) \ - __idmap_text_end = .; \ - - #define ARM_DISCARD \ -@@ -109,12 +109,12 @@ - . = ALIGN(8); \ - .ARM.unwind_idx : { \ - __start_unwind_idx = .; \ -- *(.ARM.exidx*) \ -+ KEEP(*(.ARM.exidx*)) \ - __stop_unwind_idx = .; \ - } \ - .ARM.unwind_tab : { \ - __start_unwind_tab = .; \ -- *(.ARM.extab*) \ -+ KEEP(*(.ARM.extab*)) \ - __stop_unwind_tab = .; \ - } - -@@ -126,7 +126,7 @@ - __vectors_lma = .; \ - OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) { \ - .vectors { \ -- *(.vectors) \ -+ KEEP(*(.vectors)) \ - } \ - .vectors.bhb.loop8 { \ - *(.vectors.bhb.loop8) \ -@@ -144,7 +144,7 @@ - \ - __stubs_lma = .; \ - .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) { \ -- *(.stubs) \ -+ KEEP(*(.stubs)) \ - } \ - ARM_LMA(__stubs, .stubs); \ - . = __stubs_lma + SIZEOF(.stubs); \ diff --git a/target/linux/generic/hack-5.10/221-module_exports.patch b/target/linux/generic/hack-5.10/221-module_exports.patch deleted file mode 100644 index 734deeebb7..0000000000 --- a/target/linux/generic/hack-5.10/221-module_exports.patch +++ /dev/null @@ -1,102 +0,0 @@ -From b14784e7883390c20ed3ff904892255404a5914b Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:05:53 +0200 -Subject: add an optional config option for stripping all unnecessary symbol exports from the kernel image - -lede-commit: bb5a40c64b7c4f4848509fa0a6625055fc9e66cc -Signed-off-by: Felix Fietkau ---- - include/asm-generic/vmlinux.lds.h | 18 +++++++++++++++--- - include/linux/export.h | 9 ++++++++- - scripts/Makefile.build | 2 +- - 3 files changed, 24 insertions(+), 5 deletions(-) - ---- a/include/asm-generic/vmlinux.lds.h -+++ b/include/asm-generic/vmlinux.lds.h -@@ -81,6 +81,16 @@ - #define RO_EXCEPTION_TABLE - #endif - -+#ifndef SYMTAB_KEEP -+#define SYMTAB_KEEP KEEP(*(SORT(___ksymtab+*))) -+#define SYMTAB_KEEP_GPL KEEP(*(SORT(___ksymtab_gpl+*))) -+#endif -+ -+#ifndef SYMTAB_DISCARD -+#define SYMTAB_DISCARD -+#define SYMTAB_DISCARD_GPL -+#endif -+ - /* Align . to a 8 byte boundary equals to maximum function alignment. */ - #define ALIGN_FUNCTION() . = ALIGN(8) - -@@ -474,14 +484,14 @@ - /* Kernel symbol table: Normal symbols */ \ - __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ - __start___ksymtab = .; \ -- KEEP(*(SORT(___ksymtab+*))) \ -+ SYMTAB_KEEP \ - __stop___ksymtab = .; \ - } \ - \ - /* Kernel symbol table: GPL-only symbols */ \ - __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ - __start___ksymtab_gpl = .; \ -- KEEP(*(SORT(___ksymtab_gpl+*))) \ -+ SYMTAB_KEEP_GPL \ - __stop___ksymtab_gpl = .; \ - } \ - \ -@@ -543,7 +553,7 @@ - \ - /* Kernel symbol table: strings */ \ - __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ -- *(__ksymtab_strings) \ -+ *(__ksymtab_strings+*) \ - } \ - \ - /* __*init sections */ \ -@@ -1024,6 +1034,8 @@ - - #define COMMON_DISCARDS \ - SANITIZER_DISCARDS \ -+ SYMTAB_DISCARD \ -+ SYMTAB_DISCARD_GPL \ - *(.discard) \ - *(.discard.*) \ - *(.modinfo) \ ---- a/include/linux/export.h -+++ b/include/linux/export.h -@@ -82,6 +82,12 @@ struct kernel_symbol { - - #else - -+#ifdef MODULE -+#define __EXPORT_SUFFIX(sym) -+#else -+#define __EXPORT_SUFFIX(sym) "+" #sym -+#endif -+ - /* - * For every exported symbol, do the following: - * -@@ -99,7 +105,7 @@ struct kernel_symbol { - extern const char __kstrtab_##sym[]; \ - extern const char __kstrtabns_##sym[]; \ - __CRC_SYMBOL(sym, sec); \ -- asm(" .section \"__ksymtab_strings\",\"aMS\",%progbits,1 \n" \ -+ asm(" .section \"__ksymtab_strings" __EXPORT_SUFFIX(sym) "\",\"aMS\",%progbits,1 \n" \ - "__kstrtab_" #sym ": \n" \ - " .asciz \"" #sym "\" \n" \ - "__kstrtabns_" #sym ": \n" \ ---- a/scripts/Makefile.build -+++ b/scripts/Makefile.build -@@ -373,7 +373,7 @@ targets += $(lib-y) $(always-y) $(MAKECM - # Linker scripts preprocessor (.lds.S -> .lds) - # --------------------------------------------------------------------------- - quiet_cmd_cpp_lds_S = LDS $@ -- cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \ -+ cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -U$(ARCH) \ - -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $< - - $(obj)/%.lds: $(src)/%.lds.S FORCE diff --git a/target/linux/generic/hack-5.10/230-openwrt_lzma_options.patch b/target/linux/generic/hack-5.10/230-openwrt_lzma_options.patch deleted file mode 100644 index 09e64b7986..0000000000 --- a/target/linux/generic/hack-5.10/230-openwrt_lzma_options.patch +++ /dev/null @@ -1,34 +0,0 @@ -From b3d00b452467f621317953d9e4c6f9ae8dcfd271 Mon Sep 17 00:00:00 2001 -From: Imre Kaloz -Date: Fri, 7 Jul 2017 17:06:55 +0200 -Subject: use the librecmc lzma options for now - -lede-commit: 548de949f392049420a6a1feeef118b30ab8ea8c -Signed-off-by: Imre Kaloz ---- - lib/decompress.c | 1 + - scripts/Makefile.lib | 2 +- - usr/gen_initramfs_list.sh | 10 +++++----- - 3 files changed, 7 insertions(+), 6 deletions(-) - ---- a/lib/decompress.c -+++ b/lib/decompress.c -@@ -53,6 +53,7 @@ static const struct compress_format comp - { {0x1f, 0x9e}, "gzip", gunzip }, - { {0x42, 0x5a}, "bzip2", bunzip2 }, - { {0x5d, 0x00}, "lzma", unlzma }, -+ { {0x6d, 0x00}, "lzma-librecmc", unlzma }, - { {0xfd, 0x37}, "xz", unxz }, - { {0x89, 0x4c}, "lzo", unlzo }, - { {0x02, 0x21}, "lz4", unlz4 }, ---- a/scripts/Makefile.lib -+++ b/scripts/Makefile.lib -@@ -370,7 +370,7 @@ quiet_cmd_bzip2 = BZIP2 $@ - # --------------------------------------------------------------------------- - - quiet_cmd_lzma = LZMA $@ -- cmd_lzma = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@ -+ cmd_lzma = { cat $(real-prereqs) | $(LZMA) e -d20 -lc1 -lp2 -pb2 -eos -si -so; $(size_append); } > $@ - - quiet_cmd_lzo = LZO $@ - cmd_lzo = { cat $(real-prereqs) | $(KLZOP) -9; $(size_append); } > $@ diff --git a/target/linux/generic/hack-5.10/249-udp-tunnel-selection.patch b/target/linux/generic/hack-5.10/249-udp-tunnel-selection.patch deleted file mode 100644 index 2c74298dfe..0000000000 --- a/target/linux/generic/hack-5.10/249-udp-tunnel-selection.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/ipv4/Kconfig -+++ b/net/ipv4/Kconfig -@@ -315,7 +315,7 @@ config NET_IPVTI - on top. - - config NET_UDP_TUNNEL -- tristate -+ tristate "IP: UDP tunneling support" - select NET_IP_TUNNEL - default n - diff --git a/target/linux/generic/hack-5.10/250-netfilter_depends.patch b/target/linux/generic/hack-5.10/250-netfilter_depends.patch deleted file mode 100644 index ec01854958..0000000000 --- a/target/linux/generic/hack-5.10/250-netfilter_depends.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: Felix Fietkau -Subject: hack: net: remove bogus netfilter dependencies - -lede-commit: 589d2a377dee27d206fc3725325309cf649e4df6 -Signed-off-by: Felix Fietkau ---- - net/netfilter/Kconfig | 2 -- - 1 file changed, 2 deletions(-) - ---- a/net/netfilter/Kconfig -+++ b/net/netfilter/Kconfig -@@ -227,7 +227,6 @@ config NF_CONNTRACK_FTP - - config NF_CONNTRACK_H323 - tristate "H.323 protocol support" -- depends on IPV6 || IPV6=n - depends on NETFILTER_ADVANCED - help - H.323 is a VoIP signalling protocol from ITU-T. As one of the most -@@ -1071,7 +1070,6 @@ config NETFILTER_XT_TARGET_SECMARK - - config NETFILTER_XT_TARGET_TCPMSS - tristate '"TCPMSS" target support' -- depends on IPV6 || IPV6=n - default m if NETFILTER_ADVANCED=n - help - This option adds a `TCPMSS' target, which allows you to alter the diff --git a/target/linux/generic/hack-5.10/251-kconfig.patch b/target/linux/generic/hack-5.10/251-kconfig.patch deleted file mode 100644 index 30b8ee23ea..0000000000 --- a/target/linux/generic/hack-5.10/251-kconfig.patch +++ /dev/null @@ -1,199 +0,0 @@ -From da3c50704f14132f4adf80d48e9a4cd5d46e54c9 Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Fri, 7 Jul 2017 17:09:21 +0200 -Subject: kconfig: owrt specifc dependencies - -Signed-off-by: John Crispin ---- - crypto/Kconfig | 10 +++++----- - drivers/bcma/Kconfig | 1 + - drivers/ssb/Kconfig | 3 ++- - lib/Kconfig | 8 ++++---- - net/netfilter/Kconfig | 2 +- - net/wireless/Kconfig | 17 ++++++++++------- - sound/core/Kconfig | 4 ++-- - 7 files changed, 25 insertions(+), 20 deletions(-) - ---- a/crypto/Kconfig -+++ b/crypto/Kconfig -@@ -34,7 +34,7 @@ config CRYPTO_FIPS - this is. - - config CRYPTO_ALGAPI -- tristate -+ tristate "ALGAPI" - select CRYPTO_ALGAPI2 - help - This option provides the API for cryptographic algorithms. -@@ -43,7 +43,7 @@ config CRYPTO_ALGAPI2 - tristate - - config CRYPTO_AEAD -- tristate -+ tristate "AEAD" - select CRYPTO_AEAD2 - select CRYPTO_ALGAPI - -@@ -54,7 +54,7 @@ config CRYPTO_AEAD2 - select CRYPTO_RNG2 - - config CRYPTO_SKCIPHER -- tristate -+ tristate "SKCIPHER" - select CRYPTO_SKCIPHER2 - select CRYPTO_ALGAPI - -@@ -64,7 +64,7 @@ config CRYPTO_SKCIPHER2 - select CRYPTO_RNG2 - - config CRYPTO_HASH -- tristate -+ tristate "HASH" - select CRYPTO_HASH2 - select CRYPTO_ALGAPI - -@@ -73,7 +73,7 @@ config CRYPTO_HASH2 - select CRYPTO_ALGAPI2 - - config CRYPTO_RNG -- tristate -+ tristate "RNG" - select CRYPTO_RNG2 - select CRYPTO_ALGAPI - ---- a/drivers/bcma/Kconfig -+++ b/drivers/bcma/Kconfig -@@ -16,6 +16,7 @@ if BCMA - # Support for Block-I/O. SELECT this from the driver that needs it. - config BCMA_BLOCKIO - bool -+ default y - - config BCMA_HOST_PCI_POSSIBLE - bool ---- a/drivers/ssb/Kconfig -+++ b/drivers/ssb/Kconfig -@@ -29,6 +29,7 @@ config SSB_SPROM - config SSB_BLOCKIO - bool - depends on SSB -+ default y - - config SSB_PCIHOST_POSSIBLE - bool -@@ -49,7 +50,7 @@ config SSB_PCIHOST - config SSB_B43_PCI_BRIDGE - bool - depends on SSB_PCIHOST -- default n -+ default y - - config SSB_PCMCIAHOST_POSSIBLE - bool ---- a/lib/Kconfig -+++ b/lib/Kconfig -@@ -423,16 +423,16 @@ config BCH_CONST_T - # Textsearch support is select'ed if needed - # - config TEXTSEARCH -- bool -+ bool "Textsearch support" - - config TEXTSEARCH_KMP -- tristate -+ tristate "Textsearch KMP" - - config TEXTSEARCH_BM -- tristate -+ tristate "Textsearch BM" - - config TEXTSEARCH_FSM -- tristate -+ tristate "Textsearch FSM" - - config BTREE - bool ---- a/net/netfilter/Kconfig -+++ b/net/netfilter/Kconfig -@@ -11,7 +11,7 @@ config NETFILTER_INGRESS - infrastructure. - - config NETFILTER_NETLINK -- tristate -+ tristate "Netfilter NFNETLINK interface" - - config NETFILTER_FAMILY_BRIDGE - bool ---- a/net/wireless/Kconfig -+++ b/net/wireless/Kconfig -@@ -1,6 +1,6 @@ - # SPDX-License-Identifier: GPL-2.0-only - config WIRELESS_EXT -- bool -+ bool "Wireless extensions" - - config WEXT_CORE - def_bool y -@@ -12,10 +12,10 @@ config WEXT_PROC - depends on WEXT_CORE - - config WEXT_SPY -- bool -+ bool "WEXT_SPY" - - config WEXT_PRIV -- bool -+ bool "WEXT_PRIV" - - config CFG80211 - tristate "cfg80211 - wireless configuration API" -@@ -204,7 +204,7 @@ config CFG80211_WEXT_EXPORT - endif # CFG80211 - - config LIB80211 -- tristate -+ tristate "LIB80211" - default n - help - This options enables a library of common routines used -@@ -213,17 +213,17 @@ config LIB80211 - Drivers should select this themselves if needed. - - config LIB80211_CRYPT_WEP -- tristate -+ tristate "LIB80211_CRYPT_WEP" - select CRYPTO_LIB_ARC4 - - config LIB80211_CRYPT_CCMP -- tristate -+ tristate "LIB80211_CRYPT_CCMP" - select CRYPTO - select CRYPTO_AES - select CRYPTO_CCM - - config LIB80211_CRYPT_TKIP -- tristate -+ tristate "LIB80211_CRYPT_TKIP" - select CRYPTO_LIB_ARC4 - - config LIB80211_DEBUG ---- a/sound/core/Kconfig -+++ b/sound/core/Kconfig -@@ -17,7 +17,7 @@ config SND_DMAENGINE_PCM - tristate - - config SND_HWDEP -- tristate -+ tristate "Sound hardware support" - - config SND_SEQ_DEVICE - tristate -@@ -27,7 +27,7 @@ config SND_RAWMIDI - select SND_SEQ_DEVICE if SND_SEQUENCER != n - - config SND_COMPRESS_OFFLOAD -- tristate -+ tristate "Compression offloading support" - - config SND_JACK - bool diff --git a/target/linux/generic/hack-5.10/252-SATA_PMP.patch b/target/linux/generic/hack-5.10/252-SATA_PMP.patch deleted file mode 100644 index 6502d1d6ed..0000000000 --- a/target/linux/generic/hack-5.10/252-SATA_PMP.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 8c817e33be829c7249c2cfd59ff48ad5fac6a31d Mon Sep 17 00:00:00 2001 -From: Sungbo Eo -Date: Fri, 7 Jul 2017 17:09:21 +0200 -Subject: [PATCH] kconfig: solidify SATA_PMP config - -SATA_PMP option in kernel config file disappears for every kernel_oldconfig refresh. -To prevent this, SATA_HOST is now selected automatically when SATA_PMP is enabled. -This patch can be dropped if SATA_MV is ever re-added into the config. ---- - drivers/ata/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/ata/Kconfig -+++ b/drivers/ata/Kconfig -@@ -112,7 +112,7 @@ config SATA_ZPODD - - config SATA_PMP - bool "SATA Port Multiplier support" -- depends on SATA_HOST -+ select SATA_HOST - default y - help - This option adds support for SATA Port Multipliers diff --git a/target/linux/generic/hack-5.10/253-ksmbd-config.patch b/target/linux/generic/hack-5.10/253-ksmbd-config.patch deleted file mode 100644 index 241270fc8d..0000000000 --- a/target/linux/generic/hack-5.10/253-ksmbd-config.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -2396,7 +2396,7 @@ config PADATA - bool - - config ASN1 -- tristate -+ tristate "ASN1" - help - Build a simple ASN.1 grammar compiler that produces a bytecode output - that can be interpreted by the ASN.1 stream decoder and used to ---- a/lib/Kconfig -+++ b/lib/Kconfig -@@ -594,7 +594,7 @@ config LIBFDT - bool - - config OID_REGISTRY -- tristate -+ tristate "OID" - help - Enable fast lookup object identifier registry. - diff --git a/target/linux/generic/hack-5.10/259-regmap_dynamic.patch b/target/linux/generic/hack-5.10/259-regmap_dynamic.patch deleted file mode 100644 index bc81a7285c..0000000000 --- a/target/linux/generic/hack-5.10/259-regmap_dynamic.patch +++ /dev/null @@ -1,135 +0,0 @@ -From 811d9e2268a62b830cfe93cd8bc929afcb8b198b Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sat, 15 Jul 2017 21:12:38 +0200 -Subject: kernel: move regmap bloat out of the kernel image if it is only being used in modules - -lede-commit: 96f39119815028073583e4fca3a9c5fe9141e998 -Signed-off-by: Felix Fietkau ---- - drivers/base/regmap/Kconfig | 15 ++++++++++----- - drivers/base/regmap/Makefile | 12 ++++++++---- - drivers/base/regmap/regmap.c | 3 +++ - include/linux/regmap.h | 2 +- - 4 files changed, 22 insertions(+), 10 deletions(-) - ---- a/drivers/base/regmap/Kconfig -+++ b/drivers/base/regmap/Kconfig -@@ -4,9 +4,8 @@ - # subsystems should select the appropriate symbols. - - config REGMAP -- default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SOUNDWIRE || REGMAP_SCCB || REGMAP_I3C || REGMAP_SPI_AVMM) - select IRQ_DOMAIN if REGMAP_IRQ -- bool -+ tristate - - config REGCACHE_COMPRESSED - select LZO_COMPRESS -@@ -14,46 +13,59 @@ config REGCACHE_COMPRESSED - bool - - config REGMAP_AC97 -+ select REGMAP - tristate - - config REGMAP_I2C - tristate -+ select REGMAP - depends on I2C - - config REGMAP_SLIMBUS - tristate -+ select REGMAP - depends on SLIMBUS - - config REGMAP_SPI - tristate -+ select REGMAP -+ depends on SPI_MASTER - depends on SPI - - config REGMAP_SPMI - tristate -+ select REGMAP - depends on SPMI - - config REGMAP_W1 - tristate -+ select REGMAP - depends on W1 - - config REGMAP_MMIO - tristate -+ select REGMAP - - config REGMAP_IRQ - bool -+ select REGMAP - - config REGMAP_SOUNDWIRE - tristate -+ select REGMAP - depends on SOUNDWIRE - - config REGMAP_SCCB - tristate -+ select REGMAP - depends on I2C - - config REGMAP_I3C - tristate -+ select REGMAP - depends on I3C - - config REGMAP_SPI_AVMM - tristate -+ select REGMAP - depends on SPI ---- a/drivers/base/regmap/Makefile -+++ b/drivers/base/regmap/Makefile -@@ -2,10 +2,14 @@ - # For include/trace/define_trace.h to include trace.h - CFLAGS_regmap.o := -I$(src) - --obj-$(CONFIG_REGMAP) += regmap.o regcache.o --obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-flat.o --obj-$(CONFIG_REGCACHE_COMPRESSED) += regcache-lzo.o --obj-$(CONFIG_DEBUG_FS) += regmap-debugfs.o -+regmap-core-objs = regmap.o regcache.o regcache-rbtree.o regcache-flat.o -+ifdef CONFIG_DEBUG_FS -+regmap-core-objs += regmap-debugfs.o -+endif -+ifdef CONFIG_REGCACHE_COMPRESSED -+regmap-core-objs += regcache-lzo.o -+endif -+obj-$(CONFIG_REGMAP) += regmap-core.o - obj-$(CONFIG_REGMAP_AC97) += regmap-ac97.o - obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o - obj-$(CONFIG_REGMAP_SLIMBUS) += regmap-slimbus.o ---- a/drivers/base/regmap/regmap.c -+++ b/drivers/base/regmap/regmap.c -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -3298,3 +3299,5 @@ static int __init regmap_initcall(void) - return 0; - } - postcore_initcall(regmap_initcall); -+ -+MODULE_LICENSE("GPL"); ---- a/include/linux/regmap.h -+++ b/include/linux/regmap.h -@@ -179,7 +179,7 @@ struct reg_sequence { - __ret ?: __tmp; \ - }) - --#ifdef CONFIG_REGMAP -+#if IS_REACHABLE(CONFIG_REGMAP) - - enum regmap_endian { - /* Unspecified -> 0 -> Backwards compatible default */ diff --git a/target/linux/generic/hack-5.10/260-crypto_test_dependencies.patch b/target/linux/generic/hack-5.10/260-crypto_test_dependencies.patch deleted file mode 100644 index 3ccf67b23e..0000000000 --- a/target/linux/generic/hack-5.10/260-crypto_test_dependencies.patch +++ /dev/null @@ -1,52 +0,0 @@ -From fd1799b0bf5efa46dd3e6dfbbf3955564807e508 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:12:51 +0200 -Subject: kernel: prevent cryptomgr from pulling in useless extra dependencies for tests that are not run - -Reduces kernel size after LZMA by about 5k on MIPS - -lede-commit: 044c316167e076479a344c59905e5b435b84a77f -Signed-off-by: Felix Fietkau ---- - crypto/Kconfig | 13 ++++++------- - crypto/algboss.c | 4 ++++ - 2 files changed, 10 insertions(+), 7 deletions(-) - ---- a/crypto/Kconfig -+++ b/crypto/Kconfig -@@ -121,13 +121,13 @@ config CRYPTO_MANAGER - cbc(aes). - - config CRYPTO_MANAGER2 -- def_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y) -- select CRYPTO_AEAD2 -- select CRYPTO_HASH2 -- select CRYPTO_SKCIPHER2 -- select CRYPTO_AKCIPHER2 -- select CRYPTO_KPP2 -- select CRYPTO_ACOMP2 -+ def_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y && !CRYPTO_MANAGER_DISABLE_TESTS) -+ select CRYPTO_AEAD2 if !CRYPTO_MANAGER_DISABLE_TESTS -+ select CRYPTO_HASH2 if !CRYPTO_MANAGER_DISABLE_TESTS -+ select CRYPTO_SKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS -+ select CRYPTO_AKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS -+ select CRYPTO_KPP2 if !CRYPTO_MANAGER_DISABLE_TESTS -+ select CRYPTO_ACOMP2 if !CRYPTO_MANAGER_DISABLE_TESTS - - config CRYPTO_USER - tristate "Userspace cryptographic algorithm configuration" ---- a/crypto/algboss.c -+++ b/crypto/algboss.c -@@ -230,8 +230,12 @@ static int cryptomgr_schedule_test(struc - type = alg->cra_flags; - - /* Do not test internal algorithms. */ -+#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS -+ type |= CRYPTO_ALG_TESTED; -+#else - if (type & CRYPTO_ALG_INTERNAL) - type |= CRYPTO_ALG_TESTED; -+#endif - - param->type = type; - diff --git a/target/linux/generic/hack-5.10/261-lib-arc4-unhide.patch b/target/linux/generic/hack-5.10/261-lib-arc4-unhide.patch deleted file mode 100644 index 4ffd8cfa37..0000000000 --- a/target/linux/generic/hack-5.10/261-lib-arc4-unhide.patch +++ /dev/null @@ -1,15 +0,0 @@ -This makes it possible to select CONFIG_CRYPTO_LIB_ARC4 directly. We -need this to be able to compile this into the kernel and make use of it -from backports. - ---- a/lib/crypto/Kconfig -+++ b/lib/crypto/Kconfig -@@ -6,7 +6,7 @@ config CRYPTO_LIB_AES - tristate - - config CRYPTO_LIB_ARC4 -- tristate -+ tristate "ARC4 cipher library" - - config CRYPTO_ARCH_HAVE_LIB_BLAKE2S - bool diff --git a/target/linux/generic/hack-5.10/280-rfkill-stubs.patch b/target/linux/generic/hack-5.10/280-rfkill-stubs.patch deleted file mode 100644 index 2e48aea1cf..0000000000 --- a/target/linux/generic/hack-5.10/280-rfkill-stubs.patch +++ /dev/null @@ -1,84 +0,0 @@ -From 236c1acdfef5958010ac9814a9872e0a46fd78ee Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Fri, 7 Jul 2017 17:13:44 +0200 -Subject: rfkill: add fake rfkill support - -allow building of modules depending on RFKILL even if RFKILL is not enabled. - -Signed-off-by: John Crispin ---- - include/linux/rfkill.h | 2 +- - net/Makefile | 2 +- - net/rfkill/Kconfig | 14 +++++++++----- - net/rfkill/Makefile | 2 +- - 4 files changed, 12 insertions(+), 8 deletions(-) - ---- a/include/linux/rfkill.h -+++ b/include/linux/rfkill.h -@@ -64,7 +64,7 @@ struct rfkill_ops { - int (*set_block)(void *data, bool blocked); - }; - --#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) -+#if defined(CONFIG_RFKILL_FULL) || defined(CONFIG_RFKILL_FULL_MODULE) - /** - * rfkill_alloc - Allocate rfkill structure - * @name: name of the struct -- the string is not copied internally ---- a/net/Makefile -+++ b/net/Makefile -@@ -53,7 +53,7 @@ obj-$(CONFIG_TIPC) += tipc/ - obj-$(CONFIG_NETLABEL) += netlabel/ - obj-$(CONFIG_IUCV) += iucv/ - obj-$(CONFIG_SMC) += smc/ --obj-$(CONFIG_RFKILL) += rfkill/ -+obj-$(CONFIG_RFKILL_FULL) += rfkill/ - obj-$(CONFIG_NET_9P) += 9p/ - obj-$(CONFIG_CAIF) += caif/ - ifneq ($(CONFIG_DCB),) ---- a/net/rfkill/Kconfig -+++ b/net/rfkill/Kconfig -@@ -2,7 +2,11 @@ - # - # RF switch subsystem configuration - # --menuconfig RFKILL -+config RFKILL -+ bool -+ default y -+ -+menuconfig RFKILL_FULL - tristate "RF switch subsystem support" - help - Say Y here if you want to have control over RF switches -@@ -14,19 +18,19 @@ menuconfig RFKILL - # LED trigger support - config RFKILL_LEDS - bool -- depends on RFKILL -+ depends on RFKILL_FULL - depends on LEDS_TRIGGERS = y || RFKILL = LEDS_TRIGGERS - default y - - config RFKILL_INPUT - bool "RF switch input support" if EXPERT -- depends on RFKILL -+ depends on RFKILL_FULL - depends on INPUT = y || RFKILL = INPUT - default y if !EXPERT - - config RFKILL_GPIO - tristate "GPIO RFKILL driver" -- depends on RFKILL -+ depends on RFKILL_FULL - depends on GPIOLIB || COMPILE_TEST - default n - help ---- a/net/rfkill/Makefile -+++ b/net/rfkill/Makefile -@@ -5,5 +5,5 @@ - - rfkill-y += core.o - rfkill-$(CONFIG_RFKILL_INPUT) += input.o --obj-$(CONFIG_RFKILL) += rfkill.o -+obj-$(CONFIG_RFKILL_FULL) += rfkill.o - obj-$(CONFIG_RFKILL_GPIO) += rfkill-gpio.o diff --git a/target/linux/generic/hack-5.10/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch b/target/linux/generic/hack-5.10/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch deleted file mode 100644 index fe89de7e08..0000000000 --- a/target/linux/generic/hack-5.10/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch +++ /dev/null @@ -1,64 +0,0 @@ -From: Ben Menchaca -Date: Fri, 7 Jun 2013 18:35:22 -0500 -Subject: MIPS: r4k_cache: use more efficient cache blast - -Optimize the compiler output for larger cache blast cases that are -common for DMA-based networking. - -Signed-off-by: Ben Menchaca -Signed-off-by: Felix Fietkau ---- ---- a/arch/mips/include/asm/r4kcache.h -+++ b/arch/mips/include/asm/r4kcache.h -@@ -296,14 +296,46 @@ static inline void prot##extra##blast_## - unsigned long end) \ - { \ - unsigned long lsize = cpu_##desc##_line_size(); \ -+ unsigned long lsize_2 = lsize * 2; \ -+ unsigned long lsize_3 = lsize * 3; \ -+ unsigned long lsize_4 = lsize * 4; \ -+ unsigned long lsize_5 = lsize * 5; \ -+ unsigned long lsize_6 = lsize * 6; \ -+ unsigned long lsize_7 = lsize * 7; \ -+ unsigned long lsize_8 = lsize * 8; \ - unsigned long addr = start & ~(lsize - 1); \ -- unsigned long aend = (end - 1) & ~(lsize - 1); \ -+ unsigned long aend = (end + lsize - 1) & ~(lsize - 1); \ -+ int lines = (aend - addr) / lsize; \ - \ -- while (1) { \ -+ while (lines >= 8) { \ -+ prot##cache_op(hitop, addr); \ -+ prot##cache_op(hitop, addr + lsize); \ -+ prot##cache_op(hitop, addr + lsize_2); \ -+ prot##cache_op(hitop, addr + lsize_3); \ -+ prot##cache_op(hitop, addr + lsize_4); \ -+ prot##cache_op(hitop, addr + lsize_5); \ -+ prot##cache_op(hitop, addr + lsize_6); \ -+ prot##cache_op(hitop, addr + lsize_7); \ -+ addr += lsize_8; \ -+ lines -= 8; \ -+ } \ -+ \ -+ if (lines & 0x4) { \ -+ prot##cache_op(hitop, addr); \ -+ prot##cache_op(hitop, addr + lsize); \ -+ prot##cache_op(hitop, addr + lsize_2); \ -+ prot##cache_op(hitop, addr + lsize_3); \ -+ addr += lsize_4; \ -+ } \ -+ \ -+ if (lines & 0x2) { \ -+ prot##cache_op(hitop, addr); \ -+ prot##cache_op(hitop, addr + lsize); \ -+ addr += lsize_2; \ -+ } \ -+ \ -+ if (lines & 0x1) { \ - prot##cache_op(hitop, addr); \ -- if (addr == aend) \ -- break; \ -- addr += lsize; \ - } \ - } - diff --git a/target/linux/generic/hack-5.10/301-mips_image_cmdline_hack.patch b/target/linux/generic/hack-5.10/301-mips_image_cmdline_hack.patch deleted file mode 100644 index f46215615d..0000000000 --- a/target/linux/generic/hack-5.10/301-mips_image_cmdline_hack.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: John Crispin -Subject: hack: kernel: add generic image_cmdline hack to MIPS targets - -lede-commit: d59f5b3a987a48508257a0ddbaeadc7909f9f976 -Signed-off-by: Gabor Juhos ---- - arch/mips/Kconfig | 4 ++++ - arch/mips/kernel/head.S | 6 ++++++ - 2 files changed, 10 insertions(+) - ---- a/arch/mips/Kconfig -+++ b/arch/mips/Kconfig -@@ -1170,6 +1170,10 @@ config MIPS_MSC - config SYNC_R4K - bool - -+config IMAGE_CMDLINE_HACK -+ bool "libreCMC specific image command line hack" -+ default n -+ - config NO_IOPORT_MAP - def_bool n - ---- a/arch/mips/kernel/head.S -+++ b/arch/mips/kernel/head.S -@@ -79,6 +79,12 @@ FEXPORT(__kernel_entry) - j kernel_entry - #endif /* CONFIG_BOOT_RAW */ - -+#ifdef CONFIG_IMAGE_CMDLINE_HACK -+ .ascii "CMDLINE:" -+EXPORT(__image_cmdline) -+ .fill 0x400 -+#endif /* CONFIG_IMAGE_CMDLINE_HACK */ -+ - __REF - - NESTED(kernel_entry, 16, sp) # kernel entry point diff --git a/target/linux/generic/hack-5.10/321-powerpc_crtsavres_prereq.patch b/target/linux/generic/hack-5.10/321-powerpc_crtsavres_prereq.patch deleted file mode 100644 index c4fd475b1f..0000000000 --- a/target/linux/generic/hack-5.10/321-powerpc_crtsavres_prereq.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 107c0964cb8db7ca28ac5199426414fdab3c274d Mon Sep 17 00:00:00 2001 -From: "Alexandros C. Couloumbis" -Date: Fri, 7 Jul 2017 17:14:51 +0200 -Subject: hack: arch: powerpc: drop register save/restore library from modules - -Upstream GCC uses a libgcc function for saving/restoring registers. This -makes the code bigger, and upstream kernels need to carry that function -for every single kernel module. Our GCC is patched to avoid those -references, so we can drop the extra bloat for modules. - -lede-commit: e8e1084654f50904e6bf77b70b2de3f137d7b3ec -Signed-off-by: Alexandros C. Couloumbis ---- - arch/powerpc/Makefile | 1 - - 1 file changed, 1 deletion(-) - ---- a/arch/powerpc/Makefile -+++ b/arch/powerpc/Makefile -@@ -44,19 +44,6 @@ machine-$(CONFIG_PPC64) += 64 - machine-$(CONFIG_CPU_LITTLE_ENDIAN) += le - UTS_MACHINE := $(subst $(space),,$(machine-y)) - --# XXX This needs to be before we override LD below --ifdef CONFIG_PPC32 --KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o --else --ifeq ($(call ld-ifversion, -ge, 225000000, y),y) --# Have the linker provide sfpr if possible. --# There is a corresponding test in arch/powerpc/lib/Makefile --KBUILD_LDFLAGS_MODULE += --save-restore-funcs --else --KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o --endif --endif -- - ifdef CONFIG_CPU_LITTLE_ENDIAN - KBUILD_CFLAGS += -mlittle-endian - KBUILD_LDFLAGS += -EL diff --git a/target/linux/generic/hack-5.10/401-mtd-super-don-t-reply-on-mtdblock-device-minor.patch b/target/linux/generic/hack-5.10/401-mtd-super-don-t-reply-on-mtdblock-device-minor.patch deleted file mode 100644 index 04cf52b096..0000000000 --- a/target/linux/generic/hack-5.10/401-mtd-super-don-t-reply-on-mtdblock-device-minor.patch +++ /dev/null @@ -1,85 +0,0 @@ -From f9760b158f610b1792a222cc924073724c061bfb Mon Sep 17 00:00:00 2001 -From: Daniel Golle -Date: Wed, 7 Apr 2021 22:37:57 +0100 -Subject: [PATCH 1/2] mtd: super: don't reply on mtdblock device minor -To: linux-mtd@lists.infradead.org -Cc: Vignesh Raghavendra , - Richard Weinberger , - Miquel Raynal , - David Woodhouse - -For blktrans devices with partitions (ie. part_bits != 0) the -assumption that the minor number of the mtdblock device matches -the mtdnum doesn't hold true. -Properly resolve mtd device from blktrans layer instead. - -Signed-off-by: Daniel Golle ---- - drivers/mtd/mtdsuper.c | 33 ++++++++++++++++++++++++++------- - 1 file changed, 26 insertions(+), 7 deletions(-) - ---- a/drivers/mtd/mtdsuper.c -+++ b/drivers/mtd/mtdsuper.c -@@ -9,6 +9,7 @@ - */ - - #include -+#include - #include - #include - #include -@@ -121,7 +122,8 @@ int get_tree_mtd(struct fs_context *fc, - { - #ifdef CONFIG_BLOCK - struct block_device *bdev; -- int ret, major; -+ struct mtd_blktrans_dev *blktrans_dev; -+ int ret, major, part_bits; - #endif - int mtdnr; - -@@ -169,21 +171,38 @@ int get_tree_mtd(struct fs_context *fc, - /* try the old way - the hack where we allowed users to mount - * /dev/mtdblock$(n) but didn't actually _use_ the blockdev - */ -- bdev = lookup_bdev(fc->source); -+ bdev = blkdev_get_by_path(fc->source, FMODE_READ, NULL); - if (IS_ERR(bdev)) { - ret = PTR_ERR(bdev); - errorf(fc, "MTD: Couldn't look up '%s': %d", fc->source, ret); - return ret; - } -- pr_debug("MTDSB: lookup_bdev() returned 0\n"); -+ pr_debug("MTDSB: blkdev_get_by_path() returned 0\n"); - - major = MAJOR(bdev->bd_dev); -- mtdnr = MINOR(bdev->bd_dev); -- bdput(bdev); - -- if (major == MTD_BLOCK_MAJOR) -- return mtd_get_sb_by_nr(fc, mtdnr, fill_super); -+ if (major == MTD_BLOCK_MAJOR) { -+ if (!bdev->bd_disk) { -+ blkdev_put(bdev, FMODE_READ); -+ BUG(); -+ return -EINVAL; -+ } -+ -+ blktrans_dev = (struct mtd_blktrans_dev *)(bdev->bd_disk->private_data); -+ if (!blktrans_dev || !blktrans_dev->tr) { -+ blkdev_put(bdev, FMODE_READ); -+ BUG(); -+ return -EINVAL; -+ } -+ mtdnr = blktrans_dev->devnum; -+ part_bits = blktrans_dev->tr->part_bits; -+ blkdev_put(bdev, FMODE_READ); -+ if (MINOR(bdev->bd_dev) != (mtdnr << part_bits)) -+ return -EINVAL; - -+ return mtd_get_sb_by_nr(fc, mtdnr, fill_super); -+ } -+ blkdev_put(bdev, FMODE_READ); - #endif /* CONFIG_BLOCK */ - - if (!(fc->sb_flags & SB_SILENT)) diff --git a/target/linux/generic/hack-5.10/402-mtd-blktrans-call-add-disks-after-mtd-device.patch b/target/linux/generic/hack-5.10/402-mtd-blktrans-call-add-disks-after-mtd-device.patch deleted file mode 100644 index 957c6305d1..0000000000 --- a/target/linux/generic/hack-5.10/402-mtd-blktrans-call-add-disks-after-mtd-device.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 0bccc3722bdd88e8ae995e77ef9f7b77ee4cbdee Mon Sep 17 00:00:00 2001 -From: Daniel Golle -Date: Wed, 7 Apr 2021 22:45:54 +0100 -Subject: [PATCH 2/2] mtd: blktrans: call add disks after mtd device -To: linux-mtd@lists.infradead.org -Cc: Vignesh Raghavendra , - Richard Weinberger , - Miquel Raynal , - David Woodhouse - -Calling device_add_disk while holding mtd_table_mutex leads -to deadlock in case part_bits!=0 as block partition parsers -will try to open the newly created disks, trying to acquire -mutex once again. -Move device_add_disk to additional function called after -add partitions of an MTD device have been added and locks -have been released. - -Signed-off-by: Daniel Golle ---- - drivers/mtd/mtd_blkdevs.c | 33 ++++++++++++++++++++++++++------- - drivers/mtd/mtdcore.c | 3 +++ - include/linux/mtd/blktrans.h | 1 + - 3 files changed, 30 insertions(+), 7 deletions(-) - ---- a/drivers/mtd/mtd_blkdevs.c -+++ b/drivers/mtd/mtd_blkdevs.c -@@ -457,13 +457,6 @@ int add_mtd_blktrans_dev(struct mtd_blkt - if (new->readonly) - set_disk_ro(gd, 1); - -- device_add_disk(&new->mtd->dev, gd, NULL); -- -- if (new->disk_attributes) { -- ret = sysfs_create_group(&disk_to_dev(gd)->kobj, -- new->disk_attributes); -- WARN_ON(ret); -- } - return 0; - error4: - kfree(new->tag_set); -@@ -475,6 +468,27 @@ error1: - return ret; - } - -+void register_mtd_blktrans_devs(void) -+{ -+ struct mtd_blktrans_ops *tr; -+ struct mtd_blktrans_dev *dev, *next; -+ int ret; -+ -+ list_for_each_entry(tr, &blktrans_majors, list) { -+ list_for_each_entry_safe(dev, next, &tr->devs, list) { -+ if (dev->disk->flags & GENHD_FL_UP) -+ continue; -+ -+ device_add_disk(&dev->mtd->dev, dev->disk, NULL); -+ if (dev->disk_attributes) { -+ ret = sysfs_create_group(&disk_to_dev(dev->disk)->kobj, -+ dev->disk_attributes); -+ WARN_ON(ret); -+ } -+ } -+ } -+} -+ - int del_mtd_blktrans_dev(struct mtd_blktrans_dev *old) - { - unsigned long flags; ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -32,6 +32,7 @@ - - #include - #include -+#include - - #include "mtdcore.h" - -@@ -930,6 +931,8 @@ int mtd_device_parse_register(struct mtd - register_reboot_notifier(&mtd->reboot_notifier); - } - -+ register_mtd_blktrans_devs(); -+ - out: - if (ret && device_is_registered(&mtd->dev)) - del_mtd_device(mtd); ---- a/include/linux/mtd/blktrans.h -+++ b/include/linux/mtd/blktrans.h -@@ -76,6 +76,6 @@ extern int deregister_mtd_blktrans(struc - extern int add_mtd_blktrans_dev(struct mtd_blktrans_dev *dev); - extern int del_mtd_blktrans_dev(struct mtd_blktrans_dev *dev); - extern int mtd_blktrans_cease_background(struct mtd_blktrans_dev *dev); -- -+extern void register_mtd_blktrans_devs(void); - - #endif /* __MTD_TRANS_H__ */ diff --git a/target/linux/generic/hack-5.10/410-block-fit-partition-parser.patch b/target/linux/generic/hack-5.10/410-block-fit-partition-parser.patch deleted file mode 100644 index 6965d19c1a..0000000000 --- a/target/linux/generic/hack-5.10/410-block-fit-partition-parser.patch +++ /dev/null @@ -1,224 +0,0 @@ ---- a/block/blk.h -+++ b/block/blk.h -@@ -361,6 +361,8 @@ char *disk_name(struct gendisk *hd, int - #define ADDPART_FLAG_NONE 0 - #define ADDPART_FLAG_RAID 1 - #define ADDPART_FLAG_WHOLEDISK 2 -+#define ADDPART_FLAG_READONLY 4 -+#define ADDPART_FLAG_ROOTDEV 8 - void delete_partition(struct hd_struct *part); - int bdev_add_partition(struct block_device *bdev, int partno, - sector_t start, sector_t length); ---- a/block/partitions/Kconfig -+++ b/block/partitions/Kconfig -@@ -101,6 +101,13 @@ config ATARI_PARTITION - Say Y here if you would like to use hard disks under Linux which - were partitioned under the Atari OS. - -+config FIT_PARTITION -+ bool "Flattened-Image-Tree (FIT) partition support" if PARTITION_ADVANCED -+ default n -+ help -+ Say Y here if your system needs to mount the filesystem part of -+ a Flattened-Image-Tree (FIT) image commonly used with Das U-Boot. -+ - config IBM_PARTITION - bool "IBM disk label and partition support" - depends on PARTITION_ADVANCED && S390 ---- a/block/partitions/Makefile -+++ b/block/partitions/Makefile -@@ -8,6 +8,7 @@ obj-$(CONFIG_ACORN_PARTITION) += acorn.o - obj-$(CONFIG_AMIGA_PARTITION) += amiga.o - obj-$(CONFIG_ATARI_PARTITION) += atari.o - obj-$(CONFIG_AIX_PARTITION) += aix.o -+obj-$(CONFIG_FIT_PARTITION) += fit.o - obj-$(CONFIG_CMDLINE_PARTITION) += cmdline.o - obj-$(CONFIG_MAC_PARTITION) += mac.o - obj-$(CONFIG_LDM_PARTITION) += ldm.o ---- a/block/partitions/check.h -+++ b/block/partitions/check.h -@@ -58,6 +58,7 @@ int amiga_partition(struct parsed_partit - int atari_partition(struct parsed_partitions *state); - int cmdline_partition(struct parsed_partitions *state); - int efi_partition(struct parsed_partitions *state); -+int fit_partition(struct parsed_partitions *state); - int ibm_partition(struct parsed_partitions *); - int karma_partition(struct parsed_partitions *state); - int ldm_partition(struct parsed_partitions *state); -@@ -68,3 +69,5 @@ int sgi_partition(struct parsed_partitio - int sun_partition(struct parsed_partitions *state); - int sysv68_partition(struct parsed_partitions *state); - int ultrix_partition(struct parsed_partitions *state); -+ -+int parse_fit_partitions(struct parsed_partitions *state, u64 start_sector, u64 nr_sectors, int *slot, int add_remain); ---- a/block/partitions/core.c -+++ b/block/partitions/core.c -@@ -10,6 +10,10 @@ - #include - #include - #include -+#ifdef CONFIG_FIT_PARTITION -+#include -+#endif -+ - #include "check.h" - - static int (*check_part[])(struct parsed_partitions *) = { -@@ -46,6 +50,9 @@ static int (*check_part[])(struct parsed - #ifdef CONFIG_EFI_PARTITION - efi_partition, /* this must come before msdos */ - #endif -+#ifdef CONFIG_FIT_PARTITION -+ fit_partition, -+#endif - #ifdef CONFIG_SGI_PARTITION - sgi_partition, - #endif -@@ -701,6 +708,14 @@ static bool blk_add_partition(struct gen - (state->parts[p].flags & ADDPART_FLAG_RAID)) - md_autodetect_dev(part_to_dev(part)->devt); - -+#ifdef CONFIG_FIT_PARTITION -+ if ((state->parts[p].flags & ADDPART_FLAG_ROOTDEV) && ROOT_DEV == 0) -+ ROOT_DEV = part_to_dev(part)->devt; -+ -+ if (state->parts[p].flags & ADDPART_FLAG_READONLY) -+ part->policy = true; -+#endif -+ - return true; - } - ---- a/drivers/mtd/ubi/block.c -+++ b/drivers/mtd/ubi/block.c -@@ -396,7 +396,11 @@ int ubiblock_create(struct ubi_volume_in - dev->leb_size = vi->usable_leb_size; - - /* Initialize the gendisk of this ubiblock device */ -+#ifdef CONFIG_FIT_PARTITION -+ gd = alloc_disk(0); -+#else - gd = alloc_disk(1); -+#endif - if (!gd) { - pr_err("UBI: block: alloc_disk failed\n"); - ret = -ENODEV; -@@ -413,6 +417,9 @@ int ubiblock_create(struct ubi_volume_in - goto out_put_disk; - } - gd->private_data = dev; -+#ifdef CONFIG_FIT_PARTITION -+ gd->flags |= GENHD_FL_EXT_DEVT; -+#endif - sprintf(gd->disk_name, "ubiblock%d_%d", dev->ubi_num, dev->vol_id); - set_capacity(gd, disk_capacity); - dev->gd = gd; ---- a/block/partitions/efi.c -+++ b/block/partitions/efi.c -@@ -706,6 +706,9 @@ int efi_partition(struct parsed_partitio - gpt_entry *ptes = NULL; - u32 i; - unsigned ssz = bdev_logical_block_size(state->bdev) / 512; -+#ifdef CONFIG_FIT_PARTITION -+ u32 extra_slot = 64; -+#endif - - if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) { - kfree(gpt); -@@ -739,6 +742,11 @@ int efi_partition(struct parsed_partitio - ARRAY_SIZE(ptes[i].partition_name)); - utf16_le_to_7bit(ptes[i].partition_name, label_max, info->volname); - state->parts[i + 1].has_info = true; -+#ifdef CONFIG_FIT_PARTITION -+ /* If this is a U-Boot FIT volume it may have subpartitions */ -+ if (!efi_guidcmp(ptes[i].partition_type_guid, PARTITION_LINUX_FIT_GUID)) -+ (void) parse_fit_partitions(state, start * ssz, size * ssz, &extra_slot, 1); -+#endif - } - kfree(ptes); - kfree(gpt); ---- a/block/partitions/efi.h -+++ b/block/partitions/efi.h -@@ -52,6 +52,9 @@ - #define PARTITION_LINUX_LVM_GUID \ - EFI_GUID( 0xe6d6d379, 0xf507, 0x44c2, \ - 0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28) -+#define PARTITION_LINUX_FIT_GUID \ -+ EFI_GUID( 0xcae9be83, 0xb15f, 0x49cc, \ -+ 0x86, 0x3f, 0x08, 0x1b, 0x74, 0x4a, 0x2d, 0x93) - - typedef struct _gpt_header { - __le64 signature; ---- a/drivers/mtd/mtdblock.c -+++ b/drivers/mtd/mtdblock.c -@@ -338,7 +338,11 @@ static void mtdblock_remove_dev(struct m - static struct mtd_blktrans_ops mtdblock_tr = { - .name = "mtdblock", - .major = MTD_BLOCK_MAJOR, -+#ifdef CONFIG_FIT_PARTITION -+ .part_bits = 2, -+#else - .part_bits = 0, -+#endif - .blksize = 512, - .open = mtdblock_open, - .flush = mtdblock_flush, ---- a/drivers/mtd/mtd_blkdevs.c -+++ b/drivers/mtd/mtd_blkdevs.c -@@ -407,18 +407,8 @@ int add_mtd_blktrans_dev(struct mtd_blkt - gd->first_minor = (new->devnum) << tr->part_bits; - gd->fops = &mtd_block_ops; - -- if (tr->part_bits) -- if (new->devnum < 26) -- snprintf(gd->disk_name, sizeof(gd->disk_name), -- "%s%c", tr->name, 'a' + new->devnum); -- else -- snprintf(gd->disk_name, sizeof(gd->disk_name), -- "%s%c%c", tr->name, -- 'a' - 1 + new->devnum / 26, -- 'a' + new->devnum % 26); -- else -- snprintf(gd->disk_name, sizeof(gd->disk_name), -- "%s%d", tr->name, new->devnum); -+ snprintf(gd->disk_name, sizeof(gd->disk_name), -+ "%s%d", tr->name, new->devnum); - - set_capacity(gd, ((u64)new->size * tr->blksize) >> 9); - ---- a/block/partitions/msdos.c -+++ b/block/partitions/msdos.c -@@ -563,6 +563,15 @@ static void parse_minix(struct parsed_pa - #endif /* CONFIG_MINIX_SUBPARTITION */ - } - -+static void parse_fit_mbr(struct parsed_partitions *state, -+ sector_t offset, sector_t size, int origin) -+{ -+#ifdef CONFIG_FIT_PARTITION -+ u32 extra_slot = 64; -+ (void) parse_fit_partitions(state, offset, size, &extra_slot, 1); -+#endif /* CONFIG_FIT_PARTITION */ -+} -+ - static struct { - unsigned char id; - void (*parse)(struct parsed_partitions *, sector_t, sector_t, int); -@@ -574,6 +583,7 @@ static struct { - {UNIXWARE_PARTITION, parse_unixware}, - {SOLARIS_X86_PARTITION, parse_solaris_x86}, - {NEW_SOLARIS_X86_PARTITION, parse_solaris_x86}, -+ {FIT_PARTITION, parse_fit_mbr}, - {0, NULL}, - }; - ---- a/include/linux/msdos_partition.h -+++ b/include/linux/msdos_partition.h -@@ -31,6 +31,7 @@ enum msdos_sys_ind { - LINUX_LVM_PARTITION = 0x8e, - LINUX_RAID_PARTITION = 0xfd, /* autodetect RAID partition */ - -+ FIT_PARTITION = 0x2e, /* U-Boot uImage.FIT */ - SOLARIS_X86_PARTITION = 0x82, /* also Linux swap partitions */ - NEW_SOLARIS_X86_PARTITION = 0xbf, - diff --git a/target/linux/generic/hack-5.10/420-mtd-support-OpenWrt-s-MTD_ROOTFS_ROOT_DEV.patch b/target/linux/generic/hack-5.10/420-mtd-support-OpenWrt-s-MTD_ROOTFS_ROOT_DEV.patch deleted file mode 100644 index 77170c2c1e..0000000000 --- a/target/linux/generic/hack-5.10/420-mtd-support-OpenWrt-s-MTD_ROOTFS_ROOT_DEV.patch +++ /dev/null @@ -1,24 +0,0 @@ -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Mon, 7 Nov 2022 23:48:24 +0100 -Subject: [PATCH] mtd: support libreCMC's MTD_ROOTFS_ROOT_DEV -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This allows setting ROOT_DEV to MTD partition named "rootfs". - -Signed-off-by: Rafał Miłecki ---- - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -758,7 +758,8 @@ int add_mtd_device(struct mtd_info *mtd) - - mutex_unlock(&mtd_table_mutex); - -- if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL)) { -+ if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL) || -+ (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && !strcmp(mtd->name, "rootfs") && ROOT_DEV == 0)) { - if (IS_BUILTIN(CONFIG_MTD)) { - pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name); - ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index); diff --git a/target/linux/generic/hack-5.10/421-mtd-fix-squashfs-root-on-targets-with-CONFIG_FIT_PAR.patch b/target/linux/generic/hack-5.10/421-mtd-fix-squashfs-root-on-targets-with-CONFIG_FIT_PAR.patch deleted file mode 100644 index df93c6be62..0000000000 --- a/target/linux/generic/hack-5.10/421-mtd-fix-squashfs-root-on-targets-with-CONFIG_FIT_PAR.patch +++ /dev/null @@ -1,31 +0,0 @@ -From: Felix Fietkau -Date: Sat Apr 10 17:00:57 2021 +0200 -Subject: [PATCH] mtd: fix squashfs root on targets with CONFIG_FIT_PARTITION - -Fix assumption about the block device index ---- - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -760,12 +760,18 @@ int add_mtd_device(struct mtd_info *mtd) - - if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL) || - (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && !strcmp(mtd->name, "rootfs") && ROOT_DEV == 0)) { -+ unsigned int index = mtd->index; -+ -+#ifdef CONFIG_FIT_PARTITION -+ index <<= 2; -+#endif -+ - if (IS_BUILTIN(CONFIG_MTD)) { -- pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name); -- ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index); -+ pr_info("mtd: setting mtd%d (%s) as root device\n", index, mtd->name); -+ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, index); - } else { - pr_warn("mtd: can't set mtd%d (%s) as root device - mtd must be builtin\n", -- mtd->index, mtd->name); -+ index, mtd->name); - } - } - diff --git a/target/linux/generic/hack-5.10/430-mtk-bmt-support.patch b/target/linux/generic/hack-5.10/430-mtk-bmt-support.patch deleted file mode 100644 index 62ddd66bf2..0000000000 --- a/target/linux/generic/hack-5.10/430-mtk-bmt-support.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- a/drivers/mtd/nand/Kconfig -+++ b/drivers/mtd/nand/Kconfig -@@ -15,6 +15,10 @@ config MTD_NAND_ECC - bool - depends on MTD_NAND_CORE - -+config MTD_NAND_MTK_BMT -+ bool "Support MediaTek NAND Bad-block Management Table" -+ default n -+ - endmenu - - endmenu ---- a/drivers/mtd/nand/Makefile -+++ b/drivers/mtd/nand/Makefile -@@ -2,6 +2,7 @@ - - nandcore-objs := core.o bbt.o - obj-$(CONFIG_MTD_NAND_CORE) += nandcore.o -+obj-$(CONFIG_MTD_NAND_MTK_BMT) += mtk_bmt.o mtk_bmt_v2.o mtk_bmt_bbt.o mtk_bmt_nmbm.o - - obj-y += onenand/ - obj-y += raw/ diff --git a/target/linux/generic/hack-5.10/531-debloat_lzma.patch b/target/linux/generic/hack-5.10/531-debloat_lzma.patch deleted file mode 100644 index 2f70eee3e9..0000000000 --- a/target/linux/generic/hack-5.10/531-debloat_lzma.patch +++ /dev/null @@ -1,1040 +0,0 @@ -From 3fd297761ac246c54d7723c57fca95c112b99465 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sat, 15 Jul 2017 21:15:44 +0200 -Subject: lzma: de-bloat the lzma library used by jffs2 - -lede-commit: 3fd1dd08fbcbb78b34efefd32c3032e5c99108d6 -Signed-off-by: Felix Fietkau ---- - include/linux/lzma/LzFind.h | 17 --- - include/linux/lzma/LzmaDec.h | 101 --------------- - include/linux/lzma/LzmaEnc.h | 20 --- - lib/lzma/LzFind.c | 287 ++++--------------------------------------- - lib/lzma/LzmaDec.c | 86 +------------ - lib/lzma/LzmaEnc.c | 172 ++------------------------ - 6 files changed, 42 insertions(+), 641 deletions(-) - ---- a/include/linux/lzma/LzFind.h -+++ b/include/linux/lzma/LzFind.h -@@ -55,11 +55,6 @@ typedef struct _CMatchFinder - - #define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) - --int MatchFinder_NeedMove(CMatchFinder *p); --Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); --void MatchFinder_MoveBlock(CMatchFinder *p); --void MatchFinder_ReadIfRequired(CMatchFinder *p); -- - void MatchFinder_Construct(CMatchFinder *p); - - /* Conditions: -@@ -70,12 +65,6 @@ int MatchFinder_Create(CMatchFinder *p, - UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, - ISzAlloc *alloc); - void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); --void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems); --void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); -- --UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, -- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, -- UInt32 *distances, UInt32 maxLen); - - /* - Conditions: -@@ -102,12 +91,6 @@ typedef struct _IMatchFinder - - void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); - --void MatchFinder_Init(CMatchFinder *p); --UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); --UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); --void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); --void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); -- - #ifdef __cplusplus - } - #endif ---- a/include/linux/lzma/LzmaDec.h -+++ b/include/linux/lzma/LzmaDec.h -@@ -31,14 +31,6 @@ typedef struct _CLzmaProps - UInt32 dicSize; - } CLzmaProps; - --/* LzmaProps_Decode - decodes properties --Returns: -- SZ_OK -- SZ_ERROR_UNSUPPORTED - Unsupported properties --*/ -- --SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); -- - - /* ---------- LZMA Decoder state ---------- */ - -@@ -70,8 +62,6 @@ typedef struct - - #define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } - --void LzmaDec_Init(CLzmaDec *p); -- - /* There are two types of LZMA streams: - 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. - 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ -@@ -108,97 +98,6 @@ typedef enum - - /* ELzmaStatus is used only as output value for function call */ - -- --/* ---------- Interfaces ---------- */ -- --/* There are 3 levels of interfaces: -- 1) Dictionary Interface -- 2) Buffer Interface -- 3) One Call Interface -- You can select any of these interfaces, but don't mix functions from different -- groups for same object. */ -- -- --/* There are two variants to allocate state for Dictionary Interface: -- 1) LzmaDec_Allocate / LzmaDec_Free -- 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs -- You can use variant 2, if you set dictionary buffer manually. -- For Buffer Interface you must always use variant 1. -- --LzmaDec_Allocate* can return: -- SZ_OK -- SZ_ERROR_MEM - Memory allocation error -- SZ_ERROR_UNSUPPORTED - Unsupported properties --*/ -- --SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); --void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); -- --SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); --void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); -- --/* ---------- Dictionary Interface ---------- */ -- --/* You can use it, if you want to eliminate the overhead for data copying from -- dictionary to some other external buffer. -- You must work with CLzmaDec variables directly in this interface. -- -- STEPS: -- LzmaDec_Constr() -- LzmaDec_Allocate() -- for (each new stream) -- { -- LzmaDec_Init() -- while (it needs more decompression) -- { -- LzmaDec_DecodeToDic() -- use data from CLzmaDec::dic and update CLzmaDec::dicPos -- } -- } -- LzmaDec_Free() --*/ -- --/* LzmaDec_DecodeToDic -- -- The decoding to internal dictionary buffer (CLzmaDec::dic). -- You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! -- --finishMode: -- It has meaning only if the decoding reaches output limit (dicLimit). -- LZMA_FINISH_ANY - Decode just dicLimit bytes. -- LZMA_FINISH_END - Stream must be finished after dicLimit. -- --Returns: -- SZ_OK -- status: -- LZMA_STATUS_FINISHED_WITH_MARK -- LZMA_STATUS_NOT_FINISHED -- LZMA_STATUS_NEEDS_MORE_INPUT -- LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK -- SZ_ERROR_DATA - Data error --*/ -- --SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, -- const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); -- -- --/* ---------- Buffer Interface ---------- */ -- --/* It's zlib-like interface. -- See LzmaDec_DecodeToDic description for information about STEPS and return results, -- but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need -- to work with CLzmaDec variables manually. -- --finishMode: -- It has meaning only if the decoding reaches output limit (*destLen). -- LZMA_FINISH_ANY - Decode just destLen bytes. -- LZMA_FINISH_END - Stream must be finished after (*destLen). --*/ -- --SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, -- const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); -- -- - /* ---------- One Call Interface ---------- */ - - /* LzmaDecode ---- a/include/linux/lzma/LzmaEnc.h -+++ b/include/linux/lzma/LzmaEnc.h -@@ -31,9 +31,6 @@ typedef struct _CLzmaEncProps - } CLzmaEncProps; - - void LzmaEncProps_Init(CLzmaEncProps *p); --void LzmaEncProps_Normalize(CLzmaEncProps *p); --UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2); -- - - /* ---------- CLzmaEncHandle Interface ---------- */ - -@@ -53,26 +50,9 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc * - void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig); - SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); - SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); --SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, -- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); - SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); - --/* ---------- One Call Interface ---------- */ -- --/* LzmaEncode --Return code: -- SZ_OK - OK -- SZ_ERROR_MEM - Memory allocation error -- SZ_ERROR_PARAM - Incorrect paramater -- SZ_ERROR_OUTPUT_EOF - output buffer overflow -- SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) --*/ -- --SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -- const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, -- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); -- - #ifdef __cplusplus - } - #endif ---- a/lib/lzma/LzFind.c -+++ b/lib/lzma/LzFind.c -@@ -14,9 +14,15 @@ - - #define kStartMaxLen 3 - -+#if 0 -+#define DIRECT_INPUT p->directInput -+#else -+#define DIRECT_INPUT 1 -+#endif -+ - static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) - { -- if (!p->directInput) -+ if (!DIRECT_INPUT) - { - alloc->Free(alloc, p->bufferBase); - p->bufferBase = 0; -@@ -28,7 +34,7 @@ static void LzInWindow_Free(CMatchFinder - static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) - { - UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; -- if (p->directInput) -+ if (DIRECT_INPUT) - { - p->blockSize = blockSize; - return 1; -@@ -42,12 +48,12 @@ static int LzInWindow_Create(CMatchFinde - return (p->bufferBase != 0); - } - --Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } --Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; } -+static Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } -+static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; } - --UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } -+static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } - --void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) -+static void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) - { - p->posLimit -= subValue; - p->pos -= subValue; -@@ -58,7 +64,7 @@ static void MatchFinder_ReadBlock(CMatch - { - if (p->streamEndWasReached || p->result != SZ_OK) - return; -- if (p->directInput) -+ if (DIRECT_INPUT) - { - UInt32 curSize = 0xFFFFFFFF - p->streamPos; - if (curSize > p->directInputRem) -@@ -89,7 +95,7 @@ static void MatchFinder_ReadBlock(CMatch - } - } - --void MatchFinder_MoveBlock(CMatchFinder *p) -+static void MatchFinder_MoveBlock(CMatchFinder *p) - { - memmove(p->bufferBase, - p->buffer - p->keepSizeBefore, -@@ -97,22 +103,14 @@ void MatchFinder_MoveBlock(CMatchFinder - p->buffer = p->bufferBase + p->keepSizeBefore; - } - --int MatchFinder_NeedMove(CMatchFinder *p) -+static int MatchFinder_NeedMove(CMatchFinder *p) - { -- if (p->directInput) -+ if (DIRECT_INPUT) - return 0; - /* if (p->streamEndWasReached) return 0; */ - return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); - } - --void MatchFinder_ReadIfRequired(CMatchFinder *p) --{ -- if (p->streamEndWasReached) -- return; -- if (p->keepSizeAfter >= p->streamPos - p->pos) -- MatchFinder_ReadBlock(p); --} -- - static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) - { - if (MatchFinder_NeedMove(p)) -@@ -268,7 +266,7 @@ static void MatchFinder_SetLimits(CMatch - p->posLimit = p->pos + limit; - } - --void MatchFinder_Init(CMatchFinder *p) -+static void MatchFinder_Init(CMatchFinder *p) - { - UInt32 i; - for (i = 0; i < p->hashSizeSum; i++) -@@ -287,7 +285,7 @@ static UInt32 MatchFinder_GetSubValue(CM - return (p->pos - p->historySize - 1) & kNormalizeMask; - } - --void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems) -+static void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems) - { - UInt32 i; - for (i = 0; i < numItems; i++) -@@ -319,38 +317,7 @@ static void MatchFinder_CheckLimits(CMat - MatchFinder_SetLimits(p); - } - --static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, -- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, -- UInt32 *distances, UInt32 maxLen) --{ -- son[_cyclicBufferPos] = curMatch; -- for (;;) -- { -- UInt32 delta = pos - curMatch; -- if (cutValue-- == 0 || delta >= _cyclicBufferSize) -- return distances; -- { -- const Byte *pb = cur - delta; -- curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; -- if (pb[maxLen] == cur[maxLen] && *pb == *cur) -- { -- UInt32 len = 0; -- while (++len != lenLimit) -- if (pb[len] != cur[len]) -- break; -- if (maxLen < len) -- { -- *distances++ = maxLen = len; -- *distances++ = delta - 1; -- if (len == lenLimit) -- return distances; -- } -- } -- } -- } --} -- --UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, -+static UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, - UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, - UInt32 *distances, UInt32 maxLen) - { -@@ -460,10 +427,10 @@ static void SkipMatchesSpec(UInt32 lenLi - p->buffer++; \ - if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); - --#define MOVE_POS_RET MOVE_POS return offset; -- - static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } - -+#define MOVE_POS_RET MatchFinder_MovePos(p); return offset; -+ - #define GET_MATCHES_HEADER2(minLen, ret_op) \ - UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \ - lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ -@@ -479,62 +446,7 @@ static void MatchFinder_MovePos(CMatchFi - distances + offset, maxLen) - distances); MOVE_POS_RET; - - #define SKIP_FOOTER \ -- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; -- --static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) --{ -- UInt32 offset; -- GET_MATCHES_HEADER(2) -- HASH2_CALC; -- curMatch = p->hash[hashValue]; -- p->hash[hashValue] = p->pos; -- offset = 0; -- GET_MATCHES_FOOTER(offset, 1) --} -- --UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) --{ -- UInt32 offset; -- GET_MATCHES_HEADER(3) -- HASH_ZIP_CALC; -- curMatch = p->hash[hashValue]; -- p->hash[hashValue] = p->pos; -- offset = 0; -- GET_MATCHES_FOOTER(offset, 2) --} -- --static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) --{ -- UInt32 hash2Value, delta2, maxLen, offset; -- GET_MATCHES_HEADER(3) -- -- HASH3_CALC; -- -- delta2 = p->pos - p->hash[hash2Value]; -- curMatch = p->hash[kFix3HashSize + hashValue]; -- -- p->hash[hash2Value] = -- p->hash[kFix3HashSize + hashValue] = p->pos; -- -- -- maxLen = 2; -- offset = 0; -- if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) -- { -- for (; maxLen != lenLimit; maxLen++) -- if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) -- break; -- distances[0] = maxLen; -- distances[1] = delta2 - 1; -- offset = 2; -- if (maxLen == lenLimit) -- { -- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); -- MOVE_POS_RET; -- } -- } -- GET_MATCHES_FOOTER(offset, maxLen) --} -+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MatchFinder_MovePos(p); - - static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) - { -@@ -583,108 +495,6 @@ static UInt32 Bt4_MatchFinder_GetMatches - GET_MATCHES_FOOTER(offset, maxLen) - } - --static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) --{ -- UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; -- GET_MATCHES_HEADER(4) -- -- HASH4_CALC; -- -- delta2 = p->pos - p->hash[ hash2Value]; -- delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; -- curMatch = p->hash[kFix4HashSize + hashValue]; -- -- p->hash[ hash2Value] = -- p->hash[kFix3HashSize + hash3Value] = -- p->hash[kFix4HashSize + hashValue] = p->pos; -- -- maxLen = 1; -- offset = 0; -- if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) -- { -- distances[0] = maxLen = 2; -- distances[1] = delta2 - 1; -- offset = 2; -- } -- if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) -- { -- maxLen = 3; -- distances[offset + 1] = delta3 - 1; -- offset += 2; -- delta2 = delta3; -- } -- if (offset != 0) -- { -- for (; maxLen != lenLimit; maxLen++) -- if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) -- break; -- distances[offset - 2] = maxLen; -- if (maxLen == lenLimit) -- { -- p->son[p->cyclicBufferPos] = curMatch; -- MOVE_POS_RET; -- } -- } -- if (maxLen < 3) -- maxLen = 3; -- offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), -- distances + offset, maxLen) - (distances)); -- MOVE_POS_RET --} -- --UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) --{ -- UInt32 offset; -- GET_MATCHES_HEADER(3) -- HASH_ZIP_CALC; -- curMatch = p->hash[hashValue]; -- p->hash[hashValue] = p->pos; -- offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), -- distances, 2) - (distances)); -- MOVE_POS_RET --} -- --static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) --{ -- do -- { -- SKIP_HEADER(2) -- HASH2_CALC; -- curMatch = p->hash[hashValue]; -- p->hash[hashValue] = p->pos; -- SKIP_FOOTER -- } -- while (--num != 0); --} -- --void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) --{ -- do -- { -- SKIP_HEADER(3) -- HASH_ZIP_CALC; -- curMatch = p->hash[hashValue]; -- p->hash[hashValue] = p->pos; -- SKIP_FOOTER -- } -- while (--num != 0); --} -- --static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) --{ -- do -- { -- UInt32 hash2Value; -- SKIP_HEADER(3) -- HASH3_CALC; -- curMatch = p->hash[kFix3HashSize + hashValue]; -- p->hash[hash2Value] = -- p->hash[kFix3HashSize + hashValue] = p->pos; -- SKIP_FOOTER -- } -- while (--num != 0); --} -- - static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) - { - do -@@ -701,61 +511,12 @@ static void Bt4_MatchFinder_Skip(CMatchF - while (--num != 0); - } - --static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) --{ -- do -- { -- UInt32 hash2Value, hash3Value; -- SKIP_HEADER(4) -- HASH4_CALC; -- curMatch = p->hash[kFix4HashSize + hashValue]; -- p->hash[ hash2Value] = -- p->hash[kFix3HashSize + hash3Value] = -- p->hash[kFix4HashSize + hashValue] = p->pos; -- p->son[p->cyclicBufferPos] = curMatch; -- MOVE_POS -- } -- while (--num != 0); --} -- --void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) --{ -- do -- { -- SKIP_HEADER(3) -- HASH_ZIP_CALC; -- curMatch = p->hash[hashValue]; -- p->hash[hashValue] = p->pos; -- p->son[p->cyclicBufferPos] = curMatch; -- MOVE_POS -- } -- while (--num != 0); --} -- - void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) - { - vTable->Init = (Mf_Init_Func)MatchFinder_Init; - vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte; - vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; - vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; -- if (!p->btMode) -- { -- vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; -- vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; -- } -- else if (p->numHashBytes == 2) -- { -- vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; -- vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; -- } -- else if (p->numHashBytes == 3) -- { -- vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; -- vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; -- } -- else -- { -- vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; -- vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; -- } -+ vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; -+ vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; - } ---- a/lib/lzma/LzmaDec.c -+++ b/lib/lzma/LzmaDec.c -@@ -682,7 +682,7 @@ static void LzmaDec_InitRc(CLzmaDec *p, - p->needFlush = 0; - } - --void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) -+static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) - { - p->needFlush = 1; - p->remainLen = 0; -@@ -698,7 +698,7 @@ void LzmaDec_InitDicAndState(CLzmaDec *p - p->needInitState = 1; - } - --void LzmaDec_Init(CLzmaDec *p) -+static void LzmaDec_Init(CLzmaDec *p) - { - p->dicPos = 0; - LzmaDec_InitDicAndState(p, True, True); -@@ -716,7 +716,7 @@ static void LzmaDec_InitStateReal(CLzmaD - p->needInitState = 0; - } - --SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, -+static SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, - ELzmaFinishMode finishMode, ELzmaStatus *status) - { - SizeT inSize = *srcLen; -@@ -837,65 +837,13 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, Si - return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; - } - --SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) --{ -- SizeT outSize = *destLen; -- SizeT inSize = *srcLen; -- *srcLen = *destLen = 0; -- for (;;) -- { -- SizeT inSizeCur = inSize, outSizeCur, dicPos; -- ELzmaFinishMode curFinishMode; -- SRes res; -- if (p->dicPos == p->dicBufSize) -- p->dicPos = 0; -- dicPos = p->dicPos; -- if (outSize > p->dicBufSize - dicPos) -- { -- outSizeCur = p->dicBufSize; -- curFinishMode = LZMA_FINISH_ANY; -- } -- else -- { -- outSizeCur = dicPos + outSize; -- curFinishMode = finishMode; -- } -- -- res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status); -- src += inSizeCur; -- inSize -= inSizeCur; -- *srcLen += inSizeCur; -- outSizeCur = p->dicPos - dicPos; -- memcpy(dest, p->dic + dicPos, outSizeCur); -- dest += outSizeCur; -- outSize -= outSizeCur; -- *destLen += outSizeCur; -- if (res != 0) -- return res; -- if (outSizeCur == 0 || outSize == 0) -- return SZ_OK; -- } --} -- --void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) -+static void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) - { - alloc->Free(alloc, p->probs); - p->probs = 0; - } - --static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc) --{ -- alloc->Free(alloc, p->dic); -- p->dic = 0; --} -- --void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc) --{ -- LzmaDec_FreeProbs(p, alloc); -- LzmaDec_FreeDict(p, alloc); --} -- --SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) -+static SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) - { - UInt32 dicSize; - Byte d; -@@ -935,7 +883,7 @@ static SRes LzmaDec_AllocateProbs2(CLzma - return SZ_OK; - } - --SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) -+static SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) - { - CLzmaProps propNew; - RINOK(LzmaProps_Decode(&propNew, props, propsSize)); -@@ -943,28 +891,6 @@ SRes LzmaDec_AllocateProbs(CLzmaDec *p, - p->prop = propNew; - return SZ_OK; - } -- --SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) --{ -- CLzmaProps propNew; -- SizeT dicBufSize; -- RINOK(LzmaProps_Decode(&propNew, props, propsSize)); -- RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); -- dicBufSize = propNew.dicSize; -- if (p->dic == 0 || dicBufSize != p->dicBufSize) -- { -- LzmaDec_FreeDict(p, alloc); -- p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize); -- if (p->dic == 0) -- { -- LzmaDec_FreeProbs(p, alloc); -- return SZ_ERROR_MEM; -- } -- } -- p->dicBufSize = dicBufSize; -- p->prop = propNew; -- return SZ_OK; --} - - SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, ---- a/lib/lzma/LzmaEnc.c -+++ b/lib/lzma/LzmaEnc.c -@@ -53,7 +53,7 @@ void LzmaEncProps_Init(CLzmaEncProps *p) - p->writeEndMark = 0; - } - --void LzmaEncProps_Normalize(CLzmaEncProps *p) -+static void LzmaEncProps_Normalize(CLzmaEncProps *p) - { - int level = p->level; - if (level < 0) level = 5; -@@ -76,7 +76,7 @@ void LzmaEncProps_Normalize(CLzmaEncProp - #endif - } - --UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) -+static UInt32 __maybe_unused LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) - { - CLzmaEncProps props = *props2; - LzmaEncProps_Normalize(&props); -@@ -93,7 +93,7 @@ UInt32 LzmaEncProps_GetDictSize(const CL - - #define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); } - --UInt32 GetPosSlot1(UInt32 pos) -+static UInt32 GetPosSlot1(UInt32 pos) - { - UInt32 res; - BSR2_RET(pos, res); -@@ -107,7 +107,7 @@ UInt32 GetPosSlot1(UInt32 pos) - #define kNumLogBits (9 + (int)sizeof(size_t) / 2) - #define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) - --void LzmaEnc_FastPosInit(Byte *g_FastPos) -+static void LzmaEnc_FastPosInit(Byte *g_FastPos) - { - int c = 2, slotFast; - g_FastPos[0] = 0; -@@ -339,58 +339,6 @@ typedef struct - CSaveState saveState; - } CLzmaEnc; - --void LzmaEnc_SaveState(CLzmaEncHandle pp) --{ -- CLzmaEnc *p = (CLzmaEnc *)pp; -- CSaveState *dest = &p->saveState; -- int i; -- dest->lenEnc = p->lenEnc; -- dest->repLenEnc = p->repLenEnc; -- dest->state = p->state; -- -- for (i = 0; i < kNumStates; i++) -- { -- memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); -- memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); -- } -- for (i = 0; i < kNumLenToPosStates; i++) -- memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); -- memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); -- memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); -- memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); -- memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); -- memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); -- memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); -- memcpy(dest->reps, p->reps, sizeof(p->reps)); -- memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb)); --} -- --void LzmaEnc_RestoreState(CLzmaEncHandle pp) --{ -- CLzmaEnc *dest = (CLzmaEnc *)pp; -- const CSaveState *p = &dest->saveState; -- int i; -- dest->lenEnc = p->lenEnc; -- dest->repLenEnc = p->repLenEnc; -- dest->state = p->state; -- -- for (i = 0; i < kNumStates; i++) -- { -- memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); -- memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); -- } -- for (i = 0; i < kNumLenToPosStates; i++) -- memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); -- memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); -- memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); -- memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); -- memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); -- memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); -- memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); -- memcpy(dest->reps, p->reps, sizeof(p->reps)); -- memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb)); --} -- - SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) - { - CLzmaEnc *p = (CLzmaEnc *)pp; -@@ -600,7 +548,7 @@ static void LitEnc_EncodeMatched(CRangeE - while (symbol < 0x10000); - } - --void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) -+static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) - { - UInt32 i; - for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) -@@ -1676,7 +1624,7 @@ static void FillDistancesPrices(CLzmaEnc - p->matchPriceCount = 0; - } - --void LzmaEnc_Construct(CLzmaEnc *p) -+static void LzmaEnc_Construct(CLzmaEnc *p) - { - RangeEnc_Construct(&p->rc); - MatchFinder_Construct(&p->matchFinderBase); -@@ -1709,7 +1657,7 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc * - return p; - } - --void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) -+static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) - { - alloc->Free(alloc, p->litProbs); - alloc->Free(alloc, p->saveState.litProbs); -@@ -1717,7 +1665,7 @@ void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAl - p->saveState.litProbs = 0; - } - --void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) -+static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) - { - #ifndef _7ZIP_ST - MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); -@@ -1947,7 +1895,7 @@ static SRes LzmaEnc_Alloc(CLzmaEnc *p, U - return SZ_OK; - } - --void LzmaEnc_Init(CLzmaEnc *p) -+static void LzmaEnc_Init(CLzmaEnc *p) - { - UInt32 i; - p->state = 0; -@@ -2005,7 +1953,7 @@ void LzmaEnc_Init(CLzmaEnc *p) - p->lpMask = (1 << p->lp) - 1; - } - --void LzmaEnc_InitPrices(CLzmaEnc *p) -+static void LzmaEnc_InitPrices(CLzmaEnc *p) - { - if (!p->fastMode) - { -@@ -2037,26 +1985,6 @@ static SRes LzmaEnc_AllocAndInit(CLzmaEn - return SZ_OK; - } - --static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, -- ISzAlloc *alloc, ISzAlloc *allocBig) --{ -- CLzmaEnc *p = (CLzmaEnc *)pp; -- p->matchFinderBase.stream = inStream; -- p->needInit = 1; -- p->rc.outStream = outStream; -- return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); --} -- --SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, -- ISeqInStream *inStream, UInt32 keepWindowSize, -- ISzAlloc *alloc, ISzAlloc *allocBig) --{ -- CLzmaEnc *p = (CLzmaEnc *)pp; -- p->matchFinderBase.stream = inStream; -- p->needInit = 1; -- return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); --} -- - static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) - { - p->matchFinderBase.directInput = 1; -@@ -2064,7 +1992,7 @@ static void LzmaEnc_SetInputBuf(CLzmaEnc - p->matchFinderBase.directInputRem = srcLen; - } - --SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, -+static SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, - UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) - { - CLzmaEnc *p = (CLzmaEnc *)pp; -@@ -2074,7 +2002,7 @@ SRes LzmaEnc_MemPrepare(CLzmaEncHandle p - return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); - } - --void LzmaEnc_Finish(CLzmaEncHandle pp) -+static void LzmaEnc_Finish(CLzmaEncHandle pp) - { - #ifndef _7ZIP_ST - CLzmaEnc *p = (CLzmaEnc *)pp; -@@ -2107,53 +2035,6 @@ static size_t MyWrite(void *pp, const vo - return size; - } - -- --UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp) --{ -- const CLzmaEnc *p = (CLzmaEnc *)pp; -- return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); --} -- --const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) --{ -- const CLzmaEnc *p = (CLzmaEnc *)pp; -- return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; --} -- --SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, -- Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) --{ -- CLzmaEnc *p = (CLzmaEnc *)pp; -- UInt64 nowPos64; -- SRes res; -- CSeqOutStreamBuf outStream; -- -- outStream.funcTable.Write = MyWrite; -- outStream.data = dest; -- outStream.rem = *destLen; -- outStream.overflow = False; -- -- p->writeEndMark = False; -- p->finished = False; -- p->result = SZ_OK; -- -- if (reInit) -- LzmaEnc_Init(p); -- LzmaEnc_InitPrices(p); -- nowPos64 = p->nowPos64; -- RangeEnc_Init(&p->rc); -- p->rc.outStream = &outStream.funcTable; -- -- res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize); -- -- *unpackSize = (UInt32)(p->nowPos64 - nowPos64); -- *destLen -= outStream.rem; -- if (outStream.overflow) -- return SZ_ERROR_OUTPUT_EOF; -- -- return res; --} -- - static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) - { - SRes res = SZ_OK; -@@ -2184,13 +2065,6 @@ static SRes LzmaEnc_Encode2(CLzmaEnc *p, - return res; - } - --SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, -- ISzAlloc *alloc, ISzAlloc *allocBig) --{ -- RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig)); -- return LzmaEnc_Encode2((CLzmaEnc *)pp, progress); --} -- - SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) - { - CLzmaEnc *p = (CLzmaEnc *)pp; -@@ -2247,25 +2121,3 @@ SRes LzmaEnc_MemEncode(CLzmaEncHandle pp - return SZ_ERROR_OUTPUT_EOF; - return res; - } -- --SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -- const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, -- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) --{ -- CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); -- SRes res; -- if (p == 0) -- return SZ_ERROR_MEM; -- -- res = LzmaEnc_SetProps(p, props); -- if (res == SZ_OK) -- { -- res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize); -- if (res == SZ_OK) -- res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen, -- writeEndMark, progress, alloc, allocBig); -- } -- -- LzmaEnc_Destroy(p, alloc, allocBig); -- return res; --} diff --git a/target/linux/generic/hack-5.10/600-bridge_offload.patch b/target/linux/generic/hack-5.10/600-bridge_offload.patch deleted file mode 100644 index b704c98dc8..0000000000 --- a/target/linux/generic/hack-5.10/600-bridge_offload.patch +++ /dev/null @@ -1,817 +0,0 @@ ---- a/include/linux/if_bridge.h -+++ b/include/linux/if_bridge.h -@@ -57,6 +57,7 @@ struct br_ip_list { - #define BR_MRP_LOST_CONT BIT(18) - #define BR_MRP_LOST_IN_CONT BIT(19) - #define BR_BPDU_FILTER BIT(20) -+#define BR_OFFLOAD BIT(21) - - #define BR_DEFAULT_AGEING_TIME (300 * HZ) - ---- a/net/bridge/Makefile -+++ b/net/bridge/Makefile -@@ -5,7 +5,7 @@ - - obj-$(CONFIG_BRIDGE) += bridge.o - --bridge-y := br.o br_device.o br_fdb.o br_forward.o br_if.o br_input.o \ -+bridge-y := br.o br_device.o br_fdb.o br_forward.o br_if.o br_input.o br_offload.o \ - br_ioctl.o br_stp.o br_stp_bpdu.o \ - br_stp_if.o br_stp_timer.o br_netlink.o \ - br_netlink_tunnel.o br_arp_nd_proxy.o ---- a/net/bridge/br.c -+++ b/net/bridge/br.c -@@ -18,6 +18,7 @@ - #include - - #include "br_private.h" -+#include "br_private_offload.h" - - /* - * Handle changes in state of network devices enslaved to a bridge. -@@ -332,6 +333,10 @@ static int __init br_init(void) - if (err) - goto err_out; - -+ err = br_offload_init(); -+ if (err) -+ goto err_out0; -+ - err = register_pernet_subsys(&br_net_ops); - if (err) - goto err_out1; -@@ -375,6 +380,8 @@ err_out3: - err_out2: - unregister_pernet_subsys(&br_net_ops); - err_out1: -+ br_offload_fini(); -+err_out0: - br_fdb_fini(); - err_out: - stp_proto_unregister(&br_stp_proto); -@@ -396,6 +403,7 @@ static void __exit br_deinit(void) - #if IS_ENABLED(CONFIG_ATM_LANE) - br_fdb_test_addr_hook = NULL; - #endif -+ br_offload_fini(); - br_fdb_fini(); - } - ---- a/net/bridge/br_device.c -+++ b/net/bridge/br_device.c -@@ -529,6 +529,8 @@ void br_dev_setup(struct net_device *dev - br->bridge_hello_time = br->hello_time = 2 * HZ; - br->bridge_forward_delay = br->forward_delay = 15 * HZ; - br->bridge_ageing_time = br->ageing_time = BR_DEFAULT_AGEING_TIME; -+ br->offload_cache_size = 128; -+ br->offload_cache_reserved = 8; - dev->max_mtu = ETH_MAX_MTU; - - br_netfilter_rtable_init(br); ---- a/net/bridge/br_fdb.c -+++ b/net/bridge/br_fdb.c -@@ -23,6 +23,7 @@ - #include - #include - #include "br_private.h" -+#include "br_private_offload.h" - - static const struct rhashtable_params br_fdb_rht_params = { - .head_offset = offsetof(struct net_bridge_fdb_entry, rhnode), -@@ -513,6 +514,8 @@ static struct net_bridge_fdb_entry *fdb_ - fdb->key.vlan_id = vid; - fdb->flags = flags; - fdb->updated = fdb->used = jiffies; -+ INIT_HLIST_HEAD(&fdb->offload_in); -+ INIT_HLIST_HEAD(&fdb->offload_out); - if (rhashtable_lookup_insert_fast(&br->fdb_hash_tbl, - &fdb->rhnode, - br_fdb_rht_params)) { -@@ -734,6 +737,8 @@ static void fdb_notify(struct net_bridge - struct sk_buff *skb; - int err = -ENOBUFS; - -+ br_offload_fdb_update(fdb); -+ - if (swdev_notify) - br_switchdev_fdb_notify(br, fdb, type); - ---- a/net/bridge/br_forward.c -+++ b/net/bridge/br_forward.c -@@ -16,6 +16,7 @@ - #include - #include - #include "br_private.h" -+#include "br_private_offload.h" - - /* Don't forward packets to originating port or forwarding disabled */ - static inline int should_deliver(const struct net_bridge_port *p, -@@ -32,6 +33,8 @@ static inline int should_deliver(const s - - int br_dev_queue_push_xmit(struct net *net, struct sock *sk, struct sk_buff *skb) - { -+ br_offload_output(skb); -+ - skb_push(skb, ETH_HLEN); - if (!is_skb_forwardable(skb->dev, skb)) - goto drop; ---- a/net/bridge/br_if.c -+++ b/net/bridge/br_if.c -@@ -25,6 +25,7 @@ - #include - - #include "br_private.h" -+#include "br_private_offload.h" - - /* - * Determine initial path cost based on speed. -@@ -427,7 +428,7 @@ static struct net_bridge_port *new_nbp(s - p->path_cost = port_cost(dev); - p->priority = 0x8000 >> BR_PORT_BITS; - p->port_no = index; -- p->flags = BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_BCAST_FLOOD; -+ p->flags = BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_BCAST_FLOOD | BR_OFFLOAD; - br_init_port(p); - br_set_state(p, BR_STATE_DISABLED); - br_stp_port_timer_init(p); -@@ -777,6 +778,9 @@ void br_port_flags_change(struct net_bri - - if (mask & BR_NEIGH_SUPPRESS) - br_recalculate_neigh_suppress_enabled(br); -+ -+ if (mask & BR_OFFLOAD) -+ br_offload_port_state(p); - } - - bool br_port_flag_is_set(const struct net_device *dev, unsigned long flag) ---- a/net/bridge/br_input.c -+++ b/net/bridge/br_input.c -@@ -22,6 +22,7 @@ - #include - #include "br_private.h" - #include "br_private_tunnel.h" -+#include "br_private_offload.h" - - static int - br_netif_receive_skb(struct net *net, struct sock *sk, struct sk_buff *skb) -@@ -169,6 +170,7 @@ int br_handle_frame_finish(struct net *n - dst->used = now; - br_forward(dst->dst, skb, local_rcv, false); - } else { -+ br_offload_skb_disable(skb); - if (!mcast_hit) - br_flood(br, skb, pkt_type, local_rcv, false); - else -@@ -287,6 +289,9 @@ static rx_handler_result_t br_handle_fra - memset(skb->cb, 0, sizeof(struct br_input_skb_cb)); - - p = br_port_get_rcu(skb->dev); -+ if (br_offload_input(p, skb)) -+ return RX_HANDLER_CONSUMED; -+ - if (p->flags & BR_VLAN_TUNNEL) { - if (br_handle_ingress_vlan_tunnel(skb, p, - nbp_vlan_group_rcu(p))) ---- /dev/null -+++ b/net/bridge/br_offload.c -@@ -0,0 +1,436 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+#include -+#include -+#include "br_private.h" -+#include "br_private_offload.h" -+ -+static DEFINE_SPINLOCK(offload_lock); -+ -+struct bridge_flow_key { -+ u8 dest[ETH_ALEN]; -+ u8 src[ETH_ALEN]; -+#ifdef CONFIG_BRIDGE_VLAN_FILTERING -+ u16 vlan_tag; -+ bool vlan_present; -+#endif -+}; -+ -+struct bridge_flow { -+ struct net_bridge_port *port; -+ struct rhash_head node; -+ struct bridge_flow_key key; -+#ifdef CONFIG_BRIDGE_VLAN_FILTERING -+ bool vlan_out_present; -+ u16 vlan_out; -+#endif -+ -+ unsigned long used; -+ struct net_bridge_fdb_entry *fdb_in, *fdb_out; -+ struct hlist_node fdb_list_in, fdb_list_out; -+ -+ struct rcu_head rcu; -+}; -+ -+static const struct rhashtable_params flow_params = { -+ .automatic_shrinking = true, -+ .head_offset = offsetof(struct bridge_flow, node), -+ .key_len = sizeof(struct bridge_flow_key), -+ .key_offset = offsetof(struct bridge_flow, key), -+}; -+ -+static struct kmem_cache *offload_cache __read_mostly; -+ -+static void -+flow_rcu_free(struct rcu_head *head) -+{ -+ struct bridge_flow *flow; -+ -+ flow = container_of(head, struct bridge_flow, rcu); -+ kmem_cache_free(offload_cache, flow); -+} -+ -+static void -+__br_offload_flow_free(struct bridge_flow *flow) -+{ -+ flow->used = 0; -+ hlist_del(&flow->fdb_list_in); -+ hlist_del(&flow->fdb_list_out); -+ -+ call_rcu(&flow->rcu, flow_rcu_free); -+} -+ -+static void -+br_offload_flow_free(struct bridge_flow *flow) -+{ -+ if (rhashtable_remove_fast(&flow->port->offload.rht, &flow->node, -+ flow_params) != 0) -+ return; -+ -+ __br_offload_flow_free(flow); -+} -+ -+static bool -+br_offload_flow_fdb_refresh_time(struct bridge_flow *flow, -+ struct net_bridge_fdb_entry *fdb) -+{ -+ if (!time_after(flow->used, fdb->updated)) -+ return false; -+ -+ fdb->updated = flow->used; -+ -+ return true; -+} -+ -+ -+static void -+br_offload_flow_refresh_time(struct bridge_flow *flow) -+{ -+ br_offload_flow_fdb_refresh_time(flow, flow->fdb_in); -+ br_offload_flow_fdb_refresh_time(flow, flow->fdb_out); -+} -+ -+static void -+br_offload_destroy_cb(void *ptr, void *arg) -+{ -+ struct bridge_flow *flow = ptr; -+ -+ __br_offload_flow_free(flow); -+} -+ -+static bool -+br_offload_need_gc(struct net_bridge_port *p) -+{ -+ return (atomic_read(&p->offload.rht.nelems) + -+ p->br->offload_cache_reserved) >= p->br->offload_cache_size; -+} -+ -+static void -+br_offload_gc_work(struct work_struct *work) -+{ -+ struct rhashtable_iter hti; -+ struct net_bridge_port *p; -+ struct bridge_flow *gc_flow = NULL; -+ struct bridge_flow *flow; -+ unsigned long gc_used; -+ -+ p = container_of(work, struct net_bridge_port, offload.gc_work); -+ -+ if (!br_offload_need_gc(p)) -+ return; -+ -+ rhashtable_walk_enter(&p->offload.rht, &hti); -+ rhashtable_walk_start(&hti); -+ while ((flow = rhashtable_walk_next(&hti)) != NULL) { -+ unsigned long used; -+ -+ if (IS_ERR(flow)) -+ continue; -+ -+ used = READ_ONCE(flow->used); -+ if (!used) -+ continue; -+ -+ if (gc_flow && !time_before(used, gc_used)) -+ continue; -+ -+ gc_flow = flow; -+ gc_used = used; -+ } -+ rhashtable_walk_stop(&hti); -+ rhashtable_walk_exit(&hti); -+ -+ if (!gc_flow) -+ return; -+ -+ spin_lock_bh(&offload_lock); -+ if (br_offload_need_gc(p) && gc_flow && -+ gc_flow->used == gc_used) -+ br_offload_flow_free(gc_flow); -+ if (p->offload.enabled && br_offload_need_gc(p)) -+ queue_work(system_long_wq, work); -+ spin_unlock_bh(&offload_lock); -+ -+} -+ -+void br_offload_port_state(struct net_bridge_port *p) -+{ -+ struct net_bridge_port_offload *o = &p->offload; -+ bool enabled = true; -+ bool flush = false; -+ -+ if (p->state != BR_STATE_FORWARDING || -+ !(p->flags & BR_OFFLOAD)) -+ enabled = false; -+ -+ spin_lock_bh(&offload_lock); -+ if (o->enabled == enabled) -+ goto out; -+ -+ if (enabled) { -+ if (!o->gc_work.func) -+ INIT_WORK(&o->gc_work, br_offload_gc_work); -+ rhashtable_init(&o->rht, &flow_params); -+ } else { -+ flush = true; -+ rhashtable_free_and_destroy(&o->rht, br_offload_destroy_cb, o); -+ } -+ -+ o->enabled = enabled; -+ -+out: -+ spin_unlock_bh(&offload_lock); -+ -+ if (flush) -+ flush_work(&o->gc_work); -+} -+ -+void br_offload_fdb_update(const struct net_bridge_fdb_entry *fdb) -+{ -+ struct bridge_flow *f; -+ struct hlist_node *tmp; -+ -+ spin_lock_bh(&offload_lock); -+ -+ hlist_for_each_entry_safe(f, tmp, &fdb->offload_in, fdb_list_in) -+ br_offload_flow_free(f); -+ -+ hlist_for_each_entry_safe(f, tmp, &fdb->offload_out, fdb_list_out) -+ br_offload_flow_free(f); -+ -+ spin_unlock_bh(&offload_lock); -+} -+ -+static void -+br_offload_prepare_key(struct net_bridge_port *p, struct bridge_flow_key *key, -+ struct sk_buff *skb) -+{ -+ memset(key, 0, sizeof(*key)); -+ memcpy(key, eth_hdr(skb), 2 * ETH_ALEN); -+#ifdef CONFIG_BRIDGE_VLAN_FILTERING -+ if (!br_opt_get(p->br, BROPT_VLAN_ENABLED)) -+ return; -+ -+ if (!skb_vlan_tag_present(skb) || skb->vlan_proto != p->br->vlan_proto) -+ return; -+ -+ key->vlan_present = true; -+ key->vlan_tag = skb_vlan_tag_get_id(skb); -+#endif -+} -+ -+void br_offload_output(struct sk_buff *skb) -+{ -+ struct net_bridge_port_offload *o; -+ struct br_input_skb_cb *cb = (struct br_input_skb_cb *)skb->cb; -+ struct net_bridge_port *p, *inp; -+ struct net_device *dev; -+ struct net_bridge_fdb_entry *fdb_in, *fdb_out; -+ struct net_bridge_vlan_group *vg; -+ struct bridge_flow_key key; -+ struct bridge_flow *flow; -+ u16 vlan; -+ -+ if (!cb->offload) -+ return; -+ -+ rcu_read_lock(); -+ -+ p = br_port_get_rcu(skb->dev); -+ if (!p) -+ goto out; -+ -+ o = &p->offload; -+ if (!o->enabled) -+ goto out; -+ -+ if (atomic_read(&p->offload.rht.nelems) >= p->br->offload_cache_size) -+ goto out; -+ -+ dev = dev_get_by_index_rcu(dev_net(p->br->dev), cb->input_ifindex); -+ if (!dev) -+ goto out; -+ -+ inp = br_port_get_rcu(dev); -+ if (!inp) -+ goto out; -+ -+ vg = nbp_vlan_group_rcu(inp); -+ vlan = cb->input_vlan_present ? cb->input_vlan_tag : br_get_pvid(vg); -+ fdb_in = br_fdb_find_rcu(p->br, eth_hdr(skb)->h_source, vlan); -+ if (!fdb_in || !fdb_in->dst) -+ goto out; -+ -+ vg = nbp_vlan_group_rcu(p); -+ vlan = skb_vlan_tag_present(skb) ? skb_vlan_tag_get_id(skb) : br_get_pvid(vg); -+ fdb_out = br_fdb_find_rcu(p->br, eth_hdr(skb)->h_dest, vlan); -+ if (!fdb_out || !fdb_out->dst) -+ goto out; -+ -+ br_offload_prepare_key(p, &key, skb); -+#ifdef CONFIG_BRIDGE_VLAN_FILTERING -+ key.vlan_present = cb->input_vlan_present; -+ key.vlan_tag = cb->input_vlan_tag; -+#endif -+ -+ flow = kmem_cache_alloc(offload_cache, GFP_ATOMIC); -+ flow->port = inp; -+ memcpy(&flow->key, &key, sizeof(key)); -+ -+#ifdef CONFIG_BRIDGE_VLAN_FILTERING -+ flow->vlan_out_present = skb_vlan_tag_present(skb); -+ flow->vlan_out = skb_vlan_tag_get(skb); -+#endif -+ -+ flow->fdb_in = fdb_in; -+ flow->fdb_out = fdb_out; -+ flow->used = jiffies; -+ -+ spin_lock_bh(&offload_lock); -+ if (!o->enabled || -+ atomic_read(&p->offload.rht.nelems) >= p->br->offload_cache_size || -+ rhashtable_insert_fast(&inp->offload.rht, &flow->node, flow_params)) { -+ kmem_cache_free(offload_cache, flow); -+ goto out_unlock; -+ } -+ -+ hlist_add_head(&flow->fdb_list_in, &fdb_in->offload_in); -+ hlist_add_head(&flow->fdb_list_out, &fdb_out->offload_out); -+ -+ if (br_offload_need_gc(p)) -+ queue_work(system_long_wq, &p->offload.gc_work); -+ -+out_unlock: -+ spin_unlock_bh(&offload_lock); -+ -+out: -+ rcu_read_unlock(); -+} -+ -+bool br_offload_input(struct net_bridge_port *p, struct sk_buff *skb) -+{ -+ struct net_bridge_port_offload *o = &p->offload; -+ struct br_input_skb_cb *cb = (struct br_input_skb_cb *)skb->cb; -+ struct bridge_flow_key key; -+ struct net_bridge_port *dst; -+ struct bridge_flow *flow; -+ unsigned long now = jiffies; -+ bool ret = false; -+ -+ if (skb->len < sizeof(key)) -+ return false; -+ -+ if (!o->enabled) -+ return false; -+ -+ if (is_multicast_ether_addr(eth_hdr(skb)->h_dest)) -+ return false; -+ -+ br_offload_prepare_key(p, &key, skb); -+ -+ rcu_read_lock(); -+ flow = rhashtable_lookup(&o->rht, &key, flow_params); -+ if (!flow) { -+ cb->offload = 1; -+#ifdef CONFIG_BRIDGE_VLAN_FILTERING -+ cb->input_vlan_present = key.vlan_present != 0; -+ cb->input_vlan_tag = key.vlan_tag; -+#endif -+ cb->input_ifindex = p->dev->ifindex; -+ goto out; -+ } -+ -+ if (flow->fdb_in->dst != p) -+ goto out; -+ -+ dst = flow->fdb_out->dst; -+ if (!dst) -+ goto out; -+ -+ ret = true; -+#ifdef CONFIG_BRIDGE_VLAN_FILTERING -+ if (!flow->vlan_out_present && key.vlan_present) { -+ __vlan_hwaccel_clear_tag(skb); -+ } else if (flow->vlan_out_present) { -+ if (skb_vlan_tag_present(skb) && -+ skb->vlan_proto != p->br->vlan_proto) { -+ /* Protocol-mismatch, empty out vlan_tci for new tag */ -+ skb_push(skb, ETH_HLEN); -+ skb = vlan_insert_tag_set_proto(skb, skb->vlan_proto, -+ skb_vlan_tag_get(skb)); -+ if (unlikely(!skb)) -+ goto out; -+ -+ skb_pull(skb, ETH_HLEN); -+ skb_reset_mac_len(skb); -+ } -+ -+ __vlan_hwaccel_put_tag(skb, p->br->vlan_proto, -+ flow->vlan_out); -+ } -+#endif -+ -+ skb->dev = dst->dev; -+ skb_push(skb, ETH_HLEN); -+ -+ if (skb_warn_if_lro(skb) || !is_skb_forwardable(skb->dev, skb)) { -+ kfree_skb(skb); -+ goto out; -+ } -+ -+ if (now - flow->used >= HZ) { -+ flow->used = now; -+ br_offload_flow_refresh_time(flow); -+ } -+ -+ skb_forward_csum(skb); -+ dev_queue_xmit(skb); -+ -+out: -+ rcu_read_unlock(); -+ return ret; -+} -+ -+static void -+br_offload_check_gc(struct net_bridge *br) -+{ -+ struct net_bridge_port *p; -+ -+ spin_lock_bh(&br->lock); -+ list_for_each_entry(p, &br->port_list, list) -+ if (br_offload_need_gc(p)) -+ queue_work(system_long_wq, &p->offload.gc_work); -+ spin_unlock_bh(&br->lock); -+} -+ -+ -+int br_offload_set_cache_size(struct net_bridge *br, unsigned long val) -+{ -+ br->offload_cache_size = val; -+ br_offload_check_gc(br); -+ -+ return 0; -+} -+ -+int br_offload_set_cache_reserved(struct net_bridge *br, unsigned long val) -+{ -+ br->offload_cache_reserved = val; -+ br_offload_check_gc(br); -+ -+ return 0; -+} -+ -+int __init br_offload_init(void) -+{ -+ offload_cache = kmem_cache_create("bridge_offload_cache", -+ sizeof(struct bridge_flow), -+ 0, SLAB_HWCACHE_ALIGN, NULL); -+ if (!offload_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void br_offload_fini(void) -+{ -+ kmem_cache_destroy(offload_cache); -+} ---- a/net/bridge/br_private.h -+++ b/net/bridge/br_private.h -@@ -207,7 +207,13 @@ struct net_bridge_fdb_entry { - unsigned long updated ____cacheline_aligned_in_smp; - unsigned long used; - -- struct rcu_head rcu; -+ union { -+ struct { -+ struct hlist_head offload_in; -+ struct hlist_head offload_out; -+ }; -+ struct rcu_head rcu; -+ }; - }; - - #define MDB_PG_FLAGS_PERMANENT BIT(0) -@@ -280,6 +286,12 @@ struct net_bridge_mdb_entry { - struct rcu_head rcu; - }; - -+struct net_bridge_port_offload { -+ struct rhashtable rht; -+ struct work_struct gc_work; -+ bool enabled; -+}; -+ - struct net_bridge_port { - struct net_bridge *br; - struct net_device *dev; -@@ -337,6 +349,7 @@ struct net_bridge_port { - u16 backup_redirected_cnt; - - struct bridge_stp_xstats stp_xstats; -+ struct net_bridge_port_offload offload; - }; - - #define kobj_to_brport(obj) container_of(obj, struct net_bridge_port, kobj) -@@ -475,6 +488,9 @@ struct net_bridge { - struct kobject *ifobj; - u32 auto_cnt; - -+ u32 offload_cache_size; -+ u32 offload_cache_reserved; -+ - #ifdef CONFIG_NET_SWITCHDEV - int offload_fwd_mark; - #endif -@@ -501,6 +517,10 @@ struct br_input_skb_cb { - #ifdef CONFIG_NETFILTER_FAMILY_BRIDGE - u8 br_netfilter_broute:1; - #endif -+ u8 offload:1; -+ u8 input_vlan_present:1; -+ u16 input_vlan_tag; -+ int input_ifindex; - - #ifdef CONFIG_NET_SWITCHDEV - int offload_fwd_mark; ---- /dev/null -+++ b/net/bridge/br_private_offload.h -@@ -0,0 +1,21 @@ -+#ifndef __BR_OFFLOAD_H -+#define __BR_OFFLOAD_H -+ -+bool br_offload_input(struct net_bridge_port *p, struct sk_buff *skb); -+void br_offload_output(struct sk_buff *skb); -+void br_offload_port_state(struct net_bridge_port *p); -+void br_offload_fdb_update(const struct net_bridge_fdb_entry *fdb); -+int br_offload_init(void); -+void br_offload_fini(void); -+int br_offload_set_cache_size(struct net_bridge *br, unsigned long val); -+int br_offload_set_cache_reserved(struct net_bridge *br, unsigned long val); -+ -+static inline void br_offload_skb_disable(struct sk_buff *skb) -+{ -+ struct br_input_skb_cb *cb = (struct br_input_skb_cb *)skb->cb; -+ -+ if (cb->offload) -+ cb->offload = 0; -+} -+ -+#endif ---- a/net/bridge/br_stp.c -+++ b/net/bridge/br_stp.c -@@ -12,6 +12,7 @@ - - #include "br_private.h" - #include "br_private_stp.h" -+#include "br_private_offload.h" - - /* since time values in bpdu are in jiffies and then scaled (1/256) - * before sending, make sure that is at least one STP tick. -@@ -52,6 +53,8 @@ void br_set_state(struct net_bridge_port - (unsigned int) p->port_no, p->dev->name, - br_port_state_names[p->state]); - -+ br_offload_port_state(p); -+ - if (p->br->stp_enabled == BR_KERNEL_STP) { - switch (p->state) { - case BR_STATE_BLOCKING: ---- a/net/bridge/br_sysfs_br.c -+++ b/net/bridge/br_sysfs_br.c -@@ -18,6 +18,7 @@ - #include - - #include "br_private.h" -+#include "br_private_offload.h" - - #define to_bridge(cd) ((struct net_bridge *)netdev_priv(to_net_dev(cd))) - -@@ -842,6 +843,38 @@ static ssize_t vlan_stats_per_port_store - static DEVICE_ATTR_RW(vlan_stats_per_port); - #endif - -+static ssize_t offload_cache_size_show(struct device *d, -+ struct device_attribute *attr, -+ char *buf) -+{ -+ struct net_bridge *br = to_bridge(d); -+ return sprintf(buf, "%u\n", br->offload_cache_size); -+} -+ -+static ssize_t offload_cache_size_store(struct device *d, -+ struct device_attribute *attr, -+ const char *buf, size_t len) -+{ -+ return store_bridge_parm(d, buf, len, br_offload_set_cache_size); -+} -+static DEVICE_ATTR_RW(offload_cache_size); -+ -+static ssize_t offload_cache_reserved_show(struct device *d, -+ struct device_attribute *attr, -+ char *buf) -+{ -+ struct net_bridge *br = to_bridge(d); -+ return sprintf(buf, "%u\n", br->offload_cache_reserved); -+} -+ -+static ssize_t offload_cache_reserved_store(struct device *d, -+ struct device_attribute *attr, -+ const char *buf, size_t len) -+{ -+ return store_bridge_parm(d, buf, len, br_offload_set_cache_reserved); -+} -+static DEVICE_ATTR_RW(offload_cache_reserved); -+ - static struct attribute *bridge_attrs[] = { - &dev_attr_forward_delay.attr, - &dev_attr_hello_time.attr, -@@ -896,6 +929,8 @@ static struct attribute *bridge_attrs[] - &dev_attr_vlan_stats_enabled.attr, - &dev_attr_vlan_stats_per_port.attr, - #endif -+ &dev_attr_offload_cache_size.attr, -+ &dev_attr_offload_cache_reserved.attr, - NULL - }; - ---- a/net/bridge/br_sysfs_if.c -+++ b/net/bridge/br_sysfs_if.c -@@ -234,6 +234,7 @@ BRPORT_ATTR_FLAG(broadcast_flood, BR_BCA - BRPORT_ATTR_FLAG(neigh_suppress, BR_NEIGH_SUPPRESS); - BRPORT_ATTR_FLAG(isolated, BR_ISOLATED); - BRPORT_ATTR_FLAG(bpdu_filter, BR_BPDU_FILTER); -+BRPORT_ATTR_FLAG(offload, BR_OFFLOAD); - - #ifdef CONFIG_BRIDGE_IGMP_SNOOPING - static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf) -@@ -288,6 +289,7 @@ static const struct brport_attribute *br - &brport_attr_isolated, - &brport_attr_bpdu_filter, - &brport_attr_backup_port, -+ &brport_attr_offload, - NULL - }; - ---- a/net/bridge/br_vlan_tunnel.c -+++ b/net/bridge/br_vlan_tunnel.c -@@ -15,6 +15,7 @@ - - #include "br_private.h" - #include "br_private_tunnel.h" -+#include "br_private_offload.h" - - static inline int br_vlan_tunid_cmp(struct rhashtable_compare_arg *arg, - const void *ptr) -@@ -180,6 +181,7 @@ int br_handle_ingress_vlan_tunnel(struct - skb_dst_drop(skb); - - __vlan_hwaccel_put_tag(skb, p->br->vlan_proto, vlan->vid); -+ br_offload_skb_disable(skb); - - return 0; - } -@@ -203,6 +205,7 @@ int br_handle_egress_vlan_tunnel(struct - if (err) - return err; - -+ br_offload_skb_disable(skb); - tunnel_dst = rcu_dereference(vlan->tinfo.tunnel_dst); - if (tunnel_dst && dst_hold_safe(&tunnel_dst->dst)) - skb_dst_set(skb, &tunnel_dst->dst); diff --git a/target/linux/generic/hack-5.10/650-netfilter-add-xt_FLOWOFFLOAD-target.patch b/target/linux/generic/hack-5.10/650-netfilter-add-xt_FLOWOFFLOAD-target.patch deleted file mode 100644 index b83a185aeb..0000000000 --- a/target/linux/generic/hack-5.10/650-netfilter-add-xt_FLOWOFFLOAD-target.patch +++ /dev/null @@ -1,874 +0,0 @@ -From: Felix Fietkau -Date: Tue, 20 Feb 2018 15:56:02 +0100 -Subject: [PATCH] netfilter: add xt_FLOWOFFLOAD target - -Signed-off-by: Felix Fietkau ---- - create mode 100644 net/netfilter/xt_OFFLOAD.c - ---- a/net/ipv4/netfilter/Kconfig -+++ b/net/ipv4/netfilter/Kconfig -@@ -56,8 +56,6 @@ config NF_TABLES_ARP - help - This option enables the ARP support for nf_tables. - --endif # NF_TABLES -- - config NF_FLOW_TABLE_IPV4 - tristate "Netfilter flow table IPv4 module" - depends on NF_FLOW_TABLE -@@ -66,6 +64,8 @@ config NF_FLOW_TABLE_IPV4 - - To compile it as a module, choose M here. - -+endif # NF_TABLES -+ - config NF_DUP_IPV4 - tristate "Netfilter IPv4 packet duplication to alternate destination" - depends on !NF_CONNTRACK || NF_CONNTRACK ---- a/net/ipv6/netfilter/Kconfig -+++ b/net/ipv6/netfilter/Kconfig -@@ -45,7 +45,6 @@ config NFT_FIB_IPV6 - multicast or blackhole. - - endif # NF_TABLES_IPV6 --endif # NF_TABLES - - config NF_FLOW_TABLE_IPV6 - tristate "Netfilter flow table IPv6 module" -@@ -55,6 +54,8 @@ config NF_FLOW_TABLE_IPV6 - - To compile it as a module, choose M here. - -+endif # NF_TABLES -+ - config NF_DUP_IPV6 - tristate "Netfilter IPv6 packet duplication to alternate destination" - depends on !NF_CONNTRACK || NF_CONNTRACK ---- a/net/netfilter/Kconfig -+++ b/net/netfilter/Kconfig -@@ -682,8 +682,6 @@ config NFT_FIB_NETDEV - - endif # NF_TABLES_NETDEV - --endif # NF_TABLES -- - config NF_FLOW_TABLE_INET - tristate "Netfilter flow table mixed IPv4/IPv6 module" - depends on NF_FLOW_TABLE -@@ -692,11 +690,12 @@ config NF_FLOW_TABLE_INET - - To compile it as a module, choose M here. - -+endif # NF_TABLES -+ - config NF_FLOW_TABLE - tristate "Netfilter flow table module" - depends on NETFILTER_INGRESS - depends on NF_CONNTRACK -- depends on NF_TABLES - help - This option adds the flow table core infrastructure. - -@@ -976,6 +975,15 @@ config NETFILTER_XT_TARGET_NOTRACK - depends on NETFILTER_ADVANCED - select NETFILTER_XT_TARGET_CT - -+config NETFILTER_XT_TARGET_FLOWOFFLOAD -+ tristate '"FLOWOFFLOAD" target support' -+ depends on NF_FLOW_TABLE -+ depends on NETFILTER_INGRESS -+ help -+ This option adds a `FLOWOFFLOAD' target, which uses the nf_flow_offload -+ module to speed up processing of packets by bypassing the usual -+ netfilter chains -+ - config NETFILTER_XT_TARGET_RATEEST - tristate '"RATEEST" target support' - depends on NETFILTER_ADVANCED ---- a/net/netfilter/Makefile -+++ b/net/netfilter/Makefile -@@ -145,6 +145,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CLASSIF - obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o - obj-$(CONFIG_NETFILTER_XT_TARGET_CT) += xt_CT.o - obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o -+obj-$(CONFIG_NETFILTER_XT_TARGET_FLOWOFFLOAD) += xt_FLOWOFFLOAD.o - obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o - obj-$(CONFIG_NETFILTER_XT_TARGET_HMARK) += xt_HMARK.o - obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o ---- /dev/null -+++ b/net/netfilter/xt_FLOWOFFLOAD.c -@@ -0,0 +1,712 @@ -+/* -+ * Copyright (C) 2018-2021 Felix Fietkau -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+struct xt_flowoffload_hook { -+ struct hlist_node list; -+ struct nf_hook_ops ops; -+ struct net *net; -+ bool registered; -+ bool used; -+}; -+ -+struct xt_flowoffload_table { -+ struct nf_flowtable ft; -+ struct hlist_head hooks; -+ struct delayed_work work; -+}; -+ -+struct nf_forward_info { -+ const struct net_device *indev; -+ const struct net_device *outdev; -+ const struct net_device *hw_outdev; -+ struct id { -+ __u16 id; -+ __be16 proto; -+ } encap[NF_FLOW_TABLE_ENCAP_MAX]; -+ u8 num_encaps; -+ u8 ingress_vlans; -+ u8 h_source[ETH_ALEN]; -+ u8 h_dest[ETH_ALEN]; -+ enum flow_offload_xmit_type xmit_type; -+}; -+ -+static DEFINE_SPINLOCK(hooks_lock); -+ -+struct xt_flowoffload_table flowtable[2]; -+ -+static inline __be16 nf_flow_pppoe_proto(const struct sk_buff *skb) -+{ -+ __be16 proto; -+ -+ proto = *((__be16 *)(skb_mac_header(skb) + ETH_HLEN + -+ sizeof(struct pppoe_hdr))); -+ switch (proto) { -+ case htons(PPP_IP): -+ return htons(ETH_P_IP); -+ case htons(PPP_IPV6): -+ return htons(ETH_P_IPV6); -+ } -+ -+ return 0; -+} -+ -+static unsigned int -+xt_flowoffload_net_hook(void *priv, struct sk_buff *skb, -+ const struct nf_hook_state *state) -+{ -+ struct vlan_ethhdr *veth; -+ __be16 proto; -+ -+ switch (skb->protocol) { -+ case htons(ETH_P_8021Q): -+ veth = (struct vlan_ethhdr *)skb_mac_header(skb); -+ proto = veth->h_vlan_encapsulated_proto; -+ break; -+ case htons(ETH_P_PPP_SES): -+ proto = nf_flow_pppoe_proto(skb); -+ break; -+ default: -+ proto = skb->protocol; -+ break; -+ } -+ -+ switch (proto) { -+ case htons(ETH_P_IP): -+ return nf_flow_offload_ip_hook(priv, skb, state); -+ case htons(ETH_P_IPV6): -+ return nf_flow_offload_ipv6_hook(priv, skb, state); -+ } -+ -+ return NF_ACCEPT; -+} -+ -+static int -+xt_flowoffload_create_hook(struct xt_flowoffload_table *table, -+ struct net_device *dev) -+{ -+ struct xt_flowoffload_hook *hook; -+ struct nf_hook_ops *ops; -+ -+ hook = kzalloc(sizeof(*hook), GFP_ATOMIC); -+ if (!hook) -+ return -ENOMEM; -+ -+ ops = &hook->ops; -+ ops->pf = NFPROTO_NETDEV; -+ ops->hooknum = NF_NETDEV_INGRESS; -+ ops->priority = 10; -+ ops->priv = &table->ft; -+ ops->hook = xt_flowoffload_net_hook; -+ ops->dev = dev; -+ -+ hlist_add_head(&hook->list, &table->hooks); -+ mod_delayed_work(system_power_efficient_wq, &table->work, 0); -+ -+ return 0; -+} -+ -+static struct xt_flowoffload_hook * -+flow_offload_lookup_hook(struct xt_flowoffload_table *table, -+ struct net_device *dev) -+{ -+ struct xt_flowoffload_hook *hook; -+ -+ hlist_for_each_entry(hook, &table->hooks, list) { -+ if (hook->ops.dev == dev) -+ return hook; -+ } -+ -+ return NULL; -+} -+ -+static void -+xt_flowoffload_check_device(struct xt_flowoffload_table *table, -+ struct net_device *dev) -+{ -+ struct xt_flowoffload_hook *hook; -+ -+ if (!dev) -+ return; -+ -+ spin_lock_bh(&hooks_lock); -+ hook = flow_offload_lookup_hook(table, dev); -+ if (hook) -+ hook->used = true; -+ else -+ xt_flowoffload_create_hook(table, dev); -+ spin_unlock_bh(&hooks_lock); -+} -+ -+static void -+xt_flowoffload_register_hooks(struct xt_flowoffload_table *table) -+{ -+ struct xt_flowoffload_hook *hook; -+ -+restart: -+ hlist_for_each_entry(hook, &table->hooks, list) { -+ if (hook->registered) -+ continue; -+ -+ hook->registered = true; -+ hook->net = dev_net(hook->ops.dev); -+ spin_unlock_bh(&hooks_lock); -+ nf_register_net_hook(hook->net, &hook->ops); -+ if (table->ft.flags & NF_FLOWTABLE_HW_OFFLOAD) -+ table->ft.type->setup(&table->ft, hook->ops.dev, -+ FLOW_BLOCK_BIND); -+ spin_lock_bh(&hooks_lock); -+ goto restart; -+ } -+ -+} -+ -+static bool -+xt_flowoffload_cleanup_hooks(struct xt_flowoffload_table *table) -+{ -+ struct xt_flowoffload_hook *hook; -+ bool active = false; -+ -+restart: -+ spin_lock_bh(&hooks_lock); -+ hlist_for_each_entry(hook, &table->hooks, list) { -+ if (hook->used || !hook->registered) { -+ active = true; -+ continue; -+ } -+ -+ hlist_del(&hook->list); -+ spin_unlock_bh(&hooks_lock); -+ if (table->ft.flags & NF_FLOWTABLE_HW_OFFLOAD) -+ table->ft.type->setup(&table->ft, hook->ops.dev, -+ FLOW_BLOCK_UNBIND); -+ nf_unregister_net_hook(hook->net, &hook->ops); -+ kfree(hook); -+ goto restart; -+ } -+ spin_unlock_bh(&hooks_lock); -+ -+ return active; -+} -+ -+static void -+xt_flowoffload_check_hook(struct flow_offload *flow, void *data) -+{ -+ struct xt_flowoffload_table *table = data; -+ struct flow_offload_tuple *tuple0 = &flow->tuplehash[0].tuple; -+ struct flow_offload_tuple *tuple1 = &flow->tuplehash[1].tuple; -+ struct xt_flowoffload_hook *hook; -+ -+ spin_lock_bh(&hooks_lock); -+ hlist_for_each_entry(hook, &table->hooks, list) { -+ if (hook->ops.dev->ifindex != tuple0->iifidx && -+ hook->ops.dev->ifindex != tuple1->iifidx) -+ continue; -+ -+ hook->used = true; -+ } -+ spin_unlock_bh(&hooks_lock); -+} -+ -+static void -+xt_flowoffload_hook_work(struct work_struct *work) -+{ -+ struct xt_flowoffload_table *table; -+ struct xt_flowoffload_hook *hook; -+ int err; -+ -+ table = container_of(work, struct xt_flowoffload_table, work.work); -+ -+ spin_lock_bh(&hooks_lock); -+ xt_flowoffload_register_hooks(table); -+ hlist_for_each_entry(hook, &table->hooks, list) -+ hook->used = false; -+ spin_unlock_bh(&hooks_lock); -+ -+ err = nf_flow_table_iterate(&table->ft, xt_flowoffload_check_hook, -+ table); -+ if (err && err != -EAGAIN) -+ goto out; -+ -+ if (!xt_flowoffload_cleanup_hooks(table)) -+ return; -+ -+out: -+ queue_delayed_work(system_power_efficient_wq, &table->work, HZ); -+} -+ -+static bool -+xt_flowoffload_skip(struct sk_buff *skb, int family) -+{ -+ if (skb_sec_path(skb)) -+ return true; -+ -+ if (family == NFPROTO_IPV4) { -+ const struct ip_options *opt = &(IPCB(skb)->opt); -+ -+ if (unlikely(opt->optlen)) -+ return true; -+ } -+ -+ return false; -+} -+ -+static enum flow_offload_xmit_type nf_xmit_type(struct dst_entry *dst) -+{ -+ if (dst_xfrm(dst)) -+ return FLOW_OFFLOAD_XMIT_XFRM; -+ -+ return FLOW_OFFLOAD_XMIT_NEIGH; -+} -+ -+static void nf_default_forward_path(struct nf_flow_route *route, -+ struct dst_entry *dst_cache, -+ enum ip_conntrack_dir dir, -+ struct net_device **dev) -+{ -+ dev[!dir] = dst_cache->dev; -+ route->tuple[!dir].in.ifindex = dst_cache->dev->ifindex; -+ route->tuple[dir].dst = dst_cache; -+ route->tuple[dir].xmit_type = nf_xmit_type(dst_cache); -+} -+ -+static bool nf_is_valid_ether_device(const struct net_device *dev) -+{ -+ if (!dev || (dev->flags & IFF_LOOPBACK) || dev->type != ARPHRD_ETHER || -+ dev->addr_len != ETH_ALEN || !is_valid_ether_addr(dev->dev_addr)) -+ return false; -+ -+ return true; -+} -+ -+static void nf_dev_path_info(const struct net_device_path_stack *stack, -+ struct nf_forward_info *info, -+ unsigned char *ha) -+{ -+ const struct net_device_path *path; -+ int i; -+ -+ memcpy(info->h_dest, ha, ETH_ALEN); -+ -+ for (i = 0; i < stack->num_paths; i++) { -+ path = &stack->path[i]; -+ switch (path->type) { -+ case DEV_PATH_ETHERNET: -+ case DEV_PATH_DSA: -+ case DEV_PATH_VLAN: -+ case DEV_PATH_PPPOE: -+ info->indev = path->dev; -+ if (is_zero_ether_addr(info->h_source)) -+ memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); -+ -+ if (path->type == DEV_PATH_ETHERNET) -+ break; -+ if (path->type == DEV_PATH_DSA) { -+ i = stack->num_paths; -+ break; -+ } -+ -+ /* DEV_PATH_VLAN and DEV_PATH_PPPOE */ -+ if (info->num_encaps >= NF_FLOW_TABLE_ENCAP_MAX) { -+ info->indev = NULL; -+ break; -+ } -+ if (!info->outdev) -+ info->outdev = path->dev; -+ info->encap[info->num_encaps].id = path->encap.id; -+ info->encap[info->num_encaps].proto = path->encap.proto; -+ info->num_encaps++; -+ if (path->type == DEV_PATH_PPPOE) -+ memcpy(info->h_dest, path->encap.h_dest, ETH_ALEN); -+ break; -+ case DEV_PATH_BRIDGE: -+ if (is_zero_ether_addr(info->h_source)) -+ memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); -+ -+ switch (path->bridge.vlan_mode) { -+ case DEV_PATH_BR_VLAN_UNTAG_HW: -+ info->ingress_vlans |= BIT(info->num_encaps - 1); -+ break; -+ case DEV_PATH_BR_VLAN_TAG: -+ info->encap[info->num_encaps].id = path->bridge.vlan_id; -+ info->encap[info->num_encaps].proto = path->bridge.vlan_proto; -+ info->num_encaps++; -+ break; -+ case DEV_PATH_BR_VLAN_UNTAG: -+ info->num_encaps--; -+ break; -+ case DEV_PATH_BR_VLAN_KEEP: -+ break; -+ } -+ break; -+ default: -+ info->indev = NULL; -+ break; -+ } -+ } -+ if (!info->outdev) -+ info->outdev = info->indev; -+ -+ info->hw_outdev = info->indev; -+ -+ if (nf_is_valid_ether_device(info->indev)) -+ info->xmit_type = FLOW_OFFLOAD_XMIT_DIRECT; -+} -+ -+static int nf_dev_fill_forward_path(const struct nf_flow_route *route, -+ const struct dst_entry *dst_cache, -+ const struct nf_conn *ct, -+ enum ip_conntrack_dir dir, u8 *ha, -+ struct net_device_path_stack *stack) -+{ -+ const void *daddr = &ct->tuplehash[!dir].tuple.src.u3; -+ struct net_device *dev = dst_cache->dev; -+ struct neighbour *n; -+ u8 nud_state; -+ -+ if (!nf_is_valid_ether_device(dev)) -+ goto out; -+ -+ n = dst_neigh_lookup(dst_cache, daddr); -+ if (!n) -+ return -1; -+ -+ read_lock_bh(&n->lock); -+ nud_state = n->nud_state; -+ ether_addr_copy(ha, n->ha); -+ read_unlock_bh(&n->lock); -+ neigh_release(n); -+ -+ if (!(nud_state & NUD_VALID)) -+ return -1; -+ -+out: -+ return dev_fill_forward_path(dev, ha, stack); -+} -+ -+static void nf_dev_forward_path(struct nf_flow_route *route, -+ const struct nf_conn *ct, -+ enum ip_conntrack_dir dir, -+ struct net_device **devs) -+{ -+ const struct dst_entry *dst = route->tuple[dir].dst; -+ struct net_device_path_stack stack; -+ struct nf_forward_info info = {}; -+ unsigned char ha[ETH_ALEN]; -+ int i; -+ -+ if (nf_dev_fill_forward_path(route, dst, ct, dir, ha, &stack) >= 0) -+ nf_dev_path_info(&stack, &info, ha); -+ -+ devs[!dir] = (struct net_device *)info.indev; -+ if (!info.indev) -+ return; -+ -+ route->tuple[!dir].in.ifindex = info.indev->ifindex; -+ for (i = 0; i < info.num_encaps; i++) { -+ route->tuple[!dir].in.encap[i].id = info.encap[i].id; -+ route->tuple[!dir].in.encap[i].proto = info.encap[i].proto; -+ } -+ route->tuple[!dir].in.num_encaps = info.num_encaps; -+ route->tuple[!dir].in.ingress_vlans = info.ingress_vlans; -+ -+ if (info.xmit_type == FLOW_OFFLOAD_XMIT_DIRECT) { -+ memcpy(route->tuple[dir].out.h_source, info.h_source, ETH_ALEN); -+ memcpy(route->tuple[dir].out.h_dest, info.h_dest, ETH_ALEN); -+ route->tuple[dir].out.ifindex = info.outdev->ifindex; -+ route->tuple[dir].out.hw_ifindex = info.hw_outdev->ifindex; -+ route->tuple[dir].xmit_type = info.xmit_type; -+ } -+} -+ -+static int -+xt_flowoffload_route(struct sk_buff *skb, const struct nf_conn *ct, -+ const struct xt_action_param *par, -+ struct nf_flow_route *route, enum ip_conntrack_dir dir, -+ struct net_device **devs) -+{ -+ struct dst_entry *this_dst = skb_dst(skb); -+ struct dst_entry *other_dst = NULL; -+ struct flowi fl; -+ -+ memset(&fl, 0, sizeof(fl)); -+ switch (xt_family(par)) { -+ case NFPROTO_IPV4: -+ fl.u.ip4.daddr = ct->tuplehash[dir].tuple.src.u3.ip; -+ fl.u.ip4.flowi4_oif = xt_in(par)->ifindex; -+ break; -+ case NFPROTO_IPV6: -+ fl.u.ip6.saddr = ct->tuplehash[!dir].tuple.dst.u3.in6; -+ fl.u.ip6.daddr = ct->tuplehash[dir].tuple.src.u3.in6; -+ fl.u.ip6.flowi6_oif = xt_in(par)->ifindex; -+ break; -+ } -+ -+ nf_route(xt_net(par), &other_dst, &fl, false, xt_family(par)); -+ if (!other_dst) -+ return -ENOENT; -+ -+ nf_default_forward_path(route, this_dst, dir, devs); -+ nf_default_forward_path(route, other_dst, !dir, devs); -+ -+ if (route->tuple[dir].xmit_type == FLOW_OFFLOAD_XMIT_NEIGH && -+ route->tuple[!dir].xmit_type == FLOW_OFFLOAD_XMIT_NEIGH) { -+ nf_dev_forward_path(route, ct, dir, devs); -+ nf_dev_forward_path(route, ct, !dir, devs); -+ } -+ -+ return 0; -+} -+ -+static unsigned int -+flowoffload_tg(struct sk_buff *skb, const struct xt_action_param *par) -+{ -+ struct xt_flowoffload_table *table; -+ const struct xt_flowoffload_target_info *info = par->targinfo; -+ struct tcphdr _tcph, *tcph = NULL; -+ enum ip_conntrack_info ctinfo; -+ enum ip_conntrack_dir dir; -+ struct nf_flow_route route = {}; -+ struct flow_offload *flow = NULL; -+ struct net_device *devs[2] = {}; -+ struct nf_conn *ct; -+ struct net *net; -+ -+ if (xt_flowoffload_skip(skb, xt_family(par))) -+ return XT_CONTINUE; -+ -+ ct = nf_ct_get(skb, &ctinfo); -+ if (ct == NULL) -+ return XT_CONTINUE; -+ -+ switch (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum) { -+ case IPPROTO_TCP: -+ if (ct->proto.tcp.state != TCP_CONNTRACK_ESTABLISHED) -+ return XT_CONTINUE; -+ -+ tcph = skb_header_pointer(skb, par->thoff, -+ sizeof(_tcph), &_tcph); -+ if (unlikely(!tcph || tcph->fin || tcph->rst)) -+ return XT_CONTINUE; -+ break; -+ case IPPROTO_UDP: -+ break; -+ default: -+ return XT_CONTINUE; -+ } -+ -+ if (nf_ct_ext_exist(ct, NF_CT_EXT_HELPER) || -+ ct->status & (IPS_SEQ_ADJUST | IPS_NAT_CLASH)) -+ return XT_CONTINUE; -+ -+ if (!nf_ct_is_confirmed(ct)) -+ return XT_CONTINUE; -+ -+ devs[dir] = xt_out(par); -+ devs[!dir] = xt_in(par); -+ -+ if (!devs[dir] || !devs[!dir]) -+ return XT_CONTINUE; -+ -+ if (test_and_set_bit(IPS_OFFLOAD_BIT, &ct->status)) -+ return XT_CONTINUE; -+ -+ dir = CTINFO2DIR(ctinfo); -+ -+ if (xt_flowoffload_route(skb, ct, par, &route, dir, devs) < 0) -+ goto err_flow_route; -+ -+ flow = flow_offload_alloc(ct); -+ if (!flow) -+ goto err_flow_alloc; -+ -+ if (flow_offload_route_init(flow, &route) < 0) -+ goto err_flow_add; -+ -+ if (tcph) { -+ ct->proto.tcp.seen[0].flags |= IP_CT_TCP_FLAG_BE_LIBERAL; -+ ct->proto.tcp.seen[1].flags |= IP_CT_TCP_FLAG_BE_LIBERAL; -+ } -+ -+ table = &flowtable[!!(info->flags & XT_FLOWOFFLOAD_HW)]; -+ -+ net = read_pnet(&table->ft.net); -+ if (!net) -+ write_pnet(&table->ft.net, xt_net(par)); -+ -+ if (flow_offload_add(&table->ft, flow) < 0) -+ goto err_flow_add; -+ -+ xt_flowoffload_check_device(table, devs[0]); -+ xt_flowoffload_check_device(table, devs[1]); -+ -+ dst_release(route.tuple[!dir].dst); -+ -+ return XT_CONTINUE; -+ -+err_flow_add: -+ flow_offload_free(flow); -+err_flow_alloc: -+ dst_release(route.tuple[!dir].dst); -+err_flow_route: -+ clear_bit(IPS_OFFLOAD_BIT, &ct->status); -+ -+ return XT_CONTINUE; -+} -+ -+static int flowoffload_chk(const struct xt_tgchk_param *par) -+{ -+ struct xt_flowoffload_target_info *info = par->targinfo; -+ -+ if (info->flags & ~XT_FLOWOFFLOAD_MASK) -+ return -EINVAL; -+ -+ return 0; -+} -+ -+static struct xt_target offload_tg_reg __read_mostly = { -+ .family = NFPROTO_UNSPEC, -+ .name = "FLOWOFFLOAD", -+ .revision = 0, -+ .targetsize = sizeof(struct xt_flowoffload_target_info), -+ .usersize = sizeof(struct xt_flowoffload_target_info), -+ .checkentry = flowoffload_chk, -+ .target = flowoffload_tg, -+ .me = THIS_MODULE, -+}; -+ -+static int flow_offload_netdev_event(struct notifier_block *this, -+ unsigned long event, void *ptr) -+{ -+ struct xt_flowoffload_hook *hook0, *hook1; -+ struct net_device *dev = netdev_notifier_info_to_dev(ptr); -+ -+ if (event != NETDEV_UNREGISTER) -+ return NOTIFY_DONE; -+ -+ spin_lock_bh(&hooks_lock); -+ hook0 = flow_offload_lookup_hook(&flowtable[0], dev); -+ if (hook0) -+ hlist_del(&hook0->list); -+ -+ hook1 = flow_offload_lookup_hook(&flowtable[1], dev); -+ if (hook1) -+ hlist_del(&hook1->list); -+ spin_unlock_bh(&hooks_lock); -+ -+ if (hook0) { -+ nf_unregister_net_hook(hook0->net, &hook0->ops); -+ kfree(hook0); -+ } -+ -+ if (hook1) { -+ nf_unregister_net_hook(hook1->net, &hook1->ops); -+ kfree(hook1); -+ } -+ -+ nf_flow_table_cleanup(dev); -+ -+ return NOTIFY_DONE; -+} -+ -+static struct notifier_block flow_offload_netdev_notifier = { -+ .notifier_call = flow_offload_netdev_event, -+}; -+ -+static int nf_flow_rule_route_inet(struct net *net, -+ const struct flow_offload *flow, -+ enum flow_offload_tuple_dir dir, -+ struct nf_flow_rule *flow_rule) -+{ -+ const struct flow_offload_tuple *flow_tuple = &flow->tuplehash[dir].tuple; -+ int err; -+ -+ switch (flow_tuple->l3proto) { -+ case NFPROTO_IPV4: -+ err = nf_flow_rule_route_ipv4(net, flow, dir, flow_rule); -+ break; -+ case NFPROTO_IPV6: -+ err = nf_flow_rule_route_ipv6(net, flow, dir, flow_rule); -+ break; -+ default: -+ err = -1; -+ break; -+ } -+ -+ return err; -+} -+ -+static struct nf_flowtable_type flowtable_inet = { -+ .family = NFPROTO_INET, -+ .init = nf_flow_table_init, -+ .setup = nf_flow_table_offload_setup, -+ .action = nf_flow_rule_route_inet, -+ .free = nf_flow_table_free, -+ .hook = xt_flowoffload_net_hook, -+ .owner = THIS_MODULE, -+}; -+ -+static int init_flowtable(struct xt_flowoffload_table *tbl) -+{ -+ INIT_DELAYED_WORK(&tbl->work, xt_flowoffload_hook_work); -+ tbl->ft.type = &flowtable_inet; -+ -+ return nf_flow_table_init(&tbl->ft); -+} -+ -+static int __init xt_flowoffload_tg_init(void) -+{ -+ int ret; -+ -+ register_netdevice_notifier(&flow_offload_netdev_notifier); -+ -+ ret = init_flowtable(&flowtable[0]); -+ if (ret) -+ return ret; -+ -+ ret = init_flowtable(&flowtable[1]); -+ if (ret) -+ goto cleanup; -+ -+ flowtable[1].ft.flags = NF_FLOWTABLE_HW_OFFLOAD; -+ -+ ret = xt_register_target(&offload_tg_reg); -+ if (ret) -+ goto cleanup2; -+ -+ return 0; -+ -+cleanup2: -+ nf_flow_table_free(&flowtable[1].ft); -+cleanup: -+ nf_flow_table_free(&flowtable[0].ft); -+ return ret; -+} -+ -+static void __exit xt_flowoffload_tg_exit(void) -+{ -+ xt_unregister_target(&offload_tg_reg); -+ unregister_netdevice_notifier(&flow_offload_netdev_notifier); -+ nf_flow_table_free(&flowtable[0].ft); -+ nf_flow_table_free(&flowtable[1].ft); -+} -+ -+MODULE_LICENSE("GPL"); -+module_init(xt_flowoffload_tg_init); -+module_exit(xt_flowoffload_tg_exit); ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -7,7 +7,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -380,8 +379,7 @@ flow_offload_lookup(struct nf_flowtable - } - EXPORT_SYMBOL_GPL(flow_offload_lookup); - --static int --nf_flow_table_iterate(struct nf_flowtable *flow_table, -+int nf_flow_table_iterate(struct nf_flowtable *flow_table, - void (*iter)(struct flow_offload *flow, void *data), - void *data) - { -@@ -413,6 +411,7 @@ nf_flow_table_iterate(struct nf_flowtabl - - return err; - } -+EXPORT_SYMBOL_GPL(nf_flow_table_iterate); - - static void nf_flow_offload_gc_step(struct flow_offload *flow, void *data) - { ---- /dev/null -+++ b/include/uapi/linux/netfilter/xt_FLOWOFFLOAD.h -@@ -0,0 +1,17 @@ -+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -+#ifndef _XT_FLOWOFFLOAD_H -+#define _XT_FLOWOFFLOAD_H -+ -+#include -+ -+enum { -+ XT_FLOWOFFLOAD_HW = 1 << 0, -+ -+ XT_FLOWOFFLOAD_MASK = XT_FLOWOFFLOAD_HW -+}; -+ -+struct xt_flowoffload_target_info { -+ __u32 flags; -+}; -+ -+#endif /* _XT_FLOWOFFLOAD_H */ ---- a/include/net/netfilter/nf_flow_table.h -+++ b/include/net/netfilter/nf_flow_table.h -@@ -271,6 +271,10 @@ void nf_flow_table_free(struct nf_flowta - - void flow_offload_teardown(struct flow_offload *flow); - -+int nf_flow_table_iterate(struct nf_flowtable *flow_table, -+ void (*iter)(struct flow_offload *flow, void *data), -+ void *data); -+ - void nf_flow_snat_port(const struct flow_offload *flow, - struct sk_buff *skb, unsigned int thoff, - u8 protocol, enum flow_offload_tuple_dir dir); diff --git a/target/linux/generic/hack-5.10/651-wireless_mesh_header.patch b/target/linux/generic/hack-5.10/651-wireless_mesh_header.patch deleted file mode 100644 index 0639ad4e48..0000000000 --- a/target/linux/generic/hack-5.10/651-wireless_mesh_header.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 6d3bc769657b0ee7c7506dad9911111c4226a7ea Mon Sep 17 00:00:00 2001 -From: Imre Kaloz -Date: Fri, 7 Jul 2017 17:21:05 +0200 -Subject: mac80211: increase wireless mesh header size - -lede-commit 3d4466cfd8f75f717efdb1f96fdde3c70d865fc1 -Signed-off-by: Imre Kaloz ---- - include/linux/netdevice.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -144,8 +144,8 @@ static inline bool dev_xmit_complete(int - - #if defined(CONFIG_HYPERV_NET) - # define LL_MAX_HEADER 128 --#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25) --# if defined(CONFIG_MAC80211_MESH) -+#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25) || 1 -+# if defined(CONFIG_MAC80211_MESH) || 1 - # define LL_MAX_HEADER 128 - # else - # define LL_MAX_HEADER 96 diff --git a/target/linux/generic/hack-5.10/661-kernel-ct-size-the-hashtable-more-adequately.patch b/target/linux/generic/hack-5.10/661-kernel-ct-size-the-hashtable-more-adequately.patch deleted file mode 100644 index dd67c76b13..0000000000 --- a/target/linux/generic/hack-5.10/661-kernel-ct-size-the-hashtable-more-adequately.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 804fbb3f2ec9283f7b778e057a68bfff440a0be6 Mon Sep 17 00:00:00 2001 -From: Rui Salvaterra -Date: Wed, 30 Mar 2022 22:51:55 +0100 -Subject: [PATCH] kernel: ct: size the hashtable more adequately - -To set the default size of the connection tracking hash table, a divider of -16384 becomes inadequate for a router handling lots of connections. Divide by -2048 instead, making the default size scale better with the available RAM. - -Signed-off-by: Rui Salvaterra ---- - net/netfilter/nf_conntrack_core.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/net/netfilter/nf_conntrack_core.c -+++ b/net/netfilter/nf_conntrack_core.c -@@ -2576,7 +2576,7 @@ int nf_conntrack_init_start(void) - - if (!nf_conntrack_htable_size) { - nf_conntrack_htable_size -- = (((nr_pages << PAGE_SHIFT) / 16384) -+ = (((nr_pages << PAGE_SHIFT) / 2048) - / sizeof(struct hlist_head)); - if (BITS_PER_LONG >= 64 && - nr_pages > (4 * (1024 * 1024 * 1024 / PAGE_SIZE))) diff --git a/target/linux/generic/hack-5.10/700-swconfig_switch_drivers.patch b/target/linux/generic/hack-5.10/700-swconfig_switch_drivers.patch deleted file mode 100644 index be199a25cf..0000000000 --- a/target/linux/generic/hack-5.10/700-swconfig_switch_drivers.patch +++ /dev/null @@ -1,129 +0,0 @@ -From 36e516290611e613aa92996cb4339561452695b4 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:24:23 +0200 -Subject: net: swconfig: adds librecmc switch layer - -Signed-off-by: Felix Fietkau ---- - drivers/net/phy/Kconfig | 83 +++++++++++++++++++++++++++++++++++++++++++++++ - drivers/net/phy/Makefile | 15 +++++++++ - include/uapi/linux/Kbuild | 1 + - 3 files changed, 99 insertions(+) - ---- a/drivers/net/phy/Kconfig -+++ b/drivers/net/phy/Kconfig -@@ -61,6 +61,80 @@ config SFP - depends on HWMON || HWMON=n - select MDIO_I2C - -+comment "Switch configuration API + drivers" -+ -+config SWCONFIG -+ tristate "Switch configuration API" -+ help -+ Switch configuration API using netlink. This allows -+ you to configure the VLAN features of certain switches. -+ -+config SWCONFIG_LEDS -+ bool "Switch LED trigger support" -+ depends on (SWCONFIG && LEDS_TRIGGERS) -+ -+config ADM6996_PHY -+ tristate "Driver for ADM6996 switches" -+ select SWCONFIG -+ help -+ Currently supports the ADM6996FC and ADM6996M switches. -+ Support for FC is very limited. -+ -+config AR8216_PHY -+ tristate "Driver for Atheros AR8216 switches" -+ select SWCONFIG -+ select ETHERNET_PACKET_MANGLE -+ -+config AR8216_PHY_LEDS -+ bool "Atheros AR8216 switch LED support" -+ depends on (AR8216_PHY && LEDS_CLASS) -+ -+source "drivers/net/phy/b53/Kconfig" -+ -+config IP17XX_PHY -+ tristate "Driver for IC+ IP17xx switches" -+ select SWCONFIG -+ -+config PSB6970_PHY -+ tristate "Lantiq XWAY Tantos (PSB6970) Ethernet switch" -+ select SWCONFIG -+ -+config RTL8306_PHY -+ tristate "Driver for Realtek RTL8306S switches" -+ select SWCONFIG -+ -+config RTL8366_SMI -+ tristate "Driver for the RTL8366 SMI interface" -+ depends on GPIOLIB -+ help -+ This module implements the SMI interface protocol which is used -+ by some RTL8366 ethernet switch devices via the generic GPIO API. -+ -+if RTL8366_SMI -+ -+config RTL8366_SMI_DEBUG_FS -+ bool "RTL8366 SMI interface debugfs support" -+ depends on DEBUG_FS -+ default n -+ -+config RTL8366S_PHY -+ tristate "Driver for the Realtek RTL8366S switch" -+ select SWCONFIG -+ -+config RTL8366RB_PHY -+ tristate "Driver for the Realtek RTL8366RB switch" -+ select SWCONFIG -+ -+config RTL8367_PHY -+ tristate "Driver for the Realtek RTL8367R/M switches" -+ select SWCONFIG -+ -+config RTL8367B_PHY -+ tristate "Driver fot the Realtek RTL8367R-VB switch" -+ select SWCONFIG -+ -+endif # RTL8366_SMI -+ - comment "MII PHY device drivers" - - config AMD_PHY ---- a/drivers/net/phy/Makefile -+++ b/drivers/net/phy/Makefile -@@ -24,6 +24,19 @@ libphy-$(CONFIG_LED_TRIGGER_PHY) += phy_ - obj-$(CONFIG_PHYLINK) += phylink.o - obj-$(CONFIG_PHYLIB) += libphy.o - -+obj-$(CONFIG_SWCONFIG) += swconfig.o -+obj-$(CONFIG_ADM6996_PHY) += adm6996.o -+obj-$(CONFIG_AR8216_PHY) += ar8216.o ar8327.o -+obj-$(CONFIG_SWCONFIG_B53) += b53/ -+obj-$(CONFIG_IP17XX_PHY) += ip17xx.o -+obj-$(CONFIG_PSB6970_PHY) += psb6970.o -+obj-$(CONFIG_RTL8306_PHY) += rtl8306.o -+obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi.o -+obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o -+obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o -+obj-$(CONFIG_RTL8367_PHY) += rtl8367.o -+obj-$(CONFIG_RTL8367B_PHY) += rtl8367b.o -+ - obj-$(CONFIG_NETWORK_PHY_TIMESTAMPING) += mii_timestamper.o - - obj-$(CONFIG_SFP) += sfp.o ---- a/include/linux/platform_data/b53.h -+++ b/include/linux/platform_data/b53.h -@@ -29,6 +29,9 @@ struct b53_platform_data { - u32 chip_id; - u16 enabled_ports; - -+ /* allow to specify an ethX alias */ -+ const char *alias; -+ - /* only used by MMAP'd driver */ - unsigned big_endian:1; - void __iomem *regs; diff --git a/target/linux/generic/hack-5.10/710-net-dsa-mv88e6xxx-default-VID-1.patch b/target/linux/generic/hack-5.10/710-net-dsa-mv88e6xxx-default-VID-1.patch deleted file mode 100644 index a09291f0e3..0000000000 --- a/target/linux/generic/hack-5.10/710-net-dsa-mv88e6xxx-default-VID-1.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- a/drivers/net/dsa/mv88e6xxx/chip.c -+++ b/drivers/net/dsa/mv88e6xxx/chip.c -@@ -2101,6 +2101,7 @@ static int mv88e6xxx_port_fdb_add(struct - struct mv88e6xxx_chip *chip = ds->priv; - int err; - -+ vid = vid ? : 1; - mv88e6xxx_reg_lock(chip); - err = mv88e6xxx_port_db_load_purge(chip, port, addr, vid, - MV88E6XXX_G1_ATU_DATA_STATE_UC_STATIC); -@@ -2115,6 +2116,7 @@ static int mv88e6xxx_port_fdb_del(struct - struct mv88e6xxx_chip *chip = ds->priv; - int err; - -+ vid = vid ? : 1; - mv88e6xxx_reg_lock(chip); - err = mv88e6xxx_port_db_load_purge(chip, port, addr, vid, 0); - mv88e6xxx_reg_unlock(chip); diff --git a/target/linux/generic/hack-5.10/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch b/target/linux/generic/hack-5.10/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch deleted file mode 100644 index 100094f59e..0000000000 --- a/target/linux/generic/hack-5.10/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/drivers/net/dsa/mv88e6xxx/chip.c -+++ b/drivers/net/dsa/mv88e6xxx/chip.c -@@ -2668,6 +2668,9 @@ static int mv88e6xxx_setup_port(struct m - if (dsa_is_cpu_port(ds, port)) - reg = 0; - -+ /* Disable ATU member violation interrupt */ -+ reg |= MV88E6XXX_PORT_ASSOC_VECTOR_IGNORE_WRONG; -+ - err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_ASSOC_VECTOR, - reg); - if (err) diff --git a/target/linux/generic/hack-5.10/720-net-phy-add-aqr-phys.patch b/target/linux/generic/hack-5.10/720-net-phy-add-aqr-phys.patch deleted file mode 100644 index e90447e0cb..0000000000 --- a/target/linux/generic/hack-5.10/720-net-phy-add-aqr-phys.patch +++ /dev/null @@ -1,142 +0,0 @@ -From: Birger Koblitz -Date: Sun, 5 Sep 2021 15:13:10 +0200 -Subject: [PATCH] kernel: Add AQR113C and AQR813 support - -This hack adds support for the Aquantia 4th generation, 10GBit -PHYs AQR113C and AQR813. - -Signed-off-by: Birger Koblitz - ---- a/drivers/net/phy/aquantia_main.c -+++ b/drivers/net/phy/aquantia_main.c -@@ -20,8 +20,10 @@ - #define PHY_ID_AQR105 0x03a1b4a2 - #define PHY_ID_AQR106 0x03a1b4d0 - #define PHY_ID_AQR107 0x03a1b4e0 -+#define PHY_ID_AQR113C 0x31c31c12 - #define PHY_ID_AQCS109 0x03a1b5c2 - #define PHY_ID_AQR405 0x03a1b4b0 -+#define PHY_ID_AQR813 0x31c31cb2 - - #define MDIO_PHYXS_VEND_IF_STATUS 0xe812 - #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3) -@@ -352,6 +354,49 @@ static int aqr107_read_rate(struct phy_d - return 0; - } - -+static int aqr113c_read_status(struct phy_device *phydev) -+{ -+ int val, ret; -+ -+ ret = aqr_read_status(phydev); -+ if (ret) -+ return ret; -+ -+ if (!phydev->link || phydev->autoneg == AUTONEG_DISABLE) -+ return 0; -+ -+ // On AQR113C, the speed returned by aqr_read_status is wrong -+ aqr107_read_rate(phydev); -+ -+ val = phy_read_mmd(phydev, MDIO_MMD_PHYXS, MDIO_PHYXS_VEND_IF_STATUS); -+ if (val < 0) -+ return val; -+ -+ switch (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val)) { -+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR: -+ phydev->interface = PHY_INTERFACE_MODE_10GKR; -+ break; -+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI: -+ phydev->interface = PHY_INTERFACE_MODE_10GBASER; -+ break; -+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII: -+ phydev->interface = PHY_INTERFACE_MODE_USXGMII; -+ break; -+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII: -+ phydev->interface = PHY_INTERFACE_MODE_SGMII; -+ break; -+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII: -+ phydev->interface = PHY_INTERFACE_MODE_2500BASEX; -+ break; -+ default: -+ phydev->interface = PHY_INTERFACE_MODE_NA; -+ break; -+ } -+ -+ /* Read downshifted rate from vendor register */ -+ return aqr107_read_rate(phydev); -+} -+ - static int aqr107_read_status(struct phy_device *phydev) - { - int val, ret; -@@ -482,7 +527,7 @@ static void aqr107_chip_info(struct phy_ - build_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID, val); - prov_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_PROV_ID, val); - -- phydev_dbg(phydev, "FW %u.%u, Build %u, Provisioning %u\n", -+ phydev_info(phydev, "FW %u.%u, Build %u, Provisioning %u\n", - fw_major, fw_minor, build_id, prov_id); - } - -@@ -690,6 +735,24 @@ static struct phy_driver aqr_driver[] = - .link_change_notify = aqr107_link_change_notify, - }, - { -+ PHY_ID_MATCH_MODEL(PHY_ID_AQR113C), -+ .name = "Aquantia AQR113C", -+ .probe = aqr107_probe, -+ .config_init = aqr107_config_init, -+ .config_aneg = aqr_config_aneg, -+ .config_intr = aqr_config_intr, -+ .ack_interrupt = aqr_ack_interrupt, -+ .read_status = aqr113c_read_status, -+ .get_tunable = aqr107_get_tunable, -+ .set_tunable = aqr107_set_tunable, -+ .suspend = aqr107_suspend, -+ .resume = aqr107_resume, -+ .get_sset_count = aqr107_get_sset_count, -+ .get_strings = aqr107_get_strings, -+ .get_stats = aqr107_get_stats, -+ .link_change_notify = aqr107_link_change_notify, -+}, -+{ - PHY_ID_MATCH_MODEL(PHY_ID_AQCS109), - .name = "Aquantia AQCS109", - .probe = aqr107_probe, -@@ -715,6 +778,24 @@ static struct phy_driver aqr_driver[] = - .ack_interrupt = aqr_ack_interrupt, - .read_status = aqr_read_status, - }, -+{ -+ PHY_ID_MATCH_MODEL(PHY_ID_AQR813), -+ .name = "Aquantia AQR813", -+ .probe = aqr107_probe, -+ .config_init = aqr107_config_init, -+ .config_aneg = aqr_config_aneg, -+ .config_intr = aqr_config_intr, -+ .ack_interrupt = aqr_ack_interrupt, -+ .read_status = aqr113c_read_status, -+ .get_tunable = aqr107_get_tunable, -+ .set_tunable = aqr107_set_tunable, -+ .suspend = aqr107_suspend, -+ .resume = aqr107_resume, -+ .get_sset_count = aqr107_get_sset_count, -+ .get_strings = aqr107_get_strings, -+ .get_stats = aqr107_get_stats, -+ .link_change_notify = aqr107_link_change_notify, -+}, - }; - - module_phy_driver(aqr_driver); -@@ -725,8 +806,10 @@ static struct mdio_device_id __maybe_unu - { PHY_ID_MATCH_MODEL(PHY_ID_AQR105) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR106) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR107) }, -+ { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR405) }, -+ { PHY_ID_MATCH_MODEL(PHY_ID_AQR813) }, - { } - }; - diff --git a/target/linux/generic/hack-5.10/721-net-add-packet-mangeling.patch b/target/linux/generic/hack-5.10/721-net-add-packet-mangeling.patch deleted file mode 100644 index 03c643269b..0000000000 --- a/target/linux/generic/hack-5.10/721-net-add-packet-mangeling.patch +++ /dev/null @@ -1,167 +0,0 @@ -From ffe387740bbe88dd88bbe04d6375902708003d6e Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:25:00 +0200 -Subject: net: add packet mangeling - -ar8216 switches have a hardware bug, which renders normal 802.1q support -unusable. Packet mangling is required to fix up the vlan for incoming -packets. - -Signed-off-by: Felix Fietkau ---- - include/linux/netdevice.h | 11 +++++++++++ - include/linux/skbuff.h | 14 ++++---------- - net/Kconfig | 6 ++++++ - net/core/dev.c | 20 +++++++++++++++----- - net/core/skbuff.c | 17 +++++++++++++++++ - net/ethernet/eth.c | 6 ++++++ - 6 files changed, 59 insertions(+), 15 deletions(-) - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -1648,6 +1648,7 @@ enum netdev_priv_flags { - IFF_FAILOVER_SLAVE = 1<<28, - IFF_L3MDEV_RX_HANDLER = 1<<29, - IFF_LIVE_RENAME_OK = 1<<30, -+ IFF_NO_IP_ALIGN = 1<<31, - }; - - #define IFF_802_1Q_VLAN IFF_802_1Q_VLAN -@@ -1680,6 +1681,7 @@ enum netdev_priv_flags { - #define IFF_FAILOVER_SLAVE IFF_FAILOVER_SLAVE - #define IFF_L3MDEV_RX_HANDLER IFF_L3MDEV_RX_HANDLER - #define IFF_LIVE_RENAME_OK IFF_LIVE_RENAME_OK -+#define IFF_NO_IP_ALIGN IFF_NO_IP_ALIGN - - /* Specifies the type of the struct net_device::ml_priv pointer */ - enum netdev_ml_priv_type { -@@ -2020,6 +2022,11 @@ struct net_device { - const struct tlsdev_ops *tlsdev_ops; - #endif - -+#ifdef CONFIG_ETHERNET_PACKET_MANGLE -+ void (*eth_mangle_rx)(struct net_device *dev, struct sk_buff *skb); -+ struct sk_buff *(*eth_mangle_tx)(struct net_device *dev, struct sk_buff *skb); -+#endif -+ - const struct header_ops *header_ops; - - unsigned int flags; -@@ -2110,6 +2117,10 @@ struct net_device { - struct mpls_dev __rcu *mpls_ptr; - #endif - -+#ifdef CONFIG_ETHERNET_PACKET_MANGLE -+ void *phy_ptr; /* PHY device specific data */ -+#endif -+ - /* - * Cache lines mostly used on receive path (including eth_type_trans()) - */ ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -2726,6 +2726,10 @@ static inline int pskb_trim(struct sk_bu - return (len < skb->len) ? __pskb_trim(skb, len) : 0; - } - -+extern struct sk_buff *__netdev_alloc_skb_ip_align(struct net_device *dev, -+ unsigned int length, gfp_t gfp); -+ -+ - /** - * pskb_trim_unique - remove end from a paged unique (not cloned) buffer - * @skb: buffer to alter -@@ -2857,16 +2861,6 @@ static inline struct sk_buff *dev_alloc_ - } - - --static inline struct sk_buff *__netdev_alloc_skb_ip_align(struct net_device *dev, -- unsigned int length, gfp_t gfp) --{ -- struct sk_buff *skb = __netdev_alloc_skb(dev, length + NET_IP_ALIGN, gfp); -- -- if (NET_IP_ALIGN && skb) -- skb_reserve(skb, NET_IP_ALIGN); -- return skb; --} -- - static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev, - unsigned int length) - { ---- a/net/Kconfig -+++ b/net/Kconfig -@@ -26,6 +26,12 @@ menuconfig NET - - if NET - -+config ETHERNET_PACKET_MANGLE -+ bool -+ help -+ This option can be selected by phy drivers that need to mangle -+ packets going in or out of an ethernet device. -+ - config WANT_COMPAT_NETLINK_MESSAGES - bool - help ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -3656,6 +3656,11 @@ static int xmit_one(struct sk_buff *skb, - if (dev_nit_active(dev)) - dev_queue_xmit_nit(skb, dev); - -+#ifdef CONFIG_ETHERNET_PACKET_MANGLE -+ if (dev->eth_mangle_tx && !(skb = dev->eth_mangle_tx(dev, skb))) -+ return NETDEV_TX_OK; -+#endif -+ - len = skb->len; - PRANDOM_ADD_NOISE(skb, dev, txq, len + jiffies); - trace_net_dev_start_xmit(skb, dev); ---- a/net/core/skbuff.c -+++ b/net/core/skbuff.c -@@ -60,6 +60,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -553,6 +554,22 @@ skb_fail: - } - EXPORT_SYMBOL(__napi_alloc_skb); - -+struct sk_buff *__netdev_alloc_skb_ip_align(struct net_device *dev, -+ unsigned int length, gfp_t gfp) -+{ -+ struct sk_buff *skb = __netdev_alloc_skb(dev, length + NET_IP_ALIGN, gfp); -+ -+#ifdef CONFIG_ETHERNET_PACKET_MANGLE -+ if (dev && (dev->priv_flags & IFF_NO_IP_ALIGN)) -+ return skb; -+#endif -+ -+ if (NET_IP_ALIGN && skb) -+ skb_reserve(skb, NET_IP_ALIGN); -+ return skb; -+} -+EXPORT_SYMBOL(__netdev_alloc_skb_ip_align); -+ - void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off, - int size, unsigned int truesize) - { ---- a/net/ethernet/eth.c -+++ b/net/ethernet/eth.c -@@ -171,6 +171,12 @@ __be16 eth_type_trans(struct sk_buff *sk - const struct ethhdr *eth; - - skb->dev = dev; -+ -+#ifdef CONFIG_ETHERNET_PACKET_MANGLE -+ if (dev->eth_mangle_rx) -+ dev->eth_mangle_rx(dev, skb); -+#endif -+ - skb_reset_mac_header(skb); - - eth = (struct ethhdr *)skb->data; diff --git a/target/linux/generic/hack-5.10/722-net-phy-aquantia-enable-AQR112-and-AQR412.patch b/target/linux/generic/hack-5.10/722-net-phy-aquantia-enable-AQR112-and-AQR412.patch deleted file mode 100644 index 42bf8951d6..0000000000 --- a/target/linux/generic/hack-5.10/722-net-phy-aquantia-enable-AQR112-and-AQR412.patch +++ /dev/null @@ -1,154 +0,0 @@ -From 5f62951fba63a9f9cfff564209426bdea5fcc371 Mon Sep 17 00:00:00 2001 -From: Alex Marginean -Date: Tue, 27 Aug 2019 15:16:56 +0300 -Subject: [PATCH] drivers: net: phy: aquantia: enable AQR112 and AQR412 - -Adds support for AQR112 and AQR412 which is mostly based on existing code -with the addition of code configuring the protocol on system side. -This allows changing the system side protocol without having to deploy a -different firmware on the PHY. - -Signed-off-by: Alex Marginean ---- - drivers/net/phy/aquantia_main.c | 88 +++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 88 insertions(+) - ---- a/drivers/net/phy/aquantia_main.c -+++ b/drivers/net/phy/aquantia_main.c -@@ -20,9 +20,11 @@ - #define PHY_ID_AQR105 0x03a1b4a2 - #define PHY_ID_AQR106 0x03a1b4d0 - #define PHY_ID_AQR107 0x03a1b4e0 -+#define PHY_ID_AQR112 0x03a1b662 - #define PHY_ID_AQR113C 0x31c31c12 - #define PHY_ID_AQCS109 0x03a1b5c2 - #define PHY_ID_AQR405 0x03a1b4b0 -+#define PHY_ID_AQR412 0x03a1b712 - #define PHY_ID_AQR813 0x31c31cb2 - - #define MDIO_PHYXS_VEND_IF_STATUS 0xe812 -@@ -134,6 +136,29 @@ - #define AQR107_OP_IN_PROG_SLEEP 1000 - #define AQR107_OP_IN_PROG_TIMEOUT 100000 - -+/* registers in MDIO_MMD_VEND1 region */ -+#define AQUANTIA_VND1_GLOBAL_SC 0x000 -+#define AQUANTIA_VND1_GLOBAL_SC_LP BIT(0xb) -+ -+/* global start rate, the protocol associated with this speed is used by default -+ * on SI. -+ */ -+#define AQUANTIA_VND1_GSTART_RATE 0x31a -+#define AQUANTIA_VND1_GSTART_RATE_OFF 0 -+#define AQUANTIA_VND1_GSTART_RATE_100M 1 -+#define AQUANTIA_VND1_GSTART_RATE_1G 2 -+#define AQUANTIA_VND1_GSTART_RATE_10G 3 -+#define AQUANTIA_VND1_GSTART_RATE_2_5G 4 -+#define AQUANTIA_VND1_GSTART_RATE_5G 5 -+ -+/* SYSCFG registers for 100M, 1G, 2.5G, 5G, 10G */ -+#define AQUANTIA_VND1_GSYSCFG_BASE 0x31b -+#define AQUANTIA_VND1_GSYSCFG_100M 0 -+#define AQUANTIA_VND1_GSYSCFG_1G 1 -+#define AQUANTIA_VND1_GSYSCFG_2_5G 2 -+#define AQUANTIA_VND1_GSYSCFG_5G 3 -+#define AQUANTIA_VND1_GSYSCFG_10G 4 -+ - struct aqr107_hw_stat { - const char *name; - int reg; -@@ -265,6 +290,51 @@ static int aqr_config_aneg(struct phy_de - return genphy_c45_check_and_restart_aneg(phydev, changed); - } - -+static struct { -+ u16 syscfg; -+ int cnt; -+ u16 start_rate; -+} aquantia_syscfg[PHY_INTERFACE_MODE_MAX] = { -+ [PHY_INTERFACE_MODE_SGMII] = {0x04b, AQUANTIA_VND1_GSYSCFG_1G, -+ AQUANTIA_VND1_GSTART_RATE_1G}, -+ [PHY_INTERFACE_MODE_2500BASEX] = {0x144, AQUANTIA_VND1_GSYSCFG_2_5G, -+ AQUANTIA_VND1_GSTART_RATE_2_5G}, -+ [PHY_INTERFACE_MODE_XGMII] = {0x100, AQUANTIA_VND1_GSYSCFG_10G, -+ AQUANTIA_VND1_GSTART_RATE_10G}, -+ [PHY_INTERFACE_MODE_USXGMII] = {0x080, AQUANTIA_VND1_GSYSCFG_10G, -+ AQUANTIA_VND1_GSTART_RATE_10G}, -+}; -+ -+/* Sets up protocol on system side before calling aqr_config_aneg */ -+static int aqr_config_aneg_set_prot(struct phy_device *phydev) -+{ -+ int if_type = phydev->interface; -+ int i; -+ -+ if (!aquantia_syscfg[if_type].cnt) -+ return 0; -+ -+ /* set PHY in low power mode so we can configure protocols */ -+ phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GLOBAL_SC, -+ AQUANTIA_VND1_GLOBAL_SC_LP); -+ mdelay(10); -+ -+ /* set the default rate to enable the SI link */ -+ phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GSTART_RATE, -+ aquantia_syscfg[if_type].start_rate); -+ -+ for (i = 0; i <= aquantia_syscfg[if_type].cnt; i++) -+ phy_write_mmd(phydev, MDIO_MMD_VEND1, -+ AQUANTIA_VND1_GSYSCFG_BASE + i, -+ aquantia_syscfg[if_type].syscfg); -+ -+ /* wake PHY back up */ -+ phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GLOBAL_SC, 0); -+ mdelay(10); -+ -+ return aqr_config_aneg(phydev); -+} -+ - static int aqr_config_intr(struct phy_device *phydev) - { - bool en = phydev->interrupts == PHY_INTERRUPT_ENABLED; -@@ -796,6 +866,30 @@ static struct phy_driver aqr_driver[] = - .get_stats = aqr107_get_stats, - .link_change_notify = aqr107_link_change_notify, - }, -+{ -+ PHY_ID_MATCH_MODEL(PHY_ID_AQR112), -+ .name = "Aquantia AQR112", -+ .probe = aqr107_probe, -+ .config_aneg = aqr_config_aneg_set_prot, -+ .config_intr = aqr_config_intr, -+ .ack_interrupt = aqr_ack_interrupt, -+ .read_status = aqr107_read_status, -+ .get_sset_count = aqr107_get_sset_count, -+ .get_strings = aqr107_get_strings, -+ .get_stats = aqr107_get_stats, -+}, -+{ -+ PHY_ID_MATCH_MODEL(PHY_ID_AQR412), -+ .name = "Aquantia AQR412", -+ .probe = aqr107_probe, -+ .config_aneg = aqr_config_aneg_set_prot, -+ .config_intr = aqr_config_intr, -+ .ack_interrupt = aqr_ack_interrupt, -+ .read_status = aqr107_read_status, -+ .get_sset_count = aqr107_get_sset_count, -+ .get_strings = aqr107_get_strings, -+ .get_stats = aqr107_get_stats, -+}, - }; - - module_phy_driver(aqr_driver); -@@ -806,9 +900,11 @@ static struct mdio_device_id __maybe_unu - { PHY_ID_MATCH_MODEL(PHY_ID_AQR105) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR106) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR107) }, -+ { PHY_ID_MATCH_MODEL(PHY_ID_AQR112) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR405) }, -+ { PHY_ID_MATCH_MODEL(PHY_ID_AQR412) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR813) }, - { } - }; diff --git a/target/linux/generic/hack-5.10/723-net-phy-aquantia-fix-system-side-protocol-mi.patch b/target/linux/generic/hack-5.10/723-net-phy-aquantia-fix-system-side-protocol-mi.patch deleted file mode 100644 index c65f273a8a..0000000000 --- a/target/linux/generic/hack-5.10/723-net-phy-aquantia-fix-system-side-protocol-mi.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 5f008cb22f60da4e10375f22266c1a4e20b1252e Mon Sep 17 00:00:00 2001 -From: Alex Marginean -Date: Fri, 20 Sep 2019 18:22:52 +0300 -Subject: [PATCH] drivers: net: phy: aquantia: fix system side protocol - misconfiguration - -Do not set up protocols for speeds that are not supported by FW. Enabling -these protocols leads to link issues on system side. - -Signed-off-by: Alex Marginean ---- - drivers/net/phy/aquantia_main.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - ---- a/drivers/net/phy/aquantia_main.c -+++ b/drivers/net/phy/aquantia_main.c -@@ -323,10 +323,16 @@ static int aqr_config_aneg_set_prot(stru - phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GSTART_RATE, - aquantia_syscfg[if_type].start_rate); - -- for (i = 0; i <= aquantia_syscfg[if_type].cnt; i++) -+ for (i = 0; i <= aquantia_syscfg[if_type].cnt; i++) { -+ u16 reg = phy_read_mmd(phydev, MDIO_MMD_VEND1, -+ AQUANTIA_VND1_GSYSCFG_BASE + i); -+ if (!reg) -+ continue; -+ - phy_write_mmd(phydev, MDIO_MMD_VEND1, - AQUANTIA_VND1_GSYSCFG_BASE + i, - aquantia_syscfg[if_type].syscfg); -+ } - - /* wake PHY back up */ - phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GLOBAL_SC, 0); diff --git a/target/linux/generic/hack-5.10/724-net-phy-aquantia-Add-AQR113-driver-support.patch b/target/linux/generic/hack-5.10/724-net-phy-aquantia-Add-AQR113-driver-support.patch deleted file mode 100644 index 8fd3b018b4..0000000000 --- a/target/linux/generic/hack-5.10/724-net-phy-aquantia-Add-AQR113-driver-support.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 2e677e4ae8f8330f68013163b060d0fda3a43095 Mon Sep 17 00:00:00 2001 -From: "Langer, Thomas" -Date: Fri, 9 Jul 2021 17:36:46 +0200 -Subject: [PATCH] PONRTSYS-8842: aquantia: Add AQR113 driver support - -Add a new entry for AQR113 PHY_ID ---- - drivers/net/phy/aquantia_main.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - ---- a/drivers/net/phy/aquantia_main.c -+++ b/drivers/net/phy/aquantia_main.c -@@ -21,6 +21,7 @@ - #define PHY_ID_AQR106 0x03a1b4d0 - #define PHY_ID_AQR107 0x03a1b4e0 - #define PHY_ID_AQR112 0x03a1b662 -+#define PHY_ID_AQR113 0x31c31c40 - #define PHY_ID_AQR113C 0x31c31c12 - #define PHY_ID_AQCS109 0x03a1b5c2 - #define PHY_ID_AQR405 0x03a1b4b0 -@@ -885,6 +886,14 @@ static struct phy_driver aqr_driver[] = - .get_stats = aqr107_get_stats, - }, - { -+ PHY_ID_MATCH_MODEL(PHY_ID_AQR113), -+ .name = "Aquantia AQR113", -+ .config_aneg = aqr_config_aneg, -+ .config_intr = aqr_config_intr, -+ .ack_interrupt = aqr_ack_interrupt, -+ .read_status = aqr107_read_status, -+}, -+{ - PHY_ID_MATCH_MODEL(PHY_ID_AQR412), - .name = "Aquantia AQR412", - .probe = aqr107_probe, -@@ -907,6 +916,7 @@ static struct mdio_device_id __maybe_unu - { PHY_ID_MATCH_MODEL(PHY_ID_AQR106) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR107) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR112) }, -+ { PHY_ID_MATCH_MODEL(PHY_ID_AQR113) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR405) }, diff --git a/target/linux/generic/hack-5.10/725-net-phy-aquantia-add-PHY_IDs-for-AQR112-variants.patch b/target/linux/generic/hack-5.10/725-net-phy-aquantia-add-PHY_IDs-for-AQR112-variants.patch deleted file mode 100644 index f2db552a1e..0000000000 --- a/target/linux/generic/hack-5.10/725-net-phy-aquantia-add-PHY_IDs-for-AQR112-variants.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 3b92ee7b7899b6beffb2b484c58326e36612a873 Mon Sep 17 00:00:00 2001 -From: Daniel Golle -Date: Thu, 23 Dec 2021 14:52:56 +0000 -Subject: [PATCH] net: phy: aquantia: add PHY_ID for AQR112R - -As advised by Ian Chang this PHY is used in Puzzle devices. - -Signed-off-by: Daniel Golle ---- - drivers/net/phy/aquantia_main.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - ---- a/drivers/net/phy/aquantia_main.c -+++ b/drivers/net/phy/aquantia_main.c -@@ -21,6 +21,8 @@ - #define PHY_ID_AQR106 0x03a1b4d0 - #define PHY_ID_AQR107 0x03a1b4e0 - #define PHY_ID_AQR112 0x03a1b662 -+#define PHY_ID_AQR112C 0x03a1b790 -+#define PHY_ID_AQR112R 0x31c31d12 - #define PHY_ID_AQR113 0x31c31c40 - #define PHY_ID_AQR113C 0x31c31c12 - #define PHY_ID_AQCS109 0x03a1b5c2 -@@ -886,6 +888,30 @@ static struct phy_driver aqr_driver[] = - .get_stats = aqr107_get_stats, - }, - { -+ PHY_ID_MATCH_MODEL(PHY_ID_AQR112C), -+ .name = "Aquantia AQR112C", -+ .probe = aqr107_probe, -+ .config_aneg = aqr_config_aneg_set_prot, -+ .config_intr = aqr_config_intr, -+ .ack_interrupt = aqr_ack_interrupt, -+ .read_status = aqr107_read_status, -+ .get_sset_count = aqr107_get_sset_count, -+ .get_strings = aqr107_get_strings, -+ .get_stats = aqr107_get_stats, -+}, -+{ -+ PHY_ID_MATCH_MODEL(PHY_ID_AQR112R), -+ .name = "Aquantia AQR112R", -+ .probe = aqr107_probe, -+ .config_aneg = aqr_config_aneg_set_prot, -+ .config_intr = aqr_config_intr, -+ .ack_interrupt = aqr_ack_interrupt, -+ .read_status = aqr107_read_status, -+ .get_sset_count = aqr107_get_sset_count, -+ .get_strings = aqr107_get_strings, -+ .get_stats = aqr107_get_stats, -+}, -+{ - PHY_ID_MATCH_MODEL(PHY_ID_AQR113), - .name = "Aquantia AQR113", - .config_aneg = aqr_config_aneg, -@@ -916,6 +942,8 @@ static struct mdio_device_id __maybe_unu - { PHY_ID_MATCH_MODEL(PHY_ID_AQR106) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR107) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR112) }, -+ { PHY_ID_MATCH_MODEL(PHY_ID_AQR112C) }, -+ { PHY_ID_MATCH_MODEL(PHY_ID_AQR112R) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR113) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, - { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) }, diff --git a/target/linux/generic/hack-5.10/760-net-usb-r8152-add-LED-configuration-from-OF.patch b/target/linux/generic/hack-5.10/760-net-usb-r8152-add-LED-configuration-from-OF.patch deleted file mode 100644 index aa50fe17da..0000000000 --- a/target/linux/generic/hack-5.10/760-net-usb-r8152-add-LED-configuration-from-OF.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 82985725e071f2a5735052f18e109a32aeac3a0b Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Sun, 26 Jul 2020 02:38:31 +0200 -Subject: [PATCH] net: usb: r8152: add LED configuration from OF - -This adds the ability to configure the LED configuration register using -OF. This way, the correct value for board specific LED configuration can -be determined. - -Signed-off-by: David Bauer ---- - drivers/net/usb/r8152.c | 23 +++++++++++++++++++++++ - 1 file changed, 23 insertions(+) - ---- a/drivers/net/usb/r8152.c -+++ b/drivers/net/usb/r8152.c -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -5303,6 +5304,22 @@ static void rtl_tally_reset(struct r8152 - ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data); - } - -+static int r8152_led_configuration(struct r8152 *tp) -+{ -+ u32 led_data; -+ int ret; -+ -+ ret = of_property_read_u32(tp->udev->dev.of_node, "realtek,led-data", -+ &led_data); -+ -+ if (ret) -+ return ret; -+ -+ ocp_write_word(tp, MCU_TYPE_PLA, PLA_LEDSEL, led_data); -+ -+ return 0; -+} -+ - static void r8152b_init(struct r8152 *tp) - { - u32 ocp_data; -@@ -5344,6 +5361,8 @@ static void r8152b_init(struct r8152 *tp - ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); - ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN); - ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); -+ -+ r8152_led_configuration(tp); - } - - static void r8153_init(struct r8152 *tp) -@@ -5489,6 +5508,8 @@ static void r8153_init(struct r8152 *tp) - tp->coalesce = COALESCE_SLOW; - break; - } -+ -+ r8152_led_configuration(tp); - } - - static void r8153b_init(struct r8152 *tp) -@@ -5575,6 +5596,8 @@ static void r8153b_init(struct r8152 *tp - rtl_tally_reset(tp); - - tp->coalesce = 15000; /* 15 us */ -+ -+ r8152_led_configuration(tp); - } - - static int rtl8152_pre_reset(struct usb_interface *intf) diff --git a/target/linux/generic/hack-5.10/773-bgmac-add-srab-switch.patch b/target/linux/generic/hack-5.10/773-bgmac-add-srab-switch.patch deleted file mode 100644 index fcd9678d05..0000000000 --- a/target/linux/generic/hack-5.10/773-bgmac-add-srab-switch.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 3cb240533ab787899dc7f17aa7d6c5b4810e2e58 Mon Sep 17 00:00:00 2001 -From: Hauke Mehrtens -Date: Fri, 7 Jul 2017 17:26:01 +0200 -Subject: bcm53xx: bgmac: use srab switch driver - -use the srab switch driver on these SoCs. - -Signed-off-by: Hauke Mehrtens ---- - drivers/net/ethernet/broadcom/bgmac-bcma.c | 1 + - drivers/net/ethernet/broadcom/bgmac.c | 24 ++++++++++++++++++++++++ - drivers/net/ethernet/broadcom/bgmac.h | 4 ++++ - 3 files changed, 29 insertions(+) - ---- a/drivers/net/ethernet/broadcom/bgmac-bcma.c -+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c -@@ -280,6 +280,7 @@ static int bgmac_probe(struct bcma_devic - bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST; - bgmac->feature_flags |= BGMAC_FEAT_NO_RESET; - bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500; -+ bgmac->feature_flags |= BGMAC_FEAT_SRAB; - break; - default: - bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST; ---- a/drivers/net/ethernet/broadcom/bgmac.c -+++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -12,6 +12,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -1408,6 +1409,17 @@ static const struct ethtool_ops bgmac_et - .set_link_ksettings = phy_ethtool_set_link_ksettings, - }; - -+static struct b53_platform_data bgmac_b53_pdata = { -+}; -+ -+static struct platform_device bgmac_b53_dev = { -+ .name = "b53-srab-switch", -+ .id = -1, -+ .dev = { -+ .platform_data = &bgmac_b53_pdata, -+ }, -+}; -+ - /************************************************** - * MII - **************************************************/ -@@ -1546,6 +1558,14 @@ int bgmac_enet_probe(struct bgmac *bgmac - - bgmac->in_init = false; - -+ if ((bgmac->feature_flags & BGMAC_FEAT_SRAB) && !bgmac_b53_pdata.regs) { -+ bgmac_b53_pdata.regs = ioremap(0x18007000, 0x1000); -+ -+ err = platform_device_register(&bgmac_b53_dev); -+ if (!err) -+ bgmac->b53_device = &bgmac_b53_dev; -+ } -+ - err = register_netdev(bgmac->net_dev); - if (err) { - dev_err(bgmac->dev, "Cannot register net device\n"); -@@ -1568,6 +1588,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe); - - void bgmac_enet_remove(struct bgmac *bgmac) - { -+ if (bgmac->b53_device) -+ platform_device_unregister(&bgmac_b53_dev); -+ bgmac->b53_device = NULL; -+ - unregister_netdev(bgmac->net_dev); - phy_disconnect(bgmac->net_dev->phydev); - netif_napi_del(&bgmac->napi); ---- a/drivers/net/ethernet/broadcom/bgmac.h -+++ b/drivers/net/ethernet/broadcom/bgmac.h -@@ -428,6 +428,7 @@ - #define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII BIT(18) - #define BGMAC_FEAT_CC7_IF_TYPE_RGMII BIT(19) - #define BGMAC_FEAT_IDM_MASK BIT(20) -+#define BGMAC_FEAT_SRAB BIT(21) - - struct bgmac_slot_info { - union { -@@ -535,6 +536,9 @@ struct bgmac { - void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask, - u32 set); - int (*phy_connect)(struct bgmac *bgmac); -+ -+ /* platform device for associated switch */ -+ struct platform_device *b53_device; - }; - - struct bgmac *bgmac_alloc(struct device *dev); diff --git a/target/linux/generic/hack-5.10/780-usb-net-MeigLink_modem_support.patch b/target/linux/generic/hack-5.10/780-usb-net-MeigLink_modem_support.patch deleted file mode 100644 index 68350a98d4..0000000000 --- a/target/linux/generic/hack-5.10/780-usb-net-MeigLink_modem_support.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- a/drivers/net/usb/qmi_wwan.c -+++ b/drivers/net/usb/qmi_wwan.c -@@ -1025,6 +1025,7 @@ static const struct usb_device_id produc - {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0620)}, /* Quectel EM160R-GL */ - {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ - {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0801)}, /* Quectel RM520N */ -+ {QMI_MATCH_FF_FF_FF(0x05c6, 0xf601)}, /* MeigLink SLM750 */ - - /* 3. Combined interface devices matching on interface number */ - {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ ---- a/drivers/usb/serial/option.c -+++ b/drivers/usb/serial/option.c -@@ -244,6 +244,8 @@ static void option_instat_callback(struc - #define UBLOX_PRODUCT_R410M 0x90b2 - /* These Yuga products use Qualcomm's vendor ID */ - #define YUGA_PRODUCT_CLM920_NC5 0x9625 -+/* These MeigLink products use Qualcomm's vendor ID */ -+#define MEIGLINK_PRODUCT_SLM750 0xf601 - - #define QUECTEL_VENDOR_ID 0x2c7c - /* These Quectel products use Quectel's vendor ID */ -@@ -1164,6 +1166,11 @@ static const struct usb_device_id option - .driver_info = ZLP }, - { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96), - .driver_info = RSVD(4) }, -+ /* Meiglink products using Qualcomm vendor ID */ -+ // Works OK. In case of some issues check macros that are used by Quectel Products -+ { USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, MEIGLINK_PRODUCT_SLM750, 0xff, 0xff, 0xff), -+ .driver_info = NUMEP2 }, -+ { USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, MEIGLINK_PRODUCT_SLM750, 0xff, 0, 0) }, - { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff), - .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 }, - { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0, 0) }, diff --git a/target/linux/generic/hack-5.10/800-GPIO-add-named-gpio-exports.patch b/target/linux/generic/hack-5.10/800-GPIO-add-named-gpio-exports.patch deleted file mode 100644 index 6367ee9a0b..0000000000 --- a/target/linux/generic/hack-5.10/800-GPIO-add-named-gpio-exports.patch +++ /dev/null @@ -1,162 +0,0 @@ -From cc809a441d8f2924f785eb863dfa6aef47a25b0b Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Tue, 12 Aug 2014 20:49:27 +0200 -Subject: [PATCH 30/36] GPIO: add named gpio exports - -Signed-off-by: John Crispin ---- a/drivers/gpio/gpiolib-of.c -+++ b/drivers/gpio/gpiolib-of.c -@@ -19,6 +19,8 @@ - #include - #include - #include -+#include -+#include - - #include "gpiolib.h" - #include "gpiolib-of.h" -@@ -1046,3 +1048,72 @@ void of_gpiochip_remove(struct gpio_chip - { - of_node_put(chip->of_node); - } -+ -+#ifdef CONFIG_GPIO_SYSFS -+ -+static struct of_device_id gpio_export_ids[] = { -+ { .compatible = "gpio-export" }, -+ { /* sentinel */ } -+}; -+ -+static int of_gpio_export_probe(struct platform_device *pdev) -+{ -+ struct device_node *np = pdev->dev.of_node; -+ struct device_node *cnp; -+ u32 val; -+ int nb = 0; -+ -+ for_each_child_of_node(np, cnp) { -+ const char *name = NULL; -+ int gpio; -+ bool dmc; -+ int max_gpio = 1; -+ int i; -+ -+ of_property_read_string(cnp, "gpio-export,name", &name); -+ -+ if (!name) -+ max_gpio = of_gpio_count(cnp); -+ -+ for (i = 0; i < max_gpio; i++) { -+ unsigned flags = 0; -+ enum of_gpio_flags of_flags; -+ -+ gpio = of_get_gpio_flags(cnp, i, &of_flags); -+ if (!gpio_is_valid(gpio)) -+ return gpio; -+ -+ if (of_flags == OF_GPIO_ACTIVE_LOW) -+ flags |= GPIOF_ACTIVE_LOW; -+ -+ if (!of_property_read_u32(cnp, "gpio-export,output", &val)) -+ flags |= val ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; -+ else -+ flags |= GPIOF_IN; -+ -+ if (devm_gpio_request_one(&pdev->dev, gpio, flags, name ? name : of_node_full_name(np))) -+ continue; -+ -+ dmc = of_property_read_bool(cnp, "gpio-export,direction_may_change"); -+ gpio_export_with_name(gpio, dmc, name); -+ nb++; -+ } -+ } -+ -+ dev_info(&pdev->dev, "%d gpio(s) exported\n", nb); -+ -+ return 0; -+} -+ -+static struct platform_driver gpio_export_driver = { -+ .driver = { -+ .name = "gpio-export", -+ .owner = THIS_MODULE, -+ .of_match_table = of_match_ptr(gpio_export_ids), -+ }, -+ .probe = of_gpio_export_probe, -+}; -+ -+module_platform_driver(gpio_export_driver); -+ -+#endif ---- a/include/asm-generic/gpio.h -+++ b/include/asm-generic/gpio.h -@@ -125,6 +125,12 @@ static inline int gpio_export(unsigned g - return gpiod_export(gpio_to_desc(gpio), direction_may_change); - } - -+int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name); -+static inline int gpio_export_with_name(unsigned gpio, bool direction_may_change, const char *name) -+{ -+ return __gpiod_export(gpio_to_desc(gpio), direction_may_change, name); -+} -+ - static inline int gpio_export_link(struct device *dev, const char *name, - unsigned gpio) - { ---- a/include/linux/gpio/consumer.h -+++ b/include/linux/gpio/consumer.h -@@ -715,6 +715,7 @@ static inline void devm_acpi_dev_remove_ - - #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS) - -+int _gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name); - int gpiod_export(struct gpio_desc *desc, bool direction_may_change); - int gpiod_export_link(struct device *dev, const char *name, - struct gpio_desc *desc); -@@ -722,6 +723,13 @@ void gpiod_unexport(struct gpio_desc *de - - #else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */ - -+static inline int _gpiod_export(struct gpio_desc *desc, -+ bool direction_may_change, -+ const char *name) -+{ -+ return -ENOSYS; -+} -+ - static inline int gpiod_export(struct gpio_desc *desc, - bool direction_may_change) - { ---- a/drivers/gpio/gpiolib-sysfs.c -+++ b/drivers/gpio/gpiolib-sysfs.c -@@ -572,7 +572,7 @@ static struct class gpio_class = { - * - * Returns zero on success, else an error. - */ --int gpiod_export(struct gpio_desc *desc, bool direction_may_change) -+int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name) - { - struct gpio_chip *chip; - struct gpio_device *gdev; -@@ -634,6 +634,8 @@ int gpiod_export(struct gpio_desc *desc, - offset = gpio_chip_hwgpio(desc); - if (chip->names && chip->names[offset]) - ioname = chip->names[offset]; -+ if (name) -+ ioname = name; - - dev = device_create_with_groups(&gpio_class, &gdev->dev, - MKDEV(0, 0), data, gpio_groups, -@@ -655,6 +657,12 @@ err_unlock: - gpiod_dbg(desc, "%s: status %d\n", __func__, status); - return status; - } -+EXPORT_SYMBOL_GPL(__gpiod_export); -+ -+int gpiod_export(struct gpio_desc *desc, bool direction_may_change) -+{ -+ return __gpiod_export(desc, direction_may_change, NULL); -+} - EXPORT_SYMBOL_GPL(gpiod_export); - - static int match_export(struct device *dev, const void *desc) diff --git a/target/linux/generic/hack-5.10/800-ubnt-ledbar-driver.patch b/target/linux/generic/hack-5.10/800-ubnt-ledbar-driver.patch deleted file mode 100644 index 2b4baab456..0000000000 --- a/target/linux/generic/hack-5.10/800-ubnt-ledbar-driver.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- a/drivers/leds/Kconfig -+++ b/drivers/leds/Kconfig -@@ -931,6 +931,16 @@ config LEDS_ACER_A500 - - source "drivers/leds/blink/Kconfig" - -+config LEDS_UBNT_LEDBAR -+ tristate "LED support for Ubiquiti UniFi 6 LR" -+ depends on LEDS_CLASS && I2C && OF -+ help -+ This option enables support for the Ubiquiti LEDBAR -+ LED driver. -+ -+ To compile this driver as a module, choose M here: the module -+ will be called leds-ubnt-ledbar. -+ - comment "LED Triggers" - source "drivers/leds/trigger/Kconfig" - ---- a/drivers/leds/Makefile -+++ b/drivers/leds/Makefile -@@ -93,6 +93,7 @@ obj-$(CONFIG_LEDS_TURRIS_OMNIA) += leds - obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o - obj-$(CONFIG_LEDS_WM8350) += leds-wm8350.o - obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o -+obj-$(CONFIG_LEDS_UBNT_LEDBAR) += leds-ubnt-ledbar.o - - # LED SPI Drivers - obj-$(CONFIG_LEDS_CR0014114) += leds-cr0014114.o diff --git a/target/linux/generic/hack-5.10/901-debloat_sock_diag.patch b/target/linux/generic/hack-5.10/901-debloat_sock_diag.patch deleted file mode 100644 index 1207084fd3..0000000000 --- a/target/linux/generic/hack-5.10/901-debloat_sock_diag.patch +++ /dev/null @@ -1,162 +0,0 @@ -From 3b6115d6b57a263bdc8c9b1df273bd4a7955eead Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sat, 8 Jul 2017 08:16:31 +0200 -Subject: debloat: add some debloat patches, strip down procfs and make O_DIRECT support optional, saves ~15K after lzma on MIPS - -Signed-off-by: Felix Fietkau ---- - net/Kconfig | 3 +++ - net/core/Makefile | 3 ++- - net/core/sock.c | 2 ++ - net/ipv4/Kconfig | 1 + - net/netlink/Kconfig | 1 + - net/packet/Kconfig | 1 + - net/unix/Kconfig | 1 + - 7 files changed, 11 insertions(+), 1 deletion(-) - ---- a/net/Kconfig -+++ b/net/Kconfig -@@ -104,6 +104,9 @@ source "net/mptcp/Kconfig" - - endif # if INET - -+config SOCK_DIAG -+ bool -+ - config NETWORK_SECMARK - bool "Security Marking" - help ---- a/net/core/Makefile -+++ b/net/core/Makefile -@@ -10,9 +10,10 @@ obj-$(CONFIG_SYSCTL) += sysctl_net_core. - - obj-y += dev.o dev_addr_lists.o dst.o netevent.o \ - neighbour.o rtnetlink.o utils.o link_watch.o filter.o \ -- sock_diag.o dev_ioctl.o tso.o sock_reuseport.o \ -+ dev_ioctl.o tso.o sock_reuseport.o \ - fib_notifier.o xdp.o flow_offload.o - -+obj-$(CONFIG_SOCK_DIAG) += sock_diag.o - obj-y += net-sysfs.o - obj-$(CONFIG_PAGE_POOL) += page_pool.o - obj-$(CONFIG_PROC_FS) += net-procfs.o ---- a/net/core/sock.c -+++ b/net/core/sock.c -@@ -114,6 +114,7 @@ - #include - #include - #include -+#include - - #include - -@@ -141,6 +142,7 @@ - - static DEFINE_MUTEX(proto_list_mutex); - static LIST_HEAD(proto_list); -+DEFINE_COOKIE(sock_cookie); - - static void sock_inuse_add(struct net *net, int val); - -@@ -526,6 +528,18 @@ discard_and_relse: - } - EXPORT_SYMBOL(__sk_receive_skb); - -+u64 __sock_gen_cookie(struct sock *sk) -+{ -+ while (1) { -+ u64 res = atomic64_read(&sk->sk_cookie); -+ -+ if (res) -+ return res; -+ res = gen_cookie_next(&sock_cookie); -+ atomic64_cmpxchg(&sk->sk_cookie, 0, res); -+ } -+} -+ - struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie) - { - struct dst_entry *dst = __sk_dst_get(sk); -@@ -1834,9 +1848,11 @@ static void __sk_free(struct sock *sk) - if (likely(sk->sk_net_refcnt)) - sock_inuse_add(sock_net(sk), -1); - -+#ifdef CONFIG_SOCK_DIAG - if (unlikely(sk->sk_net_refcnt && sock_diag_has_destroy_listeners(sk))) - sock_diag_broadcast_destroy(sk); - else -+#endif - sk_destruct(sk); - } - ---- a/net/core/sock_diag.c -+++ b/net/core/sock_diag.c -@@ -11,7 +11,6 @@ - #include - #include - #include --#include - #include - #include - -@@ -20,20 +19,6 @@ static int (*inet_rcv_compat)(struct sk_ - static DEFINE_MUTEX(sock_diag_table_mutex); - static struct workqueue_struct *broadcast_wq; - --DEFINE_COOKIE(sock_cookie); -- --u64 __sock_gen_cookie(struct sock *sk) --{ -- while (1) { -- u64 res = atomic64_read(&sk->sk_cookie); -- -- if (res) -- return res; -- res = gen_cookie_next(&sock_cookie); -- atomic64_cmpxchg(&sk->sk_cookie, 0, res); -- } --} -- - int sock_diag_check_cookie(struct sock *sk, const __u32 *cookie) - { - u64 res; ---- a/net/ipv4/Kconfig -+++ b/net/ipv4/Kconfig -@@ -424,6 +424,7 @@ config INET_TUNNEL - - config INET_DIAG - tristate "INET: socket monitoring interface" -+ select SOCK_DIAG - default y - help - Support for INET (TCP, DCCP, etc) socket monitoring interface used by ---- a/net/netlink/Kconfig -+++ b/net/netlink/Kconfig -@@ -5,6 +5,7 @@ - - config NETLINK_DIAG - tristate "NETLINK: socket monitoring interface" -+ select SOCK_DIAG - default n - help - Support for NETLINK socket monitoring interface used by the ss tool. ---- a/net/packet/Kconfig -+++ b/net/packet/Kconfig -@@ -19,6 +19,7 @@ config PACKET - config PACKET_DIAG - tristate "Packet: sockets monitoring interface" - depends on PACKET -+ select SOCK_DIAG - default n - help - Support for PF_PACKET sockets monitoring interface used by the ss tool. ---- a/net/unix/Kconfig -+++ b/net/unix/Kconfig -@@ -28,6 +28,7 @@ config UNIX_SCM - config UNIX_DIAG - tristate "UNIX: socket monitoring interface" - depends on UNIX -+ select SOCK_DIAG - default n - help - Support for UNIX socket monitoring interface used by the ss tool. diff --git a/target/linux/generic/hack-5.10/902-debloat_proc.patch b/target/linux/generic/hack-5.10/902-debloat_proc.patch deleted file mode 100644 index d8c289ac1a..0000000000 --- a/target/linux/generic/hack-5.10/902-debloat_proc.patch +++ /dev/null @@ -1,408 +0,0 @@ -From 9e3f1d0805b2d919904dd9a4ff0d956314cc3cba Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sat, 8 Jul 2017 08:20:09 +0200 -Subject: debloat: procfs - -Signed-off-by: Felix Fietkau ---- - fs/locks.c | 2 ++ - fs/proc/Kconfig | 5 +++++ - fs/proc/consoles.c | 3 +++ - fs/proc/proc_tty.c | 11 ++++++++++- - include/net/snmp.h | 18 +++++++++++++++++- - ipc/msg.c | 3 +++ - ipc/sem.c | 2 ++ - ipc/shm.c | 2 ++ - ipc/util.c | 3 +++ - kernel/exec_domain.c | 2 ++ - kernel/irq/proc.c | 9 +++++++++ - kernel/time/timer_list.c | 2 ++ - mm/vmalloc.c | 2 ++ - mm/vmstat.c | 8 +++++--- - net/8021q/vlanproc.c | 6 ++++++ - net/core/net-procfs.c | 18 ++++++++++++------ - net/core/sock.c | 2 ++ - net/ipv4/fib_trie.c | 18 ++++++++++++------ - net/ipv4/proc.c | 3 +++ - net/ipv4/route.c | 3 +++ - 20 files changed, 105 insertions(+), 17 deletions(-) - ---- a/fs/locks.c -+++ b/fs/locks.c -@@ -3016,6 +3016,8 @@ static const struct seq_operations locks - - static int __init proc_locks_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; - proc_create_seq_private("locks", 0, NULL, &locks_seq_operations, - sizeof(struct locks_iterator), NULL); - return 0; ---- a/fs/proc/Kconfig -+++ b/fs/proc/Kconfig -@@ -100,6 +100,11 @@ config PROC_CHILDREN - Say Y if you are running any user-space software which takes benefit from - this interface. For example, rkt is such a piece of software. - -+config PROC_STRIPPED -+ default n -+ depends on EXPERT -+ bool "Strip non-essential /proc functionality to reduce code size" -+ - config PROC_PID_ARCH_STATUS - def_bool n - depends on PROC_FS ---- a/fs/proc/consoles.c -+++ b/fs/proc/consoles.c -@@ -92,6 +92,9 @@ static const struct seq_operations conso - - static int __init proc_consoles_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; -+ - proc_create_seq("consoles", 0, NULL, &consoles_op); - return 0; - } ---- a/fs/proc/proc_tty.c -+++ b/fs/proc/proc_tty.c -@@ -133,7 +133,10 @@ static const struct seq_operations tty_d - void proc_tty_register_driver(struct tty_driver *driver) - { - struct proc_dir_entry *ent; -- -+ -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - if (!driver->driver_name || driver->proc_entry || - !driver->ops->proc_show) - return; -@@ -150,6 +153,9 @@ void proc_tty_unregister_driver(struct t - { - struct proc_dir_entry *ent; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - ent = driver->proc_entry; - if (!ent) - return; -@@ -164,6 +170,9 @@ void proc_tty_unregister_driver(struct t - */ - void __init proc_tty_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - if (!proc_mkdir("tty", NULL)) - return; - proc_mkdir("tty/ldisc", NULL); /* Preserved: it's userspace visible */ ---- a/include/net/snmp.h -+++ b/include/net/snmp.h -@@ -124,6 +124,21 @@ struct linux_tls_mib { - #define DECLARE_SNMP_STAT(type, name) \ - extern __typeof__(type) __percpu *name - -+#ifdef CONFIG_PROC_STRIPPED -+#define __SNMP_STATS_DUMMY(mib) \ -+ do { (void) mib->mibs[0]; } while(0) -+ -+#define __SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib) -+#define SNMP_INC_STATS_ATOMIC_LONG(mib, field) __SNMP_STATS_DUMMY(mib) -+#define SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib) -+#define SNMP_DEC_STATS(mib, field) __SNMP_STATS_DUMMY(mib) -+#define __SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib) -+#define SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib) -+#define SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib) -+#define __SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib) -+ -+#else -+ - #define __SNMP_INC_STATS(mib, field) \ - __this_cpu_inc(mib->mibs[field]) - -@@ -154,8 +169,9 @@ struct linux_tls_mib { - __this_cpu_add(ptr[basefield##OCTETS], addend); \ - } while (0) - -+#endif - --#if BITS_PER_LONG==32 -+#if (BITS_PER_LONG==32) && !defined(CONFIG_PROC_STRIPPED) - - #define __SNMP_ADD_STATS64(mib, field, addend) \ - do { \ ---- a/ipc/msg.c -+++ b/ipc/msg.c -@@ -1350,6 +1350,9 @@ void __init msg_init(void) - { - msg_init_ns(&init_ipc_ns); - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - ipc_init_proc_interface("sysvipc/msg", - " key msqid perms cbytes qnum lspid lrpid uid gid cuid cgid stime rtime ctime\n", - IPC_MSG_IDS, sysvipc_msg_proc_show); ---- a/ipc/sem.c -+++ b/ipc/sem.c -@@ -266,6 +266,8 @@ void sem_exit_ns(struct ipc_namespace *n - void __init sem_init(void) - { - sem_init_ns(&init_ipc_ns); -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; - ipc_init_proc_interface("sysvipc/sem", - " key semid perms nsems uid gid cuid cgid otime ctime\n", - IPC_SEM_IDS, sysvipc_sem_proc_show); ---- a/ipc/shm.c -+++ b/ipc/shm.c -@@ -154,6 +154,8 @@ pure_initcall(ipc_ns_init); - - void __init shm_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; - ipc_init_proc_interface("sysvipc/shm", - #if BITS_PER_LONG <= 32 - " key shmid perms size cpid lpid nattch uid gid cuid cgid atime dtime ctime rss swap\n", ---- a/ipc/util.c -+++ b/ipc/util.c -@@ -140,6 +140,9 @@ void __init ipc_init_proc_interface(cons - struct proc_dir_entry *pde; - struct ipc_proc_iface *iface; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - iface = kmalloc(sizeof(*iface), GFP_KERNEL); - if (!iface) - return; ---- a/kernel/exec_domain.c -+++ b/kernel/exec_domain.c -@@ -29,6 +29,8 @@ static int execdomains_proc_show(struct - - static int __init proc_execdomains_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; - proc_create_single("execdomains", 0, NULL, execdomains_proc_show); - return 0; - } ---- a/kernel/irq/proc.c -+++ b/kernel/irq/proc.c -@@ -341,6 +341,9 @@ void register_irq_proc(unsigned int irq, - void __maybe_unused *irqp = (void *)(unsigned long) irq; - char name [MAX_NAMELEN]; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP)) -+ return; -+ - if (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip)) - return; - -@@ -394,6 +397,9 @@ void unregister_irq_proc(unsigned int ir - { - char name [MAX_NAMELEN]; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP)) -+ return; -+ - if (!root_irq_dir || !desc->dir) - return; - #ifdef CONFIG_SMP -@@ -432,6 +438,9 @@ void init_irq_proc(void) - unsigned int irq; - struct irq_desc *desc; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP)) -+ return; -+ - /* create /proc/irq */ - root_irq_dir = proc_mkdir("irq", NULL); - if (!root_irq_dir) ---- a/kernel/time/timer_list.c -+++ b/kernel/time/timer_list.c -@@ -370,6 +370,8 @@ static int __init init_timer_list_procfs - { - struct proc_dir_entry *pe; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; - pe = proc_create_seq_private("timer_list", 0400, NULL, &timer_list_sops, - sizeof(struct timer_list_iter), NULL); - if (!pe) ---- a/mm/vmalloc.c -+++ b/mm/vmalloc.c -@@ -3572,6 +3572,8 @@ static const struct seq_operations vmall - - static int __init proc_vmalloc_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; - if (IS_ENABLED(CONFIG_NUMA)) - proc_create_seq_private("vmallocinfo", 0400, NULL, - &vmalloc_op, ---- a/mm/vmstat.c -+++ b/mm/vmstat.c -@@ -2040,10 +2040,12 @@ void __init init_mm_internals(void) - start_shepherd_timer(); - #endif - #ifdef CONFIG_PROC_FS -- proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op); -- proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) { -+ proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op); -+ proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op); -+ proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op); -+ } - proc_create_seq("vmstat", 0444, NULL, &vmstat_op); -- proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op); - #endif - } - ---- a/net/8021q/vlanproc.c -+++ b/net/8021q/vlanproc.c -@@ -93,6 +93,9 @@ void vlan_proc_cleanup(struct net *net) - { - struct vlan_net *vn = net_generic(net, vlan_net_id); - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - if (vn->proc_vlan_conf) - remove_proc_entry(name_conf, vn->proc_vlan_dir); - -@@ -112,6 +115,9 @@ int __net_init vlan_proc_init(struct net - { - struct vlan_net *vn = net_generic(net, vlan_net_id); - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; -+ - vn->proc_vlan_dir = proc_net_mkdir(net, name_root, net->proc_net); - if (!vn->proc_vlan_dir) - goto err; ---- a/net/core/net-procfs.c -+++ b/net/core/net-procfs.c -@@ -320,10 +320,12 @@ static int __net_init dev_proc_net_init( - if (!proc_create_net("dev", 0444, net->proc_net, &dev_seq_ops, - sizeof(struct seq_net_private))) - goto out; -- if (!proc_create_seq("softnet_stat", 0444, net->proc_net, -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && -+ !proc_create_seq("softnet_stat", 0444, net->proc_net, - &softnet_seq_ops)) - goto out_dev; -- if (!proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops, -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && -+ !proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops, - sizeof(struct seq_net_private))) - goto out_softnet; - -@@ -333,9 +335,11 @@ static int __net_init dev_proc_net_init( - out: - return rc; - out_ptype: -- remove_proc_entry("ptype", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ remove_proc_entry("ptype", net->proc_net); - out_softnet: -- remove_proc_entry("softnet_stat", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ remove_proc_entry("softnet_stat", net->proc_net); - out_dev: - remove_proc_entry("dev", net->proc_net); - goto out; -@@ -345,8 +349,10 @@ static void __net_exit dev_proc_net_exit - { - wext_proc_exit(net); - -- remove_proc_entry("ptype", net->proc_net); -- remove_proc_entry("softnet_stat", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) { -+ remove_proc_entry("ptype", net->proc_net); -+ remove_proc_entry("softnet_stat", net->proc_net); -+ } - remove_proc_entry("dev", net->proc_net); - } - ---- a/net/core/sock.c -+++ b/net/core/sock.c -@@ -3710,6 +3710,8 @@ static __net_initdata struct pernet_oper - - static int __init proto_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; - return register_pernet_subsys(&proto_net_ops); - } - ---- a/net/ipv4/fib_trie.c -+++ b/net/ipv4/fib_trie.c -@@ -2988,11 +2988,13 @@ static const struct seq_operations fib_r - - int __net_init fib_proc_init(struct net *net) - { -- if (!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops, -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && -+ !proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops, - sizeof(struct fib_trie_iter))) - goto out1; - -- if (!proc_create_net_single("fib_triestat", 0444, net->proc_net, -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && -+ !proc_create_net_single("fib_triestat", 0444, net->proc_net, - fib_triestat_seq_show, NULL)) - goto out2; - -@@ -3003,17 +3005,21 @@ int __net_init fib_proc_init(struct net - return 0; - - out3: -- remove_proc_entry("fib_triestat", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ remove_proc_entry("fib_triestat", net->proc_net); - out2: -- remove_proc_entry("fib_trie", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ remove_proc_entry("fib_trie", net->proc_net); - out1: - return -ENOMEM; - } - - void __net_exit fib_proc_exit(struct net *net) - { -- remove_proc_entry("fib_trie", net->proc_net); -- remove_proc_entry("fib_triestat", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) { -+ remove_proc_entry("fib_trie", net->proc_net); -+ remove_proc_entry("fib_triestat", net->proc_net); -+ } - remove_proc_entry("route", net->proc_net); - } - ---- a/net/ipv4/proc.c -+++ b/net/ipv4/proc.c -@@ -528,5 +528,8 @@ static __net_initdata struct pernet_oper - - int __init ip_misc_proc_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; -+ - return register_pernet_subsys(&ip_proc_ops); - } ---- a/net/ipv4/route.c -+++ b/net/ipv4/route.c -@@ -410,6 +410,9 @@ static struct pernet_operations ip_rt_pr - - static int __init ip_rt_proc_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; -+ - return register_pernet_subsys(&ip_rt_proc_ops); - } - diff --git a/target/linux/generic/hack-5.10/904-debloat_dma_buf.patch b/target/linux/generic/hack-5.10/904-debloat_dma_buf.patch deleted file mode 100644 index 7bf15c1dd8..0000000000 --- a/target/linux/generic/hack-5.10/904-debloat_dma_buf.patch +++ /dev/null @@ -1,92 +0,0 @@ -From e3692cb2fcd5ba1244512a0f43b8118f65f1c375 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sat, 8 Jul 2017 08:20:43 +0200 -Subject: debloat: dmabuf - -Signed-off-by: Felix Fietkau ---- - drivers/base/Kconfig | 2 +- - drivers/dma-buf/Makefile | 10 +++++++--- - drivers/dma-buf/dma-buf.c | 4 +++- - kernel/sched/core.c | 1 + - 4 files changed, 12 insertions(+), 5 deletions(-) - ---- a/drivers/base/Kconfig -+++ b/drivers/base/Kconfig -@@ -184,7 +184,7 @@ config SOC_BUS - source "drivers/base/regmap/Kconfig" - - config DMA_SHARED_BUFFER -- bool -+ tristate - default n - select IRQ_WORK - help ---- a/drivers/dma-buf/heaps/Makefile -+++ b/drivers/dma-buf/heaps/Makefile -@@ -1,4 +1,4 @@ - # SPDX-License-Identifier: GPL-2.0 --obj-y += heap-helpers.o --obj-$(CONFIG_DMABUF_HEAPS_SYSTEM) += system_heap.o --obj-$(CONFIG_DMABUF_HEAPS_CMA) += cma_heap.o -+dma-buf-objs-y += heap-helpers.o -+dma-buf-objs-$(CONFIG_DMABUF_HEAPS_SYSTEM) += system_heap.o -+dma-buf-objs-$(CONFIG_DMABUF_HEAPS_CMA) += cma_heap.o ---- a/drivers/dma-buf/Makefile -+++ b/drivers/dma-buf/Makefile -@@ -1,15 +1,19 @@ - # SPDX-License-Identifier: GPL-2.0-only --obj-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \ -+obj-$(CONFIG_DMA_SHARED_BUFFER) := dma-shared-buffer.o -+ -+dma-buf-objs-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \ - dma-resv.o seqno-fence.o --obj-$(CONFIG_DMABUF_HEAPS) += dma-heap.o --obj-$(CONFIG_DMABUF_HEAPS) += heaps/ --obj-$(CONFIG_SYNC_FILE) += sync_file.o --obj-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o --obj-$(CONFIG_UDMABUF) += udmabuf.o -+dma-buf-objs-$(CONFIG_DMABUF_HEAPS) += dma-heap.o -+obj-$(CONFIG_DMABUF_HEAPS) += heaps/ -+dma-buf-objs-$(CONFIG_SYNC_FILE) += sync_file.o -+dma-buf-objs-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o -+dma-buf-objs-$(CONFIG_UDMABUF) += udmabuf.o - - dmabuf_selftests-y := \ - selftest.o \ - st-dma-fence.o \ - st-dma-fence-chain.o - --obj-$(CONFIG_DMABUF_SELFTESTS) += dmabuf_selftests.o -+dma-buf-objs-$(CONFIG_DMABUF_SELFTESTS) += dmabuf_selftests.o -+ -+dma-shared-buffer-objs := $(dma-buf-objs-y) ---- a/drivers/dma-buf/dma-buf.c -+++ b/drivers/dma-buf/dma-buf.c -@@ -1419,4 +1419,5 @@ static void __exit dma_buf_deinit(void) - dma_buf_uninit_debugfs(); - kern_unmount(dma_buf_mnt); - } --__exitcall(dma_buf_deinit); -+module_exit(dma_buf_deinit); -+MODULE_LICENSE("GPL"); ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -3074,6 +3074,7 @@ int wake_up_state(struct task_struct *p, - { - return try_to_wake_up(p, state, 0); - } -+EXPORT_SYMBOL_GPL(wake_up_state); - - /* - * Perform scheduler related setup for a newly forked process p. ---- a/fs/d_path.c -+++ b/fs/d_path.c -@@ -311,6 +311,7 @@ char *dynamic_dname(struct dentry *dentr - buffer += buflen - sz; - return memcpy(buffer, temp, sz); - } -+EXPORT_SYMBOL_GPL(dynamic_dname); - - char *simple_dname(struct dentry *dentry, char *buffer, int buflen) - { diff --git a/target/linux/generic/hack-5.10/920-device_tree_cmdline.patch b/target/linux/generic/hack-5.10/920-device_tree_cmdline.patch deleted file mode 100644 index 27d4d7f1e5..0000000000 --- a/target/linux/generic/hack-5.10/920-device_tree_cmdline.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/drivers/of/fdt.c -+++ b/drivers/of/fdt.c -@@ -1055,6 +1055,9 @@ int __init early_init_dt_scan_chosen(uns - p = of_get_flat_dt_prop(node, "bootargs", &l); - if (p != NULL && l > 0) - strlcpy(data, p, min(l, COMMAND_LINE_SIZE)); -+ p = of_get_flat_dt_prop(node, "bootargs-append", &l); -+ if (p != NULL && l > 0) -+ strlcat(data, p, min_t(int, strlen(data) + (int)l, COMMAND_LINE_SIZE)); - - /* - * CONFIG_CMDLINE is meant to be a default in case nothing else diff --git a/target/linux/generic/hack-5.15/204-module_strip.patch b/target/linux/generic/hack-5.15/204-module_strip.patch new file mode 100644 index 0000000000..e650c1b184 --- /dev/null +++ b/target/linux/generic/hack-5.15/204-module_strip.patch @@ -0,0 +1,212 @@ +From a779a482fb9b9f8fcdf8b2519c789b4b9bb5dd05 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Fri, 7 Jul 2017 16:56:48 +0200 +Subject: build: add a hack for removing non-essential module info + +Signed-off-by: Felix Fietkau +--- + include/linux/module.h | 13 ++++++++----- + include/linux/moduleparam.h | 15 ++++++++++++--- + init/Kconfig | 7 +++++++ + kernel/module.c | 5 ++++- + scripts/mod/modpost.c | 12 ++++++++++++ + 5 files changed, 43 insertions(+), 9 deletions(-) + +--- a/include/linux/module.h ++++ b/include/linux/module.h +@@ -164,6 +164,7 @@ extern void cleanup_module(void); + + /* Generic info of form tag = "info" */ + #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info) ++#define MODULE_INFO_STRIP(tag, info) __MODULE_INFO_STRIP(tag, tag, info) + + /* For userspace: you can also call me... */ + #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias) +@@ -233,12 +234,12 @@ extern void cleanup_module(void); + * Author(s), use "Name " or just "Name", for multiple + * authors use multiple MODULE_AUTHOR() statements/lines. + */ +-#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author) ++#define MODULE_AUTHOR(_author) MODULE_INFO_STRIP(author, _author) + + /* What your module does. */ +-#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description) ++#define MODULE_DESCRIPTION(_description) MODULE_INFO_STRIP(description, _description) + +-#ifdef MODULE ++#if defined(MODULE) && !defined(CONFIG_MODULE_STRIPPED) + /* Creates an alias so file2alias.c can find device table. */ + #define MODULE_DEVICE_TABLE(type, name) \ + extern typeof(name) __mod_##type##__##name##_device_table \ +@@ -265,7 +266,9 @@ extern typeof(name) __mod_##type##__##na + */ + + #if defined(MODULE) || !defined(CONFIG_SYSFS) +-#define MODULE_VERSION(_version) MODULE_INFO(version, _version) ++#define MODULE_VERSION(_version) MODULE_INFO_STRIP(version, _version) ++#elif defined(CONFIG_MODULE_STRIPPED) ++#define MODULE_VERSION(_version) __MODULE_INFO_DISABLED(version) + #else + #define MODULE_VERSION(_version) \ + MODULE_INFO(version, _version); \ +@@ -288,7 +291,7 @@ extern typeof(name) __mod_##type##__##na + /* Optional firmware file (or files) needed by the module + * format is simply firmware file name. Multiple firmware + * files require multiple MODULE_FIRMWARE() specifiers */ +-#define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware) ++#define MODULE_FIRMWARE(_firmware) MODULE_INFO_STRIP(firmware, _firmware) + + #define MODULE_IMPORT_NS(ns) MODULE_INFO(import_ns, #ns) + +--- a/include/linux/moduleparam.h ++++ b/include/linux/moduleparam.h +@@ -20,6 +20,16 @@ + /* Chosen so that structs with an unsigned long line up. */ + #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long)) + ++/* This struct is here for syntactic coherency, it is not used */ ++#define __MODULE_INFO_DISABLED(name) \ ++ struct __UNIQUE_ID(name) {} ++ ++#ifdef CONFIG_MODULE_STRIPPED ++#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO_DISABLED(name) ++#else ++#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO(tag, name, info) ++#endif ++ + #define __MODULE_INFO(tag, name, info) \ + static const char __UNIQUE_ID(name)[] \ + __used __section(".modinfo") __aligned(1) \ +@@ -31,7 +41,7 @@ + /* One for each parameter, describing how to use it. Some files do + multiple of these per line, so can't just use MODULE_INFO. */ + #define MODULE_PARM_DESC(_parm, desc) \ +- __MODULE_INFO(parm, _parm, #_parm ":" desc) ++ __MODULE_INFO_STRIP(parm, _parm, #_parm ":" desc) + + struct kernel_param; + +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -2356,6 +2356,13 @@ config UNUSED_KSYMS_WHITELIST + one per line. The path can be absolute, or relative to the kernel + source tree. + ++config MODULE_STRIPPED ++ bool "Reduce module size" ++ depends on MODULES ++ help ++ Remove module parameter descriptions, author info, version, aliases, ++ device tables, etc. ++ + endif # MODULES + + config MODULES_TREE_LOOKUP +--- a/kernel/module.c ++++ b/kernel/module.c +@@ -1218,6 +1218,7 @@ static struct module_attribute *modinfo_ + + static const char vermagic[] = VERMAGIC_STRING; + ++#if defined(CONFIG_MODVERSIONS) || !defined(CONFIG_MODULE_STRIPPED) + static int try_to_force_load(struct module *mod, const char *reason) + { + #ifdef CONFIG_MODULE_FORCE_LOAD +@@ -1229,6 +1230,7 @@ static int try_to_force_load(struct modu + return -ENOEXEC; + #endif + } ++#endif + + #ifdef CONFIG_MODVERSIONS + +@@ -3274,9 +3276,11 @@ static int setup_load_info(struct load_i + + static int check_modinfo(struct module *mod, struct load_info *info, int flags) + { +- const char *modmagic = get_modinfo(info, "vermagic"); + int err; + ++#ifndef CONFIG_MODULE_STRIPPED ++ const char *modmagic = get_modinfo(info, "vermagic"); ++ + if (flags & MODULE_INIT_IGNORE_VERMAGIC) + modmagic = NULL; + +@@ -3297,6 +3301,7 @@ static int check_modinfo(struct module * + mod->name); + add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK); + } ++#endif + + check_modinfo_retpoline(mod, info); + +--- a/scripts/mod/modpost.c ++++ b/scripts/mod/modpost.c +@@ -2000,7 +2000,9 @@ static void read_symbols(const char *mod + symname = remove_dot(info.strtab + sym->st_name); + + handle_symbol(mod, &info, sym, symname); ++#ifndef CONFIG_MODULE_STRIPPED + handle_moddevtable(mod, &info, sym, symname); ++#endif + } + + for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { +@@ -2179,8 +2181,10 @@ static void add_header(struct buffer *b, + buf_printf(b, "BUILD_SALT;\n"); + buf_printf(b, "BUILD_LTO_INFO;\n"); + buf_printf(b, "\n"); ++#ifndef CONFIG_MODULE_STRIPPED + buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n"); + buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n"); ++#endif + buf_printf(b, "\n"); + buf_printf(b, "__visible struct module __this_module\n"); + buf_printf(b, "__section(\".gnu.linkonce.this_module\") = {\n"); +@@ -2197,8 +2201,10 @@ static void add_header(struct buffer *b, + + static void add_intree_flag(struct buffer *b, int is_intree) + { ++#ifndef CONFIG_MODULE_STRIPPED + if (is_intree) + buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n"); ++#endif + } + + /* Cannot check for assembler */ +@@ -2211,8 +2217,10 @@ static void add_retpoline(struct buffer + + static void add_staging_flag(struct buffer *b, const char *name) + { ++#ifndef CONFIG_MODULE_STRIPPED + if (strstarts(name, "drivers/staging")) + buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n"); ++#endif + } + + /** +@@ -2292,11 +2300,13 @@ static void add_depends(struct buffer *b + + static void add_srcversion(struct buffer *b, struct module *mod) + { ++#ifndef CONFIG_MODULE_STRIPPED + if (mod->srcversion[0]) { + buf_printf(b, "\n"); + buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n", + mod->srcversion); + } ++#endif + } + + static void write_buf(struct buffer *b, const char *fname) +@@ -2545,7 +2555,9 @@ int main(int argc, char **argv) + add_staging_flag(&buf, mod->name); + add_versions(&buf, mod); + add_depends(&buf, mod); ++#ifndef CONFIG_MODULE_STRIPPED + add_moddevtable(&buf, mod); ++#endif + add_srcversion(&buf, mod); + + sprintf(fname, "%s.mod.c", mod->name); diff --git a/target/linux/generic/hack-5.15/205-kconfig-abort-configuration-on-unset-symbol.patch b/target/linux/generic/hack-5.15/205-kconfig-abort-configuration-on-unset-symbol.patch new file mode 100644 index 0000000000..e2c00b8155 --- /dev/null +++ b/target/linux/generic/hack-5.15/205-kconfig-abort-configuration-on-unset-symbol.patch @@ -0,0 +1,41 @@ +From 310e8e04a05d9eb43fa9dd7f00143300afcaa37a Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Fri, 11 Nov 2022 13:33:44 +0100 +Subject: [PATCH] kconfig: abort configuration on unset symbol + +When a target configuration has unset Kconfig symbols, the build will +fail when libreCMC is compiled with V=s and stdin is connected to a tty. + +In case libreCMC is compiled without either of these preconditions, the +build will succeed with the symbols in question being unset. + +Modify the kernel configuration in a way it fails on unset symbols +regardless of the aforementioned preconditions. + +Signed-off-by: David Bauer +--- + scripts/kconfig/conf.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/scripts/kconfig/conf.c ++++ b/scripts/kconfig/conf.c +@@ -341,6 +341,9 @@ static int conf_askvalue(struct symbol * + } + /* fall through */ + default: ++ if (!tty_stdio && getenv("FAIL_ON_UNCONFIGURED")) { ++ exit(1); ++ } + fflush(stdout); + xfgets(line, sizeof(line), stdin); + break; +@@ -523,6 +526,9 @@ static int conf_choice(struct menu *menu + } + /* fall through */ + case oldaskconfig: ++ if (!tty_stdio && getenv("FAIL_ON_UNCONFIGURED")) { ++ exit(1); ++ } + fflush(stdout); + xfgets(line, sizeof(line), stdin); + strip(line); diff --git a/target/linux/generic/hack-5.10/210-darwin_scripts_include.patch b/target/linux/generic/hack-5.15/210-darwin_scripts_include.patch similarity index 100% rename from target/linux/generic/hack-5.10/210-darwin_scripts_include.patch rename to target/linux/generic/hack-5.15/210-darwin_scripts_include.patch diff --git a/target/linux/generic/hack-5.10/211-darwin-uuid-typedef-clash.patch b/target/linux/generic/hack-5.15/211-darwin-uuid-typedef-clash.patch similarity index 100% rename from target/linux/generic/hack-5.10/211-darwin-uuid-typedef-clash.patch rename to target/linux/generic/hack-5.15/211-darwin-uuid-typedef-clash.patch diff --git a/target/linux/generic/hack-5.15/212-tools_portability.patch b/target/linux/generic/hack-5.15/212-tools_portability.patch new file mode 100644 index 0000000000..b488155f94 --- /dev/null +++ b/target/linux/generic/hack-5.15/212-tools_portability.patch @@ -0,0 +1,110 @@ +From 48232d3d931c95953ce2ddfe7da7bb164aef6a73 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Fri, 7 Jul 2017 17:03:16 +0200 +Subject: fix portability of some includes files in tools/ used on the host + +Signed-off-by: Felix Fietkau +--- + tools/include/tools/be_byteshift.h | 4 ++++ + tools/include/tools/le_byteshift.h | 4 ++++ + tools/include/tools/linux_types.h | 22 ++++++++++++++++++++++ + 3 files changed, 30 insertions(+) + create mode 100644 tools/include/tools/linux_types.h + +--- a/tools/include/tools/be_byteshift.h ++++ b/tools/include/tools/be_byteshift.h +@@ -2,6 +2,10 @@ + #ifndef _TOOLS_BE_BYTESHIFT_H + #define _TOOLS_BE_BYTESHIFT_H + ++#ifndef __linux__ ++#include "linux_types.h" ++#endif ++ + #include + + static inline uint16_t __get_unaligned_be16(const uint8_t *p) +--- a/tools/include/tools/le_byteshift.h ++++ b/tools/include/tools/le_byteshift.h +@@ -2,6 +2,10 @@ + #ifndef _TOOLS_LE_BYTESHIFT_H + #define _TOOLS_LE_BYTESHIFT_H + ++#ifndef __linux__ ++#include "linux_types.h" ++#endif ++ + #include + + static inline uint16_t __get_unaligned_le16(const uint8_t *p) +--- /dev/null ++++ b/tools/include/tools/linux_types.h +@@ -0,0 +1,26 @@ ++#ifndef __LINUX_TYPES_H ++#define __LINUX_TYPES_H ++ ++#include ++ ++typedef int8_t __s8; ++typedef uint8_t __u8; ++typedef uint8_t __be8; ++typedef uint8_t __le8; ++ ++typedef int16_t __s16; ++typedef uint16_t __u16; ++typedef uint16_t __be16; ++typedef uint16_t __le16; ++ ++typedef int32_t __s32; ++typedef uint32_t __u32; ++typedef uint32_t __be32; ++typedef uint32_t __le32; ++ ++typedef int64_t __s64; ++typedef uint64_t __u64; ++typedef uint64_t __be64; ++typedef uint64_t __le64; ++ ++#endif +--- a/tools/include/linux/types.h ++++ b/tools/include/linux/types.h +@@ -10,8 +10,12 @@ + #define __SANE_USERSPACE_TYPES__ /* For PPC64, to get LL64 types */ + #endif + ++#ifndef __linux__ ++#include ++#else + #include + #include ++#endif + + struct page; + struct kmem_cache; +--- a/tools/perf/pmu-events/jevents.c ++++ b/tools/perf/pmu-events/jevents.c +@@ -1,4 +1,6 @@ ++#ifdef __linux__ + #define _XOPEN_SOURCE 500 /* needed for nftw() */ ++#endif + #define _GNU_SOURCE /* needed for asprintf() */ + + /* Parse event JSON files */ +@@ -35,6 +37,7 @@ + #include + #include + #include ++#include + #include + #include + #include +--- a/tools/perf/pmu-events/json.c ++++ b/tools/perf/pmu-events/json.c +@@ -38,7 +38,6 @@ + #include + #include "jsmn.h" + #include "json.h" +-#include + + + static char *mapfile(const char *fn, size_t *size) diff --git a/target/linux/generic/hack-5.15/214-spidev_h_portability.patch b/target/linux/generic/hack-5.15/214-spidev_h_portability.patch new file mode 100644 index 0000000000..db754a2903 --- /dev/null +++ b/target/linux/generic/hack-5.15/214-spidev_h_portability.patch @@ -0,0 +1,24 @@ +From be9be95ff10e16a5b4ad36f903978d0cc5747024 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Fri, 7 Jul 2017 17:04:08 +0200 +Subject: kernel: fix linux/spi/spidev.h portability issues with musl + +Felix will try to get this define included into musl + +lede-commit: 795e7cf60de19e7a076a46874fab7bb88b43bbff +Signed-off-by: Felix Fietkau +--- + include/uapi/linux/spi/spidev.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/include/uapi/linux/spi/spidev.h ++++ b/include/uapi/linux/spi/spidev.h +@@ -93,7 +93,7 @@ struct spi_ioc_transfer { + + /* not all platforms use or _IOC_TYPECHECK() ... */ + #define SPI_MSGSIZE(N) \ +- ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \ ++ ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << 13)) \ + ? ((N)*(sizeof (struct spi_ioc_transfer))) : 0) + #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)]) + diff --git a/target/linux/generic/hack-5.15/220-arm-gc_sections.patch b/target/linux/generic/hack-5.15/220-arm-gc_sections.patch new file mode 100644 index 0000000000..dd6507c917 --- /dev/null +++ b/target/linux/generic/hack-5.15/220-arm-gc_sections.patch @@ -0,0 +1,123 @@ +From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Sat, 15 Jul 2017 23:42:36 +0200 +Subject: use -ffunction-sections, -fdata-sections and --gc-sections + +In combination with kernel symbol export stripping this significantly reduces +the kernel image size. Used on both ARM and MIPS architectures. + +Signed-off-by: Felix Fietkau +Signed-off-by: Jonas Gorski +Signed-off-by: Gabor Juhos +--- +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -118,6 +118,7 @@ config ARM + select HAVE_UID16 + select HAVE_VIRT_CPU_ACCOUNTING_GEN + select IRQ_FORCED_THREADING ++ select HAVE_LD_DEAD_CODE_DATA_ELIMINATION + select MODULES_USE_ELF_REL + select NEED_DMA_MAP_STATE + select OF_EARLY_FLATTREE if OF +--- a/arch/arm/boot/compressed/Makefile ++++ b/arch/arm/boot/compressed/Makefile +@@ -92,6 +92,7 @@ endif + ifeq ($(CONFIG_USE_OF),y) + OBJS += $(libfdt_objs) fdt_check_mem_start.o + endif ++KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL)) + + # -fstack-protector-strong triggers protection checks in this code, + # but it is being used too early to link to meaningful stack_chk logic. +--- a/arch/arm/kernel/vmlinux.lds.S ++++ b/arch/arm/kernel/vmlinux.lds.S +@@ -75,7 +75,7 @@ SECTIONS + . = ALIGN(4); + __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { + __start___ex_table = .; +- ARM_MMU_KEEP(*(__ex_table)) ++ KEEP(*(__ex_table)) + __stop___ex_table = .; + } + +@@ -100,24 +100,24 @@ SECTIONS + } + .init.arch.info : { + __arch_info_begin = .; +- *(.arch.info.init) ++ KEEP(*(.arch.info.init)) + __arch_info_end = .; + } + .init.tagtable : { + __tagtable_begin = .; +- *(.taglist.init) ++ KEEP(*(.taglist.init)) + __tagtable_end = .; + } + #ifdef CONFIG_SMP_ON_UP + .init.smpalt : { + __smpalt_begin = .; +- *(.alt.smp.init) ++ KEEP(*(.alt.smp.init)) + __smpalt_end = .; + } + #endif + .init.pv_table : { + __pv_table_begin = .; +- *(.pv_table) ++ KEEP(*(.pv_table)) + __pv_table_end = .; + } + +--- a/arch/arm/include/asm/vmlinux.lds.h ++++ b/arch/arm/include/asm/vmlinux.lds.h +@@ -42,13 +42,13 @@ + #define PROC_INFO \ + . = ALIGN(4); \ + __proc_info_begin = .; \ +- *(.proc.info.init) \ ++ KEEP(*(.proc.info.init)) \ + __proc_info_end = .; + + #define IDMAP_TEXT \ + ALIGN_FUNCTION(); \ + __idmap_text_start = .; \ +- *(.idmap.text) \ ++ KEEP(*(.idmap.text)) \ + __idmap_text_end = .; \ + + #define ARM_DISCARD \ +@@ -109,12 +109,12 @@ + . = ALIGN(8); \ + .ARM.unwind_idx : { \ + __start_unwind_idx = .; \ +- *(.ARM.exidx*) \ ++ KEEP(*(.ARM.exidx*)) \ + __stop_unwind_idx = .; \ + } \ + .ARM.unwind_tab : { \ + __start_unwind_tab = .; \ +- *(.ARM.extab*) \ ++ KEEP(*(.ARM.extab*)) \ + __stop_unwind_tab = .; \ + } + +@@ -126,7 +126,7 @@ + __vectors_lma = .; \ + OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) { \ + .vectors { \ +- *(.vectors) \ ++ KEEP(*(.vectors)) \ + } \ + .vectors.bhb.loop8 { \ + *(.vectors.bhb.loop8) \ +@@ -144,7 +144,7 @@ + \ + __stubs_lma = .; \ + .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) { \ +- *(.stubs) \ ++ KEEP(*(.stubs)) \ + } \ + ARM_LMA(__stubs, .stubs); \ + . = __stubs_lma + SIZEOF(.stubs); \ diff --git a/target/linux/generic/hack-5.15/221-module_exports.patch b/target/linux/generic/hack-5.15/221-module_exports.patch new file mode 100644 index 0000000000..87f541b46f --- /dev/null +++ b/target/linux/generic/hack-5.15/221-module_exports.patch @@ -0,0 +1,126 @@ +From b14784e7883390c20ed3ff904892255404a5914b Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Fri, 7 Jul 2017 17:05:53 +0200 +Subject: add an optional config option for stripping all unnecessary symbol exports from the kernel image + +lede-commit: bb5a40c64b7c4f4848509fa0a6625055fc9e66cc +Signed-off-by: Felix Fietkau +--- + include/asm-generic/vmlinux.lds.h | 18 +++++++++++++++--- + include/linux/export.h | 9 ++++++++- + scripts/Makefile.build | 2 +- + 3 files changed, 24 insertions(+), 5 deletions(-) + +--- a/include/asm-generic/vmlinux.lds.h ++++ b/include/asm-generic/vmlinux.lds.h +@@ -81,6 +81,16 @@ + #define RO_EXCEPTION_TABLE + #endif + ++#ifndef SYMTAB_KEEP ++#define SYMTAB_KEEP KEEP(*(SORT(___ksymtab+*))) ++#define SYMTAB_KEEP_GPL KEEP(*(SORT(___ksymtab_gpl+*))) ++#endif ++ ++#ifndef SYMTAB_DISCARD ++#define SYMTAB_DISCARD ++#define SYMTAB_DISCARD_GPL ++#endif ++ + /* Align . to a 8 byte boundary equals to maximum function alignment. */ + #define ALIGN_FUNCTION() . = ALIGN(8) + +@@ -485,14 +495,14 @@ + /* Kernel symbol table: Normal symbols */ \ + __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ + __start___ksymtab = .; \ +- KEEP(*(SORT(___ksymtab+*))) \ ++ SYMTAB_KEEP \ + __stop___ksymtab = .; \ + } \ + \ + /* Kernel symbol table: GPL-only symbols */ \ + __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ + __start___ksymtab_gpl = .; \ +- KEEP(*(SORT(___ksymtab_gpl+*))) \ ++ SYMTAB_KEEP_GPL \ + __stop___ksymtab_gpl = .; \ + } \ + \ +@@ -512,7 +522,7 @@ + \ + /* Kernel symbol table: strings */ \ + __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ +- *(__ksymtab_strings) \ ++ *(__ksymtab_strings+*) \ + } \ + \ + /* __*init sections */ \ +@@ -1022,6 +1032,8 @@ + + #define COMMON_DISCARDS \ + SANITIZER_DISCARDS \ ++ SYMTAB_DISCARD \ ++ SYMTAB_DISCARD_GPL \ + *(.discard) \ + *(.discard.*) \ + *(.modinfo) \ +--- a/include/linux/export.h ++++ b/include/linux/export.h +@@ -84,6 +84,12 @@ struct kernel_symbol { + + #else + ++#ifdef MODULE ++#define __EXPORT_SUFFIX(sym) ++#else ++#define __EXPORT_SUFFIX(sym) "+" #sym ++#endif ++ + /* + * For every exported symbol, do the following: + * +@@ -101,7 +107,7 @@ struct kernel_symbol { + extern const char __kstrtab_##sym[]; \ + extern const char __kstrtabns_##sym[]; \ + __CRC_SYMBOL(sym, sec); \ +- asm(" .section \"__ksymtab_strings\",\"aMS\",%progbits,1 \n" \ ++ asm(" .section \"__ksymtab_strings" __EXPORT_SUFFIX(sym) "\",\"aMS\",%progbits,1 \n" \ + "__kstrtab_" #sym ": \n" \ + " .asciz \"" #sym "\" \n" \ + "__kstrtabns_" #sym ": \n" \ +--- a/include/asm-generic/export.h ++++ b/include/asm-generic/export.h +@@ -26,6 +26,12 @@ + #endif + .endm + ++#ifdef MODULE ++#define __EXPORT_SUFFIX(name) ++#else ++#define __EXPORT_SUFFIX(name) + #name ++#endif ++ + /* + * note on .section use: we specify progbits since usage of the "M" (SHF_MERGE) + * section flag requires it. Use '%progbits' instead of '@progbits' since the +@@ -39,7 +45,7 @@ + __ksymtab_\name: + __put \val, __kstrtab_\name + .previous +- .section __ksymtab_strings,"aMS",%progbits,1 ++ .section __ksymtab_strings __EXPORT_SUFFIX(name),"aMS",%progbits,1 + __kstrtab_\name: + .asciz "\name" + .previous +--- a/scripts/Makefile.build ++++ b/scripts/Makefile.build +@@ -397,7 +397,7 @@ targets += $(real-dtb-y) $(lib-y) $(alwa + # Linker scripts preprocessor (.lds.S -> .lds) + # --------------------------------------------------------------------------- + quiet_cmd_cpp_lds_S = LDS $@ +- cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \ ++ cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -U$(ARCH) \ + -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $< + + $(obj)/%.lds: $(src)/%.lds.S FORCE diff --git a/target/linux/generic/hack-5.15/230-openwrt_lzma_options.patch b/target/linux/generic/hack-5.15/230-openwrt_lzma_options.patch new file mode 100644 index 0000000000..91fb6dc568 --- /dev/null +++ b/target/linux/generic/hack-5.15/230-openwrt_lzma_options.patch @@ -0,0 +1,34 @@ +From b3d00b452467f621317953d9e4c6f9ae8dcfd271 Mon Sep 17 00:00:00 2001 +From: Imre Kaloz +Date: Fri, 7 Jul 2017 17:06:55 +0200 +Subject: use the librecmc lzma options for now + +lede-commit: 548de949f392049420a6a1feeef118b30ab8ea8c +Signed-off-by: Imre Kaloz +--- + lib/decompress.c | 1 + + scripts/Makefile.lib | 2 +- + usr/gen_initramfs_list.sh | 10 +++++----- + 3 files changed, 7 insertions(+), 6 deletions(-) + +--- a/lib/decompress.c ++++ b/lib/decompress.c +@@ -53,6 +53,7 @@ static const struct compress_format comp + { {0x1f, 0x9e}, "gzip", gunzip }, + { {0x42, 0x5a}, "bzip2", bunzip2 }, + { {0x5d, 0x00}, "lzma", unlzma }, ++ { {0x6d, 0x00}, "lzma-librecmc", unlzma }, + { {0xfd, 0x37}, "xz", unxz }, + { {0x89, 0x4c}, "lzo", unlzo }, + { {0x02, 0x21}, "lz4", unlz4 }, +--- a/scripts/Makefile.lib ++++ b/scripts/Makefile.lib +@@ -402,7 +402,7 @@ quiet_cmd_bzip2 = BZIP2 $@ + # --------------------------------------------------------------------------- + + quiet_cmd_lzma = LZMA $@ +- cmd_lzma = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@ ++ cmd_lzma = { cat $(real-prereqs) | $(LZMA) e -d20 -lc1 -lp2 -pb2 -eos -si -so; $(size_append); } > $@ + + quiet_cmd_lzo = LZO $@ + cmd_lzo = { cat $(real-prereqs) | $(KLZOP) -9; $(size_append); } > $@ diff --git a/target/linux/generic/hack-5.15/250-netfilter_depends.patch b/target/linux/generic/hack-5.15/250-netfilter_depends.patch new file mode 100644 index 0000000000..d9a2b81d74 --- /dev/null +++ b/target/linux/generic/hack-5.15/250-netfilter_depends.patch @@ -0,0 +1,27 @@ +From: Felix Fietkau +Subject: hack: net: remove bogus netfilter dependencies + +lede-commit: 589d2a377dee27d206fc3725325309cf649e4df6 +Signed-off-by: Felix Fietkau +--- + net/netfilter/Kconfig | 2 -- + 1 file changed, 2 deletions(-) + +--- a/net/netfilter/Kconfig ++++ b/net/netfilter/Kconfig +@@ -242,7 +242,6 @@ config NF_CONNTRACK_FTP + + config NF_CONNTRACK_H323 + tristate "H.323 protocol support" +- depends on IPV6 || IPV6=n + depends on NETFILTER_ADVANCED + help + H.323 is a VoIP signalling protocol from ITU-T. As one of the most +@@ -1105,7 +1104,6 @@ config NETFILTER_XT_TARGET_SECMARK + + config NETFILTER_XT_TARGET_TCPMSS + tristate '"TCPMSS" target support' +- depends on IPV6 || IPV6=n + default m if NETFILTER_ADVANCED=n + help + This option adds a `TCPMSS' target, which allows you to alter the diff --git a/target/linux/generic/hack-5.15/251-kconfig.patch b/target/linux/generic/hack-5.15/251-kconfig.patch new file mode 100644 index 0000000000..9350e366d8 --- /dev/null +++ b/target/linux/generic/hack-5.15/251-kconfig.patch @@ -0,0 +1,210 @@ +From da3c50704f14132f4adf80d48e9a4cd5d46e54c9 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Fri, 7 Jul 2017 17:09:21 +0200 +Subject: kconfig: owrt specifc dependencies + +Signed-off-by: John Crispin +--- + crypto/Kconfig | 10 +++++----- + drivers/bcma/Kconfig | 1 + + drivers/ssb/Kconfig | 3 ++- + lib/Kconfig | 8 ++++---- + net/netfilter/Kconfig | 2 +- + net/wireless/Kconfig | 17 ++++++++++------- + sound/core/Kconfig | 4 ++-- + 7 files changed, 25 insertions(+), 20 deletions(-) + +--- a/crypto/Kconfig ++++ b/crypto/Kconfig +@@ -34,7 +34,7 @@ config CRYPTO_FIPS + this is. + + config CRYPTO_ALGAPI +- tristate ++ tristate "ALGAPI" + select CRYPTO_ALGAPI2 + help + This option provides the API for cryptographic algorithms. +@@ -43,7 +43,7 @@ config CRYPTO_ALGAPI2 + tristate + + config CRYPTO_AEAD +- tristate ++ tristate "AEAD" + select CRYPTO_AEAD2 + select CRYPTO_ALGAPI + +@@ -54,7 +54,7 @@ config CRYPTO_AEAD2 + select CRYPTO_RNG2 + + config CRYPTO_SKCIPHER +- tristate ++ tristate "SKCIPHER" + select CRYPTO_SKCIPHER2 + select CRYPTO_ALGAPI + +@@ -64,7 +64,7 @@ config CRYPTO_SKCIPHER2 + select CRYPTO_RNG2 + + config CRYPTO_HASH +- tristate ++ tristate "HASH" + select CRYPTO_HASH2 + select CRYPTO_ALGAPI + +@@ -73,7 +73,7 @@ config CRYPTO_HASH2 + select CRYPTO_ALGAPI2 + + config CRYPTO_RNG +- tristate ++ tristate "RNG" + select CRYPTO_RNG2 + select CRYPTO_ALGAPI + +--- a/drivers/bcma/Kconfig ++++ b/drivers/bcma/Kconfig +@@ -16,6 +16,7 @@ if BCMA + # Support for Block-I/O. SELECT this from the driver that needs it. + config BCMA_BLOCKIO + bool ++ default y + + config BCMA_HOST_PCI_POSSIBLE + bool +--- a/drivers/ssb/Kconfig ++++ b/drivers/ssb/Kconfig +@@ -29,6 +29,7 @@ config SSB_SPROM + config SSB_BLOCKIO + bool + depends on SSB ++ default y + + config SSB_PCIHOST_POSSIBLE + bool +@@ -49,7 +50,7 @@ config SSB_PCIHOST + config SSB_B43_PCI_BRIDGE + bool + depends on SSB_PCIHOST +- default n ++ default y + + config SSB_PCMCIAHOST_POSSIBLE + bool +--- a/lib/Kconfig ++++ b/lib/Kconfig +@@ -443,16 +443,16 @@ config BCH_CONST_T + # Textsearch support is select'ed if needed + # + config TEXTSEARCH +- bool ++ bool "Textsearch support" + + config TEXTSEARCH_KMP +- tristate ++ tristate "Textsearch KMP" + + config TEXTSEARCH_BM +- tristate ++ tristate "Textsearch BM" + + config TEXTSEARCH_FSM +- tristate ++ tristate "Textsearch FSM" + + config BTREE + bool +--- a/net/netfilter/Kconfig ++++ b/net/netfilter/Kconfig +@@ -11,7 +11,7 @@ config NETFILTER_INGRESS + infrastructure. + + config NETFILTER_NETLINK +- tristate ++ tristate "Netfilter NFNETLINK interface" + + config NETFILTER_FAMILY_BRIDGE + bool +--- a/net/wireless/Kconfig ++++ b/net/wireless/Kconfig +@@ -1,6 +1,6 @@ + # SPDX-License-Identifier: GPL-2.0-only + config WIRELESS_EXT +- bool ++ bool "Wireless extensions" + + config WEXT_CORE + def_bool y +@@ -12,10 +12,10 @@ config WEXT_PROC + depends on WEXT_CORE + + config WEXT_SPY +- bool ++ bool "WEXT_SPY" + + config WEXT_PRIV +- bool ++ bool "WEXT_PRIV" + + config CFG80211 + tristate "cfg80211 - wireless configuration API" +@@ -204,7 +204,7 @@ config CFG80211_WEXT_EXPORT + endif # CFG80211 + + config LIB80211 +- tristate ++ tristate "LIB80211" + default n + help + This options enables a library of common routines used +@@ -213,17 +213,17 @@ config LIB80211 + Drivers should select this themselves if needed. + + config LIB80211_CRYPT_WEP +- tristate ++ tristate "LIB80211_CRYPT_WEP" + select CRYPTO_LIB_ARC4 + + config LIB80211_CRYPT_CCMP +- tristate ++ tristate "LIB80211_CRYPT_CCMP" + select CRYPTO + select CRYPTO_AES + select CRYPTO_CCM + + config LIB80211_CRYPT_TKIP +- tristate ++ tristate "LIB80211_CRYPT_TKIP" + select CRYPTO_LIB_ARC4 + + config LIB80211_DEBUG +--- a/sound/core/Kconfig ++++ b/sound/core/Kconfig +@@ -17,7 +17,7 @@ config SND_DMAENGINE_PCM + tristate + + config SND_HWDEP +- tristate ++ tristate "Sound hardware support" + + config SND_SEQ_DEVICE + tristate +@@ -27,7 +27,7 @@ config SND_RAWMIDI + select SND_SEQ_DEVICE if SND_SEQUENCER != n + + config SND_COMPRESS_OFFLOAD +- tristate ++ tristate "Compression offloading support" + + config SND_JACK + bool +--- a/net/Kconfig ++++ b/net/Kconfig +@@ -430,7 +430,7 @@ config NET_DEVLINK + default n + + config PAGE_POOL +- bool ++ bool "Page pool support" + + config PAGE_POOL_STATS + default n diff --git a/target/linux/generic/hack-5.15/253-ksmbd-config.patch b/target/linux/generic/hack-5.15/253-ksmbd-config.patch new file mode 100644 index 0000000000..e0f0366421 --- /dev/null +++ b/target/linux/generic/hack-5.15/253-ksmbd-config.patch @@ -0,0 +1,32 @@ +From dcd966fa7ca63f38cf7147e1184d13d66e2ca340 Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 13:33:30 +0200 +Subject: [PATCH] Kconfig: add tristate for OID and ASNI string + +--- + init/Kconfig | 2 +- + lib/Kconfig | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -2388,7 +2388,7 @@ config PADATA + bool + + config ASN1 +- tristate ++ tristate "ASN1" + help + Build a simple ASN.1 grammar compiler that produces a bytecode output + that can be interpreted by the ASN.1 stream decoder and used to +--- a/lib/Kconfig ++++ b/lib/Kconfig +@@ -614,7 +614,7 @@ config LIBFDT + bool + + config OID_REGISTRY +- tristate ++ tristate "OID" + help + Enable fast lookup object identifier registry. + diff --git a/target/linux/generic/hack-5.15/259-regmap_dynamic.patch b/target/linux/generic/hack-5.15/259-regmap_dynamic.patch new file mode 100644 index 0000000000..e0820ccfc0 --- /dev/null +++ b/target/linux/generic/hack-5.15/259-regmap_dynamic.patch @@ -0,0 +1,144 @@ +From 811d9e2268a62b830cfe93cd8bc929afcb8b198b Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Sat, 15 Jul 2017 21:12:38 +0200 +Subject: kernel: move regmap bloat out of the kernel image if it is only being used in modules + +lede-commit: 96f39119815028073583e4fca3a9c5fe9141e998 +Signed-off-by: Felix Fietkau +--- + drivers/base/regmap/Kconfig | 15 ++++++++++----- + drivers/base/regmap/Makefile | 12 ++++++++---- + drivers/base/regmap/regmap.c | 3 +++ + include/linux/regmap.h | 2 +- + 4 files changed, 22 insertions(+), 10 deletions(-) + +--- a/drivers/base/regmap/Kconfig ++++ b/drivers/base/regmap/Kconfig +@@ -4,10 +4,9 @@ + # subsystems should select the appropriate symbols. + + config REGMAP +- default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SOUNDWIRE || REGMAP_SOUNDWIRE_MBQ || REGMAP_SCCB || REGMAP_I3C || REGMAP_SPI_AVMM || REGMAP_MDIO) + select IRQ_DOMAIN if REGMAP_IRQ + select MDIO_BUS if REGMAP_MDIO +- bool ++ tristate + + config REGCACHE_COMPRESSED + select LZO_COMPRESS +@@ -15,53 +14,67 @@ config REGCACHE_COMPRESSED + bool + + config REGMAP_AC97 ++ select REGMAP + tristate + + config REGMAP_I2C ++ select REGMAP + tristate + depends on I2C + + config REGMAP_SLIMBUS ++ select REGMAP + tristate + depends on SLIMBUS + + config REGMAP_SPI ++ select REGMAP + tristate + depends on SPI + + config REGMAP_SPMI ++ select REGMAP + tristate + depends on SPMI + + config REGMAP_W1 ++ select REGMAP + tristate + depends on W1 + + config REGMAP_MDIO ++ select REGMAP + tristate + + config REGMAP_MMIO ++ select REGMAP + tristate + + config REGMAP_IRQ ++ select REGMAP + bool + + config REGMAP_SOUNDWIRE ++ select REGMAP + tristate + depends on SOUNDWIRE + + config REGMAP_SOUNDWIRE_MBQ ++ select REGMAP + tristate + depends on SOUNDWIRE + + config REGMAP_SCCB ++ select REGMAP + tristate + depends on I2C + + config REGMAP_I3C ++ select REGMAP + tristate + depends on I3C + + config REGMAP_SPI_AVMM ++ select REGMAP + tristate + depends on SPI +--- a/drivers/base/regmap/Makefile ++++ b/drivers/base/regmap/Makefile +@@ -2,10 +2,14 @@ + # For include/trace/define_trace.h to include trace.h + CFLAGS_regmap.o := -I$(src) + +-obj-$(CONFIG_REGMAP) += regmap.o regcache.o +-obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-flat.o +-obj-$(CONFIG_REGCACHE_COMPRESSED) += regcache-lzo.o +-obj-$(CONFIG_DEBUG_FS) += regmap-debugfs.o ++regmap-core-objs = regmap.o regcache.o regcache-rbtree.o regcache-flat.o ++ifdef CONFIG_DEBUG_FS ++regmap-core-objs += regmap-debugfs.o ++endif ++ifdef CONFIG_REGCACHE_COMPRESSED ++regmap-core-objs += regcache-lzo.o ++endif ++obj-$(CONFIG_REGMAP) += regmap-core.o + obj-$(CONFIG_REGMAP_AC97) += regmap-ac97.o + obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o + obj-$(CONFIG_REGMAP_SLIMBUS) += regmap-slimbus.o +--- a/drivers/base/regmap/regmap.c ++++ b/drivers/base/regmap/regmap.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -3360,3 +3361,5 @@ static int __init regmap_initcall(void) + return 0; + } + postcore_initcall(regmap_initcall); ++ ++MODULE_LICENSE("GPL"); +--- a/include/linux/regmap.h ++++ b/include/linux/regmap.h +@@ -180,7 +180,7 @@ struct reg_sequence { + __ret ?: __tmp; \ + }) + +-#ifdef CONFIG_REGMAP ++#if IS_REACHABLE(CONFIG_REGMAP) + + enum regmap_endian { + /* Unspecified -> 0 -> Backwards compatible default */ diff --git a/target/linux/generic/hack-5.15/260-crypto_test_dependencies.patch b/target/linux/generic/hack-5.15/260-crypto_test_dependencies.patch new file mode 100644 index 0000000000..64daa82743 --- /dev/null +++ b/target/linux/generic/hack-5.15/260-crypto_test_dependencies.patch @@ -0,0 +1,52 @@ +From fd1799b0bf5efa46dd3e6dfbbf3955564807e508 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Fri, 7 Jul 2017 17:12:51 +0200 +Subject: kernel: prevent cryptomgr from pulling in useless extra dependencies for tests that are not run + +Reduces kernel size after LZMA by about 5k on MIPS + +lede-commit: 044c316167e076479a344c59905e5b435b84a77f +Signed-off-by: Felix Fietkau +--- + crypto/Kconfig | 13 ++++++------- + crypto/algboss.c | 4 ++++ + 2 files changed, 10 insertions(+), 7 deletions(-) + +--- a/crypto/Kconfig ++++ b/crypto/Kconfig +@@ -121,13 +121,13 @@ config CRYPTO_MANAGER + cbc(aes). + + config CRYPTO_MANAGER2 +- def_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y) +- select CRYPTO_AEAD2 +- select CRYPTO_HASH2 +- select CRYPTO_SKCIPHER2 +- select CRYPTO_AKCIPHER2 +- select CRYPTO_KPP2 +- select CRYPTO_ACOMP2 ++ def_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y && !CRYPTO_MANAGER_DISABLE_TESTS) ++ select CRYPTO_AEAD2 if !CRYPTO_MANAGER_DISABLE_TESTS ++ select CRYPTO_HASH2 if !CRYPTO_MANAGER_DISABLE_TESTS ++ select CRYPTO_SKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS ++ select CRYPTO_AKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS ++ select CRYPTO_KPP2 if !CRYPTO_MANAGER_DISABLE_TESTS ++ select CRYPTO_ACOMP2 if !CRYPTO_MANAGER_DISABLE_TESTS + + config CRYPTO_USER + tristate "Userspace cryptographic algorithm configuration" +--- a/crypto/algboss.c ++++ b/crypto/algboss.c +@@ -211,8 +211,12 @@ static int cryptomgr_schedule_test(struc + type = alg->cra_flags; + + /* Do not test internal algorithms. */ ++#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS ++ type |= CRYPTO_ALG_TESTED; ++#else + if (type & CRYPTO_ALG_INTERNAL) + type |= CRYPTO_ALG_TESTED; ++#endif + + param->type = type; + diff --git a/target/linux/generic/hack-5.15/261-lib-arc4-unhide.patch b/target/linux/generic/hack-5.15/261-lib-arc4-unhide.patch new file mode 100644 index 0000000000..19f2e765a4 --- /dev/null +++ b/target/linux/generic/hack-5.15/261-lib-arc4-unhide.patch @@ -0,0 +1,24 @@ +From 241e5d3f7b0dd3c01f8c7fa83cbc9a3882286d53 Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 13:35:18 +0200 +Subject: [PATCH] lib/crypto: add tristate string for ARC4 + +This makes it possible to select CONFIG_CRYPTO_LIB_ARC4 directly. We +need this to be able to compile this into the kernel and make use of it +from backports. + +--- + lib/crypto/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/lib/crypto/Kconfig ++++ b/lib/crypto/Kconfig +@@ -6,7 +6,7 @@ config CRYPTO_LIB_AES + tristate + + config CRYPTO_LIB_ARC4 +- tristate ++ tristate "ARC4 cipher library" + + config CRYPTO_ARCH_HAVE_LIB_BLAKE2S + bool diff --git a/target/linux/generic/hack-5.15/280-rfkill-stubs.patch b/target/linux/generic/hack-5.15/280-rfkill-stubs.patch new file mode 100644 index 0000000000..ff6638f7a0 --- /dev/null +++ b/target/linux/generic/hack-5.15/280-rfkill-stubs.patch @@ -0,0 +1,84 @@ +From 236c1acdfef5958010ac9814a9872e0a46fd78ee Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Fri, 7 Jul 2017 17:13:44 +0200 +Subject: rfkill: add fake rfkill support + +allow building of modules depending on RFKILL even if RFKILL is not enabled. + +Signed-off-by: John Crispin +--- + include/linux/rfkill.h | 2 +- + net/Makefile | 2 +- + net/rfkill/Kconfig | 14 +++++++++----- + net/rfkill/Makefile | 2 +- + 4 files changed, 12 insertions(+), 8 deletions(-) + +--- a/include/linux/rfkill.h ++++ b/include/linux/rfkill.h +@@ -64,7 +64,7 @@ struct rfkill_ops { + int (*set_block)(void *data, bool blocked); + }; + +-#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) ++#if defined(CONFIG_RFKILL_FULL) || defined(CONFIG_RFKILL_FULL_MODULE) + /** + * rfkill_alloc - Allocate rfkill structure + * @name: name of the struct -- the string is not copied internally +--- a/net/Makefile ++++ b/net/Makefile +@@ -51,7 +51,7 @@ obj-$(CONFIG_TIPC) += tipc/ + obj-$(CONFIG_NETLABEL) += netlabel/ + obj-$(CONFIG_IUCV) += iucv/ + obj-$(CONFIG_SMC) += smc/ +-obj-$(CONFIG_RFKILL) += rfkill/ ++obj-$(CONFIG_RFKILL_FULL) += rfkill/ + obj-$(CONFIG_NET_9P) += 9p/ + obj-$(CONFIG_CAIF) += caif/ + obj-$(CONFIG_DCB) += dcb/ +--- a/net/rfkill/Kconfig ++++ b/net/rfkill/Kconfig +@@ -2,7 +2,11 @@ + # + # RF switch subsystem configuration + # +-menuconfig RFKILL ++config RFKILL ++ bool ++ default y ++ ++menuconfig RFKILL_FULL + tristate "RF switch subsystem support" + help + Say Y here if you want to have control over RF switches +@@ -14,19 +18,19 @@ menuconfig RFKILL + # LED trigger support + config RFKILL_LEDS + bool +- depends on RFKILL ++ depends on RFKILL_FULL + depends on LEDS_TRIGGERS = y || RFKILL = LEDS_TRIGGERS + default y + + config RFKILL_INPUT + bool "RF switch input support" if EXPERT +- depends on RFKILL ++ depends on RFKILL_FULL + depends on INPUT = y || RFKILL = INPUT + default y if !EXPERT + + config RFKILL_GPIO + tristate "GPIO RFKILL driver" +- depends on RFKILL ++ depends on RFKILL_FULL + depends on GPIOLIB || COMPILE_TEST + default n + help +--- a/net/rfkill/Makefile ++++ b/net/rfkill/Makefile +@@ -5,5 +5,5 @@ + + rfkill-y += core.o + rfkill-$(CONFIG_RFKILL_INPUT) += input.o +-obj-$(CONFIG_RFKILL) += rfkill.o ++obj-$(CONFIG_RFKILL_FULL) += rfkill.o + obj-$(CONFIG_RFKILL_GPIO) += rfkill-gpio.o diff --git a/target/linux/generic/hack-5.15/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch b/target/linux/generic/hack-5.15/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch new file mode 100644 index 0000000000..f21f200136 --- /dev/null +++ b/target/linux/generic/hack-5.15/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch @@ -0,0 +1,64 @@ +From: Ben Menchaca +Date: Fri, 7 Jun 2013 18:35:22 -0500 +Subject: MIPS: r4k_cache: use more efficient cache blast + +Optimize the compiler output for larger cache blast cases that are +common for DMA-based networking. + +Signed-off-by: Ben Menchaca +Signed-off-by: Felix Fietkau +--- +--- a/arch/mips/include/asm/r4kcache.h ++++ b/arch/mips/include/asm/r4kcache.h +@@ -286,14 +286,46 @@ static inline void prot##extra##blast_## + unsigned long end) \ + { \ + unsigned long lsize = cpu_##desc##_line_size(); \ ++ unsigned long lsize_2 = lsize * 2; \ ++ unsigned long lsize_3 = lsize * 3; \ ++ unsigned long lsize_4 = lsize * 4; \ ++ unsigned long lsize_5 = lsize * 5; \ ++ unsigned long lsize_6 = lsize * 6; \ ++ unsigned long lsize_7 = lsize * 7; \ ++ unsigned long lsize_8 = lsize * 8; \ + unsigned long addr = start & ~(lsize - 1); \ +- unsigned long aend = (end - 1) & ~(lsize - 1); \ ++ unsigned long aend = (end + lsize - 1) & ~(lsize - 1); \ ++ int lines = (aend - addr) / lsize; \ + \ +- while (1) { \ ++ while (lines >= 8) { \ ++ prot##cache_op(hitop, addr); \ ++ prot##cache_op(hitop, addr + lsize); \ ++ prot##cache_op(hitop, addr + lsize_2); \ ++ prot##cache_op(hitop, addr + lsize_3); \ ++ prot##cache_op(hitop, addr + lsize_4); \ ++ prot##cache_op(hitop, addr + lsize_5); \ ++ prot##cache_op(hitop, addr + lsize_6); \ ++ prot##cache_op(hitop, addr + lsize_7); \ ++ addr += lsize_8; \ ++ lines -= 8; \ ++ } \ ++ \ ++ if (lines & 0x4) { \ ++ prot##cache_op(hitop, addr); \ ++ prot##cache_op(hitop, addr + lsize); \ ++ prot##cache_op(hitop, addr + lsize_2); \ ++ prot##cache_op(hitop, addr + lsize_3); \ ++ addr += lsize_4; \ ++ } \ ++ \ ++ if (lines & 0x2) { \ ++ prot##cache_op(hitop, addr); \ ++ prot##cache_op(hitop, addr + lsize); \ ++ addr += lsize_2; \ ++ } \ ++ \ ++ if (lines & 0x1) { \ + prot##cache_op(hitop, addr); \ +- if (addr == aend) \ +- break; \ +- addr += lsize; \ + } \ + } + diff --git a/target/linux/generic/hack-5.15/321-powerpc_crtsavres_prereq.patch b/target/linux/generic/hack-5.15/321-powerpc_crtsavres_prereq.patch new file mode 100644 index 0000000000..f1942e2037 --- /dev/null +++ b/target/linux/generic/hack-5.15/321-powerpc_crtsavres_prereq.patch @@ -0,0 +1,38 @@ +From 107c0964cb8db7ca28ac5199426414fdab3c274d Mon Sep 17 00:00:00 2001 +From: "Alexandros C. Couloumbis" +Date: Fri, 7 Jul 2017 17:14:51 +0200 +Subject: hack: arch: powerpc: drop register save/restore library from modules + +Upstream GCC uses a libgcc function for saving/restoring registers. This +makes the code bigger, and upstream kernels need to carry that function +for every single kernel module. Our GCC is patched to avoid those +references, so we can drop the extra bloat for modules. + +lede-commit: e8e1084654f50904e6bf77b70b2de3f137d7b3ec +Signed-off-by: Alexandros C. Couloumbis +--- + arch/powerpc/Makefile | 1 - + 1 file changed, 1 deletion(-) + +--- a/arch/powerpc/Makefile ++++ b/arch/powerpc/Makefile +@@ -44,19 +44,6 @@ machine-$(CONFIG_PPC64) += 64 + machine-$(CONFIG_CPU_LITTLE_ENDIAN) += le + UTS_MACHINE := $(subst $(space),,$(machine-y)) + +-# XXX This needs to be before we override LD below +-ifdef CONFIG_PPC32 +-KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o +-else +-ifeq ($(call ld-ifversion, -ge, 22500, y),y) +-# Have the linker provide sfpr if possible. +-# There is a corresponding test in arch/powerpc/lib/Makefile +-KBUILD_LDFLAGS_MODULE += --save-restore-funcs +-else +-KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o +-endif +-endif +- + ifdef CONFIG_CPU_LITTLE_ENDIAN + KBUILD_CFLAGS += -mlittle-endian + KBUILD_LDFLAGS += -EL diff --git a/target/linux/generic/hack-5.15/402-mtd-blktrans-call-add-disks-after-mtd-device.patch b/target/linux/generic/hack-5.15/402-mtd-blktrans-call-add-disks-after-mtd-device.patch new file mode 100644 index 0000000000..1df6f2f18b --- /dev/null +++ b/target/linux/generic/hack-5.15/402-mtd-blktrans-call-add-disks-after-mtd-device.patch @@ -0,0 +1,98 @@ +From 0bccc3722bdd88e8ae995e77ef9f7b77ee4cbdee Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Wed, 7 Apr 2021 22:45:54 +0100 +Subject: [PATCH 2/2] mtd: blktrans: call add disks after mtd device +To: linux-mtd@lists.infradead.org +Cc: Vignesh Raghavendra , + Richard Weinberger , + Miquel Raynal , + David Woodhouse + +Calling device_add_disk while holding mtd_table_mutex leads +to deadlock in case part_bits!=0 as block partition parsers +will try to open the newly created disks, trying to acquire +mutex once again. +Move device_add_disk to additional function called after +add partitions of an MTD device have been added and locks +have been released. + +Signed-off-by: Daniel Golle +--- + drivers/mtd/mtd_blkdevs.c | 33 ++++++++++++++++++++++++++------- + drivers/mtd/mtdcore.c | 3 +++ + include/linux/mtd/blktrans.h | 1 + + 3 files changed, 30 insertions(+), 7 deletions(-) + +--- a/drivers/mtd/mtd_blkdevs.c ++++ b/drivers/mtd/mtd_blkdevs.c +@@ -384,13 +384,6 @@ int add_mtd_blktrans_dev(struct mtd_blkt + if (new->readonly) + set_disk_ro(gd, 1); + +- device_add_disk(&new->mtd->dev, gd, NULL); +- +- if (new->disk_attributes) { +- ret = sysfs_create_group(&disk_to_dev(gd)->kobj, +- new->disk_attributes); +- WARN_ON(ret); +- } + return 0; + + out_free_tag_set: +@@ -402,6 +395,27 @@ out_list_del: + return ret; + } + ++void register_mtd_blktrans_devs(void) ++{ ++ struct mtd_blktrans_ops *tr; ++ struct mtd_blktrans_dev *dev, *next; ++ int ret; ++ ++ list_for_each_entry(tr, &blktrans_majors, list) { ++ list_for_each_entry_safe(dev, next, &tr->devs, list) { ++ if (disk_live(dev->disk)) ++ continue; ++ ++ device_add_disk(&dev->mtd->dev, dev->disk, NULL); ++ if (dev->disk_attributes) { ++ ret = sysfs_create_group(&disk_to_dev(dev->disk)->kobj, ++ dev->disk_attributes); ++ WARN_ON(ret); ++ } ++ } ++ } ++} ++ + int del_mtd_blktrans_dev(struct mtd_blktrans_dev *old) + { + unsigned long flags; +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -32,6 +32,7 @@ + + #include + #include ++#include + + #include "mtdcore.h" + +@@ -1106,6 +1107,8 @@ int mtd_device_parse_register(struct mtd + register_reboot_notifier(&mtd->reboot_notifier); + } + ++ register_mtd_blktrans_devs(); ++ + out: + if (ret) { + nvmem_unregister(mtd->otp_user_nvmem); +--- a/include/linux/mtd/blktrans.h ++++ b/include/linux/mtd/blktrans.h +@@ -76,6 +76,7 @@ extern int deregister_mtd_blktrans(struc + extern int add_mtd_blktrans_dev(struct mtd_blktrans_dev *dev); + extern int del_mtd_blktrans_dev(struct mtd_blktrans_dev *dev); + extern int mtd_blktrans_cease_background(struct mtd_blktrans_dev *dev); ++extern void register_mtd_blktrans_devs(void); + + /** + * module_mtd_blktrans() - Helper macro for registering a mtd blktrans driver diff --git a/target/linux/generic/hack-5.15/410-block-fit-partition-parser.patch b/target/linux/generic/hack-5.15/410-block-fit-partition-parser.patch new file mode 100644 index 0000000000..edbde2a715 --- /dev/null +++ b/target/linux/generic/hack-5.15/410-block-fit-partition-parser.patch @@ -0,0 +1,214 @@ +From 69357074558daf6ff24c9f58714935e9e095a865 Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 13:37:33 +0200 +Subject: [PATCH] kernel: add block fit partition parser + +--- + block/blk.h | 2 ++ + block/partitions/Kconfig | 7 +++++++ + block/partitions/Makefile | 1 + + block/partitions/check.h | 3 +++ + block/partitions/core.c | 17 +++++++++++++++++ + block/partitions/efi.c | 8 ++++++++ + block/partitions/efi.h | 3 +++ + block/partitions/msdos.c | 10 ++++++++++ + drivers/mtd/mtd_blkdevs.c | 2 ++ + drivers/mtd/ubi/block.c | 3 +++ + include/linux/msdos_partition.h | 1 + + 11 files changed, 57 insertions(+) + +--- a/block/blk.h ++++ b/block/blk.h +@@ -354,6 +354,8 @@ void blk_free_ext_minor(unsigned int min + #define ADDPART_FLAG_NONE 0 + #define ADDPART_FLAG_RAID 1 + #define ADDPART_FLAG_WHOLEDISK 2 ++#define ADDPART_FLAG_READONLY 4 ++#define ADDPART_FLAG_ROOTDEV 8 + int bdev_add_partition(struct gendisk *disk, int partno, sector_t start, + sector_t length); + int bdev_del_partition(struct gendisk *disk, int partno); +--- a/block/partitions/Kconfig ++++ b/block/partitions/Kconfig +@@ -101,6 +101,13 @@ config ATARI_PARTITION + Say Y here if you would like to use hard disks under Linux which + were partitioned under the Atari OS. + ++config FIT_PARTITION ++ bool "Flattened-Image-Tree (FIT) partition support" if PARTITION_ADVANCED ++ default n ++ help ++ Say Y here if your system needs to mount the filesystem part of ++ a Flattened-Image-Tree (FIT) image commonly used with Das U-Boot. ++ + config IBM_PARTITION + bool "IBM disk label and partition support" + depends on PARTITION_ADVANCED && S390 +--- a/block/partitions/Makefile ++++ b/block/partitions/Makefile +@@ -8,6 +8,7 @@ obj-$(CONFIG_ACORN_PARTITION) += acorn.o + obj-$(CONFIG_AMIGA_PARTITION) += amiga.o + obj-$(CONFIG_ATARI_PARTITION) += atari.o + obj-$(CONFIG_AIX_PARTITION) += aix.o ++obj-$(CONFIG_FIT_PARTITION) += fit.o + obj-$(CONFIG_CMDLINE_PARTITION) += cmdline.o + obj-$(CONFIG_MAC_PARTITION) += mac.o + obj-$(CONFIG_LDM_PARTITION) += ldm.o +--- a/block/partitions/check.h ++++ b/block/partitions/check.h +@@ -58,6 +58,7 @@ int amiga_partition(struct parsed_partit + int atari_partition(struct parsed_partitions *state); + int cmdline_partition(struct parsed_partitions *state); + int efi_partition(struct parsed_partitions *state); ++int fit_partition(struct parsed_partitions *state); + int ibm_partition(struct parsed_partitions *); + int karma_partition(struct parsed_partitions *state); + int ldm_partition(struct parsed_partitions *state); +@@ -68,3 +69,5 @@ int sgi_partition(struct parsed_partitio + int sun_partition(struct parsed_partitions *state); + int sysv68_partition(struct parsed_partitions *state); + int ultrix_partition(struct parsed_partitions *state); ++ ++int parse_fit_partitions(struct parsed_partitions *state, u64 start_sector, u64 nr_sectors, int *slot, int add_remain); +--- a/block/partitions/core.c ++++ b/block/partitions/core.c +@@ -12,6 +12,10 @@ + #include + #include + #include ++#ifdef CONFIG_FIT_PARTITION ++#include ++#endif ++ + #include "check.h" + + static int (*check_part[])(struct parsed_partitions *) = { +@@ -48,6 +52,9 @@ static int (*check_part[])(struct parsed + #ifdef CONFIG_EFI_PARTITION + efi_partition, /* this must come before msdos */ + #endif ++#ifdef CONFIG_FIT_PARTITION ++ fit_partition, ++#endif + #ifdef CONFIG_SGI_PARTITION + sgi_partition, + #endif +@@ -408,6 +415,11 @@ static struct block_device *add_partitio + goto out_del; + } + ++#ifdef CONFIG_FIT_PARTITION ++ if (flags & ADDPART_FLAG_READONLY) ++ bdev->bd_read_only = true; ++#endif ++ + /* everything is up and running, commence */ + err = xa_insert(&disk->part_tbl, partno, bdev, GFP_KERNEL); + if (err) +@@ -595,6 +607,11 @@ static bool blk_add_partition(struct gen + (state->parts[p].flags & ADDPART_FLAG_RAID)) + md_autodetect_dev(part->bd_dev); + ++#ifdef CONFIG_FIT_PARTITION ++ if ((state->parts[p].flags & ADDPART_FLAG_ROOTDEV) && ROOT_DEV == 0) ++ ROOT_DEV = part->bd_dev; ++#endif ++ + return true; + } + +--- a/block/partitions/efi.c ++++ b/block/partitions/efi.c +@@ -716,6 +716,9 @@ int efi_partition(struct parsed_partitio + gpt_entry *ptes = NULL; + u32 i; + unsigned ssz = queue_logical_block_size(state->disk->queue) / 512; ++#ifdef CONFIG_FIT_PARTITION ++ u32 extra_slot = 64; ++#endif + + if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) { + kfree(gpt); +@@ -749,6 +752,11 @@ int efi_partition(struct parsed_partitio + ARRAY_SIZE(ptes[i].partition_name)); + utf16_le_to_7bit(ptes[i].partition_name, label_max, info->volname); + state->parts[i + 1].has_info = true; ++#ifdef CONFIG_FIT_PARTITION ++ /* If this is a U-Boot FIT volume it may have subpartitions */ ++ if (!efi_guidcmp(ptes[i].partition_type_guid, PARTITION_LINUX_FIT_GUID)) ++ (void) parse_fit_partitions(state, start * ssz, size * ssz, &extra_slot, 1); ++#endif + } + kfree(ptes); + kfree(gpt); +--- a/block/partitions/efi.h ++++ b/block/partitions/efi.h +@@ -52,6 +52,9 @@ + #define PARTITION_LINUX_LVM_GUID \ + EFI_GUID( 0xe6d6d379, 0xf507, 0x44c2, \ + 0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28) ++#define PARTITION_LINUX_FIT_GUID \ ++ EFI_GUID( 0xcae9be83, 0xb15f, 0x49cc, \ ++ 0x86, 0x3f, 0x08, 0x1b, 0x74, 0x4a, 0x2d, 0x93) + + typedef struct _gpt_header { + __le64 signature; +--- a/block/partitions/msdos.c ++++ b/block/partitions/msdos.c +@@ -564,6 +564,15 @@ static void parse_minix(struct parsed_pa + #endif /* CONFIG_MINIX_SUBPARTITION */ + } + ++static void parse_fit_mbr(struct parsed_partitions *state, ++ sector_t offset, sector_t size, int origin) ++{ ++#ifdef CONFIG_FIT_PARTITION ++ u32 extra_slot = 64; ++ (void) parse_fit_partitions(state, offset, size, &extra_slot, 1); ++#endif /* CONFIG_FIT_PARTITION */ ++} ++ + static struct { + unsigned char id; + void (*parse)(struct parsed_partitions *, sector_t, sector_t, int); +@@ -575,6 +584,7 @@ static struct { + {UNIXWARE_PARTITION, parse_unixware}, + {SOLARIS_X86_PARTITION, parse_solaris_x86}, + {NEW_SOLARIS_X86_PARTITION, parse_solaris_x86}, ++ {FIT_PARTITION, parse_fit_mbr}, + {0, NULL}, + }; + +--- a/drivers/mtd/mtd_blkdevs.c ++++ b/drivers/mtd/mtd_blkdevs.c +@@ -345,6 +345,8 @@ int add_mtd_blktrans_dev(struct mtd_blkt + gd->first_minor = (new->devnum) << tr->part_bits; + gd->minors = 1 << tr->part_bits; + gd->fops = &mtd_block_ops; ++ if (IS_ENABLED(CONFIG_FIT_PARTITION) && !mtd_type_is_nand(new->mtd)) ++ gd->flags |= GENHD_FL_EXT_DEVT; + + if (tr->part_bits) + if (new->devnum < 26) +--- a/drivers/mtd/ubi/block.c ++++ b/drivers/mtd/ubi/block.c +@@ -428,6 +428,9 @@ int ubiblock_create(struct ubi_volume_in + goto out_cleanup_disk; + } + gd->private_data = dev; ++#ifdef CONFIG_FIT_PARTITION ++ gd->flags |= GENHD_FL_EXT_DEVT; ++#endif + sprintf(gd->disk_name, "ubiblock%d_%d", dev->ubi_num, dev->vol_id); + set_capacity(gd, disk_capacity); + dev->gd = gd; +--- a/include/linux/msdos_partition.h ++++ b/include/linux/msdos_partition.h +@@ -31,6 +31,7 @@ enum msdos_sys_ind { + LINUX_LVM_PARTITION = 0x8e, + LINUX_RAID_PARTITION = 0xfd, /* autodetect RAID partition */ + ++ FIT_PARTITION = 0x2e, /* U-Boot uImage.FIT */ + SOLARIS_X86_PARTITION = 0x82, /* also Linux swap partitions */ + NEW_SOLARIS_X86_PARTITION = 0xbf, + diff --git a/target/linux/generic/hack-5.15/420-mtd-support-OpenWrt-s-MTD_ROOTFS_ROOT_DEV.patch b/target/linux/generic/hack-5.15/420-mtd-support-OpenWrt-s-MTD_ROOTFS_ROOT_DEV.patch new file mode 100644 index 0000000000..e2a0d498cb --- /dev/null +++ b/target/linux/generic/hack-5.15/420-mtd-support-OpenWrt-s-MTD_ROOTFS_ROOT_DEV.patch @@ -0,0 +1,24 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Mon, 7 Nov 2022 23:48:24 +0100 +Subject: [PATCH] mtd: support libreCMC's MTD_ROOTFS_ROOT_DEV +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This allows setting ROOT_DEV to MTD partition named "rootfs". + +Signed-off-by: Rafał Miłecki +--- + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -784,7 +784,8 @@ int add_mtd_device(struct mtd_info *mtd) + + mutex_unlock(&mtd_table_mutex); + +- if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL)) { ++ if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL) || ++ (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && !strcmp(mtd->name, "rootfs") && ROOT_DEV == 0)) { + if (IS_BUILTIN(CONFIG_MTD)) { + pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name); + ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index); diff --git a/target/linux/generic/hack-5.10/422-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch b/target/linux/generic/hack-5.15/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch similarity index 100% rename from target/linux/generic/hack-5.10/422-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch rename to target/linux/generic/hack-5.15/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch diff --git a/target/linux/generic/hack-5.15/430-mtk-bmt-support.patch b/target/linux/generic/hack-5.15/430-mtk-bmt-support.patch new file mode 100644 index 0000000000..0dec6e4b61 --- /dev/null +++ b/target/linux/generic/hack-5.15/430-mtk-bmt-support.patch @@ -0,0 +1,33 @@ +From ac84397efb3b3868c71c10ad7521161773228a17 Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 13:41:44 +0200 +Subject: [PATCH] mtd/nand: add MediaTek NAND bad block managment table + +--- + drivers/mtd/nand/Kconfig | 4 ++++ + drivers/mtd/nand/Makefile | 1 + + 2 files changed, 5 insertions(+) + +--- a/drivers/mtd/nand/Kconfig ++++ b/drivers/mtd/nand/Kconfig +@@ -46,6 +46,10 @@ config MTD_NAND_ECC_SW_BCH + ECC codes. They are used with NAND devices requiring more than 1 bit + of error correction. + ++config MTD_NAND_MTK_BMT ++ bool "Support MediaTek NAND Bad-block Management Table" ++ default n ++ + endmenu + + endmenu +--- a/drivers/mtd/nand/Makefile ++++ b/drivers/mtd/nand/Makefile +@@ -2,6 +2,7 @@ + + nandcore-objs := core.o bbt.o + obj-$(CONFIG_MTD_NAND_CORE) += nandcore.o ++obj-$(CONFIG_MTD_NAND_MTK_BMT) += mtk_bmt.o mtk_bmt_v2.o mtk_bmt_bbt.o mtk_bmt_nmbm.o + + obj-y += onenand/ + obj-y += raw/ diff --git a/target/linux/generic/hack-5.15/601-of_net-add-mac-address-ascii-support.patch b/target/linux/generic/hack-5.15/601-of_net-add-mac-address-ascii-support.patch new file mode 100644 index 0000000000..55866c3135 --- /dev/null +++ b/target/linux/generic/hack-5.15/601-of_net-add-mac-address-ascii-support.patch @@ -0,0 +1,116 @@ +From: Yousong Zhou +Subject: [PATCH] of: net: add nvmem cell mac-address-ascii support + +This is needed for devices with mac address stored in ascii format, +e.g. HiWiFi HC6361 to be ported in the following patch. + +Submitted-by: Yousong Zhou +--- + net/core/of_net.c | 83 ++++++++++++------ + 1 files changed, 72 insertions(+), 11 deletions(-) + +--- a/net/core/of_net.c ++++ b/net/core/of_net.c +@@ -57,13 +57,70 @@ static int of_get_mac_addr(struct device + return -ENODEV; + } + ++static void *nvmem_cell_get_mac_address(struct nvmem_cell *cell) ++{ ++ size_t len; ++ void *mac; ++ ++ mac = nvmem_cell_read(cell, &len); ++ if (IS_ERR(mac)) ++ return mac; ++ if (len != ETH_ALEN) { ++ kfree(mac); ++ return ERR_PTR(-EINVAL); ++ } ++ return mac; ++} ++ ++static void *nvmem_cell_get_mac_address_ascii(struct nvmem_cell *cell) ++{ ++ size_t len; ++ int ret; ++ void *mac_ascii; ++ u8 *mac; ++ ++ mac_ascii = nvmem_cell_read(cell, &len); ++ if (IS_ERR(mac_ascii)) ++ return mac_ascii; ++ if (len != ETH_ALEN*2+5) { ++ kfree(mac_ascii); ++ return ERR_PTR(-EINVAL); ++ } ++ mac = kmalloc(ETH_ALEN, GFP_KERNEL); ++ if (!mac) { ++ kfree(mac_ascii); ++ return ERR_PTR(-ENOMEM); ++ } ++ ret = sscanf(mac_ascii, "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx", ++ &mac[0], &mac[1], &mac[2], ++ &mac[3], &mac[4], &mac[5]); ++ kfree(mac_ascii); ++ if (ret == ETH_ALEN) ++ return mac; ++ kfree(mac); ++ return ERR_PTR(-EINVAL); ++} ++ ++static struct nvmem_cell_mac_address_property { ++ char *name; ++ void *(*read)(struct nvmem_cell *); ++} nvmem_cell_mac_address_properties[] = { ++ { ++ .name = "mac-address", ++ .read = nvmem_cell_get_mac_address, ++ }, { ++ .name = "mac-address-ascii", ++ .read = nvmem_cell_get_mac_address_ascii, ++ }, ++}; ++ + static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr) + { + struct platform_device *pdev = of_find_device_by_node(np); ++ struct nvmem_cell_mac_address_property *property; + struct nvmem_cell *cell; + const void *mac; +- size_t len; +- int ret; ++ int ret, i; + + /* Try lookup by device first, there might be a nvmem_cell_lookup + * associated with a given device. +@@ -74,17 +131,26 @@ static int of_get_mac_addr_nvmem(struct + return ret; + } + +- cell = of_nvmem_cell_get(np, "mac-address"); ++ for (i = 0; i < ARRAY_SIZE(nvmem_cell_mac_address_properties); i++) { ++ property = &nvmem_cell_mac_address_properties[i]; ++ cell = of_nvmem_cell_get(np, property->name); ++ /* For -EPROBE_DEFER don't try other properties. ++ * We'll get back to this one. ++ */ ++ if (!IS_ERR(cell) || PTR_ERR(cell) == -EPROBE_DEFER) ++ break; ++ } ++ + if (IS_ERR(cell)) + return PTR_ERR(cell); + +- mac = nvmem_cell_read(cell, &len); ++ mac = property->read(cell); + nvmem_cell_put(cell); + + if (IS_ERR(mac)) + return PTR_ERR(mac); + +- if (len != ETH_ALEN || !is_valid_ether_addr(mac)) { ++ if (!is_valid_ether_addr(mac)) { + kfree(mac); + return -EINVAL; + } diff --git a/target/linux/generic/hack-5.10/645-netfilter-connmark-introduce-set-dscpmark.patch b/target/linux/generic/hack-5.15/645-netfilter-connmark-introduce-set-dscpmark.patch similarity index 100% rename from target/linux/generic/hack-5.10/645-netfilter-connmark-introduce-set-dscpmark.patch rename to target/linux/generic/hack-5.15/645-netfilter-connmark-introduce-set-dscpmark.patch diff --git a/target/linux/generic/hack-5.15/650-netfilter-add-xt_FLOWOFFLOAD-target.patch b/target/linux/generic/hack-5.15/650-netfilter-add-xt_FLOWOFFLOAD-target.patch new file mode 100644 index 0000000000..aa6c668558 --- /dev/null +++ b/target/linux/generic/hack-5.15/650-netfilter-add-xt_FLOWOFFLOAD-target.patch @@ -0,0 +1,861 @@ +From: Felix Fietkau +Date: Tue, 20 Feb 2018 15:56:02 +0100 +Subject: [PATCH] netfilter: add xt_FLOWOFFLOAD target + +Signed-off-by: Felix Fietkau +--- + create mode 100644 net/netfilter/xt_OFFLOAD.c + +--- a/net/ipv4/netfilter/Kconfig ++++ b/net/ipv4/netfilter/Kconfig +@@ -56,8 +56,6 @@ config NF_TABLES_ARP + help + This option enables the ARP support for nf_tables. + +-endif # NF_TABLES +- + config NF_FLOW_TABLE_IPV4 + tristate "Netfilter flow table IPv4 module" + depends on NF_FLOW_TABLE +@@ -66,6 +64,8 @@ config NF_FLOW_TABLE_IPV4 + + To compile it as a module, choose M here. + ++endif # NF_TABLES ++ + config NF_DUP_IPV4 + tristate "Netfilter IPv4 packet duplication to alternate destination" + depends on !NF_CONNTRACK || NF_CONNTRACK +--- a/net/ipv6/netfilter/Kconfig ++++ b/net/ipv6/netfilter/Kconfig +@@ -45,7 +45,6 @@ config NFT_FIB_IPV6 + multicast or blackhole. + + endif # NF_TABLES_IPV6 +-endif # NF_TABLES + + config NF_FLOW_TABLE_IPV6 + tristate "Netfilter flow table IPv6 module" +@@ -55,6 +54,8 @@ config NF_FLOW_TABLE_IPV6 + + To compile it as a module, choose M here. + ++endif # NF_TABLES ++ + config NF_DUP_IPV6 + tristate "Netfilter IPv6 packet duplication to alternate destination" + depends on !NF_CONNTRACK || NF_CONNTRACK +--- a/net/netfilter/Kconfig ++++ b/net/netfilter/Kconfig +@@ -707,8 +707,6 @@ config NFT_REJECT_NETDEV + + endif # NF_TABLES_NETDEV + +-endif # NF_TABLES +- + config NF_FLOW_TABLE_INET + tristate "Netfilter flow table mixed IPv4/IPv6 module" + depends on NF_FLOW_TABLE +@@ -717,11 +715,12 @@ config NF_FLOW_TABLE_INET + + To compile it as a module, choose M here. + ++endif # NF_TABLES ++ + config NF_FLOW_TABLE + tristate "Netfilter flow table module" + depends on NETFILTER_INGRESS + depends on NF_CONNTRACK +- depends on NF_TABLES + help + This option adds the flow table core infrastructure. + +@@ -1010,6 +1009,15 @@ config NETFILTER_XT_TARGET_NOTRACK + depends on NETFILTER_ADVANCED + select NETFILTER_XT_TARGET_CT + ++config NETFILTER_XT_TARGET_FLOWOFFLOAD ++ tristate '"FLOWOFFLOAD" target support' ++ depends on NF_FLOW_TABLE ++ depends on NETFILTER_INGRESS ++ help ++ This option adds a `FLOWOFFLOAD' target, which uses the nf_flow_offload ++ module to speed up processing of packets by bypassing the usual ++ netfilter chains ++ + config NETFILTER_XT_TARGET_RATEEST + tristate '"RATEEST" target support' + depends on NETFILTER_ADVANCED +--- a/net/netfilter/Makefile ++++ b/net/netfilter/Makefile +@@ -143,6 +143,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CLASSIF + obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o + obj-$(CONFIG_NETFILTER_XT_TARGET_CT) += xt_CT.o + obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o ++obj-$(CONFIG_NETFILTER_XT_TARGET_FLOWOFFLOAD) += xt_FLOWOFFLOAD.o + obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o + obj-$(CONFIG_NETFILTER_XT_TARGET_HMARK) += xt_HMARK.o + obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o +--- /dev/null ++++ b/net/netfilter/xt_FLOWOFFLOAD.c +@@ -0,0 +1,698 @@ ++/* ++ * Copyright (C) 2018-2021 Felix Fietkau ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++struct xt_flowoffload_hook { ++ struct hlist_node list; ++ struct nf_hook_ops ops; ++ struct net *net; ++ bool registered; ++ bool used; ++}; ++ ++struct xt_flowoffload_table { ++ struct nf_flowtable ft; ++ struct hlist_head hooks; ++ struct delayed_work work; ++}; ++ ++struct nf_forward_info { ++ const struct net_device *indev; ++ const struct net_device *outdev; ++ const struct net_device *hw_outdev; ++ struct id { ++ __u16 id; ++ __be16 proto; ++ } encap[NF_FLOW_TABLE_ENCAP_MAX]; ++ u8 num_encaps; ++ u8 ingress_vlans; ++ u8 h_source[ETH_ALEN]; ++ u8 h_dest[ETH_ALEN]; ++ enum flow_offload_xmit_type xmit_type; ++}; ++ ++static DEFINE_SPINLOCK(hooks_lock); ++ ++struct xt_flowoffload_table flowtable[2]; ++ ++static unsigned int ++xt_flowoffload_net_hook(void *priv, struct sk_buff *skb, ++ const struct nf_hook_state *state) ++{ ++ struct vlan_ethhdr *veth; ++ __be16 proto; ++ ++ switch (skb->protocol) { ++ case htons(ETH_P_8021Q): ++ veth = (struct vlan_ethhdr *)skb_mac_header(skb); ++ proto = veth->h_vlan_encapsulated_proto; ++ break; ++ case htons(ETH_P_PPP_SES): ++ proto = nf_flow_pppoe_proto(skb); ++ break; ++ default: ++ proto = skb->protocol; ++ break; ++ } ++ ++ switch (proto) { ++ case htons(ETH_P_IP): ++ return nf_flow_offload_ip_hook(priv, skb, state); ++ case htons(ETH_P_IPV6): ++ return nf_flow_offload_ipv6_hook(priv, skb, state); ++ } ++ ++ return NF_ACCEPT; ++} ++ ++static int ++xt_flowoffload_create_hook(struct xt_flowoffload_table *table, ++ struct net_device *dev) ++{ ++ struct xt_flowoffload_hook *hook; ++ struct nf_hook_ops *ops; ++ ++ hook = kzalloc(sizeof(*hook), GFP_ATOMIC); ++ if (!hook) ++ return -ENOMEM; ++ ++ ops = &hook->ops; ++ ops->pf = NFPROTO_NETDEV; ++ ops->hooknum = NF_NETDEV_INGRESS; ++ ops->priority = 10; ++ ops->priv = &table->ft; ++ ops->hook = xt_flowoffload_net_hook; ++ ops->dev = dev; ++ ++ hlist_add_head(&hook->list, &table->hooks); ++ mod_delayed_work(system_power_efficient_wq, &table->work, 0); ++ ++ return 0; ++} ++ ++static struct xt_flowoffload_hook * ++flow_offload_lookup_hook(struct xt_flowoffload_table *table, ++ struct net_device *dev) ++{ ++ struct xt_flowoffload_hook *hook; ++ ++ hlist_for_each_entry(hook, &table->hooks, list) { ++ if (hook->ops.dev == dev) ++ return hook; ++ } ++ ++ return NULL; ++} ++ ++static void ++xt_flowoffload_check_device(struct xt_flowoffload_table *table, ++ struct net_device *dev) ++{ ++ struct xt_flowoffload_hook *hook; ++ ++ if (!dev) ++ return; ++ ++ spin_lock_bh(&hooks_lock); ++ hook = flow_offload_lookup_hook(table, dev); ++ if (hook) ++ hook->used = true; ++ else ++ xt_flowoffload_create_hook(table, dev); ++ spin_unlock_bh(&hooks_lock); ++} ++ ++static void ++xt_flowoffload_register_hooks(struct xt_flowoffload_table *table) ++{ ++ struct xt_flowoffload_hook *hook; ++ ++restart: ++ hlist_for_each_entry(hook, &table->hooks, list) { ++ if (hook->registered) ++ continue; ++ ++ hook->registered = true; ++ hook->net = dev_net(hook->ops.dev); ++ spin_unlock_bh(&hooks_lock); ++ nf_register_net_hook(hook->net, &hook->ops); ++ if (table->ft.flags & NF_FLOWTABLE_HW_OFFLOAD) ++ table->ft.type->setup(&table->ft, hook->ops.dev, ++ FLOW_BLOCK_BIND); ++ spin_lock_bh(&hooks_lock); ++ goto restart; ++ } ++ ++} ++ ++static bool ++xt_flowoffload_cleanup_hooks(struct xt_flowoffload_table *table) ++{ ++ struct xt_flowoffload_hook *hook; ++ bool active = false; ++ ++restart: ++ spin_lock_bh(&hooks_lock); ++ hlist_for_each_entry(hook, &table->hooks, list) { ++ if (hook->used || !hook->registered) { ++ active = true; ++ continue; ++ } ++ ++ hlist_del(&hook->list); ++ spin_unlock_bh(&hooks_lock); ++ if (table->ft.flags & NF_FLOWTABLE_HW_OFFLOAD) ++ table->ft.type->setup(&table->ft, hook->ops.dev, ++ FLOW_BLOCK_UNBIND); ++ nf_unregister_net_hook(hook->net, &hook->ops); ++ kfree(hook); ++ goto restart; ++ } ++ spin_unlock_bh(&hooks_lock); ++ ++ return active; ++} ++ ++static void ++xt_flowoffload_check_hook(struct nf_flowtable *flowtable, ++ struct flow_offload *flow, void *data) ++{ ++ struct xt_flowoffload_table *table; ++ struct flow_offload_tuple *tuple0 = &flow->tuplehash[0].tuple; ++ struct flow_offload_tuple *tuple1 = &flow->tuplehash[1].tuple; ++ struct xt_flowoffload_hook *hook; ++ ++ table = container_of(flowtable, struct xt_flowoffload_table, ft); ++ ++ spin_lock_bh(&hooks_lock); ++ hlist_for_each_entry(hook, &table->hooks, list) { ++ if (hook->ops.dev->ifindex != tuple0->iifidx && ++ hook->ops.dev->ifindex != tuple1->iifidx) ++ continue; ++ ++ hook->used = true; ++ } ++ spin_unlock_bh(&hooks_lock); ++} ++ ++static void ++xt_flowoffload_hook_work(struct work_struct *work) ++{ ++ struct xt_flowoffload_table *table; ++ struct xt_flowoffload_hook *hook; ++ int err; ++ ++ table = container_of(work, struct xt_flowoffload_table, work.work); ++ ++ spin_lock_bh(&hooks_lock); ++ xt_flowoffload_register_hooks(table); ++ hlist_for_each_entry(hook, &table->hooks, list) ++ hook->used = false; ++ spin_unlock_bh(&hooks_lock); ++ ++ err = nf_flow_table_iterate(&table->ft, xt_flowoffload_check_hook, ++ NULL); ++ if (err && err != -EAGAIN) ++ goto out; ++ ++ if (!xt_flowoffload_cleanup_hooks(table)) ++ return; ++ ++out: ++ queue_delayed_work(system_power_efficient_wq, &table->work, HZ); ++} ++ ++static bool ++xt_flowoffload_skip(struct sk_buff *skb, int family) ++{ ++ if (skb_sec_path(skb)) ++ return true; ++ ++ if (family == NFPROTO_IPV4) { ++ const struct ip_options *opt = &(IPCB(skb)->opt); ++ ++ if (unlikely(opt->optlen)) ++ return true; ++ } ++ ++ return false; ++} ++ ++static enum flow_offload_xmit_type nf_xmit_type(struct dst_entry *dst) ++{ ++ if (dst_xfrm(dst)) ++ return FLOW_OFFLOAD_XMIT_XFRM; ++ ++ return FLOW_OFFLOAD_XMIT_NEIGH; ++} ++ ++static void nf_default_forward_path(struct nf_flow_route *route, ++ struct dst_entry *dst_cache, ++ enum ip_conntrack_dir dir, ++ struct net_device **dev) ++{ ++ dev[!dir] = dst_cache->dev; ++ route->tuple[!dir].in.ifindex = dst_cache->dev->ifindex; ++ route->tuple[dir].dst = dst_cache; ++ route->tuple[dir].xmit_type = nf_xmit_type(dst_cache); ++} ++ ++static bool nf_is_valid_ether_device(const struct net_device *dev) ++{ ++ if (!dev || (dev->flags & IFF_LOOPBACK) || dev->type != ARPHRD_ETHER || ++ dev->addr_len != ETH_ALEN || !is_valid_ether_addr(dev->dev_addr)) ++ return false; ++ ++ return true; ++} ++ ++static void nf_dev_path_info(const struct net_device_path_stack *stack, ++ struct nf_forward_info *info, ++ unsigned char *ha) ++{ ++ const struct net_device_path *path; ++ int i; ++ ++ memcpy(info->h_dest, ha, ETH_ALEN); ++ ++ for (i = 0; i < stack->num_paths; i++) { ++ path = &stack->path[i]; ++ switch (path->type) { ++ case DEV_PATH_ETHERNET: ++ case DEV_PATH_DSA: ++ case DEV_PATH_VLAN: ++ case DEV_PATH_PPPOE: ++ info->indev = path->dev; ++ if (is_zero_ether_addr(info->h_source)) ++ memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); ++ ++ if (path->type == DEV_PATH_ETHERNET) ++ break; ++ if (path->type == DEV_PATH_DSA) { ++ i = stack->num_paths; ++ break; ++ } ++ ++ /* DEV_PATH_VLAN and DEV_PATH_PPPOE */ ++ if (info->num_encaps >= NF_FLOW_TABLE_ENCAP_MAX) { ++ info->indev = NULL; ++ break; ++ } ++ if (!info->outdev) ++ info->outdev = path->dev; ++ info->encap[info->num_encaps].id = path->encap.id; ++ info->encap[info->num_encaps].proto = path->encap.proto; ++ info->num_encaps++; ++ if (path->type == DEV_PATH_PPPOE) ++ memcpy(info->h_dest, path->encap.h_dest, ETH_ALEN); ++ break; ++ case DEV_PATH_BRIDGE: ++ if (is_zero_ether_addr(info->h_source)) ++ memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); ++ ++ switch (path->bridge.vlan_mode) { ++ case DEV_PATH_BR_VLAN_UNTAG_HW: ++ info->ingress_vlans |= BIT(info->num_encaps - 1); ++ break; ++ case DEV_PATH_BR_VLAN_TAG: ++ info->encap[info->num_encaps].id = path->bridge.vlan_id; ++ info->encap[info->num_encaps].proto = path->bridge.vlan_proto; ++ info->num_encaps++; ++ break; ++ case DEV_PATH_BR_VLAN_UNTAG: ++ info->num_encaps--; ++ break; ++ case DEV_PATH_BR_VLAN_KEEP: ++ break; ++ } ++ break; ++ default: ++ info->indev = NULL; ++ break; ++ } ++ } ++ if (!info->outdev) ++ info->outdev = info->indev; ++ ++ info->hw_outdev = info->indev; ++ ++ if (nf_is_valid_ether_device(info->indev)) ++ info->xmit_type = FLOW_OFFLOAD_XMIT_DIRECT; ++} ++ ++static int nf_dev_fill_forward_path(const struct nf_flow_route *route, ++ const struct dst_entry *dst_cache, ++ const struct nf_conn *ct, ++ enum ip_conntrack_dir dir, u8 *ha, ++ struct net_device_path_stack *stack) ++{ ++ const void *daddr = &ct->tuplehash[!dir].tuple.src.u3; ++ struct net_device *dev = dst_cache->dev; ++ struct neighbour *n; ++ u8 nud_state; ++ ++ if (!nf_is_valid_ether_device(dev)) ++ goto out; ++ ++ n = dst_neigh_lookup(dst_cache, daddr); ++ if (!n) ++ return -1; ++ ++ read_lock_bh(&n->lock); ++ nud_state = n->nud_state; ++ ether_addr_copy(ha, n->ha); ++ read_unlock_bh(&n->lock); ++ neigh_release(n); ++ ++ if (!(nud_state & NUD_VALID)) ++ return -1; ++ ++out: ++ return dev_fill_forward_path(dev, ha, stack); ++} ++ ++static void nf_dev_forward_path(struct nf_flow_route *route, ++ const struct nf_conn *ct, ++ enum ip_conntrack_dir dir, ++ struct net_device **devs) ++{ ++ const struct dst_entry *dst = route->tuple[dir].dst; ++ struct net_device_path_stack stack; ++ struct nf_forward_info info = {}; ++ unsigned char ha[ETH_ALEN]; ++ int i; ++ ++ if (nf_dev_fill_forward_path(route, dst, ct, dir, ha, &stack) >= 0) ++ nf_dev_path_info(&stack, &info, ha); ++ ++ devs[!dir] = (struct net_device *)info.indev; ++ if (!info.indev) ++ return; ++ ++ route->tuple[!dir].in.ifindex = info.indev->ifindex; ++ for (i = 0; i < info.num_encaps; i++) { ++ route->tuple[!dir].in.encap[i].id = info.encap[i].id; ++ route->tuple[!dir].in.encap[i].proto = info.encap[i].proto; ++ } ++ route->tuple[!dir].in.num_encaps = info.num_encaps; ++ route->tuple[!dir].in.ingress_vlans = info.ingress_vlans; ++ ++ if (info.xmit_type == FLOW_OFFLOAD_XMIT_DIRECT) { ++ memcpy(route->tuple[dir].out.h_source, info.h_source, ETH_ALEN); ++ memcpy(route->tuple[dir].out.h_dest, info.h_dest, ETH_ALEN); ++ route->tuple[dir].out.ifindex = info.outdev->ifindex; ++ route->tuple[dir].out.hw_ifindex = info.hw_outdev->ifindex; ++ route->tuple[dir].xmit_type = info.xmit_type; ++ } ++} ++ ++static int ++xt_flowoffload_route(struct sk_buff *skb, const struct nf_conn *ct, ++ const struct xt_action_param *par, ++ struct nf_flow_route *route, enum ip_conntrack_dir dir, ++ struct net_device **devs) ++{ ++ struct dst_entry *this_dst = skb_dst(skb); ++ struct dst_entry *other_dst = NULL; ++ struct flowi fl; ++ ++ memset(&fl, 0, sizeof(fl)); ++ switch (xt_family(par)) { ++ case NFPROTO_IPV4: ++ fl.u.ip4.daddr = ct->tuplehash[dir].tuple.src.u3.ip; ++ fl.u.ip4.flowi4_oif = xt_in(par)->ifindex; ++ break; ++ case NFPROTO_IPV6: ++ fl.u.ip6.saddr = ct->tuplehash[!dir].tuple.dst.u3.in6; ++ fl.u.ip6.daddr = ct->tuplehash[dir].tuple.src.u3.in6; ++ fl.u.ip6.flowi6_oif = xt_in(par)->ifindex; ++ break; ++ } ++ ++ nf_route(xt_net(par), &other_dst, &fl, false, xt_family(par)); ++ if (!other_dst) ++ return -ENOENT; ++ ++ nf_default_forward_path(route, this_dst, dir, devs); ++ nf_default_forward_path(route, other_dst, !dir, devs); ++ ++ if (route->tuple[dir].xmit_type == FLOW_OFFLOAD_XMIT_NEIGH && ++ route->tuple[!dir].xmit_type == FLOW_OFFLOAD_XMIT_NEIGH) { ++ nf_dev_forward_path(route, ct, dir, devs); ++ nf_dev_forward_path(route, ct, !dir, devs); ++ } ++ ++ return 0; ++} ++ ++static unsigned int ++flowoffload_tg(struct sk_buff *skb, const struct xt_action_param *par) ++{ ++ struct xt_flowoffload_table *table; ++ const struct xt_flowoffload_target_info *info = par->targinfo; ++ struct tcphdr _tcph, *tcph = NULL; ++ enum ip_conntrack_info ctinfo; ++ enum ip_conntrack_dir dir; ++ struct nf_flow_route route = {}; ++ struct flow_offload *flow = NULL; ++ struct net_device *devs[2] = {}; ++ struct nf_conn *ct; ++ struct net *net; ++ ++ if (xt_flowoffload_skip(skb, xt_family(par))) ++ return XT_CONTINUE; ++ ++ ct = nf_ct_get(skb, &ctinfo); ++ if (ct == NULL) ++ return XT_CONTINUE; ++ ++ switch (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum) { ++ case IPPROTO_TCP: ++ if (ct->proto.tcp.state != TCP_CONNTRACK_ESTABLISHED) ++ return XT_CONTINUE; ++ ++ tcph = skb_header_pointer(skb, par->thoff, ++ sizeof(_tcph), &_tcph); ++ if (unlikely(!tcph || tcph->fin || tcph->rst)) ++ return XT_CONTINUE; ++ break; ++ case IPPROTO_UDP: ++ break; ++ default: ++ return XT_CONTINUE; ++ } ++ ++ if (nf_ct_ext_exist(ct, NF_CT_EXT_HELPER) || ++ ct->status & (IPS_SEQ_ADJUST | IPS_NAT_CLASH)) ++ return XT_CONTINUE; ++ ++ if (!nf_ct_is_confirmed(ct)) ++ return XT_CONTINUE; ++ ++ devs[dir] = xt_out(par); ++ devs[!dir] = xt_in(par); ++ ++ if (!devs[dir] || !devs[!dir]) ++ return XT_CONTINUE; ++ ++ if (test_and_set_bit(IPS_OFFLOAD_BIT, &ct->status)) ++ return XT_CONTINUE; ++ ++ dir = CTINFO2DIR(ctinfo); ++ ++ if (xt_flowoffload_route(skb, ct, par, &route, dir, devs) < 0) ++ goto err_flow_route; ++ ++ flow = flow_offload_alloc(ct); ++ if (!flow) ++ goto err_flow_alloc; ++ ++ if (flow_offload_route_init(flow, &route) < 0) ++ goto err_flow_add; ++ ++ if (tcph) { ++ ct->proto.tcp.seen[0].flags |= IP_CT_TCP_FLAG_BE_LIBERAL; ++ ct->proto.tcp.seen[1].flags |= IP_CT_TCP_FLAG_BE_LIBERAL; ++ } ++ ++ table = &flowtable[!!(info->flags & XT_FLOWOFFLOAD_HW)]; ++ ++ net = read_pnet(&table->ft.net); ++ if (!net) ++ write_pnet(&table->ft.net, xt_net(par)); ++ ++ if (flow_offload_add(&table->ft, flow) < 0) ++ goto err_flow_add; ++ ++ xt_flowoffload_check_device(table, devs[0]); ++ xt_flowoffload_check_device(table, devs[1]); ++ ++ dst_release(route.tuple[!dir].dst); ++ ++ return XT_CONTINUE; ++ ++err_flow_add: ++ flow_offload_free(flow); ++err_flow_alloc: ++ dst_release(route.tuple[!dir].dst); ++err_flow_route: ++ clear_bit(IPS_OFFLOAD_BIT, &ct->status); ++ ++ return XT_CONTINUE; ++} ++ ++static int flowoffload_chk(const struct xt_tgchk_param *par) ++{ ++ struct xt_flowoffload_target_info *info = par->targinfo; ++ ++ if (info->flags & ~XT_FLOWOFFLOAD_MASK) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static struct xt_target offload_tg_reg __read_mostly = { ++ .family = NFPROTO_UNSPEC, ++ .name = "FLOWOFFLOAD", ++ .revision = 0, ++ .targetsize = sizeof(struct xt_flowoffload_target_info), ++ .usersize = sizeof(struct xt_flowoffload_target_info), ++ .checkentry = flowoffload_chk, ++ .target = flowoffload_tg, ++ .me = THIS_MODULE, ++}; ++ ++static int flow_offload_netdev_event(struct notifier_block *this, ++ unsigned long event, void *ptr) ++{ ++ struct xt_flowoffload_hook *hook0, *hook1; ++ struct net_device *dev = netdev_notifier_info_to_dev(ptr); ++ ++ if (event != NETDEV_UNREGISTER) ++ return NOTIFY_DONE; ++ ++ spin_lock_bh(&hooks_lock); ++ hook0 = flow_offload_lookup_hook(&flowtable[0], dev); ++ if (hook0) ++ hlist_del(&hook0->list); ++ ++ hook1 = flow_offload_lookup_hook(&flowtable[1], dev); ++ if (hook1) ++ hlist_del(&hook1->list); ++ spin_unlock_bh(&hooks_lock); ++ ++ if (hook0) { ++ nf_unregister_net_hook(hook0->net, &hook0->ops); ++ kfree(hook0); ++ } ++ ++ if (hook1) { ++ nf_unregister_net_hook(hook1->net, &hook1->ops); ++ kfree(hook1); ++ } ++ ++ nf_flow_table_cleanup(dev); ++ ++ return NOTIFY_DONE; ++} ++ ++static struct notifier_block flow_offload_netdev_notifier = { ++ .notifier_call = flow_offload_netdev_event, ++}; ++ ++static int nf_flow_rule_route_inet(struct net *net, ++ const struct flow_offload *flow, ++ enum flow_offload_tuple_dir dir, ++ struct nf_flow_rule *flow_rule) ++{ ++ const struct flow_offload_tuple *flow_tuple = &flow->tuplehash[dir].tuple; ++ int err; ++ ++ switch (flow_tuple->l3proto) { ++ case NFPROTO_IPV4: ++ err = nf_flow_rule_route_ipv4(net, flow, dir, flow_rule); ++ break; ++ case NFPROTO_IPV6: ++ err = nf_flow_rule_route_ipv6(net, flow, dir, flow_rule); ++ break; ++ default: ++ err = -1; ++ break; ++ } ++ ++ return err; ++} ++ ++static struct nf_flowtable_type flowtable_inet = { ++ .family = NFPROTO_INET, ++ .init = nf_flow_table_init, ++ .setup = nf_flow_table_offload_setup, ++ .action = nf_flow_rule_route_inet, ++ .free = nf_flow_table_free, ++ .hook = xt_flowoffload_net_hook, ++ .owner = THIS_MODULE, ++}; ++ ++static int init_flowtable(struct xt_flowoffload_table *tbl) ++{ ++ INIT_DELAYED_WORK(&tbl->work, xt_flowoffload_hook_work); ++ tbl->ft.type = &flowtable_inet; ++ tbl->ft.flags = NF_FLOWTABLE_COUNTER; ++ ++ return nf_flow_table_init(&tbl->ft); ++} ++ ++static int __init xt_flowoffload_tg_init(void) ++{ ++ int ret; ++ ++ register_netdevice_notifier(&flow_offload_netdev_notifier); ++ ++ ret = init_flowtable(&flowtable[0]); ++ if (ret) ++ return ret; ++ ++ ret = init_flowtable(&flowtable[1]); ++ if (ret) ++ goto cleanup; ++ ++ flowtable[1].ft.flags |= NF_FLOWTABLE_HW_OFFLOAD; ++ ++ ret = xt_register_target(&offload_tg_reg); ++ if (ret) ++ goto cleanup2; ++ ++ return 0; ++ ++cleanup2: ++ nf_flow_table_free(&flowtable[1].ft); ++cleanup: ++ nf_flow_table_free(&flowtable[0].ft); ++ return ret; ++} ++ ++static void __exit xt_flowoffload_tg_exit(void) ++{ ++ xt_unregister_target(&offload_tg_reg); ++ unregister_netdevice_notifier(&flow_offload_netdev_notifier); ++ nf_flow_table_free(&flowtable[0].ft); ++ nf_flow_table_free(&flowtable[1].ft); ++} ++ ++MODULE_LICENSE("GPL"); ++module_init(xt_flowoffload_tg_init); ++module_exit(xt_flowoffload_tg_exit); +--- a/net/netfilter/nf_flow_table_core.c ++++ b/net/netfilter/nf_flow_table_core.c +@@ -7,7 +7,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -380,8 +379,7 @@ flow_offload_lookup(struct nf_flowtable + } + EXPORT_SYMBOL_GPL(flow_offload_lookup); + +-static int +-nf_flow_table_iterate(struct nf_flowtable *flow_table, ++int nf_flow_table_iterate(struct nf_flowtable *flow_table, + void (*iter)(struct nf_flowtable *flowtable, + struct flow_offload *flow, void *data), + void *data) +@@ -435,6 +433,7 @@ static void nf_flow_offload_gc_step(stru + nf_flow_offload_stats(flow_table, flow); + } + } ++EXPORT_SYMBOL_GPL(nf_flow_table_iterate); + + void nf_flow_table_gc_run(struct nf_flowtable *flow_table) + { +--- /dev/null ++++ b/include/uapi/linux/netfilter/xt_FLOWOFFLOAD.h +@@ -0,0 +1,17 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ ++#ifndef _XT_FLOWOFFLOAD_H ++#define _XT_FLOWOFFLOAD_H ++ ++#include ++ ++enum { ++ XT_FLOWOFFLOAD_HW = 1 << 0, ++ ++ XT_FLOWOFFLOAD_MASK = XT_FLOWOFFLOAD_HW ++}; ++ ++struct xt_flowoffload_target_info { ++ __u32 flags; ++}; ++ ++#endif /* _XT_FLOWOFFLOAD_H */ +--- a/include/net/netfilter/nf_flow_table.h ++++ b/include/net/netfilter/nf_flow_table.h +@@ -276,6 +276,11 @@ void nf_flow_table_free(struct nf_flowta + + void flow_offload_teardown(struct flow_offload *flow); + ++int nf_flow_table_iterate(struct nf_flowtable *flow_table, ++ void (*iter)(struct nf_flowtable *flowtable, ++ struct flow_offload *flow, void *data), ++ void *data); ++ + void nf_flow_snat_port(const struct flow_offload *flow, + struct sk_buff *skb, unsigned int thoff, + u8 protocol, enum flow_offload_tuple_dir dir); diff --git a/target/linux/generic/hack-5.15/651-wireless_mesh_header.patch b/target/linux/generic/hack-5.15/651-wireless_mesh_header.patch new file mode 100644 index 0000000000..12a031ec84 --- /dev/null +++ b/target/linux/generic/hack-5.15/651-wireless_mesh_header.patch @@ -0,0 +1,24 @@ +From 6d3bc769657b0ee7c7506dad9911111c4226a7ea Mon Sep 17 00:00:00 2001 +From: Imre Kaloz +Date: Fri, 7 Jul 2017 17:21:05 +0200 +Subject: mac80211: increase wireless mesh header size + +lede-commit 3d4466cfd8f75f717efdb1f96fdde3c70d865fc1 +Signed-off-by: Imre Kaloz +--- + include/linux/netdevice.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -145,8 +145,8 @@ static inline bool dev_xmit_complete(int + + #if defined(CONFIG_HYPERV_NET) + # define LL_MAX_HEADER 128 +-#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25) +-# if defined(CONFIG_MAC80211_MESH) ++#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25) || 1 ++# if defined(CONFIG_MAC80211_MESH) || 1 + # define LL_MAX_HEADER 128 + # else + # define LL_MAX_HEADER 96 diff --git a/target/linux/generic/hack-5.10/660-fq_codel_defaults.patch b/target/linux/generic/hack-5.15/660-fq_codel_defaults.patch similarity index 100% rename from target/linux/generic/hack-5.10/660-fq_codel_defaults.patch rename to target/linux/generic/hack-5.15/660-fq_codel_defaults.patch diff --git a/target/linux/generic/hack-5.15/661-kernel-ct-size-the-hashtable-more-adequately.patch b/target/linux/generic/hack-5.15/661-kernel-ct-size-the-hashtable-more-adequately.patch new file mode 100644 index 0000000000..2fa91deece --- /dev/null +++ b/target/linux/generic/hack-5.15/661-kernel-ct-size-the-hashtable-more-adequately.patch @@ -0,0 +1,25 @@ +From 804fbb3f2ec9283f7b778e057a68bfff440a0be6 Mon Sep 17 00:00:00 2001 +From: Rui Salvaterra +Date: Wed, 30 Mar 2022 22:51:55 +0100 +Subject: [PATCH] kernel: ct: size the hashtable more adequately + +To set the default size of the connection tracking hash table, a divider of +16384 becomes inadequate for a router handling lots of connections. Divide by +2048 instead, making the default size scale better with the available RAM. + +Signed-off-by: Rui Salvaterra +--- + net/netfilter/nf_conntrack_core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/net/netfilter/nf_conntrack_core.c ++++ b/net/netfilter/nf_conntrack_core.c +@@ -2738,7 +2738,7 @@ int nf_conntrack_init_start(void) + + if (!nf_conntrack_htable_size) { + nf_conntrack_htable_size +- = (((nr_pages << PAGE_SHIFT) / 16384) ++ = (((nr_pages << PAGE_SHIFT) / 2048) + / sizeof(struct hlist_head)); + if (BITS_PER_LONG >= 64 && + nr_pages > (4 * (1024 * 1024 * 1024 / PAGE_SIZE))) diff --git a/target/linux/generic/hack-5.15/700-swconfig_switch_drivers.patch b/target/linux/generic/hack-5.15/700-swconfig_switch_drivers.patch new file mode 100644 index 0000000000..e439bff2ca --- /dev/null +++ b/target/linux/generic/hack-5.15/700-swconfig_switch_drivers.patch @@ -0,0 +1,131 @@ +From 36e516290611e613aa92996cb4339561452695b4 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Fri, 7 Jul 2017 17:24:23 +0200 +Subject: net: swconfig: adds librecmc switch layer + +Signed-off-by: Felix Fietkau +--- + drivers/net/phy/Kconfig | 83 +++++++++++++++++++++++++++++++++++++++++++++++ + drivers/net/phy/Makefile | 15 +++++++++ + include/uapi/linux/Kbuild | 1 + + 3 files changed, 99 insertions(+) + +--- a/drivers/net/phy/Kconfig ++++ b/drivers/net/phy/Kconfig +@@ -62,6 +62,80 @@ config SFP + depends on HWMON || HWMON=n + select MDIO_I2C + ++comment "Switch configuration API + drivers" ++ ++config SWCONFIG ++ tristate "Switch configuration API" ++ help ++ Switch configuration API using netlink. This allows ++ you to configure the VLAN features of certain switches. ++ ++config SWCONFIG_LEDS ++ bool "Switch LED trigger support" ++ depends on (SWCONFIG && LEDS_TRIGGERS) ++ ++config ADM6996_PHY ++ tristate "Driver for ADM6996 switches" ++ select SWCONFIG ++ help ++ Currently supports the ADM6996FC and ADM6996M switches. ++ Support for FC is very limited. ++ ++config AR8216_PHY ++ tristate "Driver for Atheros AR8216/8327 switches" ++ select SWCONFIG ++ select ETHERNET_PACKET_MANGLE ++ ++config AR8216_PHY_LEDS ++ bool "Atheros AR8216 switch LED support" ++ depends on (AR8216_PHY && LEDS_CLASS) ++ ++source "drivers/net/phy/b53/Kconfig" ++ ++config IP17XX_PHY ++ tristate "Driver for IC+ IP17xx switches" ++ select SWCONFIG ++ ++config PSB6970_PHY ++ tristate "Lantiq XWAY Tantos (PSB6970) Ethernet switch" ++ select SWCONFIG ++ ++config RTL8306_PHY ++ tristate "Driver for Realtek RTL8306S switches" ++ select SWCONFIG ++ ++config RTL8366_SMI ++ tristate "Driver for the RTL8366 SMI interface" ++ depends on GPIOLIB ++ help ++ This module implements the SMI interface protocol which is used ++ by some RTL8366 ethernet switch devices via the generic GPIO API. ++ ++if RTL8366_SMI ++ ++config RTL8366_SMI_DEBUG_FS ++ bool "RTL8366 SMI interface debugfs support" ++ depends on DEBUG_FS ++ default n ++ ++config RTL8366S_PHY ++ tristate "Driver for the Realtek RTL8366S switch" ++ select SWCONFIG ++ ++config RTL8366RB_PHY ++ tristate "Driver for the Realtek RTL8366RB switch" ++ select SWCONFIG ++ ++config RTL8367_PHY ++ tristate "Driver for the Realtek RTL8367R/M switches" ++ select SWCONFIG ++ ++config RTL8367B_PHY ++ tristate "Driver fot the Realtek RTL8367R-VB switch" ++ select SWCONFIG ++ ++endif # RTL8366_SMI ++ + comment "MII PHY device drivers" + + config AMD_PHY +--- a/drivers/net/phy/Makefile ++++ b/drivers/net/phy/Makefile +@@ -24,6 +24,21 @@ libphy-$(CONFIG_LED_TRIGGER_PHY) += phy_ + obj-$(CONFIG_PHYLINK) += phylink.o + obj-$(CONFIG_PHYLIB) += libphy.o + ++obj-$(CONFIG_SWCONFIG) += swconfig.o ++obj-$(CONFIG_ADM6996_PHY) += adm6996.o ++obj-$(CONFIG_AR8216_PHY) += ar8xxx.o ++ar8xxx-y += ar8216.o ++ar8xxx-y += ar8327.o ++obj-$(CONFIG_SWCONFIG_B53) += b53/ ++obj-$(CONFIG_IP17XX_PHY) += ip17xx.o ++obj-$(CONFIG_PSB6970_PHY) += psb6970.o ++obj-$(CONFIG_RTL8306_PHY) += rtl8306.o ++obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi.o ++obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o ++obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o ++obj-$(CONFIG_RTL8367_PHY) += rtl8367.o ++obj-$(CONFIG_RTL8367B_PHY) += rtl8367b.o ++ + obj-$(CONFIG_NETWORK_PHY_TIMESTAMPING) += mii_timestamper.o + + obj-$(CONFIG_SFP) += sfp.o +--- a/include/linux/platform_data/b53.h ++++ b/include/linux/platform_data/b53.h +@@ -29,6 +29,9 @@ struct b53_platform_data { + u32 chip_id; + u16 enabled_ports; + ++ /* allow to specify an ethX alias */ ++ const char *alias; ++ + /* only used by MMAP'd driver */ + unsigned big_endian:1; + void __iomem *regs; diff --git a/target/linux/generic/hack-5.15/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch b/target/linux/generic/hack-5.15/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch new file mode 100644 index 0000000000..5129c04e7d --- /dev/null +++ b/target/linux/generic/hack-5.15/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch @@ -0,0 +1,21 @@ +From ebd924d773223593142d417c41d4ee6fa16f1805 Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 13:45:56 +0200 +Subject: [PATCH] net/dsa/mv88e6xxx: disable ATU violation + +--- + drivers/net/dsa/mv88e6xxx/chip.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/net/dsa/mv88e6xxx/chip.c ++++ b/drivers/net/dsa/mv88e6xxx/chip.c +@@ -2995,6 +2995,9 @@ static int mv88e6xxx_setup_port(struct m + else + reg = 1 << port; + ++ /* Disable ATU member violation interrupt */ ++ reg |= MV88E6XXX_PORT_ASSOC_VECTOR_IGNORE_WRONG; ++ + err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_ASSOC_VECTOR, + reg); + if (err) diff --git a/target/linux/generic/hack-5.15/720-net-phy-add-aqr-phys.patch b/target/linux/generic/hack-5.15/720-net-phy-add-aqr-phys.patch new file mode 100644 index 0000000000..29050d38ea --- /dev/null +++ b/target/linux/generic/hack-5.15/720-net-phy-add-aqr-phys.patch @@ -0,0 +1,142 @@ +From: Birger Koblitz +Date: Sun, 5 Sep 2021 15:13:10 +0200 +Subject: [PATCH] kernel: Add AQR113C and AQR813 support + +This hack adds support for the Aquantia 4th generation, 10GBit +PHYs AQR113C and AQR813. + +Signed-off-by: Birger Koblitz + +--- a/drivers/net/phy/aquantia_main.c ++++ b/drivers/net/phy/aquantia_main.c +@@ -20,8 +20,10 @@ + #define PHY_ID_AQR105 0x03a1b4a2 + #define PHY_ID_AQR106 0x03a1b4d0 + #define PHY_ID_AQR107 0x03a1b4e0 ++#define PHY_ID_AQR113C 0x31c31c12 + #define PHY_ID_AQCS109 0x03a1b5c2 + #define PHY_ID_AQR405 0x03a1b4b0 ++#define PHY_ID_AQR813 0x31c31cb2 + + #define MDIO_PHYXS_VEND_IF_STATUS 0xe812 + #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3) +@@ -381,6 +383,49 @@ static int aqr107_read_rate(struct phy_d + return 0; + } + ++static int aqr113c_read_status(struct phy_device *phydev) ++{ ++ int val, ret; ++ ++ ret = aqr_read_status(phydev); ++ if (ret) ++ return ret; ++ ++ if (!phydev->link || phydev->autoneg == AUTONEG_DISABLE) ++ return 0; ++ ++ // On AQR113C, the speed returned by aqr_read_status is wrong ++ aqr107_read_rate(phydev); ++ ++ val = phy_read_mmd(phydev, MDIO_MMD_PHYXS, MDIO_PHYXS_VEND_IF_STATUS); ++ if (val < 0) ++ return val; ++ ++ switch (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val)) { ++ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR: ++ phydev->interface = PHY_INTERFACE_MODE_10GKR; ++ break; ++ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI: ++ phydev->interface = PHY_INTERFACE_MODE_10GBASER; ++ break; ++ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII: ++ phydev->interface = PHY_INTERFACE_MODE_USXGMII; ++ break; ++ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII: ++ phydev->interface = PHY_INTERFACE_MODE_SGMII; ++ break; ++ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII: ++ phydev->interface = PHY_INTERFACE_MODE_2500BASEX; ++ break; ++ default: ++ phydev->interface = PHY_INTERFACE_MODE_NA; ++ break; ++ } ++ ++ /* Read downshifted rate from vendor register */ ++ return aqr107_read_rate(phydev); ++} ++ + static int aqr107_read_status(struct phy_device *phydev) + { + int val, ret; +@@ -511,7 +556,7 @@ static void aqr107_chip_info(struct phy_ + build_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID, val); + prov_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_PROV_ID, val); + +- phydev_dbg(phydev, "FW %u.%u, Build %u, Provisioning %u\n", ++ phydev_info(phydev, "FW %u.%u, Build %u, Provisioning %u\n", + fw_major, fw_minor, build_id, prov_id); + } + +@@ -719,6 +764,24 @@ static struct phy_driver aqr_driver[] = + .link_change_notify = aqr107_link_change_notify, + }, + { ++ PHY_ID_MATCH_MODEL(PHY_ID_AQR113C), ++ .name = "Aquantia AQR113C", ++ .probe = aqr107_probe, ++ .config_init = aqr107_config_init, ++ .config_aneg = aqr_config_aneg, ++ .config_intr = aqr_config_intr, ++ .handle_interrupt = aqr_handle_interrupt, ++ .read_status = aqr113c_read_status, ++ .get_tunable = aqr107_get_tunable, ++ .set_tunable = aqr107_set_tunable, ++ .suspend = aqr107_suspend, ++ .resume = aqr107_resume, ++ .get_sset_count = aqr107_get_sset_count, ++ .get_strings = aqr107_get_strings, ++ .get_stats = aqr107_get_stats, ++ .link_change_notify = aqr107_link_change_notify, ++}, ++{ + PHY_ID_MATCH_MODEL(PHY_ID_AQCS109), + .name = "Aquantia AQCS109", + .probe = aqr107_probe, +@@ -744,6 +807,24 @@ static struct phy_driver aqr_driver[] = + .handle_interrupt = aqr_handle_interrupt, + .read_status = aqr_read_status, + }, ++{ ++ PHY_ID_MATCH_MODEL(PHY_ID_AQR813), ++ .name = "Aquantia AQR813", ++ .probe = aqr107_probe, ++ .config_init = aqr107_config_init, ++ .config_aneg = aqr_config_aneg, ++ .config_intr = aqr_config_intr, ++ .handle_interrupt = aqr_handle_interrupt, ++ .read_status = aqr113c_read_status, ++ .get_tunable = aqr107_get_tunable, ++ .set_tunable = aqr107_set_tunable, ++ .suspend = aqr107_suspend, ++ .resume = aqr107_resume, ++ .get_sset_count = aqr107_get_sset_count, ++ .get_strings = aqr107_get_strings, ++ .get_stats = aqr107_get_stats, ++ .link_change_notify = aqr107_link_change_notify, ++}, + }; + + module_phy_driver(aqr_driver); +@@ -754,8 +835,10 @@ static struct mdio_device_id __maybe_unu + { PHY_ID_MATCH_MODEL(PHY_ID_AQR105) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR106) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR107) }, ++ { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR405) }, ++ { PHY_ID_MATCH_MODEL(PHY_ID_AQR813) }, + { } + }; + diff --git a/target/linux/generic/hack-5.15/721-net-add-packet-mangeling.patch b/target/linux/generic/hack-5.15/721-net-add-packet-mangeling.patch new file mode 100644 index 0000000000..ac9a161b5f --- /dev/null +++ b/target/linux/generic/hack-5.15/721-net-add-packet-mangeling.patch @@ -0,0 +1,178 @@ +From ffe387740bbe88dd88bbe04d6375902708003d6e Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Fri, 7 Jul 2017 17:25:00 +0200 +Subject: net: add packet mangeling + +ar8216 switches have a hardware bug, which renders normal 802.1q support +unusable. Packet mangling is required to fix up the vlan for incoming +packets. + +Signed-off-by: Felix Fietkau +--- + include/linux/netdevice.h | 11 +++++++++++ + include/linux/skbuff.h | 14 ++++---------- + net/Kconfig | 6 ++++++ + net/core/dev.c | 20 +++++++++++++++----- + net/core/skbuff.c | 17 +++++++++++++++++ + net/ethernet/eth.c | 6 ++++++ + 6 files changed, 59 insertions(+), 15 deletions(-) + +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -1681,6 +1681,10 @@ enum netdev_priv_flags { + IFF_TX_SKB_NO_LINEAR = BIT_ULL(31), + }; + ++enum netdev_extra_priv_flags { ++ IFF_NO_IP_ALIGN = 1<<0, ++}; ++ + #define IFF_802_1Q_VLAN IFF_802_1Q_VLAN + #define IFF_EBRIDGE IFF_EBRIDGE + #define IFF_BONDING IFF_BONDING +@@ -1712,6 +1716,7 @@ enum netdev_priv_flags { + #define IFF_FAILOVER_SLAVE IFF_FAILOVER_SLAVE + #define IFF_L3MDEV_RX_HANDLER IFF_L3MDEV_RX_HANDLER + #define IFF_TX_SKB_NO_LINEAR IFF_TX_SKB_NO_LINEAR ++#define IFF_NO_IP_ALIGN IFF_NO_IP_ALIGN + + /* Specifies the type of the struct net_device::ml_priv pointer */ + enum netdev_ml_priv_type { +@@ -2012,6 +2017,7 @@ struct net_device { + /* Read-mostly cache-line for fast-path access */ + unsigned int flags; + unsigned int priv_flags; ++ unsigned int extra_priv_flags; + const struct net_device_ops *netdev_ops; + int ifindex; + unsigned short gflags; +@@ -2072,6 +2078,11 @@ struct net_device { + const struct tlsdev_ops *tlsdev_ops; + #endif + ++#ifdef CONFIG_ETHERNET_PACKET_MANGLE ++ void (*eth_mangle_rx)(struct net_device *dev, struct sk_buff *skb); ++ struct sk_buff *(*eth_mangle_tx)(struct net_device *dev, struct sk_buff *skb); ++#endif ++ + const struct header_ops *header_ops; + + unsigned char operstate; +@@ -2143,6 +2154,10 @@ struct net_device { + struct mctp_dev __rcu *mctp_ptr; + #endif + ++#ifdef CONFIG_ETHERNET_PACKET_MANGLE ++ void *phy_ptr; /* PHY device specific data */ ++#endif ++ + /* + * Cache lines mostly used on receive path (including eth_type_trans()) + */ +--- a/include/linux/skbuff.h ++++ b/include/linux/skbuff.h +@@ -2855,6 +2855,10 @@ static inline int pskb_trim(struct sk_bu + return (len < skb->len) ? __pskb_trim(skb, len) : 0; + } + ++extern struct sk_buff *__netdev_alloc_skb_ip_align(struct net_device *dev, ++ unsigned int length, gfp_t gfp); ++ ++ + /** + * pskb_trim_unique - remove end from a paged unique (not cloned) buffer + * @skb: buffer to alter +@@ -3005,16 +3009,6 @@ static inline struct sk_buff *dev_alloc_ + } + + +-static inline struct sk_buff *__netdev_alloc_skb_ip_align(struct net_device *dev, +- unsigned int length, gfp_t gfp) +-{ +- struct sk_buff *skb = __netdev_alloc_skb(dev, length + NET_IP_ALIGN, gfp); +- +- if (NET_IP_ALIGN && skb) +- skb_reserve(skb, NET_IP_ALIGN); +- return skb; +-} +- + static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev, + unsigned int length) + { +--- a/net/Kconfig ++++ b/net/Kconfig +@@ -26,6 +26,12 @@ menuconfig NET + + if NET + ++config ETHERNET_PACKET_MANGLE ++ bool ++ help ++ This option can be selected by phy drivers that need to mangle ++ packets going in or out of an ethernet device. ++ + config WANT_COMPAT_NETLINK_MESSAGES + bool + help +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -3597,6 +3597,11 @@ static int xmit_one(struct sk_buff *skb, + if (dev_nit_active(dev)) + dev_queue_xmit_nit(skb, dev); + ++#ifdef CONFIG_ETHERNET_PACKET_MANGLE ++ if (dev->eth_mangle_tx && !(skb = dev->eth_mangle_tx(dev, skb))) ++ return NETDEV_TX_OK; ++#endif ++ + len = skb->len; + PRANDOM_ADD_NOISE(skb, dev, txq, len + jiffies); + trace_net_dev_start_xmit(skb, dev); +--- a/net/core/skbuff.c ++++ b/net/core/skbuff.c +@@ -61,6 +61,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -602,6 +603,22 @@ skb_fail: + } + EXPORT_SYMBOL(__napi_alloc_skb); + ++struct sk_buff *__netdev_alloc_skb_ip_align(struct net_device *dev, ++ unsigned int length, gfp_t gfp) ++{ ++ struct sk_buff *skb = __netdev_alloc_skb(dev, length + NET_IP_ALIGN, gfp); ++ ++#ifdef CONFIG_ETHERNET_PACKET_MANGLE ++ if (dev && (dev->extra_priv_flags & IFF_NO_IP_ALIGN)) ++ return skb; ++#endif ++ ++ if (NET_IP_ALIGN && skb) ++ skb_reserve(skb, NET_IP_ALIGN); ++ return skb; ++} ++EXPORT_SYMBOL(__netdev_alloc_skb_ip_align); ++ + void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off, + int size, unsigned int truesize) + { +--- a/net/ethernet/eth.c ++++ b/net/ethernet/eth.c +@@ -170,6 +170,12 @@ __be16 eth_type_trans(struct sk_buff *sk + const struct ethhdr *eth; + + skb->dev = dev; ++ ++#ifdef CONFIG_ETHERNET_PACKET_MANGLE ++ if (dev->eth_mangle_rx) ++ dev->eth_mangle_rx(dev, skb); ++#endif ++ + skb_reset_mac_header(skb); + + eth = (struct ethhdr *)skb->data; diff --git a/target/linux/generic/hack-5.15/722-net-phy-aquantia-enable-AQR112-and-AQR412.patch b/target/linux/generic/hack-5.15/722-net-phy-aquantia-enable-AQR112-and-AQR412.patch new file mode 100644 index 0000000000..211696c568 --- /dev/null +++ b/target/linux/generic/hack-5.15/722-net-phy-aquantia-enable-AQR112-and-AQR412.patch @@ -0,0 +1,154 @@ +From 5f62951fba63a9f9cfff564209426bdea5fcc371 Mon Sep 17 00:00:00 2001 +From: Alex Marginean +Date: Tue, 27 Aug 2019 15:16:56 +0300 +Subject: [PATCH] drivers: net: phy: aquantia: enable AQR112 and AQR412 + +Adds support for AQR112 and AQR412 which is mostly based on existing code +with the addition of code configuring the protocol on system side. +This allows changing the system side protocol without having to deploy a +different firmware on the PHY. + +Signed-off-by: Alex Marginean +--- + drivers/net/phy/aquantia_main.c | 88 +++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 88 insertions(+) + +--- a/drivers/net/phy/aquantia_main.c ++++ b/drivers/net/phy/aquantia_main.c +@@ -20,9 +20,11 @@ + #define PHY_ID_AQR105 0x03a1b4a2 + #define PHY_ID_AQR106 0x03a1b4d0 + #define PHY_ID_AQR107 0x03a1b4e0 ++#define PHY_ID_AQR112 0x03a1b662 + #define PHY_ID_AQR113C 0x31c31c12 + #define PHY_ID_AQCS109 0x03a1b5c2 + #define PHY_ID_AQR405 0x03a1b4b0 ++#define PHY_ID_AQR412 0x03a1b712 + #define PHY_ID_AQR813 0x31c31cb2 + + #define MDIO_PHYXS_VEND_IF_STATUS 0xe812 +@@ -135,6 +137,29 @@ + #define AQR107_OP_IN_PROG_SLEEP 1000 + #define AQR107_OP_IN_PROG_TIMEOUT 100000 + ++/* registers in MDIO_MMD_VEND1 region */ ++#define AQUANTIA_VND1_GLOBAL_SC 0x000 ++#define AQUANTIA_VND1_GLOBAL_SC_LP BIT(0xb) ++ ++/* global start rate, the protocol associated with this speed is used by default ++ * on SI. ++ */ ++#define AQUANTIA_VND1_GSTART_RATE 0x31a ++#define AQUANTIA_VND1_GSTART_RATE_OFF 0 ++#define AQUANTIA_VND1_GSTART_RATE_100M 1 ++#define AQUANTIA_VND1_GSTART_RATE_1G 2 ++#define AQUANTIA_VND1_GSTART_RATE_10G 3 ++#define AQUANTIA_VND1_GSTART_RATE_2_5G 4 ++#define AQUANTIA_VND1_GSTART_RATE_5G 5 ++ ++/* SYSCFG registers for 100M, 1G, 2.5G, 5G, 10G */ ++#define AQUANTIA_VND1_GSYSCFG_BASE 0x31b ++#define AQUANTIA_VND1_GSYSCFG_100M 0 ++#define AQUANTIA_VND1_GSYSCFG_1G 1 ++#define AQUANTIA_VND1_GSYSCFG_2_5G 2 ++#define AQUANTIA_VND1_GSYSCFG_5G 3 ++#define AQUANTIA_VND1_GSYSCFG_10G 4 ++ + struct aqr107_hw_stat { + const char *name; + int reg; +@@ -266,6 +291,51 @@ static int aqr_config_aneg(struct phy_de + return genphy_c45_check_and_restart_aneg(phydev, changed); + } + ++static struct { ++ u16 syscfg; ++ int cnt; ++ u16 start_rate; ++} aquantia_syscfg[PHY_INTERFACE_MODE_MAX] = { ++ [PHY_INTERFACE_MODE_SGMII] = {0x04b, AQUANTIA_VND1_GSYSCFG_1G, ++ AQUANTIA_VND1_GSTART_RATE_1G}, ++ [PHY_INTERFACE_MODE_2500BASEX] = {0x144, AQUANTIA_VND1_GSYSCFG_2_5G, ++ AQUANTIA_VND1_GSTART_RATE_2_5G}, ++ [PHY_INTERFACE_MODE_XGMII] = {0x100, AQUANTIA_VND1_GSYSCFG_10G, ++ AQUANTIA_VND1_GSTART_RATE_10G}, ++ [PHY_INTERFACE_MODE_USXGMII] = {0x080, AQUANTIA_VND1_GSYSCFG_10G, ++ AQUANTIA_VND1_GSTART_RATE_10G}, ++}; ++ ++/* Sets up protocol on system side before calling aqr_config_aneg */ ++static int aqr_config_aneg_set_prot(struct phy_device *phydev) ++{ ++ int if_type = phydev->interface; ++ int i; ++ ++ if (!aquantia_syscfg[if_type].cnt) ++ return 0; ++ ++ /* set PHY in low power mode so we can configure protocols */ ++ phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GLOBAL_SC, ++ AQUANTIA_VND1_GLOBAL_SC_LP); ++ mdelay(10); ++ ++ /* set the default rate to enable the SI link */ ++ phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GSTART_RATE, ++ aquantia_syscfg[if_type].start_rate); ++ ++ for (i = 0; i <= aquantia_syscfg[if_type].cnt; i++) ++ phy_write_mmd(phydev, MDIO_MMD_VEND1, ++ AQUANTIA_VND1_GSYSCFG_BASE + i, ++ aquantia_syscfg[if_type].syscfg); ++ ++ /* wake PHY back up */ ++ phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GLOBAL_SC, 0); ++ mdelay(10); ++ ++ return aqr_config_aneg(phydev); ++} ++ + static int aqr_config_intr(struct phy_device *phydev) + { + bool en = phydev->interrupts == PHY_INTERRUPT_ENABLED; +@@ -825,6 +895,30 @@ static struct phy_driver aqr_driver[] = + .get_stats = aqr107_get_stats, + .link_change_notify = aqr107_link_change_notify, + }, ++{ ++ PHY_ID_MATCH_MODEL(PHY_ID_AQR112), ++ .name = "Aquantia AQR112", ++ .probe = aqr107_probe, ++ .config_aneg = aqr_config_aneg_set_prot, ++ .config_intr = aqr_config_intr, ++ .handle_interrupt = aqr_handle_interrupt, ++ .read_status = aqr107_read_status, ++ .get_sset_count = aqr107_get_sset_count, ++ .get_strings = aqr107_get_strings, ++ .get_stats = aqr107_get_stats, ++}, ++{ ++ PHY_ID_MATCH_MODEL(PHY_ID_AQR412), ++ .name = "Aquantia AQR412", ++ .probe = aqr107_probe, ++ .config_aneg = aqr_config_aneg_set_prot, ++ .config_intr = aqr_config_intr, ++ .handle_interrupt = aqr_handle_interrupt, ++ .read_status = aqr107_read_status, ++ .get_sset_count = aqr107_get_sset_count, ++ .get_strings = aqr107_get_strings, ++ .get_stats = aqr107_get_stats, ++}, + }; + + module_phy_driver(aqr_driver); +@@ -835,9 +929,11 @@ static struct mdio_device_id __maybe_unu + { PHY_ID_MATCH_MODEL(PHY_ID_AQR105) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR106) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR107) }, ++ { PHY_ID_MATCH_MODEL(PHY_ID_AQR112) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR405) }, ++ { PHY_ID_MATCH_MODEL(PHY_ID_AQR412) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR813) }, + { } + }; diff --git a/target/linux/generic/hack-5.15/723-net-phy-aquantia-fix-system-side-protocol-mi.patch b/target/linux/generic/hack-5.15/723-net-phy-aquantia-fix-system-side-protocol-mi.patch new file mode 100644 index 0000000000..7d16c8aa28 --- /dev/null +++ b/target/linux/generic/hack-5.15/723-net-phy-aquantia-fix-system-side-protocol-mi.patch @@ -0,0 +1,34 @@ +From 5f008cb22f60da4e10375f22266c1a4e20b1252e Mon Sep 17 00:00:00 2001 +From: Alex Marginean +Date: Fri, 20 Sep 2019 18:22:52 +0300 +Subject: [PATCH] drivers: net: phy: aquantia: fix system side protocol + misconfiguration + +Do not set up protocols for speeds that are not supported by FW. Enabling +these protocols leads to link issues on system side. + +Signed-off-by: Alex Marginean +--- + drivers/net/phy/aquantia_main.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +--- a/drivers/net/phy/aquantia_main.c ++++ b/drivers/net/phy/aquantia_main.c +@@ -324,10 +324,16 @@ static int aqr_config_aneg_set_prot(stru + phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GSTART_RATE, + aquantia_syscfg[if_type].start_rate); + +- for (i = 0; i <= aquantia_syscfg[if_type].cnt; i++) ++ for (i = 0; i <= aquantia_syscfg[if_type].cnt; i++) { ++ u16 reg = phy_read_mmd(phydev, MDIO_MMD_VEND1, ++ AQUANTIA_VND1_GSYSCFG_BASE + i); ++ if (!reg) ++ continue; ++ + phy_write_mmd(phydev, MDIO_MMD_VEND1, + AQUANTIA_VND1_GSYSCFG_BASE + i, + aquantia_syscfg[if_type].syscfg); ++ } + + /* wake PHY back up */ + phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GLOBAL_SC, 0); diff --git a/target/linux/generic/hack-5.15/724-net-phy-aquantia-Add-AQR113-driver-support.patch b/target/linux/generic/hack-5.15/724-net-phy-aquantia-Add-AQR113-driver-support.patch new file mode 100644 index 0000000000..d03c3430fa --- /dev/null +++ b/target/linux/generic/hack-5.15/724-net-phy-aquantia-Add-AQR113-driver-support.patch @@ -0,0 +1,43 @@ +From 2e677e4ae8f8330f68013163b060d0fda3a43095 Mon Sep 17 00:00:00 2001 +From: "Langer, Thomas" +Date: Fri, 9 Jul 2021 17:36:46 +0200 +Subject: [PATCH] PONRTSYS-8842: aquantia: Add AQR113 driver support + +Add a new entry for AQR113 PHY_ID +--- + drivers/net/phy/aquantia_main.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/net/phy/aquantia_main.c ++++ b/drivers/net/phy/aquantia_main.c +@@ -21,6 +21,7 @@ + #define PHY_ID_AQR106 0x03a1b4d0 + #define PHY_ID_AQR107 0x03a1b4e0 + #define PHY_ID_AQR112 0x03a1b662 ++#define PHY_ID_AQR113 0x31c31c40 + #define PHY_ID_AQR113C 0x31c31c12 + #define PHY_ID_AQCS109 0x03a1b5c2 + #define PHY_ID_AQR405 0x03a1b4b0 +@@ -914,6 +915,14 @@ static struct phy_driver aqr_driver[] = + .get_stats = aqr107_get_stats, + }, + { ++ PHY_ID_MATCH_MODEL(PHY_ID_AQR113), ++ .name = "Aquantia AQR113", ++ .config_aneg = aqr_config_aneg, ++ .config_intr = aqr_config_intr, ++ .handle_interrupt = aqr_handle_interrupt, ++ .read_status = aqr107_read_status, ++}, ++{ + PHY_ID_MATCH_MODEL(PHY_ID_AQR412), + .name = "Aquantia AQR412", + .probe = aqr107_probe, +@@ -936,6 +945,7 @@ static struct mdio_device_id __maybe_unu + { PHY_ID_MATCH_MODEL(PHY_ID_AQR106) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR107) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR112) }, ++ { PHY_ID_MATCH_MODEL(PHY_ID_AQR113) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR405) }, diff --git a/target/linux/generic/hack-5.15/725-net-phy-aquantia-add-PHY_IDs-for-AQR112-variants.patch b/target/linux/generic/hack-5.15/725-net-phy-aquantia-add-PHY_IDs-for-AQR112-variants.patch new file mode 100644 index 0000000000..9821c0c86e --- /dev/null +++ b/target/linux/generic/hack-5.15/725-net-phy-aquantia-add-PHY_IDs-for-AQR112-variants.patch @@ -0,0 +1,63 @@ +From 3b92ee7b7899b6beffb2b484c58326e36612a873 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Thu, 23 Dec 2021 14:52:56 +0000 +Subject: [PATCH] net: phy: aquantia: add PHY_ID for AQR112R + +As advised by Ian Chang this PHY is used in Puzzle devices. + +Signed-off-by: Daniel Golle +--- + drivers/net/phy/aquantia_main.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/net/phy/aquantia_main.c ++++ b/drivers/net/phy/aquantia_main.c +@@ -21,6 +21,8 @@ + #define PHY_ID_AQR106 0x03a1b4d0 + #define PHY_ID_AQR107 0x03a1b4e0 + #define PHY_ID_AQR112 0x03a1b662 ++#define PHY_ID_AQR112C 0x03a1b790 ++#define PHY_ID_AQR112R 0x31c31d12 + #define PHY_ID_AQR113 0x31c31c40 + #define PHY_ID_AQR113C 0x31c31c12 + #define PHY_ID_AQCS109 0x03a1b5c2 +@@ -915,6 +917,30 @@ static struct phy_driver aqr_driver[] = + .get_stats = aqr107_get_stats, + }, + { ++ PHY_ID_MATCH_MODEL(PHY_ID_AQR112C), ++ .name = "Aquantia AQR112C", ++ .probe = aqr107_probe, ++ .config_aneg = aqr_config_aneg_set_prot, ++ .config_intr = aqr_config_intr, ++ .handle_interrupt = aqr_handle_interrupt, ++ .read_status = aqr107_read_status, ++ .get_sset_count = aqr107_get_sset_count, ++ .get_strings = aqr107_get_strings, ++ .get_stats = aqr107_get_stats, ++}, ++{ ++ PHY_ID_MATCH_MODEL(PHY_ID_AQR112R), ++ .name = "Aquantia AQR112R", ++ .probe = aqr107_probe, ++ .config_aneg = aqr_config_aneg_set_prot, ++ .config_intr = aqr_config_intr, ++ .handle_interrupt = aqr_handle_interrupt, ++ .read_status = aqr107_read_status, ++ .get_sset_count = aqr107_get_sset_count, ++ .get_strings = aqr107_get_strings, ++ .get_stats = aqr107_get_stats, ++}, ++{ + PHY_ID_MATCH_MODEL(PHY_ID_AQR113), + .name = "Aquantia AQR113", + .config_aneg = aqr_config_aneg, +@@ -945,6 +971,8 @@ static struct mdio_device_id __maybe_unu + { PHY_ID_MATCH_MODEL(PHY_ID_AQR106) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR107) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR112) }, ++ { PHY_ID_MATCH_MODEL(PHY_ID_AQR112C) }, ++ { PHY_ID_MATCH_MODEL(PHY_ID_AQR112R) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR113) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, + { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) }, diff --git a/target/linux/generic/hack-5.15/726-net-eth-dpaa2-eth-do-not-hold-rtnl_lock.patch b/target/linux/generic/hack-5.15/726-net-eth-dpaa2-eth-do-not-hold-rtnl_lock.patch new file mode 100644 index 0000000000..bff41aa2a4 --- /dev/null +++ b/target/linux/generic/hack-5.15/726-net-eth-dpaa2-eth-do-not-hold-rtnl_lock.patch @@ -0,0 +1,74 @@ +From d5af37ae22f0364be9ded773d737dd6e5b207b10 Mon Sep 17 00:00:00 2001 +From: Ioana Ciornei +Date: Thu, 21 Nov 2019 21:15:25 +0200 +Subject: [PATCH 3/4] dpaa2-eth: do not hold rtnl_lock on phylink_create() or + _destroy() + +The rtnl_lock should not be held when calling phylink_create() or +phylink_destroy() since it leads to the deadlock listed below: + +[ 18.656576] rtnl_lock+0x18/0x20 +[ 18.659798] sfp_bus_add_upstream+0x28/0x90 +[ 18.663974] phylink_create+0x2cc/0x828 +[ 18.667803] dpaa2_mac_connect+0x14c/0x2a8 +[ 18.671890] dpaa2_eth_connect_mac+0x94/0xd8 + +Fix this by moving the _lock() and _unlock() calls just outside of +phylink_of_phy_connect() and phylink_disconnect_phy(). + +Fixes: 719479230893 ("dpaa2-eth: add MAC/PHY support through phylink") +Reported-by: Russell King +Signed-off-by: Ioana Ciornei +Signed-off-by: Russell King +--- + drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 4 ---- + drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c | 4 ++++ + 2 files changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c ++++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +@@ -4215,12 +4215,10 @@ static irqreturn_t dpni_irq0_handler_thr + dpaa2_eth_set_mac_addr(netdev_priv(net_dev)); + dpaa2_eth_update_tx_fqids(priv); + +- rtnl_lock(); + if (dpaa2_eth_has_mac(priv)) + dpaa2_eth_disconnect_mac(priv); + else + dpaa2_eth_connect_mac(priv); +- rtnl_unlock(); + } + + return IRQ_HANDLED; +@@ -4516,9 +4514,7 @@ static int dpaa2_eth_remove(struct fsl_m + #endif + + unregister_netdev(net_dev); +- rtnl_lock(); + dpaa2_eth_disconnect_mac(priv); +- rtnl_unlock(); + + dpaa2_eth_dl_port_del(priv); + dpaa2_eth_dl_traps_unregister(priv); +--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c ++++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c +@@ -357,7 +357,9 @@ int dpaa2_mac_connect(struct dpaa2_mac * + if (mac->pcs) + phylink_set_pcs(mac->phylink, &mac->pcs->pcs); + ++ rtnl_lock(); + err = phylink_fwnode_phy_connect(mac->phylink, dpmac_node, 0); ++ rtnl_unlock(); + if (err) { + netdev_err(net_dev, "phylink_fwnode_phy_connect() = %d\n", err); + goto err_phylink_destroy; +@@ -378,7 +380,9 @@ void dpaa2_mac_disconnect(struct dpaa2_m + if (!mac->phylink) + return; + ++ rtnl_lock(); + phylink_disconnect_phy(mac->phylink); ++ rtnl_unlock(); + phylink_destroy(mac->phylink); + dpaa2_pcs_destroy(mac); + } diff --git a/target/linux/generic/hack-5.15/750-net-pcs-mtk-lynxi-workaround-2500BaseX-no-an.patch b/target/linux/generic/hack-5.15/750-net-pcs-mtk-lynxi-workaround-2500BaseX-no-an.patch new file mode 100644 index 0000000000..8b7f2f0955 --- /dev/null +++ b/target/linux/generic/hack-5.15/750-net-pcs-mtk-lynxi-workaround-2500BaseX-no-an.patch @@ -0,0 +1,53 @@ +From 880d1311335120f64447ca9d11933872d734e19a Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 27 Mar 2023 18:41:54 +0100 +Subject: [PATCH] generic: pcs-mtk-lynxi: add hack to use 2500Base-X without AN + +Using 2500Base-T SFP modules e.g. on the BananaPi R3 requires manually +disabling auto-negotiation, e.g. using ethtool. While a proper fix +using SFP quirks is being discussed upstream, bring a work-around to +restore user experience to what it was before the switch to the +dedicated SGMII PCS driver. + +Signed-off-by: Daniel Golle + +--- a/drivers/net/pcs/pcs-mtk-lynxi.c ++++ b/drivers/net/pcs/pcs-mtk-lynxi.c +@@ -92,14 +92,23 @@ static void mtk_pcs_lynxi_get_state(stru + struct phylink_link_state *state) + { + struct mtk_pcs_lynxi *mpcs = pcs_to_mtk_pcs_lynxi(pcs); +- unsigned int bm, adv; ++ unsigned int bm, bmsr, adv; + + /* Read the BMSR and LPA */ + regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &bm); +- regmap_read(mpcs->regmap, SGMSYS_PCS_ADVERTISE, &adv); ++ bmsr = FIELD_GET(SGMII_BMSR, bm); ++ ++ if (state->interface == PHY_INTERFACE_MODE_2500BASEX) { ++ state->link = !!(bmsr & BMSR_LSTATUS); ++ state->an_complete = !!(bmsr & BMSR_ANEGCOMPLETE); ++ state->speed = SPEED_2500; ++ state->duplex = DUPLEX_FULL; + +- phylink_mii_c22_pcs_decode_state(state, FIELD_GET(SGMII_BMSR, bm), +- FIELD_GET(SGMII_LPA, adv)); ++ return; ++ } ++ ++ regmap_read(mpcs->regmap, SGMSYS_PCS_ADVERTISE, &adv); ++ phylink_mii_c22_pcs_decode_state(state, bmsr, FIELD_GET(SGMII_LPA, adv)); + } + + static int mtk_pcs_lynxi_config(struct phylink_pcs *pcs, unsigned int mode, +@@ -134,7 +143,8 @@ static int mtk_pcs_lynxi_config(struct p + /* 1000base-X or 2500base-X autoneg */ + sgm_mode = SGMII_REMOTE_FAULT_DIS; + use_an = linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, +- advertising); ++ advertising) && ++ !(interface == PHY_INTERFACE_MODE_2500BASEX); + } else { + /* 1000base-X or 2500base-X without autoneg */ + sgm_mode = 0; diff --git a/target/linux/generic/hack-5.15/760-net-usb-r8152-add-LED-configuration-from-OF.patch b/target/linux/generic/hack-5.15/760-net-usb-r8152-add-LED-configuration-from-OF.patch new file mode 100644 index 0000000000..7442b7560f --- /dev/null +++ b/target/linux/generic/hack-5.15/760-net-usb-r8152-add-LED-configuration-from-OF.patch @@ -0,0 +1,74 @@ +From 82985725e071f2a5735052f18e109a32aeac3a0b Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Sun, 26 Jul 2020 02:38:31 +0200 +Subject: [PATCH] net: usb: r8152: add LED configuration from OF + +This adds the ability to configure the LED configuration register using +OF. This way, the correct value for board specific LED configuration can +be determined. + +Signed-off-by: David Bauer +--- + drivers/net/usb/r8152.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -6910,6 +6911,22 @@ static void rtl_tally_reset(struct r8152 + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data); + } + ++static int r8152_led_configuration(struct r8152 *tp) ++{ ++ u32 led_data; ++ int ret; ++ ++ ret = of_property_read_u32(tp->udev->dev.of_node, "realtek,led-data", ++ &led_data); ++ ++ if (ret) ++ return ret; ++ ++ ocp_write_word(tp, MCU_TYPE_PLA, PLA_LEDSEL, led_data); ++ ++ return 0; ++} ++ + static void r8152b_init(struct r8152 *tp) + { + u32 ocp_data; +@@ -6951,6 +6968,8 @@ static void r8152b_init(struct r8152 *tp + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); + ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN); + ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); ++ ++ r8152_led_configuration(tp); + } + + static void r8153_init(struct r8152 *tp) +@@ -7091,6 +7110,8 @@ static void r8153_init(struct r8152 *tp) + tp->coalesce = COALESCE_SLOW; + break; + } ++ ++ r8152_led_configuration(tp); + } + + static void r8153b_init(struct r8152 *tp) +@@ -7173,6 +7194,8 @@ static void r8153b_init(struct r8152 *tp + rtl_tally_reset(tp); + + tp->coalesce = 15000; /* 15 us */ ++ ++ r8152_led_configuration(tp); + } + + static void r8153c_init(struct r8152 *tp) diff --git a/target/linux/generic/hack-5.10/761-dt-bindings-net-add-RTL8152-binding-documentation.patch b/target/linux/generic/hack-5.15/761-dt-bindings-net-add-RTL8152-binding-documentation.patch similarity index 100% rename from target/linux/generic/hack-5.10/761-dt-bindings-net-add-RTL8152-binding-documentation.patch rename to target/linux/generic/hack-5.15/761-dt-bindings-net-add-RTL8152-binding-documentation.patch diff --git a/target/linux/generic/hack-5.15/765-mxl-gpy-control-LED-reg-from-DT.patch b/target/linux/generic/hack-5.15/765-mxl-gpy-control-LED-reg-from-DT.patch new file mode 100644 index 0000000000..8de3668def --- /dev/null +++ b/target/linux/generic/hack-5.15/765-mxl-gpy-control-LED-reg-from-DT.patch @@ -0,0 +1,101 @@ +From 94b90966095f3fa625897e8f53d215882f6e19b3 Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Sat, 11 Mar 2023 17:00:01 +0100 +Subject: [PATCH] mxl-gpy: control LED reg from DT + +Add dynamic configuration for the LED control registers on MXL PHYs. + +This patch has been tested with MaxLinear GPY211C. It is unlikely to be +accepted upstream, as upstream plans on integrating their own framework +for handling these LEDs. + +For the time being, use this hack to configure PHY driven device-LEDs to +show the correct state. + +A possible alternative might be to expose the LEDs using the kernel LED +framework and bind it to the netdevice. This might also be upstreamable, +although it is a considerable extra amount of work. + +Signed-off-by: David Bauer +--- + drivers/net/phy/mxl-gpy.c | 37 ++++++++++++++++++++++++++++++++++++- + 1 file changed, 36 insertions(+), 1 deletion(-) + +--- a/drivers/net/phy/mxl-gpy.c ++++ b/drivers/net/phy/mxl-gpy.c +@@ -8,6 +8,7 @@ + + #include + #include ++#include + #include + #include + +@@ -30,6 +31,7 @@ + #define PHY_MIISTAT 0x18 /* MII state */ + #define PHY_IMASK 0x19 /* interrupt mask */ + #define PHY_ISTAT 0x1A /* interrupt status */ ++#define PHY_LED 0x1B /* LED control */ + #define PHY_FWV 0x1E /* firmware version */ + + #define PHY_MIISTAT_SPD_MASK GENMASK(2, 0) +@@ -53,10 +55,15 @@ + PHY_IMASK_ADSC | \ + PHY_IMASK_ANC) + ++#define PHY_LED_NUM_LEDS 4 ++ + #define PHY_FWV_REL_MASK BIT(15) + #define PHY_FWV_TYPE_MASK GENMASK(11, 8) + #define PHY_FWV_MINOR_MASK GENMASK(7, 0) + ++/* LED */ ++#define VSPEC1_LED(x) (0x1 + x) ++ + /* SGMII */ + #define VSPEC1_SGMII_CTRL 0x08 + #define VSPEC1_SGMII_CTRL_ANEN BIT(12) /* Aneg enable */ +@@ -80,6 +87,31 @@ static const struct { + {9, 0x73}, + }; + ++static int gpy_led_write(struct phy_device *phydev) ++{ ++ struct device_node *node = phydev->mdio.dev.of_node; ++ u32 led_regs[PHY_LED_NUM_LEDS]; ++ int i, ret; ++ ++ if (!IS_ENABLED(CONFIG_OF_MDIO)) ++ return 0; ++ ++ if (of_property_read_u32_array(node, "mxl,led-config", led_regs, PHY_LED_NUM_LEDS)) ++ return 0; ++ ++ /* Enable LED function handling on all ports*/ ++ phy_write(phydev, PHY_LED, 0xFF00); ++ ++ /* Write LED register values */ ++ for (i = 0; i < PHY_LED_NUM_LEDS; i++) { ++ ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_LED(i), (u16)led_regs[i]); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ + static int gpy_config_init(struct phy_device *phydev) + { + int ret; +@@ -91,7 +123,10 @@ static int gpy_config_init(struct phy_de + + /* Clear all pending interrupts */ + ret = phy_read(phydev, PHY_ISTAT); +- return ret < 0 ? ret : 0; ++ if (ret < 0) ++ return ret; ++ ++ return gpy_led_write(phydev); + } + + static int gpy_probe(struct phy_device *phydev) diff --git a/target/linux/generic/hack-5.15/766-net-phy-mediatek-ge-add-LED-configuration-interface.patch b/target/linux/generic/hack-5.15/766-net-phy-mediatek-ge-add-LED-configuration-interface.patch new file mode 100644 index 0000000000..50738953ae --- /dev/null +++ b/target/linux/generic/hack-5.15/766-net-phy-mediatek-ge-add-LED-configuration-interface.patch @@ -0,0 +1,72 @@ +From cc225d163b5a4f7a0d1968298bf7927306646a47 Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Fri, 28 Apr 2023 01:53:01 +0200 +Subject: [PATCH] net: phy: mediatek-ge: add LED configuration interface + +This adds a small hack similar to the one used for ar8xxx switches to +read a reg:value map for configuring the LED configuration registers. + +This allows libreCMC to write device-specific LED action as well as blink +configurations. It is unlikely to be accepted upstream, as upstream +plans on integrating their own framework for handling these LEDs. + +Signed-off-by: David Bauer +--- + drivers/net/phy/mediatek-ge.c | 33 +++++++++++++++++++++++++++++++++ + 1 file changed, 33 insertions(+) + +--- a/drivers/net/phy/mediatek-ge.c ++++ b/drivers/net/phy/mediatek-ge.c +@@ -1,4 +1,5 @@ + // SPDX-License-Identifier: GPL-2.0+ ++#include + #include + #include + #include +@@ -53,6 +54,36 @@ static int mt7530_phy_config_init(struct + return 0; + } + ++static int mt7530_led_config_of(struct phy_device *phydev) ++{ ++ struct device_node *np = phydev->mdio.dev.of_node; ++ const __be32 *paddr; ++ int len; ++ int i; ++ ++ paddr = of_get_property(np, "mediatek,led-config", &len); ++ if (!paddr) ++ return 0; ++ ++ if (len < (2 * sizeof(*paddr))) ++ return -EINVAL; ++ ++ len /= sizeof(*paddr); ++ ++ phydev_warn(phydev, "Configure LED registers (num=%d)\n", len); ++ for (i = 0; i < len - 1; i += 2) { ++ u32 reg; ++ u32 val; ++ ++ reg = be32_to_cpup(paddr + i); ++ val = be32_to_cpup(paddr + i + 1); ++ ++ phy_write_mmd(phydev, MDIO_MMD_VEND2, reg, val); ++ } ++ ++ return 0; ++} ++ + static int mt7531_phy_config_init(struct phy_device *phydev) + { + mtk_gephy_config_init(phydev); +@@ -65,6 +96,9 @@ static int mt7531_phy_config_init(struct + phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x13, 0x404); + phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x14, 0x404); + ++ /* LED Config*/ ++ mt7530_led_config_of(phydev); ++ + return 0; + } + diff --git a/target/linux/generic/hack-5.15/773-bgmac-add-srab-switch.patch b/target/linux/generic/hack-5.15/773-bgmac-add-srab-switch.patch new file mode 100644 index 0000000000..7127aa136c --- /dev/null +++ b/target/linux/generic/hack-5.15/773-bgmac-add-srab-switch.patch @@ -0,0 +1,98 @@ +From 3cb240533ab787899dc7f17aa7d6c5b4810e2e58 Mon Sep 17 00:00:00 2001 +From: Hauke Mehrtens +Date: Fri, 7 Jul 2017 17:26:01 +0200 +Subject: bcm53xx: bgmac: use srab switch driver + +use the srab switch driver on these SoCs. + +Signed-off-by: Hauke Mehrtens +--- + drivers/net/ethernet/broadcom/bgmac-bcma.c | 1 + + drivers/net/ethernet/broadcom/bgmac.c | 24 ++++++++++++++++++++++++ + drivers/net/ethernet/broadcom/bgmac.h | 4 ++++ + 3 files changed, 29 insertions(+) + +--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c ++++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c +@@ -280,6 +280,7 @@ static int bgmac_probe(struct bcma_devic + bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST; + bgmac->feature_flags |= BGMAC_FEAT_NO_RESET; + bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500; ++ bgmac->feature_flags |= BGMAC_FEAT_SRAB; + break; + default: + bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST; +--- a/drivers/net/ethernet/broadcom/bgmac.c ++++ b/drivers/net/ethernet/broadcom/bgmac.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1408,6 +1409,17 @@ static const struct ethtool_ops bgmac_et + .set_link_ksettings = phy_ethtool_set_link_ksettings, + }; + ++static struct b53_platform_data bgmac_b53_pdata = { ++}; ++ ++static struct platform_device bgmac_b53_dev = { ++ .name = "b53-srab-switch", ++ .id = -1, ++ .dev = { ++ .platform_data = &bgmac_b53_pdata, ++ }, ++}; ++ + /************************************************** + * MII + **************************************************/ +@@ -1546,6 +1558,14 @@ int bgmac_enet_probe(struct bgmac *bgmac + + bgmac->in_init = false; + ++ if ((bgmac->feature_flags & BGMAC_FEAT_SRAB) && !bgmac_b53_pdata.regs) { ++ bgmac_b53_pdata.regs = ioremap(0x18007000, 0x1000); ++ ++ err = platform_device_register(&bgmac_b53_dev); ++ if (!err) ++ bgmac->b53_device = &bgmac_b53_dev; ++ } ++ + err = register_netdev(bgmac->net_dev); + if (err) { + dev_err(bgmac->dev, "Cannot register net device\n"); +@@ -1568,6 +1588,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe); + + void bgmac_enet_remove(struct bgmac *bgmac) + { ++ if (bgmac->b53_device) ++ platform_device_unregister(&bgmac_b53_dev); ++ bgmac->b53_device = NULL; ++ + unregister_netdev(bgmac->net_dev); + phy_disconnect(bgmac->net_dev->phydev); + netif_napi_del(&bgmac->napi); +--- a/drivers/net/ethernet/broadcom/bgmac.h ++++ b/drivers/net/ethernet/broadcom/bgmac.h +@@ -390,6 +390,7 @@ + #define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII BIT(18) + #define BGMAC_FEAT_CC7_IF_TYPE_RGMII BIT(19) + #define BGMAC_FEAT_IDM_MASK BIT(20) ++#define BGMAC_FEAT_SRAB BIT(21) + + struct bgmac_slot_info { + union { +@@ -497,6 +498,9 @@ struct bgmac { + void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask, + u32 set); + int (*phy_connect)(struct bgmac *bgmac); ++ ++ /* platform device for associated switch */ ++ struct platform_device *b53_device; + }; + + struct bgmac *bgmac_alloc(struct device *dev); diff --git a/target/linux/generic/hack-5.15/780-usb-net-MeigLink_modem_support.patch b/target/linux/generic/hack-5.15/780-usb-net-MeigLink_modem_support.patch new file mode 100644 index 0000000000..bb2a409ca4 --- /dev/null +++ b/target/linux/generic/hack-5.15/780-usb-net-MeigLink_modem_support.patch @@ -0,0 +1,69 @@ +From f81700b6bb2eda3756247bce472d8eaf6f466f61 Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 13:49:26 +0200 +Subject: [PATCH] net/usb/qmi_wwan: add MeigLink modem support + +--- + drivers/net/usb/qmi_wwan.c | 1 + + drivers/usb/serial/option.c | 7 +++++++ + 2 files changed, 8 insertions(+) + +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -1080,12 +1080,18 @@ static const struct usb_device_id produc + USB_DEVICE_AND_INTERFACE_INFO(0x03f0, 0x581d, USB_CLASS_VENDOR_SPEC, 1, 7), + .driver_info = (unsigned long)&qmi_wwan_info, + }, ++ { /* Meiglink SGM828 */ ++ USB_DEVICE_AND_INTERFACE_INFO(0x2dee, 0x4d49, USB_CLASS_VENDOR_SPEC, 0x10, 0x05), ++ .driver_info = (unsigned long)&qmi_wwan_info, ++ }, ++ + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */ + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0620)}, /* Quectel EM160R-GL */ + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0801)}, /* Quectel RM520N */ ++ {QMI_MATCH_FF_FF_FF(0x05c6, 0xf601)}, /* MeigLink SLM750 */ + + /* 3. Combined interface devices matching on interface number */ + {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -247,6 +247,11 @@ static void option_instat_callback(struc + #define UBLOX_PRODUCT_R410M 0x90b2 + /* These Yuga products use Qualcomm's vendor ID */ + #define YUGA_PRODUCT_CLM920_NC5 0x9625 ++/* These MeigLink products use Qualcomm's vendor ID */ ++#define MEIGLINK_PRODUCT_SLM750 0xf601 ++ ++#define MEIGLINK_VENDOR_ID 0x2dee ++#define MEIGLINK_PRODUCT_SLM828 0x4d49 + + #define QUECTEL_VENDOR_ID 0x2c7c + /* These Quectel products use Quectel's vendor ID */ +@@ -1146,6 +1151,11 @@ static const struct usb_device_id option + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000), /* SIMCom SIM5218 */ + .driver_info = NCTRL(0) | NCTRL(1) | NCTRL(2) | NCTRL(3) | RSVD(4) }, ++ /* MeiG */ ++ { USB_DEVICE_AND_INTERFACE_INFO(MEIGLINK_VENDOR_ID, MEIGLINK_PRODUCT_SLM828, USB_CLASS_VENDOR_SPEC, 0x10, 0x01) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(MEIGLINK_VENDOR_ID, MEIGLINK_PRODUCT_SLM828, USB_CLASS_VENDOR_SPEC, 0x10, 0x02) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(MEIGLINK_VENDOR_ID, MEIGLINK_PRODUCT_SLM828, USB_CLASS_VENDOR_SPEC, 0x10, 0x03) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(MEIGLINK_VENDOR_ID, MEIGLINK_PRODUCT_SLM828, USB_CLASS_VENDOR_SPEC, 0x10, 0x04) }, + /* Quectel products using Qualcomm vendor ID */ + { USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC15)}, + { USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC20), +@@ -1187,6 +1197,11 @@ static const struct usb_device_id option + .driver_info = ZLP }, + { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96), + .driver_info = RSVD(4) }, ++ /* Meiglink products using Qualcomm vendor ID */ ++ // Works OK. In case of some issues check macros that are used by Quectel Products ++ { USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, MEIGLINK_PRODUCT_SLM750, 0xff, 0xff, 0xff), ++ .driver_info = NUMEP2 }, ++ { USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, MEIGLINK_PRODUCT_SLM750, 0xff, 0, 0) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff), + .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0, 0) }, diff --git a/target/linux/generic/hack-5.15/781-usb-net-rndis-support-asr.patch b/target/linux/generic/hack-5.15/781-usb-net-rndis-support-asr.patch new file mode 100644 index 0000000000..9934bb8078 --- /dev/null +++ b/target/linux/generic/hack-5.15/781-usb-net-rndis-support-asr.patch @@ -0,0 +1,56 @@ +--- a/drivers/net/usb/rndis_host.c ++++ b/drivers/net/usb/rndis_host.c +@@ -630,6 +630,16 @@ static const struct driver_info zte_rndi + .tx_fixup = rndis_tx_fixup, + }; + ++static const struct driver_info asr_rndis_info = { ++ .description = "Asr RNDIS device", ++ .flags = FLAG_WWAN | FLAG_POINTTOPOINT | FLAG_FRAMING_RN | FLAG_NO_SETINT | FLAG_NOARP, ++ .bind = rndis_bind, ++ .unbind = rndis_unbind, ++ .status = rndis_status, ++ .rx_fixup = rndis_rx_fixup, ++ .tx_fixup = rndis_tx_fixup, ++}; ++ + /*-------------------------------------------------------------------------*/ + + static const struct usb_device_id products [] = { +@@ -666,6 +676,36 @@ static const struct usb_device_id produc + USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3), + .driver_info = (unsigned long) &rndis_info, + }, { ++ /* Quectel EG060V rndis device */ ++ USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x6004, ++ USB_CLASS_WIRELESS_CONTROLLER, 1, 3), ++ .driver_info = (unsigned long) &asr_rndis_info, ++}, { ++ /* Quectel EC200A rndis device */ ++ USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x6005, ++ USB_CLASS_WIRELESS_CONTROLLER, 1, 3), ++ .driver_info = (unsigned long) &asr_rndis_info, ++}, { ++ /* Quectel EC200T rndis device */ ++ USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x6026, ++ USB_CLASS_WIRELESS_CONTROLLER, 1, 3), ++ .driver_info = (unsigned long) &asr_rndis_info, ++}, { ++ /* Simcom A7906E rndis device */ ++ USB_DEVICE_AND_INTERFACE_INFO(0x1e0e, 0x9011, ++ USB_CLASS_WIRELESS_CONTROLLER, 1, 3), ++ .driver_info = (unsigned long) &asr_rndis_info, ++}, { ++ /* Meig SLM770A */ ++ USB_DEVICE_AND_INTERFACE_INFO(0x2dee, 0x4d57, ++ USB_CLASS_WIRELESS_CONTROLLER, 1, 3), ++ .driver_info = (unsigned long) &asr_rndis_info, ++}, { ++ /* Meig SLM828 */ ++ USB_DEVICE_AND_INTERFACE_INFO(0x2dee, 0x4d49, ++ USB_CLASS_WIRELESS_CONTROLLER, 1, 3), ++ .driver_info = (unsigned long) &asr_rndis_info, ++}, { + /* Novatel Verizon USB730L */ + USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1), + .driver_info = (unsigned long) &rndis_info, diff --git a/target/linux/generic/hack-5.15/790-SFP-GE-T-ignore-TX_FAULT.patch b/target/linux/generic/hack-5.15/790-SFP-GE-T-ignore-TX_FAULT.patch new file mode 100644 index 0000000000..e7372b31d1 --- /dev/null +++ b/target/linux/generic/hack-5.15/790-SFP-GE-T-ignore-TX_FAULT.patch @@ -0,0 +1,65 @@ +From 7cc39a6bedbd85f3ff7e16845f310e4ce8d9833f Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 6 Sep 2022 00:31:19 +0100 +Subject: [PATCH] net: sfp: add quirk for ATS SFP-GE-T 1000Base-TX module +To: netdev@vger.kernel.org, + linux-kernel@vger.kernel.org, + Russell King , + Andrew Lunn , + Heiner Kallweit +Cc: David S. Miller , + Eric Dumazet , + Jakub Kicinski , + Paolo Abeni , + Josef Schlehofer + +This copper module comes with broken TX_FAULT indicator which must be +ignored for it to work. Implement ignoring TX_FAULT state bit also +during reset/insertion and mute the warning telling the user that the +module indicates TX_FAULT. + +Co-authored-by: Josef Schlehofer +Signed-off-by: Daniel Golle +--- + drivers/net/phy/sfp.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -390,6 +390,11 @@ static const struct sfp_quirk sfp_quirks + .modes = sfp_quirk_2500basex, + .fixup = sfp_fixup_ignore_tx_fault, + }, { ++ // OEM SFP-GE-T is 1000Base-T module ++ .vendor = "OEM", ++ .part = "SFP-GE-T", ++ .fixup = sfp_fixup_ignore_tx_fault, ++ }, { + // Lantech 8330-262D-E can operate at 2500base-X, but + // incorrectly report 2500MBd NRZ in their EEPROM + .vendor = "Lantech", +@@ -2319,7 +2324,8 @@ static void sfp_sm_main(struct sfp *sfp, + * or t_start_up, so assume there is a fault. + */ + sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT, +- sfp->sm_fault_retries == N_FAULT_INIT); ++ !sfp->tx_fault_ignore && ++ (sfp->sm_fault_retries == N_FAULT_INIT)); + } else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) { + init_done: + sfp->sm_phy_retries = R_PHY_RETRY; +@@ -2542,10 +2548,12 @@ static void sfp_check_state(struct sfp * + mutex_lock(&sfp->st_mutex); + state = sfp_get_state(sfp); + changed = state ^ sfp->state; +- if (sfp->tx_fault_ignore) ++ if (sfp->tx_fault_ignore) { + changed &= SFP_F_PRESENT | SFP_F_LOS; +- else ++ state &= ~SFP_F_TX_FAULT; ++ } else { + changed &= SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT; ++ } + + for (i = 0; i < GPIO_MAX; i++) + if (changed & BIT(i)) diff --git a/target/linux/generic/hack-5.15/795-backport-phylink_pcs-helpers.patch b/target/linux/generic/hack-5.15/795-backport-phylink_pcs-helpers.patch new file mode 100644 index 0000000000..a463bf7c4e --- /dev/null +++ b/target/linux/generic/hack-5.15/795-backport-phylink_pcs-helpers.patch @@ -0,0 +1,167 @@ +From 027586ae8ecacff49757ed854c020f35d24a599c Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sat, 11 Mar 2023 03:44:41 +0000 +Subject: [PATCH] generic: backport some phylink helper functions + +It isn't feasible to literally backport all upstream phylink_pcs changes +down to Linux 5.15: It's just too many patches, and many downstream +drivers and hacks are likely to break. We are too close to branching off +to risk this, and it's also just too much work. +Instead just add helper functions used by modern PCS drivers while keeping +the original functions instact as well. While this may add a kilobyte or +two of extra kernel size, it has the advantage that we get the best of both +worlds: None of the existing codepaths are touched, but yet we have the +option to backport singular improvements to Ethernet drivers where needed. + +Signed-off-by: Daniel Golle + +--- a/include/linux/phylink.h ++++ b/include/linux/phylink.h +@@ -600,10 +600,37 @@ int phylink_speed_up(struct phylink *pl) + #define phylink_test(bm, mode) __phylink_do_bit(test_bit, bm, mode) + + void phylink_set_port_modes(unsigned long *bits); ++ ++/** ++ * phylink_get_link_timer_ns - return the PCS link timer value ++ * @interface: link &typedef phy_interface_t mode ++ * ++ * Return the PCS link timer setting in nanoseconds for the PHY @interface ++ * mode, or -EINVAL if not appropriate. ++ */ ++static inline int phylink_get_link_timer_ns(phy_interface_t interface) ++{ ++ switch (interface) { ++ case PHY_INTERFACE_MODE_SGMII: ++ return 1600000; ++ ++ case PHY_INTERFACE_MODE_1000BASEX: ++ case PHY_INTERFACE_MODE_2500BASEX: ++ return 10000000; ++ ++ default: ++ return -EINVAL; ++ } ++} ++ + void phylink_helper_basex_speed(struct phylink_link_state *state); + ++void phylink_mii_c22_pcs_decode_state(struct phylink_link_state *state, ++ u16 bmsr, u16 lpa); + void phylink_mii_c22_pcs_get_state(struct mdio_device *pcs, + struct phylink_link_state *state); ++int phylink_mii_c22_pcs_encode_advertisement(phy_interface_t interface, ++ const unsigned long *advertising); + int phylink_mii_c22_pcs_set_advertisement(struct mdio_device *pcs, + phy_interface_t interface, + const unsigned long *advertising); +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -931,7 +931,6 @@ static int phylink_change_inband_advert( + + return 0; + } +- + static void phylink_mac_pcs_get_state(struct phylink *pl, + struct phylink_link_state *state) + { +@@ -3015,6 +3014,52 @@ void phylink_mii_c22_pcs_get_state(struc + EXPORT_SYMBOL_GPL(phylink_mii_c22_pcs_get_state); + + /** ++ * phylink_mii_c22_pcs_decode_state() - Decode MAC PCS state from MII registers ++ * @state: a pointer to a &struct phylink_link_state. ++ * @bmsr: The value of the %MII_BMSR register ++ * @lpa: The value of the %MII_LPA register ++ * ++ * Helper for MAC PCS supporting the 802.3 clause 22 register set for ++ * clause 37 negotiation and/or SGMII control. ++ * ++ * Parse the Clause 37 or Cisco SGMII link partner negotiation word into ++ * the phylink @state structure. This is suitable to be used for implementing ++ * the mac_pcs_get_state() member of the struct phylink_mac_ops structure if ++ * accessing @bmsr and @lpa cannot be done with MDIO directly. ++ */ ++void phylink_mii_c22_pcs_decode_state(struct phylink_link_state *state, ++ u16 bmsr, u16 lpa) ++{ ++ state->link = !!(bmsr & BMSR_LSTATUS); ++ state->an_complete = !!(bmsr & BMSR_ANEGCOMPLETE); ++ /* If there is no link or autonegotiation is disabled, the LP advertisement ++ * data is not meaningful, so don't go any further. ++ */ ++ if (!state->link || !state->an_enabled) ++ return; ++ ++ switch (state->interface) { ++ case PHY_INTERFACE_MODE_1000BASEX: ++ phylink_decode_c37_word(state, lpa, SPEED_1000); ++ break; ++ ++ case PHY_INTERFACE_MODE_2500BASEX: ++ phylink_decode_c37_word(state, lpa, SPEED_2500); ++ break; ++ ++ case PHY_INTERFACE_MODE_SGMII: ++ case PHY_INTERFACE_MODE_QSGMII: ++ phylink_decode_sgmii_word(state, lpa); ++ break; ++ ++ default: ++ state->link = false; ++ break; ++ } ++} ++EXPORT_SYMBOL_GPL(phylink_mii_c22_pcs_decode_state); ++ ++/** + * phylink_mii_c22_pcs_set_advertisement() - configure the clause 37 PCS + * advertisement + * @pcs: a pointer to a &struct mdio_device. +@@ -3086,6 +3131,46 @@ int phylink_mii_c22_pcs_set_advertisemen + EXPORT_SYMBOL_GPL(phylink_mii_c22_pcs_set_advertisement); + + /** ++ * phylink_mii_c22_pcs_encode_advertisement() - configure the clause 37 PCS ++ * advertisement ++ * @interface: the PHY interface mode being configured ++ * @advertising: the ethtool advertisement mask ++ * ++ * Helper for MAC PCS supporting the 802.3 clause 22 register set for ++ * clause 37 negotiation and/or SGMII control. ++ * ++ * Encode the clause 37 PCS advertisement as specified by @interface and ++ * @advertising. ++ * ++ * Return: The new value for @adv, or ``-EINVAL`` if it should not be changed. ++ */ ++int phylink_mii_c22_pcs_encode_advertisement(phy_interface_t interface, ++ const unsigned long *advertising) ++{ ++ u16 adv; ++ ++ switch (interface) { ++ case PHY_INTERFACE_MODE_1000BASEX: ++ case PHY_INTERFACE_MODE_2500BASEX: ++ adv = ADVERTISE_1000XFULL; ++ if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, ++ advertising)) ++ adv |= ADVERTISE_1000XPAUSE; ++ if (linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, ++ advertising)) ++ adv |= ADVERTISE_1000XPSE_ASYM; ++ return adv; ++ case PHY_INTERFACE_MODE_SGMII: ++ case PHY_INTERFACE_MODE_QSGMII: ++ return 0x0001; ++ default: ++ /* Nothing to do for other modes */ ++ return -EINVAL; ++ } ++} ++EXPORT_SYMBOL_GPL(phylink_mii_c22_pcs_encode_advertisement); ++ ++/** + * phylink_mii_c22_pcs_config() - configure clause 22 PCS + * @pcs: a pointer to a &struct mdio_device. + * @mode: link autonegotiation mode diff --git a/target/linux/generic/hack-5.15/800-GPIO-add-named-gpio-exports.patch b/target/linux/generic/hack-5.15/800-GPIO-add-named-gpio-exports.patch new file mode 100644 index 0000000000..00ce48c384 --- /dev/null +++ b/target/linux/generic/hack-5.15/800-GPIO-add-named-gpio-exports.patch @@ -0,0 +1,162 @@ +From cc809a441d8f2924f785eb863dfa6aef47a25b0b Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Tue, 12 Aug 2014 20:49:27 +0200 +Subject: [PATCH 30/36] GPIO: add named gpio exports + +Signed-off-by: John Crispin +--- a/drivers/gpio/gpiolib-of.c ++++ b/drivers/gpio/gpiolib-of.c +@@ -19,6 +19,8 @@ + #include + #include + #include ++#include ++#include + + #include "gpiolib.h" + #include "gpiolib-of.h" +@@ -1059,3 +1061,72 @@ void of_gpio_dev_init(struct gpio_chip * + else + gc->of_node = gdev->dev.of_node; + } ++ ++#ifdef CONFIG_GPIO_SYSFS ++ ++static struct of_device_id gpio_export_ids[] = { ++ { .compatible = "gpio-export" }, ++ { /* sentinel */ } ++}; ++ ++static int of_gpio_export_probe(struct platform_device *pdev) ++{ ++ struct device_node *np = pdev->dev.of_node; ++ struct device_node *cnp; ++ u32 val; ++ int nb = 0; ++ ++ for_each_child_of_node(np, cnp) { ++ const char *name = NULL; ++ int gpio; ++ bool dmc; ++ int max_gpio = 1; ++ int i; ++ ++ of_property_read_string(cnp, "gpio-export,name", &name); ++ ++ if (!name) ++ max_gpio = of_gpio_count(cnp); ++ ++ for (i = 0; i < max_gpio; i++) { ++ unsigned flags = 0; ++ enum of_gpio_flags of_flags; ++ ++ gpio = of_get_gpio_flags(cnp, i, &of_flags); ++ if (!gpio_is_valid(gpio)) ++ return gpio; ++ ++ if (of_flags == OF_GPIO_ACTIVE_LOW) ++ flags |= GPIOF_ACTIVE_LOW; ++ ++ if (!of_property_read_u32(cnp, "gpio-export,output", &val)) ++ flags |= val ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; ++ else ++ flags |= GPIOF_IN; ++ ++ if (devm_gpio_request_one(&pdev->dev, gpio, flags, name ? name : of_node_full_name(np))) ++ continue; ++ ++ dmc = of_property_read_bool(cnp, "gpio-export,direction_may_change"); ++ gpio_export_with_name(gpio, dmc, name); ++ nb++; ++ } ++ } ++ ++ dev_info(&pdev->dev, "%d gpio(s) exported\n", nb); ++ ++ return 0; ++} ++ ++static struct platform_driver gpio_export_driver = { ++ .driver = { ++ .name = "gpio-export", ++ .owner = THIS_MODULE, ++ .of_match_table = of_match_ptr(gpio_export_ids), ++ }, ++ .probe = of_gpio_export_probe, ++}; ++ ++module_platform_driver(gpio_export_driver); ++ ++#endif +--- a/include/asm-generic/gpio.h ++++ b/include/asm-generic/gpio.h +@@ -125,6 +125,12 @@ static inline int gpio_export(unsigned g + return gpiod_export(gpio_to_desc(gpio), direction_may_change); + } + ++int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name); ++static inline int gpio_export_with_name(unsigned gpio, bool direction_may_change, const char *name) ++{ ++ return __gpiod_export(gpio_to_desc(gpio), direction_may_change, name); ++} ++ + static inline int gpio_export_link(struct device *dev, const char *name, + unsigned gpio) + { +--- a/include/linux/gpio/consumer.h ++++ b/include/linux/gpio/consumer.h +@@ -712,6 +712,7 @@ static inline void devm_acpi_dev_remove_ + + #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS) + ++int _gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name); + int gpiod_export(struct gpio_desc *desc, bool direction_may_change); + int gpiod_export_link(struct device *dev, const char *name, + struct gpio_desc *desc); +@@ -719,6 +720,13 @@ void gpiod_unexport(struct gpio_desc *de + + #else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */ + ++static inline int _gpiod_export(struct gpio_desc *desc, ++ bool direction_may_change, ++ const char *name) ++{ ++ return -ENOSYS; ++} ++ + static inline int gpiod_export(struct gpio_desc *desc, + bool direction_may_change) + { +--- a/drivers/gpio/gpiolib-sysfs.c ++++ b/drivers/gpio/gpiolib-sysfs.c +@@ -564,7 +564,7 @@ static struct class gpio_class = { + * + * Returns zero on success, else an error. + */ +-int gpiod_export(struct gpio_desc *desc, bool direction_may_change) ++int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name) + { + struct gpio_chip *chip; + struct gpio_device *gdev; +@@ -626,6 +626,8 @@ int gpiod_export(struct gpio_desc *desc, + offset = gpio_chip_hwgpio(desc); + if (chip->names && chip->names[offset]) + ioname = chip->names[offset]; ++ if (name) ++ ioname = name; + + dev = device_create_with_groups(&gpio_class, &gdev->dev, + MKDEV(0, 0), data, gpio_groups, +@@ -647,6 +649,12 @@ err_unlock: + gpiod_dbg(desc, "%s: status %d\n", __func__, status); + return status; + } ++EXPORT_SYMBOL_GPL(__gpiod_export); ++ ++int gpiod_export(struct gpio_desc *desc, bool direction_may_change) ++{ ++ return __gpiod_export(desc, direction_may_change, NULL); ++} + EXPORT_SYMBOL_GPL(gpiod_export); + + static int match_export(struct device *dev, const void *desc) diff --git a/target/linux/generic/hack-5.15/810-bcma-ssb-fallback-sprom.patch b/target/linux/generic/hack-5.15/810-bcma-ssb-fallback-sprom.patch new file mode 100644 index 0000000000..37da0e657b --- /dev/null +++ b/target/linux/generic/hack-5.15/810-bcma-ssb-fallback-sprom.patch @@ -0,0 +1,187 @@ +From e4d708702e6c98f2111e33201a264d6788564cb2 Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Fri, 12 May 2023 11:08:43 +0200 +Subject: [PATCH] ssb_sprom: add generic kernel support for Broadcom Fallback SPROMs + +--- + drivers/bcma/Kconfig | 4 ++++ + drivers/bcma/Makefile | 1 + + drivers/bcma/bcma_private.h | 4 ++++ + drivers/bcma/main.c | 8 ++++++++ + drivers/bcma/sprom.c | 23 ++++++++++++++--------- + drivers/ssb/Kconfig | 5 +++++ + drivers/ssb/Makefile | 1 + + drivers/ssb/main.c | 8 ++++++++ + drivers/ssb/sprom.c | 12 +++++++++++- + drivers/ssb/ssb_private.h | 4 ++++ + 10 files changed, 60 insertions(+), 10 deletions(-) + +--- a/drivers/bcma/Kconfig ++++ b/drivers/bcma/Kconfig +@@ -18,6 +18,10 @@ config BCMA_BLOCKIO + bool + default y + ++config BCMA_FALLBACK_SPROM ++ bool ++ default y ++ + config BCMA_HOST_PCI_POSSIBLE + bool + depends on PCI = y +--- a/drivers/bcma/Makefile ++++ b/drivers/bcma/Makefile +@@ -11,6 +11,7 @@ bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE) + bcma-$(CONFIG_BCMA_DRIVER_MIPS) += driver_mips.o + bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN) += driver_gmac_cmn.o + bcma-$(CONFIG_BCMA_DRIVER_GPIO) += driver_gpio.o ++bcma-$(CONFIG_BCMA_FALLBACK_SPROM) += fallback-sprom.o + bcma-$(CONFIG_BCMA_HOST_PCI) += host_pci.o + bcma-$(CONFIG_BCMA_HOST_SOC) += host_soc.o + obj-$(CONFIG_BCMA) += bcma.o +--- a/drivers/bcma/bcma_private.h ++++ b/drivers/bcma/bcma_private.h +@@ -38,6 +38,10 @@ int bcma_bus_resume(struct bcma_bus *bus + void bcma_detect_chip(struct bcma_bus *bus); + int bcma_bus_scan(struct bcma_bus *bus); + ++/* fallback-sprom.c */ ++int __init bcma_fbs_register(void); ++int bcma_get_fallback_sprom(struct bcma_bus *dev, struct ssb_sprom *out); ++ + /* sprom.c */ + int bcma_sprom_get(struct bcma_bus *bus); + +--- a/drivers/bcma/main.c ++++ b/drivers/bcma/main.c +@@ -668,6 +668,14 @@ static int __init bcma_modinit(void) + { + int err; + ++#ifdef CONFIG_BCMA_FALLBACK_SPROM ++ err = bcma_fbs_register(); ++ if (err) { ++ pr_err("Fallback SPROM initialization failed\n"); ++ err = 0; ++ } ++#endif /* CONFIG_BCMA_FALLBACK_SPROM */ ++ + err = bcma_init_bus_register(); + if (err) + return err; +--- a/drivers/bcma/sprom.c ++++ b/drivers/bcma/sprom.c +@@ -51,21 +51,26 @@ static int bcma_fill_sprom_with_fallback + { + int err; + +- if (!get_fallback_sprom) { ++ if (get_fallback_sprom) ++ err = get_fallback_sprom(bus, out); ++ ++#ifdef CONFIG_BCMA_FALLBACK_SPROM ++ if (!get_fallback_sprom || err) ++ err = bcma_get_fallback_sprom(bus, out); ++#else ++ if (!get_fallback_sprom) + err = -ENOENT; +- goto fail; +- } ++#endif /* CONFIG_BCMA_FALLBACK_SPROM */ + +- err = get_fallback_sprom(bus, out); +- if (err) +- goto fail; ++ if (err) { ++ bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err); ++ return err; ++ } + + bcma_debug(bus, "Using SPROM revision %d provided by platform.\n", + bus->sprom.revision); ++ + return 0; +-fail: +- bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err); +- return err; + } + + /************************************************** +--- a/drivers/ssb/Kconfig ++++ b/drivers/ssb/Kconfig +@@ -25,6 +25,11 @@ if SSB + config SSB_SPROM + bool + ++config SSB_FALLBACK_SPROM ++ bool ++ depends on SSB_PCIHOST ++ default y ++ + # Support for Block-I/O. SELECT this from the driver that needs it. + config SSB_BLOCKIO + bool +--- a/drivers/ssb/Makefile ++++ b/drivers/ssb/Makefile +@@ -2,6 +2,7 @@ + # core + ssb-y += main.o scan.o + ssb-$(CONFIG_SSB_EMBEDDED) += embedded.o ++ssb-$(CONFIG_SSB_FALLBACK_SPROM) += fallback-sprom.o + ssb-$(CONFIG_SSB_SPROM) += sprom.o + + # host support +--- a/drivers/ssb/main.c ++++ b/drivers/ssb/main.c +@@ -1287,6 +1287,14 @@ static int __init ssb_modinit(void) + { + int err; + ++#ifdef CONFIG_SSB_FALLBACK_SPROM ++ err = ssb_fbs_register(); ++ if (err) { ++ pr_err("Fallback SPROM initialization failed\n"); ++ err = 0; ++ } ++#endif /* CONFIG_SSB_FALLBACK_SPROM */ ++ + /* See the comment at the ssb_is_early_boot definition */ + ssb_is_early_boot = 0; + err = bus_register(&ssb_bustype); +--- a/drivers/ssb/sprom.c ++++ b/drivers/ssb/sprom.c +@@ -180,10 +180,20 @@ int ssb_arch_register_fallback_sprom(int + + int ssb_fill_sprom_with_fallback(struct ssb_bus *bus, struct ssb_sprom *out) + { ++ int err; ++ ++ if (get_fallback_sprom) ++ err = get_fallback_sprom(bus, out); ++ ++#ifdef CONFIG_SSB_FALLBACK_SPROM ++ if (!get_fallback_sprom || err) ++ err = ssb_get_fallback_sprom(bus, out); ++#else + if (!get_fallback_sprom) + return -ENOENT; ++#endif /* CONFIG_SSB_FALLBACK_SPROM */ + +- return get_fallback_sprom(bus, out); ++ return err; + } + + /* https://bcm-v4.sipsolutions.net/802.11/IsSpromAvailable */ +--- a/drivers/ssb/ssb_private.h ++++ b/drivers/ssb/ssb_private.h +@@ -143,6 +143,10 @@ extern int ssb_bus_scan(struct ssb_bus * + extern void ssb_iounmap(struct ssb_bus *ssb); + + ++/* fallback-sprom.c */ ++int __init ssb_fbs_register(void); ++int ssb_get_fallback_sprom(struct ssb_bus *dev, struct ssb_sprom *out); ++ + /* sprom.c */ + extern + ssize_t ssb_attr_sprom_show(struct ssb_bus *bus, char *buf, diff --git a/target/linux/generic/hack-5.15/901-debloat_sock_diag.patch b/target/linux/generic/hack-5.15/901-debloat_sock_diag.patch new file mode 100644 index 0000000000..11f4f556e8 --- /dev/null +++ b/target/linux/generic/hack-5.15/901-debloat_sock_diag.patch @@ -0,0 +1,172 @@ +From 3b6115d6b57a263bdc8c9b1df273bd4a7955eead Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Sat, 8 Jul 2017 08:16:31 +0200 +Subject: debloat: add some debloat patches, strip down procfs and make O_DIRECT support optional, saves ~15K after lzma on MIPS + +Signed-off-by: Felix Fietkau +--- + net/Kconfig | 3 +++ + net/core/Makefile | 3 ++- + net/core/sock.c | 2 ++ + net/ipv4/Kconfig | 1 + + net/netlink/Kconfig | 1 + + net/packet/Kconfig | 1 + + net/unix/Kconfig | 1 + + 7 files changed, 11 insertions(+), 1 deletion(-) + +--- a/net/Kconfig ++++ b/net/Kconfig +@@ -104,6 +104,9 @@ source "net/mptcp/Kconfig" + + endif # if INET + ++config SOCK_DIAG ++ bool ++ + config NETWORK_SECMARK + bool "Security Marking" + help +--- a/net/core/Makefile ++++ b/net/core/Makefile +@@ -10,9 +10,10 @@ obj-$(CONFIG_SYSCTL) += sysctl_net_core. + + obj-y += dev.o dev_addr_lists.o dst.o netevent.o \ + neighbour.o rtnetlink.o utils.o link_watch.o filter.o \ +- sock_diag.o dev_ioctl.o tso.o sock_reuseport.o \ ++ dev_ioctl.o tso.o sock_reuseport.o \ + fib_notifier.o xdp.o flow_offload.o + ++obj-$(CONFIG_SOCK_DIAG) += sock_diag.o + obj-y += net-sysfs.o + obj-$(CONFIG_PAGE_POOL) += page_pool.o + obj-$(CONFIG_PROC_FS) += net-procfs.o +--- a/net/core/sock.c ++++ b/net/core/sock.c +@@ -114,6 +114,7 @@ + #include + #include + #include ++#include + + #include + +@@ -143,6 +144,7 @@ + + static DEFINE_MUTEX(proto_list_mutex); + static LIST_HEAD(proto_list); ++DEFINE_COOKIE(sock_cookie); + + static void sock_inuse_add(struct net *net, int val); + +@@ -545,6 +547,18 @@ discard_and_relse: + } + EXPORT_SYMBOL(__sk_receive_skb); + ++u64 __sock_gen_cookie(struct sock *sk) ++{ ++ while (1) { ++ u64 res = atomic64_read(&sk->sk_cookie); ++ ++ if (res) ++ return res; ++ res = gen_cookie_next(&sock_cookie); ++ atomic64_cmpxchg(&sk->sk_cookie, 0, res); ++ } ++} ++ + INDIRECT_CALLABLE_DECLARE(struct dst_entry *ip6_dst_check(struct dst_entry *, + u32)); + INDIRECT_CALLABLE_DECLARE(struct dst_entry *ipv4_dst_check(struct dst_entry *, +@@ -1987,9 +2001,11 @@ static void __sk_free(struct sock *sk) + if (likely(sk->sk_net_refcnt)) + sock_inuse_add(sock_net(sk), -1); + ++#ifdef CONFIG_SOCK_DIAG + if (unlikely(sk->sk_net_refcnt && sock_diag_has_destroy_listeners(sk))) + sock_diag_broadcast_destroy(sk); + else ++#endif + sk_destruct(sk); + } + +--- a/net/core/sock_diag.c ++++ b/net/core/sock_diag.c +@@ -11,7 +11,6 @@ + #include + #include + #include +-#include + #include + #include + +@@ -20,20 +19,6 @@ static int (*inet_rcv_compat)(struct sk_ + static DEFINE_MUTEX(sock_diag_table_mutex); + static struct workqueue_struct *broadcast_wq; + +-DEFINE_COOKIE(sock_cookie); +- +-u64 __sock_gen_cookie(struct sock *sk) +-{ +- while (1) { +- u64 res = atomic64_read(&sk->sk_cookie); +- +- if (res) +- return res; +- res = gen_cookie_next(&sock_cookie); +- atomic64_cmpxchg(&sk->sk_cookie, 0, res); +- } +-} +- + int sock_diag_check_cookie(struct sock *sk, const __u32 *cookie) + { + u64 res; +--- a/net/ipv4/Kconfig ++++ b/net/ipv4/Kconfig +@@ -424,6 +424,7 @@ config INET_TUNNEL + + config INET_DIAG + tristate "INET: socket monitoring interface" ++ select SOCK_DIAG + default y + help + Support for INET (TCP, DCCP, etc) socket monitoring interface used by +--- a/net/netlink/Kconfig ++++ b/net/netlink/Kconfig +@@ -5,6 +5,7 @@ + + config NETLINK_DIAG + tristate "NETLINK: socket monitoring interface" ++ select SOCK_DIAG + default n + help + Support for NETLINK socket monitoring interface used by the ss tool. +--- a/net/packet/Kconfig ++++ b/net/packet/Kconfig +@@ -19,6 +19,7 @@ config PACKET + config PACKET_DIAG + tristate "Packet: sockets monitoring interface" + depends on PACKET ++ select SOCK_DIAG + default n + help + Support for PF_PACKET sockets monitoring interface used by the ss tool. +--- a/net/unix/Kconfig ++++ b/net/unix/Kconfig +@@ -33,6 +33,7 @@ config AF_UNIX_OOB + config UNIX_DIAG + tristate "UNIX: socket monitoring interface" + depends on UNIX ++ select SOCK_DIAG + default n + help + Support for UNIX socket monitoring interface used by the ss tool. +--- a/net/xdp/Kconfig ++++ b/net/xdp/Kconfig +@@ -10,6 +10,7 @@ config XDP_SOCKETS + config XDP_SOCKETS_DIAG + tristate "XDP sockets: monitoring interface" + depends on XDP_SOCKETS ++ select SOCK_DIAG + default n + help + Support for PF_XDP sockets monitoring interface used by the ss tool. diff --git a/target/linux/generic/hack-5.15/902-debloat_proc.patch b/target/linux/generic/hack-5.15/902-debloat_proc.patch new file mode 100644 index 0000000000..768d3e1f0c --- /dev/null +++ b/target/linux/generic/hack-5.15/902-debloat_proc.patch @@ -0,0 +1,408 @@ +From 9e3f1d0805b2d919904dd9a4ff0d956314cc3cba Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Sat, 8 Jul 2017 08:20:09 +0200 +Subject: debloat: procfs + +Signed-off-by: Felix Fietkau +--- + fs/locks.c | 2 ++ + fs/proc/Kconfig | 5 +++++ + fs/proc/consoles.c | 3 +++ + fs/proc/proc_tty.c | 11 ++++++++++- + include/net/snmp.h | 18 +++++++++++++++++- + ipc/msg.c | 3 +++ + ipc/sem.c | 2 ++ + ipc/shm.c | 2 ++ + ipc/util.c | 3 +++ + kernel/exec_domain.c | 2 ++ + kernel/irq/proc.c | 9 +++++++++ + kernel/time/timer_list.c | 2 ++ + mm/vmalloc.c | 2 ++ + mm/vmstat.c | 8 +++++--- + net/8021q/vlanproc.c | 6 ++++++ + net/core/net-procfs.c | 18 ++++++++++++------ + net/core/sock.c | 2 ++ + net/ipv4/fib_trie.c | 18 ++++++++++++------ + net/ipv4/proc.c | 3 +++ + net/ipv4/route.c | 3 +++ + 20 files changed, 105 insertions(+), 17 deletions(-) + +--- a/fs/locks.c ++++ b/fs/locks.c +@@ -2953,6 +2953,8 @@ static const struct seq_operations locks + + static int __init proc_locks_init(void) + { ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return 0; + proc_create_seq_private("locks", 0, NULL, &locks_seq_operations, + sizeof(struct locks_iterator), NULL); + return 0; +--- a/fs/proc/Kconfig ++++ b/fs/proc/Kconfig +@@ -100,6 +100,11 @@ config PROC_CHILDREN + Say Y if you are running any user-space software which takes benefit from + this interface. For example, rkt is such a piece of software. + ++config PROC_STRIPPED ++ default n ++ depends on EXPERT ++ bool "Strip non-essential /proc functionality to reduce code size" ++ + config PROC_PID_ARCH_STATUS + def_bool n + depends on PROC_FS +--- a/fs/proc/consoles.c ++++ b/fs/proc/consoles.c +@@ -92,6 +92,9 @@ static const struct seq_operations conso + + static int __init proc_consoles_init(void) + { ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return 0; ++ + proc_create_seq("consoles", 0, NULL, &consoles_op); + return 0; + } +--- a/fs/proc/proc_tty.c ++++ b/fs/proc/proc_tty.c +@@ -133,7 +133,10 @@ static const struct seq_operations tty_d + void proc_tty_register_driver(struct tty_driver *driver) + { + struct proc_dir_entry *ent; +- ++ ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return; ++ + if (!driver->driver_name || driver->proc_entry || + !driver->ops->proc_show) + return; +@@ -150,6 +153,9 @@ void proc_tty_unregister_driver(struct t + { + struct proc_dir_entry *ent; + ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return; ++ + ent = driver->proc_entry; + if (!ent) + return; +@@ -164,6 +170,9 @@ void proc_tty_unregister_driver(struct t + */ + void __init proc_tty_init(void) + { ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return; ++ + if (!proc_mkdir("tty", NULL)) + return; + proc_mkdir("tty/ldisc", NULL); /* Preserved: it's userspace visible */ +--- a/include/net/snmp.h ++++ b/include/net/snmp.h +@@ -124,6 +124,21 @@ struct linux_tls_mib { + #define DECLARE_SNMP_STAT(type, name) \ + extern __typeof__(type) __percpu *name + ++#ifdef CONFIG_PROC_STRIPPED ++#define __SNMP_STATS_DUMMY(mib) \ ++ do { (void) mib->mibs[0]; } while(0) ++ ++#define __SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib) ++#define SNMP_INC_STATS_ATOMIC_LONG(mib, field) __SNMP_STATS_DUMMY(mib) ++#define SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib) ++#define SNMP_DEC_STATS(mib, field) __SNMP_STATS_DUMMY(mib) ++#define __SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib) ++#define SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib) ++#define SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib) ++#define __SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib) ++ ++#else ++ + #define __SNMP_INC_STATS(mib, field) \ + __this_cpu_inc(mib->mibs[field]) + +@@ -154,8 +169,9 @@ struct linux_tls_mib { + __this_cpu_add(ptr[basefield##OCTETS], addend); \ + } while (0) + ++#endif + +-#if BITS_PER_LONG==32 ++#if (BITS_PER_LONG==32) && !defined(CONFIG_PROC_STRIPPED) + + #define __SNMP_ADD_STATS64(mib, field, addend) \ + do { \ +--- a/ipc/msg.c ++++ b/ipc/msg.c +@@ -1350,6 +1350,9 @@ void __init msg_init(void) + { + msg_init_ns(&init_ipc_ns); + ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return; ++ + ipc_init_proc_interface("sysvipc/msg", + " key msqid perms cbytes qnum lspid lrpid uid gid cuid cgid stime rtime ctime\n", + IPC_MSG_IDS, sysvipc_msg_proc_show); +--- a/ipc/sem.c ++++ b/ipc/sem.c +@@ -268,6 +268,8 @@ void sem_exit_ns(struct ipc_namespace *n + void __init sem_init(void) + { + sem_init_ns(&init_ipc_ns); ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return; + ipc_init_proc_interface("sysvipc/sem", + " key semid perms nsems uid gid cuid cgid otime ctime\n", + IPC_SEM_IDS, sysvipc_sem_proc_show); +--- a/ipc/shm.c ++++ b/ipc/shm.c +@@ -154,6 +154,8 @@ pure_initcall(ipc_ns_init); + + void __init shm_init(void) + { ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return; + ipc_init_proc_interface("sysvipc/shm", + #if BITS_PER_LONG <= 32 + " key shmid perms size cpid lpid nattch uid gid cuid cgid atime dtime ctime rss swap\n", +--- a/ipc/util.c ++++ b/ipc/util.c +@@ -141,6 +141,9 @@ void __init ipc_init_proc_interface(cons + struct proc_dir_entry *pde; + struct ipc_proc_iface *iface; + ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return; ++ + iface = kmalloc(sizeof(*iface), GFP_KERNEL); + if (!iface) + return; +--- a/kernel/exec_domain.c ++++ b/kernel/exec_domain.c +@@ -29,6 +29,8 @@ static int execdomains_proc_show(struct + + static int __init proc_execdomains_init(void) + { ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return 0; + proc_create_single("execdomains", 0, NULL, execdomains_proc_show); + return 0; + } +--- a/kernel/irq/proc.c ++++ b/kernel/irq/proc.c +@@ -341,6 +341,9 @@ void register_irq_proc(unsigned int irq, + void __maybe_unused *irqp = (void *)(unsigned long) irq; + char name [MAX_NAMELEN]; + ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP)) ++ return; ++ + if (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip)) + return; + +@@ -394,6 +397,9 @@ void unregister_irq_proc(unsigned int ir + { + char name [MAX_NAMELEN]; + ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP)) ++ return; ++ + if (!root_irq_dir || !desc->dir) + return; + #ifdef CONFIG_SMP +@@ -432,6 +438,9 @@ void init_irq_proc(void) + unsigned int irq; + struct irq_desc *desc; + ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP)) ++ return; ++ + /* create /proc/irq */ + root_irq_dir = proc_mkdir("irq", NULL); + if (!root_irq_dir) +--- a/kernel/time/timer_list.c ++++ b/kernel/time/timer_list.c +@@ -350,6 +350,8 @@ static int __init init_timer_list_procfs + { + struct proc_dir_entry *pe; + ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return 0; + pe = proc_create_seq_private("timer_list", 0400, NULL, &timer_list_sops, + sizeof(struct timer_list_iter), NULL); + if (!pe) +--- a/mm/vmalloc.c ++++ b/mm/vmalloc.c +@@ -3986,6 +3986,8 @@ static const struct seq_operations vmall + + static int __init proc_vmalloc_init(void) + { ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return 0; + if (IS_ENABLED(CONFIG_NUMA)) + proc_create_seq_private("vmallocinfo", 0400, NULL, + &vmalloc_op, +--- a/mm/vmstat.c ++++ b/mm/vmstat.c +@@ -2083,10 +2083,12 @@ void __init init_mm_internals(void) + start_shepherd_timer(); + #endif + #ifdef CONFIG_PROC_FS +- proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op); +- proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op); ++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) { ++ proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op); ++ proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op); ++ proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op); ++ } + proc_create_seq("vmstat", 0444, NULL, &vmstat_op); +- proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op); + #endif + } + +--- a/net/8021q/vlanproc.c ++++ b/net/8021q/vlanproc.c +@@ -93,6 +93,9 @@ void vlan_proc_cleanup(struct net *net) + { + struct vlan_net *vn = net_generic(net, vlan_net_id); + ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return; ++ + if (vn->proc_vlan_conf) + remove_proc_entry(name_conf, vn->proc_vlan_dir); + +@@ -112,6 +115,9 @@ int __net_init vlan_proc_init(struct net + { + struct vlan_net *vn = net_generic(net, vlan_net_id); + ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return 0; ++ + vn->proc_vlan_dir = proc_net_mkdir(net, name_root, net->proc_net); + if (!vn->proc_vlan_dir) + goto err; +--- a/net/core/net-procfs.c ++++ b/net/core/net-procfs.c +@@ -317,10 +317,12 @@ static int __net_init dev_proc_net_init( + if (!proc_create_net("dev", 0444, net->proc_net, &dev_seq_ops, + sizeof(struct seq_net_private))) + goto out; +- if (!proc_create_seq("softnet_stat", 0444, net->proc_net, ++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && ++ !proc_create_seq("softnet_stat", 0444, net->proc_net, + &softnet_seq_ops)) + goto out_dev; +- if (!proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops, ++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && ++ !proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops, + sizeof(struct seq_net_private))) + goto out_softnet; + +@@ -330,9 +332,11 @@ static int __net_init dev_proc_net_init( + out: + return rc; + out_ptype: +- remove_proc_entry("ptype", net->proc_net); ++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ remove_proc_entry("ptype", net->proc_net); + out_softnet: +- remove_proc_entry("softnet_stat", net->proc_net); ++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ remove_proc_entry("softnet_stat", net->proc_net); + out_dev: + remove_proc_entry("dev", net->proc_net); + goto out; +@@ -342,8 +346,10 @@ static void __net_exit dev_proc_net_exit + { + wext_proc_exit(net); + +- remove_proc_entry("ptype", net->proc_net); +- remove_proc_entry("softnet_stat", net->proc_net); ++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) { ++ remove_proc_entry("ptype", net->proc_net); ++ remove_proc_entry("softnet_stat", net->proc_net); ++ } + remove_proc_entry("dev", net->proc_net); + } + +--- a/net/core/sock.c ++++ b/net/core/sock.c +@@ -3881,6 +3881,8 @@ static __net_initdata struct pernet_oper + + static int __init proto_init(void) + { ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return 0; + return register_pernet_subsys(&proto_net_ops); + } + +--- a/net/ipv4/fib_trie.c ++++ b/net/ipv4/fib_trie.c +@@ -3029,11 +3029,13 @@ static const struct seq_operations fib_r + + int __net_init fib_proc_init(struct net *net) + { +- if (!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops, ++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && ++ !proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops, + sizeof(struct fib_trie_iter))) + goto out1; + +- if (!proc_create_net_single("fib_triestat", 0444, net->proc_net, ++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && ++ !proc_create_net_single("fib_triestat", 0444, net->proc_net, + fib_triestat_seq_show, NULL)) + goto out2; + +@@ -3044,17 +3046,21 @@ int __net_init fib_proc_init(struct net + return 0; + + out3: +- remove_proc_entry("fib_triestat", net->proc_net); ++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ remove_proc_entry("fib_triestat", net->proc_net); + out2: +- remove_proc_entry("fib_trie", net->proc_net); ++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ remove_proc_entry("fib_trie", net->proc_net); + out1: + return -ENOMEM; + } + + void __net_exit fib_proc_exit(struct net *net) + { +- remove_proc_entry("fib_trie", net->proc_net); +- remove_proc_entry("fib_triestat", net->proc_net); ++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) { ++ remove_proc_entry("fib_trie", net->proc_net); ++ remove_proc_entry("fib_triestat", net->proc_net); ++ } + remove_proc_entry("route", net->proc_net); + } + +--- a/net/ipv4/proc.c ++++ b/net/ipv4/proc.c +@@ -553,5 +553,8 @@ static __net_initdata struct pernet_oper + + int __init ip_misc_proc_init(void) + { ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return 0; ++ + return register_pernet_subsys(&ip_proc_ops); + } +--- a/net/ipv4/route.c ++++ b/net/ipv4/route.c +@@ -387,6 +387,9 @@ static struct pernet_operations ip_rt_pr + + static int __init ip_rt_proc_init(void) + { ++ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) ++ return 0; ++ + return register_pernet_subsys(&ip_rt_proc_ops); + } + diff --git a/target/linux/generic/hack-5.15/904-debloat_dma_buf.patch b/target/linux/generic/hack-5.15/904-debloat_dma_buf.patch new file mode 100644 index 0000000000..71546bf942 --- /dev/null +++ b/target/linux/generic/hack-5.15/904-debloat_dma_buf.patch @@ -0,0 +1,92 @@ +From e3692cb2fcd5ba1244512a0f43b8118f65f1c375 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Sat, 8 Jul 2017 08:20:43 +0200 +Subject: debloat: dmabuf + +Signed-off-by: Felix Fietkau +--- + drivers/base/Kconfig | 2 +- + drivers/dma-buf/Makefile | 10 +++++++--- + drivers/dma-buf/dma-buf.c | 4 +++- + kernel/sched/core.c | 1 + + 4 files changed, 12 insertions(+), 5 deletions(-) + +--- a/drivers/base/Kconfig ++++ b/drivers/base/Kconfig +@@ -187,7 +187,7 @@ config SOC_BUS + source "drivers/base/regmap/Kconfig" + + config DMA_SHARED_BUFFER +- bool ++ tristate + default n + select IRQ_WORK + help +--- a/drivers/dma-buf/heaps/Makefile ++++ b/drivers/dma-buf/heaps/Makefile +@@ -1,3 +1,3 @@ + # SPDX-License-Identifier: GPL-2.0 +-obj-$(CONFIG_DMABUF_HEAPS_SYSTEM) += system_heap.o +-obj-$(CONFIG_DMABUF_HEAPS_CMA) += cma_heap.o ++dma-buf-objs-$(CONFIG_DMABUF_HEAPS_SYSTEM) += system_heap.o ++dma-buf-objs-$(CONFIG_DMABUF_HEAPS_CMA) += cma_heap.o +--- a/drivers/dma-buf/Makefile ++++ b/drivers/dma-buf/Makefile +@@ -1,16 +1,20 @@ + # SPDX-License-Identifier: GPL-2.0-only +-obj-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \ ++obj-$(CONFIG_DMA_SHARED_BUFFER) := dma-shared-buffer.o ++ ++dma-buf-objs-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \ + dma-resv.o seqno-fence.o +-obj-$(CONFIG_DMABUF_HEAPS) += dma-heap.o +-obj-$(CONFIG_DMABUF_HEAPS) += heaps/ +-obj-$(CONFIG_SYNC_FILE) += sync_file.o +-obj-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o +-obj-$(CONFIG_UDMABUF) += udmabuf.o +-obj-$(CONFIG_DMABUF_SYSFS_STATS) += dma-buf-sysfs-stats.o ++dma-buf-objs-$(CONFIG_DMABUF_HEAPS) += dma-heap.o ++obj-$(CONFIG_DMABUF_HEAPS) += heaps/ ++dma-buf-objs-$(CONFIG_SYNC_FILE) += sync_file.o ++dma-buf-objs-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o ++dma-buf-objs-$(CONFIG_UDMABUF) += udmabuf.o ++dma-buf-objs-$(CONFIG_DMABUF_SYSFS_STATS) += udmabuf.o + + dmabuf_selftests-y := \ + selftest.o \ + st-dma-fence.o \ + st-dma-fence-chain.o + +-obj-$(CONFIG_DMABUF_SELFTESTS) += dmabuf_selftests.o ++dma-buf-objs-$(CONFIG_DMABUF_SELFTESTS) += dmabuf_selftests.o ++ ++dma-shared-buffer-objs := $(dma-buf-objs-y) +--- a/drivers/dma-buf/dma-buf.c ++++ b/drivers/dma-buf/dma-buf.c +@@ -1513,4 +1513,5 @@ static void __exit dma_buf_deinit(void) + kern_unmount(dma_buf_mnt); + dma_buf_uninit_sysfs_statistics(); + } +-__exitcall(dma_buf_deinit); ++module_exit(dma_buf_deinit); ++MODULE_LICENSE("GPL"); +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -4220,6 +4220,7 @@ int wake_up_state(struct task_struct *p, + { + return try_to_wake_up(p, state, 0); + } ++EXPORT_SYMBOL_GPL(wake_up_state); + + /* + * Perform scheduler related setup for a newly forked process p. +--- a/fs/d_path.c ++++ b/fs/d_path.c +@@ -316,6 +316,7 @@ char *dynamic_dname(struct dentry *dentr + buffer += buflen - sz; + return memcpy(buffer, temp, sz); + } ++EXPORT_SYMBOL_GPL(dynamic_dname); + + char *simple_dname(struct dentry *dentry, char *buffer, int buflen) + { diff --git a/target/linux/generic/hack-5.10/910-kobject_uevent.patch b/target/linux/generic/hack-5.15/910-kobject_uevent.patch similarity index 100% rename from target/linux/generic/hack-5.10/910-kobject_uevent.patch rename to target/linux/generic/hack-5.15/910-kobject_uevent.patch diff --git a/target/linux/generic/hack-5.10/911-kobject_add_broadcast_uevent.patch b/target/linux/generic/hack-5.15/911-kobject_add_broadcast_uevent.patch similarity index 100% rename from target/linux/generic/hack-5.10/911-kobject_add_broadcast_uevent.patch rename to target/linux/generic/hack-5.15/911-kobject_add_broadcast_uevent.patch diff --git a/target/linux/generic/hack-5.15/920-device_tree_cmdline.patch b/target/linux/generic/hack-5.15/920-device_tree_cmdline.patch new file mode 100644 index 0000000000..385b0de1e6 --- /dev/null +++ b/target/linux/generic/hack-5.15/920-device_tree_cmdline.patch @@ -0,0 +1,21 @@ +From e08bcbbaa52fcc41f02743fd2e62a33255ce52da Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 13:52:28 +0200 +Subject: [PATCH] of/ftd: add device tree cmdline + +--- + drivers/of/fdt.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/of/fdt.c ++++ b/drivers/of/fdt.c +@@ -1158,6 +1158,9 @@ int __init early_init_dt_scan_chosen(uns + p = of_get_flat_dt_prop(node, "bootargs", &l); + if (p != NULL && l > 0) + strlcpy(data, p, min(l, COMMAND_LINE_SIZE)); ++ p = of_get_flat_dt_prop(node, "bootargs-append", &l); ++ if (p != NULL && l > 0) ++ strlcat(data, p, min_t(int, strlen(data) + (int)l, COMMAND_LINE_SIZE)); + + /* + * CONFIG_CMDLINE is meant to be a default in case nothing else diff --git a/target/linux/generic/hack-5.15/930-Revert-Revert-Revert-driver-core-Set-fw_devlink-on-b.patch b/target/linux/generic/hack-5.15/930-Revert-Revert-Revert-driver-core-Set-fw_devlink-on-b.patch new file mode 100644 index 0000000000..4f4d6c7509 --- /dev/null +++ b/target/linux/generic/hack-5.15/930-Revert-Revert-Revert-driver-core-Set-fw_devlink-on-b.patch @@ -0,0 +1,30 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 19 Jul 2022 06:17:48 +0200 +Subject: [PATCH] Revert "Revert "Revert "driver core: Set fw_devlink=on by + default""" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit ea718c699055c8566eb64432388a04974c43b2ea. + +With of_platform_populate() called for MTD partitions that commit breaks +probing devices which reference MTD in device tree. + +Link: https://lore.kernel.org/all/696cb2da-20b9-b3dd-46d9-de4bf91a1506@gmail.com/T/#u +Signed-off-by: Rafał Miłecki +--- + drivers/base/core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/base/core.c ++++ b/drivers/base/core.c +@@ -1562,7 +1562,7 @@ static void device_links_purge(struct de + #define FW_DEVLINK_FLAGS_RPM (FW_DEVLINK_FLAGS_ON | \ + DL_FLAG_PM_RUNTIME) + +-static u32 fw_devlink_flags = FW_DEVLINK_FLAGS_ON; ++static u32 fw_devlink_flags = FW_DEVLINK_FLAGS_PERMISSIVE; + static int __init fw_devlink_setup(char *arg) + { + if (!arg) diff --git a/target/linux/generic/pending-5.10/050-dtc-checks-Drop-interrupt-provider-address-cells-check.patch b/target/linux/generic/pending-5.10/050-dtc-checks-Drop-interrupt-provider-address-cells-check.patch deleted file mode 100644 index 75f63728ec..0000000000 --- a/target/linux/generic/pending-5.10/050-dtc-checks-Drop-interrupt-provider-address-cells-check.patch +++ /dev/null @@ -1,28 +0,0 @@ -From d8d1a9a77863a8c7031ae82a1d461aa78eb72a7b Mon Sep 17 00:00:00 2001 -From: Rob Herring -Date: Mon, 11 Oct 2021 14:12:43 -0500 -Subject: [PATCH] checks: Drop interrupt provider '#address-cells' check - -'#address-cells' is only needed when parsing 'interrupt-map' properties, so -remove it from the common interrupt-provider test. - -Cc: Andre Przywara -Reviewed-by: David Gibson -Signed-off-by: Rob Herring -Message-Id: <20211011191245.1009682-3-robh@kernel.org> -Signed-off-by: David Gibson ---- ---- a/scripts/dtc/checks.c -+++ b/scripts/dtc/checks.c -@@ -1569,11 +1569,6 @@ static void check_interrupt_provider(str - if (!prop) - FAIL(c, dti, node, - "Missing #interrupt-cells in interrupt provider"); -- -- prop = get_property(node, "#address-cells"); -- if (!prop) -- FAIL(c, dti, node, -- "Missing #address-cells in interrupt provider"); - } - WARNING(interrupt_provider, check_interrupt_provider, NULL); - diff --git a/target/linux/generic/pending-5.10/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch b/target/linux/generic/pending-5.10/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch deleted file mode 100644 index 282c8196e5..0000000000 --- a/target/linux/generic/pending-5.10/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Felix Fietkau -Date: Thu, 22 Oct 2020 22:00:03 +0200 -Subject: [PATCH] compiler.h: only include asm/rwonce.h for kernel code - -This header file is not in uapi, which makes any user space code that includes -linux/compiler.h to fail with the error 'asm/rwonce.h: No such file or directory' - -Fixes: e506ea451254 ("compiler.h: Split {READ,WRITE}_ONCE definitions out into rwonce.h") -Signed-off-by: Felix Fietkau ---- - ---- a/include/linux/compiler.h -+++ b/include/linux/compiler.h -@@ -213,6 +213,8 @@ void ftrace_likely_update(struct ftrace_ - __v; \ - }) - -+#include -+ - #endif /* __KERNEL__ */ - - /* -@@ -245,6 +247,4 @@ static inline void *offset_to_ptr(const - */ - #define prevent_tail_call_optimization() mb() - --#include -- - #endif /* __LINUX_COMPILER_H */ diff --git a/target/linux/generic/pending-5.10/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch b/target/linux/generic/pending-5.10/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch deleted file mode 100644 index cc9f99e8b0..0000000000 --- a/target/linux/generic/pending-5.10/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch +++ /dev/null @@ -1,57 +0,0 @@ -From: Felix Fietkau -Date: Wed, 18 Apr 2018 10:50:05 +0200 -Subject: [PATCH] MIPS: only process negative stack offsets on stack traces - -Fixes endless back traces in cases where the compiler emits a stack -pointer increase in a branch delay slot (probably for some form of -function return). - -[ 3.475442] BUG: MAX_STACK_TRACE_ENTRIES too low! -[ 3.480070] turning off the locking correctness validator. -[ 3.485521] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.14.34 #0 -[ 3.491475] Stack : 00000000 00000000 00000000 00000000 80e0fce2 00000034 00000000 00000000 -[ 3.499764] 87c3838c 80696377 8061047c 00000000 00000001 00000001 87c2d850 6534689f -[ 3.508059] 00000000 00000000 80e10000 00000000 00000000 000000cf 0000000f 00000000 -[ 3.516353] 00000000 806a0000 00076891 00000000 00000000 00000000 ffffffff 00000000 -[ 3.524648] 806c0000 00000004 80e10000 806a0000 00000003 80690000 00000000 80700000 -[ 3.532942] ... -[ 3.535362] Call Trace: -[ 3.537818] [<80010a48>] show_stack+0x58/0x100 -[ 3.542207] [<804c2f78>] dump_stack+0xe8/0x170 -[ 3.546613] [<80079f90>] save_trace+0xf0/0x110 -[ 3.551010] [<8007b1ec>] mark_lock+0x33c/0x78c -[ 3.555413] [<8007bf48>] __lock_acquire+0x2ac/0x1a08 -[ 3.560337] [<8007de60>] lock_acquire+0x64/0x8c -[ 3.564846] [<804e1570>] _raw_spin_lock_irqsave+0x54/0x78 -[ 3.570186] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.574770] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.579257] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.583839] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.588329] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.592911] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.597401] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.601983] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.606473] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.611055] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.615545] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.620125] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.624619] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.629197] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.633691] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.638269] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.642763] [<801b618c>] kernfs_notify+0x94/0xac - -Signed-off-by: Felix Fietkau ---- - ---- a/arch/mips/kernel/process.c -+++ b/arch/mips/kernel/process.c -@@ -380,6 +380,8 @@ static inline int is_sp_move_ins(union m - - if (ip->i_format.opcode == addiu_op || - ip->i_format.opcode == daddiu_op) { -+ if (ip->i_format.simmediate > 0) -+ return 0; - *frame_size = -ip->i_format.simmediate; - return 1; - } diff --git a/target/linux/generic/pending-5.10/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch b/target/linux/generic/pending-5.10/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch deleted file mode 100644 index 1adfd22e87..0000000000 --- a/target/linux/generic/pending-5.10/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch +++ /dev/null @@ -1,82 +0,0 @@ -From: Tobias Wolf -Subject: mm: Fix alloc_node_mem_map with ARCH_PFN_OFFSET calculation - -An rt288x (ralink) based router (Belkin F5D8235 v1) does not boot with any -kernel beyond version 4.3 resulting in: - -BUG: Bad page state in process swapper pfn:086ac - -bisect resulted in: - -a1c34a3bf00af2cede839879502e12dc68491ad5 is the first bad commit -commit a1c34a3bf00af2cede839879502e12dc68491ad5 -Author: Laura Abbott -Date: Thu Nov 5 18:48:46 2015 -0800 - - mm: Don't offset memmap for flatmem - - Srinivas Kandagatla reported bad page messages when trying to remove the - bottom 2MB on an ARM based IFC6410 board - - BUG: Bad page state in process swapper pfn:fffa8 - page:ef7fb500 count:0 mapcount:0 mapping: (null) index:0x0 - flags: 0x96640253(locked|error|dirty|active|arch_1|reclaim|mlocked) - page dumped because: PAGE_FLAGS_CHECK_AT_FREE flag(s) set - bad because of flags: - flags: 0x200041(locked|active|mlocked) - Modules linked in: - CPU: 0 PID: 0 Comm: swapper Not tainted 3.19.0-rc3-00007-g412f9ba-dirty -#816 - Hardware name: Qualcomm (Flattened Device Tree) - unwind_backtrace - show_stack - dump_stack - bad_page - free_pages_prepare - free_hot_cold_page - __free_pages - free_highmem_page - mem_init - start_kernel - Disabling lock debugging due to kernel taint - [...] -:040000 040000 2de013c372345fd471cd58f0553c9b38b0ef1cc4 -0a8156f848733dfa21e16c196dfb6c0a76290709 M mm - -This fix for ARM does not account ARCH_PFN_OFFSET for mem_map as later used by -page_to_pfn anymore. - -The following output was generated with two hacked in printk statements: - -printk("before %p vs. %p or %p\n", mem_map, mem_map - offset, mem_map - -(pgdat->node_start_pfn - ARCH_PFN_OFFSET)); - if (page_to_pfn(mem_map) != pgdat->node_start_pfn) - mem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET); -printk("after %p\n", mem_map); - -Output: - -[ 0.000000] before 8861b280 vs. 8861b280 or 8851b280 -[ 0.000000] after 8851b280 - -As seen in the first line mem_map with subtraction of offset does not equal the -mem_map after subtraction of ARCH_PFN_OFFSET. - -After adding the offset of ARCH_PFN_OFFSET as well to mem_map as the -previously calculated offset is zero for the named platform it is able to boot -4.4 and 4.9-rc7 again. - -Signed-off-by: Tobias Wolf ---- - ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -7107,7 +7107,7 @@ static void __ref alloc_node_mem_map(str - if (pgdat == NODE_DATA(0)) { - mem_map = NODE_DATA(0)->node_mem_map; - if (page_to_pfn(mem_map) != pgdat->node_start_pfn) -- mem_map -= offset; -+ mem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET); - } - #endif - } diff --git a/target/linux/generic/pending-5.10/130-add-linux-spidev-compatible-si3210.patch b/target/linux/generic/pending-5.10/130-add-linux-spidev-compatible-si3210.patch deleted file mode 100644 index e14a2886df..0000000000 --- a/target/linux/generic/pending-5.10/130-add-linux-spidev-compatible-si3210.patch +++ /dev/null @@ -1,18 +0,0 @@ -From: Giuseppe Lippolis -Subject: Add the linux,spidev compatible in spidev Several device in ramips have this binding in the dts - -Signed-off-by: Giuseppe Lippolis ---- - drivers/spi/spidev.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/spi/spidev.c -+++ b/drivers/spi/spidev.c -@@ -691,6 +691,7 @@ static const struct of_device_id spidev_ - { .compatible = "lwn,bk4" }, - { .compatible = "dh,dhcom-board" }, - { .compatible = "menlo,m53cpld" }, -+ { .compatible = "siliconlabs,si3210" }, - {}, - }; - MODULE_DEVICE_TABLE(of, spidev_dt_ids); diff --git a/target/linux/generic/pending-5.10/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch b/target/linux/generic/pending-5.10/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch deleted file mode 100644 index e48da41fae..0000000000 --- a/target/linux/generic/pending-5.10/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch +++ /dev/null @@ -1,78 +0,0 @@ -From: Felix Fietkau -Subject: jffs2: use .rename2 and add RENAME_WHITEOUT support - -It is required for renames on overlayfs - -Signed-off-by: Felix Fietkau ---- - ---- a/fs/jffs2/dir.c -+++ b/fs/jffs2/dir.c -@@ -609,7 +609,8 @@ static int jffs2_rmdir (struct inode *di - return ret; - } - --static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t mode, dev_t rdev) -+static int __jffs2_mknod (struct inode *dir_i, struct dentry *dentry, -+ umode_t mode, dev_t rdev, bool whiteout) - { - struct jffs2_inode_info *f, *dir_f; - struct jffs2_sb_info *c; -@@ -748,7 +749,11 @@ static int jffs2_mknod (struct inode *di - mutex_unlock(&dir_f->sem); - jffs2_complete_reservation(c); - -- d_instantiate_new(dentry, inode); -+ if (!whiteout) -+ d_instantiate_new(dentry, inode); -+ else -+ unlock_new_inode(inode); -+ - return 0; - - fail: -@@ -756,6 +761,17 @@ static int jffs2_mknod (struct inode *di - return ret; - } - -+static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t mode, dev_t rdev) -+{ -+ return __jffs2_mknod(dir_i, dentry, mode, rdev, false); -+} -+ -+static int jffs2_whiteout (struct inode *old_dir, struct dentry *old_dentry) -+{ -+ return __jffs2_mknod(old_dir, old_dentry, S_IFCHR | WHITEOUT_MODE, -+ WHITEOUT_DEV, true); -+} -+ - static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, - struct inode *new_dir_i, struct dentry *new_dentry, - unsigned int flags) -@@ -766,7 +782,7 @@ static int jffs2_rename (struct inode *o - uint8_t type; - uint32_t now; - -- if (flags & ~RENAME_NOREPLACE) -+ if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT)) - return -EINVAL; - - /* The VFS will check for us and prevent trying to rename a -@@ -832,9 +848,14 @@ static int jffs2_rename (struct inode *o - if (d_is_dir(old_dentry) && !victim_f) - inc_nlink(new_dir_i); - -- /* Unlink the original */ -- ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), -- old_dentry->d_name.name, old_dentry->d_name.len, NULL, now); -+ if (flags & RENAME_WHITEOUT) -+ /* Replace with whiteout */ -+ ret = jffs2_whiteout(old_dir_i, old_dentry); -+ else -+ /* Unlink the original */ -+ ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), -+ old_dentry->d_name.name, -+ old_dentry->d_name.len, NULL, now); - - /* We don't touch inode->i_nlink */ - diff --git a/target/linux/generic/pending-5.10/141-jffs2-add-RENAME_EXCHANGE-support.patch b/target/linux/generic/pending-5.10/141-jffs2-add-RENAME_EXCHANGE-support.patch deleted file mode 100644 index dbc72339c6..0000000000 --- a/target/linux/generic/pending-5.10/141-jffs2-add-RENAME_EXCHANGE-support.patch +++ /dev/null @@ -1,73 +0,0 @@ -From: Felix Fietkau -Subject: jffs2: add RENAME_EXCHANGE support - -Signed-off-by: Felix Fietkau ---- - ---- a/fs/jffs2/dir.c -+++ b/fs/jffs2/dir.c -@@ -779,18 +779,31 @@ static int jffs2_rename (struct inode *o - int ret; - struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb); - struct jffs2_inode_info *victim_f = NULL; -+ struct inode *fst_inode = d_inode(old_dentry); -+ struct inode *snd_inode = d_inode(new_dentry); - uint8_t type; - uint32_t now; - -- if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT)) -+ if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT|RENAME_EXCHANGE)) - return -EINVAL; - -+ if ((flags & RENAME_EXCHANGE) && (old_dir_i != new_dir_i)) { -+ if (S_ISDIR(fst_inode->i_mode) && !S_ISDIR(snd_inode->i_mode)) { -+ inc_nlink(new_dir_i); -+ drop_nlink(old_dir_i); -+ } -+ else if (!S_ISDIR(fst_inode->i_mode) && S_ISDIR(snd_inode->i_mode)) { -+ drop_nlink(new_dir_i); -+ inc_nlink(old_dir_i); -+ } -+ } -+ - /* The VFS will check for us and prevent trying to rename a - * file over a directory and vice versa, but if it's a directory, - * the VFS can't check whether the victim is empty. The filesystem - * needs to do that for itself. - */ -- if (d_really_is_positive(new_dentry)) { -+ if (d_really_is_positive(new_dentry) && !(flags & RENAME_EXCHANGE)) { - victim_f = JFFS2_INODE_INFO(d_inode(new_dentry)); - if (d_is_dir(new_dentry)) { - struct jffs2_full_dirent *fd; -@@ -825,7 +838,7 @@ static int jffs2_rename (struct inode *o - if (ret) - return ret; - -- if (victim_f) { -+ if (victim_f && !(flags & RENAME_EXCHANGE)) { - /* There was a victim. Kill it off nicely */ - if (d_is_dir(new_dentry)) - clear_nlink(d_inode(new_dentry)); -@@ -851,6 +864,12 @@ static int jffs2_rename (struct inode *o - if (flags & RENAME_WHITEOUT) - /* Replace with whiteout */ - ret = jffs2_whiteout(old_dir_i, old_dentry); -+ else if (flags & RENAME_EXCHANGE) -+ /* Replace the original */ -+ ret = jffs2_do_link(c, JFFS2_INODE_INFO(old_dir_i), -+ d_inode(new_dentry)->i_ino, type, -+ old_dentry->d_name.name, old_dentry->d_name.len, -+ now); - else - /* Unlink the original */ - ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), -@@ -882,7 +901,7 @@ static int jffs2_rename (struct inode *o - return ret; - } - -- if (d_is_dir(old_dentry)) -+ if (d_is_dir(old_dentry) && !(flags & RENAME_EXCHANGE)) - drop_nlink(old_dir_i); - - new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now); diff --git a/target/linux/generic/pending-5.10/150-bridge_allow_receiption_on_disabled_port.patch b/target/linux/generic/pending-5.10/150-bridge_allow_receiption_on_disabled_port.patch deleted file mode 100644 index 8ab4b361f0..0000000000 --- a/target/linux/generic/pending-5.10/150-bridge_allow_receiption_on_disabled_port.patch +++ /dev/null @@ -1,45 +0,0 @@ -From: Stephen Hemminger -Subject: bridge: allow receiption on disabled port - -When an ethernet device is enslaved to a bridge, and the bridge STP -detects loss of carrier (or operational state down), then normally -packet receiption is blocked. - -This breaks control applications like WPA which maybe expecting to -receive packets to negotiate to bring link up. The bridge needs to -block forwarding packets from these disabled ports, but there is no -hard requirement to not allow local packet delivery. - -Signed-off-by: Stephen Hemminger -Signed-off-by: Felix Fietkau - ---- a/net/bridge/br_input.c -+++ b/net/bridge/br_input.c -@@ -202,6 +202,9 @@ static void __br_handle_local_finish(str - /* note: already called with rcu_read_lock */ - static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb) - { -+ struct net_bridge_port *p = br_port_get_rcu(skb->dev); -+ -+ if (p->state != BR_STATE_DISABLED) - __br_handle_local_finish(skb); - - /* return 1 to signal the okfn() was called so it's ok to use the skb */ -@@ -355,6 +358,17 @@ static rx_handler_result_t br_handle_fra - - forward: - switch (p->state) { -+ case BR_STATE_DISABLED: -+ if (ether_addr_equal(p->br->dev->dev_addr, dest)) -+ skb->pkt_type = PACKET_HOST; -+ -+ if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, -+ dev_net(skb->dev), NULL, skb, skb->dev, NULL, -+ br_handle_local_finish) == 1) { -+ return RX_HANDLER_PASS; -+ } -+ break; -+ - case BR_STATE_FORWARDING: - case BR_STATE_LEARNING: - if (ether_addr_equal(p->br->dev->dev_addr, dest)) diff --git a/target/linux/generic/pending-5.10/203-kallsyms_uncompressed.patch b/target/linux/generic/pending-5.10/203-kallsyms_uncompressed.patch deleted file mode 100644 index 190ce0720d..0000000000 --- a/target/linux/generic/pending-5.10/203-kallsyms_uncompressed.patch +++ /dev/null @@ -1,119 +0,0 @@ -From: Felix Fietkau -Subject: kernel: add a config option for keeping the kallsyms table uncompressed, saving ~9kb kernel size after lzma on ar71xx - -[john@phrozen.org: added to my upstream queue 30.12.2016] -lede-commit: e0e3509b5ce2ccf93d4d67ea907613f5f7ec2eed -Signed-off-by: Felix Fietkau ---- - init/Kconfig | 11 +++++++++++ - kernel/kallsyms.c | 8 ++++++++ - scripts/kallsyms.c | 12 ++++++++++++ - scripts/link-vmlinux.sh | 4 ++++ - 4 files changed, 35 insertions(+) - ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -1401,6 +1401,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW - the unaligned access emulation. - see arch/parisc/kernel/unaligned.c for reference - -+config KALLSYMS_UNCOMPRESSED -+ bool "Keep kallsyms uncompressed" -+ depends on KALLSYMS -+ help -+ Normally kallsyms contains compressed symbols (using a token table), -+ reducing the uncompressed kernel image size. Keeping the symbol table -+ uncompressed significantly improves the size of this part in compressed -+ kernel images. -+ -+ Say N unless you need compressed kernel images to be small. -+ - config HAVE_PCSPKR_PLATFORM - bool - ---- a/kernel/kallsyms.c -+++ b/kernel/kallsyms.c -@@ -77,6 +77,11 @@ static unsigned int kallsyms_expand_symb - * For every byte on the compressed symbol data, copy the table - * entry for that byte. - */ -+#ifdef CONFIG_KALLSYMS_UNCOMPRESSED -+ memcpy(result, data + 1, len - 1); -+ result += len - 1; -+ len = 0; -+#endif - while (len) { - tptr = &kallsyms_token_table[kallsyms_token_index[*data]]; - data++; -@@ -109,6 +114,9 @@ tail: - */ - static char kallsyms_get_symbol_type(unsigned int off) - { -+#ifdef CONFIG_KALLSYMS_UNCOMPRESSED -+ return kallsyms_names[off + 1]; -+#endif - /* - * Get just the first code, look it up in the token table, - * and return the first char from this token. ---- a/scripts/kallsyms.c -+++ b/scripts/kallsyms.c -@@ -58,6 +58,7 @@ static struct addr_range percpu_range = - static struct sym_entry **table; - static unsigned int table_size, table_cnt; - static int all_symbols; -+static int uncompressed; - static int absolute_percpu; - static int base_relative; - -@@ -486,6 +487,9 @@ static void write_src(void) - - free(markers); - -+ if (uncompressed) -+ return; -+ - output_label("kallsyms_token_table"); - off = 0; - for (i = 0; i < 256; i++) { -@@ -537,6 +541,9 @@ static unsigned char *find_token(unsigne - { - int i; - -+ if (uncompressed) -+ return NULL; -+ - for (i = 0; i < len - 1; i++) { - if (str[i] == token[0] && str[i+1] == token[1]) - return &str[i]; -@@ -609,6 +616,9 @@ static void optimize_result(void) - { - int i, best; - -+ if (uncompressed) -+ return; -+ - /* using the '\0' symbol last allows compress_symbols to use standard - * fast string functions */ - for (i = 255; i >= 0; i--) { -@@ -773,6 +783,8 @@ int main(int argc, char **argv) - absolute_percpu = 1; - else if (strcmp(argv[i], "--base-relative") == 0) - base_relative = 1; -+ else if (strcmp(argv[i], "--uncompressed") == 0) -+ uncompressed = 1; - else - usage(); - } ---- a/scripts/link-vmlinux.sh -+++ b/scripts/link-vmlinux.sh -@@ -192,6 +192,10 @@ kallsyms() - kallsymopt="${kallsymopt} --base-relative" - fi - -+ if [ -n "${CONFIG_KALLSYMS_UNCOMPRESSED}" ]; then -+ kallsymopt="${kallsymopt} --uncompressed" -+ fi -+ - info KSYMS ${2} - ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2} - } diff --git a/target/linux/generic/pending-5.10/205-backtrace_module_info.patch b/target/linux/generic/pending-5.10/205-backtrace_module_info.patch deleted file mode 100644 index f1f35c9923..0000000000 --- a/target/linux/generic/pending-5.10/205-backtrace_module_info.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: Felix Fietkau -Subject: kernel: when KALLSYMS is disabled, print module address + size for matching backtrace entries - -[john@phrozen.org: felix will add this to his upstream queue] - -lede-commit 53827cdc824556cda910b23ce5030c363b8f1461 -Signed-off-by: Felix Fietkau ---- - lib/vsprintf.c | 15 +++++++++++---- - 1 file changed, 11 insertions(+), 4 deletions(-) - ---- a/lib/vsprintf.c -+++ b/lib/vsprintf.c -@@ -985,8 +985,10 @@ char *symbol_string(char *buf, char *end - struct printf_spec spec, const char *fmt) - { - unsigned long value; --#ifdef CONFIG_KALLSYMS - char sym[KSYM_SYMBOL_LEN]; -+#ifndef CONFIG_KALLSYMS -+ struct module *mod; -+ int len; - #endif - - if (fmt[1] == 'R') -@@ -1003,8 +1005,14 @@ char *symbol_string(char *buf, char *end - - return string_nocheck(buf, end, sym, spec); - #else -- return special_hex_number(buf, end, value, sizeof(void *)); -+ len = snprintf(sym, sizeof(sym), "0x%lx", value); -+ mod = __module_address(value); -+ if (mod) -+ snprintf(sym + len, sizeof(sym) - len, " [%s@%p+0x%x]", -+ mod->name, mod->core_layout.base, -+ mod->core_layout.size); - #endif -+ return string(buf, end, sym, spec); - } - - static const struct printf_spec default_str_spec = { diff --git a/target/linux/generic/pending-5.10/270-platform-mikrotik-build-bits.patch b/target/linux/generic/pending-5.10/270-platform-mikrotik-build-bits.patch deleted file mode 100644 index df738ef97b..0000000000 --- a/target/linux/generic/pending-5.10/270-platform-mikrotik-build-bits.patch +++ /dev/null @@ -1,31 +0,0 @@ -From c2deb5ef01a0ef09088832744cbace9e239a6ee0 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= -Date: Sat, 28 Mar 2020 12:11:50 +0100 -Subject: [PATCH] generic: platform/mikrotik build bits (5.4) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch adds platform/mikrotik kernel build bits - -Signed-off-by: Thibaut VARÈNE ---- - drivers/platform/Kconfig | 2 ++ - drivers/platform/Makefile | 1 + - 2 files changed, 3 insertions(+) - ---- a/drivers/platform/Kconfig -+++ b/drivers/platform/Kconfig -@@ -13,3 +13,5 @@ source "drivers/platform/chrome/Kconfig" - source "drivers/platform/mellanox/Kconfig" - - source "drivers/platform/olpc/Kconfig" -+ -+source "drivers/platform/mikrotik/Kconfig" ---- a/drivers/platform/Makefile -+++ b/drivers/platform/Makefile -@@ -9,3 +9,4 @@ obj-$(CONFIG_MIPS) += mips/ - obj-$(CONFIG_OLPC_EC) += olpc/ - obj-$(CONFIG_GOLDFISH) += goldfish/ - obj-$(CONFIG_CHROME_PLATFORMS) += chrome/ -+obj-$(CONFIG_MIKROTIK) += mikrotik/ diff --git a/target/linux/generic/pending-5.10/300-mips_expose_boot_raw.patch b/target/linux/generic/pending-5.10/300-mips_expose_boot_raw.patch deleted file mode 100644 index 706c5dee22..0000000000 --- a/target/linux/generic/pending-5.10/300-mips_expose_boot_raw.patch +++ /dev/null @@ -1,40 +0,0 @@ -From: Mark Miller -Subject: mips: expose CONFIG_BOOT_RAW - -This exposes the CONFIG_BOOT_RAW symbol in Kconfig. This is needed on -certain Broadcom chipsets running CFE in order to load the kernel. - -Signed-off-by: Mark Miller -Acked-by: Rob Landley ---- ---- a/arch/mips/Kconfig -+++ b/arch/mips/Kconfig -@@ -1085,9 +1085,6 @@ config FW_ARC - config ARCH_MAY_HAVE_PC_FDC - bool - --config BOOT_RAW -- bool -- - config CEVT_BCM1480 - bool - -@@ -3182,6 +3179,18 @@ choice - bool "Extend builtin kernel arguments with bootloader arguments" - endchoice - -+config BOOT_RAW -+ bool "Enable the kernel to be executed from the load address" -+ default n -+ help -+ Allow the kernel to be executed from the load address for -+ bootloaders which cannot read the ELF format. This places -+ a jump to start_kernel at the load address. -+ -+ If unsure, say N. -+ -+ -+ - endmenu - - config LOCKDEP_SUPPORT diff --git a/target/linux/generic/pending-5.10/305-mips_module_reloc.patch b/target/linux/generic/pending-5.10/305-mips_module_reloc.patch deleted file mode 100644 index 839ba24293..0000000000 --- a/target/linux/generic/pending-5.10/305-mips_module_reloc.patch +++ /dev/null @@ -1,371 +0,0 @@ -From: Felix Fietkau -Subject: mips: replace -mlong-calls with -mno-long-calls to make function calls faster in kernel modules to achieve this, try to - -lede-commit: 3b3d64743ba2a874df9d70cd19e242205b0a788c -Signed-off-by: Felix Fietkau ---- - arch/mips/Makefile | 5 + - arch/mips/include/asm/module.h | 5 + - arch/mips/kernel/module.c | 279 ++++++++++++++++++++++++++++++++++++++++- - 3 files changed, 284 insertions(+), 5 deletions(-) - ---- a/arch/mips/Makefile -+++ b/arch/mips/Makefile -@@ -98,8 +98,18 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin - cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely - cflags-y += -msoft-float - LDFLAGS_vmlinux += -G 0 -static -n -nostdlib -+ifdef CONFIG_64BIT - KBUILD_AFLAGS_MODULE += -mlong-calls - KBUILD_CFLAGS_MODULE += -mlong-calls -+else -+ ifdef CONFIG_DYNAMIC_FTRACE -+ KBUILD_AFLAGS_MODULE += -mlong-calls -+ KBUILD_CFLAGS_MODULE += -mlong-calls -+ else -+ KBUILD_AFLAGS_MODULE += -mno-long-calls -+ KBUILD_CFLAGS_MODULE += -mno-long-calls -+ endif -+endif - - ifeq ($(CONFIG_RELOCATABLE),y) - LDFLAGS_vmlinux += --emit-relocs ---- a/arch/mips/include/asm/module.h -+++ b/arch/mips/include/asm/module.h -@@ -12,6 +12,11 @@ struct mod_arch_specific { - const struct exception_table_entry *dbe_start; - const struct exception_table_entry *dbe_end; - struct mips_hi16 *r_mips_hi16_list; -+ -+ void *phys_plt_tbl; -+ void *virt_plt_tbl; -+ unsigned int phys_plt_offset; -+ unsigned int virt_plt_offset; - }; - - typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */ ---- a/arch/mips/kernel/module.c -+++ b/arch/mips/kernel/module.c -@@ -31,14 +31,221 @@ struct mips_hi16 { - static LIST_HEAD(dbe_list); - static DEFINE_SPINLOCK(dbe_lock); - --#ifdef MODULE_START -+/* -+ * Get the potential max trampolines size required of the init and -+ * non-init sections. Only used if we cannot find enough contiguous -+ * physically mapped memory to put the module into. -+ */ -+static unsigned int -+get_plt_size(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, -+ const char *secstrings, unsigned int symindex, bool is_init) -+{ -+ unsigned long ret = 0; -+ unsigned int i, j; -+ Elf_Sym *syms; -+ -+ /* Everything marked ALLOC (this includes the exported symbols) */ -+ for (i = 1; i < hdr->e_shnum; ++i) { -+ unsigned int info = sechdrs[i].sh_info; -+ -+ if (sechdrs[i].sh_type != SHT_REL -+ && sechdrs[i].sh_type != SHT_RELA) -+ continue; -+ -+ /* Not a valid relocation section? */ -+ if (info >= hdr->e_shnum) -+ continue; -+ -+ /* Don't bother with non-allocated sections */ -+ if (!(sechdrs[info].sh_flags & SHF_ALLOC)) -+ continue; -+ -+ /* If it's called *.init*, and we're not init, we're -+ not interested */ -+ if ((strstr(secstrings + sechdrs[i].sh_name, ".init") != 0) -+ != is_init) -+ continue; -+ -+ syms = (Elf_Sym *) sechdrs[symindex].sh_addr; -+ if (sechdrs[i].sh_type == SHT_REL) { -+ Elf_Mips_Rel *rel = (void *) sechdrs[i].sh_addr; -+ unsigned int size = sechdrs[i].sh_size / sizeof(*rel); -+ -+ for (j = 0; j < size; ++j) { -+ Elf_Sym *sym; -+ -+ if (ELF_MIPS_R_TYPE(rel[j]) != R_MIPS_26) -+ continue; -+ -+ sym = syms + ELF_MIPS_R_SYM(rel[j]); -+ if (!is_init && sym->st_shndx != SHN_UNDEF) -+ continue; -+ -+ ret += 4 * sizeof(int); -+ } -+ } else { -+ Elf_Mips_Rela *rela = (void *) sechdrs[i].sh_addr; -+ unsigned int size = sechdrs[i].sh_size / sizeof(*rela); -+ -+ for (j = 0; j < size; ++j) { -+ Elf_Sym *sym; -+ -+ if (ELF_MIPS_R_TYPE(rela[j]) != R_MIPS_26) -+ continue; -+ -+ sym = syms + ELF_MIPS_R_SYM(rela[j]); -+ if (!is_init && sym->st_shndx != SHN_UNDEF) -+ continue; -+ -+ ret += 4 * sizeof(int); -+ } -+ } -+ } -+ -+ return ret; -+} -+ -+#ifndef MODULE_START -+static void *alloc_phys(unsigned long size) -+{ -+ unsigned order; -+ struct page *page; -+ struct page *p; -+ -+ size = PAGE_ALIGN(size); -+ order = get_order(size); -+ -+ page = alloc_pages(GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN | -+ __GFP_THISNODE, order); -+ if (!page) -+ return NULL; -+ -+ split_page(page, order); -+ -+ /* mark all pages except for the last one */ -+ for (p = page; p + 1 < page + (size >> PAGE_SHIFT); ++p) -+ set_bit(PG_owner_priv_1, &p->flags); -+ -+ for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p) -+ __free_page(p); -+ -+ return page_address(page); -+} -+#endif -+ -+static void free_phys(void *ptr) -+{ -+ struct page *page; -+ bool free; -+ -+ page = virt_to_page(ptr); -+ do { -+ free = test_and_clear_bit(PG_owner_priv_1, &page->flags); -+ __free_page(page); -+ page++; -+ } while (free); -+} -+ -+ - void *module_alloc(unsigned long size) - { -+#ifdef MODULE_START - return __vmalloc_node_range(size, 1, MODULE_START, MODULE_END, - GFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE, - __builtin_return_address(0)); -+#else -+ void *ptr; -+ -+ if (size == 0) -+ return NULL; -+ -+ ptr = alloc_phys(size); -+ -+ /* If we failed to allocate physically contiguous memory, -+ * fall back to regular vmalloc. The module loader code will -+ * create jump tables to handle long jumps */ -+ if (!ptr) -+ return vmalloc(size); -+ -+ return ptr; -+#endif - } -+ -+static inline bool is_phys_addr(void *ptr) -+{ -+#ifdef CONFIG_64BIT -+ return (KSEGX((unsigned long)ptr) == CKSEG0); -+#else -+ return (KSEGX(ptr) == KSEG0); - #endif -+} -+ -+/* Free memory returned from module_alloc */ -+void module_memfree(void *module_region) -+{ -+ if (is_phys_addr(module_region)) -+ free_phys(module_region); -+ else -+ vfree(module_region); -+} -+ -+static void *__module_alloc(int size, bool phys) -+{ -+ void *ptr; -+ -+ if (phys) -+ ptr = kmalloc(size, GFP_KERNEL); -+ else -+ ptr = vmalloc(size); -+ return ptr; -+} -+ -+static void __module_free(void *ptr) -+{ -+ if (is_phys_addr(ptr)) -+ kfree(ptr); -+ else -+ vfree(ptr); -+} -+ -+int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, -+ char *secstrings, struct module *mod) -+{ -+ unsigned int symindex = 0; -+ unsigned int core_size, init_size; -+ int i; -+ -+ mod->arch.phys_plt_offset = 0; -+ mod->arch.virt_plt_offset = 0; -+ mod->arch.phys_plt_tbl = NULL; -+ mod->arch.virt_plt_tbl = NULL; -+ -+ if (IS_ENABLED(CONFIG_64BIT)) -+ return 0; -+ -+ for (i = 1; i < hdr->e_shnum; i++) -+ if (sechdrs[i].sh_type == SHT_SYMTAB) -+ symindex = i; -+ -+ core_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false); -+ init_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true); -+ -+ if ((core_size + init_size) == 0) -+ return 0; -+ -+ mod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1); -+ if (!mod->arch.phys_plt_tbl) -+ return -ENOMEM; -+ -+ mod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0); -+ if (!mod->arch.virt_plt_tbl) { -+ __module_free(mod->arch.phys_plt_tbl); -+ mod->arch.phys_plt_tbl = NULL; -+ return -ENOMEM; -+ } -+ -+ return 0; -+} - - static int apply_r_mips_none(struct module *me, u32 *location, - u32 base, Elf_Addr v, bool rela) -@@ -54,9 +261,40 @@ static int apply_r_mips_32(struct module - return 0; - } - -+static Elf_Addr add_plt_entry_to(unsigned *plt_offset, -+ void *start, Elf_Addr v) -+{ -+ unsigned *tramp = start + *plt_offset; -+ *plt_offset += 4 * sizeof(int); -+ -+ /* adjust carry for addiu */ -+ if (v & 0x00008000) -+ v += 0x10000; -+ -+ tramp[0] = 0x3c190000 | (v >> 16); /* lui t9, hi16 */ -+ tramp[1] = 0x27390000 | (v & 0xffff); /* addiu t9, t9, lo16 */ -+ tramp[2] = 0x03200008; /* jr t9 */ -+ tramp[3] = 0x00000000; /* nop */ -+ -+ return (Elf_Addr) tramp; -+} -+ -+static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v) -+{ -+ if (is_phys_addr(location)) -+ return add_plt_entry_to(&me->arch.phys_plt_offset, -+ me->arch.phys_plt_tbl, v); -+ else -+ return add_plt_entry_to(&me->arch.virt_plt_offset, -+ me->arch.virt_plt_tbl, v); -+ -+} -+ - static int apply_r_mips_26(struct module *me, u32 *location, - u32 base, Elf_Addr v, bool rela) - { -+ u32 ofs = base & 0x03ffffff; -+ - if (v % 4) { - pr_err("module %s: dangerous R_MIPS_26 relocation\n", - me->name); -@@ -64,13 +302,17 @@ static int apply_r_mips_26(struct module - } - - if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { -- pr_err("module %s: relocation overflow\n", -- me->name); -- return -ENOEXEC; -+ v = add_plt_entry(me, location, v + (ofs << 2)); -+ if (!v) { -+ pr_err("module %s: relocation overflow\n", -+ me->name); -+ return -ENOEXEC; -+ } -+ ofs = 0; - } - - *location = (*location & ~0x03ffffff) | -- ((base + (v >> 2)) & 0x03ffffff); -+ ((ofs + (v >> 2)) & 0x03ffffff); - - return 0; - } -@@ -446,9 +688,36 @@ int module_finalize(const Elf_Ehdr *hdr, - list_add(&me->arch.dbe_list, &dbe_list); - spin_unlock_irq(&dbe_lock); - } -+ -+ /* Get rid of the fixup trampoline if we're running the module -+ * from physically mapped address space */ -+ if (me->arch.phys_plt_offset == 0) { -+ __module_free(me->arch.phys_plt_tbl); -+ me->arch.phys_plt_tbl = NULL; -+ } -+ if (me->arch.virt_plt_offset == 0) { -+ __module_free(me->arch.virt_plt_tbl); -+ me->arch.virt_plt_tbl = NULL; -+ } -+ - return 0; - } - -+void module_arch_freeing_init(struct module *mod) -+{ -+ if (mod->state == MODULE_STATE_LIVE) -+ return; -+ -+ if (mod->arch.phys_plt_tbl) { -+ __module_free(mod->arch.phys_plt_tbl); -+ mod->arch.phys_plt_tbl = NULL; -+ } -+ if (mod->arch.virt_plt_tbl) { -+ __module_free(mod->arch.virt_plt_tbl); -+ mod->arch.virt_plt_tbl = NULL; -+ } -+} -+ - void module_arch_cleanup(struct module *mod) - { - spin_lock_irq(&dbe_lock); diff --git a/target/linux/generic/pending-5.10/307-mips_highmem_offset.patch b/target/linux/generic/pending-5.10/307-mips_highmem_offset.patch deleted file mode 100644 index e1ada22f34..0000000000 --- a/target/linux/generic/pending-5.10/307-mips_highmem_offset.patch +++ /dev/null @@ -1,19 +0,0 @@ -From: Felix Fietkau -Subject: kernel: adjust mips highmem offset to avoid the need for -mlong-calls on systems with >256M RAM - -Signed-off-by: Felix Fietkau ---- - arch/mips/include/asm/mach-generic/spaces.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/mips/include/asm/mach-generic/spaces.h -+++ b/arch/mips/include/asm/mach-generic/spaces.h -@@ -54,7 +54,7 @@ - * Memory above this physical address will be considered highmem. - */ - #ifndef HIGHMEM_START --#define HIGHMEM_START _AC(0x20000000, UL) -+#define HIGHMEM_START _AC(0x10000000, UL) - #endif - - #endif /* CONFIG_32BIT */ diff --git a/target/linux/generic/pending-5.10/308-mips32r2_tune.patch b/target/linux/generic/pending-5.10/308-mips32r2_tune.patch deleted file mode 100644 index bbea947382..0000000000 --- a/target/linux/generic/pending-5.10/308-mips32r2_tune.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: Felix Fietkau -Subject: kernel: add -mtune=34kc to MIPS CFLAGS when building for mips32r2 - -This provides a good tradeoff across at least 24Kc-74Kc, while also -producing smaller code. - -Signed-off-by: Felix Fietkau ---- - arch/mips/Makefile | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/mips/Makefile -+++ b/arch/mips/Makefile -@@ -174,7 +174,7 @@ cflags-$(CONFIG_CPU_VR41XX) += -march=r4 - cflags-$(CONFIG_CPU_R4X00) += -march=r4600 -Wa,--trap - cflags-$(CONFIG_CPU_TX49XX) += -march=r4600 -Wa,--trap - cflags-$(CONFIG_CPU_MIPS32_R1) += -march=mips32 -Wa,--trap --cflags-$(CONFIG_CPU_MIPS32_R2) += -march=mips32r2 -Wa,--trap -+cflags-$(CONFIG_CPU_MIPS32_R2) += -march=mips32r2 -mtune=34kc -Wa,--trap - cflags-$(CONFIG_CPU_MIPS32_R5) += -march=mips32r5 -Wa,--trap -modd-spreg - cflags-$(CONFIG_CPU_MIPS32_R6) += -march=mips32r6 -Wa,--trap -modd-spreg - cflags-$(CONFIG_CPU_MIPS64_R1) += -march=mips64 -Wa,--trap diff --git a/target/linux/generic/pending-5.10/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch b/target/linux/generic/pending-5.10/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch deleted file mode 100644 index 794f027f18..0000000000 --- a/target/linux/generic/pending-5.10/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch +++ /dev/null @@ -1,140 +0,0 @@ -From 87ec87c2ad615c1a177cd08ef5fa29fc739f6e50 Mon Sep 17 00:00:00 2001 -From: Hauke Mehrtens -Date: Sun, 23 Dec 2018 18:06:53 +0100 -Subject: [PATCH] MIPS: Add CPU option reporting to /proc/cpuinfo - -Many MIPS CPUs have optional CPU features which are not activates for -all CPU cores. Print the CPU options which are implemented in the core -in /proc/cpuinfo. This makes it possible to see what features are -supported and which are not supported. This should cover all standard -MIPS extensions, before it only printed information about the main MIPS -ASEs. - -Signed-off-by: Hauke Mehrtens ---- - arch/mips/kernel/proc.c | 116 ++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 116 insertions(+) - ---- a/arch/mips/kernel/proc.c -+++ b/arch/mips/kernel/proc.c -@@ -138,6 +138,120 @@ static int show_cpuinfo(struct seq_file - seq_printf(m, "micromips kernel\t: %s\n", - (read_c0_config3() & MIPS_CONF3_ISA_OE) ? "yes" : "no"); - } -+ -+ seq_printf(m, "Options implemented\t:"); -+ if (cpu_has_tlb) -+ seq_printf(m, "%s", " tlb"); -+ if (cpu_has_ftlb) -+ seq_printf(m, "%s", " ftlb"); -+ if (cpu_has_tlbinv) -+ seq_printf(m, "%s", " tlbinv"); -+ if (cpu_has_segments) -+ seq_printf(m, "%s", " segments"); -+ if (cpu_has_rixiex) -+ seq_printf(m, "%s", " rixiex"); -+ if (cpu_has_ldpte) -+ seq_printf(m, "%s", " ldpte"); -+ if (cpu_has_maar) -+ seq_printf(m, "%s", " maar"); -+ if (cpu_has_rw_llb) -+ seq_printf(m, "%s", " rw_llb"); -+ if (cpu_has_4kex) -+ seq_printf(m, "%s", " 4kex"); -+ if (cpu_has_3k_cache) -+ seq_printf(m, "%s", " 3k_cache"); -+ if (cpu_has_4k_cache) -+ seq_printf(m, "%s", " 4k_cache"); -+ if (cpu_has_6k_cache) -+ seq_printf(m, "%s", " 6k_cache"); -+ if (cpu_has_8k_cache) -+ seq_printf(m, "%s", " 8k_cache"); -+ if (cpu_has_tx39_cache) -+ seq_printf(m, "%s", " tx39_cache"); -+ if (cpu_has_octeon_cache) -+ seq_printf(m, "%s", " octeon_cache"); -+ if (cpu_has_fpu) -+ seq_printf(m, "%s", " fpu"); -+ if (cpu_has_32fpr) -+ seq_printf(m, "%s", " 32fpr"); -+ if (cpu_has_cache_cdex_p) -+ seq_printf(m, "%s", " cache_cdex_p"); -+ if (cpu_has_cache_cdex_s) -+ seq_printf(m, "%s", " cache_cdex_s"); -+ if (cpu_has_prefetch) -+ seq_printf(m, "%s", " prefetch"); -+ if (cpu_has_mcheck) -+ seq_printf(m, "%s", " mcheck"); -+ if (cpu_has_ejtag) -+ seq_printf(m, "%s", " ejtag"); -+ if (cpu_has_llsc) -+ seq_printf(m, "%s", " llsc"); -+ if (cpu_has_guestctl0ext) -+ seq_printf(m, "%s", " guestctl0ext"); -+ if (cpu_has_guestctl1) -+ seq_printf(m, "%s", " guestctl1"); -+ if (cpu_has_guestctl2) -+ seq_printf(m, "%s", " guestctl2"); -+ if (cpu_has_guestid) -+ seq_printf(m, "%s", " guestid"); -+ if (cpu_has_drg) -+ seq_printf(m, "%s", " drg"); -+ if (cpu_has_rixi) -+ seq_printf(m, "%s", " rixi"); -+ if (cpu_has_lpa) -+ seq_printf(m, "%s", " lpa"); -+ if (cpu_has_mvh) -+ seq_printf(m, "%s", " mvh"); -+ if (cpu_has_vtag_icache) -+ seq_printf(m, "%s", " vtag_icache"); -+ if (cpu_has_dc_aliases) -+ seq_printf(m, "%s", " dc_aliases"); -+ if (cpu_has_ic_fills_f_dc) -+ seq_printf(m, "%s", " ic_fills_f_dc"); -+ if (cpu_has_pindexed_dcache) -+ seq_printf(m, "%s", " pindexed_dcache"); -+ if (cpu_has_userlocal) -+ seq_printf(m, "%s", " userlocal"); -+ if (cpu_has_nofpuex) -+ seq_printf(m, "%s", " nofpuex"); -+ if (cpu_has_vint) -+ seq_printf(m, "%s", " vint"); -+ if (cpu_has_veic) -+ seq_printf(m, "%s", " veic"); -+ if (cpu_has_inclusive_pcaches) -+ seq_printf(m, "%s", " inclusive_pcaches"); -+ if (cpu_has_perf_cntr_intr_bit) -+ seq_printf(m, "%s", " perf_cntr_intr_bit"); -+ if (cpu_has_ufr) -+ seq_printf(m, "%s", " ufr"); -+ if (cpu_has_fre) -+ seq_printf(m, "%s", " fre"); -+ if (cpu_has_cdmm) -+ seq_printf(m, "%s", " cdmm"); -+ if (cpu_has_small_pages) -+ seq_printf(m, "%s", " small_pages"); -+ if (cpu_has_nan_legacy) -+ seq_printf(m, "%s", " nan_legacy"); -+ if (cpu_has_nan_2008) -+ seq_printf(m, "%s", " nan_2008"); -+ if (cpu_has_ebase_wg) -+ seq_printf(m, "%s", " ebase_wg"); -+ if (cpu_has_badinstr) -+ seq_printf(m, "%s", " badinstr"); -+ if (cpu_has_badinstrp) -+ seq_printf(m, "%s", " badinstrp"); -+ if (cpu_has_contextconfig) -+ seq_printf(m, "%s", " contextconfig"); -+ if (cpu_has_perf) -+ seq_printf(m, "%s", " perf"); -+ if (cpu_has_shared_ftlb_ram) -+ seq_printf(m, "%s", " shared_ftlb_ram"); -+ if (cpu_has_shared_ftlb_entries) -+ seq_printf(m, "%s", " shared_ftlb_entries"); -+ if (cpu_has_mipsmt_pertccounters) -+ seq_printf(m, "%s", " mipsmt_pertccounters"); -+ seq_printf(m, "\n"); -+ - seq_printf(m, "shadow register sets\t: %d\n", - cpu_data[n].srsets); - seq_printf(m, "kscratch registers\t: %d\n", diff --git a/target/linux/generic/pending-5.10/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch b/target/linux/generic/pending-5.10/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch deleted file mode 100644 index 2808c95322..0000000000 --- a/target/linux/generic/pending-5.10/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch +++ /dev/null @@ -1,281 +0,0 @@ -From: Yousong Zhou -Subject: MIPS: kexec: Accept command line parameters from userspace. - -Signed-off-by: Yousong Zhou ---- - arch/mips/kernel/machine_kexec.c | 153 +++++++++++++++++++++++++++++++----- - arch/mips/kernel/machine_kexec.h | 20 +++++ - arch/mips/kernel/relocate_kernel.S | 21 +++-- - 3 files changed, 167 insertions(+), 27 deletions(-) - create mode 100644 arch/mips/kernel/machine_kexec.h - ---- a/arch/mips/kernel/machine_kexec.c -+++ b/arch/mips/kernel/machine_kexec.c -@@ -9,14 +9,11 @@ - #include - #include - -+#include - #include - #include -- --extern const unsigned char relocate_new_kernel[]; --extern const size_t relocate_new_kernel_size; -- --extern unsigned long kexec_start_address; --extern unsigned long kexec_indirection_page; -+#include -+#include "machine_kexec.h" - - static unsigned long reboot_code_buffer; - -@@ -30,6 +27,101 @@ void (*_crash_smp_send_stop)(void) = NUL - void (*_machine_kexec_shutdown)(void) = NULL; - void (*_machine_crash_shutdown)(struct pt_regs *regs) = NULL; - -+static void machine_kexec_print_args(void) -+{ -+ unsigned long argc = (int)kexec_args[0]; -+ int i; -+ -+ pr_info("kexec_args[0] (argc): %lu\n", argc); -+ pr_info("kexec_args[1] (argv): %p\n", (void *)kexec_args[1]); -+ pr_info("kexec_args[2] (env ): %p\n", (void *)kexec_args[2]); -+ pr_info("kexec_args[3] (desc): %p\n", (void *)kexec_args[3]); -+ -+ for (i = 0; i < argc; i++) { -+ pr_info("kexec_argv[%d] = %p, %s\n", -+ i, kexec_argv[i], kexec_argv[i]); -+ } -+} -+ -+static void machine_kexec_init_argv(struct kimage *image) -+{ -+ void __user *buf = NULL; -+ size_t bufsz; -+ size_t size; -+ int i; -+ -+ bufsz = 0; -+ for (i = 0; i < image->nr_segments; i++) { -+ struct kexec_segment *seg; -+ -+ seg = &image->segment[i]; -+ if (seg->bufsz < 6) -+ continue; -+ -+ if (strncmp((char *) seg->buf, "kexec ", 6)) -+ continue; -+ -+ buf = seg->buf; -+ bufsz = seg->bufsz; -+ break; -+ } -+ -+ if (!buf) -+ return; -+ -+ size = KEXEC_COMMAND_LINE_SIZE; -+ size = min(size, bufsz); -+ if (size < bufsz) -+ pr_warn("kexec command line truncated to %zd bytes\n", size); -+ -+ /* Copy to kernel space */ -+ if (copy_from_user(kexec_argv_buf, buf, size)) -+ pr_warn("kexec command line copy to kernel space failed\n"); -+ -+ kexec_argv_buf[size - 1] = 0; -+} -+ -+static void machine_kexec_parse_argv(struct kimage *image) -+{ -+ char *reboot_code_buffer; -+ int reloc_delta; -+ char *ptr; -+ int argc; -+ int i; -+ -+ ptr = kexec_argv_buf; -+ argc = 0; -+ -+ /* -+ * convert command line string to array of parameters -+ * (as bootloader does). -+ */ -+ while (ptr && *ptr && (KEXEC_MAX_ARGC > argc)) { -+ if (*ptr == ' ') { -+ *ptr++ = '\0'; -+ continue; -+ } -+ -+ kexec_argv[argc++] = ptr; -+ ptr = strchr(ptr, ' '); -+ } -+ -+ if (!argc) -+ return; -+ -+ kexec_args[0] = argc; -+ kexec_args[1] = (unsigned long)kexec_argv; -+ kexec_args[2] = 0; -+ kexec_args[3] = 0; -+ -+ reboot_code_buffer = page_address(image->control_code_page); -+ reloc_delta = reboot_code_buffer - (char *)kexec_relocate_new_kernel; -+ -+ kexec_args[1] += reloc_delta; -+ for (i = 0; i < argc; i++) -+ kexec_argv[i] += reloc_delta; -+} -+ - static void kexec_image_info(const struct kimage *kimage) - { - unsigned long i; -@@ -99,6 +191,18 @@ machine_kexec_prepare(struct kimage *kim - #endif - - kexec_image_info(kimage); -+ /* -+ * Whenever arguments passed from kexec-tools, Init the arguments as -+ * the original ones to try avoiding booting failure. -+ */ -+ -+ kexec_args[0] = fw_arg0; -+ kexec_args[1] = fw_arg1; -+ kexec_args[2] = fw_arg2; -+ kexec_args[3] = fw_arg3; -+ -+ machine_kexec_init_argv(kimage); -+ machine_kexec_parse_argv(kimage); - - if (_machine_kexec_prepare) - return _machine_kexec_prepare(kimage); -@@ -161,7 +265,7 @@ machine_crash_shutdown(struct pt_regs *r - void kexec_nonboot_cpu_jump(void) - { - local_flush_icache_range((unsigned long)relocated_kexec_smp_wait, -- reboot_code_buffer + relocate_new_kernel_size); -+ reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE); - - relocated_kexec_smp_wait(NULL); - } -@@ -199,7 +303,7 @@ void kexec_reboot(void) - * machine_kexec() CPU. - */ - local_flush_icache_range(reboot_code_buffer, -- reboot_code_buffer + relocate_new_kernel_size); -+ reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE); - - do_kexec = (void *)reboot_code_buffer; - do_kexec(); -@@ -212,10 +316,12 @@ machine_kexec(struct kimage *image) - unsigned long *ptr; - - reboot_code_buffer = -- (unsigned long)page_address(image->control_code_page); -+ (unsigned long)page_address(image->control_code_page); -+ pr_info("reboot_code_buffer = %p\n", (void *)reboot_code_buffer); - - kexec_start_address = - (unsigned long) phys_to_virt(image->start); -+ pr_info("kexec_start_address = %p\n", (void *)kexec_start_address); - - if (image->type == KEXEC_TYPE_DEFAULT) { - kexec_indirection_page = -@@ -223,9 +329,19 @@ machine_kexec(struct kimage *image) - } else { - kexec_indirection_page = (unsigned long)&image->head; - } -+ pr_info("kexec_indirection_page = %p\n", (void *)kexec_indirection_page); - -- memcpy((void*)reboot_code_buffer, relocate_new_kernel, -- relocate_new_kernel_size); -+ pr_info("Where is memcpy: %p\n", memcpy); -+ pr_info("kexec_relocate_new_kernel = %p, kexec_relocate_new_kernel_end = %p\n", -+ (void *)kexec_relocate_new_kernel, &kexec_relocate_new_kernel_end); -+ pr_info("Copy %lu bytes from %p to %p\n", KEXEC_RELOCATE_NEW_KERNEL_SIZE, -+ (void *)kexec_relocate_new_kernel, (void *)reboot_code_buffer); -+ memcpy((void*)reboot_code_buffer, kexec_relocate_new_kernel, -+ KEXEC_RELOCATE_NEW_KERNEL_SIZE); -+ -+ pr_info("Before _print_args().\n"); -+ machine_kexec_print_args(); -+ pr_info("Before eval loop.\n"); - - /* - * The generic kexec code builds a page list with physical -@@ -256,7 +372,7 @@ machine_kexec(struct kimage *image) - #ifdef CONFIG_SMP - /* All secondary cpus now may jump to kexec_wait cycle */ - relocated_kexec_smp_wait = reboot_code_buffer + -- (void *)(kexec_smp_wait - relocate_new_kernel); -+ (void *)(kexec_smp_wait - kexec_relocate_new_kernel); - smp_wmb(); - atomic_set(&kexec_ready_to_reboot, 1); - #endif ---- /dev/null -+++ b/arch/mips/kernel/machine_kexec.h -@@ -0,0 +1,20 @@ -+#ifndef _MACHINE_KEXEC_H -+#define _MACHINE_KEXEC_H -+ -+#ifndef __ASSEMBLY__ -+extern const unsigned char kexec_relocate_new_kernel[]; -+extern unsigned long kexec_relocate_new_kernel_end; -+extern unsigned long kexec_start_address; -+extern unsigned long kexec_indirection_page; -+ -+extern char kexec_argv_buf[]; -+extern char *kexec_argv[]; -+ -+#define KEXEC_RELOCATE_NEW_KERNEL_SIZE ((unsigned long)&kexec_relocate_new_kernel_end - (unsigned long)kexec_relocate_new_kernel) -+#endif /* !__ASSEMBLY__ */ -+ -+#define KEXEC_COMMAND_LINE_SIZE 256 -+#define KEXEC_ARGV_SIZE (KEXEC_COMMAND_LINE_SIZE / 16) -+#define KEXEC_MAX_ARGC (KEXEC_ARGV_SIZE / sizeof(long)) -+ -+#endif ---- a/arch/mips/kernel/relocate_kernel.S -+++ b/arch/mips/kernel/relocate_kernel.S -@@ -10,8 +10,9 @@ - #include - #include - #include -+#include "machine_kexec.h" - --LEAF(relocate_new_kernel) -+LEAF(kexec_relocate_new_kernel) - PTR_L a0, arg0 - PTR_L a1, arg1 - PTR_L a2, arg2 -@@ -96,7 +97,7 @@ done: - #endif - /* jump to kexec_start_address */ - j s1 -- END(relocate_new_kernel) -+ END(kexec_relocate_new_kernel) - - #ifdef CONFIG_SMP - /* -@@ -182,9 +183,15 @@ kexec_indirection_page: - PTR 0 - .size kexec_indirection_page, PTRSIZE - --relocate_new_kernel_end: -+kexec_argv_buf: -+ EXPORT(kexec_argv_buf) -+ .skip KEXEC_COMMAND_LINE_SIZE -+ .size kexec_argv_buf, KEXEC_COMMAND_LINE_SIZE -+ -+kexec_argv: -+ EXPORT(kexec_argv) -+ .skip KEXEC_ARGV_SIZE -+ .size kexec_argv, KEXEC_ARGV_SIZE - --relocate_new_kernel_size: -- EXPORT(relocate_new_kernel_size) -- PTR relocate_new_kernel_end - relocate_new_kernel -- .size relocate_new_kernel_size, PTRSIZE -+kexec_relocate_new_kernel_end: -+ EXPORT(kexec_relocate_new_kernel_end) diff --git a/target/linux/generic/pending-5.10/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch b/target/linux/generic/pending-5.10/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch deleted file mode 100644 index 6792a66f8a..0000000000 --- a/target/linux/generic/pending-5.10/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 66770a004afe10df11d3902e16eaa0c2c39436bb Mon Sep 17 00:00:00 2001 -From: Pawel Dembicki -Date: Fri, 24 May 2019 17:56:19 +0200 -Subject: [PATCH] powerpc: Enable kernel XZ compression option on PPC_85xx - -Enable kernel XZ compression option on PPC_85xx. Tested with -simpleImage on TP-Link TL-WDR4900 (Freescale P1014 processor). - -Suggested-by: Christian Lamparter -Signed-off-by: Pawel Dembicki ---- - arch/powerpc/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/powerpc/Kconfig -+++ b/arch/powerpc/Kconfig -@@ -214,7 +214,7 @@ config PPC - select HAVE_KERNEL_GZIP - select HAVE_KERNEL_LZMA if DEFAULT_UIMAGE - select HAVE_KERNEL_LZO if DEFAULT_UIMAGE -- select HAVE_KERNEL_XZ if PPC_BOOK3S || 44x -+ select HAVE_KERNEL_XZ if PPC_BOOK3S || 44x || PPC_85xx - select HAVE_KPROBES - select HAVE_KPROBES_ON_FTRACE - select HAVE_KRETPROBES diff --git a/target/linux/generic/pending-5.10/400-mtd-mtdsplit-support.patch b/target/linux/generic/pending-5.10/400-mtd-mtdsplit-support.patch deleted file mode 100644 index f45ca72925..0000000000 --- a/target/linux/generic/pending-5.10/400-mtd-mtdsplit-support.patch +++ /dev/null @@ -1,315 +0,0 @@ ---- a/drivers/mtd/Kconfig -+++ b/drivers/mtd/Kconfig -@@ -12,6 +12,25 @@ menuconfig MTD - - if MTD - -+menu "libreCMC specific MTD options" -+ -+config MTD_ROOTFS_ROOT_DEV -+ bool "Automatically set 'rootfs' partition to be root filesystem" -+ default y -+ -+config MTD_SPLIT_FIRMWARE -+ bool "Automatically split firmware partition for kernel+rootfs" -+ default y -+ -+config MTD_SPLIT_FIRMWARE_NAME -+ string "Firmware partition name" -+ depends on MTD_SPLIT_FIRMWARE -+ default "firmware" -+ -+source "drivers/mtd/mtdsplit/Kconfig" -+ -+endmenu -+ - config MTD_TESTS - tristate "MTD tests support (DANGEROUS)" - depends on m ---- a/drivers/mtd/mtdpart.c -+++ b/drivers/mtd/mtdpart.c -@@ -15,11 +15,13 @@ - #include - #include - #include -+#include - #include - #include - #include - - #include "mtdcore.h" -+#include "mtdsplit/mtdsplit.h" - - /* - * MTD methods which simply translate the effective address and pass through -@@ -237,6 +239,147 @@ static int mtd_add_partition_attrs(struc - return ret; - } - -+static DEFINE_SPINLOCK(part_parser_lock); -+static LIST_HEAD(part_parsers); -+ -+static struct mtd_part_parser *mtd_part_parser_get(const char *name) -+{ -+ struct mtd_part_parser *p, *ret = NULL; -+ -+ spin_lock(&part_parser_lock); -+ -+ list_for_each_entry(p, &part_parsers, list) -+ if (!strcmp(p->name, name) && try_module_get(p->owner)) { -+ ret = p; -+ break; -+ } -+ -+ spin_unlock(&part_parser_lock); -+ -+ return ret; -+} -+ -+static inline void mtd_part_parser_put(const struct mtd_part_parser *p) -+{ -+ module_put(p->owner); -+} -+ -+static struct mtd_part_parser * -+get_partition_parser_by_type(enum mtd_parser_type type, -+ struct mtd_part_parser *start) -+{ -+ struct mtd_part_parser *p, *ret = NULL; -+ -+ spin_lock(&part_parser_lock); -+ -+ p = list_prepare_entry(start, &part_parsers, list); -+ if (start) -+ mtd_part_parser_put(start); -+ -+ list_for_each_entry_continue(p, &part_parsers, list) { -+ if (p->type == type && try_module_get(p->owner)) { -+ ret = p; -+ break; -+ } -+ } -+ -+ spin_unlock(&part_parser_lock); -+ -+ return ret; -+} -+ -+static int parse_mtd_partitions_by_type(struct mtd_info *master, -+ enum mtd_parser_type type, -+ const struct mtd_partition **pparts, -+ struct mtd_part_parser_data *data) -+{ -+ struct mtd_part_parser *prev = NULL; -+ int ret = 0; -+ -+ while (1) { -+ struct mtd_part_parser *parser; -+ -+ parser = get_partition_parser_by_type(type, prev); -+ if (!parser) -+ break; -+ -+ ret = (*parser->parse_fn)(master, pparts, data); -+ -+ if (ret > 0) { -+ mtd_part_parser_put(parser); -+ printk(KERN_NOTICE -+ "%d %s partitions found on MTD device %s\n", -+ ret, parser->name, master->name); -+ break; -+ } -+ -+ prev = parser; -+ } -+ -+ return ret; -+} -+ -+static int -+run_parsers_by_type(struct mtd_info *child, enum mtd_parser_type type) -+{ -+ struct mtd_partition *parts; -+ int nr_parts; -+ int i; -+ -+ nr_parts = parse_mtd_partitions_by_type(child, type, (const struct mtd_partition **)&parts, -+ NULL); -+ if (nr_parts <= 0) -+ return nr_parts; -+ -+ if (WARN_ON(!parts)) -+ return 0; -+ -+ for (i = 0; i < nr_parts; i++) { -+ /* adjust partition offsets */ -+ parts[i].offset += child->part.offset; -+ -+ mtd_add_partition(child->parent, -+ parts[i].name, -+ parts[i].offset, -+ parts[i].size); -+ } -+ -+ kfree(parts); -+ -+ return nr_parts; -+} -+ -+#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME -+#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME -+#else -+#define SPLIT_FIRMWARE_NAME "unused" -+#endif -+ -+static void split_firmware(struct mtd_info *master, struct mtd_info *part) -+{ -+ run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE); -+} -+ -+static void mtd_partition_split(struct mtd_info *master, struct mtd_info *part) -+{ -+ static int rootfs_found = 0; -+ -+ if (rootfs_found) -+ return; -+ -+ if (of_find_property(mtd_get_of_node(part), "linux,rootfs", NULL) || -+ !strcmp(part->name, "rootfs")) { -+ run_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS); -+ -+ rootfs_found = 1; -+ } -+ -+ if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) && -+ !strcmp(part->name, SPLIT_FIRMWARE_NAME) && -+ !of_find_property(mtd_get_of_node(part), "compatible", NULL)) -+ split_firmware(master, part); -+} -+ - int mtd_add_partition(struct mtd_info *parent, const char *name, - long long offset, long long length) - { -@@ -275,6 +418,7 @@ int mtd_add_partition(struct mtd_info *p - if (ret) - goto err_remove_part; - -+ mtd_partition_split(parent, child); - mtd_add_partition_attrs(child); - - return 0; -@@ -423,6 +567,7 @@ int add_mtd_partitions(struct mtd_info * - goto err_del_partitions; - } - -+ mtd_partition_split(master, child); - mtd_add_partition_attrs(child); - - /* Look for subpartitions */ -@@ -439,31 +584,6 @@ err_del_partitions: - return ret; - } - --static DEFINE_SPINLOCK(part_parser_lock); --static LIST_HEAD(part_parsers); -- --static struct mtd_part_parser *mtd_part_parser_get(const char *name) --{ -- struct mtd_part_parser *p, *ret = NULL; -- -- spin_lock(&part_parser_lock); -- -- list_for_each_entry(p, &part_parsers, list) -- if (!strcmp(p->name, name) && try_module_get(p->owner)) { -- ret = p; -- break; -- } -- -- spin_unlock(&part_parser_lock); -- -- return ret; --} -- --static inline void mtd_part_parser_put(const struct mtd_part_parser *p) --{ -- module_put(p->owner); --} -- - /* - * Many partition parsers just expected the core to kfree() all their data in - * one chunk. Do that by default. ---- a/include/linux/mtd/partitions.h -+++ b/include/linux/mtd/partitions.h -@@ -75,6 +75,12 @@ struct mtd_part_parser_data { - * Functions dealing with the various ways of partitioning the space - */ - -+enum mtd_parser_type { -+ MTD_PARSER_TYPE_DEVICE = 0, -+ MTD_PARSER_TYPE_ROOTFS, -+ MTD_PARSER_TYPE_FIRMWARE, -+}; -+ - struct mtd_part_parser { - struct list_head list; - struct module *owner; -@@ -83,6 +89,7 @@ struct mtd_part_parser { - int (*parse_fn)(struct mtd_info *, const struct mtd_partition **, - struct mtd_part_parser_data *); - void (*cleanup)(const struct mtd_partition *pparts, int nr_parts); -+ enum mtd_parser_type type; - }; - - /* Container for passing around a set of parsed partitions */ ---- a/drivers/mtd/Makefile -+++ b/drivers/mtd/Makefile -@@ -9,6 +9,8 @@ mtd-y := mtdcore.o mtdsuper.o mtdconc - - obj-y += parsers/ - -+obj-$(CONFIG_MTD_SPLIT) += mtdsplit/ -+ - # 'Users' - code which presents functionality to userspace. - obj-$(CONFIG_MTD_BLKDEVS) += mtd_blkdevs.o - obj-$(CONFIG_MTD_BLOCK) += mtdblock.o ---- a/include/linux/mtd/mtd.h -+++ b/include/linux/mtd/mtd.h -@@ -606,6 +606,24 @@ static inline void mtd_align_erase_req(s - req->len += mtd->erasesize - mod; - } - -+static inline uint64_t mtd_roundup_to_eb(uint64_t sz, struct mtd_info *mtd) -+{ -+ if (mtd_mod_by_eb(sz, mtd) == 0) -+ return sz; -+ -+ /* Round up to next erase block */ -+ return (mtd_div_by_eb(sz, mtd) + 1) * mtd->erasesize; -+} -+ -+static inline uint64_t mtd_rounddown_to_eb(uint64_t sz, struct mtd_info *mtd) -+{ -+ if (mtd_mod_by_eb(sz, mtd) == 0) -+ return sz; -+ -+ /* Round down to the start of the current erase block */ -+ return (mtd_div_by_eb(sz, mtd)) * mtd->erasesize; -+} -+ - static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd) - { - if (mtd->writesize_shift) -@@ -679,6 +697,13 @@ extern struct mtd_info *of_get_mtd_devic - extern struct mtd_info *get_mtd_device_nm(const char *name); - extern void put_mtd_device(struct mtd_info *mtd); - -+static inline uint64_t mtdpart_get_offset(const struct mtd_info *mtd) -+{ -+ if (!mtd_is_partition(mtd)) -+ return 0; -+ -+ return mtd->part.offset; -+} - - struct mtd_notifier { - void (*add)(struct mtd_info *mtd); diff --git a/target/linux/generic/pending-5.10/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch b/target/linux/generic/pending-5.10/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch deleted file mode 100644 index 48d69aa131..0000000000 --- a/target/linux/generic/pending-5.10/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch +++ /dev/null @@ -1,245 +0,0 @@ -From cd13e2cd28bf7313b6ad6986bb8d63ea98b37a48 Mon Sep 17 00:00:00 2001 -From: John Thomson -Date: Fri, 25 Dec 2020 18:50:08 +1000 -Subject: [PATCH] mtd: spi-nor: write support for minor aligned partitions -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Do not prevent writing to mtd partitions where a partition boundary sits -on a minor erasesize boundary. -This addresses a FIXME that has been present since the start of the -linux git history: -/* Doesn't start on a boundary of major erase size */ -/* FIXME: Let it be writable if it is on a boundary of - * _minor_ erase size though */ - -Allow a uniform erase region spi-nor device to be configured -to use the non-uniform erase regions code path for an erase with: -CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE=y - -On supporting hardware (SECT_4K: majority of current SPI-NOR device) -provide the facility for an erase to use the least number -of SPI-NOR operations, as well as access to 4K erase without -requiring CONFIG_MTD_SPI_NOR_USE_4K_SECTORS - -Introduce erasesize_minor to the mtd struct, -the smallest erasesize supported by the device - -On existing devices, this is useful where write support is wanted -for data on a 4K partition, such as some u-boot-env partitions, -or RouterBoot soft_config, while still netting the performance -benefits of using 64K sectors - -Performance: -time mtd erase firmware -libreCMC 5.10 ramips MT7621 w25q128jv 0xfc0000 partition length - -Without this patch -MTD_SPI_NOR_USE_4K_SECTORS=y |n -real 2m 11.66s |0m 50.86s -user 0m 0.00s |0m 0.00s -sys 1m 56.20s |0m 50.80s - -With this patch -MTD_SPI_NOR_USE_VARIABLE_ERASE=n|y |4K_SECTORS=y -real 0m 51.68s |0m 50.85s |2m 12.89s -user 0m 0.00s |0m 0.00s |0m 0.01s -sys 0m 46.94s |0m 50.38s |2m 12.46s - -Signed-off-by: John Thomson -Signed-off-by: Thibaut VARÈNE - ---- - -checkpatch does not like the printk(KERN_WARNING -these should be changed separately beforehand? - -Changes v1 -> v2: -Added mtdcore sysfs for erasesize_minor -Removed finding minor erasesize for variable erase regions device, -as untested and no responses regarding it. -Moved IF_ENABLED for SPINOR variable erase to guard setting -erasesize_minor in spi-nor/core.c -Removed setting erasesize to minor where partition boundaries require -minor erase to be writable -Simplified minor boundary check by relying on minor being a factor of -major - -Changes RFC -> v1: -Fix uninitialized variable smatch warning -Reported-by: kernel test robot -Reported-by: Dan Carpenter ---- - drivers/mtd/mtdcore.c | 10 ++++++++++ - drivers/mtd/mtdpart.c | 35 +++++++++++++++++++++++++---------- - drivers/mtd/spi-nor/Kconfig | 10 ++++++++++ - drivers/mtd/spi-nor/core.c | 11 +++++++++-- - include/linux/mtd/mtd.h | 2 ++ - 5 files changed, 56 insertions(+), 12 deletions(-) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -164,6 +164,15 @@ static ssize_t mtd_erasesize_show(struct - } - static DEVICE_ATTR(erasesize, S_IRUGO, mtd_erasesize_show, NULL); - -+static ssize_t mtd_erasesize_minor_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct mtd_info *mtd = dev_get_drvdata(dev); -+ -+ return snprintf(buf, PAGE_SIZE, "%lu\n", (unsigned long)mtd->erasesize_minor); -+} -+static DEVICE_ATTR(erasesize_minor, S_IRUGO, mtd_erasesize_minor_show, NULL); -+ - static ssize_t mtd_writesize_show(struct device *dev, - struct device_attribute *attr, char *buf) - { -@@ -313,6 +322,7 @@ static struct attribute *mtd_attrs[] = { - &dev_attr_flags.attr, - &dev_attr_size.attr, - &dev_attr_erasesize.attr, -+ &dev_attr_erasesize_minor.attr, - &dev_attr_writesize.attr, - &dev_attr_subpagesize.attr, - &dev_attr_oobsize.attr, ---- a/drivers/mtd/mtdpart.c -+++ b/drivers/mtd/mtdpart.c -@@ -41,6 +41,7 @@ static struct mtd_info *allocate_partiti - struct mtd_info *master = mtd_get_master(parent); - int wr_alignment = (parent->flags & MTD_NO_ERASE) ? - master->writesize : master->erasesize; -+ int wr_alignment_minor = 0; - u64 parent_size = mtd_is_partition(parent) ? - parent->part.size : parent->size; - struct mtd_info *child; -@@ -165,6 +166,7 @@ static struct mtd_info *allocate_partiti - } else { - /* Single erase size */ - child->erasesize = master->erasesize; -+ child->erasesize_minor = master->erasesize_minor; - } - - /* -@@ -172,26 +174,39 @@ static struct mtd_info *allocate_partiti - * exposes several regions with different erasesize. Adjust - * wr_alignment accordingly. - */ -- if (!(child->flags & MTD_NO_ERASE)) -+ if (!(child->flags & MTD_NO_ERASE)) { - wr_alignment = child->erasesize; -+ wr_alignment_minor = child->erasesize_minor; -+ } - - tmp = mtd_get_master_ofs(child, 0); - remainder = do_div(tmp, wr_alignment); - if ((child->flags & MTD_WRITEABLE) && remainder) { -- /* Doesn't start on a boundary of major erase size */ -- /* FIXME: Let it be writable if it is on a boundary of -- * _minor_ erase size though */ -- child->flags &= ~MTD_WRITEABLE; -- printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n", -- part->name); -+ if (wr_alignment_minor) { -+ /* rely on minor being a factor of major erasesize */ -+ tmp = remainder; -+ remainder = do_div(tmp, wr_alignment_minor); -+ } -+ if (remainder) { -+ child->flags &= ~MTD_WRITEABLE; -+ printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n", -+ part->name); -+ } - } - - tmp = mtd_get_master_ofs(child, 0) + child->part.size; - remainder = do_div(tmp, wr_alignment); - if ((child->flags & MTD_WRITEABLE) && remainder) { -- child->flags &= ~MTD_WRITEABLE; -- printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n", -- part->name); -+ if (wr_alignment_minor) { -+ tmp = remainder; -+ remainder = do_div(tmp, wr_alignment_minor); -+ } -+ -+ if (remainder) { -+ child->flags &= ~MTD_WRITEABLE; -+ printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n", -+ part->name); -+ } - } - - child->size = child->part.size; ---- a/drivers/mtd/spi-nor/Kconfig -+++ b/drivers/mtd/spi-nor/Kconfig -@@ -10,6 +10,16 @@ menuconfig MTD_SPI_NOR - - if MTD_SPI_NOR - -+config MTD_SPI_NOR_USE_VARIABLE_ERASE -+ bool "Disable uniform_erase to allow use of all hardware supported erasesizes" -+ depends on !MTD_SPI_NOR_USE_4K_SECTORS -+ default n -+ help -+ Allow mixed use of all hardware supported erasesizes, -+ by forcing spi_nor to use the multiple eraseregions code path. -+ For example: A 68K erase will use one 64K erase, and one 4K erase -+ on supporting hardware. -+ - config MTD_SPI_NOR_USE_4K_SECTORS - bool "Use small 4096 B erase sectors" - default y ---- a/drivers/mtd/spi-nor/core.c -+++ b/drivers/mtd/spi-nor/core.c -@@ -1084,6 +1084,8 @@ static u8 spi_nor_convert_3to4_erase(u8 - - static bool spi_nor_has_uniform_erase(const struct spi_nor *nor) - { -+ if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE)) -+ return false; - return !!nor->params->erase_map.uniform_erase_type; - } - -@@ -2580,6 +2582,7 @@ static int spi_nor_select_erase(struct s - { - struct spi_nor_erase_map *map = &nor->params->erase_map; - const struct spi_nor_erase_type *erase = NULL; -+ const struct spi_nor_erase_type *erase_minor = NULL; - struct mtd_info *mtd = &nor->mtd; - u32 wanted_size = nor->info->sector_size; - int i; -@@ -2612,8 +2615,9 @@ static int spi_nor_select_erase(struct s - */ - for (i = SNOR_ERASE_TYPE_MAX - 1; i >= 0; i--) { - if (map->erase_type[i].size) { -- erase = &map->erase_type[i]; -- break; -+ if (!erase) -+ erase = &map->erase_type[i]; -+ erase_minor = &map->erase_type[i]; - } - } - -@@ -2621,6 +2625,9 @@ static int spi_nor_select_erase(struct s - return -EINVAL; - - mtd->erasesize = erase->size; -+ if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE) && -+ erase_minor && erase_minor->size < erase->size) -+ mtd->erasesize_minor = erase_minor->size; - return 0; - } - ---- a/include/linux/mtd/mtd.h -+++ b/include/linux/mtd/mtd.h -@@ -242,6 +242,8 @@ struct mtd_info { - * information below if they desire - */ - uint32_t erasesize; -+ /* "Minor" (smallest) erase size supported by the whole device */ -+ uint32_t erasesize_minor; - /* Minimal writable flash unit size. In case of NOR flash it is 1 (even - * though individual bits can be cleared), in case of NAND flash it is - * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR diff --git a/target/linux/generic/pending-5.10/410-mtd-parsers-ofpart-fix-parsing-subpartitions.patch b/target/linux/generic/pending-5.10/410-mtd-parsers-ofpart-fix-parsing-subpartitions.patch deleted file mode 100644 index 353fa96748..0000000000 --- a/target/linux/generic/pending-5.10/410-mtd-parsers-ofpart-fix-parsing-subpartitions.patch +++ /dev/null @@ -1,76 +0,0 @@ -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 6 May 2021 12:33:58 +0200 -Subject: [PATCH] mtd: parsers: ofpart: fix parsing subpartitions -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -ofpart was recently patched to not scan random partition nodes as -subpartitions. That change unfortunately broke scanning valid -subpartitions like: - -partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@0 { - compatible = "fixed-partitions"; - label = "bootloader"; - reg = <0x0 0x100000>; - - partition@0 { - label = "config"; - reg = <0x80000 0x80000>; - }; - }; -}; - -Fix that regression by adding 1 more code path. We actually need 3 -conditional blocks to support 3 possible cases. This change also makes -code easier to understand & follow. - -Reported-by: David Bauer -Fixes: 2d751203aacf ("mtd: parsers: ofpart: limit parsing of deprecated DT syntax -Signed-off-by: Rafał Miłecki ---- - drivers/mtd/parsers/ofpart_core.c | 26 ++++++++++++++------------ - 1 file changed, 14 insertions(+), 12 deletions(-) - ---- a/drivers/mtd/parsers/ofpart_core.c -+++ b/drivers/mtd/parsers/ofpart_core.c -@@ -57,20 +57,22 @@ static int parse_fixed_partitions(struct - if (!mtd_node) - return 0; - -- ofpart_node = of_get_child_by_name(mtd_node, "partitions"); -- if (!ofpart_node && !master->parent) { -- /* -- * We might get here even when ofpart isn't used at all (e.g., -- * when using another parser), so don't be louder than -- * KERN_DEBUG -- */ -- pr_debug("%s: 'partitions' subnode not found on %pOF. Trying to parse direct subnodes as partitions.\n", -- master->name, mtd_node); -+ if (!master->parent) { /* Master */ -+ ofpart_node = of_get_child_by_name(mtd_node, "partitions"); -+ if (!ofpart_node) { -+ /* -+ * We might get here even when ofpart isn't used at all (e.g., -+ * when using another parser), so don't be louder than -+ * KERN_DEBUG -+ */ -+ pr_debug("%s: 'partitions' subnode not found on %pOF. Trying to parse direct subnodes as partitions.\n", -+ master->name, mtd_node); -+ ofpart_node = mtd_node; -+ dedicated = false; -+ } -+ } else { /* Partition */ - ofpart_node = mtd_node; -- dedicated = false; - } -- if (!ofpart_node) -- return 0; - - of_id = of_match_node(parse_ofpart_match_table, ofpart_node); - if (dedicated && !of_id) { diff --git a/target/linux/generic/pending-5.10/419-mtd-redboot-add-of_match_table-with-DT-binding.patch b/target/linux/generic/pending-5.10/419-mtd-redboot-add-of_match_table-with-DT-binding.patch deleted file mode 100644 index 3ea5f4abb4..0000000000 --- a/target/linux/generic/pending-5.10/419-mtd-redboot-add-of_match_table-with-DT-binding.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Subject: [PATCH] mtd: redboot: add of_match_table with DT binding -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This allows parsing RedBoot compatible partitions for properly described -flash device in DT. - -Signed-off-by: Rafał Miłecki ---- - ---- a/drivers/mtd/parsers/redboot.c -+++ b/drivers/mtd/parsers/redboot.c -@@ -306,6 +306,7 @@ static int parse_redboot_partitions(stru - - static const struct of_device_id mtd_parser_redboot_of_match_table[] = { - { .compatible = "redboot-fis" }, -+ { .compatible = "ecoscentric,redboot-fis-partitions" }, - {}, - }; - MODULE_DEVICE_TABLE(of, mtd_parser_redboot_of_match_table); diff --git a/target/linux/generic/pending-5.10/420-mtd-redboot_space.patch b/target/linux/generic/pending-5.10/420-mtd-redboot_space.patch deleted file mode 100644 index 5be2a2246e..0000000000 --- a/target/linux/generic/pending-5.10/420-mtd-redboot_space.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: Felix Fietkau -Subject: add patch for including unpartitioned space in the rootfs partition for redboot devices (if applicable) - -[john@phrozen.org: used by ixp and others] - -lede-commit: 394918851f84e4d00fa16eb900e7700e95091f00 -Signed-off-by: Felix Fietkau ---- - drivers/mtd/redboot.c | 19 +++++++++++++------ - 1 file changed, 13 insertions(+), 6 deletions(-) - ---- a/drivers/mtd/parsers/redboot.c -+++ b/drivers/mtd/parsers/redboot.c -@@ -280,14 +280,21 @@ static int parse_redboot_partitions(stru - #endif - names += strlen(names)+1; - --#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED - if(fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) { -- i++; -- parts[i].offset = parts[i-1].size + parts[i-1].offset; -- parts[i].size = fl->next->img->flash_base - parts[i].offset; -- parts[i].name = nullname; -- } -+ if (!strcmp(parts[i].name, "rootfs")) { -+ parts[i].size = fl->next->img->flash_base; -+ parts[i].size &= ~(master->erasesize - 1); -+ parts[i].size -= parts[i].offset; -+#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED -+ nrparts--; -+ } else { -+ i++; -+ parts[i].offset = parts[i-1].size + parts[i-1].offset; -+ parts[i].size = fl->next->img->flash_base - parts[i].offset; -+ parts[i].name = nullname; - #endif -+ } -+ } - tmp_fl = fl; - fl = fl->next; - kfree(tmp_fl); diff --git a/target/linux/generic/pending-5.10/435-mtd-add-routerbootpart-parser-config.patch b/target/linux/generic/pending-5.10/435-mtd-add-routerbootpart-parser-config.patch deleted file mode 100644 index 8705a38f84..0000000000 --- a/target/linux/generic/pending-5.10/435-mtd-add-routerbootpart-parser-config.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 4437e01fb6bca63fccdba5d6c44888b0935885c2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= -Date: Tue, 24 Mar 2020 11:45:07 +0100 -Subject: [PATCH] generic: routerboot partition build bits (5.4) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch adds routerbootpart kernel build bits - -Signed-off-by: Thibaut VARÈNE ---- - drivers/mtd/parsers/Kconfig | 9 +++++++++ - drivers/mtd/parsers/Makefile | 1 + - 2 files changed, 10 insertions(+) - ---- a/drivers/mtd/parsers/Kconfig -+++ b/drivers/mtd/parsers/Kconfig -@@ -210,3 +210,12 @@ config MTD_REDBOOT_PARTS_READONLY - 'FIS directory' images, enable this option. - - endif # MTD_REDBOOT_PARTS -+ -+config MTD_ROUTERBOOT_PARTS -+ tristate "RouterBoot flash partition parser" -+ depends on MTD && OF -+ help -+ MikroTik RouterBoot is implemented as a multi segment system on the -+ flash, some of which are fixed and some of which are located at -+ variable offsets. This parser handles both cases via properly -+ formatted DTS. ---- a/drivers/mtd/parsers/Makefile -+++ b/drivers/mtd/parsers/Makefile -@@ -14,3 +14,4 @@ obj-$(CONFIG_MTD_PARSER_TPLINK_SAFELOADE - obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o - obj-$(CONFIG_MTD_SHARPSL_PARTS) += sharpslpart.o - obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o -+obj-$(CONFIG_MTD_ROUTERBOOT_PARTS) += routerbootpart.o diff --git a/target/linux/generic/pending-5.10/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch b/target/linux/generic/pending-5.10/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch deleted file mode 100644 index 2435133fa0..0000000000 --- a/target/linux/generic/pending-5.10/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Felix Fietkau -Subject: kernel: disable cfi cmdset 0002 erase suspend - -on some platforms, erase suspend leads to data corruption and lockups when write -ops collide with erase ops. this has been observed on the buffalo wzr-hp-g300nh. -rather than play whack-a-mole with a hard to reproduce issue on a variety of devices, -simply disable erase suspend, as it will usually not produce any useful gain on -the small filesystems used on embedded hardware. - -Signed-off-by: Felix Fietkau ---- - drivers/mtd/chips/cfi_cmdset_0002.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/mtd/chips/cfi_cmdset_0002.c -+++ b/drivers/mtd/chips/cfi_cmdset_0002.c -@@ -906,7 +906,7 @@ static int get_chip(struct map_info *map - return 0; - - case FL_ERASING: -- if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) || -+ if (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) || - !(mode == FL_READY || mode == FL_POINT || - (mode == FL_WRITING && (cfip->EraseSuspend & 0x2)))) - goto sleep; diff --git a/target/linux/generic/pending-5.10/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch b/target/linux/generic/pending-5.10/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch deleted file mode 100644 index 059d9673dc..0000000000 --- a/target/linux/generic/pending-5.10/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch +++ /dev/null @@ -1,17 +0,0 @@ -From: George Kashperko -Subject: Issue map read after Write Buffer Load command to ensure chip is ready to receive data. - -Signed-off-by: George Kashperko ---- - drivers/mtd/chips/cfi_cmdset_0002.c | 1 + - 1 file changed, 1 insertion(+) ---- a/drivers/mtd/chips/cfi_cmdset_0002.c -+++ b/drivers/mtd/chips/cfi_cmdset_0002.c -@@ -2050,6 +2050,7 @@ static int __xipram do_write_buffer(stru - - /* Write Buffer Load */ - map_write(map, CMD(0x25), cmd_adr); -+ (void) map_read(map, cmd_adr); - - chip->state = FL_WRITING_TO_BUFFER; - diff --git a/target/linux/generic/pending-5.10/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch b/target/linux/generic/pending-5.10/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch deleted file mode 100644 index 4dfa0cc69a..0000000000 --- a/target/linux/generic/pending-5.10/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch +++ /dev/null @@ -1,71 +0,0 @@ -From: Felix Fietkau -Date: Sat, 4 Nov 2017 07:40:23 +0100 -Subject: [PATCH] mtd: spi-nor: support limiting 4K sectors support based on - flash size - -Some devices need 4K sectors to be able to deal with small flash chips. -For instance, w25x05 is 64 KiB in size, and without 4K sectors, the -entire chip is just one erase block. -On bigger flash chip sizes, using 4K sectors can significantly slow down -many operations, including using a writable filesystem. There are several -platforms where it makes sense to use a single kernel on both kinds of -devices. - -To support this properly, allow configuring an upper flash chip size -limit for 4K sectors support. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/mtd/spi-nor/Kconfig -+++ b/drivers/mtd/spi-nor/Kconfig -@@ -34,6 +34,17 @@ config MTD_SPI_NOR_USE_4K_SECTORS - Please note that some tools/drivers/filesystems may not work with - 4096 B erase size (e.g. UBIFS requires 15 KiB as a minimum). - -+config MTD_SPI_NOR_USE_4K_SECTORS_LIMIT -+ int "Maximum flash chip size to use 4K sectors on (in KiB)" -+ depends on MTD_SPI_NOR_USE_4K_SECTORS -+ default "4096" -+ help -+ There are many flash chips that support 4K sectors, but are so large -+ that using them significantly slows down writing large amounts of -+ data or using a writable filesystem. -+ Any flash chip larger than the size specified in this option will -+ not use 4K sectors. -+ - source "drivers/mtd/spi-nor/controllers/Kconfig" - - endif # MTD_SPI_NOR ---- a/drivers/mtd/spi-nor/core.c -+++ b/drivers/mtd/spi-nor/core.c -@@ -2813,6 +2813,21 @@ static void spi_nor_info_init_params(str - */ - erase_mask = 0; - i = 0; -+#ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS -+ if ((info->flags & SECT_4K_PMC) && (params->size <= -+ CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) { -+ erase_mask |= BIT(i); -+ spi_nor_set_erase_type(&map->erase_type[i], 4096u, -+ SPINOR_OP_BE_4K_PMC); -+ i++; -+ } else if ((info->flags & SECT_4K) && (params->size <= -+ CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) { -+ erase_mask |= BIT(i); -+ spi_nor_set_erase_type(&map->erase_type[i], 4096u, -+ SPINOR_OP_BE_4K); -+ i++; -+ } -+#else - if (info->flags & SECT_4K_PMC) { - erase_mask |= BIT(i); - spi_nor_set_erase_type(&map->erase_type[i], 4096u, -@@ -2824,6 +2839,7 @@ static void spi_nor_info_init_params(str - SPINOR_OP_BE_4K); - i++; - } -+#endif - erase_mask |= BIT(i); - spi_nor_set_erase_type(&map->erase_type[i], info->sector_size, - SPINOR_OP_SE); diff --git a/target/linux/generic/pending-5.10/476-mtd-spi-nor-add-eon-en25q128.patch b/target/linux/generic/pending-5.10/476-mtd-spi-nor-add-eon-en25q128.patch deleted file mode 100644 index 325fca62f3..0000000000 --- a/target/linux/generic/pending-5.10/476-mtd-spi-nor-add-eon-en25q128.patch +++ /dev/null @@ -1,18 +0,0 @@ -From: Piotr Dymacz -Subject: kernel/mtd: add support for EON EN25Q128 - -Signed-off-by: Piotr Dymacz ---- - drivers/mtd/spi-nor/spi-nor.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/mtd/spi-nor/eon.c -+++ b/drivers/mtd/spi-nor/eon.c -@@ -15,6 +15,7 @@ static const struct flash_info eon_parts - { "en25q32b", INFO(0x1c3016, 0, 64 * 1024, 64, 0) }, - { "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) }, - { "en25q64", INFO(0x1c3017, 0, 64 * 1024, 128, SECT_4K) }, -+ { "en25q128", INFO(0x1c3018, 0, 64 * 1024, 256, SECT_4K) }, - { "en25q80a", INFO(0x1c3014, 0, 64 * 1024, 16, - SECT_4K | SPI_NOR_DUAL_READ) }, - { "en25qh16", INFO(0x1c7015, 0, 64 * 1024, 32, diff --git a/target/linux/generic/pending-5.10/479-mtd-spi-nor-add-xtx-xt25f128b.patch b/target/linux/generic/pending-5.10/479-mtd-spi-nor-add-xtx-xt25f128b.patch deleted file mode 100644 index 784392cd88..0000000000 --- a/target/linux/generic/pending-5.10/479-mtd-spi-nor-add-xtx-xt25f128b.patch +++ /dev/null @@ -1,79 +0,0 @@ -From patchwork Thu Feb 6 17:19:41 2020 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 1234465 -Date: Thu, 6 Feb 2020 19:19:41 +0200 -From: Daniel Golle -To: linux-mtd@lists.infradead.org -Subject: [PATCH v2] mtd: spi-nor: Add support for xt25f128b chip -Message-ID: <20200206171941.GA2398@makrotopia.org> -MIME-Version: 1.0 -Content-Disposition: inline -List-Subscribe: , - -Cc: Eitan Cohen , Piotr Dymacz , - Tudor Ambarus -Sender: "linux-mtd" -Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org - -Add XT25F128B made by XTX Technology (Shenzhen) Limited. -This chip supports dual and quad read and uniform 4K-byte erase. -Verified on Teltonika RUT955 which comes with XT25F128B in recent -versions of the device. - -Signed-off-by: Daniel Golle -Signed-off-by: Felix Fietkau ---- - drivers/mtd/spi-nor/spi-nor.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/drivers/mtd/spi-nor/Makefile -+++ b/drivers/mtd/spi-nor/Makefile -@@ -17,6 +17,7 @@ spi-nor-objs += sst.o - spi-nor-objs += winbond.o - spi-nor-objs += xilinx.o - spi-nor-objs += xmc.o -+spi-nor-objs += xtx.o - obj-$(CONFIG_MTD_SPI_NOR) += spi-nor.o - - obj-$(CONFIG_MTD_SPI_NOR) += controllers/ ---- /dev/null -+++ b/drivers/mtd/spi-nor/xtx.c -@@ -0,0 +1,15 @@ -+// SPDX-License-Identifier: GPL-2.0 -+#include -+ -+#include "core.h" -+ -+static const struct flash_info xtx_parts[] = { -+ /* XTX Technology (Shenzhen) Limited */ -+ { "xt25f128b", INFO(0x0B4018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, -+}; -+ -+const struct spi_nor_manufacturer spi_nor_xtx = { -+ .name = "xtx", -+ .parts = xtx_parts, -+ .nparts = ARRAY_SIZE(xtx_parts), -+}; ---- a/drivers/mtd/spi-nor/core.c -+++ b/drivers/mtd/spi-nor/core.c -@@ -2039,6 +2039,7 @@ static const struct spi_nor_manufacturer - &spi_nor_winbond, - &spi_nor_xilinx, - &spi_nor_xmc, -+ &spi_nor_xtx, - }; - - static const struct flash_info * ---- a/drivers/mtd/spi-nor/core.h -+++ b/drivers/mtd/spi-nor/core.h -@@ -398,6 +398,7 @@ extern const struct spi_nor_manufacturer - extern const struct spi_nor_manufacturer spi_nor_winbond; - extern const struct spi_nor_manufacturer spi_nor_xilinx; - extern const struct spi_nor_manufacturer spi_nor_xmc; -+extern const struct spi_nor_manufacturer spi_nor_xtx; - - int spi_nor_write_enable(struct spi_nor *nor); - int spi_nor_write_disable(struct spi_nor *nor); diff --git a/target/linux/generic/pending-5.10/483-mtd-spi-nor-add-gd25q512.patch b/target/linux/generic/pending-5.10/483-mtd-spi-nor-add-gd25q512.patch deleted file mode 100644 index 6f41546964..0000000000 --- a/target/linux/generic/pending-5.10/483-mtd-spi-nor-add-gd25q512.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/drivers/mtd/spi-nor/gigadevice.c -+++ b/drivers/mtd/spi-nor/gigadevice.c -@@ -53,6 +53,9 @@ static const struct flash_info gigadevic - SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK | - SPI_NOR_HAS_TB | SPI_NOR_TB_SR_BIT6) - .fixups = &gd25q256_fixups }, -+ { "gd25q512", INFO(0xc84020, 0, 64 * 1024, 1024, -+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | -+ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB | SPI_NOR_4B_OPCODES) }, - }; - - const struct spi_nor_manufacturer spi_nor_gigadevice = { diff --git a/target/linux/generic/pending-5.10/483-mtd-spinand-add-support-for-xtx-xt26g0xa.patch b/target/linux/generic/pending-5.10/483-mtd-spinand-add-support-for-xtx-xt26g0xa.patch deleted file mode 100644 index 184df3fe8e..0000000000 --- a/target/linux/generic/pending-5.10/483-mtd-spinand-add-support-for-xtx-xt26g0xa.patch +++ /dev/null @@ -1,178 +0,0 @@ -From a07e31adf2753cad2fd9790db5bfc047c81e8152 Mon Sep 17 00:00:00 2001 -From: Felix Matouschek -Date: Fri, 2 Jul 2021 20:31:23 +0200 -Subject: [PATCH] mtd: spinand: Add support for XTX XT26G0xA - -Add support for XTX Technology XT26G01AXXXXX, XTX26G02AXXXXX and -XTX26G04AXXXXX SPI NAND. - -These are 3V, 1G/2G/4Gbit serial SLC NAND flash devices with on-die ECC -(8bit strength per 512bytes). - -Tested on Teltonika RUTX10 flashed with libreCMC. - -Datasheets available at -http://www.xtxtech.com/download/?AId=225 -https://datasheet.lcsc.com/szlcsc/2005251034_XTX-XT26G01AWSEGA_C558841.pdf - -Signed-off-by: Felix Matouschek ---- - drivers/mtd/nand/spi/Makefile | 2 +- - drivers/mtd/nand/spi/core.c | 1 + - drivers/mtd/nand/spi/xtx.c | 122 ++++++++++++++++++++++++++++++++++ - include/linux/mtd/spinand.h | 1 + - 4 files changed, 125 insertions(+), 1 deletion(-) - create mode 100644 drivers/mtd/nand/spi/xtx.c - ---- a/drivers/mtd/nand/spi/Makefile -+++ b/drivers/mtd/nand/spi/Makefile -@@ -1,3 +1,3 @@ - # SPDX-License-Identifier: GPL-2.0 --spinand-objs := core.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o -+spinand-objs := core.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o xtx.o - obj-$(CONFIG_MTD_SPI_NAND) += spinand.o ---- a/drivers/mtd/nand/spi/core.c -+++ b/drivers/mtd/nand/spi/core.c -@@ -760,6 +760,7 @@ static const struct spinand_manufacturer - ¶gon_spinand_manufacturer, - &toshiba_spinand_manufacturer, - &winbond_spinand_manufacturer, -+ &xtx_spinand_manufacturer, - }; - - static int spinand_manufacturer_match(struct spinand_device *spinand, ---- /dev/null -+++ b/drivers/mtd/nand/spi/xtx.c -@@ -0,0 +1,122 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Author: -+ * Felix Matouschek -+ */ -+ -+#include -+#include -+#include -+ -+#define SPINAND_MFR_XTX 0x0B -+ -+#define XT26G0XA_STATUS_ECC_MASK GENMASK(5, 2) -+#define XT26G0XA_STATUS_ECC_NO_DETECTED (0 << 2) -+#define XT26G0XA_STATUS_ECC_8_CORRECTED (3 << 4) -+#define XT26G0XA_STATUS_ECC_UNCOR_ERROR (2 << 4) -+ -+static SPINAND_OP_VARIANTS(read_cache_variants, -+ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0), -+ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), -+ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), -+ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), -+ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), -+ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); -+ -+static SPINAND_OP_VARIANTS(write_cache_variants, -+ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), -+ SPINAND_PROG_LOAD(true, 0, NULL, 0)); -+ -+static SPINAND_OP_VARIANTS(update_cache_variants, -+ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), -+ SPINAND_PROG_LOAD(false, 0, NULL, 0)); -+ -+static int xt26g0xa_ooblayout_ecc(struct mtd_info *mtd, int section, -+ struct mtd_oob_region *region) -+{ -+ if (section) -+ return -ERANGE; -+ -+ region->offset = 48; -+ region->length = 16; -+ -+ return 0; -+} -+ -+static int xt26g0xa_ooblayout_free(struct mtd_info *mtd, int section, -+ struct mtd_oob_region *region) -+{ -+ if (section) -+ return -ERANGE; -+ -+ region->offset = 1; -+ region->length = 47; -+ -+ return 0; -+} -+ -+static const struct mtd_ooblayout_ops xt26g0xa_ooblayout = { -+ .ecc = xt26g0xa_ooblayout_ecc, -+ .free = xt26g0xa_ooblayout_free, -+}; -+ -+static int xt26g0xa_ecc_get_status(struct spinand_device *spinand, -+ u8 status) -+{ -+ switch (status & XT26G0XA_STATUS_ECC_MASK) { -+ case XT26G0XA_STATUS_ECC_NO_DETECTED: -+ return 0; -+ case XT26G0XA_STATUS_ECC_8_CORRECTED: -+ return 8; -+ case XT26G0XA_STATUS_ECC_UNCOR_ERROR: -+ return -EBADMSG; -+ default: /* (1 << 2) through (7 << 2) are 1-7 corrected errors */ -+ return (status & XT26G0XA_STATUS_ECC_MASK) >> 2; -+ } -+ -+ return -EINVAL; -+} -+ -+static const struct spinand_info xtx_spinand_table[] = { -+ SPINAND_INFO("XT26G01A", -+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xE1), -+ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), -+ NAND_ECCREQ(8, 512), -+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, -+ &write_cache_variants, -+ &update_cache_variants), -+ SPINAND_HAS_QE_BIT, -+ SPINAND_ECCINFO(&xt26g0xa_ooblayout, -+ xt26g0xa_ecc_get_status)), -+ SPINAND_INFO("XT26G02A", -+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xE2), -+ NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1), -+ NAND_ECCREQ(8, 512), -+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, -+ &write_cache_variants, -+ &update_cache_variants), -+ SPINAND_HAS_QE_BIT, -+ SPINAND_ECCINFO(&xt26g0xa_ooblayout, -+ xt26g0xa_ecc_get_status)), -+ SPINAND_INFO("XT26G04A", -+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xE3), -+ NAND_MEMORG(1, 2048, 64, 128, 2048, 40, 1, 1, 1), -+ NAND_ECCREQ(8, 512), -+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, -+ &write_cache_variants, -+ &update_cache_variants), -+ SPINAND_HAS_QE_BIT, -+ SPINAND_ECCINFO(&xt26g0xa_ooblayout, -+ xt26g0xa_ecc_get_status)), -+}; -+ -+static const struct spinand_manufacturer_ops xtx_spinand_manuf_ops = { -+}; -+ -+const struct spinand_manufacturer xtx_spinand_manufacturer = { -+ .id = SPINAND_MFR_XTX, -+ .name = "XTX", -+ .chips = xtx_spinand_table, -+ .nchips = ARRAY_SIZE(xtx_spinand_table), -+ .ops = &xtx_spinand_manuf_ops, -+}; ---- a/include/linux/mtd/spinand.h -+++ b/include/linux/mtd/spinand.h -@@ -244,6 +244,7 @@ extern const struct spinand_manufacturer - extern const struct spinand_manufacturer paragon_spinand_manufacturer; - extern const struct spinand_manufacturer toshiba_spinand_manufacturer; - extern const struct spinand_manufacturer winbond_spinand_manufacturer; -+extern const struct spinand_manufacturer xtx_spinand_manufacturer; - - /** - * struct spinand_op_variants - SPI NAND operation variants diff --git a/target/linux/generic/pending-5.10/484-mtd-spi-nor-add-esmt-f25l16pa.patch b/target/linux/generic/pending-5.10/484-mtd-spi-nor-add-esmt-f25l16pa.patch deleted file mode 100644 index ce3857d511..0000000000 --- a/target/linux/generic/pending-5.10/484-mtd-spi-nor-add-esmt-f25l16pa.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/mtd/spi-nor/esmt.c -+++ b/drivers/mtd/spi-nor/esmt.c -@@ -10,6 +10,8 @@ - - static const struct flash_info esmt_parts[] = { - /* ESMT */ -+ { "f25l16pa-2s", INFO(0x8c2115, 0, 64 * 1024, 32, -+ SECT_4K | SPI_NOR_HAS_LOCK) }, - { "f25l32pa", INFO(0x8c2016, 0, 64 * 1024, 64, - SECT_4K | SPI_NOR_HAS_LOCK) }, - { "f25l32qa", INFO(0x8c4116, 0, 64 * 1024, 64, diff --git a/target/linux/generic/pending-5.10/485-mtd-spi-nor-add-xmc-xm25qh128c.patch b/target/linux/generic/pending-5.10/485-mtd-spi-nor-add-xmc-xm25qh128c.patch deleted file mode 100644 index 4b3f674170..0000000000 --- a/target/linux/generic/pending-5.10/485-mtd-spi-nor-add-xmc-xm25qh128c.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/mtd/spi-nor/xmc.c -+++ b/drivers/mtd/spi-nor/xmc.c -@@ -14,6 +14,8 @@ static const struct flash_info xmc_parts - SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, - { "XM25QH128A", INFO(0x207018, 0, 64 * 1024, 256, - SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, -+ { "XM25QH128C", INFO(0x204018, 0, 64 * 1024, 256, -+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, - }; - - const struct spi_nor_manufacturer spi_nor_xmc = { diff --git a/target/linux/generic/pending-5.10/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch b/target/linux/generic/pending-5.10/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch deleted file mode 100644 index 36bd2bb589..0000000000 --- a/target/linux/generic/pending-5.10/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch +++ /dev/null @@ -1,97 +0,0 @@ -From: Daniel Golle -Subject: ubi: auto-attach mtd device named "ubi" or "data" on boot - -Signed-off-by: Daniel Golle ---- - drivers/mtd/ubi/build.c | 36 ++++++++++++++++++++++++++++++++++++ - 1 file changed, 36 insertions(+) - ---- a/drivers/mtd/ubi/build.c -+++ b/drivers/mtd/ubi/build.c -@@ -1201,6 +1201,73 @@ static struct mtd_info * __init open_mtd - return mtd; - } - -+/* -+ * This function tries attaching mtd partitions named either "ubi" or "data" -+ * during boot. -+ */ -+static void __init ubi_auto_attach(void) -+{ -+ int err; -+ struct mtd_info *mtd; -+ loff_t offset = 0; -+ size_t len; -+ char magic[4]; -+ -+ /* try attaching mtd device named "ubi" or "data" */ -+ mtd = open_mtd_device("ubi"); -+ if (IS_ERR(mtd)) -+ mtd = open_mtd_device("data"); -+ -+ if (IS_ERR(mtd)) -+ return; -+ -+ /* get the first not bad block */ -+ if (mtd_can_have_bb(mtd)) -+ while (mtd_block_isbad(mtd, offset)) { -+ offset += mtd->erasesize; -+ -+ if (offset > mtd->size) { -+ pr_err("UBI error: Failed to find a non-bad " -+ "block on mtd%d\n", mtd->index); -+ goto cleanup; -+ } -+ } -+ -+ /* check if the read from flash was successful */ -+ err = mtd_read(mtd, offset, 4, &len, (void *) magic); -+ if ((err && !mtd_is_bitflip(err)) || len != 4) { -+ pr_err("UBI error: unable to read from mtd%d\n", mtd->index); -+ goto cleanup; -+ } -+ -+ /* check for a valid ubi magic */ -+ if (strncmp(magic, "UBI#", 4)) { -+ pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index); -+ goto cleanup; -+ } -+ -+ /* don't auto-add media types where UBI doesn't makes sense */ -+ if (mtd->type != MTD_NANDFLASH && -+ mtd->type != MTD_NORFLASH && -+ mtd->type != MTD_DATAFLASH && -+ mtd->type != MTD_MLCNANDFLASH) -+ goto cleanup; -+ -+ mutex_lock(&ubi_devices_mutex); -+ pr_notice("UBI: auto-attach mtd%d\n", mtd->index); -+ err = ubi_attach_mtd_dev(mtd, UBI_DEV_NUM_AUTO, 0, 0); -+ mutex_unlock(&ubi_devices_mutex); -+ if (err < 0) { -+ pr_err("UBI error: cannot attach mtd%d\n", mtd->index); -+ goto cleanup; -+ } -+ -+ return; -+ -+cleanup: -+ put_mtd_device(mtd); -+} -+ - static int __init ubi_init(void) - { - int err, i, k; -@@ -1284,6 +1351,12 @@ static int __init ubi_init(void) - } - } - -+ /* auto-attach mtd devices only if built-in to the kernel and no ubi.mtd -+ * parameter was given */ -+ if (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && -+ !ubi_is_module() && !mtd_devs) -+ ubi_auto_attach(); -+ - err = ubiblock_init(); - if (err) { - pr_err("UBI error: block: cannot initialize, error %d\n", err); diff --git a/target/linux/generic/pending-5.10/491-ubi-auto-create-ubiblock-device-for-rootfs.patch b/target/linux/generic/pending-5.10/491-ubi-auto-create-ubiblock-device-for-rootfs.patch deleted file mode 100644 index a2b48fd4fc..0000000000 --- a/target/linux/generic/pending-5.10/491-ubi-auto-create-ubiblock-device-for-rootfs.patch +++ /dev/null @@ -1,69 +0,0 @@ -From: Daniel Golle -Subject: ubi: auto-create ubiblock device for rootfs - -Signed-off-by: Daniel Golle ---- - drivers/mtd/ubi/block.c | 42 ++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 42 insertions(+) - ---- a/drivers/mtd/ubi/block.c -+++ b/drivers/mtd/ubi/block.c -@@ -652,6 +652,47 @@ static void __init ubiblock_create_from_ - } - } - -+#define UBIFS_NODE_MAGIC 0x06101831 -+static inline int ubi_vol_is_ubifs(struct ubi_volume_desc *desc) -+{ -+ int ret; -+ uint32_t magic_of, magic; -+ ret = ubi_read(desc, 0, (char *)&magic_of, 0, 4); -+ if (ret) -+ return 0; -+ magic = le32_to_cpu(magic_of); -+ return magic == UBIFS_NODE_MAGIC; -+} -+ -+static void __init ubiblock_create_auto_rootfs(void) -+{ -+ int ubi_num, ret, is_ubifs; -+ struct ubi_volume_desc *desc; -+ struct ubi_volume_info vi; -+ -+ for (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++) { -+ desc = ubi_open_volume_nm(ubi_num, "rootfs", UBI_READONLY); -+ if (IS_ERR(desc)) -+ desc = ubi_open_volume_nm(ubi_num, "fit", UBI_READONLY);; -+ -+ if (IS_ERR(desc)) -+ continue; -+ -+ ubi_get_volume_info(desc, &vi); -+ is_ubifs = ubi_vol_is_ubifs(desc); -+ ubi_close_volume(desc); -+ if (is_ubifs) -+ break; -+ -+ ret = ubiblock_create(&vi); -+ if (ret) -+ pr_err("UBI error: block: can't add '%s' volume, err=%d\n", -+ vi.name, ret); -+ /* always break if we get here */ -+ break; -+ } -+} -+ - static void ubiblock_remove_all(void) - { - struct ubiblock *next; -@@ -684,6 +725,10 @@ int __init ubiblock_init(void) - */ - ubiblock_create_from_param(); - -+ /* auto-attach "rootfs" volume if existing and non-ubifs */ -+ if (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV)) -+ ubiblock_create_auto_rootfs(); -+ - /* - * Block devices are only created upon user requests, so we ignore - * existing volumes. diff --git a/target/linux/generic/pending-5.10/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch b/target/linux/generic/pending-5.10/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch deleted file mode 100644 index e3c4dd2ef4..0000000000 --- a/target/linux/generic/pending-5.10/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch +++ /dev/null @@ -1,53 +0,0 @@ -From: Daniel Golle -Subject: try auto-mounting ubi0:rootfs in init/do_mounts.c - -Signed-off-by: Daniel Golle ---- - init/do_mounts.c | 26 +++++++++++++++++++++++++- - 1 file changed, 25 insertions(+), 1 deletion(-) - ---- a/init/do_mounts.c -+++ b/init/do_mounts.c -@@ -474,7 +474,30 @@ retry: - out: - put_page(page); - } -- -+ -+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV -+static int __init mount_ubi_rootfs(void) -+{ -+ int flags = MS_SILENT; -+ int err, tried = 0; -+ -+ while (tried < 2) { -+ err = do_mount_root("ubi0:rootfs", "ubifs", flags, \ -+ root_mount_data); -+ switch (err) { -+ case -EACCES: -+ flags |= MS_RDONLY; -+ tried++; -+ break; -+ default: -+ return err; -+ } -+ } -+ -+ return -EINVAL; -+} -+#endif -+ - #ifdef CONFIG_ROOT_NFS - - #define NFSROOT_TIMEOUT_MIN 5 -@@ -567,6 +590,10 @@ void __init mount_root(void) - return; - } - #endif -+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV -+ if (!mount_ubi_rootfs()) -+ return; -+#endif - #ifdef CONFIG_BLOCK - { - int err = create_dev("/dev/root", ROOT_DEV); diff --git a/target/linux/generic/pending-5.10/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch b/target/linux/generic/pending-5.10/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch deleted file mode 100644 index 2dff46807e..0000000000 --- a/target/linux/generic/pending-5.10/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch +++ /dev/null @@ -1,34 +0,0 @@ -From: Daniel Golle -Subject: ubi: set ROOT_DEV to ubiblock "rootfs" if unset - -Signed-off-by: Daniel Golle ---- - drivers/mtd/ubi/block.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - ---- a/drivers/mtd/ubi/block.c -+++ b/drivers/mtd/ubi/block.c -@@ -42,6 +42,7 @@ - #include - #include - #include -+#include - - #include "ubi-media.h" - #include "ubi.h" -@@ -458,6 +459,15 @@ int ubiblock_create(struct ubi_volume_in - dev_info(disk_to_dev(dev->gd), "created from ubi%d:%d(%s)", - dev->ubi_num, dev->vol_id, vi->name); - mutex_unlock(&devices_mutex); -+ -+ if (!strcmp(vi->name, "rootfs") && -+ IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && -+ ROOT_DEV == 0) { -+ pr_notice("ubiblock: device ubiblock%d_%d (%s) set to be root filesystem\n", -+ dev->ubi_num, dev->vol_id, vi->name); -+ ROOT_DEV = MKDEV(gd->major, gd->first_minor); -+ } -+ - return 0; - - out_free_queue: diff --git a/target/linux/generic/pending-5.10/494-mtd-ubi-add-EOF-marker-support.patch b/target/linux/generic/pending-5.10/494-mtd-ubi-add-EOF-marker-support.patch deleted file mode 100644 index fc48146221..0000000000 --- a/target/linux/generic/pending-5.10/494-mtd-ubi-add-EOF-marker-support.patch +++ /dev/null @@ -1,60 +0,0 @@ -From: Gabor Juhos -Subject: mtd: add EOF marker support to the UBI layer - -Signed-off-by: Gabor Juhos ---- - drivers/mtd/ubi/attach.c | 25 ++++++++++++++++++++++--- - drivers/mtd/ubi/ubi.h | 1 + - 2 files changed, 23 insertions(+), 3 deletions(-) - ---- a/drivers/mtd/ubi/attach.c -+++ b/drivers/mtd/ubi/attach.c -@@ -926,6 +926,13 @@ static bool vol_ignored(int vol_id) - #endif - } - -+static bool ec_hdr_has_eof(struct ubi_ec_hdr *ech) -+{ -+ return ech->padding1[0] == 'E' && -+ ech->padding1[1] == 'O' && -+ ech->padding1[2] == 'F'; -+} -+ - /** - * scan_peb - scan and process UBI headers of a PEB. - * @ubi: UBI device description object -@@ -958,9 +965,21 @@ static int scan_peb(struct ubi_device *u - return 0; - } - -- err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); -- if (err < 0) -- return err; -+ if (!ai->eof_found) { -+ err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); -+ if (err < 0) -+ return err; -+ -+ if (ec_hdr_has_eof(ech)) { -+ pr_notice("UBI: EOF marker found, PEBs from %d will be erased\n", -+ pnum); -+ ai->eof_found = true; -+ } -+ } -+ -+ if (ai->eof_found) -+ err = UBI_IO_FF_BITFLIPS; -+ - switch (err) { - case 0: - break; ---- a/drivers/mtd/ubi/ubi.h -+++ b/drivers/mtd/ubi/ubi.h -@@ -780,6 +780,7 @@ struct ubi_attach_info { - int mean_ec; - uint64_t ec_sum; - int ec_count; -+ bool eof_found; - struct kmem_cache *aeb_slab_cache; - struct ubi_ec_hdr *ech; - struct ubi_vid_io_buf *vidb; diff --git a/target/linux/generic/pending-5.10/495-mtd-core-add-get_mtd_device_by_node.patch b/target/linux/generic/pending-5.10/495-mtd-core-add-get_mtd_device_by_node.patch deleted file mode 100644 index 0ca4f03ff9..0000000000 --- a/target/linux/generic/pending-5.10/495-mtd-core-add-get_mtd_device_by_node.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 1bd1b740f208d1cf4071932cc51860d37266c402 Mon Sep 17 00:00:00 2001 -From: Bernhard Frauendienst -Date: Sat, 1 Sep 2018 00:30:11 +0200 -Subject: [PATCH 495/497] mtd: core: add get_mtd_device_by_node - -Add function to retrieve a mtd device by its OF node. Since drivers can -assign arbitrary names to mtd devices in the absence of a label -property, there is no other reliable way to retrieve a mtd device for a -given OF node. - -Signed-off-by: Bernhard Frauendienst -Reviewed-by: Miquel Raynal ---- - drivers/mtd/mtdcore.c | 38 ++++++++++++++++++++++++++++++++++++++ - include/linux/mtd/mtd.h | 2 ++ - 2 files changed, 40 insertions(+) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -1153,6 +1153,44 @@ out_unlock: - } - EXPORT_SYMBOL_GPL(get_mtd_device_nm); - -+/** -+ * get_mtd_device_by_node - obtain a validated handle for an MTD device -+ * by of_node -+ * @of_node: OF node of MTD device to open -+ * -+ * This function returns MTD device description structure in case of -+ * success and an error code in case of failure. -+ */ -+struct mtd_info *get_mtd_device_by_node(const struct device_node *of_node) -+{ -+ int err = -ENODEV; -+ struct mtd_info *mtd = NULL, *other; -+ -+ mutex_lock(&mtd_table_mutex); -+ -+ mtd_for_each_device(other) { -+ if (of_node == other->dev.of_node) { -+ mtd = other; -+ break; -+ } -+ } -+ -+ if (!mtd) -+ goto out_unlock; -+ -+ err = __get_mtd_device(mtd); -+ if (err) -+ goto out_unlock; -+ -+ mutex_unlock(&mtd_table_mutex); -+ return mtd; -+ -+out_unlock: -+ mutex_unlock(&mtd_table_mutex); -+ return ERR_PTR(err); -+} -+EXPORT_SYMBOL_GPL(get_mtd_device_by_node); -+ - void put_mtd_device(struct mtd_info *mtd) - { - mutex_lock(&mtd_table_mutex); ---- a/include/linux/mtd/mtd.h -+++ b/include/linux/mtd/mtd.h -@@ -697,6 +697,8 @@ extern int __get_mtd_device(struct mtd_i - extern void __put_mtd_device(struct mtd_info *mtd); - extern struct mtd_info *of_get_mtd_device_by_node(struct device_node *np); - extern struct mtd_info *get_mtd_device_nm(const char *name); -+extern struct mtd_info *get_mtd_device_by_node( -+ const struct device_node *of_node); - extern void put_mtd_device(struct mtd_info *mtd); - - static inline uint64_t mtdpart_get_offset(const struct mtd_info *mtd) diff --git a/target/linux/generic/pending-5.10/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch b/target/linux/generic/pending-5.10/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch deleted file mode 100644 index 058cab09e5..0000000000 --- a/target/linux/generic/pending-5.10/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch +++ /dev/null @@ -1,216 +0,0 @@ -From e53f712d8eac71f54399b61038ccf87d2cee99d7 Mon Sep 17 00:00:00 2001 -From: Bernhard Frauendienst -Date: Sat, 25 Aug 2018 12:35:22 +0200 -Subject: [PATCH 497/497] mtd: mtdconcat: add dt driver for concat devices - -Some mtd drivers like physmap variants have support for concatenating -multiple mtd devices, but there is no generic way to define such a -concat device from within the device tree. - -This is useful for some SoC boards that use multiple flash chips as -memory banks of a single mtd device, with partitions spanning chip -borders. - -This commit adds a driver for creating virtual mtd-concat devices. They -must have a compatible = "mtd-concat" line, and define a list of devices -to concat in the 'devices' property, for example: - -flash { - compatible = "mtd-concat"; - - devices = <&flash0 &flash1>; - - partitions { - ... - }; -}; - -The driver is added to the very end of the mtd Makefile to increase the -likelyhood of all child devices already being loaded at the time of -probing, preventing unnecessary deferred probes. - -Signed-off-by: Bernhard Frauendienst ---- - drivers/mtd/Kconfig | 2 + - drivers/mtd/Makefile | 3 + - drivers/mtd/composite/Kconfig | 12 +++ - drivers/mtd/composite/Makefile | 6 ++ - drivers/mtd/composite/virt_concat.c | 128 ++++++++++++++++++++++++++++ - 5 files changed, 151 insertions(+) - create mode 100644 drivers/mtd/composite/Kconfig - create mode 100644 drivers/mtd/composite/Makefile - create mode 100644 drivers/mtd/composite/virt_concat.c - ---- a/drivers/mtd/Kconfig -+++ b/drivers/mtd/Kconfig -@@ -238,4 +238,6 @@ source "drivers/mtd/ubi/Kconfig" - - source "drivers/mtd/hyperbus/Kconfig" - -+source "drivers/mtd/composite/Kconfig" -+ - endif # MTD ---- a/drivers/mtd/Makefile -+++ b/drivers/mtd/Makefile -@@ -33,3 +33,6 @@ obj-y += chips/ lpddr/ maps/ devices/ n - obj-$(CONFIG_MTD_SPI_NOR) += spi-nor/ - obj-$(CONFIG_MTD_UBI) += ubi/ - obj-$(CONFIG_MTD_HYPERBUS) += hyperbus/ -+ -+# Composite drivers must be loaded last -+obj-y += composite/ ---- /dev/null -+++ b/drivers/mtd/composite/Kconfig -@@ -0,0 +1,12 @@ -+menu "Composite MTD device drivers" -+ depends on MTD!=n -+ -+config MTD_VIRT_CONCAT -+ tristate "Virtual concat MTD device" -+ help -+ This driver allows creation of a virtual MTD concat device, which -+ concatenates multiple underlying MTD devices to a single device. -+ This is required by some SoC boards where multiple memory banks are -+ used as one device with partitions spanning across device boundaries. -+ -+endmenu ---- /dev/null -+++ b/drivers/mtd/composite/Makefile -@@ -0,0 +1,6 @@ -+# SPDX-License-Identifier: GPL-2.0 -+# -+# linux/drivers/mtd/composite/Makefile -+# -+ -+obj-$(CONFIG_MTD_VIRT_CONCAT) += virt_concat.o ---- /dev/null -+++ b/drivers/mtd/composite/virt_concat.c -@@ -0,0 +1,128 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Virtual concat MTD device driver -+ * -+ * Copyright (C) 2018 Bernhard Frauendienst -+ * Author: Bernhard Frauendienst, kernel@nospam.obeliks.de -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* -+ * struct of_virt_concat - platform device driver data. -+ * @cmtd the final mtd_concat device -+ * @num_devices the number of devices in @devices -+ * @devices points to an array of devices already loaded -+ */ -+struct of_virt_concat { -+ struct mtd_info *cmtd; -+ int num_devices; -+ struct mtd_info **devices; -+}; -+ -+static int virt_concat_remove(struct platform_device *pdev) -+{ -+ struct of_virt_concat *info; -+ int i; -+ -+ info = platform_get_drvdata(pdev); -+ if (!info) -+ return 0; -+ -+ // unset data for when this is called after a probe error -+ platform_set_drvdata(pdev, NULL); -+ -+ if (info->cmtd) { -+ mtd_device_unregister(info->cmtd); -+ mtd_concat_destroy(info->cmtd); -+ } -+ -+ if (info->devices) { -+ for (i = 0; i < info->num_devices; i++) -+ put_mtd_device(info->devices[i]); -+ } -+ -+ return 0; -+} -+ -+static int virt_concat_probe(struct platform_device *pdev) -+{ -+ struct device_node *node = pdev->dev.of_node; -+ struct of_phandle_iterator it; -+ struct of_virt_concat *info; -+ struct mtd_info *mtd; -+ int err = 0, count; -+ -+ count = of_count_phandle_with_args(node, "devices", NULL); -+ if (count <= 0) -+ return -EINVAL; -+ -+ info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); -+ if (!info) -+ return -ENOMEM; -+ info->devices = devm_kcalloc(&pdev->dev, count, -+ sizeof(*(info->devices)), GFP_KERNEL); -+ if (!info->devices) { -+ err = -ENOMEM; -+ goto err_remove; -+ } -+ -+ platform_set_drvdata(pdev, info); -+ -+ of_for_each_phandle(&it, err, node, "devices", NULL, 0) { -+ mtd = get_mtd_device_by_node(it.node); -+ if (IS_ERR(mtd)) { -+ of_node_put(it.node); -+ err = -EPROBE_DEFER; -+ goto err_remove; -+ } -+ -+ info->devices[info->num_devices++] = mtd; -+ } -+ -+ info->cmtd = mtd_concat_create(info->devices, info->num_devices, -+ dev_name(&pdev->dev)); -+ if (!info->cmtd) { -+ err = -ENXIO; -+ goto err_remove; -+ } -+ -+ info->cmtd->dev.parent = &pdev->dev; -+ mtd_set_of_node(info->cmtd, node); -+ mtd_device_register(info->cmtd, NULL, 0); -+ -+ return 0; -+ -+err_remove: -+ virt_concat_remove(pdev); -+ -+ return err; -+} -+ -+static const struct of_device_id virt_concat_of_match[] = { -+ { .compatible = "mtd-concat", }, -+ { /* sentinel */ } -+}; -+MODULE_DEVICE_TABLE(of, virt_concat_of_match); -+ -+static struct platform_driver virt_concat_driver = { -+ .probe = virt_concat_probe, -+ .remove = virt_concat_remove, -+ .driver = { -+ .name = "virt-mtdconcat", -+ .of_match_table = virt_concat_of_match, -+ }, -+}; -+ -+module_platform_driver(virt_concat_driver); -+ -+MODULE_LICENSE("GPL v2"); -+MODULE_AUTHOR("Bernhard Frauendienst "); -+MODULE_DESCRIPTION("Virtual concat MTD device driver"); diff --git a/target/linux/generic/pending-5.10/498-mtd-spi-nor-locking-support-for-MX25L6405D.patch b/target/linux/generic/pending-5.10/498-mtd-spi-nor-locking-support-for-MX25L6405D.patch deleted file mode 100644 index 62e977c8d1..0000000000 --- a/target/linux/generic/pending-5.10/498-mtd-spi-nor-locking-support-for-MX25L6405D.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 8bf2ce6ea4ee840b70f55a27f80e1cd308051b13 Mon Sep 17 00:00:00 2001 -From: Nick Hainke -Date: Mon, 27 Dec 2021 00:38:13 +0100 -Subject: [PATCH 1/2] mtd: spi-nor: locking support for MX25L6405D - -Macronix MX25L6405D supports locking with four block-protection bits. -Currently, the driver only sets three bits. If the bootloader does not -sustain the flash chip in an unlocked state, the flash might be -non-writeable. Add the corresponding flag to enable locking support with -four bits in the status register. - -Tested on Nanostation M2 XM. - -Similar to commit 7ea40b54e83b ("mtd: spi-nor: enable locking support for -MX25L12805D") - -Signed-off-by: David Bauer -Signed-off-by: Nick Hainke ---- - drivers/mtd/spi-nor/macronix.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - ---- a/drivers/mtd/spi-nor/macronix.c -+++ b/drivers/mtd/spi-nor/macronix.c -@@ -42,7 +42,8 @@ static const struct flash_info macronix_ - { "mx25l1606e", INFO(0xc22015, 0, 64 * 1024, 32, SECT_4K) }, - { "mx25l3205d", INFO(0xc22016, 0, 64 * 1024, 64, SECT_4K) }, - { "mx25l3255e", INFO(0xc29e16, 0, 64 * 1024, 64, SECT_4K) }, -- { "mx25l6405d", INFO(0xc22017, 0, 64 * 1024, 128, SECT_4K) }, -+ { "mx25l6405d", INFO(0xc22017, 0, 64 * 1024, 128, SECT_4K | -+ SPI_NOR_HAS_LOCK | SPI_NOR_4BIT_BP) }, - { "mx25u2033e", INFO(0xc22532, 0, 64 * 1024, 4, SECT_4K) }, - { "mx25u3235f", INFO(0xc22536, 0, 64 * 1024, 64, - SECT_4K | SPI_NOR_DUAL_READ | diff --git a/target/linux/generic/pending-5.10/500-fs_cdrom_dependencies.patch b/target/linux/generic/pending-5.10/500-fs_cdrom_dependencies.patch deleted file mode 100644 index 0a5a3aae5d..0000000000 --- a/target/linux/generic/pending-5.10/500-fs_cdrom_dependencies.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- a/fs/hfs/Kconfig -+++ b/fs/hfs/Kconfig -@@ -2,6 +2,7 @@ - config HFS_FS - tristate "Apple Macintosh file system support" - depends on BLOCK -+ select CDROM - select NLS - help - If you say Y here, you will be able to mount Macintosh-formatted ---- a/fs/hfsplus/Kconfig -+++ b/fs/hfsplus/Kconfig -@@ -2,6 +2,7 @@ - config HFSPLUS_FS - tristate "Apple Extended HFS file system support" - depends on BLOCK -+ select CDROM - select NLS - select NLS_UTF8 - help ---- a/fs/isofs/Kconfig -+++ b/fs/isofs/Kconfig -@@ -1,6 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0-only - config ISO9660_FS - tristate "ISO 9660 CDROM file system support" -+ select CDROM - help - This is the standard file system used on CD-ROMs. It was previously - known as "High Sierra File System" and is called "hsfs" on other ---- a/fs/udf/Kconfig -+++ b/fs/udf/Kconfig -@@ -1,6 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0-only - config UDF_FS - tristate "UDF file system support" -+ select CDROM - select CRC_ITU_T - select NLS - help diff --git a/target/linux/generic/pending-5.10/530-jffs2_make_lzma_available.patch b/target/linux/generic/pending-5.10/530-jffs2_make_lzma_available.patch deleted file mode 100644 index bd901efd71..0000000000 --- a/target/linux/generic/pending-5.10/530-jffs2_make_lzma_available.patch +++ /dev/null @@ -1,5180 +0,0 @@ -From: Alexandros C. Couloumbis -Subject: fs: add jffs2/lzma support (not activated by default yet) - -lede-commit: c2c88d315fa0e881f8b19da07b62859b915b11b2 -Signed-off-by: Alexandros C. Couloumbis ---- - fs/jffs2/Kconfig | 9 + - fs/jffs2/Makefile | 3 + - fs/jffs2/compr.c | 6 + - fs/jffs2/compr.h | 10 +- - fs/jffs2/compr_lzma.c | 128 +++ - fs/jffs2/super.c | 33 +- - include/linux/lzma.h | 62 ++ - include/linux/lzma/LzFind.h | 115 +++ - include/linux/lzma/LzHash.h | 54 + - include/linux/lzma/LzmaDec.h | 231 +++++ - include/linux/lzma/LzmaEnc.h | 80 ++ - include/linux/lzma/Types.h | 226 +++++ - include/uapi/linux/jffs2.h | 1 + - lib/Kconfig | 6 + - lib/Makefile | 12 + - lib/lzma/LzFind.c | 761 ++++++++++++++ - lib/lzma/LzmaDec.c | 999 +++++++++++++++++++ - lib/lzma/LzmaEnc.c | 2271 ++++++++++++++++++++++++++++++++++++++++++ - lib/lzma/Makefile | 7 + - 19 files changed, 5008 insertions(+), 6 deletions(-) - create mode 100644 fs/jffs2/compr_lzma.c - create mode 100644 include/linux/lzma.h - create mode 100644 include/linux/lzma/LzFind.h - create mode 100644 include/linux/lzma/LzHash.h - create mode 100644 include/linux/lzma/LzmaDec.h - create mode 100644 include/linux/lzma/LzmaEnc.h - create mode 100644 include/linux/lzma/Types.h - create mode 100644 lib/lzma/LzFind.c - create mode 100644 lib/lzma/LzmaDec.c - create mode 100644 lib/lzma/LzmaEnc.c - create mode 100644 lib/lzma/Makefile - ---- a/fs/jffs2/Kconfig -+++ b/fs/jffs2/Kconfig -@@ -136,6 +136,15 @@ config JFFS2_LZO - This feature was added in July, 2007. Say 'N' if you need - compatibility with older bootloaders or kernels. - -+config JFFS2_LZMA -+ bool "JFFS2 LZMA compression support" if JFFS2_COMPRESSION_OPTIONS -+ select LZMA_COMPRESS -+ select LZMA_DECOMPRESS -+ depends on JFFS2_FS -+ default n -+ help -+ JFFS2 wrapper to the LZMA C SDK -+ - config JFFS2_RTIME - bool "JFFS2 RTIME compression support" if JFFS2_COMPRESSION_OPTIONS - depends on JFFS2_FS ---- a/fs/jffs2/Makefile -+++ b/fs/jffs2/Makefile -@@ -19,4 +19,7 @@ jffs2-$(CONFIG_JFFS2_RUBIN) += compr_rub - jffs2-$(CONFIG_JFFS2_RTIME) += compr_rtime.o - jffs2-$(CONFIG_JFFS2_ZLIB) += compr_zlib.o - jffs2-$(CONFIG_JFFS2_LZO) += compr_lzo.o -+jffs2-$(CONFIG_JFFS2_LZMA) += compr_lzma.o - jffs2-$(CONFIG_JFFS2_SUMMARY) += summary.o -+ -+CFLAGS_compr_lzma.o += -Iinclude/linux -Ilib/lzma ---- a/fs/jffs2/compr.c -+++ b/fs/jffs2/compr.c -@@ -378,6 +378,9 @@ int __init jffs2_compressors_init(void) - #ifdef CONFIG_JFFS2_LZO - jffs2_lzo_init(); - #endif -+#ifdef CONFIG_JFFS2_LZMA -+ jffs2_lzma_init(); -+#endif - /* Setting default compression mode */ - #ifdef CONFIG_JFFS2_CMODE_NONE - jffs2_compression_mode = JFFS2_COMPR_MODE_NONE; -@@ -401,6 +404,9 @@ int __init jffs2_compressors_init(void) - int jffs2_compressors_exit(void) - { - /* Unregistering compressors */ -+#ifdef CONFIG_JFFS2_LZMA -+ jffs2_lzma_exit(); -+#endif - #ifdef CONFIG_JFFS2_LZO - jffs2_lzo_exit(); - #endif ---- a/fs/jffs2/compr.h -+++ b/fs/jffs2/compr.h -@@ -29,9 +29,9 @@ - #define JFFS2_DYNRUBIN_PRIORITY 20 - #define JFFS2_LZARI_PRIORITY 30 - #define JFFS2_RTIME_PRIORITY 50 --#define JFFS2_ZLIB_PRIORITY 60 --#define JFFS2_LZO_PRIORITY 80 -- -+#define JFFS2_LZMA_PRIORITY 70 -+#define JFFS2_ZLIB_PRIORITY 80 -+#define JFFS2_LZO_PRIORITY 90 - - #define JFFS2_RUBINMIPS_DISABLED /* RUBINs will be used only */ - #define JFFS2_DYNRUBIN_DISABLED /* for decompression */ -@@ -101,5 +101,9 @@ void jffs2_zlib_exit(void); - int jffs2_lzo_init(void); - void jffs2_lzo_exit(void); - #endif -+#ifdef CONFIG_JFFS2_LZMA -+int jffs2_lzma_init(void); -+void jffs2_lzma_exit(void); -+#endif - - #endif /* __JFFS2_COMPR_H__ */ ---- /dev/null -+++ b/fs/jffs2/compr_lzma.c -@@ -0,0 +1,128 @@ -+/* -+ * JFFS2 -- Journalling Flash File System, Version 2. -+ * -+ * For licensing information, see the file 'LICENCE' in this directory. -+ * -+ * JFFS2 wrapper to the LZMA C SDK -+ * -+ */ -+ -+#include -+#include "compr.h" -+ -+#ifdef __KERNEL__ -+ static DEFINE_MUTEX(deflate_mutex); -+#endif -+ -+CLzmaEncHandle *p; -+Byte propsEncoded[LZMA_PROPS_SIZE]; -+SizeT propsSize = sizeof(propsEncoded); -+ -+STATIC void lzma_free_workspace(void) -+{ -+ LzmaEnc_Destroy(p, &lzma_alloc, &lzma_alloc); -+} -+ -+STATIC int INIT lzma_alloc_workspace(CLzmaEncProps *props) -+{ -+ if ((p = (CLzmaEncHandle *)LzmaEnc_Create(&lzma_alloc)) == NULL) -+ { -+ PRINT_ERROR("Failed to allocate lzma deflate workspace\n"); -+ return -ENOMEM; -+ } -+ -+ if (LzmaEnc_SetProps(p, props) != SZ_OK) -+ { -+ lzma_free_workspace(); -+ return -1; -+ } -+ -+ if (LzmaEnc_WriteProperties(p, propsEncoded, &propsSize) != SZ_OK) -+ { -+ lzma_free_workspace(); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+STATIC int jffs2_lzma_compress(unsigned char *data_in, unsigned char *cpage_out, -+ uint32_t *sourcelen, uint32_t *dstlen) -+{ -+ SizeT compress_size = (SizeT)(*dstlen); -+ int ret; -+ -+ #ifdef __KERNEL__ -+ mutex_lock(&deflate_mutex); -+ #endif -+ -+ ret = LzmaEnc_MemEncode(p, cpage_out, &compress_size, data_in, *sourcelen, -+ 0, NULL, &lzma_alloc, &lzma_alloc); -+ -+ #ifdef __KERNEL__ -+ mutex_unlock(&deflate_mutex); -+ #endif -+ -+ if (ret != SZ_OK) -+ return -1; -+ -+ *dstlen = (uint32_t)compress_size; -+ -+ return 0; -+} -+ -+STATIC int jffs2_lzma_decompress(unsigned char *data_in, unsigned char *cpage_out, -+ uint32_t srclen, uint32_t destlen) -+{ -+ int ret; -+ SizeT dl = (SizeT)destlen; -+ SizeT sl = (SizeT)srclen; -+ ELzmaStatus status; -+ -+ ret = LzmaDecode(cpage_out, &dl, data_in, &sl, propsEncoded, -+ propsSize, LZMA_FINISH_ANY, &status, &lzma_alloc); -+ -+ if (ret != SZ_OK || status == LZMA_STATUS_NOT_FINISHED || dl != (SizeT)destlen) -+ return -1; -+ -+ return 0; -+} -+ -+static struct jffs2_compressor jffs2_lzma_comp = { -+ .priority = JFFS2_LZMA_PRIORITY, -+ .name = "lzma", -+ .compr = JFFS2_COMPR_LZMA, -+ .compress = &jffs2_lzma_compress, -+ .decompress = &jffs2_lzma_decompress, -+ .disabled = 0, -+}; -+ -+int INIT jffs2_lzma_init(void) -+{ -+ int ret; -+ CLzmaEncProps props; -+ LzmaEncProps_Init(&props); -+ -+ props.dictSize = LZMA_BEST_DICT(0x2000); -+ props.level = LZMA_BEST_LEVEL; -+ props.lc = LZMA_BEST_LC; -+ props.lp = LZMA_BEST_LP; -+ props.pb = LZMA_BEST_PB; -+ props.fb = LZMA_BEST_FB; -+ -+ ret = lzma_alloc_workspace(&props); -+ if (ret < 0) -+ return ret; -+ -+ ret = jffs2_register_compressor(&jffs2_lzma_comp); -+ if (ret) -+ lzma_free_workspace(); -+ -+ return ret; -+} -+ -+void jffs2_lzma_exit(void) -+{ -+ jffs2_unregister_compressor(&jffs2_lzma_comp); -+ lzma_free_workspace(); -+} ---- a/fs/jffs2/super.c -+++ b/fs/jffs2/super.c -@@ -374,14 +374,41 @@ static int __init init_jffs2_fs(void) - BUILD_BUG_ON(sizeof(struct jffs2_raw_inode) != 68); - BUILD_BUG_ON(sizeof(struct jffs2_raw_summary) != 32); - -- pr_info("version 2.2." -+ pr_info("version 2.2" - #ifdef CONFIG_JFFS2_FS_WRITEBUFFER - " (NAND)" - #endif - #ifdef CONFIG_JFFS2_SUMMARY -- " (SUMMARY) " -+ " (SUMMARY)" - #endif -- " © 2001-2006 Red Hat, Inc.\n"); -+#ifdef CONFIG_JFFS2_ZLIB -+ " (ZLIB)" -+#endif -+#ifdef CONFIG_JFFS2_LZO -+ " (LZO)" -+#endif -+#ifdef CONFIG_JFFS2_LZMA -+ " (LZMA)" -+#endif -+#ifdef CONFIG_JFFS2_RTIME -+ " (RTIME)" -+#endif -+#ifdef CONFIG_JFFS2_RUBIN -+ " (RUBIN)" -+#endif -+#ifdef CONFIG_JFFS2_CMODE_NONE -+ " (CMODE_NONE)" -+#endif -+#ifdef CONFIG_JFFS2_CMODE_PRIORITY -+ " (CMODE_PRIORITY)" -+#endif -+#ifdef CONFIG_JFFS2_CMODE_SIZE -+ " (CMODE_SIZE)" -+#endif -+#ifdef CONFIG_JFFS2_CMODE_FAVOURLZO -+ " (CMODE_FAVOURLZO)" -+#endif -+ " (c) 2001-2006 Red Hat, Inc.\n"); - - jffs2_inode_cachep = kmem_cache_create("jffs2_i", - sizeof(struct jffs2_inode_info), ---- /dev/null -+++ b/include/linux/lzma.h -@@ -0,0 +1,62 @@ -+#ifndef __LZMA_H__ -+#define __LZMA_H__ -+ -+#ifdef __KERNEL__ -+ #include -+ #include -+ #include -+ #include -+ #include -+ #define LZMA_MALLOC vmalloc -+ #define LZMA_FREE vfree -+ #define PRINT_ERROR(msg) printk(KERN_WARNING #msg) -+ #define INIT __init -+ #define STATIC static -+#else -+ #include -+ #include -+ #include -+ #include -+ #include -+ #include -+ #include -+ #include -+ #ifndef PAGE_SIZE -+ extern int page_size; -+ #define PAGE_SIZE page_size -+ #endif -+ #define LZMA_MALLOC malloc -+ #define LZMA_FREE free -+ #define PRINT_ERROR(msg) fprintf(stderr, msg) -+ #define INIT -+ #define STATIC -+#endif -+ -+#include "lzma/LzmaDec.h" -+#include "lzma/LzmaEnc.h" -+ -+#define LZMA_BEST_LEVEL (9) -+#define LZMA_BEST_LC (0) -+#define LZMA_BEST_LP (0) -+#define LZMA_BEST_PB (0) -+#define LZMA_BEST_FB (273) -+ -+#define LZMA_BEST_DICT(n) (((int)((n) / 2)) * 2) -+ -+static void *p_lzma_malloc(void *p, size_t size) -+{ -+ if (size == 0) -+ return NULL; -+ -+ return LZMA_MALLOC(size); -+} -+ -+static void p_lzma_free(void *p, void *address) -+{ -+ if (address != NULL) -+ LZMA_FREE(address); -+} -+ -+static ISzAlloc lzma_alloc = { .Alloc = p_lzma_malloc, .Free = p_lzma_free }; -+ -+#endif ---- /dev/null -+++ b/include/linux/lzma/LzFind.h -@@ -0,0 +1,115 @@ -+/* LzFind.h -- Match finder for LZ algorithms -+2009-04-22 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZ_FIND_H -+#define __LZ_FIND_H -+ -+#include "Types.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+typedef UInt32 CLzRef; -+ -+typedef struct _CMatchFinder -+{ -+ Byte *buffer; -+ UInt32 pos; -+ UInt32 posLimit; -+ UInt32 streamPos; -+ UInt32 lenLimit; -+ -+ UInt32 cyclicBufferPos; -+ UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ -+ -+ UInt32 matchMaxLen; -+ CLzRef *hash; -+ CLzRef *son; -+ UInt32 hashMask; -+ UInt32 cutValue; -+ -+ Byte *bufferBase; -+ ISeqInStream *stream; -+ int streamEndWasReached; -+ -+ UInt32 blockSize; -+ UInt32 keepSizeBefore; -+ UInt32 keepSizeAfter; -+ -+ UInt32 numHashBytes; -+ int directInput; -+ size_t directInputRem; -+ int btMode; -+ int bigHash; -+ UInt32 historySize; -+ UInt32 fixedHashSize; -+ UInt32 hashSizeSum; -+ UInt32 numSons; -+ SRes result; -+ UInt32 crc[256]; -+} CMatchFinder; -+ -+#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) -+#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)]) -+ -+#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) -+ -+int MatchFinder_NeedMove(CMatchFinder *p); -+Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); -+void MatchFinder_MoveBlock(CMatchFinder *p); -+void MatchFinder_ReadIfRequired(CMatchFinder *p); -+ -+void MatchFinder_Construct(CMatchFinder *p); -+ -+/* Conditions: -+ historySize <= 3 GB -+ keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB -+*/ -+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, -+ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, -+ ISzAlloc *alloc); -+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); -+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems); -+void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); -+ -+UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, -+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, -+ UInt32 *distances, UInt32 maxLen); -+ -+/* -+Conditions: -+ Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. -+ Mf_GetPointerToCurrentPos_Func's result must be used only before any other function -+*/ -+ -+typedef void (*Mf_Init_Func)(void *object); -+typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index); -+typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); -+typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); -+typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); -+typedef void (*Mf_Skip_Func)(void *object, UInt32); -+ -+typedef struct _IMatchFinder -+{ -+ Mf_Init_Func Init; -+ Mf_GetIndexByte_Func GetIndexByte; -+ Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; -+ Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; -+ Mf_GetMatches_Func GetMatches; -+ Mf_Skip_Func Skip; -+} IMatchFinder; -+ -+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); -+ -+void MatchFinder_Init(CMatchFinder *p); -+UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); -+UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); -+void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); -+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif ---- /dev/null -+++ b/include/linux/lzma/LzHash.h -@@ -0,0 +1,54 @@ -+/* LzHash.h -- HASH functions for LZ algorithms -+2009-02-07 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZ_HASH_H -+#define __LZ_HASH_H -+ -+#define kHash2Size (1 << 10) -+#define kHash3Size (1 << 16) -+#define kHash4Size (1 << 20) -+ -+#define kFix3HashSize (kHash2Size) -+#define kFix4HashSize (kHash2Size + kHash3Size) -+#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) -+ -+#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8); -+ -+#define HASH3_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } -+ -+#define HASH4_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ -+ hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; } -+ -+#define HASH5_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ -+ hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \ -+ hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \ -+ hash4Value &= (kHash4Size - 1); } -+ -+/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */ -+#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; -+ -+ -+#define MT_HASH2_CALC \ -+ hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); -+ -+#define MT_HASH3_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } -+ -+#define MT_HASH4_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ -+ hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); } -+ -+#endif ---- /dev/null -+++ b/include/linux/lzma/LzmaDec.h -@@ -0,0 +1,231 @@ -+/* LzmaDec.h -- LZMA Decoder -+2009-02-07 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZMA_DEC_H -+#define __LZMA_DEC_H -+ -+#include "Types.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/* #define _LZMA_PROB32 */ -+/* _LZMA_PROB32 can increase the speed on some CPUs, -+ but memory usage for CLzmaDec::probs will be doubled in that case */ -+ -+#ifdef _LZMA_PROB32 -+#define CLzmaProb UInt32 -+#else -+#define CLzmaProb UInt16 -+#endif -+ -+ -+/* ---------- LZMA Properties ---------- */ -+ -+#define LZMA_PROPS_SIZE 5 -+ -+typedef struct _CLzmaProps -+{ -+ unsigned lc, lp, pb; -+ UInt32 dicSize; -+} CLzmaProps; -+ -+/* LzmaProps_Decode - decodes properties -+Returns: -+ SZ_OK -+ SZ_ERROR_UNSUPPORTED - Unsupported properties -+*/ -+ -+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); -+ -+ -+/* ---------- LZMA Decoder state ---------- */ -+ -+/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. -+ Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ -+ -+#define LZMA_REQUIRED_INPUT_MAX 20 -+ -+typedef struct -+{ -+ CLzmaProps prop; -+ CLzmaProb *probs; -+ Byte *dic; -+ const Byte *buf; -+ UInt32 range, code; -+ SizeT dicPos; -+ SizeT dicBufSize; -+ UInt32 processedPos; -+ UInt32 checkDicSize; -+ unsigned state; -+ UInt32 reps[4]; -+ unsigned remainLen; -+ int needFlush; -+ int needInitState; -+ UInt32 numProbs; -+ unsigned tempBufSize; -+ Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; -+} CLzmaDec; -+ -+#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } -+ -+void LzmaDec_Init(CLzmaDec *p); -+ -+/* There are two types of LZMA streams: -+ 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. -+ 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ -+ -+typedef enum -+{ -+ LZMA_FINISH_ANY, /* finish at any point */ -+ LZMA_FINISH_END /* block must be finished at the end */ -+} ELzmaFinishMode; -+ -+/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! -+ -+ You must use LZMA_FINISH_END, when you know that current output buffer -+ covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. -+ -+ If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, -+ and output value of destLen will be less than output buffer size limit. -+ You can check status result also. -+ -+ You can use multiple checks to test data integrity after full decompression: -+ 1) Check Result and "status" variable. -+ 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. -+ 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. -+ You must use correct finish mode in that case. */ -+ -+typedef enum -+{ -+ LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ -+ LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ -+ LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ -+ LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ -+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ -+} ELzmaStatus; -+ -+/* ELzmaStatus is used only as output value for function call */ -+ -+ -+/* ---------- Interfaces ---------- */ -+ -+/* There are 3 levels of interfaces: -+ 1) Dictionary Interface -+ 2) Buffer Interface -+ 3) One Call Interface -+ You can select any of these interfaces, but don't mix functions from different -+ groups for same object. */ -+ -+ -+/* There are two variants to allocate state for Dictionary Interface: -+ 1) LzmaDec_Allocate / LzmaDec_Free -+ 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs -+ You can use variant 2, if you set dictionary buffer manually. -+ For Buffer Interface you must always use variant 1. -+ -+LzmaDec_Allocate* can return: -+ SZ_OK -+ SZ_ERROR_MEM - Memory allocation error -+ SZ_ERROR_UNSUPPORTED - Unsupported properties -+*/ -+ -+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); -+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); -+ -+SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); -+void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); -+ -+/* ---------- Dictionary Interface ---------- */ -+ -+/* You can use it, if you want to eliminate the overhead for data copying from -+ dictionary to some other external buffer. -+ You must work with CLzmaDec variables directly in this interface. -+ -+ STEPS: -+ LzmaDec_Constr() -+ LzmaDec_Allocate() -+ for (each new stream) -+ { -+ LzmaDec_Init() -+ while (it needs more decompression) -+ { -+ LzmaDec_DecodeToDic() -+ use data from CLzmaDec::dic and update CLzmaDec::dicPos -+ } -+ } -+ LzmaDec_Free() -+*/ -+ -+/* LzmaDec_DecodeToDic -+ -+ The decoding to internal dictionary buffer (CLzmaDec::dic). -+ You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! -+ -+finishMode: -+ It has meaning only if the decoding reaches output limit (dicLimit). -+ LZMA_FINISH_ANY - Decode just dicLimit bytes. -+ LZMA_FINISH_END - Stream must be finished after dicLimit. -+ -+Returns: -+ SZ_OK -+ status: -+ LZMA_STATUS_FINISHED_WITH_MARK -+ LZMA_STATUS_NOT_FINISHED -+ LZMA_STATUS_NEEDS_MORE_INPUT -+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK -+ SZ_ERROR_DATA - Data error -+*/ -+ -+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, -+ const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); -+ -+ -+/* ---------- Buffer Interface ---------- */ -+ -+/* It's zlib-like interface. -+ See LzmaDec_DecodeToDic description for information about STEPS and return results, -+ but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need -+ to work with CLzmaDec variables manually. -+ -+finishMode: -+ It has meaning only if the decoding reaches output limit (*destLen). -+ LZMA_FINISH_ANY - Decode just destLen bytes. -+ LZMA_FINISH_END - Stream must be finished after (*destLen). -+*/ -+ -+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, -+ const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); -+ -+ -+/* ---------- One Call Interface ---------- */ -+ -+/* LzmaDecode -+ -+finishMode: -+ It has meaning only if the decoding reaches output limit (*destLen). -+ LZMA_FINISH_ANY - Decode just destLen bytes. -+ LZMA_FINISH_END - Stream must be finished after (*destLen). -+ -+Returns: -+ SZ_OK -+ status: -+ LZMA_STATUS_FINISHED_WITH_MARK -+ LZMA_STATUS_NOT_FINISHED -+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK -+ SZ_ERROR_DATA - Data error -+ SZ_ERROR_MEM - Memory allocation error -+ SZ_ERROR_UNSUPPORTED - Unsupported properties -+ SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). -+*/ -+ -+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, -+ const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, -+ ELzmaStatus *status, ISzAlloc *alloc); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif ---- /dev/null -+++ b/include/linux/lzma/LzmaEnc.h -@@ -0,0 +1,80 @@ -+/* LzmaEnc.h -- LZMA Encoder -+2009-02-07 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZMA_ENC_H -+#define __LZMA_ENC_H -+ -+#include "Types.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#define LZMA_PROPS_SIZE 5 -+ -+typedef struct _CLzmaEncProps -+{ -+ int level; /* 0 <= level <= 9 */ -+ UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version -+ (1 << 12) <= dictSize <= (1 << 30) for 64-bit version -+ default = (1 << 24) */ -+ int lc; /* 0 <= lc <= 8, default = 3 */ -+ int lp; /* 0 <= lp <= 4, default = 0 */ -+ int pb; /* 0 <= pb <= 4, default = 2 */ -+ int algo; /* 0 - fast, 1 - normal, default = 1 */ -+ int fb; /* 5 <= fb <= 273, default = 32 */ -+ int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ -+ int numHashBytes; /* 2, 3 or 4, default = 4 */ -+ UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ -+ unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ -+ int numThreads; /* 1 or 2, default = 2 */ -+} CLzmaEncProps; -+ -+void LzmaEncProps_Init(CLzmaEncProps *p); -+void LzmaEncProps_Normalize(CLzmaEncProps *p); -+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2); -+ -+ -+/* ---------- CLzmaEncHandle Interface ---------- */ -+ -+/* LzmaEnc_* functions can return the following exit codes: -+Returns: -+ SZ_OK - OK -+ SZ_ERROR_MEM - Memory allocation error -+ SZ_ERROR_PARAM - Incorrect paramater in props -+ SZ_ERROR_WRITE - Write callback error. -+ SZ_ERROR_PROGRESS - some break from progress callback -+ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -+*/ -+ -+typedef void * CLzmaEncHandle; -+ -+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc); -+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig); -+SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); -+SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); -+SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, -+ ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); -+SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -+ int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); -+ -+/* ---------- One Call Interface ---------- */ -+ -+/* LzmaEncode -+Return code: -+ SZ_OK - OK -+ SZ_ERROR_MEM - Memory allocation error -+ SZ_ERROR_PARAM - Incorrect paramater -+ SZ_ERROR_OUTPUT_EOF - output buffer overflow -+ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -+*/ -+ -+SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -+ const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, -+ ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif ---- /dev/null -+++ b/include/linux/lzma/Types.h -@@ -0,0 +1,226 @@ -+/* Types.h -- Basic types -+2009-11-23 : Igor Pavlov : Public domain */ -+ -+#ifndef __7Z_TYPES_H -+#define __7Z_TYPES_H -+ -+#include -+ -+#ifdef _WIN32 -+#include -+#endif -+ -+#ifndef EXTERN_C_BEGIN -+#ifdef __cplusplus -+#define EXTERN_C_BEGIN extern "C" { -+#define EXTERN_C_END } -+#else -+#define EXTERN_C_BEGIN -+#define EXTERN_C_END -+#endif -+#endif -+ -+EXTERN_C_BEGIN -+ -+#define SZ_OK 0 -+ -+#define SZ_ERROR_DATA 1 -+#define SZ_ERROR_MEM 2 -+#define SZ_ERROR_CRC 3 -+#define SZ_ERROR_UNSUPPORTED 4 -+#define SZ_ERROR_PARAM 5 -+#define SZ_ERROR_INPUT_EOF 6 -+#define SZ_ERROR_OUTPUT_EOF 7 -+#define SZ_ERROR_READ 8 -+#define SZ_ERROR_WRITE 9 -+#define SZ_ERROR_PROGRESS 10 -+#define SZ_ERROR_FAIL 11 -+#define SZ_ERROR_THREAD 12 -+ -+#define SZ_ERROR_ARCHIVE 16 -+#define SZ_ERROR_NO_ARCHIVE 17 -+ -+typedef int SRes; -+ -+#ifdef _WIN32 -+typedef DWORD WRes; -+#else -+typedef int WRes; -+#endif -+ -+#ifndef RINOK -+#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } -+#endif -+ -+typedef unsigned char Byte; -+typedef short Int16; -+typedef unsigned short UInt16; -+ -+#ifdef _LZMA_UINT32_IS_ULONG -+typedef long Int32; -+typedef unsigned long UInt32; -+#else -+typedef int Int32; -+typedef unsigned int UInt32; -+#endif -+ -+#ifdef _SZ_NO_INT_64 -+ -+/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. -+ NOTES: Some code will work incorrectly in that case! */ -+ -+typedef long Int64; -+typedef unsigned long UInt64; -+ -+#else -+ -+#if defined(_MSC_VER) || defined(__BORLANDC__) -+typedef __int64 Int64; -+typedef unsigned __int64 UInt64; -+#else -+typedef long long int Int64; -+typedef unsigned long long int UInt64; -+#endif -+ -+#endif -+ -+#ifdef _LZMA_NO_SYSTEM_SIZE_T -+typedef UInt32 SizeT; -+#else -+typedef size_t SizeT; -+#endif -+ -+typedef int Bool; -+#define True 1 -+#define False 0 -+ -+ -+#ifdef _WIN32 -+#define MY_STD_CALL __stdcall -+#else -+#define MY_STD_CALL -+#endif -+ -+#ifdef _MSC_VER -+ -+#if _MSC_VER >= 1300 -+#define MY_NO_INLINE __declspec(noinline) -+#else -+#define MY_NO_INLINE -+#endif -+ -+#define MY_CDECL __cdecl -+#define MY_FAST_CALL __fastcall -+ -+#else -+ -+#define MY_CDECL -+#define MY_FAST_CALL -+ -+#endif -+ -+ -+/* The following interfaces use first parameter as pointer to structure */ -+ -+typedef struct -+{ -+ SRes (*Read)(void *p, void *buf, size_t *size); -+ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. -+ (output(*size) < input(*size)) is allowed */ -+} ISeqInStream; -+ -+/* it can return SZ_ERROR_INPUT_EOF */ -+SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); -+SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); -+SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); -+ -+typedef struct -+{ -+ size_t (*Write)(void *p, const void *buf, size_t size); -+ /* Returns: result - the number of actually written bytes. -+ (result < size) means error */ -+} ISeqOutStream; -+ -+typedef enum -+{ -+ SZ_SEEK_SET = 0, -+ SZ_SEEK_CUR = 1, -+ SZ_SEEK_END = 2 -+} ESzSeek; -+ -+typedef struct -+{ -+ SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ -+ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); -+} ISeekInStream; -+ -+typedef struct -+{ -+ SRes (*Look)(void *p, void **buf, size_t *size); -+ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. -+ (output(*size) > input(*size)) is not allowed -+ (output(*size) < input(*size)) is allowed */ -+ SRes (*Skip)(void *p, size_t offset); -+ /* offset must be <= output(*size) of Look */ -+ -+ SRes (*Read)(void *p, void *buf, size_t *size); -+ /* reads directly (without buffer). It's same as ISeqInStream::Read */ -+ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); -+} ILookInStream; -+ -+SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); -+SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); -+ -+/* reads via ILookInStream::Read */ -+SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); -+SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); -+ -+#define LookToRead_BUF_SIZE (1 << 14) -+ -+typedef struct -+{ -+ ILookInStream s; -+ ISeekInStream *realStream; -+ size_t pos; -+ size_t size; -+ Byte buf[LookToRead_BUF_SIZE]; -+} CLookToRead; -+ -+void LookToRead_CreateVTable(CLookToRead *p, int lookahead); -+void LookToRead_Init(CLookToRead *p); -+ -+typedef struct -+{ -+ ISeqInStream s; -+ ILookInStream *realStream; -+} CSecToLook; -+ -+void SecToLook_CreateVTable(CSecToLook *p); -+ -+typedef struct -+{ -+ ISeqInStream s; -+ ILookInStream *realStream; -+} CSecToRead; -+ -+void SecToRead_CreateVTable(CSecToRead *p); -+ -+typedef struct -+{ -+ SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); -+ /* Returns: result. (result != SZ_OK) means break. -+ Value (UInt64)(Int64)-1 for size means unknown value. */ -+} ICompressProgress; -+ -+typedef struct -+{ -+ void *(*Alloc)(void *p, size_t size); -+ void (*Free)(void *p, void *address); /* address can be 0 */ -+} ISzAlloc; -+ -+#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) -+#define IAlloc_Free(p, a) (p)->Free((p), a) -+ -+EXTERN_C_END -+ -+#endif ---- a/include/uapi/linux/jffs2.h -+++ b/include/uapi/linux/jffs2.h -@@ -46,6 +46,7 @@ - #define JFFS2_COMPR_DYNRUBIN 0x05 - #define JFFS2_COMPR_ZLIB 0x06 - #define JFFS2_COMPR_LZO 0x07 -+#define JFFS2_COMPR_LZMA 0x08 - /* Compatibility flags. */ - #define JFFS2_COMPAT_MASK 0xc000 /* What do to if an unknown nodetype is found */ - #define JFFS2_NODE_ACCURATE 0x2000 ---- a/lib/Kconfig -+++ b/lib/Kconfig -@@ -320,6 +320,12 @@ config ZSTD_DECOMPRESS - - source "lib/xz/Kconfig" - -+config LZMA_COMPRESS -+ tristate -+ -+config LZMA_DECOMPRESS -+ tristate -+ - # - # These all provide a common interface (hence the apparent duplication with - # ZLIB_INFLATE; DECOMPRESS_GZIP is just a wrapper.) ---- a/lib/Makefile -+++ b/lib/Makefile -@@ -136,6 +136,16 @@ CFLAGS_kobject.o += -DDEBUG - CFLAGS_kobject_uevent.o += -DDEBUG - endif - -+ifdef CONFIG_JFFS2_ZLIB -+ CONFIG_ZLIB_INFLATE:=y -+ CONFIG_ZLIB_DEFLATE:=y -+endif -+ -+ifdef CONFIG_JFFS2_LZMA -+ CONFIG_LZMA_DECOMPRESS:=y -+ CONFIG_LZMA_COMPRESS:=y -+endif -+ - obj-$(CONFIG_DEBUG_INFO_REDUCED) += debug_info.o - CFLAGS_debug_info.o += $(call cc-option, -femit-struct-debug-detailed=any) - -@@ -191,6 +201,8 @@ obj-$(CONFIG_ZSTD_COMPRESS) += zstd/ - obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd/ - obj-$(CONFIG_XZ_DEC) += xz/ - obj-$(CONFIG_RAID6_PQ) += raid6/ -+obj-$(CONFIG_LZMA_COMPRESS) += lzma/ -+obj-$(CONFIG_LZMA_DECOMPRESS) += lzma/ - - lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o - lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o ---- /dev/null -+++ b/lib/lzma/LzFind.c -@@ -0,0 +1,761 @@ -+/* LzFind.c -- Match finder for LZ algorithms -+2009-04-22 : Igor Pavlov : Public domain */ -+ -+#include -+ -+#include "LzFind.h" -+#include "LzHash.h" -+ -+#define kEmptyHashValue 0 -+#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) -+#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */ -+#define kNormalizeMask (~(kNormalizeStepMin - 1)) -+#define kMaxHistorySize ((UInt32)3 << 30) -+ -+#define kStartMaxLen 3 -+ -+static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) -+{ -+ if (!p->directInput) -+ { -+ alloc->Free(alloc, p->bufferBase); -+ p->bufferBase = 0; -+ } -+} -+ -+/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ -+ -+static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) -+{ -+ UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; -+ if (p->directInput) -+ { -+ p->blockSize = blockSize; -+ return 1; -+ } -+ if (p->bufferBase == 0 || p->blockSize != blockSize) -+ { -+ LzInWindow_Free(p, alloc); -+ p->blockSize = blockSize; -+ p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize); -+ } -+ return (p->bufferBase != 0); -+} -+ -+Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } -+Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; } -+ -+UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } -+ -+void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) -+{ -+ p->posLimit -= subValue; -+ p->pos -= subValue; -+ p->streamPos -= subValue; -+} -+ -+static void MatchFinder_ReadBlock(CMatchFinder *p) -+{ -+ if (p->streamEndWasReached || p->result != SZ_OK) -+ return; -+ if (p->directInput) -+ { -+ UInt32 curSize = 0xFFFFFFFF - p->streamPos; -+ if (curSize > p->directInputRem) -+ curSize = (UInt32)p->directInputRem; -+ p->directInputRem -= curSize; -+ p->streamPos += curSize; -+ if (p->directInputRem == 0) -+ p->streamEndWasReached = 1; -+ return; -+ } -+ for (;;) -+ { -+ Byte *dest = p->buffer + (p->streamPos - p->pos); -+ size_t size = (p->bufferBase + p->blockSize - dest); -+ if (size == 0) -+ return; -+ p->result = p->stream->Read(p->stream, dest, &size); -+ if (p->result != SZ_OK) -+ return; -+ if (size == 0) -+ { -+ p->streamEndWasReached = 1; -+ return; -+ } -+ p->streamPos += (UInt32)size; -+ if (p->streamPos - p->pos > p->keepSizeAfter) -+ return; -+ } -+} -+ -+void MatchFinder_MoveBlock(CMatchFinder *p) -+{ -+ memmove(p->bufferBase, -+ p->buffer - p->keepSizeBefore, -+ (size_t)(p->streamPos - p->pos + p->keepSizeBefore)); -+ p->buffer = p->bufferBase + p->keepSizeBefore; -+} -+ -+int MatchFinder_NeedMove(CMatchFinder *p) -+{ -+ if (p->directInput) -+ return 0; -+ /* if (p->streamEndWasReached) return 0; */ -+ return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); -+} -+ -+void MatchFinder_ReadIfRequired(CMatchFinder *p) -+{ -+ if (p->streamEndWasReached) -+ return; -+ if (p->keepSizeAfter >= p->streamPos - p->pos) -+ MatchFinder_ReadBlock(p); -+} -+ -+static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) -+{ -+ if (MatchFinder_NeedMove(p)) -+ MatchFinder_MoveBlock(p); -+ MatchFinder_ReadBlock(p); -+} -+ -+static void MatchFinder_SetDefaultSettings(CMatchFinder *p) -+{ -+ p->cutValue = 32; -+ p->btMode = 1; -+ p->numHashBytes = 4; -+ p->bigHash = 0; -+} -+ -+#define kCrcPoly 0xEDB88320 -+ -+void MatchFinder_Construct(CMatchFinder *p) -+{ -+ UInt32 i; -+ p->bufferBase = 0; -+ p->directInput = 0; -+ p->hash = 0; -+ MatchFinder_SetDefaultSettings(p); -+ -+ for (i = 0; i < 256; i++) -+ { -+ UInt32 r = i; -+ int j; -+ for (j = 0; j < 8; j++) -+ r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); -+ p->crc[i] = r; -+ } -+} -+ -+static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->hash); -+ p->hash = 0; -+} -+ -+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc) -+{ -+ MatchFinder_FreeThisClassMemory(p, alloc); -+ LzInWindow_Free(p, alloc); -+} -+ -+static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc) -+{ -+ size_t sizeInBytes = (size_t)num * sizeof(CLzRef); -+ if (sizeInBytes / sizeof(CLzRef) != num) -+ return 0; -+ return (CLzRef *)alloc->Alloc(alloc, sizeInBytes); -+} -+ -+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, -+ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, -+ ISzAlloc *alloc) -+{ -+ UInt32 sizeReserv; -+ if (historySize > kMaxHistorySize) -+ { -+ MatchFinder_Free(p, alloc); -+ return 0; -+ } -+ sizeReserv = historySize >> 1; -+ if (historySize > ((UInt32)2 << 30)) -+ sizeReserv = historySize >> 2; -+ sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); -+ -+ p->keepSizeBefore = historySize + keepAddBufferBefore + 1; -+ p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; -+ /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ -+ if (LzInWindow_Create(p, sizeReserv, alloc)) -+ { -+ UInt32 newCyclicBufferSize = historySize + 1; -+ UInt32 hs; -+ p->matchMaxLen = matchMaxLen; -+ { -+ p->fixedHashSize = 0; -+ if (p->numHashBytes == 2) -+ hs = (1 << 16) - 1; -+ else -+ { -+ hs = historySize - 1; -+ hs |= (hs >> 1); -+ hs |= (hs >> 2); -+ hs |= (hs >> 4); -+ hs |= (hs >> 8); -+ hs >>= 1; -+ hs |= 0xFFFF; /* don't change it! It's required for Deflate */ -+ if (hs > (1 << 24)) -+ { -+ if (p->numHashBytes == 3) -+ hs = (1 << 24) - 1; -+ else -+ hs >>= 1; -+ } -+ } -+ p->hashMask = hs; -+ hs++; -+ if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; -+ if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; -+ if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size; -+ hs += p->fixedHashSize; -+ } -+ -+ { -+ UInt32 prevSize = p->hashSizeSum + p->numSons; -+ UInt32 newSize; -+ p->historySize = historySize; -+ p->hashSizeSum = hs; -+ p->cyclicBufferSize = newCyclicBufferSize; -+ p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize); -+ newSize = p->hashSizeSum + p->numSons; -+ if (p->hash != 0 && prevSize == newSize) -+ return 1; -+ MatchFinder_FreeThisClassMemory(p, alloc); -+ p->hash = AllocRefs(newSize, alloc); -+ if (p->hash != 0) -+ { -+ p->son = p->hash + p->hashSizeSum; -+ return 1; -+ } -+ } -+ } -+ MatchFinder_Free(p, alloc); -+ return 0; -+} -+ -+static void MatchFinder_SetLimits(CMatchFinder *p) -+{ -+ UInt32 limit = kMaxValForNormalize - p->pos; -+ UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; -+ if (limit2 < limit) -+ limit = limit2; -+ limit2 = p->streamPos - p->pos; -+ if (limit2 <= p->keepSizeAfter) -+ { -+ if (limit2 > 0) -+ limit2 = 1; -+ } -+ else -+ limit2 -= p->keepSizeAfter; -+ if (limit2 < limit) -+ limit = limit2; -+ { -+ UInt32 lenLimit = p->streamPos - p->pos; -+ if (lenLimit > p->matchMaxLen) -+ lenLimit = p->matchMaxLen; -+ p->lenLimit = lenLimit; -+ } -+ p->posLimit = p->pos + limit; -+} -+ -+void MatchFinder_Init(CMatchFinder *p) -+{ -+ UInt32 i; -+ for (i = 0; i < p->hashSizeSum; i++) -+ p->hash[i] = kEmptyHashValue; -+ p->cyclicBufferPos = 0; -+ p->buffer = p->bufferBase; -+ p->pos = p->streamPos = p->cyclicBufferSize; -+ p->result = SZ_OK; -+ p->streamEndWasReached = 0; -+ MatchFinder_ReadBlock(p); -+ MatchFinder_SetLimits(p); -+} -+ -+static UInt32 MatchFinder_GetSubValue(CMatchFinder *p) -+{ -+ return (p->pos - p->historySize - 1) & kNormalizeMask; -+} -+ -+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems) -+{ -+ UInt32 i; -+ for (i = 0; i < numItems; i++) -+ { -+ UInt32 value = items[i]; -+ if (value <= subValue) -+ value = kEmptyHashValue; -+ else -+ value -= subValue; -+ items[i] = value; -+ } -+} -+ -+static void MatchFinder_Normalize(CMatchFinder *p) -+{ -+ UInt32 subValue = MatchFinder_GetSubValue(p); -+ MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons); -+ MatchFinder_ReduceOffsets(p, subValue); -+} -+ -+static void MatchFinder_CheckLimits(CMatchFinder *p) -+{ -+ if (p->pos == kMaxValForNormalize) -+ MatchFinder_Normalize(p); -+ if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos) -+ MatchFinder_CheckAndMoveAndRead(p); -+ if (p->cyclicBufferPos == p->cyclicBufferSize) -+ p->cyclicBufferPos = 0; -+ MatchFinder_SetLimits(p); -+} -+ -+static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, -+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, -+ UInt32 *distances, UInt32 maxLen) -+{ -+ son[_cyclicBufferPos] = curMatch; -+ for (;;) -+ { -+ UInt32 delta = pos - curMatch; -+ if (cutValue-- == 0 || delta >= _cyclicBufferSize) -+ return distances; -+ { -+ const Byte *pb = cur - delta; -+ curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; -+ if (pb[maxLen] == cur[maxLen] && *pb == *cur) -+ { -+ UInt32 len = 0; -+ while (++len != lenLimit) -+ if (pb[len] != cur[len]) -+ break; -+ if (maxLen < len) -+ { -+ *distances++ = maxLen = len; -+ *distances++ = delta - 1; -+ if (len == lenLimit) -+ return distances; -+ } -+ } -+ } -+ } -+} -+ -+UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, -+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, -+ UInt32 *distances, UInt32 maxLen) -+{ -+ CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; -+ CLzRef *ptr1 = son + (_cyclicBufferPos << 1); -+ UInt32 len0 = 0, len1 = 0; -+ for (;;) -+ { -+ UInt32 delta = pos - curMatch; -+ if (cutValue-- == 0 || delta >= _cyclicBufferSize) -+ { -+ *ptr0 = *ptr1 = kEmptyHashValue; -+ return distances; -+ } -+ { -+ CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); -+ const Byte *pb = cur - delta; -+ UInt32 len = (len0 < len1 ? len0 : len1); -+ if (pb[len] == cur[len]) -+ { -+ if (++len != lenLimit && pb[len] == cur[len]) -+ while (++len != lenLimit) -+ if (pb[len] != cur[len]) -+ break; -+ if (maxLen < len) -+ { -+ *distances++ = maxLen = len; -+ *distances++ = delta - 1; -+ if (len == lenLimit) -+ { -+ *ptr1 = pair[0]; -+ *ptr0 = pair[1]; -+ return distances; -+ } -+ } -+ } -+ if (pb[len] < cur[len]) -+ { -+ *ptr1 = curMatch; -+ ptr1 = pair + 1; -+ curMatch = *ptr1; -+ len1 = len; -+ } -+ else -+ { -+ *ptr0 = curMatch; -+ ptr0 = pair; -+ curMatch = *ptr0; -+ len0 = len; -+ } -+ } -+ } -+} -+ -+static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, -+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) -+{ -+ CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; -+ CLzRef *ptr1 = son + (_cyclicBufferPos << 1); -+ UInt32 len0 = 0, len1 = 0; -+ for (;;) -+ { -+ UInt32 delta = pos - curMatch; -+ if (cutValue-- == 0 || delta >= _cyclicBufferSize) -+ { -+ *ptr0 = *ptr1 = kEmptyHashValue; -+ return; -+ } -+ { -+ CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); -+ const Byte *pb = cur - delta; -+ UInt32 len = (len0 < len1 ? len0 : len1); -+ if (pb[len] == cur[len]) -+ { -+ while (++len != lenLimit) -+ if (pb[len] != cur[len]) -+ break; -+ { -+ if (len == lenLimit) -+ { -+ *ptr1 = pair[0]; -+ *ptr0 = pair[1]; -+ return; -+ } -+ } -+ } -+ if (pb[len] < cur[len]) -+ { -+ *ptr1 = curMatch; -+ ptr1 = pair + 1; -+ curMatch = *ptr1; -+ len1 = len; -+ } -+ else -+ { -+ *ptr0 = curMatch; -+ ptr0 = pair; -+ curMatch = *ptr0; -+ len0 = len; -+ } -+ } -+ } -+} -+ -+#define MOVE_POS \ -+ ++p->cyclicBufferPos; \ -+ p->buffer++; \ -+ if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); -+ -+#define MOVE_POS_RET MOVE_POS return offset; -+ -+static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } -+ -+#define GET_MATCHES_HEADER2(minLen, ret_op) \ -+ UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \ -+ lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ -+ cur = p->buffer; -+ -+#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) -+#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) -+ -+#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue -+ -+#define GET_MATCHES_FOOTER(offset, maxLen) \ -+ offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \ -+ distances + offset, maxLen) - distances); MOVE_POS_RET; -+ -+#define SKIP_FOOTER \ -+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; -+ -+static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 offset; -+ GET_MATCHES_HEADER(2) -+ HASH2_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ offset = 0; -+ GET_MATCHES_FOOTER(offset, 1) -+} -+ -+UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 offset; -+ GET_MATCHES_HEADER(3) -+ HASH_ZIP_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ offset = 0; -+ GET_MATCHES_FOOTER(offset, 2) -+} -+ -+static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 hash2Value, delta2, maxLen, offset; -+ GET_MATCHES_HEADER(3) -+ -+ HASH3_CALC; -+ -+ delta2 = p->pos - p->hash[hash2Value]; -+ curMatch = p->hash[kFix3HashSize + hashValue]; -+ -+ p->hash[hash2Value] = -+ p->hash[kFix3HashSize + hashValue] = p->pos; -+ -+ -+ maxLen = 2; -+ offset = 0; -+ if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) -+ { -+ for (; maxLen != lenLimit; maxLen++) -+ if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) -+ break; -+ distances[0] = maxLen; -+ distances[1] = delta2 - 1; -+ offset = 2; -+ if (maxLen == lenLimit) -+ { -+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); -+ MOVE_POS_RET; -+ } -+ } -+ GET_MATCHES_FOOTER(offset, maxLen) -+} -+ -+static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; -+ GET_MATCHES_HEADER(4) -+ -+ HASH4_CALC; -+ -+ delta2 = p->pos - p->hash[ hash2Value]; -+ delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; -+ curMatch = p->hash[kFix4HashSize + hashValue]; -+ -+ p->hash[ hash2Value] = -+ p->hash[kFix3HashSize + hash3Value] = -+ p->hash[kFix4HashSize + hashValue] = p->pos; -+ -+ maxLen = 1; -+ offset = 0; -+ if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) -+ { -+ distances[0] = maxLen = 2; -+ distances[1] = delta2 - 1; -+ offset = 2; -+ } -+ if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) -+ { -+ maxLen = 3; -+ distances[offset + 1] = delta3 - 1; -+ offset += 2; -+ delta2 = delta3; -+ } -+ if (offset != 0) -+ { -+ for (; maxLen != lenLimit; maxLen++) -+ if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) -+ break; -+ distances[offset - 2] = maxLen; -+ if (maxLen == lenLimit) -+ { -+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); -+ MOVE_POS_RET; -+ } -+ } -+ if (maxLen < 3) -+ maxLen = 3; -+ GET_MATCHES_FOOTER(offset, maxLen) -+} -+ -+static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; -+ GET_MATCHES_HEADER(4) -+ -+ HASH4_CALC; -+ -+ delta2 = p->pos - p->hash[ hash2Value]; -+ delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; -+ curMatch = p->hash[kFix4HashSize + hashValue]; -+ -+ p->hash[ hash2Value] = -+ p->hash[kFix3HashSize + hash3Value] = -+ p->hash[kFix4HashSize + hashValue] = p->pos; -+ -+ maxLen = 1; -+ offset = 0; -+ if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) -+ { -+ distances[0] = maxLen = 2; -+ distances[1] = delta2 - 1; -+ offset = 2; -+ } -+ if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) -+ { -+ maxLen = 3; -+ distances[offset + 1] = delta3 - 1; -+ offset += 2; -+ delta2 = delta3; -+ } -+ if (offset != 0) -+ { -+ for (; maxLen != lenLimit; maxLen++) -+ if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) -+ break; -+ distances[offset - 2] = maxLen; -+ if (maxLen == lenLimit) -+ { -+ p->son[p->cyclicBufferPos] = curMatch; -+ MOVE_POS_RET; -+ } -+ } -+ if (maxLen < 3) -+ maxLen = 3; -+ offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), -+ distances + offset, maxLen) - (distances)); -+ MOVE_POS_RET -+} -+ -+UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 offset; -+ GET_MATCHES_HEADER(3) -+ HASH_ZIP_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), -+ distances, 2) - (distances)); -+ MOVE_POS_RET -+} -+ -+static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ SKIP_HEADER(2) -+ HASH2_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ SKIP_FOOTER -+ } -+ while (--num != 0); -+} -+ -+void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ SKIP_HEADER(3) -+ HASH_ZIP_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ SKIP_FOOTER -+ } -+ while (--num != 0); -+} -+ -+static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ UInt32 hash2Value; -+ SKIP_HEADER(3) -+ HASH3_CALC; -+ curMatch = p->hash[kFix3HashSize + hashValue]; -+ p->hash[hash2Value] = -+ p->hash[kFix3HashSize + hashValue] = p->pos; -+ SKIP_FOOTER -+ } -+ while (--num != 0); -+} -+ -+static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ UInt32 hash2Value, hash3Value; -+ SKIP_HEADER(4) -+ HASH4_CALC; -+ curMatch = p->hash[kFix4HashSize + hashValue]; -+ p->hash[ hash2Value] = -+ p->hash[kFix3HashSize + hash3Value] = p->pos; -+ p->hash[kFix4HashSize + hashValue] = p->pos; -+ SKIP_FOOTER -+ } -+ while (--num != 0); -+} -+ -+static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ UInt32 hash2Value, hash3Value; -+ SKIP_HEADER(4) -+ HASH4_CALC; -+ curMatch = p->hash[kFix4HashSize + hashValue]; -+ p->hash[ hash2Value] = -+ p->hash[kFix3HashSize + hash3Value] = -+ p->hash[kFix4HashSize + hashValue] = p->pos; -+ p->son[p->cyclicBufferPos] = curMatch; -+ MOVE_POS -+ } -+ while (--num != 0); -+} -+ -+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ SKIP_HEADER(3) -+ HASH_ZIP_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ p->son[p->cyclicBufferPos] = curMatch; -+ MOVE_POS -+ } -+ while (--num != 0); -+} -+ -+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) -+{ -+ vTable->Init = (Mf_Init_Func)MatchFinder_Init; -+ vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte; -+ vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; -+ vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; -+ if (!p->btMode) -+ { -+ vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; -+ vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; -+ } -+ else if (p->numHashBytes == 2) -+ { -+ vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; -+ vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; -+ } -+ else if (p->numHashBytes == 3) -+ { -+ vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; -+ vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; -+ } -+ else -+ { -+ vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; -+ vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; -+ } -+} ---- /dev/null -+++ b/lib/lzma/LzmaDec.c -@@ -0,0 +1,999 @@ -+/* LzmaDec.c -- LZMA Decoder -+2009-09-20 : Igor Pavlov : Public domain */ -+ -+#include "LzmaDec.h" -+ -+#include -+ -+#define kNumTopBits 24 -+#define kTopValue ((UInt32)1 << kNumTopBits) -+ -+#define kNumBitModelTotalBits 11 -+#define kBitModelTotal (1 << kNumBitModelTotalBits) -+#define kNumMoveBits 5 -+ -+#define RC_INIT_SIZE 5 -+ -+#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } -+ -+#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) -+#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); -+#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); -+#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ -+ { UPDATE_0(p); i = (i + i); A0; } else \ -+ { UPDATE_1(p); i = (i + i) + 1; A1; } -+#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) -+ -+#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } -+#define TREE_DECODE(probs, limit, i) \ -+ { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } -+ -+/* #define _LZMA_SIZE_OPT */ -+ -+#ifdef _LZMA_SIZE_OPT -+#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) -+#else -+#define TREE_6_DECODE(probs, i) \ -+ { i = 1; \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ i -= 0x40; } -+#endif -+ -+#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } -+ -+#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) -+#define UPDATE_0_CHECK range = bound; -+#define UPDATE_1_CHECK range -= bound; code -= bound; -+#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ -+ { UPDATE_0_CHECK; i = (i + i); A0; } else \ -+ { UPDATE_1_CHECK; i = (i + i) + 1; A1; } -+#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) -+#define TREE_DECODE_CHECK(probs, limit, i) \ -+ { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } -+ -+ -+#define kNumPosBitsMax 4 -+#define kNumPosStatesMax (1 << kNumPosBitsMax) -+ -+#define kLenNumLowBits 3 -+#define kLenNumLowSymbols (1 << kLenNumLowBits) -+#define kLenNumMidBits 3 -+#define kLenNumMidSymbols (1 << kLenNumMidBits) -+#define kLenNumHighBits 8 -+#define kLenNumHighSymbols (1 << kLenNumHighBits) -+ -+#define LenChoice 0 -+#define LenChoice2 (LenChoice + 1) -+#define LenLow (LenChoice2 + 1) -+#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) -+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) -+#define kNumLenProbs (LenHigh + kLenNumHighSymbols) -+ -+ -+#define kNumStates 12 -+#define kNumLitStates 7 -+ -+#define kStartPosModelIndex 4 -+#define kEndPosModelIndex 14 -+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) -+ -+#define kNumPosSlotBits 6 -+#define kNumLenToPosStates 4 -+ -+#define kNumAlignBits 4 -+#define kAlignTableSize (1 << kNumAlignBits) -+ -+#define kMatchMinLen 2 -+#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) -+ -+#define IsMatch 0 -+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) -+#define IsRepG0 (IsRep + kNumStates) -+#define IsRepG1 (IsRepG0 + kNumStates) -+#define IsRepG2 (IsRepG1 + kNumStates) -+#define IsRep0Long (IsRepG2 + kNumStates) -+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) -+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) -+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) -+#define LenCoder (Align + kAlignTableSize) -+#define RepLenCoder (LenCoder + kNumLenProbs) -+#define Literal (RepLenCoder + kNumLenProbs) -+ -+#define LZMA_BASE_SIZE 1846 -+#define LZMA_LIT_SIZE 768 -+ -+#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) -+ -+#if Literal != LZMA_BASE_SIZE -+StopCompilingDueBUG -+#endif -+ -+#define LZMA_DIC_MIN (1 << 12) -+ -+/* First LZMA-symbol is always decoded. -+And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization -+Out: -+ Result: -+ SZ_OK - OK -+ SZ_ERROR_DATA - Error -+ p->remainLen: -+ < kMatchSpecLenStart : normal remain -+ = kMatchSpecLenStart : finished -+ = kMatchSpecLenStart + 1 : Flush marker -+ = kMatchSpecLenStart + 2 : State Init Marker -+*/ -+ -+static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) -+{ -+ CLzmaProb *probs = p->probs; -+ -+ unsigned state = p->state; -+ UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; -+ unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; -+ unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; -+ unsigned lc = p->prop.lc; -+ -+ Byte *dic = p->dic; -+ SizeT dicBufSize = p->dicBufSize; -+ SizeT dicPos = p->dicPos; -+ -+ UInt32 processedPos = p->processedPos; -+ UInt32 checkDicSize = p->checkDicSize; -+ unsigned len = 0; -+ -+ const Byte *buf = p->buf; -+ UInt32 range = p->range; -+ UInt32 code = p->code; -+ -+ do -+ { -+ CLzmaProb *prob; -+ UInt32 bound; -+ unsigned ttt; -+ unsigned posState = processedPos & pbMask; -+ -+ prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0(prob) -+ { -+ unsigned symbol; -+ UPDATE_0(prob); -+ prob = probs + Literal; -+ if (checkDicSize != 0 || processedPos != 0) -+ prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + -+ (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); -+ -+ if (state < kNumLitStates) -+ { -+ state -= (state < 4) ? state : 3; -+ symbol = 1; -+ do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100); -+ } -+ else -+ { -+ unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; -+ unsigned offs = 0x100; -+ state -= (state < 10) ? 3 : 6; -+ symbol = 1; -+ do -+ { -+ unsigned bit; -+ CLzmaProb *probLit; -+ matchByte <<= 1; -+ bit = (matchByte & offs); -+ probLit = prob + offs + bit + symbol; -+ GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) -+ } -+ while (symbol < 0x100); -+ } -+ dic[dicPos++] = (Byte)symbol; -+ processedPos++; -+ continue; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ prob = probs + IsRep + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ state += kNumStates; -+ prob = probs + LenCoder; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ if (checkDicSize == 0 && processedPos == 0) -+ return SZ_ERROR_DATA; -+ prob = probs + IsRepG0 + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; -+ dicPos++; -+ processedPos++; -+ state = state < kNumLitStates ? 9 : 11; -+ continue; -+ } -+ UPDATE_1(prob); -+ } -+ else -+ { -+ UInt32 distance; -+ UPDATE_1(prob); -+ prob = probs + IsRepG1 + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ distance = rep1; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ prob = probs + IsRepG2 + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ distance = rep2; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ distance = rep3; -+ rep3 = rep2; -+ } -+ rep2 = rep1; -+ } -+ rep1 = rep0; -+ rep0 = distance; -+ } -+ state = state < kNumLitStates ? 8 : 11; -+ prob = probs + RepLenCoder; -+ } -+ { -+ unsigned limit, offset; -+ CLzmaProb *probLen = prob + LenChoice; -+ IF_BIT_0(probLen) -+ { -+ UPDATE_0(probLen); -+ probLen = prob + LenLow + (posState << kLenNumLowBits); -+ offset = 0; -+ limit = (1 << kLenNumLowBits); -+ } -+ else -+ { -+ UPDATE_1(probLen); -+ probLen = prob + LenChoice2; -+ IF_BIT_0(probLen) -+ { -+ UPDATE_0(probLen); -+ probLen = prob + LenMid + (posState << kLenNumMidBits); -+ offset = kLenNumLowSymbols; -+ limit = (1 << kLenNumMidBits); -+ } -+ else -+ { -+ UPDATE_1(probLen); -+ probLen = prob + LenHigh; -+ offset = kLenNumLowSymbols + kLenNumMidSymbols; -+ limit = (1 << kLenNumHighBits); -+ } -+ } -+ TREE_DECODE(probLen, limit, len); -+ len += offset; -+ } -+ -+ if (state >= kNumStates) -+ { -+ UInt32 distance; -+ prob = probs + PosSlot + -+ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); -+ TREE_6_DECODE(prob, distance); -+ if (distance >= kStartPosModelIndex) -+ { -+ unsigned posSlot = (unsigned)distance; -+ int numDirectBits = (int)(((distance >> 1) - 1)); -+ distance = (2 | (distance & 1)); -+ if (posSlot < kEndPosModelIndex) -+ { -+ distance <<= numDirectBits; -+ prob = probs + SpecPos + distance - posSlot - 1; -+ { -+ UInt32 mask = 1; -+ unsigned i = 1; -+ do -+ { -+ GET_BIT2(prob + i, i, ; , distance |= mask); -+ mask <<= 1; -+ } -+ while (--numDirectBits != 0); -+ } -+ } -+ else -+ { -+ numDirectBits -= kNumAlignBits; -+ do -+ { -+ NORMALIZE -+ range >>= 1; -+ -+ { -+ UInt32 t; -+ code -= range; -+ t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ -+ distance = (distance << 1) + (t + 1); -+ code += range & t; -+ } -+ /* -+ distance <<= 1; -+ if (code >= range) -+ { -+ code -= range; -+ distance |= 1; -+ } -+ */ -+ } -+ while (--numDirectBits != 0); -+ prob = probs + Align; -+ distance <<= kNumAlignBits; -+ { -+ unsigned i = 1; -+ GET_BIT2(prob + i, i, ; , distance |= 1); -+ GET_BIT2(prob + i, i, ; , distance |= 2); -+ GET_BIT2(prob + i, i, ; , distance |= 4); -+ GET_BIT2(prob + i, i, ; , distance |= 8); -+ } -+ if (distance == (UInt32)0xFFFFFFFF) -+ { -+ len += kMatchSpecLenStart; -+ state -= kNumStates; -+ break; -+ } -+ } -+ } -+ rep3 = rep2; -+ rep2 = rep1; -+ rep1 = rep0; -+ rep0 = distance + 1; -+ if (checkDicSize == 0) -+ { -+ if (distance >= processedPos) -+ return SZ_ERROR_DATA; -+ } -+ else if (distance >= checkDicSize) -+ return SZ_ERROR_DATA; -+ state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; -+ } -+ -+ len += kMatchMinLen; -+ -+ if (limit == dicPos) -+ return SZ_ERROR_DATA; -+ { -+ SizeT rem = limit - dicPos; -+ unsigned curLen = ((rem < len) ? (unsigned)rem : len); -+ SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0); -+ -+ processedPos += curLen; -+ -+ len -= curLen; -+ if (pos + curLen <= dicBufSize) -+ { -+ Byte *dest = dic + dicPos; -+ ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; -+ const Byte *lim = dest + curLen; -+ dicPos += curLen; -+ do -+ *(dest) = (Byte)*(dest + src); -+ while (++dest != lim); -+ } -+ else -+ { -+ do -+ { -+ dic[dicPos++] = dic[pos]; -+ if (++pos == dicBufSize) -+ pos = 0; -+ } -+ while (--curLen != 0); -+ } -+ } -+ } -+ } -+ while (dicPos < limit && buf < bufLimit); -+ NORMALIZE; -+ p->buf = buf; -+ p->range = range; -+ p->code = code; -+ p->remainLen = len; -+ p->dicPos = dicPos; -+ p->processedPos = processedPos; -+ p->reps[0] = rep0; -+ p->reps[1] = rep1; -+ p->reps[2] = rep2; -+ p->reps[3] = rep3; -+ p->state = state; -+ -+ return SZ_OK; -+} -+ -+static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) -+{ -+ if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart) -+ { -+ Byte *dic = p->dic; -+ SizeT dicPos = p->dicPos; -+ SizeT dicBufSize = p->dicBufSize; -+ unsigned len = p->remainLen; -+ UInt32 rep0 = p->reps[0]; -+ if (limit - dicPos < len) -+ len = (unsigned)(limit - dicPos); -+ -+ if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) -+ p->checkDicSize = p->prop.dicSize; -+ -+ p->processedPos += len; -+ p->remainLen -= len; -+ while (len-- != 0) -+ { -+ dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; -+ dicPos++; -+ } -+ p->dicPos = dicPos; -+ } -+} -+ -+static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) -+{ -+ do -+ { -+ SizeT limit2 = limit; -+ if (p->checkDicSize == 0) -+ { -+ UInt32 rem = p->prop.dicSize - p->processedPos; -+ if (limit - p->dicPos > rem) -+ limit2 = p->dicPos + rem; -+ } -+ RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); -+ if (p->processedPos >= p->prop.dicSize) -+ p->checkDicSize = p->prop.dicSize; -+ LzmaDec_WriteRem(p, limit); -+ } -+ while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); -+ -+ if (p->remainLen > kMatchSpecLenStart) -+ { -+ p->remainLen = kMatchSpecLenStart; -+ } -+ return 0; -+} -+ -+typedef enum -+{ -+ DUMMY_ERROR, /* unexpected end of input stream */ -+ DUMMY_LIT, -+ DUMMY_MATCH, -+ DUMMY_REP -+} ELzmaDummy; -+ -+static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize) -+{ -+ UInt32 range = p->range; -+ UInt32 code = p->code; -+ const Byte *bufLimit = buf + inSize; -+ CLzmaProb *probs = p->probs; -+ unsigned state = p->state; -+ ELzmaDummy res; -+ -+ { -+ CLzmaProb *prob; -+ UInt32 bound; -+ unsigned ttt; -+ unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); -+ -+ prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK -+ -+ /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ -+ -+ prob = probs + Literal; -+ if (p->checkDicSize != 0 || p->processedPos != 0) -+ prob += (LZMA_LIT_SIZE * -+ ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + -+ (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); -+ -+ if (state < kNumLitStates) -+ { -+ unsigned symbol = 1; -+ do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); -+ } -+ else -+ { -+ unsigned matchByte = p->dic[p->dicPos - p->reps[0] + -+ ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)]; -+ unsigned offs = 0x100; -+ unsigned symbol = 1; -+ do -+ { -+ unsigned bit; -+ CLzmaProb *probLit; -+ matchByte <<= 1; -+ bit = (matchByte & offs); -+ probLit = prob + offs + bit + symbol; -+ GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) -+ } -+ while (symbol < 0x100); -+ } -+ res = DUMMY_LIT; -+ } -+ else -+ { -+ unsigned len; -+ UPDATE_1_CHECK; -+ -+ prob = probs + IsRep + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ state = 0; -+ prob = probs + LenCoder; -+ res = DUMMY_MATCH; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ res = DUMMY_REP; -+ prob = probs + IsRepG0 + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ NORMALIZE_CHECK; -+ return DUMMY_REP; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ } -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ prob = probs + IsRepG1 + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ prob = probs + IsRepG2 + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ } -+ } -+ } -+ state = kNumStates; -+ prob = probs + RepLenCoder; -+ } -+ { -+ unsigned limit, offset; -+ CLzmaProb *probLen = prob + LenChoice; -+ IF_BIT_0_CHECK(probLen) -+ { -+ UPDATE_0_CHECK; -+ probLen = prob + LenLow + (posState << kLenNumLowBits); -+ offset = 0; -+ limit = 1 << kLenNumLowBits; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ probLen = prob + LenChoice2; -+ IF_BIT_0_CHECK(probLen) -+ { -+ UPDATE_0_CHECK; -+ probLen = prob + LenMid + (posState << kLenNumMidBits); -+ offset = kLenNumLowSymbols; -+ limit = 1 << kLenNumMidBits; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ probLen = prob + LenHigh; -+ offset = kLenNumLowSymbols + kLenNumMidSymbols; -+ limit = 1 << kLenNumHighBits; -+ } -+ } -+ TREE_DECODE_CHECK(probLen, limit, len); -+ len += offset; -+ } -+ -+ if (state < 4) -+ { -+ unsigned posSlot; -+ prob = probs + PosSlot + -+ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << -+ kNumPosSlotBits); -+ TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); -+ if (posSlot >= kStartPosModelIndex) -+ { -+ int numDirectBits = ((posSlot >> 1) - 1); -+ -+ /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ -+ -+ if (posSlot < kEndPosModelIndex) -+ { -+ prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; -+ } -+ else -+ { -+ numDirectBits -= kNumAlignBits; -+ do -+ { -+ NORMALIZE_CHECK -+ range >>= 1; -+ code -= range & (((code - range) >> 31) - 1); -+ /* if (code >= range) code -= range; */ -+ } -+ while (--numDirectBits != 0); -+ prob = probs + Align; -+ numDirectBits = kNumAlignBits; -+ } -+ { -+ unsigned i = 1; -+ do -+ { -+ GET_BIT_CHECK(prob + i, i); -+ } -+ while (--numDirectBits != 0); -+ } -+ } -+ } -+ } -+ } -+ NORMALIZE_CHECK; -+ return res; -+} -+ -+ -+static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data) -+{ -+ p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]); -+ p->range = 0xFFFFFFFF; -+ p->needFlush = 0; -+} -+ -+void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) -+{ -+ p->needFlush = 1; -+ p->remainLen = 0; -+ p->tempBufSize = 0; -+ -+ if (initDic) -+ { -+ p->processedPos = 0; -+ p->checkDicSize = 0; -+ p->needInitState = 1; -+ } -+ if (initState) -+ p->needInitState = 1; -+} -+ -+void LzmaDec_Init(CLzmaDec *p) -+{ -+ p->dicPos = 0; -+ LzmaDec_InitDicAndState(p, True, True); -+} -+ -+static void LzmaDec_InitStateReal(CLzmaDec *p) -+{ -+ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp)); -+ UInt32 i; -+ CLzmaProb *probs = p->probs; -+ for (i = 0; i < numProbs; i++) -+ probs[i] = kBitModelTotal >> 1; -+ p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; -+ p->state = 0; -+ p->needInitState = 0; -+} -+ -+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, -+ ELzmaFinishMode finishMode, ELzmaStatus *status) -+{ -+ SizeT inSize = *srcLen; -+ (*srcLen) = 0; -+ LzmaDec_WriteRem(p, dicLimit); -+ -+ *status = LZMA_STATUS_NOT_SPECIFIED; -+ -+ while (p->remainLen != kMatchSpecLenStart) -+ { -+ int checkEndMarkNow; -+ -+ if (p->needFlush != 0) -+ { -+ for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) -+ p->tempBuf[p->tempBufSize++] = *src++; -+ if (p->tempBufSize < RC_INIT_SIZE) -+ { -+ *status = LZMA_STATUS_NEEDS_MORE_INPUT; -+ return SZ_OK; -+ } -+ if (p->tempBuf[0] != 0) -+ return SZ_ERROR_DATA; -+ -+ LzmaDec_InitRc(p, p->tempBuf); -+ p->tempBufSize = 0; -+ } -+ -+ checkEndMarkNow = 0; -+ if (p->dicPos >= dicLimit) -+ { -+ if (p->remainLen == 0 && p->code == 0) -+ { -+ *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; -+ return SZ_OK; -+ } -+ if (finishMode == LZMA_FINISH_ANY) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_OK; -+ } -+ if (p->remainLen != 0) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_ERROR_DATA; -+ } -+ checkEndMarkNow = 1; -+ } -+ -+ if (p->needInitState) -+ LzmaDec_InitStateReal(p); -+ -+ if (p->tempBufSize == 0) -+ { -+ SizeT processed; -+ const Byte *bufLimit; -+ if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) -+ { -+ int dummyRes = LzmaDec_TryDummy(p, src, inSize); -+ if (dummyRes == DUMMY_ERROR) -+ { -+ memcpy(p->tempBuf, src, inSize); -+ p->tempBufSize = (unsigned)inSize; -+ (*srcLen) += inSize; -+ *status = LZMA_STATUS_NEEDS_MORE_INPUT; -+ return SZ_OK; -+ } -+ if (checkEndMarkNow && dummyRes != DUMMY_MATCH) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_ERROR_DATA; -+ } -+ bufLimit = src; -+ } -+ else -+ bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; -+ p->buf = src; -+ if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0) -+ return SZ_ERROR_DATA; -+ processed = (SizeT)(p->buf - src); -+ (*srcLen) += processed; -+ src += processed; -+ inSize -= processed; -+ } -+ else -+ { -+ unsigned rem = p->tempBufSize, lookAhead = 0; -+ while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) -+ p->tempBuf[rem++] = src[lookAhead++]; -+ p->tempBufSize = rem; -+ if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) -+ { -+ int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); -+ if (dummyRes == DUMMY_ERROR) -+ { -+ (*srcLen) += lookAhead; -+ *status = LZMA_STATUS_NEEDS_MORE_INPUT; -+ return SZ_OK; -+ } -+ if (checkEndMarkNow && dummyRes != DUMMY_MATCH) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_ERROR_DATA; -+ } -+ } -+ p->buf = p->tempBuf; -+ if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0) -+ return SZ_ERROR_DATA; -+ lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf)); -+ (*srcLen) += lookAhead; -+ src += lookAhead; -+ inSize -= lookAhead; -+ p->tempBufSize = 0; -+ } -+ } -+ if (p->code == 0) -+ *status = LZMA_STATUS_FINISHED_WITH_MARK; -+ return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; -+} -+ -+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) -+{ -+ SizeT outSize = *destLen; -+ SizeT inSize = *srcLen; -+ *srcLen = *destLen = 0; -+ for (;;) -+ { -+ SizeT inSizeCur = inSize, outSizeCur, dicPos; -+ ELzmaFinishMode curFinishMode; -+ SRes res; -+ if (p->dicPos == p->dicBufSize) -+ p->dicPos = 0; -+ dicPos = p->dicPos; -+ if (outSize > p->dicBufSize - dicPos) -+ { -+ outSizeCur = p->dicBufSize; -+ curFinishMode = LZMA_FINISH_ANY; -+ } -+ else -+ { -+ outSizeCur = dicPos + outSize; -+ curFinishMode = finishMode; -+ } -+ -+ res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status); -+ src += inSizeCur; -+ inSize -= inSizeCur; -+ *srcLen += inSizeCur; -+ outSizeCur = p->dicPos - dicPos; -+ memcpy(dest, p->dic + dicPos, outSizeCur); -+ dest += outSizeCur; -+ outSize -= outSizeCur; -+ *destLen += outSizeCur; -+ if (res != 0) -+ return res; -+ if (outSizeCur == 0 || outSize == 0) -+ return SZ_OK; -+ } -+} -+ -+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->probs); -+ p->probs = 0; -+} -+ -+static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->dic); -+ p->dic = 0; -+} -+ -+void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc) -+{ -+ LzmaDec_FreeProbs(p, alloc); -+ LzmaDec_FreeDict(p, alloc); -+} -+ -+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) -+{ -+ UInt32 dicSize; -+ Byte d; -+ -+ if (size < LZMA_PROPS_SIZE) -+ return SZ_ERROR_UNSUPPORTED; -+ else -+ dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); -+ -+ if (dicSize < LZMA_DIC_MIN) -+ dicSize = LZMA_DIC_MIN; -+ p->dicSize = dicSize; -+ -+ d = data[0]; -+ if (d >= (9 * 5 * 5)) -+ return SZ_ERROR_UNSUPPORTED; -+ -+ p->lc = d % 9; -+ d /= 9; -+ p->pb = d / 5; -+ p->lp = d % 5; -+ -+ return SZ_OK; -+} -+ -+static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) -+{ -+ UInt32 numProbs = LzmaProps_GetNumProbs(propNew); -+ if (p->probs == 0 || numProbs != p->numProbs) -+ { -+ LzmaDec_FreeProbs(p, alloc); -+ p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); -+ p->numProbs = numProbs; -+ if (p->probs == 0) -+ return SZ_ERROR_MEM; -+ } -+ return SZ_OK; -+} -+ -+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) -+{ -+ CLzmaProps propNew; -+ RINOK(LzmaProps_Decode(&propNew, props, propsSize)); -+ RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); -+ p->prop = propNew; -+ return SZ_OK; -+} -+ -+SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) -+{ -+ CLzmaProps propNew; -+ SizeT dicBufSize; -+ RINOK(LzmaProps_Decode(&propNew, props, propsSize)); -+ RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); -+ dicBufSize = propNew.dicSize; -+ if (p->dic == 0 || dicBufSize != p->dicBufSize) -+ { -+ LzmaDec_FreeDict(p, alloc); -+ p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize); -+ if (p->dic == 0) -+ { -+ LzmaDec_FreeProbs(p, alloc); -+ return SZ_ERROR_MEM; -+ } -+ } -+ p->dicBufSize = dicBufSize; -+ p->prop = propNew; -+ return SZ_OK; -+} -+ -+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, -+ const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, -+ ELzmaStatus *status, ISzAlloc *alloc) -+{ -+ CLzmaDec p; -+ SRes res; -+ SizeT inSize = *srcLen; -+ SizeT outSize = *destLen; -+ *srcLen = *destLen = 0; -+ if (inSize < RC_INIT_SIZE) -+ return SZ_ERROR_INPUT_EOF; -+ -+ LzmaDec_Construct(&p); -+ res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc); -+ if (res != 0) -+ return res; -+ p.dic = dest; -+ p.dicBufSize = outSize; -+ -+ LzmaDec_Init(&p); -+ -+ *srcLen = inSize; -+ res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); -+ -+ if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) -+ res = SZ_ERROR_INPUT_EOF; -+ -+ (*destLen) = p.dicPos; -+ LzmaDec_FreeProbs(&p, alloc); -+ return res; -+} ---- /dev/null -+++ b/lib/lzma/LzmaEnc.c -@@ -0,0 +1,2271 @@ -+/* LzmaEnc.c -- LZMA Encoder -+2009-11-24 : Igor Pavlov : Public domain */ -+ -+#include -+ -+/* #define SHOW_STAT */ -+/* #define SHOW_STAT2 */ -+ -+#if defined(SHOW_STAT) || defined(SHOW_STAT2) -+#include -+#endif -+ -+#include "LzmaEnc.h" -+ -+/* disable MT */ -+#define _7ZIP_ST -+ -+#include "LzFind.h" -+#ifndef _7ZIP_ST -+#include "LzFindMt.h" -+#endif -+ -+#ifdef SHOW_STAT -+static int ttt = 0; -+#endif -+ -+#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1) -+ -+#define kBlockSize (9 << 10) -+#define kUnpackBlockSize (1 << 18) -+#define kMatchArraySize (1 << 21) -+#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX) -+ -+#define kNumMaxDirectBits (31) -+ -+#define kNumTopBits 24 -+#define kTopValue ((UInt32)1 << kNumTopBits) -+ -+#define kNumBitModelTotalBits 11 -+#define kBitModelTotal (1 << kNumBitModelTotalBits) -+#define kNumMoveBits 5 -+#define kProbInitValue (kBitModelTotal >> 1) -+ -+#define kNumMoveReducingBits 4 -+#define kNumBitPriceShiftBits 4 -+#define kBitPrice (1 << kNumBitPriceShiftBits) -+ -+void LzmaEncProps_Init(CLzmaEncProps *p) -+{ -+ p->level = 5; -+ p->dictSize = p->mc = 0; -+ p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; -+ p->writeEndMark = 0; -+} -+ -+void LzmaEncProps_Normalize(CLzmaEncProps *p) -+{ -+ int level = p->level; -+ if (level < 0) level = 5; -+ p->level = level; -+ if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26))); -+ if (p->lc < 0) p->lc = 3; -+ if (p->lp < 0) p->lp = 0; -+ if (p->pb < 0) p->pb = 2; -+ if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); -+ if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); -+ if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); -+ if (p->numHashBytes < 0) p->numHashBytes = 4; -+ if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1); -+ if (p->numThreads < 0) -+ p->numThreads = -+ #ifndef _7ZIP_ST -+ ((p->btMode && p->algo) ? 2 : 1); -+ #else -+ 1; -+ #endif -+} -+ -+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) -+{ -+ CLzmaEncProps props = *props2; -+ LzmaEncProps_Normalize(&props); -+ return props.dictSize; -+} -+ -+/* #define LZMA_LOG_BSR */ -+/* Define it for Intel's CPU */ -+ -+ -+#ifdef LZMA_LOG_BSR -+ -+#define kDicLogSizeMaxCompress 30 -+ -+#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); } -+ -+UInt32 GetPosSlot1(UInt32 pos) -+{ -+ UInt32 res; -+ BSR2_RET(pos, res); -+ return res; -+} -+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -+#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } -+ -+#else -+ -+#define kNumLogBits (9 + (int)sizeof(size_t) / 2) -+#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) -+ -+void LzmaEnc_FastPosInit(Byte *g_FastPos) -+{ -+ int c = 2, slotFast; -+ g_FastPos[0] = 0; -+ g_FastPos[1] = 1; -+ -+ for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++) -+ { -+ UInt32 k = (1 << ((slotFast >> 1) - 1)); -+ UInt32 j; -+ for (j = 0; j < k; j++, c++) -+ g_FastPos[c] = (Byte)slotFast; -+ } -+} -+ -+#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \ -+ (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ -+ res = p->g_FastPos[pos >> i] + (i * 2); } -+/* -+#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ -+ p->g_FastPos[pos >> 6] + 12 : \ -+ p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; } -+*/ -+ -+#define GetPosSlot1(pos) p->g_FastPos[pos] -+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -+#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); } -+ -+#endif -+ -+ -+#define LZMA_NUM_REPS 4 -+ -+typedef unsigned CState; -+ -+typedef struct -+{ -+ UInt32 price; -+ -+ CState state; -+ int prev1IsChar; -+ int prev2; -+ -+ UInt32 posPrev2; -+ UInt32 backPrev2; -+ -+ UInt32 posPrev; -+ UInt32 backPrev; -+ UInt32 backs[LZMA_NUM_REPS]; -+} COptimal; -+ -+#define kNumOpts (1 << 12) -+ -+#define kNumLenToPosStates 4 -+#define kNumPosSlotBits 6 -+#define kDicLogSizeMin 0 -+#define kDicLogSizeMax 32 -+#define kDistTableSizeMax (kDicLogSizeMax * 2) -+ -+ -+#define kNumAlignBits 4 -+#define kAlignTableSize (1 << kNumAlignBits) -+#define kAlignMask (kAlignTableSize - 1) -+ -+#define kStartPosModelIndex 4 -+#define kEndPosModelIndex 14 -+#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex) -+ -+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) -+ -+#ifdef _LZMA_PROB32 -+#define CLzmaProb UInt32 -+#else -+#define CLzmaProb UInt16 -+#endif -+ -+#define LZMA_PB_MAX 4 -+#define LZMA_LC_MAX 8 -+#define LZMA_LP_MAX 4 -+ -+#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) -+ -+ -+#define kLenNumLowBits 3 -+#define kLenNumLowSymbols (1 << kLenNumLowBits) -+#define kLenNumMidBits 3 -+#define kLenNumMidSymbols (1 << kLenNumMidBits) -+#define kLenNumHighBits 8 -+#define kLenNumHighSymbols (1 << kLenNumHighBits) -+ -+#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) -+ -+#define LZMA_MATCH_LEN_MIN 2 -+#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) -+ -+#define kNumStates 12 -+ -+typedef struct -+{ -+ CLzmaProb choice; -+ CLzmaProb choice2; -+ CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits]; -+ CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits]; -+ CLzmaProb high[kLenNumHighSymbols]; -+} CLenEnc; -+ -+typedef struct -+{ -+ CLenEnc p; -+ UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; -+ UInt32 tableSize; -+ UInt32 counters[LZMA_NUM_PB_STATES_MAX]; -+} CLenPriceEnc; -+ -+typedef struct -+{ -+ UInt32 range; -+ Byte cache; -+ UInt64 low; -+ UInt64 cacheSize; -+ Byte *buf; -+ Byte *bufLim; -+ Byte *bufBase; -+ ISeqOutStream *outStream; -+ UInt64 processed; -+ SRes res; -+} CRangeEnc; -+ -+typedef struct -+{ -+ CLzmaProb *litProbs; -+ -+ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ CLzmaProb isRep[kNumStates]; -+ CLzmaProb isRepG0[kNumStates]; -+ CLzmaProb isRepG1[kNumStates]; -+ CLzmaProb isRepG2[kNumStates]; -+ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ -+ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; -+ CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; -+ CLzmaProb posAlignEncoder[1 << kNumAlignBits]; -+ -+ CLenPriceEnc lenEnc; -+ CLenPriceEnc repLenEnc; -+ -+ UInt32 reps[LZMA_NUM_REPS]; -+ UInt32 state; -+} CSaveState; -+ -+typedef struct -+{ -+ IMatchFinder matchFinder; -+ void *matchFinderObj; -+ -+ #ifndef _7ZIP_ST -+ Bool mtMode; -+ CMatchFinderMt matchFinderMt; -+ #endif -+ -+ CMatchFinder matchFinderBase; -+ -+ #ifndef _7ZIP_ST -+ Byte pad[128]; -+ #endif -+ -+ UInt32 optimumEndIndex; -+ UInt32 optimumCurrentIndex; -+ -+ UInt32 longestMatchLength; -+ UInt32 numPairs; -+ UInt32 numAvail; -+ COptimal opt[kNumOpts]; -+ -+ #ifndef LZMA_LOG_BSR -+ Byte g_FastPos[1 << kNumLogBits]; -+ #endif -+ -+ UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; -+ UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; -+ UInt32 numFastBytes; -+ UInt32 additionalOffset; -+ UInt32 reps[LZMA_NUM_REPS]; -+ UInt32 state; -+ -+ UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; -+ UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; -+ UInt32 alignPrices[kAlignTableSize]; -+ UInt32 alignPriceCount; -+ -+ UInt32 distTableSize; -+ -+ unsigned lc, lp, pb; -+ unsigned lpMask, pbMask; -+ -+ CLzmaProb *litProbs; -+ -+ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ CLzmaProb isRep[kNumStates]; -+ CLzmaProb isRepG0[kNumStates]; -+ CLzmaProb isRepG1[kNumStates]; -+ CLzmaProb isRepG2[kNumStates]; -+ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ -+ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; -+ CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; -+ CLzmaProb posAlignEncoder[1 << kNumAlignBits]; -+ -+ CLenPriceEnc lenEnc; -+ CLenPriceEnc repLenEnc; -+ -+ unsigned lclp; -+ -+ Bool fastMode; -+ -+ CRangeEnc rc; -+ -+ Bool writeEndMark; -+ UInt64 nowPos64; -+ UInt32 matchPriceCount; -+ Bool finished; -+ Bool multiThread; -+ -+ SRes result; -+ UInt32 dictSize; -+ UInt32 matchFinderCycles; -+ -+ int needInit; -+ -+ CSaveState saveState; -+} CLzmaEnc; -+ -+void LzmaEnc_SaveState(CLzmaEncHandle pp) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ CSaveState *dest = &p->saveState; -+ int i; -+ dest->lenEnc = p->lenEnc; -+ dest->repLenEnc = p->repLenEnc; -+ dest->state = p->state; -+ -+ for (i = 0; i < kNumStates; i++) -+ { -+ memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); -+ memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); -+ } -+ for (i = 0; i < kNumLenToPosStates; i++) -+ memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); -+ memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); -+ memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); -+ memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); -+ memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); -+ memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); -+ memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); -+ memcpy(dest->reps, p->reps, sizeof(p->reps)); -+ memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb)); -+} -+ -+void LzmaEnc_RestoreState(CLzmaEncHandle pp) -+{ -+ CLzmaEnc *dest = (CLzmaEnc *)pp; -+ const CSaveState *p = &dest->saveState; -+ int i; -+ dest->lenEnc = p->lenEnc; -+ dest->repLenEnc = p->repLenEnc; -+ dest->state = p->state; -+ -+ for (i = 0; i < kNumStates; i++) -+ { -+ memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); -+ memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); -+ } -+ for (i = 0; i < kNumLenToPosStates; i++) -+ memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); -+ memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); -+ memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); -+ memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); -+ memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); -+ memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); -+ memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); -+ memcpy(dest->reps, p->reps, sizeof(p->reps)); -+ memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb)); -+} -+ -+SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ CLzmaEncProps props = *props2; -+ LzmaEncProps_Normalize(&props); -+ -+ if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX || -+ props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30)) -+ return SZ_ERROR_PARAM; -+ p->dictSize = props.dictSize; -+ p->matchFinderCycles = props.mc; -+ { -+ unsigned fb = props.fb; -+ if (fb < 5) -+ fb = 5; -+ if (fb > LZMA_MATCH_LEN_MAX) -+ fb = LZMA_MATCH_LEN_MAX; -+ p->numFastBytes = fb; -+ } -+ p->lc = props.lc; -+ p->lp = props.lp; -+ p->pb = props.pb; -+ p->fastMode = (props.algo == 0); -+ p->matchFinderBase.btMode = props.btMode; -+ { -+ UInt32 numHashBytes = 4; -+ if (props.btMode) -+ { -+ if (props.numHashBytes < 2) -+ numHashBytes = 2; -+ else if (props.numHashBytes < 4) -+ numHashBytes = props.numHashBytes; -+ } -+ p->matchFinderBase.numHashBytes = numHashBytes; -+ } -+ -+ p->matchFinderBase.cutValue = props.mc; -+ -+ p->writeEndMark = props.writeEndMark; -+ -+ #ifndef _7ZIP_ST -+ /* -+ if (newMultiThread != _multiThread) -+ { -+ ReleaseMatchFinder(); -+ _multiThread = newMultiThread; -+ } -+ */ -+ p->multiThread = (props.numThreads > 1); -+ #endif -+ -+ return SZ_OK; -+} -+ -+static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; -+static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; -+static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; -+static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; -+ -+#define IsCharState(s) ((s) < 7) -+ -+#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) -+ -+#define kInfinityPrice (1 << 30) -+ -+static void RangeEnc_Construct(CRangeEnc *p) -+{ -+ p->outStream = 0; -+ p->bufBase = 0; -+} -+ -+#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) -+ -+#define RC_BUF_SIZE (1 << 16) -+static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) -+{ -+ if (p->bufBase == 0) -+ { -+ p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE); -+ if (p->bufBase == 0) -+ return 0; -+ p->bufLim = p->bufBase + RC_BUF_SIZE; -+ } -+ return 1; -+} -+ -+static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->bufBase); -+ p->bufBase = 0; -+} -+ -+static void RangeEnc_Init(CRangeEnc *p) -+{ -+ /* Stream.Init(); */ -+ p->low = 0; -+ p->range = 0xFFFFFFFF; -+ p->cacheSize = 1; -+ p->cache = 0; -+ -+ p->buf = p->bufBase; -+ -+ p->processed = 0; -+ p->res = SZ_OK; -+} -+ -+static void RangeEnc_FlushStream(CRangeEnc *p) -+{ -+ size_t num; -+ if (p->res != SZ_OK) -+ return; -+ num = p->buf - p->bufBase; -+ if (num != p->outStream->Write(p->outStream, p->bufBase, num)) -+ p->res = SZ_ERROR_WRITE; -+ p->processed += num; -+ p->buf = p->bufBase; -+} -+ -+static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) -+{ -+ if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0) -+ { -+ Byte temp = p->cache; -+ do -+ { -+ Byte *buf = p->buf; -+ *buf++ = (Byte)(temp + (Byte)(p->low >> 32)); -+ p->buf = buf; -+ if (buf == p->bufLim) -+ RangeEnc_FlushStream(p); -+ temp = 0xFF; -+ } -+ while (--p->cacheSize != 0); -+ p->cache = (Byte)((UInt32)p->low >> 24); -+ } -+ p->cacheSize++; -+ p->low = (UInt32)p->low << 8; -+} -+ -+static void RangeEnc_FlushData(CRangeEnc *p) -+{ -+ int i; -+ for (i = 0; i < 5; i++) -+ RangeEnc_ShiftLow(p); -+} -+ -+static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits) -+{ -+ do -+ { -+ p->range >>= 1; -+ p->low += p->range & (0 - ((value >> --numBits) & 1)); -+ if (p->range < kTopValue) -+ { -+ p->range <<= 8; -+ RangeEnc_ShiftLow(p); -+ } -+ } -+ while (numBits != 0); -+} -+ -+static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol) -+{ -+ UInt32 ttt = *prob; -+ UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt; -+ if (symbol == 0) -+ { -+ p->range = newBound; -+ ttt += (kBitModelTotal - ttt) >> kNumMoveBits; -+ } -+ else -+ { -+ p->low += newBound; -+ p->range -= newBound; -+ ttt -= ttt >> kNumMoveBits; -+ } -+ *prob = (CLzmaProb)ttt; -+ if (p->range < kTopValue) -+ { -+ p->range <<= 8; -+ RangeEnc_ShiftLow(p); -+ } -+} -+ -+static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) -+{ -+ symbol |= 0x100; -+ do -+ { -+ RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); -+ symbol <<= 1; -+ } -+ while (symbol < 0x10000); -+} -+ -+static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) -+{ -+ UInt32 offs = 0x100; -+ symbol |= 0x100; -+ do -+ { -+ matchByte <<= 1; -+ RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); -+ symbol <<= 1; -+ offs &= ~(matchByte ^ symbol); -+ } -+ while (symbol < 0x10000); -+} -+ -+void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) -+{ -+ UInt32 i; -+ for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) -+ { -+ const int kCyclesBits = kNumBitPriceShiftBits; -+ UInt32 w = i; -+ UInt32 bitCount = 0; -+ int j; -+ for (j = 0; j < kCyclesBits; j++) -+ { -+ w = w * w; -+ bitCount <<= 1; -+ while (w >= ((UInt32)1 << 16)) -+ { -+ w >>= 1; -+ bitCount++; -+ } -+ } -+ ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); -+ } -+} -+ -+ -+#define GET_PRICE(prob, symbol) \ -+ p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; -+ -+#define GET_PRICEa(prob, symbol) \ -+ ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; -+ -+#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] -+#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] -+ -+#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits] -+#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] -+ -+static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ symbol |= 0x100; -+ do -+ { -+ price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1); -+ symbol <<= 1; -+ } -+ while (symbol < 0x10000); -+ return price; -+} -+ -+static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ UInt32 offs = 0x100; -+ symbol |= 0x100; -+ do -+ { -+ matchByte <<= 1; -+ price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1); -+ symbol <<= 1; -+ offs &= ~(matchByte ^ symbol); -+ } -+ while (symbol < 0x10000); -+ return price; -+} -+ -+ -+static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) -+{ -+ UInt32 m = 1; -+ int i; -+ for (i = numBitLevels; i != 0;) -+ { -+ UInt32 bit; -+ i--; -+ bit = (symbol >> i) & 1; -+ RangeEnc_EncodeBit(rc, probs + m, bit); -+ m = (m << 1) | bit; -+ } -+} -+ -+static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) -+{ -+ UInt32 m = 1; -+ int i; -+ for (i = 0; i < numBitLevels; i++) -+ { -+ UInt32 bit = symbol & 1; -+ RangeEnc_EncodeBit(rc, probs + m, bit); -+ m = (m << 1) | bit; -+ symbol >>= 1; -+ } -+} -+ -+static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ symbol |= (1 << numBitLevels); -+ while (symbol != 1) -+ { -+ price += GET_PRICEa(probs[symbol >> 1], symbol & 1); -+ symbol >>= 1; -+ } -+ return price; -+} -+ -+static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ UInt32 m = 1; -+ int i; -+ for (i = numBitLevels; i != 0; i--) -+ { -+ UInt32 bit = symbol & 1; -+ symbol >>= 1; -+ price += GET_PRICEa(probs[m], bit); -+ m = (m << 1) | bit; -+ } -+ return price; -+} -+ -+ -+static void LenEnc_Init(CLenEnc *p) -+{ -+ unsigned i; -+ p->choice = p->choice2 = kProbInitValue; -+ for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++) -+ p->low[i] = kProbInitValue; -+ for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++) -+ p->mid[i] = kProbInitValue; -+ for (i = 0; i < kLenNumHighSymbols; i++) -+ p->high[i] = kProbInitValue; -+} -+ -+static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState) -+{ -+ if (symbol < kLenNumLowSymbols) -+ { -+ RangeEnc_EncodeBit(rc, &p->choice, 0); -+ RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol); -+ } -+ else -+ { -+ RangeEnc_EncodeBit(rc, &p->choice, 1); -+ if (symbol < kLenNumLowSymbols + kLenNumMidSymbols) -+ { -+ RangeEnc_EncodeBit(rc, &p->choice2, 0); -+ RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols); -+ } -+ else -+ { -+ RangeEnc_EncodeBit(rc, &p->choice2, 1); -+ RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols); -+ } -+ } -+} -+ -+static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices) -+{ -+ UInt32 a0 = GET_PRICE_0a(p->choice); -+ UInt32 a1 = GET_PRICE_1a(p->choice); -+ UInt32 b0 = a1 + GET_PRICE_0a(p->choice2); -+ UInt32 b1 = a1 + GET_PRICE_1a(p->choice2); -+ UInt32 i = 0; -+ for (i = 0; i < kLenNumLowSymbols; i++) -+ { -+ if (i >= numSymbols) -+ return; -+ prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices); -+ } -+ for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++) -+ { -+ if (i >= numSymbols) -+ return; -+ prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices); -+ } -+ for (; i < numSymbols; i++) -+ prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices); -+} -+ -+static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices) -+{ -+ LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices); -+ p->counters[posState] = p->tableSize; -+} -+ -+static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices) -+{ -+ UInt32 posState; -+ for (posState = 0; posState < numPosStates; posState++) -+ LenPriceEnc_UpdateTable(p, posState, ProbPrices); -+} -+ -+static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices) -+{ -+ LenEnc_Encode(&p->p, rc, symbol, posState); -+ if (updatePrice) -+ if (--p->counters[posState] == 0) -+ LenPriceEnc_UpdateTable(p, posState, ProbPrices); -+} -+ -+ -+ -+ -+static void MovePos(CLzmaEnc *p, UInt32 num) -+{ -+ #ifdef SHOW_STAT -+ ttt += num; -+ printf("\n MovePos %d", num); -+ #endif -+ if (num != 0) -+ { -+ p->additionalOffset += num; -+ p->matchFinder.Skip(p->matchFinderObj, num); -+ } -+} -+ -+static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes) -+{ -+ UInt32 lenRes = 0, numPairs; -+ p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); -+ numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); -+ #ifdef SHOW_STAT -+ printf("\n i = %d numPairs = %d ", ttt, numPairs / 2); -+ ttt++; -+ { -+ UInt32 i; -+ for (i = 0; i < numPairs; i += 2) -+ printf("%2d %6d | ", p->matches[i], p->matches[i + 1]); -+ } -+ #endif -+ if (numPairs > 0) -+ { -+ lenRes = p->matches[numPairs - 2]; -+ if (lenRes == p->numFastBytes) -+ { -+ const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ UInt32 distance = p->matches[numPairs - 1] + 1; -+ UInt32 numAvail = p->numAvail; -+ if (numAvail > LZMA_MATCH_LEN_MAX) -+ numAvail = LZMA_MATCH_LEN_MAX; -+ { -+ const Byte *pby2 = pby - distance; -+ for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++); -+ } -+ } -+ } -+ p->additionalOffset++; -+ *numDistancePairsRes = numPairs; -+ return lenRes; -+} -+ -+ -+#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False; -+#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False; -+#define IsShortRep(p) ((p)->backPrev == 0) -+ -+static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState) -+{ -+ return -+ GET_PRICE_0(p->isRepG0[state]) + -+ GET_PRICE_0(p->isRep0Long[state][posState]); -+} -+ -+static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState) -+{ -+ UInt32 price; -+ if (repIndex == 0) -+ { -+ price = GET_PRICE_0(p->isRepG0[state]); -+ price += GET_PRICE_1(p->isRep0Long[state][posState]); -+ } -+ else -+ { -+ price = GET_PRICE_1(p->isRepG0[state]); -+ if (repIndex == 1) -+ price += GET_PRICE_0(p->isRepG1[state]); -+ else -+ { -+ price += GET_PRICE_1(p->isRepG1[state]); -+ price += GET_PRICE(p->isRepG2[state], repIndex - 2); -+ } -+ } -+ return price; -+} -+ -+static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState) -+{ -+ return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] + -+ GetPureRepPrice(p, repIndex, state, posState); -+} -+ -+static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur) -+{ -+ UInt32 posMem = p->opt[cur].posPrev; -+ UInt32 backMem = p->opt[cur].backPrev; -+ p->optimumEndIndex = cur; -+ do -+ { -+ if (p->opt[cur].prev1IsChar) -+ { -+ MakeAsChar(&p->opt[posMem]) -+ p->opt[posMem].posPrev = posMem - 1; -+ if (p->opt[cur].prev2) -+ { -+ p->opt[posMem - 1].prev1IsChar = False; -+ p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2; -+ p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2; -+ } -+ } -+ { -+ UInt32 posPrev = posMem; -+ UInt32 backCur = backMem; -+ -+ backMem = p->opt[posPrev].backPrev; -+ posMem = p->opt[posPrev].posPrev; -+ -+ p->opt[posPrev].backPrev = backCur; -+ p->opt[posPrev].posPrev = cur; -+ cur = posPrev; -+ } -+ } -+ while (cur != 0); -+ *backRes = p->opt[0].backPrev; -+ p->optimumCurrentIndex = p->opt[0].posPrev; -+ return p->optimumCurrentIndex; -+} -+ -+#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300) -+ -+static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) -+{ -+ UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur; -+ UInt32 matchPrice, repMatchPrice, normalMatchPrice; -+ UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS]; -+ UInt32 *matches; -+ const Byte *data; -+ Byte curByte, matchByte; -+ if (p->optimumEndIndex != p->optimumCurrentIndex) -+ { -+ const COptimal *opt = &p->opt[p->optimumCurrentIndex]; -+ UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex; -+ *backRes = opt->backPrev; -+ p->optimumCurrentIndex = opt->posPrev; -+ return lenRes; -+ } -+ p->optimumCurrentIndex = p->optimumEndIndex = 0; -+ -+ if (p->additionalOffset == 0) -+ mainLen = ReadMatchDistances(p, &numPairs); -+ else -+ { -+ mainLen = p->longestMatchLength; -+ numPairs = p->numPairs; -+ } -+ -+ numAvail = p->numAvail; -+ if (numAvail < 2) -+ { -+ *backRes = (UInt32)(-1); -+ return 1; -+ } -+ if (numAvail > LZMA_MATCH_LEN_MAX) -+ numAvail = LZMA_MATCH_LEN_MAX; -+ -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ repMaxIndex = 0; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 lenTest; -+ const Byte *data2; -+ reps[i] = p->reps[i]; -+ data2 = data - (reps[i] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ { -+ repLens[i] = 0; -+ continue; -+ } -+ for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); -+ repLens[i] = lenTest; -+ if (lenTest > repLens[repMaxIndex]) -+ repMaxIndex = i; -+ } -+ if (repLens[repMaxIndex] >= p->numFastBytes) -+ { -+ UInt32 lenRes; -+ *backRes = repMaxIndex; -+ lenRes = repLens[repMaxIndex]; -+ MovePos(p, lenRes - 1); -+ return lenRes; -+ } -+ -+ matches = p->matches; -+ if (mainLen >= p->numFastBytes) -+ { -+ *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; -+ MovePos(p, mainLen - 1); -+ return mainLen; -+ } -+ curByte = *data; -+ matchByte = *(data - (reps[0] + 1)); -+ -+ if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) -+ { -+ *backRes = (UInt32)-1; -+ return 1; -+ } -+ -+ p->opt[0].state = (CState)p->state; -+ -+ posState = (position & p->pbMask); -+ -+ { -+ const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); -+ p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + -+ (!IsCharState(p->state) ? -+ LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : -+ LitEnc_GetPrice(probs, curByte, p->ProbPrices)); -+ } -+ -+ MakeAsChar(&p->opt[1]); -+ -+ matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); -+ repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); -+ -+ if (matchByte == curByte) -+ { -+ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState); -+ if (shortRepPrice < p->opt[1].price) -+ { -+ p->opt[1].price = shortRepPrice; -+ MakeAsShortRep(&p->opt[1]); -+ } -+ } -+ lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]); -+ -+ if (lenEnd < 2) -+ { -+ *backRes = p->opt[1].backPrev; -+ return 1; -+ } -+ -+ p->opt[1].posPrev = 0; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ p->opt[0].backs[i] = reps[i]; -+ -+ len = lenEnd; -+ do -+ p->opt[len--].price = kInfinityPrice; -+ while (len >= 2); -+ -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 repLen = repLens[i]; -+ UInt32 price; -+ if (repLen < 2) -+ continue; -+ price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState); -+ do -+ { -+ UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2]; -+ COptimal *opt = &p->opt[repLen]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = 0; -+ opt->backPrev = i; -+ opt->prev1IsChar = False; -+ } -+ } -+ while (--repLen >= 2); -+ } -+ -+ normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); -+ -+ len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); -+ if (len <= mainLen) -+ { -+ UInt32 offs = 0; -+ while (len > matches[offs]) -+ offs += 2; -+ for (; ; len++) -+ { -+ COptimal *opt; -+ UInt32 distance = matches[offs + 1]; -+ -+ UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN]; -+ UInt32 lenToPosState = GetLenToPosState(len); -+ if (distance < kNumFullDistances) -+ curAndLenPrice += p->distancesPrices[lenToPosState][distance]; -+ else -+ { -+ UInt32 slot; -+ GetPosSlot2(distance, slot); -+ curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot]; -+ } -+ opt = &p->opt[len]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = 0; -+ opt->backPrev = distance + LZMA_NUM_REPS; -+ opt->prev1IsChar = False; -+ } -+ if (len == matches[offs]) -+ { -+ offs += 2; -+ if (offs == numPairs) -+ break; -+ } -+ } -+ } -+ -+ cur = 0; -+ -+ #ifdef SHOW_STAT2 -+ if (position >= 0) -+ { -+ unsigned i; -+ printf("\n pos = %4X", position); -+ for (i = cur; i <= lenEnd; i++) -+ printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price); -+ } -+ #endif -+ -+ for (;;) -+ { -+ UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen; -+ UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice; -+ Bool nextIsChar; -+ Byte curByte, matchByte; -+ const Byte *data; -+ COptimal *curOpt; -+ COptimal *nextOpt; -+ -+ cur++; -+ if (cur == lenEnd) -+ return Backward(p, backRes, cur); -+ -+ newLen = ReadMatchDistances(p, &numPairs); -+ if (newLen >= p->numFastBytes) -+ { -+ p->numPairs = numPairs; -+ p->longestMatchLength = newLen; -+ return Backward(p, backRes, cur); -+ } -+ position++; -+ curOpt = &p->opt[cur]; -+ posPrev = curOpt->posPrev; -+ if (curOpt->prev1IsChar) -+ { -+ posPrev--; -+ if (curOpt->prev2) -+ { -+ state = p->opt[curOpt->posPrev2].state; -+ if (curOpt->backPrev2 < LZMA_NUM_REPS) -+ state = kRepNextStates[state]; -+ else -+ state = kMatchNextStates[state]; -+ } -+ else -+ state = p->opt[posPrev].state; -+ state = kLiteralNextStates[state]; -+ } -+ else -+ state = p->opt[posPrev].state; -+ if (posPrev == cur - 1) -+ { -+ if (IsShortRep(curOpt)) -+ state = kShortRepNextStates[state]; -+ else -+ state = kLiteralNextStates[state]; -+ } -+ else -+ { -+ UInt32 pos; -+ const COptimal *prevOpt; -+ if (curOpt->prev1IsChar && curOpt->prev2) -+ { -+ posPrev = curOpt->posPrev2; -+ pos = curOpt->backPrev2; -+ state = kRepNextStates[state]; -+ } -+ else -+ { -+ pos = curOpt->backPrev; -+ if (pos < LZMA_NUM_REPS) -+ state = kRepNextStates[state]; -+ else -+ state = kMatchNextStates[state]; -+ } -+ prevOpt = &p->opt[posPrev]; -+ if (pos < LZMA_NUM_REPS) -+ { -+ UInt32 i; -+ reps[0] = prevOpt->backs[pos]; -+ for (i = 1; i <= pos; i++) -+ reps[i] = prevOpt->backs[i - 1]; -+ for (; i < LZMA_NUM_REPS; i++) -+ reps[i] = prevOpt->backs[i]; -+ } -+ else -+ { -+ UInt32 i; -+ reps[0] = (pos - LZMA_NUM_REPS); -+ for (i = 1; i < LZMA_NUM_REPS; i++) -+ reps[i] = prevOpt->backs[i - 1]; -+ } -+ } -+ curOpt->state = (CState)state; -+ -+ curOpt->backs[0] = reps[0]; -+ curOpt->backs[1] = reps[1]; -+ curOpt->backs[2] = reps[2]; -+ curOpt->backs[3] = reps[3]; -+ -+ curPrice = curOpt->price; -+ nextIsChar = False; -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ curByte = *data; -+ matchByte = *(data - (reps[0] + 1)); -+ -+ posState = (position & p->pbMask); -+ -+ curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]); -+ { -+ const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); -+ curAnd1Price += -+ (!IsCharState(state) ? -+ LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : -+ LitEnc_GetPrice(probs, curByte, p->ProbPrices)); -+ } -+ -+ nextOpt = &p->opt[cur + 1]; -+ -+ if (curAnd1Price < nextOpt->price) -+ { -+ nextOpt->price = curAnd1Price; -+ nextOpt->posPrev = cur; -+ MakeAsChar(nextOpt); -+ nextIsChar = True; -+ } -+ -+ matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); -+ repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); -+ -+ if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0)) -+ { -+ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState); -+ if (shortRepPrice <= nextOpt->price) -+ { -+ nextOpt->price = shortRepPrice; -+ nextOpt->posPrev = cur; -+ MakeAsShortRep(nextOpt); -+ nextIsChar = True; -+ } -+ } -+ numAvailFull = p->numAvail; -+ { -+ UInt32 temp = kNumOpts - 1 - cur; -+ if (temp < numAvailFull) -+ numAvailFull = temp; -+ } -+ -+ if (numAvailFull < 2) -+ continue; -+ numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); -+ -+ if (!nextIsChar && matchByte != curByte) /* speed optimization */ -+ { -+ /* try Literal + rep0 */ -+ UInt32 temp; -+ UInt32 lenTest2; -+ const Byte *data2 = data - (reps[0] + 1); -+ UInt32 limit = p->numFastBytes + 1; -+ if (limit > numAvailFull) -+ limit = numAvailFull; -+ -+ for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); -+ lenTest2 = temp - 1; -+ if (lenTest2 >= 2) -+ { -+ UInt32 state2 = kLiteralNextStates[state]; -+ UInt32 posStateNext = (position + 1) & p->pbMask; -+ UInt32 nextRepMatchPrice = curAnd1Price + -+ GET_PRICE_1(p->isMatch[state2][posStateNext]) + -+ GET_PRICE_1(p->isRep[state2]); -+ /* for (; lenTest2 >= 2; lenTest2--) */ -+ { -+ UInt32 curAndLenPrice; -+ COptimal *opt; -+ UInt32 offset = cur + 1 + lenTest2; -+ while (lenEnd < offset) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); -+ opt = &p->opt[offset]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur + 1; -+ opt->backPrev = 0; -+ opt->prev1IsChar = True; -+ opt->prev2 = False; -+ } -+ } -+ } -+ } -+ -+ startLen = 2; /* speed optimization */ -+ { -+ UInt32 repIndex; -+ for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++) -+ { -+ UInt32 lenTest; -+ UInt32 lenTestTemp; -+ UInt32 price; -+ const Byte *data2 = data - (reps[repIndex] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ continue; -+ for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); -+ while (lenEnd < cur + lenTest) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ lenTestTemp = lenTest; -+ price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState); -+ do -+ { -+ UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2]; -+ COptimal *opt = &p->opt[cur + lenTest]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur; -+ opt->backPrev = repIndex; -+ opt->prev1IsChar = False; -+ } -+ } -+ while (--lenTest >= 2); -+ lenTest = lenTestTemp; -+ -+ if (repIndex == 0) -+ startLen = lenTest + 1; -+ -+ /* if (_maxMode) */ -+ { -+ UInt32 lenTest2 = lenTest + 1; -+ UInt32 limit = lenTest2 + p->numFastBytes; -+ UInt32 nextRepMatchPrice; -+ if (limit > numAvailFull) -+ limit = numAvailFull; -+ for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); -+ lenTest2 -= lenTest + 1; -+ if (lenTest2 >= 2) -+ { -+ UInt32 state2 = kRepNextStates[state]; -+ UInt32 posStateNext = (position + lenTest) & p->pbMask; -+ UInt32 curAndLenCharPrice = -+ price + p->repLenEnc.prices[posState][lenTest - 2] + -+ GET_PRICE_0(p->isMatch[state2][posStateNext]) + -+ LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), -+ data[lenTest], data2[lenTest], p->ProbPrices); -+ state2 = kLiteralNextStates[state2]; -+ posStateNext = (position + lenTest + 1) & p->pbMask; -+ nextRepMatchPrice = curAndLenCharPrice + -+ GET_PRICE_1(p->isMatch[state2][posStateNext]) + -+ GET_PRICE_1(p->isRep[state2]); -+ -+ /* for (; lenTest2 >= 2; lenTest2--) */ -+ { -+ UInt32 curAndLenPrice; -+ COptimal *opt; -+ UInt32 offset = cur + lenTest + 1 + lenTest2; -+ while (lenEnd < offset) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); -+ opt = &p->opt[offset]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur + lenTest + 1; -+ opt->backPrev = 0; -+ opt->prev1IsChar = True; -+ opt->prev2 = True; -+ opt->posPrev2 = cur; -+ opt->backPrev2 = repIndex; -+ } -+ } -+ } -+ } -+ } -+ } -+ /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */ -+ if (newLen > numAvail) -+ { -+ newLen = numAvail; -+ for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2); -+ matches[numPairs] = newLen; -+ numPairs += 2; -+ } -+ if (newLen >= startLen) -+ { -+ UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); -+ UInt32 offs, curBack, posSlot; -+ UInt32 lenTest; -+ while (lenEnd < cur + newLen) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ -+ offs = 0; -+ while (startLen > matches[offs]) -+ offs += 2; -+ curBack = matches[offs + 1]; -+ GetPosSlot2(curBack, posSlot); -+ for (lenTest = /*2*/ startLen; ; lenTest++) -+ { -+ UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN]; -+ UInt32 lenToPosState = GetLenToPosState(lenTest); -+ COptimal *opt; -+ if (curBack < kNumFullDistances) -+ curAndLenPrice += p->distancesPrices[lenToPosState][curBack]; -+ else -+ curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask]; -+ -+ opt = &p->opt[cur + lenTest]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur; -+ opt->backPrev = curBack + LZMA_NUM_REPS; -+ opt->prev1IsChar = False; -+ } -+ -+ if (/*_maxMode && */lenTest == matches[offs]) -+ { -+ /* Try Match + Literal + Rep0 */ -+ const Byte *data2 = data - (curBack + 1); -+ UInt32 lenTest2 = lenTest + 1; -+ UInt32 limit = lenTest2 + p->numFastBytes; -+ UInt32 nextRepMatchPrice; -+ if (limit > numAvailFull) -+ limit = numAvailFull; -+ for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); -+ lenTest2 -= lenTest + 1; -+ if (lenTest2 >= 2) -+ { -+ UInt32 state2 = kMatchNextStates[state]; -+ UInt32 posStateNext = (position + lenTest) & p->pbMask; -+ UInt32 curAndLenCharPrice = curAndLenPrice + -+ GET_PRICE_0(p->isMatch[state2][posStateNext]) + -+ LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), -+ data[lenTest], data2[lenTest], p->ProbPrices); -+ state2 = kLiteralNextStates[state2]; -+ posStateNext = (posStateNext + 1) & p->pbMask; -+ nextRepMatchPrice = curAndLenCharPrice + -+ GET_PRICE_1(p->isMatch[state2][posStateNext]) + -+ GET_PRICE_1(p->isRep[state2]); -+ -+ /* for (; lenTest2 >= 2; lenTest2--) */ -+ { -+ UInt32 offset = cur + lenTest + 1 + lenTest2; -+ UInt32 curAndLenPrice; -+ COptimal *opt; -+ while (lenEnd < offset) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); -+ opt = &p->opt[offset]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur + lenTest + 1; -+ opt->backPrev = 0; -+ opt->prev1IsChar = True; -+ opt->prev2 = True; -+ opt->posPrev2 = cur; -+ opt->backPrev2 = curBack + LZMA_NUM_REPS; -+ } -+ } -+ } -+ offs += 2; -+ if (offs == numPairs) -+ break; -+ curBack = matches[offs + 1]; -+ if (curBack >= kNumFullDistances) -+ GetPosSlot2(curBack, posSlot); -+ } -+ } -+ } -+ } -+} -+ -+#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) -+ -+static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) -+{ -+ UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i; -+ const Byte *data; -+ const UInt32 *matches; -+ -+ if (p->additionalOffset == 0) -+ mainLen = ReadMatchDistances(p, &numPairs); -+ else -+ { -+ mainLen = p->longestMatchLength; -+ numPairs = p->numPairs; -+ } -+ -+ numAvail = p->numAvail; -+ *backRes = (UInt32)-1; -+ if (numAvail < 2) -+ return 1; -+ if (numAvail > LZMA_MATCH_LEN_MAX) -+ numAvail = LZMA_MATCH_LEN_MAX; -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ -+ repLen = repIndex = 0; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 len; -+ const Byte *data2 = data - (p->reps[i] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ continue; -+ for (len = 2; len < numAvail && data[len] == data2[len]; len++); -+ if (len >= p->numFastBytes) -+ { -+ *backRes = i; -+ MovePos(p, len - 1); -+ return len; -+ } -+ if (len > repLen) -+ { -+ repIndex = i; -+ repLen = len; -+ } -+ } -+ -+ matches = p->matches; -+ if (mainLen >= p->numFastBytes) -+ { -+ *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; -+ MovePos(p, mainLen - 1); -+ return mainLen; -+ } -+ -+ mainDist = 0; /* for GCC */ -+ if (mainLen >= 2) -+ { -+ mainDist = matches[numPairs - 1]; -+ while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1) -+ { -+ if (!ChangePair(matches[numPairs - 3], mainDist)) -+ break; -+ numPairs -= 2; -+ mainLen = matches[numPairs - 2]; -+ mainDist = matches[numPairs - 1]; -+ } -+ if (mainLen == 2 && mainDist >= 0x80) -+ mainLen = 1; -+ } -+ -+ if (repLen >= 2 && ( -+ (repLen + 1 >= mainLen) || -+ (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || -+ (repLen + 3 >= mainLen && mainDist >= (1 << 15)))) -+ { -+ *backRes = repIndex; -+ MovePos(p, repLen - 1); -+ return repLen; -+ } -+ -+ if (mainLen < 2 || numAvail <= 2) -+ return 1; -+ -+ p->longestMatchLength = ReadMatchDistances(p, &p->numPairs); -+ if (p->longestMatchLength >= 2) -+ { -+ UInt32 newDistance = matches[p->numPairs - 1]; -+ if ((p->longestMatchLength >= mainLen && newDistance < mainDist) || -+ (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) || -+ (p->longestMatchLength > mainLen + 1) || -+ (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist))) -+ return 1; -+ } -+ -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 len, limit; -+ const Byte *data2 = data - (p->reps[i] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ continue; -+ limit = mainLen - 1; -+ for (len = 2; len < limit && data[len] == data2[len]; len++); -+ if (len >= limit) -+ return 1; -+ } -+ *backRes = mainDist + LZMA_NUM_REPS; -+ MovePos(p, mainLen - 2); -+ return mainLen; -+} -+ -+static void WriteEndMarker(CLzmaEnc *p, UInt32 posState) -+{ -+ UInt32 len; -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); -+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); -+ p->state = kMatchNextStates[p->state]; -+ len = LZMA_MATCH_LEN_MIN; -+ LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); -+ RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1); -+ RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits); -+ RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); -+} -+ -+static SRes CheckErrors(CLzmaEnc *p) -+{ -+ if (p->result != SZ_OK) -+ return p->result; -+ if (p->rc.res != SZ_OK) -+ p->result = SZ_ERROR_WRITE; -+ if (p->matchFinderBase.result != SZ_OK) -+ p->result = SZ_ERROR_READ; -+ if (p->result != SZ_OK) -+ p->finished = True; -+ return p->result; -+} -+ -+static SRes Flush(CLzmaEnc *p, UInt32 nowPos) -+{ -+ /* ReleaseMFStream(); */ -+ p->finished = True; -+ if (p->writeEndMark) -+ WriteEndMarker(p, nowPos & p->pbMask); -+ RangeEnc_FlushData(&p->rc); -+ RangeEnc_FlushStream(&p->rc); -+ return CheckErrors(p); -+} -+ -+static void FillAlignPrices(CLzmaEnc *p) -+{ -+ UInt32 i; -+ for (i = 0; i < kAlignTableSize; i++) -+ p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); -+ p->alignPriceCount = 0; -+} -+ -+static void FillDistancesPrices(CLzmaEnc *p) -+{ -+ UInt32 tempPrices[kNumFullDistances]; -+ UInt32 i, lenToPosState; -+ for (i = kStartPosModelIndex; i < kNumFullDistances; i++) -+ { -+ UInt32 posSlot = GetPosSlot1(i); -+ UInt32 footerBits = ((posSlot >> 1) - 1); -+ UInt32 base = ((2 | (posSlot & 1)) << footerBits); -+ tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices); -+ } -+ -+ for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) -+ { -+ UInt32 posSlot; -+ const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; -+ UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; -+ for (posSlot = 0; posSlot < p->distTableSize; posSlot++) -+ posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); -+ for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++) -+ posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); -+ -+ { -+ UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; -+ UInt32 i; -+ for (i = 0; i < kStartPosModelIndex; i++) -+ distancesPrices[i] = posSlotPrices[i]; -+ for (; i < kNumFullDistances; i++) -+ distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i]; -+ } -+ } -+ p->matchPriceCount = 0; -+} -+ -+void LzmaEnc_Construct(CLzmaEnc *p) -+{ -+ RangeEnc_Construct(&p->rc); -+ MatchFinder_Construct(&p->matchFinderBase); -+ #ifndef _7ZIP_ST -+ MatchFinderMt_Construct(&p->matchFinderMt); -+ p->matchFinderMt.MatchFinder = &p->matchFinderBase; -+ #endif -+ -+ { -+ CLzmaEncProps props; -+ LzmaEncProps_Init(&props); -+ LzmaEnc_SetProps(p, &props); -+ } -+ -+ #ifndef LZMA_LOG_BSR -+ LzmaEnc_FastPosInit(p->g_FastPos); -+ #endif -+ -+ LzmaEnc_InitPriceTables(p->ProbPrices); -+ p->litProbs = 0; -+ p->saveState.litProbs = 0; -+} -+ -+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc) -+{ -+ void *p; -+ p = alloc->Alloc(alloc, sizeof(CLzmaEnc)); -+ if (p != 0) -+ LzmaEnc_Construct((CLzmaEnc *)p); -+ return p; -+} -+ -+void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->litProbs); -+ alloc->Free(alloc, p->saveState.litProbs); -+ p->litProbs = 0; -+ p->saveState.litProbs = 0; -+} -+ -+void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ #ifndef _7ZIP_ST -+ MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); -+ #endif -+ MatchFinder_Free(&p->matchFinderBase, allocBig); -+ LzmaEnc_FreeLits(p, alloc); -+ RangeEnc_Free(&p->rc, alloc); -+} -+ -+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); -+ alloc->Free(alloc, p); -+} -+ -+static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize) -+{ -+ UInt32 nowPos32, startPos32; -+ if (p->needInit) -+ { -+ p->matchFinder.Init(p->matchFinderObj); -+ p->needInit = 0; -+ } -+ -+ if (p->finished) -+ return p->result; -+ RINOK(CheckErrors(p)); -+ -+ nowPos32 = (UInt32)p->nowPos64; -+ startPos32 = nowPos32; -+ -+ if (p->nowPos64 == 0) -+ { -+ UInt32 numPairs; -+ Byte curByte; -+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) -+ return Flush(p, nowPos32); -+ ReadMatchDistances(p, &numPairs); -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0); -+ p->state = kLiteralNextStates[p->state]; -+ curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset); -+ LitEnc_Encode(&p->rc, p->litProbs, curByte); -+ p->additionalOffset--; -+ nowPos32++; -+ } -+ -+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) -+ for (;;) -+ { -+ UInt32 pos, len, posState; -+ -+ if (p->fastMode) -+ len = GetOptimumFast(p, &pos); -+ else -+ len = GetOptimum(p, nowPos32, &pos); -+ -+ #ifdef SHOW_STAT2 -+ printf("\n pos = %4X, len = %d pos = %d", nowPos32, len, pos); -+ #endif -+ -+ posState = nowPos32 & p->pbMask; -+ if (len == 1 && pos == (UInt32)-1) -+ { -+ Byte curByte; -+ CLzmaProb *probs; -+ const Byte *data; -+ -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0); -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; -+ curByte = *data; -+ probs = LIT_PROBS(nowPos32, *(data - 1)); -+ if (IsCharState(p->state)) -+ LitEnc_Encode(&p->rc, probs, curByte); -+ else -+ LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1)); -+ p->state = kLiteralNextStates[p->state]; -+ } -+ else -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); -+ if (pos < LZMA_NUM_REPS) -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1); -+ if (pos == 0) -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0); -+ RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1)); -+ } -+ else -+ { -+ UInt32 distance = p->reps[pos]; -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1); -+ if (pos == 1) -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0); -+ else -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1); -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2); -+ if (pos == 3) -+ p->reps[3] = p->reps[2]; -+ p->reps[2] = p->reps[1]; -+ } -+ p->reps[1] = p->reps[0]; -+ p->reps[0] = distance; -+ } -+ if (len == 1) -+ p->state = kShortRepNextStates[p->state]; -+ else -+ { -+ LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); -+ p->state = kRepNextStates[p->state]; -+ } -+ } -+ else -+ { -+ UInt32 posSlot; -+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); -+ p->state = kMatchNextStates[p->state]; -+ LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); -+ pos -= LZMA_NUM_REPS; -+ GetPosSlot(pos, posSlot); -+ RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot); -+ -+ if (posSlot >= kStartPosModelIndex) -+ { -+ UInt32 footerBits = ((posSlot >> 1) - 1); -+ UInt32 base = ((2 | (posSlot & 1)) << footerBits); -+ UInt32 posReduced = pos - base; -+ -+ if (posSlot < kEndPosModelIndex) -+ RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced); -+ else -+ { -+ RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); -+ RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); -+ p->alignPriceCount++; -+ } -+ } -+ p->reps[3] = p->reps[2]; -+ p->reps[2] = p->reps[1]; -+ p->reps[1] = p->reps[0]; -+ p->reps[0] = pos; -+ p->matchPriceCount++; -+ } -+ } -+ p->additionalOffset -= len; -+ nowPos32 += len; -+ if (p->additionalOffset == 0) -+ { -+ UInt32 processed; -+ if (!p->fastMode) -+ { -+ if (p->matchPriceCount >= (1 << 7)) -+ FillDistancesPrices(p); -+ if (p->alignPriceCount >= kAlignTableSize) -+ FillAlignPrices(p); -+ } -+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) -+ break; -+ processed = nowPos32 - startPos32; -+ if (useLimits) -+ { -+ if (processed + kNumOpts + 300 >= maxUnpackSize || -+ RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize) -+ break; -+ } -+ else if (processed >= (1 << 15)) -+ { -+ p->nowPos64 += nowPos32 - startPos32; -+ return CheckErrors(p); -+ } -+ } -+ } -+ p->nowPos64 += nowPos32 - startPos32; -+ return Flush(p, nowPos32); -+} -+ -+#define kBigHashDicLimit ((UInt32)1 << 24) -+ -+static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ UInt32 beforeSize = kNumOpts; -+ Bool btMode; -+ if (!RangeEnc_Alloc(&p->rc, alloc)) -+ return SZ_ERROR_MEM; -+ btMode = (p->matchFinderBase.btMode != 0); -+ #ifndef _7ZIP_ST -+ p->mtMode = (p->multiThread && !p->fastMode && btMode); -+ #endif -+ -+ { -+ unsigned lclp = p->lc + p->lp; -+ if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp) -+ { -+ LzmaEnc_FreeLits(p, alloc); -+ p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); -+ p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); -+ if (p->litProbs == 0 || p->saveState.litProbs == 0) -+ { -+ LzmaEnc_FreeLits(p, alloc); -+ return SZ_ERROR_MEM; -+ } -+ p->lclp = lclp; -+ } -+ } -+ -+ p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit); -+ -+ if (beforeSize + p->dictSize < keepWindowSize) -+ beforeSize = keepWindowSize - p->dictSize; -+ -+ #ifndef _7ZIP_ST -+ if (p->mtMode) -+ { -+ RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)); -+ p->matchFinderObj = &p->matchFinderMt; -+ MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); -+ } -+ else -+ #endif -+ { -+ if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)) -+ return SZ_ERROR_MEM; -+ p->matchFinderObj = &p->matchFinderBase; -+ MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder); -+ } -+ return SZ_OK; -+} -+ -+void LzmaEnc_Init(CLzmaEnc *p) -+{ -+ UInt32 i; -+ p->state = 0; -+ for (i = 0 ; i < LZMA_NUM_REPS; i++) -+ p->reps[i] = 0; -+ -+ RangeEnc_Init(&p->rc); -+ -+ -+ for (i = 0; i < kNumStates; i++) -+ { -+ UInt32 j; -+ for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) -+ { -+ p->isMatch[i][j] = kProbInitValue; -+ p->isRep0Long[i][j] = kProbInitValue; -+ } -+ p->isRep[i] = kProbInitValue; -+ p->isRepG0[i] = kProbInitValue; -+ p->isRepG1[i] = kProbInitValue; -+ p->isRepG2[i] = kProbInitValue; -+ } -+ -+ { -+ UInt32 num = 0x300 << (p->lp + p->lc); -+ for (i = 0; i < num; i++) -+ p->litProbs[i] = kProbInitValue; -+ } -+ -+ { -+ for (i = 0; i < kNumLenToPosStates; i++) -+ { -+ CLzmaProb *probs = p->posSlotEncoder[i]; -+ UInt32 j; -+ for (j = 0; j < (1 << kNumPosSlotBits); j++) -+ probs[j] = kProbInitValue; -+ } -+ } -+ { -+ for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) -+ p->posEncoders[i] = kProbInitValue; -+ } -+ -+ LenEnc_Init(&p->lenEnc.p); -+ LenEnc_Init(&p->repLenEnc.p); -+ -+ for (i = 0; i < (1 << kNumAlignBits); i++) -+ p->posAlignEncoder[i] = kProbInitValue; -+ -+ p->optimumEndIndex = 0; -+ p->optimumCurrentIndex = 0; -+ p->additionalOffset = 0; -+ -+ p->pbMask = (1 << p->pb) - 1; -+ p->lpMask = (1 << p->lp) - 1; -+} -+ -+void LzmaEnc_InitPrices(CLzmaEnc *p) -+{ -+ if (!p->fastMode) -+ { -+ FillDistancesPrices(p); -+ FillAlignPrices(p); -+ } -+ -+ p->lenEnc.tableSize = -+ p->repLenEnc.tableSize = -+ p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; -+ LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices); -+ LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices); -+} -+ -+static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ UInt32 i; -+ for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++) -+ if (p->dictSize <= ((UInt32)1 << i)) -+ break; -+ p->distTableSize = i * 2; -+ -+ p->finished = False; -+ p->result = SZ_OK; -+ RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); -+ LzmaEnc_Init(p); -+ LzmaEnc_InitPrices(p); -+ p->nowPos64 = 0; -+ return SZ_OK; -+} -+ -+static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, -+ ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ p->matchFinderBase.stream = inStream; -+ p->needInit = 1; -+ p->rc.outStream = outStream; -+ return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); -+} -+ -+SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, -+ ISeqInStream *inStream, UInt32 keepWindowSize, -+ ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ p->matchFinderBase.stream = inStream; -+ p->needInit = 1; -+ return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); -+} -+ -+static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) -+{ -+ p->matchFinderBase.directInput = 1; -+ p->matchFinderBase.bufferBase = (Byte *)src; -+ p->matchFinderBase.directInputRem = srcLen; -+} -+ -+SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, -+ UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ LzmaEnc_SetInputBuf(p, src, srcLen); -+ p->needInit = 1; -+ -+ return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); -+} -+ -+void LzmaEnc_Finish(CLzmaEncHandle pp) -+{ -+ #ifndef _7ZIP_ST -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ if (p->mtMode) -+ MatchFinderMt_ReleaseStream(&p->matchFinderMt); -+ #else -+ pp = pp; -+ #endif -+} -+ -+typedef struct -+{ -+ ISeqOutStream funcTable; -+ Byte *data; -+ SizeT rem; -+ Bool overflow; -+} CSeqOutStreamBuf; -+ -+static size_t MyWrite(void *pp, const void *data, size_t size) -+{ -+ CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp; -+ if (p->rem < size) -+ { -+ size = p->rem; -+ p->overflow = True; -+ } -+ memcpy(p->data, data, size); -+ p->rem -= size; -+ p->data += size; -+ return size; -+} -+ -+ -+UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp) -+{ -+ const CLzmaEnc *p = (CLzmaEnc *)pp; -+ return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); -+} -+ -+const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) -+{ -+ const CLzmaEnc *p = (CLzmaEnc *)pp; -+ return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; -+} -+ -+SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, -+ Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ UInt64 nowPos64; -+ SRes res; -+ CSeqOutStreamBuf outStream; -+ -+ outStream.funcTable.Write = MyWrite; -+ outStream.data = dest; -+ outStream.rem = *destLen; -+ outStream.overflow = False; -+ -+ p->writeEndMark = False; -+ p->finished = False; -+ p->result = SZ_OK; -+ -+ if (reInit) -+ LzmaEnc_Init(p); -+ LzmaEnc_InitPrices(p); -+ nowPos64 = p->nowPos64; -+ RangeEnc_Init(&p->rc); -+ p->rc.outStream = &outStream.funcTable; -+ -+ res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize); -+ -+ *unpackSize = (UInt32)(p->nowPos64 - nowPos64); -+ *destLen -= outStream.rem; -+ if (outStream.overflow) -+ return SZ_ERROR_OUTPUT_EOF; -+ -+ return res; -+} -+ -+static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) -+{ -+ SRes res = SZ_OK; -+ -+ #ifndef _7ZIP_ST -+ Byte allocaDummy[0x300]; -+ int i = 0; -+ for (i = 0; i < 16; i++) -+ allocaDummy[i] = (Byte)i; -+ #endif -+ -+ for (;;) -+ { -+ res = LzmaEnc_CodeOneBlock(p, False, 0, 0); -+ if (res != SZ_OK || p->finished != 0) -+ break; -+ if (progress != 0) -+ { -+ res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); -+ if (res != SZ_OK) -+ { -+ res = SZ_ERROR_PROGRESS; -+ break; -+ } -+ } -+ } -+ LzmaEnc_Finish(p); -+ return res; -+} -+ -+SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, -+ ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig)); -+ return LzmaEnc_Encode2((CLzmaEnc *)pp, progress); -+} -+ -+SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ int i; -+ UInt32 dictSize = p->dictSize; -+ if (*size < LZMA_PROPS_SIZE) -+ return SZ_ERROR_PARAM; -+ *size = LZMA_PROPS_SIZE; -+ props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); -+ -+ for (i = 11; i <= 30; i++) -+ { -+ if (dictSize <= ((UInt32)2 << i)) -+ { -+ dictSize = (2 << i); -+ break; -+ } -+ if (dictSize <= ((UInt32)3 << i)) -+ { -+ dictSize = (3 << i); -+ break; -+ } -+ } -+ -+ for (i = 0; i < 4; i++) -+ props[1 + i] = (Byte)(dictSize >> (8 * i)); -+ return SZ_OK; -+} -+ -+SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -+ int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ SRes res; -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ -+ CSeqOutStreamBuf outStream; -+ -+ LzmaEnc_SetInputBuf(p, src, srcLen); -+ -+ outStream.funcTable.Write = MyWrite; -+ outStream.data = dest; -+ outStream.rem = *destLen; -+ outStream.overflow = False; -+ -+ p->writeEndMark = writeEndMark; -+ -+ p->rc.outStream = &outStream.funcTable; -+ res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig); -+ if (res == SZ_OK) -+ res = LzmaEnc_Encode2(p, progress); -+ -+ *destLen -= outStream.rem; -+ if (outStream.overflow) -+ return SZ_ERROR_OUTPUT_EOF; -+ return res; -+} -+ -+SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -+ const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, -+ ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); -+ SRes res; -+ if (p == 0) -+ return SZ_ERROR_MEM; -+ -+ res = LzmaEnc_SetProps(p, props); -+ if (res == SZ_OK) -+ { -+ res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize); -+ if (res == SZ_OK) -+ res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen, -+ writeEndMark, progress, alloc, allocBig); -+ } -+ -+ LzmaEnc_Destroy(p, alloc, allocBig); -+ return res; -+} ---- /dev/null -+++ b/lib/lzma/Makefile -@@ -0,0 +1,7 @@ -+lzma_compress-objs := LzFind.o LzmaEnc.o -+lzma_decompress-objs := LzmaDec.o -+ -+obj-$(CONFIG_LZMA_COMPRESS) += lzma_compress.o -+obj-$(CONFIG_LZMA_DECOMPRESS) += lzma_decompress.o -+ -+EXTRA_CFLAGS += -Iinclude/linux -Iinclude/linux/lzma -include types.h diff --git a/target/linux/generic/pending-5.10/600-netfilter_conntrack_flush.patch b/target/linux/generic/pending-5.10/600-netfilter_conntrack_flush.patch deleted file mode 100644 index ab6953e557..0000000000 --- a/target/linux/generic/pending-5.10/600-netfilter_conntrack_flush.patch +++ /dev/null @@ -1,88 +0,0 @@ -From: Felix Fietkau -Subject: netfilter: add support for flushing conntrack via /proc - -lede-commit 8193bbe59a74d34d6a26d4a8cb857b1952905314 -Signed-off-by: Felix Fietkau ---- - net/netfilter/nf_conntrack_standalone.c | 59 ++++++++++++++++++++++++++++++++- - 1 file changed, 58 insertions(+), 1 deletion(-) - ---- a/net/netfilter/nf_conntrack_standalone.c -+++ b/net/netfilter/nf_conntrack_standalone.c -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - #include - #ifdef CONFIG_SYSCTL - #include -@@ -457,6 +458,56 @@ static int ct_cpu_seq_show(struct seq_fi - return 0; - } - -+struct kill_request { -+ u16 family; -+ union nf_inet_addr addr; -+}; -+ -+static int kill_matching(struct nf_conn *i, void *data) -+{ -+ struct kill_request *kr = data; -+ struct nf_conntrack_tuple *t1 = &i->tuplehash[IP_CT_DIR_ORIGINAL].tuple; -+ struct nf_conntrack_tuple *t2 = &i->tuplehash[IP_CT_DIR_REPLY].tuple; -+ -+ if (!kr->family) -+ return 1; -+ -+ if (t1->src.l3num != kr->family) -+ return 0; -+ -+ return (nf_inet_addr_cmp(&kr->addr, &t1->src.u3) || -+ nf_inet_addr_cmp(&kr->addr, &t1->dst.u3) || -+ nf_inet_addr_cmp(&kr->addr, &t2->src.u3) || -+ nf_inet_addr_cmp(&kr->addr, &t2->dst.u3)); -+} -+ -+static int ct_file_write(struct file *file, char *buf, size_t count) -+{ -+ struct seq_file *seq = file->private_data; -+ struct net *net = seq_file_net(seq); -+ struct kill_request kr = { }; -+ -+ if (count == 0) -+ return 0; -+ -+ if (count >= INET6_ADDRSTRLEN) -+ count = INET6_ADDRSTRLEN - 1; -+ -+ if (strnchr(buf, count, ':')) { -+ kr.family = AF_INET6; -+ if (!in6_pton(buf, count, (void *)&kr.addr, '\n', NULL)) -+ return -EINVAL; -+ } else if (strnchr(buf, count, '.')) { -+ kr.family = AF_INET; -+ if (!in4_pton(buf, count, (void *)&kr.addr, '\n', NULL)) -+ return -EINVAL; -+ } -+ -+ nf_ct_iterate_cleanup_net(net, kill_matching, &kr, 0, 0); -+ -+ return 0; -+} -+ - static const struct seq_operations ct_cpu_seq_ops = { - .start = ct_cpu_seq_start, - .next = ct_cpu_seq_next, -@@ -470,8 +521,9 @@ static int nf_conntrack_standalone_init_ - kuid_t root_uid; - kgid_t root_gid; - -- pde = proc_create_net("nf_conntrack", 0440, net->proc_net, &ct_seq_ops, -- sizeof(struct ct_iter_state)); -+ pde = proc_create_net_data_write("nf_conntrack", 0440, net->proc_net, -+ &ct_seq_ops, &ct_file_write, -+ sizeof(struct ct_iter_state), NULL); - if (!pde) - goto out_nf_conntrack; - diff --git a/target/linux/generic/pending-5.10/613-netfilter_optional_tcp_window_check.patch b/target/linux/generic/pending-5.10/613-netfilter_optional_tcp_window_check.patch deleted file mode 100644 index 79fd2762b3..0000000000 --- a/target/linux/generic/pending-5.10/613-netfilter_optional_tcp_window_check.patch +++ /dev/null @@ -1,73 +0,0 @@ -From: Felix Fietkau -Subject: netfilter: optional tcp window check - -Signed-off-by: Felix Fietkau ---- - net/netfilter/nf_conntrack_proto_tcp.c | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - ---- a/net/netfilter/nf_conntrack_proto_tcp.c -+++ b/net/netfilter/nf_conntrack_proto_tcp.c -@@ -31,6 +31,9 @@ - #include - #include - -+/* Do not check the TCP window for incoming packets */ -+static int nf_ct_tcp_no_window_check __read_mostly = 1; -+ - /* "Be conservative in what you do, - be liberal in what you accept from others." - If it's non-zero, we mark only out of window RST segments as INVALID. */ -@@ -476,6 +479,9 @@ static bool tcp_in_window(const struct n - s32 receiver_offset; - bool res, in_recv_win; - -+ if (nf_ct_tcp_no_window_check) -+ return true; -+ - /* - * Get the required data from the packet. - */ -@@ -1139,7 +1145,7 @@ int nf_conntrack_tcp_packet(struct nf_co - IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED && - timeouts[new_state] > timeouts[TCP_CONNTRACK_UNACK]) - timeout = timeouts[TCP_CONNTRACK_UNACK]; -- else if (ct->proto.tcp.last_win == 0 && -+ else if (!nf_ct_tcp_no_window_check && ct->proto.tcp.last_win == 0 && - timeouts[new_state] > timeouts[TCP_CONNTRACK_RETRANS]) - timeout = timeouts[TCP_CONNTRACK_RETRANS]; - else ---- a/net/netfilter/nf_conntrack_standalone.c -+++ b/net/netfilter/nf_conntrack_standalone.c -@@ -25,6 +25,9 @@ - #include - #include - -+/* Do not check the TCP window for incoming packets */ -+static int nf_ct_tcp_no_window_check __read_mostly = 1; -+ - static bool enable_hooks __read_mostly; - MODULE_PARM_DESC(enable_hooks, "Always enable conntrack hooks"); - module_param(enable_hooks, bool, 0000); -@@ -657,6 +660,7 @@ enum nf_ct_sysctl_index { - NF_SYSCTL_CT_PROTO_TIMEOUT_GRE_STREAM, - #endif - -+ NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK, - __NF_SYSCTL_CT_LAST_SYSCTL, - }; - -@@ -993,6 +997,13 @@ static struct ctl_table nf_ct_sysctl_tab - .proc_handler = proc_dointvec_jiffies, - }, - #endif -+ [NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK] = { -+ .procname = "nf_conntrack_tcp_no_window_check", -+ .data = &nf_ct_tcp_no_window_check, -+ .maxlen = sizeof(unsigned int), -+ .mode = 0644, -+ .proc_handler = proc_dointvec, -+ }, - {} - }; - diff --git a/target/linux/generic/pending-5.10/630-packet_socket_type.patch b/target/linux/generic/pending-5.10/630-packet_socket_type.patch deleted file mode 100644 index e9ecd8a8b2..0000000000 --- a/target/linux/generic/pending-5.10/630-packet_socket_type.patch +++ /dev/null @@ -1,138 +0,0 @@ -From: Felix Fietkau -Subject: net: add an optimization for dealing with raw sockets - -lede-commit: 4898039703d7315f0f3431c860123338ec3be0f6 -Signed-off-by: Felix Fietkau ---- - include/uapi/linux/if_packet.h | 3 +++ - net/packet/af_packet.c | 34 +++++++++++++++++++++++++++------- - net/packet/internal.h | 1 + - 3 files changed, 31 insertions(+), 7 deletions(-) - ---- a/include/uapi/linux/if_packet.h -+++ b/include/uapi/linux/if_packet.h -@@ -33,6 +33,8 @@ struct sockaddr_ll { - #define PACKET_KERNEL 7 /* To kernel space */ - /* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */ - #define PACKET_FASTROUTE 6 /* Fastrouted frame */ -+#define PACKET_MASK_ANY 0xffffffff /* mask for packet type bits */ -+ - - /* Packet socket options */ - -@@ -59,6 +61,7 @@ struct sockaddr_ll { - #define PACKET_ROLLOVER_STATS 21 - #define PACKET_FANOUT_DATA 22 - #define PACKET_IGNORE_OUTGOING 23 -+#define PACKET_RECV_TYPE 24 - - #define PACKET_FANOUT_HASH 0 - #define PACKET_FANOUT_LB 1 ---- a/net/packet/af_packet.c -+++ b/net/packet/af_packet.c -@@ -1822,6 +1822,7 @@ static int packet_rcv_spkt(struct sk_buf - { - struct sock *sk; - struct sockaddr_pkt *spkt; -+ struct packet_sock *po; - - /* - * When we registered the protocol we saved the socket in the data -@@ -1829,6 +1830,7 @@ static int packet_rcv_spkt(struct sk_buf - */ - - sk = pt->af_packet_priv; -+ po = pkt_sk(sk); - - /* - * Yank back the headers [hope the device set this -@@ -1841,7 +1843,7 @@ static int packet_rcv_spkt(struct sk_buf - * so that this procedure is noop. - */ - -- if (skb->pkt_type == PACKET_LOOPBACK) -+ if (!(po->pkt_type & (1 << skb->pkt_type))) - goto out; - - if (!net_eq(dev_net(dev), sock_net(sk))) -@@ -2089,12 +2091,12 @@ static int packet_rcv(struct sk_buff *sk - unsigned int snaplen, res; - bool is_drop_n_account = false; - -- if (skb->pkt_type == PACKET_LOOPBACK) -- goto drop; -- - sk = pt->af_packet_priv; - po = pkt_sk(sk); - -+ if (!(po->pkt_type & (1 << skb->pkt_type))) -+ goto drop; -+ - if (!net_eq(dev_net(dev), sock_net(sk))) - goto drop; - -@@ -2220,12 +2222,12 @@ static int tpacket_rcv(struct sk_buff *s - BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32); - BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48); - -- if (skb->pkt_type == PACKET_LOOPBACK) -- goto drop; -- - sk = pt->af_packet_priv; - po = pkt_sk(sk); - -+ if (!(po->pkt_type & (1 << skb->pkt_type))) -+ goto drop; -+ - if (!net_eq(dev_net(dev), sock_net(sk))) - goto drop; - -@@ -3339,6 +3341,7 @@ static int packet_create(struct net *net - mutex_init(&po->pg_vec_lock); - po->rollover = NULL; - po->prot_hook.func = packet_rcv; -+ po->pkt_type = PACKET_MASK_ANY & ~(1 << PACKET_LOOPBACK); - - if (sock->type == SOCK_PACKET) - po->prot_hook.func = packet_rcv_spkt; -@@ -3982,6 +3985,16 @@ packet_setsockopt(struct socket *sock, i - po->xmit = val ? packet_direct_xmit : dev_queue_xmit; - return 0; - } -+ case PACKET_RECV_TYPE: -+ { -+ unsigned int val; -+ if (optlen != sizeof(val)) -+ return -EINVAL; -+ if (copy_from_sockptr(&val, optval, sizeof(val))) -+ return -EFAULT; -+ po->pkt_type = val & ~BIT(PACKET_LOOPBACK); -+ return 0; -+ } - default: - return -ENOPROTOOPT; - } -@@ -4038,6 +4051,13 @@ static int packet_getsockopt(struct sock - case PACKET_VNET_HDR: - val = po->has_vnet_hdr; - break; -+ case PACKET_RECV_TYPE: -+ if (len > sizeof(unsigned int)) -+ len = sizeof(unsigned int); -+ val = po->pkt_type; -+ -+ data = &val; -+ break; - case PACKET_VERSION: - val = po->tp_version; - break; ---- a/net/packet/internal.h -+++ b/net/packet/internal.h -@@ -137,6 +137,7 @@ struct packet_sock { - int (*xmit)(struct sk_buff *skb); - struct packet_type prot_hook ____cacheline_aligned_in_smp; - atomic_t tp_drops ____cacheline_aligned_in_smp; -+ unsigned int pkt_type; - }; - - static struct packet_sock *pkt_sk(struct sock *sk) diff --git a/target/linux/generic/pending-5.10/655-increase_skb_pad.patch b/target/linux/generic/pending-5.10/655-increase_skb_pad.patch deleted file mode 100644 index d6f1ebe0b0..0000000000 --- a/target/linux/generic/pending-5.10/655-increase_skb_pad.patch +++ /dev/null @@ -1,20 +0,0 @@ -From: Felix Fietkau -Subject: kernel: add a few patches for avoiding unnecessary skb reallocations - significantly improves ethernet<->wireless performance - -lede-commit: 6f89cffc9add6939d44a6b54cf9a5e77849aa7fd -Signed-off-by: Felix Fietkau ---- - include/linux/skbuff.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -2692,7 +2692,7 @@ static inline int pskb_network_may_pull( - * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8) - */ - #ifndef NET_SKB_PAD --#define NET_SKB_PAD max(32, L1_CACHE_BYTES) -+#define NET_SKB_PAD max(64, L1_CACHE_BYTES) - #endif - - int ___pskb_trim(struct sk_buff *skb, unsigned int len); diff --git a/target/linux/generic/pending-5.10/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch b/target/linux/generic/pending-5.10/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch deleted file mode 100644 index 59f202c4c5..0000000000 --- a/target/linux/generic/pending-5.10/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch +++ /dev/null @@ -1,511 +0,0 @@ -From: Steven Barth -Subject: Add support for MAP-E FMRs (mesh mode) - -MAP-E FMRs (draft-ietf-softwire-map-10) are rules for IPv4-communication -between MAP CEs (mesh mode) without the need to forward such data to a -border relay. This is similar to how 6rd works but for IPv4 over IPv6. - -Signed-off-by: Steven Barth ---- - include/net/ip6_tunnel.h | 13 ++ - include/uapi/linux/if_tunnel.h | 13 ++ - net/ipv6/ip6_tunnel.c | 276 +++++++++++++++++++++++++++++++++++++++-- - 3 files changed, 291 insertions(+), 11 deletions(-) - ---- a/include/net/ip6_tunnel.h -+++ b/include/net/ip6_tunnel.h -@@ -18,6 +18,18 @@ - /* determine capability on a per-packet basis */ - #define IP6_TNL_F_CAP_PER_PACKET 0x40000 - -+/* IPv6 tunnel FMR */ -+struct __ip6_tnl_fmr { -+ struct __ip6_tnl_fmr *next; /* next fmr in list */ -+ struct in6_addr ip6_prefix; -+ struct in_addr ip4_prefix; -+ -+ __u8 ip6_prefix_len; -+ __u8 ip4_prefix_len; -+ __u8 ea_len; -+ __u8 offset; -+}; -+ - struct __ip6_tnl_parm { - char name[IFNAMSIZ]; /* name of tunnel device */ - int link; /* ifindex of underlying L2 interface */ -@@ -29,6 +41,7 @@ struct __ip6_tnl_parm { - __u32 flags; /* tunnel flags */ - struct in6_addr laddr; /* local tunnel end-point address */ - struct in6_addr raddr; /* remote tunnel end-point address */ -+ struct __ip6_tnl_fmr *fmrs; /* FMRs */ - - __be16 i_flags; - __be16 o_flags; ---- a/include/uapi/linux/if_tunnel.h -+++ b/include/uapi/linux/if_tunnel.h -@@ -77,10 +77,23 @@ enum { - IFLA_IPTUN_ENCAP_DPORT, - IFLA_IPTUN_COLLECT_METADATA, - IFLA_IPTUN_FWMARK, -+ IFLA_IPTUN_FMRS, - __IFLA_IPTUN_MAX, - }; - #define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1) - -+enum { -+ IFLA_IPTUN_FMR_UNSPEC, -+ IFLA_IPTUN_FMR_IP6_PREFIX, -+ IFLA_IPTUN_FMR_IP4_PREFIX, -+ IFLA_IPTUN_FMR_IP6_PREFIX_LEN, -+ IFLA_IPTUN_FMR_IP4_PREFIX_LEN, -+ IFLA_IPTUN_FMR_EA_LEN, -+ IFLA_IPTUN_FMR_OFFSET, -+ __IFLA_IPTUN_FMR_MAX, -+}; -+#define IFLA_IPTUN_FMR_MAX (__IFLA_IPTUN_FMR_MAX - 1) -+ - enum tunnel_encap_types { - TUNNEL_ENCAP_NONE, - TUNNEL_ENCAP_FOU, ---- a/net/ipv6/ip6_tunnel.c -+++ b/net/ipv6/ip6_tunnel.c -@@ -11,6 +11,9 @@ - * linux/net/ipv6/sit.c and linux/net/ipv4/ipip.c - * - * RFC 2473 -+ * -+ * Changes: -+ * Steven Barth : MAP-E FMR support - */ - - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -@@ -67,9 +70,9 @@ static bool log_ecn_error = true; - module_param(log_ecn_error, bool, 0644); - MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN"); - --static u32 HASH(const struct in6_addr *addr1, const struct in6_addr *addr2) -+static u32 HASH(const struct in6_addr *addr) - { -- u32 hash = ipv6_addr_hash(addr1) ^ ipv6_addr_hash(addr2); -+ u32 hash = ipv6_addr_hash(addr); - - return hash_32(hash, IP6_TUNNEL_HASH_SIZE_SHIFT); - } -@@ -144,17 +147,33 @@ static struct ip6_tnl * - ip6_tnl_lookup(struct net *net, int link, - const struct in6_addr *remote, const struct in6_addr *local) - { -- unsigned int hash = HASH(remote, local); -+ unsigned int hash = HASH(local); - struct ip6_tnl *t, *cand = NULL; - struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); - struct in6_addr any; - - for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) { - if (!ipv6_addr_equal(local, &t->parms.laddr) || -- !ipv6_addr_equal(remote, &t->parms.raddr) || - !(t->dev->flags & IFF_UP)) - continue; - -+ if (!ipv6_addr_equal(remote, &t->parms.raddr)) { -+ struct __ip6_tnl_fmr *fmr; -+ bool found = false; -+ -+ for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) { -+ if (!ipv6_prefix_equal(remote, &fmr->ip6_prefix, -+ fmr->ip6_prefix_len)) -+ continue; -+ -+ found = true; -+ break; -+ } -+ -+ if (!found) -+ continue; -+ } -+ - if (link == t->parms.link) - return t; - else -@@ -162,7 +181,7 @@ ip6_tnl_lookup(struct net *net, int link - } - - memset(&any, 0, sizeof(any)); -- hash = HASH(&any, local); -+ hash = HASH(local); - for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) { - if (!ipv6_addr_equal(local, &t->parms.laddr) || - !ipv6_addr_any(&t->parms.raddr) || -@@ -175,7 +194,7 @@ ip6_tnl_lookup(struct net *net, int link - cand = t; - } - -- hash = HASH(remote, &any); -+ hash = HASH(&any); - for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) { - if (!ipv6_addr_equal(remote, &t->parms.raddr) || - !ipv6_addr_any(&t->parms.laddr) || -@@ -223,7 +242,7 @@ ip6_tnl_bucket(struct ip6_tnl_net *ip6n, - - if (!ipv6_addr_any(remote) || !ipv6_addr_any(local)) { - prio = 1; -- h = HASH(remote, local); -+ h = HASH(local); - } - return &ip6n->tnls[prio][h]; - } -@@ -405,6 +424,12 @@ ip6_tnl_dev_uninit(struct net_device *de - struct net *net = t->net; - struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); - -+ while (t->parms.fmrs) { -+ struct __ip6_tnl_fmr *next = t->parms.fmrs->next; -+ kfree(t->parms.fmrs); -+ t->parms.fmrs = next; -+ } -+ - if (dev == ip6n->fb_tnl_dev) - RCU_INIT_POINTER(ip6n->tnls_wc[0], NULL); - else -@@ -821,6 +846,107 @@ int ip6_tnl_rcv_ctl(struct ip6_tnl *t, - } - EXPORT_SYMBOL_GPL(ip6_tnl_rcv_ctl); - -+/** -+ * ip4ip6_fmr_calc - calculate target / source IPv6-address based on FMR -+ * @dest: destination IPv6 address buffer -+ * @skb: received socket buffer -+ * @fmr: MAP FMR -+ * @xmit: Calculate for xmit or rcv -+ **/ -+static void ip4ip6_fmr_calc(struct in6_addr *dest, -+ const struct iphdr *iph, const uint8_t *end, -+ const struct __ip6_tnl_fmr *fmr, bool xmit) -+{ -+ int psidlen = fmr->ea_len - (32 - fmr->ip4_prefix_len); -+ u8 *portp = NULL; -+ bool use_dest_addr; -+ const struct iphdr *dsth = iph; -+ -+ if ((u8*)dsth >= end) -+ return; -+ -+ /* find significant IP header */ -+ if (iph->protocol == IPPROTO_ICMP) { -+ struct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4); -+ if (ih && ((u8*)&ih[1]) <= end && ( -+ ih->type == ICMP_DEST_UNREACH || -+ ih->type == ICMP_SOURCE_QUENCH || -+ ih->type == ICMP_TIME_EXCEEDED || -+ ih->type == ICMP_PARAMETERPROB || -+ ih->type == ICMP_REDIRECT)) -+ dsth = (const struct iphdr*)&ih[1]; -+ } -+ -+ /* in xmit-path use dest port by default and source port only if -+ this is an ICMP reply to something else; vice versa in rcv-path */ -+ use_dest_addr = (xmit && dsth == iph) || (!xmit && dsth != iph); -+ -+ /* get dst port */ -+ if (((u8*)&dsth[1]) <= end && ( -+ dsth->protocol == IPPROTO_UDP || -+ dsth->protocol == IPPROTO_TCP || -+ dsth->protocol == IPPROTO_SCTP || -+ dsth->protocol == IPPROTO_DCCP)) { -+ /* for UDP, TCP, SCTP and DCCP source and dest port -+ follow IPv4 header directly */ -+ portp = ((u8*)dsth) + dsth->ihl * 4; -+ -+ if (use_dest_addr) -+ portp += sizeof(u16); -+ } else if (iph->protocol == IPPROTO_ICMP) { -+ struct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4); -+ -+ /* use icmp identifier as port */ -+ if (((u8*)&ih) <= end && ( -+ (use_dest_addr && ( -+ ih->type == ICMP_ECHOREPLY || -+ ih->type == ICMP_TIMESTAMPREPLY || -+ ih->type == ICMP_INFO_REPLY || -+ ih->type == ICMP_ADDRESSREPLY)) || -+ (!use_dest_addr && ( -+ ih->type == ICMP_ECHO || -+ ih->type == ICMP_TIMESTAMP || -+ ih->type == ICMP_INFO_REQUEST || -+ ih->type == ICMP_ADDRESS) -+ ))) -+ portp = (u8*)&ih->un.echo.id; -+ } -+ -+ if ((portp && &portp[2] <= end) || psidlen == 0) { -+ int frombyte = fmr->ip6_prefix_len / 8; -+ int fromrem = fmr->ip6_prefix_len % 8; -+ int bytes = sizeof(struct in6_addr) - frombyte; -+ const u32 *addr = (use_dest_addr) ? &iph->daddr : &iph->saddr; -+ u64 eabits = ((u64)ntohl(*addr)) << (32 + fmr->ip4_prefix_len); -+ u64 t = 0; -+ -+ /* extract PSID from port and add it to eabits */ -+ u16 psidbits = 0; -+ if (psidlen > 0) { -+ psidbits = ((u16)portp[0]) << 8 | ((u16)portp[1]); -+ psidbits >>= 16 - psidlen - fmr->offset; -+ psidbits = (u16)(psidbits << (16 - psidlen)); -+ eabits |= ((u64)psidbits) << (48 - (fmr->ea_len - psidlen)); -+ } -+ -+ /* rewrite destination address */ -+ *dest = fmr->ip6_prefix; -+ memcpy(&dest->s6_addr[10], addr, sizeof(*addr)); -+ dest->s6_addr16[7] = htons(psidbits >> (16 - psidlen)); -+ -+ if (bytes > sizeof(u64)) -+ bytes = sizeof(u64); -+ -+ /* insert eabits */ -+ memcpy(&t, &dest->s6_addr[frombyte], bytes); -+ t = be64_to_cpu(t) & ~(((((u64)1) << fmr->ea_len) - 1) -+ << (64 - fmr->ea_len - fromrem)); -+ t = cpu_to_be64(t | (eabits >> fromrem)); -+ memcpy(&dest->s6_addr[frombyte], &t, bytes); -+ } -+} -+ -+ - static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb, - const struct tnl_ptk_info *tpi, - struct metadata_dst *tun_dst, -@@ -873,6 +999,27 @@ static int __ip6_tnl_rcv(struct ip6_tnl - skb_reset_network_header(skb); - memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); - -+ if (tpi->proto == htons(ETH_P_IP) && tunnel->parms.fmrs && -+ !ipv6_addr_equal(&ipv6h->saddr, &tunnel->parms.raddr)) { -+ /* Packet didn't come from BR, so lookup FMR */ -+ struct __ip6_tnl_fmr *fmr; -+ struct in6_addr expected = tunnel->parms.raddr; -+ for (fmr = tunnel->parms.fmrs; fmr; fmr = fmr->next) -+ if (ipv6_prefix_equal(&ipv6h->saddr, -+ &fmr->ip6_prefix, fmr->ip6_prefix_len)) -+ break; -+ -+ /* Check that IPv6 matches IPv4 source to prevent spoofing */ -+ if (fmr) -+ ip4ip6_fmr_calc(&expected, ip_hdr(skb), -+ skb_tail_pointer(skb), fmr, false); -+ -+ if (!ipv6_addr_equal(&ipv6h->saddr, &expected)) { -+ rcu_read_unlock(); -+ goto drop; -+ } -+ } -+ - __skb_tunnel_rx(skb, tunnel->dev, tunnel->net); - - err = dscp_ecn_decapsulate(tunnel, ipv6h, skb); -@@ -1024,6 +1171,7 @@ static void init_tel_txopt(struct ipv6_t - opt->ops.opt_nflen = 8; - } - -+ - /** - * ip6_tnl_addr_conflict - compare packet addresses to tunnel's own - * @t: the outgoing tunnel device -@@ -1304,6 +1452,7 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str - u8 protocol) - { - struct ip6_tnl *t = netdev_priv(dev); -+ struct __ip6_tnl_fmr *fmr; - struct ipv6hdr *ipv6h; - const struct iphdr *iph; - int encap_limit = -1; -@@ -1403,6 +1552,18 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str - fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL); - dsfield = INET_ECN_encapsulate(dsfield, orig_dsfield); - -+ /* try to find matching FMR */ -+ for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) { -+ unsigned mshift = 32 - fmr->ip4_prefix_len; -+ if (ntohl(fmr->ip4_prefix.s_addr) >> mshift == -+ ntohl(ip_hdr(skb)->daddr) >> mshift) -+ break; -+ } -+ -+ /* change dstaddr according to FMR */ -+ if (fmr) -+ ip4ip6_fmr_calc(&fl6.daddr, ip_hdr(skb), skb_tail_pointer(skb), fmr, true); -+ - if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) - return -1; - -@@ -1556,6 +1717,14 @@ ip6_tnl_change(struct ip6_tnl *t, const - t->parms.link = p->link; - t->parms.proto = p->proto; - t->parms.fwmark = p->fwmark; -+ -+ while (t->parms.fmrs) { -+ struct __ip6_tnl_fmr *next = t->parms.fmrs->next; -+ kfree(t->parms.fmrs); -+ t->parms.fmrs = next; -+ } -+ t->parms.fmrs = p->fmrs; -+ - dst_cache_reset(&t->dst_cache); - ip6_tnl_link_config(t); - return 0; -@@ -1594,6 +1763,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_ - p->flowinfo = u->flowinfo; - p->link = u->link; - p->proto = u->proto; -+ p->fmrs = NULL; - memcpy(p->name, u->name, sizeof(u->name)); - } - -@@ -1979,6 +2149,15 @@ static int ip6_tnl_validate(struct nlatt - return 0; - } - -+static const struct nla_policy ip6_tnl_fmr_policy[IFLA_IPTUN_FMR_MAX + 1] = { -+ [IFLA_IPTUN_FMR_IP6_PREFIX] = { .len = sizeof(struct in6_addr) }, -+ [IFLA_IPTUN_FMR_IP4_PREFIX] = { .len = sizeof(struct in_addr) }, -+ [IFLA_IPTUN_FMR_IP6_PREFIX_LEN] = { .type = NLA_U8 }, -+ [IFLA_IPTUN_FMR_IP4_PREFIX_LEN] = { .type = NLA_U8 }, -+ [IFLA_IPTUN_FMR_EA_LEN] = { .type = NLA_U8 }, -+ [IFLA_IPTUN_FMR_OFFSET] = { .type = NLA_U8 } -+}; -+ - static void ip6_tnl_netlink_parms(struct nlattr *data[], - struct __ip6_tnl_parm *parms) - { -@@ -2016,6 +2195,46 @@ static void ip6_tnl_netlink_parms(struct - - if (data[IFLA_IPTUN_FWMARK]) - parms->fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]); -+ -+ if (data[IFLA_IPTUN_FMRS]) { -+ unsigned rem; -+ struct nlattr *fmr; -+ nla_for_each_nested(fmr, data[IFLA_IPTUN_FMRS], rem) { -+ struct nlattr *fmrd[IFLA_IPTUN_FMR_MAX + 1], *c; -+ struct __ip6_tnl_fmr *nfmr; -+ -+ nla_parse_nested(fmrd, IFLA_IPTUN_FMR_MAX, -+ fmr, ip6_tnl_fmr_policy, NULL); -+ -+ if (!(nfmr = kzalloc(sizeof(*nfmr), GFP_KERNEL))) -+ continue; -+ -+ nfmr->offset = 6; -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX])) -+ nla_memcpy(&nfmr->ip6_prefix, fmrd[IFLA_IPTUN_FMR_IP6_PREFIX], -+ sizeof(nfmr->ip6_prefix)); -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX])) -+ nla_memcpy(&nfmr->ip4_prefix, fmrd[IFLA_IPTUN_FMR_IP4_PREFIX], -+ sizeof(nfmr->ip4_prefix)); -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX_LEN])) -+ nfmr->ip6_prefix_len = nla_get_u8(c); -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX_LEN])) -+ nfmr->ip4_prefix_len = nla_get_u8(c); -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_EA_LEN])) -+ nfmr->ea_len = nla_get_u8(c); -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_OFFSET])) -+ nfmr->offset = nla_get_u8(c); -+ -+ nfmr->next = parms->fmrs; -+ parms->fmrs = nfmr; -+ } -+ } - } - - static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[], -@@ -2131,6 +2350,12 @@ static void ip6_tnl_dellink(struct net_d - - static size_t ip6_tnl_get_size(const struct net_device *dev) - { -+ const struct ip6_tnl *t = netdev_priv(dev); -+ struct __ip6_tnl_fmr *c; -+ int fmrs = 0; -+ for (c = t->parms.fmrs; c; c = c->next) -+ ++fmrs; -+ - return - /* IFLA_IPTUN_LINK */ - nla_total_size(4) + -@@ -2160,6 +2385,24 @@ static size_t ip6_tnl_get_size(const str - nla_total_size(0) + - /* IFLA_IPTUN_FWMARK */ - nla_total_size(4) + -+ /* IFLA_IPTUN_FMRS */ -+ nla_total_size(0) + -+ ( -+ /* nest */ -+ nla_total_size(0) + -+ /* IFLA_IPTUN_FMR_IP6_PREFIX */ -+ nla_total_size(sizeof(struct in6_addr)) + -+ /* IFLA_IPTUN_FMR_IP4_PREFIX */ -+ nla_total_size(sizeof(struct in_addr)) + -+ /* IFLA_IPTUN_FMR_EA_LEN */ -+ nla_total_size(1) + -+ /* IFLA_IPTUN_FMR_IP6_PREFIX_LEN */ -+ nla_total_size(1) + -+ /* IFLA_IPTUN_FMR_IP4_PREFIX_LEN */ -+ nla_total_size(1) + -+ /* IFLA_IPTUN_FMR_OFFSET */ -+ nla_total_size(1) -+ ) * fmrs + - 0; - } - -@@ -2167,6 +2410,9 @@ static int ip6_tnl_fill_info(struct sk_b - { - struct ip6_tnl *tunnel = netdev_priv(dev); - struct __ip6_tnl_parm *parm = &tunnel->parms; -+ struct __ip6_tnl_fmr *c; -+ int fmrcnt = 0; -+ struct nlattr *fmrs; - - if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) || - nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) || -@@ -2176,9 +2422,27 @@ static int ip6_tnl_fill_info(struct sk_b - nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) || - nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) || - nla_put_u8(skb, IFLA_IPTUN_PROTO, parm->proto) || -- nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark)) -+ nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark) || -+ !(fmrs = nla_nest_start(skb, IFLA_IPTUN_FMRS))) - goto nla_put_failure; - -+ for (c = parm->fmrs; c; c = c->next) { -+ struct nlattr *fmr = nla_nest_start(skb, ++fmrcnt); -+ if (!fmr || -+ nla_put(skb, IFLA_IPTUN_FMR_IP6_PREFIX, -+ sizeof(c->ip6_prefix), &c->ip6_prefix) || -+ nla_put(skb, IFLA_IPTUN_FMR_IP4_PREFIX, -+ sizeof(c->ip4_prefix), &c->ip4_prefix) || -+ nla_put_u8(skb, IFLA_IPTUN_FMR_IP6_PREFIX_LEN, c->ip6_prefix_len) || -+ nla_put_u8(skb, IFLA_IPTUN_FMR_IP4_PREFIX_LEN, c->ip4_prefix_len) || -+ nla_put_u8(skb, IFLA_IPTUN_FMR_EA_LEN, c->ea_len) || -+ nla_put_u8(skb, IFLA_IPTUN_FMR_OFFSET, c->offset)) -+ goto nla_put_failure; -+ -+ nla_nest_end(skb, fmr); -+ } -+ nla_nest_end(skb, fmrs); -+ - if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, tunnel->encap.type) || - nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, tunnel->encap.sport) || - nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, tunnel->encap.dport) || -@@ -2218,6 +2482,7 @@ static const struct nla_policy ip6_tnl_p - [IFLA_IPTUN_ENCAP_DPORT] = { .type = NLA_U16 }, - [IFLA_IPTUN_COLLECT_METADATA] = { .type = NLA_FLAG }, - [IFLA_IPTUN_FWMARK] = { .type = NLA_U32 }, -+ [IFLA_IPTUN_FMRS] = { .type = NLA_NESTED }, - }; - - static struct rtnl_link_ops ip6_link_ops __read_mostly = { diff --git a/target/linux/generic/pending-5.10/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch b/target/linux/generic/pending-5.10/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch deleted file mode 100644 index ac1b327b9e..0000000000 --- a/target/linux/generic/pending-5.10/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch +++ /dev/null @@ -1,263 +0,0 @@ -From: Jonas Gorski -Subject: ipv6: allow rejecting with "source address failed policy" - -RFC6204 L-14 requires rejecting traffic from invalid addresses with -ICMPv6 Destination Unreachable, Code 5 (Source address failed ingress/ -egress policy) on the LAN side, so add an appropriate rule for that. - -Signed-off-by: Jonas Gorski ---- - include/net/netns/ipv6.h | 1 + - include/uapi/linux/fib_rules.h | 4 +++ - include/uapi/linux/rtnetlink.h | 1 + - net/ipv4/fib_semantics.c | 4 +++ - net/ipv4/fib_trie.c | 1 + - net/ipv4/ipmr.c | 1 + - net/ipv6/fib6_rules.c | 4 +++ - net/ipv6/ip6mr.c | 2 ++ - net/ipv6/route.c | 58 +++++++++++++++++++++++++++++++++++++++++- - 9 files changed, 75 insertions(+), 1 deletion(-) - ---- a/include/net/netns/ipv6.h -+++ b/include/net/netns/ipv6.h -@@ -88,6 +88,7 @@ struct netns_ipv6 { - unsigned int fib6_routes_require_src; - #endif - struct rt6_info *ip6_prohibit_entry; -+ struct rt6_info *ip6_policy_failed_entry; - struct rt6_info *ip6_blk_hole_entry; - struct fib6_table *fib6_local_tbl; - struct fib_rules_ops *fib6_rules_ops; ---- a/include/uapi/linux/fib_rules.h -+++ b/include/uapi/linux/fib_rules.h -@@ -82,6 +82,10 @@ enum { - FR_ACT_BLACKHOLE, /* Drop without notification */ - FR_ACT_UNREACHABLE, /* Drop with ENETUNREACH */ - FR_ACT_PROHIBIT, /* Drop with EACCES */ -+ FR_ACT_RES9, -+ FR_ACT_RES10, -+ FR_ACT_RES11, -+ FR_ACT_POLICY_FAILED, /* Drop with EACCES */ - __FR_ACT_MAX, - }; - ---- a/include/uapi/linux/rtnetlink.h -+++ b/include/uapi/linux/rtnetlink.h -@@ -249,6 +249,7 @@ enum { - RTN_THROW, /* Not in this table */ - RTN_NAT, /* Translate this address */ - RTN_XRESOLVE, /* Use external resolver */ -+ RTN_POLICY_FAILED, /* Failed ingress/egress policy */ - __RTN_MAX - }; - ---- a/net/ipv4/fib_semantics.c -+++ b/net/ipv4/fib_semantics.c -@@ -143,6 +143,10 @@ const struct fib_prop fib_props[RTN_MAX - .error = -EINVAL, - .scope = RT_SCOPE_NOWHERE, - }, -+ [RTN_POLICY_FAILED] = { -+ .error = -EACCES, -+ .scope = RT_SCOPE_UNIVERSE, -+ }, - }; - - static void rt_fibinfo_free(struct rtable __rcu **rtp) ---- a/net/ipv4/fib_trie.c -+++ b/net/ipv4/fib_trie.c -@@ -2736,6 +2736,7 @@ static const char *const rtn_type_names[ - [RTN_THROW] = "THROW", - [RTN_NAT] = "NAT", - [RTN_XRESOLVE] = "XRESOLVE", -+ [RTN_POLICY_FAILED] = "POLICY_FAILED", - }; - - static inline const char *rtn_type(char *buf, size_t len, unsigned int t) ---- a/net/ipv4/ipmr.c -+++ b/net/ipv4/ipmr.c -@@ -175,6 +175,7 @@ static int ipmr_rule_action(struct fib_r - case FR_ACT_UNREACHABLE: - return -ENETUNREACH; - case FR_ACT_PROHIBIT: -+ case FR_ACT_POLICY_FAILED: - return -EACCES; - case FR_ACT_BLACKHOLE: - default: ---- a/net/ipv6/fib6_rules.c -+++ b/net/ipv6/fib6_rules.c -@@ -220,6 +220,10 @@ static int __fib6_rule_action(struct fib - err = -EACCES; - rt = net->ipv6.ip6_prohibit_entry; - goto discard_pkt; -+ case FR_ACT_POLICY_FAILED: -+ err = -EACCES; -+ rt = net->ipv6.ip6_policy_failed_entry; -+ goto discard_pkt; - } - - tb_id = fib_rule_get_table(rule, arg); ---- a/net/ipv6/ip6mr.c -+++ b/net/ipv6/ip6mr.c -@@ -163,6 +163,8 @@ static int ip6mr_rule_action(struct fib_ - return -ENETUNREACH; - case FR_ACT_PROHIBIT: - return -EACCES; -+ case FR_ACT_POLICY_FAILED: -+ return -EACCES; - case FR_ACT_BLACKHOLE: - default: - return -EINVAL; ---- a/net/ipv6/route.c -+++ b/net/ipv6/route.c -@@ -95,6 +95,8 @@ static int ip6_pkt_discard(struct sk_bu - static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb); - static int ip6_pkt_prohibit(struct sk_buff *skb); - static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb); -+static int ip6_pkt_policy_failed(struct sk_buff *skb); -+static int ip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb); - static void ip6_link_failure(struct sk_buff *skb); - static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, - struct sk_buff *skb, u32 mtu, -@@ -310,6 +312,18 @@ static const struct rt6_info ip6_prohibi - .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), - }; - -+static const struct rt6_info ip6_policy_failed_entry_template = { -+ .dst = { -+ .__refcnt = ATOMIC_INIT(1), -+ .__use = 1, -+ .obsolete = DST_OBSOLETE_FORCE_CHK, -+ .error = -EACCES, -+ .input = ip6_pkt_policy_failed, -+ .output = ip6_pkt_policy_failed_out, -+ }, -+ .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), -+}; -+ - static const struct rt6_info ip6_blk_hole_entry_template = { - .dst = { - .__refcnt = ATOMIC_INIT(1), -@@ -1031,6 +1045,7 @@ static const int fib6_prop[RTN_MAX + 1] - [RTN_BLACKHOLE] = -EINVAL, - [RTN_UNREACHABLE] = -EHOSTUNREACH, - [RTN_PROHIBIT] = -EACCES, -+ [RTN_POLICY_FAILED] = -EACCES, - [RTN_THROW] = -EAGAIN, - [RTN_NAT] = -EINVAL, - [RTN_XRESOLVE] = -EINVAL, -@@ -1066,6 +1081,10 @@ static void ip6_rt_init_dst_reject(struc - rt->dst.output = ip6_pkt_prohibit_out; - rt->dst.input = ip6_pkt_prohibit; - break; -+ case RTN_POLICY_FAILED: -+ rt->dst.output = ip6_pkt_policy_failed_out; -+ rt->dst.input = ip6_pkt_policy_failed; -+ break; - case RTN_THROW: - case RTN_UNREACHABLE: - default: -@@ -4449,6 +4468,17 @@ static int ip6_pkt_prohibit_out(struct n - return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES); - } - -+static int ip6_pkt_policy_failed(struct sk_buff *skb) -+{ -+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_INNOROUTES); -+} -+ -+static int ip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb) -+{ -+ skb->dev = skb_dst(skb)->dev; -+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_OUTNOROUTES); -+} -+ - /* - * Allocate a dst for local (unicast / anycast) address. - */ -@@ -4936,7 +4966,8 @@ static int rtm_to_fib6_config(struct sk_ - if (rtm->rtm_type == RTN_UNREACHABLE || - rtm->rtm_type == RTN_BLACKHOLE || - rtm->rtm_type == RTN_PROHIBIT || -- rtm->rtm_type == RTN_THROW) -+ rtm->rtm_type == RTN_THROW || -+ rtm->rtm_type == RTN_POLICY_FAILED) - cfg->fc_flags |= RTF_REJECT; - - if (rtm->rtm_type == RTN_LOCAL) -@@ -6136,6 +6167,8 @@ static int ip6_route_dev_notify(struct n - #ifdef CONFIG_IPV6_MULTIPLE_TABLES - net->ipv6.ip6_prohibit_entry->dst.dev = dev; - net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev); -+ net->ipv6.ip6_policy_failed_entry->dst.dev = dev; -+ net->ipv6.ip6_policy_failed_entry->rt6i_idev = in6_dev_get(dev); - net->ipv6.ip6_blk_hole_entry->dst.dev = dev; - net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev); - #endif -@@ -6147,6 +6180,7 @@ static int ip6_route_dev_notify(struct n - in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev); - #ifdef CONFIG_IPV6_MULTIPLE_TABLES - in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev); -+ in6_dev_put_clear(&net->ipv6.ip6_policy_failed_entry->rt6i_idev); - in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev); - #endif - } -@@ -6338,6 +6372,8 @@ static int __net_init ip6_route_net_init - - #ifdef CONFIG_IPV6_MULTIPLE_TABLES - net->ipv6.fib6_has_custom_rules = false; -+ -+ - net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template, - sizeof(*net->ipv6.ip6_prohibit_entry), - GFP_KERNEL); -@@ -6348,11 +6384,21 @@ static int __net_init ip6_route_net_init - ip6_template_metrics, true); - INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->rt6i_uncached); - -+ net->ipv6.ip6_policy_failed_entry = -+ kmemdup(&ip6_policy_failed_entry_template, -+ sizeof(*net->ipv6.ip6_policy_failed_entry), GFP_KERNEL); -+ if (!net->ipv6.ip6_policy_failed_entry) -+ goto out_ip6_prohibit_entry; -+ net->ipv6.ip6_policy_failed_entry->dst.ops = &net->ipv6.ip6_dst_ops; -+ dst_init_metrics(&net->ipv6.ip6_policy_failed_entry->dst, -+ ip6_template_metrics, true); -+ INIT_LIST_HEAD(&net->ipv6.ip6_policy_failed_entry->rt6i_uncached); -+ - net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template, - sizeof(*net->ipv6.ip6_blk_hole_entry), - GFP_KERNEL); - if (!net->ipv6.ip6_blk_hole_entry) -- goto out_ip6_prohibit_entry; -+ goto out_ip6_policy_failed_entry; - net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops; - dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst, - ip6_template_metrics, true); -@@ -6379,6 +6425,8 @@ out: - return ret; - - #ifdef CONFIG_IPV6_MULTIPLE_TABLES -+out_ip6_policy_failed_entry: -+ kfree(net->ipv6.ip6_policy_failed_entry); - out_ip6_prohibit_entry: - kfree(net->ipv6.ip6_prohibit_entry); - out_ip6_null_entry: -@@ -6398,6 +6446,7 @@ static void __net_exit ip6_route_net_exi - kfree(net->ipv6.ip6_null_entry); - #ifdef CONFIG_IPV6_MULTIPLE_TABLES - kfree(net->ipv6.ip6_prohibit_entry); -+ kfree(net->ipv6.ip6_policy_failed_entry); - kfree(net->ipv6.ip6_blk_hole_entry); - #endif - dst_entries_destroy(&net->ipv6.ip6_dst_ops); -@@ -6481,6 +6530,9 @@ void __init ip6_route_init_special_entri - init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); - init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev; - init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); -+ init_net.ipv6.ip6_policy_failed_entry->dst.dev = init_net.loopback_dev; -+ init_net.ipv6.ip6_policy_failed_entry->rt6i_idev = -+ in6_dev_get(init_net.loopback_dev); - #endif - } - diff --git a/target/linux/generic/pending-5.10/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch b/target/linux/generic/pending-5.10/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch deleted file mode 100644 index 0e7f35db89..0000000000 --- a/target/linux/generic/pending-5.10/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch +++ /dev/null @@ -1,50 +0,0 @@ -From: Jonas Gorski -Subject: net: provide defines for _POLICY_FAILED until all code is updated - -Upstream introduced ICMPV6_POLICY_FAIL for code 5 of destination -unreachable, conflicting with our name. - -Add appropriate defines to allow our code to build with the new -name until we have updated our local patches for older kernels -and userspace packages. - -Signed-off-by: Jonas Gorski ---- - include/uapi/linux/fib_rules.h | 2 ++ - include/uapi/linux/icmpv6.h | 2 ++ - include/uapi/linux/rtnetlink.h | 2 ++ - 3 files changed, 6 insertions(+) - ---- a/include/uapi/linux/fib_rules.h -+++ b/include/uapi/linux/fib_rules.h -@@ -89,6 +89,8 @@ enum { - __FR_ACT_MAX, - }; - -+#define FR_ACT_FAILED_POLICY FR_ACT_POLICY_FAILED -+ - #define FR_ACT_MAX (__FR_ACT_MAX - 1) - - #endif ---- a/include/uapi/linux/icmpv6.h -+++ b/include/uapi/linux/icmpv6.h -@@ -126,6 +126,8 @@ struct icmp6hdr { - #define ICMPV6_POLICY_FAIL 5 - #define ICMPV6_REJECT_ROUTE 6 - -+#define ICMPV6_FAILED_POLICY ICMPV6_POLICY_FAIL -+ - /* - * Codes for Time Exceeded - */ ---- a/include/uapi/linux/rtnetlink.h -+++ b/include/uapi/linux/rtnetlink.h -@@ -253,6 +253,8 @@ enum { - __RTN_MAX - }; - -+#define RTN_FAILED_POLICY RTN_POLICY_FAILED -+ - #define RTN_MAX (__RTN_MAX - 1) - - diff --git a/target/linux/generic/pending-5.10/680-NET-skip-GRO-for-foreign-MAC-addresses.patch b/target/linux/generic/pending-5.10/680-NET-skip-GRO-for-foreign-MAC-addresses.patch deleted file mode 100644 index 3a9b630341..0000000000 --- a/target/linux/generic/pending-5.10/680-NET-skip-GRO-for-foreign-MAC-addresses.patch +++ /dev/null @@ -1,149 +0,0 @@ -From: Felix Fietkau -Subject: net: replace GRO optimization patch with a new one that supports VLANs/bridges with different MAC addresses - -Signed-off-by: Felix Fietkau ---- - include/linux/netdevice.h | 2 ++ - include/linux/skbuff.h | 3 ++- - net/core/dev.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++ - net/ethernet/eth.c | 18 +++++++++++++++++- - 4 files changed, 69 insertions(+), 2 deletions(-) - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -2059,6 +2059,8 @@ struct net_device { - struct netdev_hw_addr_list mc; - struct netdev_hw_addr_list dev_addrs; - -+ unsigned char local_addr_mask[MAX_ADDR_LEN]; -+ - #ifdef CONFIG_SYSFS - struct kset *queues_kset; - #endif ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -862,6 +862,7 @@ struct sk_buff { - __u8 decrypted:1; - #endif - __u8 scm_io_uring:1; -+ __u8 gro_skip:1; - - #ifdef CONFIG_NET_SCHED - __u16 tc_index; /* traffic control index */ ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -6069,6 +6069,9 @@ static enum gro_result dev_gro_receive(s - int same_flow; - int grow; - -+ if (skb->gro_skip) -+ goto normal; -+ - if (netif_elide_gro(skb->dev)) - goto normal; - -@@ -8047,6 +8050,48 @@ static void __netdev_adjacent_dev_unlink - &upper_dev->adj_list.lower); - } - -+static void __netdev_addr_mask(unsigned char *mask, const unsigned char *addr, -+ struct net_device *dev) -+{ -+ int i; -+ -+ for (i = 0; i < dev->addr_len; i++) -+ mask[i] |= addr[i] ^ dev->dev_addr[i]; -+} -+ -+static void __netdev_upper_mask(unsigned char *mask, struct net_device *dev, -+ struct net_device *lower) -+{ -+ struct net_device *cur; -+ struct list_head *iter; -+ -+ netdev_for_each_upper_dev_rcu(dev, cur, iter) { -+ __netdev_addr_mask(mask, cur->dev_addr, lower); -+ __netdev_upper_mask(mask, cur, lower); -+ } -+} -+ -+static void __netdev_update_addr_mask(struct net_device *dev) -+{ -+ unsigned char mask[MAX_ADDR_LEN]; -+ struct net_device *cur; -+ struct list_head *iter; -+ -+ memset(mask, 0, sizeof(mask)); -+ __netdev_upper_mask(mask, dev, dev); -+ memcpy(dev->local_addr_mask, mask, dev->addr_len); -+ -+ netdev_for_each_lower_dev(dev, cur, iter) -+ __netdev_update_addr_mask(cur); -+} -+ -+static void netdev_update_addr_mask(struct net_device *dev) -+{ -+ rcu_read_lock(); -+ __netdev_update_addr_mask(dev); -+ rcu_read_unlock(); -+} -+ - static int __netdev_upper_dev_link(struct net_device *dev, - struct net_device *upper_dev, bool master, - void *upper_priv, void *upper_info, -@@ -8098,6 +8143,7 @@ static int __netdev_upper_dev_link(struc - if (ret) - return ret; - -+ netdev_update_addr_mask(dev); - ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, - &changeupper_info.info); - ret = notifier_to_errno(ret); -@@ -8194,6 +8240,7 @@ static void __netdev_upper_dev_unlink(st - - __netdev_adjacent_dev_unlink_neighbour(dev, upper_dev); - -+ netdev_update_addr_mask(dev); - call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, - &changeupper_info.info); - -@@ -8980,6 +9027,7 @@ int dev_set_mac_address(struct net_devic - if (err) - return err; - dev->addr_assign_type = NET_ADDR_SET; -+ netdev_update_addr_mask(dev); - call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); - add_device_randomness(dev->dev_addr, dev->addr_len); - return 0; ---- a/net/ethernet/eth.c -+++ b/net/ethernet/eth.c -@@ -143,6 +143,18 @@ u32 eth_get_headlen(const struct net_dev - } - EXPORT_SYMBOL(eth_get_headlen); - -+static inline bool -+eth_check_local_mask(const void *addr1, const void *addr2, const void *mask) -+{ -+ const u16 *a1 = addr1; -+ const u16 *a2 = addr2; -+ const u16 *m = mask; -+ -+ return (((a1[0] ^ a2[0]) & ~m[0]) | -+ ((a1[1] ^ a2[1]) & ~m[1]) | -+ ((a1[2] ^ a2[2]) & ~m[2])); -+} -+ - /** - * eth_type_trans - determine the packet's protocol ID. - * @skb: received socket data -@@ -174,6 +186,10 @@ __be16 eth_type_trans(struct sk_buff *sk - } else { - skb->pkt_type = PACKET_OTHERHOST; - } -+ -+ if (eth_check_local_mask(eth->h_dest, dev->dev_addr, -+ dev->local_addr_mask)) -+ skb->gro_skip = 1; - } - - /* diff --git a/target/linux/generic/pending-5.10/682-of_net-add-mac-address-increment-support.patch b/target/linux/generic/pending-5.10/682-of_net-add-mac-address-increment-support.patch deleted file mode 100644 index 82e81f37c5..0000000000 --- a/target/linux/generic/pending-5.10/682-of_net-add-mac-address-increment-support.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 844c273286f328acf0dab5fbd5d864366b4904dc Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Tue, 30 Mar 2021 18:21:14 +0200 -Subject: [PATCH] of_net: add mac-address-increment support - -Lots of embedded devices use the mac-address of other interface -extracted from nvmem cells and increments it by one or two. Add two -bindings to integrate this and directly use the right mac-address for -the interface. Some example are some routers that use the gmac -mac-address stored in the art partition and increments it by one for the -wifi. mac-address-increment-byte bindings is used to tell what byte of -the mac-address has to be increased (if not defined the last byte is -increased) and mac-address-increment tells how much the byte decided -early has to be increased. - -Signed-off-by: Ansuel Smith ---- - drivers/of/of_net.c | 43 +++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 39 insertions(+), 4 deletions(-) - ---- a/drivers/of/of_net.c -+++ b/drivers/of/of_net.c -@@ -115,27 +115,62 @@ static int of_get_mac_addr_nvmem(struct - * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists - * but is all zeros. - * -+ * DT can tell the system to increment the mac-address after is extracted by -+ * using: -+ * - mac-address-increment-byte to decide what byte to increase -+ * (if not defined is increased the last byte) -+ * - mac-address-increment to decide how much to increase. The value WILL -+ * overflow to other bytes if the increment is over 255 or the total -+ * increment will exceed 255 of the current byte. -+ * (example 00:01:02:03:04:ff + 1 == 00:01:02:03:05:00) -+ * (example 00:01:02:03:04:fe + 5 == 00:01:02:03:05:03) -+ * - * Return: 0 on success and errno in case of error. - */ - int of_get_mac_address(struct device_node *np, u8 *addr) - { -+ u32 inc_idx, mac_inc, mac_val; - int ret; - -+ /* Check first if the increment byte is present and valid. -+ * If not set assume to increment the last byte if found. -+ */ -+ if (of_property_read_u32(np, "mac-address-increment-byte", &inc_idx)) -+ inc_idx = 5; -+ if (inc_idx < 3 || inc_idx > 5) -+ return -EINVAL; -+ - if (!np) - return -ENODEV; - - ret = of_get_mac_addr(np, "mac-address", addr); - if (!ret) -- return 0; -+ goto found; - - ret = of_get_mac_addr(np, "local-mac-address", addr); - if (!ret) -- return 0; -+ goto found; - - ret = of_get_mac_addr(np, "address", addr); - if (!ret) -- return 0; -+ goto found; -+ -+ ret = of_get_mac_addr_nvmem(np, addr); -+ if (ret) -+ return ret; -+ -+found: -+ if (!of_property_read_u32(np, "mac-address-increment", &mac_inc)) { -+ /* Convert to a contiguous value */ -+ mac_val = (addr[3] << 16) + (addr[4] << 8) + addr[5]; -+ mac_val += mac_inc << 8 * (5-inc_idx); -+ -+ /* Apply the incremented value handling overflow case */ -+ addr[3] = (mac_val >> 16) & 0xff; -+ addr[4] = (mac_val >> 8) & 0xff; -+ addr[5] = (mac_val >> 0) & 0xff; -+ } - -- return of_get_mac_addr_nvmem(np, addr); -+ return ret; - } - EXPORT_SYMBOL(of_get_mac_address); diff --git a/target/linux/generic/pending-5.10/683-of_net-add-mac-address-to-of-tree.patch b/target/linux/generic/pending-5.10/683-of_net-add-mac-address-to-of-tree.patch deleted file mode 100644 index 03cd763d9d..0000000000 --- a/target/linux/generic/pending-5.10/683-of_net-add-mac-address-to-of-tree.patch +++ /dev/null @@ -1,38 +0,0 @@ ---- a/drivers/of/of_net.c -+++ b/drivers/of/of_net.c -@@ -95,6 +95,27 @@ static int of_get_mac_addr_nvmem(struct - return 0; - } - -+static int of_add_mac_address(struct device_node *np, u8* addr) -+{ -+ struct property *prop; -+ -+ prop = kzalloc(sizeof(*prop), GFP_KERNEL); -+ if (!prop) -+ return -ENOMEM; -+ -+ prop->name = "mac-address"; -+ prop->length = ETH_ALEN; -+ prop->value = kmemdup(addr, ETH_ALEN, GFP_KERNEL); -+ if (!prop->value || of_update_property(np, prop)) -+ goto free; -+ -+ return 0; -+free: -+ kfree(prop->value); -+ kfree(prop); -+ return -ENOMEM; -+} -+ - /** - * Search the device tree for the best MAC address to use. 'mac-address' is - * checked first, because that is supposed to contain to "most recent" MAC -@@ -171,6 +192,7 @@ found: - addr[5] = (mac_val >> 0) & 0xff; - } - -+ of_add_mac_address(np, addr); - return ret; - } - EXPORT_SYMBOL(of_get_mac_address); diff --git a/target/linux/generic/pending-5.10/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch b/target/linux/generic/pending-5.10/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch deleted file mode 100644 index ff090f07f1..0000000000 --- a/target/linux/generic/pending-5.10/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch +++ /dev/null @@ -1,26 +0,0 @@ -From: Felix Fietkau -Date: Thu, 8 Jul 2021 07:08:29 +0200 -Subject: [PATCH] net: ethernet: mtk_eth_soc: avoid creating duplicate offload - entries - -Sometimes multiple CLS_REPLACE calls are issued for the same connection. -rhashtable_insert_fast does not check for these duplicates, so multiple -hardware flow entries can be created. -Fix this by checking for an existing entry early - -Fixes: 502e84e2382d ("net: ethernet: mtk_eth_soc: add flow offloading support") -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -187,6 +187,9 @@ mtk_flow_offload_replace(struct mtk_eth - int hash; - int i; - -+ if (rhashtable_lookup(ð->flow_table, &f->cookie, mtk_flow_ht_params)) -+ return -EEXIST; -+ - if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_META)) { - struct flow_match_meta match; - diff --git a/target/linux/generic/pending-5.10/701-00-net-ethernet-mtk_eth_soc-add-support-for-coherent-DM.patch b/target/linux/generic/pending-5.10/701-00-net-ethernet-mtk_eth_soc-add-support-for-coherent-DM.patch deleted file mode 100644 index c7bb6c5e10..0000000000 --- a/target/linux/generic/pending-5.10/701-00-net-ethernet-mtk_eth_soc-add-support-for-coherent-DM.patch +++ /dev/null @@ -1,327 +0,0 @@ -From: Felix Fietkau -Date: Sat, 5 Feb 2022 17:59:07 +0100 -Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for coherent - DMA - -It improves performance by eliminating the need for a cache flush on rx and tx -In preparation for supporting WED (Wireless Ethernet Dispatch), also add a -function for disabling coherent DMA at runtime. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -833,7 +834,7 @@ static int mtk_init_fq_dma(struct mtk_et - dma_addr_t dma_addr; - int i; - -- eth->scratch_ring = dma_alloc_coherent(eth->dev, -+ eth->scratch_ring = dma_alloc_coherent(eth->dma_dev, - cnt * sizeof(struct mtk_tx_dma), - ð->phy_scratch_ring, - GFP_ATOMIC); -@@ -845,10 +846,10 @@ static int mtk_init_fq_dma(struct mtk_et - if (unlikely(!eth->scratch_head)) - return -ENOMEM; - -- dma_addr = dma_map_single(eth->dev, -+ dma_addr = dma_map_single(eth->dma_dev, - eth->scratch_head, cnt * MTK_QDMA_PAGE_SIZE, - DMA_FROM_DEVICE); -- if (unlikely(dma_mapping_error(eth->dev, dma_addr))) -+ if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) - return -ENOMEM; - - phy_ring_tail = eth->phy_scratch_ring + -@@ -902,26 +903,26 @@ static void mtk_tx_unmap(struct mtk_eth - { - if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { - if (tx_buf->flags & MTK_TX_FLAGS_SINGLE0) { -- dma_unmap_single(eth->dev, -+ dma_unmap_single(eth->dma_dev, - dma_unmap_addr(tx_buf, dma_addr0), - dma_unmap_len(tx_buf, dma_len0), - DMA_TO_DEVICE); - } else if (tx_buf->flags & MTK_TX_FLAGS_PAGE0) { -- dma_unmap_page(eth->dev, -+ dma_unmap_page(eth->dma_dev, - dma_unmap_addr(tx_buf, dma_addr0), - dma_unmap_len(tx_buf, dma_len0), - DMA_TO_DEVICE); - } - } else { - if (dma_unmap_len(tx_buf, dma_len0)) { -- dma_unmap_page(eth->dev, -+ dma_unmap_page(eth->dma_dev, - dma_unmap_addr(tx_buf, dma_addr0), - dma_unmap_len(tx_buf, dma_len0), - DMA_TO_DEVICE); - } - - if (dma_unmap_len(tx_buf, dma_len1)) { -- dma_unmap_page(eth->dev, -+ dma_unmap_page(eth->dma_dev, - dma_unmap_addr(tx_buf, dma_addr1), - dma_unmap_len(tx_buf, dma_len1), - DMA_TO_DEVICE); -@@ -999,9 +1000,9 @@ static int mtk_tx_map(struct sk_buff *sk - if (skb_vlan_tag_present(skb)) - txd4 |= TX_DMA_INS_VLAN | skb_vlan_tag_get(skb); - -- mapped_addr = dma_map_single(eth->dev, skb->data, -+ mapped_addr = dma_map_single(eth->dma_dev, skb->data, - skb_headlen(skb), DMA_TO_DEVICE); -- if (unlikely(dma_mapping_error(eth->dev, mapped_addr))) -+ if (unlikely(dma_mapping_error(eth->dma_dev, mapped_addr))) - return -ENOMEM; - - WRITE_ONCE(itxd->txd1, mapped_addr); -@@ -1040,10 +1041,10 @@ static int mtk_tx_map(struct sk_buff *sk - - - frag_map_size = min(frag_size, MTK_TX_DMA_BUF_LEN); -- mapped_addr = skb_frag_dma_map(eth->dev, frag, offset, -+ mapped_addr = skb_frag_dma_map(eth->dma_dev, frag, offset, - frag_map_size, - DMA_TO_DEVICE); -- if (unlikely(dma_mapping_error(eth->dev, mapped_addr))) -+ if (unlikely(dma_mapping_error(eth->dma_dev, mapped_addr))) - goto err_dma; - - if (i == nr_frags - 1 && -@@ -1324,18 +1325,18 @@ static int mtk_poll_rx(struct napi_struc - netdev->stats.rx_dropped++; - goto release_desc; - } -- dma_addr = dma_map_single(eth->dev, -+ dma_addr = dma_map_single(eth->dma_dev, - new_data + NET_SKB_PAD + - eth->ip_align, - ring->buf_size, - DMA_FROM_DEVICE); -- if (unlikely(dma_mapping_error(eth->dev, dma_addr))) { -+ if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) { - skb_free_frag(new_data); - netdev->stats.rx_dropped++; - goto release_desc; - } - -- dma_unmap_single(eth->dev, trxd.rxd1, -+ dma_unmap_single(eth->dma_dev, trxd.rxd1, - ring->buf_size, DMA_FROM_DEVICE); - - /* receive data */ -@@ -1608,7 +1609,7 @@ static int mtk_tx_alloc(struct mtk_eth * - if (!ring->buf) - goto no_tx_mem; - -- ring->dma = dma_alloc_coherent(eth->dev, MTK_DMA_SIZE * sz, -+ ring->dma = dma_alloc_coherent(eth->dma_dev, MTK_DMA_SIZE * sz, - &ring->phys, GFP_ATOMIC); - if (!ring->dma) - goto no_tx_mem; -@@ -1626,7 +1627,7 @@ static int mtk_tx_alloc(struct mtk_eth * - * descriptors in ring->dma_pdma. - */ - if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { -- ring->dma_pdma = dma_alloc_coherent(eth->dev, MTK_DMA_SIZE * sz, -+ ring->dma_pdma = dma_alloc_coherent(eth->dma_dev, MTK_DMA_SIZE * sz, - &ring->phys_pdma, - GFP_ATOMIC); - if (!ring->dma_pdma) -@@ -1685,7 +1686,7 @@ static void mtk_tx_clean(struct mtk_eth - } - - if (ring->dma) { -- dma_free_coherent(eth->dev, -+ dma_free_coherent(eth->dma_dev, - MTK_DMA_SIZE * sizeof(*ring->dma), - ring->dma, - ring->phys); -@@ -1693,7 +1694,7 @@ static void mtk_tx_clean(struct mtk_eth - } - - if (ring->dma_pdma) { -- dma_free_coherent(eth->dev, -+ dma_free_coherent(eth->dma_dev, - MTK_DMA_SIZE * sizeof(*ring->dma_pdma), - ring->dma_pdma, - ring->phys_pdma); -@@ -1741,18 +1742,18 @@ static int mtk_rx_alloc(struct mtk_eth * - return -ENOMEM; - } - -- ring->dma = dma_alloc_coherent(eth->dev, -+ ring->dma = dma_alloc_coherent(eth->dma_dev, - rx_dma_size * sizeof(*ring->dma), - &ring->phys, GFP_ATOMIC); - if (!ring->dma) - return -ENOMEM; - - for (i = 0; i < rx_dma_size; i++) { -- dma_addr_t dma_addr = dma_map_single(eth->dev, -+ dma_addr_t dma_addr = dma_map_single(eth->dma_dev, - ring->data[i] + NET_SKB_PAD + eth->ip_align, - ring->buf_size, - DMA_FROM_DEVICE); -- if (unlikely(dma_mapping_error(eth->dev, dma_addr))) -+ if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) - return -ENOMEM; - ring->dma[i].rxd1 = (unsigned int)dma_addr; - -@@ -1788,7 +1789,7 @@ static void mtk_rx_clean(struct mtk_eth - continue; - if (!ring->dma[i].rxd1) - continue; -- dma_unmap_single(eth->dev, -+ dma_unmap_single(eth->dma_dev, - ring->dma[i].rxd1, - ring->buf_size, - DMA_FROM_DEVICE); -@@ -1799,7 +1800,7 @@ static void mtk_rx_clean(struct mtk_eth - } - - if (ring->dma) { -- dma_free_coherent(eth->dev, -+ dma_free_coherent(eth->dma_dev, - ring->dma_size * sizeof(*ring->dma), - ring->dma, - ring->phys); -@@ -2155,7 +2156,7 @@ static void mtk_dma_free(struct mtk_eth - if (eth->netdev[i]) - netdev_reset_queue(eth->netdev[i]); - if (eth->scratch_ring) { -- dma_free_coherent(eth->dev, -+ dma_free_coherent(eth->dma_dev, - MTK_DMA_SIZE * sizeof(struct mtk_tx_dma), - eth->scratch_ring, - eth->phy_scratch_ring); -@@ -2507,6 +2508,8 @@ static void mtk_dim_tx(struct work_struc - - static int mtk_hw_init(struct mtk_eth *eth) - { -+ u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA | -+ ETHSYS_DMA_AG_MAP_PPE; - int i, val, ret; - - if (test_and_set_bit(MTK_HW_INIT, ð->state)) -@@ -2519,6 +2522,10 @@ static int mtk_hw_init(struct mtk_eth *e - if (ret) - goto err_disable_pm; - -+ if (eth->ethsys) -+ regmap_update_bits(eth->ethsys, ETHSYS_DMA_AG_MAP, dma_mask, -+ of_dma_is_coherent(eth->dma_dev->of_node) * dma_mask); -+ - if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) { - ret = device_reset(eth->dev); - if (ret) { -@@ -3068,6 +3075,35 @@ free_netdev: - return err; - } - -+void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev) -+{ -+ struct net_device *dev, *tmp; -+ LIST_HEAD(dev_list); -+ int i; -+ -+ rtnl_lock(); -+ -+ for (i = 0; i < MTK_MAC_COUNT; i++) { -+ dev = eth->netdev[i]; -+ -+ if (!dev || !(dev->flags & IFF_UP)) -+ continue; -+ -+ list_add_tail(&dev->close_list, &dev_list); -+ } -+ -+ dev_close_many(&dev_list, false); -+ -+ eth->dma_dev = dma_dev; -+ -+ list_for_each_entry_safe(dev, tmp, &dev_list, close_list) { -+ list_del_init(&dev->close_list); -+ dev_open(dev, NULL); -+ } -+ -+ rtnl_unlock(); -+} -+ - static int mtk_probe(struct platform_device *pdev) - { - struct device_node *mac_np; -@@ -3081,6 +3117,7 @@ static int mtk_probe(struct platform_dev - eth->soc = of_device_get_match_data(&pdev->dev); - - eth->dev = &pdev->dev; -+ eth->dma_dev = &pdev->dev; - eth->base = devm_platform_ioremap_resource(pdev, 0); - if (IS_ERR(eth->base)) - return PTR_ERR(eth->base); -@@ -3129,6 +3166,16 @@ static int mtk_probe(struct platform_dev - } - } - -+ if (of_dma_is_coherent(pdev->dev.of_node)) { -+ struct regmap *cci; -+ -+ cci = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, -+ "mediatek,cci-control"); -+ /* enable CPU/bus coherency */ -+ if (!IS_ERR(cci)) -+ regmap_write(cci, 0, 3); -+ } -+ - if (MTK_HAS_CAPS(eth->soc->caps, MTK_SGMII)) { - eth->sgmii = devm_kzalloc(eth->dev, sizeof(*eth->sgmii), - GFP_KERNEL); ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -457,6 +457,12 @@ - #define RSTCTRL_FE BIT(6) - #define RSTCTRL_PPE BIT(31) - -+/* ethernet dma channel agent map */ -+#define ETHSYS_DMA_AG_MAP 0x408 -+#define ETHSYS_DMA_AG_MAP_PDMA BIT(0) -+#define ETHSYS_DMA_AG_MAP_QDMA BIT(1) -+#define ETHSYS_DMA_AG_MAP_PPE BIT(2) -+ - /* SGMII subsystem config registers */ - /* Register to auto-negotiation restart */ - #define SGMSYS_PCS_CONTROL_1 0x0 -@@ -874,6 +880,7 @@ struct mtk_sgmii { - /* struct mtk_eth - This is the main datasructure for holding the state - * of the driver - * @dev: The device pointer -+ * @dev: The device pointer used for dma mapping/alloc - * @base: The mapped register i/o base - * @page_lock: Make sure that register operations are atomic - * @tx_irq__lock: Make sure that IRQ register operations are atomic -@@ -917,6 +924,7 @@ struct mtk_sgmii { - - struct mtk_eth { - struct device *dev; -+ struct device *dma_dev; - void __iomem *base; - spinlock_t page_lock; - spinlock_t tx_irq_lock; -@@ -1015,6 +1023,7 @@ int mtk_gmac_rgmii_path_setup(struct mtk - int mtk_eth_offload_init(struct mtk_eth *eth); - int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type, - void *type_data); -+void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev); - - - #endif /* MTK_ETH_H */ diff --git a/target/linux/generic/pending-5.10/701-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch b/target/linux/generic/pending-5.10/701-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch deleted file mode 100644 index d9015d4805..0000000000 --- a/target/linux/generic/pending-5.10/701-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Felix Fietkau -Date: Mon, 7 Feb 2022 10:27:22 +0100 -Subject: [PATCH] arm64: dts: mediatek: mt7622: add support for coherent - DMA - -It improves performance by eliminating the need for a cache flush on rx and tx - -Signed-off-by: Felix Fietkau ---- - ---- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi -+++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -357,7 +357,7 @@ - }; - - cci_control2: slave-if@5000 { -- compatible = "arm,cci-400-ctrl-if"; -+ compatible = "arm,cci-400-ctrl-if", "syscon"; - interface-type = "ace"; - reg = <0x5000 0x1000>; - }; -@@ -937,6 +937,8 @@ - power-domains = <&scpsys MT7622_POWER_DOMAIN_ETHSYS>; - mediatek,ethsys = <ðsys>; - mediatek,sgmiisys = <&sgmiisys>; -+ mediatek,cci-control = <&cci_control2>; -+ dma-coherent; - #address-cells = <1>; - #size-cells = <0>; - status = "disabled"; diff --git a/target/linux/generic/pending-5.10/701-02-net-ethernet-mtk_eth_soc-add-support-for-Wireless-Et.patch b/target/linux/generic/pending-5.10/701-02-net-ethernet-mtk_eth_soc-add-support-for-Wireless-Et.patch deleted file mode 100644 index cd4adb94fd..0000000000 --- a/target/linux/generic/pending-5.10/701-02-net-ethernet-mtk_eth_soc-add-support-for-Wireless-Et.patch +++ /dev/null @@ -1,1679 +0,0 @@ -From: Felix Fietkau -Date: Sat, 5 Feb 2022 17:56:08 +0100 -Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for Wireless - Ethernet Dispatch (WED) - -The Wireless Ethernet Dispatch subsystem on the MT7622 SoC can be -configured to intercept and handle access to the DMA queues and -PCIe interrupts for a MT7615/MT7915 wireless card. -It can manage the internal WDMA (Wireless DMA) controller, which allows -ethernet packets to be passed from the packet switch engine (PSE) to the -wireless card, bypassing the CPU entirely. -This can be used to implement hardware flow offloading from ethernet to -WLAN. - -Signed-off-by: Felix Fietkau ---- - create mode 100644 drivers/net/ethernet/mediatek/mtk_wed.c - create mode 100644 drivers/net/ethernet/mediatek/mtk_wed.h - create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_debugfs.c - create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_ops.c - create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_regs.h - create mode 100644 include/linux/soc/mediatek/mtk_wed.h - ---- a/drivers/net/ethernet/mediatek/Kconfig -+++ b/drivers/net/ethernet/mediatek/Kconfig -@@ -7,6 +7,10 @@ config NET_VENDOR_MEDIATEK - - if NET_VENDOR_MEDIATEK - -+config NET_MEDIATEK_SOC_WED -+ depends on ARCH_MEDIATEK || COMPILE_TEST -+ def_bool NET_MEDIATEK_SOC != n -+ - config NET_MEDIATEK_SOC - tristate "MediaTek SoC Gigabit Ethernet support" - select PHYLINK ---- a/drivers/net/ethernet/mediatek/Makefile -+++ b/drivers/net/ethernet/mediatek/Makefile -@@ -5,4 +5,9 @@ - - obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o - mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_ppe_offload.o -+mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed.o -+ifdef CONFIG_DEBUG_FS -+mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_debugfs.o -+endif -+obj-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_ops.o - obj-$(CONFIG_NET_MEDIATEK_STAR_EMAC) += mtk_star_emac.o ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -24,6 +24,7 @@ - #include - - #include "mtk_eth_soc.h" -+#include "mtk_wed.h" - - static int mtk_msg_level = -1; - module_param_named(msg_level, mtk_msg_level, int, 0); -@@ -3198,6 +3199,22 @@ static int mtk_probe(struct platform_dev - } - } - -+ for (i = 0;; i++) { -+ struct device_node *np = of_parse_phandle(pdev->dev.of_node, -+ "mediatek,wed", i); -+ static const u32 wdma_regs[] = { -+ MTK_WDMA0_BASE, -+ MTK_WDMA1_BASE -+ }; -+ void __iomem *wdma; -+ -+ if (!np || i >= ARRAY_SIZE(wdma_regs)) -+ break; -+ -+ wdma = eth->base + wdma_regs[i]; -+ mtk_wed_add_hw(np, eth, wdma, i); -+ } -+ - for (i = 0; i < 3; i++) { - if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT) && i > 0) - eth->irq[i] = eth->irq[0]; ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -295,6 +295,9 @@ - #define MTK_GDM1_TX_GPCNT 0x2438 - #define MTK_STAT_OFFSET 0x40 - -+#define MTK_WDMA0_BASE 0x2800 -+#define MTK_WDMA1_BASE 0x2c00 -+ - /* QDMA descriptor txd4 */ - #define TX_DMA_CHKSUM (0x7 << 29) - #define TX_DMA_TSO BIT(28) ---- /dev/null -+++ b/drivers/net/ethernet/mediatek/mtk_wed.c -@@ -0,0 +1,875 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* Copyright (C) 2021 Felix Fietkau */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "mtk_eth_soc.h" -+#include "mtk_wed_regs.h" -+#include "mtk_wed.h" -+#include "mtk_ppe.h" -+ -+#define MTK_PCIE_BASE(n) (0x1a143000 + (n) * 0x2000) -+ -+#define MTK_WED_PKT_SIZE 1900 -+#define MTK_WED_BUF_SIZE 2048 -+#define MTK_WED_BUF_PER_PAGE (PAGE_SIZE / 2048) -+ -+#define MTK_WED_TX_RING_SIZE 2048 -+#define MTK_WED_WDMA_RING_SIZE 1024 -+ -+static struct mtk_wed_hw *hw_list[2]; -+static DEFINE_MUTEX(hw_lock); -+ -+static void -+wed_m32(struct mtk_wed_device *dev, u32 reg, u32 mask, u32 val) -+{ -+ regmap_update_bits(dev->hw->regs, reg, mask | val, val); -+} -+ -+static void -+wed_set(struct mtk_wed_device *dev, u32 reg, u32 mask) -+{ -+ return wed_m32(dev, reg, 0, mask); -+} -+ -+static void -+wed_clr(struct mtk_wed_device *dev, u32 reg, u32 mask) -+{ -+ return wed_m32(dev, reg, mask, 0); -+} -+ -+static void -+wdma_m32(struct mtk_wed_device *dev, u32 reg, u32 mask, u32 val) -+{ -+ wdma_w32(dev, reg, (wdma_r32(dev, reg) & ~mask) | val); -+} -+ -+static void -+wdma_set(struct mtk_wed_device *dev, u32 reg, u32 mask) -+{ -+ wdma_m32(dev, reg, 0, mask); -+} -+ -+static u32 -+mtk_wed_read_reset(struct mtk_wed_device *dev) -+{ -+ return wed_r32(dev, MTK_WED_RESET); -+} -+ -+static void -+mtk_wed_reset(struct mtk_wed_device *dev, u32 mask) -+{ -+ u32 status; -+ -+ wed_w32(dev, MTK_WED_RESET, mask); -+ if (readx_poll_timeout(mtk_wed_read_reset, dev, status, -+ !(status & mask), 0, 1000)) -+ WARN_ON_ONCE(1); -+} -+ -+static struct mtk_wed_hw * -+mtk_wed_assign(struct mtk_wed_device *dev) -+{ -+ struct mtk_wed_hw *hw; -+ -+ hw = hw_list[pci_domain_nr(dev->wlan.pci_dev->bus)]; -+ if (!hw || hw->wed_dev) -+ return NULL; -+ -+ hw->wed_dev = dev; -+ return hw; -+} -+ -+static int -+mtk_wed_buffer_alloc(struct mtk_wed_device *dev) -+{ -+ struct mtk_wdma_desc *desc; -+ dma_addr_t desc_phys; -+ void **page_list; -+ int token = dev->wlan.token_start; -+ int ring_size; -+ int n_pages; -+ int i, page_idx; -+ -+ ring_size = dev->wlan.nbuf & ~(MTK_WED_BUF_PER_PAGE - 1); -+ n_pages = ring_size / MTK_WED_BUF_PER_PAGE; -+ -+ page_list = kcalloc(n_pages, sizeof(*page_list), GFP_KERNEL); -+ if (!page_list) -+ return -ENOMEM; -+ -+ dev->buf_ring.size = ring_size; -+ dev->buf_ring.pages = page_list; -+ -+ desc = dma_alloc_coherent(dev->hw->dev, ring_size * sizeof(*desc), -+ &desc_phys, GFP_KERNEL); -+ if (!desc) -+ return -ENOMEM; -+ -+ dev->buf_ring.desc = desc; -+ dev->buf_ring.desc_phys = desc_phys; -+ -+ for (i = 0, page_idx = 0; i < ring_size; i += MTK_WED_BUF_PER_PAGE) { -+ dma_addr_t page_phys, buf_phys; -+ struct page *page; -+ void *buf; -+ int s; -+ -+ page = __dev_alloc_pages(GFP_KERNEL, 0); -+ if (!page) -+ return -ENOMEM; -+ -+ page_phys = dma_map_page(dev->hw->dev, page, 0, PAGE_SIZE, -+ DMA_BIDIRECTIONAL); -+ if (dma_mapping_error(dev->hw->dev, page_phys)) { -+ __free_page(page); -+ return -ENOMEM; -+ } -+ -+ page_list[page_idx++] = page; -+ dma_sync_single_for_cpu(dev->hw->dev, page_phys, PAGE_SIZE, -+ DMA_BIDIRECTIONAL); -+ -+ buf = page_to_virt(page); -+ buf_phys = page_phys; -+ -+ for (s = 0; s < MTK_WED_BUF_PER_PAGE; s++) { -+ u32 txd_size; -+ -+ txd_size = dev->wlan.init_buf(buf, buf_phys, token++); -+ -+ desc->buf0 = buf_phys; -+ desc->buf1 = buf_phys + txd_size; -+ desc->ctrl = FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN0, -+ txd_size) | -+ FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN1, -+ MTK_WED_BUF_SIZE - txd_size) | -+ MTK_WDMA_DESC_CTRL_LAST_SEG1; -+ desc->info = 0; -+ desc++; -+ -+ buf += MTK_WED_BUF_SIZE; -+ buf_phys += MTK_WED_BUF_SIZE; -+ } -+ -+ dma_sync_single_for_device(dev->hw->dev, page_phys, PAGE_SIZE, -+ DMA_BIDIRECTIONAL); -+ } -+ -+ return 0; -+} -+ -+static void -+mtk_wed_free_buffer(struct mtk_wed_device *dev) -+{ -+ struct mtk_wdma_desc *desc = dev->buf_ring.desc; -+ void **page_list = dev->buf_ring.pages; -+ int page_idx; -+ int i; -+ -+ if (!page_list) -+ return; -+ -+ if (!desc) -+ goto free_pagelist; -+ -+ for (i = 0, page_idx = 0; i < dev->buf_ring.size; i += MTK_WED_BUF_PER_PAGE) { -+ void *page = page_list[page_idx++]; -+ -+ if (!page) -+ break; -+ -+ dma_unmap_page(dev->hw->dev, desc[i].buf0, -+ PAGE_SIZE, DMA_BIDIRECTIONAL); -+ __free_page(page); -+ } -+ -+ dma_free_coherent(dev->hw->dev, dev->buf_ring.size * sizeof(*desc), -+ desc, dev->buf_ring.desc_phys); -+ -+free_pagelist: -+ kfree(page_list); -+} -+ -+static void -+mtk_wed_free_ring(struct mtk_wed_device *dev, struct mtk_wed_ring *ring) -+{ -+ if (!ring->desc) -+ return; -+ -+ dma_free_coherent(dev->hw->dev, ring->size * sizeof(*ring->desc), -+ ring->desc, ring->desc_phys); -+} -+ -+static void -+mtk_wed_free_tx_rings(struct mtk_wed_device *dev) -+{ -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(dev->tx_ring); i++) -+ mtk_wed_free_ring(dev, &dev->tx_ring[i]); -+ for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) -+ mtk_wed_free_ring(dev, &dev->tx_wdma[i]); -+} -+ -+static void -+mtk_wed_set_ext_int(struct mtk_wed_device *dev, bool en) -+{ -+ u32 mask = MTK_WED_EXT_INT_STATUS_ERROR_MASK; -+ -+ if (!dev->hw->num_flows) -+ mask &= ~MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD; -+ -+ wed_w32(dev, MTK_WED_EXT_INT_MASK, en ? mask : 0); -+ wed_r32(dev, MTK_WED_EXT_INT_MASK); -+} -+ -+static void -+mtk_wed_stop(struct mtk_wed_device *dev) -+{ -+ regmap_write(dev->hw->mirror, dev->hw->index * 4, 0); -+ mtk_wed_set_ext_int(dev, false); -+ -+ wed_clr(dev, MTK_WED_CTRL, -+ MTK_WED_CTRL_WDMA_INT_AGENT_EN | -+ MTK_WED_CTRL_WPDMA_INT_AGENT_EN | -+ MTK_WED_CTRL_WED_TX_BM_EN | -+ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); -+ wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, 0); -+ wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, 0); -+ wdma_w32(dev, MTK_WDMA_INT_MASK, 0); -+ wdma_w32(dev, MTK_WDMA_INT_GRP2, 0); -+ wed_w32(dev, MTK_WED_WPDMA_INT_MASK, 0); -+ -+ wed_clr(dev, MTK_WED_GLO_CFG, -+ MTK_WED_GLO_CFG_TX_DMA_EN | -+ MTK_WED_GLO_CFG_RX_DMA_EN); -+ wed_clr(dev, MTK_WED_WPDMA_GLO_CFG, -+ MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN | -+ MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN); -+ wed_clr(dev, MTK_WED_WDMA_GLO_CFG, -+ MTK_WED_WDMA_GLO_CFG_RX_DRV_EN); -+} -+ -+static void -+mtk_wed_detach(struct mtk_wed_device *dev) -+{ -+ struct device_node *wlan_node = dev->wlan.pci_dev->dev.of_node; -+ struct mtk_wed_hw *hw = dev->hw; -+ -+ mutex_lock(&hw_lock); -+ -+ mtk_wed_stop(dev); -+ -+ wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX); -+ wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); -+ -+ mtk_wed_reset(dev, MTK_WED_RESET_WED); -+ -+ mtk_wed_free_buffer(dev); -+ mtk_wed_free_tx_rings(dev); -+ -+ if (of_dma_is_coherent(wlan_node)) -+ regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP, -+ BIT(hw->index), BIT(hw->index)); -+ -+ if (!hw_list[!hw->index]->wed_dev && -+ hw->eth->dma_dev != hw->eth->dev) -+ mtk_eth_set_dma_device(hw->eth, hw->eth->dev); -+ -+ memset(dev, 0, sizeof(*dev)); -+ module_put(THIS_MODULE); -+ -+ hw->wed_dev = NULL; -+ mutex_unlock(&hw_lock); -+} -+ -+static void -+mtk_wed_hw_init_early(struct mtk_wed_device *dev) -+{ -+ u32 mask, set; -+ u32 offset; -+ -+ mtk_wed_stop(dev); -+ mtk_wed_reset(dev, MTK_WED_RESET_WED); -+ -+ mask = MTK_WED_WDMA_GLO_CFG_BT_SIZE | -+ MTK_WED_WDMA_GLO_CFG_DYNAMIC_DMAD_RECYCLE | -+ MTK_WED_WDMA_GLO_CFG_RX_DIS_FSM_AUTO_IDLE; -+ set = FIELD_PREP(MTK_WED_WDMA_GLO_CFG_BT_SIZE, 2) | -+ MTK_WED_WDMA_GLO_CFG_DYNAMIC_SKIP_DMAD_PREP | -+ MTK_WED_WDMA_GLO_CFG_IDLE_DMAD_SUPPLY; -+ wed_m32(dev, MTK_WED_WDMA_GLO_CFG, mask, set); -+ -+ wdma_set(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_RX_INFO_PRERES); -+ -+ offset = dev->hw->index ? 0x04000400 : 0; -+ wed_w32(dev, MTK_WED_WDMA_OFFSET0, 0x2a042a20 + offset); -+ wed_w32(dev, MTK_WED_WDMA_OFFSET1, 0x29002800 + offset); -+ -+ wed_w32(dev, MTK_WED_PCIE_CFG_BASE, MTK_PCIE_BASE(dev->hw->index)); -+ wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_phys); -+} -+ -+static void -+mtk_wed_hw_init(struct mtk_wed_device *dev) -+{ -+ if (dev->init_done) -+ return; -+ -+ dev->init_done = true; -+ mtk_wed_set_ext_int(dev, false); -+ wed_w32(dev, MTK_WED_TX_BM_CTRL, -+ MTK_WED_TX_BM_CTRL_PAUSE | -+ FIELD_PREP(MTK_WED_TX_BM_CTRL_VLD_GRP_NUM, -+ dev->buf_ring.size / 128) | -+ FIELD_PREP(MTK_WED_TX_BM_CTRL_RSV_GRP_NUM, -+ MTK_WED_TX_RING_SIZE / 256)); -+ -+ wed_w32(dev, MTK_WED_TX_BM_BASE, dev->buf_ring.desc_phys); -+ -+ wed_w32(dev, MTK_WED_TX_BM_TKID, -+ FIELD_PREP(MTK_WED_TX_BM_TKID_START, -+ dev->wlan.token_start) | -+ FIELD_PREP(MTK_WED_TX_BM_TKID_END, -+ dev->wlan.token_start + dev->wlan.nbuf - 1)); -+ -+ wed_w32(dev, MTK_WED_TX_BM_BUF_LEN, MTK_WED_PKT_SIZE); -+ -+ wed_w32(dev, MTK_WED_TX_BM_DYN_THR, -+ FIELD_PREP(MTK_WED_TX_BM_DYN_THR_LO, 1) | -+ MTK_WED_TX_BM_DYN_THR_HI); -+ -+ mtk_wed_reset(dev, MTK_WED_RESET_TX_BM); -+ -+ wed_set(dev, MTK_WED_CTRL, -+ MTK_WED_CTRL_WED_TX_BM_EN | -+ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); -+ -+ wed_clr(dev, MTK_WED_TX_BM_CTRL, MTK_WED_TX_BM_CTRL_PAUSE); -+} -+ -+static void -+mtk_wed_ring_reset(struct mtk_wdma_desc *desc, int size) -+{ -+ int i; -+ -+ for (i = 0; i < size; i++) { -+ desc[i].buf0 = 0; -+ desc[i].ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE); -+ desc[i].buf1 = 0; -+ desc[i].info = 0; -+ } -+} -+ -+static u32 -+mtk_wed_check_busy(struct mtk_wed_device *dev) -+{ -+ if (wed_r32(dev, MTK_WED_GLO_CFG) & MTK_WED_GLO_CFG_TX_DMA_BUSY) -+ return true; -+ -+ if (wed_r32(dev, MTK_WED_WPDMA_GLO_CFG) & -+ MTK_WED_WPDMA_GLO_CFG_TX_DRV_BUSY) -+ return true; -+ -+ if (wed_r32(dev, MTK_WED_CTRL) & MTK_WED_CTRL_WDMA_INT_AGENT_BUSY) -+ return true; -+ -+ if (wed_r32(dev, MTK_WED_WDMA_GLO_CFG) & -+ MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY) -+ return true; -+ -+ if (wdma_r32(dev, MTK_WDMA_GLO_CFG) & -+ MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY) -+ return true; -+ -+ if (wed_r32(dev, MTK_WED_CTRL) & -+ (MTK_WED_CTRL_WED_TX_BM_BUSY | MTK_WED_CTRL_WED_TX_FREE_AGENT_BUSY)) -+ return true; -+ -+ return false; -+} -+ -+static int -+mtk_wed_poll_busy(struct mtk_wed_device *dev) -+{ -+ int sleep = 15000; -+ int timeout = 100 * sleep; -+ u32 val; -+ -+ return read_poll_timeout(mtk_wed_check_busy, val, !val, sleep, -+ timeout, false, dev); -+} -+ -+static void -+mtk_wed_reset_dma(struct mtk_wed_device *dev) -+{ -+ bool busy = false; -+ u32 val; -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(dev->tx_ring); i++) { -+ struct mtk_wdma_desc *desc = dev->tx_ring[i].desc; -+ -+ if (!desc) -+ continue; -+ -+ mtk_wed_ring_reset(desc, MTK_WED_TX_RING_SIZE); -+ } -+ -+ if (mtk_wed_poll_busy(dev)) -+ busy = mtk_wed_check_busy(dev); -+ -+ if (busy) { -+ mtk_wed_reset(dev, MTK_WED_RESET_WED_TX_DMA); -+ } else { -+ wed_w32(dev, MTK_WED_RESET_IDX, -+ MTK_WED_RESET_IDX_TX | -+ MTK_WED_RESET_IDX_RX); -+ wed_w32(dev, MTK_WED_RESET_IDX, 0); -+ } -+ -+ wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX); -+ wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); -+ -+ if (busy) { -+ mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT); -+ mtk_wed_reset(dev, MTK_WED_RESET_WDMA_RX_DRV); -+ } else { -+ wed_w32(dev, MTK_WED_WDMA_RESET_IDX, -+ MTK_WED_WDMA_RESET_IDX_RX | MTK_WED_WDMA_RESET_IDX_DRV); -+ wed_w32(dev, MTK_WED_WDMA_RESET_IDX, 0); -+ -+ wed_set(dev, MTK_WED_WDMA_GLO_CFG, -+ MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE); -+ -+ wed_clr(dev, MTK_WED_WDMA_GLO_CFG, -+ MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE); -+ } -+ -+ for (i = 0; i < 100; i++) { -+ val = wed_r32(dev, MTK_WED_TX_BM_INTF); -+ if (FIELD_GET(MTK_WED_TX_BM_INTF_TKFIFO_FDEP, val) == 0x40) -+ break; -+ } -+ -+ mtk_wed_reset(dev, MTK_WED_RESET_TX_FREE_AGENT); -+ mtk_wed_reset(dev, MTK_WED_RESET_TX_BM); -+ -+ if (busy) { -+ mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT); -+ mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_TX_DRV); -+ mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_RX_DRV); -+ } else { -+ wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, -+ MTK_WED_WPDMA_RESET_IDX_TX | -+ MTK_WED_WPDMA_RESET_IDX_RX); -+ wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0); -+ } -+ -+} -+ -+static int -+mtk_wed_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring, -+ int size) -+{ -+ ring->desc = dma_alloc_coherent(dev->hw->dev, -+ size * sizeof(*ring->desc), -+ &ring->desc_phys, GFP_KERNEL); -+ if (!ring->desc) -+ return -ENOMEM; -+ -+ ring->size = size; -+ mtk_wed_ring_reset(ring->desc, size); -+ -+ return 0; -+} -+ -+static int -+mtk_wed_wdma_ring_setup(struct mtk_wed_device *dev, int idx, int size) -+{ -+ struct mtk_wed_ring *wdma = &dev->tx_wdma[idx]; -+ -+ if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE)) -+ return -ENOMEM; -+ -+ wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE, -+ wdma->desc_phys); -+ wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_COUNT, -+ size); -+ wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0); -+ -+ wed_w32(dev, MTK_WED_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE, -+ wdma->desc_phys); -+ wed_w32(dev, MTK_WED_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_COUNT, -+ size); -+ -+ return 0; -+} -+ -+static void -+mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask) -+{ -+ u32 wdma_mask; -+ u32 val; -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++) -+ if (!dev->tx_wdma[i].desc) -+ mtk_wed_wdma_ring_setup(dev, i, 16); -+ -+ wdma_mask = FIELD_PREP(MTK_WDMA_INT_MASK_RX_DONE, GENMASK(1, 0)); -+ -+ mtk_wed_hw_init(dev); -+ -+ wed_set(dev, MTK_WED_CTRL, -+ MTK_WED_CTRL_WDMA_INT_AGENT_EN | -+ MTK_WED_CTRL_WPDMA_INT_AGENT_EN | -+ MTK_WED_CTRL_WED_TX_BM_EN | -+ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN); -+ -+ wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, MTK_WED_PCIE_INT_TRIGGER_STATUS); -+ -+ wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, -+ MTK_WED_WPDMA_INT_TRIGGER_RX_DONE | -+ MTK_WED_WPDMA_INT_TRIGGER_TX_DONE); -+ -+ wed_set(dev, MTK_WED_WPDMA_INT_CTRL, -+ MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV); -+ -+ wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, wdma_mask); -+ wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask); -+ -+ wdma_w32(dev, MTK_WDMA_INT_MASK, wdma_mask); -+ wdma_w32(dev, MTK_WDMA_INT_GRP2, wdma_mask); -+ -+ wed_w32(dev, MTK_WED_WPDMA_INT_MASK, irq_mask); -+ wed_w32(dev, MTK_WED_INT_MASK, irq_mask); -+ -+ wed_set(dev, MTK_WED_GLO_CFG, -+ MTK_WED_GLO_CFG_TX_DMA_EN | -+ MTK_WED_GLO_CFG_RX_DMA_EN); -+ wed_set(dev, MTK_WED_WPDMA_GLO_CFG, -+ MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN | -+ MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN); -+ wed_set(dev, MTK_WED_WDMA_GLO_CFG, -+ MTK_WED_WDMA_GLO_CFG_RX_DRV_EN); -+ -+ mtk_wed_set_ext_int(dev, true); -+ val = dev->wlan.wpdma_phys | -+ MTK_PCIE_MIRROR_MAP_EN | -+ FIELD_PREP(MTK_PCIE_MIRROR_MAP_WED_ID, dev->hw->index); -+ -+ if (dev->hw->index) -+ val |= BIT(1); -+ val |= BIT(0); -+ regmap_write(dev->hw->mirror, dev->hw->index * 4, val); -+ -+ dev->running = true; -+} -+ -+static int -+mtk_wed_attach(struct mtk_wed_device *dev) -+ __releases(RCU) -+{ -+ struct mtk_wed_hw *hw; -+ int ret = 0; -+ -+ RCU_LOCKDEP_WARN(!rcu_read_lock_held(), -+ "mtk_wed_attach without holding the RCU read lock"); -+ -+ if (pci_domain_nr(dev->wlan.pci_dev->bus) > 1 || -+ !try_module_get(THIS_MODULE)) -+ ret = -ENODEV; -+ -+ rcu_read_unlock(); -+ -+ if (ret) -+ return ret; -+ -+ mutex_lock(&hw_lock); -+ -+ hw = mtk_wed_assign(dev); -+ if (!hw) { -+ module_put(THIS_MODULE); -+ ret = -ENODEV; -+ goto out; -+ } -+ -+ dev_info(&dev->wlan.pci_dev->dev, "attaching wed device %d\n", hw->index); -+ -+ dev->hw = hw; -+ dev->dev = hw->dev; -+ dev->irq = hw->irq; -+ dev->wdma_idx = hw->index; -+ -+ if (hw->eth->dma_dev == hw->eth->dev && -+ of_dma_is_coherent(hw->eth->dev->of_node)) -+ mtk_eth_set_dma_device(hw->eth, hw->dev); -+ -+ ret = mtk_wed_buffer_alloc(dev); -+ if (ret) { -+ mtk_wed_detach(dev); -+ goto out; -+ } -+ -+ mtk_wed_hw_init_early(dev); -+ regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP, BIT(hw->index), 0); -+ -+out: -+ mutex_unlock(&hw_lock); -+ -+ return ret; -+} -+ -+static int -+mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs) -+{ -+ struct mtk_wed_ring *ring = &dev->tx_ring[idx]; -+ -+ /* -+ * Tx ring redirection: -+ * Instead of configuring the WLAN PDMA TX ring directly, the WLAN -+ * driver allocated DMA ring gets configured into WED MTK_WED_RING_TX(n) -+ * registers. -+ * -+ * WED driver posts its own DMA ring as WLAN PDMA TX and configures it -+ * into MTK_WED_WPDMA_RING_TX(n) registers. -+ * It gets filled with packets picked up from WED TX ring and from -+ * WDMA RX. -+ */ -+ -+ BUG_ON(idx > ARRAY_SIZE(dev->tx_ring)); -+ -+ if (mtk_wed_ring_alloc(dev, ring, MTK_WED_TX_RING_SIZE)) -+ return -ENOMEM; -+ -+ if (mtk_wed_wdma_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) -+ return -ENOMEM; -+ -+ ring->reg_base = MTK_WED_RING_TX(idx); -+ ring->wpdma = regs; -+ -+ /* WED -> WPDMA */ -+ wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys); -+ wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_COUNT, MTK_WED_TX_RING_SIZE); -+ wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_CPU_IDX, 0); -+ -+ wed_w32(dev, MTK_WED_WPDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE, -+ ring->desc_phys); -+ wed_w32(dev, MTK_WED_WPDMA_RING_TX(idx) + MTK_WED_RING_OFS_COUNT, -+ MTK_WED_TX_RING_SIZE); -+ wed_w32(dev, MTK_WED_WPDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0); -+ -+ return 0; -+} -+ -+static int -+mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs) -+{ -+ struct mtk_wed_ring *ring = &dev->txfree_ring; -+ int i; -+ -+ /* -+ * For txfree event handling, the same DMA ring is shared between WED -+ * and WLAN. The WLAN driver accesses the ring index registers through -+ * WED -+ */ -+ ring->reg_base = MTK_WED_RING_RX(1); -+ ring->wpdma = regs; -+ -+ for (i = 0; i < 12; i += 4) { -+ u32 val = readl(regs + i); -+ -+ wed_w32(dev, MTK_WED_RING_RX(1) + i, val); -+ wed_w32(dev, MTK_WED_WPDMA_RING_RX(1) + i, val); -+ } -+ -+ return 0; -+} -+ -+static u32 -+mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask) -+{ -+ u32 val; -+ -+ val = wed_r32(dev, MTK_WED_EXT_INT_STATUS); -+ wed_w32(dev, MTK_WED_EXT_INT_STATUS, val); -+ val &= MTK_WED_EXT_INT_STATUS_ERROR_MASK; -+ if (!dev->hw->num_flows) -+ val &= ~MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD; -+ if (val && net_ratelimit()) -+ pr_err("mtk_wed%d: error status=%08x\n", dev->hw->index, val); -+ -+ val = wed_r32(dev, MTK_WED_INT_STATUS); -+ val &= mask; -+ wed_w32(dev, MTK_WED_INT_STATUS, val); /* ACK */ -+ -+ return val; -+} -+ -+static void -+mtk_wed_irq_set_mask(struct mtk_wed_device *dev, u32 mask) -+{ -+ if (!dev->running) -+ return; -+ -+ mtk_wed_set_ext_int(dev, !!mask); -+ wed_w32(dev, MTK_WED_INT_MASK, mask); -+} -+ -+int mtk_wed_flow_add(int index) -+{ -+ struct mtk_wed_hw *hw = hw_list[index]; -+ int ret; -+ -+ if (!hw || !hw->wed_dev) -+ return -ENODEV; -+ -+ if (hw->num_flows) { -+ hw->num_flows++; -+ return 0; -+ } -+ -+ mutex_lock(&hw_lock); -+ if (!hw->wed_dev) { -+ ret = -ENODEV; -+ goto out; -+ } -+ -+ ret = hw->wed_dev->wlan.offload_enable(hw->wed_dev); -+ if (!ret) -+ hw->num_flows++; -+ mtk_wed_set_ext_int(hw->wed_dev, true); -+ -+out: -+ mutex_unlock(&hw_lock); -+ -+ return ret; -+} -+ -+void mtk_wed_flow_remove(int index) -+{ -+ struct mtk_wed_hw *hw = hw_list[index]; -+ -+ if (!hw) -+ return; -+ -+ if (--hw->num_flows) -+ return; -+ -+ mutex_lock(&hw_lock); -+ if (!hw->wed_dev) -+ goto out; -+ -+ hw->wed_dev->wlan.offload_disable(hw->wed_dev); -+ mtk_wed_set_ext_int(hw->wed_dev, true); -+ -+out: -+ mutex_unlock(&hw_lock); -+} -+ -+void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, -+ void __iomem *wdma, int index) -+{ -+ static const struct mtk_wed_ops wed_ops = { -+ .attach = mtk_wed_attach, -+ .tx_ring_setup = mtk_wed_tx_ring_setup, -+ .txfree_ring_setup = mtk_wed_txfree_ring_setup, -+ .start = mtk_wed_start, -+ .stop = mtk_wed_stop, -+ .reset_dma = mtk_wed_reset_dma, -+ .reg_read = wed_r32, -+ .reg_write = wed_w32, -+ .irq_get = mtk_wed_irq_get, -+ .irq_set_mask = mtk_wed_irq_set_mask, -+ .detach = mtk_wed_detach, -+ }; -+ struct device_node *eth_np = eth->dev->of_node; -+ struct platform_device *pdev; -+ struct mtk_wed_hw *hw; -+ struct regmap *regs; -+ int irq; -+ -+ if (!np) -+ return; -+ -+ pdev = of_find_device_by_node(np); -+ if (!pdev) -+ return; -+ -+ get_device(&pdev->dev); -+ irq = platform_get_irq(pdev, 0); -+ if (irq < 0) -+ return; -+ -+ regs = syscon_regmap_lookup_by_phandle(np, NULL); -+ if (!regs) -+ return; -+ -+ rcu_assign_pointer(mtk_soc_wed_ops, &wed_ops); -+ -+ mutex_lock(&hw_lock); -+ -+ if (WARN_ON(hw_list[index])) -+ goto unlock; -+ -+ hw = kzalloc(sizeof(*hw), GFP_KERNEL); -+ hw->node = np; -+ hw->regs = regs; -+ hw->eth = eth; -+ hw->dev = &pdev->dev; -+ hw->wdma = wdma; -+ hw->index = index; -+ hw->irq = irq; -+ hw->mirror = syscon_regmap_lookup_by_phandle(eth_np, -+ "mediatek,pcie-mirror"); -+ hw->hifsys = syscon_regmap_lookup_by_phandle(eth_np, -+ "mediatek,hifsys"); -+ if (IS_ERR(hw->mirror) || IS_ERR(hw->hifsys)) { -+ kfree(hw); -+ goto unlock; -+ } -+ -+ if (!index) { -+ regmap_write(hw->mirror, 0, 0); -+ regmap_write(hw->mirror, 4, 0); -+ } -+ mtk_wed_hw_add_debugfs(hw); -+ -+ hw_list[index] = hw; -+ -+unlock: -+ mutex_unlock(&hw_lock); -+} -+ -+void mtk_wed_exit(void) -+{ -+ int i; -+ -+ rcu_assign_pointer(mtk_soc_wed_ops, NULL); -+ -+ synchronize_rcu(); -+ -+ for (i = 0; i < ARRAY_SIZE(hw_list); i++) { -+ struct mtk_wed_hw *hw; -+ -+ hw = hw_list[i]; -+ if (!hw) -+ continue; -+ -+ hw_list[i] = NULL; -+ debugfs_remove(hw->debugfs_dir); -+ put_device(hw->dev); -+ kfree(hw); -+ } -+} ---- /dev/null -+++ b/drivers/net/ethernet/mediatek/mtk_wed.h -@@ -0,0 +1,128 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* Copyright (C) 2021 Felix Fietkau */ -+ -+#ifndef __MTK_WED_PRIV_H -+#define __MTK_WED_PRIV_H -+ -+#include -+#include -+#include -+ -+struct mtk_eth; -+ -+struct mtk_wed_hw { -+ struct device_node *node; -+ struct mtk_eth *eth; -+ struct regmap *regs; -+ struct regmap *hifsys; -+ struct device *dev; -+ void __iomem *wdma; -+ struct regmap *mirror; -+ struct dentry *debugfs_dir; -+ struct mtk_wed_device *wed_dev; -+ u32 debugfs_reg; -+ u32 num_flows; -+ char dirname[5]; -+ int irq; -+ int index; -+}; -+ -+ -+#ifdef CONFIG_NET_MEDIATEK_SOC_WED -+static inline void -+wed_w32(struct mtk_wed_device *dev, u32 reg, u32 val) -+{ -+ regmap_write(dev->hw->regs, reg, val); -+} -+ -+static inline u32 -+wed_r32(struct mtk_wed_device *dev, u32 reg) -+{ -+ unsigned int val; -+ -+ regmap_read(dev->hw->regs, reg, &val); -+ -+ return val; -+} -+ -+static inline void -+wdma_w32(struct mtk_wed_device *dev, u32 reg, u32 val) -+{ -+ writel(val, dev->hw->wdma + reg); -+} -+ -+static inline u32 -+wdma_r32(struct mtk_wed_device *dev, u32 reg) -+{ -+ return readl(dev->hw->wdma + reg); -+} -+ -+static inline u32 -+wpdma_tx_r32(struct mtk_wed_device *dev, int ring, u32 reg) -+{ -+ if (!dev->tx_ring[ring].wpdma) -+ return 0; -+ -+ return readl(dev->tx_ring[ring].wpdma + reg); -+} -+ -+static inline void -+wpdma_tx_w32(struct mtk_wed_device *dev, int ring, u32 reg, u32 val) -+{ -+ if (!dev->tx_ring[ring].wpdma) -+ return; -+ -+ writel(val, dev->tx_ring[ring].wpdma + reg); -+} -+ -+static inline u32 -+wpdma_txfree_r32(struct mtk_wed_device *dev, u32 reg) -+{ -+ if (!dev->txfree_ring.wpdma) -+ return 0; -+ -+ return readl(dev->txfree_ring.wpdma + reg); -+} -+ -+static inline void -+wpdma_txfree_w32(struct mtk_wed_device *dev, u32 reg, u32 val) -+{ -+ if (!dev->txfree_ring.wpdma) -+ return; -+ -+ writel(val, dev->txfree_ring.wpdma + reg); -+} -+ -+void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, -+ void __iomem *wdma, int index); -+void mtk_wed_exit(void); -+int mtk_wed_flow_add(int index); -+void mtk_wed_flow_remove(int index); -+#else -+static inline void -+mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, -+ void __iomem *wdma, int index) -+{ -+} -+static inline void -+mtk_wed_exit(void) -+{ -+} -+static inline int mtk_wed_flow_add(int index) -+{ -+ return -EINVAL; -+} -+static inline void mtk_wed_flow_remove(int index) -+{ -+} -+#endif -+ -+#ifdef CONFIG_DEBUG_FS -+void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw); -+#else -+static inline void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw) -+{ -+} -+#endif -+ -+#endif ---- /dev/null -+++ b/drivers/net/ethernet/mediatek/mtk_wed_debugfs.c -@@ -0,0 +1,175 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* Copyright (C) 2021 Felix Fietkau */ -+ -+#include -+#include "mtk_wed.h" -+#include "mtk_wed_regs.h" -+ -+struct reg_dump { -+ const char *name; -+ u16 offset; -+ u8 type; -+ u8 base; -+}; -+ -+enum { -+ DUMP_TYPE_STRING, -+ DUMP_TYPE_WED, -+ DUMP_TYPE_WDMA, -+ DUMP_TYPE_WPDMA_TX, -+ DUMP_TYPE_WPDMA_TXFREE, -+}; -+ -+#define DUMP_STR(_str) { _str, 0, DUMP_TYPE_STRING } -+#define DUMP_REG(_reg, ...) { #_reg, MTK_##_reg, __VA_ARGS__ } -+#define DUMP_RING(_prefix, _base, ...) \ -+ { _prefix " BASE", _base, __VA_ARGS__ }, \ -+ { _prefix " CNT", _base + 0x4, __VA_ARGS__ }, \ -+ { _prefix " CIDX", _base + 0x8, __VA_ARGS__ }, \ -+ { _prefix " DIDX", _base + 0xc, __VA_ARGS__ } -+ -+#define DUMP_WED(_reg) DUMP_REG(_reg, DUMP_TYPE_WED) -+#define DUMP_WED_RING(_base) DUMP_RING(#_base, MTK_##_base, DUMP_TYPE_WED) -+ -+#define DUMP_WDMA(_reg) DUMP_REG(_reg, DUMP_TYPE_WDMA) -+#define DUMP_WDMA_RING(_base) DUMP_RING(#_base, MTK_##_base, DUMP_TYPE_WDMA) -+ -+#define DUMP_WPDMA_TX_RING(_n) DUMP_RING("WPDMA_TX" #_n, 0, DUMP_TYPE_WPDMA_TX, _n) -+#define DUMP_WPDMA_TXFREE_RING DUMP_RING("WPDMA_RX1", 0, DUMP_TYPE_WPDMA_TXFREE) -+ -+static void -+print_reg_val(struct seq_file *s, const char *name, u32 val) -+{ -+ seq_printf(s, "%-32s %08x\n", name, val); -+} -+ -+static void -+dump_wed_regs(struct seq_file *s, struct mtk_wed_device *dev, -+ const struct reg_dump *regs, int n_regs) -+{ -+ const struct reg_dump *cur; -+ u32 val; -+ -+ for (cur = regs; cur < ®s[n_regs]; cur++) { -+ switch (cur->type) { -+ case DUMP_TYPE_STRING: -+ seq_printf(s, "%s======== %s:\n", -+ cur > regs ? "\n" : "", -+ cur->name); -+ continue; -+ case DUMP_TYPE_WED: -+ val = wed_r32(dev, cur->offset); -+ break; -+ case DUMP_TYPE_WDMA: -+ val = wdma_r32(dev, cur->offset); -+ break; -+ case DUMP_TYPE_WPDMA_TX: -+ val = wpdma_tx_r32(dev, cur->base, cur->offset); -+ break; -+ case DUMP_TYPE_WPDMA_TXFREE: -+ val = wpdma_txfree_r32(dev, cur->offset); -+ break; -+ } -+ print_reg_val(s, cur->name, val); -+ } -+} -+ -+ -+static int -+wed_txinfo_show(struct seq_file *s, void *data) -+{ -+ static const struct reg_dump regs[] = { -+ DUMP_STR("WED TX"), -+ DUMP_WED(WED_TX_MIB(0)), -+ DUMP_WED_RING(WED_RING_TX(0)), -+ -+ DUMP_WED(WED_TX_MIB(1)), -+ DUMP_WED_RING(WED_RING_TX(1)), -+ -+ DUMP_STR("WPDMA TX"), -+ DUMP_WED(WED_WPDMA_TX_MIB(0)), -+ DUMP_WED_RING(WED_WPDMA_RING_TX(0)), -+ DUMP_WED(WED_WPDMA_TX_COHERENT_MIB(0)), -+ -+ DUMP_WED(WED_WPDMA_TX_MIB(1)), -+ DUMP_WED_RING(WED_WPDMA_RING_TX(1)), -+ DUMP_WED(WED_WPDMA_TX_COHERENT_MIB(1)), -+ -+ DUMP_STR("WPDMA TX"), -+ DUMP_WPDMA_TX_RING(0), -+ DUMP_WPDMA_TX_RING(1), -+ -+ DUMP_STR("WED WDMA RX"), -+ DUMP_WED(WED_WDMA_RX_MIB(0)), -+ DUMP_WED_RING(WED_WDMA_RING_RX(0)), -+ DUMP_WED(WED_WDMA_RX_THRES(0)), -+ DUMP_WED(WED_WDMA_RX_RECYCLE_MIB(0)), -+ DUMP_WED(WED_WDMA_RX_PROCESSED_MIB(0)), -+ -+ DUMP_WED(WED_WDMA_RX_MIB(1)), -+ DUMP_WED_RING(WED_WDMA_RING_RX(1)), -+ DUMP_WED(WED_WDMA_RX_THRES(1)), -+ DUMP_WED(WED_WDMA_RX_RECYCLE_MIB(1)), -+ DUMP_WED(WED_WDMA_RX_PROCESSED_MIB(1)), -+ -+ DUMP_STR("WDMA RX"), -+ DUMP_WDMA(WDMA_GLO_CFG), -+ DUMP_WDMA_RING(WDMA_RING_RX(0)), -+ DUMP_WDMA_RING(WDMA_RING_RX(1)), -+ }; -+ struct mtk_wed_hw *hw = s->private; -+ struct mtk_wed_device *dev = hw->wed_dev; -+ -+ if (!dev) -+ return 0; -+ -+ dump_wed_regs(s, dev, regs, ARRAY_SIZE(regs)); -+ -+ return 0; -+} -+DEFINE_SHOW_ATTRIBUTE(wed_txinfo); -+ -+ -+static int -+mtk_wed_reg_set(void *data, u64 val) -+{ -+ struct mtk_wed_hw *hw = data; -+ -+ regmap_write(hw->regs, hw->debugfs_reg, val); -+ -+ return 0; -+} -+ -+static int -+mtk_wed_reg_get(void *data, u64 *val) -+{ -+ struct mtk_wed_hw *hw = data; -+ unsigned int regval; -+ int ret; -+ -+ ret = regmap_read(hw->regs, hw->debugfs_reg, ®val); -+ if (ret) -+ return ret; -+ -+ *val = regval; -+ -+ return 0; -+} -+ -+DEFINE_DEBUGFS_ATTRIBUTE(fops_regval, mtk_wed_reg_get, mtk_wed_reg_set, -+ "0x%08llx\n"); -+ -+void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw) -+{ -+ struct dentry *dir; -+ -+ snprintf(hw->dirname, sizeof(hw->dirname), "wed%d", hw->index); -+ dir = debugfs_create_dir(hw->dirname, NULL); -+ if (!dir) -+ return; -+ -+ hw->debugfs_dir = dir; -+ debugfs_create_u32("regidx", 0600, dir, &hw->debugfs_reg); -+ debugfs_create_file_unsafe("regval", 0600, dir, hw, &fops_regval); -+ debugfs_create_file_unsafe("txinfo", 0400, dir, hw, &wed_txinfo_fops); -+} ---- /dev/null -+++ b/drivers/net/ethernet/mediatek/mtk_wed_ops.c -@@ -0,0 +1,8 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* Copyright (C) 2020 Felix Fietkau */ -+ -+#include -+#include -+ -+const struct mtk_wed_ops __rcu *mtk_soc_wed_ops; -+EXPORT_SYMBOL_GPL(mtk_soc_wed_ops); ---- /dev/null -+++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h -@@ -0,0 +1,251 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* Copyright (C) 2020 Felix Fietkau */ -+ -+#ifndef __MTK_WED_REGS_H -+#define __MTK_WED_REGS_H -+ -+#define MTK_WDMA_DESC_CTRL_LEN1 GENMASK(14, 0) -+#define MTK_WDMA_DESC_CTRL_LAST_SEG1 BIT(15) -+#define MTK_WDMA_DESC_CTRL_BURST BIT(16) -+#define MTK_WDMA_DESC_CTRL_LEN0 GENMASK(29, 16) -+#define MTK_WDMA_DESC_CTRL_LAST_SEG0 BIT(30) -+#define MTK_WDMA_DESC_CTRL_DMA_DONE BIT(31) -+ -+struct mtk_wdma_desc { -+ __le32 buf0; -+ __le32 ctrl; -+ __le32 buf1; -+ __le32 info; -+} __packed __aligned(4); -+ -+#define MTK_WED_RESET 0x008 -+#define MTK_WED_RESET_TX_BM BIT(0) -+#define MTK_WED_RESET_TX_FREE_AGENT BIT(4) -+#define MTK_WED_RESET_WPDMA_TX_DRV BIT(8) -+#define MTK_WED_RESET_WPDMA_RX_DRV BIT(9) -+#define MTK_WED_RESET_WPDMA_INT_AGENT BIT(11) -+#define MTK_WED_RESET_WED_TX_DMA BIT(12) -+#define MTK_WED_RESET_WDMA_RX_DRV BIT(17) -+#define MTK_WED_RESET_WDMA_INT_AGENT BIT(19) -+#define MTK_WED_RESET_WED BIT(31) -+ -+#define MTK_WED_CTRL 0x00c -+#define MTK_WED_CTRL_WPDMA_INT_AGENT_EN BIT(0) -+#define MTK_WED_CTRL_WPDMA_INT_AGENT_BUSY BIT(1) -+#define MTK_WED_CTRL_WDMA_INT_AGENT_EN BIT(2) -+#define MTK_WED_CTRL_WDMA_INT_AGENT_BUSY BIT(3) -+#define MTK_WED_CTRL_WED_TX_BM_EN BIT(8) -+#define MTK_WED_CTRL_WED_TX_BM_BUSY BIT(9) -+#define MTK_WED_CTRL_WED_TX_FREE_AGENT_EN BIT(10) -+#define MTK_WED_CTRL_WED_TX_FREE_AGENT_BUSY BIT(11) -+#define MTK_WED_CTRL_RESERVE_EN BIT(12) -+#define MTK_WED_CTRL_RESERVE_BUSY BIT(13) -+#define MTK_WED_CTRL_FINAL_DIDX_READ BIT(24) -+#define MTK_WED_CTRL_MIB_READ_CLEAR BIT(28) -+ -+#define MTK_WED_EXT_INT_STATUS 0x020 -+#define MTK_WED_EXT_INT_STATUS_TF_LEN_ERR BIT(0) -+#define MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD BIT(1) -+#define MTK_WED_EXT_INT_STATUS_TKID_TITO_INVALID BIT(4) -+#define MTK_WED_EXT_INT_STATUS_TX_FBUF_LO_TH BIT(8) -+#define MTK_WED_EXT_INT_STATUS_TX_FBUF_HI_TH BIT(9) -+#define MTK_WED_EXT_INT_STATUS_RX_FBUF_LO_TH BIT(12) -+#define MTK_WED_EXT_INT_STATUS_RX_FBUF_HI_TH BIT(13) -+#define MTK_WED_EXT_INT_STATUS_RX_DRV_R_RESP_ERR BIT(16) -+#define MTK_WED_EXT_INT_STATUS_RX_DRV_W_RESP_ERR BIT(17) -+#define MTK_WED_EXT_INT_STATUS_RX_DRV_COHERENT BIT(18) -+#define MTK_WED_EXT_INT_STATUS_RX_DRV_INIT_WDMA_EN BIT(19) -+#define MTK_WED_EXT_INT_STATUS_RX_DRV_BM_DMAD_COHERENT BIT(20) -+#define MTK_WED_EXT_INT_STATUS_TX_DRV_R_RESP_ERR BIT(21) -+#define MTK_WED_EXT_INT_STATUS_TX_DRV_W_RESP_ERR BIT(22) -+#define MTK_WED_EXT_INT_STATUS_RX_DRV_DMA_RECYCLE BIT(24) -+#define MTK_WED_EXT_INT_STATUS_ERROR_MASK (MTK_WED_EXT_INT_STATUS_TF_LEN_ERR | \ -+ MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD | \ -+ MTK_WED_EXT_INT_STATUS_TKID_TITO_INVALID | \ -+ MTK_WED_EXT_INT_STATUS_RX_DRV_R_RESP_ERR | \ -+ MTK_WED_EXT_INT_STATUS_RX_DRV_W_RESP_ERR | \ -+ MTK_WED_EXT_INT_STATUS_RX_DRV_INIT_WDMA_EN | \ -+ MTK_WED_EXT_INT_STATUS_TX_DRV_R_RESP_ERR | \ -+ MTK_WED_EXT_INT_STATUS_TX_DRV_W_RESP_ERR) -+ -+#define MTK_WED_EXT_INT_MASK 0x028 -+ -+#define MTK_WED_STATUS 0x060 -+#define MTK_WED_STATUS_TX GENMASK(15, 8) -+ -+#define MTK_WED_TX_BM_CTRL 0x080 -+#define MTK_WED_TX_BM_CTRL_VLD_GRP_NUM GENMASK(6, 0) -+#define MTK_WED_TX_BM_CTRL_RSV_GRP_NUM GENMASK(22, 16) -+#define MTK_WED_TX_BM_CTRL_PAUSE BIT(28) -+ -+#define MTK_WED_TX_BM_BASE 0x084 -+ -+#define MTK_WED_TX_BM_TKID 0x088 -+#define MTK_WED_TX_BM_TKID_START GENMASK(15, 0) -+#define MTK_WED_TX_BM_TKID_END GENMASK(31, 16) -+ -+#define MTK_WED_TX_BM_BUF_LEN 0x08c -+ -+#define MTK_WED_TX_BM_INTF 0x09c -+#define MTK_WED_TX_BM_INTF_TKID GENMASK(15, 0) -+#define MTK_WED_TX_BM_INTF_TKFIFO_FDEP GENMASK(23, 16) -+#define MTK_WED_TX_BM_INTF_TKID_VALID BIT(28) -+#define MTK_WED_TX_BM_INTF_TKID_READ BIT(29) -+ -+#define MTK_WED_TX_BM_DYN_THR 0x0a0 -+#define MTK_WED_TX_BM_DYN_THR_LO GENMASK(6, 0) -+#define MTK_WED_TX_BM_DYN_THR_HI GENMASK(22, 16) -+ -+#define MTK_WED_INT_STATUS 0x200 -+#define MTK_WED_INT_MASK 0x204 -+ -+#define MTK_WED_GLO_CFG 0x208 -+#define MTK_WED_GLO_CFG_TX_DMA_EN BIT(0) -+#define MTK_WED_GLO_CFG_TX_DMA_BUSY BIT(1) -+#define MTK_WED_GLO_CFG_RX_DMA_EN BIT(2) -+#define MTK_WED_GLO_CFG_RX_DMA_BUSY BIT(3) -+#define MTK_WED_GLO_CFG_RX_BT_SIZE GENMASK(5, 4) -+#define MTK_WED_GLO_CFG_TX_WB_DDONE BIT(6) -+#define MTK_WED_GLO_CFG_BIG_ENDIAN BIT(7) -+#define MTK_WED_GLO_CFG_DIS_BT_SIZE_ALIGN BIT(8) -+#define MTK_WED_GLO_CFG_TX_BT_SIZE_LO BIT(9) -+#define MTK_WED_GLO_CFG_MULTI_DMA_EN GENMASK(11, 10) -+#define MTK_WED_GLO_CFG_FIFO_LITTLE_ENDIAN BIT(12) -+#define MTK_WED_GLO_CFG_MI_DEPTH_RD GENMASK(21, 13) -+#define MTK_WED_GLO_CFG_TX_BT_SIZE_HI GENMASK(23, 22) -+#define MTK_WED_GLO_CFG_SW_RESET BIT(24) -+#define MTK_WED_GLO_CFG_FIRST_TOKEN_ONLY BIT(26) -+#define MTK_WED_GLO_CFG_OMIT_RX_INFO BIT(27) -+#define MTK_WED_GLO_CFG_OMIT_TX_INFO BIT(28) -+#define MTK_WED_GLO_CFG_BYTE_SWAP BIT(29) -+#define MTK_WED_GLO_CFG_RX_2B_OFFSET BIT(31) -+ -+#define MTK_WED_RESET_IDX 0x20c -+#define MTK_WED_RESET_IDX_TX GENMASK(3, 0) -+#define MTK_WED_RESET_IDX_RX GENMASK(17, 16) -+ -+#define MTK_WED_TX_MIB(_n) (0x2a0 + (_n) * 4) -+ -+#define MTK_WED_RING_TX(_n) (0x300 + (_n) * 0x10) -+ -+#define MTK_WED_RING_RX(_n) (0x400 + (_n) * 0x10) -+ -+#define MTK_WED_WPDMA_INT_TRIGGER 0x504 -+#define MTK_WED_WPDMA_INT_TRIGGER_RX_DONE BIT(1) -+#define MTK_WED_WPDMA_INT_TRIGGER_TX_DONE GENMASK(5, 4) -+ -+#define MTK_WED_WPDMA_GLO_CFG 0x508 -+#define MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN BIT(0) -+#define MTK_WED_WPDMA_GLO_CFG_TX_DRV_BUSY BIT(1) -+#define MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN BIT(2) -+#define MTK_WED_WPDMA_GLO_CFG_RX_DRV_BUSY BIT(3) -+#define MTK_WED_WPDMA_GLO_CFG_RX_BT_SIZE GENMASK(5, 4) -+#define MTK_WED_WPDMA_GLO_CFG_TX_WB_DDONE BIT(6) -+#define MTK_WED_WPDMA_GLO_CFG_BIG_ENDIAN BIT(7) -+#define MTK_WED_WPDMA_GLO_CFG_DIS_BT_SIZE_ALIGN BIT(8) -+#define MTK_WED_WPDMA_GLO_CFG_TX_BT_SIZE_LO BIT(9) -+#define MTK_WED_WPDMA_GLO_CFG_MULTI_DMA_EN GENMASK(11, 10) -+#define MTK_WED_WPDMA_GLO_CFG_FIFO_LITTLE_ENDIAN BIT(12) -+#define MTK_WED_WPDMA_GLO_CFG_MI_DEPTH_RD GENMASK(21, 13) -+#define MTK_WED_WPDMA_GLO_CFG_TX_BT_SIZE_HI GENMASK(23, 22) -+#define MTK_WED_WPDMA_GLO_CFG_SW_RESET BIT(24) -+#define MTK_WED_WPDMA_GLO_CFG_FIRST_TOKEN_ONLY BIT(26) -+#define MTK_WED_WPDMA_GLO_CFG_OMIT_RX_INFO BIT(27) -+#define MTK_WED_WPDMA_GLO_CFG_OMIT_TX_INFO BIT(28) -+#define MTK_WED_WPDMA_GLO_CFG_BYTE_SWAP BIT(29) -+#define MTK_WED_WPDMA_GLO_CFG_RX_2B_OFFSET BIT(31) -+ -+#define MTK_WED_WPDMA_RESET_IDX 0x50c -+#define MTK_WED_WPDMA_RESET_IDX_TX GENMASK(3, 0) -+#define MTK_WED_WPDMA_RESET_IDX_RX GENMASK(17, 16) -+ -+#define MTK_WED_WPDMA_INT_CTRL 0x520 -+#define MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV BIT(21) -+ -+#define MTK_WED_WPDMA_INT_MASK 0x524 -+ -+#define MTK_WED_PCIE_CFG_BASE 0x560 -+ -+#define MTK_WED_PCIE_INT_TRIGGER 0x570 -+#define MTK_WED_PCIE_INT_TRIGGER_STATUS BIT(16) -+ -+#define MTK_WED_WPDMA_CFG_BASE 0x580 -+ -+#define MTK_WED_WPDMA_TX_MIB(_n) (0x5a0 + (_n) * 4) -+#define MTK_WED_WPDMA_TX_COHERENT_MIB(_n) (0x5d0 + (_n) * 4) -+ -+#define MTK_WED_WPDMA_RING_TX(_n) (0x600 + (_n) * 0x10) -+#define MTK_WED_WPDMA_RING_RX(_n) (0x700 + (_n) * 0x10) -+#define MTK_WED_WDMA_RING_RX(_n) (0x900 + (_n) * 0x10) -+#define MTK_WED_WDMA_RX_THRES(_n) (0x940 + (_n) * 0x4) -+ -+#define MTK_WED_WDMA_GLO_CFG 0xa04 -+#define MTK_WED_WDMA_GLO_CFG_TX_DRV_EN BIT(0) -+#define MTK_WED_WDMA_GLO_CFG_RX_DRV_EN BIT(2) -+#define MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY BIT(3) -+#define MTK_WED_WDMA_GLO_CFG_BT_SIZE GENMASK(5, 4) -+#define MTK_WED_WDMA_GLO_CFG_TX_WB_DDONE BIT(6) -+#define MTK_WED_WDMA_GLO_CFG_RX_DIS_FSM_AUTO_IDLE BIT(13) -+#define MTK_WED_WDMA_GLO_CFG_WCOMPLETE_SEL BIT(16) -+#define MTK_WED_WDMA_GLO_CFG_INIT_PHASE_RXDMA_BYPASS BIT(17) -+#define MTK_WED_WDMA_GLO_CFG_INIT_PHASE_BYPASS BIT(18) -+#define MTK_WED_WDMA_GLO_CFG_FSM_RETURN_IDLE BIT(19) -+#define MTK_WED_WDMA_GLO_CFG_WAIT_COHERENT BIT(20) -+#define MTK_WED_WDMA_GLO_CFG_AXI_W_AFTER_AW BIT(21) -+#define MTK_WED_WDMA_GLO_CFG_IDLE_DMAD_SUPPLY_SINGLE_W BIT(22) -+#define MTK_WED_WDMA_GLO_CFG_IDLE_DMAD_SUPPLY BIT(23) -+#define MTK_WED_WDMA_GLO_CFG_DYNAMIC_SKIP_DMAD_PREP BIT(24) -+#define MTK_WED_WDMA_GLO_CFG_DYNAMIC_DMAD_RECYCLE BIT(25) -+#define MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE BIT(26) -+#define MTK_WED_WDMA_GLO_CFG_RXDRV_CLKGATE_BYPASS BIT(30) -+ -+#define MTK_WED_WDMA_RESET_IDX 0xa08 -+#define MTK_WED_WDMA_RESET_IDX_RX GENMASK(17, 16) -+#define MTK_WED_WDMA_RESET_IDX_DRV GENMASK(25, 24) -+ -+#define MTK_WED_WDMA_INT_TRIGGER 0xa28 -+#define MTK_WED_WDMA_INT_TRIGGER_RX_DONE GENMASK(17, 16) -+ -+#define MTK_WED_WDMA_INT_CTRL 0xa2c -+#define MTK_WED_WDMA_INT_CTRL_POLL_SRC_SEL GENMASK(17, 16) -+ -+#define MTK_WED_WDMA_OFFSET0 0xaa4 -+#define MTK_WED_WDMA_OFFSET1 0xaa8 -+ -+#define MTK_WED_WDMA_RX_MIB(_n) (0xae0 + (_n) * 4) -+#define MTK_WED_WDMA_RX_RECYCLE_MIB(_n) (0xae8 + (_n) * 4) -+#define MTK_WED_WDMA_RX_PROCESSED_MIB(_n) (0xaf0 + (_n) * 4) -+ -+#define MTK_WED_RING_OFS_BASE 0x00 -+#define MTK_WED_RING_OFS_COUNT 0x04 -+#define MTK_WED_RING_OFS_CPU_IDX 0x08 -+#define MTK_WED_RING_OFS_DMA_IDX 0x0c -+ -+#define MTK_WDMA_RING_RX(_n) (0x100 + (_n) * 0x10) -+ -+#define MTK_WDMA_GLO_CFG 0x204 -+#define MTK_WDMA_GLO_CFG_RX_INFO_PRERES GENMASK(28, 26) -+ -+#define MTK_WDMA_RESET_IDX 0x208 -+#define MTK_WDMA_RESET_IDX_TX GENMASK(3, 0) -+#define MTK_WDMA_RESET_IDX_RX GENMASK(17, 16) -+ -+#define MTK_WDMA_INT_MASK 0x228 -+#define MTK_WDMA_INT_MASK_TX_DONE GENMASK(3, 0) -+#define MTK_WDMA_INT_MASK_RX_DONE GENMASK(17, 16) -+#define MTK_WDMA_INT_MASK_TX_DELAY BIT(28) -+#define MTK_WDMA_INT_MASK_TX_COHERENT BIT(29) -+#define MTK_WDMA_INT_MASK_RX_DELAY BIT(30) -+#define MTK_WDMA_INT_MASK_RX_COHERENT BIT(31) -+ -+#define MTK_WDMA_INT_GRP1 0x250 -+#define MTK_WDMA_INT_GRP2 0x254 -+ -+#define MTK_PCIE_MIRROR_MAP(n) ((n) ? 0x4 : 0x0) -+#define MTK_PCIE_MIRROR_MAP_EN BIT(0) -+#define MTK_PCIE_MIRROR_MAP_WED_ID BIT(1) -+ -+/* DMA channel mapping */ -+#define HIFSYS_DMA_AG_MAP 0x008 -+ -+#endif ---- /dev/null -+++ b/include/linux/soc/mediatek/mtk_wed.h -@@ -0,0 +1,131 @@ -+#ifndef __MTK_WED_H -+#define __MTK_WED_H -+ -+#include -+#include -+#include -+#include -+ -+#define MTK_WED_TX_QUEUES 2 -+ -+struct mtk_wed_hw; -+struct mtk_wdma_desc; -+ -+struct mtk_wed_ring { -+ struct mtk_wdma_desc *desc; -+ dma_addr_t desc_phys; -+ int size; -+ -+ u32 reg_base; -+ void __iomem *wpdma; -+}; -+ -+struct mtk_wed_device { -+#ifdef CONFIG_NET_MEDIATEK_SOC_WED -+ const struct mtk_wed_ops *ops; -+ struct device *dev; -+ struct mtk_wed_hw *hw; -+ bool init_done, running; -+ int wdma_idx; -+ int irq; -+ -+ struct mtk_wed_ring tx_ring[MTK_WED_TX_QUEUES]; -+ struct mtk_wed_ring txfree_ring; -+ struct mtk_wed_ring tx_wdma[MTK_WED_TX_QUEUES]; -+ -+ struct { -+ int size; -+ void **pages; -+ struct mtk_wdma_desc *desc; -+ dma_addr_t desc_phys; -+ } buf_ring; -+ -+ /* filled by driver: */ -+ struct { -+ struct pci_dev *pci_dev; -+ -+ u32 wpdma_phys; -+ -+ u16 token_start; -+ unsigned int nbuf; -+ -+ u32 (*init_buf)(void *ptr, dma_addr_t phys, int token_id); -+ int (*offload_enable)(struct mtk_wed_device *wed); -+ void (*offload_disable)(struct mtk_wed_device *wed); -+ } wlan; -+#endif -+}; -+ -+struct mtk_wed_ops { -+ int (*attach)(struct mtk_wed_device *dev); -+ int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring, -+ void __iomem *regs); -+ int (*txfree_ring_setup)(struct mtk_wed_device *dev, -+ void __iomem *regs); -+ void (*detach)(struct mtk_wed_device *dev); -+ -+ void (*stop)(struct mtk_wed_device *dev); -+ void (*start)(struct mtk_wed_device *dev, u32 irq_mask); -+ void (*reset_dma)(struct mtk_wed_device *dev); -+ -+ u32 (*reg_read)(struct mtk_wed_device *dev, u32 reg); -+ void (*reg_write)(struct mtk_wed_device *dev, u32 reg, u32 val); -+ -+ u32 (*irq_get)(struct mtk_wed_device *dev, u32 mask); -+ void (*irq_set_mask)(struct mtk_wed_device *dev, u32 mask); -+}; -+ -+extern const struct mtk_wed_ops __rcu *mtk_soc_wed_ops; -+ -+static inline int -+mtk_wed_device_attach(struct mtk_wed_device *dev) -+{ -+ int ret = -ENODEV; -+ -+#ifdef CONFIG_NET_MEDIATEK_SOC_WED -+ rcu_read_lock(); -+ dev->ops = rcu_dereference(mtk_soc_wed_ops); -+ if (dev->ops) -+ ret = dev->ops->attach(dev); -+ else -+ rcu_read_unlock(); -+ -+ if (ret) -+ dev->ops = NULL; -+#endif -+ -+ return ret; -+} -+ -+#ifdef CONFIG_NET_MEDIATEK_SOC_WED -+#define mtk_wed_device_active(_dev) !!(_dev)->ops -+#define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev) -+#define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask) -+#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) \ -+ (_dev)->ops->tx_ring_setup(_dev, _ring, _regs) -+#define mtk_wed_device_txfree_ring_setup(_dev, _regs) \ -+ (_dev)->ops->txfree_ring_setup(_dev, _regs) -+#define mtk_wed_device_reg_read(_dev, _reg) \ -+ (_dev)->ops->reg_read(_dev, _reg) -+#define mtk_wed_device_reg_write(_dev, _reg, _val) \ -+ (_dev)->ops->reg_write(_dev, _reg, _val) -+#define mtk_wed_device_irq_get(_dev, _mask) \ -+ (_dev)->ops->irq_get(_dev, _mask) -+#define mtk_wed_device_irq_set_mask(_dev, _mask) \ -+ (_dev)->ops->irq_set_mask(_dev, _mask) -+#else -+static inline bool mtk_wed_device_active(struct mtk_wed_device *dev) -+{ -+ return false; -+} -+#define mtk_wed_device_detach(_dev) do {} while (0) -+#define mtk_wed_device_start(_dev, _mask) do {} while (0) -+#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) -ENODEV -+#define mtk_wed_device_txfree_ring_setup(_dev, _ring, _regs) -ENODEV -+#define mtk_wed_device_reg_read(_dev, _reg) 0 -+#define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0) -+#define mtk_wed_device_irq_get(_dev, _mask) 0 -+#define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0) -+#endif -+ -+#endif diff --git a/target/linux/generic/pending-5.10/701-03-net-ethernet-mtk_eth_soc-implement-flow-offloading-t.patch b/target/linux/generic/pending-5.10/701-03-net-ethernet-mtk_eth_soc-implement-flow-offloading-t.patch deleted file mode 100644 index b9c6d4378a..0000000000 --- a/target/linux/generic/pending-5.10/701-03-net-ethernet-mtk_eth_soc-implement-flow-offloading-t.patch +++ /dev/null @@ -1,269 +0,0 @@ -From: Felix Fietkau -Date: Sat, 5 Feb 2022 18:29:22 +0100 -Subject: [PATCH] net: ethernet: mtk_eth_soc: implement flow offloading - to WED devices - -This allows hardware flow offloading from Ethernet to WLAN on MT7622 SoC - -Co-developed-by: Lorenzo Bianconi -Signed-off-by: Lorenzo Bianconi -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_ppe.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c -@@ -329,6 +329,24 @@ int mtk_foe_entry_set_pppoe(struct mtk_f - return 0; - } - -+int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq, -+ int bss, int wcid) -+{ -+ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry); -+ u32 *ib2 = mtk_foe_entry_ib2(entry); -+ -+ *ib2 &= ~MTK_FOE_IB2_PORT_MG; -+ *ib2 |= MTK_FOE_IB2_WDMA_WINFO; -+ if (wdma_idx) -+ *ib2 |= MTK_FOE_IB2_WDMA_DEVIDX; -+ -+ l2->vlan2 = FIELD_PREP(MTK_FOE_VLAN2_WINFO_BSS, bss) | -+ FIELD_PREP(MTK_FOE_VLAN2_WINFO_WCID, wcid) | -+ FIELD_PREP(MTK_FOE_VLAN2_WINFO_RING, txq); -+ -+ return 0; -+} -+ - static inline bool mtk_foe_entry_usable(struct mtk_foe_entry *entry) - { - return !(entry->ib1 & MTK_FOE_IB1_STATIC) && ---- a/drivers/net/ethernet/mediatek/mtk_ppe.h -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h -@@ -48,9 +48,9 @@ enum { - #define MTK_FOE_IB2_DEST_PORT GENMASK(7, 5) - #define MTK_FOE_IB2_MULTICAST BIT(8) - --#define MTK_FOE_IB2_WHNAT_QID2 GENMASK(13, 12) --#define MTK_FOE_IB2_WHNAT_DEVIDX BIT(16) --#define MTK_FOE_IB2_WHNAT_NAT BIT(17) -+#define MTK_FOE_IB2_WDMA_QID2 GENMASK(13, 12) -+#define MTK_FOE_IB2_WDMA_DEVIDX BIT(16) -+#define MTK_FOE_IB2_WDMA_WINFO BIT(17) - - #define MTK_FOE_IB2_PORT_MG GENMASK(17, 12) - -@@ -58,9 +58,9 @@ enum { - - #define MTK_FOE_IB2_DSCP GENMASK(31, 24) - --#define MTK_FOE_VLAN2_WHNAT_BSS GEMMASK(5, 0) --#define MTK_FOE_VLAN2_WHNAT_WCID GENMASK(13, 6) --#define MTK_FOE_VLAN2_WHNAT_RING GENMASK(15, 14) -+#define MTK_FOE_VLAN2_WINFO_BSS GENMASK(5, 0) -+#define MTK_FOE_VLAN2_WINFO_WCID GENMASK(13, 6) -+#define MTK_FOE_VLAN2_WINFO_RING GENMASK(15, 14) - - enum { - MTK_FOE_STATE_INVALID, -@@ -281,6 +281,8 @@ int mtk_foe_entry_set_ipv6_tuple(struct - int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port); - int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid); - int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid); -+int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq, -+ int bss, int wcid); - int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, - u16 timestamp); - int mtk_ppe_debugfs_init(struct mtk_ppe *ppe); ---- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -11,6 +11,7 @@ - #include - #include - #include "mtk_eth_soc.h" -+#include "mtk_wed.h" - - struct mtk_flow_data { - struct ethhdr eth; -@@ -40,6 +41,7 @@ struct mtk_flow_entry { - struct rhash_head node; - unsigned long cookie; - u16 hash; -+ s8 wed_index; - }; - - static const struct rhashtable_params mtk_flow_ht_params = { -@@ -81,6 +83,35 @@ mtk_flow_offload_mangle_eth(const struct - memcpy(dest, src, act->mangle.mask ? 2 : 4); - } - -+static int -+mtk_flow_get_wdma_info(struct net_device *dev, const u8 *addr, struct mtk_wdma_info *info) -+{ -+ struct net_device_path_ctx ctx = { -+ .dev = dev, -+ .daddr = addr, -+ }; -+ struct net_device_path path = {}; -+ -+ if (!IS_ENABLED(CONFIG_NET_MEDIATEK_SOC_WED)) -+ return -1; -+ -+ if (!dev->netdev_ops->ndo_fill_forward_path) -+ return -1; -+ -+ if (dev->netdev_ops->ndo_fill_forward_path(&ctx, &path)) -+ return -1; -+ -+ if (path.type != DEV_PATH_MTK_WDMA) -+ return -1; -+ -+ info->wdma_idx = path.mtk_wdma.wdma_idx; -+ info->queue = path.mtk_wdma.queue; -+ info->bss = path.mtk_wdma.bss; -+ info->wcid = path.mtk_wdma.wcid; -+ -+ return 0; -+} -+ - - static int - mtk_flow_mangle_ports(const struct flow_action_entry *act, -@@ -150,10 +181,20 @@ mtk_flow_get_dsa_port(struct net_device - - static int - mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe, -- struct net_device *dev) -+ struct net_device *dev, const u8 *dest_mac, -+ int *wed_index) - { -+ struct mtk_wdma_info info = {}; - int pse_port, dsa_port; - -+ if (mtk_flow_get_wdma_info(dev, dest_mac, &info) == 0) { -+ mtk_foe_entry_set_wdma(foe, info.wdma_idx, info.queue, info.bss, -+ info.wcid); -+ pse_port = 3; -+ *wed_index = info.wdma_idx; -+ goto out; -+ } -+ - dsa_port = mtk_flow_get_dsa_port(&dev); - if (dsa_port >= 0) - mtk_foe_entry_set_dsa(foe, dsa_port); -@@ -165,6 +206,7 @@ mtk_flow_set_output_device(struct mtk_et - else - return -EOPNOTSUPP; - -+out: - mtk_foe_entry_set_pse_port(foe, pse_port); - - return 0; -@@ -180,6 +222,7 @@ mtk_flow_offload_replace(struct mtk_eth - struct net_device *odev = NULL; - struct mtk_flow_entry *entry; - int offload_type = 0; -+ int wed_index = -1; - u16 addr_type = 0; - u32 timestamp; - u8 l4proto = 0; -@@ -327,10 +370,14 @@ mtk_flow_offload_replace(struct mtk_eth - if (data.pppoe.num == 1) - mtk_foe_entry_set_pppoe(&foe, data.pppoe.sid); - -- err = mtk_flow_set_output_device(eth, &foe, odev); -+ err = mtk_flow_set_output_device(eth, &foe, odev, data.eth.h_dest, -+ &wed_index); - if (err) - return err; - -+ if (wed_index >= 0 && (err = mtk_wed_flow_add(wed_index)) < 0) -+ return err; -+ - entry = kzalloc(sizeof(*entry), GFP_KERNEL); - if (!entry) - return -ENOMEM; -@@ -344,6 +391,7 @@ mtk_flow_offload_replace(struct mtk_eth - } - - entry->hash = hash; -+ entry->wed_index = wed_index; - err = rhashtable_insert_fast(ð->flow_table, &entry->node, - mtk_flow_ht_params); - if (err < 0) -@@ -354,6 +402,8 @@ clear_flow: - mtk_foe_entry_clear(ð->ppe, hash); - free: - kfree(entry); -+ if (wed_index >= 0) -+ mtk_wed_flow_remove(wed_index); - return err; - } - -@@ -370,6 +420,8 @@ mtk_flow_offload_destroy(struct mtk_eth - mtk_foe_entry_clear(ð->ppe, entry->hash); - rhashtable_remove_fast(ð->flow_table, &entry->node, - mtk_flow_ht_params); -+ if (entry->wed_index >= 0) -+ mtk_wed_flow_remove(entry->wed_index); - kfree(entry); - - return 0; ---- a/drivers/net/ethernet/mediatek/mtk_wed.h -+++ b/drivers/net/ethernet/mediatek/mtk_wed.h -@@ -7,6 +7,7 @@ - #include - #include - #include -+#include - - struct mtk_eth; - -@@ -27,6 +28,12 @@ struct mtk_wed_hw { - int index; - }; - -+struct mtk_wdma_info { -+ u8 wdma_idx; -+ u8 queue; -+ u16 wcid; -+ u8 bss; -+}; - - #ifdef CONFIG_NET_MEDIATEK_SOC_WED - static inline void ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -856,6 +856,7 @@ enum net_device_path_type { - DEV_PATH_BRIDGE, - DEV_PATH_PPPOE, - DEV_PATH_DSA, -+ DEV_PATH_MTK_WDMA, - }; - - struct net_device_path { -@@ -881,6 +882,12 @@ struct net_device_path { - int port; - u16 proto; - } dsa; -+ struct { -+ u8 wdma_idx; -+ u8 queue; -+ u16 wcid; -+ u8 bss; -+ } mtk_wdma; - }; - }; - ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -883,6 +883,10 @@ int dev_fill_forward_path(const struct n - if (WARN_ON_ONCE(last_dev == ctx.dev)) - return -1; - } -+ -+ if (!ctx.dev) -+ return ret; -+ - path = dev_fwd_path(stack); - if (!path) - return -1; diff --git a/target/linux/generic/pending-5.10/701-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch b/target/linux/generic/pending-5.10/701-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch deleted file mode 100644 index f59a364a73..0000000000 --- a/target/linux/generic/pending-5.10/701-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch +++ /dev/null @@ -1,62 +0,0 @@ -From: Felix Fietkau -Date: Sat, 5 Feb 2022 18:36:36 +0100 -Subject: [PATCH] arm64: dts: mediatek: mt7622: introduce nodes for - Wireless Ethernet Dispatch - -Introduce wed0 and wed1 nodes in order to enable offloading forwarding -between ethernet and wireless devices on the mt7622 chipset. - -Signed-off-by: Felix Fietkau ---- - ---- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi -+++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -893,6 +893,11 @@ - }; - }; - -+ hifsys: syscon@1af00000 { -+ compatible = "mediatek,mt7622-hifsys", "syscon"; -+ reg = <0 0x1af00000 0 0x70>; -+ }; -+ - ethsys: syscon@1b000000 { - compatible = "mediatek,mt7622-ethsys", - "syscon"; -@@ -911,6 +916,26 @@ - #dma-cells = <1>; - }; - -+ pcie_mirror: pcie-mirror@10000400 { -+ compatible = "mediatek,mt7622-pcie-mirror", -+ "syscon"; -+ reg = <0 0x10000400 0 0x10>; -+ }; -+ -+ wed0: wed@1020a000 { -+ compatible = "mediatek,mt7622-wed", -+ "syscon"; -+ reg = <0 0x1020a000 0 0x1000>; -+ interrupts = ; -+ }; -+ -+ wed1: wed@1020b000 { -+ compatible = "mediatek,mt7622-wed", -+ "syscon"; -+ reg = <0 0x1020b000 0 0x1000>; -+ interrupts = ; -+ }; -+ - eth: ethernet@1b100000 { - compatible = "mediatek,mt7622-eth", - "mediatek,mt2701-eth", -@@ -938,6 +963,9 @@ - mediatek,ethsys = <ðsys>; - mediatek,sgmiisys = <&sgmiisys>; - mediatek,cci-control = <&cci_control2>; -+ mediatek,wed = <&wed0>, <&wed1>; -+ mediatek,pcie-mirror = <&pcie_mirror>; -+ mediatek,hifsys = <&hifsys>; - dma-coherent; - #address-cells = <1>; - #size-cells = <0>; diff --git a/target/linux/generic/pending-5.10/701-05-net-ethernet-mtk_eth_soc-add-ipv6-flow-offload-suppo.patch b/target/linux/generic/pending-5.10/701-05-net-ethernet-mtk_eth_soc-add-ipv6-flow-offload-suppo.patch deleted file mode 100644 index 925c16ac69..0000000000 --- a/target/linux/generic/pending-5.10/701-05-net-ethernet-mtk_eth_soc-add-ipv6-flow-offload-suppo.patch +++ /dev/null @@ -1,79 +0,0 @@ -From: David Bentham -Date: Mon, 21 Feb 2022 15:36:16 +0100 -Subject: [PATCH] net: ethernet: mtk_eth_soc: add ipv6 flow offload - support - -Add the missing IPv6 flow offloading support for routing only. -Hardware flow offloading is done by the packet processing engine (PPE) -of the Ethernet MAC and as it doesn't support mangling of IPv6 packets, -IPv6 NAT cannot be supported. - -Signed-off-by: David Bentham -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -7,6 +7,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -21,6 +22,11 @@ struct mtk_flow_data { - __be32 src_addr; - __be32 dst_addr; - } v4; -+ -+ struct { -+ struct in6_addr src_addr; -+ struct in6_addr dst_addr; -+ } v6; - }; - - __be16 src_port; -@@ -66,6 +72,14 @@ mtk_flow_set_ipv4_addr(struct mtk_foe_en - data->v4.dst_addr, data->dst_port); - } - -+static int -+mtk_flow_set_ipv6_addr(struct mtk_foe_entry *foe, struct mtk_flow_data *data) -+{ -+ return mtk_foe_entry_set_ipv6_tuple(foe, -+ data->v6.src_addr.s6_addr32, data->src_port, -+ data->v6.dst_addr.s6_addr32, data->dst_port); -+} -+ - static void - mtk_flow_offload_mangle_eth(const struct flow_action_entry *act, void *eth) - { -@@ -297,6 +311,9 @@ mtk_flow_offload_replace(struct mtk_eth - case FLOW_DISSECTOR_KEY_IPV4_ADDRS: - offload_type = MTK_PPE_PKT_TYPE_IPV4_HNAPT; - break; -+ case FLOW_DISSECTOR_KEY_IPV6_ADDRS: -+ offload_type = MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T; -+ break; - default: - return -EOPNOTSUPP; - } -@@ -332,6 +349,17 @@ mtk_flow_offload_replace(struct mtk_eth - mtk_flow_set_ipv4_addr(&foe, &data, false); - } - -+ if (addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) { -+ struct flow_match_ipv6_addrs addrs; -+ -+ flow_rule_match_ipv6_addrs(rule, &addrs); -+ -+ data.v6.src_addr = addrs.key->src; -+ data.v6.dst_addr = addrs.key->dst; -+ -+ mtk_flow_set_ipv6_addr(&foe, &data); -+ } -+ - flow_action_for_each(i, act, &rule->action) { - if (act->id != FLOW_ACTION_MANGLE) - continue; diff --git a/target/linux/generic/pending-5.10/701-07-net-ethernet-mtk_eth_soc-allocate-struct-mtk_ppe-sep.patch b/target/linux/generic/pending-5.10/701-07-net-ethernet-mtk_eth_soc-allocate-struct-mtk_ppe-sep.patch deleted file mode 100644 index 87fb1f49d6..0000000000 --- a/target/linux/generic/pending-5.10/701-07-net-ethernet-mtk_eth_soc-allocate-struct-mtk_ppe-sep.patch +++ /dev/null @@ -1,159 +0,0 @@ -From: Felix Fietkau -Date: Mon, 21 Feb 2022 15:38:20 +0100 -Subject: [PATCH] net: ethernet: mtk_eth_soc: allocate struct mtk_ppe - separately - -Preparation for adding more data to it, which will increase its size. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -2330,7 +2330,7 @@ static int mtk_open(struct net_device *d - return err; - } - -- if (eth->soc->offload_version && mtk_ppe_start(ð->ppe) == 0) -+ if (eth->soc->offload_version && mtk_ppe_start(eth->ppe) == 0) - gdm_config = MTK_GDMA_TO_PPE; - - mtk_gdm_config(eth, gdm_config); -@@ -2404,7 +2404,7 @@ static int mtk_stop(struct net_device *d - mtk_dma_free(eth); - - if (eth->soc->offload_version) -- mtk_ppe_stop(ð->ppe); -+ mtk_ppe_stop(eth->ppe); - - return 0; - } -@@ -3290,10 +3290,11 @@ static int mtk_probe(struct platform_dev - } - - if (eth->soc->offload_version) { -- err = mtk_ppe_init(ð->ppe, eth->dev, -- eth->base + MTK_ETH_PPE_BASE, 2); -- if (err) -+ eth->ppe = mtk_ppe_init(eth->dev, eth->base + MTK_ETH_PPE_BASE, 2); -+ if (!eth->ppe) { -+ err = -ENOMEM; - goto err_free_dev; -+ } - - err = mtk_eth_offload_init(eth); - if (err) ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -977,7 +977,7 @@ struct mtk_eth { - u32 rx_dma_l4_valid; - int ip_align; - -- struct mtk_ppe ppe; -+ struct mtk_ppe *ppe; - struct rhashtable flow_table; - }; - ---- a/drivers/net/ethernet/mediatek/mtk_ppe.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c -@@ -384,10 +384,15 @@ int mtk_foe_entry_commit(struct mtk_ppe - return hash; - } - --int mtk_ppe_init(struct mtk_ppe *ppe, struct device *dev, void __iomem *base, -+struct mtk_ppe *mtk_ppe_init(struct device *dev, void __iomem *base, - int version) - { - struct mtk_foe_entry *foe; -+ struct mtk_ppe *ppe; -+ -+ ppe = devm_kzalloc(dev, sizeof(*ppe), GFP_KERNEL); -+ if (!ppe) -+ return NULL; - - /* need to allocate a separate device, since it PPE DMA access is - * not coherent. -@@ -399,13 +404,13 @@ int mtk_ppe_init(struct mtk_ppe *ppe, st - foe = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*foe), - &ppe->foe_phys, GFP_KERNEL); - if (!foe) -- return -ENOMEM; -+ return NULL; - - ppe->foe_table = foe; - - mtk_ppe_debugfs_init(ppe); - -- return 0; -+ return ppe; - } - - static void mtk_ppe_init_foe_table(struct mtk_ppe *ppe) ---- a/drivers/net/ethernet/mediatek/mtk_ppe.h -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h -@@ -246,8 +246,7 @@ struct mtk_ppe { - void *acct_table; - }; - --int mtk_ppe_init(struct mtk_ppe *ppe, struct device *dev, void __iomem *base, -- int version); -+struct mtk_ppe *mtk_ppe_init(struct device *dev, void __iomem *base, int version); - int mtk_ppe_start(struct mtk_ppe *ppe); - int mtk_ppe_stop(struct mtk_ppe *ppe); - ---- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -412,7 +412,7 @@ mtk_flow_offload_replace(struct mtk_eth - - entry->cookie = f->cookie; - timestamp = mtk_eth_timestamp(eth); -- hash = mtk_foe_entry_commit(ð->ppe, &foe, timestamp); -+ hash = mtk_foe_entry_commit(eth->ppe, &foe, timestamp); - if (hash < 0) { - err = hash; - goto free; -@@ -427,7 +427,7 @@ mtk_flow_offload_replace(struct mtk_eth - - return 0; - clear_flow: -- mtk_foe_entry_clear(ð->ppe, hash); -+ mtk_foe_entry_clear(eth->ppe, hash); - free: - kfree(entry); - if (wed_index >= 0) -@@ -445,7 +445,7 @@ mtk_flow_offload_destroy(struct mtk_eth - if (!entry) - return -ENOENT; - -- mtk_foe_entry_clear(ð->ppe, entry->hash); -+ mtk_foe_entry_clear(eth->ppe, entry->hash); - rhashtable_remove_fast(ð->flow_table, &entry->node, - mtk_flow_ht_params); - if (entry->wed_index >= 0) -@@ -467,7 +467,7 @@ mtk_flow_offload_stats(struct mtk_eth *e - if (!entry) - return -ENOENT; - -- timestamp = mtk_foe_entry_timestamp(ð->ppe, entry->hash); -+ timestamp = mtk_foe_entry_timestamp(eth->ppe, entry->hash); - if (timestamp < 0) - return -ETIMEDOUT; - -@@ -523,7 +523,7 @@ mtk_eth_setup_tc_block(struct net_device - struct flow_block_cb *block_cb; - flow_setup_cb_t *cb; - -- if (!eth->ppe.foe_table) -+ if (!eth->ppe || !eth->ppe->foe_table) - return -EOPNOTSUPP; - - if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) -@@ -575,7 +575,7 @@ int mtk_eth_setup_tc(struct net_device * - - int mtk_eth_offload_init(struct mtk_eth *eth) - { -- if (!eth->ppe.foe_table) -+ if (!eth->ppe || !eth->ppe->foe_table) - return 0; - - return rhashtable_init(ð->flow_table, &mtk_flow_ht_params); diff --git a/target/linux/generic/pending-5.10/701-08-net-ethernet-mtk_eth_soc-rework-hardware-flow-table-.patch b/target/linux/generic/pending-5.10/701-08-net-ethernet-mtk_eth_soc-rework-hardware-flow-table-.patch deleted file mode 100644 index 447a7e9dcf..0000000000 --- a/target/linux/generic/pending-5.10/701-08-net-ethernet-mtk_eth_soc-rework-hardware-flow-table-.patch +++ /dev/null @@ -1,424 +0,0 @@ -From: Felix Fietkau -Date: Mon, 21 Feb 2022 15:39:18 +0100 -Subject: [PATCH] net: ethernet: mtk_eth_soc: rework hardware flow table - management - -The hardware was designed to handle flow detection and creation of flow entries -by itself, relying on the software primarily for filling in egress routing -information. -When there is a hash collision between multiple flows, this allows the hardware -to maintain the entry for the most active flow. -Additionally, the hardware only keeps offloading active for entries with at -least 30 packets per second. - -With this rework, the code no longer creates a hardware entries directly. -Instead, the hardware entry is only created when the PPE reports a matching -unbound flow with the minimum target rate. -In order to reduce CPU overhead, looking for flows belonging to a hash entry -is rate limited to once every 100ms. - -This rework is also used as preparation for emulating bridge offload by -managing L4 offload entries on demand. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -21,6 +21,7 @@ - #include - #include - #include -+#include - #include - - #include "mtk_eth_soc.h" -@@ -1286,7 +1287,7 @@ static int mtk_poll_rx(struct napi_struc - struct net_device *netdev; - unsigned int pktlen; - dma_addr_t dma_addr; -- u32 hash; -+ u32 hash, reason; - int mac; - - ring = mtk_get_rx_ring(eth); -@@ -1365,6 +1366,11 @@ static int mtk_poll_rx(struct napi_struc - skb_set_hash(skb, hash, PKT_HASH_TYPE_L4); - } - -+ reason = FIELD_GET(MTK_RXD4_PPE_CPU_REASON, trxd.rxd4); -+ if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) -+ mtk_ppe_check_skb(eth->ppe, skb, -+ trxd.rxd4 & MTK_RXD4_FOE_ENTRY); -+ - if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX && - (trxd.rxd2 & RX_DMA_VTAG)) - __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), -@@ -3290,7 +3296,7 @@ static int mtk_probe(struct platform_dev - } - - if (eth->soc->offload_version) { -- eth->ppe = mtk_ppe_init(eth->dev, eth->base + MTK_ETH_PPE_BASE, 2); -+ eth->ppe = mtk_ppe_init(eth, eth->base + MTK_ETH_PPE_BASE, 2); - if (!eth->ppe) { - err = -ENOMEM; - goto err_free_dev; ---- a/drivers/net/ethernet/mediatek/mtk_ppe.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c -@@ -6,9 +6,12 @@ - #include - #include - #include -+#include "mtk_eth_soc.h" - #include "mtk_ppe.h" - #include "mtk_ppe_regs.h" - -+static DEFINE_SPINLOCK(ppe_lock); -+ - static void ppe_w32(struct mtk_ppe *ppe, u32 reg, u32 val) - { - writel(val, ppe->base + reg); -@@ -41,6 +44,11 @@ static u32 ppe_clear(struct mtk_ppe *ppe - return ppe_m32(ppe, reg, val, 0); - } - -+static u32 mtk_eth_timestamp(struct mtk_eth *eth) -+{ -+ return mtk_r32(eth, 0x0010) & MTK_FOE_IB1_BIND_TIMESTAMP; -+} -+ - static int mtk_ppe_wait_busy(struct mtk_ppe *ppe) - { - int ret; -@@ -353,26 +361,59 @@ static inline bool mtk_foe_entry_usable( - FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1) != MTK_FOE_STATE_BIND; - } - --int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, -- u16 timestamp) -+static bool -+mtk_flow_entry_match(struct mtk_flow_entry *entry, struct mtk_foe_entry *data) -+{ -+ int type, len; -+ -+ if ((data->ib1 ^ entry->data.ib1) & MTK_FOE_IB1_UDP) -+ return false; -+ -+ type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->data.ib1); -+ if (type > MTK_PPE_PKT_TYPE_IPV4_DSLITE) -+ len = offsetof(struct mtk_foe_entry, ipv6._rsv); -+ else -+ len = offsetof(struct mtk_foe_entry, ipv4.ib2); -+ -+ return !memcmp(&entry->data.data, &data->data, len - 4); -+} -+ -+static void -+mtk_flow_entry_update(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) - { - struct mtk_foe_entry *hwe; -- u32 hash; -+ struct mtk_foe_entry foe; - -+ spin_lock_bh(&ppe_lock); -+ if (entry->hash == 0xffff) -+ goto out; -+ -+ hwe = &ppe->foe_table[entry->hash]; -+ memcpy(&foe, hwe, sizeof(foe)); -+ if (!mtk_flow_entry_match(entry, &foe)) { -+ entry->hash = 0xffff; -+ goto out; -+ } -+ -+ entry->data.ib1 = foe.ib1; -+ -+out: -+ spin_unlock_bh(&ppe_lock); -+} -+ -+static void -+__mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, -+ u16 hash) -+{ -+ struct mtk_foe_entry *hwe; -+ u16 timestamp; -+ -+ timestamp = mtk_eth_timestamp(ppe->eth); - timestamp &= MTK_FOE_IB1_BIND_TIMESTAMP; - entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP; - entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_TIMESTAMP, timestamp); - -- hash = mtk_ppe_hash_entry(entry); - hwe = &ppe->foe_table[hash]; -- if (!mtk_foe_entry_usable(hwe)) { -- hwe++; -- hash++; -- -- if (!mtk_foe_entry_usable(hwe)) -- return -ENOSPC; -- } -- - memcpy(&hwe->data, &entry->data, sizeof(hwe->data)); - wmb(); - hwe->ib1 = entry->ib1; -@@ -380,13 +421,77 @@ int mtk_foe_entry_commit(struct mtk_ppe - dma_wmb(); - - mtk_ppe_cache_clear(ppe); -+} - -- return hash; -+void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) -+{ -+ spin_lock_bh(&ppe_lock); -+ hlist_del_init(&entry->list); -+ if (entry->hash != 0xffff) { -+ ppe->foe_table[entry->hash].ib1 &= ~MTK_FOE_IB1_STATE; -+ ppe->foe_table[entry->hash].ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, -+ MTK_FOE_STATE_BIND); -+ dma_wmb(); -+ } -+ entry->hash = 0xffff; -+ spin_unlock_bh(&ppe_lock); -+} -+ -+int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) -+{ -+ u32 hash = mtk_ppe_hash_entry(&entry->data); -+ -+ entry->hash = 0xffff; -+ spin_lock_bh(&ppe_lock); -+ hlist_add_head(&entry->list, &ppe->foe_flow[hash / 2]); -+ spin_unlock_bh(&ppe_lock); -+ -+ return 0; -+} -+ -+void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash) -+{ -+ struct hlist_head *head = &ppe->foe_flow[hash / 2]; -+ struct mtk_flow_entry *entry; -+ struct mtk_foe_entry *hwe = &ppe->foe_table[hash]; -+ bool found = false; -+ -+ if (hlist_empty(head)) -+ return; -+ -+ spin_lock_bh(&ppe_lock); -+ hlist_for_each_entry(entry, head, list) { -+ if (found || !mtk_flow_entry_match(entry, hwe)) { -+ if (entry->hash != 0xffff) -+ entry->hash = 0xffff; -+ continue; -+ } -+ -+ entry->hash = hash; -+ __mtk_foe_entry_commit(ppe, &entry->data, hash); -+ found = true; -+ } -+ spin_unlock_bh(&ppe_lock); -+} -+ -+int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) -+{ -+ u16 now = mtk_eth_timestamp(ppe->eth) & MTK_FOE_IB1_BIND_TIMESTAMP; -+ u16 timestamp; -+ -+ mtk_flow_entry_update(ppe, entry); -+ timestamp = entry->data.ib1 & MTK_FOE_IB1_BIND_TIMESTAMP; -+ -+ if (timestamp > now) -+ return MTK_FOE_IB1_BIND_TIMESTAMP + 1 - timestamp + now; -+ else -+ return now - timestamp; - } - --struct mtk_ppe *mtk_ppe_init(struct device *dev, void __iomem *base, -+struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, - int version) - { -+ struct device *dev = eth->dev; - struct mtk_foe_entry *foe; - struct mtk_ppe *ppe; - -@@ -398,6 +503,7 @@ struct mtk_ppe *mtk_ppe_init(struct devi - * not coherent. - */ - ppe->base = base; -+ ppe->eth = eth; - ppe->dev = dev; - ppe->version = version; - ---- a/drivers/net/ethernet/mediatek/mtk_ppe.h -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h -@@ -235,7 +235,17 @@ enum { - MTK_PPE_CPU_REASON_INVALID = 0x1f, - }; - -+struct mtk_flow_entry { -+ struct rhash_head node; -+ struct hlist_node list; -+ unsigned long cookie; -+ struct mtk_foe_entry data; -+ u16 hash; -+ s8 wed_index; -+}; -+ - struct mtk_ppe { -+ struct mtk_eth *eth; - struct device *dev; - void __iomem *base; - int version; -@@ -243,18 +253,33 @@ struct mtk_ppe { - struct mtk_foe_entry *foe_table; - dma_addr_t foe_phys; - -+ u16 foe_check_time[MTK_PPE_ENTRIES]; -+ struct hlist_head foe_flow[MTK_PPE_ENTRIES / 2]; -+ - void *acct_table; - }; - --struct mtk_ppe *mtk_ppe_init(struct device *dev, void __iomem *base, int version); -+struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version); - int mtk_ppe_start(struct mtk_ppe *ppe); - int mtk_ppe_stop(struct mtk_ppe *ppe); - -+void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash); -+ - static inline void --mtk_foe_entry_clear(struct mtk_ppe *ppe, u16 hash) -+mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash) - { -- ppe->foe_table[hash].ib1 = 0; -- dma_wmb(); -+ u16 now, diff; -+ -+ if (!ppe) -+ return; -+ -+ now = (u16)jiffies; -+ diff = now - ppe->foe_check_time[hash]; -+ if (diff < HZ / 10) -+ return; -+ -+ ppe->foe_check_time[hash] = now; -+ __mtk_ppe_check_skb(ppe, skb, hash); - } - - static inline int -@@ -282,8 +307,9 @@ int mtk_foe_entry_set_vlan(struct mtk_fo - int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid); - int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq, - int bss, int wcid); --int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, -- u16 timestamp); -+int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); -+void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); -+int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); - int mtk_ppe_debugfs_init(struct mtk_ppe *ppe); - - #endif ---- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -43,13 +43,6 @@ struct mtk_flow_data { - } pppoe; - }; - --struct mtk_flow_entry { -- struct rhash_head node; -- unsigned long cookie; -- u16 hash; -- s8 wed_index; --}; -- - static const struct rhashtable_params mtk_flow_ht_params = { - .head_offset = offsetof(struct mtk_flow_entry, node), - .key_offset = offsetof(struct mtk_flow_entry, cookie), -@@ -57,12 +50,6 @@ static const struct rhashtable_params mt - .automatic_shrinking = true, - }; - --static u32 --mtk_eth_timestamp(struct mtk_eth *eth) --{ -- return mtk_r32(eth, 0x0010) & MTK_FOE_IB1_BIND_TIMESTAMP; --} -- - static int - mtk_flow_set_ipv4_addr(struct mtk_foe_entry *foe, struct mtk_flow_data *data, - bool egress) -@@ -238,10 +225,8 @@ mtk_flow_offload_replace(struct mtk_eth - int offload_type = 0; - int wed_index = -1; - u16 addr_type = 0; -- u32 timestamp; - u8 l4proto = 0; - int err = 0; -- int hash; - int i; - - if (rhashtable_lookup(ð->flow_table, &f->cookie, mtk_flow_ht_params)) -@@ -411,23 +396,21 @@ mtk_flow_offload_replace(struct mtk_eth - return -ENOMEM; - - entry->cookie = f->cookie; -- timestamp = mtk_eth_timestamp(eth); -- hash = mtk_foe_entry_commit(eth->ppe, &foe, timestamp); -- if (hash < 0) { -- err = hash; -+ memcpy(&entry->data, &foe, sizeof(entry->data)); -+ entry->wed_index = wed_index; -+ -+ if (mtk_foe_entry_commit(eth->ppe, entry) < 0) - goto free; -- } - -- entry->hash = hash; -- entry->wed_index = wed_index; - err = rhashtable_insert_fast(ð->flow_table, &entry->node, - mtk_flow_ht_params); - if (err < 0) -- goto clear_flow; -+ goto clear; - - return 0; --clear_flow: -- mtk_foe_entry_clear(eth->ppe, hash); -+ -+clear: -+ mtk_foe_entry_clear(eth->ppe, entry); - free: - kfree(entry); - if (wed_index >= 0) -@@ -445,7 +428,7 @@ mtk_flow_offload_destroy(struct mtk_eth - if (!entry) - return -ENOENT; - -- mtk_foe_entry_clear(eth->ppe, entry->hash); -+ mtk_foe_entry_clear(eth->ppe, entry); - rhashtable_remove_fast(ð->flow_table, &entry->node, - mtk_flow_ht_params); - if (entry->wed_index >= 0) -@@ -459,7 +442,6 @@ static int - mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f) - { - struct mtk_flow_entry *entry; -- int timestamp; - u32 idle; - - entry = rhashtable_lookup(ð->flow_table, &f->cookie, -@@ -467,11 +449,7 @@ mtk_flow_offload_stats(struct mtk_eth *e - if (!entry) - return -ENOENT; - -- timestamp = mtk_foe_entry_timestamp(eth->ppe, entry->hash); -- if (timestamp < 0) -- return -ETIMEDOUT; -- -- idle = mtk_eth_timestamp(eth) - timestamp; -+ idle = mtk_foe_entry_idle_time(eth->ppe, entry); - f->stats.lastused = jiffies - idle * HZ; - - return 0; diff --git a/target/linux/generic/pending-5.10/701-10-net-ethernet-mtk_eth_soc-support-creating-mac-addres.patch b/target/linux/generic/pending-5.10/701-10-net-ethernet-mtk_eth_soc-support-creating-mac-addres.patch deleted file mode 100644 index 99e597a3d1..0000000000 --- a/target/linux/generic/pending-5.10/701-10-net-ethernet-mtk_eth_soc-support-creating-mac-addres.patch +++ /dev/null @@ -1,553 +0,0 @@ -From: Felix Fietkau -Date: Wed, 23 Feb 2022 10:56:34 +0100 -Subject: [PATCH] net: ethernet: mtk_eth_soc: support creating mac - address based offload entries - -This will be used to implement a limited form of bridge offloading. -Since the hardware does not support flow table entries with just source -and destination MAC address, the driver has to emulate it. - -The hardware automatically creates entries entries for incoming flows, even -when they are bridged instead of routed, and reports when packets for these -flows have reached the minimum PPS rate for offloading. - -After this happens, we look up the L2 flow offload entry based on the MAC -header and fill in the output routing information in the flow table. -The dynamically created per-flow entries are automatically removed when -either the hardware flowtable entry expires, is replaced, or if the offload -rule they belong to is removed - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_ppe.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c -@@ -6,12 +6,22 @@ - #include - #include - #include -+#include -+#include -+#include - #include "mtk_eth_soc.h" - #include "mtk_ppe.h" - #include "mtk_ppe_regs.h" - - static DEFINE_SPINLOCK(ppe_lock); - -+static const struct rhashtable_params mtk_flow_l2_ht_params = { -+ .head_offset = offsetof(struct mtk_flow_entry, l2_node), -+ .key_offset = offsetof(struct mtk_flow_entry, data.bridge), -+ .key_len = offsetof(struct mtk_foe_bridge, key_end), -+ .automatic_shrinking = true, -+}; -+ - static void ppe_w32(struct mtk_ppe *ppe, u32 reg, u32 val) - { - writel(val, ppe->base + reg); -@@ -123,6 +133,9 @@ mtk_foe_entry_l2(struct mtk_foe_entry *e - { - int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); - -+ if (type == MTK_PPE_PKT_TYPE_BRIDGE) -+ return &entry->bridge.l2; -+ - if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) - return &entry->ipv6.l2; - -@@ -134,6 +147,9 @@ mtk_foe_entry_ib2(struct mtk_foe_entry * - { - int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1); - -+ if (type == MTK_PPE_PKT_TYPE_BRIDGE) -+ return &entry->bridge.ib2; -+ - if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) - return &entry->ipv6.ib2; - -@@ -168,7 +184,12 @@ int mtk_foe_entry_prepare(struct mtk_foe - if (type == MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T) - entry->ipv6.ports = ports_pad; - -- if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) { -+ if (type == MTK_PPE_PKT_TYPE_BRIDGE) { -+ ether_addr_copy(entry->bridge.src_mac, src_mac); -+ ether_addr_copy(entry->bridge.dest_mac, dest_mac); -+ entry->bridge.ib2 = val; -+ l2 = &entry->bridge.l2; -+ } else if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) { - entry->ipv6.ib2 = val; - l2 = &entry->ipv6.l2; - } else { -@@ -372,12 +393,96 @@ mtk_flow_entry_match(struct mtk_flow_ent - } - - static void -+__mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) -+{ -+ struct hlist_head *head; -+ struct hlist_node *tmp; -+ -+ if (entry->type == MTK_FLOW_TYPE_L2) { -+ rhashtable_remove_fast(&ppe->l2_flows, &entry->l2_node, -+ mtk_flow_l2_ht_params); -+ -+ head = &entry->l2_flows; -+ hlist_for_each_entry_safe(entry, tmp, head, l2_data.list) -+ __mtk_foe_entry_clear(ppe, entry); -+ return; -+ } -+ -+ hlist_del_init(&entry->list); -+ if (entry->hash != 0xffff) { -+ ppe->foe_table[entry->hash].ib1 &= ~MTK_FOE_IB1_STATE; -+ ppe->foe_table[entry->hash].ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, -+ MTK_FOE_STATE_BIND); -+ dma_wmb(); -+ } -+ entry->hash = 0xffff; -+ -+ if (entry->type != MTK_FLOW_TYPE_L2_SUBFLOW) -+ return; -+ -+ hlist_del_init(&entry->l2_data.list); -+ kfree(entry); -+} -+ -+static int __mtk_foe_entry_idle_time(struct mtk_ppe *ppe, u32 ib1) -+{ -+ u16 timestamp; -+ u16 now; -+ -+ now = mtk_eth_timestamp(ppe->eth) & MTK_FOE_IB1_BIND_TIMESTAMP; -+ timestamp = ib1 & MTK_FOE_IB1_BIND_TIMESTAMP; -+ -+ if (timestamp > now) -+ return MTK_FOE_IB1_BIND_TIMESTAMP + 1 - timestamp + now; -+ else -+ return now - timestamp; -+} -+ -+static void -+mtk_flow_entry_update_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) -+{ -+ struct mtk_flow_entry *cur; -+ struct mtk_foe_entry *hwe; -+ struct hlist_node *tmp; -+ int idle; -+ -+ idle = __mtk_foe_entry_idle_time(ppe, entry->data.ib1); -+ hlist_for_each_entry_safe(cur, tmp, &entry->l2_flows, l2_data.list) { -+ int cur_idle; -+ u32 ib1; -+ -+ hwe = &ppe->foe_table[cur->hash]; -+ ib1 = READ_ONCE(hwe->ib1); -+ -+ if (FIELD_GET(MTK_FOE_IB1_STATE, ib1) != MTK_FOE_STATE_BIND) { -+ cur->hash = 0xffff; -+ __mtk_foe_entry_clear(ppe, cur); -+ continue; -+ } -+ -+ cur_idle = __mtk_foe_entry_idle_time(ppe, ib1); -+ if (cur_idle >= idle) -+ continue; -+ -+ idle = cur_idle; -+ entry->data.ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP; -+ entry->data.ib1 |= hwe->ib1 & MTK_FOE_IB1_BIND_TIMESTAMP; -+ } -+} -+ -+static void - mtk_flow_entry_update(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) - { - struct mtk_foe_entry *hwe; - struct mtk_foe_entry foe; - - spin_lock_bh(&ppe_lock); -+ -+ if (entry->type == MTK_FLOW_TYPE_L2) { -+ mtk_flow_entry_update_l2(ppe, entry); -+ goto out; -+ } -+ - if (entry->hash == 0xffff) - goto out; - -@@ -419,21 +524,28 @@ __mtk_foe_entry_commit(struct mtk_ppe *p - void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) - { - spin_lock_bh(&ppe_lock); -- hlist_del_init(&entry->list); -- if (entry->hash != 0xffff) { -- ppe->foe_table[entry->hash].ib1 &= ~MTK_FOE_IB1_STATE; -- ppe->foe_table[entry->hash].ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, -- MTK_FOE_STATE_BIND); -- dma_wmb(); -- } -- entry->hash = 0xffff; -+ __mtk_foe_entry_clear(ppe, entry); - spin_unlock_bh(&ppe_lock); - } - -+static int -+mtk_foe_entry_commit_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) -+{ -+ entry->type = MTK_FLOW_TYPE_L2; -+ -+ return rhashtable_insert_fast(&ppe->l2_flows, &entry->l2_node, -+ mtk_flow_l2_ht_params); -+} -+ - int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) - { -- u32 hash = mtk_ppe_hash_entry(&entry->data); -+ int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->data.ib1); -+ u32 hash; -+ -+ if (type == MTK_PPE_PKT_TYPE_BRIDGE) -+ return mtk_foe_entry_commit_l2(ppe, entry); - -+ hash = mtk_ppe_hash_entry(&entry->data); - entry->hash = 0xffff; - spin_lock_bh(&ppe_lock); - hlist_add_head(&entry->list, &ppe->foe_flow[hash / 2]); -@@ -442,18 +554,72 @@ int mtk_foe_entry_commit(struct mtk_ppe - return 0; - } - -+static void -+mtk_foe_entry_commit_subflow(struct mtk_ppe *ppe, struct mtk_flow_entry *entry, -+ u16 hash) -+{ -+ struct mtk_flow_entry *flow_info; -+ struct mtk_foe_entry foe, *hwe; -+ struct mtk_foe_mac_info *l2; -+ u32 ib1_mask = MTK_FOE_IB1_PACKET_TYPE | MTK_FOE_IB1_UDP; -+ int type; -+ -+ flow_info = kzalloc(offsetof(struct mtk_flow_entry, l2_data.end), -+ GFP_ATOMIC); -+ if (!flow_info) -+ return; -+ -+ flow_info->l2_data.base_flow = entry; -+ flow_info->type = MTK_FLOW_TYPE_L2_SUBFLOW; -+ flow_info->hash = hash; -+ hlist_add_head(&flow_info->list, &ppe->foe_flow[hash / 2]); -+ hlist_add_head(&flow_info->l2_data.list, &entry->l2_flows); -+ -+ hwe = &ppe->foe_table[hash]; -+ memcpy(&foe, hwe, sizeof(foe)); -+ foe.ib1 &= ib1_mask; -+ foe.ib1 |= entry->data.ib1 & ~ib1_mask; -+ -+ l2 = mtk_foe_entry_l2(&foe); -+ memcpy(l2, &entry->data.bridge.l2, sizeof(*l2)); -+ -+ type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, foe.ib1); -+ if (type == MTK_PPE_PKT_TYPE_IPV4_HNAPT) -+ memcpy(&foe.ipv4.new, &foe.ipv4.orig, sizeof(foe.ipv4.new)); -+ else if (type >= MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T && l2->etype == ETH_P_IP) -+ l2->etype = ETH_P_IPV6; -+ -+ *mtk_foe_entry_ib2(&foe) = entry->data.bridge.ib2; -+ -+ __mtk_foe_entry_commit(ppe, &foe, hash); -+} -+ - void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash) - { - struct hlist_head *head = &ppe->foe_flow[hash / 2]; -- struct mtk_flow_entry *entry; - struct mtk_foe_entry *hwe = &ppe->foe_table[hash]; -+ struct mtk_flow_entry *entry; -+ struct mtk_foe_bridge key = {}; -+ struct ethhdr *eh; - bool found = false; -- -- if (hlist_empty(head)) -- return; -+ u8 *tag; - - spin_lock_bh(&ppe_lock); -+ -+ if (FIELD_GET(MTK_FOE_IB1_STATE, hwe->ib1) == MTK_FOE_STATE_BIND) -+ goto out; -+ - hlist_for_each_entry(entry, head, list) { -+ if (entry->type == MTK_FLOW_TYPE_L2_SUBFLOW) { -+ if (unlikely(FIELD_GET(MTK_FOE_IB1_STATE, hwe->ib1) == -+ MTK_FOE_STATE_BIND)) -+ continue; -+ -+ entry->hash = 0xffff; -+ __mtk_foe_entry_clear(ppe, entry); -+ continue; -+ } -+ - if (found || !mtk_flow_entry_match(entry, hwe)) { - if (entry->hash != 0xffff) - entry->hash = 0xffff; -@@ -464,21 +630,50 @@ void __mtk_ppe_check_skb(struct mtk_ppe - __mtk_foe_entry_commit(ppe, &entry->data, hash); - found = true; - } -+ -+ if (found) -+ goto out; -+ -+ eh = eth_hdr(skb); -+ ether_addr_copy(key.dest_mac, eh->h_dest); -+ ether_addr_copy(key.src_mac, eh->h_source); -+ tag = skb->data - 2; -+ key.vlan = 0; -+ switch (skb->protocol) { -+#if IS_ENABLED(CONFIG_NET_DSA) -+ case htons(ETH_P_XDSA): -+ if (!netdev_uses_dsa(skb->dev) || -+ skb->dev->dsa_ptr->tag_ops->proto != DSA_TAG_PROTO_MTK) -+ goto out; -+ -+ tag += 4; -+ if (get_unaligned_be16(tag) != ETH_P_8021Q) -+ break; -+ -+ fallthrough; -+#endif -+ case htons(ETH_P_8021Q): -+ key.vlan = get_unaligned_be16(tag + 2) & VLAN_VID_MASK; -+ break; -+ default: -+ break; -+ } -+ -+ entry = rhashtable_lookup_fast(&ppe->l2_flows, &key, mtk_flow_l2_ht_params); -+ if (!entry) -+ goto out; -+ -+ mtk_foe_entry_commit_subflow(ppe, entry, hash); -+ -+out: - spin_unlock_bh(&ppe_lock); - } - - int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) - { -- u16 now = mtk_eth_timestamp(ppe->eth) & MTK_FOE_IB1_BIND_TIMESTAMP; -- u16 timestamp; -- - mtk_flow_entry_update(ppe, entry); -- timestamp = entry->data.ib1 & MTK_FOE_IB1_BIND_TIMESTAMP; - -- if (timestamp > now) -- return MTK_FOE_IB1_BIND_TIMESTAMP + 1 - timestamp + now; -- else -- return now - timestamp; -+ return __mtk_foe_entry_idle_time(ppe, entry->data.ib1); - } - - struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, -@@ -492,6 +687,8 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ - if (!ppe) - return NULL; - -+ rhashtable_init(&ppe->l2_flows, &mtk_flow_l2_ht_params); -+ - /* need to allocate a separate device, since it PPE DMA access is - * not coherent. - */ ---- a/drivers/net/ethernet/mediatek/mtk_ppe.h -+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h -@@ -6,6 +6,7 @@ - - #include - #include -+#include - - #define MTK_ETH_PPE_BASE 0xc00 - -@@ -84,19 +85,16 @@ struct mtk_foe_mac_info { - u16 src_mac_lo; - }; - -+/* software-only entry type */ - struct mtk_foe_bridge { -- u32 dest_mac_hi; -- -- u16 src_mac_lo; -- u16 dest_mac_lo; -+ u8 dest_mac[ETH_ALEN]; -+ u8 src_mac[ETH_ALEN]; -+ u16 vlan; - -- u32 src_mac_hi; -+ struct {} key_end; - - u32 ib2; - -- u32 _rsv[5]; -- -- u32 udf_tsid; - struct mtk_foe_mac_info l2; - }; - -@@ -235,13 +233,33 @@ enum { - MTK_PPE_CPU_REASON_INVALID = 0x1f, - }; - -+enum { -+ MTK_FLOW_TYPE_L4, -+ MTK_FLOW_TYPE_L2, -+ MTK_FLOW_TYPE_L2_SUBFLOW, -+}; -+ - struct mtk_flow_entry { -+ union { -+ struct hlist_node list; -+ struct { -+ struct rhash_head l2_node; -+ struct hlist_head l2_flows; -+ }; -+ }; -+ u8 type; -+ s8 wed_index; -+ u16 hash; -+ union { -+ struct mtk_foe_entry data; -+ struct { -+ struct mtk_flow_entry *base_flow; -+ struct hlist_node list; -+ struct {} end; -+ } l2_data; -+ }; - struct rhash_head node; -- struct hlist_node list; - unsigned long cookie; -- struct mtk_foe_entry data; -- u16 hash; -- s8 wed_index; - }; - - struct mtk_ppe { -@@ -256,6 +274,8 @@ struct mtk_ppe { - u16 foe_check_time[MTK_PPE_ENTRIES]; - struct hlist_head foe_flow[MTK_PPE_ENTRIES / 2]; - -+ struct rhashtable l2_flows; -+ - void *acct_table; - }; - ---- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -32,6 +32,8 @@ struct mtk_flow_data { - __be16 src_port; - __be16 dst_port; - -+ u16 vlan_in; -+ - struct { - u16 id; - __be16 proto; -@@ -258,9 +260,45 @@ mtk_flow_offload_replace(struct mtk_eth - return -EOPNOTSUPP; - } - -+ switch (addr_type) { -+ case 0: -+ offload_type = MTK_PPE_PKT_TYPE_BRIDGE; -+ if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ETH_ADDRS)) { -+ struct flow_match_eth_addrs match; -+ -+ flow_rule_match_eth_addrs(rule, &match); -+ memcpy(data.eth.h_dest, match.key->dst, ETH_ALEN); -+ memcpy(data.eth.h_source, match.key->src, ETH_ALEN); -+ } else { -+ return -EOPNOTSUPP; -+ } -+ -+ if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_VLAN)) { -+ struct flow_match_vlan match; -+ -+ flow_rule_match_vlan(rule, &match); -+ -+ if (match.key->vlan_tpid != cpu_to_be16(ETH_P_8021Q)) -+ return -EOPNOTSUPP; -+ -+ data.vlan_in = match.key->vlan_id; -+ } -+ break; -+ case FLOW_DISSECTOR_KEY_IPV4_ADDRS: -+ offload_type = MTK_PPE_PKT_TYPE_IPV4_HNAPT; -+ break; -+ case FLOW_DISSECTOR_KEY_IPV6_ADDRS: -+ offload_type = MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T; -+ break; -+ default: -+ return -EOPNOTSUPP; -+ } -+ - flow_action_for_each(i, act, &rule->action) { - switch (act->id) { - case FLOW_ACTION_MANGLE: -+ if (offload_type == MTK_PPE_PKT_TYPE_BRIDGE) -+ return -EOPNOTSUPP; - if (act->mangle.htype == FLOW_ACT_MANGLE_HDR_TYPE_ETH) - mtk_flow_offload_mangle_eth(act, &data.eth); - break; -@@ -292,17 +330,6 @@ mtk_flow_offload_replace(struct mtk_eth - } - } - -- switch (addr_type) { -- case FLOW_DISSECTOR_KEY_IPV4_ADDRS: -- offload_type = MTK_PPE_PKT_TYPE_IPV4_HNAPT; -- break; -- case FLOW_DISSECTOR_KEY_IPV6_ADDRS: -- offload_type = MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T; -- break; -- default: -- return -EOPNOTSUPP; -- } -- - if (!is_valid_ether_addr(data.eth.h_source) || - !is_valid_ether_addr(data.eth.h_dest)) - return -EINVAL; -@@ -316,10 +343,13 @@ mtk_flow_offload_replace(struct mtk_eth - if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_PORTS)) { - struct flow_match_ports ports; - -+ if (offload_type == MTK_PPE_PKT_TYPE_BRIDGE) -+ return -EOPNOTSUPP; -+ - flow_rule_match_ports(rule, &ports); - data.src_port = ports.key->src; - data.dst_port = ports.key->dst; -- } else { -+ } else if (offload_type != MTK_PPE_PKT_TYPE_BRIDGE) { - return -EOPNOTSUPP; - } - -@@ -349,6 +379,9 @@ mtk_flow_offload_replace(struct mtk_eth - if (act->id != FLOW_ACTION_MANGLE) - continue; - -+ if (offload_type == MTK_PPE_PKT_TYPE_BRIDGE) -+ return -EOPNOTSUPP; -+ - switch (act->mangle.htype) { - case FLOW_ACT_MANGLE_HDR_TYPE_TCP: - case FLOW_ACT_MANGLE_HDR_TYPE_UDP: -@@ -374,6 +407,9 @@ mtk_flow_offload_replace(struct mtk_eth - return err; - } - -+ if (offload_type == MTK_PPE_PKT_TYPE_BRIDGE) -+ foe.bridge.vlan = data.vlan_in; -+ - if (data.vlan.num == 1) { - if (data.vlan.proto != htons(ETH_P_8021Q)) - return -EOPNOTSUPP; diff --git a/target/linux/generic/pending-5.10/703-phy-add-detach-callback-to-struct-phy_driver.patch b/target/linux/generic/pending-5.10/703-phy-add-detach-callback-to-struct-phy_driver.patch deleted file mode 100644 index 068ed323a9..0000000000 --- a/target/linux/generic/pending-5.10/703-phy-add-detach-callback-to-struct-phy_driver.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: Gabor Juhos -Subject: generic: add detach callback to struct phy_driver - -lede-commit: fe61fc2d7d0b3fb348b502f68f98243b3ddf5867 - -Signed-off-by: Gabor Juhos ---- - drivers/net/phy/phy_device.c | 3 +++ - include/linux/phy.h | 6 ++++++ - 2 files changed, 9 insertions(+) - ---- a/drivers/net/phy/phy_device.c -+++ b/drivers/net/phy/phy_device.c -@@ -1652,6 +1652,9 @@ void phy_detach(struct phy_device *phyde - struct module *ndev_owner = NULL; - struct mii_bus *bus; - -+ if (phydev->drv && phydev->drv->detach) -+ phydev->drv->detach(phydev); -+ - if (phydev->sysfs_links) { - if (dev) - sysfs_remove_link(&dev->dev.kobj, "phydev"); ---- a/include/linux/phy.h -+++ b/include/linux/phy.h -@@ -765,6 +765,12 @@ struct phy_driver { - /** @handle_interrupt: Override default interrupt handling */ - irqreturn_t (*handle_interrupt)(struct phy_device *phydev); - -+ /* -+ * Called before an ethernet device is detached -+ * from the PHY. -+ */ -+ void (*detach)(struct phy_device *phydev); -+ - /** @remove: Clears up any memory if needed */ - void (*remove)(struct phy_device *phydev); - diff --git a/target/linux/generic/pending-5.10/704-00-netfilter-flowtable-fix-excessive-hw-offload-attempt.patch b/target/linux/generic/pending-5.10/704-00-netfilter-flowtable-fix-excessive-hw-offload-attempt.patch deleted file mode 100644 index 67a72f825a..0000000000 --- a/target/linux/generic/pending-5.10/704-00-netfilter-flowtable-fix-excessive-hw-offload-attempt.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: Felix Fietkau -Date: Fri, 6 May 2022 12:37:23 +0200 -Subject: [PATCH] netfilter: flowtable: fix excessive hw offload attempts - after failure - -If a flow cannot be offloaded, the code currently repeatedly tries again as -quickly as possible, which can significantly increase system load. -Fix this by limiting flow timeout update and hardware offload retry to once -per second. - -Signed-off-by: Felix Fietkau ---- - ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -318,8 +318,10 @@ void flow_offload_refresh(struct nf_flow - u32 timeout; - - timeout = nf_flowtable_time_stamp + flow_offload_get_timeout(flow); -- if (READ_ONCE(flow->timeout) != timeout) -+ if (timeout - READ_ONCE(flow->timeout) > HZ) - WRITE_ONCE(flow->timeout, timeout); -+ else -+ return; - - if (likely(!nf_flowtable_hw_offload(flow_table))) - return; diff --git a/target/linux/generic/pending-5.10/704-01-netfilter-nft_flow_offload-skip-dst-neigh-lookup-for.patch b/target/linux/generic/pending-5.10/704-01-netfilter-nft_flow_offload-skip-dst-neigh-lookup-for.patch deleted file mode 100644 index 6683a53f76..0000000000 --- a/target/linux/generic/pending-5.10/704-01-netfilter-nft_flow_offload-skip-dst-neigh-lookup-for.patch +++ /dev/null @@ -1,64 +0,0 @@ -From: Felix Fietkau -Date: Fri, 6 May 2022 12:43:58 +0200 -Subject: [PATCH] netfilter: nft_flow_offload: skip dst neigh lookup for - ppp devices - -The dst entry does not contain a valid hardware address, so skip the lookup -in order to avoid running into errors here. -The proper hardware address is filled in from nft_dev_path_info - -Signed-off-by: Felix Fietkau ---- - ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -36,6 +36,15 @@ static void nft_default_forward_path(str - route->tuple[dir].xmit_type = nft_xmit_type(dst_cache); - } - -+static bool nft_is_valid_ether_device(const struct net_device *dev) -+{ -+ if (!dev || (dev->flags & IFF_LOOPBACK) || dev->type != ARPHRD_ETHER || -+ dev->addr_len != ETH_ALEN || !is_valid_ether_addr(dev->dev_addr)) -+ return false; -+ -+ return true; -+} -+ - static int nft_dev_fill_forward_path(const struct nf_flow_route *route, - const struct dst_entry *dst_cache, - const struct nf_conn *ct, -@@ -47,6 +56,9 @@ static int nft_dev_fill_forward_path(con - struct neighbour *n; - u8 nud_state; - -+ if (!nft_is_valid_ether_device(dev)) -+ goto out; -+ - n = dst_neigh_lookup(dst_cache, daddr); - if (!n) - return -1; -@@ -60,6 +72,7 @@ static int nft_dev_fill_forward_path(con - if (!(nud_state & NUD_VALID)) - return -1; - -+out: - return dev_fill_forward_path(dev, ha, stack); - } - -@@ -78,15 +91,6 @@ struct nft_forward_info { - enum flow_offload_xmit_type xmit_type; - }; - --static bool nft_is_valid_ether_device(const struct net_device *dev) --{ -- if (!dev || (dev->flags & IFF_LOOPBACK) || dev->type != ARPHRD_ETHER || -- dev->addr_len != ETH_ALEN || !is_valid_ether_addr(dev->dev_addr)) -- return false; -- -- return true; --} -- - static void nft_dev_path_info(const struct net_device_path_stack *stack, - struct nft_forward_info *info, - unsigned char *ha, struct nf_flowtable *flowtable) diff --git a/target/linux/generic/pending-5.10/704-02-net-fix-dev_fill_forward_path-with-pppoe-bridge.patch b/target/linux/generic/pending-5.10/704-02-net-fix-dev_fill_forward_path-with-pppoe-bridge.patch deleted file mode 100644 index c0660e50c4..0000000000 --- a/target/linux/generic/pending-5.10/704-02-net-fix-dev_fill_forward_path-with-pppoe-bridge.patch +++ /dev/null @@ -1,66 +0,0 @@ -From: Felix Fietkau -Date: Fri, 6 May 2022 13:54:44 +0200 -Subject: [PATCH] net: fix dev_fill_forward_path with pppoe + bridge - -When calling dev_fill_forward_path on a pppoe device, the provided destination -address is invalid. In order for the bridge fdb lookup to succeed, the pppoe -code needs to update ctx->daddr to the correct value. -Fix this by storing the address inside struct net_device_path_ctx - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -91,7 +91,6 @@ mtk_flow_get_wdma_info(struct net_device - { - struct net_device_path_ctx ctx = { - .dev = dev, -- .daddr = addr, - }; - struct net_device_path path = {}; - -@@ -101,6 +100,7 @@ mtk_flow_get_wdma_info(struct net_device - if (!dev->netdev_ops->ndo_fill_forward_path) - return -1; - -+ memcpy(ctx.daddr, addr, sizeof(ctx.daddr)); - if (dev->netdev_ops->ndo_fill_forward_path(&ctx, &path)) - return -1; - ---- a/drivers/net/ppp/pppoe.c -+++ b/drivers/net/ppp/pppoe.c -@@ -988,6 +988,7 @@ static int pppoe_fill_forward_path(struc - path->encap.proto = htons(ETH_P_PPP_SES); - path->encap.id = be16_to_cpu(po->num); - memcpy(path->encap.h_dest, po->pppoe_pa.remote, ETH_ALEN); -+ memcpy(ctx->daddr, po->pppoe_pa.remote, ETH_ALEN); - path->dev = ctx->dev; - ctx->dev = dev; - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -901,7 +901,7 @@ struct net_device_path_stack { - - struct net_device_path_ctx { - const struct net_device *dev; -- const u8 *daddr; -+ u8 daddr[ETH_ALEN]; - - int num_vlans; - struct { ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -863,11 +863,11 @@ int dev_fill_forward_path(const struct n - const struct net_device *last_dev; - struct net_device_path_ctx ctx = { - .dev = dev, -- .daddr = daddr, - }; - struct net_device_path *path; - int ret = 0; - -+ memcpy(ctx.daddr, daddr, sizeof(ctx.daddr)); - stack->num_paths = 0; - while (ctx.dev && ctx.dev->netdev_ops->ndo_fill_forward_path) { - last_dev = ctx.dev; diff --git a/target/linux/generic/pending-5.10/704-03-netfilter-nft_flow_offload-fix-offload-with-pppoe-vl.patch b/target/linux/generic/pending-5.10/704-03-netfilter-nft_flow_offload-fix-offload-with-pppoe-vl.patch deleted file mode 100644 index 1e0dc9957d..0000000000 --- a/target/linux/generic/pending-5.10/704-03-netfilter-nft_flow_offload-fix-offload-with-pppoe-vl.patch +++ /dev/null @@ -1,24 +0,0 @@ -From: Felix Fietkau -Date: Fri, 6 May 2022 15:15:06 +0200 -Subject: [PATCH] netfilter: nft_flow_offload: fix offload with pppoe + - vlan - -When running a combination of PPPoE on top of a VLAN, we need to set -info->outdev to the PPPoE device, otherwise PPPoE encap is skipped -during software offload. - -Signed-off-by: Felix Fietkau ---- - ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -123,7 +123,8 @@ static void nft_dev_path_info(const stru - info->indev = NULL; - break; - } -- info->outdev = path->dev; -+ if (!info->outdev) -+ info->outdev = path->dev; - info->encap[info->num_encaps].id = path->encap.id; - info->encap[info->num_encaps].proto = path->encap.proto; - info->num_encaps++; diff --git a/target/linux/generic/pending-5.10/705-net-dsa-tag_mtk-add-padding-for-tx-packets.patch b/target/linux/generic/pending-5.10/705-net-dsa-tag_mtk-add-padding-for-tx-packets.patch deleted file mode 100644 index e27ac3595f..0000000000 --- a/target/linux/generic/pending-5.10/705-net-dsa-tag_mtk-add-padding-for-tx-packets.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Felix Fietkau -Date: Fri, 6 May 2022 21:38:42 +0200 -Subject: [PATCH] net: dsa: tag_mtk: add padding for tx packets - -Padding for transmitted packets needs to account for the special tag. -With not enough padding, garbage bytes are inserted by the switch at the -end of small packets. - -Fixes: 5cd8985a1909 ("net-next: dsa: add Mediatek tag RX/TX handler") -Signed-off-by: Felix Fietkau ---- - ---- a/net/dsa/tag_mtk.c -+++ b/net/dsa/tag_mtk.c -@@ -25,6 +25,14 @@ static struct sk_buff *mtk_tag_xmit(stru - u8 xmit_tpid; - u8 *mtk_tag; - -+ /* The Ethernet switch we are interfaced with needs packets to be at -+ * least 64 bytes (including FCS) otherwise their padding might be -+ * corrupted. With tags enabled, we need to make sure that packets are -+ * at least 68 bytes (including FCS and tag). -+ */ -+ if (__skb_put_padto(skb, ETH_ZLEN + MTK_HDR_LEN, false)) -+ return NULL; -+ - /* Build the special tag after the MAC Source Address. If VLAN header - * is present, it's required that VLAN header and special tag is - * being combined. Only in this way we can allow the switch can parse diff --git a/target/linux/generic/pending-5.10/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch b/target/linux/generic/pending-5.10/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch deleted file mode 100644 index eb0478e0c6..0000000000 --- a/target/linux/generic/pending-5.10/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch +++ /dev/null @@ -1,177 +0,0 @@ -From: Felix Fietkau -Date: Fri, 27 Aug 2021 12:22:32 +0200 -Subject: [PATCH] bridge: add knob for filtering rx/tx BPDU packets on a port - -Some devices (e.g. wireless APs) can't have devices behind them be part of -a bridge topology with redundant links, due to address limitations. -Additionally, broadcast traffic on these devices is somewhat expensive, due to -the low data rate and wakeups of clients in powersave mode. -This knob can be used to ensure that BPDU packets are never sent or forwarded -to/from these devices - -Signed-off-by: Felix Fietkau ---- - ---- a/include/linux/if_bridge.h -+++ b/include/linux/if_bridge.h -@@ -56,6 +56,7 @@ struct br_ip_list { - #define BR_MRP_AWARE BIT(17) - #define BR_MRP_LOST_CONT BIT(18) - #define BR_MRP_LOST_IN_CONT BIT(19) -+#define BR_BPDU_FILTER BIT(20) - - #define BR_DEFAULT_AGEING_TIME (300 * HZ) - ---- a/net/bridge/br_forward.c -+++ b/net/bridge/br_forward.c -@@ -191,6 +191,7 @@ out: - void br_flood(struct net_bridge *br, struct sk_buff *skb, - enum br_pkt_type pkt_type, bool local_rcv, bool local_orig) - { -+ const unsigned char *dest = eth_hdr(skb)->h_dest; - struct net_bridge_port *prev = NULL; - struct net_bridge_port *p; - -@@ -206,6 +207,10 @@ void br_flood(struct net_bridge *br, str - case BR_PKT_MULTICAST: - if (!(p->flags & BR_MCAST_FLOOD) && skb->dev != br->dev) - continue; -+ if ((p->flags & BR_BPDU_FILTER) && -+ unlikely(is_link_local_ether_addr(dest) && -+ dest[5] == 0)) -+ continue; - break; - case BR_PKT_BROADCAST: - if (!(p->flags & BR_BCAST_FLOOD) && skb->dev != br->dev) ---- a/net/bridge/br_input.c -+++ b/net/bridge/br_input.c -@@ -312,6 +312,8 @@ static rx_handler_result_t br_handle_fra - fwd_mask |= p->group_fwd_mask; - switch (dest[5]) { - case 0x00: /* Bridge Group Address */ -+ if (p->flags & BR_BPDU_FILTER) -+ goto drop; - /* If STP is turned off, - then must forward to keep loop detection */ - if (p->br->stp_enabled == BR_NO_STP || ---- a/net/bridge/br_sysfs_if.c -+++ b/net/bridge/br_sysfs_if.c -@@ -233,6 +233,7 @@ BRPORT_ATTR_FLAG(multicast_flood, BR_MCA - BRPORT_ATTR_FLAG(broadcast_flood, BR_BCAST_FLOOD); - BRPORT_ATTR_FLAG(neigh_suppress, BR_NEIGH_SUPPRESS); - BRPORT_ATTR_FLAG(isolated, BR_ISOLATED); -+BRPORT_ATTR_FLAG(bpdu_filter, BR_BPDU_FILTER); - - #ifdef CONFIG_BRIDGE_IGMP_SNOOPING - static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf) -@@ -285,6 +286,7 @@ static const struct brport_attribute *br - &brport_attr_group_fwd_mask, - &brport_attr_neigh_suppress, - &brport_attr_isolated, -+ &brport_attr_bpdu_filter, - &brport_attr_backup_port, - NULL - }; ---- a/net/bridge/br_stp_bpdu.c -+++ b/net/bridge/br_stp_bpdu.c -@@ -80,7 +80,8 @@ void br_send_config_bpdu(struct net_brid - { - unsigned char buf[35]; - -- if (p->br->stp_enabled != BR_KERNEL_STP) -+ if (p->br->stp_enabled != BR_KERNEL_STP || -+ (p->flags & BR_BPDU_FILTER)) - return; - - buf[0] = 0; -@@ -127,7 +128,8 @@ void br_send_tcn_bpdu(struct net_bridge_ - { - unsigned char buf[4]; - -- if (p->br->stp_enabled != BR_KERNEL_STP) -+ if (p->br->stp_enabled != BR_KERNEL_STP || -+ (p->flags & BR_BPDU_FILTER)) - return; - - buf[0] = 0; -@@ -172,6 +174,9 @@ void br_stp_rcv(const struct stp_proto * - if (!(br->dev->flags & IFF_UP)) - goto out; - -+ if (p->flags & BR_BPDU_FILTER) -+ goto out; -+ - if (p->state == BR_STATE_DISABLED) - goto out; - ---- a/include/uapi/linux/if_link.h -+++ b/include/uapi/linux/if_link.h -@@ -524,6 +524,7 @@ enum { - IFLA_BRPORT_BACKUP_PORT, - IFLA_BRPORT_MRP_RING_OPEN, - IFLA_BRPORT_MRP_IN_OPEN, -+ IFLA_BRPORT_BPDU_FILTER, - __IFLA_BRPORT_MAX - }; - #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) ---- a/net/bridge/br_netlink.c -+++ b/net/bridge/br_netlink.c -@@ -137,6 +137,7 @@ static inline size_t br_port_info_size(v - + nla_total_size(1) /* IFLA_BRPORT_VLAN_TUNNEL */ - + nla_total_size(1) /* IFLA_BRPORT_NEIGH_SUPPRESS */ - + nla_total_size(1) /* IFLA_BRPORT_ISOLATED */ -+ + nla_total_size(1) /* IFLA_BRPORT_BPDU_FILTER */ - + nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_ROOT_ID */ - + nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_BRIDGE_ID */ - + nla_total_size(sizeof(u16)) /* IFLA_BRPORT_DESIGNATED_PORT */ -@@ -220,7 +221,8 @@ static int br_port_fill_attrs(struct sk_ - BR_MRP_LOST_CONT)) || - nla_put_u8(skb, IFLA_BRPORT_MRP_IN_OPEN, - !!(p->flags & BR_MRP_LOST_IN_CONT)) || -- nla_put_u8(skb, IFLA_BRPORT_ISOLATED, !!(p->flags & BR_ISOLATED))) -+ nla_put_u8(skb, IFLA_BRPORT_ISOLATED, !!(p->flags & BR_ISOLATED)) || -+ nla_put_u8(skb, IFLA_BRPORT_BPDU_FILTER, !!(p->flags & BR_BPDU_FILTER))) - return -EMSGSIZE; - - timerval = br_timer_value(&p->message_age_timer); -@@ -728,6 +730,7 @@ static const struct nla_policy br_port_p - [IFLA_BRPORT_NEIGH_SUPPRESS] = { .type = NLA_U8 }, - [IFLA_BRPORT_ISOLATED] = { .type = NLA_U8 }, - [IFLA_BRPORT_BACKUP_PORT] = { .type = NLA_U32 }, -+ [IFLA_BRPORT_BPDU_FILTER] = { .type = NLA_U8 }, - }; - - /* Change the state of the port and notify spanning tree */ -@@ -826,6 +829,10 @@ static int br_setport(struct net_bridge_ - if (err) - return err; - -+ err = br_set_port_flag(p, tb, IFLA_BRPORT_BPDU_FILTER, BR_BPDU_FILTER); -+ if (err) -+ return err; -+ - br_vlan_tunnel_old = (p->flags & BR_VLAN_TUNNEL) ? true : false; - err = br_set_port_flag(p, tb, IFLA_BRPORT_VLAN_TUNNEL, BR_VLAN_TUNNEL); - if (err) ---- a/net/core/rtnetlink.c -+++ b/net/core/rtnetlink.c -@@ -55,7 +55,7 @@ - #include - - #define RTNL_MAX_TYPE 50 --#define RTNL_SLAVE_MAX_TYPE 36 -+#define RTNL_SLAVE_MAX_TYPE 37 - - struct rtnl_link { - rtnl_doit_func doit; -@@ -4684,7 +4684,9 @@ int ndo_dflt_bridge_getlink(struct sk_bu - brport_nla_put_flag(skb, flags, mask, - IFLA_BRPORT_MCAST_FLOOD, BR_MCAST_FLOOD) || - brport_nla_put_flag(skb, flags, mask, -- IFLA_BRPORT_BCAST_FLOOD, BR_BCAST_FLOOD)) { -+ IFLA_BRPORT_BCAST_FLOOD, BR_BCAST_FLOOD) || -+ brport_nla_put_flag(skb, flags, mask, -+ IFLA_BRPORT_BPDU_FILTER, BR_BPDU_FILTER)) { - nla_nest_cancel(skb, protinfo); - goto nla_put_failure; - } diff --git a/target/linux/generic/pending-5.10/730-net-phy-at803x-fix-feature-detection.patch b/target/linux/generic/pending-5.10/730-net-phy-at803x-fix-feature-detection.patch deleted file mode 100644 index c49bb19601..0000000000 --- a/target/linux/generic/pending-5.10/730-net-phy-at803x-fix-feature-detection.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 97ca310aa18a93329ef5cd68c20de89761962f45 Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Sun, 13 Jun 2021 12:19:36 +0200 -Subject: [PATCH] net: phy: at803x: fix feature detection - -AR8031/AR8033 have different status registers for copper -and fiber operation. However, the extended status register -is the same for both operation modes. - -As a result of that, ESTATUS_1000_XFULL is set to 1 even when -operating in copper TP mode. - -Remove this mode from the supported link modes, as this driver -currently only supports copper operation. - -Signed-off-by: David Bauer ---- - drivers/net/phy/at803x.c | 30 +++++++++++++++++++++++++++++- - 1 file changed, 29 insertions(+), 1 deletion(-) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -1032,6 +1032,34 @@ static int at803x_set_tunable(struct phy - } - } - -+static int at803x_get_features(struct phy_device *phydev) -+{ -+ int err; -+ -+ err = genphy_read_abilities(phydev); -+ if (err) -+ return err; -+ -+ if (!at803x_match_phy_id(phydev, ATH8031_PHY_ID)) -+ return 0; -+ -+ /* AR8031/AR8033 have different status registers -+ * for copper and fiber operation. However, the -+ * extended status register is the same for both -+ * operation modes. -+ * -+ * As a result of that, ESTATUS_1000_XFULL is set -+ * to 1 even when operating in copper TP mode. -+ * -+ * Remove this mode from the supported link modes, -+ * as this driver currently only supports copper -+ * operation. -+ */ -+ linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, -+ phydev->supported); -+ return 0; -+} -+ - static int at803x_cable_test_result_trans(u16 status) - { - switch (FIELD_GET(AT803X_CDT_STATUS_STAT_MASK, status)) { -@@ -1364,7 +1392,7 @@ static struct phy_driver at803x_driver[] - .resume = at803x_resume, - .read_page = at803x_read_page, - .write_page = at803x_write_page, -- /* PHY_GBIT_FEATURES */ -+ .get_features = at803x_get_features, - .read_status = at803x_read_status, - .aneg_done = at803x_aneg_done, - .ack_interrupt = &at803x_ack_interrupt, diff --git a/target/linux/generic/pending-5.10/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch b/target/linux/generic/pending-5.10/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch deleted file mode 100644 index e9c128a5b3..0000000000 --- a/target/linux/generic/pending-5.10/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch +++ /dev/null @@ -1,27 +0,0 @@ -From a1b291f3f6c80a6c5ccad7283fc472d77a2a4763 Mon Sep 17 00:00:00 2001 -From: Russell King -Date: Sun, 22 Dec 2019 12:40:11 +0000 -Subject: [PATCH] net: dsa: mv88e6xxx: fix vlan setup - -Provide an option that drivers can set to indicate they want to receive -vlan configuration even when vlan filtering is disabled. This is safe -for Marvell DSA bridges, which do not look up ingress traffic in the -VTU if the port is in 8021Q disabled state. Whether this change is -suitable for all DSA bridges is not known. - -Signed-off-by: Russell King -Signed-off-by: DENG Qingfang ---- - drivers/net/dsa/mv88e6xxx/chip.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/net/dsa/mv88e6xxx/chip.c -+++ b/drivers/net/dsa/mv88e6xxx/chip.c -@@ -2886,6 +2886,7 @@ static int mv88e6xxx_setup(struct dsa_sw - - chip->ds = ds; - ds->slave_mii_bus = mv88e6xxx_default_mdio_bus(chip); -+ ds->configure_vlan_while_not_filtering = true; - - mv88e6xxx_reg_lock(chip); - diff --git a/target/linux/generic/pending-5.10/762-net-bridge-switchdev-Refactor-br_switchdev_fdb_notif.patch b/target/linux/generic/pending-5.10/762-net-bridge-switchdev-Refactor-br_switchdev_fdb_notif.patch deleted file mode 100644 index fbc8342b0e..0000000000 --- a/target/linux/generic/pending-5.10/762-net-bridge-switchdev-Refactor-br_switchdev_fdb_notif.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 46fe6cecb296d850c1ee2b333e57093ac4b733f3 Mon Sep 17 00:00:00 2001 -From: Tobias Waldekranz -Date: Sat, 16 Jan 2021 02:25:09 +0100 -Subject: [PATCH] net: bridge: switchdev: Refactor br_switchdev_fdb_notify - -Instead of having to add more and more arguments to -br_switchdev_fdb_call_notifiers, get rid of it and build the info -struct directly in br_switchdev_fdb_notify. - -Signed-off-by: Tobias Waldekranz -Reviewed-by: Vladimir Oltean ---- - net/bridge/br_switchdev.c | 41 +++++++++++---------------------------- - 1 file changed, 11 insertions(+), 30 deletions(-) - ---- a/net/bridge/br_switchdev.c -+++ b/net/bridge/br_switchdev.c -@@ -102,25 +102,16 @@ int br_switchdev_set_port_flag(struct ne - return 0; - } - --static void --br_switchdev_fdb_call_notifiers(bool adding, const unsigned char *mac, -- u16 vid, struct net_device *dev, -- bool added_by_user, bool offloaded) --{ -- struct switchdev_notifier_fdb_info info; -- unsigned long notifier_type; -- -- info.addr = mac; -- info.vid = vid; -- info.added_by_user = added_by_user; -- info.offloaded = offloaded; -- notifier_type = adding ? SWITCHDEV_FDB_ADD_TO_DEVICE : SWITCHDEV_FDB_DEL_TO_DEVICE; -- call_switchdev_notifiers(notifier_type, dev, &info.info, NULL); --} -- - void - br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type) - { -+ struct switchdev_notifier_fdb_info info = { -+ .addr = fdb->key.addr.addr, -+ .vid = fdb->key.vlan_id, -+ .added_by_user = test_bit(BR_FDB_ADDED_BY_USER, &fdb->flags), -+ .offloaded = test_bit(BR_FDB_OFFLOADED, &fdb->flags), -+ }; -+ - if (!fdb->dst) - return; - if (test_bit(BR_FDB_LOCAL, &fdb->flags)) -@@ -128,22 +119,12 @@ br_switchdev_fdb_notify(const struct net - - switch (type) { - case RTM_DELNEIGH: -- br_switchdev_fdb_call_notifiers(false, fdb->key.addr.addr, -- fdb->key.vlan_id, -- fdb->dst->dev, -- test_bit(BR_FDB_ADDED_BY_USER, -- &fdb->flags), -- test_bit(BR_FDB_OFFLOADED, -- &fdb->flags)); -+ call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_DEVICE, -+ fdb->dst->dev, &info.info, NULL); - break; - case RTM_NEWNEIGH: -- br_switchdev_fdb_call_notifiers(true, fdb->key.addr.addr, -- fdb->key.vlan_id, -- fdb->dst->dev, -- test_bit(BR_FDB_ADDED_BY_USER, -- &fdb->flags), -- test_bit(BR_FDB_OFFLOADED, -- &fdb->flags)); -+ call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_DEVICE, -+ fdb->dst->dev, &info.info, NULL); - break; - } - } diff --git a/target/linux/generic/pending-5.10/763-net-bridge-switchdev-Include-local-flag-in-FDB-notif.patch b/target/linux/generic/pending-5.10/763-net-bridge-switchdev-Include-local-flag-in-FDB-notif.patch deleted file mode 100644 index 434288c3ef..0000000000 --- a/target/linux/generic/pending-5.10/763-net-bridge-switchdev-Include-local-flag-in-FDB-notif.patch +++ /dev/null @@ -1,42 +0,0 @@ -From ec5be4f79026282925ae383caa431a8d41e3456a Mon Sep 17 00:00:00 2001 -From: Tobias Waldekranz -Date: Sat, 16 Jan 2021 02:25:10 +0100 -Subject: [PATCH] net: bridge: switchdev: Include local flag in FDB - notifications - -Some switchdev drivers, notably DSA, ignore all dynamically learned -address notifications (!added_by_user) as these are autonomously added -by the switch. Previously, such a notification was indistinguishable -from a local address notification. Include a local bit in the -notification so that the two classes can be discriminated. - -This allows DSA-like devices to add local addresses to the hardware -FDB (with the CPU as the destination), thereby avoiding flows towards -the CPU being flooded by the switch as unknown unicast. - -Signed-off-by: Tobias Waldekranz ---- - include/net/switchdev.h | 1 + - net/bridge/br_switchdev.c | 1 + - 2 files changed, 2 insertions(+) - ---- a/include/net/switchdev.h -+++ b/include/net/switchdev.h -@@ -226,6 +226,7 @@ struct switchdev_notifier_fdb_info { - const unsigned char *addr; - u16 vid; - u8 added_by_user:1, -+ local:1, - offloaded:1; - }; - ---- a/net/bridge/br_switchdev.c -+++ b/net/bridge/br_switchdev.c -@@ -109,6 +109,7 @@ br_switchdev_fdb_notify(const struct net - .addr = fdb->key.addr.addr, - .vid = fdb->key.vlan_id, - .added_by_user = test_bit(BR_FDB_ADDED_BY_USER, &fdb->flags), -+ .local = test_bit(BR_FDB_LOCAL, &fdb->flags), - .offloaded = test_bit(BR_FDB_OFFLOADED, &fdb->flags), - }; - diff --git a/target/linux/generic/pending-5.10/764-net-bridge-switchdev-Send-FDB-notifications-for-host.patch b/target/linux/generic/pending-5.10/764-net-bridge-switchdev-Send-FDB-notifications-for-host.patch deleted file mode 100644 index 630e03bbfd..0000000000 --- a/target/linux/generic/pending-5.10/764-net-bridge-switchdev-Send-FDB-notifications-for-host.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 2e50fd9322047253c327550b4485cf8761035a8c Mon Sep 17 00:00:00 2001 -From: Tobias Waldekranz -Date: Sat, 16 Jan 2021 02:25:11 +0100 -Subject: [PATCH] net: bridge: switchdev: Send FDB notifications for host - addresses - -Treat addresses added to the bridge itself in the same way as regular -ports and send out a notification so that drivers may sync it down to -the hardware FDB. - -Signed-off-by: Tobias Waldekranz ---- - net/bridge/br_fdb.c | 4 ++-- - net/bridge/br_private.h | 7 ++++--- - net/bridge/br_switchdev.c | 11 +++++------ - 3 files changed, 11 insertions(+), 11 deletions(-) - ---- a/net/bridge/br_fdb.c -+++ b/net/bridge/br_fdb.c -@@ -602,7 +602,7 @@ void br_fdb_update(struct net_bridge *br - /* fastpath: update of existing entry */ - if (unlikely(source != fdb->dst && - !test_bit(BR_FDB_STICKY, &fdb->flags))) { -- br_switchdev_fdb_notify(fdb, RTM_DELNEIGH); -+ br_switchdev_fdb_notify(br, fdb, RTM_DELNEIGH); - fdb->dst = source; - fdb_modified = true; - /* Take over HW learned entry */ -@@ -735,7 +735,7 @@ static void fdb_notify(struct net_bridge - int err = -ENOBUFS; - - if (swdev_notify) -- br_switchdev_fdb_notify(fdb, type); -+ br_switchdev_fdb_notify(br, fdb, type); - - skb = nlmsg_new(fdb_nlmsg_size(), GFP_ATOMIC); - if (skb == NULL) ---- a/net/bridge/br_private.h -+++ b/net/bridge/br_private.h -@@ -1525,8 +1525,8 @@ bool nbp_switchdev_allowed_egress(const - int br_switchdev_set_port_flag(struct net_bridge_port *p, - unsigned long flags, - unsigned long mask); --void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, -- int type); -+void br_switchdev_fdb_notify(struct net_bridge *br, -+ const struct net_bridge_fdb_entry *fdb, int type); - int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags, - struct netlink_ext_ack *extack); - int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid); -@@ -1572,7 +1572,8 @@ static inline int br_switchdev_port_vlan - } - - static inline void --br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type) -+br_switchdev_fdb_notify(struct net_bridge *br, -+ const struct net_bridge_fdb_entry *fdb, int type) - { - } - ---- a/net/bridge/br_switchdev.c -+++ b/net/bridge/br_switchdev.c -@@ -103,7 +103,8 @@ int br_switchdev_set_port_flag(struct ne - } - - void --br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type) -+br_switchdev_fdb_notify(struct net_bridge *br, -+ const struct net_bridge_fdb_entry *fdb, int type) - { - struct switchdev_notifier_fdb_info info = { - .addr = fdb->key.addr.addr, -@@ -112,20 +113,19 @@ br_switchdev_fdb_notify(const struct net - .local = test_bit(BR_FDB_LOCAL, &fdb->flags), - .offloaded = test_bit(BR_FDB_OFFLOADED, &fdb->flags), - }; -+ struct net_device *dev = fdb->dst ? fdb->dst->dev : br->dev; - -- if (!fdb->dst) -- return; - if (test_bit(BR_FDB_LOCAL, &fdb->flags)) - return; - - switch (type) { - case RTM_DELNEIGH: - call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_DEVICE, -- fdb->dst->dev, &info.info, NULL); -+ dev, &info.info, NULL); - break; - case RTM_NEWNEIGH: - call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_DEVICE, -- fdb->dst->dev, &info.info, NULL); -+ dev, &info.info, NULL); - break; - } - } diff --git a/target/linux/generic/pending-5.10/765-net-dsa-Include-local-addresses-in-assisted-CPU-port.patch b/target/linux/generic/pending-5.10/765-net-dsa-Include-local-addresses-in-assisted-CPU-port.patch deleted file mode 100644 index c0b4fd1d14..0000000000 --- a/target/linux/generic/pending-5.10/765-net-dsa-Include-local-addresses-in-assisted-CPU-port.patch +++ /dev/null @@ -1,36 +0,0 @@ -From dd082716b43a3684b2f473ae5d1e76d1c076d86d Mon Sep 17 00:00:00 2001 -From: Tobias Waldekranz -Date: Sat, 16 Jan 2021 02:25:12 +0100 -Subject: [PATCH] net: dsa: Include local addresses in assisted CPU port - learning - -Add local addresses (i.e. the ports' MAC addresses) to the hardware -FDB when assisted CPU port learning is enabled. - -NOTE: The bridge's own MAC address is also "local". If that address is -not shared with any port, the bridge's MAC is not be added by this -functionality - but the following commit takes care of that case. - -Signed-off-by: Tobias Waldekranz ---- - net/dsa/slave.c | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -2192,10 +2192,12 @@ static int dsa_slave_switchdev_event(str - fdb_info = ptr; - - if (dsa_slave_dev_check(dev)) { -- if (!fdb_info->added_by_user) -- return NOTIFY_OK; -- - dp = dsa_slave_to_port(dev); -+ -+ if (fdb_info->local && dp->ds->assisted_learning_on_cpu_port) -+ dp = dp->cpu_dp; -+ else if (!fdb_info->added_by_user) -+ return NOTIFY_OK; - } else { - /* Snoop addresses learnt on foreign interfaces - * bridged with us, for switches that don't diff --git a/target/linux/generic/pending-5.10/766-net-dsa-Include-bridge-addresses-in-assisted-CPU-por.patch b/target/linux/generic/pending-5.10/766-net-dsa-Include-bridge-addresses-in-assisted-CPU-por.patch deleted file mode 100644 index 0b644d8300..0000000000 --- a/target/linux/generic/pending-5.10/766-net-dsa-Include-bridge-addresses-in-assisted-CPU-por.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 0663ebde114a6fb2c28c622ba5212b302d4d2581 Mon Sep 17 00:00:00 2001 -From: Tobias Waldekranz -Date: Sat, 16 Jan 2021 02:25:13 +0100 -Subject: [PATCH] net: dsa: Include bridge addresses in assisted CPU port - learning - -Now that notifications are sent out for addresses added to the bridge -itself, extend DSA to include those addresses in the hardware FDB when -assisted CPU port learning is enabled. - -Signed-off-by: Tobias Waldekranz ---- - net/dsa/slave.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -2206,7 +2206,11 @@ static int dsa_slave_switchdev_event(str - struct net_device *br_dev; - struct dsa_slave_priv *p; - -- br_dev = netdev_master_upper_dev_get_rcu(dev); -+ if (netif_is_bridge_master(dev)) -+ br_dev = dev; -+ else -+ br_dev = netdev_master_upper_dev_get_rcu(dev); -+ - if (!br_dev) - return NOTIFY_DONE; - diff --git a/target/linux/generic/pending-5.10/767-net-dsa-Sync-static-FDB-entries-on-foreign-interface.patch b/target/linux/generic/pending-5.10/767-net-dsa-Sync-static-FDB-entries-on-foreign-interface.patch deleted file mode 100644 index f71ea16b97..0000000000 --- a/target/linux/generic/pending-5.10/767-net-dsa-Sync-static-FDB-entries-on-foreign-interface.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 81e39fd78db82fb51b05fff309b9c521f1a0bc5a Mon Sep 17 00:00:00 2001 -From: Tobias Waldekranz -Date: Sat, 16 Jan 2021 02:25:14 +0100 -Subject: [PATCH] net: dsa: Sync static FDB entries on foreign interfaces to - hardware - -Reuse the "assisted_learning_on_cpu_port" functionality to always add -entries for user-configured entries on foreign interfaces, even if -assisted_learning_on_cpu_port is not enabled. E.g. in this situation: - - br0 - / \ -swp0 dummy0 - -$ bridge fdb add 02:00:de:ad:00:01 dev dummy0 vlan 1 master - -Results in DSA adding an entry in the hardware FDB, pointing this -address towards the CPU port. - -The same is true for entries added to the bridge itself, e.g: - -$ bridge fdb add 02:00:de:ad:00:01 dev br0 vlan 1 self - -Signed-off-by: Tobias Waldekranz ---- - net/dsa/slave.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -2199,9 +2199,12 @@ static int dsa_slave_switchdev_event(str - else if (!fdb_info->added_by_user) - return NOTIFY_OK; - } else { -- /* Snoop addresses learnt on foreign interfaces -- * bridged with us, for switches that don't -- * automatically learn SA from CPU-injected traffic -+ /* Snoop addresses added to foreign interfaces -+ * bridged with us, or the bridge -+ * itself. Dynamically learned addresses can -+ * also be added for switches that don't -+ * automatically learn SA from CPU-injected -+ * traffic. - */ - struct net_device *br_dev; - struct dsa_slave_priv *p; -@@ -2223,7 +2226,8 @@ static int dsa_slave_switchdev_event(str - - dp = p->dp->cpu_dp; - -- if (!dp->ds->assisted_learning_on_cpu_port) -+ if (!fdb_info->added_by_user && -+ !dp->ds->assisted_learning_on_cpu_port) - return NOTIFY_DONE; - } - diff --git a/target/linux/generic/pending-5.10/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch b/target/linux/generic/pending-5.10/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch deleted file mode 100644 index 7ba86c70b2..0000000000 --- a/target/linux/generic/pending-5.10/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: Tobias Waldekranz -Subject: [RFC net-next 7/7] net: dsa: mv88e6xxx: Request assisted learning on CPU port -Date: Sat, 16 Jan 2021 02:25:15 +0100 -Archived-At: - -While the hardware is capable of performing learning on the CPU port, -it requires alot of additions to the bridge's forwarding path in order -to handle multi-destination traffic correctly. - -Until that is in place, opt for the next best thing and let DSA sync -the relevant addresses down to the hardware FDB. - -Signed-off-by: Tobias Waldekranz ---- - drivers/net/dsa/mv88e6xxx/chip.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/net/dsa/mv88e6xxx/chip.c -+++ b/drivers/net/dsa/mv88e6xxx/chip.c -@@ -5455,6 +5455,7 @@ static int mv88e6xxx_register_switch(str - ds->ops = &mv88e6xxx_switch_ops; - ds->ageing_time_min = chip->info->age_time_coeff; - ds->ageing_time_max = chip->info->age_time_coeff * U8_MAX; -+ ds->assisted_learning_on_cpu_port = true; - - dev_set_drvdata(dev, ds); - diff --git a/target/linux/generic/pending-5.10/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch b/target/linux/generic/pending-5.10/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch deleted file mode 100644 index fcf7892c04..0000000000 --- a/target/linux/generic/pending-5.10/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch +++ /dev/null @@ -1,61 +0,0 @@ -From patchwork Thu Aug 5 22:23:30 2021 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12422209 -Date: Thu, 5 Aug 2021 23:23:30 +0100 -From: Daniel Golle -To: linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org, - linux-kernel@vger.kernel.org -Cc: "David S. Miller" , Andrew Lunn , - Michael Walle -Subject: [PATCH] ARM: kirkwood: add missing for ETH_ALEN -Message-ID: -MIME-Version: 1.0 -Content-Disposition: inline -X-BeenThere: linux-arm-kernel@lists.infradead.org -X-Mailman-Version: 2.1.34 -Precedence: list -List-Id: -List-Archive: -Sender: "linux-arm-kernel" - -After commit 83216e3988cd1 ("of: net: pass the dst buffer to -of_get_mac_address()") build fails for kirkwood as ETH_ALEN is not -defined. - -arch/arm/mach-mvebu/kirkwood.c: In function 'kirkwood_dt_eth_fixup': -arch/arm/mach-mvebu/kirkwood.c:87:13: error: 'ETH_ALEN' undeclared (first use in this function); did you mean 'ESTALE'? - u8 tmpmac[ETH_ALEN]; - ^~~~~~~~ - ESTALE -arch/arm/mach-mvebu/kirkwood.c:87:13: note: each undeclared identifier is reported only once for each function it appears in -arch/arm/mach-mvebu/kirkwood.c:87:6: warning: unused variable 'tmpmac' [-Wunused-variable] - u8 tmpmac[ETH_ALEN]; - ^~~~~~ -make[5]: *** [scripts/Makefile.build:262: arch/arm/mach-mvebu/kirkwood.o] Error 1 -make[5]: *** Waiting for unfinished jobs.... - -Add missing #include to fix this. - -Cc: David S. Miller -Cc: Andrew Lunn -Cc: Michael Walle -Reported-by: https://buildbot.openwrt.org/master/images/#/builders/56/builds/220/steps/44/logs/stdio -Fixes: 83216e3988cd1 ("of: net: pass the dst buffer to of_get_mac_address()") -Signed-off-by: Daniel Golle ---- - arch/arm/mach-mvebu/kirkwood.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/arch/arm/mach-mvebu/kirkwood.c -+++ b/arch/arm/mach-mvebu/kirkwood.c -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - #include - #include - #include diff --git a/target/linux/generic/pending-5.10/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch b/target/linux/generic/pending-5.10/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch deleted file mode 100644 index 511a9f7555..0000000000 --- a/target/linux/generic/pending-5.10/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch +++ /dev/null @@ -1,64 +0,0 @@ -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Subject: [PATCH] bcma: get SoC device struct & copy its DMA params to the - subdevices -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -For bus devices to be fully usable it's required to set their DMA -parameters. - -For years it has been missing and remained unnoticed because of -mips_dma_alloc_coherent() silently handling the empty coherent_dma_mask. -Kernel 4.19 came with a lot of DMA changes and caused a regression on -the bcm47xx. Starting with the commit f8c55dc6e828 ("MIPS: use generic -dma noncoherent ops for simple noncoherent platforms") DMA coherent -allocations just fail. Example: -[ 1.114914] bgmac_bcma bcma0:2: Allocation of TX ring 0x200 failed -[ 1.121215] bgmac_bcma bcma0:2: Unable to alloc memory for DMA -[ 1.127626] bgmac_bcma: probe of bcma0:2 failed with error -12 -[ 1.133838] bgmac_bcma: Broadcom 47xx GBit MAC driver loaded - -This change fixes above regression in addition to the MIPS bcm47xx -commit 321c46b91550 ("MIPS: BCM47XX: Setup struct device for the SoC"). - -It also fixes another *old* GPIO regression caused by a parent pointing -to the NULL: -[ 0.157054] missing gpiochip .dev parent pointer -[ 0.157287] bcma: bus0: Error registering GPIO driver: -22 -introduced by the commit 74f4e0cc6108 ("bcma: switch GPIO portions to -use GPIOLIB_IRQCHIP"). - -Fixes: f8c55dc6e828 ("MIPS: use generic dma noncoherent ops for simple noncoherent platforms") -Fixes: 74f4e0cc6108 ("bcma: switch GPIO portions to use GPIOLIB_IRQCHIP") -Cc: linux-mips@linux-mips.org -Cc: Christoph Hellwig -Cc: Linus Walleij -Signed-off-by: Rafał Miłecki ---- - ---- a/drivers/bcma/host_soc.c -+++ b/drivers/bcma/host_soc.c -@@ -191,6 +191,8 @@ int __init bcma_host_soc_init(struct bcm - struct bcma_bus *bus = &soc->bus; - int err; - -+ bus->dev = soc->dev; -+ - /* Scan bus and initialize it */ - err = bcma_bus_early_register(bus); - if (err) ---- a/drivers/bcma/main.c -+++ b/drivers/bcma/main.c -@@ -241,8 +241,10 @@ void bcma_prepare_core(struct bcma_bus * - core->dev.bus = &bcma_bus_type; - dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index); - core->dev.parent = bus->dev; -- if (bus->dev) -+ if (bus->dev) { - bcma_of_fill_device(bus->dev, core); -+ dma_coerce_mask_and_coherent(&core->dev, bus->dev->coherent_dma_mask); -+ } - - switch (bus->hosttype) { - case BCMA_HOSTTYPE_PCI: diff --git a/target/linux/generic/pending-5.10/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch b/target/linux/generic/pending-5.10/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch deleted file mode 100644 index af44ff24ac..0000000000 --- a/target/linux/generic/pending-5.10/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch +++ /dev/null @@ -1,222 +0,0 @@ -From fc23ea48ba52c24f201fe5ca0132ee1a3de5a70a Mon Sep 17 00:00:00 2001 -From: Mauri Sandberg -Date: Thu, 25 Mar 2021 11:48:05 +0200 -Subject: [PATCH 2/2] gpio: gpio-cascade: add generic GPIO cascade - -Adds support for building cascades of GPIO lines. That is, it allows -setups when there is one upstream line and multiple cascaded lines, out -of which one can be chosen at a time. The status of the upstream line -can be conveyed to the selected cascaded line or, vice versa, the status -of the cascaded line can be conveyed to the upstream line. - -A multiplexer is being used to select, which cascaded GPIO line is being -used at any given time. - -At the moment only input direction is supported. In future it should be -possible to add support for output direction, too. - -Signed-off-by: Mauri Sandberg -Reviewed-by: Linus Walleij -Reviewed-by: Andy Shevchenko ---- -v7 -> v8: - - rearrange members in struct gpio_cascade - - cosmetic changes in file header and in one function declaration - - added Reviewed-by tags by Linus and Andy -v6 -> v7: - - In Kconfig add info about module name - - adhere to new convention that allows lines longer than 80 chars - - use dev_probe_err with upstream gpio line too - - refactor for cleaner exit of probe function. -v5 -> v6: - - In Kconfig, remove dependency to OF_GPIO and select only MULTIPLEXER - - refactor code preferring one-liners - - clean up prints, removing them from success-path. - - don't explicitly set gpio_chip.of_node as it's done in the GPIO library - - use devm_gpiochip_add_data instead of gpiochip_add -v4 -> v5: - - renamed gpio-mux-input -> gpio-cascade. refactored code accordingly - here and there and changed to use new bindings and compatible string - - ambigious and vague 'pin' was rename to 'upstream_line' - - dropped Tested-by and Reviewed-by due to changes in bindings - - dropped Reported-by suggested by an automatic bot as it was not really - appropriate to begin with - - functionally it's the same as v4 -v3 -> v4: - - Changed author email - - Included Tested-by and Reviewed-by from Drew -v2 -> v3: - - use managed device resources - - update Kconfig description -v1 -> v2: - - removed .owner from platform_driver as per test bot's instruction - - added MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_LICENSE - - added gpio_mux_input_get_direction as it's recommended for all chips - - removed because this is input only chip: gpio_mux_input_set_value - - removed because they are not needed for input/output only chips: - gpio_mux_input_direction_input - gpio_mux_input_direction_output - - fixed typo in an error message - - added info message about successful registration - - removed can_sleep flag as this does not sleep while getting GPIO value - like I2C or SPI do - - Updated description in Kconfig ---- - drivers/gpio/Kconfig | 15 +++++ - drivers/gpio/Makefile | 1 + - drivers/gpio/gpio-cascade.c | 117 ++++++++++++++++++++++++++++++++++++ - 3 files changed, 133 insertions(+) - create mode 100644 drivers/gpio/gpio-cascade.c - ---- a/drivers/gpio/Kconfig -+++ b/drivers/gpio/Kconfig -@@ -1617,4 +1617,19 @@ config GPIO_MOCKUP - tools/testing/selftests/gpio/gpio-mockup.sh. Reference the usage in - it. - -+comment "Other GPIO expanders" -+ -+config GPIO_CASCADE -+ tristate "General GPIO cascade" -+ select MULTIPLEXER -+ help -+ Say yes here to enable support for generic GPIO cascade. -+ -+ This allows building one-to-many cascades of GPIO lines using -+ different types of multiplexers readily available. At the -+ moment only input lines are supported. -+ -+ To build the driver as a module choose 'm' and the resulting module -+ will be called 'gpio-cascade'. -+ - endif ---- a/drivers/gpio/Makefile -+++ b/drivers/gpio/Makefile -@@ -44,6 +44,7 @@ obj-$(CONFIG_GPIO_BD9571MWV) += gpio-bd - obj-$(CONFIG_GPIO_BRCMSTB) += gpio-brcmstb.o - obj-$(CONFIG_GPIO_BT8XX) += gpio-bt8xx.o - obj-$(CONFIG_GPIO_CADENCE) += gpio-cadence.o -+obj-$(CONFIG_GPIO_CASCADE) += gpio-cascade.o - obj-$(CONFIG_GPIO_CLPS711X) += gpio-clps711x.o - obj-$(CONFIG_GPIO_SNPS_CREG) += gpio-creg-snps.o - obj-$(CONFIG_GPIO_CRYSTAL_COVE) += gpio-crystalcove.o ---- /dev/null -+++ b/drivers/gpio/gpio-cascade.c -@@ -0,0 +1,117 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * A generic GPIO cascade driver -+ * -+ * Copyright (C) 2021 Mauri Sandberg -+ * -+ * This allows building cascades of GPIO lines in a manner illustrated -+ * below: -+ * -+ * /|---- Cascaded GPIO line 0 -+ * Upstream | |---- Cascaded GPIO line 1 -+ * GPIO line ----+ | . -+ * | | . -+ * \|---- Cascaded GPIO line n -+ * -+ * A multiplexer is being used to select, which cascaded line is being -+ * addressed at any given time. -+ * -+ * At the moment only input mode is supported due to lack of means for -+ * testing output functionality. At least theoretically output should be -+ * possible with open drain constructions. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+struct gpio_cascade { -+ struct gpio_chip gpio_chip; -+ struct device *parent; -+ struct mux_control *mux_control; -+ struct gpio_desc *upstream_line; -+}; -+ -+static struct gpio_cascade *chip_to_cascade(struct gpio_chip *gc) -+{ -+ return container_of(gc, struct gpio_cascade, gpio_chip); -+} -+ -+static int gpio_cascade_get_direction(struct gpio_chip *gc, unsigned int offset) -+{ -+ return GPIO_LINE_DIRECTION_IN; -+} -+ -+static int gpio_cascade_get_value(struct gpio_chip *gc, unsigned int offset) -+{ -+ struct gpio_cascade *cas = chip_to_cascade(gc); -+ int ret; -+ -+ ret = mux_control_select(cas->mux_control, offset); -+ if (ret) -+ return ret; -+ -+ ret = gpiod_get_value(cas->upstream_line); -+ mux_control_deselect(cas->mux_control); -+ return ret; -+} -+ -+static int gpio_cascade_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct gpio_cascade *cas; -+ struct mux_control *mc; -+ struct gpio_desc *upstream; -+ struct gpio_chip *gc; -+ -+ cas = devm_kzalloc(dev, sizeof(*cas), GFP_KERNEL); -+ if (!cas) -+ return -ENOMEM; -+ -+ mc = devm_mux_control_get(dev, NULL); -+ if (IS_ERR(mc)) -+ return dev_err_probe(dev, PTR_ERR(mc), "unable to get mux-control\n"); -+ -+ cas->mux_control = mc; -+ upstream = devm_gpiod_get(dev, "upstream", GPIOD_IN); -+ if (IS_ERR(upstream)) -+ return dev_err_probe(dev, PTR_ERR(upstream), "unable to claim upstream GPIO line\n"); -+ -+ cas->upstream_line = upstream; -+ cas->parent = dev; -+ -+ gc = &cas->gpio_chip; -+ gc->get = gpio_cascade_get_value; -+ gc->get_direction = gpio_cascade_get_direction; -+ gc->base = -1; -+ gc->ngpio = mux_control_states(mc); -+ gc->label = dev_name(cas->parent); -+ gc->parent = cas->parent; -+ gc->owner = THIS_MODULE; -+ -+ platform_set_drvdata(pdev, cas); -+ return devm_gpiochip_add_data(dev, &cas->gpio_chip, NULL); -+} -+ -+static const struct of_device_id gpio_cascade_id[] = { -+ { .compatible = "gpio-cascade" }, -+ { /* sentinel */ } -+}; -+MODULE_DEVICE_TABLE(of, gpio_cascade_id); -+ -+static struct platform_driver gpio_cascade_driver = { -+ .driver = { -+ .name = "gpio-cascade", -+ .of_match_table = gpio_cascade_id, -+ }, -+ .probe = gpio_cascade_probe, -+}; -+module_platform_driver(gpio_cascade_driver); -+ -+MODULE_AUTHOR("Mauri Sandberg "); -+MODULE_DESCRIPTION("Generic GPIO cascade"); -+MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/pending-5.10/810-pci_disable_common_quirks.patch b/target/linux/generic/pending-5.10/810-pci_disable_common_quirks.patch deleted file mode 100644 index ac232c7197..0000000000 --- a/target/linux/generic/pending-5.10/810-pci_disable_common_quirks.patch +++ /dev/null @@ -1,62 +0,0 @@ -From: Gabor Juhos -Subject: debloat: add kernel config option to disabling common PCI quirks - -Signed-off-by: Gabor Juhos ---- - drivers/pci/Kconfig | 6 ++++++ - drivers/pci/quirks.c | 6 ++++++ - 2 files changed, 12 insertions(+) - ---- a/drivers/pci/Kconfig -+++ b/drivers/pci/Kconfig -@@ -118,6 +118,13 @@ config XEN_PCIDEV_FRONTEND - The PCI device frontend driver allows the kernel to import arbitrary - PCI devices from a PCI backend to support PCI driver domains. - -+config PCI_DISABLE_COMMON_QUIRKS -+ bool "PCI disable common quirks" -+ depends on PCI -+ help -+ If you don't know what to do here, say N. -+ -+ - config PCI_ATS - bool - ---- a/drivers/pci/quirks.c -+++ b/drivers/pci/quirks.c -@@ -206,6 +206,7 @@ static void quirk_mmio_always_on(struct - DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_ANY_ID, PCI_ANY_ID, - PCI_CLASS_BRIDGE_HOST, 8, quirk_mmio_always_on); - -+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS - /* - * The Mellanox Tavor device gives false positive parity errors. Mark this - * device with a broken_parity_status to allow PCI scanning code to "skip" -@@ -3335,6 +3336,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f9, quirk_intel_mc_errata); - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65fa, quirk_intel_mc_errata); - -+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */ -+ - /* - * Ivytown NTB BAR sizes are misreported by the hardware due to an erratum. - * To work around this, query the size it should be configured to by the -@@ -3360,6 +3363,8 @@ static void quirk_intel_ntb(struct pci_d - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e08, quirk_intel_ntb); - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e0d, quirk_intel_ntb); - -+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS -+ - /* - * Some BIOS implementations leave the Intel GPU interrupts enabled, even - * though no one is handling them (e.g., if the i915 driver is never -@@ -3398,6 +3403,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN - DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq); - DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq); - -+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */ -+ - /* - * PCI devices which are on Intel chips can skip the 10ms delay - * before entering D3 mode. diff --git a/target/linux/generic/pending-5.10/811-pci_disable_usb_common_quirks.patch b/target/linux/generic/pending-5.10/811-pci_disable_usb_common_quirks.patch deleted file mode 100644 index 488f90a8d4..0000000000 --- a/target/linux/generic/pending-5.10/811-pci_disable_usb_common_quirks.patch +++ /dev/null @@ -1,115 +0,0 @@ -From: Felix Fietkau -Subject: debloat: disable common USB quirks - -Signed-off-by: Felix Fietkau ---- - drivers/usb/host/pci-quirks.c | 16 ++++++++++++++++ - drivers/usb/host/pci-quirks.h | 18 +++++++++++++++++- - include/linux/usb/hcd.h | 7 +++++++ - 3 files changed, 40 insertions(+), 1 deletion(-) - ---- a/drivers/usb/host/pci-quirks.c -+++ b/drivers/usb/host/pci-quirks.c -@@ -128,6 +128,8 @@ struct amd_chipset_type { - u8 rev; - }; - -+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS -+ - static struct amd_chipset_info { - struct pci_dev *nb_dev; - struct pci_dev *smbus_dev; -@@ -633,6 +635,10 @@ bool usb_amd_pt_check_port(struct device - } - EXPORT_SYMBOL_GPL(usb_amd_pt_check_port); - -+#endif /* CONFIG_PCI_DISABLE_COMMON_QUIRKS */ -+ -+#if IS_ENABLED(CONFIG_USB_UHCI_HCD) -+ - /* - * Make sure the controller is completely inactive, unable to - * generate interrupts or do DMA. -@@ -712,8 +718,17 @@ reset_needed: - uhci_reset_hc(pdev, base); - return 1; - } -+#else -+int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base) -+{ -+ return 0; -+} -+ -+#endif - EXPORT_SYMBOL_GPL(uhci_check_and_reset_hc); - -+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS -+ - static inline int io_type_enabled(struct pci_dev *pdev, unsigned int mask) - { - u16 cmd; -@@ -1285,3 +1300,4 @@ static void quirk_usb_early_handoff(stru - } - DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID, - PCI_CLASS_SERIAL_USB, 8, quirk_usb_early_handoff); -+#endif ---- a/drivers/usb/host/pci-quirks.h -+++ b/drivers/usb/host/pci-quirks.h -@@ -5,6 +5,9 @@ - #ifdef CONFIG_USB_PCI - void uhci_reset_hc(struct pci_dev *pdev, unsigned long base); - int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base); -+#endif /* CONFIG_USB_PCI */ -+ -+#if defined(CONFIG_USB_PCI) && !defined(CONFIG_PCI_DISABLE_COMMON_QUIRKS) - int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev); - bool usb_amd_hang_symptom_quirk(void); - bool usb_amd_prefetch_quirk(void); -@@ -19,6 +22,18 @@ void sb800_prefetch(struct device *dev, - bool usb_amd_pt_check_port(struct device *device, int port); - #else - struct pci_dev; -+static inline int usb_amd_quirk_pll_check(void) -+{ -+ return 0; -+} -+static inline bool usb_amd_hang_symptom_quirk(void) -+{ -+ return false; -+} -+static inline bool usb_amd_prefetch_quirk(void) -+{ -+ return false; -+} - static inline void usb_amd_quirk_pll_disable(void) {} - static inline void usb_amd_quirk_pll_enable(void) {} - static inline void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) {} -@@ -29,6 +44,11 @@ static inline bool usb_amd_pt_check_port - { - return false; - } -+static inline void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev) {} -+static inline bool usb_xhci_needs_pci_reset(struct pci_dev *pdev) -+{ -+ return false; -+} - #endif /* CONFIG_USB_PCI */ - - #endif /* __LINUX_USB_PCI_QUIRKS_H */ ---- a/include/linux/usb/hcd.h -+++ b/include/linux/usb/hcd.h -@@ -487,7 +487,14 @@ extern int usb_hcd_pci_probe(struct pci_ - extern void usb_hcd_pci_remove(struct pci_dev *dev); - extern void usb_hcd_pci_shutdown(struct pci_dev *dev); - -+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS - extern int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev); -+#else -+static inline int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev) -+{ -+ return 0; -+} -+#endif - - #ifdef CONFIG_PM - extern const struct dev_pm_ops usb_hcd_pci_pm_ops; diff --git a/target/linux/generic/pending-5.10/834-ledtrig-libata.patch b/target/linux/generic/pending-5.10/834-ledtrig-libata.patch deleted file mode 100644 index 636fe24aea..0000000000 --- a/target/linux/generic/pending-5.10/834-ledtrig-libata.patch +++ /dev/null @@ -1,149 +0,0 @@ -From: Daniel Golle -Subject: libata: add ledtrig support - -This adds a LED trigger for each ATA port indicating disk activity. - -As this is needed only on specific platforms (NAS SoCs and such), -these platforms should define ARCH_WANTS_LIBATA_LEDS if there -are boards with LED(s) intended to indicate ATA disk activity and -need the OS to take care of that. -In that way, if not selected, LED trigger support not will be -included in libata-core and both, codepaths and structures remain -untouched. - -Signed-off-by: Daniel Golle ---- - drivers/ata/Kconfig | 16 ++++++++++++++++ - drivers/ata/libata-core.c | 41 +++++++++++++++++++++++++++++++++++++++++ - include/linux/libata.h | 9 +++++++++ - 3 files changed, 66 insertions(+) - ---- a/drivers/ata/Kconfig -+++ b/drivers/ata/Kconfig -@@ -67,6 +67,22 @@ config ATA_FORCE - - If unsure, say Y. - -+config ARCH_WANT_LIBATA_LEDS -+ bool -+ -+config ATA_LEDS -+ bool "support ATA port LED triggers" -+ depends on ARCH_WANT_LIBATA_LEDS -+ select NEW_LEDS -+ select LEDS_CLASS -+ select LEDS_TRIGGERS -+ default y -+ help -+ This option adds a LED trigger for each registered ATA port. -+ It is used to drive disk activity leds connected via GPIO. -+ -+ If unsure, say N. -+ - config ATA_ACPI - bool "ATA ACPI Support" - depends on ACPI ---- a/drivers/ata/libata-core.c -+++ b/drivers/ata/libata-core.c -@@ -650,6 +650,19 @@ u64 ata_tf_read_block(const struct ata_t - return block; - } - -+#ifdef CONFIG_ATA_LEDS -+#define LIBATA_BLINK_DELAY 20 /* ms */ -+static inline void ata_led_act(struct ata_port *ap) -+{ -+ unsigned long led_delay = LIBATA_BLINK_DELAY; -+ -+ if (unlikely(!ap->ledtrig)) -+ return; -+ -+ led_trigger_blink_oneshot(ap->ledtrig, &led_delay, &led_delay, 0); -+} -+#endif -+ - /** - * ata_build_rw_tf - Build ATA taskfile for given read/write request - * @tf: Target ATA taskfile -@@ -4555,6 +4568,9 @@ struct ata_queued_cmd *ata_qc_new_init(s - if (tag < 0) - return NULL; - } -+#ifdef CONFIG_ATA_LEDS -+ ata_led_act(ap); -+#endif - - qc = __ata_qc_from_tag(ap, tag); - qc->tag = qc->hw_tag = tag; -@@ -5333,6 +5349,9 @@ struct ata_port *ata_port_alloc(struct a - ap->stats.unhandled_irq = 1; - ap->stats.idle_irq = 1; - #endif -+#ifdef CONFIG_ATA_LEDS -+ ap->ledtrig = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); -+#endif - ata_sff_port_init(ap); - - return ap; -@@ -5368,6 +5387,12 @@ static void ata_host_release(struct kref - - kfree(ap->pmp_link); - kfree(ap->slave_link); -+#ifdef CONFIG_ATA_LEDS -+ if (ap->ledtrig) { -+ led_trigger_unregister(ap->ledtrig); -+ kfree(ap->ledtrig); -+ }; -+#endif - kfree(ap); - host->ports[i] = NULL; - } -@@ -5774,7 +5799,23 @@ int ata_host_register(struct ata_host *h - host->ports[i]->print_id = atomic_inc_return(&ata_print_id); - host->ports[i]->local_port_no = i + 1; - } -+#ifdef CONFIG_ATA_LEDS -+ for (i = 0; i < host->n_ports; i++) { -+ if (unlikely(!host->ports[i]->ledtrig)) -+ continue; - -+ snprintf(host->ports[i]->ledtrig_name, -+ sizeof(host->ports[i]->ledtrig_name), "ata%u", -+ host->ports[i]->print_id); -+ -+ host->ports[i]->ledtrig->name = host->ports[i]->ledtrig_name; -+ -+ if (led_trigger_register(host->ports[i]->ledtrig)) { -+ kfree(host->ports[i]->ledtrig); -+ host->ports[i]->ledtrig = NULL; -+ } -+ } -+#endif - /* Create associated sysfs transport objects */ - for (i = 0; i < host->n_ports; i++) { - rc = ata_tport_add(host->dev,host->ports[i]); ---- a/include/linux/libata.h -+++ b/include/linux/libata.h -@@ -23,6 +23,9 @@ - #include - #include - #include -+#ifdef CONFIG_ATA_LEDS -+#include -+#endif - - /* - * Define if arch has non-standard setup. This is a _PCI_ standard -@@ -883,6 +886,12 @@ struct ata_port { - #ifdef CONFIG_ATA_ACPI - struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */ - #endif -+ -+#ifdef CONFIG_ATA_LEDS -+ struct led_trigger *ledtrig; -+ char ledtrig_name[8]; -+#endif -+ - /* owned by EH */ - u8 sector_buf[ATA_SECT_SIZE] ____cacheline_aligned; - }; diff --git a/target/linux/generic/pending-5.10/840-hwrng-bcm2835-set-quality-to-1000.patch b/target/linux/generic/pending-5.10/840-hwrng-bcm2835-set-quality-to-1000.patch deleted file mode 100644 index 580f0b1bfa..0000000000 --- a/target/linux/generic/pending-5.10/840-hwrng-bcm2835-set-quality-to-1000.patch +++ /dev/null @@ -1,26 +0,0 @@ -From d6988cf1d16faac56899918bb2b1be8d85155e3f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= -Date: Sat, 20 Feb 2021 18:36:38 +0100 -Subject: [PATCH] hwrng: bcm2835: set quality to 1000 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This allows devices without a high precission timer to reduce boot from >100s -to <30s. - -Signed-off-by: Álvaro Fernández Rojas ---- - drivers/char/hw_random/bcm2835-rng.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/char/hw_random/bcm2835-rng.c -+++ b/drivers/char/hw_random/bcm2835-rng.c -@@ -163,6 +163,7 @@ static int bcm2835_rng_probe(struct plat - priv->rng.init = bcm2835_rng_init; - priv->rng.read = bcm2835_rng_read; - priv->rng.cleanup = bcm2835_rng_cleanup; -+ priv->rng.quality = 1000; - - if (dev_of_node(dev)) { - rng_id = of_match_node(bcm2835_rng_of_match, dev->of_node); diff --git a/target/linux/generic/pending-5.10/842-net-qmi_wwan-add-ZTE-MF286D-modem-19d2-1485.patch b/target/linux/generic/pending-5.10/842-net-qmi_wwan-add-ZTE-MF286D-modem-19d2-1485.patch deleted file mode 100644 index c6f127add1..0000000000 --- a/target/linux/generic/pending-5.10/842-net-qmi_wwan-add-ZTE-MF286D-modem-19d2-1485.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 078c6a1cbd4cd7496048786beec2e312577bebbf Mon Sep 17 00:00:00 2001 -From: Pawel Dembicki -Date: Tue, 11 Jan 2022 23:11:32 +0100 -Subject: [PATCH] net: qmi_wwan: add ZTE MF286D modem 19d2:1485 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Modem from ZTE MF286D is an Qualcomm MDM9250 based 3G/4G modem. - -T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 3 Spd=5000 MxCh= 0 -D: Ver= 3.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 1 -P: Vendor=19d2 ProdID=1485 Rev=52.87 -S: Manufacturer=ZTE,Incorporated -S: Product=ZTE Technologies MSM -S: SerialNumber=MF286DZTED000000 -C:* #Ifs= 7 Cfg#= 1 Atr=80 MxPwr=896mA -A: FirstIf#= 0 IfCount= 2 Cls=02(comm.) Sub=06 Prot=00 -I:* If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=ff Driver=rndis_host -E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl=32ms -I:* If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host -E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms -E: Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms -I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option -E: Ad=83(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms -E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms -I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option -E: Ad=85(I) Atr=03(Int.) MxPS= 10 Ivl=32ms -E: Ad=84(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms -E: Ad=03(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms -I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option -E: Ad=87(I) Atr=03(Int.) MxPS= 10 Ivl=32ms -E: Ad=86(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms -E: Ad=04(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms -I:* If#= 5 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan -E: Ad=88(I) Atr=03(Int.) MxPS= 8 Ivl=32ms -E: Ad=8e(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms -E: Ad=0f(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms -I:* If#= 6 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=usbfs -E: Ad=05(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms -E: Ad=89(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms - -Signed-off-by: Pawel Dembicki -Acked-by: Bjørn Mork -Signed-off-by: David S. Miller ---- - drivers/net/usb/qmi_wwan.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/net/usb/qmi_wwan.c -+++ b/drivers/net/usb/qmi_wwan.c -@@ -1253,6 +1253,7 @@ static const struct usb_device_id produc - {QMI_FIXED_INTF(0x19d2, 0x1426, 2)}, /* ZTE MF91 */ - {QMI_FIXED_INTF(0x19d2, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */ - {QMI_FIXED_INTF(0x19d2, 0x1432, 3)}, /* ZTE ME3620 */ -+ {QMI_FIXED_INTF(0x19d2, 0x1485, 5)}, /* ZTE MF286D */ - {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */ - {QMI_FIXED_INTF(0x2001, 0x7e16, 3)}, /* D-Link DWM-221 */ - {QMI_FIXED_INTF(0x2001, 0x7e19, 4)}, /* D-Link DWM-221 B1 */ diff --git a/target/linux/generic/pending-5.10/850-0001-PCI-aardvark-Replace-custom-PCIE_CORE_INT_-macros-wi.patch b/target/linux/generic/pending-5.10/850-0001-PCI-aardvark-Replace-custom-PCIE_CORE_INT_-macros-wi.patch deleted file mode 100644 index cae329a582..0000000000 --- a/target/linux/generic/pending-5.10/850-0001-PCI-aardvark-Replace-custom-PCIE_CORE_INT_-macros-wi.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 43f3f187e6f62ca40802afe39495c8a3e20b4bfa Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Mon, 10 Jan 2022 01:50:50 +0100 -Subject: [PATCH] PCI: aardvark: Replace custom PCIE_CORE_INT_* macros with - PCI_INTERRUPT_* -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Header file linux/pci.h defines enum pci_interrupt_pin with corresponding -PCI_INTERRUPT_* values. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -37,10 +37,6 @@ - #define PCIE_CORE_ERR_CAPCTL_ECRC_CHK_TX_EN BIT(6) - #define PCIE_CORE_ERR_CAPCTL_ECRC_CHCK BIT(7) - #define PCIE_CORE_ERR_CAPCTL_ECRC_CHCK_RCV BIT(8) --#define PCIE_CORE_INT_A_ASSERT_ENABLE 1 --#define PCIE_CORE_INT_B_ASSERT_ENABLE 2 --#define PCIE_CORE_INT_C_ASSERT_ENABLE 3 --#define PCIE_CORE_INT_D_ASSERT_ENABLE 4 - /* PIO registers base address and register offsets */ - #define PIO_BASE_ADDR 0x4000 - #define PIO_CTRL (PIO_BASE_ADDR + 0x0) -@@ -968,7 +964,7 @@ static int advk_sw_pci_bridge_init(struc - bridge->conf.pref_mem_limit = cpu_to_le16(PCI_PREF_RANGE_TYPE_64); - - /* Support interrupt A for MSI feature */ -- bridge->conf.intpin = PCIE_CORE_INT_A_ASSERT_ENABLE; -+ bridge->conf.intpin = PCI_INTERRUPT_INTA; - - /* Aardvark HW provides PCIe Capability structure in version 2 */ - bridge->pcie_conf.cap = cpu_to_le16(2); diff --git a/target/linux/generic/pending-5.10/850-0004-PCI-aardvark-Rewrite-IRQ-code-to-chained-IRQ-handler.patch b/target/linux/generic/pending-5.10/850-0004-PCI-aardvark-Rewrite-IRQ-code-to-chained-IRQ-handler.patch deleted file mode 100644 index 426ba94b98..0000000000 --- a/target/linux/generic/pending-5.10/850-0004-PCI-aardvark-Rewrite-IRQ-code-to-chained-IRQ-handler.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 0cd5141d1866afb23286fe90cd846441fe7aeb39 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Sat, 27 Mar 2021 14:44:11 +0100 -Subject: [PATCH] PCI: aardvark: Rewrite IRQ code to chained IRQ handler -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Rewrite the code to use irq_set_chained_handler_and_data() handler with -chained_irq_enter() and chained_irq_exit() processing instead of using -devm_request_irq(). - -advk_pcie_irq_handler() reads IRQ status bits and calls other functions -based on which bits are set. These functions then read its own IRQ status -bits and calls other aardvark functions based on these bits. Finally -generic_handle_domain_irq() with translated linux IRQ numbers are called. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 48 +++++++++++++++------------ - 1 file changed, 26 insertions(+), 22 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -275,6 +275,7 @@ struct advk_pcie { - u32 actions; - } wins[OB_WIN_COUNT]; - u8 wins_count; -+ int irq; - struct irq_domain *irq_domain; - struct irq_chip irq_chip; - raw_spinlock_t irq_lock; -@@ -1441,21 +1442,26 @@ static void advk_pcie_handle_int(struct - } - } - --static irqreturn_t advk_pcie_irq_handler(int irq, void *arg) -+static void advk_pcie_irq_handler(struct irq_desc *desc) - { -- struct advk_pcie *pcie = arg; -- u32 status; -+ struct advk_pcie *pcie = irq_desc_get_handler_data(desc); -+ struct irq_chip *chip = irq_desc_get_chip(desc); -+ u32 val, mask, status; - -- status = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG); -- if (!(status & PCIE_IRQ_CORE_INT)) -- return IRQ_NONE; -+ chained_irq_enter(chip, desc); - -- advk_pcie_handle_int(pcie); -+ val = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG); -+ mask = advk_readl(pcie, HOST_CTRL_INT_MASK_REG); -+ status = val & ((~mask) & PCIE_IRQ_ALL_MASK); - -- /* Clear interrupt */ -- advk_writel(pcie, PCIE_IRQ_CORE_INT, HOST_CTRL_INT_STATUS_REG); -+ if (status & PCIE_IRQ_CORE_INT) { -+ advk_pcie_handle_int(pcie); - -- return IRQ_HANDLED; -+ /* Clear interrupt */ -+ advk_writel(pcie, PCIE_IRQ_CORE_INT, HOST_CTRL_INT_STATUS_REG); -+ } -+ -+ chained_irq_exit(chip, desc); - } - - static void __maybe_unused advk_pcie_disable_phy(struct advk_pcie *pcie) -@@ -1522,7 +1528,7 @@ static int advk_pcie_probe(struct platfo - struct advk_pcie *pcie; - struct pci_host_bridge *bridge; - struct resource_entry *entry; -- int ret, irq; -+ int ret; - - bridge = devm_pci_alloc_host_bridge(dev, sizeof(struct advk_pcie)); - if (!bridge) -@@ -1610,17 +1616,9 @@ static int advk_pcie_probe(struct platfo - if (IS_ERR(pcie->base)) - return PTR_ERR(pcie->base); - -- irq = platform_get_irq(pdev, 0); -- if (irq < 0) -- return irq; -- -- ret = devm_request_irq(dev, irq, advk_pcie_irq_handler, -- IRQF_SHARED | IRQF_NO_THREAD, "advk-pcie", -- pcie); -- if (ret) { -- dev_err(dev, "Failed to register interrupt\n"); -- return ret; -- } -+ pcie->irq = platform_get_irq(pdev, 0); -+ if (pcie->irq < 0) -+ return pcie->irq; - - pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node, - "reset-gpios", 0, -@@ -1669,11 +1667,14 @@ static int advk_pcie_probe(struct platfo - return ret; - } - -+ irq_set_chained_handler_and_data(pcie->irq, advk_pcie_irq_handler, pcie); -+ - bridge->sysdata = pcie; - bridge->ops = &advk_pcie_ops; - - ret = pci_host_probe(bridge); - if (ret < 0) { -+ irq_set_chained_handler_and_data(pcie->irq, NULL, NULL); - advk_pcie_remove_msi_irq_domain(pcie); - advk_pcie_remove_irq_domain(pcie); - return ret; -@@ -1721,6 +1722,9 @@ static int advk_pcie_remove(struct platf - advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_REG); - advk_writel(pcie, PCIE_IRQ_ALL_MASK, HOST_CTRL_INT_STATUS_REG); - -+ /* Remove IRQ handler */ -+ irq_set_chained_handler_and_data(pcie->irq, NULL, NULL); -+ - /* Remove IRQ domains */ - advk_pcie_remove_msi_irq_domain(pcie); - advk_pcie_remove_irq_domain(pcie); diff --git a/target/linux/generic/pending-5.10/850-0005-PCI-aardvark-Check-return-value-of-generic_handle_do.patch b/target/linux/generic/pending-5.10/850-0005-PCI-aardvark-Check-return-value-of-generic_handle_do.patch deleted file mode 100644 index a9c7f052b1..0000000000 --- a/target/linux/generic/pending-5.10/850-0005-PCI-aardvark-Check-return-value-of-generic_handle_do.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 69c1f2c6f45a556361fd8e8d2d4eb20e2c8d3d95 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Thu, 18 Mar 2021 17:04:32 +0100 -Subject: [PATCH] PCI: aardvark: Check return value of - generic_handle_domain_irq() when processing INTx IRQ -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -It is possible that we receive spurious INTx interrupt. Check for the -return value of generic_handle_domain_irq() when processing INTx IRQ. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1438,7 +1438,9 @@ static void advk_pcie_handle_int(struct - PCIE_ISR1_REG); - - virq = irq_find_mapping(pcie->irq_domain, i); -- generic_handle_irq(virq); -+ if (generic_handle_irq(virq) == -EINVAL) -+ dev_err_ratelimited(&pcie->pdev->dev, "unexpected INT%c IRQ\n", -+ (char)i + 'A'); - } - } - diff --git a/target/linux/generic/pending-5.10/850-0006-PCI-aardvark-Make-MSI-irq_chip-structures-static-dri.patch b/target/linux/generic/pending-5.10/850-0006-PCI-aardvark-Make-MSI-irq_chip-structures-static-dri.patch deleted file mode 100644 index e7cee0a87a..0000000000 --- a/target/linux/generic/pending-5.10/850-0006-PCI-aardvark-Make-MSI-irq_chip-structures-static-dri.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 5eb36a6b9508da442aac80f4df23e3951bbfa7aa Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Mon, 10 Jan 2022 00:03:41 +0100 -Subject: [PATCH] PCI: aardvark: Make MSI irq_chip structures static driver - structures -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Marc Zyngier says [1] that we should use struct irq_chip as a global -static struct in the driver. Even though the structure currently -contains a dynamic member (parent_device), Marc says [2] that he plans -to kill it and make the structure completely static. - -Convert Aardvark's priv->msi_bottom_irq_chip and priv->msi_irq_chip to -static driver structure. - -[1] https://lore.kernel.org/linux-pci/877dbcvngf.wl-maz@kernel.org/ -[2] https://lore.kernel.org/linux-pci/874k6gvkhz.wl-maz@kernel.org/ - -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 26 ++++++++++++-------------- - 1 file changed, 12 insertions(+), 14 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -281,8 +281,6 @@ struct advk_pcie { - raw_spinlock_t irq_lock; - struct irq_domain *msi_domain; - struct irq_domain *msi_inner_domain; -- struct irq_chip msi_bottom_irq_chip; -- struct irq_chip msi_irq_chip; - struct msi_domain_info msi_domain_info; - DECLARE_BITMAP(msi_used, MSI_IRQ_NUM); - struct mutex msi_used_lock; -@@ -1201,6 +1199,12 @@ static int advk_msi_set_affinity(struct - return -EINVAL; - } - -+static struct irq_chip advk_msi_bottom_irq_chip = { -+ .name = "MSI", -+ .irq_compose_msi_msg = advk_msi_irq_compose_msi_msg, -+ .irq_set_affinity = advk_msi_set_affinity, -+}; -+ - static int advk_msi_irq_domain_alloc(struct irq_domain *domain, - unsigned int virq, - unsigned int nr_irqs, void *args) -@@ -1217,7 +1221,7 @@ static int advk_msi_irq_domain_alloc(str - - for (i = 0; i < nr_irqs; i++) - irq_domain_set_info(domain, virq + i, hwirq + i, -- &pcie->msi_bottom_irq_chip, -+ &advk_msi_bottom_irq_chip, - domain->host_data, handle_simple_irq, - NULL, NULL); - -@@ -1287,29 +1291,23 @@ static const struct irq_domain_ops advk_ - .xlate = irq_domain_xlate_onecell, - }; - -+static struct irq_chip advk_msi_irq_chip = { -+ .name = "advk-MSI", -+}; -+ - static int advk_pcie_init_msi_irq_domain(struct advk_pcie *pcie) - { - struct device *dev = &pcie->pdev->dev; - struct device_node *node = dev->of_node; -- struct irq_chip *bottom_ic, *msi_ic; - struct msi_domain_info *msi_di; - phys_addr_t msi_msg_phys; - - mutex_init(&pcie->msi_used_lock); - -- bottom_ic = &pcie->msi_bottom_irq_chip; -- -- bottom_ic->name = "MSI"; -- bottom_ic->irq_compose_msi_msg = advk_msi_irq_compose_msi_msg; -- bottom_ic->irq_set_affinity = advk_msi_set_affinity; -- -- msi_ic = &pcie->msi_irq_chip; -- msi_ic->name = "advk-MSI"; -- - msi_di = &pcie->msi_domain_info; - msi_di->flags = MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS | - MSI_FLAG_MULTI_PCI_MSI; -- msi_di->chip = msi_ic; -+ msi_di->chip = &advk_msi_irq_chip; - - msi_msg_phys = virt_to_phys(&pcie->msi_msg); - diff --git a/target/linux/generic/pending-5.10/850-0007-PCI-aardvark-Make-msi_domain_info-structure-a-static.patch b/target/linux/generic/pending-5.10/850-0007-PCI-aardvark-Make-msi_domain_info-structure-a-static.patch deleted file mode 100644 index beadf12234..0000000000 --- a/target/linux/generic/pending-5.10/850-0007-PCI-aardvark-Make-msi_domain_info-structure-a-static.patch +++ /dev/null @@ -1,64 +0,0 @@ -From c092ab8994f1f777054c0179a9deb40b87ee606f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Mon, 10 Jan 2022 00:10:46 +0100 -Subject: [PATCH] PCI: aardvark: Make msi_domain_info structure a static driver - structure -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Make Aardvark's msi_domain_info structure into a private driver structure. -Domain info is same for every potential instatination of a controller. - -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -281,7 +281,6 @@ struct advk_pcie { - raw_spinlock_t irq_lock; - struct irq_domain *msi_domain; - struct irq_domain *msi_inner_domain; -- struct msi_domain_info msi_domain_info; - DECLARE_BITMAP(msi_used, MSI_IRQ_NUM); - struct mutex msi_used_lock; - u16 msi_msg; -@@ -1295,20 +1294,20 @@ static struct irq_chip advk_msi_irq_chip - .name = "advk-MSI", - }; - -+static struct msi_domain_info advk_msi_domain_info = { -+ .flags = MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS | -+ MSI_FLAG_MULTI_PCI_MSI, -+ .chip = &advk_msi_irq_chip, -+}; -+ - static int advk_pcie_init_msi_irq_domain(struct advk_pcie *pcie) - { - struct device *dev = &pcie->pdev->dev; - struct device_node *node = dev->of_node; -- struct msi_domain_info *msi_di; - phys_addr_t msi_msg_phys; - - mutex_init(&pcie->msi_used_lock); - -- msi_di = &pcie->msi_domain_info; -- msi_di->flags = MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS | -- MSI_FLAG_MULTI_PCI_MSI; -- msi_di->chip = &advk_msi_irq_chip; -- - msi_msg_phys = virt_to_phys(&pcie->msi_msg); - - advk_writel(pcie, lower_32_bits(msi_msg_phys), -@@ -1324,7 +1323,8 @@ static int advk_pcie_init_msi_irq_domain - - pcie->msi_domain = - pci_msi_create_irq_domain(of_node_to_fwnode(node), -- msi_di, pcie->msi_inner_domain); -+ &advk_msi_domain_info, -+ pcie->msi_inner_domain); - if (!pcie->msi_domain) { - irq_domain_remove(pcie->msi_inner_domain); - return -ENOMEM; diff --git a/target/linux/generic/pending-5.10/850-0008-PCI-aardvark-Use-dev_fwnode-instead-of-of_node_to_fw.patch b/target/linux/generic/pending-5.10/850-0008-PCI-aardvark-Use-dev_fwnode-instead-of-of_node_to_fw.patch deleted file mode 100644 index a40d3f0d8e..0000000000 --- a/target/linux/generic/pending-5.10/850-0008-PCI-aardvark-Use-dev_fwnode-instead-of-of_node_to_fw.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 59029739d42b439628e2f64f3d8f2db9be97deff Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Mon, 10 Jan 2022 00:15:17 +0100 -Subject: [PATCH] PCI: aardvark: Use dev_fwnode() instead of - of_node_to_fwnode(dev->of_node) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Use simple - dev_fwnode(dev) -instead of - struct device_node *node = dev->of_node; - of_node_to_fwnode(node) -especially since the node variable is not used elsewhere in the function. - -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1303,7 +1303,6 @@ static struct msi_domain_info advk_msi_d - static int advk_pcie_init_msi_irq_domain(struct advk_pcie *pcie) - { - struct device *dev = &pcie->pdev->dev; -- struct device_node *node = dev->of_node; - phys_addr_t msi_msg_phys; - - mutex_init(&pcie->msi_used_lock); -@@ -1322,7 +1321,7 @@ static int advk_pcie_init_msi_irq_domain - return -ENOMEM; - - pcie->msi_domain = -- pci_msi_create_irq_domain(of_node_to_fwnode(node), -+ pci_msi_create_irq_domain(dev_fwnode(dev), - &advk_msi_domain_info, - pcie->msi_inner_domain); - if (!pcie->msi_domain) { diff --git a/target/linux/generic/pending-5.10/850-0009-PCI-aardvark-Refactor-unmasking-summary-MSI-interrup.patch b/target/linux/generic/pending-5.10/850-0009-PCI-aardvark-Refactor-unmasking-summary-MSI-interrup.patch deleted file mode 100644 index 6cdaddc51c..0000000000 --- a/target/linux/generic/pending-5.10/850-0009-PCI-aardvark-Refactor-unmasking-summary-MSI-interrup.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 98feaf97bc64fc640a6c5b1394cd18fc7cd7dac8 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Sun, 28 Mar 2021 14:34:49 +0200 -Subject: [PATCH] PCI: aardvark: Refactor unmasking summary MSI interrupt -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Refactor the masking of ISR0/1 Sources and unmasking of summary MSI interrupt -so that it corresponds to the comments: -- first mask all ISR0/1 -- then unmask all MSIs -- then unmask summary MSI interrupt - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 10 ++++++---- - 1 file changed, 6 insertions(+), 4 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -578,15 +578,17 @@ static void advk_pcie_setup_hw(struct ad - advk_writel(pcie, PCIE_IRQ_ALL_MASK, HOST_CTRL_INT_STATUS_REG); - - /* Disable All ISR0/1 Sources */ -- reg = PCIE_ISR0_ALL_MASK; -- reg &= ~PCIE_ISR0_MSI_INT_PENDING; -- advk_writel(pcie, reg, PCIE_ISR0_MASK_REG); -- -+ advk_writel(pcie, PCIE_ISR0_ALL_MASK, PCIE_ISR0_MASK_REG); - advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_MASK_REG); - - /* Unmask all MSIs */ - advk_writel(pcie, ~(u32)PCIE_MSI_ALL_MASK, PCIE_MSI_MASK_REG); - -+ /* Unmask summary MSI interrupt */ -+ reg = advk_readl(pcie, PCIE_ISR0_MASK_REG); -+ reg &= ~PCIE_ISR0_MSI_INT_PENDING; -+ advk_writel(pcie, reg, PCIE_ISR0_MASK_REG); -+ - /* Enable summary interrupt for GIC SPI source */ - reg = PCIE_IRQ_ALL_MASK & (~PCIE_IRQ_ENABLE_INTS_MASK); - advk_writel(pcie, reg, HOST_CTRL_INT_MASK_REG); diff --git a/target/linux/generic/pending-5.10/850-0010-PCI-aardvark-Add-support-for-masking-MSI-interrupts.patch b/target/linux/generic/pending-5.10/850-0010-PCI-aardvark-Add-support-for-masking-MSI-interrupts.patch deleted file mode 100644 index 10ac58bd28..0000000000 --- a/target/linux/generic/pending-5.10/850-0010-PCI-aardvark-Add-support-for-masking-MSI-interrupts.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 7f353accca6e4a3222991c65b1a6801503973bd3 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Fri, 2 Jul 2021 16:44:10 +0200 -Subject: [PATCH] PCI: aardvark: Add support for masking MSI interrupts -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -We should not unmask MSIs at setup, but only when kernel asks for them -to be unmasked. - -At setup, mask all MSIs, and implement IRQ chip callbacks for masking -and unmasking particular MSIs. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 54 ++++++++++++++++++++++++--- - 1 file changed, 49 insertions(+), 5 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -281,6 +281,7 @@ struct advk_pcie { - raw_spinlock_t irq_lock; - struct irq_domain *msi_domain; - struct irq_domain *msi_inner_domain; -+ raw_spinlock_t msi_irq_lock; - DECLARE_BITMAP(msi_used, MSI_IRQ_NUM); - struct mutex msi_used_lock; - u16 msi_msg; -@@ -577,12 +578,10 @@ static void advk_pcie_setup_hw(struct ad - advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_REG); - advk_writel(pcie, PCIE_IRQ_ALL_MASK, HOST_CTRL_INT_STATUS_REG); - -- /* Disable All ISR0/1 Sources */ -+ /* Disable All ISR0/1 and MSI Sources */ - advk_writel(pcie, PCIE_ISR0_ALL_MASK, PCIE_ISR0_MASK_REG); - advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_MASK_REG); -- -- /* Unmask all MSIs */ -- advk_writel(pcie, ~(u32)PCIE_MSI_ALL_MASK, PCIE_MSI_MASK_REG); -+ advk_writel(pcie, PCIE_MSI_ALL_MASK, PCIE_MSI_MASK_REG); - - /* Unmask summary MSI interrupt */ - reg = advk_readl(pcie, PCIE_ISR0_MASK_REG); -@@ -1200,10 +1199,52 @@ static int advk_msi_set_affinity(struct - return -EINVAL; - } - -+static void advk_msi_irq_mask(struct irq_data *d) -+{ -+ struct advk_pcie *pcie = d->domain->host_data; -+ irq_hw_number_t hwirq = irqd_to_hwirq(d); -+ unsigned long flags; -+ u32 mask; -+ -+ raw_spin_lock_irqsave(&pcie->msi_irq_lock, flags); -+ mask = advk_readl(pcie, PCIE_MSI_MASK_REG); -+ mask |= BIT(hwirq); -+ advk_writel(pcie, mask, PCIE_MSI_MASK_REG); -+ raw_spin_unlock_irqrestore(&pcie->msi_irq_lock, flags); -+} -+ -+static void advk_msi_irq_unmask(struct irq_data *d) -+{ -+ struct advk_pcie *pcie = d->domain->host_data; -+ irq_hw_number_t hwirq = irqd_to_hwirq(d); -+ unsigned long flags; -+ u32 mask; -+ -+ raw_spin_lock_irqsave(&pcie->msi_irq_lock, flags); -+ mask = advk_readl(pcie, PCIE_MSI_MASK_REG); -+ mask &= ~BIT(hwirq); -+ advk_writel(pcie, mask, PCIE_MSI_MASK_REG); -+ raw_spin_unlock_irqrestore(&pcie->msi_irq_lock, flags); -+} -+ -+static void advk_msi_top_irq_mask(struct irq_data *d) -+{ -+ pci_msi_mask_irq(d); -+ irq_chip_mask_parent(d); -+} -+ -+static void advk_msi_top_irq_unmask(struct irq_data *d) -+{ -+ pci_msi_unmask_irq(d); -+ irq_chip_unmask_parent(d); -+} -+ - static struct irq_chip advk_msi_bottom_irq_chip = { - .name = "MSI", - .irq_compose_msi_msg = advk_msi_irq_compose_msi_msg, - .irq_set_affinity = advk_msi_set_affinity, -+ .irq_mask = advk_msi_irq_mask, -+ .irq_unmask = advk_msi_irq_unmask, - }; - - static int advk_msi_irq_domain_alloc(struct irq_domain *domain, -@@ -1293,7 +1334,9 @@ static const struct irq_domain_ops advk_ - }; - - static struct irq_chip advk_msi_irq_chip = { -- .name = "advk-MSI", -+ .name = "advk-MSI", -+ .irq_mask = advk_msi_top_irq_mask, -+ .irq_unmask = advk_msi_top_irq_unmask, - }; - - static struct msi_domain_info advk_msi_domain_info = { -@@ -1307,6 +1350,7 @@ static int advk_pcie_init_msi_irq_domain - struct device *dev = &pcie->pdev->dev; - phys_addr_t msi_msg_phys; - -+ raw_spin_lock_init(&pcie->msi_irq_lock); - mutex_init(&pcie->msi_used_lock); - - msi_msg_phys = virt_to_phys(&pcie->msi_msg); diff --git a/target/linux/generic/pending-5.10/850-0011-PCI-aardvark-Fix-setting-MSI-address.patch b/target/linux/generic/pending-5.10/850-0011-PCI-aardvark-Fix-setting-MSI-address.patch deleted file mode 100644 index 587e78111a..0000000000 --- a/target/linux/generic/pending-5.10/850-0011-PCI-aardvark-Fix-setting-MSI-address.patch +++ /dev/null @@ -1,91 +0,0 @@ -From fa73c200f181436eab859374657c53a73778d8ad Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Fri, 26 Mar 2021 17:35:44 +0100 -Subject: [PATCH] PCI: aardvark: Fix setting MSI address -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -MSI address for receiving MSI interrupts needs to be correctly set before -enabling processing of MSI interrupts. - -Move code for setting PCIE_MSI_ADDR_LOW_REG and PCIE_MSI_ADDR_HIGH_REG -from advk_pcie_init_msi_irq_domain() to advk_pcie_setup_hw(), before -enabling PCIE_CORE_CTRL2_MSI_ENABLE. - -After this we can remove the now unused member msi_msg, which was used -only for MSI doorbell address. MSI address can be any address which cannot -be used to DMA to. So change it to the address of the main struct advk_pcie. - -Fixes: 8c39d710363c ("PCI: aardvark: Add Aardvark PCI host controller driver") -Signed-off-by: Pali Rohár -Acked-by: Marc Zyngier -Signed-off-by: Marek Behún -Cc: stable@vger.kernel.org # f21a8b1b6837 ("PCI: aardvark: Move to MSI handling using generic MSI support") ---- - drivers/pci/controller/pci-aardvark.c | 21 +++++++++------------ - 1 file changed, 9 insertions(+), 12 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -284,7 +284,6 @@ struct advk_pcie { - raw_spinlock_t msi_irq_lock; - DECLARE_BITMAP(msi_used, MSI_IRQ_NUM); - struct mutex msi_used_lock; -- u16 msi_msg; - int link_gen; - struct pci_bridge_emul bridge; - struct gpio_desc *reset_gpio; -@@ -479,6 +478,7 @@ static void advk_pcie_disable_ob_win(str - - static void advk_pcie_setup_hw(struct advk_pcie *pcie) - { -+ phys_addr_t msi_addr; - u32 reg; - int i; - -@@ -567,6 +567,11 @@ static void advk_pcie_setup_hw(struct ad - reg |= LANE_COUNT_1; - advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); - -+ /* Set MSI address */ -+ msi_addr = virt_to_phys(pcie); -+ advk_writel(pcie, lower_32_bits(msi_addr), PCIE_MSI_ADDR_LOW_REG); -+ advk_writel(pcie, upper_32_bits(msi_addr), PCIE_MSI_ADDR_HIGH_REG); -+ - /* Enable MSI */ - reg = advk_readl(pcie, PCIE_CORE_CTRL2_REG); - reg |= PCIE_CORE_CTRL2_MSI_ENABLE; -@@ -1186,10 +1191,10 @@ static void advk_msi_irq_compose_msi_msg - struct msi_msg *msg) - { - struct advk_pcie *pcie = irq_data_get_irq_chip_data(data); -- phys_addr_t msi_msg = virt_to_phys(&pcie->msi_msg); -+ phys_addr_t msi_addr = virt_to_phys(pcie); - -- msg->address_lo = lower_32_bits(msi_msg); -- msg->address_hi = upper_32_bits(msi_msg); -+ msg->address_lo = lower_32_bits(msi_addr); -+ msg->address_hi = upper_32_bits(msi_addr); - msg->data = data->hwirq; - } - -@@ -1348,18 +1353,10 @@ static struct msi_domain_info advk_msi_d - static int advk_pcie_init_msi_irq_domain(struct advk_pcie *pcie) - { - struct device *dev = &pcie->pdev->dev; -- phys_addr_t msi_msg_phys; - - raw_spin_lock_init(&pcie->msi_irq_lock); - mutex_init(&pcie->msi_used_lock); - -- msi_msg_phys = virt_to_phys(&pcie->msi_msg); -- -- advk_writel(pcie, lower_32_bits(msi_msg_phys), -- PCIE_MSI_ADDR_LOW_REG); -- advk_writel(pcie, upper_32_bits(msi_msg_phys), -- PCIE_MSI_ADDR_HIGH_REG); -- - pcie->msi_inner_domain = - irq_domain_add_linear(NULL, MSI_IRQ_NUM, - &advk_msi_domain_ops, pcie); diff --git a/target/linux/generic/pending-5.10/850-0012-PCI-aardvark-Enable-MSI-X-support.patch b/target/linux/generic/pending-5.10/850-0012-PCI-aardvark-Enable-MSI-X-support.patch deleted file mode 100644 index 2e681cdffc..0000000000 --- a/target/linux/generic/pending-5.10/850-0012-PCI-aardvark-Enable-MSI-X-support.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 735a4ac9782b96fbe1543c578aa8334364f21abd Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Fri, 2 Apr 2021 14:05:24 +0200 -Subject: [PATCH] PCI: aardvark: Enable MSI-X support -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -According to PCI 3.0 specification, sending both MSI and MSI-X interrupts -is done by DWORD memory write operation to doorbell message address. The -write operation for MSI has zero upper 16 bits and the MSI interrupt number -in the lower 16 bits, while the write operation for MSI-X contains a 32-bit -value from MSI-X table. - -Since the driver only uses interrupt numbers from range 0..31, the upper -16 bits of the DWORD memory write operation to doorbell message address -are zero even for MSI-X interrupts. Thus we can enable MSI-X interrupts. - -Testing proves that kernel can correctly receive MSI-X interrupts from PCIe -cards which supports both MSI and MSI-X interrupts. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1346,7 +1346,7 @@ static struct irq_chip advk_msi_irq_chip - - static struct msi_domain_info advk_msi_domain_info = { - .flags = MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS | -- MSI_FLAG_MULTI_PCI_MSI, -+ MSI_FLAG_MULTI_PCI_MSI | MSI_FLAG_PCI_MSIX, - .chip = &advk_msi_irq_chip, - }; - diff --git a/target/linux/generic/pending-5.10/850-0013-PCI-aardvark-Add-support-for-ERR-interrupt-on-emulat.patch b/target/linux/generic/pending-5.10/850-0013-PCI-aardvark-Add-support-for-ERR-interrupt-on-emulat.patch deleted file mode 100644 index 8665431961..0000000000 --- a/target/linux/generic/pending-5.10/850-0013-PCI-aardvark-Add-support-for-ERR-interrupt-on-emulat.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 7f3e55a3890fa26d15e2e4e90213962d1a7f6df9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Fri, 12 Feb 2021 20:32:55 +0100 -Subject: [PATCH] PCI: aardvark: Add support for ERR interrupt on emulated - bridge -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -ERR interrupt is triggered when corresponding bit is unmasked in both ISR0 -and PCI_EXP_DEVCTL registers. Unmasking ERR bits in PCI_EXP_DEVCTL register -is not enough. This means that currently the ERR interrupt is never -triggered. - -Unmask ERR bits in ISR0 register at driver probe time. ERR interrupt is not -triggered until ERR bits are unmasked also in PCI_EXP_DEVCTL register, -which is done by AER driver. So it is safe to unconditionally unmask all -ERR bits in aardvark probe. - -Aardvark HW sets PCI_ERR_ROOT_AER_IRQ to zero and when corresponding bits -in ISR0 and PCI_EXP_DEVCTL are enabled, the HW triggers a generic interrupt -on GIC. Chain this interrupt to PCIe interrupt 0 with -generic_handle_domain_irq() to allow processing of ERR interrupts. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 36 ++++++++++++++++++++++++++- - 1 file changed, 35 insertions(+), 1 deletion(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -97,6 +97,10 @@ - #define PCIE_MSG_PM_PME_MASK BIT(7) - #define PCIE_ISR0_MASK_REG (CONTROL_BASE_ADDR + 0x44) - #define PCIE_ISR0_MSI_INT_PENDING BIT(24) -+#define PCIE_ISR0_CORR_ERR BIT(11) -+#define PCIE_ISR0_NFAT_ERR BIT(12) -+#define PCIE_ISR0_FAT_ERR BIT(13) -+#define PCIE_ISR0_ERR_MASK GENMASK(13, 11) - #define PCIE_ISR0_INTX_ASSERT(val) BIT(16 + (val)) - #define PCIE_ISR0_INTX_DEASSERT(val) BIT(20 + (val)) - #define PCIE_ISR0_ALL_MASK GENMASK(31, 0) -@@ -785,11 +789,15 @@ advk_pci_bridge_emul_base_conf_read(stru - case PCI_INTERRUPT_LINE: { - /* - * From the whole 32bit register we support reading from HW only -- * one bit: PCI_BRIDGE_CTL_BUS_RESET. -+ * two bits: PCI_BRIDGE_CTL_BUS_RESET and PCI_BRIDGE_CTL_SERR. - * Other bits are retrieved only from emulated config buffer. - */ - __le32 *cfgspace = (__le32 *)&bridge->conf; - u32 val = le32_to_cpu(cfgspace[PCI_INTERRUPT_LINE / 4]); -+ if (advk_readl(pcie, PCIE_ISR0_MASK_REG) & PCIE_ISR0_ERR_MASK) -+ val &= ~(PCI_BRIDGE_CTL_SERR << 16); -+ else -+ val |= PCI_BRIDGE_CTL_SERR << 16; - if (advk_readl(pcie, PCIE_CORE_CTRL1_REG) & HOT_RESET_GEN) - val |= PCI_BRIDGE_CTL_BUS_RESET << 16; - else -@@ -815,6 +823,19 @@ advk_pci_bridge_emul_base_conf_write(str - break; - - case PCI_INTERRUPT_LINE: -+ /* -+ * According to Figure 6-3: Pseudo Logic Diagram for Error -+ * Message Controls in PCIe base specification, SERR# Enable bit -+ * in Bridge Control register enable receiving of ERR_* messages -+ */ -+ if (mask & (PCI_BRIDGE_CTL_SERR << 16)) { -+ u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG); -+ if (new & (PCI_BRIDGE_CTL_SERR << 16)) -+ val &= ~PCIE_ISR0_ERR_MASK; -+ else -+ val |= PCIE_ISR0_ERR_MASK; -+ advk_writel(pcie, val, PCIE_ISR0_MASK_REG); -+ } - if (mask & (PCI_BRIDGE_CTL_BUS_RESET << 16)) { - u32 val = advk_readl(pcie, PCIE_CORE_CTRL1_REG); - if (new & (PCI_BRIDGE_CTL_BUS_RESET << 16)) -@@ -1465,6 +1486,19 @@ static void advk_pcie_handle_int(struct - isr1_mask = advk_readl(pcie, PCIE_ISR1_MASK_REG); - isr1_status = isr1_val & ((~isr1_mask) & PCIE_ISR1_ALL_MASK); - -+ /* Process ERR interrupt */ -+ if (isr0_status & PCIE_ISR0_ERR_MASK) { -+ advk_writel(pcie, PCIE_ISR0_ERR_MASK, PCIE_ISR0_REG); -+ -+ /* -+ * Aardvark HW returns zero for PCI_ERR_ROOT_AER_IRQ, so use -+ * PCIe interrupt 0 -+ */ -+ virq = irq_find_mapping(pcie->irq_domain, 0); -+ if (generic_handle_irq(virq) == -EINVAL) -+ dev_err_ratelimited(&pcie->pdev->dev, "unhandled ERR IRQ\n"); -+ } -+ - /* Process MSI interrupts */ - if (isr0_status & PCIE_ISR0_MSI_INT_PENDING) - advk_pcie_handle_msi(pcie); diff --git a/target/linux/generic/pending-5.10/850-0015-PCI-aardvark-Optimize-writing-PCI_EXP_RTCTL_PMEIE-an.patch b/target/linux/generic/pending-5.10/850-0015-PCI-aardvark-Optimize-writing-PCI_EXP_RTCTL_PMEIE-an.patch deleted file mode 100644 index 5ed809def2..0000000000 --- a/target/linux/generic/pending-5.10/850-0015-PCI-aardvark-Optimize-writing-PCI_EXP_RTCTL_PMEIE-an.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 3fe0073d116d9902df08761c1cf0d733dd4c38fc Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Wed, 8 Dec 2021 06:03:50 +0100 -Subject: [PATCH] PCI: aardvark: Optimize writing PCI_EXP_RTCTL_PMEIE and - PCI_EXP_RTSTA_PME on emulated bridge -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -To optimize advk_pci_bridge_emul_pcie_conf_write() code, touch -PCIE_ISR0_REG and PCIE_ISR0_MASK_REG registers only when it is really -needed, when processing PCI_EXP_RTCTL_PMEIE and PCI_EXP_RTSTA_PME bits. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 20 +++++++++++--------- - 1 file changed, 11 insertions(+), 9 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -932,19 +932,21 @@ advk_pci_bridge_emul_pcie_conf_write(str - advk_pcie_wait_for_retrain(pcie); - break; - -- case PCI_EXP_RTCTL: { -+ case PCI_EXP_RTCTL: - /* Only mask/unmask PME interrupt */ -- u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG) & -- ~PCIE_MSG_PM_PME_MASK; -- if ((new & PCI_EXP_RTCTL_PMEIE) == 0) -- val |= PCIE_MSG_PM_PME_MASK; -- advk_writel(pcie, val, PCIE_ISR0_MASK_REG); -+ if (mask & PCI_EXP_RTCTL_PMEIE) { -+ u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG); -+ if (new & PCI_EXP_RTCTL_PMEIE) -+ val &= ~PCIE_MSG_PM_PME_MASK; -+ else -+ val |= PCIE_MSG_PM_PME_MASK; -+ advk_writel(pcie, val, PCIE_ISR0_MASK_REG); -+ } - break; -- } - - case PCI_EXP_RTSTA: -- new = (new & PCI_EXP_RTSTA_PME) >> 9; -- advk_writel(pcie, new, PCIE_ISR0_REG); -+ if (new & PCI_EXP_RTSTA_PME) -+ advk_writel(pcie, PCIE_MSG_PM_PME_MASK, PCIE_ISR0_REG); - break; - - case PCI_EXP_DEVCTL: diff --git a/target/linux/generic/pending-5.10/850-0016-PCI-aardvark-Add-support-for-PME-interrupts.patch b/target/linux/generic/pending-5.10/850-0016-PCI-aardvark-Add-support-for-PME-interrupts.patch deleted file mode 100644 index 2b1a945b62..0000000000 --- a/target/linux/generic/pending-5.10/850-0016-PCI-aardvark-Add-support-for-PME-interrupts.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 7acd8ef92e8789e10b5d736d73cea3b625087f26 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Wed, 8 Dec 2021 06:07:44 +0100 -Subject: [PATCH] PCI: aardvark: Add support for PME interrupts -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Currently enabling PCI_EXP_RTSTA_PME bit in PCI_EXP_RTCTL register does -nothing. This is because PCIe PME driver expects to receive PCIe interrupt -defined in PCI_EXP_FLAGS_IRQ register, but aardvark hardware does not -trigger PCIe INTx/MSI interrupt for PME event, rather it triggers custom -aardvark interrupt which this driver is not processing yet. - -Fix this issue by handling PME interrupt in advk_pcie_handle_int() and -chaining it to PCIe interrupt 0 with generic_handle_domain_irq() (since -aardvark sets PCI_EXP_FLAGS_IRQ to zero). With this change PCIe PME driver -finally starts receiving PME interrupt. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1488,6 +1488,19 @@ static void advk_pcie_handle_int(struct - isr1_mask = advk_readl(pcie, PCIE_ISR1_MASK_REG); - isr1_status = isr1_val & ((~isr1_mask) & PCIE_ISR1_ALL_MASK); - -+ /* Process PME interrupt */ -+ if (isr0_status & PCIE_MSG_PM_PME_MASK) { -+ /* -+ * Do not clear PME interrupt bit in ISR0, it is cleared by IRQ -+ * receiver by writing to the PCI_EXP_RTSTA register of emulated -+ * root bridge. Aardvark HW returns zero for PCI_EXP_FLAGS_IRQ, -+ * so use PCIe interrupt 0. -+ */ -+ virq = irq_find_mapping(pcie->irq_domain, 0); -+ if (generic_handle_irq(virq) == -EINVAL) -+ dev_err_ratelimited(&pcie->pdev->dev, "unhandled PME IRQ\n"); -+ } -+ - /* Process ERR interrupt */ - if (isr0_status & PCIE_ISR0_ERR_MASK) { - advk_writel(pcie, PCIE_ISR0_ERR_MASK, PCIE_ISR0_REG); diff --git a/target/linux/generic/pending-5.10/850-0017-PCI-aardvark-Fix-support-for-PME-requester-on-emulat.patch b/target/linux/generic/pending-5.10/850-0017-PCI-aardvark-Fix-support-for-PME-requester-on-emulat.patch deleted file mode 100644 index a59ff36b51..0000000000 --- a/target/linux/generic/pending-5.10/850-0017-PCI-aardvark-Fix-support-for-PME-requester-on-emulat.patch +++ /dev/null @@ -1,173 +0,0 @@ -From 68727b545332327b4c2f9c0f8d006be8970e7832 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Fri, 19 Feb 2021 14:22:22 +0100 -Subject: [PATCH] PCI: aardvark: Fix support for PME requester on emulated - bridge -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Enable aardvark PME interrupt unconditionally by unmasking it and read PME -requester ID to emulated bridge config space immediately after receiving -interrupt. - -PME requester ID is stored in the PCIE_MSG_LOG_REG register, which contains -the last inbound message. So when new inbound message is received by HW -(including non-PM), the content in PCIE_MSG_LOG_REG register is replaced by -a new value. - -PCIe specification mandates that subsequent PMEs are kept pending until the -PME Status Register bit is cleared by software by writing a 1b. - -Support for masking/unmasking PME interrupt on emulated bridge via -PCI_EXP_RTCTL_PMEIE bit is now implemented only in emulated bridge config -space, to ensure that we do not miss any aardvark PME interrupt. - -Reading of PCI_EXP_RTCAP and PCI_EXP_RTSTA registers is simplified as final -value is now always stored into emulated bridge config space by the -interrupt handler, so there is no need to implement support for these -registers in read_pcie callback. - -Clearing of W1C bit PCI_EXP_RTSTA_PME is now also simplified as it is done -by pci-bridge-emul.c code for emulated bridge config space. So there is no -need to implement support for clearing this bit in write_pcie callback. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 94 +++++++++++++++------------ - 1 file changed, 52 insertions(+), 42 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -597,6 +597,11 @@ static void advk_pcie_setup_hw(struct ad - reg &= ~PCIE_ISR0_MSI_INT_PENDING; - advk_writel(pcie, reg, PCIE_ISR0_MASK_REG); - -+ /* Unmask PME interrupt for processing of PME requester */ -+ reg = advk_readl(pcie, PCIE_ISR0_MASK_REG); -+ reg &= ~PCIE_MSG_PM_PME_MASK; -+ advk_writel(pcie, reg, PCIE_ISR0_MASK_REG); -+ - /* Enable summary interrupt for GIC SPI source */ - reg = PCIE_IRQ_ALL_MASK & (~PCIE_IRQ_ENABLE_INTS_MASK); - advk_writel(pcie, reg, HOST_CTRL_INT_MASK_REG); -@@ -863,22 +868,11 @@ advk_pci_bridge_emul_pcie_conf_read(stru - *value = PCI_EXP_SLTSTA_PDS << 16; - return PCI_BRIDGE_EMUL_HANDLED; - -- case PCI_EXP_RTCTL: { -- u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG); -- *value = (val & PCIE_MSG_PM_PME_MASK) ? 0 : PCI_EXP_RTCTL_PMEIE; -- *value |= le16_to_cpu(bridge->pcie_conf.rootctl) & PCI_EXP_RTCTL_CRSSVE; -- *value |= PCI_EXP_RTCAP_CRSVIS << 16; -- return PCI_BRIDGE_EMUL_HANDLED; -- } -- -- case PCI_EXP_RTSTA: { -- u32 isr0 = advk_readl(pcie, PCIE_ISR0_REG); -- u32 msglog = advk_readl(pcie, PCIE_MSG_LOG_REG); -- *value = msglog >> 16; -- if (isr0 & PCIE_MSG_PM_PME_MASK) -- *value |= PCI_EXP_RTSTA_PME; -- return PCI_BRIDGE_EMUL_HANDLED; -- } -+ /* -+ * PCI_EXP_RTCTL and PCI_EXP_RTSTA are also supported, but do not need -+ * to be handled here, because their values are stored in emulated -+ * config space buffer, and we read them from there when needed. -+ */ - - case PCI_EXP_LNKCAP: { - u32 val = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + reg); -@@ -932,22 +926,19 @@ advk_pci_bridge_emul_pcie_conf_write(str - advk_pcie_wait_for_retrain(pcie); - break; - -- case PCI_EXP_RTCTL: -- /* Only mask/unmask PME interrupt */ -- if (mask & PCI_EXP_RTCTL_PMEIE) { -- u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG); -- if (new & PCI_EXP_RTCTL_PMEIE) -- val &= ~PCIE_MSG_PM_PME_MASK; -- else -- val |= PCIE_MSG_PM_PME_MASK; -- advk_writel(pcie, val, PCIE_ISR0_MASK_REG); -- } -+ case PCI_EXP_RTCTL: { -+ u16 rootctl = le16_to_cpu(bridge->pcie_conf.rootctl); -+ /* Only emulation of PMEIE and CRSSVE bits is provided */ -+ rootctl &= PCI_EXP_RTCTL_PMEIE | PCI_EXP_RTCTL_CRSSVE; -+ bridge->pcie_conf.rootctl = cpu_to_le16(rootctl); - break; -+ } - -- case PCI_EXP_RTSTA: -- if (new & PCI_EXP_RTSTA_PME) -- advk_writel(pcie, PCIE_MSG_PM_PME_MASK, PCIE_ISR0_REG); -- break; -+ /* -+ * PCI_EXP_RTSTA is also supported, but does not need to be handled -+ * here, because its value is stored in emulated config space buffer, -+ * and we write it there when needed. -+ */ - - case PCI_EXP_DEVCTL: - case PCI_EXP_DEVCTL2: -@@ -1452,6 +1443,34 @@ static void advk_pcie_remove_irq_domain( - irq_domain_remove(pcie->irq_domain); - } - -+static void advk_pcie_handle_pme(struct advk_pcie *pcie) -+{ -+ u32 requester = advk_readl(pcie, PCIE_MSG_LOG_REG) >> 16; -+ int virq; -+ -+ advk_writel(pcie, PCIE_MSG_PM_PME_MASK, PCIE_ISR0_REG); -+ -+ /* -+ * PCIE_MSG_LOG_REG contains the last inbound message, so store -+ * the requester ID only when PME was not asserted yet. -+ * Also do not trigger PME interrupt when PME is still asserted. -+ */ -+ if (!(le32_to_cpu(pcie->bridge.pcie_conf.rootsta) & PCI_EXP_RTSTA_PME)) { -+ pcie->bridge.pcie_conf.rootsta = cpu_to_le32(requester | PCI_EXP_RTSTA_PME); -+ -+ /* -+ * Trigger PME interrupt only if PMEIE bit in Root Control is set. -+ * Aardvark HW returns zero for PCI_EXP_FLAGS_IRQ, so use PCIe interrupt 0. -+ */ -+ if (!(le16_to_cpu(pcie->bridge.pcie_conf.rootctl) & PCI_EXP_RTCTL_PMEIE)) -+ return; -+ -+ virq = irq_find_mapping(pcie->irq_domain, 0); -+ if (generic_handle_irq(virq) == -EINVAL) -+ dev_err_ratelimited(&pcie->pdev->dev, "unhandled PME IRQ\n"); -+ } -+} -+ - static void advk_pcie_handle_msi(struct advk_pcie *pcie) - { - u32 msi_val, msi_mask, msi_status, msi_idx; -@@ -1488,18 +1507,9 @@ static void advk_pcie_handle_int(struct - isr1_mask = advk_readl(pcie, PCIE_ISR1_MASK_REG); - isr1_status = isr1_val & ((~isr1_mask) & PCIE_ISR1_ALL_MASK); - -- /* Process PME interrupt */ -- if (isr0_status & PCIE_MSG_PM_PME_MASK) { -- /* -- * Do not clear PME interrupt bit in ISR0, it is cleared by IRQ -- * receiver by writing to the PCI_EXP_RTSTA register of emulated -- * root bridge. Aardvark HW returns zero for PCI_EXP_FLAGS_IRQ, -- * so use PCIe interrupt 0. -- */ -- virq = irq_find_mapping(pcie->irq_domain, 0); -- if (generic_handle_irq(virq) == -EINVAL) -- dev_err_ratelimited(&pcie->pdev->dev, "unhandled PME IRQ\n"); -- } -+ /* Process PME interrupt as the first one to do not miss PME requester id */ -+ if (isr0_status & PCIE_MSG_PM_PME_MASK) -+ advk_pcie_handle_pme(pcie); - - /* Process ERR interrupt */ - if (isr0_status & PCIE_ISR0_ERR_MASK) { diff --git a/target/linux/generic/pending-5.10/850-0018-PCI-aardvark-Use-separate-INTA-interrupt-for-emulate.patch b/target/linux/generic/pending-5.10/850-0018-PCI-aardvark-Use-separate-INTA-interrupt-for-emulate.patch deleted file mode 100644 index 62a4bfe807..0000000000 --- a/target/linux/generic/pending-5.10/850-0018-PCI-aardvark-Use-separate-INTA-interrupt-for-emulate.patch +++ /dev/null @@ -1,161 +0,0 @@ -From db305233136f5aa2444a8287a279384e8458c458 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Thu, 1 Apr 2021 20:12:48 +0200 -Subject: [PATCH] PCI: aardvark: Use separate INTA interrupt for emulated root - bridge -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Emulated root bridge currently provides only one Legacy INTA interrupt -which is used for reporting PCIe PME and ERR events and handled by kernel -PCIe PME and AER drivers. - -Aardvark HW reports these PME and ERR events separately, so there is no -need to mix real INTA interrupt and emulated INTA interrupt for PCIe PME -and AER drivers. - -Register a new advk-RP (as in Root Port) irq chip and a new irq domain -for emulated root bridge and use this new separate irq domain for -providing INTA interrupt from emulated root bridge for PME and ERR events. - -The real INTA interrupt from real devices is now separate. - -A custom map_irq callback function on PCI host bridge structure is used to -allocate IRQ mapping for emulated root bridge from new irq domain. Original -callback of_irq_parse_and_map_pci() is used for all other devices as before. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 69 ++++++++++++++++++++++++++- - 1 file changed, 67 insertions(+), 2 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -280,6 +280,7 @@ struct advk_pcie { - } wins[OB_WIN_COUNT]; - u8 wins_count; - int irq; -+ struct irq_domain *rp_irq_domain; - struct irq_domain *irq_domain; - struct irq_chip irq_chip; - raw_spinlock_t irq_lock; -@@ -1443,6 +1444,44 @@ static void advk_pcie_remove_irq_domain( - irq_domain_remove(pcie->irq_domain); - } - -+static struct irq_chip advk_rp_irq_chip = { -+ .name = "advk-RP", -+}; -+ -+static int advk_pcie_rp_irq_map(struct irq_domain *h, -+ unsigned int virq, irq_hw_number_t hwirq) -+{ -+ struct advk_pcie *pcie = h->host_data; -+ -+ irq_set_chip_and_handler(virq, &advk_rp_irq_chip, handle_simple_irq); -+ irq_set_chip_data(virq, pcie); -+ -+ return 0; -+} -+ -+static const struct irq_domain_ops advk_pcie_rp_irq_domain_ops = { -+ .map = advk_pcie_rp_irq_map, -+ .xlate = irq_domain_xlate_onecell, -+}; -+ -+static int advk_pcie_init_rp_irq_domain(struct advk_pcie *pcie) -+{ -+ pcie->rp_irq_domain = irq_domain_add_linear(NULL, 1, -+ &advk_pcie_rp_irq_domain_ops, -+ pcie); -+ if (!pcie->rp_irq_domain) { -+ dev_err(&pcie->pdev->dev, "Failed to add Root Port IRQ domain\n"); -+ return -ENOMEM; -+ } -+ -+ return 0; -+} -+ -+static void advk_pcie_remove_rp_irq_domain(struct advk_pcie *pcie) -+{ -+ irq_domain_remove(pcie->rp_irq_domain); -+} -+ - static void advk_pcie_handle_pme(struct advk_pcie *pcie) - { - u32 requester = advk_readl(pcie, PCIE_MSG_LOG_REG) >> 16; -@@ -1465,7 +1504,7 @@ static void advk_pcie_handle_pme(struct - if (!(le16_to_cpu(pcie->bridge.pcie_conf.rootctl) & PCI_EXP_RTCTL_PMEIE)) - return; - -- virq = irq_find_mapping(pcie->irq_domain, 0); -+ virq = irq_find_mapping(pcie->rp_irq_domain, 0); - if (generic_handle_irq(virq) == -EINVAL) - dev_err_ratelimited(&pcie->pdev->dev, "unhandled PME IRQ\n"); - } -@@ -1519,7 +1558,7 @@ static void advk_pcie_handle_int(struct - * Aardvark HW returns zero for PCI_ERR_ROOT_AER_IRQ, so use - * PCIe interrupt 0 - */ -- virq = irq_find_mapping(pcie->irq_domain, 0); -+ virq = irq_find_mapping(pcie->rp_irq_domain, 0); - if (generic_handle_irq(virq) == -EINVAL) - dev_err_ratelimited(&pcie->pdev->dev, "unhandled ERR IRQ\n"); - } -@@ -1565,6 +1604,21 @@ static void advk_pcie_irq_handler(struct - chained_irq_exit(chip, desc); - } - -+static int advk_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) -+{ -+ struct advk_pcie *pcie = dev->bus->sysdata; -+ -+ /* -+ * Emulated root bridge has its own emulated irq chip and irq domain. -+ * Argument pin is the INTx pin (1=INTA, 2=INTB, 3=INTC, 4=INTD) and -+ * hwirq for irq_create_mapping() is indexed from zero. -+ */ -+ if (pci_is_root_bus(dev->bus)) -+ return irq_create_mapping(pcie->rp_irq_domain, pin - 1); -+ else -+ return of_irq_parse_and_map_pci(dev, slot, pin); -+} -+ - static void __maybe_unused advk_pcie_disable_phy(struct advk_pcie *pcie) - { - phy_power_off(pcie->phy); -@@ -1768,14 +1822,24 @@ static int advk_pcie_probe(struct platfo - return ret; - } - -+ ret = advk_pcie_init_rp_irq_domain(pcie); -+ if (ret) { -+ dev_err(dev, "Failed to initialize irq\n"); -+ advk_pcie_remove_msi_irq_domain(pcie); -+ advk_pcie_remove_irq_domain(pcie); -+ return ret; -+ } -+ - irq_set_chained_handler_and_data(pcie->irq, advk_pcie_irq_handler, pcie); - - bridge->sysdata = pcie; - bridge->ops = &advk_pcie_ops; -+ bridge->map_irq = advk_pcie_map_irq; - - ret = pci_host_probe(bridge); - if (ret < 0) { - irq_set_chained_handler_and_data(pcie->irq, NULL, NULL); -+ advk_pcie_remove_rp_irq_domain(pcie); - advk_pcie_remove_msi_irq_domain(pcie); - advk_pcie_remove_irq_domain(pcie); - return ret; -@@ -1827,6 +1891,7 @@ static int advk_pcie_remove(struct platf - irq_set_chained_handler_and_data(pcie->irq, NULL, NULL); - - /* Remove IRQ domains */ -+ advk_pcie_remove_rp_irq_domain(pcie); - advk_pcie_remove_msi_irq_domain(pcie); - advk_pcie_remove_irq_domain(pcie); - diff --git a/target/linux/generic/pending-5.10/850-0019-PCI-aardvark-Remove-irq_mask_ack-callback-for-INTx-i.patch b/target/linux/generic/pending-5.10/850-0019-PCI-aardvark-Remove-irq_mask_ack-callback-for-INTx-i.patch deleted file mode 100644 index 75f31ba19e..0000000000 --- a/target/linux/generic/pending-5.10/850-0019-PCI-aardvark-Remove-irq_mask_ack-callback-for-INTx-i.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 8c9eef96e24f34ff8b62b230700416b822691a37 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Thu, 1 Apr 2021 14:24:12 +0200 -Subject: [PATCH] PCI: aardvark: Remove irq_mask_ack callback for INTx - interrupts -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Callback for irq_mask_ack is the same as for irq_mask. As there is no -special handling for irq_ack, there is no need to define irq_mask_ack too. - -Signed-off-by: Pali Rohár -Acked-by: Marc Zyngier -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 1 - - 1 file changed, 1 deletion(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1422,7 +1422,6 @@ static int advk_pcie_init_irq_domain(str - } - - irq_chip->irq_mask = advk_pcie_irq_mask; -- irq_chip->irq_mask_ack = advk_pcie_irq_mask; - irq_chip->irq_unmask = advk_pcie_irq_unmask; - - pcie->irq_domain = diff --git a/target/linux/generic/pending-5.10/850-0020-PCI-aardvark-Don-t-mask-irq-when-mapping.patch b/target/linux/generic/pending-5.10/850-0020-PCI-aardvark-Don-t-mask-irq-when-mapping.patch deleted file mode 100644 index 5583dc1b6f..0000000000 --- a/target/linux/generic/pending-5.10/850-0020-PCI-aardvark-Don-t-mask-irq-when-mapping.patch +++ /dev/null @@ -1,27 +0,0 @@ -From dc01fca5a9d9c09ce9a3fb2bc2e7715c37ff3bd9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Thu, 1 Apr 2021 14:30:06 +0200 -Subject: [PATCH] PCI: aardvark: Don't mask irq when mapping -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -By default, all Legacy INTx interrupts are masked, so there is no need to -mask this interrupt during irq_map callback. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 1 - - 1 file changed, 1 deletion(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1339,7 +1339,6 @@ static int advk_pcie_irq_map(struct irq_ - { - struct advk_pcie *pcie = h->host_data; - -- advk_pcie_irq_mask(irq_get_irq_data(virq)); - irq_set_status_flags(virq, IRQ_LEVEL); - irq_set_chip_and_handler(virq, &pcie->irq_chip, - handle_level_irq); diff --git a/target/linux/generic/pending-5.10/850-0021-PCI-aardvark-Drop-__maybe_unused-from-advk_pcie_disa.patch b/target/linux/generic/pending-5.10/850-0021-PCI-aardvark-Drop-__maybe_unused-from-advk_pcie_disa.patch deleted file mode 100644 index 5a1cff5310..0000000000 --- a/target/linux/generic/pending-5.10/850-0021-PCI-aardvark-Drop-__maybe_unused-from-advk_pcie_disa.patch +++ /dev/null @@ -1,28 +0,0 @@ -From a511c99262ce19ee06908d27212b39ec4c5aeb17 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Wed, 8 Dec 2021 04:40:29 +0100 -Subject: [PATCH] PCI: aardvark: Drop __maybe_unused from - advk_pcie_disable_phy() -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This function is now always used in driver remove method, drop the -__maybe_unused attribute. - -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1617,7 +1617,7 @@ static int advk_pcie_map_irq(const struc - return of_irq_parse_and_map_pci(dev, slot, pin); - } - --static void __maybe_unused advk_pcie_disable_phy(struct advk_pcie *pcie) -+static void advk_pcie_disable_phy(struct advk_pcie *pcie) - { - phy_power_off(pcie->phy); - phy_exit(pcie->phy); diff --git a/target/linux/generic/pending-5.10/850-0022-PCI-aardvark-Update-comment-about-link-going-down-af.patch b/target/linux/generic/pending-5.10/850-0022-PCI-aardvark-Update-comment-about-link-going-down-af.patch deleted file mode 100644 index cc489ebc8a..0000000000 --- a/target/linux/generic/pending-5.10/850-0022-PCI-aardvark-Update-comment-about-link-going-down-af.patch +++ /dev/null @@ -1,35 +0,0 @@ -From bafda858364003a70b9cda84282f9761587f8033 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Mon, 10 Jan 2022 00:47:38 +0100 -Subject: [PATCH] PCI: aardvark: Update comment about link going down after - link-up -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Update the comment about what happens when link goes down after we have -checked for link-up. If a PIO request is done while link-down, we have -a serious problem. - -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1005,8 +1005,12 @@ static bool advk_pcie_valid_device(struc - return false; - - /* -- * If the link goes down after we check for link-up, nothing bad -- * happens but the config access times out. -+ * If the link goes down after we check for link-up, we have a problem: -+ * if a PIO request is executed while link-down, the whole controller -+ * gets stuck in a non-functional state, and even after link comes up -+ * again, PIO requests won't work anymore, and a reset of the whole PCIe -+ * controller is needed. Therefore we need to prevent sending PIO -+ * requests while the link is down. - */ - if (!pci_is_root_bus(bus) && !advk_pcie_link_up(pcie)) - return false; diff --git a/target/linux/generic/pending-5.10/850-0023-PCI-aardvark-Make-main-irq_chip-structure-a-static-d.patch b/target/linux/generic/pending-5.10/850-0023-PCI-aardvark-Make-main-irq_chip-structure-a-static-d.patch deleted file mode 100644 index a5e2d8a3dd..0000000000 --- a/target/linux/generic/pending-5.10/850-0023-PCI-aardvark-Make-main-irq_chip-structure-a-static-d.patch +++ /dev/null @@ -1,102 +0,0 @@ -From 663b9f99bb35dbc0c7b685f71ee3668a60d31320 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Mon, 10 Jan 2022 02:02:00 +0100 -Subject: [PATCH] PCI: aardvark: Make main irq_chip structure a static driver - structure -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Marc Zyngier says [1] that we should use struct irq_chip as a global -static struct in the driver. Even though the structure currently -contains a dynamic member (parent_device), Marc says [2] that he plans -to kill it and make the structure completely static. - -We have already converted others irq_chip structures in this driver in -this way, but we omitted this one because the .name member is -dynamically created from device's name, and the name is displayed in -sysfs, so changing it would break sysfs ABI. - -The rationale for changing the name (to "advk-INT") in spite of sysfs -ABI, and thus allowing to convert to a static structure, is that after -the other changes we made in this series, the IRQ chip is basically -something different: it no logner generates ERR and PME interrupts (they -are generated by emulated bridge's rp_irq_chip). - -[1] https://lore.kernel.org/linux-pci/877dbcvngf.wl-maz@kernel.org/ -[2] https://lore.kernel.org/linux-pci/874k6gvkhz.wl-maz@kernel.org/ - -Signed-off-by: Marek Behún ---- - drivers/pci/controller/pci-aardvark.c | 25 +++++++------------------ - 1 file changed, 7 insertions(+), 18 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -282,7 +282,6 @@ struct advk_pcie { - int irq; - struct irq_domain *rp_irq_domain; - struct irq_domain *irq_domain; -- struct irq_chip irq_chip; - raw_spinlock_t irq_lock; - struct irq_domain *msi_domain; - struct irq_domain *msi_inner_domain; -@@ -1338,14 +1337,19 @@ static void advk_pcie_irq_unmask(struct - raw_spin_unlock_irqrestore(&pcie->irq_lock, flags); - } - -+static struct irq_chip advk_irq_chip = { -+ .name = "advk-INT", -+ .irq_mask = advk_pcie_irq_mask, -+ .irq_unmask = advk_pcie_irq_unmask, -+}; -+ - static int advk_pcie_irq_map(struct irq_domain *h, - unsigned int virq, irq_hw_number_t hwirq) - { - struct advk_pcie *pcie = h->host_data; - - irq_set_status_flags(virq, IRQ_LEVEL); -- irq_set_chip_and_handler(virq, &pcie->irq_chip, -- handle_level_irq); -+ irq_set_chip_and_handler(virq, &advk_irq_chip, handle_level_irq); - irq_set_chip_data(virq, pcie); - - return 0; -@@ -1404,7 +1408,6 @@ static int advk_pcie_init_irq_domain(str - struct device *dev = &pcie->pdev->dev; - struct device_node *node = dev->of_node; - struct device_node *pcie_intc_node; -- struct irq_chip *irq_chip; - int ret = 0; - - raw_spin_lock_init(&pcie->irq_lock); -@@ -1415,28 +1418,14 @@ static int advk_pcie_init_irq_domain(str - return -ENODEV; - } - -- irq_chip = &pcie->irq_chip; -- -- irq_chip->name = devm_kasprintf(dev, GFP_KERNEL, "%s-irq", -- dev_name(dev)); -- if (!irq_chip->name) { -- ret = -ENOMEM; -- goto out_put_node; -- } -- -- irq_chip->irq_mask = advk_pcie_irq_mask; -- irq_chip->irq_unmask = advk_pcie_irq_unmask; -- - pcie->irq_domain = - irq_domain_add_linear(pcie_intc_node, PCI_NUM_INTX, - &advk_pcie_irq_domain_ops, pcie); - if (!pcie->irq_domain) { - dev_err(dev, "Failed to get a INTx IRQ domain\n"); - ret = -ENOMEM; -- goto out_put_node; - } - --out_put_node: - of_node_put(pcie_intc_node); - return ret; - } diff --git a/target/linux/generic/pending-5.10/851-0001-phy-marvell-phy-mvebu-a3700-comphy-Remove-port-from-.patch b/target/linux/generic/pending-5.10/851-0001-phy-marvell-phy-mvebu-a3700-comphy-Remove-port-from-.patch deleted file mode 100644 index 4a963be952..0000000000 --- a/target/linux/generic/pending-5.10/851-0001-phy-marvell-phy-mvebu-a3700-comphy-Remove-port-from-.patch +++ /dev/null @@ -1,217 +0,0 @@ -From a719f7ba7fcba05d85801c6f0267f389a21627c1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Fri, 24 Sep 2021 13:03:02 +0200 -Subject: [PATCH] phy: marvell: phy-mvebu-a3700-comphy: Remove port from driver - configuration -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Port number is encoded into argument for SMC call. It is zero for SATA, -PCIe and also both USB 3.0 PHYs. It is non-zero only for Ethernet PHY -(incorrectly called SGMII) on lane 0. Ethernet PHY on lane 1 also uses zero -port number. - -So construct "port" bits for SMC call argument can be constructed directly -from PHY type and lane number. - -Change driver code to always pass zero port number for non-ethernet PHYs -and for ethernet PHYs determinate port number from lane number. This -simplifies the driver. - -As port number from DT PHY configuration is not used anymore, remove whole -driver code which parses it. This also simplifies the driver. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Reviewed-by: Miquel Raynal ---- - drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 62 +++++++++----------- - 1 file changed, 29 insertions(+), 33 deletions(-) - ---- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c -+++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c -@@ -20,7 +20,6 @@ - #include - - #define MVEBU_A3700_COMPHY_LANES 3 --#define MVEBU_A3700_COMPHY_PORTS 2 - - /* COMPHY Fast SMC function identifiers */ - #define COMPHY_SIP_POWER_ON 0x82000001 -@@ -45,51 +44,47 @@ - #define COMPHY_FW_NET(mode, idx, speed) (COMPHY_FW_MODE(mode) | \ - ((idx) << 8) | \ - ((speed) << 2)) --#define COMPHY_FW_PCIE(mode, idx, speed, width) (COMPHY_FW_NET(mode, idx, speed) | \ -+#define COMPHY_FW_PCIE(mode, speed, width) (COMPHY_FW_NET(mode, 0, speed) | \ - ((width) << 18)) - - struct mvebu_a3700_comphy_conf { - unsigned int lane; - enum phy_mode mode; - int submode; -- unsigned int port; - u32 fw_mode; - }; - --#define MVEBU_A3700_COMPHY_CONF(_lane, _mode, _smode, _port, _fw) \ -+#define MVEBU_A3700_COMPHY_CONF(_lane, _mode, _smode, _fw) \ - { \ - .lane = _lane, \ - .mode = _mode, \ - .submode = _smode, \ -- .port = _port, \ - .fw_mode = _fw, \ - } - --#define MVEBU_A3700_COMPHY_CONF_GEN(_lane, _mode, _port, _fw) \ -- MVEBU_A3700_COMPHY_CONF(_lane, _mode, PHY_INTERFACE_MODE_NA, _port, _fw) -+#define MVEBU_A3700_COMPHY_CONF_GEN(_lane, _mode, _fw) \ -+ MVEBU_A3700_COMPHY_CONF(_lane, _mode, PHY_INTERFACE_MODE_NA, _fw) - --#define MVEBU_A3700_COMPHY_CONF_ETH(_lane, _smode, _port, _fw) \ -- MVEBU_A3700_COMPHY_CONF(_lane, PHY_MODE_ETHERNET, _smode, _port, _fw) -+#define MVEBU_A3700_COMPHY_CONF_ETH(_lane, _smode, _fw) \ -+ MVEBU_A3700_COMPHY_CONF(_lane, PHY_MODE_ETHERNET, _smode, _fw) - - static const struct mvebu_a3700_comphy_conf mvebu_a3700_comphy_modes[] = { - /* lane 0 */ -- MVEBU_A3700_COMPHY_CONF_GEN(0, PHY_MODE_USB_HOST_SS, 0, -+ MVEBU_A3700_COMPHY_CONF_GEN(0, PHY_MODE_USB_HOST_SS, - COMPHY_FW_MODE_USB3H), -- MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_SGMII, 1, -+ MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_SGMII, - COMPHY_FW_MODE_SGMII), -- MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_2500BASEX, 1, -+ MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_2500BASEX, - COMPHY_FW_MODE_2500BASEX), - /* lane 1 */ -- MVEBU_A3700_COMPHY_CONF_GEN(1, PHY_MODE_PCIE, 0, -- COMPHY_FW_MODE_PCIE), -- MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_SGMII, 0, -+ MVEBU_A3700_COMPHY_CONF_GEN(1, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE), -+ MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_SGMII, - COMPHY_FW_MODE_SGMII), -- MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_2500BASEX, 0, -+ MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_2500BASEX, - COMPHY_FW_MODE_2500BASEX), - /* lane 2 */ -- MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_SATA, 0, -- COMPHY_FW_MODE_SATA), -- MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_USB_HOST_SS, 0, -+ MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_SATA, COMPHY_FW_MODE_SATA), -+ MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_USB_HOST_SS, - COMPHY_FW_MODE_USB3H), - }; - -@@ -98,7 +93,6 @@ struct mvebu_a3700_comphy_lane { - unsigned int id; - enum phy_mode mode; - int submode; -- int port; - }; - - static int mvebu_a3700_comphy_smc(unsigned long function, unsigned long lane, -@@ -120,7 +114,7 @@ static int mvebu_a3700_comphy_smc(unsign - } - } - --static int mvebu_a3700_comphy_get_fw_mode(int lane, int port, -+static int mvebu_a3700_comphy_get_fw_mode(int lane, - enum phy_mode mode, - int submode) - { -@@ -132,7 +126,6 @@ static int mvebu_a3700_comphy_get_fw_mod - - for (i = 0; i < n; i++) { - if (mvebu_a3700_comphy_modes[i].lane == lane && -- mvebu_a3700_comphy_modes[i].port == port && - mvebu_a3700_comphy_modes[i].mode == mode && - mvebu_a3700_comphy_modes[i].submode == submode) - break; -@@ -153,7 +146,7 @@ static int mvebu_a3700_comphy_set_mode(s - if (submode == PHY_INTERFACE_MODE_1000BASEX) - submode = PHY_INTERFACE_MODE_SGMII; - -- fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, lane->port, mode, -+ fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, mode, - submode); - if (fw_mode < 0) { - dev_err(lane->dev, "invalid COMPHY mode\n"); -@@ -172,9 +165,10 @@ static int mvebu_a3700_comphy_power_on(s - struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); - u32 fw_param; - int fw_mode; -+ int fw_port; - int ret; - -- fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, lane->port, -+ fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, - lane->mode, lane->submode); - if (fw_mode < 0) { - dev_err(lane->dev, "invalid COMPHY mode\n"); -@@ -191,17 +185,18 @@ static int mvebu_a3700_comphy_power_on(s - fw_param = COMPHY_FW_MODE(fw_mode); - break; - case PHY_MODE_ETHERNET: -+ fw_port = (lane->id == 0) ? 1 : 0; - switch (lane->submode) { - case PHY_INTERFACE_MODE_SGMII: - dev_dbg(lane->dev, "set lane %d to SGMII mode\n", - lane->id); -- fw_param = COMPHY_FW_NET(fw_mode, lane->port, -+ fw_param = COMPHY_FW_NET(fw_mode, fw_port, - COMPHY_FW_SPEED_1_25G); - break; - case PHY_INTERFACE_MODE_2500BASEX: - dev_dbg(lane->dev, "set lane %d to 2500BASEX mode\n", - lane->id); -- fw_param = COMPHY_FW_NET(fw_mode, lane->port, -+ fw_param = COMPHY_FW_NET(fw_mode, fw_port, - COMPHY_FW_SPEED_3_125G); - break; - default: -@@ -212,8 +207,7 @@ static int mvebu_a3700_comphy_power_on(s - break; - case PHY_MODE_PCIE: - dev_dbg(lane->dev, "set lane %d to PCIe mode\n", lane->id); -- fw_param = COMPHY_FW_PCIE(fw_mode, lane->port, -- COMPHY_FW_SPEED_5G, -+ fw_param = COMPHY_FW_PCIE(fw_mode, COMPHY_FW_SPEED_5G, - phy->attrs.bus_width); - break; - default: -@@ -247,17 +241,20 @@ static struct phy *mvebu_a3700_comphy_xl - struct of_phandle_args *args) - { - struct mvebu_a3700_comphy_lane *lane; -+ unsigned int port; - struct phy *phy; - -- if (WARN_ON(args->args[0] >= MVEBU_A3700_COMPHY_PORTS)) -- return ERR_PTR(-EINVAL); -- - phy = of_phy_simple_xlate(dev, args); - if (IS_ERR(phy)) - return phy; - - lane = phy_get_drvdata(phy); -- lane->port = args->args[0]; -+ -+ port = args->args[0]; -+ if (port != 0 && (port != 1 || lane->id != 0)) { -+ dev_err(lane->dev, "invalid port number %u\n", port); -+ return ERR_PTR(-EINVAL); -+ } - - return phy; - } -@@ -302,7 +299,6 @@ static int mvebu_a3700_comphy_probe(stru - lane->mode = PHY_MODE_INVALID; - lane->submode = PHY_INTERFACE_MODE_NA; - lane->id = lane_id; -- lane->port = -1; - phy_set_drvdata(phy, lane); - } - diff --git a/target/linux/generic/pending-5.10/851-0002-phy-marvell-phy-mvebu-a3700-comphy-Add-native-kernel.patch b/target/linux/generic/pending-5.10/851-0002-phy-marvell-phy-mvebu-a3700-comphy-Add-native-kernel.patch deleted file mode 100644 index 73ead1e16c..0000000000 --- a/target/linux/generic/pending-5.10/851-0002-phy-marvell-phy-mvebu-a3700-comphy-Add-native-kernel.patch +++ /dev/null @@ -1,1564 +0,0 @@ -From 9d276da259cce20b2ed7a868b6e6a6a205f7bb04 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Thu, 23 Sep 2021 19:20:13 +0200 -Subject: [PATCH] phy: marvell: phy-mvebu-a3700-comphy: Add native kernel - implementation -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Remove old RPC implementation and add a new native kernel implementation. - -The old implementation uses ARM SMC API to issue RPC calls to ARM Trusted -Firmware which provides real implementation of PHY configuration. - -But older versions of ARM Trusted Firmware do not provide this PHY -configuration functionality, simply returning: operation not supported; or -worse, some versions provide the configuration functionality incorrectly. - -For example the firmware shipped in ESPRESSObin board has this older -version of ARM Trusted Firmware and therefore SATA, USB 3.0 and PCIe -functionality do not work with newer versions of Linux kernel. - -Due to the above reasons, the following commits were introduced into Linux, -to workaround these issues by ignoring -EOPNOTSUPP error code from -phy-mvebu-a3700-comphy driver function phy_power_on(): - -commit 45aefe3d2251 ("ata: ahci: mvebu: Make SATA PHY optional for Armada -3720") -commit 3241929b67d2 ("usb: host: xhci: mvebu: make USB 3.0 PHY optional for -Armada 3720") -commit b0c6ae0f8948 ("PCI: aardvark: Fix initialization with old Marvell's -Arm Trusted Firmware") - -Replace this RPC implementation with proper native kernel implementation, -which is independent on the firmware. Never return -EOPNOTSUPP for proper -arguments. - -This should solve multiple issues with real-world boards, where it is not -possible or really inconvenient to change the firmware. Let's eliminate -these issues. - -This implementation is ported directly from Armada 3720 comphy driver found -in newest version of ARM Trusted Firmware source code, but with various -fixes of register names, some added comments, some refactoring due to the -original code not conforming to kernel standards. Also PCIe mode poweroff -support was added here, and PHY reset support. These changes are also going -to be sent to ARM Trusted Firmware. - -Signed-off-by: Pali Rohár -Acked-by: Miquel Raynal -[ Pali did the porting from ATF. - I (Marek) then fixed some register names, some various other things, - added some comments and refactored the code to kernel standards. Also - fixed PHY poweroff and added PHY reset. ] -Signed-off-by: Marek Behún ---- - drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 1351 ++++++++++++++++-- - 1 file changed, 1234 insertions(+), 117 deletions(-) - ---- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c -+++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c -@@ -5,12 +5,16 @@ - * Authors: - * Evan Wang - * Miquèl Raynal -+ * Pali Rohár -+ * Marek Behún - * - * Structure inspired from phy-mvebu-cp110-comphy.c written by Antoine Tenart. -- * SMC call initial support done by Grzegorz Jaszczyk. -+ * Comphy code from ARM Trusted Firmware ported by Pali Rohár -+ * and Marek Behún . - */ - --#include -+#include -+#include - #include - #include - #include -@@ -18,103 +22,1147 @@ - #include - #include - #include -+#include - --#define MVEBU_A3700_COMPHY_LANES 3 -+#define PLL_SET_DELAY_US 600 -+#define COMPHY_PLL_SLEEP 1000 -+#define COMPHY_PLL_TIMEOUT 150000 -+ -+/* Comphy lane2 indirect access register offset */ -+#define COMPHY_LANE2_INDIR_ADDR 0x0 -+#define COMPHY_LANE2_INDIR_DATA 0x4 -+ -+/* SATA and USB3 PHY offset compared to SATA PHY */ -+#define COMPHY_LANE2_REGS_BASE 0x200 -+ -+/* -+ * When accessing common PHY lane registers directly, we need to shift by 1, -+ * since the registers are 16-bit. -+ */ -+#define COMPHY_LANE_REG_DIRECT(reg) (((reg) & 0x7FF) << 1) -+ -+/* COMPHY registers */ -+#define COMPHY_POWER_PLL_CTRL 0x01 -+#define PU_IVREF_BIT BIT(15) -+#define PU_PLL_BIT BIT(14) -+#define PU_RX_BIT BIT(13) -+#define PU_TX_BIT BIT(12) -+#define PU_TX_INTP_BIT BIT(11) -+#define PU_DFE_BIT BIT(10) -+#define RESET_DTL_RX_BIT BIT(9) -+#define PLL_LOCK_BIT BIT(8) -+#define REF_FREF_SEL_MASK GENMASK(4, 0) -+#define REF_FREF_SEL_SERDES_25MHZ FIELD_PREP(REF_FREF_SEL_MASK, 0x1) -+#define REF_FREF_SEL_SERDES_40MHZ FIELD_PREP(REF_FREF_SEL_MASK, 0x3) -+#define REF_FREF_SEL_SERDES_50MHZ FIELD_PREP(REF_FREF_SEL_MASK, 0x4) -+#define REF_FREF_SEL_PCIE_USB3_25MHZ FIELD_PREP(REF_FREF_SEL_MASK, 0x2) -+#define REF_FREF_SEL_PCIE_USB3_40MHZ FIELD_PREP(REF_FREF_SEL_MASK, 0x3) -+#define COMPHY_MODE_MASK GENMASK(7, 5) -+#define COMPHY_MODE_SATA FIELD_PREP(COMPHY_MODE_MASK, 0x0) -+#define COMPHY_MODE_PCIE FIELD_PREP(COMPHY_MODE_MASK, 0x3) -+#define COMPHY_MODE_SERDES FIELD_PREP(COMPHY_MODE_MASK, 0x4) -+#define COMPHY_MODE_USB3 FIELD_PREP(COMPHY_MODE_MASK, 0x5) -+ -+#define COMPHY_KVCO_CAL_CTRL 0x02 -+#define USE_MAX_PLL_RATE_BIT BIT(12) -+#define SPEED_PLL_MASK GENMASK(7, 2) -+#define SPEED_PLL_VALUE_16 FIELD_PREP(SPEED_PLL_MASK, 0x10) -+ -+#define COMPHY_DIG_LOOPBACK_EN 0x23 -+#define SEL_DATA_WIDTH_MASK GENMASK(11, 10) -+#define DATA_WIDTH_10BIT FIELD_PREP(SEL_DATA_WIDTH_MASK, 0x0) -+#define DATA_WIDTH_20BIT FIELD_PREP(SEL_DATA_WIDTH_MASK, 0x1) -+#define DATA_WIDTH_40BIT FIELD_PREP(SEL_DATA_WIDTH_MASK, 0x2) -+#define PLL_READY_TX_BIT BIT(4) -+ -+#define COMPHY_SYNC_PATTERN 0x24 -+#define TXD_INVERT_BIT BIT(10) -+#define RXD_INVERT_BIT BIT(11) -+ -+#define COMPHY_SYNC_MASK_GEN 0x25 -+#define PHY_GEN_MAX_MASK GENMASK(11, 10) -+#define PHY_GEN_MAX_USB3_5G FIELD_PREP(PHY_GEN_MAX_MASK, 0x1) -+ -+#define COMPHY_ISOLATION_CTRL 0x26 -+#define PHY_ISOLATE_MODE BIT(15) -+ -+#define COMPHY_GEN2_SET2 0x3e -+#define GS2_TX_SSC_AMP_MASK GENMASK(15, 9) -+#define GS2_TX_SSC_AMP_4128 FIELD_PREP(GS2_TX_SSC_AMP_MASK, 0x20) -+#define GS2_VREG_RXTX_MAS_ISET_MASK GENMASK(8, 7) -+#define GS2_VREG_RXTX_MAS_ISET_60U FIELD_PREP(GS2_VREG_RXTX_MAS_ISET_MASK,\ -+ 0x0) -+#define GS2_VREG_RXTX_MAS_ISET_80U FIELD_PREP(GS2_VREG_RXTX_MAS_ISET_MASK,\ -+ 0x1) -+#define GS2_VREG_RXTX_MAS_ISET_100U FIELD_PREP(GS2_VREG_RXTX_MAS_ISET_MASK,\ -+ 0x2) -+#define GS2_VREG_RXTX_MAS_ISET_120U FIELD_PREP(GS2_VREG_RXTX_MAS_ISET_MASK,\ -+ 0x3) -+#define GS2_RSVD_6_0_MASK GENMASK(6, 0) -+ -+#define COMPHY_GEN3_SET2 0x3f -+ -+#define COMPHY_IDLE_SYNC_EN 0x48 -+#define IDLE_SYNC_EN BIT(12) -+ -+#define COMPHY_MISC_CTRL0 0x4F -+#define CLK100M_125M_EN BIT(4) -+#define TXDCLK_2X_SEL BIT(6) -+#define CLK500M_EN BIT(7) -+#define PHY_REF_CLK_SEL BIT(10) -+ -+#define COMPHY_SFT_RESET 0x52 -+#define SFT_RST BIT(9) -+#define SFT_RST_NO_REG BIT(10) -+ -+#define COMPHY_MISC_CTRL1 0x73 -+#define SEL_BITS_PCIE_FORCE BIT(15) -+ -+#define COMPHY_GEN2_SET3 0x112 -+#define GS3_FFE_CAP_SEL_MASK GENMASK(3, 0) -+#define GS3_FFE_CAP_SEL_VALUE FIELD_PREP(GS3_FFE_CAP_SEL_MASK, 0xF) -+ -+/* PIPE registers */ -+#define COMPHY_PIPE_LANE_CFG0 0x180 -+#define PRD_TXDEEMPH0_MASK BIT(0) -+#define PRD_TXMARGIN_MASK GENMASK(3, 1) -+#define PRD_TXSWING_MASK BIT(4) -+#define CFG_TX_ALIGN_POS_MASK GENMASK(8, 5) -+ -+#define COMPHY_PIPE_LANE_CFG1 0x181 -+#define PRD_TXDEEMPH1_MASK BIT(15) -+#define USE_MAX_PLL_RATE_EN BIT(9) -+#define TX_DET_RX_MODE BIT(6) -+#define GEN2_TX_DATA_DLY_MASK GENMASK(4, 3) -+#define GEN2_TX_DATA_DLY_DEFT FIELD_PREP(GEN2_TX_DATA_DLY_MASK, 2) -+#define TX_ELEC_IDLE_MODE_EN BIT(0) -+ -+#define COMPHY_PIPE_LANE_STAT1 0x183 -+#define TXDCLK_PCLK_EN BIT(0) -+ -+#define COMPHY_PIPE_LANE_CFG4 0x188 -+#define SPREAD_SPECTRUM_CLK_EN BIT(7) -+ -+#define COMPHY_PIPE_RST_CLK_CTRL 0x1C1 -+#define PIPE_SOFT_RESET BIT(0) -+#define PIPE_REG_RESET BIT(1) -+#define MODE_CORE_CLK_FREQ_SEL BIT(9) -+#define MODE_PIPE_WIDTH_32 BIT(3) -+#define MODE_REFDIV_MASK GENMASK(5, 4) -+#define MODE_REFDIV_BY_4 FIELD_PREP(MODE_REFDIV_MASK, 0x2) -+ -+#define COMPHY_PIPE_TEST_MODE_CTRL 0x1C2 -+#define MODE_MARGIN_OVERRIDE BIT(2) -+ -+#define COMPHY_PIPE_CLK_SRC_LO 0x1C3 -+#define MODE_CLK_SRC BIT(0) -+#define BUNDLE_PERIOD_SEL BIT(1) -+#define BUNDLE_PERIOD_SCALE_MASK GENMASK(3, 2) -+#define BUNDLE_SAMPLE_CTRL BIT(4) -+#define PLL_READY_DLY_MASK GENMASK(7, 5) -+#define CFG_SEL_20B BIT(15) -+ -+#define COMPHY_PIPE_PWR_MGM_TIM1 0x1D0 -+#define CFG_PM_OSCCLK_WAIT_MASK GENMASK(15, 12) -+#define CFG_PM_RXDEN_WAIT_MASK GENMASK(11, 8) -+#define CFG_PM_RXDEN_WAIT_1_UNIT FIELD_PREP(CFG_PM_RXDEN_WAIT_MASK, 0x1) -+#define CFG_PM_RXDLOZ_WAIT_MASK GENMASK(7, 0) -+#define CFG_PM_RXDLOZ_WAIT_7_UNIT FIELD_PREP(CFG_PM_RXDLOZ_WAIT_MASK, 0x7) -+#define CFG_PM_RXDLOZ_WAIT_12_UNIT FIELD_PREP(CFG_PM_RXDLOZ_WAIT_MASK, 0xC) -+ -+/* -+ * This register is not from PHY lane register space. It only exists in the -+ * indirect register space, before the actual PHY lane 2 registers. So the -+ * offset is absolute, not relative to COMPHY_LANE2_REGS_BASE. -+ * It is used only for SATA PHY initialization. -+ */ -+#define COMPHY_RESERVED_REG 0x0E -+#define PHYCTRL_FRM_PIN_BIT BIT(13) - --/* COMPHY Fast SMC function identifiers */ --#define COMPHY_SIP_POWER_ON 0x82000001 --#define COMPHY_SIP_POWER_OFF 0x82000002 --#define COMPHY_SIP_PLL_LOCK 0x82000003 -- --#define COMPHY_FW_MODE_SATA 0x1 --#define COMPHY_FW_MODE_SGMII 0x2 --#define COMPHY_FW_MODE_2500BASEX 0x3 --#define COMPHY_FW_MODE_USB3H 0x4 --#define COMPHY_FW_MODE_USB3D 0x5 --#define COMPHY_FW_MODE_PCIE 0x6 --#define COMPHY_FW_MODE_USB3 0xa -- --#define COMPHY_FW_SPEED_1_25G 0 /* SGMII 1G */ --#define COMPHY_FW_SPEED_2_5G 1 --#define COMPHY_FW_SPEED_3_125G 2 /* 2500BASE-X */ --#define COMPHY_FW_SPEED_5G 3 --#define COMPHY_FW_SPEED_MAX 0x3F -- --#define COMPHY_FW_MODE(mode) ((mode) << 12) --#define COMPHY_FW_NET(mode, idx, speed) (COMPHY_FW_MODE(mode) | \ -- ((idx) << 8) | \ -- ((speed) << 2)) --#define COMPHY_FW_PCIE(mode, speed, width) (COMPHY_FW_NET(mode, 0, speed) | \ -- ((width) << 18)) -+/* South Bridge PHY Configuration Registers */ -+#define COMPHY_PHY_REG(lane, reg) (((1 - (lane)) * 0x28) + ((reg) & 0x3f)) -+ -+/* -+ * lane0: USB3/GbE1 PHY Configuration 1 -+ * lane1: PCIe/GbE0 PHY Configuration 1 -+ * (used only by SGMII code) -+ */ -+#define COMPHY_PHY_CFG1 0x0 -+#define PIN_PU_IVREF_BIT BIT(1) -+#define PIN_RESET_CORE_BIT BIT(11) -+#define PIN_RESET_COMPHY_BIT BIT(12) -+#define PIN_PU_PLL_BIT BIT(16) -+#define PIN_PU_RX_BIT BIT(17) -+#define PIN_PU_TX_BIT BIT(18) -+#define PIN_TX_IDLE_BIT BIT(19) -+#define GEN_RX_SEL_MASK GENMASK(25, 22) -+#define GEN_RX_SEL_VALUE(val) FIELD_PREP(GEN_RX_SEL_MASK, (val)) -+#define GEN_TX_SEL_MASK GENMASK(29, 26) -+#define GEN_TX_SEL_VALUE(val) FIELD_PREP(GEN_TX_SEL_MASK, (val)) -+#define SERDES_SPEED_1_25_G 0x6 -+#define SERDES_SPEED_3_125_G 0x8 -+#define PHY_RX_INIT_BIT BIT(30) -+ -+/* -+ * lane0: USB3/GbE1 PHY Status 1 -+ * lane1: PCIe/GbE0 PHY Status 1 -+ * (used only by SGMII code) -+ */ -+#define COMPHY_PHY_STAT1 0x18 -+#define PHY_RX_INIT_DONE_BIT BIT(0) -+#define PHY_PLL_READY_RX_BIT BIT(2) -+#define PHY_PLL_READY_TX_BIT BIT(3) -+ -+/* PHY Selector */ -+#define COMPHY_SELECTOR_PHY_REG 0xFC -+/* bit0: 0: Lane1 is GbE0; 1: Lane1 is PCIe */ -+#define COMPHY_SELECTOR_PCIE_GBE0_SEL_BIT BIT(0) -+/* bit4: 0: Lane0 is GbE1; 1: Lane0 is USB3 */ -+#define COMPHY_SELECTOR_USB3_GBE1_SEL_BIT BIT(4) -+/* bit8: 0: Lane0 is USB3 instead of GbE1, Lane2 is SATA; 1: Lane2 is USB3 */ -+#define COMPHY_SELECTOR_USB3_PHY_SEL_BIT BIT(8) - - struct mvebu_a3700_comphy_conf { - unsigned int lane; - enum phy_mode mode; - int submode; -- u32 fw_mode; - }; - --#define MVEBU_A3700_COMPHY_CONF(_lane, _mode, _smode, _fw) \ -+#define MVEBU_A3700_COMPHY_CONF(_lane, _mode, _smode) \ - { \ - .lane = _lane, \ - .mode = _mode, \ - .submode = _smode, \ -- .fw_mode = _fw, \ - } - --#define MVEBU_A3700_COMPHY_CONF_GEN(_lane, _mode, _fw) \ -- MVEBU_A3700_COMPHY_CONF(_lane, _mode, PHY_INTERFACE_MODE_NA, _fw) -+#define MVEBU_A3700_COMPHY_CONF_GEN(_lane, _mode) \ -+ MVEBU_A3700_COMPHY_CONF(_lane, _mode, PHY_INTERFACE_MODE_NA) - --#define MVEBU_A3700_COMPHY_CONF_ETH(_lane, _smode, _fw) \ -- MVEBU_A3700_COMPHY_CONF(_lane, PHY_MODE_ETHERNET, _smode, _fw) -+#define MVEBU_A3700_COMPHY_CONF_ETH(_lane, _smode) \ -+ MVEBU_A3700_COMPHY_CONF(_lane, PHY_MODE_ETHERNET, _smode) - - static const struct mvebu_a3700_comphy_conf mvebu_a3700_comphy_modes[] = { - /* lane 0 */ -- MVEBU_A3700_COMPHY_CONF_GEN(0, PHY_MODE_USB_HOST_SS, -- COMPHY_FW_MODE_USB3H), -- MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_SGMII, -- COMPHY_FW_MODE_SGMII), -- MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_2500BASEX, -- COMPHY_FW_MODE_2500BASEX), -+ MVEBU_A3700_COMPHY_CONF_GEN(0, PHY_MODE_USB_HOST_SS), -+ MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_SGMII), -+ MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_1000BASEX), -+ MVEBU_A3700_COMPHY_CONF_ETH(0, PHY_INTERFACE_MODE_2500BASEX), - /* lane 1 */ -- MVEBU_A3700_COMPHY_CONF_GEN(1, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE), -- MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_SGMII, -- COMPHY_FW_MODE_SGMII), -- MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_2500BASEX, -- COMPHY_FW_MODE_2500BASEX), -+ MVEBU_A3700_COMPHY_CONF_GEN(1, PHY_MODE_PCIE), -+ MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_SGMII), -+ MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_1000BASEX), -+ MVEBU_A3700_COMPHY_CONF_ETH(1, PHY_INTERFACE_MODE_2500BASEX), - /* lane 2 */ -- MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_SATA, COMPHY_FW_MODE_SATA), -- MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_USB_HOST_SS, -- COMPHY_FW_MODE_USB3H), -+ MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_SATA), -+ MVEBU_A3700_COMPHY_CONF_GEN(2, PHY_MODE_USB_HOST_SS), -+}; -+ -+struct mvebu_a3700_comphy_priv { -+ void __iomem *comphy_regs; -+ void __iomem *lane0_phy_regs; /* USB3 and GbE1 */ -+ void __iomem *lane1_phy_regs; /* PCIe and GbE0 */ -+ void __iomem *lane2_phy_indirect; /* SATA and USB3 */ -+ spinlock_t lock; /* for PHY selector access */ -+ bool xtal_is_40m; - }; - - struct mvebu_a3700_comphy_lane { -+ struct mvebu_a3700_comphy_priv *priv; - struct device *dev; - unsigned int id; - enum phy_mode mode; - int submode; -+ bool invert_tx; -+ bool invert_rx; -+ bool needs_reset; -+}; -+ -+struct gbe_phy_init_data_fix { -+ u16 addr; -+ u16 value; -+}; -+ -+/* Changes to 40M1G25 mode data required for running 40M3G125 init mode */ -+static struct gbe_phy_init_data_fix gbe_phy_init_fix[] = { -+ { 0x005, 0x07CC }, { 0x015, 0x0000 }, { 0x01B, 0x0000 }, -+ { 0x01D, 0x0000 }, { 0x01E, 0x0000 }, { 0x01F, 0x0000 }, -+ { 0x020, 0x0000 }, { 0x021, 0x0030 }, { 0x026, 0x0888 }, -+ { 0x04D, 0x0152 }, { 0x04F, 0xA020 }, { 0x050, 0x07CC }, -+ { 0x053, 0xE9CA }, { 0x055, 0xBD97 }, { 0x071, 0x3015 }, -+ { 0x076, 0x03AA }, { 0x07C, 0x0FDF }, { 0x0C2, 0x3030 }, -+ { 0x0C3, 0x8000 }, { 0x0E2, 0x5550 }, { 0x0E3, 0x12A4 }, -+ { 0x0E4, 0x7D00 }, { 0x0E6, 0x0C83 }, { 0x101, 0xFCC0 }, -+ { 0x104, 0x0C10 } - }; - --static int mvebu_a3700_comphy_smc(unsigned long function, unsigned long lane, -- unsigned long mode) -+/* 40M1G25 mode init data */ -+static u16 gbe_phy_init[512] = { -+ /* 0 1 2 3 4 5 6 7 */ -+ /*-----------------------------------------------------------*/ -+ /* 8 9 A B C D E F */ -+ 0x3110, 0xFD83, 0x6430, 0x412F, 0x82C0, 0x06FA, 0x4500, 0x6D26, /* 00 */ -+ 0xAFC0, 0x8000, 0xC000, 0x0000, 0x2000, 0x49CC, 0x0BC9, 0x2A52, /* 08 */ -+ 0x0BD2, 0x0CDE, 0x13D2, 0x0CE8, 0x1149, 0x10E0, 0x0000, 0x0000, /* 10 */ -+ 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x4134, 0x0D2D, 0xFFFF, /* 18 */ -+ 0xFFE0, 0x4030, 0x1016, 0x0030, 0x0000, 0x0800, 0x0866, 0x0000, /* 20 */ -+ 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, /* 28 */ -+ 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 30 */ -+ 0x0000, 0x0000, 0x000F, 0x6A62, 0x1988, 0x3100, 0x3100, 0x3100, /* 38 */ -+ 0x3100, 0xA708, 0x2430, 0x0830, 0x1030, 0x4610, 0xFF00, 0xFF00, /* 40 */ -+ 0x0060, 0x1000, 0x0400, 0x0040, 0x00F0, 0x0155, 0x1100, 0xA02A, /* 48 */ -+ 0x06FA, 0x0080, 0xB008, 0xE3ED, 0x5002, 0xB592, 0x7A80, 0x0001, /* 50 */ -+ 0x020A, 0x8820, 0x6014, 0x8054, 0xACAA, 0xFC88, 0x2A02, 0x45CF, /* 58 */ -+ 0x000F, 0x1817, 0x2860, 0x064F, 0x0000, 0x0204, 0x1800, 0x6000, /* 60 */ -+ 0x810F, 0x4F23, 0x4000, 0x4498, 0x0850, 0x0000, 0x000E, 0x1002, /* 68 */ -+ 0x9D3A, 0x3009, 0xD066, 0x0491, 0x0001, 0x6AB0, 0x0399, 0x3780, /* 70 */ -+ 0x0040, 0x5AC0, 0x4A80, 0x0000, 0x01DF, 0x0000, 0x0007, 0x0000, /* 78 */ -+ 0x2D54, 0x00A1, 0x4000, 0x0100, 0xA20A, 0x0000, 0x0000, 0x0000, /* 80 */ -+ 0x0000, 0x0000, 0x0000, 0x7400, 0x0E81, 0x1000, 0x1242, 0x0210, /* 88 */ -+ 0x80DF, 0x0F1F, 0x2F3F, 0x4F5F, 0x6F7F, 0x0F1F, 0x2F3F, 0x4F5F, /* 90 */ -+ 0x6F7F, 0x4BAD, 0x0000, 0x0000, 0x0800, 0x0000, 0x2400, 0xB651, /* 98 */ -+ 0xC9E0, 0x4247, 0x0A24, 0x0000, 0xAF19, 0x1004, 0x0000, 0x0000, /* A0 */ -+ 0x0000, 0x0013, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* A8 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* B0 */ -+ 0x0000, 0x0000, 0x0000, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, /* B8 */ -+ 0x0000, 0x0000, 0x3010, 0xFA00, 0x0000, 0x0000, 0x0000, 0x0003, /* C0 */ -+ 0x1618, 0x8200, 0x8000, 0x0400, 0x050F, 0x0000, 0x0000, 0x0000, /* C8 */ -+ 0x4C93, 0x0000, 0x1000, 0x1120, 0x0010, 0x1242, 0x1242, 0x1E00, /* D0 */ -+ 0x0000, 0x0000, 0x0000, 0x00F8, 0x0000, 0x0041, 0x0800, 0x0000, /* D8 */ -+ 0x82A0, 0x572E, 0x2490, 0x14A9, 0x4E00, 0x0000, 0x0803, 0x0541, /* E0 */ -+ 0x0C15, 0x0000, 0x0000, 0x0400, 0x2626, 0x0000, 0x0000, 0x4200, /* E8 */ -+ 0x0000, 0xAA55, 0x1020, 0x0000, 0x0000, 0x5010, 0x0000, 0x0000, /* F0 */ -+ 0x0000, 0x0000, 0x5000, 0x0000, 0x0000, 0x0000, 0x02F2, 0x0000, /* F8 */ -+ 0x101F, 0xFDC0, 0x4000, 0x8010, 0x0110, 0x0006, 0x0000, 0x0000, /*100 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*108 */ -+ 0x04CF, 0x0000, 0x04CF, 0x0000, 0x04CF, 0x0000, 0x04C6, 0x0000, /*110 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*118 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*120 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*128 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*130 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*138 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*140 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*148 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*150 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*158 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*160 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*168 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*170 */ -+ 0x0000, 0x0000, 0x0000, 0x00F0, 0x08A2, 0x3112, 0x0A14, 0x0000, /*178 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*180 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*188 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*190 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*198 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1A0 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1A8 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1B0 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1B8 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1C0 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1C8 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1D0 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1D8 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1E0 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1E8 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*1F0 */ -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 /*1F8 */ -+}; -+ -+static inline void comphy_reg_set(void __iomem *addr, u32 data, u32 mask) - { -- struct arm_smccc_res res; -- s32 ret; -+ u32 val; - -- arm_smccc_smc(function, lane, mode, 0, 0, 0, 0, 0, &res); -- ret = res.a0; -+ val = readl(addr); -+ val = (val & ~mask) | (data & mask); -+ writel(val, addr); -+} - -- switch (ret) { -- case SMCCC_RET_SUCCESS: -- return 0; -- case SMCCC_RET_NOT_SUPPORTED: -- return -EOPNOTSUPP; -+static inline void comphy_reg_set16(void __iomem *addr, u16 data, u16 mask) -+{ -+ u16 val; -+ -+ val = readw(addr); -+ val = (val & ~mask) | (data & mask); -+ writew(val, addr); -+} -+ -+/* Used for accessing lane 2 registers (SATA/USB3 PHY) */ -+static void comphy_set_indirect(struct mvebu_a3700_comphy_priv *priv, -+ u32 offset, u16 data, u16 mask) -+{ -+ writel(offset, -+ priv->lane2_phy_indirect + COMPHY_LANE2_INDIR_ADDR); -+ comphy_reg_set(priv->lane2_phy_indirect + COMPHY_LANE2_INDIR_DATA, -+ data, mask); -+} -+ -+static void comphy_lane_reg_set(struct mvebu_a3700_comphy_lane *lane, -+ u16 reg, u16 data, u16 mask) -+{ -+ if (lane->id == 2) { -+ /* lane 2 PHY registers are accessed indirectly */ -+ comphy_set_indirect(lane->priv, -+ reg + COMPHY_LANE2_REGS_BASE, -+ data, mask); -+ } else { -+ void __iomem *base = lane->id == 1 ? -+ lane->priv->lane1_phy_regs : -+ lane->priv->lane0_phy_regs; -+ -+ comphy_reg_set16(base + COMPHY_LANE_REG_DIRECT(reg), -+ data, mask); -+ } -+} -+ -+static int comphy_lane_reg_poll(struct mvebu_a3700_comphy_lane *lane, -+ u16 reg, u16 bits, -+ ulong sleep_us, ulong timeout_us) -+{ -+ int ret; -+ -+ if (lane->id == 2) { -+ u32 data; -+ -+ /* lane 2 PHY registers are accessed indirectly */ -+ writel(reg + COMPHY_LANE2_REGS_BASE, -+ lane->priv->lane2_phy_indirect + -+ COMPHY_LANE2_INDIR_ADDR); -+ -+ ret = readl_poll_timeout(lane->priv->lane2_phy_indirect + -+ COMPHY_LANE2_INDIR_DATA, -+ data, (data & bits) == bits, -+ sleep_us, timeout_us); -+ } else { -+ void __iomem *base = lane->id == 1 ? -+ lane->priv->lane1_phy_regs : -+ lane->priv->lane0_phy_regs; -+ u16 data; -+ -+ ret = readw_poll_timeout(base + COMPHY_LANE_REG_DIRECT(reg), -+ data, (data & bits) == bits, -+ sleep_us, timeout_us); -+ } -+ -+ return ret; -+} -+ -+static void comphy_periph_reg_set(struct mvebu_a3700_comphy_lane *lane, -+ u8 reg, u32 data, u32 mask) -+{ -+ comphy_reg_set(lane->priv->comphy_regs + COMPHY_PHY_REG(lane->id, reg), -+ data, mask); -+} -+ -+static int comphy_periph_reg_poll(struct mvebu_a3700_comphy_lane *lane, -+ u8 reg, u32 bits, -+ ulong sleep_us, ulong timeout_us) -+{ -+ u32 data; -+ -+ return readl_poll_timeout(lane->priv->comphy_regs + -+ COMPHY_PHY_REG(lane->id, reg), -+ data, (data & bits) == bits, -+ sleep_us, timeout_us); -+} -+ -+/* PHY selector configures with corresponding modes */ -+static int -+mvebu_a3700_comphy_set_phy_selector(struct mvebu_a3700_comphy_lane *lane) -+{ -+ u32 old, new, clr = 0, set = 0; -+ unsigned long flags; -+ -+ switch (lane->mode) { -+ case PHY_MODE_SATA: -+ /* SATA must be in Lane2 */ -+ if (lane->id == 2) -+ clr = COMPHY_SELECTOR_USB3_PHY_SEL_BIT; -+ else -+ goto error; -+ break; -+ -+ case PHY_MODE_ETHERNET: -+ if (lane->id == 0) -+ clr = COMPHY_SELECTOR_USB3_GBE1_SEL_BIT; -+ else if (lane->id == 1) -+ clr = COMPHY_SELECTOR_PCIE_GBE0_SEL_BIT; -+ else -+ goto error; -+ break; -+ -+ case PHY_MODE_USB_HOST_SS: -+ if (lane->id == 2) -+ set = COMPHY_SELECTOR_USB3_PHY_SEL_BIT; -+ else if (lane->id == 0) -+ set = COMPHY_SELECTOR_USB3_GBE1_SEL_BIT; -+ else -+ goto error; -+ break; -+ -+ case PHY_MODE_PCIE: -+ /* PCIE must be in Lane1 */ -+ if (lane->id == 1) -+ set = COMPHY_SELECTOR_PCIE_GBE0_SEL_BIT; -+ else -+ goto error; -+ break; -+ -+ default: -+ goto error; -+ } -+ -+ spin_lock_irqsave(&lane->priv->lock, flags); -+ -+ old = readl(lane->priv->comphy_regs + COMPHY_SELECTOR_PHY_REG); -+ new = (old & ~clr) | set; -+ writel(new, lane->priv->comphy_regs + COMPHY_SELECTOR_PHY_REG); -+ -+ spin_unlock_irqrestore(&lane->priv->lock, flags); -+ -+ dev_dbg(lane->dev, -+ "COMPHY[%d] mode[%d] changed PHY selector 0x%08x -> 0x%08x\n", -+ lane->id, lane->mode, old, new); -+ -+ return 0; -+error: -+ dev_err(lane->dev, "COMPHY[%d] mode[%d] is invalid\n", lane->id, -+ lane->mode); -+ return -EINVAL; -+} -+ -+static int -+mvebu_a3700_comphy_sata_power_on(struct mvebu_a3700_comphy_lane *lane) -+{ -+ u32 mask, data, ref_clk; -+ int ret; -+ -+ /* Configure phy selector for SATA */ -+ ret = mvebu_a3700_comphy_set_phy_selector(lane); -+ if (ret) -+ return ret; -+ -+ /* Clear phy isolation mode to make it work in normal mode */ -+ comphy_lane_reg_set(lane, COMPHY_ISOLATION_CTRL, -+ 0x0, PHY_ISOLATE_MODE); -+ -+ /* 0. Check the Polarity invert bits */ -+ data = 0x0; -+ if (lane->invert_tx) -+ data |= TXD_INVERT_BIT; -+ if (lane->invert_rx) -+ data |= RXD_INVERT_BIT; -+ mask = TXD_INVERT_BIT | RXD_INVERT_BIT; -+ comphy_lane_reg_set(lane, COMPHY_SYNC_PATTERN, data, mask); -+ -+ /* 1. Select 40-bit data width */ -+ comphy_lane_reg_set(lane, COMPHY_DIG_LOOPBACK_EN, -+ DATA_WIDTH_40BIT, SEL_DATA_WIDTH_MASK); -+ -+ /* 2. Select reference clock(25M) and PHY mode (SATA) */ -+ if (lane->priv->xtal_is_40m) -+ ref_clk = REF_FREF_SEL_SERDES_40MHZ; -+ else -+ ref_clk = REF_FREF_SEL_SERDES_25MHZ; -+ -+ data = ref_clk | COMPHY_MODE_SATA; -+ mask = REF_FREF_SEL_MASK | COMPHY_MODE_MASK; -+ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, data, mask); -+ -+ /* 3. Use maximum PLL rate (no power save) */ -+ comphy_lane_reg_set(lane, COMPHY_KVCO_CAL_CTRL, -+ USE_MAX_PLL_RATE_BIT, USE_MAX_PLL_RATE_BIT); -+ -+ /* 4. Reset reserved bit */ -+ comphy_set_indirect(lane->priv, COMPHY_RESERVED_REG, -+ 0x0, PHYCTRL_FRM_PIN_BIT); -+ -+ /* 5. Set vendor-specific configuration (It is done in sata driver) */ -+ /* XXX: in U-Boot below sequence was executed in this place, in Linux -+ * not. Now it is done only in U-Boot before this comphy -+ * initialization - tests shows that it works ok, but in case of any -+ * future problem it is left for reference. -+ * reg_set(MVEBU_REGS_BASE + 0xe00a0, 0, 0xffffffff); -+ * reg_set(MVEBU_REGS_BASE + 0xe00a4, BIT(6), BIT(6)); -+ */ -+ -+ /* Wait for > 55 us to allow PLL be enabled */ -+ udelay(PLL_SET_DELAY_US); -+ -+ /* Polling status */ -+ ret = comphy_lane_reg_poll(lane, COMPHY_DIG_LOOPBACK_EN, -+ PLL_READY_TX_BIT, COMPHY_PLL_SLEEP, -+ COMPHY_PLL_TIMEOUT); -+ if (ret) { -+ dev_err(lane->dev, "Failed to lock SATA PLL\n"); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static void comphy_gbe_phy_init(struct mvebu_a3700_comphy_lane *lane, -+ bool is_1gbps) -+{ -+ int addr, fix_idx; -+ u16 val; -+ -+ fix_idx = 0; -+ for (addr = 0; addr < 512; addr++) { -+ /* -+ * All PHY register values are defined in full for 3.125Gbps -+ * SERDES speed. The values required for 1.25 Gbps are almost -+ * the same and only few registers should be "fixed" in -+ * comparison to 3.125 Gbps values. These register values are -+ * stored in "gbe_phy_init_fix" array. -+ */ -+ if (!is_1gbps && gbe_phy_init_fix[fix_idx].addr == addr) { -+ /* Use new value */ -+ val = gbe_phy_init_fix[fix_idx].value; -+ if (fix_idx < ARRAY_SIZE(gbe_phy_init_fix)) -+ fix_idx++; -+ } else { -+ val = gbe_phy_init[addr]; -+ } -+ -+ comphy_lane_reg_set(lane, addr, val, 0xFFFF); -+ } -+} -+ -+static int -+mvebu_a3700_comphy_ethernet_power_on(struct mvebu_a3700_comphy_lane *lane) -+{ -+ u32 mask, data, speed_sel; -+ int ret; -+ -+ /* Set selector */ -+ ret = mvebu_a3700_comphy_set_phy_selector(lane); -+ if (ret) -+ return ret; -+ -+ /* -+ * 1. Reset PHY by setting PHY input port PIN_RESET=1. -+ * 2. Set PHY input port PIN_TX_IDLE=1, PIN_PU_IVREF=1 to keep -+ * PHY TXP/TXN output to idle state during PHY initialization -+ * 3. Set PHY input port PIN_PU_PLL=0, PIN_PU_RX=0, PIN_PU_TX=0. -+ */ -+ data = PIN_PU_IVREF_BIT | PIN_TX_IDLE_BIT | PIN_RESET_COMPHY_BIT; -+ mask = data | PIN_RESET_CORE_BIT | PIN_PU_PLL_BIT | PIN_PU_RX_BIT | -+ PIN_PU_TX_BIT | PHY_RX_INIT_BIT; -+ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); -+ -+ /* 4. Release reset to the PHY by setting PIN_RESET=0. */ -+ data = 0x0; -+ mask = PIN_RESET_COMPHY_BIT; -+ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); -+ -+ /* -+ * 5. Set PIN_PHY_GEN_TX[3:0] and PIN_PHY_GEN_RX[3:0] to decide COMPHY -+ * bit rate -+ */ -+ switch (lane->submode) { -+ case PHY_INTERFACE_MODE_SGMII: -+ case PHY_INTERFACE_MODE_1000BASEX: -+ /* SGMII 1G, SerDes speed 1.25G */ -+ speed_sel = SERDES_SPEED_1_25_G; -+ break; -+ case PHY_INTERFACE_MODE_2500BASEX: -+ /* 2500Base-X, SerDes speed 3.125G */ -+ speed_sel = SERDES_SPEED_3_125_G; -+ break; - default: -+ /* Other rates are not supported */ -+ dev_err(lane->dev, -+ "unsupported phy speed %d on comphy lane%d\n", -+ lane->submode, lane->id); - return -EINVAL; - } -+ data = GEN_RX_SEL_VALUE(speed_sel) | GEN_TX_SEL_VALUE(speed_sel); -+ mask = GEN_RX_SEL_MASK | GEN_TX_SEL_MASK; -+ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); -+ -+ /* -+ * 6. Wait 10mS for bandgap and reference clocks to stabilize; then -+ * start SW programming. -+ */ -+ mdelay(10); -+ -+ /* 7. Program COMPHY register PHY_MODE */ -+ data = COMPHY_MODE_SERDES; -+ mask = COMPHY_MODE_MASK; -+ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, data, mask); -+ -+ /* -+ * 8. Set COMPHY register REFCLK_SEL to select the correct REFCLK -+ * source -+ */ -+ data = 0x0; -+ mask = PHY_REF_CLK_SEL; -+ comphy_lane_reg_set(lane, COMPHY_MISC_CTRL0, data, mask); -+ -+ /* -+ * 9. Set correct reference clock frequency in COMPHY register -+ * REF_FREF_SEL. -+ */ -+ if (lane->priv->xtal_is_40m) -+ data = REF_FREF_SEL_SERDES_50MHZ; -+ else -+ data = REF_FREF_SEL_SERDES_25MHZ; -+ -+ mask = REF_FREF_SEL_MASK; -+ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, data, mask); -+ -+ /* 10. Program COMPHY register PHY_GEN_MAX[1:0] -+ * This step is mentioned in the flow received from verification team. -+ * However the PHY_GEN_MAX value is only meaningful for other interfaces -+ * (not SERDES). For instance, it selects SATA speed 1.5/3/6 Gbps or -+ * PCIe speed 2.5/5 Gbps -+ */ -+ -+ /* -+ * 11. Program COMPHY register SEL_BITS to set correct parallel data -+ * bus width -+ */ -+ data = DATA_WIDTH_10BIT; -+ mask = SEL_DATA_WIDTH_MASK; -+ comphy_lane_reg_set(lane, COMPHY_DIG_LOOPBACK_EN, data, mask); -+ -+ /* -+ * 12. As long as DFE function needs to be enabled in any mode, -+ * COMPHY register DFE_UPDATE_EN[5:0] shall be programmed to 0x3F -+ * for real chip during COMPHY power on. -+ * The step 14 exists (and empty) in the original initialization flow -+ * obtained from the verification team. According to the functional -+ * specification DFE_UPDATE_EN already has the default value 0x3F -+ */ -+ -+ /* -+ * 13. Program COMPHY GEN registers. -+ * These registers should be programmed based on the lab testing result -+ * to achieve optimal performance. Please contact the CEA group to get -+ * the related GEN table during real chip bring-up. We only required to -+ * run though the entire registers programming flow defined by -+ * "comphy_gbe_phy_init" when the REF clock is 40 MHz. For REF clock -+ * 25 MHz the default values stored in PHY registers are OK. -+ */ -+ dev_dbg(lane->dev, "Running C-DPI phy init %s mode\n", -+ lane->submode == PHY_INTERFACE_MODE_2500BASEX ? "2G5" : "1G"); -+ if (lane->priv->xtal_is_40m) -+ comphy_gbe_phy_init(lane, -+ lane->submode != PHY_INTERFACE_MODE_2500BASEX); -+ -+ /* -+ * 14. [Simulation Only] should not be used for real chip. -+ * By pass power up calibration by programming EXT_FORCE_CAL_DONE -+ * (R02h[9]) to 1 to shorten COMPHY simulation time. -+ */ -+ -+ /* -+ * 15. [Simulation Only: should not be used for real chip] -+ * Program COMPHY register FAST_DFE_TIMER_EN=1 to shorten RX training -+ * simulation time. -+ */ -+ -+ /* -+ * 16. Check the PHY Polarity invert bit -+ */ -+ data = 0x0; -+ if (lane->invert_tx) -+ data |= TXD_INVERT_BIT; -+ if (lane->invert_rx) -+ data |= RXD_INVERT_BIT; -+ mask = TXD_INVERT_BIT | RXD_INVERT_BIT; -+ comphy_lane_reg_set(lane, COMPHY_SYNC_PATTERN, data, mask); -+ -+ /* -+ * 17. Set PHY input ports PIN_PU_PLL, PIN_PU_TX and PIN_PU_RX to 1 to -+ * start PHY power up sequence. All the PHY register programming should -+ * be done before PIN_PU_PLL=1. There should be no register programming -+ * for normal PHY operation from this point. -+ */ -+ data = PIN_PU_PLL_BIT | PIN_PU_RX_BIT | PIN_PU_TX_BIT; -+ mask = data; -+ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); -+ -+ /* -+ * 18. Wait for PHY power up sequence to finish by checking output ports -+ * PIN_PLL_READY_TX=1 and PIN_PLL_READY_RX=1. -+ */ -+ ret = comphy_periph_reg_poll(lane, COMPHY_PHY_STAT1, -+ PHY_PLL_READY_TX_BIT | -+ PHY_PLL_READY_RX_BIT, -+ COMPHY_PLL_SLEEP, COMPHY_PLL_TIMEOUT); -+ if (ret) { -+ dev_err(lane->dev, "Failed to lock PLL for SERDES PHY %d\n", -+ lane->id); -+ return ret; -+ } -+ -+ /* -+ * 19. Set COMPHY input port PIN_TX_IDLE=0 -+ */ -+ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, 0x0, PIN_TX_IDLE_BIT); -+ -+ /* -+ * 20. After valid data appear on PIN_RXDATA bus, set PIN_RX_INIT=1. To -+ * start RX initialization. PIN_RX_INIT_DONE will be cleared to 0 by the -+ * PHY After RX initialization is done, PIN_RX_INIT_DONE will be set to -+ * 1 by COMPHY Set PIN_RX_INIT=0 after PIN_RX_INIT_DONE= 1. Please -+ * refer to RX initialization part for details. -+ */ -+ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, -+ PHY_RX_INIT_BIT, PHY_RX_INIT_BIT); -+ -+ ret = comphy_periph_reg_poll(lane, COMPHY_PHY_STAT1, -+ PHY_PLL_READY_TX_BIT | -+ PHY_PLL_READY_RX_BIT, -+ COMPHY_PLL_SLEEP, COMPHY_PLL_TIMEOUT); -+ if (ret) { -+ dev_err(lane->dev, "Failed to lock PLL for SERDES PHY %d\n", -+ lane->id); -+ return ret; -+ } -+ -+ ret = comphy_periph_reg_poll(lane, COMPHY_PHY_STAT1, -+ PHY_RX_INIT_DONE_BIT, -+ COMPHY_PLL_SLEEP, COMPHY_PLL_TIMEOUT); -+ if (ret) { -+ dev_err(lane->dev, "Failed to init RX of SERDES PHY %d\n", -+ lane->id); -+ return ret; -+ } -+ -+ return 0; - } - --static int mvebu_a3700_comphy_get_fw_mode(int lane, -+static int -+mvebu_a3700_comphy_usb3_power_on(struct mvebu_a3700_comphy_lane *lane) -+{ -+ u32 mask, data, cfg, ref_clk; -+ int ret; -+ -+ /* Set phy seclector */ -+ ret = mvebu_a3700_comphy_set_phy_selector(lane); -+ if (ret) -+ return ret; -+ -+ /* -+ * 0. Set PHY OTG Control(0x5d034), bit 4, Power up OTG module The -+ * register belong to UTMI module, so it is set in UTMI phy driver. -+ */ -+ -+ /* -+ * 1. Set PRD_TXDEEMPH (3.5db de-emph) -+ */ -+ data = PRD_TXDEEMPH0_MASK; -+ mask = PRD_TXDEEMPH0_MASK | PRD_TXMARGIN_MASK | PRD_TXSWING_MASK | -+ CFG_TX_ALIGN_POS_MASK; -+ comphy_lane_reg_set(lane, COMPHY_PIPE_LANE_CFG0, data, mask); -+ -+ /* -+ * 2. Set BIT0: enable transmitter in high impedance mode -+ * Set BIT[3:4]: delay 2 clock cycles for HiZ off latency -+ * Set BIT6: Tx detect Rx at HiZ mode -+ * Unset BIT15: set to 0 to set USB3 De-emphasize level to -3.5db -+ * together with bit 0 of COMPHY_PIPE_LANE_CFG0 register -+ */ -+ data = TX_DET_RX_MODE | GEN2_TX_DATA_DLY_DEFT | TX_ELEC_IDLE_MODE_EN; -+ mask = PRD_TXDEEMPH1_MASK | TX_DET_RX_MODE | GEN2_TX_DATA_DLY_MASK | -+ TX_ELEC_IDLE_MODE_EN; -+ comphy_lane_reg_set(lane, COMPHY_PIPE_LANE_CFG1, data, mask); -+ -+ /* -+ * 3. Set Spread Spectrum Clock Enabled -+ */ -+ comphy_lane_reg_set(lane, COMPHY_PIPE_LANE_CFG4, -+ SPREAD_SPECTRUM_CLK_EN, SPREAD_SPECTRUM_CLK_EN); -+ -+ /* -+ * 4. Set Override Margining Controls From the MAC: -+ * Use margining signals from lane configuration -+ */ -+ comphy_lane_reg_set(lane, COMPHY_PIPE_TEST_MODE_CTRL, -+ MODE_MARGIN_OVERRIDE, 0xFFFF); -+ -+ /* -+ * 5. Set Lane-to-Lane Bundle Clock Sampling Period = per PCLK cycles -+ * set Mode Clock Source = PCLK is generated from REFCLK -+ */ -+ data = 0x0; -+ mask = MODE_CLK_SRC | BUNDLE_PERIOD_SEL | BUNDLE_PERIOD_SCALE_MASK | -+ BUNDLE_SAMPLE_CTRL | PLL_READY_DLY_MASK; -+ comphy_lane_reg_set(lane, COMPHY_PIPE_CLK_SRC_LO, data, mask); -+ -+ /* -+ * 6. Set G2 Spread Spectrum Clock Amplitude at 4K -+ */ -+ comphy_lane_reg_set(lane, COMPHY_GEN2_SET2, -+ GS2_TX_SSC_AMP_4128, GS2_TX_SSC_AMP_MASK); -+ -+ /* -+ * 7. Unset G3 Spread Spectrum Clock Amplitude -+ * set G3 TX and RX Register Master Current Select -+ */ -+ data = GS2_VREG_RXTX_MAS_ISET_60U; -+ mask = GS2_TX_SSC_AMP_MASK | GS2_VREG_RXTX_MAS_ISET_MASK | -+ GS2_RSVD_6_0_MASK; -+ comphy_lane_reg_set(lane, COMPHY_GEN3_SET2, data, mask); -+ -+ /* -+ * 8. Check crystal jumper setting and program the Power and PLL Control -+ * accordingly Change RX wait -+ */ -+ if (lane->priv->xtal_is_40m) { -+ ref_clk = REF_FREF_SEL_PCIE_USB3_40MHZ; -+ cfg = CFG_PM_RXDLOZ_WAIT_12_UNIT; -+ } else { -+ ref_clk = REF_FREF_SEL_PCIE_USB3_25MHZ; -+ cfg = CFG_PM_RXDLOZ_WAIT_7_UNIT; -+ } -+ -+ data = PU_IVREF_BIT | PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT | -+ PU_TX_INTP_BIT | PU_DFE_BIT | COMPHY_MODE_USB3 | ref_clk; -+ mask = PU_IVREF_BIT | PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT | -+ PU_TX_INTP_BIT | PU_DFE_BIT | PLL_LOCK_BIT | COMPHY_MODE_MASK | -+ REF_FREF_SEL_MASK; -+ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, data, mask); -+ -+ data = CFG_PM_RXDEN_WAIT_1_UNIT | cfg; -+ mask = CFG_PM_OSCCLK_WAIT_MASK | CFG_PM_RXDEN_WAIT_MASK | -+ CFG_PM_RXDLOZ_WAIT_MASK; -+ comphy_lane_reg_set(lane, COMPHY_PIPE_PWR_MGM_TIM1, data, mask); -+ -+ /* -+ * 9. Enable idle sync -+ */ -+ comphy_lane_reg_set(lane, COMPHY_IDLE_SYNC_EN, -+ IDLE_SYNC_EN, IDLE_SYNC_EN); -+ -+ /* -+ * 10. Enable the output of 500M clock -+ */ -+ comphy_lane_reg_set(lane, COMPHY_MISC_CTRL0, CLK500M_EN, CLK500M_EN); -+ -+ /* -+ * 11. Set 20-bit data width -+ */ -+ comphy_lane_reg_set(lane, COMPHY_DIG_LOOPBACK_EN, -+ DATA_WIDTH_20BIT, 0xFFFF); -+ -+ /* -+ * 12. Override Speed_PLL value and use MAC PLL -+ */ -+ data = SPEED_PLL_VALUE_16 | USE_MAX_PLL_RATE_BIT; -+ mask = 0xFFFF; -+ comphy_lane_reg_set(lane, COMPHY_KVCO_CAL_CTRL, data, mask); -+ -+ /* -+ * 13. Check the Polarity invert bit -+ */ -+ data = 0x0; -+ if (lane->invert_tx) -+ data |= TXD_INVERT_BIT; -+ if (lane->invert_rx) -+ data |= RXD_INVERT_BIT; -+ mask = TXD_INVERT_BIT | RXD_INVERT_BIT; -+ comphy_lane_reg_set(lane, COMPHY_SYNC_PATTERN, data, mask); -+ -+ /* -+ * 14. Set max speed generation to USB3.0 5Gbps -+ */ -+ comphy_lane_reg_set(lane, COMPHY_SYNC_MASK_GEN, -+ PHY_GEN_MAX_USB3_5G, PHY_GEN_MAX_MASK); -+ -+ /* -+ * 15. Set capacitor value for FFE gain peaking to 0xF -+ */ -+ comphy_lane_reg_set(lane, COMPHY_GEN2_SET3, -+ GS3_FFE_CAP_SEL_VALUE, GS3_FFE_CAP_SEL_MASK); -+ -+ /* -+ * 16. Release SW reset -+ */ -+ data = MODE_CORE_CLK_FREQ_SEL | MODE_PIPE_WIDTH_32 | MODE_REFDIV_BY_4; -+ mask = 0xFFFF; -+ comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL, data, mask); -+ -+ /* Wait for > 55 us to allow PCLK be enabled */ -+ udelay(PLL_SET_DELAY_US); -+ -+ ret = comphy_lane_reg_poll(lane, COMPHY_PIPE_LANE_STAT1, TXDCLK_PCLK_EN, -+ COMPHY_PLL_SLEEP, COMPHY_PLL_TIMEOUT); -+ if (ret) { -+ dev_err(lane->dev, "Failed to lock USB3 PLL\n"); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static int -+mvebu_a3700_comphy_pcie_power_on(struct mvebu_a3700_comphy_lane *lane) -+{ -+ u32 mask, data, ref_clk; -+ int ret; -+ -+ /* Configure phy selector for PCIe */ -+ ret = mvebu_a3700_comphy_set_phy_selector(lane); -+ if (ret) -+ return ret; -+ -+ /* 1. Enable max PLL. */ -+ comphy_lane_reg_set(lane, COMPHY_PIPE_LANE_CFG1, -+ USE_MAX_PLL_RATE_EN, USE_MAX_PLL_RATE_EN); -+ -+ /* 2. Select 20 bit SERDES interface. */ -+ comphy_lane_reg_set(lane, COMPHY_PIPE_CLK_SRC_LO, -+ CFG_SEL_20B, CFG_SEL_20B); -+ -+ /* 3. Force to use reg setting for PCIe mode */ -+ comphy_lane_reg_set(lane, COMPHY_MISC_CTRL1, -+ SEL_BITS_PCIE_FORCE, SEL_BITS_PCIE_FORCE); -+ -+ /* 4. Change RX wait */ -+ data = CFG_PM_RXDEN_WAIT_1_UNIT | CFG_PM_RXDLOZ_WAIT_12_UNIT; -+ mask = CFG_PM_OSCCLK_WAIT_MASK | CFG_PM_RXDEN_WAIT_MASK | -+ CFG_PM_RXDLOZ_WAIT_MASK; -+ comphy_lane_reg_set(lane, COMPHY_PIPE_PWR_MGM_TIM1, data, mask); -+ -+ /* 5. Enable idle sync */ -+ comphy_lane_reg_set(lane, COMPHY_IDLE_SYNC_EN, -+ IDLE_SYNC_EN, IDLE_SYNC_EN); -+ -+ /* 6. Enable the output of 100M/125M/500M clock */ -+ data = CLK500M_EN | TXDCLK_2X_SEL | CLK100M_125M_EN; -+ mask = data; -+ comphy_lane_reg_set(lane, COMPHY_MISC_CTRL0, data, mask); -+ -+ /* -+ * 7. Enable TX, PCIE global register, 0xd0074814, it is done in -+ * PCI-E driver -+ */ -+ -+ /* -+ * 8. Check crystal jumper setting and program the Power and PLL -+ * Control accordingly -+ */ -+ -+ if (lane->priv->xtal_is_40m) -+ ref_clk = REF_FREF_SEL_PCIE_USB3_40MHZ; -+ else -+ ref_clk = REF_FREF_SEL_PCIE_USB3_25MHZ; -+ -+ data = PU_IVREF_BIT | PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT | -+ PU_TX_INTP_BIT | PU_DFE_BIT | COMPHY_MODE_PCIE | ref_clk; -+ mask = 0xFFFF; -+ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, data, mask); -+ -+ /* 9. Override Speed_PLL value and use MAC PLL */ -+ comphy_lane_reg_set(lane, COMPHY_KVCO_CAL_CTRL, -+ SPEED_PLL_VALUE_16 | USE_MAX_PLL_RATE_BIT, -+ 0xFFFF); -+ -+ /* 10. Check the Polarity invert bit */ -+ data = 0x0; -+ if (lane->invert_tx) -+ data |= TXD_INVERT_BIT; -+ if (lane->invert_rx) -+ data |= RXD_INVERT_BIT; -+ mask = TXD_INVERT_BIT | RXD_INVERT_BIT; -+ comphy_lane_reg_set(lane, COMPHY_SYNC_PATTERN, data, mask); -+ -+ /* 11. Release SW reset */ -+ data = MODE_CORE_CLK_FREQ_SEL | MODE_PIPE_WIDTH_32; -+ mask = data | PIPE_SOFT_RESET | MODE_REFDIV_MASK; -+ comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL, data, mask); -+ -+ /* Wait for > 55 us to allow PCLK be enabled */ -+ udelay(PLL_SET_DELAY_US); -+ -+ ret = comphy_lane_reg_poll(lane, COMPHY_PIPE_LANE_STAT1, TXDCLK_PCLK_EN, -+ COMPHY_PLL_SLEEP, COMPHY_PLL_TIMEOUT); -+ if (ret) { -+ dev_err(lane->dev, "Failed to lock PCIE PLL\n"); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static void -+mvebu_a3700_comphy_usb3_power_off(struct mvebu_a3700_comphy_lane *lane) -+{ -+ /* -+ * Currently the USB3 MAC sets the USB3 PHY to low state, so we do not -+ * need to power off USB3 PHY again. -+ */ -+} -+ -+static void -+mvebu_a3700_comphy_sata_power_off(struct mvebu_a3700_comphy_lane *lane) -+{ -+ /* Set phy isolation mode */ -+ comphy_lane_reg_set(lane, COMPHY_ISOLATION_CTRL, -+ PHY_ISOLATE_MODE, PHY_ISOLATE_MODE); -+ -+ /* Power off PLL, Tx, Rx */ -+ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, -+ 0x0, PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT); -+} -+ -+static void -+mvebu_a3700_comphy_ethernet_power_off(struct mvebu_a3700_comphy_lane *lane) -+{ -+ u32 mask, data; -+ -+ data = PIN_RESET_CORE_BIT | PIN_RESET_COMPHY_BIT | PIN_PU_IVREF_BIT | -+ PHY_RX_INIT_BIT; -+ mask = data; -+ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); -+} -+ -+static void -+mvebu_a3700_comphy_pcie_power_off(struct mvebu_a3700_comphy_lane *lane) -+{ -+ /* Power off PLL, Tx, Rx */ -+ comphy_lane_reg_set(lane, COMPHY_POWER_PLL_CTRL, -+ 0x0, PU_PLL_BIT | PU_RX_BIT | PU_TX_BIT); -+} -+ -+static int mvebu_a3700_comphy_reset(struct phy *phy) -+{ -+ struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); -+ u16 mask, data; -+ -+ dev_dbg(lane->dev, "resetting lane %d\n", lane->id); -+ -+ /* COMPHY reset for internal logic */ -+ comphy_lane_reg_set(lane, COMPHY_SFT_RESET, -+ SFT_RST_NO_REG, SFT_RST_NO_REG); -+ -+ /* COMPHY register reset (cleared automatically) */ -+ comphy_lane_reg_set(lane, COMPHY_SFT_RESET, SFT_RST, SFT_RST); -+ -+ /* PIPE soft and register reset */ -+ data = PIPE_SOFT_RESET | PIPE_REG_RESET; -+ mask = data; -+ comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL, data, mask); -+ -+ /* Release PIPE register reset */ -+ comphy_lane_reg_set(lane, COMPHY_PIPE_RST_CLK_CTRL, -+ 0x0, PIPE_REG_RESET); -+ -+ /* Reset SB configuration register (only for lanes 0 and 1) */ -+ if (lane->id == 0 || lane->id == 1) { -+ u32 mask, data; -+ -+ data = PIN_RESET_CORE_BIT | PIN_RESET_COMPHY_BIT | -+ PIN_PU_PLL_BIT | PIN_PU_RX_BIT | PIN_PU_TX_BIT; -+ mask = data | PIN_PU_IVREF_BIT | PIN_TX_IDLE_BIT; -+ comphy_periph_reg_set(lane, COMPHY_PHY_CFG1, data, mask); -+ } -+ -+ return 0; -+} -+ -+static bool mvebu_a3700_comphy_check_mode(int lane, - enum phy_mode mode, - int submode) - { -@@ -122,7 +1170,7 @@ static int mvebu_a3700_comphy_get_fw_mod - - /* Unused PHY mux value is 0x0 */ - if (mode == PHY_MODE_INVALID) -- return -EINVAL; -+ return false; - - for (i = 0; i < n; i++) { - if (mvebu_a3700_comphy_modes[i].lane == lane && -@@ -132,27 +1180,30 @@ static int mvebu_a3700_comphy_get_fw_mod - } - - if (i == n) -- return -EINVAL; -+ return false; - -- return mvebu_a3700_comphy_modes[i].fw_mode; -+ return true; - } - - static int mvebu_a3700_comphy_set_mode(struct phy *phy, enum phy_mode mode, - int submode) - { - struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); -- int fw_mode; -- -- if (submode == PHY_INTERFACE_MODE_1000BASEX) -- submode = PHY_INTERFACE_MODE_SGMII; - -- fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, mode, -- submode); -- if (fw_mode < 0) { -+ if (!mvebu_a3700_comphy_check_mode(lane->id, mode, submode)) { - dev_err(lane->dev, "invalid COMPHY mode\n"); -- return fw_mode; -+ return -EINVAL; - } - -+ /* Mode cannot be changed while the PHY is powered on */ -+ if (phy->power_count && -+ (lane->mode != mode || lane->submode != submode)) -+ return -EBUSY; -+ -+ /* If changing mode, ensure reset is called */ -+ if (lane->mode != PHY_MODE_INVALID && lane->mode != mode) -+ lane->needs_reset = true; -+ - /* Just remember the mode, ->power_on() will do the real setup */ - lane->mode = mode; - lane->submode = submode; -@@ -163,76 +1214,68 @@ static int mvebu_a3700_comphy_set_mode(s - static int mvebu_a3700_comphy_power_on(struct phy *phy) - { - struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); -- u32 fw_param; -- int fw_mode; -- int fw_port; - int ret; - -- fw_mode = mvebu_a3700_comphy_get_fw_mode(lane->id, -- lane->mode, lane->submode); -- if (fw_mode < 0) { -+ if (!mvebu_a3700_comphy_check_mode(lane->id, lane->mode, -+ lane->submode)) { - dev_err(lane->dev, "invalid COMPHY mode\n"); -- return fw_mode; -+ return -EINVAL; -+ } -+ -+ if (lane->needs_reset) { -+ ret = mvebu_a3700_comphy_reset(phy); -+ if (ret) -+ return ret; -+ -+ lane->needs_reset = false; - } - - switch (lane->mode) { - case PHY_MODE_USB_HOST_SS: - dev_dbg(lane->dev, "set lane %d to USB3 host mode\n", lane->id); -- fw_param = COMPHY_FW_MODE(fw_mode); -- break; -+ return mvebu_a3700_comphy_usb3_power_on(lane); - case PHY_MODE_SATA: - dev_dbg(lane->dev, "set lane %d to SATA mode\n", lane->id); -- fw_param = COMPHY_FW_MODE(fw_mode); -- break; -+ return mvebu_a3700_comphy_sata_power_on(lane); - case PHY_MODE_ETHERNET: -- fw_port = (lane->id == 0) ? 1 : 0; -- switch (lane->submode) { -- case PHY_INTERFACE_MODE_SGMII: -- dev_dbg(lane->dev, "set lane %d to SGMII mode\n", -- lane->id); -- fw_param = COMPHY_FW_NET(fw_mode, fw_port, -- COMPHY_FW_SPEED_1_25G); -- break; -- case PHY_INTERFACE_MODE_2500BASEX: -- dev_dbg(lane->dev, "set lane %d to 2500BASEX mode\n", -- lane->id); -- fw_param = COMPHY_FW_NET(fw_mode, fw_port, -- COMPHY_FW_SPEED_3_125G); -- break; -- default: -- dev_err(lane->dev, "unsupported PHY submode (%d)\n", -- lane->submode); -- return -ENOTSUPP; -- } -- break; -+ dev_dbg(lane->dev, "set lane %d to Ethernet mode\n", lane->id); -+ return mvebu_a3700_comphy_ethernet_power_on(lane); - case PHY_MODE_PCIE: - dev_dbg(lane->dev, "set lane %d to PCIe mode\n", lane->id); -- fw_param = COMPHY_FW_PCIE(fw_mode, COMPHY_FW_SPEED_5G, -- phy->attrs.bus_width); -- break; -+ return mvebu_a3700_comphy_pcie_power_on(lane); - default: - dev_err(lane->dev, "unsupported PHY mode (%d)\n", lane->mode); -- return -ENOTSUPP; -+ return -EOPNOTSUPP; - } -- -- ret = mvebu_a3700_comphy_smc(COMPHY_SIP_POWER_ON, lane->id, fw_param); -- if (ret == -EOPNOTSUPP) -- dev_err(lane->dev, -- "unsupported SMC call, try updating your firmware\n"); -- -- return ret; - } - - static int mvebu_a3700_comphy_power_off(struct phy *phy) - { - struct mvebu_a3700_comphy_lane *lane = phy_get_drvdata(phy); - -- return mvebu_a3700_comphy_smc(COMPHY_SIP_POWER_OFF, lane->id, 0); -+ switch (lane->mode) { -+ case PHY_MODE_USB_HOST_SS: -+ mvebu_a3700_comphy_usb3_power_off(lane); -+ return 0; -+ case PHY_MODE_SATA: -+ mvebu_a3700_comphy_sata_power_off(lane); -+ return 0; -+ case PHY_MODE_ETHERNET: -+ mvebu_a3700_comphy_ethernet_power_off(lane); -+ return 0; -+ case PHY_MODE_PCIE: -+ mvebu_a3700_comphy_pcie_power_off(lane); -+ return 0; -+ default: -+ dev_err(lane->dev, "invalid COMPHY mode\n"); -+ return -EINVAL; -+ } - } - - static const struct phy_ops mvebu_a3700_comphy_ops = { - .power_on = mvebu_a3700_comphy_power_on, - .power_off = mvebu_a3700_comphy_power_off, -+ .reset = mvebu_a3700_comphy_reset, - .set_mode = mvebu_a3700_comphy_set_mode, - .owner = THIS_MODULE, - }; -@@ -256,13 +1299,75 @@ static struct phy *mvebu_a3700_comphy_xl - return ERR_PTR(-EINVAL); - } - -+ lane->invert_tx = args->args[1] & BIT(0); -+ lane->invert_rx = args->args[1] & BIT(1); -+ - return phy; - } - - static int mvebu_a3700_comphy_probe(struct platform_device *pdev) - { -+ struct mvebu_a3700_comphy_priv *priv; - struct phy_provider *provider; - struct device_node *child; -+ struct resource *res; -+ struct clk *clk; -+ int ret; -+ -+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); -+ if (!priv) -+ return -ENOMEM; -+ -+ spin_lock_init(&priv->lock); -+ -+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "comphy"); -+ priv->comphy_regs = devm_ioremap_resource(&pdev->dev, res); -+ if (IS_ERR(priv->comphy_regs)) -+ return PTR_ERR(priv->comphy_regs); -+ -+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, -+ "lane1_pcie_gbe"); -+ priv->lane1_phy_regs = devm_ioremap_resource(&pdev->dev, res); -+ if (IS_ERR(priv->lane1_phy_regs)) -+ return PTR_ERR(priv->lane1_phy_regs); -+ -+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, -+ "lane0_usb3_gbe"); -+ priv->lane0_phy_regs = devm_ioremap_resource(&pdev->dev, res); -+ if (IS_ERR(priv->lane0_phy_regs)) -+ return PTR_ERR(priv->lane0_phy_regs); -+ -+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, -+ "lane2_sata_usb3"); -+ priv->lane2_phy_indirect = devm_ioremap_resource(&pdev->dev, res); -+ if (IS_ERR(priv->lane2_phy_indirect)) -+ return PTR_ERR(priv->lane2_phy_indirect); -+ -+ /* -+ * Driver needs to know if reference xtal clock is 40MHz or 25MHz. -+ * Old DT bindings do not have xtal clk present. So do not fail here -+ * and expects that default 25MHz reference clock is used. -+ */ -+ clk = clk_get(&pdev->dev, "xtal"); -+ if (IS_ERR(clk)) { -+ if (PTR_ERR(clk) == -EPROBE_DEFER) -+ return -EPROBE_DEFER; -+ dev_warn(&pdev->dev, "missing 'xtal' clk (%ld)\n", -+ PTR_ERR(clk)); -+ } else { -+ ret = clk_prepare_enable(clk); -+ if (ret) { -+ dev_warn(&pdev->dev, "enabling xtal clk failed (%d)\n", -+ ret); -+ } else { -+ if (clk_get_rate(clk) == 40000000) -+ priv->xtal_is_40m = true; -+ clk_disable_unprepare(clk); -+ } -+ clk_put(clk); -+ } -+ -+ dev_set_drvdata(&pdev->dev, priv); - - for_each_available_child_of_node(pdev->dev.of_node, child) { - struct mvebu_a3700_comphy_lane *lane; -@@ -277,7 +1382,7 @@ static int mvebu_a3700_comphy_probe(stru - continue; - } - -- if (lane_id >= MVEBU_A3700_COMPHY_LANES) { -+ if (lane_id >= 3) { - dev_err(&pdev->dev, "invalid 'reg' property\n"); - continue; - } -@@ -295,11 +1400,21 @@ static int mvebu_a3700_comphy_probe(stru - return PTR_ERR(phy); - } - -+ lane->priv = priv; - lane->dev = &pdev->dev; - lane->mode = PHY_MODE_INVALID; - lane->submode = PHY_INTERFACE_MODE_NA; - lane->id = lane_id; -+ lane->invert_tx = false; -+ lane->invert_rx = false; - phy_set_drvdata(phy, lane); -+ -+ /* -+ * To avoid relying on the bootloader/firmware configuration, -+ * power off all comphys. -+ */ -+ mvebu_a3700_comphy_reset(phy); -+ lane->needs_reset = false; - } - - provider = devm_of_phy_provider_register(&pdev->dev, -@@ -323,5 +1438,7 @@ static struct platform_driver mvebu_a370 - module_platform_driver(mvebu_a3700_comphy_driver); - - MODULE_AUTHOR("Miquèl Raynal "); -+MODULE_AUTHOR("Pali Rohár "); -+MODULE_AUTHOR("Marek Behún "); - MODULE_DESCRIPTION("Common PHY driver for A3700"); - MODULE_LICENSE("GPL v2"); diff --git a/target/linux/generic/pending-5.10/851-0003-arm64-dts-marvell-armada-37xx-Add-xtal-clock-to-comp.patch b/target/linux/generic/pending-5.10/851-0003-arm64-dts-marvell-armada-37xx-Add-xtal-clock-to-comp.patch deleted file mode 100644 index 33203a154d..0000000000 --- a/target/linux/generic/pending-5.10/851-0003-arm64-dts-marvell-armada-37xx-Add-xtal-clock-to-comp.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 66c51c39fd4bf05e99debf0e71de5704231c57dc Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Thu, 23 Sep 2021 19:26:26 +0200 -Subject: [PATCH] arm64: dts: marvell: armada-37xx: Add xtal clock to comphy - node -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Kernel driver phy-mvebu-a3700-comphy.c needs to know the rate of the -reference xtal clock. So add missing xtal clock source into comphy device -tree node. If the property is not present, the driver defaults to 25 MHz -xtal rate (which, as far as we know, is used by all the existing boards). - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún ---- - arch/arm64/boot/dts/marvell/armada-37xx.dtsi | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi -+++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi -@@ -265,6 +265,8 @@ - "lane2_sata_usb3"; - #address-cells = <1>; - #size-cells = <0>; -+ clocks = <&xtalclk>; -+ clock-names = "xtal"; - - comphy0: phy@0 { - reg = <0>; diff --git a/target/linux/generic/pending-5.10/851-0004-Revert-ata-ahci-mvebu-Make-SATA-PHY-optional-for-Arm.patch b/target/linux/generic/pending-5.10/851-0004-Revert-ata-ahci-mvebu-Make-SATA-PHY-optional-for-Arm.patch deleted file mode 100644 index 3c994d2548..0000000000 --- a/target/linux/generic/pending-5.10/851-0004-Revert-ata-ahci-mvebu-Make-SATA-PHY-optional-for-Arm.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 750bb44dbbe9dfb4ba3e1f8a746b831b39ba3cd9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Thu, 23 Sep 2021 19:35:57 +0200 -Subject: [PATCH] Revert "ata: ahci: mvebu: Make SATA PHY optional for Armada - 3720" -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This reverts commit 45aefe3d2251e4e229d7662052739f96ad1d08d9. - -Armada 3720 PHY driver (phy-mvebu-a3700-comphy.c) does not return --EOPNOTSUPP from phy_power_on() callback anymore. - -So remove AHCI_HFLAG_IGN_NOTSUPP_POWER_ON flag from Armada 3720 plat data. - -AHCI_HFLAG_IGN_NOTSUPP_POWER_ON is not used by any other ahci driver, so -remove this flag completely. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Acked-by: Miquel Raynal ---- - drivers/ata/ahci.h | 2 -- - drivers/ata/ahci_mvebu.c | 2 +- - drivers/ata/libahci_platform.c | 2 +- - 3 files changed, 2 insertions(+), 4 deletions(-) - ---- a/drivers/ata/ahci.h -+++ b/drivers/ata/ahci.h -@@ -240,8 +240,6 @@ enum { - as default lpm_policy */ - AHCI_HFLAG_SUSPEND_PHYS = (1 << 26), /* handle PHYs during - suspend/resume */ -- AHCI_HFLAG_IGN_NOTSUPP_POWER_ON = (1 << 27), /* ignore -EOPNOTSUPP -- from phy_power_on() */ - AHCI_HFLAG_NO_SXS = (1 << 28), /* SXS not supported */ - - /* ap->flags bits */ ---- a/drivers/ata/ahci_mvebu.c -+++ b/drivers/ata/ahci_mvebu.c -@@ -227,7 +227,7 @@ static const struct ahci_mvebu_plat_data - - static const struct ahci_mvebu_plat_data ahci_mvebu_armada_3700_plat_data = { - .plat_config = ahci_mvebu_armada_3700_config, -- .flags = AHCI_HFLAG_SUSPEND_PHYS | AHCI_HFLAG_IGN_NOTSUPP_POWER_ON, -+ .flags = AHCI_HFLAG_SUSPEND_PHYS, - }; - - static const struct of_device_id ahci_mvebu_of_match[] = { ---- a/drivers/ata/libahci_platform.c -+++ b/drivers/ata/libahci_platform.c -@@ -59,7 +59,7 @@ int ahci_platform_enable_phys(struct ahc - } - - rc = phy_power_on(hpriv->phys[i]); -- if (rc && !(rc == -EOPNOTSUPP && (hpriv->flags & AHCI_HFLAG_IGN_NOTSUPP_POWER_ON))) { -+ if (rc) { - phy_exit(hpriv->phys[i]); - goto disable_phys; - } diff --git a/target/linux/generic/pending-5.10/851-0005-Revert-usb-host-xhci-mvebu-make-USB-3.0-PHY-optional.patch b/target/linux/generic/pending-5.10/851-0005-Revert-usb-host-xhci-mvebu-make-USB-3.0-PHY-optional.patch deleted file mode 100644 index b8a3e880ce..0000000000 --- a/target/linux/generic/pending-5.10/851-0005-Revert-usb-host-xhci-mvebu-make-USB-3.0-PHY-optional.patch +++ /dev/null @@ -1,163 +0,0 @@ -From 9f0dfb279b1dd505d5e10b10e4a78a62030978d8 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Thu, 23 Sep 2021 19:40:06 +0200 -Subject: [PATCH] Revert "usb: host: xhci: mvebu: make USB 3.0 PHY optional for - Armada 3720" -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This reverts commit 3241929b67d28c83945d3191c6816a3271fd6b85. - -Armada 3720 phy driver (phy-mvebu-a3700-comphy.c) does not return --EOPNOTSUPP from phy_power_on() callback anymore. - -So remove XHCI_SKIP_PHY_INIT flag from xhci_mvebu_a3700_plat_setup() and -then also whole xhci_mvebu_a3700_plat_setup() function which is there just -to handle -EOPNOTSUPP for XHCI_SKIP_PHY_INIT. - -xhci plat_setup callback is not used by any other xhci plat driver, so -remove this callback completely. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Acked-by: Miquel Raynal ---- - drivers/usb/host/xhci-mvebu.c | 42 ----------------------------------- - drivers/usb/host/xhci-mvebu.h | 6 ----- - drivers/usb/host/xhci-plat.c | 20 +---------------- - drivers/usb/host/xhci-plat.h | 1 - - 4 files changed, 1 insertion(+), 68 deletions(-) - ---- a/drivers/usb/host/xhci-mvebu.c -+++ b/drivers/usb/host/xhci-mvebu.c -@@ -8,7 +8,6 @@ - #include - #include - #include --#include - - #include - #include -@@ -74,47 +73,6 @@ int xhci_mvebu_mbus_init_quirk(struct us - - return 0; - } -- --int xhci_mvebu_a3700_plat_setup(struct usb_hcd *hcd) --{ -- struct xhci_hcd *xhci = hcd_to_xhci(hcd); -- struct device *dev = hcd->self.controller; -- struct phy *phy; -- int ret; -- -- /* Old bindings miss the PHY handle */ -- phy = of_phy_get(dev->of_node, "usb3-phy"); -- if (IS_ERR(phy) && PTR_ERR(phy) == -EPROBE_DEFER) -- return -EPROBE_DEFER; -- else if (IS_ERR(phy)) -- goto phy_out; -- -- ret = phy_init(phy); -- if (ret) -- goto phy_put; -- -- ret = phy_set_mode(phy, PHY_MODE_USB_HOST_SS); -- if (ret) -- goto phy_exit; -- -- ret = phy_power_on(phy); -- if (ret == -EOPNOTSUPP) { -- /* Skip initializatin of XHCI PHY when it is unsupported by firmware */ -- dev_warn(dev, "PHY unsupported by firmware\n"); -- xhci->quirks |= XHCI_SKIP_PHY_INIT; -- } -- if (ret) -- goto phy_exit; -- -- phy_power_off(phy); --phy_exit: -- phy_exit(phy); --phy_put: -- of_phy_put(phy); --phy_out: -- -- return 0; --} - - int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd) - { ---- a/drivers/usb/host/xhci-mvebu.h -+++ b/drivers/usb/host/xhci-mvebu.h -@@ -12,18 +12,12 @@ struct usb_hcd; - - #if IS_ENABLED(CONFIG_USB_XHCI_MVEBU) - int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd); --int xhci_mvebu_a3700_plat_setup(struct usb_hcd *hcd); - int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd); - #else - static inline int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd) - { - return 0; - } -- --static inline int xhci_mvebu_a3700_plat_setup(struct usb_hcd *hcd) --{ -- return 0; --} - - static inline int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd) - { ---- a/drivers/usb/host/xhci-plat.c -+++ b/drivers/usb/host/xhci-plat.c -@@ -44,16 +44,6 @@ static void xhci_priv_plat_start(struct - priv->plat_start(hcd); - } - --static int xhci_priv_plat_setup(struct usb_hcd *hcd) --{ -- struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd); -- -- if (!priv->plat_setup) -- return 0; -- -- return priv->plat_setup(hcd); --} -- - static int xhci_priv_init_quirk(struct usb_hcd *hcd) - { - struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd); -@@ -121,7 +111,6 @@ static const struct xhci_plat_priv xhci_ - }; - - static const struct xhci_plat_priv xhci_plat_marvell_armada3700 = { -- .plat_setup = xhci_mvebu_a3700_plat_setup, - .init_quirk = xhci_mvebu_a3700_init_quirk, - }; - -@@ -341,14 +330,7 @@ static int xhci_plat_probe(struct platfo - - hcd->tpl_support = of_usb_host_tpl_support(sysdev->of_node); - xhci->shared_hcd->tpl_support = hcd->tpl_support; -- -- if (priv) { -- ret = xhci_priv_plat_setup(hcd); -- if (ret) -- goto disable_usb_phy; -- } -- -- if ((xhci->quirks & XHCI_SKIP_PHY_INIT) || (priv && (priv->quirks & XHCI_SKIP_PHY_INIT))) -+ if (priv && (priv->quirks & XHCI_SKIP_PHY_INIT)) - hcd->skip_phy_initialization = 1; - - if (priv && (priv->quirks & XHCI_SG_TRB_CACHE_SIZE_QUIRK)) ---- a/drivers/usb/host/xhci-plat.h -+++ b/drivers/usb/host/xhci-plat.h -@@ -13,7 +13,6 @@ - struct xhci_plat_priv { - const char *firmware_name; - unsigned long long quirks; -- int (*plat_setup)(struct usb_hcd *); - void (*plat_start)(struct usb_hcd *); - int (*init_quirk)(struct usb_hcd *); - int (*suspend_quirk)(struct usb_hcd *); diff --git a/target/linux/generic/pending-5.10/851-0006-Revert-PCI-aardvark-Fix-initialization-with-old-Marv.patch b/target/linux/generic/pending-5.10/851-0006-Revert-PCI-aardvark-Fix-initialization-with-old-Marv.patch deleted file mode 100644 index 3ac9269812..0000000000 --- a/target/linux/generic/pending-5.10/851-0006-Revert-PCI-aardvark-Fix-initialization-with-old-Marv.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 9a352062b7e3857742389dff6f64393481dc755e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Date: Thu, 23 Sep 2021 19:37:05 +0200 -Subject: [PATCH] Revert "PCI: aardvark: Fix initialization with old Marvell's - Arm Trusted Firmware" -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This reverts commit b0c6ae0f8948a2be6bf4e8b4bbab9ca1343289b6. - -Armada 3720 phy driver (phy-mvebu-a3700-comphy.c) does not return --EOPNOTSUPP from phy_power_on() callback anymore. - -So remove dead code which handles -EOPNOTSUPP return value. - -Signed-off-by: Pali Rohár -Signed-off-by: Marek Behún -Acked-by: Miquel Raynal ---- - drivers/pci/controller/pci-aardvark.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -1634,9 +1634,7 @@ static int advk_pcie_enable_phy(struct a - } - - ret = phy_power_on(pcie->phy); -- if (ret == -EOPNOTSUPP) { -- dev_warn(&pcie->pdev->dev, "PHY unsupported by firmware\n"); -- } else if (ret) { -+ if (ret) { - phy_exit(pcie->phy); - return ret; - } diff --git a/target/linux/generic/pending-5.10/920-mangle_bootargs.patch b/target/linux/generic/pending-5.10/920-mangle_bootargs.patch deleted file mode 100644 index 963b7113f7..0000000000 --- a/target/linux/generic/pending-5.10/920-mangle_bootargs.patch +++ /dev/null @@ -1,71 +0,0 @@ -From: Imre Kaloz -Subject: init: add CONFIG_MANGLE_BOOTARGS and disable it by default - -Enabling this option renames the bootloader supplied root= -and rootfstype= variables, which might have to be know but -would break the automatisms libreCMC uses. - -Signed-off-by: Imre Kaloz ---- - init/Kconfig | 9 +++++++++ - init/main.c | 24 ++++++++++++++++++++++++ - 2 files changed, 33 insertions(+) - ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -1817,6 +1817,15 @@ config EMBEDDED - an embedded system so certain expert options are available - for configuration. - -+config MANGLE_BOOTARGS -+ bool "Rename offending bootargs" -+ depends on EXPERT -+ help -+ Sometimes the bootloader passed bogus root= and rootfstype= -+ parameters to the kernel, and while you want to ignore them, -+ you need to know the values f.e. to support dual firmware -+ layouts on the flash. -+ - config HAVE_PERF_EVENTS - bool - help ---- a/init/main.c -+++ b/init/main.c -@@ -608,6 +608,29 @@ static inline void setup_nr_cpu_ids(void - static inline void smp_prepare_cpus(unsigned int maxcpus) { } - #endif - -+#ifdef CONFIG_MANGLE_BOOTARGS -+static void __init mangle_bootargs(char *command_line) -+{ -+ char *rootdev; -+ char *rootfs; -+ -+ rootdev = strstr(command_line, "root=/dev/mtdblock"); -+ -+ if (rootdev) -+ strncpy(rootdev, "mangled_rootblock=", 18); -+ -+ rootfs = strstr(command_line, "rootfstype"); -+ -+ if (rootfs) -+ strncpy(rootfs, "mangled_fs", 10); -+ -+} -+#else -+static void __init mangle_bootargs(char *command_line) -+{ -+} -+#endif -+ - /* - * We need to store the untouched command line for future reference. - * We also need to store the touched command line since the parameter -@@ -869,6 +892,7 @@ asmlinkage __visible void __init __no_sa - pr_notice("%s", linux_banner); - early_security_init(); - setup_arch(&command_line); -+ mangle_bootargs(command_line); - setup_boot_config(command_line); - setup_command_line(command_line); - setup_nr_cpu_ids(); diff --git a/target/linux/generic/pending-5.15/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch b/target/linux/generic/pending-5.15/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch new file mode 100644 index 0000000000..22f52c1d46 --- /dev/null +++ b/target/linux/generic/pending-5.15/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch @@ -0,0 +1,29 @@ +From: Felix Fietkau +Date: Thu, 22 Oct 2020 22:00:03 +0200 +Subject: [PATCH] compiler.h: only include asm/rwonce.h for kernel code + +This header file is not in uapi, which makes any user space code that includes +linux/compiler.h to fail with the error 'asm/rwonce.h: No such file or directory' + +Fixes: e506ea451254 ("compiler.h: Split {READ,WRITE}_ONCE definitions out into rwonce.h") +Signed-off-by: Felix Fietkau +--- + +--- a/include/linux/compiler.h ++++ b/include/linux/compiler.h +@@ -220,6 +220,8 @@ void ftrace_likely_update(struct ftrace_ + #define function_nocfi(x) (x) + #endif + ++#include ++ + #endif /* __KERNEL__ */ + + /* +@@ -252,6 +254,4 @@ static inline void *offset_to_ptr(const + */ + #define prevent_tail_call_optimization() mb() + +-#include +- + #endif /* __LINUX_COMPILER_H */ diff --git a/target/linux/generic/pending-5.15/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch b/target/linux/generic/pending-5.15/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch new file mode 100644 index 0000000000..95a9656d26 --- /dev/null +++ b/target/linux/generic/pending-5.15/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch @@ -0,0 +1,57 @@ +From: Felix Fietkau +Date: Wed, 18 Apr 2018 10:50:05 +0200 +Subject: [PATCH] MIPS: only process negative stack offsets on stack traces + +Fixes endless back traces in cases where the compiler emits a stack +pointer increase in a branch delay slot (probably for some form of +function return). + +[ 3.475442] BUG: MAX_STACK_TRACE_ENTRIES too low! +[ 3.480070] turning off the locking correctness validator. +[ 3.485521] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.14.34 #0 +[ 3.491475] Stack : 00000000 00000000 00000000 00000000 80e0fce2 00000034 00000000 00000000 +[ 3.499764] 87c3838c 80696377 8061047c 00000000 00000001 00000001 87c2d850 6534689f +[ 3.508059] 00000000 00000000 80e10000 00000000 00000000 000000cf 0000000f 00000000 +[ 3.516353] 00000000 806a0000 00076891 00000000 00000000 00000000 ffffffff 00000000 +[ 3.524648] 806c0000 00000004 80e10000 806a0000 00000003 80690000 00000000 80700000 +[ 3.532942] ... +[ 3.535362] Call Trace: +[ 3.537818] [<80010a48>] show_stack+0x58/0x100 +[ 3.542207] [<804c2f78>] dump_stack+0xe8/0x170 +[ 3.546613] [<80079f90>] save_trace+0xf0/0x110 +[ 3.551010] [<8007b1ec>] mark_lock+0x33c/0x78c +[ 3.555413] [<8007bf48>] __lock_acquire+0x2ac/0x1a08 +[ 3.560337] [<8007de60>] lock_acquire+0x64/0x8c +[ 3.564846] [<804e1570>] _raw_spin_lock_irqsave+0x54/0x78 +[ 3.570186] [<801b618c>] kernfs_notify+0x94/0xac +[ 3.574770] [<801b7b10>] sysfs_notify+0x74/0xa0 +[ 3.579257] [<801b618c>] kernfs_notify+0x94/0xac +[ 3.583839] [<801b7b10>] sysfs_notify+0x74/0xa0 +[ 3.588329] [<801b618c>] kernfs_notify+0x94/0xac +[ 3.592911] [<801b7b10>] sysfs_notify+0x74/0xa0 +[ 3.597401] [<801b618c>] kernfs_notify+0x94/0xac +[ 3.601983] [<801b7b10>] sysfs_notify+0x74/0xa0 +[ 3.606473] [<801b618c>] kernfs_notify+0x94/0xac +[ 3.611055] [<801b7b10>] sysfs_notify+0x74/0xa0 +[ 3.615545] [<801b618c>] kernfs_notify+0x94/0xac +[ 3.620125] [<801b7b10>] sysfs_notify+0x74/0xa0 +[ 3.624619] [<801b618c>] kernfs_notify+0x94/0xac +[ 3.629197] [<801b7b10>] sysfs_notify+0x74/0xa0 +[ 3.633691] [<801b618c>] kernfs_notify+0x94/0xac +[ 3.638269] [<801b7b10>] sysfs_notify+0x74/0xa0 +[ 3.642763] [<801b618c>] kernfs_notify+0x94/0xac + +Signed-off-by: Felix Fietkau +--- + +--- a/arch/mips/kernel/process.c ++++ b/arch/mips/kernel/process.c +@@ -393,6 +393,8 @@ static inline int is_sp_move_ins(union m + + if (ip->i_format.opcode == addiu_op || + ip->i_format.opcode == daddiu_op) { ++ if (ip->i_format.simmediate > 0) ++ return 0; + *frame_size = -ip->i_format.simmediate; + return 1; + } diff --git a/target/linux/generic/pending-5.15/103-kbuild-export-SUBARCH.patch b/target/linux/generic/pending-5.15/103-kbuild-export-SUBARCH.patch new file mode 100644 index 0000000000..120b6e4cf8 --- /dev/null +++ b/target/linux/generic/pending-5.15/103-kbuild-export-SUBARCH.patch @@ -0,0 +1,21 @@ +From 173019b66dcc9d68ad9333aa744dad1e369b5aa8 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Sun, 9 Jul 2017 00:26:53 +0200 +Subject: [PATCH 34/34] kernel: add compile fix for linux 4.9 on x86 + +Signed-off-by: Felix Fietkau +--- + Makefile | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/Makefile ++++ b/Makefile +@@ -534,7 +534,7 @@ KBUILD_LDFLAGS_MODULE := + KBUILD_LDFLAGS := + CLANG_FLAGS := + +-export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC HOSTPKG_CONFIG ++export ARCH SRCARCH SUBARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC HOSTPKG_CONFIG + export CPP AR NM STRIP OBJCOPY OBJDUMP READELF PAHOLE RESOLVE_BTFIDS LEX YACC AWK INSTALLKERNEL + export PERL PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX + export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD diff --git a/target/linux/generic/pending-5.15/110-v6.3-0001-spidev-Add-Silicon-Labs-EM3581-device-compatible.patch b/target/linux/generic/pending-5.15/110-v6.3-0001-spidev-Add-Silicon-Labs-EM3581-device-compatible.patch new file mode 100644 index 0000000000..5216d6a706 --- /dev/null +++ b/target/linux/generic/pending-5.15/110-v6.3-0001-spidev-Add-Silicon-Labs-EM3581-device-compatible.patch @@ -0,0 +1,32 @@ +From f7982c726e02001afc19052fe48f642dfcbc00b2 Mon Sep 17 00:00:00 2001 +From: Vincent Tremblay +Date: Mon, 26 Dec 2022 21:10:37 -0500 +Subject: [PATCH 1/2] spidev: Add Silicon Labs EM3581 device compatible + +Add compatible string for Silicon Labs EM3581 device. + +Note: This patch is adapted from a patch submitted to the for-next branch (v6.3). + +Signed-off-by: Vincent Tremblay +--- + drivers/spi/spidev.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/spi/spidev.c ++++ b/drivers/spi/spidev.c +@@ -691,6 +691,7 @@ static const struct spi_device_id spidev + { .name = "m53cpld" }, + { .name = "spi-petra" }, + { .name = "spi-authenta" }, ++ { .name = "em3581" }, + {}, + }; + MODULE_DEVICE_TABLE(spi, spidev_spi_ids); +@@ -705,6 +706,7 @@ static const struct of_device_id spidev_ + { .compatible = "menlo,m53cpld" }, + { .compatible = "cisco,spi-petra" }, + { .compatible = "micron,spi-authenta" }, ++ { .compatible = "silabs,em3581" }, + {}, + }; + MODULE_DEVICE_TABLE(of, spidev_dt_ids); diff --git a/target/linux/generic/pending-5.15/110-v6.3-0002-spidev-Add-Silicon-Labs-SI3210-device-compatible.patch b/target/linux/generic/pending-5.15/110-v6.3-0002-spidev-Add-Silicon-Labs-SI3210-device-compatible.patch new file mode 100644 index 0000000000..ffbed0c622 --- /dev/null +++ b/target/linux/generic/pending-5.15/110-v6.3-0002-spidev-Add-Silicon-Labs-SI3210-device-compatible.patch @@ -0,0 +1,32 @@ +From 536581825219e97fa2ae0c4de35605d2f6311416 Mon Sep 17 00:00:00 2001 +From: Vincent Tremblay +Date: Tue, 27 Dec 2022 09:00:58 -0500 +Subject: [PATCH 2/2] spidev: Add Silicon Labs SI3210 device compatible + +Add compatible string for Silicon Labs SI3210 device. + +Note: This patch is adapted from a patch submitted to the for-next branch (v6.3). + +Signed-off-by: Vincent Tremblay +--- + drivers/spi/spidev.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/spi/spidev.c ++++ b/drivers/spi/spidev.c +@@ -692,6 +692,7 @@ static const struct spi_device_id spidev + { .name = "spi-petra" }, + { .name = "spi-authenta" }, + { .name = "em3581" }, ++ { .name = "si3210" }, + {}, + }; + MODULE_DEVICE_TABLE(spi, spidev_spi_ids); +@@ -707,6 +708,7 @@ static const struct of_device_id spidev_ + { .compatible = "cisco,spi-petra" }, + { .compatible = "micron,spi-authenta" }, + { .compatible = "silabs,em3581" }, ++ { .compatible = "silabs,si3210" }, + {}, + }; + MODULE_DEVICE_TABLE(of, spidev_dt_ids); diff --git a/target/linux/generic/pending-5.15/111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch b/target/linux/generic/pending-5.15/111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch new file mode 100644 index 0000000000..d6b10491f8 --- /dev/null +++ b/target/linux/generic/pending-5.15/111-watchdog-max63xx_wdt-Add-support-for-specifying-WDI-.patch @@ -0,0 +1,75 @@ +From bd1b9f66d5134e518419f4c4dacf1884c1616983 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Thu, 28 Apr 2022 11:13:23 +0200 +Subject: [PATCH] watchdog: max63xx_wdt: Add support for specifying WDI logic + via GPIO +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +On some boards is WDI logic of max6370 chip connected via GPIO. +So extend max63xx_wdt driver to allow specifying WDI logic via GPIO. + +Signed-off-by: Pali Rohár +--- + drivers/watchdog/max63xx_wdt.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +--- a/drivers/watchdog/max63xx_wdt.c ++++ b/drivers/watchdog/max63xx_wdt.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + + #define DEFAULT_HEARTBEAT 60 + #define MAX_HEARTBEAT 60 +@@ -53,6 +54,9 @@ struct max63xx_wdt { + void __iomem *base; + spinlock_t lock; + ++ /* GPIOs */ ++ struct gpio_desc *gpio_wdi; ++ + /* WDI and WSET bits write access routines */ + void (*ping)(struct max63xx_wdt *wdt); + void (*set)(struct max63xx_wdt *wdt, u8 set); +@@ -158,6 +162,17 @@ static const struct watchdog_info max63x + .identity = "max63xx Watchdog", + }; + ++static void max63xx_gpio_ping(struct max63xx_wdt *wdt) ++{ ++ spin_lock(&wdt->lock); ++ ++ gpiod_set_value(wdt->gpio_wdi, 1); ++ udelay(1); ++ gpiod_set_value(wdt->gpio_wdi, 0); ++ ++ spin_unlock(&wdt->lock); ++} ++ + static void max63xx_mmap_ping(struct max63xx_wdt *wdt) + { + u8 val; +@@ -225,10 +240,19 @@ static int max63xx_wdt_probe(struct plat + return -EINVAL; + } + ++ wdt->gpio_wdi = devm_gpiod_get(dev, NULL, GPIOD_FLAGS_BIT_DIR_OUT); ++ if (IS_ERR(wdt->gpio_wdi) && PTR_ERR(wdt->gpio_wdi) != -ENOENT) ++ return dev_err_probe(dev, PTR_ERR(wdt->gpio_wdi), ++ "unable to request gpio: %ld\n", ++ PTR_ERR(wdt->gpio_wdi)); ++ + err = max63xx_mmap_init(pdev, wdt); + if (err) + return err; + ++ if (!IS_ERR(wdt->gpio_wdi)) ++ wdt->ping = max63xx_gpio_ping; ++ + platform_set_drvdata(pdev, &wdt->wdd); + watchdog_set_drvdata(&wdt->wdd, wdt); + diff --git a/target/linux/generic/pending-5.15/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch b/target/linux/generic/pending-5.15/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch new file mode 100644 index 0000000000..ac5e3a69b8 --- /dev/null +++ b/target/linux/generic/pending-5.15/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch @@ -0,0 +1,82 @@ +From: Tobias Wolf +Subject: mm: Fix alloc_node_mem_map with ARCH_PFN_OFFSET calculation + +An rt288x (ralink) based router (Belkin F5D8235 v1) does not boot with any +kernel beyond version 4.3 resulting in: + +BUG: Bad page state in process swapper pfn:086ac + +bisect resulted in: + +a1c34a3bf00af2cede839879502e12dc68491ad5 is the first bad commit +commit a1c34a3bf00af2cede839879502e12dc68491ad5 +Author: Laura Abbott +Date: Thu Nov 5 18:48:46 2015 -0800 + + mm: Don't offset memmap for flatmem + + Srinivas Kandagatla reported bad page messages when trying to remove the + bottom 2MB on an ARM based IFC6410 board + + BUG: Bad page state in process swapper pfn:fffa8 + page:ef7fb500 count:0 mapcount:0 mapping: (null) index:0x0 + flags: 0x96640253(locked|error|dirty|active|arch_1|reclaim|mlocked) + page dumped because: PAGE_FLAGS_CHECK_AT_FREE flag(s) set + bad because of flags: + flags: 0x200041(locked|active|mlocked) + Modules linked in: + CPU: 0 PID: 0 Comm: swapper Not tainted 3.19.0-rc3-00007-g412f9ba-dirty +#816 + Hardware name: Qualcomm (Flattened Device Tree) + unwind_backtrace + show_stack + dump_stack + bad_page + free_pages_prepare + free_hot_cold_page + __free_pages + free_highmem_page + mem_init + start_kernel + Disabling lock debugging due to kernel taint + [...] +:040000 040000 2de013c372345fd471cd58f0553c9b38b0ef1cc4 +0a8156f848733dfa21e16c196dfb6c0a76290709 M mm + +This fix for ARM does not account ARCH_PFN_OFFSET for mem_map as later used by +page_to_pfn anymore. + +The following output was generated with two hacked in printk statements: + +printk("before %p vs. %p or %p\n", mem_map, mem_map - offset, mem_map - +(pgdat->node_start_pfn - ARCH_PFN_OFFSET)); + if (page_to_pfn(mem_map) != pgdat->node_start_pfn) + mem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET); +printk("after %p\n", mem_map); + +Output: + +[ 0.000000] before 8861b280 vs. 8861b280 or 8851b280 +[ 0.000000] after 8851b280 + +As seen in the first line mem_map with subtraction of offset does not equal the +mem_map after subtraction of ARCH_PFN_OFFSET. + +After adding the offset of ARCH_PFN_OFFSET as well to mem_map as the +previously calculated offset is zero for the named platform it is able to boot +4.4 and 4.9-rc7 again. + +Signed-off-by: Tobias Wolf +--- + +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -7620,7 +7620,7 @@ static void __init alloc_node_mem_map(st + if (pgdat == NODE_DATA(0)) { + mem_map = NODE_DATA(0)->node_mem_map; + if (page_to_pfn(mem_map) != pgdat->node_start_pfn) +- mem_map -= offset; ++ mem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET); + } + #endif + } diff --git a/target/linux/generic/pending-5.15/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch b/target/linux/generic/pending-5.15/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch new file mode 100644 index 0000000000..8f40ae3ba2 --- /dev/null +++ b/target/linux/generic/pending-5.15/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch @@ -0,0 +1,81 @@ +From: Felix Fietkau +Subject: jffs2: use .rename2 and add RENAME_WHITEOUT support + +It is required for renames on overlayfs + +Signed-off-by: Felix Fietkau +--- + +--- a/fs/jffs2/dir.c ++++ b/fs/jffs2/dir.c +@@ -614,8 +614,8 @@ static int jffs2_rmdir (struct inode *di + return ret; + } + +-static int jffs2_mknod (struct user_namespace *mnt_userns, struct inode *dir_i, +- struct dentry *dentry, umode_t mode, dev_t rdev) ++static int __jffs2_mknod (struct user_namespace *mnt_userns, struct inode *dir_i, ++ struct dentry *dentry, umode_t mode, dev_t rdev, bool whiteout) + { + struct jffs2_inode_info *f, *dir_f; + struct jffs2_sb_info *c; +@@ -754,7 +754,11 @@ static int jffs2_mknod (struct user_name + mutex_unlock(&dir_f->sem); + jffs2_complete_reservation(c); + +- d_instantiate_new(dentry, inode); ++ if (!whiteout) ++ d_instantiate_new(dentry, inode); ++ else ++ unlock_new_inode(inode); ++ + return 0; + + fail: +@@ -762,6 +766,19 @@ static int jffs2_mknod (struct user_name + return ret; + } + ++static int jffs2_mknod (struct user_namespace *mnt_userns, struct inode *dir_i, ++ struct dentry *dentry, umode_t mode, dev_t rdev) ++{ ++ return __jffs2_mknod(mnt_userns, dir_i, dentry, mode, rdev, false); ++} ++ ++static int jffs2_whiteout (struct user_namespace *mnt_userns, struct inode *old_dir, ++ struct dentry *old_dentry) ++{ ++ return __jffs2_mknod(mnt_userns, old_dir, old_dentry, S_IFCHR | WHITEOUT_MODE, ++ WHITEOUT_DEV, true); ++} ++ + static int jffs2_rename (struct user_namespace *mnt_userns, + struct inode *old_dir_i, struct dentry *old_dentry, + struct inode *new_dir_i, struct dentry *new_dentry, +@@ -773,7 +790,7 @@ static int jffs2_rename (struct user_nam + uint8_t type; + uint32_t now; + +- if (flags & ~RENAME_NOREPLACE) ++ if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT)) + return -EINVAL; + + /* The VFS will check for us and prevent trying to rename a +@@ -839,9 +856,14 @@ static int jffs2_rename (struct user_nam + if (d_is_dir(old_dentry) && !victim_f) + inc_nlink(new_dir_i); + +- /* Unlink the original */ +- ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), +- old_dentry->d_name.name, old_dentry->d_name.len, NULL, now); ++ if (flags & RENAME_WHITEOUT) ++ /* Replace with whiteout */ ++ ret = jffs2_whiteout(mnt_userns, old_dir_i, old_dentry); ++ else ++ /* Unlink the original */ ++ ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), ++ old_dentry->d_name.name, ++ old_dentry->d_name.len, NULL, now); + + /* We don't touch inode->i_nlink */ + diff --git a/target/linux/generic/pending-5.15/141-jffs2-add-RENAME_EXCHANGE-support.patch b/target/linux/generic/pending-5.15/141-jffs2-add-RENAME_EXCHANGE-support.patch new file mode 100644 index 0000000000..f58fc791d2 --- /dev/null +++ b/target/linux/generic/pending-5.15/141-jffs2-add-RENAME_EXCHANGE-support.patch @@ -0,0 +1,73 @@ +From: Felix Fietkau +Subject: jffs2: add RENAME_EXCHANGE support + +Signed-off-by: Felix Fietkau +--- + +--- a/fs/jffs2/dir.c ++++ b/fs/jffs2/dir.c +@@ -787,18 +787,31 @@ static int jffs2_rename (struct user_nam + int ret; + struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb); + struct jffs2_inode_info *victim_f = NULL; ++ struct inode *fst_inode = d_inode(old_dentry); ++ struct inode *snd_inode = d_inode(new_dentry); + uint8_t type; + uint32_t now; + +- if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT)) ++ if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT|RENAME_EXCHANGE)) + return -EINVAL; + ++ if ((flags & RENAME_EXCHANGE) && (old_dir_i != new_dir_i)) { ++ if (S_ISDIR(fst_inode->i_mode) && !S_ISDIR(snd_inode->i_mode)) { ++ inc_nlink(new_dir_i); ++ drop_nlink(old_dir_i); ++ } ++ else if (!S_ISDIR(fst_inode->i_mode) && S_ISDIR(snd_inode->i_mode)) { ++ drop_nlink(new_dir_i); ++ inc_nlink(old_dir_i); ++ } ++ } ++ + /* The VFS will check for us and prevent trying to rename a + * file over a directory and vice versa, but if it's a directory, + * the VFS can't check whether the victim is empty. The filesystem + * needs to do that for itself. + */ +- if (d_really_is_positive(new_dentry)) { ++ if (d_really_is_positive(new_dentry) && !(flags & RENAME_EXCHANGE)) { + victim_f = JFFS2_INODE_INFO(d_inode(new_dentry)); + if (d_is_dir(new_dentry)) { + struct jffs2_full_dirent *fd; +@@ -833,7 +846,7 @@ static int jffs2_rename (struct user_nam + if (ret) + return ret; + +- if (victim_f) { ++ if (victim_f && !(flags & RENAME_EXCHANGE)) { + /* There was a victim. Kill it off nicely */ + if (d_is_dir(new_dentry)) + clear_nlink(d_inode(new_dentry)); +@@ -859,6 +872,12 @@ static int jffs2_rename (struct user_nam + if (flags & RENAME_WHITEOUT) + /* Replace with whiteout */ + ret = jffs2_whiteout(mnt_userns, old_dir_i, old_dentry); ++ else if (flags & RENAME_EXCHANGE) ++ /* Replace the original */ ++ ret = jffs2_do_link(c, JFFS2_INODE_INFO(old_dir_i), ++ d_inode(new_dentry)->i_ino, type, ++ old_dentry->d_name.name, old_dentry->d_name.len, ++ now); + else + /* Unlink the original */ + ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), +@@ -890,7 +909,7 @@ static int jffs2_rename (struct user_nam + return ret; + } + +- if (d_is_dir(old_dentry)) ++ if (d_is_dir(old_dentry) && !(flags & RENAME_EXCHANGE)) + drop_nlink(old_dir_i); + + new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now); diff --git a/target/linux/generic/pending-5.10/142-jffs2-add-splice-ops.patch b/target/linux/generic/pending-5.15/142-jffs2-add-splice-ops.patch similarity index 100% rename from target/linux/generic/pending-5.10/142-jffs2-add-splice-ops.patch rename to target/linux/generic/pending-5.15/142-jffs2-add-splice-ops.patch diff --git a/target/linux/generic/pending-5.15/150-bridge_allow_receiption_on_disabled_port.patch b/target/linux/generic/pending-5.15/150-bridge_allow_receiption_on_disabled_port.patch new file mode 100644 index 0000000000..9968a79699 --- /dev/null +++ b/target/linux/generic/pending-5.15/150-bridge_allow_receiption_on_disabled_port.patch @@ -0,0 +1,45 @@ +From: Stephen Hemminger +Subject: bridge: allow receiption on disabled port + +When an ethernet device is enslaved to a bridge, and the bridge STP +detects loss of carrier (or operational state down), then normally +packet receiption is blocked. + +This breaks control applications like WPA which maybe expecting to +receive packets to negotiate to bring link up. The bridge needs to +block forwarding packets from these disabled ports, but there is no +hard requirement to not allow local packet delivery. + +Signed-off-by: Stephen Hemminger +Signed-off-by: Felix Fietkau + +--- a/net/bridge/br_input.c ++++ b/net/bridge/br_input.c +@@ -204,6 +204,9 @@ static void __br_handle_local_finish(str + /* note: already called with rcu_read_lock */ + static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb) + { ++ struct net_bridge_port *p = br_port_get_rcu(skb->dev); ++ ++ if (p->state != BR_STATE_DISABLED) + __br_handle_local_finish(skb); + + /* return 1 to signal the okfn() was called so it's ok to use the skb */ +@@ -369,6 +372,17 @@ static rx_handler_result_t br_handle_fra + + forward: + switch (p->state) { ++ case BR_STATE_DISABLED: ++ if (ether_addr_equal(p->br->dev->dev_addr, dest)) ++ skb->pkt_type = PACKET_HOST; ++ ++ if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, ++ dev_net(skb->dev), NULL, skb, skb->dev, NULL, ++ br_handle_local_finish) == 1) { ++ return RX_HANDLER_PASS; ++ } ++ break; ++ + case BR_STATE_FORWARDING: + case BR_STATE_LEARNING: + if (ether_addr_equal(p->br->dev->dev_addr, dest)) diff --git a/target/linux/generic/pending-5.10/190-rtc-rs5c372-support_alarms_up_to_1_week.patch b/target/linux/generic/pending-5.15/190-rtc-rs5c372-support_alarms_up_to_1_week.patch similarity index 100% rename from target/linux/generic/pending-5.10/190-rtc-rs5c372-support_alarms_up_to_1_week.patch rename to target/linux/generic/pending-5.15/190-rtc-rs5c372-support_alarms_up_to_1_week.patch diff --git a/target/linux/generic/pending-5.10/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch b/target/linux/generic/pending-5.15/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch similarity index 100% rename from target/linux/generic/pending-5.10/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch rename to target/linux/generic/pending-5.15/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch diff --git a/target/linux/generic/pending-5.15/203-kallsyms_uncompressed.patch b/target/linux/generic/pending-5.15/203-kallsyms_uncompressed.patch new file mode 100644 index 0000000000..930d0ff0fe --- /dev/null +++ b/target/linux/generic/pending-5.15/203-kallsyms_uncompressed.patch @@ -0,0 +1,119 @@ +From: Felix Fietkau +Subject: kernel: add a config option for keeping the kallsyms table uncompressed, saving ~9kb kernel size after lzma on ar71xx + +[john@phrozen.org: added to my upstream queue 30.12.2016] +lede-commit: e0e3509b5ce2ccf93d4d67ea907613f5f7ec2eed +Signed-off-by: Felix Fietkau +--- + init/Kconfig | 11 +++++++++++ + kernel/kallsyms.c | 8 ++++++++ + scripts/kallsyms.c | 12 ++++++++++++ + scripts/link-vmlinux.sh | 4 ++++ + 4 files changed, 35 insertions(+) + +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -1447,6 +1447,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW + the unaligned access emulation. + see arch/parisc/kernel/unaligned.c for reference + ++config KALLSYMS_UNCOMPRESSED ++ bool "Keep kallsyms uncompressed" ++ depends on KALLSYMS ++ help ++ Normally kallsyms contains compressed symbols (using a token table), ++ reducing the uncompressed kernel image size. Keeping the symbol table ++ uncompressed significantly improves the size of this part in compressed ++ kernel images. ++ ++ Say N unless you need compressed kernel images to be small. ++ + config HAVE_PCSPKR_PLATFORM + bool + +--- a/kernel/kallsyms.c ++++ b/kernel/kallsyms.c +@@ -80,6 +80,11 @@ static unsigned int kallsyms_expand_symb + * For every byte on the compressed symbol data, copy the table + * entry for that byte. + */ ++#ifdef CONFIG_KALLSYMS_UNCOMPRESSED ++ memcpy(result, data + 1, len - 1); ++ result += len - 1; ++ len = 0; ++#endif + while (len) { + tptr = &kallsyms_token_table[kallsyms_token_index[*data]]; + data++; +@@ -112,6 +117,9 @@ tail: + */ + static char kallsyms_get_symbol_type(unsigned int off) + { ++#ifdef CONFIG_KALLSYMS_UNCOMPRESSED ++ return kallsyms_names[off + 1]; ++#endif + /* + * Get just the first code, look it up in the token table, + * and return the first char from this token. +--- a/scripts/kallsyms.c ++++ b/scripts/kallsyms.c +@@ -58,6 +58,7 @@ static struct addr_range percpu_range = + static struct sym_entry **table; + static unsigned int table_size, table_cnt; + static int all_symbols; ++static int uncompressed; + static int absolute_percpu; + static int base_relative; + +@@ -486,6 +487,9 @@ static void write_src(void) + + free(markers); + ++ if (uncompressed) ++ return; ++ + output_label("kallsyms_token_table"); + off = 0; + for (i = 0; i < 256; i++) { +@@ -537,6 +541,9 @@ static unsigned char *find_token(unsigne + { + int i; + ++ if (uncompressed) ++ return NULL; ++ + for (i = 0; i < len - 1; i++) { + if (str[i] == token[0] && str[i+1] == token[1]) + return &str[i]; +@@ -609,6 +616,9 @@ static void optimize_result(void) + { + int i, best; + ++ if (uncompressed) ++ return; ++ + /* using the '\0' symbol last allows compress_symbols to use standard + * fast string functions */ + for (i = 255; i >= 0; i--) { +@@ -773,6 +783,8 @@ int main(int argc, char **argv) + absolute_percpu = 1; + else if (strcmp(argv[i], "--base-relative") == 0) + base_relative = 1; ++ else if (strcmp(argv[i], "--uncompressed") == 0) ++ uncompressed = 1; + else + usage(); + } +--- a/scripts/link-vmlinux.sh ++++ b/scripts/link-vmlinux.sh +@@ -257,6 +257,10 @@ kallsyms() + kallsymopt="${kallsymopt} --base-relative" + fi + ++ if [ -n "${CONFIG_KALLSYMS_UNCOMPRESSED}" ]; then ++ kallsymopt="${kallsymopt} --uncompressed" ++ fi ++ + info KSYMS ${2} + ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2} + } diff --git a/target/linux/generic/pending-5.15/205-backtrace_module_info.patch b/target/linux/generic/pending-5.15/205-backtrace_module_info.patch new file mode 100644 index 0000000000..6379ce071d --- /dev/null +++ b/target/linux/generic/pending-5.15/205-backtrace_module_info.patch @@ -0,0 +1,41 @@ +From: Felix Fietkau +Subject: kernel: when KALLSYMS is disabled, print module address + size for matching backtrace entries + +[john@phrozen.org: felix will add this to his upstream queue] + +lede-commit 53827cdc824556cda910b23ce5030c363b8f1461 +Signed-off-by: Felix Fietkau +--- + lib/vsprintf.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +--- a/lib/vsprintf.c ++++ b/lib/vsprintf.c +@@ -1003,8 +1003,10 @@ char *symbol_string(char *buf, char *end + struct printf_spec spec, const char *fmt) + { + unsigned long value; +-#ifdef CONFIG_KALLSYMS + char sym[KSYM_SYMBOL_LEN]; ++#ifndef CONFIG_KALLSYMS ++ struct module *mod; ++ int len; + #endif + + if (fmt[1] == 'R') +@@ -1025,8 +1027,14 @@ char *symbol_string(char *buf, char *end + + return string_nocheck(buf, end, sym, spec); + #else +- return special_hex_number(buf, end, value, sizeof(void *)); ++ len = snprintf(sym, sizeof(sym), "0x%lx", value); ++ mod = __module_address(value); ++ if (mod) ++ snprintf(sym + len, sizeof(sym) - len, " [%s@%p+0x%x]", ++ mod->name, mod->core_layout.base, ++ mod->core_layout.size); + #endif ++ return string(buf, end, sym, spec); + } + + static const struct printf_spec default_str_spec = { diff --git a/target/linux/generic/pending-5.10/240-remove-unsane-filenames-from-deps_initramfs-list.patch b/target/linux/generic/pending-5.15/240-remove-unsane-filenames-from-deps_initramfs-list.patch similarity index 100% rename from target/linux/generic/pending-5.10/240-remove-unsane-filenames-from-deps_initramfs-list.patch rename to target/linux/generic/pending-5.15/240-remove-unsane-filenames-from-deps_initramfs-list.patch diff --git a/target/linux/generic/pending-5.10/261-enable_wilink_platform_without_drivers.patch b/target/linux/generic/pending-5.15/261-enable_wilink_platform_without_drivers.patch similarity index 100% rename from target/linux/generic/pending-5.10/261-enable_wilink_platform_without_drivers.patch rename to target/linux/generic/pending-5.15/261-enable_wilink_platform_without_drivers.patch diff --git a/target/linux/generic/pending-5.15/270-platform-mikrotik-build-bits.patch b/target/linux/generic/pending-5.15/270-platform-mikrotik-build-bits.patch new file mode 100644 index 0000000000..99f83bb2c4 --- /dev/null +++ b/target/linux/generic/pending-5.15/270-platform-mikrotik-build-bits.patch @@ -0,0 +1,31 @@ +From c2deb5ef01a0ef09088832744cbace9e239a6ee0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= +Date: Sat, 28 Mar 2020 12:11:50 +0100 +Subject: [PATCH] generic: platform/mikrotik build bits (5.4) +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch adds platform/mikrotik kernel build bits + +Signed-off-by: Thibaut VARÈNE +--- + drivers/platform/Kconfig | 2 ++ + drivers/platform/Makefile | 1 + + 2 files changed, 3 insertions(+) + +--- a/drivers/platform/Kconfig ++++ b/drivers/platform/Kconfig +@@ -15,3 +15,5 @@ source "drivers/platform/mellanox/Kconfi + source "drivers/platform/olpc/Kconfig" + + source "drivers/platform/surface/Kconfig" ++ ++source "drivers/platform/mikrotik/Kconfig" +--- a/drivers/platform/Makefile ++++ b/drivers/platform/Makefile +@@ -10,3 +10,4 @@ obj-$(CONFIG_OLPC_EC) += olpc/ + obj-$(CONFIG_GOLDFISH) += goldfish/ + obj-$(CONFIG_CHROME_PLATFORMS) += chrome/ + obj-$(CONFIG_SURFACE_PLATFORMS) += surface/ ++obj-$(CONFIG_MIKROTIK) += mikrotik/ diff --git a/target/linux/generic/pending-5.15/300-mips_expose_boot_raw.patch b/target/linux/generic/pending-5.15/300-mips_expose_boot_raw.patch new file mode 100644 index 0000000000..be4dacf094 --- /dev/null +++ b/target/linux/generic/pending-5.15/300-mips_expose_boot_raw.patch @@ -0,0 +1,40 @@ +From: Mark Miller +Subject: mips: expose CONFIG_BOOT_RAW + +This exposes the CONFIG_BOOT_RAW symbol in Kconfig. This is needed on +certain Broadcom chipsets running CFE in order to load the kernel. + +Signed-off-by: Mark Miller +Acked-by: Rob Landley +--- +--- a/arch/mips/Kconfig ++++ b/arch/mips/Kconfig +@@ -1103,9 +1103,6 @@ config FW_ARC + config ARCH_MAY_HAVE_PC_FDC + bool + +-config BOOT_RAW +- bool +- + config CEVT_BCM1480 + bool + +@@ -3186,6 +3183,18 @@ choice + bool "Extend builtin kernel arguments with bootloader arguments" + endchoice + ++config BOOT_RAW ++ bool "Enable the kernel to be executed from the load address" ++ default n ++ help ++ Allow the kernel to be executed from the load address for ++ bootloaders which cannot read the ELF format. This places ++ a jump to start_kernel at the load address. ++ ++ If unsure, say N. ++ ++ ++ + endmenu + + config LOCKDEP_SUPPORT diff --git a/target/linux/generic/pending-5.15/301-MIPS-Add-barriers-between-dcache-icache-flushes.patch b/target/linux/generic/pending-5.15/301-MIPS-Add-barriers-between-dcache-icache-flushes.patch new file mode 100644 index 0000000000..726c884027 --- /dev/null +++ b/target/linux/generic/pending-5.15/301-MIPS-Add-barriers-between-dcache-icache-flushes.patch @@ -0,0 +1,71 @@ +From e6e6ef4275978823ec3a84133fc91f4ffbef5c84 Mon Sep 17 00:00:00 2001 +From: Paul Burton +Date: Mon, 22 Feb 2016 18:09:44 +0000 +Subject: [PATCH] MIPS: Add barriers between dcache & icache flushes + +Index-based cache operations may be arbitrarily reordered by out of +order CPUs. Thus code which writes back the dcache & then invalidates +the icache using indexed cache ops must include a barrier between +operating on the 2 caches in order to prevent the scenario in which: + + - icache invalidation occurs. + + - icache fetch occurs, due to speculation. + + - dcache writeback occurs. + +If the above were allowed to happen then the icache would contain stale +data. Forcing the dcache writeback to complete before the icache +invalidation avoids this. + +Signed-off-by: Paul Burton +Cc: James Hogan +--- + arch/mips/mm/c-r4k.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +--- a/arch/mips/mm/c-r4k.c ++++ b/arch/mips/mm/c-r4k.c +@@ -515,6 +515,7 @@ static inline void local_r4k___flush_cac + + default: + r4k_blast_dcache(); ++ mb(); /* cache instructions may be reordered */ + r4k_blast_icache(); + break; + } +@@ -595,8 +596,10 @@ static inline void local_r4k_flush_cache + if (cpu_has_dc_aliases || (exec && !cpu_has_ic_fills_f_dc)) + r4k_blast_dcache(); + /* If executable, blast stale lines from icache */ +- if (exec) ++ if (exec) { ++ mb(); /* cache instructions may be reordered */ + r4k_blast_icache(); ++ } + } + + static void r4k_flush_cache_range(struct vm_area_struct *vma, +@@ -697,8 +700,13 @@ static inline void local_r4k_flush_cache + if (cpu_has_dc_aliases || (exec && !cpu_has_ic_fills_f_dc)) { + vaddr ? r4k_blast_dcache_page(addr) : + r4k_blast_dcache_user_page(addr); +- if (exec && !cpu_icache_snoops_remote_store) ++ if (exec) ++ mb(); /* cache instructions may be reordered */ ++ ++ if (exec && !cpu_icache_snoops_remote_store) { + r4k_blast_scache_page(addr); ++ mb(); /* cache instructions may be reordered */ ++ } + } + if (exec) { + if (vaddr && cpu_has_vtag_icache && mm == current->active_mm) { +@@ -765,6 +773,7 @@ static inline void __local_r4k_flush_ica + else + blast_dcache_range(start, end); + } ++ mb(); /* cache instructions may be reordered */ + } + + if (type == R4K_INDEX || diff --git a/target/linux/generic/pending-5.10/302-mips_no_branch_likely.patch b/target/linux/generic/pending-5.15/302-mips_no_branch_likely.patch similarity index 100% rename from target/linux/generic/pending-5.10/302-mips_no_branch_likely.patch rename to target/linux/generic/pending-5.15/302-mips_no_branch_likely.patch diff --git a/target/linux/generic/pending-5.15/305-mips_module_reloc.patch b/target/linux/generic/pending-5.15/305-mips_module_reloc.patch new file mode 100644 index 0000000000..bbea1f61c1 --- /dev/null +++ b/target/linux/generic/pending-5.15/305-mips_module_reloc.patch @@ -0,0 +1,370 @@ +From: Felix Fietkau +Subject: mips: replace -mlong-calls with -mno-long-calls to make function calls faster in kernel modules to achieve this, try to + +lede-commit: 3b3d64743ba2a874df9d70cd19e242205b0a788c +Signed-off-by: Felix Fietkau +--- + arch/mips/Makefile | 5 + + arch/mips/include/asm/module.h | 5 + + arch/mips/kernel/module.c | 279 ++++++++++++++++++++++++++++++++++++++++- + 3 files changed, 284 insertions(+), 5 deletions(-) + +--- a/arch/mips/Makefile ++++ b/arch/mips/Makefile +@@ -98,8 +98,18 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin + cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely + cflags-y += -msoft-float + LDFLAGS_vmlinux += -G 0 -static -n -nostdlib ++ifdef CONFIG_64BIT + KBUILD_AFLAGS_MODULE += -mlong-calls + KBUILD_CFLAGS_MODULE += -mlong-calls ++else ++ ifdef CONFIG_DYNAMIC_FTRACE ++ KBUILD_AFLAGS_MODULE += -mlong-calls ++ KBUILD_CFLAGS_MODULE += -mlong-calls ++ else ++ KBUILD_AFLAGS_MODULE += -mno-long-calls ++ KBUILD_CFLAGS_MODULE += -mno-long-calls ++ endif ++endif + + ifeq ($(CONFIG_RELOCATABLE),y) + LDFLAGS_vmlinux += --emit-relocs +--- a/arch/mips/include/asm/module.h ++++ b/arch/mips/include/asm/module.h +@@ -12,6 +12,11 @@ struct mod_arch_specific { + const struct exception_table_entry *dbe_start; + const struct exception_table_entry *dbe_end; + struct mips_hi16 *r_mips_hi16_list; ++ ++ void *phys_plt_tbl; ++ void *virt_plt_tbl; ++ unsigned int phys_plt_offset; ++ unsigned int virt_plt_offset; + }; + + typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */ +--- a/arch/mips/kernel/module.c ++++ b/arch/mips/kernel/module.c +@@ -31,23 +31,261 @@ struct mips_hi16 { + static LIST_HEAD(dbe_list); + static DEFINE_SPINLOCK(dbe_lock); + +-#ifdef MODULE_START ++/* ++ * Get the potential max trampolines size required of the init and ++ * non-init sections. Only used if we cannot find enough contiguous ++ * physically mapped memory to put the module into. ++ */ ++static unsigned int ++get_plt_size(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, ++ const char *secstrings, unsigned int symindex, bool is_init) ++{ ++ unsigned long ret = 0; ++ unsigned int i, j; ++ Elf_Sym *syms; ++ ++ /* Everything marked ALLOC (this includes the exported symbols) */ ++ for (i = 1; i < hdr->e_shnum; ++i) { ++ unsigned int info = sechdrs[i].sh_info; ++ ++ if (sechdrs[i].sh_type != SHT_REL ++ && sechdrs[i].sh_type != SHT_RELA) ++ continue; ++ ++ /* Not a valid relocation section? */ ++ if (info >= hdr->e_shnum) ++ continue; ++ ++ /* Don't bother with non-allocated sections */ ++ if (!(sechdrs[info].sh_flags & SHF_ALLOC)) ++ continue; ++ ++ /* If it's called *.init*, and we're not init, we're ++ not interested */ ++ if ((strstr(secstrings + sechdrs[i].sh_name, ".init") != 0) ++ != is_init) ++ continue; ++ ++ syms = (Elf_Sym *) sechdrs[symindex].sh_addr; ++ if (sechdrs[i].sh_type == SHT_REL) { ++ Elf_Mips_Rel *rel = (void *) sechdrs[i].sh_addr; ++ unsigned int size = sechdrs[i].sh_size / sizeof(*rel); ++ ++ for (j = 0; j < size; ++j) { ++ Elf_Sym *sym; ++ ++ if (ELF_MIPS_R_TYPE(rel[j]) != R_MIPS_26) ++ continue; ++ ++ sym = syms + ELF_MIPS_R_SYM(rel[j]); ++ if (!is_init && sym->st_shndx != SHN_UNDEF) ++ continue; ++ ++ ret += 4 * sizeof(int); ++ } ++ } else { ++ Elf_Mips_Rela *rela = (void *) sechdrs[i].sh_addr; ++ unsigned int size = sechdrs[i].sh_size / sizeof(*rela); ++ ++ for (j = 0; j < size; ++j) { ++ Elf_Sym *sym; ++ ++ if (ELF_MIPS_R_TYPE(rela[j]) != R_MIPS_26) ++ continue; ++ ++ sym = syms + ELF_MIPS_R_SYM(rela[j]); ++ if (!is_init && sym->st_shndx != SHN_UNDEF) ++ continue; ++ ++ ret += 4 * sizeof(int); ++ } ++ } ++ } ++ ++ return ret; ++} ++ ++#ifndef MODULE_START ++static void *alloc_phys(unsigned long size) ++{ ++ unsigned order; ++ struct page *page; ++ struct page *p; ++ ++ size = PAGE_ALIGN(size); ++ order = get_order(size); ++ ++ page = alloc_pages(GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN | ++ __GFP_THISNODE, order); ++ if (!page) ++ return NULL; ++ ++ split_page(page, order); ++ ++ /* mark all pages except for the last one */ ++ for (p = page; p + 1 < page + (size >> PAGE_SHIFT); ++p) ++ set_bit(PG_owner_priv_1, &p->flags); ++ ++ for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p) ++ __free_page(p); ++ ++ return page_address(page); ++} ++#endif ++ ++static void free_phys(void *ptr) ++{ ++ struct page *page; ++ bool free; ++ ++ page = virt_to_page(ptr); ++ do { ++ free = test_and_clear_bit(PG_owner_priv_1, &page->flags); ++ __free_page(page); ++ page++; ++ } while (free); ++} ++ ++ + void *module_alloc(unsigned long size) + { ++#ifdef MODULE_START + return __vmalloc_node_range(size, 1, MODULE_START, MODULE_END, + GFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE, + __builtin_return_address(0)); ++#else ++ void *ptr; ++ ++ if (size == 0) ++ return NULL; ++ ++ ptr = alloc_phys(size); ++ ++ /* If we failed to allocate physically contiguous memory, ++ * fall back to regular vmalloc. The module loader code will ++ * create jump tables to handle long jumps */ ++ if (!ptr) ++ return vmalloc(size); ++ ++ return ptr; ++#endif + } ++ ++static inline bool is_phys_addr(void *ptr) ++{ ++#ifdef CONFIG_64BIT ++ return (KSEGX((unsigned long)ptr) == CKSEG0); ++#else ++ return (KSEGX(ptr) == KSEG0); + #endif ++} ++ ++/* Free memory returned from module_alloc */ ++void module_memfree(void *module_region) ++{ ++ if (is_phys_addr(module_region)) ++ free_phys(module_region); ++ else ++ vfree(module_region); ++} ++ ++static void *__module_alloc(int size, bool phys) ++{ ++ void *ptr; ++ ++ if (phys) ++ ptr = kmalloc(size, GFP_KERNEL); ++ else ++ ptr = vmalloc(size); ++ return ptr; ++} ++ ++static void __module_free(void *ptr) ++{ ++ if (is_phys_addr(ptr)) ++ kfree(ptr); ++ else ++ vfree(ptr); ++} ++ ++int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, ++ char *secstrings, struct module *mod) ++{ ++ unsigned int symindex = 0; ++ unsigned int core_size, init_size; ++ int i; ++ ++ mod->arch.phys_plt_offset = 0; ++ mod->arch.virt_plt_offset = 0; ++ mod->arch.phys_plt_tbl = NULL; ++ mod->arch.virt_plt_tbl = NULL; ++ ++ if (IS_ENABLED(CONFIG_64BIT)) ++ return 0; ++ ++ for (i = 1; i < hdr->e_shnum; i++) ++ if (sechdrs[i].sh_type == SHT_SYMTAB) ++ symindex = i; ++ ++ core_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false); ++ init_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true); ++ ++ if ((core_size + init_size) == 0) ++ return 0; ++ ++ mod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1); ++ if (!mod->arch.phys_plt_tbl) ++ return -ENOMEM; ++ ++ mod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0); ++ if (!mod->arch.virt_plt_tbl) { ++ __module_free(mod->arch.phys_plt_tbl); ++ mod->arch.phys_plt_tbl = NULL; ++ return -ENOMEM; ++ } ++ ++ return 0; ++} + + static void apply_r_mips_32(u32 *location, u32 base, Elf_Addr v) + { + *location = base + v; + } + ++static Elf_Addr add_plt_entry_to(unsigned *plt_offset, ++ void *start, Elf_Addr v) ++{ ++ unsigned *tramp = start + *plt_offset; ++ *plt_offset += 4 * sizeof(int); ++ ++ /* adjust carry for addiu */ ++ if (v & 0x00008000) ++ v += 0x10000; ++ ++ tramp[0] = 0x3c190000 | (v >> 16); /* lui t9, hi16 */ ++ tramp[1] = 0x27390000 | (v & 0xffff); /* addiu t9, t9, lo16 */ ++ tramp[2] = 0x03200008; /* jr t9 */ ++ tramp[3] = 0x00000000; /* nop */ ++ ++ return (Elf_Addr) tramp; ++} ++ ++static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v) ++{ ++ if (is_phys_addr(location)) ++ return add_plt_entry_to(&me->arch.phys_plt_offset, ++ me->arch.phys_plt_tbl, v); ++ else ++ return add_plt_entry_to(&me->arch.virt_plt_offset, ++ me->arch.virt_plt_tbl, v); ++ ++} ++ + static int apply_r_mips_26(struct module *me, u32 *location, u32 base, + Elf_Addr v) + { ++ u32 ofs = base & 0x03ffffff; ++ + if (v % 4) { + pr_err("module %s: dangerous R_MIPS_26 relocation\n", + me->name); +@@ -55,13 +293,17 @@ static int apply_r_mips_26(struct module + } + + if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { +- pr_err("module %s: relocation overflow\n", +- me->name); +- return -ENOEXEC; ++ v = add_plt_entry(me, location, v + (ofs << 2)); ++ if (!v) { ++ pr_err("module %s: relocation overflow\n", ++ me->name); ++ return -ENOEXEC; ++ } ++ ofs = 0; + } + + *location = (*location & ~0x03ffffff) | +- ((base + (v >> 2)) & 0x03ffffff); ++ ((ofs + (v >> 2)) & 0x03ffffff); + + return 0; + } +@@ -441,9 +683,36 @@ int module_finalize(const Elf_Ehdr *hdr, + list_add(&me->arch.dbe_list, &dbe_list); + spin_unlock_irq(&dbe_lock); + } ++ ++ /* Get rid of the fixup trampoline if we're running the module ++ * from physically mapped address space */ ++ if (me->arch.phys_plt_offset == 0) { ++ __module_free(me->arch.phys_plt_tbl); ++ me->arch.phys_plt_tbl = NULL; ++ } ++ if (me->arch.virt_plt_offset == 0) { ++ __module_free(me->arch.virt_plt_tbl); ++ me->arch.virt_plt_tbl = NULL; ++ } ++ + return 0; + } + ++void module_arch_freeing_init(struct module *mod) ++{ ++ if (mod->state == MODULE_STATE_LIVE) ++ return; ++ ++ if (mod->arch.phys_plt_tbl) { ++ __module_free(mod->arch.phys_plt_tbl); ++ mod->arch.phys_plt_tbl = NULL; ++ } ++ if (mod->arch.virt_plt_tbl) { ++ __module_free(mod->arch.virt_plt_tbl); ++ mod->arch.virt_plt_tbl = NULL; ++ } ++} ++ + void module_arch_cleanup(struct module *mod) + { + spin_lock_irq(&dbe_lock); diff --git a/target/linux/generic/pending-5.15/308-mips32r2_tune.patch b/target/linux/generic/pending-5.15/308-mips32r2_tune.patch new file mode 100644 index 0000000000..ef92a5dfb6 --- /dev/null +++ b/target/linux/generic/pending-5.15/308-mips32r2_tune.patch @@ -0,0 +1,22 @@ +From: Felix Fietkau +Subject: kernel: add -mtune=34kc to MIPS CFLAGS when building for mips32r2 + +This provides a good tradeoff across at least 24Kc-74Kc, while also +producing smaller code. + +Signed-off-by: Felix Fietkau +--- + arch/mips/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/mips/Makefile ++++ b/arch/mips/Makefile +@@ -175,7 +175,7 @@ cflags-$(CONFIG_CPU_VR41XX) += -march=r4 + cflags-$(CONFIG_CPU_R4X00) += -march=r4600 -Wa,--trap + cflags-$(CONFIG_CPU_TX49XX) += -march=r4600 -Wa,--trap + cflags-$(CONFIG_CPU_MIPS32_R1) += -march=mips32 -Wa,--trap +-cflags-$(CONFIG_CPU_MIPS32_R2) += -march=mips32r2 -Wa,--trap ++cflags-$(CONFIG_CPU_MIPS32_R2) += -march=mips32r2 -mtune=34kc -Wa,--trap + cflags-$(CONFIG_CPU_MIPS32_R5) += -march=mips32r5 -Wa,--trap -modd-spreg + cflags-$(CONFIG_CPU_MIPS32_R6) += -march=mips32r6 -Wa,--trap -modd-spreg + cflags-$(CONFIG_CPU_MIPS64_R1) += -march=mips64 -Wa,--trap diff --git a/target/linux/generic/pending-5.10/310-arm_module_unresolved_weak_sym.patch b/target/linux/generic/pending-5.15/310-arm_module_unresolved_weak_sym.patch similarity index 100% rename from target/linux/generic/pending-5.10/310-arm_module_unresolved_weak_sym.patch rename to target/linux/generic/pending-5.15/310-arm_module_unresolved_weak_sym.patch diff --git a/target/linux/generic/pending-5.15/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch b/target/linux/generic/pending-5.15/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch new file mode 100644 index 0000000000..3f553b28b3 --- /dev/null +++ b/target/linux/generic/pending-5.15/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch @@ -0,0 +1,282 @@ +From: Yousong Zhou +Subject: MIPS: kexec: Accept command line parameters from userspace. + +Signed-off-by: Yousong Zhou +--- + arch/mips/kernel/machine_kexec.c | 153 +++++++++++++++++++++++++++++++----- + arch/mips/kernel/machine_kexec.h | 20 +++++ + arch/mips/kernel/relocate_kernel.S | 21 +++-- + 3 files changed, 167 insertions(+), 27 deletions(-) + create mode 100644 arch/mips/kernel/machine_kexec.h + +--- a/arch/mips/kernel/machine_kexec.c ++++ b/arch/mips/kernel/machine_kexec.c +@@ -9,14 +9,11 @@ + #include + #include + ++#include + #include + #include +- +-extern const unsigned char relocate_new_kernel[]; +-extern const size_t relocate_new_kernel_size; +- +-extern unsigned long kexec_start_address; +-extern unsigned long kexec_indirection_page; ++#include ++#include "machine_kexec.h" + + static unsigned long reboot_code_buffer; + +@@ -30,6 +27,101 @@ void (*_crash_smp_send_stop)(void) = NUL + void (*_machine_kexec_shutdown)(void) = NULL; + void (*_machine_crash_shutdown)(struct pt_regs *regs) = NULL; + ++static void machine_kexec_print_args(void) ++{ ++ unsigned long argc = (int)kexec_args[0]; ++ int i; ++ ++ pr_info("kexec_args[0] (argc): %lu\n", argc); ++ pr_info("kexec_args[1] (argv): %p\n", (void *)kexec_args[1]); ++ pr_info("kexec_args[2] (env ): %p\n", (void *)kexec_args[2]); ++ pr_info("kexec_args[3] (desc): %p\n", (void *)kexec_args[3]); ++ ++ for (i = 0; i < argc; i++) { ++ pr_info("kexec_argv[%d] = %p, %s\n", ++ i, kexec_argv[i], kexec_argv[i]); ++ } ++} ++ ++static void machine_kexec_init_argv(struct kimage *image) ++{ ++ void __user *buf = NULL; ++ size_t bufsz; ++ size_t size; ++ int i; ++ ++ bufsz = 0; ++ for (i = 0; i < image->nr_segments; i++) { ++ struct kexec_segment *seg; ++ ++ seg = &image->segment[i]; ++ if (seg->bufsz < 6) ++ continue; ++ ++ if (strncmp((char *) seg->buf, "kexec ", 6)) ++ continue; ++ ++ buf = seg->buf; ++ bufsz = seg->bufsz; ++ break; ++ } ++ ++ if (!buf) ++ return; ++ ++ size = KEXEC_COMMAND_LINE_SIZE; ++ size = min(size, bufsz); ++ if (size < bufsz) ++ pr_warn("kexec command line truncated to %zd bytes\n", size); ++ ++ /* Copy to kernel space */ ++ if (copy_from_user(kexec_argv_buf, buf, size)) ++ pr_warn("kexec command line copy to kernel space failed\n"); ++ ++ kexec_argv_buf[size - 1] = 0; ++} ++ ++static void machine_kexec_parse_argv(struct kimage *image) ++{ ++ char *reboot_code_buffer; ++ int reloc_delta; ++ char *ptr; ++ int argc; ++ int i; ++ ++ ptr = kexec_argv_buf; ++ argc = 0; ++ ++ /* ++ * convert command line string to array of parameters ++ * (as bootloader does). ++ */ ++ while (ptr && *ptr && (KEXEC_MAX_ARGC > argc)) { ++ if (*ptr == ' ') { ++ *ptr++ = '\0'; ++ continue; ++ } ++ ++ kexec_argv[argc++] = ptr; ++ ptr = strchr(ptr, ' '); ++ } ++ ++ if (!argc) ++ return; ++ ++ kexec_args[0] = argc; ++ kexec_args[1] = (unsigned long)kexec_argv; ++ kexec_args[2] = 0; ++ kexec_args[3] = 0; ++ ++ reboot_code_buffer = page_address(image->control_code_page); ++ reloc_delta = reboot_code_buffer - (char *)kexec_relocate_new_kernel; ++ ++ kexec_args[1] += reloc_delta; ++ for (i = 0; i < argc; i++) ++ kexec_argv[i] += reloc_delta; ++} ++ + static void kexec_image_info(const struct kimage *kimage) + { + unsigned long i; +@@ -99,6 +191,18 @@ machine_kexec_prepare(struct kimage *kim + #endif + + kexec_image_info(kimage); ++ /* ++ * Whenever arguments passed from kexec-tools, Init the arguments as ++ * the original ones to try avoiding booting failure. ++ */ ++ ++ kexec_args[0] = fw_arg0; ++ kexec_args[1] = fw_arg1; ++ kexec_args[2] = fw_arg2; ++ kexec_args[3] = fw_arg3; ++ ++ machine_kexec_init_argv(kimage); ++ machine_kexec_parse_argv(kimage); + + if (_machine_kexec_prepare) + return _machine_kexec_prepare(kimage); +@@ -161,7 +265,7 @@ machine_crash_shutdown(struct pt_regs *r + void kexec_nonboot_cpu_jump(void) + { + local_flush_icache_range((unsigned long)relocated_kexec_smp_wait, +- reboot_code_buffer + relocate_new_kernel_size); ++ reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE); + + relocated_kexec_smp_wait(NULL); + } +@@ -199,7 +303,7 @@ void kexec_reboot(void) + * machine_kexec() CPU. + */ + local_flush_icache_range(reboot_code_buffer, +- reboot_code_buffer + relocate_new_kernel_size); ++ reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE); + + do_kexec = (void *)reboot_code_buffer; + do_kexec(); +@@ -212,10 +316,12 @@ machine_kexec(struct kimage *image) + unsigned long *ptr; + + reboot_code_buffer = +- (unsigned long)page_address(image->control_code_page); ++ (unsigned long)page_address(image->control_code_page); ++ pr_info("reboot_code_buffer = %p\n", (void *)reboot_code_buffer); + + kexec_start_address = + (unsigned long) phys_to_virt(image->start); ++ pr_info("kexec_start_address = %p\n", (void *)kexec_start_address); + + if (image->type == KEXEC_TYPE_DEFAULT) { + kexec_indirection_page = +@@ -223,9 +329,19 @@ machine_kexec(struct kimage *image) + } else { + kexec_indirection_page = (unsigned long)&image->head; + } ++ pr_info("kexec_indirection_page = %p\n", (void *)kexec_indirection_page); + +- memcpy((void*)reboot_code_buffer, relocate_new_kernel, +- relocate_new_kernel_size); ++ pr_info("Where is memcpy: %p\n", memcpy); ++ pr_info("kexec_relocate_new_kernel = %p, kexec_relocate_new_kernel_end = %p\n", ++ (void *)kexec_relocate_new_kernel, &kexec_relocate_new_kernel_end); ++ pr_info("Copy %lu bytes from %p to %p\n", KEXEC_RELOCATE_NEW_KERNEL_SIZE, ++ (void *)kexec_relocate_new_kernel, (void *)reboot_code_buffer); ++ memcpy((void*)reboot_code_buffer, kexec_relocate_new_kernel, ++ KEXEC_RELOCATE_NEW_KERNEL_SIZE); ++ ++ pr_info("Before _print_args().\n"); ++ machine_kexec_print_args(); ++ pr_info("Before eval loop.\n"); + + /* + * The generic kexec code builds a page list with physical +@@ -256,7 +372,7 @@ machine_kexec(struct kimage *image) + #ifdef CONFIG_SMP + /* All secondary cpus now may jump to kexec_wait cycle */ + relocated_kexec_smp_wait = reboot_code_buffer + +- (void *)(kexec_smp_wait - relocate_new_kernel); ++ (void *)(kexec_smp_wait - kexec_relocate_new_kernel); + smp_wmb(); + atomic_set(&kexec_ready_to_reboot, 1); + #endif +--- /dev/null ++++ b/arch/mips/kernel/machine_kexec.h +@@ -0,0 +1,20 @@ ++#ifndef _MACHINE_KEXEC_H ++#define _MACHINE_KEXEC_H ++ ++#ifndef __ASSEMBLY__ ++extern const unsigned char kexec_relocate_new_kernel[]; ++extern unsigned long kexec_relocate_new_kernel_end; ++extern unsigned long kexec_start_address; ++extern unsigned long kexec_indirection_page; ++ ++extern char kexec_argv_buf[]; ++extern char *kexec_argv[]; ++ ++#define KEXEC_RELOCATE_NEW_KERNEL_SIZE ((unsigned long)&kexec_relocate_new_kernel_end - (unsigned long)kexec_relocate_new_kernel) ++#endif /* !__ASSEMBLY__ */ ++ ++#define KEXEC_COMMAND_LINE_SIZE 256 ++#define KEXEC_ARGV_SIZE (KEXEC_COMMAND_LINE_SIZE / 16) ++#define KEXEC_MAX_ARGC (KEXEC_ARGV_SIZE / sizeof(long)) ++ ++#endif +--- a/arch/mips/kernel/relocate_kernel.S ++++ b/arch/mips/kernel/relocate_kernel.S +@@ -10,10 +10,11 @@ + #include + #include + #include ++#include "machine_kexec.h" + + #include + +-LEAF(relocate_new_kernel) ++LEAF(kexec_relocate_new_kernel) + PTR_L a0, arg0 + PTR_L a1, arg1 + PTR_L a2, arg2 +@@ -98,7 +99,7 @@ done: + #endif + /* jump to kexec_start_address */ + j s1 +- END(relocate_new_kernel) ++ END(kexec_relocate_new_kernel) + + #ifdef CONFIG_SMP + /* +@@ -177,8 +178,15 @@ EXPORT(kexec_indirection_page) + PTR_WD 0 + .size kexec_indirection_page, PTRSIZE + +-relocate_new_kernel_end: ++kexec_argv_buf: ++ EXPORT(kexec_argv_buf) ++ .skip KEXEC_COMMAND_LINE_SIZE ++ .size kexec_argv_buf, KEXEC_COMMAND_LINE_SIZE ++ ++kexec_argv: ++ EXPORT(kexec_argv) ++ .skip KEXEC_ARGV_SIZE ++ .size kexec_argv, KEXEC_ARGV_SIZE + +-EXPORT(relocate_new_kernel_size) +- PTR_WD relocate_new_kernel_end - relocate_new_kernel +- .size relocate_new_kernel_size, PTRSIZE ++kexec_relocate_new_kernel_end: ++ EXPORT(kexec_relocate_new_kernel_end) diff --git a/target/linux/generic/pending-5.10/332-arc-add-OWRTDTB-section.patch b/target/linux/generic/pending-5.15/332-arc-add-OWRTDTB-section.patch similarity index 100% rename from target/linux/generic/pending-5.10/332-arc-add-OWRTDTB-section.patch rename to target/linux/generic/pending-5.15/332-arc-add-OWRTDTB-section.patch diff --git a/target/linux/generic/pending-5.10/333-arc-enable-unaligned-access-in-kernel-mode.patch b/target/linux/generic/pending-5.15/333-arc-enable-unaligned-access-in-kernel-mode.patch similarity index 100% rename from target/linux/generic/pending-5.10/333-arc-enable-unaligned-access-in-kernel-mode.patch rename to target/linux/generic/pending-5.15/333-arc-enable-unaligned-access-in-kernel-mode.patch diff --git a/target/linux/generic/pending-5.15/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch b/target/linux/generic/pending-5.15/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch new file mode 100644 index 0000000000..082b122cb4 --- /dev/null +++ b/target/linux/generic/pending-5.15/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch @@ -0,0 +1,25 @@ +From 66770a004afe10df11d3902e16eaa0c2c39436bb Mon Sep 17 00:00:00 2001 +From: Pawel Dembicki +Date: Fri, 24 May 2019 17:56:19 +0200 +Subject: [PATCH] powerpc: Enable kernel XZ compression option on PPC_85xx + +Enable kernel XZ compression option on PPC_85xx. Tested with +simpleImage on TP-Link TL-WDR4900 (Freescale P1014 processor). + +Suggested-by: Christian Lamparter +Signed-off-by: Pawel Dembicki +--- + arch/powerpc/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -221,7 +221,7 @@ config PPC + select HAVE_KERNEL_GZIP + select HAVE_KERNEL_LZMA if DEFAULT_UIMAGE + select HAVE_KERNEL_LZO if DEFAULT_UIMAGE +- select HAVE_KERNEL_XZ if PPC_BOOK3S || 44x ++ select HAVE_KERNEL_XZ if PPC_BOOK3S || 44x || PPC_85xx + select HAVE_KPROBES + select HAVE_KPROBES_ON_FTRACE + select HAVE_KRETPROBES diff --git a/target/linux/generic/pending-5.15/351-irqchip-bcm-6345-l1-request-memory-region.patch b/target/linux/generic/pending-5.15/351-irqchip-bcm-6345-l1-request-memory-region.patch new file mode 100644 index 0000000000..91654cc294 --- /dev/null +++ b/target/linux/generic/pending-5.15/351-irqchip-bcm-6345-l1-request-memory-region.patch @@ -0,0 +1,113 @@ +From patchwork Thu Mar 16 19:28:33 2023 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= + +X-Patchwork-Id: 13178238 +Return-Path: +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) + by smtp.lore.kernel.org (Postfix) with ESMTP id 5EF2AC6FD19 + for ; Thu, 16 Mar 2023 19:28:43 +0000 (UTC) +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S230076AbjCPT2l (ORCPT ); + Thu, 16 Mar 2023 15:28:41 -0400 +Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56412 "EHLO + lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org + with ESMTP id S230039AbjCPT2k (ORCPT + ); Thu, 16 Mar 2023 15:28:40 -0400 +Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com + [IPv6:2a00:1450:4864:20::42f]) + by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7259B7D9F; + Thu, 16 Mar 2023 12:28:38 -0700 (PDT) +Received: by mail-wr1-x42f.google.com with SMTP id y14so2539231wrq.4; + Thu, 16 Mar 2023 12:28:38 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20210112; t=1678994917; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:from:to:cc:subject:date + :message-id:reply-to; + bh=j8afldfRZftLeVmekmQfoh01jVdumsVP7nkKoPaU3Q0=; + b=FzMRr5ekh/fDiJqTlezNj6nLjzvn5z92FtYeB8MquVSMB8PuvarccnyqAzsXiccf+v + uwRFIomnTWNLGVjzc1xrB2hGiCKD3jBo5n1u8p/yEV6rpolbxVjfM7eTHXyAHXGXz7ZJ + TPeVbWfAlxiSD6+BPtXr/efehcdI64fIoL6G/U1WHNMo01Tzr/Obf3y5tug17N0fGcXg + CH6E5a2HguZUtwrm26LcK9IOV/7xEx5eIE1cOvTLMxPbGWaZwEjjP16HylJr06xRLhaf + RpiYBT3mXwwuOx0jLOhqavY/2kZ9GVbZRWMMwZrZv9xNO13SBwc1VUVgD4k3FntnSk7Z + AaOQ== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20210112; t=1678994917; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc + :subject:date:message-id:reply-to; + bh=j8afldfRZftLeVmekmQfoh01jVdumsVP7nkKoPaU3Q0=; + b=OaA5DMgqalrfqO5iOtmmxFPsH90MkN7l4EJpyVnzuiO1Wd6rSCpqPOR7xpxZno8OPP + tdfm4vzn9Ie4AUDbFKDTUlPG+tgkmIruo3K9C0VnY9DD2PRZMEYBbWaJKU1otqKt0NKu + IAAHNvxvQvCESKzbXFLYwWbRKFScOSMGmGBTDfgThz51A18Ff1hJy/BmnuZk7M2TLgHO + wQpy9t7oeB/Hkxl41y46emLc/nESsvwvAG/fx/zPzCe9UiaQLrdZq+BKeOwSBedktzK5 + U/ZTfgzU2UGSI67aGRqqGnI0uXq+MAJMK18qzM0VByxj6W+AXJ6BJr5P0quljeQ8upSg + bEUg== +X-Gm-Message-State: AO0yUKWnqTlccBDnqwCSRdqOBGc2FyfiLy1Tg7EjPENlISpzXuDYwW/R + lJSI06rrfq+Vel/SigfpGJI= +X-Google-Smtp-Source: + AK7set/jYfYl9ttVzIXJO+ZQVfa6cE/yOsP8fx4teiTmGNNWyVlIJRzMAlF3IUGqRAXAmY3hAabIuQ== +X-Received: by 2002:a5d:40ce:0:b0:2cd:ceab:df1a with SMTP id + b14-20020a5d40ce000000b002cdceabdf1amr381006wrq.32.1678994916642; + Thu, 16 Mar 2023 12:28:36 -0700 (PDT) +Received: from atlantis.lan (255.red-79-146-124.dynamicip.rima-tde.net. + [79.146.124.255]) + by smtp.gmail.com with ESMTPSA id + l10-20020a5d4bca000000b002cfea3c49d5sm180041wrt.52.2023.03.16.12.28.35 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Thu, 16 Mar 2023 12:28:35 -0700 (PDT) +From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +To: f.fainelli@gmail.com, jonas.gorski@gmail.com, + bcm-kernel-feedback-list@broadcom.com, tglx@linutronix.de, + maz@kernel.org, linux-mips@vger.kernel.org, + linux-kernel@vger.kernel.org +Cc: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +Subject: [PATCH v2] irqchip/bcm-6345-l1: request memory region +Date: Thu, 16 Mar 2023 20:28:33 +0100 +Message-Id: <20230316192833.1603149-1-noltari@gmail.com> +X-Mailer: git-send-email 2.30.2 +In-Reply-To: <20230316180701.783785-1-noltari@gmail.com> +References: <20230316180701.783785-1-noltari@gmail.com> +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: linux-mips@vger.kernel.org + +Request memory region in order to display it in /proc/iomem. +Also stop printing the MMIO address since it just displays (ptrval). + +Signed-off-by: Álvaro Fernández Rojas +Acked-by: Florian Fainelli +--- + v2: request memory region and stop displaying MMIO address. + + drivers/irqchip/irq-bcm6345-l1.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/irqchip/irq-bcm6345-l1.c ++++ b/drivers/irqchip/irq-bcm6345-l1.c +@@ -257,6 +257,9 @@ static int __init bcm6345_l1_init_one(st + if (!cpu->map_base) + return -ENOMEM; + ++ if (!request_mem_region(res.start, sz, res.name)) ++ pr_err("failed to request intc memory"); ++ + for (i = 0; i < n_words; i++) { + cpu->enable_cache[i] = 0; + __raw_writel(0, cpu->map_base + reg_enable(intc, i)); +@@ -335,8 +338,7 @@ static int __init bcm6345_l1_of_init(str + for_each_cpu(idx, &intc->cpumask) { + struct bcm6345_l1_cpu *cpu = intc->cpus[idx]; + +- pr_info(" CPU%u at MMIO 0x%p (irq = %d)\n", idx, +- cpu->map_base, cpu->parent_irq); ++ pr_info(" CPU%u (irq = %d)\n", idx, cpu->parent_irq); + } + + return 0; diff --git a/target/linux/generic/pending-5.15/400-mtd-mtdsplit-support.patch b/target/linux/generic/pending-5.15/400-mtd-mtdsplit-support.patch new file mode 100644 index 0000000000..b9b8d5d26a --- /dev/null +++ b/target/linux/generic/pending-5.15/400-mtd-mtdsplit-support.patch @@ -0,0 +1,328 @@ +From 39717277d5c87bdb183cf2f258957b44ba99b4df Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 11:47:35 +0200 +Subject: [PATCH] mtd: mtdsplit support + +--- + drivers/mtd/Kconfig | 19 ++++ + drivers/mtd/Makefile | 2 + + drivers/mtd/mtdpart.c | 169 ++++++++++++++++++++++++++++----- + include/linux/mtd/mtd.h | 25 +++++ + include/linux/mtd/partitions.h | 7 ++ + 5 files changed, 197 insertions(+), 25 deletions(-) + +--- a/drivers/mtd/Kconfig ++++ b/drivers/mtd/Kconfig +@@ -12,6 +12,25 @@ menuconfig MTD + + if MTD + ++menu "libreCMC specific MTD options" ++ ++config MTD_ROOTFS_ROOT_DEV ++ bool "Automatically set 'rootfs' partition to be root filesystem" ++ default y ++ ++config MTD_SPLIT_FIRMWARE ++ bool "Automatically split firmware partition for kernel+rootfs" ++ default y ++ ++config MTD_SPLIT_FIRMWARE_NAME ++ string "Firmware partition name" ++ depends on MTD_SPLIT_FIRMWARE ++ default "firmware" ++ ++source "drivers/mtd/mtdsplit/Kconfig" ++ ++endmenu ++ + config MTD_TESTS + tristate "MTD tests support (DANGEROUS)" + depends on m +--- a/drivers/mtd/Makefile ++++ b/drivers/mtd/Makefile +@@ -9,6 +9,8 @@ mtd-y := mtdcore.o mtdsuper.o mtdconc + + obj-y += parsers/ + ++obj-$(CONFIG_MTD_SPLIT) += mtdsplit/ ++ + # 'Users' - code which presents functionality to userspace. + obj-$(CONFIG_MTD_BLKDEVS) += mtd_blkdevs.o + obj-$(CONFIG_MTD_BLOCK) += mtdblock.o +--- a/drivers/mtd/mtdpart.c ++++ b/drivers/mtd/mtdpart.c +@@ -15,11 +15,13 @@ + #include + #include + #include ++#include + #include + #include + #include + + #include "mtdcore.h" ++#include "mtdsplit/mtdsplit.h" + + /* + * MTD methods which simply translate the effective address and pass through +@@ -236,6 +238,147 @@ static int mtd_add_partition_attrs(struc + return ret; + } + ++static DEFINE_SPINLOCK(part_parser_lock); ++static LIST_HEAD(part_parsers); ++ ++static struct mtd_part_parser *mtd_part_parser_get(const char *name) ++{ ++ struct mtd_part_parser *p, *ret = NULL; ++ ++ spin_lock(&part_parser_lock); ++ ++ list_for_each_entry(p, &part_parsers, list) ++ if (!strcmp(p->name, name) && try_module_get(p->owner)) { ++ ret = p; ++ break; ++ } ++ ++ spin_unlock(&part_parser_lock); ++ ++ return ret; ++} ++ ++static inline void mtd_part_parser_put(const struct mtd_part_parser *p) ++{ ++ module_put(p->owner); ++} ++ ++static struct mtd_part_parser * ++get_partition_parser_by_type(enum mtd_parser_type type, ++ struct mtd_part_parser *start) ++{ ++ struct mtd_part_parser *p, *ret = NULL; ++ ++ spin_lock(&part_parser_lock); ++ ++ p = list_prepare_entry(start, &part_parsers, list); ++ if (start) ++ mtd_part_parser_put(start); ++ ++ list_for_each_entry_continue(p, &part_parsers, list) { ++ if (p->type == type && try_module_get(p->owner)) { ++ ret = p; ++ break; ++ } ++ } ++ ++ spin_unlock(&part_parser_lock); ++ ++ return ret; ++} ++ ++static int parse_mtd_partitions_by_type(struct mtd_info *master, ++ enum mtd_parser_type type, ++ const struct mtd_partition **pparts, ++ struct mtd_part_parser_data *data) ++{ ++ struct mtd_part_parser *prev = NULL; ++ int ret = 0; ++ ++ while (1) { ++ struct mtd_part_parser *parser; ++ ++ parser = get_partition_parser_by_type(type, prev); ++ if (!parser) ++ break; ++ ++ ret = (*parser->parse_fn)(master, pparts, data); ++ ++ if (ret > 0) { ++ mtd_part_parser_put(parser); ++ printk(KERN_NOTICE ++ "%d %s partitions found on MTD device %s\n", ++ ret, parser->name, master->name); ++ break; ++ } ++ ++ prev = parser; ++ } ++ ++ return ret; ++} ++ ++static int ++run_parsers_by_type(struct mtd_info *child, enum mtd_parser_type type) ++{ ++ struct mtd_partition *parts; ++ int nr_parts; ++ int i; ++ ++ nr_parts = parse_mtd_partitions_by_type(child, type, (const struct mtd_partition **)&parts, ++ NULL); ++ if (nr_parts <= 0) ++ return nr_parts; ++ ++ if (WARN_ON(!parts)) ++ return 0; ++ ++ for (i = 0; i < nr_parts; i++) { ++ /* adjust partition offsets */ ++ parts[i].offset += child->part.offset; ++ ++ mtd_add_partition(child->parent, ++ parts[i].name, ++ parts[i].offset, ++ parts[i].size); ++ } ++ ++ kfree(parts); ++ ++ return nr_parts; ++} ++ ++#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME ++#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME ++#else ++#define SPLIT_FIRMWARE_NAME "unused" ++#endif ++ ++static void split_firmware(struct mtd_info *master, struct mtd_info *part) ++{ ++ run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE); ++} ++ ++static void mtd_partition_split(struct mtd_info *master, struct mtd_info *part) ++{ ++ static int rootfs_found = 0; ++ ++ if (rootfs_found) ++ return; ++ ++ if (of_find_property(mtd_get_of_node(part), "linux,rootfs", NULL) || ++ !strcmp(part->name, "rootfs")) { ++ run_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS); ++ ++ rootfs_found = 1; ++ } ++ ++ if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) && ++ !strcmp(part->name, SPLIT_FIRMWARE_NAME) && ++ !of_find_property(mtd_get_of_node(part), "compatible", NULL)) ++ split_firmware(master, part); ++} ++ + int mtd_add_partition(struct mtd_info *parent, const char *name, + long long offset, long long length) + { +@@ -274,6 +417,7 @@ int mtd_add_partition(struct mtd_info *p + if (ret) + goto err_remove_part; + ++ mtd_partition_split(parent, child); + mtd_add_partition_attrs(child); + + return 0; +@@ -422,6 +566,7 @@ int add_mtd_partitions(struct mtd_info * + goto err_del_partitions; + } + ++ mtd_partition_split(master, child); + mtd_add_partition_attrs(child); + + /* Look for subpartitions */ +@@ -438,31 +583,6 @@ err_del_partitions: + return ret; + } + +-static DEFINE_SPINLOCK(part_parser_lock); +-static LIST_HEAD(part_parsers); +- +-static struct mtd_part_parser *mtd_part_parser_get(const char *name) +-{ +- struct mtd_part_parser *p, *ret = NULL; +- +- spin_lock(&part_parser_lock); +- +- list_for_each_entry(p, &part_parsers, list) +- if (!strcmp(p->name, name) && try_module_get(p->owner)) { +- ret = p; +- break; +- } +- +- spin_unlock(&part_parser_lock); +- +- return ret; +-} +- +-static inline void mtd_part_parser_put(const struct mtd_part_parser *p) +-{ +- module_put(p->owner); +-} +- + /* + * Many partition parsers just expected the core to kfree() all their data in + * one chunk. Do that by default. +--- a/include/linux/mtd/mtd.h ++++ b/include/linux/mtd/mtd.h +@@ -620,6 +620,24 @@ static inline void mtd_align_erase_req(s + req->len += mtd->erasesize - mod; + } + ++static inline uint64_t mtd_roundup_to_eb(uint64_t sz, struct mtd_info *mtd) ++{ ++ if (mtd_mod_by_eb(sz, mtd) == 0) ++ return sz; ++ ++ /* Round up to next erase block */ ++ return (mtd_div_by_eb(sz, mtd) + 1) * mtd->erasesize; ++} ++ ++static inline uint64_t mtd_rounddown_to_eb(uint64_t sz, struct mtd_info *mtd) ++{ ++ if (mtd_mod_by_eb(sz, mtd) == 0) ++ return sz; ++ ++ /* Round down to the start of the current erase block */ ++ return (mtd_div_by_eb(sz, mtd)) * mtd->erasesize; ++} ++ + static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd) + { + if (mtd->writesize_shift) +@@ -693,6 +711,13 @@ extern struct mtd_info *of_get_mtd_devic + extern struct mtd_info *get_mtd_device_nm(const char *name); + extern void put_mtd_device(struct mtd_info *mtd); + ++static inline uint64_t mtdpart_get_offset(const struct mtd_info *mtd) ++{ ++ if (!mtd_is_partition(mtd)) ++ return 0; ++ ++ return mtd->part.offset; ++} + + struct mtd_notifier { + void (*add)(struct mtd_info *mtd); +--- a/include/linux/mtd/partitions.h ++++ b/include/linux/mtd/partitions.h +@@ -75,6 +75,12 @@ struct mtd_part_parser_data { + * Functions dealing with the various ways of partitioning the space + */ + ++enum mtd_parser_type { ++ MTD_PARSER_TYPE_DEVICE = 0, ++ MTD_PARSER_TYPE_ROOTFS, ++ MTD_PARSER_TYPE_FIRMWARE, ++}; ++ + struct mtd_part_parser { + struct list_head list; + struct module *owner; +@@ -83,6 +89,7 @@ struct mtd_part_parser { + int (*parse_fn)(struct mtd_info *, const struct mtd_partition **, + struct mtd_part_parser_data *); + void (*cleanup)(const struct mtd_partition *pparts, int nr_parts); ++ enum mtd_parser_type type; + }; + + /* Container for passing around a set of parsed partitions */ diff --git a/target/linux/generic/pending-5.15/401-mtd-don-t-register-NVMEM-devices-for-partitions-with.patch b/target/linux/generic/pending-5.15/401-mtd-don-t-register-NVMEM-devices-for-partitions-with.patch new file mode 100644 index 0000000000..650e10a3a5 --- /dev/null +++ b/target/linux/generic/pending-5.15/401-mtd-don-t-register-NVMEM-devices-for-partitions-with.patch @@ -0,0 +1,48 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 31 Oct 2023 15:51:01 +0100 +Subject: [PATCH] mtd: don't register NVMEM devices for partitions with custom + drivers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This fixes issue exposed by upstream commit f4cf4e5db331 ("Revert +"nvmem: add new config option""). + +Signed-off-by: Rafał Miłecki +--- + drivers/mtd/mtdcore.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -537,6 +537,29 @@ static int mtd_nvmem_add(struct mtd_info + struct device_node *node = mtd_get_of_node(mtd); + struct nvmem_config config = {}; + ++ /* ++ * Do NOT register NVMEM device for any partition that is meant to be ++ * handled by a U-Boot env driver. That would result in associating two ++ * different NVMEM devices with the same OF node. ++ * ++ * An example of unwanted behaviour of above (forwardtrace): ++ * of_get_mac_addr_nvmem() ++ * of_nvmem_cell_get() ++ * __nvmem_device_get() ++ * ++ * We can't have __nvmem_device_get() return "mtdX" NVMEM device instead ++ * of U-Boot env NVMEM device. That would result in failing to find ++ * NVMEM cell. ++ * ++ * This issue seems to affect U-Boot env case only and will go away with ++ * switch to NVMEM layouts. ++ */ ++ if (of_device_is_compatible(node, "u-boot,env") || ++ of_device_is_compatible(node, "u-boot,env-redundant-bool") || ++ of_device_is_compatible(node, "u-boot,env-redundant-count") || ++ of_device_is_compatible(node, "brcm,env")) ++ return 0; ++ + config.id = -1; + config.dev = &mtd->dev; + config.name = dev_name(&mtd->dev); diff --git a/target/linux/generic/pending-5.15/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch b/target/linux/generic/pending-5.15/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch new file mode 100644 index 0000000000..73ceda92c3 --- /dev/null +++ b/target/linux/generic/pending-5.15/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch @@ -0,0 +1,245 @@ +From acacdac272927ae1d96e0bca51eb82899671eaea Mon Sep 17 00:00:00 2001 +From: John Thomson +Date: Fri, 25 Dec 2020 18:50:08 +1000 +Subject: [PATCH] mtd: spi-nor: write support for minor aligned partitions +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Do not prevent writing to mtd partitions where a partition boundary sits +on a minor erasesize boundary. +This addresses a FIXME that has been present since the start of the +linux git history: +/* Doesn't start on a boundary of major erase size */ +/* FIXME: Let it be writable if it is on a boundary of + * _minor_ erase size though */ + +Allow a uniform erase region spi-nor device to be configured +to use the non-uniform erase regions code path for an erase with: +CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE=y + +On supporting hardware (SECT_4K: majority of current SPI-NOR device) +provide the facility for an erase to use the least number +of SPI-NOR operations, as well as access to 4K erase without +requiring CONFIG_MTD_SPI_NOR_USE_4K_SECTORS + +Introduce erasesize_minor to the mtd struct, +the smallest erasesize supported by the device + +On existing devices, this is useful where write support is wanted +for data on a 4K partition, such as some u-boot-env partitions, +or RouterBoot soft_config, while still netting the performance +benefits of using 64K sectors + +Performance: +time mtd erase firmware +libreCMC 5.10 ramips MT7621 w25q128jv 0xfc0000 partition length + +Without this patch +MTD_SPI_NOR_USE_4K_SECTORS=y |n +real 2m 11.66s |0m 50.86s +user 0m 0.00s |0m 0.00s +sys 1m 56.20s |0m 50.80s + +With this patch +MTD_SPI_NOR_USE_VARIABLE_ERASE=n|y |4K_SECTORS=y +real 0m 51.68s |0m 50.85s |2m 12.89s +user 0m 0.00s |0m 0.00s |0m 0.01s +sys 0m 46.94s |0m 50.38s |2m 12.46s + +Signed-off-by: John Thomson +Signed-off-by: Thibaut VARÈNE + +--- + +checkpatch does not like the printk(KERN_WARNING +these should be changed separately beforehand? + +Changes v1 -> v2: +Added mtdcore sysfs for erasesize_minor +Removed finding minor erasesize for variable erase regions device, +as untested and no responses regarding it. +Moved IF_ENABLED for SPINOR variable erase to guard setting +erasesize_minor in spi-nor/core.c +Removed setting erasesize to minor where partition boundaries require +minor erase to be writable +Simplified minor boundary check by relying on minor being a factor of +major + +Changes RFC -> v1: +Fix uninitialized variable smatch warning +Reported-by: kernel test robot +Reported-by: Dan Carpenter +--- + drivers/mtd/mtdcore.c | 10 ++++++++++ + drivers/mtd/mtdpart.c | 35 +++++++++++++++++++++++++---------- + drivers/mtd/spi-nor/Kconfig | 10 ++++++++++ + drivers/mtd/spi-nor/core.c | 11 +++++++++-- + include/linux/mtd/mtd.h | 2 ++ + 5 files changed, 56 insertions(+), 12 deletions(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -169,6 +169,15 @@ static ssize_t mtd_erasesize_show(struct + } + MTD_DEVICE_ATTR_RO(erasesize); + ++static ssize_t mtd_erasesize_minor_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct mtd_info *mtd = dev_get_drvdata(dev); ++ ++ return sysfs_emit(buf, "%lu\n", (unsigned long)mtd->erasesize_minor); ++} ++MTD_DEVICE_ATTR_RO(erasesize_minor); ++ + static ssize_t mtd_writesize_show(struct device *dev, + struct device_attribute *attr, char *buf) + { +@@ -314,6 +323,7 @@ static struct attribute *mtd_attrs[] = { + &dev_attr_flags.attr, + &dev_attr_size.attr, + &dev_attr_erasesize.attr, ++ &dev_attr_erasesize_minor.attr, + &dev_attr_writesize.attr, + &dev_attr_subpagesize.attr, + &dev_attr_oobsize.attr, +--- a/drivers/mtd/mtdpart.c ++++ b/drivers/mtd/mtdpart.c +@@ -41,6 +41,7 @@ static struct mtd_info *allocate_partiti + struct mtd_info *master = mtd_get_master(parent); + int wr_alignment = (parent->flags & MTD_NO_ERASE) ? + master->writesize : master->erasesize; ++ int wr_alignment_minor = 0; + u64 parent_size = mtd_is_partition(parent) ? + parent->part.size : parent->size; + struct mtd_info *child; +@@ -165,6 +166,7 @@ static struct mtd_info *allocate_partiti + } else { + /* Single erase size */ + child->erasesize = master->erasesize; ++ child->erasesize_minor = master->erasesize_minor; + } + + /* +@@ -172,26 +174,39 @@ static struct mtd_info *allocate_partiti + * exposes several regions with different erasesize. Adjust + * wr_alignment accordingly. + */ +- if (!(child->flags & MTD_NO_ERASE)) ++ if (!(child->flags & MTD_NO_ERASE)) { + wr_alignment = child->erasesize; ++ wr_alignment_minor = child->erasesize_minor; ++ } + + tmp = mtd_get_master_ofs(child, 0); + remainder = do_div(tmp, wr_alignment); + if ((child->flags & MTD_WRITEABLE) && remainder) { +- /* Doesn't start on a boundary of major erase size */ +- /* FIXME: Let it be writable if it is on a boundary of +- * _minor_ erase size though */ +- child->flags &= ~MTD_WRITEABLE; +- printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n", +- part->name); ++ if (wr_alignment_minor) { ++ /* rely on minor being a factor of major erasesize */ ++ tmp = remainder; ++ remainder = do_div(tmp, wr_alignment_minor); ++ } ++ if (remainder) { ++ child->flags &= ~MTD_WRITEABLE; ++ printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n", ++ part->name); ++ } + } + + tmp = mtd_get_master_ofs(child, 0) + child->part.size; + remainder = do_div(tmp, wr_alignment); + if ((child->flags & MTD_WRITEABLE) && remainder) { +- child->flags &= ~MTD_WRITEABLE; +- printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n", +- part->name); ++ if (wr_alignment_minor) { ++ tmp = remainder; ++ remainder = do_div(tmp, wr_alignment_minor); ++ } ++ ++ if (remainder) { ++ child->flags &= ~MTD_WRITEABLE; ++ printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n", ++ part->name); ++ } + } + + child->size = child->part.size; +--- a/drivers/mtd/spi-nor/Kconfig ++++ b/drivers/mtd/spi-nor/Kconfig +@@ -10,6 +10,16 @@ menuconfig MTD_SPI_NOR + + if MTD_SPI_NOR + ++config MTD_SPI_NOR_USE_VARIABLE_ERASE ++ bool "Disable uniform_erase to allow use of all hardware supported erasesizes" ++ depends on !MTD_SPI_NOR_USE_4K_SECTORS ++ default n ++ help ++ Allow mixed use of all hardware supported erasesizes, ++ by forcing spi_nor to use the multiple eraseregions code path. ++ For example: A 68K erase will use one 64K erase, and one 4K erase ++ on supporting hardware. ++ + config MTD_SPI_NOR_USE_4K_SECTORS + bool "Use small 4096 B erase sectors" + default y +--- a/drivers/mtd/spi-nor/core.c ++++ b/drivers/mtd/spi-nor/core.c +@@ -1272,6 +1272,8 @@ static u8 spi_nor_convert_3to4_erase(u8 + + static bool spi_nor_has_uniform_erase(const struct spi_nor *nor) + { ++ if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE)) ++ return false; + return !!nor->params->erase_map.uniform_erase_type; + } + +@@ -2401,6 +2403,7 @@ static int spi_nor_select_erase(struct s + { + struct spi_nor_erase_map *map = &nor->params->erase_map; + const struct spi_nor_erase_type *erase = NULL; ++ const struct spi_nor_erase_type *erase_minor = NULL; + struct mtd_info *mtd = &nor->mtd; + u32 wanted_size = nor->info->sector_size; + int i; +@@ -2433,8 +2436,9 @@ static int spi_nor_select_erase(struct s + */ + for (i = SNOR_ERASE_TYPE_MAX - 1; i >= 0; i--) { + if (map->erase_type[i].size) { +- erase = &map->erase_type[i]; +- break; ++ if (!erase) ++ erase = &map->erase_type[i]; ++ erase_minor = &map->erase_type[i]; + } + } + +@@ -2442,6 +2446,9 @@ static int spi_nor_select_erase(struct s + return -EINVAL; + + mtd->erasesize = erase->size; ++ if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE) && ++ erase_minor && erase_minor->size < erase->size) ++ mtd->erasesize_minor = erase_minor->size; + return 0; + } + +--- a/include/linux/mtd/mtd.h ++++ b/include/linux/mtd/mtd.h +@@ -250,6 +250,8 @@ struct mtd_info { + * information below if they desire + */ + uint32_t erasesize; ++ /* "Minor" (smallest) erase size supported by the whole device */ ++ uint32_t erasesize_minor; + /* Minimal writable flash unit size. In case of NOR flash it is 1 (even + * though individual bits can be cleared), in case of NAND flash it is + * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR diff --git a/target/linux/generic/pending-5.15/420-mtd-redboot_space.patch b/target/linux/generic/pending-5.15/420-mtd-redboot_space.patch new file mode 100644 index 0000000000..5518ea71dd --- /dev/null +++ b/target/linux/generic/pending-5.15/420-mtd-redboot_space.patch @@ -0,0 +1,41 @@ +From: Felix Fietkau +Subject: add patch for including unpartitioned space in the rootfs partition for redboot devices (if applicable) + +[john@phrozen.org: used by ixp and others] + +lede-commit: 394918851f84e4d00fa16eb900e7700e95091f00 +Signed-off-by: Felix Fietkau +--- + drivers/mtd/redboot.c | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +--- a/drivers/mtd/parsers/redboot.c ++++ b/drivers/mtd/parsers/redboot.c +@@ -278,14 +278,21 @@ nogood: + #endif + names += strlen(names) + 1; + +-#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED + if (fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) { +- i++; +- parts[i].offset = parts[i - 1].size + parts[i - 1].offset; +- parts[i].size = fl->next->img->flash_base - parts[i].offset; +- parts[i].name = nullname; +- } ++ if (!strcmp(parts[i].name, "rootfs")) { ++ parts[i].size = fl->next->img->flash_base; ++ parts[i].size &= ~(master->erasesize - 1); ++ parts[i].size -= parts[i].offset; ++#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED ++ nrparts--; ++ } else { ++ i++; ++ parts[i].offset = parts[i-1].size + parts[i-1].offset; ++ parts[i].size = fl->next->img->flash_base - parts[i].offset; ++ parts[i].name = nullname; + #endif ++ } ++ } + tmp_fl = fl; + fl = fl->next; + kfree(tmp_fl); diff --git a/target/linux/generic/pending-5.10/430-mtd-add-myloader-partition-parser.patch b/target/linux/generic/pending-5.15/430-mtd-add-myloader-partition-parser.patch similarity index 100% rename from target/linux/generic/pending-5.10/430-mtd-add-myloader-partition-parser.patch rename to target/linux/generic/pending-5.15/430-mtd-add-myloader-partition-parser.patch diff --git a/target/linux/generic/pending-5.10/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch b/target/linux/generic/pending-5.15/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch similarity index 100% rename from target/linux/generic/pending-5.10/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch rename to target/linux/generic/pending-5.15/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch diff --git a/target/linux/generic/pending-5.10/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch b/target/linux/generic/pending-5.15/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch similarity index 100% rename from target/linux/generic/pending-5.10/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch rename to target/linux/generic/pending-5.15/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch diff --git a/target/linux/generic/pending-5.15/435-mtd-add-routerbootpart-parser-config.patch b/target/linux/generic/pending-5.15/435-mtd-add-routerbootpart-parser-config.patch new file mode 100644 index 0000000000..ee949f73c0 --- /dev/null +++ b/target/linux/generic/pending-5.15/435-mtd-add-routerbootpart-parser-config.patch @@ -0,0 +1,38 @@ +From 4437e01fb6bca63fccdba5d6c44888b0935885c2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= +Date: Tue, 24 Mar 2020 11:45:07 +0100 +Subject: [PATCH] generic: routerboot partition build bits (5.4) +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch adds routerbootpart kernel build bits + +Signed-off-by: Thibaut VARÈNE +--- + drivers/mtd/parsers/Kconfig | 9 +++++++++ + drivers/mtd/parsers/Makefile | 1 + + 2 files changed, 10 insertions(+) + +--- a/drivers/mtd/parsers/Kconfig ++++ b/drivers/mtd/parsers/Kconfig +@@ -226,3 +226,12 @@ config MTD_SERCOMM_PARTS + partition map. This partition table contains real partition + offsets, which may differ from device to device depending on the + number and location of bad blocks on NAND. ++ ++config MTD_ROUTERBOOT_PARTS ++ tristate "RouterBoot flash partition parser" ++ depends on MTD && OF ++ help ++ MikroTik RouterBoot is implemented as a multi segment system on the ++ flash, some of which are fixed and some of which are located at ++ variable offsets. This parser handles both cases via properly ++ formatted DTS. +--- a/drivers/mtd/parsers/Makefile ++++ b/drivers/mtd/parsers/Makefile +@@ -16,3 +16,4 @@ obj-$(CONFIG_MTD_SERCOMM_PARTS) += scpa + obj-$(CONFIG_MTD_SHARPSL_PARTS) += sharpslpart.o + obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o + obj-$(CONFIG_MTD_QCOMSMEM_PARTS) += qcomsmempart.o ++obj-$(CONFIG_MTD_ROUTERBOOT_PARTS) += routerbootpart.o diff --git a/target/linux/generic/pending-5.15/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch b/target/linux/generic/pending-5.15/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch new file mode 100644 index 0000000000..0be74a5977 --- /dev/null +++ b/target/linux/generic/pending-5.15/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch @@ -0,0 +1,25 @@ +From: Felix Fietkau +Subject: kernel: disable cfi cmdset 0002 erase suspend + +on some platforms, erase suspend leads to data corruption and lockups when write +ops collide with erase ops. this has been observed on the buffalo wzr-hp-g300nh. +rather than play whack-a-mole with a hard to reproduce issue on a variety of devices, +simply disable erase suspend, as it will usually not produce any useful gain on +the small filesystems used on embedded hardware. + +Signed-off-by: Felix Fietkau +--- + drivers/mtd/chips/cfi_cmdset_0002.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/mtd/chips/cfi_cmdset_0002.c ++++ b/drivers/mtd/chips/cfi_cmdset_0002.c +@@ -907,7 +907,7 @@ static int get_chip(struct map_info *map + return 0; + + case FL_ERASING: +- if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) || ++ if (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) || + !(mode == FL_READY || mode == FL_POINT || + (mode == FL_WRITING && (cfip->EraseSuspend & 0x2)))) + goto sleep; diff --git a/target/linux/generic/pending-5.15/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch b/target/linux/generic/pending-5.15/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch new file mode 100644 index 0000000000..ca56de8271 --- /dev/null +++ b/target/linux/generic/pending-5.15/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch @@ -0,0 +1,17 @@ +From: George Kashperko +Subject: Issue map read after Write Buffer Load command to ensure chip is ready to receive data. + +Signed-off-by: George Kashperko +--- + drivers/mtd/chips/cfi_cmdset_0002.c | 1 + + 1 file changed, 1 insertion(+) +--- a/drivers/mtd/chips/cfi_cmdset_0002.c ++++ b/drivers/mtd/chips/cfi_cmdset_0002.c +@@ -2051,6 +2051,7 @@ static int __xipram do_write_buffer(stru + + /* Write Buffer Load */ + map_write(map, CMD(0x25), cmd_adr); ++ (void) map_read(map, cmd_adr); + + chip->state = FL_WRITING_TO_BUFFER; + diff --git a/target/linux/generic/pending-5.10/465-m25p80-mx-disable-software-protection.patch b/target/linux/generic/pending-5.15/465-m25p80-mx-disable-software-protection.patch similarity index 100% rename from target/linux/generic/pending-5.10/465-m25p80-mx-disable-software-protection.patch rename to target/linux/generic/pending-5.15/465-m25p80-mx-disable-software-protection.patch diff --git a/target/linux/generic/pending-5.15/476-mtd-spi-nor-add-eon-en25q128.patch b/target/linux/generic/pending-5.15/476-mtd-spi-nor-add-eon-en25q128.patch new file mode 100644 index 0000000000..9383e48856 --- /dev/null +++ b/target/linux/generic/pending-5.15/476-mtd-spi-nor-add-eon-en25q128.patch @@ -0,0 +1,18 @@ +From: Piotr Dymacz +Subject: kernel/mtd: add support for EON EN25Q128 + +Signed-off-by: Piotr Dymacz +--- + drivers/mtd/spi-nor/spi-nor.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/mtd/spi-nor/eon.c ++++ b/drivers/mtd/spi-nor/eon.c +@@ -25,6 +25,7 @@ static const struct flash_info eon_parts + { "en25q32b", INFO(0x1c3016, 0, 64 * 1024, 64, 0) }, + { "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) }, + { "en25q64", INFO(0x1c3017, 0, 64 * 1024, 128, SECT_4K) }, ++ { "en25q128", INFO(0x1c3018, 0, 64 * 1024, 256, SECT_4K) }, + { "en25q80a", INFO(0x1c3014, 0, 64 * 1024, 16, + SECT_4K | SPI_NOR_DUAL_READ) }, + { "en25qh16", INFO(0x1c7015, 0, 64 * 1024, 32, diff --git a/target/linux/generic/pending-5.15/477-mtd-spi-nor-add-eon-en25qx128a.patch b/target/linux/generic/pending-5.15/477-mtd-spi-nor-add-eon-en25qx128a.patch new file mode 100644 index 0000000000..3c579e55e3 --- /dev/null +++ b/target/linux/generic/pending-5.15/477-mtd-spi-nor-add-eon-en25qx128a.patch @@ -0,0 +1,21 @@ +From: Christian Marangi +Subject: kernel/mtd: add support for EON EN25QX128A + +Add support for EON EN25QX128A with no flags as it does +support SFDP parsing. + +Signed-off-by: Christian Marangi +--- + drivers/mtd/spi-nor/spi-nor.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/mtd/spi-nor/eon.c ++++ b/drivers/mtd/spi-nor/eon.c +@@ -26,6 +26,7 @@ static const struct flash_info eon_parts + { "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) }, + { "en25q64", INFO(0x1c3017, 0, 64 * 1024, 128, SECT_4K) }, + { "en25q128", INFO(0x1c3018, 0, 64 * 1024, 256, SECT_4K) }, ++ { "en25qx128a", INFO(0x1c7118, 0, 64 * 1024, 256, 0) }, + { "en25q80a", INFO(0x1c3014, 0, 64 * 1024, 16, + SECT_4K | SPI_NOR_DUAL_READ) }, + { "en25qh16", INFO(0x1c7015, 0, 64 * 1024, 32, diff --git a/target/linux/generic/pending-5.15/479-mtd-spi-nor-add-xtx-xt25f128b.patch b/target/linux/generic/pending-5.15/479-mtd-spi-nor-add-xtx-xt25f128b.patch new file mode 100644 index 0000000000..3e1958c8a0 --- /dev/null +++ b/target/linux/generic/pending-5.15/479-mtd-spi-nor-add-xtx-xt25f128b.patch @@ -0,0 +1,79 @@ +From patchwork Thu Feb 6 17:19:41 2020 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Daniel Golle +X-Patchwork-Id: 1234465 +Date: Thu, 6 Feb 2020 19:19:41 +0200 +From: Daniel Golle +To: linux-mtd@lists.infradead.org +Subject: [PATCH v2] mtd: spi-nor: Add support for xt25f128b chip +Message-ID: <20200206171941.GA2398@makrotopia.org> +MIME-Version: 1.0 +Content-Disposition: inline +List-Subscribe: , + +Cc: Eitan Cohen , Piotr Dymacz , + Tudor Ambarus +Sender: "linux-mtd" +Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org + +Add XT25F128B made by XTX Technology (Shenzhen) Limited. +This chip supports dual and quad read and uniform 4K-byte erase. +Verified on Teltonika RUT955 which comes with XT25F128B in recent +versions of the device. + +Signed-off-by: Daniel Golle +Signed-off-by: Felix Fietkau +--- + drivers/mtd/spi-nor/spi-nor.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/mtd/spi-nor/Makefile ++++ b/drivers/mtd/spi-nor/Makefile +@@ -17,6 +17,7 @@ spi-nor-objs += sst.o + spi-nor-objs += winbond.o + spi-nor-objs += xilinx.o + spi-nor-objs += xmc.o ++spi-nor-objs += xtx.o + obj-$(CONFIG_MTD_SPI_NOR) += spi-nor.o + + obj-$(CONFIG_MTD_SPI_NOR) += controllers/ +--- /dev/null ++++ b/drivers/mtd/spi-nor/xtx.c +@@ -0,0 +1,15 @@ ++// SPDX-License-Identifier: GPL-2.0 ++#include ++ ++#include "core.h" ++ ++static const struct flash_info xtx_parts[] = { ++ /* XTX Technology (Shenzhen) Limited */ ++ { "xt25f128b", INFO(0x0B4018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, ++}; ++ ++const struct spi_nor_manufacturer spi_nor_xtx = { ++ .name = "xtx", ++ .parts = xtx_parts, ++ .nparts = ARRAY_SIZE(xtx_parts), ++}; +--- a/drivers/mtd/spi-nor/core.c ++++ b/drivers/mtd/spi-nor/core.c +@@ -1860,6 +1860,7 @@ static const struct spi_nor_manufacturer + &spi_nor_winbond, + &spi_nor_xilinx, + &spi_nor_xmc, ++ &spi_nor_xtx, + }; + + static const struct flash_info * +--- a/drivers/mtd/spi-nor/core.h ++++ b/drivers/mtd/spi-nor/core.h +@@ -489,6 +489,7 @@ extern const struct spi_nor_manufacturer + extern const struct spi_nor_manufacturer spi_nor_winbond; + extern const struct spi_nor_manufacturer spi_nor_xilinx; + extern const struct spi_nor_manufacturer spi_nor_xmc; ++extern const struct spi_nor_manufacturer spi_nor_xtx; + + extern const struct attribute_group *spi_nor_sysfs_groups[]; + diff --git a/target/linux/generic/pending-5.10/482-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch b/target/linux/generic/pending-5.15/481-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch similarity index 100% rename from target/linux/generic/pending-5.10/482-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch rename to target/linux/generic/pending-5.15/481-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch diff --git a/target/linux/generic/pending-5.15/482-mtd-spi-nor-add-gd25q512.patch b/target/linux/generic/pending-5.15/482-mtd-spi-nor-add-gd25q512.patch new file mode 100644 index 0000000000..f452fc7c95 --- /dev/null +++ b/target/linux/generic/pending-5.15/482-mtd-spi-nor-add-gd25q512.patch @@ -0,0 +1,21 @@ +From f8943df3beb0d3f9754bb35320c3a378727175a8 Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Thu, 14 Jul 2022 08:38:07 +0200 +Subject: [PATCH] spi-nor/gigadevic: add gd25q512 + +--- + drivers/mtd/spi-nor/gigadevice.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/mtd/spi-nor/gigadevice.c ++++ b/drivers/mtd/spi-nor/gigadevice.c +@@ -53,6 +53,9 @@ static const struct flash_info gigadevic + SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK | + SPI_NOR_HAS_TB | SPI_NOR_TB_SR_BIT6) + .fixups = &gd25q256_fixups }, ++ { "gd25q512", INFO(0xc84020, 0, 64 * 1024, 1024, ++ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | ++ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB | SPI_NOR_4B_OPCODES) }, + }; + + const struct spi_nor_manufacturer spi_nor_gigadevice = { diff --git a/target/linux/generic/pending-5.15/484-mtd-spi-nor-add-esmt-f25l16pa.patch b/target/linux/generic/pending-5.15/484-mtd-spi-nor-add-esmt-f25l16pa.patch new file mode 100644 index 0000000000..e217bbfcd1 --- /dev/null +++ b/target/linux/generic/pending-5.15/484-mtd-spi-nor-add-esmt-f25l16pa.patch @@ -0,0 +1,23 @@ +From 87363cc0e522de3294ea6ae10fb468d2a8d6fb2f Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 12:17:21 +0200 +Subject: [PATCH] spi-nor/esmt.c: add esmt f25l16pa + +This fixes support for Dongwon T&I DW02-412H which uses F25L16PA(2S) +flash. + +--- + drivers/mtd/spi-nor/esmt.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/mtd/spi-nor/esmt.c ++++ b/drivers/mtd/spi-nor/esmt.c +@@ -10,6 +10,8 @@ + + static const struct flash_info esmt_parts[] = { + /* ESMT */ ++ { "f25l16pa-2s", INFO(0x8c2115, 0, 64 * 1024, 32, ++ SECT_4K | SPI_NOR_HAS_LOCK) }, + { "f25l32pa", INFO(0x8c2016, 0, 64 * 1024, 64, + SECT_4K | SPI_NOR_HAS_LOCK | SPI_NOR_SWP_IS_VOLATILE) }, + { "f25l32qa", INFO(0x8c4116, 0, 64 * 1024, 64, diff --git a/target/linux/generic/pending-5.15/485-mtd-spi-nor-add-xmc-xm25qh128c.patch b/target/linux/generic/pending-5.15/485-mtd-spi-nor-add-xmc-xm25qh128c.patch new file mode 100644 index 0000000000..d7ad88b8de --- /dev/null +++ b/target/linux/generic/pending-5.15/485-mtd-spi-nor-add-xmc-xm25qh128c.patch @@ -0,0 +1,24 @@ +From f6b33d850f7f12555df2fa0e3349b33427bf5890 Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 12:19:01 +0200 +Subject: [PATCH] spi-nor/xmc.c: add xm25qh128c + +The XMC XM25QH128C is a 16MB SPI NOR chip. The patch is verified on +Ruijie RG-EW3200GX PRO. +Datasheet available at https://www.xmcwh.com/uploads/435/XM25QH128C.pdf + +--- + drivers/mtd/spi-nor/xmc.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/mtd/spi-nor/xmc.c ++++ b/drivers/mtd/spi-nor/xmc.c +@@ -14,6 +14,8 @@ static const struct flash_info xmc_parts + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { "XM25QH128A", INFO(0x207018, 0, 64 * 1024, 256, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, ++ { "XM25QH128C", INFO(0x204018, 0, 64 * 1024, 256, ++ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + }; + + const struct spi_nor_manufacturer spi_nor_xmc = { diff --git a/target/linux/generic/pending-5.15/486-01-mtd-spinand-add-support-for-ESMT-F50x1G41LB.patch b/target/linux/generic/pending-5.15/486-01-mtd-spinand-add-support-for-ESMT-F50x1G41LB.patch new file mode 100644 index 0000000000..d117cfe0a3 --- /dev/null +++ b/target/linux/generic/pending-5.15/486-01-mtd-spinand-add-support-for-ESMT-F50x1G41LB.patch @@ -0,0 +1,143 @@ +From a43b844cb40bf1b783055fdc81b7f991e21e7e76 Mon Sep 17 00:00:00 2001 +From: Chuanhong Guo +Date: Wed, 13 Apr 2022 11:58:17 +0800 +Subject: [PATCH] mtd: spinand: add support for ESMT F50x1G41LB + +This patch adds support for ESMT F50L1G41LB and F50D1G41LB. +It seems that ESMT likes to use random JEDEC ID from other vendors. +Their 1G chips uses 0xc8 from GigaDevice and 2G/4G chips uses 0x2c from +Micron. For this reason, the ESMT entry is named esmt_c8 with explicit +JEDEC ID in variable name. + +Datasheets: +https://www.esmt.com.tw/upload/pdf/ESMT/datasheets/F50L1G41LB(2M).pdf +https://www.esmt.com.tw/upload/pdf/ESMT/datasheets/F50D1G41LB(2M).pdf + +Signed-off-by: Chuanhong Guo +--- + drivers/mtd/nand/spi/Makefile | 2 +- + drivers/mtd/nand/spi/core.c | 1 + + drivers/mtd/nand/spi/esmt.c | 89 +++++++++++++++++++++++++++++++++++ + include/linux/mtd/spinand.h | 1 + + 4 files changed, 92 insertions(+), 1 deletion(-) + create mode 100644 drivers/mtd/nand/spi/esmt.c + +--- a/drivers/mtd/nand/spi/Makefile ++++ b/drivers/mtd/nand/spi/Makefile +@@ -1,3 +1,3 @@ + # SPDX-License-Identifier: GPL-2.0 +-spinand-objs := core.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o xtx.o ++spinand-objs := core.o esmt.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o xtx.o + obj-$(CONFIG_MTD_SPI_NAND) += spinand.o +--- a/drivers/mtd/nand/spi/core.c ++++ b/drivers/mtd/nand/spi/core.c +@@ -906,6 +906,7 @@ static const struct nand_ops spinand_ops + }; + + static const struct spinand_manufacturer *spinand_manufacturers[] = { ++ &esmt_c8_spinand_manufacturer, + &gigadevice_spinand_manufacturer, + ¯onix_spinand_manufacturer, + µn_spinand_manufacturer, +--- /dev/null ++++ b/drivers/mtd/nand/spi/esmt.c +@@ -0,0 +1,89 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Author: ++ * Chuanhong Guo ++ */ ++ ++#include ++#include ++#include ++ ++/* ESMT uses GigaDevice 0xc8 JECDEC ID on some SPI NANDs */ ++#define SPINAND_MFR_ESMT_C8 0xc8 ++ ++static SPINAND_OP_VARIANTS(read_cache_variants, ++ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); ++ ++static SPINAND_OP_VARIANTS(write_cache_variants, ++ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), ++ SPINAND_PROG_LOAD(true, 0, NULL, 0)); ++ ++static SPINAND_OP_VARIANTS(update_cache_variants, ++ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), ++ SPINAND_PROG_LOAD(false, 0, NULL, 0)); ++ ++static int f50l1g41lb_ooblayout_ecc(struct mtd_info *mtd, int section, ++ struct mtd_oob_region *region) ++{ ++ if (section > 3) ++ return -ERANGE; ++ ++ region->offset = 16 * section + 8; ++ region->length = 8; ++ ++ return 0; ++} ++ ++static int f50l1g41lb_ooblayout_free(struct mtd_info *mtd, int section, ++ struct mtd_oob_region *region) ++{ ++ if (section > 3) ++ return -ERANGE; ++ ++ region->offset = 16 * section + 2; ++ region->length = 6; ++ ++ return 0; ++} ++ ++static const struct mtd_ooblayout_ops f50l1g41lb_ooblayout = { ++ .ecc = f50l1g41lb_ooblayout_ecc, ++ .free = f50l1g41lb_ooblayout_free, ++}; ++ ++static const struct spinand_info esmt_c8_spinand_table[] = { ++ SPINAND_INFO("F50L1G41LB", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x01), ++ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), ++ NAND_ECCREQ(1, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, ++ &write_cache_variants, ++ &update_cache_variants), ++ 0, ++ SPINAND_ECCINFO(&f50l1g41lb_ooblayout, NULL)), ++ SPINAND_INFO("F50D1G41LB", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x11), ++ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), ++ NAND_ECCREQ(1, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, ++ &write_cache_variants, ++ &update_cache_variants), ++ 0, ++ SPINAND_ECCINFO(&f50l1g41lb_ooblayout, NULL)), ++}; ++ ++static const struct spinand_manufacturer_ops esmt_spinand_manuf_ops = { ++}; ++ ++const struct spinand_manufacturer esmt_c8_spinand_manufacturer = { ++ .id = SPINAND_MFR_ESMT_C8, ++ .name = "ESMT", ++ .chips = esmt_c8_spinand_table, ++ .nchips = ARRAY_SIZE(esmt_c8_spinand_table), ++ .ops = &esmt_spinand_manuf_ops, ++}; +--- a/include/linux/mtd/spinand.h ++++ b/include/linux/mtd/spinand.h +@@ -260,6 +260,7 @@ struct spinand_manufacturer { + }; + + /* SPI NAND manufacturers */ ++extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer; + extern const struct spinand_manufacturer gigadevice_spinand_manufacturer; + extern const struct spinand_manufacturer macronix_spinand_manufacturer; + extern const struct spinand_manufacturer micron_spinand_manufacturer; diff --git a/target/linux/generic/pending-5.15/487-mtd-spinand-Add-support-for-Etron-EM73D044VCx.patch b/target/linux/generic/pending-5.15/487-mtd-spinand-Add-support-for-Etron-EM73D044VCx.patch new file mode 100644 index 0000000000..076fb4bf3a --- /dev/null +++ b/target/linux/generic/pending-5.15/487-mtd-spinand-Add-support-for-Etron-EM73D044VCx.patch @@ -0,0 +1,168 @@ +From f32085fc0b87049491b07e198d924d738a1a2834 Mon Sep 17 00:00:00 2001 +From: Daniel Danzberger +Date: Wed, 3 Aug 2022 17:31:03 +0200 +Subject: [PATCH] mtd: spinand: Add support for Etron EM73D044VCx + +Airoha is a new ARM platform based on Cortex-A53 which has recently been +merged into linux-next. + +Due to BootROM limitations on this platform, the Cortex-A53 can't run in +Aarch64 mode and code must be compiled for 32-Bit ARM. + +This support is based mostly on those linux-next commits backported +for kernel 5.15. + +Patches: +1 - platform support = linux-next +2 - clock driver = linux-next +3 - gpio driver = linux-next +4 - linux,usable-memory-range dts support = linux-next +5 - mtd spinand driver +6 - spi driver +7 - pci driver (kconfig only, uses mediatek PCI) = linux-next + +Still missing: +- Ethernet driver +- Sysupgrade support + +A.t.m there exists one subtarget EN7523 with only one evaluation +board. + +The initramfs can be run with the following commands from u-boot: +- +u-boot> setenv bootfile \ + librecmc-airoha-airoha_en7523-evb-initramfs-kernel.bin +u-boot> tftpboot +u-boot> bootm 0x81800000 +- + +Submitted-by: Daniel Danzberger + +--- a/drivers/mtd/nand/spi/Makefile ++++ b/drivers/mtd/nand/spi/Makefile +@@ -1,3 +1,3 @@ + # SPDX-License-Identifier: GPL-2.0 +-spinand-objs := core.o esmt.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o xtx.o ++spinand-objs := core.o esmt.o etron.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o xtx.o + obj-$(CONFIG_MTD_SPI_NAND) += spinand.o +--- a/drivers/mtd/nand/spi/core.c ++++ b/drivers/mtd/nand/spi/core.c +@@ -908,6 +908,7 @@ static const struct nand_ops spinand_ops + static const struct spinand_manufacturer *spinand_manufacturers[] = { + &esmt_c8_spinand_manufacturer, + &gigadevice_spinand_manufacturer, ++ &etron_spinand_manufacturer, + ¯onix_spinand_manufacturer, + µn_spinand_manufacturer, + ¶gon_spinand_manufacturer, +--- /dev/null ++++ b/drivers/mtd/nand/spi/etron.c +@@ -0,0 +1,98 @@ ++// SPDX-License-Identifier: GPL-2.0 ++ ++#include ++#include ++#include ++ ++#define SPINAND_MFR_ETRON 0xd5 ++ ++ ++static SPINAND_OP_VARIANTS(read_cache_variants, ++ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), ++ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); ++ ++static SPINAND_OP_VARIANTS(write_cache_variants, ++ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), ++ SPINAND_PROG_LOAD(true, 0, NULL, 0)); ++ ++static SPINAND_OP_VARIANTS(update_cache_variants, ++ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), ++ SPINAND_PROG_LOAD(false, 0, NULL, 0)); ++ ++static int etron_ooblayout_ecc(struct mtd_info *mtd, int section, ++ struct mtd_oob_region *oobregion) ++{ ++ if (section) ++ return -ERANGE; ++ ++ oobregion->offset = 72; ++ oobregion->length = 56; ++ ++ return 0; ++} ++ ++static int etron_ooblayout_free(struct mtd_info *mtd, int section, ++ struct mtd_oob_region *oobregion) ++{ ++ if (section) ++ return -ERANGE; ++ ++ oobregion->offset = 1; ++ oobregion->length = 71; ++ ++ return 0; ++} ++ ++static int etron_ecc_get_status(struct spinand_device *spinand, u8 status) ++{ ++ switch (status & STATUS_ECC_MASK) { ++ case STATUS_ECC_NO_BITFLIPS: ++ return 0; ++ ++ case STATUS_ECC_HAS_BITFLIPS: ++ /* Between 1-7 bitflips were corrected */ ++ return 7; ++ ++ case STATUS_ECC_MASK: ++ /* Maximum bitflips were corrected */ ++ return 8; ++ ++ case STATUS_ECC_UNCOR_ERROR: ++ return -EBADMSG; ++ } ++ ++ return -EINVAL; ++} ++ ++static const struct mtd_ooblayout_ops etron_ooblayout = { ++ .ecc = etron_ooblayout_ecc, ++ .free = etron_ooblayout_free, ++}; ++ ++static const struct spinand_info etron_spinand_table[] = { ++ SPINAND_INFO("EM73D044VCx", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x1f), ++ // bpc, pagesize, oobsize, pagesperblock, bperlun, maxbadplun, ppl, lpt, #t ++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&etron_ooblayout, etron_ecc_get_status)), ++}; ++ ++static const struct spinand_manufacturer_ops etron_spinand_manuf_ops = { ++}; ++ ++const struct spinand_manufacturer etron_spinand_manufacturer = { ++ .id = SPINAND_MFR_ETRON, ++ .name = "Etron", ++ .chips = etron_spinand_table, ++ .nchips = ARRAY_SIZE(etron_spinand_table), ++ .ops = &etron_spinand_manuf_ops, ++}; +--- a/include/linux/mtd/spinand.h ++++ b/include/linux/mtd/spinand.h +@@ -261,6 +261,7 @@ struct spinand_manufacturer { + + /* SPI NAND manufacturers */ + extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer; ++extern const struct spinand_manufacturer etron_spinand_manufacturer; + extern const struct spinand_manufacturer gigadevice_spinand_manufacturer; + extern const struct spinand_manufacturer macronix_spinand_manufacturer; + extern const struct spinand_manufacturer micron_spinand_manufacturer; diff --git a/target/linux/generic/pending-5.15/488-mtd-spi-nor-add-xmc-xm25qh64c.patch b/target/linux/generic/pending-5.15/488-mtd-spi-nor-add-xmc-xm25qh64c.patch new file mode 100644 index 0000000000..236d1c2755 --- /dev/null +++ b/target/linux/generic/pending-5.15/488-mtd-spi-nor-add-xmc-xm25qh64c.patch @@ -0,0 +1,22 @@ +From: Joe Mullally +Subject: mtd/spi-nor/xmc: add support for XMC XM25QH64C + +The XMC XM25QH64C is a 8MB SPI NOR chip. The patch is verified on TL-WPA8631P v3. +Datasheet available at https://www.xmcwh.com/uploads/442/XM25QH64C.pdf + +Signed-off-by: Joe Mullally +--- + drivers/mtd/spi-nor/xmc.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/mtd/spi-nor/xmc.c ++++ b/drivers/mtd/spi-nor/xmc.c +@@ -12,6 +12,8 @@ static const struct flash_info xmc_parts + /* XMC (Wuhan Xinxin Semiconductor Manufacturing Corp.) */ + { "XM25QH64A", INFO(0x207017, 0, 64 * 1024, 128, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, ++ { "XM25QH64C", INFO(0x204017, 0, 64 * 1024, 128, ++ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { "XM25QH128A", INFO(0x207018, 0, 64 * 1024, 256, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { "XM25QH128C", INFO(0x204018, 0, 64 * 1024, 256, diff --git a/target/linux/generic/pending-5.15/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch b/target/linux/generic/pending-5.15/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch new file mode 100644 index 0000000000..e8da36edba --- /dev/null +++ b/target/linux/generic/pending-5.15/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch @@ -0,0 +1,97 @@ +From: Daniel Golle +Subject: ubi: auto-attach mtd device named "ubi" or "data" on boot + +Signed-off-by: Daniel Golle +--- + drivers/mtd/ubi/build.c | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +--- a/drivers/mtd/ubi/build.c ++++ b/drivers/mtd/ubi/build.c +@@ -1207,6 +1207,73 @@ static struct mtd_info * __init open_mtd + return mtd; + } + ++/* ++ * This function tries attaching mtd partitions named either "ubi" or "data" ++ * during boot. ++ */ ++static void __init ubi_auto_attach(void) ++{ ++ int err; ++ struct mtd_info *mtd; ++ loff_t offset = 0; ++ size_t len; ++ char magic[4]; ++ ++ /* try attaching mtd device named "ubi" or "data" */ ++ mtd = open_mtd_device("ubi"); ++ if (IS_ERR(mtd)) ++ mtd = open_mtd_device("data"); ++ ++ if (IS_ERR(mtd)) ++ return; ++ ++ /* get the first not bad block */ ++ if (mtd_can_have_bb(mtd)) ++ while (mtd_block_isbad(mtd, offset)) { ++ offset += mtd->erasesize; ++ ++ if (offset > mtd->size) { ++ pr_err("UBI error: Failed to find a non-bad " ++ "block on mtd%d\n", mtd->index); ++ goto cleanup; ++ } ++ } ++ ++ /* check if the read from flash was successful */ ++ err = mtd_read(mtd, offset, 4, &len, (void *) magic); ++ if ((err && !mtd_is_bitflip(err)) || len != 4) { ++ pr_err("UBI error: unable to read from mtd%d\n", mtd->index); ++ goto cleanup; ++ } ++ ++ /* check for a valid ubi magic */ ++ if (strncmp(magic, "UBI#", 4)) { ++ pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index); ++ goto cleanup; ++ } ++ ++ /* don't auto-add media types where UBI doesn't makes sense */ ++ if (mtd->type != MTD_NANDFLASH && ++ mtd->type != MTD_NORFLASH && ++ mtd->type != MTD_DATAFLASH && ++ mtd->type != MTD_MLCNANDFLASH) ++ goto cleanup; ++ ++ mutex_lock(&ubi_devices_mutex); ++ pr_notice("UBI: auto-attach mtd%d\n", mtd->index); ++ err = ubi_attach_mtd_dev(mtd, UBI_DEV_NUM_AUTO, 0, 0); ++ mutex_unlock(&ubi_devices_mutex); ++ if (err < 0) { ++ pr_err("UBI error: cannot attach mtd%d\n", mtd->index); ++ goto cleanup; ++ } ++ ++ return; ++ ++cleanup: ++ put_mtd_device(mtd); ++} ++ + static int __init ubi_init(void) + { + int err, i, k; +@@ -1290,6 +1357,12 @@ static int __init ubi_init(void) + } + } + ++ /* auto-attach mtd devices only if built-in to the kernel and no ubi.mtd ++ * parameter was given */ ++ if (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && ++ !ubi_is_module() && !mtd_devs) ++ ubi_auto_attach(); ++ + err = ubiblock_init(); + if (err) { + pr_err("UBI error: block: cannot initialize, error %d\n", err); diff --git a/target/linux/generic/pending-5.15/491-ubi-auto-create-ubiblock-device-for-rootfs.patch b/target/linux/generic/pending-5.15/491-ubi-auto-create-ubiblock-device-for-rootfs.patch new file mode 100644 index 0000000000..ae53770c11 --- /dev/null +++ b/target/linux/generic/pending-5.15/491-ubi-auto-create-ubiblock-device-for-rootfs.patch @@ -0,0 +1,69 @@ +From: Daniel Golle +Subject: ubi: auto-create ubiblock device for rootfs + +Signed-off-by: Daniel Golle +--- + drivers/mtd/ubi/block.c | 42 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 42 insertions(+) + +--- a/drivers/mtd/ubi/block.c ++++ b/drivers/mtd/ubi/block.c +@@ -642,6 +642,47 @@ static void __init ubiblock_create_from_ + } + } + ++#define UBIFS_NODE_MAGIC 0x06101831 ++static inline int ubi_vol_is_ubifs(struct ubi_volume_desc *desc) ++{ ++ int ret; ++ uint32_t magic_of, magic; ++ ret = ubi_read(desc, 0, (char *)&magic_of, 0, 4); ++ if (ret) ++ return 0; ++ magic = le32_to_cpu(magic_of); ++ return magic == UBIFS_NODE_MAGIC; ++} ++ ++static void __init ubiblock_create_auto_rootfs(void) ++{ ++ int ubi_num, ret, is_ubifs; ++ struct ubi_volume_desc *desc; ++ struct ubi_volume_info vi; ++ ++ for (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++) { ++ desc = ubi_open_volume_nm(ubi_num, "rootfs", UBI_READONLY); ++ if (IS_ERR(desc)) ++ desc = ubi_open_volume_nm(ubi_num, "fit", UBI_READONLY);; ++ ++ if (IS_ERR(desc)) ++ continue; ++ ++ ubi_get_volume_info(desc, &vi); ++ is_ubifs = ubi_vol_is_ubifs(desc); ++ ubi_close_volume(desc); ++ if (is_ubifs) ++ break; ++ ++ ret = ubiblock_create(&vi); ++ if (ret) ++ pr_err("UBI error: block: can't add '%s' volume, err=%d\n", ++ vi.name, ret); ++ /* always break if we get here */ ++ break; ++ } ++} ++ + static void ubiblock_remove_all(void) + { + struct ubiblock *next; +@@ -674,6 +715,10 @@ int __init ubiblock_init(void) + */ + ubiblock_create_from_param(); + ++ /* auto-attach "rootfs" volume if existing and non-ubifs */ ++ if (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV)) ++ ubiblock_create_auto_rootfs(); ++ + /* + * Block devices are only created upon user requests, so we ignore + * existing volumes. diff --git a/target/linux/generic/pending-5.15/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch b/target/linux/generic/pending-5.15/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch new file mode 100644 index 0000000000..cf41c8cad3 --- /dev/null +++ b/target/linux/generic/pending-5.15/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch @@ -0,0 +1,53 @@ +From: Daniel Golle +Subject: try auto-mounting ubi0:rootfs in init/do_mounts.c + +Signed-off-by: Daniel Golle +--- + init/do_mounts.c | 26 +++++++++++++++++++++++++- + 1 file changed, 25 insertions(+), 1 deletion(-) + +--- a/init/do_mounts.c ++++ b/init/do_mounts.c +@@ -447,7 +447,30 @@ retry: + out: + put_page(page); + } +- ++ ++#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV ++static int __init mount_ubi_rootfs(void) ++{ ++ int flags = MS_SILENT; ++ int err, tried = 0; ++ ++ while (tried < 2) { ++ err = do_mount_root("ubi0:rootfs", "ubifs", flags, \ ++ root_mount_data); ++ switch (err) { ++ case -EACCES: ++ flags |= MS_RDONLY; ++ tried++; ++ break; ++ default: ++ return err; ++ } ++ } ++ ++ return -EINVAL; ++} ++#endif ++ + #ifdef CONFIG_ROOT_NFS + + #define NFSROOT_TIMEOUT_MIN 5 +@@ -580,6 +603,10 @@ void __init mount_root(void) + return; + } + #endif ++#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV ++ if (!mount_ubi_rootfs()) ++ return; ++#endif + if (ROOT_DEV == 0 && root_device_name && root_fs_names) { + if (mount_nodev_root() == 0) + return; diff --git a/target/linux/generic/pending-5.15/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch b/target/linux/generic/pending-5.15/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch new file mode 100644 index 0000000000..266a6331c2 --- /dev/null +++ b/target/linux/generic/pending-5.15/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch @@ -0,0 +1,34 @@ +From: Daniel Golle +Subject: ubi: set ROOT_DEV to ubiblock "rootfs" if unset + +Signed-off-by: Daniel Golle +--- + drivers/mtd/ubi/block.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/mtd/ubi/block.c ++++ b/drivers/mtd/ubi/block.c +@@ -42,6 +42,7 @@ + #include + #include + #include ++#include + + #include "ubi-media.h" + #include "ubi.h" +@@ -451,6 +452,15 @@ int ubiblock_create(struct ubi_volume_in + dev_info(disk_to_dev(dev->gd), "created from ubi%d:%d(%s)", + dev->ubi_num, dev->vol_id, vi->name); + mutex_unlock(&devices_mutex); ++ ++ if (!strcmp(vi->name, "rootfs") && ++ IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && ++ ROOT_DEV == 0) { ++ pr_notice("ubiblock: device ubiblock%d_%d (%s) set to be root filesystem\n", ++ dev->ubi_num, dev->vol_id, vi->name); ++ ROOT_DEV = MKDEV(gd->major, gd->first_minor); ++ } ++ + return 0; + + out_remove_minor: diff --git a/target/linux/generic/pending-5.15/494-mtd-ubi-add-EOF-marker-support.patch b/target/linux/generic/pending-5.15/494-mtd-ubi-add-EOF-marker-support.patch new file mode 100644 index 0000000000..413431755f --- /dev/null +++ b/target/linux/generic/pending-5.15/494-mtd-ubi-add-EOF-marker-support.patch @@ -0,0 +1,60 @@ +From: Gabor Juhos +Subject: mtd: add EOF marker support to the UBI layer + +Signed-off-by: Gabor Juhos +--- + drivers/mtd/ubi/attach.c | 25 ++++++++++++++++++++++--- + drivers/mtd/ubi/ubi.h | 1 + + 2 files changed, 23 insertions(+), 3 deletions(-) + +--- a/drivers/mtd/ubi/attach.c ++++ b/drivers/mtd/ubi/attach.c +@@ -926,6 +926,13 @@ static bool vol_ignored(int vol_id) + #endif + } + ++static bool ec_hdr_has_eof(struct ubi_ec_hdr *ech) ++{ ++ return ech->padding1[0] == 'E' && ++ ech->padding1[1] == 'O' && ++ ech->padding1[2] == 'F'; ++} ++ + /** + * scan_peb - scan and process UBI headers of a PEB. + * @ubi: UBI device description object +@@ -958,9 +965,21 @@ static int scan_peb(struct ubi_device *u + return 0; + } + +- err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); +- if (err < 0) +- return err; ++ if (!ai->eof_found) { ++ err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); ++ if (err < 0) ++ return err; ++ ++ if (ec_hdr_has_eof(ech)) { ++ pr_notice("UBI: EOF marker found, PEBs from %d will be erased\n", ++ pnum); ++ ai->eof_found = true; ++ } ++ } ++ ++ if (ai->eof_found) ++ err = UBI_IO_FF_BITFLIPS; ++ + switch (err) { + case 0: + break; +--- a/drivers/mtd/ubi/ubi.h ++++ b/drivers/mtd/ubi/ubi.h +@@ -778,6 +778,7 @@ struct ubi_attach_info { + int mean_ec; + uint64_t ec_sum; + int ec_count; ++ bool eof_found; + struct kmem_cache *aeb_slab_cache; + struct ubi_ec_hdr *ech; + struct ubi_vid_io_buf *vidb; diff --git a/target/linux/generic/pending-5.10/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch b/target/linux/generic/pending-5.15/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch similarity index 100% rename from target/linux/generic/pending-5.10/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch rename to target/linux/generic/pending-5.15/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch diff --git a/target/linux/generic/pending-5.15/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch b/target/linux/generic/pending-5.15/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch new file mode 100644 index 0000000000..e0cbc4508b --- /dev/null +++ b/target/linux/generic/pending-5.15/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch @@ -0,0 +1,216 @@ +From e53f712d8eac71f54399b61038ccf87d2cee99d7 Mon Sep 17 00:00:00 2001 +From: Bernhard Frauendienst +Date: Sat, 25 Aug 2018 12:35:22 +0200 +Subject: [PATCH 497/497] mtd: mtdconcat: add dt driver for concat devices + +Some mtd drivers like physmap variants have support for concatenating +multiple mtd devices, but there is no generic way to define such a +concat device from within the device tree. + +This is useful for some SoC boards that use multiple flash chips as +memory banks of a single mtd device, with partitions spanning chip +borders. + +This commit adds a driver for creating virtual mtd-concat devices. They +must have a compatible = "mtd-concat" line, and define a list of devices +to concat in the 'devices' property, for example: + +flash { + compatible = "mtd-concat"; + + devices = <&flash0 &flash1>; + + partitions { + ... + }; +}; + +The driver is added to the very end of the mtd Makefile to increase the +likelyhood of all child devices already being loaded at the time of +probing, preventing unnecessary deferred probes. + +Signed-off-by: Bernhard Frauendienst +--- + drivers/mtd/Kconfig | 2 + + drivers/mtd/Makefile | 3 + + drivers/mtd/composite/Kconfig | 12 +++ + drivers/mtd/composite/Makefile | 6 ++ + drivers/mtd/composite/virt_concat.c | 128 ++++++++++++++++++++++++++++ + 5 files changed, 151 insertions(+) + create mode 100644 drivers/mtd/composite/Kconfig + create mode 100644 drivers/mtd/composite/Makefile + create mode 100644 drivers/mtd/composite/virt_concat.c + +--- a/drivers/mtd/Kconfig ++++ b/drivers/mtd/Kconfig +@@ -241,4 +241,6 @@ source "drivers/mtd/ubi/Kconfig" + + source "drivers/mtd/hyperbus/Kconfig" + ++source "drivers/mtd/composite/Kconfig" ++ + endif # MTD +--- a/drivers/mtd/Makefile ++++ b/drivers/mtd/Makefile +@@ -33,3 +33,6 @@ obj-y += chips/ lpddr/ maps/ devices/ n + obj-$(CONFIG_MTD_SPI_NOR) += spi-nor/ + obj-$(CONFIG_MTD_UBI) += ubi/ + obj-$(CONFIG_MTD_HYPERBUS) += hyperbus/ ++ ++# Composite drivers must be loaded last ++obj-y += composite/ +--- /dev/null ++++ b/drivers/mtd/composite/Kconfig +@@ -0,0 +1,12 @@ ++menu "Composite MTD device drivers" ++ depends on MTD!=n ++ ++config MTD_VIRT_CONCAT ++ tristate "Virtual concat MTD device" ++ help ++ This driver allows creation of a virtual MTD concat device, which ++ concatenates multiple underlying MTD devices to a single device. ++ This is required by some SoC boards where multiple memory banks are ++ used as one device with partitions spanning across device boundaries. ++ ++endmenu +--- /dev/null ++++ b/drivers/mtd/composite/Makefile +@@ -0,0 +1,6 @@ ++# SPDX-License-Identifier: GPL-2.0 ++# ++# linux/drivers/mtd/composite/Makefile ++# ++ ++obj-$(CONFIG_MTD_VIRT_CONCAT) += virt_concat.o +--- /dev/null ++++ b/drivers/mtd/composite/virt_concat.c +@@ -0,0 +1,128 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * Virtual concat MTD device driver ++ * ++ * Copyright (C) 2018 Bernhard Frauendienst ++ * Author: Bernhard Frauendienst, kernel@nospam.obeliks.de ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* ++ * struct of_virt_concat - platform device driver data. ++ * @cmtd the final mtd_concat device ++ * @num_devices the number of devices in @devices ++ * @devices points to an array of devices already loaded ++ */ ++struct of_virt_concat { ++ struct mtd_info *cmtd; ++ int num_devices; ++ struct mtd_info **devices; ++}; ++ ++static int virt_concat_remove(struct platform_device *pdev) ++{ ++ struct of_virt_concat *info; ++ int i; ++ ++ info = platform_get_drvdata(pdev); ++ if (!info) ++ return 0; ++ ++ // unset data for when this is called after a probe error ++ platform_set_drvdata(pdev, NULL); ++ ++ if (info->cmtd) { ++ mtd_device_unregister(info->cmtd); ++ mtd_concat_destroy(info->cmtd); ++ } ++ ++ if (info->devices) { ++ for (i = 0; i < info->num_devices; i++) ++ put_mtd_device(info->devices[i]); ++ } ++ ++ return 0; ++} ++ ++static int virt_concat_probe(struct platform_device *pdev) ++{ ++ struct device_node *node = pdev->dev.of_node; ++ struct of_phandle_iterator it; ++ struct of_virt_concat *info; ++ struct mtd_info *mtd; ++ int err = 0, count; ++ ++ count = of_count_phandle_with_args(node, "devices", NULL); ++ if (count <= 0) ++ return -EINVAL; ++ ++ info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); ++ if (!info) ++ return -ENOMEM; ++ info->devices = devm_kcalloc(&pdev->dev, count, ++ sizeof(*(info->devices)), GFP_KERNEL); ++ if (!info->devices) { ++ err = -ENOMEM; ++ goto err_remove; ++ } ++ ++ platform_set_drvdata(pdev, info); ++ ++ of_for_each_phandle(&it, err, node, "devices", NULL, 0) { ++ mtd = of_get_mtd_device_by_node(it.node); ++ if (IS_ERR(mtd)) { ++ of_node_put(it.node); ++ err = -EPROBE_DEFER; ++ goto err_remove; ++ } ++ ++ info->devices[info->num_devices++] = mtd; ++ } ++ ++ info->cmtd = mtd_concat_create(info->devices, info->num_devices, ++ dev_name(&pdev->dev)); ++ if (!info->cmtd) { ++ err = -ENXIO; ++ goto err_remove; ++ } ++ ++ info->cmtd->dev.parent = &pdev->dev; ++ mtd_set_of_node(info->cmtd, node); ++ mtd_device_register(info->cmtd, NULL, 0); ++ ++ return 0; ++ ++err_remove: ++ virt_concat_remove(pdev); ++ ++ return err; ++} ++ ++static const struct of_device_id virt_concat_of_match[] = { ++ { .compatible = "mtd-concat", }, ++ { /* sentinel */ } ++}; ++MODULE_DEVICE_TABLE(of, virt_concat_of_match); ++ ++static struct platform_driver virt_concat_driver = { ++ .probe = virt_concat_probe, ++ .remove = virt_concat_remove, ++ .driver = { ++ .name = "virt-mtdconcat", ++ .of_match_table = virt_concat_of_match, ++ }, ++}; ++ ++module_platform_driver(virt_concat_driver); ++ ++MODULE_LICENSE("GPL v2"); ++MODULE_AUTHOR("Bernhard Frauendienst "); ++MODULE_DESCRIPTION("Virtual concat MTD device driver"); diff --git a/target/linux/generic/pending-5.15/498-mtd-spi-nor-locking-support-for-MX25L6405D.patch b/target/linux/generic/pending-5.15/498-mtd-spi-nor-locking-support-for-MX25L6405D.patch new file mode 100644 index 0000000000..81de764876 --- /dev/null +++ b/target/linux/generic/pending-5.15/498-mtd-spi-nor-locking-support-for-MX25L6405D.patch @@ -0,0 +1,34 @@ +From 8bf2ce6ea4ee840b70f55a27f80e1cd308051b13 Mon Sep 17 00:00:00 2001 +From: Nick Hainke +Date: Mon, 27 Dec 2021 00:38:13 +0100 +Subject: [PATCH 1/2] mtd: spi-nor: locking support for MX25L6405D + +Macronix MX25L6405D supports locking with four block-protection bits. +Currently, the driver only sets three bits. If the bootloader does not +sustain the flash chip in an unlocked state, the flash might be +non-writeable. Add the corresponding flag to enable locking support with +four bits in the status register. + +Tested on Nanostation M2 XM. + +Similar to commit 7ea40b54e83b ("mtd: spi-nor: enable locking support for +MX25L12805D") + +Signed-off-by: David Bauer +Signed-off-by: Nick Hainke +--- + drivers/mtd/spi-nor/macronix.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/mtd/spi-nor/macronix.c ++++ b/drivers/mtd/spi-nor/macronix.c +@@ -41,7 +41,8 @@ static const struct flash_info macronix_ + { "mx25l1606e", INFO(0xc22015, 0, 64 * 1024, 32, SECT_4K) }, + { "mx25l3205d", INFO(0xc22016, 0, 64 * 1024, 64, SECT_4K) }, + { "mx25l3255e", INFO(0xc29e16, 0, 64 * 1024, 64, SECT_4K) }, +- { "mx25l6405d", INFO(0xc22017, 0, 64 * 1024, 128, SECT_4K) }, ++ { "mx25l6405d", INFO(0xc22017, 0, 64 * 1024, 128, SECT_4K | ++ SPI_NOR_HAS_LOCK | SPI_NOR_4BIT_BP) }, + { "mx25u2033e", INFO(0xc22532, 0, 64 * 1024, 4, SECT_4K) }, + { "mx25u3235f", INFO(0xc22536, 0, 64 * 1024, 64, + SECT_4K | SPI_NOR_DUAL_READ | diff --git a/target/linux/generic/pending-5.10/499-mtd-spi-nor-disable-16-bit-sr-for-macronix.patch b/target/linux/generic/pending-5.15/499-mtd-spi-nor-disable-16-bit-sr-for-macronix.patch similarity index 100% rename from target/linux/generic/pending-5.10/499-mtd-spi-nor-disable-16-bit-sr-for-macronix.patch rename to target/linux/generic/pending-5.15/499-mtd-spi-nor-disable-16-bit-sr-for-macronix.patch diff --git a/target/linux/generic/pending-5.15/500-fs_cdrom_dependencies.patch b/target/linux/generic/pending-5.15/500-fs_cdrom_dependencies.patch new file mode 100644 index 0000000000..03414dde5a --- /dev/null +++ b/target/linux/generic/pending-5.15/500-fs_cdrom_dependencies.patch @@ -0,0 +1,52 @@ +From af7b91bcecce0eae24e90acd35d96ecee73e1407 Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 12:21:15 +0200 +Subject: [PATCH] fs: add cdrom dependency + +--- + fs/hfs/Kconfig | 1 + + fs/hfsplus/Kconfig | 1 + + fs/isofs/Kconfig | 1 + + fs/udf/Kconfig | 1 + + 4 files changed, 4 insertions(+) + +--- a/fs/hfs/Kconfig ++++ b/fs/hfs/Kconfig +@@ -2,6 +2,7 @@ + config HFS_FS + tristate "Apple Macintosh file system support" + depends on BLOCK ++ select CDROM + select NLS + help + If you say Y here, you will be able to mount Macintosh-formatted +--- a/fs/hfsplus/Kconfig ++++ b/fs/hfsplus/Kconfig +@@ -2,6 +2,7 @@ + config HFSPLUS_FS + tristate "Apple Extended HFS file system support" + depends on BLOCK ++ select CDROM + select NLS + select NLS_UTF8 + help +--- a/fs/isofs/Kconfig ++++ b/fs/isofs/Kconfig +@@ -1,6 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0-only + config ISO9660_FS + tristate "ISO 9660 CDROM file system support" ++ select CDROM + help + This is the standard file system used on CD-ROMs. It was previously + known as "High Sierra File System" and is called "hsfs" on other +--- a/fs/udf/Kconfig ++++ b/fs/udf/Kconfig +@@ -1,6 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0-only + config UDF_FS + tristate "UDF file system support" ++ select CDROM + select CRC_ITU_T + select NLS + help diff --git a/target/linux/generic/pending-5.15/530-jffs2_make_lzma_available.patch b/target/linux/generic/pending-5.15/530-jffs2_make_lzma_available.patch new file mode 100644 index 0000000000..f236657b71 --- /dev/null +++ b/target/linux/generic/pending-5.15/530-jffs2_make_lzma_available.patch @@ -0,0 +1,4581 @@ +From: Alexandros C. Couloumbis +Subject: fs: add jffs2/lzma support (not activated by default yet) + +lede-commit: c2c88d315fa0e881f8b19da07b62859b915b11b2 +Signed-off-by: Alexandros C. Couloumbis +--- + fs/jffs2/Kconfig | 9 + + fs/jffs2/Makefile | 3 + + fs/jffs2/compr.c | 6 + + fs/jffs2/compr.h | 10 +- + fs/jffs2/compr_lzma.c | 128 +++ + fs/jffs2/super.c | 33 +- + include/linux/lzma.h | 62 ++ + include/linux/lzma/LzFind.h | 115 +++ + include/linux/lzma/LzHash.h | 54 + + include/linux/lzma/LzmaDec.h | 231 +++++ + include/linux/lzma/LzmaEnc.h | 80 ++ + include/linux/lzma/Types.h | 226 +++++ + include/uapi/linux/jffs2.h | 1 + + lib/Kconfig | 6 + + lib/Makefile | 12 + + lib/lzma/LzFind.c | 761 ++++++++++++++ + lib/lzma/LzmaDec.c | 999 +++++++++++++++++++ + lib/lzma/LzmaEnc.c | 2271 ++++++++++++++++++++++++++++++++++++++++++ + lib/lzma/Makefile | 7 + + 19 files changed, 5008 insertions(+), 6 deletions(-) + create mode 100644 fs/jffs2/compr_lzma.c + create mode 100644 include/linux/lzma.h + create mode 100644 include/linux/lzma/LzFind.h + create mode 100644 include/linux/lzma/LzHash.h + create mode 100644 include/linux/lzma/LzmaDec.h + create mode 100644 include/linux/lzma/LzmaEnc.h + create mode 100644 include/linux/lzma/Types.h + create mode 100644 lib/lzma/LzFind.c + create mode 100644 lib/lzma/LzmaDec.c + create mode 100644 lib/lzma/LzmaEnc.c + create mode 100644 lib/lzma/Makefile + +--- a/fs/jffs2/Kconfig ++++ b/fs/jffs2/Kconfig +@@ -136,6 +136,15 @@ config JFFS2_LZO + This feature was added in July, 2007. Say 'N' if you need + compatibility with older bootloaders or kernels. + ++config JFFS2_LZMA ++ bool "JFFS2 LZMA compression support" if JFFS2_COMPRESSION_OPTIONS ++ select LZMA_COMPRESS ++ select LZMA_DECOMPRESS ++ depends on JFFS2_FS ++ default n ++ help ++ JFFS2 wrapper to the LZMA C SDK ++ + config JFFS2_RTIME + bool "JFFS2 RTIME compression support" if JFFS2_COMPRESSION_OPTIONS + depends on JFFS2_FS +--- a/fs/jffs2/Makefile ++++ b/fs/jffs2/Makefile +@@ -19,4 +19,7 @@ jffs2-$(CONFIG_JFFS2_RUBIN) += compr_rub + jffs2-$(CONFIG_JFFS2_RTIME) += compr_rtime.o + jffs2-$(CONFIG_JFFS2_ZLIB) += compr_zlib.o + jffs2-$(CONFIG_JFFS2_LZO) += compr_lzo.o ++jffs2-$(CONFIG_JFFS2_LZMA) += compr_lzma.o + jffs2-$(CONFIG_JFFS2_SUMMARY) += summary.o ++ ++CFLAGS_compr_lzma.o += -Iinclude/linux -Ilib/lzma +--- a/fs/jffs2/compr.c ++++ b/fs/jffs2/compr.c +@@ -378,6 +378,9 @@ int __init jffs2_compressors_init(void) + #ifdef CONFIG_JFFS2_LZO + jffs2_lzo_init(); + #endif ++#ifdef CONFIG_JFFS2_LZMA ++ jffs2_lzma_init(); ++#endif + /* Setting default compression mode */ + #ifdef CONFIG_JFFS2_CMODE_NONE + jffs2_compression_mode = JFFS2_COMPR_MODE_NONE; +@@ -401,6 +404,9 @@ int __init jffs2_compressors_init(void) + int jffs2_compressors_exit(void) + { + /* Unregistering compressors */ ++#ifdef CONFIG_JFFS2_LZMA ++ jffs2_lzma_exit(); ++#endif + #ifdef CONFIG_JFFS2_LZO + jffs2_lzo_exit(); + #endif +--- a/fs/jffs2/compr.h ++++ b/fs/jffs2/compr.h +@@ -29,9 +29,9 @@ + #define JFFS2_DYNRUBIN_PRIORITY 20 + #define JFFS2_LZARI_PRIORITY 30 + #define JFFS2_RTIME_PRIORITY 50 +-#define JFFS2_ZLIB_PRIORITY 60 +-#define JFFS2_LZO_PRIORITY 80 +- ++#define JFFS2_LZMA_PRIORITY 70 ++#define JFFS2_ZLIB_PRIORITY 80 ++#define JFFS2_LZO_PRIORITY 90 + + #define JFFS2_RUBINMIPS_DISABLED /* RUBINs will be used only */ + #define JFFS2_DYNRUBIN_DISABLED /* for decompression */ +@@ -101,5 +101,9 @@ void jffs2_zlib_exit(void); + int jffs2_lzo_init(void); + void jffs2_lzo_exit(void); + #endif ++#ifdef CONFIG_JFFS2_LZMA ++int jffs2_lzma_init(void); ++void jffs2_lzma_exit(void); ++#endif + + #endif /* __JFFS2_COMPR_H__ */ +--- /dev/null ++++ b/fs/jffs2/compr_lzma.c +@@ -0,0 +1,128 @@ ++/* ++ * JFFS2 -- Journalling Flash File System, Version 2. ++ * ++ * For licensing information, see the file 'LICENCE' in this directory. ++ * ++ * JFFS2 wrapper to the LZMA C SDK ++ * ++ */ ++ ++#include ++#include "compr.h" ++ ++#ifdef __KERNEL__ ++ static DEFINE_MUTEX(deflate_mutex); ++#endif ++ ++CLzmaEncHandle *p; ++Byte propsEncoded[LZMA_PROPS_SIZE]; ++SizeT propsSize = sizeof(propsEncoded); ++ ++STATIC void lzma_free_workspace(void) ++{ ++ LzmaEnc_Destroy(p, &lzma_alloc, &lzma_alloc); ++} ++ ++STATIC int INIT lzma_alloc_workspace(CLzmaEncProps *props) ++{ ++ if ((p = (CLzmaEncHandle *)LzmaEnc_Create(&lzma_alloc)) == NULL) ++ { ++ PRINT_ERROR("Failed to allocate lzma deflate workspace\n"); ++ return -ENOMEM; ++ } ++ ++ if (LzmaEnc_SetProps(p, props) != SZ_OK) ++ { ++ lzma_free_workspace(); ++ return -1; ++ } ++ ++ if (LzmaEnc_WriteProperties(p, propsEncoded, &propsSize) != SZ_OK) ++ { ++ lzma_free_workspace(); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++STATIC int jffs2_lzma_compress(unsigned char *data_in, unsigned char *cpage_out, ++ uint32_t *sourcelen, uint32_t *dstlen) ++{ ++ SizeT compress_size = (SizeT)(*dstlen); ++ int ret; ++ ++ #ifdef __KERNEL__ ++ mutex_lock(&deflate_mutex); ++ #endif ++ ++ ret = LzmaEnc_MemEncode(p, cpage_out, &compress_size, data_in, *sourcelen, ++ 0, NULL, &lzma_alloc, &lzma_alloc); ++ ++ #ifdef __KERNEL__ ++ mutex_unlock(&deflate_mutex); ++ #endif ++ ++ if (ret != SZ_OK) ++ return -1; ++ ++ *dstlen = (uint32_t)compress_size; ++ ++ return 0; ++} ++ ++STATIC int jffs2_lzma_decompress(unsigned char *data_in, unsigned char *cpage_out, ++ uint32_t srclen, uint32_t destlen) ++{ ++ int ret; ++ SizeT dl = (SizeT)destlen; ++ SizeT sl = (SizeT)srclen; ++ ELzmaStatus status; ++ ++ ret = LzmaDecode(cpage_out, &dl, data_in, &sl, propsEncoded, ++ propsSize, LZMA_FINISH_ANY, &status, &lzma_alloc); ++ ++ if (ret != SZ_OK || status == LZMA_STATUS_NOT_FINISHED || dl != (SizeT)destlen) ++ return -1; ++ ++ return 0; ++} ++ ++static struct jffs2_compressor jffs2_lzma_comp = { ++ .priority = JFFS2_LZMA_PRIORITY, ++ .name = "lzma", ++ .compr = JFFS2_COMPR_LZMA, ++ .compress = &jffs2_lzma_compress, ++ .decompress = &jffs2_lzma_decompress, ++ .disabled = 0, ++}; ++ ++int INIT jffs2_lzma_init(void) ++{ ++ int ret; ++ CLzmaEncProps props; ++ LzmaEncProps_Init(&props); ++ ++ props.dictSize = LZMA_BEST_DICT(0x2000); ++ props.level = LZMA_BEST_LEVEL; ++ props.lc = LZMA_BEST_LC; ++ props.lp = LZMA_BEST_LP; ++ props.pb = LZMA_BEST_PB; ++ props.fb = LZMA_BEST_FB; ++ ++ ret = lzma_alloc_workspace(&props); ++ if (ret < 0) ++ return ret; ++ ++ ret = jffs2_register_compressor(&jffs2_lzma_comp); ++ if (ret) ++ lzma_free_workspace(); ++ ++ return ret; ++} ++ ++void jffs2_lzma_exit(void) ++{ ++ jffs2_unregister_compressor(&jffs2_lzma_comp); ++ lzma_free_workspace(); ++} +--- a/fs/jffs2/super.c ++++ b/fs/jffs2/super.c +@@ -374,14 +374,41 @@ static int __init init_jffs2_fs(void) + BUILD_BUG_ON(sizeof(struct jffs2_raw_inode) != 68); + BUILD_BUG_ON(sizeof(struct jffs2_raw_summary) != 32); + +- pr_info("version 2.2." ++ pr_info("version 2.2" + #ifdef CONFIG_JFFS2_FS_WRITEBUFFER + " (NAND)" + #endif + #ifdef CONFIG_JFFS2_SUMMARY +- " (SUMMARY) " ++ " (SUMMARY)" + #endif +- " © 2001-2006 Red Hat, Inc.\n"); ++#ifdef CONFIG_JFFS2_ZLIB ++ " (ZLIB)" ++#endif ++#ifdef CONFIG_JFFS2_LZO ++ " (LZO)" ++#endif ++#ifdef CONFIG_JFFS2_LZMA ++ " (LZMA)" ++#endif ++#ifdef CONFIG_JFFS2_RTIME ++ " (RTIME)" ++#endif ++#ifdef CONFIG_JFFS2_RUBIN ++ " (RUBIN)" ++#endif ++#ifdef CONFIG_JFFS2_CMODE_NONE ++ " (CMODE_NONE)" ++#endif ++#ifdef CONFIG_JFFS2_CMODE_PRIORITY ++ " (CMODE_PRIORITY)" ++#endif ++#ifdef CONFIG_JFFS2_CMODE_SIZE ++ " (CMODE_SIZE)" ++#endif ++#ifdef CONFIG_JFFS2_CMODE_FAVOURLZO ++ " (CMODE_FAVOURLZO)" ++#endif ++ " (c) 2001-2006 Red Hat, Inc.\n"); + + jffs2_inode_cachep = kmem_cache_create("jffs2_i", + sizeof(struct jffs2_inode_info), +--- /dev/null ++++ b/include/linux/lzma.h +@@ -0,0 +1,62 @@ ++#ifndef __LZMA_H__ ++#define __LZMA_H__ ++ ++#ifdef __KERNEL__ ++ #include ++ #include ++ #include ++ #include ++ #include ++ #define LZMA_MALLOC vmalloc ++ #define LZMA_FREE vfree ++ #define PRINT_ERROR(msg) printk(KERN_WARNING #msg) ++ #define INIT __init ++ #define STATIC static ++#else ++ #include ++ #include ++ #include ++ #include ++ #include ++ #include ++ #include ++ #include ++ #ifndef PAGE_SIZE ++ extern int page_size; ++ #define PAGE_SIZE page_size ++ #endif ++ #define LZMA_MALLOC malloc ++ #define LZMA_FREE free ++ #define PRINT_ERROR(msg) fprintf(stderr, msg) ++ #define INIT ++ #define STATIC ++#endif ++ ++#include "lzma/LzmaDec.h" ++#include "lzma/LzmaEnc.h" ++ ++#define LZMA_BEST_LEVEL (9) ++#define LZMA_BEST_LC (0) ++#define LZMA_BEST_LP (0) ++#define LZMA_BEST_PB (0) ++#define LZMA_BEST_FB (273) ++ ++#define LZMA_BEST_DICT(n) (((int)((n) / 2)) * 2) ++ ++static void *p_lzma_malloc(void *p, size_t size) ++{ ++ if (size == 0) ++ return NULL; ++ ++ return LZMA_MALLOC(size); ++} ++ ++static void p_lzma_free(void *p, void *address) ++{ ++ if (address != NULL) ++ LZMA_FREE(address); ++} ++ ++static ISzAlloc lzma_alloc = { .Alloc = p_lzma_malloc, .Free = p_lzma_free }; ++ ++#endif +--- /dev/null ++++ b/include/linux/lzma/LzFind.h +@@ -0,0 +1,98 @@ ++/* LzFind.h -- Match finder for LZ algorithms ++2009-04-22 : Igor Pavlov : Public domain */ ++ ++#ifndef __LZ_FIND_H ++#define __LZ_FIND_H ++ ++#include "Types.h" ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++typedef UInt32 CLzRef; ++ ++typedef struct _CMatchFinder ++{ ++ Byte *buffer; ++ UInt32 pos; ++ UInt32 posLimit; ++ UInt32 streamPos; ++ UInt32 lenLimit; ++ ++ UInt32 cyclicBufferPos; ++ UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ ++ ++ UInt32 matchMaxLen; ++ CLzRef *hash; ++ CLzRef *son; ++ UInt32 hashMask; ++ UInt32 cutValue; ++ ++ Byte *bufferBase; ++ ISeqInStream *stream; ++ int streamEndWasReached; ++ ++ UInt32 blockSize; ++ UInt32 keepSizeBefore; ++ UInt32 keepSizeAfter; ++ ++ UInt32 numHashBytes; ++ int directInput; ++ size_t directInputRem; ++ int btMode; ++ int bigHash; ++ UInt32 historySize; ++ UInt32 fixedHashSize; ++ UInt32 hashSizeSum; ++ UInt32 numSons; ++ SRes result; ++ UInt32 crc[256]; ++} CMatchFinder; ++ ++#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) ++#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)]) ++ ++#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) ++ ++void MatchFinder_Construct(CMatchFinder *p); ++ ++/* Conditions: ++ historySize <= 3 GB ++ keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB ++*/ ++int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, ++ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ++ ISzAlloc *alloc); ++void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); ++ ++/* ++Conditions: ++ Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. ++ Mf_GetPointerToCurrentPos_Func's result must be used only before any other function ++*/ ++ ++typedef void (*Mf_Init_Func)(void *object); ++typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index); ++typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); ++typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); ++typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); ++typedef void (*Mf_Skip_Func)(void *object, UInt32); ++ ++typedef struct _IMatchFinder ++{ ++ Mf_Init_Func Init; ++ Mf_GetIndexByte_Func GetIndexByte; ++ Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; ++ Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; ++ Mf_GetMatches_Func GetMatches; ++ Mf_Skip_Func Skip; ++} IMatchFinder; ++ ++void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +--- /dev/null ++++ b/include/linux/lzma/LzHash.h +@@ -0,0 +1,54 @@ ++/* LzHash.h -- HASH functions for LZ algorithms ++2009-02-07 : Igor Pavlov : Public domain */ ++ ++#ifndef __LZ_HASH_H ++#define __LZ_HASH_H ++ ++#define kHash2Size (1 << 10) ++#define kHash3Size (1 << 16) ++#define kHash4Size (1 << 20) ++ ++#define kFix3HashSize (kHash2Size) ++#define kFix4HashSize (kHash2Size + kHash3Size) ++#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) ++ ++#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8); ++ ++#define HASH3_CALC { \ ++ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ ++ hash2Value = temp & (kHash2Size - 1); \ ++ hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } ++ ++#define HASH4_CALC { \ ++ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ ++ hash2Value = temp & (kHash2Size - 1); \ ++ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ ++ hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; } ++ ++#define HASH5_CALC { \ ++ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ ++ hash2Value = temp & (kHash2Size - 1); \ ++ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ ++ hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \ ++ hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \ ++ hash4Value &= (kHash4Size - 1); } ++ ++/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */ ++#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; ++ ++ ++#define MT_HASH2_CALC \ ++ hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); ++ ++#define MT_HASH3_CALC { \ ++ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ ++ hash2Value = temp & (kHash2Size - 1); \ ++ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } ++ ++#define MT_HASH4_CALC { \ ++ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ ++ hash2Value = temp & (kHash2Size - 1); \ ++ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ ++ hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); } ++ ++#endif +--- /dev/null ++++ b/include/linux/lzma/LzmaDec.h +@@ -0,0 +1,130 @@ ++/* LzmaDec.h -- LZMA Decoder ++2009-02-07 : Igor Pavlov : Public domain */ ++ ++#ifndef __LZMA_DEC_H ++#define __LZMA_DEC_H ++ ++#include "Types.h" ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* #define _LZMA_PROB32 */ ++/* _LZMA_PROB32 can increase the speed on some CPUs, ++ but memory usage for CLzmaDec::probs will be doubled in that case */ ++ ++#ifdef _LZMA_PROB32 ++#define CLzmaProb UInt32 ++#else ++#define CLzmaProb UInt16 ++#endif ++ ++ ++/* ---------- LZMA Properties ---------- */ ++ ++#define LZMA_PROPS_SIZE 5 ++ ++typedef struct _CLzmaProps ++{ ++ unsigned lc, lp, pb; ++ UInt32 dicSize; ++} CLzmaProps; ++ ++ ++/* ---------- LZMA Decoder state ---------- */ ++ ++/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. ++ Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ ++ ++#define LZMA_REQUIRED_INPUT_MAX 20 ++ ++typedef struct ++{ ++ CLzmaProps prop; ++ CLzmaProb *probs; ++ Byte *dic; ++ const Byte *buf; ++ UInt32 range, code; ++ SizeT dicPos; ++ SizeT dicBufSize; ++ UInt32 processedPos; ++ UInt32 checkDicSize; ++ unsigned state; ++ UInt32 reps[4]; ++ unsigned remainLen; ++ int needFlush; ++ int needInitState; ++ UInt32 numProbs; ++ unsigned tempBufSize; ++ Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; ++} CLzmaDec; ++ ++#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } ++ ++/* There are two types of LZMA streams: ++ 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. ++ 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ ++ ++typedef enum ++{ ++ LZMA_FINISH_ANY, /* finish at any point */ ++ LZMA_FINISH_END /* block must be finished at the end */ ++} ELzmaFinishMode; ++ ++/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! ++ ++ You must use LZMA_FINISH_END, when you know that current output buffer ++ covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. ++ ++ If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, ++ and output value of destLen will be less than output buffer size limit. ++ You can check status result also. ++ ++ You can use multiple checks to test data integrity after full decompression: ++ 1) Check Result and "status" variable. ++ 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. ++ 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. ++ You must use correct finish mode in that case. */ ++ ++typedef enum ++{ ++ LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ ++ LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ ++ LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ ++ LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ ++ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ ++} ELzmaStatus; ++ ++/* ELzmaStatus is used only as output value for function call */ ++ ++/* ---------- One Call Interface ---------- */ ++ ++/* LzmaDecode ++ ++finishMode: ++ It has meaning only if the decoding reaches output limit (*destLen). ++ LZMA_FINISH_ANY - Decode just destLen bytes. ++ LZMA_FINISH_END - Stream must be finished after (*destLen). ++ ++Returns: ++ SZ_OK ++ status: ++ LZMA_STATUS_FINISHED_WITH_MARK ++ LZMA_STATUS_NOT_FINISHED ++ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK ++ SZ_ERROR_DATA - Data error ++ SZ_ERROR_MEM - Memory allocation error ++ SZ_ERROR_UNSUPPORTED - Unsupported properties ++ SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). ++*/ ++ ++SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ++ const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, ++ ELzmaStatus *status, ISzAlloc *alloc); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +--- /dev/null ++++ b/include/linux/lzma/LzmaEnc.h +@@ -0,0 +1,60 @@ ++/* LzmaEnc.h -- LZMA Encoder ++2009-02-07 : Igor Pavlov : Public domain */ ++ ++#ifndef __LZMA_ENC_H ++#define __LZMA_ENC_H ++ ++#include "Types.h" ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#define LZMA_PROPS_SIZE 5 ++ ++typedef struct _CLzmaEncProps ++{ ++ int level; /* 0 <= level <= 9 */ ++ UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version ++ (1 << 12) <= dictSize <= (1 << 30) for 64-bit version ++ default = (1 << 24) */ ++ int lc; /* 0 <= lc <= 8, default = 3 */ ++ int lp; /* 0 <= lp <= 4, default = 0 */ ++ int pb; /* 0 <= pb <= 4, default = 2 */ ++ int algo; /* 0 - fast, 1 - normal, default = 1 */ ++ int fb; /* 5 <= fb <= 273, default = 32 */ ++ int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ ++ int numHashBytes; /* 2, 3 or 4, default = 4 */ ++ UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ ++ unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ ++ int numThreads; /* 1 or 2, default = 2 */ ++} CLzmaEncProps; ++ ++void LzmaEncProps_Init(CLzmaEncProps *p); ++ ++/* ---------- CLzmaEncHandle Interface ---------- */ ++ ++/* LzmaEnc_* functions can return the following exit codes: ++Returns: ++ SZ_OK - OK ++ SZ_ERROR_MEM - Memory allocation error ++ SZ_ERROR_PARAM - Incorrect paramater in props ++ SZ_ERROR_WRITE - Write callback error. ++ SZ_ERROR_PROGRESS - some break from progress callback ++ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) ++*/ ++ ++typedef void * CLzmaEncHandle; ++ ++CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc); ++void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig); ++SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); ++SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); ++SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, ++ int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +--- /dev/null ++++ b/include/linux/lzma/Types.h +@@ -0,0 +1,226 @@ ++/* Types.h -- Basic types ++2009-11-23 : Igor Pavlov : Public domain */ ++ ++#ifndef __7Z_TYPES_H ++#define __7Z_TYPES_H ++ ++#include ++ ++#ifdef _WIN32 ++#include ++#endif ++ ++#ifndef EXTERN_C_BEGIN ++#ifdef __cplusplus ++#define EXTERN_C_BEGIN extern "C" { ++#define EXTERN_C_END } ++#else ++#define EXTERN_C_BEGIN ++#define EXTERN_C_END ++#endif ++#endif ++ ++EXTERN_C_BEGIN ++ ++#define SZ_OK 0 ++ ++#define SZ_ERROR_DATA 1 ++#define SZ_ERROR_MEM 2 ++#define SZ_ERROR_CRC 3 ++#define SZ_ERROR_UNSUPPORTED 4 ++#define SZ_ERROR_PARAM 5 ++#define SZ_ERROR_INPUT_EOF 6 ++#define SZ_ERROR_OUTPUT_EOF 7 ++#define SZ_ERROR_READ 8 ++#define SZ_ERROR_WRITE 9 ++#define SZ_ERROR_PROGRESS 10 ++#define SZ_ERROR_FAIL 11 ++#define SZ_ERROR_THREAD 12 ++ ++#define SZ_ERROR_ARCHIVE 16 ++#define SZ_ERROR_NO_ARCHIVE 17 ++ ++typedef int SRes; ++ ++#ifdef _WIN32 ++typedef DWORD WRes; ++#else ++typedef int WRes; ++#endif ++ ++#ifndef RINOK ++#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } ++#endif ++ ++typedef unsigned char Byte; ++typedef short Int16; ++typedef unsigned short UInt16; ++ ++#ifdef _LZMA_UINT32_IS_ULONG ++typedef long Int32; ++typedef unsigned long UInt32; ++#else ++typedef int Int32; ++typedef unsigned int UInt32; ++#endif ++ ++#ifdef _SZ_NO_INT_64 ++ ++/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. ++ NOTES: Some code will work incorrectly in that case! */ ++ ++typedef long Int64; ++typedef unsigned long UInt64; ++ ++#else ++ ++#if defined(_MSC_VER) || defined(__BORLANDC__) ++typedef __int64 Int64; ++typedef unsigned __int64 UInt64; ++#else ++typedef long long int Int64; ++typedef unsigned long long int UInt64; ++#endif ++ ++#endif ++ ++#ifdef _LZMA_NO_SYSTEM_SIZE_T ++typedef UInt32 SizeT; ++#else ++typedef size_t SizeT; ++#endif ++ ++typedef int Bool; ++#define True 1 ++#define False 0 ++ ++ ++#ifdef _WIN32 ++#define MY_STD_CALL __stdcall ++#else ++#define MY_STD_CALL ++#endif ++ ++#ifdef _MSC_VER ++ ++#if _MSC_VER >= 1300 ++#define MY_NO_INLINE __declspec(noinline) ++#else ++#define MY_NO_INLINE ++#endif ++ ++#define MY_CDECL __cdecl ++#define MY_FAST_CALL __fastcall ++ ++#else ++ ++#define MY_CDECL ++#define MY_FAST_CALL ++ ++#endif ++ ++ ++/* The following interfaces use first parameter as pointer to structure */ ++ ++typedef struct ++{ ++ SRes (*Read)(void *p, void *buf, size_t *size); ++ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. ++ (output(*size) < input(*size)) is allowed */ ++} ISeqInStream; ++ ++/* it can return SZ_ERROR_INPUT_EOF */ ++SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); ++SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); ++SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); ++ ++typedef struct ++{ ++ size_t (*Write)(void *p, const void *buf, size_t size); ++ /* Returns: result - the number of actually written bytes. ++ (result < size) means error */ ++} ISeqOutStream; ++ ++typedef enum ++{ ++ SZ_SEEK_SET = 0, ++ SZ_SEEK_CUR = 1, ++ SZ_SEEK_END = 2 ++} ESzSeek; ++ ++typedef struct ++{ ++ SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ ++ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); ++} ISeekInStream; ++ ++typedef struct ++{ ++ SRes (*Look)(void *p, void **buf, size_t *size); ++ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. ++ (output(*size) > input(*size)) is not allowed ++ (output(*size) < input(*size)) is allowed */ ++ SRes (*Skip)(void *p, size_t offset); ++ /* offset must be <= output(*size) of Look */ ++ ++ SRes (*Read)(void *p, void *buf, size_t *size); ++ /* reads directly (without buffer). It's same as ISeqInStream::Read */ ++ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); ++} ILookInStream; ++ ++SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); ++SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); ++ ++/* reads via ILookInStream::Read */ ++SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); ++SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); ++ ++#define LookToRead_BUF_SIZE (1 << 14) ++ ++typedef struct ++{ ++ ILookInStream s; ++ ISeekInStream *realStream; ++ size_t pos; ++ size_t size; ++ Byte buf[LookToRead_BUF_SIZE]; ++} CLookToRead; ++ ++void LookToRead_CreateVTable(CLookToRead *p, int lookahead); ++void LookToRead_Init(CLookToRead *p); ++ ++typedef struct ++{ ++ ISeqInStream s; ++ ILookInStream *realStream; ++} CSecToLook; ++ ++void SecToLook_CreateVTable(CSecToLook *p); ++ ++typedef struct ++{ ++ ISeqInStream s; ++ ILookInStream *realStream; ++} CSecToRead; ++ ++void SecToRead_CreateVTable(CSecToRead *p); ++ ++typedef struct ++{ ++ SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); ++ /* Returns: result. (result != SZ_OK) means break. ++ Value (UInt64)(Int64)-1 for size means unknown value. */ ++} ICompressProgress; ++ ++typedef struct ++{ ++ void *(*Alloc)(void *p, size_t size); ++ void (*Free)(void *p, void *address); /* address can be 0 */ ++} ISzAlloc; ++ ++#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) ++#define IAlloc_Free(p, a) (p)->Free((p), a) ++ ++EXTERN_C_END ++ ++#endif +--- a/include/uapi/linux/jffs2.h ++++ b/include/uapi/linux/jffs2.h +@@ -46,6 +46,7 @@ + #define JFFS2_COMPR_DYNRUBIN 0x05 + #define JFFS2_COMPR_ZLIB 0x06 + #define JFFS2_COMPR_LZO 0x07 ++#define JFFS2_COMPR_LZMA 0x08 + /* Compatibility flags. */ + #define JFFS2_COMPAT_MASK 0xc000 /* What do to if an unknown nodetype is found */ + #define JFFS2_NODE_ACCURATE 0x2000 +--- a/lib/Kconfig ++++ b/lib/Kconfig +@@ -340,6 +340,12 @@ config ZSTD_DECOMPRESS + + source "lib/xz/Kconfig" + ++config LZMA_COMPRESS ++ tristate ++ ++config LZMA_DECOMPRESS ++ tristate ++ + # + # These all provide a common interface (hence the apparent duplication with + # ZLIB_INFLATE; DECOMPRESS_GZIP is just a wrapper.) +--- a/lib/Makefile ++++ b/lib/Makefile +@@ -135,6 +135,16 @@ CFLAGS_kobject.o += -DDEBUG + CFLAGS_kobject_uevent.o += -DDEBUG + endif + ++ifdef CONFIG_JFFS2_ZLIB ++ CONFIG_ZLIB_INFLATE:=y ++ CONFIG_ZLIB_DEFLATE:=y ++endif ++ ++ifdef CONFIG_JFFS2_LZMA ++ CONFIG_LZMA_DECOMPRESS:=y ++ CONFIG_LZMA_COMPRESS:=y ++endif ++ + obj-$(CONFIG_DEBUG_INFO_REDUCED) += debug_info.o + CFLAGS_debug_info.o += $(call cc-option, -femit-struct-debug-detailed=any) + +@@ -192,6 +202,8 @@ obj-$(CONFIG_ZSTD_COMPRESS) += zstd/ + obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd/ + obj-$(CONFIG_XZ_DEC) += xz/ + obj-$(CONFIG_RAID6_PQ) += raid6/ ++obj-$(CONFIG_LZMA_COMPRESS) += lzma/ ++obj-$(CONFIG_LZMA_DECOMPRESS) += lzma/ + + lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o + lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o +--- /dev/null ++++ b/lib/lzma/LzFind.c +@@ -0,0 +1,522 @@ ++/* LzFind.c -- Match finder for LZ algorithms ++2009-04-22 : Igor Pavlov : Public domain */ ++ ++#include ++ ++#include "LzFind.h" ++#include "LzHash.h" ++ ++#define kEmptyHashValue 0 ++#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) ++#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */ ++#define kNormalizeMask (~(kNormalizeStepMin - 1)) ++#define kMaxHistorySize ((UInt32)3 << 30) ++ ++#define kStartMaxLen 3 ++ ++#if 0 ++#define DIRECT_INPUT p->directInput ++#else ++#define DIRECT_INPUT 1 ++#endif ++ ++static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) ++{ ++ if (!DIRECT_INPUT) ++ { ++ alloc->Free(alloc, p->bufferBase); ++ p->bufferBase = 0; ++ } ++} ++ ++/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ ++ ++static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) ++{ ++ UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; ++ if (DIRECT_INPUT) ++ { ++ p->blockSize = blockSize; ++ return 1; ++ } ++ if (p->bufferBase == 0 || p->blockSize != blockSize) ++ { ++ LzInWindow_Free(p, alloc); ++ p->blockSize = blockSize; ++ p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize); ++ } ++ return (p->bufferBase != 0); ++} ++ ++static Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } ++static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; } ++ ++static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } ++ ++static void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) ++{ ++ p->posLimit -= subValue; ++ p->pos -= subValue; ++ p->streamPos -= subValue; ++} ++ ++static void MatchFinder_ReadBlock(CMatchFinder *p) ++{ ++ if (p->streamEndWasReached || p->result != SZ_OK) ++ return; ++ if (DIRECT_INPUT) ++ { ++ UInt32 curSize = 0xFFFFFFFF - p->streamPos; ++ if (curSize > p->directInputRem) ++ curSize = (UInt32)p->directInputRem; ++ p->directInputRem -= curSize; ++ p->streamPos += curSize; ++ if (p->directInputRem == 0) ++ p->streamEndWasReached = 1; ++ return; ++ } ++ for (;;) ++ { ++ Byte *dest = p->buffer + (p->streamPos - p->pos); ++ size_t size = (p->bufferBase + p->blockSize - dest); ++ if (size == 0) ++ return; ++ p->result = p->stream->Read(p->stream, dest, &size); ++ if (p->result != SZ_OK) ++ return; ++ if (size == 0) ++ { ++ p->streamEndWasReached = 1; ++ return; ++ } ++ p->streamPos += (UInt32)size; ++ if (p->streamPos - p->pos > p->keepSizeAfter) ++ return; ++ } ++} ++ ++static void MatchFinder_MoveBlock(CMatchFinder *p) ++{ ++ memmove(p->bufferBase, ++ p->buffer - p->keepSizeBefore, ++ (size_t)(p->streamPos - p->pos + p->keepSizeBefore)); ++ p->buffer = p->bufferBase + p->keepSizeBefore; ++} ++ ++static int MatchFinder_NeedMove(CMatchFinder *p) ++{ ++ if (DIRECT_INPUT) ++ return 0; ++ /* if (p->streamEndWasReached) return 0; */ ++ return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); ++} ++ ++static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) ++{ ++ if (MatchFinder_NeedMove(p)) ++ MatchFinder_MoveBlock(p); ++ MatchFinder_ReadBlock(p); ++} ++ ++static void MatchFinder_SetDefaultSettings(CMatchFinder *p) ++{ ++ p->cutValue = 32; ++ p->btMode = 1; ++ p->numHashBytes = 4; ++ p->bigHash = 0; ++} ++ ++#define kCrcPoly 0xEDB88320 ++ ++void MatchFinder_Construct(CMatchFinder *p) ++{ ++ UInt32 i; ++ p->bufferBase = 0; ++ p->directInput = 0; ++ p->hash = 0; ++ MatchFinder_SetDefaultSettings(p); ++ ++ for (i = 0; i < 256; i++) ++ { ++ UInt32 r = i; ++ int j; ++ for (j = 0; j < 8; j++) ++ r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); ++ p->crc[i] = r; ++ } ++} ++ ++static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc) ++{ ++ alloc->Free(alloc, p->hash); ++ p->hash = 0; ++} ++ ++void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc) ++{ ++ MatchFinder_FreeThisClassMemory(p, alloc); ++ LzInWindow_Free(p, alloc); ++} ++ ++static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc) ++{ ++ size_t sizeInBytes = (size_t)num * sizeof(CLzRef); ++ if (sizeInBytes / sizeof(CLzRef) != num) ++ return 0; ++ return (CLzRef *)alloc->Alloc(alloc, sizeInBytes); ++} ++ ++int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, ++ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ++ ISzAlloc *alloc) ++{ ++ UInt32 sizeReserv; ++ if (historySize > kMaxHistorySize) ++ { ++ MatchFinder_Free(p, alloc); ++ return 0; ++ } ++ sizeReserv = historySize >> 1; ++ if (historySize > ((UInt32)2 << 30)) ++ sizeReserv = historySize >> 2; ++ sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); ++ ++ p->keepSizeBefore = historySize + keepAddBufferBefore + 1; ++ p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; ++ /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ ++ if (LzInWindow_Create(p, sizeReserv, alloc)) ++ { ++ UInt32 newCyclicBufferSize = historySize + 1; ++ UInt32 hs; ++ p->matchMaxLen = matchMaxLen; ++ { ++ p->fixedHashSize = 0; ++ if (p->numHashBytes == 2) ++ hs = (1 << 16) - 1; ++ else ++ { ++ hs = historySize - 1; ++ hs |= (hs >> 1); ++ hs |= (hs >> 2); ++ hs |= (hs >> 4); ++ hs |= (hs >> 8); ++ hs >>= 1; ++ hs |= 0xFFFF; /* don't change it! It's required for Deflate */ ++ if (hs > (1 << 24)) ++ { ++ if (p->numHashBytes == 3) ++ hs = (1 << 24) - 1; ++ else ++ hs >>= 1; ++ } ++ } ++ p->hashMask = hs; ++ hs++; ++ if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; ++ if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; ++ if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size; ++ hs += p->fixedHashSize; ++ } ++ ++ { ++ UInt32 prevSize = p->hashSizeSum + p->numSons; ++ UInt32 newSize; ++ p->historySize = historySize; ++ p->hashSizeSum = hs; ++ p->cyclicBufferSize = newCyclicBufferSize; ++ p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize); ++ newSize = p->hashSizeSum + p->numSons; ++ if (p->hash != 0 && prevSize == newSize) ++ return 1; ++ MatchFinder_FreeThisClassMemory(p, alloc); ++ p->hash = AllocRefs(newSize, alloc); ++ if (p->hash != 0) ++ { ++ p->son = p->hash + p->hashSizeSum; ++ return 1; ++ } ++ } ++ } ++ MatchFinder_Free(p, alloc); ++ return 0; ++} ++ ++static void MatchFinder_SetLimits(CMatchFinder *p) ++{ ++ UInt32 limit = kMaxValForNormalize - p->pos; ++ UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; ++ if (limit2 < limit) ++ limit = limit2; ++ limit2 = p->streamPos - p->pos; ++ if (limit2 <= p->keepSizeAfter) ++ { ++ if (limit2 > 0) ++ limit2 = 1; ++ } ++ else ++ limit2 -= p->keepSizeAfter; ++ if (limit2 < limit) ++ limit = limit2; ++ { ++ UInt32 lenLimit = p->streamPos - p->pos; ++ if (lenLimit > p->matchMaxLen) ++ lenLimit = p->matchMaxLen; ++ p->lenLimit = lenLimit; ++ } ++ p->posLimit = p->pos + limit; ++} ++ ++static void MatchFinder_Init(CMatchFinder *p) ++{ ++ UInt32 i; ++ for (i = 0; i < p->hashSizeSum; i++) ++ p->hash[i] = kEmptyHashValue; ++ p->cyclicBufferPos = 0; ++ p->buffer = p->bufferBase; ++ p->pos = p->streamPos = p->cyclicBufferSize; ++ p->result = SZ_OK; ++ p->streamEndWasReached = 0; ++ MatchFinder_ReadBlock(p); ++ MatchFinder_SetLimits(p); ++} ++ ++static UInt32 MatchFinder_GetSubValue(CMatchFinder *p) ++{ ++ return (p->pos - p->historySize - 1) & kNormalizeMask; ++} ++ ++static void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems) ++{ ++ UInt32 i; ++ for (i = 0; i < numItems; i++) ++ { ++ UInt32 value = items[i]; ++ if (value <= subValue) ++ value = kEmptyHashValue; ++ else ++ value -= subValue; ++ items[i] = value; ++ } ++} ++ ++static void MatchFinder_Normalize(CMatchFinder *p) ++{ ++ UInt32 subValue = MatchFinder_GetSubValue(p); ++ MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons); ++ MatchFinder_ReduceOffsets(p, subValue); ++} ++ ++static void MatchFinder_CheckLimits(CMatchFinder *p) ++{ ++ if (p->pos == kMaxValForNormalize) ++ MatchFinder_Normalize(p); ++ if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos) ++ MatchFinder_CheckAndMoveAndRead(p); ++ if (p->cyclicBufferPos == p->cyclicBufferSize) ++ p->cyclicBufferPos = 0; ++ MatchFinder_SetLimits(p); ++} ++ ++static UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, ++ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, ++ UInt32 *distances, UInt32 maxLen) ++{ ++ CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; ++ CLzRef *ptr1 = son + (_cyclicBufferPos << 1); ++ UInt32 len0 = 0, len1 = 0; ++ for (;;) ++ { ++ UInt32 delta = pos - curMatch; ++ if (cutValue-- == 0 || delta >= _cyclicBufferSize) ++ { ++ *ptr0 = *ptr1 = kEmptyHashValue; ++ return distances; ++ } ++ { ++ CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); ++ const Byte *pb = cur - delta; ++ UInt32 len = (len0 < len1 ? len0 : len1); ++ if (pb[len] == cur[len]) ++ { ++ if (++len != lenLimit && pb[len] == cur[len]) ++ while (++len != lenLimit) ++ if (pb[len] != cur[len]) ++ break; ++ if (maxLen < len) ++ { ++ *distances++ = maxLen = len; ++ *distances++ = delta - 1; ++ if (len == lenLimit) ++ { ++ *ptr1 = pair[0]; ++ *ptr0 = pair[1]; ++ return distances; ++ } ++ } ++ } ++ if (pb[len] < cur[len]) ++ { ++ *ptr1 = curMatch; ++ ptr1 = pair + 1; ++ curMatch = *ptr1; ++ len1 = len; ++ } ++ else ++ { ++ *ptr0 = curMatch; ++ ptr0 = pair; ++ curMatch = *ptr0; ++ len0 = len; ++ } ++ } ++ } ++} ++ ++static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, ++ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) ++{ ++ CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; ++ CLzRef *ptr1 = son + (_cyclicBufferPos << 1); ++ UInt32 len0 = 0, len1 = 0; ++ for (;;) ++ { ++ UInt32 delta = pos - curMatch; ++ if (cutValue-- == 0 || delta >= _cyclicBufferSize) ++ { ++ *ptr0 = *ptr1 = kEmptyHashValue; ++ return; ++ } ++ { ++ CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); ++ const Byte *pb = cur - delta; ++ UInt32 len = (len0 < len1 ? len0 : len1); ++ if (pb[len] == cur[len]) ++ { ++ while (++len != lenLimit) ++ if (pb[len] != cur[len]) ++ break; ++ { ++ if (len == lenLimit) ++ { ++ *ptr1 = pair[0]; ++ *ptr0 = pair[1]; ++ return; ++ } ++ } ++ } ++ if (pb[len] < cur[len]) ++ { ++ *ptr1 = curMatch; ++ ptr1 = pair + 1; ++ curMatch = *ptr1; ++ len1 = len; ++ } ++ else ++ { ++ *ptr0 = curMatch; ++ ptr0 = pair; ++ curMatch = *ptr0; ++ len0 = len; ++ } ++ } ++ } ++} ++ ++#define MOVE_POS \ ++ ++p->cyclicBufferPos; \ ++ p->buffer++; \ ++ if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); ++ ++static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } ++ ++#define MOVE_POS_RET MatchFinder_MovePos(p); return offset; ++ ++#define GET_MATCHES_HEADER2(minLen, ret_op) \ ++ UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \ ++ lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ ++ cur = p->buffer; ++ ++#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) ++#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) ++ ++#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue ++ ++#define GET_MATCHES_FOOTER(offset, maxLen) \ ++ offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \ ++ distances + offset, maxLen) - distances); MOVE_POS_RET; ++ ++#define SKIP_FOOTER \ ++ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MatchFinder_MovePos(p); ++ ++static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) ++{ ++ UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; ++ GET_MATCHES_HEADER(4) ++ ++ HASH4_CALC; ++ ++ delta2 = p->pos - p->hash[ hash2Value]; ++ delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; ++ curMatch = p->hash[kFix4HashSize + hashValue]; ++ ++ p->hash[ hash2Value] = ++ p->hash[kFix3HashSize + hash3Value] = ++ p->hash[kFix4HashSize + hashValue] = p->pos; ++ ++ maxLen = 1; ++ offset = 0; ++ if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) ++ { ++ distances[0] = maxLen = 2; ++ distances[1] = delta2 - 1; ++ offset = 2; ++ } ++ if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) ++ { ++ maxLen = 3; ++ distances[offset + 1] = delta3 - 1; ++ offset += 2; ++ delta2 = delta3; ++ } ++ if (offset != 0) ++ { ++ for (; maxLen != lenLimit; maxLen++) ++ if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) ++ break; ++ distances[offset - 2] = maxLen; ++ if (maxLen == lenLimit) ++ { ++ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); ++ MOVE_POS_RET; ++ } ++ } ++ if (maxLen < 3) ++ maxLen = 3; ++ GET_MATCHES_FOOTER(offset, maxLen) ++} ++ ++static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) ++{ ++ do ++ { ++ UInt32 hash2Value, hash3Value; ++ SKIP_HEADER(4) ++ HASH4_CALC; ++ curMatch = p->hash[kFix4HashSize + hashValue]; ++ p->hash[ hash2Value] = ++ p->hash[kFix3HashSize + hash3Value] = p->pos; ++ p->hash[kFix4HashSize + hashValue] = p->pos; ++ SKIP_FOOTER ++ } ++ while (--num != 0); ++} ++ ++void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) ++{ ++ vTable->Init = (Mf_Init_Func)MatchFinder_Init; ++ vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte; ++ vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; ++ vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; ++ vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; ++ vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; ++} +--- /dev/null ++++ b/lib/lzma/LzmaDec.c +@@ -0,0 +1,925 @@ ++/* LzmaDec.c -- LZMA Decoder ++2009-09-20 : Igor Pavlov : Public domain */ ++ ++#include "LzmaDec.h" ++ ++#include ++ ++#define kNumTopBits 24 ++#define kTopValue ((UInt32)1 << kNumTopBits) ++ ++#define kNumBitModelTotalBits 11 ++#define kBitModelTotal (1 << kNumBitModelTotalBits) ++#define kNumMoveBits 5 ++ ++#define RC_INIT_SIZE 5 ++ ++#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } ++ ++#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) ++#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); ++#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); ++#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ ++ { UPDATE_0(p); i = (i + i); A0; } else \ ++ { UPDATE_1(p); i = (i + i) + 1; A1; } ++#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) ++ ++#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } ++#define TREE_DECODE(probs, limit, i) \ ++ { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } ++ ++/* #define _LZMA_SIZE_OPT */ ++ ++#ifdef _LZMA_SIZE_OPT ++#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) ++#else ++#define TREE_6_DECODE(probs, i) \ ++ { i = 1; \ ++ TREE_GET_BIT(probs, i); \ ++ TREE_GET_BIT(probs, i); \ ++ TREE_GET_BIT(probs, i); \ ++ TREE_GET_BIT(probs, i); \ ++ TREE_GET_BIT(probs, i); \ ++ TREE_GET_BIT(probs, i); \ ++ i -= 0x40; } ++#endif ++ ++#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } ++ ++#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) ++#define UPDATE_0_CHECK range = bound; ++#define UPDATE_1_CHECK range -= bound; code -= bound; ++#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ ++ { UPDATE_0_CHECK; i = (i + i); A0; } else \ ++ { UPDATE_1_CHECK; i = (i + i) + 1; A1; } ++#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) ++#define TREE_DECODE_CHECK(probs, limit, i) \ ++ { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } ++ ++ ++#define kNumPosBitsMax 4 ++#define kNumPosStatesMax (1 << kNumPosBitsMax) ++ ++#define kLenNumLowBits 3 ++#define kLenNumLowSymbols (1 << kLenNumLowBits) ++#define kLenNumMidBits 3 ++#define kLenNumMidSymbols (1 << kLenNumMidBits) ++#define kLenNumHighBits 8 ++#define kLenNumHighSymbols (1 << kLenNumHighBits) ++ ++#define LenChoice 0 ++#define LenChoice2 (LenChoice + 1) ++#define LenLow (LenChoice2 + 1) ++#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) ++#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) ++#define kNumLenProbs (LenHigh + kLenNumHighSymbols) ++ ++ ++#define kNumStates 12 ++#define kNumLitStates 7 ++ ++#define kStartPosModelIndex 4 ++#define kEndPosModelIndex 14 ++#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) ++ ++#define kNumPosSlotBits 6 ++#define kNumLenToPosStates 4 ++ ++#define kNumAlignBits 4 ++#define kAlignTableSize (1 << kNumAlignBits) ++ ++#define kMatchMinLen 2 ++#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) ++ ++#define IsMatch 0 ++#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) ++#define IsRepG0 (IsRep + kNumStates) ++#define IsRepG1 (IsRepG0 + kNumStates) ++#define IsRepG2 (IsRepG1 + kNumStates) ++#define IsRep0Long (IsRepG2 + kNumStates) ++#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) ++#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) ++#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) ++#define LenCoder (Align + kAlignTableSize) ++#define RepLenCoder (LenCoder + kNumLenProbs) ++#define Literal (RepLenCoder + kNumLenProbs) ++ ++#define LZMA_BASE_SIZE 1846 ++#define LZMA_LIT_SIZE 768 ++ ++#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) ++ ++#if Literal != LZMA_BASE_SIZE ++StopCompilingDueBUG ++#endif ++ ++#define LZMA_DIC_MIN (1 << 12) ++ ++/* First LZMA-symbol is always decoded. ++And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization ++Out: ++ Result: ++ SZ_OK - OK ++ SZ_ERROR_DATA - Error ++ p->remainLen: ++ < kMatchSpecLenStart : normal remain ++ = kMatchSpecLenStart : finished ++ = kMatchSpecLenStart + 1 : Flush marker ++ = kMatchSpecLenStart + 2 : State Init Marker ++*/ ++ ++static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) ++{ ++ CLzmaProb *probs = p->probs; ++ ++ unsigned state = p->state; ++ UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; ++ unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; ++ unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; ++ unsigned lc = p->prop.lc; ++ ++ Byte *dic = p->dic; ++ SizeT dicBufSize = p->dicBufSize; ++ SizeT dicPos = p->dicPos; ++ ++ UInt32 processedPos = p->processedPos; ++ UInt32 checkDicSize = p->checkDicSize; ++ unsigned len = 0; ++ ++ const Byte *buf = p->buf; ++ UInt32 range = p->range; ++ UInt32 code = p->code; ++ ++ do ++ { ++ CLzmaProb *prob; ++ UInt32 bound; ++ unsigned ttt; ++ unsigned posState = processedPos & pbMask; ++ ++ prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; ++ IF_BIT_0(prob) ++ { ++ unsigned symbol; ++ UPDATE_0(prob); ++ prob = probs + Literal; ++ if (checkDicSize != 0 || processedPos != 0) ++ prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + ++ (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); ++ ++ if (state < kNumLitStates) ++ { ++ state -= (state < 4) ? state : 3; ++ symbol = 1; ++ do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100); ++ } ++ else ++ { ++ unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; ++ unsigned offs = 0x100; ++ state -= (state < 10) ? 3 : 6; ++ symbol = 1; ++ do ++ { ++ unsigned bit; ++ CLzmaProb *probLit; ++ matchByte <<= 1; ++ bit = (matchByte & offs); ++ probLit = prob + offs + bit + symbol; ++ GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) ++ } ++ while (symbol < 0x100); ++ } ++ dic[dicPos++] = (Byte)symbol; ++ processedPos++; ++ continue; ++ } ++ else ++ { ++ UPDATE_1(prob); ++ prob = probs + IsRep + state; ++ IF_BIT_0(prob) ++ { ++ UPDATE_0(prob); ++ state += kNumStates; ++ prob = probs + LenCoder; ++ } ++ else ++ { ++ UPDATE_1(prob); ++ if (checkDicSize == 0 && processedPos == 0) ++ return SZ_ERROR_DATA; ++ prob = probs + IsRepG0 + state; ++ IF_BIT_0(prob) ++ { ++ UPDATE_0(prob); ++ prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; ++ IF_BIT_0(prob) ++ { ++ UPDATE_0(prob); ++ dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; ++ dicPos++; ++ processedPos++; ++ state = state < kNumLitStates ? 9 : 11; ++ continue; ++ } ++ UPDATE_1(prob); ++ } ++ else ++ { ++ UInt32 distance; ++ UPDATE_1(prob); ++ prob = probs + IsRepG1 + state; ++ IF_BIT_0(prob) ++ { ++ UPDATE_0(prob); ++ distance = rep1; ++ } ++ else ++ { ++ UPDATE_1(prob); ++ prob = probs + IsRepG2 + state; ++ IF_BIT_0(prob) ++ { ++ UPDATE_0(prob); ++ distance = rep2; ++ } ++ else ++ { ++ UPDATE_1(prob); ++ distance = rep3; ++ rep3 = rep2; ++ } ++ rep2 = rep1; ++ } ++ rep1 = rep0; ++ rep0 = distance; ++ } ++ state = state < kNumLitStates ? 8 : 11; ++ prob = probs + RepLenCoder; ++ } ++ { ++ unsigned limit, offset; ++ CLzmaProb *probLen = prob + LenChoice; ++ IF_BIT_0(probLen) ++ { ++ UPDATE_0(probLen); ++ probLen = prob + LenLow + (posState << kLenNumLowBits); ++ offset = 0; ++ limit = (1 << kLenNumLowBits); ++ } ++ else ++ { ++ UPDATE_1(probLen); ++ probLen = prob + LenChoice2; ++ IF_BIT_0(probLen) ++ { ++ UPDATE_0(probLen); ++ probLen = prob + LenMid + (posState << kLenNumMidBits); ++ offset = kLenNumLowSymbols; ++ limit = (1 << kLenNumMidBits); ++ } ++ else ++ { ++ UPDATE_1(probLen); ++ probLen = prob + LenHigh; ++ offset = kLenNumLowSymbols + kLenNumMidSymbols; ++ limit = (1 << kLenNumHighBits); ++ } ++ } ++ TREE_DECODE(probLen, limit, len); ++ len += offset; ++ } ++ ++ if (state >= kNumStates) ++ { ++ UInt32 distance; ++ prob = probs + PosSlot + ++ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); ++ TREE_6_DECODE(prob, distance); ++ if (distance >= kStartPosModelIndex) ++ { ++ unsigned posSlot = (unsigned)distance; ++ int numDirectBits = (int)(((distance >> 1) - 1)); ++ distance = (2 | (distance & 1)); ++ if (posSlot < kEndPosModelIndex) ++ { ++ distance <<= numDirectBits; ++ prob = probs + SpecPos + distance - posSlot - 1; ++ { ++ UInt32 mask = 1; ++ unsigned i = 1; ++ do ++ { ++ GET_BIT2(prob + i, i, ; , distance |= mask); ++ mask <<= 1; ++ } ++ while (--numDirectBits != 0); ++ } ++ } ++ else ++ { ++ numDirectBits -= kNumAlignBits; ++ do ++ { ++ NORMALIZE ++ range >>= 1; ++ ++ { ++ UInt32 t; ++ code -= range; ++ t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ ++ distance = (distance << 1) + (t + 1); ++ code += range & t; ++ } ++ /* ++ distance <<= 1; ++ if (code >= range) ++ { ++ code -= range; ++ distance |= 1; ++ } ++ */ ++ } ++ while (--numDirectBits != 0); ++ prob = probs + Align; ++ distance <<= kNumAlignBits; ++ { ++ unsigned i = 1; ++ GET_BIT2(prob + i, i, ; , distance |= 1); ++ GET_BIT2(prob + i, i, ; , distance |= 2); ++ GET_BIT2(prob + i, i, ; , distance |= 4); ++ GET_BIT2(prob + i, i, ; , distance |= 8); ++ } ++ if (distance == (UInt32)0xFFFFFFFF) ++ { ++ len += kMatchSpecLenStart; ++ state -= kNumStates; ++ break; ++ } ++ } ++ } ++ rep3 = rep2; ++ rep2 = rep1; ++ rep1 = rep0; ++ rep0 = distance + 1; ++ if (checkDicSize == 0) ++ { ++ if (distance >= processedPos) ++ return SZ_ERROR_DATA; ++ } ++ else if (distance >= checkDicSize) ++ return SZ_ERROR_DATA; ++ state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; ++ } ++ ++ len += kMatchMinLen; ++ ++ if (limit == dicPos) ++ return SZ_ERROR_DATA; ++ { ++ SizeT rem = limit - dicPos; ++ unsigned curLen = ((rem < len) ? (unsigned)rem : len); ++ SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0); ++ ++ processedPos += curLen; ++ ++ len -= curLen; ++ if (pos + curLen <= dicBufSize) ++ { ++ Byte *dest = dic + dicPos; ++ ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; ++ const Byte *lim = dest + curLen; ++ dicPos += curLen; ++ do ++ *(dest) = (Byte)*(dest + src); ++ while (++dest != lim); ++ } ++ else ++ { ++ do ++ { ++ dic[dicPos++] = dic[pos]; ++ if (++pos == dicBufSize) ++ pos = 0; ++ } ++ while (--curLen != 0); ++ } ++ } ++ } ++ } ++ while (dicPos < limit && buf < bufLimit); ++ NORMALIZE; ++ p->buf = buf; ++ p->range = range; ++ p->code = code; ++ p->remainLen = len; ++ p->dicPos = dicPos; ++ p->processedPos = processedPos; ++ p->reps[0] = rep0; ++ p->reps[1] = rep1; ++ p->reps[2] = rep2; ++ p->reps[3] = rep3; ++ p->state = state; ++ ++ return SZ_OK; ++} ++ ++static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) ++{ ++ if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart) ++ { ++ Byte *dic = p->dic; ++ SizeT dicPos = p->dicPos; ++ SizeT dicBufSize = p->dicBufSize; ++ unsigned len = p->remainLen; ++ UInt32 rep0 = p->reps[0]; ++ if (limit - dicPos < len) ++ len = (unsigned)(limit - dicPos); ++ ++ if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) ++ p->checkDicSize = p->prop.dicSize; ++ ++ p->processedPos += len; ++ p->remainLen -= len; ++ while (len-- != 0) ++ { ++ dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; ++ dicPos++; ++ } ++ p->dicPos = dicPos; ++ } ++} ++ ++static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) ++{ ++ do ++ { ++ SizeT limit2 = limit; ++ if (p->checkDicSize == 0) ++ { ++ UInt32 rem = p->prop.dicSize - p->processedPos; ++ if (limit - p->dicPos > rem) ++ limit2 = p->dicPos + rem; ++ } ++ RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); ++ if (p->processedPos >= p->prop.dicSize) ++ p->checkDicSize = p->prop.dicSize; ++ LzmaDec_WriteRem(p, limit); ++ } ++ while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); ++ ++ if (p->remainLen > kMatchSpecLenStart) ++ { ++ p->remainLen = kMatchSpecLenStart; ++ } ++ return 0; ++} ++ ++typedef enum ++{ ++ DUMMY_ERROR, /* unexpected end of input stream */ ++ DUMMY_LIT, ++ DUMMY_MATCH, ++ DUMMY_REP ++} ELzmaDummy; ++ ++static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize) ++{ ++ UInt32 range = p->range; ++ UInt32 code = p->code; ++ const Byte *bufLimit = buf + inSize; ++ CLzmaProb *probs = p->probs; ++ unsigned state = p->state; ++ ELzmaDummy res; ++ ++ { ++ CLzmaProb *prob; ++ UInt32 bound; ++ unsigned ttt; ++ unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); ++ ++ prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; ++ IF_BIT_0_CHECK(prob) ++ { ++ UPDATE_0_CHECK ++ ++ /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ ++ ++ prob = probs + Literal; ++ if (p->checkDicSize != 0 || p->processedPos != 0) ++ prob += (LZMA_LIT_SIZE * ++ ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + ++ (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); ++ ++ if (state < kNumLitStates) ++ { ++ unsigned symbol = 1; ++ do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); ++ } ++ else ++ { ++ unsigned matchByte = p->dic[p->dicPos - p->reps[0] + ++ ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)]; ++ unsigned offs = 0x100; ++ unsigned symbol = 1; ++ do ++ { ++ unsigned bit; ++ CLzmaProb *probLit; ++ matchByte <<= 1; ++ bit = (matchByte & offs); ++ probLit = prob + offs + bit + symbol; ++ GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) ++ } ++ while (symbol < 0x100); ++ } ++ res = DUMMY_LIT; ++ } ++ else ++ { ++ unsigned len; ++ UPDATE_1_CHECK; ++ ++ prob = probs + IsRep + state; ++ IF_BIT_0_CHECK(prob) ++ { ++ UPDATE_0_CHECK; ++ state = 0; ++ prob = probs + LenCoder; ++ res = DUMMY_MATCH; ++ } ++ else ++ { ++ UPDATE_1_CHECK; ++ res = DUMMY_REP; ++ prob = probs + IsRepG0 + state; ++ IF_BIT_0_CHECK(prob) ++ { ++ UPDATE_0_CHECK; ++ prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; ++ IF_BIT_0_CHECK(prob) ++ { ++ UPDATE_0_CHECK; ++ NORMALIZE_CHECK; ++ return DUMMY_REP; ++ } ++ else ++ { ++ UPDATE_1_CHECK; ++ } ++ } ++ else ++ { ++ UPDATE_1_CHECK; ++ prob = probs + IsRepG1 + state; ++ IF_BIT_0_CHECK(prob) ++ { ++ UPDATE_0_CHECK; ++ } ++ else ++ { ++ UPDATE_1_CHECK; ++ prob = probs + IsRepG2 + state; ++ IF_BIT_0_CHECK(prob) ++ { ++ UPDATE_0_CHECK; ++ } ++ else ++ { ++ UPDATE_1_CHECK; ++ } ++ } ++ } ++ state = kNumStates; ++ prob = probs + RepLenCoder; ++ } ++ { ++ unsigned limit, offset; ++ CLzmaProb *probLen = prob + LenChoice; ++ IF_BIT_0_CHECK(probLen) ++ { ++ UPDATE_0_CHECK; ++ probLen = prob + LenLow + (posState << kLenNumLowBits); ++ offset = 0; ++ limit = 1 << kLenNumLowBits; ++ } ++ else ++ { ++ UPDATE_1_CHECK; ++ probLen = prob + LenChoice2; ++ IF_BIT_0_CHECK(probLen) ++ { ++ UPDATE_0_CHECK; ++ probLen = prob + LenMid + (posState << kLenNumMidBits); ++ offset = kLenNumLowSymbols; ++ limit = 1 << kLenNumMidBits; ++ } ++ else ++ { ++ UPDATE_1_CHECK; ++ probLen = prob + LenHigh; ++ offset = kLenNumLowSymbols + kLenNumMidSymbols; ++ limit = 1 << kLenNumHighBits; ++ } ++ } ++ TREE_DECODE_CHECK(probLen, limit, len); ++ len += offset; ++ } ++ ++ if (state < 4) ++ { ++ unsigned posSlot; ++ prob = probs + PosSlot + ++ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << ++ kNumPosSlotBits); ++ TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); ++ if (posSlot >= kStartPosModelIndex) ++ { ++ int numDirectBits = ((posSlot >> 1) - 1); ++ ++ /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ ++ ++ if (posSlot < kEndPosModelIndex) ++ { ++ prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; ++ } ++ else ++ { ++ numDirectBits -= kNumAlignBits; ++ do ++ { ++ NORMALIZE_CHECK ++ range >>= 1; ++ code -= range & (((code - range) >> 31) - 1); ++ /* if (code >= range) code -= range; */ ++ } ++ while (--numDirectBits != 0); ++ prob = probs + Align; ++ numDirectBits = kNumAlignBits; ++ } ++ { ++ unsigned i = 1; ++ do ++ { ++ GET_BIT_CHECK(prob + i, i); ++ } ++ while (--numDirectBits != 0); ++ } ++ } ++ } ++ } ++ } ++ NORMALIZE_CHECK; ++ return res; ++} ++ ++ ++static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data) ++{ ++ p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]); ++ p->range = 0xFFFFFFFF; ++ p->needFlush = 0; ++} ++ ++static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) ++{ ++ p->needFlush = 1; ++ p->remainLen = 0; ++ p->tempBufSize = 0; ++ ++ if (initDic) ++ { ++ p->processedPos = 0; ++ p->checkDicSize = 0; ++ p->needInitState = 1; ++ } ++ if (initState) ++ p->needInitState = 1; ++} ++ ++static void LzmaDec_Init(CLzmaDec *p) ++{ ++ p->dicPos = 0; ++ LzmaDec_InitDicAndState(p, True, True); ++} ++ ++static void LzmaDec_InitStateReal(CLzmaDec *p) ++{ ++ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp)); ++ UInt32 i; ++ CLzmaProb *probs = p->probs; ++ for (i = 0; i < numProbs; i++) ++ probs[i] = kBitModelTotal >> 1; ++ p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; ++ p->state = 0; ++ p->needInitState = 0; ++} ++ ++static SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, ++ ELzmaFinishMode finishMode, ELzmaStatus *status) ++{ ++ SizeT inSize = *srcLen; ++ (*srcLen) = 0; ++ LzmaDec_WriteRem(p, dicLimit); ++ ++ *status = LZMA_STATUS_NOT_SPECIFIED; ++ ++ while (p->remainLen != kMatchSpecLenStart) ++ { ++ int checkEndMarkNow; ++ ++ if (p->needFlush != 0) ++ { ++ for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) ++ p->tempBuf[p->tempBufSize++] = *src++; ++ if (p->tempBufSize < RC_INIT_SIZE) ++ { ++ *status = LZMA_STATUS_NEEDS_MORE_INPUT; ++ return SZ_OK; ++ } ++ if (p->tempBuf[0] != 0) ++ return SZ_ERROR_DATA; ++ ++ LzmaDec_InitRc(p, p->tempBuf); ++ p->tempBufSize = 0; ++ } ++ ++ checkEndMarkNow = 0; ++ if (p->dicPos >= dicLimit) ++ { ++ if (p->remainLen == 0 && p->code == 0) ++ { ++ *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; ++ return SZ_OK; ++ } ++ if (finishMode == LZMA_FINISH_ANY) ++ { ++ *status = LZMA_STATUS_NOT_FINISHED; ++ return SZ_OK; ++ } ++ if (p->remainLen != 0) ++ { ++ *status = LZMA_STATUS_NOT_FINISHED; ++ return SZ_ERROR_DATA; ++ } ++ checkEndMarkNow = 1; ++ } ++ ++ if (p->needInitState) ++ LzmaDec_InitStateReal(p); ++ ++ if (p->tempBufSize == 0) ++ { ++ SizeT processed; ++ const Byte *bufLimit; ++ if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) ++ { ++ int dummyRes = LzmaDec_TryDummy(p, src, inSize); ++ if (dummyRes == DUMMY_ERROR) ++ { ++ memcpy(p->tempBuf, src, inSize); ++ p->tempBufSize = (unsigned)inSize; ++ (*srcLen) += inSize; ++ *status = LZMA_STATUS_NEEDS_MORE_INPUT; ++ return SZ_OK; ++ } ++ if (checkEndMarkNow && dummyRes != DUMMY_MATCH) ++ { ++ *status = LZMA_STATUS_NOT_FINISHED; ++ return SZ_ERROR_DATA; ++ } ++ bufLimit = src; ++ } ++ else ++ bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; ++ p->buf = src; ++ if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0) ++ return SZ_ERROR_DATA; ++ processed = (SizeT)(p->buf - src); ++ (*srcLen) += processed; ++ src += processed; ++ inSize -= processed; ++ } ++ else ++ { ++ unsigned rem = p->tempBufSize, lookAhead = 0; ++ while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) ++ p->tempBuf[rem++] = src[lookAhead++]; ++ p->tempBufSize = rem; ++ if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) ++ { ++ int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); ++ if (dummyRes == DUMMY_ERROR) ++ { ++ (*srcLen) += lookAhead; ++ *status = LZMA_STATUS_NEEDS_MORE_INPUT; ++ return SZ_OK; ++ } ++ if (checkEndMarkNow && dummyRes != DUMMY_MATCH) ++ { ++ *status = LZMA_STATUS_NOT_FINISHED; ++ return SZ_ERROR_DATA; ++ } ++ } ++ p->buf = p->tempBuf; ++ if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0) ++ return SZ_ERROR_DATA; ++ lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf)); ++ (*srcLen) += lookAhead; ++ src += lookAhead; ++ inSize -= lookAhead; ++ p->tempBufSize = 0; ++ } ++ } ++ if (p->code == 0) ++ *status = LZMA_STATUS_FINISHED_WITH_MARK; ++ return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; ++} ++ ++static void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) ++{ ++ alloc->Free(alloc, p->probs); ++ p->probs = 0; ++} ++ ++static SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) ++{ ++ UInt32 dicSize; ++ Byte d; ++ ++ if (size < LZMA_PROPS_SIZE) ++ return SZ_ERROR_UNSUPPORTED; ++ else ++ dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); ++ ++ if (dicSize < LZMA_DIC_MIN) ++ dicSize = LZMA_DIC_MIN; ++ p->dicSize = dicSize; ++ ++ d = data[0]; ++ if (d >= (9 * 5 * 5)) ++ return SZ_ERROR_UNSUPPORTED; ++ ++ p->lc = d % 9; ++ d /= 9; ++ p->pb = d / 5; ++ p->lp = d % 5; ++ ++ return SZ_OK; ++} ++ ++static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) ++{ ++ UInt32 numProbs = LzmaProps_GetNumProbs(propNew); ++ if (p->probs == 0 || numProbs != p->numProbs) ++ { ++ LzmaDec_FreeProbs(p, alloc); ++ p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); ++ p->numProbs = numProbs; ++ if (p->probs == 0) ++ return SZ_ERROR_MEM; ++ } ++ return SZ_OK; ++} ++ ++static SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) ++{ ++ CLzmaProps propNew; ++ RINOK(LzmaProps_Decode(&propNew, props, propsSize)); ++ RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); ++ p->prop = propNew; ++ return SZ_OK; ++} ++ ++SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ++ const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, ++ ELzmaStatus *status, ISzAlloc *alloc) ++{ ++ CLzmaDec p; ++ SRes res; ++ SizeT inSize = *srcLen; ++ SizeT outSize = *destLen; ++ *srcLen = *destLen = 0; ++ if (inSize < RC_INIT_SIZE) ++ return SZ_ERROR_INPUT_EOF; ++ ++ LzmaDec_Construct(&p); ++ res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc); ++ if (res != 0) ++ return res; ++ p.dic = dest; ++ p.dicBufSize = outSize; ++ ++ LzmaDec_Init(&p); ++ ++ *srcLen = inSize; ++ res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); ++ ++ if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) ++ res = SZ_ERROR_INPUT_EOF; ++ ++ (*destLen) = p.dicPos; ++ LzmaDec_FreeProbs(&p, alloc); ++ return res; ++} +--- /dev/null ++++ b/lib/lzma/LzmaEnc.c +@@ -0,0 +1,2123 @@ ++/* LzmaEnc.c -- LZMA Encoder ++2009-11-24 : Igor Pavlov : Public domain */ ++ ++#include ++ ++/* #define SHOW_STAT */ ++/* #define SHOW_STAT2 */ ++ ++#if defined(SHOW_STAT) || defined(SHOW_STAT2) ++#include ++#endif ++ ++#include "LzmaEnc.h" ++ ++/* disable MT */ ++#define _7ZIP_ST ++ ++#include "LzFind.h" ++#ifndef _7ZIP_ST ++#include "LzFindMt.h" ++#endif ++ ++#ifdef SHOW_STAT ++static int ttt = 0; ++#endif ++ ++#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1) ++ ++#define kBlockSize (9 << 10) ++#define kUnpackBlockSize (1 << 18) ++#define kMatchArraySize (1 << 21) ++#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX) ++ ++#define kNumMaxDirectBits (31) ++ ++#define kNumTopBits 24 ++#define kTopValue ((UInt32)1 << kNumTopBits) ++ ++#define kNumBitModelTotalBits 11 ++#define kBitModelTotal (1 << kNumBitModelTotalBits) ++#define kNumMoveBits 5 ++#define kProbInitValue (kBitModelTotal >> 1) ++ ++#define kNumMoveReducingBits 4 ++#define kNumBitPriceShiftBits 4 ++#define kBitPrice (1 << kNumBitPriceShiftBits) ++ ++void LzmaEncProps_Init(CLzmaEncProps *p) ++{ ++ p->level = 5; ++ p->dictSize = p->mc = 0; ++ p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; ++ p->writeEndMark = 0; ++} ++ ++static void LzmaEncProps_Normalize(CLzmaEncProps *p) ++{ ++ int level = p->level; ++ if (level < 0) level = 5; ++ p->level = level; ++ if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26))); ++ if (p->lc < 0) p->lc = 3; ++ if (p->lp < 0) p->lp = 0; ++ if (p->pb < 0) p->pb = 2; ++ if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); ++ if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); ++ if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); ++ if (p->numHashBytes < 0) p->numHashBytes = 4; ++ if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1); ++ if (p->numThreads < 0) ++ p->numThreads = ++ #ifndef _7ZIP_ST ++ ((p->btMode && p->algo) ? 2 : 1); ++ #else ++ 1; ++ #endif ++} ++ ++static UInt32 __maybe_unused LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) ++{ ++ CLzmaEncProps props = *props2; ++ LzmaEncProps_Normalize(&props); ++ return props.dictSize; ++} ++ ++/* #define LZMA_LOG_BSR */ ++/* Define it for Intel's CPU */ ++ ++ ++#ifdef LZMA_LOG_BSR ++ ++#define kDicLogSizeMaxCompress 30 ++ ++#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); } ++ ++static UInt32 GetPosSlot1(UInt32 pos) ++{ ++ UInt32 res; ++ BSR2_RET(pos, res); ++ return res; ++} ++#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } ++#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } ++ ++#else ++ ++#define kNumLogBits (9 + (int)sizeof(size_t) / 2) ++#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) ++ ++static void LzmaEnc_FastPosInit(Byte *g_FastPos) ++{ ++ int c = 2, slotFast; ++ g_FastPos[0] = 0; ++ g_FastPos[1] = 1; ++ ++ for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++) ++ { ++ UInt32 k = (1 << ((slotFast >> 1) - 1)); ++ UInt32 j; ++ for (j = 0; j < k; j++, c++) ++ g_FastPos[c] = (Byte)slotFast; ++ } ++} ++ ++#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \ ++ (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ ++ res = p->g_FastPos[pos >> i] + (i * 2); } ++/* ++#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ ++ p->g_FastPos[pos >> 6] + 12 : \ ++ p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; } ++*/ ++ ++#define GetPosSlot1(pos) p->g_FastPos[pos] ++#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } ++#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); } ++ ++#endif ++ ++ ++#define LZMA_NUM_REPS 4 ++ ++typedef unsigned CState; ++ ++typedef struct ++{ ++ UInt32 price; ++ ++ CState state; ++ int prev1IsChar; ++ int prev2; ++ ++ UInt32 posPrev2; ++ UInt32 backPrev2; ++ ++ UInt32 posPrev; ++ UInt32 backPrev; ++ UInt32 backs[LZMA_NUM_REPS]; ++} COptimal; ++ ++#define kNumOpts (1 << 12) ++ ++#define kNumLenToPosStates 4 ++#define kNumPosSlotBits 6 ++#define kDicLogSizeMin 0 ++#define kDicLogSizeMax 32 ++#define kDistTableSizeMax (kDicLogSizeMax * 2) ++ ++ ++#define kNumAlignBits 4 ++#define kAlignTableSize (1 << kNumAlignBits) ++#define kAlignMask (kAlignTableSize - 1) ++ ++#define kStartPosModelIndex 4 ++#define kEndPosModelIndex 14 ++#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex) ++ ++#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) ++ ++#ifdef _LZMA_PROB32 ++#define CLzmaProb UInt32 ++#else ++#define CLzmaProb UInt16 ++#endif ++ ++#define LZMA_PB_MAX 4 ++#define LZMA_LC_MAX 8 ++#define LZMA_LP_MAX 4 ++ ++#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) ++ ++ ++#define kLenNumLowBits 3 ++#define kLenNumLowSymbols (1 << kLenNumLowBits) ++#define kLenNumMidBits 3 ++#define kLenNumMidSymbols (1 << kLenNumMidBits) ++#define kLenNumHighBits 8 ++#define kLenNumHighSymbols (1 << kLenNumHighBits) ++ ++#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) ++ ++#define LZMA_MATCH_LEN_MIN 2 ++#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) ++ ++#define kNumStates 12 ++ ++typedef struct ++{ ++ CLzmaProb choice; ++ CLzmaProb choice2; ++ CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits]; ++ CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits]; ++ CLzmaProb high[kLenNumHighSymbols]; ++} CLenEnc; ++ ++typedef struct ++{ ++ CLenEnc p; ++ UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; ++ UInt32 tableSize; ++ UInt32 counters[LZMA_NUM_PB_STATES_MAX]; ++} CLenPriceEnc; ++ ++typedef struct ++{ ++ UInt32 range; ++ Byte cache; ++ UInt64 low; ++ UInt64 cacheSize; ++ Byte *buf; ++ Byte *bufLim; ++ Byte *bufBase; ++ ISeqOutStream *outStream; ++ UInt64 processed; ++ SRes res; ++} CRangeEnc; ++ ++typedef struct ++{ ++ CLzmaProb *litProbs; ++ ++ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; ++ CLzmaProb isRep[kNumStates]; ++ CLzmaProb isRepG0[kNumStates]; ++ CLzmaProb isRepG1[kNumStates]; ++ CLzmaProb isRepG2[kNumStates]; ++ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; ++ ++ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; ++ CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; ++ CLzmaProb posAlignEncoder[1 << kNumAlignBits]; ++ ++ CLenPriceEnc lenEnc; ++ CLenPriceEnc repLenEnc; ++ ++ UInt32 reps[LZMA_NUM_REPS]; ++ UInt32 state; ++} CSaveState; ++ ++typedef struct ++{ ++ IMatchFinder matchFinder; ++ void *matchFinderObj; ++ ++ #ifndef _7ZIP_ST ++ Bool mtMode; ++ CMatchFinderMt matchFinderMt; ++ #endif ++ ++ CMatchFinder matchFinderBase; ++ ++ #ifndef _7ZIP_ST ++ Byte pad[128]; ++ #endif ++ ++ UInt32 optimumEndIndex; ++ UInt32 optimumCurrentIndex; ++ ++ UInt32 longestMatchLength; ++ UInt32 numPairs; ++ UInt32 numAvail; ++ COptimal opt[kNumOpts]; ++ ++ #ifndef LZMA_LOG_BSR ++ Byte g_FastPos[1 << kNumLogBits]; ++ #endif ++ ++ UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; ++ UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; ++ UInt32 numFastBytes; ++ UInt32 additionalOffset; ++ UInt32 reps[LZMA_NUM_REPS]; ++ UInt32 state; ++ ++ UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; ++ UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; ++ UInt32 alignPrices[kAlignTableSize]; ++ UInt32 alignPriceCount; ++ ++ UInt32 distTableSize; ++ ++ unsigned lc, lp, pb; ++ unsigned lpMask, pbMask; ++ ++ CLzmaProb *litProbs; ++ ++ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; ++ CLzmaProb isRep[kNumStates]; ++ CLzmaProb isRepG0[kNumStates]; ++ CLzmaProb isRepG1[kNumStates]; ++ CLzmaProb isRepG2[kNumStates]; ++ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; ++ ++ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; ++ CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; ++ CLzmaProb posAlignEncoder[1 << kNumAlignBits]; ++ ++ CLenPriceEnc lenEnc; ++ CLenPriceEnc repLenEnc; ++ ++ unsigned lclp; ++ ++ Bool fastMode; ++ ++ CRangeEnc rc; ++ ++ Bool writeEndMark; ++ UInt64 nowPos64; ++ UInt32 matchPriceCount; ++ Bool finished; ++ Bool multiThread; ++ ++ SRes result; ++ UInt32 dictSize; ++ UInt32 matchFinderCycles; ++ ++ int needInit; ++ ++ CSaveState saveState; ++} CLzmaEnc; ++ ++SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) ++{ ++ CLzmaEnc *p = (CLzmaEnc *)pp; ++ CLzmaEncProps props = *props2; ++ LzmaEncProps_Normalize(&props); ++ ++ if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX || ++ props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30)) ++ return SZ_ERROR_PARAM; ++ p->dictSize = props.dictSize; ++ p->matchFinderCycles = props.mc; ++ { ++ unsigned fb = props.fb; ++ if (fb < 5) ++ fb = 5; ++ if (fb > LZMA_MATCH_LEN_MAX) ++ fb = LZMA_MATCH_LEN_MAX; ++ p->numFastBytes = fb; ++ } ++ p->lc = props.lc; ++ p->lp = props.lp; ++ p->pb = props.pb; ++ p->fastMode = (props.algo == 0); ++ p->matchFinderBase.btMode = props.btMode; ++ { ++ UInt32 numHashBytes = 4; ++ if (props.btMode) ++ { ++ if (props.numHashBytes < 2) ++ numHashBytes = 2; ++ else if (props.numHashBytes < 4) ++ numHashBytes = props.numHashBytes; ++ } ++ p->matchFinderBase.numHashBytes = numHashBytes; ++ } ++ ++ p->matchFinderBase.cutValue = props.mc; ++ ++ p->writeEndMark = props.writeEndMark; ++ ++ #ifndef _7ZIP_ST ++ /* ++ if (newMultiThread != _multiThread) ++ { ++ ReleaseMatchFinder(); ++ _multiThread = newMultiThread; ++ } ++ */ ++ p->multiThread = (props.numThreads > 1); ++ #endif ++ ++ return SZ_OK; ++} ++ ++static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; ++static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; ++static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; ++static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; ++ ++#define IsCharState(s) ((s) < 7) ++ ++#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) ++ ++#define kInfinityPrice (1 << 30) ++ ++static void RangeEnc_Construct(CRangeEnc *p) ++{ ++ p->outStream = 0; ++ p->bufBase = 0; ++} ++ ++#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) ++ ++#define RC_BUF_SIZE (1 << 16) ++static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) ++{ ++ if (p->bufBase == 0) ++ { ++ p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE); ++ if (p->bufBase == 0) ++ return 0; ++ p->bufLim = p->bufBase + RC_BUF_SIZE; ++ } ++ return 1; ++} ++ ++static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc) ++{ ++ alloc->Free(alloc, p->bufBase); ++ p->bufBase = 0; ++} ++ ++static void RangeEnc_Init(CRangeEnc *p) ++{ ++ /* Stream.Init(); */ ++ p->low = 0; ++ p->range = 0xFFFFFFFF; ++ p->cacheSize = 1; ++ p->cache = 0; ++ ++ p->buf = p->bufBase; ++ ++ p->processed = 0; ++ p->res = SZ_OK; ++} ++ ++static void RangeEnc_FlushStream(CRangeEnc *p) ++{ ++ size_t num; ++ if (p->res != SZ_OK) ++ return; ++ num = p->buf - p->bufBase; ++ if (num != p->outStream->Write(p->outStream, p->bufBase, num)) ++ p->res = SZ_ERROR_WRITE; ++ p->processed += num; ++ p->buf = p->bufBase; ++} ++ ++static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) ++{ ++ if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0) ++ { ++ Byte temp = p->cache; ++ do ++ { ++ Byte *buf = p->buf; ++ *buf++ = (Byte)(temp + (Byte)(p->low >> 32)); ++ p->buf = buf; ++ if (buf == p->bufLim) ++ RangeEnc_FlushStream(p); ++ temp = 0xFF; ++ } ++ while (--p->cacheSize != 0); ++ p->cache = (Byte)((UInt32)p->low >> 24); ++ } ++ p->cacheSize++; ++ p->low = (UInt32)p->low << 8; ++} ++ ++static void RangeEnc_FlushData(CRangeEnc *p) ++{ ++ int i; ++ for (i = 0; i < 5; i++) ++ RangeEnc_ShiftLow(p); ++} ++ ++static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits) ++{ ++ do ++ { ++ p->range >>= 1; ++ p->low += p->range & (0 - ((value >> --numBits) & 1)); ++ if (p->range < kTopValue) ++ { ++ p->range <<= 8; ++ RangeEnc_ShiftLow(p); ++ } ++ } ++ while (numBits != 0); ++} ++ ++static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol) ++{ ++ UInt32 ttt = *prob; ++ UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt; ++ if (symbol == 0) ++ { ++ p->range = newBound; ++ ttt += (kBitModelTotal - ttt) >> kNumMoveBits; ++ } ++ else ++ { ++ p->low += newBound; ++ p->range -= newBound; ++ ttt -= ttt >> kNumMoveBits; ++ } ++ *prob = (CLzmaProb)ttt; ++ if (p->range < kTopValue) ++ { ++ p->range <<= 8; ++ RangeEnc_ShiftLow(p); ++ } ++} ++ ++static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) ++{ ++ symbol |= 0x100; ++ do ++ { ++ RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); ++ symbol <<= 1; ++ } ++ while (symbol < 0x10000); ++} ++ ++static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) ++{ ++ UInt32 offs = 0x100; ++ symbol |= 0x100; ++ do ++ { ++ matchByte <<= 1; ++ RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); ++ symbol <<= 1; ++ offs &= ~(matchByte ^ symbol); ++ } ++ while (symbol < 0x10000); ++} ++ ++static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) ++{ ++ UInt32 i; ++ for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) ++ { ++ const int kCyclesBits = kNumBitPriceShiftBits; ++ UInt32 w = i; ++ UInt32 bitCount = 0; ++ int j; ++ for (j = 0; j < kCyclesBits; j++) ++ { ++ w = w * w; ++ bitCount <<= 1; ++ while (w >= ((UInt32)1 << 16)) ++ { ++ w >>= 1; ++ bitCount++; ++ } ++ } ++ ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); ++ } ++} ++ ++ ++#define GET_PRICE(prob, symbol) \ ++ p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; ++ ++#define GET_PRICEa(prob, symbol) \ ++ ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; ++ ++#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] ++#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] ++ ++#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits] ++#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] ++ ++static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices) ++{ ++ UInt32 price = 0; ++ symbol |= 0x100; ++ do ++ { ++ price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1); ++ symbol <<= 1; ++ } ++ while (symbol < 0x10000); ++ return price; ++} ++ ++static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices) ++{ ++ UInt32 price = 0; ++ UInt32 offs = 0x100; ++ symbol |= 0x100; ++ do ++ { ++ matchByte <<= 1; ++ price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1); ++ symbol <<= 1; ++ offs &= ~(matchByte ^ symbol); ++ } ++ while (symbol < 0x10000); ++ return price; ++} ++ ++ ++static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) ++{ ++ UInt32 m = 1; ++ int i; ++ for (i = numBitLevels; i != 0;) ++ { ++ UInt32 bit; ++ i--; ++ bit = (symbol >> i) & 1; ++ RangeEnc_EncodeBit(rc, probs + m, bit); ++ m = (m << 1) | bit; ++ } ++} ++ ++static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) ++{ ++ UInt32 m = 1; ++ int i; ++ for (i = 0; i < numBitLevels; i++) ++ { ++ UInt32 bit = symbol & 1; ++ RangeEnc_EncodeBit(rc, probs + m, bit); ++ m = (m << 1) | bit; ++ symbol >>= 1; ++ } ++} ++ ++static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) ++{ ++ UInt32 price = 0; ++ symbol |= (1 << numBitLevels); ++ while (symbol != 1) ++ { ++ price += GET_PRICEa(probs[symbol >> 1], symbol & 1); ++ symbol >>= 1; ++ } ++ return price; ++} ++ ++static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) ++{ ++ UInt32 price = 0; ++ UInt32 m = 1; ++ int i; ++ for (i = numBitLevels; i != 0; i--) ++ { ++ UInt32 bit = symbol & 1; ++ symbol >>= 1; ++ price += GET_PRICEa(probs[m], bit); ++ m = (m << 1) | bit; ++ } ++ return price; ++} ++ ++ ++static void LenEnc_Init(CLenEnc *p) ++{ ++ unsigned i; ++ p->choice = p->choice2 = kProbInitValue; ++ for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++) ++ p->low[i] = kProbInitValue; ++ for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++) ++ p->mid[i] = kProbInitValue; ++ for (i = 0; i < kLenNumHighSymbols; i++) ++ p->high[i] = kProbInitValue; ++} ++ ++static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState) ++{ ++ if (symbol < kLenNumLowSymbols) ++ { ++ RangeEnc_EncodeBit(rc, &p->choice, 0); ++ RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol); ++ } ++ else ++ { ++ RangeEnc_EncodeBit(rc, &p->choice, 1); ++ if (symbol < kLenNumLowSymbols + kLenNumMidSymbols) ++ { ++ RangeEnc_EncodeBit(rc, &p->choice2, 0); ++ RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols); ++ } ++ else ++ { ++ RangeEnc_EncodeBit(rc, &p->choice2, 1); ++ RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols); ++ } ++ } ++} ++ ++static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices) ++{ ++ UInt32 a0 = GET_PRICE_0a(p->choice); ++ UInt32 a1 = GET_PRICE_1a(p->choice); ++ UInt32 b0 = a1 + GET_PRICE_0a(p->choice2); ++ UInt32 b1 = a1 + GET_PRICE_1a(p->choice2); ++ UInt32 i = 0; ++ for (i = 0; i < kLenNumLowSymbols; i++) ++ { ++ if (i >= numSymbols) ++ return; ++ prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices); ++ } ++ for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++) ++ { ++ if (i >= numSymbols) ++ return; ++ prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices); ++ } ++ for (; i < numSymbols; i++) ++ prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices); ++} ++ ++static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices) ++{ ++ LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices); ++ p->counters[posState] = p->tableSize; ++} ++ ++static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices) ++{ ++ UInt32 posState; ++ for (posState = 0; posState < numPosStates; posState++) ++ LenPriceEnc_UpdateTable(p, posState, ProbPrices); ++} ++ ++static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices) ++{ ++ LenEnc_Encode(&p->p, rc, symbol, posState); ++ if (updatePrice) ++ if (--p->counters[posState] == 0) ++ LenPriceEnc_UpdateTable(p, posState, ProbPrices); ++} ++ ++ ++ ++ ++static void MovePos(CLzmaEnc *p, UInt32 num) ++{ ++ #ifdef SHOW_STAT ++ ttt += num; ++ printf("\n MovePos %d", num); ++ #endif ++ if (num != 0) ++ { ++ p->additionalOffset += num; ++ p->matchFinder.Skip(p->matchFinderObj, num); ++ } ++} ++ ++static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes) ++{ ++ UInt32 lenRes = 0, numPairs; ++ p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); ++ numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); ++ #ifdef SHOW_STAT ++ printf("\n i = %d numPairs = %d ", ttt, numPairs / 2); ++ ttt++; ++ { ++ UInt32 i; ++ for (i = 0; i < numPairs; i += 2) ++ printf("%2d %6d | ", p->matches[i], p->matches[i + 1]); ++ } ++ #endif ++ if (numPairs > 0) ++ { ++ lenRes = p->matches[numPairs - 2]; ++ if (lenRes == p->numFastBytes) ++ { ++ const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; ++ UInt32 distance = p->matches[numPairs - 1] + 1; ++ UInt32 numAvail = p->numAvail; ++ if (numAvail > LZMA_MATCH_LEN_MAX) ++ numAvail = LZMA_MATCH_LEN_MAX; ++ { ++ const Byte *pby2 = pby - distance; ++ for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++); ++ } ++ } ++ } ++ p->additionalOffset++; ++ *numDistancePairsRes = numPairs; ++ return lenRes; ++} ++ ++ ++#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False; ++#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False; ++#define IsShortRep(p) ((p)->backPrev == 0) ++ ++static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState) ++{ ++ return ++ GET_PRICE_0(p->isRepG0[state]) + ++ GET_PRICE_0(p->isRep0Long[state][posState]); ++} ++ ++static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState) ++{ ++ UInt32 price; ++ if (repIndex == 0) ++ { ++ price = GET_PRICE_0(p->isRepG0[state]); ++ price += GET_PRICE_1(p->isRep0Long[state][posState]); ++ } ++ else ++ { ++ price = GET_PRICE_1(p->isRepG0[state]); ++ if (repIndex == 1) ++ price += GET_PRICE_0(p->isRepG1[state]); ++ else ++ { ++ price += GET_PRICE_1(p->isRepG1[state]); ++ price += GET_PRICE(p->isRepG2[state], repIndex - 2); ++ } ++ } ++ return price; ++} ++ ++static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState) ++{ ++ return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] + ++ GetPureRepPrice(p, repIndex, state, posState); ++} ++ ++static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur) ++{ ++ UInt32 posMem = p->opt[cur].posPrev; ++ UInt32 backMem = p->opt[cur].backPrev; ++ p->optimumEndIndex = cur; ++ do ++ { ++ if (p->opt[cur].prev1IsChar) ++ { ++ MakeAsChar(&p->opt[posMem]) ++ p->opt[posMem].posPrev = posMem - 1; ++ if (p->opt[cur].prev2) ++ { ++ p->opt[posMem - 1].prev1IsChar = False; ++ p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2; ++ p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2; ++ } ++ } ++ { ++ UInt32 posPrev = posMem; ++ UInt32 backCur = backMem; ++ ++ backMem = p->opt[posPrev].backPrev; ++ posMem = p->opt[posPrev].posPrev; ++ ++ p->opt[posPrev].backPrev = backCur; ++ p->opt[posPrev].posPrev = cur; ++ cur = posPrev; ++ } ++ } ++ while (cur != 0); ++ *backRes = p->opt[0].backPrev; ++ p->optimumCurrentIndex = p->opt[0].posPrev; ++ return p->optimumCurrentIndex; ++} ++ ++#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300) ++ ++static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) ++{ ++ UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur; ++ UInt32 matchPrice, repMatchPrice, normalMatchPrice; ++ UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS]; ++ UInt32 *matches; ++ const Byte *data; ++ Byte curByte, matchByte; ++ if (p->optimumEndIndex != p->optimumCurrentIndex) ++ { ++ const COptimal *opt = &p->opt[p->optimumCurrentIndex]; ++ UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex; ++ *backRes = opt->backPrev; ++ p->optimumCurrentIndex = opt->posPrev; ++ return lenRes; ++ } ++ p->optimumCurrentIndex = p->optimumEndIndex = 0; ++ ++ if (p->additionalOffset == 0) ++ mainLen = ReadMatchDistances(p, &numPairs); ++ else ++ { ++ mainLen = p->longestMatchLength; ++ numPairs = p->numPairs; ++ } ++ ++ numAvail = p->numAvail; ++ if (numAvail < 2) ++ { ++ *backRes = (UInt32)(-1); ++ return 1; ++ } ++ if (numAvail > LZMA_MATCH_LEN_MAX) ++ numAvail = LZMA_MATCH_LEN_MAX; ++ ++ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; ++ repMaxIndex = 0; ++ for (i = 0; i < LZMA_NUM_REPS; i++) ++ { ++ UInt32 lenTest; ++ const Byte *data2; ++ reps[i] = p->reps[i]; ++ data2 = data - (reps[i] + 1); ++ if (data[0] != data2[0] || data[1] != data2[1]) ++ { ++ repLens[i] = 0; ++ continue; ++ } ++ for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); ++ repLens[i] = lenTest; ++ if (lenTest > repLens[repMaxIndex]) ++ repMaxIndex = i; ++ } ++ if (repLens[repMaxIndex] >= p->numFastBytes) ++ { ++ UInt32 lenRes; ++ *backRes = repMaxIndex; ++ lenRes = repLens[repMaxIndex]; ++ MovePos(p, lenRes - 1); ++ return lenRes; ++ } ++ ++ matches = p->matches; ++ if (mainLen >= p->numFastBytes) ++ { ++ *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; ++ MovePos(p, mainLen - 1); ++ return mainLen; ++ } ++ curByte = *data; ++ matchByte = *(data - (reps[0] + 1)); ++ ++ if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) ++ { ++ *backRes = (UInt32)-1; ++ return 1; ++ } ++ ++ p->opt[0].state = (CState)p->state; ++ ++ posState = (position & p->pbMask); ++ ++ { ++ const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); ++ p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + ++ (!IsCharState(p->state) ? ++ LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : ++ LitEnc_GetPrice(probs, curByte, p->ProbPrices)); ++ } ++ ++ MakeAsChar(&p->opt[1]); ++ ++ matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); ++ repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); ++ ++ if (matchByte == curByte) ++ { ++ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState); ++ if (shortRepPrice < p->opt[1].price) ++ { ++ p->opt[1].price = shortRepPrice; ++ MakeAsShortRep(&p->opt[1]); ++ } ++ } ++ lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]); ++ ++ if (lenEnd < 2) ++ { ++ *backRes = p->opt[1].backPrev; ++ return 1; ++ } ++ ++ p->opt[1].posPrev = 0; ++ for (i = 0; i < LZMA_NUM_REPS; i++) ++ p->opt[0].backs[i] = reps[i]; ++ ++ len = lenEnd; ++ do ++ p->opt[len--].price = kInfinityPrice; ++ while (len >= 2); ++ ++ for (i = 0; i < LZMA_NUM_REPS; i++) ++ { ++ UInt32 repLen = repLens[i]; ++ UInt32 price; ++ if (repLen < 2) ++ continue; ++ price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState); ++ do ++ { ++ UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2]; ++ COptimal *opt = &p->opt[repLen]; ++ if (curAndLenPrice < opt->price) ++ { ++ opt->price = curAndLenPrice; ++ opt->posPrev = 0; ++ opt->backPrev = i; ++ opt->prev1IsChar = False; ++ } ++ } ++ while (--repLen >= 2); ++ } ++ ++ normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); ++ ++ len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); ++ if (len <= mainLen) ++ { ++ UInt32 offs = 0; ++ while (len > matches[offs]) ++ offs += 2; ++ for (; ; len++) ++ { ++ COptimal *opt; ++ UInt32 distance = matches[offs + 1]; ++ ++ UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN]; ++ UInt32 lenToPosState = GetLenToPosState(len); ++ if (distance < kNumFullDistances) ++ curAndLenPrice += p->distancesPrices[lenToPosState][distance]; ++ else ++ { ++ UInt32 slot; ++ GetPosSlot2(distance, slot); ++ curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot]; ++ } ++ opt = &p->opt[len]; ++ if (curAndLenPrice < opt->price) ++ { ++ opt->price = curAndLenPrice; ++ opt->posPrev = 0; ++ opt->backPrev = distance + LZMA_NUM_REPS; ++ opt->prev1IsChar = False; ++ } ++ if (len == matches[offs]) ++ { ++ offs += 2; ++ if (offs == numPairs) ++ break; ++ } ++ } ++ } ++ ++ cur = 0; ++ ++ #ifdef SHOW_STAT2 ++ if (position >= 0) ++ { ++ unsigned i; ++ printf("\n pos = %4X", position); ++ for (i = cur; i <= lenEnd; i++) ++ printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price); ++ } ++ #endif ++ ++ for (;;) ++ { ++ UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen; ++ UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice; ++ Bool nextIsChar; ++ Byte curByte, matchByte; ++ const Byte *data; ++ COptimal *curOpt; ++ COptimal *nextOpt; ++ ++ cur++; ++ if (cur == lenEnd) ++ return Backward(p, backRes, cur); ++ ++ newLen = ReadMatchDistances(p, &numPairs); ++ if (newLen >= p->numFastBytes) ++ { ++ p->numPairs = numPairs; ++ p->longestMatchLength = newLen; ++ return Backward(p, backRes, cur); ++ } ++ position++; ++ curOpt = &p->opt[cur]; ++ posPrev = curOpt->posPrev; ++ if (curOpt->prev1IsChar) ++ { ++ posPrev--; ++ if (curOpt->prev2) ++ { ++ state = p->opt[curOpt->posPrev2].state; ++ if (curOpt->backPrev2 < LZMA_NUM_REPS) ++ state = kRepNextStates[state]; ++ else ++ state = kMatchNextStates[state]; ++ } ++ else ++ state = p->opt[posPrev].state; ++ state = kLiteralNextStates[state]; ++ } ++ else ++ state = p->opt[posPrev].state; ++ if (posPrev == cur - 1) ++ { ++ if (IsShortRep(curOpt)) ++ state = kShortRepNextStates[state]; ++ else ++ state = kLiteralNextStates[state]; ++ } ++ else ++ { ++ UInt32 pos; ++ const COptimal *prevOpt; ++ if (curOpt->prev1IsChar && curOpt->prev2) ++ { ++ posPrev = curOpt->posPrev2; ++ pos = curOpt->backPrev2; ++ state = kRepNextStates[state]; ++ } ++ else ++ { ++ pos = curOpt->backPrev; ++ if (pos < LZMA_NUM_REPS) ++ state = kRepNextStates[state]; ++ else ++ state = kMatchNextStates[state]; ++ } ++ prevOpt = &p->opt[posPrev]; ++ if (pos < LZMA_NUM_REPS) ++ { ++ UInt32 i; ++ reps[0] = prevOpt->backs[pos]; ++ for (i = 1; i <= pos; i++) ++ reps[i] = prevOpt->backs[i - 1]; ++ for (; i < LZMA_NUM_REPS; i++) ++ reps[i] = prevOpt->backs[i]; ++ } ++ else ++ { ++ UInt32 i; ++ reps[0] = (pos - LZMA_NUM_REPS); ++ for (i = 1; i < LZMA_NUM_REPS; i++) ++ reps[i] = prevOpt->backs[i - 1]; ++ } ++ } ++ curOpt->state = (CState)state; ++ ++ curOpt->backs[0] = reps[0]; ++ curOpt->backs[1] = reps[1]; ++ curOpt->backs[2] = reps[2]; ++ curOpt->backs[3] = reps[3]; ++ ++ curPrice = curOpt->price; ++ nextIsChar = False; ++ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; ++ curByte = *data; ++ matchByte = *(data - (reps[0] + 1)); ++ ++ posState = (position & p->pbMask); ++ ++ curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]); ++ { ++ const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); ++ curAnd1Price += ++ (!IsCharState(state) ? ++ LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : ++ LitEnc_GetPrice(probs, curByte, p->ProbPrices)); ++ } ++ ++ nextOpt = &p->opt[cur + 1]; ++ ++ if (curAnd1Price < nextOpt->price) ++ { ++ nextOpt->price = curAnd1Price; ++ nextOpt->posPrev = cur; ++ MakeAsChar(nextOpt); ++ nextIsChar = True; ++ } ++ ++ matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); ++ repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); ++ ++ if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0)) ++ { ++ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState); ++ if (shortRepPrice <= nextOpt->price) ++ { ++ nextOpt->price = shortRepPrice; ++ nextOpt->posPrev = cur; ++ MakeAsShortRep(nextOpt); ++ nextIsChar = True; ++ } ++ } ++ numAvailFull = p->numAvail; ++ { ++ UInt32 temp = kNumOpts - 1 - cur; ++ if (temp < numAvailFull) ++ numAvailFull = temp; ++ } ++ ++ if (numAvailFull < 2) ++ continue; ++ numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); ++ ++ if (!nextIsChar && matchByte != curByte) /* speed optimization */ ++ { ++ /* try Literal + rep0 */ ++ UInt32 temp; ++ UInt32 lenTest2; ++ const Byte *data2 = data - (reps[0] + 1); ++ UInt32 limit = p->numFastBytes + 1; ++ if (limit > numAvailFull) ++ limit = numAvailFull; ++ ++ for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); ++ lenTest2 = temp - 1; ++ if (lenTest2 >= 2) ++ { ++ UInt32 state2 = kLiteralNextStates[state]; ++ UInt32 posStateNext = (position + 1) & p->pbMask; ++ UInt32 nextRepMatchPrice = curAnd1Price + ++ GET_PRICE_1(p->isMatch[state2][posStateNext]) + ++ GET_PRICE_1(p->isRep[state2]); ++ /* for (; lenTest2 >= 2; lenTest2--) */ ++ { ++ UInt32 curAndLenPrice; ++ COptimal *opt; ++ UInt32 offset = cur + 1 + lenTest2; ++ while (lenEnd < offset) ++ p->opt[++lenEnd].price = kInfinityPrice; ++ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); ++ opt = &p->opt[offset]; ++ if (curAndLenPrice < opt->price) ++ { ++ opt->price = curAndLenPrice; ++ opt->posPrev = cur + 1; ++ opt->backPrev = 0; ++ opt->prev1IsChar = True; ++ opt->prev2 = False; ++ } ++ } ++ } ++ } ++ ++ startLen = 2; /* speed optimization */ ++ { ++ UInt32 repIndex; ++ for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++) ++ { ++ UInt32 lenTest; ++ UInt32 lenTestTemp; ++ UInt32 price; ++ const Byte *data2 = data - (reps[repIndex] + 1); ++ if (data[0] != data2[0] || data[1] != data2[1]) ++ continue; ++ for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); ++ while (lenEnd < cur + lenTest) ++ p->opt[++lenEnd].price = kInfinityPrice; ++ lenTestTemp = lenTest; ++ price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState); ++ do ++ { ++ UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2]; ++ COptimal *opt = &p->opt[cur + lenTest]; ++ if (curAndLenPrice < opt->price) ++ { ++ opt->price = curAndLenPrice; ++ opt->posPrev = cur; ++ opt->backPrev = repIndex; ++ opt->prev1IsChar = False; ++ } ++ } ++ while (--lenTest >= 2); ++ lenTest = lenTestTemp; ++ ++ if (repIndex == 0) ++ startLen = lenTest + 1; ++ ++ /* if (_maxMode) */ ++ { ++ UInt32 lenTest2 = lenTest + 1; ++ UInt32 limit = lenTest2 + p->numFastBytes; ++ UInt32 nextRepMatchPrice; ++ if (limit > numAvailFull) ++ limit = numAvailFull; ++ for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); ++ lenTest2 -= lenTest + 1; ++ if (lenTest2 >= 2) ++ { ++ UInt32 state2 = kRepNextStates[state]; ++ UInt32 posStateNext = (position + lenTest) & p->pbMask; ++ UInt32 curAndLenCharPrice = ++ price + p->repLenEnc.prices[posState][lenTest - 2] + ++ GET_PRICE_0(p->isMatch[state2][posStateNext]) + ++ LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), ++ data[lenTest], data2[lenTest], p->ProbPrices); ++ state2 = kLiteralNextStates[state2]; ++ posStateNext = (position + lenTest + 1) & p->pbMask; ++ nextRepMatchPrice = curAndLenCharPrice + ++ GET_PRICE_1(p->isMatch[state2][posStateNext]) + ++ GET_PRICE_1(p->isRep[state2]); ++ ++ /* for (; lenTest2 >= 2; lenTest2--) */ ++ { ++ UInt32 curAndLenPrice; ++ COptimal *opt; ++ UInt32 offset = cur + lenTest + 1 + lenTest2; ++ while (lenEnd < offset) ++ p->opt[++lenEnd].price = kInfinityPrice; ++ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); ++ opt = &p->opt[offset]; ++ if (curAndLenPrice < opt->price) ++ { ++ opt->price = curAndLenPrice; ++ opt->posPrev = cur + lenTest + 1; ++ opt->backPrev = 0; ++ opt->prev1IsChar = True; ++ opt->prev2 = True; ++ opt->posPrev2 = cur; ++ opt->backPrev2 = repIndex; ++ } ++ } ++ } ++ } ++ } ++ } ++ /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */ ++ if (newLen > numAvail) ++ { ++ newLen = numAvail; ++ for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2); ++ matches[numPairs] = newLen; ++ numPairs += 2; ++ } ++ if (newLen >= startLen) ++ { ++ UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); ++ UInt32 offs, curBack, posSlot; ++ UInt32 lenTest; ++ while (lenEnd < cur + newLen) ++ p->opt[++lenEnd].price = kInfinityPrice; ++ ++ offs = 0; ++ while (startLen > matches[offs]) ++ offs += 2; ++ curBack = matches[offs + 1]; ++ GetPosSlot2(curBack, posSlot); ++ for (lenTest = /*2*/ startLen; ; lenTest++) ++ { ++ UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN]; ++ UInt32 lenToPosState = GetLenToPosState(lenTest); ++ COptimal *opt; ++ if (curBack < kNumFullDistances) ++ curAndLenPrice += p->distancesPrices[lenToPosState][curBack]; ++ else ++ curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask]; ++ ++ opt = &p->opt[cur + lenTest]; ++ if (curAndLenPrice < opt->price) ++ { ++ opt->price = curAndLenPrice; ++ opt->posPrev = cur; ++ opt->backPrev = curBack + LZMA_NUM_REPS; ++ opt->prev1IsChar = False; ++ } ++ ++ if (/*_maxMode && */lenTest == matches[offs]) ++ { ++ /* Try Match + Literal + Rep0 */ ++ const Byte *data2 = data - (curBack + 1); ++ UInt32 lenTest2 = lenTest + 1; ++ UInt32 limit = lenTest2 + p->numFastBytes; ++ UInt32 nextRepMatchPrice; ++ if (limit > numAvailFull) ++ limit = numAvailFull; ++ for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); ++ lenTest2 -= lenTest + 1; ++ if (lenTest2 >= 2) ++ { ++ UInt32 state2 = kMatchNextStates[state]; ++ UInt32 posStateNext = (position + lenTest) & p->pbMask; ++ UInt32 curAndLenCharPrice = curAndLenPrice + ++ GET_PRICE_0(p->isMatch[state2][posStateNext]) + ++ LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), ++ data[lenTest], data2[lenTest], p->ProbPrices); ++ state2 = kLiteralNextStates[state2]; ++ posStateNext = (posStateNext + 1) & p->pbMask; ++ nextRepMatchPrice = curAndLenCharPrice + ++ GET_PRICE_1(p->isMatch[state2][posStateNext]) + ++ GET_PRICE_1(p->isRep[state2]); ++ ++ /* for (; lenTest2 >= 2; lenTest2--) */ ++ { ++ UInt32 offset = cur + lenTest + 1 + lenTest2; ++ UInt32 curAndLenPrice; ++ COptimal *opt; ++ while (lenEnd < offset) ++ p->opt[++lenEnd].price = kInfinityPrice; ++ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); ++ opt = &p->opt[offset]; ++ if (curAndLenPrice < opt->price) ++ { ++ opt->price = curAndLenPrice; ++ opt->posPrev = cur + lenTest + 1; ++ opt->backPrev = 0; ++ opt->prev1IsChar = True; ++ opt->prev2 = True; ++ opt->posPrev2 = cur; ++ opt->backPrev2 = curBack + LZMA_NUM_REPS; ++ } ++ } ++ } ++ offs += 2; ++ if (offs == numPairs) ++ break; ++ curBack = matches[offs + 1]; ++ if (curBack >= kNumFullDistances) ++ GetPosSlot2(curBack, posSlot); ++ } ++ } ++ } ++ } ++} ++ ++#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) ++ ++static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) ++{ ++ UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i; ++ const Byte *data; ++ const UInt32 *matches; ++ ++ if (p->additionalOffset == 0) ++ mainLen = ReadMatchDistances(p, &numPairs); ++ else ++ { ++ mainLen = p->longestMatchLength; ++ numPairs = p->numPairs; ++ } ++ ++ numAvail = p->numAvail; ++ *backRes = (UInt32)-1; ++ if (numAvail < 2) ++ return 1; ++ if (numAvail > LZMA_MATCH_LEN_MAX) ++ numAvail = LZMA_MATCH_LEN_MAX; ++ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; ++ ++ repLen = repIndex = 0; ++ for (i = 0; i < LZMA_NUM_REPS; i++) ++ { ++ UInt32 len; ++ const Byte *data2 = data - (p->reps[i] + 1); ++ if (data[0] != data2[0] || data[1] != data2[1]) ++ continue; ++ for (len = 2; len < numAvail && data[len] == data2[len]; len++); ++ if (len >= p->numFastBytes) ++ { ++ *backRes = i; ++ MovePos(p, len - 1); ++ return len; ++ } ++ if (len > repLen) ++ { ++ repIndex = i; ++ repLen = len; ++ } ++ } ++ ++ matches = p->matches; ++ if (mainLen >= p->numFastBytes) ++ { ++ *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; ++ MovePos(p, mainLen - 1); ++ return mainLen; ++ } ++ ++ mainDist = 0; /* for GCC */ ++ if (mainLen >= 2) ++ { ++ mainDist = matches[numPairs - 1]; ++ while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1) ++ { ++ if (!ChangePair(matches[numPairs - 3], mainDist)) ++ break; ++ numPairs -= 2; ++ mainLen = matches[numPairs - 2]; ++ mainDist = matches[numPairs - 1]; ++ } ++ if (mainLen == 2 && mainDist >= 0x80) ++ mainLen = 1; ++ } ++ ++ if (repLen >= 2 && ( ++ (repLen + 1 >= mainLen) || ++ (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || ++ (repLen + 3 >= mainLen && mainDist >= (1 << 15)))) ++ { ++ *backRes = repIndex; ++ MovePos(p, repLen - 1); ++ return repLen; ++ } ++ ++ if (mainLen < 2 || numAvail <= 2) ++ return 1; ++ ++ p->longestMatchLength = ReadMatchDistances(p, &p->numPairs); ++ if (p->longestMatchLength >= 2) ++ { ++ UInt32 newDistance = matches[p->numPairs - 1]; ++ if ((p->longestMatchLength >= mainLen && newDistance < mainDist) || ++ (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) || ++ (p->longestMatchLength > mainLen + 1) || ++ (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist))) ++ return 1; ++ } ++ ++ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; ++ for (i = 0; i < LZMA_NUM_REPS; i++) ++ { ++ UInt32 len, limit; ++ const Byte *data2 = data - (p->reps[i] + 1); ++ if (data[0] != data2[0] || data[1] != data2[1]) ++ continue; ++ limit = mainLen - 1; ++ for (len = 2; len < limit && data[len] == data2[len]; len++); ++ if (len >= limit) ++ return 1; ++ } ++ *backRes = mainDist + LZMA_NUM_REPS; ++ MovePos(p, mainLen - 2); ++ return mainLen; ++} ++ ++static void WriteEndMarker(CLzmaEnc *p, UInt32 posState) ++{ ++ UInt32 len; ++ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); ++ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); ++ p->state = kMatchNextStates[p->state]; ++ len = LZMA_MATCH_LEN_MIN; ++ LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); ++ RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1); ++ RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits); ++ RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); ++} ++ ++static SRes CheckErrors(CLzmaEnc *p) ++{ ++ if (p->result != SZ_OK) ++ return p->result; ++ if (p->rc.res != SZ_OK) ++ p->result = SZ_ERROR_WRITE; ++ if (p->matchFinderBase.result != SZ_OK) ++ p->result = SZ_ERROR_READ; ++ if (p->result != SZ_OK) ++ p->finished = True; ++ return p->result; ++} ++ ++static SRes Flush(CLzmaEnc *p, UInt32 nowPos) ++{ ++ /* ReleaseMFStream(); */ ++ p->finished = True; ++ if (p->writeEndMark) ++ WriteEndMarker(p, nowPos & p->pbMask); ++ RangeEnc_FlushData(&p->rc); ++ RangeEnc_FlushStream(&p->rc); ++ return CheckErrors(p); ++} ++ ++static void FillAlignPrices(CLzmaEnc *p) ++{ ++ UInt32 i; ++ for (i = 0; i < kAlignTableSize; i++) ++ p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); ++ p->alignPriceCount = 0; ++} ++ ++static void FillDistancesPrices(CLzmaEnc *p) ++{ ++ UInt32 tempPrices[kNumFullDistances]; ++ UInt32 i, lenToPosState; ++ for (i = kStartPosModelIndex; i < kNumFullDistances; i++) ++ { ++ UInt32 posSlot = GetPosSlot1(i); ++ UInt32 footerBits = ((posSlot >> 1) - 1); ++ UInt32 base = ((2 | (posSlot & 1)) << footerBits); ++ tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices); ++ } ++ ++ for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) ++ { ++ UInt32 posSlot; ++ const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; ++ UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; ++ for (posSlot = 0; posSlot < p->distTableSize; posSlot++) ++ posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); ++ for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++) ++ posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); ++ ++ { ++ UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; ++ UInt32 i; ++ for (i = 0; i < kStartPosModelIndex; i++) ++ distancesPrices[i] = posSlotPrices[i]; ++ for (; i < kNumFullDistances; i++) ++ distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i]; ++ } ++ } ++ p->matchPriceCount = 0; ++} ++ ++static void LzmaEnc_Construct(CLzmaEnc *p) ++{ ++ RangeEnc_Construct(&p->rc); ++ MatchFinder_Construct(&p->matchFinderBase); ++ #ifndef _7ZIP_ST ++ MatchFinderMt_Construct(&p->matchFinderMt); ++ p->matchFinderMt.MatchFinder = &p->matchFinderBase; ++ #endif ++ ++ { ++ CLzmaEncProps props; ++ LzmaEncProps_Init(&props); ++ LzmaEnc_SetProps(p, &props); ++ } ++ ++ #ifndef LZMA_LOG_BSR ++ LzmaEnc_FastPosInit(p->g_FastPos); ++ #endif ++ ++ LzmaEnc_InitPriceTables(p->ProbPrices); ++ p->litProbs = 0; ++ p->saveState.litProbs = 0; ++} ++ ++CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc) ++{ ++ void *p; ++ p = alloc->Alloc(alloc, sizeof(CLzmaEnc)); ++ if (p != 0) ++ LzmaEnc_Construct((CLzmaEnc *)p); ++ return p; ++} ++ ++static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) ++{ ++ alloc->Free(alloc, p->litProbs); ++ alloc->Free(alloc, p->saveState.litProbs); ++ p->litProbs = 0; ++ p->saveState.litProbs = 0; ++} ++ ++static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) ++{ ++ #ifndef _7ZIP_ST ++ MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); ++ #endif ++ MatchFinder_Free(&p->matchFinderBase, allocBig); ++ LzmaEnc_FreeLits(p, alloc); ++ RangeEnc_Free(&p->rc, alloc); ++} ++ ++void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig) ++{ ++ LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); ++ alloc->Free(alloc, p); ++} ++ ++static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize) ++{ ++ UInt32 nowPos32, startPos32; ++ if (p->needInit) ++ { ++ p->matchFinder.Init(p->matchFinderObj); ++ p->needInit = 0; ++ } ++ ++ if (p->finished) ++ return p->result; ++ RINOK(CheckErrors(p)); ++ ++ nowPos32 = (UInt32)p->nowPos64; ++ startPos32 = nowPos32; ++ ++ if (p->nowPos64 == 0) ++ { ++ UInt32 numPairs; ++ Byte curByte; ++ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) ++ return Flush(p, nowPos32); ++ ReadMatchDistances(p, &numPairs); ++ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0); ++ p->state = kLiteralNextStates[p->state]; ++ curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset); ++ LitEnc_Encode(&p->rc, p->litProbs, curByte); ++ p->additionalOffset--; ++ nowPos32++; ++ } ++ ++ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) ++ for (;;) ++ { ++ UInt32 pos, len, posState; ++ ++ if (p->fastMode) ++ len = GetOptimumFast(p, &pos); ++ else ++ len = GetOptimum(p, nowPos32, &pos); ++ ++ #ifdef SHOW_STAT2 ++ printf("\n pos = %4X, len = %d pos = %d", nowPos32, len, pos); ++ #endif ++ ++ posState = nowPos32 & p->pbMask; ++ if (len == 1 && pos == (UInt32)-1) ++ { ++ Byte curByte; ++ CLzmaProb *probs; ++ const Byte *data; ++ ++ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0); ++ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; ++ curByte = *data; ++ probs = LIT_PROBS(nowPos32, *(data - 1)); ++ if (IsCharState(p->state)) ++ LitEnc_Encode(&p->rc, probs, curByte); ++ else ++ LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1)); ++ p->state = kLiteralNextStates[p->state]; ++ } ++ else ++ { ++ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); ++ if (pos < LZMA_NUM_REPS) ++ { ++ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1); ++ if (pos == 0) ++ { ++ RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0); ++ RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1)); ++ } ++ else ++ { ++ UInt32 distance = p->reps[pos]; ++ RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1); ++ if (pos == 1) ++ RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0); ++ else ++ { ++ RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1); ++ RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2); ++ if (pos == 3) ++ p->reps[3] = p->reps[2]; ++ p->reps[2] = p->reps[1]; ++ } ++ p->reps[1] = p->reps[0]; ++ p->reps[0] = distance; ++ } ++ if (len == 1) ++ p->state = kShortRepNextStates[p->state]; ++ else ++ { ++ LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); ++ p->state = kRepNextStates[p->state]; ++ } ++ } ++ else ++ { ++ UInt32 posSlot; ++ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); ++ p->state = kMatchNextStates[p->state]; ++ LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); ++ pos -= LZMA_NUM_REPS; ++ GetPosSlot(pos, posSlot); ++ RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot); ++ ++ if (posSlot >= kStartPosModelIndex) ++ { ++ UInt32 footerBits = ((posSlot >> 1) - 1); ++ UInt32 base = ((2 | (posSlot & 1)) << footerBits); ++ UInt32 posReduced = pos - base; ++ ++ if (posSlot < kEndPosModelIndex) ++ RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced); ++ else ++ { ++ RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); ++ RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); ++ p->alignPriceCount++; ++ } ++ } ++ p->reps[3] = p->reps[2]; ++ p->reps[2] = p->reps[1]; ++ p->reps[1] = p->reps[0]; ++ p->reps[0] = pos; ++ p->matchPriceCount++; ++ } ++ } ++ p->additionalOffset -= len; ++ nowPos32 += len; ++ if (p->additionalOffset == 0) ++ { ++ UInt32 processed; ++ if (!p->fastMode) ++ { ++ if (p->matchPriceCount >= (1 << 7)) ++ FillDistancesPrices(p); ++ if (p->alignPriceCount >= kAlignTableSize) ++ FillAlignPrices(p); ++ } ++ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) ++ break; ++ processed = nowPos32 - startPos32; ++ if (useLimits) ++ { ++ if (processed + kNumOpts + 300 >= maxUnpackSize || ++ RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize) ++ break; ++ } ++ else if (processed >= (1 << 15)) ++ { ++ p->nowPos64 += nowPos32 - startPos32; ++ return CheckErrors(p); ++ } ++ } ++ } ++ p->nowPos64 += nowPos32 - startPos32; ++ return Flush(p, nowPos32); ++} ++ ++#define kBigHashDicLimit ((UInt32)1 << 24) ++ ++static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) ++{ ++ UInt32 beforeSize = kNumOpts; ++ Bool btMode; ++ if (!RangeEnc_Alloc(&p->rc, alloc)) ++ return SZ_ERROR_MEM; ++ btMode = (p->matchFinderBase.btMode != 0); ++ #ifndef _7ZIP_ST ++ p->mtMode = (p->multiThread && !p->fastMode && btMode); ++ #endif ++ ++ { ++ unsigned lclp = p->lc + p->lp; ++ if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp) ++ { ++ LzmaEnc_FreeLits(p, alloc); ++ p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); ++ p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); ++ if (p->litProbs == 0 || p->saveState.litProbs == 0) ++ { ++ LzmaEnc_FreeLits(p, alloc); ++ return SZ_ERROR_MEM; ++ } ++ p->lclp = lclp; ++ } ++ } ++ ++ p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit); ++ ++ if (beforeSize + p->dictSize < keepWindowSize) ++ beforeSize = keepWindowSize - p->dictSize; ++ ++ #ifndef _7ZIP_ST ++ if (p->mtMode) ++ { ++ RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)); ++ p->matchFinderObj = &p->matchFinderMt; ++ MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); ++ } ++ else ++ #endif ++ { ++ if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)) ++ return SZ_ERROR_MEM; ++ p->matchFinderObj = &p->matchFinderBase; ++ MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder); ++ } ++ return SZ_OK; ++} ++ ++static void LzmaEnc_Init(CLzmaEnc *p) ++{ ++ UInt32 i; ++ p->state = 0; ++ for (i = 0 ; i < LZMA_NUM_REPS; i++) ++ p->reps[i] = 0; ++ ++ RangeEnc_Init(&p->rc); ++ ++ ++ for (i = 0; i < kNumStates; i++) ++ { ++ UInt32 j; ++ for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) ++ { ++ p->isMatch[i][j] = kProbInitValue; ++ p->isRep0Long[i][j] = kProbInitValue; ++ } ++ p->isRep[i] = kProbInitValue; ++ p->isRepG0[i] = kProbInitValue; ++ p->isRepG1[i] = kProbInitValue; ++ p->isRepG2[i] = kProbInitValue; ++ } ++ ++ { ++ UInt32 num = 0x300 << (p->lp + p->lc); ++ for (i = 0; i < num; i++) ++ p->litProbs[i] = kProbInitValue; ++ } ++ ++ { ++ for (i = 0; i < kNumLenToPosStates; i++) ++ { ++ CLzmaProb *probs = p->posSlotEncoder[i]; ++ UInt32 j; ++ for (j = 0; j < (1 << kNumPosSlotBits); j++) ++ probs[j] = kProbInitValue; ++ } ++ } ++ { ++ for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) ++ p->posEncoders[i] = kProbInitValue; ++ } ++ ++ LenEnc_Init(&p->lenEnc.p); ++ LenEnc_Init(&p->repLenEnc.p); ++ ++ for (i = 0; i < (1 << kNumAlignBits); i++) ++ p->posAlignEncoder[i] = kProbInitValue; ++ ++ p->optimumEndIndex = 0; ++ p->optimumCurrentIndex = 0; ++ p->additionalOffset = 0; ++ ++ p->pbMask = (1 << p->pb) - 1; ++ p->lpMask = (1 << p->lp) - 1; ++} ++ ++static void LzmaEnc_InitPrices(CLzmaEnc *p) ++{ ++ if (!p->fastMode) ++ { ++ FillDistancesPrices(p); ++ FillAlignPrices(p); ++ } ++ ++ p->lenEnc.tableSize = ++ p->repLenEnc.tableSize = ++ p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; ++ LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices); ++ LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices); ++} ++ ++static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) ++{ ++ UInt32 i; ++ for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++) ++ if (p->dictSize <= ((UInt32)1 << i)) ++ break; ++ p->distTableSize = i * 2; ++ ++ p->finished = False; ++ p->result = SZ_OK; ++ RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); ++ LzmaEnc_Init(p); ++ LzmaEnc_InitPrices(p); ++ p->nowPos64 = 0; ++ return SZ_OK; ++} ++ ++static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) ++{ ++ p->matchFinderBase.directInput = 1; ++ p->matchFinderBase.bufferBase = (Byte *)src; ++ p->matchFinderBase.directInputRem = srcLen; ++} ++ ++static SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, ++ UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) ++{ ++ CLzmaEnc *p = (CLzmaEnc *)pp; ++ LzmaEnc_SetInputBuf(p, src, srcLen); ++ p->needInit = 1; ++ ++ return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); ++} ++ ++static void LzmaEnc_Finish(CLzmaEncHandle pp) ++{ ++ #ifndef _7ZIP_ST ++ CLzmaEnc *p = (CLzmaEnc *)pp; ++ if (p->mtMode) ++ MatchFinderMt_ReleaseStream(&p->matchFinderMt); ++ #else ++ pp = pp; ++ #endif ++} ++ ++typedef struct ++{ ++ ISeqOutStream funcTable; ++ Byte *data; ++ SizeT rem; ++ Bool overflow; ++} CSeqOutStreamBuf; ++ ++static size_t MyWrite(void *pp, const void *data, size_t size) ++{ ++ CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp; ++ if (p->rem < size) ++ { ++ size = p->rem; ++ p->overflow = True; ++ } ++ memcpy(p->data, data, size); ++ p->rem -= size; ++ p->data += size; ++ return size; ++} ++ ++static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) ++{ ++ SRes res = SZ_OK; ++ ++ #ifndef _7ZIP_ST ++ Byte allocaDummy[0x300]; ++ int i = 0; ++ for (i = 0; i < 16; i++) ++ allocaDummy[i] = (Byte)i; ++ #endif ++ ++ for (;;) ++ { ++ res = LzmaEnc_CodeOneBlock(p, False, 0, 0); ++ if (res != SZ_OK || p->finished != 0) ++ break; ++ if (progress != 0) ++ { ++ res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); ++ if (res != SZ_OK) ++ { ++ res = SZ_ERROR_PROGRESS; ++ break; ++ } ++ } ++ } ++ LzmaEnc_Finish(p); ++ return res; ++} ++ ++SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) ++{ ++ CLzmaEnc *p = (CLzmaEnc *)pp; ++ int i; ++ UInt32 dictSize = p->dictSize; ++ if (*size < LZMA_PROPS_SIZE) ++ return SZ_ERROR_PARAM; ++ *size = LZMA_PROPS_SIZE; ++ props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); ++ ++ for (i = 11; i <= 30; i++) ++ { ++ if (dictSize <= ((UInt32)2 << i)) ++ { ++ dictSize = (2 << i); ++ break; ++ } ++ if (dictSize <= ((UInt32)3 << i)) ++ { ++ dictSize = (3 << i); ++ break; ++ } ++ } ++ ++ for (i = 0; i < 4; i++) ++ props[1 + i] = (Byte)(dictSize >> (8 * i)); ++ return SZ_OK; ++} ++ ++SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, ++ int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) ++{ ++ SRes res; ++ CLzmaEnc *p = (CLzmaEnc *)pp; ++ ++ CSeqOutStreamBuf outStream; ++ ++ LzmaEnc_SetInputBuf(p, src, srcLen); ++ ++ outStream.funcTable.Write = MyWrite; ++ outStream.data = dest; ++ outStream.rem = *destLen; ++ outStream.overflow = False; ++ ++ p->writeEndMark = writeEndMark; ++ ++ p->rc.outStream = &outStream.funcTable; ++ res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig); ++ if (res == SZ_OK) ++ res = LzmaEnc_Encode2(p, progress); ++ ++ *destLen -= outStream.rem; ++ if (outStream.overflow) ++ return SZ_ERROR_OUTPUT_EOF; ++ return res; ++} +--- /dev/null ++++ b/lib/lzma/Makefile +@@ -0,0 +1,7 @@ ++lzma_compress-objs := LzFind.o LzmaEnc.o ++lzma_decompress-objs := LzmaDec.o ++ ++obj-$(CONFIG_LZMA_COMPRESS) += lzma_compress.o ++obj-$(CONFIG_LZMA_DECOMPRESS) += lzma_decompress.o ++ ++EXTRA_CFLAGS += -Iinclude/linux -Iinclude/linux/lzma -include types.h diff --git a/target/linux/generic/pending-5.10/532-jffs2_eofdetect.patch b/target/linux/generic/pending-5.15/532-jffs2_eofdetect.patch similarity index 100% rename from target/linux/generic/pending-5.10/532-jffs2_eofdetect.patch rename to target/linux/generic/pending-5.15/532-jffs2_eofdetect.patch diff --git a/target/linux/generic/pending-5.15/600-netfilter_conntrack_flush.patch b/target/linux/generic/pending-5.15/600-netfilter_conntrack_flush.patch new file mode 100644 index 0000000000..a88e3d7d9a --- /dev/null +++ b/target/linux/generic/pending-5.15/600-netfilter_conntrack_flush.patch @@ -0,0 +1,88 @@ +From: Felix Fietkau +Subject: netfilter: add support for flushing conntrack via /proc + +lede-commit 8193bbe59a74d34d6a26d4a8cb857b1952905314 +Signed-off-by: Felix Fietkau +--- + net/netfilter/nf_conntrack_standalone.c | 59 ++++++++++++++++++++++++++++++++- + 1 file changed, 58 insertions(+), 1 deletion(-) + +--- a/net/netfilter/nf_conntrack_standalone.c ++++ b/net/netfilter/nf_conntrack_standalone.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + #include + #ifdef CONFIG_SYSCTL + #include +@@ -462,6 +463,56 @@ static int ct_cpu_seq_show(struct seq_fi + return 0; + } + ++struct kill_request { ++ u16 family; ++ union nf_inet_addr addr; ++}; ++ ++static int kill_matching(struct nf_conn *i, void *data) ++{ ++ struct kill_request *kr = data; ++ struct nf_conntrack_tuple *t1 = &i->tuplehash[IP_CT_DIR_ORIGINAL].tuple; ++ struct nf_conntrack_tuple *t2 = &i->tuplehash[IP_CT_DIR_REPLY].tuple; ++ ++ if (!kr->family) ++ return 1; ++ ++ if (t1->src.l3num != kr->family) ++ return 0; ++ ++ return (nf_inet_addr_cmp(&kr->addr, &t1->src.u3) || ++ nf_inet_addr_cmp(&kr->addr, &t1->dst.u3) || ++ nf_inet_addr_cmp(&kr->addr, &t2->src.u3) || ++ nf_inet_addr_cmp(&kr->addr, &t2->dst.u3)); ++} ++ ++static int ct_file_write(struct file *file, char *buf, size_t count) ++{ ++ struct seq_file *seq = file->private_data; ++ struct net *net = seq_file_net(seq); ++ struct kill_request kr = { }; ++ ++ if (count == 0) ++ return 0; ++ ++ if (count >= INET6_ADDRSTRLEN) ++ count = INET6_ADDRSTRLEN - 1; ++ ++ if (strnchr(buf, count, ':')) { ++ kr.family = AF_INET6; ++ if (!in6_pton(buf, count, (void *)&kr.addr, '\n', NULL)) ++ return -EINVAL; ++ } else if (strnchr(buf, count, '.')) { ++ kr.family = AF_INET; ++ if (!in4_pton(buf, count, (void *)&kr.addr, '\n', NULL)) ++ return -EINVAL; ++ } ++ ++ nf_ct_iterate_cleanup_net(net, kill_matching, &kr, 0, 0); ++ ++ return 0; ++} ++ + static const struct seq_operations ct_cpu_seq_ops = { + .start = ct_cpu_seq_start, + .next = ct_cpu_seq_next, +@@ -475,8 +526,9 @@ static int nf_conntrack_standalone_init_ + kuid_t root_uid; + kgid_t root_gid; + +- pde = proc_create_net("nf_conntrack", 0440, net->proc_net, &ct_seq_ops, +- sizeof(struct ct_iter_state)); ++ pde = proc_create_net_data_write("nf_conntrack", 0440, net->proc_net, ++ &ct_seq_ops, &ct_file_write, ++ sizeof(struct ct_iter_state), NULL); + if (!pde) + goto out_nf_conntrack; + diff --git a/target/linux/generic/pending-5.10/610-netfilter_match_bypass_default_checks.patch b/target/linux/generic/pending-5.15/610-netfilter_match_bypass_default_checks.patch similarity index 100% rename from target/linux/generic/pending-5.10/610-netfilter_match_bypass_default_checks.patch rename to target/linux/generic/pending-5.15/610-netfilter_match_bypass_default_checks.patch diff --git a/target/linux/generic/pending-5.10/611-netfilter_match_bypass_default_table.patch b/target/linux/generic/pending-5.15/611-netfilter_match_bypass_default_table.patch similarity index 100% rename from target/linux/generic/pending-5.10/611-netfilter_match_bypass_default_table.patch rename to target/linux/generic/pending-5.15/611-netfilter_match_bypass_default_table.patch diff --git a/target/linux/generic/pending-5.10/612-netfilter_match_reduce_memory_access.patch b/target/linux/generic/pending-5.15/612-netfilter_match_reduce_memory_access.patch similarity index 100% rename from target/linux/generic/pending-5.10/612-netfilter_match_reduce_memory_access.patch rename to target/linux/generic/pending-5.15/612-netfilter_match_reduce_memory_access.patch diff --git a/target/linux/generic/pending-5.10/620-net_sched-codel-do-not-defer-queue-length-update.patch b/target/linux/generic/pending-5.15/620-net_sched-codel-do-not-defer-queue-length-update.patch similarity index 100% rename from target/linux/generic/pending-5.10/620-net_sched-codel-do-not-defer-queue-length-update.patch rename to target/linux/generic/pending-5.15/620-net_sched-codel-do-not-defer-queue-length-update.patch diff --git a/target/linux/generic/pending-5.15/630-packet_socket_type.patch b/target/linux/generic/pending-5.15/630-packet_socket_type.patch new file mode 100644 index 0000000000..c36e9e9fbb --- /dev/null +++ b/target/linux/generic/pending-5.15/630-packet_socket_type.patch @@ -0,0 +1,138 @@ +From: Felix Fietkau +Subject: net: add an optimization for dealing with raw sockets + +lede-commit: 4898039703d7315f0f3431c860123338ec3be0f6 +Signed-off-by: Felix Fietkau +--- + include/uapi/linux/if_packet.h | 3 +++ + net/packet/af_packet.c | 34 +++++++++++++++++++++++++++------- + net/packet/internal.h | 1 + + 3 files changed, 31 insertions(+), 7 deletions(-) + +--- a/include/uapi/linux/if_packet.h ++++ b/include/uapi/linux/if_packet.h +@@ -33,6 +33,8 @@ struct sockaddr_ll { + #define PACKET_KERNEL 7 /* To kernel space */ + /* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */ + #define PACKET_FASTROUTE 6 /* Fastrouted frame */ ++#define PACKET_MASK_ANY 0xffffffff /* mask for packet type bits */ ++ + + /* Packet socket options */ + +@@ -59,6 +61,7 @@ struct sockaddr_ll { + #define PACKET_ROLLOVER_STATS 21 + #define PACKET_FANOUT_DATA 22 + #define PACKET_IGNORE_OUTGOING 23 ++#define PACKET_RECV_TYPE 24 + + #define PACKET_FANOUT_HASH 0 + #define PACKET_FANOUT_LB 1 +--- a/net/packet/af_packet.c ++++ b/net/packet/af_packet.c +@@ -1830,6 +1830,7 @@ static int packet_rcv_spkt(struct sk_buf + { + struct sock *sk; + struct sockaddr_pkt *spkt; ++ struct packet_sock *po; + + /* + * When we registered the protocol we saved the socket in the data +@@ -1837,6 +1838,7 @@ static int packet_rcv_spkt(struct sk_buf + */ + + sk = pt->af_packet_priv; ++ po = pkt_sk(sk); + + /* + * Yank back the headers [hope the device set this +@@ -1849,7 +1851,7 @@ static int packet_rcv_spkt(struct sk_buf + * so that this procedure is noop. + */ + +- if (skb->pkt_type == PACKET_LOOPBACK) ++ if (!(po->pkt_type & (1 << skb->pkt_type))) + goto out; + + if (!net_eq(dev_net(dev), sock_net(sk))) +@@ -2095,12 +2097,12 @@ static int packet_rcv(struct sk_buff *sk + unsigned int snaplen, res; + bool is_drop_n_account = false; + +- if (skb->pkt_type == PACKET_LOOPBACK) +- goto drop; +- + sk = pt->af_packet_priv; + po = pkt_sk(sk); + ++ if (!(po->pkt_type & (1 << skb->pkt_type))) ++ goto drop; ++ + if (!net_eq(dev_net(dev), sock_net(sk))) + goto drop; + +@@ -2226,12 +2228,12 @@ static int tpacket_rcv(struct sk_buff *s + BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32); + BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48); + +- if (skb->pkt_type == PACKET_LOOPBACK) +- goto drop; +- + sk = pt->af_packet_priv; + po = pkt_sk(sk); + ++ if (!(po->pkt_type & (1 << skb->pkt_type))) ++ goto drop; ++ + if (!net_eq(dev_net(dev), sock_net(sk))) + goto drop; + +@@ -3346,6 +3348,7 @@ static int packet_create(struct net *net + mutex_init(&po->pg_vec_lock); + po->rollover = NULL; + po->prot_hook.func = packet_rcv; ++ po->pkt_type = PACKET_MASK_ANY & ~(1 << PACKET_LOOPBACK); + + if (sock->type == SOCK_PACKET) + po->prot_hook.func = packet_rcv_spkt; +@@ -3983,6 +3986,16 @@ packet_setsockopt(struct socket *sock, i + WRITE_ONCE(po->xmit, val ? packet_direct_xmit : dev_queue_xmit); + return 0; + } ++ case PACKET_RECV_TYPE: ++ { ++ unsigned int val; ++ if (optlen != sizeof(val)) ++ return -EINVAL; ++ if (copy_from_sockptr(&val, optval, sizeof(val))) ++ return -EFAULT; ++ po->pkt_type = val & ~BIT(PACKET_LOOPBACK); ++ return 0; ++ } + default: + return -ENOPROTOOPT; + } +@@ -4039,6 +4052,13 @@ static int packet_getsockopt(struct sock + case PACKET_VNET_HDR: + val = po->has_vnet_hdr; + break; ++ case PACKET_RECV_TYPE: ++ if (len > sizeof(unsigned int)) ++ len = sizeof(unsigned int); ++ val = po->pkt_type; ++ ++ data = &val; ++ break; + case PACKET_VERSION: + val = po->tp_version; + break; +--- a/net/packet/internal.h ++++ b/net/packet/internal.h +@@ -136,6 +136,7 @@ struct packet_sock { + int (*xmit)(struct sk_buff *skb); + struct packet_type prot_hook ____cacheline_aligned_in_smp; + atomic_t tp_drops ____cacheline_aligned_in_smp; ++ unsigned int pkt_type; + }; + + static inline struct packet_sock *pkt_sk(struct sock *sk) diff --git a/target/linux/generic/pending-5.15/655-increase_skb_pad.patch b/target/linux/generic/pending-5.15/655-increase_skb_pad.patch new file mode 100644 index 0000000000..5d100270a9 --- /dev/null +++ b/target/linux/generic/pending-5.15/655-increase_skb_pad.patch @@ -0,0 +1,20 @@ +From: Felix Fietkau +Subject: kernel: add a few patches for avoiding unnecessary skb reallocations - significantly improves ethernet<->wireless performance + +lede-commit: 6f89cffc9add6939d44a6b54cf9a5e77849aa7fd +Signed-off-by: Felix Fietkau +--- + include/linux/skbuff.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/include/linux/skbuff.h ++++ b/include/linux/skbuff.h +@@ -2821,7 +2821,7 @@ static inline int pskb_network_may_pull( + * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8) + */ + #ifndef NET_SKB_PAD +-#define NET_SKB_PAD max(32, L1_CACHE_BYTES) ++#define NET_SKB_PAD max(64, L1_CACHE_BYTES) + #endif + + int ___pskb_trim(struct sk_buff *skb, unsigned int len); diff --git a/target/linux/generic/pending-5.15/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch b/target/linux/generic/pending-5.15/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch new file mode 100644 index 0000000000..2f6fbd59e4 --- /dev/null +++ b/target/linux/generic/pending-5.15/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch @@ -0,0 +1,511 @@ +From: Steven Barth +Subject: Add support for MAP-E FMRs (mesh mode) + +MAP-E FMRs (draft-ietf-softwire-map-10) are rules for IPv4-communication +between MAP CEs (mesh mode) without the need to forward such data to a +border relay. This is similar to how 6rd works but for IPv4 over IPv6. + +Signed-off-by: Steven Barth +--- + include/net/ip6_tunnel.h | 13 ++ + include/uapi/linux/if_tunnel.h | 13 ++ + net/ipv6/ip6_tunnel.c | 276 +++++++++++++++++++++++++++++++++++++++-- + 3 files changed, 291 insertions(+), 11 deletions(-) + +--- a/include/net/ip6_tunnel.h ++++ b/include/net/ip6_tunnel.h +@@ -18,6 +18,18 @@ + /* determine capability on a per-packet basis */ + #define IP6_TNL_F_CAP_PER_PACKET 0x40000 + ++/* IPv6 tunnel FMR */ ++struct __ip6_tnl_fmr { ++ struct __ip6_tnl_fmr *next; /* next fmr in list */ ++ struct in6_addr ip6_prefix; ++ struct in_addr ip4_prefix; ++ ++ __u8 ip6_prefix_len; ++ __u8 ip4_prefix_len; ++ __u8 ea_len; ++ __u8 offset; ++}; ++ + struct __ip6_tnl_parm { + char name[IFNAMSIZ]; /* name of tunnel device */ + int link; /* ifindex of underlying L2 interface */ +@@ -29,6 +41,7 @@ struct __ip6_tnl_parm { + __u32 flags; /* tunnel flags */ + struct in6_addr laddr; /* local tunnel end-point address */ + struct in6_addr raddr; /* remote tunnel end-point address */ ++ struct __ip6_tnl_fmr *fmrs; /* FMRs */ + + __be16 i_flags; + __be16 o_flags; +--- a/include/uapi/linux/if_tunnel.h ++++ b/include/uapi/linux/if_tunnel.h +@@ -77,10 +77,23 @@ enum { + IFLA_IPTUN_ENCAP_DPORT, + IFLA_IPTUN_COLLECT_METADATA, + IFLA_IPTUN_FWMARK, ++ IFLA_IPTUN_FMRS, + __IFLA_IPTUN_MAX, + }; + #define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1) + ++enum { ++ IFLA_IPTUN_FMR_UNSPEC, ++ IFLA_IPTUN_FMR_IP6_PREFIX, ++ IFLA_IPTUN_FMR_IP4_PREFIX, ++ IFLA_IPTUN_FMR_IP6_PREFIX_LEN, ++ IFLA_IPTUN_FMR_IP4_PREFIX_LEN, ++ IFLA_IPTUN_FMR_EA_LEN, ++ IFLA_IPTUN_FMR_OFFSET, ++ __IFLA_IPTUN_FMR_MAX, ++}; ++#define IFLA_IPTUN_FMR_MAX (__IFLA_IPTUN_FMR_MAX - 1) ++ + enum tunnel_encap_types { + TUNNEL_ENCAP_NONE, + TUNNEL_ENCAP_FOU, +--- a/net/ipv6/ip6_tunnel.c ++++ b/net/ipv6/ip6_tunnel.c +@@ -11,6 +11,9 @@ + * linux/net/ipv6/sit.c and linux/net/ipv4/ipip.c + * + * RFC 2473 ++ * ++ * Changes: ++ * Steven Barth : MAP-E FMR support + */ + + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +@@ -67,9 +70,9 @@ static bool log_ecn_error = true; + module_param(log_ecn_error, bool, 0644); + MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN"); + +-static u32 HASH(const struct in6_addr *addr1, const struct in6_addr *addr2) ++static u32 HASH(const struct in6_addr *addr) + { +- u32 hash = ipv6_addr_hash(addr1) ^ ipv6_addr_hash(addr2); ++ u32 hash = ipv6_addr_hash(addr); + + return hash_32(hash, IP6_TUNNEL_HASH_SIZE_SHIFT); + } +@@ -114,17 +117,33 @@ static struct ip6_tnl * + ip6_tnl_lookup(struct net *net, int link, + const struct in6_addr *remote, const struct in6_addr *local) + { +- unsigned int hash = HASH(remote, local); ++ unsigned int hash = HASH(local); + struct ip6_tnl *t, *cand = NULL; + struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); + struct in6_addr any; + + for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) { + if (!ipv6_addr_equal(local, &t->parms.laddr) || +- !ipv6_addr_equal(remote, &t->parms.raddr) || + !(t->dev->flags & IFF_UP)) + continue; + ++ if (!ipv6_addr_equal(remote, &t->parms.raddr)) { ++ struct __ip6_tnl_fmr *fmr; ++ bool found = false; ++ ++ for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) { ++ if (!ipv6_prefix_equal(remote, &fmr->ip6_prefix, ++ fmr->ip6_prefix_len)) ++ continue; ++ ++ found = true; ++ break; ++ } ++ ++ if (!found) ++ continue; ++ } ++ + if (link == t->parms.link) + return t; + else +@@ -132,7 +151,7 @@ ip6_tnl_lookup(struct net *net, int link + } + + memset(&any, 0, sizeof(any)); +- hash = HASH(&any, local); ++ hash = HASH(local); + for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) { + if (!ipv6_addr_equal(local, &t->parms.laddr) || + !ipv6_addr_any(&t->parms.raddr) || +@@ -145,7 +164,7 @@ ip6_tnl_lookup(struct net *net, int link + cand = t; + } + +- hash = HASH(remote, &any); ++ hash = HASH(&any); + for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) { + if (!ipv6_addr_equal(remote, &t->parms.raddr) || + !ipv6_addr_any(&t->parms.laddr) || +@@ -194,7 +213,7 @@ ip6_tnl_bucket(struct ip6_tnl_net *ip6n, + + if (!ipv6_addr_any(remote) || !ipv6_addr_any(local)) { + prio = 1; +- h = HASH(remote, local); ++ h = HASH(local); + } + return &ip6n->tnls[prio][h]; + } +@@ -378,6 +397,12 @@ ip6_tnl_dev_uninit(struct net_device *de + struct net *net = t->net; + struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); + ++ while (t->parms.fmrs) { ++ struct __ip6_tnl_fmr *next = t->parms.fmrs->next; ++ kfree(t->parms.fmrs); ++ t->parms.fmrs = next; ++ } ++ + if (dev == ip6n->fb_tnl_dev) + RCU_INIT_POINTER(ip6n->tnls_wc[0], NULL); + else +@@ -790,6 +815,107 @@ int ip6_tnl_rcv_ctl(struct ip6_tnl *t, + } + EXPORT_SYMBOL_GPL(ip6_tnl_rcv_ctl); + ++/** ++ * ip4ip6_fmr_calc - calculate target / source IPv6-address based on FMR ++ * @dest: destination IPv6 address buffer ++ * @skb: received socket buffer ++ * @fmr: MAP FMR ++ * @xmit: Calculate for xmit or rcv ++ **/ ++static void ip4ip6_fmr_calc(struct in6_addr *dest, ++ const struct iphdr *iph, const uint8_t *end, ++ const struct __ip6_tnl_fmr *fmr, bool xmit) ++{ ++ int psidlen = fmr->ea_len - (32 - fmr->ip4_prefix_len); ++ u8 *portp = NULL; ++ bool use_dest_addr; ++ const struct iphdr *dsth = iph; ++ ++ if ((u8*)dsth >= end) ++ return; ++ ++ /* find significant IP header */ ++ if (iph->protocol == IPPROTO_ICMP) { ++ struct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4); ++ if (ih && ((u8*)&ih[1]) <= end && ( ++ ih->type == ICMP_DEST_UNREACH || ++ ih->type == ICMP_SOURCE_QUENCH || ++ ih->type == ICMP_TIME_EXCEEDED || ++ ih->type == ICMP_PARAMETERPROB || ++ ih->type == ICMP_REDIRECT)) ++ dsth = (const struct iphdr*)&ih[1]; ++ } ++ ++ /* in xmit-path use dest port by default and source port only if ++ this is an ICMP reply to something else; vice versa in rcv-path */ ++ use_dest_addr = (xmit && dsth == iph) || (!xmit && dsth != iph); ++ ++ /* get dst port */ ++ if (((u8*)&dsth[1]) <= end && ( ++ dsth->protocol == IPPROTO_UDP || ++ dsth->protocol == IPPROTO_TCP || ++ dsth->protocol == IPPROTO_SCTP || ++ dsth->protocol == IPPROTO_DCCP)) { ++ /* for UDP, TCP, SCTP and DCCP source and dest port ++ follow IPv4 header directly */ ++ portp = ((u8*)dsth) + dsth->ihl * 4; ++ ++ if (use_dest_addr) ++ portp += sizeof(u16); ++ } else if (iph->protocol == IPPROTO_ICMP) { ++ struct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4); ++ ++ /* use icmp identifier as port */ ++ if (((u8*)&ih) <= end && ( ++ (use_dest_addr && ( ++ ih->type == ICMP_ECHOREPLY || ++ ih->type == ICMP_TIMESTAMPREPLY || ++ ih->type == ICMP_INFO_REPLY || ++ ih->type == ICMP_ADDRESSREPLY)) || ++ (!use_dest_addr && ( ++ ih->type == ICMP_ECHO || ++ ih->type == ICMP_TIMESTAMP || ++ ih->type == ICMP_INFO_REQUEST || ++ ih->type == ICMP_ADDRESS) ++ ))) ++ portp = (u8*)&ih->un.echo.id; ++ } ++ ++ if ((portp && &portp[2] <= end) || psidlen == 0) { ++ int frombyte = fmr->ip6_prefix_len / 8; ++ int fromrem = fmr->ip6_prefix_len % 8; ++ int bytes = sizeof(struct in6_addr) - frombyte; ++ const u32 *addr = (use_dest_addr) ? &iph->daddr : &iph->saddr; ++ u64 eabits = ((u64)ntohl(*addr)) << (32 + fmr->ip4_prefix_len); ++ u64 t = 0; ++ ++ /* extract PSID from port and add it to eabits */ ++ u16 psidbits = 0; ++ if (psidlen > 0) { ++ psidbits = ((u16)portp[0]) << 8 | ((u16)portp[1]); ++ psidbits >>= 16 - psidlen - fmr->offset; ++ psidbits = (u16)(psidbits << (16 - psidlen)); ++ eabits |= ((u64)psidbits) << (48 - (fmr->ea_len - psidlen)); ++ } ++ ++ /* rewrite destination address */ ++ *dest = fmr->ip6_prefix; ++ memcpy(&dest->s6_addr[10], addr, sizeof(*addr)); ++ dest->s6_addr16[7] = htons(psidbits >> (16 - psidlen)); ++ ++ if (bytes > sizeof(u64)) ++ bytes = sizeof(u64); ++ ++ /* insert eabits */ ++ memcpy(&t, &dest->s6_addr[frombyte], bytes); ++ t = be64_to_cpu(t) & ~(((((u64)1) << fmr->ea_len) - 1) ++ << (64 - fmr->ea_len - fromrem)); ++ t = cpu_to_be64(t | (eabits >> fromrem)); ++ memcpy(&dest->s6_addr[frombyte], &t, bytes); ++ } ++} ++ ++ + static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb, + const struct tnl_ptk_info *tpi, + struct metadata_dst *tun_dst, +@@ -843,6 +969,27 @@ static int __ip6_tnl_rcv(struct ip6_tnl + skb_reset_network_header(skb); + memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); + ++ if (tpi->proto == htons(ETH_P_IP) && tunnel->parms.fmrs && ++ !ipv6_addr_equal(&ipv6h->saddr, &tunnel->parms.raddr)) { ++ /* Packet didn't come from BR, so lookup FMR */ ++ struct __ip6_tnl_fmr *fmr; ++ struct in6_addr expected = tunnel->parms.raddr; ++ for (fmr = tunnel->parms.fmrs; fmr; fmr = fmr->next) ++ if (ipv6_prefix_equal(&ipv6h->saddr, ++ &fmr->ip6_prefix, fmr->ip6_prefix_len)) ++ break; ++ ++ /* Check that IPv6 matches IPv4 source to prevent spoofing */ ++ if (fmr) ++ ip4ip6_fmr_calc(&expected, ip_hdr(skb), ++ skb_tail_pointer(skb), fmr, false); ++ ++ if (!ipv6_addr_equal(&ipv6h->saddr, &expected)) { ++ rcu_read_unlock(); ++ goto drop; ++ } ++ } ++ + __skb_tunnel_rx(skb, tunnel->dev, tunnel->net); + + err = dscp_ecn_decapsulate(tunnel, ipv6h, skb); +@@ -994,6 +1141,7 @@ static void init_tel_txopt(struct ipv6_t + opt->ops.opt_nflen = 8; + } + ++ + /** + * ip6_tnl_addr_conflict - compare packet addresses to tunnel's own + * @t: the outgoing tunnel device +@@ -1274,6 +1422,7 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str + u8 protocol) + { + struct ip6_tnl *t = netdev_priv(dev); ++ struct __ip6_tnl_fmr *fmr; + struct ipv6hdr *ipv6h; + const struct iphdr *iph; + int encap_limit = -1; +@@ -1373,6 +1522,18 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str + fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL); + dsfield = INET_ECN_encapsulate(dsfield, orig_dsfield); + ++ /* try to find matching FMR */ ++ for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) { ++ unsigned mshift = 32 - fmr->ip4_prefix_len; ++ if (ntohl(fmr->ip4_prefix.s_addr) >> mshift == ++ ntohl(ip_hdr(skb)->daddr) >> mshift) ++ break; ++ } ++ ++ /* change dstaddr according to FMR */ ++ if (fmr) ++ ip4ip6_fmr_calc(&fl6.daddr, ip_hdr(skb), skb_tail_pointer(skb), fmr, true); ++ + if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) + return -1; + +@@ -1526,6 +1687,14 @@ ip6_tnl_change(struct ip6_tnl *t, const + t->parms.link = p->link; + t->parms.proto = p->proto; + t->parms.fwmark = p->fwmark; ++ ++ while (t->parms.fmrs) { ++ struct __ip6_tnl_fmr *next = t->parms.fmrs->next; ++ kfree(t->parms.fmrs); ++ t->parms.fmrs = next; ++ } ++ t->parms.fmrs = p->fmrs; ++ + dst_cache_reset(&t->dst_cache); + ip6_tnl_link_config(t); + return 0; +@@ -1564,6 +1733,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_ + p->flowinfo = u->flowinfo; + p->link = u->link; + p->proto = u->proto; ++ p->fmrs = NULL; + memcpy(p->name, u->name, sizeof(u->name)); + } + +@@ -1950,6 +2120,15 @@ static int ip6_tnl_validate(struct nlatt + return 0; + } + ++static const struct nla_policy ip6_tnl_fmr_policy[IFLA_IPTUN_FMR_MAX + 1] = { ++ [IFLA_IPTUN_FMR_IP6_PREFIX] = { .len = sizeof(struct in6_addr) }, ++ [IFLA_IPTUN_FMR_IP4_PREFIX] = { .len = sizeof(struct in_addr) }, ++ [IFLA_IPTUN_FMR_IP6_PREFIX_LEN] = { .type = NLA_U8 }, ++ [IFLA_IPTUN_FMR_IP4_PREFIX_LEN] = { .type = NLA_U8 }, ++ [IFLA_IPTUN_FMR_EA_LEN] = { .type = NLA_U8 }, ++ [IFLA_IPTUN_FMR_OFFSET] = { .type = NLA_U8 } ++}; ++ + static void ip6_tnl_netlink_parms(struct nlattr *data[], + struct __ip6_tnl_parm *parms) + { +@@ -1987,6 +2166,46 @@ static void ip6_tnl_netlink_parms(struct + + if (data[IFLA_IPTUN_FWMARK]) + parms->fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]); ++ ++ if (data[IFLA_IPTUN_FMRS]) { ++ unsigned rem; ++ struct nlattr *fmr; ++ nla_for_each_nested(fmr, data[IFLA_IPTUN_FMRS], rem) { ++ struct nlattr *fmrd[IFLA_IPTUN_FMR_MAX + 1], *c; ++ struct __ip6_tnl_fmr *nfmr; ++ ++ nla_parse_nested(fmrd, IFLA_IPTUN_FMR_MAX, ++ fmr, ip6_tnl_fmr_policy, NULL); ++ ++ if (!(nfmr = kzalloc(sizeof(*nfmr), GFP_KERNEL))) ++ continue; ++ ++ nfmr->offset = 6; ++ ++ if ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX])) ++ nla_memcpy(&nfmr->ip6_prefix, fmrd[IFLA_IPTUN_FMR_IP6_PREFIX], ++ sizeof(nfmr->ip6_prefix)); ++ ++ if ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX])) ++ nla_memcpy(&nfmr->ip4_prefix, fmrd[IFLA_IPTUN_FMR_IP4_PREFIX], ++ sizeof(nfmr->ip4_prefix)); ++ ++ if ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX_LEN])) ++ nfmr->ip6_prefix_len = nla_get_u8(c); ++ ++ if ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX_LEN])) ++ nfmr->ip4_prefix_len = nla_get_u8(c); ++ ++ if ((c = fmrd[IFLA_IPTUN_FMR_EA_LEN])) ++ nfmr->ea_len = nla_get_u8(c); ++ ++ if ((c = fmrd[IFLA_IPTUN_FMR_OFFSET])) ++ nfmr->offset = nla_get_u8(c); ++ ++ nfmr->next = parms->fmrs; ++ parms->fmrs = nfmr; ++ } ++ } + } + + static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[], +@@ -2102,6 +2321,12 @@ static void ip6_tnl_dellink(struct net_d + + static size_t ip6_tnl_get_size(const struct net_device *dev) + { ++ const struct ip6_tnl *t = netdev_priv(dev); ++ struct __ip6_tnl_fmr *c; ++ int fmrs = 0; ++ for (c = t->parms.fmrs; c; c = c->next) ++ ++fmrs; ++ + return + /* IFLA_IPTUN_LINK */ + nla_total_size(4) + +@@ -2131,6 +2356,24 @@ static size_t ip6_tnl_get_size(const str + nla_total_size(0) + + /* IFLA_IPTUN_FWMARK */ + nla_total_size(4) + ++ /* IFLA_IPTUN_FMRS */ ++ nla_total_size(0) + ++ ( ++ /* nest */ ++ nla_total_size(0) + ++ /* IFLA_IPTUN_FMR_IP6_PREFIX */ ++ nla_total_size(sizeof(struct in6_addr)) + ++ /* IFLA_IPTUN_FMR_IP4_PREFIX */ ++ nla_total_size(sizeof(struct in_addr)) + ++ /* IFLA_IPTUN_FMR_EA_LEN */ ++ nla_total_size(1) + ++ /* IFLA_IPTUN_FMR_IP6_PREFIX_LEN */ ++ nla_total_size(1) + ++ /* IFLA_IPTUN_FMR_IP4_PREFIX_LEN */ ++ nla_total_size(1) + ++ /* IFLA_IPTUN_FMR_OFFSET */ ++ nla_total_size(1) ++ ) * fmrs + + 0; + } + +@@ -2138,6 +2381,9 @@ static int ip6_tnl_fill_info(struct sk_b + { + struct ip6_tnl *tunnel = netdev_priv(dev); + struct __ip6_tnl_parm *parm = &tunnel->parms; ++ struct __ip6_tnl_fmr *c; ++ int fmrcnt = 0; ++ struct nlattr *fmrs; + + if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) || + nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) || +@@ -2147,9 +2393,27 @@ static int ip6_tnl_fill_info(struct sk_b + nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) || + nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) || + nla_put_u8(skb, IFLA_IPTUN_PROTO, parm->proto) || +- nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark)) ++ nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark) || ++ !(fmrs = nla_nest_start(skb, IFLA_IPTUN_FMRS))) + goto nla_put_failure; + ++ for (c = parm->fmrs; c; c = c->next) { ++ struct nlattr *fmr = nla_nest_start(skb, ++fmrcnt); ++ if (!fmr || ++ nla_put(skb, IFLA_IPTUN_FMR_IP6_PREFIX, ++ sizeof(c->ip6_prefix), &c->ip6_prefix) || ++ nla_put(skb, IFLA_IPTUN_FMR_IP4_PREFIX, ++ sizeof(c->ip4_prefix), &c->ip4_prefix) || ++ nla_put_u8(skb, IFLA_IPTUN_FMR_IP6_PREFIX_LEN, c->ip6_prefix_len) || ++ nla_put_u8(skb, IFLA_IPTUN_FMR_IP4_PREFIX_LEN, c->ip4_prefix_len) || ++ nla_put_u8(skb, IFLA_IPTUN_FMR_EA_LEN, c->ea_len) || ++ nla_put_u8(skb, IFLA_IPTUN_FMR_OFFSET, c->offset)) ++ goto nla_put_failure; ++ ++ nla_nest_end(skb, fmr); ++ } ++ nla_nest_end(skb, fmrs); ++ + if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, tunnel->encap.type) || + nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, tunnel->encap.sport) || + nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, tunnel->encap.dport) || +@@ -2189,6 +2453,7 @@ static const struct nla_policy ip6_tnl_p + [IFLA_IPTUN_ENCAP_DPORT] = { .type = NLA_U16 }, + [IFLA_IPTUN_COLLECT_METADATA] = { .type = NLA_FLAG }, + [IFLA_IPTUN_FWMARK] = { .type = NLA_U32 }, ++ [IFLA_IPTUN_FMRS] = { .type = NLA_NESTED }, + }; + + static struct rtnl_link_ops ip6_link_ops __read_mostly = { diff --git a/target/linux/generic/pending-5.15/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch b/target/linux/generic/pending-5.15/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch new file mode 100644 index 0000000000..7aaac96531 --- /dev/null +++ b/target/linux/generic/pending-5.15/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch @@ -0,0 +1,263 @@ +From: Jonas Gorski +Subject: ipv6: allow rejecting with "source address failed policy" + +RFC6204 L-14 requires rejecting traffic from invalid addresses with +ICMPv6 Destination Unreachable, Code 5 (Source address failed ingress/ +egress policy) on the LAN side, so add an appropriate rule for that. + +Signed-off-by: Jonas Gorski +--- + include/net/netns/ipv6.h | 1 + + include/uapi/linux/fib_rules.h | 4 +++ + include/uapi/linux/rtnetlink.h | 1 + + net/ipv4/fib_semantics.c | 4 +++ + net/ipv4/fib_trie.c | 1 + + net/ipv4/ipmr.c | 1 + + net/ipv6/fib6_rules.c | 4 +++ + net/ipv6/ip6mr.c | 2 ++ + net/ipv6/route.c | 58 +++++++++++++++++++++++++++++++++++++++++- + 9 files changed, 75 insertions(+), 1 deletion(-) + +--- a/include/net/netns/ipv6.h ++++ b/include/net/netns/ipv6.h +@@ -85,6 +85,7 @@ struct netns_ipv6 { + unsigned int fib6_routes_require_src; + #endif + struct rt6_info *ip6_prohibit_entry; ++ struct rt6_info *ip6_policy_failed_entry; + struct rt6_info *ip6_blk_hole_entry; + struct fib6_table *fib6_local_tbl; + struct fib_rules_ops *fib6_rules_ops; +--- a/include/uapi/linux/fib_rules.h ++++ b/include/uapi/linux/fib_rules.h +@@ -82,6 +82,10 @@ enum { + FR_ACT_BLACKHOLE, /* Drop without notification */ + FR_ACT_UNREACHABLE, /* Drop with ENETUNREACH */ + FR_ACT_PROHIBIT, /* Drop with EACCES */ ++ FR_ACT_RES9, ++ FR_ACT_RES10, ++ FR_ACT_RES11, ++ FR_ACT_POLICY_FAILED, /* Drop with EACCES */ + __FR_ACT_MAX, + }; + +--- a/include/uapi/linux/rtnetlink.h ++++ b/include/uapi/linux/rtnetlink.h +@@ -256,6 +256,7 @@ enum { + RTN_THROW, /* Not in this table */ + RTN_NAT, /* Translate this address */ + RTN_XRESOLVE, /* Use external resolver */ ++ RTN_POLICY_FAILED, /* Failed ingress/egress policy */ + __RTN_MAX + }; + +--- a/net/ipv4/fib_semantics.c ++++ b/net/ipv4/fib_semantics.c +@@ -143,6 +143,10 @@ const struct fib_prop fib_props[RTN_MAX + .error = -EINVAL, + .scope = RT_SCOPE_NOWHERE, + }, ++ [RTN_POLICY_FAILED] = { ++ .error = -EACCES, ++ .scope = RT_SCOPE_UNIVERSE, ++ }, + }; + + static void rt_fibinfo_free(struct rtable __rcu **rtp) +--- a/net/ipv4/fib_trie.c ++++ b/net/ipv4/fib_trie.c +@@ -2777,6 +2777,7 @@ static const char *const rtn_type_names[ + [RTN_THROW] = "THROW", + [RTN_NAT] = "NAT", + [RTN_XRESOLVE] = "XRESOLVE", ++ [RTN_POLICY_FAILED] = "POLICY_FAILED", + }; + + static inline const char *rtn_type(char *buf, size_t len, unsigned int t) +--- a/net/ipv4/ipmr.c ++++ b/net/ipv4/ipmr.c +@@ -175,6 +175,7 @@ static int ipmr_rule_action(struct fib_r + case FR_ACT_UNREACHABLE: + return -ENETUNREACH; + case FR_ACT_PROHIBIT: ++ case FR_ACT_POLICY_FAILED: + return -EACCES; + case FR_ACT_BLACKHOLE: + default: +--- a/net/ipv6/fib6_rules.c ++++ b/net/ipv6/fib6_rules.c +@@ -220,6 +220,10 @@ static int __fib6_rule_action(struct fib + err = -EACCES; + rt = net->ipv6.ip6_prohibit_entry; + goto discard_pkt; ++ case FR_ACT_POLICY_FAILED: ++ err = -EACCES; ++ rt = net->ipv6.ip6_policy_failed_entry; ++ goto discard_pkt; + } + + tb_id = fib_rule_get_table(rule, arg); +--- a/net/ipv6/ip6mr.c ++++ b/net/ipv6/ip6mr.c +@@ -163,6 +163,8 @@ static int ip6mr_rule_action(struct fib_ + return -ENETUNREACH; + case FR_ACT_PROHIBIT: + return -EACCES; ++ case FR_ACT_POLICY_FAILED: ++ return -EACCES; + case FR_ACT_BLACKHOLE: + default: + return -EINVAL; +--- a/net/ipv6/route.c ++++ b/net/ipv6/route.c +@@ -97,6 +97,8 @@ static int ip6_pkt_discard(struct sk_bu + static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb); + static int ip6_pkt_prohibit(struct sk_buff *skb); + static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb); ++static int ip6_pkt_policy_failed(struct sk_buff *skb); ++static int ip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb); + static void ip6_link_failure(struct sk_buff *skb); + static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, + struct sk_buff *skb, u32 mtu, +@@ -312,6 +314,18 @@ static const struct rt6_info ip6_prohibi + .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), + }; + ++static const struct rt6_info ip6_policy_failed_entry_template = { ++ .dst = { ++ .__refcnt = ATOMIC_INIT(1), ++ .__use = 1, ++ .obsolete = DST_OBSOLETE_FORCE_CHK, ++ .error = -EACCES, ++ .input = ip6_pkt_policy_failed, ++ .output = ip6_pkt_policy_failed_out, ++ }, ++ .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), ++}; ++ + static const struct rt6_info ip6_blk_hole_entry_template = { + .dst = { + .__refcnt = ATOMIC_INIT(1), +@@ -1033,6 +1047,7 @@ static const int fib6_prop[RTN_MAX + 1] + [RTN_BLACKHOLE] = -EINVAL, + [RTN_UNREACHABLE] = -EHOSTUNREACH, + [RTN_PROHIBIT] = -EACCES, ++ [RTN_POLICY_FAILED] = -EACCES, + [RTN_THROW] = -EAGAIN, + [RTN_NAT] = -EINVAL, + [RTN_XRESOLVE] = -EINVAL, +@@ -1068,6 +1083,10 @@ static void ip6_rt_init_dst_reject(struc + rt->dst.output = ip6_pkt_prohibit_out; + rt->dst.input = ip6_pkt_prohibit; + break; ++ case RTN_POLICY_FAILED: ++ rt->dst.output = ip6_pkt_policy_failed_out; ++ rt->dst.input = ip6_pkt_policy_failed; ++ break; + case RTN_THROW: + case RTN_UNREACHABLE: + default: +@@ -4560,6 +4579,17 @@ static int ip6_pkt_prohibit_out(struct n + return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES); + } + ++static int ip6_pkt_policy_failed(struct sk_buff *skb) ++{ ++ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_INNOROUTES); ++} ++ ++static int ip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb) ++{ ++ skb->dev = skb_dst(skb)->dev; ++ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_OUTNOROUTES); ++} ++ + /* + * Allocate a dst for local (unicast / anycast) address. + */ +@@ -5047,7 +5077,8 @@ static int rtm_to_fib6_config(struct sk_ + if (rtm->rtm_type == RTN_UNREACHABLE || + rtm->rtm_type == RTN_BLACKHOLE || + rtm->rtm_type == RTN_PROHIBIT || +- rtm->rtm_type == RTN_THROW) ++ rtm->rtm_type == RTN_THROW || ++ rtm->rtm_type == RTN_POLICY_FAILED) + cfg->fc_flags |= RTF_REJECT; + + if (rtm->rtm_type == RTN_LOCAL) +@@ -6301,6 +6332,8 @@ static int ip6_route_dev_notify(struct n + #ifdef CONFIG_IPV6_MULTIPLE_TABLES + net->ipv6.ip6_prohibit_entry->dst.dev = dev; + net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev); ++ net->ipv6.ip6_policy_failed_entry->dst.dev = dev; ++ net->ipv6.ip6_policy_failed_entry->rt6i_idev = in6_dev_get(dev); + net->ipv6.ip6_blk_hole_entry->dst.dev = dev; + net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev); + #endif +@@ -6312,6 +6345,7 @@ static int ip6_route_dev_notify(struct n + in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev); + #ifdef CONFIG_IPV6_MULTIPLE_TABLES + in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev); ++ in6_dev_put_clear(&net->ipv6.ip6_policy_failed_entry->rt6i_idev); + in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev); + #endif + } +@@ -6503,6 +6537,8 @@ static int __net_init ip6_route_net_init + + #ifdef CONFIG_IPV6_MULTIPLE_TABLES + net->ipv6.fib6_has_custom_rules = false; ++ ++ + net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template, + sizeof(*net->ipv6.ip6_prohibit_entry), + GFP_KERNEL); +@@ -6513,11 +6549,21 @@ static int __net_init ip6_route_net_init + ip6_template_metrics, true); + INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->rt6i_uncached); + ++ net->ipv6.ip6_policy_failed_entry = ++ kmemdup(&ip6_policy_failed_entry_template, ++ sizeof(*net->ipv6.ip6_policy_failed_entry), GFP_KERNEL); ++ if (!net->ipv6.ip6_policy_failed_entry) ++ goto out_ip6_prohibit_entry; ++ net->ipv6.ip6_policy_failed_entry->dst.ops = &net->ipv6.ip6_dst_ops; ++ dst_init_metrics(&net->ipv6.ip6_policy_failed_entry->dst, ++ ip6_template_metrics, true); ++ INIT_LIST_HEAD(&net->ipv6.ip6_policy_failed_entry->rt6i_uncached); ++ + net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template, + sizeof(*net->ipv6.ip6_blk_hole_entry), + GFP_KERNEL); + if (!net->ipv6.ip6_blk_hole_entry) +- goto out_ip6_prohibit_entry; ++ goto out_ip6_policy_failed_entry; + net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops; + dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst, + ip6_template_metrics, true); +@@ -6544,6 +6590,8 @@ out: + return ret; + + #ifdef CONFIG_IPV6_MULTIPLE_TABLES ++out_ip6_policy_failed_entry: ++ kfree(net->ipv6.ip6_policy_failed_entry); + out_ip6_prohibit_entry: + kfree(net->ipv6.ip6_prohibit_entry); + out_ip6_null_entry: +@@ -6563,6 +6611,7 @@ static void __net_exit ip6_route_net_exi + kfree(net->ipv6.ip6_null_entry); + #ifdef CONFIG_IPV6_MULTIPLE_TABLES + kfree(net->ipv6.ip6_prohibit_entry); ++ kfree(net->ipv6.ip6_policy_failed_entry); + kfree(net->ipv6.ip6_blk_hole_entry); + #endif + dst_entries_destroy(&net->ipv6.ip6_dst_ops); +@@ -6646,6 +6695,9 @@ void __init ip6_route_init_special_entri + init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); + init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev; + init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); ++ init_net.ipv6.ip6_policy_failed_entry->dst.dev = init_net.loopback_dev; ++ init_net.ipv6.ip6_policy_failed_entry->rt6i_idev = ++ in6_dev_get(init_net.loopback_dev); + #endif + } + diff --git a/target/linux/generic/pending-5.15/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch b/target/linux/generic/pending-5.15/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch new file mode 100644 index 0000000000..bea43b2bad --- /dev/null +++ b/target/linux/generic/pending-5.15/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch @@ -0,0 +1,50 @@ +From: Jonas Gorski +Subject: net: provide defines for _POLICY_FAILED until all code is updated + +Upstream introduced ICMPV6_POLICY_FAIL for code 5 of destination +unreachable, conflicting with our name. + +Add appropriate defines to allow our code to build with the new +name until we have updated our local patches for older kernels +and userspace packages. + +Signed-off-by: Jonas Gorski +--- + include/uapi/linux/fib_rules.h | 2 ++ + include/uapi/linux/icmpv6.h | 2 ++ + include/uapi/linux/rtnetlink.h | 2 ++ + 3 files changed, 6 insertions(+) + +--- a/include/uapi/linux/fib_rules.h ++++ b/include/uapi/linux/fib_rules.h +@@ -89,6 +89,8 @@ enum { + __FR_ACT_MAX, + }; + ++#define FR_ACT_FAILED_POLICY FR_ACT_POLICY_FAILED ++ + #define FR_ACT_MAX (__FR_ACT_MAX - 1) + + #endif +--- a/include/uapi/linux/icmpv6.h ++++ b/include/uapi/linux/icmpv6.h +@@ -126,6 +126,8 @@ struct icmp6hdr { + #define ICMPV6_POLICY_FAIL 5 + #define ICMPV6_REJECT_ROUTE 6 + ++#define ICMPV6_FAILED_POLICY ICMPV6_POLICY_FAIL ++ + /* + * Codes for Time Exceeded + */ +--- a/include/uapi/linux/rtnetlink.h ++++ b/include/uapi/linux/rtnetlink.h +@@ -260,6 +260,8 @@ enum { + __RTN_MAX + }; + ++#define RTN_FAILED_POLICY RTN_POLICY_FAILED ++ + #define RTN_MAX (__RTN_MAX - 1) + + diff --git a/target/linux/generic/pending-5.15/680-NET-skip-GRO-for-foreign-MAC-addresses.patch b/target/linux/generic/pending-5.15/680-NET-skip-GRO-for-foreign-MAC-addresses.patch new file mode 100644 index 0000000000..46856e1552 --- /dev/null +++ b/target/linux/generic/pending-5.15/680-NET-skip-GRO-for-foreign-MAC-addresses.patch @@ -0,0 +1,149 @@ +From: Felix Fietkau +Subject: net: replace GRO optimization patch with a new one that supports VLANs/bridges with different MAC addresses + +Signed-off-by: Felix Fietkau +--- + include/linux/netdevice.h | 2 ++ + include/linux/skbuff.h | 3 ++- + net/core/dev.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++ + net/ethernet/eth.c | 18 +++++++++++++++++- + 4 files changed, 69 insertions(+), 2 deletions(-) + +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -2098,6 +2098,8 @@ struct net_device { + struct netdev_hw_addr_list mc; + struct netdev_hw_addr_list dev_addrs; + ++ unsigned char local_addr_mask[MAX_ADDR_LEN]; ++ + #ifdef CONFIG_SYSFS + struct kset *queues_kset; + #endif +--- a/include/linux/skbuff.h ++++ b/include/linux/skbuff.h +@@ -893,6 +893,7 @@ struct sk_buff { + #ifdef CONFIG_IPV6_NDISC_NODETYPE + __u8 ndisc_nodetype:2; + #endif ++ __u8 gro_skip:1; + + __u8 ipvs_property:1; + __u8 inner_protocol_type:1; +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -6074,6 +6074,9 @@ static enum gro_result dev_gro_receive(s + int same_flow; + int grow; + ++ if (skb->gro_skip) ++ goto normal; ++ + if (netif_elide_gro(skb->dev)) + goto normal; + +@@ -8088,6 +8091,48 @@ static void __netdev_adjacent_dev_unlink + &upper_dev->adj_list.lower); + } + ++static void __netdev_addr_mask(unsigned char *mask, const unsigned char *addr, ++ struct net_device *dev) ++{ ++ int i; ++ ++ for (i = 0; i < dev->addr_len; i++) ++ mask[i] |= addr[i] ^ dev->dev_addr[i]; ++} ++ ++static void __netdev_upper_mask(unsigned char *mask, struct net_device *dev, ++ struct net_device *lower) ++{ ++ struct net_device *cur; ++ struct list_head *iter; ++ ++ netdev_for_each_upper_dev_rcu(dev, cur, iter) { ++ __netdev_addr_mask(mask, cur->dev_addr, lower); ++ __netdev_upper_mask(mask, cur, lower); ++ } ++} ++ ++static void __netdev_update_addr_mask(struct net_device *dev) ++{ ++ unsigned char mask[MAX_ADDR_LEN]; ++ struct net_device *cur; ++ struct list_head *iter; ++ ++ memset(mask, 0, sizeof(mask)); ++ __netdev_upper_mask(mask, dev, dev); ++ memcpy(dev->local_addr_mask, mask, dev->addr_len); ++ ++ netdev_for_each_lower_dev(dev, cur, iter) ++ __netdev_update_addr_mask(cur); ++} ++ ++static void netdev_update_addr_mask(struct net_device *dev) ++{ ++ rcu_read_lock(); ++ __netdev_update_addr_mask(dev); ++ rcu_read_unlock(); ++} ++ + static int __netdev_upper_dev_link(struct net_device *dev, + struct net_device *upper_dev, bool master, + void *upper_priv, void *upper_info, +@@ -8139,6 +8184,7 @@ static int __netdev_upper_dev_link(struc + if (ret) + return ret; + ++ netdev_update_addr_mask(dev); + ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, + &changeupper_info.info); + ret = notifier_to_errno(ret); +@@ -8235,6 +8281,7 @@ static void __netdev_upper_dev_unlink(st + + __netdev_adjacent_dev_unlink_neighbour(dev, upper_dev); + ++ netdev_update_addr_mask(dev); + call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, + &changeupper_info.info); + +@@ -9054,6 +9101,7 @@ int dev_set_mac_address(struct net_devic + if (err) + return err; + dev->addr_assign_type = NET_ADDR_SET; ++ netdev_update_addr_mask(dev); + call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); + add_device_randomness(dev->dev_addr, dev->addr_len); + return 0; +--- a/net/ethernet/eth.c ++++ b/net/ethernet/eth.c +@@ -142,6 +142,18 @@ u32 eth_get_headlen(const struct net_dev + } + EXPORT_SYMBOL(eth_get_headlen); + ++static inline bool ++eth_check_local_mask(const void *addr1, const void *addr2, const void *mask) ++{ ++ const u16 *a1 = addr1; ++ const u16 *a2 = addr2; ++ const u16 *m = mask; ++ ++ return (((a1[0] ^ a2[0]) & ~m[0]) | ++ ((a1[1] ^ a2[1]) & ~m[1]) | ++ ((a1[2] ^ a2[2]) & ~m[2])); ++} ++ + /** + * eth_type_trans - determine the packet's protocol ID. + * @skb: received socket data +@@ -173,6 +185,10 @@ __be16 eth_type_trans(struct sk_buff *sk + } else { + skb->pkt_type = PACKET_OTHERHOST; + } ++ ++ if (eth_check_local_mask(eth->h_dest, dev->dev_addr, ++ dev->local_addr_mask)) ++ skb->gro_skip = 1; + } + + /* diff --git a/target/linux/generic/pending-5.15/682-of_net-add-mac-address-increment-support.patch b/target/linux/generic/pending-5.15/682-of_net-add-mac-address-increment-support.patch new file mode 100644 index 0000000000..f6ae9f31f1 --- /dev/null +++ b/target/linux/generic/pending-5.15/682-of_net-add-mac-address-increment-support.patch @@ -0,0 +1,90 @@ +From 844c273286f328acf0dab5fbd5d864366b4904dc Mon Sep 17 00:00:00 2001 +From: Ansuel Smith +Date: Tue, 30 Mar 2021 18:21:14 +0200 +Subject: [PATCH] of_net: add mac-address-increment support + +Lots of embedded devices use the mac-address of other interface +extracted from nvmem cells and increments it by one or two. Add two +bindings to integrate this and directly use the right mac-address for +the interface. Some example are some routers that use the gmac +mac-address stored in the art partition and increments it by one for the +wifi. mac-address-increment-byte bindings is used to tell what byte of +the mac-address has to be increased (if not defined the last byte is +increased) and mac-address-increment tells how much the byte decided +early has to be increased. + +Signed-off-by: Ansuel Smith +--- + net/core/of_net.c | 43 +++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 39 insertions(+), 4 deletions(-) + +--- a/net/core/of_net.c ++++ b/net/core/of_net.c +@@ -119,28 +119,63 @@ static int of_get_mac_addr_nvmem(struct + * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists + * but is all zeros. + * ++ * DT can tell the system to increment the mac-address after is extracted by ++ * using: ++ * - mac-address-increment-byte to decide what byte to increase ++ * (if not defined is increased the last byte) ++ * - mac-address-increment to decide how much to increase. The value WILL ++ * overflow to other bytes if the increment is over 255 or the total ++ * increment will exceed 255 of the current byte. ++ * (example 00:01:02:03:04:ff + 1 == 00:01:02:03:05:00) ++ * (example 00:01:02:03:04:fe + 5 == 00:01:02:03:05:03) ++ * + * Return: 0 on success and errno in case of error. + */ + int of_get_mac_address(struct device_node *np, u8 *addr) + { ++ u32 inc_idx, mac_inc, mac_val; + int ret; + ++ /* Check first if the increment byte is present and valid. ++ * If not set assume to increment the last byte if found. ++ */ ++ if (of_property_read_u32(np, "mac-address-increment-byte", &inc_idx)) ++ inc_idx = 5; ++ if (inc_idx < 3 || inc_idx > 5) ++ return -EINVAL; ++ + if (!np) + return -ENODEV; + + ret = of_get_mac_addr(np, "mac-address", addr); + if (!ret) +- return 0; ++ goto found; + + ret = of_get_mac_addr(np, "local-mac-address", addr); + if (!ret) +- return 0; ++ goto found; + + ret = of_get_mac_addr(np, "address", addr); + if (!ret) +- return 0; ++ goto found; ++ ++ ret = of_get_mac_addr_nvmem(np, addr); ++ if (ret) ++ return ret; ++ ++found: ++ if (!of_property_read_u32(np, "mac-address-increment", &mac_inc)) { ++ /* Convert to a contiguous value */ ++ mac_val = (addr[3] << 16) + (addr[4] << 8) + addr[5]; ++ mac_val += mac_inc << 8 * (5-inc_idx); ++ ++ /* Apply the incremented value handling overflow case */ ++ addr[3] = (mac_val >> 16) & 0xff; ++ addr[4] = (mac_val >> 8) & 0xff; ++ addr[5] = (mac_val >> 0) & 0xff; ++ } + +- return of_get_mac_addr_nvmem(np, addr); ++ return ret; + } + EXPORT_SYMBOL(of_get_mac_address); + diff --git a/target/linux/generic/pending-5.15/683-of_net-add-mac-address-to-of-tree.patch b/target/linux/generic/pending-5.15/683-of_net-add-mac-address-to-of-tree.patch new file mode 100644 index 0000000000..3063aa0beb --- /dev/null +++ b/target/linux/generic/pending-5.15/683-of_net-add-mac-address-to-of-tree.patch @@ -0,0 +1,55 @@ +From 8585756342caa6d27008d1ad0c18023e4211a40a Mon Sep 17 00:00:00 2001 +From: libreCMC community +Date: Wed, 13 Jul 2022 12:22:48 +0200 +Subject: [PATCH] of/of_net: write back netdev MAC-address to device-tree + +The label-mac logic relies on the mac-address property of a netdev +devices of-node. However, the mac address can also be stored as a +different property or read from e.g. an mtd device. + +Create this node when reading a mac-address from OF if it does not +already exist and copy the mac-address used for the device to this +property. This way, the MAC address can be accessed using procfs. + +--- + net/core/of_net.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +--- a/net/core/of_net.c ++++ b/net/core/of_net.c +@@ -95,6 +95,27 @@ static int of_get_mac_addr_nvmem(struct + return 0; + } + ++static int of_add_mac_address(struct device_node *np, u8* addr) ++{ ++ struct property *prop; ++ ++ prop = kzalloc(sizeof(*prop), GFP_KERNEL); ++ if (!prop) ++ return -ENOMEM; ++ ++ prop->name = "mac-address"; ++ prop->length = ETH_ALEN; ++ prop->value = kmemdup(addr, ETH_ALEN, GFP_KERNEL); ++ if (!prop->value || of_update_property(np, prop)) ++ goto free; ++ ++ return 0; ++free: ++ kfree(prop->value); ++ kfree(prop); ++ return -ENOMEM; ++} ++ + /** + * of_get_mac_address() + * @np: Caller's Device Node +@@ -175,6 +196,7 @@ found: + addr[5] = (mac_val >> 0) & 0xff; + } + ++ of_add_mac_address(np, addr); + return ret; + } + EXPORT_SYMBOL(of_get_mac_address); diff --git a/target/linux/generic/pending-5.15/684-of_net-do-mac-address-increment-only-once.patch b/target/linux/generic/pending-5.15/684-of_net-do-mac-address-increment-only-once.patch new file mode 100644 index 0000000000..44d88e31a2 --- /dev/null +++ b/target/linux/generic/pending-5.15/684-of_net-do-mac-address-increment-only-once.patch @@ -0,0 +1,31 @@ +From dd07dd394d8bfdb5d527fab18ca54f20815ec4e4 Mon Sep 17 00:00:00 2001 +From: Will Moss +Date: Wed, 3 Aug 2022 13:48:55 +0000 +Subject: [PATCH] of_net: do mac-address-increment only once + +Remove mac-address-increment and mac-address-increment-byte +DT property after incrementing process to make sure MAC address +would not get incremented more if this function is stared again. +It could happen if device initialization is deferred after +unsuccessful attempt. + +Signed-off-by: Will Moss +--- + drivers/of/of_net.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/net/core/of_net.c ++++ b/net/core/of_net.c +@@ -194,6 +194,12 @@ found: + addr[3] = (mac_val >> 16) & 0xff; + addr[4] = (mac_val >> 8) & 0xff; + addr[5] = (mac_val >> 0) & 0xff; ++ ++ /* Remove mac-address-increment and mac-address-increment-byte ++ * DT property to make sure MAC address would not get incremented ++ * more if this function is stared again. */ ++ of_remove_property(np, of_find_property(np, "mac-address-increment", NULL)); ++ of_remove_property(np, of_find_property(np, "mac-address-increment-byte", NULL)); + } + + of_add_mac_address(np, addr); diff --git a/target/linux/generic/pending-5.15/700-netfilter-nft_flow_offload-handle-netdevice-events-f.patch b/target/linux/generic/pending-5.15/700-netfilter-nft_flow_offload-handle-netdevice-events-f.patch new file mode 100644 index 0000000000..606e053513 --- /dev/null +++ b/target/linux/generic/pending-5.15/700-netfilter-nft_flow_offload-handle-netdevice-events-f.patch @@ -0,0 +1,106 @@ +From: Pablo Neira Ayuso +Date: Thu, 25 Jan 2018 12:58:55 +0100 +Subject: [PATCH] netfilter: nft_flow_offload: handle netdevice events from + nf_flow_table + +Move the code that deals with device events to the core. + +Signed-off-by: Pablo Neira Ayuso +--- + +--- a/net/netfilter/nf_flow_table_core.c ++++ b/net/netfilter/nf_flow_table_core.c +@@ -613,13 +613,41 @@ void nf_flow_table_free(struct nf_flowta + } + EXPORT_SYMBOL_GPL(nf_flow_table_free); + ++static int nf_flow_table_netdev_event(struct notifier_block *this, ++ unsigned long event, void *ptr) ++{ ++ struct net_device *dev = netdev_notifier_info_to_dev(ptr); ++ ++ if (event != NETDEV_DOWN) ++ return NOTIFY_DONE; ++ ++ nf_flow_table_cleanup(dev); ++ ++ return NOTIFY_DONE; ++} ++ ++static struct notifier_block flow_offload_netdev_notifier = { ++ .notifier_call = nf_flow_table_netdev_event, ++}; ++ + static int __init nf_flow_table_module_init(void) + { +- return nf_flow_table_offload_init(); ++ int ret; ++ ++ ret = nf_flow_table_offload_init(); ++ if (ret) ++ return ret; ++ ++ ret = register_netdevice_notifier(&flow_offload_netdev_notifier); ++ if (ret) ++ nf_flow_table_offload_exit(); ++ ++ return ret; + } + + static void __exit nf_flow_table_module_exit(void) + { ++ unregister_netdevice_notifier(&flow_offload_netdev_notifier); + nf_flow_table_offload_exit(); + } + +--- a/net/netfilter/nft_flow_offload.c ++++ b/net/netfilter/nft_flow_offload.c +@@ -446,47 +446,14 @@ static struct nft_expr_type nft_flow_off + .owner = THIS_MODULE, + }; + +-static int flow_offload_netdev_event(struct notifier_block *this, +- unsigned long event, void *ptr) +-{ +- struct net_device *dev = netdev_notifier_info_to_dev(ptr); +- +- if (event != NETDEV_DOWN) +- return NOTIFY_DONE; +- +- nf_flow_table_cleanup(dev); +- +- return NOTIFY_DONE; +-} +- +-static struct notifier_block flow_offload_netdev_notifier = { +- .notifier_call = flow_offload_netdev_event, +-}; +- + static int __init nft_flow_offload_module_init(void) + { +- int err; +- +- err = register_netdevice_notifier(&flow_offload_netdev_notifier); +- if (err) +- goto err; +- +- err = nft_register_expr(&nft_flow_offload_type); +- if (err < 0) +- goto register_expr; +- +- return 0; +- +-register_expr: +- unregister_netdevice_notifier(&flow_offload_netdev_notifier); +-err: +- return err; ++ return nft_register_expr(&nft_flow_offload_type); + } + + static void __exit nft_flow_offload_module_exit(void) + { + nft_unregister_expr(&nft_flow_offload_type); +- unregister_netdevice_notifier(&flow_offload_netdev_notifier); + } + + module_init(nft_flow_offload_module_init); diff --git a/target/linux/generic/pending-5.15/701-netfilter-nf_tables-ignore-EOPNOTSUPP-on-flowtable-d.patch b/target/linux/generic/pending-5.15/701-netfilter-nf_tables-ignore-EOPNOTSUPP-on-flowtable-d.patch new file mode 100644 index 0000000000..723af24770 --- /dev/null +++ b/target/linux/generic/pending-5.15/701-netfilter-nf_tables-ignore-EOPNOTSUPP-on-flowtable-d.patch @@ -0,0 +1,29 @@ +From: Felix Fietkau +Date: Thu, 31 Aug 2023 21:48:38 +0200 +Subject: [PATCH] netfilter: nf_tables: ignore -EOPNOTSUPP on flowtable device + offload setup + +On many embedded devices, it is common to configure flowtable offloading for +a mix of different devices, some of which have hardware offload support and +some of which don't. +The current code limits the ability of user space to properly set up such a +configuration by only allowing adding devices with hardware offload support to +a offload-enabled flowtable. +Given that offload-enabled flowtables also imply fallback to pure software +offloading, this limitation makes little sense. +Fix it by not bailing out when the offload setup returns -EOPNOTSUPP + +Signed-off-by: Felix Fietkau +--- + +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -7709,7 +7709,7 @@ static int nft_register_flowtable_net_ho + err = flowtable->data.type->setup(&flowtable->data, + hook->ops.dev, + FLOW_BLOCK_BIND); +- if (err < 0) ++ if (err < 0 && err != -EOPNOTSUPP) + goto err_unregister_net_hooks; + + err = nf_register_net_hook(net, &hook->ops); diff --git a/target/linux/generic/pending-5.15/702-net-ethernet-mtk_eth_soc-enable-threaded-NAPI.patch b/target/linux/generic/pending-5.15/702-net-ethernet-mtk_eth_soc-enable-threaded-NAPI.patch new file mode 100644 index 0000000000..0580cf1a84 --- /dev/null +++ b/target/linux/generic/pending-5.15/702-net-ethernet-mtk_eth_soc-enable-threaded-NAPI.patch @@ -0,0 +1,41 @@ +From: Felix Fietkau +Date: Mon, 21 Mar 2022 20:39:59 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: enable threaded NAPI + +This can improve performance under load by ensuring that NAPI processing is +not pinned on CPU 0. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -3098,8 +3098,8 @@ static irqreturn_t mtk_handle_irq_rx(int + + eth->rx_events++; + if (likely(napi_schedule_prep(ð->rx_napi))) { +- __napi_schedule(ð->rx_napi); + mtk_rx_irq_disable(eth, eth->soc->txrx.rx_irq_done_mask); ++ __napi_schedule(ð->rx_napi); + } + + return IRQ_HANDLED; +@@ -3111,8 +3111,8 @@ static irqreturn_t mtk_handle_irq_tx(int + + eth->tx_events++; + if (likely(napi_schedule_prep(ð->tx_napi))) { +- __napi_schedule(ð->tx_napi); + mtk_tx_irq_disable(eth, MTK_TX_DONE_INT); ++ __napi_schedule(ð->tx_napi); + } + + return IRQ_HANDLED; +@@ -4886,6 +4886,8 @@ static int mtk_probe(struct platform_dev + * for NAPI to work + */ + init_dummy_netdev(ð->dummy_dev); ++ eth->dummy_dev.threaded = 1; ++ strcpy(eth->dummy_dev.name, "mtk_eth"); + netif_napi_add(ð->dummy_dev, ð->tx_napi, mtk_napi_tx, + NAPI_POLL_WEIGHT); + netif_napi_add(ð->dummy_dev, ð->rx_napi, mtk_napi_rx, diff --git a/target/linux/generic/pending-5.15/703-phy-add-detach-callback-to-struct-phy_driver.patch b/target/linux/generic/pending-5.15/703-phy-add-detach-callback-to-struct-phy_driver.patch new file mode 100644 index 0000000000..83587b5c93 --- /dev/null +++ b/target/linux/generic/pending-5.15/703-phy-add-detach-callback-to-struct-phy_driver.patch @@ -0,0 +1,38 @@ +From: Gabor Juhos +Subject: generic: add detach callback to struct phy_driver + +lede-commit: fe61fc2d7d0b3fb348b502f68f98243b3ddf5867 + +Signed-off-by: Gabor Juhos +--- + drivers/net/phy/phy_device.c | 3 +++ + include/linux/phy.h | 6 ++++++ + 2 files changed, 9 insertions(+) + +--- a/drivers/net/phy/phy_device.c ++++ b/drivers/net/phy/phy_device.c +@@ -1751,6 +1751,9 @@ void phy_detach(struct phy_device *phyde + struct module *ndev_owner = NULL; + struct mii_bus *bus; + ++ if (phydev->drv && phydev->drv->detach) ++ phydev->drv->detach(phydev); ++ + if (phydev->sysfs_links) { + if (dev) + sysfs_remove_link(&dev->dev.kobj, "phydev"); +--- a/include/linux/phy.h ++++ b/include/linux/phy.h +@@ -843,6 +843,12 @@ struct phy_driver { + /** @handle_interrupt: Override default interrupt handling */ + irqreturn_t (*handle_interrupt)(struct phy_device *phydev); + ++ /* ++ * Called before an ethernet device is detached ++ * from the PHY. ++ */ ++ void (*detach)(struct phy_device *phydev); ++ + /** @remove: Clears up any memory if needed */ + void (*remove)(struct phy_device *phydev); + diff --git a/target/linux/generic/pending-5.15/704-01-v6.4-net-mvneta-fix-transmit-path-dma-unmapping-on-error.patch b/target/linux/generic/pending-5.15/704-01-v6.4-net-mvneta-fix-transmit-path-dma-unmapping-on-error.patch new file mode 100644 index 0000000000..287728ba1d --- /dev/null +++ b/target/linux/generic/pending-5.15/704-01-v6.4-net-mvneta-fix-transmit-path-dma-unmapping-on-error.patch @@ -0,0 +1,111 @@ +From d6d80269cf5c79f9dfe7d69f8b41a72015c89748 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 3 Apr 2023 19:30:20 +0100 +Subject: [PATCH 1/5] net: mvneta: fix transmit path dma-unmapping on error + +The transmit code assumes that the transmit descriptors that are used +begin with the first descriptor in the ring, but this may not be the +case. Fix this by providing a new function that dma-unmaps a range of +numbered descriptor entries, and use that to do the unmapping. + +Signed-off-by: Russell King (Oracle) +--- + drivers/net/ethernet/marvell/mvneta.c | 53 +++++++++++++++++---------- + 1 file changed, 33 insertions(+), 20 deletions(-) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -2647,14 +2647,40 @@ mvneta_tso_put_data(struct net_device *d + return 0; + } + ++static void mvneta_release_descs(struct mvneta_port *pp, ++ struct mvneta_tx_queue *txq, ++ int first, int num) ++{ ++ int desc_idx, i; ++ ++ desc_idx = first + num; ++ if (desc_idx >= txq->size) ++ desc_idx -= txq->size; ++ ++ for (i = num; i >= 0; i--) { ++ struct mvneta_tx_desc *tx_desc = txq->descs + desc_idx; ++ ++ if (!IS_TSO_HEADER(txq, tx_desc->buf_phys_addr)) ++ dma_unmap_single(pp->dev->dev.parent, ++ tx_desc->buf_phys_addr, ++ tx_desc->data_size, ++ DMA_TO_DEVICE); ++ ++ mvneta_txq_desc_put(txq); ++ ++ if (desc_idx == 0) ++ desc_idx = txq->size; ++ desc_idx -= 1; ++ } ++} ++ + static int mvneta_tx_tso(struct sk_buff *skb, struct net_device *dev, + struct mvneta_tx_queue *txq) + { + int hdr_len, total_len, data_left; +- int desc_count = 0; ++ int first_desc, desc_count = 0; + struct mvneta_port *pp = netdev_priv(dev); + struct tso_t tso; +- int i; + + /* Count needed descriptors */ + if ((txq->count + tso_count_descs(skb)) >= txq->size) +@@ -2665,6 +2691,8 @@ static int mvneta_tx_tso(struct sk_buff + return 0; + } + ++ first_desc = txq->txq_put_index; ++ + /* Initialize the TSO handler, and prepare the first payload */ + hdr_len = tso_start(skb, &tso); + +@@ -2705,15 +2733,7 @@ err_release: + /* Release all used data descriptors; header descriptors must not + * be DMA-unmapped. + */ +- for (i = desc_count - 1; i >= 0; i--) { +- struct mvneta_tx_desc *tx_desc = txq->descs + i; +- if (!IS_TSO_HEADER(txq, tx_desc->buf_phys_addr)) +- dma_unmap_single(pp->dev->dev.parent, +- tx_desc->buf_phys_addr, +- tx_desc->data_size, +- DMA_TO_DEVICE); +- mvneta_txq_desc_put(txq); +- } ++ mvneta_release_descs(pp, txq, first_desc, desc_count - 1); + return 0; + } + +@@ -2723,6 +2743,7 @@ static int mvneta_tx_frag_process(struct + { + struct mvneta_tx_desc *tx_desc; + int i, nr_frags = skb_shinfo(skb)->nr_frags; ++ int first_desc = txq->txq_put_index; + + for (i = 0; i < nr_frags; i++) { + struct mvneta_tx_buf *buf = &txq->buf[txq->txq_put_index]; +@@ -2761,15 +2782,7 @@ error: + /* Release all descriptors that were used to map fragments of + * this packet, as well as the corresponding DMA mappings + */ +- for (i = i - 1; i >= 0; i--) { +- tx_desc = txq->descs + i; +- dma_unmap_single(pp->dev->dev.parent, +- tx_desc->buf_phys_addr, +- tx_desc->data_size, +- DMA_TO_DEVICE); +- mvneta_txq_desc_put(txq); +- } +- ++ mvneta_release_descs(pp, txq, first_desc, i - 1); + return -ENOMEM; + } + diff --git a/target/linux/generic/pending-5.15/704-02-v6.4-net-mvneta-mark-mapped-and-tso-buffers-separately.patch b/target/linux/generic/pending-5.15/704-02-v6.4-net-mvneta-mark-mapped-and-tso-buffers-separately.patch new file mode 100644 index 0000000000..4db3ffe4e1 --- /dev/null +++ b/target/linux/generic/pending-5.15/704-02-v6.4-net-mvneta-mark-mapped-and-tso-buffers-separately.patch @@ -0,0 +1,42 @@ +From e3c77d0a1b635d114c147fd2078afb57ed558b81 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 3 Apr 2023 19:30:25 +0100 +Subject: [PATCH 2/5] net: mvneta: mark mapped and tso buffers separately + +Mark dma-mapped skbs and TSO buffers separately, so we can use +buf->type to identify their differences. + +Signed-off-by: Russell King (Oracle) +--- + drivers/net/ethernet/marvell/mvneta.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -607,6 +607,7 @@ struct mvneta_rx_desc { + #endif + + enum mvneta_tx_buf_type { ++ MVNETA_TYPE_TSO, + MVNETA_TYPE_SKB, + MVNETA_TYPE_XDP_TX, + MVNETA_TYPE_XDP_NDO, +@@ -1852,7 +1853,8 @@ static void mvneta_txq_bufs_free(struct + dma_unmap_single(pp->dev->dev.parent, + tx_desc->buf_phys_addr, + tx_desc->data_size, DMA_TO_DEVICE); +- if (buf->type == MVNETA_TYPE_SKB && buf->skb) { ++ if ((buf->type == MVNETA_TYPE_TSO || ++ buf->type == MVNETA_TYPE_SKB) && buf->skb) { + bytes_compl += buf->skb->len; + pkts_compl++; + dev_kfree_skb_any(buf->skb); +@@ -2607,7 +2609,7 @@ mvneta_tso_put_hdr(struct sk_buff *skb, + tx_desc->command |= MVNETA_TXD_F_DESC; + tx_desc->buf_phys_addr = txq->tso_hdrs_phys + + txq->txq_put_index * TSO_HEADER_SIZE; +- buf->type = MVNETA_TYPE_SKB; ++ buf->type = MVNETA_TYPE_TSO; + buf->skb = NULL; + + mvneta_txq_inc_put(txq); diff --git a/target/linux/generic/pending-5.15/704-03-v6.4-net-mvneta-use-buf-type-to-determine-whether-to-dma-.patch b/target/linux/generic/pending-5.15/704-03-v6.4-net-mvneta-use-buf-type-to-determine-whether-to-dma-.patch new file mode 100644 index 0000000000..37511ff1dd --- /dev/null +++ b/target/linux/generic/pending-5.15/704-03-v6.4-net-mvneta-use-buf-type-to-determine-whether-to-dma-.patch @@ -0,0 +1,59 @@ +From fe2abc1abc0dfc6c13fe8f189216f00dbbb33044 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 3 Apr 2023 19:30:30 +0100 +Subject: [PATCH 3/5] net: mvneta: use buf->type to determine whether to + dma-unmap + +Now that we use a different buffer type for TSO headers, we can use +buf->type to determine whether the original buffer was DMA-mapped or +not. The rules are: + + MVNETA_TYPE_XDP_TX - from a DMA pool, no unmap is required + MVNETA_TYPE_XDP_NDO - dma_map_single()'d + MVNETA_TYPE_SKB - normal skbuff, dma_map_single()'d + MVNETA_TYPE_TSO - from the TSO buffer area + +This means we only need to call dma_unmap_single() on the XDP_NDO and +SKB types of buffer, and we no longer need the private IS_TSO_HEADER() +which relies on the TSO region being contiguously allocated. + +Signed-off-by: Russell King (Oracle) +--- + drivers/net/ethernet/marvell/mvneta.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -334,10 +334,6 @@ + MVNETA_SKB_HEADROOM)) + #define MVNETA_MAX_RX_BUF_SIZE (PAGE_SIZE - MVNETA_SKB_PAD) + +-#define IS_TSO_HEADER(txq, addr) \ +- ((addr >= txq->tso_hdrs_phys) && \ +- (addr < txq->tso_hdrs_phys + txq->size * TSO_HEADER_SIZE)) +- + #define MVNETA_RX_GET_BM_POOL_ID(rxd) \ + (((rxd)->status & MVNETA_RXD_BM_POOL_MASK) >> MVNETA_RXD_BM_POOL_SHIFT) + +@@ -1848,8 +1844,8 @@ static void mvneta_txq_bufs_free(struct + + mvneta_txq_inc_get(txq); + +- if (!IS_TSO_HEADER(txq, tx_desc->buf_phys_addr) && +- buf->type != MVNETA_TYPE_XDP_TX) ++ if (buf->type == MVNETA_TYPE_XDP_NDO || ++ buf->type == MVNETA_TYPE_SKB) + dma_unmap_single(pp->dev->dev.parent, + tx_desc->buf_phys_addr, + tx_desc->data_size, DMA_TO_DEVICE); +@@ -2661,8 +2657,9 @@ static void mvneta_release_descs(struct + + for (i = num; i >= 0; i--) { + struct mvneta_tx_desc *tx_desc = txq->descs + desc_idx; ++ struct mvneta_tx_buf *buf = &txq->buf[desc_idx]; + +- if (!IS_TSO_HEADER(txq, tx_desc->buf_phys_addr)) ++ if (buf->type == MVNETA_TYPE_SKB) + dma_unmap_single(pp->dev->dev.parent, + tx_desc->buf_phys_addr, + tx_desc->data_size, diff --git a/target/linux/generic/pending-5.15/704-04-v6.4-net-mvneta-move-tso_build_hdr-into-mvneta_tso_put_hd.patch b/target/linux/generic/pending-5.15/704-04-v6.4-net-mvneta-move-tso_build_hdr-into-mvneta_tso_put_hd.patch new file mode 100644 index 0000000000..444b60f151 --- /dev/null +++ b/target/linux/generic/pending-5.15/704-04-v6.4-net-mvneta-move-tso_build_hdr-into-mvneta_tso_put_hd.patch @@ -0,0 +1,65 @@ +From 210ca75d4949f1ace8ea53a75148806cc28224a0 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 3 Apr 2023 19:30:35 +0100 +Subject: [PATCH 4/5] net: mvneta: move tso_build_hdr() into + mvneta_tso_put_hdr() + +Move tso_build_hdr() into mvneta_tso_put_hdr() so that all the TSO +header building code is in one place. + +Signed-off-by: Russell King (Oracle) +--- + drivers/net/ethernet/marvell/mvneta.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -2592,19 +2592,24 @@ err_drop_frame: + return rx_done; + } + +-static inline void +-mvneta_tso_put_hdr(struct sk_buff *skb, struct mvneta_tx_queue *txq) ++static void mvneta_tso_put_hdr(struct sk_buff *skb, struct mvneta_tx_queue *txq, ++ struct tso_t *tso, int size, bool is_last) + { +- int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); ++ int tso_offset, hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); + struct mvneta_tx_buf *buf = &txq->buf[txq->txq_put_index]; + struct mvneta_tx_desc *tx_desc; ++ char *hdr; ++ ++ tso_offset = txq->txq_put_index * TSO_HEADER_SIZE; ++ ++ hdr = txq->tso_hdrs + tso_offset; ++ tso_build_hdr(skb, hdr, tso, size, is_last); + + tx_desc = mvneta_txq_next_desc_get(txq); + tx_desc->data_size = hdr_len; + tx_desc->command = mvneta_skb_tx_csum(skb); + tx_desc->command |= MVNETA_TXD_F_DESC; +- tx_desc->buf_phys_addr = txq->tso_hdrs_phys + +- txq->txq_put_index * TSO_HEADER_SIZE; ++ tx_desc->buf_phys_addr = txq->tso_hdrs_phys + tso_offset; + buf->type = MVNETA_TYPE_TSO; + buf->skb = NULL; + +@@ -2697,17 +2702,12 @@ static int mvneta_tx_tso(struct sk_buff + + total_len = skb->len - hdr_len; + while (total_len > 0) { +- char *hdr; +- + data_left = min_t(int, skb_shinfo(skb)->gso_size, total_len); + total_len -= data_left; + desc_count++; + + /* prepare packet headers: MAC + IP + TCP */ +- hdr = txq->tso_hdrs + txq->txq_put_index * TSO_HEADER_SIZE; +- tso_build_hdr(skb, hdr, &tso, data_left, total_len == 0); +- +- mvneta_tso_put_hdr(skb, txq); ++ mvneta_tso_put_hdr(skb, txq, &tso, data_left, total_len == 0); + + while (data_left > 0) { + int size; diff --git a/target/linux/generic/pending-5.15/704-05-v6.4-net-mvneta-allocate-TSO-header-DMA-memory-in-chunks.patch b/target/linux/generic/pending-5.15/704-05-v6.4-net-mvneta-allocate-TSO-header-DMA-memory-in-chunks.patch new file mode 100644 index 0000000000..395a0bf5d2 --- /dev/null +++ b/target/linux/generic/pending-5.15/704-05-v6.4-net-mvneta-allocate-TSO-header-DMA-memory-in-chunks.patch @@ -0,0 +1,179 @@ +From 58d50fb089da553023df5a05f5ae86feaacc7f24 Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Mon, 3 Apr 2023 19:30:40 +0100 +Subject: [PATCH 5/5] net: mvneta: allocate TSO header DMA memory in chunks + +Now that we no longer need to check whether the DMA address is within +the TSO header DMA memory range for the queue, we can allocate the TSO +header DMA memory in chunks rather than one contiguous order-6 chunk, +which can stress the kernel's memory subsystems to allocate. + +Instead, use order-1 (8k) allocations, which will result in 32 order-1 +pages containing 32 TSO headers. + +Signed-off-by: Russell King (Oracle) +--- + drivers/net/ethernet/marvell/mvneta.c | 88 +++++++++++++++++++++------ + 1 file changed, 70 insertions(+), 18 deletions(-) + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -314,6 +314,15 @@ + + #define MVNETA_MAX_SKB_DESCS (MVNETA_MAX_TSO_SEGS * 2 + MAX_SKB_FRAGS) + ++/* The size of a TSO header page */ ++#define MVNETA_TSO_PAGE_SIZE (2 * PAGE_SIZE) ++ ++/* Number of TSO headers per page. This should be a power of 2 */ ++#define MVNETA_TSO_PER_PAGE (MVNETA_TSO_PAGE_SIZE / TSO_HEADER_SIZE) ++ ++/* Maximum number of TSO header pages */ ++#define MVNETA_MAX_TSO_PAGES (MVNETA_MAX_TXD / MVNETA_TSO_PER_PAGE) ++ + /* descriptor aligned size */ + #define MVNETA_DESC_ALIGNED_SIZE 32 + +@@ -656,10 +665,10 @@ struct mvneta_tx_queue { + int next_desc_to_proc; + + /* DMA buffers for TSO headers */ +- char *tso_hdrs; ++ char *tso_hdrs[MVNETA_MAX_TSO_PAGES]; + + /* DMA address of TSO headers */ +- dma_addr_t tso_hdrs_phys; ++ dma_addr_t tso_hdrs_phys[MVNETA_MAX_TSO_PAGES]; + + /* Affinity mask for CPUs*/ + cpumask_t affinity_mask; +@@ -2592,24 +2601,71 @@ err_drop_frame: + return rx_done; + } + ++static void mvneta_free_tso_hdrs(struct mvneta_port *pp, ++ struct mvneta_tx_queue *txq) ++{ ++ struct device *dev = pp->dev->dev.parent; ++ int i; ++ ++ for (i = 0; i < MVNETA_MAX_TSO_PAGES; i++) { ++ if (txq->tso_hdrs[i]) { ++ dma_free_coherent(dev, MVNETA_TSO_PAGE_SIZE, ++ txq->tso_hdrs[i], ++ txq->tso_hdrs_phys[i]); ++ txq->tso_hdrs[i] = NULL; ++ } ++ } ++} ++ ++static int mvneta_alloc_tso_hdrs(struct mvneta_port *pp, ++ struct mvneta_tx_queue *txq) ++{ ++ struct device *dev = pp->dev->dev.parent; ++ int i, num; ++ ++ num = DIV_ROUND_UP(txq->size, MVNETA_TSO_PER_PAGE); ++ for (i = 0; i < num; i++) { ++ txq->tso_hdrs[i] = dma_alloc_coherent(dev, MVNETA_TSO_PAGE_SIZE, ++ &txq->tso_hdrs_phys[i], ++ GFP_KERNEL); ++ if (!txq->tso_hdrs[i]) { ++ mvneta_free_tso_hdrs(pp, txq); ++ return -ENOMEM; ++ } ++ } ++ ++ return 0; ++} ++ ++static char *mvneta_get_tso_hdr(struct mvneta_tx_queue *txq, dma_addr_t *dma) ++{ ++ int index, offset; ++ ++ index = txq->txq_put_index / MVNETA_TSO_PER_PAGE; ++ offset = (txq->txq_put_index % MVNETA_TSO_PER_PAGE) * TSO_HEADER_SIZE; ++ ++ *dma = txq->tso_hdrs_phys[index] + offset; ++ ++ return txq->tso_hdrs[index] + offset; ++} ++ + static void mvneta_tso_put_hdr(struct sk_buff *skb, struct mvneta_tx_queue *txq, + struct tso_t *tso, int size, bool is_last) + { +- int tso_offset, hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); ++ int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); + struct mvneta_tx_buf *buf = &txq->buf[txq->txq_put_index]; + struct mvneta_tx_desc *tx_desc; ++ dma_addr_t hdr_phys; + char *hdr; + +- tso_offset = txq->txq_put_index * TSO_HEADER_SIZE; +- +- hdr = txq->tso_hdrs + tso_offset; ++ hdr = mvneta_get_tso_hdr(txq, &hdr_phys); + tso_build_hdr(skb, hdr, tso, size, is_last); + + tx_desc = mvneta_txq_next_desc_get(txq); + tx_desc->data_size = hdr_len; + tx_desc->command = mvneta_skb_tx_csum(skb); + tx_desc->command |= MVNETA_TXD_F_DESC; +- tx_desc->buf_phys_addr = txq->tso_hdrs_phys + tso_offset; ++ tx_desc->buf_phys_addr = hdr_phys; + buf->type = MVNETA_TYPE_TSO; + buf->skb = NULL; + +@@ -3401,7 +3457,7 @@ static void mvneta_rxq_deinit(struct mvn + static int mvneta_txq_sw_init(struct mvneta_port *pp, + struct mvneta_tx_queue *txq) + { +- int cpu; ++ int cpu, err; + + txq->size = pp->tx_ring_size; + +@@ -3426,11 +3482,9 @@ static int mvneta_txq_sw_init(struct mvn + return -ENOMEM; + + /* Allocate DMA buffers for TSO MAC/IP/TCP headers */ +- txq->tso_hdrs = dma_alloc_coherent(pp->dev->dev.parent, +- txq->size * TSO_HEADER_SIZE, +- &txq->tso_hdrs_phys, GFP_KERNEL); +- if (!txq->tso_hdrs) +- return -ENOMEM; ++ err = mvneta_alloc_tso_hdrs(pp, txq); ++ if (err) ++ return err; + + /* Setup XPS mapping */ + if (pp->neta_armada3700) +@@ -3482,10 +3536,7 @@ static void mvneta_txq_sw_deinit(struct + + kfree(txq->buf); + +- if (txq->tso_hdrs) +- dma_free_coherent(pp->dev->dev.parent, +- txq->size * TSO_HEADER_SIZE, +- txq->tso_hdrs, txq->tso_hdrs_phys); ++ mvneta_free_tso_hdrs(pp, txq); + if (txq->descs) + dma_free_coherent(pp->dev->dev.parent, + txq->size * MVNETA_DESC_ALIGNED_SIZE, +@@ -3494,7 +3545,6 @@ static void mvneta_txq_sw_deinit(struct + netdev_tx_reset_queue(nq); + + txq->buf = NULL; +- txq->tso_hdrs = NULL; + txq->descs = NULL; + txq->last_desc = 0; + txq->next_desc_to_proc = 0; +@@ -5543,6 +5593,8 @@ static int __init mvneta_driver_init(voi + { + int ret; + ++ BUILD_BUG_ON_NOT_POWER_OF_2(MVNETA_TSO_PER_PAGE); ++ + ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "net/mvneta:online", + mvneta_cpu_online, + mvneta_cpu_down_prepare); diff --git a/target/linux/generic/pending-5.15/705-net-dsa-tag_mtk-add-padding-for-tx-packets.patch b/target/linux/generic/pending-5.15/705-net-dsa-tag_mtk-add-padding-for-tx-packets.patch new file mode 100644 index 0000000000..d444b2027c --- /dev/null +++ b/target/linux/generic/pending-5.15/705-net-dsa-tag_mtk-add-padding-for-tx-packets.patch @@ -0,0 +1,28 @@ +From: Felix Fietkau +Date: Fri, 6 May 2022 21:38:42 +0200 +Subject: [PATCH] net: dsa: tag_mtk: add padding for tx packets + +Padding for transmitted packets needs to account for the special tag. +With not enough padding, garbage bytes are inserted by the switch at the +end of small packets. + +Fixes: 5cd8985a1909 ("net-next: dsa: add Mediatek tag RX/TX handler") +Signed-off-by: Felix Fietkau +--- + +--- a/net/dsa/tag_mtk.c ++++ b/net/dsa/tag_mtk.c +@@ -27,6 +27,13 @@ static struct sk_buff *mtk_tag_xmit(stru + + skb_set_queue_mapping(skb, dp->index); + ++ /* The Ethernet switch we are interfaced with needs packets to be at ++ * least 64 bytes (including FCS) otherwise their padding might be ++ * corrupted. With tags enabled, we need to make sure that packets are ++ * at least 68 bytes (including FCS and tag). ++ */ ++ eth_skb_pad(skb); ++ + /* Build the special tag after the MAC Source Address. If VLAN header + * is present, it's required that VLAN header and special tag is + * being combined. Only in this way we can allow the switch can parse diff --git a/target/linux/generic/pending-5.15/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch b/target/linux/generic/pending-5.15/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch new file mode 100644 index 0000000000..bbbebefdd5 --- /dev/null +++ b/target/linux/generic/pending-5.15/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch @@ -0,0 +1,174 @@ +From: Felix Fietkau +Date: Fri, 27 Aug 2021 12:22:32 +0200 +Subject: [PATCH] bridge: add knob for filtering rx/tx BPDU packets on a port + +Some devices (e.g. wireless APs) can't have devices behind them be part of +a bridge topology with redundant links, due to address limitations. +Additionally, broadcast traffic on these devices is somewhat expensive, due to +the low data rate and wakeups of clients in powersave mode. +This knob can be used to ensure that BPDU packets are never sent or forwarded +to/from these devices + +Signed-off-by: Felix Fietkau +--- + +--- a/include/linux/if_bridge.h ++++ b/include/linux/if_bridge.h +@@ -58,6 +58,7 @@ struct br_ip_list { + #define BR_MRP_LOST_CONT BIT(18) + #define BR_MRP_LOST_IN_CONT BIT(19) + #define BR_TX_FWD_OFFLOAD BIT(20) ++#define BR_BPDU_FILTER BIT(21) + + #define BR_DEFAULT_AGEING_TIME (300 * HZ) + +--- a/net/bridge/br_forward.c ++++ b/net/bridge/br_forward.c +@@ -199,6 +199,7 @@ out: + void br_flood(struct net_bridge *br, struct sk_buff *skb, + enum br_pkt_type pkt_type, bool local_rcv, bool local_orig) + { ++ const unsigned char *dest = eth_hdr(skb)->h_dest; + struct net_bridge_port *prev = NULL; + struct net_bridge_port *p; + +@@ -214,6 +215,10 @@ void br_flood(struct net_bridge *br, str + case BR_PKT_MULTICAST: + if (!(p->flags & BR_MCAST_FLOOD) && skb->dev != br->dev) + continue; ++ if ((p->flags & BR_BPDU_FILTER) && ++ unlikely(is_link_local_ether_addr(dest) && ++ dest[5] == 0)) ++ continue; + break; + case BR_PKT_BROADCAST: + if (!(p->flags & BR_BCAST_FLOOD) && skb->dev != br->dev) +--- a/net/bridge/br_input.c ++++ b/net/bridge/br_input.c +@@ -326,6 +326,8 @@ static rx_handler_result_t br_handle_fra + fwd_mask |= p->group_fwd_mask; + switch (dest[5]) { + case 0x00: /* Bridge Group Address */ ++ if (p->flags & BR_BPDU_FILTER) ++ goto drop; + /* If STP is turned off, + then must forward to keep loop detection */ + if (p->br->stp_enabled == BR_NO_STP || +--- a/net/bridge/br_sysfs_if.c ++++ b/net/bridge/br_sysfs_if.c +@@ -240,6 +240,7 @@ BRPORT_ATTR_FLAG(multicast_flood, BR_MCA + BRPORT_ATTR_FLAG(broadcast_flood, BR_BCAST_FLOOD); + BRPORT_ATTR_FLAG(neigh_suppress, BR_NEIGH_SUPPRESS); + BRPORT_ATTR_FLAG(isolated, BR_ISOLATED); ++BRPORT_ATTR_FLAG(bpdu_filter, BR_BPDU_FILTER); + + #ifdef CONFIG_BRIDGE_IGMP_SNOOPING + static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf) +@@ -292,6 +293,7 @@ static const struct brport_attribute *br + &brport_attr_group_fwd_mask, + &brport_attr_neigh_suppress, + &brport_attr_isolated, ++ &brport_attr_bpdu_filter, + &brport_attr_backup_port, + NULL + }; +--- a/net/bridge/br_stp_bpdu.c ++++ b/net/bridge/br_stp_bpdu.c +@@ -80,7 +80,8 @@ void br_send_config_bpdu(struct net_brid + { + unsigned char buf[35]; + +- if (p->br->stp_enabled != BR_KERNEL_STP) ++ if (p->br->stp_enabled != BR_KERNEL_STP || ++ (p->flags & BR_BPDU_FILTER)) + return; + + buf[0] = 0; +@@ -127,7 +128,8 @@ void br_send_tcn_bpdu(struct net_bridge_ + { + unsigned char buf[4]; + +- if (p->br->stp_enabled != BR_KERNEL_STP) ++ if (p->br->stp_enabled != BR_KERNEL_STP || ++ (p->flags & BR_BPDU_FILTER)) + return; + + buf[0] = 0; +@@ -172,6 +174,9 @@ void br_stp_rcv(const struct stp_proto * + if (!(br->dev->flags & IFF_UP)) + goto out; + ++ if (p->flags & BR_BPDU_FILTER) ++ goto out; ++ + if (p->state == BR_STATE_DISABLED) + goto out; + +--- a/include/uapi/linux/if_link.h ++++ b/include/uapi/linux/if_link.h +@@ -536,6 +536,7 @@ enum { + IFLA_BRPORT_MRP_IN_OPEN, + IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT, + IFLA_BRPORT_MCAST_EHT_HOSTS_CNT, ++ IFLA_BRPORT_BPDU_FILTER, + __IFLA_BRPORT_MAX + }; + #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) +--- a/net/bridge/br_netlink.c ++++ b/net/bridge/br_netlink.c +@@ -184,6 +184,7 @@ static inline size_t br_port_info_size(v + + nla_total_size(1) /* IFLA_BRPORT_VLAN_TUNNEL */ + + nla_total_size(1) /* IFLA_BRPORT_NEIGH_SUPPRESS */ + + nla_total_size(1) /* IFLA_BRPORT_ISOLATED */ ++ + nla_total_size(1) /* IFLA_BRPORT_BPDU_FILTER */ + + nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_ROOT_ID */ + + nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_BRIDGE_ID */ + + nla_total_size(sizeof(u16)) /* IFLA_BRPORT_DESIGNATED_PORT */ +@@ -269,7 +270,8 @@ static int br_port_fill_attrs(struct sk_ + BR_MRP_LOST_CONT)) || + nla_put_u8(skb, IFLA_BRPORT_MRP_IN_OPEN, + !!(p->flags & BR_MRP_LOST_IN_CONT)) || +- nla_put_u8(skb, IFLA_BRPORT_ISOLATED, !!(p->flags & BR_ISOLATED))) ++ nla_put_u8(skb, IFLA_BRPORT_ISOLATED, !!(p->flags & BR_ISOLATED)) || ++ nla_put_u8(skb, IFLA_BRPORT_BPDU_FILTER, !!(p->flags & BR_BPDU_FILTER))) + return -EMSGSIZE; + + timerval = br_timer_value(&p->message_age_timer); +@@ -829,6 +831,7 @@ static const struct nla_policy br_port_p + [IFLA_BRPORT_ISOLATED] = { .type = NLA_U8 }, + [IFLA_BRPORT_BACKUP_PORT] = { .type = NLA_U32 }, + [IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT] = { .type = NLA_U32 }, ++ [IFLA_BRPORT_BPDU_FILTER] = { .type = NLA_U8 }, + }; + + /* Change the state of the port and notify spanning tree */ +@@ -893,6 +896,7 @@ static int br_setport(struct net_bridge_ + br_set_port_flag(p, tb, IFLA_BRPORT_VLAN_TUNNEL, BR_VLAN_TUNNEL); + br_set_port_flag(p, tb, IFLA_BRPORT_NEIGH_SUPPRESS, BR_NEIGH_SUPPRESS); + br_set_port_flag(p, tb, IFLA_BRPORT_ISOLATED, BR_ISOLATED); ++ br_set_port_flag(p, tb, IFLA_BRPORT_BPDU_FILTER, BR_BPDU_FILTER); + + changed_mask = old_flags ^ p->flags; + +--- a/net/core/rtnetlink.c ++++ b/net/core/rtnetlink.c +@@ -55,7 +55,7 @@ + #include + + #define RTNL_MAX_TYPE 50 +-#define RTNL_SLAVE_MAX_TYPE 40 ++#define RTNL_SLAVE_MAX_TYPE 41 + + struct rtnl_link { + rtnl_doit_func doit; +@@ -4739,7 +4739,9 @@ int ndo_dflt_bridge_getlink(struct sk_bu + brport_nla_put_flag(skb, flags, mask, + IFLA_BRPORT_MCAST_FLOOD, BR_MCAST_FLOOD) || + brport_nla_put_flag(skb, flags, mask, +- IFLA_BRPORT_BCAST_FLOOD, BR_BCAST_FLOOD)) { ++ IFLA_BRPORT_BCAST_FLOOD, BR_BCAST_FLOOD) || ++ brport_nla_put_flag(skb, flags, mask, ++ IFLA_BRPORT_BPDU_FILTER, BR_BPDU_FILTER)) { + nla_nest_cancel(skb, protinfo); + goto nla_put_failure; + } diff --git a/target/linux/generic/pending-5.15/721-net-phy-realtek-rtl8221-allow-to-configure-SERDES-mo.patch b/target/linux/generic/pending-5.15/721-net-phy-realtek-rtl8221-allow-to-configure-SERDES-mo.patch new file mode 100644 index 0000000000..c93fe42273 --- /dev/null +++ b/target/linux/generic/pending-5.15/721-net-phy-realtek-rtl8221-allow-to-configure-SERDES-mo.patch @@ -0,0 +1,106 @@ +From ace6abaa0f9203083fe4c0a6a74da2d96410b625 Mon Sep 17 00:00:00 2001 +From: Alexander Couzens +Date: Sat, 13 Aug 2022 12:49:33 +0200 +Subject: [PATCH 01/10] net: phy: realtek: rtl8221: allow to configure SERDES + mode + +The rtl8221 supports multiple SERDES modes: +- SGMII +- 2500base-x +- HiSGMII + +Further it supports rate adaption on SERDES links to allow +slow ethernet speeds (10/100/1000mbit) to work on 2500base-x/HiSGMII +links without reducing the SERDES speed. + +When operating without rate adapters the SERDES link will follow the +ethernet speed. + +Signed-off-by: Alexander Couzens +--- + drivers/net/phy/realtek.c | 48 +++++++++++++++++++++++++++++++++++++++ + 1 file changed, 48 insertions(+) + +--- a/drivers/net/phy/realtek.c ++++ b/drivers/net/phy/realtek.c +@@ -53,6 +53,15 @@ + RTL8201F_ISR_LINK) + #define RTL8201F_IER 0x13 + ++#define RTL8221B_MMD_SERDES_CTRL MDIO_MMD_VEND1 ++#define RTL8221B_MMD_PHY_CTRL MDIO_MMD_VEND2 ++#define RTL8221B_SERDES_OPTION 0x697a ++#define RTL8221B_SERDES_OPTION_MODE_MASK GENMASK(5, 0) ++#define RTL8221B_SERDES_OPTION_MODE_2500BASEX_SGMII 0 ++#define RTL8221B_SERDES_OPTION_MODE_HISGMII_SGMII 1 ++#define RTL8221B_SERDES_OPTION_MODE_2500BASEX 2 ++#define RTL8221B_SERDES_OPTION_MODE_HISGMII 3 ++ + #define RTL8366RB_POWER_SAVE 0x15 + #define RTL8366RB_POWER_SAVE_ON BIT(12) + +@@ -841,6 +850,48 @@ static irqreturn_t rtl9000a_handle_inter + return IRQ_HANDLED; + } + ++static int rtl8221b_config_init(struct phy_device *phydev) ++{ ++ u16 option_mode; ++ ++ switch (phydev->interface) { ++ case PHY_INTERFACE_MODE_2500BASEX: ++ if (!phydev->is_c45) { ++ option_mode = RTL8221B_SERDES_OPTION_MODE_2500BASEX; ++ break; ++ } ++ fallthrough; ++ case PHY_INTERFACE_MODE_SGMII: ++ option_mode = RTL8221B_SERDES_OPTION_MODE_2500BASEX_SGMII; ++ break; ++ default: ++ return 0; ++ } ++ ++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, ++ 0x75f3, 0); ++ ++ phy_modify_mmd_changed(phydev, RTL8221B_MMD_SERDES_CTRL, ++ RTL8221B_SERDES_OPTION, ++ RTL8221B_SERDES_OPTION_MODE_MASK, option_mode); ++ switch (option_mode) { ++ case RTL8221B_SERDES_OPTION_MODE_2500BASEX_SGMII: ++ case RTL8221B_SERDES_OPTION_MODE_2500BASEX: ++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6a04, 0x0503); ++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f10, 0xd455); ++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f11, 0x8020); ++ break; ++ case RTL8221B_SERDES_OPTION_MODE_HISGMII_SGMII: ++ case RTL8221B_SERDES_OPTION_MODE_HISGMII: ++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6a04, 0x0503); ++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f10, 0xd433); ++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f11, 0x8020); ++ break; ++ } ++ ++ return 0; ++} ++ + static struct phy_driver realtek_drvs[] = { + { + PHY_ID_MATCH_EXACT(0x00008201), +@@ -981,6 +1032,7 @@ static struct phy_driver realtek_drvs[] + PHY_ID_MATCH_EXACT(0x001cc849), + .name = "RTL8221B-VB-CG 2.5Gbps PHY", + .get_features = rtl822x_get_features, ++ .config_init = rtl8221b_config_init, + .config_aneg = rtl822x_config_aneg, + .read_status = rtl822x_read_status, + .suspend = genphy_suspend, +@@ -992,6 +1044,7 @@ static struct phy_driver realtek_drvs[] + .name = "RTL8221B-VM-CG 2.5Gbps PHY", + .get_features = rtl822x_get_features, + .config_aneg = rtl822x_config_aneg, ++ .config_init = rtl8221b_config_init, + .read_status = rtl822x_read_status, + .suspend = genphy_suspend, + .resume = rtlgen_resume, diff --git a/target/linux/generic/pending-5.15/722-net-phy-realtek-support-switching-between-SGMII-and-.patch b/target/linux/generic/pending-5.15/722-net-phy-realtek-support-switching-between-SGMII-and-.patch new file mode 100644 index 0000000000..211a8ed297 --- /dev/null +++ b/target/linux/generic/pending-5.15/722-net-phy-realtek-support-switching-between-SGMII-and-.patch @@ -0,0 +1,61 @@ +From 312753d0aadba0f58841ae513b80fdbabc887523 Mon Sep 17 00:00:00 2001 +From: Chukun Pan +Date: Wed, 8 Feb 2023 16:32:18 +0800 +Subject: [PATCH] net: phy: realtek: support switching between SGMII and + 2500BASE-X for RTL822x series + +After commit ace6aba ("net: phy: realtek: rtl8221: allow to configure +SERDES mode"), the rtl8221 phy can work in SGMII and 2500base-x modes +respectively. So add interface automatic switching for rtl8221 phy to +match various wire speeds. + +Signed-off-by: Chukun Pan +--- + drivers/net/phy/realtek.c | 26 ++++++++++++++++++++++++-- + 1 file changed, 24 insertions(+), 2 deletions(-) + +--- a/drivers/net/phy/realtek.c ++++ b/drivers/net/phy/realtek.c +@@ -676,6 +676,25 @@ static int rtl822x_config_aneg(struct ph + return __genphy_config_aneg(phydev, ret); + } + ++static void rtl822x_update_interface(struct phy_device *phydev) ++{ ++ /* Automatically switch SERDES interface between ++ * SGMII and 2500-BaseX according to speed. ++ */ ++ switch (phydev->speed) { ++ case SPEED_2500: ++ phydev->interface = PHY_INTERFACE_MODE_2500BASEX; ++ break; ++ case SPEED_1000: ++ case SPEED_100: ++ case SPEED_10: ++ phydev->interface = PHY_INTERFACE_MODE_SGMII; ++ break; ++ default: ++ break; ++ } ++} ++ + static int rtl822x_read_status(struct phy_device *phydev) + { + int ret; +@@ -694,11 +713,14 @@ static int rtl822x_read_status(struct ph + phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL); + } + +- ret = genphy_read_status(phydev); ++ ret = rtlgen_read_status(phydev); + if (ret < 0) + return ret; + +- return rtlgen_get_speed(phydev); ++ if (phydev->is_c45 && phydev->link) ++ rtl822x_update_interface(phydev); ++ ++ return 0; + } + + static bool rtlgen_supports_2_5gbps(struct phy_device *phydev) diff --git a/target/linux/generic/pending-5.15/723-net-mt7531-ensure-all-MACs-are-powered-down-before-r.patch b/target/linux/generic/pending-5.15/723-net-mt7531-ensure-all-MACs-are-powered-down-before-r.patch new file mode 100644 index 0000000000..4ff7f321de --- /dev/null +++ b/target/linux/generic/pending-5.15/723-net-mt7531-ensure-all-MACs-are-powered-down-before-r.patch @@ -0,0 +1,37 @@ +From 3fb8841513c4ec3a2e5d366df86230c45f239a57 Mon Sep 17 00:00:00 2001 +From: Alexander Couzens +Date: Sat, 13 Aug 2022 13:08:22 +0200 +Subject: [PATCH 03/10] net: mt7531: ensure all MACs are powered down before + reset + +The datasheet [1] explicit describes it as requirement for a reset. + +[1] MT7531 Reference Manual for Development Board rev 1.0, page 735 + +Signed-off-by: Alexander Couzens +--- + drivers/net/dsa/mt7530.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2422,7 +2422,7 @@ mt7531_setup(struct dsa_switch *ds) + struct mt7530_priv *priv = ds->priv; + struct mt7530_dummy_poll p; + u32 val, id; +- int ret; ++ int ret, i; + + /* Reset whole chip through gpio pin or memory-mapped registers for + * different type of hardware +@@ -2454,6 +2454,10 @@ mt7531_setup(struct dsa_switch *ds) + return -ENODEV; + } + ++ /* all MACs must be forced link-down before sw reset */ ++ for (i = 0; i < MT7530_NUM_PORTS; i++) ++ mt7530_write(priv, MT7530_PMCR_P(i), MT7531_FORCE_LNK); ++ + /* Reset the switch through internal reset */ + mt7530_write(priv, MT7530_SYS_CTRL, + SYS_CTRL_PHY_RST | SYS_CTRL_SW_RST | diff --git a/target/linux/generic/pending-5.15/724-net-phy-realtek-use-genphy_soft_reset-for-2.5G-PHYs.patch b/target/linux/generic/pending-5.15/724-net-phy-realtek-use-genphy_soft_reset-for-2.5G-PHYs.patch new file mode 100644 index 0000000000..6941818351 --- /dev/null +++ b/target/linux/generic/pending-5.15/724-net-phy-realtek-use-genphy_soft_reset-for-2.5G-PHYs.patch @@ -0,0 +1,65 @@ +From 85cd45580f5e3b26068cccb7d6173f200e754dc0 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sun, 2 Apr 2023 23:56:16 +0100 +Subject: [PATCH 1/2] net: phy: realtek: use genphy_soft_reset for 2.5G PHYs + +Some vendor bootloaders do weird things with those PHYs which result in +link modes being reported wrongly. Start from a clean sheet by resetting +the PHY. + +Reported-by: Yevhen Kolomeiko +Signed-off-by: Daniel Golle +--- + drivers/net/phy/realtek.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/net/phy/realtek.c ++++ b/drivers/net/phy/realtek.c +@@ -1018,6 +1018,7 @@ static struct phy_driver realtek_drvs[] + .write_page = rtl821x_write_page, + .read_mmd = rtl822x_read_mmd, + .write_mmd = rtl822x_write_mmd, ++ .soft_reset = genphy_soft_reset, + }, { + PHY_ID_MATCH_EXACT(0x001cc840), + .name = "RTL8226B_RTL8221B 2.5Gbps PHY", +@@ -1030,6 +1031,7 @@ static struct phy_driver realtek_drvs[] + .write_page = rtl821x_write_page, + .read_mmd = rtl822x_read_mmd, + .write_mmd = rtl822x_write_mmd, ++ .soft_reset = genphy_soft_reset, + }, { + PHY_ID_MATCH_EXACT(0x001cc838), + .name = "RTL8226-CG 2.5Gbps PHY", +@@ -1040,6 +1042,7 @@ static struct phy_driver realtek_drvs[] + .resume = rtlgen_resume, + .read_page = rtl821x_read_page, + .write_page = rtl821x_write_page, ++ .soft_reset = genphy_soft_reset, + }, { + PHY_ID_MATCH_EXACT(0x001cc848), + .name = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY", +@@ -1050,6 +1053,7 @@ static struct phy_driver realtek_drvs[] + .resume = rtlgen_resume, + .read_page = rtl821x_read_page, + .write_page = rtl821x_write_page, ++ .soft_reset = genphy_soft_reset, + }, { + PHY_ID_MATCH_EXACT(0x001cc849), + .name = "RTL8221B-VB-CG 2.5Gbps PHY", +@@ -1061,6 +1065,7 @@ static struct phy_driver realtek_drvs[] + .resume = rtlgen_resume, + .read_page = rtl821x_read_page, + .write_page = rtl821x_write_page, ++ .soft_reset = genphy_soft_reset, + }, { + PHY_ID_MATCH_EXACT(0x001cc84a), + .name = "RTL8221B-VM-CG 2.5Gbps PHY", +@@ -1072,6 +1077,7 @@ static struct phy_driver realtek_drvs[] + .resume = rtlgen_resume, + .read_page = rtl821x_read_page, + .write_page = rtl821x_write_page, ++ .soft_reset = genphy_soft_reset, + }, { + PHY_ID_MATCH_EXACT(0x001cc961), + .name = "RTL8366RB Gigabit Ethernet", diff --git a/target/linux/generic/pending-5.15/725-net-phy-realtek-disable-SGMII-in-band-AN-for-2-5G-PHYs.patch b/target/linux/generic/pending-5.15/725-net-phy-realtek-disable-SGMII-in-band-AN-for-2-5G-PHYs.patch new file mode 100644 index 0000000000..1370c6324b --- /dev/null +++ b/target/linux/generic/pending-5.15/725-net-phy-realtek-disable-SGMII-in-band-AN-for-2-5G-PHYs.patch @@ -0,0 +1,43 @@ +From 2b1b8c4c215af7988136401c902338d091d408a1 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 3 Apr 2023 01:21:57 +0300 +Subject: [PATCH 2/2] net: phy: realtek: disable SGMII in-band AN for 2.5G PHYs + +MAC drivers don't use SGMII in-band autonegotiation unless told to do so +in device tree using 'managed = "in-band-status"'. When using MDIO to +access a PHY, in-band-status is unneeded as we have link-status via +MDIO. Switch off SGMII in-band autonegotiation using magic values. + +Reported-by: Chen Minqiang +Reported-by: Chukun Pan +Reported-by: Yevhen Kolomeiko +Tested-by: Yevhen Kolomeiko +Signed-off-by: Daniel Golle +--- + drivers/net/phy/realtek.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/drivers/net/phy/realtek.c ++++ b/drivers/net/phy/realtek.c +@@ -875,6 +875,7 @@ static irqreturn_t rtl9000a_handle_inter + static int rtl8221b_config_init(struct phy_device *phydev) + { + u16 option_mode; ++ int val; + + switch (phydev->interface) { + case PHY_INTERFACE_MODE_2500BASEX: +@@ -911,6 +912,13 @@ static int rtl8221b_config_init(struct p + break; + } + ++ /* Disable SGMII AN */ ++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x7588, 0x2); ++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x7589, 0x71d0); ++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x7587, 0x3); ++ phy_read_mmd_poll_timeout(phydev, RTL8221B_MMD_SERDES_CTRL, 0x7587, ++ val, !(val & BIT(0)), 500, 100000, false); ++ + return 0; + } + diff --git a/target/linux/generic/pending-5.15/726-net-phy-realtek-make-sure-paged-read-is-protected-by.patch b/target/linux/generic/pending-5.15/726-net-phy-realtek-make-sure-paged-read-is-protected-by.patch new file mode 100644 index 0000000000..31f0622327 --- /dev/null +++ b/target/linux/generic/pending-5.15/726-net-phy-realtek-make-sure-paged-read-is-protected-by.patch @@ -0,0 +1,35 @@ +From 4dd2cc9b91ecb25f278a2c55e07e6455e9000e6b Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sat, 22 Apr 2023 01:21:14 +0100 +Subject: [PATCH] net: phy: realtek: make sure paged read is protected by mutex + +As we cannot rely on phy_read_paged function before the PHY is +identified, the paged read in rtlgen_supports_2_5gbps needs to be open +coded as it is being called by the match_phy_device function, ie. before +.read_page and .write_page have been populated. + +Make sure it is also protected by the MDIO bus mutex and use +rtl821x_write_page instead of 3 individually locked MDIO bus operations. + +Signed-off-by: Daniel Golle +--- + drivers/net/phy/realtek.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +--- a/drivers/net/phy/realtek.c ++++ b/drivers/net/phy/realtek.c +@@ -727,9 +727,11 @@ static bool rtlgen_supports_2_5gbps(stru + { + int val; + +- phy_write(phydev, RTL821x_PAGE_SELECT, 0xa61); +- val = phy_read(phydev, 0x13); +- phy_write(phydev, RTL821x_PAGE_SELECT, 0); ++ mutex_lock(&phydev->mdio.bus->mdio_lock); ++ rtl821x_write_page(phydev, 0xa61); ++ val = __phy_read(phydev, 0x13); ++ rtl821x_write_page(phydev, 0); ++ mutex_unlock(&phydev->mdio.bus->mdio_lock); + + return val >= 0 && val & RTL_SUPPORTS_2500FULL; + } diff --git a/target/linux/generic/pending-5.15/727-net-phy-realtek-use-inline-functions-for-10GbE-adver.patch b/target/linux/generic/pending-5.15/727-net-phy-realtek-use-inline-functions-for-10GbE-adver.patch new file mode 100644 index 0000000000..a24b4dd79a --- /dev/null +++ b/target/linux/generic/pending-5.15/727-net-phy-realtek-use-inline-functions-for-10GbE-adver.patch @@ -0,0 +1,60 @@ +From 92c8b9d558160d94b981dd8a2b9c47657627ffdc Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sat, 22 Apr 2023 01:23:08 +0100 +Subject: [PATCH 2/3] net: phy: realtek: use inline functions for 10GbE + advertisement + +Use existing generic inline functions to encode local advertisement +of 10GbE link modes as well as to decode link-partner advertisement. + +Signed-off-by: Daniel Golle +--- + drivers/net/phy/realtek.c | 22 +++++----------------- + 1 file changed, 5 insertions(+), 17 deletions(-) + +--- a/drivers/net/phy/realtek.c ++++ b/drivers/net/phy/realtek.c +@@ -68,10 +68,6 @@ + #define RTL_SUPPORTS_5000FULL BIT(14) + #define RTL_SUPPORTS_2500FULL BIT(13) + #define RTL_SUPPORTS_10000FULL BIT(0) +-#define RTL_ADV_2500FULL BIT(7) +-#define RTL_LPADV_10000FULL BIT(11) +-#define RTL_LPADV_5000FULL BIT(6) +-#define RTL_LPADV_2500FULL BIT(5) + + #define RTL9000A_GINMR 0x14 + #define RTL9000A_GINMR_LINK_STATUS BIT(4) +@@ -661,14 +657,11 @@ static int rtl822x_config_aneg(struct ph + int ret = 0; + + if (phydev->autoneg == AUTONEG_ENABLE) { +- u16 adv2500 = 0; +- +- if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, +- phydev->advertising)) +- adv2500 = RTL_ADV_2500FULL; +- + ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12, +- RTL_ADV_2500FULL, adv2500); ++ MDIO_AN_10GBT_CTRL_ADV10G | ++ MDIO_AN_10GBT_CTRL_ADV5G | ++ MDIO_AN_10GBT_CTRL_ADV2_5G, ++ linkmode_adv_to_mii_10gbt_adv_t(phydev->advertising)); + if (ret < 0) + return ret; + } +@@ -705,12 +698,7 @@ static int rtl822x_read_status(struct ph + if (lpadv < 0) + return lpadv; + +- linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, +- phydev->lp_advertising, lpadv & RTL_LPADV_10000FULL); +- linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, +- phydev->lp_advertising, lpadv & RTL_LPADV_5000FULL); +- linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, +- phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL); ++ mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, lpadv); + } + + ret = rtlgen_read_status(phydev); diff --git a/target/linux/generic/pending-5.15/728-net-phy-realtek-check-validity-of-10GbE-link-partner.patch b/target/linux/generic/pending-5.15/728-net-phy-realtek-check-validity-of-10GbE-link-partner.patch new file mode 100644 index 0000000000..084ee4b645 --- /dev/null +++ b/target/linux/generic/pending-5.15/728-net-phy-realtek-check-validity-of-10GbE-link-partner.patch @@ -0,0 +1,28 @@ +From 929bb4d3cfbc7878326c0771a01a636d49c54b40 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sat, 22 Apr 2023 01:25:39 +0100 +Subject: [PATCH 3/3] net: phy: realtek: check validity of 10GbE link-partner + advertisement + +Only use link-partner advertisement bits for 10GbE modes if they are +actually valid. Check LOCALOK and REMOTEOK bits and clear 10GbE modes +unless both of them are set. + +Signed-off-by: Daniel Golle +--- + drivers/net/phy/realtek.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/net/phy/realtek.c ++++ b/drivers/net/phy/realtek.c +@@ -698,6 +698,10 @@ static int rtl822x_read_status(struct ph + if (lpadv < 0) + return lpadv; + ++ if (!(lpadv & MDIO_AN_10GBT_STAT_REMOK) || ++ !(lpadv & MDIO_AN_10GBT_STAT_LOCOK)) ++ lpadv = 0; ++ + mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, lpadv); + } + diff --git a/target/linux/generic/pending-5.15/729-net-phy-realtek-introduce-rtl822x_probe.patch b/target/linux/generic/pending-5.15/729-net-phy-realtek-introduce-rtl822x_probe.patch new file mode 100644 index 0000000000..cea3511b83 --- /dev/null +++ b/target/linux/generic/pending-5.15/729-net-phy-realtek-introduce-rtl822x_probe.patch @@ -0,0 +1,84 @@ +From 9155098547fb1172d4fa536f3f6bc9d42f59d08c Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sat, 22 Apr 2023 03:26:01 +0100 +Subject: [PATCH] net: phy: realtek: setup ALDPS on RTL822x + +Setup Link Down Power Saving Mode according the DTS property +just like for RTL821x 1GE PHYs. + +Signed-off-by: Daniel Golle +--- + drivers/net/phy/realtek.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +--- a/drivers/net/phy/realtek.c ++++ b/drivers/net/phy/realtek.c +@@ -62,6 +62,10 @@ + #define RTL8221B_SERDES_OPTION_MODE_2500BASEX 2 + #define RTL8221B_SERDES_OPTION_MODE_HISGMII 3 + ++#define RTL8221B_PHYCR1 0xa430 ++#define RTL8221B_PHYCR1_ALDPS_EN BIT(2) ++#define RTL8221B_PHYCR1_ALDPS_XTAL_OFF_EN BIT(12) ++ + #define RTL8366RB_POWER_SAVE 0x15 + #define RTL8366RB_POWER_SAVE_ON BIT(12) + +@@ -740,6 +744,25 @@ static int rtl8226_match_phy_device(stru + rtlgen_supports_2_5gbps(phydev); + } + ++static int rtl822x_probe(struct phy_device *phydev) ++{ ++ struct device *dev = &phydev->mdio.dev; ++ int val; ++ ++ val = phy_read_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, RTL8221B_PHYCR1); ++ if (val < 0) ++ return val; ++ ++ if (of_property_read_bool(dev->of_node, "realtek,aldps-enable")) ++ val |= RTL8221B_PHYCR1_ALDPS_EN | RTL8221B_PHYCR1_ALDPS_XTAL_OFF_EN; ++ else ++ val &= ~(RTL8221B_PHYCR1_ALDPS_EN | RTL8221B_PHYCR1_ALDPS_XTAL_OFF_EN); ++ ++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, RTL8221B_PHYCR1, val); ++ ++ return 0; ++} ++ + static int rtlgen_resume(struct phy_device *phydev) + { + int ret = genphy_resume(phydev); +@@ -1039,6 +1062,7 @@ static struct phy_driver realtek_drvs[] + .name = "RTL8226-CG 2.5Gbps PHY", + .get_features = rtl822x_get_features, + .config_aneg = rtl822x_config_aneg, ++ .probe = rtl822x_probe, + .read_status = rtl822x_read_status, + .suspend = genphy_suspend, + .resume = rtlgen_resume, +@@ -1050,6 +1074,7 @@ static struct phy_driver realtek_drvs[] + .name = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY", + .get_features = rtl822x_get_features, + .config_aneg = rtl822x_config_aneg, ++ .probe = rtl822x_probe, + .read_status = rtl822x_read_status, + .suspend = genphy_suspend, + .resume = rtlgen_resume, +@@ -1062,6 +1087,7 @@ static struct phy_driver realtek_drvs[] + .get_features = rtl822x_get_features, + .config_init = rtl8221b_config_init, + .config_aneg = rtl822x_config_aneg, ++ .probe = rtl822x_probe, + .read_status = rtl822x_read_status, + .suspend = genphy_suspend, + .resume = rtlgen_resume, +@@ -1074,6 +1100,7 @@ static struct phy_driver realtek_drvs[] + .get_features = rtl822x_get_features, + .config_aneg = rtl822x_config_aneg, + .config_init = rtl8221b_config_init, ++ .probe = rtl822x_probe, + .read_status = rtl822x_read_status, + .suspend = genphy_suspend, + .resume = rtlgen_resume, diff --git a/target/linux/generic/pending-5.15/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch b/target/linux/generic/pending-5.15/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch new file mode 100644 index 0000000000..b1e7a35a55 --- /dev/null +++ b/target/linux/generic/pending-5.15/730-net-phy-realtek-detect-early-version-of-RTL8221B.patch @@ -0,0 +1,63 @@ +From 0de82310d2b32e78ff79d42c08b1122a6ede3778 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sun, 30 Apr 2023 00:15:41 +0100 +Subject: [PATCH] net: phy: realtek: detect early version of RTL8221B + +Early versions (?) of the RTL8221B PHY cannot be identified in a regular +Clause-45 bus scan as the PHY doesn't report the implemented MMDs +correctly but returns 0 instead. +Implement custom identify function using the PKGID instead of iterating +over the implemented MMDs. + +Signed-off-by: Daniel Golle + +--- a/drivers/net/phy/realtek.c ++++ b/drivers/net/phy/realtek.c +@@ -744,6 +744,38 @@ static int rtl8226_match_phy_device(stru + rtlgen_supports_2_5gbps(phydev); + } + ++static int rtl8221b_vb_cg_match_phy_device(struct phy_device *phydev) ++{ ++ int val; ++ u32 id; ++ ++ if (phydev->mdio.bus->probe_capabilities >= MDIOBUS_C45) { ++ val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PKGID1); ++ if (val < 0) ++ return 0; ++ ++ id = val << 16; ++ val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PKGID2); ++ if (val < 0) ++ return 0; ++ ++ id |= val; ++ } else { ++ val = phy_read(phydev, MII_PHYSID1); ++ if (val < 0) ++ return 0; ++ ++ id = val << 16; ++ val = phy_read(phydev, MII_PHYSID2); ++ if (val < 0) ++ return 0; ++ ++ id |= val; ++ } ++ ++ return (id == 0x001cc849); ++} ++ + static int rtl822x_probe(struct phy_device *phydev) + { + struct device *dev = &phydev->mdio.dev; +@@ -1082,7 +1114,7 @@ static struct phy_driver realtek_drvs[] + .write_page = rtl821x_write_page, + .soft_reset = genphy_soft_reset, + }, { +- PHY_ID_MATCH_EXACT(0x001cc849), ++ .match_phy_device = rtl8221b_vb_cg_match_phy_device, + .name = "RTL8221B-VB-CG 2.5Gbps PHY", + .get_features = rtl822x_get_features, + .config_init = rtl8221b_config_init, diff --git a/target/linux/generic/pending-5.15/732-00-net-ethernet-mtk_eth_soc-compile-out-netsys-v2-code-.patch b/target/linux/generic/pending-5.15/732-00-net-ethernet-mtk_eth_soc-compile-out-netsys-v2-code-.patch new file mode 100644 index 0000000000..1d84ea9ced --- /dev/null +++ b/target/linux/generic/pending-5.15/732-00-net-ethernet-mtk_eth_soc-compile-out-netsys-v2-code-.patch @@ -0,0 +1,44 @@ +From: Felix Fietkau +Date: Thu, 27 Oct 2022 23:39:52 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: compile out netsys v2 code + on mt7621 + +Avoid some branches in the hot path on low-end devices with limited CPU power, +and reduce code size + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1323,6 +1323,22 @@ struct mtk_mac { + /* the struct describing the SoC. these are declared in the soc_xyz.c files */ + extern const struct of_device_id of_mtk_match[]; + ++#ifdef CONFIG_SOC_MT7621 ++static inline bool mtk_is_netsys_v1(struct mtk_eth *eth) ++{ ++ return true; ++} ++ ++static inline bool mtk_is_netsys_v2_or_greater(struct mtk_eth *eth) ++{ ++ return false; ++} ++ ++static inline bool mtk_is_netsys_v3_or_greater(struct mtk_eth *eth) ++{ ++ return false; ++} ++#else + static inline bool mtk_is_netsys_v1(struct mtk_eth *eth) + { + return eth->soc->version == 1; +@@ -1337,6 +1353,7 @@ static inline bool mtk_is_netsys_v3_or_g + { + return eth->soc->version > 2; + } ++#endif + + static inline struct mtk_foe_entry * + mtk_foe_get_entry(struct mtk_ppe *ppe, u16 hash) diff --git a/target/linux/generic/pending-5.15/732-01-net-ethernet-mtk_eth_soc-work-around-issue-with-send.patch b/target/linux/generic/pending-5.15/732-01-net-ethernet-mtk_eth_soc-work-around-issue-with-send.patch new file mode 100644 index 0000000000..56edb63234 --- /dev/null +++ b/target/linux/generic/pending-5.15/732-01-net-ethernet-mtk_eth_soc-work-around-issue-with-send.patch @@ -0,0 +1,94 @@ +From: Felix Fietkau +Date: Thu, 3 Nov 2022 12:38:49 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: work around issue with sending + small fragments + +When lots of frames are sent with a number of very small fragments, an +internal FIFO can overflow, causing the DMA engine to lock up lock up and +transmit attempts time out. + +Fix this on MT7986 by increasing the reserved FIFO space. +Fix this on older chips by detecting the presence of small fragments and use +skb_gso_segment + skb_linearize to deal with them. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1516,12 +1516,28 @@ static void mtk_wake_queue(struct mtk_et + } + } + ++static bool mtk_skb_has_small_frag(struct sk_buff *skb) ++{ ++ int min_size = 16; ++ int i; ++ ++ if (skb_headlen(skb) < min_size) ++ return true; ++ ++ for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) ++ if (skb_frag_size(&skb_shinfo(skb)->frags[i]) < min_size) ++ return true; ++ ++ return false; ++} ++ + static netdev_tx_t mtk_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct mtk_mac *mac = netdev_priv(dev); + struct mtk_eth *eth = mac->hw; + struct mtk_tx_ring *ring = ð->tx_ring; + struct net_device_stats *stats = &dev->stats; ++ struct sk_buff *segs, *next; + bool gso = false; + int tx_num; + +@@ -1543,6 +1559,18 @@ static netdev_tx_t mtk_start_xmit(struct + return NETDEV_TX_BUSY; + } + ++ if (mtk_is_netsys_v1(eth) && ++ skb_is_gso(skb) && mtk_skb_has_small_frag(skb)) { ++ segs = skb_gso_segment(skb, dev->features & ~NETIF_F_ALL_TSO); ++ if (IS_ERR(segs)) ++ goto drop; ++ ++ if (segs) { ++ consume_skb(skb); ++ skb = segs; ++ } ++ } ++ + /* TSO: fill MSS info in tcp checksum field */ + if (skb_is_gso(skb)) { + if (skb_cow_head(skb, 0)) { +@@ -1558,8 +1586,14 @@ static netdev_tx_t mtk_start_xmit(struct + } + } + +- if (mtk_tx_map(skb, dev, tx_num, ring, gso) < 0) +- goto drop; ++ skb_list_walk_safe(skb, skb, next) { ++ if ((mtk_is_netsys_v1(eth) && ++ mtk_skb_has_small_frag(skb) && skb_linearize(skb)) || ++ mtk_tx_map(skb, dev, tx_num, ring, gso) < 0) { ++ stats->tx_dropped++; ++ dev_kfree_skb_any(skb); ++ } ++ } + + if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) + netif_tx_stop_all_queues(dev); +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -268,7 +268,7 @@ + #define MTK_CHK_DDONE_EN BIT(28) + #define MTK_DMAD_WR_WDONE BIT(26) + #define MTK_WCOMP_EN BIT(24) +-#define MTK_RESV_BUF (0x40 << 16) ++#define MTK_RESV_BUF (0x80 << 16) + #define MTK_MUTLI_CNT (0x4 << 12) + #define MTK_LEAKY_BUCKET_EN BIT(11) + diff --git a/target/linux/generic/pending-5.15/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch b/target/linux/generic/pending-5.15/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch new file mode 100644 index 0000000000..11a81dd0bf --- /dev/null +++ b/target/linux/generic/pending-5.15/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch @@ -0,0 +1,21 @@ +From: Felix Fietkau +Date: Fri, 28 Oct 2022 12:54:48 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: set NETIF_F_ALL_TSO + +Significantly improves performance by avoiding unnecessary segmentation + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -47,8 +47,7 @@ + #define MTK_HW_FEATURES (NETIF_F_IP_CSUM | \ + NETIF_F_RXCSUM | \ + NETIF_F_HW_VLAN_CTAG_TX | \ +- NETIF_F_SG | NETIF_F_TSO | \ +- NETIF_F_TSO6 | \ ++ NETIF_F_SG | NETIF_F_ALL_TSO | \ + NETIF_F_IPV6_CSUM |\ + NETIF_F_HW_TC) + #define MTK_HW_FEATURES_MT7628 (NETIF_F_SG | NETIF_F_RXCSUM) diff --git a/target/linux/generic/pending-5.15/732-03-net-ethernet-mtk_eth_soc-fix-remaining-throughput-re.patch b/target/linux/generic/pending-5.15/732-03-net-ethernet-mtk_eth_soc-fix-remaining-throughput-re.patch new file mode 100644 index 0000000000..2de28b11dd --- /dev/null +++ b/target/linux/generic/pending-5.15/732-03-net-ethernet-mtk_eth_soc-fix-remaining-throughput-re.patch @@ -0,0 +1,42 @@ +From: Felix Fietkau +Date: Wed, 29 Mar 2023 16:02:54 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: fix remaining throughput + regression + +Based on further tests, it seems that the QDMA shaper is not able to +perform shaping close to the MAC link rate without throughput loss. +This cannot be compensated by increasing the shaping rate, so it seems +to be an internal limit. + +Fix the remaining throughput regression by detecting that condition and +limiting shaping to ports with lower link speed. + +This patch intentionally ignores link speed gain from TRGMII, because +even on such links, shaping to 1000 Mbit/s incurs some throughput +degradation. + +Fixes: f63959c7eec3 ("net: ethernet: mtk_eth_soc: implement multi-queue support for per-port queues") +Reported-by: Frank Wunderlich +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -723,6 +723,7 @@ static void mtk_mac_link_up(struct phyli + MAC_MCR_FORCE_RX_FC); + + /* Configure speed */ ++ mac->speed = speed; + switch (speed) { + case SPEED_2500: + case SPEED_1000: +@@ -3291,6 +3292,9 @@ found: + if (dp->index >= MTK_QDMA_NUM_QUEUES) + return NOTIFY_DONE; + ++ if (mac->speed > 0 && mac->speed <= s.base.speed) ++ s.base.speed = 0; ++ + mtk_set_queue_speed(eth, dp->index + 3, s.base.speed); + + return NOTIFY_DONE; diff --git a/target/linux/generic/pending-5.15/734-net-ethernet-mtk_eth_soc-ppe-fix-L2-offloading-with-.patch b/target/linux/generic/pending-5.15/734-net-ethernet-mtk_eth_soc-ppe-fix-L2-offloading-with-.patch new file mode 100644 index 0000000000..104ce00b7e --- /dev/null +++ b/target/linux/generic/pending-5.15/734-net-ethernet-mtk_eth_soc-ppe-fix-L2-offloading-with-.patch @@ -0,0 +1,33 @@ +From: Felix Fietkau +Date: Tue, 27 Dec 2022 15:02:51 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: ppe: fix L2 offloading with DSA + untagging offload enabled + +Check for skb metadata in order to detect the case where the DSA header is not +present. + +Fixes: 2d7605a72906 ("net: ethernet: mtk_eth_soc: enable hardware DSA untagging") +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + #include "mtk_eth_soc.h" + #include "mtk_ppe.h" +@@ -781,7 +782,9 @@ void __mtk_ppe_check_skb(struct mtk_ppe + skb->dev->dsa_ptr->tag_ops->proto != DSA_TAG_PROTO_MTK) + goto out; + +- tag += 4; ++ if (!skb_metadata_dst(skb)) ++ tag += 4; ++ + if (get_unaligned_be16(tag) != ETH_P_8021Q) + break; + diff --git a/target/linux/generic/pending-5.15/736-01-net-ethernet-mtk_eth_soc-add-code-for-offloading-flo.patch b/target/linux/generic/pending-5.15/736-01-net-ethernet-mtk_eth_soc-add-code-for-offloading-flo.patch new file mode 100644 index 0000000000..d648ba4dc7 --- /dev/null +++ b/target/linux/generic/pending-5.15/736-01-net-ethernet-mtk_eth_soc-add-code-for-offloading-flo.patch @@ -0,0 +1,266 @@ +From: Felix Fietkau +Date: Mon, 20 Mar 2023 11:44:30 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: add code for offloading flows + from wlan devices + +WED version 2 (on MT7986 and later) can offload flows originating from wireless +devices. In order to make that work, ndo_setup_tc needs to be implemented on +the netdevs. This adds the required code to offload flows coming in from WED, +while keeping track of the incoming wed index used for selecting the correct +PPE device. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -1448,6 +1448,9 @@ int mtk_gmac_rgmii_path_setup(struct mtk + int mtk_eth_offload_init(struct mtk_eth *eth); + int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type, + void *type_data); ++int mtk_flow_offload_cmd(struct mtk_eth *eth, struct flow_cls_offload *cls, ++ int ppe_index); ++void mtk_flow_offload_cleanup(struct mtk_eth *eth, struct list_head *list); + void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev); + + +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -235,7 +235,8 @@ out: + } + + static int +-mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f) ++mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f, ++ int ppe_index) + { + struct flow_rule *rule = flow_cls_offload_flow_rule(f); + struct flow_action_entry *act; +@@ -452,6 +453,7 @@ mtk_flow_offload_replace(struct mtk_eth + entry->cookie = f->cookie; + memcpy(&entry->data, &foe, sizeof(entry->data)); + entry->wed_index = wed_index; ++ entry->ppe_index = ppe_index; + + err = mtk_foe_entry_commit(eth->ppe[entry->ppe_index], entry); + if (err < 0) +@@ -520,25 +522,15 @@ mtk_flow_offload_stats(struct mtk_eth *e + + static DEFINE_MUTEX(mtk_flow_offload_mutex); + +-static int +-mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv) ++int mtk_flow_offload_cmd(struct mtk_eth *eth, struct flow_cls_offload *cls, ++ int ppe_index) + { +- struct flow_cls_offload *cls = type_data; +- struct net_device *dev = cb_priv; +- struct mtk_mac *mac = netdev_priv(dev); +- struct mtk_eth *eth = mac->hw; + int err; + +- if (!tc_can_offload(dev)) +- return -EOPNOTSUPP; +- +- if (type != TC_SETUP_CLSFLOWER) +- return -EOPNOTSUPP; +- + mutex_lock(&mtk_flow_offload_mutex); + switch (cls->command) { + case FLOW_CLS_REPLACE: +- err = mtk_flow_offload_replace(eth, cls); ++ err = mtk_flow_offload_replace(eth, cls, ppe_index); + break; + case FLOW_CLS_DESTROY: + err = mtk_flow_offload_destroy(eth, cls); +@@ -556,6 +548,23 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_ + } + + static int ++mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv) ++{ ++ struct flow_cls_offload *cls = type_data; ++ struct net_device *dev = cb_priv; ++ struct mtk_mac *mac = netdev_priv(dev); ++ struct mtk_eth *eth = mac->hw; ++ ++ if (!tc_can_offload(dev)) ++ return -EOPNOTSUPP; ++ ++ if (type != TC_SETUP_CLSFLOWER) ++ return -EOPNOTSUPP; ++ ++ return mtk_flow_offload_cmd(eth, cls, 0); ++} ++ ++static int + mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f) + { + struct mtk_mac *mac = netdev_priv(dev); +--- a/drivers/net/ethernet/mediatek/mtk_wed.c ++++ b/drivers/net/ethernet/mediatek/mtk_wed.c +@@ -13,6 +13,8 @@ + #include + #include + #include ++#include ++#include + #include "mtk_eth_soc.h" + #include "mtk_wed_regs.h" + #include "mtk_wed.h" +@@ -41,6 +43,11 @@ + static struct mtk_wed_hw *hw_list[2]; + static DEFINE_MUTEX(hw_lock); + ++struct mtk_wed_flow_block_priv { ++ struct mtk_wed_hw *hw; ++ struct net_device *dev; ++}; ++ + static void + wed_m32(struct mtk_wed_device *dev, u32 reg, u32 mask, u32 val) + { +@@ -1760,6 +1767,99 @@ out: + mutex_unlock(&hw_lock); + } + ++static int ++mtk_wed_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv) ++{ ++ struct mtk_wed_flow_block_priv *priv = cb_priv; ++ struct flow_cls_offload *cls = type_data; ++ struct mtk_wed_hw *hw = priv->hw; ++ ++ if (!tc_can_offload(priv->dev)) ++ return -EOPNOTSUPP; ++ ++ if (type != TC_SETUP_CLSFLOWER) ++ return -EOPNOTSUPP; ++ ++ return mtk_flow_offload_cmd(hw->eth, cls, hw->index); ++} ++ ++static int ++mtk_wed_setup_tc_block(struct mtk_wed_hw *hw, struct net_device *dev, ++ struct flow_block_offload *f) ++{ ++ struct mtk_wed_flow_block_priv *priv; ++ static LIST_HEAD(block_cb_list); ++ struct flow_block_cb *block_cb; ++ struct mtk_eth *eth = hw->eth; ++ flow_setup_cb_t *cb; ++ ++ if (!eth->soc->offload_version) ++ return -EOPNOTSUPP; ++ ++ if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) ++ return -EOPNOTSUPP; ++ ++ cb = mtk_wed_setup_tc_block_cb; ++ f->driver_block_list = &block_cb_list; ++ ++ switch (f->command) { ++ case FLOW_BLOCK_BIND: ++ block_cb = flow_block_cb_lookup(f->block, cb, dev); ++ if (block_cb) { ++ flow_block_cb_incref(block_cb); ++ return 0; ++ } ++ ++ priv = kzalloc(sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ priv->hw = hw; ++ priv->dev = dev; ++ block_cb = flow_block_cb_alloc(cb, dev, priv, NULL); ++ if (IS_ERR(block_cb)) { ++ kfree(priv); ++ return PTR_ERR(block_cb); ++ } ++ ++ flow_block_cb_incref(block_cb); ++ flow_block_cb_add(block_cb, f); ++ list_add_tail(&block_cb->driver_list, &block_cb_list); ++ return 0; ++ case FLOW_BLOCK_UNBIND: ++ block_cb = flow_block_cb_lookup(f->block, cb, dev); ++ if (!block_cb) ++ return -ENOENT; ++ ++ if (!flow_block_cb_decref(block_cb)) { ++ flow_block_cb_remove(block_cb, f); ++ list_del(&block_cb->driver_list); ++ kfree(block_cb->cb_priv); ++ } ++ return 0; ++ default: ++ return -EOPNOTSUPP; ++ } ++} ++ ++static int ++mtk_wed_setup_tc(struct mtk_wed_device *wed, struct net_device *dev, ++ enum tc_setup_type type, void *type_data) ++{ ++ struct mtk_wed_hw *hw = wed->hw; ++ ++ if (hw->version < 2) ++ return -EOPNOTSUPP; ++ ++ switch (type) { ++ case TC_SETUP_BLOCK: ++ case TC_SETUP_FT: ++ return mtk_wed_setup_tc_block(hw, dev, type_data); ++ default: ++ return -EOPNOTSUPP; ++ } ++} ++ + void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, + void __iomem *wdma, phys_addr_t wdma_phy, + int index) +@@ -1779,6 +1879,7 @@ void mtk_wed_add_hw(struct device_node * + .irq_set_mask = mtk_wed_irq_set_mask, + .detach = mtk_wed_detach, + .ppe_check = mtk_wed_ppe_check, ++ .setup_tc = mtk_wed_setup_tc, + }; + struct device_node *eth_np = eth->dev->of_node; + struct platform_device *pdev; +--- a/include/linux/soc/mediatek/mtk_wed.h ++++ b/include/linux/soc/mediatek/mtk_wed.h +@@ -6,6 +6,7 @@ + #include + #include + #include ++#include + + #define MTK_WED_TX_QUEUES 2 + #define MTK_WED_RX_QUEUES 2 +@@ -180,6 +181,8 @@ struct mtk_wed_ops { + + u32 (*irq_get)(struct mtk_wed_device *dev, u32 mask); + void (*irq_set_mask)(struct mtk_wed_device *dev, u32 mask); ++ int (*setup_tc)(struct mtk_wed_device *wed, struct net_device *dev, ++ enum tc_setup_type type, void *type_data); + }; + + extern const struct mtk_wed_ops __rcu *mtk_soc_wed_ops; +@@ -238,6 +241,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_devic + (_dev)->ops->msg_update(_dev, _id, _msg, _len) + #define mtk_wed_device_stop(_dev) (_dev)->ops->stop(_dev) + #define mtk_wed_device_dma_reset(_dev) (_dev)->ops->reset_dma(_dev) ++#define mtk_wed_device_setup_tc(_dev, _netdev, _type, _type_data) \ ++ (_dev)->ops->setup_tc(_dev, _netdev, _type, _type_data) + #else + static inline bool mtk_wed_device_active(struct mtk_wed_device *dev) + { +@@ -256,6 +261,7 @@ static inline bool mtk_wed_device_active + #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) -ENODEV + #define mtk_wed_device_stop(_dev) do {} while (0) + #define mtk_wed_device_dma_reset(_dev) do {} while (0) ++#define mtk_wed_device_setup_tc(_dev, _netdev, _type, _type_data) -EOPNOTSUPP + #endif + + #endif diff --git a/target/linux/generic/pending-5.15/736-02-net-ethernet-mediatek-mtk_ppe-prefer-newly-added-l2-.patch b/target/linux/generic/pending-5.15/736-02-net-ethernet-mediatek-mtk_ppe-prefer-newly-added-l2-.patch new file mode 100644 index 0000000000..e89d4cd97b --- /dev/null +++ b/target/linux/generic/pending-5.15/736-02-net-ethernet-mediatek-mtk_ppe-prefer-newly-added-l2-.patch @@ -0,0 +1,37 @@ +From: Felix Fietkau +Date: Mon, 20 Mar 2023 15:37:55 +0100 +Subject: [PATCH] net: ethernet: mediatek: mtk_ppe: prefer newly added l2 + flows over existing ones + +When a device is roaming between interfaces and a new flow entry is created, +we should assume that its output device is more up to date than whatever +entry existed already. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -663,10 +663,20 @@ void mtk_foe_entry_clear(struct mtk_ppe + static int + mtk_foe_entry_commit_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { ++ struct mtk_flow_entry *prev; ++ + entry->type = MTK_FLOW_TYPE_L2; + +- return rhashtable_insert_fast(&ppe->l2_flows, &entry->l2_node, +- mtk_flow_l2_ht_params); ++ prev = rhashtable_lookup_get_insert_fast(&ppe->l2_flows, &entry->l2_node, ++ mtk_flow_l2_ht_params); ++ if (likely(!prev)) ++ return 0; ++ ++ if (IS_ERR(prev)) ++ return PTR_ERR(prev); ++ ++ return rhashtable_replace_fast(&ppe->l2_flows, &prev->l2_node, ++ &entry->l2_node, mtk_flow_l2_ht_params); + } + + int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) diff --git a/target/linux/generic/pending-5.15/736-03-net-ethernet-mtk_eth_soc-improve-keeping-track-of-of.patch b/target/linux/generic/pending-5.15/736-03-net-ethernet-mtk_eth_soc-improve-keeping-track-of-of.patch new file mode 100644 index 0000000000..c8be7a9e2b --- /dev/null +++ b/target/linux/generic/pending-5.15/736-03-net-ethernet-mtk_eth_soc-improve-keeping-track-of-of.patch @@ -0,0 +1,331 @@ +From: Felix Fietkau +Date: Thu, 23 Mar 2023 10:24:11 +0100 +Subject: [PATCH] net: ethernet: mtk_eth_soc: improve keeping track of + offloaded flows + +Unify tracking of L2 and L3 flows. Use the generic list field in struct +mtk_foe_entry for tracking L2 subflows. Preparation for improving +flow accounting support. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -483,42 +483,43 @@ int mtk_foe_entry_set_queue(struct mtk_e + return 0; + } + ++static int ++mtk_flow_entry_match_len(struct mtk_eth *eth, struct mtk_foe_entry *entry) ++{ ++ int type = mtk_get_ib1_pkt_type(eth, entry->ib1); ++ ++ if (type > MTK_PPE_PKT_TYPE_IPV4_DSLITE) ++ return offsetof(struct mtk_foe_entry, ipv6._rsv); ++ else ++ return offsetof(struct mtk_foe_entry, ipv4.ib2); ++} ++ + static bool + mtk_flow_entry_match(struct mtk_eth *eth, struct mtk_flow_entry *entry, +- struct mtk_foe_entry *data) ++ struct mtk_foe_entry *data, int len) + { +- int type, len; +- + if ((data->ib1 ^ entry->data.ib1) & MTK_FOE_IB1_UDP) + return false; + +- type = mtk_get_ib1_pkt_type(eth, entry->data.ib1); +- if (type > MTK_PPE_PKT_TYPE_IPV4_DSLITE) +- len = offsetof(struct mtk_foe_entry, ipv6._rsv); +- else +- len = offsetof(struct mtk_foe_entry, ipv4.ib2); +- + return !memcmp(&entry->data.data, &data->data, len - 4); + } + + static void +-__mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) ++__mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry, ++ bool set_state) + { +- struct hlist_head *head; + struct hlist_node *tmp; + + if (entry->type == MTK_FLOW_TYPE_L2) { + rhashtable_remove_fast(&ppe->l2_flows, &entry->l2_node, + mtk_flow_l2_ht_params); + +- head = &entry->l2_flows; +- hlist_for_each_entry_safe(entry, tmp, head, l2_data.list) +- __mtk_foe_entry_clear(ppe, entry); ++ hlist_for_each_entry_safe(entry, tmp, &entry->l2_flows, l2_list) ++ __mtk_foe_entry_clear(ppe, entry, set_state); + return; + } + +- hlist_del_init(&entry->list); +- if (entry->hash != 0xffff) { ++ if (entry->hash != 0xffff && set_state) { + struct mtk_foe_entry *hwe = mtk_foe_get_entry(ppe, entry->hash); + + hwe->ib1 &= ~MTK_FOE_IB1_STATE; +@@ -538,7 +539,8 @@ __mtk_foe_entry_clear(struct mtk_ppe *pp + if (entry->type != MTK_FLOW_TYPE_L2_SUBFLOW) + return; + +- hlist_del_init(&entry->l2_data.list); ++ hlist_del_init(&entry->l2_list); ++ hlist_del_init(&entry->list); + kfree(entry); + } + +@@ -554,66 +556,55 @@ static int __mtk_foe_entry_idle_time(str + return now - timestamp; + } + ++static bool ++mtk_flow_entry_update(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) ++{ ++ struct mtk_foe_entry foe = {}; ++ struct mtk_foe_entry *hwe; ++ u16 hash = entry->hash; ++ int len; ++ ++ if (hash == 0xffff) ++ return false; ++ ++ hwe = mtk_foe_get_entry(ppe, hash); ++ len = mtk_flow_entry_match_len(ppe->eth, &entry->data); ++ memcpy(&foe, hwe, len); ++ ++ if (!mtk_flow_entry_match(ppe->eth, entry, &foe, len) || ++ FIELD_GET(MTK_FOE_IB1_STATE, foe.ib1) != MTK_FOE_STATE_BIND) ++ return false; ++ ++ entry->data.ib1 = foe.ib1; ++ ++ return true; ++} ++ + static void + mtk_flow_entry_update_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { + u32 ib1_ts_mask = mtk_get_ib1_ts_mask(ppe->eth); + struct mtk_flow_entry *cur; +- struct mtk_foe_entry *hwe; + struct hlist_node *tmp; + int idle; + + idle = __mtk_foe_entry_idle_time(ppe, entry->data.ib1); +- hlist_for_each_entry_safe(cur, tmp, &entry->l2_flows, l2_data.list) { ++ hlist_for_each_entry_safe(cur, tmp, &entry->l2_flows, l2_list) { + int cur_idle; +- u32 ib1; +- +- hwe = mtk_foe_get_entry(ppe, cur->hash); +- ib1 = READ_ONCE(hwe->ib1); + +- if (FIELD_GET(MTK_FOE_IB1_STATE, ib1) != MTK_FOE_STATE_BIND) { +- cur->hash = 0xffff; +- __mtk_foe_entry_clear(ppe, cur); ++ if (!mtk_flow_entry_update(ppe, cur)) { ++ __mtk_foe_entry_clear(ppe, entry, false); + continue; + } + +- cur_idle = __mtk_foe_entry_idle_time(ppe, ib1); ++ cur_idle = __mtk_foe_entry_idle_time(ppe, cur->data.ib1); + if (cur_idle >= idle) + continue; + + idle = cur_idle; + entry->data.ib1 &= ~ib1_ts_mask; +- entry->data.ib1 |= hwe->ib1 & ib1_ts_mask; +- } +-} +- +-static void +-mtk_flow_entry_update(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) +-{ +- struct mtk_foe_entry foe = {}; +- struct mtk_foe_entry *hwe; +- +- spin_lock_bh(&ppe_lock); +- +- if (entry->type == MTK_FLOW_TYPE_L2) { +- mtk_flow_entry_update_l2(ppe, entry); +- goto out; ++ entry->data.ib1 |= cur->data.ib1 & ib1_ts_mask; + } +- +- if (entry->hash == 0xffff) +- goto out; +- +- hwe = mtk_foe_get_entry(ppe, entry->hash); +- memcpy(&foe, hwe, ppe->eth->soc->foe_entry_size); +- if (!mtk_flow_entry_match(ppe->eth, entry, &foe)) { +- entry->hash = 0xffff; +- goto out; +- } +- +- entry->data.ib1 = foe.ib1; +- +-out: +- spin_unlock_bh(&ppe_lock); + } + + static void +@@ -656,7 +647,8 @@ __mtk_foe_entry_commit(struct mtk_ppe *p + void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { + spin_lock_bh(&ppe_lock); +- __mtk_foe_entry_clear(ppe, entry); ++ __mtk_foe_entry_clear(ppe, entry, true); ++ hlist_del_init(&entry->list); + spin_unlock_bh(&ppe_lock); + } + +@@ -703,8 +695,8 @@ mtk_foe_entry_commit_subflow(struct mtk_ + { + const struct mtk_soc_data *soc = ppe->eth->soc; + struct mtk_flow_entry *flow_info; +- struct mtk_foe_entry foe = {}, *hwe; + struct mtk_foe_mac_info *l2; ++ struct mtk_foe_entry *hwe; + u32 ib1_mask = mtk_get_ib1_pkt_type_mask(ppe->eth) | MTK_FOE_IB1_UDP; + int type; + +@@ -712,30 +704,30 @@ mtk_foe_entry_commit_subflow(struct mtk_ + if (!flow_info) + return; + +- flow_info->l2_data.base_flow = entry; + flow_info->type = MTK_FLOW_TYPE_L2_SUBFLOW; + flow_info->hash = hash; + hlist_add_head(&flow_info->list, + &ppe->foe_flow[hash / soc->hash_offset]); +- hlist_add_head(&flow_info->l2_data.list, &entry->l2_flows); ++ hlist_add_head(&flow_info->l2_list, &entry->l2_flows); + + hwe = mtk_foe_get_entry(ppe, hash); +- memcpy(&foe, hwe, soc->foe_entry_size); +- foe.ib1 &= ib1_mask; +- foe.ib1 |= entry->data.ib1 & ~ib1_mask; ++ memcpy(&flow_info->data, hwe, soc->foe_entry_size); ++ flow_info->data.ib1 &= ib1_mask; ++ flow_info->data.ib1 |= entry->data.ib1 & ~ib1_mask; + +- l2 = mtk_foe_entry_l2(ppe->eth, &foe); ++ l2 = mtk_foe_entry_l2(ppe->eth, &flow_info->data); + memcpy(l2, &entry->data.bridge.l2, sizeof(*l2)); + +- type = mtk_get_ib1_pkt_type(ppe->eth, foe.ib1); ++ type = mtk_get_ib1_pkt_type(ppe->eth, flow_info->data.ib1); + if (type == MTK_PPE_PKT_TYPE_IPV4_HNAPT) +- memcpy(&foe.ipv4.new, &foe.ipv4.orig, sizeof(foe.ipv4.new)); ++ memcpy(&flow_info->data.ipv4.new, &flow_info->data.ipv4.orig, ++ sizeof(flow_info->data.ipv4.new)); + else if (type >= MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T && l2->etype == ETH_P_IP) + l2->etype = ETH_P_IPV6; + +- *mtk_foe_entry_ib2(ppe->eth, &foe) = entry->data.bridge.ib2; ++ *mtk_foe_entry_ib2(ppe->eth, &flow_info->data) = entry->data.bridge.ib2; + +- __mtk_foe_entry_commit(ppe, &foe, hash); ++ __mtk_foe_entry_commit(ppe, &flow_info->data, hash); + } + + void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash) +@@ -745,9 +737,11 @@ void __mtk_ppe_check_skb(struct mtk_ppe + struct mtk_foe_entry *hwe = mtk_foe_get_entry(ppe, hash); + struct mtk_flow_entry *entry; + struct mtk_foe_bridge key = {}; ++ struct mtk_foe_entry foe = {}; + struct hlist_node *n; + struct ethhdr *eh; + bool found = false; ++ int entry_len; + u8 *tag; + + spin_lock_bh(&ppe_lock); +@@ -755,20 +749,14 @@ void __mtk_ppe_check_skb(struct mtk_ppe + if (FIELD_GET(MTK_FOE_IB1_STATE, hwe->ib1) == MTK_FOE_STATE_BIND) + goto out; + +- hlist_for_each_entry_safe(entry, n, head, list) { +- if (entry->type == MTK_FLOW_TYPE_L2_SUBFLOW) { +- if (unlikely(FIELD_GET(MTK_FOE_IB1_STATE, hwe->ib1) == +- MTK_FOE_STATE_BIND)) +- continue; +- +- entry->hash = 0xffff; +- __mtk_foe_entry_clear(ppe, entry); +- continue; +- } ++ entry_len = mtk_flow_entry_match_len(ppe->eth, hwe); ++ memcpy(&foe, hwe, entry_len); + +- if (found || !mtk_flow_entry_match(ppe->eth, entry, hwe)) { ++ hlist_for_each_entry_safe(entry, n, head, list) { ++ if (found || ++ !mtk_flow_entry_match(ppe->eth, entry, &foe, entry_len)) { + if (entry->hash != 0xffff) +- entry->hash = 0xffff; ++ __mtk_foe_entry_clear(ppe, entry, false); + continue; + } + +@@ -819,9 +807,17 @@ out: + + int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { +- mtk_flow_entry_update(ppe, entry); ++ int idle; ++ ++ spin_lock_bh(&ppe_lock); ++ if (entry->type == MTK_FLOW_TYPE_L2) ++ mtk_flow_entry_update_l2(ppe, entry); ++ else ++ mtk_flow_entry_update(ppe, entry); ++ idle = __mtk_foe_entry_idle_time(ppe, entry->data.ib1); ++ spin_unlock_bh(&ppe_lock); + +- return __mtk_foe_entry_idle_time(ppe, entry->data.ib1); ++ return idle; + } + + int mtk_ppe_prepare_reset(struct mtk_ppe *ppe) +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -286,7 +286,12 @@ enum { + + struct mtk_flow_entry { + union { +- struct hlist_node list; ++ /* regular flows + L2 subflows */ ++ struct { ++ struct hlist_node list; ++ struct hlist_node l2_list; ++ }; ++ /* L2 flows */ + struct { + struct rhash_head l2_node; + struct hlist_head l2_flows; +@@ -296,13 +301,7 @@ struct mtk_flow_entry { + s8 wed_index; + u8 ppe_index; + u16 hash; +- union { +- struct mtk_foe_entry data; +- struct { +- struct mtk_flow_entry *base_flow; +- struct hlist_node list; +- } l2_data; +- }; ++ struct mtk_foe_entry data; + struct rhash_head node; + unsigned long cookie; + }; diff --git a/target/linux/generic/pending-5.15/736-04-net-ethernet-mediatek-fix-ppe-flow-accounting-for-L2.patch b/target/linux/generic/pending-5.15/736-04-net-ethernet-mediatek-fix-ppe-flow-accounting-for-L2.patch new file mode 100644 index 0000000000..7f04fd9fa8 --- /dev/null +++ b/target/linux/generic/pending-5.15/736-04-net-ethernet-mediatek-fix-ppe-flow-accounting-for-L2.patch @@ -0,0 +1,342 @@ +From: Felix Fietkau +Date: Thu, 23 Mar 2023 11:05:22 +0100 +Subject: [PATCH] net: ethernet: mediatek: fix ppe flow accounting for L2 + flows + +For L2 flows, the packet/byte counters should report the sum of the +counters of their subflows, both current and expired. +In order to make this work, change the way that accounting data is tracked. +Reset counters when a flow enters bind. Once it expires (or enters unbind), +store the last counter value in struct mtk_flow_entry. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_ppe.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +@@ -80,9 +80,9 @@ static int mtk_ppe_mib_wait_busy(struct + int ret; + u32 val; + +- ret = readl_poll_timeout(ppe->base + MTK_PPE_MIB_SER_CR, val, +- !(val & MTK_PPE_MIB_SER_CR_ST), +- 20, MTK_PPE_WAIT_TIMEOUT_US); ++ ret = readl_poll_timeout_atomic(ppe->base + MTK_PPE_MIB_SER_CR, val, ++ !(val & MTK_PPE_MIB_SER_CR_ST), ++ 20, MTK_PPE_WAIT_TIMEOUT_US); + + if (ret) + dev_err(ppe->dev, "MIB table busy"); +@@ -90,17 +90,31 @@ static int mtk_ppe_mib_wait_busy(struct + return ret; + } + +-static int mtk_mib_entry_read(struct mtk_ppe *ppe, u16 index, u64 *bytes, u64 *packets) ++static inline struct mtk_foe_accounting * ++mtk_ppe_acct_data(struct mtk_ppe *ppe, u16 index) ++{ ++ if (!ppe->acct_table) ++ return NULL; ++ ++ return ppe->acct_table + index * sizeof(struct mtk_foe_accounting); ++} ++ ++struct mtk_foe_accounting *mtk_ppe_mib_entry_read(struct mtk_ppe *ppe, u16 index) + { + u32 val, cnt_r0, cnt_r1, cnt_r2; ++ struct mtk_foe_accounting *acct; + int ret; + + val = FIELD_PREP(MTK_PPE_MIB_SER_CR_ADDR, index) | MTK_PPE_MIB_SER_CR_ST; + ppe_w32(ppe, MTK_PPE_MIB_SER_CR, val); + ++ acct = mtk_ppe_acct_data(ppe, index); ++ if (!acct) ++ return NULL; ++ + ret = mtk_ppe_mib_wait_busy(ppe); + if (ret) +- return ret; ++ return acct; + + cnt_r0 = readl(ppe->base + MTK_PPE_MIB_SER_R0); + cnt_r1 = readl(ppe->base + MTK_PPE_MIB_SER_R1); +@@ -109,19 +123,19 @@ static int mtk_mib_entry_read(struct mtk + if (mtk_is_netsys_v3_or_greater(ppe->eth)) { + /* 64 bit for each counter */ + u32 cnt_r3 = readl(ppe->base + MTK_PPE_MIB_SER_R3); +- *bytes = ((u64)cnt_r1 << 32) | cnt_r0; +- *packets = ((u64)cnt_r3 << 32) | cnt_r2; ++ acct->bytes += ((u64)cnt_r1 << 32) | cnt_r0; ++ acct->packets += ((u64)cnt_r3 << 32) | cnt_r2; + } else { + /* 48 bit byte counter, 40 bit packet counter */ + u32 byte_cnt_low = FIELD_GET(MTK_PPE_MIB_SER_R0_BYTE_CNT_LOW, cnt_r0); + u32 byte_cnt_high = FIELD_GET(MTK_PPE_MIB_SER_R1_BYTE_CNT_HIGH, cnt_r1); + u32 pkt_cnt_low = FIELD_GET(MTK_PPE_MIB_SER_R1_PKT_CNT_LOW, cnt_r1); + u32 pkt_cnt_high = FIELD_GET(MTK_PPE_MIB_SER_R2_PKT_CNT_HIGH, cnt_r2); +- *bytes = ((u64)byte_cnt_high << 32) | byte_cnt_low; +- *packets = (pkt_cnt_high << 16) | pkt_cnt_low; ++ acct->bytes += ((u64)byte_cnt_high << 32) | byte_cnt_low; ++ acct->packets += (pkt_cnt_high << 16) | pkt_cnt_low; + } + +- return 0; ++ return acct; + } + + static void mtk_ppe_cache_clear(struct mtk_ppe *ppe) +@@ -526,13 +540,6 @@ __mtk_foe_entry_clear(struct mtk_ppe *pp + hwe->ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_INVALID); + dma_wmb(); + mtk_ppe_cache_clear(ppe); +- if (ppe->accounting) { +- struct mtk_foe_accounting *acct; +- +- acct = ppe->acct_table + entry->hash * sizeof(*acct); +- acct->packets = 0; +- acct->bytes = 0; +- } + } + entry->hash = 0xffff; + +@@ -557,11 +564,14 @@ static int __mtk_foe_entry_idle_time(str + } + + static bool +-mtk_flow_entry_update(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) ++mtk_flow_entry_update(struct mtk_ppe *ppe, struct mtk_flow_entry *entry, ++ u64 *packets, u64 *bytes) + { ++ struct mtk_foe_accounting *acct; + struct mtk_foe_entry foe = {}; + struct mtk_foe_entry *hwe; + u16 hash = entry->hash; ++ bool ret = false; + int len; + + if (hash == 0xffff) +@@ -572,18 +582,35 @@ mtk_flow_entry_update(struct mtk_ppe *pp + memcpy(&foe, hwe, len); + + if (!mtk_flow_entry_match(ppe->eth, entry, &foe, len) || +- FIELD_GET(MTK_FOE_IB1_STATE, foe.ib1) != MTK_FOE_STATE_BIND) +- return false; ++ FIELD_GET(MTK_FOE_IB1_STATE, foe.ib1) != MTK_FOE_STATE_BIND) { ++ acct = mtk_ppe_acct_data(ppe, hash); ++ if (acct) { ++ entry->prev_packets += acct->packets; ++ entry->prev_bytes += acct->bytes; ++ } ++ ++ goto out; ++ } + + entry->data.ib1 = foe.ib1; ++ acct = mtk_ppe_mib_entry_read(ppe, hash); ++ ret = true; ++ ++out: ++ if (acct) { ++ *packets += acct->packets; ++ *bytes += acct->bytes; ++ } + +- return true; ++ return ret; + } + + static void + mtk_flow_entry_update_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) + { + u32 ib1_ts_mask = mtk_get_ib1_ts_mask(ppe->eth); ++ u64 *packets = &entry->packets; ++ u64 *bytes = &entry->bytes; + struct mtk_flow_entry *cur; + struct hlist_node *tmp; + int idle; +@@ -592,7 +619,9 @@ mtk_flow_entry_update_l2(struct mtk_ppe + hlist_for_each_entry_safe(cur, tmp, &entry->l2_flows, l2_list) { + int cur_idle; + +- if (!mtk_flow_entry_update(ppe, cur)) { ++ if (!mtk_flow_entry_update(ppe, cur, packets, bytes)) { ++ entry->prev_packets += cur->prev_packets; ++ entry->prev_bytes += cur->prev_bytes; + __mtk_foe_entry_clear(ppe, entry, false); + continue; + } +@@ -607,10 +636,29 @@ mtk_flow_entry_update_l2(struct mtk_ppe + } + } + ++void mtk_foe_entry_get_stats(struct mtk_ppe *ppe, struct mtk_flow_entry *entry, ++ int *idle) ++{ ++ entry->packets = entry->prev_packets; ++ entry->bytes = entry->prev_bytes; ++ ++ spin_lock_bh(&ppe_lock); ++ ++ if (entry->type == MTK_FLOW_TYPE_L2) ++ mtk_flow_entry_update_l2(ppe, entry); ++ else ++ mtk_flow_entry_update(ppe, entry, &entry->packets, &entry->bytes); ++ ++ *idle = __mtk_foe_entry_idle_time(ppe, entry->data.ib1); ++ ++ spin_unlock_bh(&ppe_lock); ++} ++ + static void + __mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, + u16 hash) + { ++ struct mtk_foe_accounting *acct; + struct mtk_eth *eth = ppe->eth; + u16 timestamp = mtk_eth_timestamp(eth); + struct mtk_foe_entry *hwe; +@@ -641,6 +689,12 @@ __mtk_foe_entry_commit(struct mtk_ppe *p + + dma_wmb(); + ++ acct = mtk_ppe_mib_entry_read(ppe, hash); ++ if (acct) { ++ acct->packets = 0; ++ acct->bytes = 0; ++ } ++ + mtk_ppe_cache_clear(ppe); + } + +@@ -805,21 +859,6 @@ out: + spin_unlock_bh(&ppe_lock); + } + +-int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) +-{ +- int idle; +- +- spin_lock_bh(&ppe_lock); +- if (entry->type == MTK_FLOW_TYPE_L2) +- mtk_flow_entry_update_l2(ppe, entry); +- else +- mtk_flow_entry_update(ppe, entry); +- idle = __mtk_foe_entry_idle_time(ppe, entry->data.ib1); +- spin_unlock_bh(&ppe_lock); +- +- return idle; +-} +- + int mtk_ppe_prepare_reset(struct mtk_ppe *ppe) + { + if (!ppe) +@@ -847,32 +886,6 @@ int mtk_ppe_prepare_reset(struct mtk_ppe + return mtk_ppe_wait_busy(ppe); + } + +-struct mtk_foe_accounting *mtk_foe_entry_get_mib(struct mtk_ppe *ppe, u32 index, +- struct mtk_foe_accounting *diff) +-{ +- struct mtk_foe_accounting *acct; +- int size = sizeof(struct mtk_foe_accounting); +- u64 bytes, packets; +- +- if (!ppe->accounting) +- return NULL; +- +- if (mtk_mib_entry_read(ppe, index, &bytes, &packets)) +- return NULL; +- +- acct = ppe->acct_table + index * size; +- +- acct->bytes += bytes; +- acct->packets += packets; +- +- if (diff) { +- diff->bytes = bytes; +- diff->packets = packets; +- } +- +- return acct; +-} +- + struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int index) + { + bool accounting = eth->soc->has_accounting; +--- a/drivers/net/ethernet/mediatek/mtk_ppe.h ++++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +@@ -304,6 +304,8 @@ struct mtk_flow_entry { + struct mtk_foe_entry data; + struct rhash_head node; + unsigned long cookie; ++ u64 prev_packets, prev_bytes; ++ u64 packets, bytes; + }; + + struct mtk_mib_entry { +@@ -347,6 +349,7 @@ void mtk_ppe_deinit(struct mtk_eth *eth) + void mtk_ppe_start(struct mtk_ppe *ppe); + int mtk_ppe_stop(struct mtk_ppe *ppe); + int mtk_ppe_prepare_reset(struct mtk_ppe *ppe); ++struct mtk_foe_accounting *mtk_ppe_mib_entry_read(struct mtk_ppe *ppe, u16 index); + + void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash); + +@@ -395,9 +398,8 @@ int mtk_foe_entry_set_queue(struct mtk_e + unsigned int queue); + int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); + void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); +-int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); + int mtk_ppe_debugfs_init(struct mtk_ppe *ppe, int index); +-struct mtk_foe_accounting *mtk_foe_entry_get_mib(struct mtk_ppe *ppe, u32 index, +- struct mtk_foe_accounting *diff); ++void mtk_foe_entry_get_stats(struct mtk_ppe *ppe, struct mtk_flow_entry *entry, ++ int *idle); + + #endif +--- a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c +@@ -96,7 +96,7 @@ mtk_ppe_debugfs_foe_show(struct seq_file + if (bind && state != MTK_FOE_STATE_BIND) + continue; + +- acct = mtk_foe_entry_get_mib(ppe, i, NULL); ++ acct = mtk_ppe_mib_entry_read(ppe, i); + + type = mtk_get_ib1_pkt_type(ppe->eth, entry->ib1); + seq_printf(m, "%05x %s %7s", i, +--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c ++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +@@ -499,24 +499,21 @@ static int + mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f) + { + struct mtk_flow_entry *entry; +- struct mtk_foe_accounting diff; +- u32 idle; ++ u64 packets, bytes; ++ int idle; + + entry = rhashtable_lookup(ð->flow_table, &f->cookie, + mtk_flow_ht_params); + if (!entry) + return -ENOENT; + +- idle = mtk_foe_entry_idle_time(eth->ppe[entry->ppe_index], entry); ++ packets = entry->packets; ++ bytes = entry->bytes; ++ mtk_foe_entry_get_stats(eth->ppe[entry->ppe_index], entry, &idle); ++ f->stats.pkts += entry->packets - packets; ++ f->stats.bytes += entry->bytes - bytes; + f->stats.lastused = jiffies - idle * HZ; + +- if (entry->hash != 0xFFFF && +- mtk_foe_entry_get_mib(eth->ppe[entry->ppe_index], entry->hash, +- &diff)) { +- f->stats.pkts += diff.packets; +- f->stats.bytes += diff.bytes; +- } +- + return 0; + } + diff --git a/target/linux/generic/pending-5.15/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch b/target/linux/generic/pending-5.15/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch new file mode 100644 index 0000000000..88d1744770 --- /dev/null +++ b/target/linux/generic/pending-5.15/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch @@ -0,0 +1,1604 @@ +From 1e25ca1147579bda8b941be1b9851f5911d44eb0 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 22 Aug 2023 19:04:42 +0100 +Subject: [PATCH 098/125] net: ethernet: mtk_eth_soc: add paths and SerDes + modes for MT7988 + +MT7988 comes with a built-in 2.5G PHY as well as SerDes lanes to +connect external PHYs or transceivers in USXGMII, 10GBase-R, 5GBase-R, +2500Base-X, 1000Base-X and Cisco SGMII interface modes. + +Implement support for configuring for the new paths to SerDes interfaces +and the internal 2.5G PHY. + +Add USXGMII PCS driver for 10GBase-R, 5GBase-R and USXGMII mode, and +setup the new PHYA on MT7988 to access the also still existing old +LynxI PCS for 1000Base-X, 2500Base-X and Cisco SGMII PCS interface +modes. + +Signed-off-by: Daniel Golle +--- + drivers/net/ethernet/mediatek/Kconfig | 16 + + drivers/net/ethernet/mediatek/Makefile | 1 + + drivers/net/ethernet/mediatek/mtk_eth_path.c | 123 +++- + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 182 ++++- + drivers/net/ethernet/mediatek/mtk_eth_soc.h | 232 ++++++- + drivers/net/ethernet/mediatek/mtk_usxgmii.c | 692 +++++++++++++++++++ + 6 files changed, 1215 insertions(+), 31 deletions(-) + create mode 100644 drivers/net/ethernet/mediatek/mtk_usxgmii.c + +--- a/drivers/net/ethernet/mediatek/Kconfig ++++ b/drivers/net/ethernet/mediatek/Kconfig +@@ -24,6 +24,22 @@ config NET_MEDIATEK_SOC + This driver supports the gigabit ethernet MACs in the + MediaTek SoC family. + ++config NET_MEDIATEK_SOC_USXGMII ++ bool "Support USXGMII SerDes on MT7988" ++ depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST ++ def_bool NET_MEDIATEK_SOC != n ++ help ++ Include support for 10GE SerDes which can be found on MT7988. ++ If this kernel should run on SoCs with 10 GBit/s Ethernet you ++ will need to select this option to use GMAC2 and GMAC3 with ++ external PHYs, SFP(+) cages in 10GBase-R, 5GBase-R or USXGMII ++ interface modes. ++ ++ Note that as the 2500Base-X/1000Base-X/Cisco SGMII SerDes PCS ++ unit (MediaTek LynxI) in MT7988 is connected via the new 10GE ++ SerDes, you will also need to select this option in case you ++ want to use any of those SerDes modes. ++ + config NET_MEDIATEK_STAR_EMAC + tristate "MediaTek STAR Ethernet MAC support" + select PHYLIB +--- a/drivers/net/ethernet/mediatek/Makefile ++++ b/drivers/net/ethernet/mediatek/Makefile +@@ -5,6 +5,7 @@ + + obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o + mtk_eth-y := mtk_eth_soc.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_ppe_offload.o ++mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_USXGMII) += mtk_usxgmii.o + mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed.o mtk_wed_mcu.o mtk_wed_wo.o + ifdef CONFIG_DEBUG_FS + mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_debugfs.o +--- a/drivers/net/ethernet/mediatek/mtk_eth_path.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_path.c +@@ -31,10 +31,20 @@ static const char *mtk_eth_path_name(u64 + return "gmac2_rgmii"; + case MTK_ETH_PATH_GMAC2_SGMII: + return "gmac2_sgmii"; ++ case MTK_ETH_PATH_GMAC2_2P5GPHY: ++ return "gmac2_2p5gphy"; + case MTK_ETH_PATH_GMAC2_GEPHY: + return "gmac2_gephy"; ++ case MTK_ETH_PATH_GMAC3_SGMII: ++ return "gmac3_sgmii"; + case MTK_ETH_PATH_GDM1_ESW: + return "gdm1_esw"; ++ case MTK_ETH_PATH_GMAC1_USXGMII: ++ return "gmac1_usxgmii"; ++ case MTK_ETH_PATH_GMAC2_USXGMII: ++ return "gmac2_usxgmii"; ++ case MTK_ETH_PATH_GMAC3_USXGMII: ++ return "gmac3_usxgmii"; + default: + return "unknown path"; + } +@@ -127,6 +137,27 @@ static int set_mux_u3_gmac2_to_qphy(stru + return 0; + } + ++static int set_mux_gmac2_to_2p5gphy(struct mtk_eth *eth, u64 path) ++{ ++ int ret; ++ ++ if (path == MTK_ETH_PATH_GMAC2_2P5GPHY) { ++ ret = regmap_clear_bits(eth->ethsys, ETHSYS_SYSCFG0, SYSCFG0_SGMII_GMAC2_V2); ++ if (ret) ++ return ret; ++ ++ /* Setup mux to 2p5g PHY */ ++ ret = regmap_clear_bits(eth->infra, TOP_MISC_NETSYS_PCS_MUX, MUX_G2_USXGMII_SEL); ++ if (ret) ++ return ret; ++ ++ dev_dbg(eth->dev, "path %s in %s updated\n", ++ mtk_eth_path_name(path), __func__); ++ } ++ ++ return 0; ++} ++ + static int set_mux_gmac1_gmac2_to_sgmii_rgmii(struct mtk_eth *eth, u64 path) + { + unsigned int val = 0; +@@ -165,7 +196,48 @@ static int set_mux_gmac1_gmac2_to_sgmii_ + return 0; + } + +-static int set_mux_gmac12_to_gephy_sgmii(struct mtk_eth *eth, u64 path) ++static int set_mux_gmac123_to_usxgmii(struct mtk_eth *eth, u64 path) ++{ ++ unsigned int val = 0; ++ bool updated = true; ++ int mac_id = 0; ++ ++ /* Disable SYSCFG1 SGMII */ ++ regmap_read(eth->ethsys, ETHSYS_SYSCFG0, &val); ++ ++ switch (path) { ++ case MTK_ETH_PATH_GMAC1_USXGMII: ++ val &= ~(u32)SYSCFG0_SGMII_GMAC1_V2; ++ mac_id = MTK_GMAC1_ID; ++ break; ++ case MTK_ETH_PATH_GMAC2_USXGMII: ++ val &= ~(u32)SYSCFG0_SGMII_GMAC2_V2; ++ mac_id = MTK_GMAC2_ID; ++ break; ++ case MTK_ETH_PATH_GMAC3_USXGMII: ++ val &= ~(u32)SYSCFG0_SGMII_GMAC3_V2; ++ mac_id = MTK_GMAC3_ID; ++ break; ++ default: ++ updated = false; ++ }; ++ ++ if (updated) { ++ regmap_update_bits(eth->ethsys, ETHSYS_SYSCFG0, ++ SYSCFG0_SGMII_MASK, val); ++ ++ if (mac_id == MTK_GMAC2_ID) ++ regmap_set_bits(eth->infra, TOP_MISC_NETSYS_PCS_MUX, ++ MUX_G2_USXGMII_SEL); ++ } ++ ++ dev_dbg(eth->dev, "path %s in %s updated = %d\n", ++ mtk_eth_path_name(path), __func__, updated); ++ ++ return 0; ++} ++ ++static int set_mux_gmac123_to_gephy_sgmii(struct mtk_eth *eth, u64 path) + { + unsigned int val = 0; + bool updated = true; +@@ -182,6 +254,9 @@ static int set_mux_gmac12_to_gephy_sgmii + case MTK_ETH_PATH_GMAC2_SGMII: + val |= SYSCFG0_SGMII_GMAC2_V2; + break; ++ case MTK_ETH_PATH_GMAC3_SGMII: ++ val |= SYSCFG0_SGMII_GMAC3_V2; ++ break; + default: + updated = false; + } +@@ -210,13 +285,25 @@ static const struct mtk_eth_muxc mtk_eth + .cap_bit = MTK_ETH_MUX_U3_GMAC2_TO_QPHY, + .set_path = set_mux_u3_gmac2_to_qphy, + }, { ++ .name = "mux_gmac2_to_2p5gphy", ++ .cap_bit = MTK_ETH_MUX_GMAC2_TO_2P5GPHY, ++ .set_path = set_mux_gmac2_to_2p5gphy, ++ }, { + .name = "mux_gmac1_gmac2_to_sgmii_rgmii", + .cap_bit = MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII, + .set_path = set_mux_gmac1_gmac2_to_sgmii_rgmii, + }, { + .name = "mux_gmac12_to_gephy_sgmii", + .cap_bit = MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII, +- .set_path = set_mux_gmac12_to_gephy_sgmii, ++ .set_path = set_mux_gmac123_to_gephy_sgmii, ++ }, { ++ .name = "mux_gmac123_to_gephy_sgmii", ++ .cap_bit = MTK_ETH_MUX_GMAC123_TO_GEPHY_SGMII, ++ .set_path = set_mux_gmac123_to_gephy_sgmii, ++ }, { ++ .name = "mux_gmac123_to_usxgmii", ++ .cap_bit = MTK_ETH_MUX_GMAC123_TO_USXGMII, ++ .set_path = set_mux_gmac123_to_usxgmii, + }, + }; + +@@ -249,12 +336,39 @@ out: + return err; + } + ++int mtk_gmac_usxgmii_path_setup(struct mtk_eth *eth, int mac_id) ++{ ++ u64 path; ++ ++ path = (mac_id == MTK_GMAC1_ID) ? MTK_ETH_PATH_GMAC1_USXGMII : ++ (mac_id == MTK_GMAC2_ID) ? MTK_ETH_PATH_GMAC2_USXGMII : ++ MTK_ETH_PATH_GMAC3_USXGMII; ++ ++ /* Setup proper MUXes along the path */ ++ return mtk_eth_mux_setup(eth, path); ++} ++ + int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id) + { + u64 path; + +- path = (mac_id == 0) ? MTK_ETH_PATH_GMAC1_SGMII : +- MTK_ETH_PATH_GMAC2_SGMII; ++ path = (mac_id == MTK_GMAC1_ID) ? MTK_ETH_PATH_GMAC1_SGMII : ++ (mac_id == MTK_GMAC2_ID) ? MTK_ETH_PATH_GMAC2_SGMII : ++ MTK_ETH_PATH_GMAC3_SGMII; ++ ++ /* Setup proper MUXes along the path */ ++ return mtk_eth_mux_setup(eth, path); ++} ++ ++int mtk_gmac_2p5gphy_path_setup(struct mtk_eth *eth, int mac_id) ++{ ++ u64 path = 0; ++ ++ if (mac_id == MTK_GMAC2_ID) ++ path = MTK_ETH_PATH_GMAC2_2P5GPHY; ++ ++ if (!path) ++ return -EINVAL; + + /* Setup proper MUXes along the path */ + return mtk_eth_mux_setup(eth, path); +@@ -284,4 +398,3 @@ int mtk_gmac_rgmii_path_setup(struct mtk + /* Setup proper MUXes along the path */ + return mtk_eth_mux_setup(eth, path); + } +- +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -431,6 +431,30 @@ static void mtk_setup_bridge_switch(stru + MTK_GSW_CFG); + } + ++static bool mtk_check_gmac23_idle(struct mtk_mac *mac) ++{ ++ u32 mac_fsm, gdm_fsm; ++ ++ mac_fsm = mtk_r32(mac->hw, MTK_MAC_FSM(mac->id)); ++ ++ switch (mac->id) { ++ case MTK_GMAC2_ID: ++ gdm_fsm = mtk_r32(mac->hw, MTK_FE_GDM2_FSM); ++ break; ++ case MTK_GMAC3_ID: ++ gdm_fsm = mtk_r32(mac->hw, MTK_FE_GDM3_FSM); ++ break; ++ default: ++ return true; ++ }; ++ ++ if ((mac_fsm & 0xFFFF0000) == 0x01010000 && ++ (gdm_fsm & 0xFFFF0000) == 0x00000000) ++ return true; ++ ++ return false; ++} ++ + static struct phylink_pcs *mtk_mac_select_pcs(struct phylink_config *config, + phy_interface_t interface) + { +@@ -439,12 +463,20 @@ static struct phylink_pcs *mtk_mac_selec + struct mtk_eth *eth = mac->hw; + unsigned int sid; + +- if (interface == PHY_INTERFACE_MODE_SGMII || +- phy_interface_mode_is_8023z(interface)) { +- sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ? +- 0 : mac->id; +- +- return eth->sgmii_pcs[sid]; ++ if ((interface == PHY_INTERFACE_MODE_SGMII || ++ phy_interface_mode_is_8023z(interface)) && ++ MTK_HAS_CAPS(eth->soc->caps, MTK_SGMII)) { ++ sid = mtk_mac2xgmii_id(eth, mac->id); ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_USXGMII)) ++ return mtk_sgmii_wrapper_select_pcs(eth, mac->id); ++ else ++ return eth->sgmii_pcs[sid]; ++ } else if ((interface == PHY_INTERFACE_MODE_USXGMII || ++ interface == PHY_INTERFACE_MODE_10GBASER || ++ interface == PHY_INTERFACE_MODE_5GBASER) && ++ MTK_HAS_CAPS(eth->soc->caps, MTK_USXGMII) && ++ mac->id != MTK_GMAC1_ID) { ++ return mtk_usxgmii_select_pcs(eth, mac->id); + } + + return NULL; +@@ -500,7 +532,22 @@ static void mtk_mac_config(struct phylin + goto init_err; + } + break; ++ case PHY_INTERFACE_MODE_USXGMII: ++ case PHY_INTERFACE_MODE_10GBASER: ++ case PHY_INTERFACE_MODE_5GBASER: ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_USXGMII)) { ++ err = mtk_gmac_usxgmii_path_setup(eth, mac->id); ++ if (err) ++ goto init_err; ++ } ++ break; + case PHY_INTERFACE_MODE_INTERNAL: ++ if (mac->id == MTK_GMAC2_ID && ++ MTK_HAS_CAPS(eth->soc->caps, MTK_2P5GPHY)) { ++ err = mtk_gmac_2p5gphy_path_setup(eth, mac->id); ++ if (err) ++ goto init_err; ++ } + break; + default: + goto err_phy; +@@ -555,8 +602,6 @@ static void mtk_mac_config(struct phylin + val &= ~SYSCFG0_GE_MODE(SYSCFG0_GE_MASK, mac->id); + val |= SYSCFG0_GE_MODE(ge_mode, mac->id); + regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val); +- +- mac->interface = state->interface; + } + + /* SGMII */ +@@ -573,21 +618,40 @@ static void mtk_mac_config(struct phylin + + /* Save the syscfg0 value for mac_finish */ + mac->syscfg0 = val; +- } else if (phylink_autoneg_inband(mode)) { ++ } else if (state->interface != PHY_INTERFACE_MODE_USXGMII && ++ state->interface != PHY_INTERFACE_MODE_10GBASER && ++ state->interface != PHY_INTERFACE_MODE_5GBASER && ++ phylink_autoneg_inband(mode)) { + dev_err(eth->dev, +- "In-band mode not supported in non SGMII mode!\n"); ++ "In-band mode not supported in non-SerDes modes!\n"); + return; + } + + /* Setup gmac */ +- if (mtk_is_netsys_v3_or_greater(eth) && +- mac->interface == PHY_INTERFACE_MODE_INTERNAL) { +- mtk_w32(mac->hw, MTK_GDMA_XGDM_SEL, MTK_GDMA_EG_CTRL(mac->id)); +- mtk_w32(mac->hw, MAC_MCR_FORCE_LINK_DOWN, MTK_MAC_MCR(mac->id)); ++ if (mtk_is_netsys_v3_or_greater(eth)) { ++ if (mtk_interface_mode_is_xgmii(state->interface)) { ++ mtk_w32(mac->hw, MTK_GDMA_XGDM_SEL, MTK_GDMA_EG_CTRL(mac->id)); ++ mtk_w32(mac->hw, MAC_MCR_FORCE_LINK_DOWN, MTK_MAC_MCR(mac->id)); ++ ++ if (mac->id == MTK_GMAC1_ID) ++ mtk_setup_bridge_switch(eth); ++ } else { ++ mtk_w32(eth, 0, MTK_GDMA_EG_CTRL(mac->id)); + +- mtk_setup_bridge_switch(eth); ++ /* FIXME: In current hardware design, we have to reset FE ++ * when swtiching XGDM to GDM. Therefore, here trigger an SER ++ * to let GDM go back to the initial state. ++ */ ++ if ((mtk_interface_mode_is_xgmii(mac->interface) || ++ mac->interface == PHY_INTERFACE_MODE_NA) && ++ !mtk_check_gmac23_idle(mac) && ++ !test_bit(MTK_RESETTING, ð->state)) ++ schedule_work(ð->pending_work); ++ } + } + ++ mac->interface = state->interface; ++ + return; + + err_phy: +@@ -633,10 +697,13 @@ static void mtk_mac_link_down(struct phy + { + struct mtk_mac *mac = container_of(config, struct mtk_mac, + phylink_config); +- u32 mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); + +- mcr &= ~(MAC_MCR_TX_EN | MAC_MCR_RX_EN); +- mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id)); ++ if (!mtk_interface_mode_is_xgmii(interface)) { ++ mtk_m32(mac->hw, MAC_MCR_TX_EN | MAC_MCR_RX_EN, 0, MTK_MAC_MCR(mac->id)); ++ mtk_m32(mac->hw, MTK_XGMAC_FORCE_LINK(mac->id), 0, MTK_XGMAC_STS(mac->id)); ++ } else if (mac->id != MTK_GMAC1_ID) { ++ mtk_m32(mac->hw, XMAC_MCR_TRX_DISABLE, XMAC_MCR_TRX_DISABLE, MTK_XMAC_MCR(mac->id)); ++ } + } + + static void mtk_set_queue_speed(struct mtk_eth *eth, unsigned int idx, +@@ -708,13 +775,11 @@ static void mtk_set_queue_speed(struct m + mtk_w32(eth, val, soc->reg_map->qdma.qtx_sch + ofs); + } + +-static void mtk_mac_link_up(struct phylink_config *config, +- struct phy_device *phy, +- unsigned int mode, phy_interface_t interface, +- int speed, int duplex, bool tx_pause, bool rx_pause) ++static void mtk_gdm_mac_link_up(struct mtk_mac *mac, ++ struct phy_device *phy, ++ unsigned int mode, phy_interface_t interface, ++ int speed, int duplex, bool tx_pause, bool rx_pause) + { +- struct mtk_mac *mac = container_of(config, struct mtk_mac, +- phylink_config); + u32 mcr; + + mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); +@@ -748,6 +813,55 @@ static void mtk_mac_link_up(struct phyli + mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id)); + } + ++static void mtk_xgdm_mac_link_up(struct mtk_mac *mac, ++ struct phy_device *phy, ++ unsigned int mode, phy_interface_t interface, ++ int speed, int duplex, bool tx_pause, bool rx_pause) ++{ ++ u32 mcr, force_link = 0; ++ ++ if (mac->id == MTK_GMAC1_ID) ++ return; ++ ++ /* Eliminate the interference(before link-up) caused by PHY noise */ ++ mtk_m32(mac->hw, XMAC_LOGIC_RST, 0, MTK_XMAC_LOGIC_RST(mac->id)); ++ mdelay(20); ++ mtk_m32(mac->hw, XMAC_GLB_CNTCLR, XMAC_GLB_CNTCLR, MTK_XMAC_CNT_CTRL(mac->id)); ++ ++ if (mac->interface == PHY_INTERFACE_MODE_INTERNAL || mac->id == MTK_GMAC3_ID) ++ force_link = MTK_XGMAC_FORCE_LINK(mac->id); ++ ++ mtk_m32(mac->hw, MTK_XGMAC_FORCE_LINK(mac->id), force_link, MTK_XGMAC_STS(mac->id)); ++ ++ mcr = mtk_r32(mac->hw, MTK_XMAC_MCR(mac->id)); ++ mcr &= ~(XMAC_MCR_FORCE_TX_FC | XMAC_MCR_FORCE_RX_FC | XMAC_MCR_TRX_DISABLE); ++ /* Configure pause modes - ++ * phylink will avoid these for half duplex ++ */ ++ if (tx_pause) ++ mcr |= XMAC_MCR_FORCE_TX_FC; ++ if (rx_pause) ++ mcr |= XMAC_MCR_FORCE_RX_FC; ++ ++ mtk_w32(mac->hw, mcr, MTK_XMAC_MCR(mac->id)); ++} ++ ++static void mtk_mac_link_up(struct phylink_config *config, ++ struct phy_device *phy, ++ unsigned int mode, phy_interface_t interface, ++ int speed, int duplex, bool tx_pause, bool rx_pause) ++{ ++ struct mtk_mac *mac = container_of(config, struct mtk_mac, ++ phylink_config); ++ ++ if (mtk_interface_mode_is_xgmii(interface)) ++ mtk_xgdm_mac_link_up(mac, phy, mode, interface, speed, duplex, ++ tx_pause, rx_pause); ++ else ++ mtk_gdm_mac_link_up(mac, phy, mode, interface, speed, duplex, ++ tx_pause, rx_pause); ++} ++ + static const struct phylink_mac_ops mtk_phylink_ops = { + .validate = phylink_generic_validate, + .mac_select_pcs = mtk_mac_select_pcs, +@@ -4561,8 +4675,21 @@ static int mtk_add_mac(struct mtk_eth *e + phy_interface_zero(mac->phylink_config.supported_interfaces); + __set_bit(PHY_INTERFACE_MODE_INTERNAL, + mac->phylink_config.supported_interfaces); ++ } else if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_USXGMII)) { ++ mac->phylink_config.mac_capabilities |= MAC_5000FD | MAC_10000FD; ++ __set_bit(PHY_INTERFACE_MODE_5GBASER, ++ mac->phylink_config.supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_10GBASER, ++ mac->phylink_config.supported_interfaces); ++ __set_bit(PHY_INTERFACE_MODE_USXGMII, ++ mac->phylink_config.supported_interfaces); + } + ++ if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_2P5GPHY) && ++ id == MTK_GMAC2_ID) ++ __set_bit(PHY_INTERFACE_MODE_INTERNAL, ++ mac->phylink_config.supported_interfaces); ++ + phylink = phylink_create(&mac->phylink_config, + of_fwnode_handle(mac->of_node), + phy_mode, &mtk_phylink_ops); +@@ -4755,6 +4882,13 @@ static int mtk_probe(struct platform_dev + + if (err) + return err; ++ } ++ ++ if (MTK_HAS_CAPS(eth->soc->caps, MTK_USXGMII)) { ++ err = mtk_usxgmii_init(eth); ++ ++ if (err) ++ return err; + } + + if (eth->soc->required_pctl) { +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -499,6 +499,21 @@ + #define INTF_MODE_RGMII_1000 (TRGMII_MODE | TRGMII_CENTRAL_ALIGNED) + #define INTF_MODE_RGMII_10_100 0 + ++/* XFI Mac control registers */ ++#define MTK_XMAC_BASE(x) (0x12000 + (((x) - 1) * 0x1000)) ++#define MTK_XMAC_MCR(x) (MTK_XMAC_BASE(x)) ++#define XMAC_MCR_TRX_DISABLE 0xf ++#define XMAC_MCR_FORCE_TX_FC BIT(5) ++#define XMAC_MCR_FORCE_RX_FC BIT(4) ++ ++/* XFI Mac logic reset registers */ ++#define MTK_XMAC_LOGIC_RST(x) (MTK_XMAC_BASE(x) + 0x10) ++#define XMAC_LOGIC_RST BIT(0) ++ ++/* XFI Mac count global control */ ++#define MTK_XMAC_CNT_CTRL(x) (MTK_XMAC_BASE(x) + 0x100) ++#define XMAC_GLB_CNTCLR BIT(0) ++ + /* GPIO port control registers for GMAC 2*/ + #define GPIO_OD33_CTRL8 0x4c0 + #define GPIO_BIAS_CTRL 0xed0 +@@ -524,6 +539,7 @@ + #define SYSCFG0_SGMII_GMAC2 ((3 << 8) & SYSCFG0_SGMII_MASK) + #define SYSCFG0_SGMII_GMAC1_V2 BIT(9) + #define SYSCFG0_SGMII_GMAC2_V2 BIT(8) ++#define SYSCFG0_SGMII_GMAC3_V2 BIT(7) + + + /* ethernet subsystem clock register */ +@@ -556,12 +572,74 @@ + #define ETHSYS_DMA_AG_MAP_QDMA BIT(1) + #define ETHSYS_DMA_AG_MAP_PPE BIT(2) + ++/* USXGMII subsystem config registers */ ++/* Register to control speed */ ++#define RG_PHY_TOP_SPEED_CTRL1 0x80C ++#define USXGMII_RATE_UPDATE_MODE BIT(31) ++#define USXGMII_MAC_CK_GATED BIT(29) ++#define USXGMII_IF_FORCE_EN BIT(28) ++#define USXGMII_RATE_ADAPT_MODE GENMASK(10, 8) ++#define USXGMII_RATE_ADAPT_MODE_X1 0 ++#define USXGMII_RATE_ADAPT_MODE_X2 1 ++#define USXGMII_RATE_ADAPT_MODE_X4 2 ++#define USXGMII_RATE_ADAPT_MODE_X10 3 ++#define USXGMII_RATE_ADAPT_MODE_X100 4 ++#define USXGMII_RATE_ADAPT_MODE_X5 5 ++#define USXGMII_RATE_ADAPT_MODE_X50 6 ++#define USXGMII_XFI_RX_MODE GENMASK(6, 4) ++#define USXGMII_XFI_RX_MODE_10G 0 ++#define USXGMII_XFI_RX_MODE_5G 1 ++#define USXGMII_XFI_TX_MODE GENMASK(2, 0) ++#define USXGMII_XFI_TX_MODE_10G 0 ++#define USXGMII_XFI_TX_MODE_5G 1 ++ ++/* Register to control PCS AN */ ++#define RG_PCS_AN_CTRL0 0x810 ++#define USXGMII_AN_RESTART BIT(31) ++#define USXGMII_AN_SYNC_CNT GENMASK(30, 11) ++#define USXGMII_AN_ENABLE BIT(0) ++ ++#define RG_PCS_AN_CTRL2 0x818 ++#define USXGMII_LINK_TIMER_IDLE_DETECT GENMASK(29, 20) ++#define USXGMII_LINK_TIMER_COMP_ACK_DETECT GENMASK(19, 10) ++#define USXGMII_LINK_TIMER_AN_RESTART GENMASK(9, 0) ++ ++/* Register to read PCS AN status */ ++#define RG_PCS_AN_STS0 0x81c ++#define USXGMII_PCS_AN_WORD GENMASK(15, 0) ++#define USXGMII_LPA_LATCH BIT(31) ++ ++/* Register to control USXGMII XFI PLL digital */ ++#define XFI_PLL_DIG_GLB8 0x08 ++#define RG_XFI_PLL_EN BIT(31) ++ ++/* Register to control USXGMII XFI PLL analog */ ++#define XFI_PLL_ANA_GLB8 0x108 ++#define RG_XFI_PLL_ANA_SWWA 0x02283248 ++ + /* Infrasys subsystem config registers */ + #define INFRA_MISC2 0x70c + #define CO_QPHY_SEL BIT(0) + #define GEPHY_MAC_SEL BIT(1) + ++/* Toprgu subsystem config registers */ ++#define TOPRGU_SWSYSRST 0x18 ++#define SWSYSRST_UNLOCK_KEY GENMASK(31, 24) ++#define SWSYSRST_XFI_PLL_GRST BIT(16) ++#define SWSYSRST_XFI_PEXPT1_GRST BIT(15) ++#define SWSYSRST_XFI_PEXPT0_GRST BIT(14) ++#define SWSYSRST_XFI1_GRST BIT(13) ++#define SWSYSRST_XFI0_GRST BIT(12) ++#define SWSYSRST_SGMII1_GRST BIT(2) ++#define SWSYSRST_SGMII0_GRST BIT(1) ++#define TOPRGU_SWSYSRST_EN 0xFC ++ + /* Top misc registers */ ++#define TOP_MISC_NETSYS_PCS_MUX 0x84 ++#define NETSYS_PCS_MUX_MASK GENMASK(1, 0) ++#define MUX_G2_USXGMII_SEL BIT(1) ++#define MUX_HSGMII1_G1_SEL BIT(0) ++ + #define USB_PHY_SWITCH_REG 0x218 + #define QPHY_SEL_MASK GENMASK(1, 0) + #define SGMII_QPHY_SEL 0x2 +@@ -586,6 +664,8 @@ + #define MT7628_SDM_RBCNT (MT7628_SDM_OFFSET + 0x10c) + #define MT7628_SDM_CS_ERR (MT7628_SDM_OFFSET + 0x110) + ++/* Debug Purpose Register */ ++#define MTK_PSE_FQFC_CFG 0x100 + #define MTK_FE_CDM1_FSM 0x220 + #define MTK_FE_CDM2_FSM 0x224 + #define MTK_FE_CDM3_FSM 0x238 +@@ -594,6 +674,11 @@ + #define MTK_FE_CDM6_FSM 0x328 + #define MTK_FE_GDM1_FSM 0x228 + #define MTK_FE_GDM2_FSM 0x22C ++#define MTK_FE_GDM3_FSM 0x23C ++#define MTK_FE_PSE_FREE 0x240 ++#define MTK_FE_DROP_FQ 0x244 ++#define MTK_FE_DROP_FC 0x248 ++#define MTK_FE_DROP_PPE 0x24C + + #define MTK_MAC_FSM(x) (0x1010C + ((x) * 0x100)) + +@@ -940,6 +1025,8 @@ enum mkt_eth_capabilities { + MTK_RGMII_BIT = 0, + MTK_TRGMII_BIT, + MTK_SGMII_BIT, ++ MTK_USXGMII_BIT, ++ MTK_2P5GPHY_BIT, + MTK_ESW_BIT, + MTK_GEPHY_BIT, + MTK_MUX_BIT, +@@ -960,8 +1047,11 @@ enum mkt_eth_capabilities { + MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT, + MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY_BIT, + MTK_ETH_MUX_U3_GMAC2_TO_QPHY_BIT, ++ MTK_ETH_MUX_GMAC2_TO_2P5GPHY_BIT, + MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII_BIT, + MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII_BIT, ++ MTK_ETH_MUX_GMAC123_TO_GEPHY_SGMII_BIT, ++ MTK_ETH_MUX_GMAC123_TO_USXGMII_BIT, + + /* PATH BITS */ + MTK_ETH_PATH_GMAC1_RGMII_BIT, +@@ -969,14 +1059,21 @@ enum mkt_eth_capabilities { + MTK_ETH_PATH_GMAC1_SGMII_BIT, + MTK_ETH_PATH_GMAC2_RGMII_BIT, + MTK_ETH_PATH_GMAC2_SGMII_BIT, ++ MTK_ETH_PATH_GMAC2_2P5GPHY_BIT, + MTK_ETH_PATH_GMAC2_GEPHY_BIT, ++ MTK_ETH_PATH_GMAC3_SGMII_BIT, + MTK_ETH_PATH_GDM1_ESW_BIT, ++ MTK_ETH_PATH_GMAC1_USXGMII_BIT, ++ MTK_ETH_PATH_GMAC2_USXGMII_BIT, ++ MTK_ETH_PATH_GMAC3_USXGMII_BIT, + }; + + /* Supported hardware group on SoCs */ + #define MTK_RGMII BIT_ULL(MTK_RGMII_BIT) + #define MTK_TRGMII BIT_ULL(MTK_TRGMII_BIT) + #define MTK_SGMII BIT_ULL(MTK_SGMII_BIT) ++#define MTK_USXGMII BIT_ULL(MTK_USXGMII_BIT) ++#define MTK_2P5GPHY BIT_ULL(MTK_2P5GPHY_BIT) + #define MTK_ESW BIT_ULL(MTK_ESW_BIT) + #define MTK_GEPHY BIT_ULL(MTK_GEPHY_BIT) + #define MTK_MUX BIT_ULL(MTK_MUX_BIT) +@@ -999,10 +1096,16 @@ enum mkt_eth_capabilities { + BIT_ULL(MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY_BIT) + #define MTK_ETH_MUX_U3_GMAC2_TO_QPHY \ + BIT_ULL(MTK_ETH_MUX_U3_GMAC2_TO_QPHY_BIT) ++#define MTK_ETH_MUX_GMAC2_TO_2P5GPHY \ ++ BIT_ULL(MTK_ETH_MUX_GMAC2_TO_2P5GPHY_BIT) + #define MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII \ + BIT_ULL(MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII_BIT) + #define MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII \ + BIT_ULL(MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII_BIT) ++#define MTK_ETH_MUX_GMAC123_TO_GEPHY_SGMII \ ++ BIT_ULL(MTK_ETH_MUX_GMAC123_TO_GEPHY_SGMII_BIT) ++#define MTK_ETH_MUX_GMAC123_TO_USXGMII \ ++ BIT_ULL(MTK_ETH_MUX_GMAC123_TO_USXGMII_BIT) + + /* Supported path present on SoCs */ + #define MTK_ETH_PATH_GMAC1_RGMII BIT_ULL(MTK_ETH_PATH_GMAC1_RGMII_BIT) +@@ -1010,8 +1113,13 @@ enum mkt_eth_capabilities { + #define MTK_ETH_PATH_GMAC1_SGMII BIT_ULL(MTK_ETH_PATH_GMAC1_SGMII_BIT) + #define MTK_ETH_PATH_GMAC2_RGMII BIT_ULL(MTK_ETH_PATH_GMAC2_RGMII_BIT) + #define MTK_ETH_PATH_GMAC2_SGMII BIT_ULL(MTK_ETH_PATH_GMAC2_SGMII_BIT) ++#define MTK_ETH_PATH_GMAC2_2P5GPHY BIT_ULL(MTK_ETH_PATH_GMAC2_2P5GPHY_BIT) + #define MTK_ETH_PATH_GMAC2_GEPHY BIT_ULL(MTK_ETH_PATH_GMAC2_GEPHY_BIT) ++#define MTK_ETH_PATH_GMAC3_SGMII BIT_ULL(MTK_ETH_PATH_GMAC3_SGMII_BIT) + #define MTK_ETH_PATH_GDM1_ESW BIT_ULL(MTK_ETH_PATH_GDM1_ESW_BIT) ++#define MTK_ETH_PATH_GMAC1_USXGMII BIT_ULL(MTK_ETH_PATH_GMAC1_USXGMII_BIT) ++#define MTK_ETH_PATH_GMAC2_USXGMII BIT_ULL(MTK_ETH_PATH_GMAC2_USXGMII_BIT) ++#define MTK_ETH_PATH_GMAC3_USXGMII BIT_ULL(MTK_ETH_PATH_GMAC3_USXGMII_BIT) + + #define MTK_GMAC1_RGMII (MTK_ETH_PATH_GMAC1_RGMII | MTK_RGMII) + #define MTK_GMAC1_TRGMII (MTK_ETH_PATH_GMAC1_TRGMII | MTK_TRGMII) +@@ -1019,7 +1127,12 @@ enum mkt_eth_capabilities { + #define MTK_GMAC2_RGMII (MTK_ETH_PATH_GMAC2_RGMII | MTK_RGMII) + #define MTK_GMAC2_SGMII (MTK_ETH_PATH_GMAC2_SGMII | MTK_SGMII) + #define MTK_GMAC2_GEPHY (MTK_ETH_PATH_GMAC2_GEPHY | MTK_GEPHY) ++#define MTK_GMAC2_2P5GPHY (MTK_ETH_PATH_GMAC2_2P5GPHY | MTK_2P5GPHY) ++#define MTK_GMAC3_SGMII (MTK_ETH_PATH_GMAC3_SGMII | MTK_SGMII) + #define MTK_GDM1_ESW (MTK_ETH_PATH_GDM1_ESW | MTK_ESW) ++#define MTK_GMAC1_USXGMII (MTK_ETH_PATH_GMAC1_USXGMII | MTK_USXGMII) ++#define MTK_GMAC2_USXGMII (MTK_ETH_PATH_GMAC2_USXGMII | MTK_USXGMII) ++#define MTK_GMAC3_USXGMII (MTK_ETH_PATH_GMAC3_USXGMII | MTK_USXGMII) + + /* MUXes present on SoCs */ + /* 0: GDM1 -> GMAC1, 1: GDM1 -> ESW */ +@@ -1038,10 +1151,20 @@ enum mkt_eth_capabilities { + (MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII | MTK_MUX | \ + MTK_SHARED_SGMII) + ++/* 2: GMAC2 -> XGMII */ ++#define MTK_MUX_GMAC2_TO_2P5GPHY \ ++ (MTK_ETH_MUX_GMAC2_TO_2P5GPHY | MTK_MUX | MTK_INFRA) ++ + /* 0: GMACx -> GEPHY, 1: GMACx -> SGMII where x is 1 or 2 */ + #define MTK_MUX_GMAC12_TO_GEPHY_SGMII \ + (MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII | MTK_MUX) + ++#define MTK_MUX_GMAC123_TO_GEPHY_SGMII \ ++ (MTK_ETH_MUX_GMAC123_TO_GEPHY_SGMII | MTK_MUX) ++ ++#define MTK_MUX_GMAC123_TO_USXGMII \ ++ (MTK_ETH_MUX_GMAC123_TO_USXGMII | MTK_MUX | MTK_INFRA) ++ + #define MTK_HAS_CAPS(caps, _x) (((caps) & (_x)) == (_x)) + + #define MT7621_CAPS (MTK_GMAC1_RGMII | MTK_GMAC1_TRGMII | \ +@@ -1073,8 +1196,12 @@ enum mkt_eth_capabilities { + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ + MTK_RSTCTRL_PPE1 | MTK_SRAM) + +-#define MT7988_CAPS (MTK_36BIT_DMA | MTK_GDM1_ESW | MTK_QDMA | \ +- MTK_RSTCTRL_PPE1 | MTK_RSTCTRL_PPE2 | MTK_SRAM) ++#define MT7988_CAPS (MTK_36BIT_DMA | MTK_GDM1_ESW | MTK_GMAC1_SGMII | \ ++ MTK_GMAC2_2P5GPHY | MTK_GMAC2_SGMII | MTK_GMAC2_USXGMII | \ ++ MTK_GMAC3_SGMII | MTK_GMAC3_USXGMII | \ ++ MTK_MUX_GMAC123_TO_GEPHY_SGMII | \ ++ MTK_MUX_GMAC123_TO_USXGMII | MTK_MUX_GMAC2_TO_2P5GPHY | \ ++ MTK_QDMA | MTK_RSTCTRL_PPE1 | MTK_RSTCTRL_PPE2 | MTK_SRAM) + + struct mtk_tx_dma_desc_info { + dma_addr_t addr; +@@ -1184,6 +1311,24 @@ struct mtk_soc_data { + /* currently no SoC has more than 3 macs */ + #define MTK_MAX_DEVS 3 + ++/* struct mtk_usxgmii_pcs - This structure holds each usxgmii regmap and ++ * associated data ++ * @regmap: The register map pointing at the range used to setup ++ * USXGMII modes ++ * @interface: Currently selected interface mode ++ * @id: The element is used to record the index of PCS ++ * @pcs: Phylink PCS structure ++ */ ++struct mtk_usxgmii_pcs { ++ struct mtk_eth *eth; ++ struct regmap *regmap; ++ struct phylink_pcs *wrapped_sgmii_pcs; ++ phy_interface_t interface; ++ u8 id; ++ unsigned int mode; ++ struct phylink_pcs pcs; ++}; ++ + /* struct mtk_eth - This is the main datasructure for holding the state + * of the driver + * @dev: The device pointer +@@ -1204,6 +1349,12 @@ struct mtk_soc_data { + * @infra: The register map pointing at the range used to setup + * SGMII and GePHY path + * @sgmii_pcs: Pointers to mtk-pcs-lynxi phylink_pcs instances ++ * @sgmii_wrapped_pcs: Pointers to NETSYSv3 wrapper PCS instances ++ * @usxgmii_pll: The register map pointing at the range used to control ++ * the USXGMII SerDes PLL ++ * @regmap_pextp: The register map pointing at the range used to setup ++ * PHYA ++ * @usxgmii_pcs: Pointer to array of pointers to struct for USXGMII PCS + * @pctl: The register map pointing at the range used to setup + * GMAC port drive/slew values + * @dma_refcnt: track how many netdevs are using the DMA engine +@@ -1247,6 +1398,10 @@ struct mtk_eth { + struct regmap *ethsys; + struct regmap *infra; + struct phylink_pcs *sgmii_pcs[MTK_MAX_DEVS]; ++ struct regmap *toprgu; ++ struct regmap *usxgmii_pll; ++ struct regmap *regmap_pextp[MTK_MAX_DEVS]; ++ struct mtk_usxgmii_pcs *usxgmii_pcs[MTK_MAX_DEVS]; + struct regmap *pctl; + bool hwlro; + refcount_t dma_refcnt; +@@ -1434,6 +1589,19 @@ static inline u32 mtk_get_ib2_multicast_ + return MTK_FOE_IB2_MULTICAST; + } + ++static inline bool mtk_interface_mode_is_xgmii(phy_interface_t interface) ++{ ++ switch (interface) { ++ case PHY_INTERFACE_MODE_INTERNAL: ++ case PHY_INTERFACE_MODE_USXGMII: ++ case PHY_INTERFACE_MODE_10GBASER: ++ case PHY_INTERFACE_MODE_5GBASER: ++ return true; ++ default: ++ return false; ++ } ++} ++ + /* read the hardware status register */ + void mtk_stats_update_mac(struct mtk_mac *mac); + +@@ -1442,8 +1610,10 @@ u32 mtk_r32(struct mtk_eth *eth, unsigne + u32 mtk_m32(struct mtk_eth *eth, u32 mask, u32 set, unsigned int reg); + + int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id); ++int mtk_gmac_2p5gphy_path_setup(struct mtk_eth *eth, int mac_id); + int mtk_gmac_gephy_path_setup(struct mtk_eth *eth, int mac_id); + int mtk_gmac_rgmii_path_setup(struct mtk_eth *eth, int mac_id); ++int mtk_gmac_usxgmii_path_setup(struct mtk_eth *eth, int mac_id); + + int mtk_eth_offload_init(struct mtk_eth *eth); + int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type, +@@ -1453,5 +1623,63 @@ int mtk_flow_offload_cmd(struct mtk_eth + void mtk_flow_offload_cleanup(struct mtk_eth *eth, struct list_head *list); + void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev); + ++static inline int mtk_mac2xgmii_id(struct mtk_eth *eth, int mac_id) ++{ ++ int xgmii_id = mac_id; ++ ++ if (mtk_is_netsys_v3_or_greater(eth)) { ++ switch (mac_id) { ++ case MTK_GMAC1_ID: ++ case MTK_GMAC2_ID: ++ xgmii_id = 1; ++ break; ++ case MTK_GMAC3_ID: ++ xgmii_id = 0; ++ break; ++ default: ++ xgmii_id = -1; ++ } ++ } ++ ++ return MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII) ? 0 : xgmii_id; ++} ++ ++static inline int mtk_xgmii2mac_id(struct mtk_eth *eth, int xgmii_id) ++{ ++ int mac_id = xgmii_id; ++ ++ if (mtk_is_netsys_v3_or_greater(eth)) { ++ switch (xgmii_id) { ++ case 0: ++ mac_id = 2; ++ break; ++ case 1: ++ mac_id = 1; ++ break; ++ default: ++ mac_id = -1; ++ } ++ } ++ ++ return mac_id; ++} ++ ++#ifdef CONFIG_NET_MEDIATEK_SOC_USXGMII ++struct phylink_pcs *mtk_sgmii_wrapper_select_pcs(struct mtk_eth *eth, int id); ++struct phylink_pcs *mtk_usxgmii_select_pcs(struct mtk_eth *eth, int id); ++int mtk_usxgmii_init(struct mtk_eth *eth); ++#else ++static inline struct phylink_pcs *mtk_sgmii_wrapper_select_pcs(struct mtk_eth *eth, int id) ++{ ++ return NULL; ++} ++ ++static inline struct phylink_pcs *mtk_usxgmii_select_pcs(struct mtk_eth *eth, int id) ++{ ++ return NULL; ++} ++ ++static inline int mtk_usxgmii_init(struct mtk_eth *eth) { return 0; } ++#endif /* NET_MEDIATEK_SOC_USXGMII */ + + #endif /* MTK_ETH_H */ +--- /dev/null ++++ b/drivers/net/ethernet/mediatek/mtk_usxgmii.c +@@ -0,0 +1,690 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (c) 2023 MediaTek Inc. ++ * Author: Henry Yen ++ * Daniel Golle ++ */ ++ ++#include ++#include ++#include ++#include "mtk_eth_soc.h" ++ ++static struct mtk_usxgmii_pcs *pcs_to_mtk_usxgmii_pcs(struct phylink_pcs *pcs) ++{ ++ return container_of(pcs, struct mtk_usxgmii_pcs, pcs); ++} ++ ++static int mtk_xfi_pextp_init(struct mtk_eth *eth) ++{ ++ struct device *dev = eth->dev; ++ struct device_node *r = dev->of_node; ++ struct device_node *np; ++ int i; ++ ++ for (i = 0; i < MTK_MAX_DEVS; i++) { ++ np = of_parse_phandle(r, "mediatek,xfi-pextp", i); ++ if (!np) ++ break; ++ ++ eth->regmap_pextp[i] = syscon_node_to_regmap(np); ++ if (IS_ERR(eth->regmap_pextp[i])) ++ return PTR_ERR(eth->regmap_pextp[i]); ++ } ++ ++ return 0; ++} ++ ++static int mtk_xfi_pll_init(struct mtk_eth *eth) ++{ ++ struct device_node *r = eth->dev->of_node; ++ struct device_node *np; ++ ++ np = of_parse_phandle(r, "mediatek,xfi-pll", 0); ++ if (!np) ++ return -1; ++ ++ eth->usxgmii_pll = syscon_node_to_regmap(np); ++ if (IS_ERR(eth->usxgmii_pll)) ++ return PTR_ERR(eth->usxgmii_pll); ++ ++ return 0; ++} ++ ++static int mtk_toprgu_init(struct mtk_eth *eth) ++{ ++ struct device_node *r = eth->dev->of_node; ++ struct device_node *np; ++ ++ np = of_parse_phandle(r, "mediatek,toprgu", 0); ++ if (!np) ++ return -1; ++ ++ eth->toprgu = syscon_node_to_regmap(np); ++ if (IS_ERR(eth->toprgu)) ++ return PTR_ERR(eth->toprgu); ++ ++ return 0; ++} ++ ++static int mtk_xfi_pll_enable(struct mtk_eth *eth) ++{ ++ u32 val = 0; ++ ++ if (!eth->usxgmii_pll) ++ return -EINVAL; ++ ++ /* Add software workaround for USXGMII PLL TCL issue */ ++ regmap_write(eth->usxgmii_pll, XFI_PLL_ANA_GLB8, RG_XFI_PLL_ANA_SWWA); ++ ++ regmap_read(eth->usxgmii_pll, XFI_PLL_DIG_GLB8, &val); ++ val |= RG_XFI_PLL_EN; ++ regmap_write(eth->usxgmii_pll, XFI_PLL_DIG_GLB8, val); ++ ++ return 0; ++} ++ ++static void mtk_usxgmii_setup_phya(struct regmap *pextp, phy_interface_t interface, int id) ++{ ++ bool is_10g = (interface == PHY_INTERFACE_MODE_10GBASER || ++ interface == PHY_INTERFACE_MODE_USXGMII); ++ bool is_2p5g = (interface == PHY_INTERFACE_MODE_2500BASEX); ++ bool is_5g = (interface == PHY_INTERFACE_MODE_5GBASER); ++ ++ /* Setup operation mode */ ++ if (is_10g) ++ regmap_write(pextp, 0x9024, 0x00C9071C); ++ else ++ regmap_write(pextp, 0x9024, 0x00D9071C); ++ ++ if (is_5g) ++ regmap_write(pextp, 0x2020, 0xAAA5A5AA); ++ else ++ regmap_write(pextp, 0x2020, 0xAA8585AA); ++ ++ if (is_2p5g || is_5g || is_10g) { ++ regmap_write(pextp, 0x2030, 0x0C020707); ++ regmap_write(pextp, 0x2034, 0x0E050F0F); ++ regmap_write(pextp, 0x2040, 0x00140032); ++ } else { ++ regmap_write(pextp, 0x2030, 0x0C020207); ++ regmap_write(pextp, 0x2034, 0x0E05050F); ++ regmap_write(pextp, 0x2040, 0x00200032); ++ } ++ ++ if (is_2p5g || is_10g) ++ regmap_write(pextp, 0x50F0, 0x00C014AA); ++ else if (is_5g) ++ regmap_write(pextp, 0x50F0, 0x00C018AA); ++ else ++ regmap_write(pextp, 0x50F0, 0x00C014BA); ++ ++ if (is_5g) { ++ regmap_write(pextp, 0x50E0, 0x3777812B); ++ regmap_write(pextp, 0x506C, 0x005C9CFF); ++ regmap_write(pextp, 0x5070, 0x9DFAFAFA); ++ regmap_write(pextp, 0x5074, 0x273F3F3F); ++ regmap_write(pextp, 0x5078, 0xA8883868); ++ regmap_write(pextp, 0x507C, 0x14661466); ++ } else { ++ regmap_write(pextp, 0x50E0, 0x3777C12B); ++ regmap_write(pextp, 0x506C, 0x005F9CFF); ++ regmap_write(pextp, 0x5070, 0x9D9DFAFA); ++ regmap_write(pextp, 0x5074, 0x27273F3F); ++ regmap_write(pextp, 0x5078, 0xA7883C68); ++ regmap_write(pextp, 0x507C, 0x11661166); ++ } ++ ++ if (is_2p5g || is_10g) { ++ regmap_write(pextp, 0x5080, 0x0E000AAF); ++ regmap_write(pextp, 0x5084, 0x08080D0D); ++ regmap_write(pextp, 0x5088, 0x02030909); ++ } else if (is_5g) { ++ regmap_write(pextp, 0x5080, 0x0E001ABF); ++ regmap_write(pextp, 0x5084, 0x080B0D0D); ++ regmap_write(pextp, 0x5088, 0x02050909); ++ } else { ++ regmap_write(pextp, 0x5080, 0x0E000EAF); ++ regmap_write(pextp, 0x5084, 0x08080E0D); ++ regmap_write(pextp, 0x5088, 0x02030B09); ++ } ++ ++ if (is_5g) { ++ regmap_write(pextp, 0x50E4, 0x0C000000); ++ regmap_write(pextp, 0x50E8, 0x04000000); ++ } else { ++ regmap_write(pextp, 0x50E4, 0x0C0C0000); ++ regmap_write(pextp, 0x50E8, 0x04040000); ++ } ++ ++ if (is_2p5g || mtk_interface_mode_is_xgmii(interface)) ++ regmap_write(pextp, 0x50EC, 0x0F0F0C06); ++ else ++ regmap_write(pextp, 0x50EC, 0x0F0F0606); ++ ++ if (is_5g) { ++ regmap_write(pextp, 0x50A8, 0x50808C8C); ++ regmap_write(pextp, 0x6004, 0x18000000); ++ } else { ++ regmap_write(pextp, 0x50A8, 0x506E8C8C); ++ regmap_write(pextp, 0x6004, 0x18190000); ++ } ++ ++ if (is_10g) ++ regmap_write(pextp, 0x00F8, 0x01423342); ++ else if (is_5g) ++ regmap_write(pextp, 0x00F8, 0x00A132A1); ++ else if (is_2p5g) ++ regmap_write(pextp, 0x00F8, 0x009C329C); ++ else ++ regmap_write(pextp, 0x00F8, 0x00FA32FA); ++ ++ /* Force SGDT_OUT off and select PCS */ ++ if (mtk_interface_mode_is_xgmii(interface)) ++ regmap_write(pextp, 0x00F4, 0x80201F20); ++ else ++ regmap_write(pextp, 0x00F4, 0x80201F21); ++ ++ /* Force GLB_CKDET_OUT */ ++ regmap_write(pextp, 0x0030, 0x00050C00); ++ ++ /* Force AEQ on */ ++ regmap_write(pextp, 0x0070, 0x02002800); ++ ndelay(1020); ++ ++ /* Setup DA default value */ ++ regmap_write(pextp, 0x30B0, 0x00000020); ++ regmap_write(pextp, 0x3028, 0x00008A01); ++ regmap_write(pextp, 0x302C, 0x0000A884); ++ regmap_write(pextp, 0x3024, 0x00083002); ++ if (mtk_interface_mode_is_xgmii(interface)) { ++ regmap_write(pextp, 0x3010, 0x00022220); ++ regmap_write(pextp, 0x5064, 0x0F020A01); ++ regmap_write(pextp, 0x50B4, 0x06100600); ++ if (interface == PHY_INTERFACE_MODE_USXGMII) ++ regmap_write(pextp, 0x3048, 0x40704000); ++ else ++ regmap_write(pextp, 0x3048, 0x47684100); ++ } else { ++ regmap_write(pextp, 0x3010, 0x00011110); ++ regmap_write(pextp, 0x3048, 0x40704000); ++ } ++ ++ if (!mtk_interface_mode_is_xgmii(interface) && !is_2p5g) ++ regmap_write(pextp, 0x3064, 0x0000C000); ++ ++ if (interface == PHY_INTERFACE_MODE_USXGMII) { ++ regmap_write(pextp, 0x3050, 0xA8000000); ++ regmap_write(pextp, 0x3054, 0x000000AA); ++ } else if (mtk_interface_mode_is_xgmii(interface)) { ++ regmap_write(pextp, 0x3050, 0x00000000); ++ regmap_write(pextp, 0x3054, 0x00000000); ++ } else { ++ regmap_write(pextp, 0x3050, 0xA8000000); ++ regmap_write(pextp, 0x3054, 0x000000AA); ++ } ++ ++ if (mtk_interface_mode_is_xgmii(interface)) ++ regmap_write(pextp, 0x306C, 0x00000F00); ++ else if (is_2p5g) ++ regmap_write(pextp, 0x306C, 0x22000F00); ++ else ++ regmap_write(pextp, 0x306C, 0x20200F00); ++ ++ if (interface == PHY_INTERFACE_MODE_10GBASER && id == 0) ++ regmap_write(pextp, 0xA008, 0x0007B400); ++ ++ if (mtk_interface_mode_is_xgmii(interface)) ++ regmap_write(pextp, 0xA060, 0x00040000); ++ else ++ regmap_write(pextp, 0xA060, 0x00050000); ++ ++ if (is_10g) ++ regmap_write(pextp, 0x90D0, 0x00000001); ++ else if (is_5g) ++ regmap_write(pextp, 0x90D0, 0x00000003); ++ else if (is_2p5g) ++ regmap_write(pextp, 0x90D0, 0x00000005); ++ else ++ regmap_write(pextp, 0x90D0, 0x00000007); ++ ++ /* Release reset */ ++ regmap_write(pextp, 0x0070, 0x0200E800); ++ usleep_range(150, 500); ++ ++ /* Switch to P0 */ ++ regmap_write(pextp, 0x0070, 0x0200C111); ++ ndelay(1020); ++ regmap_write(pextp, 0x0070, 0x0200C101); ++ usleep_range(15, 50); ++ ++ if (mtk_interface_mode_is_xgmii(interface)) { ++ /* Switch to Gen3 */ ++ regmap_write(pextp, 0x0070, 0x0202C111); ++ } else { ++ /* Switch to Gen2 */ ++ regmap_write(pextp, 0x0070, 0x0201C111); ++ } ++ ndelay(1020); ++ if (mtk_interface_mode_is_xgmii(interface)) ++ regmap_write(pextp, 0x0070, 0x0202C101); ++ else ++ regmap_write(pextp, 0x0070, 0x0201C101); ++ usleep_range(100, 500); ++ regmap_write(pextp, 0x30B0, 0x00000030); ++ if (mtk_interface_mode_is_xgmii(interface)) ++ regmap_write(pextp, 0x00F4, 0x80201F00); ++ else ++ regmap_write(pextp, 0x00F4, 0x80201F01); ++ ++ regmap_write(pextp, 0x3040, 0x30000000); ++ usleep_range(400, 1000); ++} ++ ++static void mtk_usxgmii_reset(struct mtk_eth *eth, int id) ++{ ++ u32 toggle, val; ++ ++ if (id >= MTK_MAX_DEVS || !eth->toprgu) ++ return; ++ ++ switch (id) { ++ case 0: ++ toggle = SWSYSRST_XFI_PEXPT0_GRST | SWSYSRST_XFI0_GRST | ++ SWSYSRST_SGMII0_GRST; ++ break; ++ case 1: ++ toggle = SWSYSRST_XFI_PEXPT1_GRST | SWSYSRST_XFI1_GRST | ++ SWSYSRST_SGMII1_GRST; ++ break; ++ default: ++ return; ++ } ++ ++ /* Enable software reset */ ++ regmap_set_bits(eth->toprgu, TOPRGU_SWSYSRST_EN, toggle); ++ ++ /* Assert USXGMII reset */ ++ regmap_set_bits(eth->toprgu, TOPRGU_SWSYSRST, ++ FIELD_PREP(SWSYSRST_UNLOCK_KEY, 0x88) | toggle); ++ ++ usleep_range(100, 500); ++ ++ /* De-assert USXGMII reset */ ++ regmap_read(eth->toprgu, TOPRGU_SWSYSRST, &val); ++ val |= FIELD_PREP(SWSYSRST_UNLOCK_KEY, 0x88); ++ val &= ~toggle; ++ regmap_write(eth->toprgu, TOPRGU_SWSYSRST, val); ++ ++ /* Disable software reset */ ++ regmap_clear_bits(eth->toprgu, TOPRGU_SWSYSRST_EN, toggle); ++ ++ mdelay(10); ++} ++ ++/* As the USXGMII PHYA is shared with the 1000Base-X/2500Base-X/Cisco SGMII unit ++ * the psc-mtk-lynxi instance needs to be wrapped, so that calls to .pcs_config ++ * also trigger an initial reset and subsequent configuration of the PHYA. ++ */ ++struct mtk_sgmii_wrapper_pcs { ++ struct mtk_eth *eth; ++ struct phylink_pcs *wrapped_pcs; ++ u8 id; ++ struct phylink_pcs pcs; ++}; ++ ++static int mtk_sgmii_wrapped_pcs_config(struct phylink_pcs *pcs, ++ unsigned int mode, ++ phy_interface_t interface, ++ const unsigned long *advertising, ++ bool permit_pause_to_mac) ++{ ++ struct mtk_sgmii_wrapper_pcs *wp = container_of(pcs, struct mtk_sgmii_wrapper_pcs, pcs); ++ bool full_reconf; ++ int ret; ++ ++ full_reconf = interface != wp->eth->usxgmii_pcs[wp->id]->interface; ++ if (full_reconf) { ++ mtk_xfi_pll_enable(wp->eth); ++ mtk_usxgmii_reset(wp->eth, wp->id); ++ } ++ ++ ret = wp->wrapped_pcs->ops->pcs_config(wp->wrapped_pcs, mode, interface, ++ advertising, permit_pause_to_mac); ++ ++ if (full_reconf) ++ mtk_usxgmii_setup_phya(wp->eth->regmap_pextp[wp->id], interface, wp->id); ++ ++ wp->eth->usxgmii_pcs[wp->id]->interface = interface; ++ ++ return ret; ++} ++ ++static void mtk_sgmii_wrapped_pcs_get_state(struct phylink_pcs *pcs, ++ struct phylink_link_state *state) ++{ ++ struct mtk_sgmii_wrapper_pcs *wp = container_of(pcs, struct mtk_sgmii_wrapper_pcs, pcs); ++ ++ return wp->wrapped_pcs->ops->pcs_get_state(wp->wrapped_pcs, state); ++} ++ ++static void mtk_sgmii_wrapped_pcs_an_restart(struct phylink_pcs *pcs) ++{ ++ struct mtk_sgmii_wrapper_pcs *wp = container_of(pcs, struct mtk_sgmii_wrapper_pcs, pcs); ++ ++ wp->wrapped_pcs->ops->pcs_an_restart(wp->wrapped_pcs); ++} ++ ++static void mtk_sgmii_wrapped_pcs_link_up(struct phylink_pcs *pcs, ++ unsigned int mode, ++ phy_interface_t interface, int speed, ++ int duplex) ++{ ++ struct mtk_sgmii_wrapper_pcs *wp = container_of(pcs, struct mtk_sgmii_wrapper_pcs, pcs); ++ ++ wp->wrapped_pcs->ops->pcs_link_up(wp->wrapped_pcs, mode, interface, speed, duplex); ++} ++ ++static void mtk_sgmii_wrapped_pcs_disable(struct phylink_pcs *pcs) ++{ ++ struct mtk_sgmii_wrapper_pcs *wp = container_of(pcs, struct mtk_sgmii_wrapper_pcs, pcs); ++ ++ wp->wrapped_pcs->ops->pcs_disable(wp->wrapped_pcs); ++ ++ wp->eth->usxgmii_pcs[wp->id]->interface = PHY_INTERFACE_MODE_NA; ++} ++ ++static const struct phylink_pcs_ops mtk_sgmii_wrapped_pcs_ops = { ++ .pcs_get_state = mtk_sgmii_wrapped_pcs_get_state, ++ .pcs_config = mtk_sgmii_wrapped_pcs_config, ++ .pcs_an_restart = mtk_sgmii_wrapped_pcs_an_restart, ++ .pcs_link_up = mtk_sgmii_wrapped_pcs_link_up, ++ .pcs_disable = mtk_sgmii_wrapped_pcs_disable, ++}; ++ ++static int mtk_sgmii_wrapper_init(struct mtk_eth *eth) ++{ ++ struct mtk_sgmii_wrapper_pcs *wp; ++ int i; ++ ++ for (i = 0; i < MTK_MAX_DEVS; i++) { ++ if (!eth->sgmii_pcs[i]) ++ continue; ++ ++ if (!eth->usxgmii_pcs[i]) ++ continue; ++ ++ /* Make sure all PCS ops are supported by wrapped PCS */ ++ if (!eth->sgmii_pcs[i]->ops->pcs_get_state || ++ !eth->sgmii_pcs[i]->ops->pcs_config || ++ !eth->sgmii_pcs[i]->ops->pcs_an_restart || ++ !eth->sgmii_pcs[i]->ops->pcs_link_up || ++ !eth->sgmii_pcs[i]->ops->pcs_disable) ++ return -EOPNOTSUPP; ++ ++ wp = devm_kzalloc(eth->dev, sizeof(*wp), GFP_KERNEL); ++ if (!wp) ++ return -ENOMEM; ++ ++ wp->wrapped_pcs = eth->sgmii_pcs[i]; ++ wp->id = i; ++ wp->pcs.poll = true; ++ wp->pcs.ops = &mtk_sgmii_wrapped_pcs_ops; ++ wp->eth = eth; ++ ++ eth->usxgmii_pcs[i]->wrapped_sgmii_pcs = &wp->pcs; ++ } ++ ++ return 0; ++} ++ ++struct phylink_pcs *mtk_sgmii_wrapper_select_pcs(struct mtk_eth *eth, int mac_id) ++{ ++ u32 xgmii_id = mtk_mac2xgmii_id(eth, mac_id); ++ ++ if (!eth->usxgmii_pcs[xgmii_id]) ++ return NULL; ++ ++ return eth->usxgmii_pcs[xgmii_id]->wrapped_sgmii_pcs; ++} ++ ++static int mtk_usxgmii_pcs_config(struct phylink_pcs *pcs, unsigned int mode, ++ phy_interface_t interface, ++ const unsigned long *advertising, ++ bool permit_pause_to_mac) ++{ ++ struct mtk_usxgmii_pcs *mpcs = pcs_to_mtk_usxgmii_pcs(pcs); ++ struct mtk_eth *eth = mpcs->eth; ++ struct regmap *pextp = eth->regmap_pextp[mpcs->id]; ++ unsigned int an_ctrl = 0, link_timer = 0, xfi_mode = 0, adapt_mode = 0; ++ bool mode_changed = false; ++ ++ if (!pextp) ++ return -ENODEV; ++ ++ if (interface == PHY_INTERFACE_MODE_USXGMII) { ++ an_ctrl = FIELD_PREP(USXGMII_AN_SYNC_CNT, 0x1FF) | USXGMII_AN_ENABLE; ++ link_timer = FIELD_PREP(USXGMII_LINK_TIMER_IDLE_DETECT, 0x7B) | ++ FIELD_PREP(USXGMII_LINK_TIMER_COMP_ACK_DETECT, 0x7B) | ++ FIELD_PREP(USXGMII_LINK_TIMER_AN_RESTART, 0x7B); ++ xfi_mode = FIELD_PREP(USXGMII_XFI_RX_MODE, USXGMII_XFI_RX_MODE_10G) | ++ FIELD_PREP(USXGMII_XFI_TX_MODE, USXGMII_XFI_TX_MODE_10G); ++ } else if (interface == PHY_INTERFACE_MODE_10GBASER) { ++ an_ctrl = FIELD_PREP(USXGMII_AN_SYNC_CNT, 0x1FF); ++ link_timer = FIELD_PREP(USXGMII_LINK_TIMER_IDLE_DETECT, 0x7B) | ++ FIELD_PREP(USXGMII_LINK_TIMER_COMP_ACK_DETECT, 0x7B) | ++ FIELD_PREP(USXGMII_LINK_TIMER_AN_RESTART, 0x7B); ++ xfi_mode = FIELD_PREP(USXGMII_XFI_RX_MODE, USXGMII_XFI_RX_MODE_10G) | ++ FIELD_PREP(USXGMII_XFI_TX_MODE, USXGMII_XFI_TX_MODE_10G); ++ adapt_mode = USXGMII_RATE_UPDATE_MODE; ++ } else if (interface == PHY_INTERFACE_MODE_5GBASER) { ++ an_ctrl = FIELD_PREP(USXGMII_AN_SYNC_CNT, 0xFF); ++ link_timer = FIELD_PREP(USXGMII_LINK_TIMER_IDLE_DETECT, 0x3D) | ++ FIELD_PREP(USXGMII_LINK_TIMER_COMP_ACK_DETECT, 0x3D) | ++ FIELD_PREP(USXGMII_LINK_TIMER_AN_RESTART, 0x3D); ++ xfi_mode = FIELD_PREP(USXGMII_XFI_RX_MODE, USXGMII_XFI_RX_MODE_5G) | ++ FIELD_PREP(USXGMII_XFI_TX_MODE, USXGMII_XFI_TX_MODE_5G); ++ adapt_mode = USXGMII_RATE_UPDATE_MODE; ++ } else { ++ return -EINVAL; ++ } ++ ++ adapt_mode |= FIELD_PREP(USXGMII_RATE_ADAPT_MODE, USXGMII_RATE_ADAPT_MODE_X1); ++ ++ if (mpcs->interface != interface) { ++ mpcs->interface = interface; ++ mode_changed = true; ++ } ++ ++ mtk_xfi_pll_enable(eth); ++ mtk_usxgmii_reset(eth, mpcs->id); ++ ++ /* Setup USXGMII AN ctrl */ ++ regmap_update_bits(mpcs->regmap, RG_PCS_AN_CTRL0, ++ USXGMII_AN_SYNC_CNT | USXGMII_AN_ENABLE, ++ an_ctrl); ++ ++ regmap_update_bits(mpcs->regmap, RG_PCS_AN_CTRL2, ++ USXGMII_LINK_TIMER_IDLE_DETECT | ++ USXGMII_LINK_TIMER_COMP_ACK_DETECT | ++ USXGMII_LINK_TIMER_AN_RESTART, ++ link_timer); ++ ++ mpcs->mode = mode; ++ ++ /* Gated MAC CK */ ++ regmap_update_bits(mpcs->regmap, RG_PHY_TOP_SPEED_CTRL1, ++ USXGMII_MAC_CK_GATED, USXGMII_MAC_CK_GATED); ++ ++ /* Enable interface force mode */ ++ regmap_update_bits(mpcs->regmap, RG_PHY_TOP_SPEED_CTRL1, ++ USXGMII_IF_FORCE_EN, USXGMII_IF_FORCE_EN); ++ ++ /* Setup USXGMII adapt mode */ ++ regmap_update_bits(mpcs->regmap, RG_PHY_TOP_SPEED_CTRL1, ++ USXGMII_RATE_UPDATE_MODE | USXGMII_RATE_ADAPT_MODE, ++ adapt_mode); ++ ++ /* Setup USXGMII speed */ ++ regmap_update_bits(mpcs->regmap, RG_PHY_TOP_SPEED_CTRL1, ++ USXGMII_XFI_RX_MODE | USXGMII_XFI_TX_MODE, ++ xfi_mode); ++ ++ usleep_range(1, 10); ++ ++ /* Un-gated MAC CK */ ++ regmap_update_bits(mpcs->regmap, RG_PHY_TOP_SPEED_CTRL1, ++ USXGMII_MAC_CK_GATED, 0); ++ ++ usleep_range(1, 10); ++ ++ /* Disable interface force mode for the AN mode */ ++ if (an_ctrl & USXGMII_AN_ENABLE) ++ regmap_update_bits(mpcs->regmap, RG_PHY_TOP_SPEED_CTRL1, ++ USXGMII_IF_FORCE_EN, 0); ++ ++ /* Setup USXGMIISYS with the determined property */ ++ mtk_usxgmii_setup_phya(pextp, interface, mpcs->id); ++ ++ return mode_changed; ++} ++ ++static void mtk_usxgmii_pcs_get_state(struct phylink_pcs *pcs, ++ struct phylink_link_state *state) ++{ ++ struct mtk_usxgmii_pcs *mpcs = pcs_to_mtk_usxgmii_pcs(pcs); ++ struct mtk_eth *eth = mpcs->eth; ++ struct mtk_mac *mac = eth->mac[mtk_xgmii2mac_id(eth, mpcs->id)]; ++ u32 val = 0; ++ ++ regmap_read(mpcs->regmap, RG_PCS_AN_CTRL0, &val); ++ if (FIELD_GET(USXGMII_AN_ENABLE, val)) { ++ /* Refresh LPA by inverting LPA_LATCH */ ++ regmap_read(mpcs->regmap, RG_PCS_AN_STS0, &val); ++ regmap_update_bits(mpcs->regmap, RG_PCS_AN_STS0, ++ USXGMII_LPA_LATCH, ++ !(val & USXGMII_LPA_LATCH)); ++ ++ regmap_read(mpcs->regmap, RG_PCS_AN_STS0, &val); ++ ++ phylink_decode_usxgmii_word(state, FIELD_GET(USXGMII_PCS_AN_WORD, ++ val)); ++ ++ state->interface = mpcs->interface; ++ } else { ++ val = mtk_r32(mac->hw, MTK_XGMAC_STS(mac->id)); ++ ++ if (mac->id == MTK_GMAC2_ID) ++ val >>= 16; ++ ++ switch (FIELD_GET(MTK_USXGMII_PCS_MODE, val)) { ++ case 0: ++ state->speed = SPEED_10000; ++ break; ++ case 1: ++ state->speed = SPEED_5000; ++ break; ++ case 2: ++ state->speed = SPEED_2500; ++ break; ++ case 3: ++ state->speed = SPEED_1000; ++ break; ++ } ++ ++ state->interface = mpcs->interface; ++ state->link = FIELD_GET(MTK_USXGMII_PCS_LINK, val); ++ state->duplex = DUPLEX_FULL; ++ } ++ ++ /* Continuously repeat re-configuration sequence until link comes up */ ++ if (state->link == 0) ++ mtk_usxgmii_pcs_config(pcs, mpcs->mode, ++ state->interface, NULL, false); ++} ++ ++static void mtk_usxgmii_pcs_restart_an(struct phylink_pcs *pcs) ++{ ++ struct mtk_usxgmii_pcs *mpcs = pcs_to_mtk_usxgmii_pcs(pcs); ++ unsigned int val = 0; ++ ++ if (!mpcs->regmap) ++ return; ++ ++ regmap_read(mpcs->regmap, RG_PCS_AN_CTRL0, &val); ++ val |= USXGMII_AN_RESTART; ++ regmap_write(mpcs->regmap, RG_PCS_AN_CTRL0, val); ++} ++ ++static void mtk_usxgmii_pcs_link_up(struct phylink_pcs *pcs, unsigned int mode, ++ phy_interface_t interface, ++ int speed, int duplex) ++{ ++ /* Reconfiguring USXGMII to ensure the quality of the RX signal ++ * after the line side link up. ++ */ ++ mtk_usxgmii_pcs_config(pcs, mode, ++ interface, NULL, false); ++} ++ ++static const struct phylink_pcs_ops mtk_usxgmii_pcs_ops = { ++ .pcs_config = mtk_usxgmii_pcs_config, ++ .pcs_get_state = mtk_usxgmii_pcs_get_state, ++ .pcs_an_restart = mtk_usxgmii_pcs_restart_an, ++ .pcs_link_up = mtk_usxgmii_pcs_link_up, ++}; ++ ++int mtk_usxgmii_init(struct mtk_eth *eth) ++{ ++ struct device_node *r = eth->dev->of_node; ++ struct device *dev = eth->dev; ++ struct device_node *np; ++ int i, ret; ++ ++ for (i = 0; i < MTK_MAX_DEVS; i++) { ++ np = of_parse_phandle(r, "mediatek,usxgmiisys", i); ++ if (!np) ++ break; ++ ++ eth->usxgmii_pcs[i] = devm_kzalloc(dev, sizeof(*eth->usxgmii_pcs[i]), GFP_KERNEL); ++ if (!eth->usxgmii_pcs[i]) ++ return -ENOMEM; ++ ++ eth->usxgmii_pcs[i]->id = i; ++ eth->usxgmii_pcs[i]->eth = eth; ++ eth->usxgmii_pcs[i]->regmap = syscon_node_to_regmap(np); ++ if (IS_ERR(eth->usxgmii_pcs[i]->regmap)) ++ return PTR_ERR(eth->usxgmii_pcs[i]->regmap); ++ ++ eth->usxgmii_pcs[i]->pcs.ops = &mtk_usxgmii_pcs_ops; ++ eth->usxgmii_pcs[i]->pcs.poll = true; ++ eth->usxgmii_pcs[i]->interface = PHY_INTERFACE_MODE_NA; ++ eth->usxgmii_pcs[i]->mode = -1; ++ ++ of_node_put(np); ++ } ++ ++ ret = mtk_xfi_pextp_init(eth); ++ if (ret) ++ return ret; ++ ++ ret = mtk_xfi_pll_init(eth); ++ if (ret) ++ return ret; ++ ++ ret = mtk_toprgu_init(eth); ++ if (ret) ++ return ret; ++ ++ return mtk_sgmii_wrapper_init(eth); ++} ++ ++struct phylink_pcs *mtk_usxgmii_select_pcs(struct mtk_eth *eth, int mac_id) ++{ ++ u32 xgmii_id = mtk_mac2xgmii_id(eth, mac_id); ++ ++ if (!eth->usxgmii_pcs[xgmii_id]->regmap) ++ return NULL; ++ ++ return ð->usxgmii_pcs[xgmii_id]->pcs; ++} diff --git a/target/linux/generic/pending-5.15/750-skb-Do-mix-page-pool-and-page-referenced-frags-in-GR.patch b/target/linux/generic/pending-5.15/750-skb-Do-mix-page-pool-and-page-referenced-frags-in-GR.patch new file mode 100644 index 0000000000..2a57a7ef03 --- /dev/null +++ b/target/linux/generic/pending-5.15/750-skb-Do-mix-page-pool-and-page-referenced-frags-in-GR.patch @@ -0,0 +1,35 @@ +From: Alexander Duyck +Date: Thu, 26 Jan 2023 11:06:59 -0800 +Subject: [PATCH] skb: Do mix page pool and page referenced frags in GRO + +GSO should not merge page pool recycled frames with standard reference +counted frames. Traditionally this didn't occur, at least not often. +However as we start looking at adding support for wireless adapters there +becomes the potential to mix the two due to A-MSDU repartitioning frames in +the receive path. There are possibly other places where this may have +occurred however I suspect they must be few and far between as we have not +seen this issue until now. + +Fixes: 53e0961da1c7 ("page_pool: add frag page recycling support in page pool") +Reported-by: Felix Fietkau +Signed-off-by: Alexander Duyck +--- + +--- a/net/core/skbuff.c ++++ b/net/core/skbuff.c +@@ -4358,6 +4358,15 @@ int skb_gro_receive(struct sk_buff *p, s + if (unlikely(p->len + len >= 65536 || NAPI_GRO_CB(skb)->flush)) + return -E2BIG; + ++ /* Do not splice page pool based packets w/ non-page pool ++ * packets. This can result in reference count issues as page ++ * pool pages will not decrement the reference count and will ++ * instead be immediately returned to the pool or have frag ++ * count decremented. ++ */ ++ if (p->pp_recycle != skb->pp_recycle) ++ return -ETOOMANYREFS; ++ + lp = NAPI_GRO_CB(p)->last; + pinfo = skb_shinfo(lp); + diff --git a/target/linux/generic/pending-5.15/760-net-core-add-optional-threading-for-backlog-processi.patch b/target/linux/generic/pending-5.15/760-net-core-add-optional-threading-for-backlog-processi.patch new file mode 100644 index 0000000000..62daef91b1 --- /dev/null +++ b/target/linux/generic/pending-5.15/760-net-core-add-optional-threading-for-backlog-processi.patch @@ -0,0 +1,232 @@ +From: Felix Fietkau +Date: Thu, 16 Feb 2023 18:39:04 +0100 +Subject: [PATCH] net/core: add optional threading for backlog processing + +When dealing with few flows or an imbalance on CPU utilization, static RPS +CPU assignment can be too inflexible. Add support for enabling threaded NAPI +for backlog processing in order to allow the scheduler to better balance +processing. This helps better spread the load across idle CPUs. + +Signed-off-by: Felix Fietkau +--- + +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -502,6 +502,7 @@ static inline bool napi_complete(struct + } + + int dev_set_threaded(struct net_device *dev, bool threaded); ++int backlog_set_threaded(bool threaded); + + /** + * napi_disable - prevent NAPI from scheduling +@@ -3363,6 +3364,7 @@ struct softnet_data { + unsigned int processed; + unsigned int time_squeeze; + unsigned int received_rps; ++ unsigned int process_queue_empty; + #ifdef CONFIG_RPS + struct softnet_data *rps_ipi_list; + #endif +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -4583,7 +4583,7 @@ static int rps_ipi_queued(struct softnet + #ifdef CONFIG_RPS + struct softnet_data *mysd = this_cpu_ptr(&softnet_data); + +- if (sd != mysd) { ++ if (sd != mysd && !test_bit(NAPI_STATE_THREADED, &sd->backlog.state)) { + sd->rps_ipi_next = mysd->rps_ipi_list; + mysd->rps_ipi_list = sd; + +@@ -5764,6 +5764,8 @@ static DEFINE_PER_CPU(struct work_struct + /* Network device is going away, flush any packets still pending */ + static void flush_backlog(struct work_struct *work) + { ++ unsigned int process_queue_empty; ++ bool threaded, flush_processq; + struct sk_buff *skb, *tmp; + struct softnet_data *sd; + +@@ -5779,9 +5781,18 @@ static void flush_backlog(struct work_st + input_queue_head_incr(sd); + } + } ++ ++ threaded = test_bit(NAPI_STATE_THREADED, &sd->backlog.state); ++ flush_processq = threaded && ++ !skb_queue_empty_lockless(&sd->process_queue); ++ if (flush_processq) ++ process_queue_empty = sd->process_queue_empty; + rps_unlock(sd); + local_irq_enable(); + ++ if (threaded) ++ goto out; ++ + skb_queue_walk_safe(&sd->process_queue, skb, tmp) { + if (skb->dev->reg_state == NETREG_UNREGISTERING) { + __skb_unlink(skb, &sd->process_queue); +@@ -5789,7 +5800,18 @@ static void flush_backlog(struct work_st + input_queue_head_incr(sd); + } + } ++ ++out: + local_bh_enable(); ++ ++ while (flush_processq) { ++ msleep(1); ++ local_irq_disable(); ++ rps_lock(sd); ++ flush_processq = process_queue_empty == sd->process_queue_empty; ++ rps_unlock(sd); ++ local_irq_enable(); ++ } + } + + static bool flush_required(int cpu) +@@ -6472,6 +6494,7 @@ static int process_backlog(struct napi_s + + local_irq_disable(); + rps_lock(sd); ++ sd->process_queue_empty++; + if (skb_queue_empty(&sd->input_pkt_queue)) { + /* + * Inline a custom version of __napi_complete(). +@@ -6481,7 +6504,8 @@ static int process_backlog(struct napi_s + * We can use a plain write instead of clear_bit(), + * and we dont need an smp_mb() memory barrier. + */ +- napi->state = 0; ++ napi->state &= ~(NAPIF_STATE_SCHED | ++ NAPIF_STATE_SCHED_THREADED); + again = false; + } else { + skb_queue_splice_tail_init(&sd->input_pkt_queue, +@@ -6898,6 +6922,57 @@ int dev_set_threaded(struct net_device * + } + EXPORT_SYMBOL(dev_set_threaded); + ++int backlog_set_threaded(bool threaded) ++{ ++ static bool backlog_threaded; ++ int err = 0; ++ int i; ++ ++ if (backlog_threaded == threaded) ++ return 0; ++ ++ for_each_possible_cpu(i) { ++ struct softnet_data *sd = &per_cpu(softnet_data, i); ++ struct napi_struct *n = &sd->backlog; ++ ++ if (n->thread) ++ continue; ++ n->thread = kthread_run(napi_threaded_poll, n, "napi/backlog-%d", i); ++ if (IS_ERR(n->thread)) { ++ err = PTR_ERR(n->thread); ++ pr_err("kthread_run failed with err %d\n", err); ++ n->thread = NULL; ++ threaded = false; ++ break; ++ } ++ ++ } ++ ++ backlog_threaded = threaded; ++ ++ /* Make sure kthread is created before THREADED bit ++ * is set. ++ */ ++ smp_mb__before_atomic(); ++ ++ for_each_possible_cpu(i) { ++ struct softnet_data *sd = &per_cpu(softnet_data, i); ++ struct napi_struct *n = &sd->backlog; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ rps_lock(sd); ++ if (threaded) ++ n->state |= NAPIF_STATE_THREADED; ++ else ++ n->state &= ~NAPIF_STATE_THREADED; ++ rps_unlock(sd); ++ local_irq_restore(flags); ++ } ++ ++ return err; ++} ++ + void netif_napi_add(struct net_device *dev, struct napi_struct *napi, + int (*poll)(struct napi_struct *, int), int weight) + { +@@ -11378,6 +11453,9 @@ static int dev_cpu_dead(unsigned int old + raise_softirq_irqoff(NET_TX_SOFTIRQ); + local_irq_enable(); + ++ if (test_bit(NAPI_STATE_THREADED, &oldsd->backlog.state)) ++ return 0; ++ + #ifdef CONFIG_RPS + remsd = oldsd->rps_ipi_list; + oldsd->rps_ipi_list = NULL; +@@ -11717,6 +11795,7 @@ static int __init net_dev_init(void) + sd->cpu = i; + #endif + ++ INIT_LIST_HEAD(&sd->backlog.poll_list); + init_gro_hash(&sd->backlog); + sd->backlog.poll = process_backlog; + sd->backlog.weight = weight_p; +--- a/net/core/sysctl_net_core.c ++++ b/net/core/sysctl_net_core.c +@@ -28,6 +28,7 @@ static int int_3600 = 3600; + static int min_sndbuf = SOCK_MIN_SNDBUF; + static int min_rcvbuf = SOCK_MIN_RCVBUF; + static int max_skb_frags = MAX_SKB_FRAGS; ++static int backlog_threaded; + static long long_one __maybe_unused = 1; + static long long_max __maybe_unused = LONG_MAX; + +@@ -114,6 +115,23 @@ static int rps_sock_flow_sysctl(struct c + } + #endif /* CONFIG_RPS */ + ++static int backlog_threaded_sysctl(struct ctl_table *table, int write, ++ void *buffer, size_t *lenp, loff_t *ppos) ++{ ++ static DEFINE_MUTEX(backlog_threaded_mutex); ++ int ret; ++ ++ mutex_lock(&backlog_threaded_mutex); ++ ++ ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); ++ if (write && !ret) ++ ret = backlog_set_threaded(backlog_threaded); ++ ++ mutex_unlock(&backlog_threaded_mutex); ++ ++ return ret; ++} ++ + #ifdef CONFIG_NET_FLOW_LIMIT + static DEFINE_MUTEX(flow_limit_update_mutex); + +@@ -470,6 +488,15 @@ static struct ctl_table net_core_table[] + .proc_handler = rps_sock_flow_sysctl + }, + #endif ++ { ++ .procname = "backlog_threaded", ++ .data = &backlog_threaded, ++ .maxlen = sizeof(unsigned int), ++ .mode = 0644, ++ .proc_handler = backlog_threaded_sysctl, ++ .extra1 = SYSCTL_ZERO, ++ .extra2 = SYSCTL_ONE ++ }, + #ifdef CONFIG_NET_FLOW_LIMIT + { + .procname = "flow_limit_cpu_bitmap", diff --git a/target/linux/generic/pending-5.15/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch b/target/linux/generic/pending-5.15/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch new file mode 100644 index 0000000000..98d5d6d4f0 --- /dev/null +++ b/target/linux/generic/pending-5.15/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch @@ -0,0 +1,27 @@ +From: Tobias Waldekranz +Subject: [RFC net-next 7/7] net: dsa: mv88e6xxx: Request assisted learning on CPU port +Date: Sat, 16 Jan 2021 02:25:15 +0100 +Archived-At: + +While the hardware is capable of performing learning on the CPU port, +it requires alot of additions to the bridge's forwarding path in order +to handle multi-destination traffic correctly. + +Until that is in place, opt for the next best thing and let DSA sync +the relevant addresses down to the hardware FDB. + +Signed-off-by: Tobias Waldekranz +--- + drivers/net/dsa/mv88e6xxx/chip.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/dsa/mv88e6xxx/chip.c ++++ b/drivers/net/dsa/mv88e6xxx/chip.c +@@ -6343,6 +6343,7 @@ static int mv88e6xxx_register_switch(str + ds->ops = &mv88e6xxx_switch_ops; + ds->ageing_time_min = chip->info->age_time_coeff; + ds->ageing_time_max = chip->info->age_time_coeff * U8_MAX; ++ ds->assisted_learning_on_cpu_port = true; + + /* Some chips support up to 32, but that requires enabling the + * 5-bit port mode, which we do not support. 640k^W16 ought to diff --git a/target/linux/generic/pending-5.15/772-net-dsa-b53-add-support-for-BCM63xx-RGMIIs.patch b/target/linux/generic/pending-5.15/772-net-dsa-b53-add-support-for-BCM63xx-RGMIIs.patch new file mode 100644 index 0000000000..ca963d1260 --- /dev/null +++ b/target/linux/generic/pending-5.15/772-net-dsa-b53-add-support-for-BCM63xx-RGMIIs.patch @@ -0,0 +1,174 @@ +From patchwork Sun Mar 19 22:08:05 2023 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= + +X-Patchwork-Id: 13180645 +X-Patchwork-Delegate: kuba@kernel.org +Return-Path: +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) + by smtp.lore.kernel.org (Postfix) with ESMTP id A7A46C6FD1F + for ; Sun, 19 Mar 2023 22:08:15 +0000 (UTC) +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S230223AbjCSWIN (ORCPT ); + Sun, 19 Mar 2023 18:08:13 -0400 +Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32878 "EHLO + lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org + with ESMTP id S229565AbjCSWIM (ORCPT + ); Sun, 19 Mar 2023 18:08:12 -0400 +Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com + [IPv6:2a00:1450:4864:20::42e]) + by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 605D3E062; + Sun, 19 Mar 2023 15:08:10 -0700 (PDT) +Received: by mail-wr1-x42e.google.com with SMTP id h17so8695188wrt.8; + Sun, 19 Mar 2023 15:08:10 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20210112; t=1679263689; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:from:to:cc:subject:date + :message-id:reply-to; + bh=GmPK75Q9ZD3h3IYflWYuDwS99V2e532KgDlnNucAoJg=; + b=PSdrywW48P4Lq8z9wOSPXFB/ZdO/JfuyiGlw3Gz1Iriy+Smo/cBnJ0Ve9zKkX3AKTO + Tr7/g8xhSQX8sU5WAOEPC13uVjKpO4VZsamXHTmMKL4mmfII3K/piAsQcMQkkNpgouab + Ci9yr+7ASSmqEUHIbYTM6sl6a47rPwqk3b3DcTIE2CwJsPPNXnpQ/aSVbJAcEdhcZICc + X4rAmjrYjcsl8coFIGHHPlrMH9ShekQWxB84vEb6bO1nXOORNPizOHuY1vJ3wa3WgXsx + YwlvutMFVIUXfgL2ZwCmQAKWJPiAaFk+CCk3oxSeOYoAzkjcbMyapz9VnooStfvR2aV3 + k+2g== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20210112; t=1679263689; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc + :subject:date:message-id:reply-to; + bh=GmPK75Q9ZD3h3IYflWYuDwS99V2e532KgDlnNucAoJg=; + b=NGjqrGERyaxRwINtevHaY97h9X9W+1UY62YYwotqwv5+cfvB8myjBbD3WH2WzaqMes + o9MMER9RE8/arW3jIVlBv4ORDUuEZ7AeGgy5UbFyQZIPHlp+hJ/sxFrGvYUwamg4Qrr9 + ojargh8ORsEiMeqaf+5AkmEagNhrrV3ax0pUuWDzbJ3vXGoHjfCetHz5xyNL46dvXBfb + l/OZqjv9IYob552uUoUmCy/TbEQDqvmjkFrROFK9gtBNxgxUJkwbyiWIOVsf6RR8OarP + f7bbvSJYkvTvzx2u/g0Up7NW5ZyihMGBmDs377M3yW6AnSxW6jlfl30QmMU1aEigYXvy + v3mA== +X-Gm-Message-State: AO0yUKUm1PYmYa4xlHuVD23mZcZm83a+xbhcbs0Xryi3yF/+UnjM4Cho + GAfqSh5MZ/rlOAm3Vnpn//9hOG5Lc8vLYg== +X-Google-Smtp-Source: + AK7set+5pTahGGgk1hF/mHGkGBhsMf0//oQjZd4QFHx+HaeSgP5f6q7g0bRUcTX8kRtgHH0T7l1/hQ== +X-Received: by 2002:a5d:474f:0:b0:2d6:2ae8:70d with SMTP id + o15-20020a5d474f000000b002d62ae8070dmr2382593wrs.39.1679263688549; + Sun, 19 Mar 2023 15:08:08 -0700 (PDT) +Received: from atlantis.lan (255.red-79-146-124.dynamicip.rima-tde.net. + [79.146.124.255]) + by smtp.gmail.com with ESMTPSA id + d6-20020a5d6dc6000000b002c53f6c7599sm7354727wrz.29.2023.03.19.15.08.07 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Sun, 19 Mar 2023 15:08:07 -0700 (PDT) +From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +To: f.fainelli@gmail.com, jonas.gorski@gmail.com, andrew@lunn.ch, + olteanv@gmail.com, davem@davemloft.net, edumazet@google.com, + kuba@kernel.org, pabeni@redhat.com, netdev@vger.kernel.org, + linux-kernel@vger.kernel.org +Cc: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +Subject: [PATCH v2] net: dsa: b53: add support for BCM63xx RGMIIs +Date: Sun, 19 Mar 2023 23:08:05 +0100 +Message-Id: <20230319220805.124024-1-noltari@gmail.com> +X-Mailer: git-send-email 2.30.2 +In-Reply-To: <20230319183330.761251-1-noltari@gmail.com> +References: <20230319183330.761251-1-noltari@gmail.com> +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: netdev@vger.kernel.org +X-Patchwork-Delegate: kuba@kernel.org + +BCM63xx RGMII ports require additional configuration in order to work. + +Signed-off-by: Álvaro Fernández Rojas +Reviewed-by: Andrew Lunn +--- + v2: add changes suggested by Andrew: + - Use a switch statement. + - Use dev_dbg() instead of dev_info(). + + drivers/net/dsa/b53/b53_common.c | 46 ++++++++++++++++++++++++++++++++ + drivers/net/dsa/b53/b53_priv.h | 1 + + 2 files changed, 47 insertions(+) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -1209,6 +1209,46 @@ static void b53_force_port_config(struct + b53_write8(dev, B53_CTRL_PAGE, off, reg); + } + ++static void b53_adjust_63xx_rgmii(struct dsa_switch *ds, int port, ++ phy_interface_t interface) ++{ ++ struct b53_device *dev = ds->priv; ++ u8 rgmii_ctrl = 0, off; ++ ++ if (port == dev->imp_port) ++ off = B53_RGMII_CTRL_IMP; ++ else ++ off = B53_RGMII_CTRL_P(port); ++ ++ b53_read8(dev, B53_CTRL_PAGE, off, &rgmii_ctrl); ++ ++ switch (interface) { ++ case PHY_INTERFACE_MODE_RGMII_ID: ++ rgmii_ctrl |= (RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC); ++ break; ++ case PHY_INTERFACE_MODE_RGMII_RXID: ++ rgmii_ctrl &= ~(RGMII_CTRL_DLL_TXC); ++ rgmii_ctrl |= RGMII_CTRL_DLL_RXC; ++ break; ++ case PHY_INTERFACE_MODE_RGMII_TXID: ++ rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC); ++ rgmii_ctrl |= RGMII_CTRL_DLL_TXC; ++ break; ++ case PHY_INTERFACE_MODE_RGMII: ++ default: ++ rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC); ++ break; ++ } ++ ++ if (port != dev->imp_port) ++ rgmii_ctrl |= RGMII_CTRL_ENABLE_GMII; ++ ++ b53_write8(dev, B53_CTRL_PAGE, off, rgmii_ctrl); ++ ++ dev_dbg(ds->dev, "Configured port %d for %s\n", port, ++ phy_modes(interface)); ++} ++ + static void b53_adjust_link(struct dsa_switch *ds, int port, + struct phy_device *phydev) + { +@@ -1235,6 +1275,9 @@ static void b53_adjust_link(struct dsa_s + tx_pause, rx_pause); + b53_force_link(dev, port, phydev->link); + ++ if (is63xx(dev) && port >= B53_63XX_RGMII0) ++ b53_adjust_63xx_rgmii(ds, port, phydev->interface); ++ + if (is531x5(dev) && phy_interface_is_rgmii(phydev)) { + if (port == dev->imp_port) + off = B53_RGMII_CTRL_IMP; +@@ -1419,6 +1462,9 @@ void b53_phylink_mac_link_up(struct dsa_ + { + struct b53_device *dev = ds->priv; + ++ if (is63xx(dev) && port >= B53_63XX_RGMII0) ++ b53_adjust_63xx_rgmii(ds, port, interface); ++ + if (mode == MLO_AN_PHY) + return; + +--- a/drivers/net/dsa/b53/b53_priv.h ++++ b/drivers/net/dsa/b53/b53_priv.h +@@ -206,6 +206,7 @@ static inline int is58xx(struct b53_devi + dev->chip_id == BCM7278_DEVICE_ID; + } + ++#define B53_63XX_RGMII0 4 + #define B53_CPU_PORT_25 5 + #define B53_CPU_PORT 8 + diff --git a/target/linux/generic/pending-5.15/773-net-dsa-b53-mmap-add-more-63xx-SoCs.patch b/target/linux/generic/pending-5.15/773-net-dsa-b53-mmap-add-more-63xx-SoCs.patch new file mode 100644 index 0000000000..e2da4e7f05 --- /dev/null +++ b/target/linux/generic/pending-5.15/773-net-dsa-b53-mmap-add-more-63xx-SoCs.patch @@ -0,0 +1,108 @@ +From patchwork Tue Mar 21 17:33:57 2023 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= + +X-Patchwork-Id: 13183003 +X-Patchwork-Delegate: kuba@kernel.org +Return-Path: +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) + by smtp.lore.kernel.org (Postfix) with ESMTP id 823A1C761AF + for ; Tue, 21 Mar 2023 17:35:06 +0000 (UTC) +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S230490AbjCURfE (ORCPT ); + Tue, 21 Mar 2023 13:35:04 -0400 +Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47440 "EHLO + lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org + with ESMTP id S230357AbjCURex (ORCPT + ); Tue, 21 Mar 2023 13:34:53 -0400 +Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com + [IPv6:2a00:1450:4864:20::430]) + by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C9A45559D8; + Tue, 21 Mar 2023 10:34:26 -0700 (PDT) +Received: by mail-wr1-x430.google.com with SMTP id m2so14547588wrh.6; + Tue, 21 Mar 2023 10:34:26 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20210112; t=1679420063; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:from:to:cc:subject:date + :message-id:reply-to; + bh=cUvnluVaZPzfEQB9fMRuYo+4/361t/7po7nyUBBJfxc=; + b=F0pa8JmQZ1FeXVtdpCygur8UmLrgKwxCcjaMn312u5zNvsXsEPeCAIDqP2tvNNTwv/ + UYjaNaoZ77HSvv/gSqeG808AXGyNs1PvLuHZYuUTJRNuLaMixKtkNFi4ypheCdk0WCiE + IWz0DIm6ojmdwMqafDUKQ6Qwkv5R0vo8Wh5vpjimEmCelOyMvfuLZNqubsiGqpnCguBp + uWlmKh95/VubCGgiGG2xK1IXQayL14ENuWseDds7nVpVK50NycrFgJbL17Bd6qJKYkbo + m70IC+9jM0hjwKXpyi6ipCBNcW+1E6JIwILVC04Xi+BTpOGhbUAQ59Yn2hyq7tQM7dzs + 4PLg== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20210112; t=1679420063; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc + :subject:date:message-id:reply-to; + bh=cUvnluVaZPzfEQB9fMRuYo+4/361t/7po7nyUBBJfxc=; + b=SCX78yTuGjdnE5nuL0p7+kxGnOzsCExsigLdaV+x/JswmwxSpZvxn223i1yM95klj9 + Rk0RnXqATLF1wZA7L1YmbeZ66zxUwW/osnCjJHPeEF8AGgjK/qawtLl/HJQHN67NaRNQ + bDsRn2nWQ2GRTRFpvD+iGRy4uyQCDu9HFxLbn43fBsBmRnXWGPQP5cEb90tL83/Onp4D + Lx/XcyZOh9QRfJNhj+G1BAeRCLRA/sdA0W3Ecu5SCFs+LtS6uvLVGWDKEDfnZhYY8Xqf + Mx9evWzdW2OorEN2FI6+xTglvnEBcVhHIJ7XEGAhCG6ocgMZeck++774S8RWumWl8xpy + /K9Q== +X-Gm-Message-State: AO0yUKUORAlGfbkNwnYmQnTWcGPqW6sp4g9WfgQmRZGCV+9tCB0OebSP + ICq6v4YPmUPNRl/WNnVCbps= +X-Google-Smtp-Source: + AK7set8pFDl8fHRwGPhAguqxIfqnQ4PY+b57IHEsybIaQ/HPNwdJ1cs1+IPBGHe3TL14dTS4aVNpHA== +X-Received: by 2002:a5d:6991:0:b0:2ce:aab5:f96b with SMTP id + g17-20020a5d6991000000b002ceaab5f96bmr2965175wru.67.1679420062764; + Tue, 21 Mar 2023 10:34:22 -0700 (PDT) +Received: from atlantis.lan (255.red-79-146-124.dynamicip.rima-tde.net. + [79.146.124.255]) + by smtp.gmail.com with ESMTPSA id + b13-20020a056000054d00b002da1261aa44sm184775wrf.48.2023.03.21.10.34.21 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Tue, 21 Mar 2023 10:34:21 -0700 (PDT) +From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +To: f.fainelli@gmail.com, jonas.gorski@gmail.com, andrew@lunn.ch, + olteanv@gmail.com, davem@davemloft.net, edumazet@google.com, + kuba@kernel.org, pabeni@redhat.com, robh+dt@kernel.org, + krzysztof.kozlowski+dt@linaro.org, netdev@vger.kernel.org, + devicetree@vger.kernel.org, linux-kernel@vger.kernel.org +Cc: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +Subject: [PATCH v2 2/4] net: dsa: b53: mmap: add more 63xx SoCs +Date: Tue, 21 Mar 2023 18:33:57 +0100 +Message-Id: <20230321173359.251778-3-noltari@gmail.com> +X-Mailer: git-send-email 2.30.2 +In-Reply-To: <20230321173359.251778-1-noltari@gmail.com> +References: <20230320155024.164523-1-noltari@gmail.com> + <20230321173359.251778-1-noltari@gmail.com> +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: netdev@vger.kernel.org +X-Patchwork-Delegate: kuba@kernel.org + +BCM6318, BCM6362 and BCM63268 are SoCs with a B53 MMAP switch. + +Signed-off-by: Álvaro Fernández Rojas +Reviewed-by: Florian Fainelli +--- + v2: no changes. + + drivers/net/dsa/b53/b53_mmap.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/net/dsa/b53/b53_mmap.c ++++ b/drivers/net/dsa/b53/b53_mmap.c +@@ -347,8 +347,11 @@ static void b53_mmap_shutdown(struct pla + + static const struct of_device_id b53_mmap_of_table[] = { + { .compatible = "brcm,bcm3384-switch" }, ++ { .compatible = "brcm,bcm6318-switch" }, + { .compatible = "brcm,bcm6328-switch" }, ++ { .compatible = "brcm,bcm6362-switch" }, + { .compatible = "brcm,bcm6368-switch" }, ++ { .compatible = "brcm,bcm63268-switch" }, + { .compatible = "brcm,bcm63xx-switch" }, + { /* sentinel */ }, + }; diff --git a/target/linux/generic/pending-5.15/774-net-dsa-b53-mmap-allow-passing-a-chip-ID.patch b/target/linux/generic/pending-5.15/774-net-dsa-b53-mmap-allow-passing-a-chip-ID.patch new file mode 100644 index 0000000000..456643f05d --- /dev/null +++ b/target/linux/generic/pending-5.15/774-net-dsa-b53-mmap-allow-passing-a-chip-ID.patch @@ -0,0 +1,195 @@ +From patchwork Tue Mar 21 17:33:58 2023 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= + +X-Patchwork-Id: 13183004 +X-Patchwork-Delegate: kuba@kernel.org +Return-Path: +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) + by smtp.lore.kernel.org (Postfix) with ESMTP id B2B12C74A5B + for ; Tue, 21 Mar 2023 17:35:12 +0000 (UTC) +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S230297AbjCURfK (ORCPT ); + Tue, 21 Mar 2023 13:35:10 -0400 +Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47438 "EHLO + lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org + with ESMTP id S230374AbjCURex (ORCPT + ); Tue, 21 Mar 2023 13:34:53 -0400 +Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com + [IPv6:2a00:1450:4864:20::432]) + by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C906B5550A; + Tue, 21 Mar 2023 10:34:26 -0700 (PDT) +Received: by mail-wr1-x432.google.com with SMTP id y14so14546846wrq.4; + Tue, 21 Mar 2023 10:34:26 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20210112; t=1679420064; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:from:to:cc:subject:date + :message-id:reply-to; + bh=vnvnwWc5Tmg09HBQo/m9RbRM6yM8KLx8r1VA+Abfg3k=; + b=eFv+mwe94Y2YZMiJP5gydXVrGlbIAR5HCrY0rdcoGoMPzQUHLFckZeYCgEKudI55I7 + gMLZYCtLwvDXvKeHM2AUigsq2YuJSeF5QwICPrhTnMwUGBg4yyyltrc3+J0lSd6/4kQv + h0yM1Oo4v0d8CuqjBU6bXienIk34AFVJfsPq+vWQTjAbUL7ht4WHZ2Ez2MFoTvZpkIJA + 5iWMyVoMbugZl6eqNRjvDHFmtBtrZIv8AFs10r2Ca6+Yxm+aq0v33DRkbSVVqgFPNEzy + q5QOXOeLBPL6BvyovOpmVSWGoHf1zFV7lrzcqi+uc+FuYxQ9dyN3ND73DrrhWSkLaSg9 + r8yA== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20210112; t=1679420064; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc + :subject:date:message-id:reply-to; + bh=vnvnwWc5Tmg09HBQo/m9RbRM6yM8KLx8r1VA+Abfg3k=; + b=jIRB8pIlrLA/ovhnEoePs/6SX8fn6l7l4fY2CxX2pLrTbP1JI8AAetPavvrNVQTr2M + Vm0iLbKyL/VpTq9+bSN1SMjaoi4lAMj0pgafoHrwABMVZpFauYvtCfSYTstZ2pw4Dr1j + wYQGj3BUSpFIYHtSIDMkb5449WA3T3TONhaQLRFAUCBD6gAFyEky5fY+DIHrGaj352B6 + 9ST/tkqHgPpuFlmromr42KQWoTFU+Pj0Uhyp7ru4BsnF7tTshWroZZIHUJmSACudEadr + fBPiuurX9jgp9zNqj8Oy0HjiVUnULFCapj8yICGp5s44uDAK/XFqFXpOuJ8ptS6uPazU + xUwg== +X-Gm-Message-State: AO0yUKX2w6QZfaGDHtlZAlY/U8F8VuJa3HwlgXbxgGChgdgvIoFThawv + oDyFAhWbVfe4DxwXTwxgJ/I= +X-Google-Smtp-Source: + AK7set+sH60XiJYup7bqrZTzFJVNe1YGcX/UTfjWV9xfGwNyodc34cHvKpqNagw5J+vEpv6CKvNHaA== +X-Received: by 2002:adf:f344:0:b0:2cd:de25:1c76 with SMTP id + e4-20020adff344000000b002cdde251c76mr12989754wrp.17.1679420064464; + Tue, 21 Mar 2023 10:34:24 -0700 (PDT) +Received: from atlantis.lan (255.red-79-146-124.dynamicip.rima-tde.net. + [79.146.124.255]) + by smtp.gmail.com with ESMTPSA id + b13-20020a056000054d00b002da1261aa44sm184775wrf.48.2023.03.21.10.34.22 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Tue, 21 Mar 2023 10:34:23 -0700 (PDT) +From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +To: f.fainelli@gmail.com, jonas.gorski@gmail.com, andrew@lunn.ch, + olteanv@gmail.com, davem@davemloft.net, edumazet@google.com, + kuba@kernel.org, pabeni@redhat.com, robh+dt@kernel.org, + krzysztof.kozlowski+dt@linaro.org, netdev@vger.kernel.org, + devicetree@vger.kernel.org, linux-kernel@vger.kernel.org +Cc: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +Subject: [PATCH v2 3/4] net: dsa: b53: mmap: allow passing a chip ID +Date: Tue, 21 Mar 2023 18:33:58 +0100 +Message-Id: <20230321173359.251778-4-noltari@gmail.com> +X-Mailer: git-send-email 2.30.2 +In-Reply-To: <20230321173359.251778-1-noltari@gmail.com> +References: <20230320155024.164523-1-noltari@gmail.com> + <20230321173359.251778-1-noltari@gmail.com> +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: netdev@vger.kernel.org +X-Patchwork-Delegate: kuba@kernel.org + +BCM6318 and BCM63268 SoCs require a special handling for their RGMIIs, so we +should be able to identify them as a special BCM63xx switch. + +Signed-off-by: Álvaro Fernández Rojas +--- + v2: + - Add missing chip to b53_switch_chips[]. + - Fix device_get_match_data() casting warning. + - Add BCM63268_DEVICE_ID to BCM6318 too. + - Add BCM6318 in commit description. + + drivers/net/dsa/b53/b53_common.c | 13 +++++++++++++ + drivers/net/dsa/b53/b53_mmap.c | 32 +++++++++++++++++++++++--------- + drivers/net/dsa/b53/b53_priv.h | 9 ++++++++- + 3 files changed, 44 insertions(+), 10 deletions(-) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -2461,6 +2461,19 @@ static const struct b53_chip_data b53_sw + .jumbo_size_reg = B53_JUMBO_MAX_SIZE_63XX, + }, + { ++ .chip_id = BCM63268_DEVICE_ID, ++ .dev_name = "BCM63268", ++ .vlans = 4096, ++ .enabled_ports = 0, /* pdata must provide them */ ++ .arl_bins = 4, ++ .arl_buckets = 1024, ++ .imp_port = 8, ++ .vta_regs = B53_VTA_REGS_63XX, ++ .duplex_reg = B53_DUPLEX_STAT_63XX, ++ .jumbo_pm_reg = B53_JUMBO_PORT_MASK_63XX, ++ .jumbo_size_reg = B53_JUMBO_MAX_SIZE_63XX, ++ }, ++ { + .chip_id = BCM53010_DEVICE_ID, + .dev_name = "BCM53010", + .vlans = 4096, +--- a/drivers/net/dsa/b53/b53_mmap.c ++++ b/drivers/net/dsa/b53/b53_mmap.c +@@ -262,7 +262,7 @@ static int b53_mmap_probe_of(struct plat + return -ENOMEM; + + pdata->regs = mem; +- pdata->chip_id = BCM63XX_DEVICE_ID; ++ pdata->chip_id = (u32)(unsigned long)device_get_match_data(dev); + pdata->big_endian = of_property_read_bool(np, "big-endian"); + + of_ports = of_get_child_by_name(np, "ports"); +@@ -346,14 +346,28 @@ static void b53_mmap_shutdown(struct pla + } + + static const struct of_device_id b53_mmap_of_table[] = { +- { .compatible = "brcm,bcm3384-switch" }, +- { .compatible = "brcm,bcm6318-switch" }, +- { .compatible = "brcm,bcm6328-switch" }, +- { .compatible = "brcm,bcm6362-switch" }, +- { .compatible = "brcm,bcm6368-switch" }, +- { .compatible = "brcm,bcm63268-switch" }, +- { .compatible = "brcm,bcm63xx-switch" }, +- { /* sentinel */ }, ++ { ++ .compatible = "brcm,bcm3384-switch", ++ .data = (void *)BCM63XX_DEVICE_ID, ++ }, { ++ .compatible = "brcm,bcm6318-switch", ++ .data = (void *)BCM63268_DEVICE_ID, ++ }, { ++ .compatible = "brcm,bcm6328-switch", ++ .data = (void *)BCM63XX_DEVICE_ID, ++ }, { ++ .compatible = "brcm,bcm6362-switch", ++ .data = (void *)BCM63XX_DEVICE_ID, ++ }, { ++ .compatible = "brcm,bcm6368-switch", ++ .data = (void *)BCM63XX_DEVICE_ID, ++ }, { ++ .compatible = "brcm,bcm63268-switch", ++ .data = (void *)BCM63268_DEVICE_ID, ++ }, { ++ .compatible = "brcm,bcm63xx-switch", ++ .data = (void *)BCM63XX_DEVICE_ID, ++ }, { /* sentinel */ } + }; + MODULE_DEVICE_TABLE(of, b53_mmap_of_table); + +--- a/drivers/net/dsa/b53/b53_priv.h ++++ b/drivers/net/dsa/b53/b53_priv.h +@@ -75,6 +75,7 @@ enum { + BCM53125_DEVICE_ID = 0x53125, + BCM53128_DEVICE_ID = 0x53128, + BCM63XX_DEVICE_ID = 0x6300, ++ BCM63268_DEVICE_ID = 0x63268, + BCM53010_DEVICE_ID = 0x53010, + BCM53011_DEVICE_ID = 0x53011, + BCM53012_DEVICE_ID = 0x53012, +@@ -186,7 +187,13 @@ static inline int is531x5(struct b53_dev + + static inline int is63xx(struct b53_device *dev) + { +- return dev->chip_id == BCM63XX_DEVICE_ID; ++ return dev->chip_id == BCM63XX_DEVICE_ID || ++ dev->chip_id == BCM63268_DEVICE_ID; ++} ++ ++static inline int is63268(struct b53_device *dev) ++{ ++ return dev->chip_id == BCM63268_DEVICE_ID; + } + + static inline int is5301x(struct b53_device *dev) diff --git a/target/linux/generic/pending-5.15/775-net-dsa-b53-add-BCM63268-RGMII-configuration.patch b/target/linux/generic/pending-5.15/775-net-dsa-b53-add-BCM63268-RGMII-configuration.patch new file mode 100644 index 0000000000..d90d757fb2 --- /dev/null +++ b/target/linux/generic/pending-5.15/775-net-dsa-b53-add-BCM63268-RGMII-configuration.patch @@ -0,0 +1,123 @@ +From patchwork Tue Mar 21 17:33:59 2023 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= + +X-Patchwork-Id: 13183005 +X-Patchwork-Delegate: kuba@kernel.org +Return-Path: +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) + by smtp.lore.kernel.org (Postfix) with ESMTP id 31BE4C761A6 + for ; Tue, 21 Mar 2023 17:35:16 +0000 (UTC) +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S229674AbjCURfN (ORCPT ); + Tue, 21 Mar 2023 13:35:13 -0400 +Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47684 "EHLO + lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org + with ESMTP id S230327AbjCURfB (ORCPT + ); Tue, 21 Mar 2023 13:35:01 -0400 +Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com + [IPv6:2a00:1450:4864:20::436]) + by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E1D855507D; + Tue, 21 Mar 2023 10:34:27 -0700 (PDT) +Received: by mail-wr1-x436.google.com with SMTP id i9so14537769wrp.3; + Tue, 21 Mar 2023 10:34:27 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20210112; t=1679420066; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:from:to:cc:subject:date + :message-id:reply-to; + bh=asmFs22xWYwR1Ql9m/IrNv+MPUNDn8hSjmwDRYvO7mE=; + b=Cqj2C6aG5vEOlhh9N3ybvDA0CV38nhQODnfdnr7utNddd323iDagoJty1Wmi3MAzj1 + 5ORmYT5fQvUnild7C4RhcCNTBn+MoYZ+wDZwZYelu6BKHkW11YFK949ax5B50by+ASR2 + z+rGI3wR5fVXd4VDgmcsT6zF5x69wKyhbhqIfrhG9BVFTctfaBgDS/l+bX1C56kSqv82 + bQkKSSAehSLGpFoCU3q62OGoZVi3jDe6HDb5M1Dp2mgHhqsW19otZpJ57DjtZ1CmtPai + o7T/ew6WoIYSl6whBmV36jeNaDJ3TItOBrKc4nMJBDWaCg4DNzUSe0ei5Xz7Oik5lb3p + y9ew== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20210112; t=1679420066; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc + :subject:date:message-id:reply-to; + bh=asmFs22xWYwR1Ql9m/IrNv+MPUNDn8hSjmwDRYvO7mE=; + b=UdI2iQNBYwRf40ivf3ROR132t95BU/p3RUzXdZLCyz6c6JWtECQ5byyGeEwoX10n5u + HlepoNTJxMFLYrAHGvNLDPpWPuLXMa645S1mCVZ7NyWp8W96XzSynNZPeXHuJdb464QU + A7UTRSW3mlvKe9OR3EcB2CfBZv0yHWR0ldbnxcxGUFw8z78PNqpOVnITtjBdfpGesJ9c + VJw+fiM6hCcahor4nk9LLcAryPm8xmhDLxBKaLILO8wyTUiHY8G9hsXnFCtcpetnF5wS + pW13beAE+odb7ZZaXZUYpWGYhCe/hLzNjbo8YpgzHwadZthxPrT5YvNIYwyrvoViLM0n + KDRQ== +X-Gm-Message-State: AO0yUKW+9H/kqcAUyWeZhZJhiJjsBcYn1THmZaSDrPrk/pNuGXJXGtJd + NgsGZW8iSqLEv81yK+U5Os8= +X-Google-Smtp-Source: + AK7set/lzQZwCSxVaOe5dZ+7TR3xaQty/vg5xvZDpRW8TwTiPQblIbw5kJJTPLp67RySehrPIlCqSg== +X-Received: by 2002:a5d:65c9:0:b0:2ce:ac31:54ff with SMTP id + e9-20020a5d65c9000000b002ceac3154ffmr2776515wrw.2.1679420066191; + Tue, 21 Mar 2023 10:34:26 -0700 (PDT) +Received: from atlantis.lan (255.red-79-146-124.dynamicip.rima-tde.net. + [79.146.124.255]) + by smtp.gmail.com with ESMTPSA id + b13-20020a056000054d00b002da1261aa44sm184775wrf.48.2023.03.21.10.34.24 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Tue, 21 Mar 2023 10:34:25 -0700 (PDT) +From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +To: f.fainelli@gmail.com, jonas.gorski@gmail.com, andrew@lunn.ch, + olteanv@gmail.com, davem@davemloft.net, edumazet@google.com, + kuba@kernel.org, pabeni@redhat.com, robh+dt@kernel.org, + krzysztof.kozlowski+dt@linaro.org, netdev@vger.kernel.org, + devicetree@vger.kernel.org, linux-kernel@vger.kernel.org +Cc: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= , + Simon Horman +Subject: [PATCH v2 4/4] net: dsa: b53: add BCM63268 RGMII configuration +Date: Tue, 21 Mar 2023 18:33:59 +0100 +Message-Id: <20230321173359.251778-5-noltari@gmail.com> +X-Mailer: git-send-email 2.30.2 +In-Reply-To: <20230321173359.251778-1-noltari@gmail.com> +References: <20230320155024.164523-1-noltari@gmail.com> + <20230321173359.251778-1-noltari@gmail.com> +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: netdev@vger.kernel.org +X-Patchwork-Delegate: kuba@kernel.org + +BCM63268 requires special RGMII configuration to work. + +Signed-off-by: Álvaro Fernández Rojas +Reviewed-by: Florian Fainelli +Reviewed-by: Simon Horman +--- + v2: no changes. + + drivers/net/dsa/b53/b53_common.c | 6 +++++- + drivers/net/dsa/b53/b53_regs.h | 1 + + 2 files changed, 6 insertions(+), 1 deletion(-) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -1240,8 +1240,12 @@ static void b53_adjust_63xx_rgmii(struct + break; + } + +- if (port != dev->imp_port) ++ if (port != dev->imp_port) { ++ if (is63268(dev)) ++ rgmii_ctrl |= RGMII_CTRL_MII_OVERRIDE; ++ + rgmii_ctrl |= RGMII_CTRL_ENABLE_GMII; ++ } + + b53_write8(dev, B53_CTRL_PAGE, off, rgmii_ctrl); + +--- a/drivers/net/dsa/b53/b53_regs.h ++++ b/drivers/net/dsa/b53/b53_regs.h +@@ -138,6 +138,7 @@ + + #define B53_RGMII_CTRL_IMP 0x60 + #define RGMII_CTRL_ENABLE_GMII BIT(7) ++#define RGMII_CTRL_MII_OVERRIDE BIT(6) + #define RGMII_CTRL_TIMING_SEL BIT(2) + #define RGMII_CTRL_DLL_RXC BIT(1) + #define RGMII_CTRL_DLL_TXC BIT(0) diff --git a/target/linux/generic/pending-5.15/777-net-dsa-b53-mdio-add-support-for-BCM53134.patch b/target/linux/generic/pending-5.15/777-net-dsa-b53-mdio-add-support-for-BCM53134.patch new file mode 100644 index 0000000000..53494eca6e --- /dev/null +++ b/target/linux/generic/pending-5.15/777-net-dsa-b53-mdio-add-support-for-BCM53134.patch @@ -0,0 +1,189 @@ +From patchwork Fri Mar 24 08:41:38 2023 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= + +X-Patchwork-Id: 13186549 +X-Patchwork-Delegate: kuba@kernel.org +Return-Path: +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) + by smtp.lore.kernel.org (Postfix) with ESMTP id EF744C76195 + for ; Fri, 24 Mar 2023 08:42:01 +0000 (UTC) +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S231807AbjCXImA (ORCPT ); + Fri, 24 Mar 2023 04:42:00 -0400 +Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32956 "EHLO + lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org + with ESMTP id S231272AbjCXIly (ORCPT + ); Fri, 24 Mar 2023 04:41:54 -0400 +Received: from mail-ed1-x535.google.com (mail-ed1-x535.google.com + [IPv6:2a00:1450:4864:20::535]) + by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 113A517CF3; + Fri, 24 Mar 2023 01:41:46 -0700 (PDT) +Received: by mail-ed1-x535.google.com with SMTP id ek18so4877175edb.6; + Fri, 24 Mar 2023 01:41:45 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20210112; t=1679647304; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:from:to:cc:subject:date + :message-id:reply-to; + bh=OfUWRaFIQIQw/lRivER+LHryfdLliXzvabGrcmkQVEU=; + b=JMrl6Eay1FS0JZqgPHsbcVzuNAbFELc0SLNGyzYtOVQXcI+YwKDM9Ls7I9PsQVEPoZ + CthomCTYoz5G9DU7uBuia207rnjOhssZJRu0syrCoU+O/ZiQyGLJDvq61z5oZJxC2S40 + kzRsUsC6MRjn64DKPWmxhsSTMKLzn2+P233LKNFbHtfi3NWF5Qu/85sUkxMurnfUgja0 + qQhl25qYY7ZIvmlFHYefaI5UkITQFuiybrqJW9tztCdHf/gS+f33YkkvQ8njmMQa1DW0 + ppedfOUotX+6kmHZGX1yea2V5ezEGGvRourZtYMoecTiD0E5d1J1bKhktKslVLIDm0ig + oc2g== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20210112; t=1679647304; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc + :subject:date:message-id:reply-to; + bh=OfUWRaFIQIQw/lRivER+LHryfdLliXzvabGrcmkQVEU=; + b=b3Gmga5ZDbnmQfnw1GCz+eU2JwgsVzfciZuSmfYAiVxpW4c6cur3MHbpzDPhi99wzA + ZYAM7ryLv88rXl/tQB5g2Nte5rvMfxUeHXsT/JpsRcSSocFRbRrk0QJyiA/Xj86NiD5N + C1sKz50Im190FmrvPcBh6OHQbv/3MQyE+1fQx+9q3jW5rQiAWQaYk4Ng8GlWA7gtG3jB + fHO6Fuoenn32pgkveJbQLYL/2t2f53wGf3QLQ3IeKW7jdfIHNThwrwqBMxdHoIDaTBT9 + UWMeJuiYtylIibo/3zbORbWOgIERlWxZRf3BCOFpnzUn4eBzio4LgjtNxZ77ITRxsmbk + 3+Hg== +X-Gm-Message-State: AAQBX9dfyBfbR7Sdd5wqxMiAv3Yhk47pK1XzD87MZyAF3AxyoFyKcMaF + EbwJLyRvTGQEFdVWCGw1eMU= +X-Google-Smtp-Source: + AKy350bpDVLq7k1FxG2Mek/VIobZL4KhufiKx8qfmpxpcWmLI3bLg8wfQKEAKJRNJBleo/7CZuCL5g== +X-Received: by 2002:aa7:c711:0:b0:4a2:588f:b3c5 with SMTP id + i17-20020aa7c711000000b004a2588fb3c5mr2261236edq.21.1679647304260; + Fri, 24 Mar 2023 01:41:44 -0700 (PDT) +Received: from atlantis.lan (255.red-79-146-124.dynamicip.rima-tde.net. + [79.146.124.255]) + by smtp.gmail.com with ESMTPSA id + z21-20020a50cd15000000b004acbda55f6bsm10323728edi.27.2023.03.24.01.41.43 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Fri, 24 Mar 2023 01:41:43 -0700 (PDT) +From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +To: paul.geurts@prodrive-technologies.com, f.fainelli@gmail.com, + jonas.gorski@gmail.com, andrew@lunn.ch, olteanv@gmail.com, + davem@davemloft.net, edumazet@google.com, kuba@kernel.org, + pabeni@redhat.com, robh+dt@kernel.org, + krzysztof.kozlowski+dt@linaro.org, netdev@vger.kernel.org, + devicetree@vger.kernel.org, linux-kernel@vger.kernel.org +Cc: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +Subject: [PATCH v2 2/2] net: dsa: b53: mdio: add support for BCM53134 +Date: Fri, 24 Mar 2023 09:41:38 +0100 +Message-Id: <20230324084138.664285-3-noltari@gmail.com> +X-Mailer: git-send-email 2.30.2 +In-Reply-To: <20230324084138.664285-1-noltari@gmail.com> +References: <20230323121804.2249605-1-noltari@gmail.com> + <20230324084138.664285-1-noltari@gmail.com> +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: netdev@vger.kernel.org +X-Patchwork-Delegate: kuba@kernel.org + +From: Paul Geurts + +Add support for the BCM53134 Ethernet switch in the existing b53 dsa driver. +BCM53134 is very similar to the BCM58XX series. + +Signed-off-by: Paul Geurts +Signed-off-by: Álvaro Fernández Rojas +--- + v2: add BCM53134 to is531x5() and remove special RGMII config + + drivers/net/dsa/b53/b53_common.c | 15 +++++++++++++++ + drivers/net/dsa/b53/b53_mdio.c | 5 ++++- + drivers/net/dsa/b53/b53_priv.h | 7 +++++-- + 3 files changed, 24 insertions(+), 3 deletions(-) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -2609,6 +2609,20 @@ static const struct b53_chip_data b53_sw + .jumbo_pm_reg = B53_JUMBO_PORT_MASK, + .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + }, ++ { ++ .chip_id = BCM53134_DEVICE_ID, ++ .dev_name = "BCM53134", ++ .vlans = 4096, ++ .enabled_ports = 0x12f, ++ .imp_port = 8, ++ .cpu_port = B53_CPU_PORT, ++ .vta_regs = B53_VTA_REGS, ++ .arl_bins = 4, ++ .arl_buckets = 1024, ++ .duplex_reg = B53_DUPLEX_STAT_GE, ++ .jumbo_pm_reg = B53_JUMBO_PORT_MASK, ++ .jumbo_size_reg = B53_JUMBO_MAX_SIZE, ++ }, + }; + + static int b53_switch_init(struct b53_device *dev) +@@ -2785,6 +2799,7 @@ int b53_switch_detect(struct b53_device + case BCM53012_DEVICE_ID: + case BCM53018_DEVICE_ID: + case BCM53019_DEVICE_ID: ++ case BCM53134_DEVICE_ID: + dev->chip_id = id32; + break; + default: +--- a/drivers/net/dsa/b53/b53_mdio.c ++++ b/drivers/net/dsa/b53/b53_mdio.c +@@ -286,6 +286,7 @@ static const struct b53_io_ops b53_mdio_ + #define B53_BRCM_OUI_2 0x03625c00 + #define B53_BRCM_OUI_3 0x00406000 + #define B53_BRCM_OUI_4 0x01410c00 ++#define B53_BRCM_OUI_5 0xae025000 + + static int b53_mdio_probe(struct mdio_device *mdiodev) + { +@@ -313,7 +314,8 @@ static int b53_mdio_probe(struct mdio_de + if ((phy_id & 0xfffffc00) != B53_BRCM_OUI_1 && + (phy_id & 0xfffffc00) != B53_BRCM_OUI_2 && + (phy_id & 0xfffffc00) != B53_BRCM_OUI_3 && +- (phy_id & 0xfffffc00) != B53_BRCM_OUI_4) { ++ (phy_id & 0xfffffc00) != B53_BRCM_OUI_4 && ++ (phy_id & 0xfffffc00) != B53_BRCM_OUI_5) { + dev_err(&mdiodev->dev, "Unsupported device: 0x%08x\n", phy_id); + return -ENODEV; + } +@@ -377,6 +379,7 @@ static const struct of_device_id b53_of_ + { .compatible = "brcm,bcm53115" }, + { .compatible = "brcm,bcm53125" }, + { .compatible = "brcm,bcm53128" }, ++ { .compatible = "brcm,bcm53134" }, + { .compatible = "brcm,bcm5365" }, + { .compatible = "brcm,bcm5389" }, + { .compatible = "brcm,bcm5395" }, +--- a/drivers/net/dsa/b53/b53_priv.h ++++ b/drivers/net/dsa/b53/b53_priv.h +@@ -85,6 +85,7 @@ enum { + BCM583XX_DEVICE_ID = 0x58300, + BCM7445_DEVICE_ID = 0x7445, + BCM7278_DEVICE_ID = 0x7278, ++ BCM53134_DEVICE_ID = 0x5075, + }; + + #define B53_N_PORTS 9 +@@ -182,7 +183,8 @@ static inline int is531x5(struct b53_dev + { + return dev->chip_id == BCM53115_DEVICE_ID || + dev->chip_id == BCM53125_DEVICE_ID || +- dev->chip_id == BCM53128_DEVICE_ID; ++ dev->chip_id == BCM53128_DEVICE_ID || ++ dev->chip_id == BCM53134_DEVICE_ID; + } + + static inline int is63xx(struct b53_device *dev) +@@ -210,7 +212,8 @@ static inline int is58xx(struct b53_devi + return dev->chip_id == BCM58XX_DEVICE_ID || + dev->chip_id == BCM583XX_DEVICE_ID || + dev->chip_id == BCM7445_DEVICE_ID || +- dev->chip_id == BCM7278_DEVICE_ID; ++ dev->chip_id == BCM7278_DEVICE_ID || ++ dev->chip_id == BCM53134_DEVICE_ID; + } + + #define B53_63XX_RGMII0 4 diff --git a/target/linux/generic/pending-5.15/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch b/target/linux/generic/pending-5.15/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch new file mode 100644 index 0000000000..39ba71606e --- /dev/null +++ b/target/linux/generic/pending-5.15/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch @@ -0,0 +1,61 @@ +From patchwork Thu Aug 5 22:23:30 2021 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Daniel Golle +X-Patchwork-Id: 12422209 +Date: Thu, 5 Aug 2021 23:23:30 +0100 +From: Daniel Golle +To: linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org, + linux-kernel@vger.kernel.org +Cc: "David S. Miller" , Andrew Lunn , + Michael Walle +Subject: [PATCH] ARM: kirkwood: add missing for ETH_ALEN +Message-ID: +MIME-Version: 1.0 +Content-Disposition: inline +X-BeenThere: linux-arm-kernel@lists.infradead.org +X-Mailman-Version: 2.1.34 +Precedence: list +List-Id: +List-Archive: +Sender: "linux-arm-kernel" + +After commit 83216e3988cd1 ("of: net: pass the dst buffer to +of_get_mac_address()") build fails for kirkwood as ETH_ALEN is not +defined. + +arch/arm/mach-mvebu/kirkwood.c: In function 'kirkwood_dt_eth_fixup': +arch/arm/mach-mvebu/kirkwood.c:87:13: error: 'ETH_ALEN' undeclared (first use in this function); did you mean 'ESTALE'? + u8 tmpmac[ETH_ALEN]; + ^~~~~~~~ + ESTALE +arch/arm/mach-mvebu/kirkwood.c:87:13: note: each undeclared identifier is reported only once for each function it appears in +arch/arm/mach-mvebu/kirkwood.c:87:6: warning: unused variable 'tmpmac' [-Wunused-variable] + u8 tmpmac[ETH_ALEN]; + ^~~~~~ +make[5]: *** [scripts/Makefile.build:262: arch/arm/mach-mvebu/kirkwood.o] Error 1 +make[5]: *** Waiting for unfinished jobs.... + +Add missing #include to fix this. + +Cc: David S. Miller +Cc: Andrew Lunn +Cc: Michael Walle +Reported-by: https://buildbot.openwrt.org/master/images/#/builders/56/builds/220/steps/44/logs/stdio +Fixes: 83216e3988cd1 ("of: net: pass the dst buffer to of_get_mac_address()") +Signed-off-by: Daniel Golle +--- + arch/arm/mach-mvebu/kirkwood.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/arch/arm/mach-mvebu/kirkwood.c ++++ b/arch/arm/mach-mvebu/kirkwood.c +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + #include + #include + #include diff --git a/target/linux/generic/pending-5.15/790-bus-mhi-core-add-SBL-state-callback.patch b/target/linux/generic/pending-5.15/790-bus-mhi-core-add-SBL-state-callback.patch new file mode 100644 index 0000000000..2f728fefd7 --- /dev/null +++ b/target/linux/generic/pending-5.15/790-bus-mhi-core-add-SBL-state-callback.patch @@ -0,0 +1,48 @@ +From 5f7c5e1c0d7a79be144e5efc1f24728ddd7fc25c Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Sat, 5 Nov 2022 20:02:56 +0100 +Subject: [PATCH 1/2] bus: mhi: core: add SBL state callback + +Add support for SBL state callback in MHI core. + +It is required for ath11k MHI devices in order to be able to set QRTR +instance ID in the SBL state so that QRTR instance ID-s dont conflict in +case of multiple PCI/MHI cards or AHB + PCI/MHI card. +Setting QRTR instance ID is only possible in SBL state and there is +currently no way to ensure that we are in that state, so provide a +callback that the controller can trigger off. + +Signed-off-by: Robert Marko +--- + drivers/bus/mhi/host/main.c | 1 + + include/linux/mhi.h | 2 ++ + 2 files changed, 3 insertions(+) + +--- a/drivers/bus/mhi/host/main.c ++++ b/drivers/bus/mhi/host/main.c +@@ -891,6 +891,7 @@ int mhi_process_ctrl_ev_ring(struct mhi_ + switch (event) { + case MHI_EE_SBL: + st = DEV_ST_TRANSITION_SBL; ++ mhi_cntrl->status_cb(mhi_cntrl, MHI_CB_EE_SBL_MODE); + break; + case MHI_EE_WFW: + case MHI_EE_AMSS: +--- a/include/linux/mhi.h ++++ b/include/linux/mhi.h +@@ -34,6 +34,7 @@ struct mhi_buf_info; + * @MHI_CB_SYS_ERROR: MHI device entered error state (may recover) + * @MHI_CB_FATAL_ERROR: MHI device entered fatal error state + * @MHI_CB_BW_REQ: Received a bandwidth switch request from device ++ * @MHI_CB_EE_SBL_MODE: MHI device entered SBL mode + */ + enum mhi_callback { + MHI_CB_IDLE, +@@ -45,6 +46,7 @@ enum mhi_callback { + MHI_CB_SYS_ERROR, + MHI_CB_FATAL_ERROR, + MHI_CB_BW_REQ, ++ MHI_CB_EE_SBL_MODE, + }; + + /** diff --git a/target/linux/generic/pending-5.15/795-mt7530-register-OF-node-for-internal-MDIO-bus.patch b/target/linux/generic/pending-5.15/795-mt7530-register-OF-node-for-internal-MDIO-bus.patch new file mode 100644 index 0000000000..98fd6e9c7a --- /dev/null +++ b/target/linux/generic/pending-5.15/795-mt7530-register-OF-node-for-internal-MDIO-bus.patch @@ -0,0 +1,43 @@ +From 1d81e51d6d79d9098013b2e8cdd677bae998c5d8 Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Fri, 28 Apr 2023 02:22:59 +0200 +Subject: [PATCH 1/2] mt7530: register OF node for internal MDIO bus + +The MT753x switches provide a switch-internal MDIO bus for the embedded +PHYs. + +Register a OF sub-node on the switch OF-node for this internal MDIO bus. +This allows to configure the embedded PHYs using device-tree. + +Signed-off-by: David Bauer +--- + drivers/net/dsa/mt7530.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2129,10 +2129,13 @@ mt7530_setup_mdio(struct mt7530_priv *pr + { + struct dsa_switch *ds = priv->ds; + struct device *dev = priv->dev; ++ struct device_node *np, *mnp; + struct mii_bus *bus; + static int idx; + int ret; + ++ np = priv->dev->of_node; ++ + bus = devm_mdiobus_alloc(dev); + if (!bus) + return -ENOMEM; +@@ -2149,7 +2152,9 @@ mt7530_setup_mdio(struct mt7530_priv *pr + if (priv->irq) + mt7530_setup_mdio_irq(priv); + +- ret = devm_mdiobus_register(dev, bus); ++ mnp = of_get_child_by_name(np, "mdio"); ++ ret = devm_of_mdiobus_register(dev, bus, mnp); ++ of_node_put(mnp); + if (ret) { + dev_err(dev, "failed to register MDIO bus: %d\n", ret); + if (priv->irq) diff --git a/target/linux/generic/pending-5.15/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch b/target/linux/generic/pending-5.15/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch new file mode 100644 index 0000000000..478a2cb27d --- /dev/null +++ b/target/linux/generic/pending-5.15/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch @@ -0,0 +1,73 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Subject: [PATCH] bcma: get SoC device struct & copy its DMA params to the + subdevices +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +For bus devices to be fully usable it's required to set their DMA +parameters. + +For years it has been missing and remained unnoticed because of +mips_dma_alloc_coherent() silently handling the empty coherent_dma_mask. +Kernel 4.19 came with a lot of DMA changes and caused a regression on +the bcm47xx. Starting with the commit f8c55dc6e828 ("MIPS: use generic +dma noncoherent ops for simple noncoherent platforms") DMA coherent +allocations just fail. Example: +[ 1.114914] bgmac_bcma bcma0:2: Allocation of TX ring 0x200 failed +[ 1.121215] bgmac_bcma bcma0:2: Unable to alloc memory for DMA +[ 1.127626] bgmac_bcma: probe of bcma0:2 failed with error -12 +[ 1.133838] bgmac_bcma: Broadcom 47xx GBit MAC driver loaded + +This change fixes above regression in addition to the MIPS bcm47xx +commit 321c46b91550 ("MIPS: BCM47XX: Setup struct device for the SoC"). + +It also fixes another *old* GPIO regression caused by a parent pointing +to the NULL: +[ 0.157054] missing gpiochip .dev parent pointer +[ 0.157287] bcma: bus0: Error registering GPIO driver: -22 +introduced by the commit 74f4e0cc6108 ("bcma: switch GPIO portions to +use GPIOLIB_IRQCHIP"). + +Fixes: f8c55dc6e828 ("MIPS: use generic dma noncoherent ops for simple noncoherent platforms") +Fixes: 74f4e0cc6108 ("bcma: switch GPIO portions to use GPIOLIB_IRQCHIP") +Cc: linux-mips@linux-mips.org +Cc: Christoph Hellwig +Cc: Linus Walleij +Signed-off-by: Rafał Miłecki +--- + +--- a/drivers/bcma/host_soc.c ++++ b/drivers/bcma/host_soc.c +@@ -191,6 +191,8 @@ int __init bcma_host_soc_init(struct bcm + struct bcma_bus *bus = &soc->bus; + int err; + ++ bus->dev = soc->dev; ++ + /* Scan bus and initialize it */ + err = bcma_bus_early_register(bus); + if (err) +--- a/drivers/bcma/main.c ++++ b/drivers/bcma/main.c +@@ -236,13 +236,17 @@ EXPORT_SYMBOL(bcma_core_irq); + + void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core) + { +- device_initialize(&core->dev); ++ struct device *dev = &core->dev; ++ ++ device_initialize(dev); + core->dev.release = bcma_release_core_dev; + core->dev.bus = &bcma_bus_type; +- dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index); ++ dev_set_name(dev, "bcma%d:%d", bus->num, core->core_index); + core->dev.parent = bus->dev; +- if (bus->dev) ++ if (bus->dev) { + bcma_of_fill_device(bus->dev, core); ++ dma_coerce_mask_and_coherent(dev, bus->dev->coherent_dma_mask); ++ } + + switch (bus->hosttype) { + case BCMA_HOSTTYPE_PCI: diff --git a/target/linux/generic/pending-5.15/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch b/target/linux/generic/pending-5.15/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch new file mode 100644 index 0000000000..c1e14b9271 --- /dev/null +++ b/target/linux/generic/pending-5.15/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch @@ -0,0 +1,222 @@ +From fc23ea48ba52c24f201fe5ca0132ee1a3de5a70a Mon Sep 17 00:00:00 2001 +From: Mauri Sandberg +Date: Thu, 25 Mar 2021 11:48:05 +0200 +Subject: [PATCH 2/2] gpio: gpio-cascade: add generic GPIO cascade + +Adds support for building cascades of GPIO lines. That is, it allows +setups when there is one upstream line and multiple cascaded lines, out +of which one can be chosen at a time. The status of the upstream line +can be conveyed to the selected cascaded line or, vice versa, the status +of the cascaded line can be conveyed to the upstream line. + +A multiplexer is being used to select, which cascaded GPIO line is being +used at any given time. + +At the moment only input direction is supported. In future it should be +possible to add support for output direction, too. + +Signed-off-by: Mauri Sandberg +Reviewed-by: Linus Walleij +Reviewed-by: Andy Shevchenko +--- +v7 -> v8: + - rearrange members in struct gpio_cascade + - cosmetic changes in file header and in one function declaration + - added Reviewed-by tags by Linus and Andy +v6 -> v7: + - In Kconfig add info about module name + - adhere to new convention that allows lines longer than 80 chars + - use dev_probe_err with upstream gpio line too + - refactor for cleaner exit of probe function. +v5 -> v6: + - In Kconfig, remove dependency to OF_GPIO and select only MULTIPLEXER + - refactor code preferring one-liners + - clean up prints, removing them from success-path. + - don't explicitly set gpio_chip.of_node as it's done in the GPIO library + - use devm_gpiochip_add_data instead of gpiochip_add +v4 -> v5: + - renamed gpio-mux-input -> gpio-cascade. refactored code accordingly + here and there and changed to use new bindings and compatible string + - ambigious and vague 'pin' was rename to 'upstream_line' + - dropped Tested-by and Reviewed-by due to changes in bindings + - dropped Reported-by suggested by an automatic bot as it was not really + appropriate to begin with + - functionally it's the same as v4 +v3 -> v4: + - Changed author email + - Included Tested-by and Reviewed-by from Drew +v2 -> v3: + - use managed device resources + - update Kconfig description +v1 -> v2: + - removed .owner from platform_driver as per test bot's instruction + - added MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_LICENSE + - added gpio_mux_input_get_direction as it's recommended for all chips + - removed because this is input only chip: gpio_mux_input_set_value + - removed because they are not needed for input/output only chips: + gpio_mux_input_direction_input + gpio_mux_input_direction_output + - fixed typo in an error message + - added info message about successful registration + - removed can_sleep flag as this does not sleep while getting GPIO value + like I2C or SPI do + - Updated description in Kconfig +--- + drivers/gpio/Kconfig | 15 +++++ + drivers/gpio/Makefile | 1 + + drivers/gpio/gpio-cascade.c | 117 ++++++++++++++++++++++++++++++++++++ + 3 files changed, 133 insertions(+) + create mode 100644 drivers/gpio/gpio-cascade.c + +--- a/drivers/gpio/Kconfig ++++ b/drivers/gpio/Kconfig +@@ -1683,4 +1683,19 @@ config GPIO_VIRTIO + + endmenu + ++comment "Other GPIO expanders" ++ ++config GPIO_CASCADE ++ tristate "General GPIO cascade" ++ select MULTIPLEXER ++ help ++ Say yes here to enable support for generic GPIO cascade. ++ ++ This allows building one-to-many cascades of GPIO lines using ++ different types of multiplexers readily available. At the ++ moment only input lines are supported. ++ ++ To build the driver as a module choose 'm' and the resulting module ++ will be called 'gpio-cascade'. ++ + endif +--- a/drivers/gpio/Makefile ++++ b/drivers/gpio/Makefile +@@ -45,6 +45,7 @@ obj-$(CONFIG_GPIO_BD9571MWV) += gpio-bd + obj-$(CONFIG_GPIO_BRCMSTB) += gpio-brcmstb.o + obj-$(CONFIG_GPIO_BT8XX) += gpio-bt8xx.o + obj-$(CONFIG_GPIO_CADENCE) += gpio-cadence.o ++obj-$(CONFIG_GPIO_CASCADE) += gpio-cascade.o + obj-$(CONFIG_GPIO_CLPS711X) += gpio-clps711x.o + obj-$(CONFIG_GPIO_SNPS_CREG) += gpio-creg-snps.o + obj-$(CONFIG_GPIO_CRYSTAL_COVE) += gpio-crystalcove.o +--- /dev/null ++++ b/drivers/gpio/gpio-cascade.c +@@ -0,0 +1,117 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * A generic GPIO cascade driver ++ * ++ * Copyright (C) 2021 Mauri Sandberg ++ * ++ * This allows building cascades of GPIO lines in a manner illustrated ++ * below: ++ * ++ * /|---- Cascaded GPIO line 0 ++ * Upstream | |---- Cascaded GPIO line 1 ++ * GPIO line ----+ | . ++ * | | . ++ * \|---- Cascaded GPIO line n ++ * ++ * A multiplexer is being used to select, which cascaded line is being ++ * addressed at any given time. ++ * ++ * At the moment only input mode is supported due to lack of means for ++ * testing output functionality. At least theoretically output should be ++ * possible with open drain constructions. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++struct gpio_cascade { ++ struct gpio_chip gpio_chip; ++ struct device *parent; ++ struct mux_control *mux_control; ++ struct gpio_desc *upstream_line; ++}; ++ ++static struct gpio_cascade *chip_to_cascade(struct gpio_chip *gc) ++{ ++ return container_of(gc, struct gpio_cascade, gpio_chip); ++} ++ ++static int gpio_cascade_get_direction(struct gpio_chip *gc, unsigned int offset) ++{ ++ return GPIO_LINE_DIRECTION_IN; ++} ++ ++static int gpio_cascade_get_value(struct gpio_chip *gc, unsigned int offset) ++{ ++ struct gpio_cascade *cas = chip_to_cascade(gc); ++ int ret; ++ ++ ret = mux_control_select(cas->mux_control, offset); ++ if (ret) ++ return ret; ++ ++ ret = gpiod_get_value(cas->upstream_line); ++ mux_control_deselect(cas->mux_control); ++ return ret; ++} ++ ++static int gpio_cascade_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct gpio_cascade *cas; ++ struct mux_control *mc; ++ struct gpio_desc *upstream; ++ struct gpio_chip *gc; ++ ++ cas = devm_kzalloc(dev, sizeof(*cas), GFP_KERNEL); ++ if (!cas) ++ return -ENOMEM; ++ ++ mc = devm_mux_control_get(dev, NULL); ++ if (IS_ERR(mc)) ++ return dev_err_probe(dev, PTR_ERR(mc), "unable to get mux-control\n"); ++ ++ cas->mux_control = mc; ++ upstream = devm_gpiod_get(dev, "upstream", GPIOD_IN); ++ if (IS_ERR(upstream)) ++ return dev_err_probe(dev, PTR_ERR(upstream), "unable to claim upstream GPIO line\n"); ++ ++ cas->upstream_line = upstream; ++ cas->parent = dev; ++ ++ gc = &cas->gpio_chip; ++ gc->get = gpio_cascade_get_value; ++ gc->get_direction = gpio_cascade_get_direction; ++ gc->base = -1; ++ gc->ngpio = mux_control_states(mc); ++ gc->label = dev_name(cas->parent); ++ gc->parent = cas->parent; ++ gc->owner = THIS_MODULE; ++ ++ platform_set_drvdata(pdev, cas); ++ return devm_gpiochip_add_data(dev, &cas->gpio_chip, NULL); ++} ++ ++static const struct of_device_id gpio_cascade_id[] = { ++ { .compatible = "gpio-cascade" }, ++ { /* sentinel */ } ++}; ++MODULE_DEVICE_TABLE(of, gpio_cascade_id); ++ ++static struct platform_driver gpio_cascade_driver = { ++ .driver = { ++ .name = "gpio-cascade", ++ .of_match_table = gpio_cascade_id, ++ }, ++ .probe = gpio_cascade_probe, ++}; ++module_platform_driver(gpio_cascade_driver); ++ ++MODULE_AUTHOR("Mauri Sandberg "); ++MODULE_DESCRIPTION("Generic GPIO cascade"); ++MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/pending-5.15/802-nvmem-u-boot-env-align-endianness-of-crc32-values.patch b/target/linux/generic/pending-5.15/802-nvmem-u-boot-env-align-endianness-of-crc32-values.patch new file mode 100644 index 0000000000..9b111050ee --- /dev/null +++ b/target/linux/generic/pending-5.15/802-nvmem-u-boot-env-align-endianness-of-crc32-values.patch @@ -0,0 +1,47 @@ +From 0e71cac033bb7689c4dfa2e6814191337ef770f5 Mon Sep 17 00:00:00 2001 +From: INAGAKI Hiroshi +Date: Thu, 13 Oct 2022 00:51:33 +0900 +Subject: [PATCH] nvmem: u-boot-env: align endianness of crc32 values +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch fixes crc32 error on Big-Endianness system by conversion of +calculated crc32 value. + +Little-Endianness system: + + obtained crc32: Little +calculated crc32: Little + +Big-Endianness system: + + obtained crc32: Little +calculated crc32: Big + +log (APRESIA ApresiaLightGS120GT-SS, RTL8382M, Big-Endianness): + +[ 8.570000] u_boot_env 18001200.spi:flash@0:partitions:partition@c0000: Invalid calculated CRC32: 0x88cd6f09 (expected: 0x096fcd88) +[ 8.580000] u_boot_env: probe of 18001200.spi:flash@0:partitions:partition@c0000 failed with error -22 + +Fixes: f955dc1445069 ("nvmem: add driver handling U-Boot environment variables") + +Signed-off-by: INAGAKI Hiroshi +Acked-by: Rafał Miłecki +Tested-by: Christian Lamparter +Signed-off-by: Srinivas Kandagatla +--- + drivers/nvmem/u-boot-env.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/nvmem/u-boot-env.c ++++ b/drivers/nvmem/u-boot-env.c +@@ -182,7 +182,7 @@ static int u_boot_env_parse(struct u_boo + crc32_data_len = priv->mtd->size - crc32_data_offset; + data_len = priv->mtd->size - data_offset; + +- calc = crc32(~0, buf + crc32_data_offset, crc32_data_len) ^ ~0L; ++ calc = le32_to_cpu((__le32)crc32(~0, buf + crc32_data_offset, crc32_data_len) ^ ~0L); + if (calc != crc32) { + dev_err(dev, "Invalid calculated CRC32: 0x%08x (expected: 0x%08x)\n", calc, crc32); + err = -EINVAL; diff --git a/target/linux/generic/pending-5.15/803-nvmem-core-fix-support-for-fixed-cells-NVMEM-layout.patch b/target/linux/generic/pending-5.15/803-nvmem-core-fix-support-for-fixed-cells-NVMEM-layout.patch new file mode 100644 index 0000000000..f403bbec9b --- /dev/null +++ b/target/linux/generic/pending-5.15/803-nvmem-core-fix-support-for-fixed-cells-NVMEM-layout.patch @@ -0,0 +1,40 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 13 Jul 2023 17:30:59 +0200 +Subject: [PATCH] nvmem: core: fix support for fixed cells NVMEM layout +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Returning -EPROBE_DEFER for "fixed-layout" makes nvmem_register() always +fail (that layout is supported internally with no external module). That +makes callers (e.g. mtd_nvmem_add()) fail as well and prevents booting +on devices with "fixed-layout" in DT. + +Add a quick workaround for it. + +Fixes: 6468a6f45148 ("nvmem: core: handle the absence of expected layouts") +Signed-off-by: Rafał Miłecki +--- + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -798,6 +798,19 @@ static struct nvmem_layout *nvmem_layout + return NULL; + + /* ++ * We should return -EPROBE_DEFER only when layout driver is expected to ++ * become available later. Otherwise NVMEM will never probe successfully ++ * for unsupported layouts. There is no known solution for that right ++ * now. ++ * ++ * This problem also affects "fixed-layout". It's supported in NVMEM ++ * core code so there never will be layout for it. We shouldn't return ++ * -EPROBE_DEFER in such case. Add a quick workaround for that. ++ */ ++ if (of_device_is_compatible(layout_np, "fixed-layout")) ++ return NULL; ++ ++ /* + * In case the nvmem device was built-in while the layout was built as a + * module, we shall manually request the layout driver loading otherwise + * we'll never have any match. diff --git a/target/linux/generic/pending-5.15/804-nvmem-core-support-mac-base-fixed-layout-cells.patch b/target/linux/generic/pending-5.15/804-nvmem-core-support-mac-base-fixed-layout-cells.patch new file mode 100644 index 0000000000..95f29b1865 --- /dev/null +++ b/target/linux/generic/pending-5.15/804-nvmem-core-support-mac-base-fixed-layout-cells.patch @@ -0,0 +1,124 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 13 Jul 2023 18:29:19 +0200 +Subject: [PATCH] nvmem: core: support "mac-base" fixed layout cells + +Fixed layout binding allows specifying "mac-base" NVMEM cells. It's used +for base MAC address (that can be used for calculating relative +addresses). It can be stored in a raw binary format or as an ASCII +string. +--- + +--- a/drivers/nvmem/Kconfig ++++ b/drivers/nvmem/Kconfig +@@ -1,6 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0-only + menuconfig NVMEM + bool "NVMEM Support" ++ select GENERIC_NET_UTILS + help + Support for NVMEM(Non Volatile Memory) devices like EEPROM, EFUSES... + +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -7,9 +7,12 @@ + */ + + #include ++#include ++#include + #include + #include + #include ++#include + #include + #include + #include +@@ -696,6 +699,62 @@ static int nvmem_validate_keepouts(struc + return 0; + } + ++static int nvmem_mac_base_raw_read(void *context, const char *id, int index, unsigned int offset, ++ void *buf, size_t bytes) ++{ ++ if (WARN_ON(bytes != ETH_ALEN)) ++ return -EINVAL; ++ ++ if (index) ++ eth_addr_add(buf, index); ++ ++ return 0; ++} ++ ++static int nvmem_mac_base_ascii_read(void *context, const char *id, int index, unsigned int offset, ++ void *buf, size_t bytes) ++{ ++ u8 mac[ETH_ALEN]; ++ ++ if (WARN_ON(bytes != 3 * ETH_ALEN - 1)) ++ return -EINVAL; ++ ++ if (!mac_pton(buf, mac)) ++ return -EINVAL; ++ ++ if (index) ++ eth_addr_add(mac, index); ++ ++ ether_addr_copy(buf, mac); ++ ++ return 0; ++} ++ ++static int nvmem_mac_base_hex_read(void *context, const char *id, int index, unsigned int offset, ++ void *buf, size_t bytes) ++{ ++ u8 mac[ETH_ALEN], *hexstr; ++ int i; ++ ++ if (WARN_ON(bytes != 2 * ETH_ALEN)) ++ return -EINVAL; ++ ++ hexstr = (u8 *)buf; ++ for (i = 0; i < ETH_ALEN; i++) { ++ if (!isxdigit(hexstr[i * 2]) || !isxdigit(hexstr[i * 2 + 1])) ++ return -EINVAL; ++ ++ mac[i] = (hex_to_bin(hexstr[i * 2]) << 4) | hex_to_bin(hexstr[i * 2 + 1]); ++ } ++ ++ if (index) ++ eth_addr_add(mac, index); ++ ++ ether_addr_copy(buf, mac); ++ ++ return 0; ++} ++ + static int nvmem_add_cells_from_dt(struct nvmem_device *nvmem, struct device_node *np) + { + struct nvmem_layout *layout = nvmem->layout; +@@ -731,6 +790,25 @@ static int nvmem_add_cells_from_dt(struc + if (layout && layout->fixup_cell_info) + layout->fixup_cell_info(nvmem, layout, &info); + ++ if (of_device_is_compatible(np, "fixed-layout")) { ++ if (of_device_is_compatible(child, "mac-base")) { ++ if (info.bytes == ETH_ALEN) { ++ info.raw_len = info.bytes; ++ info.bytes = ETH_ALEN; ++ info.read_post_process = nvmem_mac_base_raw_read; ++ } else if (info.bytes == 2 * ETH_ALEN) { ++ info.raw_len = info.bytes; ++ info.bytes = ETH_ALEN; ++ info.read_post_process = nvmem_mac_base_hex_read; ++ } else if (info.bytes == 3 * ETH_ALEN - 1) { ++ info.raw_len = info.bytes; ++ info.bytes = ETH_ALEN; ++ info.read_post_process = nvmem_mac_base_ascii_read; ++ } ++ ++ } ++ } ++ + ret = nvmem_add_one_cell(nvmem, &info); + kfree(info.name); + if (ret) { diff --git a/target/linux/generic/pending-5.15/810-pci_disable_common_quirks.patch b/target/linux/generic/pending-5.15/810-pci_disable_common_quirks.patch new file mode 100644 index 0000000000..153b5d06cf --- /dev/null +++ b/target/linux/generic/pending-5.15/810-pci_disable_common_quirks.patch @@ -0,0 +1,62 @@ +From: Gabor Juhos +Subject: debloat: add kernel config option to disabling common PCI quirks + +Signed-off-by: Gabor Juhos +--- + drivers/pci/Kconfig | 6 ++++++ + drivers/pci/quirks.c | 6 ++++++ + 2 files changed, 12 insertions(+) + +--- a/drivers/pci/Kconfig ++++ b/drivers/pci/Kconfig +@@ -118,6 +118,13 @@ config XEN_PCIDEV_FRONTEND + The PCI device frontend driver allows the kernel to import arbitrary + PCI devices from a PCI backend to support PCI driver domains. + ++config PCI_DISABLE_COMMON_QUIRKS ++ bool "PCI disable common quirks" ++ depends on PCI ++ help ++ If you don't know what to do here, say N. ++ ++ + config PCI_ATS + bool + +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -206,6 +206,7 @@ static void quirk_mmio_always_on(struct + DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_ANY_ID, PCI_ANY_ID, + PCI_CLASS_BRIDGE_HOST, 8, quirk_mmio_always_on); + ++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS + /* + * The Mellanox Tavor device gives false positive parity errors. Disable + * parity error reporting. +@@ -3365,6 +3366,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f9, quirk_intel_mc_errata); + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65fa, quirk_intel_mc_errata); + ++#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */ ++ + /* + * Ivytown NTB BAR sizes are misreported by the hardware due to an erratum. + * To work around this, query the size it should be configured to by the +@@ -3390,6 +3393,8 @@ static void quirk_intel_ntb(struct pci_d + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e08, quirk_intel_ntb); + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e0d, quirk_intel_ntb); + ++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS ++ + /* + * Some BIOS implementations leave the Intel GPU interrupts enabled, even + * though no one is handling them (e.g., if the i915 driver is never +@@ -3428,6 +3433,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq); + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq); + ++#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */ ++ + /* + * PCI devices which are on Intel chips can skip the 10ms delay + * before entering D3 mode. diff --git a/target/linux/generic/pending-5.15/811-pci_disable_usb_common_quirks.patch b/target/linux/generic/pending-5.15/811-pci_disable_usb_common_quirks.patch new file mode 100644 index 0000000000..b498d9f700 --- /dev/null +++ b/target/linux/generic/pending-5.15/811-pci_disable_usb_common_quirks.patch @@ -0,0 +1,115 @@ +From: Felix Fietkau +Subject: debloat: disable common USB quirks + +Signed-off-by: Felix Fietkau +--- + drivers/usb/host/pci-quirks.c | 16 ++++++++++++++++ + drivers/usb/host/pci-quirks.h | 18 +++++++++++++++++- + include/linux/usb/hcd.h | 7 +++++++ + 3 files changed, 40 insertions(+), 1 deletion(-) + +--- a/drivers/usb/host/pci-quirks.c ++++ b/drivers/usb/host/pci-quirks.c +@@ -128,6 +128,8 @@ struct amd_chipset_type { + u8 rev; + }; + ++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS ++ + static struct amd_chipset_info { + struct pci_dev *nb_dev; + struct pci_dev *smbus_dev; +@@ -633,6 +635,10 @@ bool usb_amd_pt_check_port(struct device + } + EXPORT_SYMBOL_GPL(usb_amd_pt_check_port); + ++#endif /* CONFIG_PCI_DISABLE_COMMON_QUIRKS */ ++ ++#if IS_ENABLED(CONFIG_USB_UHCI_HCD) ++ + /* + * Make sure the controller is completely inactive, unable to + * generate interrupts or do DMA. +@@ -712,8 +718,17 @@ reset_needed: + uhci_reset_hc(pdev, base); + return 1; + } ++#else ++int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base) ++{ ++ return 0; ++} ++ ++#endif + EXPORT_SYMBOL_GPL(uhci_check_and_reset_hc); + ++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS ++ + static inline int io_type_enabled(struct pci_dev *pdev, unsigned int mask) + { + u16 cmd; +@@ -1285,3 +1300,4 @@ static void quirk_usb_early_handoff(stru + } + DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID, + PCI_CLASS_SERIAL_USB, 8, quirk_usb_early_handoff); ++#endif +--- a/drivers/usb/host/pci-quirks.h ++++ b/drivers/usb/host/pci-quirks.h +@@ -5,6 +5,9 @@ + #ifdef CONFIG_USB_PCI + void uhci_reset_hc(struct pci_dev *pdev, unsigned long base); + int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base); ++#endif /* CONFIG_USB_PCI */ ++ ++#if defined(CONFIG_USB_PCI) && !defined(CONFIG_PCI_DISABLE_COMMON_QUIRKS) + int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev); + bool usb_amd_hang_symptom_quirk(void); + bool usb_amd_prefetch_quirk(void); +@@ -19,6 +22,18 @@ void sb800_prefetch(struct device *dev, + bool usb_amd_pt_check_port(struct device *device, int port); + #else + struct pci_dev; ++static inline int usb_amd_quirk_pll_check(void) ++{ ++ return 0; ++} ++static inline bool usb_amd_hang_symptom_quirk(void) ++{ ++ return false; ++} ++static inline bool usb_amd_prefetch_quirk(void) ++{ ++ return false; ++} + static inline void usb_amd_quirk_pll_disable(void) {} + static inline void usb_amd_quirk_pll_enable(void) {} + static inline void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) {} +@@ -29,6 +44,11 @@ static inline bool usb_amd_pt_check_port + { + return false; + } ++static inline void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev) {} ++static inline bool usb_xhci_needs_pci_reset(struct pci_dev *pdev) ++{ ++ return false; ++} + #endif /* CONFIG_USB_PCI */ + + #endif /* __LINUX_USB_PCI_QUIRKS_H */ +--- a/include/linux/usb/hcd.h ++++ b/include/linux/usb/hcd.h +@@ -498,7 +498,14 @@ extern int usb_hcd_pci_probe(struct pci_ + extern void usb_hcd_pci_remove(struct pci_dev *dev); + extern void usb_hcd_pci_shutdown(struct pci_dev *dev); + ++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS + extern int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev); ++#else ++static inline int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev) ++{ ++ return 0; ++} ++#endif + + #ifdef CONFIG_PM + extern const struct dev_pm_ops usb_hcd_pci_pm_ops; diff --git a/target/linux/generic/pending-5.10/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch b/target/linux/generic/pending-5.15/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch similarity index 100% rename from target/linux/generic/pending-5.10/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch rename to target/linux/generic/pending-5.15/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch diff --git a/target/linux/generic/pending-5.15/834-ledtrig-libata.patch b/target/linux/generic/pending-5.15/834-ledtrig-libata.patch new file mode 100644 index 0000000000..d61e28b4c3 --- /dev/null +++ b/target/linux/generic/pending-5.15/834-ledtrig-libata.patch @@ -0,0 +1,149 @@ +From: Daniel Golle +Subject: libata: add ledtrig support + +This adds a LED trigger for each ATA port indicating disk activity. + +As this is needed only on specific platforms (NAS SoCs and such), +these platforms should define ARCH_WANTS_LIBATA_LEDS if there +are boards with LED(s) intended to indicate ATA disk activity and +need the OS to take care of that. +In that way, if not selected, LED trigger support not will be +included in libata-core and both, codepaths and structures remain +untouched. + +Signed-off-by: Daniel Golle +--- + drivers/ata/Kconfig | 16 ++++++++++++++++ + drivers/ata/libata-core.c | 41 +++++++++++++++++++++++++++++++++++++++++ + include/linux/libata.h | 9 +++++++++ + 3 files changed, 66 insertions(+) + +--- a/drivers/ata/Kconfig ++++ b/drivers/ata/Kconfig +@@ -67,6 +67,22 @@ config ATA_FORCE + + If unsure, say Y. + ++config ARCH_WANT_LIBATA_LEDS ++ bool ++ ++config ATA_LEDS ++ bool "support ATA port LED triggers" ++ depends on ARCH_WANT_LIBATA_LEDS ++ select NEW_LEDS ++ select LEDS_CLASS ++ select LEDS_TRIGGERS ++ default y ++ help ++ This option adds a LED trigger for each registered ATA port. ++ It is used to drive disk activity leds connected via GPIO. ++ ++ If unsure, say N. ++ + config ATA_ACPI + bool "ATA ACPI Support" + depends on ACPI +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -656,6 +656,19 @@ u64 ata_tf_read_block(const struct ata_t + return block; + } + ++#ifdef CONFIG_ATA_LEDS ++#define LIBATA_BLINK_DELAY 20 /* ms */ ++static inline void ata_led_act(struct ata_port *ap) ++{ ++ unsigned long led_delay = LIBATA_BLINK_DELAY; ++ ++ if (unlikely(!ap->ledtrig)) ++ return; ++ ++ led_trigger_blink_oneshot(ap->ledtrig, &led_delay, &led_delay, 0); ++} ++#endif ++ + /** + * ata_build_rw_tf - Build ATA taskfile for given read/write request + * @tf: Target ATA taskfile +@@ -4580,6 +4593,9 @@ struct ata_queued_cmd *ata_qc_new_init(s + if (tag < 0) + return NULL; + } ++#ifdef CONFIG_ATA_LEDS ++ ata_led_act(ap); ++#endif + + qc = __ata_qc_from_tag(ap, tag); + qc->tag = qc->hw_tag = tag; +@@ -5358,6 +5374,9 @@ struct ata_port *ata_port_alloc(struct a + ap->stats.unhandled_irq = 1; + ap->stats.idle_irq = 1; + #endif ++#ifdef CONFIG_ATA_LEDS ++ ap->ledtrig = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); ++#endif + ata_sff_port_init(ap); + + return ap; +@@ -5393,6 +5412,12 @@ static void ata_host_release(struct kref + + kfree(ap->pmp_link); + kfree(ap->slave_link); ++#ifdef CONFIG_ATA_LEDS ++ if (ap->ledtrig) { ++ led_trigger_unregister(ap->ledtrig); ++ kfree(ap->ledtrig); ++ }; ++#endif + kfree(ap); + host->ports[i] = NULL; + } +@@ -5799,7 +5824,23 @@ int ata_host_register(struct ata_host *h + host->ports[i]->print_id = atomic_inc_return(&ata_print_id); + host->ports[i]->local_port_no = i + 1; + } ++#ifdef CONFIG_ATA_LEDS ++ for (i = 0; i < host->n_ports; i++) { ++ if (unlikely(!host->ports[i]->ledtrig)) ++ continue; + ++ snprintf(host->ports[i]->ledtrig_name, ++ sizeof(host->ports[i]->ledtrig_name), "ata%u", ++ host->ports[i]->print_id); ++ ++ host->ports[i]->ledtrig->name = host->ports[i]->ledtrig_name; ++ ++ if (led_trigger_register(host->ports[i]->ledtrig)) { ++ kfree(host->ports[i]->ledtrig); ++ host->ports[i]->ledtrig = NULL; ++ } ++ } ++#endif + /* Create associated sysfs transport objects */ + for (i = 0; i < host->n_ports; i++) { + rc = ata_tport_add(host->dev,host->ports[i]); +--- a/include/linux/libata.h ++++ b/include/linux/libata.h +@@ -23,6 +23,9 @@ + #include + #include + #include ++#ifdef CONFIG_ATA_LEDS ++#include ++#endif + + /* + * Define if arch has non-standard setup. This is a _PCI_ standard +@@ -898,6 +901,12 @@ struct ata_port { + #ifdef CONFIG_ATA_ACPI + struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */ + #endif ++ ++#ifdef CONFIG_ATA_LEDS ++ struct led_trigger *ledtrig; ++ char ledtrig_name[8]; ++#endif ++ + /* owned by EH */ + u8 sector_buf[ATA_SECT_SIZE] ____cacheline_aligned; + }; diff --git a/target/linux/generic/pending-5.15/840-hwrng-bcm2835-set-quality-to-1000.patch b/target/linux/generic/pending-5.15/840-hwrng-bcm2835-set-quality-to-1000.patch new file mode 100644 index 0000000000..5ca8933d6f --- /dev/null +++ b/target/linux/generic/pending-5.15/840-hwrng-bcm2835-set-quality-to-1000.patch @@ -0,0 +1,26 @@ +From d6988cf1d16faac56899918bb2b1be8d85155e3f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= +Date: Sat, 20 Feb 2021 18:36:38 +0100 +Subject: [PATCH] hwrng: bcm2835: set quality to 1000 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This allows devices without a high precission timer to reduce boot from >100s +to <30s. + +Signed-off-by: Álvaro Fernández Rojas +--- + drivers/char/hw_random/bcm2835-rng.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/char/hw_random/bcm2835-rng.c ++++ b/drivers/char/hw_random/bcm2835-rng.c +@@ -170,6 +170,7 @@ static int bcm2835_rng_probe(struct plat + priv->rng.init = bcm2835_rng_init; + priv->rng.read = bcm2835_rng_read; + priv->rng.cleanup = bcm2835_rng_cleanup; ++ priv->rng.quality = 1000; + + if (dev_of_node(dev)) { + rng_id = of_match_node(bcm2835_rng_of_match, dev->of_node); diff --git a/target/linux/generic/pending-5.15/850-0023-PCI-aardvark-Make-main-irq_chip-structure-a-static-d.patch b/target/linux/generic/pending-5.15/850-0023-PCI-aardvark-Make-main-irq_chip-structure-a-static-d.patch new file mode 100644 index 0000000000..e180a385e1 --- /dev/null +++ b/target/linux/generic/pending-5.15/850-0023-PCI-aardvark-Make-main-irq_chip-structure-a-static-d.patch @@ -0,0 +1,102 @@ +From 663b9f99bb35dbc0c7b685f71ee3668a60d31320 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marek=20Beh=C3=BAn?= +Date: Mon, 10 Jan 2022 02:02:00 +0100 +Subject: [PATCH] PCI: aardvark: Make main irq_chip structure a static driver + structure +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Marc Zyngier says [1] that we should use struct irq_chip as a global +static struct in the driver. Even though the structure currently +contains a dynamic member (parent_device), Marc says [2] that he plans +to kill it and make the structure completely static. + +We have already converted others irq_chip structures in this driver in +this way, but we omitted this one because the .name member is +dynamically created from device's name, and the name is displayed in +sysfs, so changing it would break sysfs ABI. + +The rationale for changing the name (to "advk-INT") in spite of sysfs +ABI, and thus allowing to convert to a static structure, is that after +the other changes we made in this series, the IRQ chip is basically +something different: it no logner generates ERR and PME interrupts (they +are generated by emulated bridge's rp_irq_chip). + +[1] https://lore.kernel.org/linux-pci/877dbcvngf.wl-maz@kernel.org/ +[2] https://lore.kernel.org/linux-pci/874k6gvkhz.wl-maz@kernel.org/ + +Signed-off-by: Marek Behún +--- + drivers/pci/controller/pci-aardvark.c | 25 +++++++------------------ + 1 file changed, 7 insertions(+), 18 deletions(-) + +--- a/drivers/pci/controller/pci-aardvark.c ++++ b/drivers/pci/controller/pci-aardvark.c +@@ -275,7 +275,6 @@ struct advk_pcie { + u8 wins_count; + struct irq_domain *rp_irq_domain; + struct irq_domain *irq_domain; +- struct irq_chip irq_chip; + raw_spinlock_t irq_lock; + struct irq_domain *msi_domain; + struct irq_domain *msi_inner_domain; +@@ -1345,14 +1344,19 @@ static void advk_pcie_irq_unmask(struct + raw_spin_unlock_irqrestore(&pcie->irq_lock, flags); + } + ++static struct irq_chip advk_irq_chip = { ++ .name = "advk-INT", ++ .irq_mask = advk_pcie_irq_mask, ++ .irq_unmask = advk_pcie_irq_unmask, ++}; ++ + static int advk_pcie_irq_map(struct irq_domain *h, + unsigned int virq, irq_hw_number_t hwirq) + { + struct advk_pcie *pcie = h->host_data; + + irq_set_status_flags(virq, IRQ_LEVEL); +- irq_set_chip_and_handler(virq, &pcie->irq_chip, +- handle_level_irq); ++ irq_set_chip_and_handler(virq, &advk_irq_chip, handle_level_irq); + irq_set_chip_data(virq, pcie); + + return 0; +@@ -1411,7 +1415,6 @@ static int advk_pcie_init_irq_domain(str + struct device *dev = &pcie->pdev->dev; + struct device_node *node = dev->of_node; + struct device_node *pcie_intc_node; +- struct irq_chip *irq_chip; + int ret = 0; + + raw_spin_lock_init(&pcie->irq_lock); +@@ -1422,28 +1425,14 @@ static int advk_pcie_init_irq_domain(str + return -ENODEV; + } + +- irq_chip = &pcie->irq_chip; +- +- irq_chip->name = devm_kasprintf(dev, GFP_KERNEL, "%s-irq", +- dev_name(dev)); +- if (!irq_chip->name) { +- ret = -ENOMEM; +- goto out_put_node; +- } +- +- irq_chip->irq_mask = advk_pcie_irq_mask; +- irq_chip->irq_unmask = advk_pcie_irq_unmask; +- + pcie->irq_domain = + irq_domain_add_linear(pcie_intc_node, PCI_NUM_INTX, + &advk_pcie_irq_domain_ops, pcie); + if (!pcie->irq_domain) { + dev_err(dev, "Failed to get a INTx IRQ domain\n"); + ret = -ENOMEM; +- goto out_put_node; + } + +-out_put_node: + of_node_put(pcie_intc_node); + return ret; + } diff --git a/target/linux/generic/pending-5.15/850-dt-bindings-clk-add-BCM63268-timer-clock-definitions.patch b/target/linux/generic/pending-5.15/850-dt-bindings-clk-add-BCM63268-timer-clock-definitions.patch new file mode 100644 index 0000000000..cc6f1e0d9d --- /dev/null +++ b/target/linux/generic/pending-5.15/850-dt-bindings-clk-add-BCM63268-timer-clock-definitions.patch @@ -0,0 +1,114 @@ +From patchwork Wed Mar 22 17:15:12 2023 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= + +X-Patchwork-Id: 13184389 +Return-Path: +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) + by smtp.lore.kernel.org (Postfix) with ESMTP id 73F2DC6FD1C + for ; Wed, 22 Mar 2023 17:15:59 +0000 (UTC) +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S231363AbjCVRP5 (ORCPT ); + Wed, 22 Mar 2023 13:15:57 -0400 +Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58824 "EHLO + lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org + with ESMTP id S231408AbjCVRPy (ORCPT + ); Wed, 22 Mar 2023 13:15:54 -0400 +Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com + [IPv6:2a00:1450:4864:20::32d]) + by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 70E4C64B28; + Wed, 22 Mar 2023 10:15:24 -0700 (PDT) +Received: by mail-wm1-x32d.google.com with SMTP id n19so1740892wms.0; + Wed, 22 Mar 2023 10:15:24 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20210112; t=1679505322; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:from:to:cc:subject:date + :message-id:reply-to; + bh=dEknM98Izmc8d/crPsoJ+ejZxfl78958Ei6SPYhYDHs=; + b=LTOQ75W3s5nYo+nEfiJAKqytSopONB4jCtU3zRygzPMasugVOrYFMsUR+WrpsAjuRT + v4HgWpJxEsIWeRXrUN9W21mFXhGgJLJXSxRnrio0CsZZBNMdkebbNOphgKXIWAdm+2iM + PzqAdGm5t38wT2mmm6V/9hCy90+12raHM82tNFdhhiezfg2cukVOKP3j/TeOVCwas0gQ + iFc+CuZB6y73zYXvMUMUpTsqI5vev4xJsSMHIQJVmUxJAwqhOBhN9JCRo7Ao+wayjn2d + Fxo6AV3A8v68nVfoQ0K0I+eWXG48nMCX45iWh/lVvVTOFcR99kn4va7NY1oVnPsh+WQz + WcLA== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20210112; t=1679505322; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc + :subject:date:message-id:reply-to; + bh=dEknM98Izmc8d/crPsoJ+ejZxfl78958Ei6SPYhYDHs=; + b=wv2NSR1B5RnsdoEE7mgJSHAfSs1JHZbQ1HPMldyaGWAk1dcucqh/uDzM3Flz+ADRi1 + 19NoaB2Ur7QaWZejbuplnIOK/nte3PnmqJ9ZNw8HejmuS4eU8mB1V1aJUSKSPGsfUi4a + LYe3HSw87l0jrAC7ptdKvdUtzBoIkX0CeFvfguTQQkDhUTyAFIG144hY6uPXY9Mga96b + gnNe2dLCzHQLbEJpaDaavT7FEEcLDxaq7jNcR2xqEEZaIwfcew+Q05t4xL/3i8GAj9Ru + 6ivQjIbBKfYQF88o7KnOW9o1wjrGsk+Nd4Iy0OLZix3JQasCJGrKV7ib5awI9J39upYV + fa4A== +X-Gm-Message-State: AO0yUKWw75I1M5Vjrd4vXq4GTruQu0H84pycgyi2CT3bczTYRJpWmEWg + +bHDhvp1n5IWW85GI9vKWpbclB13a/S0RQ== +X-Google-Smtp-Source: + AK7set9T/2oJsVetUb2L4mPEWu8YqDrnK8EzHK5bJf1ABIa1Et8f7BFJ7AA3j14ITZuf8cH0HqlRtg== +X-Received: by 2002:a05:600c:2304:b0:3ed:2949:985b with SMTP id + 4-20020a05600c230400b003ed2949985bmr206833wmo.23.1679505322457; + Wed, 22 Mar 2023 10:15:22 -0700 (PDT) +Received: from atlantis.lan (255.red-79-146-124.dynamicip.rima-tde.net. + [79.146.124.255]) + by smtp.gmail.com with ESMTPSA id + v10-20020a05600c470a00b003ee11ac2288sm8414333wmo.21.2023.03.22.10.15.21 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Wed, 22 Mar 2023 10:15:22 -0700 (PDT) +From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +To: mturquette@baylibre.com, sboyd@kernel.org, robh+dt@kernel.org, + krzysztof.kozlowski+dt@linaro.org, p.zabel@pengutronix.de, + f.fainelli@gmail.com, jonas.gorski@gmail.com, + william.zhang@broadcom.com, linux-clk@vger.kernel.org, + devicetree@vger.kernel.org, linux-kernel@vger.kernel.org +Cc: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= , + Rob Herring +Subject: [PATCH v4 1/4] dt-bindings: clk: add BCM63268 timer clock definitions +Date: Wed, 22 Mar 2023 18:15:12 +0100 +Message-Id: <20230322171515.120353-2-noltari@gmail.com> +X-Mailer: git-send-email 2.30.2 +In-Reply-To: <20230322171515.120353-1-noltari@gmail.com> +References: <20230322171515.120353-1-noltari@gmail.com> +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: linux-clk@vger.kernel.org + +Add missing timer clock definitions for BCM63268. + +Signed-off-by: Álvaro Fernández Rojas +Acked-by: Rob Herring +--- + v4: no changes + v3: no changes + v2: change commit title, as suggested by Stephen Boyd + + include/dt-bindings/clock/bcm63268-clock.h | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +--- a/include/dt-bindings/clock/bcm63268-clock.h ++++ b/include/dt-bindings/clock/bcm63268-clock.h +@@ -27,4 +27,17 @@ + #define BCM63268_CLK_TBUS 27 + #define BCM63268_CLK_ROBOSW250 31 + ++#define BCM63268_TCLK_EPHY1 0 ++#define BCM63268_TCLK_EPHY2 1 ++#define BCM63268_TCLK_EPHY3 2 ++#define BCM63268_TCLK_GPHY1 3 ++#define BCM63268_TCLK_DSL 4 ++#define BCM63268_TCLK_WAKEON_EPHY 6 ++#define BCM63268_TCLK_WAKEON_DSL 7 ++#define BCM63268_TCLK_FAP1 11 ++#define BCM63268_TCLK_FAP2 15 ++#define BCM63268_TCLK_UTO_50 16 ++#define BCM63268_TCLK_UTO_EXTIN 17 ++#define BCM63268_TCLK_USB_REF 18 ++ + #endif /* __DT_BINDINGS_CLOCK_BCM63268_H */ diff --git a/target/linux/generic/pending-5.15/851-dt-bindings-reset-add-BCM63268-timer-reset-definitions.patch b/target/linux/generic/pending-5.15/851-dt-bindings-reset-add-BCM63268-timer-reset-definitions.patch new file mode 100644 index 0000000000..5f1be105ac --- /dev/null +++ b/target/linux/generic/pending-5.15/851-dt-bindings-reset-add-BCM63268-timer-reset-definitions.patch @@ -0,0 +1,107 @@ +From patchwork Wed Mar 22 17:15:13 2023 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= + +X-Patchwork-Id: 13184390 +Return-Path: +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) + by smtp.lore.kernel.org (Postfix) with ESMTP id D0B1AC6FD1C + for ; Wed, 22 Mar 2023 17:16:08 +0000 (UTC) +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S231472AbjCVRQI (ORCPT ); + Wed, 22 Mar 2023 13:16:08 -0400 +Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58934 "EHLO + lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org + with ESMTP id S231435AbjCVRP5 (ORCPT + ); Wed, 22 Mar 2023 13:15:57 -0400 +Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com + [IPv6:2a00:1450:4864:20::329]) + by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9655064863; + Wed, 22 Mar 2023 10:15:25 -0700 (PDT) +Received: by mail-wm1-x329.google.com with SMTP id + v4-20020a05600c470400b003ee4f06428fso2424553wmo.4; + Wed, 22 Mar 2023 10:15:25 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20210112; t=1679505324; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:from:to:cc:subject:date + :message-id:reply-to; + bh=C7ykhArT1dO7P8wtmI92eo4c7KtPZI9w182/5+cB3T0=; + b=WRZRU2SM9n1LfUj4SgTPfQczADC2pfvoIrOsNpBLTym2eOfmkTetb/WbGSla5kw2Wb + SH5MIC2fFeScJg6T5FFAUOOLmRVW9xvl8Q3T3NKb3z/9wvPHO767nrdIbffRWMJFs7gW + wT/kuTpn8GYdfY0sZ/dMTkq41DVusEkxfX6GxtG85O98ZP8xMHQog8aPs9fRfUvI5ZKB + eGYcRz/Wn1cHhjey9jtWzQEEmZ/BT3b0HQTF9Tl88oofhiEgbyjFXr91+vRsLbsJpGXH + /1FjjaLG5DnonKubV9rmbuCU8KzwH331gi2KuRjvLD2V+OMewqSa5i+GvgVv8x2zC8y+ + /mLQ== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20210112; t=1679505324; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc + :subject:date:message-id:reply-to; + bh=C7ykhArT1dO7P8wtmI92eo4c7KtPZI9w182/5+cB3T0=; + b=bhd0fNh0jDOMlGSC4F+p5igV8AUlGEPj2cXUwgdgqRfSSuUy9z+Li8cT0MbY/aWH5Z + qInRVA+R1cWV3ubrDyKag6oEc0LDU234bnMFcP9b7MRlrM8Dpit9TFSyqJU4sDUWNDs5 + KOe2k/SNIdat6munC9VOuEBDO0eB/UDMN+repKwXNdHChp/Toq9qMvW4Uy8uHxosbQlD + 8P88GbKFjynb1E8I8croGjfub7+y8PPsWB0xNUcafIv6xs3MnVOP1Mk4KwBCbqS509la + mfjsriXtIybO8XFqtn100ungjvbFWdogEplLdSPVdgAqdfF5J8gHxAoApoeYejYkL5/R + kOhQ== +X-Gm-Message-State: AO0yUKWdzr3dMmjKhD8tF+ec4Dfdq9VGZ/WCU4d85npKQvxSwhNPZZ1J + 5WYRIqivh0suFC1OqEidwenpiJYvXedYjw== +X-Google-Smtp-Source: + AK7set87ew2/mKWeShXTTW/YBbBJNR2zeGFV0CfuqLXhiJEU6tqFuyKcW+vFEoKHIbNUS8wRy1SzLA== +X-Received: by 2002:a05:600c:290:b0:3ee:6d88:774a with SMTP id + 16-20020a05600c029000b003ee6d88774amr160734wmk.14.1679505323514; + Wed, 22 Mar 2023 10:15:23 -0700 (PDT) +Received: from atlantis.lan (255.red-79-146-124.dynamicip.rima-tde.net. + [79.146.124.255]) + by smtp.gmail.com with ESMTPSA id + v10-20020a05600c470a00b003ee11ac2288sm8414333wmo.21.2023.03.22.10.15.22 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Wed, 22 Mar 2023 10:15:23 -0700 (PDT) +From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +To: mturquette@baylibre.com, sboyd@kernel.org, robh+dt@kernel.org, + krzysztof.kozlowski+dt@linaro.org, p.zabel@pengutronix.de, + f.fainelli@gmail.com, jonas.gorski@gmail.com, + william.zhang@broadcom.com, linux-clk@vger.kernel.org, + devicetree@vger.kernel.org, linux-kernel@vger.kernel.org +Cc: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= , + Rob Herring +Subject: [PATCH v4 2/4] dt-bindings: reset: add BCM63268 timer reset + definitions +Date: Wed, 22 Mar 2023 18:15:13 +0100 +Message-Id: <20230322171515.120353-3-noltari@gmail.com> +X-Mailer: git-send-email 2.30.2 +In-Reply-To: <20230322171515.120353-1-noltari@gmail.com> +References: <20230322171515.120353-1-noltari@gmail.com> +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: linux-clk@vger.kernel.org + +Add missing timer reset definitions for BCM63268. + +Signed-off-by: Álvaro Fernández Rojas +Acked-by: Rob Herring +--- + v4: no changes + v3: no changes + v2: change commit title, as suggested by Stephen Boyd + + include/dt-bindings/reset/bcm63268-reset.h | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/include/dt-bindings/reset/bcm63268-reset.h ++++ b/include/dt-bindings/reset/bcm63268-reset.h +@@ -23,4 +23,8 @@ + #define BCM63268_RST_PCIE_HARD 17 + #define BCM63268_RST_GPHY 18 + ++#define BCM63268_TRST_SW 29 ++#define BCM63268_TRST_HW 30 ++#define BCM63268_TRST_POR 31 ++ + #endif /* __DT_BINDINGS_RESET_BCM63268_H */ diff --git a/target/linux/generic/pending-5.15/852-clk-bcm-Add-BCM63268-timer-clock-and-reset-driver.patch b/target/linux/generic/pending-5.15/852-clk-bcm-Add-BCM63268-timer-clock-and-reset-driver.patch new file mode 100644 index 0000000000..7e500cd1b5 --- /dev/null +++ b/target/linux/generic/pending-5.15/852-clk-bcm-Add-BCM63268-timer-clock-and-reset-driver.patch @@ -0,0 +1,345 @@ +From patchwork Wed Mar 22 17:15:15 2023 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= + +X-Patchwork-Id: 13184392 +Return-Path: +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) + by smtp.lore.kernel.org (Postfix) with ESMTP id 199D9C76196 + for ; Wed, 22 Mar 2023 17:16:11 +0000 (UTC) +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S231512AbjCVRQJ (ORCPT ); + Wed, 22 Mar 2023 13:16:09 -0400 +Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58942 "EHLO + lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org + with ESMTP id S231442AbjCVRP5 (ORCPT + ); Wed, 22 Mar 2023 13:15:57 -0400 +Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com + [IPv6:2a00:1450:4864:20::32c]) + by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1DDB36487D; + Wed, 22 Mar 2023 10:15:27 -0700 (PDT) +Received: by mail-wm1-x32c.google.com with SMTP id + i5-20020a05600c354500b003edd24054e0so6717370wmq.4; + Wed, 22 Mar 2023 10:15:27 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20210112; t=1679505325; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:from:to:cc:subject:date + :message-id:reply-to; + bh=rkv/eZYA1ncHp5FnV2ZWc3hgYnAx28S86QA9vmcXFCY=; + b=Y1mva2Bt3sUbKxLgEUS331CJbGxUc4z8kTQW8qiHWGhYlFKtm+d5z4sT40E5BeZAnU + zmTbCI7jbroe9NYBxGUmSli6LNVDPjND80ChbhWTqbqMQTmeQFWut9KmeBWK6Oze2lC/ + XMSOorUzowjcU2xtHNrzoq2KH2pstW573lsB8WnzFVfhMaRkE9DfRr6WNyA7zC8DyxM5 + ezxlCQtCmgPfCqlyksbIDKrgrRf3GiUR0yUd6xRU+MssyvH1FkYGDCerPctDto6lGHBz + 8Y15jT3l6OnQMT6dkekgpPF5/XrSUY93u9g0B4U8+0dhNj+K7vmDen+jqdess+tpLnq/ + gFrA== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20210112; t=1679505325; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc + :subject:date:message-id:reply-to; + bh=rkv/eZYA1ncHp5FnV2ZWc3hgYnAx28S86QA9vmcXFCY=; + b=Ym4+u8bbTQGNkewUBrLf+89vE0EFJBQp2f1crwUxZFboKTROF9ltZonY1CGepo7b0B + fkx3TbWQy5X65g3ScuieqtClCI8WanPeNBJ48+JipJYO3ODVNBxnVaTuW/0FOIcahfqe + sG5GvggHhzRz+Yeybsbnupmzxnw8Ez0BpMl3p7zcjHL7BGZDdOOX2Zbw3zfyYa5sg2nX + UXYJT36zy2h39gxUsy9QkhQ76CG3w6omniohZpYidpojpiDjbOy0nKFky4kUe+YyA1fF + 4IBhjAm6mH+uh6wHSG1qj+NAXHs0xDDJps16PbJwAgL7Qt9K5WW+R/UAYPmHFgaRIHOw + /seA== +X-Gm-Message-State: AO0yUKXRtoYO8Nfus6Ca8lhM39P1Xn6TGkhatEfoISd1YNOkTJJN2hW+ + xRphLgxlzNfCLcVPlpGK9dk= +X-Google-Smtp-Source: + AK7set9VnMEykugk8ZYnkXuqK41bX1dzlvKsAXHEjr8i2NZBld0buKhQLcGYEcwxnBgVTtC7eRGfXw== +X-Received: by 2002:a1c:7c0b:0:b0:3e2:1dac:b071 with SMTP id + x11-20020a1c7c0b000000b003e21dacb071mr178053wmc.13.1679505325582; + Wed, 22 Mar 2023 10:15:25 -0700 (PDT) +Received: from atlantis.lan (255.red-79-146-124.dynamicip.rima-tde.net. + [79.146.124.255]) + by smtp.gmail.com with ESMTPSA id + v10-20020a05600c470a00b003ee11ac2288sm8414333wmo.21.2023.03.22.10.15.24 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Wed, 22 Mar 2023 10:15:25 -0700 (PDT) +From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +To: mturquette@baylibre.com, sboyd@kernel.org, robh+dt@kernel.org, + krzysztof.kozlowski+dt@linaro.org, p.zabel@pengutronix.de, + f.fainelli@gmail.com, jonas.gorski@gmail.com, + william.zhang@broadcom.com, linux-clk@vger.kernel.org, + devicetree@vger.kernel.org, linux-kernel@vger.kernel.org +Cc: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= +Subject: [PATCH v4 4/4] clk: bcm: Add BCM63268 timer clock and reset driver +Date: Wed, 22 Mar 2023 18:15:15 +0100 +Message-Id: <20230322171515.120353-5-noltari@gmail.com> +X-Mailer: git-send-email 2.30.2 +In-Reply-To: <20230322171515.120353-1-noltari@gmail.com> +References: <20230322171515.120353-1-noltari@gmail.com> +MIME-Version: 1.0 +Precedence: bulk +List-ID: +X-Mailing-List: linux-clk@vger.kernel.org + +Add driver for BCM63268 timer clock and reset controller. + +Signed-off-by: Álvaro Fernández Rojas +--- + v4: add changes suggested by Stephen Boyd: + - Usage of of_device_get_match_data() isn't needed. + - Use devm_clk_hw_register_gate(). + - Drop clk_hw_unregister_gate(). + v3: add missing include to fix build warning + v2: add changes suggested by Stephen Boyd + + drivers/clk/bcm/Kconfig | 9 ++ + drivers/clk/bcm/Makefile | 1 + + drivers/clk/bcm/clk-bcm63268-timer.c | 215 +++++++++++++++++++++++++++ + 3 files changed, 225 insertions(+) + create mode 100644 drivers/clk/bcm/clk-bcm63268-timer.c + +--- a/drivers/clk/bcm/Kconfig ++++ b/drivers/clk/bcm/Kconfig +@@ -37,6 +37,15 @@ config CLK_BCM_63XX_GATE + Enable common clock framework support for Broadcom BCM63xx DSL SoCs + based on the MIPS architecture + ++config CLK_BCM63268_TIMER ++ bool "Broadcom BCM63268 timer clock and reset support" ++ depends on BMIPS_GENERIC || COMPILE_TEST ++ default BMIPS_GENERIC ++ select RESET_CONTROLLER ++ help ++ Enable timer clock and reset support for Broadcom BCM63268 DSL SoCs ++ based on the MIPS architecture. ++ + config CLK_BCM_KONA + bool "Broadcom Kona CCU clock support" + depends on ARCH_BCM_MOBILE || COMPILE_TEST +--- a/drivers/clk/bcm/Makefile ++++ b/drivers/clk/bcm/Makefile +@@ -1,6 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + obj-$(CONFIG_CLK_BCM_63XX) += clk-bcm63xx.o + obj-$(CONFIG_CLK_BCM_63XX_GATE) += clk-bcm63xx-gate.o ++obj-$(CONFIG_CLK_BCM63268_TIMER) += clk-bcm63268-timer.o + obj-$(CONFIG_CLK_BCM_KONA) += clk-kona.o + obj-$(CONFIG_CLK_BCM_KONA) += clk-kona-setup.o + obj-$(CONFIG_CLK_BCM_KONA) += clk-bcm281xx.o +--- /dev/null ++++ b/drivers/clk/bcm/clk-bcm63268-timer.c +@@ -0,0 +1,215 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * BCM63268 Timer Clock and Reset Controller Driver ++ * ++ * Copyright (C) 2023 Álvaro Fernández Rojas ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#define BCM63268_TIMER_RESET_SLEEP_MIN_US 10000 ++#define BCM63268_TIMER_RESET_SLEEP_MAX_US 20000 ++ ++struct bcm63268_tclkrst_hw { ++ void __iomem *regs; ++ spinlock_t lock; ++ ++ struct reset_controller_dev rcdev; ++ struct clk_hw_onecell_data data; ++}; ++ ++struct bcm63268_tclk_table_entry { ++ const char * const name; ++ u8 bit; ++}; ++ ++static const struct bcm63268_tclk_table_entry bcm63268_timer_clocks[] = { ++ { ++ .name = "ephy1", ++ .bit = BCM63268_TCLK_EPHY1, ++ }, { ++ .name = "ephy2", ++ .bit = BCM63268_TCLK_EPHY2, ++ }, { ++ .name = "ephy3", ++ .bit = BCM63268_TCLK_EPHY3, ++ }, { ++ .name = "gphy1", ++ .bit = BCM63268_TCLK_GPHY1, ++ }, { ++ .name = "dsl", ++ .bit = BCM63268_TCLK_DSL, ++ }, { ++ .name = "wakeon_ephy", ++ .bit = BCM63268_TCLK_WAKEON_EPHY, ++ }, { ++ .name = "wakeon_dsl", ++ .bit = BCM63268_TCLK_WAKEON_DSL, ++ }, { ++ .name = "fap1_pll", ++ .bit = BCM63268_TCLK_FAP1, ++ }, { ++ .name = "fap2_pll", ++ .bit = BCM63268_TCLK_FAP2, ++ }, { ++ .name = "uto_50", ++ .bit = BCM63268_TCLK_UTO_50, ++ }, { ++ .name = "uto_extin", ++ .bit = BCM63268_TCLK_UTO_EXTIN, ++ }, { ++ .name = "usb_ref", ++ .bit = BCM63268_TCLK_USB_REF, ++ }, { ++ /* sentinel */ ++ } ++}; ++ ++static inline struct bcm63268_tclkrst_hw * ++to_bcm63268_timer_reset(struct reset_controller_dev *rcdev) ++{ ++ return container_of(rcdev, struct bcm63268_tclkrst_hw, rcdev); ++} ++ ++static int bcm63268_timer_reset_update(struct reset_controller_dev *rcdev, ++ unsigned long id, bool assert) ++{ ++ struct bcm63268_tclkrst_hw *reset = to_bcm63268_timer_reset(rcdev); ++ unsigned long flags; ++ uint32_t val; ++ ++ spin_lock_irqsave(&reset->lock, flags); ++ val = __raw_readl(reset->regs); ++ if (assert) ++ val &= ~BIT(id); ++ else ++ val |= BIT(id); ++ __raw_writel(val, reset->regs); ++ spin_unlock_irqrestore(&reset->lock, flags); ++ ++ return 0; ++} ++ ++static int bcm63268_timer_reset_assert(struct reset_controller_dev *rcdev, ++ unsigned long id) ++{ ++ return bcm63268_timer_reset_update(rcdev, id, true); ++} ++ ++static int bcm63268_timer_reset_deassert(struct reset_controller_dev *rcdev, ++ unsigned long id) ++{ ++ return bcm63268_timer_reset_update(rcdev, id, false); ++} ++ ++static int bcm63268_timer_reset_reset(struct reset_controller_dev *rcdev, ++ unsigned long id) ++{ ++ bcm63268_timer_reset_update(rcdev, id, true); ++ usleep_range(BCM63268_TIMER_RESET_SLEEP_MIN_US, ++ BCM63268_TIMER_RESET_SLEEP_MAX_US); ++ ++ bcm63268_timer_reset_update(rcdev, id, false); ++ /* ++ * Ensure component is taken out reset state by sleeping also after ++ * deasserting the reset. Otherwise, the component may not be ready ++ * for operation. ++ */ ++ usleep_range(BCM63268_TIMER_RESET_SLEEP_MIN_US, ++ BCM63268_TIMER_RESET_SLEEP_MAX_US); ++ ++ return 0; ++} ++ ++static int bcm63268_timer_reset_status(struct reset_controller_dev *rcdev, ++ unsigned long id) ++{ ++ struct bcm63268_tclkrst_hw *reset = to_bcm63268_timer_reset(rcdev); ++ ++ return !(__raw_readl(reset->regs) & BIT(id)); ++} ++ ++static struct reset_control_ops bcm63268_timer_reset_ops = { ++ .assert = bcm63268_timer_reset_assert, ++ .deassert = bcm63268_timer_reset_deassert, ++ .reset = bcm63268_timer_reset_reset, ++ .status = bcm63268_timer_reset_status, ++}; ++ ++static int bcm63268_tclk_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ const struct bcm63268_tclk_table_entry *entry; ++ struct bcm63268_tclkrst_hw *hw; ++ struct clk_hw *clk; ++ u8 maxbit = 0; ++ int i, ret; ++ ++ for (entry = bcm63268_timer_clocks; entry->name; entry++) ++ maxbit = max(maxbit, entry->bit); ++ maxbit++; ++ ++ hw = devm_kzalloc(&pdev->dev, struct_size(hw, data.hws, maxbit), ++ GFP_KERNEL); ++ if (!hw) ++ return -ENOMEM; ++ ++ platform_set_drvdata(pdev, hw); ++ ++ spin_lock_init(&hw->lock); ++ ++ hw->data.num = maxbit; ++ for (i = 0; i < maxbit; i++) ++ hw->data.hws[i] = ERR_PTR(-ENODEV); ++ ++ hw->regs = devm_platform_ioremap_resource(pdev, 0); ++ if (IS_ERR(hw->regs)) ++ return PTR_ERR(hw->regs); ++ ++ for (entry = bcm63268_timer_clocks; entry->name; entry++) { ++ clk = devm_clk_hw_register_gate(dev, entry->name, NULL, 0, ++ hw->regs, entry->bit, ++ CLK_GATE_BIG_ENDIAN, ++ &hw->lock); ++ if (IS_ERR(clk)) ++ return PTR_ERR(clk); ++ ++ hw->data.hws[entry->bit] = clk; ++ } ++ ++ ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, ++ &hw->data); ++ if (ret) ++ return ret; ++ ++ hw->rcdev.of_node = dev->of_node; ++ hw->rcdev.ops = &bcm63268_timer_reset_ops; ++ ++ ret = devm_reset_controller_register(dev, &hw->rcdev); ++ if (ret) ++ dev_err(dev, "Failed to register reset controller\n"); ++ ++ return 0; ++} ++ ++static const struct of_device_id bcm63268_tclk_dt_ids[] = { ++ { .compatible = "brcm,bcm63268-timer-clocks" }, ++ { /* sentinel */ } ++}; ++ ++static struct platform_driver bcm63268_tclk = { ++ .probe = bcm63268_tclk_probe, ++ .driver = { ++ .name = "bcm63268-timer-clock", ++ .of_match_table = bcm63268_tclk_dt_ids, ++ }, ++}; ++builtin_platform_driver(bcm63268_tclk); diff --git a/target/linux/generic/pending-5.15/860-serial-8250_mtk-track-busclk-state-to-avoid-bus-error.patch b/target/linux/generic/pending-5.15/860-serial-8250_mtk-track-busclk-state-to-avoid-bus-error.patch new file mode 100644 index 0000000000..c5db5d9491 --- /dev/null +++ b/target/linux/generic/pending-5.15/860-serial-8250_mtk-track-busclk-state-to-avoid-bus-error.patch @@ -0,0 +1,61 @@ +From 629c701fc39f1ada9416e0766a86729e83bde86c Mon Sep 17 00:00:00 2001 +Message-ID: <629c701fc39f1ada9416e0766a86729e83bde86c.1694465766.git.daniel@makrotopia.org> +From: Daniel Golle +Date: Mon, 11 Sep 2023 21:27:44 +0100 +Subject: [PATCH] serial: 8250_mtk: track busclk state to avoid bus error +To: Greg Kroah-Hartman , + Jiri Slaby , + Matthias Brugger , + AngeloGioacchino Del Regno , + Daniel Golle , + John Ogness , + Chen-Yu Tsai , + Changqi Hu , + linux-kernel@vger.kernel.org, + linux-serial@vger.kernel.org, + linux-arm-kernel@lists.infradead.org, + linux-mediatek@lists.infradead.org + +Commit e32a83c70cf9 ("serial: 8250-mtk: modify mtk uart power and +clock management") introduced polling a debug register to make sure +the UART is idle before disabling the bus clock. However, at least on +some MediaTek SoCs access to that very debug register requires the bus +clock being enabled. Hence calling the suspend function while already +in suspended state results in that register access triggering a bus +error. In order to avoid that, track the state of the bus clock and +only poll the debug register if not already in suspended state. + +Fixes: e32a83c70cf9 ("serial: 8250-mtk: modify mtk uart power and clock management") +Signed-off-by: Daniel Golle +--- + drivers/tty/serial/8250/8250_mtk.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +--- a/drivers/tty/serial/8250/8250_mtk.c ++++ b/drivers/tty/serial/8250/8250_mtk.c +@@ -32,7 +32,7 @@ + #define MTK_UART_RXTRI_AD 0x14 /* RX Trigger address */ + #define MTK_UART_FRACDIV_L 0x15 /* Fractional divider LSB address */ + #define MTK_UART_FRACDIV_M 0x16 /* Fractional divider MSB address */ +-#define MTK_UART_DEBUG0 0x18 ++#define MTK_UART_DEBUG0 0x18 + #define MTK_UART_IER_XOFFI 0x20 /* Enable XOFF character interrupt */ + #define MTK_UART_IER_RTSI 0x40 /* Enable RTS Modem status interrupt */ + #define MTK_UART_IER_CTSI 0x80 /* Enable CTS Modem status interrupt */ +@@ -418,13 +418,12 @@ static int __maybe_unused mtk8250_runtim + struct mtk8250_data *data = dev_get_drvdata(dev); + struct uart_8250_port *up = serial8250_get_port(data->line); + +- /* wait until UART in idle status */ +- while +- (serial_in(up, MTK_UART_DEBUG0)); +- + if (data->clk_count == 0U) { + dev_dbg(dev, "%s clock count is 0\n", __func__); + } else { ++ /* wait until UART in idle status */ ++ while ++ (serial_in(up, MTK_UART_DEBUG0)); + clk_disable_unprepare(data->bus_clk); + data->clk_count--; + } diff --git a/target/linux/generic/pending-5.15/920-mangle_bootargs.patch b/target/linux/generic/pending-5.15/920-mangle_bootargs.patch new file mode 100644 index 0000000000..2bd7b22296 --- /dev/null +++ b/target/linux/generic/pending-5.15/920-mangle_bootargs.patch @@ -0,0 +1,71 @@ +From: Imre Kaloz +Subject: init: add CONFIG_MANGLE_BOOTARGS and disable it by default + +Enabling this option renames the bootloader supplied root= +and rootfstype= variables, which might have to be know but +would break the automatisms libreCMC uses. + +Signed-off-by: Imre Kaloz +--- + init/Kconfig | 9 +++++++++ + init/main.c | 24 ++++++++++++++++++++++++ + 2 files changed, 33 insertions(+) + +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -1814,6 +1814,15 @@ config EMBEDDED + an embedded system so certain expert options are available + for configuration. + ++config MANGLE_BOOTARGS ++ bool "Rename offending bootargs" ++ depends on EXPERT ++ help ++ Sometimes the bootloader passed bogus root= and rootfstype= ++ parameters to the kernel, and while you want to ignore them, ++ you need to know the values f.e. to support dual firmware ++ layouts on the flash. ++ + config HAVE_PERF_EVENTS + bool + help +--- a/init/main.c ++++ b/init/main.c +@@ -618,6 +618,29 @@ static inline void setup_nr_cpu_ids(void + static inline void smp_prepare_cpus(unsigned int maxcpus) { } + #endif + ++#ifdef CONFIG_MANGLE_BOOTARGS ++static void __init mangle_bootargs(char *command_line) ++{ ++ char *rootdev; ++ char *rootfs; ++ ++ rootdev = strstr(command_line, "root=/dev/mtdblock"); ++ ++ if (rootdev) ++ strncpy(rootdev, "mangled_rootblock=", 18); ++ ++ rootfs = strstr(command_line, "rootfstype"); ++ ++ if (rootfs) ++ strncpy(rootfs, "mangled_fs", 10); ++ ++} ++#else ++static void __init mangle_bootargs(char *command_line) ++{ ++} ++#endif ++ + /* + * We need to store the untouched command line for future reference. + * We also need to store the touched command line since the parameter +@@ -957,6 +980,7 @@ asmlinkage __visible void __init __no_sa + pr_notice("%s", linux_banner); + early_security_init(); + setup_arch(&command_line); ++ mangle_bootargs(command_line); + setup_boot_config(); + setup_command_line(command_line); + setup_nr_cpu_ids(); diff --git a/target/linux/mvebu/Makefile b/target/linux/mvebu/Makefile index 453a927b0b..994098720a 100644 --- a/target/linux/mvebu/Makefile +++ b/target/linux/mvebu/Makefile @@ -9,7 +9,7 @@ BOARDNAME:=Marvell EBU Armada FEATURES:=fpu usb pci pcie gpio nand squashfs ramdisk boot-part rootfs-part legacy-sdcard targz SUBTARGETS:=cortexa9 -KERNEL_PATCHVER:=5.10 +KERNEL_PATCHVER:=5.15 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/mvebu/config-5.10 b/target/linux/mvebu/config-5.10 deleted file mode 100644 index 0bce22daee..0000000000 --- a/target/linux/mvebu/config-5.10 +++ /dev/null @@ -1,426 +0,0 @@ -CONFIG_AHCI_MVEBU=y -CONFIG_ALIGNMENT_TRAP=y -CONFIG_ARCH_32BIT_OFF_T=y -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -CONFIG_ARCH_KEEP_MEMBLOCK=y -CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y -CONFIG_ARCH_MULTIPLATFORM=y -CONFIG_ARCH_MULTI_V6_V7=y -CONFIG_ARCH_MULTI_V7=y -CONFIG_ARCH_MVEBU=y -CONFIG_ARCH_NR_GPIO=0 -CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y -CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARM=y -CONFIG_ARMADA_370_CLK=y -CONFIG_ARMADA_370_XP_IRQ=y -CONFIG_ARMADA_370_XP_TIMER=y -# CONFIG_ARMADA_37XX_WATCHDOG is not set -CONFIG_ARMADA_38X_CLK=y -CONFIG_ARMADA_THERMAL=y -CONFIG_ARMADA_XP_CLK=y -CONFIG_ARM_APPENDED_DTB=y -CONFIG_ARM_ARCH_TIMER=y -CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y -# CONFIG_ARM_ARMADA_37XX_CPUFREQ is not set -# CONFIG_ARM_ARMADA_8K_CPUFREQ is not set -CONFIG_ARM_ATAG_DTB_COMPAT=y -# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER is not set -CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE=y -CONFIG_ARM_CPU_SUSPEND=y -CONFIG_ARM_CRYPTO=y -CONFIG_ARM_ERRATA_720789=y -CONFIG_ARM_ERRATA_764369=y -CONFIG_ARM_GIC=y -CONFIG_ARM_GLOBAL_TIMER=y -CONFIG_ARM_HAS_SG_CHAIN=y -CONFIG_ARM_HEAVY_MB=y -CONFIG_ARM_L1_CACHE_SHIFT=6 -CONFIG_ARM_L1_CACHE_SHIFT_6=y -CONFIG_ARM_MVEBU_V7_CPUIDLE=y -CONFIG_ARM_PATCH_IDIV=y -CONFIG_ARM_PATCH_PHYS_VIRT=y -CONFIG_ARM_THUMB=y -CONFIG_ARM_UNWIND=y -CONFIG_ARM_VIRT_EXT=y -CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y -CONFIG_ATA=y -CONFIG_ATAGS=y -CONFIG_ATA_LEDS=y -CONFIG_AUTO_ZRELADDR=y -CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_NVME=y -CONFIG_BLK_DEV_SD=y -CONFIG_BLK_MQ_PCI=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BOUNCE=y -# CONFIG_CACHE_FEROCEON_L2 is not set -CONFIG_CACHE_L2X0=y -CONFIG_CLKDEV_LOOKUP=y -CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK=y -CONFIG_CLKSRC_MMIO=y -CONFIG_CLONE_BACKWARDS=y -CONFIG_COMMON_CLK=y -CONFIG_COMPAT_32BIT_TIME=y -CONFIG_CPUFREQ_DT=y -CONFIG_CPUFREQ_DT_PLATDEV=y -CONFIG_CPU_32v6K=y -CONFIG_CPU_32v7=y -CONFIG_CPU_ABRT_EV7=y -CONFIG_CPU_CACHE_V7=y -CONFIG_CPU_CACHE_VIPT=y -CONFIG_CPU_COPY_V6=y -CONFIG_CPU_CP15=y -CONFIG_CPU_CP15_MMU=y -CONFIG_CPU_FREQ=y -CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set -CONFIG_CPU_FREQ_GOV_ATTR_SET=y -CONFIG_CPU_FREQ_GOV_COMMON=y -# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set -CONFIG_CPU_FREQ_GOV_ONDEMAND=y -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_GOV_USERSPACE is not set -CONFIG_CPU_FREQ_STAT=y -CONFIG_CPU_HAS_ASID=y -CONFIG_CPU_IDLE=y -CONFIG_CPU_IDLE_GOV_LADDER=y -CONFIG_CPU_PABRT_V7=y -CONFIG_CPU_PJ4B=y -CONFIG_CPU_PM=y -CONFIG_CPU_RMAP=y -CONFIG_CPU_SPECTRE=y -CONFIG_CPU_THERMAL=y -CONFIG_CPU_THUMB_CAPABLE=y -CONFIG_CPU_TLB_V7=y -CONFIG_CPU_V7=y -CONFIG_CRC16=y -CONFIG_CRYPTO_ACOMP2=y -CONFIG_CRYPTO_AES_ARM=y -CONFIG_CRYPTO_AES_ARM_BS=y -CONFIG_CRYPTO_AUTHENC=y -CONFIG_CRYPTO_CRC32=y -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRYPTD=y -CONFIG_CRYPTO_DEFLATE=y -CONFIG_CRYPTO_DES=y -CONFIG_CRYPTO_DEV_MARVELL=y -CONFIG_CRYPTO_DEV_MARVELL_CESA=y -CONFIG_CRYPTO_ESSIV=y -CONFIG_CRYPTO_HASH_INFO=y -CONFIG_CRYPTO_HW=y -CONFIG_CRYPTO_LIB_DES=y -CONFIG_CRYPTO_LZO=y -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_ARM=y -CONFIG_CRYPTO_SHA1_ARM_NEON=y -CONFIG_CRYPTO_SHA256_ARM=y -CONFIG_CRYPTO_SHA512_ARM=y -CONFIG_CRYPTO_SIMD=y -CONFIG_DCACHE_WORD_ACCESS=y -CONFIG_DEBUG_ALIGN_RODATA=y -CONFIG_DEBUG_INFO=y -CONFIG_DEBUG_LL=y -CONFIG_DEBUG_LL_INCLUDE="debug/8250.S" -CONFIG_DEBUG_MVEBU_UART0=y -# CONFIG_DEBUG_MVEBU_UART0_ALTERNATE is not set -# CONFIG_DEBUG_MVEBU_UART1_ALTERNATE is not set -CONFIG_DEBUG_UART_8250=y -CONFIG_DEBUG_UART_8250_SHIFT=2 -CONFIG_DEBUG_UART_PHYS=0xd0012000 -CONFIG_DEBUG_UART_VIRT=0xfec12000 -CONFIG_DEBUG_UNCOMPRESS=y -CONFIG_DEBUG_USER=y -CONFIG_DMADEVICES=y -CONFIG_DMA_ENGINE=y -CONFIG_DMA_ENGINE_RAID=y -CONFIG_DMA_OF=y -CONFIG_DMA_OPS=y -CONFIG_DMA_REMAP=y -CONFIG_DTC=y -CONFIG_EARLY_PRINTK=y -CONFIG_EDAC_ATOMIC_SCRUB=y -CONFIG_EDAC_SUPPORT=y -CONFIG_EXT4_FS=y -CONFIG_EXTCON=y -CONFIG_F2FS_FS=y -CONFIG_FIXED_PHY=y -CONFIG_FIX_EARLYCON_MEM=y -CONFIG_FS_IOMAP=y -CONFIG_FS_MBCACHE=y -CONFIG_FW_LOADER_PAGED_BUF=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_GENERIC_ARCH_TOPOLOGY=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_EARLY_IOREMAP=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_IDLE_POLL_SETUP=y -CONFIG_GENERIC_IRQ_CHIP=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_GENERIC_IRQ_MULTI_HANDLER=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_IRQ_SHOW_LEVEL=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_GENERIC_PHY=y -CONFIG_GENERIC_SCHED_CLOCK=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GENERIC_VDSO_32=y -CONFIG_GLOB=y -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_IRQCHIP=y -CONFIG_GPIO_GENERIC=y -CONFIG_GPIO_GENERIC_PLATFORM=y -CONFIG_GPIO_MVEBU=y -CONFIG_GPIO_PCA953X=y -CONFIG_GPIO_PCA953X_IRQ=y -CONFIG_GRO_CELLS=y -CONFIG_HANDLE_DOMAIN_IRQ=y -CONFIG_HARDEN_BRANCH_PREDICTOR=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_HAS_DMA=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HAVE_SMP=y -CONFIG_HIGHMEM=y -CONFIG_HIGHPTE=y -CONFIG_HOTPLUG_CPU=y -CONFIG_HWBM=y -CONFIG_HWMON=y -CONFIG_HW_RANDOM=y -CONFIG_HZ_FIXED=0 -CONFIG_HZ_PERIODIC=y -CONFIG_I2C=y -CONFIG_I2C_BOARDINFO=y -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_MV64XXX=y -# CONFIG_I2C_PXA is not set -CONFIG_INITRAMFS_SOURCE="" -CONFIG_IRQCHIP=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_IRQ_WORK=y -# CONFIG_IWMMXT is not set -CONFIG_JBD2=y -CONFIG_LEDS_GPIO=y -CONFIG_LEDS_PCA963X=y -CONFIG_LEDS_TLC591XX=y -CONFIG_LEDS_TRIGGER_DISK=y -CONFIG_LIBFDT=y -CONFIG_LOCK_DEBUGGING_SUPPORT=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_LZO_COMPRESS=y -CONFIG_LZO_DECOMPRESS=y -CONFIG_MACH_ARMADA_370=y -# CONFIG_MACH_ARMADA_375 is not set -CONFIG_MACH_ARMADA_38X=y -# CONFIG_MACH_ARMADA_39X is not set -CONFIG_MACH_ARMADA_XP=y -# CONFIG_MACH_DOVE is not set -CONFIG_MACH_MVEBU_ANY=y -CONFIG_MACH_MVEBU_V7=y -CONFIG_MAGIC_SYSRQ=y -CONFIG_MANGLE_BOOTARGS=y -CONFIG_MARVELL_PHY=y -CONFIG_MDIO_BUS=y -CONFIG_MDIO_DEVICE=y -CONFIG_MDIO_I2C=y -CONFIG_MEMFD_CREATE=y -CONFIG_MEMORY=y -CONFIG_MIGHT_HAVE_CACHE_L2X0=y -CONFIG_MIGRATION=y -CONFIG_MMC=y -CONFIG_MMC_BLOCK=y -CONFIG_MMC_MVSDIO=y -CONFIG_MMC_SDHCI=y -# CONFIG_MMC_SDHCI_PCI is not set -CONFIG_MMC_SDHCI_PLTFM=y -CONFIG_MMC_SDHCI_PXAV3=y -CONFIG_MODULES_USE_ELF_REL=y -CONFIG_MTD_CFI_STAA=y -CONFIG_MTD_NAND_CORE=y -CONFIG_MTD_NAND_ECC=y -CONFIG_MTD_NAND_ECC_SW_HAMMING=y -CONFIG_MTD_NAND_MARVELL=y -CONFIG_MTD_RAW_NAND=y -CONFIG_MTD_SPI_NOR=y -CONFIG_MTD_SPLIT_FIRMWARE=y -CONFIG_MTD_UBI=y -CONFIG_MTD_UBI_BEB_LIMIT=20 -CONFIG_MTD_UBI_BLOCK=y -CONFIG_MTD_UBI_WL_THRESHOLD=4096 -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_MVEBU_CLK_COMMON=y -CONFIG_MVEBU_CLK_COREDIV=y -CONFIG_MVEBU_CLK_CPU=y -CONFIG_MVEBU_DEVBUS=y -CONFIG_MVEBU_MBUS=y -CONFIG_MVMDIO=y -CONFIG_MVNETA=y -CONFIG_MVNETA_BM=y -CONFIG_MVNETA_BM_ENABLE=y -# CONFIG_MVPP2 is not set -CONFIG_MV_XOR=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_NEON=y -CONFIG_NET_DEVLINK=y -CONFIG_NET_DSA=y -CONFIG_NET_DSA_MV88E6XXX=y -CONFIG_NET_DSA_MV88E6XXX_GLOBAL2=y -CONFIG_NET_DSA_TAG_DSA=y -CONFIG_NET_DSA_TAG_EDSA=y -CONFIG_NET_FLOW_LIMIT=y -CONFIG_NET_SWITCHDEV=y -CONFIG_NLS=y -CONFIG_NOP_USB_XCEIV=y -CONFIG_NR_CPUS=4 -CONFIG_NVMEM=y -CONFIG_NVME_CORE=y -# CONFIG_NVME_HWMON is not set -# CONFIG_NVME_MULTIPATH is not set -# CONFIG_NVME_TCP is not set -CONFIG_OF=y -CONFIG_OF_ADDRESS=y -CONFIG_OF_EARLY_FLATTREE=y -CONFIG_OF_FLATTREE=y -CONFIG_OF_GPIO=y -CONFIG_OF_IRQ=y -CONFIG_OF_KOBJ=y -CONFIG_OF_MDIO=y -CONFIG_OF_NET=y -CONFIG_OLD_SIGACTION=y -CONFIG_OLD_SIGSUSPEND3=y -CONFIG_ORION_WATCHDOG=y -CONFIG_OUTER_CACHE=y -CONFIG_OUTER_CACHE_SYNC=y -CONFIG_PADATA=y -CONFIG_PAGE_OFFSET=0xC0000000 -CONFIG_PAGE_POOL=y -CONFIG_PCI=y -CONFIG_PCI_BRIDGE_EMUL=y -CONFIG_PCI_DOMAINS=y -CONFIG_PCI_DOMAINS_GENERIC=y -CONFIG_PCI_MSI=y -CONFIG_PCI_MSI_IRQ_DOMAIN=y -CONFIG_PCI_MVEBU=y -CONFIG_PERF_USE_VMALLOC=y -CONFIG_PGTABLE_LEVELS=2 -CONFIG_PHYLIB=y -CONFIG_PHYLINK=y -# CONFIG_PHY_MVEBU_A3700_COMPHY is not set -# CONFIG_PHY_MVEBU_A3700_UTMI is not set -# CONFIG_PHY_MVEBU_A38X_COMPHY is not set -# CONFIG_PHY_MVEBU_CP110_COMPHY is not set -CONFIG_PINCTRL=y -CONFIG_PINCTRL_ARMADA_370=y -CONFIG_PINCTRL_ARMADA_38X=y -CONFIG_PINCTRL_ARMADA_XP=y -CONFIG_PINCTRL_MVEBU=y -# CONFIG_PINCTRL_SINGLE is not set -CONFIG_PJ4B_ERRATA_4742=y -CONFIG_PL310_ERRATA_753970=y -CONFIG_PLAT_ORION=y -CONFIG_PM_OPP=y -CONFIG_POWER_RESET=y -CONFIG_POWER_RESET_GPIO=y -CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=11 -CONFIG_PWM=y -CONFIG_PWM_SYSFS=y -CONFIG_RATIONAL=y -CONFIG_REGMAP=y -CONFIG_REGMAP_I2C=y -CONFIG_REGMAP_MMIO=y -CONFIG_REGULATOR=y -CONFIG_REGULATOR_FIXED_VOLTAGE=y -CONFIG_RFS_ACCEL=y -CONFIG_RPS=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_DRV_ARMADA38X=y -# CONFIG_RTC_DRV_MV is not set -CONFIG_RTC_I2C_AND_SPI=y -CONFIG_RTC_MC146818_LIB=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -CONFIG_SATA_AHCI_PLATFORM=y -CONFIG_SATA_HOST=y -CONFIG_SATA_MV=y -CONFIG_SATA_PMP=y -CONFIG_SCSI=y -CONFIG_SENSORS_PWM_FAN=y -CONFIG_SENSORS_TMP421=y -CONFIG_SERIAL_8250_DW=y -CONFIG_SERIAL_8250_DWLIB=y -CONFIG_SERIAL_8250_FSL=y -CONFIG_SERIAL_MCTRL_GPIO=y -CONFIG_SERIAL_MVEBU_CONSOLE=y -CONFIG_SERIAL_MVEBU_UART=y -CONFIG_SFP=y -CONFIG_SGL_ALLOC=y -CONFIG_SG_POOL=y -CONFIG_SMP=y -CONFIG_SMP_ON_UP=y -CONFIG_SOC_BUS=y -CONFIG_SPARSE_IRQ=y -CONFIG_SPI=y -# CONFIG_SPI_ARMADA_3700 is not set -CONFIG_SPI_MASTER=y -CONFIG_SPI_MEM=y -CONFIG_SPI_ORION=y -CONFIG_SRAM=y -CONFIG_SRAM_EXEC=y -CONFIG_SRCU=y -CONFIG_SWPHY=y -CONFIG_SWP_EMULATE=y -CONFIG_SYS_SUPPORTS_APM_EMULATION=y -CONFIG_THERMAL=y -CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y -CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 -CONFIG_THERMAL_GOV_STEP_WISE=y -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_OF=y -CONFIG_TICK_CPU_ACCOUNTING=y -CONFIG_TIMER_OF=y -CONFIG_TIMER_PROBE=y -CONFIG_TREE_RCU=y -CONFIG_TREE_SRCU=y -CONFIG_UBIFS_FS=y -CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" -CONFIG_UNWINDER_ARM=y -CONFIG_USB=y -CONFIG_USB_COMMON=y -CONFIG_USB_EHCI_HCD=y -CONFIG_USB_EHCI_HCD_ORION=y -CONFIG_USB_EHCI_HCD_PLATFORM=y -CONFIG_USB_LEDS_TRIGGER_USBPORT=y -CONFIG_USB_PHY=y -CONFIG_USB_STORAGE=y -CONFIG_USB_SUPPORT=y -CONFIG_USB_XHCI_HCD=y -CONFIG_USB_XHCI_MVEBU=y -CONFIG_USB_XHCI_PLATFORM=y -CONFIG_USE_OF=y -CONFIG_VFP=y -CONFIG_VFPv3=y -CONFIG_WATCHDOG_CORE=y -CONFIG_XPS=y -CONFIG_XZ_DEC_ARM=y -CONFIG_XZ_DEC_BCJ=y -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZLIB_DEFLATE=y -CONFIG_ZLIB_INFLATE=y diff --git a/target/linux/mvebu/config-5.15 b/target/linux/mvebu/config-5.15 new file mode 100644 index 0000000000..0811ee6d4c --- /dev/null +++ b/target/linux/mvebu/config-5.15 @@ -0,0 +1,435 @@ +CONFIG_AHCI_MVEBU=y +CONFIG_ALIGNMENT_TRAP=y +CONFIG_ARCH_32BIT_OFF_T=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +CONFIG_ARCH_MULTIPLATFORM=y +CONFIG_ARCH_MULTI_V6_V7=y +CONFIG_ARCH_MULTI_V7=y +CONFIG_ARCH_MVEBU=y +CONFIG_ARCH_NR_GPIO=0 +CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y +CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARM=y +CONFIG_ARMADA_370_CLK=y +CONFIG_ARMADA_370_XP_IRQ=y +CONFIG_ARMADA_370_XP_TIMER=y +# CONFIG_ARMADA_37XX_WATCHDOG is not set +CONFIG_ARMADA_38X_CLK=y +CONFIG_ARMADA_THERMAL=y +CONFIG_ARMADA_XP_CLK=y +CONFIG_ARM_APPENDED_DTB=y +# CONFIG_ARM_ARMADA_37XX_CPUFREQ is not set +# CONFIG_ARM_ARMADA_8K_CPUFREQ is not set +CONFIG_ARM_ATAG_DTB_COMPAT=y +# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER is not set +CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE=y +CONFIG_ARM_CPU_SUSPEND=y +CONFIG_ARM_CRYPTO=y +CONFIG_ARM_ERRATA_720789=y +CONFIG_ARM_ERRATA_764369=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GLOBAL_TIMER=y +CONFIG_ARM_GT_INITIAL_PRESCALER_VAL=1 +CONFIG_ARM_HAS_SG_CHAIN=y +CONFIG_ARM_HEAVY_MB=y +CONFIG_ARM_L1_CACHE_SHIFT=6 +CONFIG_ARM_L1_CACHE_SHIFT_6=y +CONFIG_ARM_MVEBU_V7_CPUIDLE=y +CONFIG_ARM_PATCH_IDIV=y +CONFIG_ARM_PATCH_PHYS_VIRT=y +CONFIG_ARM_THUMB=y +CONFIG_ARM_UNWIND=y +CONFIG_ARM_VIRT_EXT=y +CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y +CONFIG_ATA=y +CONFIG_ATAGS=y +CONFIG_ATA_LEDS=y +CONFIG_AUTO_ZRELADDR=y +CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_NVME=y +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_MQ_PCI=y +CONFIG_BOUNCE=y +# CONFIG_CACHE_FEROCEON_L2 is not set +CONFIG_CACHE_L2X0=y +CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK=y +CONFIG_CLKSRC_MMIO=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_COMMON_CLK=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_CPU_32v6K=y +CONFIG_CPU_32v7=y +CONFIG_CPU_ABRT_EV7=y +CONFIG_CPU_CACHE_V7=y +CONFIG_CPU_CACHE_VIPT=y +CONFIG_CPU_COPY_V6=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_HAS_ASID=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_PABRT_V7=y +CONFIG_CPU_PJ4B=y +CONFIG_CPU_PM=y +CONFIG_CPU_RMAP=y +CONFIG_CPU_SPECTRE=y +CONFIG_CPU_THERMAL=y +CONFIG_CPU_THUMB_CAPABLE=y +CONFIG_CPU_TLB_V7=y +CONFIG_CPU_V7=y +CONFIG_CRC16=y +CONFIG_CRYPTO_AES_ARM=y +CONFIG_CRYPTO_AES_ARM_BS=y +CONFIG_CRYPTO_AUTHENC=y +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_DEFLATE=y +CONFIG_CRYPTO_DES=y +CONFIG_CRYPTO_DEV_MARVELL=y +CONFIG_CRYPTO_DEV_MARVELL_CESA=y +CONFIG_CRYPTO_ESSIV=y +CONFIG_CRYPTO_HASH_INFO=y +CONFIG_CRYPTO_HW=y +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA1_ARM=y +CONFIG_CRYPTO_SHA1_ARM_NEON=y +CONFIG_CRYPTO_SHA256_ARM=y +CONFIG_CRYPTO_SHA512_ARM=y +CONFIG_CRYPTO_SIMD=y +CONFIG_CRYPTO_ZSTD=y +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_DEBUG_ALIGN_RODATA=y +CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_LL=y +CONFIG_DEBUG_LL_INCLUDE="debug/8250.S" +CONFIG_DEBUG_MVEBU_UART0=y +# CONFIG_DEBUG_MVEBU_UART0_ALTERNATE is not set +# CONFIG_DEBUG_MVEBU_UART1_ALTERNATE is not set +CONFIG_DEBUG_UART_8250=y +CONFIG_DEBUG_UART_8250_SHIFT=2 +CONFIG_DEBUG_UART_PHYS=0xd0012000 +CONFIG_DEBUG_UART_VIRT=0xfec12000 +CONFIG_DEBUG_UNCOMPRESS=y +CONFIG_DEBUG_USER=y +CONFIG_DMADEVICES=y +CONFIG_DMA_ENGINE=y +CONFIG_DMA_ENGINE_RAID=y +CONFIG_DMA_OF=y +CONFIG_DMA_OPS=y +CONFIG_DMA_REMAP=y +CONFIG_DTC=y +CONFIG_EARLY_PRINTK=y +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_EXT4_FS=y +CONFIG_EXTCON=y +CONFIG_F2FS_FS=y +CONFIG_FIXED_PHY=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_FS_IOMAP=y +CONFIG_FS_MBCACHE=y +CONFIG_FWNODE_MDIO=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_GENERIC_ARCH_TOPOLOGY=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_GENERIC_EARLY_IOREMAP=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_IRQ_MULTI_HANDLER=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_PHY=y +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_VDSO_32=y +CONFIG_GLOB=y +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_IRQCHIP=y +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_GENERIC=y +CONFIG_GPIO_GENERIC_PLATFORM=y +CONFIG_GPIO_MVEBU=y +CONFIG_GPIO_PCA953X=y +CONFIG_GPIO_PCA953X_IRQ=y +CONFIG_GRO_CELLS=y +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_HARDEN_BRANCH_PREDICTOR=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAVE_SMP=y +CONFIG_HIGHMEM=y +CONFIG_HIGHPTE=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HWBM=y +CONFIG_HWMON=y +CONFIG_HW_RANDOM=y +CONFIG_HZ_FIXED=0 +CONFIG_HZ_PERIODIC=y +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MV64XXX=y +# CONFIG_I2C_PXA is not set +CONFIG_INITRAMFS_SOURCE="" +CONFIG_IRQCHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_WORK=y +# CONFIG_IWMMXT is not set +CONFIG_JBD2=y +CONFIG_KMAP_LOCAL=y +CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_PCA963X=y +CONFIG_LEDS_TLC591XX=y +CONFIG_LEDS_TRIGGER_DISK=y +CONFIG_LIBFDT=y +CONFIG_LOCK_DEBUGGING_SUPPORT=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_MACH_ARMADA_370=y +# CONFIG_MACH_ARMADA_375 is not set +CONFIG_MACH_ARMADA_38X=y +# CONFIG_MACH_ARMADA_39X is not set +CONFIG_MACH_ARMADA_XP=y +# CONFIG_MACH_DOVE is not set +CONFIG_MACH_MVEBU_ANY=y +CONFIG_MACH_MVEBU_V7=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_MANGLE_BOOTARGS=y +CONFIG_MARVELL_PHY=y +CONFIG_MDIO_BUS=y +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_DEVRES=y +CONFIG_MDIO_I2C=y +CONFIG_MEMFD_CREATE=y +CONFIG_MEMORY=y +CONFIG_MIGHT_HAVE_CACHE_L2X0=y +CONFIG_MIGRATION=y +CONFIG_MMC=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_MVSDIO=y +CONFIG_MMC_SDHCI=y +# CONFIG_MMC_SDHCI_PCI is not set +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_PXAV3=y +CONFIG_MODULES_USE_ELF_REL=y +CONFIG_MTD_CFI_STAA=y +CONFIG_MTD_NAND_CORE=y +CONFIG_MTD_NAND_ECC=y +CONFIG_MTD_NAND_ECC_SW_HAMMING=y +CONFIG_MTD_NAND_MARVELL=y +CONFIG_MTD_RAW_NAND=y +CONFIG_MTD_SPI_NOR=y +CONFIG_MTD_SPLIT_FIRMWARE=y +CONFIG_MTD_UBI=y +CONFIG_MTD_UBI_BEB_LIMIT=20 +CONFIG_MTD_UBI_BLOCK=y +CONFIG_MTD_UBI_WL_THRESHOLD=4096 +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_MVEBU_CLK_COMMON=y +CONFIG_MVEBU_CLK_COREDIV=y +CONFIG_MVEBU_CLK_CPU=y +CONFIG_MVEBU_DEVBUS=y +CONFIG_MVEBU_MBUS=y +CONFIG_MVMDIO=y +CONFIG_MVNETA=y +CONFIG_MVNETA_BM=y +CONFIG_MVNETA_BM_ENABLE=y +# CONFIG_MVPP2 is not set +CONFIG_MV_XOR=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEON=y +CONFIG_NET_DEVLINK=y +CONFIG_NET_DSA=y +CONFIG_NET_DSA_MV88E6XXX=y +CONFIG_NET_DSA_TAG_DSA=y +CONFIG_NET_DSA_TAG_DSA_COMMON=y +CONFIG_NET_DSA_TAG_EDSA=y +CONFIG_NET_FLOW_LIMIT=y +CONFIG_NET_SELFTESTS=y +CONFIG_NET_SWITCHDEV=y +CONFIG_NLS=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_NR_CPUS=4 +CONFIG_NVMEM=y +CONFIG_NVME_CORE=y +# CONFIG_NVME_HWMON is not set +# CONFIG_NVME_MULTIPATH is not set +CONFIG_OF=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_FLATTREE=y +CONFIG_OF_GPIO=y +CONFIG_OF_IRQ=y +CONFIG_OF_KOBJ=y +CONFIG_OF_MDIO=y +CONFIG_OLD_SIGACTION=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_ORION_WATCHDOG=y +CONFIG_OUTER_CACHE=y +CONFIG_OUTER_CACHE_SYNC=y +CONFIG_PADATA=y +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_PAGE_POOL=y +CONFIG_PCI=y +CONFIG_PCI_BRIDGE_EMUL=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DOMAINS_GENERIC=y +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCI_MVEBU=y +CONFIG_PERF_USE_VMALLOC=y +CONFIG_PGTABLE_LEVELS=2 +CONFIG_PHYLIB=y +CONFIG_PHYLINK=y +# CONFIG_PHY_MVEBU_A3700_COMPHY is not set +# CONFIG_PHY_MVEBU_A3700_UTMI is not set +# CONFIG_PHY_MVEBU_A38X_COMPHY is not set +# CONFIG_PHY_MVEBU_CP110_COMPHY is not set +# CONFIG_PHY_MVEBU_CP110_UTMI is not set +CONFIG_PINCTRL=y +CONFIG_PINCTRL_ARMADA_370=y +CONFIG_PINCTRL_ARMADA_38X=y +CONFIG_PINCTRL_ARMADA_XP=y +CONFIG_PINCTRL_MVEBU=y +# CONFIG_PINCTRL_SINGLE is not set +CONFIG_PJ4B_ERRATA_4742=y +CONFIG_PL310_ERRATA_753970=y +CONFIG_PLAT_ORION=y +CONFIG_PM_OPP=y +CONFIG_POWER_RESET=y +CONFIG_POWER_RESET_GPIO=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y +CONFIG_PWM=y +CONFIG_PWM_SYSFS=y +CONFIG_RATIONAL=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_RFS_ACCEL=y +CONFIG_RPS=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_ARMADA38X=y +# CONFIG_RTC_DRV_MV is not set +CONFIG_RTC_I2C_AND_SPI=y +CONFIG_RTC_MC146818_LIB=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_SATA_AHCI_PLATFORM=y +CONFIG_SATA_HOST=y +CONFIG_SATA_MV=y +CONFIG_SATA_PMP=y +CONFIG_SCSI=y +CONFIG_SCSI_COMMON=y +CONFIG_SENSORS_PWM_FAN=y +CONFIG_SENSORS_TMP421=y +CONFIG_SERIAL_8250_DW=y +CONFIG_SERIAL_8250_DWLIB=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_MVEBU_CONSOLE=y +CONFIG_SERIAL_MVEBU_UART=y +CONFIG_SFP=y +CONFIG_SGL_ALLOC=y +CONFIG_SG_POOL=y +CONFIG_SMP=y +CONFIG_SMP_ON_UP=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_SOC_BUS=y +CONFIG_SPARSE_IRQ=y +CONFIG_SPI=y +# CONFIG_SPI_ARMADA_3700 is not set +CONFIG_SPI_MASTER=y +CONFIG_SPI_MEM=y +CONFIG_SPI_ORION=y +CONFIG_SRAM=y +CONFIG_SRAM_EXEC=y +CONFIG_SRCU=y +CONFIG_SWPHY=y +CONFIG_SWP_EMULATE=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_THERMAL=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_OF=y +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_TREE_RCU=y +CONFIG_TREE_SRCU=y +CONFIG_UBIFS_FS=y +CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" +CONFIG_UNWINDER_ARM=y +CONFIG_USB=y +CONFIG_USB_COMMON=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD_ORION=y +CONFIG_USB_EHCI_HCD_PLATFORM=y +CONFIG_USB_LEDS_TRIGGER_USBPORT=y +CONFIG_USB_PHY=y +CONFIG_USB_STORAGE=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_MVEBU=y +CONFIG_USB_XHCI_PLATFORM=y +CONFIG_USE_OF=y +CONFIG_VFP=y +CONFIG_VFPv3=y +CONFIG_WATCHDOG_CORE=y +CONFIG_XPS=y +CONFIG_XXHASH=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_BCJ=y +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZLIB_DEFLATE=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZSTD_COMPRESS=y +CONFIG_ZSTD_DECOMPRESS=y diff --git a/target/linux/mvebu/cortexa9/base-files/etc/board.d/02_network b/target/linux/mvebu/cortexa9/base-files/etc/board.d/02_network index c613a3cd60..9db29d52df 100644 --- a/target/linux/mvebu/cortexa9/base-files/etc/board.d/02_network +++ b/target/linux/mvebu/cortexa9/base-files/etc/board.d/02_network @@ -18,6 +18,9 @@ mvebu_setup_interfaces() cznic,turris-omnia) ucidef_set_interfaces_lan_wan "lan0 lan1 lan2 lan3 lan4" "eth2" ;; + fortinet,fg-50e) + ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 lan5" "eth1 eth2" + ;; iptime,nas1dual) ucidef_set_interface_lan "eth0 eth1" "dhcp" ;; @@ -61,6 +64,7 @@ mvebu_setup_macs() local label_mac="" case "$board" in + buffalo,ls220de|\ buffalo,ls421de) lan_mac=$(mtd_get_mac_ascii u-boot-env eth1addr) ;; diff --git a/target/linux/mvebu/cortexa9/base-files/lib/upgrade/fortinet.sh b/target/linux/mvebu/cortexa9/base-files/lib/upgrade/fortinet.sh new file mode 100644 index 0000000000..a2742aa374 --- /dev/null +++ b/target/linux/mvebu/cortexa9/base-files/lib/upgrade/fortinet.sh @@ -0,0 +1,54 @@ +. /lib/functions.sh + +fortinet_fwinfo_blocks() { + local fwinfo_mtd="$(find_mtd_part firmware-info)" + local offset="$1" + local len="$2" + local blks + + if [ -z "$fwinfo_mtd" ]; then + echo "WARN: MTD device \"firmware-info\" not found" + return 1 + fi + + blks=$((len / 0x200)) + [ $((len % 0x200)) -gt 0 ] && blks=$((blks + 1)) + blks=$(printf "%04x" $blks) + printf "fwinfo: offset-> 0x%x, blocks-> 0x%s (len: 0x%08x)\n" \ + $offset $blks $len + + printf "\x${blks:2:2}\x${blks:0:2}" | \ + dd bs=2 count=1 seek=$((offset / 2)) conv=notrunc of=${fwinfo_mtd} +} + +fortinet_do_upgrade() { + local board_dir="$(tar tf "$1" | grep -m 1 '^sysupgrade-.*/$')" + local kern_mtd="$(find_mtd_part kernel)" + local root_mtd="$(find_mtd_part rootfs)" + local kern_len root_len + + board_dir="${board_dir%/}" + + if [ -z "$kern_mtd" ] || [ -z "$root_mtd" ]; then + echo "ERROR: MTD device \"kernel\" or \"rootfs\" not found" + umount -a + reboot -f + fi + + kern_len=$( (tar xOf "$1" "$board_dir/kernel" | wc -c) 2> /dev/null) + root_len=$( (tar xOf "$1" "$board_dir/root" | wc -c) 2> /dev/null) + + if [ -z "$kern_len" ] || [ -z "$root_len" ]; then + echo "ERROR: failed to get length of new kernel or rootfs" + umount -a + reboot -f + fi + + fortinet_fwinfo_blocks "0x184" "$kern_len" + fortinet_fwinfo_blocks "0x18c" "$root_len" + + tar xOf "$1" "$board_dir/kernel" | \ + mtd write - "kernel" + tar xOf "$1" "$board_dir/root" | \ + mtd ${UPGRADE_BACKUP:+-j "${UPGRADE_BACKUP}"} write - "rootfs" +} diff --git a/target/linux/mvebu/cortexa9/base-files/lib/upgrade/linksys.sh b/target/linux/mvebu/cortexa9/base-files/lib/upgrade/linksys.sh index 826bf8c9b5..d4222a3f31 100644 --- a/target/linux/mvebu/cortexa9/base-files/lib/upgrade/linksys.sh +++ b/target/linux/mvebu/cortexa9/base-files/lib/upgrade/linksys.sh @@ -8,7 +8,7 @@ linksys_get_target_firmware() { cur_boot_part=$(/usr/sbin/fw_printenv -n boot_part) if [ -z "${cur_boot_part}" ] ; then - mtd_ubi0=$(cat /sys/devices/virtual/ubi/ubi0/mtd_num) + mtd_ubi0=$(cat /sys/class/ubi/ubi0/mtd_num) case $(grep -E ^mtd${mtd_ubi0}: /proc/mtd | cut -d '"' -f 2) in kernel1|rootfs1) cur_boot_part=1 @@ -68,7 +68,12 @@ platform_do_upgrade_linksys() { CI_UBIPART="rootfs2" fi - nand_upgrade_tar "$1" + if nand_upgrade_tar "$1" ; then + nand_do_upgrade_success + else + nand_do_upgrade_failed + fi + } [ "$magic_long" = "27051956" -o "$magic_long" = "0000a0e1" ] && { get_image "$1" | mtd write - $part_label diff --git a/target/linux/mvebu/cortexa9/base-files/lib/upgrade/platform.sh b/target/linux/mvebu/cortexa9/base-files/lib/upgrade/platform.sh index 18b978d437..fbbb68e05e 100755 --- a/target/linux/mvebu/cortexa9/base-files/lib/upgrade/platform.sh +++ b/target/linux/mvebu/cortexa9/base-files/lib/upgrade/platform.sh @@ -25,6 +25,13 @@ platform_check_image() { platform_do_upgrade() { case "$(board_name)" in + buffalo,ls220de) + # Kernel UBI volume name must be "boot" + CI_KERNPART=boot + CI_KERN_UBIPART=ubi_kernel + CI_ROOT_UBIPART=ubi + nand_do_upgrade "$1" + ;; buffalo,ls421de) nand_do_upgrade "$1" ;; @@ -45,6 +52,9 @@ platform_do_upgrade() { solidrun,clearfog-pro-a1) legacy_sdcard_do_upgrade "$1" ;; + fortinet,fg-50e) + fortinet_do_upgrade "$1" + ;; linksys,wrt1200ac|\ linksys,wrt1900ac-v1|\ linksys,wrt1900ac-v2|\ diff --git a/target/linux/mvebu/cortexa9/config-5.10 b/target/linux/mvebu/cortexa9/config-5.10 deleted file mode 100644 index aff95995ce..0000000000 --- a/target/linux/mvebu/cortexa9/config-5.10 +++ /dev/null @@ -1,4 +0,0 @@ -CONFIG_CRYPTO_BLAKE2S=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_PHY_MVEBU_A38X_COMPHY=y -CONFIG_RTC_DRV_MV=y diff --git a/target/linux/mvebu/cortexa9/config-5.15 b/target/linux/mvebu/cortexa9/config-5.15 new file mode 100644 index 0000000000..88a2f14c02 --- /dev/null +++ b/target/linux/mvebu/cortexa9/config-5.15 @@ -0,0 +1,3 @@ +CONFIG_LED_TRIGGER_PHY=y +CONFIG_PHY_MVEBU_A38X_COMPHY=y +CONFIG_RTC_DRV_MV=y diff --git a/target/linux/mvebu/files/arch/arm/boot/dts/armada-370-buffalo-ls220de.dts b/target/linux/mvebu/files/arch/arm/boot/dts/armada-370-buffalo-ls220de.dts new file mode 100644 index 0000000000..3de9ac5473 --- /dev/null +++ b/target/linux/mvebu/files/arch/arm/boot/dts/armada-370-buffalo-ls220de.dts @@ -0,0 +1,380 @@ +// SPDX-License-Identifier: (GPL-2.0-or-later OR MIT) +/* + * Device Tree file for Buffalo LinkStation LS220DE + * + * Copyright (C) 2023 Daniel González Cabanelas + */ + +/dts-v1/; + +#include "armada-370.dtsi" +#include "mvebu-linkstation-fan.dtsi" +#include +#include +#include +#include + +/ { + model = "Buffalo LinkStation LS220DE"; + compatible = "buffalo,ls220de", "marvell,armada370", "marvell,armada-370-xp"; + + aliases { + led-boot = &led_boot; + led-failsafe = &led_failsafe; + led-running = &led_power; + led-upgrade = &led_upgrade; + }; + + chosen { + bootargs = "earlycon"; + stdout-path = "serial0:115200n8"; + append-rootblock = "nullparameter="; /* override the bootloader args */ + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x10000000>; /* 256 MB */ + }; + + soc { + ranges = ; + }; + + system_fan: gpio_fan { + gpios = <&gpio0 13 GPIO_ACTIVE_HIGH + &gpio0 14 GPIO_ACTIVE_HIGH>; + alarm-gpios = <&gpio0 10 GPIO_ACTIVE_HIGH>; + + #cooling-cells = <2>; + }; + + thermal-zones { + hdd-thermal { + polling-delay = <20000>; + polling-delay-passive = <2000>; + + thermal-sensors = <&hdd0_temp>; /* only one drivetemp sensor is supported */ + + trips { + hdd_alert1: trip1 { + temperature = <34000>; + hysteresis = <2000>; + type = "active"; + }; + hdd_alert2: trip2 { + temperature = <40000>; + hysteresis = <2000>; + type = "active"; + }; + hdd_alert3: trip3 { + temperature = <45000>; + hysteresis = <2000>; + type = "passive"; + }; + hdd_hot { + temperature = <50000>; + hysteresis = <2000>; + type = "hot"; + }; + hdd_crit { + temperature = <60000>; + hysteresis = <2000>; + type = "critical"; + }; + }; + + cooling-maps { + map1 { + trip = <&hdd_alert1>; + cooling-device = <&system_fan THERMAL_NO_LIMIT 1>; + }; + map2 { + trip = <&hdd_alert2>; + cooling-device = <&system_fan 2 2>; + }; + map3 { + trip = <&hdd_alert3>; + cooling-device = <&system_fan 3 THERMAL_NO_LIMIT>; + }; + }; + }; + }; + + gpio_keys { + compatible = "gpio-keys"; + pinctrl-0 = <&pmx_buttons>; + pinctrl-names = "default"; + + power { + label = "Power Switch"; + linux,code = ; + linux,input-type = ; + gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; + }; + + function { + label = "Function Button"; + linux,code = ; + gpios = <&gpio0 16 GPIO_ACTIVE_LOW>; + }; + }; + + gpio_leds { + compatible = "gpio-leds"; + pinctrl-names = "default"; + pinctrl-0 = <&pmx_leds1 &pmx_leds2>; + + indicator_red { + function = LED_FUNCTION_INDICATOR; + color = ; + gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>; + panic-indicator; + }; + + led_power: power_white { + label = "white:power"; + function = LED_FUNCTION_POWER; + color = ; + gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>; + default-state = "on"; + }; + + led_failsafe: power_red { + label = "red:power"; + function = LED_FUNCTION_POWER; + color = ; + gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>; + }; + + led_upgrade: power_orange { + label = "amber:power"; + function = LED_FUNCTION_POWER; + color = ; + gpios = <&gpio1 25 GPIO_ACTIVE_HIGH>; + }; + + led_boot: indicator_white { + label = "white:indicator"; + function = LED_FUNCTION_INDICATOR; + color = ; + gpios = <&gpio1 27 GPIO_ACTIVE_HIGH>; + }; + + hdd1_red { + function = LED_FUNCTION_DISK; + color = ; + gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "ata1"; + function-enumerator = <1>; + }; + + hdd2_red { + function = LED_FUNCTION_DISK; + color = ; + gpios = <&gpio1 30 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "ata2"; + function-enumerator = <2>; + }; + }; + + regulators { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <0>; + pinctrl-0 = <&pmx_power_hdd1 &pmx_power_hdd2>; + pinctrl-names = "default"; + + sata1_power: regulator@1 { + compatible = "regulator-fixed"; + reg = <1>; + regulator-name = "HDD1"; + regulator-min-microvolt = <12000000>; + regulator-max-microvolt = <12000000>; + startup-delay-us = <2000000>; + enable-active-high; + regulator-always-on; + regulator-boot-on; + gpio = <&gpio0 8 GPIO_ACTIVE_HIGH>; + }; + + sata2_power: regulator@2 { + compatible = "regulator-fixed"; + reg = <2>; + regulator-name = "HDD2"; + regulator-min-microvolt = <12000000>; + regulator-max-microvolt = <12000000>; + startup-delay-us = <4000000>; + enable-active-high; + regulator-always-on; + regulator-boot-on; + gpio = <&gpio0 2 GPIO_ACTIVE_HIGH>; + }; + }; +}; + +&coherencyfab { + broken-idle; +}; + +ð1 { + pinctrl-0 = <&ge1_rgmii_pins>; + pinctrl-names = "default"; + status = "okay"; + phy-handle = <ðphy0>; + phy-connection-type = "rgmii-id"; +}; + +&mdio { + pinctrl-0 = <&mdio_pins>; + pinctrl-names = "default"; + + ethphy0: ethernet-phy@0 { /* Marvell 88E1318 */ + reg = <0>; + marvell,reg-init = <0x3 0x10 0xf000 0x091A>, /* LED function */ + <0x3 0x11 0x0000 0x4401>, /* LED polarity */ + <0x3 0x12 0x0000 0x4905>; /* LED timer */ + #thermal-sensor-cells = <0>; + }; +}; + +&nand_controller { + status = "okay"; + + nand@0 { + reg = <0>; + label = "pxa3xx_nand-0"; + nand-rb = <0>; + marvell,nand-keep-config; + nand-on-flash-bbt; + nand-ecc-strength = <4>; + nand-ecc-step-size = <512>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "ubi_kernel"; + reg = <0x00000000 0x02000000>; /* 32 MiB */ + }; + + partition@2000000 { + label = "ubi"; + reg = <0x02000000 0x1df00000>; /* 479 MiB */ + }; + }; + }; +}; + +&sata { + nr-ports = <2>; + status = "okay"; + #address-cells = <1>; + #size-cells = <0>; + + hdd0_temp: sata-port@0 { + reg = <0>; + #thermal-sensor-cells = <0>; + }; + + hdd1_temp: sata-port@1 { + reg = <1>; + #thermal-sensor-cells = <0>; + }; +}; + +&spi0 { + status = "okay"; + pinctrl-0 = <&spi0_pins2>; + pinctrl-names = "default"; + + spi-flash@0 { + compatible = "mxicy,mx25l8005", "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <50000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + reg = <0x00000 0xf0000>; /* 960 KiB*/ + label = "u-boot"; + read-only; + }; + partition@f0000 { + reg = <0xf0000 0x10000>; /* 64 KiB */ + label = "u-boot-env"; + }; + }; + }; +}; + +&pmsu { + pinctrl-0 = <&pmx_power_cpu>; + pinctrl-names = "default"; +}; + +&uart0 { + status = "okay"; +}; + +&usb0 { + status = "okay"; +}; + +&pinctrl { + pmx_power_hdd2: pmx-power-hdd2 { + marvell,pins = "mpp2"; + marvell,function = "gpio"; + }; + + pmx_power_cpu: pmx-power-cpu { + marvell,pins = "mpp4"; + marvell,function = "vdd"; + }; + + pmx_power_hdd1: pmx-power-hdd1 { + marvell,pins = "mpp8"; + marvell,function = "gpio"; + }; + + pmx_fan_lock: pmx-fan-lock { + marvell,pins = "mpp10"; + marvell,function = "gpio"; + }; + + pmx_hdd_present: pmx-hdd-present { + marvell,pins = "mpp11", "mpp12"; + marvell,function = "gpio"; + }; + + pmx_fan_high: pmx-fan-high { + marvell,pins = "mpp13"; + marvell,function = "gpio"; + }; + + pmx_fan_low: pmx-fan-low { + marvell,pins = "mpp14"; + marvell,function = "gpio"; + }; + + pmx_buttons: pmx-buttons { + marvell,pins = "mpp15", "mpp16"; + marvell,function = "gpio"; + }; + + pmx_leds1: pmx-leds { + marvell,pins = "mpp7", "mpp54", "mpp59", "mpp61"; + marvell,function = "gpo"; + }; + + pmx_leds2: pmx-leds { + marvell,pins = "mpp55", "mpp57", "mpp62"; + marvell,function = "gpio"; + }; +}; diff --git a/target/linux/mvebu/files/arch/arm/boot/dts/armada-385-fortinet-fg-50e.dts b/target/linux/mvebu/files/arch/arm/boot/dts/armada-385-fortinet-fg-50e.dts new file mode 100644 index 0000000000..dba215de3e --- /dev/null +++ b/target/linux/mvebu/files/arch/arm/boot/dts/armada-385-fortinet-fg-50e.dts @@ -0,0 +1,507 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +/dts-v1/; + +#include +#include +#include +#include "armada-385.dtsi" + +/ { + model = "Fortinet FortiGate 50E"; + compatible = "fortinet,fg-50e", "marvell,armada385", "marvell,armada380"; + + aliases { + led-boot = &led_status_green; + led-failsafe = &led_status_red; + led-running = &led_status_green; + led-upgrade = &led_status_green; + label-mac-device = ð0; + }; + + chosen { + stdout-path = "serial0:9600n8"; + }; + + memory@0 { + device_type = "memory"; + reg = <0x00000000 0x80000000>; /* 2GB */ + }; + + soc { + ranges = ; + }; + + gpio-keys { + compatible = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <&pmx_gpio_keys_pins>; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio1 22 GPIO_ACTIVE_LOW>; + }; + }; + + gpio-leds { + compatible = "gpio-leds"; + pinctrl-names = "default"; + pinctrl-0 = <&pmx_gpio_leds_pins>; + + led-0 { + label = "red:alarm"; + gpios = <&gpio0 30 GPIO_ACTIVE_LOW>; + color = ; + function = LED_FUNCTION_ALARM; + }; + + led-1 { + label = "red:ha"; + gpios = <&gpio1 0 GPIO_ACTIVE_LOW>; + color = ; + }; + + led_status_green: led-2 { + label = "green:sta"; + gpios = <&gpio1 1 GPIO_ACTIVE_LOW>; + color = ; + function = LED_FUNCTION_STATUS; + }; + + led-3 { + label = "green:ha"; + gpios = <&gpio1 3 GPIO_ACTIVE_LOW>; + color = ; + }; + + led-4 { + label = "amber:alarm"; + gpios = <&gpio1 13 GPIO_ACTIVE_LOW>; + color = ; + function = LED_FUNCTION_ALARM; + }; + + led_status_red: led-5 { + label = "red:sta"; + gpios = <&gpio1 15 GPIO_ACTIVE_LOW>; + color = ; + function = LED_FUNCTION_STATUS; + }; + + led-6 { + label = "green:speed_wan1"; + gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>; + color = ; + linux,default-trigger = "f1072004.mdio-mii:00:1Gbps"; + }; + + led-7 { + label = "green:speed_wan2"; + gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>; + color = ; + linux,default-trigger = "f1072004.mdio-mii:01:1Gbps"; + }; + + led-8 { + label = "amber:speed_lan5"; + gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>; + color = ; + linux,default-trigger = "mv88e6xxx-1:00:100Mbps"; + }; + + led-9 { + label = "green:speed_lan5"; + gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>; + color = ; + linux,default-trigger = "mv88e6xxx-1:00:1Gbps"; + }; + + led-10 { + label = "green:speed_lan4"; + gpios = <&gpio2 4 GPIO_ACTIVE_LOW>; + color = ; + linux,default-trigger = "mv88e6xxx-1:01:1Gbps"; + }; + + led-11 { + label = "amber:speed_lan4"; + gpios = <&gpio2 5 GPIO_ACTIVE_LOW>; + color = ; + linux,default-trigger = "mv88e6xxx-1:01:100Mbps"; + }; + + led-12 { + label = "amber:speed_lan3"; + gpios = <&gpio2 6 GPIO_ACTIVE_LOW>; + color = ; + linux,default-trigger = "mv88e6xxx-1:02:100Mbps"; + }; + + led-13 { + label = "green:speed_lan3"; + gpios = <&gpio2 7 GPIO_ACTIVE_LOW>; + color = ; + linux,default-trigger = "mv88e6xxx-1:02:1Gbps"; + }; + + led-14 { + label = "green:speed_lan1"; + gpios = <&gpio2 12 GPIO_ACTIVE_LOW>; + color = ; + linux,default-trigger = "mv88e6xxx-1:04:1Gbps"; + }; + + led-15 { + label = "amber:speed_lan1"; + gpios = <&gpio2 13 GPIO_ACTIVE_LOW>; + color = ; + linux,default-trigger = "mv88e6xxx-1:04:100Mbps"; + }; + + led-16 { + label = "green:speed_lan2"; + gpios = <&gpio2 14 GPIO_ACTIVE_LOW>; + color = ; + linux,default-trigger = "mv88e6xxx-1:03:1Gbps"; + }; + + led-17 { + label = "amber:speed_lan2"; + gpios = <&gpio2 15 GPIO_ACTIVE_LOW>; + color = ; + linux,default-trigger = "mv88e6xxx-1:03:100Mbps"; + }; + }; + + reg_usb_vbus: regulator-usb-vbus { + compatible = "fixed-regulator"; + regulator-name = "usb-vbus"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + gpio = <&gpio1 21 GPIO_ACTIVE_LOW>; + regulator-always-on; + }; +}; + +&i2c0 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c0_pins>; + status = "okay"; + + gpio2: gpio@24 { + compatible = "nxp,pca9555"; + reg = <0x24>; + gpio-controller; + #gpio-cells = <0x2>; + }; + + hwmon@28 { + compatible = "nuvoton,nct7802"; + reg = <0x28>; + }; +}; + +&uart0 { + pinctrl-names = "default"; + pinctrl-0 = <&uart0_pins>; + status = "okay"; +}; + +&pinctrl { + pmx_phy_switch_pins: phy-switch-pins { + marvell,pins = "mpp19", "mpp20", "mpp23", "mpp34", "mpp41"; + marvell,function = "gpio"; + }; + + pmx_gpio_leds_pins: gpio-leds-pins { + marvell,pins = "mpp30", "mpp32", "mpp33", "mpp35", + "mpp45", "mpp47"; + marvell,function = "gpio"; + }; + + pmx_usb_pins: usb-pins { + marvell,pins = "mpp53"; + marvell,function = "gpio"; + }; + + pmx_gpio_keys_pins: gpio-keys-pins { + marvell,pins = "mpp54"; + marvell,function = "gpio"; + }; +}; + +&bm { + status = "okay"; +}; + +&bm_bppi { + status = "okay"; +}; + +ð0 { + pinctrl-names = "default"; + pinctrl-0 = <&ge0_rgmii_pins>; + status = "okay"; + + phy-connection-type = "rgmii-id"; + buffer-manager = <&bm>; + bm,pool-long = <0>; + bm,pool-short = <1>; + nvmem-cells = <&macaddr_bdinfo_d880>; + nvmem-cell-names = "mac-address"; + + fixed-link { + speed = <1000>; + full-duplex; + }; +}; + +ð1 { + status = "okay"; + + phy-handle = <ðphy0>; + phy-connection-type = "sgmii"; + buffer-manager = <&bm>; + bm,pool-long = <2>; + nvmem-cells = <&macaddr_bdinfo_d880>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <1>; +}; + +ð2 { + status = "okay"; + + phy-handle = <ðphy1>; + phy-connection-type = "sgmii"; + buffer-manager = <&bm>; + bm,pool-long = <3>; + nvmem-cells = <&macaddr_bdinfo_d880>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <2>; +}; + +&mdio { + pinctrl-names = "default"; + pinctrl-0 = <&mdio_pins>, <&pmx_phy_switch_pins>; + + /* Marvell 88E1512 */ + ethphy0: ethernet-phy@0 { + compatible = "ethernet-phy-id0141,0dd1", + "ethernet-phy-ieee802.3-c22"; + reg = <0>; + interrupt-parent = <&gpio0>; + interrupts = <20 IRQ_TYPE_LEVEL_LOW>; + reset-gpios = <&gpio0 23 GPIO_ACTIVE_LOW>; + reset-assert-us = <10000>; + reset-deassert-us = <10000>; + /* + * LINK/ACT (Green): LED[0], Active Low + * SPEED 100M (Amber): LED[1], Active High + */ + marvell,reg-init = <3 16 0 0x71>, + <3 17 0 0x4>; + }; + + /* Marvell 88E1512 */ + ethphy1: ethernet-phy@1 { + compatible = "ethernet-phy-id0141,0dd1", + "ethernet-phy-ieee802.3-c22"; + reg = <1>; + interrupt-parent = <&gpio1>; + interrupts = <9 IRQ_TYPE_LEVEL_LOW>; + reset-gpios = <&gpio1 2 GPIO_ACTIVE_LOW>; + reset-assert-us = <10000>; + reset-deassert-us = <10000>; + /* + * LINK/ACT (Green): LED[0], Active Low + * SPEED 100M (Amber): LED[1], Active High + */ + marvell,reg-init = <3 16 0 0x71>, + <3 17 0 0x4>; + }; + + /* Marvell 88E6176 */ + switch@2 { + compatible = "marvell,mv88e6085"; + reg = <0x2>; + reset-gpios = <&gpio0 19 GPIO_ACTIVE_LOW>; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + label = "lan5"; + nvmem-cells = <&macaddr_bdinfo_d880>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <7>; + }; + + port@1 { + reg = <1>; + label = "lan4"; + nvmem-cells = <&macaddr_bdinfo_d880>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <6>; + }; + + port@2 { + reg = <2>; + label = "lan3"; + nvmem-cells = <&macaddr_bdinfo_d880>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <5>; + }; + + port@3 { + reg = <3>; + label = "lan2"; + nvmem-cells = <&macaddr_bdinfo_d880>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <4>; + }; + + port@4 { + reg = <4>; + label = "lan1"; + nvmem-cells = <&macaddr_bdinfo_d880>; + nvmem-cell-names = "mac-address"; + mac-address-increment = <3>; + }; + + port@6 { + reg = <6>; + ethernet = <ð0>; + phy-connection-type = "rgmii-id"; + + fixed-link { + speed = <1000>; + full-duplex; + }; + }; + }; + }; +}; + +&usb3_0 { + pinctrl-names = "default"; + pinctrl-0 = <&pmx_usb_pins>; + status = "okay"; + + vbus-supply = <®_usb_vbus>; +}; + +&spi1 { + pinctrl-names = "default"; + pinctrl-0 = <&spi1_pins>; + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <50000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + reg = <0x0 0x1c0000>; + label = "u-boot"; + read-only; + }; + + partition@1c0000 { + reg = <0x1c0000 0x10000>; + label = "firmware-info"; + + /* + * 0x10 - 0x2f : image name (image1) + * 0x30 - 0x4f : image name (image2) + * 0x170 (1byte): active image (0x0/0x1) + * 0x184 - 0x185: kernel block count (image1) + * 0x18c - 0x18d: rootfs block count (image1) + * 0x194 - 0x195: kernel block count (image2) + * 0x19c - 0x19d: rootfs block count (image2) + * 0x1be (1byte): bit7 -> active flag (image1)? + * 0x1ce (1byte): bit7 -> active flag (image2)? + * + * Note: block size --> 0x200 (512 bytes) + */ + }; + + partition@1d0000 { + reg = <0x1d0000 0x10000>; + label = "dtb"; + read-only; + }; + + partition@1e0000 { + reg = <0x1e0000 0x10000>; + label = "u-boot-env"; + read-only; + }; + + partition@1f0000 { + reg = <0x1f0000 0x10000>; + label = "board-info"; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + macaddr_bdinfo_d880: macaddr@d880 { + reg = <0xd880 0x6>; + }; + }; + + partition@200000 { + reg = <0x200000 0x600000>; + label = "kernel"; + }; + + partition@800000 { + reg = <0x800000 0x1800000>; + label = "rootfs"; + }; + + partition@2000000 { + reg = <0x2000000 0x600000>; + label = "kn2"; + read-only; + }; + + partition@2600000 { + reg = <0x2600000 0x1800000>; + label = "rfs2"; + read-only; + }; + + partition@3e00000 { + reg = <0x3e00000 0x1200000>; + label = "part1"; + read-only; + }; + + partition@5000000 { + reg = <0x5000000 0x1200000>; + label = "part2"; + read-only; + }; + + partition@6200000 { + reg = <0x6200000 0x1e00000>; + label = "config"; + read-only; + }; + }; + }; +}; diff --git a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-eDPU.dts b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-eDPU.dts new file mode 100644 index 0000000000..4db8b946df --- /dev/null +++ b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-eDPU.dts @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/dts-v1/; + +#include "armada-3720-uDPU.dtsi" + +/ { + model = "Methode eDPU Board"; + compatible = "methode,edpu", "marvell,armada3720", "marvell,armada3710"; +}; + +/* PHY mode is set to 1000Base-X despite Maxlinear IC being capable of + * 2500Base-X since until 5.15 support for mvebu is available trying to + * use 2500Base-X will cause buffer overruns for which the fix is not + * easily backportable. + */ +ð0 { + phy-mode = "1000base-x"; +}; diff --git a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-espressobin-ultra.dts b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-espressobin-ultra.dts index 669b67e5a9..1a6594e3cd 100644 --- a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-espressobin-ultra.dts +++ b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-espressobin-ultra.dts @@ -184,7 +184,6 @@ switch0port0: port@0 { reg = <0>; - label = "cpu"; ethernet = <ð0>; }; diff --git a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-gl-mv1000.dts b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-gl-mv1000.dts index acf15e8ca9..8d163059a0 100644 --- a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-gl-mv1000.dts +++ b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-gl-mv1000.dts @@ -96,7 +96,7 @@ partition@f0000 { label = "u-boot-env"; - reg = <0Xf0000 0x8000>; + reg = <0xf0000 0x8000>; read-only; }; @@ -105,6 +105,24 @@ reg = <0xf8000 0x8000>; read-only; }; + + partition@100000 { + label = "gl-firmware-dtb"; + reg = <0x100000 0x10000>; + read-only; + }; + + partition@110000 { + label = "gl-firmware"; + reg = <0x110000 0xef0000>; + read-only; + }; + + partition@ef0000 { + label = "gl-firmware-jffs2"; + reg = <0xef0000 0x110000>; + read-only; + }; }; }; }; @@ -157,7 +175,6 @@ port@0 { reg = <0>; - label = "cpu"; ethernet = <ð0>; }; diff --git a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts new file mode 100644 index 0000000000..186a5e7d7d --- /dev/null +++ b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/dts-v1/; + +#include "armada-3720-uDPU.dtsi" + +/ { + model = "Methode uDPU Board"; + compatible = "methode,udpu", "marvell,armada3720", "marvell,armada3710"; + + sfp_eth0: sfp-eth0 { + compatible = "sff,sfp"; + i2c-bus = <&i2c0>; + los-gpio = <&gpiosb 2 GPIO_ACTIVE_HIGH>; + mod-def0-gpio = <&gpiosb 3 GPIO_ACTIVE_LOW>; + tx-disable-gpio = <&gpiosb 4 GPIO_ACTIVE_HIGH>; + tx-fault-gpio = <&gpiosb 5 GPIO_ACTIVE_HIGH>; + maximum-power-milliwatt = <3000>; + }; +}; + +&pinctrl_nb { + i2c1_recovery_pins: i2c1-recovery-pins { + groups = "i2c1"; + function = "gpio"; + }; +}; + +&i2c0 { + status = "okay"; + pinctrl-names = "default", "recovery"; + pinctrl-0 = <&i2c1_pins>; + pinctrl-1 = <&i2c1_recovery_pins>; + /delete-property/mrvl,i2c-fast-mode; + scl-gpios = <&gpionb 0 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; + sda-gpios = <&gpionb 1 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; +}; + +ð0 { + phy-mode = "2500base-x"; + sfp = <&sfp_eth0>; +}; + +ð1 { + phy-mode = "2500base-x"; +}; diff --git a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi new file mode 100644 index 0000000000..bc8d1f1020 --- /dev/null +++ b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Device tree for the uDPU board. + * Based on Marvell Armada 3720 development board (DB-88F3720-DDR3) + * Copyright (C) 2016 Marvell + * Copyright (C) 2019 Methode Electronics + * Copyright (C) 2019 Telus + * + * Vladimir Vid + */ + +/dts-v1/; + +#include +#include "armada-372x.dtsi" + +/ { + chosen { + stdout-path = "serial0:115200n8"; + }; + + memory@0 { + device_type = "memory"; + reg = <0x00000000 0x00000000 0x00000000 0x20000000>; + }; + + aliases { + ethernet0 = ð0; + ethernet1 = ð1; + }; + + leds { + compatible = "gpio-leds"; + + led-power1 { + label = "udpu:green:power"; + gpios = <&gpionb 11 GPIO_ACTIVE_LOW>; + }; + + led-power2 { + label = "udpu:red:power"; + gpios = <&gpionb 12 GPIO_ACTIVE_LOW>; + }; + + led-network1 { + label = "udpu:green:network"; + gpios = <&gpionb 13 GPIO_ACTIVE_LOW>; + }; + + led-network2 { + label = "udpu:red:network"; + gpios = <&gpionb 14 GPIO_ACTIVE_LOW>; + }; + + led-alarm1 { + label = "udpu:green:alarm"; + gpios = <&gpionb 15 GPIO_ACTIVE_LOW>; + }; + + led-alarm2 { + label = "udpu:red:alarm"; + gpios = <&gpionb 16 GPIO_ACTIVE_LOW>; + }; + }; + + sfp_eth1: sfp-eth1 { + compatible = "sff,sfp"; + i2c-bus = <&i2c1>; + los-gpio = <&gpiosb 7 GPIO_ACTIVE_HIGH>; + mod-def0-gpio = <&gpiosb 8 GPIO_ACTIVE_LOW>; + tx-disable-gpio = <&gpiosb 9 GPIO_ACTIVE_HIGH>; + tx-fault-gpio = <&gpiosb 10 GPIO_ACTIVE_HIGH>; + maximum-power-milliwatt = <3000>; + }; +}; + +&sdhci0 { + status = "okay"; + bus-width = <8>; + mmc-ddr-1_8v; + mmc-hs400-1_8v; + marvell,pad-type = "fixed-1-8v"; + non-removable; + no-sd; + no-sdio; +}; + +&spi0 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&spi_quad_pins>; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <54000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "firmware"; + reg = <0x0 0x180000>; + }; + + partition@180000 { + label = "u-boot-env"; + reg = <0x180000 0x10000>; + }; + }; + }; +}; + +&pinctrl_nb { + i2c2_recovery_pins: i2c2-recovery-pins { + groups = "i2c2"; + function = "gpio"; + }; +}; + +&i2c1 { + status = "okay"; + pinctrl-names = "default", "recovery"; + pinctrl-0 = <&i2c2_pins>; + pinctrl-1 = <&i2c2_recovery_pins>; + /delete-property/mrvl,i2c-fast-mode; + scl-gpios = <&gpionb 2 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; + sda-gpios = <&gpionb 3 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; + + temp-sensor@48 { + compatible = "ti,tmp75c"; + reg = <0x48>; + }; + + temp-sensor@49 { + compatible = "ti,tmp75c"; + reg = <0x49>; + }; +}; + +ð0 { + status = "okay"; + managed = "in-band-status"; + phys = <&comphy1 0>; +}; + +ð1 { + phy-mode = "sgmii"; + status = "okay"; + managed = "in-band-status"; + phys = <&comphy0 1>; + sfp = <&sfp_eth1>; +}; + +&usb3 { + status = "okay"; + phys = <&usb2_utmi_otg_phy>; + phy-names = "usb2-utmi-otg-phy"; +}; + +&uart0 { + status = "okay"; +}; diff --git a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-7040-mochabin.dts b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-7040-mochabin.dts index c198061af7..26804a4875 100644 --- a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-7040-mochabin.dts +++ b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/armada-7040-mochabin.dts @@ -339,7 +339,6 @@ port@5 { reg = <5>; - label = "cpu"; ethernet = <&cp0_eth1>; phy-mode = "2500base-x"; managed = "in-band-status"; @@ -445,4 +444,5 @@ phys = <&cp0_comphy5 2>; phy-names = "cp0-pcie2-x1-phy"; reset-gpio = <&cp0_gpio1 9 GPIO_ACTIVE_LOW>; + ranges = <0x82000000 0x0 0xc0000000 0x0 0xc0000000 0x0 0x8000000>; }; diff --git a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts index 80d876b4ad..0ad25fafbb 100644 --- a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts +++ b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts @@ -6,6 +6,7 @@ */ #include "cn9130.dtsi" +#include "puzzle-thermal.dtsi" #include #include @@ -109,26 +110,18 @@ chassis_fan_group0: fan-group@0 { #cooling-cells = <2>; reg = <0x00>; - cooling-levels = <64 102 170 230 250>; + cooling-levels = <80 102 170 230 255>; }; }; }; }; -&ap_thermal_cpu1 { - trips { - cpu_active: cpu-active { - temperature = <44000>; - hysteresis = <2000>; - type = "active"; - }; - }; - cooling-maps { - fan-map { - trip = <&cpu_active>; - cooling-device = <&chassis_fan_group0 64 THERMAL_NO_LIMIT>; - }; - }; +&ap_thermal_ic { + PUZZLE_FAN_THERMAL(ic, &chassis_fan_group0); +}; + +&cp0_thermal_ic { + PUZZLE_FAN_THERMAL(cp0, &chassis_fan_group0); }; /* on-board eMMC - U9 */ @@ -396,6 +389,10 @@ }; }; +&cp1_thermal_ic { + PUZZLE_FAN_THERMAL(cp1, &chassis_fan_group0); +}; + &cp1_usb3_1 { status = "okay"; phys = <&cp1_comphy3 1>; diff --git a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts index fd99eb2d13..398e53a5f9 100644 --- a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts +++ b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts @@ -6,6 +6,7 @@ */ #include "cn9130.dtsi" +#include "puzzle-thermal.dtsi" #include #include @@ -154,28 +155,21 @@ chassis_fan_group0: fan-group@0 { #cooling-cells = <2>; reg = <0x00>; - cooling-levels = <64 102 170 230 250>; + cooling-levels = <80 102 170 230 255>; }; }; }; }; -&ap_thermal_cpu1 { - trips { - cpu_active: cpu-active { - temperature = <44000>; - hysteresis = <2000>; - type = "active"; - }; - }; - cooling-maps { - fan-map { - trip = <&cpu_active>; - cooling-device = <&chassis_fan_group0 64 THERMAL_NO_LIMIT>; - }; - }; +&ap_thermal_ic { + PUZZLE_FAN_THERMAL(ic, &chassis_fan_group0); +}; + +&cp0_thermal_ic { + PUZZLE_FAN_THERMAL(cp0, &chassis_fan_group0); }; + /* on-board eMMC - U9 */ &ap_sdhci0 { pinctrl-names = "default"; @@ -447,6 +441,10 @@ }; }; +&cp1_thermal_ic { + PUZZLE_FAN_THERMAL(cp1, &chassis_fan_group0); +}; + /* * Instantiate the second connected CP115 */ @@ -562,3 +560,7 @@ }; }; }; + +&cp2_thermal_ic { + PUZZLE_FAN_THERMAL(cp2, &chassis_fan_group0); +}; diff --git a/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi new file mode 100644 index 0000000000..94677532f2 --- /dev/null +++ b/target/linux/mvebu/files/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi @@ -0,0 +1,41 @@ +#define PUZZLE_FAN_THERMAL(_cname, _fan) \ + trips { \ + _cname##_active_high: cpu-active-high { \ + temperature = <80000>; \ + hysteresis = <2000>; \ + type = "active"; \ + }; \ + _cname##_active_med: cpu-active-med { \ + temperature = <72000>; \ + hysteresis = <2000>; \ + type = "active"; \ + }; \ + _cname##_active_low: cpu-active-low { \ + temperature = <65000>; \ + hysteresis = <2000>; \ + type = "active"; \ + }; \ + _cname##_active_idle: cpu-active-idle { \ + temperature = <60000>; \ + hysteresis = <2000>; \ + type = "active"; \ + }; \ + }; \ + cooling-maps { \ + cpu-active-high { \ + trip = <&_cname##_active_high>; \ + cooling-device = <_fan 3 THERMAL_NO_LIMIT>; \ + }; \ + cpu-active-med { \ + trip = <&_cname##_active_med>; \ + cooling-device = <_fan 2 THERMAL_NO_LIMIT>; \ + }; \ + cpu-active-low { \ + trip = <&_cname##_active_low>; \ + cooling-device = <_fan 1 THERMAL_NO_LIMIT>; \ + }; \ + cpu-active-idle { \ + trip = <&_cname##_active_idle>; \ + cooling-device = <_fan 0 THERMAL_NO_LIMIT>; \ + }; \ + } diff --git a/target/linux/mvebu/image/Makefile b/target/linux/mvebu/image/Makefile index 44e66a5f87..57129d2dcb 100644 --- a/target/linux/mvebu/image/Makefile +++ b/target/linux/mvebu/image/Makefile @@ -34,7 +34,9 @@ define Build/boot-img-ext4 $(foreach dts,$(DEVICE_DTS), $(CP) $(KDIR)/image-$(dts).dtb $@.boot/$(dts).dtb;) $(CP) $(IMAGE_KERNEL) $@.boot/$(KERNEL_NAME) -$(CP) $@-boot.scr $@.boot/boot.scr - make_ext4fs -J -L kernel -l $(CONFIG_TARGET_KERNEL_PARTSIZE)M $@.bootimg $@.boot + make_ext4fs -J -L kernel -l $(CONFIG_TARGET_KERNEL_PARTSIZE)M \ + $(if $(SOURCE_DATE_EPOCH),-T $(SOURCE_DATE_EPOCH)) \ + $@.bootimg $@.boot endef define Build/buffalo-kernel-jffs2 @@ -51,6 +53,16 @@ define Build/buffalo-kernel-jffs2 rm -rf $(KDIR)/kernel_jffs2 $@.fakerd endef +define Build/buffalo-kernel-ubifs + rm -rf $@-ubidir + mkdir -p $@-ubidir + mv $@ $@-ubidir/uImage.buffalo + touch $@ + $(call Build/append-uImage-fakehdr, ramdisk) + mv $@ $@-ubidir/initrd.buffalo + $(STAGING_DIR_HOST)/bin/mkfs.ubifs $(KERNEL_UBIFS_OPTS) -r $@-ubidir $@ +endef + # Some info about Ctera firmware: # 1. It's simple tar file (GNU standard), but it must have ".firm" suffix. # 2. It contains two images: kernel and romdisk. Both are required. diff --git a/target/linux/mvebu/image/cortexa9.mk b/target/linux/mvebu/image/cortexa9.mk index 693ba425b3..0cf7635c99 100644 --- a/target/linux/mvebu/image/cortexa9.mk +++ b/target/linux/mvebu/image/cortexa9.mk @@ -3,6 +3,19 @@ # Copyright (C) 2012-2016 OpenWrt.org # Copyright (C) 2016 LEDE-project.org +define Build/fortigate-header + ( \ + dd if=/dev/zero bs=384 count=1 2>/dev/null; \ + datalen=$$(wc -c $@ | cut -d' ' -f1); \ + datalen=$$(printf "%08x" $$datalen); \ + datalen="$${datalen:6:2}$${datalen:4:2}$${datalen:2:2}$${datalen:0:2}"; \ + printf $$(echo "00020000$${datalen}ffff0000ffff0000" | sed 's/../\\x&/g'); \ + dd if=/dev/zero bs=112 count=1 2>/dev/null; \ + cat $@; \ + ) > $@.new + mv $@.new $@ +endef + define Device/dsa-migration DEVICE_COMPAT_VERSION := 1.1 DEVICE_COMPAT_MESSAGE := Config cannot be migrated from swconfig to DSA @@ -14,6 +27,21 @@ define Device/kernel-size-migration Upgrade via sysupgrade mechanism is not possible, so new installation via factory style image is required. endef +define Device/buffalo_ls220de + $(Device/NAND-128K) + DEVICE_VENDOR := Buffalo + DEVICE_MODEL := LinkStation LS220DE + KERNEL_UBIFS_OPTS = -m $$(PAGESIZE) -e 124KiB -c 172 -x none + KERNEL := kernel-bin | append-dtb | uImage none | buffalo-kernel-ubifs + KERNEL_INITRAMFS := kernel-bin | append-dtb | uImage none + DEVICE_DTS := armada-370-buffalo-ls220de + DEVICE_PACKAGES := \ + kmod-hwmon-gpiofan kmod-hwmon-drivetemp kmod-linkstation-poweroff \ + kmod-md-mod kmod-md-raid0 kmod-md-raid1 kmod-md-raid10 kmod-fs-xfs \ + mdadm mkf2fs e2fsprogs partx-utils +endef +TARGET_DEVICES += buffalo_ls220de + define Device/buffalo_ls421de $(Device/NAND-128K) DEVICE_VENDOR := Buffalo @@ -58,27 +86,17 @@ define Device/cznic_turris-omnia KERNEL_INITRAMFS := kernel-bin | gzip | fit gzip $$(KDIR)/image-$$(DEVICE_DTS).dtb DEVICE_PACKAGES := \ mkf2fs e2fsprogs kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1 \ - wpad-basic-wolfssl kmod-ath9k \ - partx-utils kmod-i2c-mux-pca954x kmod-leds-turris-omnia + wpad-basic-mbedtls kmod-ath9k partx-utils kmod-i2c-mux-pca954x \ + kmod-leds-turris-omnia IMAGES := $$(DEVICE_IMG_PREFIX)-sysupgrade.img.gz omnia-medkit-$$(DEVICE_IMG_PREFIX)-initramfs.tar.gz IMAGE/$$(DEVICE_IMG_PREFIX)-sysupgrade.img.gz := boot-scr | boot-img | sdcard-img | gzip | append-metadata IMAGE/omnia-medkit-$$(DEVICE_IMG_PREFIX)-initramfs.tar.gz := omnia-medkit-initramfs | gzip DEVICE_IMG_NAME = $$(2) SUPPORTED_DEVICES += armada-385-turris-omnia BOOT_SCRIPT := turris-omnia - DEFAULT := n endef TARGET_DEVICES += cznic_turris-omnia -define Device/globalscale_mirabox - $(Device/NAND-512K) - DEVICE_VENDOR := Globalscale - DEVICE_MODEL := Mirabox - SOC := armada-370 - SUPPORTED_DEVICES += mirabox -endef -TARGET_DEVICES += globalscale_mirabox - define Device/iptime_nas1dual DEVICE_VENDOR := ipTIME DEVICE_MODEL := NAS1dual @@ -102,7 +120,7 @@ define Device/kobol_helios4 IMAGES := sdcard.img.gz IMAGE/sdcard.img.gz := boot-scr | boot-img-ext4 | sdcard-img-ext4 | gzip | append-metadata SOC := armada-388 - UBOOT := helios4-u-boot-spl.kwb + UBOOT := helios4-u-boot-with-spl.kwb BOOT_SCRIPT := clearfog endef TARGET_DEVICES += kobol_helios4 @@ -110,12 +128,11 @@ TARGET_DEVICES += kobol_helios4 define Device/linksys $(Device/NAND-128K) DEVICE_VENDOR := Linksys - DEVICE_PACKAGES := wpad-basic-wolfssl + DEVICE_PACKAGES := kmod-mwlwifi wpad-basic-mbedtls IMAGES += factory.img IMAGE/factory.img := append-kernel | pad-to $$$$(KERNEL_SIZE) | \ append-ubi | pad-to $$$$(PAGESIZE) KERNEL_SIZE := 6144k - DEFAULT := n endef define Device/linksys_wrt1200ac @@ -125,27 +142,11 @@ define Device/linksys_wrt1200ac DEVICE_ALT0_VENDOR := Linksys DEVICE_ALT0_MODEL := Caiman DEVICE_DTS := armada-385-linksys-caiman - DEVICE_PACKAGES += + DEVICE_PACKAGES += mwlwifi-firmware-88w8864 SUPPORTED_DEVICES += armada-385-linksys-caiman linksys,caiman endef TARGET_DEVICES += linksys_wrt1200ac -define Device/linksys_wrt1900acs - $(call Device/linksys) - $(Device/dsa-migration) - DEVICE_MODEL := WRT1900ACS - DEVICE_VARIANT := v1 - DEVICE_ALT0_VENDOR := Linksys - DEVICE_ALT0_MODEL := WRT1900ACS - DEVICE_ALT0_VARIANT := v2 - DEVICE_ALT1_VENDOR := Linksys - DEVICE_ALT1_MODEL := Shelby - DEVICE_DTS := armada-385-linksys-shelby - DEVICE_PACKAGES += - SUPPORTED_DEVICES += armada-385-linksys-shelby linksys,shelby -endef -TARGET_DEVICES += linksys_wrt1900acs - define Device/linksys_wrt1900ac-v1 $(call Device/linksys) $(Device/kernel-size-migration) @@ -154,153 +155,7 @@ define Device/linksys_wrt1900ac-v1 DEVICE_ALT0_VENDOR := Linksys DEVICE_ALT0_MODEL := Mamba DEVICE_DTS := armada-xp-linksys-mamba - DEVICE_PACKAGES += KERNEL_SIZE := 4096k SUPPORTED_DEVICES += armada-xp-linksys-mamba linksys,mamba endef TARGET_DEVICES += linksys_wrt1900ac-v1 - -define Device/linksys_wrt1900ac-v2 - $(call Device/linksys) - $(Device/dsa-migration) - DEVICE_MODEL := WRT1900AC - DEVICE_VARIANT := v2 - DEVICE_ALT0_VENDOR := Linksys - DEVICE_ALT0_MODEL := Cobra - DEVICE_DTS := armada-385-linksys-cobra - DEVICE_PACKAGES += - SUPPORTED_DEVICES += armada-385-linksys-cobra linksys,cobra -endef -TARGET_DEVICES += linksys_wrt1900ac-v2 - -define Device/linksys_wrt3200acm - $(call Device/linksys) - $(Device/dsa-migration) - DEVICE_MODEL := WRT3200ACM - DEVICE_ALT0_VENDOR := Linksys - DEVICE_ALT0_MODEL := Rango - DEVICE_DTS := armada-385-linksys-rango - DEVICE_PACKAGES += kmod-btmrvl kmod-mwifiex-sdio - SUPPORTED_DEVICES += armada-385-linksys-rango linksys,rango -endef -TARGET_DEVICES += linksys_wrt3200acm - -define Device/linksys_wrt32x - $(call Device/linksys) - $(Device/kernel-size-migration) - DEVICE_MODEL := WRT32X - DEVICE_ALT0_VENDOR := Linksys - DEVICE_ALT0_MODEL := Venom - DEVICE_DTS := armada-385-linksys-venom - DEVICE_PACKAGES += kmod-btmrvl kmod-mwifiex-sdio - KERNEL_SIZE := 6144k - KERNEL := kernel-bin | append-dtb - SUPPORTED_DEVICES += armada-385-linksys-venom linksys,venom -endef -TARGET_DEVICES += linksys_wrt32x - -define Device/marvell_a370-db - $(Device/NAND-512K) - DEVICE_VENDOR := Marvell - DEVICE_MODEL := Armada 370 Development Board (DB-88F6710-BP-DDR3) - DEVICE_DTS := armada-370-db - SUPPORTED_DEVICES += armada-370-db -endef -TARGET_DEVICES += marvell_a370-db - -define Device/marvell_a370-rd - $(Device/NAND-512K) - DEVICE_VENDOR := Marvell - DEVICE_MODEL := Armada 370 RD (RD-88F6710-A1) - DEVICE_DTS := armada-370-rd - SUPPORTED_DEVICES += armada-370-rd -endef -TARGET_DEVICES += marvell_a370-rd - -define Device/marvell_a385-db-ap - $(Device/NAND-256K) - DEVICE_VENDOR := Marvell - DEVICE_MODEL := Armada 385 Development Board AP (DB-88F6820-AP) - DEVICE_DTS := armada-385-db-ap - IMAGES += factory.img - IMAGE/factory.img := append-kernel | pad-to $$$$(KERNEL_SIZE) | \ - append-ubi | pad-to $$$$(PAGESIZE) - KERNEL_SIZE := 8192k - SUPPORTED_DEVICES += armada-385-db-ap -endef -TARGET_DEVICES += marvell_a385-db-ap - -define Device/marvell_a388-rd - DEVICE_VENDOR := Marvell - DEVICE_MODEL := Armada 388 RD (RD-88F6820-AP) - DEVICE_DTS := armada-388-rd - IMAGES := firmware.bin - IMAGE/firmware.bin := append-kernel | pad-to 256k | append-rootfs | pad-rootfs - SUPPORTED_DEVICES := armada-388-rd marvell,a385-rd -endef -TARGET_DEVICES += marvell_a388-rd - -define Device/marvell_axp-db - $(Device/NAND-512K) - DEVICE_VENDOR := Marvell - DEVICE_MODEL := Armada XP Development Board (DB-78460-BP) - DEVICE_DTS := armada-xp-db - SUPPORTED_DEVICES += armada-xp-db -endef -TARGET_DEVICES += marvell_axp-db - -define Device/marvell_axp-gp - $(Device/NAND-512K) - DEVICE_VENDOR := Marvell - DEVICE_MODEL := Armada Armada XP GP (DB-MV784MP-GP) - DEVICE_DTS := armada-xp-gp - SUPPORTED_DEVICES += armada-xp-gp -endef -TARGET_DEVICES += marvell_axp-gp - -define Device/plathome_openblocks-ax3-4 - DEVICE_VENDOR := Plat'Home - DEVICE_MODEL := OpenBlocks AX3 - DEVICE_VARIANT := 4 ports - SOC := armada-xp - SUPPORTED_DEVICES += openblocks-ax3-4 - BLOCKSIZE := 128k - PAGESIZE := 1 - IMAGES += factory.img - IMAGE/factory.img := append-kernel | pad-to $$(BLOCKSIZE) | append-ubi -endef -TARGET_DEVICES += plathome_openblocks-ax3-4 - -define Device/solidrun_clearfog-base-a1 - DEVICE_VENDOR := SolidRun - DEVICE_MODEL := ClearFog Base - KERNEL_INSTALL := 1 - KERNEL := kernel-bin - DEVICE_PACKAGES := mkf2fs e2fsprogs partx-utils - IMAGES := sdcard.img.gz - IMAGE/sdcard.img.gz := boot-scr | boot-img-ext4 | sdcard-img-ext4 | gzip | append-metadata - DEVICE_DTS := armada-388-clearfog-base armada-388-clearfog-pro - UBOOT := clearfog-u-boot-spl.kwb - BOOT_SCRIPT := clearfog - SUPPORTED_DEVICES += armada-388-clearfog-base - DEVICE_COMPAT_VERSION := 1.1 - DEVICE_COMPAT_MESSAGE := Ethernet interface rename has been dropped -endef -TARGET_DEVICES += solidrun_clearfog-base-a1 - -define Device/solidrun_clearfog-pro-a1 - $(Device/dsa-migration) - DEVICE_VENDOR := SolidRun - DEVICE_MODEL := ClearFog Pro - KERNEL_INSTALL := 1 - KERNEL := kernel-bin - DEVICE_PACKAGES := mkf2fs e2fsprogs partx-utils - IMAGES := sdcard.img.gz - IMAGE/sdcard.img.gz := boot-scr | boot-img-ext4 | sdcard-img-ext4 | gzip | append-metadata - DEVICE_DTS := armada-388-clearfog-pro armada-388-clearfog-base - UBOOT := clearfog-u-boot-spl.kwb - BOOT_SCRIPT := clearfog - SUPPORTED_DEVICES += armada-388-clearfog armada-388-clearfog-pro - DEFAULT := n -endef -TARGET_DEVICES += solidrun_clearfog-pro-a1 diff --git a/target/linux/mvebu/patches-5.10/001-v5.11-arm64-dts-mcbin-singleshot-add-heartbeat-LED.patch b/target/linux/mvebu/patches-5.10/001-v5.11-arm64-dts-mcbin-singleshot-add-heartbeat-LED.patch deleted file mode 100644 index c3abae60a6..0000000000 --- a/target/linux/mvebu/patches-5.10/001-v5.11-arm64-dts-mcbin-singleshot-add-heartbeat-LED.patch +++ /dev/null @@ -1,65 +0,0 @@ -From da57203dc7fd556fbb3f0ec7d7d7c0b0e893b386 Mon Sep 17 00:00:00 2001 -From: Tomasz Maciej Nowak -Date: Tue, 10 Nov 2020 16:38:31 +0100 -Subject: [PATCH] arm64: dts: mcbin-singleshot: add heartbeat LED - -With board revision 1.3, SolidRun moved the power LED to the middle of -the board. In old place of power LED a GPIO controllable heartbeat LED -was added. This commit only touches Single Shot variant, since only this -variant is all revision 1.3. - -Note: -This is slightly modified patch. Some boards could be placed in an -enclosure, so the LED18 is enabled by default, since that'll be the only -visible indicator that the board is operating. - -Reported-by: Alexandra Alth -Signed-off-by: Tomasz Maciej Nowak -Signed-off-by: Gregory CLEMENT ---- - .../marvell/armada-8040-mcbin-singleshot.dts | 22 +++++++++++++++++++ - 1 file changed, 22 insertions(+) - ---- a/arch/arm64/boot/dts/marvell/armada-8040-mcbin-singleshot.dts -+++ b/arch/arm64/boot/dts/marvell/armada-8040-mcbin-singleshot.dts -@@ -5,6 +5,8 @@ - * Device Tree file for MACCHIATOBin Armada 8040 community board platform - */ - -+#include -+ - #include "armada-8040-mcbin.dtsi" - - / { -@@ -12,6 +14,20 @@ - compatible = "marvell,armada8040-mcbin-singleshot", - "marvell,armada8040-mcbin", "marvell,armada8040", - "marvell,armada-ap806-quad", "marvell,armada-ap806"; -+ -+ leds { -+ compatible = "gpio-leds"; -+ pinctrl-0 = <&cp0_led18_pins>; -+ pinctrl-names = "default"; -+ -+ led18 { -+ gpios = <&cp0_gpio2 1 GPIO_ACTIVE_LOW>; -+ function = LED_FUNCTION_HEARTBEAT; -+ color = ; -+ linux,default-trigger = "heartbeat"; -+ default-state = "on"; -+ }; -+ }; - }; - - &cp0_eth0 { -@@ -27,3 +43,10 @@ - managed = "in-band-status"; - sfp = <&sfp_eth1>; - }; -+ -+&cp0_pinctrl { -+ cp0_led18_pins: led18-pins { -+ marvell,pins = "mpp33"; -+ marvell,function = "gpio"; -+ }; -+}; diff --git a/target/linux/mvebu/patches-5.10/002-v5.11-ARM-dts-turris-omnia-enable-HW-buffer-management.patch b/target/linux/mvebu/patches-5.10/002-v5.11-ARM-dts-turris-omnia-enable-HW-buffer-management.patch deleted file mode 100644 index 4ff0fe1e4c..0000000000 --- a/target/linux/mvebu/patches-5.10/002-v5.11-ARM-dts-turris-omnia-enable-HW-buffer-management.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 018b88eee1a2efda26ed2f09aab33ccdc40ef18f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Sun, 15 Nov 2020 14:59:17 +0100 -Subject: ARM: dts: turris-omnia: enable HW buffer management -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The buffer manager is available on Turris Omnia but needs to be -described in device-tree to be used. - -Signed-off-by: Marek Behún -Fixes: 26ca8b52d6e1 ("ARM: dts: add support for Turris Omnia") -Cc: linux-arm-kernel@lists.infradead.org -Cc: Uwe Kleine-König -Cc: Jason Cooper -Cc: Gregory CLEMENT -Cc: Andreas Färber -Cc: Andrew Lunn -Cc: Rob Herring -Cc: devicetree@vger.kernel.org -Signed-off-by: Gregory CLEMENT ---- - arch/arm/boot/dts/armada-385-turris-omnia.dts | 17 +++++++++++++++++ - 1 file changed, 17 insertions(+) - -(limited to 'arch/arm/boot/dts/armada-385-turris-omnia.dts') - ---- a/arch/arm/boot/dts/armada-385-turris-omnia.dts -+++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts -@@ -90,12 +90,23 @@ - }; - }; - -+&bm { -+ status = "okay"; -+}; -+ -+&bm_bppi { -+ status = "okay"; -+}; -+ - /* Connected to 88E6176 switch, port 6 */ - ð0 { - pinctrl-names = "default"; - pinctrl-0 = <&ge0_rgmii_pins>; - status = "okay"; - phy-mode = "rgmii"; -+ buffer-manager = <&bm>; -+ bm,pool-long = <0>; -+ bm,pool-short = <3>; - - fixed-link { - speed = <1000>; -@@ -109,6 +120,9 @@ - pinctrl-0 = <&ge1_rgmii_pins>; - status = "okay"; - phy-mode = "rgmii"; -+ buffer-manager = <&bm>; -+ bm,pool-long = <1>; -+ bm,pool-short = <3>; - - fixed-link { - speed = <1000>; -@@ -121,6 +135,9 @@ - status = "okay"; - phy-mode = "sgmii"; - phy = <&phy1>; -+ buffer-manager = <&bm>; -+ bm,pool-long = <2>; -+ bm,pool-short = <3>; - }; - - &i2c0 { diff --git a/target/linux/mvebu/patches-5.10/003-v5.11-ARM-dts-turris-omnia-add-comphy-handle-to-eth2.patch b/target/linux/mvebu/patches-5.10/003-v5.11-ARM-dts-turris-omnia-add-comphy-handle-to-eth2.patch deleted file mode 100644 index 3c7ec2411b..0000000000 --- a/target/linux/mvebu/patches-5.10/003-v5.11-ARM-dts-turris-omnia-add-comphy-handle-to-eth2.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 9ec25ef84832209a8326f9a71fe3ba14f4bcf301 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Sun, 15 Nov 2020 14:59:18 +0100 -Subject: ARM: dts: turris-omnia: add comphy handle to eth2 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The eth2 controller on Turris Omnia is connected to SerDes. For SFP to -be able to switch between 1G and 2.5G modes the comphy link has to be -defined. - -Signed-off-by: Marek Behún -Fixes: f3a6a9f3704a ("ARM: dts: add description for Armada 38x ...") -Reviewed-by: Andrew Lunn -Reviewed-by: Andreas Färber -Cc: linux-arm-kernel@lists.infradead.org -Cc: Uwe Kleine-König -Cc: Jason Cooper -Cc: Gregory CLEMENT -Cc: Rob Herring -Cc: devicetree@vger.kernel.org -Signed-off-by: Gregory CLEMENT ---- - arch/arm/boot/dts/armada-385-turris-omnia.dts | 1 + - 1 file changed, 1 insertion(+) - ---- a/arch/arm/boot/dts/armada-385-turris-omnia.dts -+++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts -@@ -135,6 +135,7 @@ - status = "okay"; - phy-mode = "sgmii"; - phy = <&phy1>; -+ phys = <&comphy5 2>; - buffer-manager = <&bm>; - bm,pool-long = <2>; - bm,pool-short = <3>; diff --git a/target/linux/mvebu/patches-5.10/004-v5.11-ARM-dts-turris-omnia-describe-switch-interrupt.patch b/target/linux/mvebu/patches-5.10/004-v5.11-ARM-dts-turris-omnia-describe-switch-interrupt.patch deleted file mode 100644 index e4ecbef193..0000000000 --- a/target/linux/mvebu/patches-5.10/004-v5.11-ARM-dts-turris-omnia-describe-switch-interrupt.patch +++ /dev/null @@ -1,61 +0,0 @@ -From d29b67c220caf5f4905e1f1576e71bcb6de4af9e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Sun, 15 Nov 2020 14:59:19 +0100 -Subject: ARM: dts: turris-omnia: describe switch interrupt -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Describe switch interrupt for Turris Omnia so that the CPU does not have -to poll the switch. We also need to to set mpp45 pin to gpio function -for this. - -Signed-off-by: Marek Behún -Fixes: 26ca8b52d6e1 ("ARM: dts: add support for Turris Omnia") -Cc: linux-arm-kernel@lists.infradead.org -Cc: Uwe Kleine-König -Cc: Jason Cooper -Cc: Gregory CLEMENT -Cc: Andreas Färber -Cc: Andrew Lunn -Cc: Rob Herring -Cc: devicetree@vger.kernel.org -Signed-off-by: Gregory CLEMENT ---- - arch/arm/boot/dts/armada-385-turris-omnia.dts | 12 +++++++++++- - 1 file changed, 11 insertions(+), 1 deletion(-) - ---- a/arch/arm/boot/dts/armada-385-turris-omnia.dts -+++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts -@@ -267,13 +267,18 @@ - - /* Switch MV88E6176 at address 0x10 */ - switch@10 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&swint_pins>; - compatible = "marvell,mv88e6085"; - #address-cells = <1>; - #size-cells = <0>; -- dsa,member = <0 0>; - -+ dsa,member = <0 0>; - reg = <0x10>; - -+ interrupt-parent = <&gpio1>; -+ interrupts = <13 IRQ_TYPE_LEVEL_LOW>; -+ - ports { - #address-cells = <1>; - #size-cells = <0>; -@@ -336,6 +341,11 @@ - marvell,function = "gpio"; - }; - -+ swint_pins: swint-pins { -+ marvell,pins = "mpp45"; -+ marvell,function = "gpio"; -+ }; -+ - spi0cs0_pins: spi0cs0-pins { - marvell,pins = "mpp25"; - marvell,function = "spi0"; diff --git a/target/linux/mvebu/patches-5.10/005-v5.11-ARM-dts-turris-omnia-add-SFP-node.patch b/target/linux/mvebu/patches-5.10/005-v5.11-ARM-dts-turris-omnia-add-SFP-node.patch deleted file mode 100644 index db8d26d038..0000000000 --- a/target/linux/mvebu/patches-5.10/005-v5.11-ARM-dts-turris-omnia-add-SFP-node.patch +++ /dev/null @@ -1,90 +0,0 @@ -From add2d65962977caf23ca2fa21a2457d31b636574 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Mon, 16 Nov 2020 13:24:22 +0100 -Subject: ARM: dts: turris-omnia: add SFP node -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Turris Omnia has an SFP cage that, together with WAN PHY, is connected -to eth2 SerDes via a SerDes multiplexor. When a SFP module is present, -the multiplexor switches the SerDes signal from PHY to SFP. - -Describe the SFP cage, but leave it disabled. Until phylink has support -for such configuration, we are leaving it to U-Boot to enable SFP and -disable WAN PHY at boot time depending on whether a SFP module is -present. - -Signed-off-by: Marek Behún -Fixes: 26ca8b52d6e1 ("ARM: dts: add support for Turris Omnia") -Reviewed-by: Andrew Lunn -Cc: Russell King - ARM Linux admin -Cc: linux-arm-kernel@lists.infradead.org -Cc: Uwe Kleine-König -Cc: Jason Cooper -Cc: Gregory CLEMENT -Cc: Andreas Färber -Cc: Rob Herring -Cc: devicetree@vger.kernel.org -Signed-off-by: Gregory CLEMENT ---- - arch/arm/boot/dts/armada-385-turris-omnia.dts | 30 ++++++++++++++++++++++++++- - 1 file changed, 29 insertions(+), 1 deletion(-) - ---- a/arch/arm/boot/dts/armada-385-turris-omnia.dts -+++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts -@@ -88,6 +88,24 @@ - }; - }; - }; -+ -+ sfp: sfp { -+ compatible = "sff,sfp"; -+ i2c-bus = <&sfp_i2c>; -+ tx-fault-gpios = <&pcawan 0 GPIO_ACTIVE_HIGH>; -+ tx-disable-gpios = <&pcawan 1 GPIO_ACTIVE_HIGH>; -+ rate-select0-gpios = <&pcawan 2 GPIO_ACTIVE_HIGH>; -+ los-gpios = <&pcawan 3 GPIO_ACTIVE_HIGH>; -+ mod-def0-gpios = <&pcawan 4 GPIO_ACTIVE_LOW>; -+ maximum-power-milliwatt = <3000>; -+ -+ /* -+ * For now this has to be enabled at boot time by U-Boot when -+ * a SFP module is present. Read more in the comment in the -+ * eth2 node below. -+ */ -+ status = "disabled"; -+ }; - }; - - &bm { -@@ -132,10 +150,20 @@ - - /* WAN port */ - ð2 { -+ /* -+ * eth2 is connected via a multiplexor to both the SFP cage and to -+ * ethernet-phy@1. The multiplexor switches the signal to SFP cage when -+ * a SFP module is present, as determined by the mode-def0 GPIO. -+ * -+ * Until kernel supports this configuration properly, in case SFP module -+ * is present, U-Boot has to enable the sfp node above, remove phy -+ * handle and add managed = "in-band-status" property. -+ */ - status = "okay"; - phy-mode = "sgmii"; - phy = <&phy1>; - phys = <&comphy5 2>; -+ sfp = <&sfp>; - buffer-manager = <&bm>; - bm,pool-long = <2>; - bm,pool-short = <3>; -@@ -201,7 +229,7 @@ - /* routed to PCIe2 connector (CN62A) */ - }; - -- i2c@4 { -+ sfp_i2c: i2c@4 { - #address-cells = <1>; - #size-cells = <0>; - reg = <4>; diff --git a/target/linux/mvebu/patches-5.10/006-v5.11-ARM-dts-turris-omnia-add-LED-controller-node.patch b/target/linux/mvebu/patches-5.10/006-v5.11-ARM-dts-turris-omnia-add-LED-controller-node.patch deleted file mode 100644 index 2f9ae49669..0000000000 --- a/target/linux/mvebu/patches-5.10/006-v5.11-ARM-dts-turris-omnia-add-LED-controller-node.patch +++ /dev/null @@ -1,160 +0,0 @@ -From 91dd42d0e30fdbb250c61d1192af569f07e6ada4 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Sun, 15 Nov 2020 14:59:21 +0100 -Subject: ARM: dts: turris-omnia: add LED controller node -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Linux now has incomplete support for the LED controller on Turris Omnia: -it can set brightness and colors for each LED. - -The controller can also put these LEDs into HW controlled mode, in which -the LEDs are controlled by HW: for example the WAN LED is connected via -MCU to the WAN PHY LED pin. - -The driver does not support these HW controlled modes yet, and on probe -puts the LEDs into SW controlled mode. - -Add node describing the LED controller, but disable it for now. - -Signed-off-by: Marek Behún -Cc: linux-arm-kernel@lists.infradead.org -Cc: Uwe Kleine-König -Cc: Jason Cooper -Cc: Gregory CLEMENT -Cc: Andreas Färber -Cc: Rob Herring -Cc: devicetree@vger.kernel.org -Signed-off-by: Gregory CLEMENT ---- - arch/arm/boot/dts/armada-385-turris-omnia.dts | 111 +++++++++++++++++++++++++- - 1 file changed, 110 insertions(+), 1 deletion(-) - ---- a/arch/arm/boot/dts/armada-385-turris-omnia.dts -+++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts -@@ -12,6 +12,7 @@ - - #include - #include -+#include - #include "armada-385.dtsi" - - / { -@@ -187,7 +188,115 @@ - reg = <0>; - - /* STM32F0 command interface at address 0x2a */ -- /* leds device (in STM32F0) at address 0x2b */ -+ -+ led-controller@2b { -+ compatible = "cznic,turris-omnia-leds"; -+ reg = <0x2b>; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ /* -+ * LEDs are controlled by MCU (STM32F0) at -+ * address 0x2b. -+ * -+ * The driver does not support HW control mode -+ * for the LEDs yet. Disable the LEDs for now. -+ * -+ * Also LED functions are not stable yet: -+ * - there are 3 LEDs connected via MCU to PCIe -+ * ports. One of these ports supports mSATA. -+ * There is no mSATA nor PCIe function. -+ * For now we use LED_FUNCTION_WLAN, since -+ * in most cases users have wifi cards in -+ * these slots -+ * - there are 2 LEDs dedicated for user: A and -+ * B. Again there is no such function defined. -+ * For now we use LED_FUNCTION_INDICATOR -+ */ -+ status = "disabled"; -+ -+ multi-led@0 { -+ reg = <0x0>; -+ color = ; -+ function = LED_FUNCTION_INDICATOR; -+ function-enumerator = <2>; -+ }; -+ -+ multi-led@1 { -+ reg = <0x1>; -+ color = ; -+ function = LED_FUNCTION_INDICATOR; -+ function-enumerator = <1>; -+ }; -+ -+ multi-led@2 { -+ reg = <0x2>; -+ color = ; -+ function = LED_FUNCTION_WLAN; -+ function-enumerator = <3>; -+ }; -+ -+ multi-led@3 { -+ reg = <0x3>; -+ color = ; -+ function = LED_FUNCTION_WLAN; -+ function-enumerator = <2>; -+ }; -+ -+ multi-led@4 { -+ reg = <0x4>; -+ color = ; -+ function = LED_FUNCTION_WLAN; -+ function-enumerator = <1>; -+ }; -+ -+ multi-led@5 { -+ reg = <0x5>; -+ color = ; -+ function = LED_FUNCTION_WAN; -+ }; -+ -+ multi-led@6 { -+ reg = <0x6>; -+ color = ; -+ function = LED_FUNCTION_LAN; -+ function-enumerator = <4>; -+ }; -+ -+ multi-led@7 { -+ reg = <0x7>; -+ color = ; -+ function = LED_FUNCTION_LAN; -+ function-enumerator = <3>; -+ }; -+ -+ multi-led@8 { -+ reg = <0x8>; -+ color = ; -+ function = LED_FUNCTION_LAN; -+ function-enumerator = <2>; -+ }; -+ -+ multi-led@9 { -+ reg = <0x9>; -+ color = ; -+ function = LED_FUNCTION_LAN; -+ function-enumerator = <1>; -+ }; -+ -+ multi-led@a { -+ reg = <0xa>; -+ color = ; -+ function = LED_FUNCTION_LAN; -+ function-enumerator = <0>; -+ }; -+ -+ multi-led@b { -+ reg = <0xb>; -+ color = ; -+ function = LED_FUNCTION_POWER; -+ }; -+ }; - - eeprom@54 { - compatible = "atmel,24c64"; diff --git a/target/linux/mvebu/patches-5.10/007-v5.11-ARM-dts-turris-omnia-update-ethernet-phy-node-and-handle-name.patch b/target/linux/mvebu/patches-5.10/007-v5.11-ARM-dts-turris-omnia-update-ethernet-phy-node-and-handle-name.patch deleted file mode 100644 index b20595f041..0000000000 --- a/target/linux/mvebu/patches-5.10/007-v5.11-ARM-dts-turris-omnia-update-ethernet-phy-node-and-handle-name.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 8ee4a5f4f40da60bb85e13d9dd218a3c9197e3e3 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Sun, 15 Nov 2020 14:59:22 +0100 -Subject: ARM: dts: turris-omnia: update ethernet-phy node and handle name -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Use property name `phy-handle` instead of the deprecated `phy` to -connect eth2 to the PHY. -Rename the node from "phy@1" to "ethernet-phy@1", since "phy@1" is -incorrect according to device-tree bindings documentation. -Also remove the "ethernet-phy-id0141.0DD1" compatible string, it is not -needed. Kernel can read the PHY identifier itself. - -Signed-off-by: Marek Behún -Reviewed-by: Andrew Lunn -Cc: linux-arm-kernel@lists.infradead.org -Cc: Uwe Kleine-König -Cc: Jason Cooper -Cc: Gregory CLEMENT -Cc: Andreas Färber -Cc: Rob Herring -Cc: devicetree@vger.kernel.org -Signed-off-by: Gregory CLEMENT ---- - arch/arm/boot/dts/armada-385-turris-omnia.dts | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/arch/arm/boot/dts/armada-385-turris-omnia.dts -+++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts -@@ -162,7 +162,7 @@ - */ - status = "okay"; - phy-mode = "sgmii"; -- phy = <&phy1>; -+ phy-handle = <&phy1>; - phys = <&comphy5 2>; - sfp = <&sfp>; - buffer-manager = <&bm>; -@@ -393,9 +393,9 @@ - pinctrl-0 = <&mdio_pins>; - status = "okay"; - -- phy1: phy@1 { -+ phy1: ethernet-phy@1 { - status = "okay"; -- compatible = "ethernet-phy-id0141.0DD1", "ethernet-phy-ieee802.3-c22"; -+ compatible = "ethernet-phy-ieee802.3-c22"; - reg = <1>; - marvell,reg-init = <3 18 0 0x4985>; - diff --git a/target/linux/mvebu/patches-5.10/008-v5.12-ARM-dts-turris-omnia-fix-hardware-buffer-management.patch b/target/linux/mvebu/patches-5.10/008-v5.12-ARM-dts-turris-omnia-fix-hardware-buffer-management.patch deleted file mode 100644 index 9c49430d6f..0000000000 --- a/target/linux/mvebu/patches-5.10/008-v5.12-ARM-dts-turris-omnia-fix-hardware-buffer-management.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 5b2c7e0ae762fff2b172caf16b2766cc3e1ad859 Mon Sep 17 00:00:00 2001 -From: Rui Salvaterra -Date: Wed, 17 Feb 2021 15:30:38 +0000 -Subject: ARM: dts: turris-omnia: fix hardware buffer management -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Hardware buffer management has never worked on the Turris Omnia, as the -required MBus window hadn't been reserved. Fix thusly. - -Fixes: 018b88eee1a2 ("ARM: dts: turris-omnia: enable HW buffer management") - -Signed-off-by: Rui Salvaterra -Reviewed-by: Marek Behún -Tested-by: Klaus Kudielka -Signed-off-by: Gregory CLEMENT ---- - arch/arm/boot/dts/armada-385-turris-omnia.dts | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - ---- a/arch/arm/boot/dts/armada-385-turris-omnia.dts -+++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts -@@ -38,7 +38,8 @@ - ranges = ; -+ MBUS_ID(0x09, 0x15) 0 0xf1110000 0x10000 -+ MBUS_ID(0x0c, 0x04) 0 0xf1200000 0x100000>; - - internal-regs { - diff --git a/target/linux/mvebu/patches-5.10/100-mvebu-dt-ARM-dts-turris-omnia-configure-LED-0-pin-function-to.patch b/target/linux/mvebu/patches-5.10/100-mvebu-dt-ARM-dts-turris-omnia-configure-LED-0-pin-function-to.patch deleted file mode 100644 index b71dd72609..0000000000 --- a/target/linux/mvebu/patches-5.10/100-mvebu-dt-ARM-dts-turris-omnia-configure-LED-0-pin-function-to.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 81c0004a6433ff90fa6129418802c3c367e453c2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Mon, 4 Jul 2022 13:36:21 +0200 -Subject: [PATCH] ARM: dts: turris-omnia: configure LED[0] pin function to - link/activity -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The marvell PHY driver changes the LED[0] pin function to "On - 1000 -Mbps Link, Off - Else". - -Turris Omnia expects that the function is "On - Link, Blink - Activity, -Off - No link". - -Use the `marvell,reg-init` DT property to change the function. - -In the future, once netdev trigger will support HW offloading, we will -be able to have this configured via the combination of PHY driver and -leds-turris-omnia driver. - -Signed-off-by: Marek Behún ---- - arch/arm/boot/dts/armada-385-turris-omnia.dts | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - ---- a/arch/arm/boot/dts/armada-385-turris-omnia.dts -+++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts -@@ -398,7 +398,8 @@ - status = "okay"; - compatible = "ethernet-phy-ieee802.3-c22"; - reg = <1>; -- marvell,reg-init = <3 18 0 0x4985>; -+ marvell,reg-init = <3 18 0 0x4985>, -+ <3 16 0xfff0 0x0001>; - - /* irq is connected to &pcawan pin 7 */ - }; diff --git a/target/linux/mvebu/patches-5.10/101-mvebu-dt-ARM-dts-turris-omnia-enable-LED-controller-node.patch b/target/linux/mvebu/patches-5.10/101-mvebu-dt-ARM-dts-turris-omnia-enable-LED-controller-node.patch deleted file mode 100644 index 8125f7a442..0000000000 --- a/target/linux/mvebu/patches-5.10/101-mvebu-dt-ARM-dts-turris-omnia-enable-LED-controller-node.patch +++ /dev/null @@ -1,48 +0,0 @@ -From fed7cef5e4f2df8c6a79bebf5da1fdd3783ff6f3 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Mon, 4 Jul 2022 13:36:22 +0200 -Subject: [PATCH] ARM: dts: turris-omnia: enable LED controller node -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The LED controller node is disabled because the leds-turris-omnia driver -does not support setting the LED blinking to be controlled by the MCU. - -The patches for that have now been sent [1], so let's enable the node. - -[1] https://lore.kernel.org/linux-leds/20220704105955.15474-1-kabel@kernel.org/T/ - -Signed-off-by: Marek Behún ---- - arch/arm/boot/dts/armada-385-turris-omnia.dts | 7 ++----- - 1 file changed, 2 insertions(+), 5 deletions(-) - ---- a/arch/arm/boot/dts/armada-385-turris-omnia.dts -+++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts -@@ -195,15 +195,13 @@ - reg = <0x2b>; - #address-cells = <1>; - #size-cells = <0>; -+ status = "okay"; - - /* - * LEDs are controlled by MCU (STM32F0) at - * address 0x2b. - * -- * The driver does not support HW control mode -- * for the LEDs yet. Disable the LEDs for now. -- * -- * Also LED functions are not stable yet: -+ * LED functions are not stable yet: - * - there are 3 LEDs connected via MCU to PCIe - * ports. One of these ports supports mSATA. - * There is no mSATA nor PCIe function. -@@ -214,7 +212,6 @@ - * B. Again there is no such function defined. - * For now we use LED_FUNCTION_INDICATOR - */ -- status = "disabled"; - - multi-led@0 { - reg = <0x0>; diff --git a/target/linux/mvebu/patches-5.10/102-leds-turris-omnia-support-HW-controlled-mode-via-pri.patch b/target/linux/mvebu/patches-5.10/102-leds-turris-omnia-support-HW-controlled-mode-via-pri.patch deleted file mode 100644 index 578124f94d..0000000000 --- a/target/linux/mvebu/patches-5.10/102-leds-turris-omnia-support-HW-controlled-mode-via-pri.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 80e643510cb14f116f687e992210c0008a09d869 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Mon, 4 Jul 2022 12:59:53 +0200 -Subject: [PATCH] leds: turris-omnia: support HW controlled mode via - private trigger -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Add support for enabling MCU controlled mode of the Turris Omnia LEDs -via a LED private trigger called "omnia-mcu". - -When in MCU controlled mode, the user can still set LED color, but the -blinking is done by MCU, which does different things for various LEDs: -- WAN LED is blinked according to the LED[0] pin of the WAN PHY -- LAN LEDs are blinked according to the LED[0] output of corresponding - port of the LAN switch -- PCIe LEDs are blinked according to the logical OR of the MiniPCIe port - LED pins - -For a long time I wanted to actually do this differently: I wanted to -make the netdev trigger to transparently offload the blinking to the HW -if user set compatible settings for the netdev trigger. -There was some work on this, and hopefully we will be able to complete -it sometime, but since there are various complications, it will probably -not be soon. - -In the meantime let's support HW controlled mode via this private LED -trigger. If, in the future, we manage to complete the netdev trigger -offloading, we can still keep this private trigger for backwards -compatiblity, if needed. - -We also set "omnia-mcu" to cdev->default_trigger, so that the MCU keeps -control until the user first wants to take over it. If a different -default trigger is specified in device-tree via the -`linux,default-trigger` property, LED class will overwrite -cdev->default_trigger, and so the DT property will be respected. - -Signed-off-by: Marek Behún ---- - drivers/leds/Kconfig | 1 + - drivers/leds/leds-turris-omnia.c | 41 ++++++++++++++++++++++++++++++++ - 2 files changed, 42 insertions(+) - ---- a/drivers/leds/Kconfig -+++ b/drivers/leds/Kconfig -@@ -182,6 +182,7 @@ config LEDS_TURRIS_OMNIA - depends on I2C - depends on MACH_ARMADA_38X || COMPILE_TEST - depends on OF -+ select LEDS_TRIGGERS - help - This option enables basic support for the LEDs found on the front - side of CZ.NIC's Turris Omnia router. There are 12 RGB LEDs on the ---- a/drivers/leds/leds-turris-omnia.c -+++ b/drivers/leds/leds-turris-omnia.c -@@ -49,6 +49,39 @@ struct omnia_leds { - struct omnia_led leds[]; - }; - -+static struct led_hw_trigger_type omnia_hw_trigger_type; -+ -+static int omnia_hwtrig_activate(struct led_classdev *cdev) -+{ -+ struct omnia_leds *leds = dev_get_drvdata(cdev->dev->parent); -+ struct omnia_led *led = to_omnia_led(lcdev_to_mccdev(cdev)); -+ -+ /* put the LED into MCU controlled mode */ -+ return i2c_smbus_write_byte_data(leds->client, CMD_LED_MODE, -+ CMD_LED_MODE_LED(led->reg)); -+} -+ -+static void omnia_hwtrig_deactivate(struct led_classdev *cdev) -+{ -+ struct omnia_leds *leds = dev_get_drvdata(cdev->dev->parent); -+ struct omnia_led *led = to_omnia_led(lcdev_to_mccdev(cdev)); -+ int ret; -+ -+ /* put the LED into software mode */ -+ ret = i2c_smbus_write_byte_data(leds->client, CMD_LED_MODE, -+ CMD_LED_MODE_LED(led->reg) | -+ CMD_LED_MODE_USER); -+ if (ret < 0) -+ dev_err(cdev->dev, "Cannot put to software mode: %i\n", ret); -+} -+ -+static struct led_trigger omnia_hw_trigger = { -+ .name = "omnia-mcu", -+ .activate = omnia_hwtrig_activate, -+ .deactivate = omnia_hwtrig_deactivate, -+ .trigger_type = &omnia_hw_trigger_type, -+}; -+ - static int omnia_led_brightness_set_blocking(struct led_classdev *cdev, - enum led_brightness brightness) - { -@@ -120,6 +153,8 @@ static int omnia_led_register(struct i2c - cdev = &led->mc_cdev.led_cdev; - cdev->max_brightness = 255; - cdev->brightness_set_blocking = omnia_led_brightness_set_blocking; -+ cdev->trigger_type = &omnia_hw_trigger_type; -+ cdev->default_trigger = omnia_hw_trigger.name; - - /* put the LED into software mode */ - ret = i2c_smbus_write_byte_data(client, CMD_LED_MODE, -@@ -231,6 +266,12 @@ static int omnia_leds_probe(struct i2c_c - - mutex_init(&leds->lock); - -+ ret = devm_led_trigger_register(dev, &omnia_hw_trigger); -+ if (ret < 0) { -+ dev_err(dev, "Cannot register private LED trigger: %d\n", ret); -+ return ret; -+ } -+ - led = &leds->leds[0]; - for_each_available_child_of_node(np, child) { - ret = omnia_led_register(client, led, child); diff --git a/target/linux/mvebu/patches-5.10/103-leds-turris-omnia-initialize-multi-intensity-to-full.patch b/target/linux/mvebu/patches-5.10/103-leds-turris-omnia-initialize-multi-intensity-to-full.patch deleted file mode 100644 index 6f9aaf11db..0000000000 --- a/target/linux/mvebu/patches-5.10/103-leds-turris-omnia-initialize-multi-intensity-to-full.patch +++ /dev/null @@ -1,33 +0,0 @@ -From bda176cceb735b9b46c1900658b6486c34e13ae6 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Mon, 4 Jul 2022 12:59:54 +0200 -Subject: [PATCH] leds: turris-omnia: initialize multi-intensity to full -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The default color of each LED before driver probe (255, 255, 255). -Initialize multi_intensity to this value, so that it corresponds to the -reality. - -Signed-off-by: Marek Behún ---- - drivers/leds/leds-turris-omnia.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/drivers/leds/leds-turris-omnia.c -+++ b/drivers/leds/leds-turris-omnia.c -@@ -139,10 +139,13 @@ static int omnia_led_register(struct i2c - } - - led->subled_info[0].color_index = LED_COLOR_ID_RED; -+ led->subled_info[0].intensity = 255; - led->subled_info[0].channel = 0; - led->subled_info[1].color_index = LED_COLOR_ID_GREEN; -+ led->subled_info[1].intensity = 255; - led->subled_info[1].channel = 1; - led->subled_info[2].color_index = LED_COLOR_ID_BLUE; -+ led->subled_info[2].intensity = 255; - led->subled_info[2].channel = 2; - - led->mc_cdev.subled_info = led->subled_info; diff --git a/target/linux/mvebu/patches-5.10/104-leds-turris-omnia-change-max-brightness-from-255-to-.patch b/target/linux/mvebu/patches-5.10/104-leds-turris-omnia-change-max-brightness-from-255-to-.patch deleted file mode 100644 index da4ad49b23..0000000000 --- a/target/linux/mvebu/patches-5.10/104-leds-turris-omnia-change-max-brightness-from-255-to-.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 349cbe949b9622cc05b148ecfa6268cbbae35b45 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marek=20Beh=C3=BAn?= -Date: Mon, 4 Jul 2022 12:59:55 +0200 -Subject: [PATCH] leds: turris-omnia: change max brightness from 255 to 1 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Using binary brightness makes more sense for this controller, because -internally in the MCU it works that way: the LED has a color, and a -state whether it is ON or OFF. - -The resulting brightness computation with led_mc_calc_color_components() -will now always result in either (0, 0, 0) or the multi_intensity value. - -Signed-off-by: Marek Behún ---- - drivers/leds/leds-turris-omnia.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/leds/leds-turris-omnia.c -+++ b/drivers/leds/leds-turris-omnia.c -@@ -154,7 +154,7 @@ static int omnia_led_register(struct i2c - init_data.fwnode = &np->fwnode; - - cdev = &led->mc_cdev.led_cdev; -- cdev->max_brightness = 255; -+ cdev->max_brightness = 1; - cdev->brightness_set_blocking = omnia_led_brightness_set_blocking; - cdev->trigger_type = &omnia_hw_trigger_type; - cdev->default_trigger = omnia_hw_trigger.name; diff --git a/target/linux/mvebu/patches-5.10/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch b/target/linux/mvebu/patches-5.10/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch deleted file mode 100644 index 04c80113c1..0000000000 --- a/target/linux/mvebu/patches-5.10/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch +++ /dev/null @@ -1,208 +0,0 @@ -From 71270226b14733a4b1f2cde58ea9265caa50b38d Mon Sep 17 00:00:00 2001 -From: Adrian Panella -Date: Thu, 9 Mar 2017 09:37:17 +0100 -Subject: [PATCH 67/69] generic: Mangle bootloader's kernel arguments - -The command-line arguments provided by the boot loader will be -appended to a new device tree property: bootloader-args. -If there is a property "append-rootblock" in DT under /chosen -and a root= option in bootloaders command line it will be parsed -and added to DT bootargs with the form: XX. -Only command line ATAG will be processed, the rest of the ATAGs -sent by bootloader will be ignored. -This is usefull in dual boot systems, to get the current root partition -without afecting the rest of the system. - -Signed-off-by: Adrian Panella - -This patch has been modified to be mvebu specific. The original patch -did not pass the bootloader cmdline on if no append-rootblock stanza -was found, resulting in blank cmdline and failure to boot. - -Signed-off-by: Michael Gray ---- - arch/arm/Kconfig | 11 ++++ - arch/arm/boot/compressed/atags_to_fdt.c | 85 ++++++++++++++++++++++++- - init/main.c | 16 +++++ - 3 files changed, 111 insertions(+), 1 deletion(-) - ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -1777,6 +1777,17 @@ config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEN - The command-line arguments provided by the boot loader will be - appended to the the device tree bootargs property. - -+config ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE -+ bool "Append rootblock parsing bootloader's kernel arguments" -+ help -+ The command-line arguments provided by the boot loader will be -+ appended to a new device tree property: bootloader-args. -+ If there is a property "append-rootblock" in DT under /chosen -+ and a root= option in bootloaders command line it will be parsed -+ and added to DT bootargs with the form: XX. -+ Only command line ATAG will be processed, the rest of the ATAGs -+ sent by bootloader will be ignored. -+ - endchoice - - config CMDLINE ---- a/arch/arm/boot/compressed/atags_to_fdt.c -+++ b/arch/arm/boot/compressed/atags_to_fdt.c -@@ -5,6 +5,8 @@ - - #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND) - #define do_extend_cmdline 1 -+#elif defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) -+#define do_extend_cmdline 1 - #else - #define do_extend_cmdline 0 - #endif -@@ -69,6 +71,72 @@ static uint32_t get_cell_size(const void - return cell_size; - } - -+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) -+ -+static char *append_rootblock(char *dest, const char *str, int len, void *fdt) -+{ -+ char *ptr, *end; -+ char *root="root="; -+ int i, l; -+ const char *rootblock; -+ -+ //ARM doesn't have __HAVE_ARCH_STRSTR, so search manually -+ ptr = str - 1; -+ -+ do { -+ //first find an 'r' at the begining or after a space -+ do { -+ ptr++; -+ ptr = strchr(ptr, 'r'); -+ if (!ptr) -+ goto no_append; -+ -+ } while (ptr != str && *(ptr-1) != ' '); -+ -+ //then check for the rest -+ for(i = 1; i <= 4; i++) -+ if(*(ptr+i) != *(root+i)) break; -+ -+ } while (i != 5); -+ -+ end = strchr(ptr, ' '); -+ end = end ? (end - 1) : (strchr(ptr, 0) - 1); -+ -+ //find partition number (assumes format root=/dev/mtdXX | /dev/mtdblockXX | yy:XX ) -+ for( i = 0; end >= ptr && *end >= '0' && *end <= '9'; end--, i++); -+ ptr = end + 1; -+ -+ /* if append-rootblock property is set use it to append to command line */ -+ rootblock = getprop(fdt, "/chosen", "append-rootblock", &l); -+ if (rootblock == NULL) -+ goto no_append; -+ -+ if (*dest != ' ') { -+ *dest = ' '; -+ dest++; -+ len++; -+ } -+ -+ if (len + l + i <= COMMAND_LINE_SIZE) { -+ memcpy(dest, rootblock, l); -+ dest += l - 1; -+ memcpy(dest, ptr, i); -+ dest += i; -+ } -+ -+ return dest; -+ -+no_append: -+ len = strlen(str); -+ if (len + 1 < COMMAND_LINE_SIZE) { -+ memcpy(dest, str, len); -+ dest += len; -+ } -+ -+ return dest; -+} -+#endif -+ - static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) - { - char cmdline[COMMAND_LINE_SIZE]; -@@ -88,12 +156,21 @@ static void merge_fdt_bootargs(void *fdt - - /* and append the ATAG_CMDLINE */ - if (fdt_cmdline) { -+ -+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) -+ //save original bootloader args -+ //and append ubi.mtd with root partition number to current cmdline -+ setprop_string(fdt, "/chosen", "bootloader-args", fdt_cmdline); -+ ptr = append_rootblock(ptr, fdt_cmdline, len, fdt); -+ -+#else - len = strlen(fdt_cmdline); - if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) { - *ptr++ = ' '; - memcpy(ptr, fdt_cmdline, len); - ptr += len; - } -+#endif - } - *ptr = '\0'; - -@@ -168,7 +245,9 @@ int atags_to_fdt(void *atag_list, void * - else - setprop_string(fdt, "/chosen", "bootargs", - atag->u.cmdline.cmdline); -- } else if (atag->hdr.tag == ATAG_MEM) { -+ } -+#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE -+ else if (atag->hdr.tag == ATAG_MEM) { - if (memcount >= sizeof(mem_reg_property)/4) - continue; - if (!atag->u.mem.size) -@@ -212,6 +291,10 @@ int atags_to_fdt(void *atag_list, void * - setprop(fdt, "/memory", "reg", mem_reg_property, - 4 * memcount * memsize); - } -+#else -+ -+ } -+#endif - - return fdt_pack(fdt); - } ---- a/init/main.c -+++ b/init/main.c -@@ -110,6 +110,10 @@ - - #include - -+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) -+#include -+#endif -+ - static int kernel_init(void *); - - extern void init_IRQ(void); -@@ -904,6 +908,18 @@ asmlinkage __visible void __init __no_sa - page_alloc_init(); - - pr_notice("Kernel command line: %s\n", saved_command_line); -+ -+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) -+ //Show bootloader's original command line for reference -+ if(of_chosen) { -+ const char *prop = of_get_property(of_chosen, "bootloader-args", NULL); -+ if(prop) -+ pr_notice("Bootloader command line (ignored): %s\n", prop); -+ else -+ pr_notice("Bootloader command line not present\n"); -+ } -+#endif -+ - /* parameters may set static keys */ - jump_label_init(); - parse_early_param(); diff --git a/target/linux/mvebu/patches-5.10/302-add_powertables.patch b/target/linux/mvebu/patches-5.10/302-add_powertables.patch deleted file mode 100644 index efbbbc7d78..0000000000 --- a/target/linux/mvebu/patches-5.10/302-add_powertables.patch +++ /dev/null @@ -1,770 +0,0 @@ ---- a/arch/arm/boot/dts/armada-385-linksys.dtsi -+++ b/arch/arm/boot/dts/armada-385-linksys.dtsi -@@ -212,11 +212,19 @@ - &pcie1 { - /* Marvell 88W8864, 5GHz-only */ - status = "okay"; -+ -+ mwlwifi { -+ marvell,2ghz = <0>; -+ }; - }; - - &pcie2 { - /* Marvell 88W8864, 2GHz-only */ - status = "okay"; -+ -+ mwlwifi { -+ marvell,5ghz = <0>; -+ }; - }; - - &pinctrl { ---- a/arch/arm/boot/dts/armada-385-linksys-caiman.dts -+++ b/arch/arm/boot/dts/armada-385-linksys-caiman.dts -@@ -142,3 +142,205 @@ - }; - }; - }; -+ -+&pcie1 { -+ mwlwifi { -+ marvell,chainmask = <2 2>; -+ marvell,powertable { -+ AU = -+ <36 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <40 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <44 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <48 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <52 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <56 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <60 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <64 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <100 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, -+ <104 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, -+ <108 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, -+ <112 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, -+ <116 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, -+ <120 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, -+ <124 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, -+ <128 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, -+ <132 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, -+ <136 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, -+ <140 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, -+ <149 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>, -+ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>, -+ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>, -+ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>, -+ <165 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>; -+ CA = -+ <36 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>, -+ <40 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>, -+ <44 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>, -+ <48 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>, -+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <149 0 0x1a 0x1a 0x18 0x17 0x19 0x19 0x17 0x15 0x18 0x18 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, -+ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, -+ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, -+ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, -+ <165 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>; -+ CN = -+ <36 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <40 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <44 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <48 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <52 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <56 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <60 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <64 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <100 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <104 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <108 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <112 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <116 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <120 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <124 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <128 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <132 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <136 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <140 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <149 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x11 0x11 0x11 0x11 0 0xf>, -+ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>, -+ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>, -+ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>, -+ <165 0 0x15 0x15 0x15 0x15 0x16 0x16 0x16 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>; -+ ETSI = -+ <36 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <40 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <44 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <48 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <52 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <56 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <60 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <64 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <100 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <104 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <108 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <112 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <116 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <120 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <124 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <128 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <132 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <136 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <140 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, -+ <149 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>; -+ FCC = -+ <36 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <40 0 0x19 0x19 0x18 0x17 0x19 0x19 0x17 0x15 0x17 0x17 0x17 0x14 0x10 0x10 0x10 0x10 0 0xf>, -+ <44 0 0x19 0x19 0x18 0x17 0x19 0x19 0x17 0x15 0x17 0x17 0x17 0x14 0x10 0x10 0x10 0x10 0 0xf>, -+ <48 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x17 0x17 0x17 0x14 0x10 0x10 0x10 0x10 0 0xf>, -+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <149 0 0x1a 0x1a 0x18 0x17 0x19 0x19 0x17 0x15 0x18 0x18 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, -+ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, -+ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, -+ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, -+ <165 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>; -+ }; -+ }; -+}; -+ -+&pcie2 { -+ mwlwifi { -+ marvell,chainmask = <2 2>; -+ marvell,powertable { -+ AU = -+ <1 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>; -+ CA = -+ <1 0 0x19 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x10 0x10 0x10 0x10 0x00 0x00 0x00 0x00 0 0xf>, -+ <2 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, -+ <3 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, -+ <4 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, -+ <5 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, -+ <6 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, -+ <7 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, -+ <8 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, -+ <9 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, -+ <10 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, -+ <11 0 0x19 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x00 0x00 0x00 0x00 0 0xf>; -+ CN = -+ <1 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <12 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <13 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <14 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>; -+ ETSI = -+ <1 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <12 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, -+ <13 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>; -+ FCC = -+ <1 0 0x19 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0x19 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x0 0x0 0x0 0x0 0 0xf>; -+ }; -+ }; -+}; ---- a/arch/arm/boot/dts/armada-385-linksys-cobra.dts -+++ b/arch/arm/boot/dts/armada-385-linksys-cobra.dts -@@ -142,3 +142,205 @@ - }; - }; - }; -+ -+&pcie1 { -+ mwlwifi { -+ marvell,chainmask = <4 4>; -+ marvell,powertable { -+ AU = -+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <100 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <104 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <108 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <112 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <116 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <120 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <124 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <128 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <132 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <136 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <140 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <149 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, -+ <153 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, -+ <157 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, -+ <161 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, -+ <165 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>; -+ CA = -+ <36 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <40 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <44 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <48 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>; -+ CN = -+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <149 0 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, -+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, -+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, -+ <165 0 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>; -+ ETSI = -+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <149 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>; -+ FCC = -+ <36 0 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0 0xf>, -+ <40 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, -+ <44 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, -+ <48 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, -+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>; -+ }; -+ }; -+}; -+ -+&pcie2 { -+ mwlwifi { -+ marvell,chainmask = <4 4>; -+ marvell,powertable { -+ AU = -+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; -+ CA = -+ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>; -+ CN = -+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <14 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; -+ ETSI = -+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; -+ FCC = -+ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>; -+ }; -+ }; -+}; ---- a/arch/arm/boot/dts/armada-385-linksys-shelby.dts -+++ b/arch/arm/boot/dts/armada-385-linksys-shelby.dts -@@ -142,3 +142,205 @@ - }; - }; - }; -+ -+&pcie1 { -+ mwlwifi { -+ marvell,chainmask = <4 4>; -+ marvell,powertable { -+ AU = -+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <100 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <104 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <108 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <112 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <116 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <120 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <124 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <128 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <132 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <136 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <140 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <149 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, -+ <153 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, -+ <157 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, -+ <161 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, -+ <165 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>; -+ CA = -+ <36 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <40 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <44 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <48 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>; -+ CN = -+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <149 0 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, -+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, -+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, -+ <165 0 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>; -+ ETSI = -+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, -+ <149 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>; -+ FCC = -+ <36 0 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0 0xf>, -+ <40 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, -+ <44 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, -+ <48 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, -+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, -+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, -+ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, -+ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>; -+ }; -+ }; -+}; -+ -+&pcie2 { -+ mwlwifi { -+ marvell,chainmask = <4 4>; -+ marvell,powertable { -+ AU = -+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; -+ CA = -+ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>; -+ CN = -+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <14 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; -+ ETSI = -+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, -+ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; -+ FCC = -+ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>; -+ }; -+ }; -+}; ---- a/arch/arm/boot/dts/armada-385-linksys-rango.dts -+++ b/arch/arm/boot/dts/armada-385-linksys-rango.dts -@@ -157,6 +157,18 @@ - }; - }; - -+&pcie1 { -+ mwlwifi { -+ marvell,chainmask = <4 4>; -+ }; -+}; -+ -+&pcie2 { -+ mwlwifi { -+ marvell,chainmask = <4 4>; -+ }; -+}; -+ - &sdhci { - pinctrl-names = "default"; - pinctrl-0 = <&sdhci_pins>; ---- a/arch/arm/boot/dts/armada-xp-linksys-mamba.dts -+++ b/arch/arm/boot/dts/armada-xp-linksys-mamba.dts -@@ -225,12 +225,100 @@ - pcie@2,0 { - /* Port 0, Lane 1 */ - status = "okay"; -+ -+ mwlwifi { -+ marvell,5ghz = <0>; -+ marvell,chainmask = <4 4>; -+ marvell,powertable { -+ FCC = -+ <1 0 0x17 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0x17 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>; -+ -+ ETSI = -+ <1 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <2 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <3 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <4 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <5 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <6 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <7 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <8 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <9 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <10 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <11 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <12 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, -+ <13 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>; -+ }; -+ }; - }; - - /* Second mini-PCIe port */ - pcie@3,0 { - /* Port 0, Lane 3 */ - status = "okay"; -+ -+ mwlwifi { -+ marvell,2ghz = <0>; -+ marvell,chainmask = <4 4>; -+ marvell,powertable { -+ FCC = -+ <36 0 0x8 0x8 0x8 0x8 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <40 0 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <44 0 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <48 0 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, -+ <52 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>, -+ <56 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>, -+ <60 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>, -+ <64 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>, -+ <100 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <104 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <108 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <112 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <116 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <120 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <124 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <128 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <132 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <136 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <140 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, -+ <149 0 0x16 0x16 0x16 0x16 0x14 0x14 0x14 0x14 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>, -+ <153 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>, -+ <157 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>, -+ <161 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>, -+ <165 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>; -+ -+ ETSI = -+ <36 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <40 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <44 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <48 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <52 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <56 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <60 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <64 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <100 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <104 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <108 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <112 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <116 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <120 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <124 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <128 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <132 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <136 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <140 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, -+ <149 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>; -+ }; -+ }; - }; - }; - diff --git a/target/linux/mvebu/patches-5.10/303-linksys_hardcode_nand_ecc_settings.patch b/target/linux/mvebu/patches-5.10/303-linksys_hardcode_nand_ecc_settings.patch deleted file mode 100644 index 89a5e19803..0000000000 --- a/target/linux/mvebu/patches-5.10/303-linksys_hardcode_nand_ecc_settings.patch +++ /dev/null @@ -1,17 +0,0 @@ -Newer Linksys boards might come with a Winbond W29N02GV which can be -configured in different ways. Make sure we configure it the same way -as the older chips so everything keeps working. - -Signed-off-by: Imre Kaloz - ---- a/arch/arm/boot/dts/armada-385-linksys.dtsi -+++ b/arch/arm/boot/dts/armada-385-linksys.dtsi -@@ -148,6 +148,8 @@ - reg = <0>; - label = "pxa3xx_nand-0"; - nand-rb = <0>; -+ nand-ecc-strength = <4>; -+ nand-ecc-step-size = <512>; - marvell,nand-keep-config; - nand-on-flash-bbt; - }; diff --git a/target/linux/mvebu/patches-5.10/314-arm64-dts-uDPU-switch-PHY-operation-mode-to-2500base.patch b/target/linux/mvebu/patches-5.10/314-arm64-dts-uDPU-switch-PHY-operation-mode-to-2500base.patch deleted file mode 100644 index 2240d0b39e..0000000000 --- a/target/linux/mvebu/patches-5.10/314-arm64-dts-uDPU-switch-PHY-operation-mode-to-2500base.patch +++ /dev/null @@ -1,34 +0,0 @@ -Certain SFP modules (most notably Nokia GPON ones) first check -connectivity on 1000base-x, and switch to 2500base-x afterwards. This -is considered a quirk so the phylink switches the interface to -2500base-x as well. - -However, after power-cycling the uDPU device, network interface/SFP module -will not work correctly until the module is re-seated. This patch -resolves this issue by forcing the interface to be brought up in -2500base-x mode by default. - -Signed-off-by: Jakov Petrina -Signed-off-by: Vladimir Vid -Cc: Luka Perkov - ---- a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts -+++ b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts -@@ -162,7 +162,7 @@ - }; - - ð0 { -- phy-mode = "sgmii"; -+ phy-mode = "2500base-x"; - status = "okay"; - managed = "in-band-status"; - phys = <&comphy1 0>; -@@ -170,7 +170,7 @@ - }; - - ð1 { -- phy-mode = "sgmii"; -+ phy-mode = "2500base-x"; - status = "okay"; - managed = "in-band-status"; - phys = <&comphy0 1>; diff --git a/target/linux/mvebu/patches-5.10/700-mvneta-tx-queue-workaround.patch b/target/linux/mvebu/patches-5.10/700-mvneta-tx-queue-workaround.patch deleted file mode 100644 index a0f15681f5..0000000000 --- a/target/linux/mvebu/patches-5.10/700-mvneta-tx-queue-workaround.patch +++ /dev/null @@ -1,38 +0,0 @@ -The hardware queue scheduling is apparently configured with fixed -priorities, which creates a nasty fairness issue where traffic from one -CPU can starve traffic from all other CPUs. - -Work around this issue by forcing all tx packets to go through one CPU, -until this issue is fixed properly. - -Signed-off-by: Felix Fietkau ---- ---- a/drivers/net/ethernet/marvell/mvneta.c -+++ b/drivers/net/ethernet/marvell/mvneta.c -@@ -4903,6 +4903,16 @@ static int mvneta_ethtool_set_eee(struct - return phylink_ethtool_set_eee(pp->phylink, eee); - } - -+#ifndef CONFIG_ARM64 -+static u16 mvneta_select_queue(struct net_device *dev, struct sk_buff *skb, -+ struct net_device *sb_dev) -+{ -+ /* XXX: hardware queue scheduling is broken, -+ * use only one queue until it is fixed */ -+ return 0; -+} -+#endif -+ - static const struct net_device_ops mvneta_netdev_ops = { - .ndo_open = mvneta_open, - .ndo_stop = mvneta_stop, -@@ -4913,6 +4923,9 @@ static const struct net_device_ops mvnet - .ndo_fix_features = mvneta_fix_features, - .ndo_get_stats64 = mvneta_get_stats64, - .ndo_do_ioctl = mvneta_ioctl, -+#ifndef CONFIG_ARM64 -+ .ndo_select_queue = mvneta_select_queue, -+#endif - .ndo_bpf = mvneta_xdp, - .ndo_xdp_xmit = mvneta_xdp_xmit, - }; diff --git a/target/linux/mvebu/patches-5.10/701-v5.14-net-ethernet-marvell-mvnetaMQPrio.patch b/target/linux/mvebu/patches-5.10/701-v5.14-net-ethernet-marvell-mvnetaMQPrio.patch deleted file mode 100644 index 36d4942f8b..0000000000 --- a/target/linux/mvebu/patches-5.10/701-v5.14-net-ethernet-marvell-mvnetaMQPrio.patch +++ /dev/null @@ -1,109 +0,0 @@ -From 4906887a8ae5f1296f8079bcf4565a6092a8e402 Mon Sep 17 00:00:00 2001 -From: Maxime Chevallier -Date: Tue, 16 Feb 2021 10:25:36 +0100 -Subject: net: mvneta: Implement mqprio support - -Implement a basic MQPrio support, inserting rules in RX that translate -the TC to prio mapping into vlan prio to queues. - -The TX logic stays the same as when we don't offload the qdisc. - -Signed-off-by: Maxime Chevallier -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/marvell/mvneta.c | 61 +++++++++++++++++++++++++++++++++++ - 1 file changed, 61 insertions(+) - -(limited to 'drivers/net/ethernet/marvell/mvneta.c') - ---- a/drivers/net/ethernet/marvell/mvneta.c -+++ b/drivers/net/ethernet/marvell/mvneta.c -@@ -102,6 +102,8 @@ - #define MVNETA_TX_NO_DATA_SWAP BIT(5) - #define MVNETA_DESC_SWAP BIT(6) - #define MVNETA_TX_BRST_SZ_MASK(burst) ((burst) << 22) -+#define MVNETA_VLAN_PRIO_TO_RXQ 0x2440 -+#define MVNETA_VLAN_PRIO_RXQ_MAP(prio, rxq) ((rxq) << ((prio) * 3)) - #define MVNETA_PORT_STATUS 0x2444 - #define MVNETA_TX_IN_PRGRS BIT(0) - #define MVNETA_TX_FIFO_EMPTY BIT(8) -@@ -490,6 +492,7 @@ struct mvneta_port { - u8 mcast_count[256]; - u16 tx_ring_size; - u16 rx_ring_size; -+ u8 prio_tc_map[8]; - - phy_interface_t phy_interface; - struct device_node *dn; -@@ -4913,6 +4916,63 @@ static u16 mvneta_select_queue(struct ne - } - #endif - -+static void mvneta_clear_rx_prio_map(struct mvneta_port *pp) -+{ -+ mvreg_write(pp, MVNETA_VLAN_PRIO_TO_RXQ, 0); -+} -+ -+static void mvneta_setup_rx_prio_map(struct mvneta_port *pp) -+{ -+ u32 val = 0; -+ int i; -+ -+ for (i = 0; i < rxq_number; i++) -+ val |= MVNETA_VLAN_PRIO_RXQ_MAP(i, pp->prio_tc_map[i]); -+ -+ mvreg_write(pp, MVNETA_VLAN_PRIO_TO_RXQ, val); -+} -+ -+static int mvneta_setup_mqprio(struct net_device *dev, -+ struct tc_mqprio_qopt *qopt) -+{ -+ struct mvneta_port *pp = netdev_priv(dev); -+ u8 num_tc; -+ int i; -+ -+ qopt->hw = TC_MQPRIO_HW_OFFLOAD_TCS; -+ num_tc = qopt->num_tc; -+ -+ if (num_tc > rxq_number) -+ return -EINVAL; -+ -+ if (!num_tc) { -+ mvneta_clear_rx_prio_map(pp); -+ netdev_reset_tc(dev); -+ return 0; -+ } -+ -+ memcpy(pp->prio_tc_map, qopt->prio_tc_map, sizeof(pp->prio_tc_map)); -+ -+ mvneta_setup_rx_prio_map(pp); -+ -+ netdev_set_num_tc(dev, qopt->num_tc); -+ for (i = 0; i < qopt->num_tc; i++) -+ netdev_set_tc_queue(dev, i, qopt->count[i], qopt->offset[i]); -+ -+ return 0; -+} -+ -+static int mvneta_setup_tc(struct net_device *dev, enum tc_setup_type type, -+ void *type_data) -+{ -+ switch (type) { -+ case TC_SETUP_QDISC_MQPRIO: -+ return mvneta_setup_mqprio(dev, type_data); -+ default: -+ return -EOPNOTSUPP; -+ } -+} -+ - static const struct net_device_ops mvneta_netdev_ops = { - .ndo_open = mvneta_open, - .ndo_stop = mvneta_stop, -@@ -4928,6 +4988,7 @@ static const struct net_device_ops mvnet - #endif - .ndo_bpf = mvneta_xdp, - .ndo_xdp_xmit = mvneta_xdp_xmit, -+ .ndo_setup_tc = mvneta_setup_tc, - }; - - static const struct ethtool_ops mvneta_eth_tool_ops = { diff --git a/target/linux/mvebu/patches-5.10/702-net-next-ethernet-marvell-mvnetaMQPrioOffload.patch b/target/linux/mvebu/patches-5.10/702-net-next-ethernet-marvell-mvnetaMQPrioOffload.patch deleted file mode 100644 index 41f8c1fbfd..0000000000 --- a/target/linux/mvebu/patches-5.10/702-net-next-ethernet-marvell-mvnetaMQPrioOffload.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 75fa71e3acadbb4ab5eda18505277eb9a1f69b23 Mon Sep 17 00:00:00 2001 -From: Maxime Chevallier -Date: Fri, 26 Nov 2021 12:20:53 +0100 -Subject: net: mvneta: Use struct tc_mqprio_qopt_offload for MQPrio - configuration - -The struct tc_mqprio_qopt_offload is a container for struct tc_mqprio_qopt, -that allows passing extra parameters, such as traffic shaping. This commit -converts the current mqprio code to that new struct. - -Signed-off-by: Maxime Chevallier -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/marvell/mvneta.c | 17 ++++++++++------- - 1 file changed, 10 insertions(+), 7 deletions(-) - -(limited to 'drivers/net/ethernet/marvell/mvneta.c') - ---- a/drivers/net/ethernet/marvell/mvneta.c -+++ b/drivers/net/ethernet/marvell/mvneta.c -@@ -38,6 +38,7 @@ - #include - #include - #include -+#include - #include - - /* Registers */ -@@ -4933,14 +4934,14 @@ static void mvneta_setup_rx_prio_map(str - } - - static int mvneta_setup_mqprio(struct net_device *dev, -- struct tc_mqprio_qopt *qopt) -+ struct tc_mqprio_qopt_offload *mqprio) - { - struct mvneta_port *pp = netdev_priv(dev); - u8 num_tc; - int i; - -- qopt->hw = TC_MQPRIO_HW_OFFLOAD_TCS; -- num_tc = qopt->num_tc; -+ mqprio->qopt.hw = TC_MQPRIO_HW_OFFLOAD_TCS; -+ num_tc = mqprio->qopt.num_tc; - - if (num_tc > rxq_number) - return -EINVAL; -@@ -4951,13 +4952,15 @@ static int mvneta_setup_mqprio(struct ne - return 0; - } - -- memcpy(pp->prio_tc_map, qopt->prio_tc_map, sizeof(pp->prio_tc_map)); -+ memcpy(pp->prio_tc_map, mqprio->qopt.prio_tc_map, -+ sizeof(pp->prio_tc_map)); - - mvneta_setup_rx_prio_map(pp); - -- netdev_set_num_tc(dev, qopt->num_tc); -- for (i = 0; i < qopt->num_tc; i++) -- netdev_set_tc_queue(dev, i, qopt->count[i], qopt->offset[i]); -+ netdev_set_num_tc(dev, mqprio->qopt.num_tc); -+ for (i = 0; i < mqprio->qopt.num_tc; i++) -+ netdev_set_tc_queue(dev, i, mqprio->qopt.count[i], -+ mqprio->qopt.offset[i]); - - return 0; - } diff --git a/target/linux/mvebu/patches-5.10/703-net-next-ethernet-marvell-mvnetaMQPrioFlag.patch b/target/linux/mvebu/patches-5.10/703-net-next-ethernet-marvell-mvnetaMQPrioFlag.patch deleted file mode 100644 index 8529b6ae5e..0000000000 --- a/target/linux/mvebu/patches-5.10/703-net-next-ethernet-marvell-mvnetaMQPrioFlag.patch +++ /dev/null @@ -1,30 +0,0 @@ -From e7ca75fe6662f78bfeb0112671c812e4c7b8e214 Mon Sep 17 00:00:00 2001 -From: Maxime Chevallier -Date: Fri, 26 Nov 2021 12:20:54 +0100 -Subject: net: mvneta: Don't force-set the offloading flag - -The qopt->hw flag is set by the TC code according to the offloading mode -asked by user. Don't force-set it in the driver, but instead read it to -make sure we do what's asked. - -Signed-off-by: Maxime Chevallier -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/marvell/mvneta.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -(limited to 'drivers/net/ethernet/marvell/mvneta.c') - ---- a/drivers/net/ethernet/marvell/mvneta.c -+++ b/drivers/net/ethernet/marvell/mvneta.c -@@ -4940,7 +4940,9 @@ static int mvneta_setup_mqprio(struct ne - u8 num_tc; - int i; - -- mqprio->qopt.hw = TC_MQPRIO_HW_OFFLOAD_TCS; -+ if (mqprio->qopt.hw != TC_MQPRIO_HW_OFFLOAD_TCS) -+ return 0; -+ - num_tc = mqprio->qopt.num_tc; - - if (num_tc > rxq_number) diff --git a/target/linux/mvebu/patches-5.10/704-net-next-ethernet-marvell-mvnetaMQPrioQueue.patch b/target/linux/mvebu/patches-5.10/704-net-next-ethernet-marvell-mvnetaMQPrioQueue.patch deleted file mode 100644 index ed4f0441dd..0000000000 --- a/target/linux/mvebu/patches-5.10/704-net-next-ethernet-marvell-mvnetaMQPrioQueue.patch +++ /dev/null @@ -1,97 +0,0 @@ -From e9f7099d0730341b24c057acbf545dd019581db6 Mon Sep 17 00:00:00 2001 -From: Maxime Chevallier -Date: Fri, 26 Nov 2021 12:20:55 +0100 -Subject: net: mvneta: Allow having more than one queue per TC - -The current mqprio implementation assumed that we are only using one -queue per TC. Use the offset and count parameters to allow using -multiple queues per TC. In that case, the controller will use a standard -round-robin algorithm to pick queues assigned to the same TC, with the -same priority. - -This only applies to VLAN priorities in ingress traffic, each TC -corresponding to a vlan priority. - -Signed-off-by: Maxime Chevallier -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/marvell/mvneta.c | 35 ++++++++++++++++++++--------------- - 1 file changed, 20 insertions(+), 15 deletions(-) - -(limited to 'drivers/net/ethernet/marvell/mvneta.c') - ---- a/drivers/net/ethernet/marvell/mvneta.c -+++ b/drivers/net/ethernet/marvell/mvneta.c -@@ -493,7 +493,6 @@ struct mvneta_port { - u8 mcast_count[256]; - u16 tx_ring_size; - u16 rx_ring_size; -- u8 prio_tc_map[8]; - - phy_interface_t phy_interface; - struct device_node *dn; -@@ -4922,13 +4921,12 @@ static void mvneta_clear_rx_prio_map(str - mvreg_write(pp, MVNETA_VLAN_PRIO_TO_RXQ, 0); - } - --static void mvneta_setup_rx_prio_map(struct mvneta_port *pp) -+static void mvneta_map_vlan_prio_to_rxq(struct mvneta_port *pp, u8 pri, u8 rxq) - { -- u32 val = 0; -- int i; -+ u32 val = mvreg_read(pp, MVNETA_VLAN_PRIO_TO_RXQ); - -- for (i = 0; i < rxq_number; i++) -- val |= MVNETA_VLAN_PRIO_RXQ_MAP(i, pp->prio_tc_map[i]); -+ val &= ~MVNETA_VLAN_PRIO_RXQ_MAP(pri, 0x7); -+ val |= MVNETA_VLAN_PRIO_RXQ_MAP(pri, rxq); - - mvreg_write(pp, MVNETA_VLAN_PRIO_TO_RXQ, val); - } -@@ -4937,8 +4935,8 @@ static int mvneta_setup_mqprio(struct ne - struct tc_mqprio_qopt_offload *mqprio) - { - struct mvneta_port *pp = netdev_priv(dev); -+ int rxq, tc; - u8 num_tc; -- int i; - - if (mqprio->qopt.hw != TC_MQPRIO_HW_OFFLOAD_TCS) - return 0; -@@ -4948,21 +4946,28 @@ static int mvneta_setup_mqprio(struct ne - if (num_tc > rxq_number) - return -EINVAL; - -+ mvneta_clear_rx_prio_map(pp); -+ - if (!num_tc) { -- mvneta_clear_rx_prio_map(pp); - netdev_reset_tc(dev); - return 0; - } - -- memcpy(pp->prio_tc_map, mqprio->qopt.prio_tc_map, -- sizeof(pp->prio_tc_map)); -+ netdev_set_num_tc(dev, mqprio->qopt.num_tc); - -- mvneta_setup_rx_prio_map(pp); -+ for (tc = 0; tc < mqprio->qopt.num_tc; tc++) { -+ netdev_set_tc_queue(dev, tc, mqprio->qopt.count[tc], -+ mqprio->qopt.offset[tc]); -+ -+ for (rxq = mqprio->qopt.offset[tc]; -+ rxq < mqprio->qopt.count[tc] + mqprio->qopt.offset[tc]; -+ rxq++) { -+ if (rxq >= rxq_number) -+ return -EINVAL; - -- netdev_set_num_tc(dev, mqprio->qopt.num_tc); -- for (i = 0; i < mqprio->qopt.num_tc; i++) -- netdev_set_tc_queue(dev, i, mqprio->qopt.count[i], -- mqprio->qopt.offset[i]); -+ mvneta_map_vlan_prio_to_rxq(pp, tc, rxq); -+ } -+ } - - return 0; - } diff --git a/target/linux/mvebu/patches-5.10/705-net-next-ethernet-marvell-mvnetaMQPrioTCOffload.patch b/target/linux/mvebu/patches-5.10/705-net-next-ethernet-marvell-mvnetaMQPrioTCOffload.patch deleted file mode 100644 index 15a0ce6b58..0000000000 --- a/target/linux/mvebu/patches-5.10/705-net-next-ethernet-marvell-mvnetaMQPrioTCOffload.patch +++ /dev/null @@ -1,182 +0,0 @@ -From 2551dc9e398c37a15e52122d385c29a8b06be45f Mon Sep 17 00:00:00 2001 -From: Maxime Chevallier -Date: Fri, 26 Nov 2021 12:20:56 +0100 -Subject: net: mvneta: Add TC traffic shaping offload - -The mvneta controller is able to do some tocken-bucket per-queue traffic -shaping. This commit adds support for setting these using the TC mqprio -interface. - -The token-bucket parameters are customisable, but the current -implementation configures them to have a 10kbps resolution for the -rate limitation, since it allows to cover the whole range of max_rate -values from 10kbps to 5Gbps with 10kbps increments. - -Signed-off-by: Maxime Chevallier -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/marvell/mvneta.c | 120 +++++++++++++++++++++++++++++++++- - 1 file changed, 119 insertions(+), 1 deletion(-) - -(limited to 'drivers/net/ethernet/marvell/mvneta.c') - ---- a/drivers/net/ethernet/marvell/mvneta.c -+++ b/drivers/net/ethernet/marvell/mvneta.c -@@ -248,12 +248,39 @@ - #define MVNETA_TXQ_SENT_DESC_MASK 0x3fff0000 - #define MVNETA_PORT_TX_RESET 0x3cf0 - #define MVNETA_PORT_TX_DMA_RESET BIT(0) -+#define MVNETA_TXQ_CMD1_REG 0x3e00 -+#define MVNETA_TXQ_CMD1_BW_LIM_SEL_V1 BIT(3) -+#define MVNETA_TXQ_CMD1_BW_LIM_EN BIT(0) -+#define MVNETA_REFILL_NUM_CLK_REG 0x3e08 -+#define MVNETA_REFILL_MAX_NUM_CLK 0x0000ffff - #define MVNETA_TX_MTU 0x3e0c - #define MVNETA_TX_TOKEN_SIZE 0x3e14 - #define MVNETA_TX_TOKEN_SIZE_MAX 0xffffffff -+#define MVNETA_TXQ_BUCKET_REFILL_REG(q) (0x3e20 + ((q) << 2)) -+#define MVNETA_TXQ_BUCKET_REFILL_PERIOD_MASK 0x3ff00000 -+#define MVNETA_TXQ_BUCKET_REFILL_PERIOD_SHIFT 20 -+#define MVNETA_TXQ_BUCKET_REFILL_VALUE_MAX 0x0007ffff - #define MVNETA_TXQ_TOKEN_SIZE_REG(q) (0x3e40 + ((q) << 2)) - #define MVNETA_TXQ_TOKEN_SIZE_MAX 0x7fffffff - -+/* The values of the bucket refill base period and refill period are taken from -+ * the reference manual, and adds up to a base resolution of 10Kbps. This allows -+ * to cover all rate-limit values from 10Kbps up to 5Gbps -+ */ -+ -+/* Base period for the rate limit algorithm */ -+#define MVNETA_TXQ_BUCKET_REFILL_BASE_PERIOD_NS 100 -+ -+/* Number of Base Period to wait between each bucket refill */ -+#define MVNETA_TXQ_BUCKET_REFILL_PERIOD 1000 -+ -+/* The base resolution for rate limiting, in bps. Any max_rate value should be -+ * a multiple of that value. -+ */ -+#define MVNETA_TXQ_RATE_LIMIT_RESOLUTION (NSEC_PER_SEC / \ -+ (MVNETA_TXQ_BUCKET_REFILL_BASE_PERIOD_NS * \ -+ MVNETA_TXQ_BUCKET_REFILL_PERIOD)) -+ - #define MVNETA_LPI_CTRL_0 0x2cc0 - #define MVNETA_LPI_CTRL_1 0x2cc4 - #define MVNETA_LPI_REQUEST_ENABLE BIT(0) -@@ -4931,11 +4958,74 @@ static void mvneta_map_vlan_prio_to_rxq( - mvreg_write(pp, MVNETA_VLAN_PRIO_TO_RXQ, val); - } - -+static int mvneta_enable_per_queue_rate_limit(struct mvneta_port *pp) -+{ -+ unsigned long core_clk_rate; -+ u32 refill_cycles; -+ u32 val; -+ -+ core_clk_rate = clk_get_rate(pp->clk); -+ if (!core_clk_rate) -+ return -EINVAL; -+ -+ refill_cycles = MVNETA_TXQ_BUCKET_REFILL_BASE_PERIOD_NS / -+ (NSEC_PER_SEC / core_clk_rate); -+ -+ if (refill_cycles > MVNETA_REFILL_MAX_NUM_CLK) -+ return -EINVAL; -+ -+ /* Enable bw limit algorithm version 3 */ -+ val = mvreg_read(pp, MVNETA_TXQ_CMD1_REG); -+ val &= ~(MVNETA_TXQ_CMD1_BW_LIM_SEL_V1 | MVNETA_TXQ_CMD1_BW_LIM_EN); -+ mvreg_write(pp, MVNETA_TXQ_CMD1_REG, val); -+ -+ /* Set the base refill rate */ -+ mvreg_write(pp, MVNETA_REFILL_NUM_CLK_REG, refill_cycles); -+ -+ return 0; -+} -+ -+static void mvneta_disable_per_queue_rate_limit(struct mvneta_port *pp) -+{ -+ u32 val = mvreg_read(pp, MVNETA_TXQ_CMD1_REG); -+ -+ val |= (MVNETA_TXQ_CMD1_BW_LIM_SEL_V1 | MVNETA_TXQ_CMD1_BW_LIM_EN); -+ mvreg_write(pp, MVNETA_TXQ_CMD1_REG, val); -+} -+ -+static int mvneta_setup_queue_rates(struct mvneta_port *pp, int queue, -+ u64 min_rate, u64 max_rate) -+{ -+ u32 refill_val, rem; -+ u32 val = 0; -+ -+ /* Convert to from Bps to bps */ -+ max_rate *= 8; -+ -+ if (min_rate) -+ return -EINVAL; -+ -+ refill_val = div_u64_rem(max_rate, MVNETA_TXQ_RATE_LIMIT_RESOLUTION, -+ &rem); -+ -+ if (rem || !refill_val || -+ refill_val > MVNETA_TXQ_BUCKET_REFILL_VALUE_MAX) -+ return -EINVAL; -+ -+ val = refill_val; -+ val |= (MVNETA_TXQ_BUCKET_REFILL_PERIOD << -+ MVNETA_TXQ_BUCKET_REFILL_PERIOD_SHIFT); -+ -+ mvreg_write(pp, MVNETA_TXQ_BUCKET_REFILL_REG(queue), val); -+ -+ return 0; -+} -+ - static int mvneta_setup_mqprio(struct net_device *dev, - struct tc_mqprio_qopt_offload *mqprio) - { - struct mvneta_port *pp = netdev_priv(dev); -- int rxq, tc; -+ int rxq, txq, tc, ret; - u8 num_tc; - - if (mqprio->qopt.hw != TC_MQPRIO_HW_OFFLOAD_TCS) -@@ -4949,6 +5039,7 @@ static int mvneta_setup_mqprio(struct ne - mvneta_clear_rx_prio_map(pp); - - if (!num_tc) { -+ mvneta_disable_per_queue_rate_limit(pp); - netdev_reset_tc(dev); - return 0; - } -@@ -4969,6 +5060,33 @@ static int mvneta_setup_mqprio(struct ne - } - } - -+ if (mqprio->shaper != TC_MQPRIO_SHAPER_BW_RATE) { -+ mvneta_disable_per_queue_rate_limit(pp); -+ return 0; -+ } -+ -+ if (mqprio->qopt.num_tc > txq_number) -+ return -EINVAL; -+ -+ ret = mvneta_enable_per_queue_rate_limit(pp); -+ if (ret) -+ return ret; -+ -+ for (tc = 0; tc < mqprio->qopt.num_tc; tc++) { -+ for (txq = mqprio->qopt.offset[tc]; -+ txq < mqprio->qopt.count[tc] + mqprio->qopt.offset[tc]; -+ txq++) { -+ if (txq >= txq_number) -+ return -EINVAL; -+ -+ ret = mvneta_setup_queue_rates(pp, txq, -+ mqprio->min_rate[tc], -+ mqprio->max_rate[tc]); -+ if (ret) -+ return ret; -+ } -+ } -+ - return 0; - } - diff --git a/target/linux/mvebu/patches-5.10/801-pci-mvebu-time-out-reset-on-link-up.patch b/target/linux/mvebu/patches-5.10/801-pci-mvebu-time-out-reset-on-link-up.patch deleted file mode 100644 index a5e49552e9..0000000000 --- a/target/linux/mvebu/patches-5.10/801-pci-mvebu-time-out-reset-on-link-up.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 287b9df160b6159f8d385424904f8bac501280c1 Mon Sep 17 00:00:00 2001 -From: Russell King -Date: Sat, 9 Jul 2016 10:58:16 +0100 -Subject: pci: mvebu: time out reset on link up - -If the port reports that the link is up while we are resetting, there's -little point in waiting for the full duration. - -Signed-off-by: Russell King ---- - drivers/pci/controller/pci-mvebu.c | 20 ++++++++++++++------ - 1 file changed, 14 insertions(+), 6 deletions(-) - ---- a/drivers/pci/controller/pci-mvebu.c -+++ b/drivers/pci/controller/pci-mvebu.c -@@ -941,6 +941,7 @@ static int mvebu_pcie_powerup(struct mve - - if (port->reset_gpio) { - u32 reset_udelay = PCI_PM_D3COLD_WAIT * 1000; -+ unsigned int i; - - of_property_read_u32(port->dn, "reset-delay-us", - &reset_udelay); -@@ -948,7 +949,13 @@ static int mvebu_pcie_powerup(struct mve - udelay(100); - - gpiod_set_value_cansleep(port->reset_gpio, 0); -- msleep(reset_udelay / 1000); -+ for (i = 0; i < reset_udelay; i += 1000) { -+ if (mvebu_pcie_link_up(port)) -+ break; -+ msleep(1); -+ } -+ -+ printk("%s: reset completed in %dus\n", port->name, i); - } - - return 0; -@@ -1108,15 +1115,16 @@ static int mvebu_pcie_probe(struct platf - if (!child) - continue; - -- ret = mvebu_pcie_powerup(port); -- if (ret < 0) -- continue; -- - port->base = mvebu_pcie_map_registers(pdev, child, port); - if (IS_ERR(port->base)) { - dev_err(dev, "%s: cannot map registers\n", port->name); - port->base = NULL; -- mvebu_pcie_powerdown(port); -+ continue; -+ } -+ -+ ret = mvebu_pcie_powerup(port); -+ if (ret < 0) { -+ port->base = NULL; - continue; - } - diff --git a/target/linux/mvebu/patches-5.10/901-dt-bindings-Add-IEI-vendor-prefix-and-IEI-WT61P803-P.patch b/target/linux/mvebu/patches-5.10/901-dt-bindings-Add-IEI-vendor-prefix-and-IEI-WT61P803-P.patch deleted file mode 100644 index 28b2b19499..0000000000 --- a/target/linux/mvebu/patches-5.10/901-dt-bindings-Add-IEI-vendor-prefix-and-IEI-WT61P803-P.patch +++ /dev/null @@ -1,218 +0,0 @@ -From aa4a0ccc41997f2da172165c92803abace43bd1c Mon Sep 17 00:00:00 2001 -From: Luka Kovacic -Date: Tue, 24 Aug 2021 12:44:32 +0000 -Subject: [PATCH 1/7] dt-bindings: Add IEI vendor prefix and IEI WT61P803 - PUZZLE driver bindings - -Add the IEI WT61P803 PUZZLE Device Tree bindings for MFD, HWMON and LED -drivers. A new vendor prefix is also added accordingly for -IEI Integration Corp. - -Signed-off-by: Luka Kovacic -Signed-off-by: Pavo Banicevic -Cc: Luka Perkov -Cc: Robert Marko ---- - .../hwmon/iei,wt61p803-puzzle-hwmon.yaml | 53 ++++++++++++ - .../leds/iei,wt61p803-puzzle-leds.yaml | 39 +++++++++ - .../bindings/mfd/iei,wt61p803-puzzle.yaml | 82 +++++++++++++++++++ - .../devicetree/bindings/vendor-prefixes.yaml | 2 + - 4 files changed, 176 insertions(+) - create mode 100644 Documentation/devicetree/bindings/hwmon/iei,wt61p803-puzzle-hwmon.yaml - create mode 100644 Documentation/devicetree/bindings/leds/iei,wt61p803-puzzle-leds.yaml - create mode 100644 Documentation/devicetree/bindings/mfd/iei,wt61p803-puzzle.yaml - ---- /dev/null -+++ b/Documentation/devicetree/bindings/hwmon/iei,wt61p803-puzzle-hwmon.yaml -@@ -0,0 +1,53 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/hwmon/iei,wt61p803-puzzle-hwmon.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: IEI WT61P803 PUZZLE MCU HWMON module from IEI Integration Corp. -+ -+maintainers: -+ - Luka Kovacic -+ -+description: | -+ This module is a part of the IEI WT61P803 PUZZLE MFD device. For more details -+ see Documentation/devicetree/bindings/mfd/iei,wt61p803-puzzle.yaml. -+ -+ The HWMON module is a sub-node of the MCU node in the Device Tree. -+ -+properties: -+ compatible: -+ const: iei,wt61p803-puzzle-hwmon -+ -+ "#address-cells": -+ const: 1 -+ -+ "#size-cells": -+ const: 0 -+ -+patternProperties: -+ "^fan-group@[0-1]$": -+ type: object -+ properties: -+ reg: -+ minimum: 0 -+ maximum: 1 -+ description: -+ Fan group ID -+ -+ cooling-levels: -+ minItems: 1 -+ maxItems: 255 -+ description: -+ Cooling levels for the fans (PWM value mapping) -+ description: | -+ Properties for each fan group. -+ required: -+ - reg -+ -+required: -+ - compatible -+ - "#address-cells" -+ - "#size-cells" -+ -+additionalProperties: false ---- /dev/null -+++ b/Documentation/devicetree/bindings/leds/iei,wt61p803-puzzle-leds.yaml -@@ -0,0 +1,39 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/leds/iei,wt61p803-puzzle-leds.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: IEI WT61P803 PUZZLE MCU LED module from IEI Integration Corp. -+ -+maintainers: -+ - Luka Kovacic -+ -+description: | -+ This module is a part of the IEI WT61P803 PUZZLE MFD device. For more details -+ see Documentation/devicetree/bindings/mfd/iei,wt61p803-puzzle.yaml. -+ -+ The LED module is a sub-node of the MCU node in the Device Tree. -+ -+properties: -+ compatible: -+ const: iei,wt61p803-puzzle-leds -+ -+ "#address-cells": -+ const: 1 -+ -+ "#size-cells": -+ const: 0 -+ -+ led@0: -+ type: object -+ $ref: common.yaml -+ description: | -+ Properties for a single LED. -+ -+required: -+ - compatible -+ - "#address-cells" -+ - "#size-cells" -+ -+additionalProperties: false ---- /dev/null -+++ b/Documentation/devicetree/bindings/mfd/iei,wt61p803-puzzle.yaml -@@ -0,0 +1,82 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/mfd/iei,wt61p803-puzzle.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: IEI WT61P803 PUZZLE MCU from IEI Integration Corp. -+ -+maintainers: -+ - Luka Kovacic -+ -+description: | -+ IEI WT61P803 PUZZLE MCU is embedded in some IEI Puzzle series boards. -+ It's used for controlling system power states, fans, LEDs and temperature -+ sensors. -+ -+ For Device Tree bindings of other sub-modules (HWMON, LEDs) refer to the -+ binding documents under the respective subsystem directories. -+ -+properties: -+ compatible: -+ const: iei,wt61p803-puzzle -+ -+ current-speed: -+ description: -+ Serial bus speed in bps -+ maxItems: 1 -+ -+ enable-beep: true -+ -+ hwmon: -+ $ref: /schemas/hwmon/iei,wt61p803-puzzle-hwmon.yaml -+ -+ leds: -+ $ref: /schemas/leds/iei,wt61p803-puzzle-leds.yaml -+ -+required: -+ - compatible -+ - current-speed -+ -+additionalProperties: false -+ -+examples: -+ - | -+ #include -+ serial { -+ mcu { -+ compatible = "iei,wt61p803-puzzle"; -+ current-speed = <115200>; -+ enable-beep; -+ -+ leds { -+ compatible = "iei,wt61p803-puzzle-leds"; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ led@0 { -+ reg = <0>; -+ function = LED_FUNCTION_POWER; -+ color = ; -+ }; -+ }; -+ -+ hwmon { -+ compatible = "iei,wt61p803-puzzle-hwmon"; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ fan-group@0 { -+ #cooling-cells = <2>; -+ reg = <0x00>; -+ cooling-levels = <64 102 170 230 250>; -+ }; -+ -+ fan-group@1 { -+ #cooling-cells = <2>; -+ reg = <0x01>; -+ cooling-levels = <64 102 170 230 250>; -+ }; -+ }; -+ }; -+ }; ---- a/Documentation/devicetree/bindings/vendor-prefixes.yaml -+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml -@@ -475,6 +475,8 @@ patternProperties: - description: IC Plus Corp. - "^idt,.*": - description: Integrated Device Technologies, Inc. -+ "^iei,.*": -+ description: IEI Integration Corp. - "^ifi,.*": - description: Ingenieurburo Fur Ic-Technologie (I/F/I) - "^ilitek,.*": diff --git a/target/linux/mvebu/patches-5.10/902-drivers-mfd-Add-a-driver-for-IEI-WT61P803-PUZZLE-MCU.patch b/target/linux/mvebu/patches-5.10/902-drivers-mfd-Add-a-driver-for-IEI-WT61P803-PUZZLE-MCU.patch deleted file mode 100644 index 01c2ecce0d..0000000000 --- a/target/linux/mvebu/patches-5.10/902-drivers-mfd-Add-a-driver-for-IEI-WT61P803-PUZZLE-MCU.patch +++ /dev/null @@ -1,1034 +0,0 @@ -From 692cfa85272dd12995b427c0a7a585ced5d54f32 Mon Sep 17 00:00:00 2001 -From: Luka Kovacic -Date: Tue, 24 Aug 2021 12:44:33 +0000 -Subject: [PATCH 2/7] drivers: mfd: Add a driver for IEI WT61P803 PUZZLE MCU - -Add a driver for the IEI WT61P803 PUZZLE microcontroller, used in some -IEI Puzzle series devices. The microcontroller controls system power, -temperature sensors, fans and LEDs. - -This driver implements the core functionality for device communication -over the system serial (serdev bus). It handles MCU messages and the -internal MCU properties. Some properties can be managed over sysfs. - -Signed-off-by: Luka Kovacic -Signed-off-by: Pavo Banicevic -Cc: Luka Perkov -Cc: Robert Marko ---- - drivers/mfd/Kconfig | 8 + - drivers/mfd/Makefile | 1 + - drivers/mfd/iei-wt61p803-puzzle.c | 908 ++++++++++++++++++++++++ - include/linux/mfd/iei-wt61p803-puzzle.h | 66 ++ - 4 files changed, 983 insertions(+) - create mode 100644 drivers/mfd/iei-wt61p803-puzzle.c - create mode 100644 include/linux/mfd/iei-wt61p803-puzzle.h - ---- a/drivers/mfd/Kconfig -+++ b/drivers/mfd/Kconfig -@@ -2155,6 +2155,15 @@ config SGI_MFD_IOC3 - If you have an SGI Origin, Octane, or a PCI IOC3 card, - then say Y. Otherwise say N. - -+config MFD_IEI_WT61P803_PUZZLE -+ tristate "IEI WT61P803 PUZZLE MCU driver" -+ depends on SERIAL_DEV_BUS -+ select MFD_CORE -+ help -+ IEI WT61P803 PUZZLE is a system power management microcontroller -+ used for fan control, temperature sensor reading, LED control -+ and system identification. -+ - config MFD_INTEL_M10_BMC - tristate "Intel MAX 10 Board Management Controller" - depends on SPI_MASTER ---- a/drivers/mfd/Makefile -+++ b/drivers/mfd/Makefile -@@ -237,6 +237,7 @@ obj-$(CONFIG_MFD_HI655X_PMIC) += hi655 - obj-$(CONFIG_MFD_DLN2) += dln2.o - obj-$(CONFIG_MFD_RT5033) += rt5033.o - obj-$(CONFIG_MFD_SKY81452) += sky81452.o -+obj-$(CONFIG_MFD_IEI_WT61P803_PUZZLE) += iei-wt61p803-puzzle.o - - intel-soc-pmic-objs := intel_soc_pmic_core.o intel_soc_pmic_crc.o - obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o ---- /dev/null -+++ b/drivers/mfd/iei-wt61p803-puzzle.c -@@ -0,0 +1,908 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* IEI WT61P803 PUZZLE MCU Driver -+ * System management microcontroller for fan control, temperature sensor reading, -+ * LED control and system identification on IEI Puzzle series ARM-based appliances. -+ * -+ * Copyright (C) 2020 Sartura Ltd. -+ * Author: Luka Kovacic -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* start, payload and XOR checksum at end */ -+#define IEI_WT61P803_PUZZLE_MAX_COMMAND_LENGTH (1 + 20 + 1) -+#define IEI_WT61P803_PUZZLE_RESP_BUF_SIZE 512 -+ -+#define IEI_WT61P803_PUZZLE_MAC_LENGTH 17 -+#define IEI_WT61P803_PUZZLE_SN_LENGTH 36 -+#define IEI_WT61P803_PUZZLE_VERSION_LENGTH 6 -+#define IEI_WT61P803_PUZZLE_BUILD_INFO_LENGTH 16 -+#define IEI_WT61P803_PUZZLE_PROTOCOL_VERSION_LENGTH 8 -+#define IEI_WT61P803_PUZZLE_NB_MAC 8 -+ -+/* Use HZ as a timeout value throughout the driver */ -+#define IEI_WT61P803_PUZZLE_GENERAL_TIMEOUT HZ -+ -+enum iei_wt61p803_puzzle_attribute_type { -+ IEI_WT61P803_PUZZLE_VERSION, -+ IEI_WT61P803_PUZZLE_BUILD_INFO, -+ IEI_WT61P803_PUZZLE_BOOTLOADER_MODE, -+ IEI_WT61P803_PUZZLE_PROTOCOL_VERSION, -+ IEI_WT61P803_PUZZLE_SERIAL_NUMBER, -+ IEI_WT61P803_PUZZLE_MAC_ADDRESS, -+ IEI_WT61P803_PUZZLE_AC_RECOVERY_STATUS, -+ IEI_WT61P803_PUZZLE_POWER_LOSS_RECOVERY, -+ IEI_WT61P803_PUZZLE_POWER_STATUS, -+}; -+ -+struct iei_wt61p803_puzzle_device_attribute { -+ struct device_attribute dev_attr; -+ enum iei_wt61p803_puzzle_attribute_type type; -+ u8 index; -+}; -+ -+/** -+ * struct iei_wt61p803_puzzle_mcu_status - MCU flags state -+ * @ac_recovery_status_flag: AC Recovery Status Flag -+ * @power_loss_recovery: System recovery after power loss -+ * @power_status: System Power-on Method -+ */ -+struct iei_wt61p803_puzzle_mcu_status { -+ u8 ac_recovery_status_flag; -+ u8 power_loss_recovery; -+ u8 power_status; -+}; -+ -+/** -+ * struct iei_wt61p803_puzzle_reply - MCU reply -+ * @size: Size of the MCU reply -+ * @data: Full MCU reply buffer -+ * @state: Current state of the packet -+ * @received: Was the response fullfilled -+ */ -+struct iei_wt61p803_puzzle_reply { -+ size_t size; -+ unsigned char data[IEI_WT61P803_PUZZLE_RESP_BUF_SIZE]; -+ struct completion received; -+}; -+ -+/** -+ * struct iei_wt61p803_puzzle_mcu_version - MCU version status -+ * @version: Primary firmware version -+ * @build_info: Build date and time -+ * @bootloader_mode: Status of the MCU operation -+ * @protocol_version: MCU communication protocol version -+ * @serial_number: Device factory serial number -+ * @mac_address: Device factory MAC addresses -+ * -+ * Last element of arrays is reserved for '\0'. -+ */ -+struct iei_wt61p803_puzzle_mcu_version { -+ char version[IEI_WT61P803_PUZZLE_VERSION_LENGTH + 1]; -+ char build_info[IEI_WT61P803_PUZZLE_BUILD_INFO_LENGTH + 1]; -+ bool bootloader_mode; -+ char protocol_version[IEI_WT61P803_PUZZLE_PROTOCOL_VERSION_LENGTH + 1]; -+ char serial_number[IEI_WT61P803_PUZZLE_SN_LENGTH + 1]; -+ char mac_address[IEI_WT61P803_PUZZLE_NB_MAC][IEI_WT61P803_PUZZLE_MAC_LENGTH + 1]; -+}; -+ -+/** -+ * struct iei_wt61p803_puzzle - IEI WT61P803 PUZZLE MCU Driver -+ * @serdev: Pointer to underlying serdev device -+ * @dev: Pointer to underlying dev device -+ * @reply_lock: Reply mutex lock -+ * @reply: Pointer to the iei_wt61p803_puzzle_reply struct -+ * @version: MCU version related data -+ * @status: MCU status related data -+ * @response_buffer Command response buffer allocation -+ * @lock General member mutex lock -+ */ -+struct iei_wt61p803_puzzle { -+ struct serdev_device *serdev; -+ struct device *dev; -+ struct mutex reply_lock; /* lock to prevent multiple firmware calls */ -+ struct iei_wt61p803_puzzle_reply *reply; -+ struct iei_wt61p803_puzzle_mcu_version version; -+ struct iei_wt61p803_puzzle_mcu_status status; -+ unsigned char response_buffer[IEI_WT61P803_PUZZLE_BUF_SIZE]; -+ struct mutex lock; /* lock to protect response buffer */ -+}; -+ -+static unsigned char iei_wt61p803_puzzle_checksum(unsigned char *buf, size_t len) -+{ -+ unsigned char checksum = 0; -+ size_t i; -+ -+ for (i = 0; i < len; i++) -+ checksum ^= buf[i]; -+ return checksum; -+} -+ -+static int iei_wt61p803_puzzle_process_resp(struct iei_wt61p803_puzzle *mcu, -+ const unsigned char *raw_resp_data, size_t size) -+{ -+ unsigned char checksum; -+ -+ /* Check the incoming frame header */ -+ if (!(raw_resp_data[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START || -+ raw_resp_data[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER || -+ (raw_resp_data[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM && -+ raw_resp_data[1] == IEI_WT61P803_PUZZLE_CMD_EEPROM_READ))) { -+ if (mcu->reply->size + size >= sizeof(mcu->reply->data)) -+ return -EIO; -+ -+ /* Append the frame to existing data */ -+ memcpy(mcu->reply->data + mcu->reply->size, raw_resp_data, size); -+ mcu->reply->size += size; -+ } else { -+ if (size >= sizeof(mcu->reply->data)) -+ return -EIO; -+ -+ /* Start processing a new frame */ -+ memcpy(mcu->reply->data, raw_resp_data, size); -+ mcu->reply->size = size; -+ } -+ -+ checksum = iei_wt61p803_puzzle_checksum(mcu->reply->data, mcu->reply->size - 1); -+ if (checksum != mcu->reply->data[mcu->reply->size - 1]) { -+ /* The checksum isn't matched yet, wait for new frames */ -+ return size; -+ } -+ -+ /* Received all the data */ -+ complete(&mcu->reply->received); -+ -+ return size; -+} -+ -+static int iei_wt61p803_puzzle_recv_buf(struct serdev_device *serdev, -+ const unsigned char *data, size_t size) -+{ -+ struct iei_wt61p803_puzzle *mcu = serdev_device_get_drvdata(serdev); -+ int ret; -+ -+ ret = iei_wt61p803_puzzle_process_resp(mcu, data, size); -+ /* Return the number of processed bytes if function returns error, -+ * discard the remaining incoming data, since the frame this data -+ * belongs to is broken anyway -+ */ -+ if (ret < 0) -+ return size; -+ -+ return ret; -+} -+ -+static const struct serdev_device_ops iei_wt61p803_puzzle_serdev_device_ops = { -+ .receive_buf = iei_wt61p803_puzzle_recv_buf, -+ .write_wakeup = serdev_device_write_wakeup, -+}; -+ -+/** -+ * iei_wt61p803_puzzle_write_command_watchdog() - Watchdog of the normal cmd -+ * @mcu: Pointer to the iei_wt61p803_puzzle core MFD struct -+ * @cmd: Pointer to the char array to send (size should be content + 1 (xor)) -+ * @size: Size of the cmd char array -+ * @reply_data: Pointer to the reply/response data array (should be allocated) -+ * @reply_size: Pointer to size_t (size of reply_data) -+ * @retry_count: Number of times to retry sending the command to the MCU -+ */ -+int iei_wt61p803_puzzle_write_command_watchdog(struct iei_wt61p803_puzzle *mcu, -+ unsigned char *cmd, size_t size, -+ unsigned char *reply_data, -+ size_t *reply_size, int retry_count) -+{ -+ struct device *dev = &mcu->serdev->dev; -+ int ret, i; -+ -+ for (i = 0; i < retry_count; i++) { -+ ret = iei_wt61p803_puzzle_write_command(mcu, cmd, size, -+ reply_data, reply_size); -+ if (ret != -ETIMEDOUT) -+ return ret; -+ } -+ -+ dev_err(dev, "Command response timed out. Retries: %d\n", retry_count); -+ -+ return -ETIMEDOUT; -+} -+EXPORT_SYMBOL_GPL(iei_wt61p803_puzzle_write_command_watchdog); -+ -+/** -+ * iei_wt61p803_puzzle_write_command() - Send a structured command to the MCU -+ * @mcu: Pointer to the iei_wt61p803_puzzle core MFD struct -+ * @cmd: Pointer to the char array to send (size should be content + 1 (xor)) -+ * @size: Size of the cmd char array -+ * @reply_data: Pointer to the reply/response data array (should be allocated) -+ * -+ * Sends a structured command to the MCU. -+ */ -+int iei_wt61p803_puzzle_write_command(struct iei_wt61p803_puzzle *mcu, -+ unsigned char *cmd, size_t size, -+ unsigned char *reply_data, -+ size_t *reply_size) -+{ -+ struct device *dev = &mcu->serdev->dev; -+ int ret; -+ -+ if (size <= 1 || size > IEI_WT61P803_PUZZLE_MAX_COMMAND_LENGTH) -+ return -EINVAL; -+ -+ mutex_lock(&mcu->reply_lock); -+ -+ cmd[size - 1] = iei_wt61p803_puzzle_checksum(cmd, size - 1); -+ -+ /* Initialize reply struct */ -+ reinit_completion(&mcu->reply->received); -+ mcu->reply->size = 0; -+ usleep_range(2000, 10000); -+ serdev_device_write_flush(mcu->serdev); -+ ret = serdev_device_write_buf(mcu->serdev, cmd, size); -+ if (ret < 0) -+ goto exit; -+ -+ serdev_device_wait_until_sent(mcu->serdev, IEI_WT61P803_PUZZLE_GENERAL_TIMEOUT); -+ ret = wait_for_completion_timeout(&mcu->reply->received, -+ IEI_WT61P803_PUZZLE_GENERAL_TIMEOUT); -+ if (ret == 0) { -+ dev_err(dev, "Command reply receive timeout\n"); -+ ret = -ETIMEDOUT; -+ goto exit; -+ } -+ -+ *reply_size = mcu->reply->size; -+ /* Copy the received data, as it will not be available after a new frame is received */ -+ memcpy(reply_data, mcu->reply->data, mcu->reply->size); -+ ret = 0; -+exit: -+ mutex_unlock(&mcu->reply_lock); -+ return ret; -+} -+EXPORT_SYMBOL_GPL(iei_wt61p803_puzzle_write_command); -+ -+static int iei_wt61p803_puzzle_buzzer(struct iei_wt61p803_puzzle *mcu, bool long_beep) -+{ -+ unsigned char *resp_buf = mcu->response_buffer; -+ unsigned char buzzer_cmd[4] = {}; -+ size_t reply_size; -+ int ret; -+ -+ buzzer_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; -+ buzzer_cmd[1] = IEI_WT61P803_PUZZLE_CMD_FUNCTION_SINGLE; -+ buzzer_cmd[2] = long_beep ? '3' : '2'; /* Buzzer 1.5 / 0.5 second beep */ -+ -+ mutex_lock(&mcu->lock); -+ ret = iei_wt61p803_puzzle_write_command(mcu, buzzer_cmd, sizeof(buzzer_cmd), -+ resp_buf, &reply_size); -+ if (ret) -+ goto exit; -+ -+ if (reply_size != 3) { -+ ret = -EIO; -+ goto exit; -+ } -+ -+ if (!(resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && -+ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK && -+ resp_buf[2] == IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK)) { -+ ret = -EPROTO; -+ goto exit; -+ } -+exit: -+ mutex_unlock(&mcu->lock); -+ return ret; -+} -+ -+static int iei_wt61p803_puzzle_get_version(struct iei_wt61p803_puzzle *mcu) -+{ -+ unsigned char version_cmd[3] = { -+ IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER, -+ IEI_WT61P803_PUZZLE_CMD_OTHER_VERSION, -+ }; -+ unsigned char build_info_cmd[3] = { -+ IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER, -+ IEI_WT61P803_PUZZLE_CMD_OTHER_BUILD, -+ }; -+ unsigned char bootloader_mode_cmd[3] = { -+ IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER, -+ IEI_WT61P803_PUZZLE_CMD_OTHER_BOOTLOADER_MODE, -+ }; -+ unsigned char protocol_version_cmd[3] = { -+ IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER, -+ IEI_WT61P803_PUZZLE_CMD_OTHER_PROTOCOL_VERSION, -+ }; -+ unsigned char *rb = mcu->response_buffer; -+ size_t reply_size; -+ int ret; -+ -+ mutex_lock(&mcu->lock); -+ -+ ret = iei_wt61p803_puzzle_write_command(mcu, version_cmd, sizeof(version_cmd), -+ rb, &reply_size); -+ if (ret) -+ goto err; -+ if (reply_size < 7) { -+ ret = -EIO; -+ goto err; -+ } -+ sprintf(mcu->version.version, "v%c.%.3s", rb[2], &rb[3]); -+ -+ ret = iei_wt61p803_puzzle_write_command(mcu, build_info_cmd, -+ sizeof(build_info_cmd), rb, -+ &reply_size); -+ if (ret) -+ goto err; -+ if (reply_size < 15) { -+ ret = -EIO; -+ goto err; -+ } -+ sprintf(mcu->version.build_info, "%c%c/%c%c/%.4s %c%c:%c%c", -+ rb[8], rb[9], rb[6], rb[7], &rb[2], rb[10], rb[11], -+ rb[12], rb[13]); -+ -+ ret = iei_wt61p803_puzzle_write_command(mcu, bootloader_mode_cmd, -+ sizeof(bootloader_mode_cmd), rb, -+ &reply_size); -+ if (ret) -+ goto err; -+ if (reply_size < 4) { -+ ret = -EIO; -+ goto err; -+ } -+ if (rb[2] == IEI_WT61P803_PUZZLE_CMD_OTHER_MODE_APPS) -+ mcu->version.bootloader_mode = false; -+ else if (rb[2] == IEI_WT61P803_PUZZLE_CMD_OTHER_MODE_BOOTLOADER) -+ mcu->version.bootloader_mode = true; -+ -+ ret = iei_wt61p803_puzzle_write_command(mcu, protocol_version_cmd, -+ sizeof(protocol_version_cmd), rb, -+ &reply_size); -+ if (ret) -+ goto err; -+ if (reply_size < 9) { -+ ret = -EIO; -+ goto err; -+ } -+ sprintf(mcu->version.protocol_version, "v%c.%c%c%c%c%c", -+ rb[7], rb[6], rb[5], rb[4], rb[3], rb[2]); -+err: -+ mutex_unlock(&mcu->lock); -+ return ret; -+} -+ -+static int iei_wt61p803_puzzle_get_mcu_status(struct iei_wt61p803_puzzle *mcu) -+{ -+ unsigned char mcu_status_cmd[5] = { -+ IEI_WT61P803_PUZZLE_CMD_HEADER_START, -+ IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER, -+ IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_STATUS, -+ IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_STATUS, -+ }; -+ unsigned char *resp_buf = mcu->response_buffer; -+ size_t reply_size; -+ int ret; -+ -+ mutex_lock(&mcu->lock); -+ ret = iei_wt61p803_puzzle_write_command(mcu, mcu_status_cmd, sizeof(mcu_status_cmd), -+ resp_buf, &reply_size); -+ if (ret) -+ goto exit; -+ if (reply_size < 20) { -+ ret = -EIO; -+ goto exit; -+ } -+ -+ /* Response format: -+ * (IDX RESPONSE) -+ * 0 @ -+ * 1 O -+ * 2 S -+ * 3 S -+ * ... -+ * 5 AC Recovery Status Flag -+ * ... -+ * 10 Power Loss Recovery -+ * ... -+ * 19 Power Status (system power on method) -+ * 20 XOR checksum -+ */ -+ if (resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && -+ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER && -+ resp_buf[2] == IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_STATUS && -+ resp_buf[3] == IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_STATUS) { -+ mcu->status.ac_recovery_status_flag = resp_buf[5]; -+ mcu->status.power_loss_recovery = resp_buf[10]; -+ mcu->status.power_status = resp_buf[19]; -+ } -+exit: -+ mutex_unlock(&mcu->lock); -+ return ret; -+} -+ -+static int iei_wt61p803_puzzle_get_serial_number(struct iei_wt61p803_puzzle *mcu) -+{ -+ unsigned char *resp_buf = mcu->response_buffer; -+ unsigned char serial_number_cmd[5] = { -+ IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM, -+ IEI_WT61P803_PUZZLE_CMD_EEPROM_READ, -+ 0x00, /* EEPROM read address */ -+ 0x24, /* Data length */ -+ }; -+ size_t reply_size; -+ int ret; -+ -+ mutex_lock(&mcu->lock); -+ ret = iei_wt61p803_puzzle_write_command(mcu, serial_number_cmd, -+ sizeof(serial_number_cmd), -+ resp_buf, &reply_size); -+ if (ret) -+ goto err; -+ -+ if (reply_size < IEI_WT61P803_PUZZLE_SN_LENGTH + 4) { -+ ret = -EIO; -+ goto err; -+ } -+ -+ sprintf(mcu->version.serial_number, "%.*s", -+ IEI_WT61P803_PUZZLE_SN_LENGTH, resp_buf + 4); -+err: -+ mutex_unlock(&mcu->lock); -+ return ret; -+} -+ -+static int iei_wt61p803_puzzle_write_serial_number(struct iei_wt61p803_puzzle *mcu, -+ unsigned char serial_number[36]) -+{ -+ unsigned char *resp_buf = mcu->response_buffer; -+ unsigned char serial_number_header[4] = { -+ IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM, -+ IEI_WT61P803_PUZZLE_CMD_EEPROM_WRITE, -+ 0x00, /* EEPROM write address */ -+ 0xC, /* Data length */ -+ }; -+ unsigned char serial_number_cmd[4 + 12 + 1]; /* header, serial number, XOR checksum */ -+ int ret, sn_counter; -+ size_t reply_size; -+ -+ /* The MCU can only handle 22 byte messages, send the S/N in 12 byte chunks */ -+ mutex_lock(&mcu->lock); -+ for (sn_counter = 0; sn_counter < 3; sn_counter++) { -+ serial_number_header[2] = 0x0 + 0xC * sn_counter; -+ -+ memcpy(serial_number_cmd, serial_number_header, sizeof(serial_number_header)); -+ memcpy(serial_number_cmd + sizeof(serial_number_header), -+ serial_number + 0xC * sn_counter, 0xC); -+ -+ ret = iei_wt61p803_puzzle_write_command(mcu, serial_number_cmd, -+ sizeof(serial_number_cmd), -+ resp_buf, &reply_size); -+ if (ret) -+ goto err; -+ if (reply_size != 3) { -+ ret = -EIO; -+ goto err; -+ } -+ if (!(resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && -+ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK && -+ resp_buf[2] == IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK)) { -+ ret = -EPROTO; -+ goto err; -+ } -+ } -+ -+ sprintf(mcu->version.serial_number, "%.*s", -+ IEI_WT61P803_PUZZLE_SN_LENGTH, serial_number); -+err: -+ mutex_unlock(&mcu->lock); -+ return ret; -+} -+ -+static int iei_wt61p803_puzzle_get_mac_address(struct iei_wt61p803_puzzle *mcu, int index) -+{ -+ unsigned char *resp_buf = mcu->response_buffer; -+ unsigned char mac_address_cmd[5] = { -+ IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM, -+ IEI_WT61P803_PUZZLE_CMD_EEPROM_READ, -+ 0x00, /* EEPROM read address */ -+ 0x11, /* Data length */ -+ }; -+ size_t reply_size; -+ int ret; -+ -+ mutex_lock(&mcu->lock); -+ mac_address_cmd[2] = 0x24 + 0x11 * index; -+ -+ ret = iei_wt61p803_puzzle_write_command(mcu, mac_address_cmd, -+ sizeof(mac_address_cmd), -+ resp_buf, &reply_size); -+ if (ret) -+ goto err; -+ -+ if (reply_size < 22) { -+ ret = -EIO; -+ goto err; -+ } -+ -+ sprintf(mcu->version.mac_address[index], "%.*s", -+ IEI_WT61P803_PUZZLE_MAC_LENGTH, resp_buf + 4); -+err: -+ mutex_unlock(&mcu->lock); -+ return ret; -+} -+ -+static int -+iei_wt61p803_puzzle_write_mac_address(struct iei_wt61p803_puzzle *mcu, -+ unsigned char mac_address[IEI_WT61P803_PUZZLE_MAC_LENGTH], -+ int mac_address_idx) -+{ -+ unsigned char mac_address_cmd[4 + IEI_WT61P803_PUZZLE_MAC_LENGTH + 1]; -+ unsigned char *resp_buf = mcu->response_buffer; -+ unsigned char mac_address_header[4] = { -+ IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM, -+ IEI_WT61P803_PUZZLE_CMD_EEPROM_WRITE, -+ 0x00, /* EEPROM write address */ -+ 0x11, /* Data length */ -+ }; -+ size_t reply_size; -+ int ret; -+ -+ if (mac_address_idx < 0 || mac_address_idx >= IEI_WT61P803_PUZZLE_NB_MAC) -+ return -EINVAL; -+ -+ mac_address_header[2] = 0x24 + 0x11 * mac_address_idx; -+ -+ /* Concat mac_address_header, mac_address to mac_address_cmd */ -+ memcpy(mac_address_cmd, mac_address_header, sizeof(mac_address_header)); -+ memcpy(mac_address_cmd + sizeof(mac_address_header), mac_address, -+ IEI_WT61P803_PUZZLE_MAC_LENGTH); -+ -+ mutex_lock(&mcu->lock); -+ ret = iei_wt61p803_puzzle_write_command(mcu, mac_address_cmd, -+ sizeof(mac_address_cmd), -+ resp_buf, &reply_size); -+ if (ret) -+ goto err; -+ if (reply_size != 3) { -+ ret = -EIO; -+ goto err; -+ } -+ if (!(resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && -+ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK && -+ resp_buf[2] == IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK)) { -+ ret = -EPROTO; -+ goto err; -+ } -+ -+ sprintf(mcu->version.mac_address[mac_address_idx], "%.*s", -+ IEI_WT61P803_PUZZLE_MAC_LENGTH, mac_address); -+err: -+ mutex_unlock(&mcu->lock); -+ return ret; -+} -+ -+static int iei_wt61p803_puzzle_write_power_loss_recovery(struct iei_wt61p803_puzzle *mcu, -+ int power_loss_recovery_action) -+{ -+ unsigned char *resp_buf = mcu->response_buffer; -+ unsigned char power_loss_recovery_cmd[5] = {}; -+ size_t reply_size; -+ int ret; -+ -+ if (power_loss_recovery_action < 0 || power_loss_recovery_action > 4) -+ return -EINVAL; -+ -+ power_loss_recovery_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; -+ power_loss_recovery_cmd[1] = IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER; -+ power_loss_recovery_cmd[2] = IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_POWER_LOSS; -+ power_loss_recovery_cmd[3] = hex_asc[power_loss_recovery_action]; -+ -+ mutex_lock(&mcu->lock); -+ ret = iei_wt61p803_puzzle_write_command(mcu, power_loss_recovery_cmd, -+ sizeof(power_loss_recovery_cmd), -+ resp_buf, &reply_size); -+ if (ret) -+ goto exit; -+ mcu->status.power_loss_recovery = power_loss_recovery_action; -+exit: -+ mutex_unlock(&mcu->lock); -+ return ret; -+} -+ -+#define to_puzzle_dev_attr(_attr) \ -+ container_of(_attr, struct iei_wt61p803_puzzle_device_attribute, dev_attr) -+ -+static ssize_t show_output(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct iei_wt61p803_puzzle *mcu = dev_get_drvdata(dev); -+ struct iei_wt61p803_puzzle_device_attribute *pattr = to_puzzle_dev_attr(attr); -+ int ret; -+ -+ switch (pattr->type) { -+ case IEI_WT61P803_PUZZLE_VERSION: -+ return scnprintf(buf, PAGE_SIZE, "%s\n", mcu->version.version); -+ case IEI_WT61P803_PUZZLE_BUILD_INFO: -+ return scnprintf(buf, PAGE_SIZE, "%s\n", mcu->version.build_info); -+ case IEI_WT61P803_PUZZLE_BOOTLOADER_MODE: -+ return scnprintf(buf, PAGE_SIZE, "%d\n", mcu->version.bootloader_mode); -+ case IEI_WT61P803_PUZZLE_PROTOCOL_VERSION: -+ return scnprintf(buf, PAGE_SIZE, "%s\n", mcu->version.protocol_version); -+ case IEI_WT61P803_PUZZLE_SERIAL_NUMBER: -+ ret = iei_wt61p803_puzzle_get_serial_number(mcu); -+ if (!ret) -+ ret = scnprintf(buf, PAGE_SIZE, "%s\n", mcu->version.serial_number); -+ else -+ ret = 0; -+ return ret; -+ case IEI_WT61P803_PUZZLE_MAC_ADDRESS: -+ ret = iei_wt61p803_puzzle_get_mac_address(mcu, pattr->index); -+ if (!ret) -+ ret = scnprintf(buf, PAGE_SIZE, "%s\n", -+ mcu->version.mac_address[pattr->index]); -+ else -+ ret = 0; -+ return ret; -+ case IEI_WT61P803_PUZZLE_AC_RECOVERY_STATUS: -+ case IEI_WT61P803_PUZZLE_POWER_LOSS_RECOVERY: -+ case IEI_WT61P803_PUZZLE_POWER_STATUS: -+ ret = iei_wt61p803_puzzle_get_mcu_status(mcu); -+ if (ret) -+ return ret; -+ -+ mutex_lock(&mcu->lock); -+ switch (pattr->type) { -+ case IEI_WT61P803_PUZZLE_AC_RECOVERY_STATUS: -+ ret = scnprintf(buf, PAGE_SIZE, "%x\n", -+ mcu->status.ac_recovery_status_flag); -+ break; -+ case IEI_WT61P803_PUZZLE_POWER_LOSS_RECOVERY: -+ ret = scnprintf(buf, PAGE_SIZE, "%x\n", mcu->status.power_loss_recovery); -+ break; -+ case IEI_WT61P803_PUZZLE_POWER_STATUS: -+ ret = scnprintf(buf, PAGE_SIZE, "%x\n", mcu->status.power_status); -+ break; -+ default: -+ ret = 0; -+ break; -+ } -+ mutex_unlock(&mcu->lock); -+ return ret; -+ default: -+ return 0; -+ } -+ -+ return 0; -+} -+ -+static ssize_t store_output(struct device *dev, -+ struct device_attribute *attr, -+ const char *buf, size_t len) -+{ -+ unsigned char serial_number[IEI_WT61P803_PUZZLE_SN_LENGTH]; -+ unsigned char mac_address[IEI_WT61P803_PUZZLE_MAC_LENGTH]; -+ struct iei_wt61p803_puzzle *mcu = dev_get_drvdata(dev); -+ struct iei_wt61p803_puzzle_device_attribute *pattr = to_puzzle_dev_attr(attr); -+ int power_loss_recovery_action = 0; -+ int ret; -+ -+ switch (pattr->type) { -+ case IEI_WT61P803_PUZZLE_SERIAL_NUMBER: -+ if (len != (size_t)(IEI_WT61P803_PUZZLE_SN_LENGTH + 1)) -+ return -EINVAL; -+ memcpy(serial_number, buf, sizeof(serial_number)); -+ ret = iei_wt61p803_puzzle_write_serial_number(mcu, serial_number); -+ if (ret) -+ return ret; -+ return len; -+ case IEI_WT61P803_PUZZLE_MAC_ADDRESS: -+ if (len != (size_t)(IEI_WT61P803_PUZZLE_MAC_LENGTH + 1)) -+ return -EINVAL; -+ -+ memcpy(mac_address, buf, sizeof(mac_address)); -+ -+ if (strlen(attr->attr.name) != 13) -+ return -EIO; -+ -+ ret = iei_wt61p803_puzzle_write_mac_address(mcu, mac_address, pattr->index); -+ if (ret) -+ return ret; -+ return len; -+ case IEI_WT61P803_PUZZLE_POWER_LOSS_RECOVERY: -+ ret = kstrtoint(buf, 10, &power_loss_recovery_action); -+ if (ret) -+ return ret; -+ ret = iei_wt61p803_puzzle_write_power_loss_recovery(mcu, -+ power_loss_recovery_action); -+ if (ret) -+ return ret; -+ return len; -+ default: -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+#define IEI_WT61P803_PUZZLE_ATTR(_name, _mode, _show, _store, _type, _index) \ -+ struct iei_wt61p803_puzzle_device_attribute dev_attr_##_name = \ -+ { .dev_attr = __ATTR(_name, _mode, _show, _store), \ -+ .type = _type, \ -+ .index = _index } -+ -+#define IEI_WT61P803_PUZZLE_ATTR_RO(_name, _type, _id) \ -+ IEI_WT61P803_PUZZLE_ATTR(_name, 0444, show_output, NULL, _type, _id) -+ -+#define IEI_WT61P803_PUZZLE_ATTR_RW(_name, _type, _id) \ -+ IEI_WT61P803_PUZZLE_ATTR(_name, 0644, show_output, store_output, _type, _id) -+ -+static IEI_WT61P803_PUZZLE_ATTR_RO(version, IEI_WT61P803_PUZZLE_VERSION, 0); -+static IEI_WT61P803_PUZZLE_ATTR_RO(build_info, IEI_WT61P803_PUZZLE_BUILD_INFO, 0); -+static IEI_WT61P803_PUZZLE_ATTR_RO(bootloader_mode, IEI_WT61P803_PUZZLE_BOOTLOADER_MODE, 0); -+static IEI_WT61P803_PUZZLE_ATTR_RO(protocol_version, IEI_WT61P803_PUZZLE_PROTOCOL_VERSION, 0); -+static IEI_WT61P803_PUZZLE_ATTR_RW(serial_number, IEI_WT61P803_PUZZLE_SERIAL_NUMBER, 0); -+static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_0, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 0); -+static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_1, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 1); -+static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_2, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 2); -+static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_3, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 3); -+static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_4, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 4); -+static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_5, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 5); -+static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_6, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 6); -+static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_7, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 7); -+static IEI_WT61P803_PUZZLE_ATTR_RO(ac_recovery_status, IEI_WT61P803_PUZZLE_AC_RECOVERY_STATUS, 0); -+static IEI_WT61P803_PUZZLE_ATTR_RW(power_loss_recovery, IEI_WT61P803_PUZZLE_POWER_LOSS_RECOVERY, 0); -+static IEI_WT61P803_PUZZLE_ATTR_RO(power_status, IEI_WT61P803_PUZZLE_POWER_STATUS, 0); -+ -+static struct attribute *iei_wt61p803_puzzle_attrs[] = { -+ &dev_attr_version.dev_attr.attr, -+ &dev_attr_build_info.dev_attr.attr, -+ &dev_attr_bootloader_mode.dev_attr.attr, -+ &dev_attr_protocol_version.dev_attr.attr, -+ &dev_attr_serial_number.dev_attr.attr, -+ &dev_attr_mac_address_0.dev_attr.attr, -+ &dev_attr_mac_address_1.dev_attr.attr, -+ &dev_attr_mac_address_2.dev_attr.attr, -+ &dev_attr_mac_address_3.dev_attr.attr, -+ &dev_attr_mac_address_4.dev_attr.attr, -+ &dev_attr_mac_address_5.dev_attr.attr, -+ &dev_attr_mac_address_6.dev_attr.attr, -+ &dev_attr_mac_address_7.dev_attr.attr, -+ &dev_attr_ac_recovery_status.dev_attr.attr, -+ &dev_attr_power_loss_recovery.dev_attr.attr, -+ &dev_attr_power_status.dev_attr.attr, -+ NULL -+}; -+ATTRIBUTE_GROUPS(iei_wt61p803_puzzle); -+ -+static int iei_wt61p803_puzzle_sysfs_create(struct device *dev, -+ struct iei_wt61p803_puzzle *mcu) -+{ -+ int ret; -+ -+ ret = sysfs_create_groups(&mcu->dev->kobj, iei_wt61p803_puzzle_groups); -+ if (ret) -+ mfd_remove_devices(mcu->dev); -+ -+ return ret; -+} -+ -+static int iei_wt61p803_puzzle_sysfs_remove(struct device *dev, -+ struct iei_wt61p803_puzzle *mcu) -+{ -+ /* Remove sysfs groups */ -+ sysfs_remove_groups(&mcu->dev->kobj, iei_wt61p803_puzzle_groups); -+ mfd_remove_devices(mcu->dev); -+ -+ return 0; -+} -+ -+static int iei_wt61p803_puzzle_probe(struct serdev_device *serdev) -+{ -+ struct device *dev = &serdev->dev; -+ struct iei_wt61p803_puzzle *mcu; -+ u32 baud; -+ int ret; -+ -+ /* Read the baud rate from 'current-speed', because the MCU supports different rates */ -+ if (device_property_read_u32(dev, "current-speed", &baud)) { -+ dev_err(dev, -+ "'current-speed' is not specified in device node\n"); -+ return -EINVAL; -+ } -+ dev_dbg(dev, "Driver baud rate: %d\n", baud); -+ -+ /* Allocate the memory */ -+ mcu = devm_kzalloc(dev, sizeof(*mcu), GFP_KERNEL); -+ if (!mcu) -+ return -ENOMEM; -+ -+ mcu->reply = devm_kzalloc(dev, sizeof(*mcu->reply), GFP_KERNEL); -+ if (!mcu->reply) -+ return -ENOMEM; -+ -+ /* Initialize device struct data */ -+ mcu->serdev = serdev; -+ mcu->dev = dev; -+ init_completion(&mcu->reply->received); -+ mutex_init(&mcu->reply_lock); -+ mutex_init(&mcu->lock); -+ -+ /* Setup UART interface */ -+ serdev_device_set_drvdata(serdev, mcu); -+ serdev_device_set_client_ops(serdev, &iei_wt61p803_puzzle_serdev_device_ops); -+ ret = devm_serdev_device_open(dev, serdev); -+ if (ret) -+ return ret; -+ serdev_device_set_baudrate(serdev, baud); -+ serdev_device_set_flow_control(serdev, false); -+ ret = serdev_device_set_parity(serdev, SERDEV_PARITY_NONE); -+ if (ret) { -+ dev_err(dev, "Failed to set parity\n"); -+ return ret; -+ } -+ -+ ret = iei_wt61p803_puzzle_get_version(mcu); -+ if (ret) -+ return ret; -+ -+ dev_dbg(dev, "MCU version: %s\n", mcu->version.version); -+ dev_dbg(dev, "MCU firmware build info: %s\n", mcu->version.build_info); -+ dev_dbg(dev, "MCU in bootloader mode: %s\n", -+ mcu->version.bootloader_mode ? "true" : "false"); -+ dev_dbg(dev, "MCU protocol version: %s\n", mcu->version.protocol_version); -+ -+ if (device_property_read_bool(dev, "enable-beep")) { -+ ret = iei_wt61p803_puzzle_buzzer(mcu, false); -+ if (ret) -+ return ret; -+ } -+ -+ ret = iei_wt61p803_puzzle_sysfs_create(dev, mcu); -+ if (ret) -+ return ret; -+ -+ return devm_of_platform_populate(dev); -+} -+ -+static void iei_wt61p803_puzzle_remove(struct serdev_device *serdev) -+{ -+ struct device *dev = &serdev->dev; -+ struct iei_wt61p803_puzzle *mcu = dev_get_drvdata(dev); -+ -+ iei_wt61p803_puzzle_sysfs_remove(dev, mcu); -+} -+ -+static const struct of_device_id iei_wt61p803_puzzle_dt_ids[] = { -+ { .compatible = "iei,wt61p803-puzzle" }, -+ { } -+}; -+ -+MODULE_DEVICE_TABLE(of, iei_wt61p803_puzzle_dt_ids); -+ -+static struct serdev_device_driver iei_wt61p803_puzzle_drv = { -+ .probe = iei_wt61p803_puzzle_probe, -+ .remove = iei_wt61p803_puzzle_remove, -+ .driver = { -+ .name = "iei-wt61p803-puzzle", -+ .of_match_table = iei_wt61p803_puzzle_dt_ids, -+ }, -+}; -+ -+module_serdev_device_driver(iei_wt61p803_puzzle_drv); -+ -+MODULE_LICENSE("GPL v2"); -+MODULE_AUTHOR("Luka Kovacic "); -+MODULE_DESCRIPTION("IEI WT61P803 PUZZLE MCU Driver"); ---- /dev/null -+++ b/include/linux/mfd/iei-wt61p803-puzzle.h -@@ -0,0 +1,66 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+/* IEI WT61P803 PUZZLE MCU Driver -+ * System management microcontroller for fan control, temperature sensor reading, -+ * LED control and system identification on IEI Puzzle series ARM-based appliances. -+ * -+ * Copyright (C) 2020 Sartura Ltd. -+ * Author: Luka Kovacic -+ */ -+ -+#ifndef _MFD_IEI_WT61P803_PUZZLE_H_ -+#define _MFD_IEI_WT61P803_PUZZLE_H_ -+ -+#define IEI_WT61P803_PUZZLE_BUF_SIZE 512 -+ -+/* Command magic numbers */ -+#define IEI_WT61P803_PUZZLE_CMD_HEADER_START 0x40 /* @ */ -+#define IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER 0x25 /* % */ -+#define IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM 0xF7 -+ -+#define IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK 0x30 /* 0 */ -+#define IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK 0x70 -+ -+#define IEI_WT61P803_PUZZLE_CMD_EEPROM_READ 0xA1 -+#define IEI_WT61P803_PUZZLE_CMD_EEPROM_WRITE 0xA0 -+ -+#define IEI_WT61P803_PUZZLE_CMD_OTHER_VERSION 0x56 /* V */ -+#define IEI_WT61P803_PUZZLE_CMD_OTHER_BUILD 0x42 /* B */ -+#define IEI_WT61P803_PUZZLE_CMD_OTHER_BOOTLOADER_MODE 0x4D /* M */ -+#define IEI_WT61P803_PUZZLE_CMD_OTHER_MODE_BOOTLOADER 0x30 -+#define IEI_WT61P803_PUZZLE_CMD_OTHER_MODE_APPS 0x31 -+#define IEI_WT61P803_PUZZLE_CMD_OTHER_PROTOCOL_VERSION 0x50 /* P */ -+ -+#define IEI_WT61P803_PUZZLE_CMD_FUNCTION_SINGLE 0x43 /* C */ -+#define IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER 0x4F /* O */ -+#define IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_STATUS 0x53 /* S */ -+#define IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_POWER_LOSS 0x41 /* A */ -+ -+#define IEI_WT61P803_PUZZLE_CMD_LED 0x52 /* R */ -+#define IEI_WT61P803_PUZZLE_CMD_LED_POWER 0x31 /* 1 */ -+ -+#define IEI_WT61P803_PUZZLE_CMD_TEMP 0x54 /* T */ -+#define IEI_WT61P803_PUZZLE_CMD_TEMP_ALL 0x41 /* A */ -+ -+#define IEI_WT61P803_PUZZLE_CMD_FAN 0x46 /* F */ -+#define IEI_WT61P803_PUZZLE_CMD_FAN_PWM_READ 0x5A /* Z */ -+#define IEI_WT61P803_PUZZLE_CMD_FAN_PWM_WRITE 0x57 /* W */ -+#define IEI_WT61P803_PUZZLE_CMD_FAN_PWM_BASE 0x30 -+#define IEI_WT61P803_PUZZLE_CMD_FAN_RPM_BASE 0x41 /* A */ -+ -+#define IEI_WT61P803_PUZZLE_CMD_FAN_PWM(x) (IEI_WT61P803_PUZZLE_CMD_FAN_PWM_BASE + (x)) /* 0 - 1 */ -+#define IEI_WT61P803_PUZZLE_CMD_FAN_RPM(x) (IEI_WT61P803_PUZZLE_CMD_FAN_RPM_BASE + (x)) /* 0 - 5 */ -+ -+struct iei_wt61p803_puzzle_mcu_version; -+struct iei_wt61p803_puzzle_reply; -+struct iei_wt61p803_puzzle; -+ -+int iei_wt61p803_puzzle_write_command_watchdog(struct iei_wt61p803_puzzle *mcu, -+ unsigned char *cmd, size_t size, -+ unsigned char *reply_data, size_t *reply_size, -+ int retry_count); -+ -+int iei_wt61p803_puzzle_write_command(struct iei_wt61p803_puzzle *mcu, -+ unsigned char *cmd, size_t size, -+ unsigned char *reply_data, size_t *reply_size); -+ -+#endif /* _MFD_IEI_WT61P803_PUZZLE_H_ */ diff --git a/target/linux/mvebu/patches-5.10/903-drivers-hwmon-Add-the-IEI-WT61P803-PUZZLE-HWMON-driv.patch b/target/linux/mvebu/patches-5.10/903-drivers-hwmon-Add-the-IEI-WT61P803-PUZZLE-HWMON-driv.patch deleted file mode 100644 index 684f09c800..0000000000 --- a/target/linux/mvebu/patches-5.10/903-drivers-hwmon-Add-the-IEI-WT61P803-PUZZLE-HWMON-driv.patch +++ /dev/null @@ -1,469 +0,0 @@ -From e3310a638cd310bfd93dbbc6d2732ab6aea18dd2 Mon Sep 17 00:00:00 2001 -From: Luka Kovacic -Date: Tue, 24 Aug 2021 12:44:34 +0000 -Subject: [PATCH 3/7] drivers: hwmon: Add the IEI WT61P803 PUZZLE HWMON driver - -Add the IEI WT61P803 PUZZLE HWMON driver, that handles the fan speed -control via PWM, reading fan speed and reading on-board temperature -sensors. - -The driver registers a HWMON device and a simple thermal cooling device to -enable in-kernel fan management. - -This driver depends on the IEI WT61P803 PUZZLE MFD driver. - -Signed-off-by: Luka Kovacic -Signed-off-by: Pavo Banicevic -Acked-by: Guenter Roeck -Cc: Luka Perkov -Cc: Robert Marko ---- - drivers/hwmon/Kconfig | 8 + - drivers/hwmon/Makefile | 1 + - drivers/hwmon/iei-wt61p803-puzzle-hwmon.c | 413 ++++++++++++++++++++++ - 3 files changed, 422 insertions(+) - create mode 100644 drivers/hwmon/iei-wt61p803-puzzle-hwmon.c - ---- a/drivers/hwmon/Kconfig -+++ b/drivers/hwmon/Kconfig -@@ -722,6 +722,14 @@ config SENSORS_IBMPOWERNV - This driver can also be built as a module. If so, the module - will be called ibmpowernv. - -+config SENSORS_IEI_WT61P803_PUZZLE_HWMON -+ tristate "IEI WT61P803 PUZZLE MFD HWMON Driver" -+ depends on MFD_IEI_WT61P803_PUZZLE -+ help -+ The IEI WT61P803 PUZZLE MFD HWMON Driver handles reading fan speed -+ and writing fan PWM values. It also supports reading on-board -+ temperature sensors. -+ - config SENSORS_IIO_HWMON - tristate "Hwmon driver that uses channels specified via iio maps" - depends on IIO ---- a/drivers/hwmon/Makefile -+++ b/drivers/hwmon/Makefile -@@ -83,6 +83,7 @@ obj-$(CONFIG_SENSORS_HIH6130) += hih6130 - obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o - obj-$(CONFIG_SENSORS_I5500) += i5500_temp.o - obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o -+obj-$(CONFIG_SENSORS_IEI_WT61P803_PUZZLE_HWMON) += iei-wt61p803-puzzle-hwmon.o - obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o - obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o - obj-$(CONFIG_SENSORS_IBMPOWERNV)+= ibmpowernv.o ---- /dev/null -+++ b/drivers/hwmon/iei-wt61p803-puzzle-hwmon.c -@@ -0,0 +1,413 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* IEI WT61P803 PUZZLE MCU HWMON Driver -+ * -+ * Copyright (C) 2020 Sartura Ltd. -+ * Author: Luka Kovacic -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define IEI_WT61P803_PUZZLE_HWMON_MAX_PWM 2 -+#define IEI_WT61P803_PUZZLE_HWMON_MAX_PWM_VAL 255 -+ -+/** -+ * struct iei_wt61p803_puzzle_thermal_cooling_device - Thermal cooling device instance -+ * @mcu_hwmon: Parent driver struct pointer -+ * @tcdev: Thermal cooling device pointer -+ * @name: Thermal cooling device name -+ * @pwm_channel: Controlled PWM channel (0 or 1) -+ * @cooling_levels: Thermal cooling device cooling levels (DT) -+ */ -+struct iei_wt61p803_puzzle_thermal_cooling_device { -+ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon; -+ struct thermal_cooling_device *tcdev; -+ char name[THERMAL_NAME_LENGTH]; -+ int pwm_channel; -+ u8 *cooling_levels; -+}; -+ -+/** -+ * struct iei_wt61p803_puzzle_hwmon - MCU HWMON Driver -+ * @mcu: MCU struct pointer -+ * @response_buffer Global MCU response buffer -+ * @thermal_cooling_dev_present: Per-channel thermal cooling device control indicator -+ * @cdev: Per-channel thermal cooling device private structure -+ */ -+struct iei_wt61p803_puzzle_hwmon { -+ struct iei_wt61p803_puzzle *mcu; -+ unsigned char response_buffer[IEI_WT61P803_PUZZLE_BUF_SIZE]; -+ bool thermal_cooling_dev_present[IEI_WT61P803_PUZZLE_HWMON_MAX_PWM]; -+ struct iei_wt61p803_puzzle_thermal_cooling_device -+ *cdev[IEI_WT61P803_PUZZLE_HWMON_MAX_PWM]; -+ struct mutex lock; /* mutex to protect response_buffer array */ -+}; -+ -+#define raw_temp_to_milidegree_celsius(x) (((x) - 0x80) * 1000) -+static int iei_wt61p803_puzzle_read_temp_sensor(struct iei_wt61p803_puzzle_hwmon *mcu_hwmon, -+ int channel, long *value) -+{ -+ unsigned char *resp_buf = mcu_hwmon->response_buffer; -+ unsigned char temp_sensor_ntc_cmd[4] = { -+ IEI_WT61P803_PUZZLE_CMD_HEADER_START, -+ IEI_WT61P803_PUZZLE_CMD_TEMP, -+ IEI_WT61P803_PUZZLE_CMD_TEMP_ALL, -+ }; -+ size_t reply_size; -+ int ret; -+ -+ mutex_lock(&mcu_hwmon->lock); -+ ret = iei_wt61p803_puzzle_write_command(mcu_hwmon->mcu, temp_sensor_ntc_cmd, -+ sizeof(temp_sensor_ntc_cmd), resp_buf, -+ &reply_size); -+ if (ret) -+ goto exit; -+ -+ if (reply_size != 7) { -+ ret = -EIO; -+ goto exit; -+ } -+ -+ /* Check the number of NTC values */ -+ if (resp_buf[3] != '2') { -+ ret = -EIO; -+ goto exit; -+ } -+ -+ *value = raw_temp_to_milidegree_celsius(resp_buf[4 + channel]); -+exit: -+ mutex_unlock(&mcu_hwmon->lock); -+ return ret; -+} -+ -+#define raw_fan_val_to_rpm(x, y) ((((x) << 8 | (y)) / 2) * 60) -+static int iei_wt61p803_puzzle_read_fan_speed(struct iei_wt61p803_puzzle_hwmon *mcu_hwmon, -+ int channel, long *value) -+{ -+ unsigned char *resp_buf = mcu_hwmon->response_buffer; -+ unsigned char fan_speed_cmd[4] = {}; -+ size_t reply_size; -+ int ret; -+ -+ fan_speed_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; -+ fan_speed_cmd[1] = IEI_WT61P803_PUZZLE_CMD_FAN; -+ fan_speed_cmd[2] = IEI_WT61P803_PUZZLE_CMD_FAN_RPM(channel); -+ -+ mutex_lock(&mcu_hwmon->lock); -+ ret = iei_wt61p803_puzzle_write_command(mcu_hwmon->mcu, fan_speed_cmd, -+ sizeof(fan_speed_cmd), resp_buf, -+ &reply_size); -+ if (ret) -+ goto exit; -+ -+ if (reply_size != 7) { -+ ret = -EIO; -+ goto exit; -+ } -+ -+ *value = raw_fan_val_to_rpm(resp_buf[3], resp_buf[4]); -+exit: -+ mutex_unlock(&mcu_hwmon->lock); -+ return ret; -+} -+ -+static int iei_wt61p803_puzzle_write_pwm_channel(struct iei_wt61p803_puzzle_hwmon *mcu_hwmon, -+ int channel, long pwm_set_val) -+{ -+ unsigned char *resp_buf = mcu_hwmon->response_buffer; -+ unsigned char pwm_set_cmd[6] = {}; -+ size_t reply_size; -+ int ret; -+ -+ pwm_set_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; -+ pwm_set_cmd[1] = IEI_WT61P803_PUZZLE_CMD_FAN; -+ pwm_set_cmd[2] = IEI_WT61P803_PUZZLE_CMD_FAN_PWM_WRITE; -+ pwm_set_cmd[3] = IEI_WT61P803_PUZZLE_CMD_FAN_PWM(channel); -+ pwm_set_cmd[4] = pwm_set_val; -+ -+ mutex_lock(&mcu_hwmon->lock); -+ ret = iei_wt61p803_puzzle_write_command(mcu_hwmon->mcu, pwm_set_cmd, -+ sizeof(pwm_set_cmd), resp_buf, -+ &reply_size); -+ if (ret) -+ goto exit; -+ -+ if (reply_size != 3) { -+ ret = -EIO; -+ goto exit; -+ } -+ -+ if (!(resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && -+ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK && -+ resp_buf[2] == IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK)) { -+ ret = -EIO; -+ goto exit; -+ } -+exit: -+ mutex_unlock(&mcu_hwmon->lock); -+ return ret; -+} -+ -+static int iei_wt61p803_puzzle_read_pwm_channel(struct iei_wt61p803_puzzle_hwmon *mcu_hwmon, -+ int channel, long *value) -+{ -+ unsigned char *resp_buf = mcu_hwmon->response_buffer; -+ unsigned char pwm_get_cmd[5] = {}; -+ size_t reply_size; -+ int ret; -+ -+ pwm_get_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; -+ pwm_get_cmd[1] = IEI_WT61P803_PUZZLE_CMD_FAN; -+ pwm_get_cmd[2] = IEI_WT61P803_PUZZLE_CMD_FAN_PWM_READ; -+ pwm_get_cmd[3] = IEI_WT61P803_PUZZLE_CMD_FAN_PWM(channel); -+ -+ ret = iei_wt61p803_puzzle_write_command(mcu_hwmon->mcu, pwm_get_cmd, -+ sizeof(pwm_get_cmd), resp_buf, -+ &reply_size); -+ if (ret) -+ return ret; -+ -+ if (reply_size != 5) -+ return -EIO; -+ -+ if (resp_buf[2] != IEI_WT61P803_PUZZLE_CMD_FAN_PWM_READ) -+ return -EIO; -+ -+ *value = resp_buf[3]; -+ -+ return 0; -+} -+ -+static int iei_wt61p803_puzzle_read(struct device *dev, enum hwmon_sensor_types type, -+ u32 attr, int channel, long *val) -+{ -+ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon = dev_get_drvdata(dev->parent); -+ -+ switch (type) { -+ case hwmon_pwm: -+ return iei_wt61p803_puzzle_read_pwm_channel(mcu_hwmon, channel, val); -+ case hwmon_fan: -+ return iei_wt61p803_puzzle_read_fan_speed(mcu_hwmon, channel, val); -+ case hwmon_temp: -+ return iei_wt61p803_puzzle_read_temp_sensor(mcu_hwmon, channel, val); -+ default: -+ return -EINVAL; -+ } -+} -+ -+static int iei_wt61p803_puzzle_write(struct device *dev, enum hwmon_sensor_types type, -+ u32 attr, int channel, long val) -+{ -+ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon = dev_get_drvdata(dev->parent); -+ -+ return iei_wt61p803_puzzle_write_pwm_channel(mcu_hwmon, channel, val); -+} -+ -+static umode_t iei_wt61p803_puzzle_is_visible(const void *data, enum hwmon_sensor_types type, -+ u32 attr, int channel) -+{ -+ const struct iei_wt61p803_puzzle_hwmon *mcu_hwmon = data; -+ -+ switch (type) { -+ case hwmon_pwm: -+ if (mcu_hwmon->thermal_cooling_dev_present[channel]) -+ return 0444; -+ if (attr == hwmon_pwm_input) -+ return 0644; -+ break; -+ case hwmon_fan: -+ if (attr == hwmon_fan_input) -+ return 0444; -+ break; -+ case hwmon_temp: -+ if (attr == hwmon_temp_input) -+ return 0444; -+ break; -+ default: -+ return 0; -+ } -+ -+ return 0; -+} -+ -+static const struct hwmon_ops iei_wt61p803_puzzle_hwmon_ops = { -+ .is_visible = iei_wt61p803_puzzle_is_visible, -+ .read = iei_wt61p803_puzzle_read, -+ .write = iei_wt61p803_puzzle_write, -+}; -+ -+static const struct hwmon_channel_info *iei_wt61p803_puzzle_info[] = { -+ HWMON_CHANNEL_INFO(pwm, -+ HWMON_PWM_INPUT, -+ HWMON_PWM_INPUT), -+ HWMON_CHANNEL_INFO(fan, -+ HWMON_F_INPUT, -+ HWMON_F_INPUT, -+ HWMON_F_INPUT, -+ HWMON_F_INPUT, -+ HWMON_F_INPUT), -+ HWMON_CHANNEL_INFO(temp, -+ HWMON_T_INPUT, -+ HWMON_T_INPUT), -+ NULL -+}; -+ -+static const struct hwmon_chip_info iei_wt61p803_puzzle_chip_info = { -+ .ops = &iei_wt61p803_puzzle_hwmon_ops, -+ .info = iei_wt61p803_puzzle_info, -+}; -+ -+static int iei_wt61p803_puzzle_get_max_state(struct thermal_cooling_device *tcdev, -+ unsigned long *state) -+{ -+ *state = IEI_WT61P803_PUZZLE_HWMON_MAX_PWM_VAL; -+ -+ return 0; -+} -+ -+static int iei_wt61p803_puzzle_get_cur_state(struct thermal_cooling_device *tcdev, -+ unsigned long *state) -+{ -+ struct iei_wt61p803_puzzle_thermal_cooling_device *cdev = tcdev->devdata; -+ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon = cdev->mcu_hwmon; -+ long value; -+ int ret; -+ -+ ret = iei_wt61p803_puzzle_read_pwm_channel(mcu_hwmon, cdev->pwm_channel, &value); -+ if (ret) -+ return ret; -+ *state = value; -+ return 0; -+} -+ -+static int iei_wt61p803_puzzle_set_cur_state(struct thermal_cooling_device *tcdev, -+ unsigned long state) -+{ -+ struct iei_wt61p803_puzzle_thermal_cooling_device *cdev = tcdev->devdata; -+ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon = cdev->mcu_hwmon; -+ -+ return iei_wt61p803_puzzle_write_pwm_channel(mcu_hwmon, cdev->pwm_channel, state); -+} -+ -+static const struct thermal_cooling_device_ops iei_wt61p803_puzzle_cooling_ops = { -+ .get_max_state = iei_wt61p803_puzzle_get_max_state, -+ .get_cur_state = iei_wt61p803_puzzle_get_cur_state, -+ .set_cur_state = iei_wt61p803_puzzle_set_cur_state, -+}; -+ -+static int -+iei_wt61p803_puzzle_enable_thermal_cooling_dev(struct device *dev, -+ struct fwnode_handle *child, -+ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon) -+{ -+ struct iei_wt61p803_puzzle_thermal_cooling_device *cdev; -+ u32 pwm_channel; -+ u8 num_levels; -+ int ret; -+ -+ ret = fwnode_property_read_u32(child, "reg", &pwm_channel); -+ if (ret) -+ return ret; -+ -+ mcu_hwmon->thermal_cooling_dev_present[pwm_channel] = true; -+ -+ num_levels = fwnode_property_count_u8(child, "cooling-levels"); -+ if (!num_levels) -+ return -EINVAL; -+ -+ cdev = devm_kzalloc(dev, sizeof(*cdev), GFP_KERNEL); -+ if (!cdev) -+ return -ENOMEM; -+ -+ cdev->cooling_levels = devm_kmalloc_array(dev, num_levels, sizeof(u8), GFP_KERNEL); -+ if (!cdev->cooling_levels) -+ return -ENOMEM; -+ -+ ret = fwnode_property_read_u8_array(child, "cooling-levels", -+ cdev->cooling_levels, -+ num_levels); -+ if (ret) { -+ dev_err(dev, "Couldn't read property 'cooling-levels'\n"); -+ return ret; -+ } -+ -+ snprintf(cdev->name, THERMAL_NAME_LENGTH, "wt61p803_puzzle_%d", pwm_channel); -+ cdev->tcdev = devm_thermal_of_cooling_device_register(dev, NULL, cdev->name, cdev, -+ &iei_wt61p803_puzzle_cooling_ops); -+ if (IS_ERR(cdev->tcdev)) -+ return PTR_ERR(cdev->tcdev); -+ -+ cdev->mcu_hwmon = mcu_hwmon; -+ cdev->pwm_channel = pwm_channel; -+ mcu_hwmon->cdev[pwm_channel] = cdev; -+ -+ return 0; -+} -+ -+static int iei_wt61p803_puzzle_hwmon_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct iei_wt61p803_puzzle *mcu = dev_get_drvdata(dev->parent); -+ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon; -+ struct fwnode_handle *child; -+ struct device *hwmon_dev; -+ int ret; -+ -+ mcu_hwmon = devm_kzalloc(dev, sizeof(*mcu_hwmon), GFP_KERNEL); -+ if (!mcu_hwmon) -+ return -ENOMEM; -+ -+ mcu_hwmon->mcu = mcu; -+ platform_set_drvdata(pdev, mcu_hwmon); -+ mutex_init(&mcu_hwmon->lock); -+ -+ hwmon_dev = devm_hwmon_device_register_with_info(dev, "iei_wt61p803_puzzle", -+ mcu_hwmon, -+ &iei_wt61p803_puzzle_chip_info, -+ NULL); -+ if (IS_ERR(hwmon_dev)) -+ return PTR_ERR(hwmon_dev); -+ -+ /* Control fans via PWM lines via Linux Kernel */ -+ if (IS_ENABLED(CONFIG_THERMAL)) { -+ device_for_each_child_node(dev, child) { -+ ret = iei_wt61p803_puzzle_enable_thermal_cooling_dev(dev, child, mcu_hwmon); -+ if (ret) { -+ dev_err(dev, "Enabling the PWM fan failed\n"); -+ fwnode_handle_put(child); -+ return ret; -+ } -+ } -+ } -+ return 0; -+} -+ -+static const struct of_device_id iei_wt61p803_puzzle_hwmon_id_table[] = { -+ { .compatible = "iei,wt61p803-puzzle-hwmon" }, -+ {} -+}; -+MODULE_DEVICE_TABLE(of, iei_wt61p803_puzzle_hwmon_id_table); -+ -+static struct platform_driver iei_wt61p803_puzzle_hwmon_driver = { -+ .driver = { -+ .name = "iei-wt61p803-puzzle-hwmon", -+ .of_match_table = iei_wt61p803_puzzle_hwmon_id_table, -+ }, -+ .probe = iei_wt61p803_puzzle_hwmon_probe, -+}; -+ -+module_platform_driver(iei_wt61p803_puzzle_hwmon_driver); -+ -+MODULE_DESCRIPTION("IEI WT61P803 PUZZLE MCU HWMON Driver"); -+MODULE_AUTHOR("Luka Kovacic "); -+MODULE_LICENSE("GPL v2"); diff --git a/target/linux/mvebu/patches-5.10/904-drivers-leds-Add-the-IEI-WT61P803-PUZZLE-LED-driver.patch b/target/linux/mvebu/patches-5.10/904-drivers-leds-Add-the-IEI-WT61P803-PUZZLE-LED-driver.patch deleted file mode 100644 index 3ac2427b80..0000000000 --- a/target/linux/mvebu/patches-5.10/904-drivers-leds-Add-the-IEI-WT61P803-PUZZLE-LED-driver.patch +++ /dev/null @@ -1,207 +0,0 @@ -From f3b44eb69cc561cf05d00506dcec0dd9be003ed8 Mon Sep 17 00:00:00 2001 -From: Luka Kovacic -Date: Tue, 24 Aug 2021 12:44:35 +0000 -Subject: [PATCH 4/7] drivers: leds: Add the IEI WT61P803 PUZZLE LED driver - -Add support for the IEI WT61P803 PUZZLE LED driver. -Currently only the front panel power LED is supported, -since it is the only LED on this board wired through the -MCU. - -The LED is wired directly to the on-board MCU controller -and is toggled using an MCU command. - -Support for more LEDs is going to be added in case more -boards implement this microcontroller, as LEDs use many -different GPIOs. - -This driver depends on the IEI WT61P803 PUZZLE MFD driver. - -Signed-off-by: Luka Kovacic -Signed-off-by: Pavo Banicevic -Cc: Luka Perkov -Cc: Robert Marko ---- - drivers/leds/Kconfig | 8 ++ - drivers/leds/Makefile | 1 + - drivers/leds/leds-iei-wt61p803-puzzle.c | 147 ++++++++++++++++++++++++ - 3 files changed, 156 insertions(+) - create mode 100644 drivers/leds/leds-iei-wt61p803-puzzle.c - ---- a/drivers/leds/Kconfig -+++ b/drivers/leds/Kconfig -@@ -334,6 +334,14 @@ config LEDS_IPAQ_MICRO - Choose this option if you want to use the notification LED on - Compaq/HP iPAQ h3100 and h3600. - -+config LEDS_IEI_WT61P803_PUZZLE -+ tristate "LED Support for the IEI WT61P803 PUZZLE MCU" -+ depends on LEDS_CLASS -+ depends on MFD_IEI_WT61P803_PUZZLE -+ help -+ This option enables support for LEDs controlled by the IEI WT61P803 -+ M801 MCU. -+ - config LEDS_HP6XX - tristate "LED Support for the HP Jornada 6xx" - depends on LEDS_CLASS ---- a/drivers/leds/Makefile -+++ b/drivers/leds/Makefile -@@ -35,6 +35,7 @@ obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx. - obj-$(CONFIG_LEDS_INTEL_SS4200) += leds-ss4200.o - obj-$(CONFIG_LEDS_IP30) += leds-ip30.o - obj-$(CONFIG_LEDS_IPAQ_MICRO) += leds-ipaq-micro.o -+obj-$(CONFIG_LEDS_IEI_WT61P803_PUZZLE) += leds-iei-wt61p803-puzzle.o - obj-$(CONFIG_LEDS_IS31FL319X) += leds-is31fl319x.o - obj-$(CONFIG_LEDS_IS31FL32XX) += leds-is31fl32xx.o - obj-$(CONFIG_LEDS_KTD2692) += leds-ktd2692.o ---- /dev/null -+++ b/drivers/leds/leds-iei-wt61p803-puzzle.c -@@ -0,0 +1,147 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* IEI WT61P803 PUZZLE MCU LED Driver -+ * -+ * Copyright (C) 2020 Sartura Ltd. -+ * Author: Luka Kovacic -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+enum iei_wt61p803_puzzle_led_state { -+ IEI_LED_OFF = 0x30, -+ IEI_LED_ON = 0x31, -+ IEI_LED_BLINK_5HZ = 0x32, -+ IEI_LED_BLINK_1HZ = 0x33, -+}; -+ -+/** -+ * struct iei_wt61p803_puzzle_led - MCU LED Driver -+ * @cdev: LED classdev -+ * @mcu: MCU struct pointer -+ * @response_buffer Global MCU response buffer -+ * @lock: General mutex lock to protect simultaneous R/W access to led_power_state -+ * @led_power_state: State of the front panel power LED -+ */ -+struct iei_wt61p803_puzzle_led { -+ struct led_classdev cdev; -+ struct iei_wt61p803_puzzle *mcu; -+ unsigned char response_buffer[IEI_WT61P803_PUZZLE_BUF_SIZE]; -+ struct mutex lock; /* mutex to protect led_power_state */ -+ int led_power_state; -+}; -+ -+static inline struct iei_wt61p803_puzzle_led *cdev_to_iei_wt61p803_puzzle_led -+ (struct led_classdev *led_cdev) -+{ -+ return container_of(led_cdev, struct iei_wt61p803_puzzle_led, cdev); -+} -+ -+static int iei_wt61p803_puzzle_led_brightness_set_blocking(struct led_classdev *cdev, -+ enum led_brightness brightness) -+{ -+ struct iei_wt61p803_puzzle_led *priv = cdev_to_iei_wt61p803_puzzle_led(cdev); -+ unsigned char *resp_buf = priv->response_buffer; -+ unsigned char led_power_cmd[5] = {}; -+ size_t reply_size; -+ int ret; -+ -+ led_power_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; -+ led_power_cmd[1] = IEI_WT61P803_PUZZLE_CMD_LED; -+ led_power_cmd[2] = IEI_WT61P803_PUZZLE_CMD_LED_POWER; -+ led_power_cmd[3] = brightness == LED_OFF ? IEI_LED_OFF : IEI_LED_ON; -+ -+ ret = iei_wt61p803_puzzle_write_command(priv->mcu, led_power_cmd, -+ sizeof(led_power_cmd), -+ resp_buf, -+ &reply_size); -+ if (ret) -+ return ret; -+ -+ if (reply_size != 3) -+ return -EIO; -+ -+ if (!(resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && -+ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK && -+ resp_buf[2] == IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK)) -+ return -EIO; -+ -+ mutex_lock(&priv->lock); -+ priv->led_power_state = brightness; -+ mutex_unlock(&priv->lock); -+ -+ return 0; -+} -+ -+static enum led_brightness iei_wt61p803_puzzle_led_brightness_get(struct led_classdev *cdev) -+{ -+ struct iei_wt61p803_puzzle_led *priv = cdev_to_iei_wt61p803_puzzle_led(cdev); -+ int led_state; -+ -+ mutex_lock(&priv->lock); -+ led_state = priv->led_power_state; -+ mutex_unlock(&priv->lock); -+ -+ return led_state; -+} -+ -+static int iei_wt61p803_puzzle_led_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct iei_wt61p803_puzzle *mcu = dev_get_drvdata(dev->parent); -+ struct iei_wt61p803_puzzle_led *priv; -+ struct led_init_data init_data = {}; -+ struct fwnode_handle *child; -+ int ret; -+ -+ if (device_get_child_node_count(dev) != 1) -+ return -EINVAL; -+ -+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); -+ if (!priv) -+ return -ENOMEM; -+ -+ priv->mcu = mcu; -+ priv->led_power_state = 1; -+ mutex_init(&priv->lock); -+ dev_set_drvdata(dev, priv); -+ -+ child = device_get_next_child_node(dev, NULL); -+ init_data.fwnode = child; -+ -+ priv->cdev.brightness_set_blocking = iei_wt61p803_puzzle_led_brightness_set_blocking; -+ priv->cdev.brightness_get = iei_wt61p803_puzzle_led_brightness_get; -+ priv->cdev.max_brightness = 1; -+ -+ ret = devm_led_classdev_register_ext(dev, &priv->cdev, &init_data); -+ if (ret) -+ dev_err(dev, "Could not register LED\n"); -+ -+ fwnode_handle_put(child); -+ return ret; -+} -+ -+static const struct of_device_id iei_wt61p803_puzzle_led_of_match[] = { -+ { .compatible = "iei,wt61p803-puzzle-leds" }, -+ { } -+}; -+MODULE_DEVICE_TABLE(of, iei_wt61p803_puzzle_led_of_match); -+ -+static struct platform_driver iei_wt61p803_puzzle_led_driver = { -+ .driver = { -+ .name = "iei-wt61p803-puzzle-led", -+ .of_match_table = iei_wt61p803_puzzle_led_of_match, -+ }, -+ .probe = iei_wt61p803_puzzle_led_probe, -+}; -+module_platform_driver(iei_wt61p803_puzzle_led_driver); -+ -+MODULE_DESCRIPTION("IEI WT61P803 PUZZLE front panel LED driver"); -+MODULE_AUTHOR("Luka Kovacic "); -+MODULE_LICENSE("GPL v2"); -+MODULE_ALIAS("platform:leds-iei-wt61p803-puzzle"); diff --git a/target/linux/mvebu/patches-5.10/906-Documentation-hwmon-Add-iei-wt61p803-puzzle-hwmon-dr.patch b/target/linux/mvebu/patches-5.10/906-Documentation-hwmon-Add-iei-wt61p803-puzzle-hwmon-dr.patch deleted file mode 100644 index 345d4ca03b..0000000000 --- a/target/linux/mvebu/patches-5.10/906-Documentation-hwmon-Add-iei-wt61p803-puzzle-hwmon-dr.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 0aff3e5923fecc6842473ad07a688d6e2f2c2d55 Mon Sep 17 00:00:00 2001 -From: Luka Kovacic -Date: Tue, 24 Aug 2021 12:44:37 +0000 -Subject: [PATCH 6/7] Documentation/hwmon: Add iei-wt61p803-puzzle hwmon driver - documentation - -Add the iei-wt61p803-puzzle driver hwmon driver interface documentation. - -Signed-off-by: Luka Kovacic -Signed-off-by: Pavo Banicevic -Cc: Luka Perkov -Cc: Robert Marko ---- - .../hwmon/iei-wt61p803-puzzle-hwmon.rst | 43 +++++++++++++++++++ - Documentation/hwmon/index.rst | 1 + - 2 files changed, 44 insertions(+) - create mode 100644 Documentation/hwmon/iei-wt61p803-puzzle-hwmon.rst - ---- /dev/null -+++ b/Documentation/hwmon/iei-wt61p803-puzzle-hwmon.rst -@@ -0,0 +1,43 @@ -+.. SPDX-License-Identifier: GPL-2.0-only -+ -+Kernel driver iei-wt61p803-puzzle-hwmon -+======================================= -+ -+Supported chips: -+ * IEI WT61P803 PUZZLE for IEI Puzzle M801 -+ -+ Prefix: 'iei-wt61p803-puzzle-hwmon' -+ -+Author: Luka Kovacic -+ -+ -+Description -+----------- -+ -+This driver adds fan and temperature sensor reading for some IEI Puzzle -+series boards. -+ -+Sysfs attributes -+---------------- -+ -+The following attributes are supported: -+ -+- IEI WT61P803 PUZZLE for IEI Puzzle M801 -+ -+/sys files in hwmon subsystem -+----------------------------- -+ -+================= == ===================================================== -+fan[1-5]_input RO files for fan speed (in RPM) -+pwm[1-2] RW files for fan[1-2] target duty cycle (0..255) -+temp[1-2]_input RO files for temperature sensors, in millidegree Celsius -+================= == ===================================================== -+ -+/sys files in thermal subsystem -+------------------------------- -+ -+================= == ===================================================== -+cur_state RW file for current cooling state of the cooling device -+ (0..max_state) -+max_state RO file for maximum cooling state of the cooling device -+================= == ===================================================== ---- a/Documentation/hwmon/index.rst -+++ b/Documentation/hwmon/index.rst -@@ -71,6 +71,7 @@ Hardware Monitoring Kernel Drivers - ibmaem - ibm-cffps - ibmpowernv -+ iei-wt61p803-puzzle-hwmon - ina209 - ina2xx - ina3221 diff --git a/target/linux/mvebu/patches-5.10/907-MAINTAINERS-Add-an-entry-for-the-IEI-WT61P803-PUZZLE.patch b/target/linux/mvebu/patches-5.10/907-MAINTAINERS-Add-an-entry-for-the-IEI-WT61P803-PUZZLE.patch deleted file mode 100644 index 577a9b40de..0000000000 --- a/target/linux/mvebu/patches-5.10/907-MAINTAINERS-Add-an-entry-for-the-IEI-WT61P803-PUZZLE.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 12479baad28d2a08c6cb9e83471057635fa1635c Mon Sep 17 00:00:00 2001 -From: Luka Kovacic -Date: Tue, 24 Aug 2021 12:44:38 +0000 -Subject: [PATCH 7/7] MAINTAINERS: Add an entry for the IEI WT61P803 PUZZLE - driver - -Add an entry for the IEI WT61P803 PUZZLE driver (MFD, HWMON, LED drivers). - -Signed-off-by: Luka Kovacic -Signed-off-by: Pavo Banicevic -Cc: Luka Perkov -Cc: Robert Marko ---- - MAINTAINERS | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -8538,6 +8538,22 @@ F: include/net/nl802154.h - F: net/ieee802154/ - F: net/mac802154/ - -+IEI WT61P803 M801 MFD DRIVER -+M: Luka Kovacic -+M: Luka Perkov -+M: Goran Medic -+L: linux-kernel@vger.kernel.org -+S: Maintained -+F: Documentation/ABI/stable/sysfs-driver-iei-wt61p803-puzzle -+F: Documentation/devicetree/bindings/hwmon/iei,wt61p803-puzzle-hwmon.yaml -+F: Documentation/devicetree/bindings/leds/iei,wt61p803-puzzle-leds.yaml -+F: Documentation/devicetree/bindings/mfd/iei,wt61p803-puzzle.yaml -+F: Documentation/hwmon/iei-wt61p803-puzzle-hwmon.rst -+F: drivers/hwmon/iei-wt61p803-puzzle-hwmon.c -+F: drivers/leds/leds-iei-wt61p803-puzzle.c -+F: drivers/mfd/iei-wt61p803-puzzle.c -+F: include/linux/mfd/iei-wt61p803-puzzle.h -+ - IFE PROTOCOL - M: Yotam Gigi - M: Jamal Hadi Salim diff --git a/target/linux/mvebu/patches-5.15/100-ARM-dts-turris-omnia-configure-LED-0-pin-function-to.patch b/target/linux/mvebu/patches-5.15/100-ARM-dts-turris-omnia-configure-LED-0-pin-function-to.patch new file mode 100644 index 0000000000..67beb06541 --- /dev/null +++ b/target/linux/mvebu/patches-5.15/100-ARM-dts-turris-omnia-configure-LED-0-pin-function-to.patch @@ -0,0 +1,38 @@ +From 81c0004a6433ff90fa6129418802c3c367e453c2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marek=20Beh=C3=BAn?= +Date: Mon, 4 Jul 2022 13:36:21 +0200 +Subject: [PATCH 1/5] ARM: dts: turris-omnia: configure LED[0] pin function to + link/activity +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The marvell PHY driver changes the LED[0] pin function to "On - 1000 +Mbps Link, Off - Else". + +Turris Omnia expects that the function is "On - Link, Blink - Activity, +Off - No link". + +Use the `marvell,reg-init` DT property to change the function. + +In the future, once netdev trigger will support HW offloading, we will +be able to have this configured via the combination of PHY driver and +leds-turris-omnia driver. + +Signed-off-by: Marek Behún +--- + arch/arm/boot/dts/armada-385-turris-omnia.dts | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/arch/arm/boot/dts/armada-385-turris-omnia.dts ++++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts +@@ -396,7 +396,8 @@ + phy1: ethernet-phy@1 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <1>; +- marvell,reg-init = <3 18 0 0x4985>; ++ marvell,reg-init = <3 18 0 0x4985>, ++ <3 16 0xfff0 0x0001>; + + /* irq is connected to &pcawan pin 7 */ + }; diff --git a/target/linux/mvebu/patches-5.15/100-aardvark-workaround-PCIe.patch b/target/linux/mvebu/patches-5.15/100-aardvark-workaround-PCIe.patch new file mode 100644 index 0000000000..975eadb80e --- /dev/null +++ b/target/linux/mvebu/patches-5.15/100-aardvark-workaround-PCIe.patch @@ -0,0 +1,81 @@ +Subject: [PATCH v2] PCI: aardvark: Implement workaround for PCIe Completion Timeout +Date: Tue, 2 Aug 2022 14:38:16 +0200 +Message-Id: <20220802123816.21817-1-pali@kernel.org> +X-Mailer: git-send-email 2.20.1 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Precedence: bulk +List-ID: +X-Mailing-List: linux-pci@vger.kernel.org + +Marvell Armada 3700 Functional Errata, Guidelines, and Restrictions +document describes in erratum 3.12 PCIe Completion Timeout (Ref #: 251), +that PCIe IP does not support a strong-ordered model for inbound posted vs. +outbound completion. + +As a workaround for this erratum, DIS_ORD_CHK flag in Debug Mux Control +register must be set. It disables the ordering check in the core between +Completions and Posted requests received from the link. + +Marvell also suggests to do full memory barrier at the beginning of +aardvark summary interrupt handler before calling interrupt handlers of +endpoint drivers in order to minimize the risk for the race condition +documented in the Erratum between the DMA done status reading and the +completion of writing to the host memory. + +More details about this issue and suggested workarounds are in discussion: +https://lore.kernel.org/linux-pci/BN9PR18MB425154FE5019DCAF2028A1D5DB8D9@BN9PR18MB4251.namprd18.prod.outlook.com/t/#u + +It was reported that enabling this workaround fixes instability issues and +"Unhandled fault" errors when using 60 GHz WiFi 802.11ad card with Qualcomm +QCA6335 chip under significant load which were caused by interrupt status +stuck in the outbound CMPLT queue traced back to this erratum. + +This workaround fixes also kernel panic triggered after some minutes of +usage 5 GHz WiFi 802.11ax card with Mediatek MT7915 chip: + + Internal error: synchronous external abort: 96000210 [#1] SMP + Kernel panic - not syncing: Fatal exception in interrupt + +Signed-off-by: Thomas Petazzoni +Signed-off-by: Pali Rohár +Fixes: 8c39d710363c ("PCI: aardvark: Add Aardvark PCI host controller driver") +Cc: stable@vger.kernel.org +--- + drivers/pci/controller/pci-aardvark.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/pci/controller/pci-aardvark.c ++++ b/drivers/pci/controller/pci-aardvark.c +@@ -210,6 +210,8 @@ enum { + }; + + #define VENDOR_ID_REG (LMI_BASE_ADDR + 0x44) ++#define DEBUG_MUX_CTRL_REG (LMI_BASE_ADDR + 0x208) ++#define DIS_ORD_CHK BIT(30) + + /* PCIe core controller registers */ + #define CTRL_CORE_BASE_ADDR 0x18000 +@@ -558,6 +560,11 @@ static void advk_pcie_setup_hw(struct ad + PCIE_CORE_CTRL2_TD_ENABLE; + advk_writel(pcie, reg, PCIE_CORE_CTRL2_REG); + ++ /* Disable ordering checks, workaround for erratum 3.12 "PCIe completion timeout" */ ++ reg = advk_readl(pcie, DEBUG_MUX_CTRL_REG); ++ reg |= DIS_ORD_CHK; ++ advk_writel(pcie, reg, DEBUG_MUX_CTRL_REG); ++ + /* Set lane X1 */ + reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); + reg &= ~LANE_CNT_MSK; +@@ -1580,6 +1587,9 @@ static irqreturn_t advk_pcie_irq_handler + struct advk_pcie *pcie = arg; + u32 status; + ++ /* Full memory barrier (ARM dsb sy), workaround for erratum 3.12 "PCIe completion timeout" */ ++ mb(); ++ + status = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG); + if (!(status & PCIE_IRQ_CORE_INT)) + return IRQ_NONE; diff --git a/target/linux/mvebu/patches-5.15/101-ARM-dts-turris-omnia-enable-LED-controller-node.patch b/target/linux/mvebu/patches-5.15/101-ARM-dts-turris-omnia-enable-LED-controller-node.patch new file mode 100644 index 0000000000..ecfb43553f --- /dev/null +++ b/target/linux/mvebu/patches-5.15/101-ARM-dts-turris-omnia-enable-LED-controller-node.patch @@ -0,0 +1,48 @@ +From fed7cef5e4f2df8c6a79bebf5da1fdd3783ff6f3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marek=20Beh=C3=BAn?= +Date: Mon, 4 Jul 2022 13:36:22 +0200 +Subject: [PATCH] ARM: dts: turris-omnia: enable LED controller node +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The LED controller node is disabled because the leds-turris-omnia driver +does not support setting the LED blinking to be controlled by the MCU. + +The patches for that have now been sent [1], so let's enable the node. + +[1] https://lore.kernel.org/linux-leds/20220704105955.15474-1-kabel@kernel.org/T/ + +Signed-off-by: Marek Behún +--- + arch/arm/boot/dts/armada-385-turris-omnia.dts | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +--- a/arch/arm/boot/dts/armada-385-turris-omnia.dts ++++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts +@@ -194,15 +194,13 @@ + reg = <0x2b>; + #address-cells = <1>; + #size-cells = <0>; ++ status = "okay"; + + /* + * LEDs are controlled by MCU (STM32F0) at + * address 0x2b. + * +- * The driver does not support HW control mode +- * for the LEDs yet. Disable the LEDs for now. +- * +- * Also LED functions are not stable yet: ++ * LED functions are not stable yet: + * - there are 3 LEDs connected via MCU to PCIe + * ports. One of these ports supports mSATA. + * There is no mSATA nor PCIe function. +@@ -213,7 +211,6 @@ + * B. Again there is no such function defined. + * For now we use LED_FUNCTION_INDICATOR + */ +- status = "disabled"; + + multi-led@0 { + reg = <0x0>; diff --git a/target/linux/mvebu/patches-5.15/102-leds-turris-omnia-support-HW-controlled-mode-via-pri.patch b/target/linux/mvebu/patches-5.15/102-leds-turris-omnia-support-HW-controlled-mode-via-pri.patch new file mode 100644 index 0000000000..c14469460a --- /dev/null +++ b/target/linux/mvebu/patches-5.15/102-leds-turris-omnia-support-HW-controlled-mode-via-pri.patch @@ -0,0 +1,118 @@ +From 80e643510cb14f116f687e992210c0008a09d869 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marek=20Beh=C3=BAn?= +Date: Mon, 4 Jul 2022 12:59:53 +0200 +Subject: [PATCH] leds: turris-omnia: support HW controlled mode via + private trigger +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add support for enabling MCU controlled mode of the Turris Omnia LEDs +via a LED private trigger called "omnia-mcu". + +When in MCU controlled mode, the user can still set LED color, but the +blinking is done by MCU, which does different things for various LEDs: +- WAN LED is blinked according to the LED[0] pin of the WAN PHY +- LAN LEDs are blinked according to the LED[0] output of corresponding + port of the LAN switch +- PCIe LEDs are blinked according to the logical OR of the MiniPCIe port + LED pins + +For a long time I wanted to actually do this differently: I wanted to +make the netdev trigger to transparently offload the blinking to the HW +if user set compatible settings for the netdev trigger. +There was some work on this, and hopefully we will be able to complete +it sometime, but since there are various complications, it will probably +not be soon. + +In the meantime let's support HW controlled mode via this private LED +trigger. If, in the future, we manage to complete the netdev trigger +offloading, we can still keep this private trigger for backwards +compatiblity, if needed. + +We also set "omnia-mcu" to cdev->default_trigger, so that the MCU keeps +control until the user first wants to take over it. If a different +default trigger is specified in device-tree via the +`linux,default-trigger` property, LED class will overwrite +cdev->default_trigger, and so the DT property will be respected. + +Signed-off-by: Marek Behún +--- + drivers/leds/Kconfig | 1 + + drivers/leds/leds-turris-omnia.c | 41 ++++++++++++++++++++++++++++++++ + 2 files changed, 42 insertions(+) + +--- a/drivers/leds/Kconfig ++++ b/drivers/leds/Kconfig +@@ -163,6 +163,7 @@ config LEDS_TURRIS_OMNIA + depends on I2C + depends on MACH_ARMADA_38X || COMPILE_TEST + depends on OF ++ select LEDS_TRIGGERS + help + This option enables basic support for the LEDs found on the front + side of CZ.NIC's Turris Omnia router. There are 12 RGB LEDs on the +--- a/drivers/leds/leds-turris-omnia.c ++++ b/drivers/leds/leds-turris-omnia.c +@@ -41,6 +41,39 @@ struct omnia_leds { + struct omnia_led leds[]; + }; + ++static struct led_hw_trigger_type omnia_hw_trigger_type; ++ ++static int omnia_hwtrig_activate(struct led_classdev *cdev) ++{ ++ struct omnia_leds *leds = dev_get_drvdata(cdev->dev->parent); ++ struct omnia_led *led = to_omnia_led(lcdev_to_mccdev(cdev)); ++ ++ /* put the LED into MCU controlled mode */ ++ return i2c_smbus_write_byte_data(leds->client, CMD_LED_MODE, ++ CMD_LED_MODE_LED(led->reg)); ++} ++ ++static void omnia_hwtrig_deactivate(struct led_classdev *cdev) ++{ ++ struct omnia_leds *leds = dev_get_drvdata(cdev->dev->parent); ++ struct omnia_led *led = to_omnia_led(lcdev_to_mccdev(cdev)); ++ int ret; ++ ++ /* put the LED into software mode */ ++ ret = i2c_smbus_write_byte_data(leds->client, CMD_LED_MODE, ++ CMD_LED_MODE_LED(led->reg) | ++ CMD_LED_MODE_USER); ++ if (ret < 0) ++ dev_err(cdev->dev, "Cannot put to software mode: %i\n", ret); ++} ++ ++static struct led_trigger omnia_hw_trigger = { ++ .name = "omnia-mcu", ++ .activate = omnia_hwtrig_activate, ++ .deactivate = omnia_hwtrig_deactivate, ++ .trigger_type = &omnia_hw_trigger_type, ++}; ++ + static int omnia_led_brightness_set_blocking(struct led_classdev *cdev, + enum led_brightness brightness) + { +@@ -112,6 +145,8 @@ static int omnia_led_register(struct i2c + cdev = &led->mc_cdev.led_cdev; + cdev->max_brightness = 255; + cdev->brightness_set_blocking = omnia_led_brightness_set_blocking; ++ cdev->trigger_type = &omnia_hw_trigger_type; ++ cdev->default_trigger = omnia_hw_trigger.name; + + /* put the LED into software mode */ + ret = i2c_smbus_write_byte_data(client, CMD_LED_MODE, +@@ -228,6 +263,12 @@ static int omnia_leds_probe(struct i2c_c + + mutex_init(&leds->lock); + ++ ret = devm_led_trigger_register(dev, &omnia_hw_trigger); ++ if (ret < 0) { ++ dev_err(dev, "Cannot register private LED trigger: %d\n", ret); ++ return ret; ++ } ++ + led = &leds->leds[0]; + for_each_available_child_of_node(np, child) { + ret = omnia_led_register(client, led, child); diff --git a/target/linux/mvebu/patches-5.15/103-leds-turris-omnia-initialize-multi-intensity-to-full.patch b/target/linux/mvebu/patches-5.15/103-leds-turris-omnia-initialize-multi-intensity-to-full.patch new file mode 100644 index 0000000000..1fe76b8f2c --- /dev/null +++ b/target/linux/mvebu/patches-5.15/103-leds-turris-omnia-initialize-multi-intensity-to-full.patch @@ -0,0 +1,33 @@ +From bda176cceb735b9b46c1900658b6486c34e13ae6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marek=20Beh=C3=BAn?= +Date: Mon, 4 Jul 2022 12:59:54 +0200 +Subject: [PATCH] leds: turris-omnia: initialize multi-intensity to full +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The default color of each LED before driver probe (255, 255, 255). +Initialize multi_intensity to this value, so that it corresponds to the +reality. + +Signed-off-by: Marek Behún +--- + drivers/leds/leds-turris-omnia.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/leds/leds-turris-omnia.c ++++ b/drivers/leds/leds-turris-omnia.c +@@ -131,10 +131,13 @@ static int omnia_led_register(struct i2c + } + + led->subled_info[0].color_index = LED_COLOR_ID_RED; ++ led->subled_info[0].intensity = 255; + led->subled_info[0].channel = 0; + led->subled_info[1].color_index = LED_COLOR_ID_GREEN; ++ led->subled_info[1].intensity = 255; + led->subled_info[1].channel = 1; + led->subled_info[2].color_index = LED_COLOR_ID_BLUE; ++ led->subled_info[2].intensity = 255; + led->subled_info[2].channel = 2; + + led->mc_cdev.subled_info = led->subled_info; diff --git a/target/linux/mvebu/patches-5.15/104-leds-turris-omnia-change-max-brightness-from-255-to-.patch b/target/linux/mvebu/patches-5.15/104-leds-turris-omnia-change-max-brightness-from-255-to-.patch new file mode 100644 index 0000000000..fb8864dfd1 --- /dev/null +++ b/target/linux/mvebu/patches-5.15/104-leds-turris-omnia-change-max-brightness-from-255-to-.patch @@ -0,0 +1,31 @@ +From 349cbe949b9622cc05b148ecfa6268cbbae35b45 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marek=20Beh=C3=BAn?= +Date: Mon, 4 Jul 2022 12:59:55 +0200 +Subject: [PATCH] leds: turris-omnia: change max brightness from 255 to 1 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Using binary brightness makes more sense for this controller, because +internally in the MCU it works that way: the LED has a color, and a +state whether it is ON or OFF. + +The resulting brightness computation with led_mc_calc_color_components() +will now always result in either (0, 0, 0) or the multi_intensity value. + +Signed-off-by: Marek Behún +--- + drivers/leds/leds-turris-omnia.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/leds/leds-turris-omnia.c ++++ b/drivers/leds/leds-turris-omnia.c +@@ -146,7 +146,7 @@ static int omnia_led_register(struct i2c + init_data.fwnode = &np->fwnode; + + cdev = &led->mc_cdev.led_cdev; +- cdev->max_brightness = 255; ++ cdev->max_brightness = 1; + cdev->brightness_set_blocking = omnia_led_brightness_set_blocking; + cdev->trigger_type = &omnia_hw_trigger_type; + cdev->default_trigger = omnia_hw_trigger.name; diff --git a/target/linux/mvebu/patches-5.15/105-power-reset-linkstation-poweroff-add-ls220de.patch b/target/linux/mvebu/patches-5.15/105-power-reset-linkstation-poweroff-add-ls220de.patch new file mode 100644 index 0000000000..3223861234 --- /dev/null +++ b/target/linux/mvebu/patches-5.15/105-power-reset-linkstation-poweroff-add-ls220de.patch @@ -0,0 +1,15 @@ +--- a/drivers/power/reset/linkstation-poweroff.c ++++ b/drivers/power/reset/linkstation-poweroff.c +@@ -142,6 +142,12 @@ static void linkstation_poweroff(void) + } + + static const struct of_device_id ls_poweroff_of_match[] = { ++ { .compatible = "buffalo,ls220d", ++ .data = &linkstation_power_off_cfg, ++ }, ++ { .compatible = "buffalo,ls220de", ++ .data = &linkstation_power_off_cfg, ++ }, + { .compatible = "buffalo,ls421d", + .data = &linkstation_power_off_cfg, + }, diff --git a/target/linux/mvebu/patches-5.15/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch b/target/linux/mvebu/patches-5.15/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch new file mode 100644 index 0000000000..d064b801ec --- /dev/null +++ b/target/linux/mvebu/patches-5.15/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch @@ -0,0 +1,279 @@ +From 71270226b14733a4b1f2cde58ea9265caa50b38d Mon Sep 17 00:00:00 2001 +From: Adrian Panella +Date: Thu, 9 Mar 2017 09:37:17 +0100 +Subject: [PATCH 67/69] generic: Mangle bootloader's kernel arguments + +The command-line arguments provided by the boot loader will be +appended to a new device tree property: bootloader-args. +If there is a property "append-rootblock" in DT under /chosen +and a root= option in bootloaders command line it will be parsed +and added to DT bootargs with the form: XX. +Only command line ATAG will be processed, the rest of the ATAGs +sent by bootloader will be ignored. +This is usefull in dual boot systems, to get the current root partition +without afecting the rest of the system. + +Signed-off-by: Adrian Panella + +This patch has been modified to be mvebu specific. The original patch +did not pass the bootloader cmdline on if no append-rootblock stanza +was found, resulting in blank cmdline and failure to boot. + +Signed-off-by: Michael Gray +--- + arch/arm/Kconfig | 11 ++++ + arch/arm/boot/compressed/atags_to_fdt.c | 85 ++++++++++++++++++++++++- + init/main.c | 16 +++++ + 3 files changed, 111 insertions(+), 1 deletion(-) + +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -1728,6 +1728,17 @@ config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEN + The command-line arguments provided by the boot loader will be + appended to the the device tree bootargs property. + ++config ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE ++ bool "Append rootblock parsing bootloader's kernel arguments" ++ help ++ The command-line arguments provided by the boot loader will be ++ appended to a new device tree property: bootloader-args. ++ If there is a property "append-rootblock" in DT under /chosen ++ and a root= option in bootloaders command line it will be parsed ++ and added to DT bootargs with the form: XX. ++ Only command line ATAG will be processed, the rest of the ATAGs ++ sent by bootloader will be ignored. ++ + endchoice + + config CMDLINE +--- a/arch/arm/boot/compressed/atags_to_fdt.c ++++ b/arch/arm/boot/compressed/atags_to_fdt.c +@@ -5,6 +5,8 @@ + + #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND) + #define do_extend_cmdline 1 ++#elif defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) ++#define do_extend_cmdline 1 + #else + #define do_extend_cmdline 0 + #endif +@@ -20,6 +22,7 @@ static int node_offset(void *fdt, const + return offset; + } + ++#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE + static int setprop(void *fdt, const char *node_path, const char *property, + void *val_array, int size) + { +@@ -28,6 +31,7 @@ static int setprop(void *fdt, const char + return offset; + return fdt_setprop(fdt, offset, property, val_array, size); + } ++#endif + + static int setprop_string(void *fdt, const char *node_path, + const char *property, const char *string) +@@ -38,6 +42,7 @@ static int setprop_string(void *fdt, con + return fdt_setprop_string(fdt, offset, property, string); + } + ++#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE + static int setprop_cell(void *fdt, const char *node_path, + const char *property, uint32_t val) + { +@@ -46,6 +51,7 @@ static int setprop_cell(void *fdt, const + return offset; + return fdt_setprop_cell(fdt, offset, property, val); + } ++#endif + + static const void *getprop(const void *fdt, const char *node_path, + const char *property, int *len) +@@ -58,6 +64,7 @@ static const void *getprop(const void *f + return fdt_getprop(fdt, offset, property, len); + } + ++#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE + static uint32_t get_cell_size(const void *fdt) + { + int len; +@@ -69,6 +76,74 @@ static uint32_t get_cell_size(const void + return cell_size; + } + ++#endif ++ ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) ++ ++static char *append_rootblock(char *dest, const char *str, int len, void *fdt) ++{ ++ const char *ptr, *end; ++ const char *root="root="; ++ int i, l; ++ const char *rootblock; ++ ++ //ARM doesn't have __HAVE_ARCH_STRSTR, so search manually ++ ptr = str - 1; ++ ++ do { ++ //first find an 'r' at the begining or after a space ++ do { ++ ptr++; ++ ptr = strchr(ptr, 'r'); ++ if (!ptr) ++ goto no_append; ++ ++ } while (ptr != str && *(ptr-1) != ' '); ++ ++ //then check for the rest ++ for(i = 1; i <= 4; i++) ++ if(*(ptr+i) != *(root+i)) break; ++ ++ } while (i != 5); ++ ++ end = strchr(ptr, ' '); ++ end = end ? (end - 1) : (strchr(ptr, 0) - 1); ++ ++ //find partition number (assumes format root=/dev/mtdXX | /dev/mtdblockXX | yy:XX ) ++ for( i = 0; end >= ptr && *end >= '0' && *end <= '9'; end--, i++); ++ ptr = end + 1; ++ ++ /* if append-rootblock property is set use it to append to command line */ ++ rootblock = getprop(fdt, "/chosen", "append-rootblock", &l); ++ if (rootblock == NULL) ++ goto no_append; ++ ++ if (*dest != ' ') { ++ *dest = ' '; ++ dest++; ++ len++; ++ } ++ ++ if (len + l + i <= COMMAND_LINE_SIZE) { ++ memcpy(dest, rootblock, l); ++ dest += l - 1; ++ memcpy(dest, ptr, i); ++ dest += i; ++ } ++ ++ return dest; ++ ++no_append: ++ len = strlen(str); ++ if (len + 1 < COMMAND_LINE_SIZE) { ++ memcpy(dest, str, len); ++ dest += len; ++ } ++ ++ return dest; ++} ++#endif ++ + static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) + { + char cmdline[COMMAND_LINE_SIZE]; +@@ -88,18 +163,28 @@ static void merge_fdt_bootargs(void *fdt + + /* and append the ATAG_CMDLINE */ + if (fdt_cmdline) { ++ ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) ++ //save original bootloader args ++ //and append ubi.mtd with root partition number to current cmdline ++ setprop_string(fdt, "/chosen", "bootloader-args", fdt_cmdline); ++ ptr = append_rootblock(ptr, fdt_cmdline, len, fdt); ++ ++#else + len = strlen(fdt_cmdline); + if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) { + *ptr++ = ' '; + memcpy(ptr, fdt_cmdline, len); + ptr += len; + } ++#endif + } + *ptr = '\0'; + + setprop_string(fdt, "/chosen", "bootargs", cmdline); + } + ++#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE + static void hex_str(char *out, uint32_t value) + { + uint32_t digit; +@@ -117,6 +202,7 @@ static void hex_str(char *out, uint32_t + } + *out = '\0'; + } ++#endif + + /* + * Convert and fold provided ATAGs into the provided FDT. +@@ -131,9 +217,11 @@ int atags_to_fdt(void *atag_list, void * + struct tag *atag = atag_list; + /* In the case of 64 bits memory size, need to reserve 2 cells for + * address and size for each bank */ ++#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE + __be32 mem_reg_property[2 * 2 * NR_BANKS]; +- int memcount = 0; +- int ret, memsize; ++ int memsize, memcount = 0; ++#endif ++ int ret; + + /* make sure we've got an aligned pointer */ + if ((u32)atag_list & 0x3) +@@ -168,7 +256,9 @@ int atags_to_fdt(void *atag_list, void * + else + setprop_string(fdt, "/chosen", "bootargs", + atag->u.cmdline.cmdline); +- } else if (atag->hdr.tag == ATAG_MEM) { ++ } ++#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE ++ else if (atag->hdr.tag == ATAG_MEM) { + if (memcount >= sizeof(mem_reg_property)/4) + continue; + if (!atag->u.mem.size) +@@ -212,6 +302,10 @@ int atags_to_fdt(void *atag_list, void * + setprop(fdt, "/memory", "reg", mem_reg_property, + 4 * memcount * memsize); + } ++#else ++ ++ } ++#endif + + return fdt_pack(fdt); + } +--- a/init/main.c ++++ b/init/main.c +@@ -112,6 +112,10 @@ + + #include + ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) ++#include ++#endif ++ + static int kernel_init(void *); + + extern void init_IRQ(void); +@@ -988,6 +992,18 @@ asmlinkage __visible void __init __no_sa + page_alloc_init(); + + pr_notice("Kernel command line: %s\n", saved_command_line); ++ ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) ++ //Show bootloader's original command line for reference ++ if(of_chosen) { ++ const char *prop = of_get_property(of_chosen, "bootloader-args", NULL); ++ if(prop) ++ pr_notice("Bootloader command line (ignored): %s\n", prop); ++ else ++ pr_notice("Bootloader command line not present\n"); ++ } ++#endif ++ + /* parameters may set static keys */ + jump_label_init(); + parse_early_param(); diff --git a/target/linux/mvebu/patches-5.10/301-mvebu-armada-38x-enable-libata-leds.patch b/target/linux/mvebu/patches-5.15/301-mvebu-armada-38x-enable-libata-leds.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/301-mvebu-armada-38x-enable-libata-leds.patch rename to target/linux/mvebu/patches-5.15/301-mvebu-armada-38x-enable-libata-leds.patch diff --git a/target/linux/mvebu/patches-5.15/302-add_powertables.patch b/target/linux/mvebu/patches-5.15/302-add_powertables.patch new file mode 100644 index 0000000000..93ad5de2cc --- /dev/null +++ b/target/linux/mvebu/patches-5.15/302-add_powertables.patch @@ -0,0 +1,770 @@ +--- a/arch/arm/boot/dts/armada-385-linksys.dtsi ++++ b/arch/arm/boot/dts/armada-385-linksys.dtsi +@@ -214,11 +214,19 @@ + &pcie1 { + /* Marvell 88W8864, 5GHz-only */ + status = "okay"; ++ ++ mwlwifi { ++ marvell,2ghz = <0>; ++ }; + }; + + &pcie2 { + /* Marvell 88W8864, 2GHz-only */ + status = "okay"; ++ ++ mwlwifi { ++ marvell,5ghz = <0>; ++ }; + }; + + &pinctrl { +--- a/arch/arm/boot/dts/armada-385-linksys-caiman.dts ++++ b/arch/arm/boot/dts/armada-385-linksys-caiman.dts +@@ -142,3 +142,205 @@ + }; + }; + }; ++ ++&pcie1 { ++ mwlwifi { ++ marvell,chainmask = <2 2>; ++ marvell,powertable { ++ AU = ++ <36 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <40 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <44 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <48 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <52 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <56 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <60 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <64 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <100 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, ++ <104 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, ++ <108 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, ++ <112 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, ++ <116 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, ++ <120 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, ++ <124 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, ++ <128 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, ++ <132 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, ++ <136 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, ++ <140 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>, ++ <149 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>, ++ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>, ++ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>, ++ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>, ++ <165 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>; ++ CA = ++ <36 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>, ++ <40 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>, ++ <44 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>, ++ <48 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>, ++ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <149 0 0x1a 0x1a 0x18 0x17 0x19 0x19 0x17 0x15 0x18 0x18 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, ++ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, ++ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, ++ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, ++ <165 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>; ++ CN = ++ <36 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <40 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <44 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <48 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <52 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <56 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <60 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <64 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <100 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <104 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <108 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <112 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <116 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <120 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <124 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <128 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <132 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <136 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <140 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <149 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x11 0x11 0x11 0x11 0 0xf>, ++ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>, ++ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>, ++ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>, ++ <165 0 0x15 0x15 0x15 0x15 0x16 0x16 0x16 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>; ++ ETSI = ++ <36 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <40 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <44 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <48 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <52 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <56 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <60 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <64 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <100 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <104 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <108 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <112 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <116 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <120 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <124 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <128 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <132 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <136 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <140 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>, ++ <149 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>; ++ FCC = ++ <36 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <40 0 0x19 0x19 0x18 0x17 0x19 0x19 0x17 0x15 0x17 0x17 0x17 0x14 0x10 0x10 0x10 0x10 0 0xf>, ++ <44 0 0x19 0x19 0x18 0x17 0x19 0x19 0x17 0x15 0x17 0x17 0x17 0x14 0x10 0x10 0x10 0x10 0 0xf>, ++ <48 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x17 0x17 0x17 0x14 0x10 0x10 0x10 0x10 0 0xf>, ++ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <149 0 0x1a 0x1a 0x18 0x17 0x19 0x19 0x17 0x15 0x18 0x18 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, ++ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, ++ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, ++ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>, ++ <165 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>; ++ }; ++ }; ++}; ++ ++&pcie2 { ++ mwlwifi { ++ marvell,chainmask = <2 2>; ++ marvell,powertable { ++ AU = ++ <1 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>; ++ CA = ++ <1 0 0x19 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x10 0x10 0x10 0x10 0x00 0x00 0x00 0x00 0 0xf>, ++ <2 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, ++ <3 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, ++ <4 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, ++ <5 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, ++ <6 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, ++ <7 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, ++ <8 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, ++ <9 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, ++ <10 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>, ++ <11 0 0x19 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x00 0x00 0x00 0x00 0 0xf>; ++ CN = ++ <1 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <12 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <13 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <14 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>; ++ ETSI = ++ <1 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <12 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>, ++ <13 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>; ++ FCC = ++ <1 0 0x19 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0x19 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x0 0x0 0x0 0x0 0 0xf>; ++ }; ++ }; ++}; +--- a/arch/arm/boot/dts/armada-385-linksys-cobra.dts ++++ b/arch/arm/boot/dts/armada-385-linksys-cobra.dts +@@ -142,3 +142,205 @@ + }; + }; + }; ++ ++&pcie1 { ++ mwlwifi { ++ marvell,chainmask = <4 4>; ++ marvell,powertable { ++ AU = ++ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <100 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <104 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <108 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <112 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <116 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <120 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <124 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <128 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <132 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <136 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <140 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <149 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, ++ <153 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, ++ <157 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, ++ <161 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, ++ <165 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>; ++ CA = ++ <36 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <40 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <44 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <48 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>; ++ CN = ++ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <149 0 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, ++ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, ++ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, ++ <165 0 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>; ++ ETSI = ++ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <149 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>; ++ FCC = ++ <36 0 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0 0xf>, ++ <40 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, ++ <44 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, ++ <48 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, ++ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>; ++ }; ++ }; ++}; ++ ++&pcie2 { ++ mwlwifi { ++ marvell,chainmask = <4 4>; ++ marvell,powertable { ++ AU = ++ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; ++ CA = ++ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>; ++ CN = ++ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <14 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; ++ ETSI = ++ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; ++ FCC = ++ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>; ++ }; ++ }; ++}; +--- a/arch/arm/boot/dts/armada-385-linksys-shelby.dts ++++ b/arch/arm/boot/dts/armada-385-linksys-shelby.dts +@@ -142,3 +142,205 @@ + }; + }; + }; ++ ++&pcie1 { ++ mwlwifi { ++ marvell,chainmask = <4 4>; ++ marvell,powertable { ++ AU = ++ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <100 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <104 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <108 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <112 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <116 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <120 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <124 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <128 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <132 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <136 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <140 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <149 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, ++ <153 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, ++ <157 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, ++ <161 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>, ++ <165 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>; ++ CA = ++ <36 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <40 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <44 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <48 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>; ++ CN = ++ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <149 0 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, ++ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, ++ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>, ++ <165 0 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>; ++ ETSI = ++ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>, ++ <149 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>; ++ FCC = ++ <36 0 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0 0xf>, ++ <40 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, ++ <44 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, ++ <48 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>, ++ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>, ++ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>, ++ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>, ++ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>; ++ }; ++ }; ++}; ++ ++&pcie2 { ++ mwlwifi { ++ marvell,chainmask = <4 4>; ++ marvell,powertable { ++ AU = ++ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; ++ CA = ++ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>; ++ CN = ++ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <14 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; ++ ETSI = ++ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>, ++ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>; ++ FCC = ++ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>; ++ }; ++ }; ++}; +--- a/arch/arm/boot/dts/armada-385-linksys-rango.dts ++++ b/arch/arm/boot/dts/armada-385-linksys-rango.dts +@@ -157,6 +157,18 @@ + }; + }; + ++&pcie1 { ++ mwlwifi { ++ marvell,chainmask = <4 4>; ++ }; ++}; ++ ++&pcie2 { ++ mwlwifi { ++ marvell,chainmask = <4 4>; ++ }; ++}; ++ + &sdhci { + pinctrl-names = "default"; + pinctrl-0 = <&sdhci_pins>; +--- a/arch/arm/boot/dts/armada-xp-linksys-mamba.dts ++++ b/arch/arm/boot/dts/armada-xp-linksys-mamba.dts +@@ -225,12 +225,100 @@ + pcie@2,0 { + /* Port 0, Lane 1 */ + status = "okay"; ++ ++ mwlwifi { ++ marvell,5ghz = <0>; ++ marvell,chainmask = <4 4>; ++ marvell,powertable { ++ FCC = ++ <1 0 0x17 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0x17 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>; ++ ++ ETSI = ++ <1 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <2 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <3 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <4 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <5 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <6 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <7 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <8 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <9 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <10 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <11 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <12 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>, ++ <13 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>; ++ }; ++ }; + }; + + /* Second mini-PCIe port */ + pcie@3,0 { + /* Port 0, Lane 3 */ + status = "okay"; ++ ++ mwlwifi { ++ marvell,2ghz = <0>; ++ marvell,chainmask = <4 4>; ++ marvell,powertable { ++ FCC = ++ <36 0 0x8 0x8 0x8 0x8 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <40 0 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <44 0 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <48 0 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>, ++ <52 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>, ++ <56 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>, ++ <60 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>, ++ <64 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>, ++ <100 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <104 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <108 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <112 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <116 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <120 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <124 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <128 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <132 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <136 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <140 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>, ++ <149 0 0x16 0x16 0x16 0x16 0x14 0x14 0x14 0x14 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>, ++ <153 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>, ++ <157 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>, ++ <161 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>, ++ <165 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>; ++ ++ ETSI = ++ <36 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <40 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <44 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <48 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <52 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <56 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <60 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <64 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <100 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <104 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <108 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <112 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <116 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <120 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <124 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <128 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <132 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <136 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <140 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>, ++ <149 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>; ++ }; ++ }; + }; + }; + diff --git a/target/linux/mvebu/patches-5.10/304-revert_i2c_delay.patch b/target/linux/mvebu/patches-5.15/304-revert_i2c_delay.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/304-revert_i2c_delay.patch rename to target/linux/mvebu/patches-5.15/304-revert_i2c_delay.patch diff --git a/target/linux/mvebu/patches-5.10/305-armada-385-rd-mtd-partitions.patch b/target/linux/mvebu/patches-5.15/305-armada-385-rd-mtd-partitions.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/305-armada-385-rd-mtd-partitions.patch rename to target/linux/mvebu/patches-5.15/305-armada-385-rd-mtd-partitions.patch diff --git a/target/linux/mvebu/patches-5.10/306-ARM-mvebu-385-ap-Add-partitions.patch b/target/linux/mvebu/patches-5.15/306-ARM-mvebu-385-ap-Add-partitions.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/306-ARM-mvebu-385-ap-Add-partitions.patch rename to target/linux/mvebu/patches-5.15/306-ARM-mvebu-385-ap-Add-partitions.patch diff --git a/target/linux/mvebu/patches-5.10/307-armada-xp-linksys-mamba-broken-idle.patch b/target/linux/mvebu/patches-5.15/307-armada-xp-linksys-mamba-broken-idle.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/307-armada-xp-linksys-mamba-broken-idle.patch rename to target/linux/mvebu/patches-5.15/307-armada-xp-linksys-mamba-broken-idle.patch diff --git a/target/linux/mvebu/patches-5.10/308-armada-xp-linksys-mamba-wan.patch b/target/linux/mvebu/patches-5.15/308-armada-xp-linksys-mamba-wan.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/308-armada-xp-linksys-mamba-wan.patch rename to target/linux/mvebu/patches-5.15/308-armada-xp-linksys-mamba-wan.patch diff --git a/target/linux/mvebu/patches-5.10/309-linksys-status-led.patch b/target/linux/mvebu/patches-5.15/309-linksys-status-led.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/309-linksys-status-led.patch rename to target/linux/mvebu/patches-5.15/309-linksys-status-led.patch diff --git a/target/linux/mvebu/patches-5.10/310-linksys-use-eth0-as-cpu-port.patch b/target/linux/mvebu/patches-5.15/310-linksys-use-eth0-as-cpu-port.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/310-linksys-use-eth0-as-cpu-port.patch rename to target/linux/mvebu/patches-5.15/310-linksys-use-eth0-as-cpu-port.patch diff --git a/target/linux/mvebu/patches-5.10/311-adjust-compatible-for-linksys.patch b/target/linux/mvebu/patches-5.15/311-adjust-compatible-for-linksys.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/311-adjust-compatible-for-linksys.patch rename to target/linux/mvebu/patches-5.15/311-adjust-compatible-for-linksys.patch diff --git a/target/linux/mvebu/patches-5.10/312-ARM-dts-armada388-clearfog-emmc-on-clearfog-base.patch b/target/linux/mvebu/patches-5.15/312-ARM-dts-armada388-clearfog-emmc-on-clearfog-base.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/312-ARM-dts-armada388-clearfog-emmc-on-clearfog-base.patch rename to target/linux/mvebu/patches-5.15/312-ARM-dts-armada388-clearfog-emmc-on-clearfog-base.patch diff --git a/target/linux/mvebu/patches-5.10/313-helios4-dts-status-led-alias.patch b/target/linux/mvebu/patches-5.15/313-helios4-dts-status-led-alias.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/313-helios4-dts-status-led-alias.patch rename to target/linux/mvebu/patches-5.15/313-helios4-dts-status-led-alias.patch diff --git a/target/linux/mvebu/patches-5.15/314-arm64-dts-marvell-enable-heartbeat-LED-by-default.patch b/target/linux/mvebu/patches-5.15/314-arm64-dts-marvell-enable-heartbeat-LED-by-default.patch new file mode 100644 index 0000000000..7221e04de1 --- /dev/null +++ b/target/linux/mvebu/patches-5.15/314-arm64-dts-marvell-enable-heartbeat-LED-by-default.patch @@ -0,0 +1,22 @@ +From: Tomasz Maciej Nowak +Date: Fri, 7 Jul 2023 19:06:05 +0200 +Subject: [PATCH] arm64: dts: marvell: enable heartbeat LED by default + +Some boards could be placed in an enclosure, so enable LED18 by default, +since that'll be the only visible indicator that the board is operating. + +Signed-off-by: Tomasz Maciej Nowak +--- + arch/arm64/boot/dts/marvell/armada-8040-mcbin-singleshot.dts | 1 + + 1 file changed, 1 insertion(+) + +--- a/arch/arm64/boot/dts/marvell/armada-8040-mcbin-singleshot.dts ++++ b/arch/arm64/boot/dts/marvell/armada-8040-mcbin-singleshot.dts +@@ -25,6 +25,7 @@ + function = LED_FUNCTION_HEARTBEAT; + color = ; + linux,default-trigger = "heartbeat"; ++ default-state = "on"; + }; + }; + }; diff --git a/target/linux/mvebu/patches-5.10/315-armada-xp-linksys-mamba-resize-kernel.patch b/target/linux/mvebu/patches-5.15/315-armada-xp-linksys-mamba-resize-kernel.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/315-armada-xp-linksys-mamba-resize-kernel.patch rename to target/linux/mvebu/patches-5.15/315-armada-xp-linksys-mamba-resize-kernel.patch diff --git a/target/linux/mvebu/patches-5.10/316-armada-370-dts-fix-crypto-engine.patch b/target/linux/mvebu/patches-5.15/316-armada-370-dts-fix-crypto-engine.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/316-armada-370-dts-fix-crypto-engine.patch rename to target/linux/mvebu/patches-5.15/316-armada-370-dts-fix-crypto-engine.patch diff --git a/target/linux/mvebu/patches-5.10/400-find_active_root.patch b/target/linux/mvebu/patches-5.15/400-find_active_root.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/400-find_active_root.patch rename to target/linux/mvebu/patches-5.15/400-find_active_root.patch diff --git a/target/linux/mvebu/patches-5.15/700-mvneta-tx-queue-workaround.patch b/target/linux/mvebu/patches-5.15/700-mvneta-tx-queue-workaround.patch new file mode 100644 index 0000000000..32e8ef4b7d --- /dev/null +++ b/target/linux/mvebu/patches-5.15/700-mvneta-tx-queue-workaround.patch @@ -0,0 +1,38 @@ +The hardware queue scheduling is apparently configured with fixed +priorities, which creates a nasty fairness issue where traffic from one +CPU can starve traffic from all other CPUs. + +Work around this issue by forcing all tx packets to go through one CPU, +until this issue is fixed properly. + +Signed-off-by: Felix Fietkau +--- +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -5006,6 +5006,16 @@ static int mvneta_setup_tc(struct net_de + } + } + ++#ifndef CONFIG_ARM64 ++static u16 mvneta_select_queue(struct net_device *dev, struct sk_buff *skb, ++ struct net_device *sb_dev) ++{ ++ /* XXX: hardware queue scheduling is broken, ++ * use only one queue until it is fixed */ ++ return 0; ++} ++#endif ++ + static const struct net_device_ops mvneta_netdev_ops = { + .ndo_open = mvneta_open, + .ndo_stop = mvneta_stop, +@@ -5016,6 +5026,9 @@ static const struct net_device_ops mvnet + .ndo_fix_features = mvneta_fix_features, + .ndo_get_stats64 = mvneta_get_stats64, + .ndo_eth_ioctl = mvneta_ioctl, ++#ifndef CONFIG_ARM64 ++ .ndo_select_queue = mvneta_select_queue, ++#endif + .ndo_bpf = mvneta_xdp, + .ndo_xdp_xmit = mvneta_xdp_xmit, + .ndo_setup_tc = mvneta_setup_tc, diff --git a/target/linux/mvebu/patches-5.15/702-net-next-ethernet-marvell-mvnetaMQPrioOffload.patch b/target/linux/mvebu/patches-5.15/702-net-next-ethernet-marvell-mvnetaMQPrioOffload.patch new file mode 100644 index 0000000000..019b9528c3 --- /dev/null +++ b/target/linux/mvebu/patches-5.15/702-net-next-ethernet-marvell-mvnetaMQPrioOffload.patch @@ -0,0 +1,66 @@ +From 75fa71e3acadbb4ab5eda18505277eb9a1f69b23 Mon Sep 17 00:00:00 2001 +From: Maxime Chevallier +Date: Fri, 26 Nov 2021 12:20:53 +0100 +Subject: net: mvneta: Use struct tc_mqprio_qopt_offload for MQPrio + configuration + +The struct tc_mqprio_qopt_offload is a container for struct tc_mqprio_qopt, +that allows passing extra parameters, such as traffic shaping. This commit +converts the current mqprio code to that new struct. + +Signed-off-by: Maxime Chevallier +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/marvell/mvneta.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +(limited to 'drivers/net/ethernet/marvell/mvneta.c') + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include + #include + + /* Registers */ +@@ -4966,14 +4967,14 @@ static void mvneta_setup_rx_prio_map(str + } + + static int mvneta_setup_mqprio(struct net_device *dev, +- struct tc_mqprio_qopt *qopt) ++ struct tc_mqprio_qopt_offload *mqprio) + { + struct mvneta_port *pp = netdev_priv(dev); + u8 num_tc; + int i; + +- qopt->hw = TC_MQPRIO_HW_OFFLOAD_TCS; +- num_tc = qopt->num_tc; ++ mqprio->qopt.hw = TC_MQPRIO_HW_OFFLOAD_TCS; ++ num_tc = mqprio->qopt.num_tc; + + if (num_tc > rxq_number) + return -EINVAL; +@@ -4984,13 +4985,15 @@ static int mvneta_setup_mqprio(struct ne + return 0; + } + +- memcpy(pp->prio_tc_map, qopt->prio_tc_map, sizeof(pp->prio_tc_map)); ++ memcpy(pp->prio_tc_map, mqprio->qopt.prio_tc_map, ++ sizeof(pp->prio_tc_map)); + + mvneta_setup_rx_prio_map(pp); + +- netdev_set_num_tc(dev, qopt->num_tc); +- for (i = 0; i < qopt->num_tc; i++) +- netdev_set_tc_queue(dev, i, qopt->count[i], qopt->offset[i]); ++ netdev_set_num_tc(dev, mqprio->qopt.num_tc); ++ for (i = 0; i < mqprio->qopt.num_tc; i++) ++ netdev_set_tc_queue(dev, i, mqprio->qopt.count[i], ++ mqprio->qopt.offset[i]); + + return 0; + } diff --git a/target/linux/mvebu/patches-5.15/703-net-next-ethernet-marvell-mvnetaMQPrioFlag.patch b/target/linux/mvebu/patches-5.15/703-net-next-ethernet-marvell-mvnetaMQPrioFlag.patch new file mode 100644 index 0000000000..c878a28843 --- /dev/null +++ b/target/linux/mvebu/patches-5.15/703-net-next-ethernet-marvell-mvnetaMQPrioFlag.patch @@ -0,0 +1,30 @@ +From e7ca75fe6662f78bfeb0112671c812e4c7b8e214 Mon Sep 17 00:00:00 2001 +From: Maxime Chevallier +Date: Fri, 26 Nov 2021 12:20:54 +0100 +Subject: net: mvneta: Don't force-set the offloading flag + +The qopt->hw flag is set by the TC code according to the offloading mode +asked by user. Don't force-set it in the driver, but instead read it to +make sure we do what's asked. + +Signed-off-by: Maxime Chevallier +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/marvell/mvneta.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +(limited to 'drivers/net/ethernet/marvell/mvneta.c') + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -4973,7 +4973,9 @@ static int mvneta_setup_mqprio(struct ne + u8 num_tc; + int i; + +- mqprio->qopt.hw = TC_MQPRIO_HW_OFFLOAD_TCS; ++ if (mqprio->qopt.hw != TC_MQPRIO_HW_OFFLOAD_TCS) ++ return 0; ++ + num_tc = mqprio->qopt.num_tc; + + if (num_tc > rxq_number) diff --git a/target/linux/mvebu/patches-5.15/704-net-next-ethernet-marvell-mvnetaMQPrioQueue.patch b/target/linux/mvebu/patches-5.15/704-net-next-ethernet-marvell-mvnetaMQPrioQueue.patch new file mode 100644 index 0000000000..546a8486ef --- /dev/null +++ b/target/linux/mvebu/patches-5.15/704-net-next-ethernet-marvell-mvnetaMQPrioQueue.patch @@ -0,0 +1,97 @@ +From e9f7099d0730341b24c057acbf545dd019581db6 Mon Sep 17 00:00:00 2001 +From: Maxime Chevallier +Date: Fri, 26 Nov 2021 12:20:55 +0100 +Subject: net: mvneta: Allow having more than one queue per TC + +The current mqprio implementation assumed that we are only using one +queue per TC. Use the offset and count parameters to allow using +multiple queues per TC. In that case, the controller will use a standard +round-robin algorithm to pick queues assigned to the same TC, with the +same priority. + +This only applies to VLAN priorities in ingress traffic, each TC +corresponding to a vlan priority. + +Signed-off-by: Maxime Chevallier +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/marvell/mvneta.c | 35 ++++++++++++++++++++--------------- + 1 file changed, 20 insertions(+), 15 deletions(-) + +(limited to 'drivers/net/ethernet/marvell/mvneta.c') + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -498,7 +498,6 @@ struct mvneta_port { + u8 mcast_count[256]; + u16 tx_ring_size; + u16 rx_ring_size; +- u8 prio_tc_map[8]; + + phy_interface_t phy_interface; + struct device_node *dn; +@@ -4955,13 +4954,12 @@ static void mvneta_clear_rx_prio_map(str + mvreg_write(pp, MVNETA_VLAN_PRIO_TO_RXQ, 0); + } + +-static void mvneta_setup_rx_prio_map(struct mvneta_port *pp) ++static void mvneta_map_vlan_prio_to_rxq(struct mvneta_port *pp, u8 pri, u8 rxq) + { +- u32 val = 0; +- int i; ++ u32 val = mvreg_read(pp, MVNETA_VLAN_PRIO_TO_RXQ); + +- for (i = 0; i < rxq_number; i++) +- val |= MVNETA_VLAN_PRIO_RXQ_MAP(i, pp->prio_tc_map[i]); ++ val &= ~MVNETA_VLAN_PRIO_RXQ_MAP(pri, 0x7); ++ val |= MVNETA_VLAN_PRIO_RXQ_MAP(pri, rxq); + + mvreg_write(pp, MVNETA_VLAN_PRIO_TO_RXQ, val); + } +@@ -4970,8 +4968,8 @@ static int mvneta_setup_mqprio(struct ne + struct tc_mqprio_qopt_offload *mqprio) + { + struct mvneta_port *pp = netdev_priv(dev); ++ int rxq, tc; + u8 num_tc; +- int i; + + if (mqprio->qopt.hw != TC_MQPRIO_HW_OFFLOAD_TCS) + return 0; +@@ -4981,21 +4979,28 @@ static int mvneta_setup_mqprio(struct ne + if (num_tc > rxq_number) + return -EINVAL; + ++ mvneta_clear_rx_prio_map(pp); ++ + if (!num_tc) { +- mvneta_clear_rx_prio_map(pp); + netdev_reset_tc(dev); + return 0; + } + +- memcpy(pp->prio_tc_map, mqprio->qopt.prio_tc_map, +- sizeof(pp->prio_tc_map)); ++ netdev_set_num_tc(dev, mqprio->qopt.num_tc); + +- mvneta_setup_rx_prio_map(pp); ++ for (tc = 0; tc < mqprio->qopt.num_tc; tc++) { ++ netdev_set_tc_queue(dev, tc, mqprio->qopt.count[tc], ++ mqprio->qopt.offset[tc]); ++ ++ for (rxq = mqprio->qopt.offset[tc]; ++ rxq < mqprio->qopt.count[tc] + mqprio->qopt.offset[tc]; ++ rxq++) { ++ if (rxq >= rxq_number) ++ return -EINVAL; + +- netdev_set_num_tc(dev, mqprio->qopt.num_tc); +- for (i = 0; i < mqprio->qopt.num_tc; i++) +- netdev_set_tc_queue(dev, i, mqprio->qopt.count[i], +- mqprio->qopt.offset[i]); ++ mvneta_map_vlan_prio_to_rxq(pp, tc, rxq); ++ } ++ } + + return 0; + } diff --git a/target/linux/mvebu/patches-5.15/705-net-next-ethernet-marvell-mvnetaMQPrioTCOffload.patch b/target/linux/mvebu/patches-5.15/705-net-next-ethernet-marvell-mvnetaMQPrioTCOffload.patch new file mode 100644 index 0000000000..1d4a055a71 --- /dev/null +++ b/target/linux/mvebu/patches-5.15/705-net-next-ethernet-marvell-mvnetaMQPrioTCOffload.patch @@ -0,0 +1,182 @@ +From 2551dc9e398c37a15e52122d385c29a8b06be45f Mon Sep 17 00:00:00 2001 +From: Maxime Chevallier +Date: Fri, 26 Nov 2021 12:20:56 +0100 +Subject: net: mvneta: Add TC traffic shaping offload + +The mvneta controller is able to do some tocken-bucket per-queue traffic +shaping. This commit adds support for setting these using the TC mqprio +interface. + +The token-bucket parameters are customisable, but the current +implementation configures them to have a 10kbps resolution for the +rate limitation, since it allows to cover the whole range of max_rate +values from 10kbps to 5Gbps with 10kbps increments. + +Signed-off-by: Maxime Chevallier +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/marvell/mvneta.c | 120 +++++++++++++++++++++++++++++++++- + 1 file changed, 119 insertions(+), 1 deletion(-) + +(limited to 'drivers/net/ethernet/marvell/mvneta.c') + +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -248,12 +248,39 @@ + #define MVNETA_TXQ_SENT_DESC_MASK 0x3fff0000 + #define MVNETA_PORT_TX_RESET 0x3cf0 + #define MVNETA_PORT_TX_DMA_RESET BIT(0) ++#define MVNETA_TXQ_CMD1_REG 0x3e00 ++#define MVNETA_TXQ_CMD1_BW_LIM_SEL_V1 BIT(3) ++#define MVNETA_TXQ_CMD1_BW_LIM_EN BIT(0) ++#define MVNETA_REFILL_NUM_CLK_REG 0x3e08 ++#define MVNETA_REFILL_MAX_NUM_CLK 0x0000ffff + #define MVNETA_TX_MTU 0x3e0c + #define MVNETA_TX_TOKEN_SIZE 0x3e14 + #define MVNETA_TX_TOKEN_SIZE_MAX 0xffffffff ++#define MVNETA_TXQ_BUCKET_REFILL_REG(q) (0x3e20 + ((q) << 2)) ++#define MVNETA_TXQ_BUCKET_REFILL_PERIOD_MASK 0x3ff00000 ++#define MVNETA_TXQ_BUCKET_REFILL_PERIOD_SHIFT 20 ++#define MVNETA_TXQ_BUCKET_REFILL_VALUE_MAX 0x0007ffff + #define MVNETA_TXQ_TOKEN_SIZE_REG(q) (0x3e40 + ((q) << 2)) + #define MVNETA_TXQ_TOKEN_SIZE_MAX 0x7fffffff + ++/* The values of the bucket refill base period and refill period are taken from ++ * the reference manual, and adds up to a base resolution of 10Kbps. This allows ++ * to cover all rate-limit values from 10Kbps up to 5Gbps ++ */ ++ ++/* Base period for the rate limit algorithm */ ++#define MVNETA_TXQ_BUCKET_REFILL_BASE_PERIOD_NS 100 ++ ++/* Number of Base Period to wait between each bucket refill */ ++#define MVNETA_TXQ_BUCKET_REFILL_PERIOD 1000 ++ ++/* The base resolution for rate limiting, in bps. Any max_rate value should be ++ * a multiple of that value. ++ */ ++#define MVNETA_TXQ_RATE_LIMIT_RESOLUTION (NSEC_PER_SEC / \ ++ (MVNETA_TXQ_BUCKET_REFILL_BASE_PERIOD_NS * \ ++ MVNETA_TXQ_BUCKET_REFILL_PERIOD)) ++ + #define MVNETA_LPI_CTRL_0 0x2cc0 + #define MVNETA_LPI_CTRL_1 0x2cc4 + #define MVNETA_LPI_REQUEST_ENABLE BIT(0) +@@ -4964,11 +4991,74 @@ static void mvneta_map_vlan_prio_to_rxq( + mvreg_write(pp, MVNETA_VLAN_PRIO_TO_RXQ, val); + } + ++static int mvneta_enable_per_queue_rate_limit(struct mvneta_port *pp) ++{ ++ unsigned long core_clk_rate; ++ u32 refill_cycles; ++ u32 val; ++ ++ core_clk_rate = clk_get_rate(pp->clk); ++ if (!core_clk_rate) ++ return -EINVAL; ++ ++ refill_cycles = MVNETA_TXQ_BUCKET_REFILL_BASE_PERIOD_NS / ++ (NSEC_PER_SEC / core_clk_rate); ++ ++ if (refill_cycles > MVNETA_REFILL_MAX_NUM_CLK) ++ return -EINVAL; ++ ++ /* Enable bw limit algorithm version 3 */ ++ val = mvreg_read(pp, MVNETA_TXQ_CMD1_REG); ++ val &= ~(MVNETA_TXQ_CMD1_BW_LIM_SEL_V1 | MVNETA_TXQ_CMD1_BW_LIM_EN); ++ mvreg_write(pp, MVNETA_TXQ_CMD1_REG, val); ++ ++ /* Set the base refill rate */ ++ mvreg_write(pp, MVNETA_REFILL_NUM_CLK_REG, refill_cycles); ++ ++ return 0; ++} ++ ++static void mvneta_disable_per_queue_rate_limit(struct mvneta_port *pp) ++{ ++ u32 val = mvreg_read(pp, MVNETA_TXQ_CMD1_REG); ++ ++ val |= (MVNETA_TXQ_CMD1_BW_LIM_SEL_V1 | MVNETA_TXQ_CMD1_BW_LIM_EN); ++ mvreg_write(pp, MVNETA_TXQ_CMD1_REG, val); ++} ++ ++static int mvneta_setup_queue_rates(struct mvneta_port *pp, int queue, ++ u64 min_rate, u64 max_rate) ++{ ++ u32 refill_val, rem; ++ u32 val = 0; ++ ++ /* Convert to from Bps to bps */ ++ max_rate *= 8; ++ ++ if (min_rate) ++ return -EINVAL; ++ ++ refill_val = div_u64_rem(max_rate, MVNETA_TXQ_RATE_LIMIT_RESOLUTION, ++ &rem); ++ ++ if (rem || !refill_val || ++ refill_val > MVNETA_TXQ_BUCKET_REFILL_VALUE_MAX) ++ return -EINVAL; ++ ++ val = refill_val; ++ val |= (MVNETA_TXQ_BUCKET_REFILL_PERIOD << ++ MVNETA_TXQ_BUCKET_REFILL_PERIOD_SHIFT); ++ ++ mvreg_write(pp, MVNETA_TXQ_BUCKET_REFILL_REG(queue), val); ++ ++ return 0; ++} ++ + static int mvneta_setup_mqprio(struct net_device *dev, + struct tc_mqprio_qopt_offload *mqprio) + { + struct mvneta_port *pp = netdev_priv(dev); +- int rxq, tc; ++ int rxq, txq, tc, ret; + u8 num_tc; + + if (mqprio->qopt.hw != TC_MQPRIO_HW_OFFLOAD_TCS) +@@ -4982,6 +5072,7 @@ static int mvneta_setup_mqprio(struct ne + mvneta_clear_rx_prio_map(pp); + + if (!num_tc) { ++ mvneta_disable_per_queue_rate_limit(pp); + netdev_reset_tc(dev); + return 0; + } +@@ -5002,6 +5093,33 @@ static int mvneta_setup_mqprio(struct ne + } + } + ++ if (mqprio->shaper != TC_MQPRIO_SHAPER_BW_RATE) { ++ mvneta_disable_per_queue_rate_limit(pp); ++ return 0; ++ } ++ ++ if (mqprio->qopt.num_tc > txq_number) ++ return -EINVAL; ++ ++ ret = mvneta_enable_per_queue_rate_limit(pp); ++ if (ret) ++ return ret; ++ ++ for (tc = 0; tc < mqprio->qopt.num_tc; tc++) { ++ for (txq = mqprio->qopt.offset[tc]; ++ txq < mqprio->qopt.count[tc] + mqprio->qopt.offset[tc]; ++ txq++) { ++ if (txq >= txq_number) ++ return -EINVAL; ++ ++ ret = mvneta_setup_queue_rates(pp, txq, ++ mqprio->min_rate[tc], ++ mqprio->max_rate[tc]); ++ if (ret) ++ return ret; ++ } ++ } ++ + return 0; + } + diff --git a/target/linux/mvebu/patches-5.15/710-v6.2-phy-marvell-phy-mvebu-a3700-comphy-Reset-COMPHY-regi.patch b/target/linux/mvebu/patches-5.15/710-v6.2-phy-marvell-phy-mvebu-a3700-comphy-Reset-COMPHY-regi.patch new file mode 100644 index 0000000000..a852dc1fc1 --- /dev/null +++ b/target/linux/mvebu/patches-5.15/710-v6.2-phy-marvell-phy-mvebu-a3700-comphy-Reset-COMPHY-regi.patch @@ -0,0 +1,50 @@ +From b01d622d76134e9401970ffd3fbbb9a7051f976a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Tue, 20 Sep 2022 14:11:54 +0200 +Subject: [PATCH] phy: marvell: phy-mvebu-a3700-comphy: Reset COMPHY registers + before USB 3.0 power on +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Turris MOX board with older ARM Trusted Firmware version v1.5 is not able +to detect any USB 3.0 device connected to USB-A port on Mox-A module after +commit 0a6fc70d76bd ("phy: marvell: phy-mvebu-a3700-comphy: Remove broken +reset support"). On the other hand USB 2.0 devices connected to the same +USB-A port are working fine. + +It looks as if the older firmware configures COMPHY registers for USB 3.0 +somehow incompatibly for kernel driver. Experiments show that resetting +COMPHY registers via setting SFT_RST auto-clearing bit in COMPHY_SFT_RESET +register fixes this issue. + +Reset the COMPHY in mvebu_a3700_comphy_usb3_power_on() function as a first +step after selecting COMPHY lane and USB 3.0 function. With this change +Turris MOX board can successfully detect USB 3.0 devices again. + +Before the above mentioned commit this reset was implemented in PHY reset +method, so this is the reason why there was no issue with older firmware +version then. + +Fixes: 0a6fc70d76bd ("phy: marvell: phy-mvebu-a3700-comphy: Remove broken reset support") +Reported-by: Marek Behún +Signed-off-by: Pali Rohár +Tested-by: Shin'ichiro Kawasaki +Link: https://lore.kernel.org/r/20220920121154.30115-1-pali@kernel.org +Signed-off-by: Vinod Koul +--- + drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c ++++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c +@@ -826,6 +826,9 @@ mvebu_a3700_comphy_usb3_power_on(struct + if (ret) + return ret; + ++ /* COMPHY register reset (cleared automatically) */ ++ comphy_lane_reg_set(lane, COMPHY_SFT_RESET, SFT_RST, SFT_RST); ++ + /* + * 0. Set PHY OTG Control(0x5d034), bit 4, Power up OTG module The + * register belong to UTMI module, so it is set in UTMI phy driver. diff --git a/target/linux/mvebu/patches-5.10/800-cpuidle-mvebu-indicate-failure-to-enter-deeper-sleep.patch b/target/linux/mvebu/patches-5.15/800-cpuidle-mvebu-indicate-failure-to-enter-deeper-sleep.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/800-cpuidle-mvebu-indicate-failure-to-enter-deeper-sleep.patch rename to target/linux/mvebu/patches-5.15/800-cpuidle-mvebu-indicate-failure-to-enter-deeper-sleep.patch diff --git a/target/linux/mvebu/patches-5.15/801-pci-mvebu-time-out-reset-on-link-up.patch b/target/linux/mvebu/patches-5.15/801-pci-mvebu-time-out-reset-on-link-up.patch new file mode 100644 index 0000000000..dba1253699 --- /dev/null +++ b/target/linux/mvebu/patches-5.15/801-pci-mvebu-time-out-reset-on-link-up.patch @@ -0,0 +1,60 @@ +From 287b9df160b6159f8d385424904f8bac501280c1 Mon Sep 17 00:00:00 2001 +From: Russell King +Date: Sat, 9 Jul 2016 10:58:16 +0100 +Subject: pci: mvebu: time out reset on link up + +If the port reports that the link is up while we are resetting, there's +little point in waiting for the full duration. + +Signed-off-by: Russell King +--- + drivers/pci/controller/pci-mvebu.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +--- a/drivers/pci/controller/pci-mvebu.c ++++ b/drivers/pci/controller/pci-mvebu.c +@@ -1023,6 +1023,7 @@ static int mvebu_pcie_powerup(struct mve + + if (port->reset_gpio) { + u32 reset_udelay = PCI_PM_D3COLD_WAIT * 1000; ++ unsigned int i; + + of_property_read_u32(port->dn, "reset-delay-us", + &reset_udelay); +@@ -1030,7 +1031,13 @@ static int mvebu_pcie_powerup(struct mve + udelay(100); + + gpiod_set_value_cansleep(port->reset_gpio, 0); +- msleep(reset_udelay / 1000); ++ for (i = 0; i < reset_udelay; i += 1000) { ++ if (mvebu_pcie_link_up(port)) ++ break; ++ msleep(1); ++ } ++ ++ printk("%s: reset completed in %dus\n", port->name, i); + } + + return 0; +@@ -1190,15 +1197,16 @@ static int mvebu_pcie_probe(struct platf + if (!child) + continue; + +- ret = mvebu_pcie_powerup(port); +- if (ret < 0) +- continue; +- + port->base = mvebu_pcie_map_registers(pdev, child, port); + if (IS_ERR(port->base)) { + dev_err(dev, "%s: cannot map registers\n", port->name); + port->base = NULL; +- mvebu_pcie_powerdown(port); ++ continue; ++ } ++ ++ ret = mvebu_pcie_powerup(port); ++ if (ret < 0) { ++ port->base = NULL; + continue; + } + diff --git a/target/linux/mvebu/patches-5.15/901-dt-bindings-Add-IEI-vendor-prefix-and-IEI-WT61P803-P.patch b/target/linux/mvebu/patches-5.15/901-dt-bindings-Add-IEI-vendor-prefix-and-IEI-WT61P803-P.patch new file mode 100644 index 0000000000..3446086cad --- /dev/null +++ b/target/linux/mvebu/patches-5.15/901-dt-bindings-Add-IEI-vendor-prefix-and-IEI-WT61P803-P.patch @@ -0,0 +1,218 @@ +From aa4a0ccc41997f2da172165c92803abace43bd1c Mon Sep 17 00:00:00 2001 +From: Luka Kovacic +Date: Tue, 24 Aug 2021 12:44:32 +0000 +Subject: [PATCH 1/7] dt-bindings: Add IEI vendor prefix and IEI WT61P803 + PUZZLE driver bindings + +Add the IEI WT61P803 PUZZLE Device Tree bindings for MFD, HWMON and LED +drivers. A new vendor prefix is also added accordingly for +IEI Integration Corp. + +Signed-off-by: Luka Kovacic +Signed-off-by: Pavo Banicevic +Cc: Luka Perkov +Cc: Robert Marko +--- + .../hwmon/iei,wt61p803-puzzle-hwmon.yaml | 53 ++++++++++++ + .../leds/iei,wt61p803-puzzle-leds.yaml | 39 +++++++++ + .../bindings/mfd/iei,wt61p803-puzzle.yaml | 82 +++++++++++++++++++ + .../devicetree/bindings/vendor-prefixes.yaml | 2 + + 4 files changed, 176 insertions(+) + create mode 100644 Documentation/devicetree/bindings/hwmon/iei,wt61p803-puzzle-hwmon.yaml + create mode 100644 Documentation/devicetree/bindings/leds/iei,wt61p803-puzzle-leds.yaml + create mode 100644 Documentation/devicetree/bindings/mfd/iei,wt61p803-puzzle.yaml + +--- /dev/null ++++ b/Documentation/devicetree/bindings/hwmon/iei,wt61p803-puzzle-hwmon.yaml +@@ -0,0 +1,53 @@ ++# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/hwmon/iei,wt61p803-puzzle-hwmon.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: IEI WT61P803 PUZZLE MCU HWMON module from IEI Integration Corp. ++ ++maintainers: ++ - Luka Kovacic ++ ++description: | ++ This module is a part of the IEI WT61P803 PUZZLE MFD device. For more details ++ see Documentation/devicetree/bindings/mfd/iei,wt61p803-puzzle.yaml. ++ ++ The HWMON module is a sub-node of the MCU node in the Device Tree. ++ ++properties: ++ compatible: ++ const: iei,wt61p803-puzzle-hwmon ++ ++ "#address-cells": ++ const: 1 ++ ++ "#size-cells": ++ const: 0 ++ ++patternProperties: ++ "^fan-group@[0-1]$": ++ type: object ++ properties: ++ reg: ++ minimum: 0 ++ maximum: 1 ++ description: ++ Fan group ID ++ ++ cooling-levels: ++ minItems: 1 ++ maxItems: 255 ++ description: ++ Cooling levels for the fans (PWM value mapping) ++ description: | ++ Properties for each fan group. ++ required: ++ - reg ++ ++required: ++ - compatible ++ - "#address-cells" ++ - "#size-cells" ++ ++additionalProperties: false +--- /dev/null ++++ b/Documentation/devicetree/bindings/leds/iei,wt61p803-puzzle-leds.yaml +@@ -0,0 +1,39 @@ ++# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/leds/iei,wt61p803-puzzle-leds.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: IEI WT61P803 PUZZLE MCU LED module from IEI Integration Corp. ++ ++maintainers: ++ - Luka Kovacic ++ ++description: | ++ This module is a part of the IEI WT61P803 PUZZLE MFD device. For more details ++ see Documentation/devicetree/bindings/mfd/iei,wt61p803-puzzle.yaml. ++ ++ The LED module is a sub-node of the MCU node in the Device Tree. ++ ++properties: ++ compatible: ++ const: iei,wt61p803-puzzle-leds ++ ++ "#address-cells": ++ const: 1 ++ ++ "#size-cells": ++ const: 0 ++ ++ led@0: ++ type: object ++ $ref: common.yaml ++ description: | ++ Properties for a single LED. ++ ++required: ++ - compatible ++ - "#address-cells" ++ - "#size-cells" ++ ++additionalProperties: false +--- /dev/null ++++ b/Documentation/devicetree/bindings/mfd/iei,wt61p803-puzzle.yaml +@@ -0,0 +1,82 @@ ++# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/mfd/iei,wt61p803-puzzle.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: IEI WT61P803 PUZZLE MCU from IEI Integration Corp. ++ ++maintainers: ++ - Luka Kovacic ++ ++description: | ++ IEI WT61P803 PUZZLE MCU is embedded in some IEI Puzzle series boards. ++ It's used for controlling system power states, fans, LEDs and temperature ++ sensors. ++ ++ For Device Tree bindings of other sub-modules (HWMON, LEDs) refer to the ++ binding documents under the respective subsystem directories. ++ ++properties: ++ compatible: ++ const: iei,wt61p803-puzzle ++ ++ current-speed: ++ description: ++ Serial bus speed in bps ++ maxItems: 1 ++ ++ enable-beep: true ++ ++ hwmon: ++ $ref: /schemas/hwmon/iei,wt61p803-puzzle-hwmon.yaml ++ ++ leds: ++ $ref: /schemas/leds/iei,wt61p803-puzzle-leds.yaml ++ ++required: ++ - compatible ++ - current-speed ++ ++additionalProperties: false ++ ++examples: ++ - | ++ #include ++ serial { ++ mcu { ++ compatible = "iei,wt61p803-puzzle"; ++ current-speed = <115200>; ++ enable-beep; ++ ++ leds { ++ compatible = "iei,wt61p803-puzzle-leds"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ led@0 { ++ reg = <0>; ++ function = LED_FUNCTION_POWER; ++ color = ; ++ }; ++ }; ++ ++ hwmon { ++ compatible = "iei,wt61p803-puzzle-hwmon"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ fan-group@0 { ++ #cooling-cells = <2>; ++ reg = <0x00>; ++ cooling-levels = <64 102 170 230 250>; ++ }; ++ ++ fan-group@1 { ++ #cooling-cells = <2>; ++ reg = <0x01>; ++ cooling-levels = <64 102 170 230 250>; ++ }; ++ }; ++ }; ++ }; +--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml ++++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml +@@ -519,6 +519,8 @@ patternProperties: + description: IC Plus Corp. + "^idt,.*": + description: Integrated Device Technologies, Inc. ++ "^iei,.*": ++ description: IEI Integration Corp. + "^ifi,.*": + description: Ingenieurburo Fur Ic-Technologie (I/F/I) + "^ilitek,.*": diff --git a/target/linux/mvebu/patches-5.15/902-drivers-mfd-Add-a-driver-for-IEI-WT61P803-PUZZLE-MCU.patch b/target/linux/mvebu/patches-5.15/902-drivers-mfd-Add-a-driver-for-IEI-WT61P803-PUZZLE-MCU.patch new file mode 100644 index 0000000000..0e546b426e --- /dev/null +++ b/target/linux/mvebu/patches-5.15/902-drivers-mfd-Add-a-driver-for-IEI-WT61P803-PUZZLE-MCU.patch @@ -0,0 +1,1034 @@ +From 692cfa85272dd12995b427c0a7a585ced5d54f32 Mon Sep 17 00:00:00 2001 +From: Luka Kovacic +Date: Tue, 24 Aug 2021 12:44:33 +0000 +Subject: [PATCH 2/7] drivers: mfd: Add a driver for IEI WT61P803 PUZZLE MCU + +Add a driver for the IEI WT61P803 PUZZLE microcontroller, used in some +IEI Puzzle series devices. The microcontroller controls system power, +temperature sensors, fans and LEDs. + +This driver implements the core functionality for device communication +over the system serial (serdev bus). It handles MCU messages and the +internal MCU properties. Some properties can be managed over sysfs. + +Signed-off-by: Luka Kovacic +Signed-off-by: Pavo Banicevic +Cc: Luka Perkov +Cc: Robert Marko +--- + drivers/mfd/Kconfig | 8 + + drivers/mfd/Makefile | 1 + + drivers/mfd/iei-wt61p803-puzzle.c | 908 ++++++++++++++++++++++++ + include/linux/mfd/iei-wt61p803-puzzle.h | 66 ++ + 4 files changed, 983 insertions(+) + create mode 100644 drivers/mfd/iei-wt61p803-puzzle.c + create mode 100644 include/linux/mfd/iei-wt61p803-puzzle.h + +--- a/drivers/mfd/Kconfig ++++ b/drivers/mfd/Kconfig +@@ -2189,6 +2189,15 @@ config SGI_MFD_IOC3 + If you have an SGI Origin, Octane, or a PCI IOC3 card, + then say Y. Otherwise say N. + ++config MFD_IEI_WT61P803_PUZZLE ++ tristate "IEI WT61P803 PUZZLE MCU driver" ++ depends on SERIAL_DEV_BUS ++ select MFD_CORE ++ help ++ IEI WT61P803 PUZZLE is a system power management microcontroller ++ used for fan control, temperature sensor reading, LED control ++ and system identification. ++ + config MFD_INTEL_M10_BMC + tristate "Intel MAX 10 Board Management Controller" + depends on SPI_MASTER +--- a/drivers/mfd/Makefile ++++ b/drivers/mfd/Makefile +@@ -237,6 +237,7 @@ obj-$(CONFIG_MFD_DLN2) += dln2.o + obj-$(CONFIG_MFD_RT4831) += rt4831.o + obj-$(CONFIG_MFD_RT5033) += rt5033.o + obj-$(CONFIG_MFD_SKY81452) += sky81452.o ++obj-$(CONFIG_MFD_IEI_WT61P803_PUZZLE) += iei-wt61p803-puzzle.o + + intel-soc-pmic-objs := intel_soc_pmic_core.o intel_soc_pmic_crc.o + obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o +--- /dev/null ++++ b/drivers/mfd/iei-wt61p803-puzzle.c +@@ -0,0 +1,908 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* IEI WT61P803 PUZZLE MCU Driver ++ * System management microcontroller for fan control, temperature sensor reading, ++ * LED control and system identification on IEI Puzzle series ARM-based appliances. ++ * ++ * Copyright (C) 2020 Sartura Ltd. ++ * Author: Luka Kovacic ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* start, payload and XOR checksum at end */ ++#define IEI_WT61P803_PUZZLE_MAX_COMMAND_LENGTH (1 + 20 + 1) ++#define IEI_WT61P803_PUZZLE_RESP_BUF_SIZE 512 ++ ++#define IEI_WT61P803_PUZZLE_MAC_LENGTH 17 ++#define IEI_WT61P803_PUZZLE_SN_LENGTH 36 ++#define IEI_WT61P803_PUZZLE_VERSION_LENGTH 6 ++#define IEI_WT61P803_PUZZLE_BUILD_INFO_LENGTH 16 ++#define IEI_WT61P803_PUZZLE_PROTOCOL_VERSION_LENGTH 8 ++#define IEI_WT61P803_PUZZLE_NB_MAC 8 ++ ++/* Use HZ as a timeout value throughout the driver */ ++#define IEI_WT61P803_PUZZLE_GENERAL_TIMEOUT HZ ++ ++enum iei_wt61p803_puzzle_attribute_type { ++ IEI_WT61P803_PUZZLE_VERSION, ++ IEI_WT61P803_PUZZLE_BUILD_INFO, ++ IEI_WT61P803_PUZZLE_BOOTLOADER_MODE, ++ IEI_WT61P803_PUZZLE_PROTOCOL_VERSION, ++ IEI_WT61P803_PUZZLE_SERIAL_NUMBER, ++ IEI_WT61P803_PUZZLE_MAC_ADDRESS, ++ IEI_WT61P803_PUZZLE_AC_RECOVERY_STATUS, ++ IEI_WT61P803_PUZZLE_POWER_LOSS_RECOVERY, ++ IEI_WT61P803_PUZZLE_POWER_STATUS, ++}; ++ ++struct iei_wt61p803_puzzle_device_attribute { ++ struct device_attribute dev_attr; ++ enum iei_wt61p803_puzzle_attribute_type type; ++ u8 index; ++}; ++ ++/** ++ * struct iei_wt61p803_puzzle_mcu_status - MCU flags state ++ * @ac_recovery_status_flag: AC Recovery Status Flag ++ * @power_loss_recovery: System recovery after power loss ++ * @power_status: System Power-on Method ++ */ ++struct iei_wt61p803_puzzle_mcu_status { ++ u8 ac_recovery_status_flag; ++ u8 power_loss_recovery; ++ u8 power_status; ++}; ++ ++/** ++ * struct iei_wt61p803_puzzle_reply - MCU reply ++ * @size: Size of the MCU reply ++ * @data: Full MCU reply buffer ++ * @state: Current state of the packet ++ * @received: Was the response fullfilled ++ */ ++struct iei_wt61p803_puzzle_reply { ++ size_t size; ++ unsigned char data[IEI_WT61P803_PUZZLE_RESP_BUF_SIZE]; ++ struct completion received; ++}; ++ ++/** ++ * struct iei_wt61p803_puzzle_mcu_version - MCU version status ++ * @version: Primary firmware version ++ * @build_info: Build date and time ++ * @bootloader_mode: Status of the MCU operation ++ * @protocol_version: MCU communication protocol version ++ * @serial_number: Device factory serial number ++ * @mac_address: Device factory MAC addresses ++ * ++ * Last element of arrays is reserved for '\0'. ++ */ ++struct iei_wt61p803_puzzle_mcu_version { ++ char version[IEI_WT61P803_PUZZLE_VERSION_LENGTH + 1]; ++ char build_info[IEI_WT61P803_PUZZLE_BUILD_INFO_LENGTH + 1]; ++ bool bootloader_mode; ++ char protocol_version[IEI_WT61P803_PUZZLE_PROTOCOL_VERSION_LENGTH + 1]; ++ char serial_number[IEI_WT61P803_PUZZLE_SN_LENGTH + 1]; ++ char mac_address[IEI_WT61P803_PUZZLE_NB_MAC][IEI_WT61P803_PUZZLE_MAC_LENGTH + 1]; ++}; ++ ++/** ++ * struct iei_wt61p803_puzzle - IEI WT61P803 PUZZLE MCU Driver ++ * @serdev: Pointer to underlying serdev device ++ * @dev: Pointer to underlying dev device ++ * @reply_lock: Reply mutex lock ++ * @reply: Pointer to the iei_wt61p803_puzzle_reply struct ++ * @version: MCU version related data ++ * @status: MCU status related data ++ * @response_buffer Command response buffer allocation ++ * @lock General member mutex lock ++ */ ++struct iei_wt61p803_puzzle { ++ struct serdev_device *serdev; ++ struct device *dev; ++ struct mutex reply_lock; /* lock to prevent multiple firmware calls */ ++ struct iei_wt61p803_puzzle_reply *reply; ++ struct iei_wt61p803_puzzle_mcu_version version; ++ struct iei_wt61p803_puzzle_mcu_status status; ++ unsigned char response_buffer[IEI_WT61P803_PUZZLE_BUF_SIZE]; ++ struct mutex lock; /* lock to protect response buffer */ ++}; ++ ++static unsigned char iei_wt61p803_puzzle_checksum(unsigned char *buf, size_t len) ++{ ++ unsigned char checksum = 0; ++ size_t i; ++ ++ for (i = 0; i < len; i++) ++ checksum ^= buf[i]; ++ return checksum; ++} ++ ++static int iei_wt61p803_puzzle_process_resp(struct iei_wt61p803_puzzle *mcu, ++ const unsigned char *raw_resp_data, size_t size) ++{ ++ unsigned char checksum; ++ ++ /* Check the incoming frame header */ ++ if (!(raw_resp_data[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START || ++ raw_resp_data[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER || ++ (raw_resp_data[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM && ++ raw_resp_data[1] == IEI_WT61P803_PUZZLE_CMD_EEPROM_READ))) { ++ if (mcu->reply->size + size >= sizeof(mcu->reply->data)) ++ return -EIO; ++ ++ /* Append the frame to existing data */ ++ memcpy(mcu->reply->data + mcu->reply->size, raw_resp_data, size); ++ mcu->reply->size += size; ++ } else { ++ if (size >= sizeof(mcu->reply->data)) ++ return -EIO; ++ ++ /* Start processing a new frame */ ++ memcpy(mcu->reply->data, raw_resp_data, size); ++ mcu->reply->size = size; ++ } ++ ++ checksum = iei_wt61p803_puzzle_checksum(mcu->reply->data, mcu->reply->size - 1); ++ if (checksum != mcu->reply->data[mcu->reply->size - 1]) { ++ /* The checksum isn't matched yet, wait for new frames */ ++ return size; ++ } ++ ++ /* Received all the data */ ++ complete(&mcu->reply->received); ++ ++ return size; ++} ++ ++static int iei_wt61p803_puzzle_recv_buf(struct serdev_device *serdev, ++ const unsigned char *data, size_t size) ++{ ++ struct iei_wt61p803_puzzle *mcu = serdev_device_get_drvdata(serdev); ++ int ret; ++ ++ ret = iei_wt61p803_puzzle_process_resp(mcu, data, size); ++ /* Return the number of processed bytes if function returns error, ++ * discard the remaining incoming data, since the frame this data ++ * belongs to is broken anyway ++ */ ++ if (ret < 0) ++ return size; ++ ++ return ret; ++} ++ ++static const struct serdev_device_ops iei_wt61p803_puzzle_serdev_device_ops = { ++ .receive_buf = iei_wt61p803_puzzle_recv_buf, ++ .write_wakeup = serdev_device_write_wakeup, ++}; ++ ++/** ++ * iei_wt61p803_puzzle_write_command_watchdog() - Watchdog of the normal cmd ++ * @mcu: Pointer to the iei_wt61p803_puzzle core MFD struct ++ * @cmd: Pointer to the char array to send (size should be content + 1 (xor)) ++ * @size: Size of the cmd char array ++ * @reply_data: Pointer to the reply/response data array (should be allocated) ++ * @reply_size: Pointer to size_t (size of reply_data) ++ * @retry_count: Number of times to retry sending the command to the MCU ++ */ ++int iei_wt61p803_puzzle_write_command_watchdog(struct iei_wt61p803_puzzle *mcu, ++ unsigned char *cmd, size_t size, ++ unsigned char *reply_data, ++ size_t *reply_size, int retry_count) ++{ ++ struct device *dev = &mcu->serdev->dev; ++ int ret, i; ++ ++ for (i = 0; i < retry_count; i++) { ++ ret = iei_wt61p803_puzzle_write_command(mcu, cmd, size, ++ reply_data, reply_size); ++ if (ret != -ETIMEDOUT) ++ return ret; ++ } ++ ++ dev_err(dev, "Command response timed out. Retries: %d\n", retry_count); ++ ++ return -ETIMEDOUT; ++} ++EXPORT_SYMBOL_GPL(iei_wt61p803_puzzle_write_command_watchdog); ++ ++/** ++ * iei_wt61p803_puzzle_write_command() - Send a structured command to the MCU ++ * @mcu: Pointer to the iei_wt61p803_puzzle core MFD struct ++ * @cmd: Pointer to the char array to send (size should be content + 1 (xor)) ++ * @size: Size of the cmd char array ++ * @reply_data: Pointer to the reply/response data array (should be allocated) ++ * ++ * Sends a structured command to the MCU. ++ */ ++int iei_wt61p803_puzzle_write_command(struct iei_wt61p803_puzzle *mcu, ++ unsigned char *cmd, size_t size, ++ unsigned char *reply_data, ++ size_t *reply_size) ++{ ++ struct device *dev = &mcu->serdev->dev; ++ int ret; ++ ++ if (size <= 1 || size > IEI_WT61P803_PUZZLE_MAX_COMMAND_LENGTH) ++ return -EINVAL; ++ ++ mutex_lock(&mcu->reply_lock); ++ ++ cmd[size - 1] = iei_wt61p803_puzzle_checksum(cmd, size - 1); ++ ++ /* Initialize reply struct */ ++ reinit_completion(&mcu->reply->received); ++ mcu->reply->size = 0; ++ usleep_range(2000, 10000); ++ serdev_device_write_flush(mcu->serdev); ++ ret = serdev_device_write_buf(mcu->serdev, cmd, size); ++ if (ret < 0) ++ goto exit; ++ ++ serdev_device_wait_until_sent(mcu->serdev, IEI_WT61P803_PUZZLE_GENERAL_TIMEOUT); ++ ret = wait_for_completion_timeout(&mcu->reply->received, ++ IEI_WT61P803_PUZZLE_GENERAL_TIMEOUT); ++ if (ret == 0) { ++ dev_err(dev, "Command reply receive timeout\n"); ++ ret = -ETIMEDOUT; ++ goto exit; ++ } ++ ++ *reply_size = mcu->reply->size; ++ /* Copy the received data, as it will not be available after a new frame is received */ ++ memcpy(reply_data, mcu->reply->data, mcu->reply->size); ++ ret = 0; ++exit: ++ mutex_unlock(&mcu->reply_lock); ++ return ret; ++} ++EXPORT_SYMBOL_GPL(iei_wt61p803_puzzle_write_command); ++ ++static int iei_wt61p803_puzzle_buzzer(struct iei_wt61p803_puzzle *mcu, bool long_beep) ++{ ++ unsigned char *resp_buf = mcu->response_buffer; ++ unsigned char buzzer_cmd[4] = {}; ++ size_t reply_size; ++ int ret; ++ ++ buzzer_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; ++ buzzer_cmd[1] = IEI_WT61P803_PUZZLE_CMD_FUNCTION_SINGLE; ++ buzzer_cmd[2] = long_beep ? '3' : '2'; /* Buzzer 1.5 / 0.5 second beep */ ++ ++ mutex_lock(&mcu->lock); ++ ret = iei_wt61p803_puzzle_write_command(mcu, buzzer_cmd, sizeof(buzzer_cmd), ++ resp_buf, &reply_size); ++ if (ret) ++ goto exit; ++ ++ if (reply_size != 3) { ++ ret = -EIO; ++ goto exit; ++ } ++ ++ if (!(resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && ++ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK && ++ resp_buf[2] == IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK)) { ++ ret = -EPROTO; ++ goto exit; ++ } ++exit: ++ mutex_unlock(&mcu->lock); ++ return ret; ++} ++ ++static int iei_wt61p803_puzzle_get_version(struct iei_wt61p803_puzzle *mcu) ++{ ++ unsigned char version_cmd[3] = { ++ IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER, ++ IEI_WT61P803_PUZZLE_CMD_OTHER_VERSION, ++ }; ++ unsigned char build_info_cmd[3] = { ++ IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER, ++ IEI_WT61P803_PUZZLE_CMD_OTHER_BUILD, ++ }; ++ unsigned char bootloader_mode_cmd[3] = { ++ IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER, ++ IEI_WT61P803_PUZZLE_CMD_OTHER_BOOTLOADER_MODE, ++ }; ++ unsigned char protocol_version_cmd[3] = { ++ IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER, ++ IEI_WT61P803_PUZZLE_CMD_OTHER_PROTOCOL_VERSION, ++ }; ++ unsigned char *rb = mcu->response_buffer; ++ size_t reply_size; ++ int ret; ++ ++ mutex_lock(&mcu->lock); ++ ++ ret = iei_wt61p803_puzzle_write_command(mcu, version_cmd, sizeof(version_cmd), ++ rb, &reply_size); ++ if (ret) ++ goto err; ++ if (reply_size < 7) { ++ ret = -EIO; ++ goto err; ++ } ++ sprintf(mcu->version.version, "v%c.%.3s", rb[2], &rb[3]); ++ ++ ret = iei_wt61p803_puzzle_write_command(mcu, build_info_cmd, ++ sizeof(build_info_cmd), rb, ++ &reply_size); ++ if (ret) ++ goto err; ++ if (reply_size < 15) { ++ ret = -EIO; ++ goto err; ++ } ++ sprintf(mcu->version.build_info, "%c%c/%c%c/%.4s %c%c:%c%c", ++ rb[8], rb[9], rb[6], rb[7], &rb[2], rb[10], rb[11], ++ rb[12], rb[13]); ++ ++ ret = iei_wt61p803_puzzle_write_command(mcu, bootloader_mode_cmd, ++ sizeof(bootloader_mode_cmd), rb, ++ &reply_size); ++ if (ret) ++ goto err; ++ if (reply_size < 4) { ++ ret = -EIO; ++ goto err; ++ } ++ if (rb[2] == IEI_WT61P803_PUZZLE_CMD_OTHER_MODE_APPS) ++ mcu->version.bootloader_mode = false; ++ else if (rb[2] == IEI_WT61P803_PUZZLE_CMD_OTHER_MODE_BOOTLOADER) ++ mcu->version.bootloader_mode = true; ++ ++ ret = iei_wt61p803_puzzle_write_command(mcu, protocol_version_cmd, ++ sizeof(protocol_version_cmd), rb, ++ &reply_size); ++ if (ret) ++ goto err; ++ if (reply_size < 9) { ++ ret = -EIO; ++ goto err; ++ } ++ sprintf(mcu->version.protocol_version, "v%c.%c%c%c%c%c", ++ rb[7], rb[6], rb[5], rb[4], rb[3], rb[2]); ++err: ++ mutex_unlock(&mcu->lock); ++ return ret; ++} ++ ++static int iei_wt61p803_puzzle_get_mcu_status(struct iei_wt61p803_puzzle *mcu) ++{ ++ unsigned char mcu_status_cmd[5] = { ++ IEI_WT61P803_PUZZLE_CMD_HEADER_START, ++ IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER, ++ IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_STATUS, ++ IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_STATUS, ++ }; ++ unsigned char *resp_buf = mcu->response_buffer; ++ size_t reply_size; ++ int ret; ++ ++ mutex_lock(&mcu->lock); ++ ret = iei_wt61p803_puzzle_write_command(mcu, mcu_status_cmd, sizeof(mcu_status_cmd), ++ resp_buf, &reply_size); ++ if (ret) ++ goto exit; ++ if (reply_size < 20) { ++ ret = -EIO; ++ goto exit; ++ } ++ ++ /* Response format: ++ * (IDX RESPONSE) ++ * 0 @ ++ * 1 O ++ * 2 S ++ * 3 S ++ * ... ++ * 5 AC Recovery Status Flag ++ * ... ++ * 10 Power Loss Recovery ++ * ... ++ * 19 Power Status (system power on method) ++ * 20 XOR checksum ++ */ ++ if (resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && ++ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER && ++ resp_buf[2] == IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_STATUS && ++ resp_buf[3] == IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_STATUS) { ++ mcu->status.ac_recovery_status_flag = resp_buf[5]; ++ mcu->status.power_loss_recovery = resp_buf[10]; ++ mcu->status.power_status = resp_buf[19]; ++ } ++exit: ++ mutex_unlock(&mcu->lock); ++ return ret; ++} ++ ++static int iei_wt61p803_puzzle_get_serial_number(struct iei_wt61p803_puzzle *mcu) ++{ ++ unsigned char *resp_buf = mcu->response_buffer; ++ unsigned char serial_number_cmd[5] = { ++ IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM, ++ IEI_WT61P803_PUZZLE_CMD_EEPROM_READ, ++ 0x00, /* EEPROM read address */ ++ 0x24, /* Data length */ ++ }; ++ size_t reply_size; ++ int ret; ++ ++ mutex_lock(&mcu->lock); ++ ret = iei_wt61p803_puzzle_write_command(mcu, serial_number_cmd, ++ sizeof(serial_number_cmd), ++ resp_buf, &reply_size); ++ if (ret) ++ goto err; ++ ++ if (reply_size < IEI_WT61P803_PUZZLE_SN_LENGTH + 4) { ++ ret = -EIO; ++ goto err; ++ } ++ ++ sprintf(mcu->version.serial_number, "%.*s", ++ IEI_WT61P803_PUZZLE_SN_LENGTH, resp_buf + 4); ++err: ++ mutex_unlock(&mcu->lock); ++ return ret; ++} ++ ++static int iei_wt61p803_puzzle_write_serial_number(struct iei_wt61p803_puzzle *mcu, ++ unsigned char serial_number[36]) ++{ ++ unsigned char *resp_buf = mcu->response_buffer; ++ unsigned char serial_number_header[4] = { ++ IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM, ++ IEI_WT61P803_PUZZLE_CMD_EEPROM_WRITE, ++ 0x00, /* EEPROM write address */ ++ 0xC, /* Data length */ ++ }; ++ unsigned char serial_number_cmd[4 + 12 + 1]; /* header, serial number, XOR checksum */ ++ int ret, sn_counter; ++ size_t reply_size; ++ ++ /* The MCU can only handle 22 byte messages, send the S/N in 12 byte chunks */ ++ mutex_lock(&mcu->lock); ++ for (sn_counter = 0; sn_counter < 3; sn_counter++) { ++ serial_number_header[2] = 0x0 + 0xC * sn_counter; ++ ++ memcpy(serial_number_cmd, serial_number_header, sizeof(serial_number_header)); ++ memcpy(serial_number_cmd + sizeof(serial_number_header), ++ serial_number + 0xC * sn_counter, 0xC); ++ ++ ret = iei_wt61p803_puzzle_write_command(mcu, serial_number_cmd, ++ sizeof(serial_number_cmd), ++ resp_buf, &reply_size); ++ if (ret) ++ goto err; ++ if (reply_size != 3) { ++ ret = -EIO; ++ goto err; ++ } ++ if (!(resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && ++ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK && ++ resp_buf[2] == IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK)) { ++ ret = -EPROTO; ++ goto err; ++ } ++ } ++ ++ sprintf(mcu->version.serial_number, "%.*s", ++ IEI_WT61P803_PUZZLE_SN_LENGTH, serial_number); ++err: ++ mutex_unlock(&mcu->lock); ++ return ret; ++} ++ ++static int iei_wt61p803_puzzle_get_mac_address(struct iei_wt61p803_puzzle *mcu, int index) ++{ ++ unsigned char *resp_buf = mcu->response_buffer; ++ unsigned char mac_address_cmd[5] = { ++ IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM, ++ IEI_WT61P803_PUZZLE_CMD_EEPROM_READ, ++ 0x00, /* EEPROM read address */ ++ 0x11, /* Data length */ ++ }; ++ size_t reply_size; ++ int ret; ++ ++ mutex_lock(&mcu->lock); ++ mac_address_cmd[2] = 0x24 + 0x11 * index; ++ ++ ret = iei_wt61p803_puzzle_write_command(mcu, mac_address_cmd, ++ sizeof(mac_address_cmd), ++ resp_buf, &reply_size); ++ if (ret) ++ goto err; ++ ++ if (reply_size < 22) { ++ ret = -EIO; ++ goto err; ++ } ++ ++ sprintf(mcu->version.mac_address[index], "%.*s", ++ IEI_WT61P803_PUZZLE_MAC_LENGTH, resp_buf + 4); ++err: ++ mutex_unlock(&mcu->lock); ++ return ret; ++} ++ ++static int ++iei_wt61p803_puzzle_write_mac_address(struct iei_wt61p803_puzzle *mcu, ++ unsigned char mac_address[IEI_WT61P803_PUZZLE_MAC_LENGTH], ++ int mac_address_idx) ++{ ++ unsigned char mac_address_cmd[4 + IEI_WT61P803_PUZZLE_MAC_LENGTH + 1]; ++ unsigned char *resp_buf = mcu->response_buffer; ++ unsigned char mac_address_header[4] = { ++ IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM, ++ IEI_WT61P803_PUZZLE_CMD_EEPROM_WRITE, ++ 0x00, /* EEPROM write address */ ++ 0x11, /* Data length */ ++ }; ++ size_t reply_size; ++ int ret; ++ ++ if (mac_address_idx < 0 || mac_address_idx >= IEI_WT61P803_PUZZLE_NB_MAC) ++ return -EINVAL; ++ ++ mac_address_header[2] = 0x24 + 0x11 * mac_address_idx; ++ ++ /* Concat mac_address_header, mac_address to mac_address_cmd */ ++ memcpy(mac_address_cmd, mac_address_header, sizeof(mac_address_header)); ++ memcpy(mac_address_cmd + sizeof(mac_address_header), mac_address, ++ IEI_WT61P803_PUZZLE_MAC_LENGTH); ++ ++ mutex_lock(&mcu->lock); ++ ret = iei_wt61p803_puzzle_write_command(mcu, mac_address_cmd, ++ sizeof(mac_address_cmd), ++ resp_buf, &reply_size); ++ if (ret) ++ goto err; ++ if (reply_size != 3) { ++ ret = -EIO; ++ goto err; ++ } ++ if (!(resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && ++ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK && ++ resp_buf[2] == IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK)) { ++ ret = -EPROTO; ++ goto err; ++ } ++ ++ sprintf(mcu->version.mac_address[mac_address_idx], "%.*s", ++ IEI_WT61P803_PUZZLE_MAC_LENGTH, mac_address); ++err: ++ mutex_unlock(&mcu->lock); ++ return ret; ++} ++ ++static int iei_wt61p803_puzzle_write_power_loss_recovery(struct iei_wt61p803_puzzle *mcu, ++ int power_loss_recovery_action) ++{ ++ unsigned char *resp_buf = mcu->response_buffer; ++ unsigned char power_loss_recovery_cmd[5] = {}; ++ size_t reply_size; ++ int ret; ++ ++ if (power_loss_recovery_action < 0 || power_loss_recovery_action > 4) ++ return -EINVAL; ++ ++ power_loss_recovery_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; ++ power_loss_recovery_cmd[1] = IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER; ++ power_loss_recovery_cmd[2] = IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_POWER_LOSS; ++ power_loss_recovery_cmd[3] = hex_asc[power_loss_recovery_action]; ++ ++ mutex_lock(&mcu->lock); ++ ret = iei_wt61p803_puzzle_write_command(mcu, power_loss_recovery_cmd, ++ sizeof(power_loss_recovery_cmd), ++ resp_buf, &reply_size); ++ if (ret) ++ goto exit; ++ mcu->status.power_loss_recovery = power_loss_recovery_action; ++exit: ++ mutex_unlock(&mcu->lock); ++ return ret; ++} ++ ++#define to_puzzle_dev_attr(_attr) \ ++ container_of(_attr, struct iei_wt61p803_puzzle_device_attribute, dev_attr) ++ ++static ssize_t show_output(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct iei_wt61p803_puzzle *mcu = dev_get_drvdata(dev); ++ struct iei_wt61p803_puzzle_device_attribute *pattr = to_puzzle_dev_attr(attr); ++ int ret; ++ ++ switch (pattr->type) { ++ case IEI_WT61P803_PUZZLE_VERSION: ++ return scnprintf(buf, PAGE_SIZE, "%s\n", mcu->version.version); ++ case IEI_WT61P803_PUZZLE_BUILD_INFO: ++ return scnprintf(buf, PAGE_SIZE, "%s\n", mcu->version.build_info); ++ case IEI_WT61P803_PUZZLE_BOOTLOADER_MODE: ++ return scnprintf(buf, PAGE_SIZE, "%d\n", mcu->version.bootloader_mode); ++ case IEI_WT61P803_PUZZLE_PROTOCOL_VERSION: ++ return scnprintf(buf, PAGE_SIZE, "%s\n", mcu->version.protocol_version); ++ case IEI_WT61P803_PUZZLE_SERIAL_NUMBER: ++ ret = iei_wt61p803_puzzle_get_serial_number(mcu); ++ if (!ret) ++ ret = scnprintf(buf, PAGE_SIZE, "%s\n", mcu->version.serial_number); ++ else ++ ret = 0; ++ return ret; ++ case IEI_WT61P803_PUZZLE_MAC_ADDRESS: ++ ret = iei_wt61p803_puzzle_get_mac_address(mcu, pattr->index); ++ if (!ret) ++ ret = scnprintf(buf, PAGE_SIZE, "%s\n", ++ mcu->version.mac_address[pattr->index]); ++ else ++ ret = 0; ++ return ret; ++ case IEI_WT61P803_PUZZLE_AC_RECOVERY_STATUS: ++ case IEI_WT61P803_PUZZLE_POWER_LOSS_RECOVERY: ++ case IEI_WT61P803_PUZZLE_POWER_STATUS: ++ ret = iei_wt61p803_puzzle_get_mcu_status(mcu); ++ if (ret) ++ return ret; ++ ++ mutex_lock(&mcu->lock); ++ switch (pattr->type) { ++ case IEI_WT61P803_PUZZLE_AC_RECOVERY_STATUS: ++ ret = scnprintf(buf, PAGE_SIZE, "%x\n", ++ mcu->status.ac_recovery_status_flag); ++ break; ++ case IEI_WT61P803_PUZZLE_POWER_LOSS_RECOVERY: ++ ret = scnprintf(buf, PAGE_SIZE, "%x\n", mcu->status.power_loss_recovery); ++ break; ++ case IEI_WT61P803_PUZZLE_POWER_STATUS: ++ ret = scnprintf(buf, PAGE_SIZE, "%x\n", mcu->status.power_status); ++ break; ++ default: ++ ret = 0; ++ break; ++ } ++ mutex_unlock(&mcu->lock); ++ return ret; ++ default: ++ return 0; ++ } ++ ++ return 0; ++} ++ ++static ssize_t store_output(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t len) ++{ ++ unsigned char serial_number[IEI_WT61P803_PUZZLE_SN_LENGTH]; ++ unsigned char mac_address[IEI_WT61P803_PUZZLE_MAC_LENGTH]; ++ struct iei_wt61p803_puzzle *mcu = dev_get_drvdata(dev); ++ struct iei_wt61p803_puzzle_device_attribute *pattr = to_puzzle_dev_attr(attr); ++ int power_loss_recovery_action = 0; ++ int ret; ++ ++ switch (pattr->type) { ++ case IEI_WT61P803_PUZZLE_SERIAL_NUMBER: ++ if (len != (size_t)(IEI_WT61P803_PUZZLE_SN_LENGTH + 1)) ++ return -EINVAL; ++ memcpy(serial_number, buf, sizeof(serial_number)); ++ ret = iei_wt61p803_puzzle_write_serial_number(mcu, serial_number); ++ if (ret) ++ return ret; ++ return len; ++ case IEI_WT61P803_PUZZLE_MAC_ADDRESS: ++ if (len != (size_t)(IEI_WT61P803_PUZZLE_MAC_LENGTH + 1)) ++ return -EINVAL; ++ ++ memcpy(mac_address, buf, sizeof(mac_address)); ++ ++ if (strlen(attr->attr.name) != 13) ++ return -EIO; ++ ++ ret = iei_wt61p803_puzzle_write_mac_address(mcu, mac_address, pattr->index); ++ if (ret) ++ return ret; ++ return len; ++ case IEI_WT61P803_PUZZLE_POWER_LOSS_RECOVERY: ++ ret = kstrtoint(buf, 10, &power_loss_recovery_action); ++ if (ret) ++ return ret; ++ ret = iei_wt61p803_puzzle_write_power_loss_recovery(mcu, ++ power_loss_recovery_action); ++ if (ret) ++ return ret; ++ return len; ++ default: ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++#define IEI_WT61P803_PUZZLE_ATTR(_name, _mode, _show, _store, _type, _index) \ ++ struct iei_wt61p803_puzzle_device_attribute dev_attr_##_name = \ ++ { .dev_attr = __ATTR(_name, _mode, _show, _store), \ ++ .type = _type, \ ++ .index = _index } ++ ++#define IEI_WT61P803_PUZZLE_ATTR_RO(_name, _type, _id) \ ++ IEI_WT61P803_PUZZLE_ATTR(_name, 0444, show_output, NULL, _type, _id) ++ ++#define IEI_WT61P803_PUZZLE_ATTR_RW(_name, _type, _id) \ ++ IEI_WT61P803_PUZZLE_ATTR(_name, 0644, show_output, store_output, _type, _id) ++ ++static IEI_WT61P803_PUZZLE_ATTR_RO(version, IEI_WT61P803_PUZZLE_VERSION, 0); ++static IEI_WT61P803_PUZZLE_ATTR_RO(build_info, IEI_WT61P803_PUZZLE_BUILD_INFO, 0); ++static IEI_WT61P803_PUZZLE_ATTR_RO(bootloader_mode, IEI_WT61P803_PUZZLE_BOOTLOADER_MODE, 0); ++static IEI_WT61P803_PUZZLE_ATTR_RO(protocol_version, IEI_WT61P803_PUZZLE_PROTOCOL_VERSION, 0); ++static IEI_WT61P803_PUZZLE_ATTR_RW(serial_number, IEI_WT61P803_PUZZLE_SERIAL_NUMBER, 0); ++static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_0, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 0); ++static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_1, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 1); ++static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_2, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 2); ++static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_3, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 3); ++static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_4, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 4); ++static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_5, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 5); ++static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_6, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 6); ++static IEI_WT61P803_PUZZLE_ATTR_RW(mac_address_7, IEI_WT61P803_PUZZLE_MAC_ADDRESS, 7); ++static IEI_WT61P803_PUZZLE_ATTR_RO(ac_recovery_status, IEI_WT61P803_PUZZLE_AC_RECOVERY_STATUS, 0); ++static IEI_WT61P803_PUZZLE_ATTR_RW(power_loss_recovery, IEI_WT61P803_PUZZLE_POWER_LOSS_RECOVERY, 0); ++static IEI_WT61P803_PUZZLE_ATTR_RO(power_status, IEI_WT61P803_PUZZLE_POWER_STATUS, 0); ++ ++static struct attribute *iei_wt61p803_puzzle_attrs[] = { ++ &dev_attr_version.dev_attr.attr, ++ &dev_attr_build_info.dev_attr.attr, ++ &dev_attr_bootloader_mode.dev_attr.attr, ++ &dev_attr_protocol_version.dev_attr.attr, ++ &dev_attr_serial_number.dev_attr.attr, ++ &dev_attr_mac_address_0.dev_attr.attr, ++ &dev_attr_mac_address_1.dev_attr.attr, ++ &dev_attr_mac_address_2.dev_attr.attr, ++ &dev_attr_mac_address_3.dev_attr.attr, ++ &dev_attr_mac_address_4.dev_attr.attr, ++ &dev_attr_mac_address_5.dev_attr.attr, ++ &dev_attr_mac_address_6.dev_attr.attr, ++ &dev_attr_mac_address_7.dev_attr.attr, ++ &dev_attr_ac_recovery_status.dev_attr.attr, ++ &dev_attr_power_loss_recovery.dev_attr.attr, ++ &dev_attr_power_status.dev_attr.attr, ++ NULL ++}; ++ATTRIBUTE_GROUPS(iei_wt61p803_puzzle); ++ ++static int iei_wt61p803_puzzle_sysfs_create(struct device *dev, ++ struct iei_wt61p803_puzzle *mcu) ++{ ++ int ret; ++ ++ ret = sysfs_create_groups(&mcu->dev->kobj, iei_wt61p803_puzzle_groups); ++ if (ret) ++ mfd_remove_devices(mcu->dev); ++ ++ return ret; ++} ++ ++static int iei_wt61p803_puzzle_sysfs_remove(struct device *dev, ++ struct iei_wt61p803_puzzle *mcu) ++{ ++ /* Remove sysfs groups */ ++ sysfs_remove_groups(&mcu->dev->kobj, iei_wt61p803_puzzle_groups); ++ mfd_remove_devices(mcu->dev); ++ ++ return 0; ++} ++ ++static int iei_wt61p803_puzzle_probe(struct serdev_device *serdev) ++{ ++ struct device *dev = &serdev->dev; ++ struct iei_wt61p803_puzzle *mcu; ++ u32 baud; ++ int ret; ++ ++ /* Read the baud rate from 'current-speed', because the MCU supports different rates */ ++ if (device_property_read_u32(dev, "current-speed", &baud)) { ++ dev_err(dev, ++ "'current-speed' is not specified in device node\n"); ++ return -EINVAL; ++ } ++ dev_dbg(dev, "Driver baud rate: %d\n", baud); ++ ++ /* Allocate the memory */ ++ mcu = devm_kzalloc(dev, sizeof(*mcu), GFP_KERNEL); ++ if (!mcu) ++ return -ENOMEM; ++ ++ mcu->reply = devm_kzalloc(dev, sizeof(*mcu->reply), GFP_KERNEL); ++ if (!mcu->reply) ++ return -ENOMEM; ++ ++ /* Initialize device struct data */ ++ mcu->serdev = serdev; ++ mcu->dev = dev; ++ init_completion(&mcu->reply->received); ++ mutex_init(&mcu->reply_lock); ++ mutex_init(&mcu->lock); ++ ++ /* Setup UART interface */ ++ serdev_device_set_drvdata(serdev, mcu); ++ serdev_device_set_client_ops(serdev, &iei_wt61p803_puzzle_serdev_device_ops); ++ ret = devm_serdev_device_open(dev, serdev); ++ if (ret) ++ return ret; ++ serdev_device_set_baudrate(serdev, baud); ++ serdev_device_set_flow_control(serdev, false); ++ ret = serdev_device_set_parity(serdev, SERDEV_PARITY_NONE); ++ if (ret) { ++ dev_err(dev, "Failed to set parity\n"); ++ return ret; ++ } ++ ++ ret = iei_wt61p803_puzzle_get_version(mcu); ++ if (ret) ++ return ret; ++ ++ dev_dbg(dev, "MCU version: %s\n", mcu->version.version); ++ dev_dbg(dev, "MCU firmware build info: %s\n", mcu->version.build_info); ++ dev_dbg(dev, "MCU in bootloader mode: %s\n", ++ mcu->version.bootloader_mode ? "true" : "false"); ++ dev_dbg(dev, "MCU protocol version: %s\n", mcu->version.protocol_version); ++ ++ if (device_property_read_bool(dev, "enable-beep")) { ++ ret = iei_wt61p803_puzzle_buzzer(mcu, false); ++ if (ret) ++ return ret; ++ } ++ ++ ret = iei_wt61p803_puzzle_sysfs_create(dev, mcu); ++ if (ret) ++ return ret; ++ ++ return devm_of_platform_populate(dev); ++} ++ ++static void iei_wt61p803_puzzle_remove(struct serdev_device *serdev) ++{ ++ struct device *dev = &serdev->dev; ++ struct iei_wt61p803_puzzle *mcu = dev_get_drvdata(dev); ++ ++ iei_wt61p803_puzzle_sysfs_remove(dev, mcu); ++} ++ ++static const struct of_device_id iei_wt61p803_puzzle_dt_ids[] = { ++ { .compatible = "iei,wt61p803-puzzle" }, ++ { } ++}; ++ ++MODULE_DEVICE_TABLE(of, iei_wt61p803_puzzle_dt_ids); ++ ++static struct serdev_device_driver iei_wt61p803_puzzle_drv = { ++ .probe = iei_wt61p803_puzzle_probe, ++ .remove = iei_wt61p803_puzzle_remove, ++ .driver = { ++ .name = "iei-wt61p803-puzzle", ++ .of_match_table = iei_wt61p803_puzzle_dt_ids, ++ }, ++}; ++ ++module_serdev_device_driver(iei_wt61p803_puzzle_drv); ++ ++MODULE_LICENSE("GPL v2"); ++MODULE_AUTHOR("Luka Kovacic "); ++MODULE_DESCRIPTION("IEI WT61P803 PUZZLE MCU Driver"); +--- /dev/null ++++ b/include/linux/mfd/iei-wt61p803-puzzle.h +@@ -0,0 +1,66 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++/* IEI WT61P803 PUZZLE MCU Driver ++ * System management microcontroller for fan control, temperature sensor reading, ++ * LED control and system identification on IEI Puzzle series ARM-based appliances. ++ * ++ * Copyright (C) 2020 Sartura Ltd. ++ * Author: Luka Kovacic ++ */ ++ ++#ifndef _MFD_IEI_WT61P803_PUZZLE_H_ ++#define _MFD_IEI_WT61P803_PUZZLE_H_ ++ ++#define IEI_WT61P803_PUZZLE_BUF_SIZE 512 ++ ++/* Command magic numbers */ ++#define IEI_WT61P803_PUZZLE_CMD_HEADER_START 0x40 /* @ */ ++#define IEI_WT61P803_PUZZLE_CMD_HEADER_START_OTHER 0x25 /* % */ ++#define IEI_WT61P803_PUZZLE_CMD_HEADER_EEPROM 0xF7 ++ ++#define IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK 0x30 /* 0 */ ++#define IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK 0x70 ++ ++#define IEI_WT61P803_PUZZLE_CMD_EEPROM_READ 0xA1 ++#define IEI_WT61P803_PUZZLE_CMD_EEPROM_WRITE 0xA0 ++ ++#define IEI_WT61P803_PUZZLE_CMD_OTHER_VERSION 0x56 /* V */ ++#define IEI_WT61P803_PUZZLE_CMD_OTHER_BUILD 0x42 /* B */ ++#define IEI_WT61P803_PUZZLE_CMD_OTHER_BOOTLOADER_MODE 0x4D /* M */ ++#define IEI_WT61P803_PUZZLE_CMD_OTHER_MODE_BOOTLOADER 0x30 ++#define IEI_WT61P803_PUZZLE_CMD_OTHER_MODE_APPS 0x31 ++#define IEI_WT61P803_PUZZLE_CMD_OTHER_PROTOCOL_VERSION 0x50 /* P */ ++ ++#define IEI_WT61P803_PUZZLE_CMD_FUNCTION_SINGLE 0x43 /* C */ ++#define IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER 0x4F /* O */ ++#define IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_STATUS 0x53 /* S */ ++#define IEI_WT61P803_PUZZLE_CMD_FUNCTION_OTHER_POWER_LOSS 0x41 /* A */ ++ ++#define IEI_WT61P803_PUZZLE_CMD_LED 0x52 /* R */ ++#define IEI_WT61P803_PUZZLE_CMD_LED_POWER 0x31 /* 1 */ ++ ++#define IEI_WT61P803_PUZZLE_CMD_TEMP 0x54 /* T */ ++#define IEI_WT61P803_PUZZLE_CMD_TEMP_ALL 0x41 /* A */ ++ ++#define IEI_WT61P803_PUZZLE_CMD_FAN 0x46 /* F */ ++#define IEI_WT61P803_PUZZLE_CMD_FAN_PWM_READ 0x5A /* Z */ ++#define IEI_WT61P803_PUZZLE_CMD_FAN_PWM_WRITE 0x57 /* W */ ++#define IEI_WT61P803_PUZZLE_CMD_FAN_PWM_BASE 0x30 ++#define IEI_WT61P803_PUZZLE_CMD_FAN_RPM_BASE 0x41 /* A */ ++ ++#define IEI_WT61P803_PUZZLE_CMD_FAN_PWM(x) (IEI_WT61P803_PUZZLE_CMD_FAN_PWM_BASE + (x)) /* 0 - 1 */ ++#define IEI_WT61P803_PUZZLE_CMD_FAN_RPM(x) (IEI_WT61P803_PUZZLE_CMD_FAN_RPM_BASE + (x)) /* 0 - 5 */ ++ ++struct iei_wt61p803_puzzle_mcu_version; ++struct iei_wt61p803_puzzle_reply; ++struct iei_wt61p803_puzzle; ++ ++int iei_wt61p803_puzzle_write_command_watchdog(struct iei_wt61p803_puzzle *mcu, ++ unsigned char *cmd, size_t size, ++ unsigned char *reply_data, size_t *reply_size, ++ int retry_count); ++ ++int iei_wt61p803_puzzle_write_command(struct iei_wt61p803_puzzle *mcu, ++ unsigned char *cmd, size_t size, ++ unsigned char *reply_data, size_t *reply_size); ++ ++#endif /* _MFD_IEI_WT61P803_PUZZLE_H_ */ diff --git a/target/linux/mvebu/patches-5.15/903-drivers-hwmon-Add-the-IEI-WT61P803-PUZZLE-HWMON-driv.patch b/target/linux/mvebu/patches-5.15/903-drivers-hwmon-Add-the-IEI-WT61P803-PUZZLE-HWMON-driv.patch new file mode 100644 index 0000000000..023495373b --- /dev/null +++ b/target/linux/mvebu/patches-5.15/903-drivers-hwmon-Add-the-IEI-WT61P803-PUZZLE-HWMON-driv.patch @@ -0,0 +1,501 @@ +From e3310a638cd310bfd93dbbc6d2732ab6aea18dd2 Mon Sep 17 00:00:00 2001 +From: Luka Kovacic +Date: Tue, 24 Aug 2021 12:44:34 +0000 +Subject: [PATCH 3/7] drivers: hwmon: Add the IEI WT61P803 PUZZLE HWMON driver + +Add the IEI WT61P803 PUZZLE HWMON driver, that handles the fan speed +control via PWM, reading fan speed and reading on-board temperature +sensors. + +The driver registers a HWMON device and a simple thermal cooling device to +enable in-kernel fan management. + +This driver depends on the IEI WT61P803 PUZZLE MFD driver. + +Signed-off-by: Luka Kovacic +Signed-off-by: Pavo Banicevic +Acked-by: Guenter Roeck +Cc: Luka Perkov +Cc: Robert Marko +--- + drivers/hwmon/Kconfig | 8 + + drivers/hwmon/Makefile | 1 + + drivers/hwmon/iei-wt61p803-puzzle-hwmon.c | 413 ++++++++++++++++++++++ + 3 files changed, 422 insertions(+) + create mode 100644 drivers/hwmon/iei-wt61p803-puzzle-hwmon.c + +--- a/drivers/hwmon/Kconfig ++++ b/drivers/hwmon/Kconfig +@@ -732,6 +732,14 @@ config SENSORS_IBMPOWERNV + This driver can also be built as a module. If so, the module + will be called ibmpowernv. + ++config SENSORS_IEI_WT61P803_PUZZLE_HWMON ++ tristate "IEI WT61P803 PUZZLE MFD HWMON Driver" ++ depends on MFD_IEI_WT61P803_PUZZLE ++ help ++ The IEI WT61P803 PUZZLE MFD HWMON Driver handles reading fan speed ++ and writing fan PWM values. It also supports reading on-board ++ temperature sensors. ++ + config SENSORS_IIO_HWMON + tristate "Hwmon driver that uses channels specified via iio maps" + depends on IIO +--- a/drivers/hwmon/Makefile ++++ b/drivers/hwmon/Makefile +@@ -84,6 +84,7 @@ obj-$(CONFIG_SENSORS_HIH6130) += hih6130 + obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o + obj-$(CONFIG_SENSORS_I5500) += i5500_temp.o + obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o ++obj-$(CONFIG_SENSORS_IEI_WT61P803_PUZZLE_HWMON) += iei-wt61p803-puzzle-hwmon.o + obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o + obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o + obj-$(CONFIG_SENSORS_IBMPOWERNV)+= ibmpowernv.o +--- /dev/null ++++ b/drivers/hwmon/iei-wt61p803-puzzle-hwmon.c +@@ -0,0 +1,445 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* IEI WT61P803 PUZZLE MCU HWMON Driver ++ * ++ * Copyright (C) 2020 Sartura Ltd. ++ * Author: Luka Kovacic ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define IEI_WT61P803_PUZZLE_HWMON_MAX_PWM 2 ++#define IEI_WT61P803_PUZZLE_HWMON_MAX_PWM_VAL 255 ++ ++/** ++ * struct iei_wt61p803_puzzle_thermal_cooling_device - Thermal cooling device instance ++ * @mcu_hwmon: Parent driver struct pointer ++ * @tcdev: Thermal cooling device pointer ++ * @name: Thermal cooling device name ++ * @pwm_channel: Controlled PWM channel (0 or 1) ++ * @cooling_levels: Thermal cooling device cooling levels (DT) ++ * @cur_level: Current cooling level ++ * @num_levels: Number of cooling levels ++ */ ++struct iei_wt61p803_puzzle_thermal_cooling_device { ++ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon; ++ struct thermal_cooling_device *tcdev; ++ char name[THERMAL_NAME_LENGTH]; ++ int pwm_channel; ++ u32 *cooling_levels; ++ int cur_level; ++ u8 num_levels; ++}; ++ ++/** ++ * struct iei_wt61p803_puzzle_hwmon - MCU HWMON Driver ++ * @mcu: MCU struct pointer ++ * @response_buffer Global MCU response buffer ++ * @thermal_cooling_dev_present: Per-channel thermal cooling device control indicator ++ * @cdev: Per-channel thermal cooling device private structure ++ */ ++struct iei_wt61p803_puzzle_hwmon { ++ struct iei_wt61p803_puzzle *mcu; ++ unsigned char response_buffer[IEI_WT61P803_PUZZLE_BUF_SIZE]; ++ bool thermal_cooling_dev_present[IEI_WT61P803_PUZZLE_HWMON_MAX_PWM]; ++ struct iei_wt61p803_puzzle_thermal_cooling_device ++ *cdev[IEI_WT61P803_PUZZLE_HWMON_MAX_PWM]; ++ struct mutex lock; /* mutex to protect response_buffer array */ ++}; ++ ++#define raw_temp_to_milidegree_celsius(x) (((x) - 0x80) * 1000) ++static int iei_wt61p803_puzzle_read_temp_sensor(struct iei_wt61p803_puzzle_hwmon *mcu_hwmon, ++ int channel, long *value) ++{ ++ unsigned char *resp_buf = mcu_hwmon->response_buffer; ++ unsigned char temp_sensor_ntc_cmd[4] = { ++ IEI_WT61P803_PUZZLE_CMD_HEADER_START, ++ IEI_WT61P803_PUZZLE_CMD_TEMP, ++ IEI_WT61P803_PUZZLE_CMD_TEMP_ALL, ++ }; ++ size_t reply_size; ++ int ret; ++ ++ mutex_lock(&mcu_hwmon->lock); ++ ret = iei_wt61p803_puzzle_write_command(mcu_hwmon->mcu, temp_sensor_ntc_cmd, ++ sizeof(temp_sensor_ntc_cmd), resp_buf, ++ &reply_size); ++ if (ret) ++ goto exit; ++ ++ if (reply_size != 7) { ++ ret = -EIO; ++ goto exit; ++ } ++ ++ /* Check the number of NTC values */ ++ if (resp_buf[3] != '2') { ++ ret = -EIO; ++ goto exit; ++ } ++ ++ *value = raw_temp_to_milidegree_celsius(resp_buf[4 + channel]); ++exit: ++ mutex_unlock(&mcu_hwmon->lock); ++ return ret; ++} ++ ++#define raw_fan_val_to_rpm(x, y) ((((x) << 8 | (y)) / 2) * 60) ++static int iei_wt61p803_puzzle_read_fan_speed(struct iei_wt61p803_puzzle_hwmon *mcu_hwmon, ++ int channel, long *value) ++{ ++ unsigned char *resp_buf = mcu_hwmon->response_buffer; ++ unsigned char fan_speed_cmd[4] = {}; ++ size_t reply_size; ++ int ret; ++ ++ fan_speed_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; ++ fan_speed_cmd[1] = IEI_WT61P803_PUZZLE_CMD_FAN; ++ fan_speed_cmd[2] = IEI_WT61P803_PUZZLE_CMD_FAN_RPM(channel); ++ ++ mutex_lock(&mcu_hwmon->lock); ++ ret = iei_wt61p803_puzzle_write_command(mcu_hwmon->mcu, fan_speed_cmd, ++ sizeof(fan_speed_cmd), resp_buf, ++ &reply_size); ++ if (ret) ++ goto exit; ++ ++ if (reply_size != 7) { ++ ret = -EIO; ++ goto exit; ++ } ++ ++ *value = raw_fan_val_to_rpm(resp_buf[3], resp_buf[4]); ++exit: ++ mutex_unlock(&mcu_hwmon->lock); ++ return ret; ++} ++ ++static int iei_wt61p803_puzzle_write_pwm_channel(struct iei_wt61p803_puzzle_hwmon *mcu_hwmon, ++ int channel, long pwm_set_val) ++{ ++ unsigned char *resp_buf = mcu_hwmon->response_buffer; ++ unsigned char pwm_set_cmd[6] = {}; ++ size_t reply_size; ++ int ret; ++ ++ pwm_set_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; ++ pwm_set_cmd[1] = IEI_WT61P803_PUZZLE_CMD_FAN; ++ pwm_set_cmd[2] = IEI_WT61P803_PUZZLE_CMD_FAN_PWM_WRITE; ++ pwm_set_cmd[3] = IEI_WT61P803_PUZZLE_CMD_FAN_PWM(channel); ++ pwm_set_cmd[4] = pwm_set_val; ++ ++ mutex_lock(&mcu_hwmon->lock); ++ ret = iei_wt61p803_puzzle_write_command(mcu_hwmon->mcu, pwm_set_cmd, ++ sizeof(pwm_set_cmd), resp_buf, ++ &reply_size); ++ if (ret) ++ goto exit; ++ ++ if (reply_size != 3) { ++ ret = -EIO; ++ goto exit; ++ } ++ ++ if (!(resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && ++ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK && ++ resp_buf[2] == IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK)) { ++ ret = -EIO; ++ goto exit; ++ } ++exit: ++ mutex_unlock(&mcu_hwmon->lock); ++ return ret; ++} ++ ++static int iei_wt61p803_puzzle_read_pwm_channel(struct iei_wt61p803_puzzle_hwmon *mcu_hwmon, ++ int channel, long *value) ++{ ++ unsigned char *resp_buf = mcu_hwmon->response_buffer; ++ unsigned char pwm_get_cmd[5] = {}; ++ size_t reply_size; ++ int ret; ++ ++ pwm_get_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; ++ pwm_get_cmd[1] = IEI_WT61P803_PUZZLE_CMD_FAN; ++ pwm_get_cmd[2] = IEI_WT61P803_PUZZLE_CMD_FAN_PWM_READ; ++ pwm_get_cmd[3] = IEI_WT61P803_PUZZLE_CMD_FAN_PWM(channel); ++ ++ ret = iei_wt61p803_puzzle_write_command(mcu_hwmon->mcu, pwm_get_cmd, ++ sizeof(pwm_get_cmd), resp_buf, ++ &reply_size); ++ if (ret) ++ return ret; ++ ++ if (reply_size != 5) ++ return -EIO; ++ ++ if (resp_buf[2] != IEI_WT61P803_PUZZLE_CMD_FAN_PWM_READ) ++ return -EIO; ++ ++ *value = resp_buf[3]; ++ ++ return 0; ++} ++ ++static int iei_wt61p803_puzzle_read(struct device *dev, enum hwmon_sensor_types type, ++ u32 attr, int channel, long *val) ++{ ++ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon = dev_get_drvdata(dev->parent); ++ ++ switch (type) { ++ case hwmon_pwm: ++ return iei_wt61p803_puzzle_read_pwm_channel(mcu_hwmon, channel, val); ++ case hwmon_fan: ++ return iei_wt61p803_puzzle_read_fan_speed(mcu_hwmon, channel, val); ++ case hwmon_temp: ++ return iei_wt61p803_puzzle_read_temp_sensor(mcu_hwmon, channel, val); ++ default: ++ return -EINVAL; ++ } ++} ++ ++static int iei_wt61p803_puzzle_write(struct device *dev, enum hwmon_sensor_types type, ++ u32 attr, int channel, long val) ++{ ++ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon = dev_get_drvdata(dev->parent); ++ ++ return iei_wt61p803_puzzle_write_pwm_channel(mcu_hwmon, channel, val); ++} ++ ++static umode_t iei_wt61p803_puzzle_is_visible(const void *data, enum hwmon_sensor_types type, ++ u32 attr, int channel) ++{ ++ const struct iei_wt61p803_puzzle_hwmon *mcu_hwmon = data; ++ ++ switch (type) { ++ case hwmon_pwm: ++ if (mcu_hwmon->thermal_cooling_dev_present[channel]) ++ return 0444; ++ if (attr == hwmon_pwm_input) ++ return 0644; ++ break; ++ case hwmon_fan: ++ if (attr == hwmon_fan_input) ++ return 0444; ++ break; ++ case hwmon_temp: ++ if (attr == hwmon_temp_input) ++ return 0444; ++ break; ++ default: ++ return 0; ++ } ++ ++ return 0; ++} ++ ++static const struct hwmon_ops iei_wt61p803_puzzle_hwmon_ops = { ++ .is_visible = iei_wt61p803_puzzle_is_visible, ++ .read = iei_wt61p803_puzzle_read, ++ .write = iei_wt61p803_puzzle_write, ++}; ++ ++static const struct hwmon_channel_info *iei_wt61p803_puzzle_info[] = { ++ HWMON_CHANNEL_INFO(pwm, ++ HWMON_PWM_INPUT, ++ HWMON_PWM_INPUT), ++ HWMON_CHANNEL_INFO(fan, ++ HWMON_F_INPUT, ++ HWMON_F_INPUT, ++ HWMON_F_INPUT, ++ HWMON_F_INPUT, ++ HWMON_F_INPUT), ++ HWMON_CHANNEL_INFO(temp, ++ HWMON_T_INPUT, ++ HWMON_T_INPUT), ++ NULL ++}; ++ ++static const struct hwmon_chip_info iei_wt61p803_puzzle_chip_info = { ++ .ops = &iei_wt61p803_puzzle_hwmon_ops, ++ .info = iei_wt61p803_puzzle_info, ++}; ++ ++static int iei_wt61p803_puzzle_get_max_state(struct thermal_cooling_device *tcdev, ++ unsigned long *state) ++{ ++ struct iei_wt61p803_puzzle_thermal_cooling_device *cdev = tcdev->devdata; ++ ++ if (!cdev) ++ return -EINVAL; ++ ++ *state = cdev->num_levels - 1; ++ return 0; ++} ++ ++static int iei_wt61p803_puzzle_get_cur_state(struct thermal_cooling_device *tcdev, ++ unsigned long *state) ++{ ++ struct iei_wt61p803_puzzle_thermal_cooling_device *cdev = tcdev->devdata; ++ ++ if (!cdev) ++ return -EINVAL; ++ ++ if (cdev->cur_level < 0) ++ return -EAGAIN; ++ ++ *state = cdev->cur_level; ++ return 0; ++} ++ ++static int iei_wt61p803_puzzle_set_cur_state(struct thermal_cooling_device *tcdev, ++ unsigned long state) ++{ ++ struct iei_wt61p803_puzzle_thermal_cooling_device *cdev = tcdev->devdata; ++ u8 pwm_level; ++ ++ if (!cdev) ++ return -EINVAL; ++ ++ if (state >= cdev->num_levels) ++ return -EINVAL; ++ ++ if (state == cdev->cur_level) ++ return 0; ++ ++ cdev->cur_level = state; ++ pwm_level = cdev->cooling_levels[state]; ++ ++ return iei_wt61p803_puzzle_write_pwm_channel(cdev->mcu_hwmon, cdev->pwm_channel, pwm_level); ++} ++ ++static const struct thermal_cooling_device_ops iei_wt61p803_puzzle_cooling_ops = { ++ .get_max_state = iei_wt61p803_puzzle_get_max_state, ++ .get_cur_state = iei_wt61p803_puzzle_get_cur_state, ++ .set_cur_state = iei_wt61p803_puzzle_set_cur_state, ++}; ++ ++static int ++iei_wt61p803_puzzle_enable_thermal_cooling_dev(struct device *dev, ++ struct fwnode_handle *child, ++ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon) ++{ ++ struct iei_wt61p803_puzzle_thermal_cooling_device *cdev; ++ u32 pwm_channel; ++ u8 num_levels; ++ int i, ret; ++ ++ ret = fwnode_property_read_u32(child, "reg", &pwm_channel); ++ if (ret) ++ return ret; ++ ++ mcu_hwmon->thermal_cooling_dev_present[pwm_channel] = true; ++ ++ num_levels = fwnode_property_count_u32(child, "cooling-levels"); ++ if (!num_levels) ++ return -EINVAL; ++ ++ cdev = devm_kzalloc(dev, sizeof(*cdev), GFP_KERNEL); ++ if (!cdev) ++ return -ENOMEM; ++ ++ cdev->cooling_levels = devm_kmalloc_array(dev, num_levels, sizeof(u32), GFP_KERNEL); ++ if (!cdev->cooling_levels) ++ return -ENOMEM; ++ ++ ret = fwnode_property_read_u32_array(child, "cooling-levels", ++ cdev->cooling_levels, ++ num_levels); ++ if (ret) { ++ dev_err(dev, "Couldn't read property 'cooling-levels'\n"); ++ return ret; ++ } ++ ++ for (i = 0; i < num_levels; i++) { ++ if (cdev->cooling_levels[i] > ++ IEI_WT61P803_PUZZLE_HWMON_MAX_PWM_VAL) { ++ dev_err(dev, "iei_wt61p803_fan state[%d]:%d > %d\n", i, ++ cdev->cooling_levels[i], ++ IEI_WT61P803_PUZZLE_HWMON_MAX_PWM_VAL); ++ return -EINVAL; ++ } ++ } ++ ++ cdev->mcu_hwmon = mcu_hwmon; ++ cdev->pwm_channel = pwm_channel; ++ cdev->num_levels = num_levels; ++ cdev->cur_level = -1; ++ mcu_hwmon->cdev[pwm_channel] = cdev; ++ ++ snprintf(cdev->name, THERMAL_NAME_LENGTH, "wt61p803_puzzle_%d", pwm_channel); ++ cdev->tcdev = devm_thermal_of_cooling_device_register(dev, to_of_node(child), cdev->name, ++ cdev, &iei_wt61p803_puzzle_cooling_ops); ++ if (IS_ERR(cdev->tcdev)) ++ return PTR_ERR(cdev->tcdev); ++ ++ return 0; ++} ++ ++static int iei_wt61p803_puzzle_hwmon_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct iei_wt61p803_puzzle *mcu = dev_get_drvdata(dev->parent); ++ struct iei_wt61p803_puzzle_hwmon *mcu_hwmon; ++ struct fwnode_handle *child; ++ struct device *hwmon_dev; ++ int ret; ++ ++ mcu_hwmon = devm_kzalloc(dev, sizeof(*mcu_hwmon), GFP_KERNEL); ++ if (!mcu_hwmon) ++ return -ENOMEM; ++ ++ mcu_hwmon->mcu = mcu; ++ platform_set_drvdata(pdev, mcu_hwmon); ++ mutex_init(&mcu_hwmon->lock); ++ ++ hwmon_dev = devm_hwmon_device_register_with_info(dev, "iei_wt61p803_puzzle", ++ mcu_hwmon, ++ &iei_wt61p803_puzzle_chip_info, ++ NULL); ++ if (IS_ERR(hwmon_dev)) ++ return PTR_ERR(hwmon_dev); ++ ++ /* Control fans via PWM lines via Linux Kernel */ ++ if (IS_ENABLED(CONFIG_THERMAL)) { ++ device_for_each_child_node(dev, child) { ++ ret = iei_wt61p803_puzzle_enable_thermal_cooling_dev(dev, child, mcu_hwmon); ++ if (ret) { ++ dev_err(dev, "Enabling the PWM fan failed\n"); ++ fwnode_handle_put(child); ++ return ret; ++ } ++ } ++ } ++ return 0; ++} ++ ++static const struct of_device_id iei_wt61p803_puzzle_hwmon_id_table[] = { ++ { .compatible = "iei,wt61p803-puzzle-hwmon" }, ++ {} ++}; ++MODULE_DEVICE_TABLE(of, iei_wt61p803_puzzle_hwmon_id_table); ++ ++static struct platform_driver iei_wt61p803_puzzle_hwmon_driver = { ++ .driver = { ++ .name = "iei-wt61p803-puzzle-hwmon", ++ .of_match_table = iei_wt61p803_puzzle_hwmon_id_table, ++ }, ++ .probe = iei_wt61p803_puzzle_hwmon_probe, ++}; ++ ++module_platform_driver(iei_wt61p803_puzzle_hwmon_driver); ++ ++MODULE_DESCRIPTION("IEI WT61P803 PUZZLE MCU HWMON Driver"); ++MODULE_AUTHOR("Luka Kovacic "); ++MODULE_LICENSE("GPL v2"); diff --git a/target/linux/mvebu/patches-5.15/904-drivers-leds-Add-the-IEI-WT61P803-PUZZLE-LED-driver.patch b/target/linux/mvebu/patches-5.15/904-drivers-leds-Add-the-IEI-WT61P803-PUZZLE-LED-driver.patch new file mode 100644 index 0000000000..a3fc731c47 --- /dev/null +++ b/target/linux/mvebu/patches-5.15/904-drivers-leds-Add-the-IEI-WT61P803-PUZZLE-LED-driver.patch @@ -0,0 +1,207 @@ +From f3b44eb69cc561cf05d00506dcec0dd9be003ed8 Mon Sep 17 00:00:00 2001 +From: Luka Kovacic +Date: Tue, 24 Aug 2021 12:44:35 +0000 +Subject: [PATCH 4/7] drivers: leds: Add the IEI WT61P803 PUZZLE LED driver + +Add support for the IEI WT61P803 PUZZLE LED driver. +Currently only the front panel power LED is supported, +since it is the only LED on this board wired through the +MCU. + +The LED is wired directly to the on-board MCU controller +and is toggled using an MCU command. + +Support for more LEDs is going to be added in case more +boards implement this microcontroller, as LEDs use many +different GPIOs. + +This driver depends on the IEI WT61P803 PUZZLE MFD driver. + +Signed-off-by: Luka Kovacic +Signed-off-by: Pavo Banicevic +Cc: Luka Perkov +Cc: Robert Marko +--- + drivers/leds/Kconfig | 8 ++ + drivers/leds/Makefile | 1 + + drivers/leds/leds-iei-wt61p803-puzzle.c | 147 ++++++++++++++++++++++++ + 3 files changed, 156 insertions(+) + create mode 100644 drivers/leds/leds-iei-wt61p803-puzzle.c + +--- a/drivers/leds/Kconfig ++++ b/drivers/leds/Kconfig +@@ -306,6 +306,14 @@ config LEDS_IPAQ_MICRO + Choose this option if you want to use the notification LED on + Compaq/HP iPAQ h3100 and h3600. + ++config LEDS_IEI_WT61P803_PUZZLE ++ tristate "LED Support for the IEI WT61P803 PUZZLE MCU" ++ depends on LEDS_CLASS ++ depends on MFD_IEI_WT61P803_PUZZLE ++ help ++ This option enables support for LEDs controlled by the IEI WT61P803 ++ M801 MCU. ++ + config LEDS_HP6XX + tristate "LED Support for the HP Jornada 6xx" + depends on LEDS_CLASS +--- a/drivers/leds/Makefile ++++ b/drivers/leds/Makefile +@@ -33,6 +33,7 @@ obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx. + obj-$(CONFIG_LEDS_INTEL_SS4200) += leds-ss4200.o + obj-$(CONFIG_LEDS_IP30) += leds-ip30.o + obj-$(CONFIG_LEDS_IPAQ_MICRO) += leds-ipaq-micro.o ++obj-$(CONFIG_LEDS_IEI_WT61P803_PUZZLE) += leds-iei-wt61p803-puzzle.o + obj-$(CONFIG_LEDS_IS31FL319X) += leds-is31fl319x.o + obj-$(CONFIG_LEDS_IS31FL32XX) += leds-is31fl32xx.o + obj-$(CONFIG_LEDS_LM3530) += leds-lm3530.o +--- /dev/null ++++ b/drivers/leds/leds-iei-wt61p803-puzzle.c +@@ -0,0 +1,147 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* IEI WT61P803 PUZZLE MCU LED Driver ++ * ++ * Copyright (C) 2020 Sartura Ltd. ++ * Author: Luka Kovacic ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++enum iei_wt61p803_puzzle_led_state { ++ IEI_LED_OFF = 0x30, ++ IEI_LED_ON = 0x31, ++ IEI_LED_BLINK_5HZ = 0x32, ++ IEI_LED_BLINK_1HZ = 0x33, ++}; ++ ++/** ++ * struct iei_wt61p803_puzzle_led - MCU LED Driver ++ * @cdev: LED classdev ++ * @mcu: MCU struct pointer ++ * @response_buffer Global MCU response buffer ++ * @lock: General mutex lock to protect simultaneous R/W access to led_power_state ++ * @led_power_state: State of the front panel power LED ++ */ ++struct iei_wt61p803_puzzle_led { ++ struct led_classdev cdev; ++ struct iei_wt61p803_puzzle *mcu; ++ unsigned char response_buffer[IEI_WT61P803_PUZZLE_BUF_SIZE]; ++ struct mutex lock; /* mutex to protect led_power_state */ ++ int led_power_state; ++}; ++ ++static inline struct iei_wt61p803_puzzle_led *cdev_to_iei_wt61p803_puzzle_led ++ (struct led_classdev *led_cdev) ++{ ++ return container_of(led_cdev, struct iei_wt61p803_puzzle_led, cdev); ++} ++ ++static int iei_wt61p803_puzzle_led_brightness_set_blocking(struct led_classdev *cdev, ++ enum led_brightness brightness) ++{ ++ struct iei_wt61p803_puzzle_led *priv = cdev_to_iei_wt61p803_puzzle_led(cdev); ++ unsigned char *resp_buf = priv->response_buffer; ++ unsigned char led_power_cmd[5] = {}; ++ size_t reply_size; ++ int ret; ++ ++ led_power_cmd[0] = IEI_WT61P803_PUZZLE_CMD_HEADER_START; ++ led_power_cmd[1] = IEI_WT61P803_PUZZLE_CMD_LED; ++ led_power_cmd[2] = IEI_WT61P803_PUZZLE_CMD_LED_POWER; ++ led_power_cmd[3] = brightness == LED_OFF ? IEI_LED_OFF : IEI_LED_ON; ++ ++ ret = iei_wt61p803_puzzle_write_command(priv->mcu, led_power_cmd, ++ sizeof(led_power_cmd), ++ resp_buf, ++ &reply_size); ++ if (ret) ++ return ret; ++ ++ if (reply_size != 3) ++ return -EIO; ++ ++ if (!(resp_buf[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && ++ resp_buf[1] == IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK && ++ resp_buf[2] == IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK)) ++ return -EIO; ++ ++ mutex_lock(&priv->lock); ++ priv->led_power_state = brightness; ++ mutex_unlock(&priv->lock); ++ ++ return 0; ++} ++ ++static enum led_brightness iei_wt61p803_puzzle_led_brightness_get(struct led_classdev *cdev) ++{ ++ struct iei_wt61p803_puzzle_led *priv = cdev_to_iei_wt61p803_puzzle_led(cdev); ++ int led_state; ++ ++ mutex_lock(&priv->lock); ++ led_state = priv->led_power_state; ++ mutex_unlock(&priv->lock); ++ ++ return led_state; ++} ++ ++static int iei_wt61p803_puzzle_led_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct iei_wt61p803_puzzle *mcu = dev_get_drvdata(dev->parent); ++ struct iei_wt61p803_puzzle_led *priv; ++ struct led_init_data init_data = {}; ++ struct fwnode_handle *child; ++ int ret; ++ ++ if (device_get_child_node_count(dev) != 1) ++ return -EINVAL; ++ ++ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ priv->mcu = mcu; ++ priv->led_power_state = 1; ++ mutex_init(&priv->lock); ++ dev_set_drvdata(dev, priv); ++ ++ child = device_get_next_child_node(dev, NULL); ++ init_data.fwnode = child; ++ ++ priv->cdev.brightness_set_blocking = iei_wt61p803_puzzle_led_brightness_set_blocking; ++ priv->cdev.brightness_get = iei_wt61p803_puzzle_led_brightness_get; ++ priv->cdev.max_brightness = 1; ++ ++ ret = devm_led_classdev_register_ext(dev, &priv->cdev, &init_data); ++ if (ret) ++ dev_err(dev, "Could not register LED\n"); ++ ++ fwnode_handle_put(child); ++ return ret; ++} ++ ++static const struct of_device_id iei_wt61p803_puzzle_led_of_match[] = { ++ { .compatible = "iei,wt61p803-puzzle-leds" }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, iei_wt61p803_puzzle_led_of_match); ++ ++static struct platform_driver iei_wt61p803_puzzle_led_driver = { ++ .driver = { ++ .name = "iei-wt61p803-puzzle-led", ++ .of_match_table = iei_wt61p803_puzzle_led_of_match, ++ }, ++ .probe = iei_wt61p803_puzzle_led_probe, ++}; ++module_platform_driver(iei_wt61p803_puzzle_led_driver); ++ ++MODULE_DESCRIPTION("IEI WT61P803 PUZZLE front panel LED driver"); ++MODULE_AUTHOR("Luka Kovacic "); ++MODULE_LICENSE("GPL v2"); ++MODULE_ALIAS("platform:leds-iei-wt61p803-puzzle"); diff --git a/target/linux/mvebu/patches-5.10/905-Documentation-ABI-Add-iei-wt61p803-puzzle-driver-sys.patch b/target/linux/mvebu/patches-5.15/905-Documentation-ABI-Add-iei-wt61p803-puzzle-driver-sys.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/905-Documentation-ABI-Add-iei-wt61p803-puzzle-driver-sys.patch rename to target/linux/mvebu/patches-5.15/905-Documentation-ABI-Add-iei-wt61p803-puzzle-driver-sys.patch diff --git a/target/linux/mvebu/patches-5.15/906-Documentation-hwmon-Add-iei-wt61p803-puzzle-hwmon-dr.patch b/target/linux/mvebu/patches-5.15/906-Documentation-hwmon-Add-iei-wt61p803-puzzle-hwmon-dr.patch new file mode 100644 index 0000000000..9015436f6a --- /dev/null +++ b/target/linux/mvebu/patches-5.15/906-Documentation-hwmon-Add-iei-wt61p803-puzzle-hwmon-dr.patch @@ -0,0 +1,74 @@ +From 0aff3e5923fecc6842473ad07a688d6e2f2c2d55 Mon Sep 17 00:00:00 2001 +From: Luka Kovacic +Date: Tue, 24 Aug 2021 12:44:37 +0000 +Subject: [PATCH 6/7] Documentation/hwmon: Add iei-wt61p803-puzzle hwmon driver + documentation + +Add the iei-wt61p803-puzzle driver hwmon driver interface documentation. + +Signed-off-by: Luka Kovacic +Signed-off-by: Pavo Banicevic +Cc: Luka Perkov +Cc: Robert Marko +--- + .../hwmon/iei-wt61p803-puzzle-hwmon.rst | 43 +++++++++++++++++++ + Documentation/hwmon/index.rst | 1 + + 2 files changed, 44 insertions(+) + create mode 100644 Documentation/hwmon/iei-wt61p803-puzzle-hwmon.rst + +--- /dev/null ++++ b/Documentation/hwmon/iei-wt61p803-puzzle-hwmon.rst +@@ -0,0 +1,43 @@ ++.. SPDX-License-Identifier: GPL-2.0-only ++ ++Kernel driver iei-wt61p803-puzzle-hwmon ++======================================= ++ ++Supported chips: ++ * IEI WT61P803 PUZZLE for IEI Puzzle M801 ++ ++ Prefix: 'iei-wt61p803-puzzle-hwmon' ++ ++Author: Luka Kovacic ++ ++ ++Description ++----------- ++ ++This driver adds fan and temperature sensor reading for some IEI Puzzle ++series boards. ++ ++Sysfs attributes ++---------------- ++ ++The following attributes are supported: ++ ++- IEI WT61P803 PUZZLE for IEI Puzzle M801 ++ ++/sys files in hwmon subsystem ++----------------------------- ++ ++================= == ===================================================== ++fan[1-5]_input RO files for fan speed (in RPM) ++pwm[1-2] RW files for fan[1-2] target duty cycle (0..255) ++temp[1-2]_input RO files for temperature sensors, in millidegree Celsius ++================= == ===================================================== ++ ++/sys files in thermal subsystem ++------------------------------- ++ ++================= == ===================================================== ++cur_state RW file for current cooling state of the cooling device ++ (0..max_state) ++max_state RO file for maximum cooling state of the cooling device ++================= == ===================================================== +--- a/Documentation/hwmon/index.rst ++++ b/Documentation/hwmon/index.rst +@@ -74,6 +74,7 @@ Hardware Monitoring Kernel Drivers + ibmaem + ibm-cffps + ibmpowernv ++ iei-wt61p803-puzzle-hwmon + ina209 + ina2xx + ina3221 diff --git a/target/linux/mvebu/patches-5.15/907-MAINTAINERS-Add-an-entry-for-the-IEI-WT61P803-PUZZLE.patch b/target/linux/mvebu/patches-5.15/907-MAINTAINERS-Add-an-entry-for-the-IEI-WT61P803-PUZZLE.patch new file mode 100644 index 0000000000..0b6891343d --- /dev/null +++ b/target/linux/mvebu/patches-5.15/907-MAINTAINERS-Add-an-entry-for-the-IEI-WT61P803-PUZZLE.patch @@ -0,0 +1,41 @@ +From 12479baad28d2a08c6cb9e83471057635fa1635c Mon Sep 17 00:00:00 2001 +From: Luka Kovacic +Date: Tue, 24 Aug 2021 12:44:38 +0000 +Subject: [PATCH 7/7] MAINTAINERS: Add an entry for the IEI WT61P803 PUZZLE + driver + +Add an entry for the IEI WT61P803 PUZZLE driver (MFD, HWMON, LED drivers). + +Signed-off-by: Luka Kovacic +Signed-off-by: Pavo Banicevic +Cc: Luka Perkov +Cc: Robert Marko +--- + MAINTAINERS | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -9057,6 +9057,22 @@ F: include/net/nl802154.h + F: net/ieee802154/ + F: net/mac802154/ + ++IEI WT61P803 M801 MFD DRIVER ++M: Luka Kovacic ++M: Luka Perkov ++M: Goran Medic ++L: linux-kernel@vger.kernel.org ++S: Maintained ++F: Documentation/ABI/stable/sysfs-driver-iei-wt61p803-puzzle ++F: Documentation/devicetree/bindings/hwmon/iei,wt61p803-puzzle-hwmon.yaml ++F: Documentation/devicetree/bindings/leds/iei,wt61p803-puzzle-leds.yaml ++F: Documentation/devicetree/bindings/mfd/iei,wt61p803-puzzle.yaml ++F: Documentation/hwmon/iei-wt61p803-puzzle-hwmon.rst ++F: drivers/hwmon/iei-wt61p803-puzzle-hwmon.c ++F: drivers/leds/leds-iei-wt61p803-puzzle.c ++F: drivers/mfd/iei-wt61p803-puzzle.c ++F: include/linux/mfd/iei-wt61p803-puzzle.h ++ + IFE PROTOCOL + M: Yotam Gigi + M: Jamal Hadi Salim diff --git a/target/linux/mvebu/patches-5.10/910-drivers-leds-wt61p803-puzzle-improvements.patch b/target/linux/mvebu/patches-5.15/910-drivers-leds-wt61p803-puzzle-improvements.patch similarity index 100% rename from target/linux/mvebu/patches-5.10/910-drivers-leds-wt61p803-puzzle-improvements.patch rename to target/linux/mvebu/patches-5.15/910-drivers-leds-wt61p803-puzzle-improvements.patch diff --git a/target/linux/mvebu/patches-5.15/911-drivers-leds-wt61p803-puzzle-mcu-retry.patch b/target/linux/mvebu/patches-5.15/911-drivers-leds-wt61p803-puzzle-mcu-retry.patch new file mode 100644 index 0000000000..2f0b1788ff --- /dev/null +++ b/target/linux/mvebu/patches-5.15/911-drivers-leds-wt61p803-puzzle-mcu-retry.patch @@ -0,0 +1,63 @@ +--- a/drivers/mfd/iei-wt61p803-puzzle.c ++++ b/drivers/mfd/iei-wt61p803-puzzle.c +@@ -241,6 +241,7 @@ int iei_wt61p803_puzzle_write_command(st + { + struct device *dev = &mcu->serdev->dev; + int ret; ++ int retries; + + if (size <= 1 || size > IEI_WT61P803_PUZZLE_MAX_COMMAND_LENGTH) + return -EINVAL; +@@ -252,24 +253,36 @@ int iei_wt61p803_puzzle_write_command(st + print_hex_dump_debug("puzzle-mcu tx: ", DUMP_PREFIX_NONE, + 16, 1, cmd, size, false); + ++ retries = 3; + /* Initialize reply struct */ +- reinit_completion(&mcu->reply->received); +- mcu->reply->size = 0; +- usleep_range(2000, 10000); +- serdev_device_write_flush(mcu->serdev); +- ret = serdev_device_write_buf(mcu->serdev, cmd, size); +- if (ret < 0) +- goto exit; +- +- serdev_device_wait_until_sent(mcu->serdev, IEI_WT61P803_PUZZLE_GENERAL_TIMEOUT); +- ret = wait_for_completion_timeout(&mcu->reply->received, +- IEI_WT61P803_PUZZLE_GENERAL_TIMEOUT); +- if (ret == 0) { +- dev_err(dev, "Command reply receive timeout\n"); +- ret = -ETIMEDOUT; +- goto exit; ++ while (retries) { ++ reinit_completion(&mcu->reply->received); ++ mcu->reply->size = 0; ++ usleep_range(2000, 10000); ++ serdev_device_write_flush(mcu->serdev); ++ ret = serdev_device_write_buf(mcu->serdev, cmd, size); ++ if (ret < 0) ++ goto exit; ++ ++ serdev_device_wait_until_sent(mcu->serdev, IEI_WT61P803_PUZZLE_GENERAL_TIMEOUT); ++ ret = wait_for_completion_timeout(&mcu->reply->received, ++ IEI_WT61P803_PUZZLE_GENERAL_TIMEOUT); ++ retries--; ++ if (ret == 0) { ++ if (retries == 0) { ++ dev_err(dev, "Command reply receive timeout\n"); ++ ret = -ETIMEDOUT; ++ goto exit; ++ } ++ } ++ else { ++ if (mcu->reply->data[0] == IEI_WT61P803_PUZZLE_CMD_HEADER_START && ++ mcu->reply->data[1] == IEI_WT61P803_PUZZLE_CMD_RESPONSE_OK && ++ mcu->reply->data[2] == IEI_WT61P803_PUZZLE_CHECKSUM_RESPONSE_OK) { ++ break; ++ } ++ } + } +- + *reply_size = mcu->reply->size; + /* Copy the received data, as it will not be available after a new frame is received */ + memcpy(reply_data, mcu->reply->data, mcu->reply->size); diff --git a/target/linux/rockchip/Makefile b/target/linux/rockchip/Makefile index 0245f02eac..7b04bfdb21 100644 --- a/target/linux/rockchip/Makefile +++ b/target/linux/rockchip/Makefile @@ -7,7 +7,7 @@ BOARDNAME:=Rockchip FEATURES:=ext4 audio usb usbgadget display gpio fpu pci pcie rootfs-part boot-part squashfs SUBTARGETS:=armv8 -KERNEL_PATCHVER=5.10 +KERNEL_PATCHVER:=5.15 define Target/Description Build firmware image for Rockchip SoC devices. diff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds index 87a799266a..34e2d250cd 100644 --- a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds +++ b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds @@ -8,12 +8,12 @@ boardname="${board##*,}" board_config_update case $board in +friendlyarm,nanopi-r2c|\ friendlyarm,nanopi-r2s|\ -thinkpenguin,tpe-r1400) - ucidef_set_led_netdev "wan" "WAN" "$boardname:green:wan" "eth0" - ucidef_set_led_netdev "lan" "LAN" "$boardname:green:lan" "eth1" - ;; -friendlyarm,nanopi-r4s) +friendlyarm,nanopi-r4s|\ +thinkpenguin,tpe-r1400|\ +xunlong,orangepi-r1-plus|\ +xunlong,orangepi-r1-plus-lts) ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth0" ucidef_set_led_netdev "lan" "LAN" "green:lan" "eth1" ;; diff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network index d9feb03551..3c47fc80b6 100644 --- a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network +++ b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network @@ -7,9 +7,12 @@ rockchip_setup_interfaces() local board="$1" case "$board" in + friendlyarm,nanopi-r2c|\ friendlyarm,nanopi-r2s|\ + friendlyarm,nanopi-r4s|\ thinkpenguin,tpe-r1400|\ - friendlyarm,nanopi-r4s) + xunlong,orangepi-r1-plus|\ + xunlong,orangepi-r1-plus-lts) ucidef_set_interfaces_lan_wan 'eth1' 'eth0' ;; *) @@ -18,15 +21,6 @@ rockchip_setup_interfaces() esac } -generate_mac_from_mmc_cid() -{ - local mmc_dev=$1 - - local sd_hash=$(sha256sum /sys/class/block/$mmc_dev/device/cid) - local mac_base=$(macaddr_canonicalize "$(echo "${sd_hash}" | dd bs=1 count=12 2>/dev/null)") - echo "$(macaddr_unsetbit_mc "$(macaddr_setbit_la "${mac_base}")")" -} - nanopi_r4s_get_mac() { local interface=$1 @@ -39,7 +33,7 @@ nanopi_r4s_get_mac() address=$(macaddr_setbit_la "$address") fi else - address=$(generate_mac_from_mmc_cid mmcblk1) + address=$(macaddr_generate_from_mmc_cid mmcblk1) if [ "$interface" = "lan" ]; then address=$(macaddr_add "$address" 1) fi @@ -56,15 +50,20 @@ rockchip_setup_macs() local label_mac="" case "$board" in + friendlyarm,nanopi-r2c|\ friendlyarm,nanopi-r2s|\ thinkpenguin,tpe-r1400) - wan_mac=$(generate_mac_from_mmc_cid mmcblk0) + wan_mac=$(macaddr_generate_from_mmc_cid mmcblk0) lan_mac=$(macaddr_add "$wan_mac" 1) ;; friendlyarm,nanopi-r4s) wan_mac=$(nanopi_r4s_get_mac wan) lan_mac=$(nanopi_r4s_get_mac lan) ;; + xunlong,orangepi-r1-plus|\ + xunlong,orangepi-r1-plus-lts) + wan_mac=$(macaddr_add "$(cat /sys/class/net/eth1/address)" -1) + ;; esac [ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" $lan_mac diff --git a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity index c76e62a23a..bb119b9185 100644 --- a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity +++ b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity @@ -29,7 +29,10 @@ set_interface_core() { } case "$(board_name)" in -friendlyarm,nanopi-r2s) +friendlyarm,nanopi-r2c|\ +friendlyarm,nanopi-r2s|\ +xunlong,orangepi-r1-plus|\ +xunlong,orangepi-r1-plus-lts) set_interface_core 2 "eth0" set_interface_core 4 "eth1" "xhci-hcd:usb3" ;; diff --git a/target/linux/rockchip/armv8/config-5.10 b/target/linux/rockchip/armv8/config-5.10 deleted file mode 100644 index 1e9b1777d8..0000000000 --- a/target/linux/rockchip/armv8/config-5.10 +++ /dev/null @@ -1,656 +0,0 @@ -CONFIG_64BIT=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -CONFIG_ARCH_KEEP_MEMBLOCK=y -CONFIG_ARCH_MMAP_RND_BITS=18 -CONFIG_ARCH_MMAP_RND_BITS_MAX=33 -CONFIG_ARCH_MMAP_RND_BITS_MIN=18 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 -CONFIG_ARCH_PROC_KCORE_TEXT=y -CONFIG_ARCH_ROCKCHIP=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y -CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_ARCH_STACKWALK=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARC_EMAC_CORE=y -CONFIG_ARM64=y -CONFIG_ARM64_4K_PAGES=y -CONFIG_ARM64_CNP=y -CONFIG_ARM64_CRYPTO=y -CONFIG_ARM64_ERRATUM_1742098=y -CONFIG_ARM64_ERRATUM_819472=y -CONFIG_ARM64_ERRATUM_824069=y -CONFIG_ARM64_ERRATUM_826319=y -CONFIG_ARM64_ERRATUM_827319=y -CONFIG_ARM64_ERRATUM_832075=y -CONFIG_ARM64_ERRATUM_843419=y -CONFIG_ARM64_ERRATUM_845719=y -CONFIG_ARM64_ERRATUM_858921=y -CONFIG_ARM64_HW_AFDBM=y -CONFIG_ARM64_MODULE_PLTS=y -CONFIG_ARM64_PAGE_SHIFT=12 -CONFIG_ARM64_PAN=y -CONFIG_ARM64_PA_BITS=48 -CONFIG_ARM64_PA_BITS_48=y -CONFIG_ARM64_PTR_AUTH=y -CONFIG_ARM64_RAS_EXTN=y -CONFIG_ARM64_SVE=y -# CONFIG_ARM64_SW_TTBR0_PAN is not set -CONFIG_ARM64_TAGGED_ADDR_ABI=y -CONFIG_ARM64_UAO=y -CONFIG_ARM64_VA_BITS=48 -# CONFIG_ARM64_VA_BITS_39 is not set -CONFIG_ARM64_VA_BITS_48=y -CONFIG_ARM64_VHE=y -CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y -# CONFIG_ARMV8_DEPRECATED is not set -CONFIG_ARM_AMBA=y -CONFIG_ARM_ARCH_TIMER=y -CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y -CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y -CONFIG_ARM_CPUIDLE=y -CONFIG_ARM_GIC=y -CONFIG_ARM_GIC_V2M=y -CONFIG_ARM_GIC_V3=y -CONFIG_ARM_GIC_V3_ITS=y -CONFIG_ARM_GIC_V3_ITS_PCI=y -CONFIG_ARM_MHU=y -CONFIG_ARM_PSCI_CPUIDLE=y -CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y -CONFIG_ARM_PSCI_FW=y -# CONFIG_ARM_RK3399_DMC_DEVFREQ is not set -# CONFIG_ARM_SCMI_PROTOCOL is not set -CONFIG_ARM_SCPI_CPUFREQ=y -CONFIG_ARM_SCPI_POWER_DOMAIN=y -CONFIG_ARM_SCPI_PROTOCOL=y -CONFIG_ARM_SMMU=y -CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y -# CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set -CONFIG_ARM_SMMU_V3=y -# CONFIG_ARM_SMMU_V3_SVA is not set -CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BACKLIGHT_GPIO=y -CONFIG_BACKLIGHT_PWM=y -CONFIG_BLK_DEV_BSG=y -CONFIG_BLK_DEV_BSGLIB=y -# CONFIG_BLK_DEV_INITRD is not set -CONFIG_BLK_DEV_INTEGRITY=y -CONFIG_BLK_DEV_INTEGRITY_T10=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_NVME=y -CONFIG_BLK_DEV_PCIESSD_MTIP32XX=y -CONFIG_BLK_DEV_SD=y -CONFIG_BLK_MQ_PCI=y -CONFIG_BLK_PM=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLOCK_COMPAT=y -CONFIG_BRCMSTB_GISB_ARB=y -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_BSD_PROCESS_ACCT_V3=y -# CONFIG_CHARGER_BQ25980 is not set -CONFIG_CHARGER_GPIO=y -CONFIG_CLKDEV_LOOKUP=y -CONFIG_CLKSRC_MMIO=y -CONFIG_CLK_PX30=y -CONFIG_CLK_RK3036=y -CONFIG_CLK_RK312X=y -CONFIG_CLK_RK3188=y -CONFIG_CLK_RK322X=y -CONFIG_CLK_RK3308=y -CONFIG_CLK_RK3328=y -CONFIG_CLK_RK3368=y -CONFIG_CLK_RK3399=y -CONFIG_CLK_RV110X=y -CONFIG_CLONE_BACKWARDS=y -CONFIG_CMA=y -CONFIG_CMA_ALIGNMENT=8 -CONFIG_CMA_AREAS=7 -# CONFIG_CMA_DEBUG is not set -# CONFIG_CMA_DEBUGFS is not set -CONFIG_CMA_SIZE_MBYTES=5 -# CONFIG_CMA_SIZE_SEL_MAX is not set -CONFIG_CMA_SIZE_SEL_MBYTES=y -# CONFIG_CMA_SIZE_SEL_MIN is not set -# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set -CONFIG_COMMON_CLK=y -CONFIG_COMMON_CLK_RK808=y -CONFIG_COMMON_CLK_ROCKCHIP=y -CONFIG_COMMON_CLK_SCPI=y -CONFIG_COMPAT=y -CONFIG_COMPAT_32BIT_TIME=y -CONFIG_COMPAT_BINFMT_ELF=y -CONFIG_COMPAT_NETLINK_MESSAGES=y -CONFIG_COMPAT_OLD_SIGACTION=y -CONFIG_CONFIGFS_FS=y -CONFIG_CONSOLE_TRANSLATIONS=y -CONFIG_CONTIG_ALLOC=y -CONFIG_CPUFREQ_DT=y -CONFIG_CPUFREQ_DT_PLATDEV=y -CONFIG_CPU_FREQ=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y -CONFIG_CPU_FREQ_GOV_ATTR_SET=y -# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set -# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -CONFIG_CPU_FREQ_GOV_POWERSAVE=y -CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y -# CONFIG_CPU_FREQ_GOV_USERSPACE is not set -CONFIG_CPU_FREQ_STAT=y -CONFIG_CPU_IDLE=y -CONFIG_CPU_IDLE_GOV_MENU=y -CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y -CONFIG_CPU_ISOLATION=y -CONFIG_CPU_PM=y -CONFIG_CPU_RMAP=y -CONFIG_CPU_THERMAL=y -CONFIG_CRASH_CORE=y -CONFIG_CRASH_DUMP=y -CONFIG_CRC16=y -# CONFIG_CRC32_SARWATE is not set -CONFIG_CRC32_SLICEBY8=y -CONFIG_CRC_T10DIF=y -CONFIG_CROSS_MEMORY_ATTACH=y -CONFIG_CRYPTO_AES_ARM64=y -CONFIG_CRYPTO_AES_ARM64_CE=y -CONFIG_CRYPTO_AES_ARM64_CE_BLK=y -CONFIG_CRYPTO_AES_ARM64_CE_CCM=y -CONFIG_CRYPTO_BLAKE2S=y -CONFIG_CRYPTO_CRC32=y -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRCT10DIF=y -CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y -CONFIG_CRYPTO_CRYPTD=y -# CONFIG_CRYPTO_DEV_ROCKCHIP is not set -CONFIG_CRYPTO_GHASH_ARM64_CE=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_SIMD=y -CONFIG_DCACHE_WORD_ACCESS=y -CONFIG_DEBUG_BUGVERBOSE=y -# CONFIG_DEVFREQ_GOV_PASSIVE is not set -CONFIG_DEVFREQ_GOV_PERFORMANCE=y -CONFIG_DEVFREQ_GOV_POWERSAVE=y -CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y -CONFIG_DEVFREQ_GOV_USERSPACE=y -# CONFIG_DEVFREQ_THERMAL is not set -CONFIG_DEVMEM=y -# CONFIG_DEVPORT is not set -CONFIG_DMADEVICES=y -CONFIG_DMA_CMA=y -CONFIG_DMA_DIRECT_REMAP=y -CONFIG_DMA_ENGINE=y -CONFIG_DMA_OF=y -CONFIG_DMA_OPS=y -CONFIG_DMA_REMAP=y -CONFIG_DMA_SHARED_BUFFER=y -CONFIG_DNOTIFY=y -# CONFIG_DRM_ROCKCHIP is not set -CONFIG_DTC=y -CONFIG_DT_IDLE_STATES=y -CONFIG_DUMMY_CONSOLE=y -CONFIG_DWMAC_DWC_QOS_ETH=y -CONFIG_DWMAC_GENERIC=y -CONFIG_DWMAC_ROCKCHIP=y -CONFIG_EDAC_SUPPORT=y -CONFIG_EEPROM_AT24=y -CONFIG_EMAC_ROCKCHIP=y -CONFIG_ENABLE_MUST_CHECK=y -CONFIG_ENERGY_MODEL=y -CONFIG_EXT4_FS=y -CONFIG_EXT4_FS_POSIX_ACL=y -CONFIG_EXTCON=y -CONFIG_F2FS_FS=y -CONFIG_FANOTIFY=y -CONFIG_FHANDLE=y -CONFIG_FIXED_PHY=y -CONFIG_FIX_EARLYCON_MEM=y -# CONFIG_FLATMEM_MANUAL is not set -# CONFIG_FORTIFY_SOURCE is not set -CONFIG_FRAME_POINTER=y -CONFIG_FRAME_WARN=2048 -CONFIG_FS_IOMAP=y -CONFIG_FS_MBCACHE=y -CONFIG_FS_POSIX_ACL=y -CONFIG_FW_LOADER_PAGED_BUF=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_GENERIC_ARCH_TOPOLOGY=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_CPU_VULNERABILITIES=y -CONFIG_GENERIC_CSUM=y -CONFIG_GENERIC_EARLY_IOREMAP=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_IDLE_POLL_SETUP=y -CONFIG_GENERIC_IRQ_CHIP=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_GENERIC_IRQ_MULTI_HANDLER=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_IRQ_SHOW_LEVEL=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_GENERIC_PHY=y -CONFIG_GENERIC_PINCONF=y -CONFIG_GENERIC_SCHED_CLOCK=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_IRQCHIP=y -CONFIG_GPIO_DWAPB=y -CONFIG_GPIO_GENERIC=y -CONFIG_GPIO_GENERIC_PLATFORM=y -CONFIG_HANDLE_DOMAIN_IRQ=y -# CONFIG_HARDENED_USERCOPY is not set -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_HAS_DMA=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HID=y -CONFIG_HID_GENERIC=y -# CONFIG_HISI_HIKEY_USB is not set -CONFIG_HOLES_IN_ZONE=y -CONFIG_HOTPLUG_CPU=y -CONFIG_HOTPLUG_PCI=y -# CONFIG_HOTPLUG_PCI_CPCI is not set -# CONFIG_HOTPLUG_PCI_PCIE is not set -# CONFIG_HOTPLUG_PCI_SHPC is not set -CONFIG_HUGETLBFS=y -CONFIG_HUGETLB_PAGE=y -CONFIG_HWMON=y -CONFIG_HWSPINLOCK=y -CONFIG_HW_CONSOLE=y -CONFIG_I2C=y -CONFIG_I2C_BOARDINFO=y -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_COMPAT=y -CONFIG_I2C_HELPER_AUTO=y -CONFIG_I2C_RK3X=y -CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 -CONFIG_INDIRECT_PIO=y -CONFIG_INPUT=y -CONFIG_INPUT_EVDEV=y -CONFIG_INPUT_FF_MEMLESS=y -CONFIG_INPUT_KEYBOARD=y -CONFIG_INPUT_LEDS=y -CONFIG_INPUT_MATRIXKMAP=y -# CONFIG_INPUT_MISC is not set -# CONFIG_INPUT_RK805_PWRKEY is not set -CONFIG_IOMMU_API=y -# CONFIG_IOMMU_DEBUGFS is not set -# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set -CONFIG_IOMMU_DMA=y -CONFIG_IOMMU_IOVA=y -CONFIG_IOMMU_IO_PGTABLE=y -# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set -CONFIG_IOMMU_IO_PGTABLE_LPAE=y -# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set -CONFIG_IOMMU_SUPPORT=y -# CONFIG_IO_STRICT_DEVMEM is not set -CONFIG_IO_URING=y -CONFIG_IRQCHIP=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_IRQ_MSI_IOMMU=y -CONFIG_IRQ_TIME_ACCOUNTING=y -CONFIG_IRQ_WORK=y -CONFIG_JBD2=y -CONFIG_JFFS2_ZLIB=y -CONFIG_JUMP_LABEL=y -CONFIG_KALLSYMS=y -CONFIG_KEXEC_CORE=y -CONFIG_KEXEC_FILE=y -CONFIG_KSM=y -# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set -CONFIG_LEDS_GPIO=y -# CONFIG_LEDS_LP50XX is not set -CONFIG_LEDS_PWM=y -CONFIG_LEDS_SYSCON=y -CONFIG_LEDS_TRIGGER_CPU=y -CONFIG_LEDS_TRIGGER_PANIC=y -CONFIG_LEGACY_PTYS=y -CONFIG_LEGACY_PTY_COUNT=16 -CONFIG_LIBCRC32C=y -CONFIG_LIBFDT=y -CONFIG_LOCALVERSION_AUTO=y -CONFIG_LOCK_DEBUGGING_SUPPORT=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_LOG_BUF_SHIFT=19 -CONFIG_MAGIC_SYSRQ=y -CONFIG_MAGIC_SYSRQ_SERIAL=y -CONFIG_MAILBOX=y -# CONFIG_MAILBOX_TEST is not set -CONFIG_MANDATORY_FILE_LOCKING=y -CONFIG_MDIO_BUS=y -CONFIG_MDIO_BUS_MUX=y -CONFIG_MDIO_BUS_MUX_GPIO=y -CONFIG_MDIO_BUS_MUX_MMIOREG=y -CONFIG_MDIO_DEVICE=y -CONFIG_MEMFD_CREATE=y -CONFIG_MEMORY_ISOLATION=y -CONFIG_MFD_CORE=y -# CONFIG_MFD_KHADAS_MCU is not set -CONFIG_MFD_RK808=y -# CONFIG_MFD_ROHM_BD71828 is not set -CONFIG_MFD_SYSCON=y -CONFIG_MIGRATION=y -CONFIG_MMC=y -CONFIG_MMC_BLOCK=y -CONFIG_MMC_BLOCK_MINORS=32 -CONFIG_MMC_CQHCI=y -CONFIG_MMC_DW=y -# CONFIG_MMC_DW_BLUEFIELD is not set -# CONFIG_MMC_DW_EXYNOS is not set -# CONFIG_MMC_DW_HI3798CV200 is not set -# CONFIG_MMC_DW_K3 is not set -# CONFIG_MMC_DW_PCI is not set -CONFIG_MMC_DW_PLTFM=y -CONFIG_MMC_DW_ROCKCHIP=y -CONFIG_MMC_SDHCI=y -CONFIG_MMC_SDHCI_OF_ARASAN=y -CONFIG_MMC_SDHCI_OF_DWCMSHC=y -# CONFIG_MMC_SDHCI_PCI is not set -CONFIG_MMC_SDHCI_PLTFM=y -CONFIG_MODULES_USE_ELF_RELA=y -CONFIG_MQ_IOSCHED_DEADLINE=y -# CONFIG_MTD_CFI is not set -CONFIG_MTD_CMDLINE_PARTS=y -# CONFIG_MTD_COMPLEX_MAPPINGS is not set -CONFIG_MTD_SPI_NOR=y -CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y -CONFIG_MTD_SPLIT_FIRMWARE=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_NEED_SG_DMA_LENGTH=y -CONFIG_NET_FLOW_LIMIT=y -CONFIG_NLS=y -CONFIG_NLS_ISO8859_1=y -CONFIG_NOP_USB_XCEIV=y -CONFIG_NO_HZ_COMMON=y -CONFIG_NO_HZ_IDLE=y -CONFIG_NR_CPUS=256 -CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y -CONFIG_NVME_CORE=y -# CONFIG_NVME_HWMON is not set -# CONFIG_NVME_MULTIPATH is not set -# CONFIG_NVME_TCP is not set -CONFIG_OF=y -CONFIG_OF_ADDRESS=y -CONFIG_OF_DYNAMIC=y -CONFIG_OF_EARLY_FLATTREE=y -CONFIG_OF_FLATTREE=y -CONFIG_OF_GPIO=y -CONFIG_OF_IOMMU=y -CONFIG_OF_IRQ=y -CONFIG_OF_KOBJ=y -CONFIG_OF_MDIO=y -CONFIG_OF_NET=y -CONFIG_OF_OVERLAY=y -CONFIG_OF_RESOLVE=y -CONFIG_OLD_SIGSUSPEND3=y -# CONFIG_OVERLAY_FS_XINO_AUTO is not set -CONFIG_PADATA=y -CONFIG_PAGE_POOL=y -# CONFIG_PANIC_ON_OOPS is not set -CONFIG_PANIC_ON_OOPS_VALUE=0 -CONFIG_PANIC_TIMEOUT=0 -# CONFIG_PARTITION_ADVANCED is not set -CONFIG_PARTITION_PERCPU=y -CONFIG_PCI=y -CONFIG_PCIEAER=y -CONFIG_PCIEASPM=y -CONFIG_PCIEASPM_DEFAULT=y -# CONFIG_PCIEASPM_PERFORMANCE is not set -# CONFIG_PCIEASPM_POWERSAVE is not set -# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set -CONFIG_PCIEPORTBUS=y -CONFIG_PCIE_PME=y -CONFIG_PCIE_ROCKCHIP=y -CONFIG_PCIE_ROCKCHIP_HOST=y -CONFIG_PCI_DOMAINS=y -CONFIG_PCI_DOMAINS_GENERIC=y -CONFIG_PCI_MSI=y -CONFIG_PCI_MSI_IRQ_DOMAIN=y -CONFIG_PCI_STUB=y -CONFIG_PCS_XPCS=y -CONFIG_PGTABLE_LEVELS=4 -CONFIG_PHYLIB=y -CONFIG_PHYLINK=y -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_PHY_ROCKCHIP_DP=y -# CONFIG_PHY_ROCKCHIP_DPHY_RX0 is not set -CONFIG_PHY_ROCKCHIP_EMMC=y -# CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY is not set -# CONFIG_PHY_ROCKCHIP_INNO_HDMI is not set -CONFIG_PHY_ROCKCHIP_INNO_USB2=y -CONFIG_PHY_ROCKCHIP_PCIE=y -CONFIG_PHY_ROCKCHIP_TYPEC=y -CONFIG_PHY_ROCKCHIP_USB=y -CONFIG_PINCTRL=y -# CONFIG_PINCTRL_RK805 is not set -CONFIG_PINCTRL_ROCKCHIP=y -# CONFIG_PINCTRL_SINGLE is not set -CONFIG_PL330_DMA=y -CONFIG_PLATFORM_MHU=y -CONFIG_PM=y -CONFIG_PM_CLK=y -CONFIG_PM_DEVFREQ=y -# CONFIG_PM_DEVFREQ_EVENT is not set -CONFIG_PM_GENERIC_DOMAINS=y -CONFIG_PM_GENERIC_DOMAINS_OF=y -CONFIG_PM_OPP=y -CONFIG_POWER_RESET=y -CONFIG_POWER_SUPPLY=y -CONFIG_POWER_SUPPLY_HWMON=y -CONFIG_PREEMPT=y -CONFIG_PREEMPTION=y -CONFIG_PREEMPT_COUNT=y -# CONFIG_PREEMPT_NONE is not set -CONFIG_PREEMPT_RCU=y -CONFIG_PRINTK_TIME=y -# CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_PROC_PAGE_MONITOR=y -CONFIG_PROC_VMCORE=y -CONFIG_PWM=y -CONFIG_PWM_ROCKCHIP=y -CONFIG_PWM_SYSFS=y -# CONFIG_QFMT_V1 is not set -# CONFIG_QFMT_V2 is not set -CONFIG_QUEUED_RWLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_QUOTA=y -CONFIG_QUOTACTL=y -# CONFIG_QUOTA_NETLINK_INTERFACE is not set -CONFIG_RAID_ATTRS=y -CONFIG_RANDOMIZE_BASE=y -CONFIG_RANDOMIZE_MODULE_REGION_FULL=y -CONFIG_RAS=y -CONFIG_RATIONAL=y -# CONFIG_RAVE_SP_CORE is not set -CONFIG_RCU_TRACE=y -CONFIG_REALTEK_PHY=y -CONFIG_REGMAP=y -CONFIG_REGMAP_I2C=y -CONFIG_REGMAP_IRQ=y -CONFIG_REGMAP_MMIO=y -CONFIG_REGULATOR=y -CONFIG_REGULATOR_FAN53555=y -CONFIG_REGULATOR_FIXED_VOLTAGE=y -CONFIG_REGULATOR_GPIO=y -CONFIG_REGULATOR_PWM=y -CONFIG_REGULATOR_RK808=y -# CONFIG_REGULATOR_RT4801 is not set -# CONFIG_REGULATOR_RTMV20 is not set -CONFIG_RELOCATABLE=y -CONFIG_RESET_CONTROLLER=y -CONFIG_RFS_ACCEL=y -CONFIG_ROCKCHIP_EFUSE=y -CONFIG_ROCKCHIP_GRF=y -CONFIG_ROCKCHIP_IODOMAIN=y -CONFIG_ROCKCHIP_IOMMU=y -CONFIG_ROCKCHIP_MBOX=y -# CONFIG_ROCKCHIP_OTP is not set -CONFIG_ROCKCHIP_PHY=y -CONFIG_ROCKCHIP_PM_DOMAINS=y -# CONFIG_ROCKCHIP_SARADC is not set -CONFIG_ROCKCHIP_THERMAL=y -CONFIG_ROCKCHIP_TIMER=y -CONFIG_RODATA_FULL_DEFAULT_ENABLED=y -CONFIG_RPS=y -CONFIG_RSEQ=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_DRV_RK808=y -# CONFIG_RTC_DRV_RV3032 is not set -CONFIG_RTC_I2C_AND_SPI=y -CONFIG_RTC_NVMEM=y -# CONFIG_RUNTIME_TESTING_MENU is not set -CONFIG_RWSEM_SPIN_ON_OWNER=y -CONFIG_SCHED_MC=y -CONFIG_SCSI=y -# CONFIG_SCSI_LOWLEVEL is not set -# CONFIG_SCSI_PROC_FS is not set -CONFIG_SCSI_SAS_ATTRS=y -CONFIG_SCSI_SAS_HOST_SMP=y -CONFIG_SCSI_SAS_LIBSAS=y -# CONFIG_SECURITY_DMESG_RESTRICT is not set -CONFIG_SENSORS_ARM_SCPI=y -# CONFIG_SENSORS_MR75203 is not set -CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y -CONFIG_SERIAL_8250_DW=y -CONFIG_SERIAL_8250_DWLIB=y -CONFIG_SERIAL_8250_EXAR=y -CONFIG_SERIAL_8250_EXTENDED=y -CONFIG_SERIAL_8250_FSL=y -CONFIG_SERIAL_8250_NR_UARTS=4 -CONFIG_SERIAL_8250_PCI=y -CONFIG_SERIAL_8250_RUNTIME_UARTS=4 -CONFIG_SERIAL_8250_SHARE_IRQ=y -CONFIG_SERIAL_AMBA_PL011=y -CONFIG_SERIAL_AMBA_PL011_CONSOLE=y -CONFIG_SERIAL_DEV_BUS=y -CONFIG_SERIAL_DEV_CTRL_TTYPORT=y -CONFIG_SERIAL_MCTRL_GPIO=y -CONFIG_SERIAL_OF_PLATFORM=y -CONFIG_SERIO=y -CONFIG_SERIO_AMBAKMI=y -CONFIG_SERIO_LIBPS2=y -CONFIG_SG_POOL=y -CONFIG_SIMPLE_PM_BUS=y -CONFIG_SLUB_DEBUG=y -CONFIG_SMP=y -# CONFIG_SND_SOC_ROCKCHIP is not set -CONFIG_SPARSEMEM=y -CONFIG_SPARSEMEM_EXTREME=y -CONFIG_SPARSEMEM_MANUAL=y -CONFIG_SPARSEMEM_VMEMMAP=y -CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -CONFIG_SPARSE_IRQ=y -CONFIG_SPI=y -CONFIG_SPI_BITBANG=y -CONFIG_SPI_DYNAMIC=y -CONFIG_SPI_MASTER=y -CONFIG_SPI_MEM=y -CONFIG_SPI_ROCKCHIP=y -CONFIG_SPI_SPIDEV=y -# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set -CONFIG_SQUASHFS_DECOMP_SINGLE=y -# CONFIG_SQUASHFS_EMBEDDED is not set -CONFIG_SQUASHFS_FILE_CACHE=y -# CONFIG_SQUASHFS_FILE_DIRECT is not set -CONFIG_SRAM=y -CONFIG_SRCU=y -CONFIG_STACKPROTECTOR=y -CONFIG_STACKPROTECTOR_STRONG=y -CONFIG_STMMAC_ETH=y -CONFIG_STMMAC_PLATFORM=y -# CONFIG_STMMAC_SELFTESTS is not set -CONFIG_STRICT_DEVMEM=y -# CONFIG_STRIP_ASM_SYMS is not set -# CONFIG_SWAP is not set -CONFIG_SWIOTLB=y -CONFIG_SWPHY=y -CONFIG_SYNC_FILE=y -CONFIG_SYSCTL_EXCEPTION_TRACE=y -CONFIG_SYSFS_SYSCALL=y -CONFIG_SYSVIPC_COMPAT=y -CONFIG_SYS_SUPPORTS_HUGETLBFS=y -# CONFIG_TEXTSEARCH is not set -CONFIG_THERMAL=y -CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y -CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 -CONFIG_THERMAL_EMULATION=y -CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y -CONFIG_THERMAL_GOV_STEP_WISE=y -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_OF=y -CONFIG_THREAD_INFO_IN_TASK=y -CONFIG_TICK_CPU_ACCOUNTING=y -CONFIG_TIMER_OF=y -CONFIG_TIMER_PROBE=y -CONFIG_TRACE_CLOCK=y -CONFIG_TRANSPARENT_HUGEPAGE=y -CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y -# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set -CONFIG_TREE_RCU=y -CONFIG_TREE_SRCU=y -CONFIG_TYPEC=y -# CONFIG_TYPEC_DP_ALTMODE is not set -CONFIG_TYPEC_FUSB302=y -# CONFIG_TYPEC_HD3SS3220 is not set -# CONFIG_TYPEC_MUX_PI3USB30532 is not set -# CONFIG_TYPEC_STUSB160X is not set -# CONFIG_TYPEC_TCPCI is not set -CONFIG_TYPEC_TCPM=y -# CONFIG_TYPEC_TPS6598X is not set -# CONFIG_UACCE is not set -# CONFIG_UCLAMP_TASK is not set -# CONFIG_UEVENT_HELPER is not set -CONFIG_UNINLINE_SPIN_UNLOCK=y -CONFIG_UNMAP_KERNEL_AT_EL0=y -CONFIG_USB=y -CONFIG_USB_COMMON=y -CONFIG_USB_DWC3=y -CONFIG_USB_DWC3_HOST=y -CONFIG_USB_DWC3_OF_SIMPLE=y -CONFIG_USB_EHCI_HCD=y -CONFIG_USB_EHCI_HCD_PLATFORM=y -# CONFIG_USB_EHCI_ROOT_HUB_TT is not set -CONFIG_USB_HID=y -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_OHCI_HCD_PLATFORM=y -CONFIG_USB_PHY=y -CONFIG_USB_ROLE_SWITCH=y -CONFIG_USB_STORAGE=y -CONFIG_USB_SUPPORT=y -CONFIG_USB_ULPI=y -CONFIG_USB_ULPI_BUS=y -CONFIG_USB_ULPI_VIEWPORT=y -CONFIG_USB_XHCI_HCD=y -CONFIG_USB_XHCI_PLATFORM=y -# CONFIG_VIRTIO_MENU is not set -CONFIG_VMAP_STACK=y -CONFIG_VM_EVENT_COUNTERS=y -CONFIG_VT=y -CONFIG_VT_CONSOLE=y -CONFIG_VT_HW_CONSOLE_BINDING=y -# CONFIG_WATCHDOG is not set -CONFIG_XARRAY_MULTI=y -CONFIG_XPS=y -CONFIG_XXHASH=y -CONFIG_XZ_DEC_ARM=y -CONFIG_XZ_DEC_ARMTHUMB=y -CONFIG_XZ_DEC_BCJ=y -CONFIG_ZLIB_DEFLATE=y -CONFIG_ZLIB_INFLATE=y -CONFIG_ZONE_DMA32=y diff --git a/target/linux/rockchip/armv8/config-5.15 b/target/linux/rockchip/armv8/config-5.15 new file mode 100644 index 0000000000..08ce65d8ea --- /dev/null +++ b/target/linux/rockchip/armv8/config-5.15 @@ -0,0 +1,644 @@ +CONFIG_64BIT=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y +CONFIG_ARCH_MMAP_RND_BITS=18 +CONFIG_ARCH_MMAP_RND_BITS_MAX=33 +CONFIG_ARCH_MMAP_RND_BITS_MIN=18 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_ARCH_ROCKCHIP=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_STACKWALK=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_ARC_EMAC_CORE=y +CONFIG_ARM64=y +CONFIG_ARM64_4K_PAGES=y +CONFIG_ARM64_CNP=y +CONFIG_ARM64_CRYPTO=y +CONFIG_ARM64_EPAN=y +CONFIG_ARM64_ERRATUM_819472=y +CONFIG_ARM64_ERRATUM_824069=y +CONFIG_ARM64_ERRATUM_826319=y +CONFIG_ARM64_ERRATUM_827319=y +CONFIG_ARM64_ERRATUM_832075=y +CONFIG_ARM64_ERRATUM_843419=y +CONFIG_ARM64_ERRATUM_845719=y +CONFIG_ARM64_ERRATUM_858921=y +CONFIG_ARM64_ERRATUM_1742098=y +CONFIG_ARM64_HW_AFDBM=y +CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y +CONFIG_ARM64_PAGE_SHIFT=12 +CONFIG_ARM64_PAN=y +CONFIG_ARM64_PA_BITS=48 +CONFIG_ARM64_PA_BITS_48=y +CONFIG_ARM64_PTR_AUTH=y +CONFIG_ARM64_PTR_AUTH_KERNEL=y +CONFIG_ARM64_RAS_EXTN=y +CONFIG_ARM64_SVE=y +CONFIG_ARM64_TAGGED_ADDR_ABI=y +CONFIG_ARM64_VA_BITS=48 +# CONFIG_ARM64_VA_BITS_39 is not set +CONFIG_ARM64_VA_BITS_48=y +CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y +# CONFIG_ARMV8_DEPRECATED is not set +CONFIG_ARM_AMBA=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y +CONFIG_ARM_CPUIDLE=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GIC_V2M=y +CONFIG_ARM_GIC_V3=y +CONFIG_ARM_GIC_V3_ITS=y +CONFIG_ARM_GIC_V3_ITS_PCI=y +CONFIG_ARM_MHU=y +CONFIG_ARM_MHU_V2=y +CONFIG_ARM_PSCI_CPUIDLE=y +CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y +CONFIG_ARM_PSCI_FW=y +# CONFIG_ARM_RK3399_DMC_DEVFREQ is not set +CONFIG_ARM_SCPI_CPUFREQ=y +CONFIG_ARM_SCPI_POWER_DOMAIN=y +CONFIG_ARM_SCPI_PROTOCOL=y +CONFIG_ARM_SMMU=y +CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y +# CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set +CONFIG_ARM_SMMU_V3=y +# CONFIG_ARM_SMMU_V3_SVA is not set +CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BACKLIGHT_GPIO=y +CONFIG_BACKLIGHT_PWM=y +CONFIG_BLK_DEV_BSG=y +CONFIG_BLK_DEV_BSGLIB=y +CONFIG_BLK_DEV_BSG_COMMON=y +# CONFIG_BLK_DEV_INITRD is not set +CONFIG_BLK_DEV_INTEGRITY=y +CONFIG_BLK_DEV_INTEGRITY_T10=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_NVME=y +CONFIG_BLK_DEV_PCIESSD_MTIP32XX=y +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_MQ_PCI=y +CONFIG_BLK_PM=y +CONFIG_BLOCK_COMPAT=y +CONFIG_BRCMSTB_GISB_ARB=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y +CONFIG_CHARGER_GPIO=y +CONFIG_CLKSRC_MMIO=y +CONFIG_CLK_PX30=y +CONFIG_CLK_RK3308=y +CONFIG_CLK_RK3328=y +CONFIG_CLK_RK3368=y +CONFIG_CLK_RK3399=y +CONFIG_CLK_RK3568=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_CMA=y +CONFIG_CMA_ALIGNMENT=8 +CONFIG_CMA_AREAS=7 +# CONFIG_CMA_DEBUG is not set +# CONFIG_CMA_DEBUGFS is not set +CONFIG_CMA_SIZE_MBYTES=5 +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SYSFS is not set +CONFIG_COMMON_CLK=y +CONFIG_COMMON_CLK_RK808=y +CONFIG_COMMON_CLK_ROCKCHIP=y +CONFIG_COMMON_CLK_SCPI=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_CONFIGFS_FS=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_CONTIG_ALLOC=y +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_CPU_FREQ=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y +CONFIG_CPU_ISOLATION=y +CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_CPU_PM=y +CONFIG_CPU_RMAP=y +CONFIG_CPU_THERMAL=y +CONFIG_CRASH_CORE=y +CONFIG_CRASH_DUMP=y +CONFIG_CRC16=y +# CONFIG_CRC32_SARWATE is not set +CONFIG_CRC32_SLICEBY8=y +CONFIG_CRC_T10DIF=y +CONFIG_CROSS_MEMORY_ATTACH=y +CONFIG_CRYPTO_AES_ARM64=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRCT10DIF=y +CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y +CONFIG_CRYPTO_CRYPTD=y +# CONFIG_CRYPTO_DEV_ROCKCHIP is not set +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_HW=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_SIMD=y +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEVFREQ_GOV_PASSIVE is not set +CONFIG_DEVFREQ_GOV_PERFORMANCE=y +CONFIG_DEVFREQ_GOV_POWERSAVE=y +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y +CONFIG_DEVFREQ_GOV_USERSPACE=y +# CONFIG_DEVFREQ_THERMAL is not set +CONFIG_DEVMEM=y +# CONFIG_DEVPORT is not set +CONFIG_DMADEVICES=y +CONFIG_DMA_CMA=y +CONFIG_DMA_DIRECT_REMAP=y +CONFIG_DMA_ENGINE=y +CONFIG_DMA_OF=y +CONFIG_DMA_OPS=y +CONFIG_DMA_REMAP=y +CONFIG_DMA_SHARED_BUFFER=y +CONFIG_DNOTIFY=y +CONFIG_DTC=y +CONFIG_DT_IDLE_STATES=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_DWMAC_DWC_QOS_ETH=y +CONFIG_DWMAC_GENERIC=y +CONFIG_DWMAC_ROCKCHIP=y +CONFIG_DW_WATCHDOG=y +CONFIG_EDAC_SUPPORT=y +CONFIG_EEPROM_AT24=y +CONFIG_EMAC_ROCKCHIP=y +CONFIG_ENERGY_MODEL=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXTCON=y +CONFIG_F2FS_FS=y +CONFIG_FANOTIFY=y +CONFIG_FHANDLE=y +CONFIG_FIXED_PHY=y +CONFIG_FIX_EARLYCON_MEM=y +# CONFIG_FORTIFY_SOURCE is not set +CONFIG_FRAME_POINTER=y +CONFIG_FS_IOMAP=y +CONFIG_FS_MBCACHE=y +CONFIG_FS_POSIX_ACL=y +CONFIG_FWNODE_MDIO=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_GENERIC_ARCH_TOPOLOGY=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_GENERIC_CSUM=y +CONFIG_GENERIC_EARLY_IOREMAP=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_PHY=y +CONFIG_GENERIC_PINCONF=y +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GPIOLIB_IRQCHIP=y +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_DWAPB=y +CONFIG_GPIO_GENERIC=y +CONFIG_GPIO_GENERIC_PLATFORM=y +CONFIG_GPIO_ROCKCHIP=y +CONFIG_GPIO_SYSCON=y +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HID=y +CONFIG_HID_GENERIC=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HOTPLUG_PCI=y +# CONFIG_HOTPLUG_PCI_CPCI is not set +# CONFIG_HOTPLUG_PCI_PCIE is not set +# CONFIG_HOTPLUG_PCI_SHPC is not set +CONFIG_HUGETLBFS=y +CONFIG_HUGETLB_PAGE=y +CONFIG_HWMON=y +CONFIG_HWSPINLOCK=y +CONFIG_HW_CONSOLE=y +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_COMPAT=y +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_RK3X=y +CONFIG_IIO=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_INDIRECT_PIO=y +CONFIG_INPUT=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_FF_MEMLESS=y +CONFIG_INPUT_KEYBOARD=y +CONFIG_INPUT_LEDS=y +CONFIG_INPUT_MATRIXKMAP=y +# CONFIG_INPUT_RK805_PWRKEY is not set +CONFIG_IOMMU_API=y +# CONFIG_IOMMU_DEBUGFS is not set +CONFIG_IOMMU_DEFAULT_PASSTHROUGH=y +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_IOVA=y +CONFIG_IOMMU_IO_PGTABLE=y +# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set +CONFIG_IOMMU_IO_PGTABLE_LPAE=y +# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set +CONFIG_IOMMU_SUPPORT=y +# CONFIG_IO_STRICT_DEVMEM is not set +CONFIG_IRQCHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_MSI_IOMMU=y +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_IRQ_WORK=y +CONFIG_JBD2=y +CONFIG_JFFS2_ZLIB=y +CONFIG_JUMP_LABEL=y +CONFIG_KALLSYMS=y +CONFIG_KCMP=y +CONFIG_KEXEC_CORE=y +CONFIG_KEXEC_FILE=y +CONFIG_KSM=y +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_PWM=y +CONFIG_LEDS_SYSCON=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_PANIC=y +CONFIG_LIBCRC32C=y +CONFIG_LIBFDT=y +CONFIG_LOCALVERSION_AUTO=y +CONFIG_LOCK_DEBUGGING_SUPPORT=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_LOG_BUF_SHIFT=19 +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_MAILBOX=y +# CONFIG_MAILBOX_TEST is not set +CONFIG_MDIO_BUS=y +CONFIG_MDIO_BUS_MUX=y +CONFIG_MDIO_BUS_MUX_GPIO=y +CONFIG_MDIO_BUS_MUX_MMIOREG=y +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_DEVRES=y +CONFIG_MEMFD_CREATE=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_MFD_CORE=y +# CONFIG_MFD_KHADAS_MCU is not set +CONFIG_MFD_RK808=y +CONFIG_MFD_SYSCON=y +CONFIG_MIGRATION=y +CONFIG_MMC=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_CQHCI=y +CONFIG_MMC_DW=y +# CONFIG_MMC_DW_BLUEFIELD is not set +# CONFIG_MMC_DW_EXYNOS is not set +# CONFIG_MMC_DW_HI3798CV200 is not set +# CONFIG_MMC_DW_K3 is not set +# CONFIG_MMC_DW_PCI is not set +CONFIG_MMC_DW_PLTFM=y +CONFIG_MMC_DW_ROCKCHIP=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_OF_ARASAN=y +CONFIG_MMC_SDHCI_OF_DWCMSHC=y +# CONFIG_MMC_SDHCI_PCI is not set +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_MOTORCOMM_PHY=y +CONFIG_MQ_IOSCHED_DEADLINE=y +# CONFIG_MTD_CFI is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +CONFIG_MTD_SPI_NOR=y +CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y +CONFIG_MTD_SPLIT_FIRMWARE=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NET_FLOW_LIMIT=y +CONFIG_NET_PTP_CLASSIFY=y +CONFIG_NET_SELFTESTS=y +CONFIG_NLS=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_NO_HZ_COMMON=y +CONFIG_NO_HZ_IDLE=y +CONFIG_NR_CPUS=256 +CONFIG_NVMEM=y +CONFIG_NVMEM_ROCKCHIP_EFUSE=y +# CONFIG_NVMEM_ROCKCHIP_OTP is not set +CONFIG_NVMEM_SYSFS=y +CONFIG_NVME_CORE=y +# CONFIG_NVME_HWMON is not set +# CONFIG_NVME_MULTIPATH is not set +CONFIG_OF=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_DYNAMIC=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_FLATTREE=y +CONFIG_OF_GPIO=y +CONFIG_OF_IOMMU=y +CONFIG_OF_IRQ=y +CONFIG_OF_KOBJ=y +CONFIG_OF_MDIO=y +CONFIG_OF_OVERLAY=y +CONFIG_OF_RESOLVE=y +CONFIG_OLD_SIGSUSPEND3=y +# CONFIG_OVERLAY_FS_XINO_AUTO is not set +CONFIG_PADATA=y +CONFIG_PAGE_POOL=y +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_PARTITION_PERCPU=y +CONFIG_PCI=y +CONFIG_PCIEAER=y +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_PERFORMANCE is not set +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +CONFIG_PCIEPORTBUS=y +CONFIG_PCIE_DW=y +CONFIG_PCIE_DW_HOST=y +CONFIG_PCIE_PME=y +CONFIG_PCIE_ROCKCHIP=y +CONFIG_PCIE_ROCKCHIP_DW_HOST=y +CONFIG_PCIE_ROCKCHIP_HOST=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DOMAINS_GENERIC=y +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCI_STUB=y +CONFIG_PCS_XPCS=y +CONFIG_PGTABLE_LEVELS=4 +CONFIG_PHYLIB=y +CONFIG_PHYLINK=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_PHY_ROCKCHIP_DP=y +# CONFIG_PHY_ROCKCHIP_DPHY_RX0 is not set +CONFIG_PHY_ROCKCHIP_EMMC=y +# CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY is not set +# CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY is not set +# CONFIG_PHY_ROCKCHIP_INNO_HDMI is not set +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +CONFIG_PHY_ROCKCHIP_PCIE=y +CONFIG_PHY_ROCKCHIP_TYPEC=y +CONFIG_PHY_ROCKCHIP_USB=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_RK805=y +CONFIG_PINCTRL_ROCKCHIP=y +# CONFIG_PINCTRL_SINGLE is not set +CONFIG_PL330_DMA=y +CONFIG_PLATFORM_MHU=y +CONFIG_PM=y +CONFIG_PM_CLK=y +CONFIG_PM_DEVFREQ=y +# CONFIG_PM_DEVFREQ_EVENT is not set +CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_PM_OPP=y +CONFIG_POWER_RESET=y +CONFIG_POWER_SUPPLY=y +CONFIG_POWER_SUPPLY_HWMON=y +CONFIG_PPS=y +CONFIG_PREEMPT=y +CONFIG_PREEMPTION=y +CONFIG_PREEMPT_COUNT=y +# CONFIG_PREEMPT_NONE is not set +CONFIG_PREEMPT_RCU=y +CONFIG_PRINTK_TIME=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PROC_VMCORE=y +CONFIG_PTP_1588_CLOCK=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y +CONFIG_PWM=y +CONFIG_PWM_ROCKCHIP=y +CONFIG_PWM_SYSFS=y +# CONFIG_QFMT_V2 is not set +CONFIG_QUEUED_RWLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_QUOTA=y +CONFIG_QUOTACTL=y +CONFIG_RAID_ATTRS=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_RANDOMIZE_MODULE_REGION_FULL=y +CONFIG_RAS=y +CONFIG_RATIONAL=y +# CONFIG_RAVE_SP_CORE is not set +CONFIG_RCU_TRACE=y +CONFIG_REALTEK_PHY=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_IRQ=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_PWM=y +CONFIG_REGULATOR_RK808=y +CONFIG_RELOCATABLE=y +CONFIG_RESET_CONTROLLER=y +CONFIG_RFS_ACCEL=y +CONFIG_ROCKCHIP_GRF=y +CONFIG_ROCKCHIP_IODOMAIN=y +CONFIG_ROCKCHIP_IOMMU=y +CONFIG_ROCKCHIP_MBOX=y +CONFIG_ROCKCHIP_PHY=y +CONFIG_ROCKCHIP_PM_DOMAINS=y +# CONFIG_ROCKCHIP_SARADC is not set +CONFIG_ROCKCHIP_THERMAL=y +CONFIG_ROCKCHIP_TIMER=y +CONFIG_RODATA_FULL_DEFAULT_ENABLED=y +CONFIG_RPS=y +CONFIG_RSEQ=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_RK808=y +CONFIG_RTC_I2C_AND_SPI=y +CONFIG_RTC_NVMEM=y +# CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_SCHED_MC=y +CONFIG_SCSI=y +CONFIG_SCSI_COMMON=y +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_PROC_FS is not set +CONFIG_SCSI_SAS_ATTRS=y +CONFIG_SCSI_SAS_HOST_SMP=y +CONFIG_SCSI_SAS_LIBSAS=y +# CONFIG_SECURITY_DMESG_RESTRICT is not set +CONFIG_SENSORS_ARM_SCPI=y +CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y +CONFIG_SERIAL_8250_DW=y +CONFIG_SERIAL_8250_DWLIB=y +CONFIG_SERIAL_8250_EXAR=y +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_PCI=y +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIO=y +CONFIG_SERIO_AMBAKMI=y +CONFIG_SERIO_LIBPS2=y +CONFIG_SG_POOL=y +CONFIG_SLUB_DEBUG=y +CONFIG_SMP=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSE_IRQ=y +CONFIG_SPI=y +CONFIG_SPI_BITBANG=y +CONFIG_SPI_DYNAMIC=y +CONFIG_SPI_MASTER=y +CONFIG_SPI_MEM=y +CONFIG_SPI_ROCKCHIP=y +# CONFIG_SPI_ROCKCHIP_SFC is not set +CONFIG_SPI_SPIDEV=y +# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set +CONFIG_SQUASHFS_DECOMP_SINGLE=y +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FILE_CACHE=y +# CONFIG_SQUASHFS_FILE_DIRECT is not set +CONFIG_SRAM=y +CONFIG_SRCU=y +CONFIG_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR_PER_TASK=y +CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_STMMAC_ETH=y +CONFIG_STMMAC_PLATFORM=y +CONFIG_STRICT_DEVMEM=y +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_SWAP is not set +CONFIG_SWIOTLB=y +CONFIG_SWPHY=y +CONFIG_SYNC_FILE=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_SYSFS_SYSCALL=y +CONFIG_SYSVIPC_COMPAT=y +# CONFIG_TEXTSEARCH is not set +CONFIG_THERMAL=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_EMULATION=y +CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_OF=y +CONFIG_THREAD_INFO_IN_TASK=y +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_TRACE_CLOCK=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +CONFIG_TRANSPARENT_HUGEPAGE=y +CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y +# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set +CONFIG_TREE_RCU=y +CONFIG_TREE_SRCU=y +CONFIG_TYPEC=y +# CONFIG_TYPEC_DP_ALTMODE is not set +CONFIG_TYPEC_FUSB302=y +# CONFIG_TYPEC_HD3SS3220 is not set +# CONFIG_TYPEC_MUX_PI3USB30532 is not set +# CONFIG_TYPEC_STUSB160X is not set +# CONFIG_TYPEC_TCPCI is not set +CONFIG_TYPEC_TCPM=y +# CONFIG_TYPEC_TPS6598X is not set +# CONFIG_UACCE is not set +# CONFIG_UCLAMP_TASK is not set +# CONFIG_UEVENT_HELPER is not set +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_UNMAP_KERNEL_AT_EL0=y +CONFIG_USB=y +CONFIG_USB_COMMON=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC3_HOST=y +CONFIG_USB_DWC3_OF_SIMPLE=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD_PLATFORM=y +# CONFIG_USB_EHCI_ROOT_HUB_TT is not set +CONFIG_USB_HID=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PLATFORM=y +CONFIG_USB_PHY=y +CONFIG_USB_ROLE_SWITCH=y +CONFIG_USB_STORAGE=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_ULPI=y +CONFIG_USB_ULPI_BUS=y +CONFIG_USB_ULPI_VIEWPORT=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_PLATFORM=y +# CONFIG_VIRTIO_MENU is not set +CONFIG_VMAP_STACK=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_WATCHDOG_CORE=y +CONFIG_XARRAY_MULTI=y +CONFIG_XPS=y +CONFIG_XXHASH=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_BCJ=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZONE_DMA32=y diff --git a/target/linux/rockchip/image/Makefile b/target/linux/rockchip/image/Makefile index e4db1e5d58..3b118201b6 100644 --- a/target/linux/rockchip/image/Makefile +++ b/target/linux/rockchip/image/Makefile @@ -16,7 +16,6 @@ define Build/boot-common rm -fR $@.boot mkdir -p $@.boot - $(CP) $(DTS_DIR)/$(DEVICE_DTS).dtb $@.boot/rockchip.dtb $(CP) $(IMAGE_KERNEL) $@.boot/kernel.img endef @@ -48,9 +47,10 @@ endef ### Devices ### define Device/Default PROFILES := Default - KERNEL := kernel-bin + KERNEL = kernel-bin | lzma | fit lzma $$(DTS_DIR)/$$(DEVICE_DTS).dtb IMAGES := sysupgrade.img.gz DEVICE_DTS = rockchip/$$(SOC)-$(lastword $(subst _, ,$(1))) + UBOOT_DEVICE_NAME = $(lastword $(subst _, ,$(1)))-$$(SOC) endef include $(SUBTARGET).mk diff --git a/target/linux/rockchip/image/armv8.mk b/target/linux/rockchip/image/armv8.mk index 2ee3930722..7dd5b74bb0 100644 --- a/target/linux/rockchip/image/armv8.mk +++ b/target/linux/rockchip/image/armv8.mk @@ -2,33 +2,43 @@ # # Copyright (C) 2020 Tobias Maedel -define Device/friendlyarm_nanopi-r2s +# FIT will be loaded at 0x02080000. Leave 16M for that, align it to 2M and load the kernel after it. +KERNEL_LOADADDR := 0x03200000 + +define Device/firefly_roc-rk3328-cc + DEVICE_VENDOR := Firefly + DEVICE_MODEL := ROC-RK3328-CC + SOC := rk3328 + DEVICE_DTS := rockchip/rk3328-roc-cc + UBOOT_DEVICE_NAME := roc-cc-rk3328 + IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata +endef +TARGET_DEVICES += firefly_roc-rk3328-cc + +define Device/friendlyarm_nanopi-r2c DEVICE_VENDOR := FriendlyARM - DEVICE_MODEL := NanoPi R2S + DEVICE_MODEL := NanoPi R2C SOC := rk3328 - UBOOT_DEVICE_NAME := nanopi-r2s-rk3328 - IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r2s | pine64-img | gzip | append-metadata + IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata DEVICE_PACKAGES := kmod-usb-net-rtl8152 endef -TARGET_DEVICES += friendlyarm_nanopi-r2s +TARGET_DEVICES += friendlyarm_nanopi-r2c -define Device/thinkpenguin_tpe-r1400 - DEVICE_VENDOR := ThinkPenguin - DEVICE_MODEL := TPE-R1400 +define Device/friendlyarm_nanopi-r2s + DEVICE_VENDOR := FriendlyARM + DEVICE_MODEL := NanoPi R2S SOC := rk3328 - UBOOT_DEVICE_NAME := tpe-r1400-rk3328 - IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r2s | pine64-img | gzip | append-metadata + IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata DEVICE_PACKAGES := kmod-usb-net-rtl8152 endef -TARGET_DEVICES += thinkpenguin_tpe-r1400 +TARGET_DEVICES += friendlyarm_nanopi-r2s define Device/friendlyarm_nanopi-r4s DEVICE_VENDOR := FriendlyARM DEVICE_MODEL := NanoPi R4S DEVICE_VARIANT := 4GB LPDDR4 SOC := rk3399 - UBOOT_DEVICE_NAME := nanopi-r4s-rk3399 - IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r4s | pine64-img | gzip | append-metadata + IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata DEVICE_PACKAGES := kmod-r8169 endef TARGET_DEVICES += friendlyarm_nanopi-r4s @@ -37,7 +47,6 @@ define Device/pine64_rockpro64 DEVICE_VENDOR := Pine64 DEVICE_MODEL := RockPro64 SOC := rk3399 - UBOOT_DEVICE_NAME := rockpro64-rk3399 IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata endef TARGET_DEVICES += pine64_rockpro64 @@ -51,3 +60,30 @@ define Device/radxa_rock-pi-4a IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata endef TARGET_DEVICES += radxa_rock-pi-4a + +define Device/thinkpenguin_tpe-r1400 + DEVICE_VENDOR := ThinkPenguin + DEVICE_MODEL := TPE-R1400 + SOC := rk3328 + IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata + DEVICE_PACKAGES := kmod-usb-net-rtl8152 +endef +TARGET_DEVICES += thinkpenguin_tpe-r1400 + +define Device/xunlong_orangepi-r1-plus + DEVICE_VENDOR := Xunlong + DEVICE_MODEL := Orange Pi R1 Plus + SOC := rk3328 + IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata + DEVICE_PACKAGES := kmod-usb-net-rtl8152 +endef +TARGET_DEVICES += xunlong_orangepi-r1-plus + +define Device/xunlong_orangepi-r1-plus-lts + DEVICE_VENDOR := Xunlong + DEVICE_MODEL := Orange Pi R1 Plus LTS + SOC := rk3328 + IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata + DEVICE_PACKAGES := kmod-usb-net-rtl8152 +endef +TARGET_DEVICES += xunlong_orangepi-r1-plus-lts diff --git a/target/linux/rockchip/image/mmc.bootscript b/target/linux/rockchip/image/mmc.bootscript index b70a62c4c7..60b59e1b6b 100644 --- a/target/linux/rockchip/image/mmc.bootscript +++ b/target/linux/rockchip/image/mmc.bootscript @@ -1,8 +1,15 @@ part uuid mmc ${devnum}:2 uuid -setenv bootargs "console=ttyS2,1500000 console=tty1 earlycon=uart8250,mmio32,0xff1a0000 root=PARTUUID=${uuid} rw rootwait" +if test $stdout = 'serial@fe660000' ; +then serial_addr=',0xfe660000'; +elif test $stdout = 'serial@ff130000' ; +then serial_addr=',0xff130000'; +elif test $stdout = 'serial@ff1a0000' ; +then serial_addr=',0xff1a0000'; +fi; + +setenv bootargs "console=ttyS2,1500000 console=tty1 earlycon=uart8250,mmio32${serial_addr} swiotlb=1 root=PARTUUID=${uuid} rw rootwait"; -load mmc ${devnum}:1 ${fdt_addr_r} rockchip.dtb load mmc ${devnum}:1 ${kernel_addr_r} kernel.img -booti ${kernel_addr_r} - ${fdt_addr_r} +bootm ${kernel_addr_r} diff --git a/target/linux/rockchip/image/nanopi-r2s.bootscript b/target/linux/rockchip/image/nanopi-r2s.bootscript deleted file mode 100644 index 5198881a26..0000000000 --- a/target/linux/rockchip/image/nanopi-r2s.bootscript +++ /dev/null @@ -1,8 +0,0 @@ -part uuid mmc ${devnum}:2 uuid - -setenv bootargs "console=ttyS2,1500000 earlycon=uart8250,mmio32,0xff130000 root=PARTUUID=${uuid} rw rootwait" - -load mmc ${devnum}:1 ${fdt_addr_r} rockchip.dtb -load mmc ${devnum}:1 ${kernel_addr_r} kernel.img - -booti ${kernel_addr_r} - ${fdt_addr_r} diff --git a/target/linux/rockchip/image/nanopi-r4s.bootscript b/target/linux/rockchip/image/nanopi-r4s.bootscript deleted file mode 100644 index abe9c24ee3..0000000000 --- a/target/linux/rockchip/image/nanopi-r4s.bootscript +++ /dev/null @@ -1,8 +0,0 @@ -part uuid mmc ${devnum}:2 uuid - -setenv bootargs "console=ttyS2,1500000 earlycon=uart8250,mmio32,0xff1a0000 root=PARTUUID=${uuid} rw rootwait" - -load mmc ${devnum}:1 ${fdt_addr_r} rockchip.dtb -load mmc ${devnum}:1 ${kernel_addr_r} kernel.img - -booti ${kernel_addr_r} - ${fdt_addr_r} diff --git a/target/linux/rockchip/image/tpe-r1400.bootscript b/target/linux/rockchip/image/tpe-r1400.bootscript deleted file mode 100644 index 5198881a26..0000000000 --- a/target/linux/rockchip/image/tpe-r1400.bootscript +++ /dev/null @@ -1,8 +0,0 @@ -part uuid mmc ${devnum}:2 uuid - -setenv bootargs "console=ttyS2,1500000 earlycon=uart8250,mmio32,0xff130000 root=PARTUUID=${uuid} rw rootwait" - -load mmc ${devnum}:1 ${fdt_addr_r} rockchip.dtb -load mmc ${devnum}:1 ${kernel_addr_r} kernel.img - -booti ${kernel_addr_r} - ${fdt_addr_r} diff --git a/target/linux/rockchip/patches-5.10/004-v5.13-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch b/target/linux/rockchip/patches-5.10/004-v5.13-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch deleted file mode 100644 index 461a5ae7dd..0000000000 --- a/target/linux/rockchip/patches-5.10/004-v5.13-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch +++ /dev/null @@ -1,177 +0,0 @@ -From db792e9adbf85ffc9d6b0b060ac3c8e3148c8992 Mon Sep 17 00:00:00 2001 -From: Tianling Shen -Date: Fri, 19 Mar 2021 13:16:27 +0800 -Subject: [PATCH] rockchip: rk3399: Add support for FriendlyARM NanoPi R4S - -This adds support for the NanoPi R4S from FriendlyArm. - -Rockchip RK3399 SoC -1GB DDR3 or 4GB LPDDR4 RAM -Gigabit Ethernet (WAN) -Gigabit Ethernet (PCIe) (LAN) -USB 3.0 Port x 2 -MicroSD slot -Reset button -WAN - LAN - SYS LED - -Co-developed-by: Jensen Huang -Signed-off-by: Jensen Huang -[minor adjustments] -Co-developed-by: Marty Jones -Signed-off-by: Marty Jones -[further adjustments, fixed format issues] -Signed-off-by: Tianling Shen -Link: https://lore.kernel.org/r/20210319051627.814-2-cnsztl@gmail.com -Signed-off-by: Heiko Stuebner ---- - arch/arm64/boot/dts/rockchip/Makefile | 1 + - .../boot/dts/rockchip/rk3399-nanopi-r4s.dts | 133 +++++++++++++++++++++ - 2 files changed, 134 insertions(+) - create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts - ---- a/arch/arm64/boot/dts/rockchip/Makefile -+++ b/arch/arm64/boot/dts/rockchip/Makefile -@@ -30,6 +30,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-le - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopc-t4.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-neo4.dtb -+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4s.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-orangepi.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-pinebook-pro.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-puma-haikou.dtb ---- /dev/null -+++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts -@@ -0,0 +1,133 @@ -+// SPDX-License-Identifier: (GPL-2.0+ OR MIT) -+/* -+ * FriendlyElec NanoPC-T4 board device tree source -+ * -+ * Copyright (c) 2020 FriendlyElec Computer Tech. Co., Ltd. -+ * (http://www.friendlyarm.com) -+ * -+ * Copyright (c) 2018 Collabora Ltd. -+ * -+ * Copyright (c) 2020 Jensen Huang -+ * Copyright (c) 2020 Marty Jones -+ * Copyright (c) 2021 Tianling Shen -+ */ -+ -+/dts-v1/; -+#include "rk3399-nanopi4.dtsi" -+ -+/ { -+ model = "FriendlyElec NanoPi R4S"; -+ compatible = "friendlyarm,nanopi-r4s", "rockchip,rk3399"; -+ -+ /delete-node/ display-subsystem; -+ -+ gpio-leds { -+ pinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>; -+ -+ /delete-node/ led-0; -+ -+ lan_led: led-lan { -+ gpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>; -+ label = "green:lan"; -+ }; -+ -+ sys_led: led-sys { -+ gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>; -+ label = "red:sys"; -+ default-state = "on"; -+ }; -+ -+ wan_led: led-wan { -+ gpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>; -+ label = "green:wan"; -+ }; -+ }; -+ -+ gpio-keys { -+ pinctrl-0 = <&reset_button_pin>; -+ -+ /delete-node/ power; -+ -+ reset { -+ debounce-interval = <50>; -+ gpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>; -+ label = "reset"; -+ linux,code = ; -+ }; -+ }; -+ -+ vdd_5v: vdd-5v { -+ compatible = "regulator-fixed"; -+ regulator-name = "vdd_5v"; -+ regulator-always-on; -+ regulator-boot-on; -+ }; -+}; -+ -+&emmc_phy { -+ status = "disabled"; -+}; -+ -+&i2c4 { -+ status = "disabled"; -+}; -+ -+&pcie0 { -+ max-link-speed = <1>; -+ num-lanes = <1>; -+ vpcie3v3-supply = <&vcc3v3_sys>; -+}; -+ -+&pinctrl { -+ gpio-leds { -+ /delete-node/ status-led-pin; -+ -+ lan_led_pin: lan-led-pin { -+ rockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ -+ sys_led_pin: sys-led-pin { -+ rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ -+ wan_led_pin: wan-led-pin { -+ rockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ }; -+ -+ rockchip-key { -+ /delete-node/ power-key; -+ -+ reset_button_pin: reset-button-pin { -+ rockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>; -+ }; -+ }; -+}; -+ -+&sdhci { -+ status = "disabled"; -+}; -+ -+&sdio0 { -+ status = "disabled"; -+}; -+ -+&u2phy0_host { -+ phy-supply = <&vdd_5v>; -+}; -+ -+&u2phy1_host { -+ status = "disabled"; -+}; -+ -+&uart0 { -+ status = "disabled"; -+}; -+ -+&usbdrd_dwc3_0 { -+ dr_mode = "host"; -+}; -+ -+&vcc3v3_sys { -+ vin-supply = <&vcc5v0_sys>; -+}; diff --git a/target/linux/rockchip/patches-5.10/100-rockchip-use-system-LED-for-OpenWrt.patch b/target/linux/rockchip/patches-5.10/100-rockchip-use-system-LED-for-OpenWrt.patch deleted file mode 100644 index eedaab0c1c..0000000000 --- a/target/linux/rockchip/patches-5.10/100-rockchip-use-system-LED-for-OpenWrt.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 6731d2c9039fbe1ecf21915eab3acee0a999508a Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Fri, 10 Jul 2020 21:38:20 +0200 -Subject: [PATCH] rockchip: use system LED for libreCMC - -Use the SYS LED on the casing for showing system status. - -This patch is kept separate from the NanoPi R2S support patch, as i plan -on submitting the device support upstream. - -Signed-off-by: David Bauer ---- - arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - ---- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts -+++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts -@@ -13,6 +13,13 @@ - model = "FriendlyElec NanoPi R2S"; - compatible = "friendlyarm,nanopi-r2s", "rockchip,rk3328"; - -+ aliases { -+ led-boot = &sys_led; -+ led-failsafe = &sys_led; -+ led-running = &sys_led; -+ led-upgrade = &sys_led; -+ }; -+ - chosen { - stdout-path = "serial2:1500000n8"; - }; diff --git a/target/linux/rockchip/patches-5.10/101-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch b/target/linux/rockchip/patches-5.10/101-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch deleted file mode 100644 index 2dd6e40ebf..0000000000 --- a/target/linux/rockchip/patches-5.10/101-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch +++ /dev/null @@ -1,70 +0,0 @@ -From: William Wu - -RK3328 has one USB 3.0 OTG controller which uses DWC_USB3 -core's general architecture. It can act as static xHCI host -controller, static device controller, USB 3.0/2.0 OTG basing -on ID of USB3.0 PHY. - -Signed-off-by: William Wu -Signed-off-by: Leonidas P. Papadakos - ---- - -NOTE: This binding still has issues. From the original thread: - -the rk3328 usb3-phy has an issue with detecting any plugin events -after a previous device got removed - see the inno-usb3-phy driver -in the vendor kernel. - -The current state is good-enough for enabling the USB3 attached LAN -port of the NanoPi R2S. However, it might explode depending on your -use-case. You've been warned. - ---- - arch/arm64/boot/dts/rockchip/rk3328.dtsi | 27 ++++++++++++++++++++++++ - 1 file changed, 27 insertions(+) - ---- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi -+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi -@@ -985,22 +985,30 @@ - }; - - usbdrd3: usb@ff600000 { -- compatible = "rockchip,rk3328-dwc3", "snps,dwc3"; -- reg = <0x0 0xff600000 0x0 0x100000>; -- interrupts = ; -+ compatible = "rockchip,rk3328-dwc3", "rockchip,rk3399-dwc3"; - clocks = <&cru SCLK_USB3OTG_REF>, <&cru SCLK_USB3OTG_SUSPEND>, - <&cru ACLK_USB3OTG>; - clock-names = "ref_clk", "suspend_clk", - "bus_clk"; -- dr_mode = "otg"; -- phy_type = "utmi_wide"; -- snps,dis-del-phy-power-chg-quirk; -- snps,dis_enblslpm_quirk; -- snps,dis-tx-ipgap-linecheck-quirk; -- snps,dis-u2-freeclk-exists-quirk; -- snps,dis_u2_susphy_quirk; -- snps,dis_u3_susphy_quirk; -+ #address-cells = <2>; -+ #size-cells = <2>; -+ ranges; - status = "disabled"; -+ -+ usbdrd_dwc3: dwc3@ff600000 { -+ compatible = "snps,dwc3"; -+ reg = <0x0 0xff600000 0x0 0x100000>; -+ interrupts = ; -+ dr_mode = "otg"; -+ phy_type = "utmi_wide"; -+ snps,dis_enblslpm_quirk; -+ snps,dis-u2-freeclk-exists-quirk; -+ snps,dis_u2_susphy_quirk; -+ snps,dis_u3_susphy_quirk; -+ snps,dis-del-phy-power-chg-quirk; -+ snps,dis-tx-ipgap-linecheck-quirk; -+ status = "disabled"; -+ }; - }; - - gic: interrupt-controller@ff811000 { diff --git a/target/linux/rockchip/patches-5.10/102-rockchip-enable-LAN-port-on-NanoPi-R2S.patch b/target/linux/rockchip/patches-5.10/102-rockchip-enable-LAN-port-on-NanoPi-R2S.patch deleted file mode 100644 index 48e8d472c8..0000000000 --- a/target/linux/rockchip/patches-5.10/102-rockchip-enable-LAN-port-on-NanoPi-R2S.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 0fc3b9b7619c4878f73a6a7989863f0d1a3fd392 Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Fri, 10 Jul 2020 21:12:16 +0200 -Subject: [PATCH] rockchip: enabled LAN port on NanoPi R2S - -Enable the USB3 port on the FriendlyARM NanoPi R2S. -This is required for the USB3 attached LAN port to work. - -Signed-off-by: David Bauer ---- - .../boot/dts/rockchip/rk3328-nanopi-r2s.dts | 27 +++++++++++++++++++ - 1 file changed, 27 insertions(+) - ---- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts -+++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts -@@ -44,6 +44,18 @@ - }; - }; - -+ vcc_rtl8153: vcc-rtl8153-regulator { -+ compatible = "regulator-fixed"; -+ gpio = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&rtl8153_en_drv>; -+ regulator-always-on; -+ regulator-name = "vcc_rtl8153"; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ enable-active-high; -+ }; -+ - leds { - compatible = "gpio-leds"; - pinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>; -@@ -271,6 +283,12 @@ - }; - }; - }; -+ -+ usb { -+ rtl8153_en_drv: rtl8153-en-drv { -+ rockchip,pins = <2 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ }; - }; - - &io_domains { -@@ -377,3 +395,12 @@ - &usb_host0_ohci { - status = "okay"; - }; -+ -+&usbdrd3 { -+ status = "okay"; -+}; -+ -+&usbdrd_dwc3 { -+ dr_mode = "host"; -+ status = "okay"; -+}; diff --git a/target/linux/rockchip/patches-5.10/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch b/target/linux/rockchip/patches-5.10/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch deleted file mode 100644 index dfc71a2701..0000000000 --- a/target/linux/rockchip/patches-5.10/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 2795c8b31a686bdb8338f9404d18ef7a154f0d75 Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Sun, 26 Jul 2020 13:32:59 +0200 -Subject: [PATCH] arm64: rockchip: add OF node for USB eth on NanoPi R2S - -This adds the OF node for the USB3 ethernet adapter on the FriendlyARM -NanoPi R2S. Add the correct value for the RTL8153 LED configuration -register to match the blink behavior of the other port on the device. - -Signed-off-by: David Bauer ---- - arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 7 +++++++ - 1 file changed, 7 insertions(+) - ---- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts -+++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts -@@ -403,4 +403,11 @@ - &usbdrd_dwc3 { - dr_mode = "host"; - status = "okay"; -+ -+ usb-eth@2 { -+ compatible = "realtek,rtl8153"; -+ reg = <2>; -+ -+ realtek,led-data = <0x87>; -+ }; - }; diff --git a/target/linux/rockchip/patches-5.10/104-rockchip-use-USB-host-by-default-on-rk3399-rock-pi-4.patch b/target/linux/rockchip/patches-5.10/104-rockchip-use-USB-host-by-default-on-rk3399-rock-pi-4.patch deleted file mode 100644 index 56166783a5..0000000000 --- a/target/linux/rockchip/patches-5.10/104-rockchip-use-USB-host-by-default-on-rk3399-rock-pi-4.patch +++ /dev/null @@ -1,32 +0,0 @@ -From e12f67fe83446432ef16704c22ec23bd1dbcd094 Mon Sep 17 00:00:00 2001 -From: Vicente Bergas -Date: Tue, 1 Dec 2020 16:41:32 +0100 -Subject: arm64: dts: rockchip: use USB host by default on rk3399-rock-pi-4 - -Based on the board schematics at -https://dl.radxa.com/rockpi4/docs/hw/rockpi4/rockpi_4c_v12_sch_20200620.pdf -on page 19 there is an USB Type-A receptacle being used as an USB-OTG port. - -But the Type-A connector is not valid for OTG operation, for this reason -there is a switch to select host or device role. -This is non-compliant and error prone because switching is manual. -So, use host mode as it corresponds for a Type-A receptacle. - -Signed-off-by: Vicente Bergas -Link: https://lore.kernel.org/r/20201201154132.1286-4-vicencb@gmail.com -Signed-off-by: Heiko Stuebner ---- - arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi -+++ b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi -@@ -679,7 +679,7 @@ - - &usbdrd_dwc3_0 { - status = "okay"; -- dr_mode = "otg"; -+ dr_mode = "host"; - }; - - &usbdrd3_1 { diff --git a/target/linux/rockchip/patches-5.10/105-nanopi-r4s-sd-signalling.patch b/target/linux/rockchip/patches-5.10/105-nanopi-r4s-sd-signalling.patch deleted file mode 100644 index a04c14b70a..0000000000 --- a/target/linux/rockchip/patches-5.10/105-nanopi-r4s-sd-signalling.patch +++ /dev/null @@ -1,26 +0,0 @@ -From: David Bauer -Subject: arm64: dts: rockchip: disable UHS modes for NanoPi R4S - -The NanoPi R4S leaves the SD card in 1.8V signalling when rebooting -while U-Boot requires the card to be in 3.3V mode. - -Remove UHS support from the SD controller so the card remains in 3.3V -mode. This reduces transfer speeds but ensures a reboot whether from -userspace or following a kernel panic is always working. - -Signed-off-by: David Bauer - ---- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts -+++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts -@@ -121,6 +121,11 @@ - status = "disabled"; - }; - -+&sdmmc { -+ /delete-property/ sd-uhs-sdr104; -+ cap-sd-highspeed; -+}; -+ - &u2phy0_host { - phy-supply = <&vdd_5v>; - }; diff --git a/target/linux/rockchip/patches-5.10/107-add-tpe-r1400.patch b/target/linux/rockchip/patches-5.10/107-add-tpe-r1400.patch deleted file mode 100644 index b5165536f0..0000000000 --- a/target/linux/rockchip/patches-5.10/107-add-tpe-r1400.patch +++ /dev/null @@ -1,426 +0,0 @@ ---- a/arch/arm64/boot/dts/rockchip/Makefile -+++ b/arch/arm64/boot/dts/rockchip/Makefile -@@ -7,6 +7,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-od - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb -+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-tpe-r1400.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-evb-act8846.dtb ---- /dev/null -+++ b/arch/arm64/boot/dts/rockchip/rk3328-tpe-r1400.dts -@@ -0,0 +1,413 @@ -+// SPDX-License-Identifier: (GPL-2.0+ OR MIT) -+/* -+ * Copyright (c) 2020 David Bauer -+ */ -+ -+/dts-v1/; -+ -+#include -+#include -+#include "rk3328.dtsi" -+ -+/ { -+ model = "ThinkPenguin TPE-R1400"; -+ compatible = "thinkpenguin,tpe-r1400", "rockchip,rk3328"; -+ -+ aliases { -+ led-boot = &sys_led; -+ led-failsafe = &sys_led; -+ led-running = &sys_led; -+ led-upgrade = &sys_led; -+ }; -+ -+ chosen { -+ stdout-path = "serial2:1500000n8"; -+ }; -+ -+ gmac_clk: gmac-clock { -+ compatible = "fixed-clock"; -+ clock-frequency = <125000000>; -+ clock-output-names = "gmac_clkin"; -+ #clock-cells = <0>; -+ }; -+ -+ keys { -+ compatible = "gpio-keys"; -+ pinctrl-0 = <&reset_button_pin>; -+ pinctrl-names = "default"; -+ -+ reset { -+ label = "reset"; -+ gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>; -+ linux,code = ; -+ debounce-interval = <50>; -+ }; -+ }; -+ -+ vcc_rtl8153: vcc-rtl8153-regulator { -+ compatible = "regulator-fixed"; -+ gpio = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&rtl8153_en_drv>; -+ regulator-always-on; -+ regulator-name = "vcc_rtl8153"; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ enable-active-high; -+ }; -+ -+ leds { -+ compatible = "gpio-leds"; -+ pinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>; -+ pinctrl-names = "default"; -+ -+ lan_led: led-0 { -+ gpios = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>; -+ label = "tpe-r1400:green:lan"; -+ }; -+ -+ sys_led: led-1 { -+ gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>; -+ label = "tpe-r1400:red:sys"; -+ }; -+ -+ wan_led: led-2 { -+ gpios = <&gpio2 RK_PC2 GPIO_ACTIVE_HIGH>; -+ label = "tpe-r1400:green:wan"; -+ }; -+ }; -+ -+ vcc_io_sdio: sdmmcio-regulator { -+ compatible = "regulator-gpio"; -+ enable-active-high; -+ gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>; -+ pinctrl-0 = <&sdio_vcc_pin>; -+ pinctrl-names = "default"; -+ regulator-name = "vcc_io_sdio"; -+ regulator-always-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <3300000>; -+ regulator-settling-time-us = <5000>; -+ regulator-type = "voltage"; -+ startup-delay-us = <2000>; -+ states = <1800000 0x1>, -+ <3300000 0x0>; -+ vin-supply = <&vcc_io_33>; -+ }; -+ -+ vcc_sd: sdmmc-regulator { -+ compatible = "regulator-fixed"; -+ gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>; -+ pinctrl-0 = <&sdmmc0m1_pin>; -+ pinctrl-names = "default"; -+ regulator-name = "vcc_sd"; -+ regulator-boot-on; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ vin-supply = <&vcc_io_33>; -+ }; -+ -+ vdd_5v: vdd-5v { -+ compatible = "regulator-fixed"; -+ regulator-name = "vdd_5v"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ }; -+}; -+ -+&cpu0 { -+ cpu-supply = <&vdd_arm>; -+}; -+ -+&cpu1 { -+ cpu-supply = <&vdd_arm>; -+}; -+ -+&cpu2 { -+ cpu-supply = <&vdd_arm>; -+}; -+ -+&cpu3 { -+ cpu-supply = <&vdd_arm>; -+}; -+ -+&display_subsystem { -+ status = "disabled"; -+}; -+ -+&gmac2io { -+ assigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>; -+ assigned-clock-parents = <&gmac_clk>, <&gmac_clk>; -+ clock_in_out = "input"; -+ phy-handle = <&rtl8211e>; -+ phy-mode = "rgmii"; -+ phy-supply = <&vcc_io_33>; -+ pinctrl-0 = <&rgmiim1_pins>; -+ pinctrl-names = "default"; -+ rx_delay = <0x18>; -+ snps,aal; -+ tx_delay = <0x24>; -+ status = "okay"; -+ -+ mdio { -+ compatible = "snps,dwmac-mdio"; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ rtl8211e: ethernet-phy@1 { -+ reg = <1>; -+ pinctrl-0 = <ð_phy_reset_pin>; -+ pinctrl-names = "default"; -+ reset-assert-us = <10000>; -+ reset-deassert-us = <50000>; -+ reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; -+ }; -+ }; -+}; -+ -+&i2c1 { -+ status = "okay"; -+ -+ rk805: pmic@18 { -+ compatible = "rockchip,rk805"; -+ reg = <0x18>; -+ interrupt-parent = <&gpio1>; -+ interrupts = <24 IRQ_TYPE_LEVEL_LOW>; -+ #clock-cells = <1>; -+ clock-output-names = "xin32k", "rk805-clkout2"; -+ gpio-controller; -+ #gpio-cells = <2>; -+ pinctrl-0 = <&pmic_int_l>; -+ pinctrl-names = "default"; -+ rockchip,system-power-controller; -+ wakeup-source; -+ -+ vcc1-supply = <&vdd_5v>; -+ vcc2-supply = <&vdd_5v>; -+ vcc3-supply = <&vdd_5v>; -+ vcc4-supply = <&vdd_5v>; -+ vcc5-supply = <&vcc_io_33>; -+ vcc6-supply = <&vdd_5v>; -+ -+ regulators { -+ vdd_log: DCDC_REG1 { -+ regulator-name = "vdd_log"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <712500>; -+ regulator-max-microvolt = <1450000>; -+ regulator-ramp-delay = <12500>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <1000000>; -+ }; -+ }; -+ -+ vdd_arm: DCDC_REG2 { -+ regulator-name = "vdd_arm"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <712500>; -+ regulator-max-microvolt = <1450000>; -+ regulator-ramp-delay = <12500>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <950000>; -+ }; -+ }; -+ -+ vcc_ddr: DCDC_REG3 { -+ regulator-name = "vcc_ddr"; -+ regulator-always-on; -+ regulator-boot-on; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ }; -+ }; -+ -+ vcc_io_33: DCDC_REG4 { -+ regulator-name = "vcc_io_33"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <3300000>; -+ }; -+ }; -+ -+ vcc_18: LDO_REG1 { -+ regulator-name = "vcc_18"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <1800000>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <1800000>; -+ }; -+ }; -+ -+ vcc18_emmc: LDO_REG2 { -+ regulator-name = "vcc18_emmc"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <1800000>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <1800000>; -+ }; -+ }; -+ -+ vdd_10: LDO_REG3 { -+ regulator-name = "vdd_10"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1000000>; -+ regulator-max-microvolt = <1000000>; -+ -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <1000000>; -+ }; -+ }; -+ }; -+ }; -+ -+ usb { -+ rtl8153_en_drv: rtl8153-en-drv { -+ rockchip,pins = <2 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ }; -+}; -+ -+&io_domains { -+ pmuio-supply = <&vcc_io_33>; -+ vccio1-supply = <&vcc_io_33>; -+ vccio2-supply = <&vcc18_emmc>; -+ vccio3-supply = <&vcc_io_sdio>; -+ vccio4-supply = <&vcc_18>; -+ vccio5-supply = <&vcc_io_33>; -+ vccio6-supply = <&vcc_io_33>; -+ status = "okay"; -+}; -+ -+&pinctrl { -+ button { -+ reset_button_pin: reset-button-pin { -+ rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ }; -+ -+ ethernet-phy { -+ eth_phy_reset_pin: eth-phy-reset-pin { -+ rockchip,pins = <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>; -+ }; -+ }; -+ -+ leds { -+ lan_led_pin: lan-led-pin { -+ rockchip,pins = <2 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ -+ sys_led_pin: sys-led-pin { -+ rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ -+ wan_led_pin: wan-led-pin { -+ rockchip,pins = <2 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ }; -+ -+ pmic { -+ pmic_int_l: pmic-int-l { -+ rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>; -+ }; -+ }; -+ -+ sd { -+ sdio_vcc_pin: sdio-vcc-pin { -+ rockchip,pins = <1 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>; -+ }; -+ }; -+}; -+ -+&pwm2 { -+ status = "okay"; -+}; -+ -+&sdmmc { -+ bus-width = <4>; -+ cap-sd-highspeed; -+ disable-wp; -+ pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>; -+ pinctrl-names = "default"; -+ sd-uhs-sdr12; -+ sd-uhs-sdr25; -+ sd-uhs-sdr50; -+ sd-uhs-sdr104; -+ vmmc-supply = <&vcc_sd>; -+ vqmmc-supply = <&vcc_io_sdio>; -+ status = "okay"; -+}; -+ -+&tsadc { -+ rockchip,hw-tshut-mode = <0>; -+ rockchip,hw-tshut-polarity = <0>; -+ status = "okay"; -+}; -+ -+&u2phy { -+ status = "okay"; -+}; -+ -+&u2phy_host { -+ status = "okay"; -+}; -+ -+&u2phy_otg { -+ status = "okay"; -+}; -+ -+&uart2 { -+ status = "okay"; -+}; -+ -+&usb20_otg { -+ status = "okay"; -+ dr_mode = "host"; -+}; -+ -+&usb_host0_ehci { -+ status = "okay"; -+}; -+ -+&usb_host0_ohci { -+ status = "okay"; -+}; -+ -+&usbdrd3 { -+ status = "okay"; -+}; -+ -+&usbdrd_dwc3 { -+ dr_mode = "host"; -+ status = "okay"; -+ -+ usb-eth@2 { -+ compatible = "realtek,rtl8153"; -+ reg = <2>; -+ -+ realtek,led-data = <0x87>; -+ }; -+}; diff --git a/target/linux/rockchip/patches-5.10/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch b/target/linux/rockchip/patches-5.15/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch similarity index 100% rename from target/linux/rockchip/patches-5.10/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch rename to target/linux/rockchip/patches-5.15/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch diff --git a/target/linux/rockchip/patches-5.15/006-v6.4-arm64-dts-rockchip-Add-FriendlyARM-NanoPi-R2C.patch b/target/linux/rockchip/patches-5.15/006-v6.4-arm64-dts-rockchip-Add-FriendlyARM-NanoPi-R2C.patch new file mode 100644 index 0000000000..f58463b3d1 --- /dev/null +++ b/target/linux/rockchip/patches-5.15/006-v6.4-arm64-dts-rockchip-Add-FriendlyARM-NanoPi-R2C.patch @@ -0,0 +1,70 @@ +From 004589ff9df5b75672a78b6c3c4cba93202b14c9 Mon Sep 17 00:00:00 2001 +From: Tianling Shen +Date: Sat, 25 Mar 2023 15:40:20 +0800 +Subject: [PATCH] arm64: dts: rockchip: Add FriendlyARM NanoPi R2C + +The NanoPi R2C is a minor variant of NanoPi R2S with the on-board NIC +chip changed from rtl8211e to yt8521s, and otherwise identical to R2S. + +Signed-off-by: Tianling Shen +Link: https://lore.kernel.org/r/20230325074022.9818-3-cnsztl@gmail.com +Signed-off-by: Heiko Stuebner +--- + arch/arm64/boot/dts/rockchip/Makefile | 1 + + .../boot/dts/rockchip/rk3328-nanopi-r2c.dts | 40 +++++++++++++++++++ + 2 files changed, 41 insertions(+) + create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2c.dts + +--- a/arch/arm64/boot/dts/rockchip/Makefile ++++ b/arch/arm64/boot/dts/rockchip/Makefile +@@ -9,6 +9,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3318-a9 + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-odroid-go2.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2c.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb +--- /dev/null ++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2c.dts +@@ -0,0 +1,40 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT ++/* ++ * Copyright (c) 2021 FriendlyElec Computer Tech. Co., Ltd. ++ * (http://www.friendlyarm.com) ++ * ++ * Copyright (c) 2021-2023 Tianling Shen ++ */ ++ ++/dts-v1/; ++#include "rk3328-nanopi-r2s.dts" ++ ++/ { ++ model = "FriendlyElec NanoPi R2C"; ++ compatible = "friendlyarm,nanopi-r2c", "rockchip,rk3328"; ++}; ++ ++&gmac2io { ++ phy-handle = <&yt8521s>; ++ tx_delay = <0x22>; ++ rx_delay = <0x12>; ++ ++ mdio { ++ /delete-node/ ethernet-phy@1; ++ ++ yt8521s: ethernet-phy@3 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <3>; ++ ++ motorcomm,clk-out-frequency-hz = <125000000>; ++ motorcomm,keep-pll-enabled; ++ motorcomm,auto-sleep-disabled; ++ ++ pinctrl-0 = <ð_phy_reset_pin>; ++ pinctrl-names = "default"; ++ reset-assert-us = <10000>; ++ reset-deassert-us = <50000>; ++ reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++}; diff --git a/target/linux/rockchip/patches-5.15/007-v6.3-arm64-dts-rockchip-rk3328-Add-Orange-Pi-R1-Plus.patch b/target/linux/rockchip/patches-5.15/007-v6.3-arm64-dts-rockchip-rk3328-Add-Orange-Pi-R1-Plus.patch new file mode 100644 index 0000000000..053a4d0d8e --- /dev/null +++ b/target/linux/rockchip/patches-5.15/007-v6.3-arm64-dts-rockchip-rk3328-Add-Orange-Pi-R1-Plus.patch @@ -0,0 +1,407 @@ +From 51712e1d014aaaa4c6e1e7e84932d58b5c0f59ed Mon Sep 17 00:00:00 2001 +From: Chukun Pan +Date: Sat, 3 Dec 2022 15:41:49 +0800 +Subject: [PATCH] arm64: dts: rockchip: rk3328: Add Orange Pi R1 Plus + +Orange Pi R1 Plus is a Rockchip RK3328 based SBC by Xunlong. + +This device is similar to the NanoPi R2S, and has a 16MB +SPI NOR (mx25l12805d). The reset button is changed to +directly reset the power supply, another detail is that +both network ports have independent MAC addresses. + +Signed-off-by: Chukun Pan +Link: https://lore.kernel.org/r/20221203074149.11543-3-amadeus@jmu.edu.cn +Signed-off-by: Heiko Stuebner +--- + arch/arm64/boot/dts/rockchip/Makefile | 1 + + .../dts/rockchip/rk3328-orangepi-r1-plus.dts | 373 ++++++++++++++++++ + 2 files changed, 374 insertions(+) + create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts + +--- a/arch/arm64/boot/dts/rockchip/Makefile ++++ b/arch/arm64/boot/dts/rockchip/Makefile +@@ -11,6 +11,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1 + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2c.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb +--- /dev/null ++++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts +@@ -0,0 +1,373 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++/* ++ * Based on rk3328-nanopi-r2s.dts, which is: ++ * Copyright (c) 2020 David Bauer ++ */ ++ ++/dts-v1/; ++ ++#include ++#include ++#include "rk3328.dtsi" ++ ++/ { ++ model = "Xunlong Orange Pi R1 Plus"; ++ compatible = "xunlong,orangepi-r1-plus", "rockchip,rk3328"; ++ ++ aliases { ++ ethernet1 = &rtl8153; ++ mmc0 = &sdmmc; ++ }; ++ ++ chosen { ++ stdout-path = "serial2:1500000n8"; ++ }; ++ ++ gmac_clk: gmac-clock { ++ compatible = "fixed-clock"; ++ clock-frequency = <125000000>; ++ clock-output-names = "gmac_clkin"; ++ #clock-cells = <0>; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ pinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>; ++ pinctrl-names = "default"; ++ ++ led-0 { ++ function = LED_FUNCTION_LAN; ++ color = ; ++ gpios = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ led-1 { ++ function = LED_FUNCTION_STATUS; ++ color = ; ++ gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>; ++ linux,default-trigger = "heartbeat"; ++ }; ++ ++ led-2 { ++ function = LED_FUNCTION_WAN; ++ color = ; ++ gpios = <&gpio2 RK_PC2 GPIO_ACTIVE_HIGH>; ++ }; ++ }; ++ ++ vcc_sd: sdmmc-regulator { ++ compatible = "regulator-fixed"; ++ gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>; ++ pinctrl-0 = <&sdmmc0m1_pin>; ++ pinctrl-names = "default"; ++ regulator-name = "vcc_sd"; ++ regulator-boot-on; ++ vin-supply = <&vcc_io>; ++ }; ++ ++ vcc_sys: vcc-sys-regulator { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc_sys"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ }; ++ ++ vdd_5v_lan: vdd-5v-lan-regulator { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ gpio = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>; ++ pinctrl-0 = <&lan_vdd_pin>; ++ pinctrl-names = "default"; ++ regulator-name = "vdd_5v_lan"; ++ regulator-always-on; ++ regulator-boot-on; ++ vin-supply = <&vcc_sys>; ++ }; ++}; ++ ++&cpu0 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&cpu1 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&cpu2 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&cpu3 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&display_subsystem { ++ status = "disabled"; ++}; ++ ++&gmac2io { ++ assigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>; ++ assigned-clock-parents = <&gmac_clk>, <&gmac_clk>; ++ clock_in_out = "input"; ++ phy-handle = <&rtl8211e>; ++ phy-mode = "rgmii"; ++ phy-supply = <&vcc_io>; ++ pinctrl-0 = <&rgmiim1_pins>; ++ pinctrl-names = "default"; ++ snps,aal; ++ rx_delay = <0x18>; ++ tx_delay = <0x24>; ++ status = "okay"; ++ ++ mdio { ++ compatible = "snps,dwmac-mdio"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ rtl8211e: ethernet-phy@1 { ++ reg = <1>; ++ pinctrl-0 = <ð_phy_reset_pin>; ++ pinctrl-names = "default"; ++ reset-assert-us = <10000>; ++ reset-deassert-us = <50000>; ++ reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++}; ++ ++&i2c1 { ++ status = "okay"; ++ ++ rk805: pmic@18 { ++ compatible = "rockchip,rk805"; ++ reg = <0x18>; ++ interrupt-parent = <&gpio1>; ++ interrupts = <24 IRQ_TYPE_LEVEL_LOW>; ++ #clock-cells = <1>; ++ clock-output-names = "xin32k", "rk805-clkout2"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ pinctrl-0 = <&pmic_int_l>; ++ pinctrl-names = "default"; ++ rockchip,system-power-controller; ++ wakeup-source; ++ ++ vcc1-supply = <&vcc_sys>; ++ vcc2-supply = <&vcc_sys>; ++ vcc3-supply = <&vcc_sys>; ++ vcc4-supply = <&vcc_sys>; ++ vcc5-supply = <&vcc_io>; ++ vcc6-supply = <&vcc_sys>; ++ ++ regulators { ++ vdd_log: DCDC_REG1 { ++ regulator-name = "vdd_log"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <712500>; ++ regulator-max-microvolt = <1450000>; ++ regulator-ramp-delay = <12500>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1000000>; ++ }; ++ }; ++ ++ vdd_arm: DCDC_REG2 { ++ regulator-name = "vdd_arm"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <712500>; ++ regulator-max-microvolt = <1450000>; ++ regulator-ramp-delay = <12500>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <950000>; ++ }; ++ }; ++ ++ vcc_ddr: DCDC_REG3 { ++ regulator-name = "vcc_ddr"; ++ regulator-always-on; ++ regulator-boot-on; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ }; ++ }; ++ ++ vcc_io: DCDC_REG4 { ++ regulator-name = "vcc_io"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <3300000>; ++ }; ++ }; ++ ++ vcc_18: LDO_REG1 { ++ regulator-name = "vcc_18"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1800000>; ++ }; ++ }; ++ ++ vcc18_emmc: LDO_REG2 { ++ regulator-name = "vcc18_emmc"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1800000>; ++ }; ++ }; ++ ++ vdd_10: LDO_REG3 { ++ regulator-name = "vdd_10"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1000000>; ++ regulator-max-microvolt = <1000000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1000000>; ++ }; ++ }; ++ }; ++ }; ++}; ++ ++&io_domains { ++ pmuio-supply = <&vcc_io>; ++ vccio1-supply = <&vcc_io>; ++ vccio2-supply = <&vcc18_emmc>; ++ vccio3-supply = <&vcc_io>; ++ vccio4-supply = <&vcc_io>; ++ vccio5-supply = <&vcc_io>; ++ vccio6-supply = <&vcc_io>; ++ status = "okay"; ++}; ++ ++&pinctrl { ++ gmac2io { ++ eth_phy_reset_pin: eth-phy-reset-pin { ++ rockchip,pins = <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>; ++ }; ++ }; ++ ++ leds { ++ lan_led_pin: lan-led-pin { ++ rockchip,pins = <2 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ sys_led_pin: sys-led-pin { ++ rockchip,pins = <3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ wan_led_pin: wan-led-pin { ++ rockchip,pins = <2 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ lan { ++ lan_vdd_pin: lan-vdd-pin { ++ rockchip,pins = <2 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ pmic { ++ pmic_int_l: pmic-int-l { ++ rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++}; ++ ++&pwm2 { ++ status = "okay"; ++}; ++ ++&sdmmc { ++ bus-width = <4>; ++ cap-sd-highspeed; ++ disable-wp; ++ pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>; ++ pinctrl-names = "default"; ++ vmmc-supply = <&vcc_sd>; ++ status = "okay"; ++}; ++ ++&spi0 { ++ status = "okay"; ++ ++ flash@0 { ++ compatible = "jedec,spi-nor"; ++ reg = <0>; ++ spi-max-frequency = <50000000>; ++ }; ++}; ++ ++&tsadc { ++ rockchip,hw-tshut-mode = <0>; ++ rockchip,hw-tshut-polarity = <0>; ++ status = "okay"; ++}; ++ ++&u2phy { ++ status = "okay"; ++}; ++ ++&u2phy_host { ++ status = "okay"; ++}; ++ ++&u2phy_otg { ++ status = "okay"; ++}; ++ ++&uart2 { ++ status = "okay"; ++}; ++ ++&usb20_otg { ++ dr_mode = "host"; ++ status = "okay"; ++}; ++ ++&usbdrd3 { ++ dr_mode = "host"; ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ /* Second port is for USB 3.0 */ ++ rtl8153: device@2 { ++ compatible = "usbbda,8153"; ++ reg = <2>; ++ }; ++}; ++ ++&usb_host0_ehci { ++ status = "okay"; ++}; ++ ++&usb_host0_ohci { ++ status = "okay"; ++}; diff --git a/target/linux/rockchip/patches-5.15/008-v6.4-arm64-dts-rockchip-Add-Xunlong-OrangePi-R1-Plus-LTS.patch b/target/linux/rockchip/patches-5.15/008-v6.4-arm64-dts-rockchip-Add-Xunlong-OrangePi-R1-Plus-LTS.patch new file mode 100644 index 0000000000..cedf28dc79 --- /dev/null +++ b/target/linux/rockchip/patches-5.15/008-v6.4-arm64-dts-rockchip-Add-Xunlong-OrangePi-R1-Plus-LTS.patch @@ -0,0 +1,71 @@ +From 387b3bbac5ea6a0a105d685237f033ffe0f184f1 Mon Sep 17 00:00:00 2001 +From: Tianling Shen +Date: Sat, 25 Mar 2023 15:40:22 +0800 +Subject: [PATCH] arm64: dts: rockchip: Add Xunlong OrangePi R1 Plus LTS + +The OrangePi R1 Plus LTS is a minor variant of OrangePi R1 Plus with +the on-board NIC chip changed from rtl8211e to yt8531c, and otherwise +identical to OrangePi R1 Plus. + +Signed-off-by: Tianling Shen +Link: https://lore.kernel.org/r/20230325074022.9818-5-cnsztl@gmail.com +Signed-off-by: Heiko Stuebner +--- + arch/arm64/boot/dts/rockchip/Makefile | 1 + + .../rockchip/rk3328-orangepi-r1-plus-lts.dts | 40 +++++++++++++++++++ + 2 files changed, 41 insertions(+) + create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts + +--- a/arch/arm64/boot/dts/rockchip/Makefile ++++ b/arch/arm64/boot/dts/rockchip/Makefile +@@ -12,6 +12,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-ev + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2c.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus-lts.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb +--- /dev/null ++++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts +@@ -0,0 +1,40 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT ++/* ++ * Copyright (c) 2016 Xunlong Software. Co., Ltd. ++ * (http://www.orangepi.org) ++ * ++ * Copyright (c) 2021-2023 Tianling Shen ++ */ ++ ++/dts-v1/; ++#include "rk3328-orangepi-r1-plus.dts" ++ ++/ { ++ model = "Xunlong Orange Pi R1 Plus LTS"; ++ compatible = "xunlong,orangepi-r1-plus-lts", "rockchip,rk3328"; ++}; ++ ++&gmac2io { ++ phy-handle = <&yt8531c>; ++ tx_delay = <0x19>; ++ rx_delay = <0x05>; ++ ++ mdio { ++ /delete-node/ ethernet-phy@1; ++ ++ yt8531c: ethernet-phy@0 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <0>; ++ ++ motorcomm,clk-out-frequency-hz = <125000000>; ++ motorcomm,keep-pll-enabled; ++ motorcomm,auto-sleep-disabled; ++ ++ pinctrl-0 = <ð_phy_reset_pin>; ++ pinctrl-names = "default"; ++ reset-assert-us = <15000>; ++ reset-deassert-us = <50000>; ++ reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++}; diff --git a/target/linux/rockchip/patches-5.15/009-v6.4-arm64-dts-rockchip-Add-ThinkPenguin-TPE-R1400.patch b/target/linux/rockchip/patches-5.15/009-v6.4-arm64-dts-rockchip-Add-ThinkPenguin-TPE-R1400.patch new file mode 100644 index 0000000000..cc46e2d390 --- /dev/null +++ b/target/linux/rockchip/patches-5.15/009-v6.4-arm64-dts-rockchip-Add-ThinkPenguin-TPE-R1400.patch @@ -0,0 +1,29 @@ +--- a/arch/arm64/boot/dts/rockchip/Makefile ++++ b/arch/arm64/boot/dts/rockchip/Makefile +@@ -16,6 +16,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-or + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-tpe-r1400.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-evb-act8846.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-geekbox.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-lion-haikou.dtb +--- /dev/null ++++ b/arch/arm64/boot/dts/rockchip/rk3328-tpe-r1400.dts +@@ -0,0 +1,16 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT ++/* ++ * Copyright (c) 2021 FriendlyElec Computer Tech. Co., Ltd. ++ * (http://www.friendlyarm.com) ++ * ++ * Copyright (c) 2021-2023 Tianling Shen ++ */ ++ ++ ++/dts-v1/; ++#include "rk3328-nanopi-r2s.dts" ++ ++/ { ++ model = "ThinkPenguin TPE-R1400"; ++ compatible = "thinkpenguin,tpe-r1400", "rockchip,rk3328"; ++}; diff --git a/target/linux/rockchip/patches-5.15/100-rockchip-use-system-LED-for-OpenWrt.patch b/target/linux/rockchip/patches-5.15/100-rockchip-use-system-LED-for-OpenWrt.patch new file mode 100644 index 0000000000..0074ef7bcc --- /dev/null +++ b/target/linux/rockchip/patches-5.15/100-rockchip-use-system-LED-for-OpenWrt.patch @@ -0,0 +1,65 @@ +From 6731d2c9039fbe1ecf21915eab3acee0a999508a Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Fri, 10 Jul 2020 21:38:20 +0200 +Subject: [PATCH] rockchip: use system LED for libreCMC + +Use the SYS LED on the casing for showing system status. + +This patch is kept separate from the NanoPi R2S support patch, as i plan +on submitting the device support upstream. + +Signed-off-by: David Bauer +--- + arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts +@@ -16,6 +16,11 @@ + aliases { + ethernet1 = &rtl8153; + mmc0 = &sdmmc; ++ ++ led-boot = &sys_led; ++ led-failsafe = &sys_led; ++ led-running = &sys_led; ++ led-upgrade = &sys_led; + }; + + chosen { +@@ -49,18 +54,18 @@ + + lan_led: led-0 { + gpios = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>; +- label = "nanopi-r2s:green:lan"; ++ label = "green:lan"; + }; + + sys_led: led-1 { + gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>; +- label = "nanopi-r2s:red:sys"; ++ label = "red:sys"; + default-state = "on"; + }; + + wan_led: led-2 { + gpios = <&gpio2 RK_PC2 GPIO_ACTIVE_HIGH>; +- label = "nanopi-r2s:green:wan"; ++ label = "green:wan"; + }; + }; + +--- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +@@ -13,6 +13,11 @@ + aliases { + mmc0 = &sdmmc; + mmc1 = &emmc; ++ ++ led-boot = &power_led; ++ led-failsafe = &power_led; ++ led-running = &power_led; ++ led-upgrade = &power_led; + }; + + chosen { diff --git a/target/linux/rockchip/patches-5.15/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch b/target/linux/rockchip/patches-5.15/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch new file mode 100644 index 0000000000..2221077c97 --- /dev/null +++ b/target/linux/rockchip/patches-5.15/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch @@ -0,0 +1,24 @@ +From 2795c8b31a686bdb8338f9404d18ef7a154f0d75 Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Sun, 26 Jul 2020 13:32:59 +0200 +Subject: [PATCH] arm64: rockchip: add OF node for USB eth on NanoPi R2S + +This adds the OF node for the USB3 ethernet adapter on the FriendlyARM +NanoPi R2S. Add the correct value for the RTL8153 LED configuration +register to match the blink behavior of the other port on the device. + +Signed-off-by: David Bauer +--- + arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 7 +++++++ + 1 file changed, 1 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts +@@ -402,6 +402,7 @@ + rtl8153: device@2 { + compatible = "usbbda,8153"; + reg = <2>; ++ realtek,led-data = <0x87>; + }; + }; + diff --git a/target/linux/rockchip/patches-5.15/105-nanopi-r4s-sd-signalling.patch b/target/linux/rockchip/patches-5.15/105-nanopi-r4s-sd-signalling.patch new file mode 100644 index 0000000000..856970738a --- /dev/null +++ b/target/linux/rockchip/patches-5.15/105-nanopi-r4s-sd-signalling.patch @@ -0,0 +1,36 @@ +From: David Bauer +Subject: arm64: dts: rockchip: disable UHS modes for NanoPi R4S + +The NanoPi R4S leaves the SD card in 1.8V signalling when rebooting +while U-Boot requires the card to be in 3.3V mode. + +Remove UHS support from the SD controller so the card remains in 3.3V +mode. This reduces transfer speeds but ensures a reboot whether from +userspace or following a kernel panic is always working. + +Signed-off-by: David Bauer + +--- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +@@ -335,7 +335,6 @@ + sd-uhs-sdr12; + sd-uhs-sdr25; + sd-uhs-sdr50; +- sd-uhs-sdr104; + vmmc-supply = <&vcc_sd>; + vqmmc-supply = <&vcc_sdio>; + status = "okay"; +--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts +@@ -121,6 +121,11 @@ + status = "disabled"; + }; + ++&sdmmc { ++ /delete-property/ sd-uhs-sdr104; ++ cap-sd-highspeed; ++}; ++ + &u2phy0_host { + phy-supply = <&vdd_5v>; + }; diff --git a/target/linux/rockchip/patches-5.10/106-r4s-openwrt-leds.patch b/target/linux/rockchip/patches-5.15/106-r4s-openwrt-leds.patch similarity index 100% rename from target/linux/rockchip/patches-5.10/106-r4s-openwrt-leds.patch rename to target/linux/rockchip/patches-5.15/106-r4s-openwrt-leds.patch diff --git a/target/linux/rockchip/patches-5.15/107-arm64-dts-rockchip-Update-LED-properties-for-Orange-.patch b/target/linux/rockchip/patches-5.15/107-arm64-dts-rockchip-Update-LED-properties-for-Orange-.patch new file mode 100644 index 0000000000..25472d7e55 --- /dev/null +++ b/target/linux/rockchip/patches-5.15/107-arm64-dts-rockchip-Update-LED-properties-for-Orange-.patch @@ -0,0 +1,56 @@ +From d2166e3b3680bd2b206aebf1e1ce4c0d346f3c50 Mon Sep 17 00:00:00 2001 +From: Tianling Shen +Date: Fri, 19 May 2023 12:10:52 +0800 +Subject: [PATCH] arm64: dts: rockchip: Update LED properties for Orange Pi R1 + Plus + +Add libreCMC's LED aliases for showing system status. +Also replace function/color with legacy label as libreCMC relys on it +to update LED settings. + +Signed-off-by: Tianling Shen +--- + .../dts/rockchip/rk3328-orangepi-r1-plus.dts | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +--- a/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts +@@ -17,6 +17,11 @@ + aliases { + ethernet1 = &rtl8153; + mmc0 = &sdmmc; ++ ++ led-boot = &status_led; ++ led-failsafe = &status_led; ++ led-running = &status_led; ++ led-upgrade = &status_led; + }; + + chosen { +@@ -36,22 +41,18 @@ + pinctrl-names = "default"; + + led-0 { +- function = LED_FUNCTION_LAN; +- color = ; + gpios = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>; ++ label = "green:lan"; + }; + +- led-1 { +- function = LED_FUNCTION_STATUS; +- color = ; ++ status_led: led-1 { + gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>; +- linux,default-trigger = "heartbeat"; ++ label = "red:status"; + }; + + led-2 { +- function = LED_FUNCTION_WAN; +- color = ; + gpios = <&gpio2 RK_PC2 GPIO_ACTIVE_HIGH>; ++ label = "green:wan"; + }; + }; + diff --git a/target/linux/rockchip/patches-5.15/108-arm64-dts-rockchip-add-LED-configuration-to-Orange-P.patch b/target/linux/rockchip/patches-5.15/108-arm64-dts-rockchip-add-LED-configuration-to-Orange-P.patch new file mode 100644 index 0000000000..37b59925fc --- /dev/null +++ b/target/linux/rockchip/patches-5.15/108-arm64-dts-rockchip-add-LED-configuration-to-Orange-P.patch @@ -0,0 +1,24 @@ +From b46a530d12ada422b9d5b2b97059e0d3ed950b40 Mon Sep 17 00:00:00 2001 +From: Tianling Shen +Date: Fri, 19 May 2023 12:38:04 +0800 +Subject: [PATCH] arm64: dts: rockchip: add LED configuration to Orange Pi R1 + Plus + +Add the correct value for the RTL8153 LED configuration register to +match the blink behavior of the other port on the device. + +Signed-off-by: Tianling Shen +--- + arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts | 1 + + 1 file changed, 1 insertion(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts +@@ -362,6 +362,7 @@ + rtl8153: device@2 { + compatible = "usbbda,8153"; + reg = <2>; ++ realtek,led-data = <0x87>; + }; + }; + diff --git a/target/linux/sunxi/Makefile b/target/linux/sunxi/Makefile index 682603341d..7a2b8af05a 100644 --- a/target/linux/sunxi/Makefile +++ b/target/linux/sunxi/Makefile @@ -10,7 +10,7 @@ BOARDNAME:=Allwinner A1x/A20/A3x/H3/H5/R40 FEATURES:=fpu usb ext4 display rootfs-part rtc squashfs SUBTARGETS:=cortexa8 cortexa7 cortexa53 -KERNEL_PATCHVER:=5.10 +KERNEL_PATCHVER:=5.15 KERNELNAME:=zImage dtbs diff --git a/target/linux/sunxi/base-files/etc/board.d/01_leds b/target/linux/sunxi/base-files/etc/board.d/01_leds index 60783363de..da94e40373 100644 --- a/target/linux/sunxi/base-files/etc/board.d/01_leds +++ b/target/linux/sunxi/base-files/etc/board.d/01_leds @@ -9,8 +9,8 @@ board_config_update case $board in friendlyarm,nanopi-r1|\ friendlyarm,nanopi-r1s-h5) - ucidef_set_led_netdev "wan" "WAN" "nanopi:green:wan" "eth0" - ucidef_set_led_netdev "lan" "LAN" "nanopi:green:lan" "eth1" + ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth0" + ucidef_set_led_netdev "lan" "LAN" "green:lan" "eth1" ;; esac diff --git a/target/linux/sunxi/base-files/etc/board.d/02_network b/target/linux/sunxi/base-files/etc/board.d/02_network index 46ace1f67c..b295dc7daa 100644 --- a/target/linux/sunxi/base-files/etc/board.d/02_network +++ b/target/linux/sunxi/base-files/etc/board.d/02_network @@ -29,6 +29,27 @@ sunxi_setup_interfaces() esac } +nanopi_r1_get_mac() +{ + local interface=$1 + local eeprom_path="/sys/bus/i2c/devices/2-0051/eeprom" + local address + + if [ -f "$eeprom_path" ]; then + address=$(get_mac_binary "$eeprom_path" 0xfa) + if [ "$interface" = "lan" ]; then + address=$(macaddr_setbit_la "$address") + fi + else + address=$(macaddr_generate_from_mmc_cid mmcblk1) + if [ "$interface" = "lan" ]; then + address=$(macaddr_add "$address" 1) + fi + fi + + echo "$address" +} + sunxi_setup_macs() { local board="$1" @@ -37,6 +58,10 @@ sunxi_setup_macs() local label_mac="" case "$board" in + friendlyarm,nanopi-r1) + wan_mac=$(nanopi_r1_get_mac wan) + lan_mac=$(nanopi_r1_get_mac lan) + ;; friendlyarm,nanopi-r1s-h5) lan_mac=$(get_mac_binary "/sys/bus/i2c/devices/0-0051/eeprom" 0xfa) ;; diff --git a/target/linux/sunxi/base-files/lib/firmware/brcm/brcmfmac43430a0-sdio.txt b/target/linux/sunxi/base-files/lib/firmware/brcm/brcmfmac43430a0-sdio.txt deleted file mode 120000 index 2ed6689828..0000000000 --- a/target/linux/sunxi/base-files/lib/firmware/brcm/brcmfmac43430a0-sdio.txt +++ /dev/null @@ -1 +0,0 @@ -brcmfmac43430-sdio.txt \ No newline at end of file diff --git a/target/linux/sunxi/config-5.10 b/target/linux/sunxi/config-5.10 deleted file mode 100644 index fa43fa248d..0000000000 --- a/target/linux/sunxi/config-5.10 +++ /dev/null @@ -1,512 +0,0 @@ -# CONFIG_AHCI_SUNXI is not set -CONFIG_ALIGNMENT_TRAP=y -CONFIG_ARCH_32BIT_OFF_T=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -CONFIG_ARCH_KEEP_MEMBLOCK=y -CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y -CONFIG_ARCH_MULTIPLATFORM=y -CONFIG_ARCH_MULTI_V6_V7=y -CONFIG_ARCH_MULTI_V7=y -CONFIG_ARCH_NR_GPIO=416 -CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y -CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_ARCH_SUNXI=y -CONFIG_ARCH_SUNXI_MC_SMP=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARM=y -# CONFIG_ARM_ALLWINNER_SUN50I_CPUFREQ_NVMEM is not set -CONFIG_ARM_APPENDED_DTB=y -CONFIG_ARM_ARCH_TIMER=y -CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y -CONFIG_ARM_ATAG_DTB_COMPAT=y -CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y -CONFIG_ARM_CCI=y -CONFIG_ARM_CCI400_COMMON=y -CONFIG_ARM_CCI400_PORT_CTRL=y -CONFIG_ARM_CPU_SUSPEND=y -CONFIG_ARM_CRYPTO=y -CONFIG_ARM_ERRATA_643719=y -CONFIG_ARM_GIC=y -CONFIG_ARM_HAS_SG_CHAIN=y -CONFIG_ARM_HEAVY_MB=y -CONFIG_ARM_L1_CACHE_SHIFT=6 -CONFIG_ARM_L1_CACHE_SHIFT_6=y -CONFIG_ARM_LPAE=y -CONFIG_ARM_PATCH_IDIV=y -CONFIG_ARM_PATCH_PHYS_VIRT=y -CONFIG_ARM_PSCI=y -CONFIG_ARM_PSCI_FW=y -CONFIG_ARM_THUMB=y -CONFIG_ARM_UNWIND=y -CONFIG_ARM_VIRT_EXT=y -CONFIG_ATA=y -CONFIG_ATAGS=y -CONFIG_AUTO_ZRELADDR=y -CONFIG_AXP20X_POWER=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BACKLIGHT_PWM=y -CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_SD=y -CONFIG_BLK_PM=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BOUNCE=y -CONFIG_CACHE_L2X0=y -CONFIG_CAN=y -CONFIG_CLKDEV_LOOKUP=y -CONFIG_CLKSRC_MMIO=y -CONFIG_CLK_SUNXI=y -CONFIG_CLK_SUNXI_CLOCKS=y -CONFIG_CLK_SUNXI_PRCM_SUN6I=y -CONFIG_CLK_SUNXI_PRCM_SUN8I=y -CONFIG_CLK_SUNXI_PRCM_SUN9I=y -CONFIG_CLONE_BACKWARDS=y -CONFIG_COMMON_CLK=y -CONFIG_COMPAT_32BIT_TIME=y -CONFIG_CONFIGFS_FS=y -CONFIG_CONNECTOR=y -CONFIG_CONSOLE_TRANSLATIONS=y -CONFIG_COREDUMP=y -CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y -CONFIG_CPUFREQ_DT=y -CONFIG_CPUFREQ_DT_PLATDEV=y -CONFIG_CPU_32v6K=y -CONFIG_CPU_32v7=y -CONFIG_CPU_ABRT_EV7=y -CONFIG_CPU_CACHE_V7=y -CONFIG_CPU_CACHE_VIPT=y -CONFIG_CPU_COPY_V6=y -CONFIG_CPU_CP15=y -CONFIG_CPU_CP15_MMU=y -CONFIG_CPU_FREQ=y -CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y -CONFIG_CPU_FREQ_GOV_ATTR_SET=y -CONFIG_CPU_FREQ_GOV_COMMON=y -CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y -CONFIG_CPU_FREQ_GOV_ONDEMAND=y -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -CONFIG_CPU_FREQ_GOV_POWERSAVE=y -CONFIG_CPU_FREQ_GOV_USERSPACE=y -CONFIG_CPU_FREQ_STAT=y -CONFIG_CPU_HAS_ASID=y -CONFIG_CPU_PABRT_V7=y -CONFIG_CPU_PM=y -CONFIG_CPU_RMAP=y -CONFIG_CPU_SPECTRE=y -CONFIG_CPU_THERMAL=y -CONFIG_CPU_THUMB_CAPABLE=y -CONFIG_CPU_TLB_V7=y -CONFIG_CPU_V7=y -CONFIG_CRC16=y -CONFIG_CRC_T10DIF=y -CONFIG_CRYPTO_CRC32=y -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRCT10DIF=y -CONFIG_CRYPTO_CRCT10DIF_ARM_CE=y -CONFIG_CRYPTO_DES=y -CONFIG_CRYPTO_DEV_ALLWINNER=y -CONFIG_CRYPTO_DEV_SUN4I_SS=y -CONFIG_CRYPTO_DEV_SUN4I_SS_PRNG=y -# CONFIG_CRYPTO_DEV_SUN8I_CE is not set -# CONFIG_CRYPTO_DEV_SUN8I_SS is not set -CONFIG_CRYPTO_HW=y -CONFIG_CRYPTO_LIB_DES=y -CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_RNG=y -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_SHA1=y -CONFIG_DCACHE_WORD_ACCESS=y -CONFIG_DEBUG_BUGVERBOSE=y -CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" -CONFIG_DEBUG_MEMORY_INIT=y -CONFIG_DMADEVICES=y -CONFIG_DMA_ENGINE=y -CONFIG_DMA_OF=y -CONFIG_DMA_OPS=y -CONFIG_DMA_REMAP=y -CONFIG_DMA_SUN4I=y -CONFIG_DMA_SUN6I=y -CONFIG_DMA_VIRTUAL_CHANNELS=y -CONFIG_DNOTIFY=y -CONFIG_DTC=y -CONFIG_DUMMY_CONSOLE=y -CONFIG_DVB_CORE=y -CONFIG_DWMAC_GENERIC=y -# CONFIG_DWMAC_SUN8I is not set -CONFIG_DWMAC_SUNXI=y -CONFIG_DYNAMIC_DEBUG=y -CONFIG_EDAC_ATOMIC_SCRUB=y -CONFIG_EDAC_SUPPORT=y -CONFIG_ELF_CORE=y -CONFIG_ENABLE_MUST_CHECK=y -CONFIG_EXT4_FS=y -CONFIG_EXTCON=y -CONFIG_F2FS_FS=y -CONFIG_FAT_FS=y -CONFIG_FB=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_CMDLINE=y -CONFIG_FB_FOREIGN_ENDIAN=y -CONFIG_FB_LITTLE_ENDIAN=y -CONFIG_FB_MODE_HELPERS=y -CONFIG_FB_SIMPLE=y -CONFIG_FB_TILEBLITTING=y -CONFIG_FIXED_PHY=y -CONFIG_FIX_EARLYCON_MEM=y -CONFIG_FONT_8x16=y -CONFIG_FONT_8x8=y -CONFIG_FONT_SUPPORT=y -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y -CONFIG_FRAME_WARN=2048 -CONFIG_FREEZER=y -CONFIG_FS_IOMAP=y -CONFIG_FS_MBCACHE=y -CONFIG_FS_POSIX_ACL=y -CONFIG_FW_CACHE=y -CONFIG_FW_LOADER_PAGED_BUF=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_GENERIC_ARCH_TOPOLOGY=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_EARLY_IOREMAP=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_IDLE_POLL_SETUP=y -CONFIG_GENERIC_IRQ_CHIP=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_GENERIC_IRQ_MULTI_HANDLER=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_IRQ_SHOW_LEVEL=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_GENERIC_PHY=y -CONFIG_GENERIC_PINCONF=y -CONFIG_GENERIC_PINCTRL_GROUPS=y -CONFIG_GENERIC_PINMUX_FUNCTIONS=y -CONFIG_GENERIC_SCHED_CLOCK=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GENERIC_VDSO_32=y -CONFIG_GLOB=y -CONFIG_GPIOLIB=y -CONFIG_HANDLE_DOMAIN_IRQ=y -CONFIG_HARDEN_BRANCH_PREDICTOR=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_HAS_DMA=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HAVE_SMP=y -CONFIG_HIGHMEM=y -CONFIG_HIGHPTE=y -CONFIG_HOTPLUG_CPU=y -CONFIG_HWMON=y -CONFIG_HW_CONSOLE=y -CONFIG_HW_RANDOM=y -CONFIG_HW_RANDOM_TIMERIOMEM=y -CONFIG_HZ_FIXED=0 -CONFIG_I2C=y -CONFIG_I2C_BOARDINFO=y -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_COMPAT=y -CONFIG_I2C_HELPER_AUTO=y -CONFIG_I2C_MV64XXX=y -CONFIG_I2C_SUN6I_P2WI=y -CONFIG_IIO=y -CONFIG_INITRAMFS_SOURCE="" -CONFIG_INPUT=y -CONFIG_INPUT_AXP20X_PEK=y -CONFIG_INPUT_KEYBOARD=y -CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INPUT_TOUCHSCREEN=y -CONFIG_IRQCHIP=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_IRQ_WORK=y -CONFIG_JBD2=y -CONFIG_KALLSYMS=y -CONFIG_KEYBOARD_SUN4I_LRADC=y -CONFIG_KSM=y -CONFIG_LCD_CLASS_DEVICE=y -CONFIG_LCD_PLATFORM=y -CONFIG_LEDS_GPIO=y -CONFIG_LIBFDT=y -CONFIG_LOCK_DEBUGGING_SUPPORT=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_LOGO=y -CONFIG_LOGO_LINUX_CLUT224=y -CONFIG_LOGO_LINUX_MONO=y -CONFIG_LOGO_LINUX_VGA16=y -CONFIG_MACH_SUN4I=y -CONFIG_MACH_SUN5I=y -CONFIG_MACH_SUN6I=y -CONFIG_MACH_SUN7I=y -CONFIG_MACH_SUN8I=y -CONFIG_MACH_SUN9I=y -CONFIG_MAGIC_SYSRQ=y -CONFIG_MDIO_BUS=y -CONFIG_MDIO_DEVICE=y -CONFIG_MDIO_DEVRES=y -CONFIG_MDIO_SUN4I=y -CONFIG_MEDIA_ANALOG_TV_SUPPORT=y -CONFIG_MEDIA_ATTACH=y -CONFIG_MEDIA_CAMERA_SUPPORT=y -CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y -CONFIG_MEDIA_PLATFORM_SUPPORT=y -CONFIG_MEDIA_RADIO_SUPPORT=y -CONFIG_MEDIA_SDR_SUPPORT=y -CONFIG_MEDIA_SUPPORT=y -CONFIG_MEDIA_TEST_SUPPORT=y -CONFIG_MEDIA_TUNER=y -CONFIG_MEMFD_CREATE=y -CONFIG_MFD_AXP20X=y -CONFIG_MFD_AXP20X_I2C=y -CONFIG_MFD_AXP20X_RSB=y -CONFIG_MFD_CORE=y -CONFIG_MFD_SUN6I_PRCM=y -CONFIG_MFD_SYSCON=y -CONFIG_MIGHT_HAVE_CACHE_L2X0=y -CONFIG_MIGRATION=y -CONFIG_MMC=y -CONFIG_MMC_BLOCK=y -CONFIG_MMC_SUNXI=y -CONFIG_MODULES_USE_ELF_REL=y -CONFIG_MTD_JEDECPROBE=y -CONFIG_MTD_SPI_NOR=y -CONFIG_MTD_SPLIT_FIT_FW=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_NEON=y -CONFIG_NET_FLOW_LIMIT=y -CONFIG_NET_PTP_CLASSIFY=y -CONFIG_NET_VENDOR_ALLWINNER=y -CONFIG_NLS=y -CONFIG_NLS_CODEPAGE_437=y -CONFIG_NLS_ISO8859_1=y -CONFIG_NO_HZ=y -CONFIG_NO_HZ_COMMON=y -CONFIG_NO_HZ_IDLE=y -CONFIG_NR_CPUS=8 -CONFIG_NVMEM=y -CONFIG_NVMEM_SUNXI_SID=y -CONFIG_OF=y -CONFIG_OF_ADDRESS=y -CONFIG_OF_EARLY_FLATTREE=y -CONFIG_OF_FLATTREE=y -CONFIG_OF_GPIO=y -CONFIG_OF_IRQ=y -CONFIG_OF_KOBJ=y -CONFIG_OF_MDIO=y -CONFIG_OF_NET=y -CONFIG_OLD_SIGACTION=y -CONFIG_OLD_SIGSUSPEND3=y -CONFIG_OUTER_CACHE=y -CONFIG_OUTER_CACHE_SYNC=y -CONFIG_PADATA=y -CONFIG_PAGE_OFFSET=0xC0000000 -CONFIG_PAGE_POOL=y -CONFIG_PCS_XPCS=y -CONFIG_PERF_USE_VMALLOC=y -CONFIG_PGTABLE_LEVELS=3 -CONFIG_PHYLIB=y -CONFIG_PHYLINK=y -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_PHY_SUN4I_USB=y -# CONFIG_PHY_SUN50I_USB3 is not set -# CONFIG_PHY_SUN6I_MIPI_DPHY is not set -CONFIG_PHY_SUN9I_USB=y -CONFIG_PINCTRL=y -CONFIG_PINCTRL_AXP209=y -CONFIG_PINCTRL_SUN4I_A10=y -# CONFIG_PINCTRL_SUN50I_A100 is not set -# CONFIG_PINCTRL_SUN50I_A100_R is not set -# CONFIG_PINCTRL_SUN50I_A64 is not set -# CONFIG_PINCTRL_SUN50I_A64_R is not set -# CONFIG_PINCTRL_SUN50I_H5 is not set -# CONFIG_PINCTRL_SUN50I_H6 is not set -# CONFIG_PINCTRL_SUN50I_H6_R is not set -CONFIG_PINCTRL_SUN5I=y -CONFIG_PINCTRL_SUN6I_A31=y -CONFIG_PINCTRL_SUN6I_A31_R=y -CONFIG_PINCTRL_SUN8I_A23=y -CONFIG_PINCTRL_SUN8I_A23_R=y -CONFIG_PINCTRL_SUN8I_A33=y -CONFIG_PINCTRL_SUN8I_A83T=y -CONFIG_PINCTRL_SUN8I_A83T_R=y -CONFIG_PINCTRL_SUN8I_H3=y -CONFIG_PINCTRL_SUN8I_H3_R=y -CONFIG_PINCTRL_SUN8I_V3S=y -CONFIG_PINCTRL_SUN9I_A80=y -CONFIG_PINCTRL_SUN9I_A80_R=y -CONFIG_PINCTRL_SUNXI=y -CONFIG_PM=y -CONFIG_PM_CLK=y -CONFIG_PM_OPP=y -CONFIG_PM_SLEEP=y -CONFIG_PM_SLEEP_SMP=y -CONFIG_POWER_RESET=y -CONFIG_POWER_SUPPLY=y -CONFIG_PPS=y -CONFIG_PRINTK_TIME=y -CONFIG_PROC_EVENTS=y -CONFIG_PROC_PAGE_MONITOR=y -CONFIG_PTP_1588_CLOCK=y -CONFIG_PWM=y -CONFIG_PWM_SUN4I=y -CONFIG_PWM_SYSFS=y -CONFIG_RATIONAL=y -CONFIG_REALTEK_PHY=y -CONFIG_REGMAP=y -CONFIG_REGMAP_I2C=y -CONFIG_REGMAP_IRQ=y -CONFIG_REGMAP_MMIO=y -CONFIG_REGMAP_SPI=y -CONFIG_REGULATOR=y -CONFIG_REGULATOR_AXP20X=y -CONFIG_REGULATOR_FIXED_VOLTAGE=y -CONFIG_REGULATOR_GPIO=y -CONFIG_REGULATOR_SY8106A=y -CONFIG_RELAY=y -CONFIG_RESET_CONTROLLER=y -CONFIG_RESET_SIMPLE=y -CONFIG_RESET_SUNXI=y -CONFIG_RFS_ACCEL=y -CONFIG_RPS=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -CONFIG_SATA_HOST=y -CONFIG_SATA_PMP=y -CONFIG_SCSI=y -CONFIG_SDIO_UART=y -CONFIG_SECURITYFS=y -CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y -CONFIG_SERIAL_8250_DW=y -CONFIG_SERIAL_8250_DWLIB=y -CONFIG_SERIAL_8250_FSL=y -CONFIG_SERIAL_8250_NR_UARTS=8 -CONFIG_SERIAL_8250_RUNTIME_UARTS=8 -CONFIG_SERIAL_MCTRL_GPIO=y -CONFIG_SERIAL_OF_PLATFORM=y -CONFIG_SERIO=y -CONFIG_SERIO_SERPORT=y -CONFIG_SG_POOL=y -CONFIG_SMP=y -CONFIG_SMP_ON_UP=y -CONFIG_SND=y -CONFIG_SND_COMPRESS_OFFLOAD=y -CONFIG_SND_JACK=y -CONFIG_SND_JACK_INPUT_DEV=y -CONFIG_SND_PCM=y -CONFIG_SND_SIMPLE_CARD=y -CONFIG_SND_SIMPLE_CARD_UTILS=y -CONFIG_SND_SOC=y -CONFIG_SND_SOC_I2C_AND_SPI=y -# CONFIG_SND_SUN4I_I2S is not set -# CONFIG_SND_SUN4I_SPDIF is not set -# CONFIG_SND_SUN8I_CODEC is not set -# CONFIG_SND_SUN8I_CODEC_ANALOG is not set -CONFIG_SOUND=y -CONFIG_SOUND_OSS_CORE=y -CONFIG_SPARSE_IRQ=y -CONFIG_SPI=y -CONFIG_SPI_MASTER=y -CONFIG_SPI_MEM=y -CONFIG_SPI_SUN4I=y -CONFIG_SPI_SUN6I=y -CONFIG_SRCU=y -CONFIG_STMMAC_ETH=y -CONFIG_STMMAC_PLATFORM=y -# CONFIG_STMMAC_SELFTESTS is not set -CONFIG_SUN4I_A10_CCU=y -# CONFIG_SUN4I_EMAC is not set -CONFIG_SUN4I_TIMER=y -CONFIG_SUN5I_CCU=y -CONFIG_SUN5I_HSTIMER=y -CONFIG_SUN6I_A31_CCU=y -CONFIG_SUN8I_A23_CCU=y -CONFIG_SUN8I_A33_CCU=y -CONFIG_SUN8I_A83T_CCU=y -CONFIG_SUN8I_DE2_CCU=y -CONFIG_SUN8I_H3_CCU=y -CONFIG_SUN8I_R40_CCU=y -CONFIG_SUN8I_R_CCU=y -CONFIG_SUN8I_THERMAL=y -CONFIG_SUN8I_V3S_CCU=y -CONFIG_SUN9I_A80_CCU=y -CONFIG_SUNXI_CCU=y -CONFIG_SUNXI_RSB=y -CONFIG_SUNXI_SRAM=y -CONFIG_SUNXI_WATCHDOG=y -CONFIG_SUSPEND=y -CONFIG_SUSPEND_FREEZER=y -CONFIG_SWIOTLB=y -CONFIG_SWPHY=y -CONFIG_SWP_EMULATE=y -CONFIG_SYSFS_SYSCALL=y -CONFIG_SYS_SUPPORTS_APM_EMULATION=y -CONFIG_SYS_SUPPORTS_HUGETLBFS=y -CONFIG_THERMAL=y -CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y -CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 -CONFIG_THERMAL_GOV_STEP_WISE=y -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_OF=y -CONFIG_TICK_CPU_ACCOUNTING=y -CONFIG_TIMER_OF=y -CONFIG_TIMER_PROBE=y -CONFIG_TMPFS_POSIX_ACL=y -CONFIG_TOUCHSCREEN_PROPERTIES=y -CONFIG_TOUCHSCREEN_SUN4I=y -CONFIG_TREE_RCU=y -CONFIG_TREE_SRCU=y -CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" -CONFIG_UNWINDER_ARM=y -CONFIG_USB=y -CONFIG_USB_ANNOUNCE_NEW_DEVICES=y -# CONFIG_USB_AUDIO is not set -CONFIG_USB_COMMON=y -CONFIG_USB_DWC2=y -CONFIG_USB_DWC2_HOST=y -CONFIG_USB_EHCI_HCD=y -CONFIG_USB_EHCI_HCD_PLATFORM=y -CONFIG_USB_GADGET=y -CONFIG_USB_NET_DRIVERS=y -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_OHCI_HCD_PLATFORM=y -CONFIG_USB_ROLE_SWITCH=y -CONFIG_USB_STORAGE=y -CONFIG_USB_SUPPORT=y -CONFIG_USERIO=y -CONFIG_USE_OF=y -CONFIG_VFAT_FS=y -CONFIG_VFP=y -CONFIG_VFPv3=y -CONFIG_VHOST=y -CONFIG_VHOST_IOTLB=y -CONFIG_VHOST_NET=y -# CONFIG_VIDEO_SUN4I_CSI is not set -# CONFIG_VIDEO_SUN6I_CSI is not set -CONFIG_VM_EVENT_COUNTERS=y -CONFIG_VT=y -CONFIG_VT_CONSOLE=y -CONFIG_VT_CONSOLE_SLEEP=y -CONFIG_VT_HW_CONSOLE_BINDING=y -CONFIG_WATCHDOG_CORE=y -CONFIG_XPS=y -CONFIG_XXHASH=y -CONFIG_XZ_DEC_ARM=y -CONFIG_XZ_DEC_BCJ=y -CONFIG_ZBOOT_ROM_BSS=0 -CONFIG_ZBOOT_ROM_TEXT=0 diff --git a/target/linux/sunxi/config-5.15 b/target/linux/sunxi/config-5.15 new file mode 100644 index 0000000000..c33bb7ab6f --- /dev/null +++ b/target/linux/sunxi/config-5.15 @@ -0,0 +1,517 @@ +# CONFIG_AHCI_SUNXI is not set +CONFIG_ALIGNMENT_TRAP=y +CONFIG_ARCH_32BIT_OFF_T=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +CONFIG_ARCH_MULTIPLATFORM=y +CONFIG_ARCH_MULTI_V6_V7=y +CONFIG_ARCH_MULTI_V7=y +CONFIG_ARCH_NR_GPIO=416 +CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y +CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SUNXI=y +CONFIG_ARCH_SUNXI_MC_SMP=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARM=y +# CONFIG_ARM_ALLWINNER_SUN50I_CPUFREQ_NVMEM is not set +CONFIG_ARM_APPENDED_DTB=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +CONFIG_ARM_ATAG_DTB_COMPAT=y +CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y +CONFIG_ARM_CCI=y +CONFIG_ARM_CCI400_COMMON=y +CONFIG_ARM_CCI400_PORT_CTRL=y +CONFIG_ARM_CPU_SUSPEND=y +CONFIG_ARM_CRYPTO=y +CONFIG_ARM_ERRATA_643719=y +CONFIG_ARM_GIC=y +CONFIG_ARM_HAS_SG_CHAIN=y +CONFIG_ARM_HEAVY_MB=y +CONFIG_ARM_L1_CACHE_SHIFT=6 +CONFIG_ARM_L1_CACHE_SHIFT_6=y +CONFIG_ARM_LPAE=y +CONFIG_ARM_PATCH_IDIV=y +CONFIG_ARM_PATCH_PHYS_VIRT=y +CONFIG_ARM_PSCI=y +CONFIG_ARM_PSCI_FW=y +CONFIG_ARM_THUMB=y +CONFIG_ARM_UNWIND=y +CONFIG_ARM_VIRT_EXT=y +CONFIG_ATA=y +CONFIG_ATAGS=y +CONFIG_AUTO_ZRELADDR=y +CONFIG_AXP20X_POWER=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BACKLIGHT_PWM=y +CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_PM=y +CONFIG_BOUNCE=y +CONFIG_CACHE_L2X0=y +CONFIG_CAN=y +CONFIG_CLKSRC_MMIO=y +CONFIG_CLK_SUNXI=y +CONFIG_CLK_SUNXI_CLOCKS=y +CONFIG_CLK_SUNXI_PRCM_SUN6I=y +CONFIG_CLK_SUNXI_PRCM_SUN8I=y +CONFIG_CLK_SUNXI_PRCM_SUN9I=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_COMMON_CLK=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_CONFIGFS_FS=y +CONFIG_CONNECTOR=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_COREDUMP=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_CPU_32v6K=y +CONFIG_CPU_32v7=y +CONFIG_CPU_ABRT_EV7=y +CONFIG_CPU_CACHE_V7=y +CONFIG_CPU_CACHE_VIPT=y +CONFIG_CPU_COPY_V6=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_HAS_ASID=y +CONFIG_CPU_PABRT_V7=y +CONFIG_CPU_PM=y +CONFIG_CPU_RMAP=y +CONFIG_CPU_SPECTRE=y +CONFIG_CPU_THERMAL=y +CONFIG_CPU_THUMB_CAPABLE=y +CONFIG_CPU_TLB_V7=y +CONFIG_CPU_V7=y +CONFIG_CRC16=y +CONFIG_CRC_T10DIF=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRCT10DIF=y +CONFIG_CRYPTO_CRCT10DIF_ARM_CE=y +CONFIG_CRYPTO_DES=y +CONFIG_CRYPTO_DEV_ALLWINNER=y +CONFIG_CRYPTO_DEV_SUN4I_SS=y +# CONFIG_CRYPTO_DEV_SUN4I_SS_DEBUG is not set +CONFIG_CRYPTO_DEV_SUN4I_SS_PRNG=y +# CONFIG_CRYPTO_DEV_SUN8I_CE is not set +# CONFIG_CRYPTO_DEV_SUN8I_SS is not set +CONFIG_CRYPTO_HW=y +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_SHA1=y +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" +CONFIG_DEBUG_MEMORY_INIT=y +CONFIG_DMADEVICES=y +CONFIG_DMA_ENGINE=y +CONFIG_DMA_OF=y +CONFIG_DMA_OPS=y +CONFIG_DMA_REMAP=y +CONFIG_DMA_SUN4I=y +CONFIG_DMA_SUN6I=y +CONFIG_DMA_VIRTUAL_CHANNELS=y +CONFIG_DNOTIFY=y +CONFIG_DTC=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_DVB_CORE=y +CONFIG_DWMAC_GENERIC=y +# CONFIG_DWMAC_SUN8I is not set +CONFIG_DWMAC_SUNXI=y +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_ELF_CORE=y +CONFIG_EXT4_FS=y +CONFIG_EXTCON=y +CONFIG_F2FS_FS=y +CONFIG_FAT_FS=y +CONFIG_FB=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_CMDLINE=y +CONFIG_FB_FOREIGN_ENDIAN=y +CONFIG_FB_LITTLE_ENDIAN=y +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_SIMPLE=y +CONFIG_FB_TILEBLITTING=y +CONFIG_FIXED_PHY=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_FONT_8x16=y +CONFIG_FONT_8x8=y +CONFIG_FONT_SUPPORT=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_FREEZER=y +CONFIG_FS_IOMAP=y +CONFIG_FS_MBCACHE=y +CONFIG_FS_POSIX_ACL=y +CONFIG_FWNODE_MDIO=y +CONFIG_FW_CACHE=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_GENERIC_ARCH_TOPOLOGY=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_GENERIC_EARLY_IOREMAP=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_IRQ_MULTI_HANDLER=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_PHY=y +CONFIG_GENERIC_PINCONF=y +CONFIG_GENERIC_PINCTRL_GROUPS=y +CONFIG_GENERIC_PINMUX_FUNCTIONS=y +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_VDSO_32=y +CONFIG_GLOB=y +CONFIG_GPIO_CDEV=y +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_HARDEN_BRANCH_PREDICTOR=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAVE_SMP=y +CONFIG_HIGHMEM=y +CONFIG_HIGHPTE=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HWMON=y +CONFIG_HW_CONSOLE=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_TIMERIOMEM=y +CONFIG_HZ_FIXED=0 +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_COMPAT=y +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_MV64XXX=y +CONFIG_I2C_SUN6I_P2WI=y +CONFIG_IIO=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_INPUT=y +CONFIG_INPUT_AXP20X_PEK=y +CONFIG_INPUT_KEYBOARD=y +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_IRQCHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_WORK=y +CONFIG_JBD2=y +CONFIG_KALLSYMS=y +CONFIG_KEYBOARD_SUN4I_LRADC=y +CONFIG_KMAP_LOCAL=y +CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY=y +CONFIG_KSM=y +CONFIG_LCD_CLASS_DEVICE=y +CONFIG_LCD_PLATFORM=y +CONFIG_LEDS_GPIO=y +CONFIG_LIBFDT=y +CONFIG_LOCK_DEBUGGING_SUPPORT=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_CLUT224=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_MACH_SUN4I=y +CONFIG_MACH_SUN5I=y +CONFIG_MACH_SUN6I=y +CONFIG_MACH_SUN7I=y +CONFIG_MACH_SUN8I=y +CONFIG_MACH_SUN9I=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_MDIO_BUS=y +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_DEVRES=y +CONFIG_MDIO_SUN4I=y +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_ATTACH=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_PLATFORM_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_SDR_SUPPORT=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_TEST_SUPPORT=y +CONFIG_MEDIA_TUNER=y +CONFIG_MEMFD_CREATE=y +CONFIG_MFD_AXP20X=y +CONFIG_MFD_AXP20X_I2C=y +CONFIG_MFD_AXP20X_RSB=y +CONFIG_MFD_CORE=y +CONFIG_MFD_SUN6I_PRCM=y +CONFIG_MFD_SYSCON=y +CONFIG_MIGHT_HAVE_CACHE_L2X0=y +CONFIG_MIGRATION=y +CONFIG_MMC=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_SUNXI=y +CONFIG_MODULES_USE_ELF_REL=y +CONFIG_MTD_JEDECPROBE=y +CONFIG_MTD_SPI_NOR=y +CONFIG_MTD_SPLIT_FIT_FW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEON=y +CONFIG_NET_FLOW_LIMIT=y +CONFIG_NET_PTP_CLASSIFY=y +CONFIG_NET_SELFTESTS=y +CONFIG_NET_VENDOR_ALLWINNER=y +CONFIG_NLS=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NO_HZ=y +CONFIG_NO_HZ_COMMON=y +CONFIG_NO_HZ_IDLE=y +CONFIG_NR_CPUS=8 +CONFIG_NVMEM=y +CONFIG_NVMEM_SUNXI_SID=y +CONFIG_NVMEM_SYSFS=y +CONFIG_OF=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_FLATTREE=y +CONFIG_OF_GPIO=y +CONFIG_OF_IRQ=y +CONFIG_OF_KOBJ=y +CONFIG_OF_MDIO=y +CONFIG_OLD_SIGACTION=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_OUTER_CACHE=y +CONFIG_OUTER_CACHE_SYNC=y +CONFIG_PADATA=y +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_PAGE_POOL=y +CONFIG_PCS_XPCS=y +CONFIG_PERF_USE_VMALLOC=y +CONFIG_PGTABLE_LEVELS=3 +CONFIG_PHYLIB=y +CONFIG_PHYLINK=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_PHY_SUN4I_USB=y +# CONFIG_PHY_SUN50I_USB3 is not set +# CONFIG_PHY_SUN6I_MIPI_DPHY is not set +CONFIG_PHY_SUN9I_USB=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_AXP209=y +CONFIG_PINCTRL_SUN4I_A10=y +# CONFIG_PINCTRL_SUN50I_A100 is not set +# CONFIG_PINCTRL_SUN50I_A100_R is not set +# CONFIG_PINCTRL_SUN50I_A64 is not set +# CONFIG_PINCTRL_SUN50I_A64_R is not set +# CONFIG_PINCTRL_SUN50I_H5 is not set +# CONFIG_PINCTRL_SUN50I_H6 is not set +# CONFIG_PINCTRL_SUN50I_H616 is not set +# CONFIG_PINCTRL_SUN50I_H616_R is not set +# CONFIG_PINCTRL_SUN50I_H6_R is not set +CONFIG_PINCTRL_SUN5I=y +CONFIG_PINCTRL_SUN6I_A31=y +CONFIG_PINCTRL_SUN6I_A31_R=y +CONFIG_PINCTRL_SUN8I_A23=y +CONFIG_PINCTRL_SUN8I_A23_R=y +CONFIG_PINCTRL_SUN8I_A33=y +CONFIG_PINCTRL_SUN8I_A83T=y +CONFIG_PINCTRL_SUN8I_A83T_R=y +CONFIG_PINCTRL_SUN8I_H3=y +CONFIG_PINCTRL_SUN8I_H3_R=y +CONFIG_PINCTRL_SUN8I_V3S=y +CONFIG_PINCTRL_SUN9I_A80=y +CONFIG_PINCTRL_SUN9I_A80_R=y +CONFIG_PINCTRL_SUNXI=y +CONFIG_PM=y +CONFIG_PM_CLK=y +CONFIG_PM_OPP=y +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_POWER_RESET=y +CONFIG_POWER_SUPPLY=y +CONFIG_PPS=y +CONFIG_PRINTK_TIME=y +CONFIG_PROC_EVENTS=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PTP_1588_CLOCK=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y +CONFIG_PWM=y +CONFIG_PWM_SUN4I=y +CONFIG_PWM_SYSFS=y +CONFIG_RATIONAL=y +CONFIG_REALTEK_PHY=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_IRQ=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGMAP_SPI=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_AXP20X=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_SY8106A=y +CONFIG_RELAY=y +CONFIG_RESET_CONTROLLER=y +CONFIG_RESET_SIMPLE=y +CONFIG_RESET_SUNXI=y +CONFIG_RFS_ACCEL=y +CONFIG_RPS=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_SATA_HOST=y +CONFIG_SATA_PMP=y +CONFIG_SCSI=y +CONFIG_SCSI_COMMON=y +CONFIG_SDIO_UART=y +CONFIG_SECURITYFS=y +CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y +CONFIG_SERIAL_8250_DW=y +CONFIG_SERIAL_8250_DWLIB=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_NR_UARTS=8 +CONFIG_SERIAL_8250_RUNTIME_UARTS=8 +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIO=y +CONFIG_SERIO_SERPORT=y +CONFIG_SG_POOL=y +CONFIG_SMP=y +CONFIG_SMP_ON_UP=y +CONFIG_SND=y +CONFIG_SND_COMPRESS_OFFLOAD=y +CONFIG_SND_JACK=y +CONFIG_SND_JACK_INPUT_DEV=y +CONFIG_SND_PCM=y +CONFIG_SND_SIMPLE_CARD=y +CONFIG_SND_SIMPLE_CARD_UTILS=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_I2C_AND_SPI=y +# CONFIG_SND_SUN4I_I2S is not set +# CONFIG_SND_SUN4I_SPDIF is not set +# CONFIG_SND_SUN8I_CODEC is not set +# CONFIG_SND_SUN8I_CODEC_ANALOG is not set +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_SOUND=y +CONFIG_SOUND_OSS_CORE=y +CONFIG_SPARSE_IRQ=y +CONFIG_SPI=y +CONFIG_SPI_MASTER=y +CONFIG_SPI_MEM=y +CONFIG_SPI_SUN4I=y +CONFIG_SPI_SUN6I=y +CONFIG_SRCU=y +CONFIG_STMMAC_ETH=y +CONFIG_STMMAC_PLATFORM=y +CONFIG_SUN4I_A10_CCU=y +# CONFIG_SUN4I_EMAC is not set +CONFIG_SUN4I_TIMER=y +CONFIG_SUN5I_CCU=y +CONFIG_SUN5I_HSTIMER=y +CONFIG_SUN6I_A31_CCU=y +CONFIG_SUN8I_A23_CCU=y +CONFIG_SUN8I_A33_CCU=y +CONFIG_SUN8I_A83T_CCU=y +CONFIG_SUN8I_DE2_CCU=y +CONFIG_SUN8I_H3_CCU=y +CONFIG_SUN8I_R40_CCU=y +CONFIG_SUN8I_R_CCU=y +CONFIG_SUN8I_THERMAL=y +CONFIG_SUN8I_V3S_CCU=y +CONFIG_SUN9I_A80_CCU=y +CONFIG_SUNXI_CCU=y +CONFIG_SUNXI_MBUS=y +CONFIG_SUNXI_RSB=y +CONFIG_SUNXI_SRAM=y +CONFIG_SUNXI_WATCHDOG=y +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +CONFIG_SWIOTLB=y +CONFIG_SWPHY=y +CONFIG_SWP_EMULATE=y +CONFIG_SYSFS_SYSCALL=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_THERMAL=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_OF=y +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TOUCHSCREEN_SUN4I=y +CONFIG_TREE_RCU=y +CONFIG_TREE_SRCU=y +CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" +CONFIG_UNWINDER_ARM=y +CONFIG_USB=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_COMMON=y +CONFIG_USB_DWC2=y +CONFIG_USB_DWC2_HOST=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD_PLATFORM=y +CONFIG_USB_GADGET=y +CONFIG_USB_NET_DRIVERS=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PLATFORM=y +CONFIG_USB_ROLE_SWITCH=y +CONFIG_USB_STORAGE=y +CONFIG_USB_SUPPORT=y +CONFIG_USERIO=y +CONFIG_USE_OF=y +CONFIG_VFAT_FS=y +CONFIG_VFP=y +CONFIG_VFPv3=y +CONFIG_VHOST=y +CONFIG_VHOST_IOTLB=y +CONFIG_VHOST_NET=y +# CONFIG_VIDEO_SUN4I_CSI is not set +# CONFIG_VIDEO_SUN6I_CSI is not set +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_WATCHDOG_CORE=y +CONFIG_XPS=y +CONFIG_XXHASH=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_BCJ=y +CONFIG_ZBOOT_ROM_BSS=0 +CONFIG_ZBOOT_ROM_TEXT=0 diff --git a/target/linux/sunxi/cortexa53/config-5.10 b/target/linux/sunxi/cortexa53/config-5.10 deleted file mode 100644 index 958ad1addb..0000000000 --- a/target/linux/sunxi/cortexa53/config-5.10 +++ /dev/null @@ -1,95 +0,0 @@ -CONFIG_64BIT=y -CONFIG_ARCH_MMAP_RND_BITS=18 -CONFIG_ARCH_MMAP_RND_BITS_MAX=24 -CONFIG_ARCH_MMAP_RND_BITS_MIN=18 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 -CONFIG_ARCH_PROC_KCORE_TEXT=y -CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_STACKWALK=y -CONFIG_ARM64=y -CONFIG_ARM64_4K_PAGES=y -CONFIG_ARM64_CRYPTO=y -CONFIG_ARM64_PAGE_SHIFT=12 -CONFIG_ARM64_PA_BITS=48 -CONFIG_ARM64_PA_BITS_48=y -# CONFIG_ARM64_PTR_AUTH is not set -# CONFIG_ARM64_SVE is not set -CONFIG_ARM64_TAGGED_ADDR_ABI=y -CONFIG_ARM64_VA_BITS=39 -CONFIG_ARM64_VA_BITS_39=y -CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y -CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y -CONFIG_ARM_AMBA=y -CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y -CONFIG_ARM_GIC_V3=y -CONFIG_ARM_GIC_V3_ITS=y -CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y -CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y -CONFIG_CRYPTO_AES_ARM64=y -CONFIG_CRYPTO_AES_ARM64_CE=y -CONFIG_CRYPTO_AES_ARM64_CE_BLK=y -CONFIG_CRYPTO_AES_ARM64_CE_CCM=y -CONFIG_CRYPTO_BLAKE2S=y -CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y -CONFIG_CRYPTO_CRYPTD=y -CONFIG_CRYPTO_GHASH_ARM64_CE=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_CRYPTO_SHA1_ARM64_CE=y -CONFIG_CRYPTO_SIMD=y -CONFIG_DMA_DIRECT_REMAP=y -CONFIG_DWMAC_SUN8I=y -CONFIG_EEPROM_AT24=y -# CONFIG_FLATMEM_MANUAL is not set -CONFIG_FRAME_POINTER=y -CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y -CONFIG_GENERIC_CPU_VULNERABILITIES=y -CONFIG_GENERIC_CSUM=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y -CONFIG_HOLES_IN_ZONE=y -CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 -CONFIG_MDIO_BUS_MUX=y -CONFIG_MICREL_PHY=y -CONFIG_MODULES_USE_ELF_RELA=y -CONFIG_MUSB_PIO_ONLY=y -CONFIG_NEED_SG_DMA_LENGTH=y -CONFIG_NOP_USB_XCEIV=y -CONFIG_NO_IOPORT_MAP=y -CONFIG_PARTITION_PERCPU=y -CONFIG_PHY_SUN50I_USB3=y -CONFIG_PINCTRL_SUN50I_A100=y -CONFIG_PINCTRL_SUN50I_A100_R=y -CONFIG_PINCTRL_SUN50I_A64=y -CONFIG_PINCTRL_SUN50I_A64_R=y -CONFIG_PINCTRL_SUN50I_H5=y -CONFIG_PINCTRL_SUN50I_H6=y -CONFIG_PINCTRL_SUN50I_H6_R=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_RODATA_FULL_DEFAULT_ENABLED=y -CONFIG_RTC_DRV_SUN6I=y -# CONFIG_SND_SUN50I_CODEC_ANALOG is not set -CONFIG_SOUND_OSS_CORE_PRECLAIM=y -CONFIG_SPARSEMEM=y -CONFIG_SPARSEMEM_EXTREME=y -CONFIG_SPARSEMEM_MANUAL=y -CONFIG_SPARSEMEM_VMEMMAP=y -CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -CONFIG_SUN50I_A100_CCU=y -CONFIG_SUN50I_A100_R_CCU=y -CONFIG_SUN50I_A64_CCU=y -CONFIG_SUN50I_DE2_BUS=y -CONFIG_SUN50I_ERRATUM_UNKNOWN1=y -CONFIG_SUN50I_H6_CCU=y -CONFIG_SUN50I_H6_R_CCU=y -CONFIG_SYSCTL_EXCEPTION_TRACE=y -CONFIG_THREAD_INFO_IN_TASK=y -CONFIG_UNMAP_KERNEL_AT_EL0=y -CONFIG_USB_MUSB_DUAL_ROLE=y -# CONFIG_USB_MUSB_GADGET is not set -CONFIG_USB_MUSB_HDRC=y -# CONFIG_USB_MUSB_HOST is not set -CONFIG_USB_MUSB_SUNXI=y -CONFIG_USB_PHY=y -CONFIG_VMAP_STACK=y -CONFIG_ZONE_DMA32=y diff --git a/target/linux/sunxi/cortexa53/config-5.15 b/target/linux/sunxi/cortexa53/config-5.15 new file mode 100644 index 0000000000..85ace5d928 --- /dev/null +++ b/target/linux/sunxi/cortexa53/config-5.15 @@ -0,0 +1,89 @@ +CONFIG_64BIT=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y +CONFIG_ARCH_MMAP_RND_BITS=18 +CONFIG_ARCH_MMAP_RND_BITS_MAX=24 +CONFIG_ARCH_MMAP_RND_BITS_MIN=18 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_ARCH_STACKWALK=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_ARM64=y +CONFIG_ARM64_4K_PAGES=y +CONFIG_ARM64_CRYPTO=y +CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y +CONFIG_ARM64_PAGE_SHIFT=12 +CONFIG_ARM64_PA_BITS=48 +CONFIG_ARM64_PA_BITS_48=y +CONFIG_ARM64_TAGGED_ADDR_ABI=y +CONFIG_ARM64_VA_BITS=39 +CONFIG_ARM64_VA_BITS_39=y +CONFIG_ARM_AMBA=y +CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y +CONFIG_ARM_GIC_V3=y +CONFIG_ARM_GIC_V3_ITS=y +CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y +CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y +CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_CRYPTO_AES_ARM64=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_BLAKE2S=y +CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SIMD=y +CONFIG_DMA_DIRECT_REMAP=y +CONFIG_DWMAC_SUN8I=y +CONFIG_EEPROM_AT24=y +CONFIG_FRAME_POINTER=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_CSUM=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_MDIO_BUS_MUX=y +CONFIG_MICREL_PHY=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_MUSB_PIO_ONLY=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_NO_IOPORT_MAP=y +CONFIG_PARTITION_PERCPU=y +CONFIG_PHY_SUN50I_USB3=y +CONFIG_PINCTRL_SUN50I_A100=y +CONFIG_PINCTRL_SUN50I_A100_R=y +CONFIG_PINCTRL_SUN50I_A64=y +CONFIG_PINCTRL_SUN50I_A64_R=y +CONFIG_PINCTRL_SUN50I_H5=y +CONFIG_PINCTRL_SUN50I_H6=y +CONFIG_PINCTRL_SUN50I_H6_R=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_RODATA_FULL_DEFAULT_ENABLED=y +# CONFIG_SND_SUN50I_CODEC_ANALOG is not set +CONFIG_SOUND_OSS_CORE_PRECLAIM=y +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SUN50I_A100_CCU=y +CONFIG_SUN50I_A100_R_CCU=y +CONFIG_SUN50I_A64_CCU=y +CONFIG_SUN50I_DE2_BUS=y +CONFIG_SUN50I_ERRATUM_UNKNOWN1=y +# CONFIG_SUN50I_H616_CCU is not set +CONFIG_SUN50I_H6_CCU=y +CONFIG_SUN50I_H6_R_CCU=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_THREAD_INFO_IN_TASK=y +CONFIG_UNMAP_KERNEL_AT_EL0=y +CONFIG_USB_MUSB_DUAL_ROLE=y +CONFIG_USB_MUSB_HDRC=y +CONFIG_USB_MUSB_SUNXI=y +CONFIG_USB_PHY=y +CONFIG_VMAP_STACK=y +CONFIG_ZONE_DMA32=y diff --git a/target/linux/sunxi/cortexa7/config-5.10 b/target/linux/sunxi/cortexa7/config-5.10 deleted file mode 100644 index 90e977b566..0000000000 --- a/target/linux/sunxi/cortexa7/config-5.10 +++ /dev/null @@ -1,26 +0,0 @@ -CONFIG_B53=y -CONFIG_B53_MDIO_DRIVER=y -CONFIG_CRYPTO_BLAKE2S=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_DWMAC_SUN8I=y -CONFIG_GRO_CELLS=y -# CONFIG_MACH_SUN4I is not set -# CONFIG_MACH_SUN5I is not set -CONFIG_MDIO_BUS_MUX=y -CONFIG_MICREL_PHY=y -CONFIG_MUSB_PIO_ONLY=y -CONFIG_NET_DEVLINK=y -CONFIG_NET_DSA=y -CONFIG_NET_DSA_TAG_BRCM=y -CONFIG_NET_DSA_TAG_BRCM_COMMON=y -CONFIG_NET_DSA_TAG_BRCM_LEGACY=y -CONFIG_NET_DSA_TAG_BRCM_PREPEND=y -CONFIG_NET_SWITCHDEV=y -CONFIG_NOP_USB_XCEIV=y -CONFIG_RTC_DRV_SUN6I=y -CONFIG_USB_MUSB_DUAL_ROLE=y -# CONFIG_USB_MUSB_GADGET is not set -CONFIG_USB_MUSB_HDRC=y -# CONFIG_USB_MUSB_HOST is not set -CONFIG_USB_MUSB_SUNXI=y -CONFIG_USB_PHY=y diff --git a/target/linux/sunxi/cortexa7/config-5.15 b/target/linux/sunxi/cortexa7/config-5.15 new file mode 100644 index 0000000000..e911da4c3d --- /dev/null +++ b/target/linux/sunxi/cortexa7/config-5.15 @@ -0,0 +1,24 @@ +CONFIG_B53=y +CONFIG_B53_MDIO_DRIVER=y +CONFIG_CRYPTO_BLAKE2S_ARM=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_DWMAC_SUN8I=y +CONFIG_GRO_CELLS=y +# CONFIG_MACH_SUN4I is not set +# CONFIG_MACH_SUN5I is not set +CONFIG_MDIO_BUS_MUX=y +CONFIG_MICREL_PHY=y +CONFIG_MUSB_PIO_ONLY=y +CONFIG_NET_DEVLINK=y +CONFIG_NET_DSA=y +CONFIG_NET_DSA_TAG_BRCM=y +CONFIG_NET_DSA_TAG_BRCM_COMMON=y +CONFIG_NET_DSA_TAG_BRCM_LEGACY=y +CONFIG_NET_DSA_TAG_BRCM_PREPEND=y +CONFIG_NET_SWITCHDEV=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_RTC_DRV_SUN6I=y +CONFIG_USB_MUSB_DUAL_ROLE=y +CONFIG_USB_MUSB_HDRC=y +CONFIG_USB_MUSB_SUNXI=y +CONFIG_USB_PHY=y diff --git a/target/linux/sunxi/cortexa8/config-5.10 b/target/linux/sunxi/cortexa8/config-5.10 deleted file mode 100644 index 5dab93095d..0000000000 --- a/target/linux/sunxi/cortexa8/config-5.10 +++ /dev/null @@ -1,12 +0,0 @@ -# CONFIG_ARM_LPAE is not set -CONFIG_CRYPTO_BLAKE2S=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -# CONFIG_MACH_SUN6I is not set -# CONFIG_MACH_SUN7I is not set -# CONFIG_MACH_SUN8I is not set -# CONFIG_MACH_SUN9I is not set -CONFIG_PGTABLE_LEVELS=2 -# CONFIG_PHY_SUN9I_USB is not set -# CONFIG_SPI_SUN6I is not set -# CONFIG_SUN8I_A83T_CCU is not set -# CONFIG_SUN8I_THERMAL is not set diff --git a/target/linux/sunxi/cortexa8/config-5.15 b/target/linux/sunxi/cortexa8/config-5.15 new file mode 100644 index 0000000000..b893b3142e --- /dev/null +++ b/target/linux/sunxi/cortexa8/config-5.15 @@ -0,0 +1,12 @@ +# CONFIG_ARM_LPAE is not set +CONFIG_CRYPTO_BLAKE2S_ARM=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_MACH_SUN6I is not set +# CONFIG_MACH_SUN7I is not set +# CONFIG_MACH_SUN8I is not set +# CONFIG_MACH_SUN9I is not set +CONFIG_PGTABLE_LEVELS=2 +# CONFIG_PHY_SUN9I_USB is not set +# CONFIG_SPI_SUN6I is not set +# CONFIG_SUN8I_A83T_CCU is not set +# CONFIG_SUN8I_THERMAL is not set diff --git a/target/linux/sunxi/image/cortexa7.mk b/target/linux/sunxi/image/cortexa7.mk index 74cdc6e996..5b9f27cef8 100644 --- a/target/linux/sunxi/image/cortexa7.mk +++ b/target/linux/sunxi/image/cortexa7.mk @@ -23,7 +23,7 @@ define Device/friendlyarm_nanopi-m1-plus DEVICE_VENDOR := FriendlyARM DEVICE_MODEL := NanoPi M1 Plus DEVICE_PACKAGES:=kmod-leds-gpio kmod-brcmfmac \ - cypress-firmware-43430-sdio wpad-basic-wolfssl + cypress-firmware-43430-sdio wpad-basic-mbedtls SOC := sun8i-h3 endef TARGET_DEVICES += friendlyarm_nanopi-m1-plus @@ -39,7 +39,7 @@ define Device/friendlyarm_nanopi-neo-air DEVICE_VENDOR := FriendlyARM DEVICE_MODEL := NanoPi NEO Air DEVICE_PACKAGES := kmod-leds-gpio kmod-brcmfmac \ - brcmfmac-firmware-43430a0-sdio wpad-basic-wolfssl + brcmfmac-firmware-43430a0-sdio wpad-basic-mbedtls SOC := sun8i-h3 endef TARGET_DEVICES += friendlyarm_nanopi-neo-air @@ -48,7 +48,7 @@ define Device/friendlyarm_nanopi-r1 DEVICE_VENDOR := FriendlyARM DEVICE_MODEL := NanoPi R1 DEVICE_PACKAGES := kmod-usb-net-rtl8152 kmod-leds-gpio \ - kmod-brcmfmac cypress-firmware-43430-sdio wpad-basic-wolfssl + kmod-brcmfmac cypress-firmware-43430-sdio wpad-basic-mbedtls SOC := sun8i-h3 endef TARGET_DEVICES += friendlyarm_nanopi-r1 @@ -66,7 +66,7 @@ define Device/lamobo_lamobo-r1 DEVICE_MODEL := Lamobo R1 DEVICE_ALT0_VENDOR := Bananapi DEVICE_ALT0_MODEL := BPi-R1 - DEVICE_PACKAGES := kmod-ata-sunxi kmod-rtl8192cu wpad-basic-wolfssl + DEVICE_PACKAGES := kmod-ata-sunxi kmod-rtl8192cu wpad-basic-mbedtls DEVICE_COMPAT_VERSION := 1.1 DEVICE_COMPAT_MESSAGE := Config cannot be migrated from swconfig to DSA SOC := sun7i-a20 @@ -85,7 +85,7 @@ define Device/sinovoip_bananapi-m2-berry DEVICE_VENDOR := Sinovoip DEVICE_MODEL := Banana Pi M2 Berry DEVICE_PACKAGES:=kmod-ata-sunxi kmod-brcmfmac \ - cypress-firmware-43430-sdio wpad-basic-wolfssl + cypress-firmware-43430-sdio wpad-basic-mbedtls SUPPORTED_DEVICES:=lemaker,bananapi-m2-berry SOC := sun8i-v40 endef @@ -95,7 +95,7 @@ define Device/sinovoip_bananapi-m2-ultra DEVICE_VENDOR := Sinovoip DEVICE_MODEL := Banana Pi M2 Ultra DEVICE_PACKAGES:=kmod-ata-sunxi kmod-brcmfmac \ - brcmfmac-firmware-43430a0-sdio wpad-basic-wolfssl + brcmfmac-firmware-43430a0-sdio wpad-basic-mbedtls SUPPORTED_DEVICES:=lemaker,bananapi-m2-ultra SOC := sun8i-r40 endef @@ -171,7 +171,7 @@ define Device/sinovoip_bananapi-m2-plus DEVICE_VENDOR := Sinovoip DEVICE_MODEL := Banana Pi M2+ DEVICE_PACKAGES:=kmod-leds-gpio kmod-brcmfmac \ - brcmfmac-firmware-43430a0-sdio wpad-basic-wolfssl + brcmfmac-firmware-43430a0-sdio wpad-basic-mbedtls SOC := sun8i-h3 endef TARGET_DEVICES += sinovoip_bananapi-m2-plus diff --git a/target/linux/sunxi/image/cortexa8.mk b/target/linux/sunxi/image/cortexa8.mk index ceb15a0fd8..eafc2187e8 100644 --- a/target/linux/sunxi/image/cortexa8.mk +++ b/target/linux/sunxi/image/cortexa8.mk @@ -11,6 +11,16 @@ define Device/cubietech_a10-cubieboard endef TARGET_DEVICES += cubietech_a10-cubieboard +define Device/haoyu_a10-marsboard + DEVICE_VENDOR := HAOYU Electronics + DEVICE_MODEL := MarsBoard A10 + DEVICE_PACKAGES:=kmod-ata-core kmod-ata-sunxi kmod-sun4i-emac \ + kmod-rtc-sunxi kmod-sound-core kmod-sound-soc-sunxi + SUPPORTED_DEVICES += marsboard,a10-marsboard + SOC := sun4i +endef +TARGET_DEVICES += haoyu_a10-marsboard + define Device/linksprite_a10-pcduino DEVICE_VENDOR := LinkSprite DEVICE_MODEL := pcDuino @@ -19,15 +29,6 @@ define Device/linksprite_a10-pcduino endef TARGET_DEVICES += linksprite_a10-pcduino -define Device/marsboard_a10-marsboard - DEVICE_VENDOR := HAOYU Electronics - DEVICE_MODEL := MarsBoard A10 - DEVICE_PACKAGES:=kmod-ata-core kmod-ata-sunxi kmod-sun4i-emac kmod-rtc-sunxi \ - sound-soc-sunxi - SOC := sun4i -endef -TARGET_DEVICES += marsboard_a10-marsboard - define Device/olimex_a10-olinuxino-lime DEVICE_VENDOR := Olimex DEVICE_MODEL := A10-OLinuXino-LIME diff --git a/target/linux/sunxi/modules.mk b/target/linux/sunxi/modules.mk index 99f4db7604..8bbafe98a7 100644 --- a/target/linux/sunxi/modules.mk +++ b/target/linux/sunxi/modules.mk @@ -5,8 +5,7 @@ define KernelPackage/rtc-sunxi SUBMENU:=$(OTHER_MENU) TITLE:=Sunxi SoC built-in RTC support - DEPENDS:=@TARGET_sunxi - $(call AddDepends/rtc) + DEPENDS:=@(TARGET_sunxi&&RTC_SUPPORT) KCONFIG:= \ CONFIG_RTC_DRV_SUNXI \ CONFIG_RTC_CLASS=y @@ -22,20 +21,20 @@ $(eval $(call KernelPackage,rtc-sunxi)) define KernelPackage/sunxi-ir SUBMENU:=$(OTHER_MENU) - TITLE:=Sunxi SoC built-in IR support (A20) - DEPENDS:=@TARGET_sunxi +kmod-input-core - $(call AddDepends/rtc) + TITLE:=Sunxi SoC built-in IR support + DEPENDS:=@(TARGET_sunxi&&RTC_SUPPORT) +kmod-input-core KCONFIG:= \ CONFIG_MEDIA_SUPPORT=y \ CONFIG_MEDIA_RC_SUPPORT=y \ CONFIG_RC_DEVICES=y \ + CONFIG_RC_CORE=y \ CONFIG_IR_SUNXI FILES:=$(LINUX_DIR)/drivers/media/rc/sunxi-cir.ko AUTOLOAD:=$(call AutoLoad,50,sunxi-cir) endef define KernelPackage/sunxi-ir/description - Support for the AllWinner sunXi SoC's onboard IR (A20) + Support for the AllWinner sunXi SoC's onboard IR endef $(eval $(call KernelPackage,sunxi-ir)) diff --git a/target/linux/sunxi/patches-5.10/062-add-sun8i-h3-zeropi-support.patch b/target/linux/sunxi/patches-5.10/062-add-sun8i-h3-zeropi-support.patch deleted file mode 100644 index 3dd37fedba..0000000000 --- a/target/linux/sunxi/patches-5.10/062-add-sun8i-h3-zeropi-support.patch +++ /dev/null @@ -1,79 +0,0 @@ ---- a/arch/arm/boot/dts/Makefile -+++ b/arch/arm/boot/dts/Makefile -@@ -1204,6 +1204,7 @@ dtb-$(CONFIG_MACH_SUN8I) += \ - sun8i-h3-orangepi-zero-plus2.dtb \ - sun8i-h3-rervision-dvk.dtb \ - sun8i-h3-emlid-neutis-n5h3-devboard.dtb \ -+ sun8i-h3-zeropi.dtb \ - sun8i-r16-bananapi-m2m.dtb \ - sun8i-r16-nintendo-nes-classic.dtb \ - sun8i-r16-nintendo-super-nes-classic.dtb \ ---- /dev/null -+++ b/arch/arm/boot/dts/sun8i-h3-zeropi.dts -@@ -0,0 +1,66 @@ -+// SPDX-License-Identifier: (GPL-2.0+ OR MIT) -+ -+#include "sun8i-h3-nanopi.dtsi" -+ -+/ { -+ model = "FriendlyElec ZeroPi"; -+ compatible = "friendlyarm,zeropi", "allwinner,sun8i-h3"; -+ -+ aliases { -+ ethernet0 = &emac; -+ }; -+ -+ reg_gmac_3v3: gmac-3v3 { -+ compatible = "regulator-fixed"; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&gmac_power_pin_nanopi>; -+ regulator-name = "gmac-3v3"; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ startup-delay-us = <100000>; -+ enable-active-high; -+ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; -+ }; -+}; -+ -+&ehci0 { -+ status = "okay"; -+}; -+ -+&ohci0 { -+ status = "okay"; -+}; -+ -+&pio { -+ gmac_power_pin_nanopi: gmac_power_pin@0 { -+ pins = "PD6"; -+ function = "gpio_out"; -+ }; -+}; -+ -+&external_mdio { -+ ext_rgmii_phy: ethernet-phy@1 { -+ compatible = "ethernet-phy-ieee802.3-c22"; -+ reg = <7>; -+ }; -+}; -+ -+&emac { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&emac_rgmii_pins>; -+ phy-supply = <®_gmac_3v3>; -+ phy-handle = <&ext_rgmii_phy>; -+ phy-mode = "rgmii"; -+ -+ allwinner,leds-active-low; -+ status = "okay"; -+}; -+ -+&usb_otg { -+ status = "okay"; -+ dr_mode = "peripheral"; -+}; -+ -+&usbphy { -+ usb0_id_det-gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */ -+}; diff --git a/target/linux/sunxi/patches-5.10/100-sunxi-h3-add-support-for-nanopi-r1.patch b/target/linux/sunxi/patches-5.10/100-sunxi-h3-add-support-for-nanopi-r1.patch deleted file mode 100644 index cbdf5ed3d4..0000000000 --- a/target/linux/sunxi/patches-5.10/100-sunxi-h3-add-support-for-nanopi-r1.patch +++ /dev/null @@ -1,186 +0,0 @@ -From 5aee0b1272cd5b42933ef629d66b677669e2e8d2 Mon Sep 17 00:00:00 2001 -From: Jayantajit Gogoi -Date: Mon, 12 Oct 2020 05:24:51 +0000 -Subject: [PATCH] sunxi: add support for friendlyarm nanopi r1 - -Signed-off-by: Jayantajit Gogoi ---- - .../devicetree/bindings/arm/sunxi.yaml | 5 + - arch/arm/boot/dts/Makefile | 1 + - arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts | 146 ++++++++++++++++++ - 3 files changed, 152 insertions(+) - create mode 100644 arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts - ---- a/Documentation/devicetree/bindings/arm/sunxi.yaml -+++ b/Documentation/devicetree/bindings/arm/sunxi.yaml -@@ -251,6 +251,11 @@ properties: - - const: friendlyarm,nanopi-neo-plus2 - - const: allwinner,sun50i-h5 - -+ - description: FriendlyARM NanoPi R1 -+ items: -+ - const: friendlyarm,nanopi-r1 -+ - const: allwinner,sun8i-h3 -+ - - description: Gemei G9 Tablet - items: - - const: gemei,g9 ---- a/arch/arm/boot/dts/Makefile -+++ b/arch/arm/boot/dts/Makefile -@@ -1194,6 +1194,7 @@ dtb-$(CONFIG_MACH_SUN8I) += \ - sun8i-h3-nanopi-m1-plus.dtb \ - sun8i-h3-nanopi-neo.dtb \ - sun8i-h3-nanopi-neo-air.dtb \ -+ sun8i-h3-nanopi-r1.dtb \ - sun8i-h3-orangepi-2.dtb \ - sun8i-h3-orangepi-lite.dtb \ - sun8i-h3-orangepi-one.dtb \ ---- /dev/null -+++ b/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts -@@ -0,0 +1,146 @@ -+// SPDX-License-Identifier: (GPL-2.0+ OR MIT) -+/* -+ * Copyright (C) 2019 Igor Pecovnik -+ * Copyright (C) 2020 Jayantajit Gogoi -+ */ -+ -+/* NanoPi R1 is based on the NanoPi-H3 design from FriendlyARM */ -+#include "sun8i-h3-nanopi.dtsi" -+ -+/ { -+ model = "FriendlyARM NanoPi R1"; -+ compatible = "friendlyarm,nanopi-r1", "allwinner,sun8i-h3"; -+ -+ reg_gmac_3v3: gmac-3v3 { -+ compatible = "regulator-fixed"; -+ regulator-name = "gmac-3v3"; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ startup-delay-us = <100000>; -+ enable-active-high; -+ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; -+ }; -+ -+ vdd_cpux: gpio-regulator { -+ compatible = "regulator-gpio"; -+ pinctrl-names = "default"; -+ regulator-name = "vdd-cpux"; -+ regulator-type = "voltage"; -+ regulator-boot-on; -+ regulator-always-on; -+ regulator-min-microvolt = <1100000>; -+ regulator-max-microvolt = <1300000>; -+ regulator-ramp-delay = <50>; -+ gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; -+ gpios-states = <0x1>; -+ states = <1100000 0x0 -+ 1300000 0x1>; -+ }; -+ -+ wifi_pwrseq: wifi_pwrseq { -+ compatible = "mmc-pwrseq-simple"; -+ pinctrl-names = "default"; -+ reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; -+ }; -+ -+ leds { -+ /delete-node/ pwr; -+ status { -+ label = "nanopi:red:status"; -+ gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>; -+ linux,default-trigger = "heartbeat"; -+ }; -+ -+ wan { -+ label = "nanopi:green:wan"; -+ gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; -+ }; -+ -+ lan { -+ label = "nanopi:green:lan"; -+ gpios = <&pio 0 9 GPIO_ACTIVE_HIGH>; -+ }; -+ }; -+ -+ r_gpio_keys { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&sw_r_npi>; -+ -+ /delete-node/ k1; -+ reset { -+ label = "reset"; -+ linux,code = ; -+ gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>; -+ }; -+ }; -+}; -+ -+&cpu0 { -+ cpu-supply = <&vdd_cpux>; -+}; -+ -+&ehci1 { -+ status = "okay"; -+}; -+ -+&ehci2 { -+ status = "okay"; -+}; -+ -+&emac { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&emac_rgmii_pins>; -+ phy-supply = <®_gmac_3v3>; -+ phy-handle = <&ext_rgmii_phy>; -+ phy-mode = "rgmii"; -+ status = "okay"; -+}; -+ -+&external_mdio { -+ ext_rgmii_phy: ethernet-phy@1 { -+ compatible = "ethernet-phy-ieee802.3-c22"; -+ reg = <7>; -+ }; -+}; -+ -+&mmc1 { -+ vmmc-supply = <®_vcc3v3>; -+ vqmmc-supply = <®_vcc3v3>; -+ mmc-pwrseq = <&wifi_pwrseq>; -+ bus-width = <4>; -+ non-removable; -+ status = "okay"; -+ -+ sdio_wifi: sdio_wifi@1 { -+ reg = <1>; -+ compatible = "brcm,bcm4329-fmac"; -+ interrupt-parent = <&pio>; -+ interrupts = <6 10 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "host-wake"; -+ }; -+}; -+ -+&mmc2 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc2_8bit_pins>; -+ vmmc-supply = <®_vcc3v3>; -+ vqmmc-supply = <®_vcc3v3>; -+ bus-width = <8>; -+ non-removable; -+ status = "okay"; -+}; -+ -+&ohci1 { -+ status = "okay"; -+}; -+ -+&ohci2 { -+ status = "okay"; -+}; -+ -+&r_pio { -+ sw_r_npi: key_pins { -+ pins = "PL3"; -+ function = "gpio_in"; -+ }; -+}; diff --git a/target/linux/sunxi/patches-5.10/101-sunxi-h5-add-support-for-nanopi-r1s-h5.patch b/target/linux/sunxi/patches-5.10/101-sunxi-h5-add-support-for-nanopi-r1s-h5.patch deleted file mode 100644 index e0c25bcb53..0000000000 --- a/target/linux/sunxi/patches-5.10/101-sunxi-h5-add-support-for-nanopi-r1s-h5.patch +++ /dev/null @@ -1,230 +0,0 @@ -From 9962cb9be2db877c232aaf00db40125c0d7bf4bc Mon Sep 17 00:00:00 2001 -From: Chukun Pan -Date: Mon, 17 May 2021 00:35:22 +0800 -Subject: [PATCH] arm64: dts: allwinner: h5: Add NanoPi R1S H5 support - -The NanoPi R1S H5 is a open source board made by FriendlyElec. -It has the following features: - -- Allwinner H5, Quad-core Cortex-A53 -- 512MB DDR3 RAM -- 10/100/1000M Ethernet x 2 -- RTL8189ETV WiFi 802.11b/g/n -- USB 2.0 host port (A) -- MicroSD Slot -- Serial Debug Port -- 5V 2A DC power-supply - -Signed-off-by: Chukun Pan -Signed-off-by: Maxime Ripard -Link: https://lore.kernel.org/r/20210516163523.9484-2-amadeus@jmu.edu.cn ---- - arch/arm64/boot/dts/allwinner/Makefile | 1 + - .../dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts | 195 ++++++++++++++++++ - 2 files changed, 196 insertions(+) - create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts - ---- a/arch/arm64/boot/dts/allwinner/Makefile -+++ b/arch/arm64/boot/dts/allwinner/Makefile -@@ -24,6 +24,7 @@ dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-li - dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-libretech-all-h5-cc.dtb - dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-nanopi-neo2.dtb - dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-nanopi-neo-plus2.dtb -+dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-nanopi-r1s-h5.dtb - dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-pc2.dtb - dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-prime.dtb - dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-zero-plus.dtb ---- /dev/null -+++ b/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts -@@ -0,0 +1,191 @@ -+// SPDX-License-Identifier: (GPL-2.0+ OR MIT) -+/* -+ * Copyright (C) 2021 Chukun Pan -+ * -+ * Based on sun50i-h5-nanopi-neo-plus2.dts, which is: -+ * Copyright (C) 2017 Antony Antony -+ * Copyright (C) 2016 ARM Ltd. -+ */ -+ -+/dts-v1/; -+#include "sun50i-h5.dtsi" -+#include "sun50i-h5-cpu-opp.dtsi" -+ -+#include -+#include -+ -+/ { -+ model = "FriendlyARM NanoPi R1S H5"; -+ compatible = "friendlyarm,nanopi-r1s-h5", "allwinner,sun50i-h5"; -+ -+ aliases { -+ ethernet0 = &emac; -+ ethernet1 = &rtl8189etv; -+ serial0 = &uart0; -+ }; -+ -+ chosen { -+ stdout-path = "serial0:115200n8"; -+ }; -+ -+ leds { -+ compatible = "gpio-leds"; -+ -+ sys { -+ label = "nanopi:red:sys"; -+ gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>; -+ linux,default-trigger = "heartbeat"; -+ }; -+ -+ lan { -+ label = "nanopi:green:lan"; -+ gpios = <&pio 0 9 GPIO_ACTIVE_HIGH>; -+ }; -+ -+ wan { -+ label = "nanopi:green:wan"; -+ gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; -+ }; -+ }; -+ -+ r-gpio-keys { -+ compatible = "gpio-keys"; -+ -+ reset { -+ label = "reset"; -+ linux,code = ; -+ gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>; -+ }; -+ }; -+ -+ reg_gmac_3v3: gmac-3v3 { -+ compatible = "regulator-fixed"; -+ regulator-name = "gmac-3v3"; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ startup-delay-us = <100000>; -+ enable-active-high; -+ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; -+ }; -+ -+ reg_vcc3v3: vcc3v3 { -+ compatible = "regulator-fixed"; -+ regulator-name = "vcc3v3"; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ }; -+ -+ reg_usb0_vbus: usb0-vbus { -+ compatible = "regulator-fixed"; -+ regulator-name = "usb0-vbus"; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ enable-active-high; -+ gpio = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */ -+ status = "okay"; -+ }; -+ -+ vdd_cpux: gpio-regulator { -+ compatible = "regulator-gpio"; -+ regulator-name = "vdd-cpux"; -+ regulator-type = "voltage"; -+ regulator-boot-on; -+ regulator-always-on; -+ regulator-min-microvolt = <1100000>; -+ regulator-max-microvolt = <1300000>; -+ regulator-ramp-delay = <50>; /* 4ms */ -+ gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; -+ gpios-states = <0x1>; -+ states = <1100000 0x0>, <1300000 0x1>; -+ }; -+ -+ wifi_pwrseq: wifi_pwrseq { -+ compatible = "mmc-pwrseq-simple"; -+ reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */ -+ post-power-on-delay-ms = <200>; -+ }; -+}; -+ -+&cpu0 { -+ cpu-supply = <&vdd_cpux>; -+}; -+ -+&ehci1 { -+ status = "okay"; -+}; -+ -+&ehci2 { -+ status = "okay"; -+}; -+ -+&emac { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&emac_rgmii_pins>; -+ phy-supply = <®_gmac_3v3>; -+ phy-handle = <&ext_rgmii_phy>; -+ phy-mode = "rgmii-id"; -+ status = "okay"; -+}; -+ -+&external_mdio { -+ ext_rgmii_phy: ethernet-phy@7 { -+ compatible = "ethernet-phy-ieee802.3-c22"; -+ reg = <7>; -+ }; -+}; -+ -+&i2c0 { -+ status = "okay"; -+ -+ eeprom@51 { -+ compatible = "microchip,24c02"; -+ reg = <0x51>; -+ pagesize = <16>; -+ }; -+}; -+ -+&mmc0 { -+ vmmc-supply = <®_vcc3v3>; -+ bus-width = <4>; -+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */ -+ status = "okay"; -+}; -+ -+&mmc1 { -+ vmmc-supply = <®_vcc3v3>; -+ vqmmc-supply = <®_vcc3v3>; -+ mmc-pwrseq = <&wifi_pwrseq>; -+ bus-width = <4>; -+ non-removable; -+ status = "okay"; -+ -+ rtl8189etv: sdio_wifi@1 { -+ reg = <1>; -+ }; -+}; -+ -+&ohci1 { -+ status = "okay"; -+}; -+ -+&ohci2 { -+ status = "okay"; -+}; -+ -+&uart0 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart0_pa_pins>; -+ status = "okay"; -+}; -+ -+&usb_otg { -+ dr_mode = "peripheral"; -+ status = "okay"; -+}; -+ -+&usbphy { -+ /* USB Type-A port's VBUS is always on */ -+ usb0_id_det-gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */ -+ usb0_vbus-supply = <®_usb0_vbus>; -+ status = "okay"; -+}; diff --git a/target/linux/sunxi/patches-5.10/102-sunxi-add-OF-node-for-USB-eth-on-NanoPi-R1S-H5.patch b/target/linux/sunxi/patches-5.10/102-sunxi-add-OF-node-for-USB-eth-on-NanoPi-R1S-H5.patch deleted file mode 100644 index e14311aa64..0000000000 --- a/target/linux/sunxi/patches-5.10/102-sunxi-add-OF-node-for-USB-eth-on-NanoPi-R1S-H5.patch +++ /dev/null @@ -1,30 +0,0 @@ -From a896bc1d79e3c00f0aacfe225499d811775616f3 Mon Sep 17 00:00:00 2001 -From: Chukun Pan -Date: Sun, 10 Oct 2021 21:50:17 +0800 -Subject: [PATCH] arm64: allwinner: add OF node for USB eth on NanoPi R1S H5 - -This adds the OF node for the USB3 ethernet adapter on the FriendlyARM -NanoPi R1S H5. Add the correct value for the RTL8153 LED configuration -register to match the blink behavior of the other port on the device. - -Signed-off-by: Chukun Pan ---- - arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts | 7 +++++++ - 1 file changed, 7 insertions(+) - ---- a/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts -@@ -112,6 +112,13 @@ - - &ehci1 { - status = "okay"; -+ -+ usb-eth@1 { -+ compatible = "realtek,rtl8153"; -+ reg = <1>; -+ -+ realtek,led-data = <0x78>; -+ }; - }; - - &ehci2 { diff --git a/target/linux/sunxi/patches-5.10/431-arm64-dts-allwinner-nanopi-r1s-h5-add-status-LED.patch b/target/linux/sunxi/patches-5.10/431-arm64-dts-allwinner-nanopi-r1s-h5-add-status-LED.patch deleted file mode 100644 index 4a429c746e..0000000000 --- a/target/linux/sunxi/patches-5.10/431-arm64-dts-allwinner-nanopi-r1s-h5-add-status-LED.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 1845163a052efac124f00656eb72f38947630a42 Mon Sep 17 00:00:00 2001 -From: Chukun Pan -Date: Sun, 10 Oct 2021 21:50:18 +0800 -Subject: [PATCH] arm64: dts: allwinner: NanoPi R1S H5: add status LED aliases - -Use the SYS LED on the casing for showing system status. - -Signed-off-by: Chukun Pan ---- - arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - ---- a/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts -@@ -22,6 +22,11 @@ - ethernet0 = &emac; - ethernet1 = &rtl8189etv; - serial0 = &uart0; -+ -+ led-boot = &led_sys; -+ led-failsafe = &led_sys; -+ led-running = &led_sys; -+ led-upgrade = &led_sys; - }; - - chosen { -@@ -31,7 +36,7 @@ - leds { - compatible = "gpio-leds"; - -- sys { -+ led_sys: sys { - label = "nanopi:red:sys"; - gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>; - linux,default-trigger = "heartbeat"; diff --git a/target/linux/sunxi/patches-5.15/102-sunxi-add-OF-node-for-USB-eth-on-NanoPi-R1S-H5.patch b/target/linux/sunxi/patches-5.15/102-sunxi-add-OF-node-for-USB-eth-on-NanoPi-R1S-H5.patch new file mode 100644 index 0000000000..30c98aa737 --- /dev/null +++ b/target/linux/sunxi/patches-5.15/102-sunxi-add-OF-node-for-USB-eth-on-NanoPi-R1S-H5.patch @@ -0,0 +1,30 @@ +From a896bc1d79e3c00f0aacfe225499d811775616f3 Mon Sep 17 00:00:00 2001 +From: Chukun Pan +Date: Sun, 10 Oct 2021 21:50:17 +0800 +Subject: [PATCH] arm64: allwinner: add OF node for USB eth on NanoPi R1S H5 + +This adds the OF node for the USB3 ethernet adapter on the FriendlyARM +NanoPi R1S H5. Add the correct value for the RTL8153 LED configuration +register to match the blink behavior of the other port on the device. + +Signed-off-by: Chukun Pan +--- + arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts +@@ -116,6 +116,13 @@ + + &ehci1 { + status = "okay"; ++ ++ usb-eth@1 { ++ compatible = "realtek,rtl8153"; ++ reg = <1>; ++ ++ realtek,led-data = <0x78>; ++ }; + }; + + &ehci2 { diff --git a/target/linux/sunxi/patches-5.10/301-orangepi_pc2_usb_otg_to_host_key_power.patch b/target/linux/sunxi/patches-5.15/301-orangepi_pc2_usb_otg_to_host_key_power.patch similarity index 100% rename from target/linux/sunxi/patches-5.10/301-orangepi_pc2_usb_otg_to_host_key_power.patch rename to target/linux/sunxi/patches-5.15/301-orangepi_pc2_usb_otg_to_host_key_power.patch diff --git a/target/linux/sunxi/patches-5.10/400-arm64-allwinner-a64-sopine-Add-Sopine-flash-partitio.patch b/target/linux/sunxi/patches-5.15/400-arm64-allwinner-a64-sopine-Add-Sopine-flash-partitio.patch similarity index 100% rename from target/linux/sunxi/patches-5.10/400-arm64-allwinner-a64-sopine-Add-Sopine-flash-partitio.patch rename to target/linux/sunxi/patches-5.15/400-arm64-allwinner-a64-sopine-Add-Sopine-flash-partitio.patch diff --git a/target/linux/sunxi/patches-5.10/430-arm64-dts-allwinner-a64-olinuxino-add-status-LED-ali.patch b/target/linux/sunxi/patches-5.15/430-arm64-dts-allwinner-a64-olinuxino-add-status-LED-ali.patch similarity index 100% rename from target/linux/sunxi/patches-5.10/430-arm64-dts-allwinner-a64-olinuxino-add-status-LED-ali.patch rename to target/linux/sunxi/patches-5.15/430-arm64-dts-allwinner-a64-olinuxino-add-status-LED-ali.patch diff --git a/target/linux/sunxi/patches-5.15/431-arm64-dts-allwinner-nanopi-r1s-h5-add-status-LED.patch b/target/linux/sunxi/patches-5.15/431-arm64-dts-allwinner-nanopi-r1s-h5-add-status-LED.patch new file mode 100644 index 0000000000..8670d06109 --- /dev/null +++ b/target/linux/sunxi/patches-5.15/431-arm64-dts-allwinner-nanopi-r1s-h5-add-status-LED.patch @@ -0,0 +1,35 @@ +From 1845163a052efac124f00656eb72f38947630a42 Mon Sep 17 00:00:00 2001 +From: Chukun Pan +Date: Sun, 10 Oct 2021 21:50:18 +0800 +Subject: [PATCH] arm64: dts: allwinner: NanoPi R1S H5: add status LED aliases + +Use the SYS LED on the casing for showing system status. + +Signed-off-by: Chukun Pan +--- + arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +--- a/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts +@@ -23,6 +23,11 @@ + ethernet0 = &emac; + ethernet1 = &rtl8189etv; + serial0 = &uart0; ++ ++ led-boot = &led_sys; ++ led-failsafe = &led_sys; ++ led-running = &led_sys; ++ led-upgrade = &led_sys; + }; + + chosen { +@@ -38,7 +43,7 @@ + gpios = <&pio 0 9 GPIO_ACTIVE_HIGH>; + }; + +- led-1 { ++ led_sys: led-1 { + function = LED_FUNCTION_STATUS; + color = ; + gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>; diff --git a/target/linux/sunxi/patches-5.10/442-arm64-dts-orangepi-one-plus-enable-PWM.patch b/target/linux/sunxi/patches-5.15/442-arm64-dts-orangepi-one-plus-enable-PWM.patch similarity index 100% rename from target/linux/sunxi/patches-5.10/442-arm64-dts-orangepi-one-plus-enable-PWM.patch rename to target/linux/sunxi/patches-5.15/442-arm64-dts-orangepi-one-plus-enable-PWM.patch diff --git a/target/linux/sunxi/patches-5.10/450-arm64-dts-enable-wifi-on-pine64-boards.patch b/target/linux/sunxi/patches-5.15/450-arm64-dts-enable-wifi-on-pine64-boards.patch similarity index 100% rename from target/linux/sunxi/patches-5.10/450-arm64-dts-enable-wifi-on-pine64-boards.patch rename to target/linux/sunxi/patches-5.15/450-arm64-dts-enable-wifi-on-pine64-boards.patch diff --git a/target/linux/sunxi/profiles/00-default.mk b/target/linux/sunxi/profiles/00-default.mk index 0541087a48..0e3192adaf 100644 --- a/target/linux/sunxi/profiles/00-default.mk +++ b/target/linux/sunxi/profiles/00-default.mk @@ -13,7 +13,7 @@ define Profile/Default kmod-sun4i-emac \ rtl8188eu-firmware \ swconfig \ - wpad-basic-wolfssl + wpad-basic-mbedtls PRIORITY := 1 endef diff --git a/target/linux/uml/Makefile b/target/linux/uml/Makefile index 5c884fb9a0..2b314aa4bb 100644 --- a/target/linux/uml/Makefile +++ b/target/linux/uml/Makefile @@ -13,11 +13,11 @@ BOARD:=uml BOARDNAME:=User Mode Linux FEATURES:=audio ext4 rootfs-part squashfs -KERNEL_PATCHVER:=5.10 +KERNEL_PATCHVER:=5.15 include $(INCLUDE_DIR)/target.mk -DEFAULT_PACKAGES += wpad-basic-wolfssl kmod-mac80211-hwsim mkf2fs e2fsprogs +DEFAULT_PACKAGES += wpad-basic-mbedtls kmod-mac80211-hwsim mkf2fs e2fsprogs endif endif diff --git a/target/linux/uml/README.md b/target/linux/uml/README.md index d7100d263a..da006d2dbc 100644 --- a/target/linux/uml/README.md +++ b/target/linux/uml/README.md @@ -28,7 +28,7 @@ console prompt. If you would like it in xterms, substitute `con=xterm` and `con0=xterm`. **No networking is configured** but it's a starting point. The resulting file system has just enough free space to start kicking the tires and playing in the world of 'embedded routers' along with all the resource -restrictions that come with that world. +restrictions that come with that world. To configure networking and more refer to the *user mode linux* documentation online. A quick start goes along this line. Install the `uml-utilities` diff --git a/target/linux/uml/config-5.10 b/target/linux/uml/config-5.10 deleted file mode 100644 index 1c432abe68..0000000000 --- a/target/linux/uml/config-5.10 +++ /dev/null @@ -1,135 +0,0 @@ -CONFIG_3_LEVEL_PGTABLES=y -CONFIG_64BIT=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_ARCH_NO_PREEMPT=y -CONFIG_BLK_DEV_COW_COMMON=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_UBD=y -CONFIG_BLK_DEV_UBD_SYNC=y -CONFIG_BLK_MQ_VIRTIO=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_CDROM=y -# CONFIG_COMMON_CLK is not set -# CONFIG_COMPAT_32BIT_TIME is not set -CONFIG_CON_CHAN="xterm" -CONFIG_CON_ZERO_CHAN="fd:0,fd:1" -CONFIG_CPU_SUP_AMD=y -CONFIG_CPU_SUP_CENTAUR=y -CONFIG_CPU_SUP_HYGON=y -CONFIG_CPU_SUP_INTEL=y -CONFIG_CPU_SUP_ZHAOXIN=y -CONFIG_CRC16=y -CONFIG_CRYPTO_BLAKE2S=y -CONFIG_CRYPTO_CRC32=y -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_SHA1=y -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -CONFIG_DEBUG_MEMORY_INIT=y -CONFIG_DECOMPRESS_BZIP2=y -CONFIG_DECOMPRESS_GZIP=y -CONFIG_DNOTIFY=y -# CONFIG_EARLY_PRINTK is not set -CONFIG_EXT4_FS=y -CONFIG_F2FS_FS=y -CONFIG_FAILOVER=y -CONFIG_FS_IOMAP=y -CONFIG_FS_MBCACHE=y -CONFIG_FW_LOADER_PAGED_BUF=y -CONFIG_GENERIC_CLOCKEVENTS=y -# CONFIG_GENERIC_CPU is not set -CONFIG_GENERIC_CPU_DEVICES=y -CONFIG_GENERIC_FIND_FIRST_BIT=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_HOSTFS=y -CONFIG_HVC_DRIVER=y -CONFIG_HW_RANDOM=y -CONFIG_HZ_PERIODIC=y -CONFIG_IA32_FEAT_CTL=y -CONFIG_INITRAMFS_SOURCE="" -CONFIG_INIT_ENV_ARG_LIMIT=128 -CONFIG_IRQ_WORK=y -CONFIG_ISO9660_FS=y -CONFIG_JBD2=y -# CONFIG_JFFS2_FS is not set -CONFIG_KALLSYMS=y -CONFIG_KERNEL_STACK_ORDER=2 -CONFIG_LOCK_DEBUGGING_SUPPORT=y -# CONFIG_MATOM is not set -CONFIG_MAY_HAVE_RUNTIME_DEPS=y -CONFIG_MCONSOLE=y -# CONFIG_MCORE2 is not set -CONFIG_MEMFD_CREATE=y -CONFIG_MIGRATION=y -CONFIG_MK8=y -# CONFIG_MMAPPER is not set -CONFIG_MODULES_USE_ELF_RELA=y -# CONFIG_MPSC is not set -CONFIG_NAMESPACES=y -CONFIG_NEED_PER_CPU_KM=y -CONFIG_NET_FAILOVER=y -# CONFIG_NET_NS is not set -CONFIG_NLS=y -CONFIG_NO_DMA=y -CONFIG_NO_IOMEM=y -CONFIG_NR_CPUS=1 -CONFIG_NULL_CHAN=y -# CONFIG_OF is not set -CONFIG_PGTABLE_LEVELS=3 -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_PORT_CHAN=y -CONFIG_POSIX_MQUEUE=y -CONFIG_POSIX_MQUEUE_SYSCTL=y -# CONFIG_PROCESSOR_SELECT is not set -CONFIG_PROC_PAGE_MONITOR=y -CONFIG_PTY_CHAN=y -CONFIG_RD_BZIP2=y -CONFIG_RD_GZIP=y -CONFIG_RELAY=y -CONFIG_SOFT_WATCHDOG=m -CONFIG_SRCU=y -CONFIG_SSL=y -CONFIG_SSL_CHAN="pty" -CONFIG_STACKTRACE=y -CONFIG_STDERR_CONSOLE=y -CONFIG_TICK_CPU_ACCOUNTING=y -CONFIG_TINY_SRCU=y -CONFIG_TTY_CHAN=y -CONFIG_UML=y -CONFIG_UML_NET=y -CONFIG_UML_NET_DAEMON=y -CONFIG_UML_NET_DETERMINISTIC_MAC=y -CONFIG_UML_NET_ETHERTAP=y -CONFIG_UML_NET_MCAST=y -# CONFIG_UML_NET_PCAP is not set -CONFIG_UML_NET_SLIP=y -CONFIG_UML_NET_SLIRP=y -CONFIG_UML_NET_TUNTAP=y -# CONFIG_UML_NET_VDE is not set -CONFIG_UML_NET_VECTOR=y -CONFIG_UML_RANDOM=y -# CONFIG_UML_SOUND is not set -CONFIG_UML_TIME_TRAVEL_SUPPORT=y -CONFIG_UML_WATCHDOG=y -CONFIG_UML_X86=y -# CONFIG_USER_NS is not set -CONFIG_VIRTIO=y -CONFIG_VIRTIO_BLK=y -CONFIG_VIRTIO_CONSOLE=y -CONFIG_VIRTIO_NET=y -CONFIG_VIRTIO_UML=y -CONFIG_VM_EVENT_COUNTERS=y -CONFIG_WATCHDOG_CORE=y -CONFIG_X86_64=y -CONFIG_X86_CMOV=y -CONFIG_X86_CMPXCHG64=y -CONFIG_X86_INTEL_USERCOPY=y -CONFIG_X86_INTERNODE_CACHE_SHIFT=6 -CONFIG_X86_L1_CACHE_SHIFT=6 -CONFIG_X86_MINIMUM_CPU_FAMILY=64 -CONFIG_X86_TSC=y -CONFIG_X86_USE_PPRO_CHECKSUM=y -CONFIG_XTERM_CHAN=y -CONFIG_ZLIB_INFLATE=y diff --git a/target/linux/uml/config-5.15 b/target/linux/uml/config-5.15 new file mode 100644 index 0000000000..549a31e1c6 --- /dev/null +++ b/target/linux/uml/config-5.15 @@ -0,0 +1,141 @@ +CONFIG_3_LEVEL_PGTABLES=y +CONFIG_64BIT=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_ARCH_EPHEMERAL_INODES=y +CONFIG_ARCH_NO_PREEMPT=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_BLK_DEV_COW_COMMON=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_UBD=y +CONFIG_BLK_DEV_UBD_SYNC=y +CONFIG_BLK_MQ_VIRTIO=y +CONFIG_CDROM=y +# CONFIG_COMMON_CLK is not set +# CONFIG_COMPAT_32BIT_TIME is not set +CONFIG_CON_CHAN="xterm" +CONFIG_CON_ZERO_CHAN="fd:0,fd:1" +CONFIG_CPU_SUP_AMD=y +CONFIG_CPU_SUP_CENTAUR=y +CONFIG_CPU_SUP_HYGON=y +CONFIG_CPU_SUP_INTEL=y +CONFIG_CPU_SUP_ZHAOXIN=y +CONFIG_CRC16=y +CONFIG_CRYPTO_BLAKE2S=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_SHA1=y +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +CONFIG_DEBUG_MEMORY_INIT=y +CONFIG_DECOMPRESS_BZIP2=y +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DNOTIFY=y +# CONFIG_EARLY_PRINTK is not set +CONFIG_EXT4_FS=y +CONFIG_F2FS_FS=y +CONFIG_FAILOVER=y +CONFIG_FS_IOMAP=y +CONFIG_FS_MBCACHE=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_GENERIC_CLOCKEVENTS=y +# CONFIG_GENERIC_CPU is not set +CONFIG_GENERIC_CPU_DEVICES=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_HOSTFS=y +CONFIG_HVC_DRIVER=y +CONFIG_HW_RANDOM=y +CONFIG_HZ_PERIODIC=y +CONFIG_IA32_FEAT_CTL=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_INIT_ENV_ARG_LIMIT=128 +CONFIG_IRQ_WORK=y +CONFIG_ISO9660_FS=y +CONFIG_JBD2=y +# CONFIG_JFFS2_FS is not set +CONFIG_KALLSYMS=y +CONFIG_KERNEL_STACK_ORDER=2 +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_MATOM is not set +CONFIG_MAY_HAVE_RUNTIME_DEPS=y +CONFIG_MCONSOLE=y +# CONFIG_MCORE2 is not set +CONFIG_MEMFD_CREATE=y +CONFIG_MIGRATION=y +CONFIG_MK8=y +# CONFIG_MMAPPER is not set +CONFIG_MODULES_USE_ELF_RELA=y +# CONFIG_MPSC is not set +CONFIG_NAMESPACES=y +CONFIG_NEED_PER_CPU_KM=y +CONFIG_NET_FAILOVER=y +# CONFIG_NET_NS is not set +CONFIG_NLS=y +CONFIG_NO_DMA=y +CONFIG_NO_IOMEM=y +CONFIG_NO_IOPORT_MAP=y +CONFIG_NR_CPUS=1 +CONFIG_NULL_CHAN=y +# CONFIG_OF is not set +CONFIG_PGTABLE_LEVELS=3 +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_PORT_CHAN=y +CONFIG_POSIX_MQUEUE=y +CONFIG_POSIX_MQUEUE_SYSCTL=y +# CONFIG_PROCESSOR_SELECT is not set +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y +CONFIG_PTY_CHAN=y +CONFIG_RD_BZIP2=y +CONFIG_RD_GZIP=y +CONFIG_RELAY=y +CONFIG_SG_POOL=y +CONFIG_SOFT_WATCHDOG=m +CONFIG_SRCU=y +CONFIG_SSL=y +CONFIG_SSL_CHAN="pty" +CONFIG_STACKTRACE=y +CONFIG_STDERR_CONSOLE=y +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TINY_SRCU=y +CONFIG_TTY_CHAN=y +CONFIG_UML=y +CONFIG_UML_NET=y +CONFIG_UML_NET_DAEMON=y +CONFIG_UML_NET_DETERMINISTIC_MAC=y +CONFIG_UML_NET_ETHERTAP=y +CONFIG_UML_NET_MCAST=y +# CONFIG_UML_NET_PCAP is not set +CONFIG_UML_NET_SLIP=y +CONFIG_UML_NET_SLIRP=y +CONFIG_UML_NET_TUNTAP=y +# CONFIG_UML_NET_VDE is not set +CONFIG_UML_NET_VECTOR=y +# CONFIG_UML_PCI_OVER_VIRTIO is not set +CONFIG_UML_RANDOM=y +# CONFIG_UML_SOUND is not set +CONFIG_UML_TIME_TRAVEL_SUPPORT=y +CONFIG_UML_WATCHDOG=y +CONFIG_UML_X86=y +# CONFIG_USER_NS is not set +CONFIG_VIRTIO=y +CONFIG_VIRTIO_BLK=y +CONFIG_VIRTIO_CONSOLE=y +CONFIG_VIRTIO_NET=y +CONFIG_VIRTIO_UML=y +CONFIG_VMAP_STACK=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_WATCHDOG_CORE=y +CONFIG_X86_64=y +CONFIG_X86_CMOV=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_INTERNODE_CACHE_SHIFT=6 +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_MINIMUM_CPU_FAMILY=64 +CONFIG_X86_TSC=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_XTERM_CHAN=y +CONFIG_ZLIB_INFLATE=y diff --git a/target/linux/uml/patches-5.10/101-mconsole-exec.patch b/target/linux/uml/patches-5.10/101-mconsole-exec.patch deleted file mode 100644 index dae84d6bf5..0000000000 --- a/target/linux/uml/patches-5.10/101-mconsole-exec.patch +++ /dev/null @@ -1,213 +0,0 @@ -# -# Minimalist mconsole exec patch -# -# 3.10 version (with bit more synchronous behavior) by fingon at iki dot fi -# Adaptation to kernel 3.3.8 made by David Fernández (david at dit.upm.es) for -# Starting point: mconsole-exec-2.6.30.patch for kernel 2.6.30 -# Author of original patch: Paolo Giarrusso, aka Blaisorblade -# (http://www.user-mode-linux.org/~blaisorblade) -# -# Known misfeatures: -# -# - If output is too long, blocks (and breaks horribly) -# (this misfeature from 3.10 patches, when minimalizing the patch; -# workaround: redirect to a shared filesystem if long output is expected) -# -# - Nothing useful is done with stdin -# ---- a/arch/um/drivers/mconsole.h -+++ b/arch/um/drivers/mconsole.h -@@ -85,6 +85,7 @@ extern void mconsole_cad(struct mc_reque - extern void mconsole_stop(struct mc_request *req); - extern void mconsole_go(struct mc_request *req); - extern void mconsole_log(struct mc_request *req); -+extern void mconsole_exec(struct mc_request *req); - extern void mconsole_proc(struct mc_request *req); - extern void mconsole_stack(struct mc_request *req); - ---- a/arch/um/drivers/mconsole_kern.c -+++ b/arch/um/drivers/mconsole_kern.c -@@ -4,6 +4,7 @@ - * Copyright (C) 2001 - 2008 Jeff Dike (jdike@{addtoit,linux.intel}.com) - */ - -+#include - #include - #include - #include -@@ -26,6 +27,7 @@ - #include - #include - #include -+#include - #include - - #include -@@ -123,6 +125,59 @@ void mconsole_log(struct mc_request *req - mconsole_reply(req, "", 0, 0); - } - -+void mconsole_exec(struct mc_request *req) -+{ -+ struct subprocess_info *sub_info; -+ int res, len; -+ struct file *out; -+ char buf[MCONSOLE_MAX_DATA]; -+ -+ char *envp[] = { -+ "HOME=/", "TERM=linux", -+ "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin", -+ NULL -+ }; -+ char *argv[] = { -+ "/bin/sh", "-c", -+ req->request.data + strlen("exec "), -+ NULL -+ }; -+ -+ sub_info = call_usermodehelper_setup("/bin/sh", argv, envp, GFP_ATOMIC, NULL, NULL, NULL); -+ if (sub_info == NULL) { -+ mconsole_reply(req, "call_usermodehelper_setup failed", 1, 0); -+ return; -+ } -+ res = call_usermodehelper_stdoutpipe(sub_info, &out); -+ if (res < 0) { -+ kfree(sub_info); -+ mconsole_reply(req, "call_usermodehelper_stdoutpipe failed", 1, 0); -+ return; -+ } -+ -+ res = call_usermodehelper_exec(sub_info, UMH_WAIT_PROC); -+ if (res < 0) { -+ kfree(sub_info); -+ mconsole_reply(req, "call_usermodehelper_exec failed", 1, 0); -+ return; -+ } -+ -+ for (;;) { -+ len = out->f_op->read(out, buf, sizeof(buf), &out->f_pos); -+ if (len < 0) { -+ mconsole_reply(req, "reading output failed", 1, 0); -+ break; -+ } -+ if (len == 0) -+ break; -+ mconsole_reply_len(req, buf, len, 0, 1); -+ } -+ fput(out); -+ -+ mconsole_reply_len(req, NULL, 0, 0, 0); -+} -+ -+ - void mconsole_proc(struct mc_request *req) - { - struct vfsmount *mnt = proc_mnt; -@@ -189,6 +244,7 @@ void mconsole_proc(struct mc_request *re - stop - pause the UML; it will do nothing until it receives a 'go' \n\ - go - continue the UML after a 'stop' \n\ - log - make UML enter into the kernel log\n\ -+ exec - pass to /bin/sh -c synchronously\n\ - proc - returns the contents of the UML's /proc/\n\ - stack - returns the stack of the specified pid\n\ - " ---- a/arch/um/drivers/mconsole_user.c -+++ b/arch/um/drivers/mconsole_user.c -@@ -30,6 +30,7 @@ static struct mconsole_command commands[ - { "stop", mconsole_stop, MCONSOLE_PROC }, - { "go", mconsole_go, MCONSOLE_INTR }, - { "log", mconsole_log, MCONSOLE_INTR }, -+ { "exec", mconsole_exec, MCONSOLE_PROC }, - { "proc", mconsole_proc, MCONSOLE_PROC }, - { "stack", mconsole_stack, MCONSOLE_INTR }, - }; ---- a/arch/um/os-Linux/file.c -+++ b/arch/um/os-Linux/file.c -@@ -560,6 +560,8 @@ int os_create_unix_socket(const char *fi - - addr.sun_family = AF_UNIX; - -+ if (len > sizeof(addr.sun_path)) -+ len = sizeof(addr.sun_path); - snprintf(addr.sun_path, len, "%s", file); - - err = bind(sock, (struct sockaddr *) &addr, sizeof(addr)); ---- a/include/linux/kmod.h -+++ b/include/linux/kmod.h -@@ -32,4 +32,6 @@ static inline int request_module_nowait( - #define try_then_request_module(x, mod...) (x) - #endif - -+int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info, struct file **filp); -+ - #endif /* __LINUX_KMOD_H__ */ ---- a/include/linux/umh.h -+++ b/include/linux/umh.h -@@ -22,6 +22,7 @@ struct subprocess_info { - const char *path; - char **argv; - char **envp; -+ struct file *stdout; - int wait; - int retval; - int (*init)(struct subprocess_info *info, struct cred *new); ---- a/kernel/umh.c -+++ b/kernel/umh.c -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - - #include - -@@ -72,6 +73,28 @@ static int call_usermodehelper_exec_asyn - flush_signal_handlers(current, 1); - spin_unlock_irq(¤t->sighand->siglock); - -+ /* Install output when needed */ -+ if (sub_info->stdout) { -+ struct files_struct *f = current->files; -+ struct fdtable *fdt; -+ -+ sys_close(1); -+ sys_close(2); -+ get_file(sub_info->stdout); -+ fd_install(1, sub_info->stdout); -+ fd_install(2, sub_info->stdout); -+ spin_lock(&f->file_lock); -+ fdt = files_fdtable(f); -+ __set_bit(1, fdt->open_fds); -+ __clear_bit(1, fdt->close_on_exec); -+ __set_bit(2, fdt->open_fds); -+ __clear_bit(2, fdt->close_on_exec); -+ spin_unlock(&f->file_lock); -+ -+ /* disallow core files */ -+ current->signal->rlim[RLIMIT_CORE] = (struct rlimit){0, 0}; -+ } -+ - /* - * Initial kernel threads share ther FS with init, in order to - * get the init root directory. But we've now created a new -@@ -330,6 +353,20 @@ static void helper_unlock(void) - wake_up(&running_helpers_waitq); - } - -+int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info, -+ struct file **filp) -+{ -+ struct file *f[2]; -+ -+ if (create_pipe_files(f, 0) < 0) -+ return PTR_ERR(f); -+ -+ sub_info->stdout = f[1]; -+ *filp = f[0]; -+ return 0; -+} -+EXPORT_SYMBOL(call_usermodehelper_stdoutpipe); -+ - /** - * call_usermodehelper_setup - prepare to call a usermode helper - * @path: path to usermode executable diff --git a/target/linux/uml/patches-5.10/102-pseudo-random-mac.patch b/target/linux/uml/patches-5.10/102-pseudo-random-mac.patch deleted file mode 100644 index a4e6500f94..0000000000 --- a/target/linux/uml/patches-5.10/102-pseudo-random-mac.patch +++ /dev/null @@ -1,147 +0,0 @@ -=============================================================================== - -This patch makes MAC addresses of network interfaces predictable. In -particular, it adds a small routine that computes MAC addresses of based on -a SHA1 hash of the virtual machine name and interface ID. - -TECHNICAL INFORMATION: - -Applies to vanilla kernel 3.9.4. - -=============================================================================== ---- a/arch/um/drivers/Kconfig -+++ b/arch/um/drivers/Kconfig -@@ -146,6 +146,20 @@ config UML_NET - enable at least one of the following transport options to actually - make use of UML networking. - -+config UML_NET_DETERMINISTIC_MAC -+ bool "Use deterministic MAC addresses for network interfaces" -+ default y -+ depends on UML_NET -+ select CRYPTO_SHA1 -+ help -+ Virtual network devices inside a User-Mode Linux instance must be -+ assigned a MAC (Ethernet) address. If none is specified on the UML -+ command line, one must be automatically computed. If this option is -+ enabled, a randomly generated address is used. Otherwise, if this -+ option is disabled, the address is generated from a SHA1 hash of -+ the umid of the UML instance and the interface name. The latter choice -+ is useful to make MAC addresses predictable. -+ - config UML_NET_ETHERTAP - bool "Ethertap transport (obsolete)" - depends on UML_NET ---- a/arch/um/drivers/net_kern.c -+++ b/arch/um/drivers/net_kern.c -@@ -25,6 +25,14 @@ - #include - #include - -+#include -+#include -+#include -+#include -+#include -+#include -+#include "os.h" -+ - #define DRIVER_NAME "uml-netdev" - - static DEFINE_SPINLOCK(opened_lock); -@@ -274,9 +282,51 @@ static const struct ethtool_ops uml_net_ - .get_ts_info = ethtool_op_get_ts_info, - }; - -+#ifdef CONFIG_UML_NET_DETERMINISTIC_MAC -+ -+/* Compute a SHA1 hash of the UML instance's id and -+ * * an interface name. */ -+static int compute_hash(const char *umid, const char *ifname, char *hash) -+{ -+ struct ahash_request *desc; -+ struct crypto_ahash *tfm; -+ struct scatterlist sg; -+ char vmif[1024]; -+ int ret; -+ -+ strcpy (vmif, umid); -+ strcat (vmif, ifname); -+ -+ tfm = crypto_alloc_ahash("sha1", 0, CRYPTO_ALG_ASYNC); -+ if (IS_ERR(tfm)) -+ return -ENOMEM; -+ -+ desc = ahash_request_alloc(tfm, GFP_KERNEL); -+ if (!desc) { -+ ret = -ENOMEM; -+ goto out; -+ } -+ -+ crypto_ahash_clear_flags(tfm, ~0); -+ -+ sg_init_table(&sg, 1); -+ sg_set_buf(&sg, vmif, strlen(vmif)); -+ -+ ahash_request_set_crypt(desc, &sg, hash, strlen(vmif)); -+ -+ ret = crypto_ahash_digest(desc); -+out: -+ crypto_free_ahash(tfm); -+ -+ return ret; -+} -+ -+#endif -+ - void uml_net_setup_etheraddr(struct net_device *dev, char *str) - { - unsigned char *addr = dev->dev_addr; -+ u8 hash[SHA1_DIGEST_SIZE]; - char *end; - int i; - -@@ -319,9 +369,26 @@ void uml_net_setup_etheraddr(struct net_ - return; - - random: -+#ifndef CONFIG_UML_NET_DETERMINISTIC_MAC - printk(KERN_INFO - "Choosing a random ethernet address for device %s\n", dev->name); - eth_hw_addr_random(dev); -+#else -+ printk(KERN_INFO -+ "Computing a digest to use as ethernet address for device %s\n", dev->name); -+ if (compute_hash(get_umid(), dev->name, hash) < 0) { -+ printk(KERN_WARNING -+ "Could not compute digest to use as ethernet address for device %s. " -+ "Using random address instead.\n", dev->name); -+ random_ether_addr(addr); -+ } -+ else { -+ for (i=0; i < 6; i++) -+ addr[i] = (hash[i] + hash[i+6]) % 0x100; -+ } -+ addr [0] &= 0xfe; /* clear multicast bit */ -+ addr [0] |= 0x02; /* set local assignment bit (IEEE802) */ -+#endif - } - - static DEFINE_SPINLOCK(devices_lock); ---- a/kernel/umh.c -+++ b/kernel/umh.c -@@ -354,12 +354,12 @@ static void helper_unlock(void) - } - - int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info, -- struct file **filp) -+ struct file **filp) - { - struct file *f[2]; - - if (create_pipe_files(f, 0) < 0) -- return PTR_ERR(f); -+ return PTR_ERR(f); - - sub_info->stdout = f[1]; - *filp = f[0]; diff --git a/target/linux/uml/patches-5.15/101-mconsole-exec.patch b/target/linux/uml/patches-5.15/101-mconsole-exec.patch new file mode 100644 index 0000000000..ceea41e013 --- /dev/null +++ b/target/linux/uml/patches-5.15/101-mconsole-exec.patch @@ -0,0 +1,213 @@ +# +# Minimalist mconsole exec patch +# +# 3.10 version (with bit more synchronous behavior) by fingon at iki dot fi +# Adaptation to kernel 3.3.8 made by David Fernández (david at dit.upm.es) for +# Starting point: mconsole-exec-2.6.30.patch for kernel 2.6.30 +# Author of original patch: Paolo Giarrusso, aka Blaisorblade +# (http://www.user-mode-linux.org/~blaisorblade) +# +# Known misfeatures: +# +# - If output is too long, blocks (and breaks horribly) +# (this misfeature from 3.10 patches, when minimalizing the patch; +# workaround: redirect to a shared filesystem if long output is expected) +# +# - Nothing useful is done with stdin +# +--- a/arch/um/drivers/mconsole.h ++++ b/arch/um/drivers/mconsole.h +@@ -85,6 +85,7 @@ extern void mconsole_cad(struct mc_reque + extern void mconsole_stop(struct mc_request *req); + extern void mconsole_go(struct mc_request *req); + extern void mconsole_log(struct mc_request *req); ++extern void mconsole_exec(struct mc_request *req); + extern void mconsole_proc(struct mc_request *req); + extern void mconsole_stack(struct mc_request *req); + +--- a/arch/um/drivers/mconsole_kern.c ++++ b/arch/um/drivers/mconsole_kern.c +@@ -4,6 +4,7 @@ + * Copyright (C) 2001 - 2008 Jeff Dike (jdike@{addtoit,linux.intel}.com) + */ + ++#include + #include + #include + #include +@@ -27,6 +28,7 @@ + #include + #include + #include ++#include + #include + + #include +@@ -124,6 +126,59 @@ void mconsole_log(struct mc_request *req + mconsole_reply(req, "", 0, 0); + } + ++void mconsole_exec(struct mc_request *req) ++{ ++ struct subprocess_info *sub_info; ++ int res, len; ++ struct file *out; ++ char buf[MCONSOLE_MAX_DATA]; ++ ++ char *envp[] = { ++ "HOME=/", "TERM=linux", ++ "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin", ++ NULL ++ }; ++ char *argv[] = { ++ "/bin/sh", "-c", ++ req->request.data + strlen("exec "), ++ NULL ++ }; ++ ++ sub_info = call_usermodehelper_setup("/bin/sh", argv, envp, GFP_ATOMIC, NULL, NULL, NULL); ++ if (sub_info == NULL) { ++ mconsole_reply(req, "call_usermodehelper_setup failed", 1, 0); ++ return; ++ } ++ res = call_usermodehelper_stdoutpipe(sub_info, &out); ++ if (res < 0) { ++ kfree(sub_info); ++ mconsole_reply(req, "call_usermodehelper_stdoutpipe failed", 1, 0); ++ return; ++ } ++ ++ res = call_usermodehelper_exec(sub_info, UMH_WAIT_PROC); ++ if (res < 0) { ++ kfree(sub_info); ++ mconsole_reply(req, "call_usermodehelper_exec failed", 1, 0); ++ return; ++ } ++ ++ for (;;) { ++ len = out->f_op->read(out, buf, sizeof(buf), &out->f_pos); ++ if (len < 0) { ++ mconsole_reply(req, "reading output failed", 1, 0); ++ break; ++ } ++ if (len == 0) ++ break; ++ mconsole_reply_len(req, buf, len, 0, 1); ++ } ++ fput(out); ++ ++ mconsole_reply_len(req, NULL, 0, 0, 0); ++} ++ ++ + void mconsole_proc(struct mc_request *req) + { + struct vfsmount *mnt = proc_mnt; +@@ -190,6 +245,7 @@ void mconsole_proc(struct mc_request *re + stop - pause the UML; it will do nothing until it receives a 'go' \n\ + go - continue the UML after a 'stop' \n\ + log - make UML enter into the kernel log\n\ ++ exec - pass to /bin/sh -c synchronously\n\ + proc - returns the contents of the UML's /proc/\n\ + stack - returns the stack of the specified pid\n\ + " +--- a/arch/um/drivers/mconsole_user.c ++++ b/arch/um/drivers/mconsole_user.c +@@ -30,6 +30,7 @@ static struct mconsole_command commands[ + { "stop", mconsole_stop, MCONSOLE_PROC }, + { "go", mconsole_go, MCONSOLE_INTR }, + { "log", mconsole_log, MCONSOLE_INTR }, ++ { "exec", mconsole_exec, MCONSOLE_PROC }, + { "proc", mconsole_proc, MCONSOLE_PROC }, + { "stack", mconsole_stack, MCONSOLE_INTR }, + }; +--- a/arch/um/os-Linux/file.c ++++ b/arch/um/os-Linux/file.c +@@ -560,6 +560,8 @@ int os_create_unix_socket(const char *fi + + addr.sun_family = AF_UNIX; + ++ if (len > sizeof(addr.sun_path)) ++ len = sizeof(addr.sun_path); + snprintf(addr.sun_path, len, "%s", file); + + err = bind(sock, (struct sockaddr *) &addr, sizeof(addr)); +--- a/include/linux/kmod.h ++++ b/include/linux/kmod.h +@@ -32,4 +32,6 @@ static inline int request_module_nowait( + #define try_then_request_module(x, mod...) (x) + #endif + ++int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info, struct file **filp); ++ + #endif /* __LINUX_KMOD_H__ */ +--- a/include/linux/umh.h ++++ b/include/linux/umh.h +@@ -22,6 +22,7 @@ struct subprocess_info { + const char *path; + char **argv; + char **envp; ++ struct file *stdout; + int wait; + int retval; + int (*init)(struct subprocess_info *info, struct cred *new); +--- a/kernel/umh.c ++++ b/kernel/umh.c +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + + #include + +@@ -73,6 +74,28 @@ static int call_usermodehelper_exec_asyn + flush_signal_handlers(current, 1); + spin_unlock_irq(¤t->sighand->siglock); + ++ /* Install output when needed */ ++ if (sub_info->stdout) { ++ struct files_struct *f = current->files; ++ struct fdtable *fdt; ++ ++ sys_close(1); ++ sys_close(2); ++ get_file(sub_info->stdout); ++ fd_install(1, sub_info->stdout); ++ fd_install(2, sub_info->stdout); ++ spin_lock(&f->file_lock); ++ fdt = files_fdtable(f); ++ __set_bit(1, fdt->open_fds); ++ __clear_bit(1, fdt->close_on_exec); ++ __set_bit(2, fdt->open_fds); ++ __clear_bit(2, fdt->close_on_exec); ++ spin_unlock(&f->file_lock); ++ ++ /* disallow core files */ ++ current->signal->rlim[RLIMIT_CORE] = (struct rlimit){0, 0}; ++ } ++ + /* + * Initial kernel threads share ther FS with init, in order to + * get the init root directory. But we've now created a new +@@ -332,6 +355,20 @@ static void helper_unlock(void) + wake_up(&running_helpers_waitq); + } + ++int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info, ++ struct file **filp) ++{ ++ struct file *f[2]; ++ ++ if (create_pipe_files(f, 0) < 0) ++ return PTR_ERR(f); ++ ++ sub_info->stdout = f[1]; ++ *filp = f[0]; ++ return 0; ++} ++EXPORT_SYMBOL(call_usermodehelper_stdoutpipe); ++ + /** + * call_usermodehelper_setup - prepare to call a usermode helper + * @path: path to usermode executable diff --git a/target/linux/uml/patches-5.15/102-pseudo-random-mac.patch b/target/linux/uml/patches-5.15/102-pseudo-random-mac.patch new file mode 100644 index 0000000000..6806bb8a8a --- /dev/null +++ b/target/linux/uml/patches-5.15/102-pseudo-random-mac.patch @@ -0,0 +1,151 @@ +=============================================================================== + +This patch makes MAC addresses of network interfaces predictable. In +particular, it adds a small routine that computes MAC addresses of based on +a SHA1 hash of the virtual machine name and interface ID. + +TECHNICAL INFORMATION: + +Applies to vanilla kernel 3.9.4. + +=============================================================================== +--- a/arch/um/drivers/Kconfig ++++ b/arch/um/drivers/Kconfig +@@ -136,6 +136,20 @@ config UML_NET + enable at least one of the following transport options to actually + make use of UML networking. + ++config UML_NET_DETERMINISTIC_MAC ++ bool "Use deterministic MAC addresses for network interfaces" ++ default y ++ depends on UML_NET ++ select CRYPTO_SHA1 ++ help ++ Virtual network devices inside a User-Mode Linux instance must be ++ assigned a MAC (Ethernet) address. If none is specified on the UML ++ command line, one must be automatically computed. If this option is ++ enabled, a randomly generated address is used. Otherwise, if this ++ option is disabled, the address is generated from a SHA1 hash of ++ the umid of the UML instance and the interface name. The latter choice ++ is useful to make MAC addresses predictable. ++ + config UML_NET_ETHERTAP + bool "Ethertap transport (obsolete)" + depends on UML_NET +--- a/arch/um/drivers/net_kern.c ++++ b/arch/um/drivers/net_kern.c +@@ -25,6 +25,14 @@ + #include + #include + ++#include ++#include ++#include ++#include ++#include ++#include ++#include "os.h" ++ + #define DRIVER_NAME "uml-netdev" + + static DEFINE_SPINLOCK(opened_lock); +@@ -274,9 +282,55 @@ static const struct ethtool_ops uml_net_ + .get_ts_info = ethtool_op_get_ts_info, + }; + ++#ifdef CONFIG_UML_NET_DETERMINISTIC_MAC ++ ++/* Compute a SHA1 hash of the UML instance's id and ++ * * an interface name. */ ++static int compute_hash(const char *umid, const char *ifname, char *hash) ++{ ++ struct ahash_request *desc = NULL; ++ struct crypto_ahash *tfm = NULL; ++ struct scatterlist sg; ++ char *vmif = NULL; ++ int ret = -ENOMEM; ++ ++ vmif = kmalloc(1024, GFP_KERNEL); ++ if (!vmif) ++ goto out; ++ ++ strcpy (vmif, umid); ++ strcat (vmif, ifname); ++ ++ tfm = crypto_alloc_ahash("sha1", 0, CRYPTO_ALG_ASYNC); ++ if (IS_ERR(tfm)) ++ goto out; ++ ++ desc = ahash_request_alloc(tfm, GFP_KERNEL); ++ if (!desc) ++ goto out; ++ ++ crypto_ahash_clear_flags(tfm, ~0); ++ ++ sg_init_table(&sg, 1); ++ sg_set_buf(&sg, vmif, strlen(vmif)); ++ ++ ahash_request_set_crypt(desc, &sg, hash, strlen(vmif)); ++ ++ ret = crypto_ahash_digest(desc); ++out: ++ crypto_free_ahash(tfm); ++ ahash_request_free(desc); ++ kfree(vmif); ++ ++ return ret; ++} ++ ++#endif ++ + void uml_net_setup_etheraddr(struct net_device *dev, char *str) + { + unsigned char *addr = dev->dev_addr; ++ u8 hash[SHA1_DIGEST_SIZE]; + char *end; + int i; + +@@ -319,9 +373,26 @@ void uml_net_setup_etheraddr(struct net_ + return; + + random: ++#ifndef CONFIG_UML_NET_DETERMINISTIC_MAC + printk(KERN_INFO + "Choosing a random ethernet address for device %s\n", dev->name); + eth_hw_addr_random(dev); ++#else ++ printk(KERN_INFO ++ "Computing a digest to use as ethernet address for device %s\n", dev->name); ++ if (compute_hash(get_umid(), dev->name, hash) < 0) { ++ printk(KERN_WARNING ++ "Could not compute digest to use as ethernet address for device %s. " ++ "Using random address instead.\n", dev->name); ++ random_ether_addr(addr); ++ } ++ else { ++ for (i=0; i < 6; i++) ++ addr[i] = (hash[i] + hash[i+6]) % 0x100; ++ } ++ addr [0] &= 0xfe; /* clear multicast bit */ ++ addr [0] |= 0x02; /* set local assignment bit (IEEE802) */ ++#endif + } + + static DEFINE_SPINLOCK(devices_lock); +--- a/kernel/umh.c ++++ b/kernel/umh.c +@@ -356,12 +356,12 @@ static void helper_unlock(void) + } + + int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info, +- struct file **filp) ++ struct file **filp) + { + struct file *f[2]; + + if (create_pipe_files(f, 0) < 0) +- return PTR_ERR(f); ++ return PTR_ERR(f); + + sub_info->stdout = f[1]; + *filp = f[0]; diff --git a/target/linux/uml/patches-5.15/104-um-increase-default-virtual-physical-memory-to-64.patch b/target/linux/uml/patches-5.15/104-um-increase-default-virtual-physical-memory-to-64.patch new file mode 100644 index 0000000000..8bc17b07a6 --- /dev/null +++ b/target/linux/uml/patches-5.15/104-um-increase-default-virtual-physical-memory-to-64.patch @@ -0,0 +1,40 @@ +From d7936f11aded13f03871c0d6502d611d6a1e2dc5 Mon Sep 17 00:00:00 2001 +Message-Id: +In-Reply-To: <53b5c5f559cc95fc676cb4cc9e5a8d9f0cb8f58c.1659815468.git.chunkeey@gmail.com> +References: <53b5c5f559cc95fc676cb4cc9e5a8d9f0cb8f58c.1659815468.git.chunkeey@gmail.com> +From: Christian Lamparter +Date: Sat, 6 Aug 2022 19:27:20 +0200 +Subject: [PATCH v1 2/2] um: increase default virtual physical memory to 64 MiB +To: linux-um@lists.infradead.org +Cc: Richard Weinberger , + Anton Ivanov , + Johannes Berg + +The current 32 MiB of RAM causes OOMs to appear shortly after +booting in a minimal libreCMC 22.03 configuration with a +5.10.134 kernel. + +Of course, passing a "mem=64M" (from the --help text) parameter +works too, but it produces the following (info) message: + +| [ 0.000000] Unknown kernel command line parameters "mem=64M", will be passed to user space. + +That's why, I think it would be nicer, if this is working out +of the box again :). + +Signed-off-by: Christian Lamparter +--- + arch/um/kernel/um_arch.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/um/kernel/um_arch.c ++++ b/arch/um/kernel/um_arch.c +@@ -131,7 +131,7 @@ static int have_root __initdata; + static int have_console __initdata; + + /* Set in uml_mem_setup and modified in linux_main */ +-long long physmem_size = 32 * 1024 * 1024; ++long long physmem_size = 64 * 1024 * 1024; + EXPORT_SYMBOL(physmem_size); + + static const char *usage_string = diff --git a/target/linux/x86/64/config-5.10 b/target/linux/x86/64/config-5.10 deleted file mode 100644 index eb0b08c477..0000000000 --- a/target/linux/x86/64/config-5.10 +++ /dev/null @@ -1,493 +0,0 @@ -CONFIG_64BIT=y -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -CONFIG_ACPI_BATTERY=y -# CONFIG_ACPI_BGRT is not set -CONFIG_ACPI_BUTTON=y -# CONFIG_ACPI_CMPC is not set -CONFIG_ACPI_CONTAINER=y -CONFIG_ACPI_CPPC_LIB=y -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -CONFIG_ACPI_FAN=y -CONFIG_ACPI_HOTPLUG_CPU=y -CONFIG_ACPI_HOTPLUG_IOAPIC=y -# CONFIG_ACPI_I2C_OPREGION is not set -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -CONFIG_ACPI_LPIT=y -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -# CONFIG_ACPI_TAD is not set -CONFIG_ACPI_THERMAL=y -CONFIG_ACPI_VIDEO=y -# CONFIG_ACPI_WMI is not set -# CONFIG_ACRN_GUEST is not set -CONFIG_AGP=y -# CONFIG_AGP_AMD64 is not set -CONFIG_AGP_INTEL=y -# CONFIG_AGP_SIS is not set -# CONFIG_AGP_VIA is not set -CONFIG_ARCH_CPUIDLE_HALTPOLL=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -CONFIG_ARCH_MMAP_RND_BITS=28 -CONFIG_ARCH_MMAP_RND_BITS_MAX=32 -CONFIG_ARCH_MMAP_RND_BITS_MIN=28 -CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_WANTS_THP_SWAP=y -CONFIG_AUDIT_ARCH=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BALLOON_COMPACTION=y -CONFIG_BLK_DEV_INTEGRITY=y -CONFIG_BLK_DEV_INTEGRITY_T10=y -CONFIG_BLK_DEV_NVME=y -CONFIG_BLK_DEV_SR=y -CONFIG_BLK_MQ_VIRTIO=y -CONFIG_BLK_PM=y -# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set -CONFIG_BTT=y -CONFIG_CDROM=y -CONFIG_CONNECTOR=y -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y -CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y -# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set -CONFIG_CPU_RMAP=y -CONFIG_CRC_T10DIF=y -CONFIG_CRYPTO_AES_NI_INTEL=y -CONFIG_CRYPTO_BLAKE2S_X86=y -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -CONFIG_CRYPTO_CRCT10DIF=y -# CONFIG_CRYPTO_CRCT10DIF_PCLMUL is not set -CONFIG_CRYPTO_CRYPTD=y -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -CONFIG_CRYPTO_ECB=y -CONFIG_CRYPTO_GLUE_HELPER_X86=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -CONFIG_CRYPTO_LRW=y -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SHA1_SSSE3 is not set -# CONFIG_CRYPTO_SHA256_SSSE3 is not set -# CONFIG_CRYPTO_SHA512_SSSE3 is not set -CONFIG_CRYPTO_SIMD=y -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -CONFIG_CRYPTO_XTS=y -# CONFIG_DEBUG_HOTPLUG_CPU0 is not set -CONFIG_DMA_ACPI=y -CONFIG_DMA_OPS=y -CONFIG_DMA_SHARED_BUFFER=y -CONFIG_DRM=y -CONFIG_DRM_BOCHS=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=100 -CONFIG_DRM_GEM_SHMEM_HELPER=y -CONFIG_DRM_I915=y -CONFIG_DRM_I915_CAPTURE_ERROR=y -CONFIG_DRM_I915_COMPRESS_ERROR=y -# CONFIG_DRM_I915_DEBUG is not set -# CONFIG_DRM_I915_DEBUG_GUC is not set -# CONFIG_DRM_I915_DEBUG_MMIO is not set -# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set -# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set -CONFIG_DRM_I915_FENCE_TIMEOUT=10000 -CONFIG_DRM_I915_FORCE_PROBE="" -CONFIG_DRM_I915_GVT=y -CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 -# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set -CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 -CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 -# CONFIG_DRM_I915_SELFTEST is not set -CONFIG_DRM_I915_STOP_TIMEOUT=100 -# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set -# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set -CONFIG_DRM_I915_TIMESLICE_DURATION=1 -CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 -CONFIG_DRM_I915_USERPTR=y -# CONFIG_DRM_I915_WERROR is not set -CONFIG_DRM_KMS_FB_HELPER=y -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_MIPI_DSI=y -CONFIG_DRM_PANEL=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_DMA_PAGE_POOL=y -CONFIG_DRM_TTM_HELPER=y -CONFIG_DRM_VIRTIO_GPU=y -CONFIG_DRM_VRAM_HELPER=y -CONFIG_EFI=y -CONFIG_EFIVAR_FS=m -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_CUSTOM_SSDT_OVERLAYS is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -CONFIG_EFI_EARLYCON=y -CONFIG_EFI_ESRT=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y -# CONFIG_EFI_MIXED is not set -# CONFIG_EFI_PGT_DUMP is not set -# CONFIG_EFI_RCI2_TABLE is not set -CONFIG_EFI_RUNTIME_MAP=y -CONFIG_EFI_RUNTIME_WRAPPERS=y -CONFIG_EFI_STUB=y -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_VARS is not set -CONFIG_FAILOVER=y -CONFIG_FB=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_CMDLINE=y -CONFIG_FB_DEFERRED_IO=y -CONFIG_FB_EFI=y -CONFIG_FB_HYPERV=y -CONFIG_FB_MODE_HELPERS=y -CONFIG_FB_SIMPLE=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_SYS_IMAGEBLIT=y -CONFIG_FB_TILEBLITTING=y -# CONFIG_FB_VESA is not set -CONFIG_FONT_8x16=y -CONFIG_FONT_8x8=y -CONFIG_FONT_SUPPORT=y -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -CONFIG_FREEZER=y -CONFIG_FUSION_SAS=y -CONFIG_FW_CACHE=y -CONFIG_GART_IOMMU=y -CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y -CONFIG_GENERIC_CPU=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_GENERIC_PENDING_IRQ=y -CONFIG_GPIOLIB=y -CONFIG_GPIO_ACPI=y -CONFIG_GPIO_ICH=y -CONFIG_GPIO_SCH=y -CONFIG_HALTPOLL_CPUIDLE=y -CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y -CONFIG_HDMI=y -CONFIG_HIBERNATE_CALLBACKS=y -CONFIG_HID_BATTERY_STRENGTH=y -CONFIG_HID_GENERIC=y -CONFIG_HID_HYPERV_MOUSE=y -CONFIG_HOTPLUG_CPU=y -CONFIG_HOTPLUG_PCI=y -CONFIG_HOTPLUG_PCI_ACPI=y -# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set -# CONFIG_HOTPLUG_PCI_CPCI is not set -# CONFIG_HOTPLUG_PCI_PCIE is not set -# CONFIG_HOTPLUG_PCI_SHPC is not set -CONFIG_HOTPLUG_SMT=y -CONFIG_HPET=y -CONFIG_HPET_MMAP=y -# CONFIG_HP_ACCEL is not set -CONFIG_HVC_DRIVER=y -CONFIG_HVC_IRQ=y -CONFIG_HVC_XEN=y -CONFIG_HVC_XEN_FRONTEND=y -CONFIG_HWMON=y -CONFIG_HWMON_VID=y -CONFIG_HW_RANDOM_AMD=y -CONFIG_HW_RANDOM_INTEL=y -CONFIG_HW_RANDOM_VIRTIO=y -CONFIG_HYPERV=y -CONFIG_HYPERVISOR_GUEST=y -CONFIG_HYPERV_BALLOON=y -CONFIG_HYPERV_KEYBOARD=y -CONFIG_HYPERV_NET=y -CONFIG_HYPERV_STORAGE=y -# CONFIG_HYPERV_TESTING is not set -CONFIG_HYPERV_TIMER=y -CONFIG_HYPERV_UTILS=y -# CONFIG_HYPERV_VSOCKETS is not set -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_MULTI_INSTANTIATE is not set -# CONFIG_IA32_EMULATION is not set -CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 -# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set -CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y -CONFIG_INTEL_GTT=y -CONFIG_INTEL_IDLE=y -# CONFIG_INTEL_IDXD is not set -# CONFIG_INTEL_IPS is not set -# CONFIG_INTEL_MEI_HDCP is not set -# CONFIG_INTEL_MENLOW is not set -CONFIG_INTEL_PCH_THERMAL=y -# CONFIG_INTEL_SCU_PLATFORM is not set -CONFIG_INTEL_SOC_DTS_IOSF_CORE=y -CONFIG_INTEL_SOC_DTS_THERMAL=y -# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set -# CONFIG_INTEL_TURBO_MAX_3 is not set -# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set -CONFIG_INTERVAL_TREE=y -# CONFIG_IOMMU_DEBUG is not set -CONFIG_IOMMU_HELPER=y -CONFIG_IOSF_MBI=y -# CONFIG_IOSF_MBI_DEBUG is not set -# CONFIG_ISCSI_IBFT is not set -CONFIG_ISO9660_FS=y -CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y -CONFIG_KCMP=y -CONFIG_KVM_GUEST=y -CONFIG_LEDS_GPIO=y -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set -CONFIG_LEGACY_VSYSCALL_NONE=y -# CONFIG_LEGACY_VSYSCALL_XONLY is not set -CONFIG_LIBNVDIMM=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_LPC_ICH=y -CONFIG_LPC_SCH=y -CONFIG_MAILBOX=y -# CONFIG_MAXSMP is not set -CONFIG_MEMORY_BALLOON=y -CONFIG_MEMREGION=y -CONFIG_MFD_CORE=y -# CONFIG_MFD_INTEL_LPSS_ACPI is not set -# CONFIG_MFD_INTEL_PMC_BXT is not set -CONFIG_MMC=y -CONFIG_MMC_BLOCK=y -CONFIG_MMC_CQHCI=y -CONFIG_MMC_RICOH_MMC=y -CONFIG_MMC_SDHCI=y -CONFIG_MMC_SDHCI_ACPI=y -CONFIG_MMC_SDHCI_IO_ACCESSORS=y -CONFIG_MMC_SDHCI_PCI=y -# CONFIG_MMC_SDHCI_PLTFM is not set -# CONFIG_MMC_WBSD is not set -CONFIG_MMU_NOTIFIER=y -CONFIG_MODULES_USE_ELF_RELA=y -# CONFIG_MPSC is not set -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_ND_BLK=y -CONFIG_ND_BTT=y -CONFIG_ND_CLAIM=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_NET_FAILOVER=y -CONFIG_NET_FLOW_LIMIT=y -# CONFIG_NITRO_ENCLAVES is not set -CONFIG_NR_CPUS=512 -CONFIG_NR_CPUS_DEFAULT=512 -CONFIG_NR_CPUS_RANGE_BEGIN=2 -CONFIG_NR_CPUS_RANGE_END=512 -CONFIG_NVME_CORE=y -# CONFIG_NVME_HWMON is not set -CONFIG_NVME_MULTIPATH=y -# CONFIG_NVME_TCP is not set -CONFIG_OUTPUT_FORMAT="elf64-x86-64" -CONFIG_PADATA=y -CONFIG_PAGE_POOL=y -CONFIG_PAGE_REPORTING=y -CONFIG_PAGE_TABLE_ISOLATION=y -CONFIG_PARAVIRT=y -CONFIG_PARAVIRT_CLOCK=y -# CONFIG_PARAVIRT_DEBUG is not set -CONFIG_PARAVIRT_SPINLOCKS=y -CONFIG_PARAVIRT_XXL=y -CONFIG_PATA_AMD=y -CONFIG_PATA_ATIIXP=y -CONFIG_PATA_MPIIX=y -CONFIG_PATA_OLDPIIX=y -CONFIG_PATA_PLATFORM=y -CONFIG_PATA_TIMINGS=y -CONFIG_PATA_VIA=y -CONFIG_PCC=y -# CONFIG_PCENGINES_APU2 is not set -CONFIG_PCIEAER=y -CONFIG_PCIEPORTBUS=y -CONFIG_PCIE_PME=y -CONFIG_PCI_HYPERV=y -CONFIG_PCI_HYPERV_INTERFACE=y -# CONFIG_PCI_MMCONFIG is not set -CONFIG_PCI_XEN=y -CONFIG_PGTABLE_LEVELS=4 -CONFIG_PHYSICAL_ALIGN=0x1000000 -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_PINCTRL=y -# CONFIG_PINCTRL_BAYTRAIL is not set -# CONFIG_PINCTRL_BROXTON is not set -# CONFIG_PINCTRL_CANNONLAKE is not set -# CONFIG_PINCTRL_CHERRYVIEW is not set -# CONFIG_PINCTRL_DENVERTON is not set -# CONFIG_PINCTRL_EMMITSBURG is not set -# CONFIG_PINCTRL_GEMINILAKE is not set -# CONFIG_PINCTRL_JASPERLAKE is not set -# CONFIG_PINCTRL_LEWISBURG is not set -# CONFIG_PINCTRL_LYNXPOINT is not set -# CONFIG_PINCTRL_SUNRISEPOINT is not set -# CONFIG_PINCTRL_TIGERLAKE is not set -CONFIG_PM=y -# CONFIG_PMIC_OPREGION is not set -CONFIG_PM_CLK=y -CONFIG_PM_SLEEP=y -CONFIG_PM_SLEEP_SMP=y -CONFIG_PNP=y -CONFIG_PNPACPI=y -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_PROC_EVENTS=y -CONFIG_PVH=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_RAS=y -CONFIG_RELAY=y -CONFIG_RELOCATABLE=y -CONFIG_RESET_ATTACK_MITIGATION=y -CONFIG_RFS_ACCEL=y -CONFIG_RPS=y -CONFIG_RTC_I2C_AND_SPI=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SATA_AHCI=y -CONFIG_SCHED_MC=y -CONFIG_SCHED_MC_PRIO=y -CONFIG_SCHED_SMT=y -CONFIG_SCSI_VIRTIO=y -# CONFIG_SENSORS_AMD_ENERGY is not set -CONFIG_SENSORS_CORETEMP=y -CONFIG_SENSORS_FAM15H_POWER=y -CONFIG_SENSORS_I5500=y -CONFIG_SENSORS_K10TEMP=y -CONFIG_SENSORS_K8TEMP=y -CONFIG_SENSORS_VIA_CPUTEMP=y -CONFIG_SERIAL_8250_PNP=y -CONFIG_SERIAL_MCTRL_GPIO=y -CONFIG_SMP=y -CONFIG_SPARSEMEM=y -CONFIG_SPARSEMEM_EXTREME=y -CONFIG_SPARSEMEM_MANUAL=y -# CONFIG_SPARSEMEM_VMEMMAP is not set -CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -CONFIG_STACK_VALIDATION=y -# CONFIG_SURFACE_3_POWER_OPREGION is not set -# CONFIG_SURFACE_PRO3_BUTTON is not set -CONFIG_SWIOTLB=y -CONFIG_SWIOTLB_XEN=y -CONFIG_SYNC_FILE=y -# CONFIG_SYSTEM76_ACPI is not set -CONFIG_SYS_HYPERVISOR=y -CONFIG_THERMAL_GOV_USER_SPACE=y -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_WRITABLE_TRIPS=y -# CONFIG_TOSHIBA_BT_RFKILL is not set -CONFIG_TREE_RCU=y -CONFIG_TREE_SRCU=y -# CONFIG_UCLAMP_TASK is not set -CONFIG_UCS2_STRING=y -# CONFIG_UNWINDER_ORC is not set -CONFIG_USB_STORAGE=y -CONFIG_VIRTIO=y -CONFIG_VIRTIO_BALLOON=y -CONFIG_VIRTIO_BLK=y -CONFIG_VIRTIO_CONSOLE=y -CONFIG_VIRTIO_DMA_SHARED_BUFFER=y -CONFIG_VIRTIO_MMIO=y -CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y -CONFIG_VIRTIO_NET=y -CONFIG_VIRTIO_PCI=y -CONFIG_VIRTIO_PCI_LEGACY=y -# CONFIG_VIRTIO_PMEM is not set -# CONFIG_VIRTIO_VSOCKETS is not set -CONFIG_VIRTIO_VSOCKETS_COMMON=y -CONFIG_VIRT_DRIVERS=y -CONFIG_VMAP_PFN=y -CONFIG_VMAP_STACK=y -# CONFIG_VMD is not set -CONFIG_VMWARE_BALLOON=y -CONFIG_VMWARE_PVSCSI=y -CONFIG_VMWARE_VMCI=y -CONFIG_VMWARE_VMCI_VSOCKETS=y -CONFIG_VMXNET3=y -CONFIG_VSOCKETS=y -CONFIG_VSOCKETS_LOOPBACK=y -CONFIG_VT_CONSOLE_SLEEP=y -CONFIG_WATCHDOG_CORE=y -# CONFIG_X86_5LEVEL is not set -CONFIG_X86_64=y -CONFIG_X86_64_SMP=y -CONFIG_X86_ACPI_CPUFREQ=y -# CONFIG_X86_ACPI_CPUFREQ_CPB is not set -CONFIG_X86_AMD_FREQ_SENSITIVITY=y -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -CONFIG_X86_CPUID=y -CONFIG_X86_DIRECT_GBPAGES=y -CONFIG_X86_HV_CALLBACK_VECTOR=y -CONFIG_X86_INTEL_LPSS=y -# CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set -CONFIG_X86_INTEL_PSTATE=y -CONFIG_X86_MINIMUM_CPU_FAMILY=64 -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PKG_TEMP_THERMAL=y -# CONFIG_X86_PMEM_LEGACY is not set -CONFIG_X86_PM_TIMER=y -# CONFIG_X86_POWERNOW_K8 is not set -# CONFIG_X86_VSYSCALL_EMULATION is not set -CONFIG_X86_X2APIC=y -# CONFIG_X86_X32 is not set -CONFIG_XEN=y -CONFIG_XENFS=y -CONFIG_XEN_512GB=y -CONFIG_XEN_ACPI=y -CONFIG_XEN_ACPI_PROCESSOR=y -CONFIG_XEN_AUTO_XLATE=y -# CONFIG_XEN_BACKEND is not set -CONFIG_XEN_BALLOON=y -CONFIG_XEN_BLKDEV_FRONTEND=y -CONFIG_XEN_COMPAT_XENFS=y -CONFIG_XEN_DEBUG_FS=y -CONFIG_XEN_DEV_EVTCHN=y -CONFIG_XEN_DOM0=y -CONFIG_XEN_EFI=y -CONFIG_XEN_FBDEV_FRONTEND=y -CONFIG_XEN_GNTDEV=y -CONFIG_XEN_GRANT_DEV_ALLOC=y -CONFIG_XEN_HAVE_PVMMU=y -CONFIG_XEN_HAVE_VPMU=y -# CONFIG_XEN_MCE_LOG is not set -CONFIG_XEN_NETDEV_FRONTEND=y -CONFIG_XEN_PCIDEV_FRONTEND=y -CONFIG_XEN_PRIVCMD=y -CONFIG_XEN_PV=y -CONFIG_XEN_PVH=y -CONFIG_XEN_PVHVM=y -CONFIG_XEN_PVHVM_SMP=y -CONFIG_XEN_PV_SMP=y -CONFIG_XEN_SAVE_RESTORE=y -CONFIG_XEN_SCSI_FRONTEND=y -CONFIG_XEN_SYMS=y -CONFIG_XEN_SYS_HYPERVISOR=y -CONFIG_XEN_WDT=y -CONFIG_XEN_XENBUS_FRONTEND=y -CONFIG_XPS=y -CONFIG_ZLIB_DEFLATE=y -CONFIG_ZONE_DMA32=y diff --git a/target/linux/x86/64/config-5.15 b/target/linux/x86/64/config-5.15 new file mode 100644 index 0000000000..5aa160c55d --- /dev/null +++ b/target/linux/x86/64/config-5.15 @@ -0,0 +1,545 @@ +CONFIG_64BIT=y +CONFIG_ACPI=y +CONFIG_ACPI_AC=y +CONFIG_ACPI_BATTERY=y +# CONFIG_ACPI_BGRT is not set +CONFIG_ACPI_BUTTON=y +# CONFIG_ACPI_CMPC is not set +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_CPPC_LIB=y +CONFIG_ACPI_CPU_FREQ_PSS=y +# CONFIG_ACPI_DEBUG is not set +# CONFIG_ACPI_DEBUGGER is not set +# CONFIG_ACPI_DOCK is not set +# CONFIG_ACPI_DPTF is not set +# CONFIG_ACPI_EC_DEBUGFS is not set +CONFIG_ACPI_FAN=y +# CONFIG_ACPI_FPDT is not set +CONFIG_ACPI_HOTPLUG_CPU=y +CONFIG_ACPI_HOTPLUG_IOAPIC=y +# CONFIG_ACPI_I2C_OPREGION is not set +CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y +CONFIG_ACPI_LPIT=y +# CONFIG_ACPI_PCI_SLOT is not set +CONFIG_ACPI_PRMT=y +CONFIG_ACPI_PROCESSOR=y +# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set +CONFIG_ACPI_PROCESSOR_CSTATE=y +CONFIG_ACPI_PROCESSOR_IDLE=y +CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y +# CONFIG_ACPI_SBS is not set +CONFIG_ACPI_SPCR_TABLE=y +CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y +# CONFIG_ACPI_TAD is not set +CONFIG_ACPI_THERMAL=y +CONFIG_ACPI_VIDEO=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACRN_GUEST is not set +# CONFIG_ADV_SWBUTTON is not set +CONFIG_AGP=y +# CONFIG_AGP_AMD64 is not set +CONFIG_AGP_INTEL=y +# CONFIG_AGP_SIS is not set +# CONFIG_AGP_VIA is not set +CONFIG_AMD_IOMMU=y +CONFIG_AMD_IOMMU_V2=y +# CONFIG_AMD_PMC is not set +# CONFIG_AMD_PTDMA is not set +# CONFIG_AMD_SFH_HID is not set +CONFIG_ARCH_CPUIDLE_HALTPOLL=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y +CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_ARCH_MMAP_RND_BITS_MAX=32 +CONFIG_ARCH_MMAP_RND_BITS_MIN=28 +CONFIG_ARCH_NR_GPIO=1024 +CONFIG_ARCH_SPARSEMEM_DEFAULT=y +CONFIG_ARCH_WANTS_THP_SWAP=y +CONFIG_AUDIT_ARCH=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BALLOON_COMPACTION=y +CONFIG_BLK_DEV_BSGLIB=y +CONFIG_BLK_DEV_BSG_COMMON=y +CONFIG_BLK_DEV_INTEGRITY=y +CONFIG_BLK_DEV_INTEGRITY_T10=y +CONFIG_BLK_DEV_NVME=y +CONFIG_BLK_DEV_SR=y +CONFIG_BLK_MQ_VIRTIO=y +CONFIG_BLK_PM=y +# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set +CONFIG_BTT=y +CONFIG_CDROM=y +CONFIG_CONNECTOR=y +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y +# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set +CONFIG_CPU_RMAP=y +CONFIG_CRC_T10DIF=y +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +CONFIG_CRYPTO_BLAKE2S_X86=y +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +CONFIG_CRYPTO_CRCT10DIF=y +# CONFIG_CRYPTO_CRCT10DIF_PCLMUL is not set +CONFIG_CRYPTO_CRYPTD=y +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +CONFIG_CRYPTO_LRW=y +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SHA1_SSSE3 is not set +# CONFIG_CRYPTO_SHA256_SSSE3 is not set +# CONFIG_CRYPTO_SHA512_SSSE3 is not set +CONFIG_CRYPTO_SIMD=y +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +CONFIG_CRYPTO_XTS=y +# CONFIG_DEBUG_HOTPLUG_CPU0 is not set +CONFIG_DMA_ACPI=y +CONFIG_DMA_OPS=y +CONFIG_DMA_SHARED_BUFFER=y +CONFIG_DRM=y +CONFIG_DRM_BOCHS=y +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=100 +CONFIG_DRM_GEM_SHMEM_HELPER=y +# CONFIG_DRM_HYPERV is not set +CONFIG_DRM_I915=y +CONFIG_DRM_I915_CAPTURE_ERROR=y +CONFIG_DRM_I915_COMPRESS_ERROR=y +# CONFIG_DRM_I915_DEBUG is not set +# CONFIG_DRM_I915_DEBUG_GUC is not set +# CONFIG_DRM_I915_DEBUG_MMIO is not set +# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set +# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set +CONFIG_DRM_I915_FENCE_TIMEOUT=10000 +CONFIG_DRM_I915_FORCE_PROBE="" +CONFIG_DRM_I915_GVT=y +CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 +# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set +CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 +CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 +CONFIG_DRM_I915_REQUEST_TIMEOUT=20000 +# CONFIG_DRM_I915_SELFTEST is not set +CONFIG_DRM_I915_STOP_TIMEOUT=100 +# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set +# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set +CONFIG_DRM_I915_TIMESLICE_DURATION=1 +CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 +CONFIG_DRM_I915_USERPTR=y +# CONFIG_DRM_I915_WERROR is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_MIPI_DSI=y +CONFIG_DRM_PANEL=y +CONFIG_DRM_PANEL_BRIDGE=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_DRM_TTM=y +CONFIG_DRM_TTM_HELPER=y +CONFIG_DRM_VIRTIO_GPU=y +CONFIG_DRM_VRAM_HELPER=y +CONFIG_EFI=y +CONFIG_EFIVAR_FS=m +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_CUSTOM_SSDT_OVERLAYS is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_EARLYCON=y +CONFIG_EFI_ESRT=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y +# CONFIG_EFI_MIXED is not set +# CONFIG_EFI_PGT_DUMP is not set +# CONFIG_EFI_RCI2_TABLE is not set +CONFIG_EFI_RUNTIME_MAP=y +CONFIG_EFI_RUNTIME_WRAPPERS=y +CONFIG_EFI_STUB=y +# CONFIG_EFI_TEST is not set +# CONFIG_EFI_VARS is not set +CONFIG_FAILOVER=y +CONFIG_FB=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_CMDLINE=y +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_EFI=y +CONFIG_FB_HYPERV=y +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_SIMPLE=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_FOPS=y +CONFIG_FB_SYS_IMAGEBLIT=y +CONFIG_FB_TILEBLITTING=y +# CONFIG_FB_VESA is not set +CONFIG_FONT_8x16=y +CONFIG_FONT_8x8=y +CONFIG_FONT_SUPPORT=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +CONFIG_FREEZER=y +CONFIG_FUSION_SAS=y +CONFIG_FW_CACHE=y +CONFIG_GART_IOMMU=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_CPU=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_GPIOLIB_IRQCHIP=y +CONFIG_GPIO_ACPI=y +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_ICH=y +CONFIG_GPIO_SCH=y +CONFIG_HALTPOLL_CPUIDLE=y +CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y +CONFIG_HDMI=y +CONFIG_HIBERNATE_CALLBACKS=y +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HID_GENERIC=y +CONFIG_HID_HYPERV_MOUSE=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HOTPLUG_PCI=y +CONFIG_HOTPLUG_PCI_ACPI=y +# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set +# CONFIG_HOTPLUG_PCI_CPCI is not set +# CONFIG_HOTPLUG_PCI_PCIE is not set +# CONFIG_HOTPLUG_PCI_SHPC is not set +CONFIG_HOTPLUG_SMT=y +CONFIG_HPET=y +CONFIG_HPET_MMAP=y +# CONFIG_HP_ACCEL is not set +CONFIG_HVC_DRIVER=y +CONFIG_HVC_IRQ=y +CONFIG_HVC_XEN=y +CONFIG_HVC_XEN_FRONTEND=y +CONFIG_HWMON=y +CONFIG_HWMON_VID=y +CONFIG_HW_RANDOM_AMD=y +CONFIG_HW_RANDOM_INTEL=y +CONFIG_HW_RANDOM_VIRTIO=y +CONFIG_HYPERV=y +CONFIG_HYPERVISOR_GUEST=y +CONFIG_HYPERV_BALLOON=y +CONFIG_HYPERV_IOMMU=y +CONFIG_HYPERV_KEYBOARD=y +CONFIG_HYPERV_NET=y +CONFIG_HYPERV_STORAGE=y +# CONFIG_HYPERV_TESTING is not set +CONFIG_HYPERV_TIMER=y +CONFIG_HYPERV_UTILS=y +# CONFIG_HYPERV_VSOCKETS is not set +CONFIG_I2C=y +CONFIG_I2C_ALGOBIT=y +# CONFIG_I2C_AMD_MP2 is not set +CONFIG_I2C_BOARDINFO=y +# CONFIG_I2C_HID_ACPI is not set +# CONFIG_I2C_MULTI_INSTANTIATE is not set +# CONFIG_I8K is not set +# CONFIG_IA32_EMULATION is not set +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set +CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y +CONFIG_INTEL_GTT=y +CONFIG_INTEL_IDLE=y +CONFIG_INTEL_IOMMU=y +# CONFIG_INTEL_IOMMU_DEFAULT_ON is not set +CONFIG_INTEL_IOMMU_FLOPPY_WA=y +# CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON is not set +# CONFIG_INTEL_IOMMU_SVM is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_MEI_HDCP is not set +# CONFIG_INTEL_MENLOW is not set +CONFIG_INTEL_PCH_THERMAL=y +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +CONFIG_INTEL_SOC_DTS_IOSF_CORE=y +CONFIG_INTEL_SOC_DTS_THERMAL=y +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_TXT is not set +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +CONFIG_INTERVAL_TREE=y +CONFIG_IOASID=y +CONFIG_IOMMU_API=y +# CONFIG_IOMMU_DEBUG is not set +# CONFIG_IOMMU_DEBUGFS is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_HELPER=y +CONFIG_IOMMU_IOVA=y +CONFIG_IOMMU_SUPPORT=y +CONFIG_IOSF_MBI=y +# CONFIG_IOSF_MBI_DEBUG is not set +CONFIG_IRQ_MSI_IOMMU=y +CONFIG_IRQ_REMAP=y +# CONFIG_ISCSI_IBFT is not set +CONFIG_ISO9660_FS=y +CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y +CONFIG_KCMP=y +CONFIG_KVM_GUEST=y +CONFIG_LEDS_GPIO=y +# CONFIG_LEGACY_VSYSCALL_EMULATE is not set +CONFIG_LEGACY_VSYSCALL_NONE=y +# CONFIG_LEGACY_VSYSCALL_XONLY is not set +CONFIG_LIBNVDIMM=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_LPC_ICH=y +CONFIG_LPC_SCH=y +CONFIG_MAILBOX=y +# CONFIG_MAXSMP is not set +CONFIG_MEMORY_BALLOON=y +CONFIG_MEMREGION=y +# CONFIG_MERAKI_MX100 is not set +CONFIG_MFD_CORE=y +# CONFIG_MFD_INTEL_LPSS_ACPI is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set +CONFIG_MMC=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_CQHCI=y +CONFIG_MMC_RICOH_MMC=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_ACPI=y +CONFIG_MMC_SDHCI_IO_ACCESSORS=y +CONFIG_MMC_SDHCI_PCI=y +# CONFIG_MMC_SDHCI_PLTFM is not set +# CONFIG_MMC_WBSD is not set +CONFIG_MMU_NOTIFIER=y +CONFIG_MODULES_USE_ELF_RELA=y +# CONFIG_MPSC is not set +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_ND_BLK=y +CONFIG_ND_BTT=y +CONFIG_ND_CLAIM=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NET_FAILOVER=y +CONFIG_NET_FLOW_LIMIT=y +CONFIG_NET_PTP_CLASSIFY=y +# CONFIG_NITRO_ENCLAVES is not set +CONFIG_NR_CPUS=512 +CONFIG_NR_CPUS_DEFAULT=64 +CONFIG_NR_CPUS_RANGE_BEGIN=2 +CONFIG_NR_CPUS_RANGE_END=512 +CONFIG_NVME_CORE=y +# CONFIG_NVME_HWMON is not set +CONFIG_NVME_MULTIPATH=y +CONFIG_OUTPUT_FORMAT="elf64-x86-64" +CONFIG_PADATA=y +CONFIG_PAGE_POOL=y +CONFIG_PAGE_REPORTING=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_PARAVIRT=y +CONFIG_PARAVIRT_CLOCK=y +# CONFIG_PARAVIRT_DEBUG is not set +CONFIG_PARAVIRT_SPINLOCKS=y +CONFIG_PARAVIRT_XXL=y +CONFIG_PATA_AMD=y +CONFIG_PATA_ATIIXP=y +CONFIG_PATA_MPIIX=y +CONFIG_PATA_OLDPIIX=y +CONFIG_PATA_PLATFORM=y +CONFIG_PATA_TIMINGS=y +CONFIG_PATA_VIA=y +CONFIG_PCC=y +# CONFIG_PCENGINES_APU2 is not set +CONFIG_PCIEAER=y +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_PERFORMANCE is not set +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +CONFIG_PCIEPORTBUS=y +CONFIG_PCIE_PME=y +CONFIG_PCI_HYPERV=y +CONFIG_PCI_HYPERV_INTERFACE=y +# CONFIG_PCI_MMCONFIG is not set +CONFIG_PCI_XEN=y +CONFIG_PGTABLE_LEVELS=4 +CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_ALDERLAKE=y +CONFIG_PINCTRL_BAYTRAIL=y +CONFIG_PINCTRL_BROXTON=y +CONFIG_PINCTRL_CANNONLAKE=y +CONFIG_PINCTRL_CHERRYVIEW=y +CONFIG_PINCTRL_DENVERTON=y +CONFIG_PINCTRL_ELKHARTLAKE=y +CONFIG_PINCTRL_EMMITSBURG=y +CONFIG_PINCTRL_GEMINILAKE=y +CONFIG_PINCTRL_INTEL=y +CONFIG_PINCTRL_JASPERLAKE=y +CONFIG_PINCTRL_LAKEFIELD=y +CONFIG_PINCTRL_LEWISBURG=y +CONFIG_PINCTRL_LYNXPOINT=y +CONFIG_PINCTRL_SUNRISEPOINT=y +CONFIG_PINCTRL_TIGERLAKE=y +CONFIG_PM=y +# CONFIG_PMIC_OPREGION is not set +CONFIG_PM_CLK=y +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_PNP=y +CONFIG_PNPACPI=y +CONFIG_PNP_DEBUG_MESSAGES=y +CONFIG_PPS=y +CONFIG_PROC_EVENTS=y +CONFIG_PTP_1588_CLOCK=y +CONFIG_PTP_1588_CLOCK_KVM=y +CONFIG_PTP_1588_CLOCK_VMW=y +CONFIG_PVH=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_RAS=y +CONFIG_RELAY=y +CONFIG_RELOCATABLE=y +CONFIG_RESET_ATTACK_MITIGATION=y +CONFIG_RFS_ACCEL=y +CONFIG_RPS=y +CONFIG_RTC_I2C_AND_SPI=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +# CONFIG_SAMSUNG_Q10 is not set +CONFIG_SATA_AHCI=y +# CONFIG_SCHED_CORE is not set +CONFIG_SCHED_MC=y +CONFIG_SCHED_MC_PRIO=y +CONFIG_SCHED_SMT=y +CONFIG_SCSI_SAS_ATTRS=y +CONFIG_SCSI_VIRTIO=y +CONFIG_SENSORS_CORETEMP=y +CONFIG_SENSORS_FAM15H_POWER=y +CONFIG_SENSORS_I5500=y +CONFIG_SENSORS_K10TEMP=y +CONFIG_SENSORS_K8TEMP=y +CONFIG_SENSORS_VIA_CPUTEMP=y +CONFIG_SERIAL_8250_PNP=y +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SLS=y +CONFIG_SMP=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_MANUAL=y +# CONFIG_SPARSEMEM_VMEMMAP is not set +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_STACK_VALIDATION=y +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_SWIOTLB=y +CONFIG_SWIOTLB_XEN=y +CONFIG_SYNC_FILE=y +# CONFIG_SYSTEM76_ACPI is not set +CONFIG_SYS_HYPERVISOR=y +CONFIG_THERMAL_GOV_USER_SPACE=y +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_WRITABLE_TRIPS=y +# CONFIG_TOSHIBA_BT_RFKILL is not set +CONFIG_TREE_RCU=y +CONFIG_TREE_SRCU=y +# CONFIG_UACCE is not set +# CONFIG_UCLAMP_TASK is not set +CONFIG_UCS2_STRING=y +# CONFIG_UNWINDER_ORC is not set +CONFIG_USB_STORAGE=y +CONFIG_VIRTIO=y +CONFIG_VIRTIO_BALLOON=y +CONFIG_VIRTIO_BLK=y +CONFIG_VIRTIO_CONSOLE=y +CONFIG_VIRTIO_DMA_SHARED_BUFFER=y +CONFIG_VIRTIO_MMIO=y +CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y +CONFIG_VIRTIO_NET=y +CONFIG_VIRTIO_PCI=y +CONFIG_VIRTIO_PCI_LEGACY=y +CONFIG_VIRTIO_PCI_LIB=y +# CONFIG_VIRTIO_PMEM is not set +# CONFIG_VIRTIO_VSOCKETS is not set +CONFIG_VIRTIO_VSOCKETS_COMMON=y +CONFIG_VIRT_DRIVERS=y +CONFIG_VMAP_PFN=y +CONFIG_VMAP_STACK=y +# CONFIG_VMD is not set +CONFIG_VMWARE_BALLOON=y +CONFIG_VMWARE_PVSCSI=y +CONFIG_VMWARE_VMCI=y +CONFIG_VMWARE_VMCI_VSOCKETS=y +CONFIG_VMXNET3=y +CONFIG_VSOCKETS=y +CONFIG_VSOCKETS_LOOPBACK=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_WATCHDOG_CORE=y +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_X86_5LEVEL is not set +CONFIG_X86_64=y +CONFIG_X86_64_SMP=y +CONFIG_X86_ACPI_CPUFREQ=y +# CONFIG_X86_ACPI_CPUFREQ_CPB is not set +CONFIG_X86_AMD_FREQ_SENSITIVITY=y +CONFIG_X86_AMD_PLATFORM_DEVICE=y +CONFIG_X86_CPUID=y +CONFIG_X86_DIRECT_GBPAGES=y +CONFIG_X86_HV_CALLBACK_VECTOR=y +CONFIG_X86_INTEL_LPSS=y +# CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set +CONFIG_X86_INTEL_PSTATE=y +CONFIG_X86_MINIMUM_CPU_FAMILY=64 +# CONFIG_X86_PCC_CPUFREQ is not set +CONFIG_X86_PKG_TEMP_THERMAL=y +# CONFIG_X86_PMEM_LEGACY is not set +CONFIG_X86_PM_TIMER=y +# CONFIG_X86_POWERNOW_K8 is not set +# CONFIG_X86_VSYSCALL_EMULATION is not set +CONFIG_X86_X2APIC=y +# CONFIG_X86_X32 is not set +CONFIG_XEN=y +CONFIG_XENFS=y +CONFIG_XEN_512GB=y +CONFIG_XEN_ACPI=y +CONFIG_XEN_ACPI_PROCESSOR=y +CONFIG_XEN_AUTO_XLATE=y +# CONFIG_XEN_BACKEND is not set +CONFIG_XEN_BALLOON=y +CONFIG_XEN_BLKDEV_FRONTEND=y +CONFIG_XEN_COMPAT_XENFS=y +CONFIG_XEN_DEBUG_FS=y +CONFIG_XEN_DEV_EVTCHN=y +CONFIG_XEN_DOM0=y +CONFIG_XEN_EFI=y +CONFIG_XEN_FBDEV_FRONTEND=y +CONFIG_XEN_GNTDEV=y +CONFIG_XEN_GRANT_DEV_ALLOC=y +CONFIG_XEN_HAVE_PVMMU=y +CONFIG_XEN_HAVE_VPMU=y +# CONFIG_XEN_MCE_LOG is not set +CONFIG_XEN_NETDEV_FRONTEND=y +CONFIG_XEN_PCIDEV_FRONTEND=y +CONFIG_XEN_PRIVCMD=y +CONFIG_XEN_PV=y +CONFIG_XEN_PVH=y +CONFIG_XEN_PVHVM=y +CONFIG_XEN_PVHVM_GUEST=y +CONFIG_XEN_PVHVM_SMP=y +CONFIG_XEN_PV_DOM0=y +CONFIG_XEN_PV_SMP=y +CONFIG_XEN_SAVE_RESTORE=y +CONFIG_XEN_SCSI_FRONTEND=y +CONFIG_XEN_SYMS=y +CONFIG_XEN_SYS_HYPERVISOR=y +CONFIG_XEN_WDT=y +CONFIG_XEN_XENBUS_FRONTEND=y +CONFIG_XPS=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_ZONE_DMA32=y diff --git a/target/linux/x86/Makefile b/target/linux/x86/Makefile index e42d87fbc9..5368a779e5 100644 --- a/target/linux/x86/Makefile +++ b/target/linux/x86/Makefile @@ -10,13 +10,16 @@ BOARDNAME:=x86 FEATURES:=squashfs ext4 vdi vmdk vhdx pcmcia targz fpu boot-part rootfs-part SUBTARGETS:=generic legacy geode 64 -KERNEL_PATCHVER:=5.10 +KERNEL_PATCHVER:=5.15 KERNELNAME:=bzImage include $(INCLUDE_DIR)/target.mk -DEFAULT_PACKAGES += partx-utils mkf2fs e2fsprogs kmod-button-hotplug +DEFAULT_PACKAGES += \ + partx-utils mkf2fs \ + e2fsprogs kmod-button-hotplug \ + grub2-bios-setup $(eval $(call BuildTarget)) diff --git a/target/linux/x86/base-files/etc/board.d/01_leds b/target/linux/x86/base-files/etc/board.d/01_leds index 42974d8290..efc5460df3 100644 --- a/target/linux/x86/base-files/etc/board.d/01_leds +++ b/target/linux/x86/base-files/etc/board.d/01_leds @@ -9,13 +9,20 @@ board_config_update case "$(board_name)" in cisco-mx100-hw) ucidef_set_led_usbport "usb" "USB" "mx100:green:usb" "1-1-port2" - ucidef_set_led_default "diag" "DIAG" "mx100:green:ha" "1" + ucidef_set_led_default "diag" "DIAG" "mx100:green:tricolor" "1" ;; -pc-engines-apu1|pc-engines-apu2|pc-engines-apu3) +pc-engines-apu1|pc-engines-apu2|pc-engines-apu3|pc-engines-apu4|pc-engines-apu5|pc-engines-apu6) ucidef_set_led_netdev "wan" "WAN" "apu:green:3" "eth0" ucidef_set_led_netdev "lan" "LAN" "apu:green:2" "br-lan" ucidef_set_led_default "diag" "DIAG" "apu:green:1" "1" ;; +sophos-sg-105wr1|sophos-sg-125wr1|sophos-sg-135wr1|sophos-xg-105wr1|sophos-xg-125wr1|sophos-xg-135wr1) + ucidef_set_led_netdev "wlan" "WiFi" "ath9k-phy0" "phy0tpt" + ;; +sophos-sg-105wr2|sophos-sg-125wr2|sophos-sg-135wr2|sophos-xg-105wr2|sophos-xg-125wr2|sophos-xg-135wr2|\ +sophos-sg-105wr3|sophos-sg-125wr3|sophos-sg-135wr3|sophos-xg-105wr3|sophos-xg-125wr3|sophos-xg-135wr3) + ucidef_set_led_netdev "wlan" "WiFi" "ath10k-phy0" "phy0tpt" + ;; traverse-technologies-geos) ucidef_set_led_netdev "lan" "LAN" "geos:1" "br-lan" "tx rx" ucidef_set_led_netdev "wlan" "WiFi" "geos:2" "phy0tpt" diff --git a/target/linux/x86/base-files/etc/board.d/02_network b/target/linux/x86/base-files/etc/board.d/02_network index e4451461db..e00e8c04dd 100644 --- a/target/linux/x86/base-files/etc/board.d/02_network +++ b/target/linux/x86/base-files/etc/board.d/02_network @@ -8,12 +8,38 @@ board_config_update case "$(board_name)" in +barracuda-networks-inc-barracuda-ng-firewall-f12) + ucidef_set_network_device_path "eth1" "pci0000:00/0000:00:14.0/0000:01:00.0" + ucidef_set_network_device_path "eth2" "pci0000:00/0000:00:14.1/0000:02:00.0" + ucidef_set_network_device_path "eth3" "pci0000:00/0000:00:13.0/0000:03:00.0" + ucidef_set_network_device_path "eth4" "pci0000:00/0000:00:13.1/0000:04:00.0" + ucidef_set_network_device_path "eth5" "pci0000:00/0000:00:13.2/0000:05:00.0" + ucidef_set_interfaces_lan_wan "eth2 eth3 eth4 eth5" "eth1" + ;; cisco-mx100-hw) - ucidef_set_interfaces_lan_wan "eth0 eth1 eth2 eth3 eth4 eth5 eth7 eth8 eth9 eth10 eth11" "eth6" + ucidef_set_network_device_path "mgmt" "pci0000:00/0000:00:01.2/0000:03:00.3" + ucidef_set_network_device_path "wan" "pci0000:00/0000:00:01.2/0000:03:00.2" + ucidef_set_network_device_path "eth2" "pci0000:00/0000:00:01.2/0000:03:00.1" + ucidef_set_network_device_path "eth3" "pci0000:00/0000:00:01.2/0000:03:00.0" + ucidef_set_network_device_path "eth4" "pci0000:00/0000:00:01.0/0000:01:00.2" + ucidef_set_network_device_path "eth5" "pci0000:00/0000:00:01.0/0000:01:00.1" + ucidef_set_network_device_path "eth6" "pci0000:00/0000:00:01.0/0000:01:00.4" + ucidef_set_network_device_path "eth7" "pci0000:00/0000:00:01.0/0000:01:00.3" + ucidef_set_network_device_path "eth8" "pci0000:00/0000:00:01.1/0000:02:00.1" + ucidef_set_network_device_path "eth9" "pci0000:00/0000:00:01.1/0000:02:00.0" + ucidef_set_network_device_path "eth10" "pci0000:00/0000:00:01.1/0000:02:00.3" + ucidef_set_network_device_path "eth11" "pci0000:00/0000:00:01.1/0000:02:00.2" + ucidef_set_interfaces_lan_wan "mgmt eth2 eth3 eth4 eth5 eth6 eth7 eth8 eth9 eth10 eth11" "wan" ;; pc-engines-apu1|pc-engines-apu2|pc-engines-apu3) ucidef_set_interfaces_lan_wan "eth1 eth2" "eth0" ;; +pc-engines-apu5) + ucidef_set_interfaces_lan_wan "eth1" "eth0" + ;; +pc-engines-apu4|pc-engines-apu6) + ucidef_set_interfaces_lan_wan "eth1 eth2 eth3" "eth0" + ;; roqos-roqos-core-rc10) ucidef_set_interfaces_lan_wan "eth1" "eth0" ;; @@ -38,6 +64,10 @@ sophos-sg-135r2|sophos-xg-135r2| \ sophos-sg-135wr2|sophos-xg-135wr2) ucidef_set_interfaces_lan_wan "eth0 eth2 eth3 eth4 eth5 eth6 eth7" "eth1" ;; +sophos-sg-135r3|sophos-xg-135r3| \ +sophos-sg-135wr3|sophos-xg-135wr3) + ucidef_set_interfaces_lan_wan "eth0 eth1 eth2 eth3 eth5 eth7 eth8" "eth6" + ;; traverse-technologies-geos) ucidef_set_interface_lan "eth0 eth1" ucidef_add_atm_bridge "0" "35" "llc" "bridged" diff --git a/target/linux/x86/base-files/lib/preinit/81_upgrade_bootloader b/target/linux/x86/base-files/lib/preinit/81_upgrade_bootloader deleted file mode 100644 index 42f04d76a7..0000000000 --- a/target/linux/x86/base-files/lib/preinit/81_upgrade_bootloader +++ /dev/null @@ -1,18 +0,0 @@ -upgrade_bootloader() { - local diskdev - - . /lib/upgrade/common.sh - - if [ ! -f /boot/grub/upgraded ] && export_bootdevice && export_partdevice diskdev 0; then - part_magic_efi "/dev/$diskdev" && return 0 - echo "(hd0) /dev/$diskdev" > /tmp/device.map - /usr/sbin/grub-bios-setup \ - -m "/tmp/device.map" \ - -d "/boot/grub" \ - -r "hd0,msdos1" \ - "/dev/$diskdev" \ - && touch /boot/grub/upgraded - fi -} - -[ "$INITRAMFS" = "1" ] || boot_hook_add preinit_main upgrade_bootloader diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh index d8f2eba97e..5dad7a538a 100644 --- a/target/linux/x86/base-files/lib/upgrade/platform.sh +++ b/target/linux/x86/base-files/lib/upgrade/platform.sh @@ -62,8 +62,7 @@ platform_do_bootloader_upgrade() { -m "/tmp/device.map" \ -d "/tmp/boot/boot/grub" \ -r "hd0,${parttable}1" \ - "/dev/$diskdev" \ - && touch /tmp/boot/boot/grub/upgraded + "/dev/$diskdev" umount /tmp/boot fi diff --git a/target/linux/x86/config-5.10 b/target/linux/x86/config-5.10 deleted file mode 100644 index 13a698d05d..0000000000 --- a/target/linux/x86/config-5.10 +++ /dev/null @@ -1,433 +0,0 @@ -# CONFIG_60XX_WDT is not set -# CONFIG_64BIT is not set -# CONFIG_ACPI is not set -# CONFIG_ACQUIRE_WDT is not set -# CONFIG_ADVANTECH_WDT is not set -# CONFIG_ALIM1535_WDT is not set -# CONFIG_ALIX is not set -CONFIG_AMD_NB=y -CONFIG_ARCH_32BIT_OFF_T=y -CONFIG_ARCH_CLOCKSOURCE_INIT=y -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -CONFIG_ARCH_MAY_HAVE_PC_FDC=y -CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y -CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y -CONFIG_ARCH_RANDOM=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_ARCH_SPLIT_ARG64=y -CONFIG_ARCH_STACKWALK=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_USES_PG_UNCACHED=y -CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y -CONFIG_ATA=y -CONFIG_ATA_GENERIC=y -CONFIG_ATA_PIIX=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_SD=y -CONFIG_BLK_MQ_PCI=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BOUNCE=y -CONFIG_CLKBLD_I8253=y -CONFIG_CLKDEV_LOOKUP=y -CONFIG_CLKEVT_I8253=y -CONFIG_CLKSRC_I8253=y -CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y -CONFIG_CLOCKSOURCE_WATCHDOG=y -CONFIG_CLONE_BACKWARDS=y -CONFIG_COMMON_CLK=y -CONFIG_COMPAT_32=y -CONFIG_COMPAT_32BIT_TIME=y -# CONFIG_COMPAT_VDSO is not set -CONFIG_CONSOLE_TRANSLATIONS=y -# CONFIG_CPU5_WDT is not set -CONFIG_CPU_FREQ=y -CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set -CONFIG_CPU_FREQ_GOV_ATTR_SET=y -CONFIG_CPU_FREQ_GOV_COMMON=y -# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set -CONFIG_CPU_FREQ_GOV_ONDEMAND=y -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_GOV_USERSPACE is not set -CONFIG_CPU_FREQ_STAT=y -CONFIG_CPU_IBPB_ENTRY=y -CONFIG_CPU_IBRS_ENTRY=y -# CONFIG_SLS is not set -CONFIG_CPU_IDLE=y -CONFIG_CPU_IDLE_GOV_LADDER=y -CONFIG_CPU_SUP_AMD=y -CONFIG_CPU_SUP_CENTAUR=y -CONFIG_CPU_SUP_CYRIX_32=y -CONFIG_CPU_SUP_HYGON=y -CONFIG_CPU_SUP_INTEL=y -CONFIG_CPU_SUP_TRANSMETA_32=y -CONFIG_CPU_SUP_UMC_32=y -CONFIG_CPU_SUP_ZHAOXIN=y -CONFIG_CPU_UNRET_ENTRY=y -CONFIG_CRASH_CORE=y -CONFIG_CRC16=y -CONFIG_CRYPTO_CRC32=y -CONFIG_CRYPTO_CRC32C=y -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=1 -CONFIG_CRYPTO_RNG2=y -# CONFIG_CRYPTO_SERPENT_SSE2_586 is not set -# CONFIG_CX_ECAT is not set -CONFIG_DCACHE_WORD_ACCESS=y -# CONFIG_DCDBAS is not set -# CONFIG_DEBUG_BOOT_PARAMS is not set -# CONFIG_DEBUG_ENTRY is not set -CONFIG_DEBUG_MEMORY_INIT=y -CONFIG_DEBUG_MISC=y -# CONFIG_DEBUG_NMI_SELFTEST is not set -# CONFIG_DEBUG_TLBFLUSH is not set -CONFIG_DECOMPRESS_BZIP2=y -CONFIG_DECOMPRESS_GZIP=y -# CONFIG_DELL_RBU is not set -CONFIG_DMADEVICES=y -CONFIG_DMI=y -CONFIG_DMIID=y -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -CONFIG_DMI_SYSFS=y -CONFIG_DNOTIFY=y -CONFIG_DUMMY_CONSOLE=y -CONFIG_EARLY_PRINTK=y -# CONFIG_EARLY_PRINTK_DBGP is not set -CONFIG_EDAC_ATOMIC_SCRUB=y -CONFIG_EDAC_SUPPORT=y -# CONFIG_EDD is not set -# CONFIG_EISA is not set -# CONFIG_EUROTECH_WDT is not set -CONFIG_EXT4_FS=y -CONFIG_F2FS_FS=y -# CONFIG_F71808E_WDT is not set -CONFIG_FIRMWARE_MEMMAP=y -CONFIG_FIX_EARLYCON_MEM=y -CONFIG_FRAME_POINTER=y -CONFIG_FS_IOMAP=y -CONFIG_FS_MBCACHE=y -CONFIG_FUSION=y -# CONFIG_FUSION_CTL is not set -# CONFIG_FUSION_LOGGING is not set -CONFIG_FUSION_MAX_SGE=128 -CONFIG_FUSION_SPI=y -CONFIG_FW_LOADER_PAGED_BUF=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y -CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y -CONFIG_GENERIC_CMOS_UPDATE=y -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_CPU_VULNERABILITIES=y -CONFIG_GENERIC_EARLY_IOREMAP=y -CONFIG_GENERIC_ENTRY=y -CONFIG_GENERIC_FIND_FIRST_BIT=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_IOMAP=y -CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y -CONFIG_GENERIC_IRQ_RESERVATION_MODE=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_ISA_DMA=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GENERIC_VDSO_32=y -# CONFIG_GEOS is not set -CONFIG_GLOB=y -# CONFIG_HANGCHECK_TIMER is not set -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_HAS_DMA=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HID=y -CONFIG_HIGHMEM=y -CONFIG_HIGHMEM4G=y -# CONFIG_HIGHMEM64G is not set -CONFIG_HIGHPTE=y -CONFIG_HPET_EMULATE_RTC=y -CONFIG_HPET_TIMER=y -# CONFIG_HP_WATCHDOG is not set -CONFIG_HW_CONSOLE=y -CONFIG_HW_RANDOM=y -CONFIG_HW_RANDOM_GEODE=y -CONFIG_HW_RANDOM_VIA=y -# CONFIG_HYPERVISOR_GUEST is not set -CONFIG_HZ_PERIODIC=y -CONFIG_I8253_LOCK=y -# CONFIG_I8K is not set -CONFIG_IA32_FEAT_CTL=y -# CONFIG_IB700_WDT is not set -# CONFIG_IBMASR is not set -# CONFIG_IBM_RTL is not set -# CONFIG_IE6XX_WDT is not set -CONFIG_ILLEGAL_POINTER_VALUE=0 -CONFIG_INITRAMFS_SOURCE="" -CONFIG_INPUT=y -CONFIG_INPUT_KEYBOARD=y -CONFIG_INSTRUCTION_DECODER=y -# CONFIG_INTEL_PCH_THERMAL is not set -# CONFIG_INTEL_POWERCLAMP is not set -# CONFIG_INTEL_SCU_PCI is not set -# CONFIG_IOSF_MBI is not set -CONFIG_IO_DELAY_0X80=y -# CONFIG_IO_DELAY_0XED is not set -# CONFIG_IO_DELAY_NONE is not set -# CONFIG_IO_DELAY_UDELAY is not set -CONFIG_IO_URING=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_IRQ_WORK=y -# CONFIG_ISA is not set -CONFIG_ISA_DMA_API=y -# CONFIG_IT8712F_WDT is not set -# CONFIG_IT87_WDT is not set -# CONFIG_ITCO_WDT is not set -CONFIG_JBD2=y -CONFIG_KALLSYMS=y -CONFIG_KEXEC=y -CONFIG_KEXEC_CORE=y -CONFIG_KEYBOARD_ATKBD=y -# CONFIG_LEDS_CLEVO_MAIL is not set -CONFIG_LOCK_DEBUGGING_SUPPORT=y -# CONFIG_M486 is not set -# CONFIG_M486SX is not set -# CONFIG_M586 is not set -# CONFIG_M586MMX is not set -# CONFIG_M586TSC is not set -CONFIG_M686=y -# CONFIG_MACHZ_WDT is not set -# CONFIG_MATOM is not set -# CONFIG_MCORE2 is not set -# CONFIG_MCRUSOE is not set -# CONFIG_MCYRIXIII is not set -# CONFIG_MEFFICEON is not set -# CONFIG_MELAN is not set -CONFIG_MEMFD_CREATE=y -# CONFIG_MFD_INTEL_LPSS_PCI is not set -# CONFIG_MGEODEGX1 is not set -# CONFIG_MGEODE_LX is not set -CONFIG_MICROCODE=y -CONFIG_MICROCODE_AMD=y -CONFIG_MICROCODE_INTEL=y -CONFIG_MICROCODE_OLD_INTERFACE=y -CONFIG_MIGRATION=y -# CONFIG_MK6 is not set -# CONFIG_MK7 is not set -# CONFIG_MK8 is not set -# CONFIG_MODIFY_LDT_SYSCALL is not set -CONFIG_MODULES_TREE_LOOKUP=y -CONFIG_MODULES_USE_ELF_REL=y -# CONFIG_MPENTIUM4 is not set -# CONFIG_MPENTIUMII is not set -# CONFIG_MPENTIUMIII is not set -# CONFIG_MPENTIUMM is not set -# CONFIG_MTD is not set -CONFIG_MTRR=y -# CONFIG_MTRR_SANITIZER is not set -# CONFIG_MVIAC3_2 is not set -# CONFIG_MVIAC7 is not set -# CONFIG_MWINCHIP3D is not set -# CONFIG_MWINCHIPC6 is not set -CONFIG_NAMESPACES=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_KM=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y -CONFIG_NEED_SG_DMA_LENGTH=y -# CONFIG_NET5501 is not set -# CONFIG_NET_NS is not set -CONFIG_NLS=y -# CONFIG_NOHIGHMEM is not set -CONFIG_NR_CPUS=1 -CONFIG_NR_CPUS_DEFAULT=1 -CONFIG_NR_CPUS_RANGE_BEGIN=1 -CONFIG_NR_CPUS_RANGE_END=1 -# CONFIG_NSC_GPIO is not set -CONFIG_NVRAM=y -# CONFIG_OF is not set -CONFIG_OLD_SIGACTION=y -CONFIG_OLD_SIGSUSPEND3=y -# CONFIG_OLPC is not set -CONFIG_OPROFILE_NMI_TIMER=y -CONFIG_OUTPUT_FORMAT="elf32-i386" -CONFIG_PAGE_OFFSET=0xC0000000 -CONFIG_PC104=y -# CONFIG_PC8736x_GPIO is not set -# CONFIG_PC87413_WDT is not set -CONFIG_PCI=y -CONFIG_PCI_ATS=y -CONFIG_PCI_BIOS=y -CONFIG_PCI_DIRECT=y -CONFIG_PCI_DOMAINS=y -CONFIG_PCI_GOANY=y -# CONFIG_PCI_GOBIOS is not set -# CONFIG_PCI_GODIRECT is not set -# CONFIG_PCI_GOMMCONFIG is not set -CONFIG_PCI_IOV=y -CONFIG_PCI_LABEL=y -CONFIG_PCI_LOCKLESS_CONFIG=y -CONFIG_PCI_MSI=y -CONFIG_PCI_MSI_IRQ_DOMAIN=y -CONFIG_PCSPKR_PLATFORM=y -CONFIG_PERF_EVENTS=y -CONFIG_PERF_EVENTS_INTEL_CSTATE=y -CONFIG_PERF_EVENTS_INTEL_RAPL=y -CONFIG_PERF_EVENTS_INTEL_UNCORE=y -CONFIG_PGTABLE_LEVELS=2 -CONFIG_PHYSICAL_ALIGN=0x100000 -CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_PHY_INTEL_LGM_EMMC is not set -CONFIG_PMC_ATOM=y -CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y -CONFIG_POWER_SUPPLY=y -# CONFIG_PROCESSOR_SELECT is not set -CONFIG_PROC_PAGE_MONITOR=y -CONFIG_PROC_PID_ARCH_STATUS=y -# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set -# CONFIG_PUNIT_ATOM_DEBUG is not set -CONFIG_RATIONAL=y -CONFIG_RD_BZIP2=y -CONFIG_RD_GZIP=y -CONFIG_RETHUNK=y -CONFIG_RETPOLINE=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_MC146818_LIB=y -CONFIG_SATA_HOST=y -# CONFIG_SBC7240_WDT is not set -# CONFIG_SBC8360_WDT is not set -# CONFIG_SBC_EPX_C3_WATCHDOG is not set -# CONFIG_SC1200_WDT is not set -CONFIG_SCSI=y -CONFIG_SCSI_SPI_ATTRS=y -CONFIG_SCx200=y -CONFIG_SCx200HR_TIMER=y -# CONFIG_SCx200_GPIO is not set -# CONFIG_SCx200_WDT is not set -CONFIG_SERIAL_8250_PCI=y -# CONFIG_SERIAL_LANTIQ is not set -CONFIG_SERIO=y -CONFIG_SERIO_I8042=y -CONFIG_SERIO_LIBPS2=y -CONFIG_SERIO_SERPORT=y -CONFIG_SG_POOL=y -# CONFIG_SMSC37B787_WDT is not set -# CONFIG_SMSC_SCH311X_WDT is not set -CONFIG_SPARSEMEM_STATIC=y -CONFIG_SPARSE_IRQ=y -CONFIG_SPECULATION_MITIGATIONS=y -CONFIG_SRCU=y -# CONFIG_STATIC_CALL_SELFTEST is not set -CONFIG_SYSCTL_EXCEPTION_TRACE=y -# CONFIG_TELCLOCK is not set -# CONFIG_TEST_FPU is not set -CONFIG_THERMAL=y -CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y -CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 -CONFIG_THERMAL_GOV_STEP_WISE=y -CONFIG_THREAD_INFO_IN_TASK=y -CONFIG_TICK_CPU_ACCOUNTING=y -CONFIG_TINY_SRCU=y -# CONFIG_TOSHIBA is not set -# CONFIG_TQMX86_WDT is not set -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y -CONFIG_UNWINDER_FRAME_POINTER=y -# CONFIG_UNWINDER_GUESS is not set -CONFIG_UP_LATE_INIT=y -CONFIG_USB=y -CONFIG_USB_COMMON=y -CONFIG_USB_EHCI_HCD=y -# CONFIG_USB_EHCI_HCD_PLATFORM is not set -CONFIG_USB_EHCI_PCI=y -CONFIG_USB_HID=y -CONFIG_USB_HIDDEV=y -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_OHCI_HCD_PCI=y -# CONFIG_USB_OHCI_HCD_PLATFORM is not set -CONFIG_USB_PCI=y -CONFIG_USB_SUPPORT=y -CONFIG_USB_UHCI_HCD=y -CONFIG_USB_XHCI_HCD=y -CONFIG_USB_XHCI_PCI=y -# CONFIG_USB_XHCI_PLATFORM is not set -# CONFIG_USER_NS is not set -CONFIG_USER_STACKTRACE_SUPPORT=y -CONFIG_VGA_CONSOLE=y -# CONFIG_VIA_WDT is not set -# CONFIG_VMWARE_VMCI is not set -CONFIG_VM_EVENT_COUNTERS=y -CONFIG_VT=y -CONFIG_VT_CONSOLE=y -CONFIG_VT_HW_CONSOLE_BINDING=y -# CONFIG_WAFER_WDT is not set -CONFIG_X86=y -CONFIG_X86_32=y -# CONFIG_X86_32_IRIS is not set -CONFIG_X86_32_LAZY_GS=y -# CONFIG_X86_ANCIENT_MCE is not set -# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_CMOV=y -CONFIG_X86_CMPXCHG64=y -# CONFIG_X86_CPA_STATISTICS is not set -# CONFIG_X86_CPUFREQ_NFORCE2 is not set -# CONFIG_X86_CPUID is not set -# CONFIG_X86_CPU_RESCTRL is not set -CONFIG_X86_DEBUGCTLMSR=y -# CONFIG_X86_DEBUG_FPU is not set -# CONFIG_X86_DECODER_SELFTEST is not set -# CONFIG_X86_EXTENDED_PLATFORM is not set -CONFIG_X86_FEATURE_NAMES=y -CONFIG_X86_GENERIC=y -# CONFIG_X86_GX_SUSPMOD is not set -# CONFIG_X86_INTEL_PSTATE is not set -# CONFIG_X86_INTEL_TSX_MODE_AUTO is not set -CONFIG_X86_INTEL_TSX_MODE_OFF=y -# CONFIG_X86_INTEL_TSX_MODE_ON is not set -CONFIG_X86_INTEL_USERCOPY=y -CONFIG_X86_INTERNODE_CACHE_SHIFT=6 -CONFIG_X86_IOPL_IOPERM=y -CONFIG_X86_IO_APIC=y -CONFIG_X86_L1_CACHE_SHIFT=6 -# CONFIG_X86_LEGACY_VM86 is not set -CONFIG_X86_LOCAL_APIC=y -# CONFIG_X86_LONGRUN is not set -CONFIG_X86_MCE=y -# CONFIG_X86_MCELOG_LEGACY is not set -CONFIG_X86_MCE_AMD=y -# CONFIG_X86_MCE_INJECT is not set -CONFIG_X86_MCE_INTEL=y -CONFIG_X86_MCE_THRESHOLD=y -CONFIG_X86_MINIMUM_CPU_FAMILY=6 -CONFIG_X86_MPPARSE=y -CONFIG_X86_MSR=y -# CONFIG_X86_P4_CLOCKMOD is not set -CONFIG_X86_PAT=y -CONFIG_X86_PLATFORM_DEVICES=y -# CONFIG_X86_POWERNOW_K6 is not set -# CONFIG_X86_POWERNOW_K7 is not set -# CONFIG_X86_REBOOTFIXUPS is not set -CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y -CONFIG_X86_RESERVE_LOW=64 -CONFIG_X86_SMAP=y -# CONFIG_X86_SPEEDSTEP_CENTRINO is not set -# CONFIG_X86_SPEEDSTEP_ICH is not set -# CONFIG_X86_SPEEDSTEP_SMI is not set -CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y -CONFIG_X86_THERMAL_VECTOR=y -CONFIG_X86_TSC=y -CONFIG_X86_UMIP=y -CONFIG_X86_UP_APIC=y -CONFIG_X86_UP_IOAPIC=y -CONFIG_X86_USE_PPRO_CHECKSUM=y -CONFIG_X86_VERBOSE_BOOTUP=y -CONFIG_X86_VMX_FEATURE_NAMES=y -CONFIG_XZ_DEC_BCJ=y -CONFIG_XZ_DEC_X86=y -CONFIG_ZLIB_INFLATE=y diff --git a/target/linux/x86/config-5.15 b/target/linux/x86/config-5.15 new file mode 100644 index 0000000000..cf94f3bbff --- /dev/null +++ b/target/linux/x86/config-5.15 @@ -0,0 +1,440 @@ +# CONFIG_60XX_WDT is not set +# CONFIG_64BIT is not set +# CONFIG_ACPI is not set +# CONFIG_ACQUIRE_WDT is not set +# CONFIG_ADVANTECH_WDT is not set +# CONFIG_ALIM1535_WDT is not set +# CONFIG_ALIX is not set +CONFIG_AMD_NB=y +CONFIG_ARCH_32BIT_OFF_T=y +CONFIG_ARCH_CLOCKSOURCE_INIT=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y +CONFIG_ARCH_NR_GPIO=512 +CONFIG_ARCH_RANDOM=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SPLIT_ARG64=y +CONFIG_ARCH_STACKWALK=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_USES_PG_UNCACHED=y +CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_ATA=y +CONFIG_ATA_GENERIC=y +CONFIG_ATA_PIIX=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_MQ_PCI=y +CONFIG_BOUNCE=y +CONFIG_CLKBLD_I8253=y +CONFIG_CLKEVT_I8253=y +CONFIG_CLKSRC_I8253=y +CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y +CONFIG_CLOCKSOURCE_WATCHDOG=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_COMMON_CLK=y +CONFIG_COMPAT_32=y +CONFIG_COMPAT_32BIT_TIME=y +# CONFIG_COMPAT_VDSO is not set +CONFIG_CONSOLE_TRANSLATIONS=y +# CONFIG_CPU5_WDT is not set +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_IBPB_ENTRY=y +CONFIG_CPU_IBRS_ENTRY=y +# CONFIG_SLS is not set +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_SUP_AMD=y +CONFIG_CPU_SUP_CENTAUR=y +CONFIG_CPU_SUP_CYRIX_32=y +CONFIG_CPU_SUP_HYGON=y +CONFIG_CPU_SUP_INTEL=y +CONFIG_CPU_SUP_TRANSMETA_32=y +CONFIG_CPU_SUP_UMC_32=y +CONFIG_CPU_SUP_ZHAOXIN=y +CONFIG_CPU_SRSO=y +CONFIG_CPU_UNRET_ENTRY=y +CONFIG_CRASH_CORE=y +CONFIG_CRC16=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=1 +CONFIG_CRYPTO_RNG2=y +# CONFIG_CRYPTO_SERPENT_SSE2_586 is not set +# CONFIG_CX_ECAT is not set +CONFIG_DCACHE_WORD_ACCESS=y +# CONFIG_DEBUG_BOOT_PARAMS is not set +# CONFIG_DEBUG_ENTRY is not set +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set +CONFIG_DEBUG_MEMORY_INIT=y +CONFIG_DEBUG_MISC=y +# CONFIG_DEBUG_NMI_SELFTEST is not set +# CONFIG_DEBUG_TLBFLUSH is not set +CONFIG_DECOMPRESS_BZIP2=y +CONFIG_DECOMPRESS_GZIP=y +CONFIG_RETHUNK=y +CONFIG_DMADEVICES=y +CONFIG_DMI=y +CONFIG_DMIID=y +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +CONFIG_DMI_SYSFS=y +CONFIG_DNOTIFY=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_EARLY_PRINTK=y +# CONFIG_EARLY_PRINTK_DBGP is not set +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +# CONFIG_EDD is not set +# CONFIG_EISA is not set +# CONFIG_EUROTECH_WDT is not set +CONFIG_EXT4_FS=y +CONFIG_F2FS_FS=y +# CONFIG_F71808E_WDT is not set +CONFIG_FIRMWARE_MEMMAP=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_FRAME_POINTER=y +CONFIG_FS_IOMAP=y +CONFIG_FS_MBCACHE=y +CONFIG_FUSION=y +# CONFIG_FUSION_CTL is not set +# CONFIG_FUSION_LOGGING is not set +CONFIG_FUSION_MAX_SGE=128 +CONFIG_FUSION_SPI=y +CONFIG_FW_LOADER_PAGED_BUF=y +# CONFIG_GDS_FORCE_MITIGATION is not set +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y +CONFIG_GENERIC_CMOS_UPDATE=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_GENERIC_EARLY_IOREMAP=y +CONFIG_GENERIC_ENTRY=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_IOMAP=y +CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y +CONFIG_GENERIC_IRQ_RESERVATION_MODE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_VDSO_32=y +# CONFIG_GEOS is not set +CONFIG_GLOB=y +# CONFIG_HANGCHECK_TIMER is not set +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HID=y +CONFIG_HIGHMEM=y +CONFIG_HIGHMEM4G=y +# CONFIG_HIGHMEM64G is not set +CONFIG_HIGHPTE=y +CONFIG_HPET_EMULATE_RTC=y +CONFIG_HPET_TIMER=y +# CONFIG_HP_WATCHDOG is not set +CONFIG_HW_CONSOLE=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_GEODE=y +CONFIG_HW_RANDOM_VIA=y +# CONFIG_HYPERVISOR_GUEST is not set +CONFIG_HZ_PERIODIC=y +CONFIG_I8253_LOCK=y +CONFIG_IA32_FEAT_CTL=y +# CONFIG_IB700_WDT is not set +# CONFIG_IBMASR is not set +# CONFIG_IBM_RTL is not set +# CONFIG_IE6XX_WDT is not set +CONFIG_ILLEGAL_POINTER_VALUE=0 +CONFIG_INITRAMFS_SOURCE="" +CONFIG_INPUT=y +CONFIG_INPUT_KEYBOARD=y +CONFIG_INSTRUCTION_DECODER=y +# CONFIG_INTEL_LDMA is not set +# CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_POWERCLAMP is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_IOSF_MBI is not set +CONFIG_IO_DELAY_0X80=y +# CONFIG_IO_DELAY_0XED is not set +# CONFIG_IO_DELAY_NONE is not set +# CONFIG_IO_DELAY_UDELAY is not set +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_WORK=y +# CONFIG_ISA is not set +CONFIG_ISA_DMA_API=y +# CONFIG_IT8712F_WDT is not set +# CONFIG_IT87_WDT is not set +# CONFIG_ITCO_WDT is not set +CONFIG_JBD2=y +CONFIG_KALLSYMS=y +CONFIG_KEXEC=y +CONFIG_KEXEC_CORE=y +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KMAP_LOCAL=y +# CONFIG_LEDS_CLEVO_MAIL is not set +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_M486 is not set +# CONFIG_M486SX is not set +# CONFIG_M586 is not set +# CONFIG_M586MMX is not set +# CONFIG_M586TSC is not set +CONFIG_M686=y +# CONFIG_MACHZ_WDT is not set +# CONFIG_MATOM is not set +# CONFIG_MCORE2 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MEFFICEON is not set +# CONFIG_MELAN is not set +CONFIG_MEMFD_CREATE=y +# CONFIG_MFD_INTEL_LPSS_PCI is not set +# CONFIG_MGEODEGX1 is not set +# CONFIG_MGEODE_LX is not set +CONFIG_MICROCODE=y +CONFIG_MICROCODE_AMD=y +CONFIG_MICROCODE_INTEL=y +CONFIG_MICROCODE_LATE_LOADING=y +CONFIG_MIGRATION=y +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MODIFY_LDT_SYSCALL is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_MODULES_USE_ELF_REL=y +# CONFIG_MPENTIUM4 is not set +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MTD is not set +CONFIG_MTRR=y +# CONFIG_MTRR_SANITIZER is not set +# CONFIG_MVIAC3_2 is not set +# CONFIG_MVIAC7 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MWINCHIPC6 is not set +CONFIG_NAMESPACES=y +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_KM=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_NEED_SG_DMA_LENGTH=y +# CONFIG_NET5501 is not set +# CONFIG_NET_NS is not set +CONFIG_NLS=y +# CONFIG_NOHIGHMEM is not set +CONFIG_NR_CPUS=1 +CONFIG_NR_CPUS_DEFAULT=1 +CONFIG_NR_CPUS_RANGE_BEGIN=1 +CONFIG_NR_CPUS_RANGE_END=1 +# CONFIG_NSC_GPIO is not set +CONFIG_NVRAM=y +# CONFIG_OF is not set +CONFIG_OLD_SIGACTION=y +CONFIG_OLD_SIGSUSPEND3=y +# CONFIG_OLPC is not set +CONFIG_OUTPUT_FORMAT="elf32-i386" +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_PC104=y +# CONFIG_PC8736x_GPIO is not set +# CONFIG_PC87413_WDT is not set +CONFIG_PCI=y +CONFIG_PCI_ATS=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_GOANY=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GODIRECT is not set +# CONFIG_PCI_GOMMCONFIG is not set +CONFIG_PCI_IOV=y +CONFIG_PCI_LABEL=y +CONFIG_PCI_LOCKLESS_CONFIG=y +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCSPKR_PLATFORM=y +CONFIG_PERF_EVENTS=y +# CONFIG_PERF_EVENTS_AMD_UNCORE is not set +CONFIG_PERF_EVENTS_INTEL_CSTATE=y +CONFIG_PERF_EVENTS_INTEL_RAPL=y +CONFIG_PERF_EVENTS_INTEL_UNCORE=y +CONFIG_PGTABLE_LEVELS=2 +CONFIG_PHYSICAL_ALIGN=0x100000 +CONFIG_PHYSICAL_START=0x1000000 +# CONFIG_PHY_INTEL_LGM_EMMC is not set +CONFIG_PMC_ATOM=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POWER_SUPPLY=y +# CONFIG_PROCESSOR_SELECT is not set +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PROC_PID_ARCH_STATUS=y +# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y +# CONFIG_PUNIT_ATOM_DEBUG is not set +CONFIG_RATIONAL=y +CONFIG_RD_BZIP2=y +CONFIG_RD_GZIP=y +CONFIG_RETPOLINE=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_MC146818_LIB=y +CONFIG_SATA_HOST=y +# CONFIG_SBC7240_WDT is not set +# CONFIG_SBC8360_WDT is not set +# CONFIG_SBC_EPX_C3_WATCHDOG is not set +# CONFIG_SC1200_WDT is not set +CONFIG_SCSI=y +CONFIG_SCSI_COMMON=y +CONFIG_SCSI_SPI_ATTRS=y +CONFIG_SCx200=y +CONFIG_SCx200HR_TIMER=y +# CONFIG_SCx200_GPIO is not set +# CONFIG_SCx200_WDT is not set +CONFIG_SERIAL_8250_PCI=y +# CONFIG_SERIAL_LANTIQ is not set +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_LIBPS2=y +CONFIG_SERIO_SERPORT=y +CONFIG_SG_POOL=y +# CONFIG_SMSC37B787_WDT is not set +# CONFIG_SMSC_SCH311X_WDT is not set +CONFIG_SPARSEMEM_STATIC=y +CONFIG_SPARSE_IRQ=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_SRCU=y +# CONFIG_STATIC_CALL_SELFTEST is not set +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_SYSFB=y +# CONFIG_SYSFB_SIMPLEFB is not set +# CONFIG_TELCLOCK is not set +# CONFIG_TEST_FPU is not set +CONFIG_THERMAL=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THREAD_INFO_IN_TASK=y +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TINY_SRCU=y +# CONFIG_TOSHIBA is not set +# CONFIG_TQMX86_WDT is not set +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +CONFIG_UNWINDER_FRAME_POINTER=y +# CONFIG_UNWINDER_GUESS is not set +CONFIG_UP_LATE_INIT=y +CONFIG_USB=y +CONFIG_USB_COMMON=y +CONFIG_USB_EHCI_HCD=y +# CONFIG_USB_EHCI_HCD_PLATFORM is not set +CONFIG_USB_EHCI_PCI=y +CONFIG_USB_HID=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PCI=y +# CONFIG_USB_OHCI_HCD_PLATFORM is not set +CONFIG_USB_PCI=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_UHCI_HCD=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_PCI=y +# CONFIG_USB_XHCI_PLATFORM is not set +# CONFIG_USER_NS is not set +CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_VGA_CONSOLE=y +# CONFIG_VIA_WDT is not set +# CONFIG_VMWARE_VMCI is not set +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_WAFER_WDT is not set +CONFIG_X86=y +CONFIG_X86_32=y +# CONFIG_X86_32_IRIS is not set +# CONFIG_X86_ANCIENT_MCE is not set +# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set +CONFIG_X86_CMOV=y +CONFIG_X86_CMPXCHG64=y +# CONFIG_X86_CPA_STATISTICS is not set +# CONFIG_X86_CPUFREQ_NFORCE2 is not set +# CONFIG_X86_CPUID is not set +# CONFIG_X86_CPU_RESCTRL is not set +CONFIG_X86_DEBUGCTLMSR=y +# CONFIG_X86_DEBUG_FPU is not set +# CONFIG_X86_DECODER_SELFTEST is not set +# CONFIG_X86_EXTENDED_PLATFORM is not set +CONFIG_X86_FEATURE_NAMES=y +CONFIG_X86_GENERIC=y +# CONFIG_X86_GX_SUSPMOD is not set +# CONFIG_X86_INTEL_PSTATE is not set +# CONFIG_X86_INTEL_TSX_MODE_AUTO is not set +CONFIG_X86_INTEL_TSX_MODE_OFF=y +# CONFIG_X86_INTEL_TSX_MODE_ON is not set +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_INTERNODE_CACHE_SHIFT=6 +CONFIG_X86_IOPL_IOPERM=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_L1_CACHE_SHIFT=6 +# CONFIG_X86_LEGACY_VM86 is not set +CONFIG_X86_LOCAL_APIC=y +# CONFIG_X86_LONGRUN is not set +CONFIG_X86_MCE=y +# CONFIG_X86_MCELOG_LEGACY is not set +CONFIG_X86_MCE_AMD=y +# CONFIG_X86_MCE_INJECT is not set +CONFIG_X86_MCE_INTEL=y +CONFIG_X86_MCE_THRESHOLD=y +CONFIG_X86_MINIMUM_CPU_FAMILY=6 +CONFIG_X86_MPPARSE=y +CONFIG_X86_MSR=y +# CONFIG_X86_P4_CLOCKMOD is not set +CONFIG_X86_PAT=y +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_X86_PLATFORM_DRIVERS_HP is not set +# CONFIG_X86_POWERNOW_K6 is not set +# CONFIG_X86_POWERNOW_K7 is not set +# CONFIG_X86_REBOOTFIXUPS is not set +CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +CONFIG_X86_SMAP=y +# CONFIG_X86_SPEEDSTEP_CENTRINO is not set +# CONFIG_X86_SPEEDSTEP_ICH is not set +# CONFIG_X86_SPEEDSTEP_SMI is not set +CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y +CONFIG_X86_THERMAL_VECTOR=y +CONFIG_X86_TSC=y +CONFIG_X86_UMIP=y +CONFIG_X86_UP_APIC=y +CONFIG_X86_UP_IOAPIC=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_X86_VERBOSE_BOOTUP=y +CONFIG_X86_VMX_FEATURE_NAMES=y +CONFIG_XZ_DEC_BCJ=y +CONFIG_XZ_DEC_X86=y +CONFIG_ZLIB_INFLATE=y diff --git a/target/linux/x86/generic/config-5.10 b/target/linux/x86/generic/config-5.10 deleted file mode 100644 index 7bfe8b4004..0000000000 --- a/target/linux/x86/generic/config-5.10 +++ /dev/null @@ -1,450 +0,0 @@ -# CONFIG_3C515 is not set -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -CONFIG_ACPI_BATTERY=y -# CONFIG_ACPI_BGRT is not set -CONFIG_ACPI_BUTTON=y -# CONFIG_ACPI_CMPC is not set -CONFIG_ACPI_CONTAINER=y -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -# CONFIG_ACPI_FAN is not set -CONFIG_ACPI_HOTPLUG_CPU=y -CONFIG_ACPI_HOTPLUG_IOAPIC=y -# CONFIG_ACPI_I2C_OPREGION is not set -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -CONFIG_ACPI_TAD=y -CONFIG_ACPI_THERMAL=y -CONFIG_ACPI_VIDEO=y -# CONFIG_ACPI_WMI is not set -CONFIG_AGP=y -# CONFIG_AGP_ALI is not set -# CONFIG_AGP_AMD is not set -# CONFIG_AGP_AMD64 is not set -# CONFIG_AGP_ATI is not set -# CONFIG_AGP_EFFICEON is not set -CONFIG_AGP_INTEL=y -# CONFIG_AGP_NVIDIA is not set -# CONFIG_AGP_SIS is not set -# CONFIG_AGP_SWORKS is not set -# CONFIG_AGP_VIA is not set -# CONFIG_APM is not set -CONFIG_ARCH_CPUIDLE_HALTPOLL=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BALLOON_COMPACTION=y -CONFIG_BLK_DEV_SR=y -CONFIG_BLK_MQ_VIRTIO=y -CONFIG_BLK_PM=y -# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set -CONFIG_BTT=y -CONFIG_CDROM=y -CONFIG_CONNECTOR=y -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y -CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y -# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set -CONFIG_CPU_IDLE_GOV_MENU=y -CONFIG_CPU_RMAP=y -CONFIG_CRYPTO_BLAKE2S=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -# CONFIG_DEBUG_HOTPLUG_CPU0 is not set -CONFIG_DMA_ACPI=y -CONFIG_DMA_OPS=y -CONFIG_DMA_SHARED_BUFFER=y -CONFIG_DRM=y -CONFIG_DRM_BOCHS=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=100 -CONFIG_DRM_GEM_SHMEM_HELPER=y -CONFIG_DRM_I915=y -CONFIG_DRM_I915_CAPTURE_ERROR=y -CONFIG_DRM_I915_COMPRESS_ERROR=y -# CONFIG_DRM_I915_DEBUG is not set -# CONFIG_DRM_I915_DEBUG_GUC is not set -# CONFIG_DRM_I915_DEBUG_MMIO is not set -# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set -# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set -CONFIG_DRM_I915_FENCE_TIMEOUT=10000 -CONFIG_DRM_I915_FORCE_PROBE="" -CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 -# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set -CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 -CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 -# CONFIG_DRM_I915_SELFTEST is not set -CONFIG_DRM_I915_STOP_TIMEOUT=100 -# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set -# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set -CONFIG_DRM_I915_TIMESLICE_DURATION=1 -CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 -CONFIG_DRM_I915_USERPTR=y -# CONFIG_DRM_I915_WERROR is not set -CONFIG_DRM_KMS_FB_HELPER=y -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_MIPI_DSI=y -CONFIG_DRM_PANEL=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_DMA_PAGE_POOL=y -CONFIG_DRM_TTM_HELPER=y -CONFIG_DRM_VIRTIO_GPU=y -CONFIG_DRM_VRAM_HELPER=y -CONFIG_EFI=y -CONFIG_EFIVAR_FS=m -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH is not set -# CONFIG_EFI_CUSTOM_SSDT_OVERLAYS is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -CONFIG_EFI_EARLYCON=y -CONFIG_EFI_ESRT=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y -# CONFIG_EFI_PGT_DUMP is not set -# CONFIG_EFI_RCI2_TABLE is not set -CONFIG_EFI_RUNTIME_MAP=y -CONFIG_EFI_RUNTIME_WRAPPERS=y -CONFIG_EFI_STUB=y -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_VARS is not set -# CONFIG_EL3 is not set -CONFIG_FAILOVER=y -CONFIG_FB=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_CMDLINE=y -CONFIG_FB_DEFERRED_IO=y -CONFIG_FB_EFI=y -CONFIG_FB_HYPERV=y -# CONFIG_FB_I810 is not set -CONFIG_FB_SIMPLE=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_VESA is not set -CONFIG_FONT_8x16=y -CONFIG_FONT_8x8=y -CONFIG_FONT_SUPPORT=y -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -CONFIG_FREEZER=y -CONFIG_FW_CACHE=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_GENERIC_PENDING_IRQ=y -CONFIG_GENERIC_PINCONF=y -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_IRQCHIP=y -CONFIG_GPIO_ACPI=y -CONFIG_GUP_GET_PTE_LOW_HIGH=y -CONFIG_HALTPOLL_CPUIDLE=y -CONFIG_HDMI=y -CONFIG_HIBERNATE_CALLBACKS=y -CONFIG_HID_BATTERY_STRENGTH=y -CONFIG_HID_GENERIC=y -CONFIG_HID_HYPERV_MOUSE=y -# CONFIG_HIGHMEM4G is not set -CONFIG_HIGHMEM64G=y -CONFIG_HOTPLUG_CPU=y -CONFIG_HOTPLUG_PCI=y -CONFIG_HOTPLUG_PCI_ACPI=y -# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set -# CONFIG_HOTPLUG_PCI_COMPAQ is not set -# CONFIG_HOTPLUG_PCI_CPCI is not set -# CONFIG_HOTPLUG_PCI_IBM is not set -CONFIG_HOTPLUG_PCI_PCIE=y -# CONFIG_HOTPLUG_PCI_SHPC is not set -CONFIG_HOTPLUG_SMT=y -CONFIG_HPET=y -CONFIG_HPET_MMAP=y -# CONFIG_HP_ACCEL is not set -CONFIG_HVC_DRIVER=y -CONFIG_HVC_IRQ=y -CONFIG_HVC_XEN=y -CONFIG_HVC_XEN_FRONTEND=y -CONFIG_HWMON=y -CONFIG_HWMON_VID=y -CONFIG_HW_RANDOM_VIRTIO=y -CONFIG_HYPERV=y -CONFIG_HYPERVISOR_GUEST=y -CONFIG_HYPERV_BALLOON=y -CONFIG_HYPERV_KEYBOARD=y -CONFIG_HYPERV_NET=y -CONFIG_HYPERV_STORAGE=y -# CONFIG_HYPERV_TESTING is not set -CONFIG_HYPERV_TIMER=y -CONFIG_HYPERV_UTILS=y -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_MULTI_INSTANTIATE is not set -# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set -CONFIG_INPUT_MOUSE=y -CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y -CONFIG_INTEL_GTT=y -CONFIG_INTEL_IDLE=y -# CONFIG_INTEL_IPS is not set -# CONFIG_INTEL_MEI_HDCP is not set -# CONFIG_INTEL_MENLOW is not set -CONFIG_INTEL_PCH_THERMAL=y -# CONFIG_INTEL_SCU_PLATFORM is not set -CONFIG_INTEL_SOC_DTS_IOSF_CORE=y -CONFIG_INTEL_SOC_DTS_THERMAL=y -CONFIG_INTERVAL_TREE=y -CONFIG_IOSF_MBI=y -# CONFIG_IOSF_MBI_DEBUG is not set -CONFIG_IRQ_BYPASS_MANAGER=y -CONFIG_ISA=y -CONFIG_ISAPNP=y -CONFIG_ISA_BUS_API=y -# CONFIG_ISCSI_IBFT is not set -CONFIG_ISO9660_FS=y -# CONFIG_JOLIET is not set -CONFIG_KCMP=y -CONFIG_KVM=y -CONFIG_KVM_AMD=y -CONFIG_KVM_ASYNC_PF=y -CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y -CONFIG_KVM_GUEST=y -CONFIG_KVM_INTEL=y -CONFIG_KVM_MMIO=y -CONFIG_KVM_VFIO=y -CONFIG_KVM_XFER_TO_GUEST_WORK=y -# CONFIG_LANCE is not set -CONFIG_LIBNVDIMM=y -CONFIG_LOCK_SPIN_ON_OWNER=y -# CONFIG_M686 is not set -# CONFIG_MDA_CONSOLE is not set -CONFIG_MEMORY_BALLOON=y -CONFIG_MEMREGION=y -CONFIG_MFD_CORE=y -CONFIG_MFD_INTEL_LPSS=y -CONFIG_MFD_INTEL_LPSS_ACPI=y -# CONFIG_MFD_INTEL_PMC_BXT is not set -# CONFIG_MIXCOMWD is not set -CONFIG_MMC=y -CONFIG_MMC_BLOCK=y -CONFIG_MMC_CQHCI=y -CONFIG_MMC_RICOH_MMC=y -CONFIG_MMC_SDHCI=y -CONFIG_MMC_SDHCI_IO_ACCESSORS=y -CONFIG_MMC_SDHCI_PCI=y -# CONFIG_MMC_SDHCI_PLTFM is not set -# CONFIG_MMC_WBSD is not set -CONFIG_MMU_NOTIFIER=y -# CONFIG_MOUSE_BCM5974 is not set -# CONFIG_MOUSE_CYAPA is not set -CONFIG_MOUSE_PS2=y -CONFIG_MOUSE_PS2_ALPS=y -# CONFIG_MOUSE_PS2_BYD is not set -# CONFIG_MOUSE_PS2_CYPRESS is not set -# CONFIG_MOUSE_PS2_ELANTECH is not set -CONFIG_MOUSE_PS2_LIFEBOOK=y -CONFIG_MOUSE_PS2_LOGIPS2PP=y -CONFIG_MOUSE_PS2_SMBUS=y -CONFIG_MOUSE_PS2_SYNAPTICS=y -CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y -# CONFIG_MOUSE_PS2_TOUCHKIT is not set -CONFIG_MOUSE_PS2_TRACKPOINT=y -# CONFIG_MOUSE_PS2_VMMOUSE is not set -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_VSXXXAA is not set -CONFIG_MPENTIUM4=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_ND_BLK=y -CONFIG_ND_BTT=y -CONFIG_ND_CLAIM=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_NET_FAILOVER=y -CONFIG_NET_FLOW_LIMIT=y -CONFIG_NO_HZ=y -CONFIG_NR_CPUS=4 -CONFIG_NR_CPUS_DEFAULT=8 -CONFIG_NR_CPUS_RANGE_BEGIN=2 -CONFIG_NR_CPUS_RANGE_END=8 -CONFIG_PADATA=y -CONFIG_PAGE_POOL=y -CONFIG_PAGE_REPORTING=y -CONFIG_PAGE_TABLE_ISOLATION=y -CONFIG_PARAVIRT=y -CONFIG_PARAVIRT_CLOCK=y -# CONFIG_PARAVIRT_DEBUG is not set -CONFIG_PARAVIRT_SPINLOCKS=y -CONFIG_PATA_AMD=y -CONFIG_PATA_ATIIXP=y -CONFIG_PATA_MPIIX=y -CONFIG_PATA_OLDPIIX=y -CONFIG_PATA_PLATFORM=y -CONFIG_PATA_SC1200=y -CONFIG_PATA_TIMINGS=y -CONFIG_PATA_VIA=y -# CONFIG_PCENGINES_APU2 is not set -CONFIG_PCIEAER=y -CONFIG_PCIEPORTBUS=y -CONFIG_PCIE_PME=y -CONFIG_PCI_MMCONFIG=y -CONFIG_PCI_XEN=y -# CONFIG_PCWATCHDOG is not set -CONFIG_PGTABLE_LEVELS=3 -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_PINCTRL=y -CONFIG_PINCTRL_BAYTRAIL=y -CONFIG_PINCTRL_BROXTON=y -CONFIG_PINCTRL_CANNONLAKE=y -CONFIG_PINCTRL_CHERRYVIEW=y -CONFIG_PINCTRL_DENVERTON=y -# CONFIG_PINCTRL_EMMITSBURG is not set -CONFIG_PINCTRL_GEMINILAKE=y -CONFIG_PINCTRL_INTEL=y -# CONFIG_PINCTRL_JASPERLAKE is not set -# CONFIG_PINCTRL_LEWISBURG is not set -# CONFIG_PINCTRL_LYNXPOINT is not set -CONFIG_PINCTRL_SUNRISEPOINT=y -# CONFIG_PINCTRL_TIGERLAKE is not set -CONFIG_PM=y -# CONFIG_PMIC_OPREGION is not set -CONFIG_PM_CLK=y -CONFIG_PM_SLEEP=y -CONFIG_PM_SLEEP_SMP=y -CONFIG_PNP=y -CONFIG_PNPACPI=y -# CONFIG_PNPBIOS is not set -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_PREEMPT_NOTIFIERS=y -CONFIG_PROC_EVENTS=y -CONFIG_PVH=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_RAS=y -CONFIG_RELAY=y -CONFIG_RELOCATABLE=y -CONFIG_RESET_ATTACK_MITIGATION=y -CONFIG_RFS_ACCEL=y -CONFIG_RPS=y -CONFIG_RTC_I2C_AND_SPI=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SATA_AHCI=y -CONFIG_SATA_VIA=y -CONFIG_SCHED_INFO=y -CONFIG_SCHED_SMT=y -# CONFIG_SCSI_FDOMAIN_ISA is not set -CONFIG_SCSI_VIRTIO=y -# CONFIG_SENSORS_AMD_ENERGY is not set -CONFIG_SENSORS_CORETEMP=y -CONFIG_SENSORS_FAM15H_POWER=y -CONFIG_SENSORS_I5500=y -CONFIG_SENSORS_K10TEMP=y -CONFIG_SENSORS_K8TEMP=y -CONFIG_SENSORS_VIA_CPUTEMP=y -CONFIG_SERIAL_8250_PNP=y -CONFIG_SERIAL_MCTRL_GPIO=y -CONFIG_SMP=y -# CONFIG_SURFACE_3_POWER_OPREGION is not set -# CONFIG_SURFACE_PRO3_BUTTON is not set -CONFIG_SWIOTLB=y -CONFIG_SWIOTLB_XEN=y -CONFIG_SYNC_FILE=y -# CONFIG_SYSTEM76_ACPI is not set -CONFIG_SYS_HYPERVISOR=y -CONFIG_TASKSTATS=y -CONFIG_TASK_DELAY_ACCT=y -CONFIG_THERMAL_GOV_USER_SPACE=y -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_WRITABLE_TRIPS=y -# CONFIG_TOSHIBA_BT_RFKILL is not set -CONFIG_TREE_RCU=y -CONFIG_TREE_SRCU=y -# CONFIG_UCLAMP_TASK is not set -CONFIG_UCS2_STRING=y -CONFIG_USB_STORAGE=y -CONFIG_USER_RETURN_NOTIFIER=y -CONFIG_VHOST=y -CONFIG_VHOST_IOTLB=y -CONFIG_VHOST_NET=y -CONFIG_VIRTIO=y -CONFIG_VIRTIO_BALLOON=y -CONFIG_VIRTIO_BLK=y -CONFIG_VIRTIO_CONSOLE=y -CONFIG_VIRTIO_DMA_SHARED_BUFFER=y -CONFIG_VIRTIO_INPUT=y -CONFIG_VIRTIO_MMIO=y -CONFIG_VIRTIO_NET=y -CONFIG_VIRTIO_PCI=y -CONFIG_VIRTIO_PCI_LEGACY=y -# CONFIG_VIRTIO_PMEM is not set -CONFIG_VIRTUALIZATION=y -CONFIG_VMAP_PFN=y -CONFIG_VT_CONSOLE_SLEEP=y -CONFIG_WATCHDOG_CORE=y -# CONFIG_WDT is not set -CONFIG_X86_32_SMP=y -CONFIG_X86_ACPI_CPUFREQ=y -# CONFIG_X86_ACPI_CPUFREQ_CPB is not set -CONFIG_X86_AMD_FREQ_SENSITIVITY=y -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -# CONFIG_X86_BIGSMP is not set -CONFIG_X86_CPUID=y -# CONFIG_X86_E_POWERSAVER is not set -CONFIG_X86_HV_CALLBACK_VECTOR=y -CONFIG_X86_INTEL_LPSS=y -CONFIG_X86_INTEL_PSTATE=y -CONFIG_X86_INTERNODE_CACHE_SHIFT=7 -CONFIG_X86_L1_CACHE_SHIFT=7 -# CONFIG_X86_LONGHAUL is not set -CONFIG_X86_NEED_RELOCS=y -CONFIG_X86_PAE=y -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PKG_TEMP_THERMAL=y -# CONFIG_X86_PMEM_LEGACY is not set -CONFIG_X86_PM_TIMER=y -# CONFIG_X86_POWERNOW_K8 is not set -CONFIG_XEN=y -CONFIG_XENFS=y -CONFIG_XEN_ACPI=y -CONFIG_XEN_AUTO_XLATE=y -# CONFIG_XEN_BACKEND is not set -CONFIG_XEN_BALLOON=y -CONFIG_XEN_BLKDEV_FRONTEND=y -CONFIG_XEN_COMPAT_XENFS=y -CONFIG_XEN_DEBUG_FS=y -CONFIG_XEN_DEV_EVTCHN=y -CONFIG_XEN_FBDEV_FRONTEND=y -CONFIG_XEN_GNTDEV=y -CONFIG_XEN_GRANT_DEV_ALLOC=y -CONFIG_XEN_NETDEV_FRONTEND=y -CONFIG_XEN_PCIDEV_FRONTEND=y -CONFIG_XEN_PRIVCMD=y -CONFIG_XEN_PVH=y -CONFIG_XEN_PVHVM=y -CONFIG_XEN_PVHVM_SMP=y -CONFIG_XEN_SAVE_RESTORE=y -CONFIG_XEN_SCSI_FRONTEND=y -CONFIG_XEN_SYS_HYPERVISOR=y -CONFIG_XEN_WDT=y -CONFIG_XEN_XENBUS_FRONTEND=y -CONFIG_XPS=y -CONFIG_ZLIB_DEFLATE=y diff --git a/target/linux/x86/generic/config-5.15 b/target/linux/x86/generic/config-5.15 new file mode 100644 index 0000000000..4b513f64ad --- /dev/null +++ b/target/linux/x86/generic/config-5.15 @@ -0,0 +1,467 @@ +# CONFIG_3C515 is not set +CONFIG_ACPI=y +CONFIG_ACPI_AC=y +CONFIG_ACPI_BATTERY=y +# CONFIG_ACPI_BGRT is not set +CONFIG_ACPI_BUTTON=y +# CONFIG_ACPI_CMPC is not set +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_CPU_FREQ_PSS=y +# CONFIG_ACPI_DEBUG is not set +# CONFIG_ACPI_DEBUGGER is not set +# CONFIG_ACPI_DOCK is not set +# CONFIG_ACPI_DPTF is not set +# CONFIG_ACPI_EC_DEBUGFS is not set +# CONFIG_ACPI_FAN is not set +CONFIG_ACPI_HOTPLUG_CPU=y +CONFIG_ACPI_HOTPLUG_IOAPIC=y +# CONFIG_ACPI_I2C_OPREGION is not set +CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y +# CONFIG_ACPI_PCI_SLOT is not set +CONFIG_ACPI_PROCESSOR=y +# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set +CONFIG_ACPI_PROCESSOR_CSTATE=y +CONFIG_ACPI_PROCESSOR_IDLE=y +CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y +# CONFIG_ACPI_SBS is not set +CONFIG_ACPI_SPCR_TABLE=y +CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y +CONFIG_ACPI_TAD=y +CONFIG_ACPI_THERMAL=y +CONFIG_ACPI_VIDEO=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ADV_SWBUTTON is not set +CONFIG_AGP=y +# CONFIG_AGP_ALI is not set +# CONFIG_AGP_AMD is not set +# CONFIG_AGP_AMD64 is not set +# CONFIG_AGP_ATI is not set +# CONFIG_AGP_EFFICEON is not set +CONFIG_AGP_INTEL=y +# CONFIG_AGP_NVIDIA is not set +# CONFIG_AGP_SIS is not set +# CONFIG_AGP_SWORKS is not set +# CONFIG_AGP_VIA is not set +# CONFIG_AMD_PMC is not set +# CONFIG_APM is not set +CONFIG_ARCH_CPUIDLE_HALTPOLL=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BALLOON_COMPACTION=y +CONFIG_BLK_DEV_SR=y +CONFIG_BLK_MQ_VIRTIO=y +CONFIG_BLK_PM=y +# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set +CONFIG_BTT=y +CONFIG_CDROM=y +CONFIG_CONNECTOR=y +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y +# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set +CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_CPU_RMAP=y +CONFIG_CRYPTO_BLAKE2S=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CS89x0_ISA is not set +# CONFIG_DEBUG_HOTPLUG_CPU0 is not set +CONFIG_DMA_ACPI=y +CONFIG_DMA_SHARED_BUFFER=y +CONFIG_DRM=y +CONFIG_DRM_BOCHS=y +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=100 +CONFIG_DRM_GEM_SHMEM_HELPER=y +# CONFIG_DRM_HYPERV is not set +CONFIG_DRM_I915=y +CONFIG_DRM_I915_CAPTURE_ERROR=y +CONFIG_DRM_I915_COMPRESS_ERROR=y +# CONFIG_DRM_I915_DEBUG is not set +# CONFIG_DRM_I915_DEBUG_GUC is not set +# CONFIG_DRM_I915_DEBUG_MMIO is not set +# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set +# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set +CONFIG_DRM_I915_FENCE_TIMEOUT=10000 +CONFIG_DRM_I915_FORCE_PROBE="" +CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 +# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set +CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 +CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 +CONFIG_DRM_I915_REQUEST_TIMEOUT=20000 +# CONFIG_DRM_I915_SELFTEST is not set +CONFIG_DRM_I915_STOP_TIMEOUT=100 +# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set +# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set +CONFIG_DRM_I915_TIMESLICE_DURATION=1 +CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 +CONFIG_DRM_I915_USERPTR=y +# CONFIG_DRM_I915_WERROR is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_MIPI_DSI=y +CONFIG_DRM_PANEL=y +CONFIG_DRM_PANEL_BRIDGE=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_DRM_TTM=y +CONFIG_DRM_TTM_HELPER=y +CONFIG_DRM_VIRTIO_GPU=y +CONFIG_DRM_VRAM_HELPER=y +CONFIG_EFI=y +CONFIG_EFIVAR_FS=m +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH is not set +# CONFIG_EFI_CUSTOM_SSDT_OVERLAYS is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_EARLYCON=y +CONFIG_EFI_ESRT=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y +# CONFIG_EFI_PGT_DUMP is not set +# CONFIG_EFI_RCI2_TABLE is not set +CONFIG_EFI_RUNTIME_MAP=y +CONFIG_EFI_RUNTIME_WRAPPERS=y +CONFIG_EFI_STUB=y +# CONFIG_EFI_TEST is not set +# CONFIG_EFI_VARS is not set +# CONFIG_EL3 is not set +CONFIG_FAILOVER=y +CONFIG_FB=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_CMDLINE=y +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_EFI=y +CONFIG_FB_HYPERV=y +# CONFIG_FB_I810 is not set +CONFIG_FB_SIMPLE=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_FOPS=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_VESA is not set +CONFIG_FONT_8x16=y +CONFIG_FONT_8x8=y +CONFIG_FONT_SUPPORT=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +CONFIG_FREEZER=y +CONFIG_FW_CACHE=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_GENERIC_PINCONF=y +CONFIG_GPIOLIB_IRQCHIP=y +CONFIG_GPIO_ACPI=y +CONFIG_GPIO_CDEV=y +CONFIG_GUP_GET_PTE_LOW_HIGH=y +CONFIG_HALTPOLL_CPUIDLE=y +CONFIG_HDMI=y +CONFIG_HIBERNATE_CALLBACKS=y +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HID_GENERIC=y +CONFIG_HID_HYPERV_MOUSE=y +# CONFIG_HIGHMEM4G is not set +CONFIG_HIGHMEM64G=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HOTPLUG_PCI=y +CONFIG_HOTPLUG_PCI_ACPI=y +# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set +# CONFIG_HOTPLUG_PCI_COMPAQ is not set +# CONFIG_HOTPLUG_PCI_CPCI is not set +# CONFIG_HOTPLUG_PCI_IBM is not set +CONFIG_HOTPLUG_PCI_PCIE=y +# CONFIG_HOTPLUG_PCI_SHPC is not set +CONFIG_HOTPLUG_SMT=y +CONFIG_HPET=y +CONFIG_HPET_MMAP=y +# CONFIG_HP_ACCEL is not set +CONFIG_HVC_DRIVER=y +CONFIG_HVC_IRQ=y +CONFIG_HVC_XEN=y +CONFIG_HVC_XEN_FRONTEND=y +CONFIG_HWMON=y +CONFIG_HWMON_VID=y +CONFIG_HW_RANDOM_VIRTIO=y +CONFIG_HYPERV=y +CONFIG_HYPERVISOR_GUEST=y +CONFIG_HYPERV_BALLOON=y +CONFIG_HYPERV_KEYBOARD=y +CONFIG_HYPERV_NET=y +CONFIG_HYPERV_STORAGE=y +# CONFIG_HYPERV_TESTING is not set +CONFIG_HYPERV_TIMER=y +CONFIG_HYPERV_UTILS=y +CONFIG_I2C=y +CONFIG_I2C_ALGOBIT=y +# CONFIG_I2C_AMD_MP2 is not set +CONFIG_I2C_BOARDINFO=y +# CONFIG_I2C_HID_ACPI is not set +# CONFIG_I2C_MULTI_INSTANTIATE is not set +# CONFIG_I8K is not set +# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set +CONFIG_INPUT_MOUSE=y +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y +CONFIG_INTEL_GTT=y +CONFIG_INTEL_IDLE=y +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_MEI_HDCP is not set +# CONFIG_INTEL_MENLOW is not set +CONFIG_INTEL_PCH_THERMAL=y +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +CONFIG_INTEL_SOC_DTS_IOSF_CORE=y +CONFIG_INTEL_SOC_DTS_THERMAL=y +CONFIG_INTERVAL_TREE=y +CONFIG_IOSF_MBI=y +# CONFIG_IOSF_MBI_DEBUG is not set +CONFIG_IRQ_BYPASS_MANAGER=y +CONFIG_ISA=y +CONFIG_ISAPNP=y +CONFIG_ISA_BUS_API=y +# CONFIG_ISCSI_IBFT is not set +CONFIG_ISO9660_FS=y +# CONFIG_JOLIET is not set +CONFIG_KCMP=y +CONFIG_KVM=y +CONFIG_KVM_AMD=y +CONFIG_KVM_ASYNC_PF=y +CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y +CONFIG_KVM_GUEST=y +CONFIG_KVM_INTEL=y +CONFIG_KVM_MMIO=y +CONFIG_KVM_VFIO=y +# CONFIG_KVM_XEN is not set +CONFIG_KVM_XFER_TO_GUEST_WORK=y +# CONFIG_LANCE is not set +CONFIG_LIBNVDIMM=y +CONFIG_LOCK_SPIN_ON_OWNER=y +# CONFIG_M686 is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_MEMORY_BALLOON=y +CONFIG_MEMREGION=y +CONFIG_MFD_CORE=y +CONFIG_MFD_INTEL_LPSS=y +CONFIG_MFD_INTEL_LPSS_ACPI=y +# CONFIG_MFD_INTEL_PMC_BXT is not set +# CONFIG_MIXCOMWD is not set +CONFIG_MMC=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_CQHCI=y +CONFIG_MMC_RICOH_MMC=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_IO_ACCESSORS=y +CONFIG_MMC_SDHCI_PCI=y +# CONFIG_MMC_SDHCI_PLTFM is not set +# CONFIG_MMC_WBSD is not set +CONFIG_MMU_NOTIFIER=y +# CONFIG_MOUSE_BCM5974 is not set +# CONFIG_MOUSE_CYAPA is not set +CONFIG_MOUSE_PS2=y +CONFIG_MOUSE_PS2_ALPS=y +# CONFIG_MOUSE_PS2_BYD is not set +# CONFIG_MOUSE_PS2_CYPRESS is not set +# CONFIG_MOUSE_PS2_ELANTECH is not set +CONFIG_MOUSE_PS2_LIFEBOOK=y +CONFIG_MOUSE_PS2_LOGIPS2PP=y +CONFIG_MOUSE_PS2_SMBUS=y +CONFIG_MOUSE_PS2_SYNAPTICS=y +CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y +# CONFIG_MOUSE_PS2_TOUCHKIT is not set +CONFIG_MOUSE_PS2_TRACKPOINT=y +# CONFIG_MOUSE_PS2_VMMOUSE is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_MPENTIUM4=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_ND_BLK=y +CONFIG_ND_BTT=y +CONFIG_ND_CLAIM=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NET_FAILOVER=y +CONFIG_NET_FLOW_LIMIT=y +CONFIG_NET_PTP_CLASSIFY=y +CONFIG_NO_HZ=y +CONFIG_NR_CPUS=4 +CONFIG_NR_CPUS_DEFAULT=8 +CONFIG_NR_CPUS_RANGE_BEGIN=2 +CONFIG_NR_CPUS_RANGE_END=8 +CONFIG_PADATA=y +CONFIG_PAGE_POOL=y +CONFIG_PAGE_REPORTING=y +CONFIG_PAGE_TABLE_ISOLATION=y +CONFIG_PARAVIRT=y +CONFIG_PARAVIRT_CLOCK=y +# CONFIG_PARAVIRT_DEBUG is not set +CONFIG_PARAVIRT_SPINLOCKS=y +CONFIG_PATA_AMD=y +CONFIG_PATA_ATIIXP=y +CONFIG_PATA_MPIIX=y +CONFIG_PATA_OLDPIIX=y +CONFIG_PATA_PLATFORM=y +CONFIG_PATA_SC1200=y +CONFIG_PATA_TIMINGS=y +CONFIG_PATA_VIA=y +# CONFIG_PCENGINES_APU2 is not set +CONFIG_PCIEAER=y +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_PERFORMANCE is not set +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +CONFIG_PCIEPORTBUS=y +CONFIG_PCIE_PME=y +CONFIG_PCI_MMCONFIG=y +CONFIG_PCI_XEN=y +# CONFIG_PCWATCHDOG is not set +CONFIG_PGTABLE_LEVELS=3 +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_ALDERLAKE=y +CONFIG_PINCTRL_BAYTRAIL=y +CONFIG_PINCTRL_BROXTON=y +CONFIG_PINCTRL_CANNONLAKE=y +CONFIG_PINCTRL_CHERRYVIEW=y +CONFIG_PINCTRL_DENVERTON=y +CONFIG_PINCTRL_ELKHARTLAKE=y +CONFIG_PINCTRL_EMMITSBURG=y +CONFIG_PINCTRL_GEMINILAKE=y +CONFIG_PINCTRL_INTEL=y +CONFIG_PINCTRL_JASPERLAKE=y +CONFIG_PINCTRL_LAKEFIELD=y +CONFIG_PINCTRL_LEWISBURG=y +CONFIG_PINCTRL_LYNXPOINT=y +CONFIG_PINCTRL_SUNRISEPOINT=y +CONFIG_PINCTRL_TIGERLAKE=y +CONFIG_PM=y +# CONFIG_PMIC_OPREGION is not set +CONFIG_PM_CLK=y +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_PNP=y +CONFIG_PNPACPI=y +# CONFIG_PNPBIOS is not set +CONFIG_PNP_DEBUG_MESSAGES=y +CONFIG_PPS=y +CONFIG_PREEMPT_NOTIFIERS=y +CONFIG_PROC_EVENTS=y +CONFIG_PTP_1588_CLOCK=y +CONFIG_PTP_1588_CLOCK_KVM=y +CONFIG_PTP_1588_CLOCK_VMW=y +CONFIG_PVH=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_RAS=y +CONFIG_RELAY=y +CONFIG_RELOCATABLE=y +CONFIG_RESET_ATTACK_MITIGATION=y +CONFIG_RFS_ACCEL=y +CONFIG_RPS=y +CONFIG_RTC_I2C_AND_SPI=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +# CONFIG_SAMSUNG_Q10 is not set +CONFIG_SATA_AHCI=y +CONFIG_SATA_VIA=y +# CONFIG_SCHED_CORE is not set +CONFIG_SCHED_INFO=y +CONFIG_SCHED_SMT=y +# CONFIG_SCSI_FDOMAIN_ISA is not set +CONFIG_SCSI_VIRTIO=y +CONFIG_SENSORS_CORETEMP=y +CONFIG_SENSORS_FAM15H_POWER=y +CONFIG_SENSORS_I5500=y +CONFIG_SENSORS_K10TEMP=y +CONFIG_SENSORS_K8TEMP=y +CONFIG_SENSORS_VIA_CPUTEMP=y +CONFIG_SERIAL_8250_PNP=y +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SMP=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_SWIOTLB=y +CONFIG_SYNC_FILE=y +# CONFIG_SYSTEM76_ACPI is not set +CONFIG_SYS_HYPERVISOR=y +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_THERMAL_GOV_USER_SPACE=y +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_WRITABLE_TRIPS=y +# CONFIG_TOSHIBA_BT_RFKILL is not set +CONFIG_TREE_RCU=y +CONFIG_TREE_SRCU=y +# CONFIG_UCLAMP_TASK is not set +CONFIG_UCS2_STRING=y +CONFIG_USB_STORAGE=y +CONFIG_USER_RETURN_NOTIFIER=y +CONFIG_VIRTIO=y +CONFIG_VIRTIO_BALLOON=y +CONFIG_VIRTIO_BLK=y +CONFIG_VIRTIO_CONSOLE=y +CONFIG_VIRTIO_DMA_SHARED_BUFFER=y +CONFIG_VIRTIO_INPUT=y +CONFIG_VIRTIO_MMIO=y +CONFIG_VIRTIO_NET=y +CONFIG_VIRTIO_PCI=y +CONFIG_VIRTIO_PCI_LEGACY=y +CONFIG_VIRTIO_PCI_LIB=y +# CONFIG_VIRTIO_PMEM is not set +CONFIG_VIRTUALIZATION=y +CONFIG_VMAP_PFN=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_WATCHDOG_CORE=y +# CONFIG_WDT is not set +# CONFIG_WIRELESS_HOTKEY is not set +CONFIG_X86_32_SMP=y +CONFIG_X86_ACPI_CPUFREQ=y +# CONFIG_X86_ACPI_CPUFREQ_CPB is not set +CONFIG_X86_AMD_FREQ_SENSITIVITY=y +CONFIG_X86_AMD_PLATFORM_DEVICE=y +# CONFIG_X86_BIGSMP is not set +CONFIG_X86_CPUID=y +# CONFIG_X86_E_POWERSAVER is not set +CONFIG_X86_HV_CALLBACK_VECTOR=y +CONFIG_X86_INTEL_LPSS=y +CONFIG_X86_INTEL_PSTATE=y +CONFIG_X86_INTERNODE_CACHE_SHIFT=7 +CONFIG_X86_L1_CACHE_SHIFT=7 +# CONFIG_X86_LONGHAUL is not set +CONFIG_X86_NEED_RELOCS=y +CONFIG_X86_PAE=y +# CONFIG_X86_PCC_CPUFREQ is not set +CONFIG_X86_PKG_TEMP_THERMAL=y +# CONFIG_X86_PMEM_LEGACY is not set +CONFIG_X86_PM_TIMER=y +# CONFIG_X86_POWERNOW_K8 is not set +CONFIG_XEN=y +CONFIG_XENFS=y +CONFIG_XEN_ACPI=y +CONFIG_XEN_AUTO_XLATE=y +# CONFIG_XEN_BACKEND is not set +CONFIG_XEN_BALLOON=y +CONFIG_XEN_BLKDEV_FRONTEND=y +CONFIG_XEN_COMPAT_XENFS=y +CONFIG_XEN_DEBUG_FS=y +CONFIG_XEN_DEV_EVTCHN=y +CONFIG_XEN_FBDEV_FRONTEND=y +CONFIG_XEN_GNTDEV=y +CONFIG_XEN_GRANT_DEV_ALLOC=y +CONFIG_XEN_NETDEV_FRONTEND=y +CONFIG_XEN_PRIVCMD=y +CONFIG_XEN_PVH=y +CONFIG_XEN_PVHVM=y +CONFIG_XEN_PVHVM_GUEST=y +CONFIG_XEN_PVHVM_SMP=y +CONFIG_XEN_SAVE_RESTORE=y +CONFIG_XEN_SCSI_FRONTEND=y +CONFIG_XEN_SYS_HYPERVISOR=y +CONFIG_XEN_WDT=y +CONFIG_XEN_XENBUS_FRONTEND=y +CONFIG_XPS=y +CONFIG_ZLIB_DEFLATE=y diff --git a/target/linux/x86/geode/config-5.10 b/target/linux/x86/geode/config-5.10 deleted file mode 100644 index 1cb3bad952..0000000000 --- a/target/linux/x86/geode/config-5.10 +++ /dev/null @@ -1,139 +0,0 @@ -# CONFIG_3C515 is not set -CONFIG_8139CP=y -CONFIG_8139TOO=y -CONFIG_8139TOO_8129=y -CONFIG_8139TOO_PIO=y -# CONFIG_8139TOO_TUNE_TWISTER is not set -# CONFIG_8139_OLD_RX_RESET is not set -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -# CONFIG_ACPI_BATTERY is not set -# CONFIG_ACPI_CMPC is not set -# CONFIG_ACPI_CONTAINER is not set -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -CONFIG_ACPI_FAN=y -CONFIG_ACPI_HOTPLUG_IOAPIC=y -CONFIG_ACPI_I2C_OPREGION=y -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -CONFIG_ACPI_THERMAL=y -# CONFIG_ACPI_TINY_POWER_BUTTON is not set -# CONFIG_ACPI_WMI is not set -CONFIG_ALIX=y -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -# CONFIG_ATA_PIIX is not set -CONFIG_CRYPTO_BLAKE2S=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_CS5535_CLOCK_EVENT_SRC=y -CONFIG_CS5535_MFGPT=y -CONFIG_CS5535_MFGPT_DEFAULT_IRQ=7 -CONFIG_DMA_ACPI=y -# CONFIG_EL3 is not set -CONFIG_GEODE_WDT=y -CONFIG_GEOS=y -CONFIG_GPIOLIB=y -CONFIG_GPIO_ACPI=y -CONFIG_GPIO_CS5535=y -# CONFIG_HPET is not set -# CONFIG_HP_ACCEL is not set -CONFIG_HWMON=y -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -CONFIG_I2C_ALGOPCA=y -CONFIG_I2C_ALGOPCF=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_MULTI_INSTANTIATE is not set -# CONFIG_INTEL_IPS is not set -# CONFIG_INTEL_MENLOW is not set -# CONFIG_INTEL_SCU_PLATFORM is not set -# CONFIG_INTEL_SOC_DTS_THERMAL is not set -CONFIG_IOSF_MBI=y -# CONFIG_IOSF_MBI_DEBUG is not set -CONFIG_ISA=y -# CONFIG_ISAPNP is not set -CONFIG_ISA_BUS_API=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_LANCE is not set -CONFIG_LEDS_GPIO=y -# CONFIG_M686 is not set -# CONFIG_MDA_CONSOLE is not set -CONFIG_MFD_CORE=y -CONFIG_MFD_CS5535=y -# CONFIG_MFD_INTEL_LPSS_ACPI is not set -# CONFIG_MFD_INTEL_PMC_BXT is not set -CONFIG_MGEODEGX1=y -# CONFIG_MIXCOMWD is not set -CONFIG_NATSEMI=y -CONFIG_NET5501=y -CONFIG_NSC_GPIO=y -CONFIG_PATA_CS5520=y -CONFIG_PATA_CS5530=y -CONFIG_PATA_CS5535=y -CONFIG_PATA_CS5536=y -CONFIG_PATA_SC1200=y -CONFIG_PC8736x_GPIO=y -# CONFIG_PCENGINES_APU2 is not set -CONFIG_PCI_MMCONFIG=y -# CONFIG_PCWATCHDOG is not set -CONFIG_PINCTRL=y -# CONFIG_PINCTRL_BAYTRAIL is not set -# CONFIG_PINCTRL_BROXTON is not set -# CONFIG_PINCTRL_CANNONLAKE is not set -# CONFIG_PINCTRL_CHERRYVIEW is not set -# CONFIG_PINCTRL_DENVERTON is not set -# CONFIG_PINCTRL_EMMITSBURG is not set -# CONFIG_PINCTRL_GEMINILAKE is not set -# CONFIG_PINCTRL_JASPERLAKE is not set -# CONFIG_PINCTRL_LEWISBURG is not set -# CONFIG_PINCTRL_LYNXPOINT is not set -# CONFIG_PINCTRL_SUNRISEPOINT is not set -# CONFIG_PINCTRL_TIGERLAKE is not set -# CONFIG_PMIC_OPREGION is not set -CONFIG_PNP=y -CONFIG_PNPACPI=y -# CONFIG_PNPBIOS is not set -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_RTC_I2C_AND_SPI=y -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SC1200_WDT=y -# CONFIG_SCSI_FDOMAIN_ISA is not set -CONFIG_SCx200_ACB=y -CONFIG_SCx200_WDT=y -# CONFIG_SENSORS_AMD_ENERGY is not set -CONFIG_SENSORS_LM90=y -CONFIG_SERIAL_8250_PNP=y -CONFIG_SERIAL_MCTRL_GPIO=y -# CONFIG_SURFACE_3_POWER_OPREGION is not set -# CONFIG_SURFACE_PRO3_BUTTON is not set -# CONFIG_SYSTEM76_ACPI is not set -# CONFIG_TOSHIBA_BT_RFKILL is not set -# CONFIG_USB_UHCI_HCD is not set -CONFIG_VIA_RHINE=y -CONFIG_VIA_RHINE_MMIO=y -# CONFIG_WDT is not set -# CONFIG_X86_ACPI_CPUFREQ is not set -CONFIG_X86_ALIGNMENT_16=y -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -CONFIG_X86_CPUID=y -# CONFIG_X86_E_POWERSAVER is not set -CONFIG_X86_INTEL_LPSS=y -# CONFIG_X86_LONGHAUL is not set -# CONFIG_X86_MCE is not set -CONFIG_X86_MINIMUM_CPU_FAMILY=5 -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PM_TIMER=y -CONFIG_X86_REBOOTFIXUPS=y diff --git a/target/linux/x86/geode/config-5.15 b/target/linux/x86/geode/config-5.15 new file mode 100644 index 0000000000..2ede23ea5e --- /dev/null +++ b/target/linux/x86/geode/config-5.15 @@ -0,0 +1,148 @@ +# CONFIG_3C515 is not set +CONFIG_8139CP=y +CONFIG_8139TOO=y +CONFIG_8139TOO_8129=y +CONFIG_8139TOO_PIO=y +# CONFIG_8139TOO_TUNE_TWISTER is not set +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_ACPI=y +CONFIG_ACPI_AC=y +# CONFIG_ACPI_BATTERY is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_ACPI_CONTAINER is not set +CONFIG_ACPI_CPU_FREQ_PSS=y +# CONFIG_ACPI_DEBUG is not set +# CONFIG_ACPI_DEBUGGER is not set +# CONFIG_ACPI_DOCK is not set +# CONFIG_ACPI_DPTF is not set +# CONFIG_ACPI_EC_DEBUGFS is not set +CONFIG_ACPI_FAN=y +CONFIG_ACPI_HOTPLUG_IOAPIC=y +CONFIG_ACPI_I2C_OPREGION=y +CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y +# CONFIG_ACPI_PCI_SLOT is not set +CONFIG_ACPI_PROCESSOR=y +# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set +CONFIG_ACPI_PROCESSOR_CSTATE=y +CONFIG_ACPI_PROCESSOR_IDLE=y +CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y +# CONFIG_ACPI_SBS is not set +CONFIG_ACPI_SPCR_TABLE=y +CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y +CONFIG_ACPI_THERMAL=y +# CONFIG_ACPI_TINY_POWER_BUTTON is not set +# CONFIG_ACPI_WMI is not set +# CONFIG_ADV_SWBUTTON is not set +CONFIG_ALIX=y +# CONFIG_AMD_PMC is not set +CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y +# CONFIG_ATA_PIIX is not set +CONFIG_CRYPTO_BLAKE2S=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CS5535_CLOCK_EVENT_SRC=y +CONFIG_CS5535_MFGPT=y +CONFIG_CS5535_MFGPT_DEFAULT_IRQ=7 +# CONFIG_CS89x0_ISA is not set +CONFIG_DMA_ACPI=y +# CONFIG_EL3 is not set +CONFIG_GEODE_WDT=y +CONFIG_GEOS=y +CONFIG_GPIO_ACPI=y +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_CS5535=y +# CONFIG_HPET is not set +# CONFIG_HP_ACCEL is not set +CONFIG_HWMON=y +CONFIG_I2C=y +CONFIG_I2C_ALGOBIT=y +CONFIG_I2C_ALGOPCA=y +CONFIG_I2C_ALGOPCF=y +# CONFIG_I2C_AMD_MP2 is not set +CONFIG_I2C_BOARDINFO=y +# CONFIG_I2C_HID_ACPI is not set +# CONFIG_I2C_MULTI_INSTANTIATE is not set +# CONFIG_I8K is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_INTEL_SOC_DTS_THERMAL is not set +CONFIG_IOSF_MBI=y +# CONFIG_IOSF_MBI_DEBUG is not set +CONFIG_ISA=y +# CONFIG_ISAPNP is not set +CONFIG_ISA_BUS_API=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_LANCE is not set +CONFIG_LEDS_GPIO=y +# CONFIG_M686 is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_MFD_CORE=y +CONFIG_MFD_CS5535=y +# CONFIG_MFD_INTEL_LPSS_ACPI is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set +CONFIG_MGEODEGX1=y +# CONFIG_MIXCOMWD is not set +CONFIG_NATSEMI=y +CONFIG_NET5501=y +CONFIG_NSC_GPIO=y +CONFIG_PATA_CS5520=y +CONFIG_PATA_CS5530=y +CONFIG_PATA_CS5535=y +CONFIG_PATA_CS5536=y +CONFIG_PATA_SC1200=y +CONFIG_PC8736x_GPIO=y +# CONFIG_PCENGINES_APU2 is not set +CONFIG_PCI_MMCONFIG=y +# CONFIG_PCWATCHDOG is not set +CONFIG_PINCTRL=y +# CONFIG_PINCTRL_ALDERLAKE is not set +# CONFIG_PINCTRL_BAYTRAIL is not set +# CONFIG_PINCTRL_BROXTON is not set +# CONFIG_PINCTRL_CANNONLAKE is not set +# CONFIG_PINCTRL_CHERRYVIEW is not set +# CONFIG_PINCTRL_DENVERTON is not set +# CONFIG_PINCTRL_ELKHARTLAKE is not set +# CONFIG_PINCTRL_EMMITSBURG is not set +# CONFIG_PINCTRL_GEMINILAKE is not set +# CONFIG_PINCTRL_JASPERLAKE is not set +# CONFIG_PINCTRL_LAKEFIELD is not set +# CONFIG_PINCTRL_LEWISBURG is not set +# CONFIG_PINCTRL_LYNXPOINT is not set +# CONFIG_PINCTRL_SUNRISEPOINT is not set +# CONFIG_PINCTRL_TIGERLAKE is not set +# CONFIG_PMIC_OPREGION is not set +CONFIG_PNP=y +CONFIG_PNPACPI=y +# CONFIG_PNPBIOS is not set +CONFIG_PNP_DEBUG_MESSAGES=y +CONFIG_RTC_I2C_AND_SPI=y +# CONFIG_SAMSUNG_Q10 is not set +CONFIG_SC1200_WDT=y +# CONFIG_SCSI_FDOMAIN_ISA is not set +CONFIG_SCx200_ACB=y +CONFIG_SCx200_WDT=y +CONFIG_SENSORS_LM90=y +CONFIG_SERIAL_8250_PNP=y +CONFIG_SERIAL_MCTRL_GPIO=y +# CONFIG_SURFACE_PLATFORMS is not set +# CONFIG_SYSTEM76_ACPI is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_USB_UHCI_HCD is not set +CONFIG_VIA_RHINE=y +CONFIG_VIA_RHINE_MMIO=y +CONFIG_WATCHDOG_CORE=y +# CONFIG_WDT is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_X86_ACPI_CPUFREQ is not set +CONFIG_X86_ALIGNMENT_16=y +# CONFIG_X86_AMD_PLATFORM_DEVICE is not set +CONFIG_X86_CPUID=y +# CONFIG_X86_E_POWERSAVER is not set +CONFIG_X86_INTEL_LPSS=y +# CONFIG_X86_LONGHAUL is not set +# CONFIG_X86_MCE is not set +CONFIG_X86_MINIMUM_CPU_FAMILY=5 +# CONFIG_X86_PCC_CPUFREQ is not set +CONFIG_X86_PM_TIMER=y +CONFIG_X86_REBOOTFIXUPS=y diff --git a/target/linux/x86/legacy/config-5.10 b/target/linux/x86/legacy/config-5.10 deleted file mode 100644 index 12330ba92f..0000000000 --- a/target/linux/x86/legacy/config-5.10 +++ /dev/null @@ -1,220 +0,0 @@ -# CONFIG_3C515 is not set -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -CONFIG_ACPI_BATTERY=y -CONFIG_ACPI_BUTTON=y -# CONFIG_ACPI_CMPC is not set -# CONFIG_ACPI_CONTAINER is not set -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -# CONFIG_ACPI_FAN is not set -CONFIG_ACPI_HOTPLUG_IOAPIC=y -# CONFIG_ACPI_I2C_OPREGION is not set -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -CONFIG_ACPI_THERMAL=y -CONFIG_ACPI_VIDEO=y -# CONFIG_ACPI_WMI is not set -CONFIG_AGP=y -# CONFIG_AGP_ALI is not set -# CONFIG_AGP_AMD is not set -# CONFIG_AGP_AMD64 is not set -# CONFIG_AGP_ATI is not set -# CONFIG_AGP_EFFICEON is not set -CONFIG_AGP_INTEL=y -# CONFIG_AGP_NVIDIA is not set -# CONFIG_AGP_SIS is not set -# CONFIG_AGP_SWORKS is not set -# CONFIG_AGP_VIA is not set -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BLK_DEV_SR=y -CONFIG_CDROM=y -CONFIG_CPU_IDLE_GOV_MENU=y -CONFIG_CRYPTO_BLAKE2S=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -CONFIG_DMA_ACPI=y -CONFIG_DMA_SHARED_BUFFER=y -CONFIG_DRM=y -CONFIG_DRM_AMDGPU=y -# CONFIG_DRM_AMD_DC is not set -CONFIG_DRM_BOCHS=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=100 -CONFIG_DRM_I915=y -CONFIG_DRM_I915_CAPTURE_ERROR=y -CONFIG_DRM_I915_COMPRESS_ERROR=y -# CONFIG_DRM_I915_DEBUG is not set -# CONFIG_DRM_I915_DEBUG_GUC is not set -# CONFIG_DRM_I915_DEBUG_MMIO is not set -# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set -# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set -CONFIG_DRM_I915_FENCE_TIMEOUT=10000 -CONFIG_DRM_I915_FORCE_PROBE="" -CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 -# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set -CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 -CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 -# CONFIG_DRM_I915_SELFTEST is not set -CONFIG_DRM_I915_STOP_TIMEOUT=100 -# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set -# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set -CONFIG_DRM_I915_TIMESLICE_DURATION=1 -CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 -CONFIG_DRM_I915_USERPTR=y -# CONFIG_DRM_I915_WERROR is not set -CONFIG_DRM_KMS_FB_HELPER=y -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_MIPI_DSI=y -CONFIG_DRM_PANEL=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -CONFIG_DRM_RADEON=y -CONFIG_DRM_SCHED=y -CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_HELPER=y -CONFIG_DRM_VRAM_HELPER=y -# CONFIG_EL3 is not set -CONFIG_FB=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_CMDLINE=y -CONFIG_FB_DEFERRED_IO=y -# CONFIG_FB_I810 is not set -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_VESA is not set -CONFIG_FONT_8x16=y -CONFIG_FONT_8x8=y -CONFIG_FONT_SUPPORT=y -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -CONFIG_HDMI=y -CONFIG_HID_BATTERY_STRENGTH=y -# CONFIG_HIGHMEM4G is not set -CONFIG_HPET=y -CONFIG_HPET_MMAP=y -# CONFIG_HP_ACCEL is not set -CONFIG_HWMON=y -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_MULTI_INSTANTIATE is not set -CONFIG_INPUT_MOUSE=y -CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INTEL_GTT=y -CONFIG_INTEL_IDLE=y -# CONFIG_INTEL_IPS is not set -# CONFIG_INTEL_MEI_HDCP is not set -# CONFIG_INTEL_MENLOW is not set -# CONFIG_INTEL_SCU_PLATFORM is not set -# CONFIG_INTEL_SOC_DTS_THERMAL is not set -CONFIG_INTERVAL_TREE=y -CONFIG_IOSF_MBI=y -# CONFIG_IOSF_MBI_DEBUG is not set -CONFIG_ISA=y -CONFIG_ISAPNP=y -CONFIG_ISA_BUS_API=y -# CONFIG_ISCSI_IBFT is not set -CONFIG_ISO9660_FS=y -# CONFIG_JOLIET is not set -CONFIG_KCMP=y -# CONFIG_LANCE is not set -CONFIG_M586MMX=y -# CONFIG_M686 is not set -# CONFIG_MDA_CONSOLE is not set -CONFIG_MFD_CORE=y -CONFIG_MFD_INTEL_LPSS=y -CONFIG_MFD_INTEL_LPSS_ACPI=y -# CONFIG_MFD_INTEL_PMC_BXT is not set -# CONFIG_MIXCOMWD is not set -CONFIG_MMU_NOTIFIER=y -# CONFIG_MOUSE_BCM5974 is not set -# CONFIG_MOUSE_CYAPA is not set -CONFIG_MOUSE_PS2=y -CONFIG_MOUSE_PS2_ALPS=y -# CONFIG_MOUSE_PS2_BYD is not set -# CONFIG_MOUSE_PS2_CYPRESS is not set -# CONFIG_MOUSE_PS2_ELANTECH is not set -CONFIG_MOUSE_PS2_LIFEBOOK=y -CONFIG_MOUSE_PS2_LOGIPS2PP=y -CONFIG_MOUSE_PS2_SMBUS=y -CONFIG_MOUSE_PS2_SYNAPTICS=y -CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y -# CONFIG_MOUSE_PS2_TOUCHKIT is not set -CONFIG_MOUSE_PS2_TRACKPOINT=y -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_VSXXXAA is not set -CONFIG_NOHIGHMEM=y -CONFIG_NO_HZ=y -CONFIG_PATA_AMD=y -CONFIG_PATA_ATIIXP=y -CONFIG_PATA_LEGACY=y -CONFIG_PATA_MPIIX=y -CONFIG_PATA_OLDPIIX=y -CONFIG_PATA_PLATFORM=y -CONFIG_PATA_SC1200=y -CONFIG_PATA_SIS=y -CONFIG_PATA_TIMINGS=y -CONFIG_PATA_VIA=y -CONFIG_PCIEAER=y -CONFIG_PCIEPORTBUS=y -CONFIG_PCI_MMCONFIG=y -# CONFIG_PCWATCHDOG is not set -# CONFIG_PMIC_OPREGION is not set -CONFIG_PNP=y -CONFIG_PNPACPI=y -# CONFIG_PNPBIOS is not set -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_RAS=y -CONFIG_RELAY=y -CONFIG_RTC_I2C_AND_SPI=y -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SATA_AHCI=y -# CONFIG_SCSI_FDOMAIN_ISA is not set -# CONFIG_SENSORS_AMD_ENERGY is not set -CONFIG_SERIAL_8250_PNP=y -# CONFIG_SURFACE_3_POWER_OPREGION is not set -# CONFIG_SURFACE_PRO3_BUTTON is not set -CONFIG_SYNC_FILE=y -# CONFIG_SYSTEM76_ACPI is not set -# CONFIG_TOSHIBA_BT_RFKILL is not set -CONFIG_USB_STORAGE=y -CONFIG_VMAP_PFN=y -# CONFIG_WDT is not set -CONFIG_X86_ACPI_CPUFREQ=y -# CONFIG_X86_ACPI_CPUFREQ_CPB is not set -CONFIG_X86_ALIGNMENT_16=y -# CONFIG_X86_AMD_FREQ_SENSITIVITY is not set -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -# CONFIG_X86_E_POWERSAVER is not set -CONFIG_X86_F00F_BUG=y -# CONFIG_X86_INTEL_LPSS is not set -# CONFIG_X86_LONGHAUL is not set -CONFIG_X86_MINIMUM_CPU_FAMILY=5 -# CONFIG_X86_PAE is not set -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PM_TIMER=y -# CONFIG_X86_POWERNOW_K8 is not set -CONFIG_ZLIB_DEFLATE=y diff --git a/target/linux/x86/legacy/config-5.15 b/target/linux/x86/legacy/config-5.15 new file mode 100644 index 0000000000..de5cd4488f --- /dev/null +++ b/target/linux/x86/legacy/config-5.15 @@ -0,0 +1,230 @@ +# CONFIG_3C515 is not set +CONFIG_ACPI=y +CONFIG_ACPI_AC=y +CONFIG_ACPI_BATTERY=y +CONFIG_ACPI_BUTTON=y +# CONFIG_ACPI_CMPC is not set +# CONFIG_ACPI_CONTAINER is not set +CONFIG_ACPI_CPU_FREQ_PSS=y +# CONFIG_ACPI_DEBUG is not set +# CONFIG_ACPI_DEBUGGER is not set +# CONFIG_ACPI_DOCK is not set +# CONFIG_ACPI_DPTF is not set +# CONFIG_ACPI_EC_DEBUGFS is not set +# CONFIG_ACPI_FAN is not set +CONFIG_ACPI_HOTPLUG_IOAPIC=y +# CONFIG_ACPI_I2C_OPREGION is not set +CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y +# CONFIG_ACPI_PCI_SLOT is not set +CONFIG_ACPI_PROCESSOR=y +# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set +CONFIG_ACPI_PROCESSOR_CSTATE=y +CONFIG_ACPI_PROCESSOR_IDLE=y +CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y +# CONFIG_ACPI_SBS is not set +CONFIG_ACPI_SPCR_TABLE=y +CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y +CONFIG_ACPI_THERMAL=y +CONFIG_ACPI_VIDEO=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ADV_SWBUTTON is not set +CONFIG_AGP=y +# CONFIG_AGP_ALI is not set +# CONFIG_AGP_AMD is not set +# CONFIG_AGP_AMD64 is not set +# CONFIG_AGP_ATI is not set +# CONFIG_AGP_EFFICEON is not set +CONFIG_AGP_INTEL=y +# CONFIG_AGP_NVIDIA is not set +# CONFIG_AGP_SIS is not set +# CONFIG_AGP_SWORKS is not set +# CONFIG_AGP_VIA is not set +# CONFIG_AMD_PMC is not set +CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BLK_DEV_SR=y +CONFIG_CDROM=y +CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_CRYPTO_BLAKE2S=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CS89x0_ISA is not set +CONFIG_DMA_ACPI=y +CONFIG_DMA_SHARED_BUFFER=y +CONFIG_DRM=y +CONFIG_DRM_AMDGPU=y +# CONFIG_DRM_AMD_DC is not set +CONFIG_DRM_BOCHS=y +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=100 +CONFIG_DRM_I915=y +CONFIG_DRM_I915_CAPTURE_ERROR=y +CONFIG_DRM_I915_COMPRESS_ERROR=y +# CONFIG_DRM_I915_DEBUG is not set +# CONFIG_DRM_I915_DEBUG_GUC is not set +# CONFIG_DRM_I915_DEBUG_MMIO is not set +# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set +# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set +CONFIG_DRM_I915_FENCE_TIMEOUT=10000 +CONFIG_DRM_I915_FORCE_PROBE="" +CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 +# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set +CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 +CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 +CONFIG_DRM_I915_REQUEST_TIMEOUT=20000 +# CONFIG_DRM_I915_SELFTEST is not set +CONFIG_DRM_I915_STOP_TIMEOUT=100 +# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set +# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set +CONFIG_DRM_I915_TIMESLICE_DURATION=1 +CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 +CONFIG_DRM_I915_USERPTR=y +# CONFIG_DRM_I915_WERROR is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_MIPI_DSI=y +CONFIG_DRM_PANEL=y +CONFIG_DRM_PANEL_BRIDGE=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_DRM_RADEON=y +CONFIG_DRM_SCHED=y +CONFIG_DRM_TTM=y +CONFIG_DRM_TTM_HELPER=y +CONFIG_DRM_VRAM_HELPER=y +# CONFIG_EL3 is not set +CONFIG_FB=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_CMDLINE=y +CONFIG_FB_DEFERRED_IO=y +# CONFIG_FB_I810 is not set +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_FOPS=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_VESA is not set +CONFIG_FONT_8x16=y +CONFIG_FONT_8x8=y +CONFIG_FONT_SUPPORT=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +CONFIG_HDMI=y +CONFIG_HID_BATTERY_STRENGTH=y +# CONFIG_HIGHMEM4G is not set +CONFIG_HPET=y +CONFIG_HPET_MMAP=y +# CONFIG_HP_ACCEL is not set +CONFIG_HWMON=y +CONFIG_I2C=y +CONFIG_I2C_ALGOBIT=y +# CONFIG_I2C_AMD_MP2 is not set +CONFIG_I2C_BOARDINFO=y +# CONFIG_I2C_HID_ACPI is not set +# CONFIG_I2C_MULTI_INSTANTIATE is not set +# CONFIG_I8K is not set +CONFIG_INPUT_MOUSE=y +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INTEL_GTT=y +CONFIG_INTEL_IDLE=y +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_MEI_HDCP is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_INTEL_SOC_DTS_THERMAL is not set +CONFIG_INTERVAL_TREE=y +CONFIG_IOSF_MBI=y +# CONFIG_IOSF_MBI_DEBUG is not set +CONFIG_ISA=y +CONFIG_ISAPNP=y +CONFIG_ISA_BUS_API=y +# CONFIG_ISCSI_IBFT is not set +CONFIG_ISO9660_FS=y +# CONFIG_JOLIET is not set +CONFIG_KCMP=y +# CONFIG_LANCE is not set +CONFIG_M586MMX=y +# CONFIG_M686 is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_MFD_CORE=y +CONFIG_MFD_INTEL_LPSS=y +CONFIG_MFD_INTEL_LPSS_ACPI=y +# CONFIG_MFD_INTEL_PMC_BXT is not set +# CONFIG_MIXCOMWD is not set +CONFIG_MMU_NOTIFIER=y +# CONFIG_MOUSE_BCM5974 is not set +# CONFIG_MOUSE_CYAPA is not set +CONFIG_MOUSE_PS2=y +CONFIG_MOUSE_PS2_ALPS=y +# CONFIG_MOUSE_PS2_BYD is not set +# CONFIG_MOUSE_PS2_CYPRESS is not set +# CONFIG_MOUSE_PS2_ELANTECH is not set +CONFIG_MOUSE_PS2_LIFEBOOK=y +CONFIG_MOUSE_PS2_LOGIPS2PP=y +CONFIG_MOUSE_PS2_SMBUS=y +CONFIG_MOUSE_PS2_SYNAPTICS=y +CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y +# CONFIG_MOUSE_PS2_TOUCHKIT is not set +CONFIG_MOUSE_PS2_TRACKPOINT=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_NOHIGHMEM=y +CONFIG_NO_HZ=y +CONFIG_PATA_AMD=y +CONFIG_PATA_ATIIXP=y +CONFIG_PATA_LEGACY=y +CONFIG_PATA_MPIIX=y +CONFIG_PATA_OLDPIIX=y +CONFIG_PATA_PLATFORM=y +CONFIG_PATA_SC1200=y +CONFIG_PATA_SIS=y +CONFIG_PATA_TIMINGS=y +CONFIG_PATA_VIA=y +CONFIG_PCIEAER=y +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_PERFORMANCE is not set +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +CONFIG_PCIEPORTBUS=y +CONFIG_PCI_MMCONFIG=y +# CONFIG_PCWATCHDOG is not set +# CONFIG_PMIC_OPREGION is not set +CONFIG_PNP=y +CONFIG_PNPACPI=y +# CONFIG_PNPBIOS is not set +CONFIG_PNP_DEBUG_MESSAGES=y +CONFIG_RAS=y +CONFIG_RELAY=y +CONFIG_RTC_I2C_AND_SPI=y +# CONFIG_SAMSUNG_Q10 is not set +CONFIG_SATA_AHCI=y +# CONFIG_SCSI_FDOMAIN_ISA is not set +CONFIG_SERIAL_8250_PNP=y +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_SYNC_FILE=y +# CONFIG_SYSTEM76_ACPI is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +CONFIG_USB_STORAGE=y +CONFIG_VMAP_PFN=y +# CONFIG_WDT is not set +# CONFIG_WIRELESS_HOTKEY is not set +CONFIG_X86_ACPI_CPUFREQ=y +# CONFIG_X86_ACPI_CPUFREQ_CPB is not set +CONFIG_X86_ALIGNMENT_16=y +# CONFIG_X86_AMD_FREQ_SENSITIVITY is not set +# CONFIG_X86_AMD_PLATFORM_DEVICE is not set +# CONFIG_X86_E_POWERSAVER is not set +CONFIG_X86_F00F_BUG=y +# CONFIG_X86_INTEL_LPSS is not set +# CONFIG_X86_LONGHAUL is not set +CONFIG_X86_MINIMUM_CPU_FAMILY=5 +# CONFIG_X86_PAE is not set +# CONFIG_X86_PCC_CPUFREQ is not set +CONFIG_X86_PM_TIMER=y +# CONFIG_X86_POWERNOW_K8 is not set +CONFIG_ZLIB_DEFLATE=y diff --git a/target/linux/x86/modules.mk b/target/linux/x86/modules.mk index 4005ee97ef..511410d614 100644 --- a/target/linux/x86/modules.mk +++ b/target/linux/x86/modules.mk @@ -2,27 +2,10 @@ # # Copyright (C) 2017 Cezary Jackiewicz -define KernelPackage/amazon-ena - SUBMENU:=$(NETWORK_DEVICES_MENU) - TITLE:=Elastic Network Adapter (for Amazon AWS T3) - DEPENDS:=@TARGET_x86_64 - KCONFIG:=CONFIG_ENA_ETHERNET - FILES:=$(LINUX_DIR)/drivers/net/ethernet/amazon/ena/ena.ko - AUTOLOAD:=$(call AutoLoad,12,ena) -endef - -define KernelPackage/amazon-ena/description - This driver supports Elastic Network Adapter (ENA) - used by Amazon AWS T3 instances. -endef - -$(eval $(call KernelPackage,amazon-ena)) - - define KernelPackage/amd-xgbe SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=AMD Ethernet on SoC support - DEPENDS:=@PCI_SUPPORT @TARGET_x86_64 +kmod-lib-crc32c +kmod-ptp +kmod-libphy +LINUX_5_10:kmod-mdio-devres + DEPENDS:=@PCI_SUPPORT @TARGET_x86_64 +kmod-lib-crc32c +kmod-ptp +kmod-libphy +kmod-mdio-devres KCONFIG:=CONFIG_AMD_XGBE FILES:=$(LINUX_DIR)/drivers/net/ethernet/amd/xgbe/amd-xgbe.ko AUTOLOAD:=$(call AutoLoad,35,amd-xgbe) @@ -35,6 +18,24 @@ endef $(eval $(call KernelPackage,amd-xgbe)) +define KernelPackage/f71808e-wdt + SUBMENU:=$(OTHER_MENU) + TITLE:=Fintek F718xx/F818xx Watchdog Timer + DEPENDS:=@TARGET_x86 + KCONFIG:=\ + CONFIG_F71808E_WDT \ + CONFIG_WATCHDOG_CORE=y + FILES:=$(LINUX_DIR)/drivers/watchdog/f71808e_wdt.ko + AUTOLOAD:=$(call AutoProbe,f71808e-wdt,1) +endef + +define KernelPackage/f71808e-wdt/description + Kernel module for the watchdog timer found on many Fintek Super-IO chips. +endef + +$(eval $(call KernelPackage,f71808e-wdt)) + + define KernelPackage/sound-cs5535audio TITLE:=CS5535/CS5536 Audio Controller DEPENDS:=@TARGET_x86_geode +kmod-ac97 @@ -67,6 +68,62 @@ endef $(eval $(call KernelPackage,sp5100-tco)) +define KernelPackage/ib700-wdt + SUBMENU:=$(OTHER_MENU) + TITLE:=IB700 SBC Watchdog Timer + DEPENDS:=@TARGET_x86 + KCONFIG:=CONFIG_IB700_WDT + FILES:=$(LINUX_DIR)/drivers/watchdog/ib700wdt.ko + AUTOLOAD:=$(call AutoLoad,50,ib700wdt,1) +endef + +define KernelPackage/ib700-wdt/description + Kernel module for the hardware watchdog on the IB700 Single + Board Computer produced by TMC Technology (www.tmc-uk.com). + Also used by QEMU/libvirt. +endef + +$(eval $(call KernelPackage,ib700-wdt)) + +define KernelPackage/it87-wdt + SUBMENU:=$(OTHER_MENU) + TITLE:=ITE IT87 Watchdog Timer + DEPENDS:=@TARGET_x86 + KCONFIG:=CONFIG_IT87_WDT + FILES:=$(LINUX_DIR)/drivers/watchdog/it87_wdt.ko + AUTOLOAD:=$(call AutoLoad,50,it87-wdt,1) + MODPARAMS.it87-wdt:= \ + nogameport=1 \ + nocir=1 +endef + +define KernelPackage/it87-wdt/description + Kernel module for ITE IT87 Watchdog Timer +endef + +$(eval $(call KernelPackage,it87-wdt)) + + +define KernelPackage/itco-wdt + SUBMENU:=$(OTHER_MENU) + TITLE:=Intel iTCO Watchdog Timer + DEPENDS:=@TARGET_x86 + KCONFIG:=\ + CONFIG_ITCO_WDT \ + CONFIG_ITCO_VENDOR_SUPPORT=y \ + CONFIG_WATCHDOG_CORE=y + FILES:=$(LINUX_DIR)/drivers/watchdog/iTCO_wdt.ko \ + $(LINUX_DIR)/drivers/watchdog/iTCO_vendor_support.ko + AUTOLOAD:=$(call AutoLoad,50,iTCO_vendor_support iTCO_wdt,1) +endef + +define KernelPackage/itco-wdt/description + Kernel module for Intel iTCO Watchdog Timer +endef + +$(eval $(call KernelPackage,itco-wdt)) + + define KernelPackage/pcengines-apuv2 SUBMENU:=$(OTHER_MENU) TITLE:=PC Engines APUv2/3 front button and LEDs driver @@ -87,8 +144,9 @@ $(eval $(call KernelPackage,pcengines-apuv2)) define KernelPackage/meraki-mx100 SUBMENU:=$(OTHER_MENU) TITLE:=Cisco Meraki MX100 Platform Driver - DEPENDS:=@TARGET_x86 @!LINUX_5_4 +kmod-tg3 +kmod-gpio-button-hotplug +kmod-leds-gpio \ - +kmod-usb-ledtrig-usbport +kmod-itco-wdt + DEPENDS:=@TARGET_x86 +kmod-tg3 +kmod-gpio-button-hotplug +kmod-leds-gpio \ + +kmod-usb-ledtrig-usbport +PACKAGE_kmod-meraki-mx100:nu801 +kmod-itco-wdt \ + +kmod-leds-uleds KCONFIG:=CONFIG_MERAKI_MX100 FILES:=$(LINUX_DIR)/drivers/platform/x86/meraki-mx100.ko AUTOLOAD:=$(call AutoLoad,60,meraki-mx100,1) @@ -102,3 +160,20 @@ define KernelPackage/meraki-mx100/description endef $(eval $(call KernelPackage,meraki-mx100)) + +define KernelPackage/w83627hf-wdt + SUBMENU:=$(OTHER_MENU) + TITLE:=Winbond 83627HF Watchdog Timer + DEPENDS:=@TARGET_x86 + KCONFIG:=\ + CONFIG_W83627HF_WDT \ + CONFIG_WATCHDOG_CORE=y + FILES:=$(LINUX_DIR)/drivers/watchdog/w83627hf_wdt.ko + AUTOLOAD:=$(call AutoLoad,50,w83627hf-wdt,1) +endef + +define KernelPackage/w83627hf-wdt/description + Kernel module for Winbond 83627HF Watchdog Timer +endef + +$(eval $(call KernelPackage,w83627hf-wdt)) diff --git a/target/linux/x86/patches-5.10/012-pcengines-apu2-detect-apuv4-board.patch b/target/linux/x86/patches-5.10/012-pcengines-apu2-detect-apuv4-board.patch deleted file mode 100644 index 520c66d292..0000000000 --- a/target/linux/x86/patches-5.10/012-pcengines-apu2-detect-apuv4-board.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 3d00da1de3ea36ba44f4a7ba76c8c8b16f98204b Mon Sep 17 00:00:00 2001 -From: "Enrico Weigelt, metux IT consult" -Date: Thu, 12 Dec 2019 14:27:56 +0100 -Subject: [PATCH] platform/x86: pcengines-apuv2: detect apuv4 board - -GPIO stuff on APUv4 seems to be the same as on APUv2, so we just -need to match on DMI data. - -Signed-off-by: Enrico Weigelt, metux IT consult -Signed-off-by: Andy Shevchenko ---- - drivers/platform/x86/pcengines-apuv2.c | 27 ++++++++++++++++++++++++++ - 1 file changed, 27 insertions(+) - ---- a/drivers/platform/x86/pcengines-apuv2.c -+++ b/drivers/platform/x86/pcengines-apuv2.c -@@ -215,6 +215,33 @@ static const struct dmi_system_id apu_gp - }, - .driver_data = (void *)&board_apu2, - }, -+ /* APU4 w/ legacy bios < 4.0.8 */ -+ { -+ .ident = "apu4", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"), -+ DMI_MATCH(DMI_BOARD_NAME, "APU4") -+ }, -+ .driver_data = (void *)&board_apu2, -+ }, -+ /* APU4 w/ legacy bios >= 4.0.8 */ -+ { -+ .ident = "apu4", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"), -+ DMI_MATCH(DMI_BOARD_NAME, "apu4") -+ }, -+ .driver_data = (void *)&board_apu2, -+ }, -+ /* APU4 w/ mainline bios */ -+ { -+ .ident = "apu4", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"), -+ DMI_MATCH(DMI_BOARD_NAME, "PC Engines apu4") -+ }, -+ .driver_data = (void *)&board_apu2, -+ }, - {} - }; - diff --git a/target/linux/x86/patches-5.10/101-v5.15-mfd-lpc_ich-Enable-GPIO-driver-for-DH89xxCC.patch b/target/linux/x86/patches-5.10/101-v5.15-mfd-lpc_ich-Enable-GPIO-driver-for-DH89xxCC.patch deleted file mode 100644 index a5bd2459ab..0000000000 --- a/target/linux/x86/patches-5.10/101-v5.15-mfd-lpc_ich-Enable-GPIO-driver-for-DH89xxCC.patch +++ /dev/null @@ -1,28 +0,0 @@ -From ef0eea5b151aefe1efea78e2fa7c507ff3c56bf0 Mon Sep 17 00:00:00 2001 -From: Chris Blake -Date: Mon, 7 Jun 2021 18:35:35 -0500 -Subject: mfd: lpc_ich: Enable GPIO driver for DH89xxCC - -Based on the Intel Datasheet for the DH89xxCC PCH, the GPIO driver -is the same as ICH_v5_GPIO, minus the fact the DH89xxCC also has -blink support. However, blink support isn't supported by the GPIO -driver so we should use ICH_v5_GPIO. Tested and working on a Meraki -MX100-HW. - -Signed-off-by: Chris Blake -Co-developed-by: Christian Lamparter -Signed-off-by: Lee Jones ---- - drivers/mfd/lpc_ich.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/mfd/lpc_ich.c -+++ b/drivers/mfd/lpc_ich.c -@@ -491,6 +491,7 @@ static struct lpc_ich_info lpc_chipset_i - [LPC_DH89XXCC] = { - .name = "DH89xxCC", - .iTCO_version = 2, -+ .gpio_version = ICH_V5_GPIO, - }, - [LPC_PPT] = { - .name = "Panther Point", diff --git a/target/linux/x86/patches-5.10/102-v5.15-platform-x86-add-meraki-mx100-platform-driver.patch b/target/linux/x86/patches-5.10/102-v5.15-platform-x86-add-meraki-mx100-platform-driver.patch deleted file mode 100644 index 0babc73b06..0000000000 --- a/target/linux/x86/patches-5.10/102-v5.15-platform-x86-add-meraki-mx100-platform-driver.patch +++ /dev/null @@ -1,291 +0,0 @@ -From 636a1e697555e73c28cdd6952a409edbfdd16475 Mon Sep 17 00:00:00 2001 -From: Chris Blake -Date: Mon, 9 Aug 2021 19:40:21 -0500 -Subject: platform/x86: add meraki-mx100 platform driver - -This adds platform support for the Cisco Meraki MX100 (Tinkerbell) -network appliance. This sets up the network LEDs and Reset -button. - -Depends-on: ef0eea5b151ae ("mfd: lpc_ich: Enable GPIO driver for DH89xxCC") -Co-developed-by: Christian Lamparter -Signed-off-by: Christian Lamparter -Signed-off-by: Chris Blake -Reviewed-by: Andy Shevchenko -Link: https://lore.kernel.org/r/20210810004021.2538308-1-chrisrblake93@gmail.com -Reviewed-by: Hans de Goede -Signed-off-by: Hans de Goede ---- - drivers/platform/x86/Kconfig | 13 ++ - drivers/platform/x86/Makefile | 3 + - drivers/platform/x86/meraki-mx100.c | 230 ++++++++++++++++++++++++++++++++++++ - 3 files changed, 246 insertions(+) - create mode 100644 drivers/platform/x86/meraki-mx100.c - ---- a/drivers/platform/x86/Kconfig -+++ b/drivers/platform/x86/Kconfig -@@ -267,6 +267,19 @@ config ASUS_NB_WMI - If you have an ACPI-WMI compatible Asus Notebook, say Y or M - here. - -+config MERAKI_MX100 -+ tristate "Cisco Meraki MX100 Platform Driver" -+ depends on GPIOLIB -+ depends on GPIO_ICH -+ depends on LEDS_CLASS -+ select LEDS_GPIO -+ help -+ This driver provides support for the front button and LEDs on -+ the Cisco Meraki MX100 (Tinkerbell) 1U appliance. -+ -+ To compile this driver as a module, choose M here: the module -+ will be called meraki-mx100. -+ - config EEEPC_LAPTOP - tristate "Eee PC Hotkey Driver" - depends on ACPI ---- a/drivers/platform/x86/Makefile -+++ b/drivers/platform/x86/Makefile -@@ -33,6 +33,9 @@ obj-$(CONFIG_ASUS_NB_WMI) += asus-nb-wmi - obj-$(CONFIG_EEEPC_LAPTOP) += eeepc-laptop.o - obj-$(CONFIG_EEEPC_WMI) += eeepc-wmi.o - -+# Cisco/Meraki -+obj-$(CONFIG_MERAKI_MX100) += meraki-mx100.o -+ - # Dell - obj-$(CONFIG_DCDBAS) += dcdbas.o - obj-$(CONFIG_DELL_SMBIOS) += dell-smbios.o ---- /dev/null -+++ b/drivers/platform/x86/meraki-mx100.c -@@ -0,0 +1,230 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+ -+/* -+ * Cisco Meraki MX100 (Tinkerbell) board platform driver -+ * -+ * Based off of arch/x86/platform/meraki/tink.c from the -+ * Meraki GPL release meraki-firmware-sources-r23-20150601 -+ * -+ * Format inspired by platform/x86/pcengines-apuv2.c -+ * -+ * Copyright (C) 2021 Chris Blake -+ */ -+ -+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define TINK_GPIO_DRIVER_NAME "gpio_ich" -+ -+/* LEDs */ -+static const struct gpio_led tink_leds[] = { -+ { -+ .name = "mx100:green:internet", -+ .default_trigger = "default-on", -+ }, -+ { -+ .name = "mx100:green:lan2", -+ }, -+ { -+ .name = "mx100:green:lan3", -+ }, -+ { -+ .name = "mx100:green:lan4", -+ }, -+ { -+ .name = "mx100:green:lan5", -+ }, -+ { -+ .name = "mx100:green:lan6", -+ }, -+ { -+ .name = "mx100:green:lan7", -+ }, -+ { -+ .name = "mx100:green:lan8", -+ }, -+ { -+ .name = "mx100:green:lan9", -+ }, -+ { -+ .name = "mx100:green:lan10", -+ }, -+ { -+ .name = "mx100:green:lan11", -+ }, -+ { -+ .name = "mx100:green:ha", -+ }, -+ { -+ .name = "mx100:orange:ha", -+ }, -+ { -+ .name = "mx100:green:usb", -+ }, -+ { -+ .name = "mx100:orange:usb", -+ }, -+}; -+ -+static const struct gpio_led_platform_data tink_leds_pdata = { -+ .num_leds = ARRAY_SIZE(tink_leds), -+ .leds = tink_leds, -+}; -+ -+static struct gpiod_lookup_table tink_leds_table = { -+ .dev_id = "leds-gpio", -+ .table = { -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 11, -+ NULL, 0, GPIO_ACTIVE_LOW), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 18, -+ NULL, 1, GPIO_ACTIVE_HIGH), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 20, -+ NULL, 2, GPIO_ACTIVE_HIGH), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 22, -+ NULL, 3, GPIO_ACTIVE_HIGH), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 23, -+ NULL, 4, GPIO_ACTIVE_HIGH), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 32, -+ NULL, 5, GPIO_ACTIVE_HIGH), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 34, -+ NULL, 6, GPIO_ACTIVE_HIGH), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 35, -+ NULL, 7, GPIO_ACTIVE_HIGH), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 36, -+ NULL, 8, GPIO_ACTIVE_HIGH), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 37, -+ NULL, 9, GPIO_ACTIVE_HIGH), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 48, -+ NULL, 10, GPIO_ACTIVE_HIGH), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 16, -+ NULL, 11, GPIO_ACTIVE_LOW), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 7, -+ NULL, 12, GPIO_ACTIVE_LOW), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 21, -+ NULL, 13, GPIO_ACTIVE_LOW), -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 19, -+ NULL, 14, GPIO_ACTIVE_LOW), -+ {} /* Terminating entry */ -+ } -+}; -+ -+/* Reset Button */ -+static struct gpio_keys_button tink_buttons[] = { -+ { -+ .desc = "Reset", -+ .type = EV_KEY, -+ .code = KEY_RESTART, -+ .active_low = 1, -+ .debounce_interval = 100, -+ }, -+}; -+ -+static const struct gpio_keys_platform_data tink_buttons_pdata = { -+ .buttons = tink_buttons, -+ .nbuttons = ARRAY_SIZE(tink_buttons), -+ .poll_interval = 20, -+ .rep = 0, -+ .name = "mx100-keys", -+}; -+ -+static struct gpiod_lookup_table tink_keys_table = { -+ .dev_id = "gpio-keys-polled", -+ .table = { -+ GPIO_LOOKUP_IDX(TINK_GPIO_DRIVER_NAME, 60, -+ NULL, 0, GPIO_ACTIVE_LOW), -+ {} /* Terminating entry */ -+ } -+}; -+ -+/* Board setup */ -+static const struct dmi_system_id tink_systems[] __initconst = { -+ { -+ .matches = { -+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Cisco"), -+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "MX100-HW"), -+ }, -+ }, -+ {} /* Terminating entry */ -+}; -+MODULE_DEVICE_TABLE(dmi, tink_systems); -+ -+static struct platform_device *tink_leds_pdev; -+static struct platform_device *tink_keys_pdev; -+ -+static struct platform_device * __init tink_create_dev( -+ const char *name, const void *pdata, size_t sz) -+{ -+ struct platform_device *pdev; -+ -+ pdev = platform_device_register_data(NULL, -+ name, PLATFORM_DEVID_NONE, pdata, sz); -+ if (IS_ERR(pdev)) -+ pr_err("failed registering %s: %ld\n", name, PTR_ERR(pdev)); -+ -+ return pdev; -+} -+ -+static int __init tink_board_init(void) -+{ -+ int ret; -+ -+ if (!dmi_first_match(tink_systems)) -+ return -ENODEV; -+ -+ /* -+ * We need to make sure that GPIO60 isn't set to native mode as is default since it's our -+ * Reset Button. To do this, write to GPIO_USE_SEL2 to have GPIO60 set to GPIO mode. -+ * This is documented on page 1609 of the PCH datasheet, order number 327879-005US -+ */ -+ outl(inl(0x530) | BIT(28), 0x530); -+ -+ gpiod_add_lookup_table(&tink_leds_table); -+ gpiod_add_lookup_table(&tink_keys_table); -+ -+ tink_leds_pdev = tink_create_dev("leds-gpio", -+ &tink_leds_pdata, sizeof(tink_leds_pdata)); -+ if (IS_ERR(tink_leds_pdev)) { -+ ret = PTR_ERR(tink_leds_pdev); -+ goto err; -+ } -+ -+ tink_keys_pdev = tink_create_dev("gpio-keys-polled", -+ &tink_buttons_pdata, sizeof(tink_buttons_pdata)); -+ if (IS_ERR(tink_keys_pdev)) { -+ ret = PTR_ERR(tink_keys_pdev); -+ platform_device_unregister(tink_leds_pdev); -+ goto err; -+ } -+ -+ return 0; -+ -+err: -+ gpiod_remove_lookup_table(&tink_keys_table); -+ gpiod_remove_lookup_table(&tink_leds_table); -+ return ret; -+} -+module_init(tink_board_init); -+ -+static void __exit tink_board_exit(void) -+{ -+ platform_device_unregister(tink_keys_pdev); -+ platform_device_unregister(tink_leds_pdev); -+ gpiod_remove_lookup_table(&tink_keys_table); -+ gpiod_remove_lookup_table(&tink_leds_table); -+} -+module_exit(tink_board_exit); -+ -+MODULE_AUTHOR("Chris Blake "); -+MODULE_DESCRIPTION("Cisco Meraki MX100 Platform Driver"); -+MODULE_LICENSE("GPL"); -+MODULE_ALIAS("platform:meraki-mx100"); diff --git a/target/linux/x86/patches-5.10/300-pcengines_apu1_led.patch b/target/linux/x86/patches-5.10/300-pcengines_apu1_led.patch deleted file mode 100644 index 9d1e4ab9c2..0000000000 --- a/target/linux/x86/patches-5.10/300-pcengines_apu1_led.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: Andreas Eberlein -Subject: x86: add LED support for PC Engines APU1 with mainline bios - -This adds support for the LEDs on PC Engines APU1 with the mainline bios. - -Signed-off-by: Andreas Eberlein ---- ---- a/drivers/leds/leds-apu.c -+++ b/drivers/leds/leds-apu.c -@@ -83,6 +83,7 @@ static const struct apu_led_profile apu1 - }; - - static const struct dmi_system_id apu_led_dmi_table[] __initconst = { -+ /* PC Engines APU with "Legacy" bios < 4.0.8 */ - { - .ident = "apu", - .matches = { -@@ -90,6 +91,14 @@ static const struct dmi_system_id apu_le - DMI_MATCH(DMI_PRODUCT_NAME, "APU") - } - }, -+ /* PC Engines APU with "Mainline" bios >= 4.0.8 */ -+ { -+ .ident = "apu", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "apu1") -+ } -+ }, - {} - }; - MODULE_DEVICE_TABLE(dmi, apu_led_dmi_table); -@@ -173,7 +182,7 @@ static int __init apu_led_init(void) - int err; - - if (!(dmi_match(DMI_SYS_VENDOR, "PC Engines") && -- dmi_match(DMI_PRODUCT_NAME, "APU"))) { -+ (dmi_match(DMI_PRODUCT_NAME, "APU") || dmi_match(DMI_PRODUCT_NAME, "apu1")))) { - pr_err("No PC Engines APUv1 board detected. For APUv2,3 support, enable CONFIG_PCENGINES_APU2\n"); - return -ENODEV; - } diff --git a/target/linux/x86/patches-5.10/100-fix_cs5535_clockevt.patch b/target/linux/x86/patches-5.15/100-fix_cs5535_clockevt.patch similarity index 100% rename from target/linux/x86/patches-5.10/100-fix_cs5535_clockevt.patch rename to target/linux/x86/patches-5.15/100-fix_cs5535_clockevt.patch diff --git a/target/linux/x86/patches-5.15/103-pcengines_apu6_platform.patch b/target/linux/x86/patches-5.15/103-pcengines_apu6_platform.patch new file mode 100644 index 0000000000..9ec0a33c31 --- /dev/null +++ b/target/linux/x86/patches-5.15/103-pcengines_apu6_platform.patch @@ -0,0 +1,280 @@ +From 970d9af9015a387bb81841faf05dcc1a171eb97a Mon Sep 17 00:00:00 2001 +From: Philip Prindeville +Date: Sun, 1 Jan 2023 15:25:04 -0700 +Subject: [PATCH v3 1/1] x86: Support APU5 in PCEngines platform driver +To: platform-driver-x86@vger.kernel.org, linux-x86_64@vger.kernel.org +Cc: Ed Wildgoose , Andres Salomon , Andreas Eberlein , Paul Spooren + +PCEngines make a number of SBC. APU5 has 5 mpcie slots + MSATA. +It also has support for 3x LTE modems with 6x SIM slots (pairs with a +SIM switch device). Each mpcie slot for modems has a reset GPIO + +To ensure that the naming is sane between APU2-6 the GPIOS are +renamed to be modem1-reset, modem2-reset, etc. This is significant +because the slots that can be reset change between APU2 and APU3/4 + +GPIO for simswap is moved to the end of the list as it could be dropped +for APU2 boards (but causes no harm to leave it in, hardware could be +added to a future rev of the board). + +Structure of the GPIOs for APU5 is extremely similar to APU2-4, but +many lines are moved around and there are simply more +modems/resets/sim-swap lines to breakout. + +Also added APU6, which is essentially APU4 with a different ethernet +interface and SFP cage on eth0. + +Revision history: + +v1: originally titled, "apu6: add apu6 variation to apu2 driver family" +this dealt only with detecting the APUv6, which is otherwise identical +to the v4 excepting the SFP cage on eth0. + +v2: at Ed's request, merged with his previous pull-request titled +"x86: Support APU5 in PCEngines platform driver", and some cleanup +to that changeset (including dropping the table "apu5_driver_data" +which did not have a defined type "struct apu_driver_data"), but got +mistitled when the Subject of that commit got accidentally dropped. + +v3: retitled to match Ed's previous pull-request. + +Cc: platform-driver-x86@vger.kernel.org +Cc: linux-x86_64@vger.kernel.org +Reviewed-by: Andreas Eberlein +Reviewed-by: Paul Spooren +Signed-off-by: Ed Wildgoose +Sighed-off-by: Philip Prindeville +--- + drivers/leds/leds-apu.c | 2 +- + drivers/platform/x86/Kconfig | 4 +- + drivers/platform/x86/pcengines-apuv2.c | 118 ++++++++++++++++++++++--- + 3 files changed, 107 insertions(+), 17 deletions(-) + +--- a/drivers/leds/leds-apu.c ++++ b/drivers/leds/leds-apu.c +@@ -183,7 +183,7 @@ static int __init apu_led_init(void) + + if (!(dmi_match(DMI_SYS_VENDOR, "PC Engines") && + (dmi_match(DMI_PRODUCT_NAME, "APU") || dmi_match(DMI_PRODUCT_NAME, "apu1")))) { +- pr_err("No PC Engines APUv1 board detected. For APUv2,3 support, enable CONFIG_PCENGINES_APU2\n"); ++ pr_err("No PC Engines APUv1 board detected. For APUv2,3,4,5,6 support, enable CONFIG_PCENGINES_APU2\n"); + return -ENODEV; + } + +--- a/drivers/platform/x86/Kconfig ++++ b/drivers/platform/x86/Kconfig +@@ -661,7 +661,7 @@ config XO1_RFKILL + laptop. + + config PCENGINES_APU2 +- tristate "PC Engines APUv2/3 front button and LEDs driver" ++ tristate "PC Engines APUv2/3/4/5/6 front button and LEDs driver" + depends on INPUT && INPUT_KEYBOARD && GPIOLIB + depends on LEDS_CLASS + select GPIO_AMD_FCH +@@ -669,7 +669,7 @@ config PCENGINES_APU2 + select LEDS_GPIO + help + This driver provides support for the front button and LEDs on +- PC Engines APUv2/APUv3 board. ++ PC Engines APUv2/APUv3/APUv4/APUv5/APUv6 board. + + To compile this driver as a module, choose M here: the module + will be called pcengines-apuv2. +--- a/drivers/platform/x86/pcengines-apuv2.c ++++ b/drivers/platform/x86/pcengines-apuv2.c +@@ -1,10 +1,12 @@ + // SPDX-License-Identifier: GPL-2.0+ + + /* +- * PC-Engines APUv2/APUv3 board platform driver ++ * PC-Engines APUv2-6 board platform driver + * for GPIO buttons and LEDs + * + * Copyright (C) 2018 metux IT consult ++ * Copyright (C) 2022 Ed Wildgoose ++ * Copyright (C) 2022 Philip Prindeville + * Author: Enrico Weigelt + */ + +@@ -22,38 +24,70 @@ + #include + + /* +- * NOTE: this driver only supports APUv2/3 - not APUv1, as this one ++ * NOTE: this driver only supports APUv2-6 - not APUv1, as this one + * has completely different register layouts. + */ + ++/* ++ * There are a number of APU variants, with differing features ++ * APU2 has SIM slots 1/2 mapping to mPCIe sockets 1/2 ++ * APU3/4 moved SIM slot 1 to mPCIe socket 3, ie logically reversed ++ * However, most APU3/4 have a SIM switch which we default on to reverse ++ * the order and keep physical SIM order matching physical modem order ++ * APU6 is approximately the same as APU4 with different ethernet layout ++ * ++ * APU5 has 3x SIM sockets, all with a SIM switch ++ * several GPIOs are shuffled (see schematic), including MODESW ++ */ ++ + /* Register mappings */ + #define APU2_GPIO_REG_LED1 AMD_FCH_GPIO_REG_GPIO57 + #define APU2_GPIO_REG_LED2 AMD_FCH_GPIO_REG_GPIO58 + #define APU2_GPIO_REG_LED3 AMD_FCH_GPIO_REG_GPIO59_DEVSLP1 + #define APU2_GPIO_REG_MODESW AMD_FCH_GPIO_REG_GPIO32_GE1 + #define APU2_GPIO_REG_SIMSWAP AMD_FCH_GPIO_REG_GPIO33_GE2 +-#define APU2_GPIO_REG_MPCIE2 AMD_FCH_GPIO_REG_GPIO55_DEVSLP0 +-#define APU2_GPIO_REG_MPCIE3 AMD_FCH_GPIO_REG_GPIO51 ++#define APU2_GPIO_REG_RESETM1 AMD_FCH_GPIO_REG_GPIO51 ++#define APU2_GPIO_REG_RESETM2 AMD_FCH_GPIO_REG_GPIO55_DEVSLP0 ++ ++#define APU5_GPIO_REG_MODESW AMT_FCH_GPIO_REG_GEVT22 ++#define APU5_GPIO_REG_SIMSWAP1 AMD_FCH_GPIO_REG_GPIO68 ++#define APU5_GPIO_REG_SIMSWAP2 AMD_FCH_GPIO_REG_GPIO32_GE1 ++#define APU5_GPIO_REG_SIMSWAP3 AMD_FCH_GPIO_REG_GPIO33_GE2 ++#define APU5_GPIO_REG_RESETM1 AMD_FCH_GPIO_REG_GPIO51 ++#define APU5_GPIO_REG_RESETM2 AMD_FCH_GPIO_REG_GPIO55_DEVSLP0 ++#define APU5_GPIO_REG_RESETM3 AMD_FCH_GPIO_REG_GPIO64 + + /* Order in which the GPIO lines are defined in the register list */ + #define APU2_GPIO_LINE_LED1 0 + #define APU2_GPIO_LINE_LED2 1 + #define APU2_GPIO_LINE_LED3 2 + #define APU2_GPIO_LINE_MODESW 3 +-#define APU2_GPIO_LINE_SIMSWAP 4 +-#define APU2_GPIO_LINE_MPCIE2 5 +-#define APU2_GPIO_LINE_MPCIE3 6 ++#define APU2_GPIO_LINE_RESETM1 4 ++#define APU2_GPIO_LINE_RESETM2 5 ++#define APU2_GPIO_LINE_SIMSWAP 6 ++ ++#define APU5_GPIO_LINE_LED1 0 ++#define APU5_GPIO_LINE_LED2 1 ++#define APU5_GPIO_LINE_LED3 2 ++#define APU5_GPIO_LINE_MODESW 3 ++#define APU5_GPIO_LINE_RESETM1 4 ++#define APU5_GPIO_LINE_RESETM2 5 ++#define APU5_GPIO_LINE_RESETM3 6 ++#define APU5_GPIO_LINE_SIMSWAP1 7 ++#define APU5_GPIO_LINE_SIMSWAP2 8 ++#define APU5_GPIO_LINE_SIMSWAP3 9 ++ + +-/* GPIO device */ ++/* GPIO device - APU2/3/4/6 */ + + static int apu2_gpio_regs[] = { + [APU2_GPIO_LINE_LED1] = APU2_GPIO_REG_LED1, + [APU2_GPIO_LINE_LED2] = APU2_GPIO_REG_LED2, + [APU2_GPIO_LINE_LED3] = APU2_GPIO_REG_LED3, + [APU2_GPIO_LINE_MODESW] = APU2_GPIO_REG_MODESW, ++ [APU2_GPIO_LINE_RESETM1] = APU2_GPIO_REG_RESETM1, ++ [APU2_GPIO_LINE_RESETM2] = APU2_GPIO_REG_RESETM2, + [APU2_GPIO_LINE_SIMSWAP] = APU2_GPIO_REG_SIMSWAP, +- [APU2_GPIO_LINE_MPCIE2] = APU2_GPIO_REG_MPCIE2, +- [APU2_GPIO_LINE_MPCIE3] = APU2_GPIO_REG_MPCIE3, + }; + + static const char * const apu2_gpio_names[] = { +@@ -61,9 +95,9 @@ static const char * const apu2_gpio_name + [APU2_GPIO_LINE_LED2] = "front-led2", + [APU2_GPIO_LINE_LED3] = "front-led3", + [APU2_GPIO_LINE_MODESW] = "front-button", ++ [APU2_GPIO_LINE_RESETM1] = "modem1-reset", ++ [APU2_GPIO_LINE_RESETM2] = "modem2-reset", + [APU2_GPIO_LINE_SIMSWAP] = "simswap", +- [APU2_GPIO_LINE_MPCIE2] = "mpcie2_reset", +- [APU2_GPIO_LINE_MPCIE3] = "mpcie3_reset", + }; + + static const struct amd_fch_gpio_pdata board_apu2 = { +@@ -72,6 +106,40 @@ static const struct amd_fch_gpio_pdata b + .gpio_names = apu2_gpio_names, + }; + ++/* GPIO device - APU5 */ ++ ++static int apu5_gpio_regs[] = { ++ [APU5_GPIO_LINE_LED1] = APU2_GPIO_REG_LED1, ++ [APU5_GPIO_LINE_LED2] = APU2_GPIO_REG_LED2, ++ [APU5_GPIO_LINE_LED3] = APU2_GPIO_REG_LED3, ++ [APU5_GPIO_LINE_MODESW] = APU5_GPIO_REG_MODESW, ++ [APU5_GPIO_LINE_RESETM1] = APU5_GPIO_REG_RESETM1, ++ [APU5_GPIO_LINE_RESETM2] = APU5_GPIO_REG_RESETM2, ++ [APU5_GPIO_LINE_RESETM3] = APU5_GPIO_REG_RESETM3, ++ [APU5_GPIO_LINE_SIMSWAP1] = APU5_GPIO_REG_SIMSWAP1, ++ [APU5_GPIO_LINE_SIMSWAP2] = APU5_GPIO_REG_SIMSWAP2, ++ [APU5_GPIO_LINE_SIMSWAP3] = APU5_GPIO_REG_SIMSWAP3, ++}; ++ ++static const char * const apu5_gpio_names[] = { ++ [APU5_GPIO_LINE_LED1] = "front-led1", ++ [APU5_GPIO_LINE_LED2] = "front-led2", ++ [APU5_GPIO_LINE_LED3] = "front-led3", ++ [APU5_GPIO_LINE_MODESW] = "front-button", ++ [APU5_GPIO_LINE_RESETM1] = "modem1-reset", ++ [APU5_GPIO_LINE_RESETM2] = "modem2-reset", ++ [APU5_GPIO_LINE_RESETM3] = "modem3-reset", ++ [APU5_GPIO_LINE_SIMSWAP1] = "simswap1", ++ [APU5_GPIO_LINE_SIMSWAP2] = "simswap2", ++ [APU5_GPIO_LINE_SIMSWAP3] = "simswap3", ++}; ++ ++static const struct amd_fch_gpio_pdata board_apu5 = { ++ .gpio_num = ARRAY_SIZE(apu5_gpio_regs), ++ .gpio_reg = apu5_gpio_regs, ++ .gpio_names = apu5_gpio_names, ++}; ++ + /* GPIO LEDs device */ + + static const struct gpio_led apu2_leds[] = { +@@ -215,6 +283,24 @@ static const struct dmi_system_id apu_gp + }, + .driver_data = (void *)&board_apu2, + }, ++ /* APU5 w/ mainline BIOS */ ++ { ++ .ident = "apu5", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"), ++ DMI_MATCH(DMI_BOARD_NAME, "apu5") ++ }, ++ .driver_data = (void *)&board_apu5, ++ }, ++ /* APU6 w/ mainline BIOS */ ++ { ++ .ident = "apu6", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"), ++ DMI_MATCH(DMI_BOARD_NAME, "apu6") ++ }, ++ .driver_data = (void *)&board_apu2, ++ }, + {} + }; + +@@ -249,7 +335,7 @@ static int __init apu_board_init(void) + + id = dmi_first_match(apu_gpio_dmi_table); + if (!id) { +- pr_err("failed to detect APU board via DMI\n"); ++ pr_err("No APU board detected via DMI\n"); + return -ENODEV; + } + +@@ -288,8 +374,12 @@ module_init(apu_board_init); + module_exit(apu_board_exit); + + MODULE_AUTHOR("Enrico Weigelt, metux IT consult "); +-MODULE_DESCRIPTION("PC Engines APUv2/APUv3 board GPIO/LEDs/keys driver"); ++MODULE_DESCRIPTION("PC Engines APUv2-6 board GPIO/LEDs/keys driver"); + MODULE_LICENSE("GPL"); + MODULE_DEVICE_TABLE(dmi, apu_gpio_dmi_table); + MODULE_ALIAS("platform:pcengines-apuv2"); ++MODULE_ALIAS("platform:pcengines-apuv3"); ++MODULE_ALIAS("platform:pcengines-apuv4"); ++MODULE_ALIAS("platform:pcengines-apuv5"); ++MODULE_ALIAS("platform:pcengines-apuv6"); + MODULE_SOFTDEP("pre: platform:" AMD_FCH_GPIO_DRIVER_NAME " platform:leds-gpio platform:gpio_keys_polled"); diff --git a/target/linux/x86/patches-5.10/113-v5.21-platform-x86-pmc_atom-Add-Lex-3I380NX-industrial-PC-.patch b/target/linux/x86/patches-5.15/113-v5.21-platform-x86-pmc_atom-Add-Lex-3I380NX-industrial-PC-.patch similarity index 100% rename from target/linux/x86/patches-5.10/113-v5.21-platform-x86-pmc_atom-Add-Lex-3I380NX-industrial-PC-.patch rename to target/linux/x86/patches-5.15/113-v5.21-platform-x86-pmc_atom-Add-Lex-3I380NX-industrial-PC-.patch diff --git a/target/linux/x86/patches-5.15/120-hwrng-geode-fix-accessing-registers.patch b/target/linux/x86/patches-5.15/120-hwrng-geode-fix-accessing-registers.patch new file mode 100644 index 0000000000..4c8015013b --- /dev/null +++ b/target/linux/x86/patches-5.15/120-hwrng-geode-fix-accessing-registers.patch @@ -0,0 +1,47 @@ +From 859bd2e0c0052967536f3f902716f204d5a978b1 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski +Date: Fri, 8 Sep 2023 22:48:33 +0200 +Subject: [PATCH] hwrng: geode: fix accessing registers + +When the membase and pci_dev pointer were moved to a new struct in priv, +the actual membase users were left untouched, and they started reading +out arbitrary memory behind the struct instead of registers. This +unfortunately turned the RNG into a constant number generator, depending +on the content of what was at that offset. + +To fix this, update geode_rng_data_{read,present}() to also get the +membase via amd_geode_priv, and properly read from the right addresses +again. + +Fixes: 9f6ec8dc574e ("hwrng: geode - Fix PCI device refcount leak") +Reported-by: Timur I. Davletshin +Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217882 +Tested-by: Timur I. Davletshin +Suggested-by: Jo-Philipp Wich +Signed-off-by: Jonas Gorski +--- + drivers/char/hw_random/geode-rng.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/char/hw_random/geode-rng.c ++++ b/drivers/char/hw_random/geode-rng.c +@@ -58,7 +58,8 @@ struct amd_geode_priv { + + static int geode_rng_data_read(struct hwrng *rng, u32 *data) + { +- void __iomem *mem = (void __iomem *)rng->priv; ++ struct amd_geode_priv *priv = (struct amd_geode_priv *)rng->priv; ++ void __iomem *mem = priv->membase; + + *data = readl(mem + GEODE_RNG_DATA_REG); + +@@ -67,7 +68,8 @@ static int geode_rng_data_read(struct hw + + static int geode_rng_data_present(struct hwrng *rng, int wait) + { +- void __iomem *mem = (void __iomem *)rng->priv; ++ struct amd_geode_priv *priv = (struct amd_geode_priv *)rng->priv; ++ void __iomem *mem = priv->membase; + int data, i; + + for (i = 0; i < 20; i++) { diff --git a/target/sdk/Makefile b/target/sdk/Makefile index b5da9f5c52..cfe5e24851 100644 --- a/target/sdk/Makefile +++ b/target/sdk/Makefile @@ -29,11 +29,9 @@ EXCLUDE_DIRS:= \ */man \ */info \ */root-* \ - initial \ *.install.clean \ *.install.flags \ *.install \ - */doc \ */share/locale SDK_DIRS = \ @@ -46,10 +44,10 @@ GIT_COMMIT:=$(shell git rev-parse HEAD 2>/dev/null) GIT_BRANCH:=$(filter-out master HEAD,$(shell git rev-parse --abbrev-ref HEAD 2>/dev/null)) GIT_TAGNAME:=$(shell git show-ref --tags --dereference 2>/dev/null | sed -ne '/^$(GIT_COMMIT) / { s|^.*/||; s|\^.*||; p }') -BASE_FEED:=$(if $(GIT_URL),src-git base $(GIT_URL)$(if $(GIT_BRANCH),;$(GIT_BRANCH),$(if $(GIT_TAGNAME),;$(GIT_TAGNAME)))) +BASE_FEED:=$(if $(GIT_URL),src-git-full base $(GIT_URL)$(if $(GIT_BRANCH),;$(GIT_BRANCH),$(if $(GIT_TAGNAME),;$(GIT_TAGNAME)))) BASE_FEED:=$(if $(BASE_FEED),$(BASE_FEED),$(shell cd $(TOPDIR); LC_ALL=C git svn info 2>/dev/null | sed -ne 's/^URL: /src-gitsvn base /p')) BASE_FEED:=$(if $(BASE_FEED),$(BASE_FEED),$(shell cd $(TOPDIR); LC_ALL=C svn info 2>/dev/null | sed -ne 's/^URL: /src-svn base /p')) -BASE_FEED:=$(if $(BASE_FEED),$(BASE_FEED),src-git base $(PROJECT_GIT)/librecmc/librecmc.git$(if $(GIT_BRANCH),;$(GIT_BRANCH),$(if $(GIT_TAGNAME),;$(GIT_TAGNAME)))) +BASE_FEED:=$(if $(BASE_FEED),$(BASE_FEED),src-git-full base $(PROJECT_GIT)/librecmc/librecmc.git$(if $(GIT_BRANCH),;$(GIT_BRANCH),$(if $(GIT_TAGNAME),;$(GIT_TAGNAME)))) KDIR_BASE = $(patsubst $(TOPDIR)/%,%,$(LINUX_DIR)) KDIR_ARCHES = $(LINUX_KARCH) @@ -147,7 +145,7 @@ $(BIN_DIR)/$(SDK_NAME).tar.xz: clean ./files/Config.in \ ./files/Makefile \ ./files/include/prepare.mk \ - ./files/README.SDK \ + ./files/README.md \ $(SDK_BUILD_DIR)/ mkdir -p $(SDK_BUILD_DIR)/package/kernel $(CP) \ @@ -159,6 +157,8 @@ $(BIN_DIR)/$(SDK_NAME).tar.xz: clean $(SDK_BUILD_DIR)/package/kernel/ -rm -rf $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/.prereq-build + -rm -rf $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/doc + -rm -rf $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/share/doc -rm -f $(SDK_BUILD_DIR)/feeds.conf.default $(if $(BASE_FEED),echo "$(BASE_FEED)" > $(SDK_BUILD_DIR)/feeds.conf.default) diff --git a/target/sdk/files/Config.in b/target/sdk/files/Config.in index b4a5ec4be5..7a3d82c94a 100644 --- a/target/sdk/files/Config.in +++ b/target/sdk/files/Config.in @@ -18,12 +18,28 @@ menu "Global build settings" bool "Cryptographically sign package lists" default y + comment "General build options" + + config BUILD_PATENTED + default n + bool "Compile with support for patented functionality" + help + When this option is disabled, software which provides patented functionality + will not be built. In case software provides optional support for patented + functionality, this optional support will get disabled for this package. + + config BUILD_NLS + default n + bool "Compile with full language support" + help + When this option is enabled, packages are built with the full versions of + iconv and GNU gettext instead of the default libreCMC stubs. + comment "Package build options" config DEBUG bool prompt "Compile packages with debugging info" - default n help Adds -g3 to the CFLAGS. @@ -69,7 +85,6 @@ menu "Advanced configuration options (for developers)" config BROKEN bool "Show broken packages" - default n config DOWNLOAD_FOLDER string "Download folder" @@ -101,19 +116,23 @@ menu "Advanced configuration options (for developers)" config CCACHE bool "Use ccache" - default n help Compiler cache; see https://ccache.samba.org/ + config CCACHE_DIR + string "Set ccache directory" if CCACHE + default "" + help + Store ccache in this directory. + If not set, uses './.ccache' + config BUILD_LOG bool "Enable log files during build process" - default n help If enabled, log files will be written to the ./log directory. config SRC_TREE_OVERRIDE bool "Enable package source tree override" - default n help If enabled, you can force a package to use a git tree as source code instead of the normal tarball. Create a symlink 'git-src' diff --git a/target/sdk/files/Makefile b/target/sdk/files/Makefile index 89f5054890..0c86ad461c 100644 --- a/target/sdk/files/Makefile +++ b/target/sdk/files/Makefile @@ -14,7 +14,9 @@ export TOPDIR LC_ALL LANG SDK world: -DISTRO_PKG_CONFIG:=$(shell $(TOPDIR)/scripts/command_all.sh pkg-config | grep '/usr' | head -n 1) +DISTRO_PKG_CONFIG:=$(shell $(TOPDIR)/scripts/command_all.sh pkg-config | grep '/usr' -m 1) + +export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH)) export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH) ifneq ($(LIBRECMC_BUILD),1) diff --git a/target/sdk/files/README.SDK b/target/sdk/files/README.md similarity index 100% rename from target/sdk/files/README.SDK rename to target/sdk/files/README.md diff --git a/target/toolchain/files/wrapper.sh b/target/toolchain/files/wrapper.sh index 6a0cdfff6c..09a9cac928 100755 --- a/target/toolchain/files/wrapper.sh +++ b/target/toolchain/files/wrapper.sh @@ -43,10 +43,11 @@ TOOLCHAIN_BIN_DIR="$REALNAME_DIR/" # Set the PATH so that our run-time location is first # (get_feature is run from the path, so this has to be set) +export ORIG_PATH=${ORIG_PATH:-$PATH} export PATH="$TOOLCHAIN_BIN_DIR":$PATH export GCC_HONOUR_COPTS -TOOLCHAIN_SYSROOT="$TOOLCHAIN_BIN_DIR/../.." +TOOLCHAIN_SYSROOT="$TOOLCHAIN_BIN_DIR/.." if [ ! -d "$TOOLCHAIN_SYSROOT" ]; then echo "Error: Unable to determine sysroot (looking for $TOOLCHAIN_SYSROOT)!" >&2 exit 1 @@ -57,8 +58,8 @@ fi case $TOOLCHAIN_PLATFORM in gnu|glibc|uclibc|musl) - GCC_SYSROOT_FLAGS="--sysroot=$TOOLCHAIN_SYSROOT -Wl,-rpath=$TOOLCHAIN_SYSROOT/lib:$TOOLCHAIN_SYSROOT/usr/lib" - LD_SYSROOT_FLAGS="-rpath=$TOOLCHAIN_SYSROOT/lib:$TOOLCHAIN_SYSROOT/usr/lib" + GCC_SYSROOT_FLAGS="--sysroot=$TOOLCHAIN_SYSROOT -Wl,-rpath-link=$TOOLCHAIN_SYSROOT/lib:$TOOLCHAIN_SYSROOT/usr/lib" + LD_SYSROOT_FLAGS="-rpath-link=$TOOLCHAIN_SYSROOT/lib:$TOOLCHAIN_SYSROOT/usr/lib" ;; *) GCC_SYSROOT_FLAGS="" diff --git a/toolchain/Config.in b/toolchain/Config.in index f02790ba52..0bd8a170f7 100644 --- a/toolchain/Config.in +++ b/toolchain/Config.in @@ -95,6 +95,7 @@ menuconfig EXTERNAL_TOOLCHAIN default "aarch64-unknown-linux-gnu" if aarch64 default "aarch64_be-unknown-linux-gnu" if aarch64_be default "arm-unknown-linux-gnu" if arm + default "arm-none-eabi" if arm_m0 default "armeb-unknown-linux-gnu" if armeb default "i486-unknown-linux-gnu" if i386 default "mips-unknown-linux-gnu" if mips @@ -109,13 +110,14 @@ menuconfig EXTERNAL_TOOLCHAIN default "aarch64-unknown-linux-gnu" if aarch64 default "aarch64_be-unknown-linux-gnu" if aarch64_be default "arm-unknown-linux-gnu-" if arm + default "arm-none-eabi-" if arm_m0 default "armeb-unknown-linux-gnu-" if armeb default "i486-unknown-linux-gnu-" if i386 default "mips-unknown-linux-gnu-" if mips default "mipsel-unknown-linux-gnu-" if mipsel default "powerpc-unknown-linux-gnu-" if powerpc default "x86_64-unknown-linux-gnu-" if x86_64 - + config TOOLCHAIN_ROOT string prompt "Toolchain root" if DEVEL @@ -197,7 +199,6 @@ menuconfig EXTRA_TARGET_ARCH bool prompt "Enable an extra toolchain target architecture" if TOOLCHAINOPTS depends on !sparc - default n help Some builds may require a 'biarch' toolchain. This option allows you to specify an additional target arch. @@ -248,6 +249,13 @@ comment "Binary tools" source "toolchain/binutils/Config.in" +config DWARVES + bool + prompt "Build pahole" if TOOLCHAINOPTS + depends on !HOST_OS_MACOS + help + Enable if you want to build pahole and the dwarves tools. + comment "Compiler" depends on TOOLCHAINOPTS diff --git a/toolchain/Makefile b/toolchain/Makefile index 5dccf8f829..c0046293c9 100644 --- a/toolchain/Makefile +++ b/toolchain/Makefile @@ -21,8 +21,6 @@ # build & install the final libc # 7) toolchain/gcc/final/compile # build & install the final gcc -# 8) toolchain/libc/utils/compile -# build & install libc utilities # # For musl, steps 2 and 4 are skipped, and step 3 is done after 5 @@ -34,8 +32,8 @@ $(curdir)/builddirs := $(if $(CONFIG_GDB),gdb) $(if $(CONFIG_EXTERNAL_TOOLCHAIN) # builddir dependencies ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) ifdef CONFIG_USE_MUSL + $(curdir)/gcc/initial/compile:=$(curdir)/binutils/compile $(curdir)/kernel-headers/compile:=$(curdir)/gcc/initial/compile - $(curdir)/$(LIBC)/compile:=$(curdir)/kernel-headers/compile else $(curdir)/builddirs += $(LIBC)/headers gcc/minimal $(curdir)/gcc/minimal/compile:=$(curdir)/binutils/compile @@ -44,10 +42,8 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) $(curdir)/gcc/initial/compile:=$(curdir)/$(LIBC)/headers/compile endif - $(curdir)/gcc/initial/compile+=$(curdir)/binutils/compile - $(curdir)/$(LIBC)/compile:=$(curdir)/gcc/initial/compile - $(curdir)/gcc/final/compile:=$(curdir)/$(LIBC)/compile $(curdir)/kernel-headers/compile - $(curdir)/$(LIBC)/utils/compile:=$(curdir)/gcc/final/compile + $(curdir)/$(LIBC)/compile:=$(curdir)/gcc/initial/compile $(curdir)/kernel-headers/compile + $(curdir)/gcc/final/compile:=$(curdir)/$(LIBC)/compile endif ifndef DUMP_TARGET_DB @@ -85,12 +81,12 @@ $(curdir)/ := .config prereq $(curdir)//compile = $(STAGING_DIR)/.prepared $(TOOLCHAIN_DIR)/info.mk $(tools/stamp-compile) ifndef DUMP_TARGET_DB -$(TOOLCHAIN_DIR)/stamp/.gcc-initial_installed: +$(TOOLCHAIN_DIR)/stamp/.gcc_final_installed: endif $(curdir)/install: $(curdir)/compile -$(eval $(call stampfile,$(curdir),toolchain,compile,$(TOOLCHAIN_DIR)/stamp/.gcc-initial_installed,,$(TOOLCHAIN_DIR))) +$(eval $(call stampfile,$(curdir),toolchain,compile,$(TOOLCHAIN_DIR)/stamp/.gcc_final_installed,,$(TOOLCHAIN_DIR))) $(eval $(call stampfile,$(curdir),toolchain,check,$(TMP_DIR)/.build)) $(eval $(call subdir,$(curdir))) diff --git a/toolchain/binutils/Config.in b/toolchain/binutils/Config.in index bf63cb969e..e53384a006 100644 --- a/toolchain/binutils/Config.in +++ b/toolchain/binutils/Config.in @@ -2,7 +2,7 @@ choice prompt "Binutils Version" if TOOLCHAINOPTS - default BINUTILS_USE_VERSION_2_37 + default BINUTILS_USE_VERSION_2_40 help Select the version of binutils you wish to use. @@ -13,6 +13,14 @@ choice config BINUTILS_USE_VERSION_2_38 bool "Binutils 2.38" select BINUTILS_VERSION_2_38 + + config BINUTILS_USE_VERSION_2_39 + bool "Binutils 2.39" + select BINUTILS_VERSION_2_39 + + config BINUTILS_USE_VERSION_2_40 + bool "Binutils 2.40" + select BINUTILS_VERSION_2_40 endchoice config EXTRA_BINUTILS_CONFIG_OPTIONS diff --git a/toolchain/binutils/Config.version b/toolchain/binutils/Config.version index bb651541fd..c9f8584480 100644 --- a/toolchain/binutils/Config.version +++ b/toolchain/binutils/Config.version @@ -1,12 +1,20 @@ config BINUTILS_VERSION_2_37 - default y if !TOOLCHAINOPTS bool config BINUTILS_VERSION_2_38 bool +config BINUTILS_VERSION_2_39 + bool + +config BINUTILS_VERSION_2_40 + default y if !TOOLCHAINOPTS + bool + config BINUTILS_VERSION string default "2.37" if BINUTILS_VERSION_2_37 default "2.38" if BINUTILS_VERSION_2_38 + default "2.39" if BINUTILS_VERSION_2_39 + default "2.40" if BINUTILS_VERSION_2_40 diff --git a/toolchain/binutils/Makefile b/toolchain/binutils/Makefile index d1961603c4..18b671960b 100644 --- a/toolchain/binutils/Makefile +++ b/toolchain/binutils/Makefile @@ -12,25 +12,10 @@ BIN_VERSION:=$(PKG_VERSION) PKG_SOURCE_URL:=@GNU/binutils/ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_CPE_ID:=cpe:/a:gnu:binutils TAR_OPTIONS += --exclude='*.rej' -ifeq ($(PKG_VERSION),2.32) - PKG_HASH:=0ab6c55dd86a92ed561972ba15b9b70a8b9f75557f896446c82e8b36e473ee04 -endif - -ifeq ($(PKG_VERSION),2.34) - PKG_HASH:=f00b0e8803dc9bab1e2165bd568528135be734df3fabf8d0161828cd56028952 -endif - -ifeq ($(PKG_VERSION),2.35.2) - PKG_HASH:=dcd5b0416e7b0a9b24bed76cd8c6c132526805761863150a26d016415b8bdc7b -endif - -ifeq ($(PKG_VERSION),2.36.1) - PKG_HASH:=e81d9edf373f193af428a0f256674aea62a9d74dfe93f65192d4eae030b0f3b0 -endif - ifeq ($(PKG_VERSION),2.37) PKG_HASH:=820d9724f020a3e69cb337893a0b63c2db161dadcb0e06fc11dc29eb1e84a32c endif @@ -39,20 +24,38 @@ ifeq ($(PKG_VERSION),2.38) PKG_HASH:=e316477a914f567eccc34d5d29785b8b0f5a10208d36bbacedcc39048ecfe024 endif +ifeq ($(PKG_VERSION),2.39) + PKG_HASH:=645c25f563b8adc0a81dbd6a41cffbf4d37083a382e02d5d3df4f65c09516d00 +endif + +ifeq ($(PKG_VERSION),2.40) + PKG_HASH:=0f8a4c272d7f17f369ded10a4aca28b8e304828e95526da482b0ccc4dfc9d8e1 +endif + HOST_BUILD_PARALLEL:=1 PATCH_DIR:=./patches/$(PKG_VERSION) include $(INCLUDE_DIR)/toolchain-build.mk +ifdef CONFIG_GCC_USE_GRAPHITE + GRAPHITE_CONFIGURE:= --with-isl=$(STAGING_DIR_HOST) +else + GRAPHITE_CONFIGURE:= --without-isl --without-cloog +endif + HOST_CONFIGURE_ARGS = \ --prefix=$(TOOLCHAIN_DIR) \ --build=$(GNU_HOST_NAME) \ --host=$(GNU_HOST_NAME) \ --target=$(REAL_GNU_TARGET_NAME) \ --with-sysroot=$(TOOLCHAIN_DIR) \ + --with-system-zlib \ + --with-zstd \ --enable-deterministic-archives \ --enable-plugins \ + --enable-lto \ + --disable-gprofng \ --disable-multilib \ --disable-werror \ --disable-nls \ @@ -82,7 +85,6 @@ define Host/Prepare $(call Host/Prepare/Default) ln -snf $(notdir $(HOST_BUILD_DIR)) $(BUILD_DIR_TOOLCHAIN)/$(PKG_NAME) $(CP) $(SCRIPT_DIR)/config.{guess,sub} $(HOST_BUILD_DIR)/ - $(SED) 's, " Linaro.*,,' $(HOST_BUILD_DIR)/bfd/version.h endef define Host/Compile @@ -90,22 +92,10 @@ define Host/Compile endef define Host/Install - mkdir -p $(TOOLCHAIN_DIR)/initial - $(MAKE) -C $(HOST_BUILD_DIR) \ - prefix=$(TOOLCHAIN_DIR)/initial \ - install $(MAKE) -C $(HOST_BUILD_DIR) \ - prefix=$(TOOLCHAIN_DIR) \ install - $(call FixupLibdir,$(TOOLCHAIN_DIR)/initial) - $(RM) $(TOOLCHAIN_DIR)/initial/lib/libiberty.a + $(call FixupLibdir,$(TOOLCHAIN_DIR)) $(CP) $(TOOLCHAIN_DIR)/bin/$(REAL_GNU_TARGET_NAME)-readelf $(HOST_BUILD_PREFIX)/bin/readelf - # ARC gcc requires extlib. - # If extlib is not available in "initial" folder - # initial gcc will fail to build libc. - if [ -d $(TOOLCHAIN_DIR)/extlib ]; then \ - $(CP) -r $(TOOLCHAIN_DIR)/extlib $(TOOLCHAIN_DIR)/initial/; \ - fi endef define Host/Clean diff --git a/toolchain/binutils/patches/2.39/005-ld-fix-NEWS-typos.patch b/toolchain/binutils/patches/2.39/005-ld-fix-NEWS-typos.patch new file mode 100644 index 0000000000..39c61d9319 --- /dev/null +++ b/toolchain/binutils/patches/2.39/005-ld-fix-NEWS-typos.patch @@ -0,0 +1,27 @@ +From 9284b63ea39cecbfc1522d9e143ecb7727d77eb5 Mon Sep 17 00:00:00 2001 +From: Martin Liska +Date: Mon, 8 Aug 2022 13:22:26 +0200 +Subject: [PATCH 005/160] ld: fix NEWS typos + +ld/ChangeLog: + + * NEWS: Fix 2 typos. +--- + ld/NEWS | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/ld/NEWS ++++ b/ld/NEWS +@@ -27,10 +27,10 @@ Changes in 2.39: + --enable-warn-rwx-segments=no + will make --no-warn-rwx-segments enabled by default. + +- --enable-defaul-execstack=no ++ --enable-default-execstack=no + will stop the creation of an executable stack simply because an input file + is missing a .note.GNU-stack section, even on architectures where this +- ehaviour is the default. ++ behaviour is the default. + + * TYPE= is now supported in an output section description to set the + section type value. diff --git a/toolchain/binutils/patches/2.39/008-gas-Dwarf-properly-skip-zero-size-functions.patch b/toolchain/binutils/patches/2.39/008-gas-Dwarf-properly-skip-zero-size-functions.patch new file mode 100644 index 0000000000..055da84129 --- /dev/null +++ b/toolchain/binutils/patches/2.39/008-gas-Dwarf-properly-skip-zero-size-functions.patch @@ -0,0 +1,90 @@ +From e8cf73215187b0c08679d726a5cc7c019fa3ea2e Mon Sep 17 00:00:00 2001 +From: Jan Beulich +Date: Wed, 10 Aug 2022 10:34:22 +0200 +Subject: [PATCH 008/160] gas/Dwarf: properly skip zero-size functions + +PR gas/29451 + +While out_debug_abbrev() properly skips such functions, out_debug_info() +mistakenly didn't. It needs to calculate the high_pc expression ahead of +time, in order to skip emitting any data for the function if the value +is zero. + +The one case which would still leave a zero-size entry is when +symbol_get_obj(symp)->size ends up evaluating to zero. I hope we can +expect that to not be the case, otherwise we'd need to have a way to +post-process .debug_info contents between resolving expressions and +actually writing the data out to the file. Even then it wouldn't be +entirely obvious in which way to alter the data. + +(cherry picked from commit d7abcbcea5ddd40a3bf28758b62f35933c59f996) +--- + gas/dwarf2dbg.c | 39 ++++++++++++++++++++------------------- + 1 file changed, 20 insertions(+), 19 deletions(-) + +--- a/gas/dwarf2dbg.c ++++ b/gas/dwarf2dbg.c +@@ -2882,6 +2882,7 @@ out_debug_info (segT info_seg, segT abbr + { + const char *name; + size_t len; ++ expressionS size = { .X_op = O_constant }; + + /* Skip warning constructs (see above). */ + if (symbol_get_bfdsym (symp)->flags & BSF_WARNING) +@@ -2895,6 +2896,18 @@ out_debug_info (segT info_seg, segT abbr + if (!S_IS_DEFINED (symp) || !S_IS_FUNCTION (symp)) + continue; + ++#if defined (OBJ_ELF) /* || defined (OBJ_MAYBE_ELF) */ ++ size.X_add_number = S_GET_SIZE (symp); ++ if (size.X_add_number == 0 && IS_ELF ++ && symbol_get_obj (symp)->size != NULL) ++ { ++ size.X_op = O_add; ++ size.X_op_symbol = make_expr_symbol (symbol_get_obj (symp)->size); ++ } ++#endif ++ if (size.X_op == O_constant && size.X_add_number == 0) ++ continue; ++ + subseg_set (str_seg, 0); + name_sym = symbol_temp_new_now_octets (); + name = S_GET_NAME (symp); +@@ -2920,29 +2933,17 @@ out_debug_info (segT info_seg, segT abbr + emit_expr (&exp, sizeof_address); + + /* DW_AT_high_pc */ +- exp.X_op = O_constant; +-#if defined (OBJ_ELF) /* || defined (OBJ_MAYBE_ELF) */ +- exp.X_add_number = S_GET_SIZE (symp); +- if (exp.X_add_number == 0 && IS_ELF +- && symbol_get_obj (symp)->size != NULL) +- { +- exp.X_op = O_add; +- exp.X_op_symbol = make_expr_symbol (symbol_get_obj (symp)->size); +- } +-#else +- exp.X_add_number = 0; +-#endif + if (DWARF2_VERSION < 4) + { +- if (exp.X_op == O_constant) +- exp.X_op = O_symbol; +- exp.X_add_symbol = symp; +- emit_expr (&exp, sizeof_address); ++ if (size.X_op == O_constant) ++ size.X_op = O_symbol; ++ size.X_add_symbol = symp; ++ emit_expr (&size, sizeof_address); + } +- else if (exp.X_op == O_constant) +- out_uleb128 (exp.X_add_number); ++ else if (size.X_op == O_constant) ++ out_uleb128 (size.X_add_number); + else +- emit_leb128_expr (symbol_get_value_expression (exp.X_op_symbol), 0); ++ emit_leb128_expr (symbol_get_value_expression (size.X_op_symbol), 0); + } + + /* End of children. */ diff --git a/toolchain/binutils/patches/2.39/009-PR29462-internal-error-in-relocate-at-powerpc.cc-107.patch b/toolchain/binutils/patches/2.39/009-PR29462-internal-error-in-relocate-at-powerpc.cc-107.patch new file mode 100644 index 0000000000..e325d3bcb0 --- /dev/null +++ b/toolchain/binutils/patches/2.39/009-PR29462-internal-error-in-relocate-at-powerpc.cc-107.patch @@ -0,0 +1,270 @@ +From e3b5d935247084dca057dea72be61b063fe2357a Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Wed, 10 Aug 2022 10:38:52 +0930 +Subject: [PATCH 009/160] PR29462, internal error in relocate, at + powerpc.cc:10796 + +Prior to the inline plt call support (commit 08be322439), the only +local syms with plt entries were local ifunc symbols. There shouldn't +be stubs for other local symbols so don't look for them. The patch +also fixes minor bugs in get_reference_flags; Many relocs are valid +only for ppc64 and a couple only for ppc32. + + PR 29462 + * powerpc.cc (Target_powerpc::Relocate::relocate): Rename + use_plt_offset to pltcal_to_direct, invert logic. For relocs + not used with inline plt sequences against local symbols, only + look for stubs when the symbol is an ifunc. + (Target_powerpc::Scan::get_reference_flags): Correct reloc + handling for relocs not valid for both 32-bit and 64-bit. + +(cherry picked from commit 6158b25f77db11712b84e6a4609898f2615ac749) +--- + gold/powerpc.cc | 129 ++++++++++++++++++++++++++++-------------------- + 1 file changed, 75 insertions(+), 54 deletions(-) + +--- a/gold/powerpc.cc ++++ b/gold/powerpc.cc +@@ -7675,22 +7675,18 @@ Target_powerpc::Scan:: + + switch (r_type) + { ++ case elfcpp::R_PPC64_TOC: ++ if (size != 64) ++ break; ++ // Fall through. + case elfcpp::R_POWERPC_NONE: + case elfcpp::R_POWERPC_GNU_VTINHERIT: + case elfcpp::R_POWERPC_GNU_VTENTRY: +- case elfcpp::R_PPC64_TOC: + // No symbol reference. + break; + + case elfcpp::R_PPC64_ADDR64: + case elfcpp::R_PPC64_UADDR64: +- case elfcpp::R_POWERPC_ADDR32: +- case elfcpp::R_POWERPC_UADDR32: +- case elfcpp::R_POWERPC_ADDR16: +- case elfcpp::R_POWERPC_UADDR16: +- case elfcpp::R_POWERPC_ADDR16_LO: +- case elfcpp::R_POWERPC_ADDR16_HI: +- case elfcpp::R_POWERPC_ADDR16_HA: + case elfcpp::R_PPC64_ADDR16_HIGHER34: + case elfcpp::R_PPC64_ADDR16_HIGHERA34: + case elfcpp::R_PPC64_ADDR16_HIGHEST34: +@@ -7700,6 +7696,16 @@ Target_powerpc::Scan:: + case elfcpp::R_PPC64_D34_HI30: + case elfcpp::R_PPC64_D34_HA30: + case elfcpp::R_PPC64_D28: ++ if (size != 64) ++ break; ++ // Fall through. ++ case elfcpp::R_POWERPC_ADDR32: ++ case elfcpp::R_POWERPC_UADDR32: ++ case elfcpp::R_POWERPC_ADDR16: ++ case elfcpp::R_POWERPC_UADDR16: ++ case elfcpp::R_POWERPC_ADDR16_LO: ++ case elfcpp::R_POWERPC_ADDR16_HI: ++ case elfcpp::R_POWERPC_ADDR16_HA: + ref = Symbol::ABSOLUTE_REF; + break; + +@@ -7710,13 +7716,14 @@ Target_powerpc::Scan:: + ref = Symbol::FUNCTION_CALL | Symbol::ABSOLUTE_REF; + break; + +- case elfcpp::R_PPC64_REL64: +- case elfcpp::R_POWERPC_REL32: + case elfcpp::R_PPC_LOCAL24PC: +- case elfcpp::R_POWERPC_REL16: +- case elfcpp::R_POWERPC_REL16_LO: +- case elfcpp::R_POWERPC_REL16_HI: +- case elfcpp::R_POWERPC_REL16_HA: ++ if (size != 32) ++ break; ++ // Fall through. ++ ref = Symbol::RELATIVE_REF; ++ break; ++ ++ case elfcpp::R_PPC64_REL64: + case elfcpp::R_PPC64_REL16_HIGH: + case elfcpp::R_PPC64_REL16_HIGHA: + case elfcpp::R_PPC64_REL16_HIGHER: +@@ -7729,36 +7736,45 @@ Target_powerpc::Scan:: + case elfcpp::R_PPC64_REL16_HIGHEST34: + case elfcpp::R_PPC64_REL16_HIGHESTA34: + case elfcpp::R_PPC64_PCREL28: ++ if (size != 64) ++ break; ++ // Fall through. ++ case elfcpp::R_POWERPC_REL32: ++ case elfcpp::R_POWERPC_REL16: ++ case elfcpp::R_POWERPC_REL16_LO: ++ case elfcpp::R_POWERPC_REL16_HI: ++ case elfcpp::R_POWERPC_REL16_HA: + ref = Symbol::RELATIVE_REF; + break; + ++ case elfcpp::R_PPC_PLTREL24: ++ if (size != 32) ++ break; ++ ref = Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF; ++ break; ++ + case elfcpp::R_PPC64_REL24_NOTOC: +- if (size == 32) ++ case elfcpp::R_PPC64_REL24_P9NOTOC: ++ case elfcpp::R_PPC64_PLT16_LO_DS: ++ case elfcpp::R_PPC64_PLTSEQ_NOTOC: ++ case elfcpp::R_PPC64_PLTCALL_NOTOC: ++ case elfcpp::R_PPC64_PLT_PCREL34: ++ case elfcpp::R_PPC64_PLT_PCREL34_NOTOC: ++ if (size != 64) + break; + // Fall through. +- case elfcpp::R_PPC64_REL24_P9NOTOC: + case elfcpp::R_POWERPC_REL24: +- case elfcpp::R_PPC_PLTREL24: + case elfcpp::R_POWERPC_REL14: + case elfcpp::R_POWERPC_REL14_BRTAKEN: + case elfcpp::R_POWERPC_REL14_BRNTAKEN: + case elfcpp::R_POWERPC_PLT16_LO: + case elfcpp::R_POWERPC_PLT16_HI: + case elfcpp::R_POWERPC_PLT16_HA: +- case elfcpp::R_PPC64_PLT16_LO_DS: + case elfcpp::R_POWERPC_PLTSEQ: +- case elfcpp::R_PPC64_PLTSEQ_NOTOC: + case elfcpp::R_POWERPC_PLTCALL: +- case elfcpp::R_PPC64_PLTCALL_NOTOC: +- case elfcpp::R_PPC64_PLT_PCREL34: +- case elfcpp::R_PPC64_PLT_PCREL34_NOTOC: + ref = Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF; + break; + +- case elfcpp::R_POWERPC_GOT16: +- case elfcpp::R_POWERPC_GOT16_LO: +- case elfcpp::R_POWERPC_GOT16_HI: +- case elfcpp::R_POWERPC_GOT16_HA: + case elfcpp::R_PPC64_GOT16_DS: + case elfcpp::R_PPC64_GOT16_LO_DS: + case elfcpp::R_PPC64_GOT_PCREL34: +@@ -7768,11 +7784,16 @@ Target_powerpc::Scan:: + case elfcpp::R_PPC64_TOC16_HA: + case elfcpp::R_PPC64_TOC16_DS: + case elfcpp::R_PPC64_TOC16_LO_DS: ++ if (size != 64) ++ break; ++ // Fall through. ++ case elfcpp::R_POWERPC_GOT16: ++ case elfcpp::R_POWERPC_GOT16_LO: ++ case elfcpp::R_POWERPC_GOT16_HI: ++ case elfcpp::R_POWERPC_GOT16_HA: + ref = Symbol::RELATIVE_REF; + break; + +- case elfcpp::R_POWERPC_GOT_TPREL16: +- case elfcpp::R_POWERPC_TLS: + case elfcpp::R_PPC64_TLSGD: + case elfcpp::R_PPC64_TLSLD: + case elfcpp::R_PPC64_TPREL34: +@@ -7781,6 +7802,11 @@ Target_powerpc::Scan:: + case elfcpp::R_PPC64_GOT_TLSLD_PCREL34: + case elfcpp::R_PPC64_GOT_TPREL_PCREL34: + case elfcpp::R_PPC64_GOT_DTPREL_PCREL34: ++ if (size != 64) ++ break; ++ // Fall through. ++ case elfcpp::R_POWERPC_GOT_TPREL16: ++ case elfcpp::R_POWERPC_TLS: + ref = Symbol::TLS_REF; + break; + +@@ -10671,10 +10697,8 @@ Target_powerpc::Reloca + bool has_stub_value = false; + bool localentry0 = false; + unsigned int r_sym = elfcpp::elf_r_sym(rela.get_r_info()); +- bool use_plt_offset +- = (gsym != NULL +- ? gsym->use_plt_offset(Scan::get_reference_flags(r_type, target)) +- : object->local_has_plt_offset(r_sym)); ++ bool pltcall_to_direct = false; ++ + if (is_plt16_reloc(r_type) + || r_type == elfcpp::R_PPC64_PLT_PCREL34 + || r_type == elfcpp::R_PPC64_PLT_PCREL34_NOTOC +@@ -10688,21 +10712,18 @@ Target_powerpc::Reloca + // that the decision depends on the PLTCALL reloc, and we don't + // know the address of that instruction when processing others + // in the sequence. So the decision needs to be made in +- // do_relax(). For now, don't optimise inline plt calls. +- if (gsym) +- use_plt_offset = gsym->has_plt_offset(); +- } +- if (use_plt_offset +- && !is_got_reloc(r_type) +- && !is_plt16_reloc(r_type) +- && r_type != elfcpp::R_PPC64_PLT_PCREL34 +- && r_type != elfcpp::R_PPC64_PLT_PCREL34_NOTOC +- && r_type != elfcpp::R_POWERPC_PLTSEQ +- && r_type != elfcpp::R_POWERPC_PLTCALL +- && r_type != elfcpp::R_PPC64_PLTSEQ_NOTOC +- && r_type != elfcpp::R_PPC64_PLTCALL_NOTOC +- && (!psymval->is_ifunc_symbol() +- || Scan::reloc_needs_plt_for_ifunc(target, object, r_type, false))) ++ // do_relax(). ++ pltcall_to_direct = !(gsym != NULL ++ ? gsym->has_plt_offset() ++ : object->local_has_plt_offset(r_sym)); ++ } ++ else if ((gsym != NULL ++ ? gsym->use_plt_offset(Scan::get_reference_flags(r_type, target)) ++ : psymval->is_ifunc_symbol() && object->local_has_plt_offset(r_sym)) ++ && !is_got_reloc(r_type) ++ && (!psymval->is_ifunc_symbol() ++ || Scan::reloc_needs_plt_for_ifunc(target, object, r_type, ++ false))) + { + if (size == 64 + && gsym != NULL +@@ -10796,9 +10817,9 @@ Target_powerpc::Reloca + gold_assert(has_stub_value || !(os->flags() & elfcpp::SHF_ALLOC)); + } + +- if (use_plt_offset && (is_plt16_reloc(r_type) +- || r_type == elfcpp::R_PPC64_PLT_PCREL34 +- || r_type == elfcpp::R_PPC64_PLT_PCREL34_NOTOC)) ++ if (!pltcall_to_direct && (is_plt16_reloc(r_type) ++ || r_type == elfcpp::R_PPC64_PLT_PCREL34 ++ || r_type == elfcpp::R_PPC64_PLT_PCREL34_NOTOC)) + { + const Output_data_plt_powerpc* plt; + if (gsym) +@@ -10826,7 +10847,7 @@ Target_powerpc::Reloca + value -= target->toc_pointer(); + } + } +- else if (!use_plt_offset ++ else if (pltcall_to_direct + && (is_plt16_reloc(r_type) + || r_type == elfcpp::R_POWERPC_PLTSEQ + || r_type == elfcpp::R_PPC64_PLTSEQ_NOTOC)) +@@ -10835,7 +10856,7 @@ Target_powerpc::Reloca + elfcpp::Swap<32, big_endian>::writeval(iview, nop); + r_type = elfcpp::R_POWERPC_NONE; + } +- else if (!use_plt_offset ++ else if (pltcall_to_direct + && (r_type == elfcpp::R_PPC64_PLT_PCREL34 + || r_type == elfcpp::R_PPC64_PLT_PCREL34_NOTOC)) + { +@@ -11316,8 +11337,8 @@ Target_powerpc::Reloca + } + else if (!has_stub_value) + { +- if (!use_plt_offset && (r_type == elfcpp::R_POWERPC_PLTCALL +- || r_type == elfcpp::R_PPC64_PLTCALL_NOTOC)) ++ if (pltcall_to_direct && (r_type == elfcpp::R_POWERPC_PLTCALL ++ || r_type == elfcpp::R_PPC64_PLTCALL_NOTOC)) + { + // PLTCALL without plt entry => convert to direct call + Insn* iview = reinterpret_cast(view); diff --git a/toolchain/binutils/patches/2.39/011-PR29466-APP-NO_APP-with-.linefile.patch b/toolchain/binutils/patches/2.39/011-PR29466-APP-NO_APP-with-.linefile.patch new file mode 100644 index 0000000000..f7b5819929 --- /dev/null +++ b/toolchain/binutils/patches/2.39/011-PR29466-APP-NO_APP-with-.linefile.patch @@ -0,0 +1,167 @@ +From 9e855cffa1fda44629e7f9b76dfa3e5a51a440e9 Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Thu, 11 Aug 2022 09:51:03 +0930 +Subject: [PATCH 011/160] PR29466, APP/NO_APP with .linefile + +Commit 53f2b36a54b9 exposed a bug in sb_scrub_and_add_sb that could +result in losing input. If scrubbing results in expansion past the +holding capacity of do_scrub_chars output buffer, then do_scrub_chars +stashes the extra input for the next call. That call never came +because sb_scrub_and_add_sb wrongly decided it was done. Fix that by +allowing sb_scrub_and_add_sb to see whether there is pending input. +Also allow a little extra space so that in most cases we won't need +to resize the output buffer. + +sb_scrub_and_add_sb also limited output to the size of the input, +rather than the actual output buffer size. Fixing that resulted in a +fail of gas/testsuite/macros/dot with an extra warning: "end of file +not at end of a line; newline inserted". OK, so the macro in dot.s +really does finish without end-of-line. Apparently the macro +expansion code relied on do_scrub_chars returning early. So fix that +too by adding a newline if needed in macro_expand_body. + + PR 29466 + * app.c (do_scrub_pending): New function. + * as.h: Declare it. + * input-scrub.c (input_scrub_include_sb): Add extra space for + two .linefile directives. + * sb.c (sb_scrub_and_add_sb): Take into account pending input. + Allow output to max. + * macro.c (macro_expand_body): Add terminating newline. + * testsuite/config/default.exp (SIZE, SIZEFLAGS): Define. + * testsuite/gas/macros/app5.d, + * testsuite/gas/macros/app5.s: New test. + * testsuite/gas/macros/macros.exp: Run it. + +(cherry picked from commit 4d74aab7aa562fe79d4669cdad0c32610531cbc0) +--- + gas/app.c | 13 +++++++++++++ + gas/as.h | 1 + + gas/input-scrub.c | 6 ++++-- + gas/macro.c | 2 ++ + gas/sb.c | 5 +++-- + gas/testsuite/config/default.exp | 8 ++++++++ + gas/testsuite/gas/macros/app5.d | 6 ++++++ + gas/testsuite/gas/macros/app5.s | 5 +++++ + gas/testsuite/gas/macros/macros.exp | 1 + + 9 files changed, 43 insertions(+), 4 deletions(-) + create mode 100644 gas/testsuite/gas/macros/app5.d + create mode 100644 gas/testsuite/gas/macros/app5.s + +--- a/gas/app.c ++++ b/gas/app.c +@@ -1537,3 +1537,16 @@ do_scrub_chars (size_t (*get) (char *, s + last_char = to[-1]; + return to - tostart; + } ++ ++/* Return amount of pending input. */ ++ ++size_t ++do_scrub_pending (void) ++{ ++ size_t len = 0; ++ if (saved_input) ++ len += saved_input_len; ++ if (state == -1) ++ len += strlen (out_string); ++ return len; ++} +--- a/gas/as.h ++++ b/gas/as.h +@@ -460,6 +460,7 @@ void input_scrub_insert_file (char *); + char * input_scrub_new_file (const char *); + char * input_scrub_next_buffer (char **bufp); + size_t do_scrub_chars (size_t (*get) (char *, size_t), char *, size_t); ++size_t do_scrub_pending (void); + bool scan_for_multibyte_characters (const unsigned char *, const unsigned char *, bool); + int gen_to_words (LITTLENUM_TYPE *, int, long); + int had_err (void); +--- a/gas/input-scrub.c ++++ b/gas/input-scrub.c +@@ -278,9 +278,11 @@ input_scrub_include_sb (sb *from, char * + + next_saved_file = input_scrub_push (position); + +- /* Allocate sufficient space: from->len + optional newline. */ ++ /* Allocate sufficient space: from->len plus optional newline ++ plus two ".linefile " directives, plus a little more for other ++ expansion. */ + newline = from->len >= 1 && from->ptr[0] != '\n'; +- sb_build (&from_sb, from->len + newline); ++ sb_build (&from_sb, from->len + newline + 2 * sizeof (".linefile") + 30); + if (expansion == expanding_repeat && from_sb_expansion >= expanding_macro) + expansion = expanding_nested; + from_sb_expansion = expansion; +--- a/gas/macro.c ++++ b/gas/macro.c +@@ -1056,6 +1056,8 @@ macro_expand_body (sb *in, sb *out, form + loclist = f; + } + ++ if (!err && (out->len == 0 || out->ptr[out->len - 1] != '\n')) ++ sb_add_char (out, '\n'); + return err; + } + +--- a/gas/sb.c ++++ b/gas/sb.c +@@ -119,11 +119,12 @@ sb_scrub_and_add_sb (sb *ptr, sb *s) + So we loop until the input S is consumed. */ + while (1) + { +- size_t copy = s->len - (scrub_position - s->ptr); ++ size_t copy = s->len - (scrub_position - s->ptr) + do_scrub_pending (); + if (copy == 0) + break; + sb_check (ptr, copy); +- ptr->len += do_scrub_chars (scrub_from_sb, ptr->ptr + ptr->len, copy); ++ ptr->len += do_scrub_chars (scrub_from_sb, ptr->ptr + ptr->len, ++ ptr->max - ptr->len); + } + + sb_to_scrub = 0; +--- a/gas/testsuite/config/default.exp ++++ b/gas/testsuite/config/default.exp +@@ -52,6 +52,14 @@ if ![info exists NMFLAGS] then { + set NMFLAGS {} + } + ++if ![info exists SIZE] then { ++ set SIZE [findfile $base_dir/size] ++} ++ ++if ![info exists SIZEFLAGS] then { ++ set SIZEFLAGS "" ++} ++ + if ![info exists OBJCOPY] then { + set OBJCOPY [findfile $base_dir/../../binutils/objcopy] + } +--- /dev/null ++++ b/gas/testsuite/gas/macros/app5.d +@@ -0,0 +1,6 @@ ++#name: APP with linefile ++#xfail: tic30-*-* ++#size: -G ++# pr29466 just check that the test assembles ++ ++#pass +--- /dev/null ++++ b/gas/testsuite/gas/macros/app5.s +@@ -0,0 +1,5 @@ ++#NO_APP ++#APP ++# 5 "foo.c" 1 ++# 0 "" 2 ++#NO_APP +--- a/gas/testsuite/gas/macros/macros.exp ++++ b/gas/testsuite/gas/macros/macros.exp +@@ -70,6 +70,7 @@ run_dump_test app2 + run_dump_test app3 + remote_download host "$srcdir/$subdir/app4b.s" + run_dump_test app4 ++run_dump_test app5 + + run_list_test badarg "" + diff --git a/toolchain/binutils/patches/2.39/039-LoongArch-ld-Fix-relocation-error-of-pcrel.patch b/toolchain/binutils/patches/2.39/039-LoongArch-ld-Fix-relocation-error-of-pcrel.patch new file mode 100644 index 0000000000..67e499de67 --- /dev/null +++ b/toolchain/binutils/patches/2.39/039-LoongArch-ld-Fix-relocation-error-of-pcrel.patch @@ -0,0 +1,128 @@ +From 509a2ec6ad3ea7eb3f4cf59538cf636a2126e4c3 Mon Sep 17 00:00:00 2001 +From: liuzhensong +Date: Fri, 2 Sep 2022 16:29:14 +0800 +Subject: [PATCH 039/160] LoongArch:ld: Fix relocation error of pcrel. + + Patch for branch 2.39. + Need to reduce the address of pc when using + reloction R_LARCH_SOP_PUSH_PCREL. + + bfd/ + * elfnn-loongarch.c +--- + bfd/elfnn-loongarch.c | 3 +- + ld/testsuite/ld-loongarch-elf/pcrel-const.d | 14 +++++++ + ld/testsuite/ld-loongarch-elf/pcrel-const.lds | 14 +++++++ + ld/testsuite/ld-loongarch-elf/pcrel-const.s | 12 ++++++ + ld/testsuite/ld-loongarch-elf/pr.exp | 39 +++++++++++++++++++ + 5 files changed, 81 insertions(+), 1 deletion(-) + create mode 100644 ld/testsuite/ld-loongarch-elf/pcrel-const.d + create mode 100644 ld/testsuite/ld-loongarch-elf/pcrel-const.lds + create mode 100644 ld/testsuite/ld-loongarch-elf/pcrel-const.s + create mode 100644 ld/testsuite/ld-loongarch-elf/pr.exp + +--- a/bfd/elfnn-loongarch.c ++++ b/bfd/elfnn-loongarch.c +@@ -2341,9 +2341,10 @@ loongarch_elf_relocate_section (bfd *out + case R_LARCH_SOP_PUSH_PLT_PCREL: + unresolved_reloc = false; + +- if (resolved_to_const) ++ if (!is_undefweak && resolved_to_const) + { + relocation += rel->r_addend; ++ relocation -= pc; + break; + } + else if (is_undefweak) +--- /dev/null ++++ b/ld/testsuite/ld-loongarch-elf/pcrel-const.d +@@ -0,0 +1,14 @@ ++#as: -mla-global-with-pcrel ++#objdump: -Drsz ++ ++.*:[ ]+file format .* ++ ++ ++Disassembly of section .text: ++ ++.* : ++#... ++[ ]+8:[ ]+02c04084[ ]+addi.d[ ]+\$a0,[ ]+\$a0,[ ]+16\(0x10\) ++#... ++0+14 <__sec_end>: ++#pass +--- /dev/null ++++ b/ld/testsuite/ld-loongarch-elf/pcrel-const.lds +@@ -0,0 +1,14 @@ ++ENTRY(foo); ++SECTIONS ++{ ++ .text : { ++ *(.text*) ++ } ++ ++ .data : { ++ __sec_start = .; ++ *(.gzdata) ++ __sec_end = .; ++ } ++} ++PROVIDE(__sec_size = __sec_end); +--- /dev/null ++++ b/ld/testsuite/ld-loongarch-elf/pcrel-const.s +@@ -0,0 +1,12 @@ ++ .text ++ .align 2 ++ .globl foo ++ .type foo, @function ++foo: ++ nop ++ la.global $r4,__sec_size ++ ldptr.w $r4,$r4,0 ++ jr $r1 ++ .size foo, .-foo ++ .data ++ .word 1 +--- /dev/null ++++ b/ld/testsuite/ld-loongarch-elf/pr.exp +@@ -0,0 +1,39 @@ ++# Expect script for LoongArch ELF linker tests ++# Copyright (C) 2022 Free Software Foundation, Inc. ++# ++# This file is part of the GNU Binutils. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, ++# MA 02110-1301, USA. ++# ++ ++if ![istarget loongarch64-*-*] { ++ return ++} ++ ++set link_tests [list \ ++ [list \ ++ "pcrel const" \ ++ "-T pcrel-const.lds" "" \ ++ "-mla-global-with-pcrel" \ ++ { pcrel-const.s } \ ++ [list \ ++ [list objdump -D pcrel-const.d] \ ++ ] \ ++ "pcrel-const" \ ++ ] \ ++] ++ ++run_ld_link_tests $link_tests diff --git a/toolchain/binutils/patches/2.39/043-Re-PR29466-APP-NO_APP-with-linefile.patch b/toolchain/binutils/patches/2.39/043-Re-PR29466-APP-NO_APP-with-linefile.patch new file mode 100644 index 0000000000..1de501a1ae --- /dev/null +++ b/toolchain/binutils/patches/2.39/043-Re-PR29466-APP-NO_APP-with-linefile.patch @@ -0,0 +1,27 @@ +From 4233be14a34d754a70b8b6f6fa42d21f35c6e030 Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Sat, 10 Sep 2022 07:30:57 +0930 +Subject: [PATCH 043/160] Re: PR29466, APP/NO_APP with linefile + +It looks like I copied the SIZE init across from +binutils/testsuite/config/default.exp without some necessary editing. + + PR 29466 + * testsuite/config/default.exp (SIZE): Adjust relative path. + +(cherry picked from commit 1180f540d5f2f7751b5309bdd6c38d69fcf699e7) +--- + gas/testsuite/config/default.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/gas/testsuite/config/default.exp ++++ b/gas/testsuite/config/default.exp +@@ -53,7 +53,7 @@ if ![info exists NMFLAGS] then { + } + + if ![info exists SIZE] then { +- set SIZE [findfile $base_dir/size] ++ set SIZE [findfile $base_dir/../../binutils/size] + } + + if ![info exists SIZEFLAGS] then { diff --git a/toolchain/binutils/patches/2.39/050-PowerPC64-pcrel-got-relocs-against-local-symbols.patch b/toolchain/binutils/patches/2.39/050-PowerPC64-pcrel-got-relocs-against-local-symbols.patch new file mode 100644 index 0000000000..5c89f6804e --- /dev/null +++ b/toolchain/binutils/patches/2.39/050-PowerPC64-pcrel-got-relocs-against-local-symbols.patch @@ -0,0 +1,38 @@ +From 4d7bba23a39fba18d6d13a2941a3c232011a7064 Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Fri, 16 Sep 2022 18:08:44 +0930 +Subject: [PATCH 050/160] PowerPC64 pcrel got relocs against local symbols + +Not that anyone would want to indirect via the GOT when an address can +be loaded directly with pla, the following: + + pld 3,x@got@pcrel +x: + +leads to "Internal error in md_apply_fix", because the generic parts +of assembler fixup handling convert the fx_pcrel fixup to one without +a symbol. Stop that happening. + + * config/tc-ppc.c (ppc_force_relocation): Add PLT_PCREL34 and + assorted GOT_PCREL34 relocs. + +(cherry picked from commit 49c3ed081fed6b8e2b48fdc48f805f11e4589514) +--- + gas/config/tc-ppc.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/gas/config/tc-ppc.c ++++ b/gas/config/tc-ppc.c +@@ -6676,6 +6676,12 @@ ppc_force_relocation (fixS *fix) + case BFD_RELOC_PPC_BA16_BRNTAKEN: + case BFD_RELOC_24_PLT_PCREL: + case BFD_RELOC_PPC64_TOC: ++ case BFD_RELOC_PPC64_PLT_PCREL34: ++ case BFD_RELOC_PPC64_GOT_PCREL34: ++ case BFD_RELOC_PPC64_GOT_TLSGD_PCREL34: ++ case BFD_RELOC_PPC64_GOT_TLSLD_PCREL34: ++ case BFD_RELOC_PPC64_GOT_TPREL_PCREL34: ++ case BFD_RELOC_PPC64_GOT_DTPREL_PCREL34: + return 1; + case BFD_RELOC_PPC_B26: + case BFD_RELOC_PPC_BA26: diff --git a/toolchain/binutils/patches/2.39/055-Re-PowerPC64-pcrel-got-relocs-against-local-symbols.patch b/toolchain/binutils/patches/2.39/055-Re-PowerPC64-pcrel-got-relocs-against-local-symbols.patch new file mode 100644 index 0000000000..19b80c3442 --- /dev/null +++ b/toolchain/binutils/patches/2.39/055-Re-PowerPC64-pcrel-got-relocs-against-local-symbols.patch @@ -0,0 +1,94 @@ +From 010db38b54b589ca3e95b498aba2831064970171 Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Wed, 21 Sep 2022 09:06:29 +0930 +Subject: [PATCH 055/160] Re: PowerPC64 pcrel got relocs against local symbols + +The last patch wasn't all that shiny. There are rather a lot more +relocations that can hit the assertion in md_apply_fix if the symbol +is local or absolute. Fix them all. + + * config/tc-ppc.c (ppc_force_relocation): Add all relocs that + expect a symbol in md_apply_fix. Remove tls pcrel relocs + already covered in general tls match range. + +(cherry picked from commit 8b168f1a1e09e337d2a970f204a0230c091bbe58) +--- + gas/config/tc-ppc.c | 58 ++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 52 insertions(+), 6 deletions(-) + +--- a/gas/config/tc-ppc.c ++++ b/gas/config/tc-ppc.c +@@ -6666,8 +6666,6 @@ ppc_force_relocation (fixS *fix) + int + ppc_force_relocation (fixS *fix) + { +- /* Branch prediction relocations must force a relocation, as must +- the vtable description relocs. */ + switch (fix->fx_r_type) + { + case BFD_RELOC_PPC_B16_BRTAKEN: +@@ -6676,12 +6674,60 @@ ppc_force_relocation (fixS *fix) + case BFD_RELOC_PPC_BA16_BRNTAKEN: + case BFD_RELOC_24_PLT_PCREL: + case BFD_RELOC_PPC64_TOC: ++ case BFD_RELOC_16_GOTOFF: ++ case BFD_RELOC_LO16_GOTOFF: ++ case BFD_RELOC_HI16_GOTOFF: ++ case BFD_RELOC_HI16_S_GOTOFF: ++ case BFD_RELOC_LO16_PLTOFF: ++ case BFD_RELOC_HI16_PLTOFF: ++ case BFD_RELOC_HI16_S_PLTOFF: ++ case BFD_RELOC_GPREL16: ++ case BFD_RELOC_16_BASEREL: ++ case BFD_RELOC_LO16_BASEREL: ++ case BFD_RELOC_HI16_BASEREL: ++ case BFD_RELOC_HI16_S_BASEREL: ++ case BFD_RELOC_PPC_TOC16: ++ case BFD_RELOC_PPC64_TOC16_LO: ++ case BFD_RELOC_PPC64_TOC16_HI: ++ case BFD_RELOC_PPC64_TOC16_HA: ++ case BFD_RELOC_PPC64_PLTGOT16: ++ case BFD_RELOC_PPC64_PLTGOT16_LO: ++ case BFD_RELOC_PPC64_PLTGOT16_HI: ++ case BFD_RELOC_PPC64_PLTGOT16_HA: ++ case BFD_RELOC_PPC64_GOT16_DS: ++ case BFD_RELOC_PPC64_GOT16_LO_DS: ++ case BFD_RELOC_PPC64_PLT16_LO_DS: ++ case BFD_RELOC_PPC64_SECTOFF_DS: ++ case BFD_RELOC_PPC64_SECTOFF_LO_DS: ++ case BFD_RELOC_PPC64_TOC16_DS: ++ case BFD_RELOC_PPC64_TOC16_LO_DS: ++ case BFD_RELOC_PPC64_PLTGOT16_DS: ++ case BFD_RELOC_PPC64_PLTGOT16_LO_DS: ++ case BFD_RELOC_PPC_EMB_NADDR16: ++ case BFD_RELOC_PPC_EMB_NADDR16_LO: ++ case BFD_RELOC_PPC_EMB_NADDR16_HI: ++ case BFD_RELOC_PPC_EMB_NADDR16_HA: ++ case BFD_RELOC_PPC_EMB_SDAI16: ++ case BFD_RELOC_PPC_EMB_SDA2I16: ++ case BFD_RELOC_PPC_EMB_SDA2REL: ++ case BFD_RELOC_PPC_EMB_SDA21: ++ case BFD_RELOC_PPC_EMB_MRKREF: ++ case BFD_RELOC_PPC_EMB_RELSEC16: ++ case BFD_RELOC_PPC_EMB_RELST_LO: ++ case BFD_RELOC_PPC_EMB_RELST_HI: ++ case BFD_RELOC_PPC_EMB_RELST_HA: ++ case BFD_RELOC_PPC_EMB_BIT_FLD: ++ case BFD_RELOC_PPC_EMB_RELSDA: ++ case BFD_RELOC_PPC_VLE_SDA21: ++ case BFD_RELOC_PPC_VLE_SDA21_LO: ++ case BFD_RELOC_PPC_VLE_SDAREL_LO16A: ++ case BFD_RELOC_PPC_VLE_SDAREL_LO16D: ++ case BFD_RELOC_PPC_VLE_SDAREL_HI16A: ++ case BFD_RELOC_PPC_VLE_SDAREL_HI16D: ++ case BFD_RELOC_PPC_VLE_SDAREL_HA16A: ++ case BFD_RELOC_PPC_VLE_SDAREL_HA16D: + case BFD_RELOC_PPC64_PLT_PCREL34: + case BFD_RELOC_PPC64_GOT_PCREL34: +- case BFD_RELOC_PPC64_GOT_TLSGD_PCREL34: +- case BFD_RELOC_PPC64_GOT_TLSLD_PCREL34: +- case BFD_RELOC_PPC64_GOT_TPREL_PCREL34: +- case BFD_RELOC_PPC64_GOT_DTPREL_PCREL34: + return 1; + case BFD_RELOC_PPC_B26: + case BFD_RELOC_PPC_BA26: diff --git a/toolchain/binutils/patches/2.39/058-elf-Reset-alignment-for-each-PT_LOAD-segment.patch b/toolchain/binutils/patches/2.39/058-elf-Reset-alignment-for-each-PT_LOAD-segment.patch new file mode 100644 index 0000000000..aaf7a1b053 --- /dev/null +++ b/toolchain/binutils/patches/2.39/058-elf-Reset-alignment-for-each-PT_LOAD-segment.patch @@ -0,0 +1,89 @@ +From a98316d5cf970cbc99689797d84c2ea832bcdcbb Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Mon, 1 Aug 2022 16:02:39 -0700 +Subject: [PATCH 058/160] elf: Reset alignment for each PT_LOAD segment + +Reset alignment for each PT_LOAD segment to avoid using alignment from +the previous PT_LOAD segment. + +bfd/ + + PR ld/29435 + * elf.c (assign_file_positions_for_load_sections): Reset + alignment for each PT_LOAD segment. + +ld/ + + PR ld/29435 + * testsuite/ld-elf/pr29435.d: New file. + * testsuite/ld-elf/pr29435.s: Likewise. + +(cherry picked from commit 59f214544c50ec7ebbca285ff2b4949f48671690) +--- + bfd/elf.c | 7 ++++--- + ld/testsuite/ld-elf/pr29435.d | 11 +++++++++++ + ld/testsuite/ld-elf/pr29435.s | 6 ++++++ + 3 files changed, 21 insertions(+), 3 deletions(-) + create mode 100644 ld/testsuite/ld-elf/pr29435.d + create mode 100644 ld/testsuite/ld-elf/pr29435.s + +--- a/bfd/elf.c ++++ b/bfd/elf.c +@@ -5438,8 +5438,6 @@ assign_file_positions_for_load_sections + Elf_Internal_Phdr *p; + file_ptr off; /* Octets. */ + bfd_size_type maxpagesize; +- bfd_size_type p_align; +- bool p_align_p = false; + unsigned int alloc, actual; + unsigned int i, j; + struct elf_segment_map **sorted_seg_map; +@@ -5524,7 +5522,6 @@ assign_file_positions_for_load_sections + qsort (sorted_seg_map, alloc, sizeof (*sorted_seg_map), + elf_sort_segments); + +- p_align = bed->p_align; + maxpagesize = 1; + if ((abfd->flags & D_PAGED) != 0) + { +@@ -5559,6 +5556,8 @@ assign_file_positions_for_load_sections + asection **secpp; + bfd_vma off_adjust; /* Octets. */ + bool no_contents; ++ bfd_size_type p_align; ++ bool p_align_p; + + /* An ELF segment (described by Elf_Internal_Phdr) may contain a + number of sections with contents contributing to both p_filesz +@@ -5569,6 +5568,8 @@ assign_file_positions_for_load_sections + p = phdrs + m->idx; + p->p_type = m->p_type; + p->p_flags = m->p_flags; ++ p_align = bed->p_align; ++ p_align_p = false; + + if (m->count == 0) + p->p_vaddr = m->p_vaddr_offset * opb; +--- /dev/null ++++ b/ld/testsuite/ld-elf/pr29435.d +@@ -0,0 +1,11 @@ ++#ld: -shared -z separate-code -z relro ++#xfail: ![check_shared_lib_support] ++#xfail: ![check_relro_support] ++#readelf: -Wl ++ ++#failif ++#... ++ +LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ .* 0x8000 ++#... ++ +LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ .* 0x8000 ++#... +--- /dev/null ++++ b/ld/testsuite/ld-elf/pr29435.s +@@ -0,0 +1,6 @@ ++ .text ++ .balign 0x8000 ++ .globl foo ++ .type foo, %function ++foo: ++ .byte 0 diff --git a/toolchain/binutils/patches/2.39/063-PR29542-PowerPC-gold-internal-error-in-get_output_vi.patch b/toolchain/binutils/patches/2.39/063-PR29542-PowerPC-gold-internal-error-in-get_output_vi.patch new file mode 100644 index 0000000000..0d66b7750f --- /dev/null +++ b/toolchain/binutils/patches/2.39/063-PR29542-PowerPC-gold-internal-error-in-get_output_vi.patch @@ -0,0 +1,29 @@ +From 041c22e35de06d22566f4c71e4425c3351215e66 Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Sun, 25 Sep 2022 12:07:36 +0930 +Subject: [PATCH 063/160] PR29542, PowerPC gold internal error in + get_output_view, + +We were attempting to set a BSS style section contents. + + PR 29542 + * powerpc.cc (Output_data_plt_powerpc::do_write): Don't set .plt, + .iplt or .lplt section contents when position independent. + +(cherry picked from commit c21736aed1d4877e090df60362413669dbdc391d) +--- + gold/powerpc.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/gold/powerpc.cc ++++ b/gold/powerpc.cc +@@ -4338,7 +4338,8 @@ template + void + Output_data_plt_powerpc::do_write(Output_file* of) + { +- if (!this->sym_ents_.empty()) ++ if (!this->sym_ents_.empty() ++ && !parameters->options().output_is_position_independent()) + { + const section_size_type offset = this->offset(); + const section_size_type oview_size diff --git a/toolchain/binutils/patches/2.39/116-arm-Use-DWARF-numbering-convention-for-pseudo-regist.patch b/toolchain/binutils/patches/2.39/116-arm-Use-DWARF-numbering-convention-for-pseudo-regist.patch new file mode 100644 index 0000000000..82a015ee2b --- /dev/null +++ b/toolchain/binutils/patches/2.39/116-arm-Use-DWARF-numbering-convention-for-pseudo-regist.patch @@ -0,0 +1,301 @@ +From 88ac930a725b8aac8284a2738f03b843f4343dd0 Mon Sep 17 00:00:00 2001 +From: Victor Do Nascimento +Date: Thu, 17 Nov 2022 14:48:37 +0000 +Subject: [PATCH 116/160] arm: Use DWARF numbering convention for + pseudo-register representation + +The patch, initially submitted to trunk in +https://sourceware.org/pipermail/binutils/2022-July/122092.html ensures correct +support for handling .save directives for mixed-register type lists involving +the ra_auth_code pseudo-register, whereby the support first introduced in 2.39 +(https://sourceware.org/pipermail/binutils/2022-May/120672.html) led to the +generation of unwinder code popping registers in reversed order. + +gas/Changelog: + + * config/tc-arm.c (REG_RA_AUTH_CODE): New. + (parse_dot_save): Likewise. + (parse_reg_list): Remove obsolete code. + (reg_names): Set ra_auth_code to 143. + (s_arm_unwind_save): Handle core and pseudo-register lists via + parse_dot_save. + (s_arm_unwind_save_mixed): Deleted. + (s_arm_unwind_save_pseudo): Handle one register at a time. + * testsuite/gas/arm/unwind-pacbti-m-readelf.d: Fix test. + * testsuite/gas/arm/unwind-pacbti-m.d: Likewise. + +(cherry picked from commit 3a368c4c248f6e9f4bda3a5369befa17a4560293) +--- + gas/config/tc-arm.c | 159 ++++++++++-------- + .../gas/arm/unwind-pacbti-m-readelf.d | 4 +- + gas/testsuite/gas/arm/unwind-pacbti-m.d | 2 +- + 3 files changed, 95 insertions(+), 70 deletions(-) + +--- a/gas/config/tc-arm.c ++++ b/gas/config/tc-arm.c +@@ -742,6 +742,7 @@ const char * const reg_expected_msgs[] = + #define REG_SP 13 + #define REG_LR 14 + #define REG_PC 15 ++#define REG_RA_AUTH_CODE 143 + + /* ARM instructions take 4bytes in the object file, Thumb instructions + take 2: */ +@@ -1943,21 +1944,6 @@ parse_reg_list (char ** strp, enum reg_l + + reg = arm_reg_parse (&str, rt); + +- /* Skip over allowed registers of alternative types in mixed-type +- register lists. */ +- if (reg == FAIL && rt == REG_TYPE_PSEUDO +- && ((reg = arm_reg_parse (&str, REG_TYPE_RN)) != FAIL)) +- { +- cur_reg = reg; +- continue; +- } +- else if (reg == FAIL && rt == REG_TYPE_RN +- && ((reg = arm_reg_parse (&str, REG_TYPE_PSEUDO)) != FAIL)) +- { +- cur_reg = reg; +- continue; +- } +- + if (etype == REGLIST_CLRM) + { + if (reg == REG_SP || reg == REG_PC) +@@ -4139,7 +4125,6 @@ s_arm_unwind_fnstart (int ignored ATTRIB + unwind.sp_restored = 0; + } + +- + /* Parse a handlerdata directive. Creates the exception handling table entry + for the function. */ + +@@ -4297,15 +4282,19 @@ s_arm_unwind_personality (int ignored AT + /* Parse a directive saving pseudo registers. */ + + static void +-s_arm_unwind_save_pseudo (long range) ++s_arm_unwind_save_pseudo (int regno) + { + valueT op; + +- if (range & (1 << 12)) ++ switch (regno) + { ++ case REG_RA_AUTH_CODE: + /* Opcode for restoring RA_AUTH_CODE. */ + op = 0xb4; + add_unwind_opcode (op, 1); ++ break; ++ default: ++ as_bad (_("Unknown register %d encountered\n"), regno); + } + } + +@@ -4375,6 +4364,80 @@ s_arm_unwind_save_core (long range) + } + } + ++/* Implement correct handling of .save lists enabling the split into ++sublists where necessary, while preserving correct sublist ordering. */ ++ ++static void ++parse_dot_save (char **str_p, int prev_reg) ++{ ++ long core_regs = 0; ++ int reg; ++ int in_range = 0; ++ ++ if (**str_p == ',') ++ *str_p += 1; ++ if (**str_p == '}') ++ { ++ *str_p += 1; ++ return; ++ } ++ ++ while ((reg = arm_reg_parse (str_p, REG_TYPE_RN)) != FAIL) ++ { ++ if (!in_range) ++ { ++ if (core_regs & (1 << reg)) ++ as_tsktsk (_("Warning: duplicated register (r%d) in register list"), ++ reg); ++ else if (reg <= prev_reg) ++ as_tsktsk (_("Warning: register list not in ascending order")); ++ ++ core_regs |= (1 << reg); ++ prev_reg = reg; ++ if (skip_past_char(str_p, '-') != FAIL) ++ in_range = 1; ++ else if (skip_past_comma(str_p) == FAIL) ++ first_error (_("bad register list")); ++ } ++ else ++ { ++ int i; ++ if (reg <= prev_reg) ++ first_error (_("bad range in register list")); ++ for (i = prev_reg + 1; i <= reg; i++) ++ { ++ if (core_regs & (1 << i)) ++ as_tsktsk (_("Warning: duplicated register (r%d) in register list"), ++ i); ++ else ++ core_regs |= 1 << i; ++ } ++ in_range = 0; ++ } ++ } ++ if (core_regs) ++ { ++ /* Higher register numbers go in higher memory addresses. When splitting a list, ++ right-most sublist should therefore be .saved first. Use recursion for this. */ ++ parse_dot_save (str_p, reg); ++ /* We're back from recursion, so emit .save insn for sublist. */ ++ s_arm_unwind_save_core (core_regs); ++ return; ++ } ++ /* Handle pseudo-regs, under assumption these are emitted singly. */ ++ else if ((reg = arm_reg_parse (str_p, REG_TYPE_PSEUDO)) != FAIL) ++ { ++ /* Recurse for remainder of input. Note: No assumption is made regarding which ++ register in core register set holds pseudo-register. It's not considered in ++ ordering check beyond ensuring it's not sandwiched between 2 consecutive ++ registers. */ ++ parse_dot_save (str_p, prev_reg + 1); ++ s_arm_unwind_save_pseudo (reg); ++ return; ++ } ++ else ++ as_bad (BAD_SYNTAX); ++} + + /* Parse a directive saving FPA registers. */ + +@@ -4716,39 +4779,13 @@ s_arm_unwind_save_mmxwcg (void) + ignore_rest_of_line (); + } + +-/* Convert range and mask_range into a sequence of s_arm_unwind_core +- and s_arm_unwind_pseudo operations. We assume that mask_range will +- not have consecutive bits set, or that one operation per bit is +- acceptable. */ +- +-static void +-s_arm_unwind_save_mixed (long range, long mask_range) +-{ +- while (mask_range) +- { +- long mask_bit = mask_range & -mask_range; +- long subrange = range & (mask_bit - 1); +- +- if (subrange) +- s_arm_unwind_save_core (subrange); +- +- s_arm_unwind_save_pseudo (mask_bit); +- range &= ~subrange; +- mask_range &= ~mask_bit; +- } +- +- if (range) +- s_arm_unwind_save_core (range); +-} +- + /* Parse an unwind_save directive. + If the argument is non-zero, this is a .vsave directive. */ + + static void + s_arm_unwind_save (int arch_v6) + { +- char *peek, *mask_peek; +- long range, mask_range; ++ char *peek; + struct reg_entry *reg; + bool had_brace = false; + +@@ -4756,7 +4793,7 @@ s_arm_unwind_save (int arch_v6) + as_bad (MISSING_FNSTART); + + /* Figure out what sort of save we have. */ +- peek = mask_peek = input_line_pointer; ++ peek = input_line_pointer; + + if (*peek == '{') + { +@@ -4788,20 +4825,13 @@ s_arm_unwind_save (int arch_v6) + + case REG_TYPE_PSEUDO: + case REG_TYPE_RN: +- mask_range = parse_reg_list (&mask_peek, REGLIST_PSEUDO); +- range = parse_reg_list (&input_line_pointer, REGLIST_RN); +- +- if (range == FAIL || mask_range == FAIL) +- { +- as_bad (_("expected register list")); +- ignore_rest_of_line (); +- return; +- } +- +- demand_empty_rest_of_line (); +- +- s_arm_unwind_save_mixed (range, mask_range); +- return; ++ { ++ if (had_brace) ++ input_line_pointer++; ++ parse_dot_save (&input_line_pointer, -1); ++ demand_empty_rest_of_line (); ++ return; ++ } + + case REG_TYPE_VFD: + if (arch_v6) +@@ -23993,12 +24023,8 @@ static const struct reg_entry reg_names[ + /* XScale accumulator registers. */ + REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE), + +- /* DWARF ABI defines RA_AUTH_CODE to 143. It also reserves 134-142 for future +- expansion. RA_AUTH_CODE here is given the value 143 % 134 to make it easy +- for tc_arm_regname_to_dw2regnum to translate to DWARF reg number using +- 134 + reg_number should the range 134 to 142 be used for more pseudo regs +- in the future. This also helps fit RA_AUTH_CODE into a bitmask. */ +- REGDEF(ra_auth_code,12,PSEUDO), ++ /* AADWARF32 defines RA_AUTH_CODE to 143. */ ++ REGDEF(ra_auth_code,143,PSEUDO), + }; + #undef REGDEF + #undef REGNUM +@@ -27905,7 +27931,6 @@ create_unwind_entry (int have_data) + return 0; + } + +- + /* Initialize the DWARF-2 unwind information for this procedure. */ + + void +--- a/gas/testsuite/gas/arm/unwind-pacbti-m-readelf.d ++++ b/gas/testsuite/gas/arm/unwind-pacbti-m-readelf.d +@@ -10,11 +10,11 @@ Unwind section '.ARM.exidx' at offset 0x + + 0x0 : @0x0 + Compact model index: 1 +- 0x84 0x00 pop {r14} + 0xb4 pop {ra_auth_code} + 0x84 0x00 pop {r14} +- 0xb4 pop {ra_auth_code} + 0xa3 pop {r4, r5, r6, r7} + 0xb4 pop {ra_auth_code} ++ 0x84 0x00 pop {r14} ++ 0xb4 pop {ra_auth_code} + 0xa8 pop {r4, r14} + 0xb0 finish +--- a/gas/testsuite/gas/arm/unwind-pacbti-m.d ++++ b/gas/testsuite/gas/arm/unwind-pacbti-m.d +@@ -8,4 +8,4 @@ + .*: file format.* + + Contents of section .ARM.extab: +- 0000 (00840281 b40084b4 b0a8b4a3|81028400 b48400b4 a3b4a8b0) 00000000 .* ++ 0000 (84b40281 84b4a300 b0a8b400|8102b484 00a3b484 00b4a8b0) 00000000 .* diff --git a/toolchain/binutils/patches/2.39/300-001_ld_makefile_patch.patch b/toolchain/binutils/patches/2.39/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000000..ac80bf4259 --- /dev/null +++ b/toolchain/binutils/patches/2.39/300-001_ld_makefile_patch.patch @@ -0,0 +1,22 @@ +--- a/ld/Makefile.am ++++ b/ld/Makefile.am +@@ -50,7 +50,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS) + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- a/ld/Makefile.in ++++ b/ld/Makefile.in +@@ -569,7 +569,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS) + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + BASEDIR = $(srcdir)/.. + BFDDIR = $(BASEDIR)/bfd + INCDIR = $(BASEDIR)/include diff --git a/toolchain/binutils/patches/2.39/400-mips_no_dynamic_linking_sym.patch b/toolchain/binutils/patches/2.39/400-mips_no_dynamic_linking_sym.patch new file mode 100644 index 0000000000..f499dfdc02 --- /dev/null +++ b/toolchain/binutils/patches/2.39/400-mips_no_dynamic_linking_sym.patch @@ -0,0 +1,18 @@ +--- a/bfd/elfxx-mips.c ++++ b/bfd/elfxx-mips.c +@@ -8066,6 +8066,7 @@ _bfd_mips_elf_create_dynamic_sections (b + + name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING"; + bh = NULL; ++ if (0) { + if (!(_bfd_generic_link_add_one_symbol + (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0, + NULL, false, get_elf_backend_data (abfd)->collect, &bh))) +@@ -8078,6 +8079,7 @@ _bfd_mips_elf_create_dynamic_sections (b + + if (! bfd_elf_link_record_dynamic_symbol (info, h)) + return false; ++ } + + if (! mips_elf_hash_table (info)->use_rld_obj_head) + { diff --git a/toolchain/binutils/patches/2.39/500-Change-default-emulation-for-mips64-linux.patch b/toolchain/binutils/patches/2.39/500-Change-default-emulation-for-mips64-linux.patch new file mode 100644 index 0000000000..8a43563db0 --- /dev/null +++ b/toolchain/binutils/patches/2.39/500-Change-default-emulation-for-mips64-linux.patch @@ -0,0 +1,38 @@ +--- a/bfd/config.bfd ++++ b/bfd/config.bfd +@@ -928,12 +928,12 @@ case "${targ}" in + targ_selvecs="mips_elf32_le_vec mips_elf64_be_vec mips_elf64_le_vec mips_ecoff_be_vec mips_ecoff_le_vec" + ;; + mips64*el-*-linux*) +- targ_defvec=mips_elf32_ntrad_le_vec +- targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_le_vec mips_elf64_trad_be_vec" ++ targ_defvec=mips_elf64_trad_le_vec ++ targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_be_vec" + ;; + mips64*-*-linux*) +- targ_defvec=mips_elf32_ntrad_be_vec +- targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec" ++ targ_defvec=mips_elf64_trad_be_vec ++ targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_le_vec" + ;; + mips*el-*-linux*) + targ_defvec=mips_elf32_trad_le_vec +--- a/ld/configure.tgt ++++ b/ld/configure.tgt +@@ -580,12 +580,12 @@ mips*-*-vxworks*) targ_emul=elf32ebmipvx + ;; + mips*-*-windiss) targ_emul=elf32mipswindiss + ;; +-mips64*el-*-linux-*) targ_emul=elf32ltsmipn32 +- targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" ++mips64*el-*-linux-*) targ_emul=elf64ltsmip ++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32ltsmip elf32btsmip elf64btsmip" + targ_extra_libpath=$targ_extra_emuls + ;; +-mips64*-*-linux-*) targ_emul=elf32btsmipn32 +- targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" ++mips64*-*-linux-*) targ_emul=elf64btsmip ++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip" + targ_extra_libpath=$targ_extra_emuls + ;; + mips*el-*-linux-*) targ_emul=elf32ltsmip diff --git a/toolchain/binutils/patches/2.40/005-libctf-update-regexp-to-allow-makeinfo-to-build-docu.patch b/toolchain/binutils/patches/2.40/005-libctf-update-regexp-to-allow-makeinfo-to-build-docu.patch new file mode 100644 index 0000000000..19af34091c --- /dev/null +++ b/toolchain/binutils/patches/2.40/005-libctf-update-regexp-to-allow-makeinfo-to-build-docu.patch @@ -0,0 +1,70 @@ +From f7c5db99b76e8dde89335d794c82fcbfbf53c612 Mon Sep 17 00:00:00 2001 +From: Enze Li +Date: Sat, 14 Jan 2023 11:33:48 +0800 +Subject: [PATCH 05/50] libctf: update regexp to allow makeinfo to build + document + +While trying to build gdb on latest openSUSE Tumbleweed, I noticed the +following warning, + + checking for makeinfo... makeinfo --split-size=5000000 + configure: WARNING: + *** Makeinfo is too old. Info documentation will not be built. + +then I checked the version of makeinfo, it said, +====== +$ makeinfo --version +texi2any (GNU texinfo) 7.0.1 + +Copyright (C) 2022 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +====== + +After digging a little bit, it became quite obvious that a dot is +missing in regexp that makes it impossible to match versions higher than +7.0, and here's the solution: + +- | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9][0-9])' >/dev/null 2>&1; then ++ | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9]\.[0-9])' >/dev/null 2>&1; then + +However, Eli pointed out that the solution above has another problem: it +will stop working when Texinfo 10.1 will be released. Meanwhile, he +suggested to solve this problem permanently. That is, we don't care +about the minor version for Texinfo > 6.9, we only care about the major +version. + +In this way, the problem will be resolved permanently, thanks to Eli. + +libctf/ChangeLog: + + * configure: Regenerated. + * configure.ac: Update regexp to match versions higher than 7.0. +--- + libctf/configure | 2 +- + libctf/configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +--- a/libctf/configure ++++ b/libctf/configure +@@ -14865,7 +14865,7 @@ esac + # We require texinfo to be 6.3 or later, for a working synindex + # and validatemenus: otherwise we fall back to /bin/true. + if ${MAKEINFO} --version \ +- | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9][0-9])' >/dev/null 2>&1; then ++ | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9]|[1-6][0-9])' >/dev/null 2>&1; then + build_info=yes + else + build_info= +--- a/libctf/configure.ac ++++ b/libctf/configure.ac +@@ -184,7 +184,7 @@ changequote(,) + # We require texinfo to be 6.3 or later, for a working synindex + # and validatemenus: otherwise we fall back to /bin/true. + if ${MAKEINFO} --version \ +- | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9][0-9])' >/dev/null 2>&1; then ++ | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9]|[1-6][0-9])' >/dev/null 2>&1; then + build_info=yes + else + build_info= diff --git a/toolchain/binutils/patches/2.40/007-Fix-version-number-snafu-in-some-configuration-files.patch b/toolchain/binutils/patches/2.40/007-Fix-version-number-snafu-in-some-configuration-files.patch new file mode 100644 index 0000000000..0676240442 --- /dev/null +++ b/toolchain/binutils/patches/2.40/007-Fix-version-number-snafu-in-some-configuration-files.patch @@ -0,0 +1,444 @@ +From 59706683feafb6252d0ad369cf8759f75fd147be Mon Sep 17 00:00:00 2001 +From: Nick Clifton +Date: Tue, 17 Jan 2023 12:02:56 +0000 +Subject: [PATCH 07/50] Fix version number snafu in some configuration files: + 2.40.00 should be 2.40 + +--- + binutils/configure | 20 ++++++++++---------- + gprof/configure | 20 ++++++++++---------- + gprofng/configure | 20 ++++++++++---------- + gprofng/doc/version.texi | 4 ++-- + gprofng/libcollector/configure | 20 ++++++++++---------- + ld/configure | 20 ++++++++++---------- + 6 files changed, 52 insertions(+), 52 deletions(-) + +--- a/binutils/configure ++++ b/binutils/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for binutils 2.40.00. ++# Generated by GNU Autoconf 2.69 for binutils 2.40. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='binutils' + PACKAGE_TARNAME='binutils' +-PACKAGE_VERSION='2.40.00' +-PACKAGE_STRING='binutils 2.40.00' ++PACKAGE_VERSION='2.40' ++PACKAGE_STRING='binutils 2.40' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1401,7 +1401,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures binutils 2.40.00 to adapt to many kinds of systems. ++\`configure' configures binutils 2.40 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1472,7 +1472,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of binutils 2.40.00:";; ++ short | recursive ) echo "Configuration of binutils 2.40:";; + esac + cat <<\_ACEOF + +@@ -1631,7 +1631,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-binutils configure 2.40.00 ++binutils configure 2.40 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -2099,7 +2099,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by binutils $as_me 2.40.00, which was ++It was created by binutils $as_me 2.40, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -3081,7 +3081,7 @@ fi + + # Define the identity of the package. + PACKAGE='binutils' +- VERSION='2.40.00' ++ VERSION='2.40' + + + cat >>confdefs.h <<_ACEOF +@@ -15326,7 +15326,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by binutils $as_me 2.40.00, which was ++This file was extended by binutils $as_me 2.40, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -15392,7 +15392,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-binutils config.status 2.40.00 ++binutils config.status 2.40 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +--- a/gprof/configure ++++ b/gprof/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for gprof 2.40.00. ++# Generated by GNU Autoconf 2.69 for gprof 2.40. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='gprof' + PACKAGE_TARNAME='gprof' +-PACKAGE_VERSION='2.40.00' +-PACKAGE_STRING='gprof 2.40.00' ++PACKAGE_VERSION='2.40' ++PACKAGE_STRING='gprof 2.40' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1338,7 +1338,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures gprof 2.40.00 to adapt to many kinds of systems. ++\`configure' configures gprof 2.40 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1409,7 +1409,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of gprof 2.40.00:";; ++ short | recursive ) echo "Configuration of gprof 2.40:";; + esac + cat <<\_ACEOF + +@@ -1520,7 +1520,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-gprof configure 2.40.00 ++gprof configure 2.40 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -1885,7 +1885,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by gprof $as_me 2.40.00, which was ++It was created by gprof $as_me 2.40, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -2864,7 +2864,7 @@ fi + + # Define the identity of the package. + PACKAGE='gprof' +- VERSION='2.40.00' ++ VERSION='2.40' + + + cat >>confdefs.h <<_ACEOF +@@ -12572,7 +12572,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by gprof $as_me 2.40.00, which was ++This file was extended by gprof $as_me 2.40, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -12638,7 +12638,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-gprof config.status 2.40.00 ++gprof config.status 2.40 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +--- a/gprofng/configure ++++ b/gprofng/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for gprofng 2.40.00. ++# Generated by GNU Autoconf 2.69 for gprofng 2.40. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='gprofng' + PACKAGE_TARNAME='gprofng' +-PACKAGE_VERSION='2.40.00' +-PACKAGE_STRING='gprofng 2.40.00' ++PACKAGE_VERSION='2.40' ++PACKAGE_STRING='gprofng 2.40' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1362,7 +1362,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures gprofng 2.40.00 to adapt to many kinds of systems. ++\`configure' configures gprofng 2.40 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1433,7 +1433,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of gprofng 2.40.00:";; ++ short | recursive ) echo "Configuration of gprofng 2.40:";; + esac + cat <<\_ACEOF + +@@ -1547,7 +1547,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-gprofng configure 2.40.00 ++gprofng configure 2.40 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -2079,7 +2079,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by gprofng $as_me 2.40.00, which was ++It was created by gprofng $as_me 2.40, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -3052,7 +3052,7 @@ fi + + # Define the identity of the package. + PACKAGE='gprofng' +- VERSION='2.40.00' ++ VERSION='2.40' + + + cat >>confdefs.h <<_ACEOF +@@ -17467,7 +17467,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by gprofng $as_me 2.40.00, which was ++This file was extended by gprofng $as_me 2.40, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -17533,7 +17533,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-gprofng config.status 2.40.00 ++gprofng config.status 2.40 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +--- a/gprofng/doc/version.texi ++++ b/gprofng/doc/version.texi +@@ -1,4 +1,4 @@ + @set UPDATED 5 January 2023 + @set UPDATED-MONTH January 2023 +-@set EDITION 2.40.00 +-@set VERSION 2.40.00 ++@set EDITION 2.40 ++@set VERSION 2.40 +--- a/gprofng/libcollector/configure ++++ b/gprofng/libcollector/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for gprofng 2.40.00. ++# Generated by GNU Autoconf 2.69 for gprofng 2.40. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='gprofng' + PACKAGE_TARNAME='gprofng' +-PACKAGE_VERSION='2.40.00' +-PACKAGE_STRING='gprofng 2.40.00' ++PACKAGE_VERSION='2.40' ++PACKAGE_STRING='gprofng 2.40' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1325,7 +1325,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures gprofng 2.40.00 to adapt to many kinds of systems. ++\`configure' configures gprofng 2.40 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1396,7 +1396,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of gprofng 2.40.00:";; ++ short | recursive ) echo "Configuration of gprofng 2.40:";; + esac + cat <<\_ACEOF + +@@ -1505,7 +1505,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-gprofng configure 2.40.00 ++gprofng configure 2.40 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -1991,7 +1991,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by gprofng $as_me 2.40.00, which was ++It was created by gprofng $as_me 2.40, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -2968,7 +2968,7 @@ fi + + # Define the identity of the package. + PACKAGE='gprofng' +- VERSION='2.40.00' ++ VERSION='2.40' + + + cat >>confdefs.h <<_ACEOF +@@ -16098,7 +16098,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by gprofng $as_me 2.40.00, which was ++This file was extended by gprofng $as_me 2.40, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -16164,7 +16164,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-gprofng config.status 2.40.00 ++gprofng config.status 2.40 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +--- a/ld/configure ++++ b/ld/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for ld 2.40.00. ++# Generated by GNU Autoconf 2.69 for ld 2.40. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='ld' + PACKAGE_TARNAME='ld' +-PACKAGE_VERSION='2.40.00' +-PACKAGE_STRING='ld 2.40.00' ++PACKAGE_VERSION='2.40' ++PACKAGE_STRING='ld 2.40' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1423,7 +1423,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures ld 2.40.00 to adapt to many kinds of systems. ++\`configure' configures ld 2.40 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1494,7 +1494,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of ld 2.40.00:";; ++ short | recursive ) echo "Configuration of ld 2.40:";; + esac + cat <<\_ACEOF + +@@ -1661,7 +1661,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-ld configure 2.40.00 ++ld configure 2.40 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -2376,7 +2376,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by ld $as_me 2.40.00, which was ++It was created by ld $as_me 2.40, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -3359,7 +3359,7 @@ fi + + # Define the identity of the package. + PACKAGE='ld' +- VERSION='2.40.00' ++ VERSION='2.40' + + + cat >>confdefs.h <<_ACEOF +@@ -18083,7 +18083,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by ld $as_me 2.40.00, which was ++This file was extended by ld $as_me 2.40, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -18149,7 +18149,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-ld config.status 2.40.00 ++ld config.status 2.40 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + diff --git a/toolchain/binutils/patches/2.40/010-toplevel-Makefile.def-add-install-strip-dependency-o.patch b/toolchain/binutils/patches/2.40/010-toplevel-Makefile.def-add-install-strip-dependency-o.patch new file mode 100644 index 0000000000..bef40f546f --- /dev/null +++ b/toolchain/binutils/patches/2.40/010-toplevel-Makefile.def-add-install-strip-dependency-o.patch @@ -0,0 +1,60 @@ +From bcea253f5fa194e57f9564e8461c718e228bd26e Mon Sep 17 00:00:00 2001 +From: Indu Bhagat +Date: Wed, 18 Jan 2023 23:17:49 -0800 +Subject: [PATCH 10/50] toplevel: Makefile.def: add install-strip dependency on + libsframe + +As noted in PR libsframe/30014 - FTBFS: install-strip fails because +bfdlib relinks and fails to find libsframe, the install time +dependencies of libbfd need to be updated. + + PR libsframe/30014 + * Makefile.def: Reflect that libsframe needs to installed before + libbfd. Reorder a bit to better track libsframe dependencies. + * Makefile.in: Regenerate. + +(cherry picked from commit b8d21eb0cd10d6127e77cc437d82e949adb0c454) +--- + Makefile.def | 5 ++++- + Makefile.in | 3 ++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +--- a/Makefile.def ++++ b/Makefile.def +@@ -493,7 +493,6 @@ dependencies = { module=install-binutils + dependencies = { module=install-strip-binutils; on=install-strip-opcodes; }; + + // Likewise for ld, libctf, and bfd. +-dependencies = { module=install-bfd; on=install-libsframe; }; + dependencies = { module=install-libctf; on=install-bfd; }; + dependencies = { module=install-ld; on=install-bfd; }; + dependencies = { module=install-ld; on=install-libctf; }; +@@ -501,6 +500,10 @@ dependencies = { module=install-strip-li + dependencies = { module=install-strip-ld; on=install-strip-bfd; }; + dependencies = { module=install-strip-ld; on=install-strip-libctf; }; + ++// libbfd depends on libsframe ++dependencies = { module=install-bfd; on=install-libsframe; }; ++dependencies = { module=install-strip-bfd; on=install-strip-libsframe; }; ++ + // libopcodes depends on libbfd + dependencies = { module=configure-opcodes; on=configure-bfd; hard=true; }; + dependencies = { module=install-opcodes; on=install-bfd; }; +--- a/Makefile.in ++++ b/Makefile.in +@@ -64549,13 +64549,14 @@ all-stageautoprofile-binutils: maybe-all + all-stageautofeedback-binutils: maybe-all-stageautofeedback-libsframe + install-binutils: maybe-install-opcodes + install-strip-binutils: maybe-install-strip-opcodes +-install-bfd: maybe-install-libsframe + install-libctf: maybe-install-bfd + install-ld: maybe-install-bfd + install-ld: maybe-install-libctf + install-strip-libctf: maybe-install-strip-bfd + install-strip-ld: maybe-install-strip-bfd + install-strip-ld: maybe-install-strip-libctf ++install-bfd: maybe-install-libsframe ++install-strip-bfd: maybe-install-strip-libsframe + configure-opcodes: configure-bfd + configure-stage1-opcodes: configure-stage1-bfd + configure-stage2-opcodes: configure-stage2-bfd diff --git a/toolchain/binutils/patches/2.40/018-gprofng-PR29521-docs-man-pages-are-not-in-the-releas.patch b/toolchain/binutils/patches/2.40/018-gprofng-PR29521-docs-man-pages-are-not-in-the-releas.patch new file mode 100644 index 0000000000..ae557645c0 --- /dev/null +++ b/toolchain/binutils/patches/2.40/018-gprofng-PR29521-docs-man-pages-are-not-in-the-releas.patch @@ -0,0 +1,703 @@ +From c6e269febbc946a54ed9dbbb2dc70feba6017607 Mon Sep 17 00:00:00 2001 +From: Vladimir Mezentsev +Date: Fri, 20 Jan 2023 15:39:55 -0800 +Subject: [PATCH 18/50] gprofng: PR29521 [docs] man pages are not in the + release tarball + +gprofng/ChangeLog +2023-01-20 Vladimir Mezentsev + + PR gprofng/29521 + * configure.ac: Check if $MAKEINFO and $HELP2MAN are missing. + * Makefile.am: Build doc if $MAKEINFO exists. + * doc/gprofng.texi: Update documentation for gprofng. + * doc/Makefile.am: Build gprofng.1. + * src/Makefile.am: Move the build of gprofng.1 to doc/Makefile.am. + * configure: Rebuild. + * Makefile.in: Rebuild. + * doc/Makefile.in: Rebuild. + * src/Makefile.in: Rebuild. +--- + gprofng/Makefile.am | 2 +- + gprofng/Makefile.in | 2 +- + gprofng/configure | 79 +++++++++++++++--- + gprofng/configure.ac | 21 +++-- + gprofng/doc/Makefile.am | 24 +++++- + gprofng/doc/Makefile.in | 93 ++++++++++++++++++--- + gprofng/doc/gprofng.texi | 169 +++++++++++++++++++++++++++++++++++++++ + gprofng/src/Makefile.am | 8 +- + gprofng/src/Makefile.in | 8 +- + 9 files changed, 364 insertions(+), 42 deletions(-) + +--- a/gprofng/Makefile.am ++++ b/gprofng/Makefile.am +@@ -23,7 +23,7 @@ AUTOMAKE_OPTIONS = dejagnu foreign + if BUILD_COLLECTOR + COLLECTOR_SUBDIRS = libcollector + endif +-if BUILD_MAN ++if BUILD_DOC + DOC_SUBDIR = doc + endif + if BUILD_SRC +--- a/gprofng/Makefile.in ++++ b/gprofng/Makefile.in +@@ -381,7 +381,7 @@ zlibinc = @zlibinc@ + ACLOCAL_AMFLAGS = -I . -I .. + AUTOMAKE_OPTIONS = dejagnu foreign + @BUILD_COLLECTOR_TRUE@COLLECTOR_SUBDIRS = libcollector +-@BUILD_MAN_TRUE@DOC_SUBDIR = doc ++@BUILD_DOC_TRUE@DOC_SUBDIR = doc + @BUILD_SRC_TRUE@SRC_SUBDIRS = src gp-display-html $(DOC_SUBDIR) + SUBDIRS = $(COLLECTOR_SUBDIRS) $(SRC_SUBDIRS) + DIST_SUBDIRS = libcollector src gp-display-html $(DOC_SUBDIR) +--- a/gprofng/configure ++++ b/gprofng/configure +@@ -639,6 +639,8 @@ GPROFNG_CPPFLAGS + GPROFNG_NO_FORMAT_TRUNCATION_CFLAGS + GPROFNG_CFLAGS + LD_NO_AS_NEEDED ++BUILD_DOC_FALSE ++BUILD_DOC_TRUE + BUILD_MAN_FALSE + BUILD_MAN_TRUE + HELP2MAN +@@ -12221,7 +12223,7 @@ else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +-#line 12224 "configure" ++#line 12226 "configure" + #include "confdefs.h" + + #if HAVE_DLFCN_H +@@ -12327,7 +12329,7 @@ else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +-#line 12330 "configure" ++#line 12332 "configure" + #include "confdefs.h" + + #if HAVE_DLFCN_H +@@ -16737,9 +16739,58 @@ fi + + # Generate manpages, if possible. + build_man=false ++build_doc=false + if test $cross_compiling = no; then ++ for ac_prog in help2man ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_prog_HELP2MAN+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test -n "$HELP2MAN"; then ++ ac_cv_prog_HELP2MAN="$HELP2MAN" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_HELP2MAN="$ac_prog" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++fi ++fi ++HELP2MAN=$ac_cv_prog_HELP2MAN ++if test -n "$HELP2MAN"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HELP2MAN" >&5 ++$as_echo "$HELP2MAN" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi + +-HELP2MAN=${HELP2MAN-"${am_missing_run}help2man"} ++ ++ test -n "$HELP2MAN" && break ++done ++test -n "$HELP2MAN" || HELP2MAN="$MISSING help2man" ++ ++ case "x$HELP2MAN" in ++ x | */missing\ help2man* ) ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: gprofng: help2man is missing. Man pages will not be built." >&5 ++$as_echo "$as_me: WARNING: gprofng: help2man is missing. Man pages will not be built." >&2;} ++ ;; ++ * ) build_man=true ;; ++ esac + + for ac_prog in makeinfo + do +@@ -16782,10 +16833,10 @@ fi + + test -n "$MAKEINFO" && break + done +-test -n "$MAKEINFO" || MAKEINFO=""@echo makeinfo missing; true"" ++test -n "$MAKEINFO" || MAKEINFO="$MISSING makeinfo" + +- case "$MAKEINFO" in +- *true) ++ case "x$MAKEINFO" in ++ x | */missing\ makeinfo*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: gprofng: makeinfo is missing. Info documentation will not be built." >&5 + $as_echo "$as_me: WARNING: gprofng: makeinfo is missing. Info documentation will not be built." >&2;} + ;; +@@ -16796,9 +16847,7 @@ $as_echo "$as_me: WARNING: gprofng: make + $as_echo "$as_me: WARNING: gprofng: $MAKEINFO is too old. Info documentation will not be built." >&2;} + MAKEINFO="@echo $MAKEINFO is too old, 6.5 or newer required; true" + ;; +- x* ) +- build_man=true +- ;; ++ x* ) build_doc=true ;; + esac + ;; + esac +@@ -16812,6 +16861,14 @@ else + BUILD_MAN_FALSE= + fi + ++ if test x$build_doc = xtrue; then ++ BUILD_DOC_TRUE= ++ BUILD_DOC_FALSE='#' ++else ++ BUILD_DOC_TRUE='#' ++ BUILD_DOC_FALSE= ++fi ++ + + LD_NO_AS_NEEDED=${no_as_needed} + +@@ -17070,6 +17127,10 @@ if test -z "${BUILD_MAN_TRUE}" && test - + as_fn_error $? "conditional \"BUILD_MAN\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi ++if test -z "${BUILD_DOC_TRUE}" && test -z "${BUILD_DOC_FALSE}"; then ++ as_fn_error $? "conditional \"BUILD_DOC\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + + : "${CONFIG_STATUS=./config.status}" + ac_write_fail=0 +--- a/gprofng/configure.ac ++++ b/gprofng/configure.ac +@@ -210,11 +210,19 @@ AM_ZLIB + + # Generate manpages, if possible. + build_man=false ++build_doc=false + if test $cross_compiling = no; then +- AM_MISSING_PROG(HELP2MAN, help2man) +- AC_CHECK_PROGS([MAKEINFO], makeinfo, ["@echo makeinfo missing; true"]) +- case "$MAKEINFO" in +- *true) ++ AC_CHECK_PROGS([HELP2MAN], help2man, [$MISSING help2man]) ++ case "x$HELP2MAN" in ++ x | */missing\ help2man* ) ++ AC_MSG_WARN([gprofng: help2man is missing. Man pages will not be built.]) ++ ;; ++ * ) build_man=true ;; ++ esac ++ ++ AC_CHECK_PROGS([MAKEINFO], makeinfo, [$MISSING makeinfo]) ++ case "x$MAKEINFO" in ++ x | */missing\ makeinfo*) + AC_MSG_WARN([gprofng: makeinfo is missing. Info documentation will not be built.]) + ;; + *) +@@ -223,15 +231,14 @@ if test $cross_compiling = no; then + AC_MSG_WARN([gprofng: $MAKEINFO is too old. Info documentation will not be built.]) + MAKEINFO="@echo $MAKEINFO is too old, 6.5 or newer required; true" + ;; +- x* ) +- build_man=true +- ;; ++ x* ) build_doc=true ;; + esac + ;; + esac + AC_SUBST(MAKEINFO) + fi + AM_CONDITIONAL([BUILD_MAN], [test x$build_man = xtrue]) ++AM_CONDITIONAL([BUILD_DOC], [test x$build_doc = xtrue]) + + AC_SUBST(LD_NO_AS_NEEDED, [${no_as_needed}]) + AC_SUBST(GPROFNG_CFLAGS, [${gprofng_cflags}]) +--- a/gprofng/doc/Makefile.am ++++ b/gprofng/doc/Makefile.am +@@ -19,9 +19,31 @@ + + AUTOMAKE_OPTIONS = info-in-builddir foreign no-texinfo.tex + ++# Options to extract the man page ++MANCONF = -Dman ++ ++TEXI2POD = perl $(srcdir)/../../etc/texi2pod.pl $(AM_MAKEINFOFLAGS) ++POD2MAN = pod2man --center="User Commands" \ ++ --release="binutils-$(VERSION)" --section=1 ++ + info_TEXINFOS = gprofng.texi + gprofng_TEXINFOS = fdl.texi + TEXINFO_TEX = . + MAKEINFOHTML = $(MAKEINFO) --html --no-split + +-MAINTAINERCLEANFILES = gprofng.info ++man_MANS = gprofng.1 ++ ++# Build the man page from the texinfo file ++# The sed command removes the no-adjust Nroff command so that ++# the man output looks standard. ++gprofng.1: $(srcdir)/gprofng.texi ++ $(AM_V_GEN)touch $@ ++ $(AM_V_at)-$(TEXI2POD) $(MANCONF) < $(srcdir)/gprofng.texi > gprofng.pod ++ $(AM_V_at)-($(POD2MAN) gprofng.pod | \ ++ sed -e '/^.if n .na/d' > $@.tmp && \ ++ mv -f $@.tmp $@) || (rm -f $@.tmp && exit 1) ++ $(AM_V_at)rm -f gprofng.pod ++ ++MAINTAINERCLEANFILES = gprofng.info $(man_MANS) ++ ++info: $(man_MANS) +--- a/gprofng/doc/Makefile.in ++++ b/gprofng/doc/Makefile.in +@@ -182,7 +182,7 @@ am__can_run_installinfo = \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +-am__installdirs = "$(DESTDIR)$(infodir)" ++am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" + am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; + am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ +@@ -210,6 +210,9 @@ am__uninstall_files_from_dir = { \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } ++man1dir = $(mandir)/man1 ++NROFF = nroff ++MANS = $(man_MANS) + am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) + am__DIST_COMMON = $(gprofng_TEXINFOS) $(srcdir)/Makefile.in \ + $(top_srcdir)/../mkinstalldirs mdate-sh texinfo.tex +@@ -361,11 +364,19 @@ top_srcdir = @top_srcdir@ + zlibdir = @zlibdir@ + zlibinc = @zlibinc@ + AUTOMAKE_OPTIONS = info-in-builddir foreign no-texinfo.tex ++ ++# Options to extract the man page ++MANCONF = -Dman ++TEXI2POD = perl $(srcdir)/../../etc/texi2pod.pl $(AM_MAKEINFOFLAGS) ++POD2MAN = pod2man --center="User Commands" \ ++ --release="binutils-$(VERSION)" --section=1 ++ + info_TEXINFOS = gprofng.texi + gprofng_TEXINFOS = fdl.texi + TEXINFO_TEX = . + MAKEINFOHTML = $(MAKEINFO) --html --no-split +-MAINTAINERCLEANFILES = gprofng.info ++man_MANS = gprofng.1 ++MAINTAINERCLEANFILES = gprofng.info $(man_MANS) + all: all-am + + .SUFFIXES: +@@ -558,6 +569,49 @@ maintainer-clean-aminfo: + echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ + rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ + done ++install-man1: $(man_MANS) ++ @$(NORMAL_INSTALL) ++ @list1=''; \ ++ list2='$(man_MANS)'; \ ++ test -n "$(man1dir)" \ ++ && test -n "`echo $$list1$$list2`" \ ++ || exit 0; \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ ++ { for i in $$list1; do echo "$$i"; done; \ ++ if test -n "$$list2"; then \ ++ for i in $$list2; do echo "$$i"; done \ ++ | sed -n '/\.1[a-z]*$$/p'; \ ++ fi; \ ++ } | while read p; do \ ++ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ ++ echo "$$d$$p"; echo "$$p"; \ ++ done | \ ++ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ ++ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ ++ sed 'N;N;s,\n, ,g' | { \ ++ list=; while read file base inst; do \ ++ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ ++ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ ++ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ ++ fi; \ ++ done; \ ++ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ ++ while read files; do \ ++ test -z "$$files" || { \ ++ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ ++ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ ++ done; } ++ ++uninstall-man1: ++ @$(NORMAL_UNINSTALL) ++ @list=''; test -n "$(man1dir)" || exit 0; \ ++ files=`{ for i in $$list; do echo "$$i"; done; \ ++ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ ++ sed -n '/\.1[a-z]*$$/p'; \ ++ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ ++ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ ++ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) + tags TAGS: + + ctags CTAGS: +@@ -600,9 +654,9 @@ distdir: $(DISTFILES) + dist-info + check-am: all-am + check: check-am +-all-am: Makefile $(INFO_DEPS) ++all-am: Makefile $(INFO_DEPS) $(MANS) + installdirs: +- for dir in "$(DESTDIR)$(infodir)"; do \ ++ for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done + install: install-am +@@ -652,11 +706,9 @@ html: html-am + + html-am: $(HTMLS) + +-info: info-am +- + info-am: $(INFO_DEPS) + +-install-data-am: install-info-am ++install-data-am: install-info-am install-man + + install-dvi: install-dvi-am + +@@ -739,7 +791,7 @@ install-info-am: $(INFO_DEPS) + install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ + done; \ + else : ; fi +-install-man: ++install-man: install-man1 + + install-pdf: install-pdf-am + +@@ -794,7 +846,9 @@ ps: ps-am + ps-am: $(PSS) + + uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ +- uninstall-pdf-am uninstall-ps-am ++ uninstall-man uninstall-pdf-am uninstall-ps-am ++ ++uninstall-man: uninstall-man1 + + .MAKE: install-am install-strip + +@@ -804,19 +858,32 @@ uninstall-am: uninstall-dvi-am uninstall + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ +- install-info-am install-man install-pdf install-pdf-am \ +- install-ps install-ps-am install-strip installcheck \ +- installcheck-am installdirs maintainer-clean \ ++ install-info-am install-man install-man1 install-pdf \ ++ install-pdf-am install-ps install-ps-am install-strip \ ++ installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-aminfo maintainer-clean-generic \ + maintainer-clean-vti mostlyclean mostlyclean-aminfo \ + mostlyclean-generic mostlyclean-libtool mostlyclean-vti pdf \ + pdf-am ps ps-am tags-am uninstall uninstall-am \ + uninstall-dvi-am uninstall-html-am uninstall-info-am \ +- uninstall-pdf-am uninstall-ps-am ++ uninstall-man uninstall-man1 uninstall-pdf-am uninstall-ps-am + + .PRECIOUS: Makefile + + ++# Build the man page from the texinfo file ++# The sed command removes the no-adjust Nroff command so that ++# the man output looks standard. ++gprofng.1: $(srcdir)/gprofng.texi ++ $(AM_V_GEN)touch $@ ++ $(AM_V_at)-$(TEXI2POD) $(MANCONF) < $(srcdir)/gprofng.texi > gprofng.pod ++ $(AM_V_at)-($(POD2MAN) gprofng.pod | \ ++ sed -e '/^.if n .na/d' > $@.tmp && \ ++ mv -f $@.tmp $@) || (rm -f $@.tmp && exit 1) ++ $(AM_V_at)rm -f gprofng.pod ++ ++info: $(man_MANS) ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: +--- a/gprofng/doc/gprofng.texi ++++ b/gprofng/doc/gprofng.texi +@@ -1,5 +1,8 @@ + \input texinfo @c -*-texinfo-*- + ++@c for $sect (qw(NAME SYNOPSIS TARGET DESCRIPTION OPTIONS ENVIRONMENT FILES ++@c BUGS NOTES FOOTNOTES SEEALSO AUTHOR COPYRIGHT)) { ++ + @c ---------------------------------------------------------------------------- + @c This is the Texinfo source file for the GPROFNG manual. + @c +@@ -59,6 +62,10 @@ gprofng + @cindex \label\, \string\ + @end macro + ++@macro gcctabopt{body} ++@code{\body\} ++@end macro ++ + @c -- Get the version information --------------------------------------------- + @include version.texi + +@@ -99,6 +106,20 @@ section entitled ``GNU Free Documentatio + @page + @vskip 0pt plus 1filll + @insertcopying ++ ++@c man begin COPYRIGHT ++ ++Copyright @copyright{} 2022-2023 Free Software Foundation, Inc. ++ ++Permission is granted to copy, distribute and/or modify this document ++under the terms of the GNU Free Documentation License, Version 1.3 ++or any later version published by the Free Software Foundation; ++with no Invariant Sections, with no Front-Cover Texts, and with no ++Back-Cover Texts. A copy of the license is included in the ++section entitled ``GNU Free Documentation License''. ++ ++@c man end ++ + @end titlepage + + @c -- Generate the Table of Contents ------------------------------------------ +@@ -163,6 +184,154 @@ Terminology + @end menu + @end ifinfo + ++@ifset man ++ ++@c man title gprofng the driver for the gprofng tool suite ++ ++@c man begin SYNOPSIS ++gprofng [OPTION(S)] ACTION [@b{QUALIFIER}] [ARGUMENTS] TARGET ++@c man end ++ ++@c man begin DESCRIPTION ++This is the driver for the GPROFNG tools suite to gather and analyze performance data. ++ ++The driver executes the action specified. An example of an action is @code{collect} ++to collect performance data. Depending on the action, a qualifier may be needed to ++define the command. Several qualifiers support options. The last item on the command ++is the target the command applies to. ++ ++For example, to collect performance data for an application called @code{a.out} and ++store the results in experiment directory @code{mydata.er}, the following command may ++be used: ++ ++@smallexample ++$ gprofng collect app -o mydata.er a.out ++@end smallexample ++ ++In this example, the action is @code{collect}, the qualifier is @code{app}, the single ++argument is @code{-o mydata.er} and the target is @code{a.out}. ++ ++If gprofng is executed without any additional option, action, or target, a usage ++overview is printed. ++ ++@c man end ++ ++@c man begin OPTIONS ++ ++@table @gcctabopt ++ ++@item @var{--version} ++print the version number and exit. ++ ++@item @var{--help} ++print usage information and exit. ++ ++@end table ++ ++@c man end ++ ++@c man begin NOTES ++ ++The gprofng driver supports the following commands. ++ ++@c The man pages for the commands below can be viewed using the command name with "gprofng" replaced by "gp" and the spaces replaced by a dash ("-"). For example the man page ++@c name for "gprofng collect app" is "gp-collect-app". ++ ++Collect performance data: ++ ++@table @code ++ ++@item gprofng collect app ++collect application performance data. ++ ++@end table ++ ++Display the performance results: ++ ++@table @code ++ ++@item gprofng display text ++display the performance data in ASCII format. ++ ++@item gprofng display html ++generate an HTML file from one or more experiments. ++ ++@end table ++ ++Miscellaneous commands: ++ ++@table @code ++ ++@item gprofng display src ++display source or disassembly with compiler annotations. ++ ++@item gprofng archive ++include binaries and source code in an experiment directory. ++ ++@end table ++ ++It is also possible to invoke the lower level commands directly, but since ++these are subject to change, in particular the options, we recommend to ++use the driver. ++ ++@c man end ++ ++@c man begin ENVIRONMENT ++The following environment variables are supported: ++ ++@table @code ++ ++@item @env{GPROFNG_MAX_CALL_STACK_DEPTH} ++set the depth of the call stack (default is 256). ++ ++@item @env{GPROFNG_USE_JAVA_OPTIONS} ++may be set when profiling a C/C++ application that uses dlopen() to execute Java code. ++ ++@item @env{GPROFNG_SSH_REMOTE_DISPLAY} ++use this variable to define the ssh command executed by the remote display tool. ++ ++@item @env{GPROFNG_SKIP_VALIDATION} ++set this variable to disable checking hardware, system, and Java versions. ++ ++@item @env{GPROFNG_ALLOW_CORE_DUMP} ++set this variable to allow a core file to be generated; otherwise an error report is created on /tmp. ++ ++@item @env{GPROFNG_ARCHIVE} ++use this variable to define the settings for automatic archiving upon experiment recording completion. ++ ++@item @env{GPROFNG_ARCHIVE_COMMON_DIR} ++set this variable to the location of the common archive. ++ ++@item @env{GPROFNG_JAVA_MAX_CALL_STACK_DEPTH} ++set the depth of the Java call stack; the default is 256; set to 0 to disable capturing of call stacks. ++ ++@item @env{GPROFNG_JAVA_NATIVE_MAX_CALL_STACK_DEPTH} ++set the depth of the Java native call stack; the default is 256; set to 0 to disable capturing of call stacks (JNI and assembly call stacks are not captured). ++ ++@end table ++ ++@c man end ++ ++@c man begin SEEALSO ++The man pages for the various gprofng commands are not available yet, but ++the @option{--help} option supported on each of the commands lists the options ++and provides more information. ++ ++For example this displays the options supported on the @command{gprofng collect app} ++command: ++ ++@smallexample ++$ gprofng collect app --help ++@end smallexample ++ ++The user guide is available as an Info entry for @file{gprofng}. ++@c man end ++ ++@end ifset ++ ++@c man begin DESCRIPTION ++@c man end ++ + @c -- A new node -------------------------------------------------------------- + @node Introduction + @chapter Introduction +--- a/gprofng/src/Makefile.am ++++ b/gprofng/src/Makefile.am +@@ -160,7 +160,7 @@ gp_display_text_LDADD = $(LIBGPROFNG) $( + + if BUILD_MAN + +-man_MANS = gprofng.1 \ ++man_MANS = \ + gp-archive.1 \ + gp-collect-app.1 \ + gp-display-src.1 \ +@@ -191,10 +191,6 @@ H2M_FILTER = | sed 's/\.TP/\.TP\n.B/' | + | sed 's/See also:/\.SH SEE ALSO/' | sed 's/Documentation:/.SH DOCUMENTATION/' \ + | sed 's/Limitations:/.SH LIMITATIONS/' + +-gprofng.1: $(srcdir)/gprofng.cc $(common_mandeps) | ./gprofng$(EXEEXT) +- $(AM_V_GEN)_BUILDING_MANPAGE=1 $(HELP2MAN) $(HELP2MAN_OPT) \ +- --name=$(TEXT_GPROFNG) ./gprofng$(EXEEXT) $(H2M_FILTER) > $@ +- + gp-archive.1: $(srcdir)/gp-archive.cc $(common_mandeps) | ./gp-archive$(EXEEXT) + $(AM_V_GEN)_BUILDING_MANPAGE=1 $(HELP2MAN) $(HELP2MAN_OPT) \ + --name=$(TEXT_GP_ARCHIVE) ./gp-archive$(EXEEXT) $(H2M_FILTER) > $@ +@@ -223,3 +219,5 @@ dist-hook: $(LIBGPROFNG) + + install-data-local: install-pkglibLTLIBRARIES + rm -f $(DESTDIR)/$(pkglibdir)/*.la $(DESTDIR)/$(pkglibdir)/*.a ++ ++$(srcdir)/DbeSession.cc: QLParser.tab.hh +--- a/gprofng/src/Makefile.in ++++ b/gprofng/src/Makefile.in +@@ -572,7 +572,7 @@ gp_display_src_SOURCES = gp-display-src. + gp_display_src_LDADD = $(LIBGPROFNG) $(CLOCK_GETTIME_LINK) $(ZLIB) + gp_display_text_SOURCES = gp-display-text.cc ipc.cc ipcio.cc + gp_display_text_LDADD = $(LIBGPROFNG) $(CLOCK_GETTIME_LINK) $(ZLIB) +-@BUILD_MAN_TRUE@man_MANS = gprofng.1 \ ++@BUILD_MAN_TRUE@man_MANS = \ + @BUILD_MAN_TRUE@ gp-archive.1 \ + @BUILD_MAN_TRUE@ gp-collect-app.1 \ + @BUILD_MAN_TRUE@ gp-display-src.1 \ +@@ -1176,10 +1176,6 @@ uninstall-man: uninstall-man1 + QLParser.tab.cc QLParser.tab.hh: QLParser.yy + $(BISON) $^ + +-@BUILD_MAN_TRUE@gprofng.1: $(srcdir)/gprofng.cc $(common_mandeps) | ./gprofng$(EXEEXT) +-@BUILD_MAN_TRUE@ $(AM_V_GEN)_BUILDING_MANPAGE=1 $(HELP2MAN) $(HELP2MAN_OPT) \ +-@BUILD_MAN_TRUE@ --name=$(TEXT_GPROFNG) ./gprofng$(EXEEXT) $(H2M_FILTER) > $@ +- + @BUILD_MAN_TRUE@gp-archive.1: $(srcdir)/gp-archive.cc $(common_mandeps) | ./gp-archive$(EXEEXT) + @BUILD_MAN_TRUE@ $(AM_V_GEN)_BUILDING_MANPAGE=1 $(HELP2MAN) $(HELP2MAN_OPT) \ + @BUILD_MAN_TRUE@ --name=$(TEXT_GP_ARCHIVE) ./gp-archive$(EXEEXT) $(H2M_FILTER) > $@ +@@ -1207,6 +1203,8 @@ dist-hook: $(LIBGPROFNG) + install-data-local: install-pkglibLTLIBRARIES + rm -f $(DESTDIR)/$(pkglibdir)/*.la $(DESTDIR)/$(pkglibdir)/*.a + ++$(srcdir)/DbeSession.cc: QLParser.tab.hh ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/toolchain/binutils/patches/2.40/020-gprofng-PR30043-libgprofng.so.-are-installed-to-a-wr.patch b/toolchain/binutils/patches/2.40/020-gprofng-PR30043-libgprofng.so.-are-installed-to-a-wr.patch new file mode 100644 index 0000000000..d8d76a2961 --- /dev/null +++ b/toolchain/binutils/patches/2.40/020-gprofng-PR30043-libgprofng.so.-are-installed-to-a-wr.patch @@ -0,0 +1,212 @@ +From edd36b26f3506eeb259534ba2493e15c728cd280 Mon Sep 17 00:00:00 2001 +From: Vladimir Mezentsev +Date: Wed, 25 Jan 2023 19:21:38 -0800 +Subject: [PATCH 20/50] gprofng: PR30043 libgprofng.so.* are installed to a + wrong location + +gprofng/ChangeLog +2023-01-25 Vladimir Mezentsev + + PR gprofng/30043 + PR gprofng/28972 + * src/Makefile.am: Use lib_LTLIBRARIES instead of pkglib_LTLIBRARIES. + * src/Makefile.in: Rebuild. +--- + gprofng/src/Makefile.am | 7 +--- + gprofng/src/Makefile.in | 76 +++++++++++++++++++---------------------- + 2 files changed, 37 insertions(+), 46 deletions(-) + +--- a/gprofng/src/Makefile.am ++++ b/gprofng/src/Makefile.am +@@ -124,7 +124,7 @@ BUILT_SOURCES = QLParser.tab.hh + EXTRA_DIST = QLParser.yy $(man_MANS) + + +-pkglib_LTLIBRARIES = $(LIBGPROFNG) ++lib_LTLIBRARIES = $(LIBGPROFNG) + libgprofng_la_SOURCES = $(CCSOURCES) $(CSOURCES) + libgprofng_la_LDFLAGS = -version-info 0:0:0 + +@@ -215,9 +215,4 @@ endif + # so ensure that the necessary libraries are built at dist time. + dist-hook: $(LIBGPROFNG) + +-.PHONY: install-data-local +- +-install-data-local: install-pkglibLTLIBRARIES +- rm -f $(DESTDIR)/$(pkglibdir)/*.la $(DESTDIR)/$(pkglibdir)/*.a +- + $(srcdir)/DbeSession.cc: QLParser.tab.hh +--- a/gprofng/src/Makefile.in ++++ b/gprofng/src/Makefile.in +@@ -155,9 +155,9 @@ am__uninstall_files_from_dir = { \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +-am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \ ++am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(dbedir)" +-LTLIBRARIES = $(pkglib_LTLIBRARIES) ++LTLIBRARIES = $(lib_LTLIBRARIES) + am__DEPENDENCIES_1 = + libgprofng_la_DEPENDENCIES = $(top_builddir)/../opcodes/libopcodes.la \ + $(top_builddir)/../bfd/libbfd.la $(am__DEPENDENCIES_1) +@@ -548,7 +548,7 @@ AM_CFLAGS = $(GPROFNG_CFLAGS) $(PTHREAD_ + AM_CXXFLAGS = $(AM_CFLAGS) + BUILT_SOURCES = QLParser.tab.hh + EXTRA_DIST = QLParser.yy $(man_MANS) +-pkglib_LTLIBRARIES = $(LIBGPROFNG) ++lib_LTLIBRARIES = $(LIBGPROFNG) + libgprofng_la_SOURCES = $(CCSOURCES) $(CSOURCES) + libgprofng_la_LDFLAGS = -version-info 0:0:0 + +@@ -636,33 +636,33 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $( + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + $(am__aclocal_m4_deps): + +-install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) ++install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) +- @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ ++ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ +- echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ +- $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ +- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ +- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ ++ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ ++ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +-uninstall-pkglibLTLIBRARIES: ++uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) +- @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ ++ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ +- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ +- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ ++ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ ++ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +-clean-pkglibLTLIBRARIES: +- -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) +- @list='$(pkglib_LTLIBRARIES)'; \ ++clean-libLTLIBRARIES: ++ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) ++ @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ +@@ -672,7 +672,7 @@ clean-pkglibLTLIBRARIES: + } + + libgprofng.la: $(libgprofng_la_OBJECTS) $(libgprofng_la_DEPENDENCIES) $(EXTRA_libgprofng_la_DEPENDENCIES) +- $(AM_V_CXXLD)$(libgprofng_la_LINK) -rpath $(pkglibdir) $(libgprofng_la_OBJECTS) $(libgprofng_la_LIBADD) $(LIBS) ++ $(AM_V_CXXLD)$(libgprofng_la_LINK) -rpath $(libdir) $(libgprofng_la_OBJECTS) $(libgprofng_la_LIBADD) $(LIBS) + install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ +@@ -1039,8 +1039,10 @@ check-am: all-am + check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am + all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(DATA) ++install-binPROGRAMS: install-libLTLIBRARIES ++ + installdirs: +- for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(dbedir)"; do \ ++ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(dbedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done + install: $(BUILT_SOURCES) +@@ -1078,8 +1080,8 @@ maintainer-clean-generic: + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) + clean: clean-am + +-clean-am: clean-binPROGRAMS clean-generic clean-libtool \ +- clean-pkglibLTLIBRARIES mostlyclean-am ++clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ ++ clean-libtool mostlyclean-am + + distclean: distclean-am + -rm -rf ./$(DEPDIR) +@@ -1099,13 +1101,13 @@ info: info-am + + info-am: + +-install-data-am: install-data-local install-dbeDATA install-man ++install-data-am: install-dbeDATA install-man + + install-dvi: install-dvi-am + + install-dvi-am: + +-install-exec-am: install-binPROGRAMS install-pkglibLTLIBRARIES ++install-exec-am: install-binPROGRAMS install-libLTLIBRARIES + + install-html: install-html-am + +@@ -1145,30 +1147,29 @@ ps: ps-am + + ps-am: + +-uninstall-am: uninstall-binPROGRAMS uninstall-dbeDATA uninstall-man \ +- uninstall-pkglibLTLIBRARIES ++uninstall-am: uninstall-binPROGRAMS uninstall-dbeDATA \ ++ uninstall-libLTLIBRARIES uninstall-man + + uninstall-man: uninstall-man1 + + .MAKE: all check install install-am install-strip + + .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ +- clean-binPROGRAMS clean-generic clean-libtool \ +- clean-pkglibLTLIBRARIES cscopelist-am ctags ctags-am dist-hook \ +- distclean distclean-compile distclean-generic \ +- distclean-libtool distclean-tags distdir dvi dvi-am html \ +- html-am info info-am install install-am install-binPROGRAMS \ +- install-data install-data-am install-data-local \ +- install-dbeDATA install-dvi install-dvi-am install-exec \ +- install-exec-am install-html install-html-am install-info \ +- install-info-am install-man install-man1 install-pdf \ +- install-pdf-am install-pkglibLTLIBRARIES install-ps \ ++ clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ ++ clean-libtool cscopelist-am ctags ctags-am dist-hook distclean \ ++ distclean-compile distclean-generic distclean-libtool \ ++ distclean-tags distdir dvi dvi-am html html-am info info-am \ ++ install install-am install-binPROGRAMS install-data \ ++ install-data-am install-dbeDATA install-dvi install-dvi-am \ ++ install-exec install-exec-am install-html install-html-am \ ++ install-info install-info-am install-libLTLIBRARIES \ ++ install-man install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-dbeDATA \ +- uninstall-man uninstall-man1 uninstall-pkglibLTLIBRARIES ++ uninstall-libLTLIBRARIES uninstall-man uninstall-man1 + + .PRECIOUS: Makefile + +@@ -1198,11 +1199,6 @@ QLParser.tab.cc QLParser.tab.hh: QLParse + # so ensure that the necessary libraries are built at dist time. + dist-hook: $(LIBGPROFNG) + +-.PHONY: install-data-local +- +-install-data-local: install-pkglibLTLIBRARIES +- rm -f $(DESTDIR)/$(pkglibdir)/*.la $(DESTDIR)/$(pkglibdir)/*.a +- + $(srcdir)/DbeSession.cc: QLParser.tab.hh + + # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/toolchain/binutils/patches/2.40/026-RISC-V-make-C-extension-JAL-available-again-for-32-b.patch b/toolchain/binutils/patches/2.40/026-RISC-V-make-C-extension-JAL-available-again-for-32-b.patch new file mode 100644 index 0000000000..4129a22906 --- /dev/null +++ b/toolchain/binutils/patches/2.40/026-RISC-V-make-C-extension-JAL-available-again-for-32-b.patch @@ -0,0 +1,115 @@ +From 27f59ec47a18277b6ea3548f405263ef558f5217 Mon Sep 17 00:00:00 2001 +From: Jan Beulich +Date: Tue, 31 Jan 2023 09:47:22 +0100 +Subject: [PATCH 26/50] RISC-V: make C-extension JAL available again for + (32-bit) assembly + +Along with the normal JAL alias, the C-extension one should have been +moved as well by 839189bc932e ("RISC-V: re-arrange opcode table for +consistent alias handling"), for the assembler to actually be able to +use it where/when possible. + +Since neither this nor any other compressed branch insn was being tested +so far, take the opportunity and introduce a new testcase covering those. +--- + gas/config/tc-riscv.c | 3 +++ + gas/testsuite/gas/riscv/c-branch-na.d | 20 ++++++++++++++++++++ + gas/testsuite/gas/riscv/c-branch.d | 19 +++++++++++++++++++ + gas/testsuite/gas/riscv/c-branch.s | 11 +++++++++++ + opcodes/riscv-opc.c | 2 +- + 5 files changed, 54 insertions(+), 1 deletion(-) + create mode 100644 gas/testsuite/gas/riscv/c-branch-na.d + create mode 100644 gas/testsuite/gas/riscv/c-branch.d + create mode 100644 gas/testsuite/gas/riscv/c-branch.s + +--- a/gas/config/tc-riscv.c ++++ b/gas/config/tc-riscv.c +@@ -2762,6 +2762,8 @@ riscv_ip (char *str, struct riscv_cl_ins + case 'p': + goto branch; + case 'a': ++ if (oparg == insn->args + 1) ++ goto jump_check_gpr; + goto jump; + case 'S': /* Floating-point RS1 x8-x15. */ + if (!reg_lookup (&asarg, RCLASS_FPR, ®no) +@@ -3271,6 +3273,7 @@ riscv_ip (char *str, struct riscv_cl_ins + but the 2nd (with 2 operands) might. */ + if (oparg == insn->args) + { ++ jump_check_gpr: + asargStart = asarg; + if (reg_lookup (&asarg, RCLASS_GPR, NULL) + && (*asarg == ',' || (ISSPACE (*asarg) && asarg[1] == ','))) +--- /dev/null ++++ b/gas/testsuite/gas/riscv/c-branch-na.d +@@ -0,0 +1,20 @@ ++#as: -march=rv32ic ++#source: c-branch.s ++#objdump: -drw -Mno-aliases ++ ++.*:[ ]+file format .* ++ ++ ++Disassembly of section .text: ++ ++0+ : ++[ ]+[0-9a-f]+:[ ]+c001[ ]+c\.beqz[ ]+s0,0 [ ]+0: R_RISCV_RVC_BRANCH .* ++[ ]+[0-9a-f]+:[ ]+dcfd[ ]+c\.beqz[ ]+s1,0 [ ]+2: R_RISCV_RVC_BRANCH .* ++[ ]+[0-9a-f]+:[ ]+fc75[ ]+c\.bnez[ ]+s0,0 [ ]+4: R_RISCV_RVC_BRANCH .* ++[ ]+[0-9a-f]+:[ ]+fced[ ]+c\.bnez[ ]+s1,0 [ ]+6: R_RISCV_RVC_BRANCH .* ++[ ]+[0-9a-f]+:[ ]+bfe5[ ]+c\.j[ ]+0 [ ]+8: R_RISCV_RVC_JUMP .* ++[ ]+[0-9a-f]+:[ ]+3fdd[ ]+c\.jal[ ]+0 [ ]+a: R_RISCV_RVC_JUMP .* ++[ ]+[0-9a-f]+:[ ]+9302[ ]+c\.jalr[ ]+t1 ++[ ]+[0-9a-f]+:[ ]+8382[ ]+c\.jr[ ]+t2 ++[ ]+[0-9a-f]+:[ ]+8082[ ]+c\.jr[ ]+ra ++#... +--- /dev/null ++++ b/gas/testsuite/gas/riscv/c-branch.d +@@ -0,0 +1,19 @@ ++#as: -march=rv64ic ++#objdump: -drw ++ ++.*:[ ]+file format .* ++ ++ ++Disassembly of section .text: ++ ++0+ : ++[ ]+[0-9a-f]+:[ ]+c001[ ]+beqz[ ]+s0,0 [ ]+0: R_RISCV_RVC_BRANCH .* ++[ ]+[0-9a-f]+:[ ]+dcfd[ ]+beqz[ ]+s1,0 [ ]+2: R_RISCV_RVC_BRANCH .* ++[ ]+[0-9a-f]+:[ ]+fc75[ ]+bnez[ ]+s0,0 [ ]+4: R_RISCV_RVC_BRANCH .* ++[ ]+[0-9a-f]+:[ ]+fced[ ]+bnez[ ]+s1,0 [ ]+6: R_RISCV_RVC_BRANCH .* ++[ ]+[0-9a-f]+:[ ]+bfe5[ ]+j[ ]+0 [ ]+8: R_RISCV_RVC_JUMP .* ++[ ]+[0-9a-f]+:[ ]+ff7ff0ef[ ]+jal[ ]+0 [ ]+a: R_RISCV_JAL .* ++[ ]+[0-9a-f]+:[ ]+9302[ ]+jalr[ ]+t1 ++[ ]+[0-9a-f]+:[ ]+8382[ ]+jr[ ]+t2 ++[ ]+[0-9a-f]+:[ ]+8082[ ]+ret ++#... +--- /dev/null ++++ b/gas/testsuite/gas/riscv/c-branch.s +@@ -0,0 +1,11 @@ ++ .text ++target: ++ beq x8, x0, target ++ beqz x9, target ++ bne x8, x0, target ++ bnez x9, target ++ j target ++ jal target ++ jalr x6 ++ jr x7 ++ ret +--- a/opcodes/riscv-opc.c ++++ b/opcodes/riscv-opc.c +@@ -340,9 +340,9 @@ const struct riscv_opcode riscv_opcodes[ + {"jalr", 0, INSN_CLASS_I, "d,s,j", MATCH_JALR, MASK_JALR, match_opcode, INSN_JSR }, + {"j", 0, INSN_CLASS_C, "Ca", MATCH_C_J, MASK_C_J, match_opcode, INSN_ALIAS|INSN_BRANCH }, + {"j", 0, INSN_CLASS_I, "a", MATCH_JAL, MASK_JAL|MASK_RD, match_opcode, INSN_ALIAS|INSN_BRANCH }, ++{"jal", 32, INSN_CLASS_C, "Ca", MATCH_C_JAL, MASK_C_JAL, match_opcode, INSN_ALIAS|INSN_JSR }, + {"jal", 0, INSN_CLASS_I, "a", MATCH_JAL|(X_RA << OP_SH_RD), MASK_JAL|MASK_RD, match_opcode, INSN_ALIAS|INSN_JSR }, + {"jal", 0, INSN_CLASS_I, "d,a", MATCH_JAL, MASK_JAL, match_opcode, INSN_JSR }, +-{"jal", 32, INSN_CLASS_C, "Ca", MATCH_C_JAL, MASK_C_JAL, match_opcode, INSN_ALIAS|INSN_JSR }, + {"call", 0, INSN_CLASS_I, "d,c", (X_T1 << OP_SH_RS1), (int) M_CALL, match_never, INSN_MACRO }, + {"call", 0, INSN_CLASS_I, "c", (X_RA << OP_SH_RS1)|(X_RA << OP_SH_RD), (int) M_CALL, match_never, INSN_MACRO }, + {"tail", 0, INSN_CLASS_I, "c", (X_T1 << OP_SH_RS1), (int) M_CALL, match_never, INSN_MACRO }, diff --git a/toolchain/binutils/patches/2.40/034-bpf-fix-error-conversion-from-long-unsigned-int-to-u.patch b/toolchain/binutils/patches/2.40/034-bpf-fix-error-conversion-from-long-unsigned-int-to-u.patch new file mode 100644 index 0000000000..d4317cdb0f --- /dev/null +++ b/toolchain/binutils/patches/2.40/034-bpf-fix-error-conversion-from-long-unsigned-int-to-u.patch @@ -0,0 +1,209 @@ +From 3e888977f165594cf44dbe8f67e3a4960b22c11f Mon Sep 17 00:00:00 2001 +From: "Guillermo E. Martinez" +Date: Fri, 3 Feb 2023 11:17:49 -0600 +Subject: [PATCH 34/50] bpf: fix error conversion from long unsigned int to + unsigned int [-Werror=overflow] +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Regenerating BPF target using the maintainer mode emits: +.../opcodes/bpf-opc.c:57:11: error: conversion from ‘long unsigned int’ to ‘unsigned int’ changes value from ‘18446744073709486335’ to ‘4294902015’ [-Werror=overflow] + 57 | 64, 64, 0xffffffffffff00ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + +The use of a narrow size to handle the mask CGEN in instruction format +is causing this error. Additionally eBPF `call' instructions +constructed by expressions using symbols (BPF_PSEUDO_CALL) emits +annotations in `src' field of the instruction, used to identify BPF +target endianness. + +cpu/ + * bpf.cpu (define-call-insn): Remove `src' field from + instruction mask. + +include/ + *opcode/cge.h (CGEN_IFMT): Adjust mask bit width. + +opcodes/ + * bpf-opc.c: Regenerate. + +(cherry picked from commit 7f6ebecd56e690012b05af0a492280765b17f186) +--- + cpu/bpf.cpu | 2 +- + include/opcode/cgen.h | 2 +- + opcodes/bpf-opc.c | 54 +++++++++++++++++++++++-------------------- + opcodes/cgen-dis.c | 2 +- + 4 files changed, 32 insertions(+), 28 deletions(-) + +--- a/cpu/bpf.cpu ++++ b/cpu/bpf.cpu +@@ -768,7 +768,7 @@ + "call" + (endian-isas x-endian) + "call $disp32" +- (+ disp32 (f-offset16 0) (f-regs 0) ++ (+ disp32 (f-offset16 0) (.sym src x-endian) ((.sym f-dst x-endian) 0) + OP_CLASS_JMP OP_SRC_K OP_CODE_CALL) + (c-call VOID + "bpfbf_call" disp32 (ifield (.sym f-src x-endian))) +--- a/include/opcode/cgen.h ++++ b/include/opcode/cgen.h +@@ -914,7 +914,7 @@ typedef struct + Each insn's value is stored with the insn. + The first step in recognizing an insn for disassembly is + (opcode & mask) == value. */ +- CGEN_INSN_INT mask; ++ CGEN_INSN_LGUINT mask; + #define CGEN_IFMT_MASK(ifmt) ((ifmt)->mask) + + /* Instruction fields. +--- a/opcodes/bpf-opc.c ++++ b/opcodes/bpf-opc.c +@@ -50,99 +50,103 @@ static const CGEN_IFMT ifmt_empty ATTRIB + }; + + static const CGEN_IFMT ifmt_addile ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_addrle ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffffffffffff00ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_negle ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xfffffffffffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_addibe ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_addrbe ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffffffffffff00ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_negbe ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffffffffffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_endlele ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_endlebe ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_lddwle ATTRIBUTE_UNUSED = { +- 64, 128, 0xff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 128, 0xfffff0ff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_lddwbe ATTRIBUTE_UNUSED = { +- 64, 128, 0xff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 128, 0xffff0fff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_ldabsw ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffffffff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_ldindwle ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_ldindwbe ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_ldxwle ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_ldxwbe ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_stble ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xf0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_stbbe ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xfff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_jeqile ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xf0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_jeqrle ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_jeqibe ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xfff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_jeqrbe ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_callle ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++}; ++ ++static const CGEN_IFMT ifmt_callbe ATTRIBUTE_UNUSED = { ++ 64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_ja ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffffffff0000ffff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + static const CGEN_IFMT ifmt_exit ATTRIBUTE_UNUSED = { +- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } ++ 64, 64, 0xffffffffffffffff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } + }; + + #undef F +@@ -1646,7 +1650,7 @@ static const CGEN_OPCODE bpf_cgen_insn_o + { + { 0, 0, 0, 0 }, + { { MNEM, ' ', OP (DISP32), 0 } }, +- & ifmt_callle, { 0x85 } ++ & ifmt_callbe, { 0x85 } + }, + /* call $dstle */ + { +--- a/opcodes/cgen-dis.c ++++ b/opcodes/cgen-dis.c +@@ -39,7 +39,7 @@ static void add_insn_to_hash_chain (CG + static int + count_decodable_bits (const CGEN_INSN *insn) + { +- unsigned mask = CGEN_INSN_BASE_MASK (insn); ++ CGEN_INSN_LGUINT mask = CGEN_INSN_BASE_MASK (insn); + #if GCC_VERSION >= 3004 + return __builtin_popcount (mask); + #else diff --git a/toolchain/binutils/patches/2.40/035-Pass-JANSSON_LIBS-and-ZSTD_LIBS-to-ld-bootstrap-boot.patch b/toolchain/binutils/patches/2.40/035-Pass-JANSSON_LIBS-and-ZSTD_LIBS-to-ld-bootstrap-boot.patch new file mode 100644 index 0000000000..3741c08a0c --- /dev/null +++ b/toolchain/binutils/patches/2.40/035-Pass-JANSSON_LIBS-and-ZSTD_LIBS-to-ld-bootstrap-boot.patch @@ -0,0 +1,50 @@ +From e1815414077347097e5bf0d75162add955e241d9 Mon Sep 17 00:00:00 2001 +From: Romain Geissler +Date: Sun, 5 Feb 2023 13:56:34 +0000 +Subject: [PATCH 35/50] Pass $JANSSON_LIBS and $ZSTD_LIBS to + ld-bootstrap/bootrap.exp + +--- + ld/Makefile.am | 1 + + ld/Makefile.in | 1 + + ld/testsuite/ld-bootstrap/bootstrap.exp | 4 ++-- + 3 files changed, 4 insertions(+), 2 deletions(-) + +--- a/ld/Makefile.am ++++ b/ld/Makefile.am +@@ -992,6 +992,7 @@ check-DEJAGNU: site.exp + CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \ + OFILES="$(OFILES)" BFDLIB="$(TESTBFDLIB)" CTFLIB="$(TESTCTFLIB) $(ZLIB)" \ + SFRAMELIB="$(TESTSFRAMELIB)" \ ++ JANSSON_LIBS="$(JANSSON_LIBS)" ZSTD_LIBS="$(ZSTD_LIBS)" \ + LIBIBERTY="$(LIBIBERTY) $(LIBINTL)" LIBS="$(LIBS)" \ + DO_COMPARE="`echo '$(do_compare)' | sed -e 's,\\$$,,g'`" \ + $(RUNTESTFLAGS); \ +--- a/ld/Makefile.in ++++ b/ld/Makefile.in +@@ -2645,6 +2645,7 @@ check-DEJAGNU: site.exp + CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \ + OFILES="$(OFILES)" BFDLIB="$(TESTBFDLIB)" CTFLIB="$(TESTCTFLIB) $(ZLIB)" \ + SFRAMELIB="$(TESTSFRAMELIB)" \ ++ JANSSON_LIBS="$(JANSSON_LIBS)" ZSTD_LIBS="$(ZSTD_LIBS)" \ + LIBIBERTY="$(LIBIBERTY) $(LIBINTL)" LIBS="$(LIBS)" \ + DO_COMPARE="`echo '$(do_compare)' | sed -e 's,\\$$,,g'`" \ + $(RUNTESTFLAGS); \ +--- a/ld/testsuite/ld-bootstrap/bootstrap.exp ++++ b/ld/testsuite/ld-bootstrap/bootstrap.exp +@@ -162,13 +162,13 @@ foreach flags $test_flags { + } + + if { [lindex [remote_exec build grep "-q \"HAVE_ZSTD 1\" config.h" ] 0] == 0 } then { +- set extralibs "$extralibs -lzstd" ++ set extralibs "$extralibs $ZSTD_LIBS" + } + + # Check if the system's jansson library is used. If so, the object files will + # be using symbols from it, so link to it. + if { [lindex [remote_exec build grep "-q \"HAVE_JANSSON 1\" config.h" ] 0] == 0 } then { +- set extralibs "$extralibs -ljansson" ++ set extralibs "$extralibs $JANSSON_LIBS" + } + + # Plugin support requires linking with libdl. diff --git a/toolchain/binutils/patches/2.40/036-Regen-config-files.patch b/toolchain/binutils/patches/2.40/036-Regen-config-files.patch new file mode 100644 index 0000000000..1c80dde310 --- /dev/null +++ b/toolchain/binutils/patches/2.40/036-Regen-config-files.patch @@ -0,0 +1,714 @@ +From 1fc096a4c590f28e0efb1823cdca653f2db9de74 Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Mon, 6 Feb 2023 10:48:59 +1030 +Subject: [PATCH 36/50] Regen config files + +For the version update to 2.40.0 +--- + bfd/configure | 20 ++++++++++---------- + binutils/configure | 20 ++++++++++---------- + gas/configure | 20 ++++++++++---------- + gprof/configure | 20 ++++++++++---------- + gprofng/configure | 20 ++++++++++---------- + gprofng/doc/version.texi | 8 ++++---- + gprofng/libcollector/configure | 20 ++++++++++---------- + intl/configure | 3 +++ + ld/configure | 20 ++++++++++---------- + opcodes/configure | 20 ++++++++++---------- + 10 files changed, 87 insertions(+), 84 deletions(-) + +--- a/bfd/configure ++++ b/bfd/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for bfd 2.40. ++# Generated by GNU Autoconf 2.69 for bfd 2.40.0. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='bfd' + PACKAGE_TARNAME='bfd' +-PACKAGE_VERSION='2.40' +-PACKAGE_STRING='bfd 2.40' ++PACKAGE_VERSION='2.40.0' ++PACKAGE_STRING='bfd 2.40.0' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1400,7 +1400,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures bfd 2.40 to adapt to many kinds of systems. ++\`configure' configures bfd 2.40.0 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1471,7 +1471,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of bfd 2.40:";; ++ short | recursive ) echo "Configuration of bfd 2.40.0:";; + esac + cat <<\_ACEOF + +@@ -1608,7 +1608,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-bfd configure 2.40 ++bfd configure 2.40.0 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -2202,7 +2202,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by bfd $as_me 2.40, which was ++It was created by bfd $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -3184,7 +3184,7 @@ fi + + # Define the identity of the package. + PACKAGE='bfd' +- VERSION='2.40' ++ VERSION='2.40.0' + + + cat >>confdefs.h <<_ACEOF +@@ -15906,7 +15906,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by bfd $as_me 2.40, which was ++This file was extended by bfd $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -15972,7 +15972,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-bfd config.status 2.40 ++bfd config.status 2.40.0 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +--- a/binutils/configure ++++ b/binutils/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for binutils 2.40. ++# Generated by GNU Autoconf 2.69 for binutils 2.40.0. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='binutils' + PACKAGE_TARNAME='binutils' +-PACKAGE_VERSION='2.40' +-PACKAGE_STRING='binutils 2.40' ++PACKAGE_VERSION='2.40.0' ++PACKAGE_STRING='binutils 2.40.0' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1401,7 +1401,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures binutils 2.40 to adapt to many kinds of systems. ++\`configure' configures binutils 2.40.0 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1472,7 +1472,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of binutils 2.40:";; ++ short | recursive ) echo "Configuration of binutils 2.40.0:";; + esac + cat <<\_ACEOF + +@@ -1631,7 +1631,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-binutils configure 2.40 ++binutils configure 2.40.0 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -2099,7 +2099,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by binutils $as_me 2.40, which was ++It was created by binutils $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -3081,7 +3081,7 @@ fi + + # Define the identity of the package. + PACKAGE='binutils' +- VERSION='2.40' ++ VERSION='2.40.0' + + + cat >>confdefs.h <<_ACEOF +@@ -15326,7 +15326,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by binutils $as_me 2.40, which was ++This file was extended by binutils $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -15392,7 +15392,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-binutils config.status 2.40 ++binutils config.status 2.40.0 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +--- a/gas/configure ++++ b/gas/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for gas 2.40. ++# Generated by GNU Autoconf 2.69 for gas 2.40.0. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='gas' + PACKAGE_TARNAME='gas' +-PACKAGE_VERSION='2.40' +-PACKAGE_STRING='gas 2.40' ++PACKAGE_VERSION='2.40.0' ++PACKAGE_STRING='gas 2.40.0' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1381,7 +1381,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures gas 2.40 to adapt to many kinds of systems. ++\`configure' configures gas 2.40.0 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1452,7 +1452,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of gas 2.40:";; ++ short | recursive ) echo "Configuration of gas 2.40.0:";; + esac + cat <<\_ACEOF + +@@ -1600,7 +1600,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-gas configure 2.40 ++gas configure 2.40.0 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -2011,7 +2011,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by gas $as_me 2.40, which was ++It was created by gas $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -2990,7 +2990,7 @@ fi + + # Define the identity of the package. + PACKAGE='gas' +- VERSION='2.40' ++ VERSION='2.40.0' + + + cat >>confdefs.h <<_ACEOF +@@ -14910,7 +14910,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by gas $as_me 2.40, which was ++This file was extended by gas $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -14976,7 +14976,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-gas config.status 2.40 ++gas config.status 2.40.0 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +--- a/gprof/configure ++++ b/gprof/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for gprof 2.40. ++# Generated by GNU Autoconf 2.69 for gprof 2.40.0. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='gprof' + PACKAGE_TARNAME='gprof' +-PACKAGE_VERSION='2.40' +-PACKAGE_STRING='gprof 2.40' ++PACKAGE_VERSION='2.40.0' ++PACKAGE_STRING='gprof 2.40.0' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1338,7 +1338,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures gprof 2.40 to adapt to many kinds of systems. ++\`configure' configures gprof 2.40.0 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1409,7 +1409,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of gprof 2.40:";; ++ short | recursive ) echo "Configuration of gprof 2.40.0:";; + esac + cat <<\_ACEOF + +@@ -1520,7 +1520,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-gprof configure 2.40 ++gprof configure 2.40.0 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -1885,7 +1885,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by gprof $as_me 2.40, which was ++It was created by gprof $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -2864,7 +2864,7 @@ fi + + # Define the identity of the package. + PACKAGE='gprof' +- VERSION='2.40' ++ VERSION='2.40.0' + + + cat >>confdefs.h <<_ACEOF +@@ -12572,7 +12572,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by gprof $as_me 2.40, which was ++This file was extended by gprof $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -12638,7 +12638,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-gprof config.status 2.40 ++gprof config.status 2.40.0 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +--- a/gprofng/configure ++++ b/gprofng/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for gprofng 2.40. ++# Generated by GNU Autoconf 2.69 for gprofng 2.40.0. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='gprofng' + PACKAGE_TARNAME='gprofng' +-PACKAGE_VERSION='2.40' +-PACKAGE_STRING='gprofng 2.40' ++PACKAGE_VERSION='2.40.0' ++PACKAGE_STRING='gprofng 2.40.0' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1364,7 +1364,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures gprofng 2.40 to adapt to many kinds of systems. ++\`configure' configures gprofng 2.40.0 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1435,7 +1435,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of gprofng 2.40:";; ++ short | recursive ) echo "Configuration of gprofng 2.40.0:";; + esac + cat <<\_ACEOF + +@@ -1549,7 +1549,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-gprofng configure 2.40 ++gprofng configure 2.40.0 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -2081,7 +2081,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by gprofng $as_me 2.40, which was ++It was created by gprofng $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -3054,7 +3054,7 @@ fi + + # Define the identity of the package. + PACKAGE='gprofng' +- VERSION='2.40' ++ VERSION='2.40.0' + + + cat >>confdefs.h <<_ACEOF +@@ -17528,7 +17528,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by gprofng $as_me 2.40, which was ++This file was extended by gprofng $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -17594,7 +17594,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-gprofng config.status 2.40 ++gprofng config.status 2.40.0 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +--- a/gprofng/doc/version.texi ++++ b/gprofng/doc/version.texi +@@ -1,4 +1,4 @@ +-@set UPDATED 5 January 2023 +-@set UPDATED-MONTH January 2023 +-@set EDITION 2.40 +-@set VERSION 2.40 ++@set UPDATED 1 February 2023 ++@set UPDATED-MONTH February 2023 ++@set EDITION 2.40.0 ++@set VERSION 2.40.0 +--- a/gprofng/libcollector/configure ++++ b/gprofng/libcollector/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for gprofng 2.40. ++# Generated by GNU Autoconf 2.69 for gprofng 2.40.0. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='gprofng' + PACKAGE_TARNAME='gprofng' +-PACKAGE_VERSION='2.40' +-PACKAGE_STRING='gprofng 2.40' ++PACKAGE_VERSION='2.40.0' ++PACKAGE_STRING='gprofng 2.40.0' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1325,7 +1325,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures gprofng 2.40 to adapt to many kinds of systems. ++\`configure' configures gprofng 2.40.0 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1396,7 +1396,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of gprofng 2.40:";; ++ short | recursive ) echo "Configuration of gprofng 2.40.0:";; + esac + cat <<\_ACEOF + +@@ -1505,7 +1505,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-gprofng configure 2.40 ++gprofng configure 2.40.0 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -1991,7 +1991,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by gprofng $as_me 2.40, which was ++It was created by gprofng $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -2968,7 +2968,7 @@ fi + + # Define the identity of the package. + PACKAGE='gprofng' +- VERSION='2.40' ++ VERSION='2.40.0' + + + cat >>confdefs.h <<_ACEOF +@@ -16098,7 +16098,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by gprofng $as_me 2.40, which was ++This file was extended by gprofng $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -16164,7 +16164,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-gprofng config.status 2.40 ++gprofng config.status 2.40.0 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +--- a/intl/configure ++++ b/intl/configure +@@ -6857,6 +6857,9 @@ case "${host}" in + # sets the default TLS model and affects inlining. + PICFLAG=-fPIC + ;; ++ loongarch*-*-*) ++ PICFLAG=-fpic ++ ;; + mips-sgi-irix6*) + # PIC is the default. + ;; +--- a/ld/configure ++++ b/ld/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for ld 2.40. ++# Generated by GNU Autoconf 2.69 for ld 2.40.0. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='ld' + PACKAGE_TARNAME='ld' +-PACKAGE_VERSION='2.40' +-PACKAGE_STRING='ld 2.40' ++PACKAGE_VERSION='2.40.0' ++PACKAGE_STRING='ld 2.40.0' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1423,7 +1423,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures ld 2.40 to adapt to many kinds of systems. ++\`configure' configures ld 2.40.0 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1494,7 +1494,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of ld 2.40:";; ++ short | recursive ) echo "Configuration of ld 2.40.0:";; + esac + cat <<\_ACEOF + +@@ -1661,7 +1661,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-ld configure 2.40 ++ld configure 2.40.0 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -2376,7 +2376,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by ld $as_me 2.40, which was ++It was created by ld $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -3359,7 +3359,7 @@ fi + + # Define the identity of the package. + PACKAGE='ld' +- VERSION='2.40' ++ VERSION='2.40.0' + + + cat >>confdefs.h <<_ACEOF +@@ -18083,7 +18083,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by ld $as_me 2.40, which was ++This file was extended by ld $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -18149,7 +18149,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-ld config.status 2.40 ++ld config.status 2.40.0 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +--- a/opcodes/configure ++++ b/opcodes/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69 for opcodes 2.40. ++# Generated by GNU Autoconf 2.69 for opcodes 2.40.0. + # + # + # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@@ -587,8 +587,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='opcodes' + PACKAGE_TARNAME='opcodes' +-PACKAGE_VERSION='2.40' +-PACKAGE_STRING='opcodes 2.40' ++PACKAGE_VERSION='2.40.0' ++PACKAGE_STRING='opcodes 2.40.0' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1360,7 +1360,7 @@ if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures opcodes 2.40 to adapt to many kinds of systems. ++\`configure' configures opcodes 2.40.0 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1431,7 +1431,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of opcodes 2.40:";; ++ short | recursive ) echo "Configuration of opcodes 2.40.0:";; + esac + cat <<\_ACEOF + +@@ -1545,7 +1545,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-opcodes configure 2.40 ++opcodes configure 2.40.0 + generated by GNU Autoconf 2.69 + + Copyright (C) 2012 Free Software Foundation, Inc. +@@ -2139,7 +2139,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by opcodes $as_me 2.40, which was ++It was created by opcodes $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ +@@ -3118,7 +3118,7 @@ fi + + # Define the identity of the package. + PACKAGE='opcodes' +- VERSION='2.40' ++ VERSION='2.40.0' + + + cat >>confdefs.h <<_ACEOF +@@ -13191,7 +13191,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by opcodes $as_me 2.40, which was ++This file was extended by opcodes $as_me 2.40.0, which was + generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -13257,7 +13257,7 @@ _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-opcodes config.status 2.40 ++opcodes config.status 2.40.0 + configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + diff --git a/toolchain/binutils/patches/2.40/040-configure-remove-dependencies-on-gmp-and-mpfr-when-g.patch b/toolchain/binutils/patches/2.40/040-configure-remove-dependencies-on-gmp-and-mpfr-when-g.patch new file mode 100644 index 0000000000..261acb549e --- /dev/null +++ b/toolchain/binutils/patches/2.40/040-configure-remove-dependencies-on-gmp-and-mpfr-when-g.patch @@ -0,0 +1,51 @@ +From 17294931e3e361bee6810b1a39493e214b38c5e5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= +Date: Tue, 3 Jan 2023 14:24:43 +0100 +Subject: [PATCH 40/50] configure: remove dependencies on gmp and mpfr when gdb + is disabled + +Since 991180627851801f1999d1ebbc0e569a17e47c74, the configure checks +about GMP and MPFR for gdb builds have been moved to the toplevel +configure. +However, it doesn't take into account the --disable-gdb option. Meaning +that a build without gdb will require these libraries even if not +needed. + +ChangeLog: + + * configure.ac: Skip GMP and MPFR when --disable-gdb is + provided. + * configure: Regenerate. + +(cherry picked from commit 5fb0e308577143ceb313fde5538dc9ecb038f29f) +--- + configure | 4 +++- + configure.ac | 4 +++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +--- a/configure ++++ b/configure +@@ -8032,7 +8032,9 @@ if test -d ${srcdir}/gcc ; then + require_mpc=yes + fi + if test -d ${srcdir}/gdb ; then +- require_gmp=yes ++ if test "x$enable_gdb" != xno; then ++ require_gmp=yes ++ fi + fi + + gmplibs="-lmpfr -lgmp" +--- a/configure.ac ++++ b/configure.ac +@@ -1585,7 +1585,9 @@ if test -d ${srcdir}/gcc ; then + require_mpc=yes + fi + if test -d ${srcdir}/gdb ; then +- require_gmp=yes ++ if test "x$enable_gdb" != xno; then ++ require_gmp=yes ++ fi + fi + + gmplibs="-lmpfr -lgmp" diff --git a/toolchain/binutils/patches/2.40/046-gas-correct-symbol-name-comparison-in-.startof.-.siz.patch b/toolchain/binutils/patches/2.40/046-gas-correct-symbol-name-comparison-in-.startof.-.siz.patch new file mode 100644 index 0000000000..4e31bb43ed --- /dev/null +++ b/toolchain/binutils/patches/2.40/046-gas-correct-symbol-name-comparison-in-.startof.-.siz.patch @@ -0,0 +1,46 @@ +From b2bc62b7b4e7638c3a249d2d2728ceb4d5f2b22c Mon Sep 17 00:00:00 2001 +From: Jan Beulich +Date: Tue, 14 Feb 2023 08:35:02 +0100 +Subject: [PATCH 46/50] gas: correct symbol name comparison in + .startof./.sizeof. handling + +In 162c6aef1f3a ("gas: fold symbol table entries generated for +.startof.() / .sizeof.()") I screwed up quite badly, inverting the case +sensitive and case insensitive comparison functions. +--- + gas/expr.c | 4 ++-- + gas/testsuite/gas/elf/startof.d | 2 ++ + gas/testsuite/gas/elf/startof.s | 3 +++ + 3 files changed, 7 insertions(+), 2 deletions(-) + +--- a/gas/expr.c ++++ b/gas/expr.c +@@ -149,8 +149,8 @@ symbol_lookup_or_make (const char *name, + + name = S_GET_NAME (symbolP); + if ((symbols_case_sensitive +- ? strcasecmp (buf, name) +- : strcmp (buf, name)) == 0) ++ ? strcmp (buf, name) ++ : strcasecmp (buf, name)) == 0) + { + free (buf); + return symbolP; +--- a/gas/testsuite/gas/elf/startof.d ++++ b/gas/testsuite/gas/elf/startof.d +@@ -7,4 +7,6 @@ Symbol table .* + #... + [1-8]: 0+ .* UND \.startof\.\.text + [2-9]: 0+ .* UND \.sizeof\.\.text ++ +[1-9][0-9]*: 0+ .* UND \.startof\.\.Text ++ +[1-9][0-9]*: 0+ .* UND \.sizeof\.\.TEXT + #pass +--- a/gas/testsuite/gas/elf/startof.s ++++ b/gas/testsuite/gas/elf/startof.s +@@ -4,3 +4,6 @@ + .dc.a 0 + .dc.a .sizeof.(.text) + .dc.a .startof.(.text) ++ .dc.a 0 ++ .dc.a .startof.(.Text) ++ .dc.a .sizeof.(.TEXT) diff --git a/toolchain/binutils/patches/2.40/300-001_ld_makefile_patch.patch b/toolchain/binutils/patches/2.40/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000000..2dafd92a01 --- /dev/null +++ b/toolchain/binutils/patches/2.40/300-001_ld_makefile_patch.patch @@ -0,0 +1,22 @@ +--- a/ld/Makefile.am ++++ b/ld/Makefile.am +@@ -50,7 +50,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS) + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- a/ld/Makefile.in ++++ b/ld/Makefile.in +@@ -573,7 +573,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS) + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + BASEDIR = $(srcdir)/.. + BFDDIR = $(BASEDIR)/bfd + INCDIR = $(BASEDIR)/include diff --git a/toolchain/binutils/patches/2.40/400-mips_no_dynamic_linking_sym.patch b/toolchain/binutils/patches/2.40/400-mips_no_dynamic_linking_sym.patch new file mode 100644 index 0000000000..aeb5a993a6 --- /dev/null +++ b/toolchain/binutils/patches/2.40/400-mips_no_dynamic_linking_sym.patch @@ -0,0 +1,18 @@ +--- a/bfd/elfxx-mips.c ++++ b/bfd/elfxx-mips.c +@@ -8119,6 +8119,7 @@ _bfd_mips_elf_create_dynamic_sections (b + + name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING"; + bh = NULL; ++ if (0) { + if (!(_bfd_generic_link_add_one_symbol + (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0, + NULL, false, get_elf_backend_data (abfd)->collect, &bh))) +@@ -8131,6 +8132,7 @@ _bfd_mips_elf_create_dynamic_sections (b + + if (! bfd_elf_link_record_dynamic_symbol (info, h)) + return false; ++ } + + if (! mips_elf_hash_table (info)->use_rld_obj_head) + { diff --git a/toolchain/binutils/patches/2.40/500-Change-default-emulation-for-mips64-linux.patch b/toolchain/binutils/patches/2.40/500-Change-default-emulation-for-mips64-linux.patch new file mode 100644 index 0000000000..14a18a1d80 --- /dev/null +++ b/toolchain/binutils/patches/2.40/500-Change-default-emulation-for-mips64-linux.patch @@ -0,0 +1,38 @@ +--- a/bfd/config.bfd ++++ b/bfd/config.bfd +@@ -944,12 +944,12 @@ case "${targ}" in + targ_selvecs="mips_elf32_le_vec mips_elf64_be_vec mips_elf64_le_vec mips_ecoff_be_vec mips_ecoff_le_vec" + ;; + mips64*el-*-linux*) +- targ_defvec=mips_elf32_ntrad_le_vec +- targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_le_vec mips_elf64_trad_be_vec" ++ targ_defvec=mips_elf64_trad_le_vec ++ targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_be_vec" + ;; + mips64*-*-linux*) +- targ_defvec=mips_elf32_ntrad_be_vec +- targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec" ++ targ_defvec=mips_elf64_trad_be_vec ++ targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_le_vec" + ;; + mips*el-*-linux*) + targ_defvec=mips_elf32_trad_le_vec +--- a/ld/configure.tgt ++++ b/ld/configure.tgt +@@ -585,12 +585,12 @@ mips*-*-vxworks*) targ_emul=elf32ebmipvx + ;; + mips*-*-windiss) targ_emul=elf32mipswindiss + ;; +-mips64*el-*-linux-*) targ_emul=elf32ltsmipn32 +- targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" ++mips64*el-*-linux-*) targ_emul=elf64ltsmip ++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32ltsmip elf32btsmip elf64btsmip" + targ_extra_libpath=$targ_extra_emuls + ;; +-mips64*-*-linux-*) targ_emul=elf32btsmipn32 +- targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" ++mips64*-*-linux-*) targ_emul=elf64btsmip ++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip" + targ_extra_libpath=$targ_extra_emuls + ;; + mips*el-*-linux-*) targ_emul=elf32ltsmip diff --git a/toolchain/fortify-headers/Makefile b/toolchain/fortify-headers/Makefile index a6151bb2f1..3362fb427a 100644 --- a/toolchain/fortify-headers/Makefile +++ b/toolchain/fortify-headers/Makefile @@ -9,9 +9,9 @@ include $(INCLUDE_DIR)/target.mk PKG_NAME:=fortify-headers PKG_VERSION:=1.1 -PKG_RELEASE=1 +PKG_RELEASE=3 -PKG_SOURCE_URL:=http://dl.2f30.org/releases +PKG_SOURCE_URL:=https://dl.2f30.org/releases PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_HASH:=6ba5d860a2d2ba4c3346924b93930c34856eafe148bdbdf271ecab8065201fb6 diff --git a/toolchain/fortify-headers/patches/001-__ppoll_time64.patch b/toolchain/fortify-headers/patches/001-__ppoll_time64.patch new file mode 100644 index 0000000000..05f8c71714 --- /dev/null +++ b/toolchain/fortify-headers/patches/001-__ppoll_time64.patch @@ -0,0 +1,11 @@ +--- a/include/poll.h ++++ b/include/poll.h +@@ -39,7 +39,7 @@ _FORTIFY_FN(poll) int poll(struct pollfd + return __orig_poll(__f, __n, __s); + } + +-#ifdef _GNU_SOURCE ++#if defined(_GNU_SOURCE) && !(defined(_REDIR_TIME64) && _REDIR_TIME64) + #undef ppoll + _FORTIFY_FN(ppoll) int ppoll(struct pollfd *__f, nfds_t __n, const struct timespec *__s, + const sigset_t *__m) diff --git a/toolchain/fortify-headers/patches/002-strings.h-add-__extension__-mark.patch b/toolchain/fortify-headers/patches/002-strings.h-add-__extension__-mark.patch new file mode 100644 index 0000000000..001e578e60 --- /dev/null +++ b/toolchain/fortify-headers/patches/002-strings.h-add-__extension__-mark.patch @@ -0,0 +1,29 @@ +From 9ee4b9bd8df55ebbd5f6426fda4a36e1958b64c5 Mon Sep 17 00:00:00 2001 +From: Matthias Van Parys +Date: Mon, 10 Jul 2023 14:31:05 +0200 +Subject: [PATCH] strings.h: Add __extension__ mark to include_next to silence + -pedantic + +Add __extension__ before #include-next in strings.h as was done for all other header files in commits +7fd984fcb532be01f68cddc194c09a7ca10c1ea6 and a9ffac8596b094da8563aa5dd5d81c946670afe +--- + include/strings.h | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/include/strings.h b/include/strings.h +index a16e1ad..d1902db 100644 +--- a/include/strings.h ++++ b/include/strings.h +@@ -16,6 +16,9 @@ + #ifndef _FORTIFY_STRINGS_H + #define _FORTIFY_STRINGS_H + ++#ifndef __cplusplus ++__extension__ ++#endif + #include_next + + #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 +-- +2.34.1 + diff --git a/toolchain/gcc/Config.in b/toolchain/gcc/Config.in index 357589e172..9156f9c263 100644 --- a/toolchain/gcc/Config.in +++ b/toolchain/gcc/Config.in @@ -2,18 +2,18 @@ choice prompt "GCC compiler Version" if TOOLCHAINOPTS - default GCC_USE_VERSION_11 + default GCC_USE_VERSION_12 help Select the version of gcc you wish to use. - config GCC_USE_VERSION_8 - bool "gcc 8.x" - - config GCC_USE_VERSION_10 - bool "gcc 10.x" - config GCC_USE_VERSION_11 bool "gcc 11.x" + + config GCC_USE_VERSION_12 + bool "gcc 12.x" + + config GCC_USE_VERSION_13 + bool "gcc 13.x" endchoice config GCC_USE_GRAPHITE @@ -30,21 +30,18 @@ config EXTRA_GCC_CONFIG_OPTIONS config GCC_DEFAULT_PIE bool prompt "Build executable with PIE enabled by default" if TOOLCHAINOPTS - default n help Use gcc configure option --enable-default-pie to turn on -fPIE and -pie by default. config GCC_DEFAULT_SSP bool prompt "Build executable with Stack-Smashing Protection enabled by default" if TOOLCHAINOPTS - default n help Use gcc configure option --enable-default-ssp to turn on -fstack-protector-strong by default. config SJLJ_EXCEPTIONS bool prompt "Use setjump()/longjump() exceptions" if TOOLCHAINOPTS - default n help Use old setjump()/longjump() exceptions instead of the newer frame unwinding exceptions handling routines. Warning: increases @@ -53,7 +50,6 @@ config SJLJ_EXCEPTIONS config INSTALL_GFORTRAN bool prompt "Build/install fortran compiler?" if TOOLCHAINOPTS - default n help Build/install GNU fortran compiler ? @@ -61,6 +57,5 @@ config INSTALL_GCCGO bool prompt "Build/install Go compiler?" if TOOLCHAINOPTS depends on USE_GLIBC || BROKEN - default n help Build/install GNU gccgo compiler ? diff --git a/toolchain/gcc/Config.version b/toolchain/gcc/Config.version index 61506b670b..7126a0c883 100644 --- a/toolchain/gcc/Config.version +++ b/toolchain/gcc/Config.version @@ -1,13 +1,13 @@ -config GCC_VERSION_8 - default y if GCC_USE_VERSION_8 +config GCC_VERSION_11 + default y if GCC_USE_VERSION_11 bool -config GCC_VERSION_10 - default y if GCC_USE_VERSION_10 +config GCC_VERSION_13 + default y if GCC_USE_VERSION_13 bool config GCC_VERSION string - default "8.4.0" if GCC_VERSION_8 - default "10.3.0" if GCC_VERSION_10 - default "11.2.0" + default "11.3.0" if GCC_VERSION_11 + default "13.1.0" if GCC_VERSION_13 + default "12.3.0" diff --git a/toolchain/gcc/common.mk b/toolchain/gcc/common.mk index a366087915..dc8fd5c4e6 100644 --- a/toolchain/gcc/common.mk +++ b/toolchain/gcc/common.mk @@ -23,24 +23,26 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gcc GCC_VERSION:=$(call qstrip,$(CONFIG_GCC_VERSION)) PKG_VERSION:=$(firstword $(subst +, ,$(GCC_VERSION))) +GCC_MAJOR_VERSION:=$(word 1,$(subst ., ,$(PKG_VERSION))) GCC_DIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE_URL:=@GNU/gcc/gcc-$(PKG_VERSION) PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_CPE_ID:=cpe:/a:gnu:gcc -ifeq ($(PKG_VERSION),8.4.0) - PKG_HASH:=e30a6e52d10e1f27ed55104ad233c30bd1e99cfb5ff98ab022dc941edd1b2dd4 +ifeq ($(PKG_VERSION),11.3.0) + PKG_HASH:=b47cf2818691f5b1e21df2bb38c795fac2cfbd640ede2d0a5e1c89e338a3ac39 endif -ifeq ($(PKG_VERSION),10.3.0) - PKG_HASH:=64f404c1a650f27fc33da242e1f2df54952e3963a49e06e73f6940f3223ac344 +ifeq ($(PKG_VERSION),12.3.0) + PKG_HASH:=949a5d4f99e786421a93b532b22ffab5578de7321369975b91aec97adfda8c3b endif -ifeq ($(PKG_VERSION),11.2.0) - PKG_HASH:=d08edc536b54c372a1010ff6619dd274c0f1603aa49212ba20f7aa2cda36fa8b +ifeq ($(PKG_VERSION),13.1.0) + PKG_HASH:=61d684f0aa5e76ac6585ad8898a2427aade8979ed5e7f85492286c4dfc13ee86 endif -PATCH_DIR=../patches/$(GCC_VERSION) +PATCH_DIR=../patches-$(GCC_MAJOR_VERSION).x BUGURL=http://bugs.openwrt.org/ PKGVERSION=libreCMC GCC $(PKG_VERSION) $(REVISION) @@ -69,23 +71,22 @@ TAR_OPTIONS += \ --exclude-from='$(CURDIR)/../exclude-testsuite' --exclude=gcc/ada/*.ad* \ --exclude=libjava +# this needs to be without -L/-lzstd flags or other parts fail to build +# use an absolute path to ensure it really picks up our version +export ac_cv_search_ZSTD_compress=$(STAGING_DIR_HOST)/lib/libzstd.a -pthread export libgcc_cv_fixed_point=no ifdef CONFIG_INSTALL_GCCGO export libgo_cv_c_split_stack_supported=no endif ifdef CONFIG_GCC_USE_GRAPHITE - GRAPHITE_CONFIGURE:= --with-isl=$(TOPDIR)/staging_dir/host + GRAPHITE_CONFIGURE:= --with-isl=$(STAGING_DIR_HOST) else GRAPHITE_CONFIGURE:= --without-isl --without-cloog endif GCC_CONFIGURE:= \ SHELL="$(BASH)" \ - $(if $(shell gcc --version 2>&1 | grep -E "Apple.(LLVM|clang)"), \ - CFLAGS="-O2 -fbracket-depth=512 -pipe" \ - CXXFLAGS="-O2 -fbracket-depth=512 -pipe" \ - ) \ $(HOST_SOURCE_DIR)/configure \ --with-bugurl=$(BUGURL) \ --with-pkgversion="$(PKGVERSION)" \ @@ -109,13 +110,15 @@ GCC_CONFIGURE:= \ --with-abi=$(call qstrip,$(CONFIG_MIPS64_ABI))) \ $(if $(CONFIG_arc),--with-cpu=$(CONFIG_CPU_TYPE)) \ $(if $(CONFIG_powerpc64), $(if $(CONFIG_USE_MUSL),--with-abi=elfv2)) \ - --with-gmp=$(TOPDIR)/staging_dir/host \ - --with-mpfr=$(TOPDIR)/staging_dir/host \ - --with-mpc=$(TOPDIR)/staging_dir/host \ + --with-system-zlib=$(STAGING_DIR_HOST) \ + --with-zstd=$(STAGING_DIR_HOST) \ + --with-gmp=$(STAGING_DIR_HOST) \ + --with-mpfr=$(STAGING_DIR_HOST) \ + --with-mpc=$(STAGING_DIR_HOST) \ --disable-decimal-float \ --with-diagnostics-color=auto-if-env \ --enable-__cxa_atexit \ - --disable-libstdcxx-dual-abi \ + --enable-libstdcxx-dual-abi \ --with-default-libstdcxx-abi=new ifneq ($(CONFIG_mips)$(CONFIG_mipsel),) GCC_CONFIGURE += --with-mips-plt @@ -167,19 +170,34 @@ ifeq ($(CONFIG_TARGET_x86)$(CONFIG_USE_GLIBC)$(CONFIG_INSTALL_GCCGO),yyy) TARGET_CFLAGS+=-fno-split-stack endif +CFLAGS:=$(HOST_CFLAGS) -pipe +ifneq ($(shell gcc --version 2>&1 | grep -E "Apple.(LLVM|clang)"),) + CFLAGS+= -fbracket-depth=512 +endif + +GCC_CONFIGURE+= \ + CFLAGS="$(CFLAGS)" \ + CXXFLAGS="$(CFLAGS)" \ + CFLAGS_FOR_TARGET="$(TARGET_CFLAGS)" \ + CXXFLAGS_FOR_TARGET="$(TARGET_CFLAGS)" \ + GOCFLAGS_FOR_TARGET="$(TARGET_CFLAGS)" + GCC_MAKE:= \ export SHELL="$(BASH)"; \ - $(MAKE) \ - CFLAGS="$(HOST_CFLAGS)" \ - CFLAGS_FOR_TARGET="$(TARGET_CFLAGS)" \ - CXXFLAGS_FOR_TARGET="$(TARGET_CFLAGS)" \ - GOCFLAGS_FOR_TARGET="$(TARGET_CFLAGS)" + $(MAKE) define Host/SetToolchainInfo $(SED) 's,TARGET_CROSS=.*,TARGET_CROSS=$(REAL_GNU_TARGET_NAME)-,' $(TOOLCHAIN_DIR)/info.mk $(SED) 's,GCC_VERSION=.*,GCC_VERSION=$(GCC_VERSION),' $(TOOLCHAIN_DIR)/info.mk endef + +ifeq ($(GCC_MAJOR_VERSION),11) + GCC_VERSION_FILE:=gcc/version.c +else + GCC_VERSION_FILE:=gcc/genversion.cc +endif + ifneq ($(GCC_PREPARE),) define Host/Prepare $(call Host/SetToolchainInfo) @@ -188,8 +206,7 @@ ifneq ($(GCC_PREPARE),) $(CP) $(SCRIPT_DIR)/config.{guess,sub} $(HOST_SOURCE_DIR)/ $(SED) 's,^MULTILIB_OSDIRNAMES,# MULTILIB_OSDIRNAMES,' $(HOST_SOURCE_DIR)/gcc/config/*/t-* $(SED) 'd' $(HOST_SOURCE_DIR)/gcc/DEV-PHASE - $(SED) 's, DATESTAMP,,' $(HOST_SOURCE_DIR)/gcc/version.c - #(cd $(HOST_SOURCE_DIR)/libstdc++-v3; autoconf;); + $(SED) 's, DATESTAMP,,' $(HOST_SOURCE_DIR)/$(GCC_VERSION_FILE) $(SED) 's,gcc_no_link=yes,gcc_no_link=no,' $(HOST_SOURCE_DIR)/libstdc++-v3/configure mkdir -p $(GCC_BUILD_DIR) endef diff --git a/toolchain/gcc/final/Makefile b/toolchain/gcc/final/Makefile index 0315b9d1f1..78a5576bff 100644 --- a/toolchain/gcc/final/Makefile +++ b/toolchain/gcc/final/Makefile @@ -8,8 +8,9 @@ GCC_CONFIGURE += \ --enable-shared \ --enable-threads \ --with-slibdir=$(TOOLCHAIN_DIR)/lib \ + --enable-plugins \ --enable-lto \ - --with-libelf=$(TOPDIR)/staging_dir/host + --with-libelf=$(STAGING_DIR_HOST) ifndef CONFIG_USE_GLIBC GCC_CONFIGURE += --disable-libsanitizer diff --git a/toolchain/gcc/initial/Makefile b/toolchain/gcc/initial/Makefile index c71b17dd87..7cb4a73dbc 100644 --- a/toolchain/gcc/initial/Makefile +++ b/toolchain/gcc/initial/Makefile @@ -19,18 +19,10 @@ endef define Host/Install +$(GCC_MAKE) $(HOST_JOBS) -C $(GCC_BUILD_DIR) \ - prefix="$(TOOLCHAIN_DIR)/initial" \ install-gcc \ install-target-libgcc - # XXX: glibc insists on linking against libgcc_eh - ( cd $(TOOLCHAIN_DIR)/initial/lib/gcc/$(REAL_GNU_TARGET_NAME)/$(PKG_VERSION) ; \ - [ -e libgcc_eh.a ] || ln -sf libgcc.a libgcc_eh.a ; \ - cp libgcc.a libgcc_initial.a; \ - ) - - $(call FixupLibdir,$(TOOLCHAIN_DIR)/initial) - $$(call file_copy,$(TOOLCHAIN_DIR)/initial/.,$(TOOLCHAIN_DIR)/) + $(call FixupLibdir,$(TOOLCHAIN_DIR)) endef $(eval $(call HostBuild)) diff --git a/toolchain/gcc/patches/10.3.0/002-case_insensitive.patch b/toolchain/gcc/patches-11.x/002-case_insensitive.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/002-case_insensitive.patch rename to toolchain/gcc/patches-11.x/002-case_insensitive.patch diff --git a/toolchain/gcc/patches-11.x/010-documentation.patch b/toolchain/gcc/patches-11.x/010-documentation.patch new file mode 100644 index 0000000000..25a5e1e99c --- /dev/null +++ b/toolchain/gcc/patches-11.x/010-documentation.patch @@ -0,0 +1,35 @@ +commit 098bd91f5eae625c7d2ee621e10930fc4434e5e2 +Author: Luka Perkov +Date: Tue Feb 26 16:16:33 2013 +0000 + + gcc: don't build documentation + + This closes #13039. + + Signed-off-by: Luka Perkov + + SVN-Revision: 35807 + +--- a/gcc/Makefile.in ++++ b/gcc/Makefile.in +@@ -3348,18 +3348,10 @@ doc/gcc.info: $(TEXI_GCC_FILES) + doc/gccint.info: $(TEXI_GCCINT_FILES) + doc/cppinternals.info: $(TEXI_CPPINT_FILES) + +-doc/%.info: %.texi +- if [ x$(BUILD_INFO) = xinfo ]; then \ +- $(MAKEINFO) $(MAKEINFOFLAGS) -I . -I $(gcc_docdir) \ +- -I $(gcc_docdir)/include -o $@ $<; \ +- fi ++doc/%.info: + + # Duplicate entry to handle renaming of gccinstall.info +-doc/gccinstall.info: $(TEXI_GCCINSTALL_FILES) +- if [ x$(BUILD_INFO) = xinfo ]; then \ +- $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ +- -I $(gcc_docdir)/include -o $@ $<; \ +- fi ++doc/gccinstall.info: + + doc/cpp.dvi: $(TEXI_CPP_FILES) + doc/gcc.dvi: $(TEXI_GCC_FILES) diff --git a/toolchain/gcc/patches-11.x/011-v12-configure-define-TARGET_LIBC_GNUSTACK-on-musl.patch b/toolchain/gcc/patches-11.x/011-v12-configure-define-TARGET_LIBC_GNUSTACK-on-musl.patch new file mode 100644 index 0000000000..423def6000 --- /dev/null +++ b/toolchain/gcc/patches-11.x/011-v12-configure-define-TARGET_LIBC_GNUSTACK-on-musl.patch @@ -0,0 +1,46 @@ +From ea650cae26da4a8fc04f0c4666f4dd776d0b5fc0 Mon Sep 17 00:00:00 2001 +From: Ilya Lipnitskiy +Date: Sun, 14 Nov 2021 21:54:25 -0800 +Subject: [PATCH] configure: define TARGET_LIBC_GNUSTACK on musl + +musl only uses PT_GNU_STACK to set default thread stack size and has no +executable stack support[0], so there is no reason not to emit the +.note.GNU-stack section on musl builds. + +[0]: https://lore.kernel.org/all/20190423192534.GN23599@brightrain.aerifal.cx/T/#u + +gcc/ChangeLog: + + * configure: Regenerate. + * configure.ac: define TARGET_LIBC_GNUSTACK on musl + +Signed-off-by: Ilya Lipnitskiy +--- + gcc/configure | 3 +++ + gcc/configure.ac | 3 +++ + 2 files changed, 6 insertions(+) + +--- a/gcc/configure ++++ b/gcc/configure +@@ -31533,6 +31533,9 @@ fi + # Check if the target LIBC handles PT_GNU_STACK. + gcc_cv_libc_gnustack=unknown + case "$target" in ++ mips*-*-linux-musl*) ++ gcc_cv_libc_gnustack=yes ++ ;; + mips*-*-linux*) + + if test $glibc_version_major -gt 2 \ +--- a/gcc/configure.ac ++++ b/gcc/configure.ac +@@ -7023,6 +7023,9 @@ fi + # Check if the target LIBC handles PT_GNU_STACK. + gcc_cv_libc_gnustack=unknown + case "$target" in ++ mips*-*-linux-musl*) ++ gcc_cv_libc_gnustack=yes ++ ;; + mips*-*-linux*) + GCC_GLIBC_VERSION_GTE_IFELSE([2], [31], [gcc_cv_libc_gnustack=yes], ) + ;; diff --git a/toolchain/gcc/patches/10.3.0/110-Fix-MIPS-PR-84790.patch b/toolchain/gcc/patches-11.x/110-Fix-MIPS-PR-84790.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/110-Fix-MIPS-PR-84790.patch rename to toolchain/gcc/patches-11.x/110-Fix-MIPS-PR-84790.patch diff --git a/toolchain/gcc/patches/11.2.0/230-musl_libssp.patch b/toolchain/gcc/patches-11.x/230-musl_libssp.patch similarity index 100% rename from toolchain/gcc/patches/11.2.0/230-musl_libssp.patch rename to toolchain/gcc/patches-11.x/230-musl_libssp.patch diff --git a/toolchain/gcc/patches/10.3.0/300-mips_Os_cpu_rtx_cost_model.patch b/toolchain/gcc/patches-11.x/300-mips_Os_cpu_rtx_cost_model.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/300-mips_Os_cpu_rtx_cost_model.patch rename to toolchain/gcc/patches-11.x/300-mips_Os_cpu_rtx_cost_model.patch diff --git a/toolchain/gcc/patches-11.x/400-libsanitizer-cherry-pick-9cf13067cb5088626ba7-from-u.patch b/toolchain/gcc/patches-11.x/400-libsanitizer-cherry-pick-9cf13067cb5088626ba7-from-u.patch new file mode 100644 index 0000000000..39869b4746 --- /dev/null +++ b/toolchain/gcc/patches-11.x/400-libsanitizer-cherry-pick-9cf13067cb5088626ba7-from-u.patch @@ -0,0 +1,39 @@ +From d2356ebb0084a0d80dbfe33040c9afe938c15d19 Mon Sep 17 00:00:00 2001 +From: Martin Liska +Date: Mon, 11 Jul 2022 22:03:14 +0200 +Subject: [PATCH] libsanitizer: cherry-pick 9cf13067cb5088626ba7 from upstream + +9cf13067cb5088626ba7ee1ec4c42ec59c7995a0 [sanitizer] Remove #include to resolve fsconfig_command/mount_attr conflict with glibc 2.36 + +(cherry picked from commit 2701442d0cf6292f6624443c15813d6d1a3562fe) +--- + .../sanitizer_platform_limits_posix.cpp | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp ++++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp +@@ -72,7 +72,9 @@ + #include + #include + #include ++#if SANITIZER_ANDROID + #include ++#endif + #include + #include + #include +@@ -828,10 +830,10 @@ unsigned struct_ElfW_Phdr_sz = sizeof(El + unsigned IOCTL_EVIOCGPROP = IOCTL_NOT_PRESENT; + unsigned IOCTL_EVIOCSKEYCODE_V2 = IOCTL_NOT_PRESENT; + #endif +- unsigned IOCTL_FS_IOC_GETFLAGS = FS_IOC_GETFLAGS; +- unsigned IOCTL_FS_IOC_GETVERSION = FS_IOC_GETVERSION; +- unsigned IOCTL_FS_IOC_SETFLAGS = FS_IOC_SETFLAGS; +- unsigned IOCTL_FS_IOC_SETVERSION = FS_IOC_SETVERSION; ++ unsigned IOCTL_FS_IOC_GETFLAGS = _IOR('f', 1, long); ++ unsigned IOCTL_FS_IOC_GETVERSION = _IOR('v', 1, long); ++ unsigned IOCTL_FS_IOC_SETFLAGS = _IOW('f', 2, long); ++ unsigned IOCTL_FS_IOC_SETVERSION = _IOW('v', 2, long); + unsigned IOCTL_GIO_CMAP = GIO_CMAP; + unsigned IOCTL_GIO_FONT = GIO_FONT; + unsigned IOCTL_GIO_UNIMAP = GIO_UNIMAP; diff --git a/toolchain/gcc/patches-11.x/700-RISCV-Inline-subword-atomic-ops.patch b/toolchain/gcc/patches-11.x/700-RISCV-Inline-subword-atomic-ops.patch new file mode 100644 index 0000000000..0da7eb4af6 --- /dev/null +++ b/toolchain/gcc/patches-11.x/700-RISCV-Inline-subword-atomic-ops.patch @@ -0,0 +1,2021 @@ +From f797260adaf52bee0ec0e16190bbefbe1bfc3692 Mon Sep 17 00:00:00 2001 +From: Patrick O'Neill +Date: Tue, 18 Apr 2023 14:33:13 -0700 +Subject: [PATCH] RISCV: Inline subword atomic ops + +RISC-V has no support for subword atomic operations; code currently +generates libatomic library calls. + +This patch changes the default behavior to inline subword atomic calls +(using the same logic as the existing library call). +Behavior can be specified using the -minline-atomics and +-mno-inline-atomics command line flags. + +gcc/libgcc/config/riscv/atomic.c has the same logic implemented in asm. +This will need to stay for backwards compatibility and the +-mno-inline-atomics flag. + +2023-04-18 Patrick O'Neill + +gcc/ChangeLog: + PR target/104338 + * config/riscv/riscv-protos.h: Add helper function stubs. + * config/riscv/riscv.cc: Add helper functions for subword masking. + * config/riscv/riscv.opt: Add command-line flag. + * config/riscv/sync.md: Add masking logic and inline asm for fetch_and_op, + fetch_and_nand, CAS, and exchange ops. + * doc/invoke.texi: Add blurb regarding command-line flag. + +libgcc/ChangeLog: + PR target/104338 + * config/riscv/atomic.c: Add reference to duplicate logic. + +gcc/testsuite/ChangeLog: + PR target/104338 + * gcc.target/riscv/inline-atomics-1.c: New test. + * gcc.target/riscv/inline-atomics-2.c: New test. + * gcc.target/riscv/inline-atomics-3.c: New test. + * gcc.target/riscv/inline-atomics-4.c: New test. + * gcc.target/riscv/inline-atomics-5.c: New test. + * gcc.target/riscv/inline-atomics-6.c: New test. + * gcc.target/riscv/inline-atomics-7.c: New test. + * gcc.target/riscv/inline-atomics-8.c: New test. + +Signed-off-by: Patrick O'Neill +Signed-off-by: Palmer Dabbelt +--- + gcc/config/riscv/riscv-protos.h | 2 + + gcc/config/riscv/riscv.cc | 49 ++ + gcc/config/riscv/riscv.opt | 4 + + gcc/config/riscv/sync.md | 301 +++++++++ + gcc/doc/invoke.texi | 10 +- + .../gcc.target/riscv/inline-atomics-1.c | 18 + + .../gcc.target/riscv/inline-atomics-2.c | 9 + + .../gcc.target/riscv/inline-atomics-3.c | 569 ++++++++++++++++++ + .../gcc.target/riscv/inline-atomics-4.c | 566 +++++++++++++++++ + .../gcc.target/riscv/inline-atomics-5.c | 87 +++ + .../gcc.target/riscv/inline-atomics-6.c | 87 +++ + .../gcc.target/riscv/inline-atomics-7.c | 69 +++ + .../gcc.target/riscv/inline-atomics-8.c | 69 +++ + libgcc/config/riscv/atomic.c | 2 + + 14 files changed, 1841 insertions(+), 1 deletion(-) + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-1.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-2.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-3.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-4.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-5.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-6.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-7.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-8.c + +--- a/gcc/config/riscv/riscv-protos.h ++++ b/gcc/config/riscv/riscv-protos.h +@@ -74,6 +74,8 @@ extern bool riscv_expand_block_move (rtx + extern bool riscv_store_data_bypass_p (rtx_insn *, rtx_insn *); + extern rtx riscv_gen_gpr_save_insn (struct riscv_frame_info *); + extern bool riscv_gpr_save_operation_p (rtx); ++extern void riscv_subword_address (rtx, rtx *, rtx *, rtx *, rtx *); ++extern void riscv_lshift_subword (machine_mode, rtx, rtx, rtx *); + + /* Routines implemented in riscv-c.c. */ + void riscv_cpu_cpp_builtins (cpp_reader *); +--- a/gcc/config/riscv/riscv.c ++++ b/gcc/config/riscv/riscv.c +@@ -5351,6 +5351,55 @@ riscv_asan_shadow_offset (void) + return TARGET_64BIT ? (HOST_WIDE_INT_1 << 29) : 0; + } + ++/* Given memory reference MEM, expand code to compute the aligned ++ memory address, shift and mask values and store them into ++ *ALIGNED_MEM, *SHIFT, *MASK and *NOT_MASK. */ ++ ++void ++riscv_subword_address (rtx mem, rtx *aligned_mem, rtx *shift, rtx *mask, ++ rtx *not_mask) ++{ ++ /* Align the memory address to a word. */ ++ rtx addr = force_reg (Pmode, XEXP (mem, 0)); ++ ++ rtx addr_mask = gen_int_mode (-4, Pmode); ++ ++ rtx aligned_addr = gen_reg_rtx (Pmode); ++ emit_move_insn (aligned_addr, gen_rtx_AND (Pmode, addr, addr_mask)); ++ ++ *aligned_mem = change_address (mem, SImode, aligned_addr); ++ ++ /* Calculate the shift amount. */ ++ emit_move_insn (*shift, gen_rtx_AND (SImode, gen_lowpart (SImode, addr), ++ gen_int_mode (3, SImode))); ++ emit_move_insn (*shift, gen_rtx_ASHIFT (SImode, *shift, ++ gen_int_mode (3, SImode))); ++ ++ /* Calculate the mask. */ ++ int unshifted_mask = GET_MODE_MASK (GET_MODE (mem)); ++ ++ emit_move_insn (*mask, gen_int_mode (unshifted_mask, SImode)); ++ ++ emit_move_insn (*mask, gen_rtx_ASHIFT (SImode, *mask, ++ gen_lowpart (QImode, *shift))); ++ ++ emit_move_insn (*not_mask, gen_rtx_NOT(SImode, *mask)); ++} ++ ++/* Leftshift a subword within an SImode register. */ ++ ++void ++riscv_lshift_subword (machine_mode mode, rtx value, rtx shift, ++ rtx *shifted_value) ++{ ++ rtx value_reg = gen_reg_rtx (SImode); ++ emit_move_insn (value_reg, simplify_gen_subreg (SImode, value, ++ mode, 0)); ++ ++ emit_move_insn(*shifted_value, gen_rtx_ASHIFT (SImode, value_reg, ++ gen_lowpart (QImode, shift))); ++} ++ + /* Initialize the GCC target structure. */ + #undef TARGET_ASM_ALIGNED_HI_OP + #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t" +--- a/gcc/config/riscv/riscv.opt ++++ b/gcc/config/riscv/riscv.opt +@@ -195,6 +195,10 @@ long riscv_stack_protector_guard_offset + TargetVariable + int riscv_zi_subext + ++minline-atomics ++Target Var(TARGET_INLINE_SUBWORD_ATOMIC) Init(1) ++Always inline subword atomic operations. ++ + Enum + Name(isa_spec_class) Type(enum riscv_isa_spec_class) + Supported ISA specs (for use with the -misa-spec= option): +--- a/gcc/config/riscv/sync.md ++++ b/gcc/config/riscv/sync.md +@@ -21,8 +21,11 @@ + + (define_c_enum "unspec" [ + UNSPEC_COMPARE_AND_SWAP ++ UNSPEC_COMPARE_AND_SWAP_SUBWORD + UNSPEC_SYNC_OLD_OP ++ UNSPEC_SYNC_OLD_OP_SUBWORD + UNSPEC_SYNC_EXCHANGE ++ UNSPEC_SYNC_EXCHANGE_SUBWORD + UNSPEC_ATOMIC_STORE + UNSPEC_MEMORY_BARRIER + ]) +@@ -92,6 +95,135 @@ + "%F3amo.%A3 %0,%z2,%1" + [(set (attr "length") (const_int 8))]) + ++(define_insn "subword_atomic_fetch_strong_" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI ++ [(any_atomic:SI (match_dup 1) ++ (match_operand:SI 2 "register_operand" "rI")) ;; value for op ++ (match_operand:SI 3 "register_operand" "rI")] ;; mask ++ UNSPEC_SYNC_OLD_OP_SUBWORD)) ++ (match_operand:SI 4 "register_operand" "rI") ;; not_mask ++ (clobber (match_scratch:SI 5 "=&r")) ;; tmp_1 ++ (clobber (match_scratch:SI 6 "=&r"))] ;; tmp_2 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "\t%5, %0, %2\;" ++ "and\t%5, %5, %3\;" ++ "and\t%6, %0, %4\;" ++ "or\t%6, %6, %5\;" ++ "sc.w.rl\t%5, %6, %1\;" ++ "bnez\t%5, 1b"; ++ } ++ [(set (attr "length") (const_int 28))]) ++ ++(define_expand "atomic_fetch_nand" ++ [(match_operand:SHORT 0 "register_operand") ;; old value at mem ++ (not:SHORT (and:SHORT (match_operand:SHORT 1 "memory_operand") ;; mem location ++ (match_operand:SHORT 2 "reg_or_0_operand"))) ;; value for op ++ (match_operand:SI 3 "const_int_operand")] ;; model ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ /* We have no QImode/HImode atomics, so form a mask, then use ++ subword_atomic_fetch_strong_nand to implement a LR/SC version of the ++ operation. */ ++ ++ /* Logic duplicated in gcc/libgcc/config/riscv/atomic.c for use when inlining ++ is disabled */ ++ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx value = operands[2]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx shifted_value = gen_reg_rtx (SImode); ++ riscv_lshift_subword (mode, value, shift, &shifted_value); ++ ++ emit_insn (gen_subword_atomic_fetch_strong_nand (old, aligned_mem, ++ shifted_value, ++ mask, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ ++ DONE; ++}) ++ ++(define_insn "subword_atomic_fetch_strong_nand" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI ++ [(not:SI (and:SI (match_dup 1) ++ (match_operand:SI 2 "register_operand" "rI"))) ;; value for op ++ (match_operand:SI 3 "register_operand" "rI")] ;; mask ++ UNSPEC_SYNC_OLD_OP_SUBWORD)) ++ (match_operand:SI 4 "register_operand" "rI") ;; not_mask ++ (clobber (match_scratch:SI 5 "=&r")) ;; tmp_1 ++ (clobber (match_scratch:SI 6 "=&r"))] ;; tmp_2 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "and\t%5, %0, %2\;" ++ "not\t%5, %5\;" ++ "and\t%5, %5, %3\;" ++ "and\t%6, %0, %4\;" ++ "or\t%6, %6, %5\;" ++ "sc.w.rl\t%5, %6, %1\;" ++ "bnez\t%5, 1b"; ++ } ++ [(set (attr "length") (const_int 32))]) ++ ++(define_expand "atomic_fetch_" ++ [(match_operand:SHORT 0 "register_operand") ;; old value at mem ++ (any_atomic:SHORT (match_operand:SHORT 1 "memory_operand") ;; mem location ++ (match_operand:SHORT 2 "reg_or_0_operand")) ;; value for op ++ (match_operand:SI 3 "const_int_operand")] ;; model ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ /* We have no QImode/HImode atomics, so form a mask, then use ++ subword_atomic_fetch_strong_ to implement a LR/SC version of the ++ operation. */ ++ ++ /* Logic duplicated in gcc/libgcc/config/riscv/atomic.c for use when inlining ++ is disabled */ ++ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx value = operands[2]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx shifted_value = gen_reg_rtx (SImode); ++ riscv_lshift_subword (mode, value, shift, &shifted_value); ++ ++ emit_insn (gen_subword_atomic_fetch_strong_ (old, aligned_mem, ++ shifted_value, ++ mask, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ ++ DONE; ++}) ++ + (define_insn "atomic_exchange" + [(set (match_operand:GPR 0 "register_operand" "=&r") + (unspec_volatile:GPR +@@ -104,6 +236,56 @@ + "%F3amoswap.%A3 %0,%z2,%1" + [(set (attr "length") (const_int 8))]) + ++(define_expand "atomic_exchange" ++ [(match_operand:SHORT 0 "register_operand") ;; old value at mem ++ (match_operand:SHORT 1 "memory_operand") ;; mem location ++ (match_operand:SHORT 2 "register_operand") ;; value ++ (match_operand:SI 3 "const_int_operand")] ;; model ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx value = operands[2]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx shifted_value = gen_reg_rtx (SImode); ++ riscv_lshift_subword (mode, value, shift, &shifted_value); ++ ++ emit_insn (gen_subword_atomic_exchange_strong (old, aligned_mem, ++ shifted_value, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ DONE; ++}) ++ ++(define_insn "subword_atomic_exchange_strong" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI ++ [(match_operand:SI 2 "reg_or_0_operand" "rI") ;; value ++ (match_operand:SI 3 "reg_or_0_operand" "rI")] ;; not_mask ++ UNSPEC_SYNC_EXCHANGE_SUBWORD)) ++ (clobber (match_scratch:SI 4 "=&r"))] ;; tmp_1 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "and\t%4, %0, %3\;" ++ "or\t%4, %4, %2\;" ++ "sc.w.rl\t%4, %4, %1\;" ++ "bnez\t%4, 1b"; ++ } ++ [(set (attr "length") (const_int 20))]) ++ + (define_insn "atomic_cas_value_strong" + [(set (match_operand:GPR 0 "register_operand" "=&r") + (match_operand:GPR 1 "memory_operand" "+A")) +@@ -152,6 +334,125 @@ + DONE; + }) + ++(define_expand "atomic_compare_and_swap" ++ [(match_operand:SI 0 "register_operand") ;; bool output ++ (match_operand:SHORT 1 "register_operand") ;; val output ++ (match_operand:SHORT 2 "memory_operand") ;; memory ++ (match_operand:SHORT 3 "reg_or_0_operand") ;; expected value ++ (match_operand:SHORT 4 "reg_or_0_operand") ;; desired value ++ (match_operand:SI 5 "const_int_operand") ;; is_weak ++ (match_operand:SI 6 "const_int_operand") ;; mod_s ++ (match_operand:SI 7 "const_int_operand")] ;; mod_f ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ emit_insn (gen_atomic_cas_value_strong (operands[1], operands[2], ++ operands[3], operands[4], ++ operands[6], operands[7])); ++ ++ rtx val = gen_reg_rtx (SImode); ++ if (operands[1] != const0_rtx) ++ emit_move_insn (val, gen_rtx_SIGN_EXTEND (SImode, operands[1])); ++ else ++ emit_move_insn (val, const0_rtx); ++ ++ rtx exp = gen_reg_rtx (SImode); ++ if (operands[3] != const0_rtx) ++ emit_move_insn (exp, gen_rtx_SIGN_EXTEND (SImode, operands[3])); ++ else ++ emit_move_insn (exp, const0_rtx); ++ ++ rtx compare = val; ++ if (exp != const0_rtx) ++ { ++ rtx difference = gen_rtx_MINUS (SImode, val, exp); ++ compare = gen_reg_rtx (SImode); ++ emit_move_insn (compare, difference); ++ } ++ ++ if (word_mode != SImode) ++ { ++ rtx reg = gen_reg_rtx (word_mode); ++ emit_move_insn (reg, gen_rtx_SIGN_EXTEND (word_mode, compare)); ++ compare = reg; ++ } ++ ++ emit_move_insn (operands[0], gen_rtx_EQ (SImode, compare, const0_rtx)); ++ DONE; ++}) ++ ++(define_expand "atomic_cas_value_strong" ++ [(match_operand:SHORT 0 "register_operand") ;; val output ++ (match_operand:SHORT 1 "memory_operand") ;; memory ++ (match_operand:SHORT 2 "reg_or_0_operand") ;; expected value ++ (match_operand:SHORT 3 "reg_or_0_operand") ;; desired value ++ (match_operand:SI 4 "const_int_operand") ;; mod_s ++ (match_operand:SI 5 "const_int_operand") ;; mod_f ++ (match_scratch:SHORT 6)] ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ /* We have no QImode/HImode atomics, so form a mask, then use ++ subword_atomic_cas_strong to implement a LR/SC version of the ++ operation. */ ++ ++ /* Logic duplicated in gcc/libgcc/config/riscv/atomic.c for use when inlining ++ is disabled */ ++ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx o = operands[2]; ++ rtx n = operands[3]; ++ rtx shifted_o = gen_reg_rtx (SImode); ++ rtx shifted_n = gen_reg_rtx (SImode); ++ ++ riscv_lshift_subword (mode, o, shift, &shifted_o); ++ riscv_lshift_subword (mode, n, shift, &shifted_n); ++ ++ emit_move_insn (shifted_o, gen_rtx_AND (SImode, shifted_o, mask)); ++ emit_move_insn (shifted_n, gen_rtx_AND (SImode, shifted_n, mask)); ++ ++ emit_insn (gen_subword_atomic_cas_strong (old, aligned_mem, ++ shifted_o, shifted_n, ++ mask, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ ++ DONE; ++}) ++ ++(define_insn "subword_atomic_cas_strong" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI [(match_operand:SI 2 "reg_or_0_operand" "rJ") ;; expected value ++ (match_operand:SI 3 "reg_or_0_operand" "rJ")] ;; desired value ++ UNSPEC_COMPARE_AND_SWAP_SUBWORD)) ++ (match_operand:SI 4 "register_operand" "rI") ;; mask ++ (match_operand:SI 5 "register_operand" "rI") ;; not_mask ++ (clobber (match_scratch:SI 6 "=&r"))] ;; tmp_1 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "and\t%6, %0, %4\;" ++ "bne\t%6, %z2, 1f\;" ++ "and\t%6, %0, %5\;" ++ "or\t%6, %6, %3\;" ++ "sc.w.rl\t%6, %6, %1\;" ++ "bnez\t%6, 1b\;" ++ "1:"; ++ } ++ [(set (attr "length") (const_int 28))]) ++ + (define_expand "atomic_test_and_set" + [(match_operand:QI 0 "register_operand" "") ;; bool output + (match_operand:QI 1 "memory_operand" "+A") ;; memory +--- a/gcc/doc/invoke.texi ++++ b/gcc/doc/invoke.texi +@@ -734,7 +734,8 @@ Objective-C and Objective-C++ Dialects}. + -moverride=@var{string} -mverbose-cost-dump @gol + -mstack-protector-guard=@var{guard} -mstack-protector-guard-reg=@var{sysreg} @gol + -mstack-protector-guard-offset=@var{offset} -mtrack-speculation @gol +--moutline-atomics } ++-moutline-atomics ++-minline-atomics -mno-inline-atomics} + + @emph{Adapteva Epiphany Options} + @gccoptlist{-mhalf-reg-file -mprefer-short-insn-regs @gol +@@ -26742,6 +26743,13 @@ Do or don't use smaller but slower prolo + library function calls. The default is to use fast inline prologues and + epilogues. + ++@opindex minline-atomics ++@item -minline-atomics ++@itemx -mno-inline-atomics ++Do or don't use smaller but slower subword atomic emulation code that uses ++libatomic function calls. The default is to use fast inline subword atomics ++that do not require libatomic. ++ + @item -mshorten-memrefs + @itemx -mno-shorten-memrefs + @opindex mshorten-memrefs +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-1.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-options "-mno-inline-atomics" } */ ++/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" "fetch_and_nand" { target *-*-* } 0 } */ ++/* { dg-final { scan-assembler "\tcall\t__sync_fetch_and_add_1" } } */ ++/* { dg-final { scan-assembler "\tcall\t__sync_fetch_and_nand_1" } } */ ++/* { dg-final { scan-assembler "\tcall\t__sync_bool_compare_and_swap_1" } } */ ++ ++char foo; ++char bar; ++char baz; ++ ++int ++main () ++{ ++ __sync_fetch_and_add(&foo, 1); ++ __sync_fetch_and_nand(&bar, 1); ++ __sync_bool_compare_and_swap (&baz, 1, 2); ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-2.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile } */ ++/* Verify that subword atomics do not generate calls. */ ++/* { dg-options "-minline-atomics" } */ ++/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" "fetch_and_nand" { target *-*-* } 0 } */ ++/* { dg-final { scan-assembler-not "\tcall\t__sync_fetch_and_add_1" } } */ ++/* { dg-final { scan-assembler-not "\tcall\t__sync_fetch_and_nand_1" } } */ ++/* { dg-final { scan-assembler-not "\tcall\t__sync_bool_compare_and_swap_1" } } */ ++ ++#include "inline-atomics-1.c" +\ No newline at end of file +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-3.c +@@ -0,0 +1,569 @@ ++/* Check all char alignments. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-op-1.c */ ++/* Test __atomic routines for existence and proper execution on 1 byte ++ values with each valid memory model. */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics -Wno-address-of-packed-member" } */ ++ ++/* Test the execution of the __atomic_*OP builtin routines for a char. */ ++ ++extern void abort(void); ++ ++char count, res; ++const char init = ~0; ++ ++struct A ++{ ++ char a; ++ char b; ++ char c; ++ char d; ++} __attribute__ ((packed)) A; ++ ++/* The fetch_op routines return the original value before the operation. */ ++ ++void ++test_fetch_add (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQUIRE) != 2) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_RELEASE) != 3) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQ_REL) != 4) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_SEQ_CST) != 5) ++ abort (); ++} ++ ++ ++void ++test_fetch_sub (char* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_RELAXED) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_CONSUME) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQUIRE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_RELEASE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQ_REL) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_SEQ_CST) != res--) ++ abort (); ++} ++ ++void ++test_fetch_and (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_fetch_and (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_fetch_nand (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_ACQUIRE) != 0 ) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_xor (char* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_fetch_xor (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_or (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_or (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 2, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 8, __ATOMIC_RELEASE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQ_REL) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_SEQ_CST) != 31) ++ abort (); ++} ++ ++/* The OP_fetch routines return the new value after the operation. */ ++ ++void ++test_add_fetch (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_CONSUME) != 2) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_RELEASE) != 4) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQ_REL) != 5) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_SEQ_CST) != 6) ++ abort (); ++} ++ ++ ++void ++test_sub_fetch (char* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_CONSUME) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQUIRE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_RELEASE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_SEQ_CST) != --res) ++ abort (); ++} ++ ++void ++test_and_fetch (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ *v = init; ++ if (__atomic_and_fetch (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_nand_fetch (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor_fetch (char* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_xor_fetch (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_or_fetch (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_or_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 2, __ATOMIC_CONSUME) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQUIRE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 8, __ATOMIC_RELEASE) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQ_REL) != 31) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_SEQ_CST) != 63) ++ abort (); ++} ++ ++ ++/* Test the OP routines with a result which isn't used. Use both variations ++ within each function. */ ++ ++void ++test_add (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_add_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_CONSUME); ++ if (*v != 2) ++ abort (); ++ ++ __atomic_add_fetch (v, 1 , __ATOMIC_ACQUIRE); ++ if (*v != 3) ++ abort (); ++ ++ __atomic_fetch_add (v, 1, __ATOMIC_RELEASE); ++ if (*v != 4) ++ abort (); ++ ++ __atomic_add_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 5) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 6) ++ abort (); ++} ++ ++ ++void ++test_sub (char* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_CONSUME); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, 1, __ATOMIC_ACQUIRE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, 1, __ATOMIC_RELEASE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_SEQ_CST); ++ if (*v != --res) ++ abort (); ++} ++ ++void ++test_and (char* v) ++{ ++ *v = init; ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_RELAXED); ++ if (*v != 0) ++ abort (); ++ ++ *v = init; ++ __atomic_fetch_and (v, init, __ATOMIC_CONSUME); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, init, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_nand (char* v) ++{ ++ *v = init; ++ ++ __atomic_fetch_nand (v, 0, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, init, __ATOMIC_RELEASE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor (char* v) ++{ ++ *v = init; ++ count = 0; ++ ++ __atomic_xor_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_or (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_or_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_CONSUME); ++ if (*v != 3) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, 4, __ATOMIC_ACQUIRE); ++ if (*v != 7) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, 8, __ATOMIC_RELEASE); ++ if (*v != 15) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 31) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 63) ++ abort (); ++} ++ ++int ++main () ++{ ++ char* V[] = {&A.a, &A.b, &A.c, &A.d}; ++ ++ for (int i = 0; i < 4; i++) { ++ test_fetch_add (V[i]); ++ test_fetch_sub (V[i]); ++ test_fetch_and (V[i]); ++ test_fetch_nand (V[i]); ++ test_fetch_xor (V[i]); ++ test_fetch_or (V[i]); ++ ++ test_add_fetch (V[i]); ++ test_sub_fetch (V[i]); ++ test_and_fetch (V[i]); ++ test_nand_fetch (V[i]); ++ test_xor_fetch (V[i]); ++ test_or_fetch (V[i]); ++ ++ test_add (V[i]); ++ test_sub (V[i]); ++ test_and (V[i]); ++ test_nand (V[i]); ++ test_xor (V[i]); ++ test_or (V[i]); ++ } ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-4.c +@@ -0,0 +1,566 @@ ++/* Check all short alignments. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-op-2.c */ ++/* Test __atomic routines for existence and proper execution on 2 byte ++ values with each valid memory model. */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics -Wno-address-of-packed-member" } */ ++ ++/* Test the execution of the __atomic_*OP builtin routines for a short. */ ++ ++extern void abort(void); ++ ++short count, res; ++const short init = ~0; ++ ++struct A ++{ ++ short a; ++ short b; ++} __attribute__ ((packed)) A; ++ ++/* The fetch_op routines return the original value before the operation. */ ++ ++void ++test_fetch_add (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQUIRE) != 2) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_RELEASE) != 3) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQ_REL) != 4) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_SEQ_CST) != 5) ++ abort (); ++} ++ ++ ++void ++test_fetch_sub (short* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_RELAXED) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_CONSUME) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQUIRE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_RELEASE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQ_REL) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_SEQ_CST) != res--) ++ abort (); ++} ++ ++void ++test_fetch_and (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_fetch_and (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_fetch_nand (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_ACQUIRE) != 0 ) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_xor (short* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_fetch_xor (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_or (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_or (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 2, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 8, __ATOMIC_RELEASE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQ_REL) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_SEQ_CST) != 31) ++ abort (); ++} ++ ++/* The OP_fetch routines return the new value after the operation. */ ++ ++void ++test_add_fetch (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_CONSUME) != 2) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_RELEASE) != 4) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQ_REL) != 5) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_SEQ_CST) != 6) ++ abort (); ++} ++ ++ ++void ++test_sub_fetch (short* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_CONSUME) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQUIRE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_RELEASE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_SEQ_CST) != --res) ++ abort (); ++} ++ ++void ++test_and_fetch (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ *v = init; ++ if (__atomic_and_fetch (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_nand_fetch (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor_fetch (short* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_xor_fetch (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_or_fetch (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_or_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 2, __ATOMIC_CONSUME) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQUIRE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 8, __ATOMIC_RELEASE) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQ_REL) != 31) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_SEQ_CST) != 63) ++ abort (); ++} ++ ++ ++/* Test the OP routines with a result which isn't used. Use both variations ++ within each function. */ ++ ++void ++test_add (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_add_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_CONSUME); ++ if (*v != 2) ++ abort (); ++ ++ __atomic_add_fetch (v, 1 , __ATOMIC_ACQUIRE); ++ if (*v != 3) ++ abort (); ++ ++ __atomic_fetch_add (v, 1, __ATOMIC_RELEASE); ++ if (*v != 4) ++ abort (); ++ ++ __atomic_add_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 5) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 6) ++ abort (); ++} ++ ++ ++void ++test_sub (short* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_CONSUME); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, 1, __ATOMIC_ACQUIRE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, 1, __ATOMIC_RELEASE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_SEQ_CST); ++ if (*v != --res) ++ abort (); ++} ++ ++void ++test_and (short* v) ++{ ++ *v = init; ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_RELAXED); ++ if (*v != 0) ++ abort (); ++ ++ *v = init; ++ __atomic_fetch_and (v, init, __ATOMIC_CONSUME); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, init, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_nand (short* v) ++{ ++ *v = init; ++ ++ __atomic_fetch_nand (v, 0, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, init, __ATOMIC_RELEASE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor (short* v) ++{ ++ *v = init; ++ count = 0; ++ ++ __atomic_xor_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_or (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_or_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_CONSUME); ++ if (*v != 3) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, 4, __ATOMIC_ACQUIRE); ++ if (*v != 7) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, 8, __ATOMIC_RELEASE); ++ if (*v != 15) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 31) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 63) ++ abort (); ++} ++ ++int ++main () { ++ short* V[] = {&A.a, &A.b}; ++ ++ for (int i = 0; i < 2; i++) { ++ test_fetch_add (V[i]); ++ test_fetch_sub (V[i]); ++ test_fetch_and (V[i]); ++ test_fetch_nand (V[i]); ++ test_fetch_xor (V[i]); ++ test_fetch_or (V[i]); ++ ++ test_add_fetch (V[i]); ++ test_sub_fetch (V[i]); ++ test_and_fetch (V[i]); ++ test_nand_fetch (V[i]); ++ test_xor_fetch (V[i]); ++ test_or_fetch (V[i]); ++ ++ test_add (V[i]); ++ test_sub (V[i]); ++ test_and (V[i]); ++ test_nand (V[i]); ++ test_xor (V[i]); ++ test_or (V[i]); ++ } ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-5.c +@@ -0,0 +1,87 @@ ++/* Test __atomic routines for existence and proper execution on 1 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-compare-exchange-1.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_compare_exchange_n builtin for a char. */ ++ ++extern void abort(void); ++ ++char v = 0; ++char expected = 0; ++char max = ~0; ++char desired = ~0; ++char zero = 0; ++ ++#define STRONG 0 ++#define WEAK 1 ++ ++int ++main () ++{ ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, max, STRONG , __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ /* Now test the generic version. */ ++ ++ v = 0; ++ ++ if (!__atomic_compare_exchange (&v, &expected, &max, STRONG, __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-6.c +@@ -0,0 +1,87 @@ ++/* Test __atomic routines for existence and proper execution on 2 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-compare-exchange-2.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_compare_exchange_n builtin for a short. */ ++ ++extern void abort(void); ++ ++short v = 0; ++short expected = 0; ++short max = ~0; ++short desired = ~0; ++short zero = 0; ++ ++#define STRONG 0 ++#define WEAK 1 ++ ++int ++main () ++{ ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, max, STRONG , __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ /* Now test the generic version. */ ++ ++ v = 0; ++ ++ if (!__atomic_compare_exchange (&v, &expected, &max, STRONG, __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-7.c +@@ -0,0 +1,69 @@ ++/* Test __atomic routines for existence and proper execution on 1 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-exchange-1.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_exchange_n builtin for a char. */ ++ ++extern void abort(void); ++ ++char v, count, ret; ++ ++int ++main () ++{ ++ v = 0; ++ count = 0; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELAXED) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQUIRE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELEASE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQ_REL) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_SEQ_CST) != count) ++ abort (); ++ count++; ++ ++ /* Now test the generic version. */ ++ ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELAXED); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQUIRE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELEASE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQ_REL); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_SEQ_CST); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-8.c +@@ -0,0 +1,69 @@ ++/* Test __atomic routines for existence and proper execution on 2 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-exchange-2.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_X builtin for a short. */ ++ ++extern void abort(void); ++ ++short v, count, ret; ++ ++int ++main () ++{ ++ v = 0; ++ count = 0; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELAXED) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQUIRE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELEASE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQ_REL) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_SEQ_CST) != count) ++ abort (); ++ count++; ++ ++ /* Now test the generic version. */ ++ ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELAXED); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQUIRE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELEASE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQ_REL); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_SEQ_CST); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ return 0; ++} +--- a/libgcc/config/riscv/atomic.c ++++ b/libgcc/config/riscv/atomic.c +@@ -30,6 +30,8 @@ see the files COPYING3 and COPYING.RUNTI + #define INVERT "not %[tmp1], %[tmp1]\n\t" + #define DONT_INVERT "" + ++/* Logic duplicated in gcc/gcc/config/riscv/sync.md for use when inlining is enabled */ ++ + #define GENERATE_FETCH_AND_OP(type, size, opname, insn, invert, cop) \ + type __sync_fetch_and_ ## opname ## _ ## size (type *p, type v) \ + { \ diff --git a/toolchain/gcc/patches-11.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch b/toolchain/gcc/patches-11.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch new file mode 100644 index 0000000000..328c7be9ce --- /dev/null +++ b/toolchain/gcc/patches-11.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch @@ -0,0 +1,36 @@ +From 203f3060dd363361b172f7295f42bb6bf5ac0b3b Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +Date: Sat, 23 Apr 2022 15:48:42 +0200 +Subject: [PATCH] riscv/linux: Don't add -latomic with -pthread + +Now that we have support for inline subword atomic operations, it is no +longer necessary to link against libatomic. This also fixes testsuite +failures because the framework does not properly set up the linker flags +for finding libatomic. +The use of atomic operations is also independent of the use of libpthread. + +gcc/ + * config/riscv/linux.h (LIB_SPEC): Don't redefine. +--- + gcc/config/riscv/linux.h | 10 ---------- + 1 file changed, 10 deletions(-) + +--- a/gcc/config/riscv/linux.h ++++ b/gcc/config/riscv/linux.h +@@ -35,16 +35,6 @@ along with GCC; see the file COPYING3. + #undef MUSL_DYNAMIC_LINKER + #define MUSL_DYNAMIC_LINKER "/lib/ld-musl-riscv" XLEN_SPEC MUSL_ABI_SUFFIX ".so.1" + +-/* Because RISC-V only has word-sized atomics, it requries libatomic where +- others do not. So link libatomic by default, as needed. */ +-#undef LIB_SPEC +-#ifdef LD_AS_NEEDED_OPTION +-#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC \ +- " %{pthread:" LD_AS_NEEDED_OPTION " -latomic " LD_NO_AS_NEEDED_OPTION "}" +-#else +-#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC " -latomic " +-#endif +- + #define ICACHE_FLUSH_FUNC "__riscv_flush_icache" + + #define CPP_SPEC "%{pthread:-D_REENTRANT}" diff --git a/toolchain/gcc/patches/10.3.0/810-arm-softfloat-libgcc.patch b/toolchain/gcc/patches-11.x/810-arm-softfloat-libgcc.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/810-arm-softfloat-libgcc.patch rename to toolchain/gcc/patches-11.x/810-arm-softfloat-libgcc.patch diff --git a/toolchain/gcc/patches/11.2.0/820-libgcc_pic.patch b/toolchain/gcc/patches-11.x/820-libgcc_pic.patch similarity index 100% rename from toolchain/gcc/patches/11.2.0/820-libgcc_pic.patch rename to toolchain/gcc/patches-11.x/820-libgcc_pic.patch diff --git a/toolchain/gcc/patches/10.3.0/840-armv4_pass_fix-v4bx_to_ld.patch b/toolchain/gcc/patches-11.x/840-armv4_pass_fix-v4bx_to_ld.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/840-armv4_pass_fix-v4bx_to_ld.patch rename to toolchain/gcc/patches-11.x/840-armv4_pass_fix-v4bx_to_ld.patch diff --git a/toolchain/gcc/patches/10.3.0/850-use_shared_libgcc.patch b/toolchain/gcc/patches-11.x/850-use_shared_libgcc.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/850-use_shared_libgcc.patch rename to toolchain/gcc/patches-11.x/850-use_shared_libgcc.patch diff --git a/toolchain/gcc/patches/10.3.0/851-libgcc_no_compat.patch b/toolchain/gcc/patches-11.x/851-libgcc_no_compat.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/851-libgcc_no_compat.patch rename to toolchain/gcc/patches-11.x/851-libgcc_no_compat.patch diff --git a/toolchain/gcc/patches/10.3.0/870-ppc_no_crtsavres.patch b/toolchain/gcc/patches-11.x/870-ppc_no_crtsavres.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/870-ppc_no_crtsavres.patch rename to toolchain/gcc/patches-11.x/870-ppc_no_crtsavres.patch diff --git a/toolchain/gcc/patches/10.3.0/881-no_tm_section.patch b/toolchain/gcc/patches-11.x/881-no_tm_section.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/881-no_tm_section.patch rename to toolchain/gcc/patches-11.x/881-no_tm_section.patch diff --git a/toolchain/gcc/patches/10.3.0/900-bad-mips16-crt.patch b/toolchain/gcc/patches-11.x/900-bad-mips16-crt.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/900-bad-mips16-crt.patch rename to toolchain/gcc/patches-11.x/900-bad-mips16-crt.patch diff --git a/toolchain/gcc/patches-11.x/910-mbsd_multi.patch b/toolchain/gcc/patches-11.x/910-mbsd_multi.patch new file mode 100644 index 0000000000..2d1c3d1b80 --- /dev/null +++ b/toolchain/gcc/patches-11.x/910-mbsd_multi.patch @@ -0,0 +1,146 @@ +commit 99368862e44740ff4fd33760893f04e14f9dbdf1 +Author: Felix Fietkau +Date: Tue Jul 31 00:52:27 2007 +0000 + + Port the mbsd_multi patch from freewrt, which adds -fhonour-copts. This will emit warnings in packages that don't use our target cflags properly + + SVN-Revision: 8256 + + This patch brings over a feature from MirBSD: + * -fhonour-copts + If this option is not given, it's warned (depending + on environment variables). This is to catch errors + of misbuilt packages which override CFLAGS themselves. + + This patch was authored by Thorsten Glaser + with copyright assignment to the FSF in effect. + +--- a/gcc/c-family/c-opts.c ++++ b/gcc/c-family/c-opts.c +@@ -107,6 +107,9 @@ static dump_flags_t original_dump_flags; + /* Whether any standard preincluded header has been preincluded. */ + static bool done_preinclude; + ++/* Check if a port honours COPTS. */ ++static int honour_copts = 0; ++ + static void handle_OPT_d (const char *); + static void set_std_cxx98 (int); + static void set_std_cxx11 (int); +@@ -469,6 +472,12 @@ c_common_handle_option (size_t scode, co + flag_no_builtin = !value; + break; + ++ case OPT_fhonour_copts: ++ if (c_language == clk_c) { ++ honour_copts++; ++ } ++ break; ++ + case OPT_fconstant_string_class_: + constant_string_class_name = arg; + break; +@@ -1198,6 +1207,47 @@ c_common_init (void) + return false; + } + ++ if (c_language == clk_c) { ++ char *ev = getenv ("GCC_HONOUR_COPTS"); ++ int evv; ++ if (ev == NULL) ++ evv = -1; ++ else if ((*ev == '0') || (*ev == '\0')) ++ evv = 0; ++ else if (*ev == '1') ++ evv = 1; ++ else if (*ev == '2') ++ evv = 2; ++ else if (*ev == 's') ++ evv = -1; ++ else { ++ warning (0, "unknown GCC_HONOUR_COPTS value, assuming 1"); ++ evv = 1; /* maybe depend this on something like MIRBSD_NATIVE? */ ++ } ++ if (evv == 1) { ++ if (honour_copts == 0) { ++ error ("someone does not honour COPTS at all in lenient mode"); ++ return false; ++ } else if (honour_copts != 1) { ++ warning (0, "someone does not honour COPTS correctly, passed %d times", ++ honour_copts); ++ } ++ } else if (evv == 2) { ++ if (honour_copts == 0) { ++ error ("someone does not honour COPTS at all in strict mode"); ++ return false; ++ } else if (honour_copts != 1) { ++ error ("someone does not honour COPTS correctly, passed %d times", ++ honour_copts); ++ return false; ++ } ++ } else if (evv == 0) { ++ if (honour_copts != 1) ++ inform (UNKNOWN_LOCATION, "someone does not honour COPTS correctly, passed %d times", ++ honour_copts); ++ } ++ } ++ + return true; + } + +--- a/gcc/c-family/c.opt ++++ b/gcc/c-family/c.opt +@@ -1663,6 +1663,9 @@ C++ ObjC++ Optimization Alias(fexception + fhonor-std + C++ ObjC++ WarnRemoved + ++fhonour-copts ++C ObjC C++ ObjC++ RejectNegative ++ + fhosted + C ObjC + Assume normal C execution environment. +--- a/gcc/common.opt ++++ b/gcc/common.opt +@@ -1698,6 +1698,9 @@ fguess-branch-probability + Common Var(flag_guess_branch_prob) Optimization + Enable guessing of branch probabilities. + ++fhonour-copts ++Common RejectNegative ++ + ; Nonzero means ignore `#ident' directives. 0 means handle them. + ; Generate position-independent code for executables if possible + ; On SVR4 targets, it also controls whether or not to emit a +--- a/gcc/doc/invoke.texi ++++ b/gcc/doc/invoke.texi +@@ -9059,6 +9059,17 @@ This option is only supported for C and + @option{-Wall} and by @option{-Wpedantic}, which can be disabled with + @option{-Wno-pointer-sign}. + ++@item -fhonour-copts ++@opindex fhonour-copts ++If @env{GCC_HONOUR_COPTS} is set to 1, abort if this option is not ++given at least once, and warn if it is given more than once. ++If @env{GCC_HONOUR_COPTS} is set to 2, abort if this option is not ++given exactly once. ++If @env{GCC_HONOUR_COPTS} is set to 0 or unset, warn if this option ++is not given exactly once. ++The warning is quelled if @env{GCC_HONOUR_COPTS} is set to @samp{s}. ++This flag and environment variable only affect the C language. ++ + @item -Wstack-protector + @opindex Wstack-protector + @opindex Wno-stack-protector +--- a/gcc/opts.c ++++ b/gcc/opts.c +@@ -2448,6 +2448,9 @@ common_handle_option (struct gcc_options + /* Currently handled in a prescan. */ + break; + ++ case OPT_fhonour_copts: ++ break; ++ + case OPT_Werror: + dc->warning_as_error_requested = value; + break; diff --git a/toolchain/gcc/patches-11.x/920-specs_nonfatal_getenv.patch b/toolchain/gcc/patches-11.x/920-specs_nonfatal_getenv.patch new file mode 100644 index 0000000000..83bcb25a80 --- /dev/null +++ b/toolchain/gcc/patches-11.x/920-specs_nonfatal_getenv.patch @@ -0,0 +1,22 @@ +Author: Jo-Philipp Wich +Date: Sat Apr 21 03:02:39 2012 +0000 + + gcc: add patch to make the getenv() spec function nonfatal if requested environment variable is unset + + SVN-Revision: 31390 + +--- a/gcc/gcc.c ++++ b/gcc/gcc.c +@@ -10106,8 +10106,10 @@ getenv_spec_function (int argc, const ch + } + + if (!value) +- fatal_error (input_location, +- "environment variable %qs not defined", varname); ++ { ++ warning (input_location, "environment variable %qs not defined", varname); ++ value = ""; ++ } + + /* We have to escape every character of the environment variable so + they are not interpreted as active spec characters. A diff --git a/toolchain/gcc/patches/10.3.0/931-libffi-fix-MIPS-softfloat-build-issue.patch b/toolchain/gcc/patches-11.x/931-libffi-fix-MIPS-softfloat-build-issue.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/931-libffi-fix-MIPS-softfloat-build-issue.patch rename to toolchain/gcc/patches-11.x/931-libffi-fix-MIPS-softfloat-build-issue.patch diff --git a/toolchain/gcc/patches/10.3.0/960-gotools-fix-compilation-when-making-cross-compiler.patch b/toolchain/gcc/patches-11.x/960-gotools-fix-compilation-when-making-cross-compiler.patch similarity index 100% rename from toolchain/gcc/patches/10.3.0/960-gotools-fix-compilation-when-making-cross-compiler.patch rename to toolchain/gcc/patches-11.x/960-gotools-fix-compilation-when-making-cross-compiler.patch diff --git a/toolchain/gcc/patches/11.2.0/970-macos_arm64-building-fix.patch b/toolchain/gcc/patches-11.x/970-macos_arm64-building-fix.patch similarity index 100% rename from toolchain/gcc/patches/11.2.0/970-macos_arm64-building-fix.patch rename to toolchain/gcc/patches-11.x/970-macos_arm64-building-fix.patch diff --git a/toolchain/gcc/patches/11.2.0/002-case_insensitive.patch b/toolchain/gcc/patches-12.x/002-case_insensitive.patch similarity index 100% rename from toolchain/gcc/patches/11.2.0/002-case_insensitive.patch rename to toolchain/gcc/patches-12.x/002-case_insensitive.patch diff --git a/toolchain/gcc/patches-12.x/010-documentation.patch b/toolchain/gcc/patches-12.x/010-documentation.patch new file mode 100644 index 0000000000..39ee48ed67 --- /dev/null +++ b/toolchain/gcc/patches-12.x/010-documentation.patch @@ -0,0 +1,35 @@ +commit 098bd91f5eae625c7d2ee621e10930fc4434e5e2 +Author: Luka Perkov +Date: Tue Feb 26 16:16:33 2013 +0000 + + gcc: don't build documentation + + This closes #13039. + + Signed-off-by: Luka Perkov + + SVN-Revision: 35807 + +--- a/gcc/Makefile.in ++++ b/gcc/Makefile.in +@@ -3366,18 +3366,10 @@ doc/gcc.info: $(TEXI_GCC_FILES) + doc/gccint.info: $(TEXI_GCCINT_FILES) + doc/cppinternals.info: $(TEXI_CPPINT_FILES) + +-doc/%.info: %.texi +- if [ x$(BUILD_INFO) = xinfo ]; then \ +- $(MAKEINFO) $(MAKEINFOFLAGS) -I . -I $(gcc_docdir) \ +- -I $(gcc_docdir)/include -o $@ $<; \ +- fi ++doc/%.info: + + # Duplicate entry to handle renaming of gccinstall.info +-doc/gccinstall.info: $(TEXI_GCCINSTALL_FILES) +- if [ x$(BUILD_INFO) = xinfo ]; then \ +- $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ +- -I $(gcc_docdir)/include -o $@ $<; \ +- fi ++doc/gccinstall.info: + + doc/cpp.dvi: $(TEXI_CPP_FILES) + doc/gcc.dvi: $(TEXI_GCC_FILES) diff --git a/toolchain/gcc/patches-12.x/110-Fix-MIPS-PR-84790.patch b/toolchain/gcc/patches-12.x/110-Fix-MIPS-PR-84790.patch new file mode 100644 index 0000000000..856fd6a46c --- /dev/null +++ b/toolchain/gcc/patches-12.x/110-Fix-MIPS-PR-84790.patch @@ -0,0 +1,20 @@ +Fix https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84790. +MIPS16 functions have a static assembler prologue which clobbers +registers v0 and v1. Add these register clobbers to function call +instructions. + +--- a/gcc/config/mips/mips.cc ++++ b/gcc/config/mips/mips.cc +@@ -3134,6 +3134,12 @@ mips_emit_call_insn (rtx pattern, rtx or + emit_insn (gen_update_got_version ()); + } + ++ if (TARGET_MIPS16 && TARGET_USE_GOT) ++ { ++ clobber_reg (&CALL_INSN_FUNCTION_USAGE (insn), MIPS16_PIC_TEMP); ++ clobber_reg (&CALL_INSN_FUNCTION_USAGE (insn), MIPS_PROLOGUE_TEMP (word_mode)); ++ } ++ + if (TARGET_MIPS16 + && TARGET_EXPLICIT_RELOCS + && TARGET_CALL_CLOBBERED_GP) diff --git a/toolchain/gcc/patches-12.x/230-musl_libssp.patch b/toolchain/gcc/patches-12.x/230-musl_libssp.patch new file mode 100644 index 0000000000..a909d63875 --- /dev/null +++ b/toolchain/gcc/patches-12.x/230-musl_libssp.patch @@ -0,0 +1,13 @@ +--- a/gcc/gcc.cc ++++ b/gcc/gcc.cc +@@ -987,7 +987,9 @@ proper position among the other output f + #endif + + #ifndef LINK_SSP_SPEC +-#ifdef TARGET_LIBC_PROVIDES_SSP ++#if DEFAULT_LIBC == LIBC_MUSL ++#define LINK_SSP_SPEC "-lssp_nonshared" ++#elif defined(TARGET_LIBC_PROVIDES_SSP) + #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \ + "|fstack-protector-strong|fstack-protector-explicit:}" + #else diff --git a/toolchain/gcc/patches-12.x/300-mips_Os_cpu_rtx_cost_model.patch b/toolchain/gcc/patches-12.x/300-mips_Os_cpu_rtx_cost_model.patch new file mode 100644 index 0000000000..1d223f2a0f --- /dev/null +++ b/toolchain/gcc/patches-12.x/300-mips_Os_cpu_rtx_cost_model.patch @@ -0,0 +1,21 @@ +commit ecf7671b769fe96f7b5134be442089f8bdba55d2 +Author: Felix Fietkau +Date: Thu Aug 4 20:29:45 2016 +0200 + +gcc: add a patch to generate better code with Os on mips + +Also happens to reduce compressed code size a bit + +Signed-off-by: Felix Fietkau + +--- a/gcc/config/mips/mips.cc ++++ b/gcc/config/mips/mips.cc +@@ -20216,7 +20216,7 @@ mips_option_override (void) + flag_pcc_struct_return = 0; + + /* Decide which rtx_costs structure to use. */ +- if (optimize_size) ++ if (0 && optimize_size) + mips_cost = &mips_rtx_cost_optimize_size; + else + mips_cost = &mips_rtx_cost_data[mips_tune]; diff --git a/toolchain/gcc/patches-12.x/700-RISCV-Inline-subword-atomic-ops.patch b/toolchain/gcc/patches-12.x/700-RISCV-Inline-subword-atomic-ops.patch new file mode 100644 index 0000000000..b164c76522 --- /dev/null +++ b/toolchain/gcc/patches-12.x/700-RISCV-Inline-subword-atomic-ops.patch @@ -0,0 +1,2021 @@ +From f797260adaf52bee0ec0e16190bbefbe1bfc3692 Mon Sep 17 00:00:00 2001 +From: Patrick O'Neill +Date: Tue, 18 Apr 2023 14:33:13 -0700 +Subject: [PATCH] RISCV: Inline subword atomic ops + +RISC-V has no support for subword atomic operations; code currently +generates libatomic library calls. + +This patch changes the default behavior to inline subword atomic calls +(using the same logic as the existing library call). +Behavior can be specified using the -minline-atomics and +-mno-inline-atomics command line flags. + +gcc/libgcc/config/riscv/atomic.c has the same logic implemented in asm. +This will need to stay for backwards compatibility and the +-mno-inline-atomics flag. + +2023-04-18 Patrick O'Neill + +gcc/ChangeLog: + PR target/104338 + * config/riscv/riscv-protos.h: Add helper function stubs. + * config/riscv/riscv.cc: Add helper functions for subword masking. + * config/riscv/riscv.opt: Add command-line flag. + * config/riscv/sync.md: Add masking logic and inline asm for fetch_and_op, + fetch_and_nand, CAS, and exchange ops. + * doc/invoke.texi: Add blurb regarding command-line flag. + +libgcc/ChangeLog: + PR target/104338 + * config/riscv/atomic.c: Add reference to duplicate logic. + +gcc/testsuite/ChangeLog: + PR target/104338 + * gcc.target/riscv/inline-atomics-1.c: New test. + * gcc.target/riscv/inline-atomics-2.c: New test. + * gcc.target/riscv/inline-atomics-3.c: New test. + * gcc.target/riscv/inline-atomics-4.c: New test. + * gcc.target/riscv/inline-atomics-5.c: New test. + * gcc.target/riscv/inline-atomics-6.c: New test. + * gcc.target/riscv/inline-atomics-7.c: New test. + * gcc.target/riscv/inline-atomics-8.c: New test. + +Signed-off-by: Patrick O'Neill +Signed-off-by: Palmer Dabbelt +--- + gcc/config/riscv/riscv-protos.h | 2 + + gcc/config/riscv/riscv.cc | 49 ++ + gcc/config/riscv/riscv.opt | 4 + + gcc/config/riscv/sync.md | 301 +++++++++ + gcc/doc/invoke.texi | 10 +- + .../gcc.target/riscv/inline-atomics-1.c | 18 + + .../gcc.target/riscv/inline-atomics-2.c | 9 + + .../gcc.target/riscv/inline-atomics-3.c | 569 ++++++++++++++++++ + .../gcc.target/riscv/inline-atomics-4.c | 566 +++++++++++++++++ + .../gcc.target/riscv/inline-atomics-5.c | 87 +++ + .../gcc.target/riscv/inline-atomics-6.c | 87 +++ + .../gcc.target/riscv/inline-atomics-7.c | 69 +++ + .../gcc.target/riscv/inline-atomics-8.c | 69 +++ + libgcc/config/riscv/atomic.c | 2 + + 14 files changed, 1841 insertions(+), 1 deletion(-) + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-1.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-2.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-3.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-4.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-5.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-6.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-7.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-8.c + +--- a/gcc/config/riscv/riscv-protos.h ++++ b/gcc/config/riscv/riscv-protos.h +@@ -74,6 +74,8 @@ extern bool riscv_expand_block_move (rtx + extern bool riscv_store_data_bypass_p (rtx_insn *, rtx_insn *); + extern rtx riscv_gen_gpr_save_insn (struct riscv_frame_info *); + extern bool riscv_gpr_save_operation_p (rtx); ++extern void riscv_subword_address (rtx, rtx *, rtx *, rtx *, rtx *); ++extern void riscv_lshift_subword (machine_mode, rtx, rtx, rtx *); + + /* Routines implemented in riscv-c.cc. */ + void riscv_cpu_cpp_builtins (cpp_reader *); +--- a/gcc/config/riscv/riscv.cc ++++ b/gcc/config/riscv/riscv.cc +@@ -5605,6 +5605,55 @@ riscv_asan_shadow_offset (void) + return TARGET_64BIT ? (HOST_WIDE_INT_1 << 29) : 0; + } + ++/* Given memory reference MEM, expand code to compute the aligned ++ memory address, shift and mask values and store them into ++ *ALIGNED_MEM, *SHIFT, *MASK and *NOT_MASK. */ ++ ++void ++riscv_subword_address (rtx mem, rtx *aligned_mem, rtx *shift, rtx *mask, ++ rtx *not_mask) ++{ ++ /* Align the memory address to a word. */ ++ rtx addr = force_reg (Pmode, XEXP (mem, 0)); ++ ++ rtx addr_mask = gen_int_mode (-4, Pmode); ++ ++ rtx aligned_addr = gen_reg_rtx (Pmode); ++ emit_move_insn (aligned_addr, gen_rtx_AND (Pmode, addr, addr_mask)); ++ ++ *aligned_mem = change_address (mem, SImode, aligned_addr); ++ ++ /* Calculate the shift amount. */ ++ emit_move_insn (*shift, gen_rtx_AND (SImode, gen_lowpart (SImode, addr), ++ gen_int_mode (3, SImode))); ++ emit_move_insn (*shift, gen_rtx_ASHIFT (SImode, *shift, ++ gen_int_mode (3, SImode))); ++ ++ /* Calculate the mask. */ ++ int unshifted_mask = GET_MODE_MASK (GET_MODE (mem)); ++ ++ emit_move_insn (*mask, gen_int_mode (unshifted_mask, SImode)); ++ ++ emit_move_insn (*mask, gen_rtx_ASHIFT (SImode, *mask, ++ gen_lowpart (QImode, *shift))); ++ ++ emit_move_insn (*not_mask, gen_rtx_NOT(SImode, *mask)); ++} ++ ++/* Leftshift a subword within an SImode register. */ ++ ++void ++riscv_lshift_subword (machine_mode mode, rtx value, rtx shift, ++ rtx *shifted_value) ++{ ++ rtx value_reg = gen_reg_rtx (SImode); ++ emit_move_insn (value_reg, simplify_gen_subreg (SImode, value, ++ mode, 0)); ++ ++ emit_move_insn(*shifted_value, gen_rtx_ASHIFT (SImode, value_reg, ++ gen_lowpart (QImode, shift))); ++} ++ + /* Initialize the GCC target structure. */ + #undef TARGET_ASM_ALIGNED_HI_OP + #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t" +--- a/gcc/config/riscv/riscv.opt ++++ b/gcc/config/riscv/riscv.opt +@@ -209,6 +209,10 @@ int riscv_vector_elen_flags + TargetVariable + int riscv_zvl_flags + ++minline-atomics ++Target Var(TARGET_INLINE_SUBWORD_ATOMIC) Init(1) ++Always inline subword atomic operations. ++ + Enum + Name(isa_spec_class) Type(enum riscv_isa_spec_class) + Supported ISA specs (for use with the -misa-spec= option): +--- a/gcc/config/riscv/sync.md ++++ b/gcc/config/riscv/sync.md +@@ -21,8 +21,11 @@ + + (define_c_enum "unspec" [ + UNSPEC_COMPARE_AND_SWAP ++ UNSPEC_COMPARE_AND_SWAP_SUBWORD + UNSPEC_SYNC_OLD_OP ++ UNSPEC_SYNC_OLD_OP_SUBWORD + UNSPEC_SYNC_EXCHANGE ++ UNSPEC_SYNC_EXCHANGE_SUBWORD + UNSPEC_ATOMIC_STORE + UNSPEC_MEMORY_BARRIER + ]) +@@ -92,6 +95,135 @@ + "%F3amo.%A3 %0,%z2,%1" + [(set (attr "length") (const_int 8))]) + ++(define_insn "subword_atomic_fetch_strong_" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI ++ [(any_atomic:SI (match_dup 1) ++ (match_operand:SI 2 "register_operand" "rI")) ;; value for op ++ (match_operand:SI 3 "register_operand" "rI")] ;; mask ++ UNSPEC_SYNC_OLD_OP_SUBWORD)) ++ (match_operand:SI 4 "register_operand" "rI") ;; not_mask ++ (clobber (match_scratch:SI 5 "=&r")) ;; tmp_1 ++ (clobber (match_scratch:SI 6 "=&r"))] ;; tmp_2 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "\t%5, %0, %2\;" ++ "and\t%5, %5, %3\;" ++ "and\t%6, %0, %4\;" ++ "or\t%6, %6, %5\;" ++ "sc.w.rl\t%5, %6, %1\;" ++ "bnez\t%5, 1b"; ++ } ++ [(set (attr "length") (const_int 28))]) ++ ++(define_expand "atomic_fetch_nand" ++ [(match_operand:SHORT 0 "register_operand") ;; old value at mem ++ (not:SHORT (and:SHORT (match_operand:SHORT 1 "memory_operand") ;; mem location ++ (match_operand:SHORT 2 "reg_or_0_operand"))) ;; value for op ++ (match_operand:SI 3 "const_int_operand")] ;; model ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ /* We have no QImode/HImode atomics, so form a mask, then use ++ subword_atomic_fetch_strong_nand to implement a LR/SC version of the ++ operation. */ ++ ++ /* Logic duplicated in gcc/libgcc/config/riscv/atomic.c for use when inlining ++ is disabled */ ++ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx value = operands[2]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx shifted_value = gen_reg_rtx (SImode); ++ riscv_lshift_subword (mode, value, shift, &shifted_value); ++ ++ emit_insn (gen_subword_atomic_fetch_strong_nand (old, aligned_mem, ++ shifted_value, ++ mask, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ ++ DONE; ++}) ++ ++(define_insn "subword_atomic_fetch_strong_nand" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI ++ [(not:SI (and:SI (match_dup 1) ++ (match_operand:SI 2 "register_operand" "rI"))) ;; value for op ++ (match_operand:SI 3 "register_operand" "rI")] ;; mask ++ UNSPEC_SYNC_OLD_OP_SUBWORD)) ++ (match_operand:SI 4 "register_operand" "rI") ;; not_mask ++ (clobber (match_scratch:SI 5 "=&r")) ;; tmp_1 ++ (clobber (match_scratch:SI 6 "=&r"))] ;; tmp_2 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "and\t%5, %0, %2\;" ++ "not\t%5, %5\;" ++ "and\t%5, %5, %3\;" ++ "and\t%6, %0, %4\;" ++ "or\t%6, %6, %5\;" ++ "sc.w.rl\t%5, %6, %1\;" ++ "bnez\t%5, 1b"; ++ } ++ [(set (attr "length") (const_int 32))]) ++ ++(define_expand "atomic_fetch_" ++ [(match_operand:SHORT 0 "register_operand") ;; old value at mem ++ (any_atomic:SHORT (match_operand:SHORT 1 "memory_operand") ;; mem location ++ (match_operand:SHORT 2 "reg_or_0_operand")) ;; value for op ++ (match_operand:SI 3 "const_int_operand")] ;; model ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ /* We have no QImode/HImode atomics, so form a mask, then use ++ subword_atomic_fetch_strong_ to implement a LR/SC version of the ++ operation. */ ++ ++ /* Logic duplicated in gcc/libgcc/config/riscv/atomic.c for use when inlining ++ is disabled */ ++ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx value = operands[2]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx shifted_value = gen_reg_rtx (SImode); ++ riscv_lshift_subword (mode, value, shift, &shifted_value); ++ ++ emit_insn (gen_subword_atomic_fetch_strong_ (old, aligned_mem, ++ shifted_value, ++ mask, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ ++ DONE; ++}) ++ + (define_insn "atomic_exchange" + [(set (match_operand:GPR 0 "register_operand" "=&r") + (unspec_volatile:GPR +@@ -104,6 +236,56 @@ + "%F3amoswap.%A3 %0,%z2,%1" + [(set (attr "length") (const_int 8))]) + ++(define_expand "atomic_exchange" ++ [(match_operand:SHORT 0 "register_operand") ;; old value at mem ++ (match_operand:SHORT 1 "memory_operand") ;; mem location ++ (match_operand:SHORT 2 "register_operand") ;; value ++ (match_operand:SI 3 "const_int_operand")] ;; model ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx value = operands[2]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx shifted_value = gen_reg_rtx (SImode); ++ riscv_lshift_subword (mode, value, shift, &shifted_value); ++ ++ emit_insn (gen_subword_atomic_exchange_strong (old, aligned_mem, ++ shifted_value, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ DONE; ++}) ++ ++(define_insn "subword_atomic_exchange_strong" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI ++ [(match_operand:SI 2 "reg_or_0_operand" "rI") ;; value ++ (match_operand:SI 3 "reg_or_0_operand" "rI")] ;; not_mask ++ UNSPEC_SYNC_EXCHANGE_SUBWORD)) ++ (clobber (match_scratch:SI 4 "=&r"))] ;; tmp_1 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "and\t%4, %0, %3\;" ++ "or\t%4, %4, %2\;" ++ "sc.w.rl\t%4, %4, %1\;" ++ "bnez\t%4, 1b"; ++ } ++ [(set (attr "length") (const_int 20))]) ++ + (define_insn "atomic_cas_value_strong" + [(set (match_operand:GPR 0 "register_operand" "=&r") + (match_operand:GPR 1 "memory_operand" "+A")) +@@ -152,6 +334,125 @@ + DONE; + }) + ++(define_expand "atomic_compare_and_swap" ++ [(match_operand:SI 0 "register_operand") ;; bool output ++ (match_operand:SHORT 1 "register_operand") ;; val output ++ (match_operand:SHORT 2 "memory_operand") ;; memory ++ (match_operand:SHORT 3 "reg_or_0_operand") ;; expected value ++ (match_operand:SHORT 4 "reg_or_0_operand") ;; desired value ++ (match_operand:SI 5 "const_int_operand") ;; is_weak ++ (match_operand:SI 6 "const_int_operand") ;; mod_s ++ (match_operand:SI 7 "const_int_operand")] ;; mod_f ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ emit_insn (gen_atomic_cas_value_strong (operands[1], operands[2], ++ operands[3], operands[4], ++ operands[6], operands[7])); ++ ++ rtx val = gen_reg_rtx (SImode); ++ if (operands[1] != const0_rtx) ++ emit_move_insn (val, gen_rtx_SIGN_EXTEND (SImode, operands[1])); ++ else ++ emit_move_insn (val, const0_rtx); ++ ++ rtx exp = gen_reg_rtx (SImode); ++ if (operands[3] != const0_rtx) ++ emit_move_insn (exp, gen_rtx_SIGN_EXTEND (SImode, operands[3])); ++ else ++ emit_move_insn (exp, const0_rtx); ++ ++ rtx compare = val; ++ if (exp != const0_rtx) ++ { ++ rtx difference = gen_rtx_MINUS (SImode, val, exp); ++ compare = gen_reg_rtx (SImode); ++ emit_move_insn (compare, difference); ++ } ++ ++ if (word_mode != SImode) ++ { ++ rtx reg = gen_reg_rtx (word_mode); ++ emit_move_insn (reg, gen_rtx_SIGN_EXTEND (word_mode, compare)); ++ compare = reg; ++ } ++ ++ emit_move_insn (operands[0], gen_rtx_EQ (SImode, compare, const0_rtx)); ++ DONE; ++}) ++ ++(define_expand "atomic_cas_value_strong" ++ [(match_operand:SHORT 0 "register_operand") ;; val output ++ (match_operand:SHORT 1 "memory_operand") ;; memory ++ (match_operand:SHORT 2 "reg_or_0_operand") ;; expected value ++ (match_operand:SHORT 3 "reg_or_0_operand") ;; desired value ++ (match_operand:SI 4 "const_int_operand") ;; mod_s ++ (match_operand:SI 5 "const_int_operand") ;; mod_f ++ (match_scratch:SHORT 6)] ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ /* We have no QImode/HImode atomics, so form a mask, then use ++ subword_atomic_cas_strong to implement a LR/SC version of the ++ operation. */ ++ ++ /* Logic duplicated in gcc/libgcc/config/riscv/atomic.c for use when inlining ++ is disabled */ ++ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx o = operands[2]; ++ rtx n = operands[3]; ++ rtx shifted_o = gen_reg_rtx (SImode); ++ rtx shifted_n = gen_reg_rtx (SImode); ++ ++ riscv_lshift_subword (mode, o, shift, &shifted_o); ++ riscv_lshift_subword (mode, n, shift, &shifted_n); ++ ++ emit_move_insn (shifted_o, gen_rtx_AND (SImode, shifted_o, mask)); ++ emit_move_insn (shifted_n, gen_rtx_AND (SImode, shifted_n, mask)); ++ ++ emit_insn (gen_subword_atomic_cas_strong (old, aligned_mem, ++ shifted_o, shifted_n, ++ mask, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ ++ DONE; ++}) ++ ++(define_insn "subword_atomic_cas_strong" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI [(match_operand:SI 2 "reg_or_0_operand" "rJ") ;; expected value ++ (match_operand:SI 3 "reg_or_0_operand" "rJ")] ;; desired value ++ UNSPEC_COMPARE_AND_SWAP_SUBWORD)) ++ (match_operand:SI 4 "register_operand" "rI") ;; mask ++ (match_operand:SI 5 "register_operand" "rI") ;; not_mask ++ (clobber (match_scratch:SI 6 "=&r"))] ;; tmp_1 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "and\t%6, %0, %4\;" ++ "bne\t%6, %z2, 1f\;" ++ "and\t%6, %0, %5\;" ++ "or\t%6, %6, %3\;" ++ "sc.w.rl\t%6, %6, %1\;" ++ "bnez\t%6, 1b\;" ++ "1:"; ++ } ++ [(set (attr "length") (const_int 28))]) ++ + (define_expand "atomic_test_and_set" + [(match_operand:QI 0 "register_operand" "") ;; bool output + (match_operand:QI 1 "memory_operand" "+A") ;; memory +--- a/gcc/doc/invoke.texi ++++ b/gcc/doc/invoke.texi +@@ -753,7 +753,8 @@ Objective-C and Objective-C++ Dialects}. + -moverride=@var{string} -mverbose-cost-dump @gol + -mstack-protector-guard=@var{guard} -mstack-protector-guard-reg=@var{sysreg} @gol + -mstack-protector-guard-offset=@var{offset} -mtrack-speculation @gol +--moutline-atomics } ++-moutline-atomics ++-minline-atomics -mno-inline-atomics} + + @emph{Adapteva Epiphany Options} + @gccoptlist{-mhalf-reg-file -mprefer-short-insn-regs @gol +@@ -28035,6 +28036,13 @@ Do or don't use smaller but slower prolo + library function calls. The default is to use fast inline prologues and + epilogues. + ++@opindex minline-atomics ++@item -minline-atomics ++@itemx -mno-inline-atomics ++Do or don't use smaller but slower subword atomic emulation code that uses ++libatomic function calls. The default is to use fast inline subword atomics ++that do not require libatomic. ++ + @item -mshorten-memrefs + @itemx -mno-shorten-memrefs + @opindex mshorten-memrefs +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-1.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-options "-mno-inline-atomics" } */ ++/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" "fetch_and_nand" { target *-*-* } 0 } */ ++/* { dg-final { scan-assembler "\tcall\t__sync_fetch_and_add_1" } } */ ++/* { dg-final { scan-assembler "\tcall\t__sync_fetch_and_nand_1" } } */ ++/* { dg-final { scan-assembler "\tcall\t__sync_bool_compare_and_swap_1" } } */ ++ ++char foo; ++char bar; ++char baz; ++ ++int ++main () ++{ ++ __sync_fetch_and_add(&foo, 1); ++ __sync_fetch_and_nand(&bar, 1); ++ __sync_bool_compare_and_swap (&baz, 1, 2); ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-2.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile } */ ++/* Verify that subword atomics do not generate calls. */ ++/* { dg-options "-minline-atomics" } */ ++/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" "fetch_and_nand" { target *-*-* } 0 } */ ++/* { dg-final { scan-assembler-not "\tcall\t__sync_fetch_and_add_1" } } */ ++/* { dg-final { scan-assembler-not "\tcall\t__sync_fetch_and_nand_1" } } */ ++/* { dg-final { scan-assembler-not "\tcall\t__sync_bool_compare_and_swap_1" } } */ ++ ++#include "inline-atomics-1.c" +\ No newline at end of file +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-3.c +@@ -0,0 +1,569 @@ ++/* Check all char alignments. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-op-1.c */ ++/* Test __atomic routines for existence and proper execution on 1 byte ++ values with each valid memory model. */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics -Wno-address-of-packed-member" } */ ++ ++/* Test the execution of the __atomic_*OP builtin routines for a char. */ ++ ++extern void abort(void); ++ ++char count, res; ++const char init = ~0; ++ ++struct A ++{ ++ char a; ++ char b; ++ char c; ++ char d; ++} __attribute__ ((packed)) A; ++ ++/* The fetch_op routines return the original value before the operation. */ ++ ++void ++test_fetch_add (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQUIRE) != 2) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_RELEASE) != 3) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQ_REL) != 4) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_SEQ_CST) != 5) ++ abort (); ++} ++ ++ ++void ++test_fetch_sub (char* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_RELAXED) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_CONSUME) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQUIRE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_RELEASE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQ_REL) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_SEQ_CST) != res--) ++ abort (); ++} ++ ++void ++test_fetch_and (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_fetch_and (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_fetch_nand (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_ACQUIRE) != 0 ) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_xor (char* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_fetch_xor (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_or (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_or (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 2, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 8, __ATOMIC_RELEASE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQ_REL) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_SEQ_CST) != 31) ++ abort (); ++} ++ ++/* The OP_fetch routines return the new value after the operation. */ ++ ++void ++test_add_fetch (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_CONSUME) != 2) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_RELEASE) != 4) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQ_REL) != 5) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_SEQ_CST) != 6) ++ abort (); ++} ++ ++ ++void ++test_sub_fetch (char* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_CONSUME) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQUIRE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_RELEASE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_SEQ_CST) != --res) ++ abort (); ++} ++ ++void ++test_and_fetch (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ *v = init; ++ if (__atomic_and_fetch (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_nand_fetch (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor_fetch (char* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_xor_fetch (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_or_fetch (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_or_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 2, __ATOMIC_CONSUME) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQUIRE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 8, __ATOMIC_RELEASE) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQ_REL) != 31) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_SEQ_CST) != 63) ++ abort (); ++} ++ ++ ++/* Test the OP routines with a result which isn't used. Use both variations ++ within each function. */ ++ ++void ++test_add (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_add_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_CONSUME); ++ if (*v != 2) ++ abort (); ++ ++ __atomic_add_fetch (v, 1 , __ATOMIC_ACQUIRE); ++ if (*v != 3) ++ abort (); ++ ++ __atomic_fetch_add (v, 1, __ATOMIC_RELEASE); ++ if (*v != 4) ++ abort (); ++ ++ __atomic_add_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 5) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 6) ++ abort (); ++} ++ ++ ++void ++test_sub (char* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_CONSUME); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, 1, __ATOMIC_ACQUIRE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, 1, __ATOMIC_RELEASE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_SEQ_CST); ++ if (*v != --res) ++ abort (); ++} ++ ++void ++test_and (char* v) ++{ ++ *v = init; ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_RELAXED); ++ if (*v != 0) ++ abort (); ++ ++ *v = init; ++ __atomic_fetch_and (v, init, __ATOMIC_CONSUME); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, init, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_nand (char* v) ++{ ++ *v = init; ++ ++ __atomic_fetch_nand (v, 0, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, init, __ATOMIC_RELEASE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor (char* v) ++{ ++ *v = init; ++ count = 0; ++ ++ __atomic_xor_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_or (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_or_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_CONSUME); ++ if (*v != 3) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, 4, __ATOMIC_ACQUIRE); ++ if (*v != 7) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, 8, __ATOMIC_RELEASE); ++ if (*v != 15) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 31) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 63) ++ abort (); ++} ++ ++int ++main () ++{ ++ char* V[] = {&A.a, &A.b, &A.c, &A.d}; ++ ++ for (int i = 0; i < 4; i++) { ++ test_fetch_add (V[i]); ++ test_fetch_sub (V[i]); ++ test_fetch_and (V[i]); ++ test_fetch_nand (V[i]); ++ test_fetch_xor (V[i]); ++ test_fetch_or (V[i]); ++ ++ test_add_fetch (V[i]); ++ test_sub_fetch (V[i]); ++ test_and_fetch (V[i]); ++ test_nand_fetch (V[i]); ++ test_xor_fetch (V[i]); ++ test_or_fetch (V[i]); ++ ++ test_add (V[i]); ++ test_sub (V[i]); ++ test_and (V[i]); ++ test_nand (V[i]); ++ test_xor (V[i]); ++ test_or (V[i]); ++ } ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-4.c +@@ -0,0 +1,566 @@ ++/* Check all short alignments. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-op-2.c */ ++/* Test __atomic routines for existence and proper execution on 2 byte ++ values with each valid memory model. */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics -Wno-address-of-packed-member" } */ ++ ++/* Test the execution of the __atomic_*OP builtin routines for a short. */ ++ ++extern void abort(void); ++ ++short count, res; ++const short init = ~0; ++ ++struct A ++{ ++ short a; ++ short b; ++} __attribute__ ((packed)) A; ++ ++/* The fetch_op routines return the original value before the operation. */ ++ ++void ++test_fetch_add (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQUIRE) != 2) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_RELEASE) != 3) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQ_REL) != 4) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_SEQ_CST) != 5) ++ abort (); ++} ++ ++ ++void ++test_fetch_sub (short* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_RELAXED) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_CONSUME) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQUIRE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_RELEASE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQ_REL) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_SEQ_CST) != res--) ++ abort (); ++} ++ ++void ++test_fetch_and (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_fetch_and (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_fetch_nand (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_ACQUIRE) != 0 ) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_xor (short* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_fetch_xor (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_or (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_or (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 2, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 8, __ATOMIC_RELEASE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQ_REL) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_SEQ_CST) != 31) ++ abort (); ++} ++ ++/* The OP_fetch routines return the new value after the operation. */ ++ ++void ++test_add_fetch (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_CONSUME) != 2) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_RELEASE) != 4) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQ_REL) != 5) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_SEQ_CST) != 6) ++ abort (); ++} ++ ++ ++void ++test_sub_fetch (short* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_CONSUME) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQUIRE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_RELEASE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_SEQ_CST) != --res) ++ abort (); ++} ++ ++void ++test_and_fetch (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ *v = init; ++ if (__atomic_and_fetch (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_nand_fetch (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor_fetch (short* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_xor_fetch (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_or_fetch (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_or_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 2, __ATOMIC_CONSUME) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQUIRE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 8, __ATOMIC_RELEASE) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQ_REL) != 31) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_SEQ_CST) != 63) ++ abort (); ++} ++ ++ ++/* Test the OP routines with a result which isn't used. Use both variations ++ within each function. */ ++ ++void ++test_add (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_add_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_CONSUME); ++ if (*v != 2) ++ abort (); ++ ++ __atomic_add_fetch (v, 1 , __ATOMIC_ACQUIRE); ++ if (*v != 3) ++ abort (); ++ ++ __atomic_fetch_add (v, 1, __ATOMIC_RELEASE); ++ if (*v != 4) ++ abort (); ++ ++ __atomic_add_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 5) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 6) ++ abort (); ++} ++ ++ ++void ++test_sub (short* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_CONSUME); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, 1, __ATOMIC_ACQUIRE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, 1, __ATOMIC_RELEASE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_SEQ_CST); ++ if (*v != --res) ++ abort (); ++} ++ ++void ++test_and (short* v) ++{ ++ *v = init; ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_RELAXED); ++ if (*v != 0) ++ abort (); ++ ++ *v = init; ++ __atomic_fetch_and (v, init, __ATOMIC_CONSUME); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, init, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_nand (short* v) ++{ ++ *v = init; ++ ++ __atomic_fetch_nand (v, 0, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, init, __ATOMIC_RELEASE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor (short* v) ++{ ++ *v = init; ++ count = 0; ++ ++ __atomic_xor_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_or (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_or_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_CONSUME); ++ if (*v != 3) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, 4, __ATOMIC_ACQUIRE); ++ if (*v != 7) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, 8, __ATOMIC_RELEASE); ++ if (*v != 15) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 31) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 63) ++ abort (); ++} ++ ++int ++main () { ++ short* V[] = {&A.a, &A.b}; ++ ++ for (int i = 0; i < 2; i++) { ++ test_fetch_add (V[i]); ++ test_fetch_sub (V[i]); ++ test_fetch_and (V[i]); ++ test_fetch_nand (V[i]); ++ test_fetch_xor (V[i]); ++ test_fetch_or (V[i]); ++ ++ test_add_fetch (V[i]); ++ test_sub_fetch (V[i]); ++ test_and_fetch (V[i]); ++ test_nand_fetch (V[i]); ++ test_xor_fetch (V[i]); ++ test_or_fetch (V[i]); ++ ++ test_add (V[i]); ++ test_sub (V[i]); ++ test_and (V[i]); ++ test_nand (V[i]); ++ test_xor (V[i]); ++ test_or (V[i]); ++ } ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-5.c +@@ -0,0 +1,87 @@ ++/* Test __atomic routines for existence and proper execution on 1 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-compare-exchange-1.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_compare_exchange_n builtin for a char. */ ++ ++extern void abort(void); ++ ++char v = 0; ++char expected = 0; ++char max = ~0; ++char desired = ~0; ++char zero = 0; ++ ++#define STRONG 0 ++#define WEAK 1 ++ ++int ++main () ++{ ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, max, STRONG , __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ /* Now test the generic version. */ ++ ++ v = 0; ++ ++ if (!__atomic_compare_exchange (&v, &expected, &max, STRONG, __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-6.c +@@ -0,0 +1,87 @@ ++/* Test __atomic routines for existence and proper execution on 2 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-compare-exchange-2.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_compare_exchange_n builtin for a short. */ ++ ++extern void abort(void); ++ ++short v = 0; ++short expected = 0; ++short max = ~0; ++short desired = ~0; ++short zero = 0; ++ ++#define STRONG 0 ++#define WEAK 1 ++ ++int ++main () ++{ ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, max, STRONG , __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ /* Now test the generic version. */ ++ ++ v = 0; ++ ++ if (!__atomic_compare_exchange (&v, &expected, &max, STRONG, __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-7.c +@@ -0,0 +1,69 @@ ++/* Test __atomic routines for existence and proper execution on 1 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-exchange-1.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_exchange_n builtin for a char. */ ++ ++extern void abort(void); ++ ++char v, count, ret; ++ ++int ++main () ++{ ++ v = 0; ++ count = 0; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELAXED) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQUIRE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELEASE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQ_REL) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_SEQ_CST) != count) ++ abort (); ++ count++; ++ ++ /* Now test the generic version. */ ++ ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELAXED); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQUIRE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELEASE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQ_REL); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_SEQ_CST); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-8.c +@@ -0,0 +1,69 @@ ++/* Test __atomic routines for existence and proper execution on 2 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-exchange-2.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_X builtin for a short. */ ++ ++extern void abort(void); ++ ++short v, count, ret; ++ ++int ++main () ++{ ++ v = 0; ++ count = 0; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELAXED) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQUIRE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELEASE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQ_REL) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_SEQ_CST) != count) ++ abort (); ++ count++; ++ ++ /* Now test the generic version. */ ++ ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELAXED); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQUIRE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELEASE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQ_REL); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_SEQ_CST); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ return 0; ++} +--- a/libgcc/config/riscv/atomic.c ++++ b/libgcc/config/riscv/atomic.c +@@ -30,6 +30,8 @@ see the files COPYING3 and COPYING.RUNTI + #define INVERT "not %[tmp1], %[tmp1]\n\t" + #define DONT_INVERT "" + ++/* Logic duplicated in gcc/gcc/config/riscv/sync.md for use when inlining is enabled */ ++ + #define GENERATE_FETCH_AND_OP(type, size, opname, insn, invert, cop) \ + type __sync_fetch_and_ ## opname ## _ ## size (type *p, type v) \ + { \ diff --git a/toolchain/gcc/patches-12.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch b/toolchain/gcc/patches-12.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch new file mode 100644 index 0000000000..328c7be9ce --- /dev/null +++ b/toolchain/gcc/patches-12.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch @@ -0,0 +1,36 @@ +From 203f3060dd363361b172f7295f42bb6bf5ac0b3b Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +Date: Sat, 23 Apr 2022 15:48:42 +0200 +Subject: [PATCH] riscv/linux: Don't add -latomic with -pthread + +Now that we have support for inline subword atomic operations, it is no +longer necessary to link against libatomic. This also fixes testsuite +failures because the framework does not properly set up the linker flags +for finding libatomic. +The use of atomic operations is also independent of the use of libpthread. + +gcc/ + * config/riscv/linux.h (LIB_SPEC): Don't redefine. +--- + gcc/config/riscv/linux.h | 10 ---------- + 1 file changed, 10 deletions(-) + +--- a/gcc/config/riscv/linux.h ++++ b/gcc/config/riscv/linux.h +@@ -35,16 +35,6 @@ along with GCC; see the file COPYING3. + #undef MUSL_DYNAMIC_LINKER + #define MUSL_DYNAMIC_LINKER "/lib/ld-musl-riscv" XLEN_SPEC MUSL_ABI_SUFFIX ".so.1" + +-/* Because RISC-V only has word-sized atomics, it requries libatomic where +- others do not. So link libatomic by default, as needed. */ +-#undef LIB_SPEC +-#ifdef LD_AS_NEEDED_OPTION +-#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC \ +- " %{pthread:" LD_AS_NEEDED_OPTION " -latomic " LD_NO_AS_NEEDED_OPTION "}" +-#else +-#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC " -latomic " +-#endif +- + #define ICACHE_FLUSH_FUNC "__riscv_flush_icache" + + #define CPP_SPEC "%{pthread:-D_REENTRANT}" diff --git a/toolchain/gcc/patches/11.2.0/810-arm-softfloat-libgcc.patch b/toolchain/gcc/patches-12.x/810-arm-softfloat-libgcc.patch similarity index 100% rename from toolchain/gcc/patches/11.2.0/810-arm-softfloat-libgcc.patch rename to toolchain/gcc/patches-12.x/810-arm-softfloat-libgcc.patch diff --git a/toolchain/gcc/patches-12.x/820-libgcc_pic.patch b/toolchain/gcc/patches-12.x/820-libgcc_pic.patch new file mode 100644 index 0000000000..525a95b565 --- /dev/null +++ b/toolchain/gcc/patches-12.x/820-libgcc_pic.patch @@ -0,0 +1,44 @@ +commit c96312958c0621e72c9b32da5bc224ffe2161384 +Author: Felix Fietkau +Date: Mon Oct 19 23:26:09 2009 +0000 + + gcc: create a proper libgcc_pic.a static library for relinking (4.3.3+ for now, backport will follow) + + SVN-Revision: 18086 + +--- a/libgcc/Makefile.in ++++ b/libgcc/Makefile.in +@@ -930,11 +930,12 @@ $(libgcov-driver-objects): %$(objext): $ + + # Static libraries. + libgcc.a: $(libgcc-objects) ++libgcc_pic.a: $(libgcc-s-objects) + libgcov.a: $(libgcov-objects) + libunwind.a: $(libunwind-objects) + libgcc_eh.a: $(libgcc-eh-objects) + +-libgcc.a libgcov.a libunwind.a libgcc_eh.a: ++libgcc.a libgcov.a libunwind.a libgcc_eh.a libgcc_pic.a: + -rm -f $@ + + objects="$(objects)"; \ +@@ -958,7 +959,7 @@ all: libunwind.a + endif + + ifeq ($(enable_shared),yes) +-all: libgcc_eh.a libgcc_s$(SHLIB_EXT) ++all: libgcc_eh.a libgcc_pic.a libgcc_s$(SHLIB_EXT) + ifneq ($(LIBUNWIND),) + all: libunwind$(SHLIB_EXT) + libgcc_s$(SHLIB_EXT): libunwind$(SHLIB_EXT) +@@ -1164,6 +1165,10 @@ install-shared: + chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_eh.a + $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_eh.a + ++ $(INSTALL_DATA) libgcc_pic.a $(mapfile) $(DESTDIR)$(inst_libdir)/ ++ chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_pic.a ++ $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_pic.a ++ + $(subst @multilib_dir@,$(MULTIDIR),$(subst \ + @shlib_base_name@,libgcc_s,$(subst \ + @shlib_slibdir_qual@,$(MULTIOSSUBDIR),$(SHLIB_INSTALL)))) diff --git a/toolchain/gcc/patches/11.2.0/840-armv4_pass_fix-v4bx_to_ld.patch b/toolchain/gcc/patches-12.x/840-armv4_pass_fix-v4bx_to_ld.patch similarity index 100% rename from toolchain/gcc/patches/11.2.0/840-armv4_pass_fix-v4bx_to_ld.patch rename to toolchain/gcc/patches-12.x/840-armv4_pass_fix-v4bx_to_ld.patch diff --git a/toolchain/gcc/patches-12.x/850-use_shared_libgcc.patch b/toolchain/gcc/patches-12.x/850-use_shared_libgcc.patch new file mode 100644 index 0000000000..7be30f3283 --- /dev/null +++ b/toolchain/gcc/patches-12.x/850-use_shared_libgcc.patch @@ -0,0 +1,54 @@ +commit dcfc40358b5a3cae7320c17f8d1cebd5ad5540cd +Author: Felix Fietkau +Date: Sun Feb 12 20:25:47 2012 +0000 + + gcc 4.6: port over the missing patch 850-use_shared_libgcc.patch to prevent libgcc crap from leaking into every single binary + + SVN-Revision: 30486 +--- a/gcc/config/arm/linux-eabi.h ++++ b/gcc/config/arm/linux-eabi.h +@@ -132,10 +132,6 @@ + "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} " \ + LINUX_OR_ANDROID_LD (GNU_USER_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC) + +-/* Use the default LIBGCC_SPEC, not the version in linux-elf.h, as we +- do not use -lfloat. */ +-#undef LIBGCC_SPEC +- + /* Clear the instruction cache from `beg' to `end'. This is + implemented in lib1funcs.S, so ensure an error if this definition + is used. */ +--- a/gcc/config/linux.h ++++ b/gcc/config/linux.h +@@ -71,6 +71,10 @@ see the files COPYING3 and COPYING.RUNTI + builtin_version ("CRuntime_Musl"); \ + } while (0) + ++#ifndef LIBGCC_SPEC ++#define LIBGCC_SPEC "%{static|static-libgcc:-lgcc}%{!static:%{!static-libgcc:-lgcc_s}}" ++#endif ++ + /* Determine which dynamic linker to use depending on whether GLIBC or + uClibc or Bionic or musl is the default C library and whether + -muclibc or -mglibc or -mbionic or -mmusl has been passed to change +--- a/libgcc/mkmap-symver.awk ++++ b/libgcc/mkmap-symver.awk +@@ -136,5 +136,5 @@ function output(lib) { + else if (inherit[lib]) + printf("} %s;\n", inherit[lib]); + else +- printf ("\n local:\n\t*;\n};\n"); ++ printf ("\n\t*;\n};\n"); + } +--- a/gcc/config/rs6000/linux.h ++++ b/gcc/config/rs6000/linux.h +@@ -67,6 +67,9 @@ + #undef CPP_OS_DEFAULT_SPEC + #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" + ++#undef LIBGCC_SPEC ++#define LIBGCC_SPEC "%{!static:%{!static-libgcc:-lgcc_s}} -lgcc" ++ + #undef LINK_SHLIB_SPEC + #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}} \ + %{static-pie:-static -pie --no-dynamic-linker -z text}" diff --git a/toolchain/gcc/patches/11.2.0/851-libgcc_no_compat.patch b/toolchain/gcc/patches-12.x/851-libgcc_no_compat.patch similarity index 100% rename from toolchain/gcc/patches/11.2.0/851-libgcc_no_compat.patch rename to toolchain/gcc/patches-12.x/851-libgcc_no_compat.patch diff --git a/toolchain/gcc/patches-12.x/870-ppc_no_crtsavres.patch b/toolchain/gcc/patches-12.x/870-ppc_no_crtsavres.patch new file mode 100644 index 0000000000..e51079dc13 --- /dev/null +++ b/toolchain/gcc/patches-12.x/870-ppc_no_crtsavres.patch @@ -0,0 +1,11 @@ +--- a/gcc/config/rs6000/rs6000-logue.cc ++++ b/gcc/config/rs6000/rs6000-logue.cc +@@ -348,7 +348,7 @@ rs6000_savres_strategy (rs6000_stack_t * + /* Define cutoff for using out-of-line functions to save registers. */ + if (DEFAULT_ABI == ABI_V4 || TARGET_ELF) + { +- if (!optimize_size) ++ if (1) + { + strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS; + strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS; diff --git a/toolchain/gcc/patches/11.2.0/881-no_tm_section.patch b/toolchain/gcc/patches-12.x/881-no_tm_section.patch similarity index 100% rename from toolchain/gcc/patches/11.2.0/881-no_tm_section.patch rename to toolchain/gcc/patches-12.x/881-no_tm_section.patch diff --git a/toolchain/gcc/patches/11.2.0/900-bad-mips16-crt.patch b/toolchain/gcc/patches-12.x/900-bad-mips16-crt.patch similarity index 100% rename from toolchain/gcc/patches/11.2.0/900-bad-mips16-crt.patch rename to toolchain/gcc/patches-12.x/900-bad-mips16-crt.patch diff --git a/toolchain/gcc/patches-12.x/910-mbsd_multi.patch b/toolchain/gcc/patches-12.x/910-mbsd_multi.patch new file mode 100644 index 0000000000..9233c6a1d7 --- /dev/null +++ b/toolchain/gcc/patches-12.x/910-mbsd_multi.patch @@ -0,0 +1,146 @@ +commit 99368862e44740ff4fd33760893f04e14f9dbdf1 +Author: Felix Fietkau +Date: Tue Jul 31 00:52:27 2007 +0000 + + Port the mbsd_multi patch from freewrt, which adds -fhonour-copts. This will emit warnings in packages that don't use our target cflags properly + + SVN-Revision: 8256 + + This patch brings over a feature from MirBSD: + * -fhonour-copts + If this option is not given, it's warned (depending + on environment variables). This is to catch errors + of misbuilt packages which override CFLAGS themselves. + + This patch was authored by Thorsten Glaser + with copyright assignment to the FSF in effect. + +--- a/gcc/c-family/c-opts.cc ++++ b/gcc/c-family/c-opts.cc +@@ -107,6 +107,9 @@ static dump_flags_t original_dump_flags; + /* Whether any standard preincluded header has been preincluded. */ + static bool done_preinclude; + ++/* Check if a port honours COPTS. */ ++static int honour_copts = 0; ++ + static void handle_OPT_d (const char *); + static void set_std_cxx98 (int); + static void set_std_cxx11 (int); +@@ -478,6 +481,12 @@ c_common_handle_option (size_t scode, co + flag_no_builtin = !value; + break; + ++ case OPT_fhonour_copts: ++ if (c_language == clk_c) { ++ honour_copts++; ++ } ++ break; ++ + case OPT_fconstant_string_class_: + constant_string_class_name = arg; + break; +@@ -1218,6 +1227,47 @@ c_common_init (void) + return false; + } + ++ if (c_language == clk_c) { ++ char *ev = getenv ("GCC_HONOUR_COPTS"); ++ int evv; ++ if (ev == NULL) ++ evv = -1; ++ else if ((*ev == '0') || (*ev == '\0')) ++ evv = 0; ++ else if (*ev == '1') ++ evv = 1; ++ else if (*ev == '2') ++ evv = 2; ++ else if (*ev == 's') ++ evv = -1; ++ else { ++ warning (0, "unknown GCC_HONOUR_COPTS value, assuming 1"); ++ evv = 1; /* maybe depend this on something like MIRBSD_NATIVE? */ ++ } ++ if (evv == 1) { ++ if (honour_copts == 0) { ++ error ("someone does not honour COPTS at all in lenient mode"); ++ return false; ++ } else if (honour_copts != 1) { ++ warning (0, "someone does not honour COPTS correctly, passed %d times", ++ honour_copts); ++ } ++ } else if (evv == 2) { ++ if (honour_copts == 0) { ++ error ("someone does not honour COPTS at all in strict mode"); ++ return false; ++ } else if (honour_copts != 1) { ++ error ("someone does not honour COPTS correctly, passed %d times", ++ honour_copts); ++ return false; ++ } ++ } else if (evv == 0) { ++ if (honour_copts != 1) ++ inform (UNKNOWN_LOCATION, "someone does not honour COPTS correctly, passed %d times", ++ honour_copts); ++ } ++ } ++ + return true; + } + +--- a/gcc/c-family/c.opt ++++ b/gcc/c-family/c.opt +@@ -1755,6 +1755,9 @@ C++ ObjC++ Optimization Alias(fexception + fhonor-std + C++ ObjC++ WarnRemoved + ++fhonour-copts ++C ObjC C++ ObjC++ RejectNegative ++ + fhosted + C ObjC + Assume normal C execution environment. +--- a/gcc/common.opt ++++ b/gcc/common.opt +@@ -1770,6 +1770,9 @@ fharden-conditional-branches + Common Var(flag_harden_conditional_branches) Optimization + Harden conditional branches by checking reversed conditions. + ++fhonour-copts ++Common RejectNegative ++ + ; Nonzero means ignore `#ident' directives. 0 means handle them. + ; Generate position-independent code for executables if possible + ; On SVR4 targets, it also controls whether or not to emit a +--- a/gcc/doc/invoke.texi ++++ b/gcc/doc/invoke.texi +@@ -9597,6 +9597,17 @@ This option is only supported for C and + @option{-Wall} and by @option{-Wpedantic}, which can be disabled with + @option{-Wno-pointer-sign}. + ++@item -fhonour-copts ++@opindex fhonour-copts ++If @env{GCC_HONOUR_COPTS} is set to 1, abort if this option is not ++given at least once, and warn if it is given more than once. ++If @env{GCC_HONOUR_COPTS} is set to 2, abort if this option is not ++given exactly once. ++If @env{GCC_HONOUR_COPTS} is set to 0 or unset, warn if this option ++is not given exactly once. ++The warning is quelled if @env{GCC_HONOUR_COPTS} is set to @samp{s}. ++This flag and environment variable only affect the C language. ++ + @item -Wstack-protector + @opindex Wstack-protector + @opindex Wno-stack-protector +--- a/gcc/opts.cc ++++ b/gcc/opts.cc +@@ -2699,6 +2699,9 @@ common_handle_option (struct gcc_options + add_comma_separated_to_vector (&opts->x_flag_ignored_attributes, arg); + break; + ++ case OPT_fhonour_copts: ++ break; ++ + case OPT_Werror: + dc->warning_as_error_requested = value; + break; diff --git a/toolchain/gcc/patches-12.x/920-specs_nonfatal_getenv.patch b/toolchain/gcc/patches-12.x/920-specs_nonfatal_getenv.patch new file mode 100644 index 0000000000..59bd350044 --- /dev/null +++ b/toolchain/gcc/patches-12.x/920-specs_nonfatal_getenv.patch @@ -0,0 +1,22 @@ +Author: Jo-Philipp Wich +Date: Sat Apr 21 03:02:39 2012 +0000 + + gcc: add patch to make the getenv() spec function nonfatal if requested environment variable is unset + + SVN-Revision: 31390 + +--- a/gcc/gcc.cc ++++ b/gcc/gcc.cc +@@ -10186,8 +10186,10 @@ getenv_spec_function (int argc, const ch + } + + if (!value) +- fatal_error (input_location, +- "environment variable %qs not defined", varname); ++ { ++ warning (input_location, "environment variable %qs not defined", varname); ++ value = ""; ++ } + + /* We have to escape every character of the environment variable so + they are not interpreted as active spec characters. A diff --git a/toolchain/gcc/patches/11.2.0/960-gotools-fix-compilation-when-making-cross-compiler.patch b/toolchain/gcc/patches-12.x/960-gotools-fix-compilation-when-making-cross-compiler.patch similarity index 100% rename from toolchain/gcc/patches/11.2.0/960-gotools-fix-compilation-when-making-cross-compiler.patch rename to toolchain/gcc/patches-12.x/960-gotools-fix-compilation-when-making-cross-compiler.patch diff --git a/toolchain/gcc/patches-12.x/970-macos_arm64-building-fix.patch b/toolchain/gcc/patches-12.x/970-macos_arm64-building-fix.patch new file mode 100644 index 0000000000..89730449f5 --- /dev/null +++ b/toolchain/gcc/patches-12.x/970-macos_arm64-building-fix.patch @@ -0,0 +1,45 @@ +commit 9c6e71079b46ad5433165feaa2001450f2017b56 +Author: Przemysław Buczkowski +Date: Mon Aug 16 13:16:21 2021 +0100 + + GCC: Patch for Apple Silicon compatibility + + This patch fixes a linker error occuring when compiling + the cross-compiler on macOS and ARM64 architecture. + + Adapted from: + https://github.com/richfelker/musl-cross-make/issues/116#issuecomment-823612404 + + Change-Id: Ia3ee98a163bbb62689f42e2da83a5ef36beb0913 + Reviewed-on: https://review.haiku-os.org/c/buildtools/+/4329 + Reviewed-by: John Scipione + Reviewed-by: Adrien Destugues + +--- a/gcc/config/aarch64/aarch64.h ++++ b/gcc/config/aarch64/aarch64.h +@@ -1293,7 +1293,7 @@ extern const char *aarch64_rewrite_mcpu + #define MCPU_TO_MARCH_SPEC_FUNCTIONS \ + { "rewrite_mcpu", aarch64_rewrite_mcpu }, + +-#if defined(__aarch64__) ++#if defined(__aarch64__) && ! defined(__APPLE__) + extern const char *host_detect_local_cpu (int argc, const char **argv); + #define HAVE_LOCAL_CPU_DETECT + # define EXTRA_SPEC_FUNCTIONS \ +--- a/gcc/config/host-darwin.cc ++++ b/gcc/config/host-darwin.cc +@@ -23,6 +23,8 @@ + #include "options.h" + #include "diagnostic-core.h" + #include "config/host-darwin.h" ++#include "hosthooks.h" ++#include "hosthooks-def.h" + #include + + /* For Darwin (macOS only) platforms, without ASLR (PIE) enabled on the +@@ -181,3 +183,5 @@ darwin_gt_pch_use_address (void *&addr, + + return 1; + } ++ ++const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER; diff --git a/toolchain/gcc/patches-13.x/001-rtl-optimization-109585-alias-analysis-typo.patch b/toolchain/gcc/patches-13.x/001-rtl-optimization-109585-alias-analysis-typo.patch new file mode 100644 index 0000000000..7f73be4325 --- /dev/null +++ b/toolchain/gcc/patches-13.x/001-rtl-optimization-109585-alias-analysis-typo.patch @@ -0,0 +1,69 @@ +From bb406a6aea336966681927a27f54ee89c4fd4ea1 Mon Sep 17 00:00:00 2001 +From: Richard Biener +Date: Mon, 24 Apr 2023 13:31:07 +0200 +Subject: [PATCH] rtl-optimization/109585 - alias analysis typo + +When r10-514-gc6b84edb6110dd2b4fb improved access path analysis +it introduced a typo that triggers when there's an access to a +trailing array in the first access path leading to false +disambiguation. + + PR rtl-optimization/109585 + * tree-ssa-alias.cc (aliasing_component_refs_p): Fix typo. + + * gcc.dg/torture/pr109585.c: New testcase. + +(cherry picked from commit 6d4bd27a60447c7505cb4783e675e98a191a8904) +--- + gcc/testsuite/gcc.dg/torture/pr109585.c | 33 +++++++++++++++++++++++++ + gcc/tree-ssa-alias.cc | 2 +- + 2 files changed, 34 insertions(+), 1 deletion(-) + create mode 100644 gcc/testsuite/gcc.dg/torture/pr109585.c + +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/torture/pr109585.c +@@ -0,0 +1,33 @@ ++/* { dg-do run } */ ++ ++#include ++ ++struct P { ++ long v; ++ struct P *n; ++}; ++ ++struct F { ++ long x; ++ struct P fam[]; ++}; ++ ++int __attribute__((noipa)) ++f(struct F *f, int i) ++{ ++ struct P *p = f->fam; ++ asm("" : "+r"(f): "r"(p)); ++ p->v = 0; ++ p->n = 0; ++ return f->fam->n != 0; ++} ++ ++int ++main() ++{ ++ struct F *m = malloc (sizeof (long) + 2 * sizeof (struct P)); ++ m->fam[0].n = &m->fam[1]; ++ if (f (m, 0)) ++ abort (); ++ return 0; ++} +--- a/gcc/tree-ssa-alias.cc ++++ b/gcc/tree-ssa-alias.cc +@@ -1330,7 +1330,7 @@ aliasing_component_refs_p (tree ref1, + /* If we didn't find a common base, try the other way around. */ + if (cmp_outer <= 0 + || (end_struct_ref1 +- && compare_type_sizes (TREE_TYPE (end_struct_ref1), type1) <= 0)) ++ && compare_type_sizes (TREE_TYPE (end_struct_ref1), type2) <= 0)) + { + int res = aliasing_component_refs_walk (ref2, type2, base2, + offset2, max_size2, diff --git a/toolchain/gcc/patches-13.x/002-case_insensitive.patch b/toolchain/gcc/patches-13.x/002-case_insensitive.patch new file mode 100644 index 0000000000..409497e5a3 --- /dev/null +++ b/toolchain/gcc/patches-13.x/002-case_insensitive.patch @@ -0,0 +1,24 @@ +commit 81cc26c706b2bc8c8c1eb1a322e5c5157900836e +Author: Felix Fietkau +Date: Sun Oct 19 21:45:51 2014 +0000 + + gcc: do not assume that the Mac OS X filesystem is case insensitive + + Signed-off-by: Felix Fietkau + + SVN-Revision: 42973 + +--- a/include/filenames.h ++++ b/include/filenames.h +@@ -44,11 +44,6 @@ extern "C" { + # define IS_DIR_SEPARATOR(c) IS_DOS_DIR_SEPARATOR (c) + # define IS_ABSOLUTE_PATH(f) IS_DOS_ABSOLUTE_PATH (f) + #else /* not DOSish */ +-# if defined(__APPLE__) +-# ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM +-# define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1 +-# endif +-# endif /* __APPLE__ */ + # define HAS_DRIVE_SPEC(f) (0) + # define IS_DIR_SEPARATOR(c) IS_UNIX_DIR_SEPARATOR (c) + # define IS_ABSOLUTE_PATH(f) IS_UNIX_ABSOLUTE_PATH (f) diff --git a/toolchain/gcc/patches-13.x/010-documentation.patch b/toolchain/gcc/patches-13.x/010-documentation.patch new file mode 100644 index 0000000000..9646568afe --- /dev/null +++ b/toolchain/gcc/patches-13.x/010-documentation.patch @@ -0,0 +1,35 @@ +commit 098bd91f5eae625c7d2ee621e10930fc4434e5e2 +Author: Luka Perkov +Date: Tue Feb 26 16:16:33 2013 +0000 + + gcc: don't build documentation + + This closes #13039. + + Signed-off-by: Luka Perkov + + SVN-Revision: 35807 + +--- a/gcc/Makefile.in ++++ b/gcc/Makefile.in +@@ -3397,18 +3397,10 @@ doc/gcc.info: $(TEXI_GCC_FILES) + doc/gccint.info: $(TEXI_GCCINT_FILES) + doc/cppinternals.info: $(TEXI_CPPINT_FILES) + +-doc/%.info: %.texi +- if [ x$(BUILD_INFO) = xinfo ]; then \ +- $(MAKEINFO) $(MAKEINFOFLAGS) -I . -I $(gcc_docdir) \ +- -I $(gcc_docdir)/include -o $@ $<; \ +- fi ++doc/%.info: + + # Duplicate entry to handle renaming of gccinstall.info +-doc/gccinstall.info: $(TEXI_GCCINSTALL_FILES) +- if [ x$(BUILD_INFO) = xinfo ]; then \ +- $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ +- -I $(gcc_docdir)/include -o $@ $<; \ +- fi ++doc/gccinstall.info: + + doc/cpp.dvi: $(TEXI_CPP_FILES) + doc/gcc.dvi: $(TEXI_GCC_FILES) diff --git a/toolchain/gcc/patches-13.x/110-Fix-MIPS-PR-84790.patch b/toolchain/gcc/patches-13.x/110-Fix-MIPS-PR-84790.patch new file mode 100644 index 0000000000..856fd6a46c --- /dev/null +++ b/toolchain/gcc/patches-13.x/110-Fix-MIPS-PR-84790.patch @@ -0,0 +1,20 @@ +Fix https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84790. +MIPS16 functions have a static assembler prologue which clobbers +registers v0 and v1. Add these register clobbers to function call +instructions. + +--- a/gcc/config/mips/mips.cc ++++ b/gcc/config/mips/mips.cc +@@ -3134,6 +3134,12 @@ mips_emit_call_insn (rtx pattern, rtx or + emit_insn (gen_update_got_version ()); + } + ++ if (TARGET_MIPS16 && TARGET_USE_GOT) ++ { ++ clobber_reg (&CALL_INSN_FUNCTION_USAGE (insn), MIPS16_PIC_TEMP); ++ clobber_reg (&CALL_INSN_FUNCTION_USAGE (insn), MIPS_PROLOGUE_TEMP (word_mode)); ++ } ++ + if (TARGET_MIPS16 + && TARGET_EXPLICIT_RELOCS + && TARGET_CALL_CLOBBERED_GP) diff --git a/toolchain/gcc/patches-13.x/230-musl_libssp.patch b/toolchain/gcc/patches-13.x/230-musl_libssp.patch new file mode 100644 index 0000000000..fee068e1d6 --- /dev/null +++ b/toolchain/gcc/patches-13.x/230-musl_libssp.patch @@ -0,0 +1,13 @@ +--- a/gcc/gcc.cc ++++ b/gcc/gcc.cc +@@ -972,7 +972,9 @@ proper position among the other output f + #endif + + #ifndef LINK_SSP_SPEC +-#ifdef TARGET_LIBC_PROVIDES_SSP ++#if DEFAULT_LIBC == LIBC_MUSL ++#define LINK_SSP_SPEC "-lssp_nonshared" ++#elif defined(TARGET_LIBC_PROVIDES_SSP) + #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \ + "|fstack-protector-strong|fstack-protector-explicit:}" + #else diff --git a/toolchain/gcc/patches-13.x/300-mips_Os_cpu_rtx_cost_model.patch b/toolchain/gcc/patches-13.x/300-mips_Os_cpu_rtx_cost_model.patch new file mode 100644 index 0000000000..ce21e0433d --- /dev/null +++ b/toolchain/gcc/patches-13.x/300-mips_Os_cpu_rtx_cost_model.patch @@ -0,0 +1,21 @@ +commit ecf7671b769fe96f7b5134be442089f8bdba55d2 +Author: Felix Fietkau +Date: Thu Aug 4 20:29:45 2016 +0200 + +gcc: add a patch to generate better code with Os on mips + +Also happens to reduce compressed code size a bit + +Signed-off-by: Felix Fietkau + +--- a/gcc/config/mips/mips.cc ++++ b/gcc/config/mips/mips.cc +@@ -20213,7 +20213,7 @@ mips_option_override (void) + flag_pcc_struct_return = 0; + + /* Decide which rtx_costs structure to use. */ +- if (optimize_size) ++ if (0 && optimize_size) + mips_cost = &mips_rtx_cost_optimize_size; + else + mips_cost = &mips_rtx_cost_data[mips_tune]; diff --git a/toolchain/gcc/patches-13.x/700-RISCV-Inline-subword-atomic-ops.patch b/toolchain/gcc/patches-13.x/700-RISCV-Inline-subword-atomic-ops.patch new file mode 100644 index 0000000000..752480bc4c --- /dev/null +++ b/toolchain/gcc/patches-13.x/700-RISCV-Inline-subword-atomic-ops.patch @@ -0,0 +1,2021 @@ +From f797260adaf52bee0ec0e16190bbefbe1bfc3692 Mon Sep 17 00:00:00 2001 +From: Patrick O'Neill +Date: Tue, 18 Apr 2023 14:33:13 -0700 +Subject: [PATCH] RISCV: Inline subword atomic ops + +RISC-V has no support for subword atomic operations; code currently +generates libatomic library calls. + +This patch changes the default behavior to inline subword atomic calls +(using the same logic as the existing library call). +Behavior can be specified using the -minline-atomics and +-mno-inline-atomics command line flags. + +gcc/libgcc/config/riscv/atomic.c has the same logic implemented in asm. +This will need to stay for backwards compatibility and the +-mno-inline-atomics flag. + +2023-04-18 Patrick O'Neill + +gcc/ChangeLog: + PR target/104338 + * config/riscv/riscv-protos.h: Add helper function stubs. + * config/riscv/riscv.cc: Add helper functions for subword masking. + * config/riscv/riscv.opt: Add command-line flag. + * config/riscv/sync.md: Add masking logic and inline asm for fetch_and_op, + fetch_and_nand, CAS, and exchange ops. + * doc/invoke.texi: Add blurb regarding command-line flag. + +libgcc/ChangeLog: + PR target/104338 + * config/riscv/atomic.c: Add reference to duplicate logic. + +gcc/testsuite/ChangeLog: + PR target/104338 + * gcc.target/riscv/inline-atomics-1.c: New test. + * gcc.target/riscv/inline-atomics-2.c: New test. + * gcc.target/riscv/inline-atomics-3.c: New test. + * gcc.target/riscv/inline-atomics-4.c: New test. + * gcc.target/riscv/inline-atomics-5.c: New test. + * gcc.target/riscv/inline-atomics-6.c: New test. + * gcc.target/riscv/inline-atomics-7.c: New test. + * gcc.target/riscv/inline-atomics-8.c: New test. + +Signed-off-by: Patrick O'Neill +Signed-off-by: Palmer Dabbelt +--- + gcc/config/riscv/riscv-protos.h | 2 + + gcc/config/riscv/riscv.cc | 49 ++ + gcc/config/riscv/riscv.opt | 4 + + gcc/config/riscv/sync.md | 301 +++++++++ + gcc/doc/invoke.texi | 10 +- + .../gcc.target/riscv/inline-atomics-1.c | 18 + + .../gcc.target/riscv/inline-atomics-2.c | 9 + + .../gcc.target/riscv/inline-atomics-3.c | 569 ++++++++++++++++++ + .../gcc.target/riscv/inline-atomics-4.c | 566 +++++++++++++++++ + .../gcc.target/riscv/inline-atomics-5.c | 87 +++ + .../gcc.target/riscv/inline-atomics-6.c | 87 +++ + .../gcc.target/riscv/inline-atomics-7.c | 69 +++ + .../gcc.target/riscv/inline-atomics-8.c | 69 +++ + libgcc/config/riscv/atomic.c | 2 + + 14 files changed, 1841 insertions(+), 1 deletion(-) + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-1.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-2.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-3.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-4.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-5.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-6.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-7.c + create mode 100644 gcc/testsuite/gcc.target/riscv/inline-atomics-8.c + +--- a/gcc/config/riscv/riscv-protos.h ++++ b/gcc/config/riscv/riscv-protos.h +@@ -79,6 +79,8 @@ extern void riscv_reinit (void); + extern poly_uint64 riscv_regmode_natural_size (machine_mode); + extern bool riscv_v_ext_vector_mode_p (machine_mode); + extern bool riscv_shamt_matches_mask_p (int, HOST_WIDE_INT); ++extern void riscv_subword_address (rtx, rtx *, rtx *, rtx *, rtx *); ++extern void riscv_lshift_subword (machine_mode, rtx, rtx, rtx *); + + /* Routines implemented in riscv-c.cc. */ + void riscv_cpu_cpp_builtins (cpp_reader *); +--- a/gcc/config/riscv/riscv.cc ++++ b/gcc/config/riscv/riscv.cc +@@ -7143,6 +7143,55 @@ riscv_zero_call_used_regs (HARD_REG_SET + & ~zeroed_hardregs); + } + ++/* Given memory reference MEM, expand code to compute the aligned ++ memory address, shift and mask values and store them into ++ *ALIGNED_MEM, *SHIFT, *MASK and *NOT_MASK. */ ++ ++void ++riscv_subword_address (rtx mem, rtx *aligned_mem, rtx *shift, rtx *mask, ++ rtx *not_mask) ++{ ++ /* Align the memory address to a word. */ ++ rtx addr = force_reg (Pmode, XEXP (mem, 0)); ++ ++ rtx addr_mask = gen_int_mode (-4, Pmode); ++ ++ rtx aligned_addr = gen_reg_rtx (Pmode); ++ emit_move_insn (aligned_addr, gen_rtx_AND (Pmode, addr, addr_mask)); ++ ++ *aligned_mem = change_address (mem, SImode, aligned_addr); ++ ++ /* Calculate the shift amount. */ ++ emit_move_insn (*shift, gen_rtx_AND (SImode, gen_lowpart (SImode, addr), ++ gen_int_mode (3, SImode))); ++ emit_move_insn (*shift, gen_rtx_ASHIFT (SImode, *shift, ++ gen_int_mode (3, SImode))); ++ ++ /* Calculate the mask. */ ++ int unshifted_mask = GET_MODE_MASK (GET_MODE (mem)); ++ ++ emit_move_insn (*mask, gen_int_mode (unshifted_mask, SImode)); ++ ++ emit_move_insn (*mask, gen_rtx_ASHIFT (SImode, *mask, ++ gen_lowpart (QImode, *shift))); ++ ++ emit_move_insn (*not_mask, gen_rtx_NOT(SImode, *mask)); ++} ++ ++/* Leftshift a subword within an SImode register. */ ++ ++void ++riscv_lshift_subword (machine_mode mode, rtx value, rtx shift, ++ rtx *shifted_value) ++{ ++ rtx value_reg = gen_reg_rtx (SImode); ++ emit_move_insn (value_reg, simplify_gen_subreg (SImode, value, ++ mode, 0)); ++ ++ emit_move_insn(*shifted_value, gen_rtx_ASHIFT (SImode, value_reg, ++ gen_lowpart (QImode, shift))); ++} ++ + /* Initialize the GCC target structure. */ + #undef TARGET_ASM_ALIGNED_HI_OP + #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t" +--- a/gcc/config/riscv/riscv.opt ++++ b/gcc/config/riscv/riscv.opt +@@ -238,6 +238,10 @@ int riscv_sv_subext + TargetVariable + int riscv_xthead_subext + ++minline-atomics ++Target Var(TARGET_INLINE_SUBWORD_ATOMIC) Init(1) ++Always inline subword atomic operations. ++ + Enum + Name(isa_spec_class) Type(enum riscv_isa_spec_class) + Supported ISA specs (for use with the -misa-spec= option): +--- a/gcc/config/riscv/sync.md ++++ b/gcc/config/riscv/sync.md +@@ -21,8 +21,11 @@ + + (define_c_enum "unspec" [ + UNSPEC_COMPARE_AND_SWAP ++ UNSPEC_COMPARE_AND_SWAP_SUBWORD + UNSPEC_SYNC_OLD_OP ++ UNSPEC_SYNC_OLD_OP_SUBWORD + UNSPEC_SYNC_EXCHANGE ++ UNSPEC_SYNC_EXCHANGE_SUBWORD + UNSPEC_ATOMIC_STORE + UNSPEC_MEMORY_BARRIER + ]) +@@ -91,6 +94,135 @@ + [(set_attr "type" "atomic") + (set (attr "length") (const_int 8))]) + ++(define_insn "subword_atomic_fetch_strong_" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI ++ [(any_atomic:SI (match_dup 1) ++ (match_operand:SI 2 "register_operand" "rI")) ;; value for op ++ (match_operand:SI 3 "register_operand" "rI")] ;; mask ++ UNSPEC_SYNC_OLD_OP_SUBWORD)) ++ (match_operand:SI 4 "register_operand" "rI") ;; not_mask ++ (clobber (match_scratch:SI 5 "=&r")) ;; tmp_1 ++ (clobber (match_scratch:SI 6 "=&r"))] ;; tmp_2 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "\t%5, %0, %2\;" ++ "and\t%5, %5, %3\;" ++ "and\t%6, %0, %4\;" ++ "or\t%6, %6, %5\;" ++ "sc.w.rl\t%5, %6, %1\;" ++ "bnez\t%5, 1b"; ++ } ++ [(set (attr "length") (const_int 28))]) ++ ++(define_expand "atomic_fetch_nand" ++ [(match_operand:SHORT 0 "register_operand") ;; old value at mem ++ (not:SHORT (and:SHORT (match_operand:SHORT 1 "memory_operand") ;; mem location ++ (match_operand:SHORT 2 "reg_or_0_operand"))) ;; value for op ++ (match_operand:SI 3 "const_int_operand")] ;; model ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ /* We have no QImode/HImode atomics, so form a mask, then use ++ subword_atomic_fetch_strong_nand to implement a LR/SC version of the ++ operation. */ ++ ++ /* Logic duplicated in gcc/libgcc/config/riscv/atomic.c for use when inlining ++ is disabled */ ++ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx value = operands[2]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx shifted_value = gen_reg_rtx (SImode); ++ riscv_lshift_subword (mode, value, shift, &shifted_value); ++ ++ emit_insn (gen_subword_atomic_fetch_strong_nand (old, aligned_mem, ++ shifted_value, ++ mask, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ ++ DONE; ++}) ++ ++(define_insn "subword_atomic_fetch_strong_nand" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI ++ [(not:SI (and:SI (match_dup 1) ++ (match_operand:SI 2 "register_operand" "rI"))) ;; value for op ++ (match_operand:SI 3 "register_operand" "rI")] ;; mask ++ UNSPEC_SYNC_OLD_OP_SUBWORD)) ++ (match_operand:SI 4 "register_operand" "rI") ;; not_mask ++ (clobber (match_scratch:SI 5 "=&r")) ;; tmp_1 ++ (clobber (match_scratch:SI 6 "=&r"))] ;; tmp_2 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "and\t%5, %0, %2\;" ++ "not\t%5, %5\;" ++ "and\t%5, %5, %3\;" ++ "and\t%6, %0, %4\;" ++ "or\t%6, %6, %5\;" ++ "sc.w.rl\t%5, %6, %1\;" ++ "bnez\t%5, 1b"; ++ } ++ [(set (attr "length") (const_int 32))]) ++ ++(define_expand "atomic_fetch_" ++ [(match_operand:SHORT 0 "register_operand") ;; old value at mem ++ (any_atomic:SHORT (match_operand:SHORT 1 "memory_operand") ;; mem location ++ (match_operand:SHORT 2 "reg_or_0_operand")) ;; value for op ++ (match_operand:SI 3 "const_int_operand")] ;; model ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ /* We have no QImode/HImode atomics, so form a mask, then use ++ subword_atomic_fetch_strong_ to implement a LR/SC version of the ++ operation. */ ++ ++ /* Logic duplicated in gcc/libgcc/config/riscv/atomic.c for use when inlining ++ is disabled */ ++ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx value = operands[2]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx shifted_value = gen_reg_rtx (SImode); ++ riscv_lshift_subword (mode, value, shift, &shifted_value); ++ ++ emit_insn (gen_subword_atomic_fetch_strong_ (old, aligned_mem, ++ shifted_value, ++ mask, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ ++ DONE; ++}) ++ + (define_insn "atomic_exchange" + [(set (match_operand:GPR 0 "register_operand" "=&r") + (unspec_volatile:GPR +@@ -104,6 +236,56 @@ + [(set_attr "type" "atomic") + (set (attr "length") (const_int 8))]) + ++(define_expand "atomic_exchange" ++ [(match_operand:SHORT 0 "register_operand") ;; old value at mem ++ (match_operand:SHORT 1 "memory_operand") ;; mem location ++ (match_operand:SHORT 2 "register_operand") ;; value ++ (match_operand:SI 3 "const_int_operand")] ;; model ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx value = operands[2]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx shifted_value = gen_reg_rtx (SImode); ++ riscv_lshift_subword (mode, value, shift, &shifted_value); ++ ++ emit_insn (gen_subword_atomic_exchange_strong (old, aligned_mem, ++ shifted_value, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ DONE; ++}) ++ ++(define_insn "subword_atomic_exchange_strong" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI ++ [(match_operand:SI 2 "reg_or_0_operand" "rI") ;; value ++ (match_operand:SI 3 "reg_or_0_operand" "rI")] ;; not_mask ++ UNSPEC_SYNC_EXCHANGE_SUBWORD)) ++ (clobber (match_scratch:SI 4 "=&r"))] ;; tmp_1 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "and\t%4, %0, %3\;" ++ "or\t%4, %4, %2\;" ++ "sc.w.rl\t%4, %4, %1\;" ++ "bnez\t%4, 1b"; ++ } ++ [(set (attr "length") (const_int 20))]) ++ + (define_insn "atomic_cas_value_strong" + [(set (match_operand:GPR 0 "register_operand" "=&r") + (match_operand:GPR 1 "memory_operand" "+A")) +@@ -153,6 +335,125 @@ + DONE; + }) + ++(define_expand "atomic_compare_and_swap" ++ [(match_operand:SI 0 "register_operand") ;; bool output ++ (match_operand:SHORT 1 "register_operand") ;; val output ++ (match_operand:SHORT 2 "memory_operand") ;; memory ++ (match_operand:SHORT 3 "reg_or_0_operand") ;; expected value ++ (match_operand:SHORT 4 "reg_or_0_operand") ;; desired value ++ (match_operand:SI 5 "const_int_operand") ;; is_weak ++ (match_operand:SI 6 "const_int_operand") ;; mod_s ++ (match_operand:SI 7 "const_int_operand")] ;; mod_f ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ emit_insn (gen_atomic_cas_value_strong (operands[1], operands[2], ++ operands[3], operands[4], ++ operands[6], operands[7])); ++ ++ rtx val = gen_reg_rtx (SImode); ++ if (operands[1] != const0_rtx) ++ emit_move_insn (val, gen_rtx_SIGN_EXTEND (SImode, operands[1])); ++ else ++ emit_move_insn (val, const0_rtx); ++ ++ rtx exp = gen_reg_rtx (SImode); ++ if (operands[3] != const0_rtx) ++ emit_move_insn (exp, gen_rtx_SIGN_EXTEND (SImode, operands[3])); ++ else ++ emit_move_insn (exp, const0_rtx); ++ ++ rtx compare = val; ++ if (exp != const0_rtx) ++ { ++ rtx difference = gen_rtx_MINUS (SImode, val, exp); ++ compare = gen_reg_rtx (SImode); ++ emit_move_insn (compare, difference); ++ } ++ ++ if (word_mode != SImode) ++ { ++ rtx reg = gen_reg_rtx (word_mode); ++ emit_move_insn (reg, gen_rtx_SIGN_EXTEND (word_mode, compare)); ++ compare = reg; ++ } ++ ++ emit_move_insn (operands[0], gen_rtx_EQ (SImode, compare, const0_rtx)); ++ DONE; ++}) ++ ++(define_expand "atomic_cas_value_strong" ++ [(match_operand:SHORT 0 "register_operand") ;; val output ++ (match_operand:SHORT 1 "memory_operand") ;; memory ++ (match_operand:SHORT 2 "reg_or_0_operand") ;; expected value ++ (match_operand:SHORT 3 "reg_or_0_operand") ;; desired value ++ (match_operand:SI 4 "const_int_operand") ;; mod_s ++ (match_operand:SI 5 "const_int_operand") ;; mod_f ++ (match_scratch:SHORT 6)] ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++{ ++ /* We have no QImode/HImode atomics, so form a mask, then use ++ subword_atomic_cas_strong to implement a LR/SC version of the ++ operation. */ ++ ++ /* Logic duplicated in gcc/libgcc/config/riscv/atomic.c for use when inlining ++ is disabled */ ++ ++ rtx old = gen_reg_rtx (SImode); ++ rtx mem = operands[1]; ++ rtx aligned_mem = gen_reg_rtx (SImode); ++ rtx shift = gen_reg_rtx (SImode); ++ rtx mask = gen_reg_rtx (SImode); ++ rtx not_mask = gen_reg_rtx (SImode); ++ ++ riscv_subword_address (mem, &aligned_mem, &shift, &mask, ¬_mask); ++ ++ rtx o = operands[2]; ++ rtx n = operands[3]; ++ rtx shifted_o = gen_reg_rtx (SImode); ++ rtx shifted_n = gen_reg_rtx (SImode); ++ ++ riscv_lshift_subword (mode, o, shift, &shifted_o); ++ riscv_lshift_subword (mode, n, shift, &shifted_n); ++ ++ emit_move_insn (shifted_o, gen_rtx_AND (SImode, shifted_o, mask)); ++ emit_move_insn (shifted_n, gen_rtx_AND (SImode, shifted_n, mask)); ++ ++ emit_insn (gen_subword_atomic_cas_strong (old, aligned_mem, ++ shifted_o, shifted_n, ++ mask, not_mask)); ++ ++ emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, ++ gen_lowpart (QImode, shift))); ++ ++ emit_move_insn (operands[0], gen_lowpart (mode, old)); ++ ++ DONE; ++}) ++ ++(define_insn "subword_atomic_cas_strong" ++ [(set (match_operand:SI 0 "register_operand" "=&r") ;; old value at mem ++ (match_operand:SI 1 "memory_operand" "+A")) ;; mem location ++ (set (match_dup 1) ++ (unspec_volatile:SI [(match_operand:SI 2 "reg_or_0_operand" "rJ") ;; expected value ++ (match_operand:SI 3 "reg_or_0_operand" "rJ")] ;; desired value ++ UNSPEC_COMPARE_AND_SWAP_SUBWORD)) ++ (match_operand:SI 4 "register_operand" "rI") ;; mask ++ (match_operand:SI 5 "register_operand" "rI") ;; not_mask ++ (clobber (match_scratch:SI 6 "=&r"))] ;; tmp_1 ++ "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" ++ { ++ return "1:\;" ++ "lr.w.aq\t%0, %1\;" ++ "and\t%6, %0, %4\;" ++ "bne\t%6, %z2, 1f\;" ++ "and\t%6, %0, %5\;" ++ "or\t%6, %6, %3\;" ++ "sc.w.rl\t%6, %6, %1\;" ++ "bnez\t%6, 1b\;" ++ "1:"; ++ } ++ [(set (attr "length") (const_int 28))]) ++ + (define_expand "atomic_test_and_set" + [(match_operand:QI 0 "register_operand" "") ;; bool output + (match_operand:QI 1 "memory_operand" "+A") ;; memory +--- a/gcc/doc/invoke.texi ++++ b/gcc/doc/invoke.texi +@@ -1226,7 +1226,8 @@ See RS/6000 and PowerPC Options. + -mbig-endian -mlittle-endian + -mstack-protector-guard=@var{guard} -mstack-protector-guard-reg=@var{reg} + -mstack-protector-guard-offset=@var{offset} +--mcsr-check -mno-csr-check} ++-mcsr-check -mno-csr-check ++-minline-atomics -mno-inline-atomics} + + @emph{RL78 Options} + @gccoptlist{-msim -mmul=none -mmul=g13 -mmul=g14 -mallregs +@@ -29006,6 +29007,13 @@ Do or don't use smaller but slower prolo + library function calls. The default is to use fast inline prologues and + epilogues. + ++@opindex minline-atomics ++@item -minline-atomics ++@itemx -mno-inline-atomics ++Do or don't use smaller but slower subword atomic emulation code that uses ++libatomic function calls. The default is to use fast inline subword atomics ++that do not require libatomic. ++ + @opindex mshorten-memrefs + @item -mshorten-memrefs + @itemx -mno-shorten-memrefs +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-1.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-options "-mno-inline-atomics" } */ ++/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" "fetch_and_nand" { target *-*-* } 0 } */ ++/* { dg-final { scan-assembler "\tcall\t__sync_fetch_and_add_1" } } */ ++/* { dg-final { scan-assembler "\tcall\t__sync_fetch_and_nand_1" } } */ ++/* { dg-final { scan-assembler "\tcall\t__sync_bool_compare_and_swap_1" } } */ ++ ++char foo; ++char bar; ++char baz; ++ ++int ++main () ++{ ++ __sync_fetch_and_add(&foo, 1); ++ __sync_fetch_and_nand(&bar, 1); ++ __sync_bool_compare_and_swap (&baz, 1, 2); ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-2.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile } */ ++/* Verify that subword atomics do not generate calls. */ ++/* { dg-options "-minline-atomics" } */ ++/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" "fetch_and_nand" { target *-*-* } 0 } */ ++/* { dg-final { scan-assembler-not "\tcall\t__sync_fetch_and_add_1" } } */ ++/* { dg-final { scan-assembler-not "\tcall\t__sync_fetch_and_nand_1" } } */ ++/* { dg-final { scan-assembler-not "\tcall\t__sync_bool_compare_and_swap_1" } } */ ++ ++#include "inline-atomics-1.c" +\ No newline at end of file +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-3.c +@@ -0,0 +1,569 @@ ++/* Check all char alignments. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-op-1.c */ ++/* Test __atomic routines for existence and proper execution on 1 byte ++ values with each valid memory model. */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics -Wno-address-of-packed-member" } */ ++ ++/* Test the execution of the __atomic_*OP builtin routines for a char. */ ++ ++extern void abort(void); ++ ++char count, res; ++const char init = ~0; ++ ++struct A ++{ ++ char a; ++ char b; ++ char c; ++ char d; ++} __attribute__ ((packed)) A; ++ ++/* The fetch_op routines return the original value before the operation. */ ++ ++void ++test_fetch_add (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQUIRE) != 2) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_RELEASE) != 3) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQ_REL) != 4) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_SEQ_CST) != 5) ++ abort (); ++} ++ ++ ++void ++test_fetch_sub (char* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_RELAXED) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_CONSUME) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQUIRE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_RELEASE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQ_REL) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_SEQ_CST) != res--) ++ abort (); ++} ++ ++void ++test_fetch_and (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_fetch_and (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_fetch_nand (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_ACQUIRE) != 0 ) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_xor (char* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_fetch_xor (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_or (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_or (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 2, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 8, __ATOMIC_RELEASE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQ_REL) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_SEQ_CST) != 31) ++ abort (); ++} ++ ++/* The OP_fetch routines return the new value after the operation. */ ++ ++void ++test_add_fetch (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_CONSUME) != 2) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_RELEASE) != 4) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQ_REL) != 5) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_SEQ_CST) != 6) ++ abort (); ++} ++ ++ ++void ++test_sub_fetch (char* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_CONSUME) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQUIRE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_RELEASE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_SEQ_CST) != --res) ++ abort (); ++} ++ ++void ++test_and_fetch (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ *v = init; ++ if (__atomic_and_fetch (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_nand_fetch (char* v) ++{ ++ *v = init; ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor_fetch (char* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_xor_fetch (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_or_fetch (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_or_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 2, __ATOMIC_CONSUME) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQUIRE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 8, __ATOMIC_RELEASE) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQ_REL) != 31) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_SEQ_CST) != 63) ++ abort (); ++} ++ ++ ++/* Test the OP routines with a result which isn't used. Use both variations ++ within each function. */ ++ ++void ++test_add (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_add_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_CONSUME); ++ if (*v != 2) ++ abort (); ++ ++ __atomic_add_fetch (v, 1 , __ATOMIC_ACQUIRE); ++ if (*v != 3) ++ abort (); ++ ++ __atomic_fetch_add (v, 1, __ATOMIC_RELEASE); ++ if (*v != 4) ++ abort (); ++ ++ __atomic_add_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 5) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 6) ++ abort (); ++} ++ ++ ++void ++test_sub (char* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_CONSUME); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, 1, __ATOMIC_ACQUIRE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, 1, __ATOMIC_RELEASE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_SEQ_CST); ++ if (*v != --res) ++ abort (); ++} ++ ++void ++test_and (char* v) ++{ ++ *v = init; ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_RELAXED); ++ if (*v != 0) ++ abort (); ++ ++ *v = init; ++ __atomic_fetch_and (v, init, __ATOMIC_CONSUME); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, init, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_nand (char* v) ++{ ++ *v = init; ++ ++ __atomic_fetch_nand (v, 0, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, init, __ATOMIC_RELEASE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor (char* v) ++{ ++ *v = init; ++ count = 0; ++ ++ __atomic_xor_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_or (char* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_or_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_CONSUME); ++ if (*v != 3) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, 4, __ATOMIC_ACQUIRE); ++ if (*v != 7) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, 8, __ATOMIC_RELEASE); ++ if (*v != 15) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 31) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 63) ++ abort (); ++} ++ ++int ++main () ++{ ++ char* V[] = {&A.a, &A.b, &A.c, &A.d}; ++ ++ for (int i = 0; i < 4; i++) { ++ test_fetch_add (V[i]); ++ test_fetch_sub (V[i]); ++ test_fetch_and (V[i]); ++ test_fetch_nand (V[i]); ++ test_fetch_xor (V[i]); ++ test_fetch_or (V[i]); ++ ++ test_add_fetch (V[i]); ++ test_sub_fetch (V[i]); ++ test_and_fetch (V[i]); ++ test_nand_fetch (V[i]); ++ test_xor_fetch (V[i]); ++ test_or_fetch (V[i]); ++ ++ test_add (V[i]); ++ test_sub (V[i]); ++ test_and (V[i]); ++ test_nand (V[i]); ++ test_xor (V[i]); ++ test_or (V[i]); ++ } ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-4.c +@@ -0,0 +1,566 @@ ++/* Check all short alignments. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-op-2.c */ ++/* Test __atomic routines for existence and proper execution on 2 byte ++ values with each valid memory model. */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics -Wno-address-of-packed-member" } */ ++ ++/* Test the execution of the __atomic_*OP builtin routines for a short. */ ++ ++extern void abort(void); ++ ++short count, res; ++const short init = ~0; ++ ++struct A ++{ ++ short a; ++ short b; ++} __attribute__ ((packed)) A; ++ ++/* The fetch_op routines return the original value before the operation. */ ++ ++void ++test_fetch_add (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQUIRE) != 2) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_RELEASE) != 3) ++ abort (); ++ ++ if (__atomic_fetch_add (v, count, __ATOMIC_ACQ_REL) != 4) ++ abort (); ++ ++ if (__atomic_fetch_add (v, 1, __ATOMIC_SEQ_CST) != 5) ++ abort (); ++} ++ ++ ++void ++test_fetch_sub (short* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_RELAXED) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_CONSUME) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQUIRE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_RELEASE) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, count + 1, __ATOMIC_ACQ_REL) != res--) ++ abort (); ++ ++ if (__atomic_fetch_sub (v, 1, __ATOMIC_SEQ_CST) != res--) ++ abort (); ++} ++ ++void ++test_fetch_and (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_fetch_and (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_fetch_nand (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_ACQUIRE) != 0 ) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ if (__atomic_fetch_nand (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_xor (short* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_fetch_xor (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_fetch_xor (v, ~count, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++void ++test_fetch_or (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_fetch_or (v, count, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 2, __ATOMIC_CONSUME) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, 8, __ATOMIC_RELEASE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_ACQ_REL) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_fetch_or (v, count, __ATOMIC_SEQ_CST) != 31) ++ abort (); ++} ++ ++/* The OP_fetch routines return the new value after the operation. */ ++ ++void ++test_add_fetch (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_CONSUME) != 2) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQUIRE) != 3) ++ abort (); ++ ++ if (__atomic_add_fetch (v, 1, __ATOMIC_RELEASE) != 4) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_ACQ_REL) != 5) ++ abort (); ++ ++ if (__atomic_add_fetch (v, count, __ATOMIC_SEQ_CST) != 6) ++ abort (); ++} ++ ++ ++void ++test_sub_fetch (short* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_CONSUME) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQUIRE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, 1, __ATOMIC_RELEASE) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL) != --res) ++ abort (); ++ ++ if (__atomic_sub_fetch (v, count + 1, __ATOMIC_SEQ_CST) != --res) ++ abort (); ++} ++ ++void ++test_and_fetch (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_RELAXED) != 0) ++ abort (); ++ ++ *v = init; ++ if (__atomic_and_fetch (v, init, __ATOMIC_CONSUME) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, init, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL) != 0) ++ abort (); ++ ++ *v = ~*v; ++ if (__atomic_and_fetch (v, 0, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_nand_fetch (short* v) ++{ ++ *v = init; ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_RELEASE) != 0) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, init, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST) != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor_fetch (short* v) ++{ ++ *v = init; ++ count = 0; ++ ++ if (__atomic_xor_fetch (v, count, __ATOMIC_RELAXED) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_CONSUME) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE) != 0) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_RELEASE) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, 0, __ATOMIC_ACQ_REL) != init) ++ abort (); ++ ++ if (__atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST) != 0) ++ abort (); ++} ++ ++void ++test_or_fetch (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ if (__atomic_or_fetch (v, count, __ATOMIC_RELAXED) != 1) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 2, __ATOMIC_CONSUME) != 3) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQUIRE) != 7) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, 8, __ATOMIC_RELEASE) != 15) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_ACQ_REL) != 31) ++ abort (); ++ ++ count *= 2; ++ if (__atomic_or_fetch (v, count, __ATOMIC_SEQ_CST) != 63) ++ abort (); ++} ++ ++ ++/* Test the OP routines with a result which isn't used. Use both variations ++ within each function. */ ++ ++void ++test_add (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_add_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_CONSUME); ++ if (*v != 2) ++ abort (); ++ ++ __atomic_add_fetch (v, 1 , __ATOMIC_ACQUIRE); ++ if (*v != 3) ++ abort (); ++ ++ __atomic_fetch_add (v, 1, __ATOMIC_RELEASE); ++ if (*v != 4) ++ abort (); ++ ++ __atomic_add_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 5) ++ abort (); ++ ++ __atomic_fetch_add (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 6) ++ abort (); ++} ++ ++ ++void ++test_sub (short* v) ++{ ++ *v = res = 20; ++ count = 0; ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_RELAXED); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_CONSUME); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, 1, __ATOMIC_ACQUIRE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, 1, __ATOMIC_RELEASE); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_sub_fetch (v, count + 1, __ATOMIC_ACQ_REL); ++ if (*v != --res) ++ abort (); ++ ++ __atomic_fetch_sub (v, count + 1, __ATOMIC_SEQ_CST); ++ if (*v != --res) ++ abort (); ++} ++ ++void ++test_and (short* v) ++{ ++ *v = init; ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_RELAXED); ++ if (*v != 0) ++ abort (); ++ ++ *v = init; ++ __atomic_fetch_and (v, init, __ATOMIC_CONSUME); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, init, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_and_fetch (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != 0) ++ abort (); ++ ++ *v = ~*v; ++ __atomic_fetch_and (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_nand (short* v) ++{ ++ *v = init; ++ ++ __atomic_fetch_nand (v, 0, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, init, __ATOMIC_RELEASE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_nand (v, init, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_nand_fetch (v, 0, __ATOMIC_SEQ_CST); ++ if (*v != init) ++ abort (); ++} ++ ++ ++ ++void ++test_xor (short* v) ++{ ++ *v = init; ++ count = 0; ++ ++ __atomic_xor_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_CONSUME); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_xor_fetch (v, 0, __ATOMIC_ACQUIRE); ++ if (*v != 0) ++ abort (); ++ ++ __atomic_fetch_xor (v, ~count, __ATOMIC_RELEASE); ++ if (*v != init) ++ abort (); ++ ++ __atomic_fetch_xor (v, 0, __ATOMIC_ACQ_REL); ++ if (*v != init) ++ abort (); ++ ++ __atomic_xor_fetch (v, ~count, __ATOMIC_SEQ_CST); ++ if (*v != 0) ++ abort (); ++} ++ ++void ++test_or (short* v) ++{ ++ *v = 0; ++ count = 1; ++ ++ __atomic_or_fetch (v, count, __ATOMIC_RELAXED); ++ if (*v != 1) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_CONSUME); ++ if (*v != 3) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, 4, __ATOMIC_ACQUIRE); ++ if (*v != 7) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, 8, __ATOMIC_RELEASE); ++ if (*v != 15) ++ abort (); ++ ++ count *= 2; ++ __atomic_or_fetch (v, count, __ATOMIC_ACQ_REL); ++ if (*v != 31) ++ abort (); ++ ++ count *= 2; ++ __atomic_fetch_or (v, count, __ATOMIC_SEQ_CST); ++ if (*v != 63) ++ abort (); ++} ++ ++int ++main () { ++ short* V[] = {&A.a, &A.b}; ++ ++ for (int i = 0; i < 2; i++) { ++ test_fetch_add (V[i]); ++ test_fetch_sub (V[i]); ++ test_fetch_and (V[i]); ++ test_fetch_nand (V[i]); ++ test_fetch_xor (V[i]); ++ test_fetch_or (V[i]); ++ ++ test_add_fetch (V[i]); ++ test_sub_fetch (V[i]); ++ test_and_fetch (V[i]); ++ test_nand_fetch (V[i]); ++ test_xor_fetch (V[i]); ++ test_or_fetch (V[i]); ++ ++ test_add (V[i]); ++ test_sub (V[i]); ++ test_and (V[i]); ++ test_nand (V[i]); ++ test_xor (V[i]); ++ test_or (V[i]); ++ } ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-5.c +@@ -0,0 +1,87 @@ ++/* Test __atomic routines for existence and proper execution on 1 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-compare-exchange-1.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_compare_exchange_n builtin for a char. */ ++ ++extern void abort(void); ++ ++char v = 0; ++char expected = 0; ++char max = ~0; ++char desired = ~0; ++char zero = 0; ++ ++#define STRONG 0 ++#define WEAK 1 ++ ++int ++main () ++{ ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, max, STRONG , __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ /* Now test the generic version. */ ++ ++ v = 0; ++ ++ if (!__atomic_compare_exchange (&v, &expected, &max, STRONG, __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-6.c +@@ -0,0 +1,87 @@ ++/* Test __atomic routines for existence and proper execution on 2 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-compare-exchange-2.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_compare_exchange_n builtin for a short. */ ++ ++extern void abort(void); ++ ++short v = 0; ++short expected = 0; ++short max = ~0; ++short desired = ~0; ++short zero = 0; ++ ++#define STRONG 0 ++#define WEAK 1 ++ ++int ++main () ++{ ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, max, STRONG , __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange_n (&v, &expected, desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange_n (&v, &expected, desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ /* Now test the generic version. */ ++ ++ v = 0; ++ ++ if (!__atomic_compare_exchange (&v, &expected, &max, STRONG, __ATOMIC_RELAXED, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) ++ abort (); ++ if (expected != max) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != max) ++ abort (); ++ if (v != 0) ++ abort (); ++ ++ if (__atomic_compare_exchange (&v, &expected, &desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ ++ if (!__atomic_compare_exchange (&v, &expected, &desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) ++ abort (); ++ if (expected != 0) ++ abort (); ++ if (v != max) ++ abort (); ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-7.c +@@ -0,0 +1,69 @@ ++/* Test __atomic routines for existence and proper execution on 1 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-exchange-1.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_exchange_n builtin for a char. */ ++ ++extern void abort(void); ++ ++char v, count, ret; ++ ++int ++main () ++{ ++ v = 0; ++ count = 0; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELAXED) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQUIRE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELEASE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQ_REL) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_SEQ_CST) != count) ++ abort (); ++ count++; ++ ++ /* Now test the generic version. */ ++ ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELAXED); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQUIRE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELEASE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQ_REL); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_SEQ_CST); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ return 0; ++} +--- /dev/null ++++ b/gcc/testsuite/gcc.target/riscv/inline-atomics-8.c +@@ -0,0 +1,69 @@ ++/* Test __atomic routines for existence and proper execution on 2 byte ++ values with each valid memory model. */ ++/* Duplicate logic as libatomic/testsuite/libatomic.c/atomic-exchange-2.c */ ++/* { dg-do run } */ ++/* { dg-options "-minline-atomics" } */ ++ ++/* Test the execution of the __atomic_X builtin for a short. */ ++ ++extern void abort(void); ++ ++short v, count, ret; ++ ++int ++main () ++{ ++ v = 0; ++ count = 0; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELAXED) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQUIRE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELEASE) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQ_REL) != count) ++ abort (); ++ count++; ++ ++ if (__atomic_exchange_n (&v, count + 1, __ATOMIC_SEQ_CST) != count) ++ abort (); ++ count++; ++ ++ /* Now test the generic version. */ ++ ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELAXED); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQUIRE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_RELEASE); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQ_REL); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ __atomic_exchange (&v, &count, &ret, __ATOMIC_SEQ_CST); ++ if (ret != count - 1 || v != count) ++ abort (); ++ count++; ++ ++ return 0; ++} +--- a/libgcc/config/riscv/atomic.c ++++ b/libgcc/config/riscv/atomic.c +@@ -30,6 +30,8 @@ see the files COPYING3 and COPYING.RUNTI + #define INVERT "not %[tmp1], %[tmp1]\n\t" + #define DONT_INVERT "" + ++/* Logic duplicated in gcc/gcc/config/riscv/sync.md for use when inlining is enabled */ ++ + #define GENERATE_FETCH_AND_OP(type, size, opname, insn, invert, cop) \ + type __sync_fetch_and_ ## opname ## _ ## size (type *p, type v) \ + { \ diff --git a/toolchain/gcc/patches-13.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch b/toolchain/gcc/patches-13.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch new file mode 100644 index 0000000000..328c7be9ce --- /dev/null +++ b/toolchain/gcc/patches-13.x/701-riscv-linux-Don-t-add-latomic-with-pthread.patch @@ -0,0 +1,36 @@ +From 203f3060dd363361b172f7295f42bb6bf5ac0b3b Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +Date: Sat, 23 Apr 2022 15:48:42 +0200 +Subject: [PATCH] riscv/linux: Don't add -latomic with -pthread + +Now that we have support for inline subword atomic operations, it is no +longer necessary to link against libatomic. This also fixes testsuite +failures because the framework does not properly set up the linker flags +for finding libatomic. +The use of atomic operations is also independent of the use of libpthread. + +gcc/ + * config/riscv/linux.h (LIB_SPEC): Don't redefine. +--- + gcc/config/riscv/linux.h | 10 ---------- + 1 file changed, 10 deletions(-) + +--- a/gcc/config/riscv/linux.h ++++ b/gcc/config/riscv/linux.h +@@ -35,16 +35,6 @@ along with GCC; see the file COPYING3. + #undef MUSL_DYNAMIC_LINKER + #define MUSL_DYNAMIC_LINKER "/lib/ld-musl-riscv" XLEN_SPEC MUSL_ABI_SUFFIX ".so.1" + +-/* Because RISC-V only has word-sized atomics, it requries libatomic where +- others do not. So link libatomic by default, as needed. */ +-#undef LIB_SPEC +-#ifdef LD_AS_NEEDED_OPTION +-#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC \ +- " %{pthread:" LD_AS_NEEDED_OPTION " -latomic " LD_NO_AS_NEEDED_OPTION "}" +-#else +-#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC " -latomic " +-#endif +- + #define ICACHE_FLUSH_FUNC "__riscv_flush_icache" + + #define CPP_SPEC "%{pthread:-D_REENTRANT}" diff --git a/toolchain/gcc/patches/8.4.0/810-arm-softfloat-libgcc.patch b/toolchain/gcc/patches-13.x/810-arm-softfloat-libgcc.patch similarity index 100% rename from toolchain/gcc/patches/8.4.0/810-arm-softfloat-libgcc.patch rename to toolchain/gcc/patches-13.x/810-arm-softfloat-libgcc.patch diff --git a/toolchain/gcc/patches-13.x/820-libgcc_pic.patch b/toolchain/gcc/patches-13.x/820-libgcc_pic.patch new file mode 100644 index 0000000000..7d10298190 --- /dev/null +++ b/toolchain/gcc/patches-13.x/820-libgcc_pic.patch @@ -0,0 +1,44 @@ +commit c96312958c0621e72c9b32da5bc224ffe2161384 +Author: Felix Fietkau +Date: Mon Oct 19 23:26:09 2009 +0000 + + gcc: create a proper libgcc_pic.a static library for relinking (4.3.3+ for now, backport will follow) + + SVN-Revision: 18086 + +--- a/libgcc/Makefile.in ++++ b/libgcc/Makefile.in +@@ -933,11 +933,12 @@ $(libgcov-driver-objects): %$(objext): $ + + # Static libraries. + libgcc.a: $(libgcc-objects) ++libgcc_pic.a: $(libgcc-s-objects) + libgcov.a: $(libgcov-objects) + libunwind.a: $(libunwind-objects) + libgcc_eh.a: $(libgcc-eh-objects) + +-libgcc.a libgcov.a libunwind.a libgcc_eh.a: ++libgcc.a libgcov.a libunwind.a libgcc_eh.a libgcc_pic.a: + -rm -f $@ + + objects="$(objects)"; \ +@@ -961,7 +962,7 @@ all: libunwind.a + endif + + ifeq ($(enable_shared),yes) +-all: libgcc_eh.a libgcc_s$(SHLIB_EXT) ++all: libgcc_eh.a libgcc_pic.a libgcc_s$(SHLIB_EXT) + ifneq ($(LIBUNWIND),) + all: libunwind$(SHLIB_EXT) + libgcc_s$(SHLIB_EXT): libunwind$(SHLIB_EXT) +@@ -1167,6 +1168,10 @@ install-shared: + chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_eh.a + $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_eh.a + ++ $(INSTALL_DATA) libgcc_pic.a $(mapfile) $(DESTDIR)$(inst_libdir)/ ++ chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_pic.a ++ $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_pic.a ++ + $(subst @multilib_dir@,$(MULTIDIR),$(subst \ + @shlib_base_name@,libgcc_s,$(subst \ + @shlib_slibdir_qual@,$(MULTIOSSUBDIR),$(SHLIB_INSTALL)))) diff --git a/toolchain/gcc/patches-13.x/840-armv4_pass_fix-v4bx_to_ld.patch b/toolchain/gcc/patches-13.x/840-armv4_pass_fix-v4bx_to_ld.patch new file mode 100644 index 0000000000..82935f3d1d --- /dev/null +++ b/toolchain/gcc/patches-13.x/840-armv4_pass_fix-v4bx_to_ld.patch @@ -0,0 +1,28 @@ +commit 7edc8ca5456d9743dd0075eb3cc5b04f4f24c8cc +Author: Imre Kaloz +Date: Wed Feb 2 19:34:36 2011 +0000 + + add armv4 fixup patches + + SVN-Revision: 25322 + + +--- a/gcc/config/arm/linux-eabi.h ++++ b/gcc/config/arm/linux-eabi.h +@@ -88,10 +88,15 @@ + #define MUSL_DYNAMIC_LINKER \ + "/lib/ld-musl-arm" MUSL_DYNAMIC_LINKER_E "%{mfloat-abi=hard:hf}%{mfdpic:-fdpic}.so.1" + ++/* For armv4 we pass --fix-v4bx to linker to support EABI */ ++#undef TARGET_FIX_V4BX_SPEC ++#define TARGET_FIX_V4BX_SPEC " %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*"\ ++ "|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx}" ++ + /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to + use the GNU/Linux version, not the generic BPABI version. */ + #undef LINK_SPEC +-#define LINK_SPEC EABI_LINK_SPEC \ ++#define LINK_SPEC EABI_LINK_SPEC TARGET_FIX_V4BX_SPEC \ + LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC, \ + LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC) + diff --git a/toolchain/gcc/patches-13.x/850-use_shared_libgcc.patch b/toolchain/gcc/patches-13.x/850-use_shared_libgcc.patch new file mode 100644 index 0000000000..f4505ee70f --- /dev/null +++ b/toolchain/gcc/patches-13.x/850-use_shared_libgcc.patch @@ -0,0 +1,54 @@ +commit dcfc40358b5a3cae7320c17f8d1cebd5ad5540cd +Author: Felix Fietkau +Date: Sun Feb 12 20:25:47 2012 +0000 + + gcc 4.6: port over the missing patch 850-use_shared_libgcc.patch to prevent libgcc crap from leaking into every single binary + + SVN-Revision: 30486 +--- a/gcc/config/arm/linux-eabi.h ++++ b/gcc/config/arm/linux-eabi.h +@@ -129,10 +129,6 @@ + "%{Ofast|ffast-math|funsafe-math-optimizations:%{!shared:crtfastmath.o%s}} " \ + LINUX_OR_ANDROID_LD (GNU_USER_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC) + +-/* Use the default LIBGCC_SPEC, not the version in linux-elf.h, as we +- do not use -lfloat. */ +-#undef LIBGCC_SPEC +- + /* Clear the instruction cache from `beg' to `end'. This is + implemented in lib1funcs.S, so ensure an error if this definition + is used. */ +--- a/gcc/config/linux.h ++++ b/gcc/config/linux.h +@@ -58,6 +58,10 @@ see the files COPYING3 and COPYING.RUNTI + builtin_assert ("system=posix"); \ + } while (0) + ++#ifndef LIBGCC_SPEC ++#define LIBGCC_SPEC "%{static|static-libgcc:-lgcc}%{!static:%{!static-libgcc:-lgcc_s}}" ++#endif ++ + /* Determine which dynamic linker to use depending on whether GLIBC or + uClibc or Bionic or musl is the default C library and whether + -muclibc or -mglibc or -mbionic or -mmusl has been passed to change +--- a/libgcc/mkmap-symver.awk ++++ b/libgcc/mkmap-symver.awk +@@ -136,5 +136,5 @@ function output(lib) { + else if (inherit[lib]) + printf("} %s;\n", inherit[lib]); + else +- printf ("\n local:\n\t*;\n};\n"); ++ printf ("\n\t*;\n};\n"); + } +--- a/gcc/config/rs6000/linux.h ++++ b/gcc/config/rs6000/linux.h +@@ -67,6 +67,9 @@ + #undef CPP_OS_DEFAULT_SPEC + #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" + ++#undef LIBGCC_SPEC ++#define LIBGCC_SPEC "%{!static:%{!static-libgcc:-lgcc_s}} -lgcc" ++ + #undef LINK_SHLIB_SPEC + #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}} \ + %{static-pie:-static -pie --no-dynamic-linker -z text}" diff --git a/toolchain/gcc/patches/8.4.0/851-libgcc_no_compat.patch b/toolchain/gcc/patches-13.x/851-libgcc_no_compat.patch similarity index 100% rename from toolchain/gcc/patches/8.4.0/851-libgcc_no_compat.patch rename to toolchain/gcc/patches-13.x/851-libgcc_no_compat.patch diff --git a/toolchain/gcc/patches-13.x/870-ppc_no_crtsavres.patch b/toolchain/gcc/patches-13.x/870-ppc_no_crtsavres.patch new file mode 100644 index 0000000000..0dca68899e --- /dev/null +++ b/toolchain/gcc/patches-13.x/870-ppc_no_crtsavres.patch @@ -0,0 +1,11 @@ +--- a/gcc/config/rs6000/rs6000-logue.cc ++++ b/gcc/config/rs6000/rs6000-logue.cc +@@ -344,7 +344,7 @@ rs6000_savres_strategy (rs6000_stack_t * + /* Define cutoff for using out-of-line functions to save registers. */ + if (DEFAULT_ABI == ABI_V4 || TARGET_ELF) + { +- if (!optimize_size) ++ if (1) + { + strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS; + strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS; diff --git a/toolchain/gcc/patches-13.x/881-no_tm_section.patch b/toolchain/gcc/patches-13.x/881-no_tm_section.patch new file mode 100644 index 0000000000..2029910fd0 --- /dev/null +++ b/toolchain/gcc/patches-13.x/881-no_tm_section.patch @@ -0,0 +1,11 @@ +--- a/libgcc/crtstuff.c ++++ b/libgcc/crtstuff.c +@@ -152,7 +152,7 @@ call_ ## FUNC (void) \ + #endif + + #if !defined(USE_TM_CLONE_REGISTRY) && defined(OBJECT_FORMAT_ELF) +-# define USE_TM_CLONE_REGISTRY 1 ++# define USE_TM_CLONE_REGISTRY 0 + #elif !defined(USE_TM_CLONE_REGISTRY) + # define USE_TM_CLONE_REGISTRY 0 + #endif diff --git a/toolchain/gcc/patches/8.4.0/900-bad-mips16-crt.patch b/toolchain/gcc/patches-13.x/900-bad-mips16-crt.patch similarity index 100% rename from toolchain/gcc/patches/8.4.0/900-bad-mips16-crt.patch rename to toolchain/gcc/patches-13.x/900-bad-mips16-crt.patch diff --git a/toolchain/gcc/patches-13.x/910-mbsd_multi.patch b/toolchain/gcc/patches-13.x/910-mbsd_multi.patch new file mode 100644 index 0000000000..8af05c9994 --- /dev/null +++ b/toolchain/gcc/patches-13.x/910-mbsd_multi.patch @@ -0,0 +1,146 @@ +commit 99368862e44740ff4fd33760893f04e14f9dbdf1 +Author: Felix Fietkau +Date: Tue Jul 31 00:52:27 2007 +0000 + + Port the mbsd_multi patch from freewrt, which adds -fhonour-copts. This will emit warnings in packages that don't use our target cflags properly + + SVN-Revision: 8256 + + This patch brings over a feature from MirBSD: + * -fhonour-copts + If this option is not given, it's warned (depending + on environment variables). This is to catch errors + of misbuilt packages which override CFLAGS themselves. + + This patch was authored by Thorsten Glaser + with copyright assignment to the FSF in effect. + +--- a/gcc/c-family/c-opts.cc ++++ b/gcc/c-family/c-opts.cc +@@ -104,6 +104,9 @@ static size_t include_cursor; + /* Whether any standard preincluded header has been preincluded. */ + static bool done_preinclude; + ++/* Check if a port honours COPTS. */ ++static int honour_copts = 0; ++ + static void handle_OPT_d (const char *); + static void set_std_cxx98 (int); + static void set_std_cxx11 (int); +@@ -475,6 +478,12 @@ c_common_handle_option (size_t scode, co + flag_no_builtin = !value; + break; + ++ case OPT_fhonour_copts: ++ if (c_language == clk_c) { ++ honour_copts++; ++ } ++ break; ++ + case OPT_fconstant_string_class_: + constant_string_class_name = arg; + break; +@@ -1228,6 +1237,47 @@ c_common_init (void) + return false; + } + ++ if (c_language == clk_c) { ++ char *ev = getenv ("GCC_HONOUR_COPTS"); ++ int evv; ++ if (ev == NULL) ++ evv = -1; ++ else if ((*ev == '0') || (*ev == '\0')) ++ evv = 0; ++ else if (*ev == '1') ++ evv = 1; ++ else if (*ev == '2') ++ evv = 2; ++ else if (*ev == 's') ++ evv = -1; ++ else { ++ warning (0, "unknown GCC_HONOUR_COPTS value, assuming 1"); ++ evv = 1; /* maybe depend this on something like MIRBSD_NATIVE? */ ++ } ++ if (evv == 1) { ++ if (honour_copts == 0) { ++ error ("someone does not honour COPTS at all in lenient mode"); ++ return false; ++ } else if (honour_copts != 1) { ++ warning (0, "someone does not honour COPTS correctly, passed %d times", ++ honour_copts); ++ } ++ } else if (evv == 2) { ++ if (honour_copts == 0) { ++ error ("someone does not honour COPTS at all in strict mode"); ++ return false; ++ } else if (honour_copts != 1) { ++ error ("someone does not honour COPTS correctly, passed %d times", ++ honour_copts); ++ return false; ++ } ++ } else if (evv == 0) { ++ if (honour_copts != 1) ++ inform (UNKNOWN_LOCATION, "someone does not honour COPTS correctly, passed %d times", ++ honour_copts); ++ } ++ } ++ + return true; + } + +--- a/gcc/c-family/c.opt ++++ b/gcc/c-family/c.opt +@@ -1837,6 +1837,9 @@ C++ ObjC++ Optimization Alias(fexception + fhonor-std + C++ ObjC++ WarnRemoved + ++fhonour-copts ++C ObjC C++ ObjC++ RejectNegative ++ + fhosted + C ObjC + Assume normal C execution environment. +--- a/gcc/common.opt ++++ b/gcc/common.opt +@@ -1801,6 +1801,9 @@ fharden-conditional-branches + Common Var(flag_harden_conditional_branches) Optimization + Harden conditional branches by checking reversed conditions. + ++fhonour-copts ++Common RejectNegative ++ + ; Nonzero means ignore `#ident' directives. 0 means handle them. + ; Generate position-independent code for executables if possible + ; On SVR4 targets, it also controls whether or not to emit a +--- a/gcc/doc/invoke.texi ++++ b/gcc/doc/invoke.texi +@@ -10062,6 +10062,17 @@ This option is only supported for C and + @option{-Wall} and by @option{-Wpedantic}, which can be disabled with + @option{-Wno-pointer-sign}. + ++@item -fhonour-copts ++@opindex fhonour-copts ++If @env{GCC_HONOUR_COPTS} is set to 1, abort if this option is not ++given at least once, and warn if it is given more than once. ++If @env{GCC_HONOUR_COPTS} is set to 2, abort if this option is not ++given exactly once. ++If @env{GCC_HONOUR_COPTS} is set to 0 or unset, warn if this option ++is not given exactly once. ++The warning is quelled if @env{GCC_HONOUR_COPTS} is set to @samp{s}. ++This flag and environment variable only affect the C language. ++ + @opindex Wstack-protector + @opindex Wno-stack-protector + @item -Wstack-protector +--- a/gcc/opts.cc ++++ b/gcc/opts.cc +@@ -2767,6 +2767,9 @@ common_handle_option (struct gcc_options + add_comma_separated_to_vector (&opts->x_flag_ignored_attributes, arg); + break; + ++ case OPT_fhonour_copts: ++ break; ++ + case OPT_Werror: + dc->warning_as_error_requested = value; + break; diff --git a/toolchain/gcc/patches-13.x/920-specs_nonfatal_getenv.patch b/toolchain/gcc/patches-13.x/920-specs_nonfatal_getenv.patch new file mode 100644 index 0000000000..265ca22c0c --- /dev/null +++ b/toolchain/gcc/patches-13.x/920-specs_nonfatal_getenv.patch @@ -0,0 +1,22 @@ +Author: Jo-Philipp Wich +Date: Sat Apr 21 03:02:39 2012 +0000 + + gcc: add patch to make the getenv() spec function nonfatal if requested environment variable is unset + + SVN-Revision: 31390 + +--- a/gcc/gcc.cc ++++ b/gcc/gcc.cc +@@ -10174,8 +10174,10 @@ getenv_spec_function (int argc, const ch + } + + if (!value) +- fatal_error (input_location, +- "environment variable %qs not defined", varname); ++ { ++ warning (input_location, "environment variable %qs not defined", varname); ++ value = ""; ++ } + + /* We have to escape every character of the environment variable so + they are not interpreted as active spec characters. A diff --git a/toolchain/gcc/patches-13.x/960-gotools-fix-compilation-when-making-cross-compiler.patch b/toolchain/gcc/patches-13.x/960-gotools-fix-compilation-when-making-cross-compiler.patch new file mode 100644 index 0000000000..b1d7576328 --- /dev/null +++ b/toolchain/gcc/patches-13.x/960-gotools-fix-compilation-when-making-cross-compiler.patch @@ -0,0 +1,67 @@ +From dda6b050cd74a352670787a294596a9c56c21327 Mon Sep 17 00:00:00 2001 +From: Yousong Zhou +Date: Fri, 4 May 2018 18:20:53 +0800 +Subject: [PATCH] gotools: fix compilation when making cross compiler + +libgo is "the runtime support library for the Go programming language. +This library is intended for use with the Go frontend." + +gccgo will link target files with libgo.so which depends on libgcc_s.so.1, but +the linker will complain that it cannot find it. That's because shared libgcc +is not present in the install directory yet. libgo.so was made without problem +because gcc will emit -lgcc_s when compiled with -shared option. When gotools +were being made, it was supplied with -static-libgcc thus no link option was +provided. Check LIBGO in gcc/go/gcc-spec.c for how gccgo make a builtin spec +for linking with libgo.so + +- GccgoCrossCompilation, https://github.com/golang/go/wiki/GccgoCrossCompilation +- Cross-building instructions, http://www.eglibc.org/archives/patches/msg00078.html + +When 3-pass GCC compilation is used, shared libgcc runtime libraries will be +available after gcc pass2 completed and will meet the gotools link requirement +at gcc pass3 +--- + gotools/Makefile.am | 4 +++- + gotools/Makefile.in | 4 +++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +--- a/gotools/Makefile.am ++++ b/gotools/Makefile.am +@@ -26,6 +26,7 @@ PWD_COMMAND = $${PWDCMD-pwd} + STAMP = echo timestamp > + + libgodir = ../$(target_noncanonical)/libgo ++libgccdir = ../$(target_noncanonical)/libgcc + LIBGODEP = $(libgodir)/libgo.la + + LIBGOTOOL = $(libgodir)/libgotool.a +@@ -41,7 +42,8 @@ GOCFLAGS = $(CFLAGS_FOR_TARGET) + GOCOMPILE = $(GOCOMPILER) $(GOCFLAGS) + + AM_GOCFLAGS = -I $(libgodir) +-AM_LDFLAGS = -L $(libgodir) -L $(libgodir)/.libs ++AM_LDFLAGS = -L $(libgodir) -L $(libgodir)/.libs \ ++ -L $(libgccdir) -L $(libgccdir)/.libs -lgcc_s + GOLINK = $(GOCOMPILER) $(GOCFLAGS) $(AM_GOCFLAGS) $(LDFLAGS) $(AM_LDFLAGS) -o $@ + + libgosrcdir = $(srcdir)/../libgo/go +--- a/gotools/Makefile.in ++++ b/gotools/Makefile.in +@@ -337,6 +337,7 @@ mkinstalldirs = $(SHELL) $(toplevel_srcd + PWD_COMMAND = $${PWDCMD-pwd} + STAMP = echo timestamp > + libgodir = ../$(target_noncanonical)/libgo ++libgccdir = ../$(target_noncanonical)/libgcc + LIBGODEP = $(libgodir)/libgo.la + LIBGOTOOL = $(libgodir)/libgotool.a + @NATIVE_FALSE@GOCOMPILER = $(GOC) +@@ -346,7 +347,8 @@ LIBGOTOOL = $(libgodir)/libgotool.a + GOCFLAGS = $(CFLAGS_FOR_TARGET) + GOCOMPILE = $(GOCOMPILER) $(GOCFLAGS) + AM_GOCFLAGS = -I $(libgodir) +-AM_LDFLAGS = -L $(libgodir) -L $(libgodir)/.libs ++AM_LDFLAGS = -L $(libgodir) -L $(libgodir)/.libs \ ++ -L $(libgccdir) -L $(libgccdir)/.libs -lgcc_s + GOLINK = $(GOCOMPILER) $(GOCFLAGS) $(AM_GOCFLAGS) $(LDFLAGS) $(AM_LDFLAGS) -o $@ + libgosrcdir = $(srcdir)/../libgo/go + cmdsrcdir = $(libgosrcdir)/cmd diff --git a/toolchain/gcc/patches-13.x/970-macos_arm64-building-fix.patch b/toolchain/gcc/patches-13.x/970-macos_arm64-building-fix.patch new file mode 100644 index 0000000000..7844268e7e --- /dev/null +++ b/toolchain/gcc/patches-13.x/970-macos_arm64-building-fix.patch @@ -0,0 +1,45 @@ +commit 9c6e71079b46ad5433165feaa2001450f2017b56 +Author: Przemysław Buczkowski +Date: Mon Aug 16 13:16:21 2021 +0100 + + GCC: Patch for Apple Silicon compatibility + + This patch fixes a linker error occuring when compiling + the cross-compiler on macOS and ARM64 architecture. + + Adapted from: + https://github.com/richfelker/musl-cross-make/issues/116#issuecomment-823612404 + + Change-Id: Ia3ee98a163bbb62689f42e2da83a5ef36beb0913 + Reviewed-on: https://review.haiku-os.org/c/buildtools/+/4329 + Reviewed-by: John Scipione + Reviewed-by: Adrien Destugues + +--- a/gcc/config/aarch64/aarch64.h ++++ b/gcc/config/aarch64/aarch64.h +@@ -1185,7 +1185,7 @@ extern enum aarch64_code_model aarch64_c + + /* Extra specs when building a native AArch64-hosted compiler. + Option rewriting rules based on host system. */ +-#if defined(__aarch64__) ++#if defined(__aarch64__) && ! defined(__APPLE__) + extern const char *host_detect_local_cpu (int argc, const char **argv); + #define HAVE_LOCAL_CPU_DETECT + # define EXTRA_SPEC_FUNCTIONS \ +--- a/gcc/config/host-darwin.cc ++++ b/gcc/config/host-darwin.cc +@@ -23,6 +23,8 @@ + #include "options.h" + #include "diagnostic-core.h" + #include "config/host-darwin.h" ++#include "hosthooks.h" ++#include "hosthooks-def.h" + #include + + /* For Darwin (macOS only) platforms, without ASLR (PIE) enabled on the +@@ -181,3 +183,5 @@ darwin_gt_pch_use_address (void *&addr, + + return 1; + } ++ ++const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER; diff --git a/toolchain/gcc/patches/10.3.0/010-documentation.patch b/toolchain/gcc/patches/10.3.0/010-documentation.patch deleted file mode 100644 index 85990e5acc..0000000000 --- a/toolchain/gcc/patches/10.3.0/010-documentation.patch +++ /dev/null @@ -1,35 +0,0 @@ -commit 098bd91f5eae625c7d2ee621e10930fc4434e5e2 -Author: Luka Perkov -Date: Tue Feb 26 16:16:33 2013 +0000 - - gcc: don't build documentation - - This closes #13039. - - Signed-off-by: Luka Perkov - - SVN-Revision: 35807 - ---- a/gcc/Makefile.in -+++ b/gcc/Makefile.in -@@ -3285,18 +3285,10 @@ doc/gcc.info: $(TEXI_GCC_FILES) - doc/gccint.info: $(TEXI_GCCINT_FILES) - doc/cppinternals.info: $(TEXI_CPPINT_FILES) - --doc/%.info: %.texi -- if [ x$(BUILD_INFO) = xinfo ]; then \ -- $(MAKEINFO) $(MAKEINFOFLAGS) -I . -I $(gcc_docdir) \ -- -I $(gcc_docdir)/include -o $@ $<; \ -- fi -+doc/%.info: - - # Duplicate entry to handle renaming of gccinstall.info --doc/gccinstall.info: $(TEXI_GCCINSTALL_FILES) -- if [ x$(BUILD_INFO) = xinfo ]; then \ -- $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ -- -I $(gcc_docdir)/include -o $@ $<; \ -- fi -+doc/gccinstall.info: - - doc/cpp.dvi: $(TEXI_CPP_FILES) - doc/gcc.dvi: $(TEXI_GCC_FILES) diff --git a/toolchain/gcc/patches/10.3.0/230-musl_libssp.patch b/toolchain/gcc/patches/10.3.0/230-musl_libssp.patch deleted file mode 100644 index 63f37662f4..0000000000 --- a/toolchain/gcc/patches/10.3.0/230-musl_libssp.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/gcc/gcc.c -+++ b/gcc/gcc.c -@@ -875,7 +875,9 @@ proper position among the other output f - #endif - - #ifndef LINK_SSP_SPEC --#ifdef TARGET_LIBC_PROVIDES_SSP -+#if DEFAULT_LIBC == LIBC_MUSL -+#define LINK_SSP_SPEC "-lssp_nonshared" -+#elif defined(TARGET_LIBC_PROVIDES_SSP) - #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \ - "|fstack-protector-strong|fstack-protector-explicit:}" - #else diff --git a/toolchain/gcc/patches/10.3.0/820-libgcc_pic.patch b/toolchain/gcc/patches/10.3.0/820-libgcc_pic.patch deleted file mode 100644 index ddd6cf8732..0000000000 --- a/toolchain/gcc/patches/10.3.0/820-libgcc_pic.patch +++ /dev/null @@ -1,44 +0,0 @@ -commit c96312958c0621e72c9b32da5bc224ffe2161384 -Author: Felix Fietkau -Date: Mon Oct 19 23:26:09 2009 +0000 - - gcc: create a proper libgcc_pic.a static library for relinking (4.3.3+ for now, backport will follow) - - SVN-Revision: 18086 - ---- a/libgcc/Makefile.in -+++ b/libgcc/Makefile.in -@@ -929,11 +929,12 @@ $(libgcov-driver-objects): %$(objext): $ - - # Static libraries. - libgcc.a: $(libgcc-objects) -+libgcc_pic.a: $(libgcc-s-objects) - libgcov.a: $(libgcov-objects) - libunwind.a: $(libunwind-objects) - libgcc_eh.a: $(libgcc-eh-objects) - --libgcc.a libgcov.a libunwind.a libgcc_eh.a: -+libgcc.a libgcov.a libunwind.a libgcc_eh.a libgcc_pic.a: - -rm -f $@ - - objects="$(objects)"; \ -@@ -957,7 +958,7 @@ all: libunwind.a - endif - - ifeq ($(enable_shared),yes) --all: libgcc_eh.a libgcc_s$(SHLIB_EXT) -+all: libgcc_eh.a libgcc_pic.a libgcc_s$(SHLIB_EXT) - ifneq ($(LIBUNWIND),) - all: libunwind$(SHLIB_EXT) - libgcc_s$(SHLIB_EXT): libunwind$(SHLIB_EXT) -@@ -1163,6 +1164,10 @@ install-shared: - chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_eh.a - $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_eh.a - -+ $(INSTALL_DATA) libgcc_pic.a $(mapfile) $(DESTDIR)$(inst_libdir)/ -+ chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_pic.a -+ $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_pic.a -+ - $(subst @multilib_dir@,$(MULTIDIR),$(subst \ - @shlib_base_name@,libgcc_s,$(subst \ - @shlib_slibdir_qual@,$(MULTIOSSUBDIR),$(SHLIB_INSTALL)))) diff --git a/toolchain/gcc/patches/10.3.0/910-mbsd_multi.patch b/toolchain/gcc/patches/10.3.0/910-mbsd_multi.patch deleted file mode 100644 index 3ed6238310..0000000000 --- a/toolchain/gcc/patches/10.3.0/910-mbsd_multi.patch +++ /dev/null @@ -1,146 +0,0 @@ -commit 99368862e44740ff4fd33760893f04e14f9dbdf1 -Author: Felix Fietkau -Date: Tue Jul 31 00:52:27 2007 +0000 - - Port the mbsd_multi patch from freewrt, which adds -fhonour-copts. This will emit warnings in packages that don't use our target cflags properly - - SVN-Revision: 8256 - - This patch brings over a feature from MirBSD: - * -fhonour-copts - If this option is not given, it's warned (depending - on environment variables). This is to catch errors - of misbuilt packages which override CFLAGS themselves. - - This patch was authored by Thorsten Glaser - with copyright assignment to the FSF in effect. - ---- a/gcc/c-family/c-opts.c -+++ b/gcc/c-family/c-opts.c -@@ -107,6 +107,9 @@ static dump_flags_t original_dump_flags; - /* Whether any standard preincluded header has been preincluded. */ - static bool done_preinclude; - -+/* Check if a port honours COPTS. */ -+static int honour_copts = 0; -+ - static void handle_OPT_d (const char *); - static void set_std_cxx98 (int); - static void set_std_cxx11 (int); -@@ -455,6 +458,12 @@ c_common_handle_option (size_t scode, co - flag_no_builtin = !value; - break; - -+ case OPT_fhonour_copts: -+ if (c_language == clk_c) { -+ honour_copts++; -+ } -+ break; -+ - case OPT_fconstant_string_class_: - constant_string_class_name = arg; - break; -@@ -1168,6 +1177,47 @@ c_common_init (void) - return false; - } - -+ if (c_language == clk_c) { -+ char *ev = getenv ("GCC_HONOUR_COPTS"); -+ int evv; -+ if (ev == NULL) -+ evv = -1; -+ else if ((*ev == '0') || (*ev == '\0')) -+ evv = 0; -+ else if (*ev == '1') -+ evv = 1; -+ else if (*ev == '2') -+ evv = 2; -+ else if (*ev == 's') -+ evv = -1; -+ else { -+ warning (0, "unknown GCC_HONOUR_COPTS value, assuming 1"); -+ evv = 1; /* maybe depend this on something like MIRBSD_NATIVE? */ -+ } -+ if (evv == 1) { -+ if (honour_copts == 0) { -+ error ("someone does not honour COPTS at all in lenient mode"); -+ return false; -+ } else if (honour_copts != 1) { -+ warning (0, "someone does not honour COPTS correctly, passed %d times", -+ honour_copts); -+ } -+ } else if (evv == 2) { -+ if (honour_copts == 0) { -+ error ("someone does not honour COPTS at all in strict mode"); -+ return false; -+ } else if (honour_copts != 1) { -+ error ("someone does not honour COPTS correctly, passed %d times", -+ honour_copts); -+ return false; -+ } -+ } else if (evv == 0) { -+ if (honour_copts != 1) -+ inform (UNKNOWN_LOCATION, "someone does not honour COPTS correctly, passed %d times", -+ honour_copts); -+ } -+ } -+ - return true; - } - ---- a/gcc/c-family/c.opt -+++ b/gcc/c-family/c.opt -@@ -1590,6 +1590,9 @@ C++ ObjC++ Optimization Alias(fexception - fhonor-std - C++ ObjC++ WarnRemoved - -+fhonour-copts -+C ObjC C++ ObjC++ RejectNegative -+ - fhosted - C ObjC - Assume normal C execution environment. ---- a/gcc/common.opt -+++ b/gcc/common.opt -@@ -1660,6 +1660,9 @@ fguess-branch-probability - Common Report Var(flag_guess_branch_prob) Optimization - Enable guessing of branch probabilities. - -+fhonour-copts -+Common RejectNegative -+ - ; Nonzero means ignore `#ident' directives. 0 means handle them. - ; Generate position-independent code for executables if possible - ; On SVR4 targets, it also controls whether or not to emit a ---- a/gcc/doc/invoke.texi -+++ b/gcc/doc/invoke.texi -@@ -8171,6 +8171,17 @@ This option is only supported for C and - @option{-Wall} and by @option{-Wpedantic}, which can be disabled with - @option{-Wno-pointer-sign}. - -+@item -fhonour-copts -+@opindex fhonour-copts -+If @env{GCC_HONOUR_COPTS} is set to 1, abort if this option is not -+given at least once, and warn if it is given more than once. -+If @env{GCC_HONOUR_COPTS} is set to 2, abort if this option is not -+given exactly once. -+If @env{GCC_HONOUR_COPTS} is set to 0 or unset, warn if this option -+is not given exactly once. -+The warning is quelled if @env{GCC_HONOUR_COPTS} is set to @samp{s}. -+This flag and environment variable only affect the C language. -+ - @item -Wstack-protector - @opindex Wstack-protector - @opindex Wno-stack-protector ---- a/gcc/opts.c -+++ b/gcc/opts.c -@@ -2318,6 +2318,9 @@ common_handle_option (struct gcc_options - /* Currently handled in a prescan. */ - break; - -+ case OPT_fhonour_copts: -+ break; -+ - case OPT_Werror: - dc->warning_as_error_requested = value; - break; diff --git a/toolchain/gcc/patches/10.3.0/920-specs_nonfatal_getenv.patch b/toolchain/gcc/patches/10.3.0/920-specs_nonfatal_getenv.patch deleted file mode 100644 index 487b9e47cb..0000000000 --- a/toolchain/gcc/patches/10.3.0/920-specs_nonfatal_getenv.patch +++ /dev/null @@ -1,22 +0,0 @@ -Author: Jo-Philipp Wich -Date: Sat Apr 21 03:02:39 2012 +0000 - - gcc: add patch to make the getenv() spec function nonfatal if requested environment variable is unset - - SVN-Revision: 31390 - ---- a/gcc/gcc.c -+++ b/gcc/gcc.c -@@ -9396,8 +9396,10 @@ getenv_spec_function (int argc, const ch - } - - if (!value) -- fatal_error (input_location, -- "environment variable %qs not defined", varname); -+ { -+ warning (input_location, "environment variable %qs not defined", varname); -+ value = ""; -+ } - - /* We have to escape every character of the environment variable so - they are not interpreted as active spec characters. A diff --git a/toolchain/gcc/patches/10.3.0/930-fix-mips-noexecstack.patch b/toolchain/gcc/patches/10.3.0/930-fix-mips-noexecstack.patch deleted file mode 100644 index e795acd1de..0000000000 --- a/toolchain/gcc/patches/10.3.0/930-fix-mips-noexecstack.patch +++ /dev/null @@ -1,111 +0,0 @@ -From da45b3fde60095756f5f6030f6012c23a3d34429 Mon Sep 17 00:00:00 2001 -From: Andrew McDonnell -Date: Fri, 3 Oct 2014 19:09:00 +0930 -Subject: Add .note.GNU-stack section - -See http://lists.busybox.net/pipermail/uclibc/2014-October/048671.html -Below copied from https://gcc.gnu.org/ml/gcc-patches/2014-09/msg02430.html - -Re: [Patch, MIPS] Add .note.GNU-stack section - - From: Steve Ellcey - -On Wed, 2014-09-10 at 10:15 -0700, Eric Christopher wrote: -> -> -> On Wed, Sep 10, 2014 at 9:27 AM, wrote: - -> This works except you did not update the assembly files in -> libgcc or glibc. We (Cavium) have the same patch in our tree -> for a few released versions. - -> Mind just checking yours in then Andrew? - -> Thanks! -> -eric - -I talked to Andrew about what files he changed in GCC and created and -tested this new patch. Andrew also mentioned changing some assembly -files in glibc but I don't see any use of '.section .note.GNU-stack' in -any assembly files in glibc (for any platform) so I wasn't planning on -creating a glibc to add them to mips glibc assembly language files. - -OK to check in this patch? - -Steve Ellcey -sellcey@mips.com - - - -2014-09-26 Steve Ellcey ---- - gcc/config/mips/mips.c | 3 +++ - libgcc/config/mips/crti.S | 4 ++++ - libgcc/config/mips/crtn.S | 3 +++ - libgcc/config/mips/mips16.S | 4 ++++ - libgcc/config/mips/vr4120-div.S | 4 ++++ - 5 files changed, 18 insertions(+) - ---- a/gcc/config/mips/mips.c -+++ b/gcc/config/mips/mips.c -@@ -22881,6 +22881,9 @@ mips_asm_file_end (void) - #define TARGET_ASM_FILE_END mips_asm_file_end - - -+#undef TARGET_ASM_FILE_END -+#define TARGET_ASM_FILE_END file_end_indicate_exec_stack -+ - struct gcc_target targetm = TARGET_INITIALIZER; - - #include "gt-mips.h" ---- a/libgcc/config/mips/crti.S -+++ b/libgcc/config/mips/crti.S -@@ -24,6 +24,10 @@ see the files COPYING3 and COPYING.RUNTI - /* An executable stack is *not* required for these functions. */ - #include "gnustack.h" - -+ -+/* An executable stack is *not* required for these functions. */ -+ .section .note.GNU-stack,"",%progbits -+ - /* 4 slots for argument spill area. 1 for cpreturn, 1 for stack. - Return spill offset of 40 and 20. Aligned to 16 bytes for n32. */ - ---- a/libgcc/config/mips/crtn.S -+++ b/libgcc/config/mips/crtn.S -@@ -24,6 +24,9 @@ see the files COPYING3 and COPYING.RUNTI - /* An executable stack is *not* required for these functions. */ - #include "gnustack.h" - -+/* An executable stack is *not* required for these functions. */ -+ .section .note.GNU-stack,"",%progbits -+ - /* 4 slots for argument spill area. 1 for cpreturn, 1 for stack. - Return spill offset of 40 and 20. Aligned to 16 bytes for n32. */ - ---- a/libgcc/config/mips/mips16.S -+++ b/libgcc/config/mips/mips16.S -@@ -51,6 +51,10 @@ see the files COPYING3 and COPYING.RUNTI - values using the soft-float calling convention, but do the actual - operation using the hard floating point instructions. */ - -+/* An executable stack is *not* required for these functions. */ -+ .section .note.GNU-stack,"",%progbits -+ .previous -+ - #if defined _MIPS_SIM && (_MIPS_SIM == _ABIO32 || _MIPS_SIM == _ABIO64) - - /* This file contains 32-bit assembly code. */ ---- a/libgcc/config/mips/vr4120-div.S -+++ b/libgcc/config/mips/vr4120-div.S -@@ -29,6 +29,10 @@ see the files COPYING3 and COPYING.RUNTI - -mfix-vr4120. div and ddiv do not give the correct result when one - of the operands is negative. */ - -+/* An executable stack is *not* required for these functions. */ -+ .section .note.GNU-stack,"",%progbits -+ .previous -+ - .set nomips16 - - #define DIV \ diff --git a/toolchain/gcc/patches/11.2.0/001-v11.3.0-ranger-Fix-up-fold_using_range-range_of_address-PR10.patch b/toolchain/gcc/patches/11.2.0/001-v11.3.0-ranger-Fix-up-fold_using_range-range_of_address-PR10.patch deleted file mode 100644 index 71bbfe5a1d..0000000000 --- a/toolchain/gcc/patches/11.2.0/001-v11.3.0-ranger-Fix-up-fold_using_range-range_of_address-PR10.patch +++ /dev/null @@ -1,114 +0,0 @@ -From a6219e8e0719b14f474b0dcaa7bde2f4e57474f9 Mon Sep 17 00:00:00 2001 -From: Jakub Jelinek -Date: Wed, 17 Nov 2021 13:45:53 +0100 -Subject: [PATCH] ranger: Fix up fold_using_range::range_of_address [PR103255] - -If on &base->member the offset isn't constant or isn't zero and --fdelete-null-pointer-checks and not -fwrapv-pointer and base has a range -that doesn't include NULL, we return the range of the base. -Usually it isn't a big deal, because for most pointers we just use -varying, range_zero and range_nonzero ranges and nothing beyond that, -but if a pointer is initialized from a constant, we actually track the -exact range and in that case this causes miscompilation. -As discussed on IRC, I think doing something like: - offset_int off2; - if (off_cst && off.is_constant (&off2)) - { - tree cst = wide_int_to_tree (sizetype, off2 / BITS_PER_UNIT); - // adjust range r with POINTER_PLUS_EXPR cst - if (!range_includes_zero_p (&r)) - return true; - } - // Fallback - r = range_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt))); - return true; -could work, given that most of the pointer ranges are just the simple ones -perhaps it is too much for little benefit. - -2021-11-17 Jakub Jelinek - - PR tree-optimization/103255 - * gimple-range.cc (fold_using_range::range_of_address): Return - range_nonzero rather than unadjusted base's range. Formatting fixes. - - * gcc.c-torture/execute/pr103255.c: New test. - -(cherry picked from commit c39cb6bf835ca12e590eaa6f90222e51be207c50) ---- - gcc/gimple-range.cc | 16 +++++--- - .../gcc.c-torture/execute/pr103255.c | 41 +++++++++++++++++++ - 2 files changed, 52 insertions(+), 5 deletions(-) - create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr103255.c - ---- a/gcc/gimple-range.cc -+++ b/gcc/gimple-range.cc -@@ -491,14 +491,20 @@ gimple_ranger::range_of_address (irange - } - /* If &X->a is equal to X, the range of X is the result. */ - if (off_cst && known_eq (off, 0)) -- return true; -+ return true; - else if (flag_delete_null_pointer_checks - && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (expr))) - { -- /* For -fdelete-null-pointer-checks -fno-wrapv-pointer we don't -- allow going from non-NULL pointer to NULL. */ -- if(!range_includes_zero_p (&r)) -- return true; -+ /* For -fdelete-null-pointer-checks -fno-wrapv-pointer we don't -+ allow going from non-NULL pointer to NULL. */ -+ if (!range_includes_zero_p (&r)) -+ { -+ /* We could here instead adjust r by off >> LOG2_BITS_PER_UNIT -+ using POINTER_PLUS_EXPR if off_cst and just fall back to -+ this. */ -+ r = range_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt))); -+ return true; -+ } - } - /* If MEM_REF has a "positive" offset, consider it non-NULL - always, for -fdelete-null-pointer-checks also "negative" ---- /dev/null -+++ b/gcc/testsuite/gcc.c-torture/execute/pr103255.c -@@ -0,0 +1,41 @@ -+/* PR tree-optimization/103255 */ -+ -+struct H -+{ -+ unsigned a; -+ unsigned b; -+ unsigned c; -+}; -+ -+#if __SIZEOF_POINTER__ >= 4 -+#define ADDR 0x400000 -+#else -+#define ADDR 0x4000 -+#endif -+#define OFF 0x20 -+ -+int -+main () -+{ -+ struct H *h = 0; -+ unsigned long o; -+ volatile int t = 1; -+ -+ for (o = OFF; o <= OFF; o += 0x1000) -+ { -+ struct H *u; -+ u = (struct H *) (ADDR + o); -+ if (t) -+ { -+ h = u; -+ break; -+ } -+ } -+ -+ if (h == 0) -+ return 0; -+ unsigned *tt = &h->b; -+ if ((__SIZE_TYPE__) tt != (ADDR + OFF + __builtin_offsetof (struct H, b))) -+ __builtin_abort (); -+ return 0; -+} diff --git a/toolchain/gcc/patches/11.2.0/010-documentation.patch b/toolchain/gcc/patches/11.2.0/010-documentation.patch deleted file mode 100644 index 885bd0301d..0000000000 --- a/toolchain/gcc/patches/11.2.0/010-documentation.patch +++ /dev/null @@ -1,35 +0,0 @@ -commit 098bd91f5eae625c7d2ee621e10930fc4434e5e2 -Author: Luka Perkov -Date: Tue Feb 26 16:16:33 2013 +0000 - - gcc: don't build documentation - - This closes #13039. - - Signed-off-by: Luka Perkov - - SVN-Revision: 35807 - ---- a/gcc/Makefile.in -+++ b/gcc/Makefile.in -@@ -3355,18 +3355,10 @@ doc/gcc.info: $(TEXI_GCC_FILES) - doc/gccint.info: $(TEXI_GCCINT_FILES) - doc/cppinternals.info: $(TEXI_CPPINT_FILES) - --doc/%.info: %.texi -- if [ x$(BUILD_INFO) = xinfo ]; then \ -- $(MAKEINFO) $(MAKEINFOFLAGS) -I . -I $(gcc_docdir) \ -- -I $(gcc_docdir)/include -o $@ $<; \ -- fi -+doc/%.info: - - # Duplicate entry to handle renaming of gccinstall.info --doc/gccinstall.info: $(TEXI_GCCINSTALL_FILES) -- if [ x$(BUILD_INFO) = xinfo ]; then \ -- $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ -- -I $(gcc_docdir)/include -o $@ $<; \ -- fi -+doc/gccinstall.info: - - doc/cpp.dvi: $(TEXI_CPP_FILES) - doc/gcc.dvi: $(TEXI_GCC_FILES) diff --git a/toolchain/gcc/patches/11.2.0/011-v12-configure-define-TARGET_LIBC_GNUSTACK-on-musl.patch b/toolchain/gcc/patches/11.2.0/011-v12-configure-define-TARGET_LIBC_GNUSTACK-on-musl.patch deleted file mode 100644 index 94105bdf9f..0000000000 --- a/toolchain/gcc/patches/11.2.0/011-v12-configure-define-TARGET_LIBC_GNUSTACK-on-musl.patch +++ /dev/null @@ -1,46 +0,0 @@ -From ea650cae26da4a8fc04f0c4666f4dd776d0b5fc0 Mon Sep 17 00:00:00 2001 -From: Ilya Lipnitskiy -Date: Sun, 14 Nov 2021 21:54:25 -0800 -Subject: [PATCH] configure: define TARGET_LIBC_GNUSTACK on musl - -musl only uses PT_GNU_STACK to set default thread stack size and has no -executable stack support[0], so there is no reason not to emit the -.note.GNU-stack section on musl builds. - -[0]: https://lore.kernel.org/all/20190423192534.GN23599@brightrain.aerifal.cx/T/#u - -gcc/ChangeLog: - - * configure: Regenerate. - * configure.ac: define TARGET_LIBC_GNUSTACK on musl - -Signed-off-by: Ilya Lipnitskiy ---- - gcc/configure | 3 +++ - gcc/configure.ac | 3 +++ - 2 files changed, 6 insertions(+) - ---- a/gcc/configure -+++ b/gcc/configure -@@ -30954,6 +30954,9 @@ fi - # Check if the target LIBC handles PT_GNU_STACK. - gcc_cv_libc_gnustack=unknown - case "$target" in -+ mips*-*-linux-musl*) -+ gcc_cv_libc_gnustack=yes -+ ;; - mips*-*-linux*) - - if test $glibc_version_major -gt 2 \ ---- a/gcc/configure.ac -+++ b/gcc/configure.ac -@@ -6788,6 +6788,9 @@ fi - # Check if the target LIBC handles PT_GNU_STACK. - gcc_cv_libc_gnustack=unknown - case "$target" in -+ mips*-*-linux-musl*) -+ gcc_cv_libc_gnustack=yes -+ ;; - mips*-*-linux*) - GCC_GLIBC_VERSION_GTE_IFELSE([2], [31], [gcc_cv_libc_gnustack=yes], ) - ;; diff --git a/toolchain/gcc/patches/11.2.0/110-Fix-MIPS-PR-84790.patch b/toolchain/gcc/patches/11.2.0/110-Fix-MIPS-PR-84790.patch deleted file mode 100644 index 82ac013d30..0000000000 --- a/toolchain/gcc/patches/11.2.0/110-Fix-MIPS-PR-84790.patch +++ /dev/null @@ -1,20 +0,0 @@ -Fix https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84790. -MIPS16 functions have a static assembler prologue which clobbers -registers v0 and v1. Add these register clobbers to function call -instructions. - ---- a/gcc/config/mips/mips.c -+++ b/gcc/config/mips/mips.c -@@ -3132,6 +3132,12 @@ mips_emit_call_insn (rtx pattern, rtx or - emit_insn (gen_update_got_version ()); - } - -+ if (TARGET_MIPS16 && TARGET_USE_GOT) -+ { -+ clobber_reg (&CALL_INSN_FUNCTION_USAGE (insn), MIPS16_PIC_TEMP); -+ clobber_reg (&CALL_INSN_FUNCTION_USAGE (insn), MIPS_PROLOGUE_TEMP (word_mode)); -+ } -+ - if (TARGET_MIPS16 - && TARGET_EXPLICIT_RELOCS - && TARGET_CALL_CLOBBERED_GP) diff --git a/toolchain/gcc/patches/11.2.0/300-mips_Os_cpu_rtx_cost_model.patch b/toolchain/gcc/patches/11.2.0/300-mips_Os_cpu_rtx_cost_model.patch deleted file mode 100644 index 8c4a5fce19..0000000000 --- a/toolchain/gcc/patches/11.2.0/300-mips_Os_cpu_rtx_cost_model.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit ecf7671b769fe96f7b5134be442089f8bdba55d2 -Author: Felix Fietkau -Date: Thu Aug 4 20:29:45 2016 +0200 - -gcc: add a patch to generate better code with Os on mips - -Also happens to reduce compressed code size a bit - -Signed-off-by: Felix Fietkau - ---- a/gcc/config/mips/mips.c -+++ b/gcc/config/mips/mips.c -@@ -20041,7 +20041,7 @@ mips_option_override (void) - flag_pcc_struct_return = 0; - - /* Decide which rtx_costs structure to use. */ -- if (optimize_size) -+ if (0 && optimize_size) - mips_cost = &mips_rtx_cost_optimize_size; - else - mips_cost = &mips_rtx_cost_data[mips_tune]; diff --git a/toolchain/gcc/patches/11.2.0/850-use_shared_libgcc.patch b/toolchain/gcc/patches/11.2.0/850-use_shared_libgcc.patch deleted file mode 100644 index 8b17f1374f..0000000000 --- a/toolchain/gcc/patches/11.2.0/850-use_shared_libgcc.patch +++ /dev/null @@ -1,54 +0,0 @@ -commit dcfc40358b5a3cae7320c17f8d1cebd5ad5540cd -Author: Felix Fietkau -Date: Sun Feb 12 20:25:47 2012 +0000 - - gcc 4.6: port over the missing patch 850-use_shared_libgcc.patch to prevent libgcc crap from leaking into every single binary - - SVN-Revision: 30486 ---- a/gcc/config/arm/linux-eabi.h -+++ b/gcc/config/arm/linux-eabi.h -@@ -132,10 +132,6 @@ - "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} " \ - LINUX_OR_ANDROID_LD (GNU_USER_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC) - --/* Use the default LIBGCC_SPEC, not the version in linux-elf.h, as we -- do not use -lfloat. */ --#undef LIBGCC_SPEC -- - /* Clear the instruction cache from `beg' to `end'. This is - implemented in lib1funcs.S, so ensure an error if this definition - is used. */ ---- a/gcc/config/linux.h -+++ b/gcc/config/linux.h -@@ -66,6 +66,10 @@ see the files COPYING3 and COPYING.RUNTI - builtin_version ("CRuntime_Musl"); \ - } while (0) - -+#ifndef LIBGCC_SPEC -+#define LIBGCC_SPEC "%{static|static-libgcc:-lgcc}%{!static:%{!static-libgcc:-lgcc_s}}" -+#endif -+ - /* Determine which dynamic linker to use depending on whether GLIBC or - uClibc or Bionic or musl is the default C library and whether - -muclibc or -mglibc or -mbionic or -mmusl has been passed to change ---- a/libgcc/mkmap-symver.awk -+++ b/libgcc/mkmap-symver.awk -@@ -136,5 +136,5 @@ function output(lib) { - else if (inherit[lib]) - printf("} %s;\n", inherit[lib]); - else -- printf ("\n local:\n\t*;\n};\n"); -+ printf ("\n\t*;\n};\n"); - } ---- a/gcc/config/rs6000/linux.h -+++ b/gcc/config/rs6000/linux.h -@@ -62,6 +62,9 @@ - #undef CPP_OS_DEFAULT_SPEC - #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" - -+#undef LIBGCC_SPEC -+#define LIBGCC_SPEC "%{!static:%{!static-libgcc:-lgcc_s}} -lgcc" -+ - #undef LINK_SHLIB_SPEC - #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}} \ - %{static-pie:-static -pie --no-dynamic-linker -z text}" diff --git a/toolchain/gcc/patches/11.2.0/870-ppc_no_crtsavres.patch b/toolchain/gcc/patches/11.2.0/870-ppc_no_crtsavres.patch deleted file mode 100644 index bc182f0cec..0000000000 --- a/toolchain/gcc/patches/11.2.0/870-ppc_no_crtsavres.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/gcc/config/rs6000/rs6000-logue.c -+++ b/gcc/config/rs6000/rs6000-logue.c -@@ -348,7 +348,7 @@ rs6000_savres_strategy (rs6000_stack_t * - /* Define cutoff for using out-of-line functions to save registers. */ - if (DEFAULT_ABI == ABI_V4 || TARGET_ELF) - { -- if (!optimize_size) -+ if (1) - { - strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS; - strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS; diff --git a/toolchain/gcc/patches/11.2.0/910-mbsd_multi.patch b/toolchain/gcc/patches/11.2.0/910-mbsd_multi.patch deleted file mode 100644 index 9f9d3226e8..0000000000 --- a/toolchain/gcc/patches/11.2.0/910-mbsd_multi.patch +++ /dev/null @@ -1,146 +0,0 @@ -commit 99368862e44740ff4fd33760893f04e14f9dbdf1 -Author: Felix Fietkau -Date: Tue Jul 31 00:52:27 2007 +0000 - - Port the mbsd_multi patch from freewrt, which adds -fhonour-copts. This will emit warnings in packages that don't use our target cflags properly - - SVN-Revision: 8256 - - This patch brings over a feature from MirBSD: - * -fhonour-copts - If this option is not given, it's warned (depending - on environment variables). This is to catch errors - of misbuilt packages which override CFLAGS themselves. - - This patch was authored by Thorsten Glaser - with copyright assignment to the FSF in effect. - ---- a/gcc/c-family/c-opts.c -+++ b/gcc/c-family/c-opts.c -@@ -107,6 +107,9 @@ static dump_flags_t original_dump_flags; - /* Whether any standard preincluded header has been preincluded. */ - static bool done_preinclude; - -+/* Check if a port honours COPTS. */ -+static int honour_copts = 0; -+ - static void handle_OPT_d (const char *); - static void set_std_cxx98 (int); - static void set_std_cxx11 (int); -@@ -469,6 +472,12 @@ c_common_handle_option (size_t scode, co - flag_no_builtin = !value; - break; - -+ case OPT_fhonour_copts: -+ if (c_language == clk_c) { -+ honour_copts++; -+ } -+ break; -+ - case OPT_fconstant_string_class_: - constant_string_class_name = arg; - break; -@@ -1196,6 +1205,47 @@ c_common_init (void) - return false; - } - -+ if (c_language == clk_c) { -+ char *ev = getenv ("GCC_HONOUR_COPTS"); -+ int evv; -+ if (ev == NULL) -+ evv = -1; -+ else if ((*ev == '0') || (*ev == '\0')) -+ evv = 0; -+ else if (*ev == '1') -+ evv = 1; -+ else if (*ev == '2') -+ evv = 2; -+ else if (*ev == 's') -+ evv = -1; -+ else { -+ warning (0, "unknown GCC_HONOUR_COPTS value, assuming 1"); -+ evv = 1; /* maybe depend this on something like MIRBSD_NATIVE? */ -+ } -+ if (evv == 1) { -+ if (honour_copts == 0) { -+ error ("someone does not honour COPTS at all in lenient mode"); -+ return false; -+ } else if (honour_copts != 1) { -+ warning (0, "someone does not honour COPTS correctly, passed %d times", -+ honour_copts); -+ } -+ } else if (evv == 2) { -+ if (honour_copts == 0) { -+ error ("someone does not honour COPTS at all in strict mode"); -+ return false; -+ } else if (honour_copts != 1) { -+ error ("someone does not honour COPTS correctly, passed %d times", -+ honour_copts); -+ return false; -+ } -+ } else if (evv == 0) { -+ if (honour_copts != 1) -+ inform (UNKNOWN_LOCATION, "someone does not honour COPTS correctly, passed %d times", -+ honour_copts); -+ } -+ } -+ - return true; - } - ---- a/gcc/c-family/c.opt -+++ b/gcc/c-family/c.opt -@@ -1663,6 +1663,9 @@ C++ ObjC++ Optimization Alias(fexception - fhonor-std - C++ ObjC++ WarnRemoved - -+fhonour-copts -+C ObjC C++ ObjC++ RejectNegative -+ - fhosted - C ObjC - Assume normal C execution environment. ---- a/gcc/common.opt -+++ b/gcc/common.opt -@@ -1698,6 +1698,9 @@ fguess-branch-probability - Common Var(flag_guess_branch_prob) Optimization - Enable guessing of branch probabilities. - -+fhonour-copts -+Common RejectNegative -+ - ; Nonzero means ignore `#ident' directives. 0 means handle them. - ; Generate position-independent code for executables if possible - ; On SVR4 targets, it also controls whether or not to emit a ---- a/gcc/doc/invoke.texi -+++ b/gcc/doc/invoke.texi -@@ -9055,6 +9055,17 @@ This option is only supported for C and - @option{-Wall} and by @option{-Wpedantic}, which can be disabled with - @option{-Wno-pointer-sign}. - -+@item -fhonour-copts -+@opindex fhonour-copts -+If @env{GCC_HONOUR_COPTS} is set to 1, abort if this option is not -+given at least once, and warn if it is given more than once. -+If @env{GCC_HONOUR_COPTS} is set to 2, abort if this option is not -+given exactly once. -+If @env{GCC_HONOUR_COPTS} is set to 0 or unset, warn if this option -+is not given exactly once. -+The warning is quelled if @env{GCC_HONOUR_COPTS} is set to @samp{s}. -+This flag and environment variable only affect the C language. -+ - @item -Wstack-protector - @opindex Wstack-protector - @opindex Wno-stack-protector ---- a/gcc/opts.c -+++ b/gcc/opts.c -@@ -2448,6 +2448,9 @@ common_handle_option (struct gcc_options - /* Currently handled in a prescan. */ - break; - -+ case OPT_fhonour_copts: -+ break; -+ - case OPT_Werror: - dc->warning_as_error_requested = value; - break; diff --git a/toolchain/gcc/patches/11.2.0/920-specs_nonfatal_getenv.patch b/toolchain/gcc/patches/11.2.0/920-specs_nonfatal_getenv.patch deleted file mode 100644 index dda33c0202..0000000000 --- a/toolchain/gcc/patches/11.2.0/920-specs_nonfatal_getenv.patch +++ /dev/null @@ -1,22 +0,0 @@ -Author: Jo-Philipp Wich -Date: Sat Apr 21 03:02:39 2012 +0000 - - gcc: add patch to make the getenv() spec function nonfatal if requested environment variable is unset - - SVN-Revision: 31390 - ---- a/gcc/gcc.c -+++ b/gcc/gcc.c -@@ -10100,8 +10100,10 @@ getenv_spec_function (int argc, const ch - } - - if (!value) -- fatal_error (input_location, -- "environment variable %qs not defined", varname); -+ { -+ warning (input_location, "environment variable %qs not defined", varname); -+ value = ""; -+ } - - /* We have to escape every character of the environment variable so - they are not interpreted as active spec characters. A diff --git a/toolchain/gcc/patches/11.2.0/931-libffi-fix-MIPS-softfloat-build-issue.patch b/toolchain/gcc/patches/11.2.0/931-libffi-fix-MIPS-softfloat-build-issue.patch deleted file mode 100644 index fb4cb1533a..0000000000 --- a/toolchain/gcc/patches/11.2.0/931-libffi-fix-MIPS-softfloat-build-issue.patch +++ /dev/null @@ -1,168 +0,0 @@ -From c0c62fa4256f805389f16ebfc4a60cf789129b50 Mon Sep 17 00:00:00 2001 -From: BangLang Huang -Date: Wed, 9 Nov 2016 10:36:49 +0800 -Subject: [PATCH] libffi: fix MIPS softfloat build issue - -Backported from github.com/libffi/libffi#272 - -Signed-off-by: BangLang Huang -Signed-off-by: Yousong Zhou ---- - libffi/src/mips/n32.S | 17 +++++++++++++++++ - libffi/src/mips/o32.S | 17 +++++++++++++++++ - 2 files changed, 34 insertions(+) - ---- a/libffi/src/mips/n32.S -+++ b/libffi/src/mips/n32.S -@@ -107,6 +107,16 @@ loadregs: - - REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6. - -+#ifdef __mips_soft_float -+ REG_L a0, 0*FFI_SIZEOF_ARG(t9) -+ REG_L a1, 1*FFI_SIZEOF_ARG(t9) -+ REG_L a2, 2*FFI_SIZEOF_ARG(t9) -+ REG_L a3, 3*FFI_SIZEOF_ARG(t9) -+ REG_L a4, 4*FFI_SIZEOF_ARG(t9) -+ REG_L a5, 5*FFI_SIZEOF_ARG(t9) -+ REG_L a6, 6*FFI_SIZEOF_ARG(t9) -+ REG_L a7, 7*FFI_SIZEOF_ARG(t9) -+#else - and t4, t6, ((1< -Date: Sun Oct 19 21:45:51 2014 +0000 - - gcc: do not assume that the Mac OS X filesystem is case insensitive - - Signed-off-by: Felix Fietkau - - SVN-Revision: 42973 - ---- a/include/filenames.h -+++ b/include/filenames.h -@@ -43,11 +43,6 @@ extern "C" { - # define IS_DIR_SEPARATOR(c) IS_DOS_DIR_SEPARATOR (c) - # define IS_ABSOLUTE_PATH(f) IS_DOS_ABSOLUTE_PATH (f) - #else /* not DOSish */ --# if defined(__APPLE__) --# ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM --# define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1 --# endif --# endif /* __APPLE__ */ - # define HAS_DRIVE_SPEC(f) (0) - # define IS_DIR_SEPARATOR(c) IS_UNIX_DIR_SEPARATOR (c) - # define IS_ABSOLUTE_PATH(f) IS_UNIX_ABSOLUTE_PATH (f) diff --git a/toolchain/gcc/patches/8.4.0/010-documentation.patch b/toolchain/gcc/patches/8.4.0/010-documentation.patch deleted file mode 100644 index c7e3d4ad55..0000000000 --- a/toolchain/gcc/patches/8.4.0/010-documentation.patch +++ /dev/null @@ -1,35 +0,0 @@ -commit 098bd91f5eae625c7d2ee621e10930fc4434e5e2 -Author: Luka Perkov -Date: Tue Feb 26 16:16:33 2013 +0000 - - gcc: don't build documentation - - This closes #13039. - - Signed-off-by: Luka Perkov - - SVN-Revision: 35807 - ---- a/gcc/Makefile.in -+++ b/gcc/Makefile.in -@@ -3204,18 +3204,10 @@ doc/gcc.info: $(TEXI_GCC_FILES) - doc/gccint.info: $(TEXI_GCCINT_FILES) - doc/cppinternals.info: $(TEXI_CPPINT_FILES) - --doc/%.info: %.texi -- if [ x$(BUILD_INFO) = xinfo ]; then \ -- $(MAKEINFO) $(MAKEINFOFLAGS) -I . -I $(gcc_docdir) \ -- -I $(gcc_docdir)/include -o $@ $<; \ -- fi -+doc/%.info: - - # Duplicate entry to handle renaming of gccinstall.info --doc/gccinstall.info: $(TEXI_GCCINSTALL_FILES) -- if [ x$(BUILD_INFO) = xinfo ]; then \ -- $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ -- -I $(gcc_docdir)/include -o $@ $<; \ -- fi -+doc/gccinstall.info: - - doc/cpp.dvi: $(TEXI_CPP_FILES) - doc/gcc.dvi: $(TEXI_GCC_FILES) diff --git a/toolchain/gcc/patches/8.4.0/110-Fix-MIPS-PR-84790.patch b/toolchain/gcc/patches/8.4.0/110-Fix-MIPS-PR-84790.patch deleted file mode 100644 index b89eca2faf..0000000000 --- a/toolchain/gcc/patches/8.4.0/110-Fix-MIPS-PR-84790.patch +++ /dev/null @@ -1,20 +0,0 @@ -Fix https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84790. -MIPS16 functions have a static assembler prologue which clobbers -registers v0 and v1. Add these register clobbers to function call -instructions. - ---- a/gcc/config/mips/mips.c -+++ b/gcc/config/mips/mips.c -@@ -3102,6 +3102,12 @@ mips_emit_call_insn (rtx pattern, rtx or - emit_insn (gen_update_got_version ()); - } - -+ if (TARGET_MIPS16 && TARGET_USE_GOT) -+ { -+ clobber_reg (&CALL_INSN_FUNCTION_USAGE (insn), MIPS16_PIC_TEMP); -+ clobber_reg (&CALL_INSN_FUNCTION_USAGE (insn), MIPS_PROLOGUE_TEMP (word_mode)); -+ } -+ - if (TARGET_MIPS16 - && TARGET_EXPLICIT_RELOCS - && TARGET_CALL_CLOBBERED_GP) diff --git a/toolchain/gcc/patches/8.4.0/230-musl_libssp.patch b/toolchain/gcc/patches/8.4.0/230-musl_libssp.patch deleted file mode 100644 index b3ab79cafb..0000000000 --- a/toolchain/gcc/patches/8.4.0/230-musl_libssp.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/gcc/gcc.c -+++ b/gcc/gcc.c -@@ -868,7 +868,9 @@ proper position among the other output f - #endif - - #ifndef LINK_SSP_SPEC --#ifdef TARGET_LIBC_PROVIDES_SSP -+#if DEFAULT_LIBC == LIBC_MUSL -+#define LINK_SSP_SPEC "-lssp_nonshared" -+#elif defined(TARGET_LIBC_PROVIDES_SSP) - #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \ - "|fstack-protector-strong|fstack-protector-explicit:}" - #else diff --git a/toolchain/gcc/patches/8.4.0/300-mips_Os_cpu_rtx_cost_model.patch b/toolchain/gcc/patches/8.4.0/300-mips_Os_cpu_rtx_cost_model.patch deleted file mode 100644 index 2e2c609e48..0000000000 --- a/toolchain/gcc/patches/8.4.0/300-mips_Os_cpu_rtx_cost_model.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit ecf7671b769fe96f7b5134be442089f8bdba55d2 -Author: Felix Fietkau -Date: Thu Aug 4 20:29:45 2016 +0200 - -gcc: add a patch to generate better code with Os on mips - -Also happens to reduce compressed code size a bit - -Signed-off-by: Felix Fietkau - ---- a/gcc/config/mips/mips.c -+++ b/gcc/config/mips/mips.c -@@ -19847,7 +19847,7 @@ mips_option_override (void) - flag_pcc_struct_return = 0; - - /* Decide which rtx_costs structure to use. */ -- if (optimize_size) -+ if (0 && optimize_size) - mips_cost = &mips_rtx_cost_optimize_size; - else - mips_cost = &mips_rtx_cost_data[mips_tune]; diff --git a/toolchain/gcc/patches/8.4.0/800-arm_v5te_no_ldrd_strd.patch b/toolchain/gcc/patches/8.4.0/800-arm_v5te_no_ldrd_strd.patch deleted file mode 100644 index 172295f28b..0000000000 --- a/toolchain/gcc/patches/8.4.0/800-arm_v5te_no_ldrd_strd.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/gcc/config/arm/arm.h -+++ b/gcc/config/arm/arm.h -@@ -155,7 +155,7 @@ extern tree arm_fp16_type_node; - /* Thumb-1 only. */ - #define TARGET_THUMB1_ONLY (TARGET_THUMB1 && !arm_arch_notm) - --#define TARGET_LDRD (arm_arch5e && ARM_DOUBLEWORD_ALIGN \ -+#define TARGET_LDRD (arm_arch6 && ARM_DOUBLEWORD_ALIGN \ - && !TARGET_THUMB1) - - #define TARGET_CRC32 (arm_arch_crc) diff --git a/toolchain/gcc/patches/8.4.0/820-libgcc_pic.patch b/toolchain/gcc/patches/8.4.0/820-libgcc_pic.patch deleted file mode 100644 index 1a9678d480..0000000000 --- a/toolchain/gcc/patches/8.4.0/820-libgcc_pic.patch +++ /dev/null @@ -1,44 +0,0 @@ -commit c96312958c0621e72c9b32da5bc224ffe2161384 -Author: Felix Fietkau -Date: Mon Oct 19 23:26:09 2009 +0000 - - gcc: create a proper libgcc_pic.a static library for relinking (4.3.3+ for now, backport will follow) - - SVN-Revision: 18086 - ---- a/libgcc/Makefile.in -+++ b/libgcc/Makefile.in -@@ -923,11 +923,12 @@ $(libgcov-driver-objects): %$(objext): $ - - # Static libraries. - libgcc.a: $(libgcc-objects) -+libgcc_pic.a: $(libgcc-s-objects) - libgcov.a: $(libgcov-objects) - libunwind.a: $(libunwind-objects) - libgcc_eh.a: $(libgcc-eh-objects) - --libgcc.a libgcov.a libunwind.a libgcc_eh.a: -+libgcc.a libgcov.a libunwind.a libgcc_eh.a libgcc_pic.a: - -rm -f $@ - - objects="$(objects)"; \ -@@ -948,7 +949,7 @@ all: libunwind.a - endif - - ifeq ($(enable_shared),yes) --all: libgcc_eh.a libgcc_s$(SHLIB_EXT) -+all: libgcc_eh.a libgcc_pic.a libgcc_s$(SHLIB_EXT) - ifneq ($(LIBUNWIND),) - all: libunwind$(SHLIB_EXT) - libgcc_s$(SHLIB_EXT): libunwind$(SHLIB_EXT) -@@ -1154,6 +1155,10 @@ install-shared: - chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_eh.a - $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_eh.a - -+ $(INSTALL_DATA) libgcc_pic.a $(mapfile) $(DESTDIR)$(inst_libdir)/ -+ chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_pic.a -+ $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_pic.a -+ - $(subst @multilib_dir@,$(MULTIDIR),$(subst \ - @shlib_base_name@,libgcc_s,$(subst \ - @shlib_slibdir_qual@,$(MULTIOSSUBDIR),$(SHLIB_INSTALL)))) diff --git a/toolchain/gcc/patches/8.4.0/840-armv4_pass_fix-v4bx_to_ld.patch b/toolchain/gcc/patches/8.4.0/840-armv4_pass_fix-v4bx_to_ld.patch deleted file mode 100644 index b9c9b161ad..0000000000 --- a/toolchain/gcc/patches/8.4.0/840-armv4_pass_fix-v4bx_to_ld.patch +++ /dev/null @@ -1,28 +0,0 @@ -commit 7edc8ca5456d9743dd0075eb3cc5b04f4f24c8cc -Author: Imre Kaloz -Date: Wed Feb 2 19:34:36 2011 +0000 - - add armv4 fixup patches - - SVN-Revision: 25322 - - ---- a/gcc/config/arm/linux-eabi.h -+++ b/gcc/config/arm/linux-eabi.h -@@ -88,10 +88,15 @@ - #define MUSL_DYNAMIC_LINKER \ - "/lib/ld-musl-arm" MUSL_DYNAMIC_LINKER_E "%{mfloat-abi=hard:hf}.so.1" - -+/* For armv4 we pass --fix-v4bx to linker to support EABI */ -+#undef TARGET_FIX_V4BX_SPEC -+#define TARGET_FIX_V4BX_SPEC " %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*"\ -+ "|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx}" -+ - /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to - use the GNU/Linux version, not the generic BPABI version. */ - #undef LINK_SPEC --#define LINK_SPEC EABI_LINK_SPEC \ -+#define LINK_SPEC EABI_LINK_SPEC TARGET_FIX_V4BX_SPEC \ - LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC, \ - LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC) - diff --git a/toolchain/gcc/patches/8.4.0/850-use_shared_libgcc.patch b/toolchain/gcc/patches/8.4.0/850-use_shared_libgcc.patch deleted file mode 100644 index f619f0e6a1..0000000000 --- a/toolchain/gcc/patches/8.4.0/850-use_shared_libgcc.patch +++ /dev/null @@ -1,54 +0,0 @@ -commit dcfc40358b5a3cae7320c17f8d1cebd5ad5540cd -Author: Felix Fietkau -Date: Sun Feb 12 20:25:47 2012 +0000 - - gcc 4.6: port over the missing patch 850-use_shared_libgcc.patch to prevent libgcc crap from leaking into every single binary - - SVN-Revision: 30486 ---- a/gcc/config/arm/linux-eabi.h -+++ b/gcc/config/arm/linux-eabi.h -@@ -126,10 +126,6 @@ - "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} " \ - LINUX_OR_ANDROID_LD (GNU_USER_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC) - --/* Use the default LIBGCC_SPEC, not the version in linux-elf.h, as we -- do not use -lfloat. */ --#undef LIBGCC_SPEC -- - /* Clear the instruction cache from `beg' to `end'. This is - implemented in lib1funcs.S, so ensure an error if this definition - is used. */ ---- a/gcc/config/linux.h -+++ b/gcc/config/linux.h -@@ -53,6 +53,10 @@ see the files COPYING3 and COPYING.RUNTI - builtin_assert ("system=posix"); \ - } while (0) - -+#ifndef LIBGCC_SPEC -+#define LIBGCC_SPEC "%{static|static-libgcc:-lgcc}%{!static:%{!static-libgcc:-lgcc_s}}" -+#endif -+ - /* Determine which dynamic linker to use depending on whether GLIBC or - uClibc or Bionic or musl is the default C library and whether - -muclibc or -mglibc or -mbionic or -mmusl has been passed to change ---- a/libgcc/mkmap-symver.awk -+++ b/libgcc/mkmap-symver.awk -@@ -136,5 +136,5 @@ function output(lib) { - else if (inherit[lib]) - printf("} %s;\n", inherit[lib]); - else -- printf ("\n local:\n\t*;\n};\n"); -+ printf ("\n\t*;\n};\n"); - } ---- a/gcc/config/rs6000/linux.h -+++ b/gcc/config/rs6000/linux.h -@@ -60,6 +60,9 @@ - #undef CPP_OS_DEFAULT_SPEC - #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" - -+#undef LIBGCC_SPEC -+#define LIBGCC_SPEC "%{!static:%{!static-libgcc:-lgcc_s}} -lgcc" -+ - #undef LINK_SHLIB_SPEC - #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}} \ - %{static-pie:-static -pie --no-dynamic-linker -z text}" diff --git a/toolchain/gcc/patches/8.4.0/870-ppc_no_crtsavres.patch b/toolchain/gcc/patches/8.4.0/870-ppc_no_crtsavres.patch deleted file mode 100644 index 51d11c3d85..0000000000 --- a/toolchain/gcc/patches/8.4.0/870-ppc_no_crtsavres.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/gcc/config/rs6000/rs6000.c -+++ b/gcc/config/rs6000/rs6000.c -@@ -24780,7 +24780,7 @@ rs6000_savres_strategy (rs6000_stack_t * - /* Define cutoff for using out-of-line functions to save registers. */ - if (DEFAULT_ABI == ABI_V4 || TARGET_ELF) - { -- if (!optimize_size) -+ if (1) - { - strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS; - strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS; diff --git a/toolchain/gcc/patches/8.4.0/881-no_tm_section.patch b/toolchain/gcc/patches/8.4.0/881-no_tm_section.patch deleted file mode 100644 index fab5db3be5..0000000000 --- a/toolchain/gcc/patches/8.4.0/881-no_tm_section.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/libgcc/crtstuff.c -+++ b/libgcc/crtstuff.c -@@ -152,7 +152,7 @@ call_ ## FUNC (void) \ - #endif - - #if !defined(USE_TM_CLONE_REGISTRY) && defined(OBJECT_FORMAT_ELF) --# define USE_TM_CLONE_REGISTRY 1 -+# define USE_TM_CLONE_REGISTRY 0 - #endif - - /* We do not want to add the weak attribute to the declarations of these diff --git a/toolchain/gcc/patches/8.4.0/910-mbsd_multi.patch b/toolchain/gcc/patches/8.4.0/910-mbsd_multi.patch deleted file mode 100644 index c566ea35e5..0000000000 --- a/toolchain/gcc/patches/8.4.0/910-mbsd_multi.patch +++ /dev/null @@ -1,146 +0,0 @@ -commit 99368862e44740ff4fd33760893f04e14f9dbdf1 -Author: Felix Fietkau -Date: Tue Jul 31 00:52:27 2007 +0000 - - Port the mbsd_multi patch from freewrt, which adds -fhonour-copts. This will emit warnings in packages that don't use our target cflags properly - - SVN-Revision: 8256 - - This patch brings over a feature from MirBSD: - * -fhonour-copts - If this option is not given, it's warned (depending - on environment variables). This is to catch errors - of misbuilt packages which override CFLAGS themselves. - - This patch was authored by Thorsten Glaser - with copyright assignment to the FSF in effect. - ---- a/gcc/c-family/c-opts.c -+++ b/gcc/c-family/c-opts.c -@@ -107,6 +107,9 @@ static dump_flags_t original_dump_flags; - /* Whether any standard preincluded header has been preincluded. */ - static bool done_preinclude; - -+/* Check if a port honours COPTS. */ -+static int honour_copts = 0; -+ - static void handle_OPT_d (const char *); - static void set_std_cxx98 (int); - static void set_std_cxx11 (int); -@@ -459,6 +462,12 @@ c_common_handle_option (size_t scode, co - flag_no_builtin = !value; - break; - -+ case OPT_fhonour_copts: -+ if (c_language == clk_c) { -+ honour_copts++; -+ } -+ break; -+ - case OPT_fconstant_string_class_: - constant_string_class_name = arg; - break; -@@ -1125,6 +1134,47 @@ c_common_init (void) - return false; - } - -+ if (c_language == clk_c) { -+ char *ev = getenv ("GCC_HONOUR_COPTS"); -+ int evv; -+ if (ev == NULL) -+ evv = -1; -+ else if ((*ev == '0') || (*ev == '\0')) -+ evv = 0; -+ else if (*ev == '1') -+ evv = 1; -+ else if (*ev == '2') -+ evv = 2; -+ else if (*ev == 's') -+ evv = -1; -+ else { -+ warning (0, "unknown GCC_HONOUR_COPTS value, assuming 1"); -+ evv = 1; /* maybe depend this on something like MIRBSD_NATIVE? */ -+ } -+ if (evv == 1) { -+ if (honour_copts == 0) { -+ error ("someone does not honour COPTS at all in lenient mode"); -+ return false; -+ } else if (honour_copts != 1) { -+ warning (0, "someone does not honour COPTS correctly, passed %d times", -+ honour_copts); -+ } -+ } else if (evv == 2) { -+ if (honour_copts == 0) { -+ error ("someone does not honour COPTS at all in strict mode"); -+ return false; -+ } else if (honour_copts != 1) { -+ error ("someone does not honour COPTS correctly, passed %d times", -+ honour_copts); -+ return false; -+ } -+ } else if (evv == 0) { -+ if (honour_copts != 1) -+ inform (UNKNOWN_LOCATION, "someone does not honour COPTS correctly, passed %d times", -+ honour_copts); -+ } -+ } -+ - return true; - } - ---- a/gcc/c-family/c.opt -+++ b/gcc/c-family/c.opt -@@ -1469,6 +1469,9 @@ C++ ObjC++ Optimization Alias(fexception - fhonor-std - C++ ObjC++ Ignore Warn(switch %qs is no longer supported) - -+fhonour-copts -+C ObjC C++ ObjC++ RejectNegative -+ - fhosted - C ObjC - Assume normal C execution environment. ---- a/gcc/common.opt -+++ b/gcc/common.opt -@@ -1551,6 +1551,9 @@ fguess-branch-probability - Common Report Var(flag_guess_branch_prob) Optimization - Enable guessing of branch probabilities. - -+fhonour-copts -+Common RejectNegative -+ - ; Nonzero means ignore `#ident' directives. 0 means handle them. - ; Generate position-independent code for executables if possible - ; On SVR4 targets, it also controls whether or not to emit a ---- a/gcc/opts.c -+++ b/gcc/opts.c -@@ -2073,6 +2073,9 @@ common_handle_option (struct gcc_options - opts, opts_set, loc, dc); - break; - -+ case OPT_fhonour_copts: -+ break; -+ - case OPT_Wlarger_than_: - opts->x_larger_than_size = value; - opts->x_warn_larger_than = value != -1; ---- a/gcc/doc/invoke.texi -+++ b/gcc/doc/invoke.texi -@@ -7013,6 +7013,17 @@ This option is only supported for C and - @option{-Wall} and by @option{-Wpedantic}, which can be disabled with - @option{-Wno-pointer-sign}. - -+@item -fhonour-copts -+@opindex fhonour-copts -+If @env{GCC_HONOUR_COPTS} is set to 1, abort if this option is not -+given at least once, and warn if it is given more than once. -+If @env{GCC_HONOUR_COPTS} is set to 2, abort if this option is not -+given exactly once. -+If @env{GCC_HONOUR_COPTS} is set to 0 or unset, warn if this option -+is not given exactly once. -+The warning is quelled if @env{GCC_HONOUR_COPTS} is set to @samp{s}. -+This flag and environment variable only affect the C language. -+ - @item -Wstack-protector - @opindex Wstack-protector - @opindex Wno-stack-protector diff --git a/toolchain/gcc/patches/8.4.0/920-specs_nonfatal_getenv.patch b/toolchain/gcc/patches/8.4.0/920-specs_nonfatal_getenv.patch deleted file mode 100644 index c3836e63af..0000000000 --- a/toolchain/gcc/patches/8.4.0/920-specs_nonfatal_getenv.patch +++ /dev/null @@ -1,22 +0,0 @@ -Author: Jo-Philipp Wich -Date: Sat Apr 21 03:02:39 2012 +0000 - - gcc: add patch to make the getenv() spec function nonfatal if requested environment variable is unset - - SVN-Revision: 31390 - ---- a/gcc/gcc.c -+++ b/gcc/gcc.c -@@ -9347,8 +9347,10 @@ getenv_spec_function (int argc, const ch - value = varname; - - if (!value) -- fatal_error (input_location, -- "environment variable %qs not defined", varname); -+ { -+ warning (input_location, "environment variable %qs not defined", varname); -+ value = ""; -+ } - - /* We have to escape every character of the environment variable so - they are not interpreted as active spec characters. A diff --git a/toolchain/gcc/patches/8.4.0/930-fix-mips-noexecstack.patch b/toolchain/gcc/patches/8.4.0/930-fix-mips-noexecstack.patch deleted file mode 100644 index ed8ada22a1..0000000000 --- a/toolchain/gcc/patches/8.4.0/930-fix-mips-noexecstack.patch +++ /dev/null @@ -1,111 +0,0 @@ -From da45b3fde60095756f5f6030f6012c23a3d34429 Mon Sep 17 00:00:00 2001 -From: Andrew McDonnell -Date: Fri, 3 Oct 2014 19:09:00 +0930 -Subject: Add .note.GNU-stack section - -See http://lists.busybox.net/pipermail/uclibc/2014-October/048671.html -Below copied from https://gcc.gnu.org/ml/gcc-patches/2014-09/msg02430.html - -Re: [Patch, MIPS] Add .note.GNU-stack section - - From: Steve Ellcey - -On Wed, 2014-09-10 at 10:15 -0700, Eric Christopher wrote: -> -> -> On Wed, Sep 10, 2014 at 9:27 AM, wrote: - -> This works except you did not update the assembly files in -> libgcc or glibc. We (Cavium) have the same patch in our tree -> for a few released versions. - -> Mind just checking yours in then Andrew? - -> Thanks! -> -eric - -I talked to Andrew about what files he changed in GCC and created and -tested this new patch. Andrew also mentioned changing some assembly -files in glibc but I don't see any use of '.section .note.GNU-stack' in -any assembly files in glibc (for any platform) so I wasn't planning on -creating a glibc to add them to mips glibc assembly language files. - -OK to check in this patch? - -Steve Ellcey -sellcey@mips.com - - - -2014-09-26 Steve Ellcey ---- - gcc/config/mips/mips.c | 3 +++ - libgcc/config/mips/crti.S | 4 ++++ - libgcc/config/mips/crtn.S | 3 +++ - libgcc/config/mips/mips16.S | 4 ++++ - libgcc/config/mips/vr4120-div.S | 4 ++++ - 5 files changed, 18 insertions(+) - ---- a/gcc/config/mips/mips.c -+++ b/gcc/config/mips/mips.c -@@ -22640,6 +22640,9 @@ mips_starting_frame_offset (void) - #undef TARGET_STARTING_FRAME_OFFSET - #define TARGET_STARTING_FRAME_OFFSET mips_starting_frame_offset - -+#undef TARGET_ASM_FILE_END -+#define TARGET_ASM_FILE_END file_end_indicate_exec_stack -+ - struct gcc_target targetm = TARGET_INITIALIZER; - - #include "gt-mips.h" ---- a/libgcc/config/mips/crti.S -+++ b/libgcc/config/mips/crti.S -@@ -21,6 +21,10 @@ a copy of the GCC Runtime Library Except - see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - . */ - -+ -+/* An executable stack is *not* required for these functions. */ -+ .section .note.GNU-stack,"",%progbits -+ - /* 4 slots for argument spill area. 1 for cpreturn, 1 for stack. - Return spill offset of 40 and 20. Aligned to 16 bytes for n32. */ - ---- a/libgcc/config/mips/crtn.S -+++ b/libgcc/config/mips/crtn.S -@@ -21,6 +21,9 @@ a copy of the GCC Runtime Library Except - see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - . */ - -+/* An executable stack is *not* required for these functions. */ -+ .section .note.GNU-stack,"",%progbits -+ - /* 4 slots for argument spill area. 1 for cpreturn, 1 for stack. - Return spill offset of 40 and 20. Aligned to 16 bytes for n32. */ - ---- a/libgcc/config/mips/mips16.S -+++ b/libgcc/config/mips/mips16.S -@@ -48,6 +48,10 @@ see the files COPYING3 and COPYING.RUNTI - values using the soft-float calling convention, but do the actual - operation using the hard floating point instructions. */ - -+/* An executable stack is *not* required for these functions. */ -+ .section .note.GNU-stack,"",%progbits -+ .previous -+ - #if defined _MIPS_SIM && (_MIPS_SIM == _ABIO32 || _MIPS_SIM == _ABIO64) - - /* This file contains 32-bit assembly code. */ ---- a/libgcc/config/mips/vr4120-div.S -+++ b/libgcc/config/mips/vr4120-div.S -@@ -26,6 +26,10 @@ see the files COPYING3 and COPYING.RUNTI - -mfix-vr4120. div and ddiv do not give the correct result when one - of the operands is negative. */ - -+/* An executable stack is *not* required for these functions. */ -+ .section .note.GNU-stack,"",%progbits -+ .previous -+ - .set nomips16 - - #define DIV \ diff --git a/toolchain/gcc/patches/8.4.0/931-libffi-fix-MIPS-softfloat-build-issue.patch b/toolchain/gcc/patches/8.4.0/931-libffi-fix-MIPS-softfloat-build-issue.patch deleted file mode 100644 index fb4cb1533a..0000000000 --- a/toolchain/gcc/patches/8.4.0/931-libffi-fix-MIPS-softfloat-build-issue.patch +++ /dev/null @@ -1,168 +0,0 @@ -From c0c62fa4256f805389f16ebfc4a60cf789129b50 Mon Sep 17 00:00:00 2001 -From: BangLang Huang -Date: Wed, 9 Nov 2016 10:36:49 +0800 -Subject: [PATCH] libffi: fix MIPS softfloat build issue - -Backported from github.com/libffi/libffi#272 - -Signed-off-by: BangLang Huang -Signed-off-by: Yousong Zhou ---- - libffi/src/mips/n32.S | 17 +++++++++++++++++ - libffi/src/mips/o32.S | 17 +++++++++++++++++ - 2 files changed, 34 insertions(+) - ---- a/libffi/src/mips/n32.S -+++ b/libffi/src/mips/n32.S -@@ -107,6 +107,16 @@ loadregs: - - REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6. - -+#ifdef __mips_soft_float -+ REG_L a0, 0*FFI_SIZEOF_ARG(t9) -+ REG_L a1, 1*FFI_SIZEOF_ARG(t9) -+ REG_L a2, 2*FFI_SIZEOF_ARG(t9) -+ REG_L a3, 3*FFI_SIZEOF_ARG(t9) -+ REG_L a4, 4*FFI_SIZEOF_ARG(t9) -+ REG_L a5, 5*FFI_SIZEOF_ARG(t9) -+ REG_L a6, 6*FFI_SIZEOF_ARG(t9) -+ REG_L a7, 7*FFI_SIZEOF_ARG(t9) -+#else - and t4, t6, ((1< -Date: Fri, 4 May 2018 18:20:53 +0800 -Subject: [PATCH] gotools: fix compilation when making cross compiler - -libgo is "the runtime support library for the Go programming language. -This library is intended for use with the Go frontend." - -gccgo will link target files with libgo.so which depends on libgcc_s.so.1, but -the linker will complain that it cannot find it. That's because shared libgcc -is not present in the install directory yet. libgo.so was made without problem -because gcc will emit -lgcc_s when compiled with -shared option. When gotools -were being made, it was supplied with -static-libgcc thus no link option was -provided. Check LIBGO in gcc/go/gcc-spec.c for how gccgo make a builtin spec -for linking with libgo.so - -- GccgoCrossCompilation, https://github.com/golang/go/wiki/GccgoCrossCompilation -- Cross-building instructions, http://www.eglibc.org/archives/patches/msg00078.html - -When 3-pass GCC compilation is used, shared libgcc runtime libraries will be -available after gcc pass2 completed and will meet the gotools link requirement -at gcc pass3 ---- - gotools/Makefile.am | 4 +++- - gotools/Makefile.in | 4 +++- - 2 files changed, 6 insertions(+), 2 deletions(-) - ---- a/gotools/Makefile.am -+++ b/gotools/Makefile.am -@@ -26,6 +26,7 @@ PWD_COMMAND = $${PWDCMD-pwd} - STAMP = echo timestamp > - - libgodir = ../$(target_noncanonical)/libgo -+libgccdir = ../$(target_noncanonical)/libgcc - LIBGODEP = $(libgodir)/libgo.la - - LIBGOTOOL = $(libgodir)/libgotool.a -@@ -41,7 +42,8 @@ GOCFLAGS = $(CFLAGS_FOR_TARGET) - GOCOMPILE = $(GOCOMPILER) $(GOCFLAGS) - - AM_GOCFLAGS = -I $(libgodir) --AM_LDFLAGS = -L $(libgodir) -L $(libgodir)/.libs -+AM_LDFLAGS = -L $(libgodir) -L $(libgodir)/.libs \ -+ -L $(libgccdir) -L $(libgccdir)/.libs -lgcc_s - GOLINK = $(GOCOMPILER) $(GOCFLAGS) $(AM_GOCFLAGS) $(LDFLAGS) $(AM_LDFLAGS) -o $@ - - libgosrcdir = $(srcdir)/../libgo/go ---- a/gotools/Makefile.in -+++ b/gotools/Makefile.in -@@ -263,6 +263,7 @@ mkinstalldirs = $(SHELL) $(toplevel_srcd - PWD_COMMAND = $${PWDCMD-pwd} - STAMP = echo timestamp > - libgodir = ../$(target_noncanonical)/libgo -+libgccdir = ../$(target_noncanonical)/libgcc - LIBGODEP = $(libgodir)/libgo.la - LIBGOTOOL = $(libgodir)/libgotool.a - @NATIVE_FALSE@GOCOMPILER = $(GOC) -@@ -271,7 +272,8 @@ LIBGOTOOL = $(libgodir)/libgotool.a - @NATIVE_TRUE@GOCOMPILER = $(GOC_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) - GOCOMPILE = $(GOCOMPILER) $(GOCFLAGS) - AM_GOCFLAGS = -I $(libgodir) --AM_LDFLAGS = -L $(libgodir) -L $(libgodir)/.libs -+AM_LDFLAGS = -L $(libgodir) -L $(libgodir)/.libs \ -+ -L $(libgccdir) -L $(libgccdir)/.libs -lgcc_s - GOLINK = $(GOCOMPILER) $(GOCFLAGS) $(AM_GOCFLAGS) $(LDFLAGS) $(AM_LDFLAGS) -o $@ - libgosrcdir = $(srcdir)/../libgo/go - cmdsrcdir = $(libgosrcdir)/cmd diff --git a/toolchain/gdb/Makefile b/toolchain/gdb/Makefile index 6ed3b190ce..474a18e95f 100644 --- a/toolchain/gdb/Makefile +++ b/toolchain/gdb/Makefile @@ -7,12 +7,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gdb -PKG_VERSION:=11.2 +PKG_VERSION:=12.1 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/gdb -PKG_HASH:=1497c36a71881b8671a9a84a0ee40faab788ca30d7ba19d8463c3cc787152e32 +PKG_HASH:=0e1793bf8f2b54d53f46dea84ccfd446f48f81b297b28c4f7fc017b818d69fed +PKG_CPE_ID:=cpe:/a:gnu:gdb GDB_DIR:=$(PKG_NAME)-$(PKG_VERSION) HOST_BUILD_DIR:=$(BUILD_DIR_TOOLCHAIN)/$(GDB_DIR) @@ -30,15 +31,15 @@ HOST_CONFIGURE_ARGS = \ --build=$(GNU_HOST_NAME) \ --host=$(GNU_HOST_NAME) \ --target=$(REAL_GNU_TARGET_NAME) \ - --with-gmp=$(TOPDIR)/staging_dir/host \ - --with-mpfr=$(TOPDIR)/staging_dir/host \ - --with-mpc=$(TOPDIR)/staging_dir/host \ + --with-gmp=$(STAGING_DIR_HOST) \ + --with-mpfr=$(STAGING_DIR_HOST) \ + --with-mpc=$(STAGING_DIR_HOST) \ + --with-expat=$(STAGING_DIR_HOST) \ --disable-werror \ --without-uiout \ --enable-tui --disable-gdbtk --without-x \ --without-included-gettext \ --enable-threads \ - --with-expat \ --disable-unit-tests \ --disable-ubsan \ --disable-binutils \ diff --git a/toolchain/gdb/patches/120-fix-compile-flag-mismatch.patch b/toolchain/gdb/patches/120-fix-compile-flag-mismatch.patch index 99c91a0304..118bebe3c8 100644 --- a/toolchain/gdb/patches/120-fix-compile-flag-mismatch.patch +++ b/toolchain/gdb/patches/120-fix-compile-flag-mismatch.patch @@ -1,6 +1,6 @@ --- a/gdbserver/configure +++ b/gdbserver/configure -@@ -2661,7 +2661,7 @@ $as_echo "$as_me: error: \`$ac_var' was +@@ -2664,7 +2664,7 @@ $as_echo "$as_me: error: \`$ac_var' was ac_cache_corrupted=: ;; ,);; *) diff --git a/toolchain/glibc/Makefile b/toolchain/glibc/Makefile index 24526ceec2..bfb5598274 100644 --- a/toolchain/glibc/Makefile +++ b/toolchain/glibc/Makefile @@ -20,7 +20,7 @@ define Host/Install install ( cd $(TOOLCHAIN_DIR) ; \ for d in lib usr/lib ; do \ - for f in libc.so libpthread.so libgcc_s.so ; do \ + for f in libc.so libm.so libpthread.so libgcc_s.so ; do \ if [ -f $$$$d/$$$$f -a ! -L $$$$d/$$$$f ] ; then \ $(SED) 's,/usr/lib/,,g;s,/lib/,,g' $$$$d/$$$$f ; \ fi \ diff --git a/toolchain/glibc/common.mk b/toolchain/glibc/common.mk index 106863a065..18413cd271 100644 --- a/toolchain/glibc/common.mk +++ b/toolchain/glibc/common.mk @@ -7,15 +7,16 @@ include $(TOPDIR)/rules.mk PKG_NAME:=glibc -PKG_VERSION:=2.34 +PKG_VERSION:=2.37 PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) -PKG_SOURCE_VERSION:=4ab59ce4e5195f98b01748127248fed2b2b77b21 -PKG_MIRROR_HASH:=4df361a37a1f76244a77ca4ffb3b2d2774276a58aac46850c83f6c77e50dd16a +PKG_SOURCE_VERSION:=b4e23c75aea756b4bddc4abcf27a1c6dca8b6bd3 +PKG_MIRROR_HASH:=4d5b3de6ec7b47427700f74fdb529e32083b54a512f6ca86ec824a61092ecdd4 PKG_SOURCE_URL:=https://sourceware.org/git/glibc.git PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz +PKG_CPE_ID:=cpe:/a:gnu:glibc HOST_BUILD_DIR:=$(BUILD_DIR_TOOLCHAIN)/$(PKG_SOURCE_SUBDIR) CUR_BUILD_DIR:=$(HOST_BUILD_DIR)-$(VARIANT) @@ -64,7 +65,7 @@ GLIBC_CONFIGURE:= \ $(if $(CONFIG_PKG_CC_STACKPROTECTOR_REGULAR),--enable-stack-protector=yes) \ $(if $(CONFIG_PKG_CC_STACKPROTECTOR_STRONG),--enable-stack-protector=strong) \ $(if $(CONFIG_PKG_RELRO_FULL),--enable-bind-now) \ - --enable-kernel=5.4.0 + --enable-kernel=5.15.0 export libc_cv_ssp=no export libc_cv_ssp_strong=no @@ -79,11 +80,6 @@ define Host/SetToolchainInfo endef define Host/Configure - [ -f $(HOST_BUILD_DIR)/.autoconf ] || { \ - cd $(HOST_BUILD_DIR)/; \ - autoconf --force && \ - touch $(HOST_BUILD_DIR)/.autoconf; \ - } mkdir -p $(CUR_BUILD_DIR) ( cd $(CUR_BUILD_DIR); rm -f config.cache; \ $(GLIBC_CONFIGURE) \ diff --git a/toolchain/glibc/patches/050-Revert-Disallow-use-of-DES-encryption-functions-in-n.patch b/toolchain/glibc/patches/050-Revert-Disallow-use-of-DES-encryption-functions-in-n.patch index 8cb8c80fd2..c9db703938 100644 --- a/toolchain/glibc/patches/050-Revert-Disallow-use-of-DES-encryption-functions-in-n.patch +++ b/toolchain/glibc/patches/050-Revert-Disallow-use-of-DES-encryption-functions-in-n.patch @@ -82,7 +82,7 @@ provides them. int totfails = 0; int main (int argc, char *argv[]); -@@ -120,13 +104,3 @@ put8 (char *cp) +@@ -119,13 +103,3 @@ put8 (char *cp) printf("%02x", t); } } @@ -627,7 +627,7 @@ provides them. range [FROM - N + 1, FROM - 1]. If N is odd the first byte in FROM --- a/stdlib/stdlib.h +++ b/stdlib/stdlib.h -@@ -969,6 +969,12 @@ extern int getsubopt (char **__restrict +@@ -984,6 +984,12 @@ extern int getsubopt (char **__restrict #endif diff --git a/toolchain/glibc/patches/200-add-dl-search-paths.patch b/toolchain/glibc/patches/200-add-dl-search-paths.patch index 08e901d2e6..e927d86f23 100644 --- a/toolchain/glibc/patches/200-add-dl-search-paths.patch +++ b/toolchain/glibc/patches/200-add-dl-search-paths.patch @@ -2,7 +2,7 @@ add /usr/lib to default search path for the dynamic linker --- a/Makeconfig +++ b/Makeconfig -@@ -610,6 +610,9 @@ else +@@ -631,6 +631,9 @@ else default-rpath = $(libdir) endif diff --git a/toolchain/kernel-headers/Makefile b/toolchain/kernel-headers/Makefile index eea0ffbde0..cd25f8a6de 100644 --- a/toolchain/kernel-headers/Makefile +++ b/toolchain/kernel-headers/Makefile @@ -17,6 +17,7 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=linux PKG_VERSION:=$(LINUX_VERSION) PKG_SOURCE:=$(LINUX_SOURCE) +PKG_CPE_ID:=cpe:/o:linux:linux_kernel ifneq ($(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),) PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)) diff --git a/toolchain/musl/Makefile b/toolchain/musl/Makefile index 2b9312bcbf..d441e37684 100644 --- a/toolchain/musl/Makefile +++ b/toolchain/musl/Makefile @@ -9,7 +9,7 @@ HOST_BUILD_PARALLEL:=1 MUSL_MAKEOPTS = -C $(HOST_BUILD_DIR) \ DESTDIR="$(TOOLCHAIN_DIR)/" \ - LIBCC="$(subst libgcc.a,libgcc_initial.a,$(shell $(TARGET_CC) -print-libgcc-file-name))" + LIBCC="$(shell $(TARGET_CC) -print-libgcc-file-name)" define Host/SetToolchainInfo $(SED) 's,^\(LIBC_TYPE\)=.*,\1=$(PKG_NAME),' $(TOOLCHAIN_DIR)/info.mk diff --git a/toolchain/musl/common.mk b/toolchain/musl/common.mk index 040127c3bc..94444eaf75 100644 --- a/toolchain/musl/common.mk +++ b/toolchain/musl/common.mk @@ -8,12 +8,13 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/target.mk PKG_NAME:=musl -PKG_VERSION:=1.2.3 +PKG_VERSION:=1.2.4 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://musl.libc.org/releases/ -PKG_HASH:=7d5b0b6062521e4627e099e4c9dc8248d32a30285e959b7eecaa780cf8cfd4a4 +PKG_HASH:=7a35eae33d5372a7c0da1188de798726f68825513b7ae3ebe97aaaa52114f039 +PKG_CPE_ID:=cpe:/a:musl-libc:musl LIBC_SO_VERSION:=$(PKG_VERSION) PATCH_DIR:=$(PATH_PREFIX)/patches diff --git a/toolchain/musl/patches/600-nftw-support-common-gnu-extension.patch b/toolchain/musl/patches/600-nftw-support-common-gnu-extension.patch index 2a7436cf84..7a1ab3f99a 100644 --- a/toolchain/musl/patches/600-nftw-support-common-gnu-extension.patch +++ b/toolchain/musl/patches/600-nftw-support-common-gnu-extension.patch @@ -33,7 +33,7 @@ Signed-off-by: Tony Ambardar #include #include #include -@@ -72,8 +73,20 @@ static int do_nftw(char *path, int (*fn) +@@ -74,8 +75,20 @@ static int do_nftw(char *path, int (*fn) if (!fd_limit) close(dfd); } @@ -56,7 +56,7 @@ Signed-off-by: Tony Ambardar for (; h; h = h->chain) if (h->dev == st.st_dev && h->ino == st.st_ino) -@@ -101,7 +114,10 @@ static int do_nftw(char *path, int (*fn) +@@ -103,7 +116,10 @@ static int do_nftw(char *path, int (*fn) strcpy(path+j+1, de->d_name); if ((r=do_nftw(path, fn, fd_limit-1, flags, &new))) { closedir(d); @@ -68,7 +68,7 @@ Signed-off-by: Tony Ambardar } } closedir(d); -@@ -112,8 +128,16 @@ static int do_nftw(char *path, int (*fn) +@@ -114,8 +130,16 @@ static int do_nftw(char *path, int (*fn) } path[l] = 0; @@ -87,9 +87,9 @@ Signed-off-by: Tony Ambardar return 0; } -@@ -139,4 +163,5 @@ int nftw(const char *path, int (*fn)(con +@@ -140,3 +164,5 @@ int nftw(const char *path, int (*fn)(con + pthread_setcancelstate(cs, 0); return r; } - ++ +#undef nftw64 - weak_alias(nftw, nftw64); diff --git a/toolchain/musl/patches/800-mips_pie_debug.patch b/toolchain/musl/patches/800-mips_pie_debug.patch deleted file mode 100644 index 80fe15e841..0000000000 --- a/toolchain/musl/patches/800-mips_pie_debug.patch +++ /dev/null @@ -1,61 +0,0 @@ -Fix DT_DEBUG handling on MIPS in musl libc. -With this change gdb will load the symbol files for shared libraries on MIPS too. - -This patch was taken from this thread: https://www.openwall.com/lists/musl/2022/01/09/4 - ---- a/arch/mips/reloc.h -+++ b/arch/mips/reloc.h -@@ -29,6 +29,7 @@ - - #define NEED_MIPS_GOT_RELOCS 1 - #define DT_DEBUG_INDIRECT DT_MIPS_RLD_MAP -+#define DT_DEBUG_INDIRECT_REL DT_MIPS_RLD_MAP_REL - #define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT)) - - #define CRTJMP(pc,sp) __asm__ __volatile__( \ ---- a/arch/mips64/reloc.h -+++ b/arch/mips64/reloc.h -@@ -38,6 +38,7 @@ - - #define NEED_MIPS_GOT_RELOCS 1 - #define DT_DEBUG_INDIRECT DT_MIPS_RLD_MAP -+#define DT_DEBUG_INDIRECT_REL DT_MIPS_RLD_MAP_REL - #define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT)) - - #define CRTJMP(pc,sp) __asm__ __volatile__( \ ---- a/arch/mipsn32/reloc.h -+++ b/arch/mipsn32/reloc.h -@@ -29,6 +29,7 @@ - - #define NEED_MIPS_GOT_RELOCS 1 - #define DT_DEBUG_INDIRECT DT_MIPS_RLD_MAP -+#define DT_DEBUG_INDIRECT_REL DT_MIPS_RLD_MAP_REL - #define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT)) - - #define CRTJMP(pc,sp) __asm__ __volatile__( \ ---- a/ldso/dynlink.c -+++ b/ldso/dynlink.c -@@ -1923,6 +1923,10 @@ void __dls3(size_t *sp, size_t *auxv) - size_t *ptr = (size_t *) app.dynv[i+1]; - *ptr = (size_t)&debug; - } -+ if (app.dynv[i]==DT_DEBUG_INDIRECT_REL) { -+ size_t *ptr = (size_t *)((size_t)&app.dynv[i] + app.dynv[i+1]); -+ *ptr = (size_t)&debug; -+ } - } - - /* This must be done before final relocations, since it calls ---- a/src/internal/dynlink.h -+++ b/src/internal/dynlink.h -@@ -92,6 +92,10 @@ struct fdpic_dummy_loadmap { - #define DT_DEBUG_INDIRECT 0 - #endif - -+#ifndef DT_DEBUG_INDIRECT_REL -+#define DT_DEBUG_INDIRECT_REL 0 -+#endif -+ - #define AUX_CNT 32 - #define DYN_CNT 32 - diff --git a/toolchain/nasm/Makefile b/toolchain/nasm/Makefile index f733c52912..27cd476419 100644 --- a/toolchain/nasm/Makefile +++ b/toolchain/nasm/Makefile @@ -5,12 +5,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=nasm -PKG_VERSION:=2.15.05 +PKG_VERSION:=2.16.01 PKG_SOURCE_URL:=https://www.nasm.us/pub/nasm/releasebuilds/$(PKG_VERSION)/ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz - -PKG_HASH:=3caf6729c1073bf96629b57cee31eeb54f4f8129b01902c73428836550b30a3f +PKG_HASH:=c77745f4802375efeee2ec5c0ad6b7f037ea9c87c92b149a9637ff099f162558 +PKG_CPE_ID:=cpe:/a:nasm:nasm HOST_BUILD_PARALLEL:=1 diff --git a/tools/7z/Makefile b/tools/7z/Makefile new file mode 100644 index 0000000000..bfb5058487 --- /dev/null +++ b/tools/7z/Makefile @@ -0,0 +1,37 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=7z +PKG_VERSION:=22.01 +PKG_SOURCE_VERSION:=2201 + +PKG_SOURCE:=$(PKG_NAME)$(PKG_SOURCE_VERSION)-src.tar.xz +PKG_SOURCE_URL:=https://7-zip.org/a/ +PKG_HASH:=393098730c70042392af808917e765945dc2437dee7aae3cfcc4966eb920fbc5 +PKG_CPE_ID:=cpe:/a:7-zip:7zip + +# This builds the 7zr variant which supports only 7z, so no non-LGPL code should be included +PKG_LICENSE:=LGPL-2.1-or-later +PKG_LICENSE_FILES:=DOC/License.txt DOC/copying.txt + +HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_VERSION) + +include $(INCLUDE_DIR)/host-build.mk + +TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS) + +ALONE_DIR=$(HOST_BUILD_DIR)/CPP/7zip/Bundles/Alone7z + +define Host/Compile + $(MAKE) -C $(ALONE_DIR) -f makefile.gcc +endef + +define Host/Install + $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin + $(INSTALL_BIN) $(ALONE_DIR)/_o/7zr $(STAGING_DIR_HOST)/bin/7zr +endef + +define Host/Clean + rm -f $(STAGING_DIR_HOST)/bin/7zr +endef + +$(eval $(call HostBuild)) diff --git a/tools/7z/patches/7-zip-flags.patch b/tools/7z/patches/7-zip-flags.patch new file mode 100644 index 0000000000..ed5b508401 --- /dev/null +++ b/tools/7z/patches/7-zip-flags.patch @@ -0,0 +1,27 @@ +--- a/CPP/7zip/7zip_gcc.mak ++++ b/CPP/7zip/7zip_gcc.mak +@@ -18,13 +18,13 @@ PROGPATH_STATIC = $(O)/$(PROG)s + + + ifneq ($(CC), xlc) +-CFLAGS_WARN_WALL = -Wall -Werror -Wextra ++CFLAGS_WARN_WALL = -Wall -Wextra + endif + + # for object file + CFLAGS_BASE_LIST = -c + # CFLAGS_BASE_LIST = -S +-CFLAGS_BASE = -O2 $(CFLAGS_BASE_LIST) $(CFLAGS_WARN_WALL) $(CFLAGS_WARN) \ ++CFLAGS_BASE = $(CFLAGS_BASE_LIST) $(CFLAGS_WARN_WALL) $(CFLAGS_WARN) -D_GNU_SOURCE \ + -DNDEBUG -D_REENTRANT -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \ + -fPIC + +@@ -192,7 +192,7 @@ all: $(O) $(PROGPATH) $(STATIC_TARGET) + $(O): + $(MY_MKDIR) $(O) + +-LFLAGS_ALL = -s $(MY_ARCH_2) $(LDFLAGS) $(LD_arch) $(OBJS) $(MY_LIBS) $(LIB2) ++LFLAGS_ALL = $(MY_ARCH_2) $(LDFLAGS) $(LD_arch) $(OBJS) $(MY_LIBS) $(LIB2) + $(PROGPATH): $(OBJS) + $(CXX) -o $(PROGPATH) $(LFLAGS_ALL) + diff --git a/tools/7z/patches/7-zip-musl.patch b/tools/7z/patches/7-zip-musl.patch new file mode 100644 index 0000000000..cf3386e4de --- /dev/null +++ b/tools/7z/patches/7-zip-musl.patch @@ -0,0 +1,59 @@ +--- a/C/CpuArch.c ++++ b/C/CpuArch.c +@@ -421,8 +421,6 @@ BoolInt CPU_IsSupported_AES (void) { ret + + #ifdef USE_HWCAP + +-#include +- + #define MY_HWCAP_CHECK_FUNC_2(name1, name2) \ + BoolInt CPU_IsSupported_ ## name1() { return (getauxval(AT_HWCAP) & (HWCAP_ ## name2)) ? 1 : 0; } + +--- a/C/Threads.c ++++ b/C/Threads.c +@@ -257,7 +257,7 @@ WRes Thread_Create_With_CpuSet(CThread * + */ + + // ret2 = +- pthread_attr_setaffinity_np(&attr, sizeof(*cpuSet), cpuSet); ++ //pthread_attr_setaffinity_np(&attr, sizeof(*cpuSet), cpuSet); + // if (ret2) ret = ret2; + #endif + } +@@ -267,14 +267,12 @@ WRes Thread_Create_With_CpuSet(CThread * + if (!ret) + { + p->_created = 1; +- /* + if (cpuSet) + { + // ret2 = + pthread_setaffinity_np(p->_tid, sizeof(*cpuSet), cpuSet); + // if (ret2) ret = ret2; + } +- */ + } + } + // ret2 = +--- a/C/Threads.h ++++ b/C/Threads.h +@@ -19,6 +19,7 @@ + #endif + + #include ++#include + + #endif + +--- a/CPP/Windows/SystemInfo.cpp ++++ b/CPP/Windows/SystemInfo.cpp +@@ -36,9 +36,6 @@ + #endif + */ + +-#ifdef MY_CPU_ARM_OR_ARM64 +-#include +-#endif + #endif + + #ifdef __linux__ diff --git a/tools/Makefile b/tools/Makefile index 1930a98498..2b1b472c88 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -17,42 +17,92 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) BUILD_ISL = y endif endif +ifneq ($(CONFIG_SDK)$(CONFIG_TARGET_INITRAMFS_COMPRESSION_BZIP2),) + BUILD_BZIP2_TOOLS = y +endif +ifneq ($(CONFIG_SDK)$(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZ4),) + BUILD_LZ4_TOOLS = y +endif +ifneq ($(CONFIG_SDK)$(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZO),) + BUILD_LZO_TOOLS = y +endif -tools-y += autoconf autoconf-archive automake bc bison cmake cpio dosfstools -tools-y += e2fsprogs fakeroot findutils firmware-utils flex gengetopt -tools-y += libressl libtool lzma m4 make-ext4fs meson missing-macros mkimage -tools-y += mklibs mtd-utils mtools ninja padjffs2 patch-image -tools-y += patchelf pkgconf quilt squashfskit4 sstrip zip zlib zstd -tools-$(BUILD_ISL) += isl -tools-$(BUILD_TOOLCHAIN) += expat gmp mpc mpfr -tools-$(CONFIG_TARGET_apm821xx)$(CONFIG_TARGET_gemini) += genext2fs -tools-$(CONFIG_TARGET_ath79) += lzma-old squashfs -tools-$(CONFIG_TARGET_mxs) += elftosb sdimage -tools-$(CONFIG_TARGET_tegra) += cbootimage cbootimage-configs -tools-$(CONFIG_USES_MINOR) += kernel2minor -tools-$(CONFIG_USE_SPARSE) += sparse -tools-$(CONFIG_USE_LLVM_BUILD) += llvm-bpf +tools-y += autoconf +tools-y += autoconf-archive +tools-y += automake +tools-y += bc +tools-y += bison +tools-y += cmake +tools-y += cpio +tools-y += dosfstools +tools-y += e2fsprogs +tools-y += expat +tools-y += fakeroot +tools-y += findutils +tools-y += firmware-utils +tools-y += flex +tools-y += gengetopt +tools-y += gnulib +tools-y += libressl +tools-y += libtool +tools-y += lzma +tools-y += m4 +tools-y += make-ext4fs +tools-y += meson +tools-y += missing-macros +tools-y += mkimage +tools-y += mklibs +tools-y += mtd-utils +tools-y += mtools +tools-y += ninja +tools-y += padjffs2 +tools-y += patch-image +tools-y += patchelf +tools-y += pkgconf +tools-y += quilt +tools-y += squashfs4 +tools-y += sstrip +tools-y += zip +tools-y += zlib +tools-y += zstd +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS),y) += liblzo +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(BUILD_BZIP2_TOOLS),y) += bzip2 +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(BUILD_ISL),y) += isl +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(BUILD_LZ4_TOOLS),y) += lz4 +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(BUILD_LZO_TOOLS),y) += lzop +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(BUILD_TOOLCHAIN),y) += gmp mpc mpfr +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(CONFIG_TARGET_apm821xx)$(CONFIG_TARGET_gemini),y) += genext2fs +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(CONFIG_TARGET_ath79),y) += lzma-old squashfs3-lzma +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(CONFIG_TARGET_mxs),y) += elftosb sdimage +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(CONFIG_TARGET_realtek),y) += 7z +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(CONFIG_TARGET_tegra),y) += cbootimage cbootimage-configs +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(CONFIG_USES_MINOR),y) += kernel2minor +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(CONFIG_USE_SPARSE),y) += sparse +tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(CONFIG_USE_LLVM_BUILD),y) += llvm-bpf # builddir dependencies $(curdir)/autoconf/compile := $(curdir)/m4/compile -$(curdir)/automake/compile := $(curdir)/m4/compile $(curdir)/autoconf/compile $(curdir)/pkgconf/compile $(curdir)/xz/compile +$(curdir)/automake/compile := $(curdir)/autoconf/compile $(curdir)/pkgconf/compile $(curdir)/xz/compile $(curdir)/bc/compile := $(curdir)/bison/compile $(curdir)/libtool/compile $(curdir)/bison/compile := $(curdir)/flex/compile $(curdir)/cbootimage/compile += $(curdir)/automake/compile -$(curdir)/cmake/compile += $(curdir)/libressl/compile $(curdir)/ninja/compile -$(curdir)/dosfstools/compile := $(curdir)/autoconf/compile $(curdir)/automake/compile -$(curdir)/expat/compile := $(curdir)/cmake/compile +$(curdir)/cmake/compile += $(curdir)/libressl/compile $(curdir)/ninja/compile $(curdir)/expat/compile $(curdir)/xz/compile $(curdir)/zlib/compile $(curdir)/zstd/compile +$(curdir)/dosfstools/compile := $(curdir)/automake/compile $(curdir)/e2fsprogs/compile := $(curdir)/libtool/compile $(curdir)/fakeroot/compile := $(curdir)/libtool/compile $(curdir)/findutils/compile := $(curdir)/bison/compile -$(curdir)/firmware-utils/compile += $(curdir)/libressl/compile $(curdir)/zlib/compile +$(curdir)/firmware-utils/compile += $(curdir)/cmake/compile $(curdir)/flex/compile := $(curdir)/libtool/compile +$(curdir)/genext2fs/compile := $(curdir)/libtool/compile $(curdir)/gengetopt/compile := $(curdir)/libtool/compile $(curdir)/gmp/compile := $(curdir)/libtool/compile $(curdir)/isl/compile := $(curdir)/gmp/compile +$(curdir)/liblzo/compile := $(curdir)/cmake/compile $(curdir)/libressl/compile := $(curdir)/pkgconf/compile -$(curdir)/libtool/compile := $(curdir)/m4/compile $(curdir)/autoconf/compile $(curdir)/automake/compile $(curdir)/missing-macros/compile +$(curdir)/libtool/compile := $(curdir)/automake/compile $(curdir)/gnulib/compile $(curdir)/missing-macros/compile +$(curdir)/lz4/compile := $(curdir)/meson/compile $(curdir)/lzma-old/compile := $(curdir)/zlib/compile +$(curdir)/lzop/compile := $(curdir)/cmake/compile $(curdir)/liblzo/compile $(curdir)/llvm-bpf/compile := $(curdir)/cmake/compile $(curdir)/make-ext4fs/compile := $(curdir)/zlib/compile $(curdir)/meson/compile := $(curdir)/ninja/compile @@ -67,23 +117,28 @@ $(curdir)/patchelf/compile := $(curdir)/libtool/compile $(curdir)/pkgconf/compile := $(curdir)/meson/compile $(curdir)/quilt/compile := $(curdir)/autoconf/compile $(curdir)/findutils/compile $(curdir)/sdcc/compile := $(curdir)/bison/compile -$(curdir)/squashfs/compile := $(curdir)/lzma-old/compile -$(curdir)/squashfskit4/compile := $(curdir)/xz/compile $(curdir)/zlib/compile -$(curdir)/zlib/compile := $(curdir)/cmake/compile +$(curdir)/squashfs3-lzma/compile := $(curdir)/lzma-old/compile +$(curdir)/squashfs4/compile := $(curdir)/xz/compile $(curdir)/zlib/compile $(curdir)/zstd/compile := $(curdir)/meson/compile ifneq ($(HOST_OS),Linux) - $(curdir)/squashfskit4/compile += $(curdir)/coreutils/compile + $(curdir)/coreutils/compile += $(curdir)/automake/compile $(curdir)/bison/compile $(curdir)/gnulib/compile + $(curdir)/squashfs4/compile += $(curdir)/coreutils/compile tools-y += coreutils endif ifeq ($(HOST_OS),Darwin) tools-y += bash +else + $(curdir)/dwarves/compile += $(curdir)/elfutils/compile + $(curdir)/elfutils/compile := $(curdir)/m4/compile $(curdir)/zlib/compile + tools-$(if $(CONFIG_BUILD_ALL_HOST_TOOLS)$(CONFIG_DWARVES),y) += dwarves + tools-y += elfutils endif ifneq ($(CONFIG_CCACHE)$(CONFIG_SDK),) -$(foreach tool, $(filter-out xz zstd pkgconf patch ninja meson libressl cmake,$(tools-y)), $(eval $(curdir)/$(tool)/compile += $(curdir)/ccache/compile)) +$(foreach tool, $(filter-out zstd zlib xz pkgconf patch ninja meson libressl expat cmake,$(tools-y)), $(eval $(curdir)/$(tool)/compile += $(curdir)/ccache/compile)) tools-y += ccache -$(curdir)/ccache/compile := $(curdir)/cmake/compile $(curdir)/zstd/compile +$(curdir)/ccache/compile := $(curdir)/cmake/compile endif # in case there is no patch tool on the host we need to make patch tool a @@ -92,8 +147,11 @@ $(foreach tool, $(tools-y), $(if $(wildcard $(curdir)/$(tool)/patches),$(eval $( $(foreach tool, $(filter-out xz,$(tools-y)), $(eval $(curdir)/$(tool)/compile += $(curdir)/xz/compile)) -# make any tool depend on tar, xz and patch to ensure that archives can be unpacked and patched properly -tools-core := tar xz patch +# make any tool depend on the following to ensure that archives can be unpacked and patched properly +tools-core += libdeflate +tools-core += patch +tools-core += tar +tools-core += xz $(foreach tool, $(tools-y), $(eval $(curdir)/$(tool)/compile += $(patsubst %,$(curdir)/%/compile,$(tools-core)))) tools-y += $(tools-core) diff --git a/tools/autoconf-archive/Makefile b/tools/autoconf-archive/Makefile index 228a27cf60..a4ab423779 100644 --- a/tools/autoconf-archive/Makefile +++ b/tools/autoconf-archive/Makefile @@ -1,28 +1,16 @@ include $(TOPDIR)/rules.mk PKG_NAME:=autoconf-archive -PKG_VERSION:=2021.02.19 +PKG_VERSION:=2023.02.20 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/autoconf-archive -PKG_HASH:=e8a6eb9d28ddcba8ffef3fa211653239e9bf239aba6a01a6b7cfc7ceaec69cbd +PKG_HASH:=71d4048479ae28f1f5794619c3d72df9c01df49b1c628ef85fde37596dc31a33 include $(INCLUDE_DIR)/host-build.mk -HOST_CONFIGURE_ARGS += \ - --datarootdir=$(STAGING_DIR_HOST)/share - -define Host/Compile - export SHELL="$(BASH)"; $(MAKE) -C $(HOST_BUILD_DIR) -endef - -define Host/Install - export SHELL="$(BASH)"; $(MAKE) -C $(HOST_BUILD_DIR) install -endef - -define Host/Clean - -export SHELL="$(BASH)"; $(MAKE) -C $(HOST_BUILD_DIR) uninstall - $(call Host/Clean/Default) +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) endef $(eval $(call HostBuild)) diff --git a/tools/autoconf/Makefile b/tools/autoconf/Makefile index 6eb64d77d5..a1ce158031 100644 --- a/tools/autoconf/Makefile +++ b/tools/autoconf/Makefile @@ -1,4 +1,4 @@ -# +# # Copyright (C) 2006-2015 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. @@ -7,31 +7,25 @@ include $(TOPDIR)/rules.mk PKG_NAME:=autoconf -PKG_VERSION:=2.69 +PKG_VERSION:=2.71 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/autoconf -PKG_HASH:=64ebcec9f8ac5b2487125a86a7760d2591ac9e1d3dbd59489633f9de62a57684 +PKG_HASH:=f14c83cfebcc9427f2c3cea7258bd90df972d92eb26752da4ddad81c87a0faa4 include $(INCLUDE_DIR)/host-build.mk -HOST_CONFIGURE_ARGS += \ - --datarootdir=$(STAGING_DIR_HOST)/share - HOST_CONFIGURE_VARS += \ + EMACS="no" \ PERL="/usr/bin/env perl" define Host/Compile - export SHELL="$(BASH)"; $(MAKE) -C $(HOST_BUILD_DIR) -endef - -define Host/Install - export SHELL="$(BASH)"; $(MAKE) -C $(HOST_BUILD_DIR) install + -$(call Host/Compile/Default,--touch install-man1) # disable building of man pages + $(call Host/Compile/Default) endef -define Host/Clean - -export SHELL="$(BASH)"; $(MAKE) -C $(HOST_BUILD_DIR) uninstall - $(call Host/Clean/Default) +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) endef $(eval $(call HostBuild)) diff --git a/tools/autoconf/patches/000-relocatable.patch b/tools/autoconf/patches/000-relocatable.patch index 12e94ae9a1..3961d2264b 100644 --- a/tools/autoconf/patches/000-relocatable.patch +++ b/tools/autoconf/patches/000-relocatable.patch @@ -1,77 +1,71 @@ --- a/bin/autoheader.in +++ b/bin/autoheader.in -@@ -28,7 +28,8 @@ eval 'case $# in 0) exec @PERL@ -S "$0"; +@@ -30,9 +30,12 @@ use 5.006; + use strict; + use warnings FATAL => 'all'; ++$^W = 1; ++ BEGIN { - my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '@pkgdatadir@'; + my $pkgdatadir = $ENV{'autom4te_perllibdir'} || -+ ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/autoconf' : '@pkgdatadir@'); ++ ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/autoconf' : '@pkgdatadir@'); unshift @INC, "$pkgdatadir"; # Override SHELL. On DJGPP SHELL may not be set to a shell -@@ -50,7 +51,7 @@ use strict; - use vars qw ($config_h %verbatim %symbol); +@@ -54,7 +57,7 @@ use Autom4te::XFile; + our ($config_h, %symbol, %verbatim); # Lib files. -my $autom4te = $ENV{'AUTOM4TE'} || '@bindir@/@autom4te-name@'; -+my $autom4te = $ENV{'AUTOM4TE'} || ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/bin/@autom4te-name@' : '@bindir@/@autom4te-name@'); - local $config_h; ++my $autom4te = $ENV{'AUTOM4TE'} || ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/bin/@autom4te-name@' : '@bindir@/@autom4te-name@'); my $config_h_in; my @prepend_include; + my @include; --- a/bin/autom4te.in +++ b/bin/autom4te.in -@@ -1,10 +1,12 @@ --#! @PERL@ -w -+#! @PERL@ - # -*- perl -*- - # @configure_input@ - - eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac' - if 0; +@@ -26,9 +26,12 @@ use 5.006; + use strict; + use warnings FATAL => 'all'; +$^W = 1; + - # autom4te - Wrapper around M4 libraries. - # Copyright (C) 2001-2003, 2005-2012 Free Software Foundation, Inc. - -@@ -24,7 +26,8 @@ eval 'case $# in 0) exec @PERL@ -S "$0"; - BEGIN { - my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '@pkgdatadir@'; + my $pkgdatadir = $ENV{'autom4te_perllibdir'} || -+ ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/autoconf' : '@pkgdatadir@'); ++ ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/autoconf' : '@pkgdatadir@'); unshift @INC, $pkgdatadir; # Override SHELL. On DJGPP SHELL may not be set to a shell -@@ -44,7 +47,8 @@ use File::Basename; - use strict; +@@ -48,7 +51,8 @@ use Autom4te::General; + use Autom4te::XFile; # Data directory. -my $pkgdatadir = $ENV{'AC_MACRODIR'} || '@pkgdatadir@'; +my $pkgdatadir = $ENV{'AC_MACRODIR'} || -+ ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/autoconf' : '@pkgdatadir@'); ++ ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/autoconf' : '@pkgdatadir@'); # $LANGUAGE{LANGUAGE} -- Automatic options for LANGUAGE. my %language; -@@ -87,7 +91,7 @@ my @include; +@@ -91,7 +95,7 @@ my @include; my $freeze = 0; # $M4. -my $m4 = $ENV{"M4"} || '@M4@'; -+my $m4 = $ENV{"M4"} || ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/bin/m4' : '@M4@'); ++my $m4 = $ENV{"M4"} || ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/bin/m4' : '@M4@'); # Some non-GNU m4's don't reject the --help option, so give them /dev/null. fatal "need GNU m4 1.4 or later: $m4" if system "$m4 --help &1 | grep reload-state >/dev/null"; -@@ -269,6 +273,12 @@ sub load_configuration ($) +@@ -272,6 +276,12 @@ sub load_configuration ($) my @words = shellwords ($_); my $type = shift @words; + -+ if ($ENV{'STAGING_DIR'}) ++ if ($ENV{'STAGING_DIR_HOST'}) + { -+ @words = map { s!^@pkgdatadir@!$ENV{'STAGING_DIR'}/../host/share/autoconf!; $_ } @words; ++ @words = map { s!^@pkgdatadir@!$ENV{'STAGING_DIR_HOST'}/share/autoconf!; $_ } @words; + } + if ($type eq 'begin-language:') @@ -79,54 +73,39 @@ fatal "$file:$.: end-language missing for: $lang" --- a/bin/autoreconf.in +++ b/bin/autoreconf.in -@@ -1,10 +1,12 @@ --#! @PERL@ -w -+#! @PERL@ - # -*- perl -*- - # @configure_input@ - - eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac' - if 0; +@@ -29,10 +29,13 @@ use 5.006; + use strict; + use warnings FATAL => 'all'; +$^W = 1; + - # autoreconf - install the GNU Build System in a directory tree - # Copyright (C) 1994, 1999-2012 Free Software Foundation, Inc. - -@@ -26,7 +28,8 @@ eval 'case $# in 0) exec @PERL@ -S "$0"; - + my $buildauxdir; BEGIN { - my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '@pkgdatadir@'; + my $pkgdatadir = $ENV{'autom4te_perllibdir'} || -+ ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/autoconf' : '@pkgdatadir@'); ++ ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/autoconf' : '@pkgdatadir@'); unshift @INC, $pkgdatadir; - # Override SHELL. On DJGPP SHELL may not be set to a shell -@@ -106,9 +109,9 @@ Written by David J. MacKenzie and Akim D + $buildauxdir = $ENV{'autom4te_buildauxdir'} || $pkgdatadir . '/build-aux'; +@@ -117,9 +120,9 @@ Written by David J. MacKenzie and Akim D "; # Lib files. --my $autoconf = $ENV{'AUTOCONF'} || '@bindir@/@autoconf-name@'; --my $autoheader = $ENV{'AUTOHEADER'} || '@bindir@/@autoheader-name@'; --my $autom4te = $ENV{'AUTOM4TE'} || '@bindir@/@autom4te-name@'; -+my $autoconf = $ENV{'AUTOCONF'} || ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/bin/@autoconf-name@' : '@bindir@/@autoconf-name@'); -+my $autoheader = $ENV{'AUTOHEADER'} || ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/bin/@autoheader-name@' : '@bindir@/@autoheader-name@'); -+my $autom4te = $ENV{'AUTOM4TE'} || ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/bin/@autom4te-name@' : '@bindir@/@autom4te-name@'); - my $automake = $ENV{'AUTOMAKE'} || 'automake'; - my $aclocal = $ENV{'ACLOCAL'} || 'aclocal'; - my $libtoolize = $ENV{'LIBTOOLIZE'} || 'libtoolize'; +-my $autoconf = $ENV{'AUTOCONF'} || '@bindir@/@autoconf-name@'; +-my $autoheader = $ENV{'AUTOHEADER'} || '@bindir@/@autoheader-name@'; +-my $autom4te = $ENV{'AUTOM4TE'} || '@bindir@/@autom4te-name@'; ++my $autoconf = $ENV{'AUTOCONF'} || ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/bin/@autoconf-name@' : '@bindir@/@autoconf-name@'); ++my $autoheader = $ENV{'AUTOHEADER'} || ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/bin/@autoheader-name@' : '@bindir@/@autoheader-name@'); ++my $autom4te = $ENV{'AUTOM4TE'} || ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/bin/@autom4te-name@' : '@bindir@/@autom4te-name@'); + my $automake = $ENV{'AUTOMAKE'} || 'automake'; + my $aclocal = $ENV{'ACLOCAL'} || 'aclocal'; + my $libtoolize = $ENV{'LIBTOOLIZE'} || 'libtoolize'; --- a/bin/autoscan.in +++ b/bin/autoscan.in -@@ -1,4 +1,4 @@ --#! @PERL@ -w -+#! @PERL@ - # -*- perl -*- - # @configure_input@ - -@@ -23,9 +23,12 @@ - eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac' - if 0; +@@ -28,9 +28,12 @@ use 5.006; + use strict; + use warnings FATAL => 'all'; +$^W = 1; + @@ -134,34 +113,28 @@ { - my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '@pkgdatadir@'; + my $pkgdatadir = $ENV{'autom4te_perllibdir'} || -+ ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/autoconf' : '@pkgdatadir@'); ++ ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/autoconf' : '@pkgdatadir@'); unshift @INC, $pkgdatadir; # Override SHELL. On DJGPP SHELL may not be set to a shell -@@ -91,10 +94,10 @@ my $configure_scan = 'configure.scan'; +@@ -95,10 +98,10 @@ my %needed_macros = my $log; # Autoconf and lib files. -my $autom4te = $ENV{'AUTOM4TE'} || '@bindir@/@autom4te-name@'; -+my $autom4te = $ENV{'AUTOM4TE'} || ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/bin/@autom4te-name@' : '@bindir@/@autom4te-name@'); ++my $autom4te = $ENV{'AUTOM4TE'} || ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/bin/@autom4te-name@' : '@bindir@/@autom4te-name@'); my $autoconf = "$autom4te --language=autoconf"; my @prepend_include; -my @include = ('@pkgdatadir@'); -+my @include = ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/autoconf' : '@pkgdatadir@'); ++my @include = ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/autoconf' : '@pkgdatadir@'); # $help # ----- --- a/bin/autoupdate.in +++ b/bin/autoupdate.in -@@ -1,4 +1,4 @@ --#! @PERL@ -w -+#! @PERL@ - # -*- perl -*- - # @configure_input@ - -@@ -24,9 +24,12 @@ - eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac' - if 0; +@@ -29,9 +29,12 @@ use 5.006; + use strict; + use warnings FATAL => 'all'; +$^W = 1; + @@ -169,60 +142,53 @@ { - my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '@pkgdatadir@'; + my $pkgdatadir = $ENV{'autom4te_perllibdir'} || -+ ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/autoconf' : '@pkgdatadir@'); ++ ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/autoconf' : '@pkgdatadir@'); unshift @INC, $pkgdatadir; # Override SHELL. On DJGPP SHELL may not be set to a shell -@@ -50,10 +53,10 @@ my $autom4te = $ENV{'AUTOM4TE'} || '@bin +@@ -55,10 +58,10 @@ my $autom4te = $ENV{'AUTOM4TE'} || '@bin my $autoconf = "$autom4te --language=autoconf"; # We need to find m4sugar. my @prepend_include; -my @include = ('@pkgdatadir@'); -+my @include = ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/autoconf' : '@pkgdatadir@'); ++my @include = ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/autoconf' : '@pkgdatadir@'); my $force = 0; # m4. -my $m4 = $ENV{"M4"} || '@M4@'; -+my $m4 = $ENV{"M4"} || ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/bin/m4' : '@M4@'); ++my $m4 = $ENV{"M4"} || ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/bin/m4' : '@M4@'); # $HELP --- a/bin/ifnames.in +++ b/bin/ifnames.in -@@ -1,10 +1,12 @@ --#! @PERL@ -w -+#! @PERL@ - # -*- perl -*- - # @configure_input@ - - eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac' - if 0; +@@ -33,9 +33,12 @@ use 5.006; + use strict; + use warnings FATAL => 'all'; +$^W = 1; + - # ifnames - print the identifiers used in C preprocessor conditionals - - # Copyright (C) 1994-1995, 1999-2003, 2005-2012 Free Software -@@ -31,7 +33,8 @@ eval 'case $# in 0) exec @PERL@ -S "$0"; - BEGIN { - my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '@pkgdatadir@'; + my $pkgdatadir = $ENV{'autom4te_perllibdir'} || -+ ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/autoconf' : '@pkgdatadir@'); ++ ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/autoconf' : '@pkgdatadir@'); unshift @INC, $pkgdatadir; # Override SHELL. On DJGPP SHELL may not be set to a shell --- a/bin/autoconf.as +++ b/bin/autoconf.as -@@ -84,7 +84,11 @@ exit_missing_arg=' +@@ -89,8 +89,13 @@ exit_missing_arg=' # restore font-lock: ' # Variables. -: ${AUTOM4TE='@bindir@/@autom4te-name@'} -+if test -n "$STAGING_DIR"; then -+ : ${AUTOM4TE="$STAGING_DIR/../host/bin/@autom4te-name@"} +-: ${trailer_m4='@pkgdatadir@/autoconf/trailer.m4'} ++if test -n "$STAGING_DIR_HOST"; then ++ : ${AUTOM4TE="$STAGING_DIR_HOST/bin/@autom4te-name@"} ++ : ${trailer_m4="$STAGING_DIR_HOST/share/autoconf/autoconf/trailer.m4"} +else + : ${AUTOM4TE='@bindir@/@autom4te-name@'} ++ : ${trailer_m4='@pkgdatadir@/autoconf/trailer.m4'} +fi autom4te_options= outfile= diff --git a/tools/autoconf/patches/001-no_emacs_lib.patch b/tools/autoconf/patches/001-no_emacs_lib.patch deleted file mode 100644 index 35c51642e8..0000000000 --- a/tools/autoconf/patches/001-no_emacs_lib.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/lib/Makefile.am -+++ b/lib/Makefile.am -@@ -15,7 +15,7 @@ - # You should have received a copy of the GNU General Public License - # along with this program. If not, see . - --SUBDIRS = Autom4te m4sugar autoconf autotest autoscan emacs -+SUBDIRS = Autom4te m4sugar autoconf autotest autoscan - nodist_pkgdata_DATA = autom4te.cfg - EXTRA_DIST = autom4te.in freeze.mk - ---- a/lib/Makefile.in -+++ b/lib/Makefile.in -@@ -225,7 +225,7 @@ target_alias = @target_alias@ - top_build_prefix = @top_build_prefix@ - top_builddir = @top_builddir@ - top_srcdir = @top_srcdir@ --SUBDIRS = Autom4te m4sugar autoconf autotest autoscan emacs -+SUBDIRS = Autom4te m4sugar autoconf autotest autoscan - nodist_pkgdata_DATA = autom4te.cfg - EXTRA_DIST = autom4te.in freeze.mk - edit = sed \ diff --git a/tools/autoconf/patches/002-musl_host_fixup.patch b/tools/autoconf/patches/002-musl_host_fixup.patch deleted file mode 100644 index 4dcb1ec3c1..0000000000 --- a/tools/autoconf/patches/002-musl_host_fixup.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- a/build-aux/config.sub -+++ b/build-aux/config.sub -@@ -122,9 +122,9 @@ esac - # Here we must recognize all the valid KERNEL-OS combinations. - maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` - case $maybe_os in -- nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ -- linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ -- knetbsd*-gnu* | netbsd*-gnu* | \ -+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-musl* | \ -+ linux-newlib* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ -+ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os -@@ -1360,7 +1360,7 @@ case $os in - | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-android* \ -- | -linux-newlib* | -linux-uclibc* \ -+ | -linux-musl* | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ diff --git a/tools/automake/Makefile b/tools/automake/Makefile index c016f1d76a..4c1e5758cb 100644 --- a/tools/automake/Makefile +++ b/tools/automake/Makefile @@ -8,16 +8,16 @@ include $(TOPDIR)/rules.mk PKG_NAME:=automake PKG_CPE_ID:=cpe:/a:gnu:automake -PKG_VERSION:=1.15.1 +PKG_VERSION:=1.16.5 +PKG_API_VERSION:=$(word 2,$(subst ., ,$(PKG_VERSION))) PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/automake -PKG_HASH:=af6ba39142220687c500f79b4aa2f181d9b24e4f8d8ec497cea4ba26c64bedaf +PKG_HASH:=f01d58cd6d9d77fbdca9eb4bbd5ead1988228fdb73d6f7a201f5f8d6b118b469 include $(INCLUDE_DIR)/host-build.mk HOST_CONFIGURE_ARGS += \ - --datarootdir=$(STAGING_DIR_HOST)/share \ --disable-silent-rules HOST_CONFIGURE_VARS += \ @@ -25,27 +25,29 @@ HOST_CONFIGURE_VARS += \ am_cv_prog_PERL_ithreads=no define Host/Configure - (cd $(HOST_BUILD_DIR); $(AM_TOOL_PATHS) STAGING_DIR="" ./bootstrap) + (cd $(HOST_BUILD_DIR); $(AM_TOOL_PATHS) STAGING_DIR_HOST="" ./bootstrap) $(call Host/Configure/Default) endef define Host/Install # remove old automake resources to avoid version conflicts - rm -rf $(STAGING_DIR_HOST)/share/aclocal-[0-9]* - rm -rf $(STAGING_DIR_HOST)/share/automake-[0-9]* - $(MAKE) -C $(HOST_BUILD_DIR) install + $(call Host/Uninstall) + $(call Host/Compile/Default,install) mv $(STAGING_DIR_HOST)/bin/aclocal $(STAGING_DIR_HOST)/bin/aclocal.real $(INSTALL_BIN) ./files/aclocal $(STAGING_DIR_HOST)/bin - ln -sf aclocal $(STAGING_DIR_HOST)/bin/aclocal-1.9 - ln -sf aclocal $(STAGING_DIR_HOST)/bin/aclocal-1.10 - ln -sf aclocal $(STAGING_DIR_HOST)/bin/aclocal-1.11 - ln -sf aclocal $(STAGING_DIR_HOST)/bin/aclocal-1.11.6 - ln -sf aclocal $(STAGING_DIR_HOST)/bin/aclocal-1.15 + ( \ + api=$(PKG_API_VERSION); \ + while [ "$$$$api" -ge 11 ]; do \ + ln -sf aclocal "$(STAGING_DIR_HOST)/bin/aclocal-1.$$$$api"; \ + api=$$$$(($$$$api - 1)); \ + done; \ + ) endef -define Host/Clean - -$(MAKE) -C $(HOST_BUILD_DIR) uninstall - $(call Host/Clean/Default) +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) + rm -rf $(STAGING_DIR_HOST)/share/aclocal-[0-9]* + rm -rf $(STAGING_DIR_HOST)/share/automake-[0-9]* endef $(eval $(call HostBuild)) diff --git a/tools/automake/files/aclocal b/tools/automake/files/aclocal index a60df10c42..689cb041f5 100755 --- a/tools/automake/files/aclocal +++ b/tools/automake/files/aclocal @@ -1,2 +1,2 @@ #!/usr/bin/env sh -aclocal.real $ACLOCAL_INCLUDE $@ +${STAGING_DIR_HOST}/bin/aclocal.real $ACLOCAL_INCLUDE $@ diff --git a/tools/automake/patches/000-relocatable.patch b/tools/automake/patches/000-relocatable.patch index d05b25e61c..0b61eaeb45 100644 --- a/tools/automake/patches/000-relocatable.patch +++ b/tools/automake/patches/000-relocatable.patch @@ -1,96 +1,52 @@ --- a/lib/Automake/Config.in +++ b/lib/Automake/Config.in -@@ -32,7 +32,7 @@ our $PACKAGE = '@PACKAGE@'; +@@ -34,7 +34,7 @@ our $PACKAGE = '@PACKAGE@'; our $PACKAGE_BUGREPORT = '@PACKAGE_BUGREPORT@'; our $VERSION = '@VERSION@'; our $RELEASE_YEAR = '@RELEASE_YEAR@'; --our $libdir = '@datadir@/@PACKAGE@-@APIVERSION@'; -+our $libdir = $ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/@PACKAGE@-@APIVERSION@' : '@datadir@/@PACKAGE@-@APIVERSION@'; +-our $libdir = $ENV{"AUTOMAKE_LIBDIR"} || '@datadir@/@PACKAGE@-@APIVERSION@'; ++our $libdir = $ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/@PACKAGE@-@APIVERSION@' : '@datadir@/@PACKAGE@-@APIVERSION@'; our $perl_threads = 0; # We need at least this version for CLONE support. --- a/bin/aclocal.in +++ b/bin/aclocal.in -@@ -1,10 +1,12 @@ --#!@PERL@ -w -+#!@PERL@ - # -*- perl -*- - # @configure_input@ - - eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac' - if 0; +@@ -23,9 +23,11 @@ use 5.006; + use strict; + use warnings FATAL => 'all'; +$^W = 1; + - # aclocal - create aclocal.m4 by scanning configure.ac - - # Copyright (C) 1996-2017 Free Software Foundation, Inc. -@@ -27,7 +29,7 @@ eval 'case $# in 0) exec @PERL@ -S "$0"; - BEGIN { -- @Aclocal::perl_libdirs = ('@datadir@/@PACKAGE@-@APIVERSION@') -+ @Aclocal::perl_libdirs = ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/@PACKAGE@-@APIVERSION@' : '@datadir@/@PACKAGE@-@APIVERSION@') - unless @Aclocal::perl_libdirs; - unshift @INC, @Aclocal::perl_libdirs; +- unshift (@INC, '@datadir@/@PACKAGE@-@APIVERSION@') ++ unshift (@INC, ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/@PACKAGE@-@APIVERSION@' : '@datadir@/@PACKAGE@-@APIVERSION@')) + unless $ENV{AUTOMAKE_UNINSTALLED}; } -@@ -69,8 +71,8 @@ $perl_threads = 0; + +@@ -65,8 +67,8 @@ $perl_threads = 0; # ACLOCAL_PATH environment variable, and reset with the '--system-acdir' # option. my @user_includes = (); --my @automake_includes = ("@datadir@/aclocal-$APIVERSION"); +-my @automake_includes = ('@datadir@/aclocal-' . $APIVERSION); -my @system_includes = ('@datadir@/aclocal'); -+my @automake_includes = ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . "/../host/share/aclocal-$APIVERSION" : "@datadir@/aclocal-$APIVERSION"); -+my @system_includes = ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/aclocal' : '@datadir@/aclocal'); ++my @automake_includes = ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . "/share/aclocal-$APIVERSION" : "@datadir@/aclocal-$APIVERSION"); ++my @system_includes = ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/aclocal' : '@datadir@/aclocal'); # Whether we should copy M4 file in $user_includes[0]. my $install = 0; --- a/bin/automake.in +++ b/bin/automake.in -@@ -1,10 +1,12 @@ --#!@PERL@ -w -+#!@PERL@ - # -*- perl -*- - # @configure_input@ - - eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac' - if 0; +@@ -26,9 +26,11 @@ use 5.006; + use strict; + use warnings FATAL => 'all'; +$^W = 1; + - # automake - create Makefile.in from Makefile.am - # Copyright (C) 1994-2017 Free Software Foundation, Inc. - -@@ -31,7 +33,7 @@ use strict; - BEGIN { -- @Automake::perl_libdirs = ('@datadir@/@PACKAGE@-@APIVERSION@') -+ @Automake::perl_libdirs = ($ENV{'STAGING_DIR'} ? $ENV{'STAGING_DIR'} . '/../host/share/@PACKAGE@-@APIVERSION@' : '@datadir@/@PACKAGE@-@APIVERSION@') - unless @Automake::perl_libdirs; - unshift @INC, @Automake::perl_libdirs; - ---- a/t/wrap/aclocal.in -+++ b/t/wrap/aclocal.in -@@ -1,6 +1,8 @@ --#!@PERL@ -w -+#!@PERL@ - # @configure_input@ - -+$^W = 1; -+ - # Copyright (C) 2012-2017 Free Software Foundation, Inc. - - # This program is free software; you can redistribute it and/or modify ---- a/t/wrap/automake.in -+++ b/t/wrap/automake.in -@@ -1,6 +1,8 @@ --#!@PERL@ -w -+#!@PERL@ - # @configure_input@ - -+$^W = 1; -+ - # Copyright (C) 2012-2017 Free Software Foundation, Inc. +- unshift (@INC, '@datadir@/@PACKAGE@-@APIVERSION@') ++ unshift (@INC, ($ENV{'STAGING_DIR_HOST'} ? $ENV{'STAGING_DIR_HOST'} . '/share/@PACKAGE@-@APIVERSION@' : '@datadir@/@PACKAGE@-@APIVERSION@')) + unless $ENV{AUTOMAKE_UNINSTALLED}; - # This program is free software; you can redistribute it and/or modify + # Override SHELL. This is required on DJGPP so that system() uses diff --git a/tools/automake/patches/100-aclocal-skip-not-existing-directories.patch b/tools/automake/patches/100-aclocal-skip-not-existing-directories.patch index ad019ddd1a..a0d04e21e5 100644 --- a/tools/automake/patches/100-aclocal-skip-not-existing-directories.patch +++ b/tools/automake/patches/100-aclocal-skip-not-existing-directories.patch @@ -1,6 +1,6 @@ --- a/bin/aclocal.in +++ b/bin/aclocal.in -@@ -356,6 +356,12 @@ sub scan_m4_dirs ($$@) +@@ -371,6 +371,12 @@ sub scan_m4_dirs ($$@) foreach my $m4dir (@dirlist) { diff --git a/tools/automake/patches/101-do-not-require-files.patch b/tools/automake/patches/101-do-not-require-files.patch new file mode 100644 index 0000000000..3a8c9fcb47 --- /dev/null +++ b/tools/automake/patches/101-do-not-require-files.patch @@ -0,0 +1,29 @@ +--- a/bin/automake.in ++++ b/bin/automake.in +@@ -4513,7 +4513,7 @@ sub handle_gettext () + && grep ($_ eq 'intl', @subdirs)); + } + +- require_file ($ac_gettext_location, GNU, 'ABOUT-NLS'); ++ require_file ($ac_gettext_location, GNITS, 'ABOUT-NLS'); + } + + # Emit makefile footer. +@@ -5641,7 +5641,7 @@ sub check_gnu_standards () + # otherwise require non-.md. + my $required + = (! -f $file && -f "$file.md") ? "$file.md" : $file; +- require_file ("$am_file.am", GNU, $required); ++ require_file ("$am_file.am", GNITS, $required); + } + + # Accept one of these three licenses; default to COPYING. +@@ -5655,7 +5655,7 @@ sub check_gnu_standards () + last; + } + } +- require_file ("$am_file.am", GNU, 'COPYING') ++ require_file ("$am_file.am", GNITS, 'COPYING') + unless $license; + } + diff --git a/tools/automake/patches/200-other-V-values-for-verbosity.patch b/tools/automake/patches/200-other-V-values-for-verbosity.patch new file mode 100644 index 0000000000..1ea9d38b0e --- /dev/null +++ b/tools/automake/patches/200-other-V-values-for-verbosity.patch @@ -0,0 +1,59 @@ +From: Bogdan Drozdowski +Date: Sat, 31 Dec 2022 20:17:35 +0100 +Subject: [PATCH] Allow other V values for verbosity + +--- + m4/silent.m4 | 2 +- + t/silent-gen.sh | 24 ++++++++++++++++++++++++ + 2 files changed, 25 insertions(+), 1 deletion(-) + +--- a/m4/silent.m4 ++++ b/m4/silent.m4 +@@ -43,7 +43,7 @@ else + fi]) + if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. +- AM_V='$(V)' ++ AM_V='$(shell if ( test "x$(V)" = "x0" ); then echo 0; elif ( test "x$(V)" = "x" ); then echo $(AM_DEFAULT_VERBOSITY); else echo 1; fi)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' + else + AM_V=$AM_DEFAULT_VERBOSITY +--- a/t/silent-gen.sh ++++ b/t/silent-gen.sh +@@ -54,6 +54,18 @@ grep 'cp ' stdout + grep 'echo ' stdout + + $MAKE clean ++run_make -O V=99 ++grep 'GEN ' stdout && exit 1 ++grep 'cp ' stdout ++grep 'echo ' stdout ++ ++$MAKE clean ++run_make -O V=vvv ++grep 'GEN ' stdout && exit 1 ++grep 'cp ' stdout ++grep 'echo ' stdout ++ ++$MAKE clean + run_make -O V=0 + grep 'GEN .*foo' stdout + grep 'cp ' stdout && exit 1 +@@ -78,5 +90,17 @@ run_make -O V=1 + grep 'GEN ' stdout && exit 1 + grep 'cp ' stdout + grep 'echo ' stdout ++ ++$MAKE clean ++run_make -O V=99 ++grep 'GEN ' stdout && exit 1 ++grep 'cp ' stdout ++grep 'echo ' stdout ++ ++$MAKE clean ++run_make -O V=v ++grep 'GEN ' stdout && exit 1 ++grep 'cp ' stdout ++grep 'echo ' stdout + + : diff --git a/tools/bash/Makefile b/tools/bash/Makefile index 7c25b83327..f4bfc07397 100644 --- a/tools/bash/Makefile +++ b/tools/bash/Makefile @@ -8,14 +8,18 @@ include $(TOPDIR)/rules.mk PKG_NAME:=bash PKG_CPE_ID:=cpe:/a:gnu:bash -PKG_VERSION:=5.1.16 +PKG_VERSION:=5.2.15 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@GNU/bash -PKG_HASH:=5bac17218d3911834520dad13cd1f85ab944e1c09ae1aba55906be1f8192f558 +PKG_HASH:=13720965b5f4fc3a0d4b61dd37e7565c741da9a5be24edc2ae00182fc1b3588c HOST_BUILD_PARALLEL := 1 include $(INCLUDE_DIR)/host-build.mk +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/bc/Makefile b/tools/bc/Makefile index 73dbdab49e..2c29e094e2 100644 --- a/tools/bc/Makefile +++ b/tools/bc/Makefile @@ -7,17 +7,19 @@ include $(TOPDIR)/rules.mk PKG_NAME:=bc -PKG_VERSION:=1.06.95 +PKG_VERSION:=1.07.1 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -PKG_SOURCE_URL:=https://alpha.gnu.org/gnu/bc \ - https://gnualpha.uib.no/bc/ \ - https://mirrors.fe.up.pt/pub/gnu-alpha/bc/ \ - https://www.nic.funet.fi/pub/gnu/alpha/gnu/bc/ -PKG_HASH:=7ee4abbcfac03d8a6e1a8a3440558a3d239d6b858585063e745c760957725ecc +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=@GNU/bc +PKG_HASH:=62adfca89b0a1c0164c2cdca59ca210c1d44c3ffc46daf9931cf4942664cb02a PKG_FIXUP := autoreconf +PKG_CPE_ID:=cpe:/a:gnu:bc include $(INCLUDE_DIR)/host-build.mk +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/bc/patches/001-no_doc.patch b/tools/bc/patches/001-no_doc.patch index 50deee8c89..119f111f49 100644 --- a/tools/bc/patches/001-no_doc.patch +++ b/tools/bc/patches/001-no_doc.patch @@ -1,6 +1,5 @@ -diff -urN bc-1.06.95/Makefile.am bc-1.06.95.new/Makefile.am ---- bc-1.06.95/Makefile.am 2005-05-27 01:05:41.000000000 +0100 -+++ bc-1.06.95.new/Makefile.am 2013-07-09 09:33:31.521490710 +0100 +--- a/Makefile.am ++++ b/Makefile.am @@ -1,6 +1,6 @@ ## Process this file with automake to produce Makefile.in @@ -8,16 +7,15 @@ diff -urN bc-1.06.95/Makefile.am bc-1.06.95.new/Makefile.am +SUBDIRS = lib bc dc MAINTAINERCLEANFILES = aclocal.m4 config.h.in configure Makefile.in \ - stamp-h $(distdir).tar.gz h/number.h depcomp missing -diff -urN bc-1.06.95/Makefile.in bc-1.06.95.new/Makefile.in ---- bc-1.06.95/Makefile.in 2006-09-05 03:39:30.000000000 +0100 -+++ bc-1.06.95.new/Makefile.in 2013-07-09 09:33:28.565490767 +0100 -@@ -149,7 +149,7 @@ - sharedstatedir = @sharedstatedir@ - sysconfdir = @sysconfdir@ - target_alias = @target_alias@ + stamp-h $(distdir).tar.gz h/number.h depcomp missing \ +--- a/Makefile.in ++++ b/Makefile.in +@@ -288,7 +288,7 @@ target_alias = @target_alias@ + top_build_prefix = @top_build_prefix@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ -SUBDIRS = lib bc dc doc +SUBDIRS = lib bc dc MAINTAINERCLEANFILES = aclocal.m4 config.h.in configure Makefile.in \ - stamp-h $(distdir).tar.gz h/number.h depcomp missing - + stamp-h $(distdir).tar.gz h/number.h depcomp missing \ + bc/libmath.h diff --git a/tools/bc/patches/002-fix-libmath.patch b/tools/bc/patches/002-fix-libmath.patch new file mode 100644 index 0000000000..f2212f0953 --- /dev/null +++ b/tools/bc/patches/002-fix-libmath.patch @@ -0,0 +1,32 @@ +--- a/bc/fix-libmath_h ++++ b/bc/fix-libmath_h +@@ -1,9 +1,9 @@ +-ed libmath.h < + # include +-# include + # include + # include + # include +@@ -1051,12 +1050,12 @@ void applySavedTimeInfoToOutputFile ( Ch + { + # if BZ_UNIX + IntNative retVal; +- struct utimbuf uTimBuf; ++ struct timespec uTimBuf[2] = {}; + +- uTimBuf.actime = fileMetaInfo.st_atime; +- uTimBuf.modtime = fileMetaInfo.st_mtime; ++ uTimBuf[0].tv_sec = fileMetaInfo.st_atime; ++ uTimBuf[1].tv_sec = fileMetaInfo.st_mtime; + +- retVal = utime ( dstName, &uTimBuf ); ++ retVal = utimensat ( AT_FDCWD, dstName, uTimBuf , 0 ); + ERROR_IF_NOT_ZERO ( retVal ); + # endif + } diff --git a/tools/bzip2/patches/021-merge-and-improve-makefiles.patch b/tools/bzip2/patches/021-merge-and-improve-makefiles.patch new file mode 100644 index 0000000000..9d98c34bdb --- /dev/null +++ b/tools/bzip2/patches/021-merge-and-improve-makefiles.patch @@ -0,0 +1,401 @@ +--- a/bzip2.c ++++ b/bzip2.c +@@ -54,7 +54,7 @@ + #include + #include + #include +-#include "bzlib.h" ++#include + + #define ERROR_IF_EOF(i) { if ((i) == EOF) ioError(); } + #define ERROR_IF_NOT_ZERO(i) { if ((i) != 0) ioError(); } +--- a/bzlib_private.h ++++ b/bzlib_private.h +@@ -30,7 +30,7 @@ + #include + #endif + +-#include "bzlib.h" ++#include + + + +--- a/Makefile ++++ b/Makefile +@@ -21,11 +21,38 @@ + LDFLAGS= + + BIGFILES=-D_FILE_OFFSET_BITS=64 +-CFLAGS=-Wall -Winline -O2 -g $(BIGFILES) ++CFLAGS_COMMON=-Wall -Winline -O2 -g $(BIGFILES) -I. ++CFLAGS_NOPIC=$(filter-out -O%,$(CFLAGS)) $(CFLAGS_COMMON) ++CFLAGS_PIC=$(filter-out -O%,$(CFLAGS)) -fpic -fPIC $(CFLAGS_COMMON) + + # Where you want it installed when you do 'make install' +-PREFIX=/usr/local +- ++PREFIX?=/usr/local ++ENABLE_BIN_STATIC?=1 ++ENABLE_BIN_SHARED?=1 ++ENABLE_LIB_STATIC?=1 ++ENABLE_LIB_SHARED?=1 ++ENABLE_DEV?=1 ++ENABLE_DOCS?=1 ++ENABLE_TESTS?=1 ++ ++ifeq ($(ENABLE_BIN_STATIC),1) ++ ENABLE_BIN=1 ++ ifneq ($(ENABLE_LIB_STATIC),1) ++ ENABLE_LIB_STATIC=1 ++ endif ++endif ++ifeq ($(ENABLE_BIN_SHARED),1) ++ ENABLE_BIN=1 ++ ifneq ($(ENABLE_LIB_SHARED),1) ++ ENABLE_LIB_STATIC=1 ++ endif ++endif ++ifeq ($(ENABLE_LIB_STATIC),1) ++ ENABLE_LIB=1 ++endif ++ifeq ($(ENABLE_LIB_SHARED),1) ++ ENABLE_LIB=1 ++endif + + OBJS= blocksort.o \ + huffman.o \ +@@ -35,15 +62,38 @@ + decompress.o \ + bzlib.o + +-all: libbz2.a bzip2 bzip2recover test +- +-bzip2: libbz2.a bzip2.o +- $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2 ++TGTS_all:= ++TGTS_bzip2:=bzip2.o ++TGTS_check:= ++TGTS_install:= ++ifeq ($(ENABLE_LIB),1) ++ TGTS_all+=libbz2 ++ TGTS_bzip2+=libbz2 ++endif ++ifeq ($(ENABLE_BIN),1) ++ TGTS_all+=bzip2 bzip2recover ++ TGTS_install+=bzip2 bzip2recover ++endif ++ifeq ($(ENABLE_TESTS),1) ++ TGTS_all+=test ++ TGTS_check+=test ++endif ++ ++all: $(TGTS_all) ++ ++bzip2: $(TGTS_bzip2) ++ifeq ($(ENABLE_BIN_STATIC),1) ++ $(CC) $(CFLAGS_NOPIC) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2 ++endif ++ifeq ($(ENABLE_BIN_SHARED),1) ++ $(CC) $(CFLAGS_PIC) -o bzip2-shared bzip2.o libbz2.so.1.0 ++endif + + bzip2recover: bzip2recover.o +- $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o ++ $(CC) $(CFLAGS_NOPIC) $(LDFLAGS) -o bzip2recover bzip2recover.o + +-libbz2.a: $(OBJS) ++libbz2: $(OBJS) ++ifeq ($(ENABLE_LIB_STATIC),1) + rm -f libbz2.a + $(AR) cq libbz2.a $(OBJS) + @if ( test -f $(RANLIB) -o -f /usr/bin/ranlib -o \ +@@ -51,8 +101,18 @@ + echo $(RANLIB) libbz2.a ; \ + $(RANLIB) libbz2.a ; \ + fi ++endif ++ifeq ($(ENABLE_LIB_SHARED),1) ++ $(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 $(LDFLAGS) -o libbz2.so.1.0.8 $(OBJS) ++ rm -f libbz2.so.1.0 ++ rm -f libbz2.so.1 ++ rm -f libbz2.so ++ ln -s libbz2.so.1.0.8 libbz2.so.1.0 ++ ln -s libbz2.so.1.0 libbz2.so.1 ++ ln -s libbz2.so.1 libbz2.so ++endif + +-check: test ++check: $(TGTS_check) + test: bzip2 + @cat words1 + ./bzip2 -1 < sample1.ref > sample1.rb2 +@@ -69,69 +129,153 @@ + cmp sample3.tst sample3.ref + @cat words3 + +-install: bzip2 bzip2recover ++install: $(TGTS_install) ++ifeq ($(ENABLE_BIN),1) + if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi ++endif ++ifeq ($(ENABLE_LIB),1) + if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi ++endif ++ifeq ($(ENABLE_DEV),1) ++ if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi ++endif ++ifeq ($(ENABLE_DOCS),1) + if ( test ! -d $(PREFIX)/man ) ; then mkdir -p $(PREFIX)/man ; fi + if ( test ! -d $(PREFIX)/man/man1 ) ; then mkdir -p $(PREFIX)/man/man1 ; fi +- if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi ++endif ++ifeq ($(ENABLE_BIN),1) ++ ifeq ($(ENABLE_BIN_STATIC),1) + cp -f bzip2 $(PREFIX)/bin/bzip2 +- cp -f bzip2 $(PREFIX)/bin/bunzip2 +- cp -f bzip2 $(PREFIX)/bin/bzcat ++ chmod a+rx $(PREFIX)/bin/bzip2 ++ endif ++ ifeq ($(ENABLE_BIN_SHARED),1) ++ ifeq ($(ENABLE_BIN_STATIC),1) ++ cp -f bzip2-shared $(PREFIX)/bin/bzip2-shared ++ chmod a+rx $(PREFIX)/bin/bzip2-shared ++ else ++ cp -f bzip2-shared $(PREFIX)/bin/bzip2 ++ endif ++ endif ++ rm -f $(PREFIX)/bin/bunzip2 ++ rm -f $(PREFIX)/bin/bzcat ++ ( cd $(PREFIX)/bin && ln -s bzip2 bunzip2 ) ++ ( cd $(PREFIX)/bin && ln -s bzip2 bzcat ) ++ rm -f $(PREFIX)/bin/bunzip2-shared ++ rm -f $(PREFIX)/bin/bzcat-shared ++ ifeq ($(ENABLE_BIN_SHARED),1) ++ ifeq ($(ENABLE_BIN_STATIC),1) ++ ( cd $(PREFIX)/bin && ln -s bzip2-shared bunzip2-shared ) ++ ( cd $(PREFIX)/bin && ln -s bzip2-shared bzcat-shared ) ++ endif ++ endif + cp -f bzip2recover $(PREFIX)/bin/bzip2recover +- chmod a+x $(PREFIX)/bin/bzip2 +- chmod a+x $(PREFIX)/bin/bunzip2 +- chmod a+x $(PREFIX)/bin/bzcat +- chmod a+x $(PREFIX)/bin/bzip2recover +- cp -f bzip2.1 $(PREFIX)/man/man1 +- chmod a+r $(PREFIX)/man/man1/bzip2.1 +- cp -f bzlib.h $(PREFIX)/include +- chmod a+r $(PREFIX)/include/bzlib.h +- cp -f libbz2.a $(PREFIX)/lib +- chmod a+r $(PREFIX)/lib/libbz2.a ++ chmod a+rx $(PREFIX)/bin/bzip2recover + cp -f bzgrep $(PREFIX)/bin/bzgrep +- ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzegrep +- ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzfgrep +- chmod a+x $(PREFIX)/bin/bzgrep ++ chmod a+rx $(PREFIX)/bin/bzgrep ++ rm -f $(PREFIX)/bin/bzegrep ++ rm -f $(PREFIX)/bin/bzfgrep ++ ( cd $(PREFIX)/bin && ln -s bzgrep bzegrep ) ++ ( cd $(PREFIX)/bin && ln -s bzgrep bzfgrep ) + cp -f bzmore $(PREFIX)/bin/bzmore +- ln -s -f $(PREFIX)/bin/bzmore $(PREFIX)/bin/bzless +- chmod a+x $(PREFIX)/bin/bzmore ++ chmod a+rx $(PREFIX)/bin/bzmore ++ rm -f $(PREFIX)/bin/bzless ++ ( cd $(PREFIX)/bin && ln -s bzmore bzless ) ++ rm -f $(PREFIX)/bin/bzcmp + cp -f bzdiff $(PREFIX)/bin/bzdiff +- ln -s -f $(PREFIX)/bin/bzdiff $(PREFIX)/bin/bzcmp +- chmod a+x $(PREFIX)/bin/bzdiff +- cp -f bzgrep.1 bzmore.1 bzdiff.1 $(PREFIX)/man/man1 +- chmod a+r $(PREFIX)/man/man1/bzgrep.1 +- chmod a+r $(PREFIX)/man/man1/bzmore.1 +- chmod a+r $(PREFIX)/man/man1/bzdiff.1 ++ chmod a+rx $(PREFIX)/bin/bzdiff ++ ( cd $(PREFIX)/bin && ln -s bzdiff bzcmp ) ++endif ++ifeq ($(ENABLE_DEV),1) ++ cp -f bzlib.h $(PREFIX)/include ++ chmod a+r $(PREFIX)/include/bzlib.h ++endif ++ifeq ($(ENABLE_DOCS),1) ++ cp -f bzip2.1 bzgrep.1 bzmore.1 bzdiff.1 $(PREFIX)/man/man1 + echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzegrep.1 + echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzfgrep.1 + echo ".so man1/bzmore.1" > $(PREFIX)/man/man1/bzless.1 + echo ".so man1/bzdiff.1" > $(PREFIX)/man/man1/bzcmp.1 ++ chmod a+r $(PREFIX)/man/man1/bzip2.1 ++ chmod a+r $(PREFIX)/man/man1/bzgrep.1 ++ chmod a+r $(PREFIX)/man/man1/bzmore.1 ++ chmod a+r $(PREFIX)/man/man1/bzdiff.1 ++ chmod a+r $(PREFIX)/man/man1/bzegrep.1 ++ chmod a+r $(PREFIX)/man/man1/bzfgrep.1 ++ chmod a+r $(PREFIX)/man/man1/bzless.1 ++ chmod a+r $(PREFIX)/man/man1/bzcmp.1 ++endif ++ifeq ($(ENABLE_LIB_SHARED),1) ++ cp -f libbz2.so.1.0.8 $(PREFIX)/lib ++ chmod a+r $(PREFIX)/lib/libbz2.so.1.0.8 ++ rm -f $(PREFIX)/lib/libbz2.so.1.0 ++ rm -f $(PREFIX)/lib/libbz2.so.1 ++ rm -f $(PREFIX)/lib/libbz2.so ++ ( cd $(PREFIX)/lib && ln -s libbz2.so.1.0.8 libbz2.so.1.0 ) ++ ( cd $(PREFIX)/lib && ln -s libbz2.so.1.0 libbz2.so.1 ) ++ ( cd $(PREFIX)/lib && ln -s libbz2.so.1 libbz2.so ) ++endif ++ifeq ($(ENABLE_LIB_STATIC),1) ++ cp -f libbz2.a $(PREFIX)/lib ++ chmod a+r $(PREFIX)/lib/libbz2.a ++endif ++ ++uninstall: ++ rm -f $(PREFIX)/bin/bzip2 ++ rm -f $(PREFIX)/bin/bzip2-shared ++ rm -f $(PREFIX)/bin/bunzip2 ++ rm -f $(PREFIX)/bin/bzcat ++ rm -f $(PREFIX)/bin/bunzip2-shared ++ rm -f $(PREFIX)/bin/bzcat-shared ++ rm -f $(PREFIX)/bin/bzip2recover ++ rm -f $(PREFIX)/bin/bzgrep ++ rm -f $(PREFIX)/bin/bzegrep ++ rm -f $(PREFIX)/bin/bzfgrep ++ rm -f $(PREFIX)/bin/bzmore ++ rm -f $(PREFIX)/bin/bzless ++ rm -f $(PREFIX)/bin/bzdiff ++ rm -f $(PREFIX)/bin/bzcmp ++ rm -f $(PREFIX)/include/bzlib.h ++ rm -f $(PREFIX)/lib/libbz2.so.1.0.8 ++ rm -f $(PREFIX)/lib/libbz2.so.1.0 ++ rm -f $(PREFIX)/lib/libbz2.so.1 ++ rm -f $(PREFIX)/lib/libbz2.so ++ rm -f $(PREFIX)/lib/libbz2.a ++ rm -f $(PREFIX)/man/man1/bzip2.1 ++ rm -f $(PREFIX)/man/man1/bzgrep.1 ++ rm -f $(PREFIX)/man/man1/bzmore.1 ++ rm -f $(PREFIX)/man/man1/bzdiff.1 ++ rm -f $(PREFIX)/man/man1/bzegrep.1 ++ rm -f $(PREFIX)/man/man1/bzfgrep.1 ++ rm -f $(PREFIX)/man/man1/bzless.1 ++ rm -f $(PREFIX)/man/man1/bzcmp.1 ++ (rmdir $(PREFIX)/bin $(PREFIX)/include $(PREFIX)/lib $(PREFIX)/man/man1 $(PREFIX)/man || true ) 2> /dev/null + + clean: +- rm -f *.o libbz2.a bzip2 bzip2recover \ ++ rm -f $(OBJS) bzip2.o \ ++ libbz2.so.1.0.8 libbz2.so.1.0 libbz2.so.1 libbz2.so \ ++ libbz2.a bzip2 bzip2-shared bzip2recover \ + sample1.rb2 sample2.rb2 sample3.rb2 \ + sample1.tst sample2.tst sample3.tst + + blocksort.o: blocksort.c + @cat words0 +- $(CC) $(CFLAGS) -c blocksort.c ++ $(CC) $(CFLAGS_NOPIC) -c blocksort.c + huffman.o: huffman.c +- $(CC) $(CFLAGS) -c huffman.c ++ $(CC) $(CFLAGS_NOPIC) -c huffman.c + crctable.o: crctable.c +- $(CC) $(CFLAGS) -c crctable.c ++ $(CC) $(CFLAGS_NOPIC) -c crctable.c + randtable.o: randtable.c +- $(CC) $(CFLAGS) -c randtable.c ++ $(CC) $(CFLAGS_NOPIC) -c randtable.c + compress.o: compress.c +- $(CC) $(CFLAGS) -c compress.c ++ $(CC) $(CFLAGS_NOPIC) -c compress.c + decompress.o: decompress.c +- $(CC) $(CFLAGS) -c decompress.c ++ $(CC) $(CFLAGS_NOPIC) -c decompress.c + bzlib.o: bzlib.c +- $(CC) $(CFLAGS) -c bzlib.c ++ $(CC) $(CFLAGS_NOPIC) -c bzlib.c + bzip2.o: bzip2.c +- $(CC) $(CFLAGS) -c bzip2.c ++ $(CC) $(CFLAGS_NOPIC) -c bzip2.c + bzip2recover.o: bzip2recover.c +- $(CC) $(CFLAGS) -c bzip2recover.c ++ $(CC) $(CFLAGS_NOPIC) -c bzip2recover.c + + + distclean: clean +@@ -189,7 +333,6 @@ + $(DISTNAME)/bzmore.1 \ + $(DISTNAME)/bzgrep \ + $(DISTNAME)/bzgrep.1 \ +- $(DISTNAME)/Makefile-libbz2_so \ + $(DISTNAME)/bz-common.xsl \ + $(DISTNAME)/bz-fo.xsl \ + $(DISTNAME)/bz-html.xsl \ +--- a/Makefile-libbz2_so ++++ b/Makefile-libbz2_so +@@ -1,59 +0,0 @@ +- +-# This Makefile builds a shared version of the library, +-# libbz2.so.1.0.8, with soname libbz2.so.1.0, +-# at least on x86-Linux (RedHat 7.2), +-# with gcc-2.96 20000731 (Red Hat Linux 7.1 2.96-98). +-# Please see the README file for some important info +-# about building the library like this. +- +-# ------------------------------------------------------------------ +-# This file is part of bzip2/libbzip2, a program and library for +-# lossless, block-sorting data compression. +-# +-# bzip2/libbzip2 version 1.0.8 of 13 July 2019 +-# Copyright (C) 1996-2019 Julian Seward +-# +-# Please read the WARNING, DISCLAIMER and PATENTS sections in the +-# README file. +-# +-# This program is released under the terms of the license contained +-# in the file LICENSE. +-# ------------------------------------------------------------------ +- +- +-SHELL=/bin/sh +-CC=gcc +-BIGFILES=-D_FILE_OFFSET_BITS=64 +-CFLAGS=-fpic -fPIC -Wall -Winline -O2 -g $(BIGFILES) +- +-OBJS= blocksort.o \ +- huffman.o \ +- crctable.o \ +- randtable.o \ +- compress.o \ +- decompress.o \ +- bzlib.o +- +-all: $(OBJS) +- $(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.8 $(OBJS) +- $(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.8 +- rm -f libbz2.so.1.0 +- ln -s libbz2.so.1.0.8 libbz2.so.1.0 +- +-clean: +- rm -f $(OBJS) bzip2.o libbz2.so.1.0.8 libbz2.so.1.0 bzip2-shared +- +-blocksort.o: blocksort.c +- $(CC) $(CFLAGS) -c blocksort.c +-huffman.o: huffman.c +- $(CC) $(CFLAGS) -c huffman.c +-crctable.o: crctable.c +- $(CC) $(CFLAGS) -c crctable.c +-randtable.o: randtable.c +- $(CC) $(CFLAGS) -c randtable.c +-compress.o: compress.c +- $(CC) $(CFLAGS) -c compress.c +-decompress.o: decompress.c +- $(CC) $(CFLAGS) -c decompress.c +-bzlib.o: bzlib.c +- $(CC) $(CFLAGS) -c bzlib.c +--- a/unzcrash.c ++++ b/unzcrash.c +@@ -30,7 +30,7 @@ + + #include + #include +-#include "bzlib.h" ++#include + + #define M_BLOCK 1000000 + diff --git a/tools/ccache/Makefile b/tools/ccache/Makefile index 0cf528bb5f..d2142f82a9 100644 --- a/tools/ccache/Makefile +++ b/tools/ccache/Makefile @@ -5,14 +5,13 @@ # See /LICENSE for more information. # include $(TOPDIR)/rules.mk -include $(INCLUDE_DIR)/target.mk PKG_NAME:=ccache -PKG_VERSION:=4.6.3 +PKG_VERSION:=4.8.1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://github.com/ccache/ccache/releases/download/v$(PKG_VERSION) -PKG_HASH:=1e3a251bb112632553b8255a78661fe526c3a16598496d51128c32b218fd8b22 +PKG_HASH:=87959b6819530b3dcaeb39992f585b9fc2c7120302809741378097774919fb6f include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/cmake.mk @@ -22,20 +21,7 @@ CMAKE_HOST_OPTIONS += \ -DCMAKE_CXX_COMPILER_LAUNCHER="" \ -DCMAKE_SKIP_RPATH=FALSE \ -DCMAKE_INSTALL_RPATH="${STAGING_DIR_HOST}/lib" \ + -DENABLE_DOCUMENTATION=OFF \ -DREDIS_STORAGE_BACKEND=OFF -ifneq (docs-$(CONFIG_BUILD_DOCUMENTATION),docs-y) -CMAKE_HOST_OPTIONS += -DENABLE_DOCUMENTATION=OFF -endif - -define Host/Install/ccache - $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin/ - $(CP) ./files/* $(STAGING_DIR_HOST)/bin/ -endef - -define Host/Install - $(call Host/Install/Default) - $(call Host/Install/ccache) -endef - $(eval $(call HostBuild)) diff --git a/tools/ccache/files/ccache_cc b/tools/ccache/files/ccache_cc deleted file mode 100755 index 01c4ad42a2..0000000000 --- a/tools/ccache/files/ccache_cc +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec ccache "${TARGET_CC_NOCACHE}" "$@" diff --git a/tools/ccache/files/ccache_cxx b/tools/ccache/files/ccache_cxx deleted file mode 100755 index cc60eb3a13..0000000000 --- a/tools/ccache/files/ccache_cxx +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec ccache "${TARGET_CXX_NOCACHE}" "$@" diff --git a/tools/ccache/patches/100-honour-copts.patch b/tools/ccache/patches/100-honour-copts.patch index c8f2fc0fe6..da72af922d 100644 --- a/tools/ccache/patches/100-honour-copts.patch +++ b/tools/ccache/patches/100-honour-copts.patch @@ -1,10 +1,10 @@ --- a/src/ccache.cpp +++ b/src/ccache.cpp -@@ -1756,6 +1756,7 @@ calculate_result_and_manifest_key(Contex - "CPLUS_INCLUDE_PATH", - "OBJC_INCLUDE_PATH", - "OBJCPLUS_INCLUDE_PATH", // clang -+ "GCC_HONOUR_COPTS", - nullptr}; - for (const char** p = envvars; *p; ++p) { - const char* v = getenv(*p); +@@ -1813,6 +1813,7 @@ get_manifest_key(Context& ctx, Hash& has + "CPLUS_INCLUDE_PATH", + "OBJC_INCLUDE_PATH", + "OBJCPLUS_INCLUDE_PATH", // clang ++ "GCC_HONOUR_COPTS", + nullptr}; + for (const char** p = envvars; *p; ++p) { + const char* v = getenv(*p); diff --git a/tools/cmake/Makefile b/tools/cmake/Makefile index e5995952ee..02c609d4b4 100644 --- a/tools/cmake/Makefile +++ b/tools/cmake/Makefile @@ -7,14 +7,15 @@ include $(TOPDIR)/rules.mk PKG_NAME:=cmake -PKG_VERSION:=3.22.3 +PKG_VERSION:=3.26.4 +PKG_VERSION_MAJOR:=$(word 1,$(subst ., ,$(PKG_VERSION))).$(word 2,$(subst ., ,$(PKG_VERSION))) PKG_RELEASE:=1 PKG_CPE_ID:=cpe:/a:kitware:cmake PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/Kitware/CMake/releases/download/v$(PKG_VERSION)/ \ - https://cmake.org/files/v3.22/ -PKG_HASH:=9f8469166f94553b6978a16ee29227ec49a2eb5ceb608275dec40d8ae0d1b5a0 + https://cmake.org/files/v$(PKG_VERSION_MAJOR)/ +PKG_HASH:=313b6880c291bd4fe31c0aa51d6e62659282a521e695f30d5cc0d25abbd5c208 HOST_BUILD_PARALLEL:=1 HOST_CONFIGURE_PARALLEL:=1 @@ -31,6 +32,10 @@ HOST_CONFIGURE_VARS += \ HOST_CONFIGURE_ARGS := \ $(if $(MAKE_JOBSERVER),--parallel="$(MAKE_JOBSERVER)") \ --prefix="$(STAGING_DIR_HOST)" \ + --system-expat \ + --system-liblzma \ + --system-zlib \ + --system-zstd \ --generator=Ninja define Host/Compile/Default diff --git a/tools/cmake/patches/110-liblzma.patch b/tools/cmake/patches/110-liblzma.patch new file mode 100644 index 0000000000..d7cbd434a1 --- /dev/null +++ b/tools/cmake/patches/110-liblzma.patch @@ -0,0 +1,17 @@ +--- a/Modules/FindLibLZMA.cmake ++++ b/Modules/FindLibLZMA.cmake +@@ -58,7 +58,13 @@ The following variables are provided for + + #]=======================================================================] + +-find_path(LIBLZMA_INCLUDE_DIR lzma.h ) ++if(UNIX) ++ find_package(PkgConfig QUIET) ++ pkg_search_module(PC_liblzma liblzma) ++endif() ++ ++find_path(LIBLZMA_INCLUDE_DIR lzma.h HINTS ${PC_liblzma_INCLUDEDIR} ${PC_liblzma_INCLUDE_DIRS}) ++find_library(LIBLZMA_LIBRARY NAMES lzma HINTS ${PC_liblzma_LIBDIR} ${PC_liblzma_LIBRARY_DIRS}) + if(NOT LIBLZMA_LIBRARY) + find_library(LIBLZMA_LIBRARY_RELEASE NAMES lzma liblzma NAMES_PER_DIR PATH_SUFFIXES lib) + find_library(LIBLZMA_LIBRARY_DEBUG NAMES lzmad liblzmad NAMES_PER_DIR PATH_SUFFIXES lib) diff --git a/tools/cmake/patches/120-curl-fix-libressl-linking.patch b/tools/cmake/patches/120-curl-fix-libressl-linking.patch index fd05d106c8..1744fe5b04 100644 --- a/tools/cmake/patches/120-curl-fix-libressl-linking.patch +++ b/tools/cmake/patches/120-curl-fix-libressl-linking.patch @@ -20,7 +20,7 @@ Signed-off-by: Jo-Philipp Wich --- --- a/Utilities/cmcurl/CMakeLists.txt +++ b/Utilities/cmcurl/CMakeLists.txt -@@ -565,6 +565,14 @@ if(CMAKE_USE_OPENSSL) +@@ -611,6 +611,14 @@ if(CURL_USE_OPENSSL) endif() set(SSL_ENABLED ON) set(USE_OPENSSL ON) diff --git a/tools/cmake/patches/130-bootstrap_parallel_make_flag.patch b/tools/cmake/patches/130-bootstrap_parallel_make_flag.patch index dd66989c98..70d122c9d9 100644 --- a/tools/cmake/patches/130-bootstrap_parallel_make_flag.patch +++ b/tools/cmake/patches/130-bootstrap_parallel_make_flag.patch @@ -1,6 +1,6 @@ --- a/bootstrap +++ b/bootstrap -@@ -1423,7 +1423,10 @@ int main(){ printf("1%c", (char)0x0a); r +@@ -1449,7 +1449,10 @@ int main(){ printf("1%c", (char)0x0a); r ' > "test.c" cmake_original_make_flags="${cmake_make_flags}" if test "x${cmake_parallel_make}" != "x"; then diff --git a/tools/cmake/patches/140-zlib.patch b/tools/cmake/patches/140-zlib.patch new file mode 100644 index 0000000000..8b7b7de1b0 --- /dev/null +++ b/tools/cmake/patches/140-zlib.patch @@ -0,0 +1,20 @@ +--- a/Modules/FindZLIB.cmake ++++ b/Modules/FindZLIB.cmake +@@ -117,10 +117,13 @@ else() + set(ZLIB_NAMES_DEBUG zd zlibd zdlld zlibd1 zlib1d zlibstaticd zlibwapid zlibvcd zlibstatd) + endif() + +-# Try each search configuration. +-foreach(search ${_ZLIB_SEARCHES}) +- find_path(ZLIB_INCLUDE_DIR NAMES zlib.h ${${search}} PATH_SUFFIXES include) +-endforeach() ++if(UNIX) ++ find_package(PkgConfig QUIET) ++ pkg_search_module(PC_zlib zlib) ++endif() ++ ++find_path(ZLIB_INCLUDE_DIR zlib.h HINTS ${PC_zlib_INCLUDEDIR} ${PC_zlib_INCLUDE_DIRS}) ++find_library(ZLIB_LIBRARY NAMES z HINTS ${PC_zlib_LIBDIR} ${PC_zlib_LIBRARY_DIRS}) + + # Allow ZLIB_LIBRARY to be set manually, as the location of the zlib library + if(NOT ZLIB_LIBRARY) diff --git a/tools/cmake/patches/150-zstd-libarchive.patch b/tools/cmake/patches/150-zstd-libarchive.patch new file mode 100644 index 0000000000..34f7240fe4 --- /dev/null +++ b/tools/cmake/patches/150-zstd-libarchive.patch @@ -0,0 +1,18 @@ +--- a/Utilities/cmlibarchive/CMakeLists.txt ++++ b/Utilities/cmlibarchive/CMakeLists.txt +@@ -632,8 +632,13 @@ IF(ENABLE_ZSTD) + SET(ZSTD_FIND_QUIETLY TRUE) + ENDIF (ZSTD_INCLUDE_DIR) + +- FIND_PATH(ZSTD_INCLUDE_DIR zstd.h) +- FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd) ++ IF(UNIX) ++ FIND_PACKAGE(PkgConfig QUIET) ++ PKG_SEARCH_MODULE(PC_ZSTD libzstd) ++ ENDIF() ++ ++ FIND_PATH(ZSTD_INCLUDE_DIR zstd.h HINTS ${PC_ZSTD_INCLUDEDIR} ${PC_ZSTD_INCLUDE_DIRS}) ++ FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd HINTS ${PC_ZSTD_LIBDIR} ${PC_ZSTD_LIBRARY_DIRS}) + INCLUDE(FindPackageHandleStandardArgs) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZSTD DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR) + ELSE(ENABLE_ZSTD) diff --git a/tools/coreutils/Makefile b/tools/coreutils/Makefile index fc5c259d8f..8630286206 100644 --- a/tools/coreutils/Makefile +++ b/tools/coreutils/Makefile @@ -8,30 +8,61 @@ include $(TOPDIR)/rules.mk PKG_NAME:=coreutils PKG_CPE_ID:=cpe:/a:gnu:coreutils -PKG_VERSION:=8.32 +PKG_VERSION:=9.3 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/coreutils -PKG_HASH:=4458d8de7849df44ccab15e16b1548b285224dbba5f08fac070c1c0e0bcc4cfa +PKG_HASH:=adbcfcfe899235b71e8768dcf07cd532520b7f54f9a8064843f8d199a904bbaa HOST_BUILD_PARALLEL := 1 -BUILD_PROGRAMS = date readlink touch ln chown +PKG_PROGRAMS:=date readlink touch ln chown ginstall include $(INCLUDE_DIR)/host-build.mk -BUILD_BINS = $(patsubst %,src/%,$(BUILD_PROGRAMS)) +export GNULIB_SRCDIR:=$(HOST_GNULIB_SRCDIR) HOST_CONFIGURE_ARGS += \ - --enable-install-program=$(subst $(space),$(comma),$(strip $(BUILD_PROGRAMS))) + --enable-install-program=$(subst $(space),$(comma),$(strip $(PKG_PROGRAMS))) HOST_MAKE_FLAGS += \ - PROGRAMS="$(BUILD_BINS)" \ + $(AM_TOOL_PATHS_FAKE) \ + PROGRAMS="$(patsubst %,src/%,$(PKG_PROGRAMS))" \ LIBRARIES= MANS= SUBDIRS=. +define Host/Bootstrap + ( \ + cd $(HOST_BUILD_DIR); \ + $(AM_TOOL_PATHS_FAKE) \ + ./bootstrap \ + --bootstrap-sync \ + --force \ + --no-git \ + --skip-po \ + --gnulib-srcdir=$(GNULIB_SRCDIR) \ + ) +endef + +define Host/Prepare + $(call Host/Prepare/Default) + $(if $(QUILT),,$(call Host/Bootstrap)) +endef + +define Host/Configure + $(if $(QUILT),$(call Host/Bootstrap)) + -$(CP) $(HOST_BUILD_DIR)/lib/time.in.h~ $(HOST_BUILD_DIR)/lib/time.in.h # @GNULIB_TIME@ not defined + $(call Host/Configure/Default) +endef + define Host/Install $(INSTALL_DIR) $(1)/bin - $(CP) $(patsubst %,$(HOST_BUILD_DIR)/%,$(BUILD_BINS)) $(1)/bin/ + $(INSTALL_BIN) $(patsubst %,$(HOST_BUILD_DIR)/src/%,$(PKG_PROGRAMS)) $(1)/bin/ + ln -sf ginstall $(1)/bin/install +endef + +define Host/Uninstall + rm -f $(STAGING_DIR_HOST)/bin/install + -$(call Host/Compile/Default,uninstall) endef $(eval $(call HostBuild)) diff --git a/tools/coreutils/patches/000-bootstrap.patch b/tools/coreutils/patches/000-bootstrap.patch new file mode 100644 index 0000000000..91be9d338a --- /dev/null +++ b/tools/coreutils/patches/000-bootstrap.patch @@ -0,0 +1,45 @@ +--- a/bootstrap ++++ b/bootstrap +@@ -278,7 +278,7 @@ check_exists() { + ($2 --version /dev/null 2>&1 ++ ($@ --version /dev/null 2>&1 + fi + + test $? -lt 126 +@@ -563,7 +563,7 @@ p + q' + + get_version() { +- app=$1 ++ app="$@" + + $app --version >/dev/null 2>&1 || { $app --version; return 1; } + +@@ -620,13 +620,13 @@ check_versions() { + if [ "$req_ver" = "-" ]; then + # Merely require app to exist; not all prereq apps are well-behaved + # so we have to rely on $? rather than get_version. +- if ! check_exists --verbose $app; then ++ if ! check_exists --verbose "$app"; then + warn_ "Error: '$app' not found" + ret=1 + fi + else + # Require app to produce a new enough version string. +- inst_ver=$(get_version $app) ++ inst_ver=$(get_version "$app") + if [ ! "$inst_ver" ]; then + warn_ "Error: '$app' not found" + ret=1 +@@ -923,7 +923,7 @@ version_controlled_file() { + # two just-pre-run programs. + + # Import from gettext. +-with_gettext=yes ++with_gettext=no + grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \ + with_gettext=no + diff --git a/tools/cpio/Makefile b/tools/cpio/Makefile index 2852209847..1550785ddc 100644 --- a/tools/cpio/Makefile +++ b/tools/cpio/Makefile @@ -3,12 +3,16 @@ include $(TOPDIR)/rules.mk PKG_NAME:=cpio PKG_CPE_ID:=cpe:/a:gnu:cpio -PKG_VERSION:=2.13 +PKG_VERSION:=2.14 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=@GNU/cpio -PKG_HASH:=eab5bdc5ae1df285c59f2a4f140a98fc33678a0bf61bdba67d9436ae26b46f6d +PKG_HASH:=fcdc15d60f7267a6fc7efcd6b9db7b6c8966c4f2fbbb964c24d41336fd3f2c12 include $(INCLUDE_DIR)/host-build.mk +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/cpio/patches/001-duplicate-program-name.patch b/tools/cpio/patches/001-duplicate-program-name.patch deleted file mode 100644 index a7c3fbc8ae..0000000000 --- a/tools/cpio/patches/001-duplicate-program-name.patch +++ /dev/null @@ -1,18 +0,0 @@ -author Sergey Poznyakoff - -https://git.savannah.gnu.org/cgit/cpio.git/commit/?id=641d3f489cf6238bb916368d4ba0d9325a235afb - -* src/global.c: Remove superfluous declaration of program_name - ---- a/src/global.c -+++ b/src/global.c -@@ -184,9 +184,6 @@ unsigned int warn_option = 0; - /* Extract to standard output? */ - bool to_stdout_option = false; - --/* The name this program was run with. */ --char *program_name; -- - /* A pointer to either lstat or stat, depending on whether - dereferencing of symlinks is done for input files. */ - int (*xstat) (); diff --git a/tools/cpio/patches/010-clang.patch b/tools/cpio/patches/010-clang.patch deleted file mode 100644 index 89c7a8149e..0000000000 --- a/tools/cpio/patches/010-clang.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/gnu/xalloc-oversized.h -+++ b/gnu/xalloc-oversized.h -@@ -52,7 +52,7 @@ typedef size_t __xalloc_count_type; - #elif ((5 <= __GNUC__ \ - || (__has_builtin (__builtin_mul_overflow) \ - && __has_builtin (__builtin_constant_p))) \ -- && !__STRICT_ANSI__) -+ && !__STRICT_ANSI__) && !defined(__clang__) - # define xalloc_oversized(n, s) \ - (__builtin_constant_p (n) && __builtin_constant_p (s) \ - ? __xalloc_oversized (n, s) \ diff --git a/tools/dosfstools/Makefile b/tools/dosfstools/Makefile index d52c46b302..b332efdb96 100644 --- a/tools/dosfstools/Makefile +++ b/tools/dosfstools/Makefile @@ -11,10 +11,10 @@ PKG_NAME:=dosfstools PKG_CPE_ID:=cpe:/a:dosfstools_project:dosfstools PKG_VERSION:=4.2 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/dosfstools/dosfstools/releases/download/v$(PKG_VERSION)/ \ http://fossies.org/linux/misc -PKG_HASH:=ba7c716ff9b8208a3bba5094a77584a7dc814141de09ab4ce1ae9b84bbcd7844 +PKG_HASH:=64926eebf90092dca21b14259a5301b7b98e7b1943e8a201c7d726084809b527 HOST_FIXUP:=autoreconf @@ -24,4 +24,8 @@ ifeq ($(HOST_OS),Darwin) HOST_CFLAGS += -UHAVE_ENDIAN_H endif +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/dosfstools/patches/100-source-date-epoch.patch b/tools/dosfstools/patches/100-source-date-epoch.patch new file mode 100644 index 0000000000..c758caa4c1 --- /dev/null +++ b/tools/dosfstools/patches/100-source-date-epoch.patch @@ -0,0 +1,150 @@ +From 8da7bc93315cb0c32ad868f17808468b81fa76ec Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Bj=C3=B8rn=20Forsman?= +Date: Wed, 5 Dec 2018 19:52:51 +0100 +Subject: [PATCH] Honor the SOURCE_DATE_EPOCH variable +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Implement the SOURCE_DATE_EPOCH specification[1] for reproducible +builds. If SOURCE_DATE_EPOCH is set, use it as timestamp instead of the +current time. + +[1] https://reproducible-builds.org/specs/source-date-epoch/ + +Signed-off-by: Bjørn Forsman +--- + src/boot.c | 23 +++++++++++++++++++++-- + src/common.c | 18 ++++++++++++++++-- + src/mkfs.fat.c | 19 ++++++++++++++++--- + 3 files changed, 53 insertions(+), 7 deletions(-) + +--- a/src/boot.c ++++ b/src/boot.c +@@ -33,6 +33,8 @@ + #include + #include + #include ++#include ++#include + + #include "common.h" + #include "fsck.fat.h" +@@ -672,6 +674,7 @@ void write_volume_label(DOS_FS * fs, cha + { + time_t now; + struct tm *mtime; ++ char *source_date_epoch = NULL; + off_t offset; + int created; + DIR_ENT de; +@@ -687,8 +690,24 @@ void write_volume_label(DOS_FS * fs, cha + if (de.name[0] == 0xe5) + de.name[0] = 0x05; + +- now = time(NULL); +- mtime = (now != (time_t)-1) ? localtime(&now) : NULL; ++ source_date_epoch = getenv("SOURCE_DATE_EPOCH"); ++ if (source_date_epoch) { ++ char *tmp = NULL; ++ long long conversion = 0; ++ errno = 0; ++ conversion = strtoll(source_date_epoch, &tmp, 10); ++ now = conversion; ++ if (!isdigit((unsigned char)*source_date_epoch) || *tmp != '\0' ++ || errno != 0 || (long long)now != conversion) { ++ die("SOURCE_DATE_EPOCH is too big or contains non-digits: \"%s\"", ++ source_date_epoch); ++ } ++ mtime = gmtime(&now); ++ } else { ++ now = time(NULL); ++ mtime = (now != (time_t)-1) ? localtime(&now) : NULL; ++ } ++ + if (mtime && mtime->tm_year >= 80 && mtime->tm_year <= 207) { + de.time = htole16((unsigned short)((mtime->tm_sec >> 1) + + (mtime->tm_min << 5) + +--- a/src/common.c ++++ b/src/common.c +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -298,8 +299,21 @@ void check_atari(void) + uint32_t generate_volume_id(void) + { + struct timeval now; ++ char *source_date_epoch = NULL; + +- if (gettimeofday(&now, NULL) != 0 || now.tv_sec == (time_t)-1 || now.tv_sec < 0) { ++ source_date_epoch = getenv("SOURCE_DATE_EPOCH"); ++ if (source_date_epoch) { ++ char *tmp = NULL; ++ long long conversion = 0; ++ errno = 0; ++ conversion = strtoll(source_date_epoch, &tmp, 10); ++ if (!isdigit((unsigned char)*source_date_epoch) || *tmp != '\0' ++ || errno != 0) { ++ die("SOURCE_DATE_EPOCH is too big or contains non-digits: \"%s\"", ++ source_date_epoch); ++ } ++ return (uint32_t)conversion; ++ } else if (gettimeofday(&now, NULL) != 0 || now.tv_sec == (time_t)-1 || now.tv_sec < 0) { + srand(getpid()); + /* rand() returns int from [0,RAND_MAX], therefore only 31 bits */ + return (((uint32_t)(rand() & 0xFFFF)) << 16) | ((uint32_t)(rand() & 0xFFFF)); +--- a/src/mkfs.fat.c ++++ b/src/mkfs.fat.c +@@ -1074,7 +1074,7 @@ static void setup_tables(void) + } + + /* If is not available then generate random 32 bit disk signature */ +- if (invariant) ++ if (invariant || getenv("SOURCE_DATE_EPOCH")) + disk_sig = volume_id; + else if (!disk_sig) + disk_sig = generate_volume_id(); +@@ -1287,7 +1287,7 @@ static void setup_tables(void) + de->name[0] = 0x05; + de->attr = ATTR_VOLUME; + if (create_time != (time_t)-1) { +- if (!invariant) ++ if (!invariant && !getenv("SOURCE_DATE_EPOCH")) + ctime = localtime(&create_time); + else + ctime = gmtime(&create_time); +@@ -1477,6 +1477,7 @@ int main(int argc, char **argv) + int blocks_specified = 0; + struct timeval create_timeval; + long long conversion; ++ char *source_date_epoch = NULL; + + enum {OPT_HELP=1000, OPT_INVARIANT, OPT_MBR, OPT_VARIANT, OPT_CODEPAGE, OPT_OFFSET}; + const struct option long_options[] = { +@@ -1497,8 +1498,20 @@ int main(int argc, char **argv) + program_name = p + 1; + } + +- if (gettimeofday(&create_timeval, NULL) == 0 && create_timeval.tv_sec != (time_t)-1) ++ source_date_epoch = getenv("SOURCE_DATE_EPOCH"); ++ if (source_date_epoch) { ++ errno = 0; ++ conversion = strtoll(source_date_epoch, &tmp, 10); ++ create_time = conversion; ++ if (!isdigit((unsigned char)*source_date_epoch) || *tmp != '\0' ++ || errno != 0 || (long long)create_time != conversion) { ++ die("SOURCE_DATE_EPOCH is too big or contains non-digits: \"%s\"", ++ source_date_epoch); ++ } ++ } else if (gettimeofday(&create_timeval, NULL) == 0 && create_timeval.tv_sec != (time_t)-1) { + create_time = create_timeval.tv_sec; ++ } ++ + volume_id = generate_volume_id(); + check_atari(); + diff --git a/tools/dosfstools/patches/101-config-switch-to-AC_CHECK_LIB.patch b/tools/dosfstools/patches/101-config-switch-to-AC_CHECK_LIB.patch new file mode 100644 index 0000000000..5b6e669692 --- /dev/null +++ b/tools/dosfstools/patches/101-config-switch-to-AC_CHECK_LIB.patch @@ -0,0 +1,28 @@ +From e7671c2a3be03d790cbc225cd3e784b5434fb5da Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Mon, 16 Jan 2023 01:29:22 +0100 +Subject: [PATCH] config: switch to AC_CHECK_LIB + +This fixes spurious build-errors on libreCMC, where the AM_ICONV macro +is undefined while invoking autoconfig. Later in the build, the ICONV +LDOPTIONS are set to @LIBICONV@, failing the build. + +Signed-off-by: David Bauer +--- + configure.ac | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +--- a/configure.ac ++++ b/configure.ac +@@ -70,10 +70,7 @@ AC_CHECK_DECLS([getmntent], [], [], [[#i + AC_CHECK_DECLS([getmntinfo], [], [], [[#include ]]) + + # optional iconv support +-AC_ARG_WITH([iconv], AS_HELP_STRING([--without-iconv], [build without iconv support])) +-if test "x$with_iconv" != "xno"; then +- AM_ICONV +-fi ++AC_CHECK_LIB(iconv, iconv_open) + + # xxd (distributed with vim) is used in the testsuite + AC_CHECK_PROG([XXD_FOUND], [xxd], [yes]) diff --git a/tools/dwarves/Makefile b/tools/dwarves/Makefile new file mode 100644 index 0000000000..0e84a1ba9f --- /dev/null +++ b/tools/dwarves/Makefile @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: GPL-2.0-only + +include $(TOPDIR)/rules.mk + +PKG_NAME:=dwarves +PKG_VERSION:=1.25 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=https://fedorapeople.org/~acme/dwarves/ +PKG_HASH:=e7d45955f6f4eca25a4c8c3bd6611059b35dc217e45976681d7db170fccdec4a + +PKG_LICENSE:=GPL-2.0-only +PKG_LICENSE_FILES:=COPYING + +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/cmake.mk + +CMAKE_HOST_OPTIONS += \ + -D__LIB=lib \ + -DCMAKE_INSTALL_RPATH="$(STAGING_DIR_HOST)/lib" \ + -DCMAKE_SKIP_RPATH=FALSE + +define Host/Clean + $(RM) $(STAGING_DIR_HOST)/bin/{codiff,ctracer,dtagnames,pahole,pdwtags} + $(RM) $(STAGING_DIR_HOST)/bin/{pfunct,pglobal,prefcnt,scncopy,syscse} + $(RM) $(STAGING_DIR_HOST)/bin/{ostra-cg,btfdiff,fullcircle} + $(RM) $(STAGING_DIR_HOST)/lib/libdwarves*.so* + $(RM) $(STAGING_DIR_HOST)/share/man/man1/pahole.1 + rm -rf $(STAGING_DIR_HOST)/include/dwarves + rm -rf $(STAGING_DIR_HOST)/share/dwarves + $(call Host/Clean/Default) +endef + +$(eval $(call HostBuild)) diff --git a/tools/e2fsprogs/Makefile b/tools/e2fsprogs/Makefile index a6db424fa9..0aa85af3f1 100644 --- a/tools/e2fsprogs/Makefile +++ b/tools/e2fsprogs/Makefile @@ -9,9 +9,9 @@ include $(TOPDIR)/rules.mk PKG_NAME:=e2fsprogs PKG_CPE_ID:=cpe:/a:e2fsprogs_project:e2fsprogs -PKG_VERSION:=1.46.4 -PKG_HASH:=b11042533c1b1dcf17512f0da48e05b0c573dada1dd8b762864d10f4dc399713 -PKG_RELEASE:=2 +PKG_VERSION:=1.47.0 +PKG_HASH:=144af53f2bbd921cef6f8bea88bb9faddca865da3fbc657cc9b4d2001097d5db +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/linux/kernel/people/tytso/e2fsprogs/v$(PKG_VERSION)/ diff --git a/tools/e2fsprogs/patches/001-exit_0_on_corrected_errors.patch b/tools/e2fsprogs/patches/001-exit_0_on_corrected_errors.patch index 9b9b06d540..c94c609160 100644 --- a/tools/e2fsprogs/patches/001-exit_0_on_corrected_errors.patch +++ b/tools/e2fsprogs/patches/001-exit_0_on_corrected_errors.patch @@ -1,6 +1,6 @@ --- a/e2fsck/e2fsck.h +++ b/e2fsck/e2fsck.h -@@ -74,7 +74,7 @@ +@@ -81,7 +81,7 @@ * Exit codes used by fsck-type programs */ #define FSCK_OK 0 /* No errors */ diff --git a/tools/e2fsprogs/patches/003-no-crond.patch b/tools/e2fsprogs/patches/003-no-crond.patch index a7ea52b1ac..67ddd4ab0c 100644 --- a/tools/e2fsprogs/patches/003-no-crond.patch +++ b/tools/e2fsprogs/patches/003-no-crond.patch @@ -1,11 +1,11 @@ --- a/configure +++ b/configure -@@ -12538,7 +12538,7 @@ $as_echo_n "checking for system crontab +@@ -15259,7 +15259,7 @@ then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${crond_dir}" >&5 - $as_echo "${crond_dir}" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${crond_dir}" >&5 + printf "%s\n" "${crond_dir}" >&6; } - have_crond="yes" + have_crond="no"; with_crond_dir="" - else + else $as_nop diff --git a/tools/e2fsprogs/patches/004-CVE-2022-1304-libext2fs-add-sanity-check-to-extent-manipulation.patch b/tools/e2fsprogs/patches/004-CVE-2022-1304-libext2fs-add-sanity-check-to-extent-manipulation.patch deleted file mode 100644 index e5a76161f2..0000000000 --- a/tools/e2fsprogs/patches/004-CVE-2022-1304-libext2fs-add-sanity-check-to-extent-manipulation.patch +++ /dev/null @@ -1,50 +0,0 @@ -From ab51d587bb9b229b1fade1afd02e1574c1ba5c76 Mon Sep 17 00:00:00 2001 -From: Lukas Czerner -Date: Thu, 21 Apr 2022 19:31:48 +0200 -Subject: libext2fs: add sanity check to extent manipulation - -It is possible to have a corrupted extent tree in such a way that a leaf -node contains zero extents in it. Currently if that happens and we try -to traverse the tree we can end up accessing wrong data, or possibly -even uninitialized memory. Make sure we don't do that. - -Additionally make sure that we have a sane number of bytes passed to -memmove() in ext2fs_extent_delete(). - -Note that e2fsck is currently unable to spot and fix such corruption in -pass1. - -Signed-off-by: Lukas Czerner -Reported-by: Nils Bars -Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2068113 -Addresses: CVE-2022-1304 -Addresses-Debian-Bug: #1010263 -Signed-off-by: Theodore Ts'o ---- - lib/ext2fs/extent.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - ---- a/lib/ext2fs/extent.c -+++ b/lib/ext2fs/extent.c -@@ -495,6 +495,10 @@ retry: - ext2fs_le16_to_cpu(eh->eh_entries); - newpath->max_entries = ext2fs_le16_to_cpu(eh->eh_max); - -+ /* Make sure there is at least one extent present */ -+ if (newpath->left <= 0) -+ return EXT2_ET_EXTENT_NO_DOWN; -+ - if (path->left > 0) { - ix++; - newpath->end_blk = ext2fs_le32_to_cpu(ix->ei_block); -@@ -1630,6 +1634,10 @@ errcode_t ext2fs_extent_delete(ext2_exte - - cp = path->curr; - -+ /* Sanity check before memmove() */ -+ if (path->left < 0) -+ return EXT2_ET_EXTENT_LEAF_BAD; -+ - if (path->left) { - memmove(cp, cp + sizeof(struct ext3_extent_idx), - path->left * sizeof(struct ext3_extent_idx)); diff --git a/tools/elfutils/Makefile b/tools/elfutils/Makefile new file mode 100644 index 0000000000..f9c6272719 --- /dev/null +++ b/tools/elfutils/Makefile @@ -0,0 +1,37 @@ +# SPDX-License-Identifier: GPL-2.0-only + +include $(TOPDIR)/rules.mk + +PKG_NAME:=elfutils +PKG_VERSION:=0.189 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL:=https://sourceware.org/$(PKG_NAME)/ftp/$(PKG_VERSION) +PKG_HASH:=39bd8f1a338e2b7cd4abc3ff11a0eddc6e690f69578a57478d8179b4148708c8 + +PKG_LICENSE:=GPL-3.0-or-later +PKG_LICENSE_FILES:=COPYING COPYING-GPLV2 COPYING-LGPLV3 +PKG_CPE_ID:=cpe:/a:elfutils_project:elfutils + +PKG_FIXUP:=autoreconf +PKG_INSTALL:=1 + +include $(INCLUDE_DIR)/host-build.mk + +HOST_CONFIGURE_ARGS += \ + --disable-debuginfod \ + --disable-libdebuginfod \ + --disable-nls \ + --disable-shared \ + --without-lzma \ + --without-zstd + +HOST_MAKE_FLAGS += \ + SUBDIRS="lib libelf libcpu backends libebl libdwelf libdwfl libdw" + +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + +$(eval $(call HostBuild)) diff --git a/tools/expat/Makefile b/tools/expat/Makefile index 21548de442..c1a8cb8d97 100644 --- a/tools/expat/Makefile +++ b/tools/expat/Makefile @@ -15,19 +15,19 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_HASH:=ef2420f0232c087801abf705e89ae65f6257df6b7931d37846a193ef2e8cdcbe PKG_SOURCE_URL:=https://github.com/libexpat/libexpat/releases/download/R_$(subst .,_,$(PKG_VERSION)) +HOST_BUILD_PARALLEL:=1 + include $(INCLUDE_DIR)/host-build.mk -include $(INCLUDE_DIR)/cmake.mk - -CMAKE_HOST_OPTIONS += \ - -DDOCBOOK_TO_MAN=OFF \ - -DEXPAT_BUILD_TOOLS=OFF \ - -DEXPAT_BUILD_EXAMPLES=OFF \ - -DEXPAT_BUILD_TESTS=OFF \ - -DEXPAT_BUILD_DOCS=OFF \ - -DEXPAT_WITH_LIBBSD=OFF \ - -DEXPAT_ENABLE_INSTALL=ON \ - -DEXPAT_DTD=ON \ - -DEXPAT_NS=OFF \ - -DEXPAT_DEV_URANDOM=OFF + +HOSTCC := $(HOSTCC_NOCACHE) + +HOST_CONFIGURE_ARGS += \ + --disable-shared \ + --without-docbook \ + --with-pic + +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef $(eval $(call HostBuild)) diff --git a/tools/fakeroot/Makefile b/tools/fakeroot/Makefile index c29f51e77f..efd9227d1a 100644 --- a/tools/fakeroot/Makefile +++ b/tools/fakeroot/Makefile @@ -5,12 +5,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=fakeroot -PKG_VERSION:=1.28 +PKG_VERSION:=1.29 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).orig.tar.gz PKG_SOURCE_URL:=@DEBIAN/pool/main/f/fakeroot -PKG_HASH:=56d405e36ff685f83879be08fdd654255ab9aa38632b4605a98e896ad63990c2 +PKG_HASH:=8fbbafb780c9173e3ace4a04afbc1d900f337f3216883939f5c7db3431be7c20 PKG_LICENSE:=GPL-3.0-or-later PKG_LICENSE_FILES:=COPYING PKG_FIXUP:=autoreconf @@ -25,4 +25,8 @@ HOST_CONFIGURE_VARS += \ HOST_CONFIGURE_ARGS += \ --with-ipc=tcp +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/fakeroot/patches/400-alpine-libc.musl-fix.patch b/tools/fakeroot/patches/400-alpine-libc.musl-fix.patch index 56710de65d..aebe50c14d 100644 --- a/tools/fakeroot/patches/400-alpine-libc.musl-fix.patch +++ b/tools/fakeroot/patches/400-alpine-libc.musl-fix.patch @@ -21,7 +21,7 @@ Error relocating librecmc/staging_dir/host/lib/libfakeroot.so: SEND_GET_XATTR: s #define SEND_GET_XATTR64(a,b,c) send_get_xattr64(a,b) #endif -@@ -140,8 +142,9 @@ +@@ -142,8 +144,9 @@ /* 10.10 uses id_t in getpriority/setpriority calls, so pretend id_t is used everywhere, just happens to be int on some OSes */ diff --git a/tools/fakeroot/patches/600-macOS.patch b/tools/fakeroot/patches/600-macOS.patch index f9d6d189b2..730367f07c 100644 --- a/tools/fakeroot/patches/600-macOS.patch +++ b/tools/fakeroot/patches/600-macOS.patch @@ -36,7 +36,7 @@ posix_spawn;int;(pid_t * __restrict pid, const char * __restrict path, const posix_spawn_file_actions_t *file_actions, const posix_spawnattr_t * __restrict attrp, char *const argv[ __restrict], char *const envp[ __restrict]);(pid, path, file_actions, attrp, argv, envp) posix_spawnp;int;(pid_t * __restrict pid, const char * __restrict path, const posix_spawn_file_actions_t *file_actions, const posix_spawnattr_t * __restrict attrp, char *const argv[ __restrict], char *const envp[ __restrict]);(pid, path, file_actions, attrp, argv, envp) #endif -@@ -232,7 +234,7 @@ facl;int;(int fd, int cmd, int cnt, void +@@ -229,7 +231,7 @@ facl;int;(int fd, int cmd, int cnt, void #ifdef HAVE_FTS_READ fts_read;FTSENT *;(FTS *ftsp);(ftsp) #ifdef __APPLE__ @@ -45,7 +45,7 @@ fts_read$INODE64;FTSENT *;(FTS *ftsp);(ftsp) #endif #endif /* ifdef __APPLE__ */ -@@ -240,7 +242,7 @@ fts_read$INODE64;FTSENT *;(FTS *ftsp);(f +@@ -237,7 +239,7 @@ fts_read$INODE64;FTSENT *;(FTS *ftsp);(f #ifdef HAVE_FTS_CHILDREN fts_children;FTSENT *;(FTS *ftsp, int options);(ftsp, options) #ifdef __APPLE__ diff --git a/tools/findutils/Makefile b/tools/findutils/Makefile index d0d780689b..fd0cde2145 100644 --- a/tools/findutils/Makefile +++ b/tools/findutils/Makefile @@ -14,6 +14,8 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/$(PKG_NAME) PKG_HASH:=a2bfb8c09d436770edc59f50fa483e785b161a3b7b9d547573cb08065fd462fe +PKG_PROGRAMS:=find locate updatedb xargs + HOST_BUILD_PARALLEL:=1 include $(INCLUDE_DIR)/host-build.mk @@ -28,4 +30,8 @@ HOST_CONFIGURE_ARGS += \ --disable-nls \ --without-selinux +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/firmware-utils/Makefile b/tools/firmware-utils/Makefile index a66749f32d..6716206a4e 100644 --- a/tools/firmware-utils/Makefile +++ b/tools/firmware-utils/Makefile @@ -11,9 +11,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/firmware-utils.git -PKG_SOURCE_DATE:=2022-04-25 -PKG_SOURCE_VERSION:=ddc3e00e314d3fbc3f9faab2d07395722ce9b01a -PKG_MIRROR_HASH:=246fc1d72d3a8cdb4072d81e033c92abaf614acd6f35a10fffd029d5c7f9303b +PKG_SOURCE_DATE:=2023-11-21 +PKG_SOURCE_VERSION:=12bf1a99bd6eebae90caa144bb4d8b0cd763ff8f +PKG_MIRROR_HASH:=f711bf80123a6f14737da27ab8dfff87a4d429c74057de355b1693e89f223abc include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/cmake.mk diff --git a/tools/flex/Makefile b/tools/flex/Makefile index bb5aecbdfe..86ba5a4415 100644 --- a/tools/flex/Makefile +++ b/tools/flex/Makefile @@ -21,13 +21,21 @@ include $(INCLUDE_DIR)/host-build.mk HOST_CONFIGURE_ARGS += --disable-shared +define Host/Compile + $(call Host/Compile/Default,SUBDIRS='src tools') +endef + define Host/Install - $(call Host/Install/Default) + $(call Host/Compile/Default,install SUBDIRS='src tools') $(LN) flex $(STAGING_DIR_HOST)/bin/lex endef +define Host/Uninstall + -$(call Host/Compile/Default,uninstall SUBDIRS='src tools') +endef + define Host/Clean - -$(MAKE) -C $(HOST_BUILD_DIR) uninstall + rm -f $(STAGING_DIR_HOST)/bin/lex $(call Host/Clean/Default) endef diff --git a/tools/flex/patches/100-disable-tests-docs.patch b/tools/flex/patches/100-disable-tests-docs.patch deleted file mode 100644 index f7097f2127..0000000000 --- a/tools/flex/patches/100-disable-tests-docs.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/Makefile.am -+++ b/Makefile.am -@@ -43,10 +43,7 @@ EXTRA_DIST = \ - - SUBDIRS = \ - src \ -- doc \ -- examples \ - po \ -- tests \ - tools - - # Create the ChangeLog, but only if we're inside a git working directory diff --git a/tools/flock/Makefile b/tools/flock/Makefile index cd3561bb69..4e0a45440f 100644 --- a/tools/flock/Makefile +++ b/tools/flock/Makefile @@ -24,4 +24,8 @@ define Host/Install $(INSTALL_BIN) $(HOST_BUILD_DIR)/flock $(STAGING_DIR_HOST)/bin/ endef +define Host/Clean + rm -f $(STAGING_DIR_HOST)/bin/flock +endef + $(eval $(call HostBuild)) diff --git a/tools/genext2fs/Makefile b/tools/genext2fs/Makefile index 3a911df91a..4e7abf8bb6 100644 --- a/tools/genext2fs/Makefile +++ b/tools/genext2fs/Makefile @@ -8,11 +8,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=genext2fs -PKG_VERSION:=1.4.1 +PKG_VERSION:=1.5.0 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=@SF/genext2fs -PKG_HASH:=404dbbfa7a86a6c3de8225c8da254d026b17fd288e05cec4df2cc7e1f4feecfc +PKG_SOURCE_URL:=https://codeload.github.com/bestouff/$(PKG_NAME)/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=d3861e4fe89131bd21fbd25cf0b683b727b5c030c4c336fadcd738ada830aab0 include $(INCLUDE_DIR)/host-build.mk @@ -33,6 +33,13 @@ HOST_CONFIGURE_ARGS = \ --mandir=/usr/man \ --infodir=/usr/info \ +define Host/Configure + (cd $(HOST_BUILD_DIR); \ + ./autogen.sh \ + ); + $(call Host/Configure/Default) +endef + define Host/Compile $(MAKE) -C $(HOST_BUILD_DIR) \ CFLAGS="$(HOST_CFLAGS)" \ diff --git a/tools/genext2fs/patches/100-c99_scanf.patch b/tools/genext2fs/patches/100-c99_scanf.patch deleted file mode 100644 index e7aa17cc6f..0000000000 --- a/tools/genext2fs/patches/100-c99_scanf.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit 3b8ca0ce9a0b58287a780747c90c449bdebfe464 -Author: Xavier Bestel -Date: Mon Jan 14 08:52:44 2008 +0000 - - removed use of %as is scanf (GNU conflicts with C99) by Giacomo Catenazzi - -diff --git a/genext2fs.c b/genext2fs.c -index 070b270..f0d797d 100644 ---- a/genext2fs.c -+++ b/genext2fs.c -@@ -286,7 +286,9 @@ typedef unsigned int uint32; - // older solaris. Note that this is still not very portable, in that - // the return value cannot be trusted. - --#if SCANF_CAN_MALLOC -+#if 0 // SCANF_CAN_MALLOC -+// C99 define "a" for floating point, so you can have runtime surprise -+// according the library versions - # define SCANF_PREFIX "a" - # define SCANF_STRING(s) (&s) - #else diff --git a/tools/genext2fs/patches/200-autoconf.patch b/tools/genext2fs/patches/200-autoconf.patch deleted file mode 100644 index b3317bdd10..0000000000 --- a/tools/genext2fs/patches/200-autoconf.patch +++ /dev/null @@ -1,13 +0,0 @@ -Index: genext2fs/m4/ac_func_scanf_can_malloc.m4 -=================================================================== ---- genext2fs.orig/m4/ac_func_scanf_can_malloc.m4 2011-09-03 21:28:49.000000000 +0200 -+++ genext2fs/m4/ac_func_scanf_can_malloc.m4 2011-09-03 21:29:41.000000000 +0200 -@@ -9,7 +9,7 @@ - # -------------------------------------- - AC_DEFUN([AC_FUNC_SCANF_CAN_MALLOC], - [ AC_CHECK_HEADERS([stdlib.h]) -- AC_CACHE_CHECK([whether scanf can malloc], [ac_scanf_can_malloc], -+ AC_CACHE_CHECK([whether scanf can malloc], [ac_cv_func_scanf_can_malloc], - [ AC_RUN_IFELSE( - [ AC_LANG_PROGRAM( - [ diff --git a/tools/genext2fs/patches/300-blocksize-creator.patch b/tools/genext2fs/patches/300-blocksize-creator.patch deleted file mode 100644 index 97a4836eeb..0000000000 --- a/tools/genext2fs/patches/300-blocksize-creator.patch +++ /dev/null @@ -1,558 +0,0 @@ -Index: genext2fs/genext2fs.c -=================================================================== ---- genext2fs.orig/genext2fs.c 2011-09-03 14:21:17.000000000 +0200 -+++ genext2fs/genext2fs.c 2011-09-03 14:21:17.000000000 +0200 -@@ -151,13 +151,24 @@ - - // block size - --#define BLOCKSIZE 1024 -+static int blocksize = 1024; -+ -+#define BLOCKSIZE blocksize - #define BLOCKS_PER_GROUP 8192 - #define INODES_PER_GROUP 8192 - /* Percentage of blocks that are reserved.*/ - #define RESERVED_BLOCKS 5/100 - #define MAX_RESERVED_BLOCKS 25/100 - -+/* The default value for s_creator_os. */ -+#if defined(__GNU__) -+# define CREATOR_OS 1 /* Hurd */ -+#elif defined(__FreeBSD__) -+# define CREATOR_OS 3 /* FreeBSD */ -+#else -+# define CREATOR_OS 0 /* Linux */ -+#endif -+ - - // inode block size (why is it != BLOCKSIZE ?!?) - /* The field i_blocks in the ext2 inode stores the number of data blocks -@@ -239,10 +250,10 @@ - (fs)->sb.s_blocks_per_group - 1) / (fs)->sb.s_blocks_per_group) - - // Get group block bitmap (bbm) given the group number --#define GRP_GET_GROUP_BBM(fs,grp) ( get_blk((fs),(fs)->gd[(grp)].bg_block_bitmap) ) -+#define GRP_GET_GROUP_BBM(fs,grp) ( get_blk((fs), get_gd((fs),(grp))->bg_block_bitmap) ) - - // Get group inode bitmap (ibm) given the group number --#define GRP_GET_GROUP_IBM(fs,grp) ( get_blk((fs),(fs)->gd[(grp)].bg_inode_bitmap) ) -+#define GRP_GET_GROUP_IBM(fs,grp) ( get_blk((fs), get_gd((fs),(grp))->bg_inode_bitmap) ) - - // Given an inode number find the group it belongs to - #define GRP_GROUP_OF_INODE(fs,nod) ( ((nod)-1) / (fs)->sb.s_inodes_per_group) -@@ -532,7 +543,7 @@ - char d_name[0]; - } directory; - --typedef uint8 block[BLOCKSIZE]; -+typedef uint8 *block; - - /* blockwalker fields: - The blockwalker is used to access all the blocks of a file (including -@@ -571,16 +582,12 @@ - - - /* Filesystem structure that support groups */ --#if BLOCKSIZE == 1024 - typedef struct - { -- block zero; // The famous block 0 -- superblock sb; // The superblock -- groupdescriptor gd[0]; // The group descriptors -+ uint8 zero[1024]; // Room for bootloader stuff -+ superblock sb; // The superblock, always at 1024 -+ // group descriptors come next, see get_gd() below - } filesystem; --#else --#error UNHANDLED BLOCKSIZE --#endif - - // now the endianness swap - -@@ -820,6 +827,14 @@ - return (uint8*)fs + blk*BLOCKSIZE; - } - -+// the group descriptors are aligned on the block size -+static inline groupdescriptor * -+get_gd(filesystem *fs, int no) -+{ -+ int gdblk = (sizeof (filesystem) + BLOCKSIZE - 1) / BLOCKSIZE; -+ return ((groupdescriptor *) get_blk(fs, gdblk)) + no; -+} -+ - // return a given inode from a filesystem - static inline inode * - get_nod(filesystem *fs, uint32 nod) -@@ -829,7 +844,7 @@ - - offset = GRP_IBM_OFFSET(fs,nod); - grp = GRP_GROUP_OF_INODE(fs,nod); -- itab = (inode *)get_blk(fs, fs->gd[grp].bg_inode_table); -+ itab = (inode *)get_blk(fs, get_gd(fs,grp)->bg_inode_table); - return itab+offset-1; - } - -@@ -875,18 +890,18 @@ - - grp = GRP_GROUP_OF_INODE(fs,nod); - nbgroups = GRP_NBGROUPS(fs); -- if(!(bk = allocate(get_blk(fs,fs->gd[grp].bg_block_bitmap), 0))) { -+ if(!(bk = allocate(GRP_GET_GROUP_BBM(fs, grp), 0))) { - for(grp=0;grpgd[grp].bg_block_bitmap),0); -+ bk = allocate(GRP_GET_GROUP_BBM(fs, grp), 0); - grp--; - } - if (!bk) - error_msg_and_die("couldn't allocate a block (no free space)"); -- if(!(fs->gd[grp].bg_free_blocks_count--)) -+ if(!(get_gd(fs, grp)->bg_free_blocks_count--)) - error_msg_and_die("group descr %d. free blocks count == 0 (corrupted fs?)",grp); - if(!(fs->sb.s_free_blocks_count--)) - error_msg_and_die("superblock free blocks count == 0 (corrupted fs?)"); -- return fs->sb.s_blocks_per_group*grp + bk; -+ return fs->sb.s_first_data_block + fs->sb.s_blocks_per_group*grp + (bk-1); - } - - // free a block -@@ -897,8 +912,8 @@ - - grp = bk / fs->sb.s_blocks_per_group; - bk %= fs->sb.s_blocks_per_group; -- deallocate(get_blk(fs,fs->gd[grp].bg_block_bitmap), bk); -- fs->gd[grp].bg_free_blocks_count++; -+ deallocate(GRP_GET_GROUP_BBM(fs, grp), bk); -+ get_gd(fs, grp)->bg_free_blocks_count++; - fs->sb.s_free_blocks_count++; - } - -@@ -918,16 +933,16 @@ - /* We do it for all inodes. */ - avefreei = fs->sb.s_free_inodes_count / nbgroups; - for(grp=0; grpgd[grp].bg_free_inodes_count < avefreei || -- fs->gd[grp].bg_free_inodes_count == 0) -+ if (get_gd(fs, grp)->bg_free_inodes_count < avefreei || -+ get_gd(fs, grp)->bg_free_inodes_count == 0) - continue; - if (!best_group || -- fs->gd[grp].bg_free_blocks_count > fs->gd[best_group].bg_free_blocks_count) -+ get_gd(fs, grp)->bg_free_blocks_count > get_gd(fs, best_group)->bg_free_blocks_count) - best_group = grp; - } -- if (!(nod = allocate(get_blk(fs,fs->gd[best_group].bg_inode_bitmap),0))) -+ if (!(nod = allocate(GRP_GET_GROUP_IBM(fs, best_group), 0))) - error_msg_and_die("couldn't allocate an inode (no free inode)"); -- if(!(fs->gd[best_group].bg_free_inodes_count--)) -+ if(!(get_gd(fs, best_group)->bg_free_inodes_count--)) - error_msg_and_die("group descr. free blocks count == 0 (corrupted fs?)"); - if(!(fs->sb.s_free_inodes_count--)) - error_msg_and_die("superblock free blocks count == 0 (corrupted fs?)"); -@@ -1390,7 +1405,7 @@ - case FM_IFDIR: - add2dir(fs, nod, nod, "."); - add2dir(fs, nod, parent_nod, ".."); -- fs->gd[GRP_GROUP_OF_INODE(fs,nod)].bg_used_dirs_count++; -+ get_gd(fs, GRP_GROUP_OF_INODE(fs,nod))->bg_used_dirs_count++; - break; - } - } -@@ -1860,7 +1875,7 @@ - swap_nod(nod); - } - for(i=0;igd[i])); -+ swap_gd(get_gd(fs, i)); - swap_sb(&fs->sb); - } - -@@ -1870,7 +1885,7 @@ - uint32 i; - swap_sb(&fs->sb); - for(i=0;igd[i])); -+ swap_gd(get_gd(fs, i)); - for(i = 1; i < fs->sb.s_inodes_count; i++) - { - inode *nod = get_nod(fs, i); -@@ -1895,7 +1910,8 @@ - - // initialize an empty filesystem - static filesystem * --init_fs(int nbblocks, int nbinodes, int nbresrvd, int holes, uint32 fs_timestamp) -+init_fs(int nbblocks, int nbinodes, int nbresrvd, int holes, -+ uint32 fs_timestamp, uint32 creator_os) - { - uint32 i; - filesystem *fs; -@@ -1921,10 +1937,14 @@ - */ - min_nbgroups = (nbinodes + INODES_PER_GROUP - 1) / INODES_PER_GROUP; - -+ /* On filesystems with 1k block size, the bootloader area uses a full -+ * block. For 2048 and up, the superblock can be fitted into block 0. -+ */ -+ first_block = (BLOCKSIZE == 1024); -+ - /* nbblocks is the total number of blocks in the filesystem. - * a block group can have no more than 8192 blocks. - */ -- first_block = (BLOCKSIZE == 1024); - nbgroups = (nbblocks - first_block + BLOCKS_PER_GROUP - 1) / BLOCKS_PER_GROUP; - if(nbgroups < min_nbgroups) nbgroups = min_nbgroups; - nbblocks_per_group = rndup((nbblocks - first_block + nbgroups - 1)/nbgroups, 8); -@@ -1936,10 +1956,10 @@ - gdsz = rndup(nbgroups*sizeof(groupdescriptor),BLOCKSIZE)/BLOCKSIZE; - itblsz = nbinodes_per_group * sizeof(inode)/BLOCKSIZE; - overhead_per_group = 3 /*sb,bbm,ibm*/ + gdsz + itblsz; -- if((uint32)nbblocks - 1 < overhead_per_group * nbgroups) -- error_msg_and_die("too much overhead, try fewer inodes or more blocks. Note: options have changed, see --help or the man page."); -- free_blocks = nbblocks - overhead_per_group*nbgroups - 1 /*boot block*/; -+ free_blocks = nbblocks - overhead_per_group*nbgroups - first_block; - free_blocks_per_group = nbblocks_per_group - overhead_per_group; -+ if(free_blocks < 0) -+ error_msg_and_die("too much overhead, try fewer inodes or more blocks. Note: options have changed, see --help or the man page."); - - if(!(fs = (filesystem*)calloc(nbblocks, BLOCKSIZE))) - error_msg_and_die("not enough memory for filesystem"); -@@ -1959,28 +1979,31 @@ - fs->sb.s_wtime = fs_timestamp; - fs->sb.s_magic = EXT2_MAGIC_NUMBER; - fs->sb.s_lastcheck = fs_timestamp; -+ fs->sb.s_creator_os = creator_os; - - // set up groupdescriptors -- for(i=0, bbmpos=gdsz+2, ibmpos=bbmpos+1, itblpos=ibmpos+1; -+ for(i=0, bbmpos=first_block+1+gdsz, ibmpos=bbmpos+1, itblpos=ibmpos+1; - i free_blocks_per_group) { -- fs->gd[i].bg_free_blocks_count = free_blocks_per_group; -+ gd->bg_free_blocks_count = free_blocks_per_group; - free_blocks -= free_blocks_per_group; - } else { -- fs->gd[i].bg_free_blocks_count = free_blocks; -+ gd->bg_free_blocks_count = free_blocks; - free_blocks = 0; // this is the last block group - } - if(i) -- fs->gd[i].bg_free_inodes_count = nbinodes_per_group; -+ gd->bg_free_inodes_count = nbinodes_per_group; - else -- fs->gd[i].bg_free_inodes_count = nbinodes_per_group - -+ gd->bg_free_inodes_count = nbinodes_per_group - - EXT2_FIRST_INO + 2; -- fs->gd[i].bg_used_dirs_count = 0; -- fs->gd[i].bg_block_bitmap = bbmpos; -- fs->gd[i].bg_inode_bitmap = ibmpos; -- fs->gd[i].bg_inode_table = itblpos; -+ gd->bg_used_dirs_count = 0; -+ gd->bg_block_bitmap = bbmpos; -+ gd->bg_inode_bitmap = ibmpos; -+ gd->bg_inode_table = itblpos; - } - - /* Mark non-filesystem blocks and inodes as allocated */ -@@ -1988,9 +2011,9 @@ - for(i = 0; igd[i].bg_block_bitmap); -+ bbm = GRP_GET_GROUP_BBM(fs, i); - //non-filesystem blocks -- for(j = fs->gd[i].bg_free_blocks_count -+ for(j = get_gd(fs, i)->bg_free_blocks_count - + overhead_per_group + 1; j <= BLOCKSIZE * 8; j++) - allocate(bbm, j); - //system blocks -@@ -1998,7 +2021,7 @@ - allocate(bbm, j); - - /* Inode bitmap */ -- ibm = get_blk(fs,fs->gd[i].bg_inode_bitmap); -+ ibm = GRP_GET_GROUP_IBM(fs, i); - //non-filesystem inodes - for(j = fs->sb.s_inodes_per_group+1; j <= BLOCKSIZE * 8; j++) - allocate(ibm, j); -@@ -2012,9 +2035,9 @@ - // make root inode and directory - /* We have groups now. Add the root filesystem in group 0 */ - /* Also increment the directory count for group 0 */ -- fs->gd[0].bg_free_inodes_count--; -- fs->gd[0].bg_used_dirs_count = 1; -- itab0 = (inode *)get_blk(fs,fs->gd[0].bg_inode_table); -+ get_gd(fs, 0)->bg_free_inodes_count--; -+ get_gd(fs, 0)->bg_used_dirs_count = 1; -+ itab0 = (inode *)get_blk(fs, get_gd(fs,0)->bg_inode_table); - itab0[EXT2_ROOT_INO-1].i_mode = FM_IFDIR | FM_IRWXU | FM_IRGRP | FM_IROTH | FM_IXGRP | FM_IXOTH; - itab0[EXT2_ROOT_INO-1].i_ctime = fs_timestamp; - itab0[EXT2_ROOT_INO-1].i_mtime = fs_timestamp; -@@ -2338,8 +2361,9 @@ - for (i = 0; i < GRP_NBGROUPS(fs); i++) { - printf("Group No: %d\n", i+1); - printf("block bitmap: block %d,inode bitmap: block %d, inode table: block %d\n", -- fs->gd[i].bg_block_bitmap, fs->gd[i].bg_inode_bitmap, -- fs->gd[i].bg_inode_table); -+ get_gd(fs, i)->bg_block_bitmap, -+ get_gd(fs, i)->bg_inode_bitmap, -+ get_gd(fs, i)->bg_inode_table); - printf("block bitmap allocation:\n"); - print_bm(GRP_GET_GROUP_BBM(fs, i),fs->sb.s_blocks_per_group); - printf("inode bitmap allocation:\n"); -@@ -2421,10 +2445,12 @@ - " -x, --starting-image \n" - " -d, --root \n" - " -D, --devtable \n" -+ " -B, --block-size \n" - " -b, --size-in-blocks \n" - " -i, --bytes-per-inode \n" - " -N, --number-of-inodes \n" - " -m, --reserved-percentage \n" -+ " -o, --creator-os 'linux', 'hurd', 'freebsd' or a numerical value.\n" - " -g, --block-map Generate a block map file for this path.\n" - " -e, --fill-value Fill unallocated blocks with value.\n" - " -z, --allow-holes Allow files with holes.\n" -@@ -2446,6 +2472,29 @@ - extern char* optarg; - extern int optind, opterr, optopt; - -+// parse the value for -o -+int -+lookup_creator_os(const char *name) -+{ -+ static const char *const creators[] = -+ {"linux", "hurd", "2", "freebsd", NULL}; -+ char *endptr; -+ int i; -+ -+ // numerical value ? -+ i = strtol(name, &endptr, 0); -+ if(name[0] && *endptr == '\0') -+ return i; -+ -+ // symbolic name ? -+ for(i=0; creators[i]; i++) -+ if(strcasecmp(creators[i], name) == 0) -+ return i; -+ -+ // whatever ? -+ return -1; -+} -+ - int - main(int argc, char **argv) - { -@@ -2455,6 +2504,7 @@ - float bytes_per_inode = -1; - float reserved_frac = -1; - int fs_timestamp = -1; -+ int creator_os = CREATOR_OS; - char * fsout = "-"; - char * fsin = 0; - char * dopt[MAX_DOPT]; -@@ -2478,10 +2528,12 @@ - { "starting-image", required_argument, NULL, 'x' }, - { "root", required_argument, NULL, 'd' }, - { "devtable", required_argument, NULL, 'D' }, -+ { "block-size", required_argument, NULL, 'B' }, - { "size-in-blocks", required_argument, NULL, 'b' }, - { "bytes-per-inode", required_argument, NULL, 'i' }, - { "number-of-inodes", required_argument, NULL, 'N' }, - { "reserved-percentage", required_argument, NULL, 'm' }, -+ { "creator-os", required_argument, NULL, 'o' }, - { "block-map", required_argument, NULL, 'g' }, - { "fill-value", required_argument, NULL, 'e' }, - { "allow-holes", no_argument, NULL, 'z' }, -@@ -2497,11 +2549,11 @@ - - app_name = argv[0]; - -- while((c = getopt_long(argc, argv, "x:d:D:b:i:N:m:g:e:zfqUPhVv", longopts, NULL)) != EOF) { -+ while((c = getopt_long(argc, argv, "x:d:D:B:b:i:N:m:o:g:e:zfqUPhVv", longopts, NULL)) != EOF) { - #else - app_name = argv[0]; - -- while((c = getopt(argc, argv, "x:d:D:b:i:N:m:g:e:zfqUPhVv")) != EOF) { -+ while((c = getopt(argc, argv, "x:d:D:B:b:i:N:m:o:g:e:zfqUPhVv")) != EOF) { - #endif /* HAVE_GETOPT_LONG */ - switch(c) - { -@@ -2512,6 +2564,9 @@ - case 'D': - dopt[didx++] = optarg; - break; -+ case 'B': -+ blocksize = SI_atof(optarg); -+ break; - case 'b': - nbblocks = SI_atof(optarg); - break; -@@ -2524,6 +2579,9 @@ - case 'm': - reserved_frac = SI_atof(optarg) / 100; - break; -+ case 'o': -+ creator_os = lookup_creator_os(optarg); -+ break; - case 'g': - gopt[gidx++] = optarg; - break; -@@ -2567,6 +2625,11 @@ - error_msg_and_die("Not enough arguments. Try --help or else see the man page."); - fsout = argv[optind]; - -+ if(blocksize != 1024 && blocksize != 2048 && blocksize != 4096) -+ error_msg_and_die("Valid block sizes: 1024, 2048 or 4096."); -+ if(creator_os < 0) -+ error_msg_and_die("Creator OS unknown."); -+ - hdlinks.hdl = (struct hdlink_s *)malloc(hdlink_cnt * sizeof(struct hdlink_s)); - if (!hdlinks.hdl) - error_msg_and_die("Not enough memory"); -@@ -2611,7 +2674,8 @@ - } - if(fs_timestamp == -1) - fs_timestamp = time(NULL); -- fs = init_fs(nbblocks, nbinodes, nbresrvd, holes, fs_timestamp); -+ fs = init_fs(nbblocks, nbinodes, nbresrvd, holes, -+ fs_timestamp, creator_os); - } - - populate_fs(fs, dopt, didx, squash_uids, squash_perms, fs_timestamp, NULL); -Index: genext2fs/test-gen.lib -=================================================================== ---- genext2fs.orig/test-gen.lib 2011-09-03 13:40:35.000000000 +0200 -+++ genext2fs/test-gen.lib 2011-09-03 14:21:17.000000000 +0200 -@@ -8,7 +8,7 @@ - # Creates an image with a file of given size - # Usage: dgen file-size number-of-blocks - dgen () { -- size=$1; blocks=$2 -+ size=$1; blocks=$2; blocksz=$3; - rm -rf test - mkdir -p test - cd test -@@ -20,7 +20,7 @@ - chmod 777 file.$1 - TZ=UTC-11 touch -t 200502070321.43 file.$1 . - cd .. -- ./genext2fs -N 17 -b $blocks -d test -f -q ext2.img -+ ./genext2fs -B $blocksz -N 17 -b $blocks -d test -f -o Linux -q ext2.img - } - - # fgen - Exercises the -f spec-file option of genext2fs -@@ -31,7 +31,7 @@ - mkdir -p test - cp $fname test - TZ=UTC-11 touch -t 200502070321.43 test/$fname -- ./genext2fs -N 92 -b $blocks -D test/$fname -f ext2.img -+ ./genext2fs -N 92 -b $blocks -D test/$fname -f -o Linux ext2.img - } - - # gen_cleanup - Remove the files generated by the above functions -Index: genext2fs/test-mount.sh -=================================================================== ---- genext2fs.orig/test-mount.sh 2011-09-03 13:40:35.000000000 +0200 -+++ genext2fs/test-mount.sh 2011-09-03 14:21:17.000000000 +0200 -@@ -33,9 +33,9 @@ - # and returns the command line with which to invoke dtest() - # Usage: dtest-mount file-size number-of-blocks - dtest_mount () { -- size=$1; blocks=$2 -- echo Testing with file of size $size -- dgen $size $blocks -+ size=$1; blocks=$2; blocksz=$3; -+ echo Testing $blocks blocks of $blocksz bytes with file of size $size -+ dgen $size $blocks $blocksz - /sbin/e2fsck -fn ext2.img || fail - mkdir -p mnt - mount -t ext2 -o ro,loop ext2.img mnt || fail -@@ -44,7 +44,7 @@ - awk '{print $5}'`" ] ; then - fail - fi -- pass dtest $size $blocks -+ pass dtest $size $blocks $blocksz - } - - # ftest-mount - Exercise the -f spec-file option of genext2fs -@@ -75,13 +75,21 @@ - pass ftest $fname $blocks - } - --dtest_mount 0 4096 --dtest_mount 0 8193 --dtest_mount 0 8194 --dtest_mount 1 4096 --dtest_mount 12288 4096 --dtest_mount 274432 4096 --dtest_mount 8388608 9000 --dtest_mount 16777216 20000 -+dtest_mount 0 4096 1024 -+dtest_mount 0 2048 2048 -+dtest_mount 0 1024 4096 -+dtest_mount 0 8193 1024 -+dtest_mount 0 8194 1024 -+dtest_mount 0 8193 4096 -+dtest_mount 0 8194 2048 -+dtest_mount 1 4096 1024 -+dtest_mount 1 1024 4096 -+dtest_mount 12288 4096 1024 -+dtest_mount 274432 4096 1024 -+dtest_mount 8388608 9000 1024 -+dtest_mount 8388608 4500 2048 -+dtest_mount 8388608 2250 4096 -+dtest_mount 16777216 20000 1024 -+dtest_mount 16777216 10000 2048 - - ftest_mount device_table.txt 4096 -Index: genext2fs/test.sh -=================================================================== ---- genext2fs.orig/test.sh 2011-09-03 13:40:35.000000000 +0200 -+++ genext2fs/test.sh 2011-09-03 14:21:17.000000000 +0200 -@@ -30,9 +30,9 @@ - # Creates an image with a file of given size and verifies it - # Usage: dtest file-size number-of-blocks correct-checksum - dtest () { -- size=$1; blocks=$2; checksum=$3 -+ size=$1; blocks=$2; blocksz=$3; checksum=$4 - echo Testing with file of size $size -- dgen $size $blocks -+ dgen $size $blocks $blocksz - md5cmp $checksum - gen_cleanup - } -@@ -53,12 +53,20 @@ - # replace the following lines with the output of - # sudo sh test-mount.sh|grep test - --dtest 0 4096 3bc6424b8fcd51a0de34ee59d91d5f16 --dtest 0 8193 f174804f6b433b552706cbbfc60c416d --dtest 0 8194 4855a55d0cbdc44584634df49ebd5711 --dtest 1 4096 09c569b6bfb45222c729c42d04d5451f --dtest 12288 4096 61febcbfbf32024ef99103fcdc282c39 --dtest 274432 4096 0c517803552c55c1806e4220b0a0164f --dtest 8388608 9000 e0e5ea15bced10ab486d8135584b5d8e --dtest 16777216 20000 fdf636eb905ab4dc1bf76dce5ac5d209 -+dtest 0 4096 1024 3bc6424b8fcd51a0de34ee59d91d5f16 -+dtest 0 2048 2048 230afa16496df019878cc2370c661cdc -+dtest 0 1024 4096 ebff5eeb38b70f3f1cd081e60eb44561 -+dtest 0 8193 1024 f174804f6b433b552706cbbfc60c416d -+dtest 0 8194 1024 4855a55d0cbdc44584634df49ebd5711 -+dtest 0 8193 4096 c493679698418ec7e6552005e2d2a6d8 -+dtest 0 8194 2048 ec13f328fa7543563f35f494bddc059c -+dtest 1 4096 1024 09c569b6bfb45222c729c42d04d5451f -+dtest 1 1024 4096 d318a326fdc907810ae9e6b0a20e9b06 -+dtest 12288 4096 1024 61febcbfbf32024ef99103fcdc282c39 -+dtest 274432 4096 1024 0c517803552c55c1806e4220b0a0164f -+dtest 8388608 9000 1024 e0e5ea15bced10ab486d8135584b5d8e -+dtest 8388608 4500 2048 39f4d537a72f5053fd6891721c59680d -+dtest 8388608 2250 4096 1d697fa4bc2cfffe02ac91edfadc40bf -+dtest 16777216 20000 1024 fdf636eb905ab4dc1bf76dce5ac5d209 -+dtest 16777216 10000 2048 f9824a81ea5e74fdf469c097927c292b - ftest device_table.txt 4096 a0af06d944b11d2902dfd705484c64cc diff --git a/tools/genext2fs/patches/400-byteswap_fix.patch b/tools/genext2fs/patches/400-byteswap_fix.patch deleted file mode 100644 index 7b3c00b5ee..0000000000 --- a/tools/genext2fs/patches/400-byteswap_fix.patch +++ /dev/null @@ -1,44 +0,0 @@ -Index: genext2fs/genext2fs.c -=================================================================== ---- genext2fs.orig/genext2fs.c 2011-11-29 17:36:06.000000000 +0100 -+++ genext2fs/genext2fs.c 2011-11-29 17:37:37.000000000 +0100 -@@ -1779,7 +1779,8 @@ - assert(nod->i_block[EXT2_DIND_BLOCK] != 0); - for(i = 0; i < BLOCKSIZE/4; i++) - if(nblk > EXT2_IND_BLOCK + BLOCKSIZE/4 + (BLOCKSIZE/4)*i ) -- swap_block(get_blk(fs, ((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i])); -+ if (((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i]) -+ swap_block(get_blk(fs, ((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i])); - swap_block(get_blk(fs, nod->i_block[EXT2_DIND_BLOCK])); - if(nblk <= EXT2_IND_BLOCK + BLOCKSIZE/4 + BLOCKSIZE/4 * BLOCKSIZE/4) - return; -@@ -1792,7 +1793,8 @@ - (BLOCKSIZE/4)*(BLOCKSIZE/4) + - i*(BLOCKSIZE/4)*(BLOCKSIZE/4) + - j*(BLOCKSIZE/4)) ) -- swap_block(get_blk(fs,b2[j])); -+ if (b2[j]) -+ swap_block(get_blk(fs,b2[j])); - else { - done = 1; - break; -@@ -1825,7 +1827,8 @@ - swap_block(get_blk(fs, nod->i_block[EXT2_DIND_BLOCK])); - for(i = 0; i < BLOCKSIZE/4; i++) - if(nblk > EXT2_IND_BLOCK + BLOCKSIZE/4 + (BLOCKSIZE/4)*i ) -- swap_block(get_blk(fs, ((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i])); -+ if (((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i]) -+ swap_block(get_blk(fs, ((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i])); - if(nblk <= EXT2_IND_BLOCK + BLOCKSIZE/4 + BLOCKSIZE/4 * BLOCKSIZE/4) - return; - /* Adding support for triple indirection */ -@@ -1839,7 +1842,8 @@ - (BLOCKSIZE/4)*(BLOCKSIZE/4) + - i*(BLOCKSIZE/4)*(BLOCKSIZE/4) + - j*(BLOCKSIZE/4)) ) -- swap_block(get_blk(fs,b2[j])); -+ if (b2[j]) -+ swap_block(get_blk(fs,b2[j])); - else { - done = 1; - break; diff --git a/tools/gengetopt/Makefile b/tools/gengetopt/Makefile index 563ecccf9d..5a5b5eb7cb 100644 --- a/tools/gengetopt/Makefile +++ b/tools/gengetopt/Makefile @@ -13,12 +13,16 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/$(PKG_NAME) PKG_HASH:=b941aec9011864978dd7fdeb052b1943535824169d2aa2b0e7eae9ab807584ac -HOST_FIXUP:=autoreconf +PKG_SUBDIRS:=$$$$(foreach dir,gl src skels,$$$$(wildcard $$$$(dir)) ) HOST_BUILD_PARALLEL:=1 include $(INCLUDE_DIR)/host-build.mk +define Host/Compile + $(call Host/Compile/Default,SUBDIRS='$(PKG_SUBDIRS)') +endef + define Host/Install $(INSTALL_BIN) $(HOST_BUILD_DIR)/src/gengetopt $(STAGING_DIR_HOST)/bin/ endef diff --git a/tools/gengetopt/patches/100-no-tests-docs.patch b/tools/gengetopt/patches/100-no-tests-docs.patch deleted file mode 100644 index d8c53af4fb..0000000000 --- a/tools/gengetopt/patches/100-no-tests-docs.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- a/Makefile.am -+++ b/Makefile.am -@@ -18,7 +18,7 @@ - ACLOCAL_AMFLAGS = -I m4 -I gl/m4 - - EXTRA_DIST = configure TODO LICENSE gl/m4/gnulib-cache.m4 --SUBDIRS = gl src doc tests -+SUBDIRS = gl src - - gengetoptdoc_DATA = ChangeLog COPYING NEWS THANKS INSTALL README LICENSE - ---- a/Makefile.in -+++ b/Makefile.in -@@ -593,7 +593,7 @@ top_builddir = @top_builddir@ - top_srcdir = @top_srcdir@ - ACLOCAL_AMFLAGS = -I m4 -I gl/m4 - EXTRA_DIST = configure TODO LICENSE gl/m4/gnulib-cache.m4 --SUBDIRS = gl src doc tests -+SUBDIRS = gl src - gengetoptdoc_DATA = ChangeLog COPYING NEWS THANKS INSTALL README LICENSE - TARBALL = $(top_builddir)/gengetopt-$(PACKAGE_VERSION).tar.xz - all: config.h ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -16,7 +16,7 @@ - # with gengetopt; see the file COPYING. If not, write to the Free Software - # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - --SUBDIRS = skels tests -+SUBDIRS = skels - - bin_PROGRAMS = gengetopt - diff --git a/tools/gmp/Makefile b/tools/gmp/Makefile index 967cf6817b..c48069dd7b 100644 --- a/tools/gmp/Makefile +++ b/tools/gmp/Makefile @@ -12,6 +12,7 @@ PKG_VERSION:=6.2.1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/gmp/ PKG_HASH:=fd4829912cddd12f84181c3451cc752be224643e87fac497b69edddadc49b4f2 +PKG_CPE_ID:=cpe:/a:gmplib:gmp HOST_FIXUP:=autoreconf @@ -31,4 +32,8 @@ ifeq ($(GNU_HOST_NAME),x86_64-linux-gnux32) HOST_CONFIGURE_ARGS += ABI=x32 endif +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/gnulib/Makefile b/tools/gnulib/Makefile new file mode 100644 index 0000000000..43d86c213c --- /dev/null +++ b/tools/gnulib/Makefile @@ -0,0 +1,27 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=gnulib +PKG_CPE_ID:=cpe:/a:gnu:$(PKG_NAME) +PKG_VERSION:=f9a4ee73c3e7b544f640d0d04b55983d3a7b894e# # master + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://git.savannah.gnu.org/cgit/$(PKG_NAME).git/snapshot +PKG_HASH:=514716d58987a9c0de0d69fb22d42bcd19edf80eed099882a004ff162060f1a8 + +include $(INCLUDE_DIR)/host-build.mk + +define Host/Configure +endef + +define Host/Install + $(INSTALL_DIR) $(1)/share/aclocal + $(INSTALL_DATA) $(HOST_BUILD_DIR)/m4/*.m4 $(1)/share/aclocal/ + $(INSTALL_DIR) $(1)/share/gnulib + $(CP) $(HOST_BUILD_DIR)/* $(1)/share/gnulib/ +endef + +define Host/Clean + rm -rf $(STAGING_DIR_HOST)/share/gnulib +endef + +$(eval $(call HostBuild)) diff --git a/tools/gnulib/patches/000-bootstrap.patch b/tools/gnulib/patches/000-bootstrap.patch new file mode 100644 index 0000000000..40ed41125c --- /dev/null +++ b/tools/gnulib/patches/000-bootstrap.patch @@ -0,0 +1,54 @@ +--- a/build-aux/bootstrap ++++ b/build-aux/bootstrap +@@ -237,14 +237,14 @@ test -r "$conffile" && . "$conffile" + + check_exists() { + if test "$1" = "--verbose"; then +- ($2 --version /dev/null 2>&1 ++ ($2 $3 $4 --version /dev/null 2>&1 + if test $? -ge 126; then + # If not found, run with diagnostics as one may be + # presented with env variables to set to find the right version +- ($2 --version /dev/null 2>&1 ++ ($@ --version /dev/null 2>&1 + fi + + test $? -lt 126 +@@ -309,7 +309,7 @@ p + q' + + get_version() { +- app=$1 ++ app="$@" + + $app --version >/dev/null 2>&1 || { $app --version; return 1; } + +@@ -366,13 +366,13 @@ check_versions() { + if [ "$req_ver" = "-" ]; then + # Merely require app to exist; not all prereq apps are well-behaved + # so we have to rely on $? rather than get_version. +- if ! check_exists --verbose $app; then ++ if ! check_exists --verbose "$app"; then + warn_ "Error: '$app' not found" + ret=1 + fi + else + # Require app to produce a new enough version string. +- inst_ver=$(get_version $app) ++ inst_ver=$(get_version "$app") + if [ ! "$inst_ver" ]; then + warn_ "Error: '$app' not found" + ret=1 +@@ -1135,7 +1135,7 @@ autogen() + # two just-pre-run programs. + + # Import from gettext. +- with_gettext=yes ++ with_gettext=no + grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \ + with_gettext=no + diff --git a/tools/include/elf.h b/tools/include/elf.h index 036a176345..4bc0e4299c 100644 --- a/tools/include/elf.h +++ b/tools/include/elf.h @@ -1,5 +1,5 @@ /* This file defines standard ELF types, structures, and macros. - Copyright (C) 1995-2012 Free Software Foundation, Inc. + Copyright (C) 1995-2023 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -14,7 +14,7 @@ You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see - . */ + . */ #ifndef _ELF_H #define _ELF_H 1 @@ -168,86 +168,203 @@ typedef struct /* Legal values for e_machine (architecture). */ -#define EM_NONE 0 /* No machine */ -#define EM_M32 1 /* AT&T WE 32100 */ -#define EM_SPARC 2 /* SUN SPARC */ -#define EM_386 3 /* Intel 80386 */ -#define EM_68K 4 /* Motorola m68k family */ -#define EM_88K 5 /* Motorola m88k family */ -#define EM_860 7 /* Intel 80860 */ -#define EM_MIPS 8 /* MIPS R3000 big-endian */ -#define EM_S370 9 /* IBM System/370 */ -#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */ - -#define EM_PARISC 15 /* HPPA */ -#define EM_VPP500 17 /* Fujitsu VPP500 */ -#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ -#define EM_960 19 /* Intel 80960 */ -#define EM_PPC 20 /* PowerPC */ -#define EM_PPC64 21 /* PowerPC 64-bit */ -#define EM_S390 22 /* IBM S390 */ - -#define EM_V800 36 /* NEC V800 series */ -#define EM_FR20 37 /* Fujitsu FR20 */ -#define EM_RH32 38 /* TRW RH-32 */ -#define EM_RCE 39 /* Motorola RCE */ -#define EM_ARM 40 /* ARM */ -#define EM_FAKE_ALPHA 41 /* Digital Alpha */ -#define EM_SH 42 /* Hitachi SH */ -#define EM_SPARCV9 43 /* SPARC v9 64-bit */ -#define EM_TRICORE 44 /* Siemens Tricore */ -#define EM_ARC 45 /* Argonaut RISC Core */ -#define EM_H8_300 46 /* Hitachi H8/300 */ -#define EM_H8_300H 47 /* Hitachi H8/300H */ -#define EM_H8S 48 /* Hitachi H8S */ -#define EM_H8_500 49 /* Hitachi H8/500 */ -#define EM_IA_64 50 /* Intel Merced */ -#define EM_MIPS_X 51 /* Stanford MIPS-X */ -#define EM_COLDFIRE 52 /* Motorola Coldfire */ -#define EM_68HC12 53 /* Motorola M68HC12 */ -#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator*/ -#define EM_PCP 55 /* Siemens PCP */ -#define EM_NCPU 56 /* Sony nCPU embeeded RISC */ -#define EM_NDR1 57 /* Denso NDR1 microprocessor */ -#define EM_STARCORE 58 /* Motorola Start*Core processor */ -#define EM_ME16 59 /* Toyota ME16 processor */ -#define EM_ST100 60 /* STMicroelectronic ST100 processor */ -#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam*/ -#define EM_X86_64 62 /* AMD x86-64 architecture */ -#define EM_PDSP 63 /* Sony DSP Processor */ - -#define EM_FX66 66 /* Siemens FX66 microcontroller */ -#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */ -#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */ -#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */ -#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */ -#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */ -#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */ -#define EM_SVX 73 /* Silicon Graphics SVx */ -#define EM_ST19 74 /* STMicroelectronics ST19 8 bit mc */ -#define EM_VAX 75 /* Digital VAX */ -#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ -#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */ -#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */ -#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */ -#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */ -#define EM_HUANY 81 /* Harvard University machine-independent object files */ -#define EM_PRISM 82 /* SiTera Prism */ -#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ -#define EM_FR30 84 /* Fujitsu FR30 */ -#define EM_D10V 85 /* Mitsubishi D10V */ -#define EM_D30V 86 /* Mitsubishi D30V */ -#define EM_V850 87 /* NEC v850 */ -#define EM_M32R 88 /* Mitsubishi M32R */ -#define EM_MN10300 89 /* Matsushita MN10300 */ -#define EM_MN10200 90 /* Matsushita MN10200 */ -#define EM_PJ 91 /* picoJava */ -#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ -#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ -#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ -#define EM_TILEPRO 188 /* Tilera TILEPro */ -#define EM_TILEGX 191 /* Tilera TILE-Gx */ -#define EM_NUM 192 +#define EM_NONE 0 /* No machine */ +#define EM_M32 1 /* AT&T WE 32100 */ +#define EM_SPARC 2 /* SUN SPARC */ +#define EM_386 3 /* Intel 80386 */ +#define EM_68K 4 /* Motorola m68k family */ +#define EM_88K 5 /* Motorola m88k family */ +#define EM_IAMCU 6 /* Intel MCU */ +#define EM_860 7 /* Intel 80860 */ +#define EM_MIPS 8 /* MIPS R3000 big-endian */ +#define EM_S370 9 /* IBM System/370 */ +#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */ + /* reserved 11-14 */ +#define EM_PARISC 15 /* HPPA */ + /* reserved 16 */ +#define EM_VPP500 17 /* Fujitsu VPP500 */ +#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ +#define EM_960 19 /* Intel 80960 */ +#define EM_PPC 20 /* PowerPC */ +#define EM_PPC64 21 /* PowerPC 64-bit */ +#define EM_S390 22 /* IBM S390 */ +#define EM_SPU 23 /* IBM SPU/SPC */ + /* reserved 24-35 */ +#define EM_V800 36 /* NEC V800 series */ +#define EM_FR20 37 /* Fujitsu FR20 */ +#define EM_RH32 38 /* TRW RH-32 */ +#define EM_RCE 39 /* Motorola RCE */ +#define EM_ARM 40 /* ARM */ +#define EM_FAKE_ALPHA 41 /* Digital Alpha */ +#define EM_SH 42 /* Hitachi SH */ +#define EM_SPARCV9 43 /* SPARC v9 64-bit */ +#define EM_TRICORE 44 /* Siemens Tricore */ +#define EM_ARC 45 /* Argonaut RISC Core */ +#define EM_H8_300 46 /* Hitachi H8/300 */ +#define EM_H8_300H 47 /* Hitachi H8/300H */ +#define EM_H8S 48 /* Hitachi H8S */ +#define EM_H8_500 49 /* Hitachi H8/500 */ +#define EM_IA_64 50 /* Intel Merced */ +#define EM_MIPS_X 51 /* Stanford MIPS-X */ +#define EM_COLDFIRE 52 /* Motorola Coldfire */ +#define EM_68HC12 53 /* Motorola M68HC12 */ +#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator */ +#define EM_PCP 55 /* Siemens PCP */ +#define EM_NCPU 56 /* Sony nCPU embeeded RISC */ +#define EM_NDR1 57 /* Denso NDR1 microprocessor */ +#define EM_STARCORE 58 /* Motorola Start*Core processor */ +#define EM_ME16 59 /* Toyota ME16 processor */ +#define EM_ST100 60 /* STMicroelectronic ST100 processor */ +#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam */ +#define EM_X86_64 62 /* AMD x86-64 architecture */ +#define EM_PDSP 63 /* Sony DSP Processor */ +#define EM_PDP10 64 /* Digital PDP-10 */ +#define EM_PDP11 65 /* Digital PDP-11 */ +#define EM_FX66 66 /* Siemens FX66 microcontroller */ +#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */ +#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */ +#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */ +#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */ +#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */ +#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */ +#define EM_SVX 73 /* Silicon Graphics SVx */ +#define EM_ST19 74 /* STMicroelectronics ST19 8 bit mc */ +#define EM_VAX 75 /* Digital VAX */ +#define EM_CRIS 76 /* Axis Communications 32-bit emb.proc */ +#define EM_JAVELIN 77 /* Infineon Technologies 32-bit emb.proc */ +#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */ +#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */ +#define EM_MMIX 80 /* Donald Knuth's educational 64-bit proc */ +#define EM_HUANY 81 /* Harvard University machine-independent object files */ +#define EM_PRISM 82 /* SiTera Prism */ +#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ +#define EM_FR30 84 /* Fujitsu FR30 */ +#define EM_D10V 85 /* Mitsubishi D10V */ +#define EM_D30V 86 /* Mitsubishi D30V */ +#define EM_V850 87 /* NEC v850 */ +#define EM_M32R 88 /* Mitsubishi M32R */ +#define EM_MN10300 89 /* Matsushita MN10300 */ +#define EM_MN10200 90 /* Matsushita MN10200 */ +#define EM_PJ 91 /* picoJava */ +#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ +#define EM_ARC_COMPACT 93 /* ARC International ARCompact */ +#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ +#define EM_VIDEOCORE 95 /* Alphamosaic VideoCore */ +#define EM_TMM_GPP 96 /* Thompson Multimedia General Purpose Proc */ +#define EM_NS32K 97 /* National Semi. 32000 */ +#define EM_TPC 98 /* Tenor Network TPC */ +#define EM_SNP1K 99 /* Trebia SNP 1000 */ +#define EM_ST200 100 /* STMicroelectronics ST200 */ +#define EM_IP2K 101 /* Ubicom IP2xxx */ +#define EM_MAX 102 /* MAX processor */ +#define EM_CR 103 /* National Semi. CompactRISC */ +#define EM_F2MC16 104 /* Fujitsu F2MC16 */ +#define EM_MSP430 105 /* Texas Instruments msp430 */ +#define EM_BLACKFIN 106 /* Analog Devices Blackfin DSP */ +#define EM_SE_C33 107 /* Seiko Epson S1C33 family */ +#define EM_SEP 108 /* Sharp embedded microprocessor */ +#define EM_ARCA 109 /* Arca RISC */ +#define EM_UNICORE 110 /* PKU-Unity & MPRC Peking Uni. mc series */ +#define EM_EXCESS 111 /* eXcess configurable cpu */ +#define EM_DXP 112 /* Icera Semi. Deep Execution Processor */ +#define EM_ALTERA_NIOS2 113 /* Altera Nios II */ +#define EM_CRX 114 /* National Semi. CompactRISC CRX */ +#define EM_XGATE 115 /* Motorola XGATE */ +#define EM_C166 116 /* Infineon C16x/XC16x */ +#define EM_M16C 117 /* Renesas M16C */ +#define EM_DSPIC30F 118 /* Microchip Technology dsPIC30F */ +#define EM_CE 119 /* Freescale Communication Engine RISC */ +#define EM_M32C 120 /* Renesas M32C */ + /* reserved 121-130 */ +#define EM_TSK3000 131 /* Altium TSK3000 */ +#define EM_RS08 132 /* Freescale RS08 */ +#define EM_SHARC 133 /* Analog Devices SHARC family */ +#define EM_ECOG2 134 /* Cyan Technology eCOG2 */ +#define EM_SCORE7 135 /* Sunplus S+core7 RISC */ +#define EM_DSP24 136 /* New Japan Radio (NJR) 24-bit DSP */ +#define EM_VIDEOCORE3 137 /* Broadcom VideoCore III */ +#define EM_LATTICEMICO32 138 /* RISC for Lattice FPGA */ +#define EM_SE_C17 139 /* Seiko Epson C17 */ +#define EM_TI_C6000 140 /* Texas Instruments TMS320C6000 DSP */ +#define EM_TI_C2000 141 /* Texas Instruments TMS320C2000 DSP */ +#define EM_TI_C5500 142 /* Texas Instruments TMS320C55x DSP */ +#define EM_TI_ARP32 143 /* Texas Instruments App. Specific RISC */ +#define EM_TI_PRU 144 /* Texas Instruments Prog. Realtime Unit */ + /* reserved 145-159 */ +#define EM_MMDSP_PLUS 160 /* STMicroelectronics 64bit VLIW DSP */ +#define EM_CYPRESS_M8C 161 /* Cypress M8C */ +#define EM_R32C 162 /* Renesas R32C */ +#define EM_TRIMEDIA 163 /* NXP Semi. TriMedia */ +#define EM_QDSP6 164 /* QUALCOMM DSP6 */ +#define EM_8051 165 /* Intel 8051 and variants */ +#define EM_STXP7X 166 /* STMicroelectronics STxP7x */ +#define EM_NDS32 167 /* Andes Tech. compact code emb. RISC */ +#define EM_ECOG1X 168 /* Cyan Technology eCOG1X */ +#define EM_MAXQ30 169 /* Dallas Semi. MAXQ30 mc */ +#define EM_XIMO16 170 /* New Japan Radio (NJR) 16-bit DSP */ +#define EM_MANIK 171 /* M2000 Reconfigurable RISC */ +#define EM_CRAYNV2 172 /* Cray NV2 vector architecture */ +#define EM_RX 173 /* Renesas RX */ +#define EM_METAG 174 /* Imagination Tech. META */ +#define EM_MCST_ELBRUS 175 /* MCST Elbrus */ +#define EM_ECOG16 176 /* Cyan Technology eCOG16 */ +#define EM_CR16 177 /* National Semi. CompactRISC CR16 */ +#define EM_ETPU 178 /* Freescale Extended Time Processing Unit */ +#define EM_SLE9X 179 /* Infineon Tech. SLE9X */ +#define EM_L10M 180 /* Intel L10M */ +#define EM_K10M 181 /* Intel K10M */ + /* reserved 182 */ +#define EM_AARCH64 183 /* ARM AARCH64 */ + /* reserved 184 */ +#define EM_AVR32 185 /* Amtel 32-bit microprocessor */ +#define EM_STM8 186 /* STMicroelectronics STM8 */ +#define EM_TILE64 187 /* Tilera TILE64 */ +#define EM_TILEPRO 188 /* Tilera TILEPro */ +#define EM_MICROBLAZE 189 /* Xilinx MicroBlaze */ +#define EM_CUDA 190 /* NVIDIA CUDA */ +#define EM_TILEGX 191 /* Tilera TILE-Gx */ +#define EM_CLOUDSHIELD 192 /* CloudShield */ +#define EM_COREA_1ST 193 /* KIPO-KAIST Core-A 1st gen. */ +#define EM_COREA_2ND 194 /* KIPO-KAIST Core-A 2nd gen. */ +#define EM_ARCV2 195 /* Synopsys ARCv2 ISA. */ +#define EM_OPEN8 196 /* Open8 RISC */ +#define EM_RL78 197 /* Renesas RL78 */ +#define EM_VIDEOCORE5 198 /* Broadcom VideoCore V */ +#define EM_78KOR 199 /* Renesas 78KOR */ +#define EM_56800EX 200 /* Freescale 56800EX DSC */ +#define EM_BA1 201 /* Beyond BA1 */ +#define EM_BA2 202 /* Beyond BA2 */ +#define EM_XCORE 203 /* XMOS xCORE */ +#define EM_MCHP_PIC 204 /* Microchip 8-bit PIC(r) */ +#define EM_INTELGT 205 /* Intel Graphics Technology */ + /* reserved 206-209 */ +#define EM_KM32 210 /* KM211 KM32 */ +#define EM_KMX32 211 /* KM211 KMX32 */ +#define EM_EMX16 212 /* KM211 KMX16 */ +#define EM_EMX8 213 /* KM211 KMX8 */ +#define EM_KVARC 214 /* KM211 KVARC */ +#define EM_CDP 215 /* Paneve CDP */ +#define EM_COGE 216 /* Cognitive Smart Memory Processor */ +#define EM_COOL 217 /* Bluechip CoolEngine */ +#define EM_NORC 218 /* Nanoradio Optimized RISC */ +#define EM_CSR_KALIMBA 219 /* CSR Kalimba */ +#define EM_Z80 220 /* Zilog Z80 */ +#define EM_VISIUM 221 /* Controls and Data Services VISIUMcore */ +#define EM_FT32 222 /* FTDI Chip FT32 */ +#define EM_MOXIE 223 /* Moxie processor */ +#define EM_AMDGPU 224 /* AMD GPU */ + /* reserved 225-242 */ +#define EM_RISCV 243 /* RISC-V */ + +#define EM_BPF 247 /* Linux BPF -- in-kernel virtual machine */ +#define EM_CSKY 252 /* C-SKY */ +#define EM_LOONGARCH 258 /* LoongArch */ + +#define EM_NUM 259 + +/* Old spellings/synonyms. */ + +#define EM_ARC_A5 EM_ARC_COMPACT /* If it is necessary to assign new unofficial EM_* values, please pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the @@ -326,8 +443,9 @@ typedef struct #define SHT_FINI_ARRAY 15 /* Array of destructors */ #define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */ #define SHT_GROUP 17 /* Section group */ -#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */ -#define SHT_NUM 19 /* Number of defined types. */ +#define SHT_SYMTAB_SHNDX 18 /* Extended section indices */ +#define SHT_RELR 19 /* RELR relative relocations */ +#define SHT_NUM 20 /* Number of defined types. */ #define SHT_LOOS 0x60000000 /* Start OS-specific. */ #define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */ #define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */ @@ -360,13 +478,40 @@ typedef struct required */ #define SHF_GROUP (1 << 9) /* Section is member of a group. */ #define SHF_TLS (1 << 10) /* Section hold thread-local data. */ +#define SHF_COMPRESSED (1 << 11) /* Section with compressed data. */ #define SHF_MASKOS 0x0ff00000 /* OS-specific. */ #define SHF_MASKPROC 0xf0000000 /* Processor-specific */ +#define SHF_GNU_RETAIN (1 << 21) /* Not to be GCed by linker. */ #define SHF_ORDERED (1 << 30) /* Special ordering requirement (Solaris). */ -#define SHF_EXCLUDE (1 << 31) /* Section is excluded unless +#define SHF_EXCLUDE (1U << 31) /* Section is excluded unless referenced or allocated (Solaris).*/ +/* Section compression header. Used when SHF_COMPRESSED is set. */ + +typedef struct +{ + Elf32_Word ch_type; /* Compression format. */ + Elf32_Word ch_size; /* Uncompressed data size. */ + Elf32_Word ch_addralign; /* Uncompressed data alignment. */ +} Elf32_Chdr; + +typedef struct +{ + Elf64_Word ch_type; /* Compression format. */ + Elf64_Word ch_reserved; + Elf64_Xword ch_size; /* Uncompressed data size. */ + Elf64_Xword ch_addralign; /* Uncompressed data alignment. */ +} Elf64_Chdr; + +/* Legal values for ch_type (compression algorithm). */ +#define ELFCOMPRESS_ZLIB 1 /* ZLIB/DEFLATE algorithm. */ +#define ELFCOMPRESS_ZSTD 2 /* Zstandard algorithm. */ +#define ELFCOMPRESS_LOOS 0x60000000 /* Start of OS-specific. */ +#define ELFCOMPRESS_HIOS 0x6fffffff /* End of OS-specific. */ +#define ELFCOMPRESS_LOPROC 0x70000000 /* Start of processor-specific. */ +#define ELFCOMPRESS_HIPROC 0x7fffffff /* End of processor-specific. */ + /* Section group handling. */ #define GRP_COMDAT 0x1 /* Mark group as COMDAT. */ @@ -520,6 +665,11 @@ typedef struct Elf64_Sxword r_addend; /* Addend */ } Elf64_Rela; +/* RELR relocation table entry */ + +typedef Elf32_Word Elf32_Relr; +typedef Elf64_Xword Elf64_Relr; + /* How to extract and insert information held in the r_info field. */ #define ELF32_R_SYM(val) ((val) >> 8) @@ -577,6 +727,7 @@ typedef struct #define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */ #define PT_GNU_STACK 0x6474e551 /* Indicates stack executability */ #define PT_GNU_RELRO 0x6474e552 /* Read-only after relocation */ +#define PT_GNU_PROPERTY 0x6474e553 /* GNU property */ #define PT_LOSUNW 0x6ffffffa #define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */ #define PT_SUNWSTACK 0x6ffffffb /* Stack segment */ @@ -596,6 +747,8 @@ typedef struct /* Legal values for note segment descriptor types for core files. */ #define NT_PRSTATUS 1 /* Contains copy of prstatus struct */ +#define NT_PRFPREG 2 /* Contains copy of fpregset + struct. */ #define NT_FPREGSET 2 /* Contains copy of fpregset struct */ #define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */ #define NT_PRXREG 4 /* Contains copy of prxregset struct */ @@ -611,13 +764,82 @@ typedef struct #define NT_LWPSTATUS 16 /* Contains copy of lwpstatus struct */ #define NT_LWPSINFO 17 /* Contains copy of lwpinfo struct */ #define NT_PRFPXREG 20 /* Contains copy of fprxregset struct */ +#define NT_SIGINFO 0x53494749 /* Contains copy of siginfo_t, + size might increase */ +#define NT_FILE 0x46494c45 /* Contains information about mapped + files */ #define NT_PRXFPREG 0x46e62b7f /* Contains copy of user_fxsr_struct */ #define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */ #define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */ #define NT_PPC_VSX 0x102 /* PowerPC VSX registers */ +#define NT_PPC_TAR 0x103 /* Target Address Register */ +#define NT_PPC_PPR 0x104 /* Program Priority Register */ +#define NT_PPC_DSCR 0x105 /* Data Stream Control Register */ +#define NT_PPC_EBB 0x106 /* Event Based Branch Registers */ +#define NT_PPC_PMU 0x107 /* Performance Monitor Registers */ +#define NT_PPC_TM_CGPR 0x108 /* TM checkpointed GPR Registers */ +#define NT_PPC_TM_CFPR 0x109 /* TM checkpointed FPR Registers */ +#define NT_PPC_TM_CVMX 0x10a /* TM checkpointed VMX Registers */ +#define NT_PPC_TM_CVSX 0x10b /* TM checkpointed VSX Registers */ +#define NT_PPC_TM_SPR 0x10c /* TM Special Purpose Registers */ +#define NT_PPC_TM_CTAR 0x10d /* TM checkpointed Target Address + Register */ +#define NT_PPC_TM_CPPR 0x10e /* TM checkpointed Program Priority + Register */ +#define NT_PPC_TM_CDSCR 0x10f /* TM checkpointed Data Stream Control + Register */ +#define NT_PPC_PKEY 0x110 /* Memory Protection Keys + registers. */ #define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */ #define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */ #define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */ +#define NT_S390_HIGH_GPRS 0x300 /* s390 upper register halves */ +#define NT_S390_TIMER 0x301 /* s390 timer register */ +#define NT_S390_TODCMP 0x302 /* s390 TOD clock comparator register */ +#define NT_S390_TODPREG 0x303 /* s390 TOD programmable register */ +#define NT_S390_CTRS 0x304 /* s390 control registers */ +#define NT_S390_PREFIX 0x305 /* s390 prefix register */ +#define NT_S390_LAST_BREAK 0x306 /* s390 breaking event address */ +#define NT_S390_SYSTEM_CALL 0x307 /* s390 system call restart data */ +#define NT_S390_TDB 0x308 /* s390 transaction diagnostic block */ +#define NT_S390_VXRS_LOW 0x309 /* s390 vector registers 0-15 + upper half. */ +#define NT_S390_VXRS_HIGH 0x30a /* s390 vector registers 16-31. */ +#define NT_S390_GS_CB 0x30b /* s390 guarded storage registers. */ +#define NT_S390_GS_BC 0x30c /* s390 guarded storage + broadcast control block. */ +#define NT_S390_RI_CB 0x30d /* s390 runtime instrumentation. */ +#define NT_S390_PV_CPU_DATA 0x30e /* s390 protvirt cpu dump data. */ +#define NT_ARM_VFP 0x400 /* ARM VFP/NEON registers */ +#define NT_ARM_TLS 0x401 /* ARM TLS register */ +#define NT_ARM_HW_BREAK 0x402 /* ARM hardware breakpoint registers */ +#define NT_ARM_HW_WATCH 0x403 /* ARM hardware watchpoint registers */ +#define NT_ARM_SYSTEM_CALL 0x404 /* ARM system call number */ +#define NT_ARM_SVE 0x405 /* ARM Scalable Vector Extension + registers */ +#define NT_ARM_PAC_MASK 0x406 /* ARM pointer authentication + code masks. */ +#define NT_ARM_PACA_KEYS 0x407 /* ARM pointer authentication + address keys. */ +#define NT_ARM_PACG_KEYS 0x408 /* ARM pointer authentication + generic key. */ +#define NT_ARM_TAGGED_ADDR_CTRL 0x409 /* AArch64 tagged address + control. */ +#define NT_ARM_PAC_ENABLED_KEYS 0x40a /* AArch64 pointer authentication + enabled keys. */ +#define NT_VMCOREDD 0x700 /* Vmcore Device Dump Note. */ +#define NT_MIPS_DSP 0x800 /* MIPS DSP ASE registers. */ +#define NT_MIPS_FP_MODE 0x801 /* MIPS floating-point mode. */ +#define NT_MIPS_MSA 0x802 /* MIPS SIMD registers. */ +#define NT_LOONGARCH_CPUCFG 0xa00 /* LoongArch CPU config registers. */ +#define NT_LOONGARCH_CSR 0xa01 /* LoongArch control and + status registers. */ +#define NT_LOONGARCH_LSX 0xa02 /* LoongArch Loongson SIMD + Extension registers. */ +#define NT_LOONGARCH_LASX 0xa03 /* LoongArch Loongson Advanced + SIMD Extension registers. */ +#define NT_LOONGARCH_LBT 0xa04 /* LoongArch Loongson Binary + Translation registers. */ /* Legal values for the note segment descriptor types for object files. */ @@ -682,7 +904,11 @@ typedef struct #define DT_ENCODING 32 /* Start of encoded range */ #define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/ #define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */ -#define DT_NUM 34 /* Number used */ +#define DT_SYMTAB_SHNDX 34 /* Address of SYMTAB_SHNDX section */ +#define DT_RELRSZ 35 /* Total size of RELR relative relocations */ +#define DT_RELR 36 /* Address of RELR relative relocations */ +#define DT_RELRENT 37 /* Size of one RELR relative relocaction */ +#define DT_NUM 38 /* Number used */ #define DT_LOOS 0x6000000d /* Start of OS-specific */ #define DT_HIOS 0x6ffff000 /* End of OS-specific */ #define DT_LOPROC 0x70000000 /* Start of processor-specific */ @@ -781,6 +1007,20 @@ typedef struct #define DF_1_ENDFILTEE 0x00004000 /* Filtee terminates filters search. */ #define DF_1_DISPRELDNE 0x00008000 /* Disp reloc applied at build time. */ #define DF_1_DISPRELPND 0x00010000 /* Disp reloc applied at run-time. */ +#define DF_1_NODIRECT 0x00020000 /* Object has no-direct binding. */ +#define DF_1_IGNMULDEF 0x00040000 +#define DF_1_NOKSYMS 0x00080000 +#define DF_1_NOHDR 0x00100000 +#define DF_1_EDITED 0x00200000 /* Object is modified after built. */ +#define DF_1_NORELOC 0x00400000 +#define DF_1_SYMINTPOSE 0x00800000 /* Object has individual interposers. */ +#define DF_1_GLOBAUDIT 0x01000000 /* Global auditing required. */ +#define DF_1_SINGLETON 0x02000000 /* Singleton symbols are used. */ +#define DF_1_STUB 0x04000000 +#define DF_1_PIE 0x08000000 +#define DF_1_KMOD 0x10000000 +#define DF_1_WEAKFILTER 0x20000000 +#define DF_1_NOCOMMON 0x40000000 /* Flags for the feature selection in DT_FEATURE_1. */ #define DTF_1_PARINIT 0x00000001 @@ -825,7 +1065,8 @@ typedef struct /* Legal values for vd_flags (version information flags). */ #define VER_FLG_BASE 0x1 /* Version definition of file itself */ -#define VER_FLG_WEAK 0x2 /* Weak version identifier */ +#define VER_FLG_WEAK 0x2 /* Weak version identifier. Also + used by vna_flags below. */ /* Versym symbol index values. */ #define VER_NDX_LOCAL 0 /* Symbol is local. */ @@ -833,7 +1074,7 @@ typedef struct #define VER_NDX_LORESERVE 0xff00 /* Beginning of reserved entries. */ #define VER_NDX_ELIMINATE 0xff01 /* Symbol is to be eliminated. */ -/* Auxialiary version information. */ +/* Auxiliary version information. */ typedef struct { @@ -903,10 +1144,6 @@ typedef struct } Elf64_Vernaux; -/* Legal values for vna_flags. */ -#define VER_FLG_WEAK 0x2 /* Weak version identifier */ - - /* Auxiliary vector. */ /* This vector is normally only used by the program interpreter. The @@ -961,7 +1198,7 @@ typedef struct /* Some more special a_type values describing the hardware. */ #define AT_PLATFORM 15 /* String identifying platform. */ -#define AT_HWCAP 16 /* Machine dependent hints about +#define AT_HWCAP 16 /* Machine-dependent hints about processor capabilities. */ /* This entry gives some information about the FPU initialization @@ -983,6 +1220,9 @@ typedef struct #define AT_RANDOM 25 /* Address of 16 random bytes. */ +#define AT_HWCAP2 26 /* More machine-dependent hints about + processor capabilities. */ + #define AT_EXECFN 31 /* Filename of executable. */ /* Pointer to the global system page used for system calls and other @@ -997,6 +1237,20 @@ typedef struct #define AT_L2_CACHESHAPE 36 #define AT_L3_CACHESHAPE 37 +/* Shapes of the caches, with more room to describe them. + *GEOMETRY are comprised of cache line size in bytes in the bottom 16 bits + and the cache associativity in the next 16 bits. */ +#define AT_L1I_CACHESIZE 40 +#define AT_L1I_CACHEGEOMETRY 41 +#define AT_L1D_CACHESIZE 42 +#define AT_L1D_CACHEGEOMETRY 43 +#define AT_L2_CACHESIZE 44 +#define AT_L2_CACHEGEOMETRY 45 +#define AT_L3_CACHESIZE 46 +#define AT_L3_CACHEGEOMETRY 47 + +#define AT_MINSIGSTKSZ 51 /* Stack needed for signal delivery */ + /* Note section contents. Each entry in the note section begins with a header of a fixed form. */ @@ -1022,6 +1276,8 @@ typedef struct /* Note entries for GNU systems have this name. */ #define ELF_NOTE_GNU "GNU" +/* Note entries for freedesktop.org have this name. */ +#define ELF_NOTE_FDO "FDO" /* Defined types of notes for Solaris. */ @@ -1062,6 +1318,84 @@ typedef struct /* Version note generated by GNU gold containing a version string. */ #define NT_GNU_GOLD_VERSION 4 +/* Program property. */ +#define NT_GNU_PROPERTY_TYPE_0 5 + +/* Packaging metadata as defined on + https://systemd.io/COREDUMP_PACKAGE_METADATA/ */ +#define NT_FDO_PACKAGING_METADATA 0xcafe1a7e + +/* Note section name of program property. */ +#define NOTE_GNU_PROPERTY_SECTION_NAME ".note.gnu.property" + +/* Values used in GNU .note.gnu.property notes (NT_GNU_PROPERTY_TYPE_0). */ + +/* Stack size. */ +#define GNU_PROPERTY_STACK_SIZE 1 +/* No copy relocation on protected data symbol. */ +#define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2 + +/* A 4-byte unsigned integer property: A bit is set if it is set in all + relocatable inputs. */ +#define GNU_PROPERTY_UINT32_AND_LO 0xb0000000 +#define GNU_PROPERTY_UINT32_AND_HI 0xb0007fff + +/* A 4-byte unsigned integer property: A bit is set if it is set in any + relocatable inputs. */ +#define GNU_PROPERTY_UINT32_OR_LO 0xb0008000 +#define GNU_PROPERTY_UINT32_OR_HI 0xb000ffff + +/* The needed properties by the object file. */ +#define GNU_PROPERTY_1_NEEDED GNU_PROPERTY_UINT32_OR_LO + +/* Set if the object file requires canonical function pointers and + cannot be used with copy relocation. */ +#define GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (1U << 0) + +/* Processor-specific semantics, lo */ +#define GNU_PROPERTY_LOPROC 0xc0000000 +/* Processor-specific semantics, hi */ +#define GNU_PROPERTY_HIPROC 0xdfffffff +/* Application-specific semantics, lo */ +#define GNU_PROPERTY_LOUSER 0xe0000000 +/* Application-specific semantics, hi */ +#define GNU_PROPERTY_HIUSER 0xffffffff + +/* AArch64 specific GNU properties. */ +#define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000 + +#define GNU_PROPERTY_AARCH64_FEATURE_1_BTI (1U << 0) +#define GNU_PROPERTY_AARCH64_FEATURE_1_PAC (1U << 1) + +/* The x86 instruction sets indicated by the corresponding bits are + used in program. Their support in the hardware is optional. */ +#define GNU_PROPERTY_X86_ISA_1_USED 0xc0010002 +/* The x86 instruction sets indicated by the corresponding bits are + used in program and they must be supported by the hardware. */ +#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0008002 +/* X86 processor-specific features used in program. */ +#define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002 + +/* GNU_PROPERTY_X86_ISA_1_BASELINE: CMOV, CX8 (cmpxchg8b), FPU (fld), + MMX, OSFXSR (fxsave), SCE (syscall), SSE and SSE2. */ +#define GNU_PROPERTY_X86_ISA_1_BASELINE (1U << 0) +/* GNU_PROPERTY_X86_ISA_1_V2: GNU_PROPERTY_X86_ISA_1_BASELINE, + CMPXCHG16B (cmpxchg16b), LAHF-SAHF (lahf), POPCNT (popcnt), SSE3, + SSSE3, SSE4.1 and SSE4.2. */ +#define GNU_PROPERTY_X86_ISA_1_V2 (1U << 1) +/* GNU_PROPERTY_X86_ISA_1_V3: GNU_PROPERTY_X86_ISA_1_V2, AVX, AVX2, BMI1, + BMI2, F16C, FMA, LZCNT, MOVBE, XSAVE. */ +#define GNU_PROPERTY_X86_ISA_1_V3 (1U << 2) +/* GNU_PROPERTY_X86_ISA_1_V4: GNU_PROPERTY_X86_ISA_1_V3, AVX512F, + AVX512BW, AVX512CD, AVX512DQ and AVX512VL. */ +#define GNU_PROPERTY_X86_ISA_1_V4 (1U << 3) + +/* This indicates that all executable sections are compatible with + IBT. */ +#define GNU_PROPERTY_X86_FEATURE_1_IBT (1U << 0) +/* This indicates that all executable sections are compatible with + SHSTK. */ +#define GNU_PROPERTY_X86_FEATURE_1_SHSTK (1U << 1) /* Move records. */ typedef struct @@ -1198,7 +1532,7 @@ typedef struct #define R_386_TLS_DTPMOD32 35 /* ID of module containing symbol */ #define R_386_TLS_DTPOFF32 36 /* Offset in TLS block */ #define R_386_TLS_TPOFF32 37 /* Negated offset in static TLS block */ -/* 38? */ +#define R_386_SIZE32 38 /* 32-bit symbol size */ #define R_386_TLS_GOTDESC 39 /* GOT offset for TLS descriptor. */ #define R_386_TLS_DESC_CALL 40 /* Marker of call through TLS descriptor for @@ -1208,8 +1542,10 @@ typedef struct argument, returning the TLS offset for the symbol. */ #define R_386_IRELATIVE 42 /* Adjust indirectly by program base */ +#define R_386_GOT32X 43 /* Load from 32 bit GOT entry, + relaxable. */ /* Keep this the last entry. */ -#define R_386_NUM 43 +#define R_386_NUM 44 /* SUN SPARC specific definitions. */ @@ -1334,102 +1670,107 @@ typedef struct /* For Sparc64, legal values for d_tag of Elf64_Dyn. */ -#define DT_SPARC_REGISTER 0x70000001 -#define DT_SPARC_NUM 2 +#define DT_SPARC_REGISTER 0x70000001 +#define DT_SPARC_NUM 2 /* MIPS R3000 specific definitions. */ /* Legal values for e_flags field of Elf32_Ehdr. */ -#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used */ -#define EF_MIPS_PIC 2 /* Contains PIC code */ -#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence */ -#define EF_MIPS_XGOT 8 -#define EF_MIPS_64BIT_WHIRL 16 -#define EF_MIPS_ABI2 32 -#define EF_MIPS_ABI_ON32 64 -#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level */ +#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used. */ +#define EF_MIPS_PIC 2 /* Contains PIC code. */ +#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence. */ +#define EF_MIPS_XGOT 8 +#define EF_MIPS_64BIT_WHIRL 16 +#define EF_MIPS_ABI2 32 +#define EF_MIPS_ABI_ON32 64 +#define EF_MIPS_FP64 512 /* Uses FP64 (12 callee-saved). */ +#define EF_MIPS_NAN2008 1024 /* Uses IEEE 754-2008 NaN encoding. */ +#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level. */ /* Legal values for MIPS architecture level. */ -#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ -#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ -#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ -#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ -#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ -#define EF_MIPS_ARCH_32 0x60000000 /* MIPS32 code. */ -#define EF_MIPS_ARCH_64 0x70000000 /* MIPS64 code. */ - -/* The following are non-official names and should not be used. */ - -#define E_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ -#define E_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ -#define E_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ -#define E_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ -#define E_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ -#define E_MIPS_ARCH_32 0x60000000 /* MIPS32 code. */ -#define E_MIPS_ARCH_64 0x70000000 /* MIPS64 code. */ +#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ +#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ +#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ +#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ +#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ +#define EF_MIPS_ARCH_32 0x50000000 /* MIPS32 code. */ +#define EF_MIPS_ARCH_64 0x60000000 /* MIPS64 code. */ +#define EF_MIPS_ARCH_32R2 0x70000000 /* MIPS32r2 code. */ +#define EF_MIPS_ARCH_64R2 0x80000000 /* MIPS64r2 code. */ + +/* The following are unofficial names and should not be used. */ + +#define E_MIPS_ARCH_1 EF_MIPS_ARCH_1 +#define E_MIPS_ARCH_2 EF_MIPS_ARCH_2 +#define E_MIPS_ARCH_3 EF_MIPS_ARCH_3 +#define E_MIPS_ARCH_4 EF_MIPS_ARCH_4 +#define E_MIPS_ARCH_5 EF_MIPS_ARCH_5 +#define E_MIPS_ARCH_32 EF_MIPS_ARCH_32 +#define E_MIPS_ARCH_64 EF_MIPS_ARCH_64 /* Special section indices. */ -#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols */ -#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */ -#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */ -#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols */ -#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols */ +#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols. */ +#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */ +#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */ +#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols. */ +#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols. */ /* Legal values for sh_type field of Elf32_Shdr. */ -#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link */ -#define SHT_MIPS_MSYM 0x70000001 -#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols */ -#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes */ -#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */ -#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging information*/ -#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information */ -#define SHT_MIPS_PACKAGE 0x70000007 -#define SHT_MIPS_PACKSYM 0x70000008 -#define SHT_MIPS_RELD 0x70000009 -#define SHT_MIPS_IFACE 0x7000000b -#define SHT_MIPS_CONTENT 0x7000000c -#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */ -#define SHT_MIPS_SHDR 0x70000010 -#define SHT_MIPS_FDESC 0x70000011 -#define SHT_MIPS_EXTSYM 0x70000012 -#define SHT_MIPS_DENSE 0x70000013 -#define SHT_MIPS_PDESC 0x70000014 -#define SHT_MIPS_LOCSYM 0x70000015 -#define SHT_MIPS_AUXSYM 0x70000016 -#define SHT_MIPS_OPTSYM 0x70000017 -#define SHT_MIPS_LOCSTR 0x70000018 -#define SHT_MIPS_LINE 0x70000019 -#define SHT_MIPS_RFDESC 0x7000001a -#define SHT_MIPS_DELTASYM 0x7000001b -#define SHT_MIPS_DELTAINST 0x7000001c -#define SHT_MIPS_DELTACLASS 0x7000001d -#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */ -#define SHT_MIPS_DELTADECL 0x7000001f -#define SHT_MIPS_SYMBOL_LIB 0x70000020 -#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */ -#define SHT_MIPS_TRANSLATE 0x70000022 -#define SHT_MIPS_PIXIE 0x70000023 -#define SHT_MIPS_XLATE 0x70000024 -#define SHT_MIPS_XLATE_DEBUG 0x70000025 -#define SHT_MIPS_WHIRL 0x70000026 -#define SHT_MIPS_EH_REGION 0x70000027 -#define SHT_MIPS_XLATE_OLD 0x70000028 -#define SHT_MIPS_PDR_EXCEPTION 0x70000029 +#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link. */ +#define SHT_MIPS_MSYM 0x70000001 +#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols. */ +#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes. */ +#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */ +#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging info. */ +#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information. */ +#define SHT_MIPS_PACKAGE 0x70000007 +#define SHT_MIPS_PACKSYM 0x70000008 +#define SHT_MIPS_RELD 0x70000009 +#define SHT_MIPS_IFACE 0x7000000b +#define SHT_MIPS_CONTENT 0x7000000c +#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */ +#define SHT_MIPS_SHDR 0x70000010 +#define SHT_MIPS_FDESC 0x70000011 +#define SHT_MIPS_EXTSYM 0x70000012 +#define SHT_MIPS_DENSE 0x70000013 +#define SHT_MIPS_PDESC 0x70000014 +#define SHT_MIPS_LOCSYM 0x70000015 +#define SHT_MIPS_AUXSYM 0x70000016 +#define SHT_MIPS_OPTSYM 0x70000017 +#define SHT_MIPS_LOCSTR 0x70000018 +#define SHT_MIPS_LINE 0x70000019 +#define SHT_MIPS_RFDESC 0x7000001a +#define SHT_MIPS_DELTASYM 0x7000001b +#define SHT_MIPS_DELTAINST 0x7000001c +#define SHT_MIPS_DELTACLASS 0x7000001d +#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */ +#define SHT_MIPS_DELTADECL 0x7000001f +#define SHT_MIPS_SYMBOL_LIB 0x70000020 +#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */ +#define SHT_MIPS_TRANSLATE 0x70000022 +#define SHT_MIPS_PIXIE 0x70000023 +#define SHT_MIPS_XLATE 0x70000024 +#define SHT_MIPS_XLATE_DEBUG 0x70000025 +#define SHT_MIPS_WHIRL 0x70000026 +#define SHT_MIPS_EH_REGION 0x70000027 +#define SHT_MIPS_XLATE_OLD 0x70000028 +#define SHT_MIPS_PDR_EXCEPTION 0x70000029 +#define SHT_MIPS_XHASH 0x7000002b /* Legal values for sh_flags field of Elf32_Shdr. */ -#define SHF_MIPS_GPREL 0x10000000 /* Must be part of global data area */ -#define SHF_MIPS_MERGE 0x20000000 -#define SHF_MIPS_ADDR 0x40000000 -#define SHF_MIPS_STRINGS 0x80000000 -#define SHF_MIPS_NOSTRIP 0x08000000 -#define SHF_MIPS_LOCAL 0x04000000 -#define SHF_MIPS_NAMES 0x02000000 -#define SHF_MIPS_NODUPE 0x01000000 +#define SHF_MIPS_GPREL 0x10000000 /* Must be in global data area. */ +#define SHF_MIPS_MERGE 0x20000000 +#define SHF_MIPS_ADDR 0x40000000 +#define SHF_MIPS_STRINGS 0x80000000 +#define SHF_MIPS_NOSTRIP 0x08000000 +#define SHF_MIPS_LOCAL 0x04000000 +#define SHF_MIPS_NAMES 0x02000000 +#define SHF_MIPS_NODUPE 0x01000000 /* Symbol tables. */ @@ -1451,23 +1792,23 @@ typedef union { struct { - Elf32_Word gt_current_g_value; /* -G value used for compilation */ - Elf32_Word gt_unused; /* Not used */ - } gt_header; /* First entry in section */ + Elf32_Word gt_current_g_value; /* -G value used for compilation. */ + Elf32_Word gt_unused; /* Not used. */ + } gt_header; /* First entry in section. */ struct { - Elf32_Word gt_g_value; /* If this value were used for -G */ - Elf32_Word gt_bytes; /* This many bytes would be used */ - } gt_entry; /* Subsequent entries in section */ + Elf32_Word gt_g_value; /* If this value were used for -G. */ + Elf32_Word gt_bytes; /* This many bytes would be used. */ + } gt_entry; /* Subsequent entries in section. */ } Elf32_gptab; /* Entry found in sections of type SHT_MIPS_REGINFO. */ typedef struct { - Elf32_Word ri_gprmask; /* General registers used */ - Elf32_Word ri_cprmask[4]; /* Coprocessor registers used */ - Elf32_Sword ri_gp_value; /* $gp register value */ + Elf32_Word ri_gprmask; /* General registers used. */ + Elf32_Word ri_cprmask[4]; /* Coprocessor registers used. */ + Elf32_Sword ri_gp_value; /* $gp register value. */ } Elf32_RegInfo; /* Entries found in sections of type SHT_MIPS_OPTIONS. */ @@ -1593,9 +1934,10 @@ typedef struct /* Legal values for p_type field of Elf32_Phdr. */ -#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ -#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */ -#define PT_MIPS_OPTIONS 0x70000002 +#define PT_MIPS_REGINFO 0x70000000 /* Register usage information. */ +#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */ +#define PT_MIPS_OPTIONS 0x70000002 +#define PT_MIPS_ABIFLAGS 0x70000003 /* FP mode requirement. */ /* Special program header types. */ @@ -1661,7 +2003,13 @@ typedef struct PLT is writable. For a non-writable PLT, this is omitted or has a zero value. */ #define DT_MIPS_RWPLT 0x70000034 -#define DT_MIPS_NUM 0x35 +/* An alternative description of the classic MIPS RLD_MAP that is usable + in a PIE as it stores a relative offset from the address of the tag + rather than an absolute address. */ +#define DT_MIPS_RLD_MAP_REL 0x70000035 +/* GNU-style hash table with xlat. */ +#define DT_MIPS_XHASH 0x70000036 +#define DT_MIPS_NUM 0x37 /* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */ @@ -1717,6 +2065,101 @@ typedef struct typedef Elf32_Addr Elf32_Conflict; +typedef struct +{ + /* Version of flags structure. */ + Elf32_Half version; + /* The level of the ISA: 1-5, 32, 64. */ + unsigned char isa_level; + /* The revision of ISA: 0 for MIPS V and below, 1-n otherwise. */ + unsigned char isa_rev; + /* The size of general purpose registers. */ + unsigned char gpr_size; + /* The size of co-processor 1 registers. */ + unsigned char cpr1_size; + /* The size of co-processor 2 registers. */ + unsigned char cpr2_size; + /* The floating-point ABI. */ + unsigned char fp_abi; + /* Processor-specific extension. */ + Elf32_Word isa_ext; + /* Mask of ASEs used. */ + Elf32_Word ases; + /* Mask of general flags. */ + Elf32_Word flags1; + Elf32_Word flags2; +} Elf_MIPS_ABIFlags_v0; + +/* Values for the register size bytes of an abi flags structure. */ + +#define MIPS_AFL_REG_NONE 0x00 /* No registers. */ +#define MIPS_AFL_REG_32 0x01 /* 32-bit registers. */ +#define MIPS_AFL_REG_64 0x02 /* 64-bit registers. */ +#define MIPS_AFL_REG_128 0x03 /* 128-bit registers. */ + +/* Masks for the ases word of an ABI flags structure. */ + +#define MIPS_AFL_ASE_DSP 0x00000001 /* DSP ASE. */ +#define MIPS_AFL_ASE_DSPR2 0x00000002 /* DSP R2 ASE. */ +#define MIPS_AFL_ASE_EVA 0x00000004 /* Enhanced VA Scheme. */ +#define MIPS_AFL_ASE_MCU 0x00000008 /* MCU (MicroController) ASE. */ +#define MIPS_AFL_ASE_MDMX 0x00000010 /* MDMX ASE. */ +#define MIPS_AFL_ASE_MIPS3D 0x00000020 /* MIPS-3D ASE. */ +#define MIPS_AFL_ASE_MT 0x00000040 /* MT ASE. */ +#define MIPS_AFL_ASE_SMARTMIPS 0x00000080 /* SmartMIPS ASE. */ +#define MIPS_AFL_ASE_VIRT 0x00000100 /* VZ ASE. */ +#define MIPS_AFL_ASE_MSA 0x00000200 /* MSA ASE. */ +#define MIPS_AFL_ASE_MIPS16 0x00000400 /* MIPS16 ASE. */ +#define MIPS_AFL_ASE_MICROMIPS 0x00000800 /* MICROMIPS ASE. */ +#define MIPS_AFL_ASE_XPA 0x00001000 /* XPA ASE. */ +#define MIPS_AFL_ASE_MASK 0x00001fff /* All ASEs. */ + +/* Values for the isa_ext word of an ABI flags structure. */ + +#define MIPS_AFL_EXT_XLR 1 /* RMI Xlr instruction. */ +#define MIPS_AFL_EXT_OCTEON2 2 /* Cavium Networks Octeon2. */ +#define MIPS_AFL_EXT_OCTEONP 3 /* Cavium Networks OcteonP. */ +#define MIPS_AFL_EXT_LOONGSON_3A 4 /* Loongson 3A. */ +#define MIPS_AFL_EXT_OCTEON 5 /* Cavium Networks Octeon. */ +#define MIPS_AFL_EXT_5900 6 /* MIPS R5900 instruction. */ +#define MIPS_AFL_EXT_4650 7 /* MIPS R4650 instruction. */ +#define MIPS_AFL_EXT_4010 8 /* LSI R4010 instruction. */ +#define MIPS_AFL_EXT_4100 9 /* NEC VR4100 instruction. */ +#define MIPS_AFL_EXT_3900 10 /* Toshiba R3900 instruction. */ +#define MIPS_AFL_EXT_10000 11 /* MIPS R10000 instruction. */ +#define MIPS_AFL_EXT_SB1 12 /* Broadcom SB-1 instruction. */ +#define MIPS_AFL_EXT_4111 13 /* NEC VR4111/VR4181 instruction. */ +#define MIPS_AFL_EXT_4120 14 /* NEC VR4120 instruction. */ +#define MIPS_AFL_EXT_5400 15 /* NEC VR5400 instruction. */ +#define MIPS_AFL_EXT_5500 16 /* NEC VR5500 instruction. */ +#define MIPS_AFL_EXT_LOONGSON_2E 17 /* ST Microelectronics Loongson 2E. */ +#define MIPS_AFL_EXT_LOONGSON_2F 18 /* ST Microelectronics Loongson 2F. */ + +/* Masks for the flags1 word of an ABI flags structure. */ +#define MIPS_AFL_FLAGS1_ODDSPREG 1 /* Uses odd single-precision registers. */ + +/* Object attribute values. */ +enum +{ + /* Not tagged or not using any ABIs affected by the differences. */ + Val_GNU_MIPS_ABI_FP_ANY = 0, + /* Using hard-float -mdouble-float. */ + Val_GNU_MIPS_ABI_FP_DOUBLE = 1, + /* Using hard-float -msingle-float. */ + Val_GNU_MIPS_ABI_FP_SINGLE = 2, + /* Using soft-float. */ + Val_GNU_MIPS_ABI_FP_SOFT = 3, + /* Using -mips32r2 -mfp64. */ + Val_GNU_MIPS_ABI_FP_OLD_64 = 4, + /* Using -mfpxx. */ + Val_GNU_MIPS_ABI_FP_XX = 5, + /* Using -mips32r2 -mfp64. */ + Val_GNU_MIPS_ABI_FP_64 = 6, + /* Using -mips32r2 -mfp64 -mno-odd-spreg. */ + Val_GNU_MIPS_ABI_FP_64A = 7, + /* Maximum allocated FP ABI value. */ + Val_GNU_MIPS_ABI_FP_MAX = 7 +}; /* HPPA specific definitions. */ @@ -1737,9 +2180,9 @@ typedef Elf32_Addr Elf32_Conflict; #define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */ #define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */ -/* Additional section indeces. */ +/* Additional section indices. */ -#define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared +#define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tentatively declared symbols in ANSI C. */ #define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */ @@ -2058,6 +2501,8 @@ typedef Elf32_Addr Elf32_Conflict; #define R_PPC_GOT_DTPREL16_LO 92 /* half16* (sym+add)@got@dtprel@l */ #define R_PPC_GOT_DTPREL16_HI 93 /* half16* (sym+add)@got@dtprel@h */ #define R_PPC_GOT_DTPREL16_HA 94 /* half16* (sym+add)@got@dtprel@ha */ +#define R_PPC_TLSGD 95 /* none (sym+add)@tlsgd */ +#define R_PPC_TLSLD 96 /* none (sym+add)@tlsld */ /* The remaining relocs are from the Embedded ELF ABI, and are not in the SVR4 ELF ABI. */ @@ -2101,7 +2546,11 @@ typedef Elf32_Addr Elf32_Conflict; /* PowerPC specific values for the Dyn d_tag field. */ #define DT_PPC_GOT (DT_LOPROC + 0) -#define DT_PPC_NUM 1 +#define DT_PPC_OPT (DT_LOPROC + 1) +#define DT_PPC_NUM 2 + +/* PowerPC specific values for the DT_PPC_OPT Dyn entry. */ +#define PPC_OPT_TLS 1 /* PowerPC64 relocations defined by the ABIs */ #define R_PPC64_NONE R_PPC_NONE @@ -2214,6 +2663,17 @@ typedef Elf32_Addr Elf32_Conflict; #define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */ #define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */ #define R_PPC64_DTPREL16_HIGHESTA 106 /* half16 (sym+add)@dtprel@highesta */ +#define R_PPC64_TLSGD 107 /* none (sym+add)@tlsgd */ +#define R_PPC64_TLSLD 108 /* none (sym+add)@tlsld */ +#define R_PPC64_TOCSAVE 109 /* none */ + +/* Added when HA and HI relocs were changed to report overflows. */ +#define R_PPC64_ADDR16_HIGH 110 +#define R_PPC64_ADDR16_HIGHA 111 +#define R_PPC64_TPREL16_HIGH 112 +#define R_PPC64_TPREL16_HIGHA 113 +#define R_PPC64_DTPREL16_HIGH 114 +#define R_PPC64_DTPREL16_HIGHA 115 /* GNU extension to support local ifunc. */ #define R_PPC64_JMP_IREL 247 @@ -2223,11 +2683,29 @@ typedef Elf32_Addr Elf32_Conflict; #define R_PPC64_REL16_HI 251 /* half16 (sym+add-.)@h */ #define R_PPC64_REL16_HA 252 /* half16 (sym+add-.)@ha */ +/* e_flags bits specifying ABI. + 1 for original function descriptor using ABI, + 2 for revised ABI without function descriptors, + 0 for unspecified or not using any features affected by the differences. */ +#define EF_PPC64_ABI 3 + /* PowerPC64 specific values for the Dyn d_tag field. */ #define DT_PPC64_GLINK (DT_LOPROC + 0) #define DT_PPC64_OPD (DT_LOPROC + 1) #define DT_PPC64_OPDSZ (DT_LOPROC + 2) -#define DT_PPC64_NUM 3 +#define DT_PPC64_OPT (DT_LOPROC + 3) +#define DT_PPC64_NUM 4 + +/* PowerPC64 specific bits in the DT_PPC64_OPT Dyn entry. */ +#define PPC64_OPT_TLS 1 +#define PPC64_OPT_MULTI_TOC 2 +#define PPC64_OPT_LOCALENTRY 4 + +/* PowerPC64 specific values for the Elf64_Sym st_other field. */ +#define STO_PPC64_LOCAL_BIT 5 +#define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT) +#define PPC64_LOCAL_ENTRY_OFFSET(other) \ + (((1 << (((other) & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT)) >> 2) << 2) /* ARM specific declarations */ @@ -2246,6 +2724,9 @@ typedef Elf32_Addr Elf32_Conflict; #define EF_ARM_VFP_FLOAT 0x400 #define EF_ARM_MAVERICK_FLOAT 0x800 +#define EF_ARM_ABI_FLOAT_SOFT 0x200 /* NB conflicts with EF_ARM_SOFT_FLOAT */ +#define EF_ARM_ABI_FLOAT_HARD 0x400 /* NB conflicts with EF_ARM_VFP_FLOAT */ + /* Other constants defined in the ARM ELF spec. version B-01. */ /* NB. These conflict with values defined above. */ @@ -2290,26 +2771,180 @@ typedef Elf32_Addr Elf32_Conflict; #define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) /* ARM attributes section. */ +/* AArch64 relocs. */ + +#define R_AARCH64_NONE 0 /* No relocation. */ + +/* ILP32 AArch64 relocs. */ +#define R_AARCH64_P32_ABS32 1 /* Direct 32 bit. */ +#define R_AARCH64_P32_COPY 180 /* Copy symbol at runtime. */ +#define R_AARCH64_P32_GLOB_DAT 181 /* Create GOT entry. */ +#define R_AARCH64_P32_JUMP_SLOT 182 /* Create PLT entry. */ +#define R_AARCH64_P32_RELATIVE 183 /* Adjust by program base. */ +#define R_AARCH64_P32_TLS_DTPMOD 184 /* Module number, 32 bit. */ +#define R_AARCH64_P32_TLS_DTPREL 185 /* Module-relative offset, 32 bit. */ +#define R_AARCH64_P32_TLS_TPREL 186 /* TP-relative offset, 32 bit. */ +#define R_AARCH64_P32_TLSDESC 187 /* TLS Descriptor. */ +#define R_AARCH64_P32_IRELATIVE 188 /* STT_GNU_IFUNC relocation. */ + +/* LP64 AArch64 relocs. */ +#define R_AARCH64_ABS64 257 /* Direct 64 bit. */ +#define R_AARCH64_ABS32 258 /* Direct 32 bit. */ +#define R_AARCH64_ABS16 259 /* Direct 16-bit. */ +#define R_AARCH64_PREL64 260 /* PC-relative 64-bit. */ +#define R_AARCH64_PREL32 261 /* PC-relative 32-bit. */ +#define R_AARCH64_PREL16 262 /* PC-relative 16-bit. */ +#define R_AARCH64_MOVW_UABS_G0 263 /* Dir. MOVZ imm. from bits 15:0. */ +#define R_AARCH64_MOVW_UABS_G0_NC 264 /* Likewise for MOVK; no check. */ +#define R_AARCH64_MOVW_UABS_G1 265 /* Dir. MOVZ imm. from bits 31:16. */ +#define R_AARCH64_MOVW_UABS_G1_NC 266 /* Likewise for MOVK; no check. */ +#define R_AARCH64_MOVW_UABS_G2 267 /* Dir. MOVZ imm. from bits 47:32. */ +#define R_AARCH64_MOVW_UABS_G2_NC 268 /* Likewise for MOVK; no check. */ +#define R_AARCH64_MOVW_UABS_G3 269 /* Dir. MOV{K,Z} imm. from 63:48. */ +#define R_AARCH64_MOVW_SABS_G0 270 /* Dir. MOV{N,Z} imm. from 15:0. */ +#define R_AARCH64_MOVW_SABS_G1 271 /* Dir. MOV{N,Z} imm. from 31:16. */ +#define R_AARCH64_MOVW_SABS_G2 272 /* Dir. MOV{N,Z} imm. from 47:32. */ +#define R_AARCH64_LD_PREL_LO19 273 /* PC-rel. LD imm. from bits 20:2. */ +#define R_AARCH64_ADR_PREL_LO21 274 /* PC-rel. ADR imm. from bits 20:0. */ +#define R_AARCH64_ADR_PREL_PG_HI21 275 /* Page-rel. ADRP imm. from 32:12. */ +#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Likewise; no overflow check. */ +#define R_AARCH64_ADD_ABS_LO12_NC 277 /* Dir. ADD imm. from bits 11:0. */ +#define R_AARCH64_LDST8_ABS_LO12_NC 278 /* Likewise for LD/ST; no check. */ +#define R_AARCH64_TSTBR14 279 /* PC-rel. TBZ/TBNZ imm. from 15:2. */ +#define R_AARCH64_CONDBR19 280 /* PC-rel. cond. br. imm. from 20:2. */ +#define R_AARCH64_JUMP26 282 /* PC-rel. B imm. from bits 27:2. */ +#define R_AARCH64_CALL26 283 /* Likewise for CALL. */ +#define R_AARCH64_LDST16_ABS_LO12_NC 284 /* Dir. ADD imm. from bits 11:1. */ +#define R_AARCH64_LDST32_ABS_LO12_NC 285 /* Likewise for bits 11:2. */ +#define R_AARCH64_LDST64_ABS_LO12_NC 286 /* Likewise for bits 11:3. */ +#define R_AARCH64_MOVW_PREL_G0 287 /* PC-rel. MOV{N,Z} imm. from 15:0. */ +#define R_AARCH64_MOVW_PREL_G0_NC 288 /* Likewise for MOVK; no check. */ +#define R_AARCH64_MOVW_PREL_G1 289 /* PC-rel. MOV{N,Z} imm. from 31:16. */ +#define R_AARCH64_MOVW_PREL_G1_NC 290 /* Likewise for MOVK; no check. */ +#define R_AARCH64_MOVW_PREL_G2 291 /* PC-rel. MOV{N,Z} imm. from 47:32. */ +#define R_AARCH64_MOVW_PREL_G2_NC 292 /* Likewise for MOVK; no check. */ +#define R_AARCH64_MOVW_PREL_G3 293 /* PC-rel. MOV{N,Z} imm. from 63:48. */ +#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* Dir. ADD imm. from bits 11:4. */ +#define R_AARCH64_MOVW_GOTOFF_G0 300 /* GOT-rel. off. MOV{N,Z} imm. 15:0. */ +#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 /* Likewise for MOVK; no check. */ +#define R_AARCH64_MOVW_GOTOFF_G1 302 /* GOT-rel. o. MOV{N,Z} imm. 31:16. */ +#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 /* Likewise for MOVK; no check. */ +#define R_AARCH64_MOVW_GOTOFF_G2 304 /* GOT-rel. o. MOV{N,Z} imm. 47:32. */ +#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 /* Likewise for MOVK; no check. */ +#define R_AARCH64_MOVW_GOTOFF_G3 306 /* GOT-rel. o. MOV{N,Z} imm. 63:48. */ +#define R_AARCH64_GOTREL64 307 /* GOT-relative 64-bit. */ +#define R_AARCH64_GOTREL32 308 /* GOT-relative 32-bit. */ +#define R_AARCH64_GOT_LD_PREL19 309 /* PC-rel. GOT off. load imm. 20:2. */ +#define R_AARCH64_LD64_GOTOFF_LO15 310 /* GOT-rel. off. LD/ST imm. 14:3. */ +#define R_AARCH64_ADR_GOT_PAGE 311 /* P-page-rel. GOT off. ADRP 32:12. */ +#define R_AARCH64_LD64_GOT_LO12_NC 312 /* Dir. GOT off. LD/ST imm. 11:3. */ +#define R_AARCH64_LD64_GOTPAGE_LO15 313 /* GOT-page-rel. GOT off. LD/ST 14:3 */ +#define R_AARCH64_TLSGD_ADR_PREL21 512 /* PC-relative ADR imm. 20:0. */ +#define R_AARCH64_TLSGD_ADR_PAGE21 513 /* page-rel. ADRP imm. 32:12. */ +#define R_AARCH64_TLSGD_ADD_LO12_NC 514 /* direct ADD imm. from 11:0. */ +#define R_AARCH64_TLSGD_MOVW_G1 515 /* GOT-rel. MOV{N,Z} 31:16. */ +#define R_AARCH64_TLSGD_MOVW_G0_NC 516 /* GOT-rel. MOVK imm. 15:0. */ +#define R_AARCH64_TLSLD_ADR_PREL21 517 /* Like 512; local dynamic model. */ +#define R_AARCH64_TLSLD_ADR_PAGE21 518 /* Like 513; local dynamic model. */ +#define R_AARCH64_TLSLD_ADD_LO12_NC 519 /* Like 514; local dynamic model. */ +#define R_AARCH64_TLSLD_MOVW_G1 520 /* Like 515; local dynamic model. */ +#define R_AARCH64_TLSLD_MOVW_G0_NC 521 /* Like 516; local dynamic model. */ +#define R_AARCH64_TLSLD_LD_PREL19 522 /* TLS PC-rel. load imm. 20:2. */ +#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* TLS DTP-rel. MOV{N,Z} 47:32. */ +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* TLS DTP-rel. MOV{N,Z} 31:16. */ +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* Likewise; MOVK; no check. */ +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* TLS DTP-rel. MOV{N,Z} 15:0. */ +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 /* Likewise; MOVK; no check. */ +#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTP-rel. ADD imm. from 23:12. */ +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTP-rel. ADD imm. from 11:0. */ +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* Likewise; no ovfl. check. */ +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTP-rel. LD/ST imm. 11:0. */ +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* Likewise; no check. */ +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTP-rel. LD/ST imm. 11:1. */ +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* Likewise; no check. */ +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTP-rel. LD/ST imm. 11:2. */ +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* Likewise; no check. */ +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTP-rel. LD/ST imm. 11:3. */ +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* Likewise; no check. */ +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* GOT-rel. MOV{N,Z} 31:16. */ +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* GOT-rel. MOVK 15:0. */ +#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page-rel. ADRP 32:12. */ +#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* Direct LD off. 11:3. */ +#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* PC-rel. load imm. 20:2. */ +#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TLS TP-rel. MOV{N,Z} 47:32. */ +#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 /* TLS TP-rel. MOV{N,Z} 31:16. */ +#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 /* Likewise; MOVK; no check. */ +#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 /* TLS TP-rel. MOV{N,Z} 15:0. */ +#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 /* Likewise; MOVK; no check. */ +#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 /* TP-rel. ADD imm. 23:12. */ +#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 /* TP-rel. ADD imm. 11:0. */ +#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 /* Likewise; no ovfl. check. */ +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 /* TP-rel. LD/ST off. 11:0. */ +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 /* Likewise; no ovfl. check. */ +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 /* TP-rel. LD/ST off. 11:1. */ +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 /* Likewise; no check. */ +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 /* TP-rel. LD/ST off. 11:2. */ +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 /* Likewise; no check. */ +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 /* TP-rel. LD/ST off. 11:3. */ +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 /* Likewise; no check. */ +#define R_AARCH64_TLSDESC_LD_PREL19 560 /* PC-rel. load immediate 20:2. */ +#define R_AARCH64_TLSDESC_ADR_PREL21 561 /* PC-rel. ADR immediate 20:0. */ +#define R_AARCH64_TLSDESC_ADR_PAGE21 562 /* Page-rel. ADRP imm. 32:12. */ +#define R_AARCH64_TLSDESC_LD64_LO12 563 /* Direct LD off. from 11:3. */ +#define R_AARCH64_TLSDESC_ADD_LO12 564 /* Direct ADD imm. from 11:0. */ +#define R_AARCH64_TLSDESC_OFF_G1 565 /* GOT-rel. MOV{N,Z} imm. 31:16. */ +#define R_AARCH64_TLSDESC_OFF_G0_NC 566 /* GOT-rel. MOVK imm. 15:0; no ck. */ +#define R_AARCH64_TLSDESC_LDR 567 /* Relax LDR. */ +#define R_AARCH64_TLSDESC_ADD 568 /* Relax ADD. */ +#define R_AARCH64_TLSDESC_CALL 569 /* Relax BLR. */ +#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 /* TP-rel. LD/ST off. 11:4. */ +#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 /* Likewise; no check. */ +#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 /* DTP-rel. LD/ST imm. 11:4. */ +#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 /* Likewise; no check. */ +#define R_AARCH64_COPY 1024 /* Copy symbol at runtime. */ +#define R_AARCH64_GLOB_DAT 1025 /* Create GOT entry. */ +#define R_AARCH64_JUMP_SLOT 1026 /* Create PLT entry. */ +#define R_AARCH64_RELATIVE 1027 /* Adjust by program base. */ +#define R_AARCH64_TLS_DTPMOD 1028 /* Module number, 64 bit. */ +#define R_AARCH64_TLS_DTPREL 1029 /* Module-relative offset, 64 bit. */ +#define R_AARCH64_TLS_TPREL 1030 /* TP-relative offset, 64 bit. */ +#define R_AARCH64_TLSDESC 1031 /* TLS Descriptor. */ +#define R_AARCH64_IRELATIVE 1032 /* STT_GNU_IFUNC relocation. */ + +/* MTE memory tag segment type. */ +#define PT_AARCH64_MEMTAG_MTE (PT_LOPROC + 2) + +/* AArch64 specific values for the Dyn d_tag field. */ +#define DT_AARCH64_BTI_PLT (DT_LOPROC + 1) +#define DT_AARCH64_PAC_PLT (DT_LOPROC + 3) +#define DT_AARCH64_VARIANT_PCS (DT_LOPROC + 5) +#define DT_AARCH64_NUM 6 + +/* AArch64 specific values for the st_other field. */ +#define STO_AARCH64_VARIANT_PCS 0x80 + /* ARM relocs. */ #define R_ARM_NONE 0 /* No reloc */ -#define R_ARM_PC24 1 /* PC relative 26 bit branch */ +#define R_ARM_PC24 1 /* Deprecated PC relative 26 + bit branch. */ #define R_ARM_ABS32 2 /* Direct 32 bit */ #define R_ARM_REL32 3 /* PC relative 32 bit */ #define R_ARM_PC13 4 #define R_ARM_ABS16 5 /* Direct 16 bit */ #define R_ARM_ABS12 6 /* Direct 12 bit */ -#define R_ARM_THM_ABS5 7 +#define R_ARM_THM_ABS5 7 /* Direct & 0x7C (LDR, STR). */ #define R_ARM_ABS8 8 /* Direct 8 bit */ #define R_ARM_SBREL32 9 -#define R_ARM_THM_PC22 10 -#define R_ARM_THM_PC8 11 +#define R_ARM_THM_PC22 10 /* PC relative 24 bit (Thumb32 BL). */ +#define R_ARM_THM_PC8 11 /* PC relative & 0x3FC + (Thumb16 LDR, ADD, ADR). */ #define R_ARM_AMP_VCALL9 12 #define R_ARM_SWI24 13 /* Obsolete static relocation. */ #define R_ARM_TLS_DESC 13 /* Dynamic relocation. */ -#define R_ARM_THM_SWI8 14 -#define R_ARM_XPC25 15 -#define R_ARM_THM_XPC22 16 +#define R_ARM_THM_SWI8 14 /* Reserved. */ +#define R_ARM_XPC25 15 /* Reserved. */ +#define R_ARM_THM_XPC22 16 /* Reserved. */ #define R_ARM_TLS_DTPMOD32 17 /* ID of module containing symbol */ #define R_ARM_TLS_DTPOFF32 18 /* Offset in TLS block */ #define R_ARM_TLS_TPOFF32 19 /* Offset in static TLS block */ @@ -2320,21 +2955,109 @@ typedef Elf32_Addr Elf32_Conflict; #define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */ #define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */ #define R_ARM_GOT32 26 /* 32 bit GOT entry */ -#define R_ARM_PLT32 27 /* 32 bit PLT address */ -#define R_ARM_ALU_PCREL_7_0 32 -#define R_ARM_ALU_PCREL_15_8 33 -#define R_ARM_ALU_PCREL_23_15 34 -#define R_ARM_LDR_SBREL_11_0 35 -#define R_ARM_ALU_SBREL_19_12 36 -#define R_ARM_ALU_SBREL_27_20 37 +#define R_ARM_PLT32 27 /* Deprecated, 32 bit PLT address. */ +#define R_ARM_CALL 28 /* PC relative 24 bit (BL, BLX). */ +#define R_ARM_JUMP24 29 /* PC relative 24 bit + (B, BL). */ +#define R_ARM_THM_JUMP24 30 /* PC relative 24 bit (Thumb32 B.W). */ +#define R_ARM_BASE_ABS 31 /* Adjust by program base. */ +#define R_ARM_ALU_PCREL_7_0 32 /* Obsolete. */ +#define R_ARM_ALU_PCREL_15_8 33 /* Obsolete. */ +#define R_ARM_ALU_PCREL_23_15 34 /* Obsolete. */ +#define R_ARM_LDR_SBREL_11_0 35 /* Deprecated, prog. base relative. */ +#define R_ARM_ALU_SBREL_19_12 36 /* Deprecated, prog. base relative. */ +#define R_ARM_ALU_SBREL_27_20 37 /* Deprecated, prog. base relative. */ +#define R_ARM_TARGET1 38 +#define R_ARM_SBREL31 39 /* Program base relative. */ +#define R_ARM_V4BX 40 +#define R_ARM_TARGET2 41 +#define R_ARM_PREL31 42 /* 32 bit PC relative. */ +#define R_ARM_MOVW_ABS_NC 43 /* Direct 16-bit (MOVW). */ +#define R_ARM_MOVT_ABS 44 /* Direct high 16-bit (MOVT). */ +#define R_ARM_MOVW_PREL_NC 45 /* PC relative 16-bit (MOVW). */ +#define R_ARM_MOVT_PREL 46 /* PC relative (MOVT). */ +#define R_ARM_THM_MOVW_ABS_NC 47 /* Direct 16 bit (Thumb32 MOVW). */ +#define R_ARM_THM_MOVT_ABS 48 /* Direct high 16 bit + (Thumb32 MOVT). */ +#define R_ARM_THM_MOVW_PREL_NC 49 /* PC relative 16 bit + (Thumb32 MOVW). */ +#define R_ARM_THM_MOVT_PREL 50 /* PC relative high 16 bit + (Thumb32 MOVT). */ +#define R_ARM_THM_JUMP19 51 /* PC relative 20 bit + (Thumb32 B.W). */ +#define R_ARM_THM_JUMP6 52 /* PC relative X & 0x7E + (Thumb16 CBZ, CBNZ). */ +#define R_ARM_THM_ALU_PREL_11_0 53 /* PC relative 12 bit + (Thumb32 ADR.W). */ +#define R_ARM_THM_PC12 54 /* PC relative 12 bit + (Thumb32 LDR{D,SB,H,SH}). */ +#define R_ARM_ABS32_NOI 55 /* Direct 32-bit. */ +#define R_ARM_REL32_NOI 56 /* PC relative 32-bit. */ +#define R_ARM_ALU_PC_G0_NC 57 /* PC relative (ADD, SUB). */ +#define R_ARM_ALU_PC_G0 58 /* PC relative (ADD, SUB). */ +#define R_ARM_ALU_PC_G1_NC 59 /* PC relative (ADD, SUB). */ +#define R_ARM_ALU_PC_G1 60 /* PC relative (ADD, SUB). */ +#define R_ARM_ALU_PC_G2 61 /* PC relative (ADD, SUB). */ +#define R_ARM_LDR_PC_G1 62 /* PC relative (LDR,STR,LDRB,STRB). */ +#define R_ARM_LDR_PC_G2 63 /* PC relative (LDR,STR,LDRB,STRB). */ +#define R_ARM_LDRS_PC_G0 64 /* PC relative (STR{D,H}, + LDR{D,SB,H,SH}). */ +#define R_ARM_LDRS_PC_G1 65 /* PC relative (STR{D,H}, + LDR{D,SB,H,SH}). */ +#define R_ARM_LDRS_PC_G2 66 /* PC relative (STR{D,H}, + LDR{D,SB,H,SH}). */ +#define R_ARM_LDC_PC_G0 67 /* PC relative (LDC, STC). */ +#define R_ARM_LDC_PC_G1 68 /* PC relative (LDC, STC). */ +#define R_ARM_LDC_PC_G2 69 /* PC relative (LDC, STC). */ +#define R_ARM_ALU_SB_G0_NC 70 /* Program base relative (ADD,SUB). */ +#define R_ARM_ALU_SB_G0 71 /* Program base relative (ADD,SUB). */ +#define R_ARM_ALU_SB_G1_NC 72 /* Program base relative (ADD,SUB). */ +#define R_ARM_ALU_SB_G1 73 /* Program base relative (ADD,SUB). */ +#define R_ARM_ALU_SB_G2 74 /* Program base relative (ADD,SUB). */ +#define R_ARM_LDR_SB_G0 75 /* Program base relative (LDR, + STR, LDRB, STRB). */ +#define R_ARM_LDR_SB_G1 76 /* Program base relative + (LDR, STR, LDRB, STRB). */ +#define R_ARM_LDR_SB_G2 77 /* Program base relative + (LDR, STR, LDRB, STRB). */ +#define R_ARM_LDRS_SB_G0 78 /* Program base relative + (LDR, STR, LDRB, STRB). */ +#define R_ARM_LDRS_SB_G1 79 /* Program base relative + (LDR, STR, LDRB, STRB). */ +#define R_ARM_LDRS_SB_G2 80 /* Program base relative + (LDR, STR, LDRB, STRB). */ +#define R_ARM_LDC_SB_G0 81 /* Program base relative (LDC,STC). */ +#define R_ARM_LDC_SB_G1 82 /* Program base relative (LDC,STC). */ +#define R_ARM_LDC_SB_G2 83 /* Program base relative (LDC,STC). */ +#define R_ARM_MOVW_BREL_NC 84 /* Program base relative 16 + bit (MOVW). */ +#define R_ARM_MOVT_BREL 85 /* Program base relative high + 16 bit (MOVT). */ +#define R_ARM_MOVW_BREL 86 /* Program base relative 16 + bit (MOVW). */ +#define R_ARM_THM_MOVW_BREL_NC 87 /* Program base relative 16 + bit (Thumb32 MOVW). */ +#define R_ARM_THM_MOVT_BREL 88 /* Program base relative high + 16 bit (Thumb32 MOVT). */ +#define R_ARM_THM_MOVW_BREL 89 /* Program base relative 16 + bit (Thumb32 MOVW). */ #define R_ARM_TLS_GOTDESC 90 #define R_ARM_TLS_CALL 91 -#define R_ARM_TLS_DESCSEQ 92 +#define R_ARM_TLS_DESCSEQ 92 /* TLS relaxation. */ #define R_ARM_THM_TLS_CALL 93 +#define R_ARM_PLT32_ABS 94 +#define R_ARM_GOT_ABS 95 /* GOT entry. */ +#define R_ARM_GOT_PREL 96 /* PC relative GOT entry. */ +#define R_ARM_GOT_BREL12 97 /* GOT entry relative to GOT + origin (LDR). */ +#define R_ARM_GOTOFF12 98 /* 12 bit, GOT entry relative + to GOT origin (LDR, STR). */ +#define R_ARM_GOTRELAX 99 #define R_ARM_GNU_VTENTRY 100 #define R_ARM_GNU_VTINHERIT 101 -#define R_ARM_THM_PC11 102 /* thumb unconditional branch */ -#define R_ARM_THM_PC9 103 /* thumb conditional branch */ +#define R_ARM_THM_PC11 102 /* PC relative & 0xFFE (Thumb16 B). */ +#define R_ARM_THM_PC9 103 /* PC relative & 0x1FE + (Thumb16 B/B). */ #define R_ARM_TLS_GD32 104 /* PC-rel 32 bit for global dynamic thread local data */ #define R_ARM_TLS_LDM32 105 /* PC-rel 32 bit for local dynamic @@ -2345,7 +3068,18 @@ typedef Elf32_Addr Elf32_Conflict; static TLS block offset */ #define R_ARM_TLS_LE32 108 /* 32 bit offset relative to static TLS block */ -#define R_ARM_THM_TLS_DESCSEQ 129 +#define R_ARM_TLS_LDO12 109 /* 12 bit relative to TLS + block (LDR, STR). */ +#define R_ARM_TLS_LE12 110 /* 12 bit relative to static + TLS block (LDR, STR). */ +#define R_ARM_TLS_IE12GP 111 /* 12 bit GOT entry relative + to GOT origin (LDR). */ +#define R_ARM_ME_TOO 128 /* Obsolete. */ +#define R_ARM_THM_TLS_DESCSEQ 129 +#define R_ARM_THM_TLS_DESCSEQ16 129 +#define R_ARM_THM_TLS_DESCSEQ32 130 +#define R_ARM_THM_GOT_BREL12 131 /* GOT entry relative to GOT + origin, 12 bit (Thumb32 LDR). */ #define R_ARM_IRELATIVE 160 #define R_ARM_RXPC25 249 #define R_ARM_RSBREL32 250 @@ -2357,6 +3091,81 @@ typedef Elf32_Addr Elf32_Conflict; /* Keep this the last entry. */ #define R_ARM_NUM 256 +/* C-SKY */ +#define R_CKCORE_NONE 0 /* no reloc */ +#define R_CKCORE_ADDR32 1 /* direct 32 bit (S + A) */ +#define R_CKCORE_PCRELIMM8BY4 2 /* disp ((S + A - P) >> 2) & 0xff */ +#define R_CKCORE_PCRELIMM11BY2 3 /* disp ((S + A - P) >> 1) & 0x7ff */ +#define R_CKCORE_PCREL32 5 /* 32-bit rel (S + A - P) */ +#define R_CKCORE_PCRELJSR_IMM11BY2 6 /* disp ((S + A - P) >>1) & 0x7ff */ +#define R_CKCORE_RELATIVE 9 /* 32 bit adjust program base(B + A)*/ +#define R_CKCORE_COPY 10 /* 32 bit adjust by program base */ +#define R_CKCORE_GLOB_DAT 11 /* off between got and sym (S) */ +#define R_CKCORE_JUMP_SLOT 12 /* PLT entry (S) */ +#define R_CKCORE_GOTOFF 13 /* offset to GOT (S + A - GOT) */ +#define R_CKCORE_GOTPC 14 /* PC offset to GOT (GOT + A - P) */ +#define R_CKCORE_GOT32 15 /* 32 bit GOT entry (G) */ +#define R_CKCORE_PLT32 16 /* 32 bit PLT entry (G) */ +#define R_CKCORE_ADDRGOT 17 /* GOT entry in GLOB_DAT (GOT + G) */ +#define R_CKCORE_ADDRPLT 18 /* PLT entry in GLOB_DAT (GOT + G) */ +#define R_CKCORE_PCREL_IMM26BY2 19 /* ((S + A - P) >> 1) & 0x3ffffff */ +#define R_CKCORE_PCREL_IMM16BY2 20 /* disp ((S + A - P) >> 1) & 0xffff */ +#define R_CKCORE_PCREL_IMM16BY4 21 /* disp ((S + A - P) >> 2) & 0xffff */ +#define R_CKCORE_PCREL_IMM10BY2 22 /* disp ((S + A - P) >> 1) & 0x3ff */ +#define R_CKCORE_PCREL_IMM10BY4 23 /* disp ((S + A - P) >> 2) & 0x3ff */ +#define R_CKCORE_ADDR_HI16 24 /* high & low 16 bit ADDR */ + /* ((S + A) >> 16) & 0xffff */ +#define R_CKCORE_ADDR_LO16 25 /* (S + A) & 0xffff */ +#define R_CKCORE_GOTPC_HI16 26 /* high & low 16 bit GOTPC */ + /* ((GOT + A - P) >> 16) & 0xffff */ +#define R_CKCORE_GOTPC_LO16 27 /* (GOT + A - P) & 0xffff */ +#define R_CKCORE_GOTOFF_HI16 28 /* high & low 16 bit GOTOFF */ + /* ((S + A - GOT) >> 16) & 0xffff */ +#define R_CKCORE_GOTOFF_LO16 29 /* (S + A - GOT) & 0xffff */ +#define R_CKCORE_GOT12 30 /* 12 bit disp GOT entry (G) */ +#define R_CKCORE_GOT_HI16 31 /* high & low 16 bit GOT */ + /* (G >> 16) & 0xffff */ +#define R_CKCORE_GOT_LO16 32 /* (G & 0xffff) */ +#define R_CKCORE_PLT12 33 /* 12 bit disp PLT entry (G) */ +#define R_CKCORE_PLT_HI16 34 /* high & low 16 bit PLT */ + /* (G >> 16) & 0xffff */ +#define R_CKCORE_PLT_LO16 35 /* G & 0xffff */ +#define R_CKCORE_ADDRGOT_HI16 36 /* high & low 16 bit ADDRGOT */ + /* (GOT + G * 4) & 0xffff */ +#define R_CKCORE_ADDRGOT_LO16 37 /* (GOT + G * 4) & 0xffff */ +#define R_CKCORE_ADDRPLT_HI16 38 /* high & low 16 bit ADDRPLT */ + /* ((GOT + G * 4) >> 16) & 0xFFFF */ +#define R_CKCORE_ADDRPLT_LO16 39 /* (GOT+G*4) & 0xffff */ +#define R_CKCORE_PCREL_JSR_IMM26BY2 40 /* disp ((S+A-P) >>1) & x3ffffff */ +#define R_CKCORE_TOFFSET_LO16 41 /* (S+A-BTEXT) & 0xffff */ +#define R_CKCORE_DOFFSET_LO16 42 /* (S+A-BTEXT) & 0xffff */ +#define R_CKCORE_PCREL_IMM18BY2 43 /* disp ((S+A-P) >>1) & 0x3ffff */ +#define R_CKCORE_DOFFSET_IMM18 44 /* disp (S+A-BDATA) & 0x3ffff */ +#define R_CKCORE_DOFFSET_IMM18BY2 45 /* disp ((S+A-BDATA)>>1) & 0x3ffff */ +#define R_CKCORE_DOFFSET_IMM18BY4 46 /* disp ((S+A-BDATA)>>2) & 0x3ffff */ +#define R_CKCORE_GOT_IMM18BY4 48 /* disp (G >> 2) */ +#define R_CKCORE_PLT_IMM18BY4 49 /* disp (G >> 2) */ +#define R_CKCORE_PCREL_IMM7BY4 50 /* disp ((S+A-P) >>2) & 0x7f */ +#define R_CKCORE_TLS_LE32 51 /* 32 bit offset to TLS block */ +#define R_CKCORE_TLS_IE32 52 +#define R_CKCORE_TLS_GD32 53 +#define R_CKCORE_TLS_LDM32 54 +#define R_CKCORE_TLS_LDO32 55 +#define R_CKCORE_TLS_DTPMOD32 56 +#define R_CKCORE_TLS_DTPOFF32 57 +#define R_CKCORE_TLS_TPOFF32 58 + +/* C-SKY elf header definition. */ +#define EF_CSKY_ABIMASK 0XF0000000 +#define EF_CSKY_OTHER 0X0FFF0000 +#define EF_CSKY_PROCESSOR 0X0000FFFF + +#define EF_CSKY_ABIV1 0X10000000 +#define EF_CSKY_ABIV2 0X20000000 + +/* C-SKY attributes section. */ +#define SHT_CSKY_ATTRIBUTES (SHT_LOPROC + 1) + /* IA-64 specific declarations. */ /* Processor specific flags for the Ehdr e_flags field. */ @@ -2701,8 +3510,18 @@ typedef Elf32_Addr Elf32_Conflict; #define R_X86_64_TLSDESC 36 /* TLS descriptor. */ #define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */ #define R_X86_64_RELATIVE64 38 /* 64-bit adjust by program base */ + /* 39 Reserved was R_X86_64_PC32_BND */ + /* 40 Reserved was R_X86_64_PLT32_BND */ +#define R_X86_64_GOTPCRELX 41 /* Load from 32 bit signed pc relative + offset to GOT entry without REX + prefix, relaxable. */ +#define R_X86_64_REX_GOTPCRELX 42 /* Load from 32 bit signed pc relative + offset to GOT entry with REX prefix, + relaxable. */ +#define R_X86_64_NUM 43 -#define R_X86_64_NUM 39 +/* x86-64 sh_type values. */ +#define SHT_X86_64_UNWIND 0x70000001 /* Unwind information. */ /* AM33 relocations. */ @@ -2730,8 +3549,23 @@ typedef Elf32_Addr Elf32_Conflict; #define R_MN10300_GLOB_DAT 21 /* Create GOT entry. */ #define R_MN10300_JMP_SLOT 22 /* Create PLT entry. */ #define R_MN10300_RELATIVE 23 /* Adjust by program base. */ - -#define R_MN10300_NUM 24 +#define R_MN10300_TLS_GD 24 /* 32-bit offset for global dynamic. */ +#define R_MN10300_TLS_LD 25 /* 32-bit offset for local dynamic. */ +#define R_MN10300_TLS_LDO 26 /* Module-relative offset. */ +#define R_MN10300_TLS_GOTIE 27 /* GOT offset for static TLS block + offset. */ +#define R_MN10300_TLS_IE 28 /* GOT address for static TLS block + offset. */ +#define R_MN10300_TLS_LE 29 /* Offset relative to static TLS + block. */ +#define R_MN10300_TLS_DTPMOD 30 /* ID of module containing symbol. */ +#define R_MN10300_TLS_DTPOFF 31 /* Offset in module TLS block. */ +#define R_MN10300_TLS_TPOFF 32 /* Offset in static TLS block. */ +#define R_MN10300_SYM_DIFF 33 /* Adjustment for next reloc as needed + by linker relaxation. */ +#define R_MN10300_ALIGN 34 /* Alignment requirement for linker + relaxation. */ +#define R_MN10300_NUM 35 /* M32R relocs. */ @@ -2789,6 +3623,89 @@ typedef Elf32_Addr Elf32_Conflict; #define R_M32R_GOTOFF_LO 64 /* Low 16 bit offset to GOT */ #define R_M32R_NUM 256 /* Keep this the last entry. */ +/* MicroBlaze relocations */ +#define R_MICROBLAZE_NONE 0 /* No reloc. */ +#define R_MICROBLAZE_32 1 /* Direct 32 bit. */ +#define R_MICROBLAZE_32_PCREL 2 /* PC relative 32 bit. */ +#define R_MICROBLAZE_64_PCREL 3 /* PC relative 64 bit. */ +#define R_MICROBLAZE_32_PCREL_LO 4 /* Low 16 bits of PCREL32. */ +#define R_MICROBLAZE_64 5 /* Direct 64 bit. */ +#define R_MICROBLAZE_32_LO 6 /* Low 16 bit. */ +#define R_MICROBLAZE_SRO32 7 /* Read-only small data area. */ +#define R_MICROBLAZE_SRW32 8 /* Read-write small data area. */ +#define R_MICROBLAZE_64_NONE 9 /* No reloc. */ +#define R_MICROBLAZE_32_SYM_OP_SYM 10 /* Symbol Op Symbol relocation. */ +#define R_MICROBLAZE_GNU_VTINHERIT 11 /* GNU C++ vtable hierarchy. */ +#define R_MICROBLAZE_GNU_VTENTRY 12 /* GNU C++ vtable member usage. */ +#define R_MICROBLAZE_GOTPC_64 13 /* PC-relative GOT offset. */ +#define R_MICROBLAZE_GOT_64 14 /* GOT entry offset. */ +#define R_MICROBLAZE_PLT_64 15 /* PLT offset (PC-relative). */ +#define R_MICROBLAZE_REL 16 /* Adjust by program base. */ +#define R_MICROBLAZE_JUMP_SLOT 17 /* Create PLT entry. */ +#define R_MICROBLAZE_GLOB_DAT 18 /* Create GOT entry. */ +#define R_MICROBLAZE_GOTOFF_64 19 /* 64 bit offset to GOT. */ +#define R_MICROBLAZE_GOTOFF_32 20 /* 32 bit offset to GOT. */ +#define R_MICROBLAZE_COPY 21 /* Runtime copy. */ +#define R_MICROBLAZE_TLS 22 /* TLS Reloc. */ +#define R_MICROBLAZE_TLSGD 23 /* TLS General Dynamic. */ +#define R_MICROBLAZE_TLSLD 24 /* TLS Local Dynamic. */ +#define R_MICROBLAZE_TLSDTPMOD32 25 /* TLS Module ID. */ +#define R_MICROBLAZE_TLSDTPREL32 26 /* TLS Offset Within TLS Block. */ +#define R_MICROBLAZE_TLSDTPREL64 27 /* TLS Offset Within TLS Block. */ +#define R_MICROBLAZE_TLSGOTTPREL32 28 /* TLS Offset From Thread Pointer. */ +#define R_MICROBLAZE_TLSTPREL32 29 /* TLS Offset From Thread Pointer. */ + +/* Legal values for d_tag (dynamic entry type). */ +#define DT_NIOS2_GP 0x70000002 /* Address of _gp. */ + +/* Nios II relocations. */ +#define R_NIOS2_NONE 0 /* No reloc. */ +#define R_NIOS2_S16 1 /* Direct signed 16 bit. */ +#define R_NIOS2_U16 2 /* Direct unsigned 16 bit. */ +#define R_NIOS2_PCREL16 3 /* PC relative 16 bit. */ +#define R_NIOS2_CALL26 4 /* Direct call. */ +#define R_NIOS2_IMM5 5 /* 5 bit constant expression. */ +#define R_NIOS2_CACHE_OPX 6 /* 5 bit expression, shift 22. */ +#define R_NIOS2_IMM6 7 /* 6 bit constant expression. */ +#define R_NIOS2_IMM8 8 /* 8 bit constant expression. */ +#define R_NIOS2_HI16 9 /* High 16 bit. */ +#define R_NIOS2_LO16 10 /* Low 16 bit. */ +#define R_NIOS2_HIADJ16 11 /* High 16 bit, adjusted. */ +#define R_NIOS2_BFD_RELOC_32 12 /* 32 bit symbol value + addend. */ +#define R_NIOS2_BFD_RELOC_16 13 /* 16 bit symbol value + addend. */ +#define R_NIOS2_BFD_RELOC_8 14 /* 8 bit symbol value + addend. */ +#define R_NIOS2_GPREL 15 /* 16 bit GP pointer offset. */ +#define R_NIOS2_GNU_VTINHERIT 16 /* GNU C++ vtable hierarchy. */ +#define R_NIOS2_GNU_VTENTRY 17 /* GNU C++ vtable member usage. */ +#define R_NIOS2_UJMP 18 /* Unconditional branch. */ +#define R_NIOS2_CJMP 19 /* Conditional branch. */ +#define R_NIOS2_CALLR 20 /* Indirect call through register. */ +#define R_NIOS2_ALIGN 21 /* Alignment requirement for + linker relaxation. */ +#define R_NIOS2_GOT16 22 /* 16 bit GOT entry. */ +#define R_NIOS2_CALL16 23 /* 16 bit GOT entry for function. */ +#define R_NIOS2_GOTOFF_LO 24 /* %lo of offset to GOT pointer. */ +#define R_NIOS2_GOTOFF_HA 25 /* %hiadj of offset to GOT pointer. */ +#define R_NIOS2_PCREL_LO 26 /* %lo of PC relative offset. */ +#define R_NIOS2_PCREL_HA 27 /* %hiadj of PC relative offset. */ +#define R_NIOS2_TLS_GD16 28 /* 16 bit GOT offset for TLS GD. */ +#define R_NIOS2_TLS_LDM16 29 /* 16 bit GOT offset for TLS LDM. */ +#define R_NIOS2_TLS_LDO16 30 /* 16 bit module relative offset. */ +#define R_NIOS2_TLS_IE16 31 /* 16 bit GOT offset for TLS IE. */ +#define R_NIOS2_TLS_LE16 32 /* 16 bit LE TP-relative offset. */ +#define R_NIOS2_TLS_DTPMOD 33 /* Module number. */ +#define R_NIOS2_TLS_DTPREL 34 /* Module-relative offset. */ +#define R_NIOS2_TLS_TPREL 35 /* TP-relative offset. */ +#define R_NIOS2_COPY 36 /* Copy symbol at runtime. */ +#define R_NIOS2_GLOB_DAT 37 /* Create GOT entry. */ +#define R_NIOS2_JUMP_SLOT 38 /* Create PLT entry. */ +#define R_NIOS2_RELATIVE 39 /* Adjust by program base. */ +#define R_NIOS2_GOTOFF 40 /* 16 bit offset to GOT pointer. */ +#define R_NIOS2_CALL26_NOAT 41 /* Direct call in .noat section. */ +#define R_NIOS2_GOT_LO 42 /* %lo() of GOT entry. */ +#define R_NIOS2_GOT_HA 43 /* %hiadj() of GOT entry. */ +#define R_NIOS2_CALL_LO 44 /* %lo() of function GOT entry. */ +#define R_NIOS2_CALL_HA 45 /* %hiadj() of function GOT entry. */ /* TILEPro relocations. */ #define R_TILEPRO_NONE 0 /* No reloc */ @@ -2955,12 +3872,18 @@ typedef Elf32_Addr Elf32_Conflict; #define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */ #define R_TILEGX_IMM16_X0_HW0_GOT 64 /* X0 pipe hword 0 GOT offset */ #define R_TILEGX_IMM16_X1_HW0_GOT 65 /* X1 pipe hword 0 GOT offset */ -/* Relocs 66-71 are currently not defined. */ +#define R_TILEGX_IMM16_X0_HW0_PLT_PCREL 66 /* X0 pipe PC-rel PLT hword 0 */ +#define R_TILEGX_IMM16_X1_HW0_PLT_PCREL 67 /* X1 pipe PC-rel PLT hword 0 */ +#define R_TILEGX_IMM16_X0_HW1_PLT_PCREL 68 /* X0 pipe PC-rel PLT hword 1 */ +#define R_TILEGX_IMM16_X1_HW1_PLT_PCREL 69 /* X1 pipe PC-rel PLT hword 1 */ +#define R_TILEGX_IMM16_X0_HW2_PLT_PCREL 70 /* X0 pipe PC-rel PLT hword 2 */ +#define R_TILEGX_IMM16_X1_HW2_PLT_PCREL 71 /* X1 pipe PC-rel PLT hword 2 */ #define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */ #define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */ #define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */ #define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */ -/* Relocs 76-77 are currently not defined. */ +#define R_TILEGX_IMM16_X0_HW3_PLT_PCREL 76 /* X0 pipe PC-rel PLT hword 3 */ +#define R_TILEGX_IMM16_X1_HW3_PLT_PCREL 77 /* X1 pipe PC-rel PLT hword 3 */ #define R_TILEGX_IMM16_X0_HW0_TLS_GD 78 /* X0 pipe hword 0 TLS GD offset */ #define R_TILEGX_IMM16_X1_HW0_TLS_GD 79 /* X1 pipe hword 0 TLS GD offset */ #define R_TILEGX_IMM16_X0_HW0_TLS_LE 80 /* X0 pipe hword 0 TLS LE offset */ @@ -2976,7 +3899,12 @@ typedef Elf32_Addr Elf32_Conflict; /* Relocs 90-91 are currently not defined. */ #define R_TILEGX_IMM16_X0_HW0_TLS_IE 92 /* X0 pipe hword 0 TLS IE offset */ #define R_TILEGX_IMM16_X1_HW0_TLS_IE 93 /* X1 pipe hword 0 TLS IE offset */ -/* Relocs 94-99 are currently not defined. */ +#define R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL 94 /* X0 pipe PC-rel PLT last hword 0 */ +#define R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL 95 /* X1 pipe PC-rel PLT last hword 0 */ +#define R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL 96 /* X0 pipe PC-rel PLT last hword 1 */ +#define R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL 97 /* X1 pipe PC-rel PLT last hword 1 */ +#define R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL 98 /* X0 pipe PC-rel PLT last hword 2 */ +#define R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL 99 /* X1 pipe PC-rel PLT last hword 2 */ #define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */ #define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */ #define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */ @@ -3004,4 +3932,396 @@ typedef Elf32_Addr Elf32_Conflict; #define R_TILEGX_NUM 130 +/* RISC-V ELF Flags */ +#define EF_RISCV_RVC 0x0001 +#define EF_RISCV_FLOAT_ABI 0x0006 +#define EF_RISCV_FLOAT_ABI_SOFT 0x0000 +#define EF_RISCV_FLOAT_ABI_SINGLE 0x0002 +#define EF_RISCV_FLOAT_ABI_DOUBLE 0x0004 +#define EF_RISCV_FLOAT_ABI_QUAD 0x0006 +#define EF_RISCV_RVE 0x0008 +#define EF_RISCV_TSO 0x0010 + +/* RISC-V relocations. */ +#define R_RISCV_NONE 0 +#define R_RISCV_32 1 +#define R_RISCV_64 2 +#define R_RISCV_RELATIVE 3 +#define R_RISCV_COPY 4 +#define R_RISCV_JUMP_SLOT 5 +#define R_RISCV_TLS_DTPMOD32 6 +#define R_RISCV_TLS_DTPMOD64 7 +#define R_RISCV_TLS_DTPREL32 8 +#define R_RISCV_TLS_DTPREL64 9 +#define R_RISCV_TLS_TPREL32 10 +#define R_RISCV_TLS_TPREL64 11 +#define R_RISCV_BRANCH 16 +#define R_RISCV_JAL 17 +#define R_RISCV_CALL 18 +#define R_RISCV_CALL_PLT 19 +#define R_RISCV_GOT_HI20 20 +#define R_RISCV_TLS_GOT_HI20 21 +#define R_RISCV_TLS_GD_HI20 22 +#define R_RISCV_PCREL_HI20 23 +#define R_RISCV_PCREL_LO12_I 24 +#define R_RISCV_PCREL_LO12_S 25 +#define R_RISCV_HI20 26 +#define R_RISCV_LO12_I 27 +#define R_RISCV_LO12_S 28 +#define R_RISCV_TPREL_HI20 29 +#define R_RISCV_TPREL_LO12_I 30 +#define R_RISCV_TPREL_LO12_S 31 +#define R_RISCV_TPREL_ADD 32 +#define R_RISCV_ADD8 33 +#define R_RISCV_ADD16 34 +#define R_RISCV_ADD32 35 +#define R_RISCV_ADD64 36 +#define R_RISCV_SUB8 37 +#define R_RISCV_SUB16 38 +#define R_RISCV_SUB32 39 +#define R_RISCV_SUB64 40 +#define R_RISCV_GNU_VTINHERIT 41 +#define R_RISCV_GNU_VTENTRY 42 +#define R_RISCV_ALIGN 43 +#define R_RISCV_RVC_BRANCH 44 +#define R_RISCV_RVC_JUMP 45 +#define R_RISCV_RVC_LUI 46 +#define R_RISCV_GPREL_I 47 +#define R_RISCV_GPREL_S 48 +#define R_RISCV_TPREL_I 49 +#define R_RISCV_TPREL_S 50 +#define R_RISCV_RELAX 51 +#define R_RISCV_SUB6 52 +#define R_RISCV_SET6 53 +#define R_RISCV_SET8 54 +#define R_RISCV_SET16 55 +#define R_RISCV_SET32 56 +#define R_RISCV_32_PCREL 57 +#define R_RISCV_IRELATIVE 58 + +#define R_RISCV_NUM 59 + +/* RISC-V specific values for the st_other field. */ +#define STO_RISCV_VARIANT_CC 0x80 /* Function uses variant calling + convention */ + +/* RISC-V specific values for the sh_type field. */ +#define SHT_RISCV_ATTRIBUTES (SHT_LOPROC + 3) + +/* RISC-V specific values for the p_type field. */ +#define PT_RISCV_ATTRIBUTES (PT_LOPROC + 3) + +/* RISC-V specific values for the d_tag field. */ +#define DT_RISCV_VARIANT_CC (DT_LOPROC + 1) + +/* BPF specific declarations. */ + +#define R_BPF_NONE 0 /* No reloc */ +#define R_BPF_64_64 1 +#define R_BPF_64_32 10 + +/* Imagination Meta specific relocations. */ + +#define R_METAG_HIADDR16 0 +#define R_METAG_LOADDR16 1 +#define R_METAG_ADDR32 2 /* 32bit absolute address */ +#define R_METAG_NONE 3 /* No reloc */ +#define R_METAG_RELBRANCH 4 +#define R_METAG_GETSETOFF 5 + +/* Backward compatibility */ +#define R_METAG_REG32OP1 6 +#define R_METAG_REG32OP2 7 +#define R_METAG_REG32OP3 8 +#define R_METAG_REG16OP1 9 +#define R_METAG_REG16OP2 10 +#define R_METAG_REG16OP3 11 +#define R_METAG_REG32OP4 12 + +#define R_METAG_HIOG 13 +#define R_METAG_LOOG 14 + +#define R_METAG_REL8 15 +#define R_METAG_REL16 16 + +/* GNU */ +#define R_METAG_GNU_VTINHERIT 30 +#define R_METAG_GNU_VTENTRY 31 + +/* PIC relocations */ +#define R_METAG_HI16_GOTOFF 32 +#define R_METAG_LO16_GOTOFF 33 +#define R_METAG_GETSET_GOTOFF 34 +#define R_METAG_GETSET_GOT 35 +#define R_METAG_HI16_GOTPC 36 +#define R_METAG_LO16_GOTPC 37 +#define R_METAG_HI16_PLT 38 +#define R_METAG_LO16_PLT 39 +#define R_METAG_RELBRANCH_PLT 40 +#define R_METAG_GOTOFF 41 +#define R_METAG_PLT 42 +#define R_METAG_COPY 43 +#define R_METAG_JMP_SLOT 44 +#define R_METAG_RELATIVE 45 +#define R_METAG_GLOB_DAT 46 + +/* TLS relocations */ +#define R_METAG_TLS_GD 47 +#define R_METAG_TLS_LDM 48 +#define R_METAG_TLS_LDO_HI16 49 +#define R_METAG_TLS_LDO_LO16 50 +#define R_METAG_TLS_LDO 51 +#define R_METAG_TLS_IE 52 +#define R_METAG_TLS_IENONPIC 53 +#define R_METAG_TLS_IENONPIC_HI16 54 +#define R_METAG_TLS_IENONPIC_LO16 55 +#define R_METAG_TLS_TPOFF 56 +#define R_METAG_TLS_DTPMOD 57 +#define R_METAG_TLS_DTPOFF 58 +#define R_METAG_TLS_LE 59 +#define R_METAG_TLS_LE_HI16 60 +#define R_METAG_TLS_LE_LO16 61 + +/* NDS32 relocations. */ +#define R_NDS32_NONE 0 +#define R_NDS32_32_RELA 20 +#define R_NDS32_COPY 39 +#define R_NDS32_GLOB_DAT 40 +#define R_NDS32_JMP_SLOT 41 +#define R_NDS32_RELATIVE 42 +#define R_NDS32_TLS_TPOFF 102 +#define R_NDS32_TLS_DESC 119 + +/* LoongArch ELF Flags */ +#define EF_LARCH_ABI_MODIFIER_MASK 0x07 +#define EF_LARCH_ABI_SOFT_FLOAT 0x01 +#define EF_LARCH_ABI_SINGLE_FLOAT 0x02 +#define EF_LARCH_ABI_DOUBLE_FLOAT 0x03 +#define EF_LARCH_OBJABI_V1 0x40 + +/* LoongArch specific dynamic relocations */ +#define R_LARCH_NONE 0 +#define R_LARCH_32 1 +#define R_LARCH_64 2 +#define R_LARCH_RELATIVE 3 +#define R_LARCH_COPY 4 +#define R_LARCH_JUMP_SLOT 5 +#define R_LARCH_TLS_DTPMOD32 6 +#define R_LARCH_TLS_DTPMOD64 7 +#define R_LARCH_TLS_DTPREL32 8 +#define R_LARCH_TLS_DTPREL64 9 +#define R_LARCH_TLS_TPREL32 10 +#define R_LARCH_TLS_TPREL64 11 +#define R_LARCH_IRELATIVE 12 + +/* Reserved for future relocs that the dynamic linker must understand. */ + +/* used by the static linker for relocating .text. */ +#define R_LARCH_MARK_LA 20 +#define R_LARCH_MARK_PCREL 21 +#define R_LARCH_SOP_PUSH_PCREL 22 +#define R_LARCH_SOP_PUSH_ABSOLUTE 23 +#define R_LARCH_SOP_PUSH_DUP 24 +#define R_LARCH_SOP_PUSH_GPREL 25 +#define R_LARCH_SOP_PUSH_TLS_TPREL 26 +#define R_LARCH_SOP_PUSH_TLS_GOT 27 +#define R_LARCH_SOP_PUSH_TLS_GD 28 +#define R_LARCH_SOP_PUSH_PLT_PCREL 29 +#define R_LARCH_SOP_ASSERT 30 +#define R_LARCH_SOP_NOT 31 +#define R_LARCH_SOP_SUB 32 +#define R_LARCH_SOP_SL 33 +#define R_LARCH_SOP_SR 34 +#define R_LARCH_SOP_ADD 35 +#define R_LARCH_SOP_AND 36 +#define R_LARCH_SOP_IF_ELSE 37 +#define R_LARCH_SOP_POP_32_S_10_5 38 +#define R_LARCH_SOP_POP_32_U_10_12 39 +#define R_LARCH_SOP_POP_32_S_10_12 40 +#define R_LARCH_SOP_POP_32_S_10_16 41 +#define R_LARCH_SOP_POP_32_S_10_16_S2 42 +#define R_LARCH_SOP_POP_32_S_5_20 43 +#define R_LARCH_SOP_POP_32_S_0_5_10_16_S2 44 +#define R_LARCH_SOP_POP_32_S_0_10_10_16_S2 45 +#define R_LARCH_SOP_POP_32_U 46 + +/* used by the static linker for relocating non .text. */ +#define R_LARCH_ADD8 47 +#define R_LARCH_ADD16 48 +#define R_LARCH_ADD24 49 +#define R_LARCH_ADD32 50 +#define R_LARCH_ADD64 51 +#define R_LARCH_SUB8 52 +#define R_LARCH_SUB16 53 +#define R_LARCH_SUB24 54 +#define R_LARCH_SUB32 55 +#define R_LARCH_SUB64 56 +#define R_LARCH_GNU_VTINHERIT 57 +#define R_LARCH_GNU_VTENTRY 58 + +/* reserved 59-63 */ + +#define R_LARCH_B16 64 +#define R_LARCH_B21 65 +#define R_LARCH_B26 66 +#define R_LARCH_ABS_HI20 67 +#define R_LARCH_ABS_LO12 68 +#define R_LARCH_ABS64_LO20 69 +#define R_LARCH_ABS64_HI12 70 +#define R_LARCH_PCALA_HI20 71 +#define R_LARCH_PCALA_LO12 72 +#define R_LARCH_PCALA64_LO20 73 +#define R_LARCH_PCALA64_HI12 74 +#define R_LARCH_GOT_PC_HI20 75 +#define R_LARCH_GOT_PC_LO12 76 +#define R_LARCH_GOT64_PC_LO20 77 +#define R_LARCH_GOT64_PC_HI12 78 +#define R_LARCH_GOT_HI20 79 +#define R_LARCH_GOT_LO12 80 +#define R_LARCH_GOT64_LO20 81 +#define R_LARCH_GOT64_HI12 82 +#define R_LARCH_TLS_LE_HI20 83 +#define R_LARCH_TLS_LE_LO12 84 +#define R_LARCH_TLS_LE64_LO20 85 +#define R_LARCH_TLS_LE64_HI12 86 +#define R_LARCH_TLS_IE_PC_HI20 87 +#define R_LARCH_TLS_IE_PC_LO12 88 +#define R_LARCH_TLS_IE64_PC_LO20 89 +#define R_LARCH_TLS_IE64_PC_HI12 90 +#define R_LARCH_TLS_IE_HI20 91 +#define R_LARCH_TLS_IE_LO12 92 +#define R_LARCH_TLS_IE64_LO20 93 +#define R_LARCH_TLS_IE64_HI12 94 +#define R_LARCH_TLS_LD_PC_HI20 95 +#define R_LARCH_TLS_LD_HI20 96 +#define R_LARCH_TLS_GD_PC_HI20 97 +#define R_LARCH_TLS_GD_HI20 98 +#define R_LARCH_32_PCREL 99 +#define R_LARCH_RELAX 100 + +/* ARC specific declarations. */ + +/* Processor specific flags for the Ehdr e_flags field. */ +#define EF_ARC_MACH_MSK 0x000000ff +#define EF_ARC_OSABI_MSK 0x00000f00 +#define EF_ARC_ALL_MSK (EF_ARC_MACH_MSK | EF_ARC_OSABI_MSK) + +/* Processor specific values for the Shdr sh_type field. */ +#define SHT_ARC_ATTRIBUTES (SHT_LOPROC + 1) /* ARC attributes section. */ + +/* ARCompact/ARCv2 specific relocs. */ +#define R_ARC_NONE 0x0 +#define R_ARC_8 0x1 +#define R_ARC_16 0x2 +#define R_ARC_24 0x3 +#define R_ARC_32 0x4 + +#define R_ARC_B22_PCREL 0x6 +#define R_ARC_H30 0x7 +#define R_ARC_N8 0x8 +#define R_ARC_N16 0x9 +#define R_ARC_N24 0xA +#define R_ARC_N32 0xB +#define R_ARC_SDA 0xC +#define R_ARC_SECTOFF 0xD +#define R_ARC_S21H_PCREL 0xE +#define R_ARC_S21W_PCREL 0xF +#define R_ARC_S25H_PCREL 0x10 +#define R_ARC_S25W_PCREL 0x11 +#define R_ARC_SDA32 0x12 +#define R_ARC_SDA_LDST 0x13 +#define R_ARC_SDA_LDST1 0x14 +#define R_ARC_SDA_LDST2 0x15 +#define R_ARC_SDA16_LD 0x16 +#define R_ARC_SDA16_LD1 0x17 +#define R_ARC_SDA16_LD2 0x18 +#define R_ARC_S13_PCREL 0x19 +#define R_ARC_W 0x1A +#define R_ARC_32_ME 0x1B +#define R_ARC_N32_ME 0x1C +#define R_ARC_SECTOFF_ME 0x1D +#define R_ARC_SDA32_ME 0x1E +#define R_ARC_W_ME 0x1F +#define R_ARC_H30_ME 0x20 +#define R_ARC_SECTOFF_U8 0x21 +#define R_ARC_SECTOFF_S9 0x22 +#define R_AC_SECTOFF_U8 0x23 +#define R_AC_SECTOFF_U8_1 0x24 +#define R_AC_SECTOFF_U8_2 0x25 +#define R_AC_SECTOFF_S9 0x26 +#define R_AC_SECTOFF_S9_1 0x27 +#define R_AC_SECTOFF_S9_2 0x28 +#define R_ARC_SECTOFF_ME_1 0x29 +#define R_ARC_SECTOFF_ME_2 0x2A +#define R_ARC_SECTOFF_1 0x2B +#define R_ARC_SECTOFF_2 0x2C +#define R_ARC_SDA_12 0x2D +#define R_ARC_SDA16_ST2 0x30 +#define R_ARC_32_PCREL 0x31 +#define R_ARC_PC32 0x32 +#define R_ARC_GOTPC32 0x33 +#define R_ARC_PLT32 0x34 +#define R_ARC_COPY 0x35 +#define R_ARC_GLOB_DAT 0x36 +#define R_ARC_JMP_SLOT 0x37 +#define R_ARC_RELATIVE 0x38 +#define R_ARC_GOTOFF 0x39 +#define R_ARC_GOTPC 0x3A +#define R_ARC_GOT32 0x3B +#define R_ARC_S21W_PCREL_PLT 0x3C +#define R_ARC_S25H_PCREL_PLT 0x3D + +#define R_ARC_JLI_SECTOFF 0x3F + +#define R_ARC_TLS_DTPMOD 0x42 +#define R_ARC_TLS_DTPOFF 0x43 +#define R_ARC_TLS_TPOFF 0x44 +#define R_ARC_TLS_GD_GOT 0x45 +#define R_ARC_TLS_GD_LD 0x46 +#define R_ARC_TLS_GD_CALL 0x47 +#define R_ARC_TLS_IE_GOT 0x48 +#define R_ARC_TLS_DTPOFF_S9 0x49 +#define R_ARC_TLS_LE_S9 0x4A +#define R_ARC_TLS_LE_32 0x4B +#define R_ARC_S25W_PCREL_PLT 0x4C +#define R_ARC_S21H_PCREL_PLT 0x4D +#define R_ARC_NPS_CMEM16 0x4E + +/* OpenRISC 1000 specific relocs. */ +#define R_OR1K_NONE 0 +#define R_OR1K_32 1 +#define R_OR1K_16 2 +#define R_OR1K_8 3 +#define R_OR1K_LO_16_IN_INSN 4 +#define R_OR1K_HI_16_IN_INSN 5 +#define R_OR1K_INSN_REL_26 6 +#define R_OR1K_GNU_VTENTRY 7 +#define R_OR1K_GNU_VTINHERIT 8 +#define R_OR1K_32_PCREL 9 +#define R_OR1K_16_PCREL 10 +#define R_OR1K_8_PCREL 11 +#define R_OR1K_GOTPC_HI16 12 +#define R_OR1K_GOTPC_LO16 13 +#define R_OR1K_GOT16 14 +#define R_OR1K_PLT26 15 +#define R_OR1K_GOTOFF_HI16 16 +#define R_OR1K_GOTOFF_LO16 17 +#define R_OR1K_COPY 18 +#define R_OR1K_GLOB_DAT 19 +#define R_OR1K_JMP_SLOT 20 +#define R_OR1K_RELATIVE 21 +#define R_OR1K_TLS_GD_HI16 22 +#define R_OR1K_TLS_GD_LO16 23 +#define R_OR1K_TLS_LDM_HI16 24 +#define R_OR1K_TLS_LDM_LO16 25 +#define R_OR1K_TLS_LDO_HI16 26 +#define R_OR1K_TLS_LDO_LO16 27 +#define R_OR1K_TLS_IE_HI16 28 +#define R_OR1K_TLS_IE_LO16 29 +#define R_OR1K_TLS_LE_HI16 30 +#define R_OR1K_TLS_LE_LO16 31 +#define R_OR1K_TLS_TPOFF 32 +#define R_OR1K_TLS_DTPOFF 33 +#define R_OR1K_TLS_DTPMOD 34 + #endif /* elf.h */ diff --git a/tools/isl/Makefile b/tools/isl/Makefile index 32c3cda9a2..4ad23a6318 100644 --- a/tools/isl/Makefile +++ b/tools/isl/Makefile @@ -7,11 +7,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=isl -PKG_VERSION:=0.24 +PKG_VERSION:=0.26 PKG_SOURCE_URL:=https://libisl.sourceforge.io/ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_HASH:=043105cc544f416b48736fff8caf077fb0663a717d06b1113f16e391ac99ebad +PKG_HASH:=a0b5cb06d24f9fa9e77b55fabbe9a3c94a336190345c2555f9915bb38e976504 HOST_BUILD_PARALLEL:=1 @@ -24,4 +24,8 @@ HOST_CONFIGURE_ARGS += \ --disable-shared \ --with-gmp-prefix=$(STAGING_DIR_HOST) +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/libdeflate/Makefile b/tools/libdeflate/Makefile new file mode 100644 index 0000000000..e0f348196d --- /dev/null +++ b/tools/libdeflate/Makefile @@ -0,0 +1,38 @@ +# +# Copyright (C) 2022 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libdeflate +PKG_VERSION:=1.18 +PKG_RELEASE:=1 + +PKG_SOURCE_URL:=https://github.com/ebiggers/libdeflate.git +PKG_SOURCE_PROTO:=git +PKG_SOURCE_VERSION:=v$(PKG_VERSION) +PKG_MIRROR_HASH:=015cbd33b1382b812f7c035640709186bc5d3d6a0ab177bffa7948f26f64edf9 + +include $(INCLUDE_DIR)/host-build.mk + +define Host/Compile + $(HOSTCC_NOCACHE) $(HOST_CFLAGS) $(HOST_LDFLAGS) \ + $(HOST_BUILD_DIR)/lib/*{,/*}.c \ + $(HOST_BUILD_DIR)/programs/{gzip,prog_util,tgetopt}.c \ + -o $(HOST_BUILD_DIR)/libdeflate-gzip +endef + +define Host/Install + $(INSTALL_BIN) $(HOST_BUILD_DIR)/libdeflate-gzip $(STAGING_DIR_HOST)/bin/ + $(LN) libdeflate-gzip $(STAGING_DIR_HOST)/bin/libdeflate-gunzip +endef + +define Host/Uninstall + $(RM) $(STAGING_DIR_HOST)/bin/libdeflate-gzip + $(RM) $(STAGING_DIR_HOST)/bin/libdeflate-gunzip + $(call Host/Uninstall/Default) +endef + +$(eval $(call HostBuild)) diff --git a/tools/liblzo/Makefile b/tools/liblzo/Makefile new file mode 100644 index 0000000000..defe649cf8 --- /dev/null +++ b/tools/liblzo/Makefile @@ -0,0 +1,43 @@ +# +# Copyright (C) 2022 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=lzo +PKG_VERSION:=2.10 +PKG_RELEASE:=4 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=http://www.oberhumer.com/opensource/lzo/download/ +PKG_HASH:=c0f892943208266f9b6543b3ae308fab6284c5c90e627931446fb49b4221a072 + +PKG_LICENSE:=GPL-2.0-or-later +PKG_LICENSE_FILES:=COPYING +PKG_CPE_ID:=cpe:/a:lzo_project:lzo + +CMAKE_BINARY_SUBDIR:=librecmc-build + +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/cmake.mk + +CMAKE_HOST_OPTIONS += \ + -DENABLE_SHARED=ON \ + -DENABLE_TESTS=OFF \ + -DENABLE_EXAMPLES=OFF \ + -DENABLE_DOCS=ON \ + -DBUILD_TESTING=OFF + +define Host/Uninstall + rm -rf $(HOST_BUILD_PREFIX)/include/lzo + rm -f $(HOST_BUILD_PREFIX)/lib/liblzo2.a + rm -f $(HOST_BUILD_PREFIX)/lib/liblzo2.so.2.0.0 + rm -f $(HOST_BUILD_PREFIX)/lib/liblzo2.so.2 + rm -f $(HOST_BUILD_PREFIX)/lib/liblzo2.so + rm -f $(HOST_BUILD_PREFIX)/lib/pkgconfig/lzo2.pc +endef + +$(eval $(call HostBuild)) diff --git a/tools/liblzo/patches/001-add-cmake-ENABLE-configurables.patch b/tools/liblzo/patches/001-add-cmake-ENABLE-configurables.patch new file mode 100644 index 0000000000..9ab27fc924 --- /dev/null +++ b/tools/liblzo/patches/001-add-cmake-ENABLE-configurables.patch @@ -0,0 +1,68 @@ +--- a/CMakeLists.txt 2022-11-28 06:34:39.171209779 -0800 ++++ b/CMakeLists.txt 2022-11-28 06:33:13.368239757 -0800 +@@ -51,8 +51,11 @@ + project(lzo VERSION 2.10 LANGUAGES C) + + # configuration options +-option(ENABLE_STATIC "Build static LZO library." ON) +-option(ENABLE_SHARED "Build shared LZO library." OFF) ++option(ENABLE_STATIC "Build static LZO library." ON) ++option(ENABLE_SHARED "Build shared LZO library." OFF) ++option(ENABLE_TESTS "Build tests." ON) ++option(ENABLE_EXAMPLES "Build examples." ON) ++option(ENABLE_DOCS "Install documentation." ON) + if(NOT ENABLE_STATIC AND NOT ENABLE_SHARED) + set(ENABLE_STATIC ON) + endif() +@@ -127,14 +130,20 @@ + endif() + endmacro() + # main test driver ++if(ENABLE_TESTS OR ENABLE_EXAMPLES) + lzo_add_executable(lzotest lzotest/lzotest.c) ++endif() + # examples ++if(ENABLE_EXAMPLES) + lzo_add_executable(dict examples/dict.c) + lzo_add_executable(lzopack examples/lzopack.c) + lzo_add_executable(overlap examples/overlap.c) + lzo_add_executable(precomp examples/precomp.c) + lzo_add_executable(precomp2 examples/precomp2.c) ++endif() ++if(ENABLE_TESTS OR ENABLE_EXAMPLES) + lzo_add_executable(simple examples/simple.c) ++endif() + # some boring internal test programs + if(0) + lzo_add_executable(align tests/align.c) +@@ -144,7 +153,7 @@ + endif() + + # miniLZO +-if(1) ++if(ENABLE_TESTS) + add_executable(testmini minilzo/testmini.c minilzo/minilzo.c) + target_include_directories(testmini PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include/lzo") # needed for "lzoconf.h" + endif() +@@ -263,8 +272,10 @@ + + if(DEFINED CMAKE_INSTALL_FULL_LIBDIR) + +-set(f AUTHORS COPYING NEWS THANKS doc/LZO.FAQ doc/LZO.TXT doc/LZOAPI.TXT) +-install(FILES ${f} DESTINATION "${CMAKE_INSTALL_FULL_DOCDIR}") ++if(ENABLE_DOCS) ++ set(f AUTHORS COPYING NEWS THANKS doc/LZO.FAQ doc/LZO.TXT doc/LZOAPI.TXT) ++ install(FILES ${f} DESTINATION "${CMAKE_INSTALL_FULL_DOCDIR}") ++endif() + + set(f include/lzo/lzo1.h include/lzo/lzo1a.h include/lzo/lzo1b.h + include/lzo/lzo1c.h include/lzo/lzo1f.h include/lzo/lzo1x.h +@@ -285,7 +296,7 @@ + ) + endif() + +-if(1) ++if(ENABLE_EXAMPLES) + set(f lzopack lzotest simple testmini) # examples + install(TARGETS ${f} DESTINATION "${CMAKE_INSTALL_FULL_LIBEXECDIR}/lzo/examples") + endif() diff --git a/tools/libressl/Makefile b/tools/libressl/Makefile index 0679961d17..9a0fb6bee4 100644 --- a/tools/libressl/Makefile +++ b/tools/libressl/Makefile @@ -8,14 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libressl -PKG_VERSION:=3.4.3 -PKG_HASH:=ff88bffe354818b3ccf545e3cafe454c5031c7a77217074f533271d63c37f08d -PKG_RELEASE:=1 +PKG_VERSION:=3.7.2 +PKG_HASH:=b06aa538fefc9c6b33c4db4931a09a5f52d9d2357219afcbff7d93fe12ebf6f7 PKG_CPE_ID:=cpe:/a:openbsd:libressl PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=http://mirror.ox.ac.uk/pub/OpenBSD/LibreSSL \ +PKG_SOURCE_URL:=https://mirror.ox.ac.uk/pub/OpenBSD/LibreSSL \ http://ftp.jaist.ac.jp/pub/OpenBSD/LibreSSL \ https://ftp.openbsd.org/pub/OpenBSD/LibreSSL @@ -24,11 +23,18 @@ HOST_BUILD_PARALLEL:=1 include $(INCLUDE_DIR)/host-build.mk HOSTCC := $(HOSTCC_NOCACHE) -HOST_CONFIGURE_ARGS += --enable-static --disable-shared --disable-tests + HOST_CFLAGS += $(HOST_FPIC) -ifeq ($(GNU_HOST_NAME),x86_64-linux-gnux32) -HOST_CONFIGURE_ARGS += --disable-asm -endif +HOST_CONFIGURE_ARGS += \ + --enable-static \ + --disable-shared \ + --disable-asm \ + --with-pic \ + --disable-tests + +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef $(eval $(call HostBuild)) diff --git a/tools/libtool/Makefile b/tools/libtool/Makefile index 2bc9db7d0d..1187191478 100644 --- a/tools/libtool/Makefile +++ b/tools/libtool/Makefile @@ -8,35 +8,52 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libtool PKG_CPE_ID:=cpe:/a:gnu:libtool -PKG_VERSION:=2.4.2 +PKG_VERSION:=2.4.7 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/$(PKG_NAME) -PKG_HASH:=1d7b6862c1ed162e327f083a6f78f40eae29218f0db8c38393d61dab764c4407 +PKG_HASH:=4f7f217f057ce655ff22559ad221a0fd8ef84ad1fc5fcb6990cecc333aa1635d HOST_BUILD_PARALLEL:=1 include $(INCLUDE_DIR)/host-build.mk +export GNULIB_SRCDIR:=$(HOST_GNULIB_SRCDIR) + HOST_CONFIGURE_VARS += \ lt_cv_sys_dlsearch_path="" +define Host/Bootstrap + ( \ + cd $(HOST_BUILD_DIR); \ + $(AM_TOOL_PATHS) \ + ./bootstrap \ + --force \ + --skip-git \ + --skip-po \ + --gnulib-srcdir=$(GNULIB_SRCDIR) \ + ) +endef + define Host/Prepare $(call Host/Prepare/Default) - (cd $(STAGING_DIR_HOST)/share/aclocal/ && rm -f libtool.m4 ltdl.m4 lt~obsolete.m4 ltoptions.m4 ltsugar.m4 ltversion.m4) - (cd $(HOST_BUILD_DIR); $(AM_TOOL_PATHS) ./bootstrap) + $(call Host/Uninstall) + $(if $(QUILT),,$(call Host/Bootstrap)) +endef + +define Host/Configure + $(if $(QUILT),$(call Host/Bootstrap)) + $(call Host/Configure/Default) endef define Host/Install - $(MAKE) -C $(HOST_BUILD_DIR) install + $(call Host/Compile/Default,install) $(SED) 's,\(hardcode_into_libs\)=yes,\1=no,g' $(STAGING_DIR_HOST)/bin/libtool - $(CP) $(STAGING_DIR_HOST)/bin/libtool $(STAGING_DIR_HOST)/bin/libtool-ucxx - $(SED) 's,-lstdc++,-luClibc++,g' $(STAGING_DIR_HOST)/bin/libtool-ucxx endef -define Host/Clean - -$(MAKE) -C $(HOST_BUILD_DIR) uninstall - $(call Host/Clean/Default) +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) + (cd $(STAGING_DIR_HOST)/share/aclocal/ && rm -f libtool.m4 ltdl.m4 lt~obsolete.m4 ltoptions.m4 ltsugar.m4 ltversion.m4) endef $(eval $(call HostBuild)) diff --git a/tools/libtool/patches/000-relocatable.patch b/tools/libtool/patches/000-relocatable.patch index 6d1651be31..41b4b8e591 100644 --- a/tools/libtool/patches/000-relocatable.patch +++ b/tools/libtool/patches/000-relocatable.patch @@ -1,141 +1,104 @@ ---- a/libltdl/config/general.m4sh -+++ b/libltdl/config/general.m4sh -@@ -45,15 +45,22 @@ progpath="$0" - M4SH_VERBATIM([[ - : ${CP="cp -f"} - test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} --: ${EGREP="@EGREP@"} --: ${FGREP="@FGREP@"} --: ${GREP="@GREP@"} - : ${LN_S="@LN_S@"} - : ${MAKE="make"} - : ${MKDIR="mkdir"} - : ${MV="mv -f"} - : ${RM="rm -f"} --: ${SED="@SED@"} -+if test -n "$STAGING_DIR"; then -+ : ${EGREP="$STAGING_DIR/../host/bin/grep -E"} -+ : ${FGREP="$STAGING_DIR/../host/bin/grep -F"} -+ : ${GREP="$STAGING_DIR/../host/bin/grep"} -+ : ${SED="$STAGING_DIR/../host/bin/sed"} -+else -+ : ${EGREP="@EGREP@"} -+ : ${FGREP="@FGREP@"} -+ : ${GREP="@GREP@"} -+ : ${SED="@SED@"} -+fi - : ${SHELL="${CONFIG_SHELL-/bin/sh}"} - : ${Xsed="$SED -e 1s/^X//"} - +From ca10caa502f971f90d8c041aa2476de54ef0ce2b Mon Sep 17 00:00:00 2001 +From: Eneas U de Queiroz +Date: Tue, 20 Jul 2021 16:41:11 -0300 +Subject: librecmc: make relocatable, search resources relative to STAGING_DIR + +This was originally commited to librecmc by Jo-Philipp Wich +. + +Signed-off-by: Eneas U de Queiroz + --- a/libtoolize.in +++ b/libtoolize.in -@@ -334,15 +334,22 @@ as_unset=as_fn_unset +@@ -38,14 +38,23 @@ + # with bootstrap, so set those here where they can still be over- + # ridden by the user, but otherwise take precedence. - : ${CP="cp -f"} - test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +-: ${AUTOCONF="autoconf"} +-: ${AUTOMAKE="automake"} -: ${EGREP="@EGREP@"} -: ${FGREP="@FGREP@"} -: ${GREP="@GREP@"} : ${LN_S="@LN_S@"} - : ${MAKE="make"} - : ${MKDIR="mkdir"} - : ${MV="mv -f"} - : ${RM="rm -f"} -: ${SED="@SED@"} -+if test -n "$STAGING_DIR"; then -+ : ${EGREP="$STAGING_DIR/../host/bin/grep -E"} -+ : ${FGREP="$STAGING_DIR/../host/bin/grep -F"} -+ : ${GREP="$STAGING_DIR/../host/bin/grep"} -+ : ${SED="$STAGING_DIR/../host/bin/sed"} + ++if test -n "$STAGING_DIR_HOST"; then ++ : ${AUTOCONF="$STAGING_DIR_HOST/bin/autoconf"} ++ : ${AUTOMAKE="$STAGING_DIR_HOST/bin/automake"} ++ : ${EGREP="$STAGING_DIR_HOST/bin/grep -E"} ++ : ${FGREP="$STAGING_DIR_HOST/bin/grep -F"} ++ : ${GREP="$STAGING_DIR_HOST/bin/grep"} ++ : ${SED="$STAGING_DIR_HOST/bin/sed"} +else ++ : ${AUTOCONF="autoconf"} ++ : ${AUTOMAKE="automake"} + : ${EGREP="@EGREP@"} + : ${FGREP="@FGREP@"} + : ${GREP="@GREP@"} + : ${SED="@SED@"} +fi - : ${SHELL="${CONFIG_SHELL-/bin/sh}"} - : ${Xsed="$SED -e 1s/^X//"} -@@ -2487,10 +2494,17 @@ func_check_macros () + ## -------------------------- ## + ## Source external libraries. ## +@@ -1903,11 +1912,21 @@ func_require_seen_libtool () + pkgmacro_files="@pkgmacro_files@" # Locations for important files: - prefix=@prefix@ -- datadir=@datadir@ -- pkgdatadir=@pkgdatadir@ -- pkgltdldir=@pkgdatadir@ -- aclocaldir=@aclocaldir@ -+ if test -n "$STAGING_DIR"; then -+ datadir="$STAGING_DIR/../host/share" -+ pkgdatadir="$STAGING_DIR/../host/share/libtool" -+ pkgltdldir="$STAGING_DIR/../host/share/libtool" -+ aclocaldir="$STAGING_DIR/../host/share/aclocal" +- prefix="@prefix@" +- datadir="@datadir@" +- pkgauxdir="@pkgauxdir@" +- pkgltdldir="@pkgdatadir@" +- aclocaldir="@aclocaldir@" ++ if test -n "$STAGING_DIR_HOST"; then ++ prefix="$STAGING_DIR_HOST" ++ datadir="$STAGING_DIR_HOST/share" ++ pkgauxdir="$STAGING_DIR_HOST/share/libtool/build-aux" ++ pkgdatadir="$STAGING_DIR_HOST/share/libtool" ++ pkgltdldir="$STAGING_DIR_HOST/share/libtool" ++ aclocaldir="$STAGING_DIR_HOST/share/aclocal" + else -+ datadir=@datadir@ -+ pkgdatadir=@pkgdatadir@ -+ pkgltdldir=@pkgdatadir@ -+ aclocaldir=@aclocaldir@ ++ prefix="@prefix@" ++ datadir="@datadir@" ++ pkgauxdir="@pkgauxdir@" ++ pkgdatadir="@pkgdatadir@" ++ pkgltdldir="@pkgdatadir@" ++ aclocaldir="@aclocaldir@" + fi - auxdir= - macrodir= - configure_ac=configure.in ---- a/libtoolize.m4sh -+++ b/libtoolize.m4sh -@@ -1453,10 +1453,17 @@ func_check_macros () - # Locations for important files: - prefix=@prefix@ -- datadir=@datadir@ -- pkgdatadir=@pkgdatadir@ -- pkgltdldir=@pkgdatadir@ -- aclocaldir=@aclocaldir@ -+ if test -n "$STAGING_DIR"; then -+ datadir="$STAGING_DIR/../host/share" -+ pkgdatadir="$STAGING_DIR/../host/share/libtool" -+ pkgltdldir="$STAGING_DIR/../host/share/libtool" -+ aclocaldir="$STAGING_DIR/../host/share/aclocal" -+ else -+ datadir=@datadir@ -+ pkgdatadir=@pkgdatadir@ -+ pkgltdldir=@pkgdatadir@ -+ aclocaldir=@aclocaldir@ -+ fi - auxdir= - macrodir= - configure_ac=configure.in ---- a/libltdl/m4/libtool.m4 -+++ b/libltdl/m4/libtool.m4 -@@ -907,9 +907,8 @@ dnl AC_DEFUN([AC_LIBTOOL_RC], []) - # ---------------- - m4_defun([_LT_TAG_COMPILER], + # Allow the user to override the master libtoolize repository: + if test -n "$_lt_pkgdatadir"; then +--- a/m4/libtool.m4 ++++ b/m4/libtool.m4 +@@ -933,7 +933,7 @@ m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl -- + _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl -_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl -+_LT_DECL([LTCFLAGS], [CFLAGS], ["-O2 -I\${STAGING_DIR:-$STAGING_DIR}/../host/include"], [LTCC compiler flags])dnl ++_LT_DECL([LTCFLAGS], [CFLAGS], ["-O2 -I\${STAGING_DIR_HOST:-$STAGING_DIR_HOST}/include"], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl -@@ -7660,9 +7659,9 @@ m4_defun([_LT_DECL_EGREP], +@@ -8183,9 +8183,9 @@ m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep -_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) -_LT_DECL([], [EGREP], [1], [An ERE matcher]) -_LT_DECL([], [FGREP], [1], [A literal string matcher]) -+_LT_DECL([], [GREP], ["\${STAGING_DIR:-$STAGING_DIR}/../host/bin/grep"], [A grep program that handles long lines]) -+_LT_DECL([], [EGREP], ["\${STAGING_DIR:-$STAGING_DIR}/../host/bin/grep -E"], [An ERE matcher]) -+_LT_DECL([], [FGREP], ["\${STAGING_DIR:-$STAGING_DIR}/../host/bin/grep -F"], [A literal string matcher]) ++_LT_DECL([], [GREP], ["\${STAGING_DIR_HOST:-$STAGING_DIR_HOST}/bin/grep"], [A grep program that handles long lines]) ++_LT_DECL([], [EGREP], ["\${STAGING_DIR_HOST:-$STAGING_DIR_HOST}/bin/grep -E"], [An ERE matcher]) ++_LT_DECL([], [FGREP], ["\${STAGING_DIR_HOST:-$STAGING_DIR_HOST}/bin/grep -F"], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) -@@ -7695,9 +7694,8 @@ AC_SUBST([DLLTOOL]) +@@ -8226,9 +8226,8 @@ _LT_DECL([], [FILECMD], [1], [A file(cmd # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED -test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" -_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) -+_LT_DECL([], [SED], ["\${STAGING_DIR:-$STAGING_DIR}/../host/bin/sed"], [A sed program that does not truncate output]) ++_LT_DECL([], [SED], ["\${STAGING_DIR_HOST:-$STAGING_DIR_HOST}/bin/sed"], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED diff --git a/tools/libtool/patches/100-libdir-fixes.patch b/tools/libtool/patches/100-libdir-fixes.patch index 3df2b14b60..77221d1019 100644 --- a/tools/libtool/patches/100-libdir-fixes.patch +++ b/tools/libtool/patches/100-libdir-fixes.patch @@ -1,83 +1,55 @@ ---- a/libltdl/config/ltmain.m4sh -+++ b/libltdl/config/ltmain.m4sh -@@ -5731,8 +5731,14 @@ func_mode_link () - absdir="$abs_ladir" - libdir="$abs_ladir" +From 67ffe8e8582a7ba1f1d1307a419098e6dd88bdaf Mon Sep 17 00:00:00 2001 +From: Eneas U de Queiroz +Date: Tue, 20 Jul 2021 16:41:11 -0300 +Subject: librecmc: cross-compilation path adjustments + +Comments from the patch: + +Adding 'libdir' from the .la file to our library search paths +breaks crosscompilation horribly. We cheat here and don't add +it, instead adding the path where we found the .la. -CL + +OE sets installed=no in staging. We need to look in $objdir and $absdir, +preferring $objdir. RP 31/04/2008 + +This was originally commited to librecmc by Jo-Philipp Wich +. + +Signed-off-by: Eneas U de Queiroz + +--- a/build-aux/ltmain.in ++++ b/build-aux/ltmain.in +@@ -6097,8 +6097,14 @@ func_mode_link () + absdir=$abs_ladir + libdir=$abs_ladir else -- dir="$lt_sysroot$libdir" -- absdir="$lt_sysroot$libdir" +- dir=$lt_sysroot$libdir +- absdir=$lt_sysroot$libdir + # Adding 'libdir' from the .la file to our library search paths + # breaks crosscompilation horribly. We cheat here and don't add + # it, instead adding the path where we found the .la. -CL + dir="$lt_sysroot$abs_ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" -+ #dir="$libdir" -+ #absdir="$lt_sysroot$libdir" ++ #dir=$lt_sysroot$libdir ++ #absdir=$lt_sysroot$libdir fi - test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + test yes = "$hardcode_automatic" && avoidtemprpath=yes else -@@ -6130,8 +6136,6 @@ func_mode_link () - add="$libdir/$linklib" +@@ -6496,8 +6502,6 @@ func_mode_link () + add=$libdir/$linklib fi else - # We cannot seem to hardcode it, guess we'll fake it. -- add_dir="-L$libdir" +- add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in -@@ -6286,7 +6290,17 @@ func_mode_link () +@@ -6652,7 +6656,17 @@ func_mode_link () fi ;; *) -- path="-L$absdir/$objdir" -+ # OE sets installed=no in staging. We need to look in $objdir and $absdir, -+ # preferring $objdir. RP 31/04/2008 -+ if test -f "$absdir/$objdir/$depdepl" ; then -+ depdepl="$absdir/$objdir/$depdepl" -+ path="-L$absdir/$objdir" -+ elif test -f "$absdir/$depdepl" ; then -+ depdepl="$absdir/$depdepl" -+ path="-L$absdir" -+ else -+ path="-L$absdir/$objdir" -+ fi - ;; - esac - else ---- a/libltdl/config/ltmain.sh -+++ b/libltdl/config/ltmain.sh -@@ -6518,8 +6518,14 @@ func_mode_link () - absdir="$abs_ladir" - libdir="$abs_ladir" - else -- dir="$lt_sysroot$libdir" -- absdir="$lt_sysroot$libdir" -+ # Adding 'libdir' from the .la file to our library search paths -+ # breaks crosscompilation horribly. We cheat here and don't add -+ # it, instead adding the path where we found the .la. -CL -+ dir="$lt_sysroot$abs_ladir" -+ absdir="$abs_ladir" -+ libdir="$abs_ladir" -+ #dir="$libdir" -+ #absdir="$lt_sysroot$libdir" - fi - test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes - else -@@ -6917,8 +6923,6 @@ func_mode_link () - add="$libdir/$linklib" - fi - else -- # We cannot seem to hardcode it, guess we'll fake it. -- add_dir="-L$libdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in -@@ -7073,7 +7077,17 @@ func_mode_link () - fi - ;; - *) -- path="-L$absdir/$objdir" +- path=-L$absdir/$objdir + # OE sets installed=no in staging. We need to look in $objdir and $absdir, + # preferring $objdir. RP 31/04/2008 + if test -f "$absdir/$objdir/$depdepl" ; then diff --git a/tools/libtool/patches/110-dont-use-target-dir-for-relinking.patch b/tools/libtool/patches/110-dont-use-target-dir-for-relinking.patch index bbfd125003..a95d1d332a 100644 --- a/tools/libtool/patches/110-dont-use-target-dir-for-relinking.patch +++ b/tools/libtool/patches/110-dont-use-target-dir-for-relinking.patch @@ -1,20 +1,32 @@ ---- a/libltdl/config/ltmain.m4sh -+++ b/libltdl/config/ltmain.m4sh -@@ -6120,7 +6120,6 @@ func_mode_link () - test "$hardcode_direct_absolute" = no; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then -- add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in ---- a/libltdl/config/ltmain.sh -+++ b/libltdl/config/ltmain.sh -@@ -6907,7 +6907,6 @@ func_mode_link () - test "$hardcode_direct_absolute" = no; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then -- add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then +From 375833af93999f8b0a747c8a1dfa3ec8d347743d Mon Sep 17 00:00:00 2001 +From: Eneas U de Queiroz +Date: Tue, 20 Jul 2021 16:52:37 -0300 +Subject: librecmc: don't use target dir for relinking + +This was originally commited to librecmc by Jo-Philipp Wich +. + +Signed-off-by: Eneas U de Queiroz + +--- a/build-aux/ltmain.in ++++ b/build-aux/ltmain.in +@@ -6482,13 +6482,13 @@ func_mode_link () + add_dir= + add= + # Finalize command for both is simple: just hardcode it. +- if test yes = "$hardcode_direct" && +- test no = "$hardcode_direct_absolute"; then +- add=$libdir/$linklib +- elif test yes = "$hardcode_minus_L"; then ++ if test "$hardcode_direct" = yes && ++ test "$hardcode_direct_absolute" = no; then ++ add="$libdir/$linklib" ++ elif test "$hardcode_minus_L" = yes; then + add_dir=-L$libdir +- add=-l$name +- elif test yes = "$hardcode_shlibpath_var"; then ++ add="-l$name" ++ elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; diff --git a/tools/libtool/patches/120-strip-unsafe-dirs-for-relinking.patch b/tools/libtool/patches/120-strip-unsafe-dirs-for-relinking.patch index 8840ee0569..f864b1be9b 100644 --- a/tools/libtool/patches/120-strip-unsafe-dirs-for-relinking.patch +++ b/tools/libtool/patches/120-strip-unsafe-dirs-for-relinking.patch @@ -1,24 +1,25 @@ ---- a/libltdl/config/ltmain.m4sh -+++ b/libltdl/config/ltmain.m4sh -@@ -2183,6 +2183,9 @@ func_mode_install () +From 7f2b8a1ab4fa1475eeeddfb84eb5b92594bfce43 Mon Sep 17 00:00:00 2001 +From: Eneas U de Queiroz +Date: Tue, 20 Jul 2021 16:54:12 -0300 +Subject: librecmc: strip unsave directories from relink command + +strip unsave directories from relink command, nuke every -L that looks +like /usr/lib or /lib + +This was originally commited to librecmc by Jo-Philipp Wich +. + +Signed-off-by: Eneas U de Queiroz + +--- a/build-aux/ltmain.in ++++ b/build-aux/ltmain.in +@@ -2400,6 +2400,9 @@ func_mode_install () relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi + relink_command=`$ECHO "$relink_command" | $SED "s%-L[[:space:]]*/lib[^[:space:]]*%%"` + relink_command=`$ECHO "$relink_command" | $SED "s%-L[[:space:]]*/usr/lib[^[:space:]]*%%"` + - func_warning "relinking \`$file'" + func_warning "relinking '$file'" func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' ---- a/libltdl/config/ltmain.sh -+++ b/libltdl/config/ltmain.sh -@@ -2973,6 +2973,9 @@ func_mode_install () - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` - fi - -+ relink_command=`$ECHO "$relink_command" | $SED "s%-L[[:space:]]*/lib[^[:space:]]*%%"` -+ relink_command=`$ECHO "$relink_command" | $SED "s%-L[[:space:]]*/usr/lib[^[:space:]]*%%"` -+ - func_warning "relinking \`$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' diff --git a/tools/libtool/patches/130-trailingslash.patch b/tools/libtool/patches/130-trailingslash.patch new file mode 100644 index 0000000000..2cc9ed3e29 --- /dev/null +++ b/tools/libtool/patches/130-trailingslash.patch @@ -0,0 +1,37 @@ +From 1b45c3c0d6682be7f4876b620780ee246a5acbaa Mon Sep 17 00:00:00 2001 +From: Eneas U de Queiroz +Date: Tue, 20 Jul 2021 16:56:16 -0300 +Subject: librecmc: remove trailing slash in install destdir + +A command like /bin/sh ../../i586-poky-linux-libtool --mode=install /usr/bin/install -c gck-roots-store-standalone.la '/media/data1/builds/poky1/tmp/work/core2-poky-linux/gnome-keyring-2.26.1-r1/image/usr/lib/gnome-keyring/standalone/' fails (e.g. gnome-keyring or pulseaudio) + +This is because libdir has a trailing slash which breaks the comparision. + +RP 2/1/10 + +Merged a patch received from Gary Thomas + +Date: 2010/07/12 +Nitin A Kamble + +Signed-off-by: Eneas U de Queiroz + +--- a/build-aux/ltmain.in ++++ b/build-aux/ltmain.in +@@ -2381,8 +2381,15 @@ func_mode_install () + func_append dir "$objdir" + + if test -n "$relink_command"; then ++ # Strip any trailing slash from the destination. ++ func_stripname '' '/' "$libdir" ++ destlibdir=$func_stripname_result ++ ++ func_stripname '' '/' "$destdir" ++ s_destdir=$func_stripname_result ++ + # Determine the prefix the user has applied to our future dir. +- inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` ++ inst_prefix_dir=`$ECHO "X$s_destdir" | $Xsed -e "s%$destlibdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that diff --git a/tools/libtool/patches/140-don-t-quote-SHELL-in-Makefile.am.patch b/tools/libtool/patches/140-don-t-quote-SHELL-in-Makefile.am.patch new file mode 100644 index 0000000000..2d1168ec31 --- /dev/null +++ b/tools/libtool/patches/140-don-t-quote-SHELL-in-Makefile.am.patch @@ -0,0 +1,72 @@ +From 879578d3f4dc9bc42aa433b1fb6b584564f83617 Mon Sep 17 00:00:00 2001 +From: Eneas U de Queiroz +Date: Wed, 21 Jul 2021 13:38:24 -0300 +Subject: librecmc: don't quote $(SHELL) in Makefile.am + +This allows to use SHELL="env bash" to get a controlled enviroment. + +Signed-off-by: Eneas U de Queiroz + +--- a/Makefile.am ++++ b/Makefile.am +@@ -46,7 +46,7 @@ EXTRA_LTLIBRARIES = + # Using 'cd' in backquotes may print the directory name, use this instead: + lt__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + +-git_version_gen = '$(SHELL)' '$(aux_dir)/git-version-gen' '--fallback' '$(VERSION)' '.tarball-version' ++git_version_gen = $(SHELL) '$(aux_dir)/git-version-gen' '--fallback' '$(VERSION)' '.tarball-version' + rebuild = rebuild=:; revision=`$(lt__cd) $(srcdir) && $(git_version_gen) | $(SED) 's|-.*$$||'` + + +@@ -306,7 +306,7 @@ libtool: $(ltmain_sh) $(config_status) $ + if test 0 = '$(AM_DEFAULT_VERBOSITY)' && test 1 != '$(V)'; \ + then echo " GEN " $@; \ + else echo '$(SHELL) $(top_builddir)/config.status "$@"'; fi; \ +- cd '$(top_builddir)' && '$(SHELL)' ./config.status '$@'; \ ++ cd '$(top_builddir)' && $(SHELL) ./config.status '$@'; \ + fi + + +@@ -789,13 +789,13 @@ testsuite_deps_uninstalled = $(testsuite + # Hook the test suite into the check rule + check-local: $(testsuite_deps_uninstalled) + $(AM_V_at)$(CD_TESTDIR); \ +- CONFIG_SHELL='$(SHELL)' '$(SHELL)' "$$abs_srcdir/$(TESTSUITE)" \ ++ CONFIG_SHELL=$(SHELL) $(SHELL) "$$abs_srcdir/$(TESTSUITE)" \ + $(TESTS_ENVIRONMENT) $(BUILDCHECK_ENVIRONMENT) $(TESTSUITEFLAGS) + + # Run the test suite on the *installed* tree. + installcheck-local: $(testsuite_deps) + $(AM_V_at)$(CD_TESTDIR); \ +- CONFIG_SHELL='$(SHELL)' '$(SHELL)' "$$abs_srcdir/$(TESTSUITE)" \ ++ CONFIG_SHELL=$(SHELL) $(SHELL) "$$abs_srcdir/$(TESTSUITE)" \ + $(TESTS_ENVIRONMENT) $(INSTALLCHECK_ENVIRONMENT) $(TESTSUITEFLAGS) \ + AUTOTEST_PATH='$(exec_prefix)/bin' + +@@ -807,7 +807,7 @@ check-noninteractive-old: + .PHONY: check-noninteractive-new + check-noninteractive-new: $(testsuite_deps_uninstalled) + $(AM_V_at)$(CD_TESTDIR); \ +- CONFIG_SHELL='$(SHELL)' '$(SHELL)' "$$abs_srcdir/$(TESTSUITE)" \ ++ CONFIG_SHELL=$(SHELL) $(SHELL) "$$abs_srcdir/$(TESTSUITE)" \ + $(TESTS_ENVIRONMENT) $(BUILDCHECK_ENVIRONMENT) \ + -k '!interactive' INNER_TESTSUITEFLAGS=',!interactive' \ + $(TESTSUITEFLAGS) +@@ -816,7 +816,7 @@ check-noninteractive-new: $(testsuite_de + .PHONY: check-interactive + check-interactive: $(testsuite_deps_uninstalled) + $(AM_V_at)$(CD_TESTDIR); \ +- CONFIG_SHELL='$(SHELL)' '$(SHELL)' "$$abs_srcdir/$(TESTSUITE)" \ ++ CONFIG_SHELL=$(SHELL) $(SHELL) "$$abs_srcdir/$(TESTSUITE)" \ + $(TESTS_ENVIRONMENT) $(BUILDCHECK_ENVIRONMENT) \ + -k interactive -k recursive INNER_TESTSUITEFLAGS=',interactive' \ + $(TESTSUITEFLAGS) +@@ -828,7 +828,7 @@ check-noninteractive: check-noninteracti + clean-local: + -$(CD_TESTDIR); \ + test -f "$$abs_srcdir/$(TESTSUITE)" && \ +- '$(SHELL)' "$$abs_srcdir/$(TESTSUITE)" --clean ++ $(SHELL) "$$abs_srcdir/$(TESTSUITE)" --clean + + ## An empty target to depend on when a rule needs to always run + ## whenever it is visited. diff --git a/tools/libtool/patches/150-trailingslash.patch b/tools/libtool/patches/150-trailingslash.patch deleted file mode 100644 index 423911cf4b..0000000000 --- a/tools/libtool/patches/150-trailingslash.patch +++ /dev/null @@ -1,49 +0,0 @@ -A command like /bin/sh ../../i586-poky-linux-libtool --mode=install /usr/bin/install -c gck-roots-store-standalone.la '/media/data1/builds/poky1/tmp/work/core2-poky-linux/gnome-keyring-2.26.1-r1/image/usr/lib/gnome-keyring/standalone/' fails (e.g. gnome-keyring or pulseaudio) - -This is because libdir has a trailing slash which breaks the comparision. - -RP 2/1/10 - -Merged a patch received from Gary Thomas - -Date: 2010/07/12 -Nitin A Kamble - ---- a/libltdl/config/ltmain.m4sh -+++ b/libltdl/config/ltmain.m4sh -@@ -2167,8 +2167,15 @@ func_mode_install () - func_append dir "$objdir" - - if test -n "$relink_command"; then -+ # Strip any trailing slash from the destination. -+ func_stripname '' '/' "$libdir" -+ destlibdir=$func_stripname_result -+ -+ func_stripname '' '/' "$destdir" -+ s_destdir=$func_stripname_result -+ - # Determine the prefix the user has applied to our future dir. -- inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` -+ inst_prefix_dir=`$ECHO "X$s_destdir" | $Xsed -e "s%$destlibdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that ---- a/libltdl/config/ltmain.sh -+++ b/libltdl/config/ltmain.sh -@@ -2954,8 +2954,15 @@ func_mode_install () - func_append dir "$objdir" - - if test -n "$relink_command"; then -+ # Strip any trailing slash from the destination. -+ func_stripname '' '/' "$libdir" -+ destlibdir=$func_stripname_result -+ -+ func_stripname '' '/' "$destdir" -+ s_destdir=$func_stripname_result -+ - # Determine the prefix the user has applied to our future dir. -- inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` -+ inst_prefix_dir=`$ECHO "X$s_destdir" | $Xsed -e "s%$destlibdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that diff --git a/tools/libtool/patches/160-passthrough-ssp.patch b/tools/libtool/patches/160-passthrough-ssp.patch deleted file mode 100644 index da44c614e3..0000000000 --- a/tools/libtool/patches/160-passthrough-ssp.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -ur libtool-2.4.orig/libltdl/config/ltmain.m4sh libtool-2.4/libltdl/config/ltmain.m4sh ---- libtool-2.4.orig/libltdl/config/ltmain.m4sh 2015-06-18 10:46:15.499996979 +0200 -+++ libtool-2.4/libltdl/config/ltmain.m4sh 2015-06-18 10:48:24.686882213 +0200 -@@ -5076,7 +5076,7 @@ - # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -- -O*|-flto*|-fwhopr*|-fuse-linker-plugin) -+ -O*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - func_append compile_command " $arg" diff --git a/tools/libtool/patches/200-openwrt-branding.patch b/tools/libtool/patches/200-openwrt-branding.patch index 3fd8eb47a9..508991397c 100644 --- a/tools/libtool/patches/200-openwrt-branding.patch +++ b/tools/libtool/patches/200-openwrt-branding.patch @@ -1,112 +1,34 @@ ---- a/libltdl/config/general.m4sh -+++ b/libltdl/config/general.m4sh -@@ -359,7 +359,7 @@ opt_warning=: - # name if it has been set yet. - func_echo () - { -- $ECHO "$progname: ${opt_mode+$opt_mode: }$*" -+ $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }$*" +From 90707200efadc8e230635c7c204c9c272cbc8631 Mon Sep 17 00:00:00 2001 +From: Eneas U de Queiroz +Date: Tue, 20 Jul 2021 17:01:03 -0300 +Subject: librecmc: add librecmc branding + +This prepends program name with "libreCMC-". + +This was originally commited to librecmc by Jo-Philipp Wich +. + +Signed-off-by: Eneas U de Queiroz + +--- a/build-aux/ltmain.in ++++ b/build-aux/ltmain.in +@@ -82,7 +82,7 @@ func_echo () + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS +- $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" ++ $ECHO "libreCMC-$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS + } +--- a/build-aux/funclib.sh ++++ b/build-aux/funclib.sh +@@ -699,7 +699,7 @@ func_echo () + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS +- $ECHO "$progname: $_G_line" ++ $ECHO "libreCMC-$progname: $_G_line" + done + IFS=$func_echo_IFS } - - # func_verbose arg... -@@ -385,14 +385,14 @@ func_echo_all () - # Echo program name prefixed message to standard error. - func_error () - { -- $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 -+ $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 - } - - # func_warning arg... - # Echo program name prefixed warning message to standard error. - func_warning () - { -- $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 -+ $opt_warning && $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 - - # bash bug again: - : ---- a/libltdl/config/ltmain.sh -+++ b/libltdl/config/ltmain.sh -@@ -439,7 +439,7 @@ opt_warning=: - # name if it has been set yet. - func_echo () - { -- $ECHO "$progname: ${opt_mode+$opt_mode: }$*" -+ $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }$*" - } - - # func_verbose arg... -@@ -465,14 +465,14 @@ func_echo_all () - # Echo program name prefixed message to standard error. - func_error () - { -- $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 -+ $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 - } - - # func_warning arg... - # Echo program name prefixed warning message to standard error. - func_warning () - { -- $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 -+ $opt_warning && $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 - - # bash bug again: - : ---- a/libtoolize.in -+++ b/libtoolize.in -@@ -648,7 +648,7 @@ opt_warning=: - # name if it has been set yet. - func_echo () - { -- $ECHO "$progname: ${opt_mode+$opt_mode: }$*" -+ $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }$*" - } - - # func_verbose arg... -@@ -674,14 +674,14 @@ func_echo_all () - # Echo program name prefixed message to standard error. - func_error () - { -- $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 -+ $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 - } - - # func_warning arg... - # Echo program name prefixed warning message to standard error. - func_warning () - { -- $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 -+ $opt_warning && $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 - - # bash bug again: - : ---- a/tests/defs.in -+++ b/tests/defs.in -@@ -596,7 +596,7 @@ opt_warning=: - # name if it has been set yet. - func_echo () - { -- $ECHO "$progname: ${opt_mode+$opt_mode: }$*" -+ $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }$*" - } - - # func_verbose arg... -@@ -622,14 +622,14 @@ func_echo_all () - # Echo program name prefixed message to standard error. - func_error () - { -- $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 -+ $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 - } - - # func_warning arg... - # Echo program name prefixed warning message to standard error. - func_warning () - { -- $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 -+ $opt_warning && $ECHO "libreCMC-$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 - - # bash bug again: - : diff --git a/tools/llvm-bpf/Makefile b/tools/llvm-bpf/Makefile index 527b357824..bb3179016c 100644 --- a/tools/llvm-bpf/Makefile +++ b/tools/llvm-bpf/Makefile @@ -7,17 +7,16 @@ include $(TOPDIR)/rules.mk PKG_NAME:=llvm-project -PKG_VERSION:=13.0.0 +PKG_VERSION:=15.0.7 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).src.tar.xz PKG_SOURCE_URL:=https://github.com/llvm/llvm-project/releases/download/llvmorg-$(PKG_VERSION) -PKG_HASH:=6075ad30f1ac0e15f07c1bf062c1e1268c241d674f11bd32cdf0e040c71f2bf3 +PKG_HASH:=8b5fcb24b4128cf04df1b0b9410ce8b1a729cb3c544e6da885d234280dedeac6 +PKG_CPE_ID:=cpe:/a:llvm:llvm HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_VERSION).src -HOST_BUILD_PARALLEL:=1 - CMAKE_BINARY_SUBDIR := build CMAKE_SOURCE_SUBDIR := llvm diff --git a/tools/lz4/Makefile b/tools/lz4/Makefile new file mode 100644 index 0000000000..d606141650 --- /dev/null +++ b/tools/lz4/Makefile @@ -0,0 +1,38 @@ +# +# Copyright (C) 2022 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=lz4 +PKG_VERSION:=1.9.4 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/lz4/lz4/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=0b0e3aa07c8c063ddf40b082bdf7e37a1562bda40a0ff5272957f3e987e0e54b + +PKG_LICENSE:=BSD-2-Clause +PKG_LICENSE_FILES:=LICENSE lib/LICENSE +PKG_CPE_ID:=cpe:/a:lz4_project:lz4 + +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/meson.mk + +MESON_HOST_BUILD_DIR:=$(HOST_BUILD_DIR)/contrib/meson/librecmc-build + +# Always optimize for speed +HOST_CFLAGS := $(filter-out -O%,$(HOST_CFLAGS)) -O3 + +MESON_HOST_ARGS += \ + -Ddefault_library=static \ + -Ddebug-level=0 \ + -Dunstable=false \ + -Dprograms=true \ + -Dtests=false \ + -Dcontrib=false \ + -Dexamples=false + +$(eval $(call HostBuild)) diff --git a/tools/lz4/patches/001-add-make-ENABLE_DOCS-configurable.patch b/tools/lz4/patches/001-add-make-ENABLE_DOCS-configurable.patch new file mode 100644 index 0000000000..5d6dca33f3 --- /dev/null +++ b/tools/lz4/patches/001-add-make-ENABLE_DOCS-configurable.patch @@ -0,0 +1,60 @@ ++++ a/programs/Makefile 2022-08-15 15:45:31.000000000 -0700 +--- b/programs/Makefile 2022-11-28 16:34:21.315593784 -0800 +@@ -66,6 +66,7 @@ + MD2ROFF = ronn + MD2ROFF_FLAGS = --roff --warnings --manual="User Commands" --organization="lz4 $(LZ4_VERSION)" + ++ENABLE_DOCS ?= 1 + + default: lz4-release + +@@ -120,6 +121,7 @@ + lz4c32 : $(SRCFILES) + $(CC) $(FLAGS) $^ -o $@$(EXT) + ++ifeq ($(ENABLE_DOCS),1) + lz4.1: lz4.1.md $(LIBVER_SRC) + cat $< | $(MD2ROFF) $(MD2ROFF_FLAGS) | $(SED) -n '/^\.\\\".*/!p' > $@ + +@@ -130,6 +132,7 @@ + + preview-man: clean-man man + man ./lz4.1 ++endif + + clean: + ifeq ($(WINBASED),yes) +@@ -172,16 +175,19 @@ + + install: lz4 + @echo Installing binaries in $(DESTDIR)$(bindir) +- $(INSTALL_DIR) $(DESTDIR)$(bindir)/ $(DESTDIR)$(man1dir)/ ++ $(INSTALL_DIR) $(DESTDIR)$(bindir)/ + $(INSTALL_PROGRAM) lz4$(EXT) $(DESTDIR)$(bindir)/lz4$(EXT) + $(LN_SF) lz4$(EXT) $(DESTDIR)$(bindir)/lz4c$(EXT) + $(LN_SF) lz4$(EXT) $(DESTDIR)$(bindir)/lz4cat$(EXT) + $(LN_SF) lz4$(EXT) $(DESTDIR)$(bindir)/unlz4$(EXT) ++ifeq ($(ENABLE_DOCS),1) + @echo Installing man pages in $(DESTDIR)$(man1dir) ++ $(INSTALL_DIR) $(DESTDIR)$(man1dir)/ + $(INSTALL_DATA) lz4.1 $(DESTDIR)$(man1dir)/lz4.1 + $(LN_SF) lz4.1 $(DESTDIR)$(man1dir)/lz4c.1 + $(LN_SF) lz4.1 $(DESTDIR)$(man1dir)/lz4cat.1 + $(LN_SF) lz4.1 $(DESTDIR)$(man1dir)/unlz4.1 ++endif + @echo lz4 installation completed + + uninstall: +@@ -189,10 +195,12 @@ + $(RM) $(DESTDIR)$(bindir)/unlz4$(EXT) + $(RM) $(DESTDIR)$(bindir)/lz4$(EXT) + $(RM) $(DESTDIR)$(bindir)/lz4c$(EXT) ++ifeq ($(ENABLE_DOCS),1) + $(RM) $(DESTDIR)$(man1dir)/lz4.1 + $(RM) $(DESTDIR)$(man1dir)/lz4c.1 + $(RM) $(DESTDIR)$(man1dir)/lz4cat.1 + $(RM) $(DESTDIR)$(man1dir)/unlz4.1 ++endif + @echo lz4 programs successfully uninstalled + + endif diff --git a/tools/lz4/patches/002-makefile-install-links-from-same-dir.patch b/tools/lz4/patches/002-makefile-install-links-from-same-dir.patch new file mode 100644 index 0000000000..159dc67f1a --- /dev/null +++ b/tools/lz4/patches/002-makefile-install-links-from-same-dir.patch @@ -0,0 +1,71 @@ +diff -ur a/lib/Makefile b/lib/Makefile +--- a/lib/Makefile 2022-12-04 23:49:06.336839263 -0800 ++++ b/lib/Makefile 2022-12-05 00:00:59.172307488 -0800 +@@ -195,8 +195,8 @@ + $(INSTALL_PROGRAM) dll/$(LIBLZ4_EXP) $(DESTDIR)$(libdir) + else + $(INSTALL_PROGRAM) liblz4.$(SHARED_EXT_VER) $(DESTDIR)$(libdir) +- $(LN_SF) liblz4.$(SHARED_EXT_VER) $(DESTDIR)$(libdir)/liblz4.$(SHARED_EXT_MAJOR) +- $(LN_SF) liblz4.$(SHARED_EXT_VER) $(DESTDIR)$(libdir)/liblz4.$(SHARED_EXT) ++ (cd $(DESTDIR)$(libdir) && $(LN_SF) liblz4.$(SHARED_EXT_VER) liblz4.$(SHARED_EXT_MAJOR)) ++ (cd $(DESTDIR)$(libdir) && $(LN_SF) liblz4.$(SHARED_EXT_MAJOR) liblz4.$(SHARED_EXT)) + endif + endif + @echo Installing headers in $(DESTDIR)$(includedir) +diff -ur a/Makefile b/Makefile +--- a/Makefile 2022-12-04 23:49:06.336839263 -0800 ++++ b/Makefile 2022-12-04 23:42:09.693836654 -0800 +@@ -77,12 +77,12 @@ + + .PHONY: clean + clean: +- $(MAKE) -C $(LZ4DIR) $@ > $(VOID) +- $(MAKE) -C $(PRGDIR) $@ > $(VOID) +- $(MAKE) -C $(TESTDIR) $@ > $(VOID) +- $(MAKE) -C $(EXDIR) $@ > $(VOID) +- $(MAKE) -C $(FUZZDIR) $@ > $(VOID) +- $(MAKE) -C contrib/gen_manual $@ > $(VOID) ++ $(MAKE) -C $(LZ4DIR) $@ ++ $(MAKE) -C $(PRGDIR) $@ ++ $(MAKE) -C $(TESTDIR) $@ ++ $(MAKE) -C $(EXDIR) $@ ++ $(MAKE) -C $(FUZZDIR) $@ ++ $(MAKE) -C contrib/gen_manual $@ + $(RM) lz4$(EXT) + $(RM) -r $(CMAKE_BUILD_DIR) + @echo Cleaning completed +diff -ur a/programs/Makefile b/programs/Makefile +--- a/programs/Makefile 2022-12-04 23:49:06.336839263 -0800 ++++ b/programs/Makefile 2022-12-04 23:42:30.849582910 -0800 +@@ -138,7 +138,7 @@ + ifeq ($(WINBASED),yes) + $(RM) *.rc + endif +- $(MAKE) -C $(LZ4DIR) $@ > $(VOID) ++ $(MAKE) -C $(LZ4DIR) $@ + $(RM) core *.o *.test tmp* \ + lz4$(EXT) lz4c$(EXT) lz4c32$(EXT) lz4-wlib$(EXT) \ + unlz4$(EXT) lz4cat$(EXT) +@@ -177,16 +177,16 @@ + @echo Installing binaries in $(DESTDIR)$(bindir) + $(INSTALL_DIR) $(DESTDIR)$(bindir)/ + $(INSTALL_PROGRAM) lz4$(EXT) $(DESTDIR)$(bindir)/lz4$(EXT) +- $(LN_SF) lz4$(EXT) $(DESTDIR)$(bindir)/lz4c$(EXT) +- $(LN_SF) lz4$(EXT) $(DESTDIR)$(bindir)/lz4cat$(EXT) +- $(LN_SF) lz4$(EXT) $(DESTDIR)$(bindir)/unlz4$(EXT) ++ (cd $(DESTDIR)$(bindir) && $(LN_SF) lz4$(EXT) lz4c$(EXT)) ++ (cd $(DESTDIR)$(bindir) && $(LN_SF) lz4$(EXT) lz4cat$(EXT)) ++ (cd $(DESTDIR)$(bindir) && $(LN_SF) lz4$(EXT) unlz4$(EXT)) + ifeq ($(ENABLE_DOCS),1) + @echo Installing man pages in $(DESTDIR)$(man1dir) + $(INSTALL_DIR) $(DESTDIR)$(man1dir)/ + $(INSTALL_DATA) lz4.1 $(DESTDIR)$(man1dir)/lz4.1 +- $(LN_SF) lz4.1 $(DESTDIR)$(man1dir)/lz4c.1 +- $(LN_SF) lz4.1 $(DESTDIR)$(man1dir)/lz4cat.1 +- $(LN_SF) lz4.1 $(DESTDIR)$(man1dir)/unlz4.1 ++ (cd $(DESTDIR)$(man1dir) && $(LN_SF) lz4.1 lz4c.1) ++ (cd $(DESTDIR)$(man1dir) && $(LN_SF) lz4.1 lz4cat.1) ++ (cd $(DESTDIR)$(man1dir) && $(LN_SF) lz4.1 unlz4.1) + endif + @echo lz4 installation completed + diff --git a/tools/lzma/Makefile b/tools/lzma/Makefile index 53138d5314..df896e3ed9 100644 --- a/tools/lzma/Makefile +++ b/tools/lzma/Makefile @@ -31,6 +31,7 @@ define Host/Install endef define Host/Clean + rm -f $(STAGING_DIR_HOST)/bin/lzma endef $(eval $(call HostBuild)) diff --git a/tools/lzop/Makefile b/tools/lzop/Makefile new file mode 100644 index 0000000000..73bac36afd --- /dev/null +++ b/tools/lzop/Makefile @@ -0,0 +1,33 @@ +# +# Copyright (C) 2022 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=lzop +PKG_VERSION:=1.04 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=http://www.lzop.org/download/ +PKG_HASH:=7e72b62a8a60aff5200a047eea0773a8fb205caf7acbe1774d95147f305a2f41 + +PKG_LICENSE:=GPL-2.0-or-later +PKG_LICENSE_FILES:=COPYING + +CMAKE_BINARY_SUBDIR:=librecmc-build + +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/cmake.mk + +CMAKE_HOST_OPTIONS += \ + -DENABLE_DOCS=ON \ + -DBUILD_TESTING=OFF + +define Host/Uninstall + rm -f $(STAGING_DIR_HOST)/bin/lzop +endef + +$(eval $(call HostBuild)) diff --git a/tools/lzop/patches/001-add-cmake-ENABLE_DOCS-configurable.patch b/tools/lzop/patches/001-add-cmake-ENABLE_DOCS-configurable.patch new file mode 100644 index 0000000000..01ebd33a39 --- /dev/null +++ b/tools/lzop/patches/001-add-cmake-ENABLE_DOCS-configurable.patch @@ -0,0 +1,24 @@ +--- a/CMakeLists.txt 2017-08-10 04:19:45.000000000 -0700 ++++ b/CMakeLists.txt 2022-11-28 17:21:03.453548350 -0800 +@@ -50,6 +50,9 @@ + + project(lzop VERSION 1.04 LANGUAGES C) + ++# configuration options ++option(ENABLE_DOCS "Install documentation." ON) ++ + # install directories + if(NOT CMAKE_INSTALL_PREFIX) + message(FATAL_ERROR "ERROR: CMAKE_INSTALL_PREFIX is not defined.") +@@ -186,9 +189,11 @@ + + install(TARGETS lzop DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}") + ++if(ENABLE_DOCS) + set(f AUTHORS COPYING NEWS README THANKS doc/lzop.html doc/lzop.man doc/lzop.pod doc/lzop.ps doc/lzop.tex doc/lzop.txt) + install(FILES ${f} DESTINATION "${CMAKE_INSTALL_FULL_DOCDIR}") + install(FILES doc/lzop.1 DESTINATION "${CMAKE_INSTALL_FULL_MANDIR}/man1") ++endif() # ENABLE_DOCS + + endif() # CMAKE_INSTALL_FULL_LIBDIR + diff --git a/tools/m4/Makefile b/tools/m4/Makefile index 0a358c35f1..d621000daf 100644 --- a/tools/m4/Makefile +++ b/tools/m4/Makefile @@ -21,9 +21,8 @@ include $(INCLUDE_DIR)/host-build.mk HOST_CONFIGURE_VARS += gl_cv_func_strstr_linear=no -define Host/Clean - -$(MAKE) -C $(HOST_BUILD_DIR) uninstall - $(call Host/Clean/Default) +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) endef $(eval $(call HostBuild)) diff --git a/tools/meson/Makefile b/tools/meson/Makefile index 68120f0912..a11cfe0fb5 100644 --- a/tools/meson/Makefile +++ b/tools/meson/Makefile @@ -1,11 +1,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=meson -PKG_VERSION:=0.61.4 +PKG_VERSION:=0.61.5 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/mesonbuild/meson/releases/download/$(PKG_VERSION) -PKG_HASH:=4e3733ddc66bac38e38c63b739c9b8b8fc5a866de5333396b0c85c2b144ddee9 +PKG_HASH:=5e9a0d65c1a51936362b9686d1c5e9e184a6fd245d57e7269750ce50c20f5d9a PKG_MAINTAINER:=Andre Heider PKG_LICENSE:=Apache-2.0 diff --git a/tools/missing-macros/src/README b/tools/missing-macros/src/README index 796f2038f0..066fdb946f 100644 --- a/tools/missing-macros/src/README +++ b/tools/missing-macros/src/README @@ -2,26 +2,13 @@ The m4/ directory below contains various m4 macros used by different packages in the libreCMC feed. -From GNU gettext: -Library linking and rpath helper macros. - - lib-ld.m4 - lib-link.m4 - lib-prefix.m4 - Integer data type test macros. intmax.m4 - wint_t.m4 inttypes-pri.m4 uintmax_t.m4 - stdint_h.m4 intdiv0.m4 - inttypes_h.m4 - -Program test macro. - progtest.m4 GNU libc version test macros. diff --git a/tools/missing-macros/src/bin/makeinfo b/tools/missing-macros/src/bin/makeinfo index b1debafc33..8e7763761b 100755 --- a/tools/missing-macros/src/bin/makeinfo +++ b/tools/missing-macros/src/bin/makeinfo @@ -26,7 +26,7 @@ Getopt::Long::GetOptions( if ($version) { - print "makeinfo (libreCMC stub) 4.13\n"; + print "makeinfo (libreCMC stub) 9.99\n"; exit 0; } diff --git a/tools/missing-macros/src/m4/inttypes_h.m4 b/tools/missing-macros/src/m4/inttypes_h.m4 deleted file mode 100644 index 782d77ed8b..0000000000 --- a/tools/missing-macros/src/m4/inttypes_h.m4 +++ /dev/null @@ -1,26 +0,0 @@ -# inttypes_h.m4 serial 9 -dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl From Paul Eggert. - -# Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, -# doesn't clash with , and declares uintmax_t. - -AC_DEFUN([gl_AC_HEADER_INTTYPES_H], -[ - AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h], - [AC_TRY_COMPILE( - [#include -#include ], - [uintmax_t i = (uintmax_t) -1; return !i;], - [gl_cv_header_inttypes_h=yes], - [gl_cv_header_inttypes_h=no])]) - if test $gl_cv_header_inttypes_h = yes; then - AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1], - [Define if exists, doesn't clash with , - and declares uintmax_t. ]) - fi -]) diff --git a/tools/missing-macros/src/m4/lib-ld.m4 b/tools/missing-macros/src/m4/lib-ld.m4 deleted file mode 100644 index ebb30528bd..0000000000 --- a/tools/missing-macros/src/m4/lib-ld.m4 +++ /dev/null @@ -1,110 +0,0 @@ -# lib-ld.m4 serial 4 (gettext-0.18) -dnl Copyright (C) 1996-2003, 2009-2010 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl Subroutines of libtool.m4, -dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision -dnl with libtool.m4. - -dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. -AC_DEFUN([AC_LIB_PROG_LD_GNU], -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], -[# I'd rather use --version here, but apparently some GNU ld's only accept -v. -case `$LD -v 2>&1 conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by GCC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]* | [A-Za-z]:[\\/]*)] - [re_direlt='/[^/][^/]*/\.\./'] - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL([acl_cv_path_LD], -[if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - acl_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in - *GNU* | *'with BFD'*) - test "$with_gnu_ld" != no && break ;; - *) - test "$with_gnu_ld" != yes && break ;; - esac - fi - done - IFS="$ac_save_ifs" -else - acl_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$acl_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT([$LD]) -else - AC_MSG_RESULT([no]) -fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -AC_LIB_PROG_LD_GNU -]) diff --git a/tools/missing-macros/src/m4/lib-link.m4 b/tools/missing-macros/src/m4/lib-link.m4 deleted file mode 100644 index c73bd8e3a4..0000000000 --- a/tools/missing-macros/src/m4/lib-link.m4 +++ /dev/null @@ -1,774 +0,0 @@ -# lib-link.m4 serial 21 (gettext-0.18) -dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl From Bruno Haible. - -AC_PREREQ([2.54]) - -dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and -dnl the libraries corresponding to explicit and implicit dependencies. -dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and -dnl augments the CPPFLAGS variable. -dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname -dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. -AC_DEFUN([AC_LIB_LINKFLAGS], -[ - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - AC_REQUIRE([AC_LIB_RPATH]) - pushdef([Name],[translit([$1],[./-], [___])]) - pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ - AC_LIB_LINKFLAGS_BODY([$1], [$2]) - ac_cv_lib[]Name[]_libs="$LIB[]NAME" - ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" - ac_cv_lib[]Name[]_cppflags="$INC[]NAME" - ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" - ]) - LIB[]NAME="$ac_cv_lib[]Name[]_libs" - LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" - INC[]NAME="$ac_cv_lib[]Name[]_cppflags" - LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" - AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) - AC_SUBST([LIB]NAME) - AC_SUBST([LTLIB]NAME) - AC_SUBST([LIB]NAME[_PREFIX]) - dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the - dnl results of this search when this library appears as a dependency. - HAVE_LIB[]NAME=yes - popdef([NAME]) - popdef([Name]) -]) - -dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message]) -dnl searches for libname and the libraries corresponding to explicit and -dnl implicit dependencies, together with the specified include files and -dnl the ability to compile and link the specified testcode. The missing-message -dnl defaults to 'no' and may contain additional hints for the user. -dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} -dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and -dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs -dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. -dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname -dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. -AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], -[ - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - AC_REQUIRE([AC_LIB_RPATH]) - pushdef([Name],[translit([$1],[./-], [___])]) - pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - - dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME - dnl accordingly. - AC_LIB_LINKFLAGS_BODY([$1], [$2]) - - dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, - dnl because if the user has installed lib[]Name and not disabled its use - dnl via --without-lib[]Name-prefix, he wants to use it. - ac_save_CPPFLAGS="$CPPFLAGS" - AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) - - AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ - ac_save_LIBS="$LIBS" - dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS, - dnl because these -l options might require -L options that are present in - dnl LIBS. -l options benefit only from the -L options listed before it. - dnl Otherwise, add it to the front of LIBS, because it may be a static - dnl library that depends on another static library that is present in LIBS. - dnl Static libraries benefit only from the static libraries listed after - dnl it. - case " $LIB[]NAME" in - *" -l"*) LIBS="$LIBS $LIB[]NAME" ;; - *) LIBS="$LIB[]NAME $LIBS" ;; - esac - AC_TRY_LINK([$3], [$4], - [ac_cv_lib[]Name=yes], - [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])']) - LIBS="$ac_save_LIBS" - ]) - if test "$ac_cv_lib[]Name" = yes; then - HAVE_LIB[]NAME=yes - AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) - AC_MSG_CHECKING([how to link with lib[]$1]) - AC_MSG_RESULT([$LIB[]NAME]) - else - HAVE_LIB[]NAME=no - dnl If $LIB[]NAME didn't lead to a usable library, we don't need - dnl $INC[]NAME either. - CPPFLAGS="$ac_save_CPPFLAGS" - LIB[]NAME= - LTLIB[]NAME= - LIB[]NAME[]_PREFIX= - fi - AC_SUBST([HAVE_LIB]NAME) - AC_SUBST([LIB]NAME) - AC_SUBST([LTLIB]NAME) - AC_SUBST([LIB]NAME[_PREFIX]) - popdef([NAME]) - popdef([Name]) -]) - -dnl Determine the platform dependent parameters needed to use rpath: -dnl acl_libext, -dnl acl_shlibext, -dnl acl_hardcode_libdir_flag_spec, -dnl acl_hardcode_libdir_separator, -dnl acl_hardcode_direct, -dnl acl_hardcode_minus_L. -AC_DEFUN([AC_LIB_RPATH], -[ - dnl Tell automake >= 1.10 to complain if config.rpath is missing. - m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) - AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS - AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld - AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host - AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir - AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ - CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ - ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh - . ./conftest.sh - rm -f ./conftest.sh - acl_cv_rpath=done - ]) - wl="$acl_cv_wl" - acl_libext="$acl_cv_libext" - acl_shlibext="$acl_cv_shlibext" - acl_libname_spec="$acl_cv_libname_spec" - acl_library_names_spec="$acl_cv_library_names_spec" - acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" - acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" - acl_hardcode_direct="$acl_cv_hardcode_direct" - acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" - dnl Determine whether the user wants rpath handling at all. - AC_ARG_ENABLE([rpath], - [ --disable-rpath do not hardcode runtime library paths], - :, enable_rpath=yes) -]) - -dnl AC_LIB_FROMPACKAGE(name, package) -dnl declares that libname comes from the given package. The configure file -dnl will then not have a --with-libname-prefix option but a -dnl --with-package-prefix option. Several libraries can come from the same -dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar -dnl macro call that searches for libname. -AC_DEFUN([AC_LIB_FROMPACKAGE], -[ - pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - define([acl_frompackage_]NAME, [$2]) - popdef([NAME]) - pushdef([PACK],[$2]) - pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - define([acl_libsinpackage_]PACKUP, - m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1]) - popdef([PACKUP]) - popdef([PACK]) -]) - -dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and -dnl the libraries corresponding to explicit and implicit dependencies. -dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. -dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found -dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. -AC_DEFUN([AC_LIB_LINKFLAGS_BODY], -[ - AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) - pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) - pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) - dnl Autoconf >= 2.61 supports dots in --with options. - pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)]) - dnl By default, look in $includedir and $libdir. - use_additional=yes - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - AC_ARG_WITH(P_A_C_K[-prefix], -[[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib - --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], -[ - if test "X$withval" = "Xno"; then - use_additional=no - else - if test "X$withval" = "X"; then - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - else - additional_includedir="$withval/include" - additional_libdir="$withval/$acl_libdirstem" - if test "$acl_libdirstem2" != "$acl_libdirstem" \ - && ! test -d "$withval/$acl_libdirstem"; then - additional_libdir="$withval/$acl_libdirstem2" - fi - fi - fi -]) - dnl Search the library and its dependencies in $additional_libdir and - dnl $LDFLAGS. Using breadth-first-seach. - LIB[]NAME= - LTLIB[]NAME= - INC[]NAME= - LIB[]NAME[]_PREFIX= - dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been - dnl computed. So it has to be reset here. - HAVE_LIB[]NAME= - rpathdirs= - ltrpathdirs= - names_already_handled= - names_next_round='$1 $2' - while test -n "$names_next_round"; do - names_this_round="$names_next_round" - names_next_round= - for name in $names_this_round; do - already_handled= - for n in $names_already_handled; do - if test "$n" = "$name"; then - already_handled=yes - break - fi - done - if test -z "$already_handled"; then - names_already_handled="$names_already_handled $name" - dnl See if it was already located by an earlier AC_LIB_LINKFLAGS - dnl or AC_LIB_HAVE_LINKFLAGS call. - uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` - eval value=\"\$HAVE_LIB$uppername\" - if test -n "$value"; then - if test "$value" = yes; then - eval value=\"\$LIB$uppername\" - test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" - eval value=\"\$LTLIB$uppername\" - test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" - else - dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined - dnl that this library doesn't exist. So just drop it. - : - fi - else - dnl Search the library lib$name in $additional_libdir and $LDFLAGS - dnl and the already constructed $LIBNAME/$LTLIBNAME. - found_dir= - found_la= - found_so= - found_a= - eval libname=\"$acl_libname_spec\" # typically: libname=lib$name - if test -n "$acl_shlibext"; then - shrext=".$acl_shlibext" # typically: shrext=.so - else - shrext= - fi - if test $use_additional = yes; then - dir="$additional_libdir" - dnl The same code as in the loop below: - dnl First look for a shared library. - if test -n "$acl_shlibext"; then - if test -f "$dir/$libname$shrext"; then - found_dir="$dir" - found_so="$dir/$libname$shrext" - else - if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then - ver=`(cd "$dir" && \ - for f in "$libname$shrext".*; do echo "$f"; done \ - | sed -e "s,^$libname$shrext\\\\.,," \ - | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ - | sed 1q ) 2>/dev/null` - if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then - found_dir="$dir" - found_so="$dir/$libname$shrext.$ver" - fi - else - eval library_names=\"$acl_library_names_spec\" - for f in $library_names; do - if test -f "$dir/$f"; then - found_dir="$dir" - found_so="$dir/$f" - break - fi - done - fi - fi - fi - dnl Then look for a static library. - if test "X$found_dir" = "X"; then - if test -f "$dir/$libname.$acl_libext"; then - found_dir="$dir" - found_a="$dir/$libname.$acl_libext" - fi - fi - if test "X$found_dir" != "X"; then - if test -f "$dir/$libname.la"; then - found_la="$dir/$libname.la" - fi - fi - fi - if test "X$found_dir" = "X"; then - for x in $LDFLAGS $LTLIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - case "$x" in - -L*) - dir=`echo "X$x" | sed -e 's/^X-L//'` - dnl First look for a shared library. - if test -n "$acl_shlibext"; then - if test -f "$dir/$libname$shrext"; then - found_dir="$dir" - found_so="$dir/$libname$shrext" - else - if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then - ver=`(cd "$dir" && \ - for f in "$libname$shrext".*; do echo "$f"; done \ - | sed -e "s,^$libname$shrext\\\\.,," \ - | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ - | sed 1q ) 2>/dev/null` - if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then - found_dir="$dir" - found_so="$dir/$libname$shrext.$ver" - fi - else - eval library_names=\"$acl_library_names_spec\" - for f in $library_names; do - if test -f "$dir/$f"; then - found_dir="$dir" - found_so="$dir/$f" - break - fi - done - fi - fi - fi - dnl Then look for a static library. - if test "X$found_dir" = "X"; then - if test -f "$dir/$libname.$acl_libext"; then - found_dir="$dir" - found_a="$dir/$libname.$acl_libext" - fi - fi - if test "X$found_dir" != "X"; then - if test -f "$dir/$libname.la"; then - found_la="$dir/$libname.la" - fi - fi - ;; - esac - if test "X$found_dir" != "X"; then - break - fi - done - fi - if test "X$found_dir" != "X"; then - dnl Found the library. - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" - if test "X$found_so" != "X"; then - dnl Linking with a shared library. We attempt to hardcode its - dnl directory into the executable's runpath, unless it's the - dnl standard /usr/lib. - if test "$enable_rpath" = no \ - || test "X$found_dir" = "X/usr/$acl_libdirstem" \ - || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then - dnl No hardcoding is needed. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - else - dnl Use an explicit option to hardcode DIR into the resulting - dnl binary. - dnl Potentially add DIR to ltrpathdirs. - dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. - haveit= - for x in $ltrpathdirs; do - if test "X$x" = "X$found_dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - ltrpathdirs="$ltrpathdirs $found_dir" - fi - dnl The hardcoding into $LIBNAME is system dependent. - if test "$acl_hardcode_direct" = yes; then - dnl Using DIR/libNAME.so during linking hardcodes DIR into the - dnl resulting binary. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - else - if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then - dnl Use an explicit option to hardcode DIR into the resulting - dnl binary. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - dnl Potentially add DIR to rpathdirs. - dnl The rpathdirs will be appended to $LIBNAME at the end. - haveit= - for x in $rpathdirs; do - if test "X$x" = "X$found_dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - rpathdirs="$rpathdirs $found_dir" - fi - else - dnl Rely on "-L$found_dir". - dnl But don't add it if it's already contained in the LDFLAGS - dnl or the already constructed $LIBNAME - haveit= - for x in $LDFLAGS $LIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$found_dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" - fi - if test "$acl_hardcode_minus_L" != no; then - dnl FIXME: Not sure whether we should use - dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" - dnl here. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - else - dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH - dnl here, because this doesn't fit in flags passed to the - dnl compiler. So give up. No hardcoding. This affects only - dnl very old systems. - dnl FIXME: Not sure whether we should use - dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" - dnl here. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" - fi - fi - fi - fi - else - if test "X$found_a" != "X"; then - dnl Linking with a static library. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" - else - dnl We shouldn't come here, but anyway it's good to have a - dnl fallback. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" - fi - fi - dnl Assume the include files are nearby. - additional_includedir= - case "$found_dir" in - */$acl_libdirstem | */$acl_libdirstem/) - basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` - if test "$name" = '$1'; then - LIB[]NAME[]_PREFIX="$basedir" - fi - additional_includedir="$basedir/include" - ;; - */$acl_libdirstem2 | */$acl_libdirstem2/) - basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` - if test "$name" = '$1'; then - LIB[]NAME[]_PREFIX="$basedir" - fi - additional_includedir="$basedir/include" - ;; - esac - if test "X$additional_includedir" != "X"; then - dnl Potentially add $additional_includedir to $INCNAME. - dnl But don't add it - dnl 1. if it's the standard /usr/include, - dnl 2. if it's /usr/local/include and we are using GCC on Linux, - dnl 3. if it's already present in $CPPFLAGS or the already - dnl constructed $INCNAME, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_includedir" != "X/usr/include"; then - haveit= - if test "X$additional_includedir" = "X/usr/local/include"; then - if test -n "$GCC"; then - case $host_os in - linux* | gnu* | k*bsd*-gnu) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - for x in $CPPFLAGS $INC[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-I$additional_includedir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test -d "$additional_includedir"; then - dnl Really add $additional_includedir to $INCNAME. - INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" - fi - fi - fi - fi - fi - dnl Look for dependencies. - if test -n "$found_la"; then - dnl Read the .la file. It defines the variables - dnl dlname, library_names, old_library, dependency_libs, current, - dnl age, revision, installed, dlopen, dlpreopen, libdir. - save_libdir="$libdir" - case "$found_la" in - */* | *\\*) . "$found_la" ;; - *) . "./$found_la" ;; - esac - libdir="$save_libdir" - dnl We use only dependency_libs. - for dep in $dependency_libs; do - case "$dep" in - -L*) - additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` - dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. - dnl But don't add it - dnl 1. if it's the standard /usr/lib, - dnl 2. if it's /usr/local/lib and we are using GCC on Linux, - dnl 3. if it's already present in $LDFLAGS or the already - dnl constructed $LIBNAME, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ - && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then - haveit= - if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ - || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then - if test -n "$GCC"; then - case $host_os in - linux* | gnu* | k*bsd*-gnu) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - haveit= - for x in $LDFLAGS $LIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$additional_libdir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test -d "$additional_libdir"; then - dnl Really add $additional_libdir to $LIBNAME. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" - fi - fi - haveit= - for x in $LDFLAGS $LTLIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$additional_libdir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test -d "$additional_libdir"; then - dnl Really add $additional_libdir to $LTLIBNAME. - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" - fi - fi - fi - fi - ;; - -R*) - dir=`echo "X$dep" | sed -e 's/^X-R//'` - if test "$enable_rpath" != no; then - dnl Potentially add DIR to rpathdirs. - dnl The rpathdirs will be appended to $LIBNAME at the end. - haveit= - for x in $rpathdirs; do - if test "X$x" = "X$dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - rpathdirs="$rpathdirs $dir" - fi - dnl Potentially add DIR to ltrpathdirs. - dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. - haveit= - for x in $ltrpathdirs; do - if test "X$x" = "X$dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - ltrpathdirs="$ltrpathdirs $dir" - fi - fi - ;; - -l*) - dnl Handle this in the next round. - names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` - ;; - *.la) - dnl Handle this in the next round. Throw away the .la's - dnl directory; it is already contained in a preceding -L - dnl option. - names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` - ;; - *) - dnl Most likely an immediate library name. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" - ;; - esac - done - fi - else - dnl Didn't find the library; assume it is in the system directories - dnl known to the linker and runtime loader. (All the system - dnl directories known to the linker should also be known to the - dnl runtime loader, otherwise the system is severely misconfigured.) - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" - fi - fi - fi - done - done - if test "X$rpathdirs" != "X"; then - if test -n "$acl_hardcode_libdir_separator"; then - dnl Weird platform: only the last -rpath option counts, the user must - dnl pass all path elements in one option. We can arrange that for a - dnl single library, but not when more than one $LIBNAMEs are used. - alldirs= - for found_dir in $rpathdirs; do - alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" - done - dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. - acl_save_libdir="$libdir" - libdir="$alldirs" - eval flag=\"$acl_hardcode_libdir_flag_spec\" - libdir="$acl_save_libdir" - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" - else - dnl The -rpath options are cumulative. - for found_dir in $rpathdirs; do - acl_save_libdir="$libdir" - libdir="$found_dir" - eval flag=\"$acl_hardcode_libdir_flag_spec\" - libdir="$acl_save_libdir" - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" - done - fi - fi - if test "X$ltrpathdirs" != "X"; then - dnl When using libtool, the option that works for both libraries and - dnl executables is -R. The -R options are cumulative. - for found_dir in $ltrpathdirs; do - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" - done - fi - popdef([P_A_C_K]) - popdef([PACKLIBS]) - popdef([PACKUP]) - popdef([PACK]) - popdef([NAME]) -]) - -dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, -dnl unless already present in VAR. -dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes -dnl contains two or three consecutive elements that belong together. -AC_DEFUN([AC_LIB_APPENDTOVAR], -[ - for element in [$2]; do - haveit= - for x in $[$1]; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X$element"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - [$1]="${[$1]}${[$1]:+ }$element" - fi - done -]) - -dnl For those cases where a variable contains several -L and -l options -dnl referring to unknown libraries and directories, this macro determines the -dnl necessary additional linker options for the runtime path. -dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) -dnl sets LDADDVAR to linker options needed together with LIBSVALUE. -dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, -dnl otherwise linking without libtool is assumed. -AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], -[ - AC_REQUIRE([AC_LIB_RPATH]) - AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) - $1= - if test "$enable_rpath" != no; then - if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then - dnl Use an explicit option to hardcode directories into the resulting - dnl binary. - rpathdirs= - next= - for opt in $2; do - if test -n "$next"; then - dir="$next" - dnl No need to hardcode the standard /usr/lib. - if test "X$dir" != "X/usr/$acl_libdirstem" \ - && test "X$dir" != "X/usr/$acl_libdirstem2"; then - rpathdirs="$rpathdirs $dir" - fi - next= - else - case $opt in - -L) next=yes ;; - -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` - dnl No need to hardcode the standard /usr/lib. - if test "X$dir" != "X/usr/$acl_libdirstem" \ - && test "X$dir" != "X/usr/$acl_libdirstem2"; then - rpathdirs="$rpathdirs $dir" - fi - next= ;; - *) next= ;; - esac - fi - done - if test "X$rpathdirs" != "X"; then - if test -n ""$3""; then - dnl libtool is used for linking. Use -R options. - for dir in $rpathdirs; do - $1="${$1}${$1:+ }-R$dir" - done - else - dnl The linker is used for linking directly. - if test -n "$acl_hardcode_libdir_separator"; then - dnl Weird platform: only the last -rpath option counts, the user - dnl must pass all path elements in one option. - alldirs= - for dir in $rpathdirs; do - alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" - done - acl_save_libdir="$libdir" - libdir="$alldirs" - eval flag=\"$acl_hardcode_libdir_flag_spec\" - libdir="$acl_save_libdir" - $1="$flag" - else - dnl The -rpath options are cumulative. - for dir in $rpathdirs; do - acl_save_libdir="$libdir" - libdir="$dir" - eval flag=\"$acl_hardcode_libdir_flag_spec\" - libdir="$acl_save_libdir" - $1="${$1}${$1:+ }$flag" - done - fi - fi - fi - fi - fi - AC_SUBST([$1]) -]) diff --git a/tools/missing-macros/src/m4/lib-prefix.m4 b/tools/missing-macros/src/m4/lib-prefix.m4 deleted file mode 100644 index 1601ceaefd..0000000000 --- a/tools/missing-macros/src/m4/lib-prefix.m4 +++ /dev/null @@ -1,224 +0,0 @@ -# lib-prefix.m4 serial 7 (gettext-0.18) -dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl From Bruno Haible. - -dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and -dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't -dnl require excessive bracketing. -ifdef([AC_HELP_STRING], -[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], -[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) - -dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed -dnl to access previously installed libraries. The basic assumption is that -dnl a user will want packages to use other packages he previously installed -dnl with the same --prefix option. -dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate -dnl libraries, but is otherwise very convenient. -AC_DEFUN([AC_LIB_PREFIX], -[ - AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) - AC_REQUIRE([AC_PROG_CC]) - AC_REQUIRE([AC_CANONICAL_HOST]) - AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - dnl By default, look in $includedir and $libdir. - use_additional=yes - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - AC_LIB_ARG_WITH([lib-prefix], -[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib - --without-lib-prefix don't search for libraries in includedir and libdir], -[ - if test "X$withval" = "Xno"; then - use_additional=no - else - if test "X$withval" = "X"; then - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - else - additional_includedir="$withval/include" - additional_libdir="$withval/$acl_libdirstem" - fi - fi -]) - if test $use_additional = yes; then - dnl Potentially add $additional_includedir to $CPPFLAGS. - dnl But don't add it - dnl 1. if it's the standard /usr/include, - dnl 2. if it's already present in $CPPFLAGS, - dnl 3. if it's /usr/local/include and we are using GCC on Linux, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_includedir" != "X/usr/include"; then - haveit= - for x in $CPPFLAGS; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-I$additional_includedir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test "X$additional_includedir" = "X/usr/local/include"; then - if test -n "$GCC"; then - case $host_os in - linux* | gnu* | k*bsd*-gnu) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - if test -d "$additional_includedir"; then - dnl Really add $additional_includedir to $CPPFLAGS. - CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" - fi - fi - fi - fi - dnl Potentially add $additional_libdir to $LDFLAGS. - dnl But don't add it - dnl 1. if it's the standard /usr/lib, - dnl 2. if it's already present in $LDFLAGS, - dnl 3. if it's /usr/local/lib and we are using GCC on Linux, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then - haveit= - for x in $LDFLAGS; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$additional_libdir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then - if test -n "$GCC"; then - case $host_os in - linux*) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - if test -d "$additional_libdir"; then - dnl Really add $additional_libdir to $LDFLAGS. - LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" - fi - fi - fi - fi - fi -]) - -dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, -dnl acl_final_exec_prefix, containing the values to which $prefix and -dnl $exec_prefix will expand at the end of the configure script. -AC_DEFUN([AC_LIB_PREPARE_PREFIX], -[ - dnl Unfortunately, prefix and exec_prefix get only finally determined - dnl at the end of configure. - if test "X$prefix" = "XNONE"; then - acl_final_prefix="$ac_default_prefix" - else - acl_final_prefix="$prefix" - fi - if test "X$exec_prefix" = "XNONE"; then - acl_final_exec_prefix='${prefix}' - else - acl_final_exec_prefix="$exec_prefix" - fi - acl_save_prefix="$prefix" - prefix="$acl_final_prefix" - eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" - prefix="$acl_save_prefix" -]) - -dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the -dnl variables prefix and exec_prefix bound to the values they will have -dnl at the end of the configure script. -AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], -[ - acl_save_prefix="$prefix" - prefix="$acl_final_prefix" - acl_save_exec_prefix="$exec_prefix" - exec_prefix="$acl_final_exec_prefix" - $1 - exec_prefix="$acl_save_exec_prefix" - prefix="$acl_save_prefix" -]) - -dnl AC_LIB_PREPARE_MULTILIB creates -dnl - a variable acl_libdirstem, containing the basename of the libdir, either -dnl "lib" or "lib64" or "lib/64", -dnl - a variable acl_libdirstem2, as a secondary possible value for -dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or -dnl "lib/amd64". -AC_DEFUN([AC_LIB_PREPARE_MULTILIB], -[ - dnl There is no formal standard regarding lib and lib64. - dnl On glibc systems, the current practice is that on a system supporting - dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under - dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine - dnl the compiler's default mode by looking at the compiler's library search - dnl path. If at least one of its elements ends in /lib64 or points to a - dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. - dnl Otherwise we use the default, namely "lib". - dnl On Solaris systems, the current practice is that on a system supporting - dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under - dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or - dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. - AC_REQUIRE([AC_CANONICAL_HOST]) - acl_libdirstem=lib - acl_libdirstem2= - case "$host_os" in - solaris*) - dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment - dnl . - dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." - dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the - dnl symlink is missing, so we set acl_libdirstem2 too. - AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], - [AC_EGREP_CPP([sixtyfour bits], [ -#ifdef _LP64 -sixtyfour bits -#endif - ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) - ]) - if test $gl_cv_solaris_64bit = yes; then - acl_libdirstem=lib/64 - case "$host_cpu" in - sparc*) acl_libdirstem2=lib/sparcv9 ;; - i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; - esac - fi - ;; - *) - searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` - if test -n "$searchpath"; then - acl_save_IFS="${IFS= }"; IFS=":" - for searchdir in $searchpath; do - if test -d "$searchdir"; then - case "$searchdir" in - */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; - */../ | */.. ) - # Better ignore directories of this form. They are misleading. - ;; - *) searchdir=`cd "$searchdir" && pwd` - case "$searchdir" in - */lib64 ) acl_libdirstem=lib64 ;; - esac ;; - esac - fi - done - IFS="$acl_save_IFS" - fi - ;; - esac - test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" -]) diff --git a/tools/missing-macros/src/m4/progtest.m4 b/tools/missing-macros/src/m4/progtest.m4 deleted file mode 100644 index 2d804ac99d..0000000000 --- a/tools/missing-macros/src/m4/progtest.m4 +++ /dev/null @@ -1,92 +0,0 @@ -# progtest.m4 serial 6 (gettext-0.18) -dnl Copyright (C) 1996-2003, 2005, 2008-2010 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. -dnl -dnl This file can can be used in projects which are not available under -dnl the GNU General Public License or the GNU Library General Public -dnl License but which still want to provide support for the GNU gettext -dnl functionality. -dnl Please note that the actual code of the GNU gettext library is covered -dnl by the GNU Library General Public License, and the rest of the GNU -dnl gettext package package is covered by the GNU General Public License. -dnl They are *not* in the public domain. - -dnl Authors: -dnl Ulrich Drepper , 1996. - -AC_PREREQ([2.50]) - -# Search path for a program which passes the given test. - -dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, -dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) -AC_DEFUN([AM_PATH_PROG_WITH_TEST], -[ -# Prepare PATH_SEPARATOR. -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - -# Find out how to test for executable files. Don't use a zero-byte file, -# as systems may use methods other than mode bits to determine executability. -cat >conf$$.file <<_ASEOF -#! /bin/sh -exit 0 -_ASEOF -chmod +x conf$$.file -if test -x conf$$.file >/dev/null 2>&1; then - ac_executable_p="test -x" -else - ac_executable_p="test -f" -fi -rm -f conf$$.file - -# Extract the first word of "$2", so it can be a program name with args. -set dummy $2; ac_word=[$]2 -AC_MSG_CHECKING([for $ac_word]) -AC_CACHE_VAL([ac_cv_path_$1], -[case "[$]$1" in - [[\\/]]* | ?:[[\\/]]*) - ac_cv_path_$1="[$]$1" # Let the user override the test with a path. - ;; - *) - ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in ifelse([$5], , $PATH, [$5]); do - IFS="$ac_save_IFS" - test -z "$ac_dir" && ac_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then - echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD - if [$3]; then - ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" - break 2 - fi - fi - done - done - IFS="$ac_save_IFS" -dnl If no 4th arg is given, leave the cache variable unset, -dnl so AC_PATH_PROGS will keep looking. -ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" -])dnl - ;; -esac])dnl -$1="$ac_cv_path_$1" -if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then - AC_MSG_RESULT([$][$1]) -else - AC_MSG_RESULT([no]) -fi -AC_SUBST([$1])dnl -]) diff --git a/tools/missing-macros/src/m4/stdint_h.m4 b/tools/missing-macros/src/m4/stdint_h.m4 deleted file mode 100644 index b8e3c6cc71..0000000000 --- a/tools/missing-macros/src/m4/stdint_h.m4 +++ /dev/null @@ -1,26 +0,0 @@ -# stdint_h.m4 serial 8 -dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl From Paul Eggert. - -# Define HAVE_STDINT_H_WITH_UINTMAX if exists, -# doesn't clash with , and declares uintmax_t. - -AC_DEFUN([gl_AC_HEADER_STDINT_H], -[ - AC_CACHE_CHECK([for stdint.h], [gl_cv_header_stdint_h], - [AC_TRY_COMPILE( - [#include -#include ], - [uintmax_t i = (uintmax_t) -1; return !i;], - [gl_cv_header_stdint_h=yes], - [gl_cv_header_stdint_h=no])]) - if test $gl_cv_header_stdint_h = yes; then - AC_DEFINE_UNQUOTED([HAVE_STDINT_H_WITH_UINTMAX], [1], - [Define if exists, doesn't clash with , - and declares uintmax_t. ]) - fi -]) diff --git a/tools/missing-macros/src/m4/wint_t.m4 b/tools/missing-macros/src/m4/wint_t.m4 deleted file mode 100644 index a6c7d15cb5..0000000000 --- a/tools/missing-macros/src/m4/wint_t.m4 +++ /dev/null @@ -1,28 +0,0 @@ -# wint_t.m4 serial 4 (gettext-0.18) -dnl Copyright (C) 2003, 2007-2010 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl From Bruno Haible. -dnl Test whether has the 'wint_t' type. -dnl Prerequisite: AC_PROG_CC - -AC_DEFUN([gt_TYPE_WINT_T], -[ - AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t], - [AC_TRY_COMPILE([ -/* Tru64 with Desktop Toolkit C has a bug: must be included before - . - BSD/OS 4.0.1 has a bug: , and must be included - before . */ -#include -#include -#include -#include - wint_t foo = (wchar_t)'\0';], , - [gt_cv_c_wint_t=yes], [gt_cv_c_wint_t=no])]) - if test $gt_cv_c_wint_t = yes; then - AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.]) - fi -]) diff --git a/tools/mkimage/Makefile b/tools/mkimage/Makefile index 1ff10c8e29..c451795cc9 100644 --- a/tools/mkimage/Makefile +++ b/tools/mkimage/Makefile @@ -7,26 +7,36 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mkimage -PKG_VERSION:=2022.01 +PKG_VERSION:=2023.04 PKG_SOURCE:=u-boot-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:= \ https://mirror.cyberbits.eu/u-boot \ https://ftp.denx.de/pub/u-boot \ ftp://ftp.denx.de/pub/u-boot -PKG_HASH:=81b4543227db228c03f8a1bf5ddbc813b0bb8f6555ce46064ef721a6fc680413 +PKG_HASH:=e31cac91545ff41b71cec5d8c22afd695645cd6e2a442ccdacacd60534069341 HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/u-boot-$(PKG_VERSION) include $(INCLUDE_DIR)/host-build.mk +define Host/Configure + $(MAKE) -C $(HOST_BUILD_DIR) \ + HOSTCFLAGS="$(HOST_CFLAGS)" \ + HOSTLDFLAGS="$(HOST_LDFLAGS)" \ + PKG_CONFIG_EXTRAARGS="--static" \ + V=$(if $(findstring c,$(LIBRECMC_VERBOSE)),1) \ + tools-only_config + + sed -i 's/CONFIG_TOOLS_MKEFICAPSULE=y/# CONFIG_TOOLS_MKEFICAPSULE is not set/' $(HOST_BUILD_DIR)/.config +endef + define Host/Compile $(MAKE) -C $(HOST_BUILD_DIR) \ HOSTCFLAGS="$(HOST_CFLAGS)" \ HOSTLDFLAGS="$(HOST_LDFLAGS)" \ PKG_CONFIG_EXTRAARGS="--static" \ V=$(if $(findstring c,$(LIBRECMC_VERBOSE)),1) \ - tools-only_config \ tools-only endef diff --git a/tools/mkimage/patches/030-allow-to-use-different-magic.patch b/tools/mkimage/patches/030-allow-to-use-different-magic.patch index 936113595a..c33b0f4327 100644 --- a/tools/mkimage/patches/030-allow-to-use-different-magic.patch +++ b/tools/mkimage/patches/030-allow-to-use-different-magic.patch @@ -2,7 +2,7 @@ This patch makes it possible to set a custom image magic. --- a/tools/mkimage.c +++ b/tools/mkimage.c -@@ -24,6 +24,7 @@ static struct image_tool_params params = +@@ -26,6 +26,7 @@ static struct image_tool_params params = .arch = IH_ARCH_PPC, .type = IH_TYPE_KERNEL, .comp = IH_COMP_GZIP, @@ -10,8 +10,8 @@ This patch makes it possible to set a custom image magic. .dtc = MKIMAGE_DEFAULT_DTC_OPTIONS, .imagename = "", .imagename2 = "", -@@ -85,11 +86,12 @@ static void usage(const char *msg) - " -l ==> list image header information\n", +@@ -89,11 +90,12 @@ static void usage(const char *msg) + " -q ==> quiet\n", params.cmdname); fprintf(stderr, - " %s [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image\n" @@ -24,16 +24,16 @@ This patch makes it possible to set a custom image magic. " -a ==> set load address to 'addr' (hex)\n" " -e ==> set entry point to 'ep' (hex)\n" " -n ==> set image name to 'name'\n" -@@ -155,7 +157,7 @@ static void process_args(int argc, char - int opt; +@@ -159,7 +161,7 @@ static int add_content(int type, const c + } - while ((opt = getopt(argc, argv, -- "a:A:b:B:c:C:d:D:e:Ef:FG:k:i:K:ln:N:p:O:rR:qstT:vVx")) != -1) { -+ "a:A:b:B:c:C:d:D:e:Ef:FG:k:i:K:lM:n:N:p:O:rR:qstT:vVx")) != -1) { - switch (opt) { - case 'a': - params.addr = strtoull(optarg, &ptr, 16); -@@ -245,6 +247,14 @@ static void process_args(int argc, char + static const char optstring[] = +- "a:A:b:B:c:C:d:D:e:Ef:Fg:G:i:k:K:ln:N:o:O:p:qrR:stT:vVx"; ++ "a:A:b:B:c:C:d:D:e:Ef:Fg:G:i:k:K:lM:n:N:o:O:p:qrR:stT:vVx"; + + static const struct option longopts[] = { + { "load-address", required_argument, NULL, 'a' }, +@@ -302,6 +304,14 @@ static void process_args(int argc, char case 'l': params.lflag = 1; break; @@ -50,7 +50,16 @@ This patch makes it possible to set a custom image magic. break; --- a/tools/default_image.c +++ b/tools/default_image.c -@@ -120,7 +120,7 @@ static void image_set_header(void *ptr, +@@ -63,7 +63,7 @@ static int image_verify_header(unsigned + */ + memcpy(hdr, ptr, sizeof(struct legacy_img_hdr)); + +- if (be32_to_cpu(hdr->ih_magic) != IH_MAGIC) { ++ if (be32_to_cpu(hdr->ih_magic) != params->magic) { + debug("%s: Bad Magic Number: \"%s\" is no valid image\n", + params->cmdname, params->imagefile); + return -FDT_ERR_BADMAGIC; +@@ -142,7 +142,7 @@ static void image_set_header(void *ptr, } /* Build new header */ @@ -61,7 +70,7 @@ This patch makes it possible to set a custom image magic. image_set_load(hdr, addr); --- a/tools/imagetool.h +++ b/tools/imagetool.h -@@ -56,6 +56,7 @@ struct image_tool_params { +@@ -67,6 +67,7 @@ struct image_tool_params { int arch; int type; int comp; diff --git a/tools/mkimage/patches/090-macos-arm64-builing-fix.patch b/tools/mkimage/patches/090-macos-arm64-builing-fix.patch deleted file mode 100644 index 9f842146f7..0000000000 --- a/tools/mkimage/patches/090-macos-arm64-builing-fix.patch +++ /dev/null @@ -1,21 +0,0 @@ -This patch fixes compilation issues on MacOS arm64. -Based on discussion -https://github.com/u-boot/u-boot/commit/3b142045e8a7f0ab17b6099e9226296af45967d0 - ---- a/tools/imagetool.h -+++ b/tools/imagetool.h -@@ -272,11 +272,14 @@ int rockchip_copy_image(int fd, struct i - * b) we need a API call to get the respective section symbols */ - #if defined(__MACH__) - #include -+#include - - #define INIT_SECTION(name) do { \ - unsigned long name ## _len; \ - char *__cat(pstart_, name) = getsectdata("__DATA", \ - #name, &__cat(name, _len)); \ -+ __cat(pstart_, name) += \ -+ _dyld_get_image_vmaddr_slide(0); \ - char *__cat(pstop_, name) = __cat(pstart_, name) + \ - __cat(name, _len); \ - __cat(__start_, name) = (void *)__cat(pstart_, name); \ diff --git a/tools/mkimage/patches/100-increase-tmpfile-name-length-limit.patch b/tools/mkimage/patches/100-increase-tmpfile-name-length-limit.patch index d375f40f61..aae8935601 100644 --- a/tools/mkimage/patches/100-increase-tmpfile-name-length-limit.patch +++ b/tools/mkimage/patches/100-increase-tmpfile-name-length-limit.patch @@ -1,7 +1,7 @@ --- a/tools/mkimage.h +++ b/tools/mkimage.h -@@ -42,7 +42,7 @@ static inline ulong map_to_sysmem(void * - } +@@ -44,7 +44,7 @@ static inline ulong map_to_sysmem(void * + #define ALLOC_CACHE_ALIGN_BUFFER(type, name, size) type name[size] #define MKIMAGE_TMPFILE_SUFFIX ".tmp" -#define MKIMAGE_MAX_TMPFILE_LEN 256 diff --git a/tools/mpc/Makefile b/tools/mpc/Makefile index 733c14173b..97e94291cb 100644 --- a/tools/mpc/Makefile +++ b/tools/mpc/Makefile @@ -7,11 +7,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mpc -PKG_VERSION:=1.2.1 +PKG_VERSION:=1.3.1 PKG_SOURCE_URL:=@GNU/mpc/ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_HASH:=17503d2c395dfcf106b622dc142683c1199431d095367c6aacba6eec30340459 +PKG_HASH:=ab642492f5cf882b74aa0cb730cd410a81edcdbec895183ce930e706c1c759b8 HOST_BUILD_PARALLEL:=1 @@ -22,7 +22,11 @@ unexport CFLAGS HOST_CONFIGURE_ARGS += \ --enable-static \ --disable-shared \ - --with-mpfr=$(TOPDIR)/staging_dir/host \ - --with-gmp=$(TOPDIR)/staging_dir/host + --with-mpfr=$(STAGING_DIR_HOST) \ + --with-gmp=$(STAGING_DIR_HOST) + +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef $(eval $(call HostBuild)) diff --git a/tools/mpfr/Makefile b/tools/mpfr/Makefile index 65e6f8959f..cdcca5f11a 100644 --- a/tools/mpfr/Makefile +++ b/tools/mpfr/Makefile @@ -7,12 +7,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mpfr -PKG_VERSION:=4.1.0 +PKG_VERSION:=4.2.0 PKG_CPE_ID:=cpe:/a:mpfr:gnu_mpfr PKG_SOURCE_URL:=@GNU/mpfr http://www.mpfr.org/mpfr-$(PKG_VERSION) PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_HASH:=0c98a3f1732ff6ca4ea690552079da9c597872d30e96ec28414ee23c95558a7f +PKG_HASH:=06a378df13501248c1b2db5aa977a2c8126ae849a9d9b7be2546fb4a9c26d993 HOST_BUILD_PARALLEL:=1 HOST_FIXUP:=autoreconf @@ -25,4 +25,8 @@ HOST_CONFIGURE_ARGS += \ --enable-thread-safe \ --with-gmp=$(STAGING_DIR_HOST) +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/mpfr/patches/001-only_src.patch b/tools/mpfr/patches/001-only_src.patch index dbc7d32343..bd9e38aefb 100644 --- a/tools/mpfr/patches/001-only_src.patch +++ b/tools/mpfr/patches/001-only_src.patch @@ -1,6 +1,6 @@ --- a/Makefile.am +++ b/Makefile.am -@@ -24,7 +24,7 @@ AUTOMAKE_OPTIONS = gnu +@@ -38,7 +38,7 @@ AUTOMAKE_OPTIONS = gnu # old Automake version. ACLOCAL_AMFLAGS = -I m4 @@ -11,7 +11,7 @@ pkgconfig_DATA = mpfr.pc --- a/Makefile.in +++ b/Makefile.in -@@ -384,7 +384,7 @@ AUTOMAKE_OPTIONS = gnu +@@ -401,7 +401,7 @@ AUTOMAKE_OPTIONS = gnu # libtoolize and in case some developer needs to switch back to an # old Automake version. ACLOCAL_AMFLAGS = -I m4 diff --git a/tools/mtd-utils/Makefile b/tools/mtd-utils/Makefile index 7eebcfb827..9010801976 100644 --- a/tools/mtd-utils/Makefile +++ b/tools/mtd-utils/Makefile @@ -7,12 +7,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mtd-utils -PKG_VERSION:=2.1.2 +PKG_VERSION:=2.1.5 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -PKG_SOURCE_URL:=ftp://ftp.infradead.org/pub/mtd-utils/ -PKG_HASH:=8ad4c5f34716d40646aa28724a2f5616d325a6f119254f914e26976f1f76e9d6 +PKG_SOURCE_URL:=https://infraroot.at/pub/mtd/ +PKG_HASH:=386e27fd121699b6b729bc2e8e04dda987b31cca6b16e12fb6cc6dcf26449f46 +PKG_CPE_ID:=cpe:/a:mtd-utils_project:mtd-utils PKG_FIXUP:=autoreconf diff --git a/tools/mtd-utils/patches/110-portability.patch b/tools/mtd-utils/patches/110-portability.patch index 181e40653a..73b97796a2 100644 --- a/tools/mtd-utils/patches/110-portability.patch +++ b/tools/mtd-utils/patches/110-portability.patch @@ -70,7 +70,7 @@ #include --- a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c +++ b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c -@@ -1549,6 +1549,7 @@ static int add_inode(struct stat *st, in +@@ -1541,6 +1541,7 @@ static int add_inode(struct stat *st, in if (c->default_compr != UBIFS_COMPR_NONE) use_flags |= UBIFS_COMPR_FL; @@ -78,7 +78,7 @@ if (flags & FS_COMPR_FL) use_flags |= UBIFS_COMPR_FL; if (flags & FS_SYNC_FL) -@@ -1561,6 +1562,7 @@ static int add_inode(struct stat *st, in +@@ -1553,6 +1554,7 @@ static int add_inode(struct stat *st, in use_flags |= UBIFS_DIRSYNC_FL; if (fctx) use_flags |= UBIFS_CRYPT_FL; @@ -86,7 +86,7 @@ memset(ino, 0, UBIFS_INO_NODE_SZ); ino_key_init(&key, inum); -@@ -1646,7 +1648,9 @@ static int add_dir_inode(const char *pat +@@ -1638,7 +1640,9 @@ static int add_dir_inode(const char *pat fd = dirfd(dir); if (fd == -1) return sys_err_msg("dirfd failed"); @@ -96,7 +96,7 @@ flags = 0; } -@@ -1857,6 +1861,7 @@ static int add_file(const char *path_nam +@@ -1849,6 +1853,7 @@ static int add_file(const char *path_nam dn->ch.node_type = UBIFS_DATA_NODE; key_write(&key, &dn->key); out_len = NODE_BUFFER_SIZE - UBIFS_DATA_NODE_SZ; @@ -104,7 +104,7 @@ if (c->default_compr == UBIFS_COMPR_NONE && !c->encrypted && (flags & FS_COMPR_FL)) #ifdef WITHOUT_LZO -@@ -1865,6 +1870,7 @@ static int add_file(const char *path_nam +@@ -1857,6 +1862,7 @@ static int add_file(const char *path_nam use_compr = UBIFS_COMPR_LZO; #endif else @@ -112,7 +112,7 @@ use_compr = c->default_compr; compr_type = compress_data(buf, bytes_read, &dn->data, &out_len, use_compr); -@@ -1924,7 +1930,9 @@ static int add_non_dir(const char *path_ +@@ -1916,7 +1922,9 @@ static int add_non_dir(const char *path_ if (fd == -1) return sys_err_msg("failed to open file '%s'", path_name); diff --git a/tools/mtd-utils/patches/130-lzma_jffs2.patch b/tools/mtd-utils/patches/130-lzma_jffs2.patch index 9778aa6d0a..db683063d5 100644 --- a/tools/mtd-utils/patches/130-lzma_jffs2.patch +++ b/tools/mtd-utils/patches/130-lzma_jffs2.patch @@ -1,6 +1,6 @@ --- a/jffsX-utils/Makemodule.am +++ b/jffsX-utils/Makemodule.am -@@ -4,11 +4,19 @@ mkfs_jffs2_SOURCES = \ +@@ -4,7 +4,10 @@ mkfs_jffs2_SOURCES = \ jffsX-utils/compr_zlib.c \ jffsX-utils/compr.h \ jffsX-utils/rbtree.c \ @@ -10,7 +10,12 @@ + jffsX-utils/lzma/LzmaEnc.c \ + jffsX-utils/lzma/LzmaDec.c \ jffsX-utils/compr.c \ - jffsX-utils/compr_rtime.c + jffsX-utils/compr_rtime.c \ + jffsX-utils/compr.h \ +@@ -12,8 +15,13 @@ mkfs_jffs2_SOURCES = \ + jffsX-utils/summary.h \ + include/linux/jffs2.h \ + include/mtd/jffs2-user.h + +if !WITHOUT_LZO +mkfs_jffs2_SOURCES += jffsX-utils/compr_lzo.c @@ -20,7 +25,7 @@ -mkfs_jffs2_CPPFLAGS = $(AM_CPPFLAGS) $(ZLIB_CFLAGS) $(LZO_CFLAGS) +mkfs_jffs2_CPPFLAGS = $(AM_CPPFLAGS) $(ZLIB_CFLAGS) $(LZO_CFLAGS) -I./include/linux/lzma - jffs2reader_SOURCES = jffsX-utils/jffs2reader.c + jffs2reader_SOURCES = jffsX-utils/jffs2reader.c include/mtd/jffs2-user.h jffs2reader_LDADD = libmtd.a $(ZLIB_LIBS) $(LZO_LIBS) --- a/jffsX-utils/compr.c +++ b/jffsX-utils/compr.c @@ -5015,7 +5020,7 @@ +} --- a/jffsX-utils/mkfs.jffs2.c +++ b/jffsX-utils/mkfs.jffs2.c -@@ -1667,11 +1667,11 @@ int main(int argc, char **argv) +@@ -1668,11 +1668,11 @@ int main(int argc, char **argv) } erase_block_size *= units; diff --git a/tools/mtd-utils/patches/320-mkfs.jffs2-SOURCE_DATE_EPOCH.patch b/tools/mtd-utils/patches/320-mkfs.jffs2-SOURCE_DATE_EPOCH.patch index f3ba4d3276..a1703eb64f 100644 --- a/tools/mtd-utils/patches/320-mkfs.jffs2-SOURCE_DATE_EPOCH.patch +++ b/tools/mtd-utils/patches/320-mkfs.jffs2-SOURCE_DATE_EPOCH.patch @@ -20,7 +20,7 @@ } entry = xcalloc(1, sizeof(struct filesystem_entry)); -@@ -1558,6 +1558,20 @@ static void parse_image(void){ +@@ -1559,6 +1559,20 @@ static void parse_image(void){ close(in_fd); } @@ -41,7 +41,7 @@ int main(int argc, char **argv) { int c, opt; -@@ -1576,6 +1590,7 @@ int main(int argc, char **argv) +@@ -1577,6 +1591,7 @@ int main(int argc, char **argv) warn_page_size = 1; /* warn user if page size not 4096 */ jffs2_compressors_init(); @@ -49,7 +49,7 @@ while ((opt = getopt_long(argc, argv, "D:d:r:s:o:qUPfh?vVe:lbp::nc:m:x:X:Lty:i:", long_options, &c)) >= 0) -@@ -1626,7 +1641,7 @@ int main(int argc, char **argv) +@@ -1627,7 +1642,7 @@ int main(int argc, char **argv) break; case 'f': diff --git a/tools/mtools/Makefile b/tools/mtools/Makefile index db364c9c93..b810918b98 100644 --- a/tools/mtools/Makefile +++ b/tools/mtools/Makefile @@ -7,11 +7,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mtools -PKG_VERSION:=4.0.39 +PKG_VERSION:=4.0.43 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=@GNU/$(PKG_NAME) -PKG_HASH:=397f1e2b7b7a2a270eb7970fa363e445f956926ec51e8170c3869da85b0987bd +PKG_HASH:=541e179665dc4e272b9602f2074243591a157da89cc47064da8c5829dbd2b339 HOST_BUILD_PARALLEL:=1 diff --git a/tools/ninja/Makefile b/tools/ninja/Makefile index 853467452e..07560d5f62 100644 --- a/tools/ninja/Makefile +++ b/tools/ninja/Makefile @@ -1,12 +1,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ninja -PKG_VERSION:=1.10.2 +PKG_VERSION:=1.11.1 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/ninja-build/ninja/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=ce35865411f0490368a8fc383f29071de6690cbadc27704734978221f25e2bed +PKG_HASH:=31747ae633213f1eda3842686f83c2aa1412e0f5691d1c14dbbcc67fe7400cea include $(INCLUDE_DIR)/host-build.mk diff --git a/tools/ninja/patches/100-make_jobserver_support.patch b/tools/ninja/patches/100-make_jobserver_support.patch index ecceaf23ca..34d2b6c431 100644 --- a/tools/ninja/patches/100-make_jobserver_support.patch +++ b/tools/ninja/patches/100-make_jobserver_support.patch @@ -1,7 +1,7 @@ -From c1a081c00f803fc28e51f155f25abe8346ce5f13 Mon Sep 17 00:00:00 2001 +From afec30f5caf4b051827ffdd822ebd27c58219fee Mon Sep 17 00:00:00 2001 From: Stefan Becker Date: Tue, 22 Mar 2016 13:48:07 +0200 -Subject: [PATCH] Add GNU make jobserver client support +Subject: [PATCH 01/11] Add GNU make jobserver client support - add new TokenPool interface - GNU make implementation for TokenPool parses and verifies the magic @@ -19,184 +19,23 @@ Documentation for GNU make jobserver http://make.mad-scientist.net/papers/jobserver-implementation/ Fixes https://github.com/ninja-build/ninja/issues/1139 - -Add TokenPool monitoring to SubprocessSet::DoWork() - -Improve on the original jobserver client implementation. This makes -ninja a more aggressive GNU make jobserver client. - -- add monitor interface to TokenPool -- TokenPool is passed down when main loop indicates that more work is - ready and would be allowed to start if a token becomes available -- posix: update DoWork() to monitor TokenPool read file descriptor -- WaitForCommand() exits when DoWork() sets token flag -- Main loop starts over when WaitForCommand() sets token exit status - -Ignore jobserver when -jN is forced on command line - -This emulates the behaviour of GNU make. - -- add parallelism_from_cmdline flag to build configuration -- set the flag when -jN is given on command line -- pass the flag to TokenPool::Get() -- GNUmakeTokenPool::Setup() - * prints a warning when the flag is true and jobserver was detected - * returns false, i.e. jobserver will be ignored -- ignore config.parallelism in CanRunMore() when we have a valid - TokenPool, because it gets always initialized to a default when not - given on the command line - -Honor -lN from MAKEFLAGS - -This emulates the behaviour of GNU make. - -- build: make a copy of max_load_average and pass it to TokenPool. -- GNUmakeTokenPool: if we detect a jobserver and a valid -lN argument in - MAKEFLAGS then set max_load_average to N. - -Use LinePrinter for TokenPool messages - -- replace printf() with calls to LinePrinter -- print GNU make jobserver message only when verbose build is requested - -Prepare PR for merging - -- fix Windows build error in no-op TokenPool implementation -- improve Acquire() to block for a maximum of 100ms -- address review comments - -Add tests for TokenPool - -- TokenPool setup -- GetMonitorFd() API -- implicit token and tokens in jobserver pipe -- Acquire() / Reserve() / Release() protocol -- Clear() API - -Add tests for subprocess module - -- add TokenPoolTest stub to provide TokenPool::GetMonitorFd() -- add two tests - * both tests set up a dummy GNUmake jobserver pipe - * both tests call DoWork() with TokenPoolTest - * test 1: verify that DoWork() detects when a token is available - * test 2: verify that DoWork() works as before without a token -- the tests are not compiled in under Windows - -Add tests for build module - -Add tests that verify the token functionality of the builder main loop. -We replace the default fake command runner with a special version where -the tests can control each call to AcquireToken(), CanRunMore() and -WaitForCommand(). - -Add Win32 implementation for GNUmakeTokenPool - -GNU make uses a semaphore as jobserver protocol on Win32. See also - - https://www.gnu.org/software/make/manual/html_node/Windows-Jobserver.html - -Usage is pretty simple and straightforward, i.e. WaitForSingleObject() -to obtain a token and ReleaseSemaphore() to return it. - -Unfortunately subprocess-win32.cc uses an I/O completion port (IOCP). -IOCPs aren't waitable objects, i.e. we can't use WaitForMultipleObjects() -to wait on the IOCP and the token semaphore at the same time. - -Therefore GNUmakeTokenPoolWin32 creates a child thread that waits on the -token semaphore and posts a dummy I/O completion status on the IOCP when -it was able to obtain a token. That unblocks SubprocessSet::DoWork() and -it can then check if a token became available or not. - -- split existing GNUmakeTokenPool into common and platform bits -- add GNUmakeTokenPool interface -- move the Posix bits to GNUmakeTokenPoolPosix -- add the Win32 bits as GNUmakeTokenPoolWin32 -- move Setup() method up to TokenPool interface -- update Subprocess & TokenPool tests accordingly - -Prepare PR for merging - part II - -- remove unnecessary "struct" from TokenPool -- add PAPCFUNC cast to QueryUserAPC() -- remove hard-coded MAKEFLAGS string from win32 -- remove useless build test CompleteNoWork -- rename TokenPoolTest to TestTokenPool -- add tokenpool modules to CMake build -- remove unused no-op TokenPool implementation -- address review comments from - -https://github.com/ninja-build/ninja/pull/1140#pullrequestreview-195195803 -https://github.com/ninja-build/ninja/pull/1140#pullrequestreview-185089255 -https://github.com/ninja-build/ninja/pull/1140#issuecomment-473898963 -https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 --- - CMakeLists.txt | 8 +- - configure.py | 7 +- - src/build.cc | 127 ++++++++--- - src/build.h | 12 +- - src/build_test.cc | 363 +++++++++++++++++++++++++++++++- - src/exit_status.h | 3 +- - src/ninja.cc | 1 + - src/subprocess-posix.cc | 33 ++- - src/subprocess-win32.cc | 11 +- - src/subprocess.h | 8 +- - src/subprocess_test.cc | 149 +++++++++++-- - src/tokenpool-gnu-make-posix.cc | 202 ++++++++++++++++++ - src/tokenpool-gnu-make-win32.cc | 239 +++++++++++++++++++++ - src/tokenpool-gnu-make.cc | 108 ++++++++++ - src/tokenpool-gnu-make.h | 40 ++++ - src/tokenpool.h | 42 ++++ - src/tokenpool_test.cc | 269 +++++++++++++++++++++++ - 17 files changed, 1562 insertions(+), 60 deletions(-) - create mode 100644 src/tokenpool-gnu-make-posix.cc - create mode 100644 src/tokenpool-gnu-make-win32.cc + configure.py | 2 + + src/build.cc | 63 ++++++++---- + src/build.h | 3 + + src/tokenpool-gnu-make.cc | 211 ++++++++++++++++++++++++++++++++++++++ + src/tokenpool-none.cc | 27 +++++ + src/tokenpool.h | 26 +++++ + 6 files changed, 310 insertions(+), 22 deletions(-) create mode 100644 src/tokenpool-gnu-make.cc - create mode 100644 src/tokenpool-gnu-make.h + create mode 100644 src/tokenpool-none.cc create mode 100644 src/tokenpool.h - create mode 100644 src/tokenpool_test.cc ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -94,6 +94,7 @@ add_library(libninja OBJECT - src/parser.cc - src/state.cc - src/string_piece_util.cc -+ src/tokenpool-gnu-make.cc - src/util.cc - src/version.cc - ) -@@ -104,12 +105,16 @@ if(WIN32) - src/msvc_helper-win32.cc - src/msvc_helper_main-win32.cc - src/getopt.c -+ src/tokenpool-gnu-make-win32.cc - ) - if(MSVC) - target_sources(libninja PRIVATE src/minidump-win32.cc) - endif() - else() -- target_sources(libninja PRIVATE src/subprocess-posix.cc) -+ target_sources(libninja PRIVATE -+ src/subprocess-posix.cc -+ src/tokenpool-gnu-make-posix.cc -+ ) - if(CMAKE_SYSTEM_NAME STREQUAL "OS400" OR CMAKE_SYSTEM_NAME STREQUAL "AIX") - target_sources(libninja PRIVATE src/getopt.c) - endif() -@@ -182,6 +187,7 @@ if(BUILD_TESTING) - src/string_piece_util_test.cc - src/subprocess_test.cc - src/test.cc -+ src/tokenpool_test.cc - src/util_test.cc - ) - if(WIN32) --- a/configure.py +++ b/configure.py -@@ -514,11 +514,13 @@ for name in ['build', - 'parser', +@@ -517,11 +517,13 @@ for name in ['build', 'state', + 'status', 'string_piece_util', + 'tokenpool-gnu-make', 'util', @@ -208,7 +47,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 'includes_normalize-win32', 'msvc_helper-win32', 'msvc_helper_main-win32']: -@@ -527,7 +529,9 @@ if platform.is_windows(): +@@ -530,7 +532,9 @@ if platform.is_windows(): objs += cxx('minidump-win32', variables=cxxvariables) objs += cc('getopt') else: @@ -219,7 +58,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 if platform.is_aix(): objs += cc('getopt') if platform.is_msvc(): -@@ -582,6 +586,7 @@ for name in ['build_log_test', +@@ -588,6 +592,7 @@ for name in ['build_log_test', 'string_piece_util_test', 'subprocess_test', 'test', @@ -229,15 +68,15 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 if platform.is_windows(): --- a/src/build.cc +++ b/src/build.cc -@@ -38,6 +38,7 @@ - #include "graph.h" +@@ -35,6 +35,7 @@ #include "state.h" + #include "status.h" #include "subprocess.h" +#include "tokenpool.h" #include "util.h" using namespace std; -@@ -50,8 +51,9 @@ struct DryRunCommandRunner : public Comm +@@ -47,8 +48,9 @@ struct DryRunCommandRunner : public Comm // Overridden from CommandRunner: virtual bool CanRunMore() const; @@ -248,7 +87,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 private: queue finished_; -@@ -61,12 +63,16 @@ bool DryRunCommandRunner::CanRunMore() c +@@ -58,12 +60,16 @@ bool DryRunCommandRunner::CanRunMore() c return true; } @@ -266,16 +105,16 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 if (finished_.empty()) return false; -@@ -379,7 +385,7 @@ void Plan::EdgeWanted(const Edge* edge) +@@ -149,7 +155,7 @@ void Plan::EdgeWanted(const Edge* edge) } Edge* Plan::FindWork() { - if (ready_.empty()) + if (!more_ready()) return NULL; - set::iterator e = ready_.begin(); + EdgeSet::iterator e = ready_.begin(); Edge* edge = *e; -@@ -665,19 +671,39 @@ void Plan::Dump() const { +@@ -448,19 +454,39 @@ void Plan::Dump() const { } struct RealCommandRunner : public CommandRunner { @@ -318,7 +157,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 vector RealCommandRunner::GetActiveEdges() { vector edges; for (map::iterator e = subproc_to_edge_.begin(); -@@ -688,14 +714,23 @@ vector RealCommandRunner::GetActi +@@ -471,14 +497,23 @@ vector RealCommandRunner::GetActi void RealCommandRunner::Abort() { subprocs_.Clear(); @@ -347,7 +186,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 } bool RealCommandRunner::StartCommand(Edge* edge) { -@@ -703,19 +738,33 @@ bool RealCommandRunner::StartCommand(Edg +@@ -486,19 +521,33 @@ bool RealCommandRunner::StartCommand(Edg Subprocess* subproc = subprocs_.Add(command, edge->use_console()); if (!subproc) return false; @@ -384,7 +223,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 result->status = subproc->Finish(); result->output = subproc->GetOutput(); -@@ -825,38 +874,42 @@ bool Builder::Build(string* err) { +@@ -620,38 +669,43 @@ bool Builder::Build(string* err) { // command runner. // Second, we attempt to wait for / reap the next finished command. while (plan_.more_to_do()) { @@ -392,8 +231,6 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 - if (failures_allowed && command_runner_->CanRunMore()) { - if (Edge* edge = plan_.FindWork()) { - if (edge->GetBindingBool("generator")) { -- scan_.build_log()->Close(); -- } + // See if we can start any more commands... + bool can_run_more = + failures_allowed && @@ -404,15 +241,16 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 + if (can_run_more && command_runner_->AcquireToken()) { + Edge* edge = plan_.FindWork(); + if (edge->GetBindingBool("generator")) { -+ scan_.build_log()->Close(); -+ } + scan_.build_log()->Close(); + } + +- if (!StartEdge(edge, err)) { + if (!StartEdge(edge, err)) { + Cleanup(); + status_->BuildFinished(); + return false; + } - -- if (!StartEdge(edge, err)) { ++ + if (edge->is_phony()) { + if (!plan_.EdgeFinished(edge, Plan::kEdgeSucceeded, err)) { Cleanup(); @@ -448,7 +286,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 result.status == ExitInterrupted) { Cleanup(); status_->BuildFinished(); -@@ -864,6 +917,10 @@ bool Builder::Build(string* err) { +@@ -659,6 +713,10 @@ bool Builder::Build(string* err) { return false; } @@ -461,7 +299,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 Cleanup(); --- a/src/build.h +++ b/src/build.h -@@ -55,6 +55,9 @@ struct Plan { +@@ -52,6 +52,9 @@ struct Plan { /// Returns true if there's more work to be done. bool more_to_do() const { return wanted_edges_ > 0 && command_edges_ > 0; } @@ -471,7 +309,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 /// Dumps the current state of the plan. void Dump() const; -@@ -139,6 +142,7 @@ private: +@@ -136,6 +139,7 @@ private: struct CommandRunner { virtual ~CommandRunner() {} virtual bool CanRunMore() const = 0; @@ -479,7 +317,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 virtual bool StartCommand(Edge* edge) = 0; /// The result of waiting for a command. -@@ -150,7 +154,9 @@ struct CommandRunner { +@@ -147,7 +151,9 @@ struct CommandRunner { bool success() const { return status == ExitSuccess; } }; /// Wait for a command to complete, or return false if interrupted. @@ -490,7 +328,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 virtual std::vector GetActiveEdges() { return std::vector(); } virtual void Abort() {} -@@ -158,7 +164,8 @@ struct CommandRunner { +@@ -155,7 +161,8 @@ struct CommandRunner { /// Options (e.g. verbosity, parallelism) passed to a build. struct BuildConfig { @@ -500,7 +338,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 failures_allowed(1), max_load_average(-0.0f) {} enum Verbosity { -@@ -169,6 +176,7 @@ struct BuildConfig { +@@ -167,6 +174,7 @@ struct BuildConfig { Verbosity verbosity; bool dry_run; int parallelism; @@ -508,6 +346,162 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 int failures_allowed; /// The maximum load average we must not exceed. A negative value /// means that we do not have any limit. +--- /dev/null ++++ b/src/tokenpool-gnu-make.cc +@@ -0,0 +1,108 @@ ++// Copyright 2016-2018 Google Inc. All Rights Reserved. ++// ++// Licensed under the Apache License, Version 2.0 (the "License"); ++// you may not use this file except in compliance with the License. ++// You may obtain a copy of the License at ++// ++// http://www.apache.org/licenses/LICENSE-2.0 ++// ++// Unless required by applicable law or agreed to in writing, software ++// distributed under the License is distributed on an "AS IS" BASIS, ++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++// See the License for the specific language governing permissions and ++// limitations under the License. ++ ++#include "tokenpool-gnu-make.h" ++ ++#include ++#include ++#include ++ ++#include "line_printer.h" ++ ++// TokenPool implementation for GNU make jobserver - common bits ++// every instance owns an implicit token -> available_ == 1 ++GNUmakeTokenPool::GNUmakeTokenPool() : available_(1), used_(0) { ++} ++ ++GNUmakeTokenPool::~GNUmakeTokenPool() { ++} ++ ++bool GNUmakeTokenPool::Setup(bool ignore, ++ bool verbose, ++ double& max_load_average) { ++ const char* value = GetEnv("MAKEFLAGS"); ++ if (!value) ++ return false; ++ ++ // GNU make <= 4.1 ++ const char* jobserver = strstr(value, "--jobserver-fds="); ++ if (!jobserver) ++ // GNU make => 4.2 ++ jobserver = strstr(value, "--jobserver-auth="); ++ if (jobserver) { ++ LinePrinter printer; ++ ++ if (ignore) { ++ printer.PrintOnNewLine("ninja: warning: -jN forced on command line; ignoring GNU make jobserver.\n"); ++ } else { ++ if (ParseAuth(jobserver)) { ++ const char* l_arg = strstr(value, " -l"); ++ int load_limit = -1; ++ ++ if (verbose) { ++ printer.PrintOnNewLine("ninja: using GNU make jobserver.\n"); ++ } ++ ++ // translate GNU make -lN to ninja -lN ++ if (l_arg && ++ (sscanf(l_arg + 3, "%d ", &load_limit) == 1) && ++ (load_limit > 0)) { ++ max_load_average = load_limit; ++ } ++ ++ return true; ++ } ++ } ++ } ++ ++ return false; ++} ++ ++bool GNUmakeTokenPool::Acquire() { ++ if (available_ > 0) ++ return true; ++ ++ if (AcquireToken()) { ++ // token acquired ++ available_++; ++ return true; ++ } ++ ++ // no token available ++ return false; ++} ++ ++void GNUmakeTokenPool::Reserve() { ++ available_--; ++ used_++; ++} ++ ++void GNUmakeTokenPool::Return() { ++ if (ReturnToken()) ++ available_--; ++} ++ ++void GNUmakeTokenPool::Release() { ++ available_++; ++ used_--; ++ if (available_ > 1) ++ Return(); ++} ++ ++void GNUmakeTokenPool::Clear() { ++ while (used_ > 0) ++ Release(); ++ while (available_ > 1) ++ Return(); ++} +--- /dev/null ++++ b/src/tokenpool.h +@@ -0,0 +1,42 @@ ++// Copyright 2016-2018 Google Inc. All Rights Reserved. ++// ++// Licensed under the Apache License, Version 2.0 (the "License"); ++// you may not use this file except in compliance with the License. ++// You may obtain a copy of the License at ++// ++// http://www.apache.org/licenses/LICENSE-2.0 ++// ++// Unless required by applicable law or agreed to in writing, software ++// distributed under the License is distributed on an "AS IS" BASIS, ++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++// See the License for the specific language governing permissions and ++// limitations under the License. ++ ++#ifdef _WIN32 ++#include ++#endif ++ ++// interface to token pool ++struct TokenPool { ++ virtual ~TokenPool() {} ++ ++ virtual bool Acquire() = 0; ++ virtual void Reserve() = 0; ++ virtual void Release() = 0; ++ virtual void Clear() = 0; ++ ++ // returns false if token pool setup failed ++ virtual bool Setup(bool ignore, bool verbose, double& max_load_average) = 0; ++ ++#ifdef _WIN32 ++ virtual void WaitForTokenAvailability(HANDLE ioport) = 0; ++ // returns true if a token has become available ++ // key is result from GetQueuedCompletionStatus() ++ virtual bool TokenIsAvailable(ULONG_PTR key) = 0; ++#else ++ virtual int GetMonitorFd() = 0; ++#endif ++ ++ // returns NULL if token pool is not available ++ static TokenPool* Get(); ++}; --- a/src/build_test.cc +++ b/src/build_test.cc @@ -15,6 +15,7 @@ @@ -518,7 +512,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 #include "build_log.h" #include "deps_log.h" -@@ -473,8 +474,9 @@ struct FakeCommandRunner : public Comman +@@ -474,8 +475,9 @@ struct FakeCommandRunner : public Comman // CommandRunner impl virtual bool CanRunMore() const; @@ -529,7 +523,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 virtual vector GetActiveEdges(); virtual void Abort(); -@@ -580,6 +582,10 @@ bool FakeCommandRunner::CanRunMore() con +@@ -578,6 +580,10 @@ bool FakeCommandRunner::CanRunMore() con return active_edges_.size() < max_active_edges_; } @@ -540,7 +534,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 bool FakeCommandRunner::StartCommand(Edge* edge) { assert(active_edges_.size() < max_active_edges_); assert(find(active_edges_.begin(), active_edges_.end(), edge) -@@ -625,7 +631,7 @@ bool FakeCommandRunner::StartCommand(Edg +@@ -649,7 +655,7 @@ bool FakeCommandRunner::StartCommand(Edg return true; } @@ -549,9 +543,9 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 if (active_edges_.empty()) return false; -@@ -3302,3 +3308,356 @@ TEST_F(BuildTest, DyndepTwoLevelDiscover - EXPECT_EQ("touch tmp", command_runner_.commands_ran_[3]); - EXPECT_EQ("touch out", command_runner_.commands_ran_[4]); +@@ -3985,3 +3991,356 @@ TEST_F(BuildTest, ValidationWithCircular + EXPECT_FALSE(builder_.AddTarget("out", &err)); + EXPECT_EQ("dependency cycle: validate -> validate_in -> validate", err); } + +/// The token tests are concerned with the main loop functionality when @@ -660,7 +654,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 + void ExpectWaitForCommand(int count, ...); + +private: -+ void EnqueueBooleans(vector& booleans, int count, va_list ao); ++ void EnqueueBooleans(vector& booleans, int count, va_list ap); +}; + +void BuildTokenTest::SetUp() { @@ -918,16 +912,6 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 }; #endif // NINJA_EXIT_STATUS_H_ ---- a/src/ninja.cc -+++ b/src/ninja.cc -@@ -1289,6 +1289,7 @@ int ReadFlags(int* argc, char*** argv, - // We want to run N jobs in parallel. For N = 0, INT_MAX - // is close enough to infinite for most sane builds. - config->parallelism = value > 0 ? value : INT_MAX; -+ config->parallelism_from_cmdline = true; - break; - } - case 'k': { --- a/src/subprocess-posix.cc +++ b/src/subprocess-posix.cc @@ -13,6 +13,7 @@ @@ -1063,7 +1047,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 Subprocess* Add(const std::string& command, bool use_console = false); - bool DoWork(); -+ bool DoWork(struct TokenPool* tokens); ++ bool DoWork(TokenPool* tokens); Subprocess* NextFinished(); void Clear(); @@ -1299,7 +1283,7 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 + subprocs_.DoWork(&tokens_); +#ifdef _WIN32 + tokens_._token_available = false; -+ // we need to loop here as we have no conrol where the token ++ // we need to loop here as we have no control where the token + // I/O completion post ends up in the queue + while (!subproc->Done() && !subprocs_.IsTokenAvailable()) { + subprocs_.DoWork(&tokens_); @@ -1359,10 +1343,20 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 + + EXPECT_EQ(1u, subprocs_.finished_.size()); +} +--- a/src/ninja.cc ++++ b/src/ninja.cc +@@ -1447,6 +1447,7 @@ int ReadFlags(int* argc, char*** argv, + // We want to run N jobs in parallel. For N = 0, INT_MAX + // is close enough to infinite for most sane builds. + config->parallelism = value > 0 ? value : INT_MAX; ++ config->parallelism_from_cmdline = true; + deferGuessParallelism.needGuess = false; + break; + } --- /dev/null -+++ b/src/tokenpool-gnu-make-posix.cc -@@ -0,0 +1,202 @@ -+// Copyright 2016-2018 Google Inc. All Rights Reserved. ++++ b/src/tokenpool_test.cc +@@ -0,0 +1,279 @@ ++// Copyright 2018 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. @@ -1376,439 +1370,274 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 +// See the License for the specific language governing permissions and +// limitations under the License. + -+#include "tokenpool-gnu-make.h" ++#include "tokenpool.h" + -+#include -+#include -+#include ++#include "test.h" ++ ++#ifdef _WIN32 ++#include ++#else +#include -+#include -+#include ++#endif ++ +#include -+#include +#include + -+// TokenPool implementation for GNU make jobserver - POSIX implementation -+// (http://make.mad-scientist.net/papers/jobserver-implementation/) -+struct GNUmakeTokenPoolPosix : public GNUmakeTokenPool { -+ GNUmakeTokenPoolPosix(); -+ virtual ~GNUmakeTokenPoolPosix(); -+ -+ virtual int GetMonitorFd(); -+ -+ virtual const char* GetEnv(const char* name) { return getenv(name); }; -+ virtual bool ParseAuth(const char* jobserver); -+ virtual bool AcquireToken(); -+ virtual bool ReturnToken(); -+ -+ private: -+ int rfd_; -+ int wfd_; -+ -+ struct sigaction old_act_; -+ bool restore_; -+ -+ static int dup_rfd_; -+ static void CloseDupRfd(int signum); -+ -+ bool CheckFd(int fd); -+ bool SetAlarmHandler(); -+}; -+ -+GNUmakeTokenPoolPosix::GNUmakeTokenPoolPosix() : rfd_(-1), wfd_(-1), restore_(false) { -+} -+ -+GNUmakeTokenPoolPosix::~GNUmakeTokenPoolPosix() { -+ Clear(); -+ if (restore_) -+ sigaction(SIGALRM, &old_act_, NULL); -+} ++#ifdef _WIN32 ++// should contain all valid characters ++#define SEMAPHORE_NAME "abcdefghijklmnopqrstwxyz01234567890_" ++#define AUTH_FORMAT(tmpl) "foo " tmpl "=%s bar" ++#define ENVIRONMENT_CLEAR() SetEnvironmentVariable("MAKEFLAGS", NULL) ++#define ENVIRONMENT_INIT(v) SetEnvironmentVariable("MAKEFLAGS", v) ++#else ++#define AUTH_FORMAT(tmpl) "foo " tmpl "=%d,%d bar" ++#define ENVIRONMENT_CLEAR() unsetenv("MAKEFLAGS") ++#define ENVIRONMENT_INIT(v) setenv("MAKEFLAGS", v, true) ++#endif + -+bool GNUmakeTokenPoolPosix::CheckFd(int fd) { -+ if (fd < 0) -+ return false; -+ int ret = fcntl(fd, F_GETFD); -+ if (ret < 0) -+ return false; -+ return true; -+} ++namespace { + -+int GNUmakeTokenPoolPosix::dup_rfd_ = -1; ++const double kLoadAverageDefault = -1.23456789; + -+void GNUmakeTokenPoolPosix::CloseDupRfd(int signum) { -+ close(dup_rfd_); -+ dup_rfd_ = -1; -+} ++struct TokenPoolTest : public testing::Test { ++ double load_avg_; ++ TokenPool* tokens_; ++ char buf_[1024]; ++#ifdef _WIN32 ++ const char* semaphore_name_; ++ HANDLE semaphore_; ++#else ++ int fds_[2]; + -+bool GNUmakeTokenPoolPosix::SetAlarmHandler() { -+ struct sigaction act; -+ memset(&act, 0, sizeof(act)); -+ act.sa_handler = CloseDupRfd; -+ if (sigaction(SIGALRM, &act, &old_act_) < 0) { -+ perror("sigaction:"); -+ return false; ++ char random() { ++ return int((rand() / double(RAND_MAX)) * 256); + } -+ restore_ = true; -+ return true; -+} ++#endif + -+bool GNUmakeTokenPoolPosix::ParseAuth(const char* jobserver) { -+ int rfd = -1; -+ int wfd = -1; -+ if ((sscanf(jobserver, "%*[^=]=%d,%d", &rfd, &wfd) == 2) && -+ CheckFd(rfd) && -+ CheckFd(wfd) && -+ SetAlarmHandler()) { -+ rfd_ = rfd; -+ wfd_ = wfd; -+ return true; ++ virtual void SetUp() { ++ load_avg_ = kLoadAverageDefault; ++ tokens_ = NULL; ++ ENVIRONMENT_CLEAR(); ++#ifdef _WIN32 ++ semaphore_name_ = SEMAPHORE_NAME; ++ if ((semaphore_ = CreateSemaphore(0, 0, 2, SEMAPHORE_NAME)) == NULL) ++#else ++ if (pipe(fds_) < 0) ++#endif ++ ASSERT_TRUE(false); + } + -+ return false; -+} -+ -+bool GNUmakeTokenPoolPosix::AcquireToken() { -+ // Please read -+ // -+ // http://make.mad-scientist.net/papers/jobserver-implementation/ -+ // -+ // for the reasoning behind the following code. -+ // -+ // Try to read one character from the pipe. Returns true on success. -+ // -+ // First check if read() would succeed without blocking. -+#ifdef USE_PPOLL -+ pollfd pollfds[] = {{rfd_, POLLIN, 0}}; -+ int ret = poll(pollfds, 1, 0); ++ void CreatePool(const char* format, bool ignore_jobserver = false) { ++ if (format) { ++ sprintf(buf_, format, ++#ifdef _WIN32 ++ semaphore_name_ +#else -+ fd_set set; -+ struct timeval timeout = { 0, 0 }; -+ FD_ZERO(&set); -+ FD_SET(rfd_, &set); -+ int ret = select(rfd_ + 1, &set, NULL, NULL, &timeout); ++ fds_[0], fds_[1] +#endif -+ if (ret > 0) { -+ // Handle potential race condition: -+ // - the above check succeeded, i.e. read() should not block -+ // - the character disappears before we call read() -+ // -+ // Create a duplicate of rfd_. The duplicate file descriptor dup_rfd_ -+ // can safely be closed by signal handlers without affecting rfd_. -+ dup_rfd_ = dup(rfd_); -+ -+ if (dup_rfd_ != -1) { -+ struct sigaction act, old_act; -+ int ret = 0; -+ -+ // Temporarily replace SIGCHLD handler with our own -+ memset(&act, 0, sizeof(act)); -+ act.sa_handler = CloseDupRfd; -+ if (sigaction(SIGCHLD, &act, &old_act) == 0) { -+ struct itimerval timeout; -+ -+ // install a 100ms timeout that generates SIGALARM on expiration -+ memset(&timeout, 0, sizeof(timeout)); -+ timeout.it_value.tv_usec = 100 * 1000; // [ms] -> [usec] -+ if (setitimer(ITIMER_REAL, &timeout, NULL) == 0) { -+ char buf; -+ -+ // Now try to read() from dup_rfd_. Return values from read(): -+ // -+ // 1. token read -> 1 -+ // 2. pipe closed -> 0 -+ // 3. alarm expires -> -1 (EINTR) -+ // 4. child exits -> -1 (EINTR) -+ // 5. alarm expired before entering read() -> -1 (EBADF) -+ // 6. child exited before entering read() -> -1 (EBADF) -+ // 7. child exited before handler is installed -> go to 1 - 3 -+ ret = read(dup_rfd_, &buf, 1); -+ -+ // disarm timer -+ memset(&timeout, 0, sizeof(timeout)); -+ setitimer(ITIMER_REAL, &timeout, NULL); -+ } -+ -+ sigaction(SIGCHLD, &old_act, NULL); ++ ); ++ ENVIRONMENT_INIT(buf_); ++ } ++ if ((tokens_ = TokenPool::Get()) != NULL) { ++ if (!tokens_->Setup(ignore_jobserver, false, load_avg_)) { ++ delete tokens_; ++ tokens_ = NULL; + } -+ -+ CloseDupRfd(0); -+ -+ // Case 1 from above list -+ if (ret > 0) -+ return true; + } + } + -+ // read() would block, i.e. no token available, -+ // cases 2-6 from above list or -+ // select() / poll() / dup() / sigaction() / setitimer() failed -+ return false; -+} -+ -+bool GNUmakeTokenPoolPosix::ReturnToken() { -+ const char buf = '+'; -+ while (1) { -+ int ret = write(wfd_, &buf, 1); -+ if (ret > 0) -+ return true; -+ if ((ret != -1) || (errno != EINTR)) -+ return false; -+ // write got interrupted - retry ++ void CreateDefaultPool() { ++ CreatePool(AUTH_FORMAT("--jobserver-auth")); + } -+} -+ -+int GNUmakeTokenPoolPosix::GetMonitorFd() { -+ return rfd_; -+} -+ -+TokenPool* TokenPool::Get() { -+ return new GNUmakeTokenPoolPosix; -+} ---- /dev/null -+++ b/src/tokenpool-gnu-make-win32.cc -@@ -0,0 +1,239 @@ -+// Copyright 2018 Google Inc. All Rights Reserved. -+// -+// Licensed under the Apache License, Version 2.0 (the "License"); -+// you may not use this file except in compliance with the License. -+// You may obtain a copy of the License at -+// -+// http://www.apache.org/licenses/LICENSE-2.0 -+// -+// Unless required by applicable law or agreed to in writing, software -+// distributed under the License is distributed on an "AS IS" BASIS, -+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+// See the License for the specific language governing permissions and -+// limitations under the License. -+ -+#include "tokenpool-gnu-make.h" -+ -+// Always include this first. -+// Otherwise the other system headers don't work correctly under Win32 -+#include -+ -+#include -+#include -+#include -+ -+#include "util.h" -+ -+// TokenPool implementation for GNU make jobserver - Win32 implementation -+// (https://www.gnu.org/software/make/manual/html_node/Windows-Jobserver.html) -+struct GNUmakeTokenPoolWin32 : public GNUmakeTokenPool { -+ GNUmakeTokenPoolWin32(); -+ virtual ~GNUmakeTokenPoolWin32(); + -+ virtual void WaitForTokenAvailability(HANDLE ioport); -+ virtual bool TokenIsAvailable(ULONG_PTR key); ++ virtual void TearDown() { ++ if (tokens_) ++ delete tokens_; ++#ifdef _WIN32 ++ CloseHandle(semaphore_); ++#else ++ close(fds_[0]); ++ close(fds_[1]); ++#endif ++ ENVIRONMENT_CLEAR(); ++ } ++}; + -+ virtual const char* GetEnv(const char* name); -+ virtual bool ParseAuth(const char* jobserver); -+ virtual bool AcquireToken(); -+ virtual bool ReturnToken(); ++} // anonymous namespace + -+ private: -+ // Semaphore for GNU make jobserver protocol -+ HANDLE semaphore_jobserver_; -+ // Semaphore Child -> Parent -+ // - child releases it before entering wait on jobserver semaphore -+ // - parent blocks on it to know when child enters wait -+ HANDLE semaphore_enter_wait_; -+ // Semaphore Parent -> Child -+ // - parent releases it to allow child to restart loop -+ // - child blocks on it to know when to restart loop -+ HANDLE semaphore_restart_; -+ // set to false if child should exit loop and terminate thread -+ bool running_; -+ // child thread -+ HANDLE child_; -+ // I/O completion port from SubprocessSet -+ HANDLE ioport_; ++// verifies none implementation ++TEST_F(TokenPoolTest, NoTokenPool) { ++ CreatePool(NULL, false); + ++ EXPECT_EQ(NULL, tokens_); ++ EXPECT_EQ(kLoadAverageDefault, load_avg_); ++} + -+ DWORD SemaphoreThread(); -+ void ReleaseSemaphore(HANDLE semaphore); -+ void WaitForObject(HANDLE object); -+ static DWORD WINAPI SemaphoreThreadWrapper(LPVOID param); -+ static void NoopAPCFunc(ULONG_PTR param); -+}; ++TEST_F(TokenPoolTest, SuccessfulOldSetup) { ++ // GNUmake <= 4.1 ++ CreatePool(AUTH_FORMAT("--jobserver-fds")); + -+GNUmakeTokenPoolWin32::GNUmakeTokenPoolWin32() : semaphore_jobserver_(NULL), -+ semaphore_enter_wait_(NULL), -+ semaphore_restart_(NULL), -+ running_(false), -+ child_(NULL), -+ ioport_(NULL) { ++ EXPECT_NE(NULL, tokens_); ++ EXPECT_EQ(kLoadAverageDefault, load_avg_); +} + -+GNUmakeTokenPoolWin32::~GNUmakeTokenPoolWin32() { -+ Clear(); -+ CloseHandle(semaphore_jobserver_); -+ semaphore_jobserver_ = NULL; -+ -+ if (child_) { -+ // tell child thread to exit -+ running_ = false; -+ ReleaseSemaphore(semaphore_restart_); ++TEST_F(TokenPoolTest, SuccessfulNewSetup) { ++ // GNUmake => 4.2 ++ CreateDefaultPool(); + -+ // wait for child thread to exit -+ WaitForObject(child_); -+ CloseHandle(child_); -+ child_ = NULL; -+ } ++ EXPECT_NE(NULL, tokens_); ++ EXPECT_EQ(kLoadAverageDefault, load_avg_); ++} + -+ if (semaphore_restart_) { -+ CloseHandle(semaphore_restart_); -+ semaphore_restart_ = NULL; -+ } ++TEST_F(TokenPoolTest, IgnoreWithJN) { ++ CreatePool(AUTH_FORMAT("--jobserver-auth"), true); + -+ if (semaphore_enter_wait_) { -+ CloseHandle(semaphore_enter_wait_); -+ semaphore_enter_wait_ = NULL; -+ } ++ EXPECT_EQ(NULL, tokens_); ++ EXPECT_EQ(kLoadAverageDefault, load_avg_); +} + -+const char* GNUmakeTokenPoolWin32::GetEnv(const char* name) { -+ // getenv() does not work correctly together with tokenpool_tests.cc -+ static char buffer[MAX_PATH + 1]; -+ if (GetEnvironmentVariable(name, buffer, sizeof(buffer)) == 0) -+ return NULL; -+ return buffer; -+} ++TEST_F(TokenPoolTest, HonorLN) { ++ CreatePool(AUTH_FORMAT("-l9 --jobserver-auth")); + -+bool GNUmakeTokenPoolWin32::ParseAuth(const char* jobserver) { -+ // match "--jobserver-auth=gmake_semaphore_..." -+ const char* start = strchr(jobserver, '='); -+ if (start) { -+ const char* end = start; -+ unsigned int len; -+ char c, *auth; ++ EXPECT_NE(NULL, tokens_); ++ EXPECT_EQ(9.0, load_avg_); ++} + -+ while ((c = *++end) != '\0') -+ if (!(isalnum(c) || (c == '_'))) -+ break; -+ len = end - start; // includes string terminator in count ++#ifdef _WIN32 ++TEST_F(TokenPoolTest, SemaphoreNotFound) { ++ semaphore_name_ = SEMAPHORE_NAME "_foobar"; ++ CreateDefaultPool(); + -+ if ((len > 1) && ((auth = (char*)malloc(len)) != NULL)) { -+ strncpy(auth, start + 1, len - 1); -+ auth[len - 1] = '\0'; ++ EXPECT_EQ(NULL, tokens_); ++ EXPECT_EQ(kLoadAverageDefault, load_avg_); ++} + -+ if ((semaphore_jobserver_ = -+ OpenSemaphore(SEMAPHORE_ALL_ACCESS, /* Semaphore access setting */ -+ FALSE, /* Child processes DON'T inherit */ -+ auth /* Semaphore name */ -+ )) != NULL) { -+ free(auth); -+ return true; -+ } ++TEST_F(TokenPoolTest, TokenIsAvailable) { ++ CreateDefaultPool(); + -+ free(auth); -+ } -+ } ++ ASSERT_NE(NULL, tokens_); ++ EXPECT_EQ(kLoadAverageDefault, load_avg_); + -+ return false; ++ EXPECT_TRUE(tokens_->TokenIsAvailable((ULONG_PTR)tokens_)); +} ++#else ++TEST_F(TokenPoolTest, MonitorFD) { ++ CreateDefaultPool(); + -+bool GNUmakeTokenPoolWin32::AcquireToken() { -+ return WaitForSingleObject(semaphore_jobserver_, 0) == WAIT_OBJECT_0; -+} ++ ASSERT_NE(NULL, tokens_); ++ EXPECT_EQ(kLoadAverageDefault, load_avg_); + -+bool GNUmakeTokenPoolWin32::ReturnToken() { -+ ReleaseSemaphore(semaphore_jobserver_); -+ return true; ++ EXPECT_EQ(fds_[0], tokens_->GetMonitorFd()); +} ++#endif + -+DWORD GNUmakeTokenPoolWin32::SemaphoreThread() { -+ while (running_) { -+ // indicate to parent that we are entering wait -+ ReleaseSemaphore(semaphore_enter_wait_); -+ -+ // alertable wait forever on token semaphore -+ if (WaitForSingleObjectEx(semaphore_jobserver_, INFINITE, TRUE) == WAIT_OBJECT_0) { -+ // release token again for AcquireToken() -+ ReleaseSemaphore(semaphore_jobserver_); -+ -+ // indicate to parent on ioport that a token might be available -+ if (!PostQueuedCompletionStatus(ioport_, 0, (ULONG_PTR) this, NULL)) -+ Win32Fatal("PostQueuedCompletionStatus"); -+ } ++TEST_F(TokenPoolTest, ImplicitToken) { ++ CreateDefaultPool(); + -+ // wait for parent to allow loop restart -+ WaitForObject(semaphore_restart_); -+ // semaphore is now in nonsignaled state again for next run... -+ } ++ ASSERT_NE(NULL, tokens_); ++ EXPECT_EQ(kLoadAverageDefault, load_avg_); + -+ return 0; ++ EXPECT_TRUE(tokens_->Acquire()); ++ tokens_->Reserve(); ++ EXPECT_FALSE(tokens_->Acquire()); ++ tokens_->Release(); ++ EXPECT_TRUE(tokens_->Acquire()); +} + -+DWORD WINAPI GNUmakeTokenPoolWin32::SemaphoreThreadWrapper(LPVOID param) { -+ GNUmakeTokenPoolWin32* This = (GNUmakeTokenPoolWin32*) param; -+ return This->SemaphoreThread(); -+} ++TEST_F(TokenPoolTest, TwoTokens) { ++ CreateDefaultPool(); + -+void GNUmakeTokenPoolWin32::NoopAPCFunc(ULONG_PTR param) { -+} ++ ASSERT_NE(NULL, tokens_); ++ EXPECT_EQ(kLoadAverageDefault, load_avg_); + -+void GNUmakeTokenPoolWin32::WaitForTokenAvailability(HANDLE ioport) { -+ if (child_ == NULL) { -+ // first invocation -+ // -+ // subprocess-win32.cc uses I/O completion port (IOCP) which can't be -+ // used as a waitable object. Therefore we can't use WaitMultipleObjects() -+ // to wait on the IOCP and the token semaphore at the same time. Create -+ // a child thread that waits on the semaphore and posts an I/O completion -+ ioport_ = ioport; ++ // implicit token ++ EXPECT_TRUE(tokens_->Acquire()); ++ tokens_->Reserve(); ++ EXPECT_FALSE(tokens_->Acquire()); + -+ // create both semaphores in nonsignaled state -+ if ((semaphore_enter_wait_ = CreateSemaphore(NULL, 0, 1, NULL)) -+ == NULL) -+ Win32Fatal("CreateSemaphore/enter_wait"); -+ if ((semaphore_restart_ = CreateSemaphore(NULL, 0, 1, NULL)) -+ == NULL) -+ Win32Fatal("CreateSemaphore/restart"); ++ // jobserver offers 2nd token ++#ifdef _WIN32 ++ LONG previous; ++ ASSERT_TRUE(ReleaseSemaphore(semaphore_, 1, &previous)); ++ ASSERT_EQ(0, previous); ++#else ++ char test_tokens[1] = { random() }; ++ ASSERT_EQ(1u, write(fds_[1], test_tokens, sizeof(test_tokens))); ++#endif ++ EXPECT_TRUE(tokens_->Acquire()); ++ tokens_->Reserve(); ++ EXPECT_FALSE(tokens_->Acquire()); + -+ // start child thread -+ running_ = true; -+ if ((child_ = CreateThread(NULL, 0, &SemaphoreThreadWrapper, this, 0, NULL)) -+ == NULL) -+ Win32Fatal("CreateThread"); ++ // release 2nd token ++ tokens_->Release(); ++ EXPECT_TRUE(tokens_->Acquire()); + -+ } else { -+ // all further invocations - allow child thread to loop -+ ReleaseSemaphore(semaphore_restart_); -+ } ++ // release implicit token - must return 2nd token back to jobserver ++ tokens_->Release(); ++ EXPECT_TRUE(tokens_->Acquire()); + -+ // wait for child thread to enter wait -+ WaitForObject(semaphore_enter_wait_); -+ // semaphore is now in nonsignaled state again for next run... ++ // there must be one token available ++#ifdef _WIN32 ++ EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(semaphore_, 0)); ++ EXPECT_TRUE(ReleaseSemaphore(semaphore_, 1, &previous)); ++ EXPECT_EQ(0, previous); ++#else ++ EXPECT_EQ(1u, read(fds_[0], buf_, sizeof(buf_))); ++ EXPECT_EQ(test_tokens[0], buf_[0]); ++#endif + -+ // now SubprocessSet::DoWork() can enter GetQueuedCompletionStatus()... ++ // implicit token ++ EXPECT_TRUE(tokens_->Acquire()); +} + -+bool GNUmakeTokenPoolWin32::TokenIsAvailable(ULONG_PTR key) { -+ // alert child thread to break wait on token semaphore -+ QueueUserAPC((PAPCFUNC)&NoopAPCFunc, child_, (ULONG_PTR)NULL); ++TEST_F(TokenPoolTest, Clear) { ++ CreateDefaultPool(); + -+ // return true when GetQueuedCompletionStatus() returned our key -+ return key == (ULONG_PTR) this; -+} ++ ASSERT_NE(NULL, tokens_); ++ EXPECT_EQ(kLoadAverageDefault, load_avg_); ++ ++ // implicit token ++ EXPECT_TRUE(tokens_->Acquire()); ++ tokens_->Reserve(); ++ EXPECT_FALSE(tokens_->Acquire()); ++ ++ // jobserver offers 2nd & 3rd token ++#ifdef _WIN32 ++ LONG previous; ++ ASSERT_TRUE(ReleaseSemaphore(semaphore_, 2, &previous)); ++ ASSERT_EQ(0, previous); ++#else ++ char test_tokens[2] = { random(), random() }; ++ ASSERT_EQ(2u, write(fds_[1], test_tokens, sizeof(test_tokens))); ++#endif ++ EXPECT_TRUE(tokens_->Acquire()); ++ tokens_->Reserve(); ++ EXPECT_TRUE(tokens_->Acquire()); ++ tokens_->Reserve(); ++ EXPECT_FALSE(tokens_->Acquire()); + -+void GNUmakeTokenPoolWin32::ReleaseSemaphore(HANDLE semaphore) { -+ if (!::ReleaseSemaphore(semaphore, 1, NULL)) -+ Win32Fatal("ReleaseSemaphore"); -+} ++ tokens_->Clear(); ++ EXPECT_TRUE(tokens_->Acquire()); + -+void GNUmakeTokenPoolWin32::WaitForObject(HANDLE object) { -+ if (WaitForSingleObject(object, INFINITE) != WAIT_OBJECT_0) -+ Win32Fatal("WaitForSingleObject"); -+} ++ // there must be two tokens available ++#ifdef _WIN32 ++ EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(semaphore_, 0)); ++ EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(semaphore_, 0)); ++ EXPECT_TRUE(ReleaseSemaphore(semaphore_, 2, &previous)); ++ EXPECT_EQ(0, previous); ++#else ++ EXPECT_EQ(2u, read(fds_[0], buf_, sizeof(buf_))); ++ // tokens are pushed onto a stack, hence returned in reverse order ++ EXPECT_EQ(test_tokens[0], buf_[1]); ++ EXPECT_EQ(test_tokens[1], buf_[0]); ++#endif + -+TokenPool* TokenPool::Get() { -+ return new GNUmakeTokenPoolWin32; ++ // implicit token ++ EXPECT_TRUE(tokens_->Acquire()); +} --- /dev/null -+++ b/src/tokenpool-gnu-make.cc -@@ -0,0 +1,108 @@ ++++ b/src/tokenpool-gnu-make-posix.cc +@@ -0,0 +1,214 @@ +// Copyright 2016-2018 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); @@ -1825,189 +1654,207 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 + +#include "tokenpool-gnu-make.h" + -+#include ++#include ++#include ++#include ++#include ++#include ++#include +#include +#include ++#include ++#include + -+#include "line_printer.h" -+ -+// TokenPool implementation for GNU make jobserver - common bits -+// every instance owns an implicit token -> available_ == 1 -+GNUmakeTokenPool::GNUmakeTokenPool() : available_(1), used_(0) { -+} ++// TokenPool implementation for GNU make jobserver - POSIX implementation ++// (http://make.mad-scientist.net/papers/jobserver-implementation/) ++struct GNUmakeTokenPoolPosix : public GNUmakeTokenPool { ++ GNUmakeTokenPoolPosix(); ++ virtual ~GNUmakeTokenPoolPosix(); + -+GNUmakeTokenPool::~GNUmakeTokenPool() { -+} ++ virtual int GetMonitorFd(); + -+bool GNUmakeTokenPool::Setup(bool ignore, -+ bool verbose, -+ double& max_load_average) { -+ const char* value = GetEnv("MAKEFLAGS"); -+ if (!value) -+ return false; ++ virtual const char* GetEnv(const char* name) { return getenv(name); }; ++ virtual bool ParseAuth(const char* jobserver); ++ virtual bool AcquireToken(); ++ virtual bool ReturnToken(); + -+ // GNU make <= 4.1 -+ const char* jobserver = strstr(value, "--jobserver-fds="); -+ if (!jobserver) -+ // GNU make => 4.2 -+ jobserver = strstr(value, "--jobserver-auth="); -+ if (jobserver) { -+ LinePrinter printer; ++ private: ++ int rfd_; ++ int wfd_; + -+ if (ignore) { -+ printer.PrintOnNewLine("ninja: warning: -jN forced on command line; ignoring GNU make jobserver.\n"); -+ } else { -+ if (ParseAuth(jobserver)) { -+ const char* l_arg = strstr(value, " -l"); -+ int load_limit = -1; ++ struct sigaction old_act_; ++ bool restore_; + -+ if (verbose) { -+ printer.PrintOnNewLine("ninja: using GNU make jobserver.\n"); -+ } ++ // See https://www.gnu.org/software/make/manual/html_node/POSIX-Jobserver.html ++ // ++ // It’s important that when you release the job slot, you write back ++ // the same character you read. Don’t assume that all tokens are the ++ // same character different characters may have different meanings to ++ // GNU make. The order is not important, since make has no idea in ++ // what order jobs will complete anyway. ++ // ++ std::stack tokens_; + -+ // translate GNU make -lN to ninja -lN -+ if (l_arg && -+ (sscanf(l_arg + 3, "%d ", &load_limit) == 1) && -+ (load_limit > 0)) { -+ max_load_average = load_limit; -+ } ++ static int dup_rfd_; ++ static void CloseDupRfd(int signum); + -+ return true; -+ } -+ } -+ } ++ bool CheckFd(int fd); ++ bool SetAlarmHandler(); ++}; + -+ return false; ++GNUmakeTokenPoolPosix::GNUmakeTokenPoolPosix() : rfd_(-1), wfd_(-1), restore_(false) { +} + -+bool GNUmakeTokenPool::Acquire() { -+ if (available_ > 0) -+ return true; -+ -+ if (AcquireToken()) { -+ // token acquired -+ available_++; -+ return true; -+ } -+ -+ // no token available -+ return false; ++GNUmakeTokenPoolPosix::~GNUmakeTokenPoolPosix() { ++ Clear(); ++ if (restore_) ++ sigaction(SIGALRM, &old_act_, NULL); +} + -+void GNUmakeTokenPool::Reserve() { -+ available_--; -+ used_++; ++bool GNUmakeTokenPoolPosix::CheckFd(int fd) { ++ if (fd < 0) ++ return false; ++ int ret = fcntl(fd, F_GETFD); ++ return ret >= 0; +} + -+void GNUmakeTokenPool::Return() { -+ if (ReturnToken()) -+ available_--; ++int GNUmakeTokenPoolPosix::dup_rfd_ = -1; ++ ++void GNUmakeTokenPoolPosix::CloseDupRfd(int signum) { ++ close(dup_rfd_); ++ dup_rfd_ = -1; +} + -+void GNUmakeTokenPool::Release() { -+ available_++; -+ used_--; -+ if (available_ > 1) -+ Return(); ++bool GNUmakeTokenPoolPosix::SetAlarmHandler() { ++ struct sigaction act; ++ memset(&act, 0, sizeof(act)); ++ act.sa_handler = CloseDupRfd; ++ if (sigaction(SIGALRM, &act, &old_act_) < 0) { ++ perror("sigaction:"); ++ return false; ++ } ++ restore_ = true; ++ return true; +} + -+void GNUmakeTokenPool::Clear() { -+ while (used_ > 0) -+ Release(); -+ while (available_ > 1) -+ Return(); ++bool GNUmakeTokenPoolPosix::ParseAuth(const char* jobserver) { ++ int rfd = -1; ++ int wfd = -1; ++ if ((sscanf(jobserver, "%*[^=]=%d,%d", &rfd, &wfd) == 2) && ++ CheckFd(rfd) && ++ CheckFd(wfd) && ++ SetAlarmHandler()) { ++ rfd_ = rfd; ++ wfd_ = wfd; ++ return true; ++ } ++ ++ return false; +} ---- /dev/null -+++ b/src/tokenpool-gnu-make.h -@@ -0,0 +1,40 @@ -+// Copyright 2016-2018 Google Inc. All Rights Reserved. -+// -+// Licensed under the Apache License, Version 2.0 (the "License"); -+// you may not use this file except in compliance with the License. -+// You may obtain a copy of the License at -+// -+// http://www.apache.org/licenses/LICENSE-2.0 -+// -+// Unless required by applicable law or agreed to in writing, software -+// distributed under the License is distributed on an "AS IS" BASIS, -+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+// See the License for the specific language governing permissions and -+// limitations under the License. + -+#include "tokenpool.h" ++bool GNUmakeTokenPoolPosix::AcquireToken() { ++ // Please read ++ // ++ // http://make.mad-scientist.net/papers/jobserver-implementation/ ++ // ++ // for the reasoning behind the following code. ++ // ++ // Try to read one character from the pipe. Returns true on success. ++ // ++ // First check if read() would succeed without blocking. ++#ifdef USE_PPOLL ++ pollfd pollfds[] = {{rfd_, POLLIN, 0}}; ++ int ret = poll(pollfds, 1, 0); ++#else ++ fd_set set; ++ struct timeval timeout = { 0, 0 }; ++ FD_ZERO(&set); ++ FD_SET(rfd_, &set); ++ int ret = select(rfd_ + 1, &set, NULL, NULL, &timeout); ++#endif ++ if (ret > 0) { ++ // Handle potential race condition: ++ // - the above check succeeded, i.e. read() should not block ++ // - the character disappears before we call read() ++ // ++ // Create a duplicate of rfd_. The duplicate file descriptor dup_rfd_ ++ // can safely be closed by signal handlers without affecting rfd_. ++ dup_rfd_ = dup(rfd_); + -+// interface to GNU make token pool -+struct GNUmakeTokenPool : public TokenPool { -+ GNUmakeTokenPool(); -+ ~GNUmakeTokenPool(); ++ if (dup_rfd_ != -1) { ++ struct sigaction act, old_act; ++ int ret = 0; ++ char buf; + -+ // token pool implementation -+ virtual bool Acquire(); -+ virtual void Reserve(); -+ virtual void Release(); -+ virtual void Clear(); -+ virtual bool Setup(bool ignore, bool verbose, double& max_load_average); ++ // Temporarily replace SIGCHLD handler with our own ++ memset(&act, 0, sizeof(act)); ++ act.sa_handler = CloseDupRfd; ++ if (sigaction(SIGCHLD, &act, &old_act) == 0) { ++ struct itimerval timeout; + -+ // platform specific implementation -+ virtual const char* GetEnv(const char* name) = 0; -+ virtual bool ParseAuth(const char* jobserver) = 0; -+ virtual bool AcquireToken() = 0; -+ virtual bool ReturnToken() = 0; ++ // install a 100ms timeout that generates SIGALARM on expiration ++ memset(&timeout, 0, sizeof(timeout)); ++ timeout.it_value.tv_usec = 100 * 1000; // [ms] -> [usec] ++ if (setitimer(ITIMER_REAL, &timeout, NULL) == 0) { ++ // Now try to read() from dup_rfd_. Return values from read(): ++ // ++ // 1. token read -> 1 ++ // 2. pipe closed -> 0 ++ // 3. alarm expires -> -1 (EINTR) ++ // 4. child exits -> -1 (EINTR) ++ // 5. alarm expired before entering read() -> -1 (EBADF) ++ // 6. child exited before entering read() -> -1 (EBADF) ++ // 7. child exited before handler is installed -> go to 1 - 3 ++ ret = read(dup_rfd_, &buf, 1); + -+ private: -+ int available_; -+ int used_; ++ // disarm timer ++ memset(&timeout, 0, sizeof(timeout)); ++ setitimer(ITIMER_REAL, &timeout, NULL); ++ } + -+ void Return(); -+}; ---- /dev/null -+++ b/src/tokenpool.h -@@ -0,0 +1,42 @@ -+// Copyright 2016-2018 Google Inc. All Rights Reserved. -+// -+// Licensed under the Apache License, Version 2.0 (the "License"); -+// you may not use this file except in compliance with the License. -+// You may obtain a copy of the License at -+// -+// http://www.apache.org/licenses/LICENSE-2.0 -+// -+// Unless required by applicable law or agreed to in writing, software -+// distributed under the License is distributed on an "AS IS" BASIS, -+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+// See the License for the specific language governing permissions and -+// limitations under the License. ++ sigaction(SIGCHLD, &old_act, NULL); ++ } + -+#ifdef _WIN32 -+#include -+#endif ++ CloseDupRfd(0); + -+// interface to token pool -+struct TokenPool { -+ virtual ~TokenPool() {} ++ // Case 1 from above list ++ if (ret > 0) { ++ tokens_.push(buf); ++ return true; ++ } ++ } ++ } + -+ virtual bool Acquire() = 0; -+ virtual void Reserve() = 0; -+ virtual void Release() = 0; -+ virtual void Clear() = 0; ++ // read() would block, i.e. no token available, ++ // cases 2-6 from above list or ++ // select() / poll() / dup() / sigaction() / setitimer() failed ++ return false; ++} + -+ // returns false if token pool setup failed -+ virtual bool Setup(bool ignore, bool verbose, double& max_load_average) = 0; ++bool GNUmakeTokenPoolPosix::ReturnToken() { ++ const char buf = tokens_.top(); ++ while (1) { ++ int ret = write(wfd_, &buf, 1); ++ if (ret > 0) { ++ tokens_.pop(); ++ return true; ++ } ++ if ((ret != -1) || (errno != EINTR)) ++ return false; ++ // write got interrupted - retry ++ } ++} + -+#ifdef _WIN32 -+ virtual void WaitForTokenAvailability(HANDLE ioport) = 0; -+ // returns true if a token has become available -+ // key is result from GetQueuedCompletionStatus() -+ virtual bool TokenIsAvailable(ULONG_PTR key) = 0; -+#else -+ virtual int GetMonitorFd() = 0; -+#endif ++int GNUmakeTokenPoolPosix::GetMonitorFd() { ++ return rfd_; ++} + -+ // returns NULL if token pool is not available -+ static TokenPool* Get(); -+}; ++TokenPool* TokenPool::Get() { ++ return new GNUmakeTokenPoolPosix; ++} --- /dev/null -+++ b/src/tokenpool_test.cc -@@ -0,0 +1,269 @@ ++++ b/src/tokenpool-gnu-make-win32.cc +@@ -0,0 +1,239 @@ +// Copyright 2018 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); @@ -2022,258 +1869,304 @@ https://github.com/ninja-build/ninja/pull/1140#issuecomment-596624610 +// See the License for the specific language governing permissions and +// limitations under the License. + -+#include "tokenpool.h" -+ -+#include "test.h" ++#include "tokenpool-gnu-make.h" + -+#ifdef _WIN32 ++// Always include this first. ++// Otherwise the other system headers don't work correctly under Win32 +#include -+#else -+#include -+#endif + -+#include ++#include +#include ++#include + -+#ifdef _WIN32 -+// should contain all valid characters -+#define SEMAPHORE_NAME "abcdefghijklmnopqrstwxyz01234567890_" -+#define AUTH_FORMAT(tmpl) "foo " tmpl "=%s bar" -+#define ENVIRONMENT_CLEAR() SetEnvironmentVariable("MAKEFLAGS", NULL) -+#define ENVIRONMENT_INIT(v) SetEnvironmentVariable("MAKEFLAGS", v) -+#else -+#define AUTH_FORMAT(tmpl) "foo " tmpl "=%d,%d bar" -+#define ENVIRONMENT_CLEAR() unsetenv("MAKEFLAGS") -+#define ENVIRONMENT_INIT(v) setenv("MAKEFLAGS", v, true) -+#endif ++#include "util.h" + -+namespace { ++// TokenPool implementation for GNU make jobserver - Win32 implementation ++// (https://www.gnu.org/software/make/manual/html_node/Windows-Jobserver.html) ++struct GNUmakeTokenPoolWin32 : public GNUmakeTokenPool { ++ GNUmakeTokenPoolWin32(); ++ virtual ~GNUmakeTokenPoolWin32(); + -+const double kLoadAverageDefault = -1.23456789; ++ virtual void WaitForTokenAvailability(HANDLE ioport); ++ virtual bool TokenIsAvailable(ULONG_PTR key); + -+struct TokenPoolTest : public testing::Test { -+ double load_avg_; -+ TokenPool* tokens_; -+ char buf_[1024]; -+#ifdef _WIN32 -+ const char* semaphore_name_; -+ HANDLE semaphore_; -+#else -+ int fds_[2]; -+#endif ++ virtual const char* GetEnv(const char* name); ++ virtual bool ParseAuth(const char* jobserver); ++ virtual bool AcquireToken(); ++ virtual bool ReturnToken(); + -+ virtual void SetUp() { -+ load_avg_ = kLoadAverageDefault; -+ tokens_ = NULL; -+ ENVIRONMENT_CLEAR(); -+#ifdef _WIN32 -+ semaphore_name_ = SEMAPHORE_NAME; -+ if ((semaphore_ = CreateSemaphore(0, 0, 2, SEMAPHORE_NAME)) == NULL) -+#else -+ if (pipe(fds_) < 0) -+#endif -+ ASSERT_TRUE(false); -+ } ++ private: ++ // Semaphore for GNU make jobserver protocol ++ HANDLE semaphore_jobserver_; ++ // Semaphore Child -> Parent ++ // - child releases it before entering wait on jobserver semaphore ++ // - parent blocks on it to know when child enters wait ++ HANDLE semaphore_enter_wait_; ++ // Semaphore Parent -> Child ++ // - parent releases it to allow child to restart loop ++ // - child blocks on it to know when to restart loop ++ HANDLE semaphore_restart_; ++ // set to false if child should exit loop and terminate thread ++ bool running_; ++ // child thread ++ HANDLE child_; ++ // I/O completion port from SubprocessSet ++ HANDLE ioport_; + -+ void CreatePool(const char* format, bool ignore_jobserver = false) { -+ if (format) { -+ sprintf(buf_, format, -+#ifdef _WIN32 -+ semaphore_name_ -+#else -+ fds_[0], fds_[1] -+#endif -+ ); -+ ENVIRONMENT_INIT(buf_); -+ } -+ if ((tokens_ = TokenPool::Get()) != NULL) { -+ if (!tokens_->Setup(ignore_jobserver, false, load_avg_)) { -+ delete tokens_; -+ tokens_ = NULL; -+ } -+ } ++ ++ DWORD SemaphoreThread(); ++ void ReleaseSemaphore(HANDLE semaphore); ++ void WaitForObject(HANDLE object); ++ static DWORD WINAPI SemaphoreThreadWrapper(LPVOID param); ++ static void NoopAPCFunc(ULONG_PTR param); ++}; ++ ++GNUmakeTokenPoolWin32::GNUmakeTokenPoolWin32() : semaphore_jobserver_(NULL), ++ semaphore_enter_wait_(NULL), ++ semaphore_restart_(NULL), ++ running_(false), ++ child_(NULL), ++ ioport_(NULL) { ++} ++ ++GNUmakeTokenPoolWin32::~GNUmakeTokenPoolWin32() { ++ Clear(); ++ CloseHandle(semaphore_jobserver_); ++ semaphore_jobserver_ = NULL; ++ ++ if (child_) { ++ // tell child thread to exit ++ running_ = false; ++ ReleaseSemaphore(semaphore_restart_); ++ ++ // wait for child thread to exit ++ WaitForObject(child_); ++ CloseHandle(child_); ++ child_ = NULL; + } + -+ void CreateDefaultPool() { -+ CreatePool(AUTH_FORMAT("--jobserver-auth")); ++ if (semaphore_restart_) { ++ CloseHandle(semaphore_restart_); ++ semaphore_restart_ = NULL; + } + -+ virtual void TearDown() { -+ if (tokens_) -+ delete tokens_; -+#ifdef _WIN32 -+ CloseHandle(semaphore_); -+#else -+ close(fds_[0]); -+ close(fds_[1]); -+#endif -+ ENVIRONMENT_CLEAR(); ++ if (semaphore_enter_wait_) { ++ CloseHandle(semaphore_enter_wait_); ++ semaphore_enter_wait_ = NULL; + } -+}; ++} + -+} // anonymous namespace ++const char* GNUmakeTokenPoolWin32::GetEnv(const char* name) { ++ // getenv() does not work correctly together with tokenpool_tests.cc ++ static char buffer[MAX_PATH + 1]; ++ if (GetEnvironmentVariable(name, buffer, sizeof(buffer)) == 0) ++ return NULL; ++ return buffer; ++} + -+// verifies none implementation -+TEST_F(TokenPoolTest, NoTokenPool) { -+ CreatePool(NULL, false); ++bool GNUmakeTokenPoolWin32::ParseAuth(const char* jobserver) { ++ // match "--jobserver-auth=gmake_semaphore_..." ++ const char* start = strchr(jobserver, '='); ++ if (start) { ++ const char* end = start; ++ unsigned int len; ++ char c, *auth; + -+ EXPECT_EQ(NULL, tokens_); -+ EXPECT_EQ(kLoadAverageDefault, load_avg_); -+} ++ while ((c = *++end) != '\0') ++ if (!(isalnum(c) || (c == '_'))) ++ break; ++ len = end - start; // includes string terminator in count + -+TEST_F(TokenPoolTest, SuccessfulOldSetup) { -+ // GNUmake <= 4.1 -+ CreatePool(AUTH_FORMAT("--jobserver-fds")); ++ if ((len > 1) && ((auth = (char*)malloc(len)) != NULL)) { ++ strncpy(auth, start + 1, len - 1); ++ auth[len - 1] = '\0'; + -+ EXPECT_NE(NULL, tokens_); -+ EXPECT_EQ(kLoadAverageDefault, load_avg_); -+} ++ if ((semaphore_jobserver_ = ++ OpenSemaphore(SEMAPHORE_ALL_ACCESS, /* Semaphore access setting */ ++ FALSE, /* Child processes DON'T inherit */ ++ auth /* Semaphore name */ ++ )) != NULL) { ++ free(auth); ++ return true; ++ } + -+TEST_F(TokenPoolTest, SuccessfulNewSetup) { -+ // GNUmake => 4.2 -+ CreateDefaultPool(); ++ free(auth); ++ } ++ } + -+ EXPECT_NE(NULL, tokens_); -+ EXPECT_EQ(kLoadAverageDefault, load_avg_); ++ return false; +} + -+TEST_F(TokenPoolTest, IgnoreWithJN) { -+ CreatePool(AUTH_FORMAT("--jobserver-auth"), true); -+ -+ EXPECT_EQ(NULL, tokens_); -+ EXPECT_EQ(kLoadAverageDefault, load_avg_); ++bool GNUmakeTokenPoolWin32::AcquireToken() { ++ return WaitForSingleObject(semaphore_jobserver_, 0) == WAIT_OBJECT_0; +} + -+TEST_F(TokenPoolTest, HonorLN) { -+ CreatePool(AUTH_FORMAT("-l9 --jobserver-auth")); -+ -+ EXPECT_NE(NULL, tokens_); -+ EXPECT_EQ(9.0, load_avg_); ++bool GNUmakeTokenPoolWin32::ReturnToken() { ++ ReleaseSemaphore(semaphore_jobserver_); ++ return true; +} + -+#ifdef _WIN32 -+TEST_F(TokenPoolTest, SemaphoreNotFound) { -+ semaphore_name_ = SEMAPHORE_NAME "_foobar"; -+ CreateDefaultPool(); ++DWORD GNUmakeTokenPoolWin32::SemaphoreThread() { ++ while (running_) { ++ // indicate to parent that we are entering wait ++ ReleaseSemaphore(semaphore_enter_wait_); + -+ EXPECT_EQ(NULL, tokens_); -+ EXPECT_EQ(kLoadAverageDefault, load_avg_); -+} ++ // alertable wait forever on token semaphore ++ if (WaitForSingleObjectEx(semaphore_jobserver_, INFINITE, TRUE) == WAIT_OBJECT_0) { ++ // release token again for AcquireToken() ++ ReleaseSemaphore(semaphore_jobserver_); + -+TEST_F(TokenPoolTest, TokenIsAvailable) { -+ CreateDefaultPool(); ++ // indicate to parent on ioport that a token might be available ++ if (!PostQueuedCompletionStatus(ioport_, 0, (ULONG_PTR) this, NULL)) ++ Win32Fatal("PostQueuedCompletionStatus"); ++ } + -+ ASSERT_NE(NULL, tokens_); -+ EXPECT_EQ(kLoadAverageDefault, load_avg_); ++ // wait for parent to allow loop restart ++ WaitForObject(semaphore_restart_); ++ // semaphore is now in nonsignaled state again for next run... ++ } + -+ EXPECT_TRUE(tokens_->TokenIsAvailable((ULONG_PTR)tokens_)); ++ return 0; +} -+#else -+TEST_F(TokenPoolTest, MonitorFD) { -+ CreateDefaultPool(); -+ -+ ASSERT_NE(NULL, tokens_); -+ EXPECT_EQ(kLoadAverageDefault, load_avg_); + -+ EXPECT_EQ(fds_[0], tokens_->GetMonitorFd()); ++DWORD WINAPI GNUmakeTokenPoolWin32::SemaphoreThreadWrapper(LPVOID param) { ++ GNUmakeTokenPoolWin32* This = (GNUmakeTokenPoolWin32*) param; ++ return This->SemaphoreThread(); +} -+#endif + -+TEST_F(TokenPoolTest, ImplicitToken) { -+ CreateDefaultPool(); ++void GNUmakeTokenPoolWin32::NoopAPCFunc(ULONG_PTR param) { ++} + -+ ASSERT_NE(NULL, tokens_); -+ EXPECT_EQ(kLoadAverageDefault, load_avg_); ++void GNUmakeTokenPoolWin32::WaitForTokenAvailability(HANDLE ioport) { ++ if (child_ == NULL) { ++ // first invocation ++ // ++ // subprocess-win32.cc uses I/O completion port (IOCP) which can't be ++ // used as a waitable object. Therefore we can't use WaitMultipleObjects() ++ // to wait on the IOCP and the token semaphore at the same time. Create ++ // a child thread that waits on the semaphore and posts an I/O completion ++ ioport_ = ioport; + -+ EXPECT_TRUE(tokens_->Acquire()); -+ tokens_->Reserve(); -+ EXPECT_FALSE(tokens_->Acquire()); -+ tokens_->Release(); -+ EXPECT_TRUE(tokens_->Acquire()); -+} ++ // create both semaphores in nonsignaled state ++ if ((semaphore_enter_wait_ = CreateSemaphore(NULL, 0, 1, NULL)) ++ == NULL) ++ Win32Fatal("CreateSemaphore/enter_wait"); ++ if ((semaphore_restart_ = CreateSemaphore(NULL, 0, 1, NULL)) ++ == NULL) ++ Win32Fatal("CreateSemaphore/restart"); + -+TEST_F(TokenPoolTest, TwoTokens) { -+ CreateDefaultPool(); ++ // start child thread ++ running_ = true; ++ if ((child_ = CreateThread(NULL, 0, &SemaphoreThreadWrapper, this, 0, NULL)) ++ == NULL) ++ Win32Fatal("CreateThread"); + -+ ASSERT_NE(NULL, tokens_); -+ EXPECT_EQ(kLoadAverageDefault, load_avg_); ++ } else { ++ // all further invocations - allow child thread to loop ++ ReleaseSemaphore(semaphore_restart_); ++ } + -+ // implicit token -+ EXPECT_TRUE(tokens_->Acquire()); -+ tokens_->Reserve(); -+ EXPECT_FALSE(tokens_->Acquire()); ++ // wait for child thread to enter wait ++ WaitForObject(semaphore_enter_wait_); ++ // semaphore is now in nonsignaled state again for next run... + -+ // jobserver offers 2nd token -+#ifdef _WIN32 -+ LONG previous; -+ ASSERT_TRUE(ReleaseSemaphore(semaphore_, 1, &previous)); -+ ASSERT_EQ(0, previous); -+#else -+ ASSERT_EQ(1u, write(fds_[1], "T", 1)); -+#endif -+ EXPECT_TRUE(tokens_->Acquire()); -+ tokens_->Reserve(); -+ EXPECT_FALSE(tokens_->Acquire()); ++ // now SubprocessSet::DoWork() can enter GetQueuedCompletionStatus()... ++} + -+ // release 2nd token -+ tokens_->Release(); -+ EXPECT_TRUE(tokens_->Acquire()); ++bool GNUmakeTokenPoolWin32::TokenIsAvailable(ULONG_PTR key) { ++ // alert child thread to break wait on token semaphore ++ QueueUserAPC((PAPCFUNC)&NoopAPCFunc, child_, (ULONG_PTR)NULL); + -+ // release implict token - must return 2nd token back to jobserver -+ tokens_->Release(); -+ EXPECT_TRUE(tokens_->Acquire()); ++ // return true when GetQueuedCompletionStatus() returned our key ++ return key == (ULONG_PTR) this; ++} + -+ // there must be one token available -+#ifdef _WIN32 -+ EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(semaphore_, 0)); -+ EXPECT_TRUE(ReleaseSemaphore(semaphore_, 1, &previous)); -+ EXPECT_EQ(0, previous); -+#else -+ EXPECT_EQ(1u, read(fds_[0], buf_, sizeof(buf_))); -+#endif ++void GNUmakeTokenPoolWin32::ReleaseSemaphore(HANDLE semaphore) { ++ if (!::ReleaseSemaphore(semaphore, 1, NULL)) ++ Win32Fatal("ReleaseSemaphore"); ++} + -+ // implicit token -+ EXPECT_TRUE(tokens_->Acquire()); ++void GNUmakeTokenPoolWin32::WaitForObject(HANDLE object) { ++ if (WaitForSingleObject(object, INFINITE) != WAIT_OBJECT_0) ++ Win32Fatal("WaitForSingleObject"); +} + -+TEST_F(TokenPoolTest, Clear) { -+ CreateDefaultPool(); ++TokenPool* TokenPool::Get() { ++ return new GNUmakeTokenPoolWin32; ++} +--- /dev/null ++++ b/src/tokenpool-gnu-make.h +@@ -0,0 +1,40 @@ ++// Copyright 2016-2018 Google Inc. All Rights Reserved. ++// ++// Licensed under the Apache License, Version 2.0 (the "License"); ++// you may not use this file except in compliance with the License. ++// You may obtain a copy of the License at ++// ++// http://www.apache.org/licenses/LICENSE-2.0 ++// ++// Unless required by applicable law or agreed to in writing, software ++// distributed under the License is distributed on an "AS IS" BASIS, ++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++// See the License for the specific language governing permissions and ++// limitations under the License. + -+ ASSERT_NE(NULL, tokens_); -+ EXPECT_EQ(kLoadAverageDefault, load_avg_); ++#include "tokenpool.h" + -+ // implicit token -+ EXPECT_TRUE(tokens_->Acquire()); -+ tokens_->Reserve(); -+ EXPECT_FALSE(tokens_->Acquire()); ++// interface to GNU make token pool ++struct GNUmakeTokenPool : public TokenPool { ++ GNUmakeTokenPool(); ++ ~GNUmakeTokenPool(); + -+ // jobserver offers 2nd & 3rd token -+#ifdef _WIN32 -+ LONG previous; -+ ASSERT_TRUE(ReleaseSemaphore(semaphore_, 2, &previous)); -+ ASSERT_EQ(0, previous); -+#else -+ ASSERT_EQ(2u, write(fds_[1], "TT", 2)); -+#endif -+ EXPECT_TRUE(tokens_->Acquire()); -+ tokens_->Reserve(); -+ EXPECT_TRUE(tokens_->Acquire()); -+ tokens_->Reserve(); -+ EXPECT_FALSE(tokens_->Acquire()); ++ // token pool implementation ++ virtual bool Acquire(); ++ virtual void Reserve(); ++ virtual void Release(); ++ virtual void Clear(); ++ virtual bool Setup(bool ignore, bool verbose, double& max_load_average); + -+ tokens_->Clear(); -+ EXPECT_TRUE(tokens_->Acquire()); ++ // platform specific implementation ++ virtual const char* GetEnv(const char* name) = 0; ++ virtual bool ParseAuth(const char* jobserver) = 0; ++ virtual bool AcquireToken() = 0; ++ virtual bool ReturnToken() = 0; + -+ // there must be two tokens available -+#ifdef _WIN32 -+ EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(semaphore_, 0)); -+ EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(semaphore_, 0)); -+ EXPECT_TRUE(ReleaseSemaphore(semaphore_, 2, &previous)); -+ EXPECT_EQ(0, previous); -+#else -+ EXPECT_EQ(2u, read(fds_[0], buf_, sizeof(buf_))); -+#endif ++ private: ++ int available_; ++ int used_; + -+ // implicit token -+ EXPECT_TRUE(tokens_->Acquire()); -+} ++ void Return(); ++}; +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -112,6 +112,7 @@ add_library(libninja OBJECT + src/state.cc + src/status.cc + src/string_piece_util.cc ++ src/tokenpool-gnu-make.cc + src/util.cc + src/version.cc + ) +@@ -123,9 +124,14 @@ if(WIN32) + src/msvc_helper_main-win32.cc + src/getopt.c + src/minidump-win32.cc ++ src/tokenpool-gnu-make-win32.cc + ) + else() + target_sources(libninja PRIVATE src/subprocess-posix.cc) ++ target_sources(libninja PRIVATE ++ src/subprocess-posix.cc ++ src/tokenpool-gnu-make-posix.cc ++ ) + if(CMAKE_SYSTEM_NAME STREQUAL "OS400" OR CMAKE_SYSTEM_NAME STREQUAL "AIX") + target_sources(libninja PRIVATE src/getopt.c) + endif() +@@ -204,6 +210,7 @@ if(BUILD_TESTING) + src/string_piece_util_test.cc + src/subprocess_test.cc + src/test.cc ++ src/tokenpool_test.cc + src/util_test.cc + ) + if(WIN32) diff --git a/tools/patch/Makefile b/tools/patch/Makefile index ca32184b6f..957fe6e309 100644 --- a/tools/patch/Makefile +++ b/tools/patch/Makefile @@ -22,4 +22,8 @@ include $(INCLUDE_DIR)/host-build.mk HOSTCC := $(HOSTCC_NOCACHE) HOSTCXX := $(HOSTCXX_NOCACHE) +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/patchelf/Makefile b/tools/patchelf/Makefile index 7c88f8dc45..3ddd611cd8 100644 --- a/tools/patchelf/Makefile +++ b/tools/patchelf/Makefile @@ -7,12 +7,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=patchelf +PKG_VERSION:=0.17.2 -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL:=https://github.com/NixOS/patchelf.git -PKG_SOURCE_VERSION:=f34751b88bd07d7f44f5cd3200fb4122bf916c7e -PKG_SOURCE_DATE:=2020-12-07 -PKG_MIRROR_HASH:=ac746930b919b97da40f259cfc9ab7bbd48a0c9cbf2eebd8cee5ae19a94356fd +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL:=https://github.com/NixOS/patchelf/releases/download/$(PKG_VERSION) +PKG_HASH:=bae2ea376072e422c196218dd9bdef0548ccc08da4de9f36b4672df84ea2d8e2 HOST_BUILD_PARALLEL:=1 HOST_FIXUP:=autoreconf @@ -24,4 +23,8 @@ define Host/Install $(INSTALL_BIN) $(HOST_BUILD_DIR)/src/patchelf $(STAGING_DIR_HOST)/bin/patchelf endef +define Host/Clean + rm -rf $(STAGING_DIR_HOST)/bin/patchelf +endef + $(eval $(call HostBuild)) diff --git a/tools/pkgconf/Makefile b/tools/pkgconf/Makefile index d2f3252b12..d0a8a271d9 100644 --- a/tools/pkgconf/Makefile +++ b/tools/pkgconf/Makefile @@ -7,11 +7,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=pkgconf -PKG_VERSION:=1.8.0 +PKG_VERSION:=1.9.5 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://distfiles.dereferenced.org/pkgconf -PKG_HASH:=ef9c7e61822b7cb8356e6e9e1dca58d9556f3200d78acab35e4347e9d4c2bbaf +PKG_HASH:=1ac1656debb27497563036f7bffc281490f83f9b8457c0d60bcfb638fb6b6171 + +PKG_CPE_ID:=cpe:/a:pkgconf:pkgconf include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/meson.mk @@ -22,7 +24,7 @@ HOSTCC := $(HOSTCC_NOCACHE) MESON_HOST_ARGS += \ -Ddefault_library=static \ - -Dtests=false + -Dtests=disabled define Host/Install $(call Host/Install/Meson) diff --git a/tools/sed/Makefile b/tools/sed/Makefile index 4218ac2d59..49cbc72e6e 100644 --- a/tools/sed/Makefile +++ b/tools/sed/Makefile @@ -7,11 +7,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=sed -PKG_VERSION:=4.8 +PKG_VERSION:=4.9 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@GNU/$(PKG_NAME) -PKG_HASH:=f79b0cfea71b37a8eeec8490db6c5f7ae7719c35587f21edb0617f370eeff633 +PKG_HASH:=6e226b732e1cd739464ad6862bd1a1aba42d7982922da7a53519631d24975181 +PKG_CPE_ID:=cpe:/a:gnu:sed + export SED:= HOST_BUILD_PARALLEL:=1 diff --git a/tools/sed/patches/001-sed-fix-handling-of-symlinks-pointing-to-path-with-1.patch b/tools/sed/patches/001-sed-fix-handling-of-symlinks-pointing-to-path-with-1.patch new file mode 100644 index 0000000000..96ae5bdbb9 --- /dev/null +++ b/tools/sed/patches/001-sed-fix-handling-of-symlinks-pointing-to-path-with-1.patch @@ -0,0 +1,47 @@ +From 8f600f2df293d539e9e9137f6f82faa1633b97c1 Mon Sep 17 00:00:00 2001 +From: Paul Eggert +Date: Sat, 17 Dec 2022 20:56:29 -0800 +Subject: [PATCH] sed: fix symlink bufsize readlink check + +Problem reported by Hauke Mehrtens. +* sed/utils.c (follow_symlink): Fix typo when checking size of +second and later symlink, when that symlink is so large that it +does not fit into the buffer. Although the bug is not a buffer +overflow, it does cause sed to mishandle the symlink. +* testsuite/follow-symlinks.sh: Test for the bug. +--- + sed/utils.c | 2 +- + testsuite/follow-symlinks.sh | 13 +++++++++++++ + 3 files changed, 18 insertions(+), 1 deletion(-) + +--- a/sed/utils.c ++++ b/sed/utils.c +@@ -345,7 +345,7 @@ follow_symlink (const char *fname) + while ((linklen = (buf_used < buf_size + ? readlink (fn, buf + buf_used, buf_size - buf_used) + : 0)) +- == buf_size) ++ == buf_size - buf_used) + { + buf = xpalloc (buf, &buf_size, 1, SSIZE_IDX_MAX, 1); + if (num_links) +--- a/testsuite/follow-symlinks.sh ++++ b/testsuite/follow-symlinks.sh +@@ -73,4 +73,17 @@ compare_ exp-la-abs out-la-abs || fail=1 + ln -s la-loop la-loop || framework_failure_ + sed --follow-symlinks -i s/a/b/ la-loop && fail=1 + ++# symlink of length 128 ++long=d/ ++for i in 2 3 4 5 6 7; do ++ long=$long$long ++done ++dir=${long%/d/} ++file=$dir/xx ++mkdir -p $dir && ++echo x >$file && ++ln -s $file yy && ++ln -s yy xx || framework_failure_ ++sed -i --follow-symlinks s/x/y/ xx || fail=1 ++ + Exit $fail diff --git a/tools/sparse/Makefile b/tools/sparse/Makefile index 549ec3a3cc..e08bd1d05f 100644 --- a/tools/sparse/Makefile +++ b/tools/sparse/Makefile @@ -21,4 +21,8 @@ define Host/Install $(INSTALL_BIN) $(HOST_BUILD_DIR)/sparse $(STAGING_DIR_HOST)/bin endef +define Host/Clean + rm -f $(STAGING_DIR_HOST)/bin/sparse +endef + $(eval $(call HostBuild)) diff --git a/tools/squashfs/Makefile b/tools/squashfs/Makefile deleted file mode 100644 index 385cf69d9d..0000000000 --- a/tools/squashfs/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -# -# Copyright (C) 2006-2012 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# -include $(TOPDIR)/rules.mk - -PKG_NAME:=squashfs -PKG_CPE_ID:=cpe:/a:phillip_lougher:squashfs -PKG_VERSION:=3.0 - -PKG_SOURCE:=$(PKG_NAME)$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=@SF/squashfs -PKG_HASH:=39dbda43cf118536deb746c7730b468702d514a19f4cfab73b710e32908ddf20 -PKG_CAT:=zcat - -HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)$(PKG_VERSION) - -include $(INCLUDE_DIR)/host-build.mk - -define Host/Compile - $(MAKE) -C $(HOST_BUILD_DIR)/squashfs-tools \ - CC="$(HOSTCC)" \ - CFLAGS="$(HOST_CFLAGS) -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -I." \ - CXX="$(CXX)" \ - LZMAPATH=$(STAGING_DIR_HOST)/lib \ - mksquashfs-lzma unsquashfs-lzma -endef - -define Host/Install - $(INSTALL_BIN) $(HOST_BUILD_DIR)/squashfs-tools/mksquashfs-lzma $(STAGING_DIR_HOST)/bin/ - $(INSTALL_BIN) $(HOST_BUILD_DIR)/squashfs-tools/unsquashfs-lzma $(STAGING_DIR_HOST)/bin/ -endef - -define Host/Clean - rm -f $(STAGING_DIR_HOST)/bin/mksquashfs-lzma - rm -f $(STAGING_DIR_HOST)/bin/unsquashfs-lzma -endef - -$(eval $(call HostBuild)) diff --git a/tools/squashfs3-lzma/Makefile b/tools/squashfs3-lzma/Makefile new file mode 100644 index 0000000000..b02018629e --- /dev/null +++ b/tools/squashfs3-lzma/Makefile @@ -0,0 +1,46 @@ +# +# Copyright (C) 2006-2012 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# +include $(TOPDIR)/rules.mk + +PKG_NAME:=squashfs3-lzma +PKG_CPE_ID:=cpe:/a:phillip_lougher:squashfs +PKG_VERSION:=3.0 + +PKG_SOURCE:=squashfs$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=@SF/squashfs +PKG_HASH:=39dbda43cf118536deb746c7730b468702d514a19f4cfab73b710e32908ddf20 + +# Tar directory is squashfs3.0 that conflict with any pattern +# currently using for host tools. (PKG_NAME-PKG_VERSION) +# Also this got renamed to a more correct name +# from squashfs to squashfs3-lzma. +# Use tar transform to rename the root directory to this new +# name. +TAR_OPTIONS+=--transform=s/^squashfs/$(PKG_NAME)-/ + +include $(INCLUDE_DIR)/host-build.mk + +define Host/Compile + $(MAKE) -C $(HOST_BUILD_DIR)/squashfs-tools \ + CC="$(HOSTCC)" \ + CFLAGS="$(HOST_CFLAGS) -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -I." \ + CXX="$(CXX)" \ + LZMAPATH=$(STAGING_DIR_HOST)/lib \ + mksquashfs-lzma unsquashfs-lzma +endef + +define Host/Install + $(INSTALL_BIN) $(HOST_BUILD_DIR)/squashfs-tools/mksquashfs-lzma $(STAGING_DIR_HOST)/bin/mksquashfs3-lzma + $(INSTALL_BIN) $(HOST_BUILD_DIR)/squashfs-tools/unsquashfs-lzma $(STAGING_DIR_HOST)/bin/unsquashfs3-lzma +endef + +define Host/Clean + rm -f $(STAGING_DIR_HOST)/bin/mksquashfs3-lzma + rm -f $(STAGING_DIR_HOST)/bin/unsquashfs3-lzma +endef + +$(eval $(call HostBuild)) diff --git a/tools/squashfs/patches/100-lzma.patch b/tools/squashfs3-lzma/patches/100-lzma.patch similarity index 100% rename from tools/squashfs/patches/100-lzma.patch rename to tools/squashfs3-lzma/patches/100-lzma.patch diff --git a/tools/squashfs/patches/110-no_nonstatic_inline.patch b/tools/squashfs3-lzma/patches/110-no_nonstatic_inline.patch similarity index 100% rename from tools/squashfs/patches/110-no_nonstatic_inline.patch rename to tools/squashfs3-lzma/patches/110-no_nonstatic_inline.patch diff --git a/tools/squashfs/patches/120-add-fixed-timestamp-support.patch b/tools/squashfs3-lzma/patches/120-add-fixed-timestamp-support.patch similarity index 100% rename from tools/squashfs/patches/120-add-fixed-timestamp-support.patch rename to tools/squashfs3-lzma/patches/120-add-fixed-timestamp-support.patch diff --git a/tools/squashfs/patches/130-include_sysmacros.patch b/tools/squashfs3-lzma/patches/130-include_sysmacros.patch similarity index 100% rename from tools/squashfs/patches/130-include_sysmacros.patch rename to tools/squashfs3-lzma/patches/130-include_sysmacros.patch diff --git a/tools/squashfs/patches/140-gcc-10-fix.patch b/tools/squashfs3-lzma/patches/140-gcc-10-fix.patch similarity index 100% rename from tools/squashfs/patches/140-gcc-10-fix.patch rename to tools/squashfs3-lzma/patches/140-gcc-10-fix.patch diff --git a/tools/squashfs3-lzma/patches/150-fix-unitialized-memory.patch b/tools/squashfs3-lzma/patches/150-fix-unitialized-memory.patch new file mode 100644 index 0000000000..ad3b820894 --- /dev/null +++ b/tools/squashfs3-lzma/patches/150-fix-unitialized-memory.patch @@ -0,0 +1,11 @@ +--- a/squashfs-tools/mksquashfs.c ++++ b/squashfs-tools/mksquashfs.c +@@ -1822,7 +1822,7 @@ int main(int argc, char *argv[]) + { + struct stat buf, source_buf; + int i; +- squashfs_super_block sBlk; ++ squashfs_super_block sBlk = {}; + char *b, *root_name = NULL; + int be, nopad = FALSE, keep_as_directory = FALSE, orig_be; + squashfs_inode inode; diff --git a/tools/squashfs4/Makefile b/tools/squashfs4/Makefile new file mode 100644 index 0000000000..ce66a85580 --- /dev/null +++ b/tools/squashfs4/Makefile @@ -0,0 +1,44 @@ +# +# Copyright (C) 2006-2012 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# +include $(TOPDIR)/rules.mk + +PKG_NAME:=squashfs4 +PKG_CPE_ID:=cpe:/a:phillip_lougher:squashfs +PKG_VERSION:=4.6.1 +PKG_RELEASE=3 + +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://github.com/plougher/squashfs-tools +PKG_SOURCE_DATE:=2023-03-26 +PKG_SOURCE_VERSION:=d8cb82d9840330f9344ec37b992595b5d7b44184 +PKG_MIRROR_HASH:=fc625af657ca284d69fbc32e3bb572d0afd566cf816b7c1c1b66dda0a0c2760a + +HOST_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/host-build.mk + +define Host/Compile + +$(HOST_MAKE_VARS) \ + $(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR)/squashfs-tools \ + XZ_SUPPORT=1 \ + LZMA_XZ_SUPPORT=1 \ + XZ_EXTENDED_OPTIONS=1 \ + EXTRA_CFLAGS="-I$(STAGING_DIR_HOST)/include" \ + mksquashfs unsquashfs +endef + +define Host/Install + $(INSTALL_BIN) $(HOST_BUILD_DIR)/squashfs-tools/mksquashfs $(STAGING_DIR_HOST)/bin/mksquashfs4 + $(INSTALL_BIN) $(HOST_BUILD_DIR)/squashfs-tools/unsquashfs $(STAGING_DIR_HOST)/bin/unsquashfs4 +endef + +define Host/Clean + rm -f $(STAGING_DIR_HOST)/bin/mksquashfs4 + rm -f $(STAGING_DIR_HOST)/bin/unsquashfs4 +endef + +$(eval $(call HostBuild)) diff --git a/tools/squashfs4/patches/001-xz_wrapper-support-multiple-lzma-configuration-optio.patch b/tools/squashfs4/patches/001-xz_wrapper-support-multiple-lzma-configuration-optio.patch new file mode 100644 index 0000000000..bcc962a9de --- /dev/null +++ b/tools/squashfs4/patches/001-xz_wrapper-support-multiple-lzma-configuration-optio.patch @@ -0,0 +1,187 @@ +From dcb976fe4ee40e4bac8ae0dcc836629c625a6fd4 Mon Sep 17 00:00:00 2001 +From: Christian Marangi +Date: Fri, 14 Oct 2022 15:59:16 +0200 +Subject: [PATCH] xz_wrapper: support multiple lzma configuration options + +Add option to configure preset, lc, lp and pb lzma parameters. +-Xpreset can be used to set the compression level. +-Xe can be used to set the 'EXTREME' flag to use the lzma compression +options tweaking additional settings on top of the compression level set. + +New option added: + -Xpreset + -Xe + -Xlc + -Xlp + -Xpb + +Signed-off-by: Christian Marangi +--- + squashfs-tools/xz_wrapper.c | 119 ++++++++++++++++++++++++++++++++++-- + 1 file changed, 115 insertions(+), 4 deletions(-) + +--- a/squashfs-tools/xz_wrapper.c ++++ b/squashfs-tools/xz_wrapper.c +@@ -44,7 +44,10 @@ static struct bcj bcj[] = { + static int filter_count = 1; + static int dictionary_size = 0; + static float dictionary_percent = 0; +- ++static int preset = LZMA_PRESET_DEFAULT; ++static int lc = -1; ++static int lp = -1; ++static int pb = -1; + + /* + * This function is called by the options parsing code in mksquashfs.c +@@ -53,6 +56,11 @@ static float dictionary_percent = 0; + * Two specific options are supported: + * -Xbcj + * -Xdict-size ++ * -Xpreset ++ * -Xe ++ * -Xlc ++ * -Xlp ++ * -Xpb + * + * This function returns: + * >=0 (number of additional args parsed) on success +@@ -141,6 +149,85 @@ static int xz_options(char *argv[], int + } + + return 1; ++ } else if(strcmp(argv[0], "-Xpreset") == 0) { ++ char *b; ++ long val; ++ ++ if(argc < 2) { ++ fprintf(stderr, "xz: -Xpreset missing preset-level " ++ "(valid value 0-9)\n"); ++ goto failed; ++ } ++ ++ val = strtol(argv[1], &b, 10); ++ if (*b != '\0' || (int) val < 0 || (int) val & ~LZMA_PRESET_LEVEL_MASK) { ++ fprintf(stderr, "xz: -Xpreset can't be " ++ "negative or more than the max preset\n"); ++ goto failed; ++ } ++ ++ preset &= ~LZMA_PRESET_LEVEL_MASK; ++ preset |= (int) val; ++ ++ return 1; ++ } else if(strcmp(argv[0], "-Xe") == 0) { ++ preset |= LZMA_PRESET_EXTREME; ++ ++ return 0; ++ } else if(strcmp(argv[0], "-Xlc") == 0) { ++ char *b; ++ long val; ++ ++ if(argc < 2) { ++ fprintf(stderr, "xz: -Xlc missing value\n"); ++ goto failed; ++ } ++ ++ val = strtol(argv[1], &b, 10); ++ if (*b != '\0' || (int) val < LZMA_LCLP_MIN || (int) val > LZMA_LCLP_MAX) { ++ fprintf(stderr, "xz: -Xlc invalid value\n"); ++ goto failed; ++ } ++ ++ lc = (int) val; ++ ++ return 1; ++ } else if(strcmp(argv[0], "-Xlp") == 0) { ++ char *b; ++ long val; ++ ++ if(argc < 2) { ++ fprintf(stderr, "xz: -Xlp missing value\n"); ++ goto failed; ++ } ++ ++ val = strtol(argv[1], &b, 10); ++ if (*b != '\0' || (int) val < LZMA_LCLP_MIN || (int) val > LZMA_LCLP_MAX) { ++ fprintf(stderr, "xz: -Xlp invalid value\n"); ++ goto failed; ++ } ++ ++ lp = (int) val; ++ ++ return 1; ++ } else if(strcmp(argv[0], "-Xpb") == 0) { ++ char *b; ++ long val; ++ ++ if(argc < 2) { ++ fprintf(stderr, "xz: -Xpb missing value\n"); ++ goto failed; ++ } ++ ++ val = strtol(argv[1], &b, 10); ++ if (*b != '\0' || (int) val < LZMA_PB_MIN || (int) val > LZMA_PB_MAX) { ++ fprintf(stderr, "xz: -Xpb invalid value\n"); ++ goto failed; ++ } ++ ++ pb = (int) val; ++ ++ return 1; + } + + return -1; +@@ -446,11 +533,20 @@ static int xz_compress(void *strm, void + for(i = 0; i < stream->filters; i++) { + struct filter *filter = &stream->filter[i]; + +- if(lzma_lzma_preset(&stream->opt, LZMA_PRESET_DEFAULT)) +- goto failed; ++ if(lzma_lzma_preset(&stream->opt, preset)) ++ goto failed; + + stream->opt.dict_size = stream->dictionary_size; + ++ if (lc >= 0) ++ stream->opt.lc = lc; ++ ++ if (lp >= 0) ++ stream->opt.lp = lp; ++ ++ if (pb >= 0) ++ stream->opt.pb = pb; ++ + filter->length = 0; + res = lzma_stream_buffer_encode(filter->filter, + LZMA_CHECK_CRC32, NULL, src, size, filter->buffer, +@@ -521,13 +617,28 @@ static void xz_usage(FILE *stream) + fprintf(stream, " header as either 2^n or as 2^n+2^(n+1).\n\t\t"); + fprintf(stream, "Example dict-sizes are 75%%, 50%%, 37.5%%, 25%%, or"); + fprintf(stream, " 32K, 16K, 8K\n\t\tetc.\n"); ++ fprintf(stream, "\t -Xpreset \n"); ++ fprintf(stream, "\t\tUse as the custom preset to use"); ++ fprintf(stream, " on compress.\n\t\t should be 0 .. 9"); ++ fprintf(stream, " (default 6)\n"); ++ fprintf(stream, "\t -Xe\n"); ++ fprintf(stream, "\t\tEnable additional compression settings by passing"); ++ fprintf(stream, " the EXTREME\n\t\tflag to the compression flags.\n"); ++ fprintf(stream, "\t -Xlc \n"); ++ fprintf(stream, "\t -Xlp \n"); ++ fprintf(stream, "\t -Xpb \n"); + } + + + static int option_args(char *option) + { + if(strcmp(option, "-Xbcj") == 0 || +- strcmp(option, "-Xdict-size") == 0) ++ strcmp(option, "-Xdict-size") == 0 || ++ strcmp(option, "-Xpreset") == 0 || ++ strcmp(option, "-Xe") == 0 || ++ strcmp(option, "-Xlc") == 0 || ++ strcmp(option, "-Xlp") == 0 || ++ strcmp(option, "-Xpb") == 0) + return 1; + + return 0; diff --git a/tools/squashfs4/patches/002-xz_wrapper-make-new-OpenWrt-extended-options-non-def.patch b/tools/squashfs4/patches/002-xz_wrapper-make-new-OpenWrt-extended-options-non-def.patch new file mode 100644 index 0000000000..bafa1e6a32 --- /dev/null +++ b/tools/squashfs4/patches/002-xz_wrapper-make-new-OpenWrt-extended-options-non-def.patch @@ -0,0 +1,898 @@ +From 5fb9fdfb8757fc9afb6318a3dcf9dce0a97de352 Mon Sep 17 00:00:00 2001 +From: Phillip Lougher +Date: Wed, 19 Apr 2023 18:35:53 +0100 +Subject: [PATCH] xz_wrapper: make new libreCMC extended options non-default + +The reason why these options are being made non-default are +described here: + +https://github.com/plougher/squashfs-tools/pull/218#issuecomment-1515197256 + +The new options can be enabled by editing the Makefile or by defining +XZ_EXTENDED_OPTIONS on the Make command line, e.g. + +% CONFIG=1 XZ_SUPPORT=1 XZ_EXTENDED_OPTIONS=1 make + +Signed-off-by: Phillip Lougher +--- + squashfs-tools/Makefile | 12 + + squashfs-tools/xz_wrapper.c | 117 +---- + squashfs-tools/xz_wrapper_extended.c | 664 +++++++++++++++++++++++++++ + 3 files changed, 679 insertions(+), 114 deletions(-) + create mode 100644 squashfs-tools/xz_wrapper_extended.c + +--- a/squashfs-tools/Makefile ++++ b/squashfs-tools/Makefile +@@ -39,6 +39,10 @@ GZIP_SUPPORT = 1 + # + #XZ_SUPPORT = 1 + ++# Enable support for libreCMC extended compression options by uncommenting ++# next line. Do not do this unless you understand the implications. ++#XZ_EXTENDED_OPTIONS = 1 ++ + + ############ Building LZO support ############## + # +@@ -197,6 +201,7 @@ INSTALL_MANPAGES_DIR ?= $(INSTALL_PREFIX + LZMA_XZ_SUPPORT ?= 0 + LZMA_SUPPORT ?= 0 + LZMA_DIR ?= ../../../../LZMA/lzma465 ++XZ_EXTENDED_OPTIONS ?= 0 + endif + + +@@ -248,8 +253,13 @@ endif + + ifeq ($(XZ_SUPPORT),1) + CFLAGS += -DXZ_SUPPORT ++ifeq ($(XZ_EXTENDED_OPTIONS),1) ++MKSQUASHFS_OBJS += xz_wrapper_extended.o ++UNSQUASHFS_OBJS += xz_wrapper_extended.o ++else + MKSQUASHFS_OBJS += xz_wrapper.o + UNSQUASHFS_OBJS += xz_wrapper.o ++endif + LIBS += -llzma + COMPRESSORS += xz + endif +@@ -428,6 +438,8 @@ lz4_wrapper.o: lz4_wrapper.c squashfs_fs + + xz_wrapper.o: xz_wrapper.c squashfs_fs.h xz_wrapper.h compressor.h + ++xz_wrapper_extended.o: xz_wrapper_extended.c squashfs_fs.h xz_wrapper.h compressor.h ++ + unsquashfs: $(UNSQUASHFS_OBJS) + $(CC) $(LDFLAGS) $(EXTRA_LDFLAGS) $(UNSQUASHFS_OBJS) $(LIBS) -o $@ + ln -sf unsquashfs sqfscat +--- a/squashfs-tools/xz_wrapper.c ++++ b/squashfs-tools/xz_wrapper.c +@@ -44,10 +44,7 @@ static struct bcj bcj[] = { + static int filter_count = 1; + static int dictionary_size = 0; + static float dictionary_percent = 0; +-static int preset = LZMA_PRESET_DEFAULT; +-static int lc = -1; +-static int lp = -1; +-static int pb = -1; ++ + + /* + * This function is called by the options parsing code in mksquashfs.c +@@ -56,11 +53,6 @@ static int pb = -1; + * Two specific options are supported: + * -Xbcj + * -Xdict-size +- * -Xpreset +- * -Xe +- * -Xlc +- * -Xlp +- * -Xpb + * + * This function returns: + * >=0 (number of additional args parsed) on success +@@ -149,85 +141,6 @@ static int xz_options(char *argv[], int + } + + return 1; +- } else if(strcmp(argv[0], "-Xpreset") == 0) { +- char *b; +- long val; +- +- if(argc < 2) { +- fprintf(stderr, "xz: -Xpreset missing preset-level " +- "(valid value 0-9)\n"); +- goto failed; +- } +- +- val = strtol(argv[1], &b, 10); +- if (*b != '\0' || (int) val < 0 || (int) val & ~LZMA_PRESET_LEVEL_MASK) { +- fprintf(stderr, "xz: -Xpreset can't be " +- "negative or more than the max preset\n"); +- goto failed; +- } +- +- preset &= ~LZMA_PRESET_LEVEL_MASK; +- preset |= (int) val; +- +- return 1; +- } else if(strcmp(argv[0], "-Xe") == 0) { +- preset |= LZMA_PRESET_EXTREME; +- +- return 0; +- } else if(strcmp(argv[0], "-Xlc") == 0) { +- char *b; +- long val; +- +- if(argc < 2) { +- fprintf(stderr, "xz: -Xlc missing value\n"); +- goto failed; +- } +- +- val = strtol(argv[1], &b, 10); +- if (*b != '\0' || (int) val < LZMA_LCLP_MIN || (int) val > LZMA_LCLP_MAX) { +- fprintf(stderr, "xz: -Xlc invalid value\n"); +- goto failed; +- } +- +- lc = (int) val; +- +- return 1; +- } else if(strcmp(argv[0], "-Xlp") == 0) { +- char *b; +- long val; +- +- if(argc < 2) { +- fprintf(stderr, "xz: -Xlp missing value\n"); +- goto failed; +- } +- +- val = strtol(argv[1], &b, 10); +- if (*b != '\0' || (int) val < LZMA_LCLP_MIN || (int) val > LZMA_LCLP_MAX) { +- fprintf(stderr, "xz: -Xlp invalid value\n"); +- goto failed; +- } +- +- lp = (int) val; +- +- return 1; +- } else if(strcmp(argv[0], "-Xpb") == 0) { +- char *b; +- long val; +- +- if(argc < 2) { +- fprintf(stderr, "xz: -Xpb missing value\n"); +- goto failed; +- } +- +- val = strtol(argv[1], &b, 10); +- if (*b != '\0' || (int) val < LZMA_PB_MIN || (int) val > LZMA_PB_MAX) { +- fprintf(stderr, "xz: -Xpb invalid value\n"); +- goto failed; +- } +- +- pb = (int) val; +- +- return 1; + } + + return -1; +@@ -533,20 +446,11 @@ static int xz_compress(void *strm, void + for(i = 0; i < stream->filters; i++) { + struct filter *filter = &stream->filter[i]; + +- if(lzma_lzma_preset(&stream->opt, preset)) ++ if(lzma_lzma_preset(&stream->opt, LZMA_PRESET_DEFAULT)) + goto failed; + + stream->opt.dict_size = stream->dictionary_size; + +- if (lc >= 0) +- stream->opt.lc = lc; +- +- if (lp >= 0) +- stream->opt.lp = lp; +- +- if (pb >= 0) +- stream->opt.pb = pb; +- + filter->length = 0; + res = lzma_stream_buffer_encode(filter->filter, + LZMA_CHECK_CRC32, NULL, src, size, filter->buffer, +@@ -617,28 +521,13 @@ static void xz_usage(FILE *stream) + fprintf(stream, " header as either 2^n or as 2^n+2^(n+1).\n\t\t"); + fprintf(stream, "Example dict-sizes are 75%%, 50%%, 37.5%%, 25%%, or"); + fprintf(stream, " 32K, 16K, 8K\n\t\tetc.\n"); +- fprintf(stream, "\t -Xpreset \n"); +- fprintf(stream, "\t\tUse as the custom preset to use"); +- fprintf(stream, " on compress.\n\t\t should be 0 .. 9"); +- fprintf(stream, " (default 6)\n"); +- fprintf(stream, "\t -Xe\n"); +- fprintf(stream, "\t\tEnable additional compression settings by passing"); +- fprintf(stream, " the EXTREME\n\t\tflag to the compression flags.\n"); +- fprintf(stream, "\t -Xlc \n"); +- fprintf(stream, "\t -Xlp \n"); +- fprintf(stream, "\t -Xpb \n"); + } + + + static int option_args(char *option) + { + if(strcmp(option, "-Xbcj") == 0 || +- strcmp(option, "-Xdict-size") == 0 || +- strcmp(option, "-Xpreset") == 0 || +- strcmp(option, "-Xe") == 0 || +- strcmp(option, "-Xlc") == 0 || +- strcmp(option, "-Xlp") == 0 || +- strcmp(option, "-Xpb") == 0) ++ strcmp(option, "-Xdict-size") == 0) + return 1; + + return 0; +--- /dev/null ++++ b/squashfs-tools/xz_wrapper_extended.c +@@ -0,0 +1,664 @@ ++/* ++ * Copyright (c) 2010, 2011, 2012, 2013, 2021, 2022 ++ * Phillip Lougher ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version 2, ++ * or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ * ++ * xz_wrapper_extended.c ++ * ++ * Support for XZ (LZMA2) compression using XZ Utils liblzma ++ * http://tukaani.org/xz/ ++ * ++ * This file supports libreCMC extended XZ compression options. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#include "squashfs_fs.h" ++#include "xz_wrapper.h" ++#include "compressor.h" ++ ++static struct bcj bcj[] = { ++ { "x86", LZMA_FILTER_X86, 0 }, ++ { "powerpc", LZMA_FILTER_POWERPC, 0 }, ++ { "ia64", LZMA_FILTER_IA64, 0 }, ++ { "arm", LZMA_FILTER_ARM, 0 }, ++ { "armthumb", LZMA_FILTER_ARMTHUMB, 0 }, ++ { "sparc", LZMA_FILTER_SPARC, 0 }, ++ { NULL, LZMA_VLI_UNKNOWN, 0 } ++}; ++ ++static int filter_count = 1; ++static int dictionary_size = 0; ++static float dictionary_percent = 0; ++static int preset = LZMA_PRESET_DEFAULT; ++static int lc = -1; ++static int lp = -1; ++static int pb = -1; ++ ++/* ++ * This function is called by the options parsing code in mksquashfs.c ++ * to parse any -X compressor option. ++ * ++ * Two specific options are supported: ++ * -Xbcj ++ * -Xdict-size ++ * -Xpreset ++ * -Xe ++ * -Xlc ++ * -Xlp ++ * -Xpb ++ * ++ * This function returns: ++ * >=0 (number of additional args parsed) on success ++ * -1 if the option was unrecognised, or ++ * -2 if the option was recognised, but otherwise bad in ++ * some way (e.g. invalid parameter) ++ * ++ * Note: this function sets internal compressor state, but does not ++ * pass back the results of the parsing other than success/failure. ++ * The xz_dump_options() function is called later to get the options in ++ * a format suitable for writing to the filesystem. ++ */ ++static int xz_options(char *argv[], int argc) ++{ ++ int i; ++ char *name; ++ ++ if(strcmp(argv[0], "-Xbcj") == 0) { ++ if(argc < 2) { ++ fprintf(stderr, "xz: -Xbcj missing filter\n"); ++ goto failed; ++ } ++ ++ name = argv[1]; ++ while(name[0] != '\0') { ++ for(i = 0; bcj[i].name; i++) { ++ int n = strlen(bcj[i].name); ++ if((strncmp(name, bcj[i].name, n) == 0) && ++ (name[n] == '\0' || ++ name[n] == ',')) { ++ if(bcj[i].selected == 0) { ++ bcj[i].selected = 1; ++ filter_count++; ++ } ++ name += name[n] == ',' ? n + 1 : n; ++ break; ++ } ++ } ++ if(bcj[i].name == NULL) { ++ fprintf(stderr, "xz: -Xbcj unrecognised " ++ "filter\n"); ++ goto failed; ++ } ++ } ++ ++ return 1; ++ } else if(strcmp(argv[0], "-Xdict-size") == 0) { ++ char *b; ++ float size; ++ ++ if(argc < 2) { ++ fprintf(stderr, "xz: -Xdict-size missing dict-size\n"); ++ goto failed; ++ } ++ ++ size = strtof(argv[1], &b); ++ if(*b == '%') { ++ if(size <= 0 || size > 100) { ++ fprintf(stderr, "xz: -Xdict-size percentage " ++ "should be 0 < dict-size <= 100\n"); ++ goto failed; ++ } ++ ++ dictionary_percent = size; ++ dictionary_size = 0; ++ } else { ++ if((float) ((int) size) != size) { ++ fprintf(stderr, "xz: -Xdict-size can't be " ++ "fractional unless a percentage of the" ++ " block size\n"); ++ goto failed; ++ } ++ ++ dictionary_percent = 0; ++ dictionary_size = (int) size; ++ ++ if(*b == 'k' || *b == 'K') ++ dictionary_size *= 1024; ++ else if(*b == 'm' || *b == 'M') ++ dictionary_size *= 1024 * 1024; ++ else if(*b != '\0') { ++ fprintf(stderr, "xz: -Xdict-size invalid " ++ "dict-size\n"); ++ goto failed; ++ } ++ } ++ ++ return 1; ++ } else if(strcmp(argv[0], "-Xpreset") == 0) { ++ char *b; ++ long val; ++ ++ if(argc < 2) { ++ fprintf(stderr, "xz: -Xpreset missing preset-level " ++ "(valid value 0-9)\n"); ++ goto failed; ++ } ++ ++ val = strtol(argv[1], &b, 10); ++ if (*b != '\0' || (int) val < 0 || (int) val & ~LZMA_PRESET_LEVEL_MASK) { ++ fprintf(stderr, "xz: -Xpreset can't be " ++ "negative or more than the max preset\n"); ++ goto failed; ++ } ++ ++ preset &= ~LZMA_PRESET_LEVEL_MASK; ++ preset |= (int) val; ++ ++ return 1; ++ } else if(strcmp(argv[0], "-Xe") == 0) { ++ preset |= LZMA_PRESET_EXTREME; ++ ++ return 0; ++ } else if(strcmp(argv[0], "-Xlc") == 0) { ++ char *b; ++ long val; ++ ++ if(argc < 2) { ++ fprintf(stderr, "xz: -Xlc missing value\n"); ++ goto failed; ++ } ++ ++ val = strtol(argv[1], &b, 10); ++ if (*b != '\0' || (int) val < LZMA_LCLP_MIN || (int) val > LZMA_LCLP_MAX) { ++ fprintf(stderr, "xz: -Xlc invalid value\n"); ++ goto failed; ++ } ++ ++ lc = (int) val; ++ ++ return 1; ++ } else if(strcmp(argv[0], "-Xlp") == 0) { ++ char *b; ++ long val; ++ ++ if(argc < 2) { ++ fprintf(stderr, "xz: -Xlp missing value\n"); ++ goto failed; ++ } ++ ++ val = strtol(argv[1], &b, 10); ++ if (*b != '\0' || (int) val < LZMA_LCLP_MIN || (int) val > LZMA_LCLP_MAX) { ++ fprintf(stderr, "xz: -Xlp invalid value\n"); ++ goto failed; ++ } ++ ++ lp = (int) val; ++ ++ return 1; ++ } else if(strcmp(argv[0], "-Xpb") == 0) { ++ char *b; ++ long val; ++ ++ if(argc < 2) { ++ fprintf(stderr, "xz: -Xpb missing value\n"); ++ goto failed; ++ } ++ ++ val = strtol(argv[1], &b, 10); ++ if (*b != '\0' || (int) val < LZMA_PB_MIN || (int) val > LZMA_PB_MAX) { ++ fprintf(stderr, "xz: -Xpb invalid value\n"); ++ goto failed; ++ } ++ ++ pb = (int) val; ++ ++ return 1; ++ } ++ ++ return -1; ++ ++failed: ++ return -2; ++} ++ ++ ++/* ++ * This function is called after all options have been parsed. ++ * It is used to do post-processing on the compressor options using ++ * values that were not expected to be known at option parse time. ++ * ++ * In this case block_size may not be known until after -Xdict-size has ++ * been processed (in the case where -b is specified after -Xdict-size) ++ * ++ * This function returns 0 on successful post processing, or ++ * -1 on error ++ */ ++static int xz_options_post(int block_size) ++{ ++ /* ++ * if -Xdict-size has been specified use this to compute the datablock ++ * dictionary size ++ */ ++ if(dictionary_size || dictionary_percent) { ++ int n; ++ ++ if(dictionary_size) { ++ if(dictionary_size > block_size) { ++ fprintf(stderr, "xz: -Xdict-size is larger than" ++ " block_size\n"); ++ goto failed; ++ } ++ } else ++ dictionary_size = block_size * dictionary_percent / 100; ++ ++ if(dictionary_size < 8192) { ++ fprintf(stderr, "xz: -Xdict-size should be 8192 bytes " ++ "or larger\n"); ++ goto failed; ++ } ++ ++ /* ++ * dictionary_size must be storable in xz header as either ++ * 2^n or as 2^n+2^(n+1) ++ */ ++ n = ffs(dictionary_size) - 1; ++ if(dictionary_size != (1 << n) && ++ dictionary_size != ((1 << n) + (1 << (n + 1)))) { ++ fprintf(stderr, "xz: -Xdict-size is an unsupported " ++ "value, dict-size must be storable in xz " ++ "header\n"); ++ fprintf(stderr, "as either 2^n or as 2^n+2^(n+1). " ++ "Example dict-sizes are 75%%, 50%%, 37.5%%, " ++ "25%%,\n"); ++ fprintf(stderr, "or 32K, 16K, 8K etc.\n"); ++ goto failed; ++ } ++ ++ } else ++ /* No -Xdict-size specified, use defaults */ ++ dictionary_size = block_size; ++ ++ return 0; ++ ++failed: ++ return -1; ++} ++ ++ ++/* ++ * This function is called by mksquashfs to dump the parsed ++ * compressor options in a format suitable for writing to the ++ * compressor options field in the filesystem (stored immediately ++ * after the superblock). ++ * ++ * This function returns a pointer to the compression options structure ++ * to be stored (and the size), or NULL if there are no compression ++ * options ++ */ ++static void *xz_dump_options(int block_size, int *size) ++{ ++ static struct comp_opts comp_opts; ++ int flags = 0, i; ++ ++ /* ++ * don't store compressor specific options in file system if the ++ * default options are being used - no compressor options in the ++ * file system means the default options are always assumed ++ * ++ * Defaults are: ++ * metadata dictionary size: SQUASHFS_METADATA_SIZE ++ * datablock dictionary size: block_size ++ * 1 filter ++ */ ++ if(dictionary_size == block_size && filter_count == 1) ++ return NULL; ++ ++ for(i = 0; bcj[i].name; i++) ++ flags |= bcj[i].selected << i; ++ ++ comp_opts.dictionary_size = dictionary_size; ++ comp_opts.flags = flags; ++ ++ SQUASHFS_INSWAP_COMP_OPTS(&comp_opts); ++ ++ *size = sizeof(comp_opts); ++ return &comp_opts; ++} ++ ++ ++/* ++ * This function is a helper specifically for the append mode of ++ * mksquashfs. Its purpose is to set the internal compressor state ++ * to the stored compressor options in the passed compressor options ++ * structure. ++ * ++ * In effect this function sets up the compressor options ++ * to the same state they were when the filesystem was originally ++ * generated, this is to ensure on appending, the compressor uses ++ * the same compression options that were used to generate the ++ * original filesystem. ++ * ++ * Note, even if there are no compressor options, this function is still ++ * called with an empty compressor structure (size == 0), to explicitly ++ * set the default options, this is to ensure any user supplied ++ * -X options on the appending mksquashfs command line are over-ridden ++ * ++ * This function returns 0 on sucessful extraction of options, and ++ * -1 on error ++ */ ++static int xz_extract_options(int block_size, void *buffer, int size) ++{ ++ struct comp_opts *comp_opts = buffer; ++ int flags, i, n; ++ ++ if(size == 0) { ++ /* set defaults */ ++ dictionary_size = block_size; ++ flags = 0; ++ } else { ++ /* check passed comp opts struct is of the correct length */ ++ if(size != sizeof(struct comp_opts)) ++ goto failed; ++ ++ SQUASHFS_INSWAP_COMP_OPTS(comp_opts); ++ ++ dictionary_size = comp_opts->dictionary_size; ++ flags = comp_opts->flags; ++ ++ /* ++ * check that the dictionary size seems correct - the dictionary ++ * size should 2^n or 2^n+2^(n+1) ++ */ ++ n = ffs(dictionary_size) - 1; ++ if(dictionary_size != (1 << n) && ++ dictionary_size != ((1 << n) + (1 << (n + 1)))) ++ goto failed; ++ } ++ ++ filter_count = 1; ++ for(i = 0; bcj[i].name; i++) { ++ if((flags >> i) & 1) { ++ bcj[i].selected = 1; ++ filter_count ++; ++ } else ++ bcj[i].selected = 0; ++ } ++ ++ return 0; ++ ++failed: ++ fprintf(stderr, "xz: error reading stored compressor options from " ++ "filesystem!\n"); ++ ++ return -1; ++} ++ ++ ++static void xz_display_options(void *buffer, int size) ++{ ++ struct comp_opts *comp_opts = buffer; ++ int dictionary_size, flags, printed; ++ int i, n; ++ ++ /* check passed comp opts struct is of the correct length */ ++ if(size != sizeof(struct comp_opts)) ++ goto failed; ++ ++ SQUASHFS_INSWAP_COMP_OPTS(comp_opts); ++ ++ dictionary_size = comp_opts->dictionary_size; ++ flags = comp_opts->flags; ++ ++ /* ++ * check that the dictionary size seems correct - the dictionary ++ * size should 2^n or 2^n+2^(n+1) ++ */ ++ n = ffs(dictionary_size) - 1; ++ if(dictionary_size != (1 << n) && ++ dictionary_size != ((1 << n) + (1 << (n + 1)))) ++ goto failed; ++ ++ printf("\tDictionary size %d\n", dictionary_size); ++ ++ printed = 0; ++ for(i = 0; bcj[i].name; i++) { ++ if((flags >> i) & 1) { ++ if(printed) ++ printf(", "); ++ else ++ printf("\tFilters selected: "); ++ printf("%s", bcj[i].name); ++ printed = 1; ++ } ++ } ++ ++ if(!printed) ++ printf("\tNo filters specified\n"); ++ else ++ printf("\n"); ++ ++ return; ++ ++failed: ++ fprintf(stderr, "xz: error reading stored compressor options from " ++ "filesystem!\n"); ++} ++ ++ ++/* ++ * This function is called by mksquashfs to initialise the ++ * compressor, before compress() is called. ++ * ++ * This function returns 0 on success, and ++ * -1 on error ++ */ ++static int xz_init(void **strm, int block_size, int datablock) ++{ ++ int i, j, filters = datablock ? filter_count : 1; ++ struct filter *filter = malloc(filters * sizeof(struct filter)); ++ struct xz_stream *stream; ++ ++ if(filter == NULL) ++ goto failed; ++ ++ stream = *strm = malloc(sizeof(struct xz_stream)); ++ if(stream == NULL) ++ goto failed2; ++ ++ stream->filter = filter; ++ stream->filters = filters; ++ ++ memset(filter, 0, filters * sizeof(struct filter)); ++ ++ stream->dictionary_size = datablock ? dictionary_size : ++ SQUASHFS_METADATA_SIZE; ++ ++ filter[0].filter[0].id = LZMA_FILTER_LZMA2; ++ filter[0].filter[0].options = &stream->opt; ++ filter[0].filter[1].id = LZMA_VLI_UNKNOWN; ++ ++ for(i = 0, j = 1; datablock && bcj[i].name; i++) { ++ if(bcj[i].selected) { ++ filter[j].buffer = malloc(block_size); ++ if(filter[j].buffer == NULL) ++ goto failed3; ++ filter[j].filter[0].id = bcj[i].id; ++ filter[j].filter[1].id = LZMA_FILTER_LZMA2; ++ filter[j].filter[1].options = &stream->opt; ++ filter[j].filter[2].id = LZMA_VLI_UNKNOWN; ++ j++; ++ } ++ } ++ ++ return 0; ++ ++failed3: ++ for(i = 1; i < filters; i++) ++ free(filter[i].buffer); ++ free(stream); ++ ++failed2: ++ free(filter); ++ ++failed: ++ return -1; ++} ++ ++ ++static int xz_compress(void *strm, void *dest, void *src, int size, ++ int block_size, int *error) ++{ ++ int i; ++ lzma_ret res = 0; ++ struct xz_stream *stream = strm; ++ struct filter *selected = NULL; ++ ++ stream->filter[0].buffer = dest; ++ ++ for(i = 0; i < stream->filters; i++) { ++ struct filter *filter = &stream->filter[i]; ++ ++ if(lzma_lzma_preset(&stream->opt, preset)) ++ goto failed; ++ ++ stream->opt.dict_size = stream->dictionary_size; ++ ++ if (lc >= 0) ++ stream->opt.lc = lc; ++ ++ if (lp >= 0) ++ stream->opt.lp = lp; ++ ++ if (pb >= 0) ++ stream->opt.pb = pb; ++ ++ filter->length = 0; ++ res = lzma_stream_buffer_encode(filter->filter, ++ LZMA_CHECK_CRC32, NULL, src, size, filter->buffer, ++ &filter->length, block_size); ++ ++ if(res == LZMA_OK) { ++ if(!selected || selected->length > filter->length) ++ selected = filter; ++ } else if(res != LZMA_BUF_ERROR) ++ goto failed; ++ } ++ ++ if(!selected) ++ /* ++ * Output buffer overflow. Return out of buffer space ++ */ ++ return 0; ++ ++ if(selected->buffer != dest) ++ memcpy(dest, selected->buffer, selected->length); ++ ++ return (int) selected->length; ++ ++failed: ++ /* ++ * All other errors return failure, with the compressor ++ * specific error code in *error ++ */ ++ *error = res; ++ return -1; ++} ++ ++ ++static int xz_uncompress(void *dest, void *src, int size, int outsize, ++ int *error) ++{ ++ size_t src_pos = 0; ++ size_t dest_pos = 0; ++ uint64_t memlimit = MEMLIMIT; ++ ++ lzma_ret res = lzma_stream_buffer_decode(&memlimit, 0, NULL, ++ src, &src_pos, size, dest, &dest_pos, outsize); ++ ++ if(res == LZMA_OK && size == (int) src_pos) ++ return (int) dest_pos; ++ else { ++ *error = res; ++ return -1; ++ } ++} ++ ++ ++static void xz_usage(FILE *stream) ++{ ++ fprintf(stream, "\t -Xbcj filter1,filter2,...,filterN\n"); ++ fprintf(stream, "\t\tCompress using filter1,filter2,...,filterN in"); ++ fprintf(stream, " turn\n\t\t(in addition to no filter), and choose"); ++ fprintf(stream, " the best compression.\n"); ++ fprintf(stream, "\t\tAvailable filters: x86, arm, armthumb,"); ++ fprintf(stream, " powerpc, sparc, ia64\n"); ++ fprintf(stream, "\t -Xdict-size \n"); ++ fprintf(stream, "\t\tUse as the XZ dictionary size. The"); ++ fprintf(stream, " dictionary size\n\t\tcan be specified as a"); ++ fprintf(stream, " percentage of the block size, or as an\n\t\t"); ++ fprintf(stream, "absolute value. The dictionary size must be less"); ++ fprintf(stream, " than or equal\n\t\tto the block size and 8192 bytes"); ++ fprintf(stream, " or larger. It must also be\n\t\tstorable in the xz"); ++ fprintf(stream, " header as either 2^n or as 2^n+2^(n+1).\n\t\t"); ++ fprintf(stream, "Example dict-sizes are 75%%, 50%%, 37.5%%, 25%%, or"); ++ fprintf(stream, " 32K, 16K, 8K\n\t\tetc.\n"); ++ fprintf(stream, "\t -Xpreset \n"); ++ fprintf(stream, "\t\tUse as the custom preset to use"); ++ fprintf(stream, " on compress.\n\t\t should be 0 .. 9"); ++ fprintf(stream, " (default 6)\n"); ++ fprintf(stream, "\t -Xe\n"); ++ fprintf(stream, "\t\tEnable additional compression settings by passing"); ++ fprintf(stream, " the EXTREME\n\t\tflag to the compression flags.\n"); ++ fprintf(stream, "\t -Xlc \n"); ++ fprintf(stream, "\t -Xlp \n"); ++ fprintf(stream, "\t -Xpb \n"); ++} ++ ++ ++static int option_args(char *option) ++{ ++ if(strcmp(option, "-Xbcj") == 0 || ++ strcmp(option, "-Xdict-size") == 0 || ++ strcmp(option, "-Xpreset") == 0 || ++ strcmp(option, "-Xe") == 0 || ++ strcmp(option, "-Xlc") == 0 || ++ strcmp(option, "-Xlp") == 0 || ++ strcmp(option, "-Xpb") == 0) ++ return 1; ++ ++ return 0; ++} ++ ++ ++struct compressor xz_comp_ops = { ++ .init = xz_init, ++ .compress = xz_compress, ++ .uncompress = xz_uncompress, ++ .options = xz_options, ++ .options_post = xz_options_post, ++ .dump_options = xz_dump_options, ++ .extract_options = xz_extract_options, ++ .display_options = xz_display_options, ++ .usage = xz_usage, ++ .option_args = option_args, ++ .id = XZ_COMPRESSION, ++ .name = "xz", ++ .supported = 1 ++}; diff --git a/tools/squashfskit4/Makefile b/tools/squashfskit4/Makefile deleted file mode 100644 index 1800306d33..0000000000 --- a/tools/squashfskit4/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -# -# Copyright (C) 2009-2012 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# -include $(TOPDIR)/rules.mk - -PKG_NAME:=squashfskit4 -PKG_VERSION:=4.14 -PKG_RELEASE:=3 -PKG_SOURCE:=squashfskit-v$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=https://github.com/squashfskit/squashfskit/releases/download/v$(PKG_VERSION)/ -PKG_HASH:=5761aaa3aedc4f7112b708367d891c9abdc1ffea972e3fe47923ddba23984d95 - -HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/squashfskit-v$(PKG_VERSION) - -include $(INCLUDE_DIR)/host-build.mk - -define Host/Compile - +$(HOST_MAKE_VARS) \ - $(MAKE) -C $(HOST_BUILD_DIR)/squashfs-tools \ - XZ_SUPPORT=1 \ - LZMA_XZ_SUPPORT=1 \ - XATTR_SUPPORT=1 \ - LZMA_LIB="$(STAGING_DIR_HOST)/lib/liblzma.a" \ - EXTRA_CFLAGS="-I$(STAGING_DIR_HOST)/include" \ - mksquashfs unsquashfs -endef - -define Host/Install - $(INSTALL_BIN) $(HOST_BUILD_DIR)/squashfs-tools/mksquashfs $(STAGING_DIR_HOST)/bin/mksquashfs4 - $(INSTALL_BIN) $(HOST_BUILD_DIR)/squashfs-tools/unsquashfs $(STAGING_DIR_HOST)/bin/unsquashfs4 -endef - -define Host/Clean - rm -f $(STAGING_DIR_HOST)/bin/mksquashfs4 - rm -f $(STAGING_DIR_HOST)/bin/unsquashfs4 -endef - -$(eval $(call HostBuild)) diff --git a/tools/squashfskit4/patches/0001-fix-version.sh.patch b/tools/squashfskit4/patches/0001-fix-version.sh.patch deleted file mode 100644 index 5f0894bc17..0000000000 --- a/tools/squashfskit4/patches/0001-fix-version.sh.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- a/squashfs-tools/version.sh -+++ b/squashfs-tools/version.sh -@@ -27,13 +27,11 @@ if [ -z "$OUTPUT" ] ; then - fi - - our_date() { --case $(uname) in --NetBSD|OpenBSD|DragonFly|FreeBSD|Darwin) -- date -r "$1" "$2" -- ;; --*) -- date -d "@$1" "$2" --esac -+ if date --version 2>&1 | grep -q "GNU coreutils"; then -+ date -d "@$1" "$2" -+ else -+ date -r "$1" "$2" -+ fi - } - - try_version() { diff --git a/tools/squashfskit4/patches/0002-fix-build-failure-against-gcc-10.patch b/tools/squashfskit4/patches/0002-fix-build-failure-against-gcc-10.patch deleted file mode 100644 index de77299978..0000000000 --- a/tools/squashfskit4/patches/0002-fix-build-failure-against-gcc-10.patch +++ /dev/null @@ -1,41 +0,0 @@ -From fe2f5da4b0f8994169c53e84b7cb8a0feefc97b5 Mon Sep 17 00:00:00 2001 -From: Sergei Trofimovich -Date: Sun, 26 Jan 2020 18:35:13 +0000 -Subject: [PATCH] squashfs-tools: fix build failure against gcc-10 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -On gcc-10 (and gcc-9 -fno-common) build fails as: - -``` -cc ... -o mksquashfs -ld: read_fs.o:(.bss+0x0): - multiple definition of `fwriter_buffer'; mksquashfs.o:(.bss+0x400c90): first defined here -ld: read_fs.o:(.bss+0x8): - multiple definition of `bwriter_buffer'; mksquashfs.o:(.bss+0x400c98): first defined here -``` - -gcc-10 will change the default from -fcommon to fno-common: -https://gcc.gnu.org/PR85678. - -The error also happens if CFLAGS=-fno-common passed explicitly. - -Reported-by: Toralf Förster -Bug: https://bugs.gentoo.org/706456 -Signed-off-by: Sergei Trofimovich ---- - squashfs-tools/mksquashfs.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/squashfs-tools/mksquashfs.h -+++ b/squashfs-tools/mksquashfs.h -@@ -133,7 +133,7 @@ struct append_file { - #define BLOCK_OFFSET 2 - - extern struct cache *reader_buffer, *fragment_buffer, *reserve_cache; --struct cache *bwriter_buffer, *fwriter_buffer; -+extern struct cache *bwriter_buffer, *fwriter_buffer; - extern struct queue *to_reader, *to_deflate, *to_writer, *from_writer, - *locked_fragment, *to_process_frag; - extern struct append_file **file_mapping; diff --git a/tools/squashfskit4/patches/0010-portability.patch b/tools/squashfskit4/patches/0010-portability.patch deleted file mode 100644 index 2cc50ae8f0..0000000000 --- a/tools/squashfskit4/patches/0010-portability.patch +++ /dev/null @@ -1,37 +0,0 @@ ---- a/squashfs-tools/xattr.c -+++ b/squashfs-tools/xattr.c -@@ -113,6 +113,7 @@ static int get_prefix(struct xattr_list - - static int read_xattrs_from_system(char *filename, struct xattr_list **xattrs) - { -+#if defined(linux) - ssize_t size, vsize; - char *xattr_names, *p; - int i; -@@ -222,6 +223,10 @@ failed: - free(xattr_list); - free(xattr_names); - return 0; -+#else -+ *xattrs = NULL; -+ return 0; -+#endif - } - - ---- a/squashfs-tools/unsquashfs_xattr.c -+++ b/squashfs-tools/unsquashfs_xattr.c -@@ -34,6 +34,7 @@ extern int user_xattrs; - - void write_xattr(char *pathname, unsigned int xattr) - { -+#if defined(linux) - unsigned int count; - struct xattr_list *xattr_list; - int i; -@@ -136,4 +137,5 @@ void write_xattr(char *pathname, unsigne - } - - free_xattr(xattr_list, count); -+#endif - } diff --git a/tools/squashfskit4/patches/0020-big-endian.patch b/tools/squashfskit4/patches/0020-big-endian.patch deleted file mode 100644 index b388cb4d12..0000000000 --- a/tools/squashfskit4/patches/0020-big-endian.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/squashfs-tools/xz_wrapper.c -+++ b/squashfs-tools/xz_wrapper.c -@@ -192,7 +192,10 @@ static void xz_display_options(void *buf - if(size != sizeof(struct comp_opts)) - goto failed; - -- SQUASHFS_INSWAP_LZMA_COMP_OPTS(comp_opts); -+#if __BYTE_ORDER == __BIG_ENDIAN -+ comp_opts->dictionary_size = inswap_le32(comp_opts->dictionary_size); -+ comp_opts->flags = inswap_le32(comp_opts->flags); -+#endif - - dictionary_size = comp_opts->dictionary_size; - flags = comp_opts->flags; diff --git a/tools/tar/Makefile b/tools/tar/Makefile index f1dfc11f93..47aad9ec6e 100644 --- a/tools/tar/Makefile +++ b/tools/tar/Makefile @@ -28,4 +28,8 @@ HOST_CONFIGURE_ARGS += \ --disable-acl \ --disable-nls +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/xz/Makefile b/tools/xz/Makefile index 4b13f727da..67f96aa0de 100644 --- a/tools/xz/Makefile +++ b/tools/xz/Makefile @@ -7,12 +7,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=xz -PKG_VERSION:=5.2.5 +PKG_VERSION:=5.4.3 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=@SF/lzmautils \ http://tukaani.org/xz -PKG_HASH:=5117f930900b341493827d63aa910ff5e011e0b994197c3b71c08a20228a42df +PKG_HASH:=9243a04598d7a70c1f567a0143a255581ac5c64b140fd55fd5cbc1e00b0e6f90 PKG_CPE_ID:=cpe:/a:tukaani:xz HOST_BUILD_PARALLEL:=1 @@ -33,4 +33,8 @@ define Host/Install +$(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR) install xzlinks="unxz xzcat" endef +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) +endef + $(eval $(call HostBuild)) diff --git a/tools/zip/Makefile b/tools/zip/Makefile index 7dd81a1b8b..5ad124d1c3 100644 --- a/tools/zip/Makefile +++ b/tools/zip/Makefile @@ -17,6 +17,7 @@ PKG_HASH:=f0e8bb1f9b7eb0b01285495a2699df3a4b766784c1765a8f1aeedf63c0806369 PKG_LICENSE:=BSD-4-Clause PKG_LICENSE_FILES:=LICENSE +PKG_CPE_ID:=cpe:/a:zip_project:zip HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_VERSION)/zip$(PKG_REV) HOST_BUILD_PARALLEL:=1 @@ -32,5 +33,8 @@ define Host/Install $(INSTALL_BIN) $(HOST_BUILD_DIR)/zip $(STAGING_DIR_HOST)/bin/ endef +define Host/Clean + rm -rf $(STAGING_DIR_HOST)/bin/zip +endef + $(eval $(call HostBuild)) -#$(eval $(call BuildPackage,zip)) diff --git a/tools/zlib/Makefile b/tools/zlib/Makefile index c83cc6d55b..17fe9fa233 100644 --- a/tools/zlib/Makefile +++ b/tools/zlib/Makefile @@ -8,34 +8,34 @@ include $(TOPDIR)/rules.mk PKG_NAME:=zlib -PKG_VERSION:=1.2.11 -PKG_RELEASE:=2 +PKG_VERSION:=1.2.13 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=@SF/libpng http://www.zlib.net -PKG_HASH:=4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066 +PKG_SOURCE_URL:=https://github.com/madler/zlib/releases/download/v$(PKG_VERSION) +PKG_HASH:=d14c38e313afc35a9a8760dadf26042f51ea0f5d154b0630a31da0540107fb98 PKG_LICENSE:=Zlib PKG_LICENSE_FILES:=README PKG_CPE_ID:=cpe:/a:gnu:zlib +HOST_BUILD_PARALLEL:=1 + include $(INCLUDE_DIR)/host-build.mk -include $(INCLUDE_DIR)/cmake.mk -HOST_CFLAGS +=-fPIC +HOSTCC := $(HOSTCC_NOCACHE) +HOST_CFLAGS += $(HOST_FPIC) -define Host/Install - $(CP) $(HOST_BUILD_DIR)/libz.a $(STAGING_DIR_HOST)/lib/ - $(CP) $(HOST_BUILD_DIR)/zconf.h $(STAGING_DIR_HOST)/include/ - $(CP) $(HOST_BUILD_DIR)/zlib.h $(STAGING_DIR_HOST)/include/ - $(CP) $(HOST_BUILD_DIR)/zlib.pc $(STAGING_DIR_HOST)/lib/pkgconfig/ -endef +HOST_CONFIGURE_ARGS = \ + --prefix=$(STAGING_DIR_HOST) \ + --sysconfdir=$(STAGING_DIR_HOST)/etc \ + --localstatedir=$(STAGING_DIR_HOST)/var \ + --libdir=$(STAGING_DIR_HOST)/lib \ + --includedir=$(STAGING_DIR_HOST)/include \ + --static -define Host/Clean - rm -f $(STAGING_DIR_HOST)/lib/libz.a - rm -f $(STAGING_DIR_HOST)/include/zconf.h - rm -f $(STAGING_DIR_HOST)/include/zlib.h - rm -f $(STAGING_DIR_HOST)/lib/pkgconfig//zlib.pc +define Host/Uninstall + -$(call Host/Compile/Default,uninstall) endef $(eval $(call HostBuild)) diff --git a/tools/zlib/patches/006-fix-compressor-crash-on-certain-inputs.patch b/tools/zlib/patches/006-fix-compressor-crash-on-certain-inputs.patch deleted file mode 100644 index 9f37ba5c58..0000000000 --- a/tools/zlib/patches/006-fix-compressor-crash-on-certain-inputs.patch +++ /dev/null @@ -1,343 +0,0 @@ -From 5c44459c3b28a9bd3283aaceab7c615f8020c531 Mon Sep 17 00:00:00 2001 -From: Mark Adler -Date: Tue, 17 Apr 2018 22:09:22 -0700 -Subject: [PATCH] Fix a bug that can crash deflate on some input when using - Z_FIXED. - -This bug was reported by Danilo Ramos of Eideticom, Inc. It has -lain in wait 13 years before being found! The bug was introduced -in zlib 1.2.2.2, with the addition of the Z_FIXED option. That -option forces the use of fixed Huffman codes. For rare inputs with -a large number of distant matches, the pending buffer into which -the compressed data is written can overwrite the distance symbol -table which it overlays. That results in corrupted output due to -invalid distances, and can result in out-of-bound accesses, -crashing the application. - -The fix here combines the distance buffer and literal/length -buffers into a single symbol buffer. Now three bytes of pending -buffer space are opened up for each literal or length/distance -pair consumed, instead of the previous two bytes. This assures -that the pending buffer cannot overwrite the symbol table, since -the maximum fixed code compressed length/distance is 31 bits, and -since there are four bytes of pending space for every three bytes -of symbol space. ---- - deflate.c | 74 ++++++++++++++++++++++++++++++++++++++++--------------- - deflate.h | 25 +++++++++---------- - trees.c | 50 +++++++++++-------------------------- - 3 files changed, 79 insertions(+), 70 deletions(-) - -diff --git a/deflate.c b/deflate.c -index 425babc00..19cba873a 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -255,11 +255,6 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - int wrap = 1; - static const char my_version[] = ZLIB_VERSION; - -- ushf *overlay; -- /* We overlay pending_buf and d_buf+l_buf. This works since the average -- * output size for (length,distance) codes is <= 24 bits. -- */ -- - if (version == Z_NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; -@@ -329,9 +324,47 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - - s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - -- overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); -- s->pending_buf = (uchf *) overlay; -- s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); -+ /* We overlay pending_buf and sym_buf. This works since the average size -+ * for length/distance pairs over any compressed block is assured to be 31 -+ * bits or less. -+ * -+ * Analysis: The longest fixed codes are a length code of 8 bits plus 5 -+ * extra bits, for lengths 131 to 257. The longest fixed distance codes are -+ * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest -+ * possible fixed-codes length/distance pair is then 31 bits total. -+ * -+ * sym_buf starts one-fourth of the way into pending_buf. So there are -+ * three bytes in sym_buf for every four bytes in pending_buf. Each symbol -+ * in sym_buf is three bytes -- two for the distance and one for the -+ * literal/length. As each symbol is consumed, the pointer to the next -+ * sym_buf value to read moves forward three bytes. From that symbol, up to -+ * 31 bits are written to pending_buf. The closest the written pending_buf -+ * bits gets to the next sym_buf symbol to read is just before the last -+ * code is written. At that time, 31*(n-2) bits have been written, just -+ * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at -+ * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 -+ * symbols are written.) The closest the writing gets to what is unread is -+ * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and -+ * can range from 128 to 32768. -+ * -+ * Therefore, at a minimum, there are 142 bits of space between what is -+ * written and what is read in the overlain buffers, so the symbols cannot -+ * be overwritten by the compressed data. That space is actually 139 bits, -+ * due to the three-bit fixed-code block header. -+ * -+ * That covers the case where either Z_FIXED is specified, forcing fixed -+ * codes, or when the use of fixed codes is chosen, because that choice -+ * results in a smaller compressed block than dynamic codes. That latter -+ * condition then assures that the above analysis also covers all dynamic -+ * blocks. A dynamic-code block will only be chosen to be emitted if it has -+ * fewer bits than a fixed-code block would for the same set of symbols. -+ * Therefore its average symbol length is assured to be less than 31. So -+ * the compressed data for a dynamic block also cannot overwrite the -+ * symbols from which it is being constructed. -+ */ -+ -+ s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); -+ s->pending_buf_size = (ulg)s->lit_bufsize * 4; - - if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || - s->pending_buf == Z_NULL) { -@@ -340,8 +373,12 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - deflateEnd (strm); - return Z_MEM_ERROR; - } -- s->d_buf = overlay + s->lit_bufsize/sizeof(ush); -- s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; -+ s->sym_buf = s->pending_buf + s->lit_bufsize; -+ s->sym_end = (s->lit_bufsize - 1) * 3; -+ /* We avoid equality with lit_bufsize*3 because of wraparound at 64K -+ * on 16 bit machines and because stored blocks are restricted to -+ * 64K-1 bytes. -+ */ - - s->level = level; - s->strategy = strategy; -@@ -552,7 +589,7 @@ int ZEXPORT deflatePrime (strm, bits, value) - - if (deflateStateCheck(strm)) return Z_STREAM_ERROR; - s = strm->state; -- if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) -+ if (s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) - return Z_BUF_ERROR; - do { - put = Buf_size - s->bi_valid; -@@ -1113,7 +1150,6 @@ int ZEXPORT deflateCopy (dest, source) - #else - deflate_state *ds; - deflate_state *ss; -- ushf *overlay; - - - if (deflateStateCheck(source) || dest == Z_NULL) { -@@ -1133,8 +1169,7 @@ int ZEXPORT deflateCopy (dest, source) - ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); -- overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); -- ds->pending_buf = (uchf *) overlay; -+ ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); - - if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || - ds->pending_buf == Z_NULL) { -@@ -1148,8 +1183,7 @@ int ZEXPORT deflateCopy (dest, source) - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); - - ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); -- ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); -- ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; -+ ds->sym_buf = ds->pending_buf + ds->lit_bufsize; - - ds->l_desc.dyn_tree = ds->dyn_ltree; - ds->d_desc.dyn_tree = ds->dyn_dtree; -@@ -1925,7 +1959,7 @@ local block_state deflate_fast(s, flush) - FLUSH_BLOCK(s, 1); - return finish_done; - } -- if (s->last_lit) -+ if (s->sym_next) - FLUSH_BLOCK(s, 0); - return block_done; - } -@@ -2056,7 +2090,7 @@ local block_state deflate_slow(s, flush) - FLUSH_BLOCK(s, 1); - return finish_done; - } -- if (s->last_lit) -+ if (s->sym_next) - FLUSH_BLOCK(s, 0); - return block_done; - } -@@ -2131,7 +2165,7 @@ local block_state deflate_rle(s, flush) - FLUSH_BLOCK(s, 1); - return finish_done; - } -- if (s->last_lit) -+ if (s->sym_next) - FLUSH_BLOCK(s, 0); - return block_done; - } -@@ -2170,7 +2204,7 @@ local block_state deflate_huff(s, flush) - FLUSH_BLOCK(s, 1); - return finish_done; - } -- if (s->last_lit) -+ if (s->sym_next) - FLUSH_BLOCK(s, 0); - return block_done; - } -diff --git a/deflate.h b/deflate.h -index 23ecdd312..d4cf1a98b 100644 ---- a/deflate.h -+++ b/deflate.h -@@ -217,7 +217,7 @@ typedef struct internal_state { - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - -- uchf *l_buf; /* buffer for literals or lengths */ -+ uchf *sym_buf; /* buffer for distances and literals/lengths */ - - uInt lit_bufsize; - /* Size of match buffer for literals/lengths. There are 4 reasons for -@@ -239,13 +239,8 @@ typedef struct internal_state { - * - I can't count above 4 - */ - -- uInt last_lit; /* running index in l_buf */ -- -- ushf *d_buf; -- /* Buffer for distances. To simplify the code, d_buf and l_buf have -- * the same number of elements. To use different lengths, an extra flag -- * array would be necessary. -- */ -+ uInt sym_next; /* running index in sym_buf */ -+ uInt sym_end; /* symbol table full when sym_next reaches this */ - - ulg opt_len; /* bit length of current block with optimal trees */ - ulg static_len; /* bit length of current block with static trees */ -@@ -325,20 +320,22 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - - # define _tr_tally_lit(s, c, flush) \ - { uch cc = (c); \ -- s->d_buf[s->last_lit] = 0; \ -- s->l_buf[s->last_lit++] = cc; \ -+ s->sym_buf[s->sym_next++] = 0; \ -+ s->sym_buf[s->sym_next++] = 0; \ -+ s->sym_buf[s->sym_next++] = cc; \ - s->dyn_ltree[cc].Freq++; \ -- flush = (s->last_lit == s->lit_bufsize-1); \ -+ flush = (s->sym_next == s->sym_end); \ - } - # define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (uch)(length); \ - ush dist = (ush)(distance); \ -- s->d_buf[s->last_lit] = dist; \ -- s->l_buf[s->last_lit++] = len; \ -+ s->sym_buf[s->sym_next++] = dist; \ -+ s->sym_buf[s->sym_next++] = dist >> 8; \ -+ s->sym_buf[s->sym_next++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ -- flush = (s->last_lit == s->lit_bufsize-1); \ -+ flush = (s->sym_next == s->sym_end); \ - } - #else - # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -diff --git a/trees.c b/trees.c -index 4f4a65011..decaeb7c3 100644 ---- a/trees.c -+++ b/trees.c -@@ -416,7 +416,7 @@ local void init_block(s) - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; -- s->last_lit = s->matches = 0; -+ s->sym_next = s->matches = 0; - } - - #define SMALLEST 1 -@@ -948,7 +948,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) - - Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, -- s->last_lit)); -+ s->sym_next / 3)); - - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; - -@@ -1017,8 +1017,9 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) - unsigned dist; /* distance of matched string */ - unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ - { -- s->d_buf[s->last_lit] = (ush)dist; -- s->l_buf[s->last_lit++] = (uch)lc; -+ s->sym_buf[s->sym_next++] = dist; -+ s->sym_buf[s->sym_next++] = dist >> 8; -+ s->sym_buf[s->sym_next++] = lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; -@@ -1033,30 +1034,7 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } -- --#ifdef TRUNCATE_BLOCK -- /* Try to guess if it is profitable to stop the current block here */ -- if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { -- /* Compute an upper bound for the compressed length */ -- ulg out_length = (ulg)s->last_lit*8L; -- ulg in_length = (ulg)((long)s->strstart - s->block_start); -- int dcode; -- for (dcode = 0; dcode < D_CODES; dcode++) { -- out_length += (ulg)s->dyn_dtree[dcode].Freq * -- (5L+extra_dbits[dcode]); -- } -- out_length >>= 3; -- Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", -- s->last_lit, in_length, out_length, -- 100L - out_length*100L/in_length)); -- if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; -- } --#endif -- return (s->last_lit == s->lit_bufsize-1); -- /* We avoid equality with lit_bufsize because of wraparound at 64K -- * on 16 bit machines and because stored blocks are restricted to -- * 64K-1 bytes. -- */ -+ return (s->sym_next == s->sym_end); - } - - /* =========================================================================== -@@ -1069,13 +1047,14 @@ local void compress_block(s, ltree, dtree) - { - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ -- unsigned lx = 0; /* running index in l_buf */ -+ unsigned sx = 0; /* running index in sym_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - -- if (s->last_lit != 0) do { -- dist = s->d_buf[lx]; -- lc = s->l_buf[lx++]; -+ if (s->sym_next != 0) do { -+ dist = s->sym_buf[sx++] & 0xff; -+ dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; -+ lc = s->sym_buf[sx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); -@@ -1100,11 +1079,10 @@ local void compress_block(s, ltree, dtree) - } - } /* literal or match pair ? */ - -- /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ -- Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, -- "pendingBuf overflow"); -+ /* Check that the overlay between pending_buf and sym_buf is ok: */ -+ Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - -- } while (lx < s->last_lit); -+ } while (sx < s->sym_next); - - send_code(s, END_BLOCK, ltree); - } diff --git a/tools/zstd/Makefile b/tools/zstd/Makefile index 02098f028f..895a347bcd 100644 --- a/tools/zstd/Makefile +++ b/tools/zstd/Makefile @@ -1,11 +1,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=zstd -PKG_VERSION:=1.5.2 +PKG_VERSION:=1.5.5 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/facebook/zstd/releases/download/v$(PKG_VERSION) -PKG_HASH:=7c42d56fac126929a6a85dbc73ff1db2411d04f104fae9bdea51305663a83fd0 +PKG_HASH:=9c4396cc829cfae319a6e2615202e82aad41372073482fce286fac78646d3ee4 PKG_LICENSE:=BSD-3-Clause PKG_LICENSE_FILES:=LICENSE @@ -17,12 +17,12 @@ include $(INCLUDE_DIR)/meson.mk MESON_HOST_BUILD_DIR:=$(HOST_BUILD_DIR)/build/meson/librecmc-build HOSTCC:= $(HOSTCC_NOCACHE) -HOST_LDFLAGS += -Wl,-rpath,$(STAGING_DIR_HOST)/lib MESON_HOST_ARGS += \ + -Ddefault_library=static \ -Dlegacy_level=7 \ -Ddebug_level=0 \ - -Dbacktrace=false \ + -Dbacktrace=disabled \ -Dstatic_runtime=false \ -Dbin_programs=true \ -Dbin_tests=false \ -- 2.25.1

    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%0D|E`o(bnx|F=`V1 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 literal 0 HcmV?d00001 diff --git a/docs/images/librecmc-port-forwards-after-save-apply.png b/docs/images/librecmc-port-forwards-after-save-apply.png new file mode 100644 index 0000000000000000000000000000000000000000..88a32b39fd893a0addf81f4ddc2a2557cc7f5dde GIT binary patch literal 44303 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 literal 0 HcmV?d00001 diff --git a/docs/images/librecmc-port-forwards-entering-parameters.png b/docs/images/librecmc-port-forwards-entering-parameters.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a2ef5ff28c64b1173487570b12d84f5ec94294 GIT binary patch literal 39110 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⁡^GJ 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 literal 0 HcmV?d00001 diff --git a/docs/images/librecmc-selecting-firewall-menu.png b/docs/images/librecmc-selecting-firewall-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..b4001c42f1567804e5e5db7058d7711fb7ca36f8 GIT binary patch literal 51259 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 z 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